ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9mYi9tZHNzLWVkcC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZmIvbWRzcy1lZHAudHh0CmluZGV4IDNkN2U1YTIuLmU1NjRjZDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9mYi9tZHNzLWVkcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ZiL21kc3MtZWRwLnR4dApAQCAtMyw2ICszLDkgQEAKIE1EU1MgRURQIGlzIGEgZWRwIGRyaXZlciB3aGljaCBzdXBwb3J0cyBwYW5lbHMgdGhhdCBhcmUgY29tcGF0YWJsZSB3aXRoCiBWRVNBIEVEUCBkaXNwbGF5IGludGVyZmFjZSBzcGVjaWZpY2F0aW9uLgogCitXaGVuIGNvbmZpZ3VyaW5nIHRoZSBvcHRpb25hbCBwcm9wZXJ0aWVzIGZvciBleHRlcm5hbCBiYWNrbGlnaHQsIG9uZSBzaG91bGQgYWxzbworY29uZmlndXJlIHRoZSBncGlvIHRoYXQgZHJpdmVzIHRoZSBwd20gdG8gaXQuCisKIFJlcXVpcmVkIHByb3BlcnRpZXMKIC0gY29tcGF0aWJsZSA6CQkJCU11c3QgYmUgInFjb20sbWRzcy1lZHAiLgogLSByZWcgOgkJCQkJCU9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZQpAQCAtMTIsOCArMTUsNiBAQAogLSB2ZGRhLXN1cHBseSA6CQkJCVBoYW5kbGUgZm9yIHZkZCByZWd1bGF0b3IgZGV2aWNlIG5vZGUuCiAtIGdwaW8tcGFuZWwtZW4JOgkJCUdQSU8gZm9yIHN1cHBseWluZyBwb3dlciB0byBwYW5lbCBhbmQgYmFja2xpZ2h0CiAJCQkJCQkJZHJpdmVyLgotLSBxY29tLHBhbmVsLWxwZy1jaGFubmVsIDoJCUxQRyBjaGFubmVsIGZvciBiYWNrbGlnaHQuCi0tIHFjb20scGFuZWwtcHdtLXBlcmlvZCA6CQlQV00gcGVyaW9kIGluIG1pY3Jvc2Vjb25kcy4KIC0gc3RhdHVzIDoJCQkJQSBzdHJpbmcgdGhhdCBoYXMgdG8gYmUgc2V0IHRvICJva2F5L29rIiB0byBlbmFibGUKIAkJCQkJCXRoZSBkcml2ZXIuIEJ5IGRlZmF1bHQgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIHNldCB0bwogCQkJCQkJImRpc2FibGUiLiBXaWxsIGJlIHNldCB0byAib2svb2theSIgc3RhdHVzIGZvcgpAQCAtMzcsNCArMzgsOCBAQAogCQlncGlvLXBhbmVsLWhwZCA9IDwmbXNtZ3BpbyAxMDIgMD47CiAJfTsKIAorT3B0aW9uYWwgcHJvcGVydGllcworLSBxY29tLHBhbmVsLWxwZy1jaGFubmVsIDoJCUxQRyBjaGFubmVsIGZvciBiYWNrbGlnaHQuCistIHFjb20scGFuZWwtcHdtLXBlcmlvZCA6CQlQV00gcGVyaW9kIGluIG1pY3Jvc2Vjb25kcy4KKwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZmIvbWRzcy1tZHAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ZiL21kc3MtbWRwLnR4dAppbmRleCA4ZjE3YTkwLi5hNGU2MWU4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZmIvbWRzcy1tZHAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9mYi9tZHNzLW1kcC50eHQKQEAgLTE0MSw2ICsxNDEsMTEgQEAKIAkJCQlyZXN0cmljdGVkIGZvciBhIHNvdXJjZSBzdXJmYWNlIHBpcGUuIElmIHRoaXMKIAkJCQlwcm9wZXJ0eSBpcyBub3Qgc3BlY2lmaWVkLCBubyBzdWNoIHJlc3RyaWN0aW9uCiAJCQkJd291bGQgYmUgYXBwbGllZC4KKy0gcWNvbSxtZHNzLXBpcGUtcmdiLWZpeGVkLW1tYjogQXJyYXkgb2YgaW5kZXhlcyBkZXNjcmliaW5nIGZpeGVkIE1lbW9yeSBNYWNybworCQkJCUJsb2NrcyAoTU1CcykgZm9yIHJnYiBwaXBlcy4gRmlyc3QgdmFsdWUgZGVub3RlcworCQkJCXRvdGFsIG51bWJlcnMgb2YgTU1CcyBwZXIgcGlwZSB3aGlsZSB2YWx1ZXMsIGlmCisJCQkJYW55LCBmb2xsb3dpbmcgZmlyc3Qgb25lIGRlbm90ZXMgaW5kZXhlcyBvZiBNTUJzCisJCQkJdG8gdGhhdCBSR0IgcGlwZS4KIAogT3B0aW9uYWwgc3Vibm9kZXM6CiBDaGlsZCBub2RlcyByZXByZXNlbnRpbmcgdGhlIGZyYW1lIGJ1ZmZlciB2aXJ0dWFsIGRldmljZXMuCkBAIC0xOTQsNiArMTk5LDEwIEBACiAJCXFjb20sbWRzcy1waXBlLXZpZy1mZXRjaC1pZCA9IDwxIDQgNz47CiAJCXFjb20sbWRzcy1waXBlLXJnYi1mZXRjaC1pZCA9IDwxNiAxNyAxOD47CiAJCXFjb20sbWRzcy1waXBlLWRtYS1mZXRjaC1pZCA9IDwxMCAxMz47CisJCXFjb20sbWRzcy1waXBlLXJnYi1maXhlZC1tbWIgPQk8MiAwIDE+LAorCQkJCQkJPDIgMiAzPiwKKwkJCQkJCTwyIDQgNT4sCisJCQkJCQk8MiA2IDc+OwogCQlxY29tLG1kc3Mtc21wLWRhdGEgPSA8MjIgNDA5Nj47CiAJCXFjb20sbWRzcy1yb3QtYmxvY2stc2l6ZSA9IDw2ND47CiAJCXFjb20sbWRzcy1zbXAtbWItcGVyLXBpcGUgPSA8Mj47CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8vbXNtLWNhbWVyYS1mbGFzaC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8vbXNtLWNhbWVyYS1mbGFzaC50eHQKaW5kZXggZDg0OGJhZi4uM2IyYzQ0YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lZGlhL3ZpZGVvL21zbS1jYW1lcmEtZmxhc2gudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby9tc20tY2FtZXJhLWZsYXNoLnR4dApAQCAtMTAsNiArMTAsMTAgQEAKIC0gcWNvbSxmbGFzaC10eXBlIDogU2hvdWxkIGNvbnRhaW4gdHlwZSBmbGFzaCBkZXZpY2UKICAgICAtIDEgZm9yIExFRCBmbGFzaAogICAgIC0gMiBmb3Igc3Ryb2JlIGZsYXNoCisgICAgLSAzIGZvciBzaW1wbGUgbGVkIGZsYXNoIGNvbnRyb2xsZWQgYnkgb25lIGdwaW8KKyAgICAgIFRoaXMgaXMgYSBsb3cgY29zdCBsZWQgdXNlZCBmb3IgY2FtZXJhIGZsYXNoLCB0aGUgbGVkIGlzIGRyaXZlbiBieQorICAgICAgc3lzdGVtIHBvd2VyLCBhbmQgdXNlIGEgdHJhbnNpc3RvciBjb250cm9sbGVkIGJ5IGV4dGVybmFsIHBpbiB0bworICAgICAgZ2F0ZSBpdHMgb24vb2ZmIHN0YXRlLgogLSBxY29tLGZsYXNoLXNvdXJjZSA6IFNob3VsZCBjb250YWluIGFycmF5IG9mIHBoYW5kbGVzIHRvIGZsYXNoIHNvdXJjZSBub2Rlcy4KICAgICAtIHBtODk0MV9mbGFzaDAgcG04OTQxX2ZsYXNoMQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8vbXNtLWVlcHJvbS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8vbXNtLWVlcHJvbS50eHQKaW5kZXggODkzYzAzMy4uYzc4MjFmNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lZGlhL3ZpZGVvL21zbS1lZXByb20udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby9tc20tZWVwcm9tLnR4dApAQCAtMTAsNyArMTAsNyBAQAogLSBjZWxsLWluZGV4OiBlZXByb20gaGFyZHdhcmUgY29yZSBpbmRleAogLSBjb21wYXRpYmxlIDoKICAgICAtICJxY29tLGVlcHJvbSIKLS0gcmVnIDogb2Zmc2V0IGFuZCBsZW5ndGggb2YgZWVwcm9tIGRldmljZSByZWdpc3RlcnMuCistIHJlZyA6IG9mZnNldCBvZiBlZXByb20gZGV2aWNlIHJlZ2lzdGVycy4KIC0gcWNvbSxlZXByb20tbmFtZSA6IHNob3VsZCBzcGVjaWZ5IHJlbGV2YW50IG5hbWVzIG9mIHRoZSBlZXByb20gbW9kdWxlCiAgICAgbGlicmFyeS4KIC0gcWNvbSxzbGF2ZS1hZGRyIDogc2hvdWxkIHNwZWNpZnkgdGhlIHNsYXZlIGFkZHJlc3Mgb2YgdGhlIGVlcHJvbS4KQEAgLTI5LDcgKzI5LDYgQEAKICAgICBkYXRhIHR5cGUsIGRlbGF5IGluIG1zLiBzaXplIDAgc3RhbmQgZm9yIG5vdCB1c2VkLgogICAgIC0gYWRkcmVzcyB0eXBlIDogMSBieXRlLCAyIHdvcmQuCiAgICAgLSBkYXRhIHR5cGUgOiAxIGJ5dGUsIDIgd29yZC4KLS0gY2FtX3ZkaWctc3VwcGx5IDogc2hvdWxkIGNvbnRhaW4gcmVndWxhdG9yIHRvIGJlIHVzZWQgZm9yIHRoZSBkaWdpdGFsIHZkZC4KIC0gY2FtX3Zpby1zdXBwbHkgOiBzaG91bGQgY29udGFpbiByZWd1bGF0b3IgdG8gYmUgdXNlZCBmb3IgdGhlIElPIHZkZC4KIC0gcWNvbSxjYW0tdnJlZy1uYW1lIDogc2hvdWxkIHNwZWNpZnkgdGhlIHJlZ3VsYXRvciBuYW1lIHRvIGJlIHVzZWQgZm9yCiAgICAgdGhpcyBlZXByb20uCkBAIC01Nyw2ICs1Niw3IEBACiBPcHRpb25hbCBwcm9wZXJ0aWVzOgogLSBxY29tLHBhZ2VlbiVkIDogbnVtYmVyICVkIHBhZ2UgZW5hYmxlIHJlZyBzaXplLCBzdGFydCBhZGRyZXNzLCBhZGRyZXNzIHR5cGUsCiAgICAgZGF0YSwgZGF0YSB0eXBlLCBkZWxheSBpbiBtcy4gc2l6ZSAwIHN0YW5kIGZvciBub3QgdXNlZC4KKy0gY2FtX3ZkaWctc3VwcGx5IDogc2hvdWxkIGNvbnRhaW4gcmVndWxhdG9yIHRvIGJlIHVzZWQgZm9yIHRoZSBkaWdpdGFsIHZkZC4KIAogRXhhbXBsZToKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25mYy9uZmMtbmNpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZmMvbmZjLW5jaS50eHQKaW5kZXggY2RkMWU2OC4uNWM1MzQ3MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25mYy9uZmMtbmNpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmZjL25mYy1uY2kudHh0CkBAIC0xMCwyMyArMTAsMjYgQEAKIC0gcWNvbSxpcnEtZ3Bpbzogc3BlY2lmaWMgZ3BpbyBmb3IgcmVhZCBpbnRlcnJ1cHQuCiAtIHFjb20sY2xrLXNyYzogbmZjIGNsb2NrIHNvdXJjZSAoIkJCQ0xLMiIsICJSRkNMSzMiLCAiR1BDTEsiLCAuLi4pCiAtIHFjb20sY2xrLWVuLWdwaW86IG1zbSBncGlvIGNsb2NrLHVzZWQgb255IGlmIGNsb2NrIHNvdXJjZSBpcyBtc20gZ3BpbworLSB2bG9naWMtc3VwcGx5OiBMRE8gZm9yIHBvd2VyIHN1cHBseQogLSBpbnRlcnJ1cHQtcGFyZW50OiBTaG91bGQgYmUgcGhhbmRsZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyCiAgICAgICAgICAgICAgICAgICAgIHRoYXQgc2VydmljZXMgaW50ZXJydXB0cyBmb3IgdGhpcyBkZXZpY2UuCiAtIGludGVycnVwdHM6IHNob3VsZCBjb250YWluIHRoZSBORkMgaW50ZXJydXB0LiBORkMgaGFzIG9uZSByZWFkIGludGVycnVwdC4KIC0gcWNvbSxjbGstZ3BpbzogcG1pYyBncGlvIG9uIHdoaWNoIGJiY2xrMiBzaWduYWwgaXMgY29taW5nLgogCi1FeGFtcGxlOgorTERPIGV4YW1wbGU6CiAKLQlpMmNAZjk5MjUwMDAgeyAvKiBCTFNQMSBRVVAzICovCi0JICAgIG5mYy1uY2lAMGUgewotCSAgICAgICAgY29tcGF0aWJsZSA9ICJxY29tLG5mYy1uY2kiOwotCQlyZWcgPSA8MHgwZT47Ci0JCXFjb20saXJxLWdwaW8gPSA8Jm1zbWdwaW8gMjEgMHgwMD47Ci0JCXFjb20sZGlzLWdwaW8gPSA8Jm1zbWdwaW8gMjAgMHgwMD47Ci0JCXFjb20sY2xrLXNyYyA9ICJCQkNMSzIiOwotCQlxY29tLGNsay1lbi1ncGlvID0gPCZtc21ncGlvIDAgMHgwMD47Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jm1zbWdwaW8+OwotCQlpbnRlcnJ1cHRzID0gPDIxIDA+OwotCQlxY29tLGNsay1ncGlvID0gPCZwbTgyMjZfZ3Bpb3MgMyAwPjsKLQkgICAgfTsKKwlpMmNAZjk5MjUwMDAgeyAvKiBCTFNQLTEgUVVQLTMgKi8KKwkJbmZjLW5jaUBlIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxuZmMtbmNpIjsKKwkJCXJlZyA9IDwweDBlPjsKKwkJCXFjb20saXJxLWdwaW8gPSA8Jm1zbWdwaW8gNzcgMHgwMD47CisJCQlxY29tLGRpcy1ncGlvID0gPCZtc21ncGlvIDkzIDB4MDA+OworCQkJcWNvbSxjbGstZW4tZ3BpbyA9IDwmbXNtZ3BpbyA3OCAweDAwPjsKKwkJCXFjb20sY2xrLXNyYyA9ICJHUENMSyI7CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtc21ncGlvPjsKKwkJCWludGVycnVwdHMgPSA8NzcgMD47CisJCQlxY29tLGNsay1ncGlvID0gPCZtc21ncGlvIDc1IDB4MDA+OworCQkJdmxvZ2ljLXN1cHBseSA9IDwmcG04MTEwX2wxND47CisJCX07CiAJfTsKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3FwbnAtYm1zLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9xcG5wLWJtcy50eHQKaW5kZXggYjA3NjQ3NS4uZGMwN2Q3MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3FwbnAtYm1zLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvcXBucC1ibXMudHh0CkBAIC01NiwxMCArNTYsMTQgQEAKIC0gcWNvbSxsb3ctdm9sdGFnZS10aHJlc2hvbGQgOiBUaGUgYmF0dGVyeSB2b2x0YWdlIHRocmVzaG9sZCBpbiBtaWNyby12b2x0cyBmb3IKIAkJCXdoZW4gdGhlIEJNUyB0cmllcyB0byB3YWtlIHVwIGFuZCBob2xkIGEgd2FrZWxvY2sgdG8KIAkJCWVuc3VyZSBhIGNsZWFuIHNodXRkb3duLgorLSBxY29tLGxvdy12b2x0YWdlLWNhbGN1bGF0ZS1zb2MtbXMgOiBUaGUgdGltZSBwZXJpb2QgYmV0d2VlbiBzdWJzZXF1ZW50CisJCQlTb0MgcmVjYWxjdWxhdGlvbnMgd2hlbiB0aGUgY3VycmVudCB2b2x0YWdlIGlzIGJlbG93CisJCQlxY29tLGxvdy12b2x0YWdlIHRocmVzaG9sZC4gVGhpcyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIKKwkJCXFjb20sbG93LXNvYy1jYWxjdWxhdGUtc29jLW1zLgogLSBxY29tLGxvdy1zb2MtY2FsY3VsYXRlLXNvYy1tcyA6IFRoZSB0aW1lIHBlcmlvZCBiZXR3ZWVuIHN1YnNlcXVlbnQKIAkJCVNvQyByZWNhbGN1bGF0aW9ucyB3aGVuIHRoZSBjdXJyZW50IFNvQyBpcyBiZWxvdwotCQkJcWNvbSxsb3ctc29jLWNhbGN1bGF0ZS1zb2MtdGhyZXNob2xkIG9yIHdoZW4gYmF0dGVyeQotCQkJdm9sdGFnZSBpcyBiZWxvdyBxY29tLGxvdy12b2x0YWdlLXRocmVzaG9sZC4KKwkJCXFjb20sbG93LXNvYy1jYWxjdWxhdGUtc29jLXRocmVzaG9sZC4gVGhpcyB0YWtlcworCQkJcHJlY2VkZW5jZSBvdmVyIHFjb20sY2FsY3VsYXRlLXNvYy1tcy4KIC0gcWNvbSxjYWxjdWxhdGUtc29jLW1zIDogVGhlIHRpbWUgcGVyaW9kIGJldHdlZW4gc3Vic2VxdWVudCBTb0MKIAkJCXJlY2FsY3VsYXRpb25zIHdoZW4gdGhlIGN1cnJlbnQgU29DIGlzIGFib3ZlIG9yIGVxdWFsCiAJCQlxY29tLGxvdy1zb2MtY2FsY3VsYXRlLXNvYy10aHJlc2hvbGQuCkBAIC0xNjAsNiArMTY0LDcgQEAKIAlxY29tLGFkanVzdC1zb2MtbG93LXRocmVzaG9sZCA9IDwxNT47CiAJcWNvbSxsb3ctc29jLWNhbGN1bGF0ZS1zb2MtdGhyZXNob2xkID0gPDE1PjsKIAlxY29tLGxvdy12b2x0YWdlLXRocmVzaG9sZCA9IDwzNDIwMDAwPjsKKwlxY29tLGxvdy12b2x0YWdlLWNhbGN1bGF0ZS1zb2MtbXMgPSA8MTAwMD47CiAJcWNvbSxsb3ctc29jLWNhbGN1bGF0ZS1zb2MtbXMgPSA8NTAwMD47CiAJcWNvbSxjYWxjdWxhdGUtc29jLW1zID0gPDIwMDAwPjsKIAlxY29tLGNoZy10ZXJtLXVhID0gPDEwMDAwMD47CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3Bvd2VyX3N1cHBseV9jbGFzcy50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3Bvd2VyX3N1cHBseV9jbGFzcy50eHQKaW5kZXggOWYxNmM1MS4uMjExODMxZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci9wb3dlcl9zdXBwbHlfY2xhc3MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvcG93ZXJfc3VwcGx5X2NsYXNzLnR4dApAQCAtODQsNiArODQsOCBAQAogSEVBTFRIIC0gcmVwcmVzZW50cyBoZWFsdGggb2YgdGhlIGJhdHRlcnksIHZhbHVlcyBjb3JyZXNwb25kcyB0bwogUE9XRVJfU1VQUExZX0hFQUxUSF8qLCBkZWZpbmVkIGluIGJhdHRlcnkuaC4KIAorVk9MVEFHRV9PQ1YgLSBvcGVuIGNpcmN1aXQgdm9sdGFnZSBvZiB0aGUgYmF0dGVyeS4KKwogVk9MVEFHRV9NQVhfREVTSUdOLCBWT0xUQUdFX01JTl9ERVNJR04gLSBkZXNpZ24gdmFsdWVzIGZvciBtYXhpbWFsIGFuZAogbWluaW1hbCBwb3dlciBzdXBwbHkgdm9sdGFnZXMuIE1heGltYWwvbWluaW1hbCBtZWFucyB2YWx1ZXMgb2Ygdm9sdGFnZXMKIHdoZW4gYmF0dGVyeSBjb25zaWRlcmVkICJmdWxsIi8iZW1wdHkiIGF0IG5vcm1hbCBjb25kaXRpb25zLiBZZXMsIHRoZXJlIGlzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9LY29uZmlnIGIvYXJjaC9hcm0vS2NvbmZpZwppbmRleCBhZGNmMTY4Li45NDY4ZGY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL0tjb25maWcKQEAgLTE4NTMsMTMgKzE4NTMsMzYgQEAKIGNvbmZpZyBFTkFCTEVfRE1NCiAJZGVmX2Jvb2wgbgogCitjaG9pY2UKKwlwcm9tcHQgIlZpcnR1YWwgTWVtb3J5IFJlY2xhaW0iCisJZGVmYXVsdCBOT19WTV9SRUNMQUlNCisJaGVscAorCSAgU2VsZWN0IHRoZSBtZXRob2Qgb2YgcmVjbGFpbWluZyB2aXJ0dWFsIG1lbW9yeQorCiBjb25maWcgRE9OVF9NQVBfSE9MRV9BRlRFUl9NRU1CQU5LMAotCWRlZl9ib29sIG4KLQlkZXBlbmRzIG9uIEVOQUJMRV9WTUFMTE9DX1NBVklORz1uCisJYm9vbCAiTWFwIGFyb3VuZCB0aGUgbGFyZ2VzdCBob2xlIgorCWhlbHAKKwkgIERvIG5vdCBtYXAgdGhlIG1lbW9yeSBiZWxvbmdpbmcgdG8gdGhlIGxhcmdlc3QgaG9sZQorCSAgaW50byB0aGUgdmlydHVhbCBzcGFjZS4gVGhpcyByZXN1bHRzIGluIG1vcmUgbG93bWVtLgorCSAgSWYgbXVsdGlwbGUgaG9sZXMgYXJlIHByZXNlbnQsIG9ubHkgdGhlIGxhcmdlc3QgaG9sZQorCSAgaW4gdGhlIGZpcnN0IDI1Nk1CIG9mIG1lbW9yeSBpcyBub3QgbWFwcGVkLgogCiBjb25maWcgRU5BQkxFX1ZNQUxMT0NfU0FWSU5HCi0JZGVmX2Jvb2wgbgotCWRlcGVuZHMgb24gRE9OVF9NQVBfSE9MRV9BRlRFUl9NRU1CQU5LMD1uCisJYm9vbCAiUmVjbGFpbSBtZW1vcnkgZm9yIGVhY2ggc3Vic3lzdGVtIgorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIGNvbmZpZyB0byByZWNsYWltIHRoZSB2aXJ0dWFsIHNwYWNlIGJlbG9uZ2luZworCSAgdG8gYW55IHN1YnN5c3RlbSB3aGljaCBpcyBleHBlY3RlZCB0byBoYXZlIGEgbGlmZXRpbWUgb2YKKwkgIHRoZSBlbnRpcmUgc3lzdGVtLiBUaGlzIGZlYXR1cmUgYWxsb3dzIGxvd21lbSB0byBiZSBub24tCisJICBjb250aWd1b3VzLgorCitjb25maWcgTk9fVk1fUkVDTEFJTQorCWJvb2wgIkRvIG5vdCByZWNsYWltIG1lbW9yeSIKKwloZWxwCisJICBEbyBub3QgcmVjbGFpbSBhbnkgbWVtb3J5LiBUaGlzIG1pZ2h0IHJlc3VsdCBpbiBsZXNzIGxvd21lbQorCSAgYW5kIHdhc3RpbmcgdmlydHVhbCBtZW1vcnkgc3BhY2Ugd2hpY2ggY291bGQgb3RoZXJ3aXNlIGJlCisJICByZWNsYWltZWQgYnkgdXNpbmcgYW55IG9mIHRoZSBvdGhlciB0d28gY29uZmlnIG9wdGlvbnMuCisKK2VuZGNob2ljZQogCiBjb25maWcgSE9MRVNfSU5fWk9ORQogCWRlZl9ib29sIG4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL01ha2VmaWxlIGIvYXJjaC9hcm0vTWFrZWZpbGUKaW5kZXggZDQzZTY5YmYuLjRiNTQ0YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL01ha2VmaWxlCkBAIC02OSw2ICs2OSwxOCBAQAogYXJjaC0kKENPTkZJR19DUFVfMzJ2NCkJCTo9LURfX0xJTlVYX0FSTV9BUkNIX189NCAtbWFyY2g9YXJtdjQKIGFyY2gtJChDT05GSUdfQ1BVXzMydjMpCQk6PS1EX19MSU5VWF9BUk1fQVJDSF9fPTMgLW1hcmNoPWFybXYzCiAKKyMgU2luY2UgJ2NvcnRleC1hMTUnIGlzIGEgc3VwZXJzZXQgb2YgdGhlICdhcm12Ny1hJyBhcmNoIHNwZWMsIHdlIG5lZWQgdG8KKyMgZXhwbGljaXRseSByZWRlZmluZSB0aGUgYXJjaCBvcHRpb25zIHRvIG5vdCBpbmNsdWRlICctbWFyY2g9YXJtdjctYScgd2hlbgorIyBnZW5lcmF0aW5nIGNvZGUgZm9yIEtyYWl0LCB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGluc3RydWN0aW9uIHNldCBvZiB0aGUKKyMgQ29ydGV4LUExNSwgYmVjYXVzZSBHQ0Mgd2lsbCB3YXJuIHVzIGFib3V0IGFtYmlndW91cyBJU0EgcmVzdHJpY3Rpb25zIGNhdXNlZAorIyBieSBzZWVtaW5nbHkgY29uZmxpY3RpbmcgLW1hcmNoIGFuZCAtbWNwdSBvcHRpb25zLgorIyBJZiAkKENDKSBkb2VzIG5vdCBzdXBwb3J0IHRoZSAtbWNwdT1jb3J0ZXgtYTE1IG9wdGlvbiwgZmFsbCBiYWNrIG9uIHBhc3NpbmcKKyMgLW1hcmNoPWFybXY3LWEgdG8gc3BlY2lmeSB0aGUgSVNBIHJlc3RyaWN0aW9uLCB0aG91Z2ggdGhpcyBpcyBzdWJvcHRpbWFsLiBUbworIyBrZWVwIHRoaW5ncyBzaW1wbGVyLCB3ZSBkb24ndCBib3RoZXIgd2l0aCBhIGZhbGxiYWNrIG9wdGlvbiBpZiB0aGUgY29tcGlsZXIKKyMgZG9lc24ndCBldmVuIHN1cHBvcnQgLW1hcmNoPWFybXY3LWEsIHNpbmNlIGluIHRoYXQgc2l0dWF0aW9uIHdlIHdvdWxkIGhhdmUKKyMgYmlnZ2VyIHByb2JsZW1zLgorYXJjaC0kKENPTkZJR19BUkNIX01TTV9LUkFJVCkJOj0tRF9fTElOVVhfQVJNX0FSQ0hfXz03ICQoY2FsbCBjYy1vcHRpb24sLW1jcHU9Y29ydGV4LWExNSwtbWFyY2g9YXJtdjctYSkKKwogIyBUaGlzIHNlbGVjdHMgaG93IHdlIG9wdGltaXNlIGZvciB0aGUgcHJvY2Vzc29yLgogdHVuZS0kKENPTkZJR19DUFVfQVJNNjEwKQk6PS1tdHVuZT1hcm02MTAKIHR1bmUtJChDT05GSUdfQ1BVX0FSTTcxMCkJOj0tbXR1bmU9YXJtNzEwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9hcHE4MDc0LWRyYWdvbmJvYXJkLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9hcHE4MDc0LWRyYWdvbmJvYXJkLmR0c2kKaW5kZXggOGFmZDk4Ni4uODI0YjBhYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvYXBxODA3NC1kcmFnb25ib2FyZC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2FwcTgwNzQtZHJhZ29uYm9hcmQuZHRzaQpAQCAtNTA0LDEzICs1MDQsNiBAQAogCX07CiAKIAlncGlvQGUzMDAgeyAvKiBHUElPIDM2ICovCi0JCXFjb20sbW9kZSA9IDwxPjsgIC8qIFFQTlBfUElOX01PREVfRElHX09VVCAqLwotCQlxY29tLG91dHB1dC10eXBlID0gPDA+OyAvKiBRUE5QX1BJTl9PVVRfQlVGX0NNT1MgKi8KLQkJcWNvbSxwdWxsID0gPDU+OyAvKiBRUE5QX1BJTl9QVUxMX05PICovCi0JCXFjb20sdmluLXNlbCA9IDwyPjsgLyogUVBOUF9QSU5fVklOMiAqLwotCQlxY29tLG91dC1zdHJlbmd0aCA9IDwzPjsgLyogUVBOUF9QSU5fT1VUX1NUUkVOR1RIX0hJR0ggKi8KLQkJcWNvbSxzcmMtc2VsID0gPDM+OyAvKiBRUE5QX1BJTl9TRUxfRlVOQ18yICovCi0JCXFjb20sbWFzdGVyLWVuID0gPDE+OwogCX07CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9kc2ktcGFuZWwtaHg4Mzg5Yi1xaGQtdmlkZW8uZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2RzaS1wYW5lbC1oeDgzODliLXFoZC12aWRlby5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdlNjMwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy9kc2ktcGFuZWwtaHg4Mzg5Yi1xaGQtdmlkZW8uZHRzaQpAQCAtMCwwICsxLDEzNSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmaWxlIHVzaW5nIGdjZGIgcGFyc2VyLiBQbGVhc2UgZG8gbm90IGVkaXQgaXQuCisgKiBVcGRhdGUgaW5wdXQgWE1MIGZpbGUgdG8gYWRkIGEgbmV3IGVudHJ5IG9yIHVwZGF0ZSB2YXJpYWJsZSBpbiB0aGlzIGZpbGUKKyAqIFZFUlNJT04gPSAiMS4wIgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworJm1kc3NfbWRwIHsKKwlkc2lfaHg4Mzg5Yl9xaGRfdmlkOiBxY29tLG1kc3NfZHNpX2h4ODM4OWJfcWhkX3ZpZGVvIHsKKwkJcWNvbSxtZHNzLWRzaS1wYW5lbC1uYW1lID0gIkhYODM4OWIgcWhkIHZpZGVvIG1vZGUgZHNpIHBhbmVsIjsKKwkJcWNvbSxtZHNzLWRzaS1wYW5lbC1jb250cm9sbGVyID0gPCZtZHNzX2RzaTA+OworCQlxY29tLG1kc3MtZHNpLXBhbmVsLXR5cGUgPSAiZHNpX3ZpZGVvX21vZGUiOworCQlxY29tLG1kc3MtZHNpLXBhbmVsLWRlc3RpbmF0aW9uID0gImRpc3BsYXlfMSI7CisJCXFjb20sbWRzcy1kc2ktcGFuZWwtZnJhbWVyYXRlID0gPDYwPjsKKwkJcWNvbSxtZHNzLWRzaS12aXJ0dWFsLWNoYW5uZWwtaWQgPSA8MD47CisJCXFjb20sbWRzcy1kc2ktc3RyZWFtID0gPDA+OworCQlxY29tLG1kc3MtZHNpLXBhbmVsLXdpZHRoID0gPDU0MD47CisJCXFjb20sbWRzcy1kc2ktcGFuZWwtaGVpZ2h0ID0gPDk2MD47CisJCXFjb20sbWRzcy1kc2ktaC1mcm9udC1wb3JjaCA9IDw0OD47CisJCXFjb20sbWRzcy1kc2ktaC1iYWNrLXBvcmNoID0gPDk2PjsKKwkJcWNvbSxtZHNzLWRzaS1oLXB1bHNlLXdpZHRoID0gPDk2PjsKKwkJcWNvbSxtZHNzLWRzaS1oLXN5bmMtc2tldyA9IDwwPjsKKwkJcWNvbSxtZHNzLWRzaS12LWZyb250LXBvcmNoID0gPDk+OworCQlxY29tLG1kc3MtZHNpLXYtcHVsc2Utd2lkdGggPSA8Mz47CisJCXFjb20sbWRzcy1kc2ktdi1iYWNrLXBvcmNoID0gPDEzPjsKKwkJcWNvbSxtZHNzLWRzaS1oLWxlZnQtYm9yZGVyID0gPDA+OworCQlxY29tLG1kc3MtZHNpLWgtcmlnaHQtYm9yZGVyID0gPDA+OworCQlxY29tLG1kc3MtZHNpLXYtdG9wLWJvcmRlciA9IDwwPjsKKwkJcWNvbSxtZHNzLWRzaS12LWJvdHRvbS1ib3JkZXIgPSA8MD47CisJCXFjb20sbWRzcy1kc2ktYnBwID0gPDI0PjsKKwkJcWNvbSxtZHNzLWRzaS1jb2xvci1vcmRlciA9IDwwPjsKKwkJcWNvbSxtZHNzLWRzaS11bmRlcmZsb3ctY29sb3IgPSA8MHhmZj47CisJCXFjb20sbWRzcy1kc2ktYm9yZGVyLWNvbG9yID0gPDA+OworCQlxY29tLG1kc3MtZHNpLW9uLWNvbW1hbmQgPSBbCisJCQkJMzkgMDEgMDAgMDAgMDAgMDAgMDQKKwkJCQkJQjkgRkYgODMgODkKKwkJCQkzOSAwMSAwMCAwMCAwMCAwMCAwOAorCQkJCQlCQSA0MSA5MyAwMAorCQkJCQkxNiBBNCAxMCAxOAorCQkJCTIzIDAxIDAwIDAwIDAwIDAwIDAyCisJCQkJCUM2IDA4CisJCQkJMzkgMDEgMDAgMDAgMDAgMDAgMDMKKwkJCQkJQkMgMDIgMDAKKwkJCQkyMyAwMSAwMCAwMCAwMCAwMCAwMgorCQkJCQlDQyAwMgorCQkJCTM5IDAxIDAwIDAwIDAwIDAwIDE0CisJCQkJCUIxIDAwIDAwIDA3CisJCQkJCUU4IDUwIDEwIDExCisJCQkJCTk4IGY4IDIxIDI5CisJCQkJCTI3IDI3IDQzIDAxCisJCQkJCTU4IEYwIDAwIEU2CisJCQkJMzkgMDEgMDAgMDAgMDAgMDAgMDgKKwkJCQkJQjIgMDAgMDAgNzgKKwkJCQkJMEMgMDcgM0YgODAKKwkJCQkzOSAwMSAwMCAwMCAwMCAwMCAxOAorCQkJCQliNCA4MiAwOCAwMAorCQkJCQkzMiAxMCAwNCAzMgorCQkJCQkxMCAwMCAzMiAxMAorCQkJCQkwMCAzNyAwYSA0MAorCQkJCQkwOCAzNyAwYSA0MAorCQkJCQkxNCA0NiA1MCAwYQorCQkJCTM5IDAxIDAwIDAwIDAwIDAwIDM5CisJCQkJCWQ1IDAwIDAwIDAwCisJCQkJCTAwIDAxIDAwIDAwCisJCQkJCTAwIDYwIDAwIDk5CisJCQkJCTg4IEFBIEJCIDg4CisJCQkJCTIzIDg4IDAxIDg4CisJCQkJCTY3IDg4IDQ1IDAxCisJCQkJCTIzIDg4IDg4IDg4CisJCQkJCTg4IDg4IDg4IDk5CisJCQkJCUJCIEFBIDg4IDU0CisJCQkJCTg4IDc2IDg4IDEwCisJCQkJCTg4IDMyIDMyIDEwCisJCQkJCTg4IDg4IDg4IDg4CisJCQkJCTg4IDAwIDA0IDAwCisJCQkJCTAwIDAwIDAwIDAwCisJCQkJCTAwCisJCQkJMzkgMDEgMDAgMDAgMDAgMDAgMDMKKwkJCQkJQ0IgMDcgMDcKKwkJCQkzOSAwMSAwMCAwMCAwMCAwMCAwNQorCQkJCQlCQiAwMCAwMCBGRgorCQkJCQk4MAorCQkJCTM5IDAxIDAwIDAwIDAwIDAwIDA0CisJCQkJCURFIDA1IDU4IDEwCisJCQkJMzkgMDEgMDAgMDAgMDAgMDAgMDUKKwkJCQkJQjYgMDAgOEEgMDAKKwkJCQkJOEEKKwkJCQkzOSAwMSAwMCAwMCAwMCAwMCAyMworCQkJCQlFMCAwMSAwOCAwQworCQkJCQkxRiAyNSAzNiAxMgorCQkJCQkzNSAwNSAwOSAwRAorCQkJCQkxMCAxMSAwRiAwRgorCQkJCQkxQyAxRCAwMSAwOAorCQkJCQkwQyAxRiAyNSAzNgorCQkJCQkxMiAzNSAwNSAwOQorCQkJCQkwRCAxMCAxMSAwRgorCQkJCQkwRiAxQyAxRAorCQkJCTA1IDAxIDAwIDAwIDk2IDAwIDAyCisJCQkJCTExIDAwCisJCQkJMDUgMDEgMDAgMDAgOTYgMDAgMDIKKwkJCQkJMjkgMDAKKwkJXTsKKwkJcWNvbSxtZHNzLWRzaS1vZmYtY29tbWFuZCA9IFswNSAwMSAwMCAwMCAzMiAwMCAwMiAyOCAwMAorCQkJCQkwNSAwMSAwMCAwMCA3OCAwMCAwMiAxMCAwMF07CisJCXFjb20sbWRzcy1kc2ktb24tY29tbWFuZC1zdGF0ZSA9ICJkc2lfbHBfbW9kZSI7CisJCXFjb20sbWRzcy1kc2ktb2ZmLWNvbW1hbmQtc3RhdGUgPSAiZHNpX2xwX21vZGUiOworCQlxY29tLG1kc3MtZHNpLWgtc3luYy1wdWxzZSA9IDwxPjsKKwkJcWNvbSxtZHNzLWRzaS10cmFmZmljLW1vZGUgPSA8Mj47CisJCXFjb20sbWRzcy1kc2ktbGFuZS1tYXAgPSA8MT47CisJCXFjb20sbWRzcy1kc2ktYmxscC1lb2YtcG93ZXItbW9kZTsKKwkJcWNvbSxtZHNzLWRzaS1ibGxwLXBvd2VyLW1vZGU7CisJCXFjb20sbWRzcy1kc2ktbGFuZS0wLXN0YXRlOworCQlxY29tLG1kc3MtZHNpLWxhbmUtMS1zdGF0ZTsKKwkJcWNvbSxtZHNzLWRzaS1wYW5lbC10aW1pbmdzID0gWzk3IDIzIDE3IDAwIDRCIDUzIDFDIDI3IDI3IDAzIDA0IDAwXTsKKwkJcWNvbSxtZHNzLWRzaS10LWNsay1wb3N0ID0gPDB4MDQ+OworCQlxY29tLG1kc3MtZHNpLXQtY2xrLXByZSA9IDwweDFiPjsKKwkJcWNvbSxtZHNzLWRzaS1ibC1taW4tbGV2ZWwgPSA8MT47CisJCXFjb20sbWRzcy1kc2ktYmwtbWF4LWxldmVsID0gPDI1NT47CisJCXFjb20sbWRzcy1kc2ktZG1hLXRyaWdnZXIgPSA8ND47CisJCXFjb20sbWRzcy1kc2ktbWRwLXRyaWdnZXIgPSA8MD47CisJCXFjb20sbWRzcy1kc2ktYmwtcG1pYy1jb250cm9sLXR5cGUgPSAiYmxfY3RybF93bGVkIjsKKwkJcWNvbSxtZHNzLWRzaS1yZXNldC1zZXF1ZW5jZSA9IDwxIDIwPiwgPDAgMj4sIDwxIDIwPjsKKworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtLXBtODExMC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtLXBtODExMC5kdHNpCmluZGV4IDg1MjM1MjQuLjJjY2IxZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbS1wbTgxMTAuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9tc20tcG04MTEwLmR0c2kKQEAgLTMyMCw2ICszMjAsNyBAQAogCQkJcWNvbSxvY3Ytdm9sdGFnZS1oaWdoLXRocmVzaG9sZC11diA9IDwzNzUwMDAwPjsKIAkJCXFjb20sb2N2LXZvbHRhZ2UtbG93LXRocmVzaG9sZC11diA9IDwzNjUwMDAwPjsKIAkJCXFjb20sbG93LXNvYy1jYWxjdWxhdGUtc29jLXRocmVzaG9sZCA9IDwxNT47CisJCQlxY29tLGxvdy12b2x0YWdlLWNhbGN1bGF0ZS1zb2MtbXMgPSA8MTAwMD47CiAJCQlxY29tLGxvdy1zb2MtY2FsY3VsYXRlLXNvYy1tcyA9IDw1MDAwPjsKIAkJCXFjb20sY2FsY3VsYXRlLXNvYy1tcyA9IDwyMDAwMD47CiAJCQlxY29tLGNoZy10ZXJtLXVhID0gPDEwMDAwMD47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9tc20tcG04MjI2LmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9tc20tcG04MjI2LmR0c2kKaW5kZXggZjJlZDhiNS4uYjliY2QwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtLXBtODIyNi5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbS1wbTgyMjYuZHRzaQpAQCAtMTk5LDYgKzE5OSw3IEBACiAJCQlxY29tLG9jdi12b2x0YWdlLWhpZ2gtdGhyZXNob2xkLXV2ID0gPDM3NTAwMDA+OwogCQkJcWNvbSxvY3Ytdm9sdGFnZS1sb3ctdGhyZXNob2xkLXV2ID0gPDM2NTAwMDA+OwogCQkJcWNvbSxsb3ctc29jLWNhbGN1bGF0ZS1zb2MtdGhyZXNob2xkID0gPDE1PjsKKwkJCXFjb20sbG93LXZvbHRhZ2UtY2FsY3VsYXRlLXNvYy1tcyA9IDwxMDAwPjsKIAkJCXFjb20sbG93LXNvYy1jYWxjdWxhdGUtc29jLW1zID0gPDUwMDA+OwogCQkJcWNvbSxjYWxjdWxhdGUtc29jLW1zID0gPDIwMDAwPjsKIAkJCXFjb20sY2hnLXRlcm0tdWEgPSA8MTAwMDAwPjsKQEAgLTQzMiw2ICs0MzMsMTYgQEAKIAkJCQlxY29tLGh3LXNldHRsZS10aW1lID0gPDA+OwogCQkJCXFjb20sZmFzdC1hdmctc2V0dXAgPSA8MD47CiAJCQl9OworCQkJY2hhbkAxIHsKKwkJCQlsYWJlbCA9ICJleHRlcm5hbF9yc2Vuc2UiOworCQkJCXJlZyA9IDwxPjsKKwkJCQlxY29tLGRlY2ltYXRpb24gPSA8MD47CisJCQkJcWNvbSxwcmUtZGl2LWNoYW5uZWwtc2NhbGluZyA9IDwxPjsKKwkJCQlxY29tLGNhbGlicmF0aW9uLXR5cGUgPSAiYWJzb2x1dGUiOworCQkJCXFjb20sc2NhbGUtZnVuY3Rpb24gPSA8MD47CisJCQkJcWNvbSxody1zZXR0bGUtdGltZSA9IDwwPjsKKwkJCQlxY29tLGZhc3QtYXZnLXNldHVwID0gPDA+OworCQkJfTsKIAkJfTsKIAogCQlwbTgyMjZfYWRjX3RtOiB2YWRjQDM0MDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtLXBtODk0MS5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtLXBtODk0MS5kdHNpCmluZGV4IGM0ZGUwNGMuLmI1NDAwNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbS1wbTg5NDEuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9tc20tcG04OTQxLmR0c2kKQEAgLTEyNyw2ICsxMjcsNyBAQAogCQlxY29tLG9jdi12b2x0YWdlLWhpZ2gtdGhyZXNob2xkLXV2ID0gPDM3NTAwMDA+OwogCQlxY29tLG9jdi12b2x0YWdlLWxvdy10aHJlc2hvbGQtdXYgPSA8MzY1MDAwMD47CiAJCXFjb20sbG93LXNvYy1jYWxjdWxhdGUtc29jLXRocmVzaG9sZCA9IDwxNT47CisJCXFjb20sbG93LXZvbHRhZ2UtY2FsY3VsYXRlLXNvYy1tcyA9IDwxMDAwPjsKIAkJcWNvbSxsb3ctc29jLWNhbGN1bGF0ZS1zb2MtbXMgPSA8NTAwMD47CiAJCXFjb20sY2FsY3VsYXRlLXNvYy1tcyA9IDwyMDAwMD47CiAJCXFjb20sY2hnLXRlcm0tdWEgPSA8MTAwMDAwPjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTgyMjYtY29yZXNpZ2h0LmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9tc204MjI2LWNvcmVzaWdodC5kdHNpCmluZGV4IGVjM2YyNDguLmZlZWY5ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTgyMjYtY29yZXNpZ2h0LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODIyNi1jb3Jlc2lnaHQuZHRzaQpAQCAtMjE1LDEyICsyMTUsNTYgQEAKIAkJcWNvbSxyb3VuZC1yb2JpbjsKIAl9OwogCisJYXVkaW9fZXRtMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxjb3Jlc2lnaHQtYXVkaW8tZXRtIjsKKworCQljb3Jlc2lnaHQtaWQgPSA8MTQ+OworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtYXVkaW8tZXRtMCI7CisJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OworCQljb3Jlc2lnaHQtb3V0cG9ydHMgPSA8MD47CisJCWNvcmVzaWdodC1jaGlsZC1saXN0ID0gPCZmdW5uZWxfaW4wPjsKKwkJY29yZXNpZ2h0LWNoaWxkLXBvcnRzID0gPDI+OworCX07CisKKwltb2RlbV9ldG0wIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGNvcmVzaWdodC1tb2RlbS1ldG0iOworCisJCWNvcmVzaWdodC1pZCA9IDwxNT47CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1tb2RlbS1ldG0wIjsKKwkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CisJCWNvcmVzaWdodC1vdXRwb3J0cyA9IDwwPjsKKwkJY29yZXNpZ2h0LWNoaWxkLWxpc3QgPSA8JmZ1bm5lbF9pbjA+OworCQljb3Jlc2lnaHQtY2hpbGQtcG9ydHMgPSA8MT47CisJfTsKKworCXdjbl9ldG0wIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGNvcmVzaWdodC13Y24tZXRtIjsKKworCQljb3Jlc2lnaHQtaWQgPSA8MTY+OworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtd2NuLWV0bTAiOworCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKKwkJY29yZXNpZ2h0LW91dHBvcnRzID0gPDA+OworCQljb3Jlc2lnaHQtY2hpbGQtbGlzdCA9IDwmZnVubmVsX2luMT47CisJCWNvcmVzaWdodC1jaGlsZC1wb3J0cyA9IDwyPjsKKwl9OworCisJcnBtX2V0bTAgeworCQljb21wYXRpYmxlID0gInFjb20sY29yZXNpZ2h0LXJwbS1ldG0iOworCisJCWNvcmVzaWdodC1pZCA9IDwxNz47CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1ycG0tZXRtMCI7CisJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OworCQljb3Jlc2lnaHQtb3V0cG9ydHMgPSA8MD47CisJCWNvcmVzaWdodC1jaGlsZC1saXN0ID0gPCZmdW5uZWxfaW4wPjsKKwkJY29yZXNpZ2h0LWNoaWxkLXBvcnRzID0gPDA+OworCX07CisKIAljc3I6IGNzckBmYzMwMjAwMCB7CiAJCWNvbXBhdGlibGUgPSAicWNvbSxjb3Jlc2lnaHQtY3NyIjsKIAkJcmVnID0gPDB4ZmMzMDIwMDAgMHgxMDAwPjsKIAkJcmVnLW5hbWVzID0gImNzci1iYXNlIjsKIAotCQljb3Jlc2lnaHQtaWQgPSA8MTQ+OworCQljb3Jlc2lnaHQtaWQgPSA8MTg+OwogCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3NyIjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAKQEAgLTIzMiw3ICsyNzYsNyBAQAogCQlyZWcgPSA8MHhmYzMwODAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwxNT47CisJCWNvcmVzaWdodC1pZCA9IDwxOT47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkwIjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAJfTsKQEAgLTI0Miw3ICsyODYsNyBAQAogCQlyZWcgPSA8MHhmYzMwOTAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwxNj47CisJCWNvcmVzaWdodC1pZCA9IDwyMD47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkxIjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAJfTsKQEAgLTI1Miw3ICsyOTYsNyBAQAogCQlyZWcgPSA8MHhmYzMwYTAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwxNz47CisJCWNvcmVzaWdodC1pZCA9IDwyMT47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkyIjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAJfTsKQEAgLTI2Miw3ICszMDYsNyBAQAogCQlyZWcgPSA8MHhmYzMwYjAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwxOD47CisJCWNvcmVzaWdodC1pZCA9IDwyMj47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkzIjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAJfTsKQEAgLTI3Miw3ICszMTYsNyBAQAogCQlyZWcgPSA8MHhmYzMwYzAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwxOT47CisJCWNvcmVzaWdodC1pZCA9IDwyMz47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGk0IjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAJfTsKQEAgLTI4Miw3ICszMjYsNyBAQAogCQlyZWcgPSA8MHhmYzMwZDAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwyMD47CisJCWNvcmVzaWdodC1pZCA9IDwyND47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGk1IjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAJfTsKQEAgLTI5Miw3ICszMzYsNyBAQAogCQlyZWcgPSA8MHhmYzMwZTAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwyMT47CisJCWNvcmVzaWdodC1pZCA9IDwyNT47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGk2IjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAJfTsKQEAgLTMwMiw3ICszNDYsNyBAQAogCQlyZWcgPSA8MHhmYzMwZjAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwyMj47CisJCWNvcmVzaWdodC1pZCA9IDwyNj47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGk3IjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAJfTsKQEAgLTMxMiw3ICszNTYsNyBAQAogCQlyZWcgPSA8MHhmYzMxMDAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwyMz47CisJCWNvcmVzaWdodC1pZCA9IDwyNz47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGk4IjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAJfTsKQEAgLTMyMiw3ICszNjYsNyBAQAogCQlyZWcgPSA8MHhmYzM0MDAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwyND47CisJCWNvcmVzaWdodC1pZCA9IDwyOD47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktbDIiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMzMyLDcgKzM3Niw3IEBACiAJCXJlZyA9IDwweGZjMzQxMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDI1PjsKKwkJY29yZXNpZ2h0LWlkID0gPDI5PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS1jcHUwIjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAJfTsKQEAgLTM0Miw3ICszODYsNyBAQAogCQlyZWcgPSA8MHhmYzM0MjAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwyNj47CisJCWNvcmVzaWdodC1pZCA9IDwzMD47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktY3B1MSI7CiAJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OwogCX07CkBAIC0zNTIsNyArMzk2LDcgQEAKIAkJcmVnID0gPDB4ZmMzNDMwMDAgMHgxMDAwPjsKIAkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKIAotCQljb3Jlc2lnaHQtaWQgPSA8Mjc+OworCQljb3Jlc2lnaHQtaWQgPSA8MzE+OwogCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLWNwdTIiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMzYyLDExICs0MDYsNjEgQEAKIAkJcmVnID0gPDB4ZmMzNDQwMDAgMHgxMDAwPjsKIAkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKIAotCQljb3Jlc2lnaHQtaWQgPSA8Mjg+OworCQljb3Jlc2lnaHQtaWQgPSA8MzI+OwogCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLWNwdTMiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwogCisJY3RpX3ZpZGVvX2NwdTA6IGN0aUBmYzM0ODAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcmVzaWdodC1jdGkiOworCQlyZWcgPSA8MHhmYzM0ODAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1pZCA9IDwzMz47CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktdmlkZW8tY3B1MCI7CisJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OworCX07CisKKwljdGlfd2NuX2NwdTA6IGN0aUBmYzM0ZDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcmVzaWdodC1jdGkiOworCQlyZWcgPSA8MHhmYzM0ZDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1pZCA9IDwzND47CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktd2NuLWNwdTAiOworCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKKwl9OworCisJY3RpX21vZGVtX2NwdTA6IGN0aUBmYzM1MDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcmVzaWdodC1jdGkiOworCQlyZWcgPSA8MHhmYzM1MDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1pZCA9IDwzNT47CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktbW9kZW0tY3B1MCI7CisJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OworCX07CisKKwljdGlfYXVkaW9fY3B1MDogY3RpQGZjMzU0MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sY29yZXNpZ2h0LWN0aSI7CisJCXJlZyA9IDwweGZjMzU0MDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LWlkID0gPDM2PjsKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS1hdWRpby1jcHUwIjsKKwkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CisJfTsKKworCWN0aV9ycG1fY3B1MDogY3RpQGZjMzU4MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sY29yZXNpZ2h0LWN0aSI7CisJCXJlZyA9IDwweGZjMzU4MDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LWlkID0gPDM3PjsKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS1ycG0tY3B1MCI7CisJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OworCX07CisKIAlod2V2ZW50OiBod2V2ZW50QGZkODI4MDE4IHsKIAkJY29tcGF0aWJsZSA9ICJxY29tLGNvcmVzaWdodC1od2V2ZW50IjsKIAkJcmVnID0gPDB4ZmQ4MjgwMTggMHg4MD4sCkBAIC0zNzUsNyArNDY5LDcgQEAKIAkJICAgICAgPDB4ZmM0MDE2MDAgMHg4MD47CiAJCXJlZy1uYW1lcyA9ICJtbXNzLW11eCIsICJhcGNzLW11eCIsICJwcHNzLW11eCIsICJnY2MtbXV4IjsKIAotCQljb3Jlc2lnaHQtaWQgPSA8Mjk+OworCQljb3Jlc2lnaHQtaWQgPSA8Mzg+OwogCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtaHdldmVudCI7CiAJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OwogCkBAIC0zODcsNyArNDgxLDcgQEAKIAkJcmVnID0gPDB4ZmM0YmUwMjQgMHg4PjsKIAkJcmVnLW5hbWVzID0gImZ1c2UtYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDMwPjsKKwkJY29yZXNpZ2h0LWlkID0gPDM5PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWZ1c2UiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODIyNi1tdHAuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTgyMjYtbXRwLmR0c2kKaW5kZXggZGJkMjAzMS4uYTRiZDhmZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODIyNi1tdHAuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9tc204MjI2LW10cC5kdHNpCkBAIC00OTcsNiArNDk3LDcgQEAKIAogJm1kc3NfbWRwIHsKIAlxY29tLG1kc3MtcHJlZi1wcmltLWludGYgPSAiZHNpIjsKKwliYXRmZXQtc3VwcGx5ID0gPCZwbTgyMjZfY2hnX2JhdGlmPjsKIH07CiAKICZtZHNzX2RzaTAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODIyNi1xcmQuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTgyMjYtcXJkLmR0c2kKaW5kZXggYzMxYzYxMi4uZWFjMGJiNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODIyNi1xcmQuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9tc204MjI2LXFyZC5kdHNpCkBAIC00OTQsNiArNDk0LDcgQEAKIAogJm1kc3NfbWRwIHsKIAlxY29tLG1kc3MtcHJlZi1wcmltLWludGYgPSAiZHNpIjsKKwliYXRmZXQtc3VwcGx5ID0gPCZwbTgyMjZfY2hnX2JhdGlmPjsKIH07CiAKICZtZHNzX2RzaTAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODIyNi12Mi1xcmQtcHZ0LmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTgyMjYtdjItcXJkLXB2dC5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2YTFkYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTgyMjYtdjItcXJkLXB2dC5kdHMKQEAgLTAsMCArMSwyOSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy9kdHMtdjEvOworL2luY2x1ZGUvICJtc204MjI2LXYyLmR0c2kiCisvaW5jbHVkZS8gIm1zbTgyMjYtcXJkLmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIE1TTSA4MjI2djIgUVJEIFBWVCI7CisJY29tcGF0aWJsZSA9ICJxY29tLG1zbTgyMjYtcXJkIiwgInFjb20sbXNtODIyNiIsICJxY29tLHFyZCI7CisJcWNvbSxib2FyZC1pZCA9IDwweDMwMDBiIDA+OworfTsKKworJm1kc3NfZHNpMCB7CisJcWNvbSxkc2ktcHJlZi1wcmltLXBhbiA9IDwmZHNpX250MzU1OTBfNzIwX3ZpZD47Cit9OworCismZHNpX250MzU1OTBfNzIwX3ZpZCB7CisJcWNvbSxjb250LXNwbGFzaC1lbmFibGVkOworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTAtY2RwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9tc204NjEwLWNkcC5kdHNpCmluZGV4IDQ1MmNjMmYuLjk5MjBmNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTAtY2RwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC1jZHAuZHRzaQpAQCAtMTYyLDggKzE2Miw5IEBACiAJCXFjb20sY2RjLXZkZC1taWMtYmlhcy12b2x0YWdlID0gPDMwNzUwMDAgMzA3NTAwMD47CiAJCXFjb20sY2RjLXZkZC1taWMtYmlhcy1jdXJyZW50ID0gPDI1MDAwPjsKIAorCQlxY29tLGNkYy1taWNiaWFzLWxkb2gtdiA9IDwweDM+OwogCQlxY29tLGNkYy1taWNiaWFzLWNmaWx0LXNlbCA9IDwweDA+OwotCQlxY29tLGNkYy1taWNiaWFzLWNmaWx0LW12ID0gPDE4MDAwMDA+OworCQlxY29tLGNkYy1taWNiaWFzLWNmaWx0LW12ID0gPDI3MDA+OwogCQlxY29tLGNkYy1tY2xrLWNsay1yYXRlID0gPDEyMjg4MDAwPjsKIAogCQlxY29tLGNkYy1zdGF0aWMtc3VwcGxpZXMgPSAiY2RjLXZkZGEtaCIsCkBAIC0yNDUsNyArMjQ2LDYgQEAKIAogCXZkZC1pby1zdXBwbHkgPSA8JnBtODExMF9sNj47CiAJcWNvbSx2ZGQtaW8tYWx3YXlzLW9uOwotCXFjb20sdmRkLWlvLWxwbS1zdXA7CiAJcWNvbSx2ZGQtaW8tdm9sdGFnZS1sZXZlbCA9IDwxODAwMDAwIDE4MDAwMDA+OwogCXFjb20sdmRkLWlvLWN1cnJlbnQtbGV2ZWwgPSA8MjAwIDYwMDAwPjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC1jb3Jlc2lnaHQuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTAtY29yZXNpZ2h0LmR0c2kKaW5kZXggNzhhNGI1YS4uY2E0ZjcyMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC1jb3Jlc2lnaHQuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9tc204NjEwLWNvcmVzaWdodC5kdHNpCkBAIC0yMDUsMTIgKzIwNSw1NiBAQAogCQlxY29tLHJvdW5kLXJvYmluOwogCX07CiAKKwlhdWRpb19ldG0wIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGNvcmVzaWdodC1hdWRpby1ldG0iOworCisJCWNvcmVzaWdodC1pZCA9IDwxMz47CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1hdWRpby1ldG0wIjsKKwkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CisJCWNvcmVzaWdodC1vdXRwb3J0cyA9IDwwPjsKKwkJY29yZXNpZ2h0LWNoaWxkLWxpc3QgPSA8JmZ1bm5lbF9pbjA+OworCQljb3Jlc2lnaHQtY2hpbGQtcG9ydHMgPSA8Mj47CisJfTsKKworCW1vZGVtX2V0bTAgeworCQljb21wYXRpYmxlID0gInFjb20sY29yZXNpZ2h0LW1vZGVtLWV0bSI7CisKKwkJY29yZXNpZ2h0LWlkID0gPDE0PjsKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LW1vZGVtLWV0bTAiOworCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKKwkJY29yZXNpZ2h0LW91dHBvcnRzID0gPDA+OworCQljb3Jlc2lnaHQtY2hpbGQtbGlzdCA9IDwmZnVubmVsX2luMD47CisJCWNvcmVzaWdodC1jaGlsZC1wb3J0cyA9IDwxPjsKKwl9OworCisJd2NuX2V0bTAgeworCQljb21wYXRpYmxlID0gInFjb20sY29yZXNpZ2h0LXdjbi1ldG0iOworCisJCWNvcmVzaWdodC1pZCA9IDwxNT47CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC13Y24tZXRtMCI7CisJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OworCQljb3Jlc2lnaHQtb3V0cG9ydHMgPSA8MD47CisJCWNvcmVzaWdodC1jaGlsZC1saXN0ID0gPCZmdW5uZWxfaW4xPjsKKwkJY29yZXNpZ2h0LWNoaWxkLXBvcnRzID0gPDA+OworCX07CisKKwlycG1fZXRtMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxjb3Jlc2lnaHQtcnBtLWV0bSI7CisKKwkJY29yZXNpZ2h0LWlkID0gPDE2PjsKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LXJwbS1ldG0wIjsKKwkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CisJCWNvcmVzaWdodC1vdXRwb3J0cyA9IDwwPjsKKwkJY29yZXNpZ2h0LWNoaWxkLWxpc3QgPSA8JmZ1bm5lbF9pbjA+OworCQljb3Jlc2lnaHQtY2hpbGQtcG9ydHMgPSA8MD47CisJfTsKKwogCWNzcjogY3NyQGZjMzAxMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJxY29tLGNvcmVzaWdodC1jc3IiOwogCQlyZWcgPSA8MHhmYzMwMTAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3NyLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwxMz47CisJCWNvcmVzaWdodC1pZCA9IDwxNz47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jc3IiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIApAQCAtMjIyLDcgKzI2Niw3IEBACiAJCXJlZyA9IDwweGZjMzEwMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDE0PjsKKwkJY29yZXNpZ2h0LWlkID0gPDE4PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTAiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjMyLDcgKzI3Niw3IEBACiAJCXJlZyA9IDwweGZjMzExMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDE1PjsKKwkJY29yZXNpZ2h0LWlkID0gPDE5PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTEiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjQyLDcgKzI4Niw3IEBACiAJCXJlZyA9IDwweGZjMzEyMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDE2PjsKKwkJY29yZXNpZ2h0LWlkID0gPDIwPjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTIiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjUyLDcgKzI5Niw3IEBACiAJCXJlZyA9IDwweGZjMzEzMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDE3PjsKKwkJY29yZXNpZ2h0LWlkID0gPDIxPjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTMiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjYyLDcgKzMwNiw3IEBACiAJCXJlZyA9IDwweGZjMzE0MDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDE4PjsKKwkJY29yZXNpZ2h0LWlkID0gPDIyPjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTQiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjcyLDcgKzMxNiw3IEBACiAJCXJlZyA9IDwweGZjMzE1MDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDE5PjsKKwkJY29yZXNpZ2h0LWlkID0gPDIzPjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTUiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjgyLDcgKzMyNiw3IEBACiAJCXJlZyA9IDwweGZjMzE2MDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDIwPjsKKwkJY29yZXNpZ2h0LWlkID0gPDI0PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTYiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjkyLDcgKzMzNiw3IEBACiAJCXJlZyA9IDwweGZjMzE3MDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDIxPjsKKwkJY29yZXNpZ2h0LWlkID0gPDI1PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTciOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMzAyLDcgKzM0Niw3IEBACiAJCXJlZyA9IDwweGZjMzE4MDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDIyPjsKKwkJY29yZXNpZ2h0LWlkID0gPDI2PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTgiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMzEyLDcgKzM1Niw3IEBACiAJCXJlZyA9IDwweGZjMzUxMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDIzPjsKKwkJY29yZXNpZ2h0LWlkID0gPDI3PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS1jcHUwIjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAJfTsKQEAgLTMyMiw3ICszNjYsNyBAQAogCQlyZWcgPSA8MHhmYzM1MjAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwyND47CisJCWNvcmVzaWdodC1pZCA9IDwyOD47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktY3B1MSI7CiAJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OwogCX07CkBAIC0zMzIsNyArMzc2LDcgQEAKIAkJcmVnID0gPDB4ZmMzNTMwMDAgMHgxMDAwPjsKIAkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKIAotCQljb3Jlc2lnaHQtaWQgPSA8MjU+OworCQljb3Jlc2lnaHQtaWQgPSA8Mjk+OwogCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLWNwdTIiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMzQyLDExICszODYsNTEgQEAKIAkJcmVnID0gPDB4ZmMzNTQwMDAgMHgxMDAwPjsKIAkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKIAotCQljb3Jlc2lnaHQtaWQgPSA8MjY+OworCQljb3Jlc2lnaHQtaWQgPSA8MzA+OwogCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLWNwdTMiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwogCisJY3RpX3djbl9jcHUwOiBjdGlAZmMzMzUwMDAgeworCQljb21wYXRpYmxlID0gImFybSxjb3Jlc2lnaHQtY3RpIjsKKwkJcmVnID0gPDB4ZmMzMzUwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtaWQgPSA8MzE+OworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLXdjbi1jcHUwIjsKKwkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CisJfTsKKworCWN0aV9tb2RlbV9jcHUwOiBjdGlAZmMzMzgwMDAgeworCQljb21wYXRpYmxlID0gImFybSxjb3Jlc2lnaHQtY3RpIjsKKwkJcmVnID0gPDB4ZmMzMzgwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtaWQgPSA8MzI+OworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLW1vZGVtLWNwdTAiOworCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKKwl9OworCisJY3RpX2F1ZGlvX2NwdTA6IGN0aUBmYzMzYzAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcmVzaWdodC1jdGkiOworCQlyZWcgPSA8MHhmYzMzYzAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1pZCA9IDwzMz47CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktYXVkaW8tY3B1MCI7CisJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OworCX07CisKKwljdGlfcnBtX2NwdTA6IGN0aUBmYzM2MDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcmVzaWdodC1jdGkiOworCQlyZWcgPSA8MHhmYzM2MDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1pZCA9IDwzND47CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktcnBtLWNwdTAiOworCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKKwl9OworCiAJaHdldmVudDogaHdldmVudEBmZDgyMDAxOCB7CiAJCWNvbXBhdGlibGUgPSAicWNvbSxjb3Jlc2lnaHQtaHdldmVudCI7CiAJCXJlZyA9IDwweGZkODIwMDE4IDB4ODA+LApAQCAtMzU1LDcgKzQzOSw3IEBACiAJCSAgICAgIDwweGZjNDAxNjAwIDB4ODA+OwogCQlyZWctbmFtZXMgPSAibW1zcy1tdXgiLCAiYXBjcy1tdXgiLCAicHBzcy1tdXgiLCAiZ2NjLW11eCI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDI3PjsKKwkJY29yZXNpZ2h0LWlkID0gPDM1PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWh3ZXZlbnQiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIApAQCAtMzY3LDcgKzQ1MSw3IEBACiAJCXJlZyA9IDwweGZjNGJlMDI0IDB4OD47CiAJCXJlZy1uYW1lcyA9ICJmdXNlLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwyOD47CisJCWNvcmVzaWdodC1pZCA9IDwzNj47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1mdXNlIjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTAtbWRzcy1wYW5lbHMuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTAtbWRzcy1wYW5lbHMuZHRzaQppbmRleCAyNDNkN2U4Li5hZmM1NDU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9tc204NjEwLW1kc3MtcGFuZWxzLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC1tZHNzLXBhbmVscy5kdHNpCkBAIC0xNSwzICsxNSw0IEBACiAvaW5jbHVkZS8gImRzaS1wYW5lbC1udDM1NTkwLTcyMHAtdmlkZW8uZHRzaSIKIC9pbmNsdWRlLyAiZHNpLXBhbmVsLW90bTgwMThiLWZ3dmdhLXZpZGVvLmR0c2kiCiAvaW5jbHVkZS8gImRzaS1wYW5lbC1oeDgzNzlhLXd2Z2EtdmlkZW8uZHRzaSIKKy9pbmNsdWRlLyAiZHNpLXBhbmVsLWh4ODM4OWItcWhkLXZpZGVvLmR0c2kiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9tc204NjEwLW10cC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC1tdHAuZHRzaQppbmRleCA4ZDBlMjAxLi4wMjQ0Yjg5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9tc204NjEwLW10cC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTAtbXRwLmR0c2kKQEAgLTIyOSw4ICsyMjksOSBAQAogCQlxY29tLGNkYy12ZGQtbWljLWJpYXMtdm9sdGFnZSA9IDwzMDc1MDAwIDMwNzUwMDA+OwogCQlxY29tLGNkYy12ZGQtbWljLWJpYXMtY3VycmVudCA9IDwyNTAwMD47CiAKKwkJcWNvbSxjZGMtbWljYmlhcy1sZG9oLXYgPSA8MHgzPjsKIAkJcWNvbSxjZGMtbWljYmlhcy1jZmlsdC1zZWwgPSA8MHgwPjsKLQkJcWNvbSxjZGMtbWljYmlhcy1jZmlsdC1tdiA9IDwxODAwMDAwPjsKKwkJcWNvbSxjZGMtbWljYmlhcy1jZmlsdC1tdiA9IDwyNzAwPjsKIAkJcWNvbSxjZGMtbWNsay1jbGstcmF0ZSA9IDwxMjI4ODAwMD47CiAKIAkJcWNvbSxjZGMtc3RhdGljLXN1cHBsaWVzID0gImNkYy12ZGRhLWgiLApAQCAtMzEyLDcgKzMxMyw2IEBACiAKIAl2ZGQtaW8tc3VwcGx5ID0gPCZwbTgxMTBfbDY+OwogCXFjb20sdmRkLWlvLWFsd2F5cy1vbjsKLQlxY29tLHZkZC1pby1scG0tc3VwOwogCXFjb20sdmRkLWlvLXZvbHRhZ2UtbGV2ZWwgPSA8MTgwMDAwMCAxODAwMDAwPjsKIAlxY29tLHZkZC1pby1jdXJyZW50LWxldmVsID0gPDIwMCA2MDAwMD47CiAKQEAgLTQ0NSw2ICs0NDUsNyBAQAogCiAmbWRzc19tZHAgewogCXFjb20sbWRzcy1wcmVmLXByaW0taW50ZiA9ICJkc2kiOworCWJhdGZldC1zdXBwbHkgPSA8JnBtODExMF9jaGdfYmF0aWY+OwogfTsKIAogJm1kc3NfZHNpMCB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9tc204NjEwLXFyZC1za3VhYS5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC1xcmQtc2t1YWEuZHRzaQppbmRleCA4NmYxMjEwLi5iYjg2NmIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9tc204NjEwLXFyZC1za3VhYS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTAtcXJkLXNrdWFhLmR0c2kKQEAgLTMyLDYgKzMyLDIxIEBACiAJCXFjb20saHN1c2Itb3RnLXBoeS1pbml0LXNlcSA9CiAJCTwweDQ0IDB4ODAgMHg2YSAweDgxIDB4MzQgMHg4MiAweDEzIDB4ODMgMHhmZmZmZmZmZj47CiAJfTsKKworCWkyY0BmOTkyNTAwMCB7IC8qIEJMU1AtMSBRVVAtMyAqLworCQluZmMtbmNpQGUgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG5mYy1uY2kiOworCQkJcmVnID0gPDB4MGU+OworCQkJcWNvbSxpcnEtZ3BpbyA9IDwmbXNtZ3BpbyA3NyAweDAwPjsKKwkJCXFjb20sZGlzLWdwaW8gPSA8Jm1zbWdwaW8gOTMgMHgwMD47CisJCQlxY29tLGNsay1lbi1ncGlvID0gPCZtc21ncGlvIDc4IDB4MDA+OworCQkJcWNvbSxjbGstc3JjID0gIkdQQ0xLIjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1zbWdwaW8+OworCQkJaW50ZXJydXB0cyA9IDw3NyAwPjsKKwkJCXFjb20sY2xrLWdwaW8gPSA8Jm1zbWdwaW8gNzUgMHgwMD47CisJCQl2bG9naWMtc3VwcGx5ID0gPCZwbTgxMTBfbDE0PjsKKwkJfTsKKwl9OwogfTsKIAogLyB7CkBAIC00MSw2ICs1Niw3IEBACiAKIAkJL2luY2x1ZGUvICJiYXR0ZXJ5ZGF0YS1xcmQtNHYyLTEzMDBtYWguZHRzaSIKIAl9OworCiB9OwogCiAmcG04MTEwX2JtcyB7CkBAIC03MCwzICs4NiwxMyBAQAogJmRzaV9oeDgzNzlhX3d2Z2FfdmlkIHsKIAlxY29tLGNvbnQtc3BsYXNoLWVuYWJsZWQ7CiB9OworCismcG04MTEwX2dwaW9zIHsKKwlncGlvQGMwMDAgeyAvKiBHUElPIDEgKi8KKwkJcWNvbSxtb2RlID0gPDA+OwkJLyogUVBOUF9QSU5fTU9ERV9ESUdfSU4gKi8KKwkJcWNvbSxwdWxsID0gPDU+OwkJLyogUVBOUF9QSU5fUFVMTF9OTyAqLworCQlxY29tLHZpbi1zZWwgPSA8Mj47CQkvKiBRUE5QX1BJTl9WSU4yICovCisJCXFjb20sc3JjLXNlbCA9IDwyPjsJCS8qIFFQTlBfUElOX1NFTF9GVU5DXzEgKi8KKwkJcWNvbSxtYXN0ZXItZW4gPSA8MT47CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9tc204NjEwLXFyZC1za3VhYi5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC1xcmQtc2t1YWIuZHRzaQppbmRleCAyZmU2YTM0Li4wOGU5YmU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9tc204NjEwLXFyZC1za3VhYi5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTAtcXJkLXNrdWFiLmR0c2kKQEAgLTEzLDYgKzEzLDE2IEBACiAvaW5jbHVkZS8gIm1zbTg2MTAtcXJkLmR0c2kiCiAKICZzb2MgeworCWdwaW8tbGVkcyB7CisJCWNvbXBhdGlibGUgPSAiZ3Bpby1sZWRzIjsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKworCQlncGlvX2ZsYXNoOiBncGlvLWZsYXNoIHsKKwkJCWdwaW9zID0gPCZwbTgxMTBfZ3Bpb3MgMSAwPjsKKwkJCWxhYmVsID0gImdwaW8tZmxhc2giOworCQkJbGludXgsZGVmYXVsdC10cmlnZ2VyID0gImdwaW9fZmxhc2hfdHJpZ2dlciI7CisJCX07CisJfTsKICAgICBzb3VuZCB7CiAgICAgICAgIHFjb20sbW9kZWwgPSAibXNtOHgxMC1za3VhYi1zbmQtY2FyZCI7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTAtcXJkLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9tc204NjEwLXFyZC5kdHNpCmluZGV4IDgzZDg0YzAuLmQ1NzhlZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTAtcXJkLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC1xcmQuZHRzaQpAQCAtMTc1LDggKzE3NSw5IEBACiAJCXFjb20sY2RjLXZkZC1taWMtYmlhcy12b2x0YWdlID0gPDMwNzUwMDAgMzA3NTAwMD47CiAJCXFjb20sY2RjLXZkZC1taWMtYmlhcy1jdXJyZW50ID0gPDI1MDAwPjsKIAorCQlxY29tLGNkYy1taWNiaWFzLWxkb2gtdiA9IDwweDM+OwogCQlxY29tLGNkYy1taWNiaWFzLWNmaWx0LXNlbCA9IDwweDA+OwotCQlxY29tLGNkYy1taWNiaWFzLWNmaWx0LW12ID0gPDE4MDAwMDA+OworCQlxY29tLGNkYy1taWNiaWFzLWNmaWx0LW12ID0gPDI3MDA+OwogCQlxY29tLGNkYy1tY2xrLWNsay1yYXRlID0gPDEyMjg4MDAwPjsKIAogCQlxY29tLGNkYy1zdGF0aWMtc3VwcGxpZXMgPSAiY2RjLXZkZGEtaCIsCkBAIC0zNjcsMyArMzY4LDcgQEAKIAlxY29tLGFuZHJvaWQtdXNiLWNkcm9tOwogCXFjb20sYW5kcm9pZC11c2ItaW50ZXJuYWwtdW1zOwogfTsKKworJm1kc3NfbWRwIHsKKwliYXRmZXQtc3VwcGx5ID0gPCZwbTgxMTBfY2hnX2JhdGlmPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9tc204NjEwLXYxLXBtLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9tc204NjEwLXYxLXBtLmR0c2kKaW5kZXggZTU2MDQ0Ny4uNjI5NjY5MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC12MS1wbS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTAtdjEtcG0uZHRzaQpAQCAtMTgwLDcgKzE4MCw2IEBACiAJCQk8MHhmZiA1OT4sICAvKiBtc3NfdG9fYXBwc19pcnEoMikgKi8KIAkJCTwweGZmIDYwPiwgIC8qIG1zc190b19hcHBzX2lycSgzKSAqLwogCQkJPDB4ZmYgNjE+LCAgLyogbXNzX2EyX2JhbV9pcnEgKi8KLQkJCTwweGZmIDYzPiwgIC8qIHdjZDl4eHhfaXJxICovCiAJCQk8MHhmZiA2NT4sICAvKiBvX2djX3N5c19pcnFbMF0gKi8KIAkJCTwweGZmIDc0PiwgIC8qIHZlbnVzMF9tbXVfY2lycHRbMV0gKi8KIAkJCTwweGZmIDc1PiwgIC8qIHZlbnVzMF9tbXVfY2lycHRbMF0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTAtdjEtcXJkLXNrdWFiLWR2dDIuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC12MS1xcmQtc2t1YWItZHZ0Mi5kdHMKaW5kZXggZjI1MGM0YS4uNGEwOGYzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC12MS1xcmQtc2t1YWItZHZ0Mi5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC12MS1xcmQtc2t1YWItZHZ0Mi5kdHMKQEAgLTIxLDMgKzIxLDE1IEBACiAJY29tcGF0aWJsZSA9ICJxY29tLG1zbTg2MTAtcXJkIiwgInFjb20sbXNtODYxMCIsICJxY29tLHFyZCI7CiAJcWNvbSxib2FyZC1pZCA9IDwweDIwMDBiIDM+OwogfTsKKworJm1kc3NfbWRwIHsKKwlxY29tLG1kc3MtcHJlZi1wcmltLWludGYgPSAiZHNpIjsKK307CisKKyZtZHNzX2RzaTAgeworCXFjb20sZHNpLXByZWYtcHJpbS1wYW4gPSA8JmRzaV9oeDgzODliX3FoZF92aWQ+OworfTsKKworJmRzaV9oeDgzODliX3FoZF92aWQgeworCXFjb20sY29udC1zcGxhc2gtZW5hYmxlZDsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9tc204NjEwLXYyLXBtLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9tc204NjEwLXYyLXBtLmR0c2kKaW5kZXggNzI1MDljMS4uNmM3ZjJmNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC12Mi1wbS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTAtdjItcG0uZHRzaQpAQCAtMTc3LDcgKzE3Nyw2IEBACiAJCQk8MHhmZiA1OT4sICAvKiBtc3NfdG9fYXBwc19pcnEoMikgKi8KIAkJCTwweGZmIDYwPiwgIC8qIG1zc190b19hcHBzX2lycSgzKSAqLwogCQkJPDB4ZmYgNjE+LCAgLyogbXNzX2EyX2JhbV9pcnEgKi8KLQkJCTwweGZmIDYzPiwgIC8qIHdjZDl4eHhfaXJxICovCiAJCQk8MHhmZiAxNzM+LCAvKiBvX3djc3NfYXBzc19zbWRfaGkgKi8KIAkJCTwweGZmIDE3ND4sIC8qIG9fd2Nzc19hcHNzX3NtZF9tZWQgKi8KIAkJCTwweGZmIDE3NT4sIC8qIG9fd2Nzc19hcHNzX3NtZF9sb3cgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTAtdjItcXJkLXNrdWFiLWR2dDIuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC12Mi1xcmQtc2t1YWItZHZ0Mi5kdHMKaW5kZXggOTg2N2NhNi4uNDczNTU1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC12Mi1xcmQtc2t1YWItZHZ0Mi5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC12Mi1xcmQtc2t1YWItZHZ0Mi5kdHMKQEAgLTIxLDMgKzIxLDM4IEBACiAJY29tcGF0aWJsZSA9ICJxY29tLG1zbTg2MTAtcXJkIiwgInFjb20sbXNtODYxMCIsICJxY29tLHFyZCI7CiAJcWNvbSxib2FyZC1pZCA9IDwweDIwMDBiIDM+OwogfTsKKworJnNvYyB7CisJZ3Bpby1sZWRzIHsKKwkJc3RhdHVzID0gIm9rIjsKKwl9OworfTsKKworJnBtODExMF9ncGlvcyB7CisJZ3Bpb0BjMDAwIHsgLyogR1BJTyAxICovCisJCXJlZyA9IDwweGMwMDAgMHgxMDA+OworCQlxY29tLHBpbi1udW0gPSA8MT47CisJfTsKK307CisKKyZsZWRfZmxhc2gwIHsKKwlzdGF0dXMgPSAib2siOworfTsKKworJmkyYyB7CisJcWNvbSxjYW1lcmFAMjAgeworCQlxY29tLGxlZC1mbGFzaC1zcmMgPSA8JmxlZF9mbGFzaDA+OworCX07Cit9OworCismbWRzc19tZHAgeworCXFjb20sbWRzcy1wcmVmLXByaW0taW50ZiA9ICJkc2kiOworfTsKKworJm1kc3NfZHNpMCB7CisJcWNvbSxkc2ktcHJlZi1wcmltLXBhbiA9IDwmZHNpX2h4ODM4OWJfcWhkX3ZpZD47Cit9OworCismZHNpX2h4ODM4OWJfcWhkX3ZpZCB7CisJcWNvbSxjb250LXNwbGFzaC1lbmFibGVkOworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTAuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTAuZHRzaQppbmRleCBiMGY5ZDYyLi5mNmNlZDIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9tc204NjEwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMC5kdHNpCkBAIC0yNzEsNyArMjcxLDYgQEAKIAogCQl2ZGQtaW8tc3VwcGx5ID0gPCZwbTgxMTBfbDY+OwogCQlxY29tLHZkZC1pby1hbHdheXMtb247Ci0JCXFjb20sdmRkLWlvLWxwbS1zdXA7CiAJCXFjb20sdmRkLWlvLXZvbHRhZ2UtbGV2ZWwgPSA8MTgwMDAwMCAxODAwMDAwPjsKIAkJcWNvbSx2ZGQtaW8tY3VycmVudC1sZXZlbCA9IDw5MDAwIDYwMDAwPjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMi1xcmQtY2FtZXJhLXNlbnNvci5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODYxMi1xcmQtY2FtZXJhLXNlbnNvci5kdHNpCmluZGV4IGIwNjBhYmUuLjIwNWU3NDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg2MTItcXJkLWNhbWVyYS1zZW5zb3IuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9tc204NjEyLXFyZC1jYW1lcmEtc2Vuc29yLmR0c2kKQEAgLTExLDYgKzExLDE3IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKKyZzb2MgeworCisJbGVkX2ZsYXNoMDogcWNvbSxjYW1lcmEtbGVkLWZsYXNoIHsKKwkJY2VsbC1pbmRleCA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGNhbWVyYS1sZWQtZmxhc2giOworCQlxY29tLGZsYXNoLXR5cGUgPSA8Mz47CisJCXFjb20sZmxhc2gtc291cmNlID0gPCZncGlvX2ZsYXNoPjsKKwkJcWNvbSx0b3JjaC1zb3VyY2UgPSA8JmdwaW9fZmxhc2g+OworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCX07Cit9OwogJmkyYyB7CiAKIAlxY29tLGNhbWVyYUAyMCB7CkBAIC02Nyw2ICs3OCw3IEBACiAJCWdwaW9zID0gPCZtc21ncGlvIDE0IDA+LAogCQkJCTwmbXNtZ3BpbyAxNSAwPiwKIAkJCQk8Jm1zbWdwaW8gODUgMD47CisJCXFjb20sZ3Bpby1yZXNldCA9IDwxPjsKIAkJcWNvbSxncGlvLXN0YW5kYnkgPSA8Mj47CiAJCXFjb20sZ3Bpby1yZXEtdGJsLW51bSA9IDwwIDEgMj47CiAJCXFjb20sZ3Bpby1yZXEtdGJsLWZsYWdzID0gPDEgMCAwPjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5MjYtY2FtZXJhLXNlbnNvci1xcmQuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5MjYtY2FtZXJhLXNlbnNvci1xcmQuZHRzaQppbmRleCBhODVlMDQ4Li45YjgxMmRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9tc204OTI2LWNhbWVyYS1zZW5zb3ItcXJkLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODkyNi1jYW1lcmEtc2Vuc29yLXFyZC5kdHNpCkBAIC0zMSw2ICszMSwxMjIgQEAKIAkJcWNvbSxjY2ktbWFzdGVyID0gPDA+OwogCX07CiAKKwllZXByb20yOiBxY29tLGVlcHJvbUA2YnsKKwkJY2VsbC1pbmRleCA9IDwyPjsKKwkJcmVnID0gPDB4NmI+OworCQlxY29tLGVlcHJvbS1uYW1lID0gIm9maWxtX290eTVmMDMiOworCQljb21wYXRpYmxlID0gInFjb20sZWVwcm9tIjsKKwkJcWNvbSxzbGF2ZS1hZGRyID0gPDB4NmM+OworCQlxY29tLGNjaS1tYXN0ZXIgPSA8MD47CisJCXFjb20sbnVtLWJsb2NrcyA9IDw3PjsKKworCQlxY29tLHBhZ2UwID0gPDEgMHgwMTAwIDIgMHgwMSAxIDE+OworCQlxY29tLHBvbGwwID0gPDAgMHgwIDIgMCAxIDE+OworCQlxY29tLG1lbTAgPSA8MCAweDAgMiAwIDEgMD47CisJCXFjb20scGFnZTEgPSA8MSAweDNkODQgMiAweGMwIDEgMT47CisJCXFjb20scG9sbDEgPSA8MCAweDAgMiAwIDEgMT47CisJCXFjb20sbWVtMSA9IDwwIDB4MCAyIDAgMSAwPjsKKwkJcWNvbSxwYWdlMiA9IDwxIDB4M2Q4NSAyIDB4MDAgMSAxPjsKKwkJcWNvbSxwb2xsMiA9IDwwIDB4MCAyIDAgMSAxPjsKKwkJcWNvbSxtZW0yID0gPDAgMHgwIDIgMCAxIDA+OworCQlxY29tLHBhZ2UzID0gPDEgMHgzZDg2IDIgMHgwZiAxIDE+OworCQlxY29tLHBhZ2VlbjMgPSA8MSAweDNkODEgMiAweDAxIDEgMTA+OworCQlxY29tLHBvbGwzID0gPDAgMHgwIDIgMCAxIDE+OworCQlxY29tLG1lbTMgPSA8MTYgMHgzZDAwIDIgMCAxIDA+OworCQlxY29tLHBhZ2U0ID0gPDEgMHgzZDg0IDIgMHhjMCAxIDE+OworCQlxY29tLHBvbGw0ID0gPDAgMHgwIDIgMCAxIDE+OworCQlxY29tLG1lbTQgPSA8MCAweDAgMiAwIDEgMD47CisJCXFjb20scGFnZTUgPSA8MSAweDNkODUgMiAweDEwIDEgMT47CisJCXFjb20scG9sbDUgPSA8MCAweDAgMiAwIDEgMT47CisJCXFjb20sbWVtNSA9IDwwIDB4MCAyIDAgMSAwPjsKKwkJcWNvbSxwYWdlNiA9IDwxIDB4M2Q4NiAyIDB4MWYgMSAxPjsKKwkJcWNvbSxwYWdlZW42ID0gPDEgMHgzZDgxIDIgMHgwMSAxIDEwPjsKKwkJcWNvbSxwb2xsNiA9IDwwIDB4MCAyIDAgMSAxPjsKKwkJcWNvbSxtZW02ID0gPDE2IDB4M2QwMCAyIDAgMSAwPjsKKworCQljYW1fdmlvLXN1cHBseSA9IDwmcG04MjI2X2x2czE+OworCQljYW1fdmFuYS1zdXBwbHkgPSA8JnBtODIyNl9sMTk+OworCQlxY29tLGNhbS12cmVnLW5hbWUgPSAiY2FtX3ZpbyIsICJjYW1fdmFuYSI7CisJCXFjb20sY2FtLXZyZWctdHlwZSA9IDwxIDA+OworCQlxY29tLGNhbS12cmVnLW1pbi12b2x0YWdlID0gPDAgMjg1MDAwMD47CisJCXFjb20sY2FtLXZyZWctbWF4LXZvbHRhZ2UgPSA8MCAyODUwMDAwPjsKKwkJcWNvbSxjYW0tdnJlZy1vcC1tb2RlID0gPDAgODAwMDA+OworCQlxY29tLGdwaW8tbm8tbXV4ID0gPDA+OworCQlncGlvcyA9IDwmbXNtZ3BpbyAyNiAwPiwKKwkJICAgICAgICA8Jm1zbWdwaW8gMjggMD4sCisJCSAgICAgICAgPCZtc21ncGlvIDM1IDA+LAorCQkgICAgICAgIDwmbXNtZ3BpbyAyMSAwPjsKKwkJcWNvbSxncGlvLXJlc2V0ID0gPDE+OworCQlxY29tLGdwaW8tc3RhbmRieSA9IDwyPjsKKwkJcWNvbSxncGlvLXZkaWcgPSA8Mz47CisJCXFjb20sZ3Bpby1yZXEtdGJsLW51bSA9IDwwIDEgMiAzPjsKKwkJcWNvbSxncGlvLXJlcS10YmwtZmxhZ3MgPSA8MSAwIDAgMD47CisJCXFjb20sZ3Bpby1yZXEtdGJsLWxhYmVsID0gIkNBTUlGX01DTEsiLAorCQkgICAgICAgICJDQU1fUkVTRVQiLAorCQkgICAgICAgICJDQU1fU1RBTkRCWSIsCisJCSAgICAgICAgIkNBTV9WRElHIjsKKwkJcWNvbSxjYW0tcG93ZXItc2VxLXR5cGUgPSAic2Vuc29yX3ZyZWciLAorCQkgICAgICAgICJzZW5zb3JfdnJlZyIsICJzZW5zb3JfZ3BpbyIsCisJCSAgICAgICAgInNlbnNvcl9ncGlvIiwgInNlbnNvcl9ncGlvIiAsICJzZW5zb3JfY2xrIjsKKwkJcWNvbSxjYW0tcG93ZXItc2VxLXZhbCA9ICJjYW1fdmlvIiwgImNhbV92YW5hIiwic2Vuc29yX2dwaW9fdmRpZyIsCisJCSAgICAgICAgICJzZW5zb3JfZ3Bpb19yZXNldCIsCisJCSAgICAgICAgInNlbnNvcl9ncGlvX3N0YW5kYnkiLCJzZW5zb3JfY2FtX21jbGsiIDsKKwkJcWNvbSxjYW0tcG93ZXItc2VxLWNmZy12YWwgPSA8MSAxIDEgMSAxIDI0MDAwMDAwPjsKKwkJcWNvbSxjYW0tcG93ZXItc2VxLWRlbGF5ID0gPDEgMSAxMCAxMCAxMCA1PjsKKwl9OworCisJZWVwcm9tMzogcWNvbSxlZXByb21ANmMgeworCQljZWxsLWluZGV4ID0gPDM+OworCQlyZWcgPSA8MHg2Yz47CisJCXFjb20sZWVwcm9tLW5hbWUgPSAic3VubnlfcTh2MThhIjsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGVlcHJvbSI7CisJCXFjb20sc2xhdmUtYWRkciA9IDwweDIwPjsKKwkJcWNvbSxjY2ktbWFzdGVyID0gPDA+OworCQlxY29tLG51bS1ibG9ja3MgPSA8ND47CisJCXFjb20scGFnZTAgPSA8MSAweDAxMDAgMiAweDAxIDEgMT47CisJCXFjb20scG9sbDAgPSA8MCAweDAgMiAwIDEgMT47CisJCXFjb20sbWVtMCA9IDwwIDB4MCAyIDAgMSAwPjsKKwkJcWNvbSxwYWdlMSA9IDwxIDB4M2Q4NCAyIDB4YzAgMSAxPjsKKwkJcWNvbSxwb2xsMSA9IDwwIDB4MCAyIDAgMSAxPjsKKwkJcWNvbSxtZW0xID0gPDAgMHgzZDAwIDIgMCAxIDA+OworCQlxY29tLHBhZ2UyID0gPDEgMHgzZDg4IDIgMHg3MDEwIDIgMT47CisJCXFjb20scG9sbDIgPSA8MCAweDAgMiAwIDEgMT47CisJCXFjb20sbWVtMiA9IDwwIDB4M2QwMCAyIDAgMSAwPjsKKwkJcWNvbSxwYWdlMyA9IDwxIDB4M2Q4QSAyIDB4NzBGNCAyIDE+OworCQlxY29tLHBhZ2VlbjMgPSA8MSAweDNkODEgMiAweDAxIDEgMTA+OworCQlxY29tLHBvbGwzID0gPDAgMHgwIDIgMCAxIDE+OworCQlxY29tLG1lbTMgPSA8MjI4IDB4NzAxMCAyIDAgMSAxPjsKKworCQljYW1fdmRpZy1zdXBwbHkgPSA8JnBtODIyNl9sNT47CisJCWNhbV92YW5hLXN1cHBseSA9IDwmcG04MjI2X2wxOT47CisJCWNhbV92aW8tc3VwcGx5ID0gPCZwbTgyMjZfbHZzMT47CisJCXFjb20sY2FtLXZyZWctbmFtZSA9ICJjYW1fdmRpZyIsImNhbV92YW5hIiwgImNhbV92aW8iOworCQlxY29tLGNhbS12cmVnLXR5cGUgPSA8MCAxIDI+OworCQlxY29tLGNhbS12cmVnLW1pbi12b2x0YWdlID0gPDEyMDAwMDAgMjg1MDAwMCAwPjsKKwkJcWNvbSxjYW0tdnJlZy1tYXgtdm9sdGFnZSA9IDwxMjAwMDAwIDI4NTAwMDAgMD47CisJCXFjb20sY2FtLXZyZWctb3AtbW9kZSA9IDwyMDAwMDAgODAwMDAgMD47CisJCXFjb20sZ3Bpby1uby1tdXggPSA8MD47CisJCWdwaW9zID0gPCZtc21ncGlvIDI2IDA+LAorCQkgICAgICAgIDwmbXNtZ3BpbyAzNyAwPiwKKwkJICAgICAgICA8Jm1zbWdwaW8gMzYgMD47CisJCXFjb20sZ3Bpby1yZXNldCA9IDwxPjsKKwkJcWNvbSxncGlvLXN0YW5kYnkgPSA8Mj47CisJCXFjb20sZ3Bpby1yZXEtdGJsLW51bSA9IDwwIDEgMj47CisJCXFjb20sZ3Bpby1yZXEtdGJsLWZsYWdzID0gPDEgMCAwPjsKKwkJcWNvbSxncGlvLXJlcS10YmwtbGFiZWwgPSAiQ0FNSUZfTUNMSyIsCisJCSAgICAgICAgIkNBTV9SRVNFVDEiLAorCQkgICAgICAgICJDQU1fU1RBTkRCWSI7CisJCXFjb20sY2FtLXBvd2VyLXNlcS10eXBlID0gInNlbnNvcl92cmVnIiwic2Vuc29yX3ZyZWciLAorCQkgICAgICAgICJzZW5zb3JfdnJlZyIsICJzZW5zb3JfY2xrIiwKKwkJICAgICAgICAic2Vuc29yX2dwaW8iLCAic2Vuc29yX2dwaW8iOworCQlxY29tLGNhbS1wb3dlci1zZXEtdmFsID0gImNhbV92ZGlnIiwiY2FtX3ZhbmEiLAorCQkgICAgICAgICJjYW1fdmlvIiwgInNlbnNvcl9jYW1fbWNsayIsCisJCSAgICAgICAgInNlbnNvcl9ncGlvX3Jlc2V0IiwKKwkJICAgICAgICAic2Vuc29yX2dwaW9fc3RhbmRieSI7CisJCXFjb20sY2FtLXBvd2VyLXNlcS1jZmctdmFsID0gPDEgMSAxIDI0MDAwMDAwIDEgMT47CisJCXFjb20sY2FtLXBvd2VyLXNlcS1kZWxheSA9IDwxIDEgMSA1IDUgMTA+OworCX07CisKIAlxY29tLGNhbWVyYUAyMCB7CiAJCWNvbXBhdGlibGUgPSAib3Z0aSxvdjg4NjUiOwogCQlyZWcgPSA8MHgyMD47CkBAIC0zOSw2ICsxNTUsNyBAQAogCQlxY29tLGNzaWQtc2QtaW5kZXggPSA8MD47CiAJCXFjb20sYWN0dWF0b3Itc3JjID0gPCZhY3R1YXRvcjA+OwogCQlxY29tLGxlZC1mbGFzaC1zcmMgPSA8JmxlZF9mbGFzaDA+OworCQlxY29tLGVlcHJvbS1zcmMgPSA8JmVlcHJvbTM+OwogCQlxY29tLG1vdW50LWFuZ2xlID0gPDkwPjsKIAkJcWNvbSxzZW5zb3ItbmFtZSA9ICJvdjg4NjVfcTh2MThhIjsKIAkJY2FtX3ZkaWctc3VwcGx5ID0gPCZwbTgyMjZfbDU+OwpAQCAtNzgsMTYgKzE5NSwxNiBAQAogCQlxY29tLHNsYXZlLWlkID0gPDB4NmMgMHgzMDBhIDB4NTY0OD47CiAJCXFjb20sY3NpcGh5LXNkLWluZGV4ID0gPDE+OwogCQlxY29tLGNzaWQtc2QtaW5kZXggPSA8MT47CisJCXFjb20sZWVwcm9tLXNyYyA9IDwmZWVwcm9tMj47CiAJCXFjb20sbW91bnQtYW5nbGUgPSA8MjcwPjsKIAkJcWNvbSxzZW5zb3ItbmFtZSA9ICJvdjU2NDhfb3R5NWYwMyI7Ci0JCWNhbV92ZGlnLXN1cHBseSA9IDwmcG04MjI2X2w1PjsKIAkJY2FtX3ZhbmEtc3VwcGx5ID0gPCZwbTgyMjZfbDE5PjsKIAkJY2FtX3Zpby1zdXBwbHkgPSA8JnBtODIyNl9sdnMxPjsKLQkJcWNvbSxjYW0tdnJlZy1uYW1lID0gImNhbV92ZGlnIiwgImNhbV92aW8iLCAiY2FtX3ZhbmEiOwotCQlxY29tLGNhbS12cmVnLXR5cGUgPSA8MCAxIDA+OwotCQlxY29tLGNhbS12cmVnLW1pbi12b2x0YWdlID0gPDEyMDAwMDAgMCAyODUwMDAwPjsKLQkJcWNvbSxjYW0tdnJlZy1tYXgtdm9sdGFnZSA9IDwxMjAwMDAwIDAgMjg1MDAwMD47Ci0JCXFjb20sY2FtLXZyZWctb3AtbW9kZSA9IDwyMDAwMDAgMCA4MDAwMD47CisJCXFjb20sY2FtLXZyZWctbmFtZSA9ICJjYW1fdmlvIiwgImNhbV92YW5hIjsKKwkJcWNvbSxjYW0tdnJlZy10eXBlID0gPDEgMD47CisJCXFjb20sY2FtLXZyZWctbWluLXZvbHRhZ2UgPSA8MCAyODUwMDAwPjsKKwkJcWNvbSxjYW0tdnJlZy1tYXgtdm9sdGFnZSA9IDwwIDI4NTAwMDA+OworCQlxY29tLGNhbS12cmVnLW9wLW1vZGUgPSA8MCA4MDAwMD47CiAJCXFjb20sZ3Bpby1uby1tdXggPSA8MD47CiAJCWdwaW9zID0gPCZtc21ncGlvIDI2IDA+LAogCQkJCTwmbXNtZ3BpbyAyOCAwPiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5NzQtY2FtZXJhLXNlbnNvci1mbHVpZC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODk3NC1jYW1lcmEtc2Vuc29yLWZsdWlkLmR0c2kKaW5kZXggYzg0ZGZlNS4uMDdlYjMxMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODk3NC1jYW1lcmEtc2Vuc29yLWZsdWlkLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODk3NC1jYW1lcmEtc2Vuc29yLWZsdWlkLmR0c2kKQEAgLTExLDYgKzExLDE2IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKKyZzb2MgeworCWxlZF9mbGFzaDA6IHFjb20sY2FtZXJhLWxlZC1mbGFzaCB7CisJCWNlbGwtaW5kZXggPSA8MD47CisJCWNvbXBhdGlibGUgPSAicWNvbSxjYW1lcmEtbGVkLWZsYXNoIjsKKwkJcWNvbSxmbGFzaC10eXBlID0gPDE+OworCQlxY29tLGZsYXNoLXNvdXJjZSA9IDwmcG04OTQxX2ZsYXNoMCAmcG04OTQxX2ZsYXNoMT47CisJCXFjb20sdG9yY2gtc291cmNlID0gPCZwbTg5NDFfdG9yY2g+OworCX07Cit9OworCiAmY2NpIHsKIAogCWFjdHVhdG9yMDogcWNvbSxhY3R1YXRvckAxOCB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9tc204OTc0LWNhbWVyYS1zZW5zb3ItbXRwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9tc204OTc0LWNhbWVyYS1zZW5zb3ItbXRwLmR0c2kKaW5kZXggMDJkMjI4OC4uOWQ0NGJkYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODk3NC1jYW1lcmEtc2Vuc29yLW10cC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5NzQtY2FtZXJhLXNlbnNvci1tdHAuZHRzaQpAQCAtMTEsNiArMTEsMTUgQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAorJnNvYyB7CisJbGVkX2ZsYXNoMDogcWNvbSxjYW1lcmEtbGVkLWZsYXNoIHsKKwkJY2VsbC1pbmRleCA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGNhbWVyYS1sZWQtZmxhc2giOworCQlxY29tLGZsYXNoLXR5cGUgPSA8MT47CisJCXFjb20sZmxhc2gtc291cmNlID0gPCZwbTg5NDFfZmxhc2gwICZwbTg5NDFfZmxhc2gxPjsKKwl9OworfTsKKwogJmNjaSB7CiAKIAlhY3R1YXRvcjA6IHFjb20sYWN0dWF0b3JAMTggewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODk3NC1jYW1lcmEuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5NzQtY2FtZXJhLmR0c2kKaW5kZXggNjEwZjIzNy4uMjg3OTlhYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODk3NC1jYW1lcmEuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9tc204OTc0LWNhbWVyYS5kdHNpCkBAIC0xNzYsMTQgKzE3Niw2IEBACiAJCXZkZC1zdXBwbHkgPSA8Jmdkc2NfdmZlPjsKIAl9OwogCi0JbGVkX2ZsYXNoMDogcWNvbSxjYW1lcmEtbGVkLWZsYXNoIHsKLQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJY29tcGF0aWJsZSA9ICJxY29tLGNhbWVyYS1sZWQtZmxhc2giOwotCQlxY29tLGZsYXNoLXR5cGUgPSA8MT47Ci0JCXFjb20sZmxhc2gtc291cmNlID0gPCZwbTg5NDFfZmxhc2gwICZwbTg5NDFfZmxhc2gxPjsKLQkJcWNvbSx0b3JjaC1zb3VyY2UgPSA8JnBtODk0MV90b3JjaD47Ci0JfTsKLQogCWNjaTogcWNvbSxjY2lAZmRhMEMwMDAgewogCQljZWxsLWluZGV4ID0gPDA+OwogCQljb21wYXRpYmxlID0gInFjb20sY2NpIjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5NzQtY29yZXNpZ2h0LmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9tc204OTc0LWNvcmVzaWdodC5kdHNpCmluZGV4IGE4MDljMmIuLmI3ZTY0YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5NzQtY29yZXNpZ2h0LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODk3NC1jb3Jlc2lnaHQuZHRzaQpAQCAtMjE5LDEyICsyMTksNTcgQEAKIAkJcWNvbSxyb3VuZC1yb2JpbjsKIAl9OwogCisJYXVkaW9fZXRtMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxjb3Jlc2lnaHQtYXVkaW8tZXRtIjsKKworCQljb3Jlc2lnaHQtaWQgPSA8MTQ+OworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtYXVkaW8tZXRtMCI7CisJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OworCQljb3Jlc2lnaHQtb3V0cG9ydHMgPSA8MD47CisJCWNvcmVzaWdodC1jaGlsZC1saXN0ID0gPCZmdW5uZWxfaW4wPjsKKwkJY29yZXNpZ2h0LWNoaWxkLXBvcnRzID0gPDI+OworCX07CisKKwltb2RlbV9ldG0wIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGNvcmVzaWdodC1tb2RlbS1ldG0iOworCisJCWNvcmVzaWdodC1pZCA9IDwxNT47CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1tb2RlbS1ldG0wIjsKKwkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CisJCWNvcmVzaWdodC1vdXRwb3J0cyA9IDwwPjsKKwkJY29yZXNpZ2h0LWNoaWxkLWxpc3QgPSA8JmZ1bm5lbF9pbjA+OworCQljb3Jlc2lnaHQtY2hpbGQtcG9ydHMgPSA8MT47CisJfTsKKworCXdjbl9ldG0wIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGNvcmVzaWdodC13Y24tZXRtIjsKKworCQljb3Jlc2lnaHQtaWQgPSA8MTY+OworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtd2NuLWV0bTAiOworCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKKwkJY29yZXNpZ2h0LW91dHBvcnRzID0gPDA+OworCQljb3Jlc2lnaHQtY2hpbGQtbGlzdCA9IDwmZnVubmVsX2luMT47CisJCWNvcmVzaWdodC1jaGlsZC1wb3J0cyA9IDwyPjsKKwl9OworCisJcnBtX2V0bTAgeworCQljb21wYXRpYmxlID0gInFjb20sY29yZXNpZ2h0LXJwbS1ldG0iOworCisJCWNvcmVzaWdodC1pZCA9IDwxNz47CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1ycG0tZXRtMCI7CisJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OworCQljb3Jlc2lnaHQtb3V0cG9ydHMgPSA8MD47CisJCWNvcmVzaWdodC1jaGlsZC1saXN0ID0gPCZmdW5uZWxfaW4wPjsKKwkJY29yZXNpZ2h0LWNoaWxkLXBvcnRzID0gPDA+OworCX07CisKKwogCWNzcjogY3NyQGZjMzAyMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJxY29tLGNvcmVzaWdodC1jc3IiOwogCQlyZWcgPSA8MHhmYzMwMjAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3NyLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwxND47CisJCWNvcmVzaWdodC1pZCA9IDwxOD47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jc3IiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIApAQCAtMjM2LDcgKzI4MSw3IEBACiAJCXJlZyA9IDwweGZjMzA4MDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDE1PjsKKwkJY29yZXNpZ2h0LWlkID0gPDE5PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTAiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjQ2LDcgKzI5MSw3IEBACiAJCXJlZyA9IDwweGZjMzA5MDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDE2PjsKKwkJY29yZXNpZ2h0LWlkID0gPDIwPjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTEiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjU2LDcgKzMwMSw3IEBACiAJCXJlZyA9IDwweGZjMzBhMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDE3PjsKKwkJY29yZXNpZ2h0LWlkID0gPDIxPjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTIiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjY2LDcgKzMxMSw3IEBACiAJCXJlZyA9IDwweGZjMzBiMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDE4PjsKKwkJY29yZXNpZ2h0LWlkID0gPDIyPjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTMiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjc2LDcgKzMyMSw3IEBACiAJCXJlZyA9IDwweGZjMzBjMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDE5PjsKKwkJY29yZXNpZ2h0LWlkID0gPDIzPjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTQiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjg2LDcgKzMzMSw3IEBACiAJCXJlZyA9IDwweGZjMzBkMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDIwPjsKKwkJY29yZXNpZ2h0LWlkID0gPDI0PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTUiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjk2LDcgKzM0MSw3IEBACiAJCXJlZyA9IDwweGZjMzBlMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDIxPjsKKwkJY29yZXNpZ2h0LWlkID0gPDI1PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTYiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMzA2LDcgKzM1MSw3IEBACiAJCXJlZyA9IDwweGZjMzBmMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDIyPjsKKwkJY29yZXNpZ2h0LWlkID0gPDI2PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTciOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMzE2LDcgKzM2MSw3IEBACiAJCXJlZyA9IDwweGZjMzEwMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDIzPjsKKwkJY29yZXNpZ2h0LWlkID0gPDI3PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTgiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMzI2LDcgKzM3MSw3IEBACiAJCXJlZyA9IDwweGZjMzQwMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDI0PjsKKwkJY29yZXNpZ2h0LWlkID0gPDI4PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS1sMiI7CiAJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OwogCX07CkBAIC0zMzYsNyArMzgxLDcgQEAKIAkJcmVnID0gPDB4ZmMzNDEwMDAgMHgxMDAwPjsKIAkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKIAotCQljb3Jlc2lnaHQtaWQgPSA8MjU+OworCQljb3Jlc2lnaHQtaWQgPSA8Mjk+OwogCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLWNwdTAiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMzQ2LDcgKzM5MSw3IEBACiAJCXJlZyA9IDwweGZjMzQyMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDI2PjsKKwkJY29yZXNpZ2h0LWlkID0gPDMwPjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS1jcHUxIjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAJfTsKQEAgLTM1Niw3ICs0MDEsNyBAQAogCQlyZWcgPSA8MHhmYzM0MzAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwyNz47CisJCWNvcmVzaWdodC1pZCA9IDwzMT47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktY3B1MiI7CiAJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OwogCX07CkBAIC0zNjYsMTEgKzQxMSw2MSBAQAogCQlyZWcgPSA8MHhmYzM0NDAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwyOD47CisJCWNvcmVzaWdodC1pZCA9IDwzMj47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktY3B1MyI7CiAJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OwogCX07CiAKKwljdGlfdmlkZW9fY3B1MDogY3RpQGZjMzQ4MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sY29yZXNpZ2h0LWN0aSI7CisJCXJlZyA9IDwweGZjMzQ4MDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LWlkID0gPDMzPjsKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS12aWRlby1jcHUwIjsKKwkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CisJfTsKKworCWN0aV93Y25fY3B1MDogY3RpQGZjMzRkMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sY29yZXNpZ2h0LWN0aSI7CisJCXJlZyA9IDwweGZjMzRkMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LWlkID0gPDM0PjsKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS13Y24tY3B1MCI7CisJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OworCX07CisKKwljdGlfbW9kZW1fY3B1MDogY3RpQGZjMzUwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sY29yZXNpZ2h0LWN0aSI7CisJCXJlZyA9IDwweGZjMzUwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LWlkID0gPDM1PjsKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS1tb2RlbS1jcHUwIjsKKwkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CisJfTsKKworCWN0aV9hdWRpb19jcHUwOiBjdGlAZmMzNTQwMDAgeworCQljb21wYXRpYmxlID0gImFybSxjb3Jlc2lnaHQtY3RpIjsKKwkJcmVnID0gPDB4ZmMzNTQwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtaWQgPSA8MzY+OworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLWF1ZGlvLWNwdTAiOworCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKKwl9OworCisJY3RpX3JwbV9jcHUwOiBjdGlAZmMzNTgwMDAgeworCQljb21wYXRpYmxlID0gImFybSxjb3Jlc2lnaHQtY3RpIjsKKwkJcmVnID0gPDB4ZmMzNTgwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtaWQgPSA8Mzc+OworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLXJwbS1jcHUwIjsKKwkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CisJfTsKKwogCWh3ZXZlbnQ6IGh3ZXZlbnRAZmRmMzAwMTggewogCQljb21wYXRpYmxlID0gInFjb20sY29yZXNpZ2h0LWh3ZXZlbnQiOwogCQlyZWcgPSA8MHhmZGYzMDAxOCAweDgwPiwKQEAgLTM3OSw3ICs0NzQsNyBAQAogCQkgICAgICA8MHhmYzQwMTYwMCAweDgwPjsKIAkJcmVnLW5hbWVzID0gIm1tc3MtbXV4IiwgImFwY3MtbXV4IiwgInBwc3MtbXV4IiwgImdjYy1tdXgiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwyOT47CisJCWNvcmVzaWdodC1pZCA9IDwzOD47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1od2V2ZW50IjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAKQEAgLTM5MSw3ICs0ODYsNyBAQAogCQlyZWcgPSA8MHhmYzRiZTAyNCAweDg+OwogCQlyZWctbmFtZXMgPSAiZnVzZS1iYXNlIjsKIAotCQljb3Jlc2lnaHQtaWQgPSA8MzA+OworCQljb3Jlc2lnaHQtaWQgPSA8Mzk+OwogCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtZnVzZSI7CiAJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OwogCX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9tc204OTc0LWZsdWlkLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9tc204OTc0LWZsdWlkLmR0c2kKaW5kZXggYzExMmJlYS4uZDBjYTAxZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODk3NC1mbHVpZC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5NzQtZmx1aWQuZHRzaQpAQCAtMzAsNiArMzAsNyBAQAogCiAJcWNvbSxtZHNzX21kcEBmZDkwMDAwMCB7CiAJCXFjb20sbWRzcy1wcmVmLXByaW0taW50ZiA9ICJkc2kiOworCQliYXRmZXQtc3VwcGx5ID0gPCZwbTg5NDFfY2hnX2JhdGlmPjsKIAl9OwogCiAJcWNvbSxoZG1pX3R4QGZkOTIyMTAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5NzQtbGlxdWlkLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9tc204OTc0LWxpcXVpZC5kdHNpCmluZGV4IDY3ZTE4MDIuLmJhMDg1YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5NzQtbGlxdWlkLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODk3NC1saXF1aWQuZHRzaQpAQCAtMjYsNiArMjYsOCBAQAogCiAgICAgICAgIHFjb20sbWRzc19tZHBAZmQ5MDAwMDAgewogICAgICAgICAgICAgICAgIHFjb20sbWRzcy1wcmVmLXByaW0taW50ZiA9ICJlZHAiOworCQlxY29tLHBhbmVsLWxwZy1jaGFubmVsID0gPDc+OyAvKiBMUEcgQ2hhbm5lbCA4ICovCisJCXFjb20scGFuZWwtcHdtLXBlcmlvZCA9IDw1Mz47CiAgICAgICAgIH07CiAKIAlpMmNAZjk5NjcwMDAgewpAQCAtMjE0LDcgKzIxNiw3IEBACiAJCQkJCS8qIE9iamVjdCA2LCBJbnN0YW5jZSA9IDAgKi8KIAkJCQkJMDAgMDAgMDAgMDAgMDAgMDAKIAkJCQkJLyogT2JqZWN0IDM4LCBJbnN0YW5jZSA9IDAgKi8KLQkJCQkJMTkgMDMgMDAgMUUgMDUgMEQgMDAgMDAgMDAgMDAKKwkJCQkJMTkgMDQgMDAgMDcgMDggMEQgMDAgMDAgMDAgMDAKIAkJCQkJMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKIAkJCQkJMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKIAkJCQkJMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKQEAgLTI0MCw3ICsyNDIsNyBAQAogCQkJCQkwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAogCQkJCQkvKiBPYmplY3QgMjUsIEluc3RhbmNlID0gMCAqLwogCQkJCQkwMCAwMCA1NCA2RiBGMCA1NSAwMCAwMCAwMCAwMAotCQkJCQkwMCAwMCAwMCAwMCAwMAorCQkJCQkwMCAwMCAwMCAwMCAwQwogCQkJCQkvKiBPYmplY3QgMjcsIEluc3RhbmNlID0gMCAqLwogCQkJCQkwMCAwMCAwMCAwMCAwMCAwMCAwMAogCQkJCQkvKiBPYmplY3QgNDAsIEluc3RhbmNlID0gMCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODk3NC1tZHNzLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9tc204OTc0LW1kc3MuZHRzaQppbmRleCA2ZDUwMDBmLi5jODY2ZGU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9tc204OTc0LW1kc3MuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9tc204OTc0LW1kc3MuZHRzaQpAQCAtMTg3LDkgKzE4Nyw2IEBACiAJCXJlZy1uYW1lcyA9ICJlZHBfYmFzZSIsICJtbXNzX2NjX2Jhc2UiOwogCQl2ZGRhLXN1cHBseSA9IDwmcG04OTQxX2wxMj47CiAJCWdwaW8tcGFuZWwtZW4gPSA8Jm1zbWdwaW8gNTggMD47Ci0JCWdwaW8tcGFuZWwtcHdtID0gPCZwbTg5NDFfZ3Bpb3MgMzYgMD47Ci0JCXFjb20scGFuZWwtbHBnLWNoYW5uZWwgPSA8Nz47IC8qIExQRyBDaGFubmVsIDggKi8KLQkJcWNvbSxwYW5lbC1wd20tcGVyaW9kID0gPDUzPjsKIAkJcWNvbSxtZHNzLWZiLW1hcCA9IDwmbWRzc19mYjA+OwogCQlncGlvLXBhbmVsLWhwZCA9IDwmbXNtZ3BpbyAxMDIgMD47CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5NzQtbXRwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9tc204OTc0LW10cC5kdHNpCmluZGV4IGI4OGZiZGMuLmY3M2JjZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5NzQtbXRwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODk3NC1tdHAuZHRzaQpAQCAtMzAsNiArMzAsNyBAQAogCiAJcWNvbSxtZHNzX21kcEBmZDkwMDAwMCB7CiAJCXFjb20sbWRzcy1wcmVmLXByaW0taW50ZiA9ICJkc2kiOworCQliYXRmZXQtc3VwcGx5ID0gPCZwbTg5NDFfY2hnX2JhdGlmPjsKIAl9OwogCiAJcWNvbSxoZG1pX3R4QGZkOTIyMTAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5NzQuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5NzQuZHRzaQppbmRleCBkMGRhMmNhLi4zOWZiMTA4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9tc204OTc0LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODk3NC5kdHNpCkBAIC02MDAsNyArNjAwLDcgQEAKIAkJI3NpemUtY2VsbHMgPSA8MD47CiAJCXJlZy1uYW1lcyA9ICJzcGlfcGh5c2ljYWwiLCAic3BpX2JhbV9waHlzaWNhbCI7CiAJCXJlZyA9IDwweGY5OTY2MDAwIDB4MTAwMD4sCi0JCSAgICAgIDwweGY5OTQ0MDAwIDB4MTUwMDA+OworCQkgICAgICA8MHhmOTk0NDAwMCAweDE5MDAwPjsKIAkJaW50ZXJydXB0LW5hbWVzID0gInNwaV9pcnEiLCAic3BpX2JhbV9pcnEiOwogCQlpbnRlcnJ1cHRzID0gPDAgMTA0IDA+LCA8MCAyMzkgMD47CiAJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDE5MjAwMDAwPjsKQEAgLTgwNCw3ICs4MDQsNyBAQAogCQlpbnRlcnJ1cHRzID0gPDAgMTA1IDA+OwogCQlpbnRlcnJ1cHQtbmFtZXMgPSAicXVwX2Vycl9pbnRyIjsKIAkJcWNvbSxpMmMtYnVzLWZyZXEgPSA8MTAwMDAwPjsKLQkJcWNvbSxpMmMtc3JjLWZyZXEgPSA8NTAwMDAwMDA+OworCQlxY29tLGkyYy1zcmMtZnJlcSA9IDwxOTIwMDAwMD47CiAJCXFjb20sbWFzdGVyLWlkID0gPDg0PjsKIAl9OwogCkBAIC04NDcsNyArODQ3LDcgQEAKIAkJI3NpemUtY2VsbHMgPSA8MD47CiAJCXJlZy1uYW1lcyA9ICJzcGlfcGh5c2ljYWwiLCAic3BpX2JhbV9waHlzaWNhbCI7CiAJCXJlZyA9IDwweGY5OTIzMDAwIDB4MTAwMD4sCi0JCSAgICAgIDwweGY5OTA0MDAwIDB4ZjAwMD47CisJCSAgICAgIDwweGY5OTA0MDAwIDB4MTkwMDA+OwogCQlpbnRlcnJ1cHQtbmFtZXMgPSAic3BpX2lycSIsICJzcGlfYmFtX2lycSI7CiAJCWludGVycnVwdHMgPSA8MCA5NSAwPiwgPDAgMjM4IDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDwxOTIwMDAwMD47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9tc204OTc0cHJvLWFjLXBtYTgwODQtcG04OTQxLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9tc204OTc0cHJvLWFjLXBtYTgwODQtcG04OTQxLmR0c2kKaW5kZXggNzQ2NzAyYi4uZGM0MzhiYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODk3NHByby1hYy1wbWE4MDg0LXBtODk0MS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5NzRwcm8tYWMtcG1hODA4NC1wbTg5NDEuZHRzaQpAQCAtMTA2LDYgKzEwNiw3IEBACiAJaW50ZXJydXB0LW1hcCA9IDwweDAgMCAmaW50YyAwIDEzMyAwCiAJCQkweDAgMSAmc3BtaV9idXMgMHgwIDB4MiAweDkgMHgwPjsKIAlpbnRlcnJ1cHQtbmFtZXMgPSAiaHNfcGh5X2lycSIsICJwbWljX2lkX2lycSI7CisJcWNvbSxkd2Mtc3NwaHktZGVlbXBoYXNpcy12YWx1ZSA9IDwyNj47CiB9OwogCiAvKiBDb3JyZWN0IFBNODk0MSBsb2NhbCBzbGF2ZSBJRCAwIHRvIHVzZSBnbG9iYWwgU0lEIDQgZm9yIGFsbCBpbnRlcnJ1cHRzLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODk3NHByby1wbWE4MDg0LW10cC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODk3NHByby1wbWE4MDg0LW10cC5kdHNpCmluZGV4IDI2ZmRlYmIuLmQ1YzExNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5NzRwcm8tcG1hODA4NC1tdHAuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9tc204OTc0cHJvLXBtYTgwODQtbXRwLmR0c2kKQEAgLTkyLDcgKzkyLDcgQEAKIAl2ZGQtc3VwcGx5ID0gPCZwbWE4MDg0X2wyMD47CiAJdmRkLWlvLXN1cHBseSA9IDwmcG1hODA4NF9zND47CiAKLQlxY29tLGNsay1yYXRlcyA9IDw0MDAwMDAgMjAwMDAwMDAgMjUwMDAwMDAgNTAwMDAwMDAgMTAwMDAwMDAwIDIwMDAwMDAwMCAzODQwMDAwMDA+OworCXFjb20sY2xrLXJhdGVzID0gPDQwMDAwMCAyMDAwMDAwMCAyNTAwMDAwMCA1MDAwMDAwMCAxMDAwMDAwMDAgMTkyMDAwMDAwIDM4NDAwMDAwMD47CiAJcWNvbSxidXMtc3BlZWQtbW9kZSA9ICJIUzQwMF8xcDh2IiwgIkhTMjAwXzFwOHYiLCAiRERSXzFwOHYiOwogCiAJcWNvbSxwYWQtcHVsbC1vbiA9IDwweDAgMHgzIDB4MyAweDE+OyAvKiBuby1wdWxsLCBwdWxsLXVwLCBwdWxsLXVwLCBwdWxsLWRvd24gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5NzRwcm8tcG1hODA4NC1yZWd1bGF0b3IuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTg5NzRwcm8tcG1hODA4NC1yZWd1bGF0b3IuZHRzaQppbmRleCBjMzhjOWUxLi5kZjAwZjhhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9tc204OTc0cHJvLXBtYTgwODQtcmVndWxhdG9yLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtODk3NHByby1wbWE4MDg0LXJlZ3VsYXRvci5kdHNpCkBAIC00ODAsNiArNDgwLDcgQEAKIAkJI3NpemUtY2VsbHMgPSA8MT47CiAJCXJhbmdlczsKIAkJcWNvbSxwZm0tdGhyZXNob2xkID0gPDc2PjsKKwkJcWNvbSx1c2UtcGhhc2Utc2NhbGluZy1mYWN0b3I7CiAKIAkJa3JhaXQwX3ZyZWc6IHJlZ3VsYXRvckBmOTA4ODAwMCB7CiAJCQljb21wYXRpYmxlID0gInFjb20sa3JhaXQtcmVndWxhdG9yIjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTk2MjUtY29yZXNpZ2h0LmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9tc205NjI1LWNvcmVzaWdodC5kdHNpCmluZGV4IDQ4ODBmOTYuLjA1ZDUyMzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL21zbTk2MjUtY29yZXNpZ2h0LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvbXNtOTYyNS1jb3Jlc2lnaHQuZHRzaQpAQCAtMTM1LDEyICsxMzUsNDUgQEAKIAkJcWNvbSxyb3VuZC1yb2JpbjsKIAl9OwogCisJYXVkaW9fZXRtMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxjb3Jlc2lnaHQtYXVkaW8tZXRtIjsKKworCQljb3Jlc2lnaHQtaWQgPSA8OT47CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1hdWRpby1ldG0wIjsKKwkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CisJCWNvcmVzaWdodC1vdXRwb3J0cyA9IDwwPjsKKwkJY29yZXNpZ2h0LWNoaWxkLWxpc3QgPSA8JmZ1bm5lbF9pbjA+OworCQljb3Jlc2lnaHQtY2hpbGQtcG9ydHMgPSA8Mj47CisJfTsKKworCW1vZGVtX2V0bTAgeworCQljb21wYXRpYmxlID0gInFjb20sY29yZXNpZ2h0LW1vZGVtLWV0bSI7CisKKwkJY29yZXNpZ2h0LWlkID0gPDEwPjsKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LW1vZGVtLWV0bTAiOworCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKKwkJY29yZXNpZ2h0LW91dHBvcnRzID0gPDA+OworCQljb3Jlc2lnaHQtY2hpbGQtbGlzdCA9IDwmZnVubmVsX2luMD47CisJCWNvcmVzaWdodC1jaGlsZC1wb3J0cyA9IDwxPjsKKwl9OworCisJcnBtX2V0bTAgeworCQljb21wYXRpYmxlID0gInFjb20sY29yZXNpZ2h0LXJwbS1ldG0iOworCisJCWNvcmVzaWdodC1pZCA9IDwxMT47CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1ycG0tZXRtMCI7CisJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OworCQljb3Jlc2lnaHQtb3V0cG9ydHMgPSA8MD47CisJCWNvcmVzaWdodC1jaGlsZC1saXN0ID0gPCZmdW5uZWxfaW4wPjsKKwkJY29yZXNpZ2h0LWNoaWxkLXBvcnRzID0gPDA+OworCX07CisKIAljc3I6IGNzckBmYzMwMjAwMCB7CiAJCWNvbXBhdGlibGUgPSAicWNvbSxjb3Jlc2lnaHQtY3NyIjsKIAkJcmVnID0gPDB4ZmMzMDIwMDAgMHgxMDAwPjsKIAkJcmVnLW5hbWVzID0gImNzci1iYXNlIjsKIAotCQljb3Jlc2lnaHQtaWQgPSA8OT47CisJCWNvcmVzaWdodC1pZCA9IDwxMj47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jc3IiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIApAQCAtMTUyLDcgKzE4NSw3IEBACiAJCXJlZyA9IDwweGZjMzA4MDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDEwPjsKKwkJY29yZXNpZ2h0LWlkID0gPDEzPjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTAiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMTYyLDcgKzE5NSw3IEBACiAJCXJlZyA9IDwweGZjMzA5MDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDExPjsKKwkJY29yZXNpZ2h0LWlkID0gPDE0PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTEiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMTcyLDcgKzIwNSw3IEBACiAJCXJlZyA9IDwweGZjMzBhMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDEyPjsKKwkJY29yZXNpZ2h0LWlkID0gPDE1PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTIiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMTgyLDcgKzIxNSw3IEBACiAJCXJlZyA9IDwweGZjMzBiMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDEzPjsKKwkJY29yZXNpZ2h0LWlkID0gPDE2PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTMiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMTkyLDcgKzIyNSw3IEBACiAJCXJlZyA9IDwweGZjMzBjMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDE0PjsKKwkJY29yZXNpZ2h0LWlkID0gPDE3PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTQiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjAyLDcgKzIzNSw3IEBACiAJCXJlZyA9IDwweGZjMzBkMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDE1PjsKKwkJY29yZXNpZ2h0LWlkID0gPDE4PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTUiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjEyLDcgKzI0NSw3IEBACiAJCXJlZyA9IDwweGZjMzBlMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDE2PjsKKwkJY29yZXNpZ2h0LWlkID0gPDE5PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTYiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjIyLDcgKzI1NSw3IEBACiAJCXJlZyA9IDwweGZjMzBmMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDE3PjsKKwkJY29yZXNpZ2h0LWlkID0gPDIwPjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTciOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjMyLDE4ICsyNjUsNDggQEAKIAkJcmVnID0gPDB4ZmMzMTAwMDAgMHgxMDAwPjsKIAkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKIAotCQljb3Jlc2lnaHQtaWQgPSA8MTg+OworCQljb3Jlc2lnaHQtaWQgPSA8MjE+OwogCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpOCI7CiAJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OwogCX07CiAKLQljdGlfY3B1OiBjdGlAZmMzMzMwMDAgeworCWN0aV9jcHUwOiBjdGlAZmMzMzMwMDAgewogCQljb21wYXRpYmxlID0gImFybSxjb3Jlc2lnaHQtY3RpIjsKIAkJcmVnID0gPDB4ZmMzMzMwMDAgMHgxMDAwPjsKIAkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKIAotCQljb3Jlc2lnaHQtaWQgPSA8MTk+OwotCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLWNwdSI7CisJCWNvcmVzaWdodC1pZCA9IDwyMj47CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktY3B1MCI7CisJCWNvcmVzaWdodC1uci1pbnBvcnRzID0gPDA+OworCX07CisKKwljdGlfbW9kZW1fY3B1MDogY3RpQGZjMzUwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sY29yZXNpZ2h0LWN0aSI7CisJCXJlZyA9IDwweGZjMzUwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LWlkID0gPDIzPjsKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS1tb2RlbS1jcHUwIjsKKwkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CisJfTsKKworCWN0aV9hdWRpb19jcHUwOiBjdGlAZmMzNTQwMDAgeworCQljb21wYXRpYmxlID0gImFybSxjb3Jlc2lnaHQtY3RpIjsKKwkJcmVnID0gPDB4ZmMzNTQwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtaWQgPSA8MjQ+OworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLWF1ZGlvLWNwdTAiOworCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKKwl9OworCisJY3RpX3JwbV9jcHUwOiBjdGlAZmMzNTgwMDAgeworCQljb21wYXRpYmxlID0gImFybSxjb3Jlc2lnaHQtY3RpIjsKKwkJcmVnID0gPDB4ZmMzNTgwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtaWQgPSA8MjU+OworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLXJwbS1jcHUwIjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAJfTsKIApAQCAtMjU0LDcgKzMxNyw3IEBACiAJCSAgICAgIDwweGZjNDAxNjAwIDB4ODA+OwogCQlyZWctbmFtZXMgPSAiYXBjcy1tdXgiLCAicHBzcy1tdXgiLCAiZ2NjLW11eCI7CiAKLQkJY29yZXNpZ2h0LWlkID0gPDIwPjsKKwkJY29yZXNpZ2h0LWlkID0gPDI2PjsKIAkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWh3ZXZlbnQiOwogCQljb3Jlc2lnaHQtbnItaW5wb3J0cyA9IDwwPjsKIAl9OwpAQCAtMjY0LDcgKzMyNyw3IEBACiAJCXJlZyA9IDwweGZjNGJlMDI0IDB4OD47CiAJCXJlZy1uYW1lcyA9ICJmdXNlLWJhc2UiOwogCi0JCWNvcmVzaWdodC1pZCA9IDwyMT47CisJCWNvcmVzaWdodC1pZCA9IDwyNz47CiAJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1mdXNlIjsKIAkJY29yZXNpZ2h0LW5yLWlucG9ydHMgPSA8MD47CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbXNtODIyNi1wZXJmX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXNtODIyNi1wZXJmX2RlZmNvbmZpZwppbmRleCAwM2VkNjFmLi4yNjUyMzRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL21zbTgyMjYtcGVyZl9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9tc204MjI2LXBlcmZfZGVmY29uZmlnCkBAIC02NSw3ICs2NSw2IEBACiBDT05GSUdfTVNNX09DTUVNPXkKIENPTkZJR19NU01fT0NNRU1fTE9DQUxfUE9XRVJfQ1RSTD15CiBDT05GSUdfTVNNX09DTUVNX0RFQlVHPXkKLUNPTkZJR19NU01fT0NNRU1fTk9OU0VDVVJFPXkKIENPTkZJR19NU01fT0NNRU1fUE9XRVJfRElTQUJMRT15CiBDT05GSUdfU0VOU09SU19BRFNQPXkKIENPTkZJR19NU01fUlRCPXkKQEAgLTI0Miw2ICsyNDEsOSBAQAogQ09ORklHX1BQUE9FPXkKIENPTkZJR19QUFBfQVNZTkM9eQogQ09ORklHX1BQUF9TWU5DX1RUWT15CitDT05GSUdfUFBQT0xBQz15CitDT05GSUdfUFBQT1BOUz15CitDT05GSUdfUFBQX01QUEU9eQogQ09ORklHX1VTQl9VU0JORVQ9eQogQ09ORklHX1dDTlNTX0NPUkU9eQogQ09ORklHX1dDTlNTX0NPUkVfUFJPTlRPPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbXNtODIyNl9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL21zbTgyMjZfZGVmY29uZmlnCmluZGV4IGY5NTNhNzAuLjU1NjI3YTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbXNtODIyNl9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9tc204MjI2X2RlZmNvbmZpZwpAQCAtNjUsNyArNjUsNiBAQAogQ09ORklHX01TTV9PQ01FTT15CiBDT05GSUdfTVNNX09DTUVNX0xPQ0FMX1BPV0VSX0NUUkw9eQogQ09ORklHX01TTV9PQ01FTV9ERUJVRz15Ci1DT05GSUdfTVNNX09DTUVNX05PTlNFQ1VSRT15CiBDT05GSUdfTVNNX09DTUVNX1BPV0VSX0RJU0FCTEU9eQogQ09ORklHX1NFTlNPUlNfQURTUD15CiBDT05GSUdfTVNNX1JUQj15CkBAIC0yNDQsNiArMjQzLDkgQEAKIENPTkZJR19QUFBPRT15CiBDT05GSUdfUFBQX0FTWU5DPXkKIENPTkZJR19QUFBfU1lOQ19UVFk9eQorQ09ORklHX1BQUE9MQUM9eQorQ09ORklHX1BQUE9QTlM9eQorQ09ORklHX1BQUF9NUFBFPXkKIENPTkZJR19VU0JfVVNCTkVUPXkKIENPTkZJR19XQ05TU19DT1JFPXkKIENPTkZJR19XQ05TU19DT1JFX1BST05UTz15CkBAIC00NDMsNiArNDQ1LDEwIEBACiBDT05GSUdfQ09SRVNJR0hUX1NUTT15CiBDT05GSUdfQ09SRVNJR0hUX0hXRVZFTlQ9eQogQ09ORklHX0NPUkVTSUdIVF9FVE09eQorQ09ORklHX0NPUkVTSUdIVF9BVURJT19FVE09eQorQ09ORklHX0NPUkVTSUdIVF9NT0RFTV9FVE09eQorQ09ORklHX0NPUkVTSUdIVF9XQ05fRVRNPXkKK0NPTkZJR19DT1JFU0lHSFRfUlBNX0VUTT15CiBDT05GSUdfQ09SRVNJR0hUX0VWRU5UPW0KIENPTkZJR19FWFQyX0ZTPXkKIENPTkZJR19FWFQyX0ZTX1hBVFRSPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbXNtODYxMC1wZXJmX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXNtODYxMC1wZXJmX2RlZmNvbmZpZwppbmRleCAzMjVhYmExLi43ZWExYmQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL21zbTg2MTAtcGVyZl9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9tc204NjEwLXBlcmZfZGVmY29uZmlnCkBAIC04MSw2ICs4MSw3IEBACiBDT05GSUdfQUVBQkk9eQogQ09ORklHX0hJR0hNRU09eQogQ09ORklHX0NPTVBBQ1RJT049eQorQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SPXkKIENPTkZJR19DUF9BQ0NFU1M9eQogQ09ORklHX1VTRV9PRj15CiBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRT15CkBAIC0zNDksNiArMzUwLDcgQEAKIENPTkZJR19NTUNfTVNNX1NQU19TVVBQT1JUPXkKIENPTkZJR19MRURTX1FQTlA9eQogQ09ORklHX0xFRFNfVFJJR0dFUlM9eQorQ09ORklHX0xFRFNfR1BJTz15CiBDT05GSUdfU1dJVENIPXkKIENPTkZJR19SVENfQ0xBU1M9eQogIyBDT05GSUdfUlRDX0RSVl9NU00gaXMgbm90IHNldApAQCAtNDA2LDYgKzQwOCw5IEBACiBDT05GSUdfUFBQX0RFRkxBVEU9eQogQ09ORklHX1BQUF9CU0RDT01QPXkKIENPTkZJR19QUFBPRT15CitDT05GSUdfUFBQT0xBQz15CitDT05GSUdfUFBQT1BOUz15CitDT05GSUdfUFBQX01QUEU9eQogQ09ORklHX05fSERMQz15CiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0lOUFVUX0tYVEo5PXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbXNtODYxMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL21zbTg2MTBfZGVmY29uZmlnCmluZGV4IDJjNTM2M2QuLjhlNmY1ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbXNtODYxMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9tc204NjEwX2RlZmNvbmZpZwpAQCAtODIsNiArODIsNyBAQAogQ09ORklHX0FFQUJJPXkKIENPTkZJR19ISUdITUVNPXkKIENPTkZJR19DT01QQUNUSU9OPXkKK0NPTkZJR19DQ19TVEFDS1BST1RFQ1RPUj15CiBDT05GSUdfQ1BfQUNDRVNTPXkKIENPTkZJR19VU0VfT0Y9eQogQ09ORklHX0NQVV9GUkVRX0dPVl9QT1dFUlNBVkU9eQpAQCAtMzcyLDYgKzM3Myw3IEBACiBDT05GSUdfTEVEU19RUE5QPXkKIENPTkZJR19MRURTX01TTV9HUElPX0ZMQVNIPXkKIENPTkZJR19MRURTX1RSSUdHRVJTPXkKK0NPTkZJR19MRURTX0dQSU89eQogQ09ORklHX1NXSVRDSD15CiBDT05GSUdfUlRDX0NMQVNTPXkKICMgQ09ORklHX1JUQ19EUlZfTVNNIGlzIG5vdCBzZXQKQEAgLTQwMSw2ICs0MDMsMTAgQEAKIENPTkZJR19DT1JFU0lHSFRfU1RNPXkKIENPTkZJR19DT1JFU0lHSFRfSFdFVkVOVD15CiBDT05GSUdfQ09SRVNJR0hUX0VUTT15CitDT05GSUdfQ09SRVNJR0hUX0FVRElPX0VUTT15CitDT05GSUdfQ09SRVNJR0hUX01PREVNX0VUTT15CitDT05GSUdfQ09SRVNJR0hUX1dDTl9FVE09eQorQ09ORklHX0NPUkVTSUdIVF9SUE1fRVRNPXkKIENPTkZJR19DT1JFU0lHSFRfRVZFTlQ9bQogQ09ORklHX0VYVDJfRlM9eQogQ09ORklHX0VYVDJfRlNfWEFUVFI9eQpAQCAtNDU2LDYgKzQ2Miw5IEBACiBDT05GSUdfUFBQX0RFRkxBVEU9eQogQ09ORklHX1BQUF9CU0RDT01QPXkKIENPTkZJR19QUFBPRT15CitDT05GSUdfUFBQT0xBQz15CitDT05GSUdfUFBQT1BOUz15CitDT05GSUdfUFBQX01QUEU9eQogQ09ORklHX05fSERMQz15CiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0lOUFVUX0tYVEo5PXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvbXNtODk3NF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL21zbTg5NzRfZGVmY29uZmlnCmluZGV4IGIyNmEwMjguLjhmNmY1MmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbXNtODk3NF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9tc204OTc0X2RlZmNvbmZpZwpAQCAtNDc1LDYgKzQ3NSwxMCBAQAogQ09ORklHX0NPUkVTSUdIVF9IV0VWRU5UPXkKIENPTkZJR19DT1JFU0lHSFRfRVRNPXkKIENPTkZJR19DT1JFU0lHSFRfRVRNX1BDU0FWRV9ERUZBVUxUX0VOQUJMRT15CitDT05GSUdfQ09SRVNJR0hUX0FVRElPX0VUTT15CitDT05GSUdfQ09SRVNJR0hUX01PREVNX0VUTT15CitDT05GSUdfQ09SRVNJR0hUX1dDTl9FVE09eQorQ09ORklHX0NPUkVTSUdIVF9SUE1fRVRNPXkKIENPTkZJR19DT1JFU0lHSFRfRVZFTlQ9bQogQ09ORklHX0JJRj15CiBDT05GSUdfQklGX1FQTlA9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9tc205NjI1X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvbXNtOTYyNV9kZWZjb25maWcKaW5kZXggM2YzNDY5MC4uZDY4MTFkZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9tc205NjI1X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL21zbTk2MjVfZGVmY29uZmlnCkBAIC0yOTUsNiArMjk1LDkgQEAKIENPTkZJR19DT1JFU0lHSFRfU1RNPXkKIENPTkZJR19DT1JFU0lHSFRfSFdFVkVOVD15CiBDT05GSUdfQ09SRVNJR0hUX0VUTT15CitDT05GSUdfQ09SRVNJR0hUX0FVRElPX0VUTT15CitDT05GSUdfQ09SRVNJR0hUX01PREVNX0VUTT15CitDT05GSUdfQ09SRVNJR0hUX1JQTV9FVE09eQogQ09ORklHX0NPUkVTSUdIVF9FVkVOVD1tCiBDT05GSUdfRVhUM19GUz15CiBDT05GSUdfVkZBVF9GUz15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvYXJjaF90aW1lci5jIGIvYXJjaC9hcm0va2VybmVsL2FyY2hfdGltZXIuYwppbmRleCA5ZTI3NTkyLi45MmU0ZjE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYXJjaF90aW1lci5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9hcmNoX3RpbWVyLmMKQEAgLTM1Nyw3ICszNTcsNyBAQAogCS5yYXRpbmcJPSA0MDAsCiAJLnJlYWQJPSBhcmNoX2NvdW50ZXJfcmVhZCwKIAkubWFzawk9IENMT0NLU09VUkNFX01BU0soNTYpLAotCS5mbGFncwk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAorCS5mbGFncwk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTIHwgQ0xPQ0tfU09VUkNFX1NVU1BFTkRfTk9OU1RPUCwKIH07CiAKIHN0YXRpYyB1MzIgYXJjaF9jb3VudGVyX2dldF9jbnR2Y3QzMih2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW1zbS9NYWtlZmlsZQppbmRleCBkZDUzM2Y0Li5jNDRkYmM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9NYWtlZmlsZQpAQCAtMTU1LDEwICsxNTUsNyBAQAogb2JqLSQoQ09ORklHX01TTV9EQUxSUENfVEVTVCkgKz0gZGFsX3JlbW90ZXRlc3Qubwogb2JqLSQoQ09ORklHX0FSQ0hfTVNNN1gzMCkgKz0gZGFsX2F4aS5vCiBvYmotJChDT05GSUdfQVJDSF9NU003WDI3QSkgKz0gZGFsX2F4aS5vCi1vYmotJChDT05GSUdfTVNNX0FEU1ApICs9IHFkc3A1Lwotb2JqLSQoQ09ORklHX01TTTdLVjJfQVVESU8pICs9IHFkc3A1djIvCiBvYmotJChDT05GSUdfTVNNX1JQQ1NFUlZFUl9IQU5EU0VUKSArPSBycGNfc2VydmVyX2hhbmRzZXQubwotb2JqLSQoQ09ORklHX01TTV9RRFNQNikgKz0gcWRzcDYvCiBvYmotJChDT05GSUdfTVNNOFg2MF9BVURJTykgKz0gcWRzcDZ2Mi8KIG9iai0kKENPTkZJR19NU01fQVVESU9fUURTUDYpICs9IHFkc3A2djIvCiBvYmotJChDT05GSUdfTVNNX0FVRElPX1FEU1A2VjIpICs9IHFkc3A2djIvCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9hY3B1Y2xvY2stODk3NC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vYWNwdWNsb2NrLTg5NzQuYwppbmRleCA2NjUzNGViLi42MGJlMjBhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9hY3B1Y2xvY2stODk3NC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2FjcHVjbG9jay04OTc0LmMKQEAgLTU1LDcgKzU1LDcgQEAKIAkJLmhmcGxsX3BoeXNfYmFzZSA9IDB4RjkwOEEwMDAsCiAJCS5sMmNwbXJfaWFkZHIgPSAweDQ1MDEsCiAJCS5zZWNfY2xrX3NlbCA9IDIsCi0JCS52cmVnW1ZSRUdfQ09SRV0gPSB7ICJrcmFpdDAiLCAgICAgMTEwMDAwMCB9LAorCQkudnJlZ1tWUkVHX0NPUkVdID0geyAia3JhaXQwIiwgICAgIDExMjAwMDAgfSwKIAkJLnZyZWdbVlJFR19NRU1dICA9IHsgImtyYWl0MF9tZW0iLCAxMDUwMDAwIH0sCiAJCS52cmVnW1ZSRUdfRElHXSAgPSB7ICJrcmFpdDBfZGlnIiwgTFZMX0hJR0ggfSwKIAkJLnZyZWdbVlJFR19IRlBMTF9BXSA9IHsgImtyYWl0MF9oZnBsbCIsIDE4MDAwMDAgfSwKQEAgLTY0LDcgKzY0LDcgQEAKIAkJLmhmcGxsX3BoeXNfYmFzZSA9IDB4RjkwOUEwMDAsCiAJCS5sMmNwbXJfaWFkZHIgPSAweDU1MDEsCiAJCS5zZWNfY2xrX3NlbCA9IDIsCi0JCS52cmVnW1ZSRUdfQ09SRV0gPSB7ICJrcmFpdDEiLCAgICAgMTEwMDAwMCB9LAorCQkudnJlZ1tWUkVHX0NPUkVdID0geyAia3JhaXQxIiwgICAgIDExMjAwMDAgfSwKIAkJLnZyZWdbVlJFR19NRU1dICA9IHsgImtyYWl0MV9tZW0iLCAxMDUwMDAwIH0sCiAJCS52cmVnW1ZSRUdfRElHXSAgPSB7ICJrcmFpdDFfZGlnIiwgTFZMX0hJR0ggfSwKIAkJLnZyZWdbVlJFR19IRlBMTF9BXSA9IHsgImtyYWl0MV9oZnBsbCIsIDE4MDAwMDAgfSwKQEAgLTczLDcgKzczLDcgQEAKIAkJLmhmcGxsX3BoeXNfYmFzZSA9IDB4RjkwQUEwMDAsCiAJCS5sMmNwbXJfaWFkZHIgPSAweDY1MDEsCiAJCS5zZWNfY2xrX3NlbCA9IDIsCi0JCS52cmVnW1ZSRUdfQ09SRV0gPSB7ICJrcmFpdDIiLCAgICAgMTEwMDAwMCB9LAorCQkudnJlZ1tWUkVHX0NPUkVdID0geyAia3JhaXQyIiwgICAgIDExMjAwMDAgfSwKIAkJLnZyZWdbVlJFR19NRU1dICA9IHsgImtyYWl0Ml9tZW0iLCAxMDUwMDAwIH0sCiAJCS52cmVnW1ZSRUdfRElHXSAgPSB7ICJrcmFpdDJfZGlnIiwgTFZMX0hJR0ggfSwKIAkJLnZyZWdbVlJFR19IRlBMTF9BXSA9IHsgImtyYWl0Ml9oZnBsbCIsIDE4MDAwMDAgfSwKQEAgLTgyLDcgKzgyLDcgQEAKIAkJLmhmcGxsX3BoeXNfYmFzZSA9IDB4RjkwQkEwMDAsCiAJCS5sMmNwbXJfaWFkZHIgPSAweDc1MDEsCiAJCS5zZWNfY2xrX3NlbCA9IDIsCi0JCS52cmVnW1ZSRUdfQ09SRV0gPSB7ICJrcmFpdDMiLCAgICAgMTEwMDAwMCB9LAorCQkudnJlZ1tWUkVHX0NPUkVdID0geyAia3JhaXQzIiwgICAgIDExMjAwMDAgfSwKIAkJLnZyZWdbVlJFR19NRU1dICA9IHsgImtyYWl0M19tZW0iLCAxMDUwMDAwIH0sCiAJCS52cmVnW1ZSRUdfRElHXSAgPSB7ICJrcmFpdDNfZGlnIiwgTFZMX0hJR0ggfSwKIAkJLnZyZWdbVlJFR19IRlBMTF9BXSA9IHsgImtyYWl0M19oZnBsbCIsIDE4MDAwMDAgfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2Nsb2NrLTgyMjYuYyBiL2FyY2gvYXJtL21hY2gtbXNtL2Nsb2NrLTgyMjYuYwppbmRleCA5OTNjZTU4Li5hODgzZTM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9jbG9jay04MjI2LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vY2xvY2stODIyNi5jCkBAIC0zMjE3LDYgKzMyMTcsMTEgQEAKIAlDTEtfTE9PS1VQKCJjb3JlX2NsayIsIHFkc3NfY2xrLmMsICJmYzM0MjAwMC5jdGkiKSwKIAlDTEtfTE9PS1VQKCJjb3JlX2NsayIsIHFkc3NfY2xrLmMsICJmYzM0MzAwMC5jdGkiKSwKIAlDTEtfTE9PS1VQKCJjb3JlX2NsayIsIHFkc3NfY2xrLmMsICJmYzM0NDAwMC5jdGkiKSwKKwlDTEtfTE9PS1VQKCJjb3JlX2NsayIsIHFkc3NfY2xrLmMsICJmYzM0ODAwMC5jdGkiKSwKKwlDTEtfTE9PS1VQKCJjb3JlX2NsayIsIHFkc3NfY2xrLmMsICJmYzM0ZDAwMC5jdGkiKSwKKwlDTEtfTE9PS1VQKCJjb3JlX2NsayIsIHFkc3NfY2xrLmMsICJmYzM1MDAwMC5jdGkiKSwKKwlDTEtfTE9PS1VQKCJjb3JlX2NsayIsIHFkc3NfY2xrLmMsICJmYzM1NDAwMC5jdGkiKSwKKwlDTEtfTE9PS1VQKCJjb3JlX2NsayIsIHFkc3NfY2xrLmMsICJmYzM1ODAwMC5jdGkiKSwKIAlDTEtfTE9PS1VQKCJjb3JlX2NsayIsIHFkc3NfY2xrLmMsICJmZDgyODAxOC5od2V2ZW50IiksCiAKIAlDTEtfTE9PS1VQKCJjb3JlX2FfY2xrIiwgcWRzc19hX2Nsay5jLCAiZmMzMjIwMDAudG1jIiksCkBAIC0zMjUxLDYgKzMyNTYsMTEgQEAKIAlDTEtfTE9PS1VQKCJjb3JlX2FfY2xrIiwgcWRzc19hX2Nsay5jLCAiZmMzNDIwMDAuY3RpIiksCiAJQ0xLX0xPT0tVUCgiY29yZV9hX2NsayIsIHFkc3NfYV9jbGsuYywgImZjMzQzMDAwLmN0aSIpLAogCUNMS19MT09LVVAoImNvcmVfYV9jbGsiLCBxZHNzX2FfY2xrLmMsICJmYzM0NDAwMC5jdGkiKSwKKwlDTEtfTE9PS1VQKCJjb3JlX2FfY2xrIiwgcWRzc19hX2Nsay5jLCAiZmMzNDgwMDAuY3RpIiksCisJQ0xLX0xPT0tVUCgiY29yZV9hX2NsayIsIHFkc3NfYV9jbGsuYywgImZjMzRkMDAwLmN0aSIpLAorCUNMS19MT09LVVAoImNvcmVfYV9jbGsiLCBxZHNzX2FfY2xrLmMsICJmYzM1MDAwMC5jdGkiKSwKKwlDTEtfTE9PS1VQKCJjb3JlX2FfY2xrIiwgcWRzc19hX2Nsay5jLCAiZmMzNTQwMDAuY3RpIiksCisJQ0xLX0xPT0tVUCgiY29yZV9hX2NsayIsIHFkc3NfYV9jbGsuYywgImZjMzU4MDAwLmN0aSIpLAogCUNMS19MT09LVVAoImNvcmVfYV9jbGsiLCBxZHNzX2FfY2xrLmMsICJmZDgyODAxOC5od2V2ZW50IiksCiAKIAlDTEtfTE9PS1VQKCJjb3JlX21tc3NfY2xrIiwgbW1zc19taXNjX2FoYl9jbGsuYywgImZkODI4MDE4Lmh3ZXZlbnQiKSwKQEAgLTMzNzEsNiArMzM4MSw3IEBACiAJQ0xLX0xPT0tVUCgicGl4ZWxfY2xrIiwgbWRzc19wY2xrMF9jbGsuYywgImZkOTIyODAwLnFjb20sbWRzc19kc2kiKSwKIAlDTEtfTE9PS1VQKCJpZmFjZV9jbGsiLCBtZHNzX2FoYl9jbGsuYywgImZkOTIyODAwLnFjb20sbWRzc19kc2kiKSwKIAlDTEtfTE9PS1VQKCJidXNfY2xrIiwgbWRzc19heGlfY2xrLmMsICJmZDkyMjgwMC5xY29tLG1kc3NfZHNpIiksCisJQ0xLX0xPT0tVUCgibWRwX2NvcmVfY2xrIiwgbWRzc19tZHBfY2xrLmMsICJmZDkyMjgwMC5xY29tLG1kc3NfZHNpIiksCiAKIAlDTEtfTE9PS1VQKCJjb3JlX2NsayIsIG1kc3NfbWRwX2Nsay5jLCAiZmQ5MDAwMDAucWNvbSxtZHNzX21kcCIpLAogCUNMS19MT09LVVAoImx1dF9jbGsiLCBtZHNzX21kcF9sdXRfY2xrLmMsICJmZDkwMDAwMC5xY29tLG1kc3NfbWRwIiksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9jbG9jay04NjEwLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9jbG9jay04NjEwLmMKaW5kZXggODVhOWY0NS4uNDVhNmI4OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vY2xvY2stODYxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2Nsb2NrLTg2MTAuYwpAQCAtMTM1MSw4ICsxMzUxLDYgQEAKIAkuY2Jjcl9yZWcgPSBMUEFTU19RNl9BWElfQ0JDUiwKIAkuaGFzX3NpYmxpbmcgPSAxLAogCS5iYXNlID0gJnZpcnRfYmFzZXNbR0NDX0JBU0VdLAotCSAvKiBGSVhNRTogUmVtb3ZlIHRoaXMgb25jZSBzaW11bGF0aW9uIGlzIGZpeGVkLiAqLwotCS5oYWx0X2NoZWNrID0gREVMQVksCiAJLmMgPSB7CiAJCS5kYmdfbmFtZSA9ICJnY2NfbHBhc3NfcTZfYXhpX2NsayIsCiAJCS5vcHMgPSAmY2xrX29wc19icmFuY2gsCkBAIC0xODkzLDE0ICsxODkxLDEwIEBACiAJLmNiY3JfcmVnID0gQklNQ19HRlhfQ0JDUiwKIAkuaGFzX3NpYmxpbmcgPSAxLAogCS5iYXNlID0gJnZpcnRfYmFzZXNbTU1TU19CQVNFXSwKLQkgLyogRklYTUU6IFJlbW92ZSB0aGlzIG9uY2Ugc2ltdWxhdGlvbiBpcyBmaXhlZC4gKi8KLQkuaGFsdF9jaGVjayA9IERFTEFZLAogCS5jID0gewogCQkuZGJnX25hbWUgPSAiYmltY19nZnhfY2xrIiwKIAkJLm9wcyA9ICZjbGtfb3BzX2JyYW5jaCwKIAkJQ0xLX0lOSVQoYmltY19nZnhfY2xrLmMpLAotCQkvKiBGSVhNRTogUmVtb3ZlIG9uY2Uga2dzbCB2b3RlcyBvbiB0aGUgZGVwZW5kcyBjbG9jay4gKi8KLQkJLmRlcGVuZHMgPSAmZ2NjX2JpbWNfc21tdV9jbGsuYywKIAl9LAogfTsKIApAQCAtMjI2Nyw4ICsyMjYxLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgYnJhbmNoX2NsayBtZHBfYXhpX2NsayA9IHsKIAkuY2Jjcl9yZWcgPSBNRFBfQVhJX0NCQ1IsCiAJLmJhc2UgPSAmdmlydF9iYXNlc1tNTVNTX0JBU0VdLAotCSAvKiBGSVhNRTogUmVtb3ZlIHRoaXMgb25jZSBzaW11bGF0aW9uIGlzIGZpeGVkLiAqLwotCS5oYWx0X2NoZWNrID0gREVMQVksCiAJLmMgPSB7CiAJCS5wYXJlbnQgPSAmbWRwX2F4aV9jbGtfc3JjLmMsCiAJCS5kYmdfbmFtZSA9ICJtZHBfYXhpX2NsayIsCkBAIC0yNDE2LDggKzI0MDgsNiBAQAogCS5iY3JfcmVnID0gVkZFX0FYSV9CQ1IsCiAJLmhhc19zaWJsaW5nID0gMSwKIAkuYmFzZSA9ICZ2aXJ0X2Jhc2VzW01NU1NfQkFTRV0sCi0JIC8qIEZJWE1FOiBSZW1vdmUgdGhpcyBvbmNlIHNpbXVsYXRpb24gaXMgZml4ZWQuICovCi0JLmhhbHRfY2hlY2sgPSBERUxBWSwKIAkuYyA9IHsKIAkJLnBhcmVudCA9ICZheGlfY2xrX3NyYy5jLAogCQkuZGJnX25hbWUgPSAidmZlX2F4aV9jbGsiLApAQCAtMjgzMSw2ICsyODIxLDEwIEBACiAJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZmMzNTIwMDAuY3RpIiksCiAJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZmMzNTMwMDAuY3RpIiksCiAJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZmMzNTQwMDAuY3RpIiksCisJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZmMzMzUwMDAuY3RpIiksCisJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZmMzMzgwMDAuY3RpIiksCisJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZmMzM2MwMDAuY3RpIiksCisJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZmMzNjAwMDAuY3RpIiksCiAJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZmMzNGMwMDAuanRhZ21tIiksCiAJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZmMzNGQwMDAuanRhZ21tIiksCiAJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZmMzNGUwMDAuanRhZ21tIiksCkBAIC0yODY1LDYgKzI4NTksMTAgQEAKIAlDTEtfTE9PS1VQKCJjb3JlX2FfY2xrIiwgcWRzc19hX2Nsay5jLCAiZmMzNTIwMDAuY3RpIiksCiAJQ0xLX0xPT0tVUCgiY29yZV9hX2NsayIsIHFkc3NfYV9jbGsuYywgImZjMzUzMDAwLmN0aSIpLAogCUNMS19MT09LVVAoImNvcmVfYV9jbGsiLCBxZHNzX2FfY2xrLmMsICJmYzM1NDAwMC5jdGkiKSwKKwlDTEtfTE9PS1VQKCJjb3JlX2FfY2xrIiwgcWRzc19hX2Nsay5jLCAiZmMzMzUwMDAuY3RpIiksCisJQ0xLX0xPT0tVUCgiY29yZV9hX2NsayIsIHFkc3NfYV9jbGsuYywgImZjMzM4MDAwLmN0aSIpLAorCUNMS19MT09LVVAoImNvcmVfYV9jbGsiLCBxZHNzX2FfY2xrLmMsICJmYzMzYzAwMC5jdGkiKSwKKwlDTEtfTE9PS1VQKCJjb3JlX2FfY2xrIiwgcWRzc19hX2Nsay5jLCAiZmMzNjAwMDAuY3RpIiksCiAJQ0xLX0xPT0tVUCgiY29yZV9hX2NsayIsIHFkc3NfYV9jbGsuYywgImZjMzRjMDAwLmp0YWdtbSIpLAogCUNMS19MT09LVVAoImNvcmVfYV9jbGsiLCBxZHNzX2FfY2xrLmMsICJmYzM0ZDAwMC5qdGFnbW0iKSwKIAlDTEtfTE9PS1VQKCJjb3JlX2FfY2xrIiwgcWRzc19hX2Nsay5jLCAiZmMzNGUwMDAuanRhZ21tIiksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9jbG9jay04OTc0LmMgYi9hcmNoL2FybS9tYWNoLW1zbS9jbG9jay04OTc0LmMKaW5kZXggYjBhZGZhMC4uMDNmY2IyNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vY2xvY2stODk3NC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2Nsb2NrLTg5NzQuYwpAQCAtNTEwMiw2ICs1MTAyLDggQEAKIAlDTEtfTE9PS1VQKCJidXNfY2xrIiwgbWRzc19heGlfY2xrLmMsICJmZDkyMmUwMC5xY29tLG1kc3NfZHNpIiksCiAJQ0xLX0xPT0tVUCgicGl4ZWxfY2xrIiwgbWRzc19wY2xrMF9jbGsuYywgImZkOTIyODAwLnFjb20sbWRzc19kc2kiKSwKIAlDTEtfTE9PS1VQKCJwaXhlbF9jbGsiLCBtZHNzX3BjbGsxX2Nsay5jLCAiZmQ5MjJlMDAucWNvbSxtZHNzX2RzaSIpLAorCUNMS19MT09LVVAoIm1kcF9jb3JlX2NsayIsIG1kc3NfbWRwX2Nsay5jLCAiZmQ5MjI4MDAucWNvbSxtZHNzX2RzaSIpLAorCUNMS19MT09LVVAoIm1kcF9jb3JlX2NsayIsIG1kc3NfbWRwX2Nsay5jLCAiZmQ5MjJlMDAucWNvbSxtZHNzX2RzaSIpLAogCUNMS19MT09LVVAoImlmYWNlX2NsayIsIG1kc3NfYWhiX2Nsay5jLCAiZmQ5MjIxMDAucWNvbSxoZG1pX3R4IiksCiAJQ0xLX0xPT0tVUCgiYWx0X2lmYWNlX2NsayIsIG1kc3NfaGRtaV9haGJfY2xrLmMsCiAJCSJmZDkyMjEwMC5xY29tLGhkbWlfdHgiKSwKQEAgLTU0NjEsNiArNTQ2MywxMSBAQAogCUNMS19MT09LVVAoImNvcmVfY2xrIiwgcWRzc19jbGsuYywgImZjMzQyMDAwLmN0aSIpLAogCUNMS19MT09LVVAoImNvcmVfY2xrIiwgcWRzc19jbGsuYywgImZjMzQzMDAwLmN0aSIpLAogCUNMS19MT09LVVAoImNvcmVfY2xrIiwgcWRzc19jbGsuYywgImZjMzQ0MDAwLmN0aSIpLAorCUNMS19MT09LVVAoImNvcmVfY2xrIiwgcWRzc19jbGsuYywgImZjMzQ4MDAwLmN0aSIpLAorCUNMS19MT09LVVAoImNvcmVfY2xrIiwgcWRzc19jbGsuYywgImZjMzRkMDAwLmN0aSIpLAorCUNMS19MT09LVVAoImNvcmVfY2xrIiwgcWRzc19jbGsuYywgImZjMzUwMDAwLmN0aSIpLAorCUNMS19MT09LVVAoImNvcmVfY2xrIiwgcWRzc19jbGsuYywgImZjMzU0MDAwLmN0aSIpLAorCUNMS19MT09LVVAoImNvcmVfY2xrIiwgcWRzc19jbGsuYywgImZjMzU4MDAwLmN0aSIpLAogCUNMS19MT09LVVAoImNvcmVfY2xrIiwgcWRzc19jbGsuYywgImZkZjMwMDE4Lmh3ZXZlbnQiKSwKIAogCUNMS19MT09LVVAoImNvcmVfYV9jbGsiLCBxZHNzX2FfY2xrLmMsICJmYzMyMjAwMC50bWMiKSwKQEAgLTU0OTEsNiArNTQ5OCwxMSBAQAogCUNMS19MT09LVVAoImNvcmVfYV9jbGsiLCBxZHNzX2FfY2xrLmMsICJmYzM0MjAwMC5jdGkiKSwKIAlDTEtfTE9PS1VQKCJjb3JlX2FfY2xrIiwgcWRzc19hX2Nsay5jLCAiZmMzNDMwMDAuY3RpIiksCiAJQ0xLX0xPT0tVUCgiY29yZV9hX2NsayIsIHFkc3NfYV9jbGsuYywgImZjMzQ0MDAwLmN0aSIpLAorCUNMS19MT09LVVAoImNvcmVfYV9jbGsiLCBxZHNzX2FfY2xrLmMsICJmYzM0ODAwMC5jdGkiKSwKKwlDTEtfTE9PS1VQKCJjb3JlX2FfY2xrIiwgcWRzc19hX2Nsay5jLCAiZmMzNGQwMDAuY3RpIiksCisJQ0xLX0xPT0tVUCgiY29yZV9hX2NsayIsIHFkc3NfYV9jbGsuYywgImZjMzUwMDAwLmN0aSIpLAorCUNMS19MT09LVVAoImNvcmVfYV9jbGsiLCBxZHNzX2FfY2xrLmMsICJmYzM1NDAwMC5jdGkiKSwKKwlDTEtfTE9PS1VQKCJjb3JlX2FfY2xrIiwgcWRzc19hX2Nsay5jLCAiZmMzNTgwMDAuY3RpIiksCiAJQ0xLX0xPT0tVUCgiY29yZV9hX2NsayIsIHFkc3NfYV9jbGsuYywgImZkZjMwMDE4Lmh3ZXZlbnQiKSwKIAogCUNMS19MT09LVVAoImNvcmVfbW1zc19jbGsiLCBtbXNzX21pc2NfYWhiX2Nsay5jLCAiZmRmMzAwMTguaHdldmVudCIpLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vY2xvY2stOTYyNS5jIGIvYXJjaC9hcm0vbWFjaC1tc20vY2xvY2stOTYyNS5jCmluZGV4IDNiMDcwNjkuLjBiNzNhYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2Nsb2NrLTk2MjUuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9jbG9jay05NjI1LmMKQEAgLTE4ODcsNiArMTg4Nyw5IEBACiAJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZmMzMGYwMDAuY3RpIiksCiAJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZmMzMTAwMDAuY3RpIiksCiAJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZmMzMzMwMDAuY3RpIiksCisJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZmMzNTAwMDAuY3RpIiksCisJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZmMzNTQwMDAuY3RpIiksCisJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZmMzNTgwMDAuY3RpIiksCiAJQ0xLX0xPT0tVUCgiY29yZV9jbGsiLCBxZHNzX2Nsay5jLCAiZjkwMTEwMzguaHdldmVudCIpLAogCiAJQ0xLX0xPT0tVUCgiY29yZV9hX2NsayIsIHFkc3NfYV9jbGsuYywgImZjMzIyMDAwLnRtYyIpLApAQCAtMTkwOSw2ICsxOTEyLDkgQEAKIAlDTEtfTE9PS1VQKCJjb3JlX2FfY2xrIiwgcWRzc19hX2Nsay5jLCAiZmMzMGYwMDAuY3RpIiksCiAJQ0xLX0xPT0tVUCgiY29yZV9hX2NsayIsIHFkc3NfYV9jbGsuYywgImZjMzEwMDAwLmN0aSIpLAogCUNMS19MT09LVVAoImNvcmVfYV9jbGsiLCBxZHNzX2FfY2xrLmMsICJmYzMzMzAwMC5jdGkiKSwKKwlDTEtfTE9PS1VQKCJjb3JlX2FfY2xrIiwgcWRzc19hX2Nsay5jLCAiZmMzNTAwMDAuY3RpIiksCisJQ0xLX0xPT0tVUCgiY29yZV9hX2NsayIsIHFkc3NfYV9jbGsuYywgImZjMzU0MDAwLmN0aSIpLAorCUNMS19MT09LVVAoImNvcmVfYV9jbGsiLCBxZHNzX2FfY2xrLmMsICJmYzM1ODAwMC5jdGkiKSwKIAlDTEtfTE9PS1VQKCJjb3JlX2FfY2xrIiwgcWRzc19hX2Nsay5jLCAiZjkwMTEwMzguaHdldmVudCIpLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L2FjZGJfY29tbWFuZHMuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9hY2RiX2NvbW1hbmRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNGEzZDkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L2FjZGJfY29tbWFuZHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaWZuZGVmIF9NQUNIX1FEU1A1X1YyX0FDREJfQ09NTUFORFNfSAotI2RlZmluZSBfTUFDSF9RRFNQNV9WMl9BQ0RCX0NPTU1BTkRTX0gKLQotI2RlZmluZSBBQ0RCX1ZPSUNFX05FVFdPUktfSURfREVGQVVMVAkJMHgwMDAxMDAzNwotI2RlZmluZSBBQ0RCX0lOSVRJQUxJU0lORwkJCTAKLSNkZWZpbmUgQUNEQl9SRUFEWQkJCQkxCi0KLQotLyogNEtCICovCi0jZGVmaW5lIEFDREJfUEFHRV9TSVpFCQkJCTB4MTAwMAotCi0jZGVmaW5lIEFDREJfQ0RNQV9OQgkJMHgwMTA4YjE1MwotI2RlZmluZSBBQ0RCX0NETUFfV0IJCTB4MDEwOGIxNTQKLSNkZWZpbmUgQUNEQl9HU01fTkIJCTB4MDEwOGIxNTUKLSNkZWZpbmUgQUNEQl9HU01fV0IJCTB4MDEwOGIxNTYKLSNkZWZpbmUgQUNEQl9XQ0RNQV9OQgkJMHgwMTA4YjE1NwotI2RlZmluZSBBQ0RCX1dDRE1BX1dCCQkweDAxMDhiMTU4Ci0KLQotLyogQUNEQiBjb21tYW5kcyAqLwotCi0KLS8qIHN0cnVjdCBhY2RiX2NtZF9pbnN0YWxsX2RldmljZSAqLwotI2RlZmluZSBBQ0RCX0lOU1RBTExfREVWSUNFCQkweDAxMDhkMjQ1Ci0KLS8qIHN0cnVjdCBhY2RiX2NtZF9pbnN0YWxsX2RldmljZSAqLwotI2RlZmluZSBBQ0RCX1VOSU5TVEFMTF9ERVZJQ0UJCTB4MDEwOGQyNDYKLQotLyogc3RydWN0IGFjZGJfY21kX2RldmljZSAqLwotI2RlZmluZSBBQ0RCX0dFVF9ERVZJQ0UJCQkweDAxMDhiYjkyCi0KLS8qIHN0cnVjdCBhY2RiX2NtZF9kZXZpY2UgKi8KLSNkZWZpbmUgQUNEQl9TRVRfREVWSUNFCQkJMHgwMTA4YmI5MwotCi0vKiBzdHJ1Y3QgYWNkYl9jbWRfZ2V0X2RldmljZV90YWJsZSAqLwotI2RlZmluZSBBQ0RCX0dFVF9ERVZJQ0VfVEFCTEUJCTB4MDEwOGJiOTcKLQotLyogc3RydWN0IGFjZGJfY21kX2dldF9kZXZpY2VfY2FwYWJpbGl0aWVzICovCi0jZGVmaW5lIEFDREJfR0VUX0RFVklDRV9DQVBBQklMSVRJRVMJMHgwMTA4ZjVjYQotCi0vKiBzdHJ1Y3QgYWNkYl9jbWRfZ2V0X2RldmljZV9pbmZvICovCi0jZGVmaW5lIEFDREJfR0VUX0RFVklDRV9JTkZPCQkweDAxMDhmNWNiCi0KLS8qY29tbWFuZCB0byBpbnRpdGlhbGl6ZSBBQ0RCIGJhc2VkIG9uIGNvZGVjIHR5cGUqLwotI2RlZmluZSBBQ0RCX0NNRF9JTklUSUFMSVpFX0ZPUl9BRElFCTB4MDAwMTEyODMKLQotCi0vKiBBQ0RCIEVycm9yIGNvZGVzICovCi0KLSNkZWZpbmUgQUNEQl9SRVNfU1VDQ0VTUwkJMAotI2RlZmluZSBBQ0RCX1JFU19GQUlMVVJFCQktMQotI2RlZmluZSBBQ0RCX1JFU19CQURQQVJNCQktMgotI2RlZmluZSBBQ0RCX1JFU19CQURTVEFURQkJLTMKLQotI2RlZmluZSBUR1RWRVJTX01TTTd4MzBfQlJJTkdfVVAJMHgwMDAxMDA2NAotCi0KLQotLyogQWxnb3JpdGhtIEFzcGVjdCBJRHMgKi8KLQotI2RlZmluZSBJSURfRU5BQkxFX0ZMQUcJCQkweDAxMDhiNmI5Ci0KLQotI2RlZmluZSBJSURfRU5BQkxFX0ZMQUdfU0laRQkJCQkJMQotI2RlZmluZSBJSURfRUNIT19DQU5DRUxMRVJfVkVSU0lPTl9TSVpFCQkJCTIKLSNkZWZpbmUgSUlEX0VDSE9fQ0FOQ0VMTEVSX01PREVfU0laRQkJCQkyCi0jZGVmaW5lIElJRF9FQ0hPX0NBTkNFTExFUl9OT0lTRV9TVVBQUkVTU09SX0VOQUJMRV9TSVpFCQkxCi0jZGVmaW5lIElJRF9FQ0hPX0NBTkNFTExFUl9QQVJBTUVURVJTX1NJWkUJCQkzMgotI2RlZmluZSBJSURfRUNIT19DQU5DRUxMRVJfTkVYVEdFTl9OQl9QQVJBTUVURVJTX1NJWkUJCSgzOCAqIDIpCi0jZGVmaW5lIElJRF9FQ0hPX0NBTkNFTExFUl9ORVhUR0VOX1dCX1BBUkFNRVRFUlNfU0laRQkJKDM4ICogMikKLSNkZWZpbmUgSUlEX0ZMVUVOQ0VfUEFSQU1FVEVSU19TSVpFCQkJCTQ4NgotI2RlZmluZSBJSURfQUZFX1ZPTFVNRV9DT05UUk9MX1NJWkUJCQkJNgotI2RlZmluZSBJSURfR0FJTl9TSVpFCQkJCQkJMgotI2RlZmluZSBJSURfVk9JQ0VfRklSX0ZJTFRFUl9TSVpFCQkJCTE0Ci0jZGVmaW5lIElJRF9WT0lDRV9JSVJfRklMVEVSX1NJWkUJCQkJMTE0Ci0jZGVmaW5lIElJRF9SWF9EQk1fT0ZGU0VUX1NJWkUJCQkJCTIKLSNkZWZpbmUgSUlEX0FHQ19TSVpFCQkJCQkJMzYKLSNkZWZpbmUgSUlEX0FWQ19TSVpFCQkJCQkJODAKLQotI2RlZmluZSBJSURfQVVESU9fSUlSX0NPRUZGX1NJWkUJCQkJMTAwCi0jZGVmaW5lIElJRF9NQkFEUkNfUEFSQU1FVEVSU19TSVpFCQkJCTgKLSNkZWZpbmUgSUlEX01CQURSQ19FWFRfQlVGRl9TSVpFCQkJCTM5MgotI2RlZmluZSBJSURfTUJBRFJDX0JBTkRfQ09ORklHX1NJWkUJCQkJMTAwCi0jZGVmaW5lIElJRF9RQUZYX1BBUkFNRVRFUlNfU0laRQkJCQkyCi0jZGVmaW5lIElJRF9RQ09OQ0VSVF9QQVJBTUVURVJTX1NJWkUJCQkJMgotI2RlZmluZSBJSURfQVVESU9fQUdDX1BBUkFNRVRFUlNfU0laRQkJCQk0MgotI2RlZmluZSBJSURfTlNfUEFSQU1FVEVSU19TSVpFCQkJCQkxNAotCi0jZGVmaW5lIElJRF9FQ0hPX0NBTkNFTExFUl9WRVJTSU9OCQkJMHgwMDAxMDA0MgotI2RlZmluZSBJSURfRUNIT19DQU5DRUxMRVJfTU9ERQkJCQkweDAwMDEwMDQzCi0jZGVmaW5lIElJRF9FQ0hPX0NBTkNFTExFUl9OT0lTRV9TVVBQUkVTU09SX0VOQUJMRQkweDAwMDEwMDQ0Ci0jZGVmaW5lIElJRF9FQ0hPX0NBTkNFTExFUl9QQVJBTUVURVJTCQkJMHgwMDAxMDA0NQotI2RlZmluZSBJSURfRUNIT19DQU5DRUxMRVJfTkVYVEdFTl9OQl9QQVJBTUVURVJTCTB4MDAwMTAwNDYKLSNkZWZpbmUgSUlEX0VDSE9fQ0FOQ0VMTEVSX05FWFRHRU5fV0JfUEFSQU1FVEVSUwkweDAwMDEwMDQ3Ci0jZGVmaW5lIElJRF9GTFVFTkNFX1BBUkFNRVRFUlMJCQkJMHgwMDAxMDA0OAotI2RlZmluZSBJSURfQUZFX1ZPTFVNRV9DT05UUk9MCQkJCTB4MDAwMTAwNDkKLSNkZWZpbmUgSUlEX0dBSU4JCQkJCTB4MDAwMTAwNEEKLSNkZWZpbmUgSUlEX1ZPSUNFX0ZJUl9GSUxURVIJCQkJMHgwMDAxMDA0QgotI2RlZmluZSBJSURfVk9JQ0VfSUlSX0ZJTFRFUgkJCQkweDAwMDEwMDRDCi0jZGVmaW5lIElJRF9BR0MJCQkJCQkweDAwMDEwMDRFCi0jZGVmaW5lIElJRF9BVkMJCQkJCQkweDAwMDEwMDRGCi0jZGVmaW5lIEFCSURfU0lERVRPTkVfR0FJTgkJCQkweDAwMDEwMDUwCi0jZGVmaW5lIEFCSURfVFhfVk9JQ0VfR0FJTgkJCQkweDAwMDEwMDUxCi0jZGVmaW5lIEFCSURfVFhfRFRNRl9HQUlOCQkJCTB4MDAwMTAwNTIKLSNkZWZpbmUgQUJJRF9DT0RFQ19UWF9HQUlOCQkJCTB4MDAwMTAwNTMKLSNkZWZpbmUgQUJJRF9IU1NECQkJCQkweDAwMDEwMDU0Ci0jZGVmaW5lIEFCSURfVFhfQUdDCQkJCQkweDAwMDEwMDU1Ci0jZGVmaW5lIEFCSURfVFhfVk9JQ0VfRklSCQkJCTB4MDAwMTAwNTYKLSNkZWZpbmUgQUJJRF9UWF9WT0lDRV9JSVIJCQkJMHgwMDAxMDA1NwotI2RlZmluZSBBQklEX0VDSE9fQ0FOQ0VMTEVSCQkJCTB4MDAwMTAwNTgKLSNkZWZpbmUgQUJJRF9FQ0hPX0NBTkNFTExFUl9OQl9MVkhGCQkJMHgwMDAxMDA1OQotI2RlZmluZSBBQklEX0VDSE9fQ0FOQ0VMTEVSX1dCX0xWSEYJCQkweDAwMDEwMDVBCi0jZGVmaW5lIEFCSURfRkxVRU5DRQkJCQkJMHgwMDAxMDA1QgotI2RlZmluZSBBQklEX0NPREVDX1JYX0dBSU4JCQkJMHgwMDAxMDA1QwotI2RlZmluZSBBQklEX1JYX0RCTV9PRkZTRVQJCQkJMHgwMDAxMDA1RAotI2RlZmluZSBBQklEX1JYX0FHQwkJCQkJMHgwMDAxMDA1RQotI2RlZmluZSBBQklEX0FWQwkJCQkJMHgwMDAxMDA1RgotI2RlZmluZSBBQklEX1JYX1ZPSUNFX0ZJUgkJCQkweDAwMDEwMDYwCi0jZGVmaW5lIEFCSURfUlhfVk9JQ0VfSUlSCQkJCTB4MDAwMTAwNjEKLSNkZWZpbmUgQUJJRF9BRkVfVk9MX0NUUkwJCQkJMHgwMDAxMDA2NwotCi0KLS8qIEFVRElPIElEcyAqLwotI2RlZmluZSBBQklEX0FVRElPX0FHQ19UWAkJMHgwMDAxMDA2OAotI2RlZmluZSBBQklEX0FVRElPX05TX1RYCQkweDAwMDEwMDY5Ci0jZGVmaW5lIEFCSURfVk9JQ0VfTlMJCQkweDAwMDEwMDZBCi0jZGVmaW5lIEFCSURfQVVESU9fSUlSX1RYCQkweDAwMDEwMDZCCi0jZGVmaW5lIEFCSURfQVVESU9fSUlSX1JYCQkweDAwMDEwMDZDCi0jZGVmaW5lIEFCSURfQVVESU9fTUJBRFJDX1JYCQkweDAwMDEwMDZFCi0jZGVmaW5lIEFCSURfQVVESU9fUUFGWF9SWAkJMHgwMDAxMDA2RgotI2RlZmluZSBBQklEX0FVRElPX1FDT05DRVJUX1JYCQkweDAwMDEwMDcwCi0jZGVmaW5lIEFCSURfQVVESU9fU1RGX1JYCQkweDAwMDEwMDcxCi0jZGVmaW5lIEFCSURfQVVESU9fQ0FMSUJSQVRJT05fR0FJTl9SWCAgMHgwMDAxMTE2MgotI2RlZmluZSBBQklEX0FVRElPX0NBTElCUkFUSU9OX0dBSU5fVFggIDB4MDAwMTExNDkKLSNkZWZpbmUgQUJJRF9BVURJT19QQkVfUlggICAgICAgICAgICAgICAweDAwMDExMTk3Ci0jZGVmaW5lIEFCSURfQVVESU9fUk1DX1RYCQkweDAwMDExMjI2Ci0jZGVmaW5lIEFCSURfQVVESU9fRkxVRU5DRV9UWAkJMHgwMDAxMTI0NAotCi0KLSNkZWZpbmUgSUlEX0FVRElPX0FHQ19QQVJBTUVURVJTCTB4MDAwMTAwN0UKLSNkZWZpbmUgSUlEX05TX1BBUkFNRVRFUlMJCTB4MDAwMTAwNzIKLSNkZWZpbmUgSUlEX0FVRElPX0lJUl9DT0VGRgkJMHgwMDAxMDA3MwotI2RlZmluZSBJSURfTUJBRFJDX0VYVF9CVUZGCQkweDAwMDEwMDc1Ci0jZGVmaW5lIElJRF9NQkFEUkNfQkFORF9DT05GSUcJCTB4MDAwMTAwNzYKLSNkZWZpbmUgSUlEX01CQURSQ19QQVJBTUVURVJTCQkweDAwMDEwMDc3Ci0jZGVmaW5lIElJRF9RQUZYX1BBUkFNRVRFUlMJCTB4MDAwMTAwNzkKLSNkZWZpbmUgSUlEX1FDT05DRVJUX1BBUkFNRVRFUlMJCTB4MDAwMTAwN0EKLSNkZWZpbmUgSUlEX1NURl9DT0VGRgkJCTB4MDAwMTAwN0IKLSNkZWZpbmUgSUlEX0FVRElPX0NBTElCUkFUSU9OX0dBSU5fUlggICAweDAwMDExMTYzCi0jZGVmaW5lIElJRF9BVURJT19DQUxJQlJBVElPTl9HQUlOX1RYICAgMHgwMDAxMTE3MQotI2RlZmluZSBJSURfUEJFX0NPTkZJR19QQVJBTUVURVJTICAgICAgIDB4MDAwMTExOTgKLSNkZWZpbmUgSUlEX0FVRElPX1BCRV9SWF9FTkFCTEVfRkxBRyAgICAweDAwMDExMTk5Ci0jZGVmaW5lIElJRF9BVURJT19STUNfUEFSQU0JCTB4MDAwMTEyMjcKLSNkZWZpbmUgSUlEX0FVRElPX0ZMVUVOQ0VfVFgJCTB4MDAwMTEyNDUKLQotCi0jZGVmaW5lIFRPUElEX1JYX1RPUE9MT0dZXzEJCTB4MDAwMTAwNjIKLSNkZWZpbmUgVE9QSURfVFhfVE9QT0xPR1lfMQkJMHgwMDAxMDA2MwotI2RlZmluZSBBRkVSSURfSU5UX1NJTksJCQkweDAwMDEwMDY1Ci0jZGVmaW5lIEFGRVJJRF9JTlRfU09VUkNFCQkweDAwMDEwMDY2Ci0jZGVmaW5lIEFGRVJJRF9OT19TSU5LCQkJMHgwMDAwMDAwMAotI2RlZmluZSBBRkVSSURfTlVMTF9TSU5LCQkweDAxMDhlYTkyCi0KLQotc3RydWN0IGFjZGJfY21kX2luc3RhbGxfZGV2aWNlIHsKLQl1MzIJY29tbWFuZF9pZDsKLQl1MzIJZGV2aWNlX2lkOwotCXUzMgl0b3BvbG9neV9pZDsKLQl1MzIJYWZlX3JvdXRpbmdfaWQ7Ci0JdTMyCWNhZF9yb3V0aW5nX2lkOwkJLyogc2VlICJTYW1wbGUgUmF0ZSBCaXQgTWFzayIgYmVsb3cgKi8KLQl1MzIJc2FtcGxlX3JhdGVfbWFzazsKLQotCS8qIHJlcHJlc2VudHMgZGV2aWNlIGRpcmVjdGlvbjogVHgsIFJ4IChhdXggcGdhIC0gbG9vcGJhY2spICovCi0JdTgJZGV2aWNlX3R5cGU7Ci0JdTgJY2hhbm5lbF9jb25maWc7CQkvKiBNb25vIG9yIFN0ZXJlbyAqLwotCXUzMglhZGllX2NvZGVjX3BhdGhfaWQ7Ci19OwotCi0KLXN0cnVjdCBhY2RiX2NtZF9nZXRfZGV2aWNlX2NhcGFiaWxpdGllcyB7Ci0JdTMyCWNvbW1hbmRfaWQ7Ci0JdTMyCXRvdGFsX2J5dGVzOwkvKiBMZW5ndGggaW4gYnl0ZXMgYWxsb2NhdGVkIGZvciBidWZmZXIgKi8KLQl1MzIJKnBoeXNfYnVmOwkvKiBQaHlzaWNhbCBBZGRyZXNzIG9mIGRhdGEgKi8KLX07Ci0KLQotc3RydWN0IGFjZGJfY21kX2dldF9kZXZpY2VfaW5mbyB7Ci0JdTMyCWNvbW1hbmRfaWQ7Ci0JdTMyCWRldmljZV9pZDsKLQl1MzIJdG90YWxfYnl0ZXM7CS8qIExlbmd0aCBpbiBieXRlcyBhbGxvY2F0ZWQgZm9yIGJ1ZmZlciAqLwotCXUzMgkqcGh5c19idWY7CS8qIFBoeXNpY2FsIEFkZHJlc3Mgb2YgZGF0YSAqLwotfTsKLQotc3RydWN0IGFjZGJfY21kX2RldmljZSB7Ci0JdTMyCWNvbW1hbmRfaWQ7Ci0JdTMyCWRldmljZV9pZDsKLQl1MzIJbmV0d29ya19pZDsKLQl1MzIJc2FtcGxlX3JhdGVfaWQ7CQkvKiBBY3R1YWwgc2FtcGxlIHJhdGUgdmFsdWUgKi8KLQl1MzIJaW50ZXJmYWNlX2lkOwkJLyogU2VlIGludGVyZmFjZSBpZCdzIGFib3ZlICovCi0JdTMyCWFsZ29yaXRobV9ibG9ja19pZDsJLyogU2VlIGVudW1lcmF0aW9ucyBhYm92ZSAqLwotCXUzMgl0b3RhbF9ieXRlczsJCS8qIExlbmd0aCBpbiBieXRlcyB1c2VkIGJ5IGJ1ZmZlciAqLwotCXUzMgkqcGh5c19idWY7CQkvKiBQaHlzaWNhbCBBZGRyZXNzIG9mIGRhdGEgKi8KLX07Ci0KLXN0cnVjdCBhY2RiX2NtZF9nZXRfZGV2aWNlX3RhYmxlIHsKLQl1MzIJY29tbWFuZF9pZDsKLQl1MzIJZGV2aWNlX2lkOwotCXUzMgluZXR3b3JrX2lkOwotCXUzMglzYW1wbGVfcmF0ZV9pZDsJCS8qIEFjdHVhbCBzYW1wbGUgcmF0ZSB2YWx1ZSAqLwotCXUzMgl0b3RhbF9ieXRlczsJCS8qIExlbmd0aCBpbiBieXRlcyB1c2VkIGJ5IGJ1ZmZlciAqLwotCXUzMgkqcGh5c19idWY7CQkvKiBQaHlzaWNhbCBBZGRyZXNzIG9mIGRhdGEgKi8KLX07Ci0KLXN0cnVjdCBhY2RiX3Jlc3VsdCB7Ci0JLyogVGhpcyBmaWVsZCBpcyBwb3B1bGF0ZWQgaW4gcmVzcG9uc2UgdG8gdGhlICovCi0JLyogQUNEQl9HRVRfREVWSUNFX0NBUEFCSUxJVElFUyBjb21tYW5kIGFuZCBpbmRpY2F0ZXMgdGhlIHRvdGFsICovCi0JLyogZGV2aWNlcyB3aG9zZSBjYXBhYmlsaXRpZXMgYXJlIGNvcGllZCB0byB0aGUgcGh5c2ljYWwgbWVtb3J5LiAqLwotCXUzMgl0b3RhbF9kZXZpY2VzOwotCXUzMgkqYnVmOwkJCS8qIFBoeXNpY2FsIEFkZHJlc3Mgb2YgZGF0YSAqLwotCXUzMgl1c2VkX2J5dGVzOwkJLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGRhdGEgKi8KLQl1MzIJcmVzdWx0OwkJCS8qIFNlZSBBQ0RCIEVycm9yIGNvZGVzIGFib3ZlICovCi19OwotCi1zdHJ1Y3QgYWNkYl9kZXZpY2VfY2FwYWJpbGl0eSB7Ci0JdTMyCWRldmljZV9pZDsKLQl1MzIJc2FtcGxlX3JhdGVfbWFzazsJLyogU2VlICJTYW1wbGUgUmF0ZSBCaXQgTWFzayIgYmVsb3cgKi8KLX07Ci0KLXN0cnVjdCBhY2RiX2Rldl9pbmZvIHsKLQl1MzIJY2FkX3JvdXRpbmdfaWQ7Ci0JdTMyCXNhbXBsZV9yYXRlX21hc2s7CS8qIFNlZSAiU2FtcGxlIFJhdGUgQml0IE1hc2siIGJlbG93ICovCi0JdTMyCWFkc3BfZGV2aWNlX2lkOwkJLyogUURTUDYgZGV2aWNlIElEICovCi0JdTMyCWRldmljZV90eXBlOwkJLyogVHgsIFJ4ICAoYXV4IHBnYSAtIGxvb3BiYWNrKSAqLwotCXUzMgljaGFubmVsX2NvbmZpZzsJCS8qIE1vbm8gb3IgU3RlcmVvICovCi0JczMyCW1pbl92b2x1bWU7CQkvKiBNaW4gdm9sdW1lIChtQikgKi8KLQlzMzIJbWF4X3ZvbHVtZTsJCS8qIE1heCB2b2x1bWUgKG1CKSAqLwotfTsKLQotLypzdHJ1Y3R1cmUgaXMgdXNlZCB0byBpbnRpYWxpemUgQUNEQiBzb2Z0d2FyZSBvbiBtb2RlbQotYmFzZWQgb24gYWRpZSB0eXBlIGRldGVjdGVkKi8KLXN0cnVjdCBhY2RiX2NtZF9pbml0X2FkaWUgewotCXUzMiBjb21tYW5kX2lkOwotCXUzMiBhZGllX3R5cGU7Ci19OwotCi0jZGVmaW5lIEFDREJfQ1VSUkVOVF9BRElFX01PREVfVU5LTk9XTiAwCi0jZGVmaW5lIEFDREJfQ1VSUkVOVF9BRElFX01PREVfVElNUEFOSSAxCi0jZGVmaW5lIEFDREJfQ1VSUkVOVF9BRElFX01PREVfTUFSSU1CQSAyCi0KLS8qIFNhbXBsZSBSYXRlIEJpdCBNYXNrICovCi0KLS8qIEFVWCBQR0EgZGV2aWNlcyB3aWxsIGhhdmUgYSBzYW1wbGUgcmF0ZSBtYXNrIG9mIDB4RkZGRkZGRkYgKi8KLS8qIDhrSHogICAgICAgICAgICAgIDB4MDAwMDAwMDEgKi8KLS8qIDExLjAyNWtIeiAgICAgICAgIDB4MDAwMDAwMDIgKi8KLS8qIDEya0h6ICAgICAgICAgICAgIDB4MDAwMDAwMDQgKi8KLS8qIDE2a0h6ICAgICAgICAgICAgIDB4MDAwMDAwMDggKi8KLS8qIDIyLjVrSHogICAgICAgICAgIDB4MDAwMDAwMTAgKi8KLS8qIDI0a0h6ICAgICAgICAgICAgIDB4MDAwMDAwMjAgKi8KLS8qIDMya0h6ICAgICAgICAgICAgIDB4MDAwMDAwNDAgKi8KLS8qIDQ0LjFrSHogICAgICAgICAgIDB4MDAwMDAwODAgKi8KLS8qIDQ4a0h6ICAgICAgICAgICAgIDB4MDAwMDAxMDAgKi8KLQotCi0vKiBEZXZpY2UgdHlwZSBlbnVtZXJhdGlvbiAqLwotZW51bSB7Ci0JUlhfREVWSUNFID0gMSwKLQlUWF9ERVZJQ0UsCi0JQVVYUEdBX0RFVklDRSwKLQlERVZJQ0VfVFlQRV9NQVgKLX07Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLS8qVGhlc2UgYXJlIEFCSUQgdXNlZCBmb3IgUlRDKi8KLSNkZWZpbmUgQUJJRF9BVURJT19SVENfTUJBRFJDX1JYIDB4MDAwMTExOEEKLSNkZWZpbmUgQUJJRF9BVURJT19SVENfVk9MVU1FX1BBTl9SWCAweDAwMDExMThDCi0jZGVmaW5lIEFCSURfQVVESU9fUlRDX1NQQSAweDAwMDExMThFCi0jZGVmaW5lIEFCSURfQVVESU9fUlRDX0VRVUFMSVpFUl9QQVJBTUVURVJTIDB4MDAwMTExOUYKLQotLypUaGVzZSBhcmUgSUlEIHVzZWQgZm9yIFJUQyovCi0jZGVmaW5lIElJRF9BVURJT19SVENfTUJBRFJDX1BBUkFNRVRFUlMgMHgwMDAxMTE4QgotI2RlZmluZSBJSURfQVVESU9fUlRDX1ZPTFVNRV9QQU5fUEFSQU1FVEVSUyAweDAwMDExMThECi0jZGVmaW5lIElJRF9BVURJT19SVENfU1BBX1BBUkFNRVRFUlMgMHgwMDAxMTE4RgotI2RlZmluZSBJSURfQVVESU9fUlRDX0VRVUFMSVpFUl9QQVJBTUVURVJTIDB4MDAwMTExOUUKLSNkZWZpbmUgSUlEX0FVRElPX1JUQ19BR0NfUEFSQU1FVEVSUyAweDAwMDExMUE3Ci0jZGVmaW5lIElJRF9BVURJT19SVENfVFhfSUlSX0NPRUZGIDB4MDAwMTExQTgKLQotI2VuZGlmCi0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9hdWRpb19hY2RiX2RlZi5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L2F1ZGlvX2FjZGJfZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYzg3ZTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L2F1ZGlvX2FjZGJfZGVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpZm5kZWYgX01BQ0hfUURTUDVfVjJfQVVESU9fQUNEQl9ERUZfSAotI2RlZmluZSBfTUFDSF9RRFNQNV9WMl9BVURJT19BQ0RCX0RFRl9ICi0KLS8qIERlZmluZSBBQ0RCIGRldmljZSBJRCAqLwotI2RlZmluZSBBQ0RCX0lEX0hBTkRTRVRfU1BLUgkJCQkxCi0jZGVmaW5lIEFDREJfSURfSEFORFNFVF9NSUMJCQkJMgotI2RlZmluZSBBQ0RCX0lEX0hFQURTRVRfTUlDCQkJCTMKLSNkZWZpbmUgQUNEQl9JRF9IRUFEU0VUX1NQS1JfTU9OTwkJCTQKLSNkZWZpbmUgQUNEQl9JRF9IRUFEU0VUX1NQS1JfU1RFUkVPCQkJNQotI2RlZmluZSBBQ0RCX0lEX1NQS1JfUEhPTkVfTUlDCQkJCTYKLSNkZWZpbmUgQUNEQl9JRF9TUEtSX1BIT05FX01PTk8JCQkJNwotI2RlZmluZSBBQ0RCX0lEX1NQS1JfUEhPTkVfU1RFUkVPCQkJOAotI2RlZmluZSBBQ0RCX0lEX0JUX1NDT19NSUMJCQkJOQotI2RlZmluZSBBQ0RCX0lEX0JUX1NDT19TUEtSCQkJCTB4MEEKLSNkZWZpbmUgQUNEQl9JRF9CVF9BMkRQX1NQS1IJCQkJMHgwQgotI2RlZmluZSBBQ0RCX0lEX0JUX0EyRFBfVFgJCQkJMHgxMAotI2RlZmluZSBBQ0RCX0lEX1RUWV9IRUFEU0VUX01JQwkJCQkweDBDCi0jZGVmaW5lIEFDREJfSURfVFRZX0hFQURTRVRfU1BLUgkJCTB4MEQKLSNkZWZpbmUgQUNEQl9JRF9IRUFEU0VUX01PTk9fUExVU19TUEtSX01PTk9fUlgJCTB4MTEKLSNkZWZpbmUgQUNEQl9JRF9IRUFEU0VUX1NURVJFT19QTFVTX1NQS1JfU1RFUkVPX1JYCTB4MTQKLSNkZWZpbmUgQUNEQl9JRF9GTV9UWF9MT09QQkFDSwkJCQkweDE3Ci0jZGVmaW5lIEFDREJfSURfRk1fVFgJCQkJCTB4MTgKLSNkZWZpbmUgQUNEQl9JRF9MUF9GTV9TUEtSX1BIT05FX1NURVJFT19SWAkJMHgxOQotI2RlZmluZSBBQ0RCX0lEX0xQX0ZNX0hFQURTRVRfU1BLUl9TVEVSRU9fUlgJCTB4MUEKLSNkZWZpbmUgQUNEQl9JRF9JMlNfUlgJCQkJCTB4MjAKLSNkZWZpbmUgQUNEQl9JRF9TUEtSX1BIT05FX01JQ19CUk9BRFNJREUJCTB4MkIKLSNkZWZpbmUgQUNEQl9JRF9IQU5EU0VUX01JQ19CUk9BRFNJREUJCQkweDJDCi0jZGVmaW5lIEFDREJfSURfU1BLUl9QSE9ORV9NSUNfRU5ERklSRQkJCTB4MkQKLSNkZWZpbmUgQUNEQl9JRF9IQU5EU0VUX01JQ19FTkRGSVJFCQkJMHgyRQotI2RlZmluZSBBQ0RCX0lEX0kyU19UWAkJCQkJMHgzMAotI2RlZmluZSBBQ0RCX0lEX0hETUkJCQkJCTB4NDAKLSNkZWZpbmUgQUNEQl9JRF9GTV9SWAkJCQkJMHg0RgotLypSZXBsYWNlIHRoZSBtYXggZGV2aWNlIElELGlmIGFueSBuZXcgZGV2aWNlIGlzIGFkZGVkIFNwZWNpZmljIHRvIFJUQyBvbmx5Ki8KLSNkZWZpbmUgQUNEQl9JRF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0RCX0lEX0ZNX1JYCi0KLS8qIElEIHVzZWQgZm9yIHZpcnR1YWwgZGV2aWNlcyAqLwotI2RlZmluZSBQU0VVRE9fQUNEQl9JRAkJCQkJMHhGRkZGCi0KLWludCBpc19hY2RiX2VuYWJsZWQodm9pZCk7Ci0jZW5kaWYgLyogX01BQ0hfUURTUDVfVjJfQVVESU9fQUNEQl9ERUZfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L2F1ZGlvX2FjZGJpLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvYXVkaW9fYWNkYmkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgyZTRkOS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvYXVkaW9fYWNkYmkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpZm5kZWYgX01BQ0hfUURTUDVfVjJfQVVESU9fQUNEQklfSAotI2RlZmluZSBfTUFDSF9RRFNQNV9WMl9BVURJT19BQ0RCSV9ICi0KLSNkZWZpbmUgREJPUl9TSUdOQVRVUkUJMHg1MjRGNDI0NAotCi12b2lkIGFjZGJfcnRjX3NldF9lcnIodTMyIGVycl9jb2RlKTsKLQotCi1zdHJ1Y3QgaGVhZGVyIHsKLQl1MzIgZGJvcl9zaWduYXR1cmU7Ci0JdTMyIGFiaWQ7Ci0JdTMyIGlpZDsKLQl1MzIgZGF0YV9sZW47Ci19OwotCi1lbnVtIHsKLQlBQ0RCX0FHQ19CTE9DSwkJCT0gMTk3LAotCUFDREJfSUlSX0JMT0NLCQkJPSAyNDUsCi0JQUNEQl9NQkFEUkNfQkxPQ0sJCT0gMzQzCi19OwotCi0vKiBTdHJ1Y3R1cmUgdG8gcXVlcnkgZm9yIGFjZGIgcGFyYW1ldGVyICovCi1zdHJ1Y3QgYWNkYl9nZXRfYmxvY2sgewotCXUzMglhY2RiX2lkOwotCXUzMglzYW1wbGVfcmF0ZV9pZDsJCS8qIEFjdHVhbCBzYW1wbGUgcmF0ZSB2YWx1ZSAqLwotCXUzMglpbnRlcmZhY2VfaWQ7CQkvKiBJbnRlcmZhY2UgaWQncyAqLwotCXUzMglhbGdvcml0aG1fYmxvY2tfaWQ7CS8qIEFsZ29yaXRobSBibG9jayBpZCAqLwotCXUzMgl0b3RhbF9ieXRlczsJCS8qIExlbmd0aCBpbiBieXRlcyB1c2VkIGJ5IGJ1ZmZlciBmb3IKLQkJCQkJCWNvbmZpZ3VyYXRpb24gKi8KLQl1MzIJKmJ1Zl9wdHI7CQkvKiBBZGRyZXNzIGZvciBzdG9yaW5nIGNvbmZpZ3VyYXRpb24KLQkJCQkJCWRhdGEgKi8KLX07Ci0KLXN0cnVjdCBhY2RiX2FnY19ibG9jayB7Ci0JdTE2CWVuYWJsZV9zdGF0dXM7Ci0JdTE2CWNvbXBfcmxpbmtfc3RhdGljX2dhaW47Ci0JdTE2CWNvbXBfcmxpbmtfYWlnX2ZsYWc7Ci0JdTE2CWV4cF9ybGlua190aHJlc2hvbGQ7Ci0JdTE2CWV4cF9ybGlua19zbG9wZTsKLQl1MTYJY29tcF9ybGlua190aHJlc2hvbGQ7Ci0JdTE2CWNvbXBfcmxpbmtfc2xvcGU7Ci0JdTE2CWNvbXBfcmxpbmtfYWlnX2F0dGFja19rOwotCXUxNgljb21wX3JsaW5rX2FpZ19sZWFrX2Rvd247Ci0JdTE2CWNvbXBfcmxpbmtfYWlnX2xlYWtfdXA7Ci0JdTE2CWNvbXBfcmxpbmtfYWlnX21heDsKLQl1MTYJY29tcF9ybGlua19haWdfbWluOwotCXUxNgljb21wX3JsaW5rX2FpZ19yZWxlYXNlX2s7Ci0JdTE2CWNvbXBfcmxpbmtfYWlnX3NtX2xlYWtfcmF0ZV9mYXN0OwotCXUxNgljb21wX3JsaW5rX2FpZ19zbV9sZWFrX3JhdGVfc2xvdzsKLQl1MTYJY29tcF9ybGlua19hdHRhY2tfa19tc3c7Ci0JdTE2CWNvbXBfcmxpbmtfYXR0YWNrX2tfbHN3OwotCXUxNgljb21wX3JsaW5rX2RlbGF5OwotCXUxNgljb21wX3JsaW5rX3JlbGVhc2Vfa19tc3c7Ci0JdTE2CWNvbXBfcmxpbmtfcmVsZWFzZV9rX2xzdzsKLQl1MTYJY29tcF9ybGlua19ybXNfdHJhdjsKLX07Ci0KLQotc3RydWN0IGlpcl9jb2VmZl90eXBlIHsKLQl1MTYJYjBfbG87Ci0JdTE2CWIwX2hpOwotCXUxNgliMV9sbzsKLQl1MTYJYjFfaGk7Ci0JdTE2CWIyX2xvOwotCXUxNgliMl9oaTsKLX07Ci0KLXN0cnVjdCBpaXJfY29lZmZfc3RhZ2VfYSB7Ci0JdTE2CWExX2xvOwotCXUxNglhMV9oaTsKLQl1MTYJYTJfbG87Ci0JdTE2CWEyX2hpOwotfTsKLQotc3RydWN0IGFjZGJfaWlyX2Jsb2NrIHsKLQl1MTYJCQllbmFibGVfZmxhZzsKLQl1MTYJCQlzdGFnZV9jb3VudDsKLQlzdHJ1Y3QgaWlyX2NvZWZmX3R5cGUJc3RhZ2VzWzRdOwotCXN0cnVjdCBpaXJfY29lZmZfc3RhZ2VfYSBzdGFnZXNfYVs0XTsKLQl1MTYJCQlzaGlmdF9mYWN0b3JbNF07Ci0JdTE2CQkJcGFuWzRdOwotfTsKLQotc3RydWN0IG1iYWRyY19iYW5kX2NvbmZpZ190eXBlIHsKLQl1MTYJbWJhZHJjX3N1Yl9iYW5kX2VuYWJsZTsKLQl1MTYJbWJhZHJjX3N1Yl9tdXRlOwotCXUxNgltYmFkcmNfY29tcF9ybXNfdGF2OwotCXUxNgltYmFkcmNfY29tcF90aHJlc2hvbGQ7Ci0JdTE2CW1iYWRyY19jb21wX3Nsb3A7Ci0JdTE2CW1iYWRyY19jb21wX2F0dGFja19tc3c7Ci0JdTE2CW1iYWRyY19jb21wX2F0dGFja19sc3c7Ci0JdTE2CW1iYWRyY19jb21wX3JlbGVhc2VfbXN3OwotCXUxNgltYmFkcmNfY29tcF9yZWxlYXNlX2xzdzsKLQl1MTYJbWJhZHJjX21ha2VfdXBfZ2FpbjsKLX07Ci0KLXN0cnVjdCBtYmFkcmNfcGFyYW1ldGVyIHsKLQl1MTYJCQkJbWJhZHJjX2VuYWJsZTsKLQl1MTYJCQkJbWJhZHJjX251bV9iYW5kczsKLQl1MTYJCQkJbWJhZHJjX2Rvd25fc2FtcGxlX2xldmVsOwotCXUxNgkJCQltYmFkcmNfZGVsYXk7Ci19OwotCi1zdHJ1Y3QgYWNkYl9tYmFkcmNfYmxvY2sgewotCXUxNgkJCQlleHRfYnVmWzE5Nl07Ci0Jc3RydWN0IG1iYWRyY19iYW5kX2NvbmZpZ190eXBlCWJhbmRfY29uZmlnWzVdOwotCXN0cnVjdCBtYmFkcmNfcGFyYW1ldGVyCQlwYXJhbWV0ZXJzOwotfTsKLQotc3RydWN0IGFjZGJfbnNfdHhfYmxvY2sgewotCXVuc2lnbmVkIHNob3J0CWVjX21vZGVfbmV3OwotCXVuc2lnbmVkIHNob3J0CWRlbnNfZ2FtbWFfbjsKLQl1bnNpZ25lZCBzaG9ydAlkZW5zX25mZV9ibG9ja19zaXplOwotCXVuc2lnbmVkIHNob3J0CWRlbnNfbGltaXRfbnM7Ci0JdW5zaWduZWQgc2hvcnQJZGVuc19saW1pdF9uc19kOwotCXVuc2lnbmVkIHNob3J0CXdiX2dhbW1hX2U7Ci0JdW5zaWduZWQgc2hvcnQJd2JfZ2FtbWFfbjsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1YXVkcGxheWNtZGkuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWF1ZHBsYXljbWRpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZWU1NDkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1YXVkcGxheWNtZGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0jaWZuZGVmIFFEU1A1QVVEUExBWUNNRElfSAotI2RlZmluZSBRRFNQNUFVRFBMQVlDTURJX0gKLQotLyo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSoKLQotICAgICAgIFEgRCBTIFAgNSAgQSBVIEQgSSBPICAgUCBMIEEgWSAgVCBBIFMgSyAgIEMgTyBNIE0gQSBOIEQgUwotCi1HRU5FUkFMIERFU0NSSVBUSU9OCi0gIENvbW1hbmQgSW50ZXJmYWNlIGZvciBBVURQTEFZVEFTSyBvbiBRRFNQNQotCi1SRUZFUkVOQ0VTCi0gIE5vbmUKLQotRVhURVJOQUxJWkVEIEZVTkNUSU9OUwotCi0gIGF1ZHBsYXlfY21kX2RlY19kYXRhX2F2YWlsCi0gICAgU2VuZCBidWZmZXIgdG8gQVVEUExBWSB0YXNrCi0JCi0gIAotQ29weXJpZ2h0IChjKSAxOTkyLTIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAKLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCi0KLVRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUuCi1Ob3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgotCi0kSGVhZGVyOiAvL3NvdXJjZS9xY29tL3FjdC9tdWx0aW1lZGlhMi9BdWRpby9kcml2ZXJzL1FEU1A1RHJpdmVyL1FEU1A1SW50ZXJmYWNlL21haW4vbGF0ZXN0L3Fkc3A1YXVkcGxheWNtZGkuaCMyICQKLSAgCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jZGVmaW5lIEFVRFBMQVlfQ01EX0JJVFNUUkVBTV9EQVRBX0FWQUlMCQkweDAwMDAKLSNkZWZpbmUgQVVEUExBWV9DTURfQklUU1RSRUFNX0RBVEFfQVZBSUxfTEVOCVwKLQlzaXplb2YoYXVkcGxheV9jbWRfYml0c3RyZWFtX2RhdGFfYXZhaWwpCi0KLS8qIFR5cGUgc3BlY2lmaWNhdGlvbiBvZiBkZWNfZGF0YV9hdmFpbCBtZXNzYWdlIHNlbnQgdG8gQVVEUExBWVRBU0sKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qY29tbWFuZCBJRCovCi0gIHVuc2lnbmVkIGludCBjbWRfaWQ7ICAgICAgICAKLQotICAvKiBEZWNvZGVyIElEIGZvciB3aGljaCBtZXNzYWdlIGlzIGJlaW5nIHNlbnQgKi8KLSAgdW5zaWduZWQgaW50IGRlY29kZXJfaWQ7ICAgICAgICAKLQotICAvKiBTdGFydCBhZGRyZXNzIG9mIGRhdGEgaW4gQVJNIGdsb2JhbCBtZW1vcnkgKi8KLSAgdW5zaWduZWQgaW50IGJ1Zl9wdHI7ICAgIAotCi0gIC8qIE51bWJlciBvZiAxNi1iaXQgd29yZHMgb2YgYml0LXN0cmVhbSBkYXRhIGNvbnRpZ3VvdXNseSBhdmFpbGFibGUgYXQgdGhlCi0gICAqIGFib3ZlLW1lbnRpb25lZCBhZGRyZXNzIAotICAgKi8KLSAgdW5zaWduZWQgaW50IGJ1Zl9zaXplOwotICAgICAgICAgIAotICAvKiBQYXJ0aXRpb24gbnVtYmVyIHVzZWQgYnkgYXVkUGxheVRhc2sgdG8gY29tbXVuaWNhdGUgd2l0aCBEU1AncyBSVE9TCi0gICAqIGtlcm5lbCAKLSAgKi8KLSAgdW5zaWduZWQgaW50IHBhcnRpdGlvbl9udW1iZXI7ICAgIAotCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGF1ZHBsYXlfY21kX2JpdHN0cmVhbV9kYXRhX2F2YWlsOwotCi0jZGVmaW5lIEFVRFBMQVlfQ01EX0hQQ01fQlVGX0NGRyAweDAwMDMKLSNkZWZpbmUgQVVEUExBWV9DTURfSFBDTV9CVUZfQ0ZHX0xFTiBcCi0gIHNpemVvZihzdHJ1Y3QgYXVkcGxheV9jbWRfaHBjbV9idWZfY2ZnKQotCi1zdHJ1Y3QgYXVkcGxheV9jbWRfaHBjbV9idWZfY2ZnIHsKLSAgdW5zaWduZWQgaW50IGNtZF9pZDsKLSAgdW5zaWduZWQgaW50IGhvc3RwY21fY29uZmlnOwotICB1bnNpZ25lZCBpbnQgZmVlZGJhY2tfZnJlcXVlbmN5OwotICB1bnNpZ25lZCBpbnQgYnl0ZV9zd2FwOwotICB1bnNpZ25lZCBpbnQgbWF4X2J1ZmZlcnM7Ci0gIHVuc2lnbmVkIGludCBwYXJ0aXRpb25fbnVtYmVyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2RlZmluZSBBVURQTEFZX0NNRF9CVUZGRVJfUkVGUkVTSCAweDAwMDQKLSNkZWZpbmUgQVVEUExBWV9DTURfQlVGRkVSX1JFRlJFU0hfTEVOIFwKLSAgc2l6ZW9mKHN0cnVjdCBhdWRwbGF5X2NtZF9idWZmZXJfdXBkYXRlKQotCi1zdHJ1Y3QgYXVkcGxheV9jbWRfYnVmZmVyX3JlZnJlc2ggewotICB1bnNpZ25lZCBpbnQgY21kX2lkOwotICB1bnNpZ25lZCBpbnQgbnVtX2J1ZmZlcnM7Ci0gIHVuc2lnbmVkIGludCBidWZfcmVhZF9jb3VudDsKLSAgdW5zaWduZWQgaW50IGJ1ZjBfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IGJ1ZjBfbGVuZ3RoOwotICB1bnNpZ25lZCBpbnQgYnVmMV9hZGRyZXNzOwotICB1bnNpZ25lZCBpbnQgYnVmMV9sZW5ndGg7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZGVmaW5lIEFVRFBMQVlfQ01EX0JJVFNUUkVBTV9EQVRBX0FWQUlMX05UMiAgICAgICAgICAgIDB4MDAwNQotI2RlZmluZSBBVURQTEFZX0NNRF9CSVRTVFJFQU1fREFUQV9BVkFJTF9OVDJfTEVOICAgIFwKLQlzaXplb2YoYXVkcGxheV9jbWRfYml0c3RyZWFtX2RhdGFfYXZhaWxfbnQyKQotCi0vKiBUeXBlIHNwZWNpZmljYXRpb24gb2YgZGVjX2RhdGFfYXZhaWwgbWVzc2FnZSBzZW50IHRvIEFVRFBMQVlUQVNLCi0gKiBmb3IgTlQyICovCi1zdHJ1Y3QgYXVkcGxheV9jbWRfYml0c3RyZWFtX2RhdGFfYXZhaWxfbnQyIHsKLSAgLypjb21tYW5kIElEKi8KLSAgdW5zaWduZWQgaW50IGNtZF9pZDsKLQotICAvKiBEZWNvZGVyIElEIGZvciB3aGljaCBtZXNzYWdlIGlzIGJlaW5nIHNlbnQgKi8KLSAgdW5zaWduZWQgaW50IGRlY29kZXJfaWQ7Ci0KLSAgLyogU3RhcnQgYWRkcmVzcyBvZiBkYXRhIGluIEFSTSBnbG9iYWwgbWVtb3J5ICovCi0gIHVuc2lnbmVkIGludCBidWZfcHRyOwotCi0gIC8qIE51bWJlciBvZiAxNi1iaXQgd29yZHMgb2YgYml0LXN0cmVhbSBkYXRhIGNvbnRpZ3VvdXNseSBhdmFpbGFibGUgYXQgdGhlCi0gICAqIGFib3ZlLW1lbnRpb25lZCBhZGRyZXNzCi0gICAqLwotICB1bnNpZ25lZCBpbnQgYnVmX3NpemU7Ci0KLSAgLyogUGFydGl0aW9uIG51bWJlciB1c2VkIGJ5IGF1ZFBsYXlUYXNrIHRvIGNvbW11bmljYXRlIHdpdGggRFNQJ3MgUlRPUwotICAgKiBrZXJuZWwKLSAgICovCi0gIHVuc2lnbmVkIGludCBwYXJ0aXRpb25fbnVtYmVyOwotCi0gLyogYml0c3RyZWFtIHdyaXRlIHBvaW50ZXIgKi8KLSAgdW5zaWduZWQgaW50IGRzcEJpdHN0cmVhbVdyaXRlUHRyOwotCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZW5kaWYgLyogUURTUDVBVURQTEFZQ01EX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWF1ZHBsYXltc2cuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWF1ZHBsYXltc2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc5NTU0YS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDVhdWRwbGF5bXNnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0jaWZuZGVmIFFEU1A1QVVEUExBWU1TR19ICi0jZGVmaW5lIFFEU1A1QVVEUExBWU1TR19ICi0KLS8qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qCi0KLSAgICAgICBRIEQgUyBQIDUgIEEgVSBEIEkgTyAgIFAgTCBBIFkgIFQgQSBTIEsgICBNIFMgRwotCi1HRU5FUkFMIERFU0NSSVBUSU9OCi0gIE1lc3NhZ2Ugc2VudCBieSBBVURQTEFZIHRhc2sKLQotUkVGRVJFTkNFUwotICBOb25lCi0KLSAgCi1Db3B5cmlnaHQgKGMpIDE5OTItMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi1tYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotIAotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotKj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Ki8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKLQotVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZS4KLU5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCi0gIAotJEhlYWRlcjogLy9zb3VyY2UvcWNvbS9xY3QvbXVsdGltZWRpYTIvQXVkaW8vZHJpdmVycy9RRFNQNURyaXZlci9RRFNQNUludGVyZmFjZS9tYWluL2xhdGVzdC9xZHNwNWF1ZHBsYXltc2cuaCMzICQKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLSNkZWZpbmUgQVVEUExBWV9NU0dfREVDX05FRURTX0RBVEEJCTB4MDAwMQotI2RlZmluZSBBVURQTEFZX01TR19ERUNfTkVFRFNfREFUQV9NU0dfTEVOCVwKLQlzaXplb2YoYXVkcGxheV9tc2dfZGVjX25lZWRzX2RhdGEpCi0KLXR5cGVkZWYgc3RydWN0ewotICAgLyogcmVzZXJ2ZWQqLwotICB1bnNpZ25lZCBpbnQgZGVjX2lkOyAgICAgICAgICAgCi0KLSAgLypUaGUgcmVhZCBwb2ludGVyIG9mZnNldCBvZiBleHRlcm5hbCBtZW1vcnkgdGlsbCB3aGljaCBiaXRzdHJlYW0gCi0gICAgaGFzIGJlZW4gZG1lkmQgaW4qLwotICB1bnNpZ25lZCBpbnQgYWRlY0RhdGFSZWFkUHRyT2Zmc2V0OyAgCi0KLSAgLyoJVGhlIGJ1ZmZlciBzaXplIG9mIGV4dGVybmFsIG1lbW9yeS4gKi8KLSAgdW5zaWduZWQgaW50IGFkZWNEYXRhQnVmU2l6ZTsKLSAgCi0gIHVuc2lnbmVkIGludCAJYml0c3RyZWFtX2ZyZWVfbGVuOwotICB1bnNpZ25lZCBpbnQJYml0c3RyZWFtX3dyaXRlX3B0cjsKLSAgdW5zaWduZWQgaW50CWJpdHN0YXJlbV9idWZfc3RhcnQ7Ci0gIHVuc2lnbmVkIGludAliaXRzdHJlYW1fYnVmX2xlbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcGxheV9tc2dfZGVjX25lZWRzX2RhdGE7Ci0KLSNkZWZpbmUgQVVEUExBWV9VUF9TVFJFQU1fSU5GTyAweDAwMDMKLSNkZWZpbmUgQVVEUExBWV9VUF9TVFJFQU1fSU5GT19MRU4gXAotICBzaXplb2Yoc3RydWN0IGF1ZHBsYXlfbXNnX3N0cmVhbV9pbmZvKQotCi1zdHJ1Y3QgYXVkcGxheV9tc2dfc3RyZWFtX2luZm8gewotICB1bnNpZ25lZCBpbnQgZGVjb2Rlcl9pZDsKLSAgdW5zaWduZWQgaW50IGNoYW5uZWxfaW5mbzsKLSAgdW5zaWduZWQgaW50IHNhbXBsZV9mcmVxOwotICB1bnNpZ25lZCBpbnQgYml0c3RyZWFtX2luZm87Ci0gIHVuc2lnbmVkIGludCBiaXRfcmF0ZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgQVVEUExBWV9NU0dfQlVGRkVSX1VQREFURSAweDAwMDQKLSNkZWZpbmUgQVVEUExBWV9NU0dfQlVGRkVSX1VQREFURV9MRU4gXAotICBzaXplb2Yoc3RydWN0IGF1ZHBsYXlfbXNnX2J1ZmZlcl91cGRhdGUpCi0KLXN0cnVjdCBhdWRwbGF5X21zZ19idWZmZXJfdXBkYXRlIHsKLSAgdW5zaWduZWQgaW50IGJ1ZmZlcl93cml0ZV9jb3VudDsKLSAgdW5zaWduZWQgaW50IG51bV9vZl9idWZmZXI7Ci0gIHVuc2lnbmVkIGludCBidWYwX2FkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCBidWYwX2xlbmd0aDsKLSAgdW5zaWduZWQgaW50IGJ1ZjFfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IGJ1ZjFfbGVuZ3RoOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2RlZmluZSBBRFNQX01FU1NBR0VfSUQgMHhGRkZGCi0jZW5kaWYgLyogUURTUDVBVURQTEFZTVNHX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWF1ZHBwLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDVhdWRwcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmEzNmQ2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWF1ZHBwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKmFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1YXVkcHAuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0qLwotCi0jaWZuZGVmIF9NQUNIX1FEU1A1X0FVRFBQX0gKLSNkZWZpbmUgX01BQ0hfUURTUDVfQVVEUFBfSAotCi0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwY21kaS5oPgotCi10eXBlZGVmIHZvaWQgKCphdWRwcF9ldmVudF9mdW5jKSh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZyk7Ci0KLS8qIHdvcnN0IGNhc2UgZGVsYXkgb2YgMXNlYyBmb3IgcmVzcG9uc2UgKi8KLSNkZWZpbmUgTVNNX0FVRF9ERUNPREVSX1dBSVRfTVMgMTAwMAotI2RlZmluZSBNU01fQVVEX01PREVfVFVOTkVMICAweDAwMDAwMTAwCi0jZGVmaW5lIE1TTV9BVURfTU9ERV9OT05UVU5ORUwgIDB4MDAwMDAyMDAKLSNkZWZpbmUgTVNNX0FVRF9ERUNPREVSX01BU0sgIDB4MDAwMEZGRkYKLSNkZWZpbmUgTVNNX0FVRF9PUF9NQVNLICAweEZGRkYwMDAwCi0KLS8qUGxheWJhY2sgbW9kZSovCi0jZGVmaW5lIE5PTl9UVU5ORUxfTU9ERV9QTEFZQkFDSyAxCi0jZGVmaW5lIFRVTk5FTF9NT0RFX1BMQVlCQUNLIDAKLQotZW51bSBtc21fYXVkX2RlY29kZXJfc3RhdGUgewotCU1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FID0gMCwKLQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfRkFJTFVSRSA9IDEsCi0JTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1MgPSAyLAotCU1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRSA9IDMsCi19OwotCi1pbnQgYXVkcHBfYWRlY19hbGxvYyh1bnNpZ25lZCBkZWNfYXR0cmIsIGNvbnN0IGNoYXIgKiptb2R1bGVfbmFtZSwKLQkJCXVuc2lnbmVkICpxdWV1ZWlkKTsKLXZvaWQgYXVkcHBfYWRlY19mcmVlKGludCBkZWNpZCk7Ci0KLXN0cnVjdCBhdWRwcF9ldmVudF9jYWxsYmFjayB7Ci0JYXVkcHBfZXZlbnRfZnVuYyBmbjsKLQl2b2lkICpwcml2YXRlOwotfTsKLQotaW50IGF1ZHBwX3JlZ2lzdGVyX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBhdWRwcF9ldmVudF9jYWxsYmFjayAqZWgpOwotaW50IGF1ZHBwX3VucmVnaXN0ZXJfZXZlbnRfY2FsbGJhY2soc3RydWN0IGF1ZHBwX2V2ZW50X2NhbGxiYWNrICplaCk7Ci1pbnQgaXNfYXVkcHBfZW5hYmxlKHZvaWQpOwotCi1pbnQgYXVkcHBfZW5hYmxlKGludCBpZCwgYXVkcHBfZXZlbnRfZnVuYyBmdW5jLCB2b2lkICpwcml2YXRlKTsKLXZvaWQgYXVkcHBfZGlzYWJsZShpbnQgaWQsIHZvaWQgKnByaXZhdGUpOwotCi1pbnQgYXVkcHBfc2VuZF9xdWV1ZTEodm9pZCAqY21kLCB1bnNpZ25lZCBsZW4pOwotaW50IGF1ZHBwX3NlbmRfcXVldWUyKHZvaWQgKmNtZCwgdW5zaWduZWQgbGVuKTsKLWludCBhdWRwcF9zZW5kX3F1ZXVlMyh2b2lkICpjbWQsIHVuc2lnbmVkIGxlbik7Ci0KLWludCBhdWRwcF9zZXRfdm9sdW1lX2FuZF9wYW4odW5zaWduZWQgaWQsIHVuc2lnbmVkIHZvbHVtZSwgaW50IHBhbik7Ci1pbnQgYXVkcHBfcGF1c2UodW5zaWduZWQgaWQsIGludCBwYXVzZSk7Ci1pbnQgYXVkcHBfZmx1c2godW5zaWduZWQgaWQpOwotdm9pZCBhdWRwcF9hdnN5bmMoaW50IGlkLCB1bnNpZ25lZCByYXRlKTsKLXVuc2lnbmVkIGF1ZHBwX2F2c3luY19zYW1wbGVfY291bnQoaW50IGlkKTsKLXVuc2lnbmVkIGF1ZHBwX2F2c3luY19ieXRlX2NvdW50KGludCBpZCk7Ci1pbnQgYXVkcHBfZHNwX3NldF9tYmFkcmModW5zaWduZWQgaWQsIHVuc2lnbmVkIGVuYWJsZSwKLQkJCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19tYmFkcmMgKm1iYWRyYyk7Ci1pbnQgYXVkcHBfZHNwX3NldF9lcSh1bnNpZ25lZCBpZCwgdW5zaWduZWQgZW5hYmxlLAotCQkJYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyICplcSk7Ci1pbnQgYXVkcHBfZHNwX3NldF9yeF9paXIodW5zaWduZWQgaWQsIHVuc2lnbmVkIGVuYWJsZSwKLQkJCQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfcGNtICppaXIpOwotCi1pbnQgYXVkcHBfZHNwX3NldF9yeF9zcnNfdHJ1bWVkaWFfZwotCShzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3Nyc3RtX2cgKnNyc3RtKTsKLWludCBhdWRwcF9kc3Bfc2V0X3J4X3Nyc190cnVtZWRpYV93Ci0JKHN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3JzdG1fdyAqc3JzdG0pOwotaW50IGF1ZHBwX2RzcF9zZXRfcnhfc3JzX3RydW1lZGlhX2MKLQkoc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19zcnN0bV9jICpzcnN0bSk7Ci1pbnQgYXVkcHBfZHNwX3NldF9yeF9zcnNfdHJ1bWVkaWFfaAotCShzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3Nyc3RtX2ggKnNyc3RtKTsKLWludCBhdWRwcF9kc3Bfc2V0X3J4X3Nyc190cnVtZWRpYV9wCi0JKHN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3JzdG1fcCAqc3JzdG0pOwotaW50IGF1ZHBwX2RzcF9zZXRfcnhfc3JzX3RydW1lZGlhX2wKLQkoc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19zcnN0bV9sICpzcnN0bSk7Ci0KLWludCBhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4odW5zaWduZWQgaWQsCi0JCQkJYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3ZvbHVtZSAqdm9sX3Bhbik7Ci1pbnQgYXVkcHBfZHNwX3NldF9xY29uY2VydF9wbHVzKHVuc2lnbmVkIGlkLCB1bnNpZ25lZCBlbmFibGUsCi0JCQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfcWNvbmNlcnQgKnFjb25jZXJ0X3BsdXMpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWF1ZHBwY21kaS5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1YXVkcHBjbWRpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYjc3ZjQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1YXVkcHBjbWRpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc5ICswLDAgQEAKLSNpZm5kZWYgUURTUDVBVURQUENNRElfSAotI2RlZmluZSBRRFNQNUFVRFBQQ01ESV9ICi0KLS8qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qCi0KLSAgICBBIFUgRCBJIE8gICBQIE8gUyBUICAgUCBSIE8gQyBFIFMgUyBJIE4gRyAgSSBOIFQgRSBSIE4gQSBMICBDIE8gTSBNIEEgTiBEIFMKLQotR0VORVJBTCBERVNDUklQVElPTgotICBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW50aW9ucyBvZiBmb3JtYXQgYmxvY2tzIG9mIGNvbW1hbmRzIAotICB0aGF0IGFyZSBhY2NlcHRlZCBieSBBVURQUCBUYXNrCi0KLVJFRkVSRU5DRVMKLSAgTm9uZQotCi1FWFRFUk5BTElaRUQgRlVOQ1RJT05TCi0gIE5vbmUKLQotQ29weXJpZ2h0KGMpIDE5OTItMjAwOSwgMjAxMi0yMDEzIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAKLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCi0KLVRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUuCi1Ob3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgotICAgCi0kSGVhZGVyOiAvL3NvdXJjZS9xY29tL3FjdC9tdWx0aW1lZGlhMi9BdWRpby9kcml2ZXJzL1FEU1A1RHJpdmVyL1FEU1A1SW50ZXJmYWNlL21haW4vbGF0ZXN0L3Fkc3A1YXVkcHBjbWRpLmgjMiAkICAgCi0gIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyoKLSAqIEFSTSB0byBBVURQUFRBU0sgQ29tbWFuZHMgCi0gKgotICogQVJNIHVzZXMgdGhyZWUgY29tbWFuZCBxdWV1ZXMgdG8gY29tbXVuaWNhdGUgd2l0aCBBVURQUFRBU0sKLSAqIDEpdVBBdWRQUENtZDFRdWV1ZSA6IFVzZWQgZm9yIG1vcmUgZnJlcXVlbnQgYW5kIHNob3J0ZXIgbGVuZ3RoIGNvbW1hbmRzCi0gKiAJTG9jYXRpb24gOiBNRU1BCi0gKiAJQnVmZmVyIFNpemUgOiA2IHdvcmRzCi0gKiAJTm8gb2YgYnVmZmVycyBpbiBhIHF1ZXVlIDogMjAgZm9yIGdhbWluZyBhdWRpbyBhbmQgNSBmb3Igb3RoZXIgaW1hZ2VzCi0gKiAyKXVQQXVkUFBDbWQyUXVldWUgOiBVc2VkIGZvciBjb21tYW5kcyB3aGljaCBhcmUgbm90IG11Y2ggbGVuZ3RoaWVyCi0gKiAJTG9jYXRpb24gOiBNRU1BCi0gKiAJQnVmZmVyIFNpemUgOiAyMwotICogCU5vIG9mIGJ1ZmZlcnMgaW4gYSBxdWV1ZSA6IDIKLSAqIDMpdVBBdWRPT0NtZDNRdWV1ZSA6IFVzZWQgZm9yIGxlbmd0aGllciBhbmQgbW9yZSBmcmVxdWVudCBjb21tYW5kcwotICogCUxvY2F0aW9uIDogTUVNQQotICogCUJ1ZmZlciBTaXplIDogMTQ1Ci0gKiAJTm8gb2YgYnVmZmVycyBpbiBhIHF1ZXVlIDogMwotICovCi0KLS8qCi0gKiBDb21tYW5kcyBSZWxhdGVkIHRvIHVQQXVkUFBDbWQxUXVldWUKLSAqLwotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGFjdGl2ZSBkZWNvZGVycyAKLSAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfREVDX1RZUEUgCQkweDAwMDEKLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19ERUNfVFlQRV9MRU4gCXNpemVvZihhdWRwcF9jbWRfY2ZnX2RlY190eXBlKQotCi0vKiBFbmFibGUgdGhlIGRlY29kZXIgKi8KLSNkZWZpbmUgQVVEUFBfQ01EX0RFQ19UWVBFX00gICAgICAgICAgIAkweDAwMEYKLQotI2RlZmluZSBBVURQUF9DTURfRU5BX0RFQ19WICAgICAgICAgCTB4NDAwMAotI2RlZmluZSBBVURQUF9DTURfRElTX0RFQ19WICAgICAgICAJMHgwMDAwCi0jZGVmaW5lIEFVRFBQX0NNRF9ERUNfU1RBVEVfTSAgICAgICAgICAJMHg0MDAwCi0jZGVmaW5lIEFVRFBQX0NNRF9MUEFfTU9ERQkJMHgyMDAwCi0KLSNkZWZpbmUgQVVEUFBfQ01EX1VQREFUREVfQ0ZHX0RFQwkweDgwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX0RPTlRfVVBEQVRFX0NGR19ERUMJMHgwMDAwCi0KLQotLyogVHlwZSBzcGVjaWZpY2F0aW9uIG9mIGNtZF9jZmdfZGVjICovCi0gCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIHNob3J0IGNtZF9pZDsKLSAgdW5zaWduZWQgc2hvcnQgZGVjMF9jZmc7Ci0gIHVuc2lnbmVkIHNob3J0IGRlYzFfY2ZnOwotICB1bnNpZ25lZCBzaG9ydCBkZWMyX2NmZzsKLSAgdW5zaWduZWQgc2hvcnQgZGVjM19jZmc7Ci0gIHVuc2lnbmVkIHNob3J0IGRlYzRfY2ZnOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRwcF9jbWRfY2ZnX2RlY190eXBlOwotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gUGF1c2UgLCBSZXN1bWUgYW5kIGZsdXNoZXMgdGhlIHNlbGVjdGVkIGF1ZGlvIGRlY29kZXJzCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfREVDX0NUUkwJCTB4MDAwMgotI2RlZmluZSBBVURQUF9DTURfREVDX0NUUkxfTEVOCQlzaXplb2YoYXVkcHBfY21kX2RlY19jdHJsKQotCi0vKiBEZWNvZGVyIGNvbnRyb2wgY29tbWFuZHMgZm9yIHBhdXNlLCByZXN1bWUgYW5kIGZsdXNoICovCi0jZGVmaW5lIEFVRFBQX0NNRF9GTFVTSF9WICAgICAgICAgCQkweDIwMDAKLQotI2RlZmluZSBBVURQUF9DTURfUEFVU0VfVgkJICAgICAgICAweDQwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX1JFU1VNRV9WCQkgICAgICAgIDB4MDAwMAotCi0jZGVmaW5lIEFVRFBQX0NNRF9VUERBVEVfVgkJICAgICAgICAweDgwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX0lHTk9SRV9WCQkgICAgICAgIDB4MDAwMAotCi0KLS8qIFR5cGUgU3BlYyBmb3IgZGVjb2RlciBjb250cm9sIGNvbW1hbmQqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIHNob3J0IGNtZF9pZDsKLSAgdW5zaWduZWQgc2hvcnQgZGVjMF9jdHJsOwotICB1bnNpZ25lZCBzaG9ydCBkZWMxX2N0cmw7Ci0gIHVuc2lnbmVkIHNob3J0IGRlYzJfY3RybDsKLSAgdW5zaWduZWQgc2hvcnQgZGVjM19jdHJsOwotICB1bnNpZ25lZCBzaG9ydCBkZWM0X2N0cmw7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGF1ZHBwX2NtZF9kZWNfY3RybDsKLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIENvbmZpZ3VyZSB0aGUgQVZTeW5jIEZlZWRCYWNrIE1lY2hhbmlzbQotICovCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0FWU1lOQwkweDAwMDMKLSNkZWZpbmUgQVVEUFBfQ01EX0FWU1lOQ19MRU4Jc2l6ZW9mKGF1ZHBwX2NtZF9hdnN5bmMpCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydCBjbWRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQgb2JqZWN0X251bWJlcjsKLQl1bnNpZ25lZCBzaG9ydCBpbnRlcnJ1cHRfaW50ZXJ2YWxfbHN3OwotCXVuc2lnbmVkIHNob3J0IGludGVycnVwdF9pbnRlcnZhbF9tc3c7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGF1ZHBwX2NtZF9hdnN5bmM7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBlbmFibGUgb3IgZGlzYWJsZShzbGVlcCkgdGhlICAgQVVEUFBUQVNLIAotICovCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0NGRwkweDAwMDQKLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19MRU4Jc2l6ZW9mKGF1ZHBwX2NtZF9jZmcpCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19TTEVFUCAgIAkJCQkweDAwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19FTkFCTEUgIAkJCQkweEZGRkYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBzaG9ydCBjbWRfaWQ7Ci0gIHVuc2lnbmVkIHNob3J0IGNmZzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcHBfY21kX2NmZzsKLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIEluamVjdCBvciBkcm9wIHRoZSBzcGVjaWZpZWQgbm8gb2Ygc2FtcGxlcwotICovCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0FESlVTVF9TQU1QCQkweDAwMDUKLSNkZWZpbmUgQVVEUFBfQ01EX0FESlVTVF9TQU1QX0xFTglzaXplb2YoYXVkcHBfY21kX2FkanVzdF9zYW1wKQotCi0jZGVmaW5lIEFVRFBQX0NNRF9TQU1QX0RST1AJCS0xCi0jZGVmaW5lIEFVRFBQX0NNRF9TQU1QX0lOU0VSVAkJMHgwMDAxCi0KLSNkZWZpbmUgQVVEUFBfQ01EX05VTV9TQU1QTEVTCQkweDAwMDEKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0IGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCBvYmplY3Rfbm87Ci0Jc2lnbmVkIHNob3J0IHNhbXBsZV9pbnNlcnRfb3JfZHJvcDsKLQl1bnNpZ25lZCBzaG9ydCBudW1fc2FtcGxlczsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcHBfY21kX2FkanVzdF9zYW1wOwotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gQ29uZmlndXJlIEFWU3luYyBGZWVkYmFjayBNZWNoYW5pc20KLSAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9BVlNZTkNfQ01EXzIJCTB4MDAwNgotI2RlZmluZSBBVURQUF9DTURfQVZTWU5DX0NNRF8yX0xFTglzaXplb2YoYXVkcHBfY21kX2F2c3luY19jbWRfMikKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0IGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCBvYmplY3RfbnVtYmVyOwotCXVuc2lnbmVkIHNob3J0IGludGVycnVwdF9pbnRlcnZhbF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQgaW50ZXJydXB0X2ludGVydmFsX21zdzsKLQl1bnNpZ25lZCBzaG9ydCBzYW1wbGVfY291bnRlcl9kbHN3OwotCXVuc2lnbmVkIHNob3J0IHNhbXBsZV9jb3VudGVyX2Rtc3c7Ci0JdW5zaWduZWQgc2hvcnQgc2FtcGxlX2NvdW50ZXJfbXN3OwotCXVuc2lnbmVkIHNob3J0IGJ5dGVfY291bnRlcl9kbHN3OwotCXVuc2lnbmVkIHNob3J0IGJ5dGVfY291bnRlcl9kbXN3OwotCXVuc2lnbmVkIHNob3J0IGJ5dGVfY291bnRlcl9tc3c7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGF1ZHBwX2NtZF9hdnN5bmNfY21kXzI7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBDb25maWd1cmUgQVZTeW5jIEZlZWRiYWNrIE1lY2hhbmlzbQotICovCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0FWU1lOQ19DTURfMwkJMHgwMDA3Ci0jZGVmaW5lIEFVRFBQX0NNRF9BVlNZTkNfQ01EXzNfTEVOCXNpemVvZihhdWRwcF9jbWRfYXZzeW5jX2NtZF8zKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQgY21kX2lkOwotCXVuc2lnbmVkIHNob3J0IG9iamVjdF9udW1iZXI7Ci0JdW5zaWduZWQgc2hvcnQgaW50ZXJydXB0X2ludGVydmFsX2xzdzsKLQl1bnNpZ25lZCBzaG9ydCBpbnRlcnJ1cHRfaW50ZXJ2YWxfbXN3OwotCXVuc2lnbmVkIHNob3J0IHNhbXBsZV9jb3VudGVyX2Rsc3c7Ci0JdW5zaWduZWQgc2hvcnQgc2FtcGxlX2NvdW50ZXJfZG1zdzsKLQl1bnNpZ25lZCBzaG9ydCBzYW1wbGVfY291bnRlcl9tc3c7Ci0JdW5zaWduZWQgc2hvcnQgYnl0ZV9jb3VudGVyX2Rsc3c7Ci0JdW5zaWduZWQgc2hvcnQgYnl0ZV9jb3VudGVyX2Rtc3c7Ci0JdW5zaWduZWQgc2hvcnQgYnl0ZV9jb3VudGVyX21zdzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcHBfY21kX2F2c3luY19jbWRfMzsKLQotI2RlZmluZSBBVURQUF9DTURfUk9VVElOR19NT0RFICAgICAgMHgwMDA4Ci0jZGVmaW5lIEFVRFBQX0NNRF9ST1VUSU5HX01PREVfTEVOICBcCi1zaXplb2Yoc3RydWN0IGF1ZHBwX2NtZF9yb3V0aW5nX21vZGUpCi0KLXN0cnVjdCBhdWRwcF9jbWRfcm91dGluZ19tb2RlIHsKLSAgdW5zaWduZWQgc2hvcnQgY21kX2lkOwotICB1bnNpZ25lZCBzaG9ydCBvYmplY3RfbnVtYmVyOwotICB1bnNpZ25lZCBzaG9ydCByb3V0aW5nX21vZGU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogQ29tbWFuZHMgUmVsYXRlZCB0byB1UEF1ZFBQQ21kMlF1ZXVlCi0gKi8KLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSBQZXIgZGVjb2RlciBQYXJhbWV0ZXJzIChDb21tb24pCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TIAkJMHgwMDAwCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVNfQ09NTU9OX0xFTglcCi0Jc2l6ZW9mKGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfY29tbW9uKQotCi0jZGVmaW5lIEFVRFBQX0NNRF9TVEFUVVNfTVNHX0ZMQUdfRU5BX0ZDTQkweDQwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX1NUQVRVU19NU0dfRkxBR19ESVNfRkNNCTB4MDAwMAotCi0jZGVmaW5lIEFVRFBQX0NNRF9TVEFUVVNfTVNHX0ZMQUdfRU5BX0RDTQkweDgwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX1NUQVRVU19NU0dfRkxBR19ESVNfRENNCTB4MDAwMAotCi0vKiBTYW1wbGluZyBmcmVxdWVuY3kqLwotI2RlZmluZSAgQVVEUFBfQ01EX1NBTVBfUkFURV85NjAwMCAJMHgwMDAwCi0jZGVmaW5lICBBVURQUF9DTURfU0FNUF9SQVRFXzg4MjAwIAkweDAwMDEKLSNkZWZpbmUgIEFVRFBQX0NNRF9TQU1QX1JBVEVfNjQwMDAgCTB4MDAwMgotI2RlZmluZSAgQVVEUFBfQ01EX1NBTVBfUkFURV80ODAwMCAJMHgwMDAzCi0jZGVmaW5lICBBVURQUF9DTURfU0FNUF9SQVRFXzQ0MTAwIAkweDAwMDQKLSNkZWZpbmUgIEFVRFBQX0NNRF9TQU1QX1JBVEVfMzIwMDAgCTB4MDAwNQotI2RlZmluZSAgQVVEUFBfQ01EX1NBTVBfUkFURV8yNDAwMCAJMHgwMDA2Ci0jZGVmaW5lICBBVURQUF9DTURfU0FNUF9SQVRFXzIyMDUwIAkweDAwMDcKLSNkZWZpbmUgIEFVRFBQX0NNRF9TQU1QX1JBVEVfMTYwMDAgCTB4MDAwOAotI2RlZmluZSAgQVVEUFBfQ01EX1NBTVBfUkFURV8xMjAwMCAJMHgwMDA5Ci0jZGVmaW5lICBBVURQUF9DTURfU0FNUF9SQVRFXzExMDI1IAkweDAwMEEKLSNkZWZpbmUgIEFVRFBQX0NNRF9TQU1QX1JBVEVfODAwMCAgCTB4MDAwQgotCi0KLS8qIAotICogVHlwZSBzcGVjaWZpY2F0aW9uIG9mIGNtZF9hZGVjX2NmZyBzZW50IHRvIGFsbCBkZWNvZGVyCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBzaG9ydCBjbWRfaWQ7Ci0gIHVuc2lnbmVkIHNob3J0ICBsZW5ndGg7Ci0gIHVuc2lnbmVkIHNob3J0ICBkZWNfaWQ7Ci0gIHVuc2lnbmVkIHNob3J0ICBzdGF0dXNfbXNnX2ZsYWc7Ci0gIHVuc2lnbmVkIHNob3J0ICBkZWNvZGVyX2ZyYW1lX2NvdW50ZXJfbXNnX3BlcmlvZDsKLSAgdW5zaWduZWQgc2hvcnQgIGlucHV0X3NhbXBsaW5nX2ZyZXF1ZW5jeTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19jb21tb247Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBjb25maWd1cmUgUGVyIGRlY29kZXIgUGFyYW1ldGVycyAoV2F2KQotICovCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNU19XQVZfTEVOCVwKLQlzaXplb2YoYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc193YXYpCi0KLQotI2RlZmluZQlBVURQUF9DTURfV0FWX1NURVJFT19DRkdfTU9OTwkweDAwMDEKLSNkZWZpbmUgQVVEUFBfQ01EX1dBVl9TVEVSRU9fQ0ZHX1NURVJFTwkweDAwMDIKLQotI2RlZmluZSBBVURQUF9DTURfV0FWX1BDTV9XSURUSF84CTB4MDAwMAotI2RlZmluZSBBVURQUF9DTURfV0FWX1BDTV9XSURUSF8xNgkweDAwMDEKLSNkZWZpbmUgQVVEUFBfQ01EX1dBVl9QQ01fV0lEVEhfMjQJMHgwMDAyCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX2NvbW1vbgkJY29tbW9uOwotCXVuc2lnbmVkIHNob3J0CQkJCQlzdGVyZW9fY2ZnOwotCXVuc2lnbmVkIHNob3J0CQkJCQlwY21fd2lkdGg7Ci0JdW5zaWduZWQgc2hvcnQgCQkJCQlzaWduOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX3dhdjsKLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSBQZXIgZGVjb2RlciBQYXJhbWV0ZXJzIChBRFBDTSkKLSAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVNfQURQQ01fTEVOCVwKLQlzaXplb2YoYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19hZHBjbSkKLQotCi0jZGVmaW5lCUFVRFBQX0NNRF9BRFBDTV9TVEVSRU9fQ0ZHX01PTk8JCTB4MDAwMQotI2RlZmluZSBBVURQUF9DTURfQURQQ01fU1RFUkVPX0NGR19TVEVSRU8JMHgwMDAyCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX2NvbW1vbgkJY29tbW9uOwotCXVuc2lnbmVkIHNob3J0CQkJCQlzdGVyZW9fY2ZnOwotCXVuc2lnbmVkIHNob3J0IAkJCQkJYmxvY2tfc2l6ZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19hZHBjbTsKLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSBQZXIgZGVjb2RlciBQYXJhbWV0ZXJzIChXTUEpCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TX1dNQV9MRU4JXAotCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc193bWEpCi0KLXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX3dtYSB7Ci0JYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19jb21tb24gICAgY29tbW9uOwotCXVuc2lnbmVkIHNob3J0IAlhcm1kYXRhcmVxdGhyOwotCXVuc2lnbmVkIHNob3J0IAljaGFubmVsc2RlY29kZWQ7Ci0JdW5zaWduZWQgc2hvcnQgCXdtYWJ5dGVzcGVyc2VjOwotCXVuc2lnbmVkIHNob3J0CXdtYXNhbXBsaW5nZnJlcTsKLQl1bnNpZ25lZCBzaG9ydAl3bWFlbmNvZGVyb3B0czsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBjb25maWd1cmUgUGVyIGRlY29kZXIgUGFyYW1ldGVycyAoV01BUFJPKQotICovCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNU19XTUFQUk9fTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfd21hcHJvKQotCi1zdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc193bWFwcm8gewotCWF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfY29tbW9uICAgIGNvbW1vbjsKLQl1bnNpZ25lZCBzaG9ydCAJYXJtZGF0YXJlcXRocjsKLQl1aW50OF90ICAgICAgICAgdmFsaWRiaXRzcGVyc2FtcGxlOwotCXVpbnQ4X3QgICAgICAgICBudW1jaGFubmVsczsKLQl1bnNpZ25lZCBzaG9ydCAgZm9ybWF0dGFnOwotCXVuc2lnbmVkIHNob3J0ICBzYW1wbGluZ3JhdGU7Ci0JdW5zaWduZWQgc2hvcnQgIGF2Z2J5dGVzcGVyc2Vjb25kOwotCXVuc2lnbmVkIHNob3J0ICBhc2ZwYWNrZXRsZW5ndGg7Ci0JdW5zaWduZWQgc2hvcnQgCWNoYW5uZWxtYXNrOwotCXVuc2lnbmVkIHNob3J0IAllbmNvZGVvcHQ7Ci0JdW5zaWduZWQgc2hvcnQJYWR2YW5jZWRlbmNvZGVvcHQ7Ci0JdWludDMyX3QJYWR2YW5jZWRlbmNvZGVvcHQyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSBQZXIgZGVjb2RlciBQYXJhbWV0ZXJzIChNUDMpCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TX01QM19MRU4JXAotCXNpemVvZihhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX21wMykKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19jb21tb24gICAgY29tbW9uOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX21wMzsKLQotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gY29uZmlndXJlIFBlciBkZWNvZGVyIFBhcmFtZXRlcnMgKEFBQykKLSAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVNfQUFDX0xFTglcCi0Jc2l6ZW9mKGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfYWFjKQotCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0FBQ19GT1JNQVRfQURUUwkJLTEKLSNkZWZpbmUJQVVEUFBfQ01EX0FBQ19GT1JNQVRfUkFXCQkweDAwMDAKLSNkZWZpbmUJQVVEUFBfQ01EX0FBQ19GT1JNQVRfUFNVRURPX1JBVwkJMHgwMDAxCi0jZGVmaW5lCUFVRFBQX0NNRF9BQUNfRk9STUFUX0xPQVMJCTB4MDAwMgotCi0jZGVmaW5lIEFVRFBQX0NNRF9BQUNfQVVESU9fT0JKRUNUX0xDCQkweDAwMDIKLSNkZWZpbmUgQVVEUFBfQ01EX0FBQ19BVURJT19PQkpFQ1RfTFRQCQkweDAwMDQKLSNkZWZpbmUgQVVEUFBfQ01EX0FBQ19BVURJT19PQkpFQ1RfRVJMQwkweDAwMTEKLQotI2RlZmluZSBBVURQUF9DTURfQUFDX1NCUl9PTl9GTEFHX09OCQkweDAwMDEKLSNkZWZpbmUgQVVEUFBfQ01EX0FBQ19TQlJfT05fRkxBR19PRkYJCTB4MDAwMAotCi0jZGVmaW5lIEFVRFBQX0NNRF9BQUNfU0JSX1BTX09OX0ZMQUdfT04JCTB4MDAwMQotI2RlZmluZSBBVURQUF9DTURfQUFDX1NCUl9QU19PTl9GTEFHX09GRgkweDAwMDAKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX2NvbW1vbgljb21tb247Ci0gIHNpZ25lZCBzaG9ydAkJCQlmb3JtYXQ7Ci0gIHVuc2lnbmVkIHNob3J0CQkJYXVkaW9fb2JqZWN0OwotICB1bnNpZ25lZCBzaG9ydAkJCWVwX2NvbmZpZzsKLSAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgICAgICAgICBhYWNfc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKLSAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgICAgICAgICBhYWNfc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0gIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgYWFjX3NwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZV9mbGFnOwotICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgIHNicl9vbl9mbGFnOwotICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgIHNicl9wc19vbl9mbGFnOwotICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfY29uZmlndXJhdGlvbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19hYWM7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBjb25maWd1cmUgUGVyIGRlY29kZXIgUGFyYW1ldGVycyAoVjEzSykKLSAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVNfVjEzS19MRU4JXAotCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc192MTNrKQotCi0KLSNkZWZpbmUgQVVEUFBfQ01EX1NURVJFT19DRkdfTU9OTwkJMHgwMDAxCi0jZGVmaW5lIEFVRFBQX0NNRF9TVEVSRU9fQ0ZHX1NURVJFTwkJMHgwMDAyCi0KLXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX3YxM2sgewotICAgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19jb21tb24gICAgCWNvbW1vbjsKLSAgIHVuc2lnbmVkIHNob3J0CQkJc3RlcmVvX2NmZzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNU19FVlJDX0xFTiBcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX2V2cmMpCi0KLXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX2V2cmMgewotCWF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfY29tbW9uIGNvbW1vbjsKLQl1bnNpZ25lZCBzaG9ydCBzdGVyZW9fY2ZnOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBjb25maWd1cmUgUGVyIGRlY29kZXIgUGFyYW1ldGVycyAoQU1SV0IpCi0gKi8KLSNkZWZpbmUgQURFQ19QQVJBTVNfQUMzX0lOREVYIDE0Ci0KLXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX2FtcndiIHsKLQkgICBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX2NvbW1vbiAgICAgY29tbW9uOwotCSAgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9fY2ZnOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSA7Ci0KLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNU19BTVJXQl9MRU4gXAotCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19hbXJ3YikKLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSBQZXIgZGVjb2RlciBQYXJhbWV0ZXJzIChBQzMpCi0gKi8KLQotc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfYWMzIHsKLQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX2NvbW1vbgljb21tb247Ci0JdW5zaWduZWQgc2hvcnQJCQkJaW5kZXhbQURFQ19QQVJBTVNfQUMzX0lOREVYXTsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNU19BQzNfTEVOIFwKLQlzaXplb2Yoc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfYWMzKQotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gY29uZmlndXJlIHRoZSAgSE9TVCBQQ00gaW50ZXJmYWNlCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfUENNX0lOVEYJMHgwMDAxCi0jZGVmaW5lIEFVRFBQX0NNRF9QQ01fSU5URl8yCTB4MDAwMgotI2RlZmluZSBBVURQUF9DTURfUENNX0lOVEZfTEVOCXNpemVvZihhdWRwcF9jbWRfcGNtX2ludGYpCi0KLSNkZWZpbmUgQVVEUFBfQ01EX1BDTV9JTlRGX01PTk9fVgkJICAgICAgICAweDAwMDEKLSNkZWZpbmUgQVVEUFBfQ01EX1BDTV9JTlRGX1NURVJFT19WICAgICAgICAgCTB4MDAwMgotCi0vKiBUaGVzZSB0d28gdmFsdWVzIGRpZmZlcmVudGlhdGUgdGhlIHR3byB0eXBlcyBvZiBjb21tYW5kcyB0aGF0IGNvdWxkIGJlIGlzc3VlZAotICogSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gY29tbWFuZCBhbmQgQnVmZmVyIHVwZGF0ZSBjb21tYW5kICovCi0KLSNkZWZpbmUgQVVEUFBfQ01EX1BDTV9JTlRGX0NPTkZJR19DTURfVgkgICAgICAgCTB4MDAwMAotI2RlZmluZSBBVURQUF9DTURfUENNX0lOVEZfQlVGRkVSX0NNRF9WCSAgICAgICAgLTEKLQotI2RlZmluZSBBVURQUF9DTURfUENNX0lOVEZfUlhfRU5BX00gICAgICAgICAgICAgIDB4MDAwRgotI2RlZmluZSBBVURQUF9DTURfUENNX0lOVEZfUlhfRU5BX0FSTVRPRFNQX1YgICAgIDB4MDAwOAotI2RlZmluZSBBVURQUF9DTURfUENNX0lOVEZfUlhfRU5BX0RTUFRPQVJNX1YgICAgIDB4MDAwNAotCi0vKiBUaGVzZSBmbGFncyBjb250cm9sIHRoZSBlbmFibGluZyBhbmQgZGlzYWJsaW5nIG9mIHRoZSBpbnRlcmZhY2UgdG9nZXRoZXIKLSAqICB3aXRoIGhvc3QgaW50ZXJmYWNlIGJpdCBtYXNrLiAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9QQ01fSU5URl9FTkFfViAgICAgICAgICAgIC0xCi0jZGVmaW5lIEFVRFBQX0NNRF9QQ01fSU5URl9ESVNfViAgICAgICAgICAgIDB4MDAwMAotCi0KLSNkZWZpbmUgIEFVRFBQX0NNRF9QQ01fSU5URl9GVUxMX0RVUExFWCAgICAgICAgICAgMHgwCi0jZGVmaW5lICBBVURQUF9DTURfUENNX0lOVEZfSEFMRl9EVVBMRVhfVE9EU1AgICAgIDB4MQotCi0KLSNkZWZpbmUgIEFVRFBQX0NNRF9QQ01fSU5URl9PQkpFQ1RfTlVNICAgICAgICAgICAweDUKLSNkZWZpbmUgIEFVRFBQX0NNRF9QQ01fSU5URl9DT01NT05fT0JKRUNUX05VTSAgICAweDYKLSAgCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgc2hvcnQgIGNtZF9pZDsKLSAgdW5zaWduZWQgc2hvcnQgIG9iamVjdF9udW07Ci0gIHNpZ25lZCBzaG9ydCAgY29uZmlnOwotICB1bnNpZ25lZCBzaG9ydCAgaW50Zl90eXBlOwotICAKLSAgLyogRFNQIC0+IEFSTSBDb25maWd1cmF0aW9uICovCi0gIHVuc2lnbmVkIHNob3J0ICByZWFkX2J1ZjFMU1c7Ci0gIHVuc2lnbmVkIHNob3J0ICByZWFkX2J1ZjFNU1c7Ci0gIHVuc2lnbmVkIHNob3J0ICByZWFkX2J1ZjFfbGVuOwotCi0gIHVuc2lnbmVkIHNob3J0ICByZWFkX2J1ZjJMU1c7Ci0gIHVuc2lnbmVkIHNob3J0ICByZWFkX2J1ZjJNU1c7Ci0gIHVuc2lnbmVkIHNob3J0ICByZWFkX2J1ZjJfbGVuOwotICAvKiAgIDA6SE9TVF9QQ01fSU5URiBkaXNhYmxlCi0gICAqKiAgMHhGRkZGOiBIT1NUX1BDTV9JTlRGIGVuYWJsZQotICAgKi8KLSAgc2lnbmVkIHNob3J0ICBkc3BfdG9fYXJtX2ZsYWc7Ci0gIHVuc2lnbmVkIHNob3J0ICBwYXJ0aXRpb25fbnVtYmVyOwotCi0gIC8qIEFSTSAtPiBEU1AgQ29uZmlndXJhdGlvbiAqLwotICB1bnNpZ25lZCBzaG9ydCAgd3JpdGVfYnVmMUxTVzsKLSAgdW5zaWduZWQgc2hvcnQgIHdyaXRlX2J1ZjFNU1c7Ci0gIHVuc2lnbmVkIHNob3J0ICB3cml0ZV9idWYxX2xlbjsKLSAKLSAgdW5zaWduZWQgc2hvcnQgIHdyaXRlX2J1ZjJMU1c7Ci0gIHVuc2lnbmVkIHNob3J0ICB3cml0ZV9idWYyTVNXOwotICB1bnNpZ25lZCBzaG9ydCAgd3JpdGVfYnVmMl9sZW47Ci0KLSAgLyogICAwOkhPU1RfUENNX0lOVEYgZGlzYWJsZQotICAgKiogIDB4RkZGRjogSE9TVF9QQ01fSU5URiBlbmFibGUKLSAgICovCi0gIHNpZ25lZCBzaG9ydCAgYXJtX3RvX3J4X2ZsYWc7Ci0gIHVuc2lnbmVkIHNob3J0ICB3ZWlnaHRfZGVjb2Rlcl90b19yeDsKLSAgdW5zaWduZWQgc2hvcnQgIHdlaWdodF9hcm1fdG9fcng7Ci0KLSAgdW5zaWduZWQgc2hvcnQgIHBhcnRpdGlvbl9udW1iZXJfYXJtX3RvX2RzcDsKLSAgdW5zaWduZWQgc2hvcnQgIHNhbXBsZV9yYXRlOwotICB1bnNpZ25lZCBzaG9ydCAgY2hhbm5lbF9tb2RlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRwcF9jbWRfcGNtX2ludGY7Ci0KLS8qCi0gKiogIEJVRkZFUiBVUERBVEUgQ09NTUFORAotICovCi0jZGVmaW5lIEFVRFBQX0NNRF9QQ01fSU5URl9TRU5EX0JVRl9QQVJBTVNfTEVOCVwKLQlzaXplb2YoYXVkcHBfY21kX3BjbV9pbnRmX3NlbmRfYnVmZmVyKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIHNob3J0ICBjbWRfaWQ7Ci0gIHVuc2lnbmVkIHNob3J0ICBob3N0X3BjbV9vYmplY3Q7Ci0gIC8qIHNldCBjb25maWcgPSAweEZGRkYgZm9yIGNvbmZpZ3VyYXRpb24qLwotICBzaWduZWQgc2hvcnQgIGNvbmZpZzsKLSAgdW5zaWduZWQgc2hvcnQgIGludGZfdHlwZTsKLSAgdW5zaWduZWQgc2hvcnQgIGRzcF90b19hcm1fYnVmX2lkOwotICB1bnNpZ25lZCBzaG9ydCAgYXJtX3RvX2RzcF9idWZfaWQ7Ci0gIHVuc2lnbmVkIHNob3J0ICBhcm1fdG9fZHNwX2J1Zl9sZW47Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGF1ZHBwX2NtZF9wY21faW50Zl9zZW5kX2J1ZmZlcjsKLQotI2RlZmluZSBBVURQUF9DTURfUFBfRkVBVF9RVUVSWV9QQVJBTVMgIDB4MDAwMwotCi1zdHJ1Y3QgcnRjX2F1ZHBwX3JlYWRfZGF0YSB7Ci0JdW5zaWduZWQgc2hvcnQgIGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCAgb2JqX2lkOwotCXVuc2lnbmVkIHNob3J0ICBmZWF0dXJlX2lkOwotCXVuc2lnbmVkIHNob3J0ICBleHRidWZzaXplbXN3OwotCXVuc2lnbmVkIHNob3J0ICBleHRidWZzaXplbHN3OwotCXVuc2lnbmVkIHNob3J0CWV4dHBhcnQ7Ci0JdW5zaWduZWQgc2hvcnQJZXh0YnVmc3RhcnRtc3c7Ci0JdW5zaWduZWQgc2hvcnQJZXh0YnVmc3RhcnRsc3c7Ci19IF9fcGFja2VkIDsKLQotLyoKLSAqIENvbW1hbmRzIFJlbGF0ZWQgdG8gdVBBdWRQUENtZDNRdWV1ZQotICovCi0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBjb25maWd1cmUgcG9zdCBwcm9jZXNzaW5nIHBhcmFtcyAoQ29tbW1vbikKLSAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNUwkJMHgwMDAwCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNU19DT01NT05fTEVOCQlcCi0Jc2l6ZW9mKGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19jb21tb24pCi0KLSNkZWZpbmUgQVVEUFBfQ01EX09CSjBfVVBEQVRFCQkweDgwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX09CSjBfRE9OVF9VUERBVEUJMHgwMDAwCi0KLSNkZWZpbmUgQVVEUFBfQ01EX09CSjFfVVBEQVRFCQkweDgwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX09CSjFfRE9OVF9VUERBVEUJMHgwMDAwCi0KLSNkZWZpbmUgQVVEUFBfQ01EX09CSjJfVVBEQVRFCQkweDgwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX09CSjJfRE9OVF9VUERBVEUJMHgwMDAwCi0KLSNkZWZpbmUgQVVEUFBfQ01EX09CSjNfVVBEQVRFCQkweDgwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX09CSjNfRE9OVF9VUERBVEUJMHgwMDAwCi0KLSNkZWZpbmUgQVVEUFBfQ01EX09CSjRfVVBEQVRFCQkweDgwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX09CSjRfRE9OVF9VUERBVEUJMHgwMDAwCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0hQQ01fVVBEQVRFCQkweDgwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX0hQQ01fRE9OVF9VUERBVEUJMHgwMDAwCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0NPTU1PTl9DRkdfVVBEQVRFCQkweDgwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX0NPTU1PTl9DRkdfRE9OVF9VUERBVEUJMHgwMDAwCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0NPUFBfU1RSRUFNICAgMHgwMDA2Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydCAgY21kX2lkOwotCXVuc2lnbmVkIHNob3J0CW9iajBfY2ZnOwotCXVuc2lnbmVkIHNob3J0CW9iajFfY2ZnOwotCXVuc2lnbmVkIHNob3J0CW9iajJfY2ZnOwotCXVuc2lnbmVkIHNob3J0CW9iajNfY2ZnOwotCXVuc2lnbmVkIHNob3J0CW9iajRfY2ZnOwotCXVuc2lnbmVkIHNob3J0CWhvc3RfcGNtX29ial9jZmc7Ci0JdW5zaWduZWQgc2hvcnQJY29tbWFuX2NmZzsKLQl1bnNpZ25lZCBzaG9ydCAgY29tbWFuZF90eXBlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfY29tbW9uOwotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gY29uZmlndXJlIHBvc3QgcHJvY2Vzc2luZyBwYXJhbXMgKFZvbHVtZSkKLSAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9WT0xVTUVfUEFOCQkwCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNU19WT0xVTUVfTEVOCQlcCi0Jc2l6ZW9mKGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUpCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfY29tbW9uIAljb21tb247Ci0JdW5zaWduZWQgc2hvcnQJCQkJCXZvbHVtZTsKLQl1bnNpZ25lZCBzaG9ydAkJCQkJcGFuOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfdm9sdW1lOwotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gY29uZmlndXJlIHBvc3QgcHJvY2Vzc2luZyBwYXJhbXMgKFBDTSBGaWx0ZXIpIC0tRE9VQlQKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQJCQludW1lcmF0b3JfYjBfZmlsdGVyX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAkJCW51bWVyYXRvcl9iMF9maWx0ZXJfbXN3OwotCXVuc2lnbmVkIHNob3J0CQkJbnVtZXJhdG9yX2IxX2ZpbHRlcl9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQludW1lcmF0b3JfYjFfZmlsdGVyX21zdzsKLQl1bnNpZ25lZCBzaG9ydAkJCW51bWVyYXRvcl9iMl9maWx0ZXJfbHN3OwotCXVuc2lnbmVkIHNob3J0CQkJbnVtZXJhdG9yX2IyX2ZpbHRlcl9tc3c7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIG51bWVyYXRvcjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0CQkJZGVub21pbmF0b3JfYTBfZmlsdGVyX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAkJCWRlbm9taW5hdG9yX2EwX2ZpbHRlcl9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQlkZW5vbWluYXRvcl9hMV9maWx0ZXJfbHN3OwotCXVuc2lnbmVkIHNob3J0CQkJZGVub21pbmF0b3JfYTFfZmlsdGVyX21zdzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgZGVub21pbmF0b3I7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydAkJCXNoaWZ0X2ZhY3Rvcl8wOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzaGlmdF9mYWN0b3I7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydAkJCXBhbl9maWx0ZXJfMDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgcGFuOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JCW51bWVyYXRvcgkJbnVtZXJhdG9yX2ZpbHRlcjsKLQkJZGVub21pbmF0b3IJCWRlbm9taW5hdG9yX2ZpbHRlcjsKLQkJc2hpZnRfZmFjdG9yCQlzaGlmdF9mYWN0b3JfZmlsdGVyOwotCQlwYW4JCQlwYW5fZmlsdGVyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBmaWx0ZXJfMTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCQludW1lcmF0b3IJCW51bWVyYXRvcl9maWx0ZXJbMl07Ci0JCWRlbm9taW5hdG9yCQlkZW5vbWluYXRvcl9maWx0ZXJbMl07Ci0JCXNoaWZ0X2ZhY3RvcgkJc2hpZnRfZmFjdG9yX2ZpbHRlclsyXTsKLQkJcGFuCQkJcGFuX2ZpbHRlclsyXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgZmlsdGVyXzI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQkJbnVtZXJhdG9yCQludW1lcmF0b3JfZmlsdGVyWzNdOwotCQlkZW5vbWluYXRvcgkJZGVub21pbmF0b3JfZmlsdGVyWzNdOwotCQlzaGlmdF9mYWN0b3IJCXNoaWZ0X2ZhY3Rvcl9maWx0ZXJbM107Ci0JCXBhbgkJCXBhbl9maWx0ZXJbM107Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGZpbHRlcl8zOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JCW51bWVyYXRvcgkJbnVtZXJhdG9yX2ZpbHRlcls0XTsKLQkJZGVub21pbmF0b3IJCWRlbm9taW5hdG9yX2ZpbHRlcls0XTsKLQkJc2hpZnRfZmFjdG9yCQlzaGlmdF9mYWN0b3JfZmlsdGVyWzRdOwotCQlwYW4JCQlwYW5fZmlsdGVyWzRdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBmaWx0ZXJfNDsKLQotI2RlZmluZSBBVURQUF9DTURfSUlSX1RVTklOR19GSUxURVIJMQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfUENNX0xFTgkJXAotCXNpemVvZihhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfcGNtKQotCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfY29tbW9uIAljb21tb247Ci0JdW5zaWduZWQgc2hvcnQJCQkJYWN0aXZlX2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQgCQkJCW51bV9iYW5kczsKLQl1bmlvbiB7Ci0JCWZpbHRlcl8xCQkJZmlsdGVyXzFfcGFyYW1zOwotCQlmaWx0ZXJfMgkJCWZpbHRlcl8yX3BhcmFtczsKLQkJZmlsdGVyXzMJCQlmaWx0ZXJfM19wYXJhbXM7Ci0JCWZpbHRlcl80CQkJZmlsdGVyXzRfcGFyYW1zOwotCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgcGFyYW1zX2ZpbHRlcjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3BjbTsKLQotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gY29uZmlndXJlIHBvc3QgcHJvY2Vzc2luZyBwYXJhbWV0ZXJzIChlcXVhbGl6ZXIpIAotICovCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0VRVUFMSVpFUgkJMgotI2RlZmluZSBBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfRVFBTElaRVJfTEVOCQlcCi0Jc2l6ZW9mKGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19lcWFsaXplcikKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0CQkJbnVtZXJhdG9yX2NvZWZmXzBfbHN3OwotCXVuc2lnbmVkIHNob3J0CQkJbnVtZXJhdG9yX2NvZWZmXzBfbXN3OwotCXVuc2lnbmVkIHNob3J0CQkJbnVtZXJhdG9yX2NvZWZmXzFfbHN3OwotCXVuc2lnbmVkIHNob3J0CQkJbnVtZXJhdG9yX2NvZWZmXzFfbXN3OwotCXVuc2lnbmVkIHNob3J0CQkJbnVtZXJhdG9yX2NvZWZmXzJfbHN3OwotCXVuc2lnbmVkIHNob3J0CQkJbnVtZXJhdG9yX2NvZWZmXzJfbXN3OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBlcV9udW1lcmF0b3I7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydAkJCWRlbm9taW5hdG9yX2NvZWZmXzBfbHN3OwotCXVuc2lnbmVkIHNob3J0CQkJZGVub21pbmF0b3JfY29lZmZfMF9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQlkZW5vbWluYXRvcl9jb2VmZl8xX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAkJCWRlbm9taW5hdG9yX2NvZWZmXzFfbXN3OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBlcV9kZW5vbWluYXRvcjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0CQkJc2hpZnRfZmFjdG9yOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBlcV9zaGlmdGZhY3RvcjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWVxX251bWVyYXRvcgludW1lcmF0b3I7Ci0JZXFfZGVub21pbmF0b3IJZGVub21pbmF0b3I7Ci0JZXFfc2hpZnRmYWN0b3IJc2hpZnRmYWN0b3I7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGVxX2NvZWZmXzE7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQllcV9udW1lcmF0b3IJbnVtZXJhdG9yWzJdOwotCWVxX2Rlbm9taW5hdG9yCWRlbm9taW5hdG9yWzJdOwotCWVxX3NoaWZ0ZmFjdG9yCXNoaWZ0ZmFjdG9yWzJdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBlcV9jb2VmZl8yOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JZXFfbnVtZXJhdG9yCW51bWVyYXRvclszXTsKLQllcV9kZW5vbWluYXRvcglkZW5vbWluYXRvclszXTsKLQllcV9zaGlmdGZhY3RvcglzaGlmdGZhY3RvclszXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgZXFfY29lZmZfMzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWVxX251bWVyYXRvcgludW1lcmF0b3JbNF07Ci0JZXFfZGVub21pbmF0b3IJZGVub21pbmF0b3JbNF07Ci0JZXFfc2hpZnRmYWN0b3IJc2hpZnRmYWN0b3JbNF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGVxX2NvZWZmXzQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQllcV9udW1lcmF0b3IJbnVtZXJhdG9yWzVdOwotCWVxX2Rlbm9taW5hdG9yCWRlbm9taW5hdG9yWzVdOwotCWVxX3NoaWZ0ZmFjdG9yCXNoaWZ0ZmFjdG9yWzVdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBlcV9jb2VmZl81OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JZXFfbnVtZXJhdG9yCW51bWVyYXRvcls2XTsKLQllcV9kZW5vbWluYXRvcglkZW5vbWluYXRvcls2XTsKLQllcV9zaGlmdGZhY3RvcglzaGlmdGZhY3Rvcls2XTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgZXFfY29lZmZfNjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWVxX251bWVyYXRvcgludW1lcmF0b3JbN107Ci0JZXFfZGVub21pbmF0b3IJZGVub21pbmF0b3JbN107Ci0JZXFfc2hpZnRmYWN0b3IJc2hpZnRmYWN0b3JbN107Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGVxX2NvZWZmXzc7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQllcV9udW1lcmF0b3IJbnVtZXJhdG9yWzhdOwotCWVxX2Rlbm9taW5hdG9yCWRlbm9taW5hdG9yWzhdOwotCWVxX3NoaWZ0ZmFjdG9yCXNoaWZ0ZmFjdG9yWzhdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBlcV9jb2VmZl84OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JZXFfbnVtZXJhdG9yCW51bWVyYXRvcls5XTsKLQllcV9kZW5vbWluYXRvcglkZW5vbWluYXRvcls5XTsKLQllcV9zaGlmdGZhY3RvcglzaGlmdGZhY3Rvcls5XTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgZXFfY29lZmZfOTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWVxX251bWVyYXRvcgludW1lcmF0b3JbMTBdOwotCWVxX2Rlbm9taW5hdG9yCWRlbm9taW5hdG9yWzEwXTsKLQllcV9zaGlmdGZhY3RvcglzaGlmdGZhY3RvclsxMF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGVxX2NvZWZmXzEwOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JZXFfbnVtZXJhdG9yCW51bWVyYXRvclsxMV07Ci0JZXFfZGVub21pbmF0b3IJZGVub21pbmF0b3JbMTFdOwotCWVxX3NoaWZ0ZmFjdG9yCXNoaWZ0ZmFjdG9yWzExXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgZXFfY29lZmZfMTE7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQllcV9udW1lcmF0b3IJbnVtZXJhdG9yWzEyXTsKLQllcV9kZW5vbWluYXRvcglkZW5vbWluYXRvclsxMl07Ci0JZXFfc2hpZnRmYWN0b3IJc2hpZnRmYWN0b3JbMTJdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBlcV9jb2VmZl8xMjsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2NvbW1vbiAJY29tbW9uOwotCXVuc2lnbmVkIHNob3J0CQkJCWVxX2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQJCQkJbnVtX2JhbmRzOwotCXVuaW9uIHsKLQkJZXFfY29lZmZfMQllcV9jb2VmZnNfMTsKLQkJZXFfY29lZmZfMgllcV9jb2VmZnNfMjsKLQkJZXFfY29lZmZfMwllcV9jb2VmZnNfMzsKLQkJZXFfY29lZmZfNAllcV9jb2VmZnNfNDsKLQkJZXFfY29lZmZfNQllcV9jb2VmZnNfNTsKLQkJZXFfY29lZmZfNgllcV9jb2VmZnNfNjsKLQkJZXFfY29lZmZfNwllcV9jb2VmZnNfNzsKLQkJZXFfY29lZmZfOAllcV9jb2VmZnNfODsKLQkJZXFfY29lZmZfOQllcV9jb2VmZnNfOTsKLQkJZXFfY29lZmZfMTAJZXFfY29lZmZzXzEwOwotCQllcV9jb2VmZl8xMQllcV9jb2VmZnNfMTE7Ci0JCWVxX2NvZWZmXzEyCWVxX2NvZWZmc18xMjsKLQl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGVxX2NvZWZmOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfZXFhbGl6ZXI7Ci0KLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSBwb3N0IHByb2Nlc3NpbmcgcGFyYW1ldGVycyAoQURSQykgCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfQURSQwkJCTMKLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TX0FEUkNfTEVOCQlcCi0Jc2l6ZW9mKGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19hZHJjKQotCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0FEUkNfRkxBR19ESVMJCTB4MDAwMAotI2RlZmluZSBBVURQUF9DTURfQURSQ19GTEFHX0VOQQkJLTEKLQotI2RlZmluZSBBVURQUF9DTURfTUJBRFJDCQkxMAotI2RlZmluZQlBVURQUF9NQVhfTUJBRFJDX0JBTkRTCQk1Ci0jZGVmaW5lCUFVRFBQX01CQURSQ19FWFRFUk5BTF9CVUZfU0laRQkxOTYKLQotc3RydWN0IGFkcmNfY29uZmlnIHsKLQl1aW50MTZfdCBzdWJiYW5kX2VuYWJsZTsKLQl1aW50MTZfdCBhZHJjX3N1Yl9tdXRlOwotCXVpbnQxNl90IHJtc190aW1lOwotCXVpbnQxNl90IGNvbXByZXNzaW9uX3RoOwotCXVpbnQxNl90IGNvbXByZXNzaW9uX3Nsb3BlOwotCXVpbnQxNl90IGF0dGFja19jb25zdF9sc3c7Ci0JdWludDE2X3QgYXR0YWNrX2NvbnN0X21zdzsKLQl1aW50MTZfdCByZWxlYXNlX2NvbnN0X2xzdzsKLQl1aW50MTZfdCByZWxlYXNlX2NvbnN0X21zdzsKLQl1aW50MTZfdCBtYWtldXBfZ2FpbjsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfY29tbW9uIAljb21tb247Ci0JdWludDE2X3QgZW5hYmxlOwotCXVpbnQxNl90IG51bV9iYW5kczsKLQl1aW50MTZfdCBkb3duX3NhbXBfbGV2ZWw7Ci0JdWludDE2X3QgYWRyY19kZWxheTsKLQl1aW50MTZfdCBleHRfYnVmX3NpemU7Ci0JdWludDE2X3QgZXh0X3BhcnRpdGlvbjsKLQl1aW50MTZfdCBleHRfYnVmX21zdzsKLQl1aW50MTZfdCBleHRfYnVmX2xzdzsKLQlzdHJ1Y3QgYWRyY19jb25maWcgYWRyY19iYW5kW0FVRFBQX01BWF9NQkFEUkNfQkFORFNdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfbWJhZHJjOwotCi1zdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2FkcmMgewotCXVuc2lnbmVkIHNob3J0CWFkcmNfZmxhZzsKLQl1bnNpZ25lZCBzaG9ydAljb21wcmVzc2lvbl90aDsKLQl1bnNpZ25lZCBzaG9ydAljb21wcmVzc2lvbl9zbG9wZTsKLQl1bnNpZ25lZCBzaG9ydAlybXNfdGltZTsKLQl1bnNpZ25lZCBzaG9ydAlhdHRhY2tfY29uc3RfbHN3OwotCXVuc2lnbmVkIHNob3J0CWF0dGFja19jb25zdF9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJcmVsZWFzZV9jb25zdF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJcmVsZWFzZV9jb25zdF9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJYWRyY19kZWxheTsKLX07Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBjb25maWd1cmUgcG9zdCBwcm9jZXNzaW5nIHBhcmFtZXRlcnMoU3BlY3RydW0gQW5hbGl6ZXIpCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfU1BFQ1RST0dSQU0JCTQKLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TX1NQRUNUUkFNX0xFTgkJXAotCXNpemVvZihhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3BlY3RyYW0pCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19jb21tb24gCWNvbW1vbjsKLQl1bnNpZ25lZCBzaG9ydAkJCQlzYW1wbGVfaW50ZXJ2YWw7Ci0JdW5zaWduZWQgc2hvcnQJCQkJbnVtX2NvZWZmOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3BlY3RyYW07Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBjb25maWd1cmUgcG9zdCBwcm9jZXNzaW5nIHBhcmFtZXRlcnMgKFFDb25jZXJ0KSAKLSAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9RQ09OQ0VSVAkJNQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfUUNPTkNFUlRfTEVOCQlcCi0Jc2l6ZW9mKGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19xY29uY2VydCkKLQotCi0jZGVmaW5lIEFVRFBQX0NNRF9RQ09OX0VOQV9GTEFHX0VOQQkJLTEKLSNkZWZpbmUgQVVEUFBfQ01EX1FDT05fRU5BX0ZMQUdfRElTCQkweDAwMDAKLQotI2RlZmluZSBBVURQUF9DTURfUUNPTl9PUF9NT0RFX0hFQURQSE9ORQktMQotI2RlZmluZSBBVURQUF9DTURfUUNPTl9PUF9NT0RFX1NQRUFLRVJfRlJPTlQJMHgwMDAwCi0jZGVmaW5lIEFVRFBQX0NNRF9RQ09OX09QX01PREVfU1BFQUtFUl9TSURFCTB4MDAwMQotI2RlZmluZSBBVURQUF9DTURfUUNPTl9PUF9NT0RFX1NQRUFLRVJfREVTS1RPUAkweDAwMDIKLQotI2RlZmluZSBBVURQUF9DTURfUUNPTl9HQUlOX1VOSVQJCQkweDdGRkYKLSNkZWZpbmUgQVVEUFBfQ01EX1FDT05fR0FJTl9TSVhfREIJCQkweDQwMjcKLQotCi0jZGVmaW5lIEFVRFBQX0NNRF9RQ09OX0VYUEFOU0lPTl9NQVgJCTB4N0ZGRgotCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfY29tbW9uIAljb21tb247Ci0Jc2lnbmVkIHNob3J0CQkJCWVuYWJsZV9mbGFnOwotCXNpZ25lZCBzaG9ydAkJCQlvcF9tb2RlOwotCXNpZ25lZCBzaG9ydAkJCQlnYWluOwotCXNpZ25lZCBzaG9ydAkJCQlleHBhbnNpb247Ci0Jc2lnbmVkIHNob3J0CQkJCWRlbGF5OwotCXVuc2lnbmVkIHNob3J0CQkJCXN0YWdlc19wZXJfbW9kZTsKLQl1bnNpZ25lZCBzaG9ydAkJCQlyZXZlcmJfZW5hYmxlOwotCXVuc2lnbmVkIHNob3J0CQkJCWRlY2F5X21zdzsKLQl1bnNpZ25lZCBzaG9ydAkJCQlkZWNheV9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQkJZGVjYXlfdGltZV9yYXRpb19tc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQkJZGVjYXlfdGltZV9yYXRpb19sc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQkJcmVmbGVjdGlvbl9kZWxheV90aW1lOwotCXVuc2lnbmVkIHNob3J0CQkJCWxhdGVfcmV2ZXJiX2dhaW47Ci0JdW5zaWduZWQgc2hvcnQJCQkJbGF0ZV9yZXZlcmJfZGVsYXk7Ci0JdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X2J1ZmZfc2l6ZV9tc3c7Ci0JdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X2J1ZmZfc2l6ZV9sc3c7Ci0JdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9udW07Ci0JdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X2J1ZmZfc3RhcnRfbXN3OwotCXVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheV9idWZmX3N0YXJ0X2xzdzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3Fjb25jZXJ0OwotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gY29uZmlndXJlIHBvc3QgcHJvY2Vzc2luZyBwYXJhbWV0ZXJzIChTaWRlIENoYWluKSAKLSAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9TSURFQ0hBSU5fVFVOSU5HX0ZJTFRFUgk2Ci0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNU19TSURFQ0hBSU5fTEVOCQlcCi0Jc2l6ZW9mKGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19zaWRlY2hhaW4pCi0KLQotI2RlZmluZSBBVURQUF9DTURfU0lERUNIQUlOX0FDVElWRV9GTEFHX0RJUwkweDAwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX1NJREVDSEFJTl9BQ1RJVkVfRkxBR19FTkEJLTEKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19jb21tb24gCWNvbW1vbjsKLQlzaWduZWQgc2hvcnQJCQkJYWN0aXZlX2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQJCQkJbnVtX2JhbmRzOwotCXVuaW9uIHsKLQkJZmlsdGVyXzEJCQlmaWx0ZXJfMV9wYXJhbXM7Ci0JCWZpbHRlcl8yCQkJZmlsdGVyXzJfcGFyYW1zOwotCQlmaWx0ZXJfMwkJCWZpbHRlcl8zX3BhcmFtczsKLQkJZmlsdGVyXzQJCQlmaWx0ZXJfNF9wYXJhbXM7Ci0JfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBwYXJhbXNfZmlsdGVyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc2lkZWNoYWluOwotCi0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBjb25maWd1cmUgcG9zdCBwcm9jZXNzaW5nIHBhcmFtZXRlcnMgKFFBRlgpCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfUUFGWAkJCTgKLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TX1FBRlhfTEVOCQlcCi0Jc2l6ZW9mKGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19xYWZ4KQotCi0jZGVmaW5lIEFVRFBQX0NNRF9RQUZYX0VOQV9ESVNBCQkweDAwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX1FBRlhfRU5BX0VOQV9DRkcJLTEKLSNkZWZpbmUgQVVEUFBfQ01EX1FBRlhfRU5BX0RJU19DRkcJMHgwMDAxCi0KLSNkZWZpbmUgQVVEUFBfQ01EX1FBRlhfQ01EX1RZUEVfRU5WCTB4MDEwMAotI2RlZmluZSBBVURQUF9DTURfUUFGWF9DTURfVFlQRV9PQkoJMHgwMDEwCi0jZGVmaW5lIEFVRFBQX0NNRF9RQUZYX0NNRF9UWVBFX1FVRVJZCTB4MTAwMAotCi0jZGVmaW5lIEFVRFBQX0NNRF9RQUZYX0NNRFNfRU5WX09QX01PREUJMHgwMTAwCi0jZGVmaW5lIEFVRFBQX0NNRF9RQUZYX0NNRFNfRU5WX0xJU19QT1MJMHgwMTAxCi0jZGVmaW5lIEFVRFBQX0NNRF9RQUZYX0NNRFNfRU5WX0xJU19PUkkJMHgwMTAyCi0jZGVmaW5lIEFVRFBQX0NNRF9RQUZYX0NNRFNfRU5WX0xJU19WRUwJMFgwMTAzCi0jZGVmaW5lIEFVRFBQX0NNRF9RQUZYX0NNRFNfRU5WX0VOVl9SRVMJMHgwMTA3Ci0KLSNkZWZpbmUgQVVEUFBfQ01EX1FBRlhfQ01EU19PQkpfU0FNUF9GUkVRCTB4MDAxMAotI2RlZmluZSBBVURQUF9DTURfUUFGWF9DTURTX09CSl9WT0wJCTB4MDAxMQotI2RlZmluZSBBVURQUF9DTURfUUFGWF9DTURTX09CSl9ESVNUCQkweDAwMTIKLSNkZWZpbmUgQVVEUFBfQ01EX1FBRlhfQ01EU19PQkpfUE9TCQkweDAwMTMKLSNkZWZpbmUgQVVEUFBfQ01EX1FBRlhfQ01EU19PQkpfVkVMCQkweDAwMTQKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2NvbW1vbiAJY29tbW9uOwotCXNpZ25lZCBzaG9ydAkJCQllbmFibGU7Ci0JdW5zaWduZWQgc2hvcnQJCQkJY29tbWFuZF90eXBlOwotCXVuc2lnbmVkIHNob3J0CQkJCW51bV9jb21tYW5kczsKLQl1bnNpZ25lZCBzaG9ydAkJCQljb21tYW5kczsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3FhZng7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBlbmFibGUgLCBkaXNhYmxlIG9yIGNvbmZpZ3VyZSB0aGUgcmV2ZXJiZXJhdGlvbiBlZmZlY3QKLSAqIChDb21tb24pCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfUkVWRVJCX0NPTkZJRwkJMHgwMDAxCi0jZGVmaW5lCUFVRFBQX0NNRF9SRVZFUkJfQ09ORklHX0NPTU1PTl9MRU4JXAotCXNpemVvZihhdWRwcF9jbWRfcmV2ZXJiX2NvbmZpZ19jb21tb24pCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0VOQV9FTkEJMHhGRkZGCi0jZGVmaW5lIEFVRFBQX0NNRF9FTkFfRElTCTB4MDAwMAotI2RlZmluZSBBVURQUF9DTURfRU5BX0NGRwkweDAwMDEKLQotI2RlZmluZSBBVURQUF9DTURfQ01EX1RZUEVfRU5WCQkweDAxMDQKLSNkZWZpbmUgQVVEUFBfQ01EX0NNRF9UWVBFX09CSgkJMHgwMDE1Ci0jZGVmaW5lIEFVRFBQX0NNRF9DTURfVFlQRV9RVUVSWQkweDEwMDAKLQotI2RlZmluZSBTUlNfUEFSQU1TX01BWF9HIDgKLSNkZWZpbmUgU1JTX1BBUkFNU19NQVhfVyA1NQotI2RlZmluZSBTUlNfUEFSQU1TX01BWF9DIDUxCi0jZGVmaW5lIFNSU19QQVJBTVNfTUFYX0ggNTMKLSNkZWZpbmUgU1JTX1BBUkFNU19NQVhfUCAxMTYKLSNkZWZpbmUgU1JTX1BBUkFNU19NQVhfTCA4Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydAkJCWNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydAkJCWVuYWJsZTsKLQl1bnNpZ25lZCBzaG9ydAkJCWNtZF90eXBlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRwcF9jbWRfcmV2ZXJiX2NvbmZpZ19jb21tb247Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBlbmFibGUgLCBkaXNhYmxlIG9yIGNvbmZpZ3VyZSB0aGUgcmV2ZXJiZXJhdGlvbiBlZmZlY3QKLSAqIChFTlYtMHgwMTA0KQotICovCi0KLSNkZWZpbmUJQVVEUFBfQ01EX1JFVkVSQl9DT05GSUdfRU5WXzEwNF9MRU4JXAotCXNpemVvZihhdWRwcF9jbWRfcmV2ZXJiX2NvbmZpZ19lbnZfMTA0KQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JYXVkcHBfY21kX3JldmVyYl9jb25maWdfY29tbW9uCWNvbW1vbjsKLQl1bnNpZ25lZCBzaG9ydAkJCWVudl9nYWluOwotCXVuc2lnbmVkIHNob3J0CQkJZGVjYXlfbXN3OwotCXVuc2lnbmVkIHNob3J0CQkJZGVjYXlfbHN3OwotCXVuc2lnbmVkIHNob3J0CQkJZGVjYXlfdGltZXJhdGlvX21zdzsKLQl1bnNpZ25lZCBzaG9ydAkJCWRlY2F5X3RpbWVyYXRpb19sc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQlkZWxheV90aW1lOwotCXVuc2lnbmVkIHNob3J0CQkJcmV2ZXJiX2dhaW47Ci0JdW5zaWduZWQgc2hvcnQJCQlyZXZlcmJfZGVsYXk7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGF1ZHBwX2NtZF9yZXZlcmJfY29uZmlnX2Vudl8xMDQ7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBlbmFibGUgLCBkaXNhYmxlIG9yIGNvbmZpZ3VyZSB0aGUgcmV2ZXJiZXJhdGlvbiBlZmZlY3QKLSAqIChFTlYtMHgwMDE1KQotICovCi0KLSNkZWZpbmUJQVVEUFBfQ01EX1JFVkVSQl9DT05GSUdfRU5WXzE1X0xFTglcCi0Jc2l6ZW9mKGF1ZHBwX2NtZF9yZXZlcmJfY29uZmlnX2Vudl8xNSkKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWF1ZHBwX2NtZF9yZXZlcmJfY29uZmlnX2NvbW1vbgljb21tb247Ci0JdW5zaWduZWQgc2hvcnQJCQlvYmplY3RfbnVtOwotCXVuc2lnbmVkIHNob3J0CQkJYWJzb2x1dGVfZ2FpbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcHBfY21kX3JldmVyYl9jb25maWdfZW52XzE1OwotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gY29uZmlndXJlIHBvc3QgcHJvY2Vzc2luZyBwYXJhbXMgKFNSUyBUcnVNZWRpYSkKLSAqLwotc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19zcnN0bV9nIHsKLQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfY29tbW9uCWNvbW1vbjsKLQl1bnNpZ25lZCBzaG9ydAkJCQl2W1NSU19QQVJBTVNfTUFYX0ddOwotfSBfX3BhY2tlZDsKLXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3JzdG1fdyB7Ci0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2NvbW1vbgljb21tb247Ci0JdW5zaWduZWQgc2hvcnQJCQkJdltTUlNfUEFSQU1TX01BWF9XXTsKLX0gX19wYWNrZWQ7Ci1zdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3Nyc3RtX2MgewotCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19jb21tb24JY29tbW9uOwotCXVuc2lnbmVkIHNob3J0CQkJCXZbU1JTX1BBUkFNU19NQVhfQ107Ci19IF9fcGFja2VkOwotc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19zcnN0bV9oIHsKLQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfY29tbW9uCWNvbW1vbjsKLQl1bnNpZ25lZCBzaG9ydAkJCQl2W1NSU19QQVJBTVNfTUFYX0hdOwotfSBfX3BhY2tlZDsKLXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3JzdG1fcCB7Ci0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2NvbW1vbgljb21tb247Ci0JdW5zaWduZWQgc2hvcnQJCQkJdltTUlNfUEFSQU1TX01BWF9QXTsKLX0gX19wYWNrZWQ7Ci1zdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3Nyc3RtX2wgewotCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19jb21tb24JY29tbW9uOwotCXVuc2lnbmVkIHNob3J0CQkJCXZbU1JTX1BBUkFNU19NQVhfTF07Ci19IF9fcGFja2VkOwotI2RlZmluZSBBVURQUF9DTURfU0FNUExJTkdfRlJFUVVFTkNZCTcKLSNkZWZpbmUgQVVEUFBfQ01EX1FSVU1CTEUJCTkKLSNkZWZpbmUgQVVEUFBfQ01EX1NSUwkJCTE4Ci0jZGVmaW5lIEFVRFBQX0RJU0FCTEVfRkVBVFNfTFNXCQkyCi0jZGVmaW5lIEFVRFBQX0RJU0FCTEVfRkVBVFNfTVNXCQkzCi0KLSNlbmRpZiAvKiBRRFNQNUFVRFBQQ01ESV9IICovCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWF1ZHBwbXNnLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDVhdWRwcG1zZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjRlMjQ2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWF1ZHBwbXNnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotI2lmbmRlZiBRRFNQNUFVRFBQTVNHX0gKLSNkZWZpbmUgUURTUDVBVURQUE1TR19ICi0KLS8qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qCi0KLSAgICAgICBRIEQgUyBQIDUgIEEgVSBEIEkgTyAgIFAgTyBTIFQgICBQIFIgTyBDIEUgUyBTIEkgTiBHICAgTSBTIEcKLQotIEdFTkVSQUwgREVTQ1JJUFRJT04KLSAgIE1lc3NhZ2VzIHNlbnQgYnkgQVVEUFBUQVNLIHRvIEFSTQotCi0gUkVGRVJFTkNFUwotICAgTm9uZQotCi0gRVhURVJOQUxJWkVEIEZVTkNUSU9OUwotICAgTm9uZQotCi0gQ29weXJpZ2h0IChjKSAxOTkyLTIwMDksIDIwMTItMjAxMyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0KLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQotCi1UaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlLgotTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KLSAgCi0gJEhlYWRlcjogLy9zb3VyY2UvcWNvbS9xY3QvbXVsdGltZWRpYTIvQXVkaW8vZHJpdmVycy9RRFNQNURyaXZlci9RRFNQNUludGVyZmFjZS9tYWluL2xhdGVzdC9xZHNwNWF1ZHBwbXNnLmgjNCAkCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qCi0gKiBBVURQUFRBU0sgdXNlcyBhdWRQUHVQUmxpc3QgdG8gc2VuZCBtZXNzYWdlcyB0byB0aGUgQVJNCi0gKiBMb2NhdGlvbiA6IE1FTUEKLSAqIEJ1ZmZlciBTaXplIDogNDUKLSAqIE5vIG9mIEJ1ZmZlcnMgaW4gYSBxdWV1ZSA6IDUgZm9yIGdhbWluZyBhdWRpbyBhbmQgMSBmb3Igb3RoZXIgaW1hZ2VzIAotICovCi0KLS8qCi0gKiBNU0cgdG8gSW5mb3JtcyB0aGUgQVJNIG9zIFN1Y2Nlc3MvRmFpbHVyZSBvZiBicmluZ2luZyB1cCB0aGUgZGVjb2RlcgotICovCi0KLSNkZWZpbmUgQVVEUFBfTVNHX1NUQVRVU19NU0cJCTB4MDAwMQotI2RlZmluZSBBVURQUF9NU0dfU1RBVFVTX01TR19MRU4JXAotCXNpemVvZihhdWRwcF9tc2dfc3RhdHVzX21zZykKLQotI2RlZmluZSBBVURQUF9NU0dfU1RBVFVTX1NMRUVQCQkweDAwMDAKLSNkZWZpbmUgQVVEUFBfTVNHX1NUQVRVU19JTklUCQkweDAwMDEKLSNkZWZpbmUgQVVEUFBfTVNHX1NUQVRVU19DRkcJCTB4MDAwMgotI2RlZmluZSBBVURQUF9NU0dfU1RBVFVTX1BMQVkJCTB4MDAwMwotCi0jZGVmaW5lIEFVRFBQX01TR19SRUFTT05fTk9ORQkweDAwMDAKLSNkZWZpbmUgQVVEUFBfTVNHX1JFQVNPTl9NRU0JMHgwMDAxCi0jZGVmaW5lIEFVRFBQX01TR19SRUFTT05fTk9ERUNPREVSIDB4MDAwMgotCi10eXBlZGVmIHN0cnVjdHsKLQl1bnNpZ25lZCBzaG9ydCBkZWNfaWQ7Ci0JdW5zaWduZWQgc2hvcnQgc3RhdHVzOwotCXVuc2lnbmVkIHNob3J0IHJlYXNvbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcHBfbXNnX3N0YXR1c19tc2c7Ci0KLS8qCi0gKiBNU0cgdG8gY29tbXVuaWNhdGUgdGhlIHNwZWN0cnVtIGFuYWx5emVyIG91dHB1dCBiYW5kcyB0byB0aGUgQVJNCi0gKi8KLSNkZWZpbmUgQVVEUFBfTVNHX1NQQV9CQU5EUwkJMHgwMDAyCi0jZGVmaW5lIEFVRFBQX01TR19TUEFfQkFORFNfTEVOCVwKLQlzaXplb2YoYXVkcHBfbXNnX3NwYV9iYW5kcykKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0CQkJY3VycmVudF9vYmplY3Q7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8xOwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMjsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzM7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF80OwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfNTsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzY7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF83OwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfODsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzk7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8xMDsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzExOwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMTI7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8xMzsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzE0OwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMTU7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8xNjsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzE3OwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMTg7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8xOTsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzIwOwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMjE7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8yMjsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzIzOwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMjQ7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8yNTsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzI2OwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMjc7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8yODsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzI5OwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMzA7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8zMTsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzMyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRwcF9tc2dfc3BhX2JhbmRzOwotCi0vKgotICogTVNHIHRvIGNvbW11bmljYXRlIHRoZSBQQ00gSS9PIGJ1ZmZlciBzdGF0dXMgdG8gQVJNCi0gKi8KLSNkZWZpbmUgIEFVRFBQX01TR19IT1NUX1BDTV9JTlRGX01TRwkJMHgwMDAzCi0jZGVmaW5lICBBVURQUF9NU0dfSE9TVF9QQ01fSU5URl9NU0dfTEVOCVwKLQlzaXplb2YoYXVkcHBfbXNnX2hvc3RfcGNtX2ludGZfbXNnKQotCi0jZGVmaW5lIEFVRFBQX01TR19IT1NUUENNX0lEX1RYX0FSTQkweDAwMDAKLSNkZWZpbmUgQVVEUFBfTVNHX0hPU1RQQ01fSURfQVJNX1RYCTB4MDAwMQotI2RlZmluZSBBVURQUF9NU0dfSE9TVFBDTV9JRF9SWF9BUk0JMHgwMDAyCi0jZGVmaW5lIEFVRFBQX01TR19IT1NUUENNX0lEX0FSTV9SWAkweDAwMDMKLQotI2RlZmluZSBBVURQUF9NU0dfU0FNUF9GUkVRX0lORFhfOTYwMDAJMHgwMDAwCi0jZGVmaW5lIEFVRFBQX01TR19TQU1QX0ZSRVFfSU5EWF84ODIwMAkweDAwMDEKLSNkZWZpbmUgQVVEUFBfTVNHX1NBTVBfRlJFUV9JTkRYXzY0MDAwCTB4MDAwMgotI2RlZmluZSBBVURQUF9NU0dfU0FNUF9GUkVRX0lORFhfNDgwMDAJMHgwMDAzCi0jZGVmaW5lIEFVRFBQX01TR19TQU1QX0ZSRVFfSU5EWF80NDEwMAkweDAwMDQKLSNkZWZpbmUgQVVEUFBfTVNHX1NBTVBfRlJFUV9JTkRYXzMyMDAwCTB4MDAwNQotI2RlZmluZSBBVURQUF9NU0dfU0FNUF9GUkVRX0lORFhfMjQwMDAJMHgwMDA2Ci0jZGVmaW5lIEFVRFBQX01TR19TQU1QX0ZSRVFfSU5EWF8yMjA1MAkweDAwMDcKLSNkZWZpbmUgQVVEUFBfTVNHX1NBTVBfRlJFUV9JTkRYXzE2MDAwCTB4MDAwOAotI2RlZmluZSBBVURQUF9NU0dfU0FNUF9GUkVRX0lORFhfMTIwMDAJMHgwMDA5Ci0jZGVmaW5lIEFVRFBQX01TR19TQU1QX0ZSRVFfSU5EWF8xMTAyNQkweDAwMEEKLSNkZWZpbmUgQVVEUFBfTVNHX1NBTVBfRlJFUV9JTkRYXzgwMDAJMHgwMDBCCi0KLSNkZWZpbmUgQVVEUFBfTVNHX0NIQU5ORUxfTU9ERV9NT05PCQkweDAwMDEKLSNkZWZpbmUgQVVEUFBfTVNHX0NIQU5ORUxfTU9ERV9TVEVSRU8JMHgwMDAyCi0KLXR5cGVkZWYgc3RydWN0ewotCXVuc2lnbmVkIHNob3J0IG9ial9udW07Ci0JdW5zaWduZWQgc2hvcnQgbnVtYmVyc19vZl9zYW1wbGVzOwotCXVuc2lnbmVkIHNob3J0IGhvc3RfcGNtX2lkOwotCXVuc2lnbmVkIHNob3J0IGJ1Zl9pbmR4OwotCXVuc2lnbmVkIHNob3J0IHNhbXBfZnJlcV9pbmR4OwotCXVuc2lnbmVkIHNob3J0IGNoYW5uZWxfbW9kZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcHBfbXNnX2hvc3RfcGNtX2ludGZfbXNnOwotCi0KLS8qCi0gKiBNU0cgdG8gY29tbXVuaWNhdGUgM0QgcG9zaXRpb24gb2YgdGhlIHNvdXJjZSBhbmQgbGlzdGVuZXIgLCBzb3VyY2Ugdm9sdW1lCi0gKiBzb3VyY2Ugcm9sbG9mZiwgc291cmNlIG9yaWVudGF0aW9uCi0gKi8KLQotI2RlZmluZSBBVURQUF9NU0dfUUFGWF9QT1MJCTB4MDAwNAotI2RlZmluZSBBVURQUF9NU0dfUUFGWF9QT1NfTEVOCQlcCi0Jc2l6ZW9mKGF1ZHBwX21zZ19xYWZ4X3BvcykKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0CWN1cnJlbnRfb2JqZWN0OwotCXVuc2lnbmVkIHNob3J0CXhfcG9zX2xpc19tc3c7Ci0JdW5zaWduZWQgc2hvcnQJeF9wb3NfbGlzX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAl5X3Bvc19saXNfbXN3OwotCXVuc2lnbmVkIHNob3J0CXlfcG9zX2xpc19sc3c7Ci0JdW5zaWduZWQgc2hvcnQJel9wb3NfbGlzX21zdzsKLQl1bnNpZ25lZCBzaG9ydAl6X3Bvc19saXNfbHN3OwotCXVuc2lnbmVkIHNob3J0CXhfZndkX21zdzsKLQl1bnNpZ25lZCBzaG9ydAl4X2Z3ZF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJeV9md2RfbXN3OwotCXVuc2lnbmVkIHNob3J0CXlfZndkX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAl6X2Z3ZF9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJel9md2RfbHN3OwotCXVuc2lnbmVkIHNob3J0IAl4X3VwX21zdzsKLQl1bnNpZ25lZCBzaG9ydAl4X3VwX2xzdzsKLQl1bnNpZ25lZCBzaG9ydCAJeV91cF9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJeV91cF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQgCXpfdXBfbXN3OwotCXVuc2lnbmVkIHNob3J0CXpfdXBfbHN3OwotCXVuc2lnbmVkIHNob3J0IAl4X3ZlbF9saXNfbXN3OwotCXVuc2lnbmVkIHNob3J0IAl4X3ZlbF9saXNfbHN3OwotCXVuc2lnbmVkIHNob3J0IAl5X3ZlbF9saXNfbXN3OwotCXVuc2lnbmVkIHNob3J0IAl5X3ZlbF9saXNfbHN3OwotCXVuc2lnbmVkIHNob3J0IAl6X3ZlbF9saXNfbXN3OwotCXVuc2lnbmVkIHNob3J0IAl6X3ZlbF9saXNfbHN3OwotCXVuc2lnbmVkIHNob3J0CXRocmVlZF9lbmFibGVfZmxhZzsKLQl1bnNpZ25lZCBzaG9ydCAJdm9sdW1lOwotCXVuc2lnbmVkIHNob3J0CXhfcG9zX3NvdXJjZV9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJeF9wb3Nfc291cmNlX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAl5X3Bvc19zb3VyY2VfbXN3OwotCXVuc2lnbmVkIHNob3J0CXlfcG9zX3NvdXJjZV9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJel9wb3Nfc291cmNlX21zdzsKLQl1bnNpZ25lZCBzaG9ydAl6X3Bvc19zb3VyY2VfbHN3OwotCXVuc2lnbmVkIHNob3J0CW1heF9kaXN0XzBfbXN3OwotCXVuc2lnbmVkIHNob3J0CW1heF9kaXN0XzBfbHN3OwotCXVuc2lnbmVkIHNob3J0CW1pbl9kaXN0XzBfbXN3OwotCXVuc2lnbmVkIHNob3J0CW1pbl9kaXN0XzBfbHN3OwotCXVuc2lnbmVkIHNob3J0CXJvbGxfb2ZmX2ZhY3RvcjsKLQl1bnNpZ25lZCBzaG9ydAltdXRlX2FmdGVyX21heF9mbGFnOwotCXVuc2lnbmVkIHNob3J0CXhfdmVsX3NvdXJjZV9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJeF92ZWxfc291cmNlX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAl5X3ZlbF9zb3VyY2VfbXN3OwotCXVuc2lnbmVkIHNob3J0CXlfdmVsX3NvdXJjZV9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJel92ZWxfc291cmNlX21zdzsKLQl1bnNpZ25lZCBzaG9ydAl6X3ZlbF9zb3VyY2VfbHN3OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRwcF9tc2dfcWFmeF9wb3M7Ci0KLS8qCi0gKiBNU0cgdG8gcHJvdmlkZSBBVlNZTkMgZmVlZGJhY2sgZnJvbSBEU1AgdG8gQVJNCi0gKi8KLQotI2RlZmluZSBBVURQUF9NU0dfQVZTWU5DX01TRwkJMHgwMDA1Ci0jZGVmaW5lIEFVRFBQX01TR19BVlNZTkNfTVNHX0xFTglcCi0Jc2l6ZW9mKGF1ZHBwX21zZ19hdnN5bmNfbXNnKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQJYWN0aXZlX2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQJbnVtX3NhbXBsZXNfY291bnRlcjBfSFNXOwotCXVuc2lnbmVkIHNob3J0CW51bV9zYW1wbGVzX2NvdW50ZXIwX01TVzsKLQl1bnNpZ25lZCBzaG9ydAludW1fc2FtcGxlc19jb3VudGVyMF9MU1c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtX2J5dGVzX2NvdW50ZXIwX0hTVzsKLQl1bnNpZ25lZCBzaG9ydAludW1fYnl0ZXNfY291bnRlcjBfTVNXOwotCXVuc2lnbmVkIHNob3J0CW51bV9ieXRlc19jb3VudGVyMF9MU1c7Ci0JdW5zaWduZWQgc2hvcnQJc2FtcF9mcmVxX29ial8wOwotCXVuc2lnbmVkIHNob3J0CXNhbXBfZnJlcV9vYmpfMTsKLQl1bnNpZ25lZCBzaG9ydAlzYW1wX2ZyZXFfb2JqXzI7Ci0JdW5zaWduZWQgc2hvcnQJc2FtcF9mcmVxX29ial8zOwotCXVuc2lnbmVkIHNob3J0CXNhbXBfZnJlcV9vYmpfNDsKLQl1bnNpZ25lZCBzaG9ydAlzYW1wX2ZyZXFfb2JqXzU7Ci0JdW5zaWduZWQgc2hvcnQJc2FtcF9mcmVxX29ial82OwotCXVuc2lnbmVkIHNob3J0CXNhbXBfZnJlcV9vYmpfNzsKLQl1bnNpZ25lZCBzaG9ydAlzYW1wX2ZyZXFfb2JqXzg7Ci0JdW5zaWduZWQgc2hvcnQJc2FtcF9mcmVxX29ial85OwotCXVuc2lnbmVkIHNob3J0CXNhbXBfZnJlcV9vYmpfMTA7Ci0JdW5zaWduZWQgc2hvcnQJc2FtcF9mcmVxX29ial8xMTsKLQl1bnNpZ25lZCBzaG9ydAlzYW1wX2ZyZXFfb2JqXzEyOwotCXVuc2lnbmVkIHNob3J0CXNhbXBfZnJlcV9vYmpfMTM7Ci0JdW5zaWduZWQgc2hvcnQJc2FtcF9mcmVxX29ial8xNDsKLQl1bnNpZ25lZCBzaG9ydAlzYW1wX2ZyZXFfb2JqXzE1OwotCXVuc2lnbmVkIHNob3J0CW51bV9zYW1wbGVzX2NvdW50ZXI0X0hTVzsKLQl1bnNpZ25lZCBzaG9ydAludW1fc2FtcGxlc19jb3VudGVyNF9NU1c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtX3NhbXBsZXNfY291bnRlcjRfTFNXOwotCXVuc2lnbmVkIHNob3J0CW51bV9ieXRlc19jb3VudGVyNF9IU1c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtX2J5dGVzX2NvdW50ZXI0X01TVzsKLQl1bnNpZ25lZCBzaG9ydAludW1fYnl0ZXNfY291bnRlcjRfTFNXOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRwcF9tc2dfYXZzeW5jX21zZzsKLQotLyoKLSAqIE1TRyB0byBwcm92aWRlIFBDTSBETUEgTWlzc2VkIGZlZWRiYWNrIGZyb20gdGhlIERTUCB0byBBUk0KLSAqLwotCi0jZGVmaW5lICBBVURQUF9NU0dfUENNRE1BTUlTU0VECTB4MDAwNgotI2RlZmluZSAgQVVEUFBfTVNHX1BDTURNQU1JU1NFRF9MRU4JXAotCXNpemVvZihhdWRwcF9tc2dfcGNtZG1hbWlzc2VkKTsKLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gIC8qCi0gICoqIEJpdCAwCTAgPSBQQ00gRE1BIG5vdCBtaXNzZWQgZm9yIG9iamVjdCAwCi0gICoqICAgICAgICAxID0gUENNIERNQSBtaXNzZWQgZm9yIG9iamVjdDAKLSAgKiogQml0IDEJMCA9IFBDTSBETUEgbm90IG1pc3NlZCBmb3Igb2JqZWN0IDEKLSAgKiogICAgICAgIDEgPSBQQ00gRE1BIG1pc3NlZCBmb3Igb2JqZWN0MQotICAqKiBCaXQgMgkwID0gUENNIERNQSBub3QgbWlzc2VkIGZvciBvYmplY3QgMgotICAqKiAgICAgICAgMSA9IFBDTSBETUEgbWlzc2VkIGZvciBvYmplY3QyCi0gICoqIEJpdCAzCTAgPSBQQ00gRE1BIG5vdCBtaXNzZWQgZm9yIG9iamVjdCAzCi0gICoqICAgICAgICAxID0gUENNIERNQSBtaXNzZWQgZm9yIG9iamVjdDMKLSAgKiogQml0IDQJMCA9IFBDTSBETUEgbm90IG1pc3NlZCBmb3Igb2JqZWN0IDQKLSAgKiogICAgICAgIDEgPSBQQ00gRE1BIG1pc3NlZCBmb3Igb2JqZWN0NAotICAqLwotICB1bnNpZ25lZCBzaG9ydCBwY21kbWFtaXNzZWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGF1ZHBwX21zZ19wY21kbWFtaXNzZWQ7Ci0KLS8qCi0gKiBNU0cgdG8gQVVEUFAgZW5hYmxlIG9yIGRpc2FibGUgZmVlZGJhY2sgZm9ybSBEU1AgdG8gQVJNCi0gKi8KLQotI2RlZmluZSBBVURQUF9NU0dfQ0ZHX01TRwkweDAwMDcgIAotI2RlZmluZSBBVURQUF9NU0dfQ0ZHX01TR19MRU4JXAotICAgIHNpemVvZihhdWRwcF9tc2dfY2ZnX21zZykKLQotI2RlZmluZSBBVURQUF9NU0dfRU5BX0VOQQkweEZGRkYKLSNkZWZpbmUgQVVEUFBfTVNHX0VOQV9ESVMJMHgwMDAwCi0KLXR5cGVkZWYgc3RydWN0ewotICAvKiAgIEVuYWJsZWQgIC0gMHhmZmZmIAotICAgKiogIERpc2FibGVkIC0gMAotICAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZW5hYmxlZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcHBfbXNnX2NmZ19tc2c7Ci0KLS8qCi0gKiBNU0cgdG8gY29tbXVuaWNhdGUgdGhlIHJldmVyYiAgcGVyIG9iamVjdCB2b2x1bWUKLSAqLwotCi0jZGVmaW5lIEFVRFBQX01TR19RUkVWRVJCX1ZPTFVNRQkweDAwMDgKLSNkZWZpbmUgQVVEUFBfTVNHX1FSRVZFUkJfVk9MVU1FX0xFTglcCi0Jc2l6ZW9mKGF1ZHBwX21zZ19xcmV2ZXJiX3ZvbHVtZSkKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQJb2JqXzBfZ2FpbjsKLQl1bnNpZ25lZCBzaG9ydAlvYmpfMV9nYWluOwotCXVuc2lnbmVkIHNob3J0CW9ial8yX2dhaW47Ci0JdW5zaWduZWQgc2hvcnQJb2JqXzNfZ2FpbjsKLQl1bnNpZ25lZCBzaG9ydAlvYmpfNF9nYWluOwotCXVuc2lnbmVkIHNob3J0CWhwY21fb2JqX3ZvbHVtZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcHBfbXNnX3FyZXZlcmJfdm9sdW1lOwotCi0jZGVmaW5lIEFVRFBQX01TR19ST1VUSU5HX0FDSyAweDAwMDkKLSNkZWZpbmUgQVVEUFBfTVNHX1JPVVRJTkdfQUNLX0xFTiBcCi0gIHNpemVvZihzdHJ1Y3QgYXVkcHBfbXNnX3JvdXRpbmdfYWNrKQotCi1zdHJ1Y3QgYXVkcHBfbXNnX3JvdXRpbmdfYWNrIHsKLSAgdW5zaWduZWQgc2hvcnQgZGVjX2lkOwotICB1bnNpZ25lZCBzaG9ydCByb3V0aW5nX21vZGU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZGVmaW5lIEFVRFBQX01TR19GTFVTSF9BQ0sgMHgwMDBBCi0KLSNkZWZpbmUgQURTUF9NRVNTQUdFX0lEIDB4RkZGRgotCi0jZGVmaW5lIEFVRFBQX01TR19GRUFUX1FVRVJZX0RNX0RPTkUgMHgwMDBiCi0KLS8qCi0gKiBBRFNQIHNlbmRzIHRoaXMgbWVzc2FnZSB3aGVuIGEgUFAgZmVhdHVyZSBpcyBkaXNhYmxlZAotICogZHVlIHRvIEFEU1AgcmVzb3VyY2UgbGltaXRhdGlvbi4KLSAqLwotI2RlZmluZSBBVURQUF9NU0dfUFBfRElTQUJMRV9GRUVEQkFDSyAweDAwMEMKLQotLyoKLSAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IGJ5IEFEU1AgaWYgYW55IFBQIGZlYXR1cmVzIGlzIGRpc2FibGVkCi0gKiBkdWUgdG8gdmlkZW8gYW5kIGF1ZGlvIGNvbmN1cnJlbmN5IGR1ZSB0byBNSVBTIGxpbWl0YXRpb24gYW5kCi0gKiB0aGUgdmlkZW8gc2Vzc2lvbiBpcyBlbmRlZCBpbiBBRFNQLgotICovCi0jZGVmaW5lIEFVRFBQX01TR19QUF9GRUFUU19SRV9FTkFCTEUgMHgwMDBECi0KLSNlbmRpZiAvKiBRRFNQNUFVRFBQTVNHX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWF1ZHByZXByb2MuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWF1ZHByZXByb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1M2MyZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDVhdWRwcmVwcm9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIFFEU1A1QVVEUFJFUFJPQ19ICi0jZGVmaW5lIF9RRFNQNUFVRFBSRVBST0NfSAotCi0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHByZXByb2NjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHByZXByb2Ntc2cuaD4KLQotI2RlZmluZSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCAgMHgwMDAwMDEwMAotI2RlZmluZSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCAgMHgwMDAwMDIwMAotCi0jZGVmaW5lIEFVRFBSRVBST0NfQ09ERUNfTUFTSyAweDAwRkYKLSNkZWZpbmUgQVVEUFJFUFJPQ19NT0RFX01BU0sgMHhGRjAwCi0KLSNkZWZpbmUgTVNNX0FEU1BfRU5DX01PREVfVFVOTkVMIDI0Ci0jZGVmaW5lIE1TTV9BRFNQX0VOQ19NT0RFX05PTl9UVU5ORUwgMjUKLQotLyogZXZlbnQgY2FsbGJhY2sgcm91dGluZSBwcm90b3R5cGUqLwotdHlwZWRlZiB2b2lkICgqYXVkcHJlcHJvY19ldmVudF9mdW5jKSh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdm9pZCAqbXNnKTsKLQotc3RydWN0IGF1ZHByZXByb2NfZXZlbnRfY2FsbGJhY2sgewotCWF1ZHByZXByb2NfZXZlbnRfZnVuYyBmbjsKLQl2b2lkICpwcml2YXRlOwotfTsKLQotLypob2xkcyBhdWRyZWMgaW5mb3JtYXRpb24qLwotc3RydWN0IGF1ZHJlY19zZXNzaW9uX2luZm8gewotCWludCBzZXNzaW9uX2lkOwotCWludCBzYW1wbGluZ19mcmVxOwotfTsKLQotLyogRXhwb3J0ZWQgY29tbW9uIGFwaSdzIGZyb20gYXVkcHJlcHJvYyBsYXllciAqLwotaW50IGF1ZHByZXByb2NfYWVuY19hbGxvYyh1bnNpZ25lZCBlbmNfdHlwZSwgY29uc3QgY2hhciAqKm1vZHVsZV9uYW1lLAotCQl1bnNpZ25lZCAqcXVldWVfaWQpOwotdm9pZCBhdWRwcmVwcm9jX2FlbmNfZnJlZShpbnQgZW5jX2lkKTsKLQotaW50IGF1ZHByZXByb2NfZW5hYmxlKGludCBlbmNfaWQsIGF1ZHByZXByb2NfZXZlbnRfZnVuYyBmdW5jLCB2b2lkICpwcml2YXRlKTsKLXZvaWQgYXVkcHJlcHJvY19kaXNhYmxlKGludCBlbmNfaWQsIHZvaWQgKnByaXZhdGUpOwotCi1pbnQgYXVkcHJlcHJvY191bnJlZ2lzdGVyX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBhdWRwcmVwcm9jX2V2ZW50X2NhbGxiYWNrICplY2IpOwotCi1pbnQgYXVkcHJlcHJvY19yZWdpc3Rlcl9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYXVkcHJlcHJvY19ldmVudF9jYWxsYmFjayAqZWNiKTsKLQotaW50IGF1ZHByZXByb2NfdXBkYXRlX2F1ZHJlY19pbmZvKHN0cnVjdCBhdWRyZWNfc2Vzc2lvbl9pbmZvCi0JCQkJCQkqYXVkcmVjX3Nlc3Npb25faW5mbyk7Ci1pbnQgZ2V0X2F1ZHJlY19zZXNzaW9uX2luZm8oc3RydWN0IGF1ZHJlY19zZXNzaW9uX2luZm8gKmluZm8pOwotCi1pbnQgYXVkcHJlcHJvY19kc3Bfc2V0X2FnYyhhdWRwcmVwcm9jX2NtZF9jZmdfYWdjX3BhcmFtcyAqYWdjLAotCXVuc2lnbmVkIGxlbik7Ci1pbnQgYXVkcHJlcHJvY19kc3Bfc2V0X25zKGF1ZHByZXByb2NfY21kX2NmZ19uc19wYXJhbXMgKm5zLAotCXVuc2lnbmVkIGxlbik7Ci1pbnQgYXVkcHJlcHJvY19kc3Bfc2V0X2lpcihhdWRwcmVwcm9jX2NtZF9jZmdfaWlyX3R1bmluZ19maWx0ZXJfcGFyYW1zICppaXIsCi0JdW5zaWduZWQgbGVuKTsKLQotaW50IGF1ZHByZXByb2Nfc2VuZF9wcmVwcm9jY21kcXVldWUodm9pZCAqY21kLCB1bnNpZ25lZCBsZW4pOwotdHlwZWRlZiB2b2lkICgqYXVkcmVjX2V2ZW50X2Z1bmMpKHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGlkLCB1aW50MTZfdCAqbXNnKTsKLWludCBhdWRyZWN0YXNrX2VuYWJsZSh1bnNpZ25lZCBlbmNfdHlwZSwgYXVkcmVjX2V2ZW50X2Z1bmMgZnVuYywgdm9pZCAqcHJpdmF0ZSk7Ci12b2lkIGF1ZHJlY3Rhc2tfZGlzYWJsZSh1bnNpZ25lZCBlbmNfdHlwZSwgdm9pZCAqcHJpdmF0ZSk7Ci0KLWludCBhdWRyZWN0YXNrX3NlbmRfY21kcXVldWUodm9pZCAqY21kLCB1bnNpZ25lZCBsZW4pOwotaW50IGF1ZHJlY3Rhc2tfc2VuZF9iaXRzdHJlYW1xdWV1ZSh2b2lkICpjbWQsIHVuc2lnbmVkIGxlbik7Ci0KLSNlbmRpZiAvKiBRRFNQNUFVRFBSRVBST0NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1YXVkcHJlcHJvY2NtZGkuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWF1ZHByZXByb2NjbWRpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYzFlNDYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1YXVkcHJlcHJvY2NtZGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0jaWZuZGVmIFFEU1A1QVVEUFJFUFJPQ0NNRElfSAotI2RlZmluZSBRRFNQNUFVRFBSRVBST0NDTURJX0gKLQotLyo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSoKLSoKLSogICAgQSBVIEQgSSBPICAgUCBSIEUgICBQIFIgTyBDIEUgUyBTIEkgTiBHICBJIE4gVCBFIFIgTiBBIEwgIEMgTyBNIE0gQSBOIEQgUwotKgotKiBHRU5FUkFMIERFU0NSSVBUSU9OCi0qICAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmludGlvbnMgb2YgZm9ybWF0IGJsb2NrcyBvZiBjb21tYW5kcwotKiAgIHRoYXQgYXJlIGFjY2VwdGVkIGJ5IEFVRFBSRVBST0MgVGFzawotKgotKiBSRUZFUkVOQ0VTCi0qICAgTm9uZQotKgotKiBFWFRFUk5BTElaRUQgRlVOQ1RJT05TCi0qICAgTm9uZQotKgotKiBDb3B5cmlnaHQgKGMpIDE5OTItMjAwOSwgMjAxMiBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKgotKj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Ki8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKLQotVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZS4KLU5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCi0gICAKLSRIZWFkZXI6IC8vc291cmNlL3Fjb20vcWN0L211bHRpbWVkaWEyL0F1ZGlvL2RyaXZlcnMvUURTUDVEcml2ZXIvUURTUDVJbnRlcmZhY2UvbWFpbi9sYXRlc3QvcWRzcDVhdWRwcmVwcm9jY21kaS5oIzIgJCAKLSAgCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKgotICogQVVESU9QUkVQUk9DIENPTU1BTkRTOgotICogQVJNIHVzZXMgdVBBdWRQcmVQcm9jQ21kUXVldWUgdG8gY29tbXVuaWNhdGUgd2l0aCBBVURQUkVQUk9DVEFTSwotICogTG9jYXRpb24gOiBNRU1CCi0gKiBCdWZmZXIgc2l6ZSA6IDUxCi0gKiBOdW1iZXIgb2YgYnVmZmVycyBpbiBhIHF1ZXVlIDogMwotICovCi0KLS8qCi0gKiBDb21tYW5kIHRvIGNvbmZpZ3VyZSB0aGUgcGFyYW1ldGVycyBvZiBBR0MKLSAqLwotCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0NGR19BR0NfUEFSQU1TCTB4MDAwMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9DRkdfQUdDX1BBUkFNU19MRU4JXAotCXNpemVvZihhdWRwcmVwcm9jX2NtZF9jZmdfYWdjX3BhcmFtcykKLQotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9UWF9BR0NfUEFSQU1fTUFTS19DT01QX1NMT1BFCTB4MDAwOQotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9UWF9BR0NfUEFSQU1fTUFTS19DT01QX1RICTB4MDAwQQotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9UWF9BR0NfUEFSQU1fTUFTS19FWFBfU0xPUEUJMHgwMDBCCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX1RYX0FHQ19QQVJBTV9NQVNLX0VYUF9USAkJMHgwMDBDCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX1RYX0FHQ19QQVJBTV9NQVNLX0NPTVBfQUlHX0ZMQUcJCTB4MDAwRAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9UWF9BR0NfUEFSQU1fTUFTS19DT01QX1NUQVRJQ19HQUlOCTB4MDAwRQotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9UWF9BR0NfUEFSQU1fTUFTS19UWF9BR0NfRU5BX0ZMQUcJMHgwMDBGCi0KLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfVFhfQUdDX0VOQV9GTEFHX0VOQQktMQotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9UWF9BR0NfRU5BX0ZMQUdfRElTCTB4MDAwMAotCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0FEUF9HQUlOX0ZMQUdfRU5BX0FEUF9HQUlOCS0xCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0FEUF9HQUlOX0ZMQUdfRU5BX1NUQVRJQ19HQUlOCTB4MDAwMAotCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX1BBUkFNX01BU0tfUk1TX1RBWQkweDAwMDQKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19SRUxFQVNFSwkweDAwMDUKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19ERUxBWQkJMHgwMDA2Ci0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX1BBUkFNX01BU0tfQVRUQUNLSwkweDAwMDcKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19MRUFLUkFURV9TTE9XCTB4MDAwOAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9QQVJBTV9NQVNLX0xFQUtSQVRFX0ZBU1QJMHgwMDA5Ci0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX1BBUkFNX01BU0tfQUlHX1JFTEVBU0VLIAkweDAwMEEKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19BSUdfTUlOCTB4MDAwQgotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9QQVJBTV9NQVNLX0FJR19NQVgJMHgwMDBDCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX1BBUkFNX01BU0tfTEVBS19VUAkweDAwMEQKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19MRUFLX0RPV04JMHgwMDBFCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX1BBUkFNX01BU0tfQUlHX0FUVEFDS0sJMHgwMDBGCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydAljbWRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQJdHhfYWdjX3BhcmFtX21hc2s7Ci0Jc2lnbmVkIHNob3J0CXR4X2FnY19lbmFibGVfZmxhZzsKLQl1bnNpZ25lZCBzaG9ydAljb21wX3JsaW5rX3N0YXRpY19nYWluOwotCXNpZ25lZCBzaG9ydAljb21wX3JsaW5rX2FpZ19mbGFnOwotCXVuc2lnbmVkIHNob3J0CWV4cGFuZGVyX3JsaW5rX3RoOwotCXVuc2lnbmVkIHNob3J0CWV4cGFuZGVyX3JsaW5rX3Nsb3BlOwotCXVuc2lnbmVkIHNob3J0CWNvbXByZXNzb3JfcmxpbmtfdGg7Ci0JdW5zaWduZWQgc2hvcnQJY29tcHJlc3Nvcl9ybGlua19zbG9wZTsKLQl1bnNpZ25lZCBzaG9ydAl0eF9hZGNfYWdjX3BhcmFtX21hc2s7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9ybGlua19haWdfYXR0YWNrazsKLQl1bnNpZ25lZCBzaG9ydAljb21wX3JsaW5rX2FpZ19sZWFrX2Rvd247Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9ybGlua19haWdfbGVha191cDsKLQl1bnNpZ25lZCBzaG9ydAljb21wX3JsaW5rX2FpZ19tYXg7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9ybGlua19haWdfbWluOwotCXVuc2lnbmVkIHNob3J0CWNvbXBfcmxpbmtfYWlnX3JlbGVhc2VrOwotCXVuc2lnbmVkIHNob3J0CWNvbXBfcmxpbmtfYWlnX2xlYWtyYXRlX2Zhc3Q7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9ybGlua19haWdfbGVha3JhdGVfc2xvdzsKLQl1bnNpZ25lZCBzaG9ydAljb21wX3JsaW5rX2F0dGFja2tfbXN3OwotCXVuc2lnbmVkIHNob3J0CWNvbXBfcmxpbmtfYXR0YWNra19sc3c7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9ybGlua19kZWxheTsKLQl1bnNpZ25lZCBzaG9ydAljb21wX3JsaW5rX3JlbGVhc2VrX21zdzsKLQl1bnNpZ25lZCBzaG9ydAljb21wX3JsaW5rX3JlbGVhc2VrX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAljb21wX3JsaW5rX3Jtc190YXY7Ci19IF9fcGFja2VkIGF1ZHByZXByb2NfY21kX2NmZ19hZ2NfcGFyYW1zOwotCi0KLS8qCi0gKiBDb21tYW5kIHRvIGNvbmZpZ3VyZSB0aGUgcGFyYW1zIG9mIEFkdmFudmVkIEFHQwotICovCi0KLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfQ0ZHX0FHQ19QQVJBTVNfMgkJMHgwMDAxCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0NGR19BR0NfUEFSQU1TXzJfTEVOCQlcCi0Jc2l6ZW9mKGF1ZHByZXByb2NfY21kX2NmZ19hZ2NfcGFyYW1zXzIpCi0KLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfMl9UWF9BR0NfRU5BX0ZMQUdfRU5BCS0xOwotI2RlZmluZQlBVURQUkVQUk9DX0NNRF8yX1RYX0FHQ19FTkFfRkxBR19ESVMJMHgwMDAwOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQJY21kX2lkOwotCXVuc2lnbmVkIHNob3J0CWFnY19wYXJhbV9tYXNrOwotCXNpZ25lZCBzaG9ydAl0eF9hZ2NfZW5hYmxlX2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9zdGF0aWNfZ2FpbjsKLQl1bnNpZ25lZCBzaG9ydAlleHBfdGg7Ci0JdW5zaWduZWQgc2hvcnQJZXhwX3Nsb3BlOwotCXVuc2lnbmVkIHNob3J0CWNvbXBfdGg7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9zbG9wZTsKLQl1bnNpZ25lZCBzaG9ydAljb21wX3Jtc190YXY7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9zYW1wX21hc2s7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9hdHRhY2trX21zdzsKLQl1bnNpZ25lZCBzaG9ydAljb21wX2F0dGFja2tfbHN3OwotCXVuc2lnbmVkIHNob3J0CWNvbXBfcmVsZWFzZWtfbXN3OwotCXVuc2lnbmVkIHNob3J0CWNvbXBfcmVsZWFzZWtfbHN3OwotCXVuc2lnbmVkIHNob3J0CWNvbXBfZGVsYXk7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9tYWtldXBfZ2FpbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcHJlcHJvY19jbWRfY2ZnX2FnY19wYXJhbXNfMjsKLQotLyoKLSAqIENvbW1hbmQgdG8gY29uZmlndXJlIHBhcmFtcyBmb3IgbnMKLSAqLwotCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0NGR19OU19QQVJBTVMJCTB4MDAwMgotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9DRkdfTlNfUEFSQU1TX0xFTglcCi0Jc2l6ZW9mKGF1ZHByZXByb2NfY21kX2NmZ19uc19wYXJhbXMpCi0KLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9ORVdfTkxNU19FTkEJMHgwMDAxCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX05MTVNfRElTIAkweDAwMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9ORVdfREVTX0VOQQkweDAwMDIKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9ORVdfREVTX0RJUwkweDAwMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9ORVdfTlNfRU5BCTB4MDAwNAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19OU19ESVMJMHgwMDAwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX0NOSV9FTkEJMHgwMDA4Ci0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX0NOSV9ESVMJMHgwMDAwCi0KLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9ORVdfTkxFU19FTkEJMHgwMDEwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX05MRVNfRElTCTB4MDAwMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19IQl9FTkEJMHgwMDIwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX0hCX0RJUwkweDAwMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9ORVdfVkFfRU5BCTB4MDA0MAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19WQV9ESVMJMHgwMDAwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX1BDRF9FTkEJMHgwMDgwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX1BDRF9ESVMJMHgwMDAwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX0ZFSElfRU5BCTB4MDEwMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19GRUhJX0RJUyAJMHgwMDAwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX05FSElfRU5BCTB4MDIwMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19ORUhJX0RJUyAJMHgwMDAwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX05MUFBfRU5BCTB4MDQwMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19OTFBQX0RJUwkweDAwMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9ORVdfRk5FX0VOQQkweDA4MDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9ORVdfRk5FX0RJUwkweDAwMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9ORVdfUFJFTkxNU19FTkEgCTB4MTAwMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19QUkVOTE1TX0RJUyAJMHgwMDAwCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydAljbWRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQJZWNfbW9kZV9uZXc7Ci0JdW5zaWduZWQgc2hvcnQJZGVuc19nYW1tYV9uOwotCXVuc2lnbmVkIHNob3J0CWRlbnNfbmZlX2Jsb2NrX3NpemU7Ci0JdW5zaWduZWQgc2hvcnQJZGVuc19saW1pdF9uczsKLQl1bnNpZ25lZCBzaG9ydAlkZW5zX2xpbWl0X25zX2Q7Ci0JdW5zaWduZWQgc2hvcnQJd2JfZ2FtbWFfZTsKLQl1bnNpZ25lZCBzaG9ydAl3Yl9nYW1tYV9uOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRwcmVwcm9jX2NtZF9jZmdfbnNfcGFyYW1zOwotCi0vKgotICogQ29tbWFuZCB0byBjb25maWd1cmUgcGFyYW1ldGVycyBmb3IgSUlSIHR1bmluZyBmaWx0ZXIKLSAqLwotCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0NGR19JSVJfVFVOSU5HX0ZJTFRFUl9QQVJBTVMJCTB4MDAwMwotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9DRkdfSUlSX1RVTklOR19GSUxURVJfUEFSQU1TX0xFTglcCi0Jc2l6ZW9mKGF1ZHByZXByb2NfY21kX2NmZ19paXJfdHVuaW5nX2ZpbHRlcl9wYXJhbXMpCi0KLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfSUlSX0FDVElWRV9GTEFHX0RJUwkweDAwMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfSUlSX0FDVElWRV9GTEFHX0VOQQkweDAwMDEKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0CWNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydAlhY3RpdmVfZmxhZzsKLQl1bnNpZ25lZCBzaG9ydAludW1fYmFuZHM7Ci0JdW5zaWduZWQgc2hvcnQJbnVtZXJhdG9yX2NvZWZmX2IwX2ZpbHRlcjBfbHN3OwotCXVuc2lnbmVkIHNob3J0CW51bWVyYXRvcl9jb2VmZl9iMF9maWx0ZXIwX21zdzsKLQl1bnNpZ25lZCBzaG9ydAludW1lcmF0b3JfY29lZmZfYjFfZmlsdGVyMF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtZXJhdG9yX2NvZWZmX2IxX2ZpbHRlcjBfbXN3OwotCXVuc2lnbmVkIHNob3J0CW51bWVyYXRvcl9jb2VmZl9iMl9maWx0ZXIwX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAludW1lcmF0b3JfY29lZmZfYjJfZmlsdGVyMF9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtZXJhdG9yX2NvZWZmX2IwX2ZpbHRlcjFfbHN3OwotCXVuc2lnbmVkIHNob3J0CW51bWVyYXRvcl9jb2VmZl9iMF9maWx0ZXIxX21zdzsKLQl1bnNpZ25lZCBzaG9ydAludW1lcmF0b3JfY29lZmZfYjFfZmlsdGVyMV9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtZXJhdG9yX2NvZWZmX2IxX2ZpbHRlcjFfbXN3OwotCXVuc2lnbmVkIHNob3J0CW51bWVyYXRvcl9jb2VmZl9iMl9maWx0ZXIxX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAludW1lcmF0b3JfY29lZmZfYjJfZmlsdGVyMV9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtZXJhdG9yX2NvZWZmX2IwX2ZpbHRlcjJfbHN3OwotCXVuc2lnbmVkIHNob3J0CW51bWVyYXRvcl9jb2VmZl9iMF9maWx0ZXIyX21zdzsKLQl1bnNpZ25lZCBzaG9ydAludW1lcmF0b3JfY29lZmZfYjFfZmlsdGVyMl9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtZXJhdG9yX2NvZWZmX2IxX2ZpbHRlcjJfbXN3OwotCXVuc2lnbmVkIHNob3J0CW51bWVyYXRvcl9jb2VmZl9iMl9maWx0ZXIyX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAludW1lcmF0b3JfY29lZmZfYjJfZmlsdGVyMl9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtZXJhdG9yX2NvZWZmX2IwX2ZpbHRlcjNfbHN3OwotCXVuc2lnbmVkIHNob3J0CW51bWVyYXRvcl9jb2VmZl9iMF9maWx0ZXIzX21zdzsKLQl1bnNpZ25lZCBzaG9ydAludW1lcmF0b3JfY29lZmZfYjFfZmlsdGVyM19sc3c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtZXJhdG9yX2NvZWZmX2IxX2ZpbHRlcjNfbXN3OwotCXVuc2lnbmVkIHNob3J0CW51bWVyYXRvcl9jb2VmZl9iMl9maWx0ZXIzX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAludW1lcmF0b3JfY29lZmZfYjJfZmlsdGVyM19tc3c7Ci0JdW5zaWduZWQgc2hvcnQgCWRlbm9taW5hdG9yX2NvZWZmX2EwX2ZpbHRlcjBfbHN3OwotCXVuc2lnbmVkIHNob3J0IAlkZW5vbWluYXRvcl9jb2VmZl9hMF9maWx0ZXIwX21zdzsKLQl1bnNpZ25lZCBzaG9ydCAJZGVub21pbmF0b3JfY29lZmZfYTFfZmlsdGVyMF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQgCWRlbm9taW5hdG9yX2NvZWZmX2ExX2ZpbHRlcjBfbXN3OyAKLQl1bnNpZ25lZCBzaG9ydCAJZGVub21pbmF0b3JfY29lZmZfYTBfZmlsdGVyMV9sc3c7Ci0JdW5zaWduZWQgc2hvcnQgCWRlbm9taW5hdG9yX2NvZWZmX2EwX2ZpbHRlcjFfbXN3OwotCXVuc2lnbmVkIHNob3J0IAlkZW5vbWluYXRvcl9jb2VmZl9hMV9maWx0ZXIxX2xzdzsKLQl1bnNpZ25lZCBzaG9ydCAJZGVub21pbmF0b3JfY29lZmZfYTFfZmlsdGVyMV9tc3c7Ci0gIHVuc2lnbmVkIHNob3J0IAlkZW5vbWluYXRvcl9jb2VmZl9hMF9maWx0ZXIyX2xzdzsKLQl1bnNpZ25lZCBzaG9ydCAJZGVub21pbmF0b3JfY29lZmZfYTBfZmlsdGVyMl9tc3c7Ci0JdW5zaWduZWQgc2hvcnQgCWRlbm9taW5hdG9yX2NvZWZmX2ExX2ZpbHRlcjJfbHN3OwotCXVuc2lnbmVkIHNob3J0IAlkZW5vbWluYXRvcl9jb2VmZl9hMV9maWx0ZXIyX21zdzsKLSAgdW5zaWduZWQgc2hvcnQgCWRlbm9taW5hdG9yX2NvZWZmX2EwX2ZpbHRlcjNfbHN3OwotCXVuc2lnbmVkIHNob3J0IAlkZW5vbWluYXRvcl9jb2VmZl9hMF9maWx0ZXIzX21zdzsKLQl1bnNpZ25lZCBzaG9ydCAJZGVub21pbmF0b3JfY29lZmZfYTFfZmlsdGVyM19sc3c7Ci0JdW5zaWduZWQgc2hvcnQgCWRlbm9taW5hdG9yX2NvZWZmX2ExX2ZpbHRlcjNfbXN3OwotCi0JdW5zaWduZWQgc2hvcnQJc2hpZnRfZmFjdG9yX2ZpbHRlcjA7Ci0JdW5zaWduZWQgc2hvcnQJc2hpZnRfZmFjdG9yX2ZpbHRlcjE7Ci0JdW5zaWduZWQgc2hvcnQJc2hpZnRfZmFjdG9yX2ZpbHRlcjI7Ci0JdW5zaWduZWQgc2hvcnQJc2hpZnRfZmFjdG9yX2ZpbHRlcjM7Ci0KLQl1bnNpZ25lZCBzaG9ydAljaGFubmVsX3NlbGVjdGVkMDsKLQl1bnNpZ25lZCBzaG9ydAljaGFubmVsX3NlbGVjdGVkMTsKLQl1bnNpZ25lZCBzaG9ydAljaGFubmVsX3NlbGVjdGVkMjsKLQl1bnNpZ25lZCBzaG9ydAljaGFubmVsX3NlbGVjdGVkMzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSlhdWRwcmVwcm9jX2NtZF9jZmdfaWlyX3R1bmluZ19maWx0ZXJfcGFyYW1zOwotCi0jZGVmaW5lIEFVRFBSRVBST0NfQ01EX0ZFQVRfUVVFUllfUEFSQU1TIDB4MDAwNAotCi1zdHJ1Y3QgcnRjX2F1ZHByZXByb2NfcmVhZF9kYXRhIHsKLQl1bnNpZ25lZCBzaG9ydAljbWRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQJc3RyZWFtX2lkOwotCXVuc2lnbmVkIHNob3J0ICBmZWF0dXJlX2lkOwotCXVuc2lnbmVkIHNob3J0ICBleHRidWZzaXplbXN3OwotCXVuc2lnbmVkIHNob3J0ICBleHRidWZzaXplbHN3OwotCXVuc2lnbmVkIHNob3J0ICBleHRwYXJ0OwotCXVuc2lnbmVkIHNob3J0ICBleHRidWZzdGFydG1zdzsKLQl1bnNpZ25lZCBzaG9ydAlleHRidWZzdGFydGxzdzsKLX0gX19wYWNrZWQgOwotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDVhdWRwcmVwcm9jbXNnLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDVhdWRwcmVwcm9jbXNnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOTMyNzkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1YXVkcHJlcHJvY21zZy5oCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotI2lmbmRlZiBRRFNQNUFVRFBSRVBST0NNU0dfSAotI2RlZmluZSBRRFNQNUFVRFBSRVBST0NNU0dfSAotCi0vKj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09KgotKgotKiAgICAgQSBVIEQgSSBPICAgUCBSIEUgICBQIFIgTyBDIEUgUyBTIEkgTiBHICBNIEUgUyBTIEEgRyBFIFMKLSoKLSogR0VORVJBTCBERVNDUklQVElPTgotKiAgIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbnRpb25zIG9mIGZvcm1hdCBibG9ja3Mgb2YgbWVzc2FnZXMKLSogICB0aGF0IGFyZSByY3ZkIGJ5IEFVRFBSRVBST0MgVGFzawotKgotKiBSRUZFUkVOQ0VTCi0qICAgTm9uZQotKgotKiBFWFRFUk5BTElaRUQgRlVOQ1RJT05TCi0qICAgTm9uZQotKgotKiBDb3B5cmlnaHQgKGMpIDE5OTItMjAwOSwgMjAxMiBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKgotKj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Ki8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKLQotVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZS4KLU5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCi0gICAKLSAkSGVhZGVyOiAvL3NvdXJjZS9xY29tL3FjdC9tdWx0aW1lZGlhMi9BdWRpby9kcml2ZXJzL1FEU1A1RHJpdmVyL1FEU1A1SW50ZXJmYWNlL21haW4vbGF0ZXN0L3Fkc3A1YXVkcHJlcHJvY21zZy5oIzMgJAotICAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qCi0gKiBBRFNQUkVQUk9DVEFTSyBNZXNzYWdlcwotICogQVVEUFJFUFJPQ1RBU0sgdXNlcyBhdWRQcmVQcm9jVXBSbGlzdCB0byBjb21tdW5pY2F0ZSB3aXRoIEFSTQotICogTG9jYXRpb24JOiBNRU1BCi0gKiBNZXNzYWdlIExlbmd0aCAgOiAyCi0gKi8KLQotLyoKLSAqIE1lc3NhZ2UgdG8gaW5kaWNhdGUgcGFydGljdWxhciBmZWF0dXJlIGhhcyBiZWVuIGVuYWJsZWQgb3IgZGlzYWJsZWQKLSAqLwotCi0KLSNkZWZpbmUJQVVEUFJFUFJPQ19NU0dfQ01EX0NGR19ET05FX01TRwkweDAwMDEKLSNkZWZpbmUJQVVEUFJFUFJPQ19NU0dfQ01EX0NGR19ET05FX01TR19MRU4JXAotCXNpemVvZihhdWRwcmVwcm9jX21zZ19jbWRfY2ZnX2RvbmVfbXNnKQotCi0jZGVmaW5lCUFVRFBSRVBST0NfTVNHX1RZUEVfQUdDCQkJMHgwMDAwCi0jZGVmaW5lCUFVRFBSRVBST0NfTVNHX1RZUEVfTk9JU0VfUkVEVUNUSU9OCTB4MDAwMQotI2RlZmluZQlBVURQUkVQUk9DX01TR19UWVBFX0lJUl9GSUxURVIJCTB4MDAwMgotCi0KLSNkZWZpbmUJQVVEUFJFUFJPQ19NU0dfU1RBVFVTX0ZMQUdfRU5BCQktMQotI2RlZmluZQlBVURQUkVQUk9DX01TR19TVEFUVVNfRkxBR19ESVMJCTB4MDAwMAotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQJdHlwZTsKLQlzaWduZWQgc2hvcnQJc3RhdHVzX2ZsYWc7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGF1ZHByZXByb2NfbXNnX2NtZF9jZmdfZG9uZV9tc2c7Ci0KLQotLyoKLSAqIE1lc3NhZ2UgdG8gaW5kaWNhdGUgcGFydGljdWxhciBmZWF0dXJlIGhhcyBzZWxlY3RlZCBmb3Igd3Jvbmcgc2FtcCBmcmVxCi0gKi8KLQotI2RlZmluZQlBVURQUkVQUk9DX01TR19FUlJPUl9NU0dfSUQJCTB4MDAwMgotI2RlZmluZQlBVURQUkVQUk9DX01TR19FUlJPUl9NU0dfSURfTEVOCVwKLQlzaXplb2YoYXVkcHJlcHJvY19tc2dfZXJyb3JfbXNnX2lkKQotCi0jZGVmaW5lCUFVRFBSRVBST0NfTVNHX0VSUl9JTkRFWF9OUwkJMHgwMDAwCi0KLXR5cGVkZWYgc3RydWN0IHsKLQkgdW5zaWduZWQgc2hvcnQJZXJyX2luZGV4OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRwcmVwcm9jX21zZ19lcnJvcl9tc2dfaWQ7Ci0KLSNkZWZpbmUgQVVEUFJFUFJPQ19NU0dfRkVBVF9RVUVSWV9ETV9ET05FIDB4MDAwMwotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDVhdWRyZWNjbWRpLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDVhdWRyZWNjbWRpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjEyYzkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1YXVkcmVjY21kaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLSNpZm5kZWYgUURTUDVBVURSRUNDTURJX0gKLSNkZWZpbmUgUURTUDVBVURSRUNDTURJX0gKLQotLyo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSoKLSAqCi0gKiAgICBBIFUgRCBJIE8gICBSIEUgQyBPIFIgRCAgSSBOIFQgRSBSIE4gQSBMICBDIE8gTSBNIEEgTiBEIFMKLSAqCi0gKiBHRU5FUkFMIERFU0NSSVBUSU9OCi0gKiAgIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbnRpb25zIG9mIGZvcm1hdCBibG9ja3Mgb2YgY29tbWFuZHMKLSAqICAgdGhhdCBhcmUgYWNjZXB0ZWQgYnkgQVVEUkVDIFRhc2sKLSAqCi0gKiBSRUZFUkVOQ0VTCi0gKiAgIE5vbmUKLSAqCi0gKiBFWFRFUk5BTElaRUQgRlVOQ1RJT05TCi0gKiAgTm9uZQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5Mi0yMDA5LCAyMDExIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKLQotVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZS4KLU5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCi0gICAKLSAkSGVhZGVyOiAvL3NvdXJjZS9xY29tL3FjdC9tdWx0aW1lZGlhMi9BdWRpby9kcml2ZXJzL1FEU1A1RHJpdmVyL1FEU1A1SW50ZXJmYWNlL21haW4vbGF0ZXN0L3Fkc3A1YXVkcmVjY21kaS5oIzMgJAotICAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKgotICogQVVEUkVDVEFTSyBDT01NQU5EUwotICogQVJNIHVzZXMgMiBxdWV1ZXMgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgQVVEUkVDVEFTSwotICogMS51UEF1ZFJlY0NtZFF1ZXVlCi0gKiBMb2NhdGlvbiA6TUVNQwotICogQnVmZmVyIFNpemUgOiA4Ci0gKiBObyBvZiBCdWZmZXJzIGluIGEgcXVldWUgOiAzCi0gKiAyLmF1ZFJlY1VwQml0U3RyZWFtUXVldWUKLSAqIExvY2F0aW9uIDogTUVNQwotICogQnVmZmVyIFNpemUgOiA0Ci0gKiBObyBvZiBidWZmZXJzIGluIGEgcXVldWUgOiAyCi0gKi8KLQotLyoKLSAqIENvbW1hbmRzIG9uIHVQQXVkUmVjQ21kUXVldWUgCi0gKi8KLQotLyoKLSAqIENvbW1hbmQgdG8gaW5pdGlhdGUgYW5kIHRlcm1pbmF0ZSB0aGUgYXVkaW8gcmVjb3JkaW5nIHNlY3Rpb24KLSAqLwotCi0jZGVmaW5lIEFVRFJFQ19DTURfQ0ZHCQkweDAwMDAKLSNkZWZpbmUJQVVEUkVDX0NNRF9DRkdfTEVOCXNpemVvZihhdWRyZWNfY21kX2NmZykKLQotI2RlZmluZQlBVURSRUNfQ01EX1RZUEVfMF9JTkRFWF9XQVYJMHgwMDAwCi0jZGVmaW5lCUFVRFJFQ19DTURfVFlQRV8wX0lOREVYX0FBQwkweDAwMDEKLSNkZWZpbmUJQVVEUkVDX0NNRF9UWVBFXzBfSU5ERVhfQU1STkIJMHgwMDBBCi0jZGVmaW5lCUFVRFJFQ19DTURfVFlQRV8wX0lOREVYX0VWUkMJMHgwMDBCCi0jZGVmaW5lCUFVRFJFQ19DTURfVFlQRV8wX0lOREVYX1FDRUxQCTB4MDAwQwotCi0jZGVmaW5lIEFVRFJFQ19DTURfVFlQRV8wX0VOQQkJMHg0MDAwCi0jZGVmaW5lIEFVRFJFQ19DTURfVFlQRV8wX0RJUwkJMHgwMDAwCi0KLSNkZWZpbmUgQVVEUkVDX0NNRF9UWVBFXzBfTk9VUERBVEUJMHgwMDAwCi0jZGVmaW5lIEFVRFJFQ19DTURfVFlQRV8wX1VQREFURQkweDgwMDAKLQotI2RlZmluZQlBVURSRUNfQ01EX1RZUEVfMV9JTkRFWF9TQkMJMHgwMDAyCi0KLSNkZWZpbmUgQVVEUkVDX0NNRF9UWVBFXzFfRU5BCQkweDQwMDAKLSNkZWZpbmUgQVVEUkVDX0NNRF9UWVBFXzFfRElTCQkweDAwMDAKLQotI2RlZmluZSBBVURSRUNfQ01EX1RZUEVfMV9OT1VQREFURQkweDAwMDAKLSNkZWZpbmUgQVVEUkVDX0NNRF9UWVBFXzFfVVBEQVRFCTB4ODAwMAotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQgCWNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydAl0eXBlXzA7Ci0JdW5zaWduZWQgc2hvcnQJdHlwZV8xOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdWRyZWNfY21kX2NmZzsKLQotCi0vKgotICogQ29tbWFuZCB0byBjb25maWd1cmUgdGhlIHJlY29yZGluZyBwYXJhbWV0ZXJzIGZvciBSZWNUeXBlMChBQUMvV0FWKSBlbmNvZGVyCi0gKi8KLQotI2RlZmluZQlBVURSRUNfQ01EX0FSRUMwUEFSQU1fQ0ZHCTB4MDAwMQotI2RlZmluZQlBVURSRUNfQ01EX0FSRUMwUEFSQU1fQ0ZHX0xFTglcCi0Jc2l6ZW9mKGF1ZHJlY19jbWRfYXJlYzBwYXJhbV9jZmcpCi0KLSNkZWZpbmUJQVVEUkVDX0NNRF9TQU1QX1JBVEVfSU5EWF84MDAwCQkweDAwMEIKLSNkZWZpbmUJQVVEUkVDX0NNRF9TQU1QX1JBVEVfSU5EWF8xMTAyNQkJMHgwMDBBCi0jZGVmaW5lCUFVRFJFQ19DTURfU0FNUF9SQVRFX0lORFhfMTIwMDAJCTB4MDAwOQotI2RlZmluZQlBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzE2MDAwCQkweDAwMDgKLSNkZWZpbmUJQVVEUkVDX0NNRF9TQU1QX1JBVEVfSU5EWF8yMjA1MAkJMHgwMDA3Ci0jZGVmaW5lCUFVRFJFQ19DTURfU0FNUF9SQVRFX0lORFhfMjQwMDAJCTB4MDAwNgotI2RlZmluZQlBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzMyMDAwCQkweDAwMDUKLSNkZWZpbmUJQVVEUkVDX0NNRF9TQU1QX1JBVEVfSU5EWF80NDEwMAkJMHgwMDA0Ci0jZGVmaW5lCUFVRFJFQ19DTURfU0FNUF9SQVRFX0lORFhfNDgwMDAJCTB4MDAwMwotCi0jZGVmaW5lIEFVRFJFQ19DTURfU1RFUkVPX01PREVfTU9OTwkJMHgwMDAwCi0jZGVmaW5lIEFVRFJFQ19DTURfU1RFUkVPX01PREVfU1RFUkVPCQkweDAwMDEKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0IAljbWRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQJcHRyX3RvX2V4dHBrdF9idWZmZXJfbXN3OwotCXVuc2lnbmVkIHNob3J0CXB0cl90b19leHRwa3RfYnVmZmVyX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAlidWZfbGVuOwotCXVuc2lnbmVkIHNob3J0CXNhbXBfcmF0ZV9pbmRleDsKLQl1bnNpZ25lZCBzaG9ydAlzdGVyZW9fbW9kZTsKLQl1bnNpZ25lZCBzaG9ydCAJcmVjX3F1YWxpdHk7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGF1ZHJlY19jbWRfYXJlYzBwYXJhbV9jZmc7Ci0KLS8qCi0gKiBDb21tYW5kIHRvIGNvbmZpZ3VyZSB0aGUgcmVjb3JkaW5nIHBhcmFtZXRlcnMgZm9yIFJlY1R5cGUxKFNCQykgZW5jb2RlcgotICovCi0KLSNkZWZpbmUgQVVEUkVDX0NNRF9BUkVDMVBBUkFNX0NGRwkweDAwMDIKLSNkZWZpbmUgQVVEUkVDX0NNRF9BUkVDMVBBUkFNX0NGR19MRU4JXAotCXNpemVvZihhdWRyZWNfY21kX2FyZWMxcGFyYW1fY2ZnKQotCi0jZGVmaW5lIEFVRFJFQ19DTURfUEFSQU1fQlVGX0JMT0NLU180CTB4MDAwMAotI2RlZmluZSBBVURSRUNfQ01EX1BBUkFNX0JVRl9CTE9DS1NfOAkweDAwMDEKLSNkZWZpbmUgQVVEUkVDX0NNRF9QQVJBTV9CVUZfQkxPQ0tTXzEyCTB4MDAwMgotI2RlZmluZSBBVURSRUNfQ01EX1BBUkFNX0JVRl9CTE9DS1NfMTYJMHgwMDAzCi0KLSNkZWZpbmUgQVVEUkVDX0NNRF9QQVJBTV9CVUZfU1VCX0JBTkRTXzgJMHgwMDEwCi0jZGVmaW5lIEFVRFJFQ19DTURfUEFSQU1fQlVGX01PREVfTU9OTwkJMHgwMDAwCi0jZGVmaW5lIEFVRFJFQ19DTURfUEFSQU1fQlVGX01PREVfRFVBTAkJMHgwMDQwCi0jZGVmaW5lIEFVRFJFQ19DTURfUEFSQU1fQlVGX01PREVfU1RFUkVPCTB4MDA1MAotI2RlZmluZSBBVURSRUNfQ01EX1BBUkFNX0JVRl9NT0RFX0pTVEVSRU8JMHgwMDYwCi0jZGVmaW5lIEFVRFJFQ19DTURfUEFSQU1fQlVGX0xPVURORVNTCQkweDAwMDAKLSNkZWZpbmUgQVVEUkVDX0NNRF9QQVJBTV9CVUZfU05SCQkweDAxMDAKLSNkZWZpbmUgQVVEUkVDX0NNRF9QQVJBTV9CVUZfQkFTSUNfVkVSCQkweDAwMDAKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0IAljbWRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQJcHRyX3RvX2V4dHBrdF9idWZmZXJfbXN3OwotCXVuc2lnbmVkIHNob3J0CXB0cl90b19leHRwa3RfYnVmZmVyX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAlidWZfbGVuOwotCXVuc2lnbmVkIHNob3J0CXBhcmFtX2J1ZjsKLQl1bnNpZ25lZCBzaG9ydAliaXRfcmF0ZV8wOwotCXVuc2lnbmVkIHNob3J0CWJpdF9yYXRlXzE7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGF1ZHJlY19jbWRfYXJlYzFwYXJhbV9jZmc7Ci0KLS8qCi0gKiBDb21tYW5kIHRvIGVuYWJsZSBlbmNvZGVyIGZvciB0aGUgcmVjb3JkaW5nCi0gKi8KLQotI2RlZmluZSBBVURSRUNfQ01EX0VOQ19DRkcJMHgwMDAzCi0jZGVmaW5lIEFVRFJFQ19DTURfRU5DX0NGR19MRU4JXAotCXNpemVvZihzdHJ1Y3QgYXVkcmVjX2NtZF9lbmNfY2ZnKQotCi0KLSNkZWZpbmUgQVVEUkVDX0NNRF9FTkNfRU5BCQkweDgwMDAKLSNkZWZpbmUgQVVEUkVDX0NNRF9FTkNfRElTCQkweDAwMDAKLQotI2RlZmluZSBBVURSRUNfQ01EX0VOQ19UWVBFX01BU0sJMHgwMDFGCi0KLXN0cnVjdCBhdWRyZWNfY21kX2VuY19jZmcgewotCXVuc2lnbmVkIHNob3J0IAljbWRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQJYXVkcmVjX2VuY190eXBlOwotCXVuc2lnbmVkIHNob3J0CWF1ZHJlY19vYmpfaWR4OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIENvbW1hbmQgdG8gc2V0IGV4dGVybmFsIG1lbW9yeSBjb25maWcgZm9yIHRoZSBzZWxlY3RlZCBlbmNvZGVyCi0gKi8KLQotI2RlZmluZSBBVURSRUNfQ01EX0FSRUNNRU1fQ0ZHCTB4MDAwNAotI2RlZmluZSBBVURSRUNfQ01EX0FSRUNNRU1fQ0ZHX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRyZWNfY21kX2FyZWNtZW1fY2ZnKQotCi0KLXN0cnVjdCBhdWRyZWNfY21kX2FyZWNtZW1fY2ZnIHsKLQl1bnNpZ25lZCBzaG9ydCAJY21kX2lkOwotCXVuc2lnbmVkIHNob3J0CWF1ZHJlY19vYmpfaWR4OwotCXVuc2lnbmVkIHNob3J0CWF1ZHJlY191cF9wa3RfaW50bV9jbnQ7Ci0JdW5zaWduZWQgc2hvcnQJYXVkcmVjX2V4dHBrdF9idWZmZXJfbXN3OwotCXVuc2lnbmVkIHNob3J0CWF1ZHJlY19leHRwa3RfYnVmZmVyX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAlhdWRyZWNfZXh0cGt0X2J1ZmZlcl9udW07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogQ29tbWFuZCB0byBjb25maWd1cmUgdGhlIHJlY29yZGluZyBwYXJhbWV0ZXJzIGZvciBzZWxlY3RlZCBlbmNvZGVyCi0gKi8KLQotI2RlZmluZSBBVURSRUNfQ01EX0FSRUNQQVJBTV9DRkcJMHgwMDA1Ci0jZGVmaW5lIEFVRFJFQ19DTURfQVJFQ1BBUkFNX0NPTU1PTl9DRkdfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHJlY19jbWRfYXJlY3BhcmFtX2NvbW1vbl9jZmcpCi0KLQotc3RydWN0IGF1ZHJlY19jbWRfYXJlY3BhcmFtX2NvbW1vbl9jZmcgewotCXVuc2lnbmVkIHNob3J0IAljbWRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQJYXVkcmVjX29ial9pZHg7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZGVmaW5lIEFVRFJFQ19DTURfQVJFQ1BBUkFNX1dBVl9DRkdfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHJlY19jbWRfYXJlY3BhcmFtX3dhdl9jZmcpCi0KLQotc3RydWN0IGF1ZHJlY19jbWRfYXJlY3BhcmFtX3dhdl9jZmcgewotCXN0cnVjdCBhdWRyZWNfY21kX2FyZWNwYXJhbV9jb21tb25fY2ZnIGNvbW1vbjsKLQl1bnNpZ25lZCBzaG9ydCAJc2FtcF9yYXRlX2lkeDsKLQl1bnNpZ25lZCBzaG9ydCAgc3RlcmVvX21vZGU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZGVmaW5lIEFVRFJFQ19DTURfQVJFQ1BBUkFNX0FBQ19DRkdfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHJlY19jbWRfYXJlY3BhcmFtX2FhY19jZmcpCi0KLQotc3RydWN0IGF1ZHJlY19jbWRfYXJlY3BhcmFtX2FhY19jZmcgewotCXN0cnVjdCBhdWRyZWNfY21kX2FyZWNwYXJhbV9jb21tb25fY2ZnIGNvbW1vbjsKLQl1bnNpZ25lZCBzaG9ydCAJc2FtcF9yYXRlX2lkeDsKLQl1bnNpZ25lZCBzaG9ydCAgc3RlcmVvX21vZGU7Ci0JdW5zaWduZWQgc2hvcnQgIHJlY19xdWFsaXR5OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2RlZmluZSBBVURSRUNfQ01EX0FSRUNQQVJBTV9TQkNfQ0ZHX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRyZWNfY21kX2FyZWNwYXJhbV9zYmNfY2ZnKQotCi0KLXN0cnVjdCBhdWRyZWNfY21kX2FyZWNwYXJhbV9zYmNfY2ZnIHsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9hcmVjcGFyYW1fY29tbW9uX2NmZyBjb21tb247Ci0JdW5zaWduZWQgc2hvcnQgCXBhcmFtX2J1ZjsKLQl1bnNpZ25lZCBzaG9ydCAgYml0X3JhdGVfMDsKLQl1bnNpZ25lZCBzaG9ydCAgYml0X3JhdGVfMTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgQVVEUkVDX0NNRF9BUkVDUEFSQU1fQU1STkJfQ0ZHX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRyZWNfY21kX2FyZWNwYXJhbV9hbXJuYl9jZmcpCi0KLQotc3RydWN0IGF1ZHJlY19jbWRfYXJlY3BhcmFtX2Ftcm5iX2NmZyB7Ci0Jc3RydWN0IGF1ZHJlY19jbWRfYXJlY3BhcmFtX2NvbW1vbl9jZmcgY29tbW9uOwotCXVuc2lnbmVkIHNob3J0IAlzYW1wX3JhdGVfaWR4OwotCXVuc2lnbmVkIHNob3J0IAl2b2ljZW1lbW9lbmN3ZWlnaHQxOwotCXVuc2lnbmVkIHNob3J0IAl2b2ljZW1lbW9lbmN3ZWlnaHQyOwotCXVuc2lnbmVkIHNob3J0IAl2b2ljZW1lbW9lbmN3ZWlnaHQzOwotCXVuc2lnbmVkIHNob3J0IAl2b2ljZW1lbW9lbmN3ZWlnaHQ0OwotCXVuc2lnbmVkIHNob3J0IAl1cGRhdGVfbW9kZTsKLQl1bnNpZ25lZCBzaG9ydCAJZHR4X21vZGU7Ci0JdW5zaWduZWQgc2hvcnQgCXRlc3RfbW9kZTsKLQl1bnNpZ25lZCBzaG9ydCAJdXNlZF9tb2RlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2RlZmluZSBBVURSRUNfQ01EX0FSRUNQQVJBTV9FVlJDX0NGR19MRU4JXAotCXNpemVvZihzdHJ1Y3QgYXVkcmVjX2NtZF9hcmVjcGFyYW1fZXZyY19jZmcpCi0KLQotc3RydWN0IGF1ZHJlY19jbWRfYXJlY3BhcmFtX2V2cmNfY2ZnIHsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9hcmVjcGFyYW1fY29tbW9uX2NmZyBjb21tb247Ci0JdW5zaWduZWQgc2hvcnQgCXNhbXBfcmF0ZV9pZHg7Ci0JdW5zaWduZWQgc2hvcnQgCXZvaWNlbWVtb2VuY3dlaWdodDE7Ci0JdW5zaWduZWQgc2hvcnQgCXZvaWNlbWVtb2VuY3dlaWdodDI7Ci0JdW5zaWduZWQgc2hvcnQgCXZvaWNlbWVtb2VuY3dlaWdodDM7Ci0JdW5zaWduZWQgc2hvcnQgCXZvaWNlbWVtb2VuY3dlaWdodDQ7Ci0JdW5zaWduZWQgc2hvcnQgCXVwZGF0ZV9tb2RlOwotCXVuc2lnbmVkIHNob3J0IAllbmNfbWluX3JhdGU7Ci0JdW5zaWduZWQgc2hvcnQgCWVuY19tYXhfcmF0ZTsKLQl1bnNpZ25lZCBzaG9ydCAJcmF0ZV9tb2R1bGF0aW9uX2NtZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgQVVEUkVDX0NNRF9BUkVDUEFSQU1fUUNFTFBfQ0ZHX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRyZWNfY21kX2FyZWNwYXJhbV9xY2VscF9jZmcpCi0KLQotc3RydWN0IGF1ZHJlY19jbWRfYXJlY3BhcmFtX3FjZWxwX2NmZyB7Ci0Jc3RydWN0IGF1ZHJlY19jbWRfYXJlY3BhcmFtX2NvbW1vbl9jZmcgY29tbW9uOwotCXVuc2lnbmVkIHNob3J0IAlzYW1wX3JhdGVfaWR4OwotCXVuc2lnbmVkIHNob3J0IAl2b2ljZW1lbW9lbmN3ZWlnaHQxOwotCXVuc2lnbmVkIHNob3J0IAl2b2ljZW1lbW9lbmN3ZWlnaHQyOwotCXVuc2lnbmVkIHNob3J0IAl2b2ljZW1lbW9lbmN3ZWlnaHQzOwotCXVuc2lnbmVkIHNob3J0IAl2b2ljZW1lbW9lbmN3ZWlnaHQ0OwotCXVuc2lnbmVkIHNob3J0IAl1cGRhdGVfbW9kZTsKLQl1bnNpZ25lZCBzaG9ydCAJZW5jX21pbl9yYXRlOwotCXVuc2lnbmVkIHNob3J0IAllbmNfbWF4X3JhdGU7Ci0JdW5zaWduZWQgc2hvcnQgCXJhdGVfbW9kdWxhdGlvbl9jbWQ7Ci0JdW5zaWduZWQgc2hvcnQgCXJlZHVjZWRfcmF0ZV9sZXZlbDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgQVVEUkVDX0NNRF9BUkVDUEFSQU1fRkdWTkJfQ0ZHX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRyZWNfY21kX2FyZWNwYXJhbV9mZ3ZuYl9jZmcpCi0KLQotc3RydWN0IGF1ZHJlY19jbWRfYXJlY3BhcmFtX2Zndm5iX2NmZyB7Ci0Jc3RydWN0IGF1ZHJlY19jbWRfYXJlY3BhcmFtX2NvbW1vbl9jZmcgY29tbW9uOwotCXVuc2lnbmVkIHNob3J0IAlzYW1wX3JhdGVfaWR4OwotCXVuc2lnbmVkIHNob3J0IAl2b2ljZW1lbW9lbmN3ZWlnaHQxOwotCXVuc2lnbmVkIHNob3J0IAl2b2ljZW1lbW9lbmN3ZWlnaHQyOwotCXVuc2lnbmVkIHNob3J0IAl2b2ljZW1lbW9lbmN3ZWlnaHQzOwotCXVuc2lnbmVkIHNob3J0IAl2b2ljZW1lbW9lbmN3ZWlnaHQ0OwotCXVuc2lnbmVkIHNob3J0IAl1cGRhdGVfbW9kZTsKLQl1bnNpZ25lZCBzaG9ydCAJZmd2X21pbl9yYXRlOwotCXVuc2lnbmVkIHNob3J0IAlmZ3ZfbWF4X3JhdGU7Ci0JdW5zaWduZWQgc2hvcnQgCXJlZHVjZWRfcmF0ZV9sZXZlbDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIHRvIGNvbmZpZ3VyZSBUdW5uZWwoUlQpIG9yIE5vbi1UdW5uZWwoRlRSVCkgbW9kZQotICovCi0KLSNkZWZpbmUgQVVEUkVDX0NNRF9ST1VUSU5HX01PREUJCTB4MDAwNgotI2RlZmluZQlBVURSRUNfQ01EX1JPVVRJTkdfTU9ERV9MRU4JXAotCXNpemVvZihzdHJ1Y3QgYXVkcHJlcHJvY19hdWRyZWNfY21kX3JvdXRpbmdfbW9kZSkKLQotI2RlZmluZSBBVURJT19ST1VUSU5HX01PREVfRlRSVAkJMHgwMDAxCi0jZGVmaW5lIEFVRElPX1JPVVRJTkdfTU9ERV9SVAkJMHgwMDAyCi0KLXN0cnVjdCBhdWRyZWNfY21kX3JvdXRpbmdfbW9kZSB7Ci0JdW5zaWduZWQgc2hvcnQgY21kX2lkOwotCXVuc2lnbmVkIHNob3J0IHJvdXRpbmdfbW9kZTsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBDb21tYW5kIHRvIGNvbmZpZ3VyZSBwY20gaW5wdXQgbWVtb3J5Ci0gKi8KLQotI2RlZmluZSBBVURSRUNfQ01EX1BDTV9DRkdfQVJNX1RPX0VOQyAweDAwMDcKLSNkZWZpbmUgQVVEUkVDX0NNRF9QQ01fQ0ZHX0FSTV9UT19FTkNfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHJlY19jbWRfcGNtX2NmZ19hcm1fdG9fZW5jKQotCi1zdHJ1Y3QgYXVkcmVjX2NtZF9wY21fY2ZnX2FybV90b19lbmMgewotCXVuc2lnbmVkIHNob3J0IGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCBjb25maWdfdXBkYXRlX2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQgZW5hYmxlX2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQgc2FtcGxpbmdfZnJlcTsKLQl1bnNpZ25lZCBzaG9ydCBjaGFubmVsczsKLQl1bnNpZ25lZCBzaG9ydCBmcmVxdWVuY3lfb2ZfaW50aW1hdGlvbjsKLQl1bnNpZ25lZCBzaG9ydCBtYXhfbnVtYmVyX29mX2J1ZmZlcnM7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFVRFJFQ19QQ01fQ09ORklHX1VQREFURV9GTEFHX0VOQUJMRSAtMQotI2RlZmluZSBBVURSRUNfUENNX0NPTkZJR19VUERBVEVfRkxBR19ESVNBQkxFIDAKLQotI2RlZmluZSBBVURSRUNfRU5BQkxFX0ZMQUdfVkFMVUUgLTEKLSNkZWZpbmUgQVVEUkVDX0RJU0FCTEVfRkxBR19WQUxVRSAwCi0KLS8qCi0gKiBDb21tYW5kIHRvIGludGltYXRlIGF2YWlsYWJsZSBwY20gYnVmZmVyCi0gKi8KLQotI2RlZmluZSBBVURSRUNfQ01EX1BDTV9CVUZGRVJfUFRSX1JFRlJFU0hfQVJNX1RPX0VOQyAweDAwMDgKLSNkZWZpbmUgQVVEUkVDX0NNRF9QQ01fQlVGRkVSX1BUUl9SRUZSRVNIX0FSTV9UT19FTkNfTEVOIFwKLQlzaXplb2Yoc3RydWN0IGF1ZHJlY19jbWRfcGNtX2J1ZmZlcl9wdHJfcmVmcmVzaF9hcm1fZW5jKQotCi1zdHJ1Y3QgYXVkcmVjX2NtZF9wY21fYnVmZmVyX3B0cl9yZWZyZXNoX2FybV9lbmMgewotCXVuc2lnbmVkIHNob3J0IGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCBudW1fYnVmZmVyczsKLQl1bnNpZ25lZCBzaG9ydCBidWZmZXJfd3JpdGVfY250X21zdzsKLQl1bnNpZ25lZCBzaG9ydCBidWZmZXJfd3JpdGVfY250X2xzdzsKLQl1bnNpZ25lZCBzaG9ydCBidWZfYWRkcmVzc19sZW5ndGhbOF07Lyp0aGlzIGFycmF5IGhvbGRzIGFkZHJlc3MKLQkJCQkJCWFuZCBsZW5ndGggZGV0YWlscyBvZgotCQkJCQkJdHdvIGJ1ZmZlcnMqLwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIENvbW1hbmQgdG8gZmx1c2gKLSAqLwotCi0jZGVmaW5lIEFVRFJFQ19DTURfRkxVU0ggMHgwMDkKLSNkZWZpbmUgQVVEUkVDX0NNRF9GTFVTSF9MRU4JXAotCXNpemVvZihzdHJ1Y3QgYXVkcmVjX2NtZF9mbHVzaCkKLQotc3RydWN0IGF1ZHJlY19jbWRfZmx1c2ggewotCXVuc2lnbmVkIHNob3J0IGNtZF9pZDsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBDb21tYW5kcyBvbiBhdWRSZWNVcEJpdFN0cmVhbVF1ZXVlCi0gKi8KLQotLyoKLSAqIENvbW1hbmQgdG8gaW5kaWNhdGUgdGhlIGN1cnJlbnQgcGFja2V0IHJlYWQgY291bnQKLSAqLwotCi0jZGVmaW5lIEFVRFJFQ19DTURfUEFDS0VUX0VYVF9QVFIJCTB4MDAwMAotI2RlZmluZSBBVURSRUNfQ01EX1BBQ0tFVF9FWFRfUFRSX0xFTglcCi0Jc2l6ZW9mKGF1ZHJlY19jbWRfcGFja2V0X2V4dF9wdHIpCi0KLSNkZWZpbmUgQVVEUkVDX0NNRF9UWVBFXzAJMHgwMDAwCi0jZGVmaW5lIEFVRFJFQ19DTURfVFlQRV8xCTB4MDAwMQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQgIGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydAl0eXBlOyAvKiBhdWRyZWNfb2JqX2lkeCAqLwotCXVuc2lnbmVkIHNob3J0IAljdXJyX3JlY19jb3VudF9tc3c7Ci0JdW5zaWduZWQgc2hvcnQgCWN1cnJfcmVjX2NvdW50X2xzdzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYXVkcmVjX2NtZF9wYWNrZXRfZXh0X3B0cjsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDVhdWRyZWNtc2cuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWF1ZHJlY21zZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmJkYWEyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWF1ZHJlY21zZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLSNpZm5kZWYgUURTUDVBVURSRUNNU0dJX0gKLSNkZWZpbmUgUURTUDVBVURSRUNNU0dJX0gKLQotLyo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSoKLSAqCi0gKiAgICBBIFUgRCBJIE8gICBSIEUgQyBPIFIgRCAgTSBFIFMgUyBBIEcgRSBTCi0gKgotICogR0VORVJBTCBERVNDUklQVElPTgotICogIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbnRpb25zIG9mIGZvcm1hdCBibG9ja3Mgb2YgbWVzc2FnZXMKLSAqICB0aGF0IGFyZSBzZW50IGJ5IEFVRFJFQyBUYXNrCi0gKgotICogUkVGRVJFTkNFUwotICogICBOb25lCi0gKgotICogRVhURVJOQUxJWkVEIEZVTkNUSU9OUwotICogIE5vbmUKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTItMjAwOSwgMjAxMSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCi0KLVRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUuCi1Ob3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgotICAgCi0gJEhlYWRlcjogLy9zb3VyY2UvcWNvbS9xY3QvbXVsdGltZWRpYTIvQXVkaW8vZHJpdmVycy9RRFNQNURyaXZlci9RRFNQNUludGVyZmFjZS9tYWluL2xhdGVzdC9xZHNwNWF1ZHJlY21zZy5oIzMgJAotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyoKLSAqIEFVRFJFQ1RBU0sgTUVTU0FHRVMKLSAqIEFVRFJFQ1RBU0sgdXNlcyBhdWRSZWNVcFJsaXN0IHRvIGNvbW11bmljYXRlIHdpdGggQVJNCi0gKiBMb2NhdGlvbiA6IE1FTUMKLSAqIEJ1ZmZlciBzaXplIDogNAotICogTm8gb2YgYnVmZmVycyBpbiBhIHF1ZXVlIDogMgotICovCi0KLS8qCi0gKiBNZXNzYWdlIHRvIG5vdGlmeSB0aGF0IGNvbmZpZyBjb21tYW5kIGlzIGRvbmUKLSAqLwotCi0jZGVmaW5lIEFVRFJFQ19NU0dfQ01EX0NGR19ET05FX01TRwkweDAwMDIKLSNkZWZpbmUgQVVEUkVDX01TR19DTURfQ0ZHX0RPTkVfTVNHX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRyZWNfbXNnX2NtZF9jZmdfZG9uZV9tc2cpCi0KLQotI2RlZmluZSBBVURSRUNfTVNHX0NGR19ET05FX1RZUEVfMF9FTkEJCTB4NDAwMAotI2RlZmluZSBBVURSRUNfTVNHX0NGR19ET05FX1RZUEVfMF9ESVMJCTB4MDAwMAotCi0jZGVmaW5lIEFVRFJFQ19NU0dfQ0ZHX0RPTkVfVFlQRV8wX05PX1VQREFURQkweDAwMDAKLSNkZWZpbmUgQVVEUkVDX01TR19DRkdfRE9ORV9UWVBFXzBfVVBEQVRFCTB4ODAwMAotCi0jZGVmaW5lIEFVRFJFQ19NU0dfQ0ZHX0RPTkVfVFlQRV8xX0VOQQkJMHg0MDAwCi0jZGVmaW5lIEFVRFJFQ19NU0dfQ0ZHX0RPTkVfVFlQRV8xX0RJUwkJMHgwMDAwCi0KLSNkZWZpbmUgQVVEUkVDX01TR19DRkdfRE9ORV9UWVBFXzFfTk9fVVBEQVRFCTB4MDAwMAotI2RlZmluZSBBVURSRUNfTVNHX0NGR19ET05FX1RZUEVfMV9VUERBVEUJMHg4MDAwCi0KLSNkZWZpbmUgQVVEUkVDX01TR19DRkdfRE9ORV9FTkNfRU5BCQkweDgwMDAKLSNkZWZpbmUgQVVEUkVDX01TR19DRkdfRE9ORV9FTkNfRElTCQkweDAwMDAKLQotc3RydWN0IGF1ZHJlY19tc2dfY21kX2NmZ19kb25lX21zZyB7Ci0JdW5zaWduZWQgc2hvcnQJYXVkcmVjX2VuY190eXBlOwotCXVuc2lnbmVkIHNob3J0CWF1ZHJlY19vYmpfaWR4OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIE1lc3NhZ2UgdG8gbm90aWZ5IGFyZWMwLzEgb3IgY29uY3VycmVudCBlbmNvZGVyIGNmZyBkb25lCi0gKiBhbmQgcmVjb3JkaW5nIHBhcmFtcyByZWNpZXZlZCBieSB0YXNrCi0gKi8KLQotI2RlZmluZQlBVURSRUNfTVNHX0NNRF9BUkVDX1BBUkFNX0NGR19ET05FX01TRwkJMHgwMDAzCi0jZGVmaW5lCUFVRFJFQ19NU0dfQ01EX0FSRUNfUEFSQU1fQ0ZHX0RPTkVfTVNHX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRyZWNfbXNnX2NtZF9hcmVjX3BhcmFtX2NmZ19kb25lX21zZykKLQotCi0jZGVmaW5lCUFVRFJFQ19NU0dfQVJFQ19QQVJBTV9UWVBFXzAJMHgwMDAwCi0jZGVmaW5lCUFVRFJFQ19NU0dfQVJFQ19QQVJBTV9UWVBFXzEJMHgwMDAxCi0KLXN0cnVjdCBhdWRyZWNfbXNnX2NtZF9hcmVjX3BhcmFtX2NmZ19kb25lX21zZyB7Ci0JdW5zaWduZWQgc2hvcnQJYXVkcmVjX29ial9pZHg7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogTWVzc2FnZSB0byBub3RpZnkgbm8gbW9yZSBidWZmZXJzIGFyZSBhdmFpbGFibGUgaW4gZXh0IG1lbSB0byBETUUKLSAqIE9yIG5vIGNvbmN1cnJlbnQgZW5jb2RlciBzdXBwb3J0ZWQKLSAqLwotLyogZm9yIDd4MjcgKi8KLSNkZWZpbmUgQVVEUkVDX01TR19GQVRBTF9FUlJfTVNHCQkweDAwMDQKLSNkZWZpbmUgQVVEUkVDX01TR19GQVRBTF9FUlJfTVNHX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRyZWNfbXNnX2ZhdGFsX2Vycl9tc2cpCi0KLQotI2RlZmluZSBBVURSRUNfTVNHX0ZBVEFMX0VSUl9UWVBFXzAJMHgwMDAwCi0jZGVmaW5lIEFVRFJFQ19NU0dfRkFUQUxfRVJSX1RZUEVfMQkweDAwMDEKLQotc3RydWN0IGF1ZHJlY19tc2dfZmF0YWxfZXJyX21zZyB7Ci0JdW5zaWduZWQgc2hvcnQJYXVkcmVjX29ial9pZHg7Ci0JdW5zaWduZWQgc2hvcnQJYXVkcmVjX2Vycl9pZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qIGZvciA3eDI3QSAqLwotI2RlZmluZSBBVURSRUNfTVNHX05PX0VYVF9QS1RfQVZBSUxBQkxFX01TRwkJMHgwMDA0Ci0jZGVmaW5lIEFVRFJFQ19NU0dfTk9fRVhUX1BLVF9BVkFJTEFCTEVfTVNHX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRyZWNfbXNnX25vX2V4dF9wa3RfYXZhaWxfbXNnKQotCi0jZGVmaW5lIEFVRFJFQ19NU0dfTk9fRVhUX1BLVF9BVkFJTEFCTEVfVFlQRV8wCTB4MDAwMAotI2RlZmluZSBBVURSRUNfTVNHX05PX0VYVF9QS1RfQVZBSUxBQkxFX1RZUEVfMQkweDAwMDEKLQotc3RydWN0IGF1ZHJlY19tc2dfbm9fZXh0X3BrdF9hdmFpbF9tc2cgewotCXVuc2lnbmVkIHNob3J0CWF1ZHJlY19vYmpfaWR4OwotCXVuc2lnbmVkIHNob3J0CWF1ZHJlY19lcnJfaWQ7Ci19IF9fcGFja2VkOwotCi0vKgotICogTWVzc2FnZSB0byBub3RpZnkgRE1FIGRlbGl2ZXJkIHRoZSBlbmNvZGVkIHBrdCB0byBleHQgcGt0IGJ1ZmZlcgotICovCi0KLSNkZWZpbmUgQVVEUkVDX01TR19QQUNLRVRfUkVBRFlfTVNHCQkweDAwMDUKLSNkZWZpbmUgQVVEUkVDX01TR19QQUNLRVRfUkVBRFlfTVNHX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRyZWNfbXNnX3BhY2tldF9yZWFkeV9tc2cpCi0KLQotI2RlZmluZSBBVURSRUNfTVNHX1BBQ0tFVF9SRUFEWV9UWVBFXzAJMHgwMDAwCi0jZGVmaW5lIEFVRFJFQ19NU0dfUEFDS0VUX1JFQURZX1RZUEVfMQkweDAwMDEKLQotc3RydWN0IGF1ZHJlY19tc2dfcGFja2V0X3JlYWR5X21zZyB7Ci0JdW5zaWduZWQgc2hvcnQJYXVkcmVjX29ial9pZHg7Ci0JdW5zaWduZWQgc2hvcnQJcGt0X2NvdW50ZXJfbXN3OwotCXVuc2lnbmVkIHNob3J0CXBrdF9jb3VudGVyX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAlwa3RfcmVhZF9jbnRfbXN3OwotCXVuc2lnbmVkIHNob3J0CXBrdF9yZWFkX2NudF9sc3c7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogTWVzc2FnZSB0byBub3RpZnkgZXh0ZXJuYWwgbWVtb3J5IGNmZyBkb25lIGFuZCByZWNpZXZlZCBieSB0YXNrCi0gKi8KLQotI2RlZmluZQlBVURSRUNfTVNHX0NNRF9BUkVDX01FTV9DRkdfRE9ORV9NU0cJCTB4MDAwNgotI2RlZmluZQlBVURSRUNfTVNHX0NNRF9BUkVDX01FTV9DRkdfRE9ORV9NU0dfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHJlY19tc2dfY21kX2FyZWNfbWVtX2NmZ19kb25lX21zZykKLQotCi1zdHJ1Y3QgYXVkcmVjX21zZ19jbWRfYXJlY19tZW1fY2ZnX2RvbmVfbXNnIHsKLQl1bnNpZ25lZCBzaG9ydAlhdWRyZWNfb2JqX2lkeDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBNZXNzYWdlIHRvIGluZGljYXRlIFJvdXRpbmcgbW9kZQotICogY29uZmlndXJhdGlvbiBzdWNjZXNzIG9yIGZhaWx1cmUKLSAqLwotCi0jZGVmaW5lIEFVRFJFQ19NU0dfQ01EX1JPVVRJTkdfTU9ERV9ET05FX01TRwkJIDB4MDAwNwotI2RlZmluZSBBVURSRUNfTVNHX0NNRF9ST1VUSU5HX01PREVfRE9ORV9NU0dfTEVOCSBcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRyZWNfbXNnX2NtZF9yb3V0aW5nX21vZGVfZG9uZV9tc2cpCi0KLXN0cnVjdCBhdWRyZWNfbXNnX2NtZF9yb3V0aW5nX21vZGVfZG9uZV9tc2cgewotCXVuc2lnbmVkIHNob3J0IGNvbmZpZ3VyYXRpb247Ci19IF9fcGFja2VkOwotCi0vKgotICogTWVzc2FnZSB0byBpbmRpY2F0ZSBwY20gYnVmZmVyIGNvbmZpZ3VyZWQKLSAqLwotCi0jZGVmaW5lIEFVRFJFQ19DTURfUENNX0NGR19BUk1fVE9fRU5DX0RPTkVfTVNHCQkweDAwMDgKLSNkZWZpbmUgQVVEUkVDX0NNRF9QQ01fQ0ZHX0FSTV9UT19FTkNfRE9ORV9NU0dfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHJlY19jbWRfcGNtX2NmZ19hcm1fdG9fZW5jX21zZykKLQotc3RydWN0ICBhdWRyZWNfY21kX3BjbV9jZmdfYXJtX3RvX2VuY19tc2cgewotCXVuc2lnbmVkIHNob3J0IGNvbmZpZ3VyYXRpb247Ci19IF9fcGFja2VkOwotCi0vKgotICogTWVzc2FnZSB0byBpbmRpY2F0ZSBlbmNvZGVkIHBhY2tldCBpcyBkZWxpdmVyZWQgdG8gZXh0ZXJuYWwgYnVmZmVyIGluIEZUUlQKLSAqLwotCi0jZGVmaW5lIEFVRFJFQ19VUF9OVF9QQUNLRVRfUkVBRFlfTVNHCQkJMHgwMDA5Ci0jZGVmaW5lIEFVRFJFQ19VUF9OVF9QQUNLRVRfUkVBRFlfTVNHX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRyZWNfdXBfbnRfcGFja2V0X3JlYWR5X21zZykKLQotc3RydWN0ICBhdWRyZWNfdXBfbnRfcGFja2V0X3JlYWR5X21zZyB7Ci0JdW5zaWduZWQgc2hvcnQgYXVkcmVjX3BhY2tldHdyaXRlX2NudF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQgYXVkcmVjX3BhY2tldHdyaXRlX2NudF9tc3c7Ci0JdW5zaWduZWQgc2hvcnQgYXVkcmVjX3VwcHJldl9yZWFkY291bnRfbHN3OwotCXVuc2lnbmVkIHNob3J0IGF1ZHJlY191cHByZXZfcmVhZGNvdW50X21zdzsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBNZXNzYWdlIHRvIGluZGljYXRlIHBjbSBidWZmZXIgaXMgY29uc3VtZWQKLSAqLwotCi0jZGVmaW5lIEFVRFJFQ19DTURfUENNX0JVRkZFUl9QVFJfVVBEQVRFX0FSTV9UT19FTkNfTVNHIDB4MDAwQQotI2RlZmluZSBBVURSRUNfQ01EX1BDTV9CVUZGRVJfUFRSX1VQREFURV9BUk1fVE9fRU5DX01TR19MRU4JXAotCXNpemVvZihzdHJ1Y3QgYXVkcmVjX2NtZF9wY21fYnVmZmVyX3B0cl91cGRhdGVfYXJtX3RvX2VuY19tc2cpCi0KLXN0cnVjdCAgYXVkcmVjX2NtZF9wY21fYnVmZmVyX3B0cl91cGRhdGVfYXJtX3RvX2VuY19tc2cgewotCXVuc2lnbmVkIHNob3J0IGJ1ZmZlcl9yZWFkY250X21zdzsKLQl1bnNpZ25lZCBzaG9ydCBidWZmZXJfcmVhZGNudF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQgbnVtYmVyX29mX2J1ZmZlcnM7Ci0JdW5zaWduZWQgc2hvcnQgYnVmZmVyX2FkZHJlc3NfbGVuZ3RoW107Ci19IF9fcGFja2VkOwotCi0vKgotICogTWVzc2FnZSB0byBpbmRpY2F0ZSBmbHVzaCBhY2tub3dsZWRnZW1lbnQKLSAqLwotCi0jZGVmaW5lIEFVRFJFQ19DTURfRkxVU0hfRE9ORV9NU0cJCQkweDAwMEIKLQotI2RlZmluZSBBRFNQX01FU1NBR0VfSUQgMHhGRkZGCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1anBlZ2NtZGkuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWpwZWdjbWRpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZTk2ZDcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1anBlZ2NtZGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0jaWZuZGVmIFFEU1A1VklESlBFR0NNRElfSAotI2RlZmluZSBRRFNQNVZJREpQRUdDTURJX0gKLQotLyo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSoKLQotICAgIEogUCBFIEcgIEkgTiBUIEUgUiBOIEEgTCAgQyBPIE0gTSBBIE4gRCBTCi0KLUdFTkVSQUwgREVTQ1JJUFRJT04KLSAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmludGlvbnMgb2YgZm9ybWF0IGJsb2NrcyBvZiBjb21tYW5kcyAKLSAgdGhhdCBhcmUgYWNjZXB0ZWQgYnkgSlBFRyBUYXNrCi0KLVJFRkVSRU5DRVMKLSAgTm9uZQotCi1FWFRFUk5BTElaRUQgRlVOQ1RJT05TCi0gIE5vbmUKLQotQ29weXJpZ2h0IChjKSAxOTkyLTIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAKLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCi0KLVRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUuCi1Ob3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgotICAgCi0gCi0kSGVhZGVyOiAvL3NvdXJjZS9xY29tL3FjdC9tdWx0aW1lZGlhMi9BZHNwU3ZjLzdYWFgvcWRzcDVjbWQvdmlkZW8vcWRzcDVqcGVnY21kaS5oIzIgJCAkRGF0ZVRpbWU6IDIwMDgvMDcvMzAgMTA6NTA6MjMgJCAkQXV0aG9yOiBwYXZhbnIgJCAgICAgICAgICAgICAgICAgICAgIAotUmV2aXNpb24gSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotd2hlbiAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKLS0tLS0tLS0tICAgLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0wNi8wOS8wOCAgIHN2ICAgICAgaW5pdGlhbCB2ZXJzaW9uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKgotICogQVJNIHRvIEpQRUcgY29uZmlndXJhdGlvbiBjb21tYW5kcyBhcmUgcGFzc2VkIHRocm91Z2ggdGhlCi0gKiB1UEpwZWdDZmdDbWRRdWV1ZQotICovCi0KLS8qCi0gKiBDb21tYW5kIHRvIGNvbmZpZ3VyZSBKUEVHIEVuY29kZXIKLSAqLwotCi0jZGVmaW5lCUpQRUdfQ01EX0VOQ19DRkcJCTB4MDAwMAotI2RlZmluZQlKUEVHX0NNRF9FTkNfQ0ZHX0xFTglzaXplb2YoanBlZ19jbWRfZW5jX2NmZykKLQotI2RlZmluZQlKUEVHX0NNRF9FTkNfUFJPQ0VTU19DRkdfT1BfUk9UQVRJT05fMAkJMHgwMDAwCi0jZGVmaW5lCUpQRUdfQ01EX0VOQ19QUk9DRVNTX0NGR19PUF9ST1RBVElPTl85MAkJMHgwMTAwCi0jZGVmaW5lCUpQRUdfQ01EX0VOQ19QUk9DRVNTX0NGR19PUF9ST1RBVElPTl8xODAJMHgwMjAwCi0jZGVmaW5lCUpQRUdfQ01EX0VOQ19QUk9DRVNTX0NGR19PUF9ST1RBVElPTl8yNzAJMHgwMzAwCi0jZGVmaW5lCUpQRUdfQ01EX0VOQ19QUk9DRVNTX0NGR19JUF9EQVRBX0ZPUk1BVF9NCTB4MDAwMwotI2RlZmluZQlKUEVHX0NNRF9FTkNfUFJPQ0VTU19DRkdfSVBfREFUQV9GT1JNQVRfSDJWMgkweDAwMDAKLSNkZWZpbmUJSlBFR19DTURfRU5DX1BST0NFU1NfQ0ZHX0lQX0RBVEFfRk9STUFUX0gyVjEJMHgwMDAxCi0jZGVmaW5lCUpQRUdfQ01EX0VOQ19QUk9DRVNTX0NGR19JUF9EQVRBX0ZPUk1BVF9IMVYyCTB4MDAwMgotCi0jZGVmaW5lCUpQRUdfQ01EX0lQX1NJWkVfQ0ZHX0xVTUFfSEVJR0hUX00JCTB4MDAwMEZGRkYKLSNkZWZpbmUJSlBFR19DTURfSVBfU0laRV9DRkdfTFVNQV9XSURUSF9NCQkweEZGRkYwMDAwCi0jZGVmaW5lCUpQRUdfQ01EX0VOQ19VUFNBTVBfSVBfU0laRV9DRkdfRU5BCQkweDAwMDEKLSNkZWZpbmUJSlBFR19DTURfRU5DX1VQU0FNUF9JUF9TSVpFX0NGR19ESVMJCTB4MDAwMAotCi0jZGVmaW5lCUpQRUdfQ01EX0ZSQUdfU0laRV9MVU1BX0hFSUdIVF9NCQkweEZGRkYKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAljbWRfaWQ7Ci0JdW5zaWduZWQgaW50CXByb2Nlc3NfY2ZnOwotCXVuc2lnbmVkIGludAlpcF9zaXplX2NmZzsKLQl1bnNpZ25lZCBpbnQJb3Bfc2l6ZV9jZmc7Ci0JdW5zaWduZWQgaW50CWZyYWdfY2ZnOwotCXVuc2lnbmVkIGludAlmcmFnX2NmZ19wYXJ0WzE2XTsKLQotCXVuc2lnbmVkIGludCAgICBwYXJ0X251bTsKLQotCXVuc2lnbmVkIGludAlvcF9idWZfMF9jZmdfcGFydDE7Ci0JdW5zaWduZWQgaW50CW9wX2J1Zl8wX2NmZ19wYXJ0MjsKLQl1bnNpZ25lZCBpbnQJb3BfYnVmXzFfY2ZnX3BhcnQxOwotCXVuc2lnbmVkIGludAlvcF9idWZfMV9jZmdfcGFydDI7Ci0KLQl1bnNpZ25lZCBpbnQJbHVtYV9xdW50X3RhYmxlWzMyXTsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX3F1bnRfdGFibGVbMzJdOwotCi0JdW5zaWduZWQgaW50CXVwc2FtcF9pcF9zaXplX2NmZzsKLQl1bnNpZ25lZCBpbnQJdXBzYW1wX2lwX2ZyYW1lX29mZjsKLQl1bnNpZ25lZCBpbnQJdXBzYW1wX3BwX2ZpbHRlcl9jb2VmZls2NF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGpwZWdfY21kX2VuY19jZmc7Ci0KLS8qCi0gKiBDb21tYW5kIHRvIGNvbmZpZ3VyZSBKUEVHIERlY29kZXIKLSAqLwotCi0jZGVmaW5lCUpQRUdfQ01EX0RFQ19DRkcJCTB4MDAwMQotI2RlZmluZQlKUEVHX0NNRF9ERUNfQ0ZHX0xFTgkJc2l6ZW9mKGpwZWdfY21kX2RlY19jZmcpCi0KLSNkZWZpbmUJSlBFR19DTURfREVDX09QX0RBVEFfRk9STUFUX00JCTB4MDAwMQotI2RlZmluZSBKUEVHX0NNRF9ERUNfT1BfREFUQV9GT1JNQVRfSDJWMgkweDAwMDAKLSNkZWZpbmUgSlBFR19DTURfREVDX09QX0RBVEFfRk9STUFUX0gyVjEJMHgwMDAxCi0KLSNkZWZpbmUgSlBFR19DTURfREVDX09QX0RBVEFfRk9STUFUX1NDQUxFX0ZBQ1RPUl84CTB4MDAwMDAwCi0jZGVmaW5lIEpQRUdfQ01EX0RFQ19PUF9EQVRBX0ZPUk1BVF9TQ0FMRV9GQUNUT1JfNAkweDAxMDAwMAotI2RlZmluZSBKUEVHX0NNRF9ERUNfT1BfREFUQV9GT1JNQVRfU0NBTEVfRkFDVE9SXzIJMHgwMjAwMDAKLSNkZWZpbmUgSlBFR19DTURfREVDX09QX0RBVEFfRk9STUFUX1NDQUxFX0ZBQ1RPUl8xCTB4MDMwMDAwCi0KLSNkZWZpbmUJSlBFR19DTURfREVDX0lQX1NUUkVBTV9CVUZfQ0ZHX1BBUlQzX05PVF9GSU5BTAkweDAwMDAKLSNkZWZpbmUJSlBFR19DTURfREVDX0lQX1NUUkVBTV9CVUZfQ0ZHX1BBUlQzX0ZJTkFMCTB4MDAwMQotCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAlpbWdfZGltZW5zaW9uX2NmZzsKLQl1bnNpZ25lZCBpbnQJb3BfZGF0YV9mb3JtYXQ7Ci0JdW5zaWduZWQgaW50CXJlc3RhcnRfaW50ZXJ2YWw7Ci0JdW5zaWduZWQgaW50CWlwX2J1Zl9wYXJ0aXRpb25fbnVtOwotCXVuc2lnbmVkIGludAlpcF9zdHJlYW1fYnVmX2NmZ19wYXJ0MTsKLQl1bnNpZ25lZCBpbnQJaXBfc3RyZWFtX2J1Zl9jZmdfcGFydDI7Ci0JdW5zaWduZWQgaW50CWlwX3N0cmVhbV9idWZfY2ZnX3BhcnQzOwotCXVuc2lnbmVkIGludAlvcF9zdHJlYW1fYnVmXzBfY2ZnX3BhcnQxOwotCXVuc2lnbmVkIGludAlvcF9zdHJlYW1fYnVmXzBfY2ZnX3BhcnQyOwotCXVuc2lnbmVkIGludAlvcF9zdHJlYW1fYnVmXzBfY2ZnX3BhcnQzOwotCXVuc2lnbmVkIGludAlvcF9zdHJlYW1fYnVmXzFfY2ZnX3BhcnQxOwotCXVuc2lnbmVkIGludAlvcF9zdHJlYW1fYnVmXzFfY2ZnX3BhcnQyOwotCXVuc2lnbmVkIGludAlvcF9zdHJlYW1fYnVmXzFfY2ZnX3BhcnQzOwotCXVuc2lnbmVkIGludAlsdW1hX3F1bnRfdGFibGVfMF8zOwotCXVuc2lnbmVkIGludAlsdW1hX3F1bnRfdGFibGVfNF83OwotCXVuc2lnbmVkIGludAlsdW1hX3F1bnRfdGFibGVfOF8xMTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9xdW50X3RhYmxlXzEyXzE1OwotCXVuc2lnbmVkIGludAlsdW1hX3F1bnRfdGFibGVfMTZfMTk7Ci0JdW5zaWduZWQgaW50CWx1bWFfcXVudF90YWJsZV8yMF8yMzsKLQl1bnNpZ25lZCBpbnQJbHVtYV9xdW50X3RhYmxlXzI0XzI3OwotCXVuc2lnbmVkIGludAlsdW1hX3F1bnRfdGFibGVfMjhfMzE7Ci0JdW5zaWduZWQgaW50CWx1bWFfcXVudF90YWJsZV8zMl8zNTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9xdW50X3RhYmxlXzM2XzM5OwotCXVuc2lnbmVkIGludAlsdW1hX3F1bnRfdGFibGVfNDBfNDM7Ci0JdW5zaWduZWQgaW50CWx1bWFfcXVudF90YWJsZV80NF80NzsKLQl1bnNpZ25lZCBpbnQJbHVtYV9xdW50X3RhYmxlXzQ4XzUxOwotCXVuc2lnbmVkIGludAlsdW1hX3F1bnRfdGFibGVfNTJfNTU7Ci0JdW5zaWduZWQgaW50CWx1bWFfcXVudF90YWJsZV81Nl81OTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9xdW50X3RhYmxlXzYwXzYzOwotCXVuc2lnbmVkIGludAljaHJvbWFfcXVudF90YWJsZV8wXzM7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9xdW50X3RhYmxlXzRfNzsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX3F1bnRfdGFibGVfOF8xMTsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX3F1bnRfdGFibGVfMTJfMTU7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9xdW50X3RhYmxlXzE2XzE5OwotCXVuc2lnbmVkIGludAljaHJvbWFfcXVudF90YWJsZV8yMF8yMzsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX3F1bnRfdGFibGVfMjRfMjc7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9xdW50X3RhYmxlXzI4XzMxOwotCXVuc2lnbmVkIGludAljaHJvbWFfcXVudF90YWJsZV8zMl8zNTsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX3F1bnRfdGFibGVfMzZfMzk7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9xdW50X3RhYmxlXzQwXzQzOwotCXVuc2lnbmVkIGludAljaHJvbWFfcXVudF90YWJsZV80NF80NzsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX3F1bnRfdGFibGVfNDhfNTE7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9xdW50X3RhYmxlXzUyXzU1OwotCXVuc2lnbmVkIGludAljaHJvbWFfcXVudF90YWJsZV81Nl81OTsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX3F1bnRfdGFibGVfNjBfNjM7Ci0JdW5zaWduZWQgaW50CWx1bWFfZGNfaG1fY29kZV9jbnRfdGFibGVfMF8zOwotCXVuc2lnbmVkIGludAlsdW1hX2RjX2htX2NvZGVfY250X3RhYmxlXzRfNzsKLQl1bnNpZ25lZCBpbnQJbHVtYV9kY19obV9jb2RlX2NudF90YWJsZV84XzExOwotCXVuc2lnbmVkIGludAlsdW1hX2RjX2htX2NvZGVfY250X3RhYmxlXzEyXzE1OwotCXVuc2lnbmVkIGludAlsdW1hX2RjX2htX2NvZGVfdmFsX3RhYmxlXzBfMzsKLQl1bnNpZ25lZCBpbnQJbHVtYV9kY19obV9jb2RlX3ZhbF90YWJsZV80Xzc7Ci0JdW5zaWduZWQgaW50CWx1bWFfZGNfaG1fY29kZV92YWxfdGFibGVfOF8xMTsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2RjX2htX2NvZGVfY250X3RhYmxlXzBfMzsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2RjX2htX2NvZGVfY250X3RhYmxlXzRfNzsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2RjX2htX2NvZGVfY250X3RhYmxlXzhfMTE7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9kY19obV9jb2RlX2NudF90YWJsZV8xMl8xNTsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2RjX2htX2NvZGVfdmFsX3RhYmxlXzBfMzsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2RjX2htX2NvZGVfdmFsX3RhYmxlXzRfNzsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2RjX2htX2NvZGVfdmFsX3RhYmxlXzhfMTE7Ci0JdW5zaWduZWQgaW50CWx1bWFfYWNfaG1fY29kZV9jbnRfdGFibGVfMF8zOwotCXVuc2lnbmVkIGludAlsdW1hX2FjX2htX2NvZGVfY250X3RhYmxlXzRfNzsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX2NudF90YWJsZV84XzExOwotCXVuc2lnbmVkIGludAlsdW1hX2FjX2htX2NvZGVfY250X3RhYmxlXzEyXzE1OwotCXVuc2lnbmVkIGludAlsdW1hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzBfMzsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV80Xzc7Ci0JdW5zaWduZWQgaW50CWx1bWFfYWNfaG1fY29kZV92YWxfdGFibGVfOF8xMTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV8xMl8xNTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV8xNl8xOTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV8yMF8yMzsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV8yNF8yNzsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV8yOF8zMTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV8zMl8zNTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV8zNl8zOTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV80MF80MzsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV80NF80NzsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV80OF81MTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV81Ml81NTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV81Nl81OTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV82MF82MzsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV82NF82NzsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV82OF83MTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV83Ml83NTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV83Nl83OTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV84MF84MzsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV84NF84NzsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV84OF85MTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV85Ml85NTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV85Nl85OTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV8xMDBfMTAzOwotCXVuc2lnbmVkIGludAlsdW1hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzEwNF8xMDc7Ci0JdW5zaWduZWQgaW50CWx1bWFfYWNfaG1fY29kZV92YWxfdGFibGVfMTA4XzExMTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV8xMTJfMTE1OwotCXVuc2lnbmVkIGludAlsdW1hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzExNl8xMTk7Ci0JdW5zaWduZWQgaW50CWx1bWFfYWNfaG1fY29kZV92YWxfdGFibGVfMTIwXzEyMzsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV8xMjRfMTI3OwotCXVuc2lnbmVkIGludAlsdW1hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzEyOF8xMzE7Ci0JdW5zaWduZWQgaW50CWx1bWFfYWNfaG1fY29kZV92YWxfdGFibGVfMTMyXzEzNTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV8xMzZfMTM5OwotCXVuc2lnbmVkIGludAlsdW1hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzE0MF8xNDM7Ci0JdW5zaWduZWQgaW50CWx1bWFfYWNfaG1fY29kZV92YWxfdGFibGVfMTQ0XzE0NzsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV8xNDhfMTUxOwotCXVuc2lnbmVkIGludAlsdW1hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzE1Ml8xNTU7Ci0JdW5zaWduZWQgaW50CWx1bWFfYWNfaG1fY29kZV92YWxfdGFibGVfMTU2XzE1OTsKLQl1bnNpZ25lZCBpbnQJbHVtYV9hY19obV9jb2RlX3ZhbF90YWJsZV8xNjBfMTYxOwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV9jbnRfdGFibGVfMF8zOwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV9jbnRfdGFibGVfNF83OwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV9jbnRfdGFibGVfOF8xMTsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2FjX2htX2NvZGVfY250X3RhYmxlXzEyXzE1OwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV92YWxfdGFibGVfMF8zOwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV92YWxfdGFibGVfNF83OwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV92YWxfdGFibGVfOF8xMTsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzEyXzE1OwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV92YWxfdGFibGVfMTZfMTk7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9hY19obV9jb2RlX3ZhbF90YWJsZV8yMF8yMzsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzI0XzI3OwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV92YWxfdGFibGVfMjhfMzE7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9hY19obV9jb2RlX3ZhbF90YWJsZV8zMl8zNTsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzM2XzM5OwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV92YWxfdGFibGVfNDBfNDM7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9hY19obV9jb2RlX3ZhbF90YWJsZV80NF80NzsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzQ4XzUxOwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV92YWxfdGFibGVfNTJfNTU7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9hY19obV9jb2RlX3ZhbF90YWJsZV81Nl81OTsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzYwXzYzOwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV92YWxfdGFibGVfNjRfNjc7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9hY19obV9jb2RlX3ZhbF90YWJsZV82OF83MTsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzcyXzc1OwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV92YWxfdGFibGVfNzZfNzk7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9hY19obV9jb2RlX3ZhbF90YWJsZV84MF84MzsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzg0Xzg3OwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV92YWxfdGFibGVfODhfOTE7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9hY19obV9jb2RlX3ZhbF90YWJsZV85Ml85NTsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzk2Xzk5OwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV92YWxfdGFibGVfMTAwXzEwMzsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzEwNF8xMDc7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9hY19obV9jb2RlX3ZhbF90YWJsZV8xMDhfMTExOwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV92YWxfdGFibGVfMTEyXzExNTsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzExNl8xMTk7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9hY19obV9jb2RlX3ZhbF90YWJsZV8xMjBfMTIzOwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV92YWxfdGFibGVfMTI0XzEyNzsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzEyOF8xMzE7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9hY19obV9jb2RlX3ZhbF90YWJsZV8xMzJfMTM1OwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV92YWxfdGFibGVfMTM2XzEzOTsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzE0MF8xNDM7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9hY19obV9jb2RlX3ZhbF90YWJsZV8xNDRfMTQ3OwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV92YWxfdGFibGVfMTQ4XzE1MTsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2FjX2htX2NvZGVfdmFsX3RhYmxlXzE1Ml8xNTU7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9hY19obV9jb2RlX3ZhbF90YWJsZV8xNTZfMTU5OwotCXVuc2lnbmVkIGludAljaHJvbWFfYWNfaG1fY29kZV92YWxfdGFibGVfMTYwXzE2MTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkganBlZ19jbWRfZGVjX2NmZzsKLQotCi0vKgotICogQVJNIHRvIEpQRUcgY29uZmlndXJhdGlvbiBjb21tYW5kcyBhcmUgcGFzc2VkIHRocm91Z2ggdGhlCi0gKiB1UEpwZWdBY3Rpb25DbWRRdWV1ZQotICovCi0KLS8qCi0gKiBDb21tYW5kIHRvIHN0YXJ0IHRoZSBlbmNvZGUgcHJvY2VzcwotICovCi0KLSNkZWZpbmUJSlBFR19DTURfRU5DX0VOQ09ERQkJMHgwMDAxCi0jZGVmaW5lCUpQRUdfQ01EX0VOQ19FTkNPREVfTEVOCQlzaXplb2YoanBlZ19jbWRfZW5jX2VuY29kZSkKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQJY21kX2lkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBqcGVnX2NtZF9lbmNfZW5jb2RlOwotCi0KLS8qCi0gKiBDb21tYW5kIHRvIHRyYW5zaXRpb24gZnJvbSBjdXJyZW50IHN0YXRlIG9mIGVuY29kZXIgdG8gSURMRSBzdGF0ZQotICovCi0KLSNkZWZpbmUJSlBFR19DTURfRU5DX0lETEUJCTB4MDAwNgotI2RlZmluZQlKUEVHX0NNRF9FTkNfSURMRV9MRU4JCXNpemVvZihqcGVnX2NtZF9lbmNfaWRsZSkKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQJY21kX2lkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBqcGVnX2NtZF9lbmNfaWRsZTsKLQotCi0vKgotICogQ29tbWFuZCB0byBpbmZvcm0gdGhlIGVuY29kZXIgdGhhdCBhbm90aGVyIGJ1ZmZlciBpcyByZWFkeQotICovCi0KLSNkZWZpbmUJSlBFR19DTURfRU5DX09QX0NPTlNVTUVECTB4MDAwMgotI2RlZmluZQlKUEVHX0NNRF9FTkNfT1BfQ09OU1VNRURfTEVOCXNpemVvZihqcGVnX2NtZF9lbmNfb3BfY29uc3VtZWQpCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAljbWRfaWQ7Ci0JdW5zaWduZWQgaW50CW9wX2J1Zl9hZGRyOwotCXVuc2lnbmVkIGludAlvcF9idWZfc2l6ZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkganBlZ19jbWRfZW5jX29wX2NvbnN1bWVkOyAKLQotCi0vKgotICogQ29tbWFuZCB0byBzdGFydCB0aGUgZGVjb2RpbmcgcHJvY2VzcwotICovCi0KLSNkZWZpbmUJSlBFR19DTURfREVDX0RFQ09ERQkJMHgwMDAzCi0jZGVmaW5lCUpQRUdfQ01EX0RFQ19ERUNPREVfTEVOCXNpemVvZihqcGVnX2NtZF9kZWNfZGVjb2RlKQotCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydAljbWRfaWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGpwZWdfY21kX2RlY19kZWNvZGU7Ci0KLQotLyoKLSAqIENvbW1hbmQgdG8gdHJhbnNpdGlvbiBmcm9tIHRoZSBjdXJyZW50IHN0YXRlIG9mIGRlY29kZXIgdG8gSURMRQotICovCi0KLSNkZWZpbmUJSlBFR19DTURfREVDX0lETEUJMHgwMDA3Ci0jZGVmaW5lCUpQRUdfQ01EX0RFQ19JRExFX0xFTglzaXplb2YoanBlZ19jbWRfZGVjX2lkbGUpCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0CWNtZF9pZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkganBlZ19jbWRfZGVjX2lkbGU7Ci0KLQotLyoKLSAqIENvbW1hbmQgdG8gaW5mb3JtIHRoYXQgYW4gb3AgYnVmZmVyIGlzIHJlYWR5IGZvciB1c2UKLSAqLwotCi0jZGVmaW5lCUpQRUdfQ01EX0RFQ19PUF9DT05TVU1FRAkweDAwMDQKLSNkZWZpbmUJSlBFR19DTURfREVDX09QX0NPTlNVTUVEX0xFTglzaXplb2YoanBlZ19jbWRfZGVjX29wX2NvbnN1bWVkKQotCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAlsdW1hX29wX2J1Zl9hZGRyOwotCXVuc2lnbmVkIGludAlsdW1hX29wX2J1Zl9zaXplOwotCXVuc2lnbmVkIGludAljaHJvbWFfb3BfYnVmX2FkZHI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGpwZWdfY21kX2RlY19vcF9jb25zdW1lZDsKLQotCi0vKgotICogQ29tbWFuZCB0byBwYXNzIGEgbmV3IGlwIGJ1ZmZlciB0byB0aGUganBlZyBkZWNvZGVyCi0gKi8KLQotI2RlZmluZQlKUEVHX0NNRF9ERUNfSVAJMHgwMDA1Ci0jZGVmaW5lCUpQRUdfQ01EX0RFQ19JUF9MRU4Jc2l6ZW9mKGpwZWdfY21kX2RlY19pcF9sZW4pCi0KLSNkZWZpbmUJSlBFR19DTURfRU9JX0lORElDQVRPUl9OT1RfRU5ECTB4MDAwMAotI2RlZmluZQlKUEVHX0NNRF9FT0lfSU5ESUNBVE9SX0VORAkweDAwMDEKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAljbWRfaWQ7Ci0JdW5zaWduZWQgaW50CWlwX2J1Zl9hZGRyOwotCXVuc2lnbmVkIGludAlpcF9idWZfc2l6ZTsKLQl1bnNpZ25lZCBpbnQJZW9pX2luZGljYXRvcjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkganBlZ19jbWRfZGVjX2lwOwotCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDVqcGVnbXNnLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDVqcGVnbXNnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNWNlNzcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1anBlZ21zZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLSNpZm5kZWYgUURTUDVWSURKUEVHTVNHSV9ICi0jZGVmaW5lIFFEU1A1VklESlBFR01TR0lfSAotCi0vKj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09KgotCi0gICBKIFAgRSBHICBJIE4gVCBFIFIgTiBBIEwgIE0gRSBTIFMgQSBHIEUgUwotCi1HRU5FUkFMIERFU0NSSVBUSU9OCi0gIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbnRpb25zIG9mIGZvcm1hdCBibG9ja3Mgb2YgbWVzc2FnZXMgCi0gIHRoYXQgYXJlIHNlbnQgYnkgSlBFRyBUYXNrCi0KLVJFRkVSRU5DRVMKLSAgTm9uZQotCi1FWFRFUk5BTElaRUQgRlVOQ1RJT05TCi0gIE5vbmUKLQotQ29weXJpZ2h0IChjKSAxOTkyLTIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAKLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCi0KLVRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUuCi1Ob3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgotICAgCi0kSGVhZGVyOiAvL3NvdXJjZS9xY29tL3FjdC9tdWx0aW1lZGlhMi9BZHNwU3ZjLzdYWFgvcWRzcDVjbWQvdmlkZW8vcWRzcDVqcGVnbXNnLmgjMiAkICREYXRlVGltZTogMjAwOC8wNy8zMCAxMDo1MDoyMyAkICRBdXRob3I6IHBhdmFuciAkICAgICAgICAgICAgICAgICAgICAgCi1SZXZpc2lvbiBIaXN0b3J5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAotd2hlbiAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKLS0tLS0tLS0tICAgLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0wNS8xMC8wOCAgIHN2ICAgICAgaW5pdGlhbCB2ZXJzaW9uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKgotICogTWVzc2FnZXMgZnJvbSBKUEVHIHRhc2sgdG8gQVJNIHRocm91Z2gganBlZ3VQTXNnUXVldWUKLSAqLwotCi0vKgotICogTWVzc2FnZSBpcyBBQ0sgZm9yIENNRF9KUEVHRV9FTkNPREUgY21kCi0gKi8KLQotI2RlZmluZQlKUEVHX01TR19FTkNfRU5DT0RFX0FDSwkweDAwMDAKLSNkZWZpbmUJSlBFR19NU0dfRU5DX0VOQ09ERV9BQ0tfTEVOCVwKLQlzaXplb2YoanBlZ19tc2dfZW5jX2VuY29kZV9hY2spCi0KLXR5cGVkZWYgc3RydWN0IHsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkganBlZ19tc2dfZW5jX2VuY29kZV9hY2s7Ci0KLQotLyoKLSAqIE1lc3NhZ2UgaW5mb3JtcyB0aGUgdXAgd2hlbiBvcCBidWZmZXIgaXMgcmVhZHkgZm9yIGNvbnN1bXB0aW9uIGFuZAotICogd2hlbiBlbmNvZGluZyBpcyBjb21wbGV0ZSBvciBlcnJvcnMKLSAqLwotCi0jZGVmaW5lCUpQRUdfTVNHX0VOQ19PUF9QUk9EVUNFRAkweDAwMDEKLSNkZWZpbmUJSlBFR19NU0dfRU5DX09QX1BST0RVQ0VEX0xFTglcCi0Jc2l6ZW9mKGpwZWdfbXNnX2VuY19vcF9wcm9kdWNlZCkKLQotI2RlZmluZQlKUEVHX01TR09QX09QX0JVRl9TVEFUVVNfRU5DX0RPTkVfUFJPR1JFU1MJMHgwMDAwCi0jZGVmaW5lCUpQRUdfTVNHT1BfT1BfQlVGX1NUQVRVU19FTkNfRE9ORV9DT01QTEVURQkweDAwMDEKLSNkZWZpbmUJSlBFR19NU0dPUF9PUF9CVUZfU1RBVFVTX0VOQ19FUlIJCTB4MTAwMDAKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAlvcF9idWZfYWRkcjsKLQl1bnNpZ25lZCBpbnQJb3BfYnVmX3NpemU7Ci0JdW5zaWduZWQgaW50CW9wX2J1Zl9zdGF0dXM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGpwZWdfbXNnX2VuY19vcF9wcm9kdWNlZDsKLQotCi0vKgotICogTWVzc2FnZSB0byBhY2sgQ01EX0pQRUdFX0lETEUKLSAqLwotCi0jZGVmaW5lCUpQRUdfTVNHX0VOQ19JRExFX0FDSwkweDAwMDIKLSNkZWZpbmUJSlBFR19NU0dfRU5DX0lETEVfQUNLX0xFTglzaXplb2YoanBlZ19tc2dfZW5jX2lkbGVfYWNrKQotCi0KLXR5cGVkZWYgc3RydWN0IHsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGpwZWdfbXNnX2VuY19pZGxlX2FjazsKLQotCi0vKgotICogTWVzc2FnZSB0byBpbmRpY2F0ZSB0aGUgaWxsZWdhbCBjb21tYW5kCi0gKi8KLQotI2RlZmluZQlKUEVHX01TR19FTkNfSUxMRUdBTF9DT01NQU5ECTB4MDAwMwotI2RlZmluZQlKUEVHX01TR19FTkNfSUxMRUdBTF9DT01NQU5EX0xFTglcCi0Jc2l6ZW9mKGpwZWdfbXNnX2VuY19pbGxlZ2FsX2NvbW1hbmQpCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJc3RhdHVzOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBqcGVnX21zZ19lbmNfaWxsZWdhbF9jb21tYW5kOwotCi0KLS8qCi0gKiBNZXNzYWdlIHRvIEFDSyBDTURfSlBFR0RfREVDT0RFCi0gKi8KLQotI2RlZmluZQlKUEVHX01TR19ERUNfREVDT0RFX0FDSwkJMHgwMDA0Ci0jZGVmaW5lCUpQRUdfTVNHX0RFQ19ERUNPREVfQUNLX0xFTglcCi0Jc2l6ZW9mKGpwZWdfbXNnX2RlY19kZWNvZGVfYWNrKQotCi0KLXR5cGVkZWYgc3RydWN0IHsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkganBlZ19tc2dfZGVjX2RlY29kZV9hY2s7Ci0KLQotLyoKLSAqIE1lc3NhZ2UgdG8gaW5mb3JtIHVwIHRoYXQgYW4gb3AgYnVmZmVyIGlzIHJlYWR5IGZvciBjb25zdW1wdGlvbiBhbmQgd2hlbgotICogZGVjb2RpbmcgaXMgY29tcGxldGUgb3IgYW4gZXJyb3Igb2NjdXJzCi0gKi8KLQotI2RlZmluZQlKUEVHX01TR19ERUNfT1BfUFJPRFVDRUQJCTB4MDAwNQotI2RlZmluZQlKUEVHX01TR19ERUNfT1BfUFJPRFVDRURfTEVOCVwKLQlzaXplb2YoanBlZ19tc2dfZGVjX29wX3Byb2R1Y2VkKQotCi0jZGVmaW5lCUpQRUdfTVNHX0RFQ19PUF9CVUZfU1RBVFVTX1BST0dSRVNTCTB4MDAwMAotI2RlZmluZQlKUEVHX01TR19ERUNfT1BfQlVGX1NUQVRVU19ET05FCQkweDAwMDEKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAlsdW1hX29wX2J1Zl9hZGRyOwotCXVuc2lnbmVkIGludAljaHJvbWFfb3BfYnVmX2FkZHI7Ci0JdW5zaWduZWQgaW50CW51bV9tY3VzOwotCXVuc2lnbmVkIGludAlvcF9idWZfc3RhdHVzOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBqcGVnX21zZ19kZWNfb3BfcHJvZHVjZWQ7Ci0KLS8qCi0gKiBNZXNzYWdlIHRvIGFjayBDTURfSlBFR0RfSURMRSBjbWQKLSAqLwotCi0jZGVmaW5lCUpQRUdfTVNHX0RFQ19JRExFX0FDSwkweDAwMDYKLSNkZWZpbmUJSlBFR19NU0dfREVDX0lETEVfQUNLX0xFTglzaXplb2YoanBlZ19tc2dfZGVjX2lkbGVfYWNrKQotCi0KLXR5cGVkZWYgc3RydWN0IHsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkganBlZ19tc2dfZGVjX2lkbGVfYWNrOwotCi0KLS8qCi0gKiBNZXNzYWdlIHRvIGluZGljYXRlIGlsbGVnYWwgY21kIHdhcyByZWNlaXZlZAotICovCi0KLSNkZWZpbmUJSlBFR19NU0dfREVDX0lMTEVHQUxfQ09NTUFORAkweDAwMDcKLSNkZWZpbmUJSlBFR19NU0dfREVDX0lMTEVHQUxfQ09NTUFORF9MRU4JXAotCXNpemVvZihqcGVnX21zZ19kZWNfaWxsZWdhbF9jb21tYW5kKQotCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJc3RhdHVzOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBqcGVnX21zZ19kZWNfaWxsZWdhbF9jb21tYW5kOwotCi0vKgotICogTWVzc2FnZSB0byByZXF1ZXN0IHVwIGZvciB0aGUgbmV4dCBzZWdtZW50IG9mIGlwIGJpdCBzdHJlYW0KLSAqLwotCi0jZGVmaW5lCUpQRUdfTVNHX0RFQ19JUF9SRVFVRVNUCQkweDAwMDgKLSNkZWZpbmUJSlBFR19NU0dfREVDX0lQX1JFUVVFU1RfTEVOCVwKLQlzaXplb2YoanBlZ19tc2dfZGVjX2lwX3JlcXVlc3QpCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBqcGVnX21zZ19kZWNfaXBfcmVxdWVzdDsKLQotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1bHBtY21kaS5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1bHBtY21kaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDRmZTU2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWxwbWNtZGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLSNpZm5kZWYgUURTUDVMUE1DTURJX0gKLSNkZWZpbmUgUURTUDVMUE1DTURJX0gKLQotLyo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSoKLQotICAgIEwgUCBNICAgSSBOIFQgRSBSIE4gQSBMICAgQyBPIE0gTSBBIE4gRCBTCi0KLUdFTkVSQUwgREVTQ1JJUFRJT04KLSAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmludGlvbnMgb2YgZm9ybWF0IGJsb2NrcyBvZiBjb21tYW5kcyAKLSAgdGhhdCBhcmUgYWNjZXB0ZWQgYnkgTFBNIFRhc2sKLQotUkVGRVJFTkNFUwotICBOb25lCi0KLUVYVEVSTkFMSVpFRCBGVU5DVElPTlMKLSAgTm9uZQotCi1Db3B5cmlnaHQgKGMpIDE5OTItMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi1tYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotIAotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotKj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Ki8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKLQotVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZS4KLU5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCi0gICAKLSAgCi0kSGVhZGVyOiAvL3NvdXJjZS9xY29tL3FjdC9tdWx0aW1lZGlhMi9BZHNwU3ZjLzdYWFgvcWRzcDVjbWQvdmlkZW8vcWRzcDVscG1jbWRpLmgjMiAkICREYXRlVGltZTogMjAwOC8wNy8zMCAxMDo1MDoyMyAkICRBdXRob3I6IHBhdmFuciAkICAgICAgICAgICAgICAgICAgICAgCi1SZXZpc2lvbiBIaXN0b3J5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAotd2hlbiAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKLS0tLS0tLS0tICAgLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0wNi8xMi8wOCAgIHN2ICAgICAgaW5pdGlhbCB2ZXJzaW9uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0KLS8qCi0gKiBDb21tYW5kIHRvIHN0YXJ0IExQTSBwcm9jZXNzaW5nIGJhc2VkIG9uIHRoZSBjb25maWcgcGFyYW1zCi0gKi8KLQotI2RlZmluZQlMUE1fQ01EX1NUQVJUCQkweDAwMDAKLSNkZWZpbmUJTFBNX0NNRF9TVEFSVF9MRU4Jc2l6ZW9mKGxwbV9jbWRfc3RhcnQpCi0KLSNkZWZpbmUJTFBNX0NNRF9TUEFUSUFMX0ZJTFRFUl9QQVJUX09QTU9ERV8wCTB4MDAwMDAwMDAKLSNkZWZpbmUJTFBNX0NNRF9TUEFUSUFMX0ZJTFRFUl9QQVJUX09QTU9ERV8xCTB4MDAwMTAwMDAKLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAlpcF9kYXRhX2NmZ19wYXJ0MTsKLQl1bnNpZ25lZCBpbnQJaXBfZGF0YV9jZmdfcGFydDI7Ci0JdW5zaWduZWQgaW50CWlwX2RhdGFfY2ZnX3BhcnQzOwotCXVuc2lnbmVkIGludAlpcF9kYXRhX2NmZ19wYXJ0NDsKLQl1bnNpZ25lZCBpbnQJb3BfZGF0YV9jZmdfcGFydDE7Ci0JdW5zaWduZWQgaW50CW9wX2RhdGFfY2ZnX3BhcnQyOwotCXVuc2lnbmVkIGludAlvcF9kYXRhX2NmZ19wYXJ0MzsKLQl1bnNpZ25lZCBpbnQJc3BhdGlhbF9maWx0ZXJfcGFydFszMl07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGxwbV9jbWRfc3RhcnQ7Ci0KLQotCi0vKgotICogQ29tbWFuZCB0byBzdG9wIExQTSBwcm9jZXNzaW5nCi0gKi8KLQotI2RlZmluZQlMUE1fQ01EX0lETEUJCTB4MDAwMQotI2RlZmluZQlMUE1fQ01EX0lETEVfTEVOCXNpemVvZihscG1fY21kX2lkbGUpCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBscG1fY21kX2lkbGU7Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDVscG1tc2cuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWxwbW1zZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWY3NjZkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNWxwbW1zZy5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI2lmbmRlZiBRRFNQNUxQTU1TR0lfSAotI2RlZmluZSBRRFNQNUxQTU1TR0lfSAotCi0vKj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09KgotCi0gICAgTCBQIE0gICBJIE4gVCBFIFIgTiBBIEwgICBNIEUgUyBTIEEgRyBFIFMKLQotR0VORVJBTCBERVNDUklQVElPTgotICBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW50aW9ucyBvZiBmb3JtYXQgYmxvY2tzIG9mIGNvbW1hbmRzIAotICB0aGF0IGFyZSBhY2NlcHRlZCBieSBMUE0gVGFzawotCi1SRUZFUkVOQ0VTCi0gIE5vbmUKLQotRVhURVJOQUxJWkVEIEZVTkNUSU9OUwotICBOb25lCi0KLUNvcHlyaWdodCAoYykgMTk5Mi0yMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLW1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQotCi1UaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlLgotTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KLSAgIAotJEhlYWRlcjogLy9zb3VyY2UvcWNvbS9xY3QvbXVsdGltZWRpYTIvQWRzcFN2Yy83WFhYL3Fkc3A1Y21kL3ZpZGVvL3Fkc3A1bHBtbXNnLmgjMiAkICREYXRlVGltZTogMjAwOC8wNy8zMCAxMDo1MDoyMyAkICRBdXRob3I6IHBhdmFuciAkICAgICAgICAgICAgICAgICAgICAgCi1SZXZpc2lvbiBIaXN0b3J5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCi13aGVuICAgICAgIHdobyAgICAgd2hhdCwgd2hlcmUsIHdoeQotLS0tLS0tLS0gICAtLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTA2LzEyLzA4ICAgc3YgICAgICBpbml0aWFsIHZlcnNpb24KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qCi0gKiBNZXNzYWdlIHRvIGFja25vd2xlZGdlIENNRF9MUE1fSURMRSBjb21tYW5kCi0gKi8KLQotI2RlZmluZQlMUE1fTVNHX0lETEVfQUNLCTB4MDAwMAotI2RlZmluZQlMUE1fTVNHX0lETEVfQUNLX0xFTglzaXplb2YobHBtX21zZ19pZGxlX2FjaykKLQotdHlwZWRlZiBzdHJ1Y3QgewotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBscG1fbXNnX2lkbGVfYWNrOwotCi0KLS8qCi0gKiBNZXNzYWdlIHRvIGFja25vd2xlZGdlIENNRF9MUE1fU1RBUlQgY29tbWFuZAotICovCi0KLQotI2RlZmluZQlMUE1fTVNHX1NUQVJUX0FDSwkweDAwMDEKLSNkZWZpbmUJTFBNX01TR19TVEFSVF9BQ0tfTEVOCXNpemVvZihscG1fbXNnX3N0YXJ0X2FjaykKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGxwbV9tc2dfc3RhcnRfYWNrOwotCi0KLS8qCi0gKiBNZXNzYWdlIHRvIG5vdGlmeSB0aGUgQVJNIHRoYXQgTFBNIHByb2Nlc3NpbmcgaXMgY29tcGxldGUKLSAqLwotCi0jZGVmaW5lCUxQTV9NU0dfRE9ORQkJMHgwMDAyCi0jZGVmaW5lCUxQTV9NU0dfRE9ORV9MRU4Jc2l6ZW9mKGxwbV9tc2dfZG9uZSkKLQotdHlwZWRlZiBzdHJ1Y3QgewotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBscG1fbXNnX2RvbmU7Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDVybXRjbWRpLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDVybXRjbWRpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOTUyMWYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1cm10Y21kaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgUURTUDVSTVRDTURJX0gKLSNkZWZpbmUgUURTUDVSTVRDTURJX0gKLQotLyo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSoKLQotICAgIFIgTSBUIEEgUyBLIEkgTiBUIEUgUiBOIEEgTCAgQyBPIE0gTSBBIE4gRCBTCi0KLUdFTkVSQUwgREVTQ1JJUFRJT04KLSAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmludGlvbnMgb2YgZm9ybWF0IGJsb2NrcyBvZiBjb21tYW5kcwotICB0aGF0IGFyZSBhY2NlcHRlZCBieSBSTSBUYXNrCi0KLVJFRkVSRU5DRVMKLSAgTm9uZQotCi1FWFRFUk5BTElaRUQgRlVOQ1RJT05TCi0gIE5vbmUKLQotKj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Ki8KLQotLyoKLSAqIEFSTSB0byBSTVRBU0sgQ29tbWFuZHMKLSAqCi0gKiBBUk0gdXNlcyBvbmUgY29tbWFuZCBxdWV1ZSB0byBjb21tdW5pY2F0ZSB3aXRoIEFVRFBQVEFTSwotICogMSkgYXB1Um10UXVldWU6IFVzZWQgdG8gc2VuZCBjb21tYW5kcyB0byBSTVRBU0sgZnJvbSBBUFBTIHByb2Nlc3NvcgotICogTG9jYXRpb24gOiBNRU1BCi0gKiBCdWZmZXIgU2l6ZSA6IDMgd29yZHMKLSAqLwotCi0jZGVmaW5lIFJNX0NNRF9BVURfQ09ERUNfQ0ZHCTB4MAotCi0jZGVmaW5lIFJNX0FVRF9DTElFTlRfSUQJMHgwCi0jZGVmaW5lIFJNVF9FTkFCTEUJCTB4MQotI2RlZmluZSBSTVRfRElTQUJMRQkJMHgwCi0KLXN0cnVjdCBhdWRfY29kZWNfY29uZmlnX2NtZCB7Ci0JdW5zaWduZWQgc2hvcnQJCQljbWRfaWQ7Ci0JdW5zaWduZWQgY2hhcgkJCXRhc2tfaWQ7Ci0JdW5zaWduZWQgY2hhcgkJCWNsaWVudF9pZDsKLQl1bnNpZ25lZCBzaG9ydAkJCWVuYWJsZTsKLQl1bnNpZ25lZCBzaG9ydAkJCWRlY190eXBlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2VuZGlmIC8qIFFEU1A1Uk1UQ01ESV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDVybXRtc2cuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNXJtdG1zZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTdlZDMzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNXJtdG1zZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgUURTUDVSTVRNU0dfSAotI2RlZmluZSBRRFNQNVJNVE1TR19ICi0KLS8qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qCi0KLSAgICAgICBSIE0gVCBBIFMgSyAgIE0gUyBHCi0KLUdFTkVSQUwgREVTQ1JJUFRJT04KLSAgTWVzc2FnZXMgc2VudCBieSBSTVRBU0sgdG8gQVBQUyBQUk9DRVNTT1IKLQotUkVGRVJFTkNFUwotICBOb25lCi0KLUVYVEVSTkFMSVpFRCBGVU5DVElPTlMKLSAgTm9uZQotKj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Ki8KLQotLyoKLSAqIFJNVEFTSyB1c2VzIFJtdEFwdVJsaXN0IHRvIHNlbmQgbWVzc2FnZXMgdG8gdGhlIEFQUFMgUFJPQ0VTU09SCi0gKiBMb2NhdGlvbiA6IE1FTUEKLSAqIEJ1ZmZlciBTaXplIDogMwotICovCi0KLSNkZWZpbmUgUk1UX0NPREVDX0NPTkZJR19BQ0sJMHgxCi0KLXN0cnVjdCBhdWRfY29kZWNfY29uZmlnX2FjayB7Ci0JdW5zaWduZWQgY2hhcgkJCXRhc2tfaWQ7Ci0JdW5zaWduZWQgY2hhcgkJCWNsaWVudF9pZDsKLQl1bnNpZ25lZCBjaGFyCQkJcmVhc29uOwotCXVuc2lnbmVkIGNoYXIJCQllbmFibGU7Ci0JdW5zaWduZWQgc2hvcnQJCQlkZWNfdHlwZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgUk1UX0RTUF9PVVRfT0ZfTUlQUwkweDIKLQotc3RydWN0IHJtdF9kc3Bfb3V0X29mX21pcHMgewotCXVuc2lnbmVkIHNob3J0CQkJZGVjX2luZm87Ci0JdW5zaWduZWQgc2hvcnQJCQlydmRfMDsKLQl1bnNpZ25lZCBzaG9ydAkJCXJ2ZF8xOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2VuZGlmIC8qIFFEU1A1Uk1UTVNHX0ggKi8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1dmRlY2NtZGkuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNXZkZWNjbWRpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YWY0YWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1dmRlY2NtZGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0jaWZuZGVmIFFEU1A1VklEREVDQ01ESV9ICi0jZGVmaW5lIFFEU1A1VklEREVDQ01ESV9ICi0KLS8qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qCi0KLSAgICBWIEkgRCBFIE8gIEQgRSBDIE8gRCBFIFIgIEkgTiBUIEUgUiBOIEEgTCAgQyBPIE0gTSBBIE4gRCBTCi0KLUdFTkVSQUwgREVTQ1JJUFRJT04KLSAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmludGlvbnMgb2YgZm9ybWF0IGJsb2NrcyBvZiBjb21tYW5kcyAKLSAgdGhhdCBhcmUgYWNjZXB0ZWQgYnkgVklEREVDIFRhc2sKLQotUkVGRVJFTkNFUwotICBOb25lCi0KLUVYVEVSTkFMSVpFRCBGVU5DVElPTlMKLSAgTm9uZQotCi1Db3B5cmlnaHQgKGMpIDE5OTItMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi1tYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotIAotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotKj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Ki8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIEZJTEUKLQotVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoaXMgZmlsZS4KLU5vdGljZSB0aGF0IGNoYW5nZXMgYXJlIGxpc3RlZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIuCi0gICAKLSRIZWFkZXI6IC8vc291cmNlL3Fjb20vcWN0L211bHRpbWVkaWEyL0Fkc3BTdmMvN1hYWC9xZHNwNWNtZC92aWRlby9xZHNwNXZkZWNjbWRpLmgjMiAkICREYXRlVGltZTogMjAwOC8wNy8zMCAxMDo1MDoyMyAkICRBdXRob3I6IHBhdmFuciAkICAgICAgICAgICAgICAgICAgICAgCi1SZXZpc2lvbiBIaXN0b3J5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCi13aGVuICAgICAgIHdobyAgICAgd2hhdCwgd2hlcmUsIHdoeQotLS0tLS0tLS0gICAtLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTA1LzEwLzA4ICAgYWMgICAgICBpbml0aWFsIHZlcnNpb24KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLQotLyoKLSAqIENvbW1hbmQgdG8gaW5mb3JtIFZJRERFQyB0aGF0IG5ldyBzdWJmcmFtZSBwYWNrZXQgaXMgcmVhZHkKLSAqLwotCi0jZGVmaW5lCVZJRERFQ19DTURfU1VCRlJBTUVfUEtUCQkweDAwMDAKLSNkZWZpbmUJVklEREVDX0NNRF9TVUJGUkFNRV9QS1RfTEVOIFwKLQlzaXplb2YodmlkZGVjX2NtZF9zdWJmcmFtZV9wa3QpCi0KLSNkZWZpbmUJVklEREVDX0NNRF9TRl9JTkZPXzFfRE1fRE1BX1NUQVRTX0VYQ0hBTkdFX0ZMQUdfRE0JCTB4MDAwMAotI2RlZmluZQlWSURERUNfQ01EX1NGX0lORk9fMV9ETV9ETUFfU1RBVFNfRVhDSEFOR0VfRkxBR19ETUEgCTB4MDAwMQotCi0jZGVmaW5lCVZJRERFQ19DTURfU0ZfSU5GT18wX1NVQkZSQU1FX0NPTlRJCQkweDAwMDAKLSNkZWZpbmUJVklEREVDX0NNRF9TRl9JTkZPXzBfU1VCRlJBTUVfRklSU1QJCTB4MDAwMQotI2RlZmluZQlWSURERUNfQ01EX1NGX0lORk9fMF9TVUJGUkFNRV9MQVNUCQkweDAwMDIKLSNkZWZpbmUJVklEREVDX0NNRF9TRl9JTkZPXzBfU1VCRlJBTUVfRklSU1RfQU5EX0xBU1QgCTB4MDAwMwotCi0jZGVmaW5lCVZJRERFQ19DTURfQ09ERUNfU0VMRUNUSU9OX1dPUkRfTVBFR180CQkweDAwMDAKLSNkZWZpbmUJVklEREVDX0NNRF9DT0RFQ19TRUxFQ1RJT05fV09SRF9IXzI2M19QMAkweDAwMDEKLSNkZWZpbmUJVklEREVDX0NNRF9DT0RFQ19TRUxFQ1RJT05fV09SRF9IXzI2NAkJMHgwMDAyCi0jZGVmaW5lCVZJRERFQ19DTURfQ09ERUNfU0VMRUNUSU9OX1dPUkRfSF8yNjNfcDMJMHgwMDAzCi0jZGVmaW5lCVZJRERFQ19DTURfQ09ERUNfU0VMRUNUSU9OX1dPUkRfUlY5CQkweDAwMDQKLSNkZWZpbmUJVklEREVDX0NNRF9DT0RFQ19TRUxFQ1RJT05fV09SRF9XTVY5CQkweDAwMDUKLSNkZWZpbmUJVklEREVDX0NNRF9DT0RFQ19TRUxFQ1RJT05fV09SRF9TTUNEQgkJMHgwMDA2Ci0jZGVmaW5lCVZJRERFQ19DTURfQ09ERUNfU0VMRUNUSU9OX1dPUkRfUUZSRQkJMHgwMDA3Ci0jZGVmaW5lCVZJRERFQ19DTURfQ09ERUNfU0VMRUNUSU9OX1dPUkRfVkxECQkweDAwMDgKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0CWNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydAlwYWNrZXRfc2VxX251bWJlcjsKLQl1bnNpZ25lZCBzaG9ydAljb2RlY19pbnN0YW5jZV9pZDsKLQl1bnNpZ25lZCBzaG9ydAlzdWJmcmFtZV9wYWNrZXRfc2l6ZV9oaWdoOwotCXVuc2lnbmVkIHNob3J0CXN1YmZyYW1lX3BhY2tldF9zaXplX2xvdzsKLQl1bnNpZ25lZCBzaG9ydAlzdWJmcmFtZV9wYWNrZXRfaGlnaDsKLQl1bnNpZ25lZCBzaG9ydAlzdWJmcmFtZV9wYWNrZXRfbG93OwotCXVuc2lnbmVkIHNob3J0CXN1YmZyYW1lX3BhY2tldF9wYXJ0aXRpb247Ci0JdW5zaWduZWQgc2hvcnQJc3RhdGlzdGljc19wYWNrZXRfc2l6ZV9oaWdoOwotCXVuc2lnbmVkIHNob3J0CXN0YXRpc3RpY3NfcGFja2V0X3NpemVfbG93OwotCXVuc2lnbmVkIHNob3J0CXN0YXRpc3RpY3NfcGFja2V0X2hpZ2g7Ci0JdW5zaWduZWQgc2hvcnQJc3RhdGlzdGljc19wYWNrZXRfbG93OwotCXVuc2lnbmVkIHNob3J0CXN0YXRpc3RpY3NfcGFydGl0aW9uOwotCXVuc2lnbmVkIHNob3J0CXN1YmZyYW1lX2luZm9fMTsKLQl1bnNpZ25lZCBzaG9ydAlzdWJmcmFtZV9pbmZvXzA7Ci0JdW5zaWduZWQgc2hvcnQJY29kZWNfc2VsZWN0aW9uX3dvcmQ7Ci0JdW5zaWduZWQgc2hvcnQJbnVtX21iczsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmlkZGVjX2NtZF9zdWJmcmFtZV9wa3Q7Ci0KLQotLyoKLSAqIENvbW1hbmQgdG8gaW5mb3JtIFZJRERFQyB0YXNrIHRoYXQgcG9zdCBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkIGZvciB0aGUgZnJhbWUKLSAqLwotCi0jZGVmaW5lCVZJRERFQ19DTURfUFBfRU5BQkxFCQkweDAwMDEKLSNkZWZpbmUJVklEREVDX0NNRF9QUF9FTkFCTEVfTEVOIFwKLQlzaXplb2YodmlkZGVjX2NtZF9wcF9lbmFibGUpCi0KLSNkZWZpbmUJVklEREVDX0NNRF9QUF9JTkZPXzBfRE1fRE1BX0xTX0VYQ0hBTkdFX0ZMQUdfRE0JCTB4MDAwMAotI2RlZmluZQlWSURERUNfQ01EX1BQX0lORk9fMF9ETV9ETUFfTFNfRVhDSEFOR0VfRkxBR19ETUEJMHgwMDAxCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydAljbWRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQJcGFja2V0X3NlcV9udW07Ci0JdW5zaWduZWQgc2hvcnQJY29kZWNfaW5zdGFuY2VfaWQ7Ci0JdW5zaWduZWQgc2hvcnQJcG9zdHByb2NfaW5mb18wOwotCXVuc2lnbmVkIHNob3J0CWNvZGVjX3NlbGVjdGlvbl93b3JkOwotCXVuc2lnbmVkIHNob3J0CXBwX291dHB1dF9hZGRyX2hpZ2g7Ci0JdW5zaWduZWQgc2hvcnQJcHBfb3V0cHV0X2FkZHJfbG93OwotCXVuc2lnbmVkIHNob3J0CXBvc3Rwcm9jX2luZm9fMTsKLQl1bnNpZ25lZCBzaG9ydAlsb2FkX3NoYXJpbmdfcGFja2V0X3NpemVfaGlnaDsKLQl1bnNpZ25lZCBzaG9ydAlsb2FkX3NoYXJpbmdfcGFja2V0X3NpemVfbG93OwotCXVuc2lnbmVkIHNob3J0CWxvYWRfc2hhcmluZ19wYWNrZXRfaGlnaDsKLQl1bnNpZ25lZCBzaG9ydAlsb2FkX3NoYXJpbmdfcGFja2V0X2xvdzsKLQl1bnNpZ25lZCBzaG9ydAlsb2FkX3NoYXJpbmdfcGFydGl0aW9uOwotCXVuc2lnbmVkIHNob3J0CXBwX3BhcmFtXzA7Ci0JdW5zaWduZWQgc2hvcnQJcHBfcGFyYW1fMTsKLQl1bnNpZ25lZCBzaG9ydAlwcF9wYXJhbV8yOwotCXVuc2lnbmVkIHNob3J0CXBwX3BhcmFtXzM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZpZGRlY19jbWRfcHBfZW5hYmxlOwotCi0KLS8qCi0gKiBGUkFNRSBIZWFkZXIgUGFja2V0IDogSXQgaXMgYXQgdGhlIHN0YXJ0IG9mIG5ldyBmcmFtZQotICovCi0KLSNkZWZpbmUJVklEREVDX0NNRF9GUkFNRV9IRUFERVJfUEFDS0VUCTB4MDAwMgotCi0jZGVmaW5lCVZJRERFQ19DTURfRlJBTUVfSU5GT18wX0VSUk9SX1NLSVAJMHgwMDAwCi0jZGVmaW5lCVZJRERFQ19DTURfRlJBTUVfSU5GT18wX0VSUk9SX0JMQUNLCTB4MDgwMAotCi0vKgotICogU0xJQ0UgSEVBREVSIFBBQ0tFVCAKLSAqIEktU2xpY2UgYW5kIFAtU2xpY2UKLSAqLwotCi0jZGVmaW5lCVZJRERFQ19DTURfU0xJQ0VfSEVBREVSX1BLVF9JU0xJQ0UJCTB4MDAwMwotI2RlZmluZQlWSURERUNfQ01EX1NMSUNFX0hFQURFUl9QS1RfSVNMSUNFX0xFTglcCi0Jc2l6ZW9mKHZpZGRlY19jbWRfc2xpY2VfaGVhZGVyX3BrdF9pc2xpY2UpCi0KLSNkZWZpbmUJVklEREVDX0NNRF9JU0xJQ0VfSU5GT18xX01PRF9TTElDRV9UWVBFX1BTTElDRQkweDAwMDAKLSNkZWZpbmUJVklEREVDX0NNRF9JU0xJQ0VfSU5GT18xX01PRF9TTElDRV9UWVBFX0JTTElDRQkweDAxMDAKLSNkZWZpbmUJVklEREVDX0NNRF9JU0xJQ0VfSU5GT18xX01PRF9TTElDRV9UWVBFX0lTTElDRQkweDAyMDAKLSNkZWZpbmUJVklEREVDX0NNRF9JU0xJQ0VfSU5GT18xX01PRF9TTElDRV9UWVBFX1NQU0xJQ0UJMHgwMzAwCi0jZGVmaW5lCVZJRERFQ19DTURfSVNMSUNFX0lORk9fMV9NT0RfU0xJQ0VfVFlQRV9TSVNMSUNFCTB4MDQwMAotI2RlZmluZQlWSURERUNfQ01EX0lTTElDRV9JTkZPXzFfTk9QQURESU5HCTB4MDAwMAotI2RlZmluZQlWSURERUNfQ01EX0lTTElDRV9JTkZPXzFfUEFERElORwkweDA4MDAKLQotI2RlZmluZQlWSURERUNfQ01EX0lTTElDRV9FT1BfTUFSS0VSCQkweDdGRkYKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0CWNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydAlwYWNrZXRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQJc2xpY2VfaW5mb18wOwotCXVuc2lnbmVkIHNob3J0CXNsaWNlX2luZm9fMTsKLQl1bnNpZ25lZCBzaG9ydAlzbGljZV9pbmZvXzI7Ci0JdW5zaWduZWQgc2hvcnQJbnVtX2J5dGVzX2luX3Jic3BfaGlnaDsKLQl1bnNpZ25lZCBzaG9ydAludW1fYnl0ZXNfaW5fcmJzcF9sb3c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtX2J5dGVzX2luX3Jic3BfY29uc3VtZWQ7Ci0JdW5zaWduZWQgc2hvcnQJZW5kX29mX3BhY2tldF9tYXJrZXI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZpZGRlY19jbWRfc2xpY2VfaGVhZGVyX3BrdF9pc2xpY2U7Ci0KLQotI2RlZmluZQlWSURERUNfQ01EX1NMSUNFX0hFQURFUl9QS1RfUFNMSUNFCQkweDAwMDMKLSNkZWZpbmUJVklEREVDX0NNRF9TTElDRV9IRUFERVJfUEtUX1BTTElDRV9MRU4JXAotCXNpemVvZih2aWRkZWNfY21kX3NsaWNlX2hlYWRlcl9wa3RfcHNsaWNlKQotCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydAljbWRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQJcGFja2V0X2lkOwotCXVuc2lnbmVkIHNob3J0CXNsaWNlX2luZm9fMDsKLQl1bnNpZ25lZCBzaG9ydAlzbGljZV9pbmZvXzE7Ci0JdW5zaWduZWQgc2hvcnQJc2xpY2VfaW5mb18yOwotCXVuc2lnbmVkIHNob3J0CXNsaWNlX2luZm9fMzsKLQl1bnNpZ25lZCBzaG9ydAlyZWZpZHhfbDBfbWFwX3RhYl9pbmZvXzA7Ci0JdW5zaWduZWQgc2hvcnQJcmVmaWR4X2wwX21hcF90YWJfaW5mb18xOwotCXVuc2lnbmVkIHNob3J0CXJlZmlkeF9sMF9tYXBfdGFiX2luZm9fMjsKLQl1bnNpZ25lZCBzaG9ydAlyZWZpZHhfbDBfbWFwX3RhYl9pbmZvXzM7Ci0JdW5zaWduZWQgc2hvcnQJbnVtX2J5dGVzX2luX3Jic3BfaGlnaDsKLQl1bnNpZ25lZCBzaG9ydAludW1fYnl0ZXNfaW5fcmJzcF9sb3c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtX2J5dGVzX2luX3Jic3BfY29uc3VtZWQ7Ci0JdW5zaWduZWQgc2hvcnQJZW5kX29mX3BhY2tldF9tYXJrZXI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZpZGRlY19jbWRfc2xpY2VfaGVhZGVyX3BrdF9wc2xpY2U7Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDV2ZGVjbXNnLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDV2ZGVjbXNnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZDEyOWQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1dmRlY21zZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLSNpZm5kZWYgUURTUDVWSURERUNNU0dJX0gKLSNkZWZpbmUgUURTUDVWSURERUNNU0dJX0gKLQotLyo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSoKLQotICAgIFYgSSBEIEUgTyAgRCBFIEMgTyBEIEUgUiAgIEkgTiBUIEUgUiBOIEEgTCAgTSBFIFMgUyBBIEcgRSBTCi0KLUdFTkVSQUwgREVTQ1JJUFRJT04KLSAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmludGlvbnMgb2YgZm9ybWF0IGJsb2NrcyBvZiBtZXNzYWdlcyAKLSAgdGhhdCBhcmUgc2VudCBieSBWSURERUMgVGFzawotCi1SRUZFUkVOQ0VTCi0gIE5vbmUKLQotRVhURVJOQUxJWkVEIEZVTkNUSU9OUwotICBOb25lCi0KLUNvcHlyaWdodCAoYykgMTk5Mi0yMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLW1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQotCi1UaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlLgotTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KLSAgIAotJEhlYWRlcjogLy9zb3VyY2UvcWNvbS9xY3QvbXVsdGltZWRpYTIvQWRzcFN2Yy83WFhYL3Fkc3A1Y21kL3ZpZGVvL3Fkc3A1dmRlY21zZy5oIzIgJCAkRGF0ZVRpbWU6IDIwMDgvMDcvMzAgMTA6NTA6MjMgJCAkQXV0aG9yOiBwYXZhbnIgJCAgICAgICAgICAgICAgICAgICAgIAotUmV2aXNpb24gSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAotd2hlbiAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKLS0tLS0tLS0tICAgLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0wNS8xMC8wOCAgIGFjICAgICAgaW5pdGlhbCB2ZXJzaW9uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKgotICogTWVzc2FnZSB0byBpbmZvcm0gQVJNIHdoaWNoIFZERUNfU1VCRlJBTUVfUEtUX0NNRCBwcm9jZXNzZWQgYnkgVklEREVDIFRBU0sKLSAqLwotCi0jZGVmaW5lCVZJRERFQ19NU0dfU1VCRl9ET05FCTB4MDAwMAotI2RlZmluZQlWSURERUNfTVNHX1NVQkZfRE9ORV9MRU4JXAotCXNpemVvZih2aWRkZWNfbXNnX3N1YmZfZG9uZSkKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0CXBhY2tldF9zZXFfbnVtYmVyOwotCXVuc2lnbmVkIHNob3J0CWNvZGVjX2luc3RhbmNlX2lkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2aWRkZWNfbXNnX3N1YmZfZG9uZTsKLQotCi0vKgotICogTWVzc2FnZSB0byBpbmZvcm0gQVJNIG9uZSBmcmFtZSBoYXMgYmVlbiBkZWNvZGVkCi0gKi8KLQotI2RlZmluZQlWSURERUNfTVNHX0ZSQU1FX0RPTkUJMHgwMDAxCi0jZGVmaW5lCVZJRERFQ19NU0dfRlJBTUVfRE9ORV9MRU4JXAotCXNpemVvZih2aWRkZWNfbXNnX2ZyYW1lX2RvbmUpCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydAlwYWNrZXRfc2VxX251bWJlcjsKLQl1bnNpZ25lZCBzaG9ydAljb2RlY19pbnN0YW5jZV9pZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmlkZGVjX21zZ19mcmFtZV9kb25lOwotCi0KLS8qCi0gKiBNZXNzYWdlIHRvIGluZm9ybSBBUk0gdGhhdCBwb3N0IHByb2Nlc3NpbmcgZnJhbWUgaGFzIGJlZW4gZGVjb2RlZAotICovCi0KLSNkZWZpbmUJVklEREVDX01TR19QUF9FTkFCTEVfQ01EX0RPTkUJMHgwMDAyCi0jZGVmaW5lCVZJRERFQ19NU0dfUFBfRU5BQkxFX0NNRF9ET05FX0xFTglcCi0Jc2l6ZW9mKHZpZGRlY19tc2dfcHBfZW5hYmxlX2NtZF9kb25lKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQJcGFja2V0X3NlcV9udW1iZXI7Ci0JdW5zaWduZWQgc2hvcnQJY29kZWNfaW5zdGFuY2VfaWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZpZGRlY19tc2dfcHBfZW5hYmxlX2NtZF9kb25lOwotCi0KLS8qCi0gKiBNZXNzYWdlIHRvIGluZm9ybSBBUk0gdGhhdCBvbmUgcG9zdCBwcm9jZXNzaW5nIGZyYW1lIGhhcyBiZWVuIGRlY29kZWQKLSAqLwotCi0KLSNkZWZpbmUJVklEREVDX01TR19QUF9GUkFNRV9ET05FCQkweDAwMDMKLSNkZWZpbmUJVklEREVDX01TR19QUF9GUkFNRV9ET05FX0xFTglcCi0Jc2l6ZW9mKHZpZGRlY19tc2dfcHBfZnJhbWVfZG9uZSkKLQotI2RlZmluZQlWSURERUNfTVNHX0RJU1BfV09SVEhZX0RJU1AJCTB4MDAwMAotI2RlZmluZQlWSURERUNfTVNHX0RJU1BfV09SVEhZX0RJU1BfTk9ORQkweEZGRkYKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQJcGFja2V0X3NlcV9udW1iZXI7Ci0JdW5zaWduZWQgc2hvcnQJY29kZWNfaW5zdGFuY2VfaWQ7Ci0JdW5zaWduZWQgc2hvcnQJZGlzcGxheV93b3J0aHk7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZpZGRlY19tc2dfcHBfZnJhbWVfZG9uZTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNXZlbmNjbWRpLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvcWRzcDV2ZW5jY21kaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGUwMGE2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNXZlbmNjbWRpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotI2lmbmRlZiBRRFNQNVZJREVOQ0NNRElfSAotI2RlZmluZSBRRFNQNVZJREVOQ0NNRElfSAotCi0vKj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09KgotCi0gICAgViBJIEQgRSBPICBFIE4gQyBPIEQgRSBSICBJIE4gVCBFIFIgTiBBIEwgIEMgTyBNIE0gQSBOIEQgUwotCi1HRU5FUkFMIERFU0NSSVBUSU9OCi0gIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbnRpb25zIG9mIGZvcm1hdCBibG9ja3Mgb2YgY29tbWFuZHMKLSAgdGhhdCBhcmUgYWNjZXB0ZWQgYnkgVklERU5DIFRhc2sKLQotUkVGRVJFTkNFUwotICBOb25lCi0KLUVYVEVSTkFMSVpFRCBGVU5DVElPTlMKLSAgTm9uZQotCi1Db3B5cmlnaHQgKGMpIDIwMDgtMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCQkJRURJVCBISVNUT1JZIEZPUiBGSUxFCi0KLVRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUuCi1Ob3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgotCi1SZXZpc2lvbiBIaXN0b3J5OgotCi13aGVuICAgICAgIHdobyAgICAgd2hhdCwgd2hlcmUsIHdoeQotLS0tLS0tLS0gICAtLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTA5LzI1LzA4ICAgdW1lc2hwICAgICAgaW5pdGlhbCB2ZXJzaW9uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0gICNkZWZpbmUgVklERU5DX0NNRF9DRkcgICAgICAgICAgIDB4MDAwMAotICAjZGVmaW5lIFZJREVOQ19DTURfQUNUSVZFICAgICAgICAweDAwMDEKLSAgI2RlZmluZSBWSURFTkNfQ01EX0lETEUgICAgICAgICAgMHgwMDAyCi0gICNkZWZpbmUgVklERU5DX0NNRF9GUkFNRV9TVEFSVCAgIDB4MDAwMwotICAjZGVmaW5lIFZJREVOQ19DTURfU1RBVFVTX1FVRVJZICAweDAwMDQKLSAgI2RlZmluZSBWSURFTkNfQ01EX1JDX0NGRyAgICAgICAgMHgwMDA1Ci0gICNkZWZpbmUgVklERU5DX0NNRF9JTlRSQV9SRUZSRVNIIDB4MDAwNgotICAjZGVmaW5lIFZJREVOQ19DTURfQ09ERUNfQ09ORklHICAweDAwMDcKLSAgI2RlZmluZSBWSURFTkNfQ01EX1ZJREVPX0NPTkZJRyAgMHgwMDA4Ci0gICNkZWZpbmUgVklERU5DX0NNRF9QQVJBTUVURVJfVVBEQVRFICAgICAgIDB4MDAwOQotICAjZGVmaW5lIFZJREVOQ19DTURfVkVOQ19DTE9DSyAgICAweDAwMEEKLSAgI2RlZmluZSBWSURFTkNfQ01EX0RJU19DRkcgICAgICAgMHgwMDBCCi0gICNkZWZpbmUgVklERU5DX0NNRF9ESVMgICAgICAgICAgIDB4MDAwQwotICAjZGVmaW5lIFZJREVOQ19DTURfRElHSVRBTF9aT09NICAweDAwMEQKLQotCi0KLQotLyoKLSAqIENvbW1hbmQgdG8gcGFzcyB0aGUgZnJhbWUgbWVzc2FnZSBpbmZvcm1hdGlvbiB0byBWSURFTkMKLSAqLwotCi0KLSNkZWZpbmUgVklERU5DX0NNRF9GUkFNRV9TVEFSVF9MRU4gXAotCXNpemVvZih2aWRlbmNfY21kX2ZyYW1lX3N0YXJ0KQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgc2hvcnQgIGNtZF9pZDsKLSAgICB1bnNpZ25lZCBzaG9ydCAgZnJhbWVfaW5mbzsKLSAgICB1bnNpZ25lZCBzaG9ydCAgZnJhbWVfcmhvX2J1ZGdldF93b3JkX2hpZ2g7Ci0gICAgdW5zaWduZWQgc2hvcnQgIGZyYW1lX3Job19idWRnZXRfd29yZF9sb3c7Ci0gICAgdW5zaWduZWQgc2hvcnQgIGlucHV0X2x1bWFfYWRkcl9oaWdoOwotICAgIHVuc2lnbmVkIHNob3J0ICBpbnB1dF9sdW1hX2FkZHJfbG93OwotICAgIHVuc2lnbmVkIHNob3J0ICBpbnB1dF9jaHJvbWFfYWRkcl9oaWdoOwotICAgIHVuc2lnbmVkIHNob3J0ICBpbnB1dF9jaHJvbWFfYWRkcl9sb3c7Ci0gICAgdW5zaWduZWQgc2hvcnQgIHJlZl92b3BfYnVmX3B0cl9oaWdoOwotICAgIHVuc2lnbmVkIHNob3J0ICByZWZfdm9wX2J1Zl9wdHJfbG93OwotICAgIHVuc2lnbmVkIHNob3J0ICBlbmNfcGt0X2J1Zl9wdHJfaGlnaDsKLSAgICB1bnNpZ25lZCBzaG9ydCAgZW5jX3BrdF9idWZfcHRyX2xvdzsKLSAgICB1bnNpZ25lZCBzaG9ydCAgZW5jX3BrdF9idWZfc2l6ZV9oaWdoOwotICAgIHVuc2lnbmVkIHNob3J0ICBlbmNfcGt0X2J1Zl9zaXplX2xvdzsKLSAgICB1bnNpZ25lZCBzaG9ydCAgdW5maWx0X3JlY29uX3ZvcF9idWZfcHRyX2hpZ2g7Ci0gICAgdW5zaWduZWQgc2hvcnQgIHVuZmlsdF9yZWNvbl92b3BfYnVmX3B0cl9sb3c7Ci0gICAgdW5zaWduZWQgc2hvcnQgIGZpbHRfcmVjb25fdm9wX2J1Zl9wdHJfaGlnaDsKLSAgICB1bnNpZ25lZCBzaG9ydCAgZmlsdF9yZWNvbl92b3BfYnVmX3B0cl9sb3c7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZpZGVuY19jbWRfZnJhbWVfc3RhcnQ7Ci0KLS8qCi0gKiBDb21tYW5kIHRvIHBhc3MgdGhlIGZyYW1lLWxldmVsIGRpZ2l0YWwgc3RhYmlsaXphdGlvbiBwYXJhbWV0ZXJzIHRvIFZJREVOQwotICovCi0KLQotI2RlZmluZSBWSURFTkNfQ01EX0RJU19MRU4gXAotICAgIHNpemVvZih2aWRlbmNfY21kX2RpcykKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIHNob3J0ICBjbWRfaWQ7Ci0gICAgdW5zaWduZWQgc2hvcnQgIHZmZV9vdXRfcHJldl9sdW1hX2FkZHJfaGlnaDsKLSAgICB1bnNpZ25lZCBzaG9ydCAgdmZlX291dF9wcmV2X2x1bWFfYWRkcl9sb3c7Ci0gICAgdW5zaWduZWQgc2hvcnQgIHN0YWJpbGl6YXRpb25faW5mbzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmlkZW5jX2NtZF9kaXM7Ci0KLS8qCi0gKiBDb21tYW5kIHRvIHBhc3MgdGhlIGNvZGVjIHJlbGF0ZWQgcGFyYW1ldGVycyB0byBWSURFTkMKLSAqLwotCi0KLSNkZWZpbmUgVklERU5DX0NNRF9DRkdfTEVOIFwKLSAgICBzaXplb2YodmlkZW5jX2NtZF9jZmcpCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBzaG9ydCAgY21kX2lkOwotICAgIHVuc2lnbmVkIHNob3J0ICBjZmdfaW5mb18wOwotICAgIHVuc2lnbmVkIHNob3J0ICBjZmdfaW5mb18xOwotICAgIHVuc2lnbmVkIHNob3J0ICBmb3VyX212X3RocmVzaG9sZDsKLSAgICB1bnNpZ25lZCBzaG9ydCAgaXNlX2ZzZV9tdl9jb3N0X2ZhYzsKLQl1bnNpZ25lZCBzaG9ydCAgdmVuY19mcmFtZV9kaW07Ci0JdW5zaWduZWQgc2hvcnQgIHZlbmNfRE1fcGFydGl0aW9uOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2aWRlbmNfY21kX2NmZzsKLQotLyoKLSAqIENvbW1hbmQgdG8gc3RhcnQgdGhlIHZpZGVvIGVuY29kaW5nCi0gKi8KLQotCi0jZGVmaW5lIFZJREVOQ19DTURfQUNUSVZFX0xFTiBcCi0gICAgc2l6ZW9mKHZpZGVuY19jbWRfYWN0aXZlKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgc2hvcnQgIGNtZF9pZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmlkZW5jX2NtZF9hY3RpdmU7Ci0KLS8qCi0gKiBDb21tYW5kIHRvIHN0b3AgdGhlIHZpZGVvIGVuY29kaW5nCi0gKi8KLQotCi0jZGVmaW5lIFZJREVOQ19DTURfSURMRV9MRU4gXAotICAgIHNpemVvZih2aWRlbmNfY21kX2lkbGUpCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBzaG9ydCAgY21kX2lkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2aWRlbmNfY21kX2lkbGU7Ci0KLS8qCi0gKiBDb21tYW5kIHRvIHF1ZXJ5IHN0YXVzIG9mIFZJREVOQwotICovCi0KLQotI2RlZmluZSBWSURFTkNfQ01EX1NUQVRVU19RVUVSWV9MRU4gXAotICAgIHNpemVvZih2aWRlbmNfY21kX3N0YXR1c19xdWVyeSkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIHNob3J0ICBjbWRfaWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZpZGVuY19jbWRfc3RhdHVzX3F1ZXJ5OwotCi0vKgotICogQ29tbWFuZCB0byBzZXQgcmF0ZSBjb250cm9sIGZvciBhIGZyYW1lCi0gKi8KLQotCi0jZGVmaW5lIFZJREVOQ19DTURfUkNfQ0ZHX0xFTiBcCi0gICAgc2l6ZW9mKHZpZGVuY19jbWRfcmNfY2ZnKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgc2hvcnQgIGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCAgbWF4X2ZyYW1lX3FwX2RlbHRhOwotCXVuc2lnbmVkIHNob3J0ICBtYXhfbWluX2ZyYW1lX3FwOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2aWRlbmNfY21kX3JjX2NmZzsKLQotLyoKLSAqIENvbW1hbmQgdG8gc2V0IGludHJhLXJlZnJlc2hpbmcKLSAqLwotCi0KLSNkZWZpbmUgVklERU5DX0NNRF9JTlRSQV9SRUZSRVNIX0xFTiBcCi0gICAgc2l6ZW9mKHZpZGVuY19jbWRfaW50cmFfcmVmcmVzaCkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIHNob3J0ICBjbWRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQgIG51bV9tYl9yZWZyZXNoOwotCXVuc2lnbmVkIHNob3J0ICBtYl9pbmRleFsxNV07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZpZGVuY19jbWRfaW50cmFfcmVmcmVzaDsKLQotLyoKLSAqIENvbW1hbmQgdG8gcGFzcyBkaWdpdGFsIHpvb20gaW5mb3JtYXRpb24gdG8gdGhlIFZJREVOQwotICovCi0jZGVmaW5lIFZJREVOQ19DTURfRElHSVRBTF9aT09NX0xFTiBcCi0gICAgc2l6ZW9mKHZpZGVuY19jbWRfZGlnaXRhbF96b29tKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgc2hvcnQgIGNtZF9pZDsKLSAgICB1bnNpZ25lZCBzaG9ydCAgZGlnaXRhbF96b29tX2VuOwotICAgIHVuc2lnbmVkIHNob3J0ICBsdW1hX2ZyYW1lX3NoaWZ0X1g7Ci0gICAgdW5zaWduZWQgc2hvcnQgIGx1bWFfZnJhbWVfc2hpZnRfWTsKLSAgICB1bnNpZ25lZCBzaG9ydCAgdXBfaXBfbHVtYV9yb3dzOwotICAgIHVuc2lnbmVkIHNob3J0ICB1cF9pcF9sdW1hX2NvbHM7Ci0gICAgdW5zaWduZWQgc2hvcnQgIHVwX2lwX2Nocm9tYV9yb3dzOwotICAgIHVuc2lnbmVkIHNob3J0ICB1cF9pcF9jaHJvbWFfY29sczsKLSAgICB1bnNpZ25lZCBzaG9ydCAgbHVtYV9waF9pbmNyX1ZfbG93OwotICAgIHVuc2lnbmVkIHNob3J0ICBsdW1hX3BoX2luY3JfVl9oaWdoOwotICAgIHVuc2lnbmVkIHNob3J0ICBsdW1hX3BoX2luY3JfSF9sb3c7Ci0gICAgdW5zaWduZWQgc2hvcnQgIGx1bWFfcGhfaW5jcl9IX2hpZ2g7Ci0gICAgdW5zaWduZWQgc2hvcnQgIGNocm9tYV9waF9pbmNyX1ZfbG93OwotICAgIHVuc2lnbmVkIHNob3J0ICBjaHJvbWFfcGhfaW5jcl9WX2hpZ2g7Ci0gICAgdW5zaWduZWQgc2hvcnQgIGNocm9tYV9waF9pbmNyX0hfbG93OwotICAgIHVuc2lnbmVkIHNob3J0ICBjaHJvbWFfcGhfaW5jcl9IX2hpZ2g7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZpZGVuY19jbWRfZGlnaXRhbF96b29tOwotCi0vKgotICogQ29tbWFuZCB0byBjb25maWd1cmUgZGlnaXRhbCBzdGFiaWxpemF0aW9uIHBhcmFtZXRlcnMKLSAqLwotCi0jZGVmaW5lIFZJREVOQ19DTURfRElTX0NGR19MRU4gXAotICAgIHNpemVvZih2aWRlbmNfY21kX2Rpc19jZmcpCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBzaG9ydCAgY21kX2lkOwotICAgIHVuc2lnbmVkIHNob3J0ICBpbWFnZV9zdGFiX3N1YmZfc3RhcnRfcm93X2NvbDsKLSAgICB1bnNpZ25lZCBzaG9ydCAgaW1hZ2Vfc3RhYl9zdWJmX2RpbTsKLSAgICB1bnNpZ25lZCBzaG9ydCAgaW1hZ2Vfc3RhYl9pbmZvXzA7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZpZGVuY19jbWRfZGlzX2NmZzsKLQotCi0vKgotICogQ29tbWFuZCB0byBzZXQgVklERU5DX0NNRF9WRU5DX0NMT0NLCi0gKi8KLQotCi0jZGVmaW5lIFZJREVOQ19DTURfVkVOQ19DTE9DS19MRU4gXAotICAgIHNpemVvZihzdHJ1Y3QgdmlkZW5jX2NtZF92ZW5jX2Nsb2NrKQotCi1zdHJ1Y3QgdmlkZW5jX2NtZF92ZW5jX2Nsb2NrIHsKLSAgICB1bnNpZ25lZCBzaG9ydCAgY21kX2lkOwotICAgIHVuc2lnbmVkIHNob3J0ICBwYXlsb2FkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSA7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1dmZlY21kaS5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1dmZlY21kaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGVhMjFjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNXZmZWNtZGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxMCArMCwwIEBACi0jaWZuZGVmIFFEU1A1VkZFQ01ESV9ICi0jZGVmaW5lIFFEU1A1VkZFQ01ESV9ICi0KLS8qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qCi0KLSAgICBWIEYgRSAgIEkgTiBUIEUgUiBOIEEgTCAgIEMgTyBNIE0gQSBOIEQgUwotCi1HRU5FUkFMIERFU0NSSVBUSU9OCi0gIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbnRpb25zIG9mIGZvcm1hdCBibG9ja3Mgb2YgY29tbWFuZHMgCi0gIHRoYXQgYXJlIGFjY2VwdGVkIGJ5IFZGRSBUYXNrCi0KLVJFRkVSRU5DRVMKLSAgTm9uZQotCi1FWFRFUk5BTElaRUQgRlVOQ1RJT05TCi0gIE5vbmUKLQotQ29weXJpZ2h0IChjKSAxOTkyLTIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAKLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCi0KLVRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUuCi1Ob3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgotICAgCi0kSGVhZGVyOiAvL3NvdXJjZS9xY29tL3FjdC9tdWx0aW1lZGlhMi9BZHNwU3ZjLzdYWFgvcWRzcDVjbWQvdmlkZW8vcWRzcDV2ZmVjbWRpLmgjMiAkICREYXRlVGltZTogMjAwOC8wNy8zMCAxMDo1MDoyMyAkICRBdXRob3I6IHBhdmFuciAkICAgICAgICAgICAgICAgICAgICAgCi1SZXZpc2lvbiBIaXN0b3J5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCi13aGVuICAgICAgIHdobyAgICAgd2hhdCwgd2hlcmUsIHdoeQotLS0tLS0tLS0gICAtLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTA2LzEyLzA4ICAgc3YgICAgICBpbml0aWFsIHZlcnNpb24KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbW1hbmRzIHRocm91Z2ggdmZlQ29tbWFuZFNjYWxlUXVldWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvbW1hbmQgdG8gcHJvZ3JhbSBzY2FsZXIgZm9yIG9wMSAuIG1heCBvcCBvZiBzY2FsZXIgaXMgVkdBCi0gKi8KLQotCi0jZGVmaW5lCVZGRV9DTURfU0NBTEVfT1AxX0NGRwkJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfU0NBTEVfT1AxX0NGR19MRU4JXAotCXNpemVvZih2ZmVfY21kX3NjYWxlX29wMV9jZmcpCi0KLSNkZWZpbmUJVkZFX0NNRF9TQ0FMRV9PUDFfU0VMX0lQX1NFTF9ZX1NUQU5EQVJECTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX1NDQUxFX09QMV9TRUxfSVBfU0VMX1lfQ0FTQ0FERUQJMHgwMDAxCi0jZGVmaW5lCVZGRV9DTURfU0NBTEVfT1AxX1NFTF9IX1lfU0NBTEVSX0RJUwkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9TQ0FMRV9PUDFfU0VMX0hfWV9TQ0FMRVJfRU5BCTB4MDAwMgotI2RlZmluZQlWRkVfQ01EX1NDQUxFX09QMV9TRUxfSF9QUF9ZX1NDQUxFUl9ESVMJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfU0NBTEVfT1AxX1NFTF9IX1BQX1lfU0NBTEVSX0VOQQkweDAwMDQKLSNkZWZpbmUJVkZFX0NNRF9TQ0FMRV9PUDFfU0VMX1ZfWV9TQ0FMRVJfRElTCTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX1NDQUxFX09QMV9TRUxfVl9ZX1NDQUxFUl9FTkEJMHgwMDA4Ci0jZGVmaW5lCVZGRV9DTURfU0NBTEVfT1AxX1NFTF9WX1BQX1lfU0NBTEVSX0RJUwkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9TQ0FMRV9PUDFfU0VMX1ZfUFBfWV9TQ0FMRVJfRU5BCTB4MDAxMAotI2RlZmluZQlWRkVfQ01EX1NDQUxFX09QMV9TRUxfSVBfU0VMX0NCQ1JfU1RBTkRBUkQJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfU0NBTEVfT1AxX1NFTF9JUF9TRUxfQ0JDUl9DQVNDQURFRAkweDAwMjAKLSNkZWZpbmUJVkZFX0NNRF9TQ0FMRV9PUDFfU0VMX0hfQ0JDUl9TQ0FMRVJfRElTCQkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9TQ0FMRV9PUDFfU0VMX0hfQ0JDUl9TQ0FMRVJfRU5BCQkweDAwNDAKLSNkZWZpbmUJVkZFX0NNRF9TQ0FMRV9PUDFfU0VMX1ZfQ0JDUl9TQ0FMRVJfRElTCQkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9TQ0FMRV9PUDFfU0VMX1ZfQ0JDUl9TQ0FMRVJfRU5BCQkweDAwODAKLQotI2RlZmluZQlWRkVfQ01EX09QMV9QUF9ZX1NDQUxFUl9DRkdfUEFSVDFfRE9OVF9MT0FEX0NPRUZGUwkweDgwMDAwMDAwCi0jZGVmaW5lCVZGRV9DTURfT1AxX1BQX1lfU0NBTEVSX0NGR19QQVJUMV9MT0FEX0NPRUZGUwkweDgwMDAwMDAwCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAlzY2FsZV9vcDFfc2VsOwotCXVuc2lnbmVkIGludAl5X3NjYWxlcl9jZmdfcGFydDE7Ci0JdW5zaWduZWQgaW50CXlfc2NhbGVyX2NmZ19wYXJ0MjsKLQl1bnNpZ25lZCBpbnQJY2Jjcl9zY2FsZXJfY2ZnX3BhcnQxOwotCXVuc2lnbmVkIGludAljYmNyX3NjYWxlcl9jZmdfcGFydDI7Ci0JdW5zaWduZWQgaW50CWNiY3Jfc2NhbGVyX2NmZ19wYXJ0MzsKLQl1bnNpZ25lZCBpbnQJcHBfeV9zY2FsZXJfY2ZnX3BhcnQxOwotCXVuc2lnbmVkIGludAlwcF95X3NjYWxlcl9jZmdfcGFydDI7Ci0JdW5zaWduZWQgaW50CXlfc2NhbGVyX3ZfY29lZmZfYmFua19wYXJ0MVsxNl07Ci0JdW5zaWduZWQgaW50CXlfc2NhbGVyX3ZfY29lZmZfYmFua19wYXJ0MlsxNl07Ci0JdW5zaWduZWQgaW50CXlfc2NhbGVyX2hfY29lZmZfYmFua19wYXJ0MVsxNl07Ci0JdW5zaWduZWQgaW50CXlfc2NhbGVyX2hfY29lZmZfYmFua19wYXJ0MlsxNl07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9jbWRfc2NhbGVfb3AxX2NmZzsKLQotCi0vKgotICogQ29tbWFuZCB0byBwcm9ncmFtIHNjYWxlciBmb3Igb3AyCi0gKi8KLQotI2RlZmluZQlWRkVfQ01EX1NDQUxFX09QMl9DRkcJCTB4MDAwMQotI2RlZmluZQlWRkVfQ01EX1NDQUxFX09QMl9DRkdfTEVOCVwKLQlzaXplb2YodmZlX2NtZF9zY2FsZV9vcDJfY2ZnKQotCi0jZGVmaW5lCVZGRV9DTURfU0NBTEVfT1AyX1NFTF9JUF9TRUxfWV9TVEFOREFSRAkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9TQ0FMRV9PUDJfU0VMX0lQX1NFTF9ZX0NBU0NBREVECTB4MDAwMQotI2RlZmluZQlWRkVfQ01EX1NDQUxFX09QMl9TRUxfSF9ZX1NDQUxFUl9ESVMJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfU0NBTEVfT1AyX1NFTF9IX1lfU0NBTEVSX0VOQQkweDAwMDIKLSNkZWZpbmUJVkZFX0NNRF9TQ0FMRV9PUDJfU0VMX0hfUFBfWV9TQ0FMRVJfRElTCTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX1NDQUxFX09QMl9TRUxfSF9QUF9ZX1NDQUxFUl9FTkEJMHgwMDA0Ci0jZGVmaW5lCVZGRV9DTURfU0NBTEVfT1AyX1NFTF9WX1lfU0NBTEVSX0RJUwkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9TQ0FMRV9PUDJfU0VMX1ZfWV9TQ0FMRVJfRU5BCTB4MDAwOAotI2RlZmluZQlWRkVfQ01EX1NDQUxFX09QMl9TRUxfVl9QUF9ZX1NDQUxFUl9ESVMJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfU0NBTEVfT1AyX1NFTF9WX1BQX1lfU0NBTEVSX0VOQQkweDAwMTAKLSNkZWZpbmUJVkZFX0NNRF9TQ0FMRV9PUDJfU0VMX0lQX1NFTF9DQkNSX1NUQU5EQVJECTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX1NDQUxFX09QMl9TRUxfSVBfU0VMX0NCQ1JfQ0FTQ0FERUQJMHgwMDIwCi0jZGVmaW5lCVZGRV9DTURfU0NBTEVfT1AyX1NFTF9IX0NCQ1JfU0NBTEVSX0RJUwkJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfU0NBTEVfT1AyX1NFTF9IX0NCQ1JfU0NBTEVSX0VOQQkJMHgwMDQwCi0jZGVmaW5lCVZGRV9DTURfU0NBTEVfT1AyX1NFTF9WX0NCQ1JfU0NBTEVSX0RJUwkJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfU0NBTEVfT1AyX1NFTF9WX0NCQ1JfU0NBTEVSX0VOQQkJMHgwMDgwCi0KLSNkZWZpbmUJVkZFX0NNRF9PUDJfUFBfWV9TQ0FMRVJfQ0ZHX1BBUlQxX0RPTlRfTE9BRF9DT0VGRlMJMHg4MDAwMDAwMAotI2RlZmluZQlWRkVfQ01EX09QMl9QUF9ZX1NDQUxFUl9DRkdfUEFSVDFfTE9BRF9DT0VGRlMJCTB4ODAwMDAwMDAKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAljbWRfaWQ7Ci0JdW5zaWduZWQgaW50CXNjYWxlX29wMl9zZWw7Ci0JdW5zaWduZWQgaW50CXlfc2NhbGVyX2NmZ19wYXJ0MTsKLQl1bnNpZ25lZCBpbnQJeV9zY2FsZXJfY2ZnX3BhcnQyOwotCXVuc2lnbmVkIGludAljYmNyX3NjYWxlcl9jZmdfcGFydDE7Ci0JdW5zaWduZWQgaW50CWNiY3Jfc2NhbGVyX2NmZ19wYXJ0MjsKLQl1bnNpZ25lZCBpbnQJY2Jjcl9zY2FsZXJfY2ZnX3BhcnQzOwotCXVuc2lnbmVkIGludAlwcF95X3NjYWxlcl9jZmdfcGFydDE7Ci0JdW5zaWduZWQgaW50CXBwX3lfc2NhbGVyX2NmZ19wYXJ0MjsKLQl1bnNpZ25lZCBpbnQJeV9zY2FsZXJfdl9jb2VmZl9iYW5rX3BhcnQxWzE2XTsKLQl1bnNpZ25lZCBpbnQJeV9zY2FsZXJfdl9jb2VmZl9iYW5rX3BhcnQyWzE2XTsKLQl1bnNpZ25lZCBpbnQJeV9zY2FsZXJfaF9jb2VmZl9iYW5rX3BhcnQxWzE2XTsKLQl1bnNpZ25lZCBpbnQJeV9zY2FsZXJfaF9jb2VmZl9iYW5rX3BhcnQyWzE2XTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX2NtZF9zY2FsZV9vcDJfY2ZnOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbW1hbmRzIHRocm91Z2ggdmZlQ29tbWFuZFRhYmxlUXVldWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvbW1hbmQgdG8gcHJvZ3JhbSB0aGUgQVhJIGlwIHBhdGhzCi0gKi8KLQotI2RlZmluZQlWRkVfQ01EX0FYSV9JUF9DRkcJCTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX0FYSV9JUF9DRkdfTEVOCQlzaXplb2YodmZlX2NtZF9heGlfaXBfY2ZnKQotCi0jZGVmaW5lCVZGRV9DTURfSVBfU0VMX0lQX0ZPUk1BVF84CTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX0lQX1NFTF9JUF9GT1JNQVRfMTAJMHgwMDAxCi0jZGVmaW5lCVZGRV9DTURfSVBfU0VMX0lQX0ZPUk1BVF8xMgkweDAwMDIKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAljbWRfaWQ7Ci0JdW5zaWduZWQgaW50CWlwX3NlbDsKLQl1bnNpZ25lZCBpbnQJaXBfY2ZnX3BhcnQxOwotCXVuc2lnbmVkIGludAlpcF9jZmdfcGFydDI7Ci0JdW5zaWduZWQgaW50CWlwX3VucGFja19jZmdfcGFydFs2XTsKLQl1bnNpZ25lZCBpbnQJaXBfYnVmX2FkZHJbOF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSB2ZmVfY21kX2F4aV9pcF9jZmc7Ci0KLQotLyoKLSAqIENvbW1hbmQgdG8gcHJvZ3JhbSBheGkgb3AgcGF0aHMKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfQVhJX09QX0NGRwkweDAwMDEKLSNkZWZpbmUJVkZFX0NNRF9BWElfT1BfQ0ZHX0xFTglzaXplb2YodmZlX2NtZF9heGlfb3BfY2ZnKQotCi0jZGVmaW5lCVZGRV9DTURfT1BfU0VMX09QMQkJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfT1BfU0VMX09QMgkJMHgwMDAxCi0jZGVmaW5lCVZGRV9DTURfT1BfU0VMX09QMV9PUDIJCTB4MDAwMgotI2RlZmluZQlWRkVfQ01EX09QX1NFTF9DVE9BCQkweDAwMDMKLSNkZWZpbmUJVkZFX0NNRF9PUF9TRUxfQ1RPQV9PUDEJCTB4MDAwNAotI2RlZmluZQlWRkVfQ01EX09QX1NFTF9DVE9BX09QMgkJMHgwMDA1Ci0jZGVmaW5lCVZGRV9DTURfT1BfU0VMX09QX0ZPUk1BVF84CTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX09QX1NFTF9PUF9GT1JNQVRfMTAJMHgwMDA4Ci0jZGVmaW5lCVZGRV9DTURfT1BfU0VMX09QX0ZPUk1BVF8xMgkweDAwMTAKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50CWNtZF9pZDsKLQl1bnNpZ25lZCBpbnQJb3Bfc2VsOwotCXVuc2lnbmVkIGludAlvcDFfeV9jZmdfcGFydDE7Ci0JdW5zaWduZWQgaW50CW9wMV95X2NmZ19wYXJ0MjsKLQl1bnNpZ25lZCBpbnQJb3AxX2NiY3JfY2ZnX3BhcnQxOwotCXVuc2lnbmVkIGludAlvcDFfY2Jjcl9jZmdfcGFydDI7Ci0JdW5zaWduZWQgaW50CW9wMl95X2NmZ19wYXJ0MTsKLQl1bnNpZ25lZCBpbnQJb3AyX3lfY2ZnX3BhcnQyOwotCXVuc2lnbmVkIGludAlvcDJfY2Jjcl9jZmdfcGFydDE7Ci0JdW5zaWduZWQgaW50CW9wMl9jYmNyX2NmZ19wYXJ0MjsKLQl1bnNpZ25lZCBpbnQJb3AxX2J1ZjFfYWRkclsxNl07Ci0JdW5zaWduZWQgaW50CW9wMl9idWYxX2FkZHJbMTZdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2ZmVfY21kX2F4aV9vcF9jZmc7Ci0KLQotCi0KLS8qCi0gKiBDb21tYW5kIHRvIHByb2dyYW0gdGhlIHJvbGwgb2ZmIGNvcnJlY3Rpb24gbW9kdWxlCi0gKi8KLQotI2RlZmluZQlWRkVfQ01EX1JPTExPRkZfQ0ZHCTB4MDAwMgotI2RlZmluZQlWRkVfQ01EX1JPTExPRkZfQ0ZHX0xFTglcCi0Jc2l6ZW9mKHZmZV9jbWRfcm9sbG9mZl9jZmcpCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAljbWRfaWQ7Ci0JdW5zaWduZWQgaW50CWNvcnJlY3Rpb25fb3B0X2NlbnRlcl9wb3M7Ci0JdW5zaWduZWQgaW50CXJhZGl1c19zcXVhcmVfZW50cnlbMzJdOwotCXVuc2lnbmVkIGludAlyZWRfdGFibGVfZW50cnlbMzJdOwotCXVuc2lnbmVkIGludAlncmVlbl90YWJsZV9lbnRyeVszMl07Ci0JdW5zaWduZWQgaW50CWJsdWVfdGFibGVfZW50cnlbMzJdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2ZmVfY21kX3JvbGxvZmZfY2ZnOwotCi0vKgotICogQ29tbWFuZCB0byBwcm9ncmFtIFJHQiBnYW1tYSB0YWJsZQotICovCi0KLSNkZWZpbmUJVkZFX0NNRF9SR0JfR0FNTUFfQ0ZHCQkweDAwMDMKLSNkZWZpbmUJVkZFX0NNRF9SR0JfR0FNTUFfQ0ZHX0xFTglcCi0Jc2l6ZW9mKHZmZV9jbWRfcmdiX2dhbW1hX2NmZykKLQotI2RlZmluZQlWRkVfQ01EX1JHQl9HQU1NQV9TRUxfTElORUFSCQkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9SR0JfR0FNTUFfU0VMX1BXX0xJTkVBUgkJMHgwMDAxCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50CWNtZF9pZDsKLQl1bnNpZ25lZCBpbnQJcmdiX2dhbW1hX3NlbDsKLQl1bnNpZ25lZCBpbnQJcmdiX2dhbW1hX2VudHJ5WzI1Nl07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9jbWRfcmdiX2dhbW1hX2NmZzsKLQotCi0vKgotICogQ29tbWFuZCB0byBwcm9ncmFtIGx1bWEgZ2FtbWEgdGFibGUgZm9yIHRoZSBub2lzZSByZWR1Y3Rpb24gcGF0aAotICovCi0KLSNkZWZpbmUJVkZFX0NNRF9ZX0dBTU1BX0NGRwkJMHgwMDA0Ci0jZGVmaW5lCVZGRV9DTURfWV9HQU1NQV9DRkdfTEVOCQlcCi0Jc2l6ZW9mKHZmZV9jbWRfeV9nYW1tYV9jZmcpCi0KLSNkZWZpbmUJVkZFX0NNRF9ZX0dBTU1BX1NFTF9MSU5FQVIJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfWV9HQU1NQV9TRUxfUFdfTElORUFSCTB4MDAwMQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50CWNtZF9pZDsKLQl1bnNpZ25lZCBpbnQJeV9nYW1tYV9zZWw7Ci0JdW5zaWduZWQgaW50CXlfZ2FtbWFfZW50cnlbMjU2XTsJCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9jbWRfeV9nYW1tYV9jZmc7Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb21tYW5kcyB0aHJvdWdoIHZmZUNvbW1hbmRRdWV1ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29tbWFuZCB0byByZXNldCB0aGUgVkZFIHRvIGEga25vd24gZ29vZCBzdGF0ZS5BbGwgcHJldmlvdXNseSBwcm9ncmFtbWVkIAotICogUGFyYW1zIHdpbGwgYmUgbG9zdAotICovCi0KLQotI2RlZmluZQlWRkVfQ01EX1JFU0VUCQkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9SRVNFVF9MRU4Jc2l6ZW9mKHZmZV9jbWRfcmVzZXQpCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0CWNtZF9pZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX2NtZF9yZXNldDsKLQotCi0vKgotICogQ29tbWFuZCB0byBzdGFydCBWRkUgcHJvY2Vzc2luZyBiYXNlZCBvbiB0aGUgY29uZmlnIHBhcmFtcwotICovCi0KLQotI2RlZmluZQlWRkVfQ01EX1NUQVJUCQkweDAwMDEKLSNkZWZpbmUJVkZFX0NNRF9TVEFSVF9MRU4Jc2l6ZW9mKHZmZV9jbWRfc3RhcnQpCi0KLSNkZWZpbmUJVkZFX0NNRF9TVEFSVFVQX1BBUkFNU19TUkNfQ0FNSUYJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfU1RBUlRVUF9QQVJBTVNfU1JDX0FYSQkJMHgwMDAxCi0jZGVmaW5lCVZGRV9DTURfU1RBUlRVUF9QQVJBTVNfTU9ERV9DT05USU5VT1VTCTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX1NUQVJUVVBfUEFSQU1TX01PREVfU05BUFNIT1QJMHgwMDAyCi0KLSNkZWZpbmUJVkZFX0NNRF9JTUFHRV9QTF9CTEFDS19MVkxfQ09SUl9ESVMJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfSU1BR0VfUExfQkxBQ0tfTFZMX0NPUlJfRU5BCTB4MDAwMQotI2RlZmluZQlWRkVfQ01EX0lNQUdFX1BMX1JPTExPRkZfQ09SUl9ESVMJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfSU1BR0VfUExfUk9MTE9GRl9DT1JSX0VOQQkweDAwMDIKLSNkZWZpbmUJVkZFX0NNRF9JTUFHRV9QTF9XSElURV9CQUxfRElTCQkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9JTUFHRV9QTF9XSElURV9CQUxfRU5BCQkweDAwMDQKLSNkZWZpbmUJVkZFX0NNRF9JTUFHRV9QTF9SR0JfR0FNTUFfRElTCQkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9JTUFHRV9QTF9SR0JfR0FNTUFfRU5BCQkweDAwMDgKLSNkZWZpbmUJVkZFX0NNRF9JTUFHRV9QTF9MVU1BX05PSVNFX1JFRF9QQVRIX0RJUwkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9JTUFHRV9QTF9MVU1BX05PSVNFX1JFRF9QQVRIX0VOQQkweDAwMTAKLSNkZWZpbmUJVkZFX0NNRF9JTUFHRV9QTF9BRFBfRklMVEVSX0RJUwkJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfSU1BR0VfUExfQURQX0ZJTFRFUl9FTkEJCTB4MDAyMAotI2RlZmluZQlWRkVfQ01EX0lNQUdFX1BMX0NIUk9NQV9TQU1QX0RJUwkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9JTUFHRV9QTF9DSFJPTUFfU0FNUF9FTkEJMHgwMDQwCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAljbWRfaWQ7Ci0JdW5zaWduZWQgaW50CXN0YXJ0dXBfcGFyYW1zOwotCXVuc2lnbmVkIGludAlpbWFnZV9waXBlbGluZTsKLQl1bnNpZ25lZCBpbnQJZnJhbWVfZGltZW5zaW9uOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2ZmVfY21kX3N0YXJ0OwotCi0KLS8qCi0gKiBDb21tYW5kIHRvIGhhbHQgYWxsIHByb2Nlc3NpbmcKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfU1RPUAkJMHgwMDAyCi0jZGVmaW5lCVZGRV9DTURfU1RPUF9MRU4Jc2l6ZW9mKHZmZV9jbWRfc3RvcCkKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0CWNtZF9pZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX2NtZF9zdG9wOwotCi0KLS8qCi0gKiBDb21tYW5kIHRvIGNvbW1pdCB0aGUgcGFyYW1zIHRoYXQgaGF2ZSBiZWVuIHByb2dyYW1tZWQgdG8gdGFrZQotICogZWZmZWN0IG9uIHRoZSBuZXh0IGZyYW1lCi0gKi8KLQotI2RlZmluZQlWRkVfQ01EX1VQREFURQkJMHgwMDAzCi0jZGVmaW5lCVZGRV9DTURfVVBEQVRFX0xFTglzaXplb2YodmZlX2NtZF91cGRhdGUpCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0CWNtZF9pZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX2NtZF91cGRhdGU7Ci0KLQotLyoKLSAqIENvbW1hbmQgdG8gcHJvZ3JhbSBDQU1JRiBtb2R1bGUKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfQ0FNSUZfQ0ZHCTB4MDAwNAotI2RlZmluZQlWRkVfQ01EX0NBTUlGX0NGR19MRU4Jc2l6ZW9mKHZmZV9jbWRfY2FtaWZfY2ZnKQotCi0jZGVmaW5lCVZGRV9DTURfQ0ZHX1ZTWU5DX1NZTkNfRURHRV9ISUdICTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX0NGR19WU1lOQ19TWU5DX0VER0VfTE9XCQkweDAwMDIKLSNkZWZpbmUJVkZFX0NNRF9DRkdfSFNZTkNfU1lOQ19FREdFX0hJR0gJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfQ0ZHX0hTWU5DX1NZTkNfRURHRV9MT1cJCTB4MDAwNAotI2RlZmluZQlWRkVfQ01EX0NGR19TWU5DX01PREVfQVBTCQkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9DRkdfU1lOQ19NT0RFX0VGUwkJMFgwMDA4Ci0jZGVmaW5lCVZGRV9DTURfQ0ZHX1NZTkNfTU9ERV9FTFMJCTB4MDAxMAotI2RlZmluZQlWRkVfQ01EX0NGR19TWU5DX01PREVfUlZECQkweDAwMTgKLSNkZWZpbmUJVkZFX0NNRF9DRkdfVkZFX1NVQlNBTVBfRU5fRElTCQkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9DRkdfVkZFX1NVQlNBTVBfRU5fRU5BCQkweDAwMjAKLSNkZWZpbmUJVkZFX0NNRF9DRkdfQlVTX1NVQlNBTVBfRU5fRElTCQkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9DRkdfQlVTX1NVQlNBTVBfRU5fRU5BCQkweDAwODAKLSNkZWZpbmUJVkZFX0NNRF9DRkdfSVJRX1NVQlNBTVBfRU5fRElTCQkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9DRkdfSVJRX1NVQlNBTVBfRU5fRU5BCQkweDA4MDAKLQotI2RlZmluZQlWRkVfQ01EX1NVQlNBTVAyX0NGR19QSVhFTF9TS0lQXzE2CTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX1NVQlNBTVAyX0NGR19QSVhFTF9TS0lQXzEyCTB4MDAxMAotCi0jZGVmaW5lCVZGRV9DTURfRVBPQ0hfSVJRXzFfRElTCQkJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfRVBPQ0hfSVJRXzFfRU5BCQkJMHg0MDAwCi0jZGVmaW5lCVZGRV9DTURfRVBPQ0hfSVJRXzJfRElTCQkJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfRVBPQ0hfSVJRXzJfRU5BCQkJMHg4MDAwCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAljZmc7Ci0JdW5zaWduZWQgaW50CWVmc19jZmc7Ci0JdW5zaWduZWQgaW50CWZyYW1lX2NmZzsKLQl1bnNpZ25lZCBpbnQJd2luZG93X3dpZHRoX2NmZzsKLQl1bnNpZ25lZCBpbnQJd2luZG93X2hlaWdodF9jZmc7Ci0JdW5zaWduZWQgaW50CXN1YnNhbXAxX2NmZzsKLQl1bnNpZ25lZCBpbnQJc3Vic2FtcDJfY2ZnOwotCXVuc2lnbmVkIGludAllcG9jaF9pcnE7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9jbWRfY2FtaWZfY2ZnOwotCi0KLQotLyoKLSAqIENvbW1hbmQgdG8gcHJvZ3JhbSB0aGUgYmxhY2sgbGV2ZWwgbW9kdWxlCi0gKi8KLQotI2RlZmluZQlWRkVfQ01EX0JMQUNLX0xWTF9DRkcJCTB4MDAwNQotI2RlZmluZQlWRkVfQ01EX0JMQUNLX0xWTF9DRkdfTEVOCXNpemVvZih2ZmVfY21kX2JsYWNrX2x2bF9jZmcpCi0KLSNkZWZpbmUJVkZFX0NNRF9CTF9TRUxfTUFOVUFMCQkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9CTF9TRUxfQVVUTwkJMHgwMDAxCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAlibGFja19sdmxfc2VsOwotCXVuc2lnbmVkIGludAljZmdfcGFydFszXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX2NtZF9ibGFja19sdmxfY2ZnOwotCi0KLS8qCi0gKiBDb21tYW5kIHRvIHByb2dyYW0gdGhlIGFjdGl2ZSByZWdpb24gYnkgY3JvcHBpbmcgdGhlIHJlZ2lvbiBvZiBpbnRlcmVzdAotICovCi0KLSNkZWZpbmUJVkZFX0NNRF9BQ1RJVkVfUkVHSU9OX0NGRwkweDAwMDYKLSNkZWZpbmUJVkZFX0NNRF9BQ1RJVkVfUkVHSU9OX0NGR19MRU4JXAotCXNpemVvZih2ZmVfY21kX2FjdGl2ZV9yZWdpb25fY2ZnKQotCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAljZmdfcGFydDE7Ci0JdW5zaWduZWQgaW50CWNmZ19wYXJ0MjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX2NtZF9hY3RpdmVfcmVnaW9uX2NmZzsKLQotCi0KLS8qCi0gKiBDb21tYW5kIHRvIHByb2dyYW0gdGhlIGRlZmVjdGl2ZSBwaXhlbCBjb3JyZWN0aW9uKERQQykgLAotICogYWRhcHRpdmUgYmF5ZXIgZmlsdGVyIChBQkYpIGFuZCBkZW1vc2FpYyBtb2R1bGVzCi0gKi8KLQotI2RlZmluZQlWRkVfQ01EX0RFTU9TQUlDX0NGRwkJMHgwMDA3Ci0jZGVmaW5lCVZGRV9DTURfREVNT1NBSUNfQ0ZHX0xFTglzaXplb2YodmZlX2NtZF9kZW1vc2FpY19jZmcpCi0KLSNkZWZpbmUJVkZFX0NNRF9ERU1PU0FJQ19QQVJUMV9BQkZfRU5fRElTCTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX0RFTU9TQUlDX1BBUlQxX0FCRl9FTl9FTkEJMHgwMDAxCi0jZGVmaW5lCVZGRV9DTURfREVNT1NBSUNfUEFSVDFfRFBDX0VOX0RJUwkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9ERU1PU0FJQ19QQVJUMV9EUENfRU5fRU5BCTB4MDAwMgotI2RlZmluZQlWRkVfQ01EX0RFTU9TQUlDX1BBUlQxX0ZPUkNFX0FCRl9PRkYJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfREVNT1NBSUNfUEFSVDFfRk9SQ0VfQUJGX09OCTB4MDAwNAotI2RlZmluZQlWRkVfQ01EX0RFTU9TQUlDX1BBUlQxX1NMT1BFX1NISUZUXzEJMHgwMDAwMDAwMAotI2RlZmluZQlWRkVfQ01EX0RFTU9TQUlDX1BBUlQxX1NMT1BFX1NISUZUXzIJMHgxMDAwMDAwMAotI2RlZmluZQlWRkVfQ01EX0RFTU9TQUlDX1BBUlQxX1NMT1BFX1NISUZUXzQJMHgyMDAwMDAwMAotI2RlZmluZQlWRkVfQ01EX0RFTU9TQUlDX1BBUlQxX1NMT1BFX1NISUZUXzgJMHgzMDAwMDAwMAotI2RlZmluZQlWRkVfQ01EX0RFTU9TQUlDX1BBUlQxX1NMT1BFX1NISUZUXzFfMgkweDUwMDAwMDAwCi0jZGVmaW5lCVZGRV9DTURfREVNT1NBSUNfUEFSVDFfU0xPUEVfU0hJRlRfMV80CTB4NjAwMDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9ERU1PU0FJQ19QQVJUMV9TTE9QRV9TSElGVF8xXzgJMHg3MDAwMDAwMAotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50CWNtZF9pZDsKLQl1bnNpZ25lZCBpbnQJZGVtb3NhaWNfcGFydDE7Ci0JdW5zaWduZWQgaW50CWRlbW9zYWljX3BhcnQyOwotCXVuc2lnbmVkIGludAlkZW1vc2FpY19wYXJ0MzsKLQl1bnNpZ25lZCBpbnQJZGVtb3NhaWNfcGFydDQ7Ci0JdW5zaWduZWQgaW50CWRlbW9zYWljX3BhcnQ1OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2ZmVfY21kX2RlbW9zYWljX2NmZzsKLQotCi0vKgotICogQ29tbWFuZCB0byBwcm9ncmFtIHRoZSBpcCBmb3JtYXQKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfSVBfRk9STUFUX0NGRwkJMHgwMDA4Ci0jZGVmaW5lCVZGRV9DTURfSVBfRk9STUFUX0NGR19MRU4JXAotCXNpemVvZih2ZmVfY21kX2lwX2Zvcm1hdF9jZmcpCi0KLSNkZWZpbmUJVkZFX0NNRF9JUF9GT1JNQVRfU0VMX1JHUkcJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfSVBfRk9STUFUX1NFTF9HUkdSCTB4MDAwMQotI2RlZmluZQlWRkVfQ01EX0lQX0ZPUk1BVF9TRUxfQkdCRwkweDAwMDIKLSNkZWZpbmUJVkZFX0NNRF9JUF9GT1JNQVRfU0VMX0dCR0IJMHgwMDAzCi0jZGVmaW5lCVZGRV9DTURfSVBfRk9STUFUX1NFTF9ZQ0JZQ1IJMHgwMDA0Ci0jZGVmaW5lCVZGRV9DTURfSVBfRk9STUFUX1NFTF9ZQ1JZQ0IJMHgwMDA1Ci0jZGVmaW5lCVZGRV9DTURfSVBfRk9STUFUX1NFTF9DQllDUlkJMHgwMDA2Ci0jZGVmaW5lCVZGRV9DTURfSVBfRk9STUFUX1NFTF9DUllDQlkJMHgwMDA3Ci0jZGVmaW5lCVZGRV9DTURfSVBfRk9STUFUX1NFTF9OT19DSFJPTUEJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfSVBfRk9STUFUX1NFTF9DSFJPTUEJMHgwMDA4Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAljbWRfaWQ7Ci0JdW5zaWduZWQgaW50CWlwX2Zvcm1hdF9zZWw7Ci0JdW5zaWduZWQgaW50CWJhbGFuY2VfZ2FpbnNfcGFydDE7Ci0JdW5zaWduZWQgaW50CWJhbGFuY2VfZ2FpbnNfcGFydDI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9jbWRfaXBfZm9ybWF0X2NmZzsKLQotCi0KLS8qCi0gKiBDb21tYW5kIHRvIHByb2dyYW0gbWF4IGFuZCBtaW4gYWxsb3dlZCBvcCB2YWx1ZXMKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfT1BfQ0xBTVBfQ0ZHCQkweDAwMDkKLSNkZWZpbmUJVkZFX0NNRF9PUF9DTEFNUF9DRkdfTEVOCVwKLQlzaXplb2YodmZlX2NtZF9vcF9jbGFtcF9jZmcpCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAlvcF9jbGFtcF9tYXg7Ci0JdW5zaWduZWQgaW50CW9wX2NsYW1wX21pbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX2NtZF9vcF9jbGFtcF9jZmc7Ci0KLQotLyoKLSAqIENvbW1hbmQgdG8gcHJvZ3JhbSBjaHJvbWEgc3ViIHNhbXBsZSBtb2R1bGUKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfQ0hST01BX1NVQlNBTVBMRV9DRkcJCTB4MDAwQQotI2RlZmluZQlWRkVfQ01EX0NIUk9NQV9TVUJTQU1QTEVfQ0ZHX0xFTglcCi0Jc2l6ZW9mKHZmZV9jbWRfY2hyb21hX3N1YnNhbXBsZV9jZmcpCi0KLSNkZWZpbmUJVkZFX0NNRF9DSFJPTUFfU1VCU0FNUF9TRUxfSF9JTlRFUkVTVElBTF9TQU1QUwkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9DSFJPTUFfU1VCU0FNUF9TRUxfSF9DT1NJVEVEX1NBTVBTCTB4MDAwMQotI2RlZmluZQlWRkVfQ01EX0NIUk9NQV9TVUJTQU1QX1NFTF9WX0lOVEVSRVNUSUFMX1NBTVBTCTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX0NIUk9NQV9TVUJTQU1QX1NFTF9WX0NPU0lURURfU0FNUFMJMHgwMDAyCi0jZGVmaW5lCVZGRV9DTURfQ0hST01BX1NVQlNBTVBfU0VMX0hfU1VCU0FNUF9ESVMJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfQ0hST01BX1NVQlNBTVBfU0VMX0hfU1VCU0FNUF9FTkEJMHgwMDA0Ci0jZGVmaW5lCVZGRV9DTURfQ0hST01BX1NVQlNBTVBfU0VMX1ZfU1VCU0FNUF9ESVMJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfQ0hST01BX1NVQlNBTVBfU0VMX1ZfU1VCU0FNUF9FTkEJMHgwMDA4Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAljaHJvbWFfc3Vic2FtcF9zZWw7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9jbWRfY2hyb21hX3N1YnNhbXBsZV9jZmc7Ci0KLQotLyoKLSAqIENvbW1hbmQgdG8gcHJvZ3JhbSB0aGUgd2hpdGUgYmFsYW5jZSBtb2R1bGUKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfV0hJVEVfQkFMQU5DRV9DRkcJMHgwMDBCCi0jZGVmaW5lCVZGRV9DTURfV0hJVEVfQkFMQU5DRV9DRkdfTEVOCVwKLQlzaXplb2YodmZlX2NtZF93aGl0ZV9iYWxhbmNlX2NmZykKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAljbWRfaWQ7Ci0JdW5zaWduZWQgaW50CXdoaXRlX2JhbGFuY2VfZ2FpbnM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9jbWRfd2hpdGVfYmFsYW5jZV9jZmc7Ci0KLQotLyoKLSAqIENvbW1hbmQgdG8gcHJvZ3JhbSB0aGUgY29sb3IgcHJvY2Vzc2luZyBtb2R1bGUKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfQ09MT1JfUFJPQ0VTU19DRkcJMHgwMDBDCi0jZGVmaW5lCVZGRV9DTURfQ09MT1JfUFJPQ0VTU19DRkdfTEVOCVwKLQlzaXplb2YodmZlX2NtZF9jb2xvcl9wcm9jZXNzX2NmZykKLQotI2RlZmluZQlWRkVfQ01EX0NPTE9SX0NPUlJFX1BBUlQ3X1E3X0ZBQ1RPUlMJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfQ09MT1JfQ09SUkVfUEFSVDdfUThfRkFDVE9SUwkweDAwMDEKLSNkZWZpbmUJVkZFX0NNRF9DT0xPUl9DT1JSRV9QQVJUN19ROV9GQUNUT1JTCTB4MDAwMgotI2RlZmluZQlWRkVfQ01EX0NPTE9SX0NPUlJFX1BBUlQ3X1ExMF9GQUNUT1JTCTB4MDAwMwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50CWNtZF9pZDsKLQl1bnNpZ25lZCBpbnQJY29sb3JfY29ycmVjdGlvbl9wYXJ0MTsKLQl1bnNpZ25lZCBpbnQJY29sb3JfY29ycmVjdGlvbl9wYXJ0MjsKLQl1bnNpZ25lZCBpbnQJY29sb3JfY29ycmVjdGlvbl9wYXJ0MzsKLQl1bnNpZ25lZCBpbnQJY29sb3JfY29ycmVjdGlvbl9wYXJ0NDsKLQl1bnNpZ25lZCBpbnQJY29sb3JfY29ycmVjdGlvbl9wYXJ0NTsKLQl1bnNpZ25lZCBpbnQJY29sb3JfY29ycmVjdGlvbl9wYXJ0NjsKLQl1bnNpZ25lZCBpbnQJY29sb3JfY29ycmVjdGlvbl9wYXJ0NzsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2VuaGFuY2VfcGFydDE7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9lbmhhbmNlX3BhcnQyOwotCXVuc2lnbmVkIGludAljaHJvbWFfZW5oYW5jZV9wYXJ0MzsKLQl1bnNpZ25lZCBpbnQJY2hyb21hX2VuaGFuY2VfcGFydDQ7Ci0JdW5zaWduZWQgaW50CWNocm9tYV9lbmhhbmNlX3BhcnQ1OwotCXVuc2lnbmVkIGludAlsdW1hX2NhbGNfcGFydDE7Ci0JdW5zaWduZWQgaW50CWx1bWFfY2FsY19wYXJ0MjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX2NtZF9jb2xvcl9wcm9jZXNzX2NmZzsKLQotCi0vKgotICogQ29tbWFuZCB0byBwcm9ncmFtIGFkYXB0aXZlIGZpbHRlciBtb2R1bGUKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfQURQX0ZJTFRFUl9DRkcJCTB4MDAwRAotI2RlZmluZQlWRkVfQ01EX0FEUF9GSUxURVJfQ0ZHX0xFTglcCi0Jc2l6ZW9mKHZmZV9jbWRfYWRwX2ZpbHRlcl9jZmcpCi0KLSNkZWZpbmUJVkZFX0NNRF9BU0ZfQ0ZHX1BBUlRfU01PT1RIX0ZJTFRFUl9ESVMJCTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX0FTRl9DRkdfUEFSVF9TTU9PVEhfRklMVEVSX0VOQQkJMHgwMDAxCi0jZGVmaW5lCVZGRV9DTURfQVNGX0NGR19QQVJUX05PX1NIQVJQX01PREUJCTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX0FTRl9DRkdfUEFSVF9TSU5HTEVfRklMVEVSCQkweDAwMDIKLSNkZWZpbmUJVkZFX0NNRF9BU0ZfQ0ZHX1BBUlRfRFVBTF9GSUxURVIJCTB4MDAwNAotI2RlZmluZQlWRkVfQ01EX0FTRl9DRkdfUEFSVF9TSEFSUF9NT0RFCQkJMHgwMDA3Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAlhc2ZfY2ZnX3BhcnRbN107Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9jbWRfYWRwX2ZpbHRlcl9jZmc7Ci0KLQotLyoKLSAqIENvbW1hbmQgdG8gcHJvZ3JhbSBmb3IgZnJhbWUgc2tpcCBwYXR0ZXJuIGZvciBvcDEgYW5kIG9wMgotICovCi0KLSNkZWZpbmUJVkZFX0NNRF9GUkFNRV9TS0lQX0NGRwkJMHgwMDBFCi0jZGVmaW5lCVZGRV9DTURfRlJBTUVfU0tJUF9DRkdfTEVOCVwKLQlzaXplb2YodmZlX2NtZF9mcmFtZV9za2lwX2NmZykKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAljbWRfaWQ7Ci0JdW5zaWduZWQgaW50CWZyYW1lX3NraXBfcGF0dGVybl9vcDE7Ci0JdW5zaWduZWQgaW50CWZyYW1lX3NraXBfcGF0dGVybl9vcDI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9jbWRfZnJhbWVfc2tpcF9jZmc7Ci0KLQotLyoKLSAqIENvbW1hbmQgdG8gcHJvZ3JhbSBmaWVsZC1vZi12aWV3IGNyb3AgZm9yIGRpZ2l0YWwgem9vbQotICovCi0KLSNkZWZpbmUJVkZFX0NNRF9GT1ZfQ1JPUAkweDAwMEYKLSNkZWZpbmUJVkZFX0NNRF9GT1ZfQ1JPUF9MRU4Jc2l6ZW9mKHZmZV9jbWRfZm92X2Nyb3ApCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAlmb3ZfY3JvcF9wYXJ0MTsKLQl1bnNpZ25lZCBpbnQJZm92X2Nyb3BfcGFydDI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9jbWRfZm92X2Nyb3A7IAotCi0KLQotLyoKLSAqIENvbW1hbmQgdG8gcHJvZ3JhbSBhdXRvIGZvY3VzKEFGKSBzdGF0aXN0aWNzIG1vZHVsZQotICovCi0KLSNkZWZpbmUJVkZFX0NNRF9TVEFUU19BVVRPRk9DVVNfQ0ZHCTB4MDAxMAotI2RlZmluZQlWRkVfQ01EX1NUQVRTX0FVVE9GT0NVU19DRkdfTEVOCVwKLQlzaXplb2YodmZlX2NtZF9zdGF0c19hdXRvZm9jdXNfY2ZnKQotCi0jZGVmaW5lCVZGRV9DTURfQUZfU1RBVFNfU0VMX1NUQVRTX0RJUwkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9BRl9TVEFUU19TRUxfU1RBVFNfRU5BCTB4MDAwMQotI2RlZmluZQlWRkVfQ01EX0FGX1NUQVRTX1NFTF9QUklfRklYRUQJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfQUZfU1RBVFNfU0VMX1BSSV9WQVIJMHgwMDAyCi0jZGVmaW5lCVZGRV9DTURfQUZfU1RBVFNfQ0ZHX1BBUlRfTUVUUklDX1NVTQkweDAwMDAwMDAwCi0jZGVmaW5lCVZGRV9DTURfQUZfU1RBVFNfQ0ZHX1BBUlRfTUVUUklDX01BWAkweDAwMjAwMDAwCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAlhZl9zdGF0c19zZWw7Ci0JdW5zaWduZWQgaW50CWFmX3N0YXRzX2NmZ19wYXJ0WzhdOwotCXVuc2lnbmVkIGludAlhZl9zdGF0c19vcF9idWZfaGRyOwotCXVuc2lnbmVkIGludAlhZl9zdGF0c19vcF9idWZbM107Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9jbWRfc3RhdHNfYXV0b2ZvY3VzX2NmZzsKLQotCi0vKgotICogQ29tbWFuZCB0byBwcm9ncmFtIFdoaXRlIGJhbGFuY2Uod2IpIGFuZCBleHBvc3VyZSAoZXhwKQotICogc3RhdGlzdGljcyBtb2R1bGUKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfU1RBVFNfV0JfRVhQX0NGRwkweDAwMTEKLSNkZWZpbmUJVkZFX0NNRF9TVEFUU19XQl9FWFBfQ0ZHX0xFTglcCi0Jc2l6ZW9mKHZmZV9jbWRfc3RhdHNfd2JfZXhwX2NmZykKLQotI2RlZmluZQlWRkVfQ01EX1dCX0VYUF9TVEFUU19TRUxfU1RBVFNfRElTCTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX1dCX0VYUF9TVEFUU19TRUxfU1RBVFNfRU5BCTB4MDAwMQotI2RlZmluZQlWRkVfQ01EX1dCX0VYUF9TVEFUU19TRUxfUFJJX0ZJWEVECTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX1dCX0VYUF9TVEFUU19TRUxfUFJJX1ZBUgkweDAwMDIKLQotI2RlZmluZQlWRkVfQ01EX1dCX0VYUF9TVEFUU19DRkdfUEFSVDFfRVhQX1JFR184XzgJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfV0JfRVhQX1NUQVRTX0NGR19QQVJUMV9FWFBfUkVHXzE2XzE2CTB4MDAwMQotI2RlZmluZQlWRkVfQ01EX1dCX0VYUF9TVEFUU19DRkdfUEFSVDFfRVhQX1NSRUdfOF84CTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX1dCX0VYUF9TVEFUU19DRkdfUEFSVDFfRVhQX1NSRUdfNF80CTB4MDAwMgotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50CWNtZF9pZDsKLQl1bnNpZ25lZCBpbnQJd2JfZXhwX3N0YXRzX3NlbDsKLQl1bnNpZ25lZCBpbnQJd2JfZXhwX3N0YXRzX2NmZ19wYXJ0MTsKLQl1bnNpZ25lZCBpbnQJd2JfZXhwX3N0YXRzX2NmZ19wYXJ0MjsKLQl1bnNpZ25lZCBpbnQJd2JfZXhwX3N0YXRzX2NmZ19wYXJ0MzsKLQl1bnNpZ25lZCBpbnQJd2JfZXhwX3N0YXRzX2NmZ19wYXJ0NDsKLQl1bnNpZ25lZCBpbnQJd2JfZXhwX3N0YXRzX29wX2J1Zl9oZHI7Ci0JdW5zaWduZWQgaW50CXdiX2V4cF9zdGF0c19vcF9idWZbM107Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9jbWRfc3RhdHNfd2JfZXhwX2NmZzsKLQotCi0vKgotICogQ29tbWFuZCB0byBwcm9ncmFtIGhpc3RvZ3JhbShoZykgc3RhdHMgbW9kdWxlCi0gKi8KLQotI2RlZmluZQlWRkVfQ01EX1NUQVRTX0hHX0NGRwkJMHgwMDEyCi0jZGVmaW5lCVZGRV9DTURfU1RBVFNfSEdfQ0ZHX0xFTglcCi0Jc2l6ZW9mKHZmZV9jbWRfc3RhdHNfaGdfY2ZnKQotCi0jZGVmaW5lCVZGRV9DTURfSEdfU1RBVFNfU0VMX1BSSV9GSVhFRAkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9IR19TVEFUU19TRUxfUFJJX1ZBUgkweDAwMDIKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAljbWRfaWQ7Ci0JdW5zaWduZWQgaW50CWhnX3N0YXRzX3NlbDsKLQl1bnNpZ25lZCBpbnQJaGdfc3RhdHNfY2ZnX3BhcnQxOwotCXVuc2lnbmVkIGludAloZ19zdGF0c19jZmdfcGFydDI7Ci0JdW5zaWduZWQgaW50CWhnX3N0YXRzX29wX2J1Zl9oZHI7Ci0JdW5zaWduZWQgaW50CWhnX3N0YXRzX29wX2J1ZjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX2NtZF9zdGF0c19oZ19jZmc7Ci0KLQotLyoKLSAqIENvbW1hbmQgdG8gYWNrbm93bGVkZ2UgbGFzdCBNU0dfVkZFX09QMSBtZXNzYWdlCi0gKi8KLQotI2RlZmluZQlWRkVfQ01EX09QMV9BQ0sJCTB4MDAxMwotI2RlZmluZQlWRkVfQ01EX09QMV9BQ0tfTEVOCXNpemVvZih2ZmVfY21kX29wMV9hY2spCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAlvcDFfYnVmX3lfYWRkcjsKLQl1bnNpZ25lZCBpbnQJb3AxX2J1Zl9jYmNyX2FkZHI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9jbWRfb3AxX2FjazsKLQotCi0KLS8qCi0gKiBDb21tYW5kIHRvIGFja25vd2xlZGdlIGxhc3QgTVNHX1ZGRV9PUDIgbWVzc2FnZQotICovCi0KLSNkZWZpbmUJVkZFX0NNRF9PUDJfQUNLCQkweDAwMTQKLSNkZWZpbmUJVkZFX0NNRF9PUDJfQUNLX0xFTglzaXplb2YodmZlX2NtZF9vcDJfYWNrKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50CWNtZF9pZDsKLQl1bnNpZ25lZCBpbnQJb3AyX2J1Zl95X2FkZHI7Ci0JdW5zaWduZWQgaW50CW9wMl9idWZfY2Jjcl9hZGRyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2ZmVfY21kX29wMl9hY2s7Ci0KLQotCi0vKgotICogQ29tbWFuZCB0byBhY2tub3dsZWRnZSBNU0dfVkZFX1NUQVRTX0FVVE9GT0NVUyBtc2cKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfU1RBVFNfQUZfQUNLCQkweDAwMTUKLSNkZWZpbmUJVkZFX0NNRF9TVEFUU19BRl9BQ0tfTEVOCXNpemVvZih2ZmVfY21kX3N0YXRzX2FmX2FjaykKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50CWNtZF9pZDsKLQl1bnNpZ25lZCBpbnQJYWZfc3RhdHNfb3BfYnVmOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2ZmVfY21kX3N0YXRzX2FmX2FjazsKLQotCi0vKgotICogQ29tbWFuZCB0byBhY2tub3dsZWRnZSBNU0dfVkZFX1NUQVRTX1dCX0VYUCBtc2cKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfU1RBVFNfV0JfRVhQX0FDSwkweDAwMTYKLSNkZWZpbmUJVkZFX0NNRF9TVEFUU19XQl9FWFBfQUNLX0xFTglzaXplb2YodmZlX2NtZF9zdGF0c193Yl9leHBfYWNrKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50CWNtZF9pZDsKLQl1bnNpZ25lZCBpbnQJd2JfZXhwX3N0YXRzX29wX2J1ZjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX2NtZF9zdGF0c193Yl9leHBfYWNrOwotCi0KLS8qCi0gKiBDb21tYW5kIHRvIGFja25vd2xlZGdlIE1TR19WRkVfRVBPQ0gxIG1lc3NhZ2UKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfRVBPQ0gxX0FDSwkweDAwMTcKLSNkZWZpbmUJVkZFX0NNRF9FUE9DSDFfQUNLX0xFTglzaXplb2YodmZlX2NtZF9lcG9jaDFfYWNrKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQgY21kX2lkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2ZmVfY21kX2Vwb2NoMV9hY2s7Ci0KLQotLyoKLSAqIENvbW1hbmQgdG8gYWNrbm93bGVkZ2UgTVNHX1ZGRV9FUE9DSDIgbWVzc2FnZQotICovCi0KLSNkZWZpbmUJVkZFX0NNRF9FUE9DSDJfQUNLCTB4MDAxOAotI2RlZmluZQlWRkVfQ01EX0VQT0NIMl9BQ0tfTEVOCXNpemVvZih2ZmVfY21kX2Vwb2NoMl9hY2spCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydCBjbWRfaWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9jbWRfZXBvY2gyX2FjazsKLQotCi0KLS8qCi0gKiBDb21tYW5kIHRvIGNvbmZpZ3VyZSwgZW5hYmxlIG9yIGRpc2FibGUgc3luY2hyb25vdXMgdGltZXIxCi0gKi8KLQotI2RlZmluZQlWRkVfQ01EX1NZTkNfVElNRVIxX0NGRwkJMHgwMDE5Ci0jZGVmaW5lCVZGRV9DTURfU1lOQ19USU1FUjFfQ0ZHX0xFTglcCi0Jc2l6ZW9mKHZmZV9jbWRfc3luY190aW1lcjFfY2ZnKQotCi0jZGVmaW5lCVZGRV9DTURfU1lOQ19UMV9DRkdfUEFSVDFfVElNRVJfRElTCTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX1NZTkNfVDFfQ0ZHX1BBUlQxX1RJTUVSX0VOQQkweDAwMDEKLSNkZWZpbmUJVkZFX0NNRF9TWU5DX1QxX0NGR19QQVJUMV9QT0xfSElHSAkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9TWU5DX1QxX0NGR19QQVJUMV9QT0xfTE9XCTB4MDAwMgotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50CWNtZF9pZDsKLQl1bnNpZ25lZCBpbnQJc3luY190MV9jZmdfcGFydDE7Ci0JdW5zaWduZWQgaW50CXN5bmNfdDFfaF9zeW5jX2NvdW50ZG93bjsKLQl1bnNpZ25lZCBpbnQJc3luY190MV9wY2xrX2NvdW50ZG93bjsKLQl1bnNpZ25lZCBpbnQJc3luY190MV9kdXJhdGlvbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX2NtZF9zeW5jX3RpbWVyMV9jZmc7Ci0KLQotLyoKLSAqIENvbW1hbmQgdG8gY29uZmlndXJlLCBlbmFibGUgb3IgZGlzYWJsZSBzeW5jaHJvbm91cyB0aW1lcjEKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfU1lOQ19USU1FUjJfQ0ZHCQkweDAwMUEKLSNkZWZpbmUJVkZFX0NNRF9TWU5DX1RJTUVSMl9DRkdfTEVOCVwKLQlzaXplb2YodmZlX2NtZF9zeW5jX3RpbWVyMl9jZmcpCi0KLSNkZWZpbmUJVkZFX0NNRF9TWU5DX1QyX0NGR19QQVJUMV9USU1FUl9ESVMJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfU1lOQ19UMl9DRkdfUEFSVDFfVElNRVJfRU5BCTB4MDAwMQotI2RlZmluZQlWRkVfQ01EX1NZTkNfVDJfQ0ZHX1BBUlQxX1BPTF9ISUdICTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX1NZTkNfVDJfQ0ZHX1BBUlQxX1BPTF9MT1cJMHgwMDAyCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAlzeW5jX3QyX2NmZ19wYXJ0MTsKLQl1bnNpZ25lZCBpbnQJc3luY190Ml9oX3N5bmNfY291bnRkb3duOwotCXVuc2lnbmVkIGludAlzeW5jX3QyX3BjbGtfY291bnRkb3duOwotCXVuc2lnbmVkIGludAlzeW5jX3QyX2R1cmF0aW9uOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2ZmVfY21kX3N5bmNfdGltZXIyX2NmZzsKLQotCi0vKgotICogQ29tbWFuZCB0byBjb25maWd1cmUgYW5kIHN0YXJ0IGFzeW5jaHJvbm91cyB0aW1lcjEKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfQVNZTkNfVElNRVIxX1NUQVJUCTB4MDAxQgotI2RlZmluZQlWRkVfQ01EX0FTWU5DX1RJTUVSMV9TVEFSVF9MRU4JXAotCXNpemVvZih2ZmVfY21kX2FzeW5jX3RpbWVyMV9zdGFydCkKLQotI2RlZmluZQlWRkVfQ01EX0FTWU5DX1QxX1BPTEFSSVRZX0FfSElHSAkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9BU1lOQ19UMV9QT0xBUklUWV9BX0xPVwkJMHgwMDAxCi0jZGVmaW5lCVZGRV9DTURfQVNZTkNfVDFfUE9MQVJJVFlfQl9ISUdICTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX0FTWU5DX1QxX1BPTEFSSVRZX0JfTE9XCQkweDAwMDIKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAljbWRfaWQ7Ci0JdW5zaWduZWQgaW50CWFzeW5jX3QxYV9jZmc7Ci0JdW5zaWduZWQgaW50CWFzeW5jX3QxYl9jZmc7Ci0JdW5zaWduZWQgaW50CWFzeW5jX3QxX3BvbGFyaXR5OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2ZmVfY21kX2FzeW5jX3RpbWVyMV9zdGFydDsKLQotCi0vKgotICogQ29tbWFuZCB0byBjb25maWd1cmUgYW5kIHN0YXJ0IGFzeW5jaHJvbm91cyB0aW1lcjIKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfQVNZTkNfVElNRVIyX1NUQVJUCTB4MDAxQwotI2RlZmluZQlWRkVfQ01EX0FTWU5DX1RJTUVSMl9TVEFSVF9MRU4JXAotCXNpemVvZih2ZmVfY21kX2FzeW5jX3RpbWVyMl9zdGFydCkKLQotI2RlZmluZQlWRkVfQ01EX0FTWU5DX1QyX1BPTEFSSVRZX0FfSElHSAkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9BU1lOQ19UMl9QT0xBUklUWV9BX0xPVwkJMHgwMDAxCi0jZGVmaW5lCVZGRV9DTURfQVNZTkNfVDJfUE9MQVJJVFlfQl9ISUdICTB4MDAwMAotI2RlZmluZQlWRkVfQ01EX0FTWU5DX1QyX1BPTEFSSVRZX0JfTE9XCQkweDAwMDIKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAljbWRfaWQ7Ci0JdW5zaWduZWQgaW50CWFzeW5jX3QyYV9jZmc7Ci0JdW5zaWduZWQgaW50CWFzeW5jX3QyYl9jZmc7Ci0JdW5zaWduZWQgaW50CWFzeW5jX3QyX3BvbGFyaXR5OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2ZmVfY21kX2FzeW5jX3RpbWVyMl9zdGFydDsKLQotCi0vKgotICogQ29tbWFuZCB0byBwcm9ncmFtIHBhcnRpYWwgY29uZmlndXJhdGlvbnMgb2YgYXV0byBmb2N1cyhhZikKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfU1RBVFNfQUZfVVBEQVRFCQkweDAwMUQKLSNkZWZpbmUJVkZFX0NNRF9TVEFUU19BRl9VUERBVEVfTEVOCVwKLQlzaXplb2YodmZlX2NtZF9zdGF0c19hZl91cGRhdGUpCi0KLSNkZWZpbmUJVkZFX0NNRF9BRl9VUERBVEVfUEFSVDFfV0lORE9XX09ORQkweDAwMDAwMDAwCi0jZGVmaW5lCVZGRV9DTURfQUZfVVBEQVRFX1BBUlQxX1dJTkRPV19NVUxUSQkweDgwMDAwMDAwCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAlhZl91cGRhdGVfcGFydDE7Ci0JdW5zaWduZWQgaW50CWFmX3VwZGF0ZV9wYXJ0MjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX2NtZF9zdGF0c19hZl91cGRhdGU7Ci0KLQotLyoKLSAqIENvbW1hbmQgdG8gcHJvZ3JhbSBwYXJ0aWFsIGNmZyBvZiB3YiBhbmQgZXhwCi0gKi8KLQotI2RlZmluZQlWRkVfQ01EX1NUQVRTX1dCX0VYUF9VUERBVEUJMHgwMDFFCi0jZGVmaW5lCVZGRV9DTURfU1RBVFNfV0JfRVhQX1VQREFURV9MRU4JXAotCXNpemVvZih2ZmVfY21kX3N0YXRzX3diX2V4cF91cGRhdGUpCi0KLSNkZWZpbmUJVkZFX0NNRF9XQl9FWFBfVVBEQVRFX1BBUlQxX1JFR0lPTlNfOF84CQkweDAwMDAKLSNkZWZpbmUJVkZFX0NNRF9XQl9FWFBfVVBEQVRFX1BBUlQxX1JFR0lPTlNfMTZfMTYJMHgwMDAxCi0jZGVmaW5lCVZGRV9DTURfV0JfRVhQX1VQREFURV9QQVJUMV9TUkVHSU9OU184XzgJMHgwMDAwCi0jZGVmaW5lCVZGRV9DTURfV0JfRVhQX1VQREFURV9QQVJUMV9TUkVHSU9OU180XzQJMHgwMDAyCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAl3Yl9leHBfdXBkYXRlX3BhcnQxOwotCXVuc2lnbmVkIGludAl3Yl9leHBfdXBkYXRlX3BhcnQyOwotCXVuc2lnbmVkIGludAl3Yl9leHBfdXBkYXRlX3BhcnQzOwotCXVuc2lnbmVkIGludAl3Yl9leHBfdXBkYXRlX3BhcnQ0OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2ZmVfY21kX3N0YXRzX3diX2V4cF91cGRhdGU7Ci0KLQotCi0vKgotICogQ29tbWFuZCB0byByZSBwcm9ncmFtIHRoZSBDQU1JRiBGUkFNRSBDT05GSUcgc2V0dGluZ3MKLSAqLwotCi0jZGVmaW5lCVZGRV9DTURfVVBEQVRFX0NBTUlGX0ZSQU1FX0NGRwkJMHgwMDFGCi0jZGVmaW5lCVZGRV9DTURfVVBEQVRFX0NBTUlGX0ZSQU1FX0NGR19MRU4JXAotCXNpemVvZih2ZmVfY21kX3VwZGF0ZV9jYW1pZl9mcmFtZV9jZmcpCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJY21kX2lkOwotCXVuc2lnbmVkIGludAljYW1pZl9mcmFtZV9jZmc7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9jbWRfdXBkYXRlX2NhbWlmX2ZyYW1lX2NmZzsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9xZHNwNXZmZW1zZy5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1dmZlbXNnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkN2Y3MzEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1L3Fkc3A1dmZlbXNnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotI2lmbmRlZiBRRFNQNVZGRU1TR0lfSAotI2RlZmluZSBRRFNQNVZGRU1TR0lfSAotCi0vKj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09KgotCi0gICAgViBGIEUgICBJIE4gVCBFIFIgTiBBIEwgICBNIEUgUyBTIEEgRyBFIFMKLQotR0VORVJBTCBERVNDUklQVElPTgotICBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW50aW9ucyBvZiBmb3JtYXQgYmxvY2tzIG9mIGNvbW1hbmRzIAotICB0aGF0IGFyZSBzZW50IGJ5IFZGRSBUYXNrCi0KLVJFRkVSRU5DRVMKLSAgTm9uZQotCi1FWFRFUk5BTElaRUQgRlVOQ1RJT05TCi0gIE5vbmUKLQotQ29weXJpZ2h0IChjKSAxOTkyLTIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAKLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCi0KLVRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGlzIGZpbGUuCi1Ob3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgotICAgCi0kSGVhZGVyOiAvL3NvdXJjZS9xY29tL3FjdC9tdWx0aW1lZGlhMi9BZHNwU3ZjLzdYWFgvcWRzcDVjbWQvdmlkZW8vcWRzcDV2ZmVtc2cuaCMyICQgJERhdGVUaW1lOiAyMDA4LzA3LzMwIDEwOjUwOjIzICQgJEF1dGhvcjogcGF2YW5yICQgICAgICAgICAgICAgICAgICAgICAKLVJldmlzaW9uIEhpc3Rvcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAKLXdoZW4gICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5Ci0tLS0tLS0tLSAgIC0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotMDYvMTIvMDggICBzdiAgICAgIGluaXRpYWwgdmVyc2lvbgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotCi0vKgotICogTWVzc2FnZSB0byBhY2tub3dsZWRnZSBDTURfVkZFX1JFU1QgY29tbWFuZAotICovCi0KLSNkZWZpbmUJVkZFX01TR19SRVNFVF9BQ0sJMHgwMDAwCi0jZGVmaW5lCVZGRV9NU0dfUkVTRVRfQUNLX0xFTglzaXplb2YodmZlX21zZ19yZXNldF9hY2spCi0KLXR5cGVkZWYgc3RydWN0IHsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX21zZ19yZXNldF9hY2s7Ci0KLQotLyoKLSAqIE1lc3NhZ2UgdG8gYWNrbm93bGVkZ2UgQ01EX1ZGRV9TVEFSVCBjb21tYW5kCi0gKi8KLQotI2RlZmluZQlWRkVfTVNHX1NUQVJUX0FDSwkweDAwMDEKLSNkZWZpbmUJVkZFX01TR19TVEFSVF9BQ0tfTEVOCXNpemVvZih2ZmVfbXNnX3N0YXJ0X2FjaykKLQotdHlwZWRlZiBzdHJ1Y3QgewotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2ZmVfbXNnX3N0YXJ0X2FjazsKLQotLyoKLSAqIE1lc3NhZ2UgdG8gYWNrbm93bGVkZ2UgQ01EX1ZGRV9TVE9QCWNvbW1hbmQKLSAqLwotCi0jZGVmaW5lCVZGRV9NU0dfU1RPUF9BQ0sJMHgwMDAyCi0jZGVmaW5lCVZGRV9NU0dfU1RPUF9BQ0tfTEVOCXNpemVvZih2ZmVfbXNnX3N0b3BfYWNrKQotCi10eXBlZGVmIHN0cnVjdCB7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9tc2dfc3RvcF9hY2s7Ci0KLQotLyoKLSAqIE1lc3NhZ2UgdG8gYWNrbm93bGVkZ2UgQ01EX1ZGRV9VUERBVEUgY29tbWFuZAotICovCi0KLSNkZWZpbmUJVkZFX01TR19VUERBVEVfQUNLCTB4MDAwMwotI2RlZmluZQlWRkVfTVNHX1VQREFURV9BQ0tfTEVOCXNpemVvZih2ZmVfbXNnX3VwZGF0ZV9hY2spCi0KLXR5cGVkZWYgc3RydWN0IHsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX21zZ191cGRhdGVfYWNrOwotCi0KLS8qCi0gKiBNZXNzYWdlIHRvIG5vdGlmeSB0aGUgQVJNIHRoYXQgc25hcHNob3QgcHJvY2Vzc2luZyBpcyBjb21wbGV0ZQotICogYW5kIHRoYXQgdGhlIFZGRSBpcyBub3cgU1RBVEVfVkZFX0lETEUKLSAqLwotCi0jZGVmaW5lCVZGRV9NU0dfU05BUFNIT1RfRE9ORQkJMHgwMDA0Ci0jZGVmaW5lCVZGRV9NU0dfU05BUFNIT1RfRE9ORV9MRU4JXAotCXNpemVvZih2ZmVfbXNnX3NuYXBzaG90X2RvbmUpCi0KLXR5cGVkZWYgc3RydWN0IHsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX21zZ19zbmFwc2hvdF9kb25lOwotCi0KLQotLyoKLSAqIE1lc3NhZ2UgdG8gbm90aWZ5IEFSTSB0aGF0IGlsbGVnYWwgY21kIHdhcyByZWNlaXZlZCBhbmQgCi0gKiBzeXN0ZW0gaXMgaW4gdGhlIElETEUgc3RhdGUKLSAqLwotCi0jZGVmaW5lCVZGRV9NU0dfSUxMRUdBTF9DTUQJMHgwMDA1Ci0jZGVmaW5lCVZGRV9NU0dfSUxMRUdBTF9DTURfTEVOCVwKLQlzaXplb2YodmZlX21zZ19pbGxlZ2FsX2NtZCkKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAlzdGF0dXM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9tc2dfaWxsZWdhbF9jbWQ7Ci0KLQotLyoKLSAqIE1lc3NhZ2UgdG8gbm90aWZ5IEFSTSB0aGF0IG9wMSBidWYgaXMgZnVsbCBhbmQgcmVhZHkKLSAqLwotCi0jZGVmaW5lCVZGRV9NU0dfT1AxCQkweDAwMDYKLSNkZWZpbmUJVkZFX01TR19PUDFfTEVOCQlzaXplb2YodmZlX21zZ19vcDEpCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJb3AxX2J1Zl95X2FkZHI7Ci0JdW5zaWduZWQgaW50CW9wMV9idWZfY2Jjcl9hZGRyOwotCXVuc2lnbmVkIGludAlibGFja19sZXZlbF9ldmVuX2NvbDsKLQl1bnNpZ25lZCBpbnQJYmxhY2tfbGV2ZWxfb2RkX2NvbDsKLQl1bnNpZ25lZCBpbnQJZGVmZWN0X3BpeGVsc19kZXRlY3RlZDsKLQl1bnNpZ25lZCBpbnQJYXNmX21heF9lZGdlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2ZmVfbXNnX29wMTsgCi0KLQotLyoKLSAqIE1lc3NhZ2UgdG8gbm90aWZ5IEFSTSB0aGF0IG9wMiBidWYgaXMgZnVsbCBhbmQgcmVhZHkKLSAqLwotCi0jZGVmaW5lCVZGRV9NU0dfT1AyCQkweDAwMDcKLSNkZWZpbmUJVkZFX01TR19PUDJfTEVOCQlzaXplb2YodmZlX21zZ19vcDIpCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQJb3AyX2J1Zl95X2FkZHI7Ci0JdW5zaWduZWQgaW50CW9wMl9idWZfY2Jjcl9hZGRyOwotCXVuc2lnbmVkIGludAlibGFja19sZXZlbF9ldmVuX2NvbDsKLQl1bnNpZ25lZCBpbnQJYmxhY2tfbGV2ZWxfb2RkX2NvbDsKLQl1bnNpZ25lZCBpbnQJZGVmZWN0X3BpeGVsc19kZXRlY3RlZDsKLQl1bnNpZ25lZCBpbnQJYXNmX21heF9lZGdlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2ZmVfbXNnX29wMjsgCi0KLQotLyoKLSAqIE1lc3NhZ2UgdG8gbm90aWZ5IEFSTSB0aGF0IGF1dG9mb2N1cyhhZikgc3RhdHMgYXJlIHJlYWR5Ci0gKi8KLQotI2RlZmluZQlWRkVfTVNHX1NUQVRTX0FGCTB4MDAwOAotI2RlZmluZQlWRkVfTVNHX1NUQVRTX0FGX0xFTglzaXplb2YodmZlX21zZ19zdGF0c19hZikKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludAlhZl9zdGF0c19vcF9idWZmZXI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9tc2dfc3RhdHNfYWY7Ci0KLQotLyoKLSAqIE1lc3NhZ2UgdG8gbm90aWZ5IEFSTSB0aGF0IHdoaXRlIGJhbGFuY2Uod2IpIGFuZCBleHBvc3VyZSAoZXhwKQotICogc3RhdHMgYXJlIHJlYWR5Ci0gKi8KLQotI2RlZmluZQlWRkVfTVNHX1NUQVRTX1dCX0VYUAkJMHgwMDA5Ci0jZGVmaW5lCVZGRV9NU0dfU1RBVFNfV0JfRVhQX0xFTglcCi0Jc2l6ZW9mKHZmZV9tc2dfc3RhdHNfd2JfZXhwKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50CXdiX2V4cF9zdGF0c19vcF9idWY7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9tc2dfc3RhdHNfd2JfZXhwOwotCi0KLS8qCi0gKiBNZXNzYWdlIHRvIG5vdGlmeSB0aGUgQVJNIHRoYXQgaGlzdG9ncmFtKGhnKSBzdGF0cyBhcmUgcmVhZHkKLSAqLwotCi0jZGVmaW5lCVZGRV9NU0dfU1RBVFNfSEcJMHgwMDBBCi0jZGVmaW5lCVZGRV9NU0dfU1RBVFNfSEdfTEVOCXNpemVvZih2ZmVfbXNnX3N0YXRzX2hnKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50CWhnX3N0YXRzX29wX2J1ZjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX21zZ19zdGF0c19oZzsKLQotCi0vKgotICogTWVzc2FnZSB0byBub3RpZnkgdGhlIEFSTSB0aGF0IGVwb2NoMSBldmVudCBvY2N1cnJlZCBpbiB0aGUgQ0FNSUYKLSAqLwotCi0jZGVmaW5lCVZGRV9NU0dfRVBPQ0gxCQkweDAwMEIKLSNkZWZpbmUJVkZFX01TR19FUE9DSDFfTEVOCXNpemVvZih2ZmVfbXNnX2Vwb2NoMSkKLQotdHlwZWRlZiBzdHJ1Y3QgewotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2ZmVfbXNnX2Vwb2NoMTsKLQotCi0vKgotICogTWVzc2FnZSB0byBub3RpZnkgdGhlIEFSTSB0aGF0IGVwb2NoMiBldmVudCBvY2N1cnJlZCBpbiB0aGUgQ0FNSUYKLSAqLwotCi0jZGVmaW5lCVZGRV9NU0dfRVBPQ0gyCQkweDAwMEMKLSNkZWZpbmUJVkZFX01TR19FUE9DSDJfTEVOCXNpemVvZih2ZmVfbXNnX2Vwb2NoMikKLQotdHlwZWRlZiBzdHJ1Y3QgewotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB2ZmVfbXNnX2Vwb2NoMjsKLQotCi0vKgotICogTWVzc2FnZSB0byBub3RpZnkgdGhlIEFSTSB0aGF0IHN5bmMgdGltZXIxIG9wIGlzIGNvbXBsZXRlZAotICovCi0KLSNkZWZpbmUJVkZFX01TR19TWU5DX1QxX0RPTkUJCTB4MDAwRAotI2RlZmluZQlWRkVfTVNHX1NZTkNfVDFfRE9ORV9MRU4Jc2l6ZW9mKHZmZV9tc2dfc3luY190MV9kb25lKQotCi10eXBlZGVmIHN0cnVjdCB7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9tc2dfc3luY190MV9kb25lOwotCi0KLS8qCi0gKiBNZXNzYWdlIHRvIG5vdGlmeSB0aGUgQVJNIHRoYXQgc3luYyB0aW1lcjIgb3AgaXMgY29tcGxldGVkCi0gKi8KLQotI2RlZmluZQlWRkVfTVNHX1NZTkNfVDJfRE9ORQkJMHgwMDBFCi0jZGVmaW5lCVZGRV9NU0dfU1lOQ19UMl9ET05FX0xFTglzaXplb2YodmZlX21zZ19zeW5jX3QyX2RvbmUpCi0KLXR5cGVkZWYgc3RydWN0IHsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX21zZ19zeW5jX3QyX2RvbmU7Ci0KLQotLyoKLSAqIE1lc3NhZ2UgdG8gbm90aWZ5IHRoZSBBUk0gdGhhdCBhc3luYyB0MSBvcGVyYXRpb24gY29tcGxldGVkCi0gKi8KLQotI2RlZmluZQlWRkVfTVNHX0FTWU5DX1QxX0RPTkUJCTB4MDAwRgotI2RlZmluZQlWRkVfTVNHX0FTWU5DX1QxX0RPTkVfTEVOCXNpemVvZih2ZmVfbXNnX2FzeW5jX3QxX2RvbmUpCi0KLXR5cGVkZWYgc3RydWN0IHsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX21zZ19hc3luY190MV9kb25lOwotCi0KLQotLyoKLSAqIE1lc3NhZ2UgdG8gbm90aWZ5IHRoZSBBUk0gdGhhdCBhc3luYyB0MiBvcGVyYXRpb24gY29tcGxldGVkCi0gKi8KLQotI2RlZmluZQlWRkVfTVNHX0FTWU5DX1QyX0RPTkUJCTB4MDAxMAotI2RlZmluZQlWRkVfTVNHX0FTWU5DX1QyX0RPTkVfTEVOCXNpemVvZih2ZmVfbXNnX2FzeW5jX3QyX2RvbmUpCi0KLXR5cGVkZWYgc3RydWN0IHsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdmZlX21zZ19hc3luY190Ml9kb25lOwotCi0KLQotLyoKLSAqIE1lc3NhZ2UgdG8gbm90aWZ5IHRoZSBBUk0gdGhhdCBhbiBlcnJvciBoYXMgb2NjdXJyZWQKLSAqLwotCi0jZGVmaW5lCVZGRV9NU0dfRVJST1IJCTB4MDAxMQotI2RlZmluZQlWRkVfTVNHX0VSUk9SX0xFTglzaXplb2YodmZlX21zZ19lcnJvcikKLQotI2RlZmluZQlWRkVfTVNHX0VSUl9DT05EX05PX0NBTUlGX0VSUgkJMHgwMDAwCi0jZGVmaW5lCVZGRV9NU0dfRVJSX0NPTkRfQ0FNSUZfRVJSCQkweDAwMDEKLSNkZWZpbmUJVkZFX01TR19FUlJfQ09ORF9PUDFfWV9OT19CVVNfT0YJMHgwMDAwCi0jZGVmaW5lCVZGRV9NU0dfRVJSX0NPTkRfT1AxX1lfQlVTX09GCQkweDAwMDIKLSNkZWZpbmUJVkZFX01TR19FUlJfQ09ORF9PUDFfQ0JDUl9OT19CVVNfT0YJMHgwMDAwCi0jZGVmaW5lCVZGRV9NU0dfRVJSX0NPTkRfT1AxX0NCQ1JfQlVTX09GCTB4MDAwNAotI2RlZmluZQlWRkVfTVNHX0VSUl9DT05EX09QMl9ZX05PX0JVU19PRgkweDAwMDAKLSNkZWZpbmUJVkZFX01TR19FUlJfQ09ORF9PUDJfWV9CVVNfT0YJCTB4MDAwOAotI2RlZmluZQlWRkVfTVNHX0VSUl9DT05EX09QMl9DQkNSX05PX0JVU19PRgkweDAwMDAKLSNkZWZpbmUJVkZFX01TR19FUlJfQ09ORF9PUDJfQ0JDUl9CVVNfT0YJMHgwMDEwCi0jZGVmaW5lCVZGRV9NU0dfRVJSX0NPTkRfQUZfTk9fQlVTX09GCQkweDAwMDAKLSNkZWZpbmUJVkZFX01TR19FUlJfQ09ORF9BRl9CVVNfT0YJCTB4MDAyMAotI2RlZmluZQlWRkVfTVNHX0VSUl9DT05EX1dCX0VYUF9OT19CVVNfT0YJMHgwMDAwCi0jZGVmaW5lCVZGRV9NU0dfRVJSX0NPTkRfV0JfRVhQX0JVU19PRgkJMHgwMDQwCi0jZGVmaW5lCVZGRV9NU0dfRVJSX0NPTkRfTk9fQVhJX0VSUgkJMHgwMDAwCi0jZGVmaW5lCVZGRV9NU0dfRVJSX0NPTkRfQVhJX0VSUgkJMHgwMDgwCi0KLSNkZWZpbmUJVkZFX01TR19DQU1JRl9TVFNfSURMRQkJCTB4MDAwMAotI2RlZmluZQlWRkVfTVNHX0NBTUlGX1NUU19DQVBUVVJFX0RBVEEJCTB4MDAwMQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50CWVycl9jb25kOwotCXVuc2lnbmVkIGludAljYW1pZl9zdHM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHZmZV9tc2dfZXJyb3I7Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDUvc25kX2FkaWUuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9zbmRfYWRpZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmFkM2IwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNS9zbmRfYWRpZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19TTkRfQURJRV9TVkNfSF8KLSNkZWZpbmUgX19TTkRfQURJRV9TVkNfSF8KLQotI2RlZmluZSBBRElFX1NWQ19QUk9HCTB4MzAwMDAwMDIKLSNkZWZpbmUgQURJRV9TVkNfVkVSUwkweDAwMDIwMDAzCi0KLSNkZWZpbmUgQURJRV9TVkNfQ0xJRU5UX1NUQVRVU19GVU5DX1BUUl9UWVBFX1BST0MgMHhGRkZGRkYwMQotI2RlZmluZSBTTkRfQURJRV9TVkNfQ0xJRU5UX1JFR0lTVEVSX1BST0MgCTM0Ci0jZGVmaW5lIFNORF9BRElFX1NWQ19DT05GSUdfQURJRV9CTE9DS19QUk9DIAkzNQotI2RlZmluZSBTTkRfQURJRV9TVkNfQ0xJRU5UX0RFUkVHSVNURVJfUFJPQyAJMzYKLQotI2RlZmluZSBBRElFX1NWQ19NQVhfQ0xJRU5UUyA1Ci0KLWVudW0gYWRpZV9zdmNfY2xpZW50X29wZXJhdGlvbnsKLQlBRElFX1NWQ19SRUdJU1RFUl9DTElFTlQsCi0JQURJRV9TVkNfREVSRUdJU1RFUl9DTElFTlQsCi0JQURJRV9TVkNfQ09ORklHX0FESUVfQkxPQ0ssCi19OwotCi1lbnVtIGFkaWVfc3ZjX3N0YXR1c190eXBlewotCUFESUVfU1ZDX1NUQVRVU19TVUNDRVNTLAotCUFESUVfU1ZDX1NUQVRVU19GQUlMVVJFLAotCUFESUVfU1ZDX1NUQVRVU19JTlVTRQotfTsKLQotZW51bSBhZGllX2Jsb2NrX2VudW1fdHlwZXsKLQlNSUNfQklBUywKLQlIU1NELAotCUhQSF9QQQotfTsKLQotZW51bSBhZGllX2NvbmZpZ19lbnVtX3R5cGV7Ci0JRElTQUJMRSwKLQlFTkFCTEUKLX07Ci0KLXN0cnVjdCBhZGllX3N2Y19jbGllbnR7Ci0JaW50IGNsaWVudF9pZDsKLQlpbnQgY2JfaWQ7Ci0JZW51bSBhZGllX3N2Y19zdGF0dXNfdHlwZSBzdGF0dXM7Ci0JYm9vbCBhZGllX3N2Y19jYl9kb25lOwotCXN0cnVjdCBtdXRleCBsb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdxOwotCXN0cnVjdCBtc21fcnBjX2NsaWVudCAqcnBjX2NsaWVudDsKLX07Ci0KLXN0cnVjdCBhZGllX3N2Y19jbGllbnRfcmVnaXN0ZXJfY2JfY2JfYXJncyB7Ci0JaW50IGNiX2lkOwotCXVpbnQzMl90IHNpemU7Ci0JaW50IGNsaWVudF9pZDsKLQllbnVtIGFkaWVfYmxvY2tfZW51bV90eXBlIGFkaWVfYmxvY2s7Ci0JZW51bSBhZGllX3N2Y19zdGF0dXNfdHlwZSBzdGF0dXM7Ci0JZW51bSBhZGllX3N2Y19jbGllbnRfb3BlcmF0aW9uIGNsaWVudF9vcGVyYXRpb247Ci19OwotCi1zdHJ1Y3QgYWRpZV9zdmNfY2xpZW50X3JlZ2lzdGVyX2NiX2FyZ3MgewotCWludCBjYl9pZDsKLX07Ci0KLXN0cnVjdCBhZGllX3N2Y19jbGllbnRfZGVyZWdpc3Rlcl9jYl9hcmdzIHsKLQlpbnQgY2xpZW50X2lkOwotfTsKLQotc3RydWN0IGFkaWVfc3ZjX2NvbmZpZ19hZGllX2Jsb2NrX2NiX2FyZ3MgewotCWludCBjbGllbnRfaWQ7Ci0JZW51bSBhZGllX2Jsb2NrX2VudW1fdHlwZSBhZGllX2Jsb2NrOwotCWVudW0gYWRpZV9jb25maWdfZW51bV90eXBlIGNvbmZpZzsKLX07Ci0KLWludCBhZGllX3N2Y19nZXQodm9pZCk7Ci1pbnQgYWRpZV9zdmNfcHV0KGludCBpZCk7Ci1pbnQgYWRpZV9zdmNfY29uZmlnX2FkaWVfYmxvY2soaW50IGlkLAotCWVudW0gYWRpZV9ibG9ja19lbnVtX3R5cGUgYWRpZV9ibG9ja190eXBlLCBib29sIGVuYWJsZSk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2FjZGJfY29tbWFuZHMuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2FjZGJfY29tbWFuZHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4NjMwNy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9hY2RiX2NvbW1hbmRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaWZuZGVmIF9NQUNIX1FEU1A1X1YyX0FDREJfQ09NTUFORFNfSAotI2RlZmluZSBfTUFDSF9RRFNQNV9WMl9BQ0RCX0NPTU1BTkRTX0gKLQotI2RlZmluZSBBQ0RCX1ZPSUNFX05FVFdPUktfSURfREVGQVVMVAkJMHgwMDAxMDAzNwotI2RlZmluZSBBQ0RCX0lOSVRJQUxJU0lORwkJCTAKLSNkZWZpbmUgQUNEQl9SRUFEWQkJCQkxCi0KLQotLyogNEtCICovCi0jZGVmaW5lIEFDREJfUEFHRV9TSVpFCQkJCTB4MTAwMAotCi0jZGVmaW5lIEFDREJfQ0RNQV9OQgkJMHgwMTA4YjE1MwotI2RlZmluZSBBQ0RCX0NETUFfV0IJCTB4MDEwOGIxNTQKLSNkZWZpbmUgQUNEQl9HU01fTkIJCTB4MDEwOGIxNTUKLSNkZWZpbmUgQUNEQl9HU01fV0IJCTB4MDEwOGIxNTYKLSNkZWZpbmUgQUNEQl9XQ0RNQV9OQgkJMHgwMTA4YjE1NwotI2RlZmluZSBBQ0RCX1dDRE1BX1dCCQkweDAxMDhiMTU4Ci0KLQotLyogQUNEQiBjb21tYW5kcyAqLwotCi0KLS8qIHN0cnVjdCBhY2RiX2NtZF9pbnN0YWxsX2RldmljZSAqLwotI2RlZmluZSBBQ0RCX0lOU1RBTExfREVWSUNFCQkweDAxMDhkMjQ1Ci0KLS8qIHN0cnVjdCBhY2RiX2NtZF9pbnN0YWxsX2RldmljZSAqLwotI2RlZmluZSBBQ0RCX1VOSU5TVEFMTF9ERVZJQ0UJCTB4MDEwOGQyNDYKLQotLyogc3RydWN0IGFjZGJfY21kX2RldmljZSAqLwotI2RlZmluZSBBQ0RCX0dFVF9ERVZJQ0UJCQkweDAxMDhiYjkyCi0KLS8qIHN0cnVjdCBhY2RiX2NtZF9kZXZpY2UgKi8KLSNkZWZpbmUgQUNEQl9TRVRfREVWSUNFCQkJMHgwMTA4YmI5MwotCi0vKiBzdHJ1Y3QgYWNkYl9jbWRfZ2V0X2RldmljZV90YWJsZSAqLwotI2RlZmluZSBBQ0RCX0dFVF9ERVZJQ0VfVEFCTEUJCTB4MDEwOGJiOTcKLQotLyogc3RydWN0IGFjZGJfY21kX2dldF9kZXZpY2VfY2FwYWJpbGl0aWVzICovCi0jZGVmaW5lIEFDREJfR0VUX0RFVklDRV9DQVBBQklMSVRJRVMJMHgwMTA4ZjVjYQotCi0vKiBzdHJ1Y3QgYWNkYl9jbWRfZ2V0X2RldmljZV9pbmZvICovCi0jZGVmaW5lIEFDREJfR0VUX0RFVklDRV9JTkZPCQkweDAxMDhmNWNiCi0KLS8qY29tbWFuZCB0byBpbnRpdGlhbGl6ZSBBQ0RCIGJhc2VkIG9uIGNvZGVjIHR5cGUqLwotI2RlZmluZSBBQ0RCX0NNRF9JTklUSUFMSVpFX0ZPUl9BRElFCTB4MDAwMTEyODMKLQotCi0vKiBBQ0RCIEVycm9yIGNvZGVzICovCi0KLSNkZWZpbmUgQUNEQl9SRVNfU1VDQ0VTUwkJMAotI2RlZmluZSBBQ0RCX1JFU19GQUlMVVJFCQktMQotI2RlZmluZSBBQ0RCX1JFU19CQURQQVJNCQktMgotI2RlZmluZSBBQ0RCX1JFU19CQURTVEFURQkJLTMKLQotI2RlZmluZSBUR1RWRVJTX01TTTd4MzBfQlJJTkdfVVAJMHgwMDAxMDA2NAotCi0KLQotLyogQWxnb3JpdGhtIEFzcGVjdCBJRHMgKi8KLQotI2RlZmluZSBJSURfRU5BQkxFX0ZMQUcJCQkweDAxMDhiNmI5Ci0KLQotI2RlZmluZSBJSURfRU5BQkxFX0ZMQUdfU0laRQkJCQkJMQotI2RlZmluZSBJSURfRUNIT19DQU5DRUxMRVJfVkVSU0lPTl9TSVpFCQkJCTIKLSNkZWZpbmUgSUlEX0VDSE9fQ0FOQ0VMTEVSX01PREVfU0laRQkJCQkyCi0jZGVmaW5lIElJRF9FQ0hPX0NBTkNFTExFUl9OT0lTRV9TVVBQUkVTU09SX0VOQUJMRV9TSVpFCQkxCi0jZGVmaW5lIElJRF9FQ0hPX0NBTkNFTExFUl9QQVJBTUVURVJTX1NJWkUJCQkzMgotI2RlZmluZSBJSURfRUNIT19DQU5DRUxMRVJfTkVYVEdFTl9OQl9QQVJBTUVURVJTX1NJWkUJCSgzOCAqIDIpCi0jZGVmaW5lIElJRF9FQ0hPX0NBTkNFTExFUl9ORVhUR0VOX1dCX1BBUkFNRVRFUlNfU0laRQkJKDM4ICogMikKLSNkZWZpbmUgSUlEX0ZMVUVOQ0VfUEFSQU1FVEVSU19TSVpFCQkJCTQ4NgotI2RlZmluZSBJSURfQUZFX1ZPTFVNRV9DT05UUk9MX1NJWkUJCQkJNgotI2RlZmluZSBJSURfR0FJTl9TSVpFCQkJCQkJMgotI2RlZmluZSBJSURfVk9JQ0VfRklSX0ZJTFRFUl9TSVpFCQkJCTE0Ci0jZGVmaW5lIElJRF9WT0lDRV9JSVJfRklMVEVSX1NJWkUJCQkJMTE0Ci0jZGVmaW5lIElJRF9SWF9EQk1fT0ZGU0VUX1NJWkUJCQkJCTIKLSNkZWZpbmUgSUlEX0FHQ19TSVpFCQkJCQkJMzYKLSNkZWZpbmUgSUlEX0FWQ19TSVpFCQkJCQkJODAKLQotI2RlZmluZSBJSURfQVVESU9fSUlSX0NPRUZGX1NJWkUJCQkJMTAwCi0jZGVmaW5lIElJRF9NQkFEUkNfUEFSQU1FVEVSU19TSVpFCQkJCTgKLSNkZWZpbmUgSUlEX01CQURSQ19FWFRfQlVGRl9TSVpFCQkJCTM5MgotI2RlZmluZSBJSURfTUJBRFJDX0JBTkRfQ09ORklHX1NJWkUJCQkJMTAwCi0jZGVmaW5lIElJRF9RQUZYX1BBUkFNRVRFUlNfU0laRQkJCQkyCi0jZGVmaW5lIElJRF9RQ09OQ0VSVF9QQVJBTUVURVJTX1NJWkUJCQkJMgotI2RlZmluZSBJSURfQVVESU9fQUdDX1BBUkFNRVRFUlNfU0laRQkJCQk0MgotI2RlZmluZSBJSURfTlNfUEFSQU1FVEVSU19TSVpFCQkJCQkxNAotCi0jZGVmaW5lIElJRF9FQ0hPX0NBTkNFTExFUl9WRVJTSU9OCQkJMHgwMDAxMDA0MgotI2RlZmluZSBJSURfRUNIT19DQU5DRUxMRVJfTU9ERQkJCQkweDAwMDEwMDQzCi0jZGVmaW5lIElJRF9FQ0hPX0NBTkNFTExFUl9OT0lTRV9TVVBQUkVTU09SX0VOQUJMRQkweDAwMDEwMDQ0Ci0jZGVmaW5lIElJRF9FQ0hPX0NBTkNFTExFUl9QQVJBTUVURVJTCQkJMHgwMDAxMDA0NQotI2RlZmluZSBJSURfRUNIT19DQU5DRUxMRVJfTkVYVEdFTl9OQl9QQVJBTUVURVJTCTB4MDAwMTAwNDYKLSNkZWZpbmUgSUlEX0VDSE9fQ0FOQ0VMTEVSX05FWFRHRU5fV0JfUEFSQU1FVEVSUwkweDAwMDEwMDQ3Ci0jZGVmaW5lIElJRF9GTFVFTkNFX1BBUkFNRVRFUlMJCQkJMHgwMDAxMDA0OAotI2RlZmluZSBJSURfQUZFX1ZPTFVNRV9DT05UUk9MCQkJCTB4MDAwMTAwNDkKLSNkZWZpbmUgSUlEX0dBSU4JCQkJCTB4MDAwMTAwNEEKLSNkZWZpbmUgSUlEX1ZPSUNFX0ZJUl9GSUxURVIJCQkJMHgwMDAxMDA0QgotI2RlZmluZSBJSURfVk9JQ0VfSUlSX0ZJTFRFUgkJCQkweDAwMDEwMDRDCi0jZGVmaW5lIElJRF9BR0MJCQkJCQkweDAwMDEwMDRFCi0jZGVmaW5lIElJRF9BVkMJCQkJCQkweDAwMDEwMDRGCi0jZGVmaW5lIEFCSURfU0lERVRPTkVfR0FJTgkJCQkweDAwMDEwMDUwCi0jZGVmaW5lIEFCSURfVFhfVk9JQ0VfR0FJTgkJCQkweDAwMDEwMDUxCi0jZGVmaW5lIEFCSURfVFhfRFRNRl9HQUlOCQkJCTB4MDAwMTAwNTIKLSNkZWZpbmUgQUJJRF9DT0RFQ19UWF9HQUlOCQkJCTB4MDAwMTAwNTMKLSNkZWZpbmUgQUJJRF9IU1NECQkJCQkweDAwMDEwMDU0Ci0jZGVmaW5lIEFCSURfVFhfQUdDCQkJCQkweDAwMDEwMDU1Ci0jZGVmaW5lIEFCSURfVFhfVk9JQ0VfRklSCQkJCTB4MDAwMTAwNTYKLSNkZWZpbmUgQUJJRF9UWF9WT0lDRV9JSVIJCQkJMHgwMDAxMDA1NwotI2RlZmluZSBBQklEX0VDSE9fQ0FOQ0VMTEVSCQkJCTB4MDAwMTAwNTgKLSNkZWZpbmUgQUJJRF9FQ0hPX0NBTkNFTExFUl9OQl9MVkhGCQkJMHgwMDAxMDA1OQotI2RlZmluZSBBQklEX0VDSE9fQ0FOQ0VMTEVSX1dCX0xWSEYJCQkweDAwMDEwMDVBCi0jZGVmaW5lIEFCSURfRkxVRU5DRQkJCQkJMHgwMDAxMDA1QgotI2RlZmluZSBBQklEX0NPREVDX1JYX0dBSU4JCQkJMHgwMDAxMDA1QwotI2RlZmluZSBBQklEX1JYX0RCTV9PRkZTRVQJCQkJMHgwMDAxMDA1RAotI2RlZmluZSBBQklEX1JYX0FHQwkJCQkJMHgwMDAxMDA1RQotI2RlZmluZSBBQklEX0FWQwkJCQkJMHgwMDAxMDA1RgotI2RlZmluZSBBQklEX1JYX1ZPSUNFX0ZJUgkJCQkweDAwMDEwMDYwCi0jZGVmaW5lIEFCSURfUlhfVk9JQ0VfSUlSCQkJCTB4MDAwMTAwNjEKLSNkZWZpbmUgQUJJRF9BRkVfVk9MX0NUUkwJCQkJMHgwMDAxMDA2NwotCi0KLS8qIEFVRElPIElEcyAqLwotI2RlZmluZSBBQklEX0FVRElPX0FHQ19UWAkJMHgwMDAxMDA2OAotI2RlZmluZSBBQklEX0FVRElPX05TX1RYCQkweDAwMDEwMDY5Ci0jZGVmaW5lIEFCSURfVk9JQ0VfTlMJCQkweDAwMDEwMDZBCi0jZGVmaW5lIEFCSURfQVVESU9fSUlSX1RYCQkweDAwMDEwMDZCCi0jZGVmaW5lIEFCSURfQVVESU9fSUlSX1JYCQkweDAwMDEwMDZDCi0jZGVmaW5lIEFCSURfQVVESU9fTUJBRFJDX1JYCQkweDAwMDEwMDZFCi0jZGVmaW5lIEFCSURfQVVESU9fUUFGWF9SWAkJMHgwMDAxMDA2RgotI2RlZmluZSBBQklEX0FVRElPX1FDT05DRVJUX1JYCQkweDAwMDEwMDcwCi0jZGVmaW5lIEFCSURfQVVESU9fU1RGX1JYCQkweDAwMDEwMDcxCi0jZGVmaW5lIEFCSURfQVVESU9fQ0FMSUJSQVRJT05fR0FJTl9SWCAgMHgwMDAxMTE2MgotI2RlZmluZSBBQklEX0FVRElPX0NBTElCUkFUSU9OX0dBSU5fVFggIDB4MDAwMTExNDkKLSNkZWZpbmUgQUJJRF9BVURJT19QQkVfUlggICAgICAgICAgICAgICAweDAwMDExMTk3Ci0jZGVmaW5lIEFCSURfQVVESU9fUk1DX1RYCQkweDAwMDExMjI2Ci0jZGVmaW5lIEFCSURfQVVESU9fRkxVRU5DRV9UWAkJMHgwMDAxMTI0NAotCi0KLSNkZWZpbmUgSUlEX0FVRElPX0FHQ19QQVJBTUVURVJTCTB4MDAwMTAwN0UKLSNkZWZpbmUgSUlEX05TX1BBUkFNRVRFUlMJCTB4MDAwMTAwNzIKLSNkZWZpbmUgSUlEX0FVRElPX0lJUl9DT0VGRgkJMHgwMDAxMDA3MwotI2RlZmluZSBJSURfTUJBRFJDX0VYVF9CVUZGCQkweDAwMDEwMDc1Ci0jZGVmaW5lIElJRF9NQkFEUkNfQkFORF9DT05GSUcJCTB4MDAwMTAwNzYKLSNkZWZpbmUgSUlEX01CQURSQ19QQVJBTUVURVJTCQkweDAwMDEwMDc3Ci0jZGVmaW5lIElJRF9RQUZYX1BBUkFNRVRFUlMJCTB4MDAwMTAwNzkKLSNkZWZpbmUgSUlEX1FDT05DRVJUX1BBUkFNRVRFUlMJCTB4MDAwMTAwN0EKLSNkZWZpbmUgSUlEX1NURl9DT0VGRgkJCTB4MDAwMTAwN0IKLSNkZWZpbmUgSUlEX0FVRElPX0NBTElCUkFUSU9OX0dBSU5fUlggICAweDAwMDExMTYzCi0jZGVmaW5lIElJRF9BVURJT19DQUxJQlJBVElPTl9HQUlOX1RYICAgMHgwMDAxMTE3MQotI2RlZmluZSBJSURfUEJFX0NPTkZJR19QQVJBTUVURVJTICAgICAgIDB4MDAwMTExOTgKLSNkZWZpbmUgSUlEX0FVRElPX1BCRV9SWF9FTkFCTEVfRkxBRyAgICAweDAwMDExMTk5Ci0jZGVmaW5lIElJRF9BVURJT19STUNfUEFSQU0JCTB4MDAwMTEyMjcKLSNkZWZpbmUgSUlEX0FVRElPX0ZMVUVOQ0VfVFgJCTB4MDAwMTEyNDUKLQotCi0jZGVmaW5lIFRPUElEX1JYX1RPUE9MT0dZXzEJCTB4MDAwMTAwNjIKLSNkZWZpbmUgVE9QSURfVFhfVE9QT0xPR1lfMQkJMHgwMDAxMDA2MwotI2RlZmluZSBBRkVSSURfSU5UX1NJTksJCQkweDAwMDEwMDY1Ci0jZGVmaW5lIEFGRVJJRF9JTlRfU09VUkNFCQkweDAwMDEwMDY2Ci0jZGVmaW5lIEFGRVJJRF9OT19TSU5LCQkJMHgwMDAwMDAwMAotI2RlZmluZSBBRkVSSURfTlVMTF9TSU5LCQkweDAxMDhlYTkyCi0KLQotc3RydWN0IGFjZGJfY21kX2luc3RhbGxfZGV2aWNlIHsKLQl1MzIJY29tbWFuZF9pZDsKLQl1MzIJZGV2aWNlX2lkOwotCXUzMgl0b3BvbG9neV9pZDsKLQl1MzIJYWZlX3JvdXRpbmdfaWQ7Ci0JdTMyCWNhZF9yb3V0aW5nX2lkOwkJLyogc2VlICJTYW1wbGUgUmF0ZSBCaXQgTWFzayIgYmVsb3cgKi8KLQl1MzIJc2FtcGxlX3JhdGVfbWFzazsKLQotCS8qIHJlcHJlc2VudHMgZGV2aWNlIGRpcmVjdGlvbjogVHgsIFJ4IChhdXggcGdhIC0gbG9vcGJhY2spICovCi0JdTgJZGV2aWNlX3R5cGU7Ci0JdTgJY2hhbm5lbF9jb25maWc7CQkvKiBNb25vIG9yIFN0ZXJlbyAqLwotCXUzMglhZGllX2NvZGVjX3BhdGhfaWQ7Ci19OwotCi0KLXN0cnVjdCBhY2RiX2NtZF9nZXRfZGV2aWNlX2NhcGFiaWxpdGllcyB7Ci0JdTMyCWNvbW1hbmRfaWQ7Ci0JdTMyCXRvdGFsX2J5dGVzOwkvKiBMZW5ndGggaW4gYnl0ZXMgYWxsb2NhdGVkIGZvciBidWZmZXIgKi8KLQl1MzIJKnBoeXNfYnVmOwkvKiBQaHlzaWNhbCBBZGRyZXNzIG9mIGRhdGEgKi8KLX07Ci0KLQotc3RydWN0IGFjZGJfY21kX2dldF9kZXZpY2VfaW5mbyB7Ci0JdTMyCWNvbW1hbmRfaWQ7Ci0JdTMyCWRldmljZV9pZDsKLQl1MzIJdG90YWxfYnl0ZXM7CS8qIExlbmd0aCBpbiBieXRlcyBhbGxvY2F0ZWQgZm9yIGJ1ZmZlciAqLwotCXUzMgkqcGh5c19idWY7CS8qIFBoeXNpY2FsIEFkZHJlc3Mgb2YgZGF0YSAqLwotfTsKLQotc3RydWN0IGFjZGJfY21kX2RldmljZSB7Ci0JdTMyCWNvbW1hbmRfaWQ7Ci0JdTMyCWRldmljZV9pZDsKLQl1MzIJbmV0d29ya19pZDsKLQl1MzIJc2FtcGxlX3JhdGVfaWQ7CQkvKiBBY3R1YWwgc2FtcGxlIHJhdGUgdmFsdWUgKi8KLQl1MzIJaW50ZXJmYWNlX2lkOwkJLyogU2VlIGludGVyZmFjZSBpZCdzIGFib3ZlICovCi0JdTMyCWFsZ29yaXRobV9ibG9ja19pZDsJLyogU2VlIGVudW1lcmF0aW9ucyBhYm92ZSAqLwotCXUzMgl0b3RhbF9ieXRlczsJCS8qIExlbmd0aCBpbiBieXRlcyB1c2VkIGJ5IGJ1ZmZlciAqLwotCXUzMgkqcGh5c19idWY7CQkvKiBQaHlzaWNhbCBBZGRyZXNzIG9mIGRhdGEgKi8KLX07Ci0KLXN0cnVjdCBhY2RiX2NtZF9nZXRfZGV2aWNlX3RhYmxlIHsKLQl1MzIJY29tbWFuZF9pZDsKLQl1MzIJZGV2aWNlX2lkOwotCXUzMgluZXR3b3JrX2lkOwotCXUzMglzYW1wbGVfcmF0ZV9pZDsJCS8qIEFjdHVhbCBzYW1wbGUgcmF0ZSB2YWx1ZSAqLwotCXUzMgl0b3RhbF9ieXRlczsJCS8qIExlbmd0aCBpbiBieXRlcyB1c2VkIGJ5IGJ1ZmZlciAqLwotCXUzMgkqcGh5c19idWY7CQkvKiBQaHlzaWNhbCBBZGRyZXNzIG9mIGRhdGEgKi8KLX07Ci0KLXN0cnVjdCBhY2RiX3Jlc3VsdCB7Ci0JLyogVGhpcyBmaWVsZCBpcyBwb3B1bGF0ZWQgaW4gcmVzcG9uc2UgdG8gdGhlICovCi0JLyogQUNEQl9HRVRfREVWSUNFX0NBUEFCSUxJVElFUyBjb21tYW5kIGFuZCBpbmRpY2F0ZXMgdGhlIHRvdGFsICovCi0JLyogZGV2aWNlcyB3aG9zZSBjYXBhYmlsaXRpZXMgYXJlIGNvcGllZCB0byB0aGUgcGh5c2ljYWwgbWVtb3J5LiAqLwotCXUzMgl0b3RhbF9kZXZpY2VzOwotCXUzMgkqYnVmOwkJCS8qIFBoeXNpY2FsIEFkZHJlc3Mgb2YgZGF0YSAqLwotCXUzMgl1c2VkX2J5dGVzOwkJLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGRhdGEgKi8KLQl1MzIJcmVzdWx0OwkJCS8qIFNlZSBBQ0RCIEVycm9yIGNvZGVzIGFib3ZlICovCi19OwotCi1zdHJ1Y3QgYWNkYl9kZXZpY2VfY2FwYWJpbGl0eSB7Ci0JdTMyCWRldmljZV9pZDsKLQl1MzIJc2FtcGxlX3JhdGVfbWFzazsJLyogU2VlICJTYW1wbGUgUmF0ZSBCaXQgTWFzayIgYmVsb3cgKi8KLX07Ci0KLXN0cnVjdCBhY2RiX2Rldl9pbmZvIHsKLQl1MzIJY2FkX3JvdXRpbmdfaWQ7Ci0JdTMyCXNhbXBsZV9yYXRlX21hc2s7CS8qIFNlZSAiU2FtcGxlIFJhdGUgQml0IE1hc2siIGJlbG93ICovCi0JdTMyCWFkc3BfZGV2aWNlX2lkOwkJLyogUURTUDYgZGV2aWNlIElEICovCi0JdTMyCWRldmljZV90eXBlOwkJLyogVHgsIFJ4ICAoYXV4IHBnYSAtIGxvb3BiYWNrKSAqLwotCXUzMgljaGFubmVsX2NvbmZpZzsJCS8qIE1vbm8gb3IgU3RlcmVvICovCi0JczMyCW1pbl92b2x1bWU7CQkvKiBNaW4gdm9sdW1lIChtQikgKi8KLQlzMzIJbWF4X3ZvbHVtZTsJCS8qIE1heCB2b2x1bWUgKG1CKSAqLwotfTsKLQotLypzdHJ1Y3R1cmUgaXMgdXNlZCB0byBpbnRpYWxpemUgQUNEQiBzb2Z0d2FyZSBvbiBtb2RlbQotYmFzZWQgb24gYWRpZSB0eXBlIGRldGVjdGVkKi8KLXN0cnVjdCBhY2RiX2NtZF9pbml0X2FkaWUgewotICAgIHUzMiBjb21tYW5kX2lkOwotICAgIHUzMiBhZGllX3R5cGU7Ci19OwotCi0jZGVmaW5lIEFDREJfQ1VSUkVOVF9BRElFX01PREVfVU5LTk9XTiAwCi0jZGVmaW5lIEFDREJfQ1VSUkVOVF9BRElFX01PREVfVElNUEFOSSAxCi0jZGVmaW5lIEFDREJfQ1VSUkVOVF9BRElFX01PREVfTUFSSU1CQSAyCi0KLS8qIFNhbXBsZSBSYXRlIEJpdCBNYXNrICovCi0KLS8qIEFVWCBQR0EgZGV2aWNlcyB3aWxsIGhhdmUgYSBzYW1wbGUgcmF0ZSBtYXNrIG9mIDB4RkZGRkZGRkYgKi8KLS8qIDhrSHogICAgICAgICAgICAgIDB4MDAwMDAwMDEgKi8KLS8qIDExLjAyNWtIeiAgICAgICAgIDB4MDAwMDAwMDIgKi8KLS8qIDEya0h6ICAgICAgICAgICAgIDB4MDAwMDAwMDQgKi8KLS8qIDE2a0h6ICAgICAgICAgICAgIDB4MDAwMDAwMDggKi8KLS8qIDIyLjVrSHogICAgICAgICAgIDB4MDAwMDAwMTAgKi8KLS8qIDI0a0h6ICAgICAgICAgICAgIDB4MDAwMDAwMjAgKi8KLS8qIDMya0h6ICAgICAgICAgICAgIDB4MDAwMDAwNDAgKi8KLS8qIDQ0LjFrSHogICAgICAgICAgIDB4MDAwMDAwODAgKi8KLS8qIDQ4a0h6ICAgICAgICAgICAgIDB4MDAwMDAxMDAgKi8KLQotCi0vKiBEZXZpY2UgdHlwZSBlbnVtZXJhdGlvbiAqLwotZW51bSB7Ci0JUlhfREVWSUNFID0gMSwKLQlUWF9ERVZJQ0UsCi0JQVVYUEdBX0RFVklDRSwKLQlERVZJQ0VfVFlQRV9NQVgKLX07Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLS8qVGhlc2UgYXJlIEFCSUQgdXNlZCBmb3IgUlRDKi8KLSNkZWZpbmUgQUJJRF9BVURJT19SVENfTUJBRFJDX1JYIDB4MDAwMTExOEEKLSNkZWZpbmUgQUJJRF9BVURJT19SVENfVk9MVU1FX1BBTl9SWCAweDAwMDExMThDCi0jZGVmaW5lIEFCSURfQVVESU9fUlRDX1NQQSAweDAwMDExMThFCi0jZGVmaW5lIEFCSURfQVVESU9fUlRDX0VRVUFMSVpFUl9QQVJBTUVURVJTIDB4MDAwMTExOUYKLQotLypUaGVzZSBhcmUgSUlEIHVzZWQgZm9yIFJUQyovCi0jZGVmaW5lIElJRF9BVURJT19SVENfTUJBRFJDX1BBUkFNRVRFUlMgMHgwMDAxMTE4QgotI2RlZmluZSBJSURfQVVESU9fUlRDX1ZPTFVNRV9QQU5fUEFSQU1FVEVSUyAweDAwMDExMThECi0jZGVmaW5lIElJRF9BVURJT19SVENfU1BBX1BBUkFNRVRFUlMgMHgwMDAxMTE4RgotI2RlZmluZSBJSURfQVVESU9fUlRDX0VRVUFMSVpFUl9QQVJBTUVURVJTIDB4MDAwMTExOUUKLSNkZWZpbmUgSUlEX0FVRElPX1JUQ19BR0NfUEFSQU1FVEVSUyAweDAwMDExMUE3Ci0jZGVmaW5lIElJRF9BVURJT19SVENfVFhfSUlSX0NPRUZGIDB4MDAwMTExQTgKLQotI2VuZGlmCi0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2FkaWVfbWFyaW1iYS5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvYWRpZV9tYXJpbWJhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NTEzMjIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvYWRpZV9tYXJpbWJhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpZm5kZWYgX19NQUNIX1FEU1A1X1YyX0FESUVfTUFSSU1CQV9ICi0jZGVmaW5lIF9fTUFDSF9RRFNQNV9WMl9BRElFX01BUklNQkFfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotLyogVmFsdWUgUmVwcmVzZW50cyBhIGVudHJ5ICovCi0jZGVmaW5lIEFESUVfQ09ERUNfQUNUSU9OX0VOVFJZICAgICAgIDB4MQotLyogVmFsdWUgcmVwcmVzZW50aW5nIGEgZGVsYXkgd2FpdCAqLwotI2RlZmluZSBBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlUICAgICAgMHgyCi0vKiBWYWx1ZSByZXByZXNlbnRpbmcgYSBzdGFnZSByZWFjaGVkICovCi0jZGVmaW5lIEFESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQgICAweDMKLQotLyogVGhpcyB2YWx1ZSBpcyB0aGUgc3RhdGUgYWZ0ZXIgdGhlIGNsaWVudCBzZXRzIHRoZSBwYXRoICovCi0jZGVmaW5lIEFESUVfQ09ERUNfUEFUSF9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDUwCi0KLS8qIFN0YXRlIHRvIHdoaWNoIGNsaWVudCBhc2tzIHRoZSBkcnYgdG8gcHJvY2VlZCB0byB3aGVyZSBpdCBjYW4KLSAqIHNldCB1cCB0aGUgY2xvY2tzIGFuZCAwLWZpbGwgUENNIGJ1ZmZlcnMKLSAqLwotI2RlZmluZSBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAotCi0vKiBTdGF0ZSB0byB3aGljaCBjbGllbnQgYXNrcyB0aGUgZHJ2IHRvIHByb2NlZWQgdG8gd2hlcmUgaXQgY2FuCi0gKiBzdGFydCBzZW5kaW5nIGRhdGEgYWZ0ZXIgaW50ZXJuYWwgc3RlYWR5IHN0YXRlIGRlbGF5Ci0gKi8KLSNkZWZpbmUgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKLQotCi0vKiAgQ2xpZW50IEFza3MgYWRpZSB0byBzd2l0Y2ggb2ZmIHRoZSBBbmFsb2cgcG9ydGlvbiBvZiB0aGUKLSAqICB0aGUgaW50ZXJuYWwgY29kZWMuIEFmdGVyIHRoZSB1c2Ugb2YgdGhpcyBwYXRoCi0gKi8KLSNkZWZpbmUgQURJRV9DT0RFQ19BTkFMT0dfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3NTAKLQotCi0vKiBDbGllbnQgQXNrcyBhZGllIHRvIHN3aXRjaCBvZmYgdGhlIGRpZ2l0YWwgcG9ydGlvbiBvZiB0aGUKLSAqICB0aGUgaW50ZXJuYWwgY29kZWMuIEFmdGVyIHN3aXRjaGluZyBvZmYgdGhlIGFuYWxvZyBwb3J0aW9uLgotICoKLSAqICAwLWZpbGwgUENNIG1heSBvciBtYXlub3QgYmUgc2VudCBhdCB0aGlzIHBvaW50Ci0gKgotICovCi0jZGVmaW5lIEFESUVfQ09ERUNfRElHSVRBTF9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjAwCi0KLS8qIFN0YXRlIHRvIHdoaWNoIGNsaWVudCBhc2tzIHRoZSBkcnYgdG8gd3JpdGUgdGhlIGRlZmF1bHQgdmFsdWVzCi0gKiB0byB0aGUgcmVnaXN0ZXJzICovCi0jZGVmaW5lIEFESUVfQ09ERUNfRkxBU0hfSU1BR0UgCQkJCQkgICAweDAwMDEKLQotLyogUGF0aCB0eXBlICovCi0jZGVmaW5lIEFESUVfQ09ERUNfUlggMAotI2RlZmluZSBBRElFX0NPREVDX1RYIDEKLSNkZWZpbmUgQURJRV9DT0RFQ19MQiAzCi0jZGVmaW5lIEFESUVfQ09ERUNfTUFYIDQKLQotI2RlZmluZSBBRElFX0NPREVDX1BBQ0tfRU5UUlkocmVnLCBtYXNrLCB2YWwpICgodmFsKXwobWFzayA8PCA4KXwocmVnIDw8IDE2KSkKLQotI2RlZmluZSBBRElFX0NPREVDX1VOUEFDS19FTlRSWShwYWNrZWQsIHJlZywgbWFzaywgdmFsKSBcCi0JZG8geyBcCi0JCSgocmVnKSA9ICgocGFja2VkID4+IDE2KSAmICgweGZmKSkpOyBcCi0JCSgobWFzaykgPSAoKHBhY2tlZCA+PiA4KSAmICgweGZmKSkpOyBcCi0JCSgodmFsKSA9ICgocGFja2VkKSAmICgweGZmKSkpOyBcCi0JfSB3aGlsZSAoMCk7Ci0KLXN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IHsKLQl1MzIgdHlwZTsKLQl1MzIgYWN0aW9uOwotfTsKLQotc3RydWN0IGFkaWVfY29kZWNfaHdzZXR0aW5nX2VudHJ5ewotCXN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0ICphY3Rpb25zOwotCXUzMiBhY3Rpb25fc3o7Ci0JdTMyIGZyZXFfcGxhbjsKLQl1MzIgb3NyOwotCS8qIHUzMiAgVm9sTWFzazsKLQkgKiB1MzIgIFNpZGV0b25lTWFzazsKLQkgKi8KLX07Ci0KLXN0cnVjdCBhZGllX2NvZGVjX2Rldl9wcm9maWxlIHsKLQl1MzIgcGF0aF90eXBlOyAvKiBSWCBvciBUWCAqLwotCXUzMiBzZXR0aW5nX3N6OwotCXN0cnVjdCBhZGllX2NvZGVjX2h3c2V0dGluZ19lbnRyeSAqc2V0dGluZ3M7Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2FmZS5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvYWZlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZTI5MzMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvYWZlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpZm5kZWYgX01BQ0hfUURTUDVfVjJfQUZFX0gKLSNkZWZpbmUgX01BQ0hfUURTUDVfVjJfQUZFX0gKLQotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19hY2RiaS5oPgotCi0jZGVmaW5lIEFGRV9IV19QQVRIX0NPREVDX1JYICAgIDEKLSNkZWZpbmUgQUZFX0hXX1BBVEhfQ09ERUNfVFggICAgMgotI2RlZmluZSBBRkVfSFdfUEFUSF9BVVhQQ01fUlggICAzCi0jZGVmaW5lIEFGRV9IV19QQVRIX0FVWFBDTV9UWCAgIDQKLSNkZWZpbmUgQUZFX0hXX1BBVEhfTUkyU19SWCAgICAgNQotI2RlZmluZSBBRkVfSFdfUEFUSF9NSTJTX1RYICAgICA2Ci0KLSNkZWZpbmUgQUZFX1ZPTFVNRV9VTklUWSAweDQwMDAgLyogQmFzZWQgb24gUTE0ICovCi0KLXN0cnVjdCBtc21fYWZlX2NvbmZpZyB7Ci0JdTE2IHNhbXBsZV9yYXRlOwotCXUxNiBjaGFubmVsX21vZGU7Ci0JdTE2IHZvbHVtZTsKLQkvKiBUbyBiZSBleHBhbmVkIGZvciBBVVggQ09ERUMgKi8KLX07Ci0KLWludCBhZmVfZW5hYmxlKHU4IHBhdGhfaWQsIHN0cnVjdCBtc21fYWZlX2NvbmZpZyAqY29uZmlnKTsKLQotaW50IGFmZV9kaXNhYmxlKHU4IHBhdGhfaWQpOwotCi1pbnQgYWZlX2NvbmZpZ19hdXhfY29kZWMoaW50IHBjbV9jdGxfdmFsdWUsIGludCBhdXhfY29kZWNfaW50Zl92YWx1ZSwKLQkJCWludCBkYXRhX2Zvcm1hdF9wYWQpOwotaW50IGFmZV9jb25maWdfZm1fY29kZWMoaW50IGZtX2VuYWJsZSwgdWludDE2X3Qgc291cmNlKTsKLQotaW50IGFmZV9jb25maWdfZm1fdm9sdW1lKHVpbnQxNl90IHZvbHVtZSk7Ci1pbnQgYWZlX2NvbmZpZ19mbV9jYWxpYnJhdGlvbl9nYWluKHVpbnQxNl90IGRldmljZV9pZCwKLQkJCXVpbnQxNl90IGNhbGlicmF0aW9uX2dhaW4pOwotdm9pZCBhZmVfbG9vcGJhY2soaW50IGVuYWJsZSk7Ci12b2lkIGFmZV9leHRfbG9vcGJhY2soaW50IGVuYWJsZSwgaW50IHJ4X2NvcHBfaWQsIGludCB0eF9jb3BwX2lkKTsKLQotdm9pZCBhZmVfZGV2aWNlX3ZvbHVtZV9jdHJsKHUxNiBkZXZpY2VfaWQsIHUxNiBkZXZpY2Vfdm9sdW1lKTsKLQotaW50IGFmZV9jb25maWdfcm1jX2Jsb2NrKHN0cnVjdCBhY2RiX3JtY19ibG9jayAqYWNkYl9ybWMpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9hdWRpb19hY2RiX2RlZi5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvYXVkaW9fYWNkYl9kZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEwYzMwOC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9hdWRpb19hY2RiX2RlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwIC0gMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpZm5kZWYgX01BQ0hfUURTUDVfVjJfQVVESU9fQUNEQl9ERUZfSAotI2RlZmluZSBfTUFDSF9RRFNQNV9WMl9BVURJT19BQ0RCX0RFRl9ICi0KLS8qIERlZmluZSBBQ0RCIGRldmljZSBJRCAqLwotI2RlZmluZSBBQ0RCX0lEX0hBTkRTRVRfU1BLUgkJCQkxCi0jZGVmaW5lIEFDREJfSURfSEFORFNFVF9NSUMJCQkJMgotI2RlZmluZSBBQ0RCX0lEX0hFQURTRVRfTUlDCQkJCTMKLSNkZWZpbmUgQUNEQl9JRF9IRUFEU0VUX1NQS1JfTU9OTwkJCTQKLSNkZWZpbmUgQUNEQl9JRF9IRUFEU0VUX1NQS1JfU1RFUkVPCQkJNQotI2RlZmluZSBBQ0RCX0lEX1NQS1JfUEhPTkVfTUlDCQkJCTYKLSNkZWZpbmUgQUNEQl9JRF9TUEtSX1BIT05FX01PTk8JCQkJNwotI2RlZmluZSBBQ0RCX0lEX1NQS1JfUEhPTkVfU1RFUkVPCQkJOAotI2RlZmluZSBBQ0RCX0lEX0JUX1NDT19NSUMJCQkJOQotI2RlZmluZSBBQ0RCX0lEX0JUX1NDT19TUEtSCQkJCTB4MEEKLSNkZWZpbmUgQUNEQl9JRF9CVF9BMkRQX1NQS1IJCQkJMHgwQgotI2RlZmluZSBBQ0RCX0lEX0JUX0EyRFBfVFgJCQkJMHgxMAotI2RlZmluZSBBQ0RCX0lEX1RUWV9IRUFEU0VUX01JQwkJCQkweDBDCi0jZGVmaW5lIEFDREJfSURfVFRZX0hFQURTRVRfU1BLUgkJCTB4MEQKLSNkZWZpbmUgQUNEQl9JRF9IRUFEU0VUX01PTk9fUExVU19TUEtSX01PTk9fUlgJCTB4MTEKLSNkZWZpbmUgQUNEQl9JRF9IRUFEU0VUX1NURVJFT19QTFVTX1NQS1JfU1RFUkVPX1JYCTB4MTQKLSNkZWZpbmUgQUNEQl9JRF9GTV9UWF9MT09QQkFDSwkJCQkweDE3Ci0jZGVmaW5lIEFDREJfSURfRk1fVFgJCQkJCTB4MTgKLSNkZWZpbmUgQUNEQl9JRF9MUF9GTV9TUEtSX1BIT05FX1NURVJFT19SWAkJMHgxOQotI2RlZmluZSBBQ0RCX0lEX0xQX0ZNX0hFQURTRVRfU1BLUl9TVEVSRU9fUlgJCTB4MUEKLSNkZWZpbmUgQUNEQl9JRF9JMlNfUlgJCQkJCTB4MjAKLSNkZWZpbmUgQUNEQl9JRF9TUEtSX1BIT05FX01JQ19CUk9BRFNJREUJCTB4MkIKLSNkZWZpbmUgQUNEQl9JRF9IQU5EU0VUX01JQ19CUk9BRFNJREUJCQkweDJDCi0jZGVmaW5lIEFDREJfSURfU1BLUl9QSE9ORV9NSUNfRU5ERklSRQkJCTB4MkQKLSNkZWZpbmUgQUNEQl9JRF9IQU5EU0VUX01JQ19FTkRGSVJFCQkJMHgyRQotI2RlZmluZSBBQ0RCX0lEX0kyU19UWAkJCQkJMHgzMAotI2RlZmluZSBBQ0RCX0lEX0hETUkJCQkJCTB4NDAKLSNkZWZpbmUgQUNEQl9JRF9GTV9SWAkJCQkJMHg0RgotLypSZXBsYWNlIHRoZSBtYXggZGV2aWNlIElELGlmIGFueSBuZXcgZGV2aWNlIGlzIGFkZGVkIFNwZWNpZmljIHRvIFJUQyBvbmx5Ki8KLSNkZWZpbmUgQUNEQl9JRF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0RCX0lEX0ZNX1JYCi0KLS8qIElEIHVzZWQgZm9yIHZpcnR1YWwgZGV2aWNlcyAqLwotI2RlZmluZSBQU0VVRE9fQUNEQl9JRCAJCQkJCTB4RkZGRgotCi0jZW5kaWYgLyogX01BQ0hfUURTUDVfVjJfQVVESU9fQUNEQl9ERUZfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvYXVkaW9fYWNkYmkuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2F1ZGlvX2FjZGJpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNWViYWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvYXVkaW9fYWNkYmkuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpZm5kZWYgX01BQ0hfUURTUDVfVjJfQVVESU9fQUNEQklfSAotI2RlZmluZSBfTUFDSF9RRFNQNV9WMl9BVURJT19BQ0RCSV9ICi0KLSNkZWZpbmUgREJPUl9TSUdOQVRVUkUJMHg1MjRGNDI0NAotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi12b2lkIGFjZGJfcnRjX3NldF9lcnIodTMyIEVyckNvZGUpOwotI2VuZGlmCi0KLQotc3RydWN0IGhlYWRlciB7Ci0JdTMyIGRib3Jfc2lnbmF0dXJlOwotCXUzMiBhYmlkOwotCXUzMiBpaWQ7Ci0JdTMyIGRhdGFfbGVuOwotfTsKLQotZW51bSB7Ci0JQUNEQl9BR0NfQkxPQ0sJCQk9IDE5NywKLQlBQ0RCX0lJUl9CTE9DSwkJCT0gMjQ1LAotCUFDREJfTUJBRFJDX0JMT0NLCQk9IDM0MwotfTsKLQotLyogU3RydWN0dXJlIHRvIHF1ZXJ5IGZvciBhY2RiIHBhcmFtZXRlciAqLwotc3RydWN0IGFjZGJfZ2V0X2Jsb2NrIHsKLQl1MzIJYWNkYl9pZDsKLQl1MzIJc2FtcGxlX3JhdGVfaWQ7CQkvKiBBY3R1YWwgc2FtcGxlIHJhdGUgdmFsdWUgKi8KLQl1MzIJaW50ZXJmYWNlX2lkOwkJLyogSW50ZXJmYWNlIGlkJ3MgKi8KLQl1MzIJYWxnb3JpdGhtX2Jsb2NrX2lkOwkvKiBBbGdvcml0aG0gYmxvY2sgaWQgKi8KLQl1MzIJdG90YWxfYnl0ZXM7CQkvKiBMZW5ndGggaW4gYnl0ZXMgdXNlZCBieSBidWZmZXIgZm9yCi0JCQkJCQljb25maWd1cmF0aW9uICovCi0JdTMyCSpidWZfcHRyOwkJLyogQWRkcmVzcyBmb3Igc3RvcmluZyBjb25maWd1cmF0aW9uCi0JCQkJCQlkYXRhICovCi19OwotCi1zdHJ1Y3QgYWNkYl9hZ2NfYmxvY2sgewotCXUxNgllbmFibGVfc3RhdHVzOwotCXUxNgljb21wX3JsaW5rX3N0YXRpY19nYWluOwotCXUxNgljb21wX3JsaW5rX2FpZ19mbGFnOwotCXUxNglleHBfcmxpbmtfdGhyZXNob2xkOwotCXUxNglleHBfcmxpbmtfc2xvcGU7Ci0JdTE2CWNvbXBfcmxpbmtfdGhyZXNob2xkOwotCXUxNgljb21wX3JsaW5rX3Nsb3BlOwotCXUxNgljb21wX3JsaW5rX2FpZ19hdHRhY2tfazsKLQl1MTYJY29tcF9ybGlua19haWdfbGVha19kb3duOwotCXUxNgljb21wX3JsaW5rX2FpZ19sZWFrX3VwOwotCXUxNgljb21wX3JsaW5rX2FpZ19tYXg7Ci0JdTE2CWNvbXBfcmxpbmtfYWlnX21pbjsKLQl1MTYJY29tcF9ybGlua19haWdfcmVsZWFzZV9rOwotCXUxNgljb21wX3JsaW5rX2FpZ19zbV9sZWFrX3JhdGVfZmFzdDsKLQl1MTYJY29tcF9ybGlua19haWdfc21fbGVha19yYXRlX3Nsb3c7Ci0JdTE2CWNvbXBfcmxpbmtfYXR0YWNrX2tfbXN3OwotCXUxNgljb21wX3JsaW5rX2F0dGFja19rX2xzdzsKLQl1MTYJY29tcF9ybGlua19kZWxheTsKLQl1MTYJY29tcF9ybGlua19yZWxlYXNlX2tfbXN3OwotCXUxNgljb21wX3JsaW5rX3JlbGVhc2Vfa19sc3c7Ci0JdTE2CWNvbXBfcmxpbmtfcm1zX3RyYXY7Ci19OwotCi0KLXN0cnVjdCBpaXJfY29lZmZfdHlwZSB7Ci0JdTE2CWIwX2xvOwotCXUxNgliMF9oaTsKLQl1MTYJYjFfbG87Ci0JdTE2CWIxX2hpOwotCXUxNgliMl9sbzsKLQl1MTYJYjJfaGk7Ci19OwotCi1zdHJ1Y3QgaWlyX2NvZWZmX3N0YWdlX2EgewotCXUxNglhMV9sbzsKLQl1MTYJYTFfaGk7Ci0JdTE2CWEyX2xvOwotCXUxNglhMl9oaTsKLX07Ci0KLXN0cnVjdCBhY2RiX2lpcl9ibG9jayB7Ci0JdTE2CQkJZW5hYmxlX2ZsYWc7Ci0JdTE2CQkJc3RhZ2VfY291bnQ7Ci0Jc3RydWN0IGlpcl9jb2VmZl90eXBlCXN0YWdlc1s0XTsKLQlzdHJ1Y3QgaWlyX2NvZWZmX3N0YWdlX2Egc3RhZ2VzX2FbNF07Ci0JdTE2CQkJc2hpZnRfZmFjdG9yWzRdOwotCXUxNgkJCXBhbls0XTsKLX07Ci0KLQotCi1zdHJ1Y3QgbWJhZHJjX2JhbmRfY29uZmlnX3R5cGUgewotCXUxNgltYmFkcmNfc3ViX2JhbmRfZW5hYmxlOwotCXUxNgltYmFkcmNfc3ViX211dGU7Ci0JdTE2CW1iYWRyY19jb21wX3Jtc190YXY7Ci0JdTE2CW1iYWRyY19jb21wX3RocmVzaG9sZDsKLQl1MTYJbWJhZHJjX2NvbXBfc2xvcDsKLQl1MTYJbWJhZHJjX2NvbXBfYXR0YWNrX21zdzsKLQl1MTYJbWJhZHJjX2NvbXBfYXR0YWNrX2xzdzsKLQl1MTYJbWJhZHJjX2NvbXBfcmVsZWFzZV9tc3c7Ci0JdTE2CW1iYWRyY19jb21wX3JlbGVhc2VfbHN3OwotCXUxNgltYmFkcmNfbWFrZV91cF9nYWluOwotfTsKLQotc3RydWN0IG1iYWRyY19wYXJhbWV0ZXIgewotCXUxNgkJCQltYmFkcmNfZW5hYmxlOwotCXUxNgkJCQltYmFkcmNfbnVtX2JhbmRzOwotCXUxNgkJCQltYmFkcmNfZG93bl9zYW1wbGVfbGV2ZWw7Ci0JdTE2CQkJCW1iYWRyY19kZWxheTsKLX07Ci0KLXN0cnVjdCBhY2RiX21iYWRyY19ibG9jayB7Ci0JdTE2CQkJCWV4dF9idWZbMTk2XTsKLQlzdHJ1Y3QgbWJhZHJjX2JhbmRfY29uZmlnX3R5cGUJYmFuZF9jb25maWdbNV07Ci0Jc3RydWN0IG1iYWRyY19wYXJhbWV0ZXIJCXBhcmFtZXRlcnM7Ci19OwotCi1zdHJ1Y3QgIGFjZGJfY2FsaWJfZ2Fpbl9yeCB7Ci0JdTE2IGF1ZHBwY2FsZ2FpbjsKLQl1MTYgcmVzZXJ2ZWQ7Ci19OwotCi1zdHJ1Y3QgYWNkYl9jYWxpYl9nYWluX3R4IHsKLQl1MTYgYXVkcHJlY2FsZ2FpbjsKLQl1MTYgcmVzZXJ2ZWQ7Ci19OwotCi1zdHJ1Y3QgYWNkYl9wYmVfYmxvY2sgewotCXMxNiByZWFsYmFzc21peDsKLQlzMTYgYmFzc2NvbG9yY29udHJvbDsKLQl1MTYgbWFpbmNoYWluZGVsYXk7Ci0JdTE2IHhvdmVyZmx0b3JkZXI7Ci0JdTE2IGJhbmRwYXNzZmx0b3JkZXI7Ci0JczE2IGFkcmNkZWxheTsKLQl1MTYgZG93bnNhbXBsZWxldmVsOwotCXUxNiBjb21wcm1zdGF2OwotCXMxNiBleHB0aHJlc2hvbGQ7Ci0JdTE2IGV4cHNsb3BlOwotCXUxNiBjb21wdGhyZXNob2xkOwotCXUxNiBjb21wc2xvcGU7Ci0JdTE2IGNwbXBhdHRhY2tfbHN3OwotCXUxNiBjb21wYXR0YWNrX21zdzsKLQl1MTYgY29tcHJlbGVhc2VfbHN3OwotCXUxNiBjb21wcmVsZWFzZV9tc3c7Ci0JdTE2IGNvbXBtYWtldXBnYWluOwotCXMxNiBiYXNlbGltdGhyZXNob2xkOwotCXMxNiBoaWdobGltdGhyZXNob2xkOwotCXMxNiBiYXNzbGltbWFrZXVwZ2FpbjsKLQlzMTYgaGlnaGxpbW1ha2V1cGdhaW47Ci0JczE2IGxpbWJhc3NncmM7Ci0JczE2IGxpbWhpZ2hncmM7Ci0JczE2IGxpbWRlbGF5OwotCXUxNiBmaWx0ZXJfY29lZmZzWzkwXTsKLX07Ci0KLXN0cnVjdCBhY2RiX3JtY19ibG9jayAgewotCXMxNiBybWNfZW5hYmxlOwotCXUxNiBybWNfaXB3X2xlbmd0aF9tczsKLQl1MTYgcm1jX2RldGVjdF9zdGFydF90aHJlc2hkYjsKLQl1MTYgcm1jX3BlYWtfbGVuZ3RoX21zOwotCXMxNiBybWNfaW5pdF9wdWxzZV90aHJlc2hkYjsKLQl1MTYgcm1jX2luaXRfcHVsc2VfbGVuZ3RoX21zOwotCXUxNiBybWNfdG90YWxfaW50X2xlbmd0aF9tczsKLQl1MTYgcm1jX3JhbXB1cGRuX2xlbmd0aF9tczsKLQl1MTYgcm1jX2RlbGF5X2xlbmd0aF9tczsKLQl1MTYgcmVzZXJ2ZWQwMDsKLQl1MTYgcmVzZXJ2ZWQwMTsKLQlzMTYgcmVzZXJ2ZWQwMjsKLQlzMTYgcmVzZXJ2ZWQwMzsKLQlzMTYgcmVzZXJ2ZWQwNDsKLX07Ci0KLXN0cnVjdCBhY2RiX2ZsdWVuY2VfYmxvY2sgewotCXUxNiBjc21vZGU7Ci0JdTE2IGNzX3R1bmluZ01vZGU7Ci0JdTE2IGNzX2VjaG9fcGF0aF9kZWxheV9ieV84MDsKLQl1MTYgY3NfZWNob19wYXRoX2RlbGF5OwotCXUxNiBhZjFfdHdvYWxwaGE7Ci0JdTE2IGFmMV9lcmw7Ci0JdTE2IGFmMV90YXBzOwotCXUxNiBhZjFfcHJlc2V0X2NvZWZzOwotCXUxNiBhZjFfb2Zmc2V0OwotCXUxNiBhZjJfdHdvYWxwaGE7Ci0JdTE2IGFmMl9lcmw7Ci0JdTE2IGFmMl90YXBzOwotCXUxNiBhZjJfcHJlc2V0X2NvZWZzOwotCXUxNiBhZjJfb2Zmc2V0OwotCXUxNiBwY2RfdHdvYWxwaGE7Ci0JdTE2IHBjZF9vZmZzZXQ7Ci0JdTE2IGNzcGNkX3RocmVzaG9sZDsKLQl1MTYgd2d0aHJlc2hvbGQ7Ci0JdTE2IG1wdGhyZXNob2xkOwotCXUxNiBzZl9pbml0X3RhYmxlXzBbOF07Ci0JdTE2IHNmX2luaXRfdGFibGVfMVs4XTsKLQl1MTYgc2ZfdGFwczsKLQl1MTYgc2ZfdHdvYWxwaGE7Ci0JdTE2IGRubnNfZWNob2FscGhhcmV2OwotCXUxNiBkbm5zX2VjaG95Y29tcDsKLQl1MTYgZG5uc193YnRocmVzaG9sZDsKLQl1MTYgZG5uc19lY2hvZ2FtbWFoaTsKLQl1MTYgZG5uc19lY2hvZ2FtbWFsbzsKLQl1MTYgZG5uc19ub2lzZWdhbW1hczsKLQl1MTYgZG5uc19ub2lzZWdhbW1hbjsKLQl1MTYgZG5uc19ub2lzZWdhaW5taW5zOwotCXUxNiBkbm5zX25vaXNlZ2Fpbm1pbm47Ci0JdTE2IGRubnNfbm9pc2ViaWFzY29tcDsKLQl1MTYgZG5uc19hY3RocmVzaG9sZDsKLQl1MTYgd2JfZWNob19yYXRpb18ybWljOwotCXUxNiB3Yl9nYW1tYV9lOwotCXUxNiB3Yl9nYW1tYV9ubjsKLQl1MTYgd2JfZ2FtbWFfc247Ci0JdTE2IHZjb2RlY19kZWxheTA7Ci0JdTE2IHZjb2RlY19kZWxheTE7Ci0JdTE2IHZjb2RlY19sZW4wOwotCXUxNiB2Y29kZWNfbGVuMTsKLQl1MTYgdmNvZGVjX3RocjA7Ci0JdTE2IHZjb2RlY190aHIxOwotCXUxNiBmaXhjYWxmYWN0b3JsZWZ0OwotCXUxNiBmaXhjYWxmYWN0b3JyaWdodDsKLQl1MTYgY3NvdXRwdXRnYWluOwotCXUxNiBlbmhfbWV1XzE7Ci0JdTE2IGVuaF9tZXVfMjsKLQl1MTYgZml4ZWRfb3Zlcl9lc3Q7Ci0JdTE2IHJ4X25scHBfbGltaXQ7Ci0JdTE2IHJ4X25scHBfZ2FpbjsKLQl1MTYgd25kX3RocmVzaG9sZDsKLQl1MTYgd25kX25zX2hvdmVyOwotCXUxNiB3bmRfcHdyX3NtYWxwaGE7Ci0JdTE2IHduZF9kZXRfZXNtYWxwaGE7Ci0JdTE2IHduZF9uc19lZ29mZnNldDsKLQl1MTYgd25kX3NtX3JhdGlvOwotCXUxNiB3bmRfZGV0X2NvZWZzWzVdOwotCXUxNiB3bmRfdGgxOwotCXUxNiB3bmRfdGgyOwotCXUxNiB3bmRfZnE7Ci0JdTE2IHduZF9kZmM7Ci0JdTE2IHduZF9zbV9hbHBoYWluYzsKLQl1MTYgd25kX3NtX2FscGhzZGVjOwotCXUxNiBsdm52X3NwZGV0X2ZhcjsKLQl1MTYgbHZudl9zcGRldF9taWM7Ci0JdTE2IGx2bnZfc3BkZXRfeGNsaXA7Ci0JdTE2IGRubnNfbmxfYXR0ZW47Ci0JdTE2IGRubnNfY25pX2xldmVsOwotCXUxNiBkbm5zX2VjaG9nYW1tYWFscGhhOwotCXUxNiBkbm5zX2VjaG9nYW1tYXJlc2N1ZTsKLQl1MTYgZG5uc19lY2hvZ2FtbWFkdDsKLQl1MTYgbWZfbm9pc2VnYW1tYWZhYzsKLQl1MTYgZV9ub2lzZWdhbW1hZmFjOwotCXUxNiBkbm5zX25vaXNlZ2FtbWFpbml0OwotCXUxNiBzbV9ub2lzZWdhbW1hczsKLQl1MTYgd25kX25vaXNlZ2FtbWFuOwotCXUxNiBhZl90YXBzX2JnX3Nwa3I7Ci0JdTE2IGFmX2VybF9iZ19zcGtyOwotCXUxNiBtaW5pbXVtX2VybF9iZzsKLQl1MTYgZXJsX3N0ZXBfYmc7Ci0JdTE2IHVwcHJpc2VjYWxwaGE7Ci0JdTE2IHVwcHJpc2VjdGhyZXNoOwotCXUxNiB1cHByaXdpbmRiaWFzOwotCXUxNiBlX3BjZF90aHJlc2hvbGQ7Ci0JdTE2IG52X21heHZhZGNvdW50OwotCXUxNiBjcnlzdGFsc3BlZWNocmVzZXJ2ZWRbMzhdOwotCXUxNiBjc19zcGVha2VyWzddOwotCXUxNiBuc19mYWM7Ci0JdTE2IG5zX2Jsb2Nrc2l6ZTsKLQl1MTYgaXNfYmlhczsKLQl1MTYgaXNfYmlhc19pbnA7Ci0JdTE2IHNjX2luaXRiOwotCXUxNiBhY19yZXNldGI7Ci0JdTE2IHNjX2F2YXI7Ci0JdTE2IGlzX2hvdmVyWzVdOwotCXUxNiBpc19jZl9sZXZlbDsKLQl1MTYgaXNfY2ZfaW5hOwotCXUxNiBpc19jZl9pbmI7Ci0JdTE2IGlzX2NmX2E7Ci0JdTE2IGlzX2NmX2I7Ci0JdTE2IHNjX3RoOwotCXUxNiBzY19wc2NhbGU7Ci0JdTE2IHNjX25jOwotCXUxNiBzY19ob3ZlcjsKLQl1MTYgc2NfYWxwaGFzOwotCXUxNiBzY19jZmFjOwotCXUxNiBzY19zZG1heDsKLQl1MTYgc2Nfc2RtaW47Ci0JdTE2IHNjX2luaXRsOwotCXUxNiBzY19tYXh2YWw7Ci0JdTE2IHNjX3NwbWluOwotCXUxNiBpc19lY190aDsKLQl1MTYgaXNfZnhfZGw7Ci0JdTE2IGNvZWZmc19pdmFfZmlsdF8wWzMyXTsKLQl1MTYgY29lZmZzX2l2YV9maWx0XzFbMzJdOwotfTsKLQotczMyIGFjZGJfZ2V0X2NhbGlicmF0aW9uX2RhdGEoc3RydWN0IGFjZGJfZ2V0X2Jsb2NrICpnZXRfYmxvY2spOwotdm9pZCBmbHVlbmNlX2ZlYXR1cmVfdXBkYXRlKGludCBlbmFibGUsIGludCBzdHJlYW1faWQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9hdWRpb19kZWYuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2F1ZGlvX2RlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWE0ZDVjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2F1ZGlvX2RlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaWZuZGVmIF9NQUNIX1FEU1A1X1YyX0FVRElPX0RFRl9ICi0jZGVmaW5lIF9NQUNIX1FEU1A1X1YyX0FVRElPX0RFRl9ICi0KLS8qIERlZmluZSBzb3VuZCBkZXZpY2UgY2FwYWJpbGl0eSAqLwotI2RlZmluZSBTTkRERVZfQ0FQX1JYIDB4MSAvKiBSWCBkaXJlY3Rpb24gKi8KLSNkZWZpbmUgU05EREVWX0NBUF9UWCAweDIgLyogVFggZGlyZWN0aW9uICovCi0jZGVmaW5lIFNORERFVl9DQVBfVk9JQ0UgMHg0IC8qIFN1cHBvcnQgdm9pY2UgY2FsbCAqLwotI2RlZmluZSBTTkRERVZfQ0FQX1BMQVlCQUNLIDB4OCAvKiBTdXBwb3J0IHBsYXliYWNrICovCi0jZGVmaW5lIFNORERFVl9DQVBfRk0gMHgxMCAvKiBTdXBwb3J0IEZNIHJhZGlvICovCi0jZGVmaW5lIFNORERFVl9DQVBfVFRZIDB4MjAgLyogU3VwcG9ydCBUVFkgKi8KLSNkZWZpbmUgU05EREVWX0NBUF9BTkMgMHg0MCAvKiBTdXBwb3J0IEFOQyAqLwotI2RlZmluZSBTTkRERVZfQ0FQX0xCIDB4ODAgLyogTG9vcGJhY2sgKi8KLSNkZWZpbmUgVk9DX05CX0lOREVYCTAKLSNkZWZpbmUgVk9DX1dCX0lOREVYCTEKLSNkZWZpbmUgVk9DX1JYX1ZPTF9BUlJBWV9OVU0JMgotCi0vKiBEZXZpY2Ugdm9sdW1lIHR5cGVzIC4gSW4gQ3VycmVudCBkZWlzZ24gb25seSBvbmUgb2YgdGhlc2UgYXJlIHN1cHBvcnRlZC4gKi8KLSNkZWZpbmUgU05EREVWX0RFVl9WT0xfRElHSVRBTCAgMHgxICAvKiBDb2RlYyBEaWdpdGFsIHZvbHVtZSBjb250cm9sICovCi0jZGVmaW5lIFNORERFVl9ERVZfVk9MX0FOQUxPRyAgIDB4MiAgLyogQ29kZWMgQW5hbG9nIHZvbHVtZSBjb250cm9sICovCi0KLSNkZWZpbmUgU0lERV9UT05FX01BU0sJMHgwMQotCi0jZW5kaWYgLyogX01BQ0hfUURTUDVfVjJfQVVESU9fREVGX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2F1ZGlvX2Rldl9jdGwuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2F1ZGlvX2Rldl9jdGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2ZDlhZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9hdWRpb19kZXZfY3RsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaWZuZGVmIF9fTUFDSF9RRFNQNV9WMl9TTkRERVZfSAotI2RlZmluZSBfX01BQ0hfUURTUDVfVjJfU05EREVWX0gKLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGVmLmg+Ci0KLSNkZWZpbmUgQVVESU9fREVWX0NUTF9NQVhfREVWIDY0Ci0jZGVmaW5lIERJUl9UWAkyCi0jZGVmaW5lIERJUl9SWAkxCi0KLSNkZWZpbmUgREVWSUNFX0lHTk9SRQkweGZmCi0jZGVmaW5lIFNFU1NJT05fSUdOT1JFIDB4MDAwMDAwMDAKLQotI2RlZmluZSBWT0lDRV9TVEFURV9JTlZBTElEIDB4MAotI2RlZmluZSBWT0lDRV9TVEFURV9JTkNBTEwgMHgxCi0jZGVmaW5lIFZPSUNFX1NUQVRFX09GRkNBTEwgMHgyCi0jZGVmaW5lIE1BWF9DT1BQX05PREVfU1VQUE9SVEVEIDYKLSNkZWZpbmUgTUFYX0FVRFJFQ19TRVNTSU9OUyAzCi0KLSNkZWZpbmUgUkVBTF9TVEVSRU9fQ0hBTk5FTF9NT0RFCTkKLQotc3RydWN0IG1zbV9zbmRkZXZfaW5mbyB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQl1MzIgY2FwYWJpbGl0eTsKLQl1MzIgY29wcF9pZDsKLQl1MzIgYWNkYl9pZDsKLQl1MzIgZGV2X3ZvbHVtZTsKLQlzdHJ1Y3QgbXNtX3NuZGRldl9vcHMgewotCQlpbnQgKCpvcGVuKShzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICopOwotCQlpbnQgKCpjbG9zZSkoc3RydWN0IG1zbV9zbmRkZXZfaW5mbyAqKTsKLQkJaW50ICgqc2V0X2ZyZXEpKHN0cnVjdCBtc21fc25kZGV2X2luZm8gKiwgdTMyKTsKLQkJaW50ICgqZW5hYmxlX3NpZGV0b25lKShzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICosIHUzMik7Ci0JCWludCAoKnNldF9kZXZpY2Vfdm9sdW1lKShzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICosIHUzMik7Ci0JfSBkZXZfb3BzOwotCXU4IG9wZW5lZDsKLQl2b2lkICpwcml2YXRlX2RhdGE7Ci0JYm9vbCBzdGF0ZTsKLQl1MzIgc2FtcGxlX3JhdGU7Ci0JdTMyIHNldF9zYW1wbGVfcmF0ZTsKLQl1MzIgc2Vzc2lvbnM7Ci0JaW50IHVzYWdlX2NvdW50OwotCXMzMiBtYXhfdm9jX3J4X3ZvbFtWT0NfUlhfVk9MX0FSUkFZX05VTV07IC8qIFswXSBpcyBmb3IgTkIsWzFdIGZvciBXQiAqLwotCXMzMiBtaW5fdm9jX3J4X3ZvbFtWT0NfUlhfVk9MX0FSUkFZX05VTV07Ci19OwotCi1zdHJ1Y3QgbXNtX3ZvbHVtZSB7Ci0JaW50IHZvbHVtZTsgLyogVm9sdW1lIHBhcmFtZXRlciwgaW4gJSBTY2FsZSAqLwotCWludCBwYW47Ci19OwotCi1leHRlcm4gc3RydWN0IG1zbV92b2x1bWUgbXNtX3ZvbF9jdGw7Ci0KLWludCBtc21fZ2V0X2R1YWxfbWljX2NvbmZpZyhpbnQgZW5jX3Nlc3Npb25faWQpOwotaW50IG1zbV9zZXRfZHVhbF9taWNfY29uZmlnKGludCBlbmNfc2Vzc2lvbl9pZCwgaW50IGNvbmZpZyk7Ci1pbnQgbXNtX3Jlc2V0X2FsbF9kZXZpY2Uodm9pZCk7Ci12b2lkIG1zbV9zbmRkZXZfcmVnaXN0ZXIoc3RydWN0IG1zbV9zbmRkZXZfaW5mbyAqKTsKLXZvaWQgbXNtX3NuZGRldl91bnJlZ2lzdGVyKHN0cnVjdCBtc21fc25kZGV2X2luZm8gKik7Ci1pbnQgbXNtX3NuZGRldl9kZXZjb3VudCh2b2lkKTsKLWludCBtc21fc25kZGV2X3F1ZXJ5KGludCBkZXZfaWQpOwotdW5zaWduZWQgc2hvcnQgbXNtX3NuZGRldl9yb3V0ZV9kZWMoaW50IHBvcHBfaWQpOwotdW5zaWduZWQgc2hvcnQgbXNtX3NuZGRldl9yb3V0ZV9lbmMoaW50IGVuY19pZCk7Ci1pbnQgbXNtX3NuZGRldl9zZXRfZGVjKGludCBwb3BwX2lkLCBpbnQgY29wcF9pZCwgaW50IHNldCk7Ci1pbnQgbXNtX3NuZGRldl9zZXRfZW5jKGludCBwb3BwX2lkLCBpbnQgY29wcF9pZCwgaW50IHNldCk7Ci1pbnQgbXNtX3NuZGRldl9pc19zZXQoaW50IHBvcHBfaWQsIGludCBjb3BwX2lkKTsKLWludCBtc21fZ2V0X3ZvY19yb3V0ZSh1MzIgKnJ4X2lkLCB1MzIgKnR4X2lkKTsKLWludCBtc21fc2V0X3ZvY19yb3V0ZShzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICpkZXZfaW5mbywgaW50IHN0cmVhbV90eXBlLAotCQkJaW50IGRldl9pZCk7Ci1pbnQgbXNtX3NuZGRldl9lbmFibGVfc2lkZXRvbmUodTMyIGRldl9pZCwgdTMyIGVuYWJsZSk7Ci0KLXN0cnVjdCBtc21fc25kZGV2X2luZm8gKmF1ZGlvX2Rldl9jdHJsX2ZpbmRfZGV2KHUzMiBkZXZfaWQpOwotCi12b2lkIG1zbV9yZWxlYXNlX3ZvY190aHJlYWQodm9pZCk7Ci0KLWludCBzbmRkZXZfdm9pY2Vfc2V0X3ZvbHVtZShpbnQgdm9sLCBpbnQgcGF0aCk7Ci0KLXN0cnVjdCBhdWRkZXZfZXZ0X3ZvY19kZXZpbmZvIHsKLQl1MzIgZGV2X3R5cGU7ICAgICAgICAgICAvKiBSeCBvciBUeCAqLwotCXUzMiBhY2RiX2Rldl9pZDsgICAgICAgIC8qIGFjZGIgaWQgb2YgZGV2aWNlICovCi0JdTMyIGRldl9zYW1wbGU7ICAgICAgICAgLyogU2FtcGxlIHJhdGUgb2YgZGV2aWNlICovCi0JczMyIG1heF9yeF92b2xbVk9DX1JYX1ZPTF9BUlJBWV9OVU1dOyAJLyogdW5pdCBpcyBtYiAobWlsaWJlbCksCi0JCQkJCQlbMF0gaXMgZm9yIE5CLCBvdGhlciBmb3IgV0IgKi8KLQlzMzIgbWluX3J4X3ZvbFtWT0NfUlhfVk9MX0FSUkFZX05VTV07CS8qIHVuaXQgaXMgbWIgKi8KLQl1MzIgZGV2X2lkOyAgICAgICAgICAgICAvKiByZWdpc3RlcmVkIGRldmljZSBpZCAqLwotfTsKLQotc3RydWN0IGF1ZGRldl9ldnRfYXVkY2FsX2luZm8gewotCXUzMiBkZXZfaWQ7Ci0JdTMyIGFjZGJfaWQ7Ci0JdTMyIHNhbXBsZV9yYXRlOwotCXUzMiBkZXZfdHlwZTsKLQl1MzIgc2Vzc2lvbnM7Ci19OwotCi1zdHJ1Y3QgYXVkZGV2X2V2dF9kZXZpbmZvIHsKLQl1MzIgZGV2X2lkOwotCXUzMiBhY2RiX2lkOwotCXUzMiBzYW1wbGVfcmF0ZTsKLQl1MzIgZGV2X3R5cGU7Ci0JdTMyIHNlc3Npb25zOwotfTsKLQotdW5pb24gbXNtX3ZvbF9tdXRlIHsKLQlpbnQgdm9sOwotCWJvb2wgbXV0ZTsKLX07Ci0KLXN0cnVjdCBhdWRkZXZfZXZ0X3ZvY19tdXRlX2luZm8gewotCXUzMiBkZXZfdHlwZTsKLQl1MzIgYWNkYl9kZXZfaWQ7Ci0JdW5pb24gbXNtX3ZvbF9tdXRlIGRldl92bV92YWw7Ci19OwotCi1zdHJ1Y3QgYXVkZGV2X2V2dF9mcmVxX2luZm8gewotCXUzMiBkZXZfdHlwZTsKLQl1MzIgYWNkYl9kZXZfaWQ7Ci0JdTMyIHNhbXBsZV9yYXRlOwotfTsKLQotdW5pb24gYXVkZGV2X2V2dF9kYXRhIHsKLQlzdHJ1Y3QgYXVkZGV2X2V2dF92b2NfZGV2aW5mbyB2b2NfZGV2aW5mbzsKLQlzdHJ1Y3QgYXVkZGV2X2V2dF92b2NfbXV0ZV9pbmZvIHZvY192bV9pbmZvOwotCXN0cnVjdCBhdWRkZXZfZXZ0X2ZyZXFfaW5mbyBmcmVxX2luZm87Ci0JdTMyIHJvdXRpbmdfaWQ7Ci0JczMyIHNlc3Npb25fdm9sOwotCXMzMiB2b2ljZV9zdGF0ZTsKLQlzdHJ1Y3QgYXVkZGV2X2V2dF9hdWRjYWxfaW5mbyBhdWRjYWxfaW5mbzsKLQlzdHJ1Y3QgYXVkZGV2X2V2dF9kZXZpbmZvIGRldmluZm87Ci19OwotCi1zdHJ1Y3QgbWVzc2FnZV9oZWFkZXIgewotCXVpbnQzMl90IGlkOwotCXVpbnQzMl90IGRhdGFfbGVuOwotfTsKLQotI2RlZmluZSBBVURERVZfRVZUX0RFVl9DSEdfVk9JQ0UJMHgwMSAJLyogZGV2aWNlIGNoYW5nZSBldmVudCAqLwotI2RlZmluZSBBVURERVZfRVZUX0RFVl9SRFkgCQkweDAyIAkvKiBkZXZpY2UgcmVhZHkgZXZlbnQgKi8KLSNkZWZpbmUgQVVEREVWX0VWVF9ERVZfUkxTIAkJMHgwNCAJLyogZGV2aWNlIHJlbGVhc2VkIGV2ZW50ICovCi0jZGVmaW5lIEFVRERFVl9FVlRfUkVMX1BFTkRJTkcJCTB4MDggCS8qIGRldmljZSByZWxlYXNlIHBlbmRpbmcgKi8KLSNkZWZpbmUgQVVEREVWX0VWVF9ERVZJQ0VfVk9MX01VVEVfQ0hHCTB4MTAgCS8qIGRldmljZSB2b2x1bWUgY2hhbmdlZCAqLwotI2RlZmluZSBBVURERVZfRVZUX1NUQVJUX1ZPSUNFCQkweDIwCS8qIHZvaWNlIGNhbGwgc3RhcnQgKi8KLSNkZWZpbmUgQVVEREVWX0VWVF9FTkRfVk9JQ0UJCTB4NDAJLyogdm9pY2UgY2FsbCBlbmQgKi8KLSNkZWZpbmUgQVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRwkweDgwIAkvKiBkZXZpY2Ugdm9sdW1lIGNoYW5nZWQgKi8KLSNkZWZpbmUgQVVEREVWX0VWVF9GUkVRX0NIRwkJMHgxMDAJLyogQ2hhbmdlIGluIGZyZXEgKi8KLSNkZWZpbmUgQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEcJMHgyMDAgICAvKiBDaGFuZ2UgaW4gdm9pY2Ugc3RhdGUgKi8KLSNkZWZpbmUgQVVEREVWX0VWVF9ERVZJQ0VfSU5GTwkJMHg0MDAJLyogcm91dGVkIGRldmljZSBpbmZvcm1hdGlvbgotCQkJCQkJCWV2ZW50ICovCi0KLSNkZWZpbmUgQVVEREVWX0NMTlRfVk9DIAkJMHgxCS8qIFZvY29kZXIgY2xpZW50cyAqLwotI2RlZmluZSBBVURERVZfQ0xOVF9ERUMgCQkweDIJLyogRGVjb2RlciBjbGllbnRzICovCi0jZGVmaW5lIEFVRERFVl9DTE5UX0VOQyAJCTB4MwkvKiBFbmNvZGVyIGNsaWVudHMgKi8KLSNkZWZpbmUgQVVEREVWX0NMTlRfQVVESU9DQUwgCQkweDQJLyogQXVkaW9DYWxpYnJhdGlvbiBjbGllbnQgKi8KLQotI2RlZmluZSBBVURJT19ERVZfQ1RMX01BWF9MSVNUTkVSCTIwCS8qIE1heCBMaXN0ZW5lcnMgU3VwcG9ydGVkICovCi0KLXN0cnVjdCBtc21fc25kX2V2dF9saXN0bmVyIHsKLQl1aW50MzJfdCBldnRfaWQ7Ci0JdWludDMyX3QgY2xudF90eXBlOwotCXVpbnQzMl90IGNsbnRfaWQ7Ci0Jdm9pZCAqcHJpdmF0ZV9kYXRhOwotCXZvaWQgKCphdWRkZXZfZXZ0X2xpc3RlbmVyKSh1MzIgZXZ0X2lkLAotCQl1bmlvbiBhdWRkZXZfZXZ0X2RhdGEgKmV2dF9wYXlsb2FkLAotCQl2b2lkICpwcml2YXRlX2RhdGEpOwotCXN0cnVjdCBtc21fc25kX2V2dF9saXN0bmVyICpjYl9uZXh0OwotCXN0cnVjdCBtc21fc25kX2V2dF9saXN0bmVyICpjYl9wcmV2OwotfTsKLQotc3RydWN0IGV2ZW50X2xpc3RuZXIgewotCXN0cnVjdCBtc21fc25kX2V2dF9saXN0bmVyICpjYjsKLQl1MzIgbnVtX2xpc3RuZXI7Ci0JaW50IHN0YXRlOyAvKiBDYWxsIHN0YXRlICovIC8qIFRPRE8gcmVtb3ZlIHRoaXMgaWYgbm90IHJlcSovCi19OwotCi1leHRlcm4gc3RydWN0IGV2ZW50X2xpc3RuZXIgZXZlbnQ7Ci1pbnQgYXVkZGV2X3JlZ2lzdGVyX2V2dF9saXN0bmVyKHUzMiBldnRfaWQsIHUzMiBjbG50X3R5cGUsIHUzMiBjbG50X2lkLAotCQl2b2lkICgqbGlzdG5lcikodTMyIGV2dF9pZCwKLQkJCXVuaW9uIGF1ZGRldl9ldnRfZGF0YSAqZXZ0X3BheWxvYWQsCi0JCQl2b2lkICpwcml2YXRlX2RhdGEpLAotCQl2b2lkICpwcml2YXRlX2RhdGEpOwotaW50IGF1ZGRldl91bnJlZ2lzdGVyX2V2dF9saXN0bmVyKHUzMiBjbG50X3R5cGUsIHUzMiBjbG50X2lkKTsKLXZvaWQgbWl4ZXJfcG9zdF9ldmVudCh1MzIgZXZ0X2lkLCB1MzIgZGV2X2lkKTsKLXZvaWQgYnJvYWRjYXN0X2V2ZW50KHUzMiBldnRfaWQsIHUzMiBkZXZfaWQsIHUzMiBzZXNzaW9uX2lkKTsKLWludCBtc21fc25kZGV2X3JlcXVlc3RfZnJlcShpbnQgKmZyZXEsIHUzMiBzZXNzaW9uX2lkLAotCQkJdTMyIGNhcGFiaWxpdHksIHUzMiBjbG50X3R5cGUpOwotaW50IG1zbV9zbmRkZXZfd2l0aGRyYXdfZnJlcSh1MzIgc2Vzc2lvbl9pZCwKLQkJCXUzMiBjYXBhYmlsaXR5LCB1MzIgY2xudF90eXBlKTsKLWludCBtc21fZGV2aWNlX2lzX3ZvaWNlKGludCBkZXZfaWQpOwotaW50IG1zbV9nZXRfdm9jX2ZyZXEoaW50ICp0eF9mcmVxLCBpbnQgKnJ4X2ZyZXEpOwotaW50IG1zbV9zbmRkZXZfZ2V0X2VuY19mcmVxKGludCBzZXNzaW9uX2lkKTsKLWludCBtc21fc2V0X3ZvaWNlX3ZvbChpbnQgZGlyLCBzMzIgdm9sdW1lKTsKLWludCBtc21fc2V0X3ZvaWNlX211dGUoaW50IGRpciwgaW50IG11dGUpOwotaW50IG1zbV9nZXRfdm9pY2Vfc3RhdGUodm9pZCk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1ib29sIGlzX2Rldl9vcGVuZWQodTMyIGFjZGJfaWQpOwotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvYXVkaW9faW50ZXJjdC5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvYXVkaW9faW50ZXJjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjkwYmY1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2F1ZGlvX2ludGVyY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpZm5kZWYgX19NQUNIX1FEU1A1X1YyX0FVRElPX0lOVEVSQ1RfSAotI2RlZmluZSBfX01BQ0hfUURTUDVfVjJfQVVESU9fSU5URVJDVF9ICi0KLSNkZWZpbmUgQVVESU9fSU5URVJDVF9BRFNQIDAKLSNkZWZpbmUgQVVESU9fSU5URVJDVF9MUEEgMQotI2RlZmluZSBBVURJT19BRFNQX0EgMQotI2RlZmluZSBBVURJT19BRFNQX1YgMAotCi12b2lkIGF1ZGlvX2ludGVyY3RfbHBhKHUzMiBzb3VyY2UpOwotdm9pZCBhdWRpb19pbnRlcmN0X2F1eF9yZWdzZWwodTMyIHNvdXJjZSk7Ci12b2lkIGF1ZGlvX2ludGVyY3RfcnBjbV9zb3VyY2UodTMyIHNvdXJjZSk7Ci12b2lkIGF1ZGlvX2ludGVyY3RfdHBjbV9zb3VyY2UodTMyIHNvdXJjZSk7Ci12b2lkIGF1ZGlvX2ludGVyY3RfcGNtbWkycyh1MzIgc291cmNlKTsKLXZvaWQgYXVkaW9faW50ZXJjdF9jb2RlYyh1MzIgc291cmNlKTsKLXZvaWQgYXVkaW9faW50ZXJjdF9tdWx0aWNoYW5uZWwodTMyIHNvdXJjZSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvYXVkcHAuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2F1ZHBwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2M2E2NTEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvYXVkcHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKmFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1aXYyL2F1ZHBwLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0qLwotCi0jaWZuZGVmIF9NQUNIX1FEU1A1X1YyX0FVRFBQX0gKLSNkZWZpbmUgX01BQ0hfUURTUDVfVjJfQVVEUFBfSAotCi0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHBjbWRpLmg+Ci0KLXR5cGVkZWYgdm9pZCAoKmF1ZHBwX2V2ZW50X2Z1bmMpKHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGlkLCB1aW50MTZfdCAqbXNnKTsKLQotLyogd29yc3QgY2FzZSBkZWxheSBvZiAxc2VjIGZvciByZXNwb25zZSAqLwotI2RlZmluZSBNU01fQVVEX0RFQ09ERVJfV0FJVF9NUyAxMDAwCi0jZGVmaW5lIE1TTV9BVURfTU9ERV9UVU5ORUwgIDB4MDAwMDAxMDAKLSNkZWZpbmUgTVNNX0FVRF9NT0RFX05PTlRVTk5FTCAgMHgwMDAwMDIwMAotI2RlZmluZSBNU01fQVVEX01PREVfTFAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgTVNNX0FVRF9ERUNPREVSX01BU0sgIDB4MDAwMEZGRkYKLSNkZWZpbmUgTVNNX0FVRF9PUF9NQVNLICAweEZGRkYwMDAwCi0KLS8qIHJlYWQgY2FsbCB0aW1lb3V0IGZvciBlcnJvciBjYXNlcyAqLwotI2RlZmluZSBNU01fQVVEX0JVRkZFUl9VUERBVEVfV0FJVF9NUyAyMDAwCi0KLS8qIHN0cmVhbSBpbmZvIGVycm9yIG1lc3NhZ2UgbWFzayAqLwotI2RlZmluZSBBVURQTEFZX1NUUkVBTV9JTkZPX01TR19NQVNLIDB4RkZGRjAwMDAKLSNkZWZpbmUgQVVEUExBWV9FUlJPUl9USFJFU0hPTERfRU5BQkxFIDB4RkZGRkZGRkYKLQotI2RlZmluZSBOT05fVFVOTkVMX01PREVfUExBWUJBQ0sgMQotI2RlZmluZSBUVU5ORUxfTU9ERV9QTEFZQkFDSyAwCi0KLSNkZWZpbmUgQVVEUFBfTUlYRVJfSUNPREVDIEFVRFBQX0NNRF9DRkdfREVWX01JWEVSX0RFVl8wCi0jZGVmaW5lIEFVRFBQX01JWEVSXzEgQVVEUFBfQ01EX0NGR19ERVZfTUlYRVJfREVWXzEKLSNkZWZpbmUgQVVEUFBfTUlYRVJfMiBBVURQUF9DTURfQ0ZHX0RFVl9NSVhFUl9ERVZfMgotI2RlZmluZSBBVURQUF9NSVhFUl8zIEFVRFBQX0NNRF9DRkdfREVWX01JWEVSX0RFVl8zCi0jZGVmaW5lIEFVRFBQX01JWEVSX0hMQiBBVURQUF9DTURfQ0ZHX0RFVl9NSVhFUl9ERVZfNAotI2RlZmluZSBBVURQUF9NSVhFUl9OT05ITEIgKEFVRFBQX0NNRF9DRkdfREVWX01JWEVSX0RFVl8wIHwgXAotCQkJQVVEUFBfQ01EX0NGR19ERVZfTUlYRVJfREVWXzEgfCBcCi0JCQlBVURQUF9DTURfQ0ZHX0RFVl9NSVhFUl9ERVZfMiB8IFwKLQkJCUFVRFBQX0NNRF9DRkdfREVWX01JWEVSX0RFVl8zKQotI2RlZmluZSBBVURQUF9NSVhFUl9VUExJTktfUlgJCUFVRFBQX0NNRF9DRkdfREVWX01JWEVSX0RFVl81Ci0jZGVmaW5lIEFVRFBQX01BWF9DT1BQX0RFVklDRVMJCTYKLQotZW51bSBvYmpfdHlwZSB7Ci0JQ09QUCwKLQlQT1BQCi19OwotCi1lbnVtIG1zbV9hdWRfZGVjb2Rlcl9zdGF0ZSB7Ci0JTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUgPSAwLAotCU1TTV9BVURfREVDT0RFUl9TVEFURV9GQUlMVVJFID0gMSwKLQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfU1VDQ0VTUyA9IDIsCi0JTVNNX0FVRF9ERUNPREVSX1NUQVRFX0NMT1NFID0gMywKLX07Ci0KLWludCBhdWRwcF9hZGVjX2FsbG9jKHVuc2lnbmVkIGRlY19hdHRyYiwgY29uc3QgY2hhciAqKm1vZHVsZV9uYW1lLAotCQkJdW5zaWduZWQgKnF1ZXVlaWQpOwotdm9pZCBhdWRwcF9hZGVjX2ZyZWUoaW50IGRlY2lkKTsKLQotc3RydWN0IGF1ZHBwX2V2ZW50X2NhbGxiYWNrIHsKLQlhdWRwcF9ldmVudF9mdW5jIGZuOwotCXZvaWQgKnByaXZhdGU7Ci19OwotCi1pbnQgYXVkcHBfcmVnaXN0ZXJfZXZlbnRfY2FsbGJhY2soc3RydWN0IGF1ZHBwX2V2ZW50X2NhbGxiYWNrICplaCk7Ci1pbnQgYXVkcHBfdW5yZWdpc3Rlcl9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYXVkcHBfZXZlbnRfY2FsbGJhY2sgKmVoKTsKLWludCBpc19hdWRwcF9lbmFibGUodm9pZCk7Ci0KLWludCBhdWRwcF9lbmFibGUoaW50IGlkLCBhdWRwcF9ldmVudF9mdW5jIGZ1bmMsIHZvaWQgKnByaXZhdGUpOwotdm9pZCBhdWRwcF9kaXNhYmxlKGludCBpZCwgdm9pZCAqcHJpdmF0ZSk7Ci0KLWludCBhdWRwcF9zZW5kX3F1ZXVlMSh2b2lkICpjbWQsIHVuc2lnbmVkIGxlbik7Ci1pbnQgYXVkcHBfc2VuZF9xdWV1ZTIodm9pZCAqY21kLCB1bnNpZ25lZCBsZW4pOwotaW50IGF1ZHBwX3NlbmRfcXVldWUzKHZvaWQgKmNtZCwgdW5zaWduZWQgbGVuKTsKLQotdm9pZCBhdWRwcF9yb3V0ZV9zdHJlYW0odW5zaWduZWQgc2hvcnQgZGVjX2lkLCB1bnNpZ25lZCBzaG9ydCBtaXhlcl9tYXNrKTsKLQotaW50IGF1ZHBwX3NldF92b2x1bWVfYW5kX3Bhbih1bnNpZ25lZCBpZCwgdW5zaWduZWQgdm9sdW1lLCBpbnQgcGFuLAotCQkJCQllbnVtIG9ial90eXBlIG9ianR5cGUpOwotaW50IGF1ZHBwX3BhdXNlKHVuc2lnbmVkIGlkLCBpbnQgcGF1c2UpOwotaW50IGF1ZHBwX2ZsdXNoKHVuc2lnbmVkIGlkKTsKLWludCBhdWRwcF9xdWVyeV9hdnN5bmMoaW50IGlkKTsKLWludCBhdWRwcF9yZXN0b3JlX2F2c3luYyhpbnQgaWQsIHVpbnQxNl90ICphdnN5bmMpOwotCi1pbnQgYXVkcHBfZHNwX3NldF9lcSh1bnNpZ25lZCBpZCwgdW5zaWduZWQgZW5hYmxlLAotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfZXFhbGl6ZXIgKmVxLAotCQkJZW51bSBvYmpfdHlwZSBvYmp0eXBlKTsKLQotaW50IGF1ZHBwX2RzcF9zZXRfc3BhKHVuc2lnbmVkIGlkLAotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3BlY3RyYW0gKnNwYSwKLQkJCWVudW0gb2JqX3R5cGUgb2JqdHlwZSk7Ci0KLWludCBhdWRwcF9kc3Bfc2V0X3N0Zih1bnNpZ25lZCBpZCwgdW5zaWduZWQgZW5hYmxlLAotICAgICBzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3NpZGVjaGFpbiAqc3RmLAotCQkJZW51bSBvYmpfdHlwZSBvYmp0eXBlKTsKLQotaW50IGF1ZHBwX2RzcF9zZXRfdm9sX3Bhbih1bnNpZ25lZCBpZCwKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3ZvbHVtZSAqdm9sX3BhbiwKLQkJCWVudW0gb2JqX3R5cGUgb2JqdHlwZSk7Ci0KLWludCBhdWRwcF9kc3Bfc2V0X21iYWRyYyh1bnNpZ25lZCBpZCwgdW5zaWduZWQgZW5hYmxlLAotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfbWJhZHJjICptYmFkcmMsCi0JZW51bSBvYmpfdHlwZSBvYmp0eXBlKTsKLQotaW50IGF1ZHBwX2RzcF9zZXRfcWNvbmNlcnRfcGx1cyh1bnNpZ25lZCBpZCwgdW5zaWduZWQgZW5hYmxlLAotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfcWNvbmNlcnQgKnFjb25jZXJ0X3BsdXMsCi0JZW51bSBvYmpfdHlwZSBvYmp0eXBlKTsKLQotaW50IGF1ZHBwX2RzcF9zZXRfcnhfaWlyKHVuc2lnbmVkIGlkLCB1bnNpZ25lZCBlbmFibGUsCi0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19wY20gKmlpciwKLQllbnVtIG9ial90eXBlIG9ianR5cGUpOwotCi1pbnQgYXVkcHBfZHNwX3NldF9nYWluX3J4KHVuc2lnbmVkIGlkLAotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2NhbF9nYWluICpjYWxpYl9nYWluX3J4LAotCWVudW0gb2JqX3R5cGUgb2JqdHlwZSk7Ci1pbnQgYXVkcHBfZHNwX3NldF9wYmUodW5zaWduZWQgaWQsIHVuc2lnbmVkIGVuYWJsZSwKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19wYmUgKnBiZV9ibG9jaywKLQllbnVtIG9ial90eXBlIG9ianR5cGUpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9hdWRwcmVwcm9jLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9hdWRwcmVwcm9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YTBhOGYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvYXVkcHJlcHJvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX01BQ0hfUURTUDVfVjJfQVVEUFJFUFJPQ19ICi0jZGVmaW5lIF9NQUNIX1FEU1A1X1YyX0FVRFBSRVBST0NfSAotCi0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHJlcHJvY2NtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRwcmVwcm9jbXNnLmg+Ci0KLSNkZWZpbmUgTUFYX0VOQ19DT1VOVCAzCi0KLSNkZWZpbmUgTVNNX0FEU1BfRU5DX0NPREVDX1dBViAwCi0jZGVmaW5lIE1TTV9BRFNQX0VOQ19DT0RFQ19BQUMgMQotI2RlZmluZSBNU01fQURTUF9FTkNfQ09ERUNfU0JDIDIKLSNkZWZpbmUgTVNNX0FEU1BfRU5DX0NPREVDX0FNUk5CIDMKLSNkZWZpbmUgTVNNX0FEU1BfRU5DX0NPREVDX0VWUkMgNAotI2RlZmluZSBNU01fQURTUF9FTkNfQ09ERUNfUUNFTFAgNQotI2RlZmluZSBNU01fQURTUF9FTkNfQ09ERUNfRVhUX1dBViAoMTUpCi0KLSNkZWZpbmUgTVNNX0FEU1BfRU5DX01PREVfVFVOTkVMIDI0Ci0jZGVmaW5lIE1TTV9BRFNQX0VOQ19NT0RFX05PTl9UVU5ORUwgMjUKLQotI2RlZmluZSBBVURQUkVQUk9DX0NPREVDX01BU0sgMHgwMEZGCi0jZGVmaW5lIEFVRFBSRVBST0NfTU9ERV9NQVNLIDB4RkYwMAotCi0jZGVmaW5lIE1TTV9BVURfRU5DX01PREVfVFVOTkVMICAweDAwMDAwMTAwCi0jZGVmaW5lIE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMICAweDAwMDAwMjAwCi0KLSNkZWZpbmUgU09VUkNFX1BJUEVfMQkweDAwMDEKLSNkZWZpbmUgU09VUkNFX1BJUEVfMAkweDAwMDAKLQotLyogZXZlbnQgY2FsbGJhY2sgcm91dGluZSBwcm90b3R5cGUqLwotdHlwZWRlZiB2b2lkICgqYXVkcHJlcHJvY19ldmVudF9mdW5jKSh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdm9pZCAqbXNnKTsKLQotc3RydWN0IGF1ZHByZXByb2NfZXZlbnRfY2FsbGJhY2sgewotCWF1ZHByZXByb2NfZXZlbnRfZnVuYyBmbjsKLQl2b2lkICpwcml2YXRlOwotfTsKLQotLypob2xkcyBhdWRyZWMgaW5mb3JtYXRpb24qLwotc3RydWN0IGF1ZHJlY19zZXNzaW9uX2luZm8gewotCWludCBzZXNzaW9uX2lkOwotCWludCBzYW1wbGluZ19mcmVxOwotfTsKLQotLyogRXhwb3J0ZWQgY29tbW9uIGFwaSdzIGZyb20gYXVkcHJlcHJvYyBsYXllciAqLwotaW50IGF1ZHByZXByb2NfYWVuY19hbGxvYyh1bnNpZ25lZCBlbmNfdHlwZSwgY29uc3QgY2hhciAqKm1vZHVsZV9uYW1lLAotCQl1bnNpZ25lZCAqcXVldWVfaWQpOwotdm9pZCBhdWRwcmVwcm9jX2FlbmNfZnJlZShpbnQgZW5jX2lkKTsKLQotaW50IGF1ZHByZXByb2NfZW5hYmxlKGludCBlbmNfaWQsIGF1ZHByZXByb2NfZXZlbnRfZnVuYyBmdW5jLCB2b2lkICpwcml2YXRlKTsKLXZvaWQgYXVkcHJlcHJvY19kaXNhYmxlKGludCBlbmNfaWQsIHZvaWQgKnByaXZhdGUpOwotCi1pbnQgYXVkcHJlcHJvY19zZW5kX2F1ZHJlY2NtZHF1ZXVlKHZvaWQgKmNtZCwgdW5zaWduZWQgbGVuKTsKLQotaW50IGF1ZHByZXByb2Nfc2VuZF9wcmVwcm9jY21kcXVldWUodm9pZCAqY21kLCB1bnNpZ25lZCBsZW4pOwotCi1pbnQgYXVkcHJlcHJvY19kc3Bfc2V0X2FnYyhzdHJ1Y3QgYXVkcHJlcHJvY19jbWRfY2ZnX2FnY19wYXJhbXMgKmFnYywKLQl1bnNpZ25lZCBsZW4pOwotaW50IGF1ZHByZXByb2NfZHNwX3NldF9hZ2MyKHN0cnVjdCBhdWRwcmVwcm9jX2NtZF9jZmdfYWdjX3BhcmFtc18yICphZ2MyLAotCXVuc2lnbmVkIGxlbik7Ci1pbnQgYXVkcHJlcHJvY19kc3Bfc2V0X25zKHN0cnVjdCBhdWRwcmVwcm9jX2NtZF9jZmdfbnNfcGFyYW1zICpucywKLQl1bnNpZ25lZCBsZW4pOwotaW50IGF1ZHByZXByb2NfZHNwX3NldF9paXIoCi1zdHJ1Y3QgYXVkcHJlcHJvY19jbWRfY2ZnX2lpcl90dW5pbmdfZmlsdGVyX3BhcmFtcyAqaWlyLCB1bnNpZ25lZCBsZW4pOwotCi1pbnQgYXVkcHJlcHJvY19kc3Bfc2V0X2FnYyhzdHJ1Y3QgYXVkcHJlcHJvY19jbWRfY2ZnX2FnY19wYXJhbXMgKmFnYywKLSB1bnNpZ25lZCBpbnQgbGVuKTsKLQotaW50IGF1ZHByZXByb2NfZHNwX3NldF9paXIoCi1zdHJ1Y3QgYXVkcHJlcHJvY19jbWRfY2ZnX2lpcl90dW5pbmdfZmlsdGVyX3BhcmFtcyAqaWlyLCB1bnNpZ25lZCBpbnQgbGVuKTsKLQotaW50IGF1ZHByZXByb2NfdXBkYXRlX2F1ZHJlY19pbmZvKHN0cnVjdCBhdWRyZWNfc2Vzc2lvbl9pbmZvCi0JCQkJCQkqYXVkcmVjX3Nlc3Npb25faW5mbyk7Ci1pbnQgYXVkcHJlcHJvY191bnJlZ2lzdGVyX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBhdWRwcmVwcm9jX2V2ZW50X2NhbGxiYWNrICplY2IpOwotCi1pbnQgYXVkcHJlcHJvY19yZWdpc3Rlcl9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYXVkcHJlcHJvY19ldmVudF9jYWxsYmFjayAqZWNiKTsKLQotaW50IGF1ZHByZXByb2NfZHNwX3NldF9nYWluX3R4KAotCXN0cnVjdCBhdWRwcmVwcm9jX2NtZF9jZmdfY2FsX2dhaW4gKmNhbGliX2dhaW5fdHgsIHVuc2lnbmVkIGxlbik7Ci0KLXZvaWQgZ2V0X2F1ZHJlY19zZXNzaW9uX2luZm8oaW50IGlkLCBzdHJ1Y3QgYXVkcmVjX3Nlc3Npb25faW5mbyAqaW5mbyk7Ci0KLWludCBhdWRwcmVwcm9jX2RzcF9zZXRfbHZudigKLQlzdHJ1Y3QgYXVkcHJlcHJvY19jbWRfY2ZnX2x2bnZfcGFyYW0gKnByZXByb2NfbHZudiwgdW5zaWduZWQgbGVuKTsKLSNlbmRpZiAvKiBfTUFDSF9RRFNQNV9WMl9BVURQUkVQUk9DX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2F1eF9wY20uaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2F1eF9wY20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliOTQyNy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9hdXhfcGNtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaWZuZGVmIF9fTUFDSF9RRFNQNV9WMl9BVVhfUENNX0gKLSNkZWZpbmUgX19NQUNIX1FEU1A1X1YyX0FVWF9QQ01fSAotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19kZWYuaD4KLQotLyogZGVmaW5lIHNvbWUgdmFsdWVzIGluIEFVWF9DT0RFQ19DVEwgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVVYX0NPREVDX0NUTF9fQURTUF9DT0RFQ19DVExfRU5fX01TTV9WIDAgLyogZGVmYXVsdCAqLwotI2RlZmluZSBBVVhfQ09ERUNfQ1RMX19BRFNQX0NPREVDX0NUTF9FTl9fQURTUF9WIDB4ODAwCi0jZGVmaW5lIEFVWF9DT0RFQ19DVExfX1BDTV9TWU5DX0xPTkdfT0ZGU0VUX1YgIDB4NDAwCi0jZGVmaW5lIEFVWF9DT0RFQ19DVExfX1BDTV9TWU5DX1NIT1JUX09GRlNFVF9WIDB4MjAwCi0jZGVmaW5lIEFVWF9DT0RFQ19DVExfX0kyU19TQU1QTEVfQ0xLX1NSQ19fU0RBQ19WIDAKLSNkZWZpbmUgQVVYX0NPREVDX0NUTF9fSTJTX1NBTVBMRV9DTEtfU1JDX19JQ09ERUNfViAweDgwCi0jZGVmaW5lIEFVWF9DT0RFQ19DVExfX0kyU19TQU1QTEVfQ0xLX01PREVfX01BU1RFUl9WIDAKLSNkZWZpbmUgQVVYX0NPREVDX0NUTF9fSTJTX1NBTVBMRV9DTEtfTU9ERV9fU0xBVkVfViAweDQwCi0jZGVmaW5lIEFVWF9DT0RFQ19DVExfX0kyU19SWF9NT0RFX19SRVZfViAwCi0jZGVmaW5lIEFVWF9DT0RFQ19DVExfX0kyU19SWF9NT0RFX19UUkFOX1YgMHgyMAotI2RlZmluZSBBVVhfQ09ERUNfQ1RMX19JMlNfQ0xLX01PREVfX01BU1RFUl9WIDAKLSNkZWZpbmUgQVVYX0NPREVDX0NUTF9fSTJTX0NMS19NT0RFX19TTEFWRV9WIDB4MTAKLSNkZWZpbmUgQVVYX0NPREVDX0NUTF9fQVVYX1BDTV9NT0RFX19QUklNX01BU1RFUl9WIDAKLSNkZWZpbmUgQVVYX0NPREVDX0NUTF9fQVVYX1BDTV9NT0RFX19BVVhfTUFTVEVSX1YgMHg0Ci0jZGVmaW5lIEFVWF9DT0RFQ19DVExfX0FVWF9QQ01fTU9ERV9fUFJJTV9TTEFWRV9WIDB4OAotI2RlZmluZSBBVVhfQ09ERUNfQ1RMX19BVVhfQ09ERUNfTURPRV9fUENNX1YgMAotI2RlZmluZSBBVVhfQ09ERUNfQ1RMX19BVVhfQ09ERUNfTU9ERV9fSTJTX1YgMHgyCi0KLS8qIGRlZmluZSBzb21lIHZhbHVlcyBpbiBQQ01fUEFUSF9DVEwgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgUENNX1BBVEhfQ1RMX19BRFNQX0NUTF9FTl9fTVNNX1YgMAotI2RlZmluZSBQQ01fUEFUSF9DVExfX0FEU1BfQ1RMX0VOX19BRFNQX1YgMHg4Ci0KLS8qIGRlZmluZSBzb21lIHZhbHVlcyBmb3IgYXV4IGNvZGVjIGNvbmZpZyBvZiBBRkUqLwotLyogUENNIENUTCAqLwotI2RlZmluZSBQQ01fQ1RMX19SUENNX1dJRFRIX19MSU5FQVJfViAweDEKLSNkZWZpbmUgUENNX0NUTF9fVFBDTV9XSURUSF9fTElORUFSX1YgMHgyCi0vKiBBVVhfQ09ERUNfSU5URl9DVEwgKi8KLSNkZWZpbmUgQVVYX0NPREVDX0lOVEZfQ1RMX19QQ01JTlRGX0RBVEFfRU5fViAweDgwMAotLyogREFUQV9GT1JNQVRfUEFERElOR19JTkZPICovCi0jZGVmaW5lIERBVEFfRk9STUFUX1BBRERJTkdfSU5GT19fUlBDTV9GT1JNQVRfViAweDQwMAotI2RlZmluZSBEQVRBX0ZPUk1BVF9QQURESU5HX0lORk9fX1RQQ01fRk9STUFUX1YgMHgyMDAwCi0KLXZvaWQgYXV4X2NvZGVjX2Fkc3BfY29kZWNfY3RsX2VuKGJvb2wgbXNtX2Fkc3BfZW4pOwotdm9pZCBhdXhfY29kZWNfcGNtX3BhdGhfY3RsX2VuKGJvb2wgbXNtX2Fkc3BfZW4pOwotaW50IGF1eF9wY21fZ3Bpb3NfcmVxdWVzdCh2b2lkKTsKLXZvaWQgYXV4X3BjbV9ncGlvc19mcmVlKHZvaWQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2NvZGVjX3V0aWxzLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9jb2RlY191dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ZkYWJmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2NvZGVjX3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2lmbmRlZiBDT0RFQ19VVElMU19ICi0jZGVmaW5lIENPREVDX1VUSUxTX0gKLQotI2luY2x1ZGUgPGxpbnV4L2Vhcmx5c3VzcGVuZC5oPgotCi0jZGVmaW5lIEFEUlZfU1RBVFVTX0FJT19JTlRGIDB4MDAwMDAwMDEKLSNkZWZpbmUgQURSVl9TVEFUVVNfT0JVRl9HSVZFTiAweDAwMDAwMDAyCi0jZGVmaW5lIEFEUlZfU1RBVFVTX0lCVUZfR0lWRU4gMHgwMDAwMDAwNAotI2RlZmluZSBBRFJWX1NUQVRVU19GU1lOQyAweDAwMDAwMDA4Ci0KLSNkZWZpbmUgUENNX0JVRlNaX01JTiA0ODAwCS8qIEhvbGQgb25lIHN0ZXJlbyBNUDMgZnJhbWUgKi8KLSNkZWZpbmUgUENNX0JVRl9NQVhfQ09VTlQgNQkvKiBEU1Agb25seSBhY2NlcHRzIDUgYnVmZmVycyBhdCBtb3N0Ci0JCQkJICAgYnV0IHN1cHBvcnQgMiBidWZmZXJzIGN1cnJlbnRseSAqLwotI2RlZmluZSBST1VUSU5HX01PREVfRlRSVCAxCi0jZGVmaW5lIFJPVVRJTkdfTU9ERV9SVCAyCi0vKiBEZWNvZGVyIHN0YXR1cyByZWNlaXZlZCBmcm9tIEFVRFBQVEFTSyAqLwotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19TTEVFUAkwCi0jZGVmaW5lCSBBVURQUF9ERUNfU1RBVFVTX0lOSVQgIDEKLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfQ0ZHICAgMgotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19QTEFZICAzCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX0VPUyAgIDUKLQotLyogd29yc3QgY2FzZSBkZWxheSBvZiAzc2VjcygzMDAwbXMpIGZvciBBViBTeW5jIFF1ZXJ5IHJlc3BvbnNlICovCi0jZGVmaW5lIEFWU1lOQ19FVkVOVF9USU1FT1VUIDMwMDAKLQotc3RydWN0IGJ1ZmZlciB7Ci0Jdm9pZCAqZGF0YTsKLQl1bnNpZ25lZCBzaXplOwotCXVuc2lnbmVkIHVzZWQ7CQkvKiBJbnB1dCB1c2FnZSBhY3R1YWwgRFNQIHByb2R1Y2VkIFBDTSBzaXplICAqLwotCXVuc2lnbmVkIGFkZHI7Ci19Owotc3RydWN0IGF1ZGlvOwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0cnVjdCBhdWRpb19zdXNwZW5kX2N0bCB7Ci0Jc3RydWN0IGVhcmx5X3N1c3BlbmQgbm9kZTsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvOwotfTsKLSNlbmRpZgotCi1zdHJ1Y3QgY29kZWNfb3BlcmF0aW9ucyB7Ci0JbG9uZyAoKmlvY3RsKShzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwotCXZvaWQgKCphZGVjX3BhcmFtcykoc3RydWN0IGF1ZGlvICopOwotfTsKLQotc3RydWN0IGF1ZGlvIHsKLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JdWludDhfdCBvdXRfbmVlZGVkOyAvKiBudW1iZXIgb2YgYnVmZmVycyB0aGUgZHNwIGlzIHdhaXRpbmcgZm9yICovCi0Jc3RydWN0IGxpc3RfaGVhZCBvdXRfcXVldWU7IC8qIHF1ZXVlIHRvIHJldGFpbiBvdXRwdXQgYnVmZmVycyAqLwotCWF0b21pY190IG91dF9ieXRlczsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtdXRleCB3cml0ZV9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlX3dhaXQ7Ci0KLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICphdWRwbGF5OwotCi0JLyogY29uZmlndXJhdGlvbiB0byB1c2Ugb24gbmV4dCBlbmFibGUgKi8KLQl1aW50MzJfdCBvdXRfc2FtcGxlX3JhdGU7Ci0JdWludDMyX3Qgb3V0X2NoYW5uZWxfbW9kZTsKLQl1aW50MzJfdCBvdXRfYml0czsgLyogYml0cyBwZXIgc2FtcGxlICh1c2VkIGJ5IFBDTSBkZWNvZGVyKSAqLwotCi0JLyogZGF0YSBhbGxvY2F0ZWQgZm9yIHZhcmlvdXMgYnVmZmVycyAqLwotCWNoYXIgKmRhdGE7Ci0JaW50MzJfdCBwaHlzOyAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHdyaXRlIGJ1ZmZlciAqLwotCi0JdWludDMyX3QgZHJ2X3N0YXR1czsKLQlpbnQgd2ZsdXNoOyAvKiBXcml0ZSBmbHVzaCAqLwotCWludCBvcGVuZWQ7Ci0JaW50IGVuYWJsZWQ7Ci0JaW50IHJ1bm5pbmc7Ci0JaW50IHN0b3BwZWQ7IC8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQlpbnQgYnVmX3JlZnJlc2g7Ci0JaW50IHRlb3M7IC8qIHZhbGlkIG9ubHkgaWYgdHVubmVsIG1vZGUgJiBubyBkYXRhIGxlZnQgZm9yIGRlY29kZXIgKi8KLQllbnVtIG1zbV9hdWRfZGVjb2Rlcl9zdGF0ZSBkZWNfc3RhdGU7CS8qIFJlcHJlc2VudHMgZGVjb2RlciBzdGF0ZSAqLwotCWludCByZXNlcnZlZDsgLyogQSBieXRlIGlzIGJlaW5nIHJlc2VydmVkICovCi0JY2hhciByc3ZfYnl0ZTsgLyogSGFuZGxlIG9kZCBsZW5ndGggdXNlciBkYXRhICovCi0KLQljb25zdCBjaGFyICptb2R1bGVfbmFtZTsKLQl1bnNpZ25lZCBxdWV1ZV9pZDsKLQl1aW50MTZfdCBkZWNfaWQ7Ci0JdWludDMyX3QgcmVhZF9wdHJfb2Zmc2V0OwotCWludDE2X3Qgc291cmNlOwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQlzdHJ1Y3QgYXVkaW9fc3VzcGVuZF9jdGwgc3VzcGVuZF9jdGw7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLSNlbmRpZgotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfZXZlbnRfcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBldmVudF9xdWV1ZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF93YWl0OwotCXNwaW5sb2NrX3QgZXZlbnRfcXVldWVfbG9jazsKLQlzdHJ1Y3QgbXV0ZXggZ2V0X2V2ZW50X2xvY2s7Ci0JaW50IGV2ZW50X2Fib3J0OwotCS8qIEFWIHN5bmMgSW5mbyAqLwotCWludCBhdnN5bmNfZmxhZzsgICAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgZmVlZGJhY2sgZnJvbSBEU1AgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBhdnN5bmNfd2FpdDsvKiBXYWl0IHF1ZXVlIGZvciBBViBTeW5jIE1lc3NhZ2UgICAgICovCi0JLyogZmxhZ3MsIDQ4IGJpdHMgc2FtcGxlL2J5dGVzIGNvdW50ZXIgcGVyIGNoYW5uZWwgKi8KLQl1aW50MTZfdCBhdnN5bmNbQVVEUFBfQVZTWU5DX0NIX0NPVU5UICogQVVEUFBfQVZTWU5DX05VTV9XT1JEUyArIDFdOwotCi0JdWludDMyX3QgZGV2aWNlX2V2ZW50czsKLQl1aW50MzJfdCBkZXZpY2Vfc3dpdGNoOyAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIGRldmljZSBzd2l0Y2ggKi8KLQl1aW50NjRfdCBieXRlY291bnRfY29uc3VtZWQ7Ci0JdWludDY0X3QgYnl0ZWNvdW50X2hlYWQ7Ci0JdWludDY0X3QgYnl0ZWNvdW50X2dpdmVuOwotCXVpbnQ2NF90IGJ5dGVjb3VudF9xdWVyeTsKLQotCXN0cnVjdCBsaXN0X2hlYWQgaW9uX3JlZ2lvbl9xdWV1ZTsgLyogcHJvdGVjdGVkIGJ5IGxvY2sgKi8KLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50OwotCi0JaW50IGVxX2VuYWJsZTsKLQlpbnQgZXFfbmVlZHNfY29tbWl0OwotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfZXFhbGl6ZXIgZXE7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUgdm9sX3BhbjsKLQotCXVuc2lnbmVkIGludCBtaW5vcl9ubzsKLQlzdHJ1Y3QgY29kZWNfb3BlcmF0aW9ucyBjb2RlY19vcHM7Ci0JdWludDMyX3QgYnVmZmVyX3NpemU7Ci0JdWludDMyX3QgYnVmZmVyX2NvdW50OwotfTsKLQotI2VuZGlmIC8qICFDT0RFQ19VVElMU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9scGEuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2xwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWQ5YWIxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL2xwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2lmbmRlZiBfX01BQ0hfUURTUDVfVjJfTFBBX0hfXwotI2RlZmluZSBfX01BQ0hfUURTUDVfVjJfTFBBX0hfXwotCi0jZGVmaW5lIExQQV9PVVRQVVRfSU5URl9XQl9DT0RFQyAzCi0jZGVmaW5lIExQQV9PVVRQVVRfSU5URl9TREFDICAgICAxCi0jZGVmaW5lIExQQV9PVVRQVVRfSU5URl9NSTJTICAgICAyCi0KLXN0cnVjdCBscGFfY29kZWNfY29uZmlnIHsKLQl1aW50MzJfdCBzYW1wbGVfcmF0ZTsKLQl1aW50MzJfdCBzYW1wbGVfd2lkdGg7Ci0JdWludDMyX3Qgb3V0cHV0X2ludGVyZmFjZTsKLQl1aW50MzJfdCBudW1fY2hhbm5lbHM7Ci19OwotCi1zdHJ1Y3QgbHBhX2RydjsKLQotc3RydWN0IGxwYV9kcnYgKmxwYV9nZXQodm9pZCk7Ci12b2lkIGxwYV9wdXQoc3RydWN0IGxwYV9kcnYgKmxwYSk7Ci1pbnQgbHBhX2NtZF9jb2RlY19jb25maWcoc3RydWN0IGxwYV9kcnYgKmxwYSwKLQlzdHJ1Y3QgbHBhX2NvZGVjX2NvbmZpZyAqY29uZmlnX3B0cik7Ci1pbnQgbHBhX2NtZF9lbmFibGVfY29kZWMoc3RydWN0IGxwYV9kcnYgKmxwYSwgYm9vbCBlbmFibGUpOwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvbHBhX2h3LmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9scGFfaHcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViNGFlZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9scGFfaHcuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaWZuZGVmIF9fTUFDSF9RRFNQNV9WMl9MUEFfSFdfSF9fCi0jZGVmaW5lIF9fTUFDSF9RRFNQNV9WMl9MUEFfSFdfSF9fCi0KLSNkZWZpbmUgTFBBX01BWF9CVUZfU0laRSAweDMwMDAwCi0KLS8qIExQQSBPdXRwdXQgY29uZmlnIHJlZ2lzdGVycyAqLwotZW51bSB7Ci0JTFBBX09CVUZfQ09OVFJPTAk9IDB4MDAwMDAwMDAsCi0JTFBBX09CVUZfQ09ERUMJCT0gMHgwMDAwMDAwNCwKLQlMUEFfT0JVRl9ITEJfTUlOX0FERFIJPSAweDAwMDAwMDA4LAotCUxQQV9PQlVGX0hMQl9NQVhfQUREUgk9IDB4MDAwMDAwMEMsCi0JTFBBX09CVUZfSExCX1dQVFIJPSAweDAwMDAwMDEwLAotCUxQQV9PQlVGX0hMQl9WT0xVTUVfQ09OVFJPTCA9IDB4MDAwMDAwMTQsCi0JTFBBX09CVUZfTExCX01JTl9BRERSCT0gMHgwMDAwMDAxOCwKLQlMUEFfT0JVRl9MTEJfTUFYX0FERFIJPSAweDAwMDAwMDFDLAotCUxQQV9PQlVGX1NCX01JTl9BRERSCT0gMHgwMDAwMDAyMCwKLQlMUEFfT0JVRl9TQl9NQVhfQUREUgk9IDB4MDAwMDAwMjQsCi0JTFBBX09CVUZfSU5UUl9FTkFCTEUJPSAweDAwMDAwMDI4LAotCUxQQV9PQlVGX0lOVFJfU1RBVFVTCT0gMHgwMDAwMDAyQywKLQlMUEFfT0JVRl9XTUFSS19BU1NJR04JPSAweDAwMDAwMDMwLAotCUxQQV9PQlVGX1dNQVJLXzBfTExCCT0gMHgwMDAwMDAzNCwKLQlMUEFfT0JVRl9XTUFSS18xX0xMQgk9IDB4MDAwMDAwMzgsCi0JTFBBX09CVUZfV01BUktfMl9MTEIJPSAweDAwMDAwMDNDLAotCUxQQV9PQlVGX1dNQVJLXzNfTExCCT0gMHgwMDAwMDA0MCwKLQlMUEFfT0JVRl9XTUFSS19ITEIJPSAweDAwMDAwMDQ0LAotCUxQQV9PQlVGX1dNQVJLX1NCCT0gMHgwMDAwMDA0OCwKLQlMUEFfT0JVRl9SRFBUUl9MTEIJPSAweDAwMDAwMDRDLAotCUxQQV9PQlVGX1JEUFRSX0hMQgk9IDB4MDAwMDAwNTAsCi0JTFBBX09CVUZfV1JQVFJfU0IJPSAweDAwMDAwMDU0LAotCUxQQV9PQlVGX1VUQ19DT05GSUcJPSAweDAwMDAwMDU4LAotCUxQQV9PQlVGX1VUQ19JTlRSX0xPVwk9IDB4MDAwMDAwNUMsCi0JTFBBX09CVUZfVVRDX0lOVFJfSElHSAk9IDB4MDAwMDAwNjAsCi0JTFBBX09CVUZfVVRDX0xPVwk9IDB4MDAwMDAwNjQsCi0JTFBBX09CVUZfVVRDX0hJR0gJPSAweDAwMDAwMDY4LAotCUxQQV9PQlVGX01JU1IJCT0gMHgwMDAwMDA2QywKLQlMUEFfT0JVRl9TVEFUVVMJCT0gMHgwMDAwMDA3MCwKLQlMUEFfT0JVRl9BQ0sJCT0gMHgwMDAwMDA3NCwKLQlMUEFfT0JVRl9NRU1PUllfQ09OVFJPTAk9IDB4MDAwMDAwNzgsCi0JTFBBX09CVUZfTUVNT1JZX1NUQVRVUwk9IDB4MDAwMDAwN0MsCi0JTFBBX09CVUZfTUVNT1JZX1RJTUVfQ09OVFJPTAk9IDB4MDAwMDAwODAsCi0JTFBBX09CVUZfQUNDX0xWCQkJPSAweDAwMDAwMDg0LAotCUxQQV9PQlVGX0FDQ19IVgkJCT0gMHgwMDAwMDA4YywKLQlMUEFfT0JVRl9SRVNFVFMJCQk9IDB4MDAwMDAwOTAsCi0JTFBBX09CVUZfVEVTVEJVUwkJPSAweDAwMDAwMDk0LAotfTsKLQotLyogT0JVRl9DT0RFQyBkZWZpbml0aW9uICovCi0jZGVmaW5lIExQQV9PQlVGX0NPREVDX1JFU0VSVkVEMzFfMjJfQk1TSyAgICAgICAgMHhmZmMwMDAwMAotI2RlZmluZSBMUEFfT0JVRl9DT0RFQ19SRVNFUlZFRDMxXzIyX1NIRlQgICAgICAgIDB4MTYKLSNkZWZpbmUgTFBBX09CVUZfQ09ERUNfTE9BRF9CTVNLICAgICAgICAgICAgICAgICAweDIwMDAwMAotI2RlZmluZSBMUEFfT0JVRl9DT0RFQ19MT0FEX1NIRlQgICAgICAgICAgICAgICAgIDB4MTUKLSNkZWZpbmUgTFBBX09CVUZfQ09ERUNfQ09ERUNfSU5URl9FTl9CTVNLICAgICAgICAweDEwMDAwMAotI2RlZmluZSBMUEFfT0JVRl9DT0RFQ19DT0RFQ19JTlRGX0VOX1NIRlQgICAgICAgIDB4MTQKLSNkZWZpbmUgTFBBX09CVUZfQ09ERUNfU0FNUF9CTVNLICAgICAgICAgICAgICAgICAweGYwMDAwCi0jZGVmaW5lIExQQV9PQlVGX0NPREVDX1NBTVBfU0hGVCAgICAgICAgICAgICAgICAgMHgxMAotI2RlZmluZSBMUEFfT0JVRl9DT0RFQ19CSVRTX1BFUl9DSEFOX0JNU0sgICAgICAgIDB4YzAwMAotI2RlZmluZSBMUEFfT0JVRl9DT0RFQ19CSVRTX1BFUl9DSEFOX1NIRlQgICAgICAgIDB4ZQotI2RlZmluZSBMUEFfT0JVRl9DT0RFQ19SRVNFUlZFRF8xM183X0JNU0sgICAgICAgIDB4M2Y4MAotI2RlZmluZSBMUEFfT0JVRl9DT0RFQ19SRVNFUlZFRF8xM183X1NIRlQgICAgICAgIDB4NwotI2RlZmluZSBMUEFfT0JVRl9DT0RFQ19JTlRGX0JNU0sgICAgICAgICAgICAgICAgIDB4NzAKLSNkZWZpbmUgTFBBX09CVUZfQ09ERUNfSU5URl9TSEZUICAgICAgICAgICAgICAgICAweDQKLSNkZWZpbmUgTFBBX09CVUZfQ09ERUNfTlVNX0NIQU5fQk1TSyAgICAgICAgICAgICAweGYKLSNkZWZpbmUgTFBBX09CVUZfQ09ERUNfTlVNX0NIQU5fU0hGVCAgICAgICAgICAgICAwCi0KLS8qIE9CVUZfQ09OVFJPTCBkZWZpbml0aW9uICovCi0jZGVmaW5lIExQQV9PQlVGX0NPTlRST0xfUkVTRVJWRUQzMV85X0JNU0sgICAgICAgMHhmZmZmZmUwMAotI2RlZmluZSBMUEFfT0JVRl9DT05UUk9MX1JFU0VSVkVEMzFfOV9TSEZUICAgICAgIDB4OQotI2RlZmluZSBMUEFfT0JVRl9DT05UUk9MX1RFU1RfRU5fQk1TSyAgICAgICAgICAgIDB4MTAwCi0jZGVmaW5lIExQQV9PQlVGX0NPTlRST0xfVEVTVF9FTl9TSEZUICAgICAgICAgICAgMHg4Ci0jZGVmaW5lIExQQV9PQlVGX0NPTlRST0xfTExCX0NMUl9DTURfQk1TSyAgICAgICAgMHg4MAotI2RlZmluZSBMUEFfT0JVRl9DT05UUk9MX0xMQl9DTFJfQ01EX1NIRlQgICAgICAgIDB4NwotI2RlZmluZSBMUEFfT0JVRl9DT05UUk9MX1NCX1NBVF9FTl9CTVNLICAgICAgICAgIDB4NDAKLSNkZWZpbmUgTFBBX09CVUZfQ09OVFJPTF9TQl9TQVRfRU5fU0hGVCAgICAgICAgICAweDYKLSNkZWZpbmUgTFBBX09CVUZfQ09OVFJPTF9MTEJfU0FUX0VOX0JNU0sgICAgICAgICAweDIwCi0jZGVmaW5lIExQQV9PQlVGX0NPTlRST0xfTExCX1NBVF9FTl9TSEZUICAgICAgICAgMHg1Ci0jZGVmaW5lIExQQV9PQlVGX0NPTlRST0xfUkVTRVJWRUQ0X0JNU0sgICAgICAgICAgMHgxMAotI2RlZmluZSBMUEFfT0JVRl9DT05UUk9MX1JFU0VSVkVENF9TSEZUICAgICAgICAgIDB4NAotI2RlZmluZSBMUEFfT0JVRl9DT05UUk9MX0xMQl9BQ0NfRU5fQk1TSyAgICAgICAgIDB4OAotI2RlZmluZSBMUEFfT0JVRl9DT05UUk9MX0xMQl9BQ0NfRU5fU0hGVCAgICAgICAgIDB4MwotI2RlZmluZSBMUEFfT0JVRl9DT05UUk9MX0hMQl9FTl9CTVNLICAgICAgICAgICAgIDB4NAotI2RlZmluZSBMUEFfT0JVRl9DT05UUk9MX0hMQl9FTl9TSEZUICAgICAgICAgICAgIDB4MgotI2RlZmluZSBMUEFfT0JVRl9DT05UUk9MX0xMQl9FTl9CTVNLICAgICAgICAgICAgIDB4MgotI2RlZmluZSBMUEFfT0JVRl9DT05UUk9MX0xMQl9FTl9TSEZUICAgICAgICAgICAgIDB4MQotI2RlZmluZSBMUEFfT0JVRl9DT05UUk9MX1NCX0VOX0JNU0sgICAgICAgICAgICAgIDB4MQotI2RlZmluZSBMUEFfT0JVRl9DT05UUk9MX1NCX0VOX1NIRlQgICAgICAgICAgICAgIDAKLQotLyogT0JVRl9SRVNFVCBkZWZpbml0aW9uICovCi0jZGVmaW5lIExQQV9PQlVGX1JFU0VUU19NSVNSX1JFU0VUIDB4MQotI2RlZmluZSBMUEFfT0JVRl9SRVNFVFNfT1ZFUkFMTF9SRVNFVCAweDIKLQotLyogT0JVRl9TVEFUVVMgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBMUEFfT0JVRl9TVEFUVVNfUkVTRVRfRE9ORSAweDgwMDAwCi0jZGVmaW5lIExQQV9PQlVGX1NUQVRVU19MTEJfQ0xSX0JNU0sgMHg0MDAwMAotI2RlZmluZSBMUEFfT0JVRl9TVEFUVVNfTExCX0NMUl9TSEZUIDB4MTIKLQotLyogT0JVRl9ITEJfTUlOX0FERFIgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBMUEFfT0JVRl9ITEJfTUlOX0FERFJfTE9BRF9CTVNLIDB4NDAwMDAKLSNkZWZpbmUgTFBBX09CVUZfSExCX01JTl9BRERSX1NFR19CTVNLIDB4M2UwMDAKLQotLyogT0JVRl9ITEJfTUFYX0FERFIgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBMUEFfT0JVRl9ITEJfTUFYX0FERFJfU0VHX0JNU0sgMHgzZmZmOAotCi0vKiBPQlVGX0xMQl9NSU5fQUREUiBkZWZpbml0aW9uICovCi0jZGVmaW5lIExQQV9PQlVGX0xMQl9NSU5fQUREUl9MT0FEX0JNU0sgMHg0MDAwMAotI2RlZmluZSBMUEFfT0JVRl9MTEJfTUlOX0FERFJfU0VHX0JNU0sgMHgzZTAwMAotCi0vKiBPQlVGX0xMQl9NQVhfQUREUiBkZWZpbml0aW9uICovCi0jZGVmaW5lIExQQV9PQlVGX0xMQl9NQVhfQUREUl9TRUdfQk1TSyAweDNmZjgKLSNkZWZpbmUgTFBBX09CVUZfTExCX01BWF9BRERSX1NFR19TSEZUIDB4MwotCi0vKiBPQlVGX1NCX01JTl9BRERSIGRlZmluaXRpb24gKi8KLSNkZWZpbmUgTFBBX09CVUZfU0JfTUlOX0FERFJfTE9BRF9CTVNLIDB4NDAwMAotI2RlZmluZSBMUEFfT0JVRl9TQl9NSU5fQUREUl9TRUdfQk1TSyAweDNlMDAKLQotLyogT0JVRl9TQl9NQVhfQUREUiBkZWZpbml0aW9uICovCi0jZGVmaW5lIExQQV9PQlVGX1NCX01BWF9BRERSX1NFR19CTVNLIDB4M2ZmOAotCi0vKiBPQlVGX01FTU9SWV9DT05UUk9MIGRlZmluaXRpb24gKi8KLSNkZWZpbmUgTFBBX09CVUZfTUVNX0NUTF9QV1JVUF9CTVNLIDB4ZmZmCi0jZGVmaW5lIExQQV9PQlVGX01FTV9DVExfUFdSVVBfU0hGVCAweDAKLQotLyogT0JVRl9JTlRSX0VOQUJMRSBkZWZpbml0aW9uICovCi0jZGVmaW5lIExQQV9PQlVGX0lOVFJfRU5fQk1TSyAweDMKLQotLyogT0JVRl9XTUFSS19BU1NJR04gZGVmaW5pdGlvbiAqLwotI2RlZmluZSBMUEFfT0JVRl9XTUFSS19BU1NJR05fQk1TSyAweEYKLSNkZWZpbmUgTFBBX09CVUZfV01BUktfQVNTSUdOX0RPTkUgMHhGCi0KLS8qIE9CVUZfV01BUktfbl9MTEIgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBMUEFfT0JVRl9XTUFSS19uX0xMQl9BRERSKG4pICAoMHgwMDAwMDAzNCArIDB4NCAqIChuKSkKLSNkZWZpbmUgTFBBX09CVUZfTExCX1dNQVJLX0NUUkxfQk1TSyAweGMwMDAwCi0jZGVmaW5lIExQQV9PQlVGX0xMQl9XTUFSS19DVFJMX1NIRlQgMHgxMgotI2RlZmluZSBMUEFfT0JVRl9MTEJfV01BUktfTUFQX0JNU0sgIDB4ZjAwMDAwCi0jZGVmaW5lIExQQV9PQlVGX0xMQl9XTUFSS19NQVBfU0hGVCAgMHgxNAotCi0vKiBPQlVGX1dNQVJLX1NCIGRlZmluaXRpb24gKi8KLSNkZWZpbmUgTFBBX09CVUZfU0JfV01BUktfQ1RSTF9CTVNLIDB4YzAwMDAKLSNkZWZpbmUgTFBBX09CVUZfU0JfV01BUktfQ1RSTF9TSEZUIDB4MTIKLSNkZWZpbmUgTFBBX09CVUZfU0JfV01BUktfTUFQX0JNU0sgIDB4ZjAwMDAwCi0jZGVmaW5lIExQQV9PQlVGX1NCX1dNQVJLX01BUF9TSEZUICAweDE0Ci0KLS8qIE9CVUZfV01BUktfSExCIGRlZmluaXRpb24gKi8KLSNkZWZpbmUgTFBBX09CVUZfSExCX1dNQVJLX0NUUkxfQk1TSyAweGMwMDAwCi0jZGVmaW5lIExQQV9PQlVGX0hMQl9XTUFSS19DVFJMX1NIRlQgMHgxMgotI2RlZmluZSBMUEFfT0JVRl9ITEJfV01BUktfTUFQX0JNU0sgIDB4ZjAwMDAwCi0jZGVmaW5lIExQQV9PQlVGX0hMQl9XTUFSS19NQVBfU0hGVCAgMHgxNAotCi0vKiBPQlVGX1VUQ19DT05GSUcgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBMUEFfT0JVRl9VVENfQ09ORklHX01BUF9CTVNLIDB4ZjAKLSNkZWZpbmUgTFBBX09CVUZfVVRDX0NPTkZJR19NQVBfU0hGVCAweDQKLSNkZWZpbmUgTFBBX09CVUZfVVRDX0NPTkZJR19FTl9CTVNLICAweDEKLSNkZWZpbmUgTFBBX09CVUZfVVRDX0NPTkZJR19FTl9TSEZUICAwCi0jZGVmaW5lIExQQV9PQlVGX1VUQ19DT05GSUdfTk9fSU5UUiAweEYKLQotLyogT0JVRl9BQ0sgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBMUEFfT0JVRl9BQ0tfUkVTRVRfRE9ORV9CTVNLICAgMHg4MDAwMAotI2RlZmluZSBMUEFfT0JVRl9BQ0tfUkVTRVRfRE9ORV9TSEZUICAgMHgxMwotZW51bSB7Ci0JTFBBX1NBTVBMRV9SQVRFXzhLSFoJCT0gMHgwMDAwLAotCUxQQV9TQU1QTEVfUkFURV8xMVAwMjVLSFoJPSAweDAwMDEsCi0JTFBBX1NBTVBMRV9SQVRFXzE2S0haCQk9IDB4MDAwMiwKLQlMUEFfU0FNUExFX1JBVEVfMjJQMDVLSFoJPSAweDAwMDMsCi0JTFBBX1NBTVBMRV9SQVRFXzMyS0haCQk9IDB4MDAwNCwKLQlMUEFfU0FNUExFX1JBVEVfNDRQMUtIWgkJPSAweDAwMDUsCi0JTFBBX1NBTVBMRV9SQVRFXzQ4S0haCQk9IDB4MDAwNiwKLQlMUEFfU0FNUExFX1JBVEVfNjRLSFoJCT0gMHgwMDA3LAotCUxQQV9TQU1QTEVfUkFURV85NktIWgkJPSAweDAwMDgsCi19OwotCi1lbnVtIHsKLQlMUEFfQklUU19QRVJfQ0hBTl8xNkJJVFMJPSAweDAwMDAsCi0JTFBBX0JJVFNfUEVSX0NIQU5fMjRCSVRTCT0gMHgwMDAxLAotCUxQQV9CSVRTX1BFUl9DSEFOXzMyQklUUwk9IDB4MDAwMiwKLQlMUEFfQklUU19QRVJfQ0hBTl9SRVNFUlZFRAk9IDB4MDAwMywKLX07Ci0KLWVudW0gewotCUxQQV9JTlRGX1dCX0NPREVDCQk9IDB4MDAwMCwKLQlMUEFfSU5URl9TREFDCQkJPSAweDAwMDEsCi0JTFBBX0lOVEZfTUkyUwkJCT0gMHgwMDAyLAotCUxQQV9JTlRGX1JFU0VSVkVECQk9IDB4MDAwMywKLX07Ci0KLWVudW0gewotCUxQQV9CVUZfSURfSExCLCAgIC8qIEhMQiBidWZmZXIgKi8KLQlMUEFfQlVGX0lEX0xMQiwgICAvKiBMTEIgYnVmZmVyICovCi0JTFBBX0JVRl9JRF9TQiwgICAgLyogU0IgYnVmZmVyICovCi0JTFBBX0JVRl9JRF9VVEMsCi19OwotCi0vKiBXQl9DT0RFQyAmIFNEQUMgY2FuIG9ubHkgc3VwcG9ydCAxNmJpdCBtb25vL3N0ZXJlby4KLSAqIE1JMlMgY2FuIGJpdCBmb3JtYXQgYW5kIG51bWJlciBvZiBjaGFubmVsCi0gKi8KLWVudW0gewotCUxQQV9OVU1fQ0hBTl9NT05PCQk9IDB4MDAwMCwKLQlMUEFfTlVNX0NIQU5fU1RFUkVPCQk9IDB4MDAwMSwKLQlMUEFfTlVNX0NIQU5fNVAxCQk9IDB4MDAwMiwKLQlMUEFfTlVNX0NIQU5fN1AxCQk9IDB4MDAwMywKLQlMUEFfTlVNX0NIQU5fNF9DSEFOTkVMCQk9IDB4MDAwNCwKLX07Ci0KLWVudW0gewotCUxQQV9XTUFSS19DVExfRElTQUJMRUQgPSAweDAsCi0JTFBBX1dNQVJLX0NUTF9OT05fQkxPQ0sgPSAweDEsCi0JTFBBX1dNQVJLX0NUTF9aRVJPX0lOU0VSVCA9IDB4MiwKLQlMUEFfV01BUktfQ1RMX1JFU0VSVkVEID0gMHgzCi19OwotCi1zdHJ1Y3QgbHBhX21lbV9iYW5rX3NlbGVjdCB7Ci0gIHUzMiAgICBiMDoxOyAgICAgICAvKlJBTSBiYW5rIDAgMTZLQj0yS3g2NCgwKSAqLwotICB1MzIgICAgYjE6MTsgICAgICAgLypSQU0gYmFuayAxIDE2S0I9Mkt4NjQoMCkgKi8KLSAgdTMyICAgIGIyOjE7ICAgICAgIC8qUkFNIGJhbmsgMiAxNktCPTJLeDY0KDApICovCi0gIHUzMiAgICBiMzoxOyAgICAgICAvKlJBTSBiYW5rIDMgMTZLQj0yS3g2NCgwKSAqLwotICB1MzIgICAgYjQ6MTsgICAgICAgLypSQU0gYmFuayA0IDE2S0I9Mkt4NjQoMSkgKi8KLSAgdTMyICAgIGI1OjE7ICAgICAgIC8qUkFNIGJhbmsgNSAxNktCPTJLeDY0KDEpICovCi0gIHUzMiAgICBiNjoxOyAgICAgICAvKlJBTSBiYW5rIDYgMTZLQj0yS3g2NCgxKSAqLwotICB1MzIgICAgYjc6MTsgICAgICAgLypSQU0gYmFuayA3IDE2S0I9Mkt4NjQoMSkgKi8KLSAgdTMyICAgIGI4OjE7ICAgICAgIC8qUkFNIGJhbmsgOCAxNktCPTRLeDMyKDApICovCi0gIHUzMiAgICBiOToxOyAgICAgICAvKlJBTSBiYW5rIDkgMTZLQj00S3gzMigxKSAqLwotICB1MzIgICAgYjEwOjE7ICAgICAgLypSQU0gYmFuayAxMCAxNktCPTRLeDMyKDIpICovCi0gIHUzMiAgICBsbGI6MTsgICAgICAvKlJBTSBiYW5rIDExIDE2S0I9NEt4MzIoMykgKi8KLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvbWFyaW1iYV9wcm9maWxlLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9tYXJpbWJhX3Byb2ZpbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U0NTVhMS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9tYXJpbWJhX3Byb2ZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyMDEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsICBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2lmbmRlZiBfX01BQ0hfUURTUDVfVjJfTUFSSU1CQV9QUk9GSUxFX0hfXwotI2RlZmluZSBfX01BQ0hfUURTUDVfVjJfTUFSSU1CQV9QUk9GSUxFX0hfXwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotCQkJCUhhbmRzZXQKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBIQU5EU0VUX1JYXzgwMDBfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAgMHgwMiwgIDB4MDIpfSwgIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjQsIDB4NkYsIDB4NDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MDQsIDB4ZmYsIDB4OEMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4NEUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjUsIDB4MEYsIDB4MGIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjYsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzYsIDB4YzAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4RkYsIDB4MkIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZmYsIDB4MjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2QsIDB4RkYsIDB4RDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MjEsIDB4MjEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDI3MTB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg0MCwgMHg0MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwNSwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNiwgMHhjMCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg0MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIEhBTkRTRVRfUlhfMTYwMDBfT1NSXzI1NiBIQU5EU0VUX1JYXzgwMDBfT1NSXzI1NgotCi0jZGVmaW5lIEhBTkRTRVRfUlhfNDgwMDBfT1NSXzY0XAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjQsIDB4NkYsIDB4NDcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MDQsIDB4ZkYsIDB4OEMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4NDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjUsIDB4MEYsIDB4MGIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjYsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzYsIDB4YzAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4RkYsIDB4MkIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZmYsIDB4MjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2QsIDB4RkYsIDB4RDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MjEsIDB4MjEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDI3MTB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg0MCwgMHg0MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwNSwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNiwgMHhjMCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg0MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIEhBTkRTRVRfUlhfNDgwMDBfT1NSXzI1NlwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI0LCAweDZGLCAweDQ0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDA0LCAweGZGLCAweDhDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgxLCAweEZGLCAweDRlKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI1LCAweDBGLCAweDBiKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI2LCAweGZjLCAweGZjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM2LCAweGMwLCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNBLCAweEZGLCAweDJCKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDIzLCAweGZmLCAweDIwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNkLCAweEZGLCAweDU1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDIxLCAweDIxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgyNzEwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4NDAsIDB4NDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MDUsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDEsIDB4MDEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzYsIDB4YzAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4NDAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBIQU5EU0VUX1RYXzgwMDBfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MzAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTEsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTMsIDB4ZmMsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTQsIDB4ZmYsIDB4NjUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTUsIDB4ZmYsIDB4NjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODIsIDB4ZmYsIDB4NUUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTAsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGMCwgMHhkMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4YmI4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MTQsIDB4MTQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGIsIDB4ZmYsIDB4RTYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGMsIDB4MDMsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODYsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4NTAsIDB4NDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MTAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEQsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MTQsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBIQU5EU0VUX1RYXzE2MDAwX09TUl8yNTYgSEFORFNFVF9UWF84MDAwX09TUl8yNTYKLQotI2RlZmluZSBIQU5EU0VUX1RYXzQ4MDAwX09TUl8yNTYgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAxLCAweDAxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAxLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDMwLCAweDMwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDExLCAweGZjLCAweGZjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEzLCAweGZjLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDE0LCAweGZmLCAweDY1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDE1LCAweGZmLCAweDY0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgyLCAweGZmLCAweDVBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEwLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEQsIDB4RjAsIDB4ZDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweGJiOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDE0LCAweDE0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhiLCAweGZmLCAweEU2KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhjLCAweDAzLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg2LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDUwLCAweDQwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDEwLCAweDMwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBELCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDE0LCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTEsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0JCQkJSGVhZHNldAotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLSNkZWZpbmUgSEVBRFNFVF9TVEVSRU9fVFhfODAwMF9PU1JfMjU2XAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAxLCAweDAxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAxLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDMwLCAweDMwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDExLCAweGZjLCAweGZjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEyLCAweGZjLCAweGZjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEzLCAweGZjLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDE0LCAweGZkLCAweDY1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDE1LCAweGZmLCAweDY0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgyLCAweEZGLCAweDVFKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEwLCAweEZGLCAweDY0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEUsIDB4RTgsIDB4RTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEQsIDB4RjAsIDB4RDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweGJiOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDFjLCAweDFjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhiLCAweGZmLCAweEU3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhjLCAweDAzLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg3LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg2LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweEYwLCAweEYwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDMwLCAweDMwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBlLCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBkLCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDFjLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTIsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgSEVBRFNFVF9TVEVSRU9fVFhfMTYwMDBfT1NSXzI1NiBIRUFEU0VUX1NURVJFT19UWF84MDAwX09TUl8yNTYKLQotI2RlZmluZSBIRUFEU0VUX1NURVJFT19UWF80ODAwMF9PU1JfNjRcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MzAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTEsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTIsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTMsIDB4ZmMsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTQsIDB4ZmQsIDB4NjUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTUsIDB4ZmMsIDB4NjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODIsIDB4RkYsIDB4NDYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTAsIDB4RkYsIDB4NjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRSwgMHhFOCwgMHhFOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGMCwgMHhEMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4YmI4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MWMsIDB4MWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGIsIDB4ZmYsIDB4RTcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGMsIDB4MDMsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODcsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODYsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4RjAsIDB4RjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MzAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MGUsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MGQsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MWMsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMiwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBIRUFEU0VUX1NURVJFT19UWF80ODAwMF9PU1JfMjU2XAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GQUxTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAxLCAweDAxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAxLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDMwLCAweDMwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDExLCAweGZjLCAweGZjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEyLCAweGZjLCAweGZjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEzLCAweGZjLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDE0LCAweGZkLCAweDY1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDE1LCAweGZjLCAweDY0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgyLCAweGZmLCAweDVBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEwLCAweEZGLCAweDY0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEUsIDB4RTgsIDB4RTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEQsIDB4RjAsIDB4RDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweGJiOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDFjLCAweDFjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhiLCAweGZmLCAweEU3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhjLCAweDAzLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg3LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg2LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweEYwLCAweEYwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDMwLCAweDMwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBlLCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBkLCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDFjLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTIsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgSEVBRFNFVF9NT05PX1RYXzE2MDAwX09TUl8yNTZcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCAgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksICBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCAgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDMwLCAweDMwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksICBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCAgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTMsIDB4ZmMsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDE0LCAweGZmLCAweDY1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksICBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxNSwgMHhmYywgMHg2NCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCAgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODIsIDB4RkYsIDB4NUUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEwLCAweEZGLCAweDY0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksICBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGZiwgMHhjOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsICAweGJiOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksICBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgxNCwgMHgxNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCAgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGIsIDB4ZmYsIDB4RTcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhjLCAweDAzLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksICBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NiwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCAgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4NTAsIDB4NDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCAgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksICBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgxMCwgMHgxMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCAgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEQsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDE0LCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksICBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsICBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgSEVBRFNFVF9NT05PX1RYXzgwMDBfT1NSXzI1NiBIRUFEU0VUX01PTk9fVFhfMTYwMDBfT1NSXzI1NgotCi0jZGVmaW5lIEhFQURTRVRfTU9OT19UWF80ODAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMSwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgzMCwgMHgzMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMywgMHhmYywgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxNCwgMHhmZiwgMHg2NSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxNSwgMHhmZiwgMHg2NCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MiwgMHhmZiwgMHg1QSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMCwgMHhGRiwgMHg2NCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBELCAweEZGLCAweEM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHhiYjh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgxNCwgMHgxNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YiwgMHhmZiwgMHhFNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YywgMHgwMywgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NiwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHg1MCwgMHg0MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgxMCwgMHgxMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgxNCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDExLCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIEhFQURTRVRfUlhfQ0FQTEVTU184MDAwX09TUl8yNTZcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHg0RSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwNCwgMHhmZiwgMHhCQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNCwgMHg2RiwgMHg2NCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNSwgMHgwRiwgMHgwYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNiwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOCwgMHhmZiwgMHhhMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQSwgMHhGRiwgMHhlYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgyMywgMHgyMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHhmMCwgMHhmMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmZiwgMHgyMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwZiwgMHgwYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYiwgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHhmMCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIEhFQURTRVRfUlhfQ0FQTEVTU180ODAwMF9PU1JfNjQgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4NDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MDQsIDB4ZmYsIDB4QkMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjQsIDB4NkYsIDB4NjcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjUsIDB4MEYsIDB4MGIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjYsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzgsIDB4ZmYsIDB4YTIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4RkYsIDB4YWIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MjMsIDB4MjMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4ZjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZmYsIDB4MjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBIRUFEU0VUX1JYX0NBUExFU1NfNDgwMDBfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHg0ZSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwNCwgMHhmZiwgMHhCQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNCwgMHg2RiwgMHg2NCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNSwgMHgwRiwgMHgwQil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNiwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOCwgMHhmZiwgMHhhMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQSwgMHhGRiwgMHhhYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgyMywgMHgyMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHhmMCwgMHhmMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmZiwgMHgyMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwZiwgMHgwYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYiwgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHhmMCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0KLSNkZWZpbmUgSEVBRFNFVF9SWF9MRUdBQ1lfODAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweGFjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweGFjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgxLCAweEZGLCAweDRFKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDA0LCAweGZmLCAweEJDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI0LCAweDZGLCAweDY0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI1LCAweDBGLCAweDBiKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI2LCAweGZjLCAweGZjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM4LCAweGZmLCAweGEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNBLCAweEZGLCAweDJiKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDIzLCAweDIzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweGYwLCAweGEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgxODZBMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweGYwLCAweGYwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDIzLCAweGZmLCAweDIwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg0LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg1LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDBmLCAweDBjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhhLCAweDAzLCAweDAzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNiLCAweEZGLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweGYwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgSEVBRFNFVF9SWF9MRUdBQ1lfMTYwMDBfT1NSXzI1NiBIRUFEU0VUX1JYX0xFR0FDWV84MDAwX09TUl8yNTYKLQotI2RlZmluZSBIRUFEU0VUX1JYX0xFR0FDWV80ODAwMF9PU1JfNjQgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4NDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MDQsIDB4ZmYsIDB4QkMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjQsIDB4NkYsIDB4NjcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjUsIDB4MEYsIDB4MGIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjYsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzgsIDB4ZmYsIDB4YTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4RkYsIDB4MmIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MjMsIDB4MjMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4YTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDE4NkEwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4ZjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZmYsIDB4MjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4OTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4OTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDg4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDg4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg3OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg3OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg0OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg0OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDI4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDI4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgxOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgxOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotCi0jZGVmaW5lIEhFQURTRVRfUlhfTEVHQUNZXzQ4MDAwX09TUl8yNTYgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4NGUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MDQsIDB4ZmYsIDB4QkMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjQsIDB4NkYsIDB4NjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjUsIDB4MEYsIDB4MEIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjYsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzgsIDB4ZmYsIDB4YTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4RkYsIDB4MmIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MjMsIDB4MjMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4YTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDE4NkEwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4ZjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZmYsIDB4MjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4OTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4OTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDg4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDg4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg3OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg3OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg0OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg0OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDI4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDI4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgxOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgxOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBIRUFEU0VUX1JYX0NMQVNTX0RfTEVHQUNZXzgwMDBfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHgwZSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmOCwgMHhBOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyOCwgMHhmRiwgMHhDQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyOSwgMHhmRiwgMHhDQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOSwgMHg1MCwgMHg1MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MCwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MSwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MiwgMHhGRiwgMHhGRil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MywgMHhGRiwgMHhjNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRSwgMHhGRiwgMHhERCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRiwgMHhGRiwgMHgwZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NiwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NywgMHhGRiwgMHhjNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0YSwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgyMywgMHgyMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwYSwgMHgwYSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4MTg2QTB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwNSwgMHgwNSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MGYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotCi0jZGVmaW5lIEhFQURTRVRfUlhfQ0xBU1NfRF9MRUdBQ1lfMTEwMjVfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHgwZSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmOCwgMHhBOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyOCwgMHhmRiwgMHhDQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyOSwgMHhmRiwgMHhDQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOSwgMHg1MCwgMHg1MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MCwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MSwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MiwgMHhGRiwgMHhiYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MywgMHhGRiwgMHhjMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRSwgMHhGRiwgMHhERCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRiwgMHhGRiwgMHgwZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NiwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NywgMHhGRiwgMHhjMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0YSwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgyMywgMHgyMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwYSwgMHgwYSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4MTg2QTB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwNSwgMHgwNSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MGYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotCi0jZGVmaW5lIEhFQURTRVRfUlhfQ0xBU1NfRF9MRUdBQ1lfMTYwMDBfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHgwZSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmOCwgMHhBOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyOCwgMHhmRiwgMHhDQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyOSwgMHhmRiwgMHhDQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOSwgMHg1MCwgMHg1MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MCwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MSwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MiwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MywgMHhGRiwgMHhkNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRSwgMHhGRiwgMHhERCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRiwgMHhGRiwgMHgwZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NiwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NywgMHhGRiwgMHhkNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0YSwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgyMywgMHgyMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwYSwgMHgwYSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4MTg2QTB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwNSwgMHgwNSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MGYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotCi0jZGVmaW5lIEhFQURTRVRfUlhfQ0xBU1NfRF9MRUdBQ1lfMjIwNTBfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHgwZSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmOCwgMHhBOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyOCwgMHhmRiwgMHhDQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyOSwgMHhmRiwgMHhDQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOSwgMHg1MCwgMHg1MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MCwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MSwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MiwgMHhGRiwgMHhiYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MywgMHhGRiwgMHhkMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRSwgMHhGRiwgMHhERCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRiwgMHhGRiwgMHgwZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NiwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NywgMHhGRiwgMHhkMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0YSwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgyMywgMHgyMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwYSwgMHgwYSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4MTg2QTB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwNSwgMHgwNSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MGYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotCi0jZGVmaW5lIEhFQURTRVRfQ0xBU1NfRF9MRUdBQ1lfMzIwMDBfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHgwZSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmOCwgMHhBOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyOCwgMHhmRiwgMHhDQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyOSwgMHhmRiwgMHhDQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOSwgMHg1MCwgMHg1MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MCwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MSwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MiwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MywgMHhGRiwgMHhmNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRSwgMHhGRiwgMHhERCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRiwgMHhGRiwgMHgwZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NiwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NywgMHhGRiwgMHhmNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0YSwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgyMywgMHgyMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwYSwgMHgwYSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4MTg2QTB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwNSwgMHgwNSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MGYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBIRUFEU0VUX1JYX0NMQVNTX0RfTEVHQUNZXzQ4MDAwX09TUl82NCBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmOCwgMHhBOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyOCwgMHhmRiwgMHhDQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyOSwgMHhmRiwgMHhDQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOSwgMHg1MCwgMHg1MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MCwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MSwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MiwgMHhGRiwgMHg1NSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MywgMHhGRiwgMHhjNSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRSwgMHhGRiwgMHhERCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRiwgMHhGRiwgMHgwZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NiwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NywgMHhGRiwgMHhjMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0YSwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgyMywgMHgyMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwYSwgMHgwYSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4MTg2QTB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwNSwgMHgwNSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MGYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBIRUFEU0VUX1JYX0NMQVNTX0RfTEVHQUNZXzQ4MDAwX09TUl8yNTYgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweGFjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweGFjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4MGUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZjgsIDB4QTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjgsIDB4ZkYsIDB4Q0EpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjksIDB4ZkYsIDB4Q0EpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzksIDB4NTAsIDB4NTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDAsIDB4RkYsIDB4MDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDEsIDB4RkYsIDB4MDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDIsIDB4RkYsIDB4QkIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDMsIDB4RkYsIDB4RjIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDQsIDB4RkYsIDB4MzcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0UsIDB4RkYsIDB4REQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0YsIDB4RkYsIDB4MGYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDUsIDB4RkYsIDB4ZmYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDYsIDB4RkYsIDB4NzcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDcsIDB4RkYsIDB4RjIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDgsIDB4RkYsIDB4MzcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDksIDB4RkYsIDB4ZmYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NGEsIDB4RkYsIDB4NzcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MjMsIDB4MjMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MGEsIDB4MGEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDE4NkEwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MDUsIDB4MDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4OTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4OTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDg4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDg4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg3OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg3OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg0OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg0OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDI4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDI4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgxOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgxOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg0LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg1LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDBmLCAweDBjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhhLCAweDAzLCAweDAzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNiLCAweEZDLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNjLCAweEZDLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDBmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgSEVBRFNFVF9TVEVSRU9fUlhfQ0FQTEVTU184MDAwX09TUl8yNTYgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4NEUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MDQsIDB4ZmYsIDB4QkMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjQsIDB4NkYsIDB4NjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjUsIDB4MEYsIDB4MGIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjYsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzgsIDB4ZmYsIDB4ODIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4RkYsIDB4ZWIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MjMsIDB4MjMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4ZjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZmYsIDB4MjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBIRUFEU0VUX1NURVJFT19SWF9DQVBMRVNTXzQ4MDAwX09TUl82NCBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHg0Mil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwNCwgMHhmZiwgMHhCQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNCwgMHg2RiwgMHg2Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNSwgMHgwRiwgMHgwYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNiwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOCwgMHhmZiwgMHg4Mil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQSwgMHhGRiwgMHhhYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgyMywgMHgyMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHhmMCwgMHhmMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmZiwgMHgyMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwZiwgMHgwYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYiwgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHhmMCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0KLQotI2RlZmluZSBIRUFEU0VUX1NURVJFT19SWF9DQVBMRVNTXzQ4MDAwX09TUl8yNTYgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4NGUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MDQsIDB4ZmYsIDB4QkMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjQsIDB4NkYsIDB4NjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjUsIDB4MEYsIDB4MEIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjYsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzgsIDB4ZmYsIDB4ODIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4RkYsIDB4YWIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MjMsIDB4MjMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4ODIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4ZjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZmYsIDB4MjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBIRUFEU0VUX1NURVJFT19SWF9MRUdBQ1lfODAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgxLCAweEZGLCAweDRFKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDA0LCAweGZmLCAweEJDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI0LCAweDZGLCAweDY0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI1LCAweDBGLCAweDBiKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI2LCAweGZjLCAweGZjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM4LCAweGZmLCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNBLCAweEZGLCAweDJiKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDIzLCAweDIzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweGYwLCAweGEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgxODZBMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweGYwLCAweGYwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDIzLCAweGZmLCAweDIwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg0LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg1LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDBmLCAweDBjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhhLCAweDAzLCAweDAzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNiLCAweEZGLCAweGFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweGFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweGYwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgSEVBRFNFVF9TVEVSRU9fUlhfTEVHQUNZXzQ4MDAwX09TUl82NCBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHg0Mil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwNCwgMHhmZiwgMHhCQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNCwgMHg2RiwgMHg2Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNSwgMHgwRiwgMHgwYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNiwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOCwgMHhmZiwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQSwgMHhGRiwgMHgyYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgyMywgMHgyMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHhmMCwgMHhhMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4MTg2QTB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHhmMCwgMHhmMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmZiwgMHgyMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgxMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgxMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwZiwgMHgwYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYiwgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHhmMCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIEhFQURTRVRfU1RFUkVPX1JYX0xFR0FDWV80ODAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweGFjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweGFjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgxLCAweEZGLCAweDRlKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDA0LCAweGZmLCAweEJDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI0LCAweDZGLCAweDY0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI1LCAweDBGLCAweDBCKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI2LCAweGZjLCAweGZjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM4LCAweGZmLCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNBLCAweEZGLCAweDJiKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDIzLCAweDIzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweGYwLCAweGEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgxODZBMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweGYwLCAweGYwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDIzLCAweGZmLCAweDIwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg0LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg1LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDBmLCAweDBjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhhLCAweDAzLCAweDAzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNiLCAweEZGLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNjLCAweEZGLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweGYwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgSEVBRFNFVF9TVEVSRU9fUlhfQ0xBU1NfRF9MRUdBQ1lfODAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgxLCAweEZGLCAweDBlKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDIzLCAweGY4LCAweEE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI4LCAweGZGLCAweENBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI5LCAweGZGLCAweENBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM5LCAweDQwLCAweDQwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQwLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQxLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQyLCAweEZGLCAweEZGKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQzLCAweEZGLCAweGM0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ0LCAweEZGLCAweDM3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNFLCAweEZGLCAweEREKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNGLCAweEZGLCAweDBmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ1LCAweEZGLCAweGZmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ2LCAweEZGLCAweDc3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ3LCAweEZGLCAweGM0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ4LCAweEZGLCAweDM3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ5LCAweEZGLCAweGZmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDRhLCAweEZGLCAweDc3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDIzLCAweDIzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDBhLCAweDBhKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgxODZBMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDA1LCAweDA1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwZiwgMHgwYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYiwgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0KLSNkZWZpbmUgSEVBRFNFVF9TVEVSRU9fUlhfQ0xBU1NfRF9MRUdBQ1lfMTEwMjVfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHgwZSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmOCwgMHhBOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyOCwgMHhmRiwgMHhDQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyOSwgMHhmRiwgMHhDQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOSwgMHg0MCwgMHg0MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MCwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MSwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MiwgMHhGRiwgMHhiYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MywgMHhGRiwgMHhjMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRSwgMHhGRiwgMHhERCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRiwgMHhGRiwgMHgwZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NiwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NywgMHhGRiwgMHhjMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0YSwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgyMywgMHgyMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwYSwgMHgwYSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4MTg2QTB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwNSwgMHgwNSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MGYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBIRUFEU0VUX1NURVJFT19SWF9DTEFTU19EX0xFR0FDWV8xNjAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgxLCAweEZGLCAweDBlKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDIzLCAweGY4LCAweEE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI4LCAweGZGLCAweENBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI5LCAweGZGLCAweENBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM5LCAweDQwLCAweDQwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQwLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQxLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQyLCAweEZGLCAweGZmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQzLCAweEZGLCAweGQ0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ0LCAweEZGLCAweDM3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNFLCAweEZGLCAweEREKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNGLCAweEZGLCAweDBmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ1LCAweEZGLCAweGZmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ2LCAweEZGLCAweDc3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ3LCAweEZGLCAweGQ0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ4LCAweEZGLCAweDM3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ5LCAweEZGLCAweGZmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDRhLCAweEZGLCAweDc3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDIzLCAweDIzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDBhLCAweDBhKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgxODZBMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDA1LCAweDA1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwZiwgMHgwYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYiwgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0KLSNkZWZpbmUgSEVBRFNFVF9TVEVSRU9fUlhfQ0xBU1NfRF9MRUdBQ1lfMjIwNTBfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4YWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHgwZSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmOCwgMHhBOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyOCwgMHhmRiwgMHhDQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyOSwgMHhmRiwgMHhDQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOSwgMHg0MCwgMHg0MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MCwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MSwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MiwgMHhGRiwgMHhiYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MywgMHhGRiwgMHhkMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRSwgMHhGRiwgMHhERCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRiwgMHhGRiwgMHgwZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NiwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NywgMHhGRiwgMHhkMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0YSwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgyMywgMHgyMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwYSwgMHgwYSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4MTg2QTB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwNSwgMHgwNSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg5OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDc4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgzOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MGYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotCi0jZGVmaW5lIEhFQURTRVRfU1RFUkVPX1JYX0NMQVNTX0RfTEVHQUNZXzMyMDAwX09TUl8yNTYgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweGFjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweGFjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4MGUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZjgsIDB4QTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjgsIDB4ZkYsIDB4Q0EpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjksIDB4ZkYsIDB4Q0EpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzksIDB4NDAsIDB4NDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDAsIDB4RkYsIDB4MDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDEsIDB4RkYsIDB4MDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDIsIDB4RkYsIDB4ZmYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDMsIDB4RkYsIDB4ZjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDQsIDB4RkYsIDB4MzcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0UsIDB4RkYsIDB4REQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0YsIDB4RkYsIDB4MGYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDUsIDB4RkYsIDB4ZmYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDYsIDB4RkYsIDB4NzcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDcsIDB4RkYsIDB4ZjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDgsIDB4RkYsIDB4MzcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDksIDB4RkYsIDB4ZmYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NGEsIDB4RkYsIDB4NzcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MjMsIDB4MjMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MGEsIDB4MGEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDE4NkEwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MDUsIDB4MDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4OTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4OTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDg4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDg4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg3OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg3OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg0OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg0OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDI4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDI4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgxOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgxOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg0LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg1LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDBmLCAweDBjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhhLCAweDAzLCAweDAzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNiLCAweEZDLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNjLCAweEZDLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDBmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgSEVBRFNFVF9TVEVSRU9fUlhfQ0xBU1NfRF9MRUdBQ1lfNDgwMDBfT1NSXzY0IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgxLCAweEZGLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDIzLCAweGY4LCAweEE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI4LCAweGZGLCAweENBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI5LCAweGZGLCAweENBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM5LCAweDQwLCAweDQwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQwLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQxLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQyLCAweEZGLCAweDU1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQzLCAweEZGLCAweGM1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ0LCAweEZGLCAweDM3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNFLCAweEZGLCAweEREKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNGLCAweEZGLCAweDBmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ1LCAweEZGLCAweGZmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ2LCAweEZGLCAweDc3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ3LCAweEZGLCAweGMyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ4LCAweEZGLCAweDM3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ5LCAweEZGLCAweGZmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDRhLCAweEZGLCAweDc3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDIzLCAweDIzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDBhLCAweDBhKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgxODZBMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDA1LCAweDA1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwZiwgMHgwYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYiwgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIEhFQURTRVRfU1RFUkVPX1JYX0NMQVNTX0RfTEVHQUNZXzQ4MDAwX09TUl8yNTYgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweGFjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweGFjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4MGUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZjgsIDB4QTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjgsIDB4ZkYsIDB4Q0EpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjksIDB4ZkYsIDB4Q0EpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzksIDB4NDAsIDB4NDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDAsIDB4RkYsIDB4MDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDEsIDB4RkYsIDB4MDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDIsIDB4RkYsIDB4QkIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDMsIDB4RkYsIDB4RjIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDQsIDB4RkYsIDB4MzcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0UsIDB4RkYsIDB4REQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0YsIDB4RkYsIDB4MGYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDUsIDB4RkYsIDB4ZmYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDYsIDB4RkYsIDB4NzcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDcsIDB4RkYsIDB4RjIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDgsIDB4RkYsIDB4MzcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDksIDB4RkYsIDB4ZmYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NGEsIDB4RkYsIDB4NzcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MjMsIDB4MjMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MGEsIDB4MGEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDE4NkEwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MDUsIDB4MDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4OTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4OTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDg4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDg4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg3OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg3OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg0OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg0OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDI4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDI4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgxOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgxOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg0LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg1LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDBmLCAweDBjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhhLCAweDAzLCAweDAzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNiLCAweEZDLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNjLCAweEZDLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDBmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgU1BFQUtFUl9SWF84MDAwX09TUl8yNTYgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgxLCAweEZGLCAweDRFKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjQsIDB4NkYsIDB4NjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjUsIDB4MEYsIDB4MGIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjYsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzcsIDB4ZTIsIDB4YTIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4RkYsIDB4MkIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2QsIDB4RkYsIDB4NTUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MjMsIDB4MjMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZmYsIDB4MjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4OGEsIDB4OGEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4MDUsIDB4MDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDc1MzB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwNSwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg0MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHg3NTMwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLQotI2RlZmluZSBTUEVBS0VSX1JYXzQ4MDAwX09TUl82NCBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4NDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNCwgMHg2RiwgMHg2Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNSwgMHgwRiwgMHgwYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNiwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNywgMHhlMiwgMHhhMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQSwgMHhGRiwgMHgyQil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzZCwgMHhGRiwgMHg1NSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgyMywgMHgyMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmZiwgMHgyMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4YSwgMHg4YSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHgwNSwgMHgwNSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4NzUzMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg1LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg0LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDA1LCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhhLCAweDAxLCAweDAxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDQwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDc1MzB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBTUEVBS0VSX1JYXzQ4MDAwX09TUl8yNTYgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjQsIDB4NkYsIDB4NjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjUsIDB4MEYsIDB4MEIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjYsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzcsIDB4ZTIsIDB4YTIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4RkYsIDB4MkIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2QsIDB4RkYsIDB4NTUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MjMsIDB4MjMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZmYsIDB4MjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4OGEsIDB4OGEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4MDUsIDB4MDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDc1MzB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwNSwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg0MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHg3NTMwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgU1BFQUtFUl9TVEVSRU9fUlhfODAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHg0RSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI0LCAweDZGLCAweDY0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI1LCAweDBGLCAweDBFKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI2LCAweGZjLCAweGZjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM3LCAweGU2LCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNBLCAweEZGLCAweDJCKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNkLCAweEZGLCAweDU1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDIzLCAweDIzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDIzLCAweGZmLCAweDIwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDhhLCAweDhhKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDA1LCAweDA1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHg3NTMwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MGYsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4NDAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4NzUzMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0KLSNkZWZpbmUgU1BFQUtFUl9TVEVSRU9fUlhfNDgwMDBfT1NSXzY0IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHg0Mil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI0LCAweDZGLCAweDY3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI1LCAweDBGLCAweDBiKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI2LCAweGZjLCAweGZjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM3LCAweGU2LCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNBLCAweEZGLCAweDJCKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNkLCAweEZGLCAweDU1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDIzLCAweDIzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDIzLCAweGZmLCAweDIwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDhhLCAweDhhKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDA1LCAweDA1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHg3NTMwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MGYsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4NDAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4NzUzMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIFNQRUFLRVJfU1RFUkVPX1JYXzQ4MDAwX09TUl8yNTYgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjQsIDB4NkYsIDB4NjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjUsIDB4MEYsIDB4MEIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjYsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzcsIDB4ZTYsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4RkYsIDB4MkIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2QsIDB4RkYsIDB4NTUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MjMsIDB4MjMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZmYsIDB4MjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4OGEsIDB4OGEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4MDUsIDB4MDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDc1MzB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwZiwgMHgwYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwZiwgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg0MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHg3NTMwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLQotI2RlZmluZSBTUEVBS0VSX1RYXzgwMDBfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MzAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTEsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTMsIDB4ZmMsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTQsIDB4ZmYsIDB4NjUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTUsIDB4ZmYsIDB4NjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODIsIDB4ZmYsIDB4NUUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTAsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGMCwgMHhEMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4YmI4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MTQsIDB4MTQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGMsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODYsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4NTAsIDB4NDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MTAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEQsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MTQsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBTUEVBS0VSX1RYXzQ4MDAwX09TUl82NCBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MzAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTEsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTMsIDB4ZmMsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTQsIDB4ZmYsIDB4NjUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTUsIDB4ZmYsIDB4NjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODIsIDB4ZmYsIDB4NDYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTAsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGMCwgMHhEMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4YmI4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MTQsIDB4MTQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGMsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODYsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4NTAsIDB4NDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MTAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEQsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MTQsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotCi0jZGVmaW5lIFNQRUFLRVJfVFhfNDgwMDBfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MzAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTEsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTMsIDB4ZmMsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTQsIDB4ZmYsIDB4NjUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTUsIDB4ZmYsIDB4NjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODIsIDB4ZmYsIDB4NUEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTAsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGMCwgMHhEMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4YmI4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MTQsIDB4MTQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGMsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODYsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4NTAsIDB4NDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MTAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEQsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MTQsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBGTV9IQU5EU0VUX09TUl82NCBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNCwgMHg2RiwgMHg0Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwNCwgMHhmZiwgMHg4Qyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHg5Mil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNSwgMHgwRiwgMHgwYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNiwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNiwgMHhjMCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQSwgMHhGRiwgMHgyQil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmZiwgMHgyMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzZCwgMHhGRiwgMHhENSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4MjcxMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDQwLCAweDQwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg0LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDA1LCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhhLCAweDAzLCAweDAzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM2LCAweGMwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDQwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgRk1fSEVBRFNFVF9TVEVSRU9fQ0xBU1NfRF9MRUdBQ1lfT1NSXzY0IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgxLCAweEZGLCAweDkyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDIzLCAweGY4LCAweEE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI4LCAweGZGLCAweENBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI5LCAweGZGLCAweENBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM5LCAweDQwLCAweDQwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQwLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQxLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQyLCAweEZGLCAweDU1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQzLCAweEZGLCAweEQ1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ0LCAweEZGLCAweDM3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNFLCAweEZGLCAweEREKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNGLCAweEZGLCAweDBmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ1LCAweEZGLCAweGZmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ2LCAweEZGLCAweDc3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ3LCAweEZGLCAweEQ1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ4LCAweEZGLCAweDM3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ5LCAweEZGLCAweGZmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDRhLCAweEZGLCAweDc3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDAzLCAweDAzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDBhLCAweDBhKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgxODZBMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDA1LCAweDA1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDg4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDg4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDg4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwZiwgMHgwYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYiwgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIEZNX0hFQURTRVRfQ0xBU1NfQUJfU1RFUkVPX0xFR0FDWV9PU1JfNjQgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweGFjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweGFjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4OTIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MDQsIDB4ZmYsIDB4QkMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjQsIDB4NkYsIDB4NjcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjUsIDB4MEYsIDB4MGIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjYsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzgsIDB4ZmYsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4RkYsIDB4MmIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4YTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDE4NkEwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4ZjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZmYsIDB4MjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4OTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4OTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDg4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDg4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg3OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg3OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg0OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg0OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDI4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDI4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgxOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgxOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBGTV9IRUFEU0VUX0NMQVNTX0FCX1NURVJFT19DQVBMRVNTX09TUl82NCBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHg5Mil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwNCwgMHhmZiwgMHhCQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNCwgMHg2RiwgMHg2Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNSwgMHgwRiwgMHgwYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNiwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOCwgMHhmZiwgMHg4Mil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQSwgMHhGRiwgMHhlYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgyMywgMHgyMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHhmMCwgMHhmMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmZiwgMHgyMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwZiwgMHgwYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYiwgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHhmMCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIEZNX1NQRUFLRVJfT1NSXzY0IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHg5Mil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI0LCAweDZGLCAweDY3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI1LCAweDBGLCAweDBFKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI2LCAweGZjLCAweGZjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM3LCAweGUyLCAweGEyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNBLCAweEZGLCAweDJCKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDIzLCAweGZmLCAweDIwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNkLCAweEZGLCAweDU1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDIzLCAweDIzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDhhLCAweDhhKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgyNzEwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4MDUsIDB4MDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MDUsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDEsIDB4MDEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4NDAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotCi0jZGVmaW5lIEFVWFBHQV9IRUFEU0VUX1NURVJFT19SWF9MRUdBQ1kgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MkIsIDB4ZmYsIDB4MDkpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MkMsIDB4ZmYsIDB4MDkpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4RkYsIDB4MmIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MkIsIDB4ZmYsIDB4ODkpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MkMsIDB4ZmYsIDB4ODkpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzgsIDB4ZmYsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4YTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDE4NkEwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4ZjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkYsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzgsIDB4MTgsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4NDAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBBVVhQR0FfSEVBRFNFVF9NT05PX1JYX0xFR0FDWSBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyQiwgMHhmZiwgMHgwOSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyQywgMHhmZiwgMHgwOSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQSwgMHhGRiwgMHgyYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyQiwgMHhmZiwgMHg4OSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyQywgMHhmZiwgMHg4OSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOCwgMHhmZiwgMHgxOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHhmMCwgMHhhMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4MTg2QTB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHhmMCwgMHhmMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgxMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGRiwgMHgxMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYiwgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOCwgMHgxOCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHg0MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIEFVWFBHQV9IRUFEU0VUX1NURVJFT19SWF9DQVBMRVNTIFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNBLCAweEZGLCAweGViKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDJCLCAweGZmLCAweDg5KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDJDLCAweGZmLCAweDg5KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM4LCAweGZmLCAweDEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweGYwLCAweGEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweGYwLCAweGYwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNjLCAweEZGLCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNiLCAweEZGLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNjLCAweEZGLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM4LCAweDE4LCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDQwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgQVVYUEdBX0hFQURTRVRfTU9OT19SWF9DQVBMRVNTIFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDJCLCAweGZmLCAweDA5KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDJDLCAweGZmLCAweDA5KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNBLCAweEZGLCAweGViKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDJCLCAweGZmLCAweDg5KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDJDLCAweGZmLCAweDg5KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM4LCAweGZmLCAweDE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweGYwLCAweGEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweGYwLCAweGYwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNjLCAweEZGLCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNiLCAweEZGLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNjLCAweEZGLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM4LCAweDE4LCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDQwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgQVVYUEdBX0hFQURTRVRfU1RFUkVPX1JYX0NMQVNTX0QgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MkIsIDB4ZmYsIDB4MDkpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MkMsIDB4ZmYsIDB4MDkpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MkIsIDB4ZmYsIDB4ODkpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MkMsIDB4ZmYsIDB4ODkpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzksIDB4MjAsIDB4MjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDAsIDB4RkYsIDB4MDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDEsIDB4RkYsIDB4MDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDIsIDB4RkYsIDB4NTUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDMsIDB4RkYsIDB4RDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDQsIDB4RkYsIDB4MzcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0UsIDB4RkYsIDB4REQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0YsIDB4RkYsIDB4MGYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDUsIDB4RkYsIDB4ZmYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDYsIDB4RkYsIDB4NzcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDcsIDB4RkYsIDB4RDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDgsIDB4RkYsIDB4MzcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NDksIDB4RkYsIDB4ZmYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NGEsIDB4RkYsIDB4NzcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MGEsIDB4MGEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDE4NkEwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MDUsIDB4MDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkMsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkMsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzksIDB4MjAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2MsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4MDUsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotCi0jZGVmaW5lIEFVWFBHQV9IRUFEU0VUX01PTk9fUlhfQ0xBU1NfRCBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyQiwgMHhmZiwgMHgwOSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyQywgMHhmZiwgMHgwOSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyQiwgMHhmZiwgMHg4OSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyQywgMHhmZiwgMHg4OSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOSwgMHgzMCwgMHgzMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MCwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MSwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MiwgMHhGRiwgMHg1NSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MywgMHhGRiwgMHhENSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRSwgMHhGRiwgMHhERCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRiwgMHhGRiwgMHgwZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NiwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NywgMHhGRiwgMHhENSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OCwgMHhGRiwgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OSwgMHhGRiwgMHhmZil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0YSwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwYSwgMHgwYSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4MTg2QTB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwNSwgMHgwNSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGQywgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGQywgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOSwgMHgyMCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYiwgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwNSwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIEFVWFBHQV9FQVIgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDJCLCAweGZmLCAweDA5KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDJDLCAweGZmLCAweDA5KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDJCLCAweGZmLCAweDg5KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDJDLCAweGZmLCAweDg5KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzYsIDB4MjAsIDB4MjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDI3MTB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg0MCwgMHg0MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNiwgMHgyMCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg0MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0JCQkJRGlnaXRhbE1pY3Byb2ZpbGUKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIERJR0lUQUxfTUlDIFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMSwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgzMCwgMHgzMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxNCwgMHhmZCwgMHg2NSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxQSwgMHhmZiwgMHhjMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgyLCAweEZGLCAweDY2KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDFjLCAweDFjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg3LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg2LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweEYwLCAweEYwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDMwLCAweDMwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDFjLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0JCQkJRHVhbE1pY3Byb2ZpbGUKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFNQRUFLRVJfTUlDMV9MRUZUX0xJTkVfSU5fUklHSFRfODAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMSwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgzMCwgMHgzMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMiwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMywgMHhmYywgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxNCwgMHhmZCwgMHg2NSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxNSwgMHhmZiwgMHg2NCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MiwgMHhGRiwgMHg1RSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMCwgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBFLCAweEUyLCAweEUyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBELCAweEYwLCAweEQwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHhiYjh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgxYywgMHgxYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YywgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NywgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NiwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHhGMCwgMHhjMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgzMCwgMHgzMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwZSwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwZCwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgxYywgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEyLCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIFNQRUFLRVJfTUlDMV9MRUZUX0FVWF9JTl9SSUdIVF84MDAwX09TUl8yNTYgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAxLCAweDAxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAxLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDMwLCAweDMwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDExLCAweGZjLCAweGZjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEyLCAweGZjLCAweGZjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEzLCAweGZjLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDE0LCAweGZkLCAweDY1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDE1LCAweGZmLCAweDY0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgyLCAweEZGLCAweDVFKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEwLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEUsIDB4RTIsIDB4RTEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEQsIDB4RjAsIDB4RDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweGJiOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDFjLCAweDFjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhjLCAweDAzLCAweDAzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg3LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg2LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweEYwLCAweGMwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDMwLCAweDMwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBlLCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBkLCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDFjLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTIsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgTUlDMV9MRUZUX0xJTkVfSU5fUklHSFRfODAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMSwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgzMCwgMHgzMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMiwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMywgMHhmYywgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxNCwgMHhmZCwgMHg2NSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxNSwgMHhmZiwgMHg2NCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MiwgMHhGRiwgMHg1RSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMCwgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBFLCAweEUyLCAweEUyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBELCAweEYwLCAweEQwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHhiYjh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgxYywgMHgxYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YiwgMHhmZiwgMHhDRSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YywgMHgwMywgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NywgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NiwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHhGMCwgMHhjMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgzMCwgMHgzMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwZSwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwZCwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgxYywgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEyLCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIE1JQzFfTEVGVF9BVVhfSU5fUklHSFRfODAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMSwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgzMCwgMHgzMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMiwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMywgMHhmYywgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxNCwgMHhmZCwgMHg2NSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxNSwgMHhmZiwgMHg2NCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MiwgMHhGRiwgMHg1RSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMCwgMHhGRiwgMHg2OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBFLCAweEUxLCAweEUxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBELCAweEYwLCAweEQwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHhiYjh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgxYywgMHgxYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YiwgMHhmZiwgMHhDRSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YywgMHgwMywgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NywgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NiwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHhGMCwgMHhjMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgzMCwgMHgzMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwZSwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwZCwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgxYywgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEyLCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0JCQkJQW5hbG9nRHVhbE1pY1Byb2ZpbGUKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEFOQUxPR19EVUFMX01JQyBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MzAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTEsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTIsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTMsIDB4ZmMsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTQsIDB4ZmQsIDB4NjUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTUsIDB4ZmYsIDB4NjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODIsIDB4RkYsIDB4NUUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRSwgMHhFMiwgMHhFMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGMCwgMHhEMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4YmI4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MWMsIDB4MWMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODcsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODYsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4RjAsIDB4RjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MzAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MGUsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MGQsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MWMsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMiwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0JCQkJVFRZCi1cKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBUVFlfSEVBRFNFVF9NT05PX1RYXzgwMDBfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MzAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTEsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTMsIDB4ZmMsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTQsIDB4ZmYsIDB4NjUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTUsIDB4ZmMsIDB4NjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODIsIDB4RkYsIDB4NUUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGZiwgMHhBOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4YmI4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MTQsIDB4MTQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGMsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODYsIDB4ZmYsIDB4MEEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4NTAsIDB4NDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MTAsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEQsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MTQsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBUVFlfSEVBRFNFVF9NT05PX1RYXzE2MDAwX09TUl8yNTYgVFRZX0hFQURTRVRfTU9OT19UWF84MDAwX09TUl8yNTYKLQotI2RlZmluZSBUVFlfSEVBRFNFVF9NT05PX1JYX0NMQVNTX0RfODAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgxLCAweEZGLCAweDBlKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDIzLCAweGY4LCAweEE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI4LCAweGZGLCAweENBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI5LCAweGZGLCAweENBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM5LCAweDQwLCAweDQwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQwLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQxLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQyLCAweEZGLCAweEZGKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQzLCAweEZGLCAweGM0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ0LCAweEZGLCAweDM3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNFLCAweEZGLCAweEQ1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNGLCAweEZGLCAweDBmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ1LCAweEZGLCAweGZmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ2LCAweEZGLCAweDc3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ3LCAweEZGLCAweGM0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ4LCAweEZGLCAweDM3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ5LCAweEZGLCAweGZmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDRhLCAweEZGLCAweDc3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDIzLCAweDIzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDBhLCAweDBhKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgxODZBMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDA1LCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHhGNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwZiwgMHgwYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYiwgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIFRUWV9IRUFEU0VUX01PTk9fUlhfQ0xBU1NfRF8xNjAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgxLCAweEZGLCAweDBlKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDIzLCAweGY4LCAweEE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI4LCAweGZGLCAweENBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI5LCAweGZGLCAweENBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM5LCAweDQwLCAweDQwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQwLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQxLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQyLCAweEZGLCAweEZGKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQzLCAweEZGLCAweGQ0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ0LCAweEZGLCAweDM3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNFLCAweEZGLCAweEQ1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNGLCAweEZGLCAweDBmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ1LCAweEZGLCAweGZmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ2LCAweEZGLCAweDc3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ3LCAweEZGLCAweGQ0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ4LCAweEZGLCAweDM3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ5LCAweEZGLCAweGZmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDRhLCAweEZGLCAweDc3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDIzLCAweDIzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDBhLCAweDBhKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgxODZBMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDA1LCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHhGNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwZiwgMHgwYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYiwgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIFRUWV9IRUFEU0VUX01PTk9fUlhfQ0xBU1NfRF80ODAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgxLCAweEZGLCAweDBlKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDIzLCAweGY4LCAweEE4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI4LCAweGZGLCAweENBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI5LCAweGZGLCAweENBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM5LCAweDQwLCAweDQwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQwLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQxLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQyLCAweEZGLCAweEJCKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQzLCAweEZGLCAweEYyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ0LCAweEZGLCAweDM3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNFLCAweEZGLCAweEQ1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNGLCAweEZGLCAweDBmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ1LCAweEZGLCAweGZmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ2LCAweEZGLCAweDc3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ3LCAweEZGLCAweEYyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ4LCAweEZGLCAweDM3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDQ5LCAweEZGLCAweGZmKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDRhLCAweEZGLCAweDc3KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDIzLCAweDIzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDgwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDBhLCAweDBhKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgxODZBMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweDA1LCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDk4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg4OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgyOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4M0U4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDNFOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNCLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgzRTh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHhGNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwZiwgMHgwYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYiwgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHgwZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotCQkJCUZGQQotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgSEFORFNFVF9SWF84MDAwX09TUl8yNTZfRkZBIFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCAgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsICAweDAyLCAgMHgwMil9LCAgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNCwgMHg2RiwgMHg0NCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwNCwgMHhmZiwgMHg4Qyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHg0RSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNSwgMHgwRiwgMHgwYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNiwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNiwgMHhjMCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQSwgMHhGRiwgMHgyQil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmZiwgMHgyMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzZCwgMHhGRiwgMHhENSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgyMSwgMHgyMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4MjcxMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDQwLCAweDQwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg0LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDA1LCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhhLCAweDAxLCAweDAxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM2LCAweGMwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDQwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgSEFORFNFVF9SWF8xNjAwMF9PU1JfMjU2X0ZGQSBIQU5EU0VUX1JYXzgwMDBfT1NSXzI1Nl9GRkEKLQotI2RlZmluZSBIQU5EU0VUX1JYXzQ4MDAwX09TUl82NF9GRkEgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjQsIDB4NkYsIDB4NDcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MDQsIDB4ZkYsIDB4OEMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4NDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjUsIDB4MEYsIDB4MGIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjYsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzYsIDB4YzAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4RkYsIDB4MkIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZmYsIDB4MjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2QsIDB4RkYsIDB4RDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MjEsIDB4MjEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDI3MTB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg0MCwgMHg0MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwNSwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNiwgMHhjMCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg0MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIEhBTkRTRVRfUlhfNDgwMDBfT1NSXzI1Nl9GRkEgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjQsIDB4NkYsIDB4NDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MDQsIDB4ZkYsIDB4OEMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4NGUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjUsIDB4MEYsIDB4MGIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjYsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzYsIDB4YzAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4RkYsIDB4MkIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZmYsIDB4MjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2QsIDB4RkYsIDB4NTUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MjEsIDB4MjEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4ODAsIDB4ODApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDI3MTB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg0MCwgMHg0MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwNSwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNiwgMHhjMCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg0MCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIEhBTkRTRVRfVFhfODAwMF9PU1JfMjU2X0ZGQSBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0ZMQVNIX0lNQUdFfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MzAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTEsIDB4ZmMsIDB4ZmMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTMsIDB4ZmMsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTQsIDB4ZmYsIDB4NjUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTUsIDB4ZmYsIDB4NjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODIsIDB4ZmYsIDB4NUUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTAsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGMCwgMHhkMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4YmI4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MTQsIDB4MTQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGIsIDB4ZmYsIDB4Q0UpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGMsIDB4MDMsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODYsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4NTAsIDB4NDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MTAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEQsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MTQsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBIQU5EU0VUX1RYXzE2MDAwX09TUl8yNTZfRkZBIEhBTkRTRVRfVFhfODAwMF9PU1JfMjU2X0ZGQQotCi0jZGVmaW5lIEhBTkRTRVRfVFhfNDgwMDBfT1NSXzI1Nl9GRkEgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19GTEFTSF9JTUFHRX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAxLCAweDAxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAxLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDMwLCAweDMwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDExLCAweGZjLCAweGZjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEzLCAweGZjLCAweDU4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDE0LCAweGZmLCAweDY1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDE1LCAweGZmLCAweDY0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgyLCAweGZmLCAweDVBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEwLCAweEZGLCAweDY4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEQsIDB4RjAsIDB4ZDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweGJiOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDE0LCAweDE0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhiLCAweGZmLCAweENFKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhjLCAweDAzLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg2LCAweGZmLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDUwLCAweDQwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDEwLCAweDMwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBELCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDE0LCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTEsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgSEVBRFNFVF9TVEVSRU9fU1BFQUtFUl9TVEVSRU9fUlhfQ0FQTEVTU180ODAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRkxBU0hfSU1BR0V9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQywgMHhGRiwgMHhhYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgxLCAweEZGLCAweDRFKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDA0LCAweGZmLCAweEJDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI0LCAweDZGLCAweDY0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI1LCAweDBGLCAweDBiKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI2LCAweGZjLCAweGZjKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM4LCAweGZmLCAweDgyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM3LCAweGU2LCAweGEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNBLCAweEZGLCAweDJiKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDIzLCAweDIzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDhBLCAweDhBKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM0LCAweGYwLCAweGEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHg3NTMwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4ZjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjMsIDB4ZmYsIDB4MjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4MDUsIDB4MDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4OTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4OTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4ODgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MTgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0IsIDB4RkYsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4ZmYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MGYsIDB4MGMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGEsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M2IsIDB4RkYsIDB4YUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4YUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzQsIDB4ZjAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4NzUzMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotI2VuZGlmIC8qIF9fTUFSSU1CQV9QUk9GSUxFX0hfXyAqLwotCi0KLQotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9taTJzLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9taTJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMDZiZmMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvbWkycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2lmbmRlZiBfTUFDSF9RRFNQNV9WMl9NSTJTX0gKLSNkZWZpbmUgX01BQ0hfUURTUDVfVjJfTUkyU19ICi0KLSNkZWZpbmUgV1RfMTZfQklUIDAKLSNkZWZpbmUgV1RfMjRfQklUIDEKLSNkZWZpbmUgV1RfMzJfQklUIDIKLSNkZWZpbmUgV1RfTUFYIDQKLQotZW51bSBtaTJzX3JldF9lbnVtX3R5cGUgewotCU1JMlNfRkFMU0UgPSAwLAotCU1JMlNfVFJVRQotfTsKLQotI2RlZmluZSBNSTJTX0NIQU5fTU9OT19SQVcgMAotI2RlZmluZSBNSTJTX0NIQU5fTU9OT19QQUNLRUQgMQotI2RlZmluZSBNSTJTX0NIQU5fU1RFUkVPIDIKLSNkZWZpbmUgTUkyU19DSEFOXzRDSEFOTkVMUyAzCi0jZGVmaW5lIE1JMlNfQ0hBTl82Q0hBTk5FTFMgNAotI2RlZmluZSBNSTJTX0NIQU5fOENIQU5ORUxTIDUKLSNkZWZpbmUgTUkyU19DSEFOX01BWF9PVVRCT1VORF9DSEFOTkVMUyBNSTJTX19DSEFOXzhDSEFOTkVMUwotCi0jZGVmaW5lIE1JMlNfU0RfMCAgICAweDAxCi0jZGVmaW5lIE1JMlNfU0RfMSAgICAweDAyCi0jZGVmaW5lIE1JMlNfU0RfMiAgICAweDA0Ci0jZGVmaW5lIE1JMlNfU0RfMyAgICAweDA4Ci0KLSNkZWZpbmUgTUkyU19TRF9MSU5FX01BU0sgICAgKE1JMlNfU0RfMCB8IE1JMlNfU0RfMSB8IE1JMlNfU0RfMiB8ICBNSTJTX1NEXzMpCi0KLWJvb2wgbWkyc19zZXRfaGRtaV9vdXRwdXRfcGF0aCh1aW50OF90IGNoYW5uZWxzLCB1aW50OF90IHNpemUsCi0JCQkJdWludDhfdCBzZF9saW5lKTsKLQotYm9vbCBtaTJzX3NldF9oZG1pX2lucHV0X3BhdGgodWludDhfdCBjaGFubmVscywgdWludDhfdCBzaXplLCB1aW50OF90IHNkX2xpbmUpOwotCi1ib29sIG1pMnNfc2V0X2NvZGVjX291dHB1dF9wYXRoKHVpbnQ4X3QgY2hhbm5lbHMsIHVpbnQ4X3Qgc2l6ZSk7Ci0KLWJvb2wgbWkyc19zZXRfY29kZWNfaW5wdXRfcGF0aCh1aW50OF90IGNoYW5uZWxzLCB1aW50OF90IHNpemUpOwotCi0jZW5kaWYgLyogI2lmbmRlZiBNSTJTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL21wM19mdW5jcy5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvbXAzX2Z1bmNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZjdjNTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvbXAzX2Z1bmNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaWZuZGVmIE1QM19GVU5DU19ICi0jZGVmaW5lIE1QM19GVU5DU19ICi0KLS8qIEZ1bmN0aW9uIFByb3RvdHlwZXMgKi8KLWxvbmcgbXAzX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci12b2lkIGF1ZHBwX2NtZF9jZmdfbXAzX3BhcmFtcyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLQotI2VuZGlmIC8qICFNUDNfRlVOQ1NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvbXNtX2xwYS5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvbXNtX2xwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGZhMTliLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL21zbV9scGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpZm5kZWYgX01BQ0hfUURTUDVfVjJfTVNNX0xQQV9ICi0jZGVmaW5lIF9NQUNIX1FEU1A1X1YyX01TTV9MUEFfSAotCi1zdHJ1Y3QgbHBhX21lbV9jb25maWcgewotCXUzMiBsbGJfbWluX2FkZHI7Ci0JdTMyIGxsYl9tYXhfYWRkcjsKLQl1MzIgc2JfbWluX2FkZHI7Ci0JdTMyIHNiX21heF9hZGRyOwotfTsKLQotc3RydWN0IG1zbV9scGFfcGxhdGZvcm1fZGF0YSB7Ci0JdTMyIG9idWZfaGxiX3NpemU7Ci0JdTMyIGRzcF9wcm9jX2lkOwotCXUzMiBhcHBfcHJvY19pZDsKLQlzdHJ1Y3QgbHBhX21lbV9jb25maWcgbm9zYl9jb25maWc7IC8qIG5vIHN1bW1pbmcgICovCi0Jc3RydWN0IGxwYV9tZW1fY29uZmlnIHNiX2NvbmZpZzsgLyogc3VtbWluZyByZXF1aXJlZCAqLwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9wY21fZnVuY3MuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL3BjbV9mdW5jcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGZlMmJhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL3BjbV9mdW5jcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2lmbmRlZiBQQ01fRlVOQ1NfSAotI2RlZmluZSBQQ01fRlVOQ1NfSAotCi1sb25nIHBjbV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotdm9pZCBhdWRwcF9jbWRfY2ZnX3BjbV9wYXJhbXMoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci0KLSNlbmRpZiAvKiAhUENNX0ZVTkNTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL3Fkc3A1YWZlY21kaS5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvcWRzcDVhZmVjbWRpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZmY1YjguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvcWRzcDVhZmVjbWRpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaWZuZGVmIF9fTUFDSF9RRFNQNV9WMl9RRFNQNUFGRUNNRElfSAotI2RlZmluZSBfX01BQ0hfUURTUDVfVjJfUURTUDVBRkVDTURJX0gKLQotI2RlZmluZSBRRFNQNV9ERVZJQ0VfbUkyU19DT0RFQ19SWCAxICAgICAvKiBpbnRlcm5hbCBjb2RlYyByeCBwYXRoICAqLwotI2RlZmluZSBRRFNQNV9ERVZJQ0VfbUkyU19DT0RFQ19UWCAyICAgICAvKiBpbnRlcm5hbCBjb2RlYyB0eCBwYXRoICAqLwotI2RlZmluZSBRRFNQNV9ERVZJQ0VfQVVYX0NPREVDX1JYICAzICAgICAvKiBleHRlcm5hbCBjb2RlYyByeCBwYXRoICAqLwotI2RlZmluZSBRRFNQNV9ERVZJQ0VfQVVYX0NPREVDX1RYICA0ICAgICAvKiBleHRlcm5hbCBjb2RlYyB0eCBwYXRoICAqLwotI2RlZmluZSBRRFNQNV9ERVZJQ0VfbUkyU19IRE1JX1JYICA1ICAgICAvKiBIRE1JL0ZNIGJsb2NrIHJ4IHBhdGggICAqLwotI2RlZmluZSBRRFNQNV9ERVZJQ0VfbUkyU19IRE1JX1RYICA2ICAgICAvKiBIRE1JL0ZNIGJsb2NrIHR4IHBhdGggICAqLwotI2RlZmluZSBRRFNQNV9ERVZJQ0VfSURfTUFYICAgICAgICA3Ci0KLSNkZWZpbmUgQUZFX0NNRF9DT0RFQ19DT05GSUdfQ01EICAgICAweDEKLSNkZWZpbmUgQUZFX0NNRF9DT0RFQ19DT05GSUdfTEVOIHNpemVvZihzdHJ1Y3QgYWZlX2NtZF9jb2RlY19jb25maWcpCi0KLXN0cnVjdCBhZmVfY21kX2NvZGVjX2NvbmZpZ3sKLQl1aW50MTZfdCBjbWRfaWQ7Ci0JdWludDE2X3QgZGV2aWNlX2lkOwotCXVpbnQxNl90IGFjdGl2aXR5OwotCXVpbnQxNl90IHNhbXBsZV9yYXRlOwotCXVpbnQxNl90IGNoYW5uZWxfbW9kZTsKLQl1aW50MTZfdCB2b2x1bWU7Ci0JdWludDE2X3QgcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotI2RlZmluZSBBRkVfQ01EX0RFVklDRV9WT0xVTUVfQ1RSTAkweDIKLSNkZWZpbmUgQUZFX0NNRF9ERVZJQ0VfVk9MVU1FX0NUUkxfTEVOIFwKLQkJc2l6ZW9mKHN0cnVjdCBhZmVfY21kX2RldmljZV92b2x1bWVfY3RybCkKLQotc3RydWN0IGFmZV9jbWRfZGV2aWNlX3ZvbHVtZV9jdHJsIHsKLQl1aW50MTZfdCBjbWRfaWQ7Ci0JdWludDE2X3QgZGV2aWNlX2lkOwotCXVpbnQxNl90IGRldmljZV92b2x1bWU7Ci0JdWludDE2X3QgcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotI2RlZmluZSBBRkVfQ01EX0FVWF9DT0RFQ19DT05GSUdfQ01EIAkweDMKLSNkZWZpbmUgQUZFX0NNRF9BVVhfQ09ERUNfQ09ORklHX0xFTiBzaXplb2Yoc3RydWN0IGFmZV9jbWRfYXV4X2NvZGVjX2NvbmZpZykKLQotc3RydWN0IGFmZV9jbWRfYXV4X2NvZGVjX2NvbmZpZ3sKLQl1aW50MTZfdCBjbWRfaWQ7Ci0JdWludDE2X3QgZG1hX3BhdGhfY3RsOwotCXVpbnQxNl90IHBjbV9jdGw7Ci0JdWludDE2X3QgZWlnaHRfa2h6X2ludF9tb2RlOwotCXVpbnQxNl90IGF1eF9jb2RlY19pbnRmX2N0bDsKLQl1aW50MTZfdCBkYXRhX2Zvcm1hdF9wYWRkaW5nX2luZm87Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotI2RlZmluZSBBRkVfQ01EX0ZNX1JYX1JPVVRJTkdfQ01ECTB4NgotI2RlZmluZSBBRkVfQ01EX0ZNX1JYX1JPVVRJTkdfTEVOIHNpemVvZihzdHJ1Y3QgYWZlX2NtZF9mbV9jb2RlY19jb25maWcpCi0KLXN0cnVjdCBhZmVfY21kX2ZtX2NvZGVjX2NvbmZpZ3sKLQl1aW50MTZfdCBjbWRfaWQ7Ci0JdWludDE2X3QgZW5hYmxlOwotCXVpbnQxNl90IGRldmljZV9pZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0jZGVmaW5lIEFGRV9DTURfRk1fUExBWUJBQ0tfVk9MVU1FX0NNRAkweDgKLSNkZWZpbmUgQUZFX0NNRF9GTV9QTEFZQkFDS19WT0xVTUVfTEVOIHNpemVvZihzdHJ1Y3QgYWZlX2NtZF9mbV92b2x1bWVfY29uZmlnKQotCi1zdHJ1Y3QgYWZlX2NtZF9mbV92b2x1bWVfY29uZmlnewotCXVpbnQxNl90IGNtZF9pZDsKLQl1aW50MTZfdCB2b2x1bWU7Ci0JdWludDE2X3QgcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotI2RlZmluZSBBRkVfQ01EX0ZNX0NBTElCUkFUSU9OX0dBSU5fQ01ECTB4MTEKLSNkZWZpbmUgQUZFX0NNRF9GTV9DQUxJQlJBVElPTl9HQUlOX0xFTiBcCi0Jc2l6ZW9mKHN0cnVjdCBhZmVfY21kX2ZtX2NhbGliZ2Fpbl9jb25maWcpCi0KLXN0cnVjdCBhZmVfY21kX2ZtX2NhbGliZ2Fpbl9jb25maWd7Ci0JdWludDE2X3QgY21kX2lkOwotCXVpbnQxNl90IGRldmljZV9pZDsKLQl1aW50MTZfdCBjYWxpYnJhdGlvbl9nYWluOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLSNkZWZpbmUgQUZFX0NNRF9MT09QQkFDSwkweEQKLSNkZWZpbmUgQUZFX0NNRF9FWFRfTE9PUEJBQ0sJMHhFCi0jZGVmaW5lIEFGRV9DTURfTE9PUEJBQ0tfTEVOIHNpemVvZihzdHJ1Y3QgYWZlX2NtZF9sb29wYmFjaykKLSNkZWZpbmUgQUZFX0xPT1BCQUNLX0VOQUJMRV9DT01NQU5EIDB4RkZGRgotI2RlZmluZSBBRkVfTE9PUEJBQ0tfRElTQUJMRV9DT01NQU5EIDB4MDAwMAotCi1zdHJ1Y3QgYWZlX2NtZF9sb29wYmFjayB7Ci0JdWludDE2X3QgY21kX2lkOwotCXVpbnQxNl90IGVuYWJsZV9mbGFnOwotCXVpbnQxNl90IHJlc2VydmVkWzJdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBhZmVfY21kX2V4dF9sb29wYmFjayB7Ci0JdWludDE2X3QgY21kX2lkOwotCXVpbnQxNl90IGVuYWJsZV9mbGFnOwotCXVpbnQxNl90IHNvdXJjZV9pZDsKLQl1aW50MTZfdCBkc3RfaWQ7Ci0JdWludDE2X3QgcmVzZXJ2ZWRbMl07Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9DTURfQ0ZHX1JNQ19QQVJBTVMgMHgxMgotI2RlZmluZSBBRkVfQ01EX0NGR19STUNfTEVOIFwKLQlzaXplb2Yoc3RydWN0IGFmZV9jbWRfY2ZnX3JtYykKLQotc3RydWN0IGFmZV9jbWRfY2ZnX3JtYyB7Ci0JdW5zaWduZWQgc2hvcnQgY21kX2lkOwotCXNpZ25lZCBzaG9ydCAgIHJtY19tb2RlOwotCXVuc2lnbmVkIHNob3J0IHJtY19pcHdfbGVuZ3RoX21zOwotCXVuc2lnbmVkIHNob3J0IHJtY19wZWFrX2xlbmd0aF9tczsKLQl1bnNpZ25lZCBzaG9ydCBybWNfaW5pdF9wdWxzZV9sZW5ndGhfbXM7Ci0JdW5zaWduZWQgc2hvcnQgcm1jX3RvdGFsX2ludF9sZW5ndGhfbXM7Ci0JdW5zaWduZWQgc2hvcnQgcm1jX3JhbXB1cGRuX2xlbmd0aF9tczsKLQl1bnNpZ25lZCBzaG9ydCBybWNfZGVsYXlfbGVuZ3RoX21zOwotCXVuc2lnbmVkIHNob3J0IHJtY19kZXRlY3Rfc3RhcnRfdGhyZXNoZGI7Ci0Jc2lnbmVkIHNob3J0ICAgcm1jX2luaXRfcHVsc2VfdGhyZXNoZGI7Ci19ICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9xZHNwNWFmZW1zZy5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvcWRzcDVhZmVtc2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyNjgzYS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9xZHNwNWFmZW1zZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2lmbmRlZiBfX01BQ0hfUURTUDVfVjJfUURTUDVBRkVNU0dfSAotI2RlZmluZSBfX01BQ0hfUURTUDVfVjJfUURTUDVBRkVNU0dfSAotCi0jZGVmaW5lIEFGRV9BUFVfTVNHX0NPREVDX0NPTkZJR19BQ0sJCTB4MDAwMQotI2RlZmluZSBBRkVfQVBVX01TR19DT0RFQ19DT05GSUdfQUNLX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhZmVfbXNnX2NvZGVjX2NvbmZpZ19hY2spCi0KLSNkZWZpbmUgQUZFX0FQVV9NU0dfVk9DX1RJTUlOR19TVUNDRVNTCQkweDAwMDIKLQotI2RlZmluZSBBRkVfTVNHX0NPREVDX0NPTkZJR19FTkFCTEVEIDB4MQotI2RlZmluZSBBRkVfTVNHX0NPREVDX0NPTkZJR19ESVNBQkxFRCAweEZGRkYKLQotc3RydWN0IGFmZV9tc2dfY29kZWNfY29uZmlnX2FjayB7Ci0JdWludDE2X3QgZGV2aWNlX2lkOwotCXVpbnQxNl90IGRldmljZV9hY3Rpdml0eTsKLQl1aW50MTZfdCByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNlbmRpZiAvKiBRRFNQNUFGRU1TR19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBsYXljbWRpLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBsYXljbWRpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZDdmYWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvcWRzcDVhdWRwbGF5Y21kaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSNpZm5kZWYgUURTUDVBVURQTEFZQ01ESV9ICi0jZGVmaW5lIFFEU1A1QVVEUExBWUNNRElfSAotCi0vKj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09KgotCVEgRCBTIFAgNSAgQSBVIEQgSSBPICAgUCBMIEEgWSAgVCBBIFMgSyAgIEMgTyBNIE0gQSBOIEQgUwotCi1HRU5FUkFMIERFU0NSSVBUSU9OCi0gICBDb21tYW5kIEludGVyZmFjZSBmb3IgQVVEUExBWVRBU0sgb24gUURTUDUKLQotUkVGRVJFTkNFUwotICAgTm9uZQotCi1FWFRFUk5BTElaRUQgRlVOQ1RJT05TCi0KLSAgYXVkcGxheV9jbWRfZGVjX2RhdGFfYXZhaWwKLSAgU2VuZCBidWZmZXIgdG8gQVVEUExBWSB0YXNrCi0KLQotQ29weXJpZ2h0IChjKSAxOTkyLTIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotKj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Ki8KLQotI2RlZmluZSBBVURQTEFZX0NNRF9CSVRTVFJFQU1fREFUQV9BVkFJTAkJMHgwMDAwCi0jZGVmaW5lIEFVRFBMQVlfQ01EX0JJVFNUUkVBTV9EQVRBX0FWQUlMX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwbGF5X2NtZF9iaXRzdHJlYW1fZGF0YV9hdmFpbCkKLQotLyogVHlwZSBzcGVjaWZpY2F0aW9uIG9mIGRlY19kYXRhX2F2YWlsIG1lc3NhZ2Ugc2VudCB0byBBVURQTEFZVEFTSwotKi8KLXN0cnVjdCBhdWRwbGF5X2NtZF9iaXRzdHJlYW1fZGF0YV9hdmFpbHsKLQkvKmNvbW1hbmQgSUQqLwotCXVuc2lnbmVkIGludCBjbWRfaWQ7Ci0KLQkvKiBEZWNvZGVyIElEIGZvciB3aGljaCBtZXNzYWdlIGlzIGJlaW5nIHNlbnQgKi8KLQl1bnNpZ25lZCBpbnQgZGVjb2Rlcl9pZDsKLQotCS8qIFN0YXJ0IGFkZHJlc3Mgb2YgZGF0YSBpbiBBUk0gZ2xvYmFsIG1lbW9yeSAqLwotCXVuc2lnbmVkIGludCBidWZfcHRyOwotCi0JLyogTnVtYmVyIG9mIDE2LWJpdCB3b3JkcyBvZiBiaXQtc3RyZWFtIGRhdGEgY29udGlndW91c2x5Ci0JKiBhdmFpbGFibGUgYXQgdGhlIGFib3ZlLW1lbnRpb25lZCBhZGRyZXNzCi0JKi8KLQl1bnNpZ25lZCBpbnQgYnVmX3NpemU7Ci0KLQkvKiBQYXJ0aXRpb24gbnVtYmVyIHVzZWQgYnkgYXVkUGxheVRhc2sgdG8gY29tbXVuaWNhdGUgd2l0aCBEU1AncyBSVE9TCi0JKiBrZXJuZWwKLQkqLwotCXVuc2lnbmVkIGludCBwYXJ0aXRpb25fbnVtYmVyOwotCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZGVmaW5lIEFVRFBMQVlfQ01EX0NIQU5ORUxfSU5GTyAweDAwMDEKLSNkZWZpbmUgQVVEUExBWV9DTURfQ0hBTk5FTF9JTkZPX0xFTiBcCi0gIHNpemVvZihzdHJ1Y3QgYXVkcGxheV9jbWRfY2hhbm5lbF9pbmZvKQotCi1zdHJ1Y3QgYXVkcGxheV9jbWRfY2hhbm5lbF9zZWxlY3QgewotICB1bnNpZ25lZCBpbnQgY21kX2lkOwotICB1bnNpZ25lZCBpbnQgc3RyZWFtX2lkOwotICB1bnNpZ25lZCBpbnQgY2hhbm5lbF9zZWxlY3Q7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgYXVkcGxheV9jbWRfdGhyZXNob2xkX3VwZGF0ZSB7Ci0gIHVuc2lnbmVkIGludCBjbWRfaWQ7Ci0gIHVuc2lnbmVkIGludCB0aHJlc2hvbGRfdXBkYXRlOwotICB1bnNpZ25lZCBpbnQgdGhyZXNob2xkX3ZhbHVlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotdW5pb24gYXVkcGxheV9jbWRfY2hhbm5lbF9pbmZvIHsKLSAgc3RydWN0IGF1ZHBsYXlfY21kX2NoYW5uZWxfc2VsZWN0IGNoX3NlbGVjdDsKLSAgc3RydWN0IGF1ZHBsYXlfY21kX3RocmVzaG9sZF91cGRhdGUgdGhyX3VwZGF0ZTsKLX07Ci0KLSNkZWZpbmUgQVVEUExBWV9DTURfSFBDTV9CVUZfQ0ZHIDB4MDAwMwotI2RlZmluZSBBVURQTEFZX0NNRF9IUENNX0JVRl9DRkdfTEVOIFwKLSAgc2l6ZW9mKHN0cnVjdCBhdWRwbGF5X2NtZF9ocGNtX2J1Zl9jZmcpCi0KLXN0cnVjdCBhdWRwbGF5X2NtZF9ocGNtX2J1Zl9jZmcgewotCXVuc2lnbmVkIGludCBjbWRfaWQ7Ci0JdW5zaWduZWQgaW50IGhvc3RwY21fY29uZmlnOwotCXVuc2lnbmVkIGludCBmZWVkYmFja19mcmVxdWVuY3k7Ci0JdW5zaWduZWQgaW50IGJ5dGVfc3dhcDsKLQl1bnNpZ25lZCBpbnQgbWF4X2J1ZmZlcnM7Ci0JdW5zaWduZWQgaW50IHBhcnRpdGlvbl9udW1iZXI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZGVmaW5lIEFVRFBMQVlfQ01EX0JVRkZFUl9SRUZSRVNIIDB4MDAwNAotI2RlZmluZSBBVURQTEFZX0NNRF9CVUZGRVJfUkVGUkVTSF9MRU4gXAotICBzaXplb2Yoc3RydWN0IGF1ZHBsYXlfY21kX2J1ZmZlcl91cGRhdGUpCi0KLXN0cnVjdCBhdWRwbGF5X2NtZF9idWZmZXJfcmVmcmVzaCB7Ci0JdW5zaWduZWQgaW50IGNtZF9pZDsKLQl1bnNpZ25lZCBpbnQgbnVtX2J1ZmZlcnM7Ci0JdW5zaWduZWQgaW50IGJ1Zl9yZWFkX2NvdW50OwotCXVuc2lnbmVkIGludCBidWYwX2FkZHJlc3M7Ci0JdW5zaWduZWQgaW50IGJ1ZjBfbGVuZ3RoOwotCXVuc2lnbmVkIGludCBidWYxX2FkZHJlc3M7Ci0JdW5zaWduZWQgaW50IGJ1ZjFfbGVuZ3RoOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2RlZmluZSBBVURQTEFZX0NNRF9CSVRTVFJFQU1fREFUQV9BVkFJTF9OVDIgICAgICAgICAgICAweDAwMDUKLSNkZWZpbmUgQVVEUExBWV9DTURfQklUU1RSRUFNX0RBVEFfQVZBSUxfTlQyX0xFTiAgICBcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwbGF5X2NtZF9iaXRzdHJlYW1fZGF0YV9hdmFpbF9udDIpCi0KLS8qIFR5cGUgc3BlY2lmaWNhdGlvbiBvZiBkZWNfZGF0YV9hdmFpbCBtZXNzYWdlIHNlbnQgdG8gQVVEUExBWVRBU0sKLSAqIGZvciBOVDIgKi8KLXN0cnVjdCBhdWRwbGF5X2NtZF9iaXRzdHJlYW1fZGF0YV9hdmFpbF9udDIgewotCS8qY29tbWFuZCBJRCovCi0JdW5zaWduZWQgaW50IGNtZF9pZDsKLQotCS8qIERlY29kZXIgSUQgZm9yIHdoaWNoIG1lc3NhZ2UgaXMgYmVpbmcgc2VudCAqLwotCXVuc2lnbmVkIGludCBkZWNvZGVyX2lkOwotCi0JLyogU3RhcnQgYWRkcmVzcyBvZiBkYXRhIGluIEFSTSBnbG9iYWwgbWVtb3J5ICovCi0JdW5zaWduZWQgaW50IGJ1Zl9wdHI7Ci0KLQkvKiBOdW1iZXIgb2YgMTYtYml0IHdvcmRzIG9mIGJpdC1zdHJlYW0gZGF0YSBjb250aWd1b3VzbHkKLQkqICBhdmFpbGFibGUgYXQgdGhlIGFib3ZlLW1lbnRpb25lZCBhZGRyZXNzCi0JKi8KLQl1bnNpZ25lZCBpbnQgYnVmX3NpemU7Ci0KLQkvKiBQYXJ0aXRpb24gbnVtYmVyIHVzZWQgYnkgYXVkUGxheVRhc2sgdG8gY29tbXVuaWNhdGUgd2l0aCBEU1AncyBSVE9TCi0JKiBrZXJuZWwKLQkqLwotCXVuc2lnbmVkIGludCBwYXJ0aXRpb25fbnVtYmVyOwotCi0JLyogYml0c3RyZWFtIHdyaXRlIHBvaW50ZXIgKi8KLQl1bnNpZ25lZCBpbnQgZHNwQml0c3RyZWFtV3JpdGVQdHI7Ci0KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgQVVEUExBWV9DTURfT1VUUE9SVF9GTFVTSCAweDAwMDYKLQotc3RydWN0IGF1ZHBsYXlfY21kX291dHBvcnRfZmx1c2ggewotCXVuc2lnbmVkIGludCBjbWRfaWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZW5kaWYgLyogUURTUDVBVURQTEFZQ01EX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL3Fkc3A1YXVkcGxheW1zZy5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvcWRzcDVhdWRwbGF5bXNnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1M2YwZTcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvcWRzcDVhdWRwbGF5bXNnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jaWZuZGVmIFFEU1A1QVVEUExBWU1TR19ICi0jZGVmaW5lIFFEU1A1QVVEUExBWU1TR19ICi0KLS8qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qCi0gICAgICAgUSBEIFMgUCA1ICBBIFUgRCBJIE8gICBQIEwgQSBZICBUIEEgUyBLICAgTSBTIEcKLQotR0VORVJBTCBERVNDUklQVElPTgotICBNZXNzYWdlIHNlbnQgYnkgQVVEUExBWSB0YXNrCi0KLVJFRkVSRU5DRVMKLSAgTm9uZQotCi0KLUNvcHlyaWdodCAoYykgMTk5Mi0yMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLW1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qLwotCi0jZGVmaW5lIEFVRFBMQVlfTVNHX0RFQ19ORUVEU19EQVRBCQkweDAwMDEKLSNkZWZpbmUgQVVEUExBWV9NU0dfREVDX05FRURTX0RBVEFfTVNHX0xFTglcCi0Jc2l6ZW9mKGF1ZHBsYXlfbXNnX2RlY19uZWVkc19kYXRhKQotCi1zdHJ1Y3QgYXVkcGxheV9tc2dfZGVjX25lZWRzX2RhdGEgewotCS8qIHJlc2VydmVkKi8KLQl1bnNpZ25lZCBpbnQgZGVjX2lkOwotCi0JLypUaGUgcmVhZCBwb2ludGVyIG9mZnNldCBvZiBleHRlcm5hbCBtZW1vcnkgdGlsbCB3aGljaCBiaXRzdHJlYW0KLQloYXMgYmVlbiBkbWVkIGluKi8KLQl1bnNpZ25lZCBpbnQgYWRlY0RhdGFSZWFkUHRyT2Zmc2V0OwotCi0JLypUaGUgYnVmZmVyIHNpemUgb2YgZXh0ZXJuYWwgbWVtb3J5LiAqLwotCXVuc2lnbmVkIGludCBhZGVjRGF0YUJ1ZlNpemU7Ci0KLQl1bnNpZ25lZCBpbnQgCWJpdHN0cmVhbV9mcmVlX2xlbjsKLQl1bnNpZ25lZCBpbnQJYml0c3RyZWFtX3dyaXRlX3B0cjsKLQl1bnNpZ25lZCBpbnQJYml0c3RhcmVtX2J1Zl9zdGFydDsKLQl1bnNpZ25lZCBpbnQJYml0c3RyZWFtX2J1Zl9sZW47Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZGVmaW5lIEFVRFBMQVlfVVBfU1RSRUFNX0lORk8gMHgwMDAzCi0jZGVmaW5lIEFVRFBMQVlfVVBfU1RSRUFNX0lORk9fTEVOIFwKLQlzaXplb2Yoc3RydWN0IGF1ZHBsYXlfbXNnX3N0cmVhbV9pbmZvKQotCi1zdHJ1Y3QgYXVkcGxheV9tc2dfc3RyZWFtX2luZm8gewotCXVuc2lnbmVkIGludCBkZWNvZGVyX2lkOwotCXVuc2lnbmVkIGludCBjaGFubmVsX2luZm87Ci0JdW5zaWduZWQgaW50IHNhbXBsZV9mcmVxOwotCXVuc2lnbmVkIGludCBiaXRzdHJlYW1faW5mbzsKLQl1bnNpZ25lZCBpbnQgYml0X3JhdGU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZGVmaW5lIEFVRFBMQVlfTVNHX0JVRkZFUl9VUERBVEUgMHgwMDA0Ci0jZGVmaW5lIEFVRFBMQVlfTVNHX0JVRkZFUl9VUERBVEVfTEVOIFwKLQlzaXplb2Yoc3RydWN0IGF1ZHBsYXlfbXNnX2J1ZmZlcl91cGRhdGUpCi0KLXN0cnVjdCBhdWRwbGF5X21zZ19idWZmZXJfdXBkYXRlIHsKLQl1bnNpZ25lZCBpbnQgYnVmZmVyX3dyaXRlX2NvdW50OwotCXVuc2lnbmVkIGludCBudW1fb2ZfYnVmZmVyOwotCXVuc2lnbmVkIGludCBidWYwX2FkZHJlc3M7Ci0JdW5zaWduZWQgaW50IGJ1ZjBfbGVuZ3RoOwotCXVuc2lnbmVkIGludCBidWYxX2FkZHJlc3M7Ci0JdW5zaWduZWQgaW50IGJ1ZjFfbGVuZ3RoOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2RlZmluZSBBVURQTEFZX1VQX09VVFBPUlRfRkxVU0hfQUNLIDB4MDAwNQotCi0jZW5kaWYgLyogUURTUDVBVURQTEFZTVNHX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHBjbWRpLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBwY21kaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGNmNWQ4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHBjbWRpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDg4ICswLDAgQEAKLSNpZm5kZWYgX19NQUNIX1FEU1A1X1YyX1FEU1A1QVVEUFBDTURJX0gKLSNkZWZpbmUgX19NQUNIX1FEU1A1X1YyX1FEU1A1QVVEUFBDTURJX0gKLQotLyo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSoKLQotICAgIEEgVSBEIEkgTyAgIFAgTyBTIFQgICBQIFIgTyBDIEUgUyBTIEkgTiBHICBJIE4gVCBFIFIgTiBBIEwgIEMgTyBNIE0gQSBOIEQgUwotCi1HRU5FUkFMIERFU0NSSVBUSU9OCi0gIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbnRpb25zIG9mIGZvcm1hdCBibG9ja3Mgb2YgY29tbWFuZHMKLSAgdGhhdCBhcmUgYWNjZXB0ZWQgYnkgQVVEUFAgVGFzawotCi1SRUZFUkVOQ0VTCi0gIE5vbmUKLQotRVhURVJOQUxJWkVEIEZVTkNUSU9OUwotICBOb25lCi0KLUNvcHlyaWdodChjKSAxOTkyLTIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1UaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotKj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Ki8KLQotLyoKLSAqIEFSTSB0byBBVURQUFRBU0sgQ29tbWFuZHMKLSAqCi0gKiBBUk0gdXNlcyB0aHJlZSBjb21tYW5kIHF1ZXVlcyB0byBjb21tdW5pY2F0ZSB3aXRoIEFVRFBQVEFTSwotICogMSl1UEF1ZFBQQ21kMVF1ZXVlIDogVXNlZCBmb3IgbW9yZSBmcmVxdWVudCBhbmQgc2hvcnRlciBsZW5ndGggY29tbWFuZHMKLSAqIAlMb2NhdGlvbiA6IE1FTUEKLSAqIAlCdWZmZXIgU2l6ZSA6IDYgd29yZHMKLSAqIAlObyBvZiBidWZmZXJzIGluIGEgcXVldWUgOiAyMCBmb3IgZ2FtaW5nIGF1ZGlvIGFuZCA1IGZvciBvdGhlciBpbWFnZXMKLSAqIDIpdVBBdWRQUENtZDJRdWV1ZSA6IFVzZWQgZm9yIGNvbW1hbmRzIHdoaWNoIGFyZSBub3QgbXVjaCBsZW5ndGhpZXIKLSAqIAlMb2NhdGlvbiA6IE1FTUEKLSAqIAlCdWZmZXIgU2l6ZSA6IDIzCi0gKiAJTm8gb2YgYnVmZmVycyBpbiBhIHF1ZXVlIDogMgotICogMyl1UEF1ZE9PQ21kM1F1ZXVlIDogVXNlZCBmb3IgbGVuZ3RoaWVyIGFuZCBtb3JlIGZyZXF1ZW50IGNvbW1hbmRzCi0gKiAJTG9jYXRpb24gOiBNRU1BCi0gKiAJQnVmZmVyIFNpemUgOiAxNDUKLSAqIAlObyBvZiBidWZmZXJzIGluIGEgcXVldWUgOiAzCi0gKi8KLQotLyoKLSAqIENvbW1hbmRzIFJlbGF0ZWQgdG8gdVBBdWRQUENtZDFRdWV1ZQotICovCi0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgYWN0aXZlIGRlY29kZXJzCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX0RFQ19UWVBFIAkJMHgwMDAxCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfREVDX1RZUEVfTEVOIAlzaXplb2Yoc3RydWN0IGF1ZHBwX2NtZF9jZmdfZGVjX3R5cGUpCi0KLS8qIEVuYWJsZSB0aGUgZGVjb2RlciAqLwotI2RlZmluZSBBVURQUF9DTURfREVDX1RZUEVfTSAgICAgICAgICAgCTB4MDAwRgotCi0jZGVmaW5lIEFVRFBQX0NNRF9FTkFfREVDX1YgICAgICAgICAJMHg0MDAwCi0jZGVmaW5lIEFVRFBQX0NNRF9ESVNfREVDX1YgICAgICAgIAkweDAwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX0RFQ19TVEFURV9NICAgICAgICAgIAkweDQwMDAKLQotI2RlZmluZSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDCTB4ODAwMAotI2RlZmluZSBBVURQUF9DTURfRE9OVF9VUERBVEVfQ0ZHX0RFQwkweDAwMDAKLQotCi0vKiBUeXBlIHNwZWNpZmljYXRpb24gb2YgY21kX2NmZ19kZWMgKi8KLQotc3RydWN0IGF1ZHBwX2NtZF9jZmdfZGVjX3R5cGUgewotCXVuc2lnbmVkIHNob3J0IGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCBzdHJlYW1faWQ7Ci0JdW5zaWduZWQgc2hvcnQgZGVjX2NmZzsKLQl1bnNpZ25lZCBzaG9ydCBkbV9tb2RlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIFBhdXNlICwgUmVzdW1lIGFuZCBmbHVzaGVzIHRoZSBzZWxlY3RlZCBhdWRpbyBkZWNvZGVycwotICovCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0RFQ19DVFJMCQkweDAwMDIKLSNkZWZpbmUgQVVEUFBfQ01EX0RFQ19DVFJMX0xFTgkJc2l6ZW9mKHN0cnVjdCBhdWRwcF9jbWRfZGVjX2N0cmwpCi0KLS8qIERlY29kZXIgY29udHJvbCBjb21tYW5kcyBmb3IgcGF1c2UsIHJlc3VtZSBhbmQgZmx1c2ggKi8KLSNkZWZpbmUgQVVEUFBfQ01EX0ZMVVNIX1YgICAgICAgICAJCTB4MjAwMAotCi0jZGVmaW5lIEFVRFBQX0NNRF9QQVVTRV9WCQkgICAgICAgIDB4NDAwMAotI2RlZmluZSBBVURQUF9DTURfUkVTVU1FX1YJCSAgICAgICAgMHgwMDAwCi0KLSNkZWZpbmUgQVVEUFBfQ01EX1VQREFURV9WCQkgICAgICAgIDB4ODAwMAotI2RlZmluZSBBVURQUF9DTURfSUdOT1JFX1YJCSAgICAgICAgMHgwMDAwCi0KLQotLyogVHlwZSBTcGVjIGZvciBkZWNvZGVyIGNvbnRyb2wgY29tbWFuZCovCi0KLXN0cnVjdCBhdWRwcF9jbWRfZGVjX2N0cmx7Ci0JdW5zaWduZWQgc2hvcnQgY21kX2lkOwotCXVuc2lnbmVkIHNob3J0IHN0cmVhbV9pZDsKLQl1bnNpZ25lZCBzaG9ydCBkZWNfY3RybDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBDb25maWd1cmUgdGhlIEFWU3luYyBGZWVkQmFjayBNZWNoYW5pc20KLSAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9BVlNZTkMJMHgwMDAzCi0jZGVmaW5lIEFVRFBQX0NNRF9BVlNZTkNfTEVOCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2F2c3luYykKLQotc3RydWN0IGF1ZHBwX2NtZF9hdnN5bmN7Ci0JdW5zaWduZWQgc2hvcnQgY21kX2lkOwotCXVuc2lnbmVkIHNob3J0IHN0cmVhbV9pZDsKLQl1bnNpZ25lZCBzaG9ydCBpbnRlcnJ1cHRfaW50ZXJ2YWw7Ci0JdW5zaWduZWQgc2hvcnQgc2FtcGxlX2NvdW50ZXJfZGxzdzsKLQl1bnNpZ25lZCBzaG9ydCBzYW1wbGVfY291bnRlcl9kbXN3OwotCXVuc2lnbmVkIHNob3J0IHNhbXBsZV9jb3VudGVyX21zdzsKLQl1bnNpZ25lZCBzaG9ydCBieXRlX2NvdW50ZXJfZGxzdzsKLQl1bnNpZ25lZCBzaG9ydCBieXRlX2NvdW50ZXJfZG1zdzsKLQl1bnNpZ25lZCBzaG9ydCBieXRlX2NvdW50ZXJfbXN3OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIE1hY3JvcyB1c2VkIHRvIHN0b3JlIHRoZSBBViBTeW5jIEluZm8gZnJvbSBEU1AKLSAqLwotCi0jZGVmaW5lIEFVRFBQX0FWU1lOQ19DSF9DT1VOVCAxCi0jZGVmaW5lIEFVRFBQX0FWU1lOQ19OVU1fV09SRFMgNgotLyogVGltZW91dCBvZiAzMDAwbXMgZm9yIEFWIFN5bmMgUXVlcnkgcmVzcG9uc2UgKi8KLSNkZWZpbmUgQVVEUFBfQVZTWU5DX0VWRU5UX1RJTUVPVVQgMzAwMAotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gUXVlcnkgQVZTeW5jIEluZm8gZnJvbSBEU1AKLSAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9RVUVSWV9BVlNZTkMJMHgwMDA2Ci0KLXN0cnVjdCBhdWRwcF9jbWRfcXVlcnlfYXZzeW5jewotCXVuc2lnbmVkIHNob3J0IGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCBzdHJlYW1faWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gZW5hYmxlIG9yIGRpc2FibGUoc2xlZXApIHRoZSBBVURQUFRBU0sKLSAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkcJMHgwMDA0Ci0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfTEVOCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZykKLQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX1NMRUVQICAgCQkJCTB4MDAwMAotI2RlZmluZSBBVURQUF9DTURfQ0ZHX0VOQUJMRSAgCQkJCTB4RkZGRgotCi1zdHJ1Y3QgYXVkcHBfY21kX2NmZyB7Ci0JdW5zaWduZWQgc2hvcnQgY21kX2lkOwotCXVuc2lnbmVkIHNob3J0IGNmZzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBJbmplY3Qgb3IgZHJvcCB0aGUgc3BlY2lmaWVkIG5vIG9mIHNhbXBsZXMKLSAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9BREpVU1RfU0FNUAkJMHgwMDA1Ci0jZGVmaW5lIEFVRFBQX0NNRF9BREpVU1RfU0FNUF9MRU4Jc2l6ZW9mKHN0cnVjdCBhdWRwcF9jbWRfYWRqdXN0X3NhbXApCi0KLSNkZWZpbmUgQVVEUFBfQ01EX1NBTVBfRFJPUAkJLTEKLSNkZWZpbmUgQVVEUFBfQ01EX1NBTVBfSU5TRVJUCQkweDAwMDEKLQotI2RlZmluZSBBVURQUF9DTURfTlVNX1NBTVBMRVMJCTB4MDAwMQotCi1zdHJ1Y3QgYXVkcHBfY21kX2FkanVzdF9zYW1wIHsKLQl1bnNpZ25lZCBzaG9ydCBjbWRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQgb2JqZWN0X25vOwotCXNpZ25lZCBzaG9ydCBzYW1wbGVfaW5zZXJ0X29yX2Ryb3A7Ci0JdW5zaWduZWQgc2hvcnQgbnVtX3NhbXBsZXM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gQ29uZmlndXJlIEFWU3luYyBGZWVkYmFjayBNZWNoYW5pc20KLSAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9ST1VUSU5HX01PREUgICAgICAweDAwMDcKLSNkZWZpbmUgQVVEUFBfQ01EX1JPVVRJTkdfTU9ERV9MRU4gIFwKLXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX3JvdXRpbmdfbW9kZSkKLQotc3RydWN0IGF1ZHBwX2NtZF9yb3V0aW5nX21vZGUgewotCXVuc2lnbmVkIHNob3J0IGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCBvYmplY3RfbnVtYmVyOwotCXVuc2lnbmVkIHNob3J0IHJvdXRpbmdfbW9kZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kcyBSZWxhdGVkIHRvIHVQQXVkUFBDbWQyUXVldWUKLSAqLwotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gY29uZmlndXJlIFBlciBkZWNvZGVyIFBhcmFtZXRlcnMgKENvbW1vbikKLSAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVMgCQkweDAwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNU19DT01NT05fTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfY29tbW9uKQotCi0jZGVmaW5lIEFVRFBQX0NNRF9TVEFUVVNfTVNHX0ZMQUdfRU5BX0ZDTQkweDQwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX1NUQVRVU19NU0dfRkxBR19ESVNfRkNNCTB4MDAwMAotCi0jZGVmaW5lIEFVRFBQX0NNRF9TVEFUVVNfTVNHX0ZMQUdfRU5BX0RDTQkweDgwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX1NUQVRVU19NU0dfRkxBR19ESVNfRENNCTB4MDAwMAotCi0vKiBTYW1wbGluZyBmcmVxdWVuY3kqLwotI2RlZmluZSAgQVVEUFBfQ01EX1NBTVBfUkFURV85NjAwMCAJMHgwMDAwCi0jZGVmaW5lICBBVURQUF9DTURfU0FNUF9SQVRFXzg4MjAwIAkweDAwMDEKLSNkZWZpbmUgIEFVRFBQX0NNRF9TQU1QX1JBVEVfNjQwMDAgCTB4MDAwMgotI2RlZmluZSAgQVVEUFBfQ01EX1NBTVBfUkFURV80ODAwMCAJMHgwMDAzCi0jZGVmaW5lICBBVURQUF9DTURfU0FNUF9SQVRFXzQ0MTAwIAkweDAwMDQKLSNkZWZpbmUgIEFVRFBQX0NNRF9TQU1QX1JBVEVfMzIwMDAgCTB4MDAwNQotI2RlZmluZSAgQVVEUFBfQ01EX1NBTVBfUkFURV8yNDAwMCAJMHgwMDA2Ci0jZGVmaW5lICBBVURQUF9DTURfU0FNUF9SQVRFXzIyMDUwIAkweDAwMDcKLSNkZWZpbmUgIEFVRFBQX0NNRF9TQU1QX1JBVEVfMTYwMDAgCTB4MDAwOAotI2RlZmluZSAgQVVEUFBfQ01EX1NBTVBfUkFURV8xMjAwMCAJMHgwMDA5Ci0jZGVmaW5lICBBVURQUF9DTURfU0FNUF9SQVRFXzExMDI1IAkweDAwMEEKLSNkZWZpbmUgIEFVRFBQX0NNRF9TQU1QX1JBVEVfODAwMCAgCTB4MDAwQgotCi0KLS8qCi0gKiBUeXBlIHNwZWNpZmljYXRpb24gb2YgY21kX2FkZWNfY2ZnIHNlbnQgdG8gYWxsIGRlY29kZXIKLSAqLwotCi1zdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19jb21tb24gewotCXVuc2lnbmVkIHNob3J0ICBjbWRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQgIGRlY19pZDsKLQl1bnNpZ25lZCBzaG9ydCAgbGVuZ3RoOwotCXVuc2lnbmVkIHNob3J0ICByZXNlcnZlZDsKLQl1bnNpZ25lZCBzaG9ydCAgaW5wdXRfc2FtcGxpbmdfZnJlcXVlbmN5OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSBQZXIgZGVjb2RlciBQYXJhbWV0ZXJzIChXYXYpCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TX1dBVl9MRU4gXAotCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc193YXYpCi0KLQotI2RlZmluZQlBVURQUF9DTURfV0FWX1NURVJFT19DRkdfTU9OTwkweDAwMDEKLSNkZWZpbmUgQVVEUFBfQ01EX1dBVl9TVEVSRU9fQ0ZHX1NURVJFTwkweDAwMDIKLQotI2RlZmluZSBBVURQUF9DTURfV0FWX1BDTV9XSURUSF84CTB4MDAwMAotI2RlZmluZSBBVURQUF9DTURfV0FWX1BDTV9XSURUSF8xNgkweDAwMDEKLSNkZWZpbmUgQVVEUFBfQ01EX1dBVl9QQ01fV0lEVEhfMjQJMHgwMDAyCi0KLXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX3dhdiB7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfY29tbW9uCQljb21tb247Ci0JdW5zaWduZWQgc2hvcnQJCQkJCXN0ZXJlb19jZmc7Ci0JdW5zaWduZWQgc2hvcnQJCQkJCXBjbV93aWR0aDsKLQl1bnNpZ25lZCBzaG9ydCAJCQkJCXNpZ247Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogIENvbW1hbmQgU3RydWN0dXJlIGZvciBDTURfQ0ZHX0RFVl9NSVhFUgotICovCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19ERVZfTUlYRVJfUEFSQU1TX0xFTiBcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcF9jbWRfY2ZnX2Rldl9taXhlcl9wYXJhbXMpCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19ERVZfTUlYRVIgICAgICAgICAgICAweDAwMDgKLQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX0RFVl9NSVhFUl9JRF8wICAgICAgIDAKLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19ERVZfTUlYRVJfSURfMSAgICAgICAxCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfREVWX01JWEVSX0lEXzIgICAgICAgMgotI2RlZmluZSBBVURQUF9DTURfQ0ZHX0RFVl9NSVhFUl9JRF8zICAgICAgIDMKLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19ERVZfTUlYRVJfSURfNCAgICAgICA0Ci0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfREVWX01JWEVSX0lEXzUgICAgICAgNQotCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfREVWX01JWEVSX0RFVl9OT05FICAgMHgwMDAwCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfREVWX01JWEVSX0RFVl8wICAgICAgXAotCQkJCSgweDEgPDwgQVVEUFBfQ01EX0NGR19ERVZfTUlYRVJfSURfMCkKLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19ERVZfTUlYRVJfREVWXzEgICAgICBcCi0JCQkJKDB4MSA8PCBBVURQUF9DTURfQ0ZHX0RFVl9NSVhFUl9JRF8xKQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX0RFVl9NSVhFUl9ERVZfMiAgICAgIFwKLQkJCQkoMHgxIDw8IEFVRFBQX0NNRF9DRkdfREVWX01JWEVSX0lEXzIpCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfREVWX01JWEVSX0RFVl8zICAgICAgXAotCQkJCSgweDEgPDwgQVVEUFBfQ01EX0NGR19ERVZfTUlYRVJfSURfMykKLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19ERVZfTUlYRVJfREVWXzQgICAgICBcCi0JCQkJKDB4MSA8PCBBVURQUF9DTURfQ0ZHX0RFVl9NSVhFUl9JRF80KQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX0RFVl9NSVhFUl9ERVZfNSAgICAgIFwKLQkJCQkoMHgxIDw8IEFVRFBQX0NNRF9DRkdfREVWX01JWEVSX0lEXzUpCi0KLXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2Rldl9taXhlcl9wYXJhbXMgewotCXVuc2lnbmVkIHNob3J0IGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCBzdHJlYW1faWQ7Ci0JdW5zaWduZWQgc2hvcnQgbWl4ZXJfY21kOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gY29uZmlndXJlIFBlciBkZWNvZGVyIFBhcmFtZXRlcnMgKEFEUENNKQotICovCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNU19BRFBDTV9MRU4gXAotCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19hZHBjbSkKLQotCi0jZGVmaW5lCUFVRFBQX0NNRF9BRFBDTV9TVEVSRU9fQ0ZHX01PTk8JCTB4MDAwMQotI2RlZmluZSBBVURQUF9DTURfQURQQ01fU1RFUkVPX0NGR19TVEVSRU8JMHgwMDAyCi0KLXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX2FkcGNtIHsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19jb21tb24JCWNvbW1vbjsKLQl1bnNpZ25lZCBzaG9ydAkJCQkJc3RlcmVvX2NmZzsKLQl1bnNpZ25lZCBzaG9ydCAJCQkJCWJsb2NrX3NpemU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gY29uZmlndXJlIFBlciBkZWNvZGVyIFBhcmFtZXRlcnMgKFdNQSkKLSAqLwotCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVNfV01BX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX3dtYSkKLQotc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfd21hIHsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19jb21tb24gICAgY29tbW9uOwotCXVuc2lnbmVkIHNob3J0IAlhcm1kYXRhcmVxdGhyOwotCXVuc2lnbmVkIHNob3J0IAljaGFubmVsc2RlY29kZWQ7Ci0JdW5zaWduZWQgc2hvcnQgCXdtYWJ5dGVzcGVyc2VjOwotCXVuc2lnbmVkIHNob3J0CXdtYXNhbXBsaW5nZnJlcTsKLQl1bnNpZ25lZCBzaG9ydAl3bWFlbmNvZGVyb3B0czsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSBQZXIgZGVjb2RlciBQYXJhbWV0ZXJzIChNUDMpCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TX01QM19MRU4JXAotCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19tcDMpCi0KLXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX21wMyB7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfY29tbW9uICAgIGNvbW1vbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSBQZXIgZGVjb2RlciBQYXJhbWV0ZXJzIChBQUMpCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TX0FBQ19MRU4JXAotCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19hYWMpCi0KLQotI2RlZmluZSBBVURQUF9DTURfQUFDX0ZPUk1BVF9BRFRTCQktMQotI2RlZmluZQlBVURQUF9DTURfQUFDX0ZPUk1BVF9SQVcJCTB4MDAwMAotI2RlZmluZQlBVURQUF9DTURfQUFDX0ZPUk1BVF9QU1VFRE9fUkFXCQkweDAwMDEKLSNkZWZpbmUJQVVEUFBfQ01EX0FBQ19GT1JNQVRfTE9BUwkJMHgwMDAyCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0FBQ19BVURJT19PQkpFQ1RfTEMJCTB4MDAwMgotI2RlZmluZSBBVURQUF9DTURfQUFDX0FVRElPX09CSkVDVF9MVFAJCTB4MDAwNAotI2RlZmluZSBBVURQUF9DTURfQUFDX0FVRElPX09CSkVDVF9FUkxDCTB4MDAxMQotCi0jZGVmaW5lIEFVRFBQX0NNRF9BQUNfU0JSX09OX0ZMQUdfT04JCTB4MDAwMQotI2RlZmluZSBBVURQUF9DTURfQUFDX1NCUl9PTl9GTEFHX09GRgkJMHgwMDAwCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0FBQ19TQlJfUFNfT05fRkxBR19PTgkJMHgwMDAxCi0jZGVmaW5lIEFVRFBQX0NNRF9BQUNfU0JSX1BTX09OX0ZMQUdfT0ZGCTB4MDAwMAotCi1zdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19hYWMgewotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX2NvbW1vbgljb21tb247Ci0Jc2lnbmVkIHNob3J0CQkJZm9ybWF0OwotCXVuc2lnbmVkIHNob3J0CQkJYXVkaW9fb2JqZWN0OwotCXVuc2lnbmVkIHNob3J0CQkJZXBfY29uZmlnOwotCXVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICAgYWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgICBhYWNfc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgICBhYWNfc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgICBzYnJfb25fZmxhZzsKLQl1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgIHNicl9wc19vbl9mbGFnOwotCXVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICAgY2hhbm5lbF9jb25maWd1cmF0aW9uOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSBQZXIgZGVjb2RlciBQYXJhbWV0ZXJzIChWMTNLKQotICovCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNU19WMTNLX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX3YxM2spCi0KLQotI2RlZmluZSBBVURQUF9DTURfU1RFUkVPX0NGR19NT05PCQkweDAwMDEKLSNkZWZpbmUgQVVEUFBfQ01EX1NURVJFT19DRkdfU1RFUkVPCQkweDAwMDIKLQotc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfdjEzayB7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfY29tbW9uICAgIAljb21tb247Ci0JdW5zaWduZWQgc2hvcnQJCQlzdGVyZW9fY2ZnOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TX0VWUkNfTEVOIFwKLQlzaXplb2Yoc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfZXZyYykKLQotc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfZXZyYyB7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfY29tbW9uIGNvbW1vbjsKLQl1bnNpZ25lZCBzaG9ydCBzdGVyZW9fY2ZnOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBjb25maWd1cmUgUGVyIGRlY29kZXIgUGFyYW1ldGVycyAoQU1SV0IpCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TX0FNUldCX0xFTiBcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX2FtcndiKQotCi1zdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19hbXJ3YiB7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfY29tbW9uICAgIAljb21tb247Ci0JdW5zaWduZWQgc2hvcnQJCQlzdGVyZW9fY2ZnOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSBQZXIgZGVjb2RlciBQYXJhbWV0ZXJzIChXTUFQUk8pCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TX1dNQVBST19MRU4JXAotCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc193bWFwcm8pCi0KLXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX3dtYXBybyB7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfY29tbW9uICAgIGNvbW1vbjsKLQl1bnNpZ25lZCBzaG9ydCAJYXJtZGF0YXJlcXRocjsKLQl1aW50OF90ICAgICAgICAgdmFsaWRiaXRzcGVyc2FtcGxlOwotCXVpbnQ4X3QgICAgICAgICBudW1jaGFubmVsczsKLQl1bnNpZ25lZCBzaG9ydCAgZm9ybWF0dGFnOwotCXVuc2lnbmVkIHNob3J0ICBzYW1wbGluZ3JhdGU7Ci0JdW5zaWduZWQgc2hvcnQgIGF2Z2J5dGVzcGVyc2Vjb25kOwotCXVuc2lnbmVkIHNob3J0ICBhc2ZwYWNrZXRsZW5ndGg7Ci0JdW5zaWduZWQgc2hvcnQgCWNoYW5uZWxtYXNrOwotCXVuc2lnbmVkIHNob3J0IAllbmNvZGVvcHQ7Ci0JdW5zaWduZWQgc2hvcnQJYWR2YW5jZWRlbmNvZGVvcHQ7Ci0JdWludDMyX3QJYWR2YW5jZWRlbmNvZGVvcHQyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSB0aGUgIEhPU1QgUENNIGludGVyZmFjZQotICovCi0KLSNkZWZpbmUgQVVEUFBfQ01EX1BDTV9JTlRGCTB4MDAwMQotI2RlZmluZSBBVURQUF9DTURfUENNX0lOVEZfMgkweDAwMDIKLSNkZWZpbmUgQVVEUFBfQ01EX1BDTV9JTlRGX0xFTglzaXplb2Yoc3RydWN0IGF1ZHBwX2NtZF9wY21faW50ZikKLQotI2RlZmluZSBBVURQUF9DTURfUENNX0lOVEZfTU9OT19WCQkgICAgICAgIDB4MDAwMQotI2RlZmluZSBBVURQUF9DTURfUENNX0lOVEZfU1RFUkVPX1YgICAgICAgICAJMHgwMDAyCi0KLS8qIFRoZXNlIHR3byB2YWx1ZXMgZGlmZmVyZW50aWF0ZSB0aGUgdHdvIHR5cGVzIG9mIGNvbW1hbmRzIHRoYXQgY291bGQgYmUgaXNzdWVkCi0gKiBJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBjb21tYW5kIGFuZCBCdWZmZXIgdXBkYXRlIGNvbW1hbmQgKi8KLQotI2RlZmluZSBBVURQUF9DTURfUENNX0lOVEZfQ09ORklHX0NNRF9WCSAgICAgICAJMHgwMDAwCi0jZGVmaW5lIEFVRFBQX0NNRF9QQ01fSU5URl9CVUZGRVJfQ01EX1YJICAgICAgICAtMQotCi0jZGVmaW5lIEFVRFBQX0NNRF9QQ01fSU5URl9SWF9FTkFfTSAgICAgICAgICAgICAgMHgwMDBGCi0jZGVmaW5lIEFVRFBQX0NNRF9QQ01fSU5URl9SWF9FTkFfQVJNVE9EU1BfViAgICAgMHgwMDA4Ci0jZGVmaW5lIEFVRFBQX0NNRF9QQ01fSU5URl9SWF9FTkFfRFNQVE9BUk1fViAgICAgMHgwMDA0Ci0KLS8qIFRoZXNlIGZsYWdzIGNvbnRyb2wgdGhlIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgb2YgdGhlIGludGVyZmFjZSB0b2dldGhlcgotICogIHdpdGggaG9zdCBpbnRlcmZhY2UgYml0IG1hc2suICovCi0KLSNkZWZpbmUgQVVEUFBfQ01EX1BDTV9JTlRGX0VOQV9WICAgICAgICAgICAgLTEKLSNkZWZpbmUgQVVEUFBfQ01EX1BDTV9JTlRGX0RJU19WICAgICAgICAgICAgMHgwMDAwCi0KLQotI2RlZmluZSAgQVVEUFBfQ01EX1BDTV9JTlRGX0ZVTExfRFVQTEVYICAgICAgICAgICAweDAKLSNkZWZpbmUgIEFVRFBQX0NNRF9QQ01fSU5URl9IQUxGX0RVUExFWF9UT0RTUCAgICAgMHgxCi0KLQotI2RlZmluZSAgQVVEUFBfQ01EX1BDTV9JTlRGX09CSkVDVF9OVU0gICAgICAgICAgIDB4NQotI2RlZmluZSAgQVVEUFBfQ01EX1BDTV9JTlRGX0NPTU1PTl9PQkpFQ1RfTlVNICAgIDB4NgotCi1zdHJ1Y3QgYXVkcHBfY21kX3BjbV9pbnRmIHsKLQl1bnNpZ25lZCBzaG9ydCAgY21kX2lkOwotCXVuc2lnbmVkIHNob3J0ICBzdHJlYW07Ci0JdW5zaWduZWQgc2hvcnQgIHN0cmVhbV9pZDsKLQlzaWduZWQgc2hvcnQgIGNvbmZpZzsKLQl1bnNpZ25lZCBzaG9ydCAgaW50Zl90eXBlOwotCi0JLyogRFNQIC0+IEFSTSBDb25maWd1cmF0aW9uICovCi0JdW5zaWduZWQgc2hvcnQgIHJlYWRfYnVmMUxTVzsKLQl1bnNpZ25lZCBzaG9ydCAgcmVhZF9idWYxTVNXOwotCXVuc2lnbmVkIHNob3J0ICByZWFkX2J1ZjFfbGVuOwotCi0JdW5zaWduZWQgc2hvcnQgIHJlYWRfYnVmMkxTVzsKLQl1bnNpZ25lZCBzaG9ydCAgcmVhZF9idWYyTVNXOwotCXVuc2lnbmVkIHNob3J0ICByZWFkX2J1ZjJfbGVuOwotCS8qICAgMDpIT1NUX1BDTV9JTlRGIGRpc2FibGUKLQkqKiAgMHhGRkZGOiBIT1NUX1BDTV9JTlRGIGVuYWJsZQotCSovCi0Jc2lnbmVkIHNob3J0ICBkc3BfdG9fYXJtX2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQgIHBhcnRpdGlvbl9udW1iZXI7Ci0KLQkvKiBBUk0gLT4gRFNQIENvbmZpZ3VyYXRpb24gKi8KLQl1bnNpZ25lZCBzaG9ydCAgd3JpdGVfYnVmMUxTVzsKLQl1bnNpZ25lZCBzaG9ydCAgd3JpdGVfYnVmMU1TVzsKLQl1bnNpZ25lZCBzaG9ydCAgd3JpdGVfYnVmMV9sZW47Ci0KLQl1bnNpZ25lZCBzaG9ydCAgd3JpdGVfYnVmMkxTVzsKLQl1bnNpZ25lZCBzaG9ydCAgd3JpdGVfYnVmMk1TVzsKLQl1bnNpZ25lZCBzaG9ydCAgd3JpdGVfYnVmMl9sZW47Ci0KLQkvKiAgIDA6SE9TVF9QQ01fSU5URiBkaXNhYmxlCi0JKiogIDB4RkZGRjogSE9TVF9QQ01fSU5URiBlbmFibGUKLQkqLwotCXNpZ25lZCBzaG9ydCAgYXJtX3RvX3J4X2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQgIHdlaWdodF9kZWNvZGVyX3RvX3J4OwotCXVuc2lnbmVkIHNob3J0ICB3ZWlnaHRfYXJtX3RvX3J4OwotCi0JdW5zaWduZWQgc2hvcnQgIHBhcnRpdGlvbl9udW1iZXJfYXJtX3RvX2RzcDsKLQl1bnNpZ25lZCBzaG9ydCAgc2FtcGxlX3JhdGU7Ci0JdW5zaWduZWQgc2hvcnQgIGNoYW5uZWxfbW9kZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiogIEJVRkZFUiBVUERBVEUgQ09NTUFORAotICovCi0jZGVmaW5lIEFVRFBQX0NNRF9QQ01fSU5URl9TRU5EX0JVRl9QQVJBTVNfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHBwX2NtZF9wY21faW50Zl9zZW5kX2J1ZmZlcikKLQotc3RydWN0IGF1ZHBwX2NtZF9wY21faW50Zl9zZW5kX2J1ZmZlciB7Ci0JdW5zaWduZWQgc2hvcnQgIGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCAgc3RyZWFtOwotCXVuc2lnbmVkIHNob3J0ICBzdHJlYW1faWQ7Ci0JLyogc2V0IGNvbmZpZyA9IDB4RkZGRiBmb3IgY29uZmlndXJhdGlvbiovCi0Jc2lnbmVkIHNob3J0ICBjb25maWc7Ci0JdW5zaWduZWQgc2hvcnQgIGludGZfdHlwZTsKLQl1bnNpZ25lZCBzaG9ydCAgZHNwX3RvX2FybV9idWZfaWQ7Ci0JdW5zaWduZWQgc2hvcnQgIGFybV90b19kc3BfYnVmX2lkOwotCXVuc2lnbmVkIHNob3J0ICBhcm1fdG9fZHNwX2J1Zl9sZW47Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0KLS8qCi0gKiBDb21tYW5kcyBSZWxhdGVkIHRvIHVQQXVkUFBDbWQzUXVldWUKLSAqLwotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gY29uZmlndXJlIHBvc3QgcHJvY2Vzc2luZyBwYXJhbXMgKENvbW1tb24pCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVMJCTB4MDAwMAotI2RlZmluZSBBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfQ09NTU9OX0xFTgkJXAotCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2NvbW1vbikKLQotI2RlZmluZSBBVURQUF9DTURfT0JKMF9VUERBVEUJCTB4ODAwMAotI2RlZmluZSBBVURQUF9DTURfT0JKMF9ET05UX1VQREFURQkweDAwMDAKLQotCi0jZGVmaW5lIEFVRFBQX0NNRF9PQkoyX1VQREFURQkJMHg4MDAwCi0jZGVmaW5lIEFVRFBQX0NNRF9PQkoyX0RPTlRfVVBEQVRFCTB4MDAwMAotCi0jZGVmaW5lIEFVRFBQX0NNRF9PQkozX1VQREFURQkJMHg4MDAwCi0jZGVmaW5lIEFVRFBQX0NNRF9PQkozX0RPTlRfVVBEQVRFCTB4MDAwMAotCi0jZGVmaW5lIEFVRFBQX0NNRF9PQko0X1VQREFURQkJMHg4MDAwCi0jZGVmaW5lIEFVRFBQX0NNRF9PQko0X0RPTlRfVVBEQVRFCTB4MDAwMAotCi0jZGVmaW5lIEFVRFBQX0NNRF9IUENNX1VQREFURQkJMHg4MDAwCi0jZGVmaW5lIEFVRFBQX0NNRF9IUENNX0RPTlRfVVBEQVRFCTB4MDAwMAotCi0jZGVmaW5lIEFVRFBQX0NNRF9DT01NT05fQ0ZHX1VQREFURQkJMHg4MDAwCi0jZGVmaW5lIEFVRFBQX0NNRF9DT01NT05fQ0ZHX0RPTlRfVVBEQVRFCTB4MDAwMAotCi0jZGVmaW5lIEFVRFBQX0NNRF9QT1BQX1NUUkVBTSAgIDB4RkZGRgotI2RlZmluZSBBVURQUF9DTURfQ09QUF9TVFJFQU0gICAweDAwMDAKLQotc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19jb21tb257Ci0JdW5zaWduZWQgc2hvcnQgIGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydAlzdHJlYW07Ci0JdW5zaWduZWQgc2hvcnQJc3RyZWFtX2lkOwotCXVuc2lnbmVkIHNob3J0CW9ial9jZmc7Ci0JdW5zaWduZWQgc2hvcnQJY29tbWFuZF90eXBlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSBwb3N0IHByb2Nlc3NpbmcgcGFyYW1zIChWb2x1bWUpCi0gKi8KLSNkZWZpbmUgQVVEUFBfQ01EX1ZPTFVNRV9QQU4JCTAKLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TX1ZPTFVNRV9MRU4JCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUpCi0KLXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfdm9sdW1lIHsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2NvbW1vbiAJY29tbW9uOwotCXVuc2lnbmVkIHNob3J0CQkJCQl2b2x1bWU7Ci0JdW5zaWduZWQgc2hvcnQJCQkJCXBhbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBjb25maWd1cmUgcG9zdCBwcm9jZXNzaW5nIHBhcmFtcyAoUENNIEZpbHRlcikKLSAqLwotCi1zdHJ1Y3QgbnVtZXJhdG9yIHsKLQl1bnNpZ25lZCBzaG9ydAkJCW51bWVyYXRvcl9iMF9maWx0ZXJfbHN3OwotCXVuc2lnbmVkIHNob3J0CQkJbnVtZXJhdG9yX2IwX2ZpbHRlcl9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQludW1lcmF0b3JfYjFfZmlsdGVyX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAkJCW51bWVyYXRvcl9iMV9maWx0ZXJfbXN3OwotCXVuc2lnbmVkIHNob3J0CQkJbnVtZXJhdG9yX2IyX2ZpbHRlcl9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQludW1lcmF0b3JfYjJfZmlsdGVyX21zdzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBkZW5vbWluYXRvciB7Ci0JdW5zaWduZWQgc2hvcnQJCQlkZW5vbWluYXRvcl9hMF9maWx0ZXJfbHN3OwotCXVuc2lnbmVkIHNob3J0CQkJZGVub21pbmF0b3JfYTBfZmlsdGVyX21zdzsKLQl1bnNpZ25lZCBzaG9ydAkJCWRlbm9taW5hdG9yX2ExX2ZpbHRlcl9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQlkZW5vbWluYXRvcl9hMV9maWx0ZXJfbXN3OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IHNoaWZ0X2ZhY3RvciB7Ci0JdW5zaWduZWQgc2hvcnQJCQlzaGlmdF9mYWN0b3JfMDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBwYW4gewotCXVuc2lnbmVkIHNob3J0CQkJcGFuX2ZpbHRlcl8wOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGZpbHRlcl8xIHsKLQlzdHJ1Y3QgbnVtZXJhdG9yCQludW1lcmF0b3JfZmlsdGVyOwotCXN0cnVjdCBkZW5vbWluYXRvcgkJZGVub21pbmF0b3JfZmlsdGVyOwotCXN0cnVjdCBzaGlmdF9mYWN0b3IJCXNoaWZ0X2ZhY3Rvcl9maWx0ZXI7Ci0Jc3RydWN0IHBhbgkJCXBhbl9maWx0ZXI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgZmlsdGVyXzIgewotCXN0cnVjdCBudW1lcmF0b3IJCW51bWVyYXRvcl9maWx0ZXJbMl07Ci0Jc3RydWN0IGRlbm9taW5hdG9yCQlkZW5vbWluYXRvcl9maWx0ZXJbMl07Ci0Jc3RydWN0IHNoaWZ0X2ZhY3RvcgkJc2hpZnRfZmFjdG9yX2ZpbHRlclsyXTsKLQlzdHJ1Y3QgcGFuCQkJcGFuX2ZpbHRlclsyXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBmaWx0ZXJfMyB7Ci0Jc3RydWN0IG51bWVyYXRvcgkJbnVtZXJhdG9yX2ZpbHRlclszXTsKLQlzdHJ1Y3QgZGVub21pbmF0b3IJCWRlbm9taW5hdG9yX2ZpbHRlclszXTsKLQlzdHJ1Y3Qgc2hpZnRfZmFjdG9yCQlzaGlmdF9mYWN0b3JfZmlsdGVyWzNdOwotCXN0cnVjdCBwYW4JCQlwYW5fZmlsdGVyWzNdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGZpbHRlcl80IHsKLQlzdHJ1Y3QgbnVtZXJhdG9yCQludW1lcmF0b3JfZmlsdGVyWzRdOwotCXN0cnVjdCBkZW5vbWluYXRvcgkJZGVub21pbmF0b3JfZmlsdGVyWzRdOwotCXN0cnVjdCBzaGlmdF9mYWN0b3IJCXNoaWZ0X2ZhY3Rvcl9maWx0ZXJbNF07Ci0Jc3RydWN0IHBhbgkJCXBhbl9maWx0ZXJbNF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZGVmaW5lIEFVRFBQX0NNRF9JSVJfVFVOSU5HX0ZJTFRFUgkxCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNU19QQ01fTEVOCQlcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfcGNtKQotCi0KLXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfcGNtIHsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2NvbW1vbiAJY29tbW9uOwotCXNpZ25lZCBzaG9ydAkJCQlhY3RpdmVfZmxhZzsKLQl1bnNpZ25lZCBzaG9ydCAJCQkJbnVtX2JhbmRzOwotCXVuaW9uIHsKLQkJc3RydWN0IGZpbHRlcl8xCQkJZmlsdGVyXzFfcGFyYW1zOwotCQlzdHJ1Y3QgZmlsdGVyXzIJCQlmaWx0ZXJfMl9wYXJhbXM7Ci0JCXN0cnVjdCBmaWx0ZXJfMwkJCWZpbHRlcl8zX3BhcmFtczsKLQkJc3RydWN0IGZpbHRlcl80CQkJZmlsdGVyXzRfcGFyYW1zOwotCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgcGFyYW1zX2ZpbHRlcjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgQVVEUFBfQ01EX0NBTElCX0dBSU5fUlggICAgICAgICAxNQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX0NBTF9HQUlOX0xFTiBzaXplb2Yoc3RydWN0IGF1ZHBwX2NtZF9jZmdfY2FsX2dhaW4pCi0KLQotc3RydWN0IGF1ZHBwX2NtZF9jZmdfY2FsX2dhaW4gewotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfY29tbW9uIGNvbW1vbjsKLQl1bnNpZ25lZCBzaG9ydCBhdWRwcGNhbGdhaW47Ci0JdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBjb25maWd1cmUgcG9zdCBwcm9jZXNzaW5nIHBhcmFtZXRlcnMgKGVxdWFsaXplcikKLSAqLwotI2RlZmluZSBBVURQUF9DTURfRVFVQUxJWkVSCQkyCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNU19FUUFMSVpFUl9MRU4JCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19lcWFsaXplcikKLQotc3RydWN0IGVxX251bWVyYXRvciB7Ci0JdW5zaWduZWQgc2hvcnQJCQludW1lcmF0b3JfY29lZmZfMF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQludW1lcmF0b3JfY29lZmZfMF9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQludW1lcmF0b3JfY29lZmZfMV9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQludW1lcmF0b3JfY29lZmZfMV9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQludW1lcmF0b3JfY29lZmZfMl9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQludW1lcmF0b3JfY29lZmZfMl9tc3c7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgZXFfZGVub21pbmF0b3IgewotCXVuc2lnbmVkIHNob3J0CQkJZGVub21pbmF0b3JfY29lZmZfMF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQlkZW5vbWluYXRvcl9jb2VmZl8wX21zdzsKLQl1bnNpZ25lZCBzaG9ydAkJCWRlbm9taW5hdG9yX2NvZWZmXzFfbHN3OwotCXVuc2lnbmVkIHNob3J0CQkJZGVub21pbmF0b3JfY29lZmZfMV9tc3c7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgZXFfc2hpZnRmYWN0b3IgewotCXVuc2lnbmVkIHNob3J0CQkJc2hpZnRfZmFjdG9yOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGVxX2NvZWZmXzEgewotCXN0cnVjdCBlcV9udW1lcmF0b3IJbnVtZXJhdG9yOwotCXN0cnVjdCBlcV9kZW5vbWluYXRvcglkZW5vbWluYXRvcjsKLQlzdHJ1Y3QgZXFfc2hpZnRmYWN0b3IJc2hpZnRmYWN0b3I7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgZXFfY29lZmZfMiB7Ci0Jc3RydWN0IGVxX251bWVyYXRvcgludW1lcmF0b3JbMl07Ci0Jc3RydWN0IGVxX2Rlbm9taW5hdG9yCWRlbm9taW5hdG9yWzJdOwotCXN0cnVjdCBlcV9zaGlmdGZhY3RvcglzaGlmdGZhY3RvclsyXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBlcV9jb2VmZl8zIHsKLQlzdHJ1Y3QgZXFfbnVtZXJhdG9yCW51bWVyYXRvclszXTsKLQlzdHJ1Y3QgZXFfZGVub21pbmF0b3IJZGVub21pbmF0b3JbM107Ci0Jc3RydWN0IGVxX3NoaWZ0ZmFjdG9yCXNoaWZ0ZmFjdG9yWzNdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGVxX2NvZWZmXzQgewotCXN0cnVjdCBlcV9udW1lcmF0b3IJbnVtZXJhdG9yWzRdOwotCXN0cnVjdCBlcV9kZW5vbWluYXRvcglkZW5vbWluYXRvcls0XTsKLQlzdHJ1Y3QgZXFfc2hpZnRmYWN0b3IJc2hpZnRmYWN0b3JbNF07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgZXFfY29lZmZfNSB7Ci0Jc3RydWN0IGVxX251bWVyYXRvcgludW1lcmF0b3JbNV07Ci0Jc3RydWN0IGVxX2Rlbm9taW5hdG9yCWRlbm9taW5hdG9yWzVdOwotCXN0cnVjdCBlcV9zaGlmdGZhY3RvcglzaGlmdGZhY3Rvcls1XTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBlcV9jb2VmZl82IHsKLQlzdHJ1Y3QgZXFfbnVtZXJhdG9yCW51bWVyYXRvcls2XTsKLQlzdHJ1Y3QgZXFfZGVub21pbmF0b3IJZGVub21pbmF0b3JbNl07Ci0Jc3RydWN0IGVxX3NoaWZ0ZmFjdG9yCXNoaWZ0ZmFjdG9yWzZdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGVxX2NvZWZmXzcgewotCXN0cnVjdCBlcV9udW1lcmF0b3IJbnVtZXJhdG9yWzddOwotCXN0cnVjdCBlcV9kZW5vbWluYXRvcglkZW5vbWluYXRvcls3XTsKLQlzdHJ1Y3QgZXFfc2hpZnRmYWN0b3IJc2hpZnRmYWN0b3JbN107Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgZXFfY29lZmZfOCB7Ci0Jc3RydWN0IGVxX251bWVyYXRvcgludW1lcmF0b3JbOF07Ci0Jc3RydWN0IGVxX2Rlbm9taW5hdG9yCWRlbm9taW5hdG9yWzhdOwotCXN0cnVjdCBlcV9zaGlmdGZhY3RvcglzaGlmdGZhY3Rvcls4XTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBlcV9jb2VmZl85IHsKLQlzdHJ1Y3QgZXFfbnVtZXJhdG9yCW51bWVyYXRvcls5XTsKLQlzdHJ1Y3QgZXFfZGVub21pbmF0b3IJZGVub21pbmF0b3JbOV07Ci0Jc3RydWN0IGVxX3NoaWZ0ZmFjdG9yCXNoaWZ0ZmFjdG9yWzldOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGVxX2NvZWZmXzEwIHsKLQlzdHJ1Y3QgZXFfbnVtZXJhdG9yCW51bWVyYXRvclsxMF07Ci0Jc3RydWN0IGVxX2Rlbm9taW5hdG9yCWRlbm9taW5hdG9yWzEwXTsKLQlzdHJ1Y3QgZXFfc2hpZnRmYWN0b3IJc2hpZnRmYWN0b3JbMTBdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGVxX2NvZWZmXzExIHsKLQlzdHJ1Y3QgZXFfbnVtZXJhdG9yCW51bWVyYXRvclsxMV07Ci0Jc3RydWN0IGVxX2Rlbm9taW5hdG9yCWRlbm9taW5hdG9yWzExXTsKLQlzdHJ1Y3QgZXFfc2hpZnRmYWN0b3IJc2hpZnRmYWN0b3JbMTFdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGVxX2NvZWZmXzEyIHsKLQlzdHJ1Y3QgZXFfbnVtZXJhdG9yCW51bWVyYXRvclsxMl07Ci0Jc3RydWN0IGVxX2Rlbm9taW5hdG9yCWRlbm9taW5hdG9yWzEyXTsKLQlzdHJ1Y3QgZXFfc2hpZnRmYWN0b3IJc2hpZnRmYWN0b3JbMTJdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotCi1zdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyIHsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2NvbW1vbiAJY29tbW9uOwotCXNpZ25lZCBzaG9ydAkJCQllcV9mbGFnOwotCXVuc2lnbmVkIHNob3J0CQkJCW51bV9iYW5kczsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBlcV9jb2VmZl8xCWVxX2NvZWZmc18xOwotCQlzdHJ1Y3QgZXFfY29lZmZfMgllcV9jb2VmZnNfMjsKLQkJc3RydWN0IGVxX2NvZWZmXzMJZXFfY29lZmZzXzM7Ci0JCXN0cnVjdCBlcV9jb2VmZl80CWVxX2NvZWZmc180OwotCQlzdHJ1Y3QgZXFfY29lZmZfNQllcV9jb2VmZnNfNTsKLQkJc3RydWN0IGVxX2NvZWZmXzYJZXFfY29lZmZzXzY7Ci0JCXN0cnVjdCBlcV9jb2VmZl83CWVxX2NvZWZmc183OwotCQlzdHJ1Y3QgZXFfY29lZmZfOAllcV9jb2VmZnNfODsKLQkJc3RydWN0IGVxX2NvZWZmXzkJZXFfY29lZmZzXzk7Ci0JCXN0cnVjdCBlcV9jb2VmZl8xMAllcV9jb2VmZnNfMTA7Ci0JCXN0cnVjdCBlcV9jb2VmZl8xMQllcV9jb2VmZnNfMTE7Ci0JCXN0cnVjdCBlcV9jb2VmZl8xMgllcV9jb2VmZnNfMTI7Ci0JfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBlcV9jb2VmZjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBjb25maWd1cmUgcG9zdCBwcm9jZXNzaW5nIHBhcmFtZXRlcnMgKEFEUkMpCi0gKi8KLSNkZWZpbmUgQVVEUFBfQ01EX0FEUkMJCQkzCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNU19BRFJDX0xFTgkJXAotCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2FkcmMpCi0KLQotI2RlZmluZSBBVURQUF9DTURfQURSQ19GTEFHX0RJUwkJMHgwMDAwCi0jZGVmaW5lIEFVRFBQX0NNRF9BRFJDX0ZMQUdfRU5BCQktMQotI2RlZmluZSBBVURQUF9DTURfUEJFX0ZMQUdfRElTCQkweDAwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX1BCRV9GTEFHX0VOQQkJLTEKLQotc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19hZHJjIHsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2NvbW1vbiAJY29tbW9uOwotCXNpZ25lZCBzaG9ydAkJYWRyY19mbGFnOwotCXVuc2lnbmVkIHNob3J0CWNvbXByZXNzaW9uX3RoOwotCXVuc2lnbmVkIHNob3J0CWNvbXByZXNzaW9uX3Nsb3BlOwotCXVuc2lnbmVkIHNob3J0CXJtc190aW1lOwotCXVuc2lnbmVkIHNob3J0CWF0dGFja19jb25zdF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJYXR0YWNrX2NvbnN0X21zdzsKLQl1bnNpZ25lZCBzaG9ydAlyZWxlYXNlX2NvbnN0X2xzdzsKLQl1bnNpZ25lZCBzaG9ydAlyZWxlYXNlX2NvbnN0X21zdzsKLQl1bnNpZ25lZCBzaG9ydAlhZHJjX2RlbGF5OwotfTsKLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSBwb3N0IHByb2Nlc3NpbmcgcGFyYW1ldGVycyAoTUIgLSBBRFJDKQotICovCi0jZGVmaW5lIEFVRFBQX0NNRF9NQkFEUkMJCTEwCi0jZGVmaW5lCUFVRFBQX01BWF9NQkFEUkNfQkFORFMJCTUKLQotc3RydWN0IGFkcmNfY29uZmlnIHsKLQl1aW50MTZfdCBzdWJiYW5kX2VuYWJsZTsKLQl1aW50MTZfdCBhZHJjX3N1Yl9tdXRlOwotCXVpbnQxNl90IHJtc190aW1lOwotCXVpbnQxNl90IGNvbXByZXNzaW9uX3RoOwotCXVpbnQxNl90IGNvbXByZXNzaW9uX3Nsb3BlOwotCXVpbnQxNl90IGF0dGFja19jb25zdF9sc3c7Ci0JdWludDE2X3QgYXR0YWNrX2NvbnN0X21zdzsKLQl1aW50MTZfdCByZWxlYXNlX2NvbnN0X2xzdzsKLQl1aW50MTZfdCByZWxlYXNlX2NvbnN0X21zdzsKLQl1aW50MTZfdCBtYWtldXBfZ2FpbjsKLX07Ci0KLXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfbWJhZHJjIHsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2NvbW1vbiAJY29tbW9uOwotCXVpbnQxNl90IGVuYWJsZTsKLQl1aW50MTZfdCBudW1fYmFuZHM7Ci0JdWludDE2X3QgZG93bl9zYW1wX2xldmVsOwotCXVpbnQxNl90IGFkcmNfZGVsYXk7Ci0JdWludDE2X3QgZXh0X2J1Zl9zaXplOwotCXVpbnQxNl90IGV4dF9wYXJ0aXRpb247Ci0JdWludDE2X3QgZXh0X2J1Zl9tc3c7Ci0JdWludDE2X3QgZXh0X2J1Zl9sc3c7Ci0Jc3RydWN0IGFkcmNfY29uZmlnIGFkcmNfYmFuZFtBVURQUF9NQVhfTUJBRFJDX0JBTkRTXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBjb25maWd1cmUgcG9zdCBwcm9jZXNzaW5nIHBhcmFtZXRlcnMoU3BlY3RydW0gQW5hbGl6ZXIpCi0gKi8KLSNkZWZpbmUgQVVEUFBfQ01EX1NQRUNUUk9HUkFNCQk0Ci0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNU19TUEVDVFJBTV9MRU4JCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19zcGVjdHJhbSkKLQotCi1zdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3NwZWN0cmFtIHsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2NvbW1vbiAJY29tbW9uOwotCXVuc2lnbmVkIHNob3J0CQkJCXNhbXBsZV9pbnRlcnZhbDsKLQl1bnNpZ25lZCBzaG9ydAkJCQludW1fY29lZmY7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gY29uZmlndXJlIHBvc3QgcHJvY2Vzc2luZyBwYXJhbWV0ZXJzIChRQ29uY2VydCkKLSAqLwotI2RlZmluZSBBVURQUF9DTURfUUNPTkNFUlQJCTUKLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TX1FDT05DRVJUX0xFTgkJXAotCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3Fjb25jZXJ0KQotCi0KLSNkZWZpbmUgQVVEUFBfQ01EX1FDT05fRU5BX0ZMQUdfRU5BCQktMQotI2RlZmluZSBBVURQUF9DTURfUUNPTl9FTkFfRkxBR19ESVMJCTB4MDAwMAotCi0jZGVmaW5lIEFVRFBQX0NNRF9RQ09OX09QX01PREVfSEVBRFBIT05FCS0xCi0jZGVmaW5lIEFVRFBQX0NNRF9RQ09OX09QX01PREVfU1BFQUtFUl9GUk9OVAkweDAwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX1FDT05fT1BfTU9ERV9TUEVBS0VSX1NJREUJMHgwMDAxCi0jZGVmaW5lIEFVRFBQX0NNRF9RQ09OX09QX01PREVfU1BFQUtFUl9ERVNLVE9QCTB4MDAwMgotCi0jZGVmaW5lIEFVRFBQX0NNRF9RQ09OX0dBSU5fVU5JVAkJCTB4N0ZGRgotI2RlZmluZSBBVURQUF9DTURfUUNPTl9HQUlOX1NJWF9EQgkJCTB4NDAyNwotCi0KLSNkZWZpbmUgQVVEUFBfQ01EX1FDT05fRVhQQU5TSU9OX01BWAkJMHg3RkZGCi0KLQotc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19xY29uY2VydCB7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19jb21tb24gCWNvbW1vbjsKLQlzaWduZWQgc2hvcnQJCQkJZW5hYmxlX2ZsYWc7Ci0Jc2lnbmVkIHNob3J0CQkJCW9wX21vZGU7Ci0Jc2lnbmVkIHNob3J0CQkJCWdhaW47Ci0Jc2lnbmVkIHNob3J0CQkJCWV4cGFuc2lvbjsKLQlzaWduZWQgc2hvcnQJCQkJZGVsYXk7Ci0JdW5zaWduZWQgc2hvcnQJCQkJc3RhZ2VzX3Blcl9tb2RlOwotCXVuc2lnbmVkIHNob3J0CQkJCXJldmVyYl9lbmFibGU7Ci0JdW5zaWduZWQgc2hvcnQJCQkJZGVjYXlfbXN3OwotCXVuc2lnbmVkIHNob3J0CQkJCWRlY2F5X2xzdzsKLQl1bnNpZ25lZCBzaG9ydAkJCQlkZWNheV90aW1lX3JhdGlvX21zdzsKLQl1bnNpZ25lZCBzaG9ydAkJCQlkZWNheV90aW1lX3JhdGlvX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAkJCQlyZWZsZWN0aW9uX2RlbGF5X3RpbWU7Ci0JdW5zaWduZWQgc2hvcnQJCQkJbGF0ZV9yZXZlcmJfZ2FpbjsKLQl1bnNpZ25lZCBzaG9ydAkJCQlsYXRlX3JldmVyYl9kZWxheTsKLQl1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlfYnVmZl9zaXplX21zdzsKLQl1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlfYnVmZl9zaXplX2xzdzsKLQl1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX251bTsKLQl1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlfYnVmZl9zdGFydF9tc3c7Ci0JdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X2J1ZmZfc3RhcnRfbHN3OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSBwb3N0IHByb2Nlc3NpbmcgcGFyYW1ldGVycyAoU2lkZSBDaGFpbikKLSAqLwotI2RlZmluZSBBVURQUF9DTURfU0lERUNIQUlOX1RVTklOR19GSUxURVIJNgotI2RlZmluZSBBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfU0lERUNIQUlOX0xFTgkJXAotCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3NpZGVjaGFpbikKLQotCi0jZGVmaW5lIEFVRFBQX0NNRF9TSURFQ0hBSU5fQUNUSVZFX0ZMQUdfRElTCTB4MDAwMAotI2RlZmluZSBBVURQUF9DTURfU0lERUNIQUlOX0FDVElWRV9GTEFHX0VOQQktMQotCi1zdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3NpZGVjaGFpbiB7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19jb21tb24gCWNvbW1vbjsKLQlzaWduZWQgc2hvcnQJCQkJYWN0aXZlX2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQJCQkJbnVtX2JhbmRzOwotCXVuaW9uIHsKLQkJc3RydWN0IGZpbHRlcl8xCQkJZmlsdGVyXzFfcGFyYW1zOwotCQlzdHJ1Y3QgZmlsdGVyXzIJCQlmaWx0ZXJfMl9wYXJhbXM7Ci0JCXN0cnVjdCBmaWx0ZXJfMwkJCWZpbHRlcl8zX3BhcmFtczsKLQkJc3RydWN0IGZpbHRlcl80CQkJZmlsdGVyXzRfcGFyYW1zOwotCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgcGFyYW1zX2ZpbHRlcjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSBwb3N0IHByb2Nlc3NpbmcgcGFyYW1ldGVycyAoUUFGWCkKLSAqLwotI2RlZmluZSBBVURQUF9DTURfUUFGWAkJCTgKLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TX1FBRlhfTEVOCQlcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfcWFmeCkKLQotI2RlZmluZSBBVURQUF9DTURfUUFGWF9FTkFfRElTQQkJMHgwMDAwCi0jZGVmaW5lIEFVRFBQX0NNRF9RQUZYX0VOQV9FTkFfQ0ZHCS0xCi0jZGVmaW5lIEFVRFBQX0NNRF9RQUZYX0VOQV9ESVNfQ0ZHCTB4MDAwMQotCi0jZGVmaW5lIEFVRFBQX0NNRF9RQUZYX0NNRF9UWVBFX0VOVgkweDAxMDAKLSNkZWZpbmUgQVVEUFBfQ01EX1FBRlhfQ01EX1RZUEVfT0JKCTB4MDAxMAotI2RlZmluZSBBVURQUF9DTURfUUFGWF9DTURfVFlQRV9RVUVSWQkweDEwMDAKLQotI2RlZmluZSBBVURQUF9DTURfUUFGWF9DTURTX0VOVl9PUF9NT0RFCTB4MDEwMAotI2RlZmluZSBBVURQUF9DTURfUUFGWF9DTURTX0VOVl9MSVNfUE9TCTB4MDEwMQotI2RlZmluZSBBVURQUF9DTURfUUFGWF9DTURTX0VOVl9MSVNfT1JJCTB4MDEwMgotI2RlZmluZSBBVURQUF9DTURfUUFGWF9DTURTX0VOVl9MSVNfVkVMCTBYMDEwMwotI2RlZmluZSBBVURQUF9DTURfUUFGWF9DTURTX0VOVl9FTlZfUkVTCTB4MDEwNwotCi0jZGVmaW5lIEFVRFBQX0NNRF9RQUZYX0NNRFNfT0JKX1NBTVBfRlJFUQkweDAwMTAKLSNkZWZpbmUgQVVEUFBfQ01EX1FBRlhfQ01EU19PQkpfVk9MCQkweDAwMTEKLSNkZWZpbmUgQVVEUFBfQ01EX1FBRlhfQ01EU19PQkpfRElTVAkJMHgwMDEyCi0jZGVmaW5lIEFVRFBQX0NNRF9RQUZYX0NNRFNfT0JKX1BPUwkJMHgwMDEzCi0jZGVmaW5lIEFVRFBQX0NNRF9RQUZYX0NNRFNfT0JKX1ZFTAkJMHgwMDE0Ci0KLQotc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19xYWZ4IHsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2NvbW1vbiAJY29tbW9uOwotCXNpZ25lZCBzaG9ydAkJCQllbmFibGU7Ci0JdW5zaWduZWQgc2hvcnQJCQkJY29tbWFuZF90eXBlOwotCXVuc2lnbmVkIHNob3J0CQkJCW51bV9jb21tYW5kczsKLQl1bnNpZ25lZCBzaG9ydAkJCQljb21tYW5kczsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBlbmFibGUgLCBkaXNhYmxlIG9yIGNvbmZpZ3VyZSB0aGUgcmV2ZXJiZXJhdGlvbiBlZmZlY3QKLSAqIChSRVZFUkIpIChDb21tb24pCi0gKi8KLQotI2RlZmluZSBBVURQUF9DTURfUkVWRVJCX0NPTkZJRwkJMHgwMDAxCi0jZGVmaW5lCUFVRFBQX0NNRF9SRVZFUkJfQ09ORklHX0NPTU1PTl9MRU4JXAotCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX3JldmVyYl9jb25maWdfY29tbW9uKQotCi0jZGVmaW5lIEFVRFBQX0NNRF9FTkFfRU5BCTB4RkZGRgotI2RlZmluZSBBVURQUF9DTURfRU5BX0RJUwkweDAwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX0VOQV9DRkcJMHgwMDAxCi0KLSNkZWZpbmUgQVVEUFBfQ01EX0NNRF9UWVBFX0VOVgkJMHgwMTA0Ci0jZGVmaW5lIEFVRFBQX0NNRF9DTURfVFlQRV9PQkoJCTB4MDAxNQotI2RlZmluZSBBVURQUF9DTURfQ01EX1RZUEVfUVVFUlkJMHgxMDAwCi0KLQotc3RydWN0IGF1ZHBwX2NtZF9yZXZlcmJfY29uZmlnX2NvbW1vbiB7Ci0JdW5zaWduZWQgc2hvcnQJCQljbWRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQJCQllbmFibGU7Ci0JdW5zaWduZWQgc2hvcnQJCQljbWRfdHlwZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBlbmFibGUgLCBkaXNhYmxlIG9yIGNvbmZpZ3VyZSB0aGUgcmV2ZXJiZXJhdGlvbiBlZmZlY3QKLSAqIChFTlYtMHgwMTA0KQotICovCi0KLSNkZWZpbmUJQVVEUFBfQ01EX1JFVkVSQl9DT05GSUdfRU5WXzEwNF9MRU4JXAotCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX3JldmVyYl9jb25maWdfZW52XzEwNCkKLQotc3RydWN0IGF1ZHBwX2NtZF9yZXZlcmJfY29uZmlnX2Vudl8xMDQgewotCXN0cnVjdCBhdWRwcF9jbWRfcmV2ZXJiX2NvbmZpZ19jb21tb24JY29tbW9uOwotCXVuc2lnbmVkIHNob3J0CQkJZW52X2dhaW47Ci0JdW5zaWduZWQgc2hvcnQJCQlkZWNheV9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQlkZWNheV9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJCQlkZWNheV90aW1lcmF0aW9fbXN3OwotCXVuc2lnbmVkIHNob3J0CQkJZGVjYXlfdGltZXJhdGlvX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAkJCWRlbGF5X3RpbWU7Ci0JdW5zaWduZWQgc2hvcnQJCQlyZXZlcmJfZ2FpbjsKLQl1bnNpZ25lZCBzaG9ydAkJCXJldmVyYl9kZWxheTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBlbmFibGUgLCBkaXNhYmxlIG9yIGNvbmZpZ3VyZSB0aGUgcmV2ZXJiZXJhdGlvbiBlZmZlY3QKLSAqIChFTlYtMHgwMDE1KQotICovCi0KLSNkZWZpbmUJQVVEUFBfQ01EX1JFVkVSQl9DT05GSUdfRU5WXzE1X0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcF9jbWRfcmV2ZXJiX2NvbmZpZ19lbnZfMTUpCi0KLXN0cnVjdCBhdWRwcF9jbWRfcmV2ZXJiX2NvbmZpZ19lbnZfMTUgewotCXN0cnVjdCBhdWRwcF9jbWRfcmV2ZXJiX2NvbmZpZ19jb21tb24JY29tbW9uOwotCXVuc2lnbmVkIHNob3J0CQkJb2JqZWN0X251bTsKLQl1bnNpZ25lZCBzaG9ydAkJCWFic29sdXRlX2dhaW47Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZGVmaW5lIEFVRFBQX0NNRF9QQkUgICAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgQVVEUFBfQ01EX0NGR19QQkVfTEVOIHNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19wYmUpCi0KLXN0cnVjdCBhdWRwcF9jbWRfY2ZnX3BiZSB7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19jb21tb24gICAgICAgY29tbW9uOwotCXVuc2lnbmVkIHNob3J0IHBiZV9lbmFibGU7Ci0Jc2lnbmVkIHNob3J0ICAgcmVhbGJhc3NtaXg7Ci0Jc2lnbmVkIHNob3J0ICAgYmFzc2NvbG9yY29udHJvbDsKLQl1bnNpZ25lZCBzaG9ydCBtYWluY2hhaW5kZWxheTsKLQl1bnNpZ25lZCBzaG9ydCB4b3ZlcmZsdG9yZGVyOwotCXVuc2lnbmVkIHNob3J0IGJhbmRwYXNzZmx0b3JkZXI7Ci0Jc2lnbmVkIHNob3J0ICAgYWRyY2RlbGF5OwotCXVuc2lnbmVkIHNob3J0IGRvd25zYW1wbGVsZXZlbDsKLQl1bnNpZ25lZCBzaG9ydCBjb21wcm1zdGF2OwotCXNpZ25lZCBzaG9ydCAgIGV4cHRocmVzaG9sZDsKLQl1bnNpZ25lZCBzaG9ydCBleHBzbG9wZTsKLQl1bnNpZ25lZCBzaG9ydCBjb21wdGhyZXNob2xkOwotCXVuc2lnbmVkIHNob3J0IGNvbXBzbG9wZTsKLQl1bnNpZ25lZCBzaG9ydCBjcG1wYXR0YWNrX2xzdzsKLQl1bnNpZ25lZCBzaG9ydCBjb21wYXR0YWNrX21zdzsKLQl1bnNpZ25lZCBzaG9ydCBjb21wcmVsZWFzZV9sc3c7Ci0JdW5zaWduZWQgc2hvcnQgY29tcHJlbGVhc2VfbXN3OwotCXVuc2lnbmVkIHNob3J0IGNvbXBtYWtldXBnYWluOwotCXNpZ25lZCBzaG9ydCAgIGJhc2VsaW10aHJlc2hvbGQ7Ci0Jc2lnbmVkIHNob3J0ICAgaGlnaGxpbXRocmVzaG9sZDsKLQlzaWduZWQgc2hvcnQgICBiYXNzbGltbWFrZXVwZ2FpbjsKLQlzaWduZWQgc2hvcnQgICBoaWdobGltbWFrZXVwZ2FpbjsKLQlzaWduZWQgc2hvcnQgICBsaW1iYXNzZ3JjOwotCXNpZ25lZCBzaG9ydCAgIGxpbWhpZ2hncmM7Ci0Jc2lnbmVkIHNob3J0ICAgbGltZGVsYXk7Ci0JdW5zaWduZWQgc2hvcnQgZmlsdGVyX2NvZWZmc1s5MF07Ci0JdW5zaWduZWQgc2hvcnQgZXh0YnVmZnNpemVfbHN3OwotCXVuc2lnbmVkIHNob3J0IGV4dGJ1ZmZzaXplX21zdzsKLQl1bnNpZ25lZCBzaG9ydCBleHRwYXJ0aXRpb247Ci0JdW5zaWduZWQgc2hvcnQgZXh0YnVmZnN0YXJ0X2xzdzsKLQl1bnNpZ25lZCBzaG9ydCBleHRidWZmc3RhcnRfbXN3OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2RlZmluZSBBVURQUF9DTURfUFBfRkVBVF9RVUVSWV9QQVJBTVMgIDB4MDAwMgotCi1zdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3ZvbHBhbiB7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19jb21tb24gICAgICAgY29tbW9uOwotCXUxNiB2b2x1bWUgOwotCXUxNiBwYW47Ci19OwotCi1zdHJ1Y3QgcnRjX2F1ZHBwX3JlYWRfZGF0YSB7Ci0JdW5zaWduZWQgc2hvcnQgIGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCAgb2JqX2lkOwotCXVuc2lnbmVkIHNob3J0ICByb3V0ZV9pZDsKLQl1bnNpZ25lZCBzaG9ydCAgZmVhdHVyZV9pZDsKLQl1bnNpZ25lZCBzaG9ydCAgZXh0YnVmc2l6ZW1zdzsKLQl1bnNpZ25lZCBzaG9ydCAgZXh0YnVmc2l6ZWxzdzsKLQl1bnNpZ25lZCBzaG9ydAlleHRwYXJ0OwotCXVuc2lnbmVkIHNob3J0CWV4dGJ1ZnN0YXJ0bXN3OwotCXVuc2lnbmVkIHNob3J0CWV4dGJ1ZnN0YXJ0bHN3OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSA7Ci0KLSNkZWZpbmUgQVVEUFBfQ01EX1NBTVBMSU5HX0ZSRVFVRU5DWQk3Ci0jZGVmaW5lIEFVRFBQX0NNRF9RUlVNQkxFCQk5Ci0KLSNlbmRpZiAvKiBfX01BQ0hfUURTUDVfVjJfUURTUDVBVURQUENNRElfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvcWRzcDVhdWRwcG1zZy5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvcWRzcDVhdWRwcG1zZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDAyMzJkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHBtc2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0jaWZuZGVmIFFEU1A1QVVEUFBNU0dfSAotI2RlZmluZSBRRFNQNUFVRFBQTVNHX0gKLQotLyo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSoKLQotICAgICAgIFEgRCBTIFAgNSAgQSBVIEQgSSBPICAgUCBPIFMgVCAgIFAgUiBPIEMgRSBTIFMgSSBOIEcgICBNIFMgRwotCi1HRU5FUkFMIERFU0NSSVBUSU9OCi0gIE1lc3NhZ2VzIHNlbnQgYnkgQVVEUFBUQVNLIHRvIEFSTQotCi1SRUZFUkVOQ0VTCi0gIE5vbmUKLQotRVhURVJOQUxJWkVEIEZVTkNUSU9OUwotICBOb25lCi0KLUNvcHlyaWdodCAoYykgMTk5Mi0yMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLW1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSo9PT09Kj09PT0qPT09PSovCi0KLS8qCi0gKiBBVURQUFRBU0sgdXNlcyBhdWRQUHVQUmxpc3QgdG8gc2VuZCBtZXNzYWdlcyB0byB0aGUgQVJNCi0gKiBMb2NhdGlvbiA6IE1FTUEKLSAqIEJ1ZmZlciBTaXplIDogNDUKLSAqIE5vIG9mIEJ1ZmZlcnMgaW4gYSBxdWV1ZSA6IDUgZm9yIGdhbWluZyBhdWRpbyBhbmQgMSBmb3Igb3RoZXIgaW1hZ2VzCi0gKi8KLQotLyoKLSAqIE1TRyB0byBJbmZvcm1zIHRoZSBBUk0gb3MgU3VjY2Vzcy9GYWlsdXJlIG9mIGJyaW5naW5nIHVwIHRoZSBkZWNvZGVyCi0gKi8KLQotI2RlZmluZSBBVURQUF9NU0dfRkVBVF9RVUVSWV9ETV9ET05FIDB4MDAwYgotCi0jZGVmaW5lIEFVRFBQX01TR19TVEFUVVNfTVNHCQkweDAwMDEKLSNkZWZpbmUgQVVEUFBfTVNHX1NUQVRVU19NU0dfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHBwX21zZ19zdGF0dXNfbXNnKQotCi0jZGVmaW5lIEFVRFBQX01TR19TVEFUVVNfU0xFRVAJCTB4MDAwMAotI2RlZmluZSBBVURQUF9NU0dfU1RBVFVTX0lOSVQJCTB4MDAwMQotI2RlZmluZSBBVURQUF9NU0dfU1RBVFVTX0NGRwkJMHgwMDAyCi0jZGVmaW5lIEFVRFBQX01TR19TVEFUVVNfUExBWQkJMHgwMDAzCi0KLSNkZWZpbmUgQVVEUFBfTVNHX1JFQVNPTl9OT05FCTB4MDAwMAotI2RlZmluZSBBVURQUF9NU0dfUkVBU09OX01FTQkweDAwMDEKLSNkZWZpbmUgQVVEUFBfTVNHX1JFQVNPTl9OT0RFQ09ERVIgMHgwMDAyCi0KLXN0cnVjdCBhdWRwcF9tc2dfc3RhdHVzX21zZyB7Ci0JdW5zaWduZWQgc2hvcnQgZGVjX2lkOwotCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKLQl1bnNpZ25lZCBzaG9ydCByZWFzb247Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogTVNHIHRvIGNvbW11bmljYXRlIHRoZSBzcGVjdHJ1bSBhbmFseXplciBvdXRwdXQgYmFuZHMgdG8gdGhlIEFSTQotICovCi0jZGVmaW5lIEFVRFBQX01TR19TUEFfQkFORFMJCTB4MDAwMgotI2RlZmluZSBBVURQUF9NU0dfU1BBX0JBTkRTX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcF9tc2dfc3BhX2JhbmRzKQotCi1zdHJ1Y3QgYXVkcHBfbXNnX3NwYV9iYW5kcyB7Ci0JdW5zaWduZWQgc2hvcnQJCQljdXJyZW50X29iamVjdDsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzE7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8yOwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMzsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzQ7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF81OwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfNjsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzc7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF84OwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfOTsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzEwOwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMTE7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8xMjsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzEzOwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMTQ7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8xNTsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzE2OwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMTc7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8xODsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzE5OwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMjA7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8yMTsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzIyOwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMjM7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8yNDsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzI1OwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMjY7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8yNzsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzI4OwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMjk7Ci0JdW5zaWduZWQgc2hvcnQJCQlzcGFfYmFuZF8zMDsKLQl1bnNpZ25lZCBzaG9ydAkJCXNwYV9iYW5kXzMxOwotCXVuc2lnbmVkIHNob3J0CQkJc3BhX2JhbmRfMzI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogTVNHIHRvIGNvbW11bmljYXRlIHRoZSBQQ00gSS9PIGJ1ZmZlciBzdGF0dXMgdG8gQVJNCi0gKi8KLSNkZWZpbmUgIEFVRFBQX01TR19IT1NUX1BDTV9JTlRGX01TRwkJMHgwMDAzCi0jZGVmaW5lICBBVURQUF9NU0dfSE9TVF9QQ01fSU5URl9NU0dfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHBwX21zZ19ob3N0X3BjbV9pbnRmX21zZykKLQotI2RlZmluZSBBVURQUF9NU0dfSE9TVFBDTV9JRF9UWF9BUk0JMHgwMDAwCi0jZGVmaW5lIEFVRFBQX01TR19IT1NUUENNX0lEX0FSTV9UWAkweDAwMDEKLSNkZWZpbmUgQVVEUFBfTVNHX0hPU1RQQ01fSURfUlhfQVJNCTB4MDAwMgotI2RlZmluZSBBVURQUF9NU0dfSE9TVFBDTV9JRF9BUk1fUlgJMHgwMDAzCi0KLSNkZWZpbmUgQVVEUFBfTVNHX1NBTVBfRlJFUV9JTkRYXzk2MDAwCTB4MDAwMAotI2RlZmluZSBBVURQUF9NU0dfU0FNUF9GUkVRX0lORFhfODgyMDAJMHgwMDAxCi0jZGVmaW5lIEFVRFBQX01TR19TQU1QX0ZSRVFfSU5EWF82NDAwMAkweDAwMDIKLSNkZWZpbmUgQVVEUFBfTVNHX1NBTVBfRlJFUV9JTkRYXzQ4MDAwCTB4MDAwMwotI2RlZmluZSBBVURQUF9NU0dfU0FNUF9GUkVRX0lORFhfNDQxMDAJMHgwMDA0Ci0jZGVmaW5lIEFVRFBQX01TR19TQU1QX0ZSRVFfSU5EWF8zMjAwMAkweDAwMDUKLSNkZWZpbmUgQVVEUFBfTVNHX1NBTVBfRlJFUV9JTkRYXzI0MDAwCTB4MDAwNgotI2RlZmluZSBBVURQUF9NU0dfU0FNUF9GUkVRX0lORFhfMjIwNTAJMHgwMDA3Ci0jZGVmaW5lIEFVRFBQX01TR19TQU1QX0ZSRVFfSU5EWF8xNjAwMAkweDAwMDgKLSNkZWZpbmUgQVVEUFBfTVNHX1NBTVBfRlJFUV9JTkRYXzEyMDAwCTB4MDAwOQotI2RlZmluZSBBVURQUF9NU0dfU0FNUF9GUkVRX0lORFhfMTEwMjUJMHgwMDBBCi0jZGVmaW5lIEFVRFBQX01TR19TQU1QX0ZSRVFfSU5EWF84MDAwCTB4MDAwQgotCi0jZGVmaW5lIEFVRFBQX01TR19DSEFOTkVMX01PREVfTU9OTwkJMHgwMDAxCi0jZGVmaW5lIEFVRFBQX01TR19DSEFOTkVMX01PREVfU1RFUkVPCTB4MDAwMgotCi1zdHJ1Y3QgYXVkcHBfbXNnX2hvc3RfcGNtX2ludGZfbXNnIHsKLQl1bnNpZ25lZCBzaG9ydCBvYmpfbnVtOwotCXVuc2lnbmVkIHNob3J0IG51bWJlcnNfb2Zfc2FtcGxlczsKLQl1bnNpZ25lZCBzaG9ydCBob3N0X3BjbV9pZDsKLQl1bnNpZ25lZCBzaG9ydCBidWZfaW5keDsKLQl1bnNpZ25lZCBzaG9ydCBzYW1wX2ZyZXFfaW5keDsKLQl1bnNpZ25lZCBzaG9ydCBjaGFubmVsX21vZGU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0KLS8qCi0gKiBNU0cgdG8gY29tbXVuaWNhdGUgM0QgcG9zaXRpb24gb2YgdGhlIHNvdXJjZSBhbmQgbGlzdGVuZXIgLCBzb3VyY2Ugdm9sdW1lCi0gKiBzb3VyY2Ugcm9sbG9mZiwgc291cmNlIG9yaWVudGF0aW9uCi0gKi8KLQotI2RlZmluZSBBVURQUF9NU0dfUUFGWF9QT1MJCTB4MDAwNAotI2RlZmluZSBBVURQUF9NU0dfUUFGWF9QT1NfTEVOCQlcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcF9tc2dfcWFmeF9wb3MpCi0KLXN0cnVjdCBhdWRwcF9tc2dfcWFmeF9wb3MgewotCXVuc2lnbmVkIHNob3J0CWN1cnJlbnRfb2JqZWN0OwotCXVuc2lnbmVkIHNob3J0CXhfcG9zX2xpc19tc3c7Ci0JdW5zaWduZWQgc2hvcnQJeF9wb3NfbGlzX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAl5X3Bvc19saXNfbXN3OwotCXVuc2lnbmVkIHNob3J0CXlfcG9zX2xpc19sc3c7Ci0JdW5zaWduZWQgc2hvcnQJel9wb3NfbGlzX21zdzsKLQl1bnNpZ25lZCBzaG9ydAl6X3Bvc19saXNfbHN3OwotCXVuc2lnbmVkIHNob3J0CXhfZndkX21zdzsKLQl1bnNpZ25lZCBzaG9ydAl4X2Z3ZF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJeV9md2RfbXN3OwotCXVuc2lnbmVkIHNob3J0CXlfZndkX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAl6X2Z3ZF9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJel9md2RfbHN3OwotCXVuc2lnbmVkIHNob3J0IAl4X3VwX21zdzsKLQl1bnNpZ25lZCBzaG9ydAl4X3VwX2xzdzsKLQl1bnNpZ25lZCBzaG9ydCAJeV91cF9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJeV91cF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQgCXpfdXBfbXN3OwotCXVuc2lnbmVkIHNob3J0CXpfdXBfbHN3OwotCXVuc2lnbmVkIHNob3J0IAl4X3ZlbF9saXNfbXN3OwotCXVuc2lnbmVkIHNob3J0IAl4X3ZlbF9saXNfbHN3OwotCXVuc2lnbmVkIHNob3J0IAl5X3ZlbF9saXNfbXN3OwotCXVuc2lnbmVkIHNob3J0IAl5X3ZlbF9saXNfbHN3OwotCXVuc2lnbmVkIHNob3J0IAl6X3ZlbF9saXNfbXN3OwotCXVuc2lnbmVkIHNob3J0IAl6X3ZlbF9saXNfbHN3OwotCXVuc2lnbmVkIHNob3J0CXRocmVlZF9lbmFibGVfZmxhZzsKLQl1bnNpZ25lZCBzaG9ydCAJdm9sdW1lOwotCXVuc2lnbmVkIHNob3J0CXhfcG9zX3NvdXJjZV9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJeF9wb3Nfc291cmNlX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAl5X3Bvc19zb3VyY2VfbXN3OwotCXVuc2lnbmVkIHNob3J0CXlfcG9zX3NvdXJjZV9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJel9wb3Nfc291cmNlX21zdzsKLQl1bnNpZ25lZCBzaG9ydAl6X3Bvc19zb3VyY2VfbHN3OwotCXVuc2lnbmVkIHNob3J0CW1heF9kaXN0XzBfbXN3OwotCXVuc2lnbmVkIHNob3J0CW1heF9kaXN0XzBfbHN3OwotCXVuc2lnbmVkIHNob3J0CW1pbl9kaXN0XzBfbXN3OwotCXVuc2lnbmVkIHNob3J0CW1pbl9kaXN0XzBfbHN3OwotCXVuc2lnbmVkIHNob3J0CXJvbGxfb2ZmX2ZhY3RvcjsKLQl1bnNpZ25lZCBzaG9ydAltdXRlX2FmdGVyX21heF9mbGFnOwotCXVuc2lnbmVkIHNob3J0CXhfdmVsX3NvdXJjZV9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJeF92ZWxfc291cmNlX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAl5X3ZlbF9zb3VyY2VfbXN3OwotCXVuc2lnbmVkIHNob3J0CXlfdmVsX3NvdXJjZV9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJel92ZWxfc291cmNlX21zdzsKLQl1bnNpZ25lZCBzaG9ydAl6X3ZlbF9zb3VyY2VfbHN3OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIE1TRyB0byBwcm92aWRlIEFWU1lOQyBmZWVkYmFjayBmcm9tIERTUCB0byBBUk0KLSAqLwotCi0jZGVmaW5lIEFVRFBQX01TR19BVlNZTkNfTVNHCQkweDAwMDUKLSNkZWZpbmUgQVVEUFBfTVNHX0FWU1lOQ19NU0dfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHBwX21zZ19hdnN5bmNfbXNnKQotCi1zdHJ1Y3QgYXVkcHBfbXNnX2F2c3luY19tc2cgewotCXVuc2lnbmVkIHNob3J0CWFjdGl2ZV9mbGFnOwotCXVuc2lnbmVkIHNob3J0CW51bV9zYW1wbGVzX2NvdW50ZXIwX0hTVzsKLQl1bnNpZ25lZCBzaG9ydAludW1fc2FtcGxlc19jb3VudGVyMF9NU1c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtX3NhbXBsZXNfY291bnRlcjBfTFNXOwotCXVuc2lnbmVkIHNob3J0CW51bV9ieXRlc19jb3VudGVyMF9IU1c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtX2J5dGVzX2NvdW50ZXIwX01TVzsKLQl1bnNpZ25lZCBzaG9ydAludW1fYnl0ZXNfY291bnRlcjBfTFNXOwotCXVuc2lnbmVkIHNob3J0CXNhbXBfZnJlcV9vYmpfMDsKLQl1bnNpZ25lZCBzaG9ydAlzYW1wX2ZyZXFfb2JqXzE7Ci0JdW5zaWduZWQgc2hvcnQJc2FtcF9mcmVxX29ial8yOwotCXVuc2lnbmVkIHNob3J0CXNhbXBfZnJlcV9vYmpfMzsKLQl1bnNpZ25lZCBzaG9ydAlzYW1wX2ZyZXFfb2JqXzQ7Ci0JdW5zaWduZWQgc2hvcnQJc2FtcF9mcmVxX29ial81OwotCXVuc2lnbmVkIHNob3J0CXNhbXBfZnJlcV9vYmpfNjsKLQl1bnNpZ25lZCBzaG9ydAlzYW1wX2ZyZXFfb2JqXzc7Ci0JdW5zaWduZWQgc2hvcnQJc2FtcF9mcmVxX29ial84OwotCXVuc2lnbmVkIHNob3J0CXNhbXBfZnJlcV9vYmpfOTsKLQl1bnNpZ25lZCBzaG9ydAlzYW1wX2ZyZXFfb2JqXzEwOwotCXVuc2lnbmVkIHNob3J0CXNhbXBfZnJlcV9vYmpfMTE7Ci0JdW5zaWduZWQgc2hvcnQJc2FtcF9mcmVxX29ial8xMjsKLQl1bnNpZ25lZCBzaG9ydAlzYW1wX2ZyZXFfb2JqXzEzOwotCXVuc2lnbmVkIHNob3J0CXNhbXBfZnJlcV9vYmpfMTQ7Ci0JdW5zaWduZWQgc2hvcnQJc2FtcF9mcmVxX29ial8xNTsKLQl1bnNpZ25lZCBzaG9ydAludW1fc2FtcGxlc19jb3VudGVyNF9IU1c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtX3NhbXBsZXNfY291bnRlcjRfTVNXOwotCXVuc2lnbmVkIHNob3J0CW51bV9zYW1wbGVzX2NvdW50ZXI0X0xTVzsKLQl1bnNpZ25lZCBzaG9ydAludW1fYnl0ZXNfY291bnRlcjRfSFNXOwotCXVuc2lnbmVkIHNob3J0CW51bV9ieXRlc19jb3VudGVyNF9NU1c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtX2J5dGVzX2NvdW50ZXI0X0xTVzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBNU0cgdG8gcHJvdmlkZSBQQ00gRE1BIE1pc3NlZCBmZWVkYmFjayBmcm9tIHRoZSBEU1AgdG8gQVJNCi0gKi8KLQotI2RlZmluZSAgQVVEUFBfTVNHX1BDTURNQU1JU1NFRAkweDAwMDYKLSNkZWZpbmUgIEFVRFBQX01TR19QQ01ETUFNSVNTRURfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHBwX21zZ19wY21kbWFtaXNzZWQpOwotCi1zdHJ1Y3QgYXVkcHBfbXNnX3BjbWRtYW1pc3NlZCB7Ci0JLyoKLQkqKiBCaXQgMAkwID0gUENNIERNQSBub3QgbWlzc2VkIGZvciBvYmplY3QgMAotCSoqICAgICAgICAxID0gUENNIERNQSBtaXNzZWQgZm9yIG9iamVjdDAKLQkqKiBCaXQgMQkwID0gUENNIERNQSBub3QgbWlzc2VkIGZvciBvYmplY3QgMQotCSoqICAgICAgICAxID0gUENNIERNQSBtaXNzZWQgZm9yIG9iamVjdDEKLQkqKiBCaXQgMgkwID0gUENNIERNQSBub3QgbWlzc2VkIGZvciBvYmplY3QgMgotCSoqICAgICAgICAxID0gUENNIERNQSBtaXNzZWQgZm9yIG9iamVjdDIKLQkqKiBCaXQgMwkwID0gUENNIERNQSBub3QgbWlzc2VkIGZvciBvYmplY3QgMwotCSoqICAgICAgICAxID0gUENNIERNQSBtaXNzZWQgZm9yIG9iamVjdDMKLQkqKiBCaXQgNAkwID0gUENNIERNQSBub3QgbWlzc2VkIGZvciBvYmplY3QgNAotCSoqICAgICAgICAxID0gUENNIERNQSBtaXNzZWQgZm9yIG9iamVjdDQKLQkqLwotCXVuc2lnbmVkIHNob3J0IHBjbWRtYW1pc3NlZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBNU0cgdG8gQVVEUFAgZW5hYmxlIG9yIGRpc2FibGUgZmVlZGJhY2sgZm9ybSBEU1AgdG8gQVJNCi0gKi8KLQotI2RlZmluZSBBVURQUF9NU0dfQ0ZHX01TRwkweDAwMDcKLSNkZWZpbmUgQVVEUFBfTVNHX0NGR19NU0dfTEVOCVwKLSAgICBzaXplb2Yoc3RydWN0IGF1ZHBwX21zZ19jZmdfbXNnKQotCi0jZGVmaW5lIEFVRFBQX01TR19FTkFfRU5BCTB4RkZGRgotI2RlZmluZSBBVURQUF9NU0dfRU5BX0RJUwkweDAwMDAKLQotc3RydWN0IGF1ZHBwX21zZ19jZmdfbXNnIHsKLQkvKiAgIEVuYWJsZWQgIC0gMHhmZmZmCi0JKiogIERpc2FibGVkIC0gMAotCSovCi0JdW5zaWduZWQgc2hvcnQgZW5hYmxlZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBNU0cgdG8gY29tbXVuaWNhdGUgdGhlIHJldmVyYiAgcGVyIG9iamVjdCB2b2x1bWUKLSAqLwotCi0jZGVmaW5lIEFVRFBQX01TR19RUkVWRVJCX1ZPTFVNRQkweDAwMDgKLSNkZWZpbmUgQVVEUFBfTVNHX1FSRVZFUkJfVk9MVU1FX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcF9tc2dfcXJldmVyYl92b2x1bWUpCi0KLQotc3RydWN0IGF1ZHBwX21zZ19xcmV2ZXJiX3ZvbHVtZSB7Ci0JdW5zaWduZWQgc2hvcnQJb2JqXzBfZ2FpbjsKLQl1bnNpZ25lZCBzaG9ydAlvYmpfMV9nYWluOwotCXVuc2lnbmVkIHNob3J0CW9ial8yX2dhaW47Ci0JdW5zaWduZWQgc2hvcnQJb2JqXzNfZ2FpbjsKLQl1bnNpZ25lZCBzaG9ydAlvYmpfNF9nYWluOwotCXVuc2lnbmVkIHNob3J0CWhwY21fb2JqX3ZvbHVtZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgQVVEUFBfTVNHX1JPVVRJTkdfQUNLIDB4MDAwOQotI2RlZmluZSBBVURQUF9NU0dfUk9VVElOR19BQ0tfTEVOIFwKLQlzaXplb2Yoc3RydWN0IGF1ZHBwX21zZ19yb3V0aW5nX2FjaykKLQotc3RydWN0IGF1ZHBwX21zZ19yb3V0aW5nX2FjayB7Ci0JdW5zaWduZWQgc2hvcnQgZGVjX2lkOwotCXVuc2lnbmVkIHNob3J0IHJvdXRpbmdfbW9kZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgQVVEUFBfTVNHX0ZMVVNIX0FDSyAweDAwMEEKLQotI2VuZGlmIC8qIFFEU1A1QVVEUFBNU0dfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvcWRzcDVhdWRwcmVwcm9jY21kaS5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvcWRzcDVhdWRwcmVwcm9jY21kaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDVjZjg0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHJlcHJvY2NtZGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBRRFNQNUFVRFBSRVBST0NDTURJX0gKLSNkZWZpbmUgUURTUDVBVURQUkVQUk9DQ01ESV9ICi0KLS8qCi0gKiBBVURJT1BSRVBST0MgQ09NTUFORFM6Ci0gKiBBUk0gdXNlcyB1UEF1ZFByZVByb2NBdWRSZWNDbWRRdWV1ZSB0byBjb21tdW5pY2F0ZSB3aXRoIEFVRFBSRVBST0NUQVNLCi0gKiBMb2NhdGlvbiA6IE1FTUIKLSAqIEJ1ZmZlciBzaXplIDogNwotICogTnVtYmVyIG9mIGJ1ZmZlcnMgaW4gYSBxdWV1ZSA6IDQKLSAqLwotCi0vKgotICogQ29tbWFuZCB0byBlbmFibGUgb3IgZGlzYWJsZSBwYXJ0aWN1bGFyIGVuY29kZXIgZm9yIG5ldyBpbnRlcmZhY2UKLSAqLwotCi0jZGVmaW5lIEFVRFBSRVBST0NfQVVEUkVDX0NNRF9FTkNfQ0ZHCQkweDAwMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19BVURSRUNfQ01EX0VOQ19DRkdfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHByZXByb2NfYXVkcmVjX2NtZF9lbmNfY2ZnKQotI2RlZmluZSBBVURSRUNfVEFTS18wCTB4MDAgLyogU0JDIC8gUENNICovCi0jZGVmaW5lIEFVRFJFQ19UQVNLXzEJMHgwMSAvKiBBQUMgLyBQQ00gLyBWT0lDRSBFTkMgKi8KLQotI2RlZmluZSBFTkNPREVfRU5BQkxFCTB4ODAwMAotCi0vKiBlbmNvZGVyIHR5cGUgc3VwcG9ydGVkICovCi0jZGVmaW5lIEVOQ19UWVBFX1dBVgkweDAwCi0jZGVmaW5lIEVOQ19UWVBFX0FBQwkweDAxCi0jZGVmaW5lIEVOQ19UWVBFX1NCQwkweDAyCi0jZGVmaW5lIEVOQ19UWVBFX0FNUk5CCTB4MDMKLSNkZWZpbmUgRU5DX1RZUEVfRVZSQwkweDA0Ci0jZGVmaW5lIEVOQ19UWVBFX1YxM0sJMHgwNQotI2RlZmluZSBFTkNfVFlQRV9FWFRfV0FWICAgMHgwRiAvKiB0byBkeW5hbWljYWxseSBjb25maWd1cmUgZnJhbWUgc2l6ZSAqLwotCi0vKiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgYWNjb3JkaW5nIHRvCi0gKiBjb21tYW5kIGRlc2NyaXB0aW9uIG9mIEFSTS1EU1AgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zCi0gKi8KLXN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfZW5jX2NmZyB7Ci0JdW5zaWduZWQgc2hvcnQJY21kX2lkOwotCXVuc2lnbmVkIHNob3J0ICBzdHJlYW1faWQ7Ci0JdW5zaWduZWQgc2hvcnQgIGF1ZHJlY19lbmNfdHlwZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIHRvIGNvbmZpZ3VyZSBwYXJhbWV0ZXJzIG9mIHNlbGVjdGVkIEVuY29kZXIKLSAqLwotCi0jZGVmaW5lIEFVRFBSRVBST0NfQVVEUkVDX0NNRF9QQVJBTV9DRkcJMHgwMDAxCi0KLSNkZWZpbmUgQVVEUFJFUFJPQ19BVURSRUNfQ01EX1BBUkFNX0NGR19DT01NT05fTEVOCQlcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcGFyYW1fY2ZnX2NvbW1vbikKLQotI2RlZmluZSBEVUFMX01JQ19TVEVSRU9fUkVDT1JESU5HICAgICAgMgotCi1zdHJ1Y3QgYXVkcHJlcHJvY19hdWRyZWNfY21kX3BhcmFtX2NmZ19jb21tb24gewotCXVuc2lnbmVkIHNob3J0IGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCBzdHJlYW1faWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gY29uZmlndXJlIFdBViBFbmNvZGVyCi0gKi8KLQotI2RlZmluZSBBVURQUkVQUk9DX0FVRFJFQ19DTURfUEFSQU1fQ0ZHX1dBVl9MRU4JCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHByZXByb2NfYXVkcmVjX2NtZF9wYXJtX2NmZ193YXYpCi0KLSNkZWZpbmUgQVVEUkVDX0NNRF9NT0RFX01PTk8gMAotI2RlZmluZSBBVURSRUNfQ01EX01PREVfU1RFUkVPIDEKLQotc3RydWN0IGF1ZHByZXByb2NfYXVkcmVjX2NtZF9wYXJtX2NmZ193YXYgewotCXN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcGFyYW1fY2ZnX2NvbW1vbiBjb21tb247Ci0JdW5zaWduZWQgc2hvcnQgYXVkX3JlY19zYW1wbGVyYXRlX2lkeDsKLQl1bnNpZ25lZCBzaG9ydCBhdWRfcmVjX3N0ZXJlb19tb2RlOwotCXVuc2lnbmVkIHNob3J0IGF1ZF9yZWNfZnJhbWVfc2l6ZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBjb25maWd1cmUgQUFDIEVuY29kZXIKLSAqLwotCi0jZGVmaW5lIEFVRFBSRVBST0NfQVVEUkVDX0NNRF9QQVJBTV9DRkdfQUFDX0xFTgkJXAotCXNpemVvZihzdHJ1Y3QgYXVkcHJlcHJvY19hdWRyZWNfY21kX3Bhcm1fY2ZnX2FhYykKLQotc3RydWN0IGF1ZHByZXByb2NfYXVkcmVjX2NtZF9wYXJtX2NmZ19hYWMgewotCXN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcGFyYW1fY2ZnX2NvbW1vbiBjb21tb247Ci0JdW5zaWduZWQgc2hvcnQgYXVkX3JlY19zYW1wbGVyYXRlX2lkeDsKLQl1bnNpZ25lZCBzaG9ydCBhdWRfcmVjX3N0ZXJlb19tb2RlOwotCXNpZ25lZCBzaG9ydCAgIHJlY29yZGluZ19xdWFsaXR5OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIENvbW1hbmQgU3RydWN0dXJlIHRvIGNvbmZpZ3VyZSBTQkMgRW5jb2RlcgotICovCi0KLSNkZWZpbmUgQVVEUFJFUFJPQ19BVURSRUNfQ01EX1BBUkFNX0NGR19TQkNfTEVOCQlcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcGFybV9jZmdfc2JjKQotCi0vKiBlbmNvZGVyIHBhcmFtZXRlcnMgbWFzayBkZWZpbml0aW9ucyovCi0KLSNkZWZpbmUgQVVEUkVDX1NCQ19FTkNfUEFSQU1fVkVSX01BU0sJCQkJMHgwMDBBCi0jZGVmaW5lIEFVRFJFQ19TQkNfRU5DX1BBUkFNX0VOQUhBTkNFRF9TQkNfQkFTRUxJTkVfVkVSU0lPTgkweDAwMDAKLSNkZWZpbmUgQVVEUkVDX1NCQ19FTkNfUEFSQU1fRU5BSEFOQ0VEX1NCQ19OQV9NQVNLCQkweDA0MDAKLSNkZWZpbmUgQVVEUkVDX1NCQ19FTkNfUEFSQU1fQklUX0FMTE9DX01BU0sJCQkweDAwMDgKLSNkZWZpbmUgQVVEUkVDX1NCQ19FTkNfUEFSQU1fU05SX01BU0sJCQkJMHgwMTAwCi0jZGVmaW5lIEFVRFJFQ19TQkNfRU5DX1BBUkFNX01PREVfTUFTSwkJCQkweDAwMDYKLSNkZWZpbmUgQVVEUkVDX1NCQ19FTkNfUEFSQU1fTU9ERV9EVUFMX01BU0sJCQkweDAwNDAKLSNkZWZpbmUgQVVEUkVDX1NCQ19FTkNfUEFSQU1fTU9ERV9TVEVSRU9fTUFTSwkJCTB4MDA4MAotI2RlZmluZSBBVURSRUNfU0JDX0VOQ19QQVJBTV9NT0RFX0pPSU5UX1NURVJFT19NQVNLCQkweDAwQzAKLSNkZWZpbmUgQVVEUkVDX1NCQ19FTkNfUEFSQU1fTlVNX1NVQl9CQU5EU19NQVNLIAkJMHgwMDA0Ci0jZGVmaW5lIEFVRFJFQ19TQkNfRU5DX1BBUkFNX05VTV9TVUJfQkFORFNfOF9NQVNLCQkweDAwMDEKLSNkZWZpbmUgQVVEUkVDX1NCQ19FTkNfUEFSQU1fTlVNX1NVQl9CTE9DS1NfTUFTSwkJMHgwMDAwCi0jZGVmaW5lIEFVRFJFQ19TQkNfRU5DX1BBUkFNX05VTV9TVUJfQkxPQ0tTXzRfTUFTSwkJMHgwMDAwCi0jZGVmaW5lIEFVRFJFQ19TQkNfRU5DX1BBUkFNX05VTV9TVUJfQkxPQ0tTXzhfTUFTSwkJMHgwMDAxCi0jZGVmaW5lIEFVRFJFQ19TQkNfRU5DX1BBUkFNX05VTV9TVUJfQkxPQ0tTXzEyX01BU0sJCTB4MDAwMgotI2RlZmluZSBBVURSRUNfU0JDX0VOQ19QQVJBTV9OVU1fU1VCX0JMT0NLU18xNl9NQVNLCQkweDAwMDMKLQotc3RydWN0IGF1ZHByZXByb2NfYXVkcmVjX2NtZF9wYXJtX2NmZ19zYmMgewotCXN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcGFyYW1fY2ZnX2NvbW1vbiBjb21tb247Ci0JdW5zaWduZWQgc2hvcnQgYXVkX3JlY19zYmNfZW5jX3BhcmFtOwotCXVuc2lnbmVkIHNob3J0IGF1ZF9yZWNfc2JjX2JpdF9yYXRlX21zdzsKLQl1bnNpZ25lZCBzaG9ydCBhdWRfcmVjX3NiY19iaXRfcmF0ZV9sc3c7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogQ29tbWFuZCBTdHJ1Y3R1cmUgdG8gY29uZmlndXJlIEFNUk5CIEVuY29kZXIKLSAqLwotCi0jZGVmaW5lIEFVRFBSRVBST0NfQVVEUkVDX0NNRF9QQVJBTV9DRkdfQU1STkJfTEVOCQlcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcGFybV9jZmdfYW1ybmIpCi0KLSNkZWZpbmUgQU1STkJfRFRYX01PREVfRU5BQkxFCQktMQotI2RlZmluZSBBTVJOQl9EVFhfTU9ERV9ESVNBQkxFCQkgMAotCi0jZGVmaW5lIEFNUk5CX1RFU1RfTU9ERV9FTkFCTEUJCS0xCi0jZGVmaW5lIEFNUk5CX1RFU1RfTU9ERV9ESVNBQkxFCQkgMAotCi0jZGVmaW5lIEFNUk5CX1VTRURfTU9ERV9NUjQ3NQkJMHgwCi0jZGVmaW5lIEFNUk5CX1VTRURfTU9ERV9NUjUxNQkJMHgxCi0jZGVmaW5lIEFNUk5CX1VTRURfTU9ERV9NUjU5CQkweDIKLSNkZWZpbmUgQU1STkJfVVNFRF9NT0RFX01SNjcJCTB4MwotI2RlZmluZSBBTVJOQl9VU0VEX01PREVfTVI3NAkJMHg0Ci0jZGVmaW5lIEFNUk5CX1VTRURfTU9ERV9NUjc5NQkJMHg1Ci0jZGVmaW5lIEFNUk5CX1VTRURfTU9ERV9NUjEwMgkJMHg2Ci0jZGVmaW5lIEFNUk5CX1VTRURfTU9ERV9NUjEyMgkJMHg3Ci0KLXN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcGFybV9jZmdfYW1ybmIgewotCXN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcGFyYW1fY2ZnX2NvbW1vbiBjb21tb247Ci0Jc2lnbmVkIHNob3J0IGR0eF9tb2RlOwotCXNpZ25lZCBzaG9ydCB0ZXN0X21vZGU7Ci0JdW5zaWduZWQgc2hvcnQgdXNlZF9tb2RlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSA7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBjb25maWd1cmUgRVZSQyBFbmNvZGVyCi0gKi8KLQotI2RlZmluZSBBVURQUkVQUk9DX0FVRFJFQ19DTURfUEFSQU1fQ0ZHX0VWUkNfTEVOCQlcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcGFybV9jZmdfZXZyYykKLQotc3RydWN0IGF1ZHByZXByb2NfYXVkcmVjX2NtZF9wYXJtX2NmZ19ldnJjIHsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19hdWRyZWNfY21kX3BhcmFtX2NmZ19jb21tb24gY29tbW9uOwotCXVuc2lnbmVkIHNob3J0IGVuY19taW5fcmF0ZTsKLQl1bnNpZ25lZCBzaG9ydCBlbmNfbWF4X3JhdGU7Ci0JdW5zaWduZWQgc2hvcnQgcmF0ZV9tb2R1bGF0aW9uX2NtZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIFN0cnVjdHVyZSB0byBjb25maWd1cmUgUUNFTFBfMTNLIEVuY29kZXIKLSAqLwotCi0jZGVmaW5lIEFVRFBSRVBST0NfQVVEUkVDX0NNRF9QQVJBTV9DRkdfUUNFTFAxM0tfTEVOCQlcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcGFybV9jZmdfcWNlbHAxM2spCi0KLXN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcGFybV9jZmdfcWNlbHAxM2sgewotCXN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcGFyYW1fY2ZnX2NvbW1vbiBjb21tb247Ci0JdW5zaWduZWQgc2hvcnQgZW5jX21pbl9yYXRlOwotCXVuc2lnbmVkIHNob3J0IGVuY19tYXhfcmF0ZTsKLQl1bnNpZ25lZCBzaG9ydCByYXRlX21vZHVsYXRpb25fY21kOwotCXVuc2lnbmVkIHNob3J0IHJlZHVjZWRfcmF0ZV9sZXZlbDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIHRvIGNvbmZpZ3VyZSBBRkUgZm9yIHJlY29yZGluZyBwYXRocwotICovCi0jZGVmaW5lIEFVRFBSRVBST0NfQUZFX0NNRF9BVURJT19SRUNPUkRfQ0ZHIDB4MDAwMgotCi0jZGVmaW5lIEFVRFBSRVBST0NfQUZFX0NNRF9BVURJT19SRUNPUkRfQ0ZHX0xFTgkJXAotCXNpemVvZihzdHJ1Y3QgYXVkcHJlcHJvY19hZmVfY21kX2F1ZGlvX3JlY29yZF9jZmcpCi0KLSNkZWZpbmUgQVVESU9fUkVDT1JESU5HX1RVUk5fT04JCTB4RkZGRgotI2RlZmluZSBBVURJT19SRUNPUkRJTkdfVFVSTl9PRkYJMHgwMDAwCi0KLSNkZWZpbmUgQVVEUFBfQTJEUF9QSVBFX1NPVVJDRV9NSVhfTUFTSwkJMHgwMDIwCi0jZGVmaW5lIFZPSUNFX0RMX1NPVVJDRV9NSVhfTUFTSwkJMHgwMDEwCi0jZGVmaW5lIFZPSUNFX1VMX1NPVVJDRV9NSVhfTUFTSwkJMHgwMDA4Ci0jZGVmaW5lIEZNX1NPVVJDRV9NSVhfTUFTSwkJCTB4MDAwNAotI2RlZmluZSBBVVhfQ09ERUNfVFhfU09VUkNFX01JWF9NQVNLCQkweDAwMDIKLSNkZWZpbmUgSU5URVJOQUxfQ09ERUNfVFhfU09VUkNFX01JWF9NQVNLCTB4MDAwMQotCi1zdHJ1Y3QgYXVkcHJlcHJvY19hZmVfY21kX2F1ZGlvX3JlY29yZF9jZmcgewotCXVuc2lnbmVkIHNob3J0IGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCBzdHJlYW1faWQ7Ci0JdW5zaWduZWQgc2hvcnQgZGVzdGluYXRpb25fYWN0aXZpdHk7Ci0JdW5zaWduZWQgc2hvcnQgc291cmNlX21peF9tYXNrOwotCXVuc2lnbmVkIHNob3J0IHBpcGVfaWQ7Ci0JdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogQ29tbWFuZCB0byBjb25maWd1cmUgVHVubmVsKFJUKSBvciBOb24tVHVubmVsKEZUUlQpIG1vZGUKLSAqLwotI2RlZmluZSBBVURQUkVQUk9DX0FVRFJFQ19DTURfUk9VVElOR19NT0RFIDB4MDAwMwotI2RlZmluZQlBVURQUkVQUk9DX0FVRFJFQ19DTURfUk9VVElOR19NT0RFX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcm91dGluZ19tb2RlKQotCi0jZGVmaW5lIEFVRElPX1JPVVRJTkdfTU9ERV9GVFJUCQkweDAwMDEKLSNkZWZpbmUgQVVESU9fUk9VVElOR19NT0RFX1JUCQkweDAwMDIKLQotc3RydWN0IGF1ZHByZXByb2NfYXVkcmVjX2NtZF9yb3V0aW5nX21vZGUgewotCXVuc2lnbmVkIHNob3J0IGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCBzdHJlYW1faWQ7Ci0JdW5zaWduZWQgc2hvcnQgcm91dGluZ19tb2RlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIENvbW1hbmQgdG8gY29uZmlndXJlIERTUCBmb3IgdG9wb2xvZ3kgd2hlcmUgcmVzYW1wbGVyIG1vdmVkCi0gKiBpbiBmcm9udCBvZiBwcmUgcHJvY2Vzc2luZyBjaGFpbgotICovCi0jZGVmaW5lIEFVRFBSRVBST0NfQVVEUkVDX0NNRF9FTkNfQ0ZHXzIJCTB4MDAwNAotI2RlZmluZQlBVURQUkVQUk9DX0FVRFJFQ19DTURfRU5DX0NGR18yX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfZW5jX2NmZ18yKQotCi0KLXN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfZW5jX2NmZ18yIHsKLQl1bnNpZ25lZCBzaG9ydAljbWRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQgIHN0cmVhbV9pZDsKLQl1bnNpZ25lZCBzaG9ydCAgYXVkcmVjX2VuY190eXBlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIEFVRElPUFJFUFJPQyBDT01NQU5EUzoKLSAqIEFSTSB1c2VzIHVQQXVkUHJlUHJvY0NtZFF1ZXVlIHRvIGNvbW11bmljYXRlIHdpdGggQVVEUFJFUFJPQ1RBU0sKLSAqIExvY2F0aW9uIDogTUVNQgotICogQnVmZmVyIHNpemUgOiA1MgotICogTnVtYmVyIG9mIGJ1ZmZlcnMgaW4gYSBxdWV1ZSA6IDMKLSAqLwotCi0vKgotICogQ29tbWFuZCB0byBjb25maWd1cmUgdGhlIHBhcmFtZXRlcnMgb2YgQUdDCi0gKi8KLQotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9DRkdfQUdDX1BBUkFNUwkweDAwMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfQ0ZHX0FHQ19QQVJBTVNfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19hZ2NfcGFyYW1zKQotCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX1RYX0FHQ19QQVJBTV9NQVNLX0NPTVBfU0xPUEUJMHgwMjAwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX1RYX0FHQ19QQVJBTV9NQVNLX0NPTVBfVEgJMHgwNDAwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX1RYX0FHQ19QQVJBTV9NQVNLX0VYUF9TTE9QRQkweDA4MDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfVFhfQUdDX1BBUkFNX01BU0tfRVhQX1RICQkweDEwMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfVFhfQUdDX1BBUkFNX01BU0tfQ09NUF9BSUdfRkxBRwkJMHgyMDAwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX1RYX0FHQ19QQVJBTV9NQVNLX0NPTVBfU1RBVElDX0dBSU4JMHg0MDAwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX1RYX0FHQ19QQVJBTV9NQVNLX1RYX0FHQ19FTkFfRkxBRwkweDgwMDAKLQotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9UWF9BR0NfRU5BX0ZMQUdfRU5BCS0xCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX1RYX0FHQ19FTkFfRkxBR19ESVMJMHgwMDAwCi0KLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfQURQX0dBSU5fRkxBR19FTkFfQURQX0dBSU4JLTEKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfQURQX0dBSU5fRkxBR19FTkFfU1RBVElDX0dBSU4JMHgwMDAwCi0KLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19STVNfVEFZCTB4MDAxMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9QQVJBTV9NQVNLX1JFTEVBU0VLCTB4MDAyMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9QQVJBTV9NQVNLX0RFTEFZCQkweDAwNDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19BVFRBQ0tLCTB4MDA4MAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9QQVJBTV9NQVNLX0xFQUtSQVRFX1NMT1cJMHgwMTAwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX1BBUkFNX01BU0tfTEVBS1JBVEVfRkFTVAkweDAyMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19BSUdfUkVMRUFTRUsgCTB4MDQwMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9QQVJBTV9NQVNLX0FJR19NSU4JMHgwODAwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX1BBUkFNX01BU0tfQUlHX01BWAkweDEwMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19MRUFLX1VQCTB4MjAwMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9QQVJBTV9NQVNLX0xFQUtfRE9XTgkweDQwMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19BSUdfQVRUQUNLSwkweDgwMDAKLQotc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19hZ2NfcGFyYW1zIHsKLQl1bnNpZ25lZCBzaG9ydAljbWRfaWQ7Ci0JdW5zaWduZWQgc2hvcnQgCXN0cmVhbV9pZDsKLQl1bnNpZ25lZCBzaG9ydAl0eF9hZ2NfcGFyYW1fbWFzazsKLQlzaWduZWQgc2hvcnQJdHhfYWdjX2VuYWJsZV9mbGFnOwotCXVuc2lnbmVkIHNob3J0CWNvbXBfcmxpbmtfc3RhdGljX2dhaW47Ci0Jc2lnbmVkIHNob3J0CWNvbXBfcmxpbmtfYWlnX2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQJZXhwYW5kZXJfcmxpbmtfdGg7Ci0JdW5zaWduZWQgc2hvcnQJZXhwYW5kZXJfcmxpbmtfc2xvcGU7Ci0JdW5zaWduZWQgc2hvcnQJY29tcHJlc3Nvcl9ybGlua190aDsKLQl1bnNpZ25lZCBzaG9ydAljb21wcmVzc29yX3JsaW5rX3Nsb3BlOwotCXVuc2lnbmVkIHNob3J0CXR4X2FkY19hZ2NfcGFyYW1fbWFzazsKLQl1bnNpZ25lZCBzaG9ydAljb21wX3JsaW5rX2FpZ19hdHRhY2trOwotCXVuc2lnbmVkIHNob3J0CWNvbXBfcmxpbmtfYWlnX2xlYWtfZG93bjsKLQl1bnNpZ25lZCBzaG9ydAljb21wX3JsaW5rX2FpZ19sZWFrX3VwOwotCXVuc2lnbmVkIHNob3J0CWNvbXBfcmxpbmtfYWlnX21heDsKLQl1bnNpZ25lZCBzaG9ydAljb21wX3JsaW5rX2FpZ19taW47Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9ybGlua19haWdfcmVsZWFzZWs7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9ybGlua19haWdfbGVha3JhdGVfZmFzdDsKLQl1bnNpZ25lZCBzaG9ydAljb21wX3JsaW5rX2FpZ19sZWFrcmF0ZV9zbG93OwotCXVuc2lnbmVkIHNob3J0CWNvbXBfcmxpbmtfYXR0YWNra19tc3c7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9ybGlua19hdHRhY2trX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAljb21wX3JsaW5rX2RlbGF5OwotCXVuc2lnbmVkIHNob3J0CWNvbXBfcmxpbmtfcmVsZWFzZWtfbXN3OwotCXVuc2lnbmVkIHNob3J0CWNvbXBfcmxpbmtfcmVsZWFzZWtfbHN3OwotCXVuc2lnbmVkIHNob3J0CWNvbXBfcmxpbmtfcm1zX3RhdjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIHRvIGNvbmZpZ3VyZSB0aGUgcGFyYW1zIG9mIEFkdmFudmVkIEFHQwotICovCi0KLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfQ0ZHX0FHQ19QQVJBTVNfMgkJMHgwMDAxCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0NGR19BR0NfUEFSQU1TXzJfTEVOCQlcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcmVwcm9jX2NtZF9jZmdfYWdjX3BhcmFtc18yKQotCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EXzJfVFhfQUdDX0VOQV9GTEFHX0VOQQktMTsKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfMl9UWF9BR0NfRU5BX0ZMQUdfRElTCTB4MDAwMDsKLQotc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19hZ2NfcGFyYW1zXzIgewotCXVuc2lnbmVkIHNob3J0CWNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCAJc3RyZWFtX2lkOwotCXVuc2lnbmVkIHNob3J0CWFnY19wYXJhbV9tYXNrOwotCXNpZ25lZCBzaG9ydAl0eF9hZ2NfZW5hYmxlX2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9ybGlua19zdGF0aWNfZ2FpbjsKLQl1bnNpZ25lZCBzaG9ydAlleHBfcmxpbmtfdGg7Ci0JdW5zaWduZWQgc2hvcnQJZXhwX3JsaW5rX3Nsb3BlOwotCXVuc2lnbmVkIHNob3J0CWNvbXBfcmxpbmtfdGg7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9ybGlua19zbG9wZTsKLQl1bnNpZ25lZCBzaG9ydAljb21wX3JsaW5rX3Jtc190YXY7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9ybGlua19kb3duX3NhbXBfbWFzazsKLQl1bnNpZ25lZCBzaG9ydAljb21wX3JsaW5rX2F0dGFja2tfbXN3OwotCXVuc2lnbmVkIHNob3J0CWNvbXBfcmxpbmtfYXR0YWNra19sc3c7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9ybGlua19yZWxlYXNla19tc3c7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9ybGlua19yZWxlYXNla19sc3c7Ci0JdW5zaWduZWQgc2hvcnQJY29tcF9ybGlua19kZWxheTsKLQl1bnNpZ25lZCBzaG9ydAljb21wX3JsaW5rX21ha2V1cF9nYWluOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIENvbW1hbmQgdG8gY29uZmlndXJlIHBhcmFtcyBmb3IgbnMKLSAqLwotCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0NGR19OU19QQVJBTVMJCTB4MDAwMgotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9DRkdfTlNfUEFSQU1TX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcmVwcm9jX2NtZF9jZmdfbnNfcGFyYW1zKQotCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkxNU19FTkEJMHgwMDAxCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkxNU19ESVMgCTB4MDAwMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX0RFU19FTkEJMHgwMDAyCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfREVTX0RJUwkweDAwMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9OU19FTkEJMHgwMDA0Ci0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTlNfRElTCTB4MDAwMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX0NOSV9FTkEJMHgwMDA4Ci0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfQ05JX0RJUwkweDAwMDAKLQotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05MRVNfRU5BCTB4MDAxMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05MRVNfRElTCTB4MDAwMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX0hCX0VOQQkweDAwMjAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9IQl9ESVMJMHgwMDAwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfVkFfRU5BCTB4MDA0MAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX1ZBX0RJUwkweDAwMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9QQ0RfRU5BCTB4MDA4MAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX1BDRF9ESVMJMHgwMDAwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfRkVISV9FTkEJMHgwMTAwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfRkVISV9ESVMgCTB4MDAwMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FSElfRU5BCTB4MDIwMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FSElfRElTIAkweDAwMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9OTFBQX0VOQQkweDA0MDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9OTFBQX0RJUwkweDAwMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9GTkVfRU5BCTB4MDgwMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX0ZORV9ESVMJMHgwMDAwCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0VDX01PREVfUFJFTkxNU19FTkEgCTB4MTAwMAotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX1BSRU5MTVNfRElTIAkweDAwMDAKLQotc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19uc19wYXJhbXMgewotCXVuc2lnbmVkIHNob3J0CWNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCAgc3RyZWFtX2lkOwotCXVuc2lnbmVkIHNob3J0CWVjX21vZGVfbmV3OwotCXVuc2lnbmVkIHNob3J0CWRlbnNfZ2FtbWFfbjsKLQl1bnNpZ25lZCBzaG9ydAlkZW5zX25mZV9ibG9ja19zaXplOwotCXVuc2lnbmVkIHNob3J0CWRlbnNfbGltaXRfbnM7Ci0JdW5zaWduZWQgc2hvcnQJZGVuc19saW1pdF9uc19kOwotCXVuc2lnbmVkIHNob3J0CXdiX2dhbW1hX2U7Ci0JdW5zaWduZWQgc2hvcnQJd2JfZ2FtbWFfbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIHRvIGNvbmZpZ3VyZSBwYXJhbWV0ZXJzIGZvciBJSVIgdHVuaW5nIGZpbHRlcgotICovCi0KLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfQ0ZHX0lJUl9UVU5JTkdfRklMVEVSX1BBUkFNUwkJMHgwMDAzCi0jZGVmaW5lCUFVRFBSRVBST0NfQ01EX0NGR19JSVJfVFVOSU5HX0ZJTFRFUl9QQVJBTVNfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19paXJfdHVuaW5nX2ZpbHRlcl9wYXJhbXMpCi0KLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfSUlSX0FDVElWRV9GTEFHX0RJUwkweDAwMDAKLSNkZWZpbmUJQVVEUFJFUFJPQ19DTURfSUlSX0FDVElWRV9GTEFHX0VOQQkweDAwMDEKLQotc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19paXJfdHVuaW5nX2ZpbHRlcl9wYXJhbXMgewotCXVuc2lnbmVkIHNob3J0CWNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCAgc3RyZWFtX2lkOwotCXVuc2lnbmVkIHNob3J0CWFjdGl2ZV9mbGFnOwotCXVuc2lnbmVkIHNob3J0CW51bV9iYW5kczsKLQotCXVuc2lnbmVkIHNob3J0CW51bWVyYXRvcl9jb2VmZl9iMF9maWx0ZXIwX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAludW1lcmF0b3JfY29lZmZfYjBfZmlsdGVyMF9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtZXJhdG9yX2NvZWZmX2IxX2ZpbHRlcjBfbHN3OwotCXVuc2lnbmVkIHNob3J0CW51bWVyYXRvcl9jb2VmZl9iMV9maWx0ZXIwX21zdzsKLQl1bnNpZ25lZCBzaG9ydAludW1lcmF0b3JfY29lZmZfYjJfZmlsdGVyMF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtZXJhdG9yX2NvZWZmX2IyX2ZpbHRlcjBfbXN3OwotCi0JdW5zaWduZWQgc2hvcnQJbnVtZXJhdG9yX2NvZWZmX2IwX2ZpbHRlcjFfbHN3OwotCXVuc2lnbmVkIHNob3J0CW51bWVyYXRvcl9jb2VmZl9iMF9maWx0ZXIxX21zdzsKLQl1bnNpZ25lZCBzaG9ydAludW1lcmF0b3JfY29lZmZfYjFfZmlsdGVyMV9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtZXJhdG9yX2NvZWZmX2IxX2ZpbHRlcjFfbXN3OwotCXVuc2lnbmVkIHNob3J0CW51bWVyYXRvcl9jb2VmZl9iMl9maWx0ZXIxX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAludW1lcmF0b3JfY29lZmZfYjJfZmlsdGVyMV9tc3c7Ci0KLQl1bnNpZ25lZCBzaG9ydAludW1lcmF0b3JfY29lZmZfYjBfZmlsdGVyMl9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtZXJhdG9yX2NvZWZmX2IwX2ZpbHRlcjJfbXN3OwotCXVuc2lnbmVkIHNob3J0CW51bWVyYXRvcl9jb2VmZl9iMV9maWx0ZXIyX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAludW1lcmF0b3JfY29lZmZfYjFfZmlsdGVyMl9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtZXJhdG9yX2NvZWZmX2IyX2ZpbHRlcjJfbHN3OwotCXVuc2lnbmVkIHNob3J0CW51bWVyYXRvcl9jb2VmZl9iMl9maWx0ZXIyX21zdzsKLQotCXVuc2lnbmVkIHNob3J0CW51bWVyYXRvcl9jb2VmZl9iMF9maWx0ZXIzX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAludW1lcmF0b3JfY29lZmZfYjBfZmlsdGVyM19tc3c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtZXJhdG9yX2NvZWZmX2IxX2ZpbHRlcjNfbHN3OwotCXVuc2lnbmVkIHNob3J0CW51bWVyYXRvcl9jb2VmZl9iMV9maWx0ZXIzX21zdzsKLQl1bnNpZ25lZCBzaG9ydAludW1lcmF0b3JfY29lZmZfYjJfZmlsdGVyM19sc3c7Ci0JdW5zaWduZWQgc2hvcnQJbnVtZXJhdG9yX2NvZWZmX2IyX2ZpbHRlcjNfbXN3OwotCi0JdW5zaWduZWQgc2hvcnQgCWRlbm9taW5hdG9yX2NvZWZmX2EwX2ZpbHRlcjBfbHN3OwotCXVuc2lnbmVkIHNob3J0IAlkZW5vbWluYXRvcl9jb2VmZl9hMF9maWx0ZXIwX21zdzsKLQl1bnNpZ25lZCBzaG9ydCAJZGVub21pbmF0b3JfY29lZmZfYTFfZmlsdGVyMF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQgCWRlbm9taW5hdG9yX2NvZWZmX2ExX2ZpbHRlcjBfbXN3OwotCi0JdW5zaWduZWQgc2hvcnQgCWRlbm9taW5hdG9yX2NvZWZmX2EwX2ZpbHRlcjFfbHN3OwotCXVuc2lnbmVkIHNob3J0IAlkZW5vbWluYXRvcl9jb2VmZl9hMF9maWx0ZXIxX21zdzsKLQl1bnNpZ25lZCBzaG9ydCAJZGVub21pbmF0b3JfY29lZmZfYTFfZmlsdGVyMV9sc3c7Ci0JdW5zaWduZWQgc2hvcnQgCWRlbm9taW5hdG9yX2NvZWZmX2ExX2ZpbHRlcjFfbXN3OwotCi0JdW5zaWduZWQgc2hvcnQJZGVub21pbmF0b3JfY29lZmZfYTBfZmlsdGVyMl9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJZGVub21pbmF0b3JfY29lZmZfYTBfZmlsdGVyMl9tc3c7Ci0JdW5zaWduZWQgc2hvcnQJZGVub21pbmF0b3JfY29lZmZfYTFfZmlsdGVyMl9sc3c7Ci0JdW5zaWduZWQgc2hvcnQJZGVub21pbmF0b3JfY29lZmZfYTFfZmlsdGVyMl9tc3c7Ci0KLQl1bnNpZ25lZCBzaG9ydAlkZW5vbWluYXRvcl9jb2VmZl9hMF9maWx0ZXIzX2xzdzsKLQl1bnNpZ25lZCBzaG9ydAlkZW5vbWluYXRvcl9jb2VmZl9hMF9maWx0ZXIzX21zdzsKLQl1bnNpZ25lZCBzaG9ydCAJZGVub21pbmF0b3JfY29lZmZfYTFfZmlsdGVyM19sc3c7Ci0JdW5zaWduZWQgc2hvcnQgCWRlbm9taW5hdG9yX2NvZWZmX2ExX2ZpbHRlcjNfbXN3OwotCi0JdW5zaWduZWQgc2hvcnQJc2hpZnRfZmFjdG9yX2ZpbHRlcjA7Ci0JdW5zaWduZWQgc2hvcnQJc2hpZnRfZmFjdG9yX2ZpbHRlcjE7Ci0JdW5zaWduZWQgc2hvcnQJc2hpZnRfZmFjdG9yX2ZpbHRlcjI7Ci0JdW5zaWduZWQgc2hvcnQJc2hpZnRfZmFjdG9yX2ZpbHRlcjM7Ci0KLQl1bnNpZ25lZCBzaG9ydAlwYW5fb2ZfZmlsdGVyMDsKLQl1bnNpZ25lZCBzaG9ydAlwYW5fb2ZfZmlsdGVyMTsKLQl1bnNpZ25lZCBzaG9ydAlwYW5fb2ZfZmlsdGVyMjsKLQl1bnNpZ25lZCBzaG9ydAlwYW5fb2ZfZmlsdGVyMzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBDb21tYW5kIHRvIGNvbmZpZ3VyZSBwYXJhbWV0ZXJzIGZvciBjYWxpYnJhdGlvbiBnYWluIHJ4Ci0gKi8KLQotI2RlZmluZSBBVURQUkVQUk9DX0NNRF9DRkdfQ0FMX0dBSU5fUEFSQU1TIDB4MDAwNAotI2RlZmluZSBBVURQUkVQUk9DX0NNRF9DRkdfQ0FMX0dBSU5fTEVOICAgIFwKLQlzaXplb2Yoc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19jYWxfZ2FpbikKLQotc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19jYWxfZ2FpbiB7Ci0JdW5zaWduZWQgc2hvcnQgIGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCAgc3RyZWFtX2lkOwotCXVuc2lnbmVkIHNob3J0ICBhdWRwcmVjYWxnYWluOwotCXVuc2lnbmVkIHNob3J0ICByZXNlcnZlZDsKLX0gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZGVmaW5lIEFVRFBSRVBST0NfQ01EX0NGR19MVk5WX1BBUk1TCTB4MDAwNgotI2RlZmluZSBBVURQUkVQUk9DX0NNRF9DRkdfTFZOVl9QQVJNU19MRU4JXAotCQlzaXplb2Yoc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19sdm52X3BhcmFtKQotCi1zdHJ1Y3QgYXVkcHJlcHJvY19jbWRfY2ZnX2x2bnZfcGFyYW0gewotCXVuc2lnbmVkIHNob3J0IGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCBzdHJlYW1faWQ7Ci0JdW5zaWduZWQgc2hvcnQgY3NfbW9kZTsKLQl1bnNpZ25lZCBzaG9ydCBsdm52X2V4dF9idWZfc2l6ZTsKLQl1bnNpZ25lZCBzaG9ydCBsdm52X2V4dF9wYXJ0aXRpb247Ci0JdW5zaWduZWQgc2hvcnQgbHZudl9leHRfYnVmX3N0YXJ0X2xzdzsKLQl1bnNpZ25lZCBzaG9ydCBsdm52X2V4dF9idWZfc3RhcnRfbXN3OwotfTsKLQotI2RlZmluZSBBVURQUkVQUk9DX0NNRF9GRUFUX1FVRVJZX1BBUkFNUyAweDAwMDUKLQotc3RydWN0IHJ0Y19hdWRwcmVwcm9jX3JlYWRfZGF0YSB7Ci0JdW5zaWduZWQgc2hvcnQJY21kX2lkOwotCXVuc2lnbmVkIHNob3J0CXN0cmVhbV9pZDsKLQl1bnNpZ25lZCBzaG9ydCAgZmVhdHVyZV9pZDsKLQl1bnNpZ25lZCBzaG9ydCAgZXh0YnVmc2l6ZW1zdzsKLQl1bnNpZ25lZCBzaG9ydCAgZXh0YnVmc2l6ZWxzdzsKLQl1bnNpZ25lZCBzaG9ydCAgZXh0cGFydDsKLQl1bnNpZ25lZCBzaG9ydCAgZXh0YnVmc3RhcnRtc3c7Ci0JdW5zaWduZWQgc2hvcnQJZXh0YnVmc3RhcnRsc3c7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIDsKLQotI2VuZGlmIC8qIFFEU1A1QVVEUFJFUFJPQ0NNRElfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvcWRzcDVhdWRwcmVwcm9jbXNnLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9xZHNwNWF1ZHByZXByb2Ntc2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlZmJjZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9xZHNwNWF1ZHByZXByb2Ntc2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBRRFNQNUFVRFBSRVBST0NNU0dfSAotI2RlZmluZSBRRFNQNUFVRFBSRVBST0NNU0dfSAotCi0jZGVmaW5lIEFVRFBSRVBST0NfTVNHX0ZFQVRfUVVFUllfRE1fRE9ORSAweDAwMDYKLQotLyoKLSAqIEFEU1BSRVBST0NUQVNLIE1lc3NhZ2VzCi0gKiBBVURQUkVQUk9DVEFTSyB1c2VzIGF1ZFByZVByb2NVcFJsaXN0IHRvIGNvbW11bmljYXRlIHdpdGggQVJNCi0gKiBMb2NhdGlvbgk6IE1FTUIKLSAqIEJ1ZmZlciBzaXplIDogIDYKLSAqIE5vIG9mIGJ1ZmZlcnMgaW4gcXVldWUgOiA0Ci0gKi8KLQotLyoKLSAqIE1lc3NhZ2UgdG8gaW5kaWNhdGUgUHJlIHByb2Nlc3NpbmcgY29uZmlnIGNvbW1hbmQgaXMgZG9uZQotICovCi0KLSNkZWZpbmUgQVVEUFJFUFJPQ19DTURfQ0ZHX0RPTkVfTVNHIDB4MDAwMQotI2RlZmluZQlBVURQUkVQUk9DX0NNRF9DRkdfRE9ORV9NU0dfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19kb25lX21zZykKLQotI2RlZmluZSBBVURfUFJFUFJPQ19UWVBFX0FHQwkJMHgwCi0jZGVmaW5lIEFVRF9QUkVQUk9DX05PSVNFX1JFRFVDVElPTgkweDEKLSNkZWZpbmUgQVVEX1BSRVBST0NfSUlSX1RVTk5JTkdfRklMVEVSCTB4MgotCi0jZGVmaW5lIEFVRF9QUkVQUk9DX0NPTkZJR19FTkFCTEVEIAktMQotI2RlZmluZSBBVURfUFJFUFJPQ19DT05GSUdfRElTQUJMRUQJIDAKLQotc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19kb25lX21zZyB7Ci0JdW5zaWduZWQgc2hvcnQgc3RyZWFtX2lkOwotCXVuc2lnbmVkIHNob3J0IGF1ZF9wcmVwcm9jX3R5cGU7Ci0Jc2lnbmVkIHNob3J0IGF1ZF9wcmVwcm9jX3N0YXR1c19mbGFnOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIE1lc3NhZ2UgdG8gaW5kaWNhdGUgUHJlIHByb2Nlc3NpbmcgZXJyb3IgbWVzc2FnZXMKLSAqLwotCi0jZGVmaW5lIEFVRFBSRVBST0NfRVJST1JfTVNHIDB4MDAwMgotI2RlZmluZSBBVURQUkVQUk9DX0VSUk9SX01TR19MRU4gXAotCXNpemVvZihzdHJ1Y3QgYXVkcHJlcHJvY19lcnJfbXNnKQotCi0jZGVmaW5lIEFVRF9QUkVQUk9DX0VSUl9JRFhfV1JPTkdfU0FNUExJTkdfRlJFUVVFTkNZCTB4MDAKLSNkZWZpbmUgQVVEX1BSRVBST0NfRVJSX0lEWF9FTkNfTk9UX1NVUFBPUlRFRAkJMHgwMQotCi1zdHJ1Y3QgYXVkcHJlcHJvY19lcnJfbXNnIHsKLQl1bnNpZ25lZCBzaG9ydCBzdHJlYW1faWQ7Ci0Jc2lnbmVkIHNob3J0IGF1ZF9wcmVwcm9jX2Vycl9pZHg7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogTWVzc2FnZSB0byBpbmRpY2F0ZSBlbmNvZGVyIGNvbmZpZyBjb21tYW5kCi0gKi8KLQotI2RlZmluZSBBVURQUkVQUk9DX0NNRF9FTkNfQ0ZHX0RPTkVfTVNHCTB4MDAwMwotI2RlZmluZSBBVURQUkVQUk9DX0NNRF9FTkNfQ0ZHX0RPTkVfTVNHX0xFTiBcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRwcmVwcm9jX2NtZF9lbmNfY2ZnX2RvbmVfbXNnKQotCi1zdHJ1Y3QgYXVkcHJlcHJvY19jbWRfZW5jX2NmZ19kb25lX21zZyB7Ci0JdW5zaWduZWQgc2hvcnQgc3RyZWFtX2lkOwotCXVuc2lnbmVkIHNob3J0IHJlY19lbmNfdHlwZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBNZXNzYWdlIHRvIGluZGljYXRlIGVuY29kZXIgcGFyYW0gY29uZmlnIGNvbW1hbmQKLSAqLwotCi0jZGVmaW5lIEFVRFBSRVBST0NfQ01EX0VOQ19QQVJBTV9DRkdfRE9ORV9NU0cJMHgwMDA0Ci0jZGVmaW5lIEFVRFBSRVBST0NfQ01EX0VOQ19QQVJBTV9DRkdfRE9ORV9NU0dfTEVOIFwKLQlzaXplb2Yoc3RydWN0IGF1ZHByZXByb2NfY21kX2VuY19wYXJhbV9jZmdfZG9uZV9tc2cpCi0KLXN0cnVjdCBhdWRwcmVwcm9jX2NtZF9lbmNfcGFyYW1fY2ZnX2RvbmVfbXNnIHsKLQl1bnNpZ25lZCBzaG9ydCBzdHJlYW1faWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0KLS8qCi0gKiBNZXNzYWdlIHRvIGluZGljYXRlIEFGRSBjb25maWcgY21kIGZvcgotICogYXVkaW8gcmVjb3JkaW5nIGlzIHN1Y2Nlc3NmdWxseSByZWNpZXZlZAotICovCi0KLSNkZWZpbmUgQVVEUFJFUFJPQ19BRkVfQ01EX0FVRElPX1JFQ09SRF9DRkdfRE9ORV9NU0cgIDB4MDAwNQotI2RlZmluZSBBVURQUkVQUk9DX0FGRV9DTURfQVVESU9fUkVDT1JEX0NGR19ET05FX01TR19MRU4gXAotCXNpemVvZihzdHJ1Y3QgYXVkcHJlcHJvY19hZmVfY21kX2F1ZGlvX3JlY29yZF9jZmdfZG9uZSkKLQotc3RydWN0IGF1ZHByZXByb2NfYWZlX2NtZF9hdWRpb19yZWNvcmRfY2ZnX2RvbmUgewotCXVuc2lnbmVkIHNob3J0IHN0cmVhbV9pZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBNZXNzYWdlIHRvIGluZGljYXRlIFJvdXRpbmcgbW9kZQotICogY29uZmlndXJhdGlvbiBzdWNjZXNzIG9yIGZhaWx1cmUKLSAqLwotCi0jZGVmaW5lIEFVRFBSRVBST0NfQ01EX1JPVVRJTkdfTU9ERV9ET05FX01TRyAgMHgwMDA3Ci0jZGVmaW5lIEFVRFBSRVBST0NfQ01EX1JPVVRJTkdfTU9ERV9ET05FX01TR19MRU4gXAotCXNpemVvZihzdHJ1Y3QgYXVkcHJlcHJvY19jbWRfcm91dGluZ19tb2RlX2RvbmUpCi0KLXN0cnVjdCBhdWRwcmVwcm9jX2NtZF9yb3V0aW5nX21vZGVfZG9uZSB7Ci0JdW5zaWduZWQgc2hvcnQgc3RyZWFtX2lkOwotCXVuc2lnbmVkIHNob3J0IGNvbmZpZ3VyYXRpb247Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0KLSNkZWZpbmUgQVVEUFJFUFJPQ19DTURfUENNX0NGR19BUk1fVE9fUFJFUFJPQ19ET05FX01TRwkweDAwMDgKLSNkZWZpbmUgQVVEUFJFUFJPQ19DTURfUENNX0NGR19BUk1fVE9fUFJFUFJPQ19ET05FX01TR19MRU4gXAotCXNpemVvZihzdHJ1Y3QgYXVkcmVwcm9jX2NtZF9wY21fY2ZnX2FybV90b19wcmVwcm9jX2RvbmUpCi0KLXN0cnVjdCBhdWRyZXByb2NfY21kX3BjbV9jZmdfYXJtX3RvX3ByZXByb2NfZG9uZSB7Ci0JdW5zaWduZWQgc2hvcnQgc3RyZWFtX2lkOwotCXVuc2lnbmVkIHNob3J0IGNvbmZpZ3VyYXRpb247Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZW5kaWYgLyogUURTUDVBVURQUkVQUk9DTVNHX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL3Fkc3A1YXVkcmVjY21kaS5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvcWRzcDVhdWRyZWNjbWRpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NjQyZGYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvcWRzcDVhdWRyZWNjbWRpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgUURTUDVBVURSRUNDTURJX0gKLSNkZWZpbmUgUURTUDVBVURSRUNDTURJX0gKLQotLyoKLSAqIEFVRFJFQ1RBU0sgQ09NTUFORFMKLSAqIEFSTSB1c2VzIDIgcXVldWVzIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIEFVRFJFQ1RBU0sKLSAqIDEudVBBdWRSZWNbaV1DbWRRdWV1ZSwgd2hlcmUgaT0wLDEsMgotICogTG9jYXRpb24gOk1FTUMKLSAqIEJ1ZmZlciBTaXplIDogNQotICogTm8gb2YgQnVmZmVycyBpbiBhIHF1ZXVlIDogMgotICogMi51UEF1ZFJlY1tpXUJpdHN0cmVhbVF1ZXVlLCB3aGVyZSBpPTAsMSwyCi0gKiBMb2NhdGlvbiA6IE1FTUMKLSAqIEJ1ZmZlciBTaXplIDogNQotICogTm8gb2YgYnVmZmVycyBpbiBhIHF1ZXVlIDogMwotICovCi0KLS8qCi0gKiBDb21tYW5kcyBvbiB1UEF1ZFJlY1tpXUNtZFF1ZXVlLCB3aGVyZSBpPTAsMSwyCi0gKi8KLQotLyoKLSAqIENvbW1hbmQgdG8gY29uZmlndXJlIG1lbW9yeSBmb3IgZW5hYmxlZCBlbmNvZGVyCi0gKi8KLQotI2RlZmluZSBBVURSRUNfQ01EX01FTV9DRkdfQ01EIDB4MDAwMAotI2RlZmluZSBBVURSRUNfQ01EX0FSRUNNRU1fQ0ZHX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRyZWNfY21kX2FyZWNtZW1fY2ZnKQotCi1zdHJ1Y3QgYXVkcmVjX2NtZF9hcmVjbWVtX2NmZyB7Ci0JdW5zaWduZWQgc2hvcnQgY21kX2lkOwotCXVuc2lnbmVkIHNob3J0IGF1ZHJlY191cF9wa3RfaW50bV9jb3VudDsKLQl1bnNpZ25lZCBzaG9ydCBhdWRyZWNfZXh0X3BrdF9zdGFydF9hZGRyX21zdzsKLQl1bnNpZ25lZCBzaG9ydCBhdWRyZWNfZXh0X3BrdF9zdGFydF9hZGRyX2xzdzsKLQl1bnNpZ25lZCBzaG9ydCBhdWRyZWNfZXh0X3BrdF9idWZfbnVtYmVyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIENvbW1hbmQgdG8gY29uZmlndXJlIHBjbSBpbnB1dCBtZW1vcnkKLSAqLwotCi0jZGVmaW5lIEFVRFJFQ19DTURfUENNX0NGR19BUk1fVE9fRU5DIDB4MDAwMQotI2RlZmluZSBBVURSRUNfQ01EX1BDTV9DRkdfQVJNX1RPX0VOQ19MRU4JXAotCXNpemVvZihzdHJ1Y3QgYXVkcmVjX2NtZF9wY21fY2ZnX2FybV90b19lbmMpCi0KLXN0cnVjdCBhdWRyZWNfY21kX3BjbV9jZmdfYXJtX3RvX2VuYyB7Ci0JdW5zaWduZWQgc2hvcnQgY21kX2lkOwotCXVuc2lnbmVkIHNob3J0IGNvbmZpZ191cGRhdGVfZmxhZzsKLQl1bnNpZ25lZCBzaG9ydCBlbmFibGVfZmxhZzsKLQl1bnNpZ25lZCBzaG9ydCBzYW1wbGluZ19mcmVxOwotCXVuc2lnbmVkIHNob3J0IGNoYW5uZWxzOwotCXVuc2lnbmVkIHNob3J0IGZyZXF1ZW5jeV9vZl9pbnRpbWF0aW9uOwotCXVuc2lnbmVkIHNob3J0IG1heF9udW1iZXJfb2ZfYnVmZmVyczsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgQVVEUkVDX1BDTV9DT05GSUdfVVBEQVRFX0ZMQUdfRU5BQkxFIC0xCi0jZGVmaW5lIEFVRFJFQ19QQ01fQ09ORklHX1VQREFURV9GTEFHX0RJU0FCTEUgMAotCi0jZGVmaW5lIEFVRFJFQ19FTkFCTEVfRkxBR19WQUxVRSAtMQotI2RlZmluZSBBVURSRUNfRElTQUJMRV9GTEFHX1ZBTFVFIDAKLQotLyoKLSAqIENvbW1hbmQgdG8gaW50aW1hdGUgYXZhaWxhYmxlIHBjbSBidWZmZXIKLSAqLwotCi0jZGVmaW5lIEFVRFJFQ19DTURfUENNX0JVRkZFUl9QVFJfUkVGUkVTSF9BUk1fVE9fRU5DIDB4MDAwMgotI2RlZmluZSBBVURSRUNfQ01EX1BDTV9CVUZGRVJfUFRSX1JFRlJFU0hfQVJNX1RPX0VOQ19MRU4gXAotICBzaXplb2Yoc3RydWN0IGF1ZHJlY19jbWRfcGNtX2J1ZmZlcl9wdHJfcmVmcmVzaF9hcm1fZW5jKQotCi1zdHJ1Y3QgYXVkcmVjX2NtZF9wY21fYnVmZmVyX3B0cl9yZWZyZXNoX2FybV9lbmMgewotCXVuc2lnbmVkIHNob3J0IGNtZF9pZDsKLQl1bnNpZ25lZCBzaG9ydCBudW1fYnVmZmVyczsKLQl1bnNpZ25lZCBzaG9ydCBidWZmZXJfd3JpdGVfY250X21zdzsKLQl1bnNpZ25lZCBzaG9ydCBidWZmZXJfd3JpdGVfY250X2xzdzsKLQl1bnNpZ25lZCBzaG9ydCBidWZfYWRkcmVzc19sZW5ndGhbOF07Lyp0aGlzIGFycmF5IGhvbGRzIGFkZHJlc3MKLQkJCQkJCWFuZCBsZW5ndGggZGV0YWlscyBvZgotCQkJCQkJdHdvIGJ1ZmZlcnMqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIENvbW1hbmQgdG8gZmx1c2gKLSAqLwotCi0jZGVmaW5lIEFVRFJFQ19DTURfRkxVU0ggMHgwMDAzCi0jZGVmaW5lIEFVRFJFQ19DTURfRkxVU0hfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHJlY19jbWRfZmx1c2gpCi0KLXN0cnVjdCBhdWRyZWNfY21kX2ZsdXNoIHsKLQl1bnNpZ25lZCBzaG9ydCBjbWRfaWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKgotICogQ29tbWFuZHMgb24gdVBBdWRSZWNbaV1CaXRzdHJlYW1RdWV1ZSwgd2hlcmUgaT0wLDEsMgotICovCi0KLS8qCi0gKiBDb21tYW5kIHRvIGluZGljYXRlIGN1cnJlbnQgcGFja2V0IHJlYWQgY291bnQKLSAqLwotCi0jZGVmaW5lIFVQX0FVRFJFQ19QQUNLRVRfRVhUX1BUUiAweDAwMDAKLSNkZWZpbmUgVVBfQVVEUkVDX1BBQ0tFVF9FWFRfUFRSX0xFTglcCi0Jc2l6ZW9mKHVwX2F1ZHJlY19wYWNrZXRfZXh0X3B0cikKLQotc3RydWN0IHVwX2F1ZHJlY19wYWNrZXRfZXh0X3B0ciB7Ci0JdW5zaWduZWQgc2hvcnQgY21kX2lkOwotCXVuc2lnbmVkIHNob3J0IGF1ZHJlY191cF9jdXJyX3JlYWRfY291bnRfbHN3OwotCXVuc2lnbmVkIHNob3J0IGF1ZHJlY191cF9jdXJyX3JlYWRfY291bnRfbXN3OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2VuZGlmIC8qIFFEU1A1QVVEUkVDQ01ESV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9xZHNwNWF1ZHJlY21zZy5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvcWRzcDVhdWRyZWNtc2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0NjIzNS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9xZHNwNWF1ZHJlY21zZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIFFEU1A1QVVEUkVDTVNHX0gKLSNkZWZpbmUgUURTUDVBVURSRUNNU0dfSAotCi0vKgotICogQVVEUkVDVEFTSyBNRVNTQUdFUwotICogQVVEUkVDVEFTSyB1c2VzIGF1ZFJlY1tpXVVwUmxpc3QsIHdoZXJlIGk9MCwxLDIgdG8gY29tbXVuaWNhdGUgd2l0aCBBUk0KLSAqIExvY2F0aW9uIDogTUVNQwotICogQnVmZmVyIHNpemUgOiA1Ci0gKiBObyBvZiBidWZmZXJzIGluIGEgcXVldWUgOiAxMAotICovCi0KLS8qCi0gKiBNZXNzYWdlIHRvIG5vdGlmeSAyIGVycm9yIGNvbmRpdGlvbnMKLSAqLwotCi0jZGVmaW5lIEFVRFJFQ19GQVRBTF9FUlJfTVNHIDB4MDAwMQotI2RlZmluZSBBVURSRUNfRkFUQUxfRVJSX01TR19MRU4JXAotCXNpemVvZihzdHJ1Y3QgYXVkcmVjX2ZhdGFsX2Vycl9tc2cpCi0KLSNkZWZpbmUgQVVEUkVDX0ZBVEFMX0VSUl9NU0dfTk9fUEtUCTB4MDAKLQotc3RydWN0IGF1ZHJlY19mYXRhbF9lcnJfbXNnIHsKLQl1bnNpZ25lZCBzaG9ydCBhdWRyZWNfZXJyX2lkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIE1lc3NhZ2UgdG8gaW5kaWNhdGUgZW5jb2RlZCBwYWNrZXQgaXMgZGVsaXZlcmVkIHRvIGV4dGVybmFsIGJ1ZmZlcgotICovCi0KLSNkZWZpbmUgQVVEUkVDX1VQX1BBQ0tFVF9SRUFEWV9NU0cgMHgwMDAyCi0jZGVmaW5lIEFVRFJFQ19VUF9QQUNLRVRfUkVBRFlfTVNHX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRyZWNfdXBfcGt0X3JlYWR5X21zZykKLQotc3RydWN0ICBhdWRyZWNfdXBfcGt0X3JlYWR5X21zZyB7Ci0JdW5zaWduZWQgc2hvcnQgYXVkcmVjX3BhY2tldF93cml0ZV9jbnRfbHN3OwotCXVuc2lnbmVkIHNob3J0IGF1ZHJlY19wYWNrZXRfd3JpdGVfY250X21zdzsKLQl1bnNpZ25lZCBzaG9ydCBhdWRyZWNfdXBfcHJldl9yZWFkX2NudF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQgYXVkcmVjX3VwX3ByZXZfcmVhZF9jbnRfbXN3OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIE1lc3NhZ2UgaW5kaWNhdGVzIGFyZWNtZW0gY2ZnIGRvbmUKLSAqLwotI2RlZmluZSBBVURSRUNfQ01EX01FTV9DRkdfRE9ORV9NU0cgMHgwMDAzCi0KLS8qIGJ1ZmZlciBjb25udGVudHMgYXJlIG5pbGwgb25seSBtZXNzYWdlIGlkIGlzIHJlcXVpcmVkICovCi0KLS8qCi0gKiBNZXNzYWdlIHRvIGluZGljYXRlIHBjbSBidWZmZXIgY29uZmlndXJlZAotICovCi0KLSNkZWZpbmUgQVVEUkVDX0NNRF9QQ01fQ0ZHX0FSTV9UT19FTkNfRE9ORV9NU0cgMHgwMDA0Ci0jZGVmaW5lIEFVRFJFQ19DTURfUENNX0NGR19BUk1fVE9fRU5DX0RPTkVfTVNHX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRyZWNfY21kX3BjbV9jZmdfYXJtX3RvX2VuY19tc2cpCi0KLXN0cnVjdCAgYXVkcmVjX2NtZF9wY21fY2ZnX2FybV90b19lbmNfbXNnIHsKLQl1bnNpZ25lZCBzaG9ydCBjb25maWd1cmF0aW9uOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIE1lc3NhZ2UgdG8gaW5kaWNhdGUgZW5jb2RlZCBwYWNrZXQgaXMgZGVsaXZlcmVkIHRvIGV4dGVybmFsIGJ1ZmZlciBpbiBGVFJUCi0gKi8KLQotI2RlZmluZSBBVURSRUNfVVBfTlRfUEFDS0VUX1JFQURZX01TRyAweDAwMDUKLSNkZWZpbmUgQVVEUkVDX1VQX05UX1BBQ0tFVF9SRUFEWV9NU0dfTEVOCVwKLQlzaXplb2Yoc3RydWN0IGF1ZHJlY191cF9udF9wYWNrZXRfcmVhZHlfbXNnKQotCi1zdHJ1Y3QgIGF1ZHJlY191cF9udF9wYWNrZXRfcmVhZHlfbXNnIHsKLQl1bnNpZ25lZCBzaG9ydCBhdWRyZWNfcGFja2V0d3JpdGVfY250X2xzdzsKLQl1bnNpZ25lZCBzaG9ydCBhdWRyZWNfcGFja2V0d3JpdGVfY250X21zdzsKLQl1bnNpZ25lZCBzaG9ydCBhdWRyZWNfdXBwcmV2X3JlYWRjb3VudF9sc3c7Ci0JdW5zaWduZWQgc2hvcnQgYXVkcmVjX3VwcHJldl9yZWFkY291bnRfbXN3OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyoKLSAqIE1lc3NhZ2UgdG8gaW5kaWNhdGUgcGNtIGJ1ZmZlciBpcyBjb25zdW1lZAotICovCi0KLSNkZWZpbmUgQVVEUkVDX0NNRF9QQ01fQlVGRkVSX1BUUl9VUERBVEVfQVJNX1RPX0VOQ19NU0cgMHgwMDA2Ci0jZGVmaW5lIEFVRFJFQ19DTURfUENNX0JVRkZFUl9QVFJfVVBEQVRFX0FSTV9UT19FTkNfTVNHX0xFTglcCi0Jc2l6ZW9mKHN0cnVjdCBhdWRyZWNfY21kX3BjbV9idWZmZXJfcHRyX3VwZGF0ZV9hcm1fdG9fZW5jX21zZykKLQotc3RydWN0ICBhdWRyZWNfY21kX3BjbV9idWZmZXJfcHRyX3VwZGF0ZV9hcm1fdG9fZW5jX21zZyB7Ci0JdW5zaWduZWQgc2hvcnQgYnVmZmVyX3JlYWRjbnRfbXN3OwotCXVuc2lnbmVkIHNob3J0IGJ1ZmZlcl9yZWFkY250X2xzdzsKLQl1bnNpZ25lZCBzaG9ydCBudW1iZXJfb2ZfYnVmZmVyczsKLQl1bnNpZ25lZCBzaG9ydCBidWZmZXJfYWRkcmVzc19sZW5ndGhbXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qCi0gKiBNZXNzYWdlIHRvIGluZGljYXRlIGZsdXNoIGFja25vd2xlZGdlbWVudAotICovCi0KLSNkZWZpbmUgQVVEUkVDX0NNRF9GTFVTSF9ET05FX01TRyAweDAwMDcKLQotLyoKLSAqIE1lc3NhZ2UgdG8gaW5kaWNhdGUgRW5kIG9mIFN0cmVhbSBhY2tub3dsZWRnZW1lbnQKLSAqLwotCi0jZGVmaW5lIEFVRFJFQ19DTURfRU9TX0FDS19NU0cgMHgwMDA4Ci0KLSNlbmRpZiAvKiBRRFNQNUFVRFJFQ01TR19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9zbmRkZXZfZWNvZGVjLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9zbmRkZXZfZWNvZGVjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlN2Q5NmMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvc25kZGV2X2Vjb2RlYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2lmbmRlZiBfX01BQ0hfUURTUDVfVjJfU05EREVWX0VDT0RFQ19ICi0jZGVmaW5lIF9fTUFDSF9RRFNQNV9WMl9TTkRERVZfRUNPREVDX0gKLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGVmLmg+Ci0KLXN0cnVjdCBzbmRkZXZfZWNvZGVjX2RhdGEgewotCXUzMiBjYXBhYmlsaXR5OyAvKiBSWCBvciBUWCAqLwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JdTMyIGNvcHBfaWQ7IC8qIGF1ZHBwIHJvdXRpbmcgKi8KLQl1MzIgYWNkYl9pZDsgLyogQXVkaW8gQ2FsIHB1cnBvc2UgKi8KLQl1OCBjaGFubmVsX21vZGU7Ci0JdTMyIGNvbmZfcGNtX2N0bF92YWw7Ci0JdTMyIGNvbmZfYXV4X2NvZGVjX2ludGY7Ci0JdTMyIGNvbmZfZGF0YV9mb3JtYXRfcGFkZGluZ192YWw7Ci0JczMyIG1heF92b2ljZV9yeF92b2xbVk9DX1JYX1ZPTF9BUlJBWV9OVU1dOyAvKiBbMF06TkIsIFsxXTpXQiAqLwotCXMzMiBtaW5fdm9pY2Vfcnhfdm9sW1ZPQ19SWF9WT0xfQVJSQVlfTlVNXTsKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL3NuZGRldl9pY29kZWMuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL3NuZGRldl9pY29kZWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4MTFhMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9zbmRkZXZfaWNvZGVjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpZm5kZWYgX19NQUNIX1FEU1A1X1YyX1NORERFVl9JQ09ERUNfSAotI2RlZmluZSBfX01BQ0hfUURTUDVfVjJfU05EREVWX0lDT0RFQ19ICi0jaW5jbHVkZSA8bGludXgvbWZkL21zbS1hZGllLWNvZGVjLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2RlZi5oPgotI2luY2x1ZGUgPG1hY2gvcG1pYy5oPgotCi1zdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhIHsKLQl1MzIgY2FwYWJpbGl0eTsgLyogUlggb3IgVFggKi8KLQljb25zdCBjaGFyICpuYW1lOwotCXUzMiBjb3BwX2lkOyAvKiBhdWRwcCByb3V0aW5nICovCi0JdTMyIGFjZGJfaWQ7IC8qIEF1ZGlvIENhbCBwdXJwb3NlICovCi0JLyogQWRpZSBwcm9maWxlICovCi0Jc3RydWN0IGFkaWVfY29kZWNfZGV2X3Byb2ZpbGUgKnByb2ZpbGU7Ci0JLyogQWZlIHNldHRpbmcgKi8KLQl1OCBjaGFubmVsX21vZGU7Ci0JZW51bSBoc2VkX2NvbnRyb2xsZXIgKnBtY3RsX2lkOyAvKiB0eCBvbmx5IGVuYWJsZSBtaWMgYmlhcyAqLwotCXUzMiBwbWN0bF9pZF9zejsKLQl1MzIgZGVmYXVsdF9zYW1wbGVfcmF0ZTsKLQl2b2lkICgqcGFtcF9vbikgKHZvaWQpOwotCXZvaWQgKCpwYW1wX29mZikgKHZvaWQpOwotCXZvaWQgKCp2b2x0YWdlX29uKSAodm9pZCk7Ci0Jdm9pZCAoKnZvbHRhZ2Vfb2ZmKSAodm9pZCk7Ci0JczMyIG1heF92b2ljZV9yeF92b2xbVk9DX1JYX1ZPTF9BUlJBWV9OVU1dOyAvKiBbMF06IE5CLFsxXTogV0IgKi8KLQlzMzIgbWluX3ZvaWNlX3J4X3ZvbFtWT0NfUlhfVk9MX0FSUkFZX05VTV07Ci0JdTMyIGRldl92b2xfdHlwZTsKLQl1MzIgcHJvcGVydHk7IC8qdmFyaWFibGUgdXNlZCB0byBob2xkIHRoZSBwcm9wZXJ0aWVzCi0JCQkJaW50ZXJuYWwgdG8gdGhlIGRldmljZSovCi19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9zbmRkZXZfbWkycy5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvc25kZGV2X21pMnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThmNTIzNC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9zbmRkZXZfbWkycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2lmbmRlZiBfX01BQ0hfUURTUDVfVjJfU05EREVWX01JMlNfSAotI2RlZmluZSBfX01BQ0hfUURTUDVfVjJfU05EREVWX01JMlNfSAotCi1zdHJ1Y3Qgc25kZGV2X21pMnNfZGF0YSB7Ci0JdTMyIGNhcGFiaWxpdHk7IC8qIFJYIG9yIFRYICovCi0JY29uc3QgY2hhciAqbmFtZTsKLQl1MzIgY29wcF9pZDsgLyogYXVkcHAgcm91dGluZyAqLwotCXUzMiBhY2RiX2lkOyAvKiBBdWRpbyBDYWwgcHVycG9zZSAqLwotCXU4IGNoYW5uZWxfbW9kZTsKLQl1OCBzZF9saW5lczsKLQl2b2lkICgqcm91dGUpICh2b2lkKTsKLQl2b2lkICgqZGVyb3V0ZSkgKHZvaWQpOwotCXUzMiBkZWZhdWx0X3NhbXBsZV9yYXRlOwotfTsKLQotaW50IG1pMnNfY29uZmlnX2Nsa19ncGlvKHZvaWQpOwotCi1pbnQgbWkyc19jb25maWdfZGF0YV9ncGlvKHUzMiBkaXJlY3Rpb24sIHU4IHNkX2xpbmVfbWFzayk7Ci0KLWludCBtaTJzX3VuY29uZmlnX2Nsa19ncGlvKHZvaWQpOwotCi1pbnQgbWkyc191bmNvbmZpZ19kYXRhX2dwaW8odTMyIGRpcmVjdGlvbiwgdTggc2RfbGluZV9tYXNrKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9zbmRkZXZfdmlydHVhbC5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL3Fkc3A1djIvc25kZGV2X3ZpcnR1YWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM5ZTk4MS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi9zbmRkZXZfdmlydHVhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2lmbmRlZiBfX01BQ0hfUURTUDVfVjJfU05EREVWX1ZJUlRVQUxfSAotI2RlZmluZSBfX01BQ0hfUURTUDVfVjJfU05EREVWX1ZJUlRVQUxfSAotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19kZWYuaD4KLQotc3RydWN0IHNuZGRldl92aXJ0dWFsX2RhdGEgewotCXUzMiBjYXBhYmlsaXR5OyAvKiBSWCBvciBUWCAqLwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JdTMyIGNvcHBfaWQ7IC8qIGF1ZHBwIHJvdXRpbmcgKi8KLQl1MzIgYWNkYl9pZDsgLyogQXVkaW8gQ2FsIHB1cnBvc2UgKi8KLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL3ZvaWNlLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvcWRzcDV2Mi92b2ljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2Y5YmFkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9xZHNwNXYyL3ZvaWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaWZuZGVmIF9NQUNIX1FEU1A1X1YyX1ZPSUNFX0gKLSNkZWZpbmUgX01BQ0hfUURTUDVfVjJfVk9JQ0VfSAotCi0jZGVmaW5lIFZPSUNFX0RBTFJQQ19ERVZJQ0VJRCAweDAyMDAwMDc1Ci0jZGVmaW5lIFZPSUNFX0RBTFJQQ19QT1JUX05BTUUgIkRBTDAwIgotI2RlZmluZSBWT0lDRV9EQUxSUENfQ1BVIDAKLQotCi0vKiBDb21tYW5kcyBzZW50IHRvIE1vZGVtICovCi0jZGVmaW5lIENNRF9WT0lDRV9JTklUICAgICAgICAgICAgICAgICAgMHgxCi0jZGVmaW5lIENNRF9BQ1FVSVJFX0RPTkUgICAgICAgICAgICAgICAgMHgyCi0jZGVmaW5lIENNRF9SRUxFQVNFX0RPTkUgICAgICAgICAgICAgICAgMHgzCi0jZGVmaW5lIENNRF9ERVZJQ0VfSU5GTyAgICAgICAgICAgICAgICAgMHg0Ci0jZGVmaW5lIENNRF9ERVZJQ0VfQ0hBTkdFICAgICAgICAgICAgICAgMHg2Ci0KLS8qIEVWRU5UUyByZWNlaXZlZCBmcm9tIE1PREVNICovCi0jZGVmaW5lIEVWRU5UX0FDUVVJUkVfU1RBUlQgICAgICAgICAgICAgMHg1MQotI2RlZmluZSBFVkVOVF9SRUxFQVNFX1NUQVJUICAgICAgICAgICAgIDB4NTIKLSNkZWZpbmUgRVZFTlRfQ0hBTkdFX1NUQVJUICAgICAgICAgICAgICAweDU0Ci0jZGVmaW5lIEVWRU5UX05FVFdPUktfUkVDT05GSUcgICAgICAgICAgMHg1MwotCi0vKiB2b2ljZSBzdGF0ZSAqLwotZW51bSB7Ci0JVk9JQ0VfSU5JVCA9IDAsCi0JVk9JQ0VfQUNRVUlSRSwKLQlWT0lDRV9DSEFOR0UsCi0JVk9JQ0VfUkVMRUFTRSwKLX07Ci0KLWVudW0gewotCU5FVFdPUktfQ0RNQSA9IDAsCi0JTkVUV09SS19HU00sCi0JTkVUV09SS19XQ0RNQSwKLQlORVRXT1JLX1dDRE1BX1dCLAotfTsKLQotZW51bSB7Ci0JVk9JQ0VfREFMUlBDX0NNRCA9IERBTERFVklDRV9GSVJTVF9ERVZJQ0VfQVBJX0lEWAotfTsKLQotLyogZGV2aWNlIHN0YXRlICovCi1lbnVtIHsKLQlERVZfSU5JVCA9IDAsCi0JREVWX1JFQURZLAotCURFVl9DSEFOR0UsCi0JREVWX0NPTkNVUiwKLQlERVZfUkVMX0RPTkUsCi19OwotCi0vKiBWb2ljZSBFdmVudCAqLwotZW51bXsKLQlWT0lDRV9SRUxFQVNFX1NUQVJUID0gMSwKLQlWT0lDRV9DSEFOR0VfU1RBUlQsCi0JVk9JQ0VfQUNRVUlSRV9TVEFSVCwKLQlWT0lDRV9ORVRXT1JLX1JFQ09ORklHLAotfTsKLQotLyogRGV2aWNlIEV2ZW50ICovCi0jZGVmaW5lIERFVl9DSEFOR0VfUkVBRFkgICAgICAgICAgICAgICAgMHgxCi0KLSNkZWZpbmUgVk9JQ0VfQ0FMTF9TVEFSVAkweDEKLSNkZWZpbmUgVk9JQ0VfQ0FMTF9FTkQJCTAKLQotI2RlZmluZSBWT0lDRV9ERVZfRU5BQkxFRAkweDEKLSNkZWZpbmUgVk9JQ0VfREVWX0RJU0FCTEVECTAKLQotc3RydWN0IHZvaWNlX2hlYWRlciB7Ci0JdWludDMyX3QgaWQ7Ci0JdWludDMyX3QgZGF0YV9sZW47Ci19OwotCi1zdHJ1Y3Qgdm9pY2VfaW5pdCB7Ci0Jc3RydWN0IHZvaWNlX2hlYWRlciBoZHI7Ci0Jdm9pZCAqY2JfaGFuZGxlOwotfTsKLQotCi0vKiBEZXZpY2UgaW5mb3JtYXRpb24gcGF5bG9hZCBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCB2b2ljZV9kZXZpY2UgewotCXN0cnVjdCB2b2ljZV9oZWFkZXIgaGRyOwotCXVpbnQzMl90IHJ4X2RldmljZTsKLQl1aW50MzJfdCB0eF9kZXZpY2U7Ci0JdWludDMyX3Qgcnhfdm9sdW1lOwotCXVpbnQzMl90IHJ4X211dGU7Ci0JdWludDMyX3QgdHhfbXV0ZTsKLQl1aW50MzJfdCByeF9zYW1wbGU7Ci0JdWludDMyX3QgdHhfc2FtcGxlOwotfTsKLQotLypWb2ljZSBjb21tYW5kIHN0cnVjdHVyZSovCi1zdHJ1Y3Qgdm9pY2VfbmV0d29yayB7Ci0Jc3RydWN0IHZvaWNlX2hlYWRlciBoZHI7Ci0JdWludDMyX3QgbmV0d29ya19pbmZvOwotfTsKLQotc3RydWN0IGRldmljZV9kYXRhIHsKLQl1aW50MzJfdCBkZXZfYWNkYl9pZDsKLQl1aW50MzJfdCB2b2x1bWU7IC8qIGluIHBlcmNlbnRhZ2UgKi8KLQl1aW50MzJfdCBtdXRlOwotCXVpbnQzMl90IHNhbXBsZTsKLQl1aW50MzJfdCBlbmFibGVkOwotCXVpbnQzMl90IGRldl9pZDsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vb2NtZW0uYyBiL2FyY2gvYXJtL21hY2gtbXNtL29jbWVtLmMKaW5kZXggZDMxZjNjNC4uOTllNTRiNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vb2NtZW0uYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9vY21lbS5jCkBAIC04MzYsNyArODM2LDcgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCWlmIChvY21lbV9kZWJ1Z2ZzX2luaXQocGRldikpCi0JCXJldHVybiAtRUJVU1k7CisJCWRldl9lcnIoZGV2LCAib2NtZW06IE5vIGRlYnVnZnMgbm9kZSBhdmFpbGFibGVcbiIpOwogCiAJaWYgKG9jbWVtX2NvcmVfaW5pdChwZGV2KSkKIAkJcmV0dXJuIC1FQlVTWTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3BtLTh4NjAuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3BtLTh4NjAuYwppbmRleCAwMGIwYjNiLi5hZjIxNTg0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9wbS04eDYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vcG0tOHg2MC5jCkBAIC02NTEsOCArNjUxLDExIEBACiB7CiAJaW50NjRfdCB0aW1lID0gMDsKIAotCWlmIChtc21fcG1fdXNlX3N5bmNfdGltZXIpCi0JCXJldHVybiBzY2hlZF9jbG9jaygpOworCWlmIChtc21fcG1fdXNlX3N5bmNfdGltZXIpIHsKKwkJc3RydWN0IHRpbWVzcGVjIHRzOworCQlnZXRuc3RpbWVvZmRheSgmdHMpOworCQlyZXR1cm4gdGltZXNwZWNfdG9fbnMoJnRzKTsKKwl9CiAKIAl0aW1lID0gbXNtX3RpbWVyX2dldF9zY2xrX3RpbWUocGVyaW9kKTsKIAlpZiAoIXRpbWUpCkBAIC02NjMsOCArNjY2LDEyIEBACiAKIHN0YXRpYyBpbnQ2NF90IG1zbV9wbV90aW1lcl9leGl0X3N1c3BlbmQoaW50NjRfdCB0aW1lLCBpbnQ2NF90IHBlcmlvZCkKIHsKLQlpZiAobXNtX3BtX3VzZV9zeW5jX3RpbWVyKQotCQlyZXR1cm4gc2NoZWRfY2xvY2soKSAtIHRpbWU7CisJaWYgKG1zbV9wbV91c2Vfc3luY190aW1lcikgeworCQlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJCWdldG5zdGltZW9mZGF5KCZ0cyk7CisKKwkJcmV0dXJuIHRpbWVzcGVjX3RvX25zKCZ0cykgLSB0aW1lOworCX0KIAogCWlmICh0aW1lICE9IDApIHsKIAkJaW50NjRfdCBlbmRfdGltZSA9IG1zbV90aW1lcl9nZXRfc2Nsa190aW1lKE5VTEwpOwpAQCAtMTA0OCwxMiArMTA1NSwxNCBAQAogfQogRVhQT1JUX1NZTUJPTChtc21fcG1fZW5hYmxlX3JldGVudGlvbik7CiAKK3N0YXRpYyBpbnQ2NF90IHN1c3BlbmRfdGltZSwgc3VzcGVuZF9wZXJpb2Q7CitzdGF0aWMgaW50IGNvbGxhcHNlZDsKK3N0YXRpYyBpbnQgc3VzcGVuZF9wb3dlcl9jb2xsYXBzZWQ7CisKIHN0YXRpYyBpbnQgbXNtX3BtX2VudGVyKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKIHsKIAlib29sIGFsbG93W01TTV9QTV9TTEVFUF9NT0RFX05SXTsKIAlpbnQgaTsKLQlpbnQ2NF90IHBlcmlvZCA9IDA7Ci0JaW50NjRfdCB0aW1lID0gbXNtX3BtX3RpbWVyX2VudGVyX3N1c3BlbmQoJnBlcmlvZCk7CiAJc3RydWN0IG1zbV9wbV90aW1lX3BhcmFtcyB0aW1lX3BhcmFtOwogCiAJdGltZV9wYXJhbS5sYXRlbmN5X3VzID0gLTE7CkBAIC0xMDgxLDcgKzEwOTAsNiBAQAogCQlpbnQgcmV0ID0gLUVOT0RFVjsKIAkJdWludDMyX3QgcG93ZXI7CiAJCXVpbnQzMl90IG1zbV9wbV9tYXhfc2xlZXBfdGltZSA9IDA7Ci0JCWludCBjb2xsYXBzZWQgPSAwOwogCiAJCWlmIChNU01fUE1fREVCVUdfU1VTUEVORCAmIG1zbV9wbV9kZWJ1Z19tYXNrKQogCQkJcHJfaW5mbygiJXM6IHBvd2VyIGNvbGxhcHNlXG4iLCBfX2Z1bmNfXyk7CkBAIC0xMTE1LDExICsxMTIzLDcgQEAKIAkJCXByX2VycigiJXM6IGNhbm5vdCBmaW5kIHRoZSBsb3dlc3QgcG93ZXIgbGltaXRcbiIsCiAJCQkJX19mdW5jX18pOwogCQl9Ci0JCXRpbWUgPSBtc21fcG1fdGltZXJfZXhpdF9zdXNwZW5kKHRpbWUsIHBlcmlvZCk7Ci0JCWlmIChjb2xsYXBzZWQpCi0JCQltc21fcG1fYWRkX3N0YXQoTVNNX1BNX1NUQVRfU1VTUEVORCwgdGltZSk7Ci0JCWVsc2UKLQkJCW1zbV9wbV9hZGRfc3RhdChNU01fUE1fU1RBVF9GQUlMRURfU1VTUEVORCwgdGltZSk7CisJCXN1c3BlbmRfcG93ZXJfY29sbGFwc2VkID0gdHJ1ZTsKIAl9IGVsc2UgaWYgKGFsbG93W01TTV9QTV9TTEVFUF9NT0RFX1BPV0VSX0NPTExBUFNFX1NUQU5EQUxPTkVdKSB7CiAJCWlmIChNU01fUE1fREVCVUdfU1VTUEVORCAmIG1zbV9wbV9kZWJ1Z19tYXNrKQogCQkJcHJfaW5mbygiJXM6IHN0YW5kYWxvbmUgcG93ZXIgY29sbGFwc2VcbiIsIF9fZnVuY19fKTsKQEAgLTExNDksNiArMTE1Myw3IEBACiAKIHN0YXRpYyBpbnQgbXNtX3N1c3BlbmRfcHJlcGFyZSh2b2lkKQogeworCXN1c3BlbmRfdGltZSA9IG1zbV9wbV90aW1lcl9lbnRlcl9zdXNwZW5kKCZzdXNwZW5kX3BlcmlvZCk7CiAJbXNtX21wbV9zdXNwZW5kX3ByZXBhcmUoKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTExNTYsNiArMTE2MSwxNiBAQAogc3RhdGljIHZvaWQgbXNtX3N1c3BlbmRfd2FrZSh2b2lkKQogewogCW1zbV9tcG1fc3VzcGVuZF93YWtlKCk7CisJaWYgKHN1c3BlbmRfcG93ZXJfY29sbGFwc2VkKSB7CisJCXN1c3BlbmRfdGltZSA9IG1zbV9wbV90aW1lcl9leGl0X3N1c3BlbmQoc3VzcGVuZF90aW1lLAorCQkJCXN1c3BlbmRfcGVyaW9kKTsKKwkJaWYgKGNvbGxhcHNlZCkKKwkJCW1zbV9wbV9hZGRfc3RhdChNU01fUE1fU1RBVF9TVVNQRU5ELCBzdXNwZW5kX3RpbWUpOworCQllbHNlCisJCQltc21fcG1fYWRkX3N0YXQoTVNNX1BNX1NUQVRfRkFJTEVEX1NVU1BFTkQsCisJCQkJCXN1c3BlbmRfdGltZSk7CisJCXN1c3BlbmRfcG93ZXJfY29sbGFwc2VkID0gZmFsc2U7CisJfQogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIG1zbV9wbV9vcHMgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGZlMDUyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotb2JqLXkgKz0gYWRzcC5vIGFkc3BfZHJpdmVyLm8gYWRzcF9pbmZvLm8gYWRzcF9ybS5vIGRzcF9kZWJ1Zy5vIGFkc3BfZGVidWcubwotb2JqLXkgKz0gYWRzcF92aWRlb192ZXJpZnlfY21kLm8KLW9iai15ICs9IGFkc3BfdmlkZW9lbmNfdmVyaWZ5X2NtZC5vCi1vYmoteSArPSBhZHNwX2pwZWdfdmVyaWZ5X2NtZC5vIGFkc3BfanBlZ19wYXRjaF9ldmVudC5vCi1vYmoteSArPSBhZHNwX3ZmZV92ZXJpZnlfY21kLm8gYWRzcF92ZmVfcGF0Y2hfZXZlbnQubwotb2JqLXkgKz0gYWRzcF9scG1fdmVyaWZ5X2NtZC5vCi1pZmRlZiBDT05GSUdfTVNNN1gyN0FfQVVESU8KLW9iai15ICs9IGF1ZGlvX3BjbV9pbi5vCi1vYmotJChDT05GSUdfREVCVUdfRlMpICs9IGF1ZGlvX3ZvaWNlX2xiLm8KLWVsc2UKLW9iai15ICs9IGF1ZGlvX2luLm8gc25kX3BjbV9jbGllbnQubwotZW5kaWYKLW9iai0kKENPTkZJR19NU003WDI3QV9BVURJTykgKz0gYXVkaW9fYWFjX2luLm8gYXVkaW9fZXZyY19pbi5vIGF1ZGlvX3FjZWxwX2luLm8KLW9iai15ICs9IGF1ZGlvX291dC5vIGF1ZGlvX21wMy5vIGF1ZG1nci5vIGF1ZHBwLm8gYXVkcmVjLm8gYXVkcHJlcHJvYy5vCi1vYmoteSArPSBhdWRpb19ldnJjLm8gYXVkaW9fcWNlbHAubyBhdWRpb19hbXJuYi5vIGF1ZGlvX2FhYy5vIGF1ZGlvX2Ftcm5iX2luLm8KLW9iai15ICs9IGF1ZGlvX3dtYS5vIGF1ZGlvX3ZvaWNlbWVtby5vIGF1ZGlvX3BjbS5vIGF1ZGlvX2FtcndiLm8gYXVkaW9fd21hcHJvLm8KLW9iai15ICs9IHNuZC5vIHNuZF9jYWQubyBzbmRfYWRpZS5vIGF1ZGlvX2FjZGIubwotb2JqLSQoQ09ORklHX0FSQ0hfTVNNN1gyN0EpICs9IGF1ZGlvX2ZtLm8KLW9iai0kKENPTkZJR19BUkNIX01TTTdYMjdBKSArPSBhdWRpb19tdnMubwotb2JqLSQoQ09ORklHX0FSQ0hfTVNNN1gyN0EpICs9IGF1ZGlvX2xwYS5vIGF1ZGlvX2FjMy5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1M2RlM2QuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUwOSArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwLmMKLSAqCi0gKiBSZWdpc3Rlci9JbnRlcnJ1cHQgYWNjZXNzIGZvciB1c2Vyc3BhY2UgYURTUCBsaWJyYXJ5LgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEF1dGhvcjogSWxpeWFuIE1hbGNoZXYgPGlibUBhbmRyb2lkLmNvbT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0vKiBUT0RPOgotICogLSBtb3ZlIHNoYXJlYWJsZSBycGMgY29kZSBvdXRzaWRlIG9mIGFkc3AuYwotICogLSBnZW5lcmFsIHNvbHV0aW9uIGZvciB2aXJ0LT5waHlzIHBhdGNodXAKLSAqIC0gcXVldWUgSURzIHNob3VsZCBiZSByZWxhdGl2ZSB0byBtb2R1bGVzCi0gKiAtIGRpc2FsbG93IGFjY2VzcyB0byBub24tYXNzb2NpYXRlZCBxdWV1ZXMKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVudHJ5X2Fkc3A7Ci1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVudHJ5X3dkYXRhOwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlbnRyeV9yZGF0YTsKLXN0YXRpYyBpbnQgd2R1bXAsIHJkdW1wOwotI2VuZGlmIC8qIENPTkZJR19ERUJVR19GUyAqLwotc3RhdGljIHN0cnVjdCB3YWtlX2xvY2sgYWRzcF93YWtlX2xvY2s7Ci1zdGF0aWMgaW5saW5lIHZvaWQgcHJldmVudF9zdXNwZW5kKHZvaWQpCi17Ci0Jd2FrZV9sb2NrKCZhZHNwX3dha2VfbG9jayk7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgYWxsb3dfc3VzcGVuZCh2b2lkKQotewotCXdha2VfdW5sb2NrKCZhZHNwX3dha2VfbG9jayk7Ci19Ci0KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX2lvbWFwLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotI2luY2x1ZGUgImFkc3AuaCIKLQotc3RhdGljIHN0cnVjdCBhZHNwX2luZm8gYWRzcF9pbmZvOwotc3RhdGljIHN0cnVjdCBtc21fcnBjX2VuZHBvaW50ICpycGNfY2Jfc2VydmVyX2NsaWVudDsKLXN0YXRpYyBzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICphZHNwX21vZHVsZXM7Ci1zdGF0aWMgaW50IGFkc3Bfb3Blbl9jb3VudDsKLQotc3RhdGljIHVpbnQzMl90IHJwY19hZHNwX3J0b3NfYXRvbV9wcm9nOwotc3RhdGljIHVpbnQzMl90IHJwY19hZHNwX3J0b3NfYXRvbV92ZXJzOwotc3RhdGljIHVpbnQzMl90IHJwY19hZHNwX3J0b3NfYXRvbV92ZXJzX2NvbXA7Ci1zdGF0aWMgdWludDMyX3QgcnBjX2Fkc3BfcnRvc19tdG9hX3Byb2c7Ci1zdGF0aWMgdWludDMyX3QgcnBjX2Fkc3BfcnRvc19tdG9hX3ZlcnM7Ci1zdGF0aWMgdWludDMyX3QgcnBjX2Fkc3BfcnRvc19tdG9hX3ZlcnNfY29tcDsKLXN0YXRpYyBERUZJTkVfTVVURVgoYWRzcF9vcGVuX2xvY2spOwotCi1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm1zbV9hZHNwX3Byb2JlX3dvcmtfcXVldWU7Ci1zdGF0aWMgdm9pZCBhZHNwX3Byb2JlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLXN0YXRpYyBERUNMQVJFX1dPUksobXNtX2Fkc3BfcHJvYmVfd29yaywgYWRzcF9wcm9iZV93b3JrKTsKLQotLyogcHJvdGVjdCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgQURTUCBjb21tYW5kL21lc3NhZ2UgcXVldWUgKi8KLXN0YXRpYyBzcGlubG9ja190IGFkc3BfY21kX2xvY2s7Ci1zdGF0aWMgc3BpbmxvY2tfdCBhZHNwX3dyaXRlX2xvY2s7Ci0KLXN0YXRpYyB1aW50MzJfdCBjdXJyZW50X2ltYWdlID0gLTE7Ci0KLXZvaWQgYWRzcF9zZXRfaW1hZ2Uoc3RydWN0IGFkc3BfaW5mbyAqaW5mbywgdWludDMyX3QgaW1hZ2UpCi17Ci0JY3VycmVudF9pbWFnZSA9IGltYWdlOwotfQotCi0vKgotICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1vZHVsZV9pZCBpcyBhdmFpbGFibGUgaW4gdGhlCi0gKiBtb2R1bGVfZW50cmllcyB0YWJsZS5JZiBtb2R1bGVfaWQgaXMgYXZhaWxhYmxlIHJldHVybnMgYDBgLgotICogSWYgbW9kdWxlX2lkIGlzIG5vdCBhdmFpbGFibGUgcmV0dXJucyBgLUVOWElPYC4KLSAqLwotc3RhdGljIGludDMyX3QgYWRzcF92YWxpZGF0ZV9tb2R1bGUodWludDMyX3QgbW9kdWxlX2lkKQotewotCXVpbnQzMl90CSpwdHI7Ci0JdWludDMyX3QJbW9kdWxlX2luZGV4OwotCXVpbnQzMl90CW51bV9tb2RfZW50cmllczsKLQotCXB0ciA9IGFkc3BfaW5mby5pbml0X2luZm9fcHRyLT5tb2R1bGVfZW50cmllczsKLQludW1fbW9kX2VudHJpZXMgPSBhZHNwX2luZm8uaW5pdF9pbmZvX3B0ci0+bW9kdWxlX3RhYmxlX3NpemU7Ci0KLQlmb3IgKG1vZHVsZV9pbmRleCA9IDA7IG1vZHVsZV9pbmRleCA8IG51bV9tb2RfZW50cmllczsgbW9kdWxlX2luZGV4KyspCi0JCWlmIChtb2R1bGVfaWQgPT0gcHRyW21vZHVsZV9pbmRleF0pCi0JCQlyZXR1cm4gMDsKLQotCXJldHVybiAtRU5YSU87Ci19Ci0KLXN0YXRpYyBpbnQzMl90IGFkc3BfdmFsaWRhdGVfcXVldWUodWludDMyX3QgbW9kX2lkLCB1bnNpZ25lZCBxX2lkeCwKLQkJCQkJCQl1aW50MzJfdCBzaXplKQotewotCWludDMyX3QgaTsKLQlzdHJ1Y3QgYWRzcF9ydG9zX21wX210b2FfaW5pdF9pbmZvX3R5cGUJKnNwdHI7Ci0KLQlzcHRyID0gYWRzcF9pbmZvLmluaXRfaW5mb19wdHI7Ci0JZm9yIChpID0gMDsgaSA8IHNwdHItPm1vZF90b19xX2VudHJpZXM7IGkrKykKLQkJaWYgKG1vZF9pZCA9PSBzcHRyLT5tb2RfdG9fcV90YmxbaV0ubW9kdWxlKQotCQkJaWYgKHFfaWR4ID09IHNwdHItPm1vZF90b19xX3RibFtpXS5xX3R5cGUpIHsKLQkJCQlpZiAoc2l6ZSA8PSBzcHRyLT5tb2RfdG9fcV90YmxbaV0ucV9tYXhfbGVuKQotCQkJCQlyZXR1cm4gMDsKLQkJCQlNTV9FUlIoInFfaWR4OiAlZCBpcyBub3QgYSB2YWxpZCBxdWV1ZSBcCi0JCQkJCWZvciBtb2R1bGUgJXhcbiIsIHFfaWR4LCBtb2RfaWQpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCU1NX0VSUigiY21kX2J1ZiBzaXplIGlzIG1vcmUgdGhhbiBhbGxvd2VkIHNpemVcbiIpOwotCXJldHVybiAtRUlOVkFMOwotfQotCi11aW50MzJfdCBhZHNwX2dldF9tb2R1bGUoc3RydWN0IGFkc3BfaW5mbyAqaW5mbywgdWludDMyX3QgdGFzaykKLXsKLQlyZXR1cm4gaW5mby0+dGFza190b19tb2R1bGVbY3VycmVudF9pbWFnZV1bdGFza107Ci19Ci0KLXVpbnQzMl90IGFkc3BfZ2V0X3F1ZXVlX29mZnNldChzdHJ1Y3QgYWRzcF9pbmZvICppbmZvLCB1aW50MzJfdCBxdWV1ZV9pZCkKLXsKLQlyZXR1cm4gaW5mby0+cXVldWVfb2Zmc2V0W2N1cnJlbnRfaW1hZ2VdW3F1ZXVlX2lkXTsKLX0KLQotc3RhdGljIGludCBycGNfYWRzcF9ydG9zX2FwcF90b19tb2RlbSh1aW50MzJfdCBjbWQsIHVpbnQzMl90IG1vZHVsZSwKLQkJCQkgICAgICBzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICphZHNwX21vZHVsZSkKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IHJwY19hZHNwX3J0b3NfYXBwX3RvX21vZGVtX2FyZ3NfdCBycGNfcmVxOwotCXN0cnVjdCBycGNfcmVwbHlfaGRyIHJwY19yc3A7Ci0KLQlycGNfcmVxLmdvdGl0ID0gY3B1X3RvX2JlMzIoMSk7Ci0JcnBjX3JlcS5jbWQgPSBjcHVfdG9fYmUzMihjbWQpOwotCXJwY19yZXEucHJvY19pZCA9IGNwdV90b19iZTMyKFJQQ19BRFNQX1JUT1NfUFJPQ19BUFBTKTsKLQlycGNfcmVxLm1vZHVsZSA9IGNwdV90b19iZTMyKG1vZHVsZSk7Ci0JcmMgPSBtc21fcnBjX2NhbGxfcmVwbHkoYWRzcF9tb2R1bGUtPnJwY19jbGllbnQsCi0JCQkJCVJQQ19BRFNQX1JUT1NfQVBQX1RPX01PREVNX1BST0MsCi0JCQkJCSZycGNfcmVxLCBzaXplb2YocnBjX3JlcSksCi0JCQkJCSZycGNfcnNwLCBzaXplb2YocnBjX3JzcCksCi0JCQkJCTUgKiBIWik7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCU1NX0VSUigiZXJyb3IgcmVjZWl2aW5nIFJQQyByZXBseTogJWQgKCVkKVxuIiwKLQkJCQlyYywgLUVSRVNUQVJUU1lTKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmIChiZTMyX3RvX2NwdShycGNfcnNwLnJlcGx5X3N0YXQpICE9IFJQQ01TR19SRVBMWVNUQVRfQUNDRVBURUQpIHsKLQkJTU1fRVJSKCJSUEMgY2FsbCB3YXMgZGVuaWVkIVxuIik7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi0JaWYgKGJlMzJfdG9fY3B1KHJwY19yc3AuZGF0YS5hY2NfaGRyLmFjY2VwdF9zdGF0KSAhPQotCSAgICBSUENfQUNDRVBUU1RBVF9TVUNDRVNTKSB7Ci0JCU1NX0VSUigiUlBDIGNhbGwgd2FzIG5vdCBzdWNjZXNzZnVsICglZClcbiIsCi0JCQkJYmUzMl90b19jcHUocnBjX3JzcC5kYXRhLmFjY19oZHIuYWNjZXB0X3N0YXQpKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X21vZHVsZV9pbmRleCh1aW50MzJfdCBpZCkKLXsKLQlpbnQgbW9kX2lkeDsKLQlmb3IgKG1vZF9pZHggPSAwOyBtb2RfaWR4IDwgYWRzcF9pbmZvLm1vZHVsZV9jb3VudDsgbW9kX2lkeCsrKQotCQlpZiAoYWRzcF9pbmZvLm1vZHVsZVttb2RfaWR4XS5pZCA9PSBpZCkKLQkJCXJldHVybiBtb2RfaWR4OwotCi0JcmV0dXJuIC1FTlhJTzsKLX0KLQotc3RhdGljIHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKmZpbmRfYWRzcF9tb2R1bGVfYnlfaWQoCi0Jc3RydWN0IGFkc3BfaW5mbyAqaW5mbywgdWludDMyX3QgaWQpCi17Ci0JaW50IG1vZF9pZHg7Ci0KLQlpZiAoaWQgPiBpbmZvLT5tYXhfbW9kdWxlX2lkKSB7Ci0JCXJldHVybiBOVUxMOwotCX0gZWxzZSB7Ci0JCW1vZF9pZHggPSBnZXRfbW9kdWxlX2luZGV4KGlkKTsKLQkJaWYgKG1vZF9pZHggPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJldHVybiBpbmZvLT5pZF90b19tb2R1bGVbbW9kX2lkeF07Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqZmluZF9hZHNwX21vZHVsZV9ieV9uYW1lKAotCXN0cnVjdCBhZHNwX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JdW5zaWduZWQgbjsKLQlmb3IgKG4gPSAwOyBuIDwgaW5mby0+bW9kdWxlX2NvdW50OyBuKyspCi0JCWlmICghc3RyY21wKG5hbWUsIGFkc3BfbW9kdWxlc1tuXS5uYW1lKSkKLQkJCXJldHVybiBhZHNwX21vZHVsZXMgKyBuOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IGFkc3BfcnBjX2luaXQoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqYWRzcF9tb2R1bGUpCi17Ci0JLyogcmVtb3ZlIHRoZSBvcmlnaW5hbCBjb25uZWN0IG9uY2UgY29tcGF0aWJsZSBzdXBwb3J0IGlzIGNvbXBsZXRlICovCi0JYWRzcF9tb2R1bGUtPnJwY19jbGllbnQgPSBtc21fcnBjX2Nvbm5lY3QoCi0JCXJwY19hZHNwX3J0b3NfYXRvbV9wcm9nLAotCQlycGNfYWRzcF9ydG9zX2F0b21fdmVycywKLQkJTVNNX1JQQ19VTklOVEVSUlVQVElCTEUpOwotCWlmIChJU19FUlIoYWRzcF9tb2R1bGUtPnJwY19jbGllbnQpKQotCQlhZHNwX21vZHVsZS0+cnBjX2NsaWVudCA9IG1zbV9ycGNfY29ubmVjdF9jb21wYXRpYmxlKAotCQlycGNfYWRzcF9ydG9zX2F0b21fcHJvZywKLQkJcnBjX2Fkc3BfcnRvc19hdG9tX3ZlcnNfY29tcCwKLQkJTVNNX1JQQ19VTklOVEVSUlVQVElCTEUpOwotCi0JaWYgKElTX0VSUihhZHNwX21vZHVsZS0+cnBjX2NsaWVudCkpIHsKLQkJaW50IHJjID0gUFRSX0VSUihhZHNwX21vZHVsZS0+cnBjX2NsaWVudCk7Ci0JCWFkc3BfbW9kdWxlLT5ycGNfY2xpZW50ID0gMDsKLQkJTU1fRVJSKCJjb3VsZCBub3Qgb3BlbiBycGMgY2xpZW50OiAlZFxuIiwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTZW5kIFJQQ19BRFNQX1JUT1NfQ01EX0dFVF9JTklUX0lORk8gY21kIHRvIEFSTTkgYW5kIGdldAotICogcXVldWUgb2Zmc2V0cyBhbmQgbW9kdWxlIGVudHJpZXMgKGluaXQgaW5mbykgYXMgcGFydCBvZiB0aGUgZXZlbnQuCi0gKi8KLXN0YXRpYyB2b2lkICBtc21fZ2V0X2luaXRfaW5mbyh2b2lkKQotewotCWludCByYzsKLQlzdHJ1Y3QgcnBjX2Fkc3BfcnRvc19hcHBfdG9fbW9kZW1fYXJnc190IHJwY19yZXE7Ci0Jc3RydWN0IHJwY19yZXBseV9oZHIgcnBjX3JzcDsKLQotCWFkc3BfaW5mby5pbml0X2luZm9fcnBjX2NsaWVudCA9IG1zbV9ycGNfY29ubmVjdCgKLQkJcnBjX2Fkc3BfcnRvc19hdG9tX3Byb2csCi0JCXJwY19hZHNwX3J0b3NfYXRvbV92ZXJzLAotCQlNU01fUlBDX1VOSU5URVJSVVBUSUJMRSk7Ci0JaWYgKElTX0VSUihhZHNwX2luZm8uaW5pdF9pbmZvX3JwY19jbGllbnQpKSB7Ci0JCWFkc3BfaW5mby5pbml0X2luZm9fcnBjX2NsaWVudCA9IG1zbV9ycGNfY29ubmVjdF9jb21wYXRpYmxlKAotCQlycGNfYWRzcF9ydG9zX2F0b21fcHJvZywKLQkJcnBjX2Fkc3BfcnRvc19hdG9tX3ZlcnNfY29tcCwKLQkJTVNNX1JQQ19VTklOVEVSUlVQVElCTEUpOwotCQlpZiAoSVNfRVJSKGFkc3BfaW5mby5pbml0X2luZm9fcnBjX2NsaWVudCkpIHsKLQkJCXJjID0gUFRSX0VSUihhZHNwX2luZm8uaW5pdF9pbmZvX3JwY19jbGllbnQpOwotCQkJYWRzcF9pbmZvLmluaXRfaW5mb19ycGNfY2xpZW50ID0gMDsKLQkJCU1NX0VSUigiY291bGQgbm90IG9wZW4gcnBjIGNsaWVudDogJWRcbiIsIHJjKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXJwY19yZXEuZ290aXQgPSBjcHVfdG9fYmUzMigxKTsKLQlycGNfcmVxLmNtZCA9IGNwdV90b19iZTMyKFJQQ19BRFNQX1JUT1NfQ01EX0dFVF9JTklUX0lORk8pOwotCXJwY19yZXEucHJvY19pZCA9IGNwdV90b19iZTMyKFJQQ19BRFNQX1JUT1NfUFJPQ19BUFBTKTsKLQlycGNfcmVxLm1vZHVsZSA9IDA7Ci0KLQlyYyA9IG1zbV9ycGNfY2FsbF9yZXBseShhZHNwX2luZm8uaW5pdF9pbmZvX3JwY19jbGllbnQsCi0JCQkJCVJQQ19BRFNQX1JUT1NfQVBQX1RPX01PREVNX1BST0MsCi0JCQkJCSZycGNfcmVxLCBzaXplb2YocnBjX3JlcSksCi0JCQkJCSZycGNfcnNwLCBzaXplb2YocnBjX3JzcCksCi0JCQkJCTUgKiBIWik7Ci0KLQlpZiAocmMgPCAwKQotCQlNTV9FUlIoImNvdWxkIG5vdCBzZW5kIFJQQyByZXF1ZXN0OiAlZFxuIiwgcmMpOwotfQotCi1pbnQgbXNtX2Fkc3BfZ2V0KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKipvdXQsCi0JCSBzdHJ1Y3QgbXNtX2Fkc3Bfb3BzICpvcHMsIHZvaWQgKmRyaXZlcl9kYXRhKQotewotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZTsKLQlpbnQgcmMgPSAwOwotCXN0YXRpYyB1aW50MzJfdCBpbml0X2luZm9fY21kX3NlbnQ7Ci0KLQltdXRleF9sb2NrKCZhZHNwX2luZm8ubG9jayk7Ci0JaWYgKCFpbml0X2luZm9fY21kX3NlbnQpIHsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmYWRzcF9pbmZvLmluaXRfaW5mb193YWl0KTsKLQkJbXNtX2dldF9pbml0X2luZm8oKTsKLQkJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWRzcF9pbmZvLmluaXRfaW5mb193YWl0LAotCQkJYWRzcF9pbmZvLmluaXRfaW5mb19zdGF0ZSA9PSBBRFNQX1NUQVRFX0lOSVRfSU5GTywKLQkJCTUgKiBIWik7Ci0JCWlmICghcmMpIHsKLQkJCU1NX0VSUigiSU5JVF9JTkZPIGZhaWxlZFxuIik7Ci0JCQltdXRleF91bmxvY2soJmFkc3BfaW5mby5sb2NrKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCi0JCX0KLQkJaW5pdF9pbmZvX2NtZF9zZW50Kys7Ci0JfQotCW11dGV4X3VubG9jaygmYWRzcF9pbmZvLmxvY2spOwotCi0JbW9kdWxlID0gZmluZF9hZHNwX21vZHVsZV9ieV9uYW1lKCZhZHNwX2luZm8sIG5hbWUpOwotCWlmICghbW9kdWxlKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCW11dGV4X2xvY2soJm1vZHVsZS0+bG9jayk7Ci0JTU1fSU5GTygib3BlbmluZyBtb2R1bGUgJXNcbiIsIG1vZHVsZS0+bmFtZSk7Ci0KLQlpZiAobW9kdWxlLT5vcHMpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyYyA9IGFkc3BfcnBjX2luaXQobW9kdWxlKTsKLQlpZiAocmMpCi0JCWdvdG8gZG9uZTsKLQotCW1vZHVsZS0+b3BzID0gb3BzOwotCW1vZHVsZS0+ZHJpdmVyX2RhdGEgPSBkcml2ZXJfZGF0YTsKLQkqb3V0ID0gbW9kdWxlOwotCXJjID0gcnBjX2Fkc3BfcnRvc19hcHBfdG9fbW9kZW0oUlBDX0FEU1BfUlRPU19DTURfUkVHSVNURVJfQVBQLAotCQkJCQltb2R1bGUtPmlkLCBtb2R1bGUpOwotCWlmIChyYykgewotCQltb2R1bGUtPm9wcyA9IE5VTEw7Ci0JCW1vZHVsZS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwotCQkqb3V0ID0gTlVMTDsKLQkJTU1fRVJSKCJSRUdJU1RFUl9BUFAgZmFpbGVkXG4iKTsKLQkJZ290byBkb25lOwotCX0KLQotCU1NX0RCRygibW9kdWxlICVzIGhhcyBiZWVuIHJlZ2lzdGVyZWRcbiIsIG1vZHVsZS0+bmFtZSk7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZtb2R1bGUtPmxvY2spOwotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2Fkc3BfZ2V0KTsKLQotc3RhdGljIGludCBtc21fYWRzcF9kaXNhYmxlX2xvY2tlZChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUpOwotCi12b2lkIG1zbV9hZHNwX3B1dChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCW11dGV4X2xvY2soJm1vZHVsZS0+bG9jayk7Ci0JaWYgKG1vZHVsZS0+b3BzKSB7Ci0JCU1NX0lORk8oImNsb3NpbmcgbW9kdWxlICVzXG4iLCBtb2R1bGUtPm5hbWUpOwotCi0JCS8qIGxvY2sgdG8gZW5zdXJlIGEgZHNwIGV2ZW50IGNhbm5vdCBiZSBkZWxpdmVyZWQKLQkJICogZHVyaW5nIG9yIGFmdGVyIHJlbW92YWwgb2YgdGhlIG9wcyBhbmQgZHJpdmVyX2RhdGEKLQkJICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZhZHNwX2NtZF9sb2NrLCBmbGFncyk7Ci0JCW1vZHVsZS0+b3BzID0gTlVMTDsKLQkJbW9kdWxlLT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkc3BfY21kX2xvY2ssIGZsYWdzKTsKLQotCQlpZiAobW9kdWxlLT5zdGF0ZSAhPSBBRFNQX1NUQVRFX0RJU0FCTEVEKSB7Ci0JCQlNTV9JTkZPKCJkaXNhYmxpbmcgbW9kdWxlICVzXG4iLCBtb2R1bGUtPm5hbWUpOwotCQkJbXNtX2Fkc3BfZGlzYWJsZV9sb2NrZWQobW9kdWxlKTsKLQkJfQotCi0JCW1zbV9ycGNfY2xvc2UobW9kdWxlLT5ycGNfY2xpZW50KTsKLQkJbW9kdWxlLT5ycGNfY2xpZW50ID0gMDsKLQl9IGVsc2UgewotCQlNTV9JTkZPKCJtb2R1bGUgJXMgaXMgYWxyZWFkeSBjbG9zZWRcbiIsIG1vZHVsZS0+bmFtZSk7Ci0JfQotCW11dGV4X3VubG9jaygmbW9kdWxlLT5sb2NrKTsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2Fkc3BfcHV0KTsKLQotLyogdGhpcyBzaG91bGQgYmUgY29tbW9uIGNvZGUgd2l0aCBycGNfc2VydmVycy5jICovCi1zdGF0aWMgaW50IHJwY19zZW5kX2FjY2VwdGVkX3ZvaWRfcmVwbHkoc3RydWN0IG1zbV9ycGNfZW5kcG9pbnQgKmNsaWVudCwKLQkJCQkJdWludDMyX3QgeGlkLCB1aW50MzJfdCBhY2NlcHRfc3RhdHVzKQotewotCWludCByYyA9IDA7Ci0JdWludDhfdCByZXBseV9idWZbc2l6ZW9mKHN0cnVjdCBycGNfcmVwbHlfaGRyKV07Ci0Jc3RydWN0IHJwY19yZXBseV9oZHIgKnJlcGx5ID0gKHN0cnVjdCBycGNfcmVwbHlfaGRyICopcmVwbHlfYnVmOwotCi0JcmVwbHktPnhpZCA9IGNwdV90b19iZTMyKHhpZCk7Ci0JcmVwbHktPnR5cGUgPSBjcHVfdG9fYmUzMigxKTsgLyogcmVwbHkgKi8KLQlyZXBseS0+cmVwbHlfc3RhdCA9IGNwdV90b19iZTMyKFJQQ01TR19SRVBMWVNUQVRfQUNDRVBURUQpOwotCi0JcmVwbHktPmRhdGEuYWNjX2hkci5hY2NlcHRfc3RhdCA9IGNwdV90b19iZTMyKGFjY2VwdF9zdGF0dXMpOwotCXJlcGx5LT5kYXRhLmFjY19oZHIudmVyZl9mbGF2b3IgPSAwOwotCXJlcGx5LT5kYXRhLmFjY19oZHIudmVyZl9sZW5ndGggPSAwOwotCi0JcmMgPSBtc21fcnBjX3dyaXRlKHJwY19jYl9zZXJ2ZXJfY2xpZW50LCByZXBseV9idWYsIHNpemVvZihyZXBseV9idWYpKTsKLQlpZiAocmMgPCAwKQotCQlNTV9FUlIoImNvdWxkIG5vdCB3cml0ZSBSUEMgcmVzcG9uc2U6ICVkXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgX19tc21fYWRzcF93cml0ZShzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsIHVuc2lnbmVkIGRzcF9xdWV1ZV9hZGRyLAotCQkgICB2b2lkICpjbWRfYnVmLCBzaXplX3QgY21kX3NpemUpCi17Ci0JdWludDMyX3QgY3RybF93b3JkOwotCXVpbnQzMl90IGRzcF9xX2FkZHI7Ci0JdWludDMyX3QgZHNwX2FkZHI7Ci0JdWludDMyX3QgY21kX2lkID0gMDsKLQlpbnQgY250ID0gMDsKLQlpbnQgcmV0X3N0YXR1cyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYWRzcF9pbmZvICppbmZvOwotCi0JaWYgKCFtb2R1bGUgfHwgIWNtZF9idWYpIHsKLQkJTU1fRVJSKCJDYWxsZWQgd2l0aCBOVUxMIHBhcmFtZXRlcnNcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaW5mbyA9IG1vZHVsZS0+aW5mbzsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRzcF93cml0ZV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAobW9kdWxlLT5zdGF0ZSAhPSBBRFNQX1NUQVRFX0VOQUJMRUQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRzcF93cml0ZV9sb2NrLCBmbGFncyk7Ci0JCU1NX0VSUigibW9kdWxlICVzIG5vdCBlbmFibGVkIGJlZm9yZSB3cml0ZVxuIiwgbW9kdWxlLT5uYW1lKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWlmIChhZHNwX3ZhbGlkYXRlX21vZHVsZShtb2R1bGUtPmlkKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZHNwX3dyaXRlX2xvY2ssIGZsYWdzKTsKLQkJTU1fRVJSKCJtb2R1bGUgaWQgdmFsaWRhdGlvbiBmYWlsZWQgJXMgICVkXG4iLAotCQkJCW1vZHVsZS0+bmFtZSwgbW9kdWxlLT5pZCk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCWlmIChkc3BfcXVldWVfYWRkciA+PSBRRFNQX01BWF9OVU1fUVVFVUVTKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkc3Bfd3JpdGVfbG9jaywgZmxhZ3MpOwotCQlNTV9FUlIoIkludmFsaWQgUXVldWUgSW5kZXg6ICVkXG4iLCBkc3BfcXVldWVfYWRkcik7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCWlmIChhZHNwX3ZhbGlkYXRlX3F1ZXVlKG1vZHVsZS0+aWQsIGRzcF9xdWV1ZV9hZGRyLCBjbWRfc2l6ZSkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRzcF93cml0ZV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlkc3BfcV9hZGRyID0gYWRzcF9nZXRfcXVldWVfb2Zmc2V0KGluZm8sIGRzcF9xdWV1ZV9hZGRyKTsKLQlkc3BfcV9hZGRyICY9IEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfRFNQX0FERFJfTTsKLQotCS8qIFBvbGwgdW50aWwgdGhlIEFEU1AgaXMgcmVhZHkgdG8gYWNjZXB0IGEgY29tbWFuZC4KLQkgKiBXYWl0IGZvciAxMDB1cywgcmV0dXJuIGVycm9yIGlmIGl0J3Mgbm90IHJlc3BvbmRpbmcuCi0JICogSWYgdGhpcyByZXR1cm5zIGFuIGVycm9yLCB3ZSBuZWVkIHRvIGRpc2FibGUgQUxMIG1vZHVsZXMgYW5kCi0JICogdGhlbiByZXRyeS4KLQkgKi8KLQl3aGlsZSAoKChjdHJsX3dvcmQgPSByZWFkbChpbmZvLT53cml0ZV9jdHJsKSkgJgotCQlBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX1JFQURZX00pICE9Ci0JCUFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfUkVBRFlfVikgewotCQlpZiAoY250ID4gNTApIHsKLQkJCU1NX0VSUigidGltZW91dCB3YWl0aW5nIGZvciBEU1Agd3JpdGUgcmVhZHlcbiIpOwotCQkJcmV0X3N0YXR1cyA9IC1FSU87Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJTU1fREJHKCJ3YWl0aW5nIGZvciBEU1Agd3JpdGUgcmVhZHlcbiIpOwotCQl1ZGVsYXkoMik7Ci0JCWNudCsrOwotCX0KLQotCS8qIFNldCB0aGUgbXV0ZXggYml0cyAqLwotCWN0cmxfd29yZCAmPSB+KEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfTVVURVhfTSk7Ci0JY3RybF93b3JkIHw9ICBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX01VVEVYX05BVkFJTF9WOwotCi0JLyogQ2xlYXIgdGhlIGNvbW1hbmQgYml0cyAqLwotCWN0cmxfd29yZCAmPSB+KEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfQ01EX00pOwotCi0JLyogU2V0IHRoZSBxdWV1ZSBhZGRyZXNzIGJpdHMgKi8KLQljdHJsX3dvcmQgJj0gfihBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX0RTUF9BRERSX00pOwotCWN0cmxfd29yZCB8PSBkc3BfcV9hZGRyOwotCi0Jd3JpdGVsKGN0cmxfd29yZCwgaW5mby0+d3JpdGVfY3RybCk7Ci0KLQkvKiBHZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgdG8gdGhlIERTUC4gIFRoaXMgbm90aWZpZXMgdGhlIERTUCB0aGF0Ci0JICogd2UgYXJlIGFib3V0IHRvIHNlbmQgYSBjb21tYW5kIG9uIHRoaXMgcGFydGljdWxhciBxdWV1ZS4gIFRoZQotCSAqIERTUCB3aWxsIGluIHJlc3BvbnNlIGNoYW5nZSBpdHMgc3RhdGUuCi0JICovCi0Jd3JpdGVsKDEsIGluZm8tPnNlbmRfaXJxKTsKLQotCS8qIFBvbGwgdW50aWwgdGhlIGFkc3AgcmVzcG9uZHMgdG8gdGhlIGludGVycnVwdDsgdGhpcyBkb2VzIG5vdAotCSAqIGdlbmVyYXRlIGFuIGludGVycnVwdCBmcm9tIHRoZSBhZHNwLiAgVGhpcyBzaG91bGQgaGFwcGVuIHdpdGhpbgotCSAqIDVtcy4KLQkgKi8KLQljbnQgPSAwOwotCXdoaWxlICgocmVhZGwoaW5mby0+d3JpdGVfY3RybCkgJgotCQlBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX01VVEVYX00pID09Ci0JCUFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfTVVURVhfTkFWQUlMX1YpIHsKLQkJaWYgKGNudCA+IDI1MDApIHsKLQkJCU1NX0VSUigidGltZW91dCB3YWl0aW5nIGZvciBhZHNwIGFja1xuIik7Ci0JCQlyZXRfc3RhdHVzID0gLUVJTzsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQl1ZGVsYXkoMik7Ci0JCWNudCsrOwotCX0KLQotCS8qIFJlYWQgdGhlIGN0cmwgd29yZCAqLwotCWN0cmxfd29yZCA9IHJlYWRsKGluZm8tPndyaXRlX2N0cmwpOwotCi0JaWYgKChjdHJsX3dvcmQgJiBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX1NUQVRVU19NKSAhPQotCSAgICBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX05PX0VSUl9WKSB7Ci0JCXJldF9zdGF0dXMgPSAtRUFHQUlOOwotCQlnb3RvIGZhaWw7Ci0JfSBlbHNlIHsKLQkJLyogTm8gZXJyb3IgKi8KLQkJLyogR2V0IHRoZSBEU1AgYnVmZmVyIGFkZHJlc3MgKi8KLQkJZHNwX2FkZHIgPSAoY3RybF93b3JkICYgQURTUF9SVE9TX1dSSVRFX0NUUkxfV09SRF9EU1BfQUREUl9NKSArCi0JCQkgICAodWludDMyX3QpTVNNX0FENV9CQVNFOwotCi0JCWlmIChkc3BfYWRkciA8ICh1aW50MzJfdCkoTVNNX0FENV9CQVNFICsgUURTUF9SQU1DX09GRlNFVCkpIHsKLQkJCXVpbnQxNl90ICpidWZfcHRyID0gKHVpbnQxNl90ICopIGNtZF9idWY7Ci0JCQl1aW50MTZfdCAqZHNwX2FkZHIxNiA9ICh1aW50MTZfdCAqKWRzcF9hZGRyOwotCQkJY21kX3NpemUgLz0gc2l6ZW9mKHVpbnQxNl90KTsKLQotCQkJLyogU2F2ZSB0aGUgY29tbWFuZCBJRCAqLwotCQkJY21kX2lkID0gKHVpbnQzMl90KSBidWZfcHRyWzBdOwotCi0JCQkvKiBDb3B5IHRoZSBjb21tYW5kIHRvIERTUCBtZW1vcnkgKi8KLQkJCWNtZF9zaXplKys7Ci0JCQl3aGlsZSAoLS1jbWRfc2l6ZSkKLQkJCQkqZHNwX2FkZHIxNisrID0gKmJ1Zl9wdHIrKzsKLQkJfSBlbHNlIHsKLQkJCXVpbnQzMl90ICpidWZfcHRyID0gKHVpbnQzMl90ICopIGNtZF9idWY7Ci0JCQl1aW50MzJfdCAqZHNwX2FkZHIzMiA9ICh1aW50MzJfdCAqKWRzcF9hZGRyOwotCQkJY21kX3NpemUgLz0gc2l6ZW9mKHVpbnQzMl90KTsKLQotCQkJLyogU2F2ZSB0aGUgY29tbWFuZCBJRCAqLwotCQkJY21kX2lkID0gYnVmX3B0clswXTsKLQotCQkJY21kX3NpemUrKzsKLQkJCXdoaWxlICgtLWNtZF9zaXplKQotCQkJCSpkc3BfYWRkcjMyKysgPSAqYnVmX3B0cisrOwotCQl9Ci0KLQkJLyogU2V0IHRoZSBtdXRleCBiaXRzICovCi0JCWN0cmxfd29yZCAmPSB+KEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfTVVURVhfTSk7Ci0JCWN0cmxfd29yZCB8PSAgQURTUF9SVE9TX1dSSVRFX0NUUkxfV09SRF9NVVRFWF9OQVZBSUxfVjsKLQotCQkvKiBTZXQgdGhlIGNvbW1hbmQgYml0cyB0byB3cml0ZSBkb25lICovCi0JCWN0cmxfd29yZCAmPSB+KEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfQ01EX00pOwotCQljdHJsX3dvcmQgfD0gQURTUF9SVE9TX1dSSVRFX0NUUkxfV09SRF9DTURfV1JJVEVfRE9ORV9WOwotCi0JCS8qIFNldCB0aGUgcXVldWUgYWRkcmVzcyBiaXRzICovCi0JCWN0cmxfd29yZCAmPSB+KEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfRFNQX0FERFJfTSk7Ci0JCWN0cmxfd29yZCB8PSBkc3BfcV9hZGRyOwotCi0JCXdyaXRlbChjdHJsX3dvcmQsIGluZm8tPndyaXRlX2N0cmwpOwotCi0JCS8qIEdlbmVyYXRlIGFuIGludGVycnVwdCB0byB0aGUgRFNQLiAgSXQgZG9lcyBub3QgcmVzcG9uZCB3aXRoCi0JCSAqIGFuIGludGVycnVwdCwgYW5kIHdlIGRvIG5vdCBuZWVkIHRvIHdhaXQgZm9yIGl0IHRvCi0JCSAqIGFja25vd2xlZGdlLCBiZWNhdXNlIGl0IHdpbGwgaG9sZCB0aGUgbXV0ZXggbG9jayB1bnRpbCBpdCdzCi0JCSAqIHJlYWR5IHRvIHJlY2VpdmUgbW9yZSBjb21tYW5kcyBhZ2Fpbi4KLQkJICovCi0JCXdyaXRlbCgxLCBpbmZvLT5zZW5kX2lycSk7Ci0KLQkJbW9kdWxlLT5udW1fY29tbWFuZHMrKzsKLQl9IC8qIEN0cmwgd29yZCBzdGF0dXMgYml0cyB3ZXJlIDAwLCBubyBlcnJvciBpbiB0aGUgY3RybCB3b3JkICovCi0KLWZhaWw6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRzcF93cml0ZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldF9zdGF0dXM7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9hZHNwX3dyaXRlKTsKLQotaW50IG1zbV9hZHNwX3dyaXRlKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwgdW5zaWduZWQgZHNwX3F1ZXVlX2FkZHIsCi0JCQl2b2lkICpjbWRfYnVmLCBzaXplX3QgY21kX3NpemUpCi17Ci0JaW50IHJjLCByZXRyaWVzID0gMDsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQl1aW50MTZfdCAqcHRyOwotCWludCBpaTsKLQotCWlmICh3ZHVtcCA+IDApIHsKLQkJcHRyID0gY21kX2J1ZjsKLQkJcHJfaW5mbygiQS0+RDoleFxuIiwgbW9kdWxlLT5pZCk7Ci0JCXByX2luZm8oImFkc3A6ICV4ICVkXG4iLCBkc3BfcXVldWVfYWRkciwgY21kX3NpemUpOwotCQlmb3IgKGlpID0gMDsgaWkgPCBjbWRfc2l6ZS8yOyBpaSsrKQotCQkJcHJfaW5mbygiJXggIiwgcHRyW2lpXSk7Ci0JCXByX2luZm8oIlxuIik7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19ERUJVR19GUyAqLwotCWRvIHsKLQkJcmMgPSBfX21zbV9hZHNwX3dyaXRlKG1vZHVsZSwgZHNwX3F1ZXVlX2FkZHIsIGNtZF9idWYsCi0JCQkJCQkJCWNtZF9zaXplKTsKLQkJaWYgKHJjID09IC1FQUdBSU4pCi0JCQl1ZGVsYXkoMTApOwotCX0gd2hpbGUgKHJjID09IC1FQUdBSU4gJiYgcmV0cmllcysrIDwgMzAwKTsKLQlpZiAocmV0cmllcyA+IDUwKQotCQlNTV9FUlIoImFkc3A6ICVzIGNvbW1hbmQgdG9vayAlZCBhdHRlbXB0czogcmMgJWRcbiIsCi0JCQltb2R1bGUtPm5hbWUsIHJldHJpZXMsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkICpldmVudF9hZGRyOwotc3RhdGljIHZvaWQgcmVhZF9ldmVudCh2b2lkICpidWYsIHNpemVfdCBsZW4pCi17Ci0JdWludDMyX3QgZHB0clszXTsKLQlzdHJ1Y3QgcnBjX2Fkc3BfcnRvc19tb2RlbV90b19hcHBfYXJnc190ICpzcHRyOwotCXN0cnVjdCBhZHNwX3J0b3NfbXBfbXRvYV90eXBlCSpwa3RfcHRyOwotCi0Jc3B0ciA9IGV2ZW50X2FkZHI7Ci0JcGt0X3B0ciA9ICZzcHRyLT5tdG9hX3BrdC5hZHNwX3J0b3NfbXBfbXRvYV9kYXRhLm1wX210b2FfcGFja2V0OwotCi0JZHB0clswXSA9IGJlMzJfdG9fY3B1KHNwdHItPm10b2FfcGt0Lm1wX210b2FfaGVhZGVyLmV2ZW50KTsKLQlkcHRyWzFdID0gYmUzMl90b19jcHUocGt0X3B0ci0+bW9kdWxlKTsKLQlkcHRyWzJdID0gYmUzMl90b19jcHUocGt0X3B0ci0+aW1hZ2UpOwotCi0JaWYgKGxlbiA+IEVWRU5UX0xFTikKLQkJbGVuID0gRVZFTlRfTEVOOwotCi0JbWVtY3B5KGJ1ZiwgZHB0ciwgbGVuKTsKLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlX2Fkc3BfcnRvc19tdG9hX2FwcChzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyICpyZXEpCi17Ci0Jc3RydWN0IHJwY19hZHNwX3J0b3NfbW9kZW1fdG9fYXBwX2FyZ3NfdCAqYXJncyA9Ci0JCShzdHJ1Y3QgcnBjX2Fkc3BfcnRvc19tb2RlbV90b19hcHBfYXJnc190ICopcmVxOwotCXVpbnQzMl90IGV2ZW50OwotCXVpbnQzMl90IHByb2NfaWQ7Ci0JdWludDMyX3QgbW9kdWxlX2lkOwotCXVpbnQzMl90IGltYWdlOwotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZTsKLQlzdHJ1Y3QgYWRzcF9ydG9zX21wX210b2FfdHlwZQkqcGt0X3B0cjsKLQlzdHJ1Y3QgcXVldWVfdG9fb2Zmc2V0X3R5cGUJKnFwdHI7Ci0Jc3RydWN0IHF1ZXVlX3RvX29mZnNldF90eXBlCSpxdGJsOwotCXN0cnVjdCBtb2RfdG9fcXVldWVfb2Zmc2V0cwkqbXFwdHI7Ci0Jc3RydWN0IG1vZF90b19xdWV1ZV9vZmZzZXRzCSptcXRibDsKLQl1aW50MzJfdAkqbXB0cjsKLQl1aW50MzJfdAkqbXRibDsKLQl1aW50MzJfdAlxX2lkeDsKLQl1aW50MzJfdAludW1fZW50cmllczsKLQl1aW50MzJfdAllbnRyaWVzX3Blcl9pbWFnZTsKLQlzdHJ1Y3QgYWRzcF9ydG9zX21wX210b2FfaW5pdF9pbmZvX3R5cGUgKmlwdHI7Ci0Jc3RydWN0IGFkc3BfcnRvc19tcF9tdG9hX2luaXRfaW5mb190eXBlCSpzcHRyOwotCWludDMyX3QJCWlfbm8sIGVfaWR4OwotCi0JZXZlbnQgPSBiZTMyX3RvX2NwdShhcmdzLT5tdG9hX3BrdC5tcF9tdG9hX2hlYWRlci5ldmVudCk7Ci0JcHJvY19pZCA9IGJlMzJfdG9fY3B1KGFyZ3MtPm10b2FfcGt0Lm1wX210b2FfaGVhZGVyLnByb2NfaWQpOwotCi0JaWYgKGV2ZW50ID09IFJQQ19BRFNQX1JUT1NfSU5JVF9JTkZPKSB7Ci0JCU1NX0lORk8oIklOSVRfSU5GTyBFdmVudFxuIik7Ci0JCXNwdHIgPSAmYXJncy0+bXRvYV9wa3QuYWRzcF9ydG9zX21wX210b2FfZGF0YS5tcF9tdG9hX2luaXRfcGFja2V0OwotCi0JCWlwdHIgPSBhZHNwX2luZm8uaW5pdF9pbmZvX3B0cjsKLQkJaXB0ci0+aW1hZ2VfY291bnQgPSBiZTMyX3RvX2NwdShzcHRyLT5pbWFnZV9jb3VudCk7Ci0JCWlmIChpcHRyLT5pbWFnZV9jb3VudCA+IElNR19NQVgpCi0JCQlpcHRyLT5pbWFnZV9jb3VudCA9IElNR19NQVg7Ci0JCWlwdHItPm51bV9xdWV1ZV9vZmZzZXRzID0gYmUzMl90b19jcHUoc3B0ci0+bnVtX3F1ZXVlX29mZnNldHMpOwotCQludW1fZW50cmllcyA9IGlwdHItPm51bV9xdWV1ZV9vZmZzZXRzOwotCQlpZiAobnVtX2VudHJpZXMgPiBFTlRSSUVTX01BWCkgewotCQkJbnVtX2VudHJpZXMgPSBFTlRSSUVTX01BWDsKLQkJCWlwdHItPm51bV9xdWV1ZV9vZmZzZXRzID0gRU5UUklFU19NQVg7Ci0JCX0KLQkJcXB0ciA9ICZzcHRyLT5xdWV1ZV9vZmZzZXRzX3RibFswXVswXTsKLQkJZm9yIChpX25vID0gMDsgaV9ubyA8IGlwdHItPmltYWdlX2NvdW50OyBpX25vKyspIHsKLQkJCXF0YmwgPSAmaXB0ci0+cXVldWVfb2Zmc2V0c190YmxbaV9ub11bMF07Ci0JCQlmb3IgKGVfaWR4ID0gMDsgZV9pZHggPCBudW1fZW50cmllczsgZV9pZHgrKykgewotCQkJCXF0YmxbZV9pZHhdLm9mZnNldCA9IGJlMzJfdG9fY3B1KHFwdHItPm9mZnNldCk7Ci0JCQkJcXRibFtlX2lkeF0ucXVldWUgPSBiZTMyX3RvX2NwdShxcHRyLT5xdWV1ZSk7Ci0JCQkJcV9pZHggPSBiZTMyX3RvX2NwdShxcHRyLT5xdWV1ZSk7Ci0JCQkJaXB0ci0+cXVldWVfb2Zmc2V0c1tpX25vXVtxX2lkeF0gPSBxdGJsW2VfaWR4XS5vZmZzZXQ7Ci0JCQkJcXB0cisrOwotCQkJfQotCQl9Ci0KLQkJbnVtX2VudHJpZXMgPSBiZTMyX3RvX2NwdShzcHRyLT5udW1fdGFza19tb2R1bGVfZW50cmllcyk7Ci0JCWlmIChudW1fZW50cmllcyA+IEVOVFJJRVNfTUFYKQotCQkJbnVtX2VudHJpZXMgPSBFTlRSSUVTX01BWDsKLQkJaXB0ci0+bnVtX3Rhc2tfbW9kdWxlX2VudHJpZXMgPSBudW1fZW50cmllczsKLQkJZW50cmllc19wZXJfaW1hZ2UgPSBudW1fZW50cmllcyAvIGlwdHItPmltYWdlX2NvdW50OwotCQltcHRyID0gJnNwdHItPnRhc2tfdG9fbW9kdWxlX3RibFswXVswXTsKLQkJZm9yIChpX25vID0gMDsgaV9ubyA8IGlwdHItPmltYWdlX2NvdW50OyBpX25vKyspIHsKLQkJCW10YmwgPSAmaXB0ci0+dGFza190b19tb2R1bGVfdGJsW2lfbm9dWzBdOwotCQkJZm9yIChlX2lkeCA9IDA7IGVfaWR4IDwgZW50cmllc19wZXJfaW1hZ2U7IGVfaWR4KyspIHsKLQkJCQltdGJsW2VfaWR4XSA9IGJlMzJfdG9fY3B1KCptcHRyKTsKLQkJCQltcHRyKys7Ci0JCQl9Ci0JCX0KLQotCQlpcHRyLT5tb2R1bGVfdGFibGVfc2l6ZSA9IGJlMzJfdG9fY3B1KHNwdHItPm1vZHVsZV90YWJsZV9zaXplKTsKLSNpZiBDT05GSUdfQURTUF9SUENfVkVSID4gMHgzMDAwMQotCQlpZiAoaXB0ci0+bW9kdWxlX3RhYmxlX3NpemUgPiBNT0RVTEVTX01BWCkKLQkJCWlwdHItPm1vZHVsZV90YWJsZV9zaXplID0gTU9EVUxFU19NQVg7Ci0jZWxzZQotCQlpZiAoaXB0ci0+bW9kdWxlX3RhYmxlX3NpemUgPiBFTlRSSUVTX01BWCkKLQkJCWlwdHItPm1vZHVsZV90YWJsZV9zaXplID0gRU5UUklFU19NQVg7Ci0jZW5kaWYKLQkJbXB0ciA9ICZzcHRyLT5tb2R1bGVfZW50cmllc1swXTsKLQkJZm9yIChpX25vID0gMDsgaV9ubyA8IGlwdHItPm1vZHVsZV90YWJsZV9zaXplOyBpX25vKyspCi0JCQlpcHRyLT5tb2R1bGVfZW50cmllc1tpX25vXSA9IGJlMzJfdG9fY3B1KG1wdHJbaV9ub10pOwotCi0JCW1xcHRyID0gJnNwdHItPm1vZF90b19xX3RibFswXTsKLQkJbXF0YmwgPSAmaXB0ci0+bW9kX3RvX3FfdGJsWzBdOwotCQlpcHRyLT5tb2RfdG9fcV9lbnRyaWVzID0gYmUzMl90b19jcHUoc3B0ci0+bW9kX3RvX3FfZW50cmllcyk7Ci0JCWlmIChpcHRyLT5tb2RfdG9fcV9lbnRyaWVzID4gRU5UUklFU19NQVgpCi0JCQlpcHRyLT5tb2RfdG9fcV9lbnRyaWVzID0gRU5UUklFU19NQVg7Ci0JCWZvciAoZV9pZHggPSAwOyBlX2lkeCA8IGlwdHItPm1vZF90b19xX2VudHJpZXM7IGVfaWR4KyspIHsKLQkJCW1xdGJsW2VfaWR4XS5tb2R1bGUgPSBiZTMyX3RvX2NwdShtcXB0ci0+bW9kdWxlKTsKLQkJCW1xdGJsW2VfaWR4XS5xX3R5cGUgPSBiZTMyX3RvX2NwdShtcXB0ci0+cV90eXBlKTsKLQkJCW1xdGJsW2VfaWR4XS5xX21heF9sZW4gPSBiZTMyX3RvX2NwdShtcXB0ci0+cV9tYXhfbGVuKTsKLQkJCW1xcHRyKys7Ci0JCX0KLQotCQlhZHNwX2luZm8uaW5pdF9pbmZvX3N0YXRlID0gQURTUF9TVEFURV9JTklUX0lORk87Ci0JCXJwY19zZW5kX2FjY2VwdGVkX3ZvaWRfcmVwbHkocnBjX2NiX3NlcnZlcl9jbGllbnQsIHJlcS0+eGlkLAotCQkJCQkJUlBDX0FDQ0VQVFNUQVRfU1VDQ0VTUyk7Ci0JCXdha2VfdXAoJmFkc3BfaW5mby5pbml0X2luZm9fd2FpdCk7Ci0KLQkJcmV0dXJuOwotCX0KLQotCXBrdF9wdHIgPSAmYXJncy0+bXRvYV9wa3QuYWRzcF9ydG9zX21wX210b2FfZGF0YS5tcF9tdG9hX3BhY2tldDsKLQltb2R1bGVfaWQgPSBiZTMyX3RvX2NwdShwa3RfcHRyLT5tb2R1bGUpOwotCWltYWdlICAgICA9IGJlMzJfdG9fY3B1KHBrdF9wdHItPmltYWdlKTsKLQotCU1NX0RCRygicnBjIGV2ZW50PSVkLCBwcm9jX2lkPSVkLCBtb2R1bGU9JWQsIGltYWdlPSVkXG4iLAotCQlldmVudCwgcHJvY19pZCwgbW9kdWxlX2lkLCBpbWFnZSk7Ci0KLQltb2R1bGUgPSBmaW5kX2Fkc3BfbW9kdWxlX2J5X2lkKCZhZHNwX2luZm8sIG1vZHVsZV9pZCk7Ci0JaWYgKCFtb2R1bGUpIHsKLQkJTU1fRVJSKCJtb2R1bGUgJWQgaXMgbm90IHN1cHBvcnRlZCFcbiIsIG1vZHVsZV9pZCk7Ci0JCXJwY19zZW5kX2FjY2VwdGVkX3ZvaWRfcmVwbHkocnBjX2NiX3NlcnZlcl9jbGllbnQsIHJlcS0+eGlkLAotCQkJCVJQQ19BQ0NFUFRTVEFUX0dBUkJBR0VfQVJHUyk7Ci0JCXJldHVybjsKLQl9Ci0KLQltdXRleF9sb2NrKCZtb2R1bGUtPmxvY2spOwotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFJQQ19BRFNQX1JUT1NfTU9EX1JFQURZOgotCQlpZiAobW9kdWxlLT5zdGF0ZSA9PSBBRFNQX1NUQVRFX0VOQUJMSU5HKSB7Ci0JCQlNTV9JTkZPKCJtb2R1bGUgJXM6IFJFQURZXG4iLCBtb2R1bGUtPm5hbWUpOwotCQkJbW9kdWxlLT5zdGF0ZSA9IEFEU1BfU1RBVEVfRU5BQkxFRDsKLQkJCXdha2VfdXAoJm1vZHVsZS0+c3RhdGVfd2FpdCk7Ci0JCQlhZHNwX3NldF9pbWFnZShtb2R1bGUtPmluZm8sIGltYWdlKTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJtb2R1bGUgJXMgZ290IFJFQURZIGV2ZW50IGluIHN0YXRlWyVkXVxuIiwKLQkJCQkJCQkJbW9kdWxlLT5uYW1lLAotCQkJCQkJCQltb2R1bGUtPnN0YXRlKTsKLQkJCXJwY19zZW5kX2FjY2VwdGVkX3ZvaWRfcmVwbHkocnBjX2NiX3NlcnZlcl9jbGllbnQsCi0JCQkJCQlyZXEtPnhpZCwKLQkJCQkJCVJQQ19BQ0NFUFRTVEFUX0dBUkJBR0VfQVJHUyk7Ci0JCQltdXRleF91bmxvY2soJm1vZHVsZS0+bG9jayk7Ci0JCQlyZXR1cm47Ci0JCX0KLQljYXNlIFJQQ19BRFNQX1JUT1NfTU9EX0RJU0FCTEU6Ci0JCU1NX0lORk8oIm1vZHVsZSAlczogRElTQUJMRURcbiIsIG1vZHVsZS0+bmFtZSk7Ci0JCW1vZHVsZS0+c3RhdGUgPSBBRFNQX1NUQVRFX0RJU0FCTEVEOwotCQl3YWtlX3VwKCZtb2R1bGUtPnN0YXRlX3dhaXQpOwotCQlicmVhazsKLQljYXNlIFJQQ19BRFNQX1JUT1NfU0VSVklDRV9SRVNFVDoKLQkJTU1fSU5GTygibW9kdWxlICVzOiBTRVJWSUNFX1JFU0VUXG4iLCBtb2R1bGUtPm5hbWUpOwotCQltb2R1bGUtPnN0YXRlID0gQURTUF9TVEFURV9ESVNBQkxFRDsKLQkJd2FrZV91cCgmbW9kdWxlLT5zdGF0ZV93YWl0KTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfQURTUF9SVE9TX0NNRF9TVUNDRVNTOgotCQlNTV9JTkZPKCJtb2R1bGUgJXM6IENNRF9TVUNDRVNTXG4iLCBtb2R1bGUtPm5hbWUpOwotCQlicmVhazsKLQljYXNlIFJQQ19BRFNQX1JUT1NfQ01EX0ZBSUw6Ci0JCU1NX0lORk8oIm1vZHVsZSAlczogQ01EX0ZBSUxcbiIsIG1vZHVsZS0+bmFtZSk7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0FEU1BfUlRPU19ESVNBQkxFX0ZBSUw6Ci0JCU1NX0lORk8oIm1vZHVsZSAlczogRElTQUJMRV9GQUlMXG4iLCBtb2R1bGUtPm5hbWUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlNTV9FUlIoInVua25vd24gZXZlbnQgJWRcbiIsIGV2ZW50KTsKLQkJcnBjX3NlbmRfYWNjZXB0ZWRfdm9pZF9yZXBseShycGNfY2Jfc2VydmVyX2NsaWVudCwgcmVxLT54aWQsCi0JCQkJCSAgICAgUlBDX0FDQ0VQVFNUQVRfR0FSQkFHRV9BUkdTKTsKLQkJbXV0ZXhfdW5sb2NrKCZtb2R1bGUtPmxvY2spOwotCQlyZXR1cm47Ci0JfQotCXJwY19zZW5kX2FjY2VwdGVkX3ZvaWRfcmVwbHkocnBjX2NiX3NlcnZlcl9jbGllbnQsIHJlcS0+eGlkLAotCQkJCSAgICAgUlBDX0FDQ0VQVFNUQVRfU1VDQ0VTUyk7Ci0jaWZkZWYgQ09ORklHX01TTV9BRFNQX1JFUE9SVF9FVkVOVFMKLQlldmVudF9hZGRyID0gKHVpbnQzMl90ICopcmVxOwotCW1vZHVsZS0+b3BzLT5ldmVudChtb2R1bGUtPmRyaXZlcl9kYXRhLAotCQkJCUVWRU5UX01TR19JRCwKLQkJCQlFVkVOVF9MRU4sCi0JCQkJcmVhZF9ldmVudCk7Ci0jZW5kaWYKLQltdXRleF91bmxvY2soJm1vZHVsZS0+bG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgaGFuZGxlX2Fkc3BfcnRvc19tdG9hKHN0cnVjdCBycGNfcmVxdWVzdF9oZHIgKnJlcSkKLXsKLQlzd2l0Y2ggKHJlcS0+cHJvY2VkdXJlKSB7Ci0JY2FzZSBSUENfQURTUF9SVE9TX01UT0FfTlVMTF9QUk9DOgotCQlycGNfc2VuZF9hY2NlcHRlZF92b2lkX3JlcGx5KHJwY19jYl9zZXJ2ZXJfY2xpZW50LAotCQkJCQkgICAgIHJlcS0+eGlkLAotCQkJCQkgICAgIFJQQ19BQ0NFUFRTVEFUX1NVQ0NFU1MpOwotCQlicmVhazsKLSNpZiBDT05GSUdfQURTUF9SUENfVkVSID4gMHgzMDAwMQotCWNhc2UgUlBDX0FEU1BfUlRPU19NVE9BX0lOSVRfSU5GT19QUk9DOgotCWNhc2UgUlBDX0FEU1BfUlRPU19NVE9BX0VWRU5UX0lORk9fUFJPQzoKLSNlbHNlCi0JY2FzZSBSUENfQURTUF9SVE9TX01PREVNX1RPX0FQUF9QUk9DOgotI2VuZGlmCi0JCWhhbmRsZV9hZHNwX3J0b3NfbXRvYV9hcHAocmVxKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJ1bmtub3duZWQgcHJvYyAlZFxuIiwgcmVxLT5wcm9jZWR1cmUpOwotCQlycGNfc2VuZF9hY2NlcHRlZF92b2lkX3JlcGx5KAotCQkJcnBjX2NiX3NlcnZlcl9jbGllbnQsIHJlcS0+eGlkLAotCQkJUlBDX0FDQ0VQVFNUQVRfUFJPQ19VTkFWQUlMKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiB0aGlzIHNob3VsZCBiZSBjb21tb24gY29kZSB3aXRoIHJwY19zZXJ2ZXJzLmMgKi8KLXN0YXRpYyBpbnQgYWRzcF9ycGNfdGhyZWFkKHZvaWQgKmRhdGEpCi17Ci0Jdm9pZCAqYnVmZmVyOwotCXN0cnVjdCBycGNfcmVxdWVzdF9oZHIgKnJlcTsKLQlpbnQgcmMsIGV4aXQgPSAwOwotCi0JZG8gewotCQlyYyA9IG1zbV9ycGNfcmVhZChycGNfY2Jfc2VydmVyX2NsaWVudCwgJmJ1ZmZlciwgLTEsIC0xKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJTU1fRVJSKCJjb3VsZCBub3QgcmVhZCBycGM6ICVkXG4iLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQlyZXEgPSAoc3RydWN0IHJwY19yZXF1ZXN0X2hkciAqKWJ1ZmZlcjsKLQotCQlyZXEtPnR5cGUgPSBiZTMyX3RvX2NwdShyZXEtPnR5cGUpOwotCQlyZXEtPnhpZCA9IGJlMzJfdG9fY3B1KHJlcS0+eGlkKTsKLQkJcmVxLT5ycGNfdmVycyA9IGJlMzJfdG9fY3B1KHJlcS0+cnBjX3ZlcnMpOwotCQlyZXEtPnByb2cgPSBiZTMyX3RvX2NwdShyZXEtPnByb2cpOwotCQlyZXEtPnZlcnMgPSBiZTMyX3RvX2NwdShyZXEtPnZlcnMpOwotCQlyZXEtPnByb2NlZHVyZSA9IGJlMzJfdG9fY3B1KHJlcS0+cHJvY2VkdXJlKTsKLQotCQlpZiAocmVxLT50eXBlICE9IDApCi0JCQlnb3RvIGJhZF9ycGM7Ci0JCWlmIChyZXEtPnJwY192ZXJzICE9IDIpCi0JCQlnb3RvIGJhZF9ycGM7Ci0JCWlmIChyZXEtPnByb2cgIT0gcnBjX2Fkc3BfcnRvc19tdG9hX3Byb2cpCi0JCQlnb3RvIGJhZF9ycGM7Ci0JCWlmICghbXNtX3JwY19pc19jb21wYXRpYmxlX3ZlcnNpb24ocnBjX2Fkc3BfcnRvc19tdG9hX3ZlcnMsCi0JCQkJCQkJcmVxLT52ZXJzKSkKLQkJCWdvdG8gYmFkX3JwYzsKLQotCQloYW5kbGVfYWRzcF9ydG9zX210b2EocmVxKTsKLQkJa2ZyZWUoYnVmZmVyKTsKLQkJY29udGludWU7Ci0KLWJhZF9ycGM6Ci0JCU1NX0VSUigiYm9ndXMgcnBjIGZyb20gbW9kZW1cbiIpOwotCQlrZnJlZShidWZmZXIpOwotCX0gd2hpbGUgKCFleGl0KTsKLQlkb19leGl0KDApOwotfQotCi1zdGF0aWMgc2l6ZV90IHJlYWRfZXZlbnRfc2l6ZTsKLXN0YXRpYyB2b2lkICpyZWFkX2V2ZW50X2FkZHI7Ci0KLXN0YXRpYyB2b2lkIHJlYWRfZXZlbnRfMTYodm9pZCAqYnVmLCBzaXplX3QgbGVuKQotewotCXVpbnQxNl90ICpkc3QgPSBidWY7Ci0JdWludDE2X3QgKnNyYyA9IHJlYWRfZXZlbnRfYWRkcjsKLQlsZW4gLz0gMjsKLQlpZiAobGVuID4gcmVhZF9ldmVudF9zaXplKQotCQlsZW4gPSByZWFkX2V2ZW50X3NpemU7Ci0Jd2hpbGUgKGxlbi0tKQotCQkqZHN0KysgPSAqc3JjKys7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlYWRfZXZlbnRfMzIodm9pZCAqYnVmLCBzaXplX3QgbGVuKQotewotCXVpbnQzMl90ICpkc3QgPSBidWY7Ci0JdWludDMyX3QgKnNyYyA9IHJlYWRfZXZlbnRfYWRkcjsKLQlsZW4gLz0gMjsKLQlpZiAobGVuID4gcmVhZF9ldmVudF9zaXplKQotCQlsZW4gPSByZWFkX2V2ZW50X3NpemU7Ci0Jd2hpbGUgKGxlbi0tKQotCQkqZHN0KysgPSAqc3JjKys7Ci19Ci0KLXN0YXRpYyBpbnQgYWRzcF9ydG9zX3JlYWRfY3RybF93b3JkX2NtZF90YXN0X3RvX2hfdigKLQlzdHJ1Y3QgYWRzcF9pbmZvICppbmZvLCB2b2lkICpkc3BfYWRkcikKLXsKLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGU7Ci0JdW5zaWduZWQgcnRvc190YXNrX2lkOwotCXVuc2lnbmVkIG1zZ19pZDsKLQl1bnNpZ25lZCBtc2dfbGVuZ3RoOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXVpbnQxNl90ICpwdHIxNjsKLQl1aW50MzJfdCAqcHRyMzI7Ci0JaW50IGlpOwotI2VuZGlmIC8qIENPTkZJR19ERUJVR19GUyAqLwotCXZvaWQgKCpmdW5jKSh2b2lkICosIHNpemVfdCk7Ci0KLQlpZiAoZHNwX2FkZHIgPj0gKHZvaWQgKikoTVNNX0FENV9CQVNFICsgUURTUF9SQU1DX09GRlNFVCkpIHsKLQkJdWludDMyX3QgKmRzcF9hZGRyMzIgPSBkc3BfYWRkcjsKLQkJdWludDMyX3QgdG1wID0gKmRzcF9hZGRyMzIrKzsKLQkJcnRvc190YXNrX2lkID0gKHRtcCAmIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9UQVNLX0lEX00pID4+IDg7Ci0JCW1zZ19pZCA9ICh0bXAgJiBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfTVNHX0lEX00pOwotCQlyZWFkX2V2ZW50X3NpemUgPSB0bXAgPj4gMTY7Ci0JCXJlYWRfZXZlbnRfYWRkciA9IGRzcF9hZGRyMzI7Ci0JCW1zZ19sZW5ndGggPSByZWFkX2V2ZW50X3NpemUgKiBzaXplb2YodWludDMyX3QpOwotCQlmdW5jID0gcmVhZF9ldmVudF8zMjsKLQl9IGVsc2UgewotCQl1aW50MTZfdCAqZHNwX2FkZHIxNiA9IGRzcF9hZGRyOwotCQl1aW50MTZfdCB0bXAgPSAqZHNwX2FkZHIxNisrOwotCQlydG9zX3Rhc2tfaWQgPSAodG1wICYgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX1RBU0tfSURfTSkgPj4gODsKLQkJbXNnX2lkID0gdG1wICYgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX01TR19JRF9NOwotCQlyZWFkX2V2ZW50X3NpemUgPSAqZHNwX2FkZHIxNisrOwotCQlyZWFkX2V2ZW50X2FkZHIgPSBkc3BfYWRkcjE2OwotCQltc2dfbGVuZ3RoID0gcmVhZF9ldmVudF9zaXplICogc2l6ZW9mKHVpbnQxNl90KTsKLQkJZnVuYyA9IHJlYWRfZXZlbnRfMTY7Ci0JfQotCi0JaWYgKHJ0b3NfdGFza19pZCA+IGluZm8tPm1heF90YXNrX2lkKSB7Ci0JCU1NX0VSUigiYm9ndXMgdGFzayBpZCAlZFxuIiwgcnRvc190YXNrX2lkKTsKLQkJcmV0dXJuIDA7Ci0JfQotCW1vZHVsZSA9IGZpbmRfYWRzcF9tb2R1bGVfYnlfaWQoaW5mbywKLQkJCQkJYWRzcF9nZXRfbW9kdWxlKGluZm8sIHJ0b3NfdGFza19pZCkpOwotCi0JaWYgKCFtb2R1bGUpIHsKLQkJTU1fRVJSKCJubyBtb2R1bGUgZm9yIHRhc2sgaWQgJWRcbiIsIHJ0b3NfdGFza19pZCk7Ci0JCXJldHVybiAwOwotCX0KLQotCW1vZHVsZS0+bnVtX2V2ZW50cysrOwotCi0JaWYgKCFtb2R1bGUtPm9wcykgewotCQlNTV9FUlIoIm1vZHVsZSAlcyBpcyBub3Qgb3BlblxuIiwgbW9kdWxlLT5uYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCWlmIChyZHVtcCA+IDAgJiYKLQkJKGRzcF9hZGRyID49ICh2b2lkICopKE1TTV9BRDVfQkFTRSArIFFEU1BfUkFNQ19PRkZTRVQpKSkgewotCQlwdHIzMiA9IHJlYWRfZXZlbnRfYWRkcjsKLQkJcHJfaW5mbygiRC0+QVxuIik7Ci0JCXByX2luZm8oIm1faWQgPSAleCBpZCA9ICV4XG4iLCBtb2R1bGUtPmlkLCBtc2dfaWQpOwotCQlmb3IgKGlpID0gMDsgaWkgPCBtc2dfbGVuZ3RoLzQ7IGlpKyspCi0JCQlwcl9pbmZvKCIleCAiLCBwdHIzMltpaV0pOwotCQlwcl9pbmZvKCJcbiIpOwotCX0gZWxzZSBpZiAocmR1bXAgPiAwKSB7Ci0JCXB0cjE2ID0gcmVhZF9ldmVudF9hZGRyOwotCQlwcl9pbmZvKCJELT5BXG4iKTsKLQkJcHJfaW5mbygibV9pZCA9ICV4IGlkID0gJXhcbiIsIG1vZHVsZS0+aWQsIG1zZ19pZCk7Ci0JCWZvciAoaWkgPSAwOyBpaSA8IG1zZ19sZW5ndGgvMjsgaWkrKykKLQkJCXByX2luZm8oIiV4ICIsIHB0cjE2W2lpXSk7Ci0JCXByX2luZm8oIlxuIik7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19ERUJVR19GUyAqLwotCi0JbW9kdWxlLT5vcHMtPmV2ZW50KG1vZHVsZS0+ZHJpdmVyX2RhdGEsIG1zZ19pZCwgbXNnX2xlbmd0aCwgZnVuYyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWRzcF9nZXRfZXZlbnQoc3RydWN0IGFkc3BfaW5mbyAqaW5mbykKLXsKLQl1aW50MzJfdCBjdHJsX3dvcmQ7Ci0JdWludDMyX3QgcmVhZHk7Ci0Jdm9pZCAqZHNwX2FkZHI7Ci0JdWludDMyX3QgY21kX3R5cGU7Ci0JaW50IGNudDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByYyA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRzcF9jbWRfbG9jaywgZmxhZ3MpOwotCi0JLyogV2hlbmV2ZXIgdGhlIERTUCBoYXMgYSBtZXNzYWdlLCBpdCB1cGRhdGVzIHRoaXMgY29udHJvbCB3b3JkCi0JICogYW5kIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQuICBXaGVuIHdlIHJlY2VpdmUgdGhlIGludGVycnVwdCwgd2UKLQkgKiByZWFkIHRoaXMgcmVnaXN0ZXIgdG8gZmluZCBvdXQgd2hhdCBBRFNQIHRhc2sgdGhlIGNvbW1hbmQgaXMKLQkgKiBjb21taW5nIGZyb20uCi0JICoKLQkgKiBUaGUgQURTUCBzaG91bGQgKmFsd2F5cyogYmUgcmVhZHkgb24gdGhlIGZpcnN0IGNhbGwsIGJ1dCB0aGUKLQkgKiBpcnEgaGFuZGxlciBjYWxscyB1cyBpbiBhIGxvb3AgKHRvIGhhbmRsZSBiYWNrLXRvLWJhY2sgY29tbWFuZAotCSAqIHByb2Nlc3NpbmcpLCBzbyB3ZSBnaXZlIHRoZSBEU1Agc29tZSB0aW1lIHRvIHJldHVybiB0byB0aGUKLQkgKiByZWFkeSBzdGF0ZS4gIFRoZSBEU1Agd2lsbCBub3QgaXNzdWUgYW5vdGhlciBJUlEgZm9yIGV2ZW50cwotCSAqIHBlbmRpbmcgYmV0d2VlbiB0aGUgZmlyc3QgSVJRIGFuZCB0aGUgZXZlbnQgcXVldWUgYmVpbmcgZHJhaW5lZCwKLQkgKiB1bmZvcnR1bmF0ZWx5LgotCSAqLwotCi0JZm9yIChjbnQgPSAwOyBjbnQgPCA1MDsgY250KyspIHsKLQkJY3RybF93b3JkID0gcmVhZGwoaW5mby0+cmVhZF9jdHJsKTsKLQotCQlpZiAoKGN0cmxfd29yZCAmIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9GTEFHX00pID09Ci0JCSAgICBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfRkxBR19VUF9DT05UX1YpCi0JCQlnb3RvIHJlYWR5OwotCi0JCXVkZWxheSgyKTsKLQl9Ci0JTU1fRVJSKCJub3QgcmVhZHkgYWZ0ZXIgMTAwdVNcbiIpOwotCXJjID0gLUVCVVNZOwotCWdvdG8gZG9uZTsKLQotcmVhZHk6Ci0JLyogSGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIHBlbmRpbmcgbWVzc2FnZXMuIElmIHRoZXJlIGFyZQotCSAqIG5vbmUsIHdlIHNpcGx5IHJldHVybiAtRUFHQUlOIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUKLQkgKiBtZXNzYWdlcyBwZW5kaW5nLgotCSAqLwotCXJlYWR5ID0gY3RybF93b3JkICYgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX1JFQURZX007Ci0JaWYgKChyZWFkeSAhPSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfUkVBRFlfVikgJiYKLQkgICAgKHJlYWR5ICE9IEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9DT05UX1YpKSB7Ci0JCXJjID0gLUVBR0FJTjsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIERTUCBzYXlzIHRoYXQgdGhlcmUgYXJlIG1lc3NhZ2VzIHdhaXRpbmcgZm9yIHRoZSBob3N0IHRvIHJlYWQgKi8KLQotCS8qIEdldCB0aGUgQ29tbWFuZCBUeXBlICovCi0JY21kX3R5cGUgPSBjdHJsX3dvcmQgJiBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfQ01EX1RZUEVfTTsKLQotCS8qIEdldCB0aGUgRFNQIGJ1ZmZlciBhZGRyZXNzICovCi0JZHNwX2FkZHIgPSAodm9pZCAqKSgoY3RybF93b3JkICYKLQkJCSAgICAgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX0RTUF9BRERSX00pICsKLQkJCSAgICAodWludDMyX3QpTVNNX0FENV9CQVNFKTsKLQotCS8qIFdlIGNhbiBvbmx5IGhhbmRsZSBUYXNrLXRvLUhvc3QgbWVzc2FnZXMgKi8KLQlpZiAoY21kX3R5cGUgIT0gQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX0NNRF9UQVNLX1RPX0hfVikgewotCQlNTV9FUlIoInVua25vd24gZHNwIGNtZF90eXBlICVkXG4iLCBjbWRfdHlwZSk7Ci0JCXJjID0gLUVJTzsKLQkJZ290byBkb25lOwotCX0KLQotCWFkc3BfcnRvc19yZWFkX2N0cmxfd29yZF9jbWRfdGFzdF90b19oX3YoaW5mbywgZHNwX2FkZHIpOwotCi0JY3RybF93b3JkID0gcmVhZGwoaW5mby0+cmVhZF9jdHJsKTsKLQljdHJsX3dvcmQgJj0gfkFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9SRUFEWV9NOwotCi0JLyogV3JpdGUgY3RybCB3b3JkIHRvIHRoZSBEU1AgKi8KLQl3cml0ZWwoY3RybF93b3JkLCBpbmZvLT5yZWFkX2N0cmwpOwotCi0JLyogR2VuZXJhdGUgYW4gaW50ZXJydXB0IHRvIHRoZSBEU1AgKi8KLQl3cml0ZWwoMSwgaW5mby0+c2VuZF9pcnEpOwotCi1kb25lOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkc3BfY21kX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBhZHNwX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGFkc3BfaW5mbyAqaW5mbyA9ICZhZHNwX2luZm87Ci0JaW50IGNudCA9IDA7Ci0JZm9yIChjbnQgPSAwOyBjbnQgPCAxNTsgY250KyspCi0JCWlmIChhZHNwX2dldF9ldmVudChpbmZvKSA8IDApCi0JCQlicmVhazsKLQlpZiAoY250ID4gaW5mby0+ZXZlbnRfYmFja2xvZ19tYXgpCi0JCWluZm8tPmV2ZW50X2JhY2tsb2dfbWF4ID0gY250OwotCWluZm8tPmV2ZW50c19yZWNlaXZlZCArPSBjbnQ7Ci0JaWYgKGNudCA9PSAxNSkKLQkJTU1fRVJSKCJ0b28gbWFueSAoJWQpIGV2ZW50cyBmb3Igc2luZ2xlIGlycSFcbiIsIGNudCk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1pbnQgYWRzcF9zZXRfY2xrcmF0ZShzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsIHVuc2lnbmVkIGxvbmcgY2xrX3JhdGUpCi17Ci0JaWYgKCFtb2R1bGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKG1vZHVsZS0+Y2xrICYmIGNsa19yYXRlKQotCQlyZXR1cm4gY2xrX3NldF9yYXRlKG1vZHVsZS0+Y2xrLCBjbGtfcmF0ZSk7Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotaW50IG1zbV9hZHNwX2dlbmVyYXRlX2V2ZW50KHZvaWQgKmRhdGEsCi0JCQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2QsCi0JCQl1bnNpZ25lZCBldmVudF9pZCwKLQkJCXVuc2lnbmVkIGV2ZW50X2xlbmd0aCwKLQkJCXVuc2lnbmVkIGV2ZW50X3NpemUsCi0JCQl2b2lkICptc2cpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl2b2lkICgqZnVuYykodm9pZCAqLCBzaXplX3QpOwotCi0JaWYgKCFtb2QpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGV2ZW50X3NpemUgPT0gc2l6ZW9mKHVpbnQzMl90KSkKLQkJZnVuYyA9IHJlYWRfZXZlbnRfMzI7Ci0JZWxzZSBpZiAoZXZlbnRfc2l6ZSA9PSBzaXplb2YodWludDE2X3QpKQotCQlmdW5jID0gcmVhZF9ldmVudF8xNjsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkc3BfY21kX2xvY2ssIGZsYWdzKTsKLQlyZWFkX2V2ZW50X2FkZHIgPSBtc2c7Ci0JcmVhZF9ldmVudF9zaXplID0gZXZlbnRfbGVuZ3RoOwotCW1vZC0+b3BzLT5ldmVudChkYXRhLCBldmVudF9pZCwgZXZlbnRfbGVuZ3RoLCBmdW5jKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZHNwX2NtZF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fYWRzcF9kdW1wKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSkKLXsKLQlpbnQgcmMgPSAwOwotCWlmICghbW9kdWxlKSB7Ci0JCU1NX0lORk8oIkludmFsaWQgbW9kdWxlLiBEdW1wcyBhcmUgbm90IGNvbGxlY3RlZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlNTV9JTkZPKCJzdGFydGluZyBEU1AgRFVNUFxuIik7Ci0JcmMgPSBycGNfYWRzcF9ydG9zX2FwcF90b19tb2RlbShSUENfQURTUF9SVE9TX0NNRF9DT1JFX0RVTVAsCi0JCQltb2R1bGUtPmlkLCBtb2R1bGUpOwotCU1NX0lORk8oIkRTUCBEVU1QIGRvbmUgcmMgPSVkXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTChtc21fYWRzcF9kdW1wKTsKLQotaW50IG1zbV9hZHNwX2VuYWJsZShzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGVfZW4gPSBOVUxMOwotCi0JaWYgKCFtb2R1bGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JTU1fSU5GTygiZW5hYmxlICclcydzdGF0ZVslZF0gaWRbJWRdXG4iLAotCQkJCW1vZHVsZS0+bmFtZSwgbW9kdWxlLT5zdGF0ZSwgbW9kdWxlLT5pZCk7Ci0JaWYgKCFzdHJuY21wKG1vZHVsZS0+bmFtZSwgIkpQRUdUQVNLIiwgc2l6ZW9mKG1vZHVsZS0+bmFtZSkpKQotCQltb2R1bGVfZW4gPSBmaW5kX2Fkc3BfbW9kdWxlX2J5X25hbWUoJmFkc3BfaW5mbywgIlZJREVPVEFTSyIpOwotCWVsc2UgaWYgKCFzdHJuY21wKG1vZHVsZS0+bmFtZSwgIlZJREVPVEFTSyIsIHNpemVvZihtb2R1bGUtPm5hbWUpKSkKLQkJbW9kdWxlX2VuID0gZmluZF9hZHNwX21vZHVsZV9ieV9uYW1lKCZhZHNwX2luZm8sICJKUEVHVEFTSyIpOwotCWlmIChtb2R1bGVfZW4pIHsKLQkJbXV0ZXhfbG9jaygmbW9kdWxlX2VuLT5sb2NrKTsKLQkJaWYgKG1vZHVsZV9lbi0+c3RhdGUgPT0gQURTUF9TVEFURV9FTkFCTEVEIHx8Ci0JCQltb2R1bGVfZW4tPnN0YXRlID09IEFEU1BfU1RBVEVfRU5BQkxJTkcpIHsKLQkJCU1NX0VSUigiYm90aCBqcGVnIGFuZCB2aWRlbyBtb2R1bGUgY2FuJ3QiXAotCQkJCSIgZXhpc3QgYXQgYSB0aW1lXG4iKTsKLQkJCW11dGV4X3VubG9jaygmbW9kdWxlX2VuLT5sb2NrKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCW11dGV4X3VubG9jaygmbW9kdWxlX2VuLT5sb2NrKTsKLQl9Ci0KLQltdXRleF9sb2NrKCZtb2R1bGUtPmxvY2spOwotCXN3aXRjaCAobW9kdWxlLT5zdGF0ZSkgewotCWNhc2UgQURTUF9TVEFURV9ESVNBQkxFRDoKLQkJcmMgPSBycGNfYWRzcF9ydG9zX2FwcF90b19tb2RlbShSUENfQURTUF9SVE9TX0NNRF9FTkFCTEUsCi0JCQkJCQltb2R1bGUtPmlkLCBtb2R1bGUpOwotCQlpZiAocmMpCi0JCQlicmVhazsKLQkJbW9kdWxlLT5zdGF0ZSA9IEFEU1BfU1RBVEVfRU5BQkxJTkc7Ci0JCW11dGV4X3VubG9jaygmbW9kdWxlLT5sb2NrKTsKLQkJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQobW9kdWxlLT5zdGF0ZV93YWl0LAotCQkJCQltb2R1bGUtPnN0YXRlICE9IEFEU1BfU1RBVEVfRU5BQkxJTkcsCi0JCQkJCTEgKiBIWik7Ci0JCW11dGV4X2xvY2soJm1vZHVsZS0+bG9jayk7Ci0JCWlmIChtb2R1bGUtPnN0YXRlID09IEFEU1BfU1RBVEVfRU5BQkxFRCkgewotCQkJcmMgPSAwOwotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJtb2R1bGUgJyVzJyBlbmFibGUgdGltZWQgb3V0XG4iLCBtb2R1bGUtPm5hbWUpOwotCQkJbXNtX2Fkc3BfZHVtcChtb2R1bGUpOwotCQkJcmMgPSAtRVRJTUVET1VUOwotCQl9Ci0JCWlmIChtb2R1bGUtPm9wZW5fY291bnQrKyA9PSAwICYmIG1vZHVsZS0+Y2xrKQotCQkJY2xrX3ByZXBhcmVfZW5hYmxlKG1vZHVsZS0+Y2xrKTsKLQotCQltdXRleF9sb2NrKCZhZHNwX29wZW5fbG9jayk7Ci0JCWlmIChhZHNwX29wZW5fY291bnQrKyA9PSAwKSB7Ci0JCQllbmFibGVfaXJxKGFkc3BfaW5mby5pbnRfYWRzcCk7Ci0JCQlwcmV2ZW50X3N1c3BlbmQoKTsKLQkJfQotCQltdXRleF91bmxvY2soJmFkc3Bfb3Blbl9sb2NrKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRFNQX1NUQVRFX0VOQUJMSU5HOgotCQlNTV9EQkcoIm1vZHVsZSAnJXMnIGVuYWJsZSBpbiBwcm9ncmVzc1xuIiwgbW9kdWxlLT5uYW1lKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRFNQX1NUQVRFX0VOQUJMRUQ6Ci0JCU1NX0RCRygibW9kdWxlICclcycgYWxyZWFkeSBlbmFibGVkXG4iLCBtb2R1bGUtPm5hbWUpOwotCQlicmVhazsKLQljYXNlIEFEU1BfU1RBVEVfRElTQUJMSU5HOgotCQlNTV9FUlIoIm1vZHVsZSAnJXMnIGRpc2FibGUgaW4gcHJvZ3Jlc3NcbiIsIG1vZHVsZS0+bmFtZSk7Ci0JCXJjID0gLUVCVVNZOwotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZtb2R1bGUtPmxvY2spOwotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2Fkc3BfZW5hYmxlKTsKLQotaW50IG1zbV9hZHNwX2Rpc2FibGVfZXZlbnRfcnNwKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSkKLXsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFtb2R1bGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmbW9kdWxlLT5sb2NrKTsKLQotCXJjID0gcnBjX2Fkc3BfcnRvc19hcHBfdG9fbW9kZW0oUlBDX0FEU1BfUlRPU19DTURfRElTQUJMRV9FVkVOVF9SU1AsCi0JCQkJCQkJbW9kdWxlLT5pZCwgbW9kdWxlKTsKLQltdXRleF91bmxvY2soJm1vZHVsZS0+bG9jayk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9hZHNwX2Rpc2FibGVfZXZlbnRfcnNwKTsKLQotc3RhdGljIGludCBtc21fYWRzcF9kaXNhYmxlX2xvY2tlZChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmICghbW9kdWxlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN3aXRjaCAobW9kdWxlLT5zdGF0ZSkgewotCWNhc2UgQURTUF9TVEFURV9ESVNBQkxFRDoKLQkJTU1fREJHKCJtb2R1bGUgJyVzJyBhbHJlYWR5IGRpc2FibGVkXG4iLCBtb2R1bGUtPm5hbWUpOwotCQlicmVhazsKLQljYXNlIEFEU1BfU1RBVEVfRU5BQkxJTkc6Ci0JY2FzZSBBRFNQX1NUQVRFX0VOQUJMRUQ6Ci0JCXJjID0gcnBjX2Fkc3BfcnRvc19hcHBfdG9fbW9kZW0oUlBDX0FEU1BfUlRPU19DTURfRElTQUJMRSwKLQkJCQkJCW1vZHVsZS0+aWQsIG1vZHVsZSk7Ci0JCW1vZHVsZS0+c3RhdGUgPSBBRFNQX1NUQVRFX0RJU0FCTEVEOwotCQlpZiAoLS1tb2R1bGUtPm9wZW5fY291bnQgPT0gMCAmJiBtb2R1bGUtPmNsaykKLQkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShtb2R1bGUtPmNsayk7Ci0JCW11dGV4X2xvY2soJmFkc3Bfb3Blbl9sb2NrKTsKLQkJaWYgKC0tYWRzcF9vcGVuX2NvdW50ID09IDApIHsKLQkJCWRpc2FibGVfaXJxKGFkc3BfaW5mby5pbnRfYWRzcCk7Ci0JCQlhbGxvd19zdXNwZW5kKCk7Ci0JCQlNTV9EQkcoImRpc2FibGUgaW50ZXJydXB0XG4iKTsKLQkJfQotCQltdXRleF91bmxvY2soJmFkc3Bfb3Blbl9sb2NrKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2Fkc3BfZGlzYWJsZShzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUpCi17Ci0JaW50IHJjOwotCi0JaWYgKCFtb2R1bGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JTU1fSU5GTygiZGlzYWJsZSAnJXMnXG4iLCBtb2R1bGUtPm5hbWUpOwotCW11dGV4X2xvY2soJm1vZHVsZS0+bG9jayk7Ci0JcmMgPSBtc21fYWRzcF9kaXNhYmxlX2xvY2tlZChtb2R1bGUpOwotCW11dGV4X3VubG9jaygmbW9kdWxlLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9hZHNwX2Rpc2FibGUpOwotCi1zdGF0aWMgaW50IG1zbV9hZHNwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JdW5zaWduZWQgY291bnQ7Ci0JaW50IHJjLCBpOwotCi0JYWRzcF9pbmZvLmludF9hZHNwID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAoYWRzcF9pbmZvLmludF9hZHNwIDwgMCkgewotCQlNTV9FUlIoIm5vIGlycSByZXNvdXJjZT9cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQl3YWtlX2xvY2tfaW5pdCgmYWRzcF93YWtlX2xvY2ssIFdBS0VfTE9DS19TVVNQRU5ELCAiYWRzcCIpOwotCWFkc3BfaW5mby5pbml0X2luZm9fcHRyID0ga3phbGxvYygKLQkJKHNpemVvZihzdHJ1Y3QgYWRzcF9ydG9zX21wX210b2FfaW5pdF9pbmZvX3R5cGUpKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhZHNwX2luZm8uaW5pdF9pbmZvX3B0cikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyYyA9IGFkc3BfaW5pdF9pbmZvKCZhZHNwX2luZm8pOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCWFkc3BfaW5mby5zZW5kX2lycSArPSAodWludDMyX3QpIE1TTV9BRDVfQkFTRTsKLQlhZHNwX2luZm8ucmVhZF9jdHJsICs9ICh1aW50MzJfdCkgTVNNX0FENV9CQVNFOwotCWFkc3BfaW5mby53cml0ZV9jdHJsICs9ICh1aW50MzJfdCkgTVNNX0FENV9CQVNFOwotCWNvdW50ID0gYWRzcF9pbmZvLm1vZHVsZV9jb3VudDsKLQotCWFkc3BfbW9kdWxlcyA9IGt6YWxsb2MoCi0JCShzaXplb2Yoc3RydWN0IG1zbV9hZHNwX21vZHVsZSkgKyBzaXplb2Yodm9pZCAqKSkgKgotCQljb3VudCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhZHNwX21vZHVsZXMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYWRzcF9pbmZvLmlkX3RvX21vZHVsZSA9ICh2b2lkICopIChhZHNwX21vZHVsZXMgKyBjb3VudCk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmYWRzcF9jbWRfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkc3Bfd3JpdGVfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYWRzcF9pbmZvLmxvY2spOwotCi0JcmMgPSByZXF1ZXN0X2lycShhZHNwX2luZm8uaW50X2Fkc3AsIGFkc3BfaXJxX2hhbmRsZXIsCi0JCQlJUlFGX1RSSUdHRVJfUklTSU5HLCAiYWRzcCIsIDApOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZmFpbF9yZXF1ZXN0X2lycTsKLQlkaXNhYmxlX2lycShhZHNwX2luZm8uaW50X2Fkc3ApOwotCi0JcnBjX2NiX3NlcnZlcl9jbGllbnQgPSBtc21fcnBjX29wZW4oKTsKLQlpZiAoSVNfRVJSKHJwY19jYl9zZXJ2ZXJfY2xpZW50KSkgewotCQlycGNfY2Jfc2VydmVyX2NsaWVudCA9IE5VTEw7Ci0JCXJjID0gUFRSX0VSUihycGNfY2Jfc2VydmVyX2NsaWVudCk7Ci0JCU1NX0VSUigiY291bGQgbm90IGNyZWF0ZSBycGMgc2VydmVyICglZClcbiIsIHJjKTsKLQkJZ290byBmYWlsX3JwY19vcGVuOwotCX0KLQotCXJjID0gbXNtX3JwY19yZWdpc3Rlcl9zZXJ2ZXIocnBjX2NiX3NlcnZlcl9jbGllbnQsCi0JCQkJICAgICBycGNfYWRzcF9ydG9zX210b2FfcHJvZywKLQkJCQkgICAgIHJwY19hZHNwX3J0b3NfbXRvYV92ZXJzKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgcmVnaXN0ZXIgY2FsbGJhY2sgc2VydmVyICglZClcbiIsIHJjKTsKLQkJZ290byBmYWlsX3JwY19yZWdpc3RlcjsKLQl9Ci0KLQkvKiBzY2hlZHVsZSBzdGFydCBvZiBrZXJuZWwgdGhyZWFkIGxhdGVyIHVzaW5nIHdvcmsgcXVldWUgKi8KLQlxdWV1ZV93b3JrKG1zbV9hZHNwX3Byb2JlX3dvcmtfcXVldWUsICZtc21fYWRzcF9wcm9iZV93b3JrKTsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZCA9IGFkc3BfbW9kdWxlcyArIGk7Ci0JCW11dGV4X2luaXQoJm1vZC0+bG9jayk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1vZC0+c3RhdGVfd2FpdCk7Ci0JCW1vZC0+aW5mbyA9ICZhZHNwX2luZm87Ci0JCW1vZC0+bmFtZSA9IGFkc3BfaW5mby5tb2R1bGVbaV0ubmFtZTsKLQkJbW9kLT5pZCA9IGFkc3BfaW5mby5tb2R1bGVbaV0uaWQ7Ci0JCWlmIChhZHNwX2luZm8ubW9kdWxlW2ldLmNsa19uYW1lKQotCQkJbW9kLT5jbGsgPSBjbGtfZ2V0KE5VTEwsIGFkc3BfaW5mby5tb2R1bGVbaV0uY2xrX25hbWUpOwotCQllbHNlCi0JCQltb2QtPmNsayA9IE5VTEw7Ci0JCWlmIChtb2QtPmNsayAmJiBhZHNwX2luZm8ubW9kdWxlW2ldLmNsa19yYXRlKQotCQkJY2xrX3NldF9yYXRlKG1vZC0+Y2xrLCBhZHNwX2luZm8ubW9kdWxlW2ldLmNsa19yYXRlKTsKLQkJbW9kLT52ZXJpZnlfY21kID0gYWRzcF9pbmZvLm1vZHVsZVtpXS52ZXJpZnlfY21kOwotCQltb2QtPnBhdGNoX2V2ZW50ID0gYWRzcF9pbmZvLm1vZHVsZVtpXS5wYXRjaF9ldmVudDsKLQkJSU5JVF9ITElTVF9IRUFEKCZtb2QtPmlvbl9yZWdpb25zKTsKLQkJbW9kLT5wZGV2Lm5hbWUgPSBhZHNwX2luZm8ubW9kdWxlW2ldLnBkZXZfbmFtZTsKLQkJbW9kLT5wZGV2LmlkID0gLTE7Ci0JCWFkc3BfaW5mby5pZF90b19tb2R1bGVbaV0gPSBtb2Q7Ci0JCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbW9kLT5wZGV2KTsKLQl9Ci0KLQltc21fYWRzcF9wdWJsaXNoX2NkZXZzKGFkc3BfbW9kdWxlcywgY291bnQpOwotCXJtdGFza19pbml0KCk7Ci0KLQlyZXR1cm4gMDsKLQotZmFpbF9ycGNfcmVnaXN0ZXI6Ci0JbXNtX3JwY19jbG9zZShycGNfY2Jfc2VydmVyX2NsaWVudCk7Ci0JcnBjX2NiX3NlcnZlcl9jbGllbnQgPSBOVUxMOwotZmFpbF9ycGNfb3BlbjoKLQllbmFibGVfaXJxKGFkc3BfaW5mby5pbnRfYWRzcCk7Ci0JZnJlZV9pcnEoYWRzcF9pbmZvLmludF9hZHNwLCAwKTsKLWZhaWxfcmVxdWVzdF9pcnE6Ci0Ja2ZyZWUoYWRzcF9tb2R1bGVzKTsKLQlrZnJlZShhZHNwX2luZm8uaW5pdF9pbmZvX3B0cik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBhZHNwX3Byb2JlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCS8qIHN0YXJ0IHRoZSBrZXJuZWwgdGhyZWFkIHRvIHByb2Nlc3MgdGhlIGNhbGxiYWNrcyAqLwotCWt0aHJlYWRfcnVuKGFkc3BfcnBjX3RocmVhZCwgTlVMTCwgImthZHNwZCIpOwotfQotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgaW50IGdldF9wYXJhbWV0ZXJzKGNoYXIgKmJ1ZiwgbG9uZyBpbnQgKnBhcmFtMSwgaW50IG51bV9vZl9wYXIpCi17Ci0JY2hhciAqdG9rZW47Ci0JaW50IGJhc2UsIGNudDsKLQotCXRva2VuID0gc3Ryc2VwKCZidWYsICIgIik7Ci0KLQlmb3IgKGNudCA9IDA7IGNudCA8IG51bV9vZl9wYXI7IGNudCsrKSB7Ci0JCWlmICh0b2tlbiAhPSBOVUxMKSB7Ci0JCQlpZiAoKHRva2VuWzFdID09ICd4JykgfHwgKHRva2VuWzFdID09ICdYJykpCi0JCQkJYmFzZSA9IDE2OwotCQkJZWxzZQotCQkJCWJhc2UgPSAxMDsKLQotCQkJaWYgKHN0cmljdF9zdHJ0b3VsKHRva2VuLCBiYXNlLCAmcGFyYW0xW2NudF0pICE9IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCXRva2VuID0gc3Ryc2VwKCZidWYsICIgIik7Ci0JCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBhZHNwX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlwcl9kZWJ1ZygiYWRzcCBkZWJ1Z2ZzIG9wZW5lZFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgc3NpemVfdCBhZHNwX2RlYnVnX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKLXsKLQljaGFyICphY2Nlc3Nfc3RyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgbGJ1ZlszMl07Ci0JaW50IHJjOwotCWxvbmcgaW50IHBhcmFtWzVdOwotCi0JaWYgKGNudCA+IHNpemVvZihsYnVmKSAtIDEpCi0JCXJldHVybiAtRUlOVkFMOwotCXJjID0gY29weV9mcm9tX3VzZXIobGJ1ZiwgYnVmLCBjbnQpOwotCWlmIChyYykgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY29weSBkYXRhIGZyb20gdXNlciBzcGFjZVxuIik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQlsYnVmW2NudF0gPSAnXDAnOwotCi0JaWYgKCFzdHJjbXAoYWNjZXNzX3N0ciwgIndyaXRlX2xvZyIpKSB7Ci0JCWlmIChnZXRfcGFyYW1ldGVycyhsYnVmLCBwYXJhbSwgMSkgPT0gMCkgewotCQkJc3dpdGNoIChwYXJhbVswXSkgewotCQkJY2FzZSAxOgotCQkJCWlmICh3ZHVtcCA8PSAwKQotCQkJCQl3ZHVtcCA9IDE7Ci0JCQkJcHJfZGVidWcoIndyaXRlIGNtZCB0byBEU1AoQS0+RCkgZHVtcCBcCi0JCQkJCSBzdGFydGVkOiVkXG4iLCB3ZHVtcCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDA6Ci0JCQkJaWYgKHdkdW1wID4gMCkKLQkJCQkJd2R1bXAgPSAwOwotCQkJCXByX2RlYnVnKCJTdG9wIHdyaXRlIGNtZCB0byBcCi0JCQkJCSBEU1AoQS0+RCk6JWRcbiIsIHdkdW1wKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UKLQkJCXJjID0gLUVJTlZBTDsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoYWNjZXNzX3N0ciwgInJlYWRfbG9nIikpIHsKLQkJaWYgKGdldF9wYXJhbWV0ZXJzKGxidWYsIHBhcmFtLCAxKSA9PSAwKSB7Ci0JCQlzd2l0Y2ggKHBhcmFtWzBdKSB7Ci0JCQljYXNlIDE6Ci0JCQkJaWYgKHJkdW1wIDw9IDApCi0JCQkJCXJkdW1wID0gMTsKLQkJCQlwcl9kZWJ1Zygid3JpdGUgY21kIGZyb20gRFNQKEQtPkEpIGR1bXAgXAotCQkJCQlzdGFydGVkOiVkXG4iLCB3ZHVtcCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDA6Ci0JCQkJaWYgKHJkdW1wID4gMCkKLQkJCQkJcmR1bXAgPSAwOwotCQkJCXByX2RlYnVnKCJTdG9wIHdyaXRlIGNtZCBmcm9tIFwKLQkJCQkJRFNQKEQtPkEpOiVkXG4iLCB3ZHVtcCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlCi0JCQlyYyA9IC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQlpZiAocmMgPT0gMCkKLQkJcmMgPSBjbnQ7Ci0JZWxzZSB7Ci0JCXByX2VycigiJXM6IHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCXByX2luZm8oIlxuV3JvbmcgY29tbWFuZDogVXNlID0+XG4iKTsKLQkJcHJfaW5mbygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JCXByX2luZm8oIlRvIFN0YXJ0IEEtPkQ6OiBlY2hvIFwiMVwiPi9zeXMva2VybmVsL2RlYnVnLyBcCi0JCQlhZHNwX2NtZC93cml0ZV9sb2dcbiIpOwotCQlwcl9pbmZvKCJUbyBTdGFydCBELT5BOjogZWNobyBcIjFcIj4vc3lzL2tlcm5lbC9kZWJ1Zy8gXAotCQkJYWRzcF9jbWQvcmVhZF9sb2dcbiIpOwotCQlwcl9pbmZvKCJUbyBTdG9wICBBLT5EOjogZWNobyBcIjBcIj4vc3lzL2tlcm5lbC9kZWJ1Zy8gXAotCQkJYWRzcF9jbWQvd3JpdGVfbG9nXG4iKTsKLQkJcHJfaW5mbygiVG8gU3RvcCAgRC0+QTo6IGVjaG8gXCIwXCI+L3N5cy9rZXJuZWwvZGVidWcvIFwKLQkJCWFkc3BfY21kL3JlYWRfbG9nXG4iKTsKLQkJcHJfaW5mbygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2Fkc3BfZHJpdmVyID0gewotCS5wcm9iZSA9IG1zbV9hZHNwX3Byb2JlLAotCS5kcml2ZXIgPSB7Ci0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciBtc21fYWRzcF9kcml2ZXJfbmFtZVtdID0gIm1zbV9hZHNwIjsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWRzcF9kZWJ1Z19mb3BzID0gewotCS53cml0ZSA9IGFkc3BfZGVidWdfd3JpdGUsCi0JLm9wZW4gPSBhZHNwX2RlYnVnX29wZW4sCi19OwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgX19pbml0IGFkc3BfaW5pdCh2b2lkKQotewotCWludCByYzsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCWRlbnRyeV9hZHNwICAgID0gZGVidWdmc19jcmVhdGVfZGlyKCJhZHNwX2NtZCIsIDApOwotCWlmICghSVNfRVJSKGRlbnRyeV9hZHNwKSkgewotCQlkZW50cnlfd2RhdGEgICA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoIndyaXRlX2xvZyIsIFwKLQkJIFNfSUZSRUcgfCBTX0lSVUdPLCBkZW50cnlfYWRzcCwKLQkJICh2b2lkICopICJ3cml0ZV9sb2ciICwgJmFkc3BfZGVidWdfZm9wcyk7Ci0JCWRlbnRyeV9yZGF0YSAgID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmVhZF9sb2ciLCBcCi0JCSBTX0lGUkVHIHwgU19JUlVHTywgZGVudHJ5X2Fkc3AsCi0JCSAodm9pZCAqKSAicmVhZF9sb2ciLCAmYWRzcF9kZWJ1Z19mb3BzKTsKLQl9Ci0JcmR1bXAgPSAwOwotCXdkdW1wID0gMDsKLSNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KLQotCXJwY19hZHNwX3J0b3NfYXRvbV9wcm9nID0gMHgzMDAwMDAwYTsKLQlycGNfYWRzcF9ydG9zX2F0b21fdmVycyA9IDB4MTAwMDE7Ci0JcnBjX2Fkc3BfcnRvc19hdG9tX3ZlcnNfY29tcCA9IDB4MDAwMTAwMDE7Ci0JcnBjX2Fkc3BfcnRvc19tdG9hX3Byb2cgPSAweDMwMDAwMDBiOwotI2lmIENPTkZJR19BRFNQX1JQQ19WRVIgPiAweDMwMDAxCi0JcnBjX2Fkc3BfcnRvc19tdG9hX3ZlcnMgPSAweDMwMDAyOwotCXJwY19hZHNwX3J0b3NfbXRvYV92ZXJzX2NvbXAgPSAweDAwMDMwMDAyOwotI2Vsc2UKLQlycGNfYWRzcF9ydG9zX210b2FfdmVycyA9IDB4MzAwMDE7Ci0JcnBjX2Fkc3BfcnRvc19tdG9hX3ZlcnNfY29tcCA9IDB4MDAwMzAwMDE7Ci0jZW5kaWYKLQotCW1zbV9hZHNwX3Byb2JlX3dvcmtfcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKCJtc21fYWRzcF9wcm9iZSIpOwotCWlmIChtc21fYWRzcF9wcm9iZV93b3JrX3F1ZXVlID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCW1zbV9hZHNwX2RyaXZlci5kcml2ZXIubmFtZSA9IG1zbV9hZHNwX2RyaXZlcl9uYW1lOwotCXJjID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fYWRzcF9kcml2ZXIpOwotCU1NX0lORk8oIiVzIC0tICVkXG4iLCBtc21fYWRzcF9kcml2ZXJfbmFtZSwgcmMpOwotCXJldHVybiByYzsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGFkc3BfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwLmggYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MjJkODguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3AuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEwLCAyMDEyIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQXV0aG9yOiBJbGl5YW4gTWFsY2hldiA8aWJtQGFuZHJvaWQuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX0FSQ0hfQVJNX01BQ0hfTVNNX0FEU1BfSAotI2RlZmluZSBfQVJDSF9BUk1fTUFDSF9NU01fQURTUF9ICi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX3JwY3JvdXRlci5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLQotaW50IGFkc3BfcG1lbV9maXh1cChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsIHZvaWQgKiphZGRyLAotCQkgICAgdW5zaWduZWQgbG9uZyBsZW4pOwotaW50IGFkc3BfaW9uX2RvX2NhY2hlX29wKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwgdm9pZCAqYWRkciwKLQkJCXZvaWQgKnBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgY21kKTsKLWludCBhZHNwX2lvbl9maXh1cF9rdmFkZHIoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLCB2b2lkICoqYWRkciwKLQkJCSAgIHVuc2lnbmVkIGxvbmcgKmt2YWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCi0JCQkgICBzdHJ1Y3QgZmlsZSAqKmZpbHAsIHVuc2lnbmVkIGxvbmcgKm9mZnNldCk7Ci1pbnQgYWRzcF9wbWVtX3BhZGRyX2ZpeHVwKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwgdm9pZCAqKmFkZHIpOwotCi1pbnQgYWRzcF92ZmVfdmVyaWZ5X2NtZChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCQl1bnNpZ25lZCBpbnQgcXVldWVfaWQsIHZvaWQgKmNtZF9kYXRhLAotCQkJc2l6ZV90IGNtZF9zaXplKTsKLWludCBhZHNwX2pwZWdfdmVyaWZ5X2NtZChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCQkgdW5zaWduZWQgaW50IHF1ZXVlX2lkLCB2b2lkICpjbWRfZGF0YSwKLQkJCSBzaXplX3QgY21kX3NpemUpOwotaW50IGFkc3BfbHBtX3ZlcmlmeV9jbWQoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotCQkJdW5zaWduZWQgaW50IHF1ZXVlX2lkLCB2b2lkICpjbWRfZGF0YSwKLQkJCXNpemVfdCBjbWRfc2l6ZSk7Ci1pbnQgYWRzcF92aWRlb192ZXJpZnlfY21kKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwKLQkJCSAgdW5zaWduZWQgaW50IHF1ZXVlX2lkLCB2b2lkICpjbWRfZGF0YSwKLQkJCSAgc2l6ZV90IGNtZF9zaXplKTsKLWludCBhZHNwX3ZpZGVvZW5jX3ZlcmlmeV9jbWQoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotCQkJICB1bnNpZ25lZCBpbnQgcXVldWVfaWQsIHZvaWQgKmNtZF9kYXRhLAotCQkJICBzaXplX3QgY21kX3NpemUpOwotdm9pZCBxNWF1ZGlvX2RzcF9ub3RfcmVzcG9uZGluZyh2b2lkKTsKLQotc3RydWN0IGFkc3BfZXZlbnQ7Ci0KLWludCBhZHNwX3ZmZV9wYXRjaF9ldmVudChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCQlzdHJ1Y3QgYWRzcF9ldmVudCAqZXZlbnQpOwotCi1pbnQgYWRzcF9qcGVnX3BhdGNoX2V2ZW50KHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwKLQkJCXN0cnVjdCBhZHNwX2V2ZW50ICpldmVudCk7Ci0KLQotc3RydWN0IGFkc3BfbW9kdWxlX2luZm8gewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JY29uc3QgY2hhciAqcGRldl9uYW1lOwotCXVpbnQzMl90IGlkOwotCWNvbnN0IGNoYXIgKmNsa19uYW1lOwotCXVuc2lnbmVkIGxvbmcgY2xrX3JhdGU7Ci0JaW50ICgqdmVyaWZ5X2NtZCkgKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUqLCB1bnNpZ25lZCBpbnQsIHZvaWQgKiwKLQkJCSAgIHNpemVfdCk7Ci0JaW50ICgqcGF0Y2hfZXZlbnQpIChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlKiwgc3RydWN0IGFkc3BfZXZlbnQgKik7Ci19OwotCi0jZGVmaW5lIEFEU1BfRVZFTlRfTUFYX1NJWkUgNDk2Ci0jZGVmaW5lIEVWRU5UX0xFTiAgICAgICAxMgotI2RlZmluZSBFVkVOVF9NU0dfSUQgKCh1aW50MTZfdCl+MCkKLQotc3RydWN0IGFkc3BfZXZlbnQgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQl1aW50MzJfdCBzaXplOyAvKiBhbHdheXMgaW4gYnl0ZXMgKi8KLQl1aW50MTZfdCBtc2dfaWQ7Ci0JdWludDE2X3QgdHlwZTsgLyogMCBmb3IgbXNncyAoZnJvbSBhRFNQKSwgLTEgZm9yIGV2ZW50cyAoZnJvbSBBUk05KSAqLwotCWludCBpczE2OyAvKiBhbHdheXMgMCAobXNnIGlzIDMyLWJpdCkgd2hlbiB0aGUgZXZlbnQgdHlwZSBpcyAxKEFSTTkpICovCi0JdW5pb24gewotCQl1aW50MTZfdCBtc2cxNltBRFNQX0VWRU5UX01BWF9TSVpFIC8gMl07Ci0JCXVpbnQzMl90IG1zZzMyW0FEU1BfRVZFTlRfTUFYX1NJWkUgLyA0XTsKLQl9IGRhdGE7Ci19OwotCi1zdHJ1Y3QgYWRzcF9pbmZvIHsKLQl1aW50MzJfdCBzZW5kX2lycTsKLQl1aW50MzJfdCByZWFkX2N0cmw7Ci0JdWludDMyX3Qgd3JpdGVfY3RybDsKLQotCXVpbnQzMl90IG1heF9tc2cxNl9zaXplOwotCXVpbnQzMl90IG1heF9tc2czMl9zaXplOwotCi0JdWludDMyX3QgbWF4X3Rhc2tfaWQ7Ci0JdWludDMyX3QgbWF4X21vZHVsZV9pZDsKLQl1aW50MzJfdCBtYXhfcXVldWVfaWQ7Ci0JdWludDMyX3QgbWF4X2ltYWdlX2lkOwotCi0JLyogZm9yIGVhY2ggaW1hZ2UgaWQsIGEgbWFwIG9mIHF1ZXVlIGlkIHRvIG9mZnNldCAqLwotCXVpbnQzMl90ICoqcXVldWVfb2Zmc2V0OwotCi0JLyogZm9yIGVhY2ggaW1hZ2UgaWQsIGEgbWFwIG9mIHRhc2sgaWQgdG8gbW9kdWxlIGlkICovCi0JdWludDMyX3QgKip0YXNrX3RvX21vZHVsZTsKLQotCS8qIGZvciBlYWNoIG1vZHVsZSBpZCwgbWFwIG9mIG1vZHVsZSBpZCB0byBtb2R1bGUgKi8KLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICoqaWRfdG9fbW9kdWxlOwotCi0JdWludDMyX3QgbW9kdWxlX2NvdW50OwotCXN0cnVjdCBhZHNwX21vZHVsZV9pbmZvICptb2R1bGU7Ci0KLQkvKiBzdGF0cyAqLwotCXVpbnQzMl90IGV2ZW50c19yZWNlaXZlZDsKLQl1aW50MzJfdCBldmVudF9iYWNrbG9nX21heDsKLQotCS8qIHJwY19jbGllbnQgZm9yIGluaXRfaW5mbyAqLwotCXN0cnVjdCBtc21fcnBjX2VuZHBvaW50CSppbml0X2luZm9fcnBjX2NsaWVudDsKLQlzdHJ1Y3QgYWRzcF9ydG9zX21wX210b2FfaW5pdF9pbmZvX3R5cGUJKmluaXRfaW5mb19wdHI7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJaW5pdF9pbmZvX3dhaXQ7Ci0JdW5zaWduZWQgCQlpbml0X2luZm9fc3RhdGU7Ci0Jc3RydWN0IG11dGV4IGxvY2s7Ci0KLQkvKiBJbnRlcnJ1cHQgdmFsdWUgKi8KLQlpbnQgaW50X2Fkc3A7Ci19OwotCi0jZGVmaW5lIFJQQ19BRFNQX1JUT1NfQVRPTV9OVUxMX1BST0MgMAotI2RlZmluZSBSUENfQURTUF9SVE9TX01UT0FfTlVMTF9QUk9DIDAKLSNkZWZpbmUgUlBDX0FEU1BfUlRPU19BUFBfVE9fTU9ERU1fUFJPQyAyCi0jZGVmaW5lIFJQQ19BRFNQX1JUT1NfTU9ERU1fVE9fQVBQX1BST0MgMgotI2RlZmluZSBSUENfQURTUF9SVE9TX01UT0FfRVZFTlRfSU5GT19QUk9DIDMKLSNkZWZpbmUgUlBDX0FEU1BfUlRPU19NVE9BX0lOSVRfSU5GT19QUk9DIDQKLQotZW51bSBycGNfYWRzcF9ydG9zX3Byb2NfdHlwZSB7Ci0JUlBDX0FEU1BfUlRPU19QUk9DX05PTkUgPSAwLAotCVJQQ19BRFNQX1JUT1NfUFJPQ19NT0RFTSA9IDEsCi0JUlBDX0FEU1BfUlRPU19QUk9DX0FQUFMgPSAyLAotfTsKLQotZW51bSB7Ci0JUlBDX0FEU1BfUlRPU19DTURfUkVHSVNURVJfQVBQLAotCVJQQ19BRFNQX1JUT1NfQ01EX0VOQUJMRSwKLQlSUENfQURTUF9SVE9TX0NNRF9ESVNBQkxFLAotCVJQQ19BRFNQX1JUT1NfQ01EX0tFUk5FTF9DT01NQU5ELAotCVJQQ19BRFNQX1JUT1NfQ01EXzE2X0NPTU1BTkQsCi0JUlBDX0FEU1BfUlRPU19DTURfMzJfQ09NTUFORCwKLQlSUENfQURTUF9SVE9TX0NNRF9ESVNBQkxFX0VWRU5UX1JTUCwKLQlSUENfQURTUF9SVE9TX0NNRF9SRU1PVEVfRVZFTlQsCi0JUlBDX0FEU1BfUlRPU19DTURfU0VUX1NUQVRFLAotCVJQQ19BRFNQX1JUT1NfQ01EX1JFTU9URV9JTklUX0lORk9fRVZFTlQsCi0JUlBDX0FEU1BfUlRPU19DTURfR0VUX0lOSVRfSU5GTywKLQlSUENfQURTUF9SVE9TX0NNRF9DT1JFX0RVTVAsCi19OwotCi1lbnVtIHJwY19hZHNwX3J0b3NfbW9kX3N0YXR1c190eXBlIHsKLQlSUENfQURTUF9SVE9TX01PRF9SRUFEWSwKLQlSUENfQURTUF9SVE9TX01PRF9ESVNBQkxFLAotCVJQQ19BRFNQX1JUT1NfU0VSVklDRV9SRVNFVCwKLQlSUENfQURTUF9SVE9TX0NNRF9GQUlMLAotCVJQQ19BRFNQX1JUT1NfQ01EX1NVQ0NFU1MsCi0JUlBDX0FEU1BfUlRPU19JTklUX0lORk8sCi0JUlBDX0FEU1BfUlRPU19ESVNBQkxFX0ZBSUwsCi19OwotCi1zdHJ1Y3QgcnBjX2Fkc3BfcnRvc19hcHBfdG9fbW9kZW1fYXJnc190IHsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIGhkcjsKLQl1aW50MzJfdCBnb3RpdDsgLyogaWYgMSwgdGhlIG5leHQgZWxlbWVudHMgYXJlIHByZXNlbnQgKi8KLQl1aW50MzJfdCBjbWQ7IC8qIGUuZy4sIFJQQ19BRFNQX1JUT1NfQ01EX1JFR0lTVEVSX0FQUCAqLwotCXVpbnQzMl90IHByb2NfaWQ7IC8qIGUuZy4sIFJQQ19BRFNQX1JUT1NfUFJPQ19BUFBTICovCi0JdWludDMyX3QgbW9kdWxlOyAvKiBlLmcuLCBRRFNQX01PRFVMRV9BVURQUFRBU0sgKi8KLX07Ci0KLWVudW0gcWRzcF9pbWFnZV90eXBlIHsKLQlRRFNQX0lNQUdFX0NPTUJPLAotCVFEU1BfSU1BR0VfR0FVRElPLAotCVFEU1BfSU1BR0VfUVRWX0xQLAotCVFEU1BfSU1BR0VfTUFYLAotCS8qIERPIE5PVCBVU0U6IEZvcmNlIHRoaXMgZW51bSB0byBiZSBhIDMyYml0IHR5cGUgdG8gaW1wcm92ZSBzcGVlZCAqLwotCVFEU1BfSU1BR0VfMzJCSVRfRFVNTVkgPSAweDEwMDAwCi19OwotCi1zdHJ1Y3QgYWRzcF9ydG9zX21wX210b2FfaGVhZGVyX3R5cGUgewotCWVudW0gcnBjX2Fkc3BfcnRvc19tb2Rfc3RhdHVzX3R5cGUgIGV2ZW50OwotCWVudW0gcnBjX2Fkc3BfcnRvc19wcm9jX3R5cGUgICAgICAgIHByb2NfaWQ7Ci19OwotCi0vKiBBRFNQIFJUT1MgTVAgQ29tbXVuaWNhdGlvbnMgLSBNb2RlbSB0byBBUFAncyAgRXZlbnQgSW5mbyovCi1zdHJ1Y3QgYWRzcF9ydG9zX21wX210b2FfdHlwZSB7Ci0JdWludDMyX3QJbW9kdWxlOwotCXVpbnQzMl90CWltYWdlOwotCXVpbnQzMl90CWFwcHNfb2t0czsKLX07Ci0KLS8qIEFEU1AgUlRPUyBNUCBDb21tdW5pY2F0aW9ucyAtIE1vZGVtIHRvIEFQUCdzIEluaXQgSW5mbyAgKi8KLSNpZiBDT05GSUdfQURTUF9SUENfVkVSID4gMHgzMDAwMQotI2RlZmluZSBJTUdfTUFYICAgICAgICAgMgotI2RlZmluZSBFTlRSSUVTX01BWCAgICAgMzYKLSNkZWZpbmUgTU9EVUxFU19NQVggICAgIDY0Ci0jZWxzZQotI2RlZmluZSBJTUdfTUFYICAgICAgICAgNgotI2RlZmluZSBFTlRSSUVTX01BWCAgICAgNDgKLSNlbmRpZgotI2RlZmluZSBRVUVVRVNfTUFYICAgICAgNjQKLQotc3RydWN0IHF1ZXVlX3RvX29mZnNldF90eXBlIHsKLQl1aW50MzJfdAlxdWV1ZTsKLQl1aW50MzJfdAlvZmZzZXQ7Ci19OwotCi1zdHJ1Y3QgbW9kX3RvX3F1ZXVlX29mZnNldHMgewotCXVpbnQzMl90ICAgICAgICBtb2R1bGU7Ci0JdWludDMyX3QgICAgICAgIHFfdHlwZTsKLQl1aW50MzJfdCAgICAgICAgcV9tYXhfbGVuOwotfTsKLQotc3RydWN0IGFkc3BfcnRvc19tcF9tdG9hX2luaXRfaW5mb190eXBlIHsKLQl1aW50MzJfdAlpbWFnZV9jb3VudDsKLQl1aW50MzJfdAludW1fcXVldWVfb2Zmc2V0czsKLQlzdHJ1Y3QgcXVldWVfdG9fb2Zmc2V0X3R5cGUJcXVldWVfb2Zmc2V0c190YmxbSU1HX01BWF1bRU5UUklFU19NQVhdOwotCXVpbnQzMl90CW51bV90YXNrX21vZHVsZV9lbnRyaWVzOwotCXVpbnQzMl90CXRhc2tfdG9fbW9kdWxlX3RibFtJTUdfTUFYXVtFTlRSSUVTX01BWF07Ci0KLQl1aW50MzJfdAltb2R1bGVfdGFibGVfc2l6ZTsKLSNpZiBDT05GSUdfQURTUF9SUENfVkVSID4gMHgzMDAwMQotCXVpbnQzMl90CW1vZHVsZV9lbnRyaWVzW01PRFVMRVNfTUFYXTsKLSNlbHNlCi0JdWludDMyX3QJbW9kdWxlX2VudHJpZXNbRU5UUklFU19NQVhdOwotI2VuZGlmCi0JdWludDMyX3QJbW9kX3RvX3FfZW50cmllczsKLQlzdHJ1Y3QgbW9kX3RvX3F1ZXVlX29mZnNldHMJbW9kX3RvX3FfdGJsW0VOVFJJRVNfTUFYXTsKLQkvKgotCSAqIHF1ZXVlX29mZnNldHNbXSBpcyB0byBzdG9yZSBvbmx5IHF1ZXVlX29mZnNldHMKLQkgKi8KLQl1aW50MzJfdAlxdWV1ZV9vZmZzZXRzW0lNR19NQVhdW1FVRVVFU19NQVhdOwotfTsKLQotc3RydWN0IGFkc3BfcnRvc19tcF9tdG9hX3NfdHlwZSB7Ci0Jc3RydWN0IGFkc3BfcnRvc19tcF9tdG9hX2hlYWRlcl90eXBlIG1wX210b2FfaGVhZGVyOwotI2lmIENPTkZJR19BRFNQX1JQQ19WRVIgPT0gMHgzMDAwMQotCXVpbnQzMl90IGRlc2NfZmllbGQ7Ci0jZW5kaWYKLQl1bmlvbiB7Ci0JCXN0cnVjdCBhZHNwX3J0b3NfbXBfbXRvYV9pbml0X2luZm9fdHlwZSBtcF9tdG9hX2luaXRfcGFja2V0OwotCQlzdHJ1Y3QgYWRzcF9ydG9zX21wX210b2FfdHlwZSBtcF9tdG9hX3BhY2tldDsKLQl9IGFkc3BfcnRvc19tcF9tdG9hX2RhdGE7Ci19OwotCi1zdHJ1Y3QgcnBjX2Fkc3BfcnRvc19tb2RlbV90b19hcHBfYXJnc190IHsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIGhkcjsKLQl1aW50MzJfdCBnb3RpdDsgLyogaWYgMSwgdGhlIG5leHQgZWxlbWVudHMgYXJlIHByZXNlbnQgKi8KLQlzdHJ1Y3QgYWRzcF9ydG9zX21wX210b2Ffc190eXBlIG10b2FfcGt0OwotfTsKLQotI2RlZmluZSBBRFNQX1NUQVRFX0RJU0FCTEVEICAgMAotI2RlZmluZSBBRFNQX1NUQVRFX0VOQUJMSU5HICAgMQotI2RlZmluZSBBRFNQX1NUQVRFX0VOQUJMRUQgICAgMgotI2RlZmluZSBBRFNQX1NUQVRFX0RJU0FCTElORyAgMwotI2RlZmluZSBBRFNQX1NUQVRFX0lOSVRfSU5GTyAgNAotCi1zdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlIHsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQljb25zdCBjaGFyICpuYW1lOwotCXVuc2lnbmVkIGlkOwotCXN0cnVjdCBhZHNwX2luZm8gKmluZm87Ci0KLQlzdHJ1Y3QgbXNtX3JwY19lbmRwb2ludCAqcnBjX2NsaWVudDsKLQlzdHJ1Y3QgbXNtX2Fkc3Bfb3BzICpvcHM7Ci0Jdm9pZCAqZHJpdmVyX2RhdGE7Ci0KLQkvKiBzdGF0aXN0aWNzICovCi0JdW5zaWduZWQgbnVtX2NvbW1hbmRzOwotCXVuc2lnbmVkIG51bV9ldmVudHM7Ci0KLQl3YWl0X3F1ZXVlX2hlYWRfdCBzdGF0ZV93YWl0OwotCXVuc2lnbmVkIHN0YXRlOwotCi0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSBwZGV2OwotCXN0cnVjdCBjbGsgKmNsazsKLQlpbnQgb3Blbl9jb3VudDsKLQotCXN0cnVjdCBtdXRleCBpb25fcmVnaW9uc19sb2NrOwotCXN0cnVjdCBobGlzdF9oZWFkIGlvbl9yZWdpb25zOwotCWludCAoKnZlcmlmeV9jbWQpIChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlKiwgdW5zaWduZWQgaW50LCB2b2lkICosCi0JCQkgICBzaXplX3QpOwotCWludCAoKnBhdGNoX2V2ZW50KSAoc3RydWN0IG1zbV9hZHNwX21vZHVsZSosIHN0cnVjdCBhZHNwX2V2ZW50ICopOwotfTsKLQotZXh0ZXJuIHZvaWQgbXNtX2Fkc3BfcHVibGlzaF9jZGV2cyhzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICosIHVuc2lnbmVkKTsKLWV4dGVybiBpbnQgYWRzcF9pbml0X2luZm8oc3RydWN0IGFkc3BfaW5mbyAqaW5mbyk7Ci1leHRlcm4gdm9pZCBybXRhc2tfaW5pdCh2b2lkKTsKLQotLyogVmFsdWUgdG8gaW5kaWNhdGUgdGhhdCBhIHF1ZXVlIGlzIG5vdCBkZWZpbmVkIGZvciBhIHBhcnRpY3VsYXIgaW1hZ2UgKi8KLSNkZWZpbmUgUURTUF9SVE9TX05PX1FVRVVFICAweGZmZmZmZmZlCi0KLS8qCi0gKiBDb25zdGFudHMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBBRFNQIFJUT1MKLSAqLwotI2RlZmluZSBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX01VVEVYX00gICAgICAgICAgICAweDgwMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX01VVEVYX05BVkFJTF9WICAgICAweDgwMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX01VVEVYX0FWQUlMX1YgICAgICAweDAwMDAwMDAwVQotCi0jZGVmaW5lIEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfQ01EX00gICAgICAgICAgICAgIDB4NzAwMDAwMDBVCi0jZGVmaW5lIEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfQ01EX1dSSVRFX1JFUV9WICAgIDB4MDAwMDAwMDBVCi0jZGVmaW5lIEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfQ01EX1dSSVRFX0RPTkVfViAgIDB4MTAwMDAwMDBVCi0jZGVmaW5lIEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfQ01EX05PX0NNRF9WICAgICAgIDB4NzAwMDAwMDBVCi0KLSNkZWZpbmUgQURTUF9SVE9TX1dSSVRFX0NUUkxfV09SRF9TVEFUVVNfTSAgICAgICAgICAgMHgwRTAwMDAwMFUKLSNkZWZpbmUgQURTUF9SVE9TX1dSSVRFX0NUUkxfV09SRF9OT19FUlJfViAgICAgICAgICAgMHgwMDAwMDAwMFUKLSNkZWZpbmUgQURTUF9SVE9TX1dSSVRFX0NUUkxfV09SRF9OT19GUkVFX0JVRl9WICAgICAgMHgwMjAwMDAwMFUKLQotI2RlZmluZSBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX0tFUk5FTF9GTEdfTSAgICAgICAweDAxMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX0hUT0RfTVNHX1dSSVRFX1YgICAweDAwMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX0hUT0RfQ01EX1YgICAgICAgICAweDAxMDAwMDAwVQotCi0jZGVmaW5lIEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfRFNQX0FERFJfTSAgICAgICAgIDB4MDBGRkZGRkZVCi0jZGVmaW5lIEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfSFRPRF9DTURfSURfTSAgICAgIDB4MDBGRkZGRkZVCi0KLS8qIENvbWJpbmF0aW9uIG9mIE1VVEVYIGFuZCBDTUQgYml0cyB0byBjaGVjayBpZiB0aGUgRFNQIGlzIGJ1c3kgKi8KLSNkZWZpbmUgQURTUF9SVE9TX1dSSVRFX0NUUkxfV09SRF9SRUFEWV9NICAgICAgICAgICAgMHhGMDAwMDAwMFUKLSNkZWZpbmUgQURTUF9SVE9TX1dSSVRFX0NUUkxfV09SRF9SRUFEWV9WICAgICAgICAgICAgMHg3MDAwMDAwMFUKLQotLyogUlRPUyB0byBIb3N0IHByb2Nlc3NvciBjb21tYW5kIG1hc2sgdmFsdWVzICovCi0jZGVmaW5lIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9GTEFHX00gICAgICAgICAgICAgIDB4ODAwMDAwMDBVCi0jZGVmaW5lIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9GTEFHX1VQX1dBSVRfViAgICAgIDB4MDAwMDAwMDBVCi0jZGVmaW5lIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9GTEFHX1VQX0NPTlRfViAgICAgIDB4ODAwMDAwMDBVCi0KLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX0NNRF9NICAgICAgICAgICAgICAgMHg2MDAwMDAwMFUKLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX1JFQURfRE9ORV9WICAgICAgICAgMHgwMDAwMDAwMFUKLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX1JFQURfUkVRX1YgICAgICAgICAgMHgyMDAwMDAwMFUKLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX05PX0NNRF9WICAgICAgICAgICAgMHg2MDAwMDAwMFUKLQotLyogQ29tYmluYXRpb24gb2YgRkxBRyBhbmQgQ09NTUFORCBiaXRzIHRvIGNoZWNrIGlmIE1TRyByZWFkeSAqLwotI2RlZmluZSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfUkVBRFlfTSAgICAgICAgICAgICAweEUwMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfUkVBRFlfViAgICAgICAgICAgICAweEEwMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfQ09OVF9WICAgICAgICAgICAgICAweEMwMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfRE9ORV9WICAgICAgICAgICAgICAweEUwMDAwMDAwVQotCi0jZGVmaW5lIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9TVEFUVVNfTSAgICAgICAgICAgIDB4MTgwMDAwMDBVCi0jZGVmaW5lIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9OT19FUlJfViAgICAgICAgICAgIDB4MDAwMDAwMDBVCi0KLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX0lOX1BST0dfTSAgICAgICAgICAgMHgwNDAwMDAwMFUKLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX05PX1JFQURfSU5fUFJPR19WICAgMHgwMDAwMDAwMFUKLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX1JFQURfSU5fUFJPR19WICAgICAgMHgwNDAwMDAwMFUKLQotI2RlZmluZSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfQ01EX1RZUEVfTSAgICAgICAgICAweDAzMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfQ01EX1RBU0tfVE9fSF9WICAgICAweDAwMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfQ01EX0tSTkxfVE9fSF9WICAgICAweDAxMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfQ01EX0hfVE9fS1JOTF9DRk1fViAweDAyMDAwMDAwVQotCi0jZGVmaW5lIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9EU1BfQUREUl9NICAgICAgICAgIDB4MDBGRkZGRkZVCi0KLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX01TR19JRF9NICAgICAgICAgICAgMHgwMDAwMDBGRlUKLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX1RBU0tfSURfTSAgICAgICAgICAgMHgwMDAwRkYwMFUKLQotLyogQmFzZSBhZGRyZXNzIG9mIERTUCBhbmQgRFNQIGhhcmR3YXJlIHJlZ2lzdGVycyAqLwotI2RlZmluZSBRRFNQX1JBTUNfT0ZGU0VUICAweDQwMDAwMAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfNjIxMC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF82MjEwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNjljZTIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF82MjEwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF82MjEwLmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImFkc3AuaCIKLQotLyogRmlybXdhcmUgbW9kdWxlcyAqLwotdHlwZWRlZiBlbnVtIHsgCi0JUURTUF9NT0RVTEVfS0VSTkVMLAotCVFEU1BfTU9EVUxFX0FGRVRBU0ssCi0JUURTUF9NT0RVTEVfQVVEUExBWTBUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBMQVkxVEFTSywKLQlRRFNQX01PRFVMRV9BVURQUFRBU0ssCi0JUURTUF9NT0RVTEVfVklERU9UQVNLLAotCVFEU1BfTU9EVUxFX1ZJREVPX0FBQ19WT0MsCi0JUURTUF9NT0RVTEVfUENNX0RFQywKLQlRRFNQX01PRFVMRV9BVURJT19ERUNfTVAzLAotCVFEU1BfTU9EVUxFX0FVRElPX0RFQ19BQUMsCi0JUURTUF9NT0RVTEVfQVVESU9fREVDX1dNQSwKLQlRRFNQX01PRFVMRV9IT1NUUENNLAotCVFEU1BfTU9EVUxFX0RUTUYsCi0JUURTUF9NT0RVTEVfQVVEUkVDVEFTSywKLQlRRFNQX01PRFVMRV9BVURQUkVQUk9DVEFTSywKLQlRRFNQX01PRFVMRV9TQkNfRU5DLAotCVFEU1BfTU9EVUxFX1ZPQywKLQlRRFNQX01PRFVMRV9WT0NfUENNLAotCVFEU1BfTU9EVUxFX1ZPQ0VOQ1RBU0ssCi0JUURTUF9NT0RVTEVfVk9DREVDVEFTSywKLQlRRFNQX01PRFVMRV9WT0lDRVBST0NUQVNLLAotCVFEU1BfTU9EVUxFX1ZJREVPRU5DVEFTSywKLQlRRFNQX01PRFVMRV9WRkVUQVNLLAotCVFEU1BfTU9EVUxFX1dBVl9FTkMsCi0JUURTUF9NT0RVTEVfQUFDTENfRU5DLAotCVFEU1BfTU9EVUxFX1ZJREVPX0FNUiwKLQlRRFNQX01PRFVMRV9WT0NfQU1SLAotCVFEU1BfTU9EVUxFX1ZPQ19FVlJDLAotCVFEU1BfTU9EVUxFX1ZPQ18xM0ssCi0JUURTUF9NT0RVTEVfVk9DX0ZHViwKLQlRRFNQX01PRFVMRV9ESUFHVEFTSywKLQlRRFNQX01PRFVMRV9KUEVHVEFTSywKLQlRRFNQX01PRFVMRV9MUE1UQVNLLAotCVFEU1BfTU9EVUxFX1FDQU1UQVNLLAotCVFEU1BfTU9EVUxFX01PRE1BVEhUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBMQVkyVEFTSywKLQlRRFNQX01PRFVMRV9BVURQTEFZM1RBU0ssCi0JUURTUF9NT0RVTEVfQVVEUExBWTRUQVNLLAotCVFEU1BfTU9EVUxFX0dSQVBISUNTVEFTSywKLQlRRFNQX01PRFVMRV9NSURJLAotCVFEU1BfTU9EVUxFX0dBVURJTywKLQlRRFNQX01PRFVMRV9WREVDX0xQX01PREUsCi0JUURTUF9NT0RVTEVfTUFYLAotfSBxZHNwX21vZHVsZV90eXBlOwotCi0jZGVmaW5lIFFEU1BfUlRPU19NQVhfVEFTS19JRCAgMTlVCi0KLS8qIFRhYmxlIG9mIG1vZHVsZXMgaW5kZXhlZCBieSB0YXNrIElEIGZvciB0aGUgR0FVRElPIGltYWdlICovCi1zdGF0aWMgcWRzcF9tb2R1bGVfdHlwZSBxZHNwX2dhdWRpb190YXNrX3RvX21vZHVsZV90YWJsZVtdID0gewotCVFEU1BfTU9EVUxFX0tFUk5FTCwKLQlRRFNQX01PRFVMRV9BRkVUQVNLLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9BVURQUFRBU0ssCi0JUURTUF9NT0RVTEVfQVVEUExBWTBUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBMQVkxVEFTSywKLQlRRFNQX01PRFVMRV9BVURQTEFZMlRBU0ssCi0JUURTUF9NT0RVTEVfQVVEUExBWTNUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBMQVk0VEFTSywKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfQVVEUkVDVEFTSywKLQlRRFNQX01PRFVMRV9BVURQUkVQUk9DVEFTSywKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfR1JBUEhJQ1NUQVNLLAotCVFEU1BfTU9EVUxFX01BWAotfTsKLQotLyogUXVldWUgb2Zmc2V0IHRhYmxlIGluZGV4ZWQgYnkgcXVldWUgSUQgZm9yIHRoZSBHQVVESU8gaW1hZ2UgKi8KLXN0YXRpYyB1aW50MzJfdCBxZHNwX2dhdWRpb19xdWV1ZV9vZmZzZXRfdGFibGVbXSA9IHsKLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX2xwbUNvbW1hbmRRdWV1ZSAgICAgICAgICAgICAgKi8KLQkweDNiZSwgICAgICAgICAgICAgICAvKiBRRFNQX21wdUFmZVF1ZXVlICAgICAgICAgICAgICAgICAgKi8KLQkweDNlZSwgICAgICAgICAgICAgICAvKiBRRFNQX21wdUdyYXBoaWNzQ21kUXVldWUgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX21wdU1vZG1hdGhDbWRRdWV1ZSAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX21wdVZEZWNDbWRRdWV1ZSAgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX21wdVZEZWNQa3RRdWV1ZSAgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX21wdVZFbmNDbWRRdWV1ZSAgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3J4TXB1RGVjQ21kUXVldWUgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3J4TXB1RGVjUGt0UXVldWUgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3R4TXB1RW5jUXVldWUgICAgICAgICAgICAgICAgKi8KLQkweDNjMiwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUFBDbWQxUXVldWUgICAgICAgICAgICAgKi8KLQkweDNjNiwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUFBDbWQyUXVldWUgICAgICAgICAgICAgKi8KLQkweDNjYSwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUFBDbWQzUXVldWUgICAgICAgICAgICAgKi8KLQkweDNkYSwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUGxheTBCaXRTdHJlYW1DdHJsUXVldWUgKi8KLQkweDNkZSwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUGxheTFCaXRTdHJlYW1DdHJsUXVldWUgKi8KLQkweDNlMiwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUGxheTJCaXRTdHJlYW1DdHJsUXVldWUgKi8KLQkweDNlNiwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUGxheTNCaXRTdHJlYW1DdHJsUXVldWUgKi8KLQkweDNlYSwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUGxheTRCaXRTdHJlYW1DdHJsUXVldWUgKi8KLQkweDNjZSwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUHJlUHJvY0NtZFF1ZXVlICAgICAgICAgKi8KLQkweDNkNiwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUmVjQml0U3RyZWFtUXVldWUgICAgICAgKi8KLQkweDNkMiwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUmVjQ21kUXVldWUgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3VQSnBlZ0FjdGlvbkNtZFF1ZXVlICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3VQSnBlZ0NmZ0NtZFF1ZXVlICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3VQVm9jUHJvY1F1ZXVlICAgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3ZmZUNvbW1hbmRRdWV1ZSAgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3ZmZUNvbW1hbmRTY2FsZVF1ZXVlICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUgICAvKiBRRFNQX3ZmZUNvbW1hbmRUYWJsZVF1ZXVlICAgICAgICAgKi8KLX07Ci0KLS8qIFRhYmxlIG9mIG1vZHVsZXMgaW5kZXhlZCBieSB0YXNrIElEIGZvciB0aGUgQ09NQk8gaW1hZ2UgKi8KLXN0YXRpYyBxZHNwX21vZHVsZV90eXBlIHFkc3BfY29tYm9fdGFza190b19tb2R1bGVfdGFibGVbXSA9IHsKLQlRRFNQX01PRFVMRV9LRVJORUwsCi0JUURTUF9NT0RVTEVfQUZFVEFTSywKLQlRRFNQX01PRFVMRV9WT0NERUNUQVNLLAotCVFEU1BfTU9EVUxFX1ZPQ0VOQ1RBU0ssCi0JUURTUF9NT0RVTEVfVklERU9UQVNLLAotCVFEU1BfTU9EVUxFX1ZJREVPRU5DVEFTSywKLQlRRFNQX01PRFVMRV9WT0lDRVBST0NUQVNLLAotCVFEU1BfTU9EVUxFX1ZGRVRBU0ssCi0JUURTUF9NT0RVTEVfSlBFR1RBU0ssCi0JUURTUF9NT0RVTEVfQVVEUFBUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBMQVkwVEFTSywKLQlRRFNQX01PRFVMRV9BVURQTEFZMVRBU0ssCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTFBNVEFTSywKLQlRRFNQX01PRFVMRV9BVURSRUNUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBSRVBST0NUQVNLLAotCVFEU1BfTU9EVUxFX01PRE1BVEhUQVNLLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgKLX07Ci0KLS8qIFF1ZXVlIG9mZnNldCB0YWJsZSBpbmRleGVkIGJ5IHF1ZXVlIElEIGZvciB0aGUgQ09NQk8gaW1hZ2UgKi8KLXN0YXRpYyB1aW50MzJfdCBxZHNwX2NvbWJvX3F1ZXVlX29mZnNldF90YWJsZVtdID0gewotCTB4NTg1LCAgICAgICAgICAgICAgIC8qIFFEU1BfbHBtQ29tbWFuZFF1ZXVlICAgICAgICAgICAgICAqLwotCTB4NTJkLCAgICAgICAgICAgICAgIC8qIFFEU1BfbXB1QWZlUXVldWUgICAgICAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfbXB1R3JhcGhpY3NDbWRRdWV1ZSAgICAgICAgICAqLwotCTB4NTQxLCAgICAgICAgICAgICAgIC8qIFFEU1BfbXB1TW9kbWF0aENtZFF1ZXVlICAgICAgICAgICAqLwotCTB4NTU1LCAgICAgICAgICAgICAgIC8qIFFEU1BfbXB1VkRlY0NtZFF1ZXVlICAgICAgICAgICAgICAqLwotCTB4NTU5LCAgICAgICAgICAgICAgIC8qIFFEU1BfbXB1VkRlY1BrdFF1ZXVlICAgICAgICAgICAgICAqLwotCTB4NTUxLCAgICAgICAgICAgICAgIC8qIFFEU1BfbXB1VkVuY0NtZFF1ZXVlICAgICAgICAgICAgICAqLwotCTB4NTM1LCAgICAgICAgICAgICAgIC8qIFFEU1BfcnhNcHVEZWNDbWRRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NTM5LCAgICAgICAgICAgICAgIC8qIFFEU1BfcnhNcHVEZWNQa3RRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NTNkLCAgICAgICAgICAgICAgIC8qIFFEU1BfdHhNcHVFbmNRdWV1ZSAgICAgICAgICAgICAgICAqLwotCTB4NTVkLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQUENtZDFRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NTYxLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQUENtZDJRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NTY1LCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQUENtZDNRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NTc1LCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQbGF5MEJpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCTB4NTc5LCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQbGF5MUJpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBBdWRQbGF5MkJpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBBdWRQbGF5M0JpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBBdWRQbGF5NEJpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCTB4NTY5LCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQcmVQcm9jQ21kUXVldWUgICAgICAgICAqLwotCTB4NTcxLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRSZWNCaXRTdHJlYW1RdWV1ZSAgICAgICAqLwotCTB4NTZkLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRSZWNDbWRRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NTgxLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBKcGVnQWN0aW9uQ21kUXVldWUgICAgICAgICAqLwotCTB4NTdkLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBKcGVnQ2ZnQ21kUXVldWUgICAgICAgICAgICAqLwotCTB4NTMxLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBWb2NQcm9jUXVldWUgICAgICAgICAgICAgICAqLwotCTB4NTQ1LCAgICAgICAgICAgICAgIC8qIFFEU1BfdmZlQ29tbWFuZFF1ZXVlICAgICAgICAgICAgICAqLwotCTB4NTRkLCAgICAgICAgICAgICAgIC8qIFFEU1BfdmZlQ29tbWFuZFNjYWxlUXVldWUgICAgICAgICAqLwotCTB4NTQ5ICAgICAgICAgICAgICAgIC8qIFFEU1BfdmZlQ29tbWFuZFRhYmxlUXVldWUgICAgICAgICAqLwotfTsKLQotLyogVGFibGUgb2YgbW9kdWxlcyBpbmRleGVkIGJ5IHRhc2sgSUQgZm9yIHRoZSBRVFZfTFAgaW1hZ2UgKi8KLXN0YXRpYyBxZHNwX21vZHVsZV90eXBlIHFkc3BfcXR2X2xwX3Rhc2tfdG9fbW9kdWxlX3RhYmxlW10gPSB7Ci0JUURTUF9NT0RVTEVfS0VSTkVMLAotCVFEU1BfTU9EVUxFX0FGRVRBU0ssCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9WSURFT1RBU0ssCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX0FVRFBQVEFTSywKLQlRRFNQX01PRFVMRV9BVURQTEFZMFRBU0ssCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9BVURSRUNUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBSRVBST0NUQVNLLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYCi19OwotCi0vKiBRdWV1ZSBvZmZzZXQgdGFibGUgaW5kZXhlZCBieSBxdWV1ZSBJRCBmb3IgdGhlIFFUVl9MUCBpbWFnZSAqLwotc3RhdGljIHVpbnQzMl90IHFkc3BfcXR2X2xwX3F1ZXVlX29mZnNldF90YWJsZVtdID0gewotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfbHBtQ29tbWFuZFF1ZXVlICAgICAgICAgICAgICAqLwotCTB4NDBjLCAgICAgICAgICAgICAgIC8qIFFEU1BfbXB1QWZlUXVldWUgICAgICAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfbXB1R3JhcGhpY3NDbWRRdWV1ZSAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfbXB1TW9kbWF0aENtZFF1ZXVlICAgICAgICAgICAqLwotCTB4NDEwLCAgICAgICAgICAgICAgIC8qIFFEU1BfbXB1VkRlY0NtZFF1ZXVlICAgICAgICAgICAgICAqLwotCTB4NDE0LCAgICAgICAgICAgICAgIC8qIFFEU1BfbXB1VkRlY1BrdFF1ZXVlICAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfbXB1VkVuY0NtZFF1ZXVlICAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfcnhNcHVEZWNDbWRRdWV1ZSAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfcnhNcHVEZWNQa3RRdWV1ZSAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdHhNcHVFbmNRdWV1ZSAgICAgICAgICAgICAgICAqLwotCTB4NDFjLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQUENtZDFRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NDIwLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQUENtZDJRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NDI0LCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQUENtZDNRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NDMwLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQbGF5MEJpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBBdWRQbGF5MUJpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBBdWRQbGF5MkJpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBBdWRQbGF5M0JpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBBdWRQbGF5NEJpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCTB4NDE4LCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQcmVQcm9jQ21kUXVldWUgICAgICAgICAqLwotCTB4NDJjLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRSZWNCaXRTdHJlYW1RdWV1ZSAgICAgICAqLwotCTB4NDI4LCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRSZWNDbWRRdWV1ZSAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBKcGVnQWN0aW9uQ21kUXVldWUgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBKcGVnQ2ZnQ21kUXVldWUgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBWb2NQcm9jUXVldWUgICAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdmZlQ29tbWFuZFF1ZXVlICAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdmZlQ29tbWFuZFNjYWxlUXVldWUgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSAgIC8qIFFEU1BfdmZlQ29tbWFuZFRhYmxlUXVldWUgICAgICAgICAqLwotfTsKLQotLyogVGFibGVzIHRvIGNvbnZlcnQgdGFza3MgdG8gbW9kdWxlcyAqLwotc3RhdGljIHVpbnQzMl90ICpxZHNwX3Rhc2tfdG9fbW9kdWxlW10gPSB7Ci0JcWRzcF9jb21ib190YXNrX3RvX21vZHVsZV90YWJsZSwKLQlxZHNwX2dhdWRpb190YXNrX3RvX21vZHVsZV90YWJsZSwKLQlxZHNwX3F0dl9scF90YXNrX3RvX21vZHVsZV90YWJsZSwKLX07Ci0KLS8qIFRhYmxlcyB0byByZXRyaWV2ZSBxdWV1ZSBvZmZzZXRzICovCi1zdGF0aWMgdWludDMyX3QgKnFkc3BfcXVldWVfb2Zmc2V0X3RhYmxlW10gPSB7Ci0JcWRzcF9jb21ib19xdWV1ZV9vZmZzZXRfdGFibGUsCi0JcWRzcF9nYXVkaW9fcXVldWVfb2Zmc2V0X3RhYmxlLAotCXFkc3BfcXR2X2xwX3F1ZXVlX29mZnNldF90YWJsZSwKLX07Ci0KLSNkZWZpbmUgUURTUF9NT0RVTEUobikgXAotCXsgLm5hbWUgPSAjbiwgLnBkZXZfbmFtZSA9ICJhZHNwXyIgI24sIC5pZCA9IFFEU1BfTU9EVUxFXyMjbiB9Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRzcF9tb2R1bGVfaW5mbyBtb2R1bGVfaW5mb1tdID0gewotCVFEU1BfTU9EVUxFKEFVRFBQVEFTSyksCi0JUURTUF9NT0RVTEUoQVVEUkVDVEFTSyksCi0JUURTUF9NT0RVTEUoQVVEUFJFUFJPQ1RBU0spLAotCVFEU1BfTU9EVUxFKFZGRVRBU0spLAotCVFEU1BfTU9EVUxFKFFDQU1UQVNLKSwKLQlRRFNQX01PRFVMRShMUE1UQVNLKSwKLQlRRFNQX01PRFVMRShKUEVHVEFTSyksCi0JUURTUF9NT0RVTEUoVklERU9UQVNLKSwKLQlRRFNQX01PRFVMRShWREVDX0xQX01PREUpLAotfTsKLQotaW50IGFkc3BfaW5pdF9pbmZvKHN0cnVjdCBhZHNwX2luZm8gKmluZm8pCi17Ci0JaW5mby0+c2VuZF9pcnEgPSAgIDB4MDBjMDAyMDA7Ci0JaW5mby0+cmVhZF9jdHJsID0gIDB4MDA0MDAwMzg7Ci0JaW5mby0+d3JpdGVfY3RybCA9IDB4MDA0MDAwMzQ7Ci0KLQlpbmZvLT5tYXhfbXNnMTZfc2l6ZSA9IDE5MzsKLQlpbmZvLT5tYXhfbXNnMzJfc2l6ZSA9IDg7Ci0KLQlpbmZvLT5tYXhfdGFza19pZCA9IDE2OwotCWluZm8tPm1heF9tb2R1bGVfaWQgPSBRRFNQX01PRFVMRV9NQVggLSAxOwotCWluZm8tPm1heF9xdWV1ZV9pZCA9IFFEU1BfUVVFVUVfTUFYOwotCWluZm8tPm1heF9pbWFnZV9pZCA9IDI7Ci0JaW5mby0+cXVldWVfb2Zmc2V0ID0gcWRzcF9xdWV1ZV9vZmZzZXRfdGFibGU7Ci0JaW5mby0+dGFza190b19tb2R1bGUgPSBxZHNwX3Rhc2tfdG9fbW9kdWxlOwotCi0JaW5mby0+bW9kdWxlX2NvdW50ID0gQVJSQVlfU0laRShtb2R1bGVfaW5mbyk7Ci0JaW5mby0+bW9kdWxlID0gbW9kdWxlX2luZm87Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwXzYyMjAuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfNjIyMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDczNzkwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfNjIyMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfNjIyMC5oCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlICJhZHNwLmgiCi0KLS8qIEZpcm13YXJlIG1vZHVsZXMgKi8KLXR5cGVkZWYgZW51bSB7IAotCVFEU1BfTU9EVUxFX0tFUk5FTCwKLQlRRFNQX01PRFVMRV9BRkVUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBMQVkwVEFTSywKLQlRRFNQX01PRFVMRV9BVURQTEFZMVRBU0ssCi0JUURTUF9NT0RVTEVfQVVEUFBUQVNLLAotCVFEU1BfTU9EVUxFX1ZJREVPVEFTSywKLQlRRFNQX01PRFVMRV9WSURFT19BQUNfVk9DLAotCVFEU1BfTU9EVUxFX1BDTV9ERUMsCi0JUURTUF9NT0RVTEVfQVVESU9fREVDX01QMywKLQlRRFNQX01PRFVMRV9BVURJT19ERUNfQUFDLAotCVFEU1BfTU9EVUxFX0FVRElPX0RFQ19XTUEsCi0JUURTUF9NT0RVTEVfSE9TVFBDTSwKLQlRRFNQX01PRFVMRV9EVE1GLAotCVFEU1BfTU9EVUxFX0FVRFJFQ1RBU0ssCi0JUURTUF9NT0RVTEVfQVVEUFJFUFJPQ1RBU0ssCi0JUURTUF9NT0RVTEVfU0JDX0VOQywKLQlRRFNQX01PRFVMRV9WT0MsCi0JUURTUF9NT0RVTEVfVk9DX1BDTSwKLQlRRFNQX01PRFVMRV9WT0NFTkNUQVNLLAotCVFEU1BfTU9EVUxFX1ZPQ0RFQ1RBU0ssCi0JUURTUF9NT0RVTEVfVk9JQ0VQUk9DVEFTSywKLQlRRFNQX01PRFVMRV9WSURFT0VOQ1RBU0ssCi0JUURTUF9NT0RVTEVfVkZFVEFTSywKLQlRRFNQX01PRFVMRV9XQVZfRU5DLAotCVFEU1BfTU9EVUxFX0FBQ0xDX0VOQywKLQlRRFNQX01PRFVMRV9WSURFT19BTVIsCi0JUURTUF9NT0RVTEVfVk9DX0FNUiwKLQlRRFNQX01PRFVMRV9WT0NfRVZSQywKLQlRRFNQX01PRFVMRV9WT0NfMTNLLAotCVFEU1BfTU9EVUxFX1ZPQ19GR1YsCi0JUURTUF9NT0RVTEVfRElBR1RBU0ssCi0JUURTUF9NT0RVTEVfSlBFR1RBU0ssCi0JUURTUF9NT0RVTEVfTFBNVEFTSywKLQlRRFNQX01PRFVMRV9RQ0FNVEFTSywKLQlRRFNQX01PRFVMRV9NT0RNQVRIVEFTSywKLQlRRFNQX01PRFVMRV9BVURQTEFZMlRBU0ssCi0JUURTUF9NT0RVTEVfQVVEUExBWTNUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBMQVk0VEFTSywKLQlRRFNQX01PRFVMRV9HUkFQSElDU1RBU0ssCi0JUURTUF9NT0RVTEVfTUlESSwKLQlRRFNQX01PRFVMRV9HQVVESU8sCi0JUURTUF9NT0RVTEVfVkRFQ19MUF9NT0RFLAotCVFEU1BfTU9EVUxFX01BWCwKLX0gcWRzcF9tb2R1bGVfdHlwZTsKLQotI2RlZmluZSBRRFNQX1JUT1NfTUFYX1RBU0tfSUQgIDE5VQotCi0vKiBUYWJsZSBvZiBtb2R1bGVzIGluZGV4ZWQgYnkgdGFzayBJRCBmb3IgdGhlIEdBVURJTyBpbWFnZSAqLwotc3RhdGljIHFkc3BfbW9kdWxlX3R5cGUgcWRzcF9nYXVkaW9fdGFza190b19tb2R1bGVfdGFibGVbXSA9IHsKLQlRRFNQX01PRFVMRV9LRVJORUwsCi0JUURTUF9NT0RVTEVfQUZFVEFTSywKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfQVVEUFBUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBMQVkwVEFTSywKLQlRRFNQX01PRFVMRV9BVURQTEFZMVRBU0ssCi0JUURTUF9NT0RVTEVfQVVEUExBWTJUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBMQVkzVEFTSywKLQlRRFNQX01PRFVMRV9BVURQTEFZNFRBU0ssCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX0FVRFJFQ1RBU0ssCi0JUURTUF9NT0RVTEVfQVVEUFJFUFJPQ1RBU0ssCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX0dSQVBISUNTVEFTSywKLQlRRFNQX01PRFVMRV9NQVgKLX07Ci0KLS8qIFF1ZXVlIG9mZnNldCB0YWJsZSBpbmRleGVkIGJ5IHF1ZXVlIElEIGZvciB0aGUgR0FVRElPIGltYWdlICovCi1zdGF0aWMgdWludDMyX3QgcWRzcF9nYXVkaW9fcXVldWVfb2Zmc2V0X3RhYmxlW10gPSB7Ci0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF9scG1Db21tYW5kUXVldWUgICAgICAgICAgICAgICovCi0JMHgzZjAsICAgICAgICAgICAgICAgLyogUURTUF9tcHVBZmVRdWV1ZSAgICAgICAgICAgICAgICAgICovCi0JMHg0MjAsICAgICAgICAgICAgICAgLyogUURTUF9tcHVHcmFwaGljc0NtZFF1ZXVlICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF9tcHVNb2RtYXRoQ21kUXVldWUgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF9tcHVWRGVjQ21kUXVldWUgICAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF9tcHVWRGVjUGt0UXVldWUgICAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF9tcHVWRW5jQ21kUXVldWUgICAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF9yeE1wdURlY0NtZFF1ZXVlICAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF9yeE1wdURlY1BrdFF1ZXVlICAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF90eE1wdUVuY1F1ZXVlICAgICAgICAgICAgICAgICovCi0JMHgzZjQsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFBQQ21kMVF1ZXVlICAgICAgICAgICAgICovCi0JMHgzZjgsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFBQQ21kMlF1ZXVlICAgICAgICAgICAgICovCi0JMHgzZmMsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFBQQ21kM1F1ZXVlICAgICAgICAgICAgICovCi0JMHg0MGMsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFBsYXkwQml0U3RyZWFtQ3RybFF1ZXVlICovCi0JMHg0MTAsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFBsYXkxQml0U3RyZWFtQ3RybFF1ZXVlICovCi0JMHg0MTQsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFBsYXkyQml0U3RyZWFtQ3RybFF1ZXVlICovCi0JMHg0MTgsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFBsYXkzQml0U3RyZWFtQ3RybFF1ZXVlICovCi0JMHg0MWMsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFBsYXk0Qml0U3RyZWFtQ3RybFF1ZXVlICovCi0JMHg0MDAsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFByZVByb2NDbWRRdWV1ZSAgICAgICAgICovCi0JMHg0MDgsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFJlY0JpdFN0cmVhbVF1ZXVlICAgICAgICovCi0JMHg0MDQsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFJlY0NtZFF1ZXVlICAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF91UEpwZWdBY3Rpb25DbWRRdWV1ZSAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF91UEpwZWdDZmdDbWRRdWV1ZSAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF91UFZvY1Byb2NRdWV1ZSAgICAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF92ZmVDb21tYW5kUXVldWUgICAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF92ZmVDb21tYW5kU2NhbGVRdWV1ZSAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFICAgLyogUURTUF92ZmVDb21tYW5kVGFibGVRdWV1ZSAgICAgICAgICovCi19OwotCi0vKiBUYWJsZSBvZiBtb2R1bGVzIGluZGV4ZWQgYnkgdGFzayBJRCBmb3IgdGhlIENPTUJPIGltYWdlICovCi1zdGF0aWMgcWRzcF9tb2R1bGVfdHlwZSBxZHNwX2NvbWJvX3Rhc2tfdG9fbW9kdWxlX3RhYmxlW10gPSB7Ci0JUURTUF9NT0RVTEVfS0VSTkVMLAotCVFEU1BfTU9EVUxFX0FGRVRBU0ssCi0JUURTUF9NT0RVTEVfVk9DREVDVEFTSywKLQlRRFNQX01PRFVMRV9WT0NFTkNUQVNLLAotCVFEU1BfTU9EVUxFX1ZJREVPVEFTSywKLQlRRFNQX01PRFVMRV9WSURFT0VOQ1RBU0ssCi0JUURTUF9NT0RVTEVfVk9JQ0VQUk9DVEFTSywKLQlRRFNQX01PRFVMRV9WRkVUQVNLLAotCVFEU1BfTU9EVUxFX0pQRUdUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBQVEFTSywKLQlRRFNQX01PRFVMRV9BVURQTEFZMFRBU0ssCi0JUURTUF9NT0RVTEVfQVVEUExBWTFUQVNLLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX0xQTVRBU0ssCi0JUURTUF9NT0RVTEVfQVVEUkVDVEFTSywKLQlRRFNQX01PRFVMRV9BVURQUkVQUk9DVEFTSywKLQlRRFNQX01PRFVMRV9NT0RNQVRIVEFTSywKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYCi19OwotCi0vKiBRdWV1ZSBvZmZzZXQgdGFibGUgaW5kZXhlZCBieSBxdWV1ZSBJRCBmb3IgdGhlIENPTUJPIGltYWdlICovCi1zdGF0aWMgdWludDMyX3QgcWRzcF9jb21ib19xdWV1ZV9vZmZzZXRfdGFibGVbXSA9IHsKLQkweDZmMiwgICAgICAgICAgICAgICAvKiBRRFNQX2xwbUNvbW1hbmRRdWV1ZSAgICAgICAgICAgICAgKi8KLQkweDY5ZSwgICAgICAgICAgICAgICAvKiBRRFNQX21wdUFmZVF1ZXVlICAgICAgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX21wdUdyYXBoaWNzQ21kUXVldWUgICAgICAgICAgKi8KLQkweDZiMiwgICAgICAgICAgICAgICAvKiBRRFNQX21wdU1vZG1hdGhDbWRRdWV1ZSAgICAgICAgICAgKi8KLQkweDZjNiwgICAgICAgICAgICAgICAvKiBRRFNQX21wdVZEZWNDbWRRdWV1ZSAgICAgICAgICAgICAgKi8KLQkweDZjYSwgICAgICAgICAgICAgICAvKiBRRFNQX21wdVZEZWNQa3RRdWV1ZSAgICAgICAgICAgICAgKi8KLQkweDZjMiwgICAgICAgICAgICAgICAvKiBRRFNQX21wdVZFbmNDbWRRdWV1ZSAgICAgICAgICAgICAgKi8KLQkweDZhNiwgICAgICAgICAgICAgICAvKiBRRFNQX3J4TXB1RGVjQ21kUXVldWUgICAgICAgICAgICAgKi8KLQkweDZhYSwgICAgICAgICAgICAgICAvKiBRRFNQX3J4TXB1RGVjUGt0UXVldWUgICAgICAgICAgICAgKi8KLQkweDZhZSwgICAgICAgICAgICAgICAvKiBRRFNQX3R4TXB1RW5jUXVldWUgICAgICAgICAgICAgICAgKi8KLQkweDZjZSwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUFBDbWQxUXVldWUgICAgICAgICAgICAgKi8KLQkweDZkMiwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUFBDbWQyUXVldWUgICAgICAgICAgICAgKi8KLQkweDZkNiwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUFBDbWQzUXVldWUgICAgICAgICAgICAgKi8KLQkweDZlNiwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUGxheTBCaXRTdHJlYW1DdHJsUXVldWUgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3VQQXVkUGxheTFCaXRTdHJlYW1DdHJsUXVldWUgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3VQQXVkUGxheTJCaXRTdHJlYW1DdHJsUXVldWUgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3VQQXVkUGxheTNCaXRTdHJlYW1DdHJsUXVldWUgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3VQQXVkUGxheTRCaXRTdHJlYW1DdHJsUXVldWUgKi8KLQkweDZkYSwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUHJlUHJvY0NtZFF1ZXVlICAgICAgICAgKi8KLQkweDZlMiwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUmVjQml0U3RyZWFtUXVldWUgICAgICAgKi8KLQkweDZkZSwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUmVjQ21kUXVldWUgICAgICAgICAgICAgKi8KLQkweDZlZSwgICAgICAgICAgICAgICAvKiBRRFNQX3VQSnBlZ0FjdGlvbkNtZFF1ZXVlICAgICAgICAgKi8KLQkweDZlYSwgICAgICAgICAgICAgICAvKiBRRFNQX3VQSnBlZ0NmZ0NtZFF1ZXVlICAgICAgICAgICAgKi8KLQkweDZhMiwgICAgICAgICAgICAgICAvKiBRRFNQX3VQVm9jUHJvY1F1ZXVlICAgICAgICAgICAgICAgKi8KLQkweDZiNiwgICAgICAgICAgICAgICAvKiBRRFNQX3ZmZUNvbW1hbmRRdWV1ZSAgICAgICAgICAgICAgKi8KLQkweDZiZSwgICAgICAgICAgICAgICAvKiBRRFNQX3ZmZUNvbW1hbmRTY2FsZVF1ZXVlICAgICAgICAgKi8KLQkweDZiYSAgICAgICAgICAgICAgICAvKiBRRFNQX3ZmZUNvbW1hbmRUYWJsZVF1ZXVlICAgICAgICAgKi8KLX07Ci0KLS8qIFRhYmxlIG9mIG1vZHVsZXMgaW5kZXhlZCBieSB0YXNrIElEIGZvciB0aGUgUVRWX0xQIGltYWdlICovCi1zdGF0aWMgcWRzcF9tb2R1bGVfdHlwZSBxZHNwX3F0dl9scF90YXNrX3RvX21vZHVsZV90YWJsZVtdID0gewotCVFEU1BfTU9EVUxFX0tFUk5FTCwKLQlRRFNQX01PRFVMRV9BRkVUQVNLLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfVklERU9UQVNLLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9BVURQUFRBU0ssCi0JUURTUF9NT0RVTEVfQVVEUExBWTBUQVNLLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfQVVEUkVDVEFTSywKLQlRRFNQX01PRFVMRV9BVURQUkVQUk9DVEFTSywKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWAotfTsKLQotLyogUXVldWUgb2Zmc2V0IHRhYmxlIGluZGV4ZWQgYnkgcXVldWUgSUQgZm9yIHRoZSBRVFZfTFAgaW1hZ2UgKi8KLXN0YXRpYyB1aW50MzJfdCBxZHNwX3F0dl9scF9xdWV1ZV9vZmZzZXRfdGFibGVbXSA9IHsKLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX2xwbUNvbW1hbmRRdWV1ZSAgICAgICAgICAgICAgKi8KLQkweDQzMCwgICAgICAgICAgICAgICAvKiBRRFNQX21wdUFmZVF1ZXVlICAgICAgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX21wdUdyYXBoaWNzQ21kUXVldWUgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX21wdU1vZG1hdGhDbWRRdWV1ZSAgICAgICAgICAgKi8KLQkweDQzNCwgICAgICAgICAgICAgICAvKiBRRFNQX21wdVZEZWNDbWRRdWV1ZSAgICAgICAgICAgICAgKi8KLQkweDQzOCwgICAgICAgICAgICAgICAvKiBRRFNQX21wdVZEZWNQa3RRdWV1ZSAgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX21wdVZFbmNDbWRRdWV1ZSAgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3J4TXB1RGVjQ21kUXVldWUgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3J4TXB1RGVjUGt0UXVldWUgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3R4TXB1RW5jUXVldWUgICAgICAgICAgICAgICAgKi8KLQkweDQ0MCwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUFBDbWQxUXVldWUgICAgICAgICAgICAgKi8KLQkweDQ0NCwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUFBDbWQyUXVldWUgICAgICAgICAgICAgKi8KLQkweDQ0OCwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUFBDbWQzUXVldWUgICAgICAgICAgICAgKi8KLQkweDQ1NCwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUGxheTBCaXRTdHJlYW1DdHJsUXVldWUgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3VQQXVkUGxheTFCaXRTdHJlYW1DdHJsUXVldWUgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3VQQXVkUGxheTJCaXRTdHJlYW1DdHJsUXVldWUgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3VQQXVkUGxheTNCaXRTdHJlYW1DdHJsUXVldWUgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3VQQXVkUGxheTRCaXRTdHJlYW1DdHJsUXVldWUgKi8KLQkweDQzYywgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUHJlUHJvY0NtZFF1ZXVlICAgICAgICAgKi8KLQkweDQ1MCwgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUmVjQml0U3RyZWFtUXVldWUgICAgICAgKi8KLQkweDQ0YywgICAgICAgICAgICAgICAvKiBRRFNQX3VQQXVkUmVjQ21kUXVldWUgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3VQSnBlZ0FjdGlvbkNtZFF1ZXVlICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3VQSnBlZ0NmZ0NtZFF1ZXVlICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3VQVm9jUHJvY1F1ZXVlICAgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3ZmZUNvbW1hbmRRdWV1ZSAgICAgICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUsICAvKiBRRFNQX3ZmZUNvbW1hbmRTY2FsZVF1ZXVlICAgICAgICAgKi8KLQlRRFNQX1JUT1NfTk9fUVVFVUUgICAvKiBRRFNQX3ZmZUNvbW1hbmRUYWJsZVF1ZXVlICAgICAgICAgKi8KLX07Ci0KLS8qIFRhYmxlcyB0byBjb252ZXJ0IHRhc2tzIHRvIG1vZHVsZXMgKi8KLXN0YXRpYyBxZHNwX21vZHVsZV90eXBlICpxZHNwX3Rhc2tfdG9fbW9kdWxlW10gPSB7Ci0JcWRzcF9jb21ib190YXNrX3RvX21vZHVsZV90YWJsZSwKLQlxZHNwX2dhdWRpb190YXNrX3RvX21vZHVsZV90YWJsZSwKLQlxZHNwX3F0dl9scF90YXNrX3RvX21vZHVsZV90YWJsZSwKLX07Ci0KLS8qIFRhYmxlcyB0byByZXRyaWV2ZSBxdWV1ZSBvZmZzZXRzICovCi1zdGF0aWMgdWludDMyX3QgKnFkc3BfcXVldWVfb2Zmc2V0X3RhYmxlW10gPSB7Ci0JcWRzcF9jb21ib19xdWV1ZV9vZmZzZXRfdGFibGUsCi0JcWRzcF9nYXVkaW9fcXVldWVfb2Zmc2V0X3RhYmxlLAotCXFkc3BfcXR2X2xwX3F1ZXVlX29mZnNldF90YWJsZSwKLX07Ci0KLSNkZWZpbmUgUURTUF9NT0RVTEUobikgXAotCXsgLm5hbWUgPSAjbiwgLnBkZXZfbmFtZSA9ICJhZHNwXyIgI24sIC5pZCA9IFFEU1BfTU9EVUxFXyMjbiB9Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRzcF9tb2R1bGVfaW5mbyBtb2R1bGVfaW5mb1tdID0gewotCVFEU1BfTU9EVUxFKEFVRFBMQVkwVEFTSyksCi0JUURTUF9NT0RVTEUoQVVEUFBUQVNLKSwKLQlRRFNQX01PRFVMRShBVURQUkVQUk9DVEFTSyksCi0JUURTUF9NT0RVTEUoQVVEUkVDVEFTSyksCi0JUURTUF9NT0RVTEUoVkZFVEFTSyksCi0JUURTUF9NT0RVTEUoUUNBTVRBU0spLAotCVFEU1BfTU9EVUxFKExQTVRBU0spLAotCVFEU1BfTU9EVUxFKEpQRUdUQVNLKSwKLQlRRFNQX01PRFVMRShWSURFT1RBU0spLAotCVFEU1BfTU9EVUxFKFZERUNfTFBfTU9ERSksCi19OwotCi1pbnQgYWRzcF9pbml0X2luZm8oc3RydWN0IGFkc3BfaW5mbyAqaW5mbykKLXsKLQlpbmZvLT5zZW5kX2lycSA9ICAgMHgwMGMwMDIwMDsKLQlpbmZvLT5yZWFkX2N0cmwgPSAgMHgwMDQwMDAzODsKLQlpbmZvLT53cml0ZV9jdHJsID0gMHgwMDQwMDAzNDsKLQotCWluZm8tPm1heF9tc2cxNl9zaXplID0gMTkzOwotCWluZm8tPm1heF9tc2czMl9zaXplID0gODsKLQotCWluZm8tPm1heF90YXNrX2lkID0gMTY7Ci0JaW5mby0+bWF4X21vZHVsZV9pZCA9IFFEU1BfTU9EVUxFX01BWCAtIDE7Ci0JaW5mby0+bWF4X3F1ZXVlX2lkID0gUURTUF9RVUVVRV9NQVg7Ci0JaW5mby0+bWF4X2ltYWdlX2lkID0gMjsKLQlpbmZvLT5xdWV1ZV9vZmZzZXQgPSBxZHNwX3F1ZXVlX29mZnNldF90YWJsZTsKLQlpbmZvLT50YXNrX3RvX21vZHVsZSA9IHFkc3BfdGFza190b19tb2R1bGU7Ci0KLQlpbmZvLT5tb2R1bGVfY291bnQgPSBBUlJBWV9TSVpFKG1vZHVsZV9pbmZvKTsKLQlpbmZvLT5tb2R1bGUgPSBtb2R1bGVfaW5mbzsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfNjIyNS5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF82MjI1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNDAyYjcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF82MjI1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF82MjI1LmgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImFkc3AuaCIKLQotLyogRmlybXdhcmUgbW9kdWxlcyAqLwotdHlwZWRlZiBlbnVtIHsKLQlRRFNQX01PRFVMRV9LRVJORUwsCi0JUURTUF9NT0RVTEVfQUZFVEFTSywKLQlRRFNQX01PRFVMRV9BVURQTEFZMFRBU0ssCi0JUURTUF9NT0RVTEVfQVVEUExBWTFUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBQVEFTSywKLQlRRFNQX01PRFVMRV9WSURFT1RBU0ssCi0JUURTUF9NT0RVTEVfVklERU9fQUFDX1ZPQywKLQlRRFNQX01PRFVMRV9QQ01fREVDLAotCVFEU1BfTU9EVUxFX0FVRElPX0RFQ19NUDMsCi0JUURTUF9NT0RVTEVfQVVESU9fREVDX0FBQywKLQlRRFNQX01PRFVMRV9BVURJT19ERUNfV01BLAotCVFEU1BfTU9EVUxFX0hPU1RQQ00sCi0JUURTUF9NT0RVTEVfRFRNRiwKLQlRRFNQX01PRFVMRV9BVURSRUNUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBSRVBST0NUQVNLLAotCVFEU1BfTU9EVUxFX1NCQ19FTkMsCi0JUURTUF9NT0RVTEVfVk9DX1VNVFMsCi0JUURTUF9NT0RVTEVfVk9DX0NETUEsCi0JUURTUF9NT0RVTEVfVk9DX1BDTSwKLQlRRFNQX01PRFVMRV9WT0NFTkNUQVNLLAotCVFEU1BfTU9EVUxFX1ZPQ0RFQ1RBU0ssCi0JUURTUF9NT0RVTEVfVk9JQ0VQUk9DVEFTSywKLQlRRFNQX01PRFVMRV9WSURFT0VOQ1RBU0ssCi0JUURTUF9NT0RVTEVfVkZFVEFTSywKLQlRRFNQX01PRFVMRV9XQVZfRU5DLAotCVFEU1BfTU9EVUxFX0FBQ0xDX0VOQywKLQlRRFNQX01PRFVMRV9WSURFT19BTVIsCi0JUURTUF9NT0RVTEVfVk9DX0FNUiwKLQlRRFNQX01PRFVMRV9WT0NfRVZSQywKLQlRRFNQX01PRFVMRV9WT0NfMTNLLAotCVFEU1BfTU9EVUxFX1ZPQ19GR1YsCi0JUURTUF9NT0RVTEVfRElBR1RBU0ssCi0JUURTUF9NT0RVTEVfSlBFR1RBU0ssCi0JUURTUF9NT0RVTEVfTFBNVEFTSywKLQlRRFNQX01PRFVMRV9RQ0FNVEFTSywKLQlRRFNQX01PRFVMRV9NT0RNQVRIVEFTSywKLQlRRFNQX01PRFVMRV9BVURQTEFZMlRBU0ssCi0JUURTUF9NT0RVTEVfQVVEUExBWTNUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBMQVk0VEFTSywKLQlRRFNQX01PRFVMRV9HUkFQSElDU1RBU0ssCi0JUURTUF9NT0RVTEVfTUlESSwKLQlRRFNQX01PRFVMRV9HQVVESU8sCi0JUURTUF9NT0RVTEVfVkRFQ19MUF9NT0RFLAotCVFEU1BfTU9EVUxFX01BWCwKLX0gcWRzcF9tb2R1bGVfdHlwZTsKLQotI2RlZmluZSBRRFNQX1JUT1NfTUFYX1RBU0tfSUQgIDMwVQotCi0vKiBUYWJsZSBvZiBtb2R1bGVzIGluZGV4ZWQgYnkgdGFzayBJRCBmb3IgdGhlIEdBVURJTyBpbWFnZSAqLwotc3RhdGljIHFkc3BfbW9kdWxlX3R5cGUgcWRzcF9nYXVkaW9fdGFza190b19tb2R1bGVfdGFibGVbXSA9IHsKLQlRRFNQX01PRFVMRV9LRVJORUwsCi0JUURTUF9NT0RVTEVfQUZFVEFTSywKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfQVVEUFBUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBMQVkwVEFTSywKLQlRRFNQX01PRFVMRV9BVURQTEFZMVRBU0ssCi0JUURTUF9NT0RVTEVfQVVEUExBWTJUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBMQVkzVEFTSywKLQlRRFNQX01PRFVMRV9BVURQTEFZNFRBU0ssCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX0FVRFJFQ1RBU0ssCi0JUURTUF9NT0RVTEVfQVVEUFJFUFJPQ1RBU0ssCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX0dSQVBISUNTVEFTSywKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLX07Ci0KLS8qIFF1ZXVlIG9mZnNldCB0YWJsZSBpbmRleGVkIGJ5IHF1ZXVlIElEIGZvciB0aGUgR0FVRElPIGltYWdlICovCi1zdGF0aWMgdWludDMyX3QgcWRzcF9nYXVkaW9fcXVldWVfb2Zmc2V0X3RhYmxlW10gPSB7Ci0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF9scG1Db21tYW5kUXVldWUgICAgICAgICAgICAgICovCi0JMHgzZjAsICAgICAgICAgICAgICAgLyogUURTUF9tcHVBZmVRdWV1ZSAgICAgICAgICAgICAgICAgICovCi0JMHg0MjAsICAgICAgICAgICAgICAgLyogUURTUF9tcHVHcmFwaGljc0NtZFF1ZXVlICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF9tcHVNb2RtYXRoQ21kUXVldWUgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF9tcHVWRGVjQ21kUXVldWUgICAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF9tcHVWRGVjUGt0UXVldWUgICAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF9tcHVWRW5jQ21kUXVldWUgICAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF9yeE1wdURlY0NtZFF1ZXVlICAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF9yeE1wdURlY1BrdFF1ZXVlICAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF90eE1wdUVuY1F1ZXVlICAgICAgICAgICAgICAgICovCi0JMHgzZjQsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFBQQ21kMVF1ZXVlICAgICAgICAgICAgICovCi0JMHgzZjgsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFBQQ21kMlF1ZXVlICAgICAgICAgICAgICovCi0JMHgzZmMsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFBQQ21kM1F1ZXVlICAgICAgICAgICAgICovCi0JMHg0MGMsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFBsYXkwQml0U3RyZWFtQ3RybFF1ZXVlICovCi0JMHg0MTAsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFBsYXkxQml0U3RyZWFtQ3RybFF1ZXVlICovCi0JMHg0MTQsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFBsYXkyQml0U3RyZWFtQ3RybFF1ZXVlICovCi0JMHg0MTgsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFBsYXkzQml0U3RyZWFtQ3RybFF1ZXVlICovCi0JMHg0MWMsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFBsYXk0Qml0U3RyZWFtQ3RybFF1ZXVlICovCi0JMHg0MDAsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFByZVByb2NDbWRRdWV1ZSAgICAgICAgICovCi0JMHg0MDgsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFJlY0JpdFN0cmVhbVF1ZXVlICAgICAgICovCi0JMHg0MDQsICAgICAgICAgICAgICAgLyogUURTUF91UEF1ZFJlY0NtZFF1ZXVlICAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF91UEpwZWdBY3Rpb25DbWRRdWV1ZSAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF91UEpwZWdDZmdDbWRRdWV1ZSAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF91UFZvY1Byb2NRdWV1ZSAgICAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF92ZmVDb21tYW5kUXVldWUgICAgICAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF92ZmVDb21tYW5kU2NhbGVRdWV1ZSAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF92ZmVDb21tYW5kVGFibGVRdWV1ZSAgICAgICAgICovCi0JUURTUF9SVE9TX05PX1FVRVVFLCAgLyogUURTUF91UERpYWdRdWV1ZSAgICAgICAgICAgICAgICAgICovCi19OwotCi0vKiBUYWJsZSBvZiBtb2R1bGVzIGluZGV4ZWQgYnkgdGFzayBJRCBmb3IgdGhlIENPTUJPIGltYWdlICovCi1zdGF0aWMgcWRzcF9tb2R1bGVfdHlwZSBxZHNwX2NvbWJvX3Rhc2tfdG9fbW9kdWxlX3RhYmxlW10gPSB7Ci0JUURTUF9NT0RVTEVfS0VSTkVMLAotCVFEU1BfTU9EVUxFX0FGRVRBU0ssCi0JUURTUF9NT0RVTEVfVk9DREVDVEFTSywKLQlRRFNQX01PRFVMRV9WT0NFTkNUQVNLLAotCVFEU1BfTU9EVUxFX1ZJREVPVEFTSywKLQlRRFNQX01PRFVMRV9WSURFT0VOQ1RBU0ssCi0JUURTUF9NT0RVTEVfVk9JQ0VQUk9DVEFTSywKLQlRRFNQX01PRFVMRV9WRkVUQVNLLAotCVFEU1BfTU9EVUxFX0pQRUdUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBQVEFTSywKLQlRRFNQX01PRFVMRV9BVURQTEFZMFRBU0ssCi0JUURTUF9NT0RVTEVfQVVEUExBWTFUQVNLLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX0xQTVRBU0ssCi0JUURTUF9NT0RVTEVfQVVEUkVDVEFTSywKLQlRRFNQX01PRFVMRV9BVURQUkVQUk9DVEFTSywKLQlRRFNQX01PRFVMRV9NT0RNQVRIVEFTSywKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX0RJQUdUQVNLLAotCVFEU1BfTU9EVUxFX01BWCwKLX07Ci0KLS8qIFF1ZXVlIG9mZnNldCB0YWJsZSBpbmRleGVkIGJ5IHF1ZXVlIElEIGZvciB0aGUgQ09NQk8gaW1hZ2UgKi8KLXN0YXRpYyB1aW50MzJfdCBxZHNwX2NvbWJvX3F1ZXVlX29mZnNldF90YWJsZVtdID0gewotCTB4NzE0LCAgICAgICAgICAgICAgIC8qIFFEU1BfbHBtQ29tbWFuZFF1ZXVlICAgICAgICAgICAgICAqLwotCTB4NmJjLCAgICAgICAgICAgICAgIC8qIFFEU1BfbXB1QWZlUXVldWUgICAgICAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfbXB1R3JhcGhpY3NDbWRRdWV1ZSAgICAgICAgICAqLwotCTB4NmQwLCAgICAgICAgICAgICAgIC8qIFFEU1BfbXB1TW9kbWF0aENtZFF1ZXVlICAgICAgICAgICAqLwotCTB4NmU4LCAgICAgICAgICAgICAgIC8qIFFEU1BfbXB1VkRlY0NtZFF1ZXVlICAgICAgICAgICAgICAqLwotCTB4NmVjLCAgICAgICAgICAgICAgIC8qIFFEU1BfbXB1VkRlY1BrdFF1ZXVlICAgICAgICAgICAgICAqLwotCTB4NmU0LCAgICAgICAgICAgICAgIC8qIFFEU1BfbXB1VkVuY0NtZFF1ZXVlICAgICAgICAgICAgICAqLwotCTB4NmM0LCAgICAgICAgICAgICAgIC8qIFFEU1BfcnhNcHVEZWNDbWRRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NmM4LCAgICAgICAgICAgICAgIC8qIFFEU1BfcnhNcHVEZWNQa3RRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NmNjLCAgICAgICAgICAgICAgIC8qIFFEU1BfdHhNcHVFbmNRdWV1ZSAgICAgICAgICAgICAgICAqLwotCTB4NmYwLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQUENtZDFRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NmY0LCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQUENtZDJRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NmY4LCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQUENtZDNRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NzA4LCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQbGF5MEJpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBBdWRQbGF5MUJpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBBdWRQbGF5MkJpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBBdWRQbGF5M0JpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBBdWRQbGF5NEJpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCTB4NmZjLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQcmVQcm9jQ21kUXVldWUgICAgICAgICAqLwotCTB4NzA0LCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRSZWNCaXRTdHJlYW1RdWV1ZSAgICAgICAqLwotCTB4NzAwLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRSZWNDbWRRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NzEwLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBKcGVnQWN0aW9uQ21kUXVldWUgICAgICAgICAqLwotCTB4NzBjLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBKcGVnQ2ZnQ21kUXVldWUgICAgICAgICAgICAqLwotCTB4NmMwLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBWb2NQcm9jUXVldWUgICAgICAgICAgICAgICAqLwotCTB4NmQ4LCAgICAgICAgICAgICAgIC8qIFFEU1BfdmZlQ29tbWFuZFF1ZXVlICAgICAgICAgICAgICAqLwotCTB4NmUwLCAgICAgICAgICAgICAgIC8qIFFEU1BfdmZlQ29tbWFuZFNjYWxlUXVldWUgICAgICAgICAqLwotCTB4NmRjLCAgICAgICAgICAgICAgIC8qIFFEU1BfdmZlQ29tbWFuZFRhYmxlUXVldWUgICAgICAgICAqLwotCTB4NmQ0LCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBEaWFnUXVldWUgICAgICAgICAgICAgICAgICAqLwotfTsKLQotLyogVGFibGUgb2YgbW9kdWxlcyBpbmRleGVkIGJ5IHRhc2sgSUQgZm9yIHRoZSBRVFZfTFAgaW1hZ2UgKi8KLXN0YXRpYyBxZHNwX21vZHVsZV90eXBlIHFkc3BfcXR2X2xwX3Rhc2tfdG9fbW9kdWxlX3RhYmxlW10gPSB7Ci0JUURTUF9NT0RVTEVfS0VSTkVMLAotCVFEU1BfTU9EVUxFX0FGRVRBU0ssCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9WSURFT1RBU0ssCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX0FVRFBQVEFTSywKLQlRRFNQX01PRFVMRV9BVURQTEFZMFRBU0ssCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9BVURSRUNUQVNLLAotCVFEU1BfTU9EVUxFX0FVRFBSRVBST0NUQVNLLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi0JUURTUF9NT0RVTEVfTUFYLAotCVFEU1BfTU9EVUxFX01BWCwKLQlRRFNQX01PRFVMRV9NQVgsCi19OwotCi0vKiBRdWV1ZSBvZmZzZXQgdGFibGUgaW5kZXhlZCBieSBxdWV1ZSBJRCBmb3IgdGhlIFFUVl9MUCBpbWFnZSAqLwotc3RhdGljIHVpbnQzMl90IHFkc3BfcXR2X2xwX3F1ZXVlX29mZnNldF90YWJsZVtdID0gewotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfbHBtQ29tbWFuZFF1ZXVlICAgICAgICAgICAgICAqLwotCTB4M2ZlLCAgICAgICAgICAgICAgIC8qIFFEU1BfbXB1QWZlUXVldWUgICAgICAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfbXB1R3JhcGhpY3NDbWRRdWV1ZSAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfbXB1TW9kbWF0aENtZFF1ZXVlICAgICAgICAgICAqLwotCTB4NDAyLCAgICAgICAgICAgICAgIC8qIFFEU1BfbXB1VkRlY0NtZFF1ZXVlICAgICAgICAgICAgICAqLwotCTB4NDA2LCAgICAgICAgICAgICAgIC8qIFFEU1BfbXB1VkRlY1BrdFF1ZXVlICAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfbXB1VkVuY0NtZFF1ZXVlICAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfcnhNcHVEZWNDbWRRdWV1ZSAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfcnhNcHVEZWNQa3RRdWV1ZSAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdHhNcHVFbmNRdWV1ZSAgICAgICAgICAgICAgICAqLwotCTB4NDBlLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQUENtZDFRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NDEyLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQUENtZDJRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NDE2LCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQUENtZDNRdWV1ZSAgICAgICAgICAgICAqLwotCTB4NDIyLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQbGF5MEJpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBBdWRQbGF5MUJpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBBdWRQbGF5MkJpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBBdWRQbGF5M0JpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBBdWRQbGF5NEJpdFN0cmVhbUN0cmxRdWV1ZSAqLwotCTB4NDBhLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRQcmVQcm9jQ21kUXVldWUgICAgICAgICAqLwotCTB4NDFlLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRSZWNCaXRTdHJlYW1RdWV1ZSAgICAgICAqLwotCTB4NDFhLCAgICAgICAgICAgICAgIC8qIFFEU1BfdVBBdWRSZWNDbWRRdWV1ZSAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBKcGVnQWN0aW9uQ21kUXVldWUgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBKcGVnQ2ZnQ21kUXVldWUgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBWb2NQcm9jUXVldWUgICAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdmZlQ29tbWFuZFF1ZXVlICAgICAgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdmZlQ29tbWFuZFNjYWxlUXVldWUgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdmZlQ29tbWFuZFRhYmxlUXVldWUgICAgICAgICAqLwotCVFEU1BfUlRPU19OT19RVUVVRSwgIC8qIFFEU1BfdVBEaWFnUXVldWUgICAgICAgICAgICAgICAgICAqLwotfTsKLQotLyogVGFibGVzIHRvIGNvbnZlcnQgdGFza3MgdG8gbW9kdWxlcyAqLwotc3RhdGljIHFkc3BfbW9kdWxlX3R5cGUgKnFkc3BfdGFza190b19tb2R1bGVbXSA9IHsKLQlxZHNwX2NvbWJvX3Rhc2tfdG9fbW9kdWxlX3RhYmxlLAotCXFkc3BfZ2F1ZGlvX3Rhc2tfdG9fbW9kdWxlX3RhYmxlLAotCXFkc3BfcXR2X2xwX3Rhc2tfdG9fbW9kdWxlX3RhYmxlLAotfTsKLQotLyogVGFibGVzIHRvIHJldHJpZXZlIHF1ZXVlIG9mZnNldHMgKi8KLXN0YXRpYyB1aW50MzJfdCAqcWRzcF9xdWV1ZV9vZmZzZXRfdGFibGVbXSA9IHsKLQlxZHNwX2NvbWJvX3F1ZXVlX29mZnNldF90YWJsZSwKLQlxZHNwX2dhdWRpb19xdWV1ZV9vZmZzZXRfdGFibGUsCi0JcWRzcF9xdHZfbHBfcXVldWVfb2Zmc2V0X3RhYmxlLAotfTsKLQotI2RlZmluZSBRRFNQX01PRFVMRShuLCBjbGtuYW1lLCBjbGtyYXRlLCB2ZXJpZnlfY21kX2Z1bmMsIHBhdGNoX2V2ZW50X2Z1bmMpIFwKLQl7IC5uYW1lID0gI24sIC5wZGV2X25hbWUgPSAiYWRzcF8iICNuLCAuaWQgPSBRRFNQX01PRFVMRV8jI24sIFwKLQkgIC5jbGtfbmFtZSA9IGNsa25hbWUsIC5jbGtfcmF0ZSA9IGNsa3JhdGUsIFwKLQkgIC52ZXJpZnlfY21kID0gdmVyaWZ5X2NtZF9mdW5jLCAucGF0Y2hfZXZlbnQgPSBwYXRjaF9ldmVudF9mdW5jIH0KLQotc3RhdGljIHN0cnVjdCBhZHNwX21vZHVsZV9pbmZvIG1vZHVsZV9pbmZvW10gPSB7Ci0JUURTUF9NT0RVTEUoQVVEUExBWTBUQVNLLCBOVUxMLCAwLCBOVUxMLCBOVUxMKSwKLQlRRFNQX01PRFVMRShBVURQUFRBU0ssIE5VTEwsIDAsIE5VTEwsIE5VTEwpLAotCVFEU1BfTU9EVUxFKEFVRFJFQ1RBU0ssIE5VTEwsIDAsIE5VTEwsIE5VTEwpLAotCVFEU1BfTU9EVUxFKEFVRFBSRVBST0NUQVNLLCBOVUxMLCAwLCBOVUxMLCBOVUxMKSwKLQlRRFNQX01PRFVMRShWRkVUQVNLLCAidmZlX2NsayIsIDAsIGFkc3BfdmZlX3ZlcmlmeV9jbWQsCi0JCWFkc3BfdmZlX3BhdGNoX2V2ZW50KSwKLQlRRFNQX01PRFVMRShRQ0FNVEFTSywgTlVMTCwgMCwgTlVMTCwgTlVMTCksCi0JUURTUF9NT0RVTEUoTFBNVEFTSywgTlVMTCwgMCwgYWRzcF9scG1fdmVyaWZ5X2NtZCwgTlVMTCksCi0JUURTUF9NT0RVTEUoSlBFR1RBU0ssICJ2ZGNfY2xrIiwgMCwgYWRzcF9qcGVnX3ZlcmlmeV9jbWQsCi0JCWFkc3BfanBlZ19wYXRjaF9ldmVudCksCi0JUURTUF9NT0RVTEUoVklERU9UQVNLLCAidmRjX2NsayIsIDk2MDAwMDAwLAotCQlhZHNwX3ZpZGVvX3ZlcmlmeV9jbWQsIE5VTEwpLAotCVFEU1BfTU9EVUxFKFZERUNfTFBfTU9ERSwgTlVMTCwgMCwgTlVMTCwgTlVMTCksCi0JUURTUF9NT0RVTEUoVklERU9FTkNUQVNLLCAidmRjX2NsayIsIDk2MDAwMDAwLAotCQlhZHNwX3ZpZGVvZW5jX3ZlcmlmeV9jbWQsIE5VTEwpLAotfTsKLQotaW50IGFkc3BfaW5pdF9pbmZvKHN0cnVjdCBhZHNwX2luZm8gKmluZm8pCi17Ci0JaW5mby0+c2VuZF9pcnEgPSAgIDB4MDBjMDAyMDA7Ci0JaW5mby0+cmVhZF9jdHJsID0gIDB4MDA0MDAwMzg7Ci0JaW5mby0+d3JpdGVfY3RybCA9IDB4MDA0MDAwMzQ7Ci0KLQlpbmZvLT5tYXhfbXNnMTZfc2l6ZSA9IDE5MzsKLQlpbmZvLT5tYXhfbXNnMzJfc2l6ZSA9IDg7Ci0KLQlpbmZvLT5tYXhfdGFza19pZCA9IDE2OwotCWluZm8tPm1heF9tb2R1bGVfaWQgPSBRRFNQX01PRFVMRV9NQVggLSAxOwotCWluZm8tPm1heF9xdWV1ZV9pZCA9IFFEU1BfUVVFVUVfTUFYOwotCWluZm8tPm1heF9pbWFnZV9pZCA9IDI7Ci0JaW5mby0+cXVldWVfb2Zmc2V0ID0gcWRzcF9xdWV1ZV9vZmZzZXRfdGFibGU7Ci0JaW5mby0+dGFza190b19tb2R1bGUgPSBxZHNwX3Rhc2tfdG9fbW9kdWxlOwotCi0JaW5mby0+bW9kdWxlX2NvdW50ID0gQVJSQVlfU0laRShtb2R1bGVfaW5mbyk7Ci0JaW5mby0+bW9kdWxlID0gbW9kdWxlX2luZm87Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwX2RlYnVnLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwX2RlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZGRkNDMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF9kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLQotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9zbWQuaD4KLQotI2luY2x1ZGUgImFkc3AuaCIKLQotI2RlZmluZSBNQVhfTEVOIDY0Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqYWRzcF9kZW50cnk7Ci0jZW5kaWYKLXN0YXRpYyBjaGFyIGxfYnVmW01BWF9MRU5dOwotc3RhdGljIHVuc2lnbmVkIGludCBjcmFzaF9lbmFibGU7Ci0KLXN0YXRpYyBzc2l6ZV90IHE1X2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlNTV9EQkcoInE1IGRlYnVnZnMgb3BlbmVkXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgcTVfZGVidWdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JaW50IGxlbjsKLQotCWlmIChjb3VudCA8IDApCi0JCXJldHVybiAwOwotCWxlbiA9IGNvdW50ID4gKE1BWF9MRU4gLSAxKSA/IChNQVhfTEVOIC0gMSkgOiBjb3VudDsKLQlpZiAoY29weV9mcm9tX3VzZXIobF9idWYsIGJ1ZiwgbGVuKSkgewotCQlNTV9JTkZPKCJVbmFibGUgdG8gY29weSBkYXRhIGZyb20gdXNlciBzcGFjZVxuIik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQlsX2J1ZltsZW5dID0gMDsKLQlpZiAobF9idWZbbGVuIC0gMV0gPT0gJ1xuJykgewotCQlsX2J1ZltsZW4gLSAxXSA9IDA7Ci0JCWxlbi0tOwotCX0KLQlpZiAoIXN0cm5jbXAobF9idWYsICJib29tIiwgTUFYX0xFTikpIHsKLQkJcTVhdWRpb19kc3Bfbm90X3Jlc3BvbmRpbmcoKTsKLQl9IGVsc2UgaWYgKCFzdHJuY21wKGxfYnVmLCAiZW5hYmxlIiwgTUFYX0xFTikpIHsKLQkJY3Jhc2hfZW5hYmxlID0gMTsKLQkJTU1fSU5GTygiQ3Jhc2ggZW5hYmxlZCA6ICVkXG4iLCBjcmFzaF9lbmFibGUpOwotCX0gZWxzZSBpZiAoIXN0cm5jbXAobF9idWYsICJkaXNhYmxlIiwgTUFYX0xFTikpIHsKLQkJY3Jhc2hfZW5hYmxlID0gMDsKLQkJTU1fSU5GTygiQ3Jhc2ggZGlzYWJsZWQgOiAlZFxuIiwgY3Jhc2hfZW5hYmxlKTsKLQl9IGVsc2UKLQkJTU1fSU5GTygiVW5rbm93biBDb21tYW5kXG4iKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcTVfZGVidWdfZm9wcyA9IHsKLQkud3JpdGUgPSBxNV9kZWJ1Z193cml0ZSwKLQkub3BlbiA9IHE1X2RlYnVnX29wZW4sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBxNV9kZWJ1Z19pbml0KHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JYWRzcF9kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJxNV9kZWJ1ZyIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCU5VTEwsICh2b2lkICopIE5VTEwsICZxNV9kZWJ1Z19mb3BzKTsKLSNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KLQlyZXR1cm4gMDsKLX0KLWRldmljZV9pbml0Y2FsbChxNV9kZWJ1Z19pbml0KTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF9kcml2ZXIuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfZHJpdmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOWMzODguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF9kcml2ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDc0NCArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwX2RyaXZlci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQXV0aG9yOiBJbGl5YW4gTWFsY2hldiA8aWJtQGFuZHJvaWQuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgImFkc3AuaCIKLSNpbmNsdWRlIDxsaW51eC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLQotc3RydWN0IGFkc3BfaW9uX2luZm8gewotCWludCBmZDsKLQl2b2lkICp2YWRkcjsKLX07Ci0KLXN0cnVjdCBhZHNwX2lvbl9yZWdpb24gewotCXN0cnVjdCBobGlzdF9ub2RlIGxpc3Q7Ci0Jdm9pZCAqdmFkZHI7Ci0JdW5zaWduZWQgbG9uZyBwYWRkcjsKLQl1bnNpZ25lZCBsb25nIGt2YWRkcjsKLQl1bnNpZ25lZCBsb25nIGxlbjsKLQl1bnNpZ25lZCBsb25nIGlvbl9mbGFnOwotCXN0cnVjdCBmaWxlICpmaWxlOwotCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGU7Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKLQlpbnQgZmQ7Ci19OwotCi1zdHJ1Y3QgYWRzcF9kZXZpY2UgewotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZTsKLQotCXNwaW5sb2NrX3QgZXZlbnRfcXVldWVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF93YWl0OwotCXN0cnVjdCBsaXN0X2hlYWQgZXZlbnRfcXVldWU7Ci0JaW50IGFib3J0OwotCi0JY29uc3QgY2hhciAqbmFtZTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7Ci0Jc3RydWN0IGNkZXYgY2RldjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRzcF9kZXZpY2UgKmlub2RlX3RvX2RldmljZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKLQotI2RlZmluZSBfX0NPTlRBSU5TKHIsIHYsIGwpICh7CQkJCQlcCi0JdHlwZW9mKHIpIF9fciA9IHI7CQkJCQlcCi0JdHlwZW9mKHYpIF9fdiA9IHY7CQkJCQlcCi0JdHlwZW9mKHYpIF9fZSA9IF9fdiArIGw7CQkJCVwKLQlpbnQgcmVzID0gX192ID49IF9fci0+dmFkZHIgJiYgCQkJCVwKLQkJX19lIDw9IF9fci0+dmFkZHIgKyBfX3ItPmxlbjsJCQlcCi0JcmVzOwkJCQkJCQlcCi19KQotCi0jZGVmaW5lIENPTlRBSU5TKHIxLCByMikgKHsJCQkJCVwKLQl0eXBlb2YocjIpIF9fcjIgPSByMjsJCQkJCVwKLQlfX0NPTlRBSU5TKHIxLCBfX3IyLT52YWRkciwgX19yMi0+bGVuKTsJCQlcCi19KQotCi0jZGVmaW5lIElOX1JBTkdFKHIsIHYpICh7CQkJCQlcCi0JdHlwZW9mKHIpIF9fciA9IHI7CQkJCQlcCi0JdHlwZW9mKHYpIF9fdnYgPSB2OwkJCQkJXAotCWludCByZXMgPSAoKF9fdnYgPj0gX19yLT52YWRkcikgJiYJCQlcCi0JCShfX3Z2IDwgKF9fci0+dmFkZHIgKyBfX3ItPmxlbikpKTsJCVwKLQlyZXM7CQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgT1ZFUkxBUFMocjEsIHIyKSAoewkJCQkJXAotCXR5cGVvZihyMSkgX19yMSA9IHIxOwkJCQkJXAotCXR5cGVvZihyMikgX19yMiA9IHIyOwkJCQkJXAotCXR5cGVvZihfX3IyLT52YWRkcikgX192ID0gX19yMi0+dmFkZHI7CQkJXAotCXR5cGVvZihfX3YpIF9fZSA9IF9fdiArIF9fcjItPmxlbiAtIDE7CQkJXAotCWludCByZXMgPSAoSU5fUkFOR0UoX19yMSwgX192KSB8fCBJTl9SQU5HRShfX3IxLCBfX2UpKTsJXAotCXJlczsJCQkJCQkJXAotfSkKLQotc3RhdGljIGludCBhZHNwX2lvbl9jaGVjayhzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCXZvaWQgKnZhZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKLXsKLQlzdHJ1Y3QgYWRzcF9pb25fcmVnaW9uICpyZWdpb25fZWx0OwotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwotCXN0cnVjdCBhZHNwX2lvbl9yZWdpb24gdCA9IHsgLnZhZGRyID0gdmFkZHIsIC5sZW4gPSBsZW4gfTsKLQotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZ2lvbl9lbHQsIG5vZGUsICZtb2R1bGUtPmlvbl9yZWdpb25zLCBsaXN0KSB7Ci0JCWlmIChDT05UQUlOUyhyZWdpb25fZWx0LCAmdCkgfHwgQ09OVEFJTlMoJnQsIHJlZ2lvbl9lbHQpIHx8Ci0JCSAgICBPVkVSTEFQUyhyZWdpb25fZWx0LCAmdCkpIHsKLQkJCU1NX0VSUigibW9kdWxlICVzOiIKLQkJCQkiIHJlZ2lvbiAodmFkZHIgJXAgbGVuICVsZCkiCi0JCQkJIiBjbGFzaGVzIHdpdGggcmVnaXN0ZXJlZCByZWdpb24iCi0JCQkJIiAodmFkZHIgJXAgcGFkZHIgJXAgbGVuICVsZClcbiIsCi0JCQkJbW9kdWxlLT5uYW1lLAotCQkJCXZhZGRyLCBsZW4sCi0JCQkJcmVnaW9uX2VsdC0+dmFkZHIsCi0JCQkJKHZvaWQgKilyZWdpb25fZWx0LT5wYWRkciwKLQkJCQlyZWdpb25fZWx0LT5sZW4pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZXRfaW9uX3JlZ2lvbl9pbmZvKGludCBmZCwgc3RydWN0IGFkc3BfaW9uX3JlZ2lvbiAqcmVnaW9uKQotewotCXVuc2lnbmVkIGxvbmcgaW9uZmxhZzsKLQl2b2lkICp0ZW1wX3B0cjsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCi0JcmVnaW9uLT5jbGllbnQgPSBtc21faW9uX2NsaWVudF9jcmVhdGUoVUlOVF9NQVgsICJWaWRlb19DbGllbnQiKTsKLQlpZiAoSVNfRVJSX09SX05VTEwocmVnaW9uLT5jbGllbnQpKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGNyZWF0ZSBJT04gY2xpZW50XG4iKTsKLQkJZ290byBjbGllbnRfZXJyb3I7Ci0JfQotCXJlZ2lvbi0+aGFuZGxlID0gaW9uX2ltcG9ydF9kbWFfYnVmKHJlZ2lvbi0+Y2xpZW50LCBmZCk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKHJlZ2lvbi0+aGFuZGxlKSkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGhhbmRsZSBvZiB0aGUgZ2l2ZW4gZmRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBpbXBvcnRfZXJyb3I7Ci0JfQotCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MocmVnaW9uLT5jbGllbnQsIHJlZ2lvbi0+aGFuZGxlLCAmaW9uZmxhZyk7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIsIF9fZnVuY19fKTsKLQkJZ290byBmbGFnX2Vycm9yOwotCX0KLQl0ZW1wX3B0ciA9IGlvbl9tYXBfa2VybmVsKHJlZ2lvbi0+Y2xpZW50LCByZWdpb24tPmhhbmRsZSk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKHRlbXBfcHRyKSkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IHZpcnR1YWwgYWRkcmVzc1xuIiwgX19mdW5jX18pOwotCQlnb3RvIG1hcF9lcnJvcjsKLQl9Ci0JcmVnaW9uLT5rdmFkZHIgPSAodW5zaWduZWQgbG9uZykgdGVtcF9wdHI7Ci0JcmVnaW9uLT5pb25fZmxhZyA9ICh1bnNpZ25lZCBsb25nKSBpb25mbGFnOwotCi0JcmMgPSBpb25fcGh5cyhyZWdpb24tPmNsaWVudCwgcmVnaW9uLT5oYW5kbGUsICZyZWdpb24tPnBhZGRyLAotCQkJCQkoc2l6ZV90ICopKCZyZWdpb24tPmxlbikpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IHBoeXNpY2FsIGFkZHJlc3NcbiIsIF9fZnVuY19fKTsKLQkJZ290byBpb25fZXJyb3I7Ci0JfQotCXJldHVybiByYzsKLWlvbl9lcnJvcjoKLQlpb25fdW5tYXBfa2VybmVsKHJlZ2lvbi0+Y2xpZW50LCByZWdpb24tPmhhbmRsZSk7Ci1tYXBfZXJyb3I6Ci0JaW9uX2ZyZWUocmVnaW9uLT5jbGllbnQsIHJlZ2lvbi0+aGFuZGxlKTsKLWZsYWdfZXJyb3I6Ci1pbXBvcnRfZXJyb3I6Ci0JaW9uX2NsaWVudF9kZXN0cm95KHJlZ2lvbi0+Y2xpZW50KTsKLWNsaWVudF9lcnJvcjoKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHZvaWQgZnJlZV9pb25fcmVnaW9uKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsCi0JCQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKQotewotCWlvbl91bm1hcF9rZXJuZWwoY2xpZW50LCBoYW5kbGUpOwotCWlvbl9mcmVlKGNsaWVudCwgaGFuZGxlKTsKLQlpb25fY2xpZW50X2Rlc3Ryb3koY2xpZW50KTsKLX0KLQotc3RhdGljIGludCBhZHNwX2lvbl9hZGQoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotCQkJIHN0cnVjdCBhZHNwX2lvbl9pbmZvICppbmZvKQotewotCXN0cnVjdCBhZHNwX2lvbl9yZWdpb24gKnJlZ2lvbjsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCW11dGV4X2xvY2soJm1vZHVsZS0+aW9uX3JlZ2lvbnNfbG9jayk7Ci0JcmVnaW9uID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFkc3BfaW9uX3JlZ2lvbiksIEdGUF9LRVJORUwpOwotCWlmICghcmVnaW9uKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlbmQ7Ci0JfQotCUlOSVRfSExJU1RfTk9ERSgmcmVnaW9uLT5saXN0KTsKLQlpZiAoZ2V0X2lvbl9yZWdpb25faW5mbyhpbmZvLT5mZCwgcmVnaW9uKSkgewotCQlrZnJlZShyZWdpb24pOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlyYyA9IGFkc3BfaW9uX2NoZWNrKG1vZHVsZSwgaW5mby0+dmFkZHIsIHJlZ2lvbi0+bGVuKTsKLQlpZiAocmMgPCAwKSB7Ci0JCWZyZWVfaW9uX3JlZ2lvbihyZWdpb24tPmNsaWVudCwgcmVnaW9uLT5oYW5kbGUpOwotCQlrZnJlZShyZWdpb24pOwotCQlnb3RvIGVuZDsKLQl9Ci0JcmVnaW9uLT52YWRkciA9IGluZm8tPnZhZGRyOwotCXJlZ2lvbi0+ZmQgPSBpbmZvLT5mZDsKLQlyZWdpb24tPmZpbGUgPSBOVUxMOwotCU1NX0lORk8oImFkc3BfaW9uX2FkZDogbW9kdWxlICVzOiBmZCAlZCwgdmFkZHIgT3gleCwgbGVuICVkXG4iLAotCQkJbW9kdWxlLT5uYW1lLCByZWdpb24tPmZkLCAodW5zaWduZWQgaW50KXJlZ2lvbi0+dmFkZHIsCi0JCQkoaW50KXJlZ2lvbi0+bGVuKTsKLQlobGlzdF9hZGRfaGVhZCgmcmVnaW9uLT5saXN0LCAmbW9kdWxlLT5pb25fcmVnaW9ucyk7Ci1lbmQ6Ci0JbXV0ZXhfdW5sb2NrKCZtb2R1bGUtPmlvbl9yZWdpb25zX2xvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhZHNwX2lvbl9sb29rdXBfdmFkZHIoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLCB2b2lkICoqYWRkciwKLQkJICAgICB1bnNpZ25lZCBsb25nIGxlbiwgc3RydWN0IGFkc3BfaW9uX3JlZ2lvbiAqKnJlZ2lvbikKLXsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKLQl2b2lkICp2YWRkciA9ICphZGRyOwotCXN0cnVjdCBhZHNwX2lvbl9yZWdpb24gKnJlZ2lvbl9lbHQ7Ci0KLQlpbnQgbWF0Y2hfY291bnQgPSAwOwotCi0JKnJlZ2lvbiA9IE5VTEw7Ci0KLQkvKiByZXR1cm5zIHBoeXNpY2FsIGFkZHJlc3Mgb3IgemVybyAqLwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZ2lvbl9lbHQsIG5vZGUsICZtb2R1bGUtPmlvbl9yZWdpb25zLCBsaXN0KSB7Ci0JCWlmICh2YWRkciA+PSByZWdpb25fZWx0LT52YWRkciAmJgotCQkgICAgdmFkZHIgPCByZWdpb25fZWx0LT52YWRkciArIHJlZ2lvbl9lbHQtPmxlbiAmJgotCQkgICAgdmFkZHIgKyBsZW4gPD0gcmVnaW9uX2VsdC0+dmFkZHIgKyByZWdpb25fZWx0LT5sZW4pIHsKLQkJCS8qIG9mZnNldCBzaW5jZSB3ZSBjb3VsZCBwYXNzIHZhZGRyIGluc2lkZSBhIHJlZ2lzdGVyZAotCQkJICogcG1lbSBidWZmZXIKLQkJCSAqLwotCi0JCQltYXRjaF9jb3VudCsrOwotCQkJaWYgKCEqcmVnaW9uKQotCQkJCSpyZWdpb24gPSByZWdpb25fZWx0OwotCQl9Ci0JfQotCi0JaWYgKG1hdGNoX2NvdW50ID4gMSkgewotCQlNTV9FUlIoIm1vZHVsZSAlczogIgotCQkJIm11bHRpcGxlIGhpdHMgZm9yIHZhZGRyICVwLCBsZW4gJWxkXG4iLAotCQkJbW9kdWxlLT5uYW1lLCB2YWRkciwgbGVuKTsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkocmVnaW9uX2VsdCwgbm9kZSwKLQkJCQkmbW9kdWxlLT5pb25fcmVnaW9ucywgbGlzdCkgewotCQkJaWYgKHZhZGRyID49IHJlZ2lvbl9lbHQtPnZhZGRyICYmCi0JCQkgICAgdmFkZHIgPCByZWdpb25fZWx0LT52YWRkciArIHJlZ2lvbl9lbHQtPmxlbiAmJgotCQkJICAgIHZhZGRyICsgbGVuIDw9IHJlZ2lvbl9lbHQtPnZhZGRyICsgcmVnaW9uX2VsdC0+bGVuKQotCQkJCU1NX0VSUigiJXAsICVsZCAtLT4gJXBcbiIsCi0JCQkJCXJlZ2lvbl9lbHQtPnZhZGRyLAotCQkJCQlyZWdpb25fZWx0LT5sZW4sCi0JCQkJCSh2b2lkICopcmVnaW9uX2VsdC0+cGFkZHIpOwotCQl9Ci0JfQotCi0JcmV0dXJuICpyZWdpb24gPyAwIDogLTE7Ci19Ci0KLWludCBhZHNwX2lvbl9kb19jYWNoZV9vcChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCQkJdm9pZCAqYWRkciwgdm9pZCAqcGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAotCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgY21kKQotewotCXN0cnVjdCBhZHNwX2lvbl9yZWdpb24gICAqcmVnaW9uOwotCXZvaWQgKnZhZGRyID0gYWRkcjsKLQlpbnQgcmV0OwotCXJldCA9IGFkc3BfaW9uX2xvb2t1cF92YWRkcihtb2R1bGUsICZ2YWRkciwgbGVuLCAmcmVnaW9uKTsKLQlpZiAocmV0KSB7Ci0JCU1NX0VSUigibm90IHBhdGNoaW5nICVzIChwYWRkciAmIGt2YWRkciksIiBcCi0JCQkiIGxvb2t1cCAoJXAsICVsZCkgZmFpbGVkXG4iLAotCQkJbW9kdWxlLT5uYW1lLCB2YWRkciwgbGVuKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JaWYgKChyZWdpb24tPmlvbl9mbGFnID09IElPTl9GTEFHX0NBQ0hFRCkgJiYgcmVnaW9uLT5oYW5kbGUpIHsKLQkJbGVuID0gKCgoKGxlbikgKyAzMSkgJiAofjMxKSkgKyAzMik7Ci0JCXJldCA9IG1zbV9pb25fZG9fY2FjaGVfb3AocmVnaW9uLT5jbGllbnQsIHJlZ2lvbi0+aGFuZGxlLAotCQkJCSh2b2lkICopcGFkZHIsIGxlbiwgY21kKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLWludCBhZHNwX2lvbl9maXh1cF9rdmFkZHIoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLCB2b2lkICoqYWRkciwKLQkJCSAgIHVuc2lnbmVkIGxvbmcgKmt2YWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCi0JCQkgICBzdHJ1Y3QgZmlsZSAqKmZpbHAsIHVuc2lnbmVkIGxvbmcgKm9mZnNldCkKLXsKLQlzdHJ1Y3QgYWRzcF9pb25fcmVnaW9uICpyZWdpb247Ci0Jdm9pZCAqdmFkZHIgPSAqYWRkcjsKLQl1bnNpZ25lZCBsb25nICpwYWRkciA9ICh1bnNpZ25lZCBsb25nICopYWRkcjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYWRzcF9pb25fbG9va3VwX3ZhZGRyKG1vZHVsZSwgYWRkciwgbGVuLCAmcmVnaW9uKTsKLQlpZiAocmV0KSB7Ci0JCU1NX0VSUigibm90IHBhdGNoaW5nICVzIChwYWRkciAmIGt2YWRkciksIgotCQkJIiBsb29rdXAgKCVwLCAlbGQpIGZhaWxlZFxuIiwKLQkJCW1vZHVsZS0+bmFtZSwgdmFkZHIsIGxlbik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCSpwYWRkciA9IHJlZ2lvbi0+cGFkZHIgKyAodmFkZHIgLSByZWdpb24tPnZhZGRyKTsKLQkqa3ZhZGRyID0gcmVnaW9uLT5rdmFkZHIgKyAodmFkZHIgLSByZWdpb24tPnZhZGRyKTsKLQlpZiAoZmlscCkKLQkJKmZpbHAgPSByZWdpb24tPmZpbGU7Ci0JaWYgKG9mZnNldCkKLQkJKm9mZnNldCA9IHZhZGRyIC0gcmVnaW9uLT52YWRkcjsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGFkc3BfcG1lbV9maXh1cChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsIHZvaWQgKiphZGRyLAotCQkgICAgdW5zaWduZWQgbG9uZyBsZW4pCi17Ci0Jc3RydWN0IGFkc3BfaW9uX3JlZ2lvbiAqcmVnaW9uOwotCXZvaWQgKnZhZGRyID0gKmFkZHI7Ci0JdW5zaWduZWQgbG9uZyAqcGFkZHIgPSAodW5zaWduZWQgbG9uZyAqKWFkZHI7Ci0JaW50IHJldDsKLQotCXJldCA9IGFkc3BfaW9uX2xvb2t1cF92YWRkcihtb2R1bGUsIGFkZHIsIGxlbiwgJnJlZ2lvbik7Ci0JaWYgKHJldCkgewotCQlNTV9FUlIoIm5vdCBwYXRjaGluZyAlcywgbG9va3VwICglcCwgJWxkKSBmYWlsZWRcbiIsCi0JCQltb2R1bGUtPm5hbWUsIHZhZGRyLCBsZW4pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCSpwYWRkciA9IHJlZ2lvbi0+cGFkZHIgKyAodmFkZHIgLSByZWdpb24tPnZhZGRyKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZHNwX3ZlcmlmeV9jbWQoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotCQkJICAgdW5zaWduZWQgaW50IHF1ZXVlX2lkLCB2b2lkICpjbWRfZGF0YSwKLQkJCSAgIHNpemVfdCBjbWRfc2l6ZSkKLXsKLQkvKiBjYWxsIHRoZSBwZXIgbW9kdWxlIHZlcmlmaWVyICovCi0JaWYgKG1vZHVsZS0+dmVyaWZ5X2NtZCkKLQkJcmV0dXJuIG1vZHVsZS0+dmVyaWZ5X2NtZChtb2R1bGUsIHF1ZXVlX2lkLCBjbWRfZGF0YSwKLQkJCQkJICAgICBjbWRfc2l6ZSk7Ci0JZWxzZQotCQlNTV9JTkZPKCJubyBwYWNrZXQgdmVyaWZ5aW5nIGZ1bmN0aW9uICIKLQkJCQkgImZvciB0YXNrICVzXG4iLCBtb2R1bGUtPm5hbWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyBhZHNwX3dyaXRlX2NtZChzdHJ1Y3QgYWRzcF9kZXZpY2UgKmFkZXYsIHZvaWQgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IGFkc3BfY29tbWFuZF90IGNtZDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlsyNTZdOwotCXZvaWQgKmNtZF9kYXRhOwotCWxvbmcgcmM7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoY21kKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGNtZC5sZW4gPiAyNTYpIHsKLQkJY21kX2RhdGEgPSBrbWFsbG9jKGNtZC5sZW4sIEdGUF9VU0VSKTsKLQkJaWYgKCFjbWRfZGF0YSkKLQkJCXJldHVybiAtRU5PTUVNOwotCX0gZWxzZSB7Ci0JCWNtZF9kYXRhID0gYnVmOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcihjbWRfZGF0YSwgKHZvaWQgX191c2VyICopKGNtZC5kYXRhKSwgY21kLmxlbikpIHsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQltdXRleF9sb2NrKCZhZGV2LT5tb2R1bGUtPmlvbl9yZWdpb25zX2xvY2spOwotCWlmIChhZHNwX3ZlcmlmeV9jbWQoYWRldi0+bW9kdWxlLCBjbWQucXVldWUsIGNtZF9kYXRhLCBjbWQubGVuKSkgewotCQlNTV9FUlIoIm1vZHVsZSAlczogdmVyaWZ5IGZhaWxlZC5cbiIsIGFkZXYtPm1vZHVsZS0+bmFtZSk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCS8qIGNvbXBsZXRlIHRoZSB3cml0ZXMgdG8gdGhlIGJ1ZmZlciAqLwotCXdtYigpOwotCXJjID0gbXNtX2Fkc3Bfd3JpdGUoYWRldi0+bW9kdWxlLCBjbWQucXVldWUsIGNtZF9kYXRhLCBjbWQubGVuKTsKLWVuZDoKLQltdXRleF91bmxvY2soJmFkZXYtPm1vZHVsZS0+aW9uX3JlZ2lvbnNfbG9jayk7Ci0KLQlpZiAoY21kLmxlbiA+IDI1NikKLQkJa2ZyZWUoY21kX2RhdGEpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGFkc3BfZXZlbnRzX3BlbmRpbmcoc3RydWN0IGFkc3BfZGV2aWNlICphZGV2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHllczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRldi0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCXllcyA9ICFsaXN0X2VtcHR5KCZhZGV2LT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRldi0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCXJldHVybiB5ZXMgfHwgYWRldi0+YWJvcnQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWRzcF9pb25fbG9va3VwX3BhZGRyKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwgdm9pZCAqKmFkZHIsCi0JCSAgICAgc3RydWN0IGFkc3BfaW9uX3JlZ2lvbiAqKnJlZ2lvbikKLXsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKLQl1bnNpZ25lZCBsb25nIHBhZGRyID0gKHVuc2lnbmVkIGxvbmcpKCphZGRyKTsKLQlzdHJ1Y3QgYWRzcF9pb25fcmVnaW9uICpyZWdpb25fZWx0OwotCi0JaGxpc3RfZm9yX2VhY2hfZW50cnkocmVnaW9uX2VsdCwgbm9kZSwgJm1vZHVsZS0+aW9uX3JlZ2lvbnMsIGxpc3QpIHsKLQkJaWYgKHBhZGRyID49IHJlZ2lvbl9lbHQtPnBhZGRyICYmCi0JCSAgICBwYWRkciA8IHJlZ2lvbl9lbHQtPnBhZGRyICsgcmVnaW9uX2VsdC0+bGVuKSB7Ci0JCQkqcmVnaW9uID0gcmVnaW9uX2VsdDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCXJldHVybiAtMTsKLX0KLQotaW50IGFkc3BfcG1lbV9wYWRkcl9maXh1cChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsIHZvaWQgKiphZGRyKQotewotCXN0cnVjdCBhZHNwX2lvbl9yZWdpb24gKnJlZ2lvbjsKLQl1bnNpZ25lZCBsb25nIHBhZGRyID0gKHVuc2lnbmVkIGxvbmcpKCphZGRyKTsKLQl1bnNpZ25lZCBsb25nICp2YWRkciA9ICh1bnNpZ25lZCBsb25nICopYWRkcjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYWRzcF9pb25fbG9va3VwX3BhZGRyKG1vZHVsZSwgYWRkciwgJnJlZ2lvbik7Ci0JaWYgKHJldCkgewotCQlNTV9FUlIoIm5vdCBwYXRjaGluZyAlcywgcGFkZHIgJXAgbG9va3VwIGZhaWxlZFxuIiwKLQkJCW1vZHVsZS0+bmFtZSwgdmFkZHIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCSp2YWRkciA9ICh1bnNpZ25lZCBsb25nKXJlZ2lvbi0+dmFkZHIgKyAocGFkZHIgLSByZWdpb24tPnBhZGRyKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZHNwX3BhdGNoX2V2ZW50KHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwKLQkJCQlzdHJ1Y3QgYWRzcF9ldmVudCAqZXZlbnQpCi17Ci0JLyogY2FsbCB0aGUgcGVyLW1vZHVsZSBtc2cgdmVyaWZpZXIgKi8KLQlpZiAobW9kdWxlLT5wYXRjaF9ldmVudCkKLQkJcmV0dXJuIG1vZHVsZS0+cGF0Y2hfZXZlbnQobW9kdWxlLCBldmVudCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIGFkc3BfZ2V0X2V2ZW50KHN0cnVjdCBhZHNwX2RldmljZSAqYWRldiwgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBhZHNwX2V2ZW50ICpkYXRhID0gTlVMTDsKLQlzdHJ1Y3QgYWRzcF9ldmVudF90IGV2dDsKLQlpbnQgdGltZW91dDsKLQlsb25nIHJjID0gMDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmZXZ0LCBhcmcsIHNpemVvZihzdHJ1Y3QgYWRzcF9ldmVudF90KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JdGltZW91dCA9IChpbnQpZXZ0LnRpbWVvdXRfbXM7Ci0KLQlpZiAodGltZW91dCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCgKLQkJCWFkZXYtPmV2ZW50X3dhaXQsIGFkc3BfZXZlbnRzX3BlbmRpbmcoYWRldiksCi0JCQltc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9IGVsc2UgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCWFkZXYtPmV2ZW50X3dhaXQsIGFkc3BfZXZlbnRzX3BlbmRpbmcoYWRldikpOwotCX0KLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoYWRldi0+YWJvcnQpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkZXYtPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmFkZXYtPmV2ZW50X3F1ZXVlKSkgewotCQlkYXRhID0gbGlzdF9maXJzdF9lbnRyeSgmYWRldi0+ZXZlbnRfcXVldWUsCi0JCQkJCXN0cnVjdCBhZHNwX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRhdGEtPmxpc3QpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGV2LT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIWRhdGEpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JLyogRFNQIG1lc3NhZ2VzIGFyZSB0eXBlIDA7IHRoZXkgbWF5IGNvbnRhaW4gcGh5c2ljYWwgYWRkcmVzc2VzICovCi0JaWYgKGRhdGEtPnR5cGUgPT0gMCkKLQkJYWRzcF9wYXRjaF9ldmVudChhZGV2LT5tb2R1bGUsIGRhdGEpOwotCi0JLyogbWFwIGFkc3BfZXZlbnQgLS0+IGFkc3BfZXZlbnRfdCAqLwotCWlmIChldnQubGVuIDwgZGF0YS0+c2l6ZSkgewotCQlyYyA9IC1FVE9PU01BTEw7Ci0JCWdvdG8gZW5kOwotCX0KLQkvKiBvcmRlciB0aGUgcmVhZHMgdG8gdGhlIGJ1ZmZlciAqLwotCXJtYigpOwotCWlmIChkYXRhLT5tc2dfaWQgIT0gRVZFTlRfTVNHX0lEKSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikoZXZ0LmRhdGEpLCBkYXRhLT5kYXRhLm1zZzE2LAotCQkJCQlkYXRhLT5zaXplKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBlbmQ7Ci0JfQotCX0gZWxzZSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikoZXZ0LmRhdGEpLCBkYXRhLT5kYXRhLm1zZzMyLAotCQkJCQlkYXRhLT5zaXplKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBlbmQ7Ci0JCX0KLQl9Ci0KLQlldnQudHlwZSA9IGRhdGEtPnR5cGU7IC8qIDAgLS0+IGZyb20gYURTUCwgMSAtLT4gZnJvbSBBUk05ICovCi0JZXZ0Lm1zZ19pZCA9IGRhdGEtPm1zZ19pZDsKLQlldnQuZmxhZ3MgPSBkYXRhLT5pczE2OwotCWV2dC5sZW4gPSBkYXRhLT5zaXplOwotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZXZ0LCBzaXplb2YoZXZ0KSkpCi0JCXJjID0gLUVGQVVMVDsKLWVuZDoKLQlrZnJlZShkYXRhKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYWRzcF9pb25fZGVsKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSkKLXsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKnRtcDsKLQlzdHJ1Y3QgYWRzcF9pb25fcmVnaW9uICpyZWdpb247Ci0KLQltdXRleF9sb2NrKCZtb2R1bGUtPmlvbl9yZWdpb25zX2xvY2spOwotCWhsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgdG1wLCAmbW9kdWxlLT5pb25fcmVnaW9ucykgewotCQlyZWdpb24gPSBobGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYWRzcF9pb25fcmVnaW9uLCBsaXN0KTsKLQkJaGxpc3RfZGVsKG5vZGUpOwotCQlNTV9JTkZPKCJhZHNwX2lvbl9kZWw6IG1vZHVsZSAlczogZmQgJWQsIHZhZGRyIE94JXgsIGxlbiAlZFxuIiwKLQkJCW1vZHVsZS0+bmFtZSwgcmVnaW9uLT5mZCwgKHVuc2lnbmVkIGludClyZWdpb24tPnZhZGRyLAotCQkJKGludClyZWdpb24tPmxlbik7Ci0JCWZyZWVfaW9uX3JlZ2lvbihyZWdpb24tPmNsaWVudCwgcmVnaW9uLT5oYW5kbGUpOwotCQlrZnJlZShyZWdpb24pOwotCX0KLQltdXRleF91bmxvY2soJm1vZHVsZS0+aW9uX3JlZ2lvbnNfbG9jayk7Ci0JQlVHX09OKCFobGlzdF9lbXB0eSgmbW9kdWxlLT5pb25fcmVnaW9ucykpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIGFkc3BfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhZHNwX2RldmljZSAqYWRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBRFNQX0lPQ1RMX0VOQUJMRToKLQkJcmV0dXJuIG1zbV9hZHNwX2VuYWJsZShhZGV2LT5tb2R1bGUpOwotCi0JY2FzZSBBRFNQX0lPQ1RMX0RJU0FCTEU6Ci0JCXJldHVybiBtc21fYWRzcF9kaXNhYmxlKGFkZXYtPm1vZHVsZSk7Ci0KLQljYXNlIEFEU1BfSU9DVExfRElTQUJMRV9FVkVOVF9SU1A6Ci0JCXJldHVybiBtc21fYWRzcF9kaXNhYmxlX2V2ZW50X3JzcChhZGV2LT5tb2R1bGUpOwotCi0JY2FzZSBBRFNQX0lPQ1RMX0RJU0FCTEVfQUNLOgotCQlNTV9FUlIoIkFEU1BfSU9DVExfRElTQUJMRV9BQ0sgaXMgbm90IGltcGxlbWVudGVkXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFEU1BfSU9DVExfV1JJVEVfQ09NTUFORDoKLQkJcmV0dXJuIGFkc3Bfd3JpdGVfY21kKGFkZXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOwotCi0JY2FzZSBBRFNQX0lPQ1RMX0dFVF9FVkVOVDoKLQkJcmV0dXJuIGFkc3BfZ2V0X2V2ZW50KGFkZXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOwotCi0JY2FzZSBBRFNQX0lPQ1RMX1NFVF9DTEtSQVRFOiB7Ci0JCXVuc2lnbmVkIGxvbmcgY2xrX3JhdGU7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2xrX3JhdGUsICh2b2lkICopIGFyZywgc2l6ZW9mKGNsa19yYXRlKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIGFkc3Bfc2V0X2Nsa3JhdGUoYWRldi0+bW9kdWxlLCBjbGtfcmF0ZSk7Ci0JfQotCi0JY2FzZSBBRFNQX0lPQ1RMX1JFR0lTVEVSX1BNRU06IHsKLQkJc3RydWN0IGFkc3BfaW9uX2luZm8gaW5mbzsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCAodm9pZCAqKSBhcmcsIHNpemVvZihpbmZvKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIGFkc3BfaW9uX2FkZChhZGV2LT5tb2R1bGUsICZpbmZvKTsKLQl9Ci0KLQljYXNlIEFEU1BfSU9DVExfQUJPUlRfRVZFTlRfUkVBRDoKLQkJYWRldi0+YWJvcnQgPSAxOwotCQl3YWtlX3VwKCZhZGV2LT5ldmVudF93YWl0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFEU1BfSU9DVExfVU5SRUdJU1RFUl9QTUVNOgotCQlyZXR1cm4gYWRzcF9pb25fZGVsKGFkZXYtPm1vZHVsZSk7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgYWRzcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCBhZHNwX2RldmljZSAqYWRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUgPSBhZGV2LT5tb2R1bGU7Ci0JaW50IHJjID0gMDsKLQotCU1NX0lORk8oInJlbGVhc2UgJyVzJ1xuIiwgYWRldi0+bmFtZSk7Ci0KLQkvKiBjbGVhciBtb2R1bGUgYmVmb3JlIHB1dHRpbmcgaXQgdG8gYXZvaWQgcmFjZSB3aXRoIG9wZW4oKSAqLwotCWFkZXYtPm1vZHVsZSA9IE5VTEw7Ci0KLQlyYyA9IGFkc3BfaW9uX2RlbChtb2R1bGUpOwotCi0JbXNtX2Fkc3BfcHV0KG1vZHVsZSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBhZHNwX2V2ZW50KHZvaWQgKmRyaXZlcl9kYXRhLCB1bnNpZ25lZCBpZCwgc2l6ZV90IGxlbiwKLQkJICAgICAgIHZvaWQgKCpnZXRldmVudCkodm9pZCAqcHRyLCBzaXplX3QgbGVuKSkKLXsKLQlzdHJ1Y3QgYWRzcF9kZXZpY2UgKmFkZXYgPSBkcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgYWRzcF9ldmVudCAqZXZlbnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChsZW4gPiBBRFNQX0VWRU5UX01BWF9TSVpFKSB7Ci0JCU1NX0VSUigiZXZlbnQgdG9vIGxhcmdlICglZCBieXRlcylcbiIsIGxlbik7Ci0JCXJldHVybjsKLQl9Ci0KLQlldmVudCA9IGttYWxsb2Moc2l6ZW9mKCpldmVudCksIEdGUF9BVE9NSUMpOwotCWlmICghZXZlbnQpIHsKLQkJTU1fRVJSKCJjYW5ub3QgYWxsb2NhdGUgYnVmZmVyXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChpZCAhPSBFVkVOVF9NU0dfSUQpIHsKLQkJZXZlbnQtPnR5cGUgPSAwOwotCQlldmVudC0+aXMxNiA9IDA7Ci0JCWV2ZW50LT5tc2dfaWQgPSBpZDsKLQkJZXZlbnQtPnNpemUgPSBsZW47Ci0KLQkJZ2V0ZXZlbnQoZXZlbnQtPmRhdGEubXNnMTYsIGxlbik7Ci0JfSBlbHNlIHsKLQkJZXZlbnQtPnR5cGUgPSAxOwotCQlldmVudC0+aXMxNiA9IDE7Ci0JCWV2ZW50LT5tc2dfaWQgPSBpZDsKLQkJZXZlbnQtPnNpemUgPSBsZW47Ci0JCWdldGV2ZW50KGV2ZW50LT5kYXRhLm1zZzMyLCBsZW4pOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhZGV2LT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmZXZlbnQtPmxpc3QsICZhZGV2LT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRldi0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCXdha2VfdXAoJmFkZXYtPmV2ZW50X3dhaXQpOwotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9hZHNwX29wcyBhZHNwX29wcyA9IHsKLQkuZXZlbnQgPSBhZHNwX2V2ZW50LAotfTsKLQotc3RhdGljIGludCBhZHNwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCi17Ci0Jc3RydWN0IGFkc3BfZGV2aWNlICphZGV2OwotCWludCByYzsKLQotCXJjID0gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JYWRldiA9IGlub2RlX3RvX2RldmljZShpbm9kZSk7Ci0JaWYgKCFhZGV2KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCU1NX0lORk8oIm9wZW4gJyVzJ1xuIiwgYWRldi0+bmFtZSk7Ci0KLQlyYyA9IG1zbV9hZHNwX2dldChhZGV2LT5uYW1lLCAmYWRldi0+bW9kdWxlLCAmYWRzcF9vcHMsIGFkZXYpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JTU1fSU5GTygib3BlbmVkIG1vZHVsZSAnJXMnIGFkZXYgJXBcbiIsIGFkZXYtPm5hbWUsIGFkZXYpOwotCWZpbHAtPnByaXZhdGVfZGF0YSA9IGFkZXY7Ci0JYWRldi0+YWJvcnQgPSAwOwotCUlOSVRfSExJU1RfSEVBRCgmYWRldi0+bW9kdWxlLT5pb25fcmVnaW9ucyk7Ci0JbXV0ZXhfaW5pdCgmYWRldi0+bW9kdWxlLT5pb25fcmVnaW9uc19sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgYWRzcF9kZXZpY2VfY291bnQ7Ci1zdGF0aWMgc3RydWN0IGFkc3BfZGV2aWNlICphZHNwX2RldmljZXM7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRzcF9kZXZpY2UgKmlub2RlX3RvX2RldmljZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXVuc2lnbmVkIG4gPSBNSU5PUihpbm9kZS0+aV9yZGV2KTsKLQlpZiAobiA8IGFkc3BfZGV2aWNlX2NvdW50KSB7Ci0JCWlmIChhZHNwX2RldmljZXNbbl0uZGV2aWNlKQotCQkJcmV0dXJuIGFkc3BfZGV2aWNlcyArIG47Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgZGV2X3QgYWRzcF9kZXZubzsKLXN0YXRpYyBzdHJ1Y3QgY2xhc3MgKmFkc3BfY2xhc3M7Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFkc3BfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IGFkc3Bfb3BlbiwKLQkudW5sb2NrZWRfaW9jdGwgPSBhZHNwX2lvY3RsLAotCS5yZWxlYXNlID0gYWRzcF9yZWxlYXNlLAotfTsKLQotc3RhdGljIHZvaWQgYWRzcF9jcmVhdGUoc3RydWN0IGFkc3BfZGV2aWNlICphZGV2LCBjb25zdCBjaGFyICpuYW1lLAotCQkJc3RydWN0IGRldmljZSAqcGFyZW50LCBkZXZfdCBkZXZ0KQotewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlpbnQgcmM7Ci0KLQlkZXYgPSBkZXZpY2VfY3JlYXRlKGFkc3BfY2xhc3MsIHBhcmVudCwgZGV2dCwgIiVzIiwgbmFtZSk7Ci0JaWYgKElTX0VSUihkZXYpKQotCQlyZXR1cm47Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhZGV2LT5ldmVudF93YWl0KTsKLQlJTklUX0xJU1RfSEVBRCgmYWRldi0+ZXZlbnRfcXVldWUpOwotCXNwaW5fbG9ja19pbml0KCZhZGV2LT5ldmVudF9xdWV1ZV9sb2NrKTsKLQotCWNkZXZfaW5pdCgmYWRldi0+Y2RldiwgJmFkc3BfZm9wcyk7Ci0JYWRldi0+Y2Rldi5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JcmMgPSBjZGV2X2FkZCgmYWRldi0+Y2RldiwgZGV2dCwgMSk7Ci0JaWYgKHJjIDwgMCkgewotCQlkZXZpY2VfZGVzdHJveShhZHNwX2NsYXNzLCBkZXZ0KTsKLQl9IGVsc2UgewotCQlhZGV2LT5kZXZpY2UgPSBkZXY7Ci0JCWFkZXYtPm5hbWUgPSBuYW1lOwotCX0KLX0KLQotdm9pZCBtc21fYWRzcF9wdWJsaXNoX2NkZXZzKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZXMsIHVuc2lnbmVkIG4pCi17Ci0JaW50IHJjOwotCi0JYWRzcF9kZXZpY2VzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkc3BfZGV2aWNlKSAqIG4sIEdGUF9LRVJORUwpOwotCWlmICghYWRzcF9kZXZpY2VzKQotCQlyZXR1cm47Ci0KLQlhZHNwX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiYWRzcCIpOwotCWlmIChJU19FUlIoYWRzcF9jbGFzcykpCi0JCWdvdG8gZmFpbF9jcmVhdGVfY2xhc3M7Ci0KLQlyYyA9IGFsbG9jX2NocmRldl9yZWdpb24oJmFkc3BfZGV2bm8sIDAsIG4sICJhZHNwIik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBmYWlsX2FsbG9jX3JlZ2lvbjsKLQotCWFkc3BfZGV2aWNlX2NvdW50ID0gbjsKLQlmb3IgKG4gPSAwOyBuIDwgYWRzcF9kZXZpY2VfY291bnQ7IG4rKykgewotCQlhZHNwX2NyZWF0ZShhZHNwX2RldmljZXMgKyBuLAotCQkJICAgIG1vZHVsZXNbbl0ubmFtZSwgJm1vZHVsZXNbbl0ucGRldi5kZXYsCi0JCQkgICAgTUtERVYoTUFKT1IoYWRzcF9kZXZubyksIG4pKTsKLQl9Ci0KLQlyZXR1cm47Ci0KLWZhaWxfYWxsb2NfcmVnaW9uOgotCWNsYXNzX3VucmVnaXN0ZXIoYWRzcF9jbGFzcyk7Ci1mYWlsX2NyZWF0ZV9jbGFzczoKLQlrZnJlZShhZHNwX2RldmljZXMpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF9pbmZvLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwX2luZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlhMmQxOC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwX2luZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9hZHNwX2luZm8uYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5LCAyMDExLTIwMTIgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImFkc3AuaCIKLQotLyogRmlybXdhcmUgbW9kdWxlcyAqLwotI2RlZmluZSBRRFNQX01PRFVMRV9LRVJORUwgICAgICAgICAgICAgICAgICAweDAxMDZkZDRlCi0jZGVmaW5lIFFEU1BfTU9EVUxFX0FGRVRBU0sgICAgICAgICAgICAgICAgIDB4MDEwNmRkNmYKLSNkZWZpbmUgUURTUF9NT0RVTEVfQVVEUExBWTBUQVNLICAgICAgICAgICAgMHgwMTA2ZGQ3MAotI2RlZmluZSBRRFNQX01PRFVMRV9BVURQTEFZMVRBU0sgICAgICAgICAgICAweDAxMDZkZDcxCi0jZGVmaW5lIFFEU1BfTU9EVUxFX0FVRFBQVEFTSyAgICAgICAgICAgICAgIDB4MDEwNmRkNzIKLSNkZWZpbmUgUURTUF9NT0RVTEVfVklERU9UQVNLICAgICAgICAgICAgICAgMHgwMTA2ZGQ3MwotI2RlZmluZSBRRFNQX01PRFVMRV9WSURFT19BQUNfVk9DICAgICAgICAgICAweDAxMDZkZDc0Ci0jZGVmaW5lIFFEU1BfTU9EVUxFX1BDTV9ERUMgICAgICAgICAgICAgICAgIDB4MDEwNmRkNzUKLSNkZWZpbmUgUURTUF9NT0RVTEVfQVVESU9fREVDX01QMyAgICAgICAgICAgMHgwMTA2ZGQ3NgotI2RlZmluZSBRRFNQX01PRFVMRV9BVURJT19ERUNfQUFDICAgICAgICAgICAweDAxMDZkZDc3Ci0jZGVmaW5lIFFEU1BfTU9EVUxFX0FVRElPX0RFQ19XTUEgICAgICAgICAgIDB4MDEwNmRkNzgKLSNkZWZpbmUgUURTUF9NT0RVTEVfSE9TVFBDTSAgICAgICAgICAgICAgICAgMHgwMTA2ZGQ3OQotI2RlZmluZSBRRFNQX01PRFVMRV9EVE1GICAgICAgICAgICAgICAgICAgICAweDAxMDZkZDdhCi0jZGVmaW5lIFFEU1BfTU9EVUxFX0FVRFJFQ1RBU0sgICAgICAgICAgICAgIDB4MDEwNmRkN2IKLSNkZWZpbmUgUURTUF9NT0RVTEVfQVVEUFJFUFJPQ1RBU0sgICAgICAgICAgMHgwMTA2ZGQ3YwotI2RlZmluZSBRRFNQX01PRFVMRV9TQkNfRU5DICAgICAgICAgICAgICAgICAweDAxMDZkZDdkCi0jZGVmaW5lIFFEU1BfTU9EVUxFX1ZPQ19VTVRTICAgICAgICAgICAgICAgIDB4MDEwNmRkOWEKLSNkZWZpbmUgUURTUF9NT0RVTEVfVk9DX0NETUEgICAgICAgICAgICAgICAgMHgwMTA2ZGQ5OAotI2RlZmluZSBRRFNQX01PRFVMRV9WT0NfUENNICAgICAgICAgICAgICAgICAweDAxMDZkZDdmCi0jZGVmaW5lIFFEU1BfTU9EVUxFX1ZPQ0VOQ1RBU0sgICAgICAgICAgICAgIDB4MDEwNmRkODAKLSNkZWZpbmUgUURTUF9NT0RVTEVfVk9DREVDVEFTSyAgICAgICAgICAgICAgMHgwMTA2ZGQ4MQotI2RlZmluZSBRRFNQX01PRFVMRV9WT0lDRVBST0NUQVNLICAgICAgICAgICAweDAxMDZkZDgyCi0jZGVmaW5lIFFEU1BfTU9EVUxFX1ZJREVPRU5DVEFTSyAgICAgICAgICAgIDB4MDEwNmRkODMKLSNkZWZpbmUgUURTUF9NT0RVTEVfVkZFVEFTSyAgICAgICAgICAgICAgICAgMHgwMTA2ZGQ4NAotI2RlZmluZSBRRFNQX01PRFVMRV9XQVZfRU5DICAgICAgICAgICAgICAgICAweDAxMDZkZDg1Ci0jZGVmaW5lIFFEU1BfTU9EVUxFX0FBQ0xDX0VOQyAgICAgICAgICAgICAgIDB4MDEwNmRkODYKLSNkZWZpbmUgUURTUF9NT0RVTEVfVklERU9fQU1SICAgICAgICAgICAgICAgMHgwMTA2ZGQ4NwotI2RlZmluZSBRRFNQX01PRFVMRV9WT0NfQU1SICAgICAgICAgICAgICAgICAweDAxMDZkZDg4Ci0jZGVmaW5lIFFEU1BfTU9EVUxFX1ZPQ19FVlJDICAgICAgICAgICAgICAgIDB4MDEwNmRkODkKLSNkZWZpbmUgUURTUF9NT0RVTEVfVk9DXzEzSyAgICAgICAgICAgICAgICAgMHgwMTA2ZGQ4YQotI2RlZmluZSBRRFNQX01PRFVMRV9WT0NfRkdWICAgICAgICAgICAgICAgICAweDAxMDZkZDhiCi0jZGVmaW5lIFFEU1BfTU9EVUxFX0RJQUdUQVNLICAgICAgICAgICAgICAgIDB4MDEwNmRkOGMKLSNkZWZpbmUgUURTUF9NT0RVTEVfSlBFR1RBU0sgICAgICAgICAgICAgICAgMHgwMTA2ZGQ4ZAotI2RlZmluZSBRRFNQX01PRFVMRV9MUE1UQVNLICAgICAgICAgICAgICAgICAweDAxMDZkZDhlCi0jZGVmaW5lIFFEU1BfTU9EVUxFX1FDQU1UQVNLICAgICAgICAgICAgICAgIDB4MDEwNmRkOGYKLSNkZWZpbmUgUURTUF9NT0RVTEVfTU9ETUFUSFRBU0sgICAgICAgICAgICAgMHgwMTA2ZGQ5MAotI2RlZmluZSBRRFNQX01PRFVMRV9BVURQTEFZMlRBU0sgICAgICAgICAgICAweDAxMDZkZDkxCi0jZGVmaW5lIFFEU1BfTU9EVUxFX0FVRFBMQVkzVEFTSyAgICAgICAgICAgIDB4MDEwNmRkOTIKLSNkZWZpbmUgUURTUF9NT0RVTEVfQVVEUExBWTRUQVNLICAgICAgICAgICAgMHgwMTA2ZGQ5MwotI2RlZmluZSBRRFNQX01PRFVMRV9HUkFQSElDU1RBU0sgICAgICAgICAgICAweDAxMDZkZDk0Ci0jZGVmaW5lIFFEU1BfTU9EVUxFX01JREkgICAgICAgICAgICAgICAgICAgIDB4MDEwNmRkOTUKLSNkZWZpbmUgUURTUF9NT0RVTEVfR0FVRElPICAgICAgICAgICAgICAgICAgMHgwMTA2ZGQ5NgotI2RlZmluZSBRRFNQX01PRFVMRV9WREVDX0xQX01PREUgICAgICAgICAgICAweDAxMDZkZDk3Ci0jZGVmaW5lIFFEU1BfTU9EVUxFX1ZJREVPX0FBQ19WT0NfVFVSQk8gICAgIDB4MDEwODlmNzcKLSNkZWZpbmUgUURTUF9NT0RVTEVfVklERU9fQU1SX1RVUkJPICAgICAgICAgMHgwMTA4OWY3OAotI2RlZmluZSBRRFNQX01PRFVMRV9XTV9UVVJCT19NT0RFICAgICAgICAgICAweDAxMDg5Zjc5Ci0jZGVmaW5lIFFEU1BfTU9EVUxFX1ZERUNfTFBfTU9ERV9UVVJCTyAgICAgIDB4MDEwODlmN2EKLSNkZWZpbmUgUURTUF9NT0RVTEVfQVVEUkVDMFRBU0sgICAgICAgICAgICAgMHgwMTA5Njk2ZgotI2RlZmluZSBRRFNQX01PRFVMRV9BVURSRUMxVEFTSyAgICAgICAgICAgICAweDAxMDk2OTcwCi0jZGVmaW5lIFFEU1BfTU9EVUxFX1JNVEFTSyAgICAgICAgICAgICAgICAgIDB4MDEwOTBmOGUKLSNkZWZpbmUgUURTUF9NT0RVTEVfTUFYICAgICAgICAgICAgICAgICAgICAgMHg3ZmZmZmZmZgotCi0gICAvKiBETyBOT1QgVVNFOiBGb3JjZSB0aGlzIGVudW0gdG8gYmUgYSAzMmJpdCB0eXBlIHRvIGltcHJvdmUgc3BlZWQgKi8KLSNkZWZpbmUgUURTUF9NT0RVTEVfMzJCSVRfRFVNTVkgMHgxMDAwMAotCi1zdGF0aWMgdWludDMyX3QgKnFkc3BfdGFza190b19tb2R1bGVbSU1HX01BWF07Ci1zdGF0aWMgdWludDMyX3QJKnFkc3BfcXVldWVfb2Zmc2V0X3RhYmxlW0lNR19NQVhdOwotCi0jZGVmaW5lIFFEU1BfTU9EVUxFKG4sIGNsa25hbWUsIGNsa3JhdGUsIHZlcmlmeV9jbWRfZnVuYywgcGF0Y2hfZXZlbnRfZnVuYykgXAotCXsgLm5hbWUgPSAjbiwgLnBkZXZfbmFtZSA9ICJhZHNwXyIgI24sIC5pZCA9IFFEU1BfTU9EVUxFXyMjbiwgXAotCSAgLmNsa19uYW1lID0gY2xrbmFtZSwgLmNsa19yYXRlID0gY2xrcmF0ZSwgXAotCSAgLnZlcmlmeV9jbWQgPSB2ZXJpZnlfY21kX2Z1bmMsIC5wYXRjaF9ldmVudCA9IHBhdGNoX2V2ZW50X2Z1bmMgfQotCi1zdGF0aWMgc3RydWN0IGFkc3BfbW9kdWxlX2luZm8gbW9kdWxlX2luZm9bXSA9IHsKLQlRRFNQX01PRFVMRShBVURQTEFZMFRBU0ssIE5VTEwsIDAsIE5VTEwsIE5VTEwpLAotCVFEU1BfTU9EVUxFKEFVRFBMQVkxVEFTSywgTlVMTCwgMCwgTlVMTCwgTlVMTCksCi0JUURTUF9NT0RVTEUoQVVEUExBWTJUQVNLLCBOVUxMLCAwLCBOVUxMLCBOVUxMKSwKLQlRRFNQX01PRFVMRShBVURQTEFZM1RBU0ssIE5VTEwsIDAsIE5VTEwsIE5VTEwpLAotCVFEU1BfTU9EVUxFKEFVRFBQVEFTSywgTlVMTCwgMCwgTlVMTCwgTlVMTCksCi0JUURTUF9NT0RVTEUoQVVEUFJFUFJPQ1RBU0ssIE5VTEwsIDAsIE5VTEwsIE5VTEwpLAotCVFEU1BfTU9EVUxFKFJNVEFTSywgTlVMTCwgMCwgTlVMTCwgTlVMTCksCi0jaWYgIWRlZmluZWQoQ09ORklHX0FSQ0hfTVNNN1gzMCkKLQlRRFNQX01PRFVMRShBVURSRUNUQVNLLCBOVUxMLCAwLCBOVUxMLCBOVUxMKSwKLQlRRFNQX01PRFVMRShWRkVUQVNLLCBOVUxMLCAwLCBhZHNwX3ZmZV92ZXJpZnlfY21kLAotCQlhZHNwX3ZmZV9wYXRjaF9ldmVudCksCi0JUURTUF9NT0RVTEUoUUNBTVRBU0ssIE5VTEwsIDAsIE5VTEwsIE5VTEwpLAotCVFEU1BfTU9EVUxFKExQTVRBU0ssIE5VTEwsIDAsIGFkc3BfbHBtX3ZlcmlmeV9jbWQsIE5VTEwpLAotCVFEU1BfTU9EVUxFKEpQRUdUQVNLLCAidmRjX2NsayIsIDk2MDAwMDAwLCBhZHNwX2pwZWdfdmVyaWZ5X2NtZCwKLQkJYWRzcF9qcGVnX3BhdGNoX2V2ZW50KSwKLQlRRFNQX01PRFVMRShWSURFT1RBU0ssICJ2ZGNfY2xrIiwgOTYwMDAwMDAsCi0JCWFkc3BfdmlkZW9fdmVyaWZ5X2NtZCwgTlVMTCksCi0JUURTUF9NT0RVTEUoVkRFQ19MUF9NT0RFLCBOVUxMLCAwLCBOVUxMLCBOVUxMKSwKLQlRRFNQX01PRFVMRShWSURFT0VOQ1RBU0ssICJ2ZGNfY2xrIiwgOTYwMDAwMDAsCi0JCWFkc3BfdmlkZW9lbmNfdmVyaWZ5X2NtZCwgTlVMTCksCi0JUURTUF9NT0RVTEUoVklERU9fQUFDX1ZPQ19UVVJCTywgTlVMTCwgMCwgTlVMTCwgTlVMTCksCi0JUURTUF9NT0RVTEUoVklERU9fQU1SX1RVUkJPLCBOVUxMLCAwLCBOVUxMLCBOVUxMKSwKLQlRRFNQX01PRFVMRShXTV9UVVJCT19NT0RFLCBOVUxMLCAwLCBOVUxMLCBOVUxMKSwKLQlRRFNQX01PRFVMRShWREVDX0xQX01PREVfVFVSQk8sIE5VTEwsIDAsIE5VTEwsIE5VTEwpLAotI2lmIGRlZmluZWQoQ09ORklHX01TTTdYMjdBX0FVRElPKQotCVFEU1BfTU9EVUxFKEFVRFJFQzFUQVNLLCBOVUxMLCAwLCBOVUxMLCBOVUxMKSwKLSNlbmRpZgotI2Vsc2UKLQlRRFNQX01PRFVMRShBRkVUQVNLICwgTlVMTCwgMCwgTlVMTCwgTlVMTCksCi0JUURTUF9NT0RVTEUoQVVEUkVDMFRBU0ssIE5VTEwsIDAsIE5VTEwsIE5VTEwpLAotCVFEU1BfTU9EVUxFKEFVRFJFQzFUQVNLLCBOVUxMLCAwLCBOVUxMLCBOVUxMKSwKLSNlbmRpZgotfTsKLQotaW50IGFkc3BfaW5pdF9pbmZvKHN0cnVjdCBhZHNwX2luZm8gKmluZm8pCi17Ci0JdWludDMyX3QgaW1nX251bTsKLQotCWluZm8tPnNlbmRfaXJxID0gICAweDAwYzAwMjAwOwotCWluZm8tPnJlYWRfY3RybCA9ICAweDAwNDAwMDM4OwotCWluZm8tPndyaXRlX2N0cmwgPSAweDAwNDAwMDM0OwotCi0JaW5mby0+bWF4X21zZzE2X3NpemUgPSAxOTM7Ci0JaW5mby0+bWF4X21zZzMyX3NpemUgPSA4OwotCWZvciAoaW1nX251bSA9IDA7IGltZ19udW0gPCBJTUdfTUFYOyBpbWdfbnVtKyspCi0JCXFkc3BfcXVldWVfb2Zmc2V0X3RhYmxlW2ltZ19udW1dID0KLQkJJmluZm8tPmluaXRfaW5mb19wdHItPnF1ZXVlX29mZnNldHNbaW1nX251bV1bMF07Ci0KLQlmb3IgKGltZ19udW0gPSAwOyBpbWdfbnVtIDwgSU1HX01BWDsgaW1nX251bSsrKQotCQlxZHNwX3Rhc2tfdG9fbW9kdWxlW2ltZ19udW1dID0KLQkJJmluZm8tPmluaXRfaW5mb19wdHItPnRhc2tfdG9fbW9kdWxlX3RibFtpbWdfbnVtXVswXTsKLQlpbmZvLT5tYXhfdGFza19pZCA9IDMwOwotCWluZm8tPm1heF9tb2R1bGVfaWQgPSBRRFNQX01PRFVMRV9NQVggLSAxOwotCWluZm8tPm1heF9xdWV1ZV9pZCA9IFFEU1BfTUFYX05VTV9RVUVVRVM7Ci0JaW5mby0+bWF4X2ltYWdlX2lkID0gMjsKLQlpbmZvLT5xdWV1ZV9vZmZzZXQgPSBxZHNwX3F1ZXVlX29mZnNldF90YWJsZTsKLQlpbmZvLT50YXNrX3RvX21vZHVsZSA9IHFkc3BfdGFza190b19tb2R1bGU7Ci0KLQlpbmZvLT5tb2R1bGVfY291bnQgPSBBUlJBWV9TSVpFKG1vZHVsZV9pbmZvKTsKLQlpbmZvLT5tb2R1bGUgPSBtb2R1bGVfaW5mbzsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfanBlZ19wYXRjaF9ldmVudC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF9qcGVnX3BhdGNoX2V2ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OGFjMzEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF9qcGVnX3BhdGNoX2V2ZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwX2pwZWdfcGF0Y2hfZXZlbnQuYwotICoKLSAqIFZlcmlmaWNhdGlvbiBjb2RlIGZvciBhRFNQIEpQRUcgZXZlbnRzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWpwZWdtc2cuaD4KLSNpbmNsdWRlICJhZHNwLmgiCi0KLWludCBhZHNwX2pwZWdfcGF0Y2hfZXZlbnQoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotCQkJc3RydWN0IGFkc3BfZXZlbnQgKmV2ZW50KQotewotCWlmIChldmVudC0+bXNnX2lkID09IEpQRUdfTVNHX0VOQ19PUF9QUk9EVUNFRCkgewotCQlqcGVnX21zZ19lbmNfb3BfcHJvZHVjZWQgKm9wID0gKGpwZWdfbXNnX2VuY19vcF9wcm9kdWNlZCAqKWV2ZW50LT5kYXRhLm1zZzE2OwotCQlyZXR1cm4gYWRzcF9wbWVtX3BhZGRyX2ZpeHVwKG1vZHVsZSwgKHZvaWQgKiopJm9wLT5vcF9idWZfYWRkcik7Ci0JfQotCWlmIChldmVudC0+bXNnX2lkID09IEpQRUdfTVNHX0RFQ19PUF9QUk9EVUNFRCkgewotCQlqcGVnX21zZ19kZWNfb3BfcHJvZHVjZWQgKm9wID0gKGpwZWdfbXNnX2RlY19vcF9wcm9kdWNlZCAqKQotCQkJZXZlbnQtPmRhdGEubXNnMTY7Ci0JCXJldHVybiBhZHNwX3BtZW1fcGFkZHJfZml4dXAobW9kdWxlLAotCQkJCSh2b2lkICoqKSZvcC0+bHVtYV9vcF9idWZfYWRkcikgfHwKLQkJCWFkc3BfcG1lbV9wYWRkcl9maXh1cChtb2R1bGUsCi0JCQkJKHZvaWQgKiopJm9wLT5jaHJvbWFfb3BfYnVmX2FkZHIpOwotCX0KLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF9qcGVnX3ZlcmlmeV9jbWQuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfanBlZ192ZXJpZnlfY21kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZGQ0YWQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF9qcGVnX3ZlcmlmeV9jbWQuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwX2pwZWdfdmVyaWZ5X2NtZC5jCi0gKgotICogVmVyaWZpY2F0aW9uIGNvZGUgZm9yIGFEU1AgSlBFRyBwYWNrZXRzIGZyb20gdXNlcnNwYWNlLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWpwZWdjbWRpLmg+Ci0jaW5jbHVkZSAiYWRzcC5oIgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLQotc3RhdGljIHVpbnQzMl90IGRlY19mbXQ7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfc2l6ZXMoanBlZ19jbWRfZW5jX2NmZyAqY21kLCB1aW50MzJfdCAqbHVtYV9zaXplLAotCQkJICAgICB1aW50MzJfdCAqY2hyb21hX3NpemUpCi17Ci0JdWludDMyX3QgZm10LCBsdW1hX3dpZHRoLCBsdW1hX2hlaWdodDsKLQotCWZtdCA9IGNtZC0+cHJvY2Vzc19jZmcgJiBKUEVHX0NNRF9FTkNfUFJPQ0VTU19DRkdfSVBfREFUQV9GT1JNQVRfTTsKLQlsdW1hX3dpZHRoID0gKGNtZC0+aXBfc2l6ZV9jZmcgJiBKUEVHX0NNRF9JUF9TSVpFX0NGR19MVU1BX1dJRFRIX00pCi0JCSAgICAgID4+IDE2OwotCWx1bWFfaGVpZ2h0ID0gY21kLT5mcmFnX2NmZyAmIEpQRUdfQ01EX0ZSQUdfU0laRV9MVU1BX0hFSUdIVF9NOwotCSpsdW1hX3NpemUgPSBsdW1hX3dpZHRoICogbHVtYV9oZWlnaHQ7Ci0JaWYgKGZtdCA9PSBKUEVHX0NNRF9FTkNfUFJPQ0VTU19DRkdfSVBfREFUQV9GT1JNQVRfSDJWMikKLQkJKmNocm9tYV9zaXplID0gKmx1bWFfc2l6ZS8yOwotCWVsc2UKLQkJKmNocm9tYV9zaXplID0gKmx1bWFfc2l6ZTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgdmVyaWZ5X2pwZWdfY21kX2VuY19jZmcoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSAgdm9pZCAqY21kX2RhdGEsIHNpemVfdCBjbWRfc2l6ZSkKLXsKLQlqcGVnX2NtZF9lbmNfY2ZnICpjbWQgPSAoanBlZ19jbWRfZW5jX2NmZyAqKWNtZF9kYXRhOwotCXVpbnQzMl90IGx1bWFfc2l6ZSwgY2hyb21hX3NpemU7Ci0JaW50IGksIG51bV9mcmFnczsKLQotCWlmIChjbWRfc2l6ZSAhPSBzaXplb2YoanBlZ19jbWRfZW5jX2NmZykpIHsKLQkJTU1fRVJSKCJtb2R1bGUgJXM6IEpQRUcgRU5DIENGRyBpbnZhbGlkIFwKLQkJCWNtZF9zaXplICVkXG4iLCBtb2R1bGUtPm5hbWUsIGNtZF9zaXplKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWdldF9zaXplcyhjbWQsICZsdW1hX3NpemUsICZjaHJvbWFfc2l6ZSk7Ci0JbnVtX2ZyYWdzID0gKGNtZC0+cHJvY2Vzc19jZmcgPj4gMTApICYgMHhmOwotCW51bV9mcmFncyA9ICgobnVtX2ZyYWdzID09IDEpID8gbnVtX2ZyYWdzIDogbnVtX2ZyYWdzICogMik7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9mcmFnczsgaSArPSAyKSB7Ci0JCWlmIChhZHNwX3BtZW1fZml4dXAobW9kdWxlLCAodm9pZCAqKikoJmNtZC0+ZnJhZ19jZmdfcGFydFtpXSksIGx1bWFfc2l6ZSkgfHwKLQkJICAgIGFkc3BfcG1lbV9maXh1cChtb2R1bGUsICh2b2lkICoqKSgmY21kLT5mcmFnX2NmZ19wYXJ0W2krMV0pLCBjaHJvbWFfc2l6ZSkpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKGFkc3BfcG1lbV9maXh1cChtb2R1bGUsICh2b2lkICoqKSZjbWQtPm9wX2J1Zl8wX2NmZ19wYXJ0MSwKLQkJCSAgICBjbWQtPm9wX2J1Zl8wX2NmZ19wYXJ0MikgfHwKLQkgICAgYWRzcF9wbWVtX2ZpeHVwKG1vZHVsZSwgKHZvaWQgKiopJmNtZC0+b3BfYnVmXzFfY2ZnX3BhcnQxLAotCQkJICAgIGNtZC0+b3BfYnVmXzFfY2ZnX3BhcnQyKSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB2ZXJpZnlfanBlZ19jbWRfZGVjX2NmZyhzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCQkJCSAgdm9pZCAqY21kX2RhdGEsIHNpemVfdCBjbWRfc2l6ZSkKLXsKLQlqcGVnX2NtZF9kZWNfY2ZnICpjbWQgPSAoanBlZ19jbWRfZGVjX2NmZyAqKWNtZF9kYXRhOwotCXVpbnQzMl90IGRpdjsKLQotCWlmIChjbWRfc2l6ZSAhPSBzaXplb2YoanBlZ19jbWRfZGVjX2NmZykpIHsKLQkJTU1fRVJSKCJtb2R1bGUgJXM6IEpQRUcgREVDIENGRyBpbnZhbGlkIFwKLQkJCWNtZF9zaXplICVkXG4iLCBtb2R1bGUtPm5hbWUsIGNtZF9zaXplKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChhZHNwX3BtZW1fZml4dXAobW9kdWxlLCAodm9pZCAqKikmY21kLT5pcF9zdHJlYW1fYnVmX2NmZ19wYXJ0MSwKLQkJCSAgICBjbWQtPmlwX3N0cmVhbV9idWZfY2ZnX3BhcnQyKSB8fAotCSAgICBhZHNwX3BtZW1fZml4dXAobW9kdWxlLCAodm9pZCAqKikmY21kLT5vcF9zdHJlYW1fYnVmXzBfY2ZnX3BhcnQxLAotCQkJICAgIGNtZC0+b3Bfc3RyZWFtX2J1Zl8wX2NmZ19wYXJ0MikgfHwKLQkgICAgYWRzcF9wbWVtX2ZpeHVwKG1vZHVsZSwgKHZvaWQgKiopJmNtZC0+b3Bfc3RyZWFtX2J1Zl8xX2NmZ19wYXJ0MSwKLQkJCSAgICBjbWQtPm9wX3N0cmVhbV9idWZfMV9jZmdfcGFydDIpKQotCQlyZXR1cm4gLTE7Ci0JZGVjX2ZtdCA9IGNtZC0+b3BfZGF0YV9mb3JtYXQgJgotCQlKUEVHX0NNRF9ERUNfT1BfREFUQV9GT1JNQVRfTTsKLQlkaXYgPSAoZGVjX2ZtdCA9PSBKUEVHX0NNRF9ERUNfT1BfREFUQV9GT1JNQVRfSDJWMikgPyAyIDogMTsKLQlpZiAoYWRzcF9wbWVtX2ZpeHVwKG1vZHVsZSwgKHZvaWQgKiopJmNtZC0+b3Bfc3RyZWFtX2J1Zl8wX2NmZ19wYXJ0MywKLQkJCSAgICBjbWQtPm9wX3N0cmVhbV9idWZfMF9jZmdfcGFydDIgLyBkaXYpIHx8Ci0JICAgIGFkc3BfcG1lbV9maXh1cChtb2R1bGUsICh2b2lkICoqKSZjbWQtPm9wX3N0cmVhbV9idWZfMV9jZmdfcGFydDMsCi0JCQkgICAgY21kLT5vcF9zdHJlYW1fYnVmXzFfY2ZnX3BhcnQyIC8gZGl2KSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZlcmlmeV9qcGVnX2NmZ19jbWQoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotCQkJICAgICAgIHZvaWQgKmNtZF9kYXRhLCBzaXplX3QgY21kX3NpemUpCi17Ci0JdWludDMyX3QgY21kX2lkID0gKCh1aW50MzJfdCAqKWNtZF9kYXRhKVswXTsKLQlzd2l0Y2goY21kX2lkKSB7Ci0JY2FzZSBKUEVHX0NNRF9FTkNfQ0ZHOgotCQlyZXR1cm4gdmVyaWZ5X2pwZWdfY21kX2VuY19jZmcobW9kdWxlLCBjbWRfZGF0YSwgY21kX3NpemUpOwotCWNhc2UgSlBFR19DTURfREVDX0NGRzoKLQkJcmV0dXJuIHZlcmlmeV9qcGVnX2NtZF9kZWNfY2ZnKG1vZHVsZSwgY21kX2RhdGEsIGNtZF9zaXplKTsKLQlkZWZhdWx0OgotCQlpZiAoY21kX2lkID4gMSkgewotCQkJTU1fRVJSKCJtb2R1bGUgJXM6IGludmFsaWQgSlBFRyBDRkcgY21kX2lkICVkXG4iLAotCQkJCQltb2R1bGUtPm5hbWUsIGNtZF9pZCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmVyaWZ5X2pwZWdfYWN0aW9uX2NtZChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCQkJICB2b2lkICpjbWRfZGF0YSwgc2l6ZV90IGNtZF9zaXplKQotewotCXVpbnQzMl90IGNtZF9pZCA9ICgodWludDMyX3QgKiljbWRfZGF0YSlbMF07Ci0Jc3dpdGNoIChjbWRfaWQpIHsKLQljYXNlIEpQRUdfQ01EX0VOQ19PUF9DT05TVU1FRDoKLQl7Ci0JCWpwZWdfY21kX2VuY19vcF9jb25zdW1lZCAqY21kID0KLQkJCShqcGVnX2NtZF9lbmNfb3BfY29uc3VtZWQgKiljbWRfZGF0YTsKLQotCQlpZiAoY21kX3NpemUgIT0gc2l6ZW9mKGpwZWdfY21kX2VuY19vcF9jb25zdW1lZCkpIHsKLQkJCU1NX0VSUigibW9kdWxlICVzOiBKUEVHX0NNRF9FTkNfT1BfQ09OU1VNRUQgXAotCQkJCWludmFsaWQgc2l6ZSAlZFxuIiwgbW9kdWxlLT5uYW1lLCBjbWRfc2l6ZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlpZiAoYWRzcF9wbWVtX2ZpeHVwKG1vZHVsZSwgKHZvaWQgKiopJmNtZC0+b3BfYnVmX2FkZHIsCi0JCQkJICAgIGNtZC0+b3BfYnVmX3NpemUpKQotCQkJcmV0dXJuIC0xOwotCX0KLQlicmVhazsKLQljYXNlIEpQRUdfQ01EX0RFQ19PUF9DT05TVU1FRDoKLQl7Ci0JCXVpbnQzMl90IGRpdjsKLQkJanBlZ19jbWRfZGVjX29wX2NvbnN1bWVkICpjbWQgPQotCQkJKGpwZWdfY21kX2RlY19vcF9jb25zdW1lZCAqKWNtZF9kYXRhOwotCi0JCWlmIChjbWRfc2l6ZSAhPSBzaXplb2YoanBlZ19jbWRfZGVjX29wX2NvbnN1bWVkKSkgewotCQkJTU1fRVJSKCJtb2R1bGUgJXM6IEpQRUdfQ01EX0RFQ19PUF9DT05TVU1FRCBcCi0JCQkJaW52YWxpZCBzaXplICVkXG4iLCBtb2R1bGUtPm5hbWUsIGNtZF9zaXplKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWRpdiA9IChkZWNfZm10ID09IEpQRUdfQ01EX0RFQ19PUF9EQVRBX0ZPUk1BVF9IMlYyKSA/ICAyIDogMTsKLQkJaWYgKGFkc3BfcG1lbV9maXh1cChtb2R1bGUsICh2b2lkICoqKSZjbWQtPmx1bWFfb3BfYnVmX2FkZHIsCi0JCQkJICAgIGNtZC0+bHVtYV9vcF9idWZfc2l6ZSkgfHwKLQkJICAgIGFkc3BfcG1lbV9maXh1cChtb2R1bGUsICh2b2lkICoqKSZjbWQtPmNocm9tYV9vcF9idWZfYWRkciwKLQkJCQkgICAgY21kLT5sdW1hX29wX2J1Zl9zaXplIC8gZGl2KSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIEpQRUdfQ01EX0RFQ19JUDoKLQl7Ci0JCWpwZWdfY21kX2RlY19pcCAqY21kID0KLQkJCShqcGVnX2NtZF9kZWNfaXAgKiljbWRfZGF0YTsKLQotCQlpZiAoY21kX3NpemUgIT0gc2l6ZW9mKGpwZWdfY21kX2RlY19pcCkpIHsKLQkJCU1NX0VSUigibW9kdWxlICVzOiBKUEVHX0NNRF9ERUNfSVAgaW52YWxpZCBcCi0JCQkJc2l6ZSAlZFxuIiwgbW9kdWxlLT5uYW1lLCBjbWRfc2l6ZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKGFkc3BfcG1lbV9maXh1cChtb2R1bGUsICh2b2lkICoqKSZjbWQtPmlwX2J1Zl9hZGRyLAotCQkJY21kLT5pcF9idWZfc2l6ZSkpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJaWYgKGNtZF9pZCA+IDcpIHsKLQkJCU1NX0VSUigibW9kdWxlICVzOiBpbnZhbGlkIGNtZF9pZCAlZFxuIiwKLQkJCQltb2R1bGUtPm5hbWUsIGNtZF9pZCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBhZHNwX2pwZWdfdmVyaWZ5X2NtZChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCQkgdW5zaWduZWQgaW50IHF1ZXVlX2lkLCB2b2lkICpjbWRfZGF0YSwKLQkJCSBzaXplX3QgY21kX3NpemUpCi17Ci0Jc3dpdGNoKHF1ZXVlX2lkKSB7Ci0JY2FzZSBRRFNQX3VQSnBlZ0NmZ0NtZFF1ZXVlOgotCQlyZXR1cm4gdmVyaWZ5X2pwZWdfY2ZnX2NtZChtb2R1bGUsIGNtZF9kYXRhLCBjbWRfc2l6ZSk7Ci0JY2FzZSBRRFNQX3VQSnBlZ0FjdGlvbkNtZFF1ZXVlOgotCQlyZXR1cm4gdmVyaWZ5X2pwZWdfYWN0aW9uX2NtZChtb2R1bGUsIGNtZF9kYXRhLCBjbWRfc2l6ZSk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC0xOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF9scG1fdmVyaWZ5X2NtZC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF9scG1fdmVyaWZ5X2NtZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDI0OTc1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfbHBtX3ZlcmlmeV9jbWQuYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfbHBtX3ZlcmlmeV9jbWQuYwotICoKLSAqIFZlcmlmaWNpb24gY29kZSBmb3IgYURTUCBMUE0gcGFja2V0cyBmcm9tIHVzZXJzcGFjZS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVscG1jbWRpLmg+Ci0jaW5jbHVkZSAiYWRzcC5oIgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLQotaW50IGFkc3BfbHBtX3ZlcmlmeV9jbWQoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotCQkJIHVuc2lnbmVkIGludCBxdWV1ZV9pZCwgdm9pZCAqY21kX2RhdGEsCi0JCQkgc2l6ZV90IGNtZF9zaXplKQotewotCXVpbnQzMl90IGNtZF9pZCwgY29sX2hlaWdodCwgaW5wdXRfcm93X2luY3IsIG91dHB1dF9yb3dfaW5jciwKLQkJaW5wdXRfc2l6ZSwgb3V0cHV0X3NpemU7Ci0JdWludDMyX3Qgc2l6ZV9tYXNrID0gMHgwZmZmOwotCWxwbV9jbWRfc3RhcnQgKmNtZDsKLQotCWlmIChxdWV1ZV9pZCAhPSBRRFNQX2xwbUNvbW1hbmRRdWV1ZSkgewotCQlNTV9FUlIoIm1vZHVsZSAlczogd3JvbmcgcXVldWUgaWQgJWRcbiIsCi0JCQkJbW9kdWxlLT5uYW1lLCBxdWV1ZV9pZCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQljbWQgPSAobHBtX2NtZF9zdGFydCAqKWNtZF9kYXRhOwotCWNtZF9pZCA9IGNtZC0+Y21kX2lkOwotCi0JaWYgKGNtZF9pZCA9PSBMUE1fQ01EX1NUQVJUKSB7Ci0JCWlmIChjbWRfc2l6ZSAhPSBzaXplb2YobHBtX2NtZF9zdGFydCkpIHsKLQkJCU1NX0VSUigibW9kdWxlICVzOiB3cm9uZyBzaXplICVkLCBcCi0JCQkJZXhwZWN0ICVkXG4iLCBtb2R1bGUtPm5hbWUsCi0JCQkJY21kX3NpemUsIHNpemVvZihscG1fY21kX3N0YXJ0KSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJY29sX2hlaWdodCA9IGNtZC0+aXBfZGF0YV9jZmdfcGFydDEgJiBzaXplX21hc2s7Ci0JCWlucHV0X3Jvd19pbmNyID0gY21kLT5pcF9kYXRhX2NmZ19wYXJ0MiAmIHNpemVfbWFzazsKLQkJb3V0cHV0X3Jvd19pbmNyID0gY21kLT5vcF9kYXRhX2NmZ19wYXJ0MSAmIHNpemVfbWFzazsKLQkJaW5wdXRfc2l6ZSA9IGNvbF9oZWlnaHQgKiBpbnB1dF9yb3dfaW5jcjsKLQkJb3V0cHV0X3NpemUgPSBjb2xfaGVpZ2h0ICogb3V0cHV0X3Jvd19pbmNyOwotCQlpZiAoKGNtZC0+aXBfZGF0YV9jZmdfcGFydDQgJiYgYWRzcF9wbWVtX2ZpeHVwKG1vZHVsZSwKLQkJCQkgICAgKHZvaWQgKiopKCZjbWQtPmlwX2RhdGFfY2ZnX3BhcnQ0KSwKLQkJCQkgICAgaW5wdXRfc2l6ZSkpIHx8Ci0JCSAgIChjbWQtPm9wX2RhdGFfY2ZnX3BhcnQzICYmIGFkc3BfcG1lbV9maXh1cChtb2R1bGUsCi0JCQkJICAgICh2b2lkICoqKSgmY21kLT5vcF9kYXRhX2NmZ19wYXJ0MyksCi0JCQkJICAgIG91dHB1dF9zaXplKSkpCi0JCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIGlmIChjbWRfaWQgPiAxKSB7Ci0JCU1NX0VSUigibW9kdWxlICVzOiBpbnZhbGlkIGNtZF9pZCAlZFxuIiwgbW9kdWxlLT5uYW1lLCBjbWRfaWQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwX3JtLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwX3JtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NDg5ZjguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF9ybS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1cm10Y21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVybXRtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSAiYWRzcC5oIgotCi0jZGVmaW5lIE1BWF9DTElFTlRTCQk1Ci0jZGVmaW5lIE1BWF9BVURJT19DTElFTlRTCTUKLSNkZWZpbmUgTUFYX1JNX0NMSUVOVFMJCU1BWF9BVURJT19DTElFTlRTCi0KLXN0YXRpYyBjaGFyICpybV9lcnJzW10gPSB7Ci0JCQkiIiwKLQkJCSJQQ00gQmxvY2tzIG5vdCBTdWZmaWNpZW50IiwKLQkJCSJUQVNLIGlzIGFscmVhZHkgb2NjdXBpZWQiLAotCQkJIkNvbmN1cnJlbmN5IG5vdCBzdXBwb3J0ZWQiLAotCQkJIk1JUFMgbm90IHN1ZmZpY2llbnQiLAotCQkJIkREUCBpbnZhbGlkL25vIGxpY2VuY2UiCi0JCQl9Owotc3RhdGljIHN0cnVjdCBjbGllbnQgewotCXdhaXRfcXVldWVfaGVhZF90CQl3YWl0OwotCXVuc2lnbmVkIGludAkJCXdhaXRfc3RhdGU7Ci0Jc3RydWN0IGF1ZF9jb2RlY19jb25maWdfYWNrCWNmZ19tc2c7Ci19IHJtY2xpZW50W01BWF9STV9DTElFTlRTXTsKLQotc3RhdGljIHN0cnVjdCBybSB7Ci0Jc3RydWN0IG1zbV9hZHNwX21vZHVsZQkJKm1vZDsKLQlpbnQJCQkJY250OwotCWludAkJCQlzdGF0ZTsKLQotCXN0cnVjdCBhdWRfY29kZWNfY29uZmlnX2FjawljZmdfbXNnOwotCXN0cnVjdCBtdXRleAkJCWxvY2s7Ci19IHJtdGFzazsKLQotc3RhdGljIHZvaWQgcm1fZHNwX2V2ZW50KHZvaWQgKmRhdGEsIHVuc2lnbmVkIGlkLCBzaXplX3QgbGVuLAotCQkJdm9pZCAoKmdldGV2ZW50KSAodm9pZCAqcHRyLCBzaXplX3QgbGVuKSk7Ci1zdGF0aWMgc3RydWN0IG1zbV9hZHNwX29wcyBybV9vcHMgPSB7Ci0JLmV2ZW50ID0gcm1fZHNwX2V2ZW50LAotfTsKLQotaW50MzJfdCBnZXRfYWRzcF9yZXNvdXJjZSh1bnNpZ25lZCBzaG9ydCBjbGllbnRfaWQsCi0JCQkJdm9pZCAqY21kX2J1Ziwgc2l6ZV90IGNtZF9zaXplKQotewotCWludCByYyA9IDA7Ci0JaW50IGNsaWVudF9pZHg7Ci0KLQljbGllbnRfaWR4ID0gKChjbGllbnRfaWQgPj4gOCkgKiBNQVhfQ0xJRU5UUykgKyAoY2xpZW50X2lkICYgMHhGRik7Ci0JaWYgKGNsaWVudF9pZHggPj0gTUFYX1JNX0NMSUVOVFMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmcm10YXNrLmxvY2spOwotCWlmIChybXRhc2suc3RhdGUgIT0gQURTUF9TVEFURV9FTkFCTEVEKSB7Ci0JCXJjID0gbXNtX2Fkc3BfZ2V0KCJSTVRBU0siLCAmcm10YXNrLm1vZCwgJnJtX29wcywgTlVMTCk7Ci0JCWlmIChyYykgewotCQkJTU1fRVJSKCJGYWlsZWQgdG8gZ2V0IG1vZHVsZSBSTVRBU0tcbiIpOwotCQkJbXV0ZXhfdW5sb2NrKCZybXRhc2subG9jayk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQkJcmMgPSBtc21fYWRzcF9lbmFibGUocm10YXNrLm1vZCk7Ci0JCWlmIChyYykgewotCQkJTU1fRVJSKCJSTVRBU0sgZW5hYmxlIEZhaWxlZFxuIik7Ci0JCQltc21fYWRzcF9wdXQocm10YXNrLm1vZCk7Ci0JCQltdXRleF91bmxvY2soJnJtdGFzay5sb2NrKTsKLQkJCXJldHVybiByYzsKLQkJfQotCQlybXRhc2suc3RhdGUgPSBBRFNQX1NUQVRFX0VOQUJMRUQ7Ci0JfQotCXJtY2xpZW50W2NsaWVudF9pZHhdLndhaXRfc3RhdGUgPSAtMTsKLQltdXRleF91bmxvY2soJnJtdGFzay5sb2NrKTsKLQltc21fYWRzcF93cml0ZShybXRhc2subW9kLCBRRFNQX2FwdVJtdFF1ZXVlLCBjbWRfYnVmLCBjbWRfc2l6ZSk7Ci0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChybWNsaWVudFtjbGllbnRfaWR4XS53YWl0LAotCQkJcm1jbGllbnRbY2xpZW50X2lkeF0ud2FpdF9zdGF0ZSAhPSAtMSwgNSAqIEhaKTsKLQltdXRleF9sb2NrKCZybXRhc2subG9jayk7Ci0JaWYgKHVubGlrZWx5KHJjIDwgMCkpIHsKLQkJaWYgKHJjID09IC1FUkVTVEFSVFNZUykKLQkJCU1NX0VSUigid2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlICIKLQkJCQkJInJldHVybmVkIC1FUkVTVEFSVFNZU1xuIik7Ci0JCWVsc2UKLQkJCU1NX0VSUigid2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlICIKLQkJCQkJInJldHVybmVkIGVycm9yXG4iKTsKLQkJaWYgKCFybXRhc2suY250KQotCQkJZ290byBkaXNhYmxlX3JtOwotCQlnb3RvIHVubG9jazsKLQl9IGVsc2UgaWYgKHJjID09IDApIHsKLQkJTU1fRVJSKCJSTVRBU0sgTXNnIG5vdCByZWNlaXZlZFxuIik7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJaWYgKCFybXRhc2suY250KQotCQkJZ290byBkaXNhYmxlX3JtOwotCQlnb3RvIHVubG9jazsKLQl9Ci0JaWYgKCEocm1jbGllbnRbY2xpZW50X2lkeF0uY2ZnX21zZy5lbmFibGUpKSB7Ci0JCU1NX0VSUigiUmVhc29uIGZvciBmYWlsdXJlOiAlc1xuIiwKLQkJCXJtX2VycnNbcm1jbGllbnRbY2xpZW50X2lkeF0uY2ZnX21zZy5yZWFzb25dKTsKLQkJcmMgPSAtRUJVU1k7Ci0JCWlmICghcm10YXNrLmNudCkKLQkJCWdvdG8gZGlzYWJsZV9ybTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCXJtdGFzay5jbnQrKzsKLQltdXRleF91bmxvY2soJnJtdGFzay5sb2NrKTsKLQlyZXR1cm4gMDsKLQotZGlzYWJsZV9ybToKLQltc21fYWRzcF9kaXNhYmxlKHJtdGFzay5tb2QpOwotCW1zbV9hZHNwX3B1dChybXRhc2subW9kKTsKLQlybXRhc2suc3RhdGUgPSBBRFNQX1NUQVRFX0RJU0FCTEVEOwotdW5sb2NrOgotCW11dGV4X3VubG9jaygmcm10YXNrLmxvY2spOwotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0woZ2V0X2Fkc3BfcmVzb3VyY2UpOwotCi1pbnQzMl90IHB1dF9hZHNwX3Jlc291cmNlKHVuc2lnbmVkIHNob3J0IGNsaWVudF9pZCwgdm9pZCAqY21kX2J1ZiwKLQkJCQkJCQlzaXplX3QgY21kX3NpemUpCi17Ci0JbXV0ZXhfbG9jaygmcm10YXNrLmxvY2spOwotCWlmIChybXRhc2suc3RhdGUgIT0gQURTUF9TVEFURV9FTkFCTEVEKSB7Ci0JCW11dGV4X3VubG9jaygmcm10YXNrLmxvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltc21fYWRzcF93cml0ZShybXRhc2subW9kLCBRRFNQX2FwdVJtdFF1ZXVlLCBjbWRfYnVmLCBjbWRfc2l6ZSk7Ci0Jcm10YXNrLmNudC0tOwotCWlmICghcm10YXNrLmNudCkgewotCQltc21fYWRzcF9kaXNhYmxlKHJtdGFzay5tb2QpOwotCQltc21fYWRzcF9wdXQocm10YXNrLm1vZCk7Ci0JCXJtdGFzay5zdGF0ZSA9IEFEU1BfU1RBVEVfRElTQUJMRUQ7Ci0JfQotCW11dGV4X3VubG9jaygmcm10YXNrLmxvY2spOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChwdXRfYWRzcF9yZXNvdXJjZSk7Ci0KLXN0YXRpYyB2b2lkIHJtX2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgc2l6ZV90IGxlbiwKLQkJCQl2b2lkICgqZ2V0ZXZlbnQpICh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXVuc2lnbmVkIHNob3J0IGNsaWVudF9pZDsKLQlpbnQgY2xpZW50X2lkeDsKLQotCU1NX0RCRygiTXNnIElEID0gJWRcbiIsIGlkKTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIFJNVF9DT0RFQ19DT05GSUdfQUNLOiB7Ci0JCWdldGV2ZW50KCZybXRhc2suY2ZnX21zZywgc2l6ZW9mKHJtdGFzay5jZmdfbXNnKSk7Ci0JCWNsaWVudF9pZCA9ICgocm10YXNrLmNmZ19tc2cuY2xpZW50X2lkIDw8IDgpIHwKLQkJCQkJCXJtdGFzay5jZmdfbXNnLnRhc2tfaWQpOwotCQljbGllbnRfaWR4ID0gKChjbGllbnRfaWQgPj4gOCkgKiBNQVhfQ0xJRU5UUykgKwotCQkJCQkJKGNsaWVudF9pZCAmIDB4RkYpOwotCQltZW1jcHkoJnJtY2xpZW50W2NsaWVudF9pZHhdLmNmZ19tc2csICZybXRhc2suY2ZnX21zZywKLQkJCQkJCQlzaXplb2Yocm10YXNrLmNmZ19tc2cpKTsKLQkJcm1jbGllbnRbY2xpZW50X2lkeF0ud2FpdF9zdGF0ZSA9IDE7Ci0JCXdha2VfdXAoJnJtY2xpZW50W2NsaWVudF9pZHhdLndhaXQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBSTVRfRFNQX09VVF9PRl9NSVBTOiB7Ci0JCXN0cnVjdCBybXRfZHNwX291dF9vZl9taXBzIG1zZzsKLQkJZ2V0ZXZlbnQoJm1zZywgc2l6ZW9mKG1zZykpOwotCQlNTV9FUlIoIlJNVF9EU1BfT1VUX09GX01JUFM6IE5vdCBlbm91Z2ggcmVzb3JjZXMgaW4gQURTUCBcCi0JCQkJdG8gaGFuZGxlIGFsbCBzZXNzaW9ucyA6JWh4XG4iLCBtc2cuZGVjX2luZm8pOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJTU1fREJHKCJVbmtub3duIE1zZyBJZFxuIik7Ci0JCWJyZWFrOwotCX0KLX0KLQotdm9pZCBybXRhc2tfaW5pdCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9STV9DTElFTlRTOyBpKyspCi0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJtY2xpZW50W2ldLndhaXQpOwotCW11dGV4X2luaXQoJnJtdGFzay5sb2NrKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfdmZlX3BhdGNoX2V2ZW50LmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwX3ZmZV9wYXRjaF9ldmVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODlhMzdkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfdmZlX3BhdGNoX2V2ZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwX3ZmZV9wYXRjaF9ldmVudC5jCi0gKgotICogVmVyaWZpY2F0aW9uIGNvZGUgZm9yIGFEU1AgVkZFIHBhY2tldHMgZnJvbSB1c2Vyc3BhY2UuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1dmZlbXNnLmg+Ci0jaW5jbHVkZSAiYWRzcC5oIgotCi1zdGF0aWMgaW50IHBhdGNoX29wX2V2ZW50KHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwKLQkJCQlzdHJ1Y3QgYWRzcF9ldmVudCAqZXZlbnQpCi17Ci0JdmZlX21zZ19vcDEgKm9wID0gKHZmZV9tc2dfb3AxICopZXZlbnQtPmRhdGEubXNnMTY7Ci0JaWYgKGFkc3BfcG1lbV9wYWRkcl9maXh1cChtb2R1bGUsICh2b2lkICoqKSZvcC0+b3AxX2J1Zl95X2FkZHIpIHx8Ci0JICAgIGFkc3BfcG1lbV9wYWRkcl9maXh1cChtb2R1bGUsICh2b2lkICoqKSZvcC0+b3AxX2J1Zl9jYmNyX2FkZHIpKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcGF0Y2hfYWZfd2JfZXZlbnQoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotCQkJCXN0cnVjdCBhZHNwX2V2ZW50ICpldmVudCkKLXsKLQl2ZmVfbXNnX3N0YXRzX3diX2V4cCAqYWYgPSAodmZlX21zZ19zdGF0c193Yl9leHAgKilldmVudC0+ZGF0YS5tc2cxNjsKLQlyZXR1cm4gYWRzcF9wbWVtX3BhZGRyX2ZpeHVwKG1vZHVsZSwgKHZvaWQgKiopJmFmLT53Yl9leHBfc3RhdHNfb3BfYnVmKTsKLX0KLQotaW50IGFkc3BfdmZlX3BhdGNoX2V2ZW50KHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwKLQkJCXN0cnVjdCBhZHNwX2V2ZW50ICpldmVudCkKLXsKLQlzd2l0Y2goZXZlbnQtPm1zZ19pZCkgewotCWNhc2UgVkZFX01TR19PUDE6Ci0JY2FzZSBWRkVfTVNHX09QMjoKLQkJcmV0dXJuIHBhdGNoX29wX2V2ZW50KG1vZHVsZSwgZXZlbnQpOwotCWNhc2UgVkZFX01TR19TVEFUU19BRjoKLQljYXNlIFZGRV9NU0dfU1RBVFNfV0JfRVhQOgkKLQkJcmV0dXJuIHBhdGNoX2FmX3diX2V2ZW50KG1vZHVsZSwgZXZlbnQpOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF92ZmVfdmVyaWZ5X2NtZC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYWRzcF92ZmVfdmVyaWZ5X2NtZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmEwMTJlLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfdmZlX3ZlcmlmeV9jbWQuYworKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwX3ZmZV92ZXJpZnlfY21kLmMKLSAqCi0gKiBWZXJpZmljYXRpb24gY29kZSBmb3IgYURTUCBWRkUgcGFja2V0cyBmcm9tIHVzZXJzcGFjZS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDV2ZmVjbWRpLmg+Ci0jaW5jbHVkZSAiYWRzcC5oIgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLQotc3RhdGljIHVpbnQzMl90IHNpemUxX3ksIHNpemUyX3ksIHNpemUxX2NiY3IsIHNpemUyX2NiY3I7Ci1zdGF0aWMgdWludDMyX3QgYWZfc2l6ZSA9IDQyMjg7Ci1zdGF0aWMgdWludDMyX3QgYXdiX3NpemUgPSA4MTk2OwotCi1zdGF0aWMgaW5saW5lIGludCB2ZXJpZnlfY21kX29wX2FjayhzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCQkJICAgIHZvaWQgKmNtZF9kYXRhLCBzaXplX3QgY21kX3NpemUpCi17Ci0JdmZlX2NtZF9vcDFfYWNrICpjbWQgPSAodmZlX2NtZF9vcDFfYWNrICopY21kX2RhdGE7Ci0Jdm9pZCAqKmFkZHJfeSA9ICh2b2lkICoqKSZjbWQtPm9wMV9idWZfeV9hZGRyOwotCXZvaWQgKiphZGRyX2NiY3IgPSAodm9pZCAqKikoJmNtZC0+b3AxX2J1Zl9jYmNyX2FkZHIpOwotCi0JaWYgKGNtZF9zaXplICE9IHNpemVvZih2ZmVfY21kX29wMV9hY2spKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCgqYWRkcl95ICYmIGFkc3BfcG1lbV9maXh1cChtb2R1bGUsIGFkZHJfeSwgc2l6ZTFfeSkpIHx8Ci0JICAgICgqYWRkcl9jYmNyICYmIGFkc3BfcG1lbV9maXh1cChtb2R1bGUsIGFkZHJfY2Jjciwgc2l6ZTFfY2JjcikpKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHZlcmlmeV9jbWRfc3RhdHNfYXV0b2ZvY3VzX2NmZyhzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCQkJCQkgdm9pZCAqY21kX2RhdGEsIHNpemVfdCBjbWRfc2l6ZSkKLXsKLQlpbnQgaTsKLQl2ZmVfY21kX3N0YXRzX2F1dG9mb2N1c19jZmcgKmNtZCA9Ci0JCSh2ZmVfY21kX3N0YXRzX2F1dG9mb2N1c19jZmcgKiljbWRfZGF0YTsKLQotCWlmIChjbWRfc2l6ZSAhPSBzaXplb2YodmZlX2NtZF9zdGF0c19hdXRvZm9jdXNfY2ZnKSkKLQkJcmV0dXJuIC0xOwotCi0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQl2b2lkICoqYWRkciA9ICh2b2lkICoqKSgmY21kLT5hZl9zdGF0c19vcF9idWZbaV0pOwotCQlpZiAoKmFkZHIgJiYgYWRzcF9wbWVtX2ZpeHVwKG1vZHVsZSwgYWRkciwgYWZfc2l6ZSkpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB2ZXJpZnlfY21kX3N0YXRzX3diX2V4cF9jZmcoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotCQkJCQkgICAgICB2b2lkICpjbWRfZGF0YSwgc2l6ZV90IGNtZF9zaXplKQotewotCXZmZV9jbWRfc3RhdHNfd2JfZXhwX2NmZyAqY21kID0KLQkJKHZmZV9jbWRfc3RhdHNfd2JfZXhwX2NmZyAqKWNtZF9kYXRhOwotCWludCBpOwotCi0JaWYgKGNtZF9zaXplICE9IHNpemVvZih2ZmVfY21kX3N0YXRzX3diX2V4cF9jZmcpKQotCQlyZXR1cm4gLTE7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXZvaWQgKiphZGRyID0gKHZvaWQgKiopKCZjbWQtPndiX2V4cF9zdGF0c19vcF9idWZbaV0pOwotCQlpZiAoKmFkZHIgJiYgYWRzcF9wbWVtX2ZpeHVwKG1vZHVsZSwgYWRkciwgYXdiX3NpemUpKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgdmVyaWZ5X2NtZF9zdGF0c19hZl9hY2soc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotCQkJCQkgIHZvaWQgKmNtZF9kYXRhLCBzaXplX3QgY21kX3NpemUpCi17Ci0JdmZlX2NtZF9zdGF0c19hZl9hY2sgKmNtZCA9ICh2ZmVfY21kX3N0YXRzX2FmX2FjayAqKWNtZF9kYXRhOwotCXZvaWQgKiphZGRyID0gKHZvaWQgKiopJmNtZC0+YWZfc3RhdHNfb3BfYnVmOwotCi0JaWYgKGNtZF9zaXplICE9IHNpemVvZih2ZmVfY21kX3N0YXRzX2FmX2FjaykpCi0JCXJldHVybiAtMTsKLQotCWlmICgqYWRkciAmJiBhZHNwX3BtZW1fZml4dXAobW9kdWxlLCBhZGRyLCBhZl9zaXplKSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB2ZXJpZnlfY21kX3N0YXRzX3diX2V4cF9hY2soc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotCQkJCQkgICAgICB2b2lkICpjbWRfZGF0YSwgc2l6ZV90IGNtZF9zaXplKQotewotCXZmZV9jbWRfc3RhdHNfd2JfZXhwX2FjayAqY21kID0KLQkJKHZmZV9jbWRfc3RhdHNfd2JfZXhwX2FjayAqKWNtZF9kYXRhOwotCXZvaWQgKiphZGRyID0gKHZvaWQgKiopJmNtZC0+d2JfZXhwX3N0YXRzX29wX2J1ZjsKLQotCWlmIChjbWRfc2l6ZSAhPSBzaXplb2YodmZlX2NtZF9zdGF0c193Yl9leHBfYWNrKSkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKCphZGRyICYmIGFkc3BfcG1lbV9maXh1cChtb2R1bGUsIGFkZHIsIGF3Yl9zaXplKSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZlcmlmeV92ZmVfY29tbWFuZChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCQkgICAgICB2b2lkICpjbWRfZGF0YSwgc2l6ZV90IGNtZF9zaXplKQotewotCXVpbnQzMl90IGNtZF9pZCA9ICgodWludDMyX3QgKiljbWRfZGF0YSlbMF07Ci0Jc3dpdGNoIChjbWRfaWQpIHsKLQljYXNlIFZGRV9DTURfT1AxX0FDSzoKLQkJcmV0dXJuIHZlcmlmeV9jbWRfb3BfYWNrKG1vZHVsZSwgY21kX2RhdGEsIGNtZF9zaXplKTsKLQljYXNlIFZGRV9DTURfT1AyX0FDSzoKLQkJcmV0dXJuIHZlcmlmeV9jbWRfb3BfYWNrKG1vZHVsZSwgY21kX2RhdGEsIGNtZF9zaXplKTsKLQljYXNlIFZGRV9DTURfU1RBVFNfQVVUT0ZPQ1VTX0NGRzoKLQkJcmV0dXJuIHZlcmlmeV9jbWRfc3RhdHNfYXV0b2ZvY3VzX2NmZyhtb2R1bGUsIGNtZF9kYXRhLAotCQkJCQkJICAgICAgY21kX3NpemUpOwotCWNhc2UgVkZFX0NNRF9TVEFUU19XQl9FWFBfQ0ZHOgotCQlyZXR1cm4gdmVyaWZ5X2NtZF9zdGF0c193Yl9leHBfY2ZnKG1vZHVsZSwgY21kX2RhdGEsIGNtZF9zaXplKTsKLQljYXNlIFZGRV9DTURfU1RBVFNfQUZfQUNLOgotCQlyZXR1cm4gdmVyaWZ5X2NtZF9zdGF0c19hZl9hY2sobW9kdWxlLCBjbWRfZGF0YSwgY21kX3NpemUpOwotCWNhc2UgVkZFX0NNRF9TVEFUU19XQl9FWFBfQUNLOgotCQlyZXR1cm4gdmVyaWZ5X2NtZF9zdGF0c193Yl9leHBfYWNrKG1vZHVsZSwgY21kX2RhdGEsIGNtZF9zaXplKTsKLQlkZWZhdWx0OgotCQlpZiAoY21kX2lkID4gMjkpIHsKLQkJCU1NX0VSUigibW9kdWxlICVzOiBpbnZhbGlkIFZGRSBjb21tYW5kIGlkICVkXG4iLAotCQkJCQltb2R1bGUtPm5hbWUsIGNtZF9pZCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmVyaWZ5X3ZmZV9jb21tYW5kX3NjYWxlKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwKLQkJCQkgICAgdm9pZCAqY21kX2RhdGEsIHNpemVfdCBjbWRfc2l6ZSkKLXsKLQl1aW50MzJfdCBjbWRfaWQgPSAoKHVpbnQzMl90ICopY21kX2RhdGEpWzBdOwotCS8vIEZJWE1FOiBjaGVjayB0aGUgc2l6ZQotCWlmIChjbWRfaWQgPiAxKSB7Ci0JCU1NX0VSUigibW9kdWxlICVzOiBpbnZhbGlkIFZGRSBTQ0FMRSBjb21tYW5kIGlkICVkXG4iLAotCQkJCW1vZHVsZS0+bmFtZSwgY21kX2lkKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdWludDMyX3QgZ2V0X3NpemUodWludDMyX3QgaHcpCi17Ci0JdWludDMyX3QgaGVpZ2h0LCB3aWR0aDsKLQl1aW50MzJfdCBoZWlnaHRfbWFzayA9IDB4M2ZmYzsKLQl1aW50MzJfdCB3aWR0aF9tYXNrID0gMHgzZmZjMDAwOwotCi0JaGVpZ2h0ID0gKGh3ICYgaGVpZ2h0X21hc2spID4+IDI7Ci0Jd2lkdGggPSAoaHcgJiB3aWR0aF9tYXNrKSA+PiAxNCA7Ci0JcmV0dXJuIGhlaWdodCAqIHdpZHRoOwotfQotCi1zdGF0aWMgaW50IHZlcmlmeV92ZmVfY29tbWFuZF90YWJsZShzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCQkJICAgIHZvaWQgKmNtZF9kYXRhLCBzaXplX3QgY21kX3NpemUpCi17Ci0JdWludDMyX3QgY21kX2lkID0gKCh1aW50MzJfdCAqKWNtZF9kYXRhKVswXTsKLQlpbnQgaTsKLQotCXN3aXRjaCAoY21kX2lkKSB7Ci0JY2FzZSBWRkVfQ01EX0FYSV9JUF9DRkc6Ci0JewotCQl2ZmVfY21kX2F4aV9pcF9jZmcgKmNtZCA9ICh2ZmVfY21kX2F4aV9pcF9jZmcgKiljbWRfZGF0YTsKLQkJdWludDMyX3Qgc2l6ZTsKLQkJaWYgKGNtZF9zaXplICE9IHNpemVvZih2ZmVfY21kX2F4aV9pcF9jZmcpKSB7Ci0JCQlNTV9FUlIoIm1vZHVsZSAlczogaW52YWxpZCBWRkUgVEFCTEUgXAotCQkJCShWRkVfQ01EX0FYSV9JUF9DRkcpIGNvbW1hbmQgc2l6ZSAlZFxuIiwKLQkJCQltb2R1bGUtPm5hbWUsIGNtZF9zaXplKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlzaXplID0gZ2V0X3NpemUoY21kLT5pcF9jZmdfcGFydDIpOwotCi0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCXZvaWQgKiphZGRyID0gKHZvaWQgKiopCi0JCQkJJmNtZC0+aXBfYnVmX2FkZHJbaV07Ci0JCQlpZiAoKmFkZHIgJiYgYWRzcF9wbWVtX2ZpeHVwKG1vZHVsZSwgYWRkciwgc2l6ZSkpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWNhc2UgVkZFX0NNRF9BWElfT1BfQ0ZHOgotCXsKLQkJdmZlX2NtZF9heGlfb3BfY2ZnICpjbWQgPSAodmZlX2NtZF9heGlfb3BfY2ZnICopY21kX2RhdGE7Ci0JCXZvaWQgKiphZGRyMV95LCAqKmFkZHIyX3ksICoqYWRkcjFfY2JjciwgKiphZGRyMl9jYmNyOwotCi0JCWlmIChjbWRfc2l6ZSAhPSBzaXplb2YodmZlX2NtZF9heGlfb3BfY2ZnKSkgeyAKLQkJCU1NX0VSUigibW9kdWxlICVzOiBpbnZhbGlkIFZGRSBUQUJMRSBcCi0JCQkJKFZGRV9DTURfQVhJX09QX0NGRykgY29tbWFuZCBzaXplICVkXG4iLAotCQkJCW1vZHVsZS0+bmFtZSwgY21kX3NpemUpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXNpemUxX3kgPSBnZXRfc2l6ZShjbWQtPm9wMV95X2NmZ19wYXJ0Mik7Ci0JCXNpemUxX2NiY3IgPSBnZXRfc2l6ZShjbWQtPm9wMV9jYmNyX2NmZ19wYXJ0Mik7Ci0JCXNpemUyX3kgPSBnZXRfc2l6ZShjbWQtPm9wMl95X2NmZ19wYXJ0Mik7Ci0JCXNpemUyX2NiY3IgPSBnZXRfc2l6ZShjbWQtPm9wMl9jYmNyX2NmZ19wYXJ0Mik7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCWFkZHIxX3kgPSAodm9pZCAqKikoJmNtZC0+b3AxX2J1ZjFfYWRkclsyKmldKTsKLQkJCWFkZHIxX2NiY3IgPSAodm9pZCAqKikoJmNtZC0+b3AxX2J1ZjFfYWRkclsyKmkrMV0pOwotCQkJYWRkcjJfeSA9ICh2b2lkICoqKSgmY21kLT5vcDJfYnVmMV9hZGRyWzIqaV0pOwotCQkJYWRkcjJfY2JjciA9ICh2b2lkICoqKSgmY21kLT5vcDJfYnVmMV9hZGRyWzIqaSsxXSk7Ci0vKgotCQkJcHJpbnRrKCJtb2R1bGUgJXM6IFslZF0gJXAgJXAgJXAgJXBcbiIsCi0JCQkJbW9kdWxlLT5uYW1lLCBpLAotCQkJCSphZGRyMV95LCAqYWRkcjFfY2JjciwgKmFkZHIyX3ksICphZGRyMl9jYmNyKTsKLSovCi0JCQlpZiAoKCphZGRyMV95ICYmIGFkc3BfcG1lbV9maXh1cChtb2R1bGUsIGFkZHIxX3ksIHNpemUxX3kpKSB8fAotCQkJICAgICgqYWRkcjFfY2JjciAmJiBhZHNwX3BtZW1fZml4dXAobW9kdWxlLCBhZGRyMV9jYmNyLCBzaXplMV9jYmNyKSkgfHwKLQkJCSAgICAoKmFkZHIyX3kgJiYgYWRzcF9wbWVtX2ZpeHVwKG1vZHVsZSwgYWRkcjJfeSwgc2l6ZTJfeSkpIHx8Ci0JCQkgICAgKCphZGRyMl9jYmNyICYmIGFkc3BfcG1lbV9maXh1cChtb2R1bGUsIGFkZHIyX2NiY3IsIHNpemUyX2NiY3IpKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JZGVmYXVsdDoKLQkJaWYgKGNtZF9pZCA+IDQpIHsKLQkJCU1NX0VSUigibW9kdWxlICVzOiBpbnZhbGlkIFZGRSBUQUJMRSBjb21tYW5kIFwKLQkJCQlpZCAlZFxuIiwgbW9kdWxlLT5uYW1lLCBjbWRfaWQpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgYWRzcF92ZmVfdmVyaWZ5X2NtZChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCQl1bnNpZ25lZCBpbnQgcXVldWVfaWQsIHZvaWQgKmNtZF9kYXRhLAotCQkJc2l6ZV90IGNtZF9zaXplKQotewotCXN3aXRjaCAocXVldWVfaWQpIHsKLQljYXNlIFFEU1BfdmZlQ29tbWFuZFF1ZXVlOgotCQlyZXR1cm4gdmVyaWZ5X3ZmZV9jb21tYW5kKG1vZHVsZSwgY21kX2RhdGEsIGNtZF9zaXplKTsKLQljYXNlIFFEU1BfdmZlQ29tbWFuZFNjYWxlUXVldWU6Ci0JCXJldHVybiB2ZXJpZnlfdmZlX2NvbW1hbmRfc2NhbGUobW9kdWxlLCBjbWRfZGF0YSwgY21kX3NpemUpOwotCWNhc2UgUURTUF92ZmVDb21tYW5kVGFibGVRdWV1ZToKLQkJcmV0dXJuIHZlcmlmeV92ZmVfY29tbWFuZF90YWJsZShtb2R1bGUsIGNtZF9kYXRhLCBjbWRfc2l6ZSk7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJtb2R1bGUgJXM6IHVua25vd24gcXVldWUgaWQgJWRcbiIsCi0JCQkgbW9kdWxlLT5uYW1lLCBxdWV1ZV9pZCk7Ci0JCXJldHVybiAtMTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwX3ZpZGVvX3ZlcmlmeV9jbWQuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfdmlkZW9fdmVyaWZ5X2NtZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmQ2ZDU4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfdmlkZW9fdmVyaWZ5X2NtZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfdmlkZW9fdmVyaWZ5X2NtZC5jCi0gKgotICogVmVyaWZpY2lvbiBjb2RlIGZvciBhRFNQIFZERUMgcGFja2V0cyBmcm9tIHVzZXJzcGFjZS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMCwgMjAxMiBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDV2ZGVjY21kaS5oPgotI2luY2x1ZGUgImFkc3AuaCIKLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLSNkZWZpbmUgTUFYX0ZMVVNIX1NJWkUgMTYwCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqaGlnaF9sb3dfc2hvcnRfdG9fcHRyKHVuc2lnbmVkIHNob3J0IGhpZ2gsCi0JCQkJCSAgdW5zaWduZWQgc2hvcnQgbG93KQotewotCXJldHVybiAodm9pZCAqKSgoKCh1bnNpZ25lZCBsb25nKWhpZ2gpIDw8IDE2KSB8ICgodW5zaWduZWQgbG9uZylsb3cpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHB0cl90b19oaWdoX2xvd19zaG9ydCh2b2lkICpwdHIsIHVuc2lnbmVkIHNob3J0ICpoaWdoLAotCQkJCQkgdW5zaWduZWQgc2hvcnQgKmxvdykKLXsKLQkqaGlnaCA9ICh1bnNpZ25lZCBzaG9ydCkoKCgodW5zaWduZWQgbG9uZylwdHIpID4+IDE2KSAmIDB4ZmZmZik7Ci0JKmxvdyA9ICh1bnNpZ25lZCBzaG9ydCkoKHVuc2lnbmVkIGxvbmcpcHRyICYgMHhmZmZmKTsKLX0KLQotc3RhdGljIGludCBwbWVtX2ZpeHVwX2hpZ2hfbG93KHVuc2lnbmVkIHNob3J0ICpoaWdoLAotCQkJCXVuc2lnbmVkIHNob3J0ICpsb3csCi0JCQkJdW5zaWduZWQgc2hvcnQgc2l6ZV9oaWdoLAotCQkJCXVuc2lnbmVkIHNob3J0IHNpemVfbG93LAotCQkJCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwKLQkJCQl1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nICpzaXplLAotCQkJCXN0cnVjdCBmaWxlICoqZmlscCwgdW5zaWduZWQgbG9uZyAqb2Zmc2V0KQotewotCXZvaWQgKnBoeXNfYWRkcjsKLQl1bnNpZ25lZCBsb25nIHBoeXNfc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGt2YWRkcjsKLQotCXBoeXNfYWRkciA9IGhpZ2hfbG93X3Nob3J0X3RvX3B0cigqaGlnaCwgKmxvdyk7Ci0JcGh5c19zaXplID0gKHVuc2lnbmVkIGxvbmcpaGlnaF9sb3dfc2hvcnRfdG9fcHRyKHNpemVfaGlnaCwgc2l6ZV9sb3cpOwotCU1NX0RCRygidmlydCAleCAleFxuIiwgKHVuc2lnbmVkIGludClwaHlzX2FkZHIsCi0JCQkodW5zaWduZWQgaW50KXBoeXNfc2l6ZSk7Ci0JaWYgKHBoeXNfYWRkcikgewotCQlpZiAoYWRzcF9pb25fZml4dXBfa3ZhZGRyKG1vZHVsZSwgJnBoeXNfYWRkciwKLQkJCSAma3ZhZGRyLCBwaHlzX3NpemUsIGZpbHAsIG9mZnNldCkpIHsKLQkJCU1NX0VSUigiYWgleCBhbCV4IHNoJXggc2wleCBhZGRyICV4IHNpemUgJXhcbiIsCi0JCQkJCSpoaWdoLCAqbG93LCBzaXplX2hpZ2gsCi0JCQkJCXNpemVfbG93LCAodW5zaWduZWQgaW50KXBoeXNfYWRkciwKLQkJCQkJKHVuc2lnbmVkIGludClwaHlzX3NpemUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0JcHRyX3RvX2hpZ2hfbG93X3Nob3J0KHBoeXNfYWRkciwgaGlnaCwgbG93KTsKLQlNTV9EQkcoInBoeXMgJXggJXhcbiIsICh1bnNpZ25lZCBpbnQpcGh5c19hZGRyLAotCQkJKHVuc2lnbmVkIGludClwaHlzX3NpemUpOwotCWlmIChhZGRyKQotCQkqYWRkciA9IGt2YWRkcjsKLQlpZiAoc2l6ZSkKLQkJKnNpemUgPSBwaHlzX3NpemU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmVyaWZ5X3ZkZWNfcGt0X2NtZChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCQkgICAgICAgdm9pZCAqY21kX2RhdGEsIHNpemVfdCBjbWRfc2l6ZSkKLXsKLQl2b2lkICpwaHlzX2FkZHI7Ci0JdW5zaWduZWQgc2hvcnQgY21kX2lkID0gKCh1bnNpZ25lZCBzaG9ydCAqKWNtZF9kYXRhKVswXTsKLQl2aWRkZWNfY21kX3N1YmZyYW1lX3BrdCAqcGt0OwotCXVuc2lnbmVkIGxvbmcgc3ViZnJhbWVfcGt0X2FkZHI7Ci0JdW5zaWduZWQgbG9uZyBzdWJmcmFtZV9wa3Rfc2l6ZTsKLQl1bnNpZ25lZCBzaG9ydCAqZnJhbWVfaGVhZGVyX3BrdDsKLQlpbnQgaSwgbnVtX2FkZHIsIGNvbF9hZGRyID0gMCwgc2tpcDsKLQlpbnQgc3RhcnRfcG9zID0gMCwgeGRpbV9wb3MgPSAxLCB5ZGltX3BvcyA9IDI7Ci0JdW5zaWduZWQgc2hvcnQgKmZyYW1lX2J1ZmZlcl9oaWdoLCAqZnJhbWVfYnVmZmVyX2xvdzsKLQl1bnNpZ25lZCBsb25nIGZyYW1lX2J1ZmZlcl9zaXplOwotCXVuc2lnbmVkIHNob3J0IGZyYW1lX2J1ZmZlcl9zaXplX2hpZ2gsIGZyYW1lX2J1ZmZlcl9zaXplX2xvdzsKLQlzdHJ1Y3QgZmlsZSAqZmlscCA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgQ29kZWNfSWQgPSAwOwotCi0JTU1fREJHKCJjbWRfc2l6ZSAlZCBjbWRfaWQgJWQgY21kX2RhdGEgJXhcbiIsIGNtZF9zaXplLCBjbWRfaWQsCi0JCQkJCSh1bnNpZ25lZCBpbnQpY21kX2RhdGEpOwotCWlmIChjbWRfaWQgIT0gVklEREVDX0NNRF9TVUJGUkFNRV9QS1QpIHsKLQkJTU1fSU5GTygiYWRzcF92aWRlbzogdW5rbm93biB2aWRlbyBwYWNrZXQgJXVcbiIsIGNtZF9pZCk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoY21kX3NpemUgPCBzaXplb2YodmlkZGVjX2NtZF9zdWJmcmFtZV9wa3QpKQotCQlyZXR1cm4gLTE7Ci0KLQlwa3QgPSAodmlkZGVjX2NtZF9zdWJmcmFtZV9wa3QgKiljbWRfZGF0YTsKLQlwaHlzX2FkZHIgPSBoaWdoX2xvd19zaG9ydF90b19wdHIocGt0LT5zdWJmcmFtZV9wYWNrZXRfaGlnaCwKLQkJCQlwa3QtPnN1YmZyYW1lX3BhY2tldF9sb3cpOwotCi0JaWYgKHBtZW1fZml4dXBfaGlnaF9sb3coJihwa3QtPnN1YmZyYW1lX3BhY2tldF9oaWdoKSwKLQkJCQkmKHBrdC0+c3ViZnJhbWVfcGFja2V0X2xvdyksCi0JCQkJcGt0LT5zdWJmcmFtZV9wYWNrZXRfc2l6ZV9oaWdoLAotCQkJCXBrdC0+c3ViZnJhbWVfcGFja2V0X3NpemVfbG93LAotCQkJCW1vZHVsZSwKLQkJCQkmc3ViZnJhbWVfcGt0X2FkZHIsCi0JCQkJJnN1YmZyYW1lX3BrdF9zaXplLAotCQkJCSZmaWxwLCAmb2Zmc2V0KSkKLQkJcmV0dXJuIC0xOwotCUNvZGVjX0lkID0gcGt0LT5jb2RlY19zZWxlY3Rpb25fd29yZDsKLQkvKkludmFsaWRhdGUgY2FjaGUgYmVmb3JlIGFjY2Vzc2luZyB0aGUgY2FjaGVkIHBtZW0gYnVmZmVyKi8KLQlpZiAoYWRzcF9pb25fZG9fY2FjaGVfb3AobW9kdWxlLCBwaHlzX2FkZHIsICh2b2lkICopc3ViZnJhbWVfcGt0X2FkZHIsCi0JCXN1YmZyYW1lX3BrdF9zaXplKjIsIG9mZnNldCwgSU9OX0lPQ19JTlZfQ0FDSEVTKSl7Ci0JCU1NX0VSUigiQ2FjaGUgb3BlcmF0aW9uIGZhaWxlZCBmb3IiIFwKLQkJCSIgcGh5cyBhZGRyIGhpZ2ggJXggYWRkciBsb3cgJXhcbiIsCi0JCQlwa3QtPnN1YmZyYW1lX3BhY2tldF9oaWdoLCBwa3QtPnN1YmZyYW1lX3BhY2tldF9sb3cpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JLyogZGVyZWYgdGhvc2UgcHRycyBhbmQgY2hlY2sgaWYgdGhleSBhcmUgYSBmcmFtZSBoZWFkZXIgcGFja2V0ICovCi0JZnJhbWVfaGVhZGVyX3BrdCA9ICh1bnNpZ25lZCBzaG9ydCAqKXN1YmZyYW1lX3BrdF9hZGRyOwotCXN3aXRjaCAoZnJhbWVfaGVhZGVyX3BrdFswXSkgewotCWNhc2UgMHhCMjAxOiAvKiBoLjI2NCB2bGQgaW4gZHNwICovCi0JICAgaWYgKENvZGVjX0lkID09IDB4OCkgewotCQludW1fYWRkciA9IDE2OwotCQlza2lwID0gMDsKLQkJc3RhcnRfcG9zID0gNTsKLQkgICB9IGVsc2UgewotCSAgICAgICBudW1fYWRkciA9IDE2OwotCSAgICAgICBza2lwID0gMDsKLQkgICAgICAgc3RhcnRfcG9zID0gNjsKLQkgICAgICAgY29sX2FkZHIgPSAxNzsKLQkgICB9Ci0JCWJyZWFrOwotCWNhc2UgMHg4MjAxOiAvKiBoLjI2NCB2bGQgaW4gYXJtICovCi0JCW51bV9hZGRyID0gMTY7Ci0JCXNraXAgPSAwOwotCQlzdGFydF9wb3MgPSA2OwotCQlicmVhazsKLQljYXNlIDB4NEQwMTogLyogbXBlZy00IGFuZCBoLjI2MyB2bGQgaW4gYXJtICovCi0JCW51bV9hZGRyID0gMzsKLQkJc2tpcCA9IDA7Ci0JCXN0YXJ0X3BvcyA9IDU7Ci0JCWJyZWFrOwotCWNhc2UgMHg5MjAxOiAvKkZvciBSZWFsIERlY29kZXIqLwotCQludW1fYWRkciA9IDI7Ci0JCXNraXAgPSAwOwotCQlzdGFydF9wb3MgPSA1OwotCQlicmVhazsKLQljYXNlIDB4QkQwMTogLyogbXBlZy00IGFuZCBoLjI2MyB2bGQgaW4gZHNwICovCi0JCW51bV9hZGRyID0gMzsKLQkJc2tpcCA9IDA7Ci0JCXN0YXJ0X3BvcyA9IDY7Ci0JCWlmICgoKGZyYW1lX2hlYWRlcl9wa3RbNV0gJiAweDAwMGMpID4+IDIpID09IDB4MikgLyogQi1mcmFtZSAqLwotCQkJc3RhcnRfcG9zID0gODsKLQkJYnJlYWs7Ci0JY2FzZSAweDAwMDE6IC8qIHdtdiAqLwotCQludW1fYWRkciA9IDI7Ci0JCXNraXAgPSAwOwotCQlzdGFydF9wb3MgPSA1OwotCQlicmVhazsKLQljYXNlIDB4QzIwMTogLypXTVYgbWFpbiBwcm9maWxlKi8KLQkJIG51bV9hZGRyID0gMzsKLQkJIHNraXAgPSAwOwotCQkgc3RhcnRfcG9zID0gNjsKLQkJIGJyZWFrOwotCWNhc2UgMHhERDAxOiAvKiBWUDYgKi8KLQkJbnVtX2FkZHIgPSAzOwotCQlza2lwID0gMDsKLQkJc3RhcnRfcG9zID0gMTA7Ci0JCWJyZWFrOwotCWNhc2UgMHhGRDAxOiAvKiBWUDggKi8KLQkJbnVtX2FkZHIgPSAzOwotCQlza2lwID0gMDsKLQkJc3RhcnRfcG9zID0gMjQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KLQotCWZyYW1lX2J1ZmZlcl9oaWdoID0gJmZyYW1lX2hlYWRlcl9wa3Rbc3RhcnRfcG9zXTsKLQlmcmFtZV9idWZmZXJfbG93ID0gJmZyYW1lX2hlYWRlcl9wa3Rbc3RhcnRfcG9zICsgMV07Ci0JZnJhbWVfYnVmZmVyX3NpemUgPSAoZnJhbWVfaGVhZGVyX3BrdFt4ZGltX3Bvc10gKgotCQkJICAgICBmcmFtZV9oZWFkZXJfcGt0W3lkaW1fcG9zXSAqIDMpIC8gMjsKLQlwdHJfdG9faGlnaF9sb3dfc2hvcnQoKHZvaWQgKilmcmFtZV9idWZmZXJfc2l6ZSwKLQkJCSAgICAgICZmcmFtZV9idWZmZXJfc2l6ZV9oaWdoLAotCQkJICAgICAgJmZyYW1lX2J1ZmZlcl9zaXplX2xvdyk7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9hZGRyOyBpKyspIHsKLQkJaWYgKGZyYW1lX2J1ZmZlcl9oaWdoICYmIGZyYW1lX2J1ZmZlcl9sb3cpIHsKLQkJCWlmIChwbWVtX2ZpeHVwX2hpZ2hfbG93KGZyYW1lX2J1ZmZlcl9oaWdoLAotCQkJCQkJZnJhbWVfYnVmZmVyX2xvdywKLQkJCQkJCWZyYW1lX2J1ZmZlcl9zaXplX2hpZ2gsCi0JCQkJCQlmcmFtZV9idWZmZXJfc2l6ZV9sb3csCi0JCQkJCQltb2R1bGUsCi0JCQkJCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkgICB9Ci0JCWZyYW1lX2J1ZmZlcl9oaWdoICs9IDI7Ci0JCWZyYW1lX2J1ZmZlcl9sb3cgKz0gMjsKLQl9Ci0JLyogUGF0Y2ggdGhlIG91dHB1dCBidWZmZXIuICovCi0JZnJhbWVfYnVmZmVyX2hpZ2ggKz0gMipza2lwOwotCWZyYW1lX2J1ZmZlcl9sb3cgKz0gMipza2lwOwotCWlmIChmcmFtZV9idWZmZXJfaGlnaCAmJiBmcmFtZV9idWZmZXJfbG93KSB7Ci0JCWlmIChwbWVtX2ZpeHVwX2hpZ2hfbG93KGZyYW1lX2J1ZmZlcl9oaWdoLAotCQkJCQlmcmFtZV9idWZmZXJfbG93LAotCQkJCQlmcmFtZV9idWZmZXJfc2l6ZV9oaWdoLAotCQkJCQlmcmFtZV9idWZmZXJfc2l6ZV9sb3csCi0JCQkJCW1vZHVsZSwKLQkJCQkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGNvbF9hZGRyKSB7Ci0JCWZyYW1lX2J1ZmZlcl9oaWdoICs9IDI7Ci0JCWZyYW1lX2J1ZmZlcl9sb3cgKz0gMjsKLQkJLyogUGF0Y2ggdGhlIENvLWxvY2F0ZWQgYnVmZmVycy4qLwotCQlmcmFtZV9idWZmZXJfc2l6ZSA9ICAoNzIgKiBmcmFtZV9oZWFkZXJfcGt0W3hkaW1fcG9zXSAqCi0JCQkJCWZyYW1lX2hlYWRlcl9wa3RbeWRpbV9wb3NdKSA+PiAxNjsKLQkJcHRyX3RvX2hpZ2hfbG93X3Nob3J0KCh2b2lkICopZnJhbWVfYnVmZmVyX3NpemUsCi0JCQkJCSZmcmFtZV9idWZmZXJfc2l6ZV9oaWdoLAotCQkJCQkmZnJhbWVfYnVmZmVyX3NpemVfbG93KTsKLQkJZm9yIChpID0gMDsgaSA8IGNvbF9hZGRyOyBpKyspIHsKLQkJCWlmIChmcmFtZV9idWZmZXJfaGlnaCAmJiBmcmFtZV9idWZmZXJfbG93KSB7Ci0JCQkJaWYgKHBtZW1fZml4dXBfaGlnaF9sb3coZnJhbWVfYnVmZmVyX2hpZ2gsCi0JCQkJCQlmcmFtZV9idWZmZXJfbG93LAotCQkJCQkJZnJhbWVfYnVmZmVyX3NpemVfaGlnaCwKLQkJCQkJCWZyYW1lX2J1ZmZlcl9zaXplX2xvdywKLQkJCQkJCW1vZHVsZSwKLQkJCQkJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCWZyYW1lX2J1ZmZlcl9oaWdoICs9IDI7Ci0JCQlmcmFtZV9idWZmZXJfbG93ICs9IDI7Ci0JCX0KLQl9Ci0JLypGbHVzaCB0aGUgY2FjaGVkIG1lbSBzdWJmcmFtZSBwYWNrZXQgYmVmb3JlIHNlbmRpbmcgdG8gRFNQKi8KLQlpZiAoYWRzcF9pb25fZG9fY2FjaGVfb3AobW9kdWxlLCAgcGh5c19hZGRyLCAodm9pZCAqKXN1YmZyYW1lX3BrdF9hZGRyLAotCQlNQVhfRkxVU0hfU0laRSwgb2Zmc2V0LCBJT05fSU9DX0NMRUFOX0NBQ0hFUykpewotCQlNTV9FUlIoIkNhY2hlIG9wZXJhdGlvbiBmYWlsZWQgZm9yIiBcCi0JCQkiIHBoeXMgYWRkciBoaWdoICV4IGFkZHIgbG93ICV4XG4iLAotCQkJcGt0LT5zdWJmcmFtZV9wYWNrZXRfaGlnaCwgcGt0LT5zdWJmcmFtZV9wYWNrZXRfbG93KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgYWRzcF92aWRlb192ZXJpZnlfY21kKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwKLQkJCSB1bnNpZ25lZCBpbnQgcXVldWVfaWQsIHZvaWQgKmNtZF9kYXRhLAotCQkJIHNpemVfdCBjbWRfc2l6ZSkKLXsKLQlzd2l0Y2ggKHF1ZXVlX2lkKSB7Ci0JY2FzZSBRRFNQX21wdVZEZWNQa3RRdWV1ZToKLQkJcmV0dXJuIHZlcmlmeV92ZGVjX3BrdF9jbWQobW9kdWxlLCBjbWRfZGF0YSwgY21kX3NpemUpOwotCWRlZmF1bHQ6Ci0JCU1NX0lORk8oInVua25vd24gdmlkZW8gcXVldWUgJXVcbiIsIHF1ZXVlX2lkKTsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hZHNwX3ZpZGVvZW5jX3ZlcmlmeV9jbWQuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfdmlkZW9lbmNfdmVyaWZ5X2NtZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjE2NjI4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfdmlkZW9lbmNfdmVyaWZ5X2NtZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2Fkc3BfdmlkZW9fdmVyaWZ5X2NtZC5jCi0gKgotICogVmVyaWZpY2lvbiBjb2RlIGZvciBhRFNQIFZFTkMgcGFja2V0cyBmcm9tIHVzZXJzcGFjZS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSwgMjAxMiBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDV2ZW5jY21kaS5oPgotI2luY2x1ZGUgImFkc3AuaCIKLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLQotc3RhdGljIHVuc2lnbmVkIHNob3J0IHhfZGltZW5zaW9uLCB5X2RpbWVuc2lvbjsKLQotc3RhdGljIGlubGluZSB2b2lkICpoaWdoX2xvd19zaG9ydF90b19wdHIodW5zaWduZWQgc2hvcnQgaGlnaCwKLQkJCQkJICB1bnNpZ25lZCBzaG9ydCBsb3cpCi17Ci0JcmV0dXJuICh2b2lkICopKCgoKHVuc2lnbmVkIGxvbmcpaGlnaCkgPDwgMTYpIHwgKCh1bnNpZ25lZCBsb25nKWxvdykpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHRyX3RvX2hpZ2hfbG93X3Nob3J0KHZvaWQgKnB0ciwgdW5zaWduZWQgc2hvcnQgKmhpZ2gsCi0JCQkJCSB1bnNpZ25lZCBzaG9ydCAqbG93KQotewotCSpoaWdoID0gKHVuc2lnbmVkIHNob3J0KSgoKCh1bnNpZ25lZCBsb25nKXB0cikgPj4gMTYpICYgMHhmZmZmKTsKLQkqbG93ID0gKHVuc2lnbmVkIHNob3J0KSgodW5zaWduZWQgbG9uZylwdHIgJiAweGZmZmYpOwotfQotCi1zdGF0aWMgaW50IHBtZW1fZml4dXBfaGlnaF9sb3codW5zaWduZWQgc2hvcnQgKmhpZ2gsCi0JCQkJdW5zaWduZWQgc2hvcnQgKmxvdywKLQkJCQl1bnNpZ25lZCBzaG9ydCBzaXplX2hpZ2gsCi0JCQkJdW5zaWduZWQgc2hvcnQgc2l6ZV9sb3csCi0JCQkJc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotCQkJCXVuc2lnbmVkIGxvbmcgKmFkZHIsIHVuc2lnbmVkIGxvbmcgKnNpemUpCi17Ci0Jdm9pZCAqcGh5c19hZGRyOwotCXVuc2lnbmVkIGxvbmcgcGh5c19zaXplOwotCXVuc2lnbmVkIGxvbmcga3ZhZGRyOwotCi0JcGh5c19hZGRyID0gaGlnaF9sb3dfc2hvcnRfdG9fcHRyKCpoaWdoLCAqbG93KTsKLQlwaHlzX3NpemUgPSAodW5zaWduZWQgbG9uZyloaWdoX2xvd19zaG9ydF90b19wdHIoc2l6ZV9oaWdoLCBzaXplX2xvdyk7Ci0JTU1fREJHKCJ2aXJ0ICV4ICV4XG4iLCAodW5zaWduZWQgaW50KXBoeXNfYWRkciwKLQkJCSh1bnNpZ25lZCBpbnQpcGh5c19zaXplKTsKLQlpZiAoYWRzcF9pb25fZml4dXBfa3ZhZGRyKG1vZHVsZSwgJnBoeXNfYWRkciwgJmt2YWRkciwgcGh5c19zaXplLAotCQkJCU5VTEwsIE5VTEwpKSB7Ci0JCU1NX0VSUigiYWgleCBhbCV4IHNoJXggc2wleCBhZGRyICV4IHNpemUgJXhcbiIsCi0JCQkqaGlnaCwgKmxvdywgc2l6ZV9oaWdoLAotCQkJc2l6ZV9sb3csICh1bnNpZ25lZCBpbnQpcGh5c19hZGRyLAotCQkJKHVuc2lnbmVkIGludCkgcGh5c19zaXplKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlwdHJfdG9faGlnaF9sb3dfc2hvcnQocGh5c19hZGRyLCBoaWdoLCBsb3cpOwotCU1NX0RCRygicGh5cyAleCAleFxuIiwgKHVuc2lnbmVkIGludClwaHlzX2FkZHIsCi0JCQkodW5zaWduZWQgaW50KXBoeXNfc2l6ZSk7Ci0JaWYgKGFkZHIpCi0JCSphZGRyID0ga3ZhZGRyOwotCWlmIChzaXplKQotCQkqc2l6ZSA9IHBoeXNfc2l6ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZXJpZnlfdmVuY19jbWQoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotCQkJICAgICAgIHZvaWQgKmNtZF9kYXRhLCBzaXplX3QgY21kX3NpemUpCi17Ci0JdW5zaWduZWQgc2hvcnQgY21kX2lkID0gKCh1bnNpZ25lZCBzaG9ydCAqKWNtZF9kYXRhKVswXTsKLQl1bnNpZ25lZCBsb25nIGZyYW1lX2J1Zl9zaXplLCBsdW1hX2J1Zl9zaXplLCBjaHJvbWFfYnVmX3NpemU7Ci0JdW5zaWduZWQgc2hvcnQgZnJhbWVfYnVmX3NpemVfaGlnaCwgZnJhbWVfYnVmX3NpemVfbG93OwotCXVuc2lnbmVkIHNob3J0IGx1bWFfYnVmX3NpemVfaGlnaCwgbHVtYV9idWZfc2l6ZV9sb3c7Ci0JdW5zaWduZWQgc2hvcnQgY2hyb21hX2J1Zl9zaXplX2hpZ2gsIGNocm9tYV9idWZfc2l6ZV9sb3c7Ci0JdmlkZW5jX2NtZF9jZmcgKmNvbmZpZ19jbWQ7Ci0JdmlkZW5jX2NtZF9mcmFtZV9zdGFydCAqZnJhbWVfY21kOwotCXZpZGVuY19jbWRfZGlzICpkaXNfY21kOwotCi0JTU1fREJHKCJjbWRfc2l6ZSAlZCBjbWRfaWQgJWQgY21kX2RhdGEgJXhcbiIsCi0JCWNtZF9zaXplLCBjbWRfaWQsICh1bnNpZ25lZCBpbnQpY21kX2RhdGEpOwotCXN3aXRjaCAoY21kX2lkKSB7Ci0JY2FzZSBWSURFTkNfQ01EX0FDVElWRToKLQkJaWYgKGNtZF9zaXplIDwgc2l6ZW9mKHZpZGVuY19jbWRfYWN0aXZlKSkKLQkJCXJldHVybiAtMTsKLQkJYnJlYWs7Ci0JY2FzZSBWSURFTkNfQ01EX0lETEU6Ci0JCWlmIChjbWRfc2l6ZSA8IHNpemVvZih2aWRlbmNfY21kX2lkbGUpKQotCQkJcmV0dXJuIC0xOwotCQl4X2RpbWVuc2lvbiA9IHlfZGltZW5zaW9uID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBWSURFTkNfQ01EX1NUQVRVU19RVUVSWToKLQkJaWYgKGNtZF9zaXplIDwgc2l6ZW9mKHZpZGVuY19jbWRfc3RhdHVzX3F1ZXJ5KSkKLQkJCXJldHVybiAtMTsKLQkJYnJlYWs7Ci0JY2FzZSBWSURFTkNfQ01EX1JDX0NGRzoKLQkJaWYgKGNtZF9zaXplIDwgc2l6ZW9mKHZpZGVuY19jbWRfcmNfY2ZnKSkKLQkJCXJldHVybiAtMTsKLQkJYnJlYWs7Ci0JY2FzZSBWSURFTkNfQ01EX0lOVFJBX1JFRlJFU0g6Ci0JCWlmIChjbWRfc2l6ZSA8IHNpemVvZih2aWRlbmNfY21kX2ludHJhX3JlZnJlc2gpKQotCQkJcmV0dXJuIC0xOwotCQlicmVhazsKLQljYXNlIFZJREVOQ19DTURfRElHSVRBTF9aT09NOgotCQlpZiAoY21kX3NpemUgPCBzaXplb2YodmlkZW5jX2NtZF9kaWdpdGFsX3pvb20pKQotCQkJcmV0dXJuIC0xOwotCQlicmVhazsKLQljYXNlIFZJREVOQ19DTURfRElTX0NGRzoKLQkJaWYgKGNtZF9zaXplIDwgc2l6ZW9mKHZpZGVuY19jbWRfZGlzX2NmZykpCi0JCQlyZXR1cm4gLTE7Ci0JCWJyZWFrOwotCWNhc2UgVklERU5DX0NNRF9WRU5DX0NMT0NLOgotCQlpZiAoY21kX3NpemUgPCBzaXplb2Yoc3RydWN0IHZpZGVuY19jbWRfdmVuY19jbG9jaykpCi0JCQlyZXR1cm4gLTE7Ci0JCWJyZWFrOwotCWNhc2UgVklERU5DX0NNRF9DRkc6Ci0JCWlmIChjbWRfc2l6ZSA8IHNpemVvZih2aWRlbmNfY21kX2NmZykpCi0JCQlyZXR1cm4gLTE7Ci0JCWNvbmZpZ19jbWQgPSAodmlkZW5jX2NtZF9jZmcgKiljbWRfZGF0YTsKLQkJeF9kaW1lbnNpb24gPSAoKGNvbmZpZ19jbWQtPnZlbmNfZnJhbWVfZGltKSAmIDB4RkYwMCk+Pjg7Ci0JCXhfZGltZW5zaW9uID0geF9kaW1lbnNpb24qMTY7Ci0JCXlfZGltZW5zaW9uID0gKGNvbmZpZ19jbWQtPnZlbmNfZnJhbWVfZGltKSAmIDB4RkY7Ci0JCXlfZGltZW5zaW9uID0geV9kaW1lbnNpb24gKiAxNjsKLQkJYnJlYWs7Ci0JY2FzZSBWSURFTkNfQ01EX0ZSQU1FX1NUQVJUOgotCQlpZiAoY21kX3NpemUgPCBzaXplb2YodmlkZW5jX2NtZF9mcmFtZV9zdGFydCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWZyYW1lX2NtZCA9ICh2aWRlbmNfY21kX2ZyYW1lX3N0YXJ0ICopY21kX2RhdGE7Ci0JCWx1bWFfYnVmX3NpemUgPSB4X2RpbWVuc2lvbiAqIHlfZGltZW5zaW9uOwotCQljaHJvbWFfYnVmX3NpemUgPSBsdW1hX2J1Zl9zaXplPj4xOwotCQlmcmFtZV9idWZfc2l6ZSA9IGx1bWFfYnVmX3NpemUgKyBjaHJvbWFfYnVmX3NpemU7Ci0JCXB0cl90b19oaWdoX2xvd19zaG9ydCgodm9pZCAqKWx1bWFfYnVmX3NpemUsCi0JCQkgICAgICAmbHVtYV9idWZfc2l6ZV9oaWdoLAotCQkJICAgICAgJmx1bWFfYnVmX3NpemVfbG93KTsKLQkJcHRyX3RvX2hpZ2hfbG93X3Nob3J0KCh2b2lkICopY2hyb21hX2J1Zl9zaXplLAotCQkJICAgICAgJmNocm9tYV9idWZfc2l6ZV9oaWdoLAotCQkJICAgICAgJmNocm9tYV9idWZfc2l6ZV9sb3cpOwotCQlwdHJfdG9faGlnaF9sb3dfc2hvcnQoKHZvaWQgKilmcmFtZV9idWZfc2l6ZSwKLQkJCSAgICAgICZmcmFtZV9idWZfc2l6ZV9oaWdoLAotCQkJICAgICAgJmZyYW1lX2J1Zl9zaXplX2xvdyk7Ci0JCS8qIEFkZHJlc3Mgb2YgcmF3IFkgZGF0YS4gKi8KLQkJaWYgKHBtZW1fZml4dXBfaGlnaF9sb3coJmZyYW1lX2NtZC0+aW5wdXRfbHVtYV9hZGRyX2hpZ2gsCi0JCQkJCSZmcmFtZV9jbWQtPmlucHV0X2x1bWFfYWRkcl9sb3csCi0JCQkJCWx1bWFfYnVmX3NpemVfaGlnaCwKLQkJCQkJbHVtYV9idWZfc2l6ZV9sb3csCi0JCQkJCW1vZHVsZSwKLQkJCQkJTlVMTCwgTlVMTCkpCi0JCQlyZXR1cm4gLTE7Ci0JCS8qIEFkZHJlc3Mgb2YgcmF3IENiQ3IgZGF0YSAqLwotCQlpZiAocG1lbV9maXh1cF9oaWdoX2xvdygmZnJhbWVfY21kLT5pbnB1dF9jaHJvbWFfYWRkcl9oaWdoLAotCQkJCQkmZnJhbWVfY21kLT5pbnB1dF9jaHJvbWFfYWRkcl9sb3csCi0JCQkJCWNocm9tYV9idWZfc2l6ZV9oaWdoLAotCQkJCQljaHJvbWFfYnVmX3NpemVfbG93LAotCQkJCQltb2R1bGUsCi0JCQkJCU5VTEwsIE5VTEwpKQotCQkJcmV0dXJuIC0xOwotCQkvKiBSZWZlcmVuY2UgVk9QICovCi0JCWlmIChwbWVtX2ZpeHVwX2hpZ2hfbG93KCZmcmFtZV9jbWQtPnJlZl92b3BfYnVmX3B0cl9oaWdoLAotCQkJCQkmZnJhbWVfY21kLT5yZWZfdm9wX2J1Zl9wdHJfbG93LAotCQkJCQlmcmFtZV9idWZfc2l6ZV9oaWdoLAotCQkJCQlmcmFtZV9idWZfc2l6ZV9sb3csCi0JCQkJCW1vZHVsZSwKLQkJCQkJTlVMTCwgTlVMTCkpCi0JCQlyZXR1cm4gLTE7Ci0JCS8qIEVuY29kZWQgUGFja2V0IEFkZHJlc3MgKi8KLQkJaWYgKHBtZW1fZml4dXBfaGlnaF9sb3coJmZyYW1lX2NtZC0+ZW5jX3BrdF9idWZfcHRyX2hpZ2gsCi0JCQkJCSZmcmFtZV9jbWQtPmVuY19wa3RfYnVmX3B0cl9sb3csCi0JCQkJCWZyYW1lX2NtZC0+ZW5jX3BrdF9idWZfc2l6ZV9oaWdoLAotCQkJCQlmcmFtZV9jbWQtPmVuY19wa3RfYnVmX3NpemVfbG93LAotCQkJCQltb2R1bGUsCi0JCQkJCU5VTEwsIE5VTEwpKQotCQkJcmV0dXJuIC0xOwotCQkvKiBVbmZpbHRlcmVkIFZPUCBCdWZmZXIgQWRkcmVzcyAqLwotCQlpZiAocG1lbV9maXh1cF9oaWdoX2xvdygKLQkJCQkmZnJhbWVfY21kLT51bmZpbHRfcmVjb25fdm9wX2J1Zl9wdHJfaGlnaCwKLQkJCQkmZnJhbWVfY21kLT51bmZpbHRfcmVjb25fdm9wX2J1Zl9wdHJfbG93LAotCQkJCWZyYW1lX2J1Zl9zaXplX2hpZ2gsCi0JCQkJZnJhbWVfYnVmX3NpemVfbG93LAotCQkJCW1vZHVsZSwKLQkJCQlOVUxMLCBOVUxMKSkKLQkJCXJldHVybiAtMTsKLQkJLyogRmlsdGVyZWQgVk9QIEJ1ZmZlciBBZGRyZXNzICovCi0JCWlmIChwbWVtX2ZpeHVwX2hpZ2hfbG93KCZmcmFtZV9jbWQtPmZpbHRfcmVjb25fdm9wX2J1Zl9wdHJfaGlnaCwKLQkJCQkJJmZyYW1lX2NtZC0+ZmlsdF9yZWNvbl92b3BfYnVmX3B0cl9sb3csCi0JCQkJCWZyYW1lX2J1Zl9zaXplX2hpZ2gsCi0JCQkJCWZyYW1lX2J1Zl9zaXplX2xvdywKLQkJCQkJbW9kdWxlLAotCQkJCQlOVUxMLCBOVUxMKSkKLQkJCXJldHVybiAtMTsKLQkJYnJlYWs7Ci0JY2FzZSBWSURFTkNfQ01EX0RJUzoKLQkJaWYgKGNtZF9zaXplIDwgc2l6ZW9mKHZpZGVuY19jbWRfZGlzKSkKLQkJCXJldHVybiAtMTsKLQkJZGlzX2NtZCA9ICh2aWRlbmNfY21kX2RpcyAqKWNtZF9kYXRhOwotCQlsdW1hX2J1Zl9zaXplID0geF9kaW1lbnNpb24gKiB5X2RpbWVuc2lvbjsKLQkJcHRyX3RvX2hpZ2hfbG93X3Nob3J0KCh2b2lkICopbHVtYV9idWZfc2l6ZSwKLQkJCSAgICAgICZsdW1hX2J1Zl9zaXplX2hpZ2gsCi0JCQkgICAgICAmbHVtYV9idWZfc2l6ZV9sb3cpOwotCQkvKiBQcmV2IFZGRSBMdW1hIE91dHB1dCBBZGRyZXNzICovCi0JCWlmIChwbWVtX2ZpeHVwX2hpZ2hfbG93KCZkaXNfY21kLT52ZmVfb3V0X3ByZXZfbHVtYV9hZGRyX2hpZ2gsCi0JCQkJCSZkaXNfY21kLT52ZmVfb3V0X3ByZXZfbHVtYV9hZGRyX2xvdywKLQkJCQkJbHVtYV9idWZfc2l6ZV9oaWdoLAotCQkJCQlsdW1hX2J1Zl9zaXplX2xvdywKLQkJCQkJbW9kdWxlLAotCQkJCQlOVUxMLCBOVUxMKSkKLQkJCXJldHVybiAtMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fSU5GTygiYWRzcF92aWRlbzp1bmtub3duIGVuY29kZXIgdmlkZW8gY21kICV1XG4iLCBjbWRfaWQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgYWRzcF92aWRlb2VuY192ZXJpZnlfY21kKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwKLQkJCSB1bnNpZ25lZCBpbnQgcXVldWVfaWQsIHZvaWQgKmNtZF9kYXRhLAotCQkJIHNpemVfdCBjbWRfc2l6ZSkKLXsKLQlzd2l0Y2ggKHF1ZXVlX2lkKSB7Ci0JY2FzZSBRRFNQX21wdVZFbmNDbWRRdWV1ZToKLQkJcmV0dXJuIHZlcmlmeV92ZW5jX2NtZChtb2R1bGUsIGNtZF9kYXRhLCBjbWRfc2l6ZSk7Ci0JZGVmYXVsdDoKLQkJTU1fSU5GTygidW5rbm93biB2aWRlbyBxdWV1ZSAldVxuIiwgcXVldWVfaWQpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX2FhYy5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fYWFjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MmRmOGQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fYWFjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcxICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX2FhYy5jCi0gKgotICogYWFjIGF1ZGlvIGRlY29kZXIgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDksIDIwMTEtMjAxMiBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vhcmx5c3VzcGVuZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fYWFjLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtb3J5X2FsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgotCi0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXUuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11X2RvbWFpbnMuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHBjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBsYXljbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBsYXltc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1cm10Y21kaS5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9tZW10eXBlcy5oPgotCi0jaW5jbHVkZSAiYXVkbWdyLmgiCi0KLSNkZWZpbmUgQlVGU1ogMzI3NjgKLSNkZWZpbmUgRE1BU1ogKEJVRlNaICogMikKLSNkZWZpbmUgQlVGU1pfTUlOIDQwOTYKLSNkZWZpbmUgRE1BU1pfTUlOIChCVUZTWl9NSU4gKiAyKQotCi0jZGVmaW5lIEFVRFBMQVlfSU5WQUxJRF9SRUFEX1BUUl9PRkZTRVQJMHhGRkZGCi0jZGVmaW5lIEFVRERFQ19ERUNfQUFDIDUKLQotI2RlZmluZSBQQ01fQlVGU1pfTUlOIDk2MDAJLyogSG9sZCBvbmUgc3RlcmVvIEFBQyBmcmFtZSAqLwotI2RlZmluZSBQQ01fQlVGX01BWF9DT1VOVCA1CS8qIERTUCBvbmx5IGFjY2VwdHMgNSBidWZmZXJzIGF0IG1vc3QKLQkJCQkgICBidXQgc3VwcG9ydCAyIGJ1ZmZlcnMgY3VycmVudGx5ICovCi0jZGVmaW5lIFJPVVRJTkdfTU9ERV9GVFJUIDEKLSNkZWZpbmUgUk9VVElOR19NT0RFX1JUIDIKLS8qIERlY29kZXIgc3RhdHVzIHJlY2VpdmVkIGZyb20gQVVEUFBUQVNLICovCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX1NMRUVQCTAKLSNkZWZpbmUJIEFVRFBQX0RFQ19TVEFUVVNfSU5JVCAgMQotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19DRkcgICAyCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX1BMQVkgIDMKLQotI2RlZmluZSBBVURBQUNfTUVUQUZJRUxEX01BU0sgMHhGRkZGMDAwMAotI2RlZmluZSBBVURBQUNfRU9TX0ZMR19PRkZTRVQgMHgwQSAvKiBPZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgYnVmZmVyICovCi0jZGVmaW5lIEFVREFBQ19FT1NfRkxHX01BU0sgMHgwMQotI2RlZmluZSBBVURBQUNfRU9TX05PTkUgMHgwIC8qIE5vIEVPUyBkZXRlY3RlZCAqLwotI2RlZmluZSBBVURBQUNfRU9TX1NFVCAweDEgLyogRU9TIHNldCBpbiBtZXRhIGZpZWxkICovCi0KLSNkZWZpbmUgQVVEQUFDX0VWRU5UX05VTSAxMCAvKiBEZWZhdWx0IG51bWJlciBvZiBwcmUtYWxsb2NhdGVkIGV2ZW50IHBhY2tldHMgKi8KLQotc3RydWN0IGJ1ZmZlciB7Ci0Jdm9pZCAqZGF0YTsKLQl1bnNpZ25lZCBzaXplOwotCXVuc2lnbmVkIHVzZWQ7CQkvKiBJbnB1dCB1c2FnZSBhY3R1YWwgRFNQIHByb2R1Y2VkIFBDTSBzaXplICAqLwotCXVuc2lnbmVkIGFkZHI7Ci0JdW5zaWduZWQgc2hvcnQgbWZpZWxkX3N6OyAvKm9ubHkgdXNlZnVsIGZvciBkYXRhIGhhcyBtZXRhIGZpZWxkICovCi19OwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0cnVjdCBhdWRhYWNfc3VzcGVuZF9jdGwgewotCXN0cnVjdCBlYXJseV9zdXNwZW5kIG5vZGU7Ci0Jc3RydWN0IGF1ZGlvICphdWRpbzsKLX07Ci0jZW5kaWYKLQotc3RydWN0IGF1ZGFhY19ldmVudHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JaW50IGV2ZW50X3R5cGU7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLX07Ci0KLXN0cnVjdCBhdWRpbyB7Ci0Jc3RydWN0IGJ1ZmZlciBvdXRbMl07Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JdWludDhfdCBvdXRfaGVhZDsKLQl1aW50OF90IG91dF90YWlsOwotCXVpbnQ4X3Qgb3V0X25lZWRlZDsJLyogbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGRzcCBpcyB3YWl0aW5nIGZvciAqLwotCXVuc2lnbmVkIG91dF9kbWFfc3o7Ci0KLQlhdG9taWNfdCBvdXRfYnl0ZXM7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggd3JpdGVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3cml0ZV93YWl0OwotCi0JLyogSG9zdCBQQ00gc2VjdGlvbiAqLwotCXN0cnVjdCBidWZmZXIgaW5bUENNX0JVRl9NQVhfQ09VTlRdOwotCXN0cnVjdCBtdXRleCByZWFkX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF93YWl0OwkvKiBXYWl0IHF1ZXVlIGZvciByZWFkICovCi0JY2hhciAqcmVhZF9kYXRhOwkvKiBwb2ludGVyIHRvIHJlYWRlciBidWZmZXIgKi8KLQlpbnQzMl90IHJlYWRfcGh5czsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiByZWFkZXIgYnVmZmVyICovCi0JdWludDhfdCByZWFkX25leHQ7CS8qIGluZGV4IHRvIGlucHV0IGJ1ZmZlcnMgdG8gYmUgcmVhZCBuZXh0ICovCi0JdWludDhfdCBmaWxsX25leHQ7CS8qIGluZGV4IHRvIGJ1ZmZlciB0aGF0IERTUCBzaG91bGQgYmUgZmlsbGluZyAqLwotCXVpbnQ4X3QgcGNtX2J1Zl9jb3VudDsJLyogbnVtYmVyIG9mIHBjbSBidWZmZXIgYWxsb2NhdGVkICovCi0JLyogLS0tLSBFbmQgb2YgSG9zdCBQQ00gc2VjdGlvbiAqLwotCi0Jc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqYXVkcGxheTsKLQl2b2lkICptYXBfdl9yZWFkOwotCXZvaWQgKm1hcF92X3dyaXRlOwotCi0JLyogY29uZmlndXJhdGlvbiB0byB1c2Ugb24gbmV4dCBlbmFibGUgKi8KLQl1aW50MzJfdCBvdXRfc2FtcGxlX3JhdGU7Ci0JdWludDMyX3Qgb3V0X2NoYW5uZWxfbW9kZTsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgYWFjX2NvbmZpZzsKLQlzdHJ1Y3QgYXVkbWdyIGF1ZG1ncjsKLQotCS8qIGRhdGEgYWxsb2NhdGVkIGZvciB2YXJpb3VzIGJ1ZmZlcnMgKi8KLQljaGFyICpkYXRhOwotCWludDMyX3QgcGh5czsgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB3cml0ZSBidWZmZXIgKi8KLQotCWludCBtZmllbGQ7IC8qIG1ldGEgZmllbGQgZW1iZWRkZWQgaW4gZGF0YSAqLwotCWludCByZmx1c2g7IC8qIFJlYWQgIGZsdXNoICovCi0JaW50IGVvc19pbl9wcm9ncmVzczsKLQlpbnQgd2ZsdXNoOyAvKiBXcml0ZSBmbHVzaCAqLwotCWludCBvcGVuZWQ7Ci0JaW50IGVuYWJsZWQ7Ci0JaW50IHJ1bm5pbmc7Ci0JaW50IHN0b3BwZWQ7CS8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQlpbnQgcGNtX2ZlZWRiYWNrOwotCWludCBidWZfcmVmcmVzaDsKLQlpbnQgcm10X3Jlc291cmNlX3JlbGVhc2VkOwotCWludCB0ZW9zOyAvKiB2YWxpZCBvbmx5IGlmIHR1bm5lbCBtb2RlICYgbm8gZGF0YSBsZWZ0IGZvciBkZWNvZGVyICovCi0JZW51bSBtc21fYXVkX2RlY29kZXJfc3RhdGUgZGVjX3N0YXRlOwkvKiBSZXByZXNlbnRzIGRlY29kZXIgc3RhdGUgKi8KLQlpbnQgcmVzZXJ2ZWQ7IC8qIEEgYnl0ZSBpcyBiZWluZyByZXNlcnZlZCAqLwotCWNoYXIgcnN2X2J5dGU7IC8qIEhhbmRsZSBvZGQgbGVuZ3RoIHVzZXIgZGF0YSAqLwotCi0JY29uc3QgY2hhciAqbW9kdWxlX25hbWU7Ci0JdW5zaWduZWQgcXVldWVfaWQ7Ci0JdWludDE2X3QgZGVjX2lkOwotCXVpbnQzMl90IHJlYWRfcHRyX29mZnNldDsKLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0Jc3RydWN0IGF1ZGFhY19zdXNwZW5kX2N0bCBzdXNwZW5kX2N0bDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotI2VuZGlmCi0KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9ldmVudF9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50X3F1ZXVlOwotCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3dhaXQ7Ci0Jc3BpbmxvY2tfdCBldmVudF9xdWV1ZV9sb2NrOwotCXN0cnVjdCBtdXRleCBnZXRfZXZlbnRfbG9jazsKLQlpbnQgZXZlbnRfYWJvcnQ7Ci0KLQlzdHJ1Y3QgbXNtX2F1ZGlvX2JpdHN0cmVhbV9pbmZvIHN0cmVhbV9pbmZvOwotCi0JaW50IGVxX2VuYWJsZTsKLQlpbnQgZXFfbmVlZHNfY29tbWl0OwotCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19lcWFsaXplciBlcTsKLQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfdm9sdW1lIHZvbF9wYW47Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaW5wdXRfYnVmZl9oYW5kbGU7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKm91dHB1dF9idWZmX2hhbmRsZTsKLX07Ci0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRwbGF5X3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpOwotc3RhdGljIHZvaWQgYXVkcGxheV9jb25maWdfaG9zdHBjbShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZHBsYXlfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRpb19kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpOwotc3RhdGljIHZvaWQgYXVkYWFjX3Bvc3RfZXZlbnQoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHR5cGUsCi0JCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQpOwotCi1zdGF0aWMgaW50IHJtdF9wdXRfcmVzb3VyY2Uoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkX2NvZGVjX2NvbmZpZ19jbWQgY21kOwotCXVuc2lnbmVkIHNob3J0IGNsaWVudF9pZHg7Ci0KLQljbWQuY21kX2lkID0gUk1fQ01EX0FVRF9DT0RFQ19DRkc7Ci0JY21kLmNsaWVudF9pZCA9IFJNX0FVRF9DTElFTlRfSUQ7Ci0JY21kLnRhc2tfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5lbmFibGUgPSBSTVRfRElTQUJMRTsKLQljbWQuZGVjX3R5cGUgPSBBVURERUNfREVDX0FBQzsKLQljbGllbnRfaWR4ID0gKChjbWQuY2xpZW50X2lkIDw8IDgpIHwgY21kLnRhc2tfaWQpOwotCi0JcmV0dXJuIHB1dF9hZHNwX3Jlc291cmNlKGNsaWVudF9pZHgsICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBybXRfZ2V0X3Jlc291cmNlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZF9jb2RlY19jb25maWdfY21kIGNtZDsKLQl1bnNpZ25lZCBzaG9ydCBjbGllbnRfaWR4OwotCi0JY21kLmNtZF9pZCA9IFJNX0NNRF9BVURfQ09ERUNfQ0ZHOwotCWNtZC5jbGllbnRfaWQgPSBSTV9BVURfQ0xJRU5UX0lEOwotCWNtZC50YXNrX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuZW5hYmxlID0gUk1UX0VOQUJMRTsKLQljbWQuZGVjX3R5cGUgPSBBVURERUNfREVDX0FBQzsKLQljbGllbnRfaWR4ID0gKChjbWQuY2xpZW50X2lkIDw8IDgpIHwgY21kLnRhc2tfaWQpOwotCi0JcmV0dXJuIGdldF9hZHNwX3Jlc291cmNlKGNsaWVudF9pZHgsICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGlvX2VuYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRtZ3JfY29uZmlnIGNmZzsKLQlpbnQgcmM7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCi0JaWYgKGF1ZGlvLT5lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWlmIChhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID09IDEpIHsKLQkJYXVkaW8tPnJtdF9yZXNvdXJjZV9yZWxlYXNlZCA9IDA7Ci0JCXJjID0gcm10X2dldF9yZXNvdXJjZShhdWRpbyk7Ci0JCWlmIChyYykgewotCQkJTU1fRVJSKCJBRFNQIHJlc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgQUFDIFwKLQkJCQlzZXNzaW9uIDB4JTA4eCBvbiBkZWNvZGVyOiAlZFxuIElnbm9yaW5nIFwKLQkJCQllcnJvciBhbmQgZ29pbmcgYWhlYWQgd2l0aCB0aGUgcGxheWJhY2tcbiIsCi0JCQkJKGludClhdWRpbywgYXVkaW8tPmRlY19pZCk7Ci0JCX0KLQl9Ci0KLQlhdWRpby0+ZGVjX3N0YXRlID0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkU7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0KLQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykgewotCQljZmcudHhfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFX05PTkU7Ci0JCWNmZy5yeF9yYXRlID0gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfNDgwMDA7Ci0JCWNmZy5kZWZfbWV0aG9kID0gUlBDX0FVRF9ERUZfTUVUSE9EX1BMQVlCQUNLOwotCQljZmcuY29kZWMgPSBSUENfQVVEX0RFRl9DT0RFQ19BQUM7Ci0JCWNmZy5zbmRfbWV0aG9kID0gUlBDX1NORF9NRVRIT0RfTUlESTsKLQotCQlyYyA9IGF1ZG1ncl9lbmFibGUoJmF1ZGlvLT5hdWRtZ3IsICZjZmcpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQltc21fYWRzcF9kdW1wKGF1ZGlvLT5hdWRwbGF5KTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCWlmIChtc21fYWRzcF9lbmFibGUoYXVkaW8tPmF1ZHBsYXkpKSB7Ci0JCU1NX0VSUigibXNtX2Fkc3BfZW5hYmxlKGF1ZHBsYXkpIGZhaWxlZFxuIik7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrID09IFRVTk5FTF9NT0RFX1BMQVlCQUNLKQotCQkJYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAoYXVkcHBfZW5hYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvX2RzcF9ldmVudCwgYXVkaW8pKSB7Ci0JCU1NX0VSUigiYXVkcHBfZW5hYmxlKCkgZmFpbGVkXG4iKTsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRpby0+YXVkcGxheSk7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrID09IFRVTk5FTF9NT0RFX1BMQVlCQUNLKQotCQkJYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JYXVkaW8tPmVuYWJsZWQgPSAxOwotCXJldHVybiAwOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkaW9fZGlzYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWludCByYyA9IDA7Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQlhdWRpby0+ZGVjX3N0YXRlID0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkU7Ci0JCWF1ZGRlY19kc3BfY29uZmlnKGF1ZGlvLCAwKTsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdCwKLQkJCQlhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoTVNNX0FVRF9ERUNPREVSX1dBSVRfTVMpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWVsc2UgaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX0NMT1NFKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRpby0+YXVkcGxheSk7Ci0JCWF1ZHBwX2Rpc2FibGUoYXVkaW8tPmRlY19pZCwgYXVkaW8pOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykgewotCQkJcmMgPSBhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCQlpZiAocmMgPCAwKQotCQkJCW1zbV9hZHNwX2R1bXAoYXVkaW8tPmF1ZHBsYXkpOwotCQl9Ci0KLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQlybXRfcHV0X3Jlc291cmNlKGF1ZGlvKTsKLQkJYXVkaW8tPnJtdF9yZXNvdXJjZV9yZWxlYXNlZCA9IDE7Ci0JfQotCXJldHVybiByYzsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkc3AgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgdm9pZCBhdWRpb191cGRhdGVfcGNtX2J1Zl9lbnRyeShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1aW50MzJfdCAqcGF5bG9hZCkKLXsKLQl1aW50OF90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoYXVkaW8tPnJmbHVzaCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBheWxvYWRbMV07IGluZGV4KyspIHsKLQkJaWYgKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyID09Ci0JCSAgICBwYXlsb2FkWzIgKyBpbmRleCAqIDJdKSB7Ci0JCQlNTV9EQkcoImluWyVkXSByZWFkeVxuIiwgYXVkaW8tPmZpbGxfbmV4dCk7Ci0JCQlhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0udXNlZCA9Ci0JCQkJcGF5bG9hZFszICsgaW5kZXggKiAyXTsKLQkJCWlmICgoKythdWRpby0+ZmlsbF9uZXh0KSA9PSBhdWRpby0+cGNtX2J1Zl9jb3VudCkKLQkJCQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLQotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJleHBlY3RlZD0leCByZXQ9JXhcbiIsCi0JCQkJYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHIsCi0JCQkJcGF5bG9hZFsxICsgaW5kZXggKiAyXSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnVzZWQgPT0gMCkgewotCQlhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQl9IGVsc2UgewotCQlNTV9EQkcoInJlYWQgY2Fubm90IGtlZXAgdXBcbiIpOwotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAxOwotCX0KLQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQotfQotc3RhdGljIHZvaWQgYXVkYWFjX3VwZGF0ZV9zdHJlYW1faW5mbyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1aW50MzJfdCAqcGF5bG9hZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIGVfcGF5bG9hZDsKLQotCS8qIGdldCBzdHJlYW0gaW5mbyBmcm9tIERTUCBtc2cgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0KLQlhdWRpby0+c3RyZWFtX2luZm8uY29kZWNfdHlwZSA9IEFVRElPX0NPREVDX1RZUEVfQUFDOwotCWF1ZGlvLT5zdHJlYW1faW5mby5jaGFuX2luZm8gPSAoMHgwMDAwRkZGRiAmIHBheWxvYWRbMV0pOwotCWF1ZGlvLT5zdHJlYW1faW5mby5zYW1wbGVfcmF0ZSA9ICgweDAwMDBGRkZGICYgcGF5bG9hZFsyXSk7Ci0JYXVkaW8tPnN0cmVhbV9pbmZvLmJpdF9zdHJlYW1faW5mbyA9ICgweDAwMDBGRkZGICYgcGF5bG9hZFszXSk7Ci0JYXVkaW8tPnN0cmVhbV9pbmZvLmJpdF9yYXRlID0gcGF5bG9hZFs0XTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCU1NX0RCRygiY2hhbl9pbmZvPSVkLCBzYW1wbGVfcmF0ZT0lZCwgYml0X3N0cmVhbV9pbmZvPSVkXG4iLAotCQkJYXVkaW8tPnN0cmVhbV9pbmZvLmNoYW5faW5mbywKLQkJCWF1ZGlvLT5zdHJlYW1faW5mby5zYW1wbGVfcmF0ZSwKLQkJCWF1ZGlvLT5zdHJlYW1faW5mby5iaXRfc3RyZWFtX2luZm8pOwotCi0JLyogc2VuZCBldmVudCB0byBBUk0gdG8gbm90aWZ5IHN0ZWFtIGluZm8gY29taW5nICovCi0JZV9wYXlsb2FkLnN0cmVhbV9pbmZvID0gYXVkaW8tPnN0cmVhbV9pbmZvOwotCWF1ZGFhY19wb3N0X2V2ZW50KGF1ZGlvLCBBVURJT19FVkVOVF9TVFJFQU1fSU5GTywgZV9wYXlsb2FkKTsKLX0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfZHNwX2V2ZW50KHZvaWQgKmRhdGEsIHVuc2lnbmVkIGlkLCBzaXplX3QgbGVuLAotCQkJICAgICAgdm9pZCAoKmdldGV2ZW50KSAodm9pZCAqcHRyLCBzaXplX3QgbGVuKSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZGF0YTsKLQl1aW50MzJfdCBtc2dbMjhdOwotCWdldGV2ZW50KG1zZywgc2l6ZW9mKG1zZykpOwotCi0JTU1fREJHKCJtc2dfaWQ9JXhcbiIsIGlkKTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBMQVlfTVNHX0RFQ19ORUVEU19EQVRBOgotCQlhdWRwbGF5X3NlbmRfZGF0YShhdWRpbywgMSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURQTEFZX01TR19CVUZGRVJfVVBEQVRFOgotCQlhdWRpb191cGRhdGVfcGNtX2J1Zl9lbnRyeShhdWRpbywgbXNnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBMQVlfVVBfU1RSRUFNX0lORk86Ci0JCWF1ZGFhY191cGRhdGVfc3RyZWFtX2luZm8oYXVkaW8sIG1zZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBRFNQX01FU1NBR0VfSUQ6Ci0JCU1NX0RCRygiUmVjZWl2ZWQgQURTUCBldmVudDogbW9kdWxlIGVuYWJsZShhdWRwbGF5dGFzaylcbiIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigidW5leHBlY3RlZCBtZXNzYWdlIGZyb20gZGVjb2RlciBcbiIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fZHNwX2V2ZW50KHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGlkLCB1aW50MTZfdCAqbXNnKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBwcml2YXRlOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUFBfTVNHX1NUQVRVU19NU0c6ewotCQkJdW5zaWduZWQgc3RhdHVzID0gbXNnWzFdOwotCi0JCQlzd2l0Y2ggKHN0YXR1cykgewotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX1NMRUVQOiB7Ci0JCQkJdWludDE2X3QgcmVhc29uID0gbXNnWzJdOwotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IHNsZWVwIHJlYXNvbiA9IFwKLQkJCQkJCTB4JTA0eFxuIiwgcmVhc29uKTsKLQkJCQlpZiAoKHJlYXNvbiA9PSBBVURQUF9NU0dfUkVBU09OX01FTSkKLQkJCQkJfHwgKHJlYXNvbiA9PQotCQkJCQlBVURQUF9NU0dfUkVBU09OX05PREVDT0RFUikpIHsKLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfRkFJTFVSRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0gZWxzZSBpZiAocmVhc29uID09IEFVRFBQX01TR19SRUFTT05fTk9ORSkgewotCQkJCQkvKiBkZWNvZGVyIGlzIGluIGRpc2FibGUgc3RhdGUgKi8KLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfQ0xPU0U7Ci0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfSU5JVDoKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBpbml0IFxuIik7Ci0JCQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCQkJCWF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKGF1ZGlvKTsKLQkJCQllbHNlCi0JCQkJCWF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoYXVkaW8pOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfQ0ZHOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IGNmZyBcbiIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX1BMQVk6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogcGxheSBcbiIpOwotCQkJCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCQkJCWF1ZHBsYXlfY29uZmlnX2hvc3RwY20oYXVkaW8pOwotCQkJCQlhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQkJCQl9Ci0JCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9TVUNDRVNTOwotCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJTU1fRVJSKCJ1bmtub3duIGRlY29kZXIgc3RhdHVzIFxuIik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVEUFBfTVNHX0NGR19NU0c6Ci0JCWlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9FTkEpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBFTkFCTEVcbiIpOwotCQkJYXVkZGVjX2RzcF9jb25maWcoYXVkaW8sIDEpOwotCQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAxOwotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3Bhbik7Ci0JCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvLT5lcV9lbmFibGUsCi0JCQkJCQkJCSZhdWRpby0+ZXEpOwotCQkJYXVkcHBfYXZzeW5jKGF1ZGlvLT5kZWNfaWQsIDIyMDUwKTsKLQkJfSBlbHNlIGlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9ESVMpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBESVNBQkxFXG4iKTsKLQkJCWF1ZHBwX2F2c3luYyhhdWRpby0+ZGVjX2lkLCAwKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyAlZD9cbiIsCW1zZ1swXSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfUk9VVElOR19BQ0s6Ci0JCU1NX0RCRygiUk9VVElOR19BQ0sgbW9kZT0lZFxuIiwJbXNnWzFdKTsKLQkJYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhhdWRpbyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURQUF9NU0dfRkxVU0hfQUNLOgotCQlNTV9EQkcoIkZMVVNIX0FDS1xuIik7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJCWF1ZHBsYXlfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCQlicmVhazsKLQotCWNhc2UgQVVEUFBfTVNHX1BDTURNQU1JU1NFRDoKLQkJTU1fREJHKCJQQ01ETUFNSVNTRURcbiIpOwotCQlhdWRpby0+dGVvcyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlNTV9FUlIoIlVOS05PV04gKCVkKVxuIiwgaWQpOwotCX0KLQotfQotCi1zdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHBsYXlfYWRzcF9vcHNfYWFjID0gewotCS5ldmVudCA9IGF1ZHBsYXlfZHNwX2V2ZW50LAotfTsKLQotI2RlZmluZSBhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCBjbWQsIGxlbikgXAotCW1zbV9hZHNwX3dyaXRlKGF1ZGlvLT5hdWRwbGF5LCBhdWRpby0+cXVldWVfaWQsXAotCQkJY21kLCBsZW4pCi0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQl1MTYgY2ZnX2RlY19jbWRbQVVEUFBfQ01EX0NGR19ERUNfVFlQRV9MRU4gLyBzaXplb2YodW5zaWduZWQgc2hvcnQpXTsKLQotCW1lbXNldChjZmdfZGVjX2NtZCwgMCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci0JY2ZnX2RlY19jbWRbMF0gPSBBVURQUF9DTURfQ0ZHX0RFQ19UWVBFOwotCi0JaWYgKGVuYWJsZSkKLQkJY2ZnX2RlY19jbWRbMSArIGF1ZGlvLT5kZWNfaWRdID0gQVVEUFBfQ01EX1VQREFUREVfQ0ZHX0RFQyB8Ci0JCQlBVURQUF9DTURfRU5BX0RFQ19WIHwgQVVEREVDX0RFQ19BQUM7Ci0JZWxzZQotCQljZmdfZGVjX2NtZFsxICsgYXVkaW8tPmRlY19pZF0gPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJQVVEUFBfQ01EX0RJU19ERUNfVjsKLQotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMSgmY2ZnX2RlY19jbWQsIHNpemVvZihjZmdfZGVjX2NtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19hYWMgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY29tbW9uLmNtZF9pZCA9IEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVM7Ci0JY21kLmNvbW1vbi5sZW5ndGggPSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TX0FBQ19MRU47Ci0JY21kLmNvbW1vbi5kZWNfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5jb21tb24uaW5wdXRfc2FtcGxpbmdfZnJlcXVlbmN5ID0gYXVkaW8tPm91dF9zYW1wbGVfcmF0ZTsKLQljbWQuZm9ybWF0ID0gYXVkaW8tPmFhY19jb25maWcuZm9ybWF0OwotCWNtZC5hdWRpb19vYmplY3QgPSBhdWRpby0+YWFjX2NvbmZpZy5hdWRpb19vYmplY3Q7Ci0JY21kLmVwX2NvbmZpZyA9IGF1ZGlvLT5hYWNfY29uZmlnLmVwX2NvbmZpZzsKLQljbWQuYWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQotCQlhdWRpby0+YWFjX2NvbmZpZy5hYWNfc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKLQljbWQuYWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KLQkJYXVkaW8tPmFhY19jb25maWcuYWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnOwotCWNtZC5hYWNfc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQotCQlhdWRpby0+YWFjX2NvbmZpZy5hYWNfc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JY21kLnNicl9vbl9mbGFnID0gYXVkaW8tPmFhY19jb25maWcuc2JyX29uX2ZsYWc7Ci0JY21kLnNicl9wc19vbl9mbGFnID0gYXVkaW8tPmFhY19jb25maWcuc2JyX3BzX29uX2ZsYWc7Ci0JY21kLmNoYW5uZWxfY29uZmlndXJhdGlvbiA9IGF1ZGlvLT5hYWNfY29uZmlnLmNoYW5uZWxfY29uZmlndXJhdGlvbjsKLQotCWF1ZHBwX3NlbmRfcXVldWUyKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX3JvdXRpbmdfbW9kZSBjbWQ7Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURQUF9DTURfUk9VVElOR19NT0RFOwotCWNtZC5vYmplY3RfbnVtYmVyID0gYXVkaW8tPmRlY19pZDsKLQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJY21kLnJvdXRpbmdfbW9kZSA9IFJPVVRJTkdfTU9ERV9GVFJUOwotCWVsc2UKLQkJY21kLnJvdXRpbmdfbW9kZSA9IFJPVVRJTkdfTU9ERV9SVDsKLQotCWF1ZHBwX3NlbmRfcXVldWUxKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJCQkgICAgICAgdW5zaWduZWQgaWR4LCB1bnNpZ25lZCBsZW4pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2JpdHN0cmVhbV9kYXRhX2F2YWlsX250MiBjbWQ7Ci0KLQljbWQuY21kX2lkID0gQVVEUExBWV9DTURfQklUU1RSRUFNX0RBVEFfQVZBSUxfTlQyOwotCWlmIChhdWRpby0+bWZpZWxkKQotCQljbWQuZGVjb2Rlcl9pZCA9IEFVREFBQ19NRVRBRklFTERfTUFTSyB8Ci0JCQkoYXVkaW8tPm91dFtpZHhdLm1maWVsZF9zeiA+PiAxKTsKLQllbHNlCi0JICAgIGNtZC5kZWNvZGVyX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuYnVmX3B0ciA9IGF1ZGlvLT5vdXRbaWR4XS5hZGRyOwotCWNtZC5idWZfc2l6ZSA9IGxlbiAvIDI7Ci0JY21kLnBhcnRpdGlvbl9udW1iZXIgPSAwOwotCS8qIGNvbXBsZXRlIGFsbCB0aGUgd3JpdGVzIHRvIHRoZSBpbnB1dCBidWZmZXIgKi8KLQl3bWIoKTsKLQlyZXR1cm4gYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2J1ZmZlcl9yZWZyZXNoIHJlZnJlc2hfY21kOwotCi0JcmVmcmVzaF9jbWQuY21kX2lkID0gQVVEUExBWV9DTURfQlVGRkVSX1JFRlJFU0g7Ci0JcmVmcmVzaF9jbWQubnVtX2J1ZmZlcnMgPSAxOwotCXJlZnJlc2hfY21kLmJ1ZjBfYWRkcmVzcyA9IGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyOwotCS8qIEFBQyBmcmFtZSBzaXplICovCi0JcmVmcmVzaF9jbWQuYnVmMF9sZW5ndGggPSBhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uc2l6ZSAtCi0JCShhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uc2l6ZSAlIDEwMjQpCi0JCSsgKGF1ZGlvLT5tZmllbGQgPyAyNCA6IDApOwotCXJlZnJlc2hfY21kLmJ1Zl9yZWFkX2NvdW50ID0gMDsKLQlNTV9EQkcoImJ1ZjBfYWRkcj0leCBidWYwX2xlbj0lZFxuIiwgcmVmcmVzaF9jbWQuYnVmMF9hZGRyZXNzLAotCQkJcmVmcmVzaF9jbWQuYnVmMF9sZW5ndGgpOwotCSh2b2lkKWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZyZWZyZXNoX2NtZCwgc2l6ZW9mKHJlZnJlc2hfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfY29uZmlnX2hvc3RwY20oc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfaHBjbV9idWZfY2ZnIGNmZ19jbWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWNmZ19jbWQuY21kX2lkID0gQVVEUExBWV9DTURfSFBDTV9CVUZfQ0ZHOwotCWNmZ19jbWQubWF4X2J1ZmZlcnMgPSBhdWRpby0+cGNtX2J1Zl9jb3VudDsKLQljZmdfY21kLmJ5dGVfc3dhcCA9IDA7Ci0JY2ZnX2NtZC5ob3N0cGNtX2NvbmZpZyA9ICgweDgwMDApIHwgKDB4NDAwMCk7Ci0JY2ZnX2NtZC5mZWVkYmFja19mcmVxdWVuY3kgPSAxOwotCWNmZ19jbWQucGFydGl0aW9uX251bWJlciA9IDA7Ci0JKHZvaWQpYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJmNmZ19jbWQsIHNpemVvZihjZmdfY21kKSk7Ci0KLX0KLQotc3RhdGljIHZvaWQgYXVkcGxheV9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgbmVlZGVkKQotewotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhdWRpby0+cnVubmluZykKLQkJZ290byBkb25lOwotCi0JaWYgKG5lZWRlZCAmJiAhYXVkaW8tPndmbHVzaCkgewotCQkvKiBXZSB3ZXJlIGNhbGxlZCBmcm9tIHRoZSBjYWxsYmFjayBiZWNhdXNlIHRoZSBEU1AKLQkJICogcmVxdWVzdGVkIG1vcmUgZGF0YS4gIE5vdGUgdGhhdCB0aGUgRFNQIGRvZXMgd2FudAotCQkgKiBtb3JlIGRhdGEsIGFuZCBpZiBhIGJ1ZmZlciB3YXMgaW4tZmxpZ2h0LCBtYXJrIGl0Ci0JCSAqIGFzIGF2YWlsYWJsZSAoc2luY2UgdGhlIERTUCBtdXN0IG5vdyBiZSBkb25lIHdpdGgKLQkJICogaXQpLgotCQkgKi8KLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAxOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCWlmIChmcmFtZS0+dXNlZCA9PSAweGZmZmZmZmZmKSB7Ci0JCQlNTV9EQkcoImZyYW1lICVkIGZyZWVcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDA7Ci0JCQlhdWRpby0+b3V0X3RhaWwgXj0gMTsKLQkJCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJfSBlbHNlIGlmICgoYXVkaW8tPm91dFswXS51c2VkID09IDApICYmCi0JCQkgKGF1ZGlvLT5vdXRbMV0udXNlZCA9PSAwKSAmJgotCQkJIChhdWRpby0+ZW9zX2luX3Byb2dyZXNzKSkgewotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl9Ci0KLQl9Ci0KLQlpZiAoYXVkaW8tPm91dF9uZWVkZWQpIHsKLQkJLyogSWYgdGhlIERTUCBjdXJyZW50bHkgd2FudHMgZGF0YSBhbmQgd2UgaGF2ZSBhCi0JCSAqIGJ1ZmZlciBhdmFpbGFibGUsIHdlIHdpbGwgc2VuZCBpdCBhbmQgcmVzZXQKLQkJICogdGhlIG5lZWRlZCBmbGFnLiAgV2UnbGwgbWFyayB0aGUgYnVmZmVyIGFzIGluLWZsaWdodAotCQkgKiBzbyB0aGF0IGl0IHdvbid0IGJlIHJlY3ljbGVkIHVudGlsIHRoZSBuZXh0IGJ1ZmZlcgotCQkgKiBpcyByZXF1ZXN0ZWQKLQkJICovCi0KLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQpIHsKLQkJCUJVR19PTihmcmFtZS0+dXNlZCA9PSAweGZmZmZmZmZmKTsKLQkJCU1NX0RCRygiZnJhbWUgJWQgYnVzeVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJCWF1ZHBsYXlfZHNwX3NlbmRfZGF0YV9hdmFpbChhdWRpbywgYXVkaW8tPm91dF90YWlsLAotCQkJCQkJICAgIGZyYW1lLT51c2VkKTsKLQkJCWZyYW1lLT51c2VkID0gMHhmZmZmZmZmZjsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJfQotCX0KLSBkb25lOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHZvaWQgYXVkaW9fZmx1c2goc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWF1ZGlvLT5vdXRbMF0udXNlZCA9IDA7Ci0JYXVkaW8tPm91dFsxXS51c2VkID0gMDsKLQlhdWRpby0+b3V0X2hlYWQgPSAwOwotCWF1ZGlvLT5vdXRfdGFpbCA9IDA7Ci0JYXVkaW8tPnJlc2VydmVkID0gMDsKLQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9ieXRlcywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2ZsdXNoX3BjbV9idWYoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1aW50OF90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUENNX0JVRl9NQVhfQ09VTlQ7IGluZGV4KyspCi0JCWF1ZGlvLT5pbltpbmRleF0udXNlZCA9IDA7Ci0JYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBhdWRhYWNfdmFsaWRhdGVfdXNyX2NvbmZpZyhzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgKmNvbmZpZykKLXsKLQlpbnQgcmV0X3ZhbCA9IC0xOwotCi0JaWYgKGNvbmZpZy0+Zm9ybWF0ICE9IEFVRElPX0FBQ19GT1JNQVRfQURUUyAmJgotCQljb25maWctPmZvcm1hdCAhPSBBVURJT19BQUNfRk9STUFUX1JBVyAmJgotCQljb25maWctPmZvcm1hdCAhPSBBVURJT19BQUNfRk9STUFUX1BTVUVET19SQVcgJiYKLQkJY29uZmlnLT5mb3JtYXQgIT0gQVVESU9fQUFDX0ZPUk1BVF9MT0FTKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAoY29uZmlnLT5hdWRpb19vYmplY3QgIT0gQVVESU9fQUFDX09CSkVDVF9MQyAmJgotCQljb25maWctPmF1ZGlvX29iamVjdCAhPSBBVURJT19BQUNfT0JKRUNUX0xUUCAmJgotCQljb25maWctPmF1ZGlvX29iamVjdCAhPSBBVURJT19BQUNfT0JKRUNUX0JTQUMgJiYKLQkJY29uZmlnLT5hdWRpb19vYmplY3QgIT0gQVVESU9fQUFDX09CSkVDVF9FUkxDKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAoY29uZmlnLT5hdWRpb19vYmplY3QgPT0gQVVESU9fQUFDX09CSkVDVF9FUkxDKSB7Ci0JCWlmIChjb25maWctPmVwX2NvbmZpZyA+IDMpCi0JCQlnb3RvIGRvbmU7Ci0JCWlmIChjb25maWctPmFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZyAhPQotCQkJQVVESU9fQUFDX1NDQV9EQVRBX1JFU19PRkYgJiYKLQkJCWNvbmZpZy0+YWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnICE9Ci0JCQlBVURJT19BQUNfU0NBX0RBVEFfUkVTX09OKQotCQkJZ290byBkb25lOwotCQlpZiAoY29uZmlnLT5hYWNfc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2VfZmxhZyAhPQotCQkJQVVESU9fQUFDX1NFQ19EQVRBX1JFU19PRkYgJiYKLQkJCWNvbmZpZy0+YWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWcgIT0KLQkJCUFVRElPX0FBQ19TRUNfREFUQV9SRVNfT04pCi0JCQlnb3RvIGRvbmU7Ci0JCWlmIChjb25maWctPmFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZyAhPQotCQkJQVVESU9fQUFDX1NQRUNfREFUQV9SRVNfT0ZGICYmCi0JCQljb25maWctPmFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZyAhPQotCQkJQVVESU9fQUFDX1NQRUNfREFUQV9SRVNfT04pCi0JCQlnb3RvIGRvbmU7Ci0JfSBlbHNlIHsKLQkJY29uZmlnLT5hYWNfc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9Ci0JCQlBVURJT19BQUNfU0VDX0RBVEFfUkVTX09GRjsKLQkJY29uZmlnLT5hYWNfc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQotCQkJQVVESU9fQUFDX1NDQV9EQVRBX1JFU19PRkY7Ci0JCWNvbmZpZy0+YWFjX3NwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KLQkJCUFVRElPX0FBQ19TUEVDX0RBVEFfUkVTX09GRjsKLQl9Ci0KLSNpZm5kZWYgQ09ORklHX0FVRElPX0FBQ19QTFVTCi0JaWYgKEFVRElPX0FBQ19TQlJfT05fRkxBR19PRkYgIT0gY29uZmlnLT5zYnJfb25fZmxhZykKLQkJZ290byBkb25lOwotI2Vsc2UKLQlpZiAoY29uZmlnLT5zYnJfb25fZmxhZyAhPSBBVURJT19BQUNfU0JSX09OX0ZMQUdfT0ZGICYmCi0JCWNvbmZpZy0+c2JyX29uX2ZsYWcgIT0gQVVESU9fQUFDX1NCUl9PTl9GTEFHX09OKQotCQlnb3RvIGRvbmU7Ci0jZW5kaWYKLQotI2lmbmRlZiBDT05GSUdfQVVESU9fRU5IQU5DRURfQUFDX1BMVVMKLQlpZiAoQVVESU9fQUFDX1NCUl9QU19PTl9GTEFHX09GRiAhPSBjb25maWctPnNicl9wc19vbl9mbGFnKQotCQlnb3RvIGRvbmU7Ci0jZWxzZQotCWlmIChjb25maWctPnNicl9wc19vbl9mbGFnICE9IEFVRElPX0FBQ19TQlJfUFNfT05fRkxBR19PRkYgJiYKLQkJY29uZmlnLT5zYnJfcHNfb25fZmxhZyAhPSBBVURJT19BQUNfU0JSX1BTX09OX0ZMQUdfT04pCi0JCWdvdG8gZG9uZTsKLSNlbmRpZgotCi0JaWYgKGNvbmZpZy0+ZHVhbF9tb25vX21vZGUgPiBBVURJT19BQUNfRFVBTF9NT05PX1BMX1NSKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAoY29uZmlnLT5jaGFubmVsX2NvbmZpZ3VyYXRpb24gPiAyKQotCQlnb3RvIGRvbmU7Ci0KLQlyZXRfdmFsID0gMDsKLSBkb25lOgotCXJldHVybiByZXRfdmFsOwotfQotCi1zdGF0aWMgdm9pZCBhdWRpb19pb3BvcnRfcmVzZXQoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQkvKiBNYWtlIHN1cmUgcmVhZC93cml0ZSB0aHJlYWQgYXJlIGZyZWUgZnJvbQotCSAqIHNsZWVwIGFuZCBrbm93aW5nIHRoYXQgc3lzdGVtIGlzIG5vdCBhYmxlCi0JICogdG8gcHJvY2VzcyBpbyByZXF1ZXN0IGF0IHRoZSBtb21lbnQKLQkgKi8KLQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCWF1ZGlvX2ZsdXNoKGF1ZGlvKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlhdWRpb19mbHVzaF9wY21fYnVmKGF1ZGlvKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotfQotCi1zdGF0aWMgaW50IGF1ZGFhY19ldmVudHNfcGVuZGluZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGVtcHR5OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JZW1wdHkgPSAhbGlzdF9lbXB0eSgmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCXJldHVybiBlbXB0eSB8fCBhdWRpby0+ZXZlbnRfYWJvcnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFhY19yZXNldF9ldmVudF9xdWV1ZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGF1ZGFhY19ldmVudCAqZHJ2X2V2dDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmV2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWRhYWNfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWRhYWNfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgbG9uZyBhdWRhYWNfcHJvY2Vzc19ldmVudF9yZXEoc3RydWN0IGF1ZGlvICphdWRpbywgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlsb25nIHJjOwotCXN0cnVjdCBtc21fYXVkaW9fZXZlbnQgdXNyX2V2dDsKLQlzdHJ1Y3QgYXVkYWFjX2V2ZW50ICpkcnZfZXZ0ID0gTlVMTDsKLQlpbnQgdGltZW91dDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ1c3JfZXZ0LCBhcmcsIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JdGltZW91dCA9IChpbnQpIHVzcl9ldnQudGltZW91dF9tczsKLQotCWlmICh0aW1lb3V0ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAotCQkJYXVkaW8tPmV2ZW50X3dhaXQsIGF1ZGFhY19ldmVudHNfcGVuZGluZyhhdWRpbyksCi0JCQltc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9IGVsc2UgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCWF1ZGlvLT5ldmVudF93YWl0LCBhdWRhYWNfZXZlbnRzX3BlbmRpbmcoYXVkaW8pKTsKLQl9Ci0KLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoYXVkaW8tPmV2ZW50X2Fib3J0KSB7Ci0JCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDA7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJjID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmV2ZW50X3F1ZXVlKSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmV2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWRhYWNfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JfQotCWlmIChkcnZfZXZ0KSB7Ci0JCXVzcl9ldnQuZXZlbnRfdHlwZSA9IGRydl9ldnQtPmV2ZW50X3R5cGU7Ci0JCXVzcl9ldnQuZXZlbnRfcGF5bG9hZCA9IGRydl9ldnQtPnBheWxvYWQ7Ci0JCWxpc3RfYWRkX3RhaWwoJmRydl9ldnQtPmxpc3QsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JfSBlbHNlCi0JCXJjID0gLTE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghcmMgJiYgY29weV90b191c2VyKGFyZywgJnVzcl9ldnQsIHNpemVvZih1c3JfZXZ0KSkpCi0JCXJjID0gLUVGQVVMVDsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19lbmFibGVfZXEoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlpZiAoYXVkaW8tPmVxX2VuYWJsZSA9PSBlbmFibGUgJiYgIWF1ZGlvLT5lcV9uZWVkc19jb21taXQpCi0JCXJldHVybiAwOwotCi0JYXVkaW8tPmVxX2VuYWJsZSA9IGVuYWJsZTsKLQotCWlmIChhdWRpby0+cnVubmluZykgewotCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsIGVuYWJsZSwgJmF1ZGlvLT5lcSk7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgYXVkaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQl1aW50MTZfdCBlbmFibGVfbWFzazsKLQlpbnQgZW5hYmxlOwotCWludCBwcmV2X3N0YXRlOwotCi0JTU1fREJHKCJjbWQgPSAlZFxuIiwgY21kKTsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX1NUQVRTKSB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCXN0YXRzLmJ5dGVfY291bnQgPSBhdWRwcF9hdnN5bmNfYnl0ZV9jb3VudChhdWRpby0+ZGVjX2lkKTsKLQkJc3RhdHMuc2FtcGxlX2NvdW50ID0gYXVkcHBfYXZzeW5jX3NhbXBsZV9jb3VudChhdWRpby0+ZGVjX2lkKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fRU5BQkxFX0FVRFBQOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmVuYWJsZV9tYXNrLCAodm9pZCAqKSBhcmcsCi0JCQkJCQlzaXplb2YoZW5hYmxlX21hc2spKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWVuYWJsZSA9IChlbmFibGVfbWFzayAmIEVRX0VOQUJMRSkgPyAxIDogMDsKLQkJYXVkaW9fZW5hYmxlX2VxKGF1ZGlvLCBlbmFibGUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9WT0xVTUU6Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gYXJnOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX1NFVF9QQU46Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPnZvbF9wYW4ucGFuID0gYXJnOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX1NFVF9FUToKLQkJcHJldl9zdGF0ZSA9IGF1ZGlvLT5lcV9lbmFibGU7Ci0JCWF1ZGlvLT5lcV9lbmFibGUgPSAwOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmF1ZGlvLT5lcS5udW1fYmFuZHMsICh2b2lkICopIGFyZywKLQkJCQlzaXplb2YoYXVkaW8tPmVxKSAtCi0JCQkJKEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNU19DT01NT05fTEVOICsgMikpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlhdWRpby0+ZXFfZW5hYmxlID0gcHJldl9zdGF0ZTsKLQkJYXVkaW8tPmVxX25lZWRzX2NvbW1pdCA9IDE7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKC1FSU5WQUwgIT0gcmMpCi0JCXJldHVybiByYzsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX0VWRU5UKSB7Ci0JCU1NX0RCRygiQVVESU9fR0VUX0VWRU5UXG4iKTsKLQkJaWYgKG11dGV4X3RyeWxvY2soJmF1ZGlvLT5nZXRfZXZlbnRfbG9jaykpIHsKLQkJCXJjID0gYXVkYWFjX3Byb2Nlc3NfZXZlbnRfcmVxKGF1ZGlvLAotCQkJCQkodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQkJfSBlbHNlCi0JCQlyYyA9IC1FQlVTWTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmIChjbWQgPT0gQVVESU9fQUJPUlRfR0VUX0VWRU5UKSB7Ci0JCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDoKLQkJTU1fREJHKCJBVURJT19TVEFSVFxuIik7Ci0JCXJjID0gYXVkaW9fZW5hYmxlKGF1ZGlvKTsKLQkJaWYgKCFyYykgewotCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdCwKLQkJCQlhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoTVNNX0FVRF9ERUNPREVSX1dBSVRfTVMpKTsKLQkJCU1NX0lORk8oImRlY19zdGF0ZSAlZCByYyA9ICVkXG4iLCBhdWRpby0+ZGVjX3N0YXRlLCByYyk7Ci0KLQkJCWlmIChhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9TVUNDRVNTKQotCQkJCXJjID0gLUVOT0RFVjsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TVE9QOgotCQlNTV9EQkcoIkFVRElPX1NUT1BcbiIpOwotCQlyYyA9IGF1ZGlvX2Rpc2FibGUoYXVkaW8pOwotCQlhdWRpb19pb3BvcnRfcmVzZXQoYXVkaW8pOwotCQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fRkxVU0g6Ci0JCU1NX0RCRygiQVVESU9fRkxVU0ggcnVubmluZz0lZFxuIiwgYXVkaW8tPnJ1bm5pbmcpOwotCQlhdWRpby0+cmZsdXNoID0gMTsKLQkJYXVkaW8tPndmbHVzaCA9IDE7Ci0JCWF1ZGlvX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWlmIChhdWRpby0+cnVubmluZykgewotCQkJYXVkcHBfZmx1c2goYXVkaW8tPmRlY19pZCk7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkhYXVkaW8tPndmbHVzaCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJTU1fRVJSKCJBVURJT19GTFVTSCBpbnRlcnJ1cHRlZFxuIik7Ci0JCQkJcmMgPSAtRUlOVFI7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQotCQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkgICAgKCZjb25maWcsICh2b2lkICopYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChjb25maWcuY2hhbm5lbF9jb3VudCA9PSAxKSB7Ci0JCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPQotCQkJCSAgICBBVURQUF9DTURfUENNX0lOVEZfTU9OT19WOwotCQkJfSBlbHNlIGlmIChjb25maWcuY2hhbm5lbF9jb3VudCA9PSAyKSB7Ci0JCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPQotCQkJCSAgICBBVURQUF9DTURfUENNX0lOVEZfU1RFUkVPX1Y7Ci0JCQl9IGVsc2UgewotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLQkJCWF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID0gY29uZmlnLmNoYW5uZWxfY291bnQ7Ci0JCQlhdWRpby0+bWZpZWxkID0gY29uZmlnLm1ldGFfZmllbGQ7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fR0VUX0NPTkZJRzp7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjb25maWc7Ci0JCQljb25maWcuYnVmZmVyX3NpemUgPSAoYXVkaW8tPm91dF9kbWFfc3ogPj4gMSk7Ci0JCQljb25maWcuYnVmZmVyX2NvdW50ID0gMjsKLQkJCWNvbmZpZy5zYW1wbGVfcmF0ZSA9IGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGU7Ci0JCQlpZiAoYXVkaW8tPm91dF9jaGFubmVsX21vZGUgPT0KLQkJCSAgICBBVURQUF9DTURfUENNX0lOVEZfTU9OT19WKSB7Ci0JCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQljb25maWcuY2hhbm5lbF9jb3VudCA9IDI7Ci0JCQl9Ci0JCQljb25maWcubWV0YV9maWVsZCA9IDA7Ci0JCQljb25maWcudW51c2VkWzBdID0gMDsKLQkJCWNvbmZpZy51bnVzZWRbMV0gPSAwOwotCQkJY29uZmlnLnVudXNlZFsyXSA9IDA7Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY29uZmlnLAotCQkJCQkgc2l6ZW9mKGNvbmZpZykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0KLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19HRVRfQUFDX0NPTkZJRzp7Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYXVkaW8tPmFhY19jb25maWcsCi0JCQkJc2l6ZW9mKGF1ZGlvLT5hYWNfY29uZmlnKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19TRVRfQUFDX0NPTkZJRzp7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgdXNyX2NvbmZpZzsKLQotCQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkJKCZ1c3JfY29uZmlnLCAodm9pZCAqKWFyZywKLQkJCQkJc2l6ZW9mKHVzcl9jb25maWcpKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGF1ZGFhY192YWxpZGF0ZV91c3JfY29uZmlnKCZ1c3JfY29uZmlnKSA9PSAwKSB7Ci0JCQkJYXVkaW8tPmFhY19jb25maWcgPSB1c3JfY29uZmlnOwotCQkJCXJjID0gMDsKLQkJCX0gZWxzZQotCQkJCXJjID0gLUVJTlZBTDsKLQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX0dFVF9QQ01fQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fcGNtX2NvbmZpZyBjb25maWc7Ci0JCQljb25maWcucGNtX2ZlZWRiYWNrID0gYXVkaW8tPnBjbV9mZWVkYmFjazsKLQkJCWNvbmZpZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX01BWF9DT1VOVDsKLQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY29uZmlnLAotCQkJCQkgc2l6ZW9mKGNvbmZpZykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fU0VUX1BDTV9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19wY21fY29uZmlnIGNvbmZpZzsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcgotCQkJICAgICgmY29uZmlnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGNvbmZpZy5wY21fZmVlZGJhY2sgIT0gYXVkaW8tPnBjbV9mZWVkYmFjaykgewotCQkJCU1NX0VSUigiTm90IHN1ZmZpY2llbnQgcGVybWlzc2lvbiB0byIKLQkJCQkJICJjaGFuZ2UgdGhlIHBsYXliYWNrIG1vZGVcbiIpOwotCQkJCXJjID0gLUVBQ0NFUzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICgoY29uZmlnLmJ1ZmZlcl9jb3VudCA+IFBDTV9CVUZfTUFYX0NPVU5UKSB8fAotCQkJICAgIChjb25maWcuYnVmZmVyX2NvdW50ID09IDEpKQotCQkJCWNvbmZpZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX01BWF9DT1VOVDsKLQotCQkJaWYgKGNvbmZpZy5idWZmZXJfc2l6ZSA8IFBDTV9CVUZTWl9NSU4pCi0JCQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKLQotCQkJLyogQ2hlY2sgaWYgcGNtIGZlZWRiYWNrIGlzIHJlcXVpcmVkICovCi0JCQlpZiAoY29uZmlnLnBjbV9mZWVkYmFjaykgewotCQkJCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCQkJCQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQkJCQkJYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0JCQl9Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fUEFVU0U6Ci0JCU1NX0RCRygiQVVESU9fUEFVU0UgJWxkXG4iLCBhcmcpOwotCQlyYyA9IGF1ZHBwX3BhdXNlKGF1ZGlvLT5kZWNfaWQsIChpbnQpIGFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fR0VUX1NUUkVBTV9JTkZPOnsKLQkJaWYgKGF1ZGlvLT5zdHJlYW1faW5mby5zYW1wbGVfcmF0ZSA9PSAwKSB7Ci0JCQkvKiBoYXZlbid0IHJlY2VpdmVkIERTUCBzdHJlYW0gZXZlbnQsCi0JCQl0aGUgc3RyZWFtIGluZm8gaXMgbm90IHVwZGF0ZWQgKi8KLQkJCXJjID0gLUVQRVJNOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmF1ZGlvLT5zdHJlYW1faW5mbywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2JpdHN0cmVhbV9pbmZvKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotLyogT25seSB1c2VmdWwgaW4gdHVubmVsLW1vZGUgKi8KLXN0YXRpYyBpbnQgYXVkYWFjX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgYSwgbG9mZl90IGIsIGludCBkYXRhc3luYykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCi0JaWYgKCFhdWRpby0+cnVubmluZyB8fCBhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lX25vbG9jazsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKCFhdWRpby0+b3V0WzBdLnVzZWQgJiYKLQkJIWF1ZGlvLT5vdXRbMV0udXNlZCAmJgotCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChhdWRpby0+cmVzZXJ2ZWQpIHsKLQkJTU1fREJHKCJzZW5kIHJlc2VydmVkIGJ5dGVcbiIpOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMF0gPSBhdWRpby0+cnN2X2J5dGU7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMV0gPSAwOwotCQlmcmFtZS0+dXNlZCA9IDI7Ci0JCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCSghYXVkaW8tPm91dFswXS51c2VkICYmCi0JCQkhYXVkaW8tPm91dFsxXS51c2VkICYmCi0JCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gZG9uZTsKLQkJZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQkvKiBwY20gZG1hbWlzcyBtZXNzYWdlIGlzIHNlbnQgY29udGlub3VzbHkKLQkgKiB3aGVuIGRlY29kZXIgaXMgc3RhcnZlZCBzbyBubyByYWNlCi0JICogY29uZGl0aW9uIGNvbmNlcm4KLQkgKi8KLQlhdWRpby0+dGVvcyA9IDA7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJYXVkaW8tPnRlb3MgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAoYXVkaW8tPndmbHVzaCkKLQkJcmMgPSAtRUJVU1k7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci1kb25lX25vbG9jazoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCSAgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0JaW50IHJjID0gMDsKLQotCWlmICghYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJcmV0dXJuIDA7IC8qIFBDTSBmZWVkYmFjayBpcyBub3QgZW5hYmxlZC4gTm90aGluZyB0byByZWFkICovCi0KLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlNTV9EQkcoInRvIHJlYWQgJWQgXG4iLCBjb3VudCk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+cmVhZF93YWl0LAotCQkJCQkgICAgICAoYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLgotCQkJCQkJdXNlZCA+IDApIHx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQkJCXx8IChhdWRpby0+cmZsdXNoKSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCi0JCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+cmZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvdW50IDwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQpIHsKLQkJCS8qIFJlYWQgbXVzdCBoYXBwZW4gaW4gZnJhbWUgYm91bmRhcnkuIFNpbmNlIGRyaXZlcgotCQkJICAgZG9lcyBub3Qga25vdyBmcmFtZSBzaXplLCByZWFkIGNvdW50IG11c3QgYmUgZ3JlYXRlcgotCQkJICAgb3IgZXF1YWwgdG8gc2l6ZSBvZiBQQ00gc2FtcGxlcyAqLwotCQkJTU1fREJHKCJubyBwYXJ0aWFsIGZyYW1lIGRvbmUgcmVhZGluZ1xuIik7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygicmVhZCBmcm9tIGluWyVkXVxuIiwgYXVkaW8tPnJlYWRfbmV4dCk7Ci0JCQkvKiBvcmRlciByZWFkcyB0byB0aGUgb3V0cHV0IGJ1ZmZlciAqLwotCQkJcm1iKCk7Ci0JCQlpZiAoY29weV90b191c2VyCi0JCQkgICAgKGJ1ZiwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLmRhdGEsCi0JCQkgICAgIGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkKSkgewotCQkJCU1NX0VSUigiaW52YWxpZCBhZGRyICV4XG4iLCAodW5zaWduZWQgaW50KWJ1Zik7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY291bnQgLT0gYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQ7Ci0JCQlidWYgKz0gYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQ7Ci0JCQlhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCA9IDA7Ci0JCQlpZiAoKCsrYXVkaW8tPnJlYWRfbmV4dCkgPT0gYXVkaW8tPnBjbV9idWZfY291bnQpCi0JCQkJYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JCQlicmVhazsKLQkJCQkvKgotCQkJCSogRm9yY2UgdG8gZXhpdCB3aGlsZSBsb29wCi0JCQkJKiB0byBwcmV2ZW50IG91dHB1dCB0aHJlYWQKLQkJCQkqIHNsZWVwIHRvbyBsb25nIGlmIGRhdGEgaXMgbm90Ci0JCQkJKiByZWFkeSBhdCB0aGlzIG1vbWVudC4KLQkJCQkqLwotCQl9Ci0JfQotCi0JLyogZG9uJ3QgZmVlZCBvdXRwdXQgYnVmZmVyIHRvIEhXIGRlY29kZXIgZHVyaW5nIGZsdXNoaW5nCi0JICogYnVmZmVyIHJlZnJlc2ggY29tbWFuZCB3aWxsIGJlIHNlbnQgb25jZSBmbHVzaCBjb21wbGV0ZXMKLQkgKiBzZW5kIGJ1ZiByZWZyZXNoIGNvbW1hbmQgaGVyZSBjYW4gY29uZnVzZSBIVyBkZWNvZGVyCi0JICovCi0JaWYgKGF1ZGlvLT5idWZfcmVmcmVzaCAmJiAhYXVkaW8tPnJmbHVzaCkgewotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCQlNTV9EQkcoImtpY2sgc3RhcnQgcGNtIGZlZWRiYWNrIGFnYWluXG4iKTsKLQkJYXVkcGxheV9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQotCWlmIChidWYgPiBzdGFydCkKLQkJcmMgPSBidWYgLSBzdGFydDsKLQotCU1NX0RCRygicmVhZCAlZCBieXRlc1xuIiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRhYWNfcHJvY2Vzc19lb3Moc3RydWN0IGF1ZGlvICphdWRpbywKLQljb25zdCBjaGFyIF9fdXNlciAqYnVmX3N0YXJ0LCB1bnNpZ25lZCBzaG9ydCBtZmllbGRfc2l6ZSkKLXsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQljaGFyICpidWZfcHRyOwotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0KLQlNTV9EQkcoInNpZ25hbCBpbnB1dCBFT1MgcmVzZXJ2ZWQ9JWRcbiIsIGF1ZGlvLT5yZXNlcnZlZCk7Ci0JaWYgKGF1ZGlvLT5yZXNlcnZlZCkgewotCQlNTV9EQkcoIlBhc3MgcmVzZXJ2ZSBieXRlXG4iKTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF9oZWFkOwotCQlidWZfcHRyID0gZnJhbWUtPmRhdGE7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCQkoZnJhbWUtPnVzZWQgPT0gMCkKLQkJCQkJfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQkJCQl8fCAoYXVkaW8tPndmbHVzaCkpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQlidWZfcHRyWzBdID0gYXVkaW8tPnJzdl9ieXRlOwotCWJ1Zl9wdHJbMV0gPSAwOwotCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCWZyYW1lLT5tZmllbGRfc3ogPSAwOwotCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JZnJhbWUtPnVzZWQgPSAyOwotCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQl9Ci0JTU1fREJHKCJOb3cgc2lnbmFsIGlucHV0IEVPUyBhZnRlciByZXNlcnZlZCBieXRlcyAlZCAlZCAlZFxuIiwKLQkJYXVkaW8tPm91dFswXS51c2VkLCBhdWRpby0+b3V0WzFdLnVzZWQsIGF1ZGlvLT5vdXRfbmVlZGVkKTsKLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JYXVkaW8tPmVvc19pbl9wcm9ncmVzcyA9IDE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKGF1ZGlvLT5vdXRfbmVlZGVkICYmCi0JCWF1ZGlvLT5vdXRbMF0udXNlZCA9PSAwICYmCi0JCWF1ZGlvLT5vdXRbMV0udXNlZCA9PSAwKQotCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JYXVkaW8tPmVvc19pbl9wcm9ncmVzcyA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoZnJhbWUtPmRhdGEsIGJ1Zl9zdGFydCwgbWZpZWxkX3NpemUpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlmcmFtZS0+dXNlZCA9IG1maWVsZF9zaXplOwotCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotc3RhdGljIHNzaXplX3QgYXVkaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCXNpemVfdCB4ZmVyOwotCWNoYXIgKmNweV9wdHI7Ci0JaW50IHJjID0gMCwgZW9zX2NvbmRpdGlvbiA9IEFVREFBQ19FT1NfTk9ORTsKLQl1bnNpZ25lZCBkc2l6ZTsKLQotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplID0gMDsKLQlNTV9EQkcoImNudD0lZFxuIiwgY291bnQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQkJY3B5X3B0ciA9IGZyYW1lLT5kYXRhOwotCQlkc2l6ZSA9IDA7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCQkgICAgICAoZnJhbWUtPnVzZWQgPT0gMCkKLQkJCQkJCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQkJCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQkJaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGF1ZGlvLT5tZmllbGQpIHsKLQkJCWlmIChidWYgPT0gc3RhcnQpIHsKLQkJCQkvKiBQcm9jZXNzaW5nIGJlZ2lubmluZyBvZiB1c2VyIGJ1ZmZlciAqLwotCQkJCWlmIChfX2dldF91c2VyKG1maWVsZF9zaXplLAotCQkJCQkodW5zaWduZWQgc2hvcnQgX191c2VyICopIGJ1ZikpIHsKLQkJCQkJcmMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgCWlmIChtZmllbGRfc2l6ZSA+IGNvdW50KSB7Ci0JCQkJCXJjID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCU1NX0RCRygibWYgb2Zmc2V0X3ZhbCAleFxuIiwgbWZpZWxkX3NpemUpOwotCQkJCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIG1maWVsZF9zaXplKSkgewotCQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvKiBDaGVjayBpZiBFT1MgZmxhZyBpcyBzZXQgYW5kIGJ1ZmZlciBoYXMKLQkJCQkqIGNvbnRhaW5zIGp1c3QgbWV0YSBmaWVsZAotCQkJCSovCi0JCQkJaWYgKGNweV9wdHJbQVVEQUFDX0VPU19GTEdfT0ZGU0VUXSAmCi0JCQkJCQlBVURBQUNfRU9TX0ZMR19NQVNLKSB7Ci0JCQkJCU1NX0RCRygiZW9zIHNldFxuIik7Ci0JCQkJCWVvc19jb25kaXRpb24gPSBBVURBQUNfRU9TX1NFVDsKLQkJCQkJaWYgKG1maWVsZF9zaXplID09IGNvdW50KSB7Ci0JCQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlCi0JCQkJCWNweV9wdHJbQVVEQUFDX0VPU19GTEdfT0ZGU0VUXSAmPQotCQkJCQkJCX5BVURBQUNfRU9TX0ZMR19NQVNLOwotCQkJCX0KLQkJCQkvKiBDaGVjayBFT1MgdG8gc2VlIGlmICovCi0JCQkJY3B5X3B0ciArPSBtZmllbGRfc2l6ZTsKLQkJCQljb3VudCAtPSBtZmllbGRfc2l6ZTsKLQkJCQlkc2l6ZSArPSBtZmllbGRfc2l6ZTsKLQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQl9IGVsc2UgewotCQkJCW1maWVsZF9zaXplID0gMDsKLQkJCQlNTV9EQkcoImNvbnRpbnVvdXMgYnVmZmVyXG4iKTsKLQkJCX0KLQkJCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQkJfQotCi0JCWlmIChhdWRpby0+cmVzZXJ2ZWQpIHsKLQkJCU1NX0RCRygiYXBwZW5kIHJlc2VydmVkIGJ5dGUgJXhcbiIsCi0JCQkJYXVkaW8tPnJzdl9ieXRlKTsKLQkJCSpjcHlfcHRyID0gYXVkaW8tPnJzdl9ieXRlOwotCQkJeGZlciA9IChjb3VudCA+ICgoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkgLSAxKSkgPwotCQkJCShmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSAtIDEgOiBjb3VudDsKLQkJCWNweV9wdHIrKzsKLQkJCWRzaXplICs9IDE7Ci0JCQlhdWRpby0+cmVzZXJ2ZWQgPSAwOwotCQl9IGVsc2UKLQkJCXhmZXIgPSAoY291bnQgPiAoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkpID8KLQkJCQkoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkgOiBjb3VudDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCB4ZmVyKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlkc2l6ZSArPSB4ZmVyOwotCQlpZiAoZHNpemUgJiAxKSB7Ci0JCQlhdWRpby0+cnN2X2J5dGUgPSAoKGNoYXIgKikgZnJhbWUtPmRhdGEpW2RzaXplIC0gMV07Ci0JCQlNTV9EQkcoIm9kZCBsZW5ndGggYnVmIHJlc2VydmUgbGFzdCBieXRlICV4XG4iLAotCQkJCQlhdWRpby0+cnN2X2J5dGUpOwotCQkJYXVkaW8tPnJlc2VydmVkID0gMTsKLQkJCWRzaXplLS07Ci0JCX0KLQkJY291bnQgLT0geGZlcjsKLQkJYnVmICs9IHhmZXI7Ci0KLQkJaWYgKGRzaXplID4gMCkgewotCQkJYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JCQlmcmFtZS0+dXNlZCA9IGRzaXplOwotCQkJYXVkcGxheV9zZW5kX2RhdGEoYXVkaW8sIDApOwotCQl9Ci0JfQotCU1NX0RCRygiZW9zX2NvbmRpdGlvbiAleCBidWZbMHgleF0gc3RhcnRbMHgleF1cbiIsIGVvc19jb25kaXRpb24sCi0JCQkoaW50KSBidWYsIChpbnQpIHN0YXJ0KTsKLQlpZiAoZW9zX2NvbmRpdGlvbiA9PSBBVURBQUNfRU9TX1NFVCkKLQkJcmMgPSBhdWRhYWNfcHJvY2Vzc19lb3MoYXVkaW8sIHN0YXJ0LCBtZmllbGRfc2l6ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JaWYgKCFyYykgewotCQlpZiAoYnVmID4gc3RhcnQpCi0JCQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlNTV9JTkZPKCJhdWRpbyBpbnN0YW5jZSAweCUwOHggZnJlZWluZ1xuIiwgKGludClhdWRpbyk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGlvX2Rpc2FibGUoYXVkaW8pOwotCWlmIChhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID09IDApCi0JCXJtdF9wdXRfcmVzb3VyY2UoYXVkaW8pOwotCWF1ZGlvX2ZsdXNoKGF1ZGlvKTsKLQlhdWRpb19mbHVzaF9wY21fYnVmKGF1ZGlvKTsKLQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHBsYXkpOwotCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCXVucmVnaXN0ZXJfZWFybHlfc3VzcGVuZCgmYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUpOwotI2VuZGlmCi0JYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0JYXVkYWFjX3Jlc2V0X2V2ZW50X3F1ZXVlKGF1ZGlvKTsKLQlpb25fdW5tYXBfa2VybmVsKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotCWlvbl9jbGllbnRfZGVzdHJveShhdWRpby0+Y2xpZW50KTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlpZiAoYXVkaW8tPmRlbnRyeSkKLQkJZGVidWdmc19yZW1vdmUoYXVkaW8tPmRlbnRyeSk7Ci0jZW5kaWYKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFhY19wb3N0X2V2ZW50KHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCB0eXBlLAotCQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkKQotewotCXN0cnVjdCBhdWRhYWNfZXZlbnQgKmVfbm9kZSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSkpIHsKLQkJZV9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZGFhY19ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZlX25vZGUtPmxpc3QpOwotCX0gZWxzZSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRhYWNfZXZlbnQpLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFlX25vZGUpIHsKLQkJCU1NX0VSUigiTm8gbWVtIHRvIHBvc3QgZXZlbnQgJWRcbiIsIHR5cGUpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWVfbm9kZS0+ZXZlbnRfdHlwZSA9IHR5cGU7Ci0JZV9ub2RlLT5wYXlsb2FkID0gcGF5bG9hZDsKLQotCWxpc3RfYWRkX3RhaWwoJmVfbm9kZS0+bGlzdCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RhdGljIHZvaWQgYXVkYWFjX3N1c3BlbmQoc3RydWN0IGVhcmx5X3N1c3BlbmQgKmgpCi17Ci0Jc3RydWN0IGF1ZGFhY19zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWRhYWNfc3VzcGVuZF9jdGwsIG5vZGUpOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWF1ZGFhY19wb3N0X2V2ZW50KGN0bC0+YXVkaW8sIEFVRElPX0VWRU5UX1NVU1BFTkQsIHBheWxvYWQpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhYWNfcmVzdW1lKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRhYWNfc3VzcGVuZF9jdGwgKmN0bCA9Ci0JCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgYXVkYWFjX3N1c3BlbmRfY3RsLCBub2RlKTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlhdWRhYWNfcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9SRVNVTUUsIHBheWxvYWQpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBzc2l6ZV90IGF1ZGFhY19kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGFhY19kZWJ1Z19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQljb25zdCBpbnQgZGVidWdfYnVmbWF4ID0gMTAyNDsKLQlzdGF0aWMgY2hhciBidWZmZXJbMTAyNF07Ci0JaW50IG4gPSAwLCBpOwotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JbiA9IHNjbnByaW50ZihidWZmZXIsIGRlYnVnX2J1Zm1heCwgIm9wZW5lZCAlZFxuIiwgYXVkaW8tPm9wZW5lZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJlbmFibGVkICVkXG4iLCBhdWRpby0+ZW5hYmxlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJzdG9wcGVkICVkXG4iLCBhdWRpby0+c3RvcHBlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJwY21fZmVlZGJhY2sgJWRcbiIsIGF1ZGlvLT5wY21fZmVlZGJhY2spOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X2J1Zl9zeiAlZFxuIiwgYXVkaW8tPm91dFswXS5zaXplKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInBjbV9idWZfY291bnQgJWQgXG4iLCBhdWRpby0+cGNtX2J1Zl9jb3VudCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJwY21fYnVmX3N6ICVkIFxuIiwgYXVkaW8tPmluWzBdLnNpemUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkidm9sdW1lICV4IFxuIiwgYXVkaW8tPnZvbF9wYW4udm9sdW1lKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInNhbXBsZSByYXRlICVkIFxuIiwgYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJjaGFubmVsIG1vZGUgJWQgXG4iLCBhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JLyogRm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgb25seSB1c2VmdWwgZm9yIGRlYnVnZ2luZyB3aGVuCi0JICogd2hlbiBwbGF5YmFjayBoYWx0cyB1bmV4cGVjdGVkbHkuIFRodXMsIG5vIG11dHVhbCBleGNsdXNpb24KLQkgKiBlbmZvcmNlZAotCSAqLwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkid2ZsdXNoICVkXG4iLCBhdWRpby0+d2ZsdXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInJmbHVzaCAlZFxuIiwgYXVkaW8tPnJmbHVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJydW5uaW5nICVkIFxuIiwgYXVkaW8tPnJ1bm5pbmcpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiZGVjIHN0YXRlICVkIFxuIiwgYXVkaW8tPmRlY19zdGF0ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJvdXRfbmVlZGVkICVkIFxuIiwgYXVkaW8tPm91dF9uZWVkZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X2hlYWQgJWQgXG4iLCBhdWRpby0+b3V0X2hlYWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X3RhaWwgJWQgXG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0WzBdLnVzZWQgJWQgXG4iLCBhdWRpby0+b3V0WzBdLnVzZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0WzFdLnVzZWQgJWQgXG4iLCBhdWRpby0+b3V0WzFdLnVzZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiYnVmZmVyX3JlZnJlc2ggJWQgXG4iLCBhdWRpby0+YnVmX3JlZnJlc2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicmVhZF9uZXh0ICVkIFxuIiwgYXVkaW8tPnJlYWRfbmV4dCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJmaWxsX25leHQgJWQgXG4iLCBhdWRpby0+ZmlsbF9uZXh0KTsKLQlmb3IgKGkgPSAwOyBpIDwgYXVkaW8tPnBjbV9idWZfY291bnQ7IGkrKykKLQkJbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkiaW5bJWRdLnVzZWQgJWQgXG4iLCBpLCBhdWRpby0+aW5baV0udXNlZCk7Ci0JYnVmZmVyW25dID0gMDsKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkYWFjX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWRhYWNfZGVidWdfcmVhZCwKLQkub3BlbiA9IGF1ZGFhY19kZWJ1Z19vcGVuLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IE5VTEw7Ci0JaW50IHJjLCBkZWNfYXR0cmIsIGRlY2lkLCBpbmRleCwgb2Zmc2V0ID0gMDsKLQl1bnNpZ25lZCBtZW1fc3ogPSBETUFTWjsKLQlzdHJ1Y3QgYXVkYWFjX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCWludCBsZW4gPSAwOwotCXVuc2lnbmVkIGxvbmcgaW9uZmxhZyA9IDA7Ci0JaW9uX3BoeXNfYWRkcl90IGFkZHIgPSAwOwotCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUgPSBOVUxMOwotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQgPSBOVUxMOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCi0JY2hhciBuYW1lW3NpemVvZiAibXNtX2FhY18iICsgNV07Ci0jZW5kaWYKLQotCS8qIEFsbG9jYXRlIGF1ZGlvIGluc3RhbmNlLCBzZXQgdG8gemVybyAqLwotCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhdWRpbykgewotCQlNTV9FUlIoIm5vIG1lbW9yeSB0byBhbGxvY2F0ZSBhdWRpbyBpbnN0YW5jZSBcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JTU1fSU5GTygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGNyZWF0ZWRcbiIsIChpbnQpYXVkaW8pOwotCi0JLyogQWxsb2NhdGUgdGhlIGRlY29kZXIgKi8KLQlkZWNfYXR0cmIgPSBBVURERUNfREVDX0FBQzsKLQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWRlY19hdHRyYiB8PSBNU01fQVVEX01PREVfTk9OVFVOTkVMOwotCQlhdWRpby0+cGNtX2ZlZWRiYWNrID0gTk9OX1RVTk5FTF9NT0RFX1BMQVlCQUNLOwotCX0gZWxzZSBpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlkZWNfYXR0cmIgfD0gTVNNX0FVRF9NT0RFX1RVTk5FTDsKLQkJYXVkaW8tPnBjbV9mZWVkYmFjayA9IFRVTk5FTF9NT0RFX1BMQVlCQUNLOwotCX0gZWxzZSB7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmMgPSAtRUFDQ0VTOwotCQlnb3RvIGRvbmU7Ci0JfQotCWRlY2lkID0gYXVkcHBfYWRlY19hbGxvYyhkZWNfYXR0cmIsICZhdWRpby0+bW9kdWxlX25hbWUsCi0JCQkmYXVkaW8tPnF1ZXVlX2lkKTsKLQotCWlmIChkZWNpZCA8IDApIHsKLQkJTU1fRVJSKCJObyBmcmVlIGRlY29kZXIgYXZhaWxhYmxlLCBmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQkoaW50KWF1ZGlvKTsKLQkJcmMgPSAtRU5PREVWOwotCQlrZnJlZShhdWRpbyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYXVkaW8tPmRlY19pZCA9IGRlY2lkICYgTVNNX0FVRF9ERUNPREVSX01BU0s7Ci0KLQljbGllbnQgPSBtc21faW9uX2NsaWVudF9jcmVhdGUoVUlOVF9NQVgsICJBdWRpb19BQUNfY2xpZW50Iik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGNsaWVudCkpIHsKLQkJTU1fRVJSKCJVbmFibGUgdG8gY3JlYXRlIElPTiBjbGllbnRcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gY2xpZW50X2NyZWF0ZV9lcnJvcjsKLQl9Ci0JYXVkaW8tPmNsaWVudCA9IGNsaWVudDsKLQotCU1NX0RCRygiYWxsb2NhdGluZyBtZW0gc3ogPSAlZFxuIiwgbWVtX3N6KTsKLQloYW5kbGUgPSBpb25fYWxsb2MoY2xpZW50LCBtZW1fc3osIFNaXzRLLAotCQlJT05fSEVBUChJT05fQVVESU9fSEVBUF9JRCksIDApOwotCWlmIChJU19FUlJfT1JfTlVMTChoYW5kbGUpKSB7Ci0JCU1NX0VSUigiVW5hYmxlIHRvIGNyZWF0ZSBhbGxvY2F0ZSBPL1AgYnVmZmVyc1xuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRwdXRfYnVmZl9hbGxvY19lcnJvcjsKLQl9Ci0KLQlhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlID0gaGFuZGxlOwotCi0JcmMgPSBpb25fcGh5cyhjbGllbnQsIGhhbmRsZSwgJmFkZHIsICZsZW4pOwotCWlmIChyYykgewotCQlNTV9FUlIoIk8vUCBidWZmZXJzOkludmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCQlnb3RvIG91dHB1dF9idWZmX2dldF9waHlzX2Vycm9yOwotCX0gZWxzZSB7Ci0JCU1NX0lORk8oIk8vUCBidWZmZXJzOnZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJKHVuc2lnbmVkIGludCkgYWRkciwgKHVuc2lnbmVkIGludCkgbGVuKTsKLQl9Ci0JYXVkaW8tPnBoeXMgPSAoaW50MzJfdClhZGRyOwotCi0JcmMgPSBpb25faGFuZGxlX2dldF9mbGFncyhjbGllbnQsIGhhbmRsZSwgJmlvbmZsYWcpOwotCWlmIChyYykgewotCQlNTV9FUlIoImNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIpOwotCQlnb3RvIG91dHB1dF9idWZmX2dldF9mbGFnc19lcnJvcjsKLQl9Ci0KLQlhdWRpby0+bWFwX3Zfd3JpdGUgPSBpb25fbWFwX2tlcm5lbChjbGllbnQsIGhhbmRsZSk7Ci0JaWYgKElTX0VSUihhdWRpby0+bWFwX3Zfd3JpdGUpKSB7Ci0JCU1NX0VSUigiY291bGQgbm90IG1hcCB3cml0ZSBidWZmZXJzLGZyZWVpbmcgaW5zdGFuY2UgMHglMDh4XG4iLAotCQkJCShpbnQpYXVkaW8pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfbWFwX2Vycm9yOwotCX0KLQlhdWRpby0+ZGF0YSA9IGF1ZGlvLT5tYXBfdl93cml0ZTsKLQlNTV9EQkcoIndyaXRlIGJ1ZjogcGh5IGFkZHIgMHglMDh4IGtlcm5lbCBhZGRyIDB4JTA4eFxuIiwKLQkJYXVkaW8tPnBoeXMsIChpbnQpYXVkaW8tPmRhdGEpOwotCi0JYXVkaW8tPm91dF9kbWFfc3ogPSBtZW1fc3o7Ci0KLQltZW1fc3ogPSAoUENNX0JVRlNaX01JTiAqIFBDTV9CVUZfTUFYX0NPVU5UKTsKLQlNTV9EQkcoImFsbG9jYXRpbmcgbWVtIHN6ID0gJWRcbiIsIG1lbV9zeik7Ci0JaGFuZGxlID0gaW9uX2FsbG9jKGNsaWVudCwgbWVtX3N6LAotCQkJU1pfNEssIElPTl9IRUFQKElPTl9BVURJT19IRUFQX0lEKSwgMCk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGhhbmRsZSkpIHsKLQkJTU1fRVJSKCJVbmFibGUgdG8gY3JlYXRlIGFsbG9jYXRlIEkvUCBidWZmZXJzXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGlucHV0X2J1ZmZfYWxsb2NfZXJyb3I7Ci0JfQotCi0JYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlID0gaGFuZGxlOwotCi0JcmMgPSBpb25fcGh5cyhjbGllbnQgLCBoYW5kbGUsICZhZGRyLCAmbGVuKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJJL1AgYnVmZmVyczpJbnZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJKHVuc2lnbmVkIGludCkgYWRkciwgKHVuc2lnbmVkIGludCkgbGVuKTsKLQkJZ290byBpbnB1dF9idWZmX2dldF9waHlzX2Vycm9yOwotCX0gZWxzZSB7Ci0JCU1NX0lORk8oIm91dCBHb3QgdmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhdWRpby0+cmVhZF9waHlzLCAodW5zaWduZWQgaW50KSBsZW4pOwotCX0KLQlhdWRpby0+cmVhZF9waHlzID0gKGludDMyX3QpYWRkcjsKLQotCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MoY2xpZW50LAotCQloYW5kbGUsICZpb25mbGFnKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgZ2V0IGZsYWdzIGZvciB0aGUgaGFuZGxlXG4iKTsKLQkJZ290byBpbnB1dF9idWZmX2dldF9mbGFnc19lcnJvcjsKLQl9Ci0KLQlhdWRpby0+bWFwX3ZfcmVhZCA9IGlvbl9tYXBfa2VybmVsKGNsaWVudCwgaGFuZGxlKTsKLQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl9yZWFkKSkgewotCQlNTV9FUlIoImNvdWxkIG5vdCBtYXAgcmVhZCBidWZmZXJzLCBmcmVlaW5nIGluc3RhbmNlIFwKLQkJCQkweCUwOHhcbiIsIChpbnQpYXVkaW8pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gaW5wdXRfYnVmZl9tYXBfZXJyb3I7Ci0JfQotCWF1ZGlvLT5yZWFkX2RhdGEgPSBhdWRpby0+bWFwX3ZfcmVhZDsKLQlNTV9EQkcoInJlYWQgYnVmOiBwaHkgYWRkciAweCUwOHgga2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQkJCWF1ZGlvLT5yZWFkX3BoeXMsIChpbnQpYXVkaW8tPnJlYWRfZGF0YSk7Ci0KLQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykgewotCQlyYyA9IGF1ZG1ncl9vcGVuKCZhdWRpby0+YXVkbWdyKTsKLQkJaWYgKHJjKSB7Ci0JCQlNTV9FUlIoImF1ZG1nciBvcGVuIGZhaWxlZCwgZnJlZWluZyBpbnN0YW5jZSBcCi0JCQkJCTB4JTA4eFxuIiwgKGludClhdWRpbyk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQotCXJjID0gbXNtX2Fkc3BfZ2V0KGF1ZGlvLT5tb2R1bGVfbmFtZSwgJmF1ZGlvLT5hdWRwbGF5LAotCQkJICAmYXVkcGxheV9hZHNwX29wc19hYWMsIGF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJmYWlsZWQgdG8gZ2V0ICVzIG1vZHVsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJYXVkaW8tPm1vZHVsZV9uYW1lLCAoaW50KWF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spCi0JCQlhdWRtZ3JfY2xvc2UoJmF1ZGlvLT5hdWRtZ3IpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyYyA9IHJtdF9nZXRfcmVzb3VyY2UoYXVkaW8pOwotCWlmIChyYykgewotCQlNTV9FUlIoIkFEU1AgcmVzb3VyY2VzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBBQUMgc2Vzc2lvbiBcCi0JCQkgMHglMDh4IG9uIGRlY29kZXI6ICVkXG4iLCAoaW50KWF1ZGlvLCBhdWRpby0+ZGVjX2lkKTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spCi0JCQlhdWRtZ3JfY2xvc2UoJmF1ZGlvLT5hdWRtZ3IpOwotCQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHBsYXkpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQltdXRleF9pbml0KCZhdWRpby0+bG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPndyaXRlX2xvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT5yZWFkX2xvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT5nZXRfZXZlbnRfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmF1ZGlvLT5kc3BfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+ZXZlbnRfcXVldWUpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+cmVhZF93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCi0JYXVkaW8tPm91dFswXS5kYXRhID0gYXVkaW8tPmRhdGEgKyAwOwotCWF1ZGlvLT5vdXRbMF0uYWRkciA9IGF1ZGlvLT5waHlzICsgMDsKLQlhdWRpby0+b3V0WzBdLnNpemUgPSBhdWRpby0+b3V0X2RtYV9zeiA+PiAxOwotCi0JYXVkaW8tPm91dFsxXS5kYXRhID0gYXVkaW8tPmRhdGEgKyBhdWRpby0+b3V0WzBdLnNpemU7Ci0JYXVkaW8tPm91dFsxXS5hZGRyID0gYXVkaW8tPnBoeXMgKyBhdWRpby0+b3V0WzBdLnNpemU7Ci0JYXVkaW8tPm91dFsxXS5zaXplID0gYXVkaW8tPm91dFswXS5zaXplOwotCi0JYXVkaW8tPnBjbV9idWZfY291bnQgPSBQQ01fQlVGX01BWF9DT1VOVDsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBQQ01fQlVGX01BWF9DT1VOVDsgaW5kZXgrKykgewotCQlhdWRpby0+aW5baW5kZXhdLmRhdGEgPSBhdWRpby0+cmVhZF9kYXRhICsgb2Zmc2V0OwotCQlhdWRpby0+aW5baW5kZXhdLmFkZHIgPSBhdWRpby0+cmVhZF9waHlzICsgb2Zmc2V0OwotCQlhdWRpby0+aW5baW5kZXhdLnNpemUgPSBQQ01fQlVGU1pfTUlOOwotCQlhdWRpby0+aW5baW5kZXhdLnVzZWQgPSAwOwotCQlvZmZzZXQgKz0gUENNX0JVRlNaX01JTjsKLQl9Ci0KLQlhdWRpby0+b3V0X3NhbXBsZV9yYXRlID0gNDQxMDA7Ci0JYXVkaW8tPm91dF9jaGFubmVsX21vZGUgPSBBVURQUF9DTURfUENNX0lOVEZfU1RFUkVPX1Y7Ci0JYXVkaW8tPmFhY19jb25maWcuZm9ybWF0ID0gQVVESU9fQUFDX0ZPUk1BVF9BRFRTOwotCWF1ZGlvLT5hYWNfY29uZmlnLmF1ZGlvX29iamVjdCA9IEFVRElPX0FBQ19PQkpFQ1RfTEM7Ci0JYXVkaW8tPmFhY19jb25maWcuZXBfY29uZmlnID0gMDsKLQlhdWRpby0+YWFjX2NvbmZpZy5hYWNfc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9Ci0JCUFVRElPX0FBQ19TRUNfREFUQV9SRVNfT0ZGOwotCWF1ZGlvLT5hYWNfY29uZmlnLmFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9Ci0JCUFVRElPX0FBQ19TQ0FfREFUQV9SRVNfT0ZGOwotCWF1ZGlvLT5hYWNfY29uZmlnLmFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9Ci0JCUFVRElPX0FBQ19TUEVDX0RBVEFfUkVTX09GRjsKLSNpZmRlZiBDT05GSUdfQVVESU9fQUFDX1BMVVMKLQlhdWRpby0+YWFjX2NvbmZpZy5zYnJfb25fZmxhZyA9IEFVRElPX0FBQ19TQlJfT05fRkxBR19PTjsKLSNlbHNlCi0JYXVkaW8tPmFhY19jb25maWcuc2JyX29uX2ZsYWcgPSBBVURJT19BQUNfU0JSX09OX0ZMQUdfT0ZGOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FVRElPX0VOSEFOQ0VEX0FBQ19QTFVTCi0JYXVkaW8tPmFhY19jb25maWcuc2JyX3BzX29uX2ZsYWcgPSBBVURJT19BQUNfU0JSX1BTX09OX0ZMQUdfT047Ci0jZWxzZQotCWF1ZGlvLT5hYWNfY29uZmlnLnNicl9wc19vbl9mbGFnID0gQVVESU9fQUFDX1NCUl9QU19PTl9GTEFHX09GRjsKLSNlbmRpZgotCWF1ZGlvLT5hYWNfY29uZmlnLmR1YWxfbW9ub19tb2RlID0gQVVESU9fQUFDX0RVQUxfTU9OT19QTF9TUjsKLQlhdWRpby0+YWFjX2NvbmZpZy5jaGFubmVsX2NvbmZpZ3VyYXRpb24gPSAyOwotCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IDB4MjAwMDsKLQotCWF1ZGlvX2ZsdXNoKGF1ZGlvKTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOwotCWF1ZGlvLT5vcGVuZWQgPSAxOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXNucHJpbnRmKG5hbWUsIHNpemVvZiBuYW1lLCAibXNtX2FhY18lMDR4IiwgYXVkaW8tPmRlY19pZCk7Ci0JYXVkaW8tPmRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJTlVMTCwgKHZvaWQgKikgYXVkaW8sCi0JCQkJJmF1ZGFhY19kZWJ1Z19mb3BzKTsKLQotCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCi0JCU1NX0RCRygiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5sZXZlbCA9IEVBUkxZX1NVU1BFTkRfTEVWRUxfRElTQUJMRV9GQjsKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5yZXN1bWUgPSBhdWRhYWNfcmVzdW1lOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLnN1c3BlbmQgPSBhdWRhYWNfc3VzcGVuZDsKLQlhdWRpby0+c3VzcGVuZF9jdGwuYXVkaW8gPSBhdWRpbzsKLQlyZWdpc3Rlcl9lYXJseV9zdXNwZW5kKCZhdWRpby0+c3VzcGVuZF9jdGwubm9kZSk7Ci0jZW5kaWYKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBBVURBQUNfRVZFTlRfTlVNOyBpbmRleCsrKSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRhYWNfZXZlbnQpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGVfbm9kZSkKLQkJCWxpc3RfYWRkX3RhaWwoJmVfbm9kZS0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQkJZWxzZSB7Ci0JCQlNTV9FUlIoImV2ZW50IHBrdCBhbGxvYyBmYWlsZWRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JbWVtc2V0KCZhdWRpby0+c3RyZWFtX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2JpdHN0cmVhbV9pbmZvKSk7Ci1kb25lOgotCXJldHVybiByYzsKLWVycjoKLQlpb25fdW5tYXBfa2VybmVsKGNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLWlucHV0X2J1ZmZfbWFwX2Vycm9yOgotaW5wdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I6Ci1pbnB1dF9idWZmX2dldF9waHlzX2Vycm9yOgotCWlvbl9mcmVlKGNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLWlucHV0X2J1ZmZfYWxsb2NfZXJyb3I6Ci0JaW9uX3VubWFwX2tlcm5lbChjbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotb3V0cHV0X2J1ZmZfbWFwX2Vycm9yOgotb3V0cHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I6Ci1vdXRwdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I6Ci0JaW9uX2ZyZWUoY2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLW91dHB1dF9idWZmX2FsbG9jX2Vycm9yOgotCWlvbl9jbGllbnRfZGVzdHJveShjbGllbnQpOwotY2xpZW50X2NyZWF0ZV9lcnJvcjoKLQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYWFjX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSBhdWRpb19vcGVuLAotCS5yZWxlYXNlID0gYXVkaW9fcmVsZWFzZSwKLQkucmVhZCA9IGF1ZGlvX3JlYWQsCi0JLndyaXRlID0gYXVkaW9fd3JpdGUsCi0JLnVubG9ja2VkX2lvY3RsID0gYXVkaW9faW9jdGwsCi0JLmZzeW5jID0gYXVkYWFjX2ZzeW5jCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19hYWNfbWlzYyA9IHsKLQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUgPSAibXNtX2FhYyIsCi0JLmZvcHMgPSAmYXVkaW9fYWFjX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2FhY19taXNjKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGF1ZGlvX2V4aXQodm9pZCkKLXsKLQltaXNjX2RlcmVnaXN0ZXIoJmF1ZGlvX2FhY19taXNjKTsKLX0KLQotbW9kdWxlX2luaXQoYXVkaW9faW5pdCk7Ci1tb2R1bGVfZXhpdChhdWRpb19leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gQUFDIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fYWFjX2luLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19hYWNfaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmYTRlMy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19hYWNfaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDE1MjYgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fYWFjX2luLmMKLSAqCi0gKiBhYWMgYXVkaW8gaW5wdXQgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29kZSBpcyBiYXNlZCBpbiBwYXJ0IG9uIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fYWFjX2luLmMsCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotCi0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fYWFjLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtb3J5X2FsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgotCi0jaW5jbHVkZSAiYXVkbWdyLmgiCi0KLSNpbmNsdWRlIDxtYWNoL21zbV9ycGNyb3V0ZXIuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9tZW10eXBlcy5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXUuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11X2RvbWFpbnMuaD4KLQotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHJlcHJvYy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcmVwcm9jY21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcmVwcm9jbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHJlY2NtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcmVjbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi0jZGVmaW5lIEZSQU1FX0hFQURFUl9TSVpFCTggLyogOCBieXRlcyBmcmFtZSBoZWFkZXIgKi8KLSNkZWZpbmUgTlRfRlJBTUVfSEVBREVSX1NJWkUJMjQgLyogMjQgYnl0ZXMgZnJhbWUgaGVhZGVyICovCi0vKiBGUkFNRV9OVU0gbXVzdCBiZSBhIHBvd2VyIG9mIHR3byAqLwotI2RlZmluZSBGUkFNRV9OVU0JOAotI2RlZmluZSBBQUNfRlJBTUVfU0laRQkxNTM2IC8qIDM2IGJ5dGVzIGRhdGEgKi8KLS8qVHVubmVsIG1vZGUgOiAxNTM2IGJ5dGVzIGRhdGEgKyA4IGJ5dGUgaGVhZGVyKi8KLSNkZWZpbmUgRlJBTUVfU0laRQkoQUFDX0ZSQU1FX1NJWkUgKyBGUkFNRV9IRUFERVJfU0laRSkKLS8qIDE1MzYgYnl0ZXMgZGF0YSAgKyAyNCBtZXRhIGZpZWxkKi8KLSNkZWZpbmUgTlRfRlJBTUVfU0laRQkoQUFDX0ZSQU1FX1NJWkUgKyBOVF9GUkFNRV9IRUFERVJfU0laRSkKLSNkZWZpbmUgRE1BU1oJCShGUkFNRV9TSVpFICogRlJBTUVfTlVNKQotI2RlZmluZSBOVF9ETUFTWgkoTlRfRlJBTUVfU0laRSAqIEZSQU1FX05VTSkKLSNkZWZpbmUgT1VUX0ZSQU1FX05VTQkyCi0jZGVmaW5lIE9VVF9CVUZGRVJfU0laRSAoMzIgKiAxMDI0ICsgTlRfRlJBTUVfSEVBREVSX1NJWkUpCi0jZGVmaW5lIEJVRkZFUl9TSVpFCShPVVRfQlVGRkVSX1NJWkUgKiBPVVRfRlJBTUVfTlVNKQotCi0jZGVmaW5lIEFVRFBSRVBST0NfQUFDX0VPU19GTEdfT0ZGU0VUIDB4MEEgLyogT2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIGJ1ZmZlciovCi0jZGVmaW5lIEFVRFBSRVBST0NfQUFDX0VPU19GTEdfTUFTSyAweDAxCi0jZGVmaW5lIEFVRFBSRVBST0NfQUFDX0VPU19OT05FIDB4MCAvKiBObyBFT1MgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgQVVEUFJFUFJPQ19BQUNfRU9TX1NFVCAweDEgLyogRU9TIHNldCBpbiBtZXRhIGZpZWxkICovCi0KLXN0cnVjdCBidWZmZXIgewotCXZvaWQgKmRhdGE7Ci0JdWludDMyX3Qgc2l6ZTsKLQl1aW50MzJfdCByZWFkOwotCXVpbnQzMl90IGFkZHI7Ci0JdWludDMyX3QgdXNlZDsKLQl1aW50MzJfdCBtZmllbGRfc3o7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fYWFjX2luIHsKLQlzdHJ1Y3QgYnVmZmVyIGluW0ZSQU1FX05VTV07Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JYXRvbWljX3QgaW5fYnl0ZXM7Ci0JYXRvbWljX3QgaW5fc2FtcGxlczsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtdXRleCByZWFkX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X2VuYWJsZTsKLQkvKndyaXRlIHNlY3Rpb24qLwotCXN0cnVjdCBidWZmZXIgb3V0W09VVF9GUkFNRV9OVU1dOwotCi0JdWludDhfdCBvdXRfaGVhZDsKLQl1aW50OF90IG91dF90YWlsOwotCXVpbnQ4X3Qgb3V0X25lZWRlZDsJLyogbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGRzcCBpcyB3YWl0aW5nIGZvciAqLwotCXVpbnQzMl90IG91dF9jb3VudDsKLQotCXN0cnVjdCBtdXRleCB3cml0ZV9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlX3dhaXQ7Ci0JaW50MzJfdCBvdXRfcGh5czsgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB3cml0ZSBidWZmZXIgKi8KLQljaGFyICpvdXRfZGF0YTsKLQlpbnQgbWZpZWxkOyAvKiBtZXRhIGZpZWxkIGVtYmVkZGVkIGluIGRhdGEgKi8KLQlpbnQgd2ZsdXNoOyAvKndyaXRlIGZsdXNoICovCi0JaW50IHJmbHVzaDsgLypyZWFkIGZsdXNoKi8KLQlpbnQgb3V0X2ZyYW1lX2NudDsKLQotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKmF1ZHJlYzsKLQotCi0JLyogY29uZmlndXJhdGlvbiB0byB1c2Ugb24gbmV4dCBlbmFibGUgKi8KLQl1aW50MzJfdCBzYW1wX3JhdGU7Ci0JdWludDMyX3QgY2hhbm5lbF9tb2RlOwotCXVpbnQzMl90IGJ1ZmZlcl9zaXplOyAvKiBGcmFtZSBzaXplICgxNTM2IGJ5dGVzKSAqLwotCXVpbnQzMl90IGJpdF9yYXRlOyAvKiBiaXQgcmF0ZSBmb3IgQUFDICovCi0JdWludDMyX3QgcmVjb3JkX3F1YWxpdHk7IC8qIHJlY29yZCBxdWFsaXR5IChiaXRzL3NhbXBsZS9jaGFubmVsKSAqLwotCXVpbnQzMl90IGVuY190eXBlOyAvKiAxIGZvciBBQUMgKi8KLQl1aW50MzJfdCBtb2RlOyAvKiBUIG9yIE5UIE1vZGUqLwotCXVpbnQzMl90IGRzcF9jbnQ7Ci0JdWludDMyX3QgaW5faGVhZDsgLyogbmV4dCBidWZmZXIgZHNwIHdpbGwgd3JpdGUgKi8KLQl1aW50MzJfdCBpbl90YWlsOyAvKiBuZXh0IGJ1ZmZlciByZWFkKCkgd2lsbCByZWFkICovCi0JdWludDMyX3QgaW5fY291bnQ7IC8qIG51bWJlciBvZiBidWZmZXJzIGF2YWlsYWJsZSB0byByZWFkKCkgKi8KLQotCXVpbnQzMl90IGVvc19hY2s7Ci0JdWludDMyX3QgZmx1c2hfYWNrOwotCi0JY29uc3QgY2hhciAqbW9kdWxlX25hbWU7Ci0JdW5zaWduZWQgcXVldWVfaWRzOwotCXVpbnQxNl90IGVuY19pZDsgLyogU2Vzc2lvbiBJZCAqLwotCi0JdW5zaWduZWQgc2hvcnQgc2FtcF9yYXRlX2luZGV4OwotCXVpbnQzMl90IGF1ZHJlY19vYmpfaWR4IDsKLQotCXN0cnVjdCBhdWRtZ3IgYXVkbWdyOwotCi0JLyogZGF0YSBhbGxvY2F0ZWQgZm9yIHZhcmlvdXMgYnVmZmVycyAqLwotCWNoYXIgKmRhdGE7Ci0JZG1hX2FkZHJfdCBwaHlzOwotCXZvaWQgKm1hcF92X3JlYWQ7Ci0Jdm9pZCAqbWFwX3Zfd3JpdGU7Ci0KLQlpbnQgb3BlbmVkOwotCWludCBlbmFibGVkOwotCWludCBydW5uaW5nOwotCWludCBzdG9wcGVkOyAvKiBzZXQgd2hlbiBzdG9wcGVkLCBjbGVhcmVkIG9uIGZsdXNoICovCi0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaW5wdXRfYnVmZl9oYW5kbGU7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKm91dHB1dF9idWZmX2hhbmRsZTsKLQotCXN0cnVjdCBhdWRyZWNfc2Vzc2lvbl9pbmZvIHNlc3Npb25faW5mbzsgLyphdWRyZWMgc2Vzc2lvbiBpbmZvKi8KLX07Ci0KLXN0cnVjdCBhdWRpb19mcmFtZSB7Ci0JdWludDE2X3QgZnJhbWVfY291bnRfbHN3OwotCXVpbnQxNl90IGZyYW1lX2NvdW50X21zdzsKLQl1aW50MTZfdCBmcmFtZV9sZW5ndGg7Ci0JdWludDE2X3QgZXJhc2VkX3BjbTsKLQl1bnNpZ25lZCBjaGFyIHJhd19iaXRzdHJlYW1bXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhdWRpb19mcmFtZV9udCB7Ci0JdWludDE2X3QgbWV0YWRhdGFfbGVuOwotCXVpbnQxNl90IGZyYW1lX2NvdW50X2xzdzsKLQl1aW50MTZfdCBmcmFtZV9jb3VudF9tc3c7Ci0JdWludDE2X3QgZnJhbWVfbGVuZ3RoOwotCXVpbnQxNl90IGVyYXNlZF9wY207Ci0JdWludDE2X3QgcmVzZXJ2ZWQ7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9kd29yZF9sc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9kd29yZF9tc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9sc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9tc3c7Ci0JdWludDE2X3QgbmZsYWdfbHN3OwotCXVpbnQxNl90IG5mbGFnX21zdzsKLQl1bnNpZ25lZCBjaGFyIHJhd19iaXRzdHJlYW1bXTsgLyogc2FtcGxlcyAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFhY19lbmNvZGVkX21ldGFfb3V0IHsKLQl1aW50MTZfdCBtZXRhZGF0YV9sZW47Ci0JdWludDE2X3QgdGltZV9zdGFtcF9kd29yZF9sc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9kd29yZF9tc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9sc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9tc3c7Ci0JdWludDE2X3QgbmZsYWdfbHN3OwotCXVpbnQxNl90IG5mbGFnX21zdzsKLX07Ci0KLS8qIEF1ZHJlYyBRdWV1ZSBjb21tYW5kIHNlbnQgbWFjcm8ncyAqLwotI2RlZmluZSBhdWRpb19zZW5kX3F1ZXVlX3ByZShhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcHJlLCBRRFNQX3VQQXVkUHJlUHJvY0NtZFF1ZXVlLCBjbWQsIGxlbikKLQotI2RlZmluZSBhdWRpb19zZW5kX3F1ZXVlX3JlY2JzKGF1ZGlvLCBjbWQsIGxlbikgXAotCW1zbV9hZHNwX3dyaXRlKGF1ZGlvLT5hdWRyZWMsICgoYXVkaW8tPnF1ZXVlX2lkcyAmIDB4RkZGRjAwMDApID4+IDE2KSxcCi0JCQljbWQsIGxlbikKLSNkZWZpbmUgYXVkaW9fc2VuZF9xdWV1ZV9yZWMoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHJlYywgKGF1ZGlvLT5xdWV1ZV9pZHMgJiAweDAwMDBGRkZGKSxcCi0JCQljbWQsIGxlbikKLQotc3RhdGljIGludCBhdWRhYWNfaW5fZHNwX2VuYWJsZShzdHJ1Y3QgYXVkaW9fYWFjX2luICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgaW50IGF1ZGFhY19pbl9lbmNwYXJhbV9jb25maWcoc3RydWN0IGF1ZGlvX2FhY19pbiAqYXVkaW8pOwotc3RhdGljIGludCBhdWRhYWNfaW5fZW5jbWVtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9fYWFjX2luICphdWRpbyk7Ci1zdGF0aWMgaW50IGF1ZGFhY19pbl9kc3BfcmVhZF9idWZmZXIoc3RydWN0IGF1ZGlvX2FhY19pbiAqYXVkaW8sCi0JCQkJdWludDMyX3QgcmVhZF9jbnQpOwotc3RhdGljIHZvaWQgYXVkYWFjX2luX2ZsdXNoKHN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvKTsKLQotc3RhdGljIHZvaWQgYXVkYWFjX2luX2dldF9kc3BfZnJhbWVzKHN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvKTsKLXN0YXRpYyBpbnQgYXVkcGNtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9fYWFjX2luICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRhYWNfb3V0X2ZsdXNoKHN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvKTsKLXN0YXRpYyBpbnQgYXVkYWFjX2luX3JvdXRpbmdfbW9kZV9jb25maWcoc3RydWN0IGF1ZGlvX2FhY19pbiAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcmVjX3BjbV9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvX2FhY19pbiAqYXVkaW8sIHVuc2lnbmVkIG5lZWRlZCk7Ci1zdGF0aWMgdm9pZCBhdWRhYWNfbnRfaW5fZ2V0X2RzcF9mcmFtZXMoc3RydWN0IGF1ZGlvX2FhY19pbiAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkYWFjX2luX2ZsdXNoKHN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvKTsKLQotc3RhdGljIHVuc2lnbmVkIGNvbnZlcnRfZHNwX3NhbXBfaW5kZXgodW5zaWduZWQgaW5kZXgpCi17Ci0Jc3dpdGNoIChpbmRleCkgewotCWNhc2UgNDgwMDA6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzQ4MDAwOwotCWNhc2UgNDQxMDA6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzQ0MTAwOwotCWNhc2UgMzIwMDA6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzMyMDAwOwotCWNhc2UgMjQwMDA6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzI0MDAwOwotCWNhc2UgMjIwNTA6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzIyMDUwOwotCWNhc2UgMTYwMDA6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzE2MDAwOwotCWNhc2UgMTIwMDA6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzEyMDAwOwotCWNhc2UgMTEwMjU6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzExMDI1OwotCWNhc2UgODAwMDoJcmV0dXJuIEFVRFJFQ19DTURfU0FNUF9SQVRFX0lORFhfODAwMDsKLQlkZWZhdWx0OglyZXR1cm4gQVVEUkVDX0NNRF9TQU1QX1JBVEVfSU5EWF8xMTAyNTsKLQl9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjb252ZXJ0X3NhbXBfcmF0ZSh1bnNpZ25lZCBoeikKLXsKLQlzd2l0Y2ggKGh6KSB7Ci0JY2FzZSA0ODAwMDogcmV0dXJuIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzQ4MDAwOwotCWNhc2UgNDQxMDA6IHJldHVybiBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV80NDEwMDsKLQljYXNlIDMyMDAwOiByZXR1cm4gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMzIwMDA7Ci0JY2FzZSAyNDAwMDogcmV0dXJuIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzI0MDAwOwotCWNhc2UgMjIwNTA6IHJldHVybiBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8yMjA1MDsKLQljYXNlIDE2MDAwOiByZXR1cm4gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMTYwMDA7Ci0JY2FzZSAxMjAwMDogcmV0dXJuIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzEyMDAwOwotCWNhc2UgMTEwMjU6IHJldHVybiBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xMTAyNTsKLQljYXNlIDgwMDA6ICByZXR1cm4gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfODAwMDsKLQlkZWZhdWx0OiAgICByZXR1cm4gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMTEwMjU7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgY29udmVydF9zYW1wX2luZGV4KHVuc2lnbmVkIGluZGV4KQotewotCXN3aXRjaCAoaW5kZXgpIHsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzQ4MDAwOglyZXR1cm4gNDgwMDA7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV80NDEwMDoJcmV0dXJuIDQ0MTAwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMzIwMDA6CXJldHVybiAzMjAwMDsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzI0MDAwOglyZXR1cm4gMjQwMDA7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8yMjA1MDoJcmV0dXJuIDIyMDUwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMTYwMDA6CXJldHVybiAxNjAwMDsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzEyMDAwOglyZXR1cm4gMTIwMDA7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xMTAyNToJcmV0dXJuIDExMDI1OwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfODAwMDoJcmV0dXJuIDgwMDA7Ci0JZGVmYXVsdDoJCQkJcmV0dXJuIDExMDI1OwotCX0KLX0KLQotLyogQ29udmVydCBCaXQgUmF0ZSB0byBSZWNvcmQgUXVhbGl0eSBmaWVsZCBvZiBEU1AgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYml0cmF0ZV90b19yZWNvcmRfcXVhbGl0eSh1bnNpZ25lZCBpbnQgc2FtcGxlX3JhdGUsCi0JCXVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgYml0X3JhdGUpIHsKLQl1bnNpZ25lZCBpbnQgdGVtcDsKLQotCXRlbXAgPSBzYW1wbGVfcmF0ZSAqIGNoYW5uZWw7Ci0JTU1fREJHKCIgc2FtcGxlIHJhdGUgKiAgY2hhbm5lbCA9ICVkXG4iLCB0ZW1wKTsKLQkvKiBUbyByZXByZXNlbnQgaW4gUTEyIGZpeGVkIGZvcm1hdCAqLwotCXRlbXAgPSAoYml0X3JhdGUgKiA0MDk2KSAvIHRlbXA7Ci0JTU1fREJHKCIgUmVjb3JkIFF1YWxpdHkgPSAweCU4eFxuIiwgdGVtcCk7Ci0JcmV0dXJuIHRlbXA7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZHNwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgYXVkcHJlX2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgIHZvaWQgKmV2ZW50X2RhdGEpCi17Ci0KLQl1aW50MTZfdCAqbXNnID0gZXZlbnRfZGF0YTsKLQotCWlmICghbXNnKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQUkVQUk9DX01TR19DTURfQ0ZHX0RPTkVfTVNHOgotCQlNTV9EQkcoInR5cGUgJWQsIHN0YXR1c19mbGFnICVkXG4iLFwKLQkJCW1zZ1swXSwgbXNnWzFdKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURQUkVQUk9DX01TR19FUlJPUl9NU0dfSUQ6Ci0JCU1NX0lORk8oImVycl9pbmRleCAlZFxuIiwgbXNnWzBdKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRFNQX01FU1NBR0VfSUQ6Ci0JCU1NX0RCRygiUmVjZWl2ZWQgQURTUCBldmVudDogbW9kdWxlIGVuYWJsZShhdWRwcmVwcm9jdGFzaylcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlNTV9FUlIoInVua25vd24gZXZlbnQgJWRcbiIsIGlkKTsKLQl9Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRhYWNfaW5fZW5hYmxlKHN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRtZ3JfY29uZmlnIGNmZzsKLQlpbnQgcmM7Ci0KLQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JY2ZnLnR4X3JhdGUgPSBhdWRpby0+c2FtcF9yYXRlOwotCWNmZy5yeF9yYXRlID0gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfTk9ORTsKLQljZmcuZGVmX21ldGhvZCA9IFJQQ19BVURfREVGX01FVEhPRF9SRUNPUkQ7Ci0JY2ZnLmNvZGVjID0gUlBDX0FVRF9ERUZfQ09ERUNfQUFDOwotCWNmZy5zbmRfbWV0aG9kID0gUlBDX1NORF9NRVRIT0RfTUlESTsKLQotCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkgewotCQlyYyA9IGF1ZG1ncl9lbmFibGUoJmF1ZGlvLT5hdWRtZ3IsICZjZmcpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCWlmIChhdWRwcmVwcm9jX2VuYWJsZShhdWRpby0+ZW5jX2lkLAotCQkJCSZhdWRwcmVfZHNwX2V2ZW50LCBhdWRpbykpIHsKLQkJCU1NX0VSUigibXNtX2Fkc3BfZW5hYmxlKGF1ZHByZXByb2MpIGZhaWxlZFxuIik7Ci0JCQlhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCi0JCS8qdXBkYXRlIGF1cmVjIHNlc3Npb24gaW5mbyBpbiBhdWRwcmVwcm9jIGxheWVyKi8KLQkJYXVkaW8tPnNlc3Npb25faW5mby5zZXNzaW9uX2lkID0gYXVkaW8tPmVuY19pZDsKLQkJYXVkaW8tPnNlc3Npb25faW5mby5zYW1wbGluZ19mcmVxID0KLQkJCWNvbnZlcnRfc2FtcF9pbmRleChhdWRpby0+c2FtcF9yYXRlKTsKLQkJYXVkcHJlcHJvY191cGRhdGVfYXVkcmVjX2luZm8oJmF1ZGlvLT5zZXNzaW9uX2luZm8pOwotCX0KLQotCWlmIChtc21fYWRzcF9lbmFibGUoYXVkaW8tPmF1ZHJlYykpIHsKLQkJaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfVFVOTkVMKSB7Ci0JCQlhdWRwcmVwcm9jX2Rpc2FibGUoYXVkaW8tPmVuY19pZCwgYXVkaW8pOwotCQkJYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQl9Ci0JCU1NX0VSUigibXNtX2Fkc3BfZW5hYmxlKGF1ZHJlYykgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JYXVkaW8tPmVuYWJsZWQgPSAxOwotCWF1ZGFhY19pbl9kc3BfZW5hYmxlKGF1ZGlvLCAxKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkYWFjX2luX2Rpc2FibGUoc3RydWN0IGF1ZGlvX2FhY19pbiAqYXVkaW8pCi17Ci0JaWYgKGF1ZGlvLT5lbmFibGVkKSB7Ci0JCWF1ZGlvLT5lbmFibGVkID0gMDsKLQotCQlhdWRhYWNfaW5fZHNwX2VuYWJsZShhdWRpbywgMCk7Ci0KLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXRfZW5hYmxlLAotCQkJCWF1ZGlvLT5ydW5uaW5nID09IDAsIDEqSFopOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRpby0+YXVkcmVjKTsKLQkJaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfVFVOTkVMKSB7Ci0JCQlhdWRwcmVwcm9jX2Rpc2FibGUoYXVkaW8tPmVuY19pZCwgYXVkaW8pOwotCQkJLypyZXNldCB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5IGluZm9ybWF0aW9uIGF0Ci0JCQlhdWRwcmVwcm9jIGxheWVyKi8KLQkJCWF1ZGlvLT5zZXNzaW9uX2luZm8uc2FtcGxpbmdfZnJlcSA9IDA7Ci0JCQlhdWRwcmVwcm9jX3VwZGF0ZV9hdWRyZWNfaW5mbygmYXVkaW8tPnNlc3Npb25faW5mbyk7Ci0JCQlhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFhY19pbl9nZXRfZHNwX2ZyYW1lcyhzdHJ1Y3QgYXVkaW9fYWFjX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkaW9fZnJhbWUgKmZyYW1lOwotCXVpbnQzMl90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpbmRleCA9IGF1ZGlvLT5pbl9oZWFkOwotCi0JZnJhbWUgPSAodm9pZCAqKSAoKChjaGFyICopYXVkaW8tPmluW2luZGV4XS5kYXRhKSAtCi0JCQlzaXplb2YoKmZyYW1lKSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9IGZyYW1lLT5mcmFtZV9sZW5ndGg7Ci0KLQkvKiBzdGF0aXN0aWNzIG9mIHJlYWQgKi8KLQlhdG9taWNfYWRkKGF1ZGlvLT5pbltpbmRleF0uc2l6ZSwgJmF1ZGlvLT5pbl9ieXRlcyk7Ci0JYXRvbWljX2FkZCgxLCAmYXVkaW8tPmluX3NhbXBsZXMpOwotCi0JYXVkaW8tPmluX2hlYWQgPSAoYXVkaW8tPmluX2hlYWQgKyAxKSAmIChGUkFNRV9OVU0gLSAxKTsKLQotCS8qIElmIG92ZXJmbG93LCBtb3ZlIHRoZSB0YWlsIGluZGV4IGZvd2FyZC4gKi8KLQlpZiAoYXVkaW8tPmluX2hlYWQgPT0gYXVkaW8tPmluX3RhaWwpIHsKLQkJTU1fRVJSKCJFcnJvciEgbm90IGFibGUgdG8ga2VlcCB1cCB0aGUgcmVhZFxuIik7Ci0JCWF1ZGlvLT5pbl90YWlsID0gKGF1ZGlvLT5pbl90YWlsICsgMSkgJiAoRlJBTUVfTlVNIC0gMSk7Ci0JCU1NX0VSUigiaW5fY291bnQgPSAlZFxuIiwgYXVkaW8tPmluX2NvdW50KTsKLQl9IGVsc2UKLQkJYXVkaW8tPmluX2NvdW50Kys7Ci0KLQlhdWRhYWNfaW5fZHNwX3JlYWRfYnVmZmVyKGF1ZGlvLCBhdWRpby0+ZHNwX2NudCsrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQotCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLX0KLQotc3RhdGljIHZvaWQgYXVkYWFjX250X2luX2dldF9kc3BfZnJhbWVzKHN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRpb19mcmFtZV9udCAqbnRfZnJhbWU7Ci0JdWludDMyX3QgaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWluZGV4ID0gYXVkaW8tPmluX2hlYWQ7Ci0JbnRfZnJhbWUgPSAodm9pZCAqKSAoKChjaGFyICopYXVkaW8tPmluW2luZGV4XS5kYXRhKSAtIFwKLQkJCQlzaXplb2Yoc3RydWN0IGF1ZGlvX2ZyYW1lX250KSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9IG50X2ZyYW1lLT5mcmFtZV9sZW5ndGg7Ci0JLyogc3RhdGlzdGljcyBvZiByZWFkICovCi0JYXRvbWljX2FkZChhdWRpby0+aW5baW5kZXhdLnNpemUsICZhdWRpby0+aW5fYnl0ZXMpOwotCWF0b21pY19hZGQoMSwgJmF1ZGlvLT5pbl9zYW1wbGVzKTsKLQotCWF1ZGlvLT5pbl9oZWFkID0gKGF1ZGlvLT5pbl9oZWFkICsgMSkgJiAoRlJBTUVfTlVNIC0gMSk7Ci0KLQkvKiBJZiBvdmVyZmxvdywgbW92ZSB0aGUgdGFpbCBpbmRleCBmb3dhcmQuICovCi0JaWYgKGF1ZGlvLT5pbl9oZWFkID09IGF1ZGlvLT5pbl90YWlsKQotCQlNTV9EQkcoIkVycm9yISBub3QgYWJsZSB0byBrZWVwIHVwIHRoZSByZWFkXG4iKTsKLQllbHNlCi0JCWF1ZGlvLT5pbl9jb3VudCsrOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cCgmYXVkaW8tPndhaXQpOwotfQotCi1zdGF0aWMgaW50IGF1ZHJlY19wY21fYnVmZmVyX3B0cl9yZWZyZXNoKHN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvLAotCQkJCSAgICAgICB1bnNpZ25lZCBpZHgsIHVuc2lnbmVkIGxlbikKLXsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9wY21fYnVmZmVyX3B0cl9yZWZyZXNoX2FybV9lbmMgY21kOwotCi0JaWYgKGxlbiA9PSAgTlRfRlJBTUVfSEVBREVSX1NJWkUpCi0JCWxlbiA9IGxlbiAvIDI7Ci0JZWxzZQotCQlsZW4gPSAobGVuICsgTlRfRlJBTUVfSEVBREVSX1NJWkUpIC8gMjsKLQlNTV9EQkcoImxlbiA9ICVkXG4iLCBsZW4pOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfUENNX0JVRkZFUl9QVFJfUkVGUkVTSF9BUk1fVE9fRU5DOwotCWNtZC5udW1fYnVmZmVycyA9IDE7Ci0JaWYgKGNtZC5udW1fYnVmZmVycyA9PSAxKSB7Ci0JCWNtZC5idWZfYWRkcmVzc19sZW5ndGhbMF0gPSAoYXVkaW8tPm91dFtpZHhdLmFkZHIgJgotCQkJCQkJCTB4ZmZmZjAwMDApID4+IDE2OwotCQljbWQuYnVmX2FkZHJlc3NfbGVuZ3RoWzFdID0gKGF1ZGlvLT5vdXRbaWR4XS5hZGRyICYKLQkJCQkJCQkweDAwMDBmZmZmKTsKLQkJY21kLmJ1Zl9hZGRyZXNzX2xlbmd0aFsyXSA9IChsZW4gJiAweGZmZmYwMDAwKSA+PiAxNjsKLQkJY21kLmJ1Zl9hZGRyZXNzX2xlbmd0aFszXSA9IChsZW4gJiAweDAwMDBmZmZmKTsKLQl9Ci0JYXVkaW8tPm91dF9mcmFtZV9jbnQrKzsKLQlyZXR1cm4gYXVkaW9fc2VuZF9xdWV1ZV9yZWMoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRwY21fY29uZmlnKHN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRyZWNfY21kX3BjbV9jZmdfYXJtX3RvX2VuYyBjbWQ7Ci0JTU1fREJHKCJcbiIpOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfUENNX0NGR19BUk1fVE9fRU5DOwotCWNtZC5jb25maWdfdXBkYXRlX2ZsYWcgPSBBVURSRUNfUENNX0NPTkZJR19VUERBVEVfRkxBR19FTkFCTEU7Ci0JY21kLmVuYWJsZV9mbGFnID0gQVVEUkVDX0VOQUJMRV9GTEFHX1ZBTFVFOwotCWNtZC5zYW1wbGluZ19mcmVxID0gY29udmVydF9zYW1wX2luZGV4KGF1ZGlvLT5zYW1wX3JhdGUpOwotCWlmICghYXVkaW8tPmNoYW5uZWxfbW9kZSkKLQkJY21kLmNoYW5uZWxzID0gMTsKLQllbHNlCi0JCWNtZC5jaGFubmVscyA9IDI7Ci0JY21kLmZyZXF1ZW5jeV9vZl9pbnRpbWF0aW9uID0gMTsKLQljbWQubWF4X251bWJlcl9vZl9idWZmZXJzID0gT1VUX0ZSQU1FX05VTTsKLQlyZXR1cm4gYXVkaW9fc2VuZF9xdWV1ZV9yZWMoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRhYWNfaW5fcm91dGluZ19tb2RlX2NvbmZpZyhzdHJ1Y3QgYXVkaW9fYWFjX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9yb3V0aW5nX21vZGUgY21kOwotCi0JTU1fREJHKCJcbiIpOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfUk9VVElOR19NT0RFOwotCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkKLQkJY21kLnJvdXRpbmdfbW9kZSA9IDE7Ci0JcmV0dXJuIGF1ZGlvX3NlbmRfcXVldWVfcmVjKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHJlY19kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgdm9pZCAoKmdldGV2ZW50KSh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvID0gTlVMTDsKLQlpZiAoZGF0YSkKLQkJYXVkaW8gPSBkYXRhOwotCWVsc2UgewotCQlNTV9FUlIoImludmFsaWQgZGF0YSBmb3IgZXZlbnQgJXhcbiIsIGlkKTsKLQkJcmV0dXJuOwotCX0KLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFJFQ19NU0dfQ01EX0NGR19ET05FX01TRzogewotCQlzdHJ1Y3QgYXVkcmVjX21zZ19jbWRfY2ZnX2RvbmVfbXNnIGNtZF9jZmdfZG9uZV9tc2c7Ci0JCWdldGV2ZW50KCZjbWRfY2ZnX2RvbmVfbXNnLCBBVURSRUNfTVNHX0NNRF9DRkdfRE9ORV9NU0dfTEVOKTsKLQkJaWYgKGNtZF9jZmdfZG9uZV9tc2cuYXVkcmVjX2VuY190eXBlICYgXAotCQkJCUFVRFJFQ19NU0dfQ0ZHX0RPTkVfRU5DX0VOQSkgewotCQkJYXVkaW8tPmF1ZHJlY19vYmpfaWR4ID0gY21kX2NmZ19kb25lX21zZy5hdWRyZWNfb2JqX2lkeDsKLQkJCU1NX0RCRygiQ0ZHIEVOQUJMRURcbiIpOwotCQkJaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKSB7Ci0JCQkJTU1fREJHKCJyb3V0aW5nIGNvbW1hbmRcbiIpOwotCQkJCWF1ZGFhY19pbl9yb3V0aW5nX21vZGVfY29uZmlnKGF1ZGlvKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXVkYWFjX2luX2VuY21lbV9jb25maWcoYXVkaW8pOwotCQkJfQotCQl9IGVsc2UgewotCQkJTU1fREJHKCJDRkcgU0xFRVBcbiIpOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAwOwotCQkJd2FrZV91cCgmYXVkaW8tPndhaXRfZW5hYmxlKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfTVNHX0NNRF9ST1VUSU5HX01PREVfRE9ORV9NU0c6IHsKLQkJc3RydWN0IGF1ZHJlY19tc2dfY21kX3JvdXRpbmdfbW9kZV9kb25lX21zZyBcCi0JCQlyb3V0aW5nX21zZzsKLQkJZ2V0ZXZlbnQoJnJvdXRpbmdfbXNnLCBBVURSRUNfTVNHX0NNRF9ST1VUSU5HX01PREVfRE9ORV9NU0cpOwotCQlNTV9EQkcoIkFVRFJFQ19NU0dfQ01EX1JPVVRJTkdfTU9ERV9ET05FX01TRyIpOwotCQlpZiAocm91dGluZ19tc2cuY29uZmlndXJhdGlvbiA9PSAwKSB7Ci0JCQlNTV9FUlIoInJvdXRpbmcgY29uZmlndXJhdGlvbiBmYWlsZWRcbiIpOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAwOwotCQkJd2FrZV91cCgmYXVkaW8tPndhaXRfZW5hYmxlKTsKLQkJfSBlbHNlCi0JCQlhdWRhYWNfaW5fZW5jbWVtX2NvbmZpZyhhdWRpbyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19NU0dfQ01EX0FSRUNfTUVNX0NGR19ET05FX01TRzogewotCQlNTV9EQkcoIkFSRUNfTUVNX0NGR19ET05FX01TR1xuIik7Ci0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkKLQkJCWF1ZGFhY19pbl9lbmNwYXJhbV9jb25maWcoYXVkaW8pOwotCQllbHNlCi0JCQlhdWRwY21fY29uZmlnKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX0NNRF9QQ01fQ0ZHX0FSTV9UT19FTkNfRE9ORV9NU0c6IHsKLQkJTU1fREJHKCJBVURSRUNfQ01EX1BDTV9DRkdfQVJNX1RPX0VOQ19ET05FX01TRyIpOwotCQlhdWRhYWNfaW5fZW5jcGFyYW1fY29uZmlnKGF1ZGlvKTsKLQkgICAgYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX01TR19DTURfQVJFQ19QQVJBTV9DRkdfRE9ORV9NU0c6IHsKLQkJTU1fREJHKCJBVURSRUNfTVNHX0NNRF9BUkVDX1BBUkFNX0NGR19ET05FX01TR1xuIik7Ci0JCWF1ZGlvLT5ydW5uaW5nID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPndhaXRfZW5hYmxlKTsKLQkJaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKQotCQkJYXVkcmVjX3BjbV9zZW5kX2RhdGEoYXVkaW8sIDEpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfQ01EX1BDTV9CVUZGRVJfUFRSX1VQREFURV9BUk1fVE9fRU5DX01TRzogewotCQlNTV9EQkcoInB0cl91cGRhdGUgcmVjaWV2ZWQgZnJvbSBEU1BcbiIpOwotCQlhdWRyZWNfcGNtX3NlbmRfZGF0YShhdWRpbywgMSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19NU0dfTk9fRVhUX1BLVF9BVkFJTEFCTEVfTVNHOiB7Ci0JCXN0cnVjdCBhdWRyZWNfbXNnX25vX2V4dF9wa3RfYXZhaWxfbXNnIGVycl9tc2c7Ci0JCWdldGV2ZW50KCZlcnJfbXNnLCBBVURSRUNfTVNHX05PX0VYVF9QS1RfQVZBSUxBQkxFX01TR19MRU4pOwotCQlNTV9EQkcoIk5PX0VYVF9QS1RfQVZBSUxBQkxFX01TRyAleFxuIixcCi0JCQllcnJfbXNnLmF1ZHJlY19lcnJfaWQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfTVNHX1BBQ0tFVF9SRUFEWV9NU0c6IHsKLQkJc3RydWN0IGF1ZHJlY19tc2dfcGFja2V0X3JlYWR5X21zZyBwa3RfcmVhZHlfbXNnOwotCi0JCWdldGV2ZW50KCZwa3RfcmVhZHlfbXNnLCBBVURSRUNfTVNHX1BBQ0tFVF9SRUFEWV9NU0dfTEVOKTsKLQkJTU1fREJHKCJVUF9QQUNLRVRfUkVBRFlfTVNHOiB3cml0ZSBjbnQgbXN3ICAlZCBcCi0JCXdyaXRlIGNudCBsc3cgJWQgcmVhZCBjbnQgbXN3ICVkICByZWFkIGNudCBsc3cgJWQgXG4iLFwKLQkJcGt0X3JlYWR5X21zZy5wa3RfY291bnRlcl9tc3csIFwKLQkJcGt0X3JlYWR5X21zZy5wa3RfY291bnRlcl9sc3csIFwKLQkJcGt0X3JlYWR5X21zZy5wa3RfcmVhZF9jbnRfbXN3LCBcCi0JCXBrdF9yZWFkeV9tc2cucGt0X3JlYWRfY250X2xzdyk7Ci0KLQkJYXVkYWFjX2luX2dldF9kc3BfZnJhbWVzKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX1VQX05UX1BBQ0tFVF9SRUFEWV9NU0c6IHsKLQkJc3RydWN0IGF1ZHJlY191cF9udF9wYWNrZXRfcmVhZHlfbXNnIHBrdF9yZWFkeV9tc2c7Ci0KLQkJZ2V0ZXZlbnQoJnBrdF9yZWFkeV9tc2csIEFVRFJFQ19VUF9OVF9QQUNLRVRfUkVBRFlfTVNHX0xFTik7Ci0JCU1NX0RCRygiVVBfTlRfUEFDS0VUX1JFQURZX01TRzogd3JpdGUgY250IGxzdyAgJWQgXAotCQl3cml0ZSBjbnQgbXN3ICVkIHJlYWQgY250IGxzdyAlZCAgcmVhZCBjbnQgbXN3ICVkIFxuIixcCi0JCXBrdF9yZWFkeV9tc2cuYXVkcmVjX3BhY2tldHdyaXRlX2NudF9sc3csIFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfcGFja2V0d3JpdGVfY250X21zdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY191cHByZXZfcmVhZGNvdW50X2xzdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY191cHByZXZfcmVhZGNvdW50X21zdyk7Ci0KLQkJYXVkYWFjX250X2luX2dldF9kc3BfZnJhbWVzKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX0NNRF9GTFVTSF9ET05FX01TRzogewotCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCWF1ZGlvLT5mbHVzaF9hY2sgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCU1NX0RCRygiZmx1c2ggYWNrIHJlY2lldmVkXG4iKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQURTUF9NRVNTQUdFX0lEOgotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6IG1vZHVsZSBcCi0JCQkJZW5hYmxlL2Rpc2FibGUoYXVkcmVjdGFzaylcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlNTV9FUlIoInVua25vd24gZXZlbnQgJWRcbiIsIGlkKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHJlY19hYWNfYWRzcF9vcHMgPSB7Ci0JLmV2ZW50ID0gYXVkcmVjX2RzcF9ldmVudCwKLX07Ci0KLXN0YXRpYyBpbnQgYXVkYWFjX2luX2RzcF9lbmFibGUoc3RydWN0IGF1ZGlvX2FhY19pbiAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0Jc3RydWN0IGF1ZHJlY19jbWRfZW5jX2NmZyBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURSRUNfQ01EX0VOQ19DRkc7Ci0JY21kLmF1ZHJlY19lbmNfdHlwZSA9IChhdWRpby0+ZW5jX3R5cGUgJiAweEZGKSB8Ci0JCQkoZW5hYmxlID8gQVVEUkVDX0NNRF9FTkNfRU5BIDogQVVEUkVDX0NNRF9FTkNfRElTKTsKLQkvKiBEb24ndCBjYXJlICovCi0JY21kLmF1ZHJlY19vYmpfaWR4ID0gYXVkaW8tPmF1ZHJlY19vYmpfaWR4OwotCi0JcmV0dXJuIGF1ZGlvX3NlbmRfcXVldWVfcmVjKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkYWFjX2luX2VuY21lbV9jb25maWcoc3RydWN0IGF1ZGlvX2FhY19pbiAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHJlY19jbWRfYXJlY21lbV9jZmcgY21kOwotCXVpbnQxNl90ICpkYXRhID0gKHZvaWQgKikgYXVkaW8tPmRhdGE7Ci0JaW50IG47Ci0JaW50IGhlYWRlcl9sZW4gPSAwOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWNtZC5jbWRfaWQgPSBBVURSRUNfQ01EX0FSRUNNRU1fQ0ZHOwotCWNtZC5hdWRyZWNfb2JqX2lkeCA9IGF1ZGlvLT5hdWRyZWNfb2JqX2lkeDsKLQkvKiBSYXRlIGF0IHdoaWNoIHBhY2tldCBjb21wbGV0ZSBtZXNzYWdlIGNvbWVzICovCi0JY21kLmF1ZHJlY191cF9wa3RfaW50bV9jbnQgPSAxOwotCWNtZC5hdWRyZWNfZXh0cGt0X2J1ZmZlcl9tc3cgPSBhdWRpby0+cGh5cyA+PiAxNjsKLQljbWQuYXVkcmVjX2V4dHBrdF9idWZmZXJfbHN3ID0gYXVkaW8tPnBoeXM7Ci0JLyogTWF4IEJ1ZmZlciBubyBhdmFpbGFibGUgZm9yIGZyYW1lcyAqLwotCWNtZC5hdWRyZWNfZXh0cGt0X2J1ZmZlcl9udW0gPSBGUkFNRV9OVU07Ci0KLQkvKiBwcmVwYXJlIGJ1ZmZlciBwb2ludGVyczoKLQkgKiBUOjE1MzYgYnl0ZXMgYWFjIHBhY2tldCArIDQgaGFsZndvcmQgaGVhZGVyCi0JICogTlQ6MTUzNiBieXRlcyBhYWMgcGFja2V0ICsgMTIgaGFsZndvcmQgaGVhZGVyCi0JICovCi0JaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfVFVOTkVMKQotCQloZWFkZXJfbGVuID0gRlJBTUVfSEVBREVSX1NJWkUvMjsKLQllbHNlCi0JCWhlYWRlcl9sZW4gPSBOVF9GUkFNRV9IRUFERVJfU0laRS8yOwotCi0JZm9yIChuID0gMDsgbiA8IEZSQU1FX05VTTsgbisrKSB7Ci0JCWF1ZGlvLT5pbltuXS5kYXRhID0gZGF0YSArIGhlYWRlcl9sZW47Ci0JCWRhdGEgKz0gKEFBQ19GUkFNRV9TSVpFLzIpICsgaGVhZGVyX2xlbjsKLQkJTU1fREJHKCIweCU4eFxuIiwgKGludCkoYXVkaW8tPmluW25dLmRhdGEgLSBoZWFkZXJfbGVuKjIpKTsKLQl9Ci0KLQlyZXR1cm4gYXVkaW9fc2VuZF9xdWV1ZV9yZWMoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRhYWNfaW5fZW5jcGFyYW1fY29uZmlnKHN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRyZWNfY21kX2FyZWNwYXJhbV9hYWNfY2ZnIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNvbW1vbi5jbWRfaWQgPSBBVURSRUNfQ01EX0FSRUNQQVJBTV9DRkc7Ci0JY21kLmNvbW1vbi5hdWRyZWNfb2JqX2lkeCA9IGF1ZGlvLT5hdWRyZWNfb2JqX2lkeDsKLQljbWQuc2FtcF9yYXRlX2lkeCA9IGF1ZGlvLT5zYW1wX3JhdGVfaW5kZXg7Ci0JY21kLnN0ZXJlb19tb2RlID0gYXVkaW8tPmNoYW5uZWxfbW9kZTsKLQljbWQucmVjX3F1YWxpdHkgPSBhdWRpby0+cmVjb3JkX3F1YWxpdHk7Ci0KLQotCXJldHVybiBhdWRpb19zZW5kX3F1ZXVlX3JlYyhhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGF1ZGFhY19mbHVzaF9jb21tYW5kKHN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRyZWNfY21kX2ZsdXNoIGNtZDsKLQlNTV9EQkcoIlxuIik7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUkVDX0NNRF9GTFVTSDsKLQlyZXR1cm4gYXVkaW9fc2VuZF9xdWV1ZV9yZWMoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRhYWNfaW5fZHNwX3JlYWRfYnVmZmVyKHN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvLAotCQl1aW50MzJfdCByZWFkX2NudCkKLXsKLQlhdWRyZWNfY21kX3BhY2tldF9leHRfcHRyIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfUEFDS0VUX0VYVF9QVFI7Ci0JY21kLnR5cGUgPSBhdWRpby0+YXVkcmVjX29ial9pZHg7Ci0JY21kLmN1cnJfcmVjX2NvdW50X21zdyA9IHJlYWRfY250ID4+IDE2OwotCWNtZC5jdXJyX3JlY19jb3VudF9sc3cgPSByZWFkX2NudDsKLQotCXJldHVybiBhdWRpb19zZW5kX3F1ZXVlX3JlY2JzKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZGV2aWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdm9pZCBhdWRhYWNfaW9wb3J0X3Jlc2V0KHN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvKQotewotCS8qIE1ha2Ugc3VyZSByZWFkL3dyaXRlIHRocmVhZCBhcmUgZnJlZSBmcm9tCi0JICogc2xlZXAgYW5kIGtub3dpbmcgdGhhdCBzeXN0ZW0gaXMgbm90IGFibGUKLQkgKiB0byBwcm9jZXNzIGlvIHJlcXVlc3QgYXQgdGhlIG1vbWVudAotCSAqLwotCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlhdWRhYWNfaW5fZmx1c2goYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0Jd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlhdWRhYWNfb3V0X2ZsdXNoKGF1ZGlvKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkYWFjX2luX2ZsdXNoKHN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvKQotewotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlhdWRpby0+ZHNwX2NudCA9IDA7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWF1ZGlvLT5pbl9oZWFkID0gMDsKLQlhdWRpby0+aW5fdGFpbCA9IDA7Ci0JYXVkaW8tPmluX2NvdW50ID0gMDsKLQlhdWRpby0+ZW9zX2FjayA9IDA7Ci0JZm9yIChpID0gRlJBTUVfTlVNLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCWF1ZGlvLT5pbltpXS5zaXplID0gMDsKLQkJYXVkaW8tPmluW2ldLnJlYWQgPSAwOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlNTV9EQkcoImluX2J5dGVzICVkXG4iLCBhdG9taWNfcmVhZCgmYXVkaW8tPmluX2J5dGVzKSk7Ci0JTU1fREJHKCJpbl9zYW1wbGVzICVkXG4iLCBhdG9taWNfcmVhZCgmYXVkaW8tPmluX3NhbXBsZXMpKTsKLQlhdG9taWNfc2V0KCZhdWRpby0+aW5fYnl0ZXMsIDApOwotCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9zYW1wbGVzLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkYWFjX291dF9mbHVzaChzdHJ1Y3QgYXVkaW9fYWFjX2luICphdWRpbykKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JYXVkaW8tPm91dF9oZWFkID0gMDsKLQlhdWRpby0+b3V0X2NvdW50ID0gMDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlmb3IgKGkgPSBPVVRfRlJBTUVfTlVNLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCWF1ZGlvLT5vdXRbaV0uc2l6ZSA9IDA7Ci0JCWF1ZGlvLT5vdXRbaV0ucmVhZCA9IDA7Ci0JCWF1ZGlvLT5vdXRbaV0udXNlZCA9IDA7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBsb25nIGF1ZGFhY19pbl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYXVkaW9fYWFjX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JTU1fREJHKCJcbiIpOwotCWlmIChjbWQgPT0gQVVESU9fR0VUX1NUQVRTKSB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCXN0YXRzLmJ5dGVfY291bnQgPSBhdG9taWNfcmVhZCgmYXVkaW8tPmluX2J5dGVzKTsKLQkJc3RhdHMuc2FtcGxlX2NvdW50ID0gYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9zYW1wbGVzKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIHJjOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJcmMgPSBhdWRhYWNfaW5fZW5hYmxlKGF1ZGlvKTsKLQkJaWYgKCFyYykgewotCQkJcmMgPQotCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXRfZW5hYmxlLAotCQkJCWF1ZGlvLT5ydW5uaW5nICE9IDAsIDEqSFopOwotCQkJTU1fREJHKCJzdGF0ZSAlZCByYyA9ICVkXG4iLCBhdWRpby0+cnVubmluZywgcmMpOwotCi0JCQlpZiAoYXVkaW8tPnJ1bm5pbmcgPT0gMCkKLQkJCQlyYyA9IC1FTk9ERVY7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQl9Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU1RPUDogewotCQlyYyA9IGF1ZGFhY19pbl9kaXNhYmxlKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fRkxVU0g6IHsKLQkJTU1fREJHKCJBVURJT19GTFVTSFxuIik7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAxOwotCQlhdWRpby0+d2ZsdXNoID0gMTsKLQkJYXVkYWFjX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWlmIChhdWRpby0+cnVubmluZykgewotCQkJYXVkYWFjX2ZsdXNoX2NvbW1hbmQoYXVkaW8pOwotCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJIWF1ZGlvLT53Zmx1c2gpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCU1NX0VSUigiQVVESU9fRkxVU0ggaW50ZXJydXB0ZWRcbiIpOwotCQkJCXJjID0gLUVJTlRSOwotCQkJfQotCQl9IGVsc2UgewotCQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNmZzsKLQkJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihjZmcpKTsKLQkJY2ZnLmJ1ZmZlcl9zaXplID0gT1VUX0JVRkZFUl9TSVpFOwotCQljZmcuYnVmZmVyX2NvdW50ID0gT1VUX0ZSQU1FX05VTTsKLQkJY2ZnLnNhbXBsZV9yYXRlID0gY29udmVydF9zYW1wX2luZGV4KGF1ZGlvLT5zYW1wX3JhdGUpOwotCQljZmcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JCWNmZy50eXBlID0gMDsKLQkJY2ZnLnVudXNlZFswXSA9IDA7Ci0JCWNmZy51bnVzZWRbMV0gPSAwOwotCQljZmcudW51c2VkWzJdID0gMDsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZjZmcsIHNpemVvZihjZmcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfU1RSRUFNX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgY2ZnOwotCQltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOwotCQljZmcuYnVmZmVyX3NpemUgPSBhdWRpby0+YnVmZmVyX3NpemU7Ci0JCWNmZy5idWZmZXJfY291bnQgPSBGUkFNRV9OVU07Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjZmcsIHNpemVvZihjZmcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfU1RSRUFNX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgY2ZnOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgKHZvaWQgKikgYXJnLCBzaXplb2YoY2ZnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIEFsbG93IG9ubHkgc2luZ2xlIGZyYW1lICovCi0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkgewotCQkJaWYgKGNmZy5idWZmZXJfc2l6ZSAhPSAoRlJBTUVfU0laRSAtIDgpKQotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCWlmIChjZmcuYnVmZmVyX3NpemUgIT0gKEFBQ19GUkFNRV9TSVpFICsgMTQpKQotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJfQotCQlhdWRpby0+YnVmZmVyX3NpemUgPSBjZmcuYnVmZmVyX3NpemU7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9BQUNfRU5DX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnIGNmZzsKLQkJaWYgKGF1ZGlvLT5jaGFubmVsX21vZGUgPT0gQVVEUkVDX0NNRF9TVEVSRU9fTU9ERV9NT05PKQotCQkJY2ZnLmNoYW5uZWxzID0gMTsKLQkJZWxzZQotCQkJY2ZnLmNoYW5uZWxzID0gMjsKLQkJY2ZnLnNhbXBsZV9yYXRlID0gY29udmVydF9zYW1wX2luZGV4KGF1ZGlvLT5zYW1wX3JhdGUpOwotCQljZmcuYml0X3JhdGUgPSBhdWRpby0+Yml0X3JhdGU7Ci0JCWNmZy5zdHJlYW1fZm9ybWF0ID0gQVVESU9fQUFDX0ZPUk1BVF9SQVc7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjZmcsIHNpemVvZihjZmcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0FBQ19FTkNfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcgY2ZnOwotCQl1bnNpZ25lZCBpbnQgcmVjb3JkX3F1YWxpdHk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNmZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY2ZnLnN0cmVhbV9mb3JtYXQgIT0gQVVESU9fQUFDX0ZPUk1BVF9SQVcpIHsKLQkJCU1NX0VSUigidW5zdXBwb3J0ZWQgQUFDIGZvcm1hdFxuIik7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlyZWNvcmRfcXVhbGl0eSA9IGJpdHJhdGVfdG9fcmVjb3JkX3F1YWxpdHkoY2ZnLnNhbXBsZV9yYXRlLAotCQkJCQljZmcuY2hhbm5lbHMsIGNmZy5iaXRfcmF0ZSk7Ci0JCS8qIFJhbmdlIG9mIFJlY29yZCBRdWFsaXR5IFN1cHBvcnRlZCBieSBEU1AsIFExMiBmb3JtYXQgKi8KLQkJaWYgKChyZWNvcmRfcXVhbGl0eSA8IDB4ODAwKSB8fCAocmVjb3JkX3F1YWxpdHkgPiAweDQwMDApKSB7Ci0JCQlNTV9FUlIoIlVuc3VwcG9ydGVkIGJpdCByYXRlXG4iKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCU1NX0RCRygiY2hhbm5lbHMgPSAlZFxuIiwgY2ZnLmNoYW5uZWxzKTsKLQkJaWYgKGNmZy5jaGFubmVscyA9PSAxKSB7Ci0JCQljZmcuY2hhbm5lbHMgPSBBVURSRUNfQ01EX1NURVJFT19NT0RFX01PTk87Ci0JCX0gZWxzZSBpZiAoY2ZnLmNoYW5uZWxzID09IDIpIHsKLQkJCWNmZy5jaGFubmVscyA9IEFVRFJFQ19DTURfU1RFUkVPX01PREVfU1RFUkVPOwotCQl9IGVsc2UgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlhdWRpby0+c2FtcF9yYXRlID0gY29udmVydF9zYW1wX3JhdGUoY2ZnLnNhbXBsZV9yYXRlKTsKLQkJYXVkaW8tPnNhbXBfcmF0ZV9pbmRleCA9Ci0JCSAgY29udmVydF9kc3Bfc2FtcF9pbmRleChjZmcuc2FtcGxlX3JhdGUpOwotCQlhdWRpby0+Y2hhbm5lbF9tb2RlID0gY2ZnLmNoYW5uZWxzOwotCQlhdWRpby0+Yml0X3JhdGUgPSBjZmcuYml0X3JhdGU7Ci0JCWF1ZGlvLT5yZWNvcmRfcXVhbGl0eSA9IHJlY29yZF9xdWFsaXR5OwotCQlNTV9EQkcoIiBSZWNvcmQgUXVhbGl0eSA9IDB4JTh4XG4iLCBhdWRpby0+cmVjb3JkX3F1YWxpdHkpOwotCQlicmVhazsKLQl9Ci0KLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkYWFjX2luX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXZvaWQgKmRhdGE7Ci0JdWludDMyX3QgaW5kZXg7Ci0JdWludDMyX3Qgc2l6ZTsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBhYWNfZW5jb2RlZF9tZXRhX291dCBtZXRhX2ZpZWxkOwotCXN0cnVjdCBhdWRpb19mcmFtZV9udCAqbnRfZnJhbWU7Ci0JTU1fREJHKCJjb3VudCA9ICVkXG4iLCBjb3VudCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCWF1ZGlvLT53YWl0LCAoYXVkaW8tPmluX2NvdW50ID4gMCkgfHwgYXVkaW8tPnN0b3BwZWQgfHwKLQkJCWF1ZGlvLT5yZmx1c2gpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGF1ZGlvLT5yZmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGF1ZGlvLT5zdG9wcGVkICYmICFhdWRpby0+aW5fY291bnQpIHsKLQkJCU1NX0RCRygiRHJpdmVyIGluIHN0b3Agc3RhdGUsIE5vIG1vcmUgYnVmZmVyIHRvIHJlYWQiKTsKLQkJCXJjID0gMDsvKiBFbmQgb2YgRmlsZSAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpbmRleCA9IGF1ZGlvLT5pbl90YWlsOwotCQlkYXRhID0gKHVpbnQ4X3QgKikgYXVkaW8tPmluW2luZGV4XS5kYXRhOwotCQlzaXplID0gYXVkaW8tPmluW2luZGV4XS5zaXplOwotCi0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkgewotCQkJbnRfZnJhbWUgPSAoc3RydWN0IGF1ZGlvX2ZyYW1lX250ICopKGRhdGEgLQotCQkJCQlzaXplb2Yoc3RydWN0IGF1ZGlvX2ZyYW1lX250KSk7Ci0JCQltZW1jcHkoKGNoYXIgKikmbWV0YV9maWVsZC50aW1lX3N0YW1wX2R3b3JkX2xzdywKLQkJCQkoY2hhciAqKSZudF9mcmFtZS0+dGltZV9zdGFtcF9kd29yZF9sc3csCi0JCQkJKHNpemVvZihzdHJ1Y3QgYWFjX2VuY29kZWRfbWV0YV9vdXQpIC0gXAotCQkJCXNpemVvZih1aW50MTZfdCkpKTsKLQkJCW1ldGFfZmllbGQubWV0YWRhdGFfbGVuID0KLQkJCQkJc2l6ZW9mKHN0cnVjdCBhYWNfZW5jb2RlZF9tZXRhX291dCk7Ci0JCQlpZiAoY29weV90b191c2VyKChjaGFyICopc3RhcnQsIChjaGFyICopJm1ldGFfZmllbGQsCi0JCQkJCXNpemVvZihzdHJ1Y3QgYWFjX2VuY29kZWRfbWV0YV9vdXQpKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChudF9mcmFtZS0+bmZsYWdfbHN3ICYgMHgwMDAxKSB7Ci0JCQkJTU1fREJHKCJyZWNpZXZlZCBFT1MgaW4gcmVhZCBjYWxsXG4iKTsKLQkJCQlhdWRpby0+ZW9zX2FjayA9IDE7Ci0JCQl9Ci0JCQlidWYgKz0gc2l6ZW9mKHN0cnVjdCBhYWNfZW5jb2RlZF9tZXRhX291dCk7Ci0JCQljb3VudCAtPSBzaXplb2Yoc3RydWN0IGFhY19lbmNvZGVkX21ldGFfb3V0KTsKLQkJfQotCQlpZiAoY291bnQgPj0gc2l6ZSkgewotCQkJLyogb3JkZXIgdGhlIHJlYWRzIG9uIHRoZSBidWZmZXIgKi8KLQkJCWRtYV9jb2hlcmVudF9wb3N0X29wcygpOwotCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGRhdGEsIHNpemUpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJaWYgKGluZGV4ICE9IGF1ZGlvLT5pbl90YWlsKSB7Ci0JCQkJLyogb3ZlcnJ1biAtLSBkYXRhIGlzCi0JCQkJICogaW52YWxpZCBhbmQgd2UgbmVlZCB0byByZXRyeSAqLwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYXVkaW8tPmluW2luZGV4XS5zaXplID0gMDsKLQkJCWF1ZGlvLT5pbl90YWlsID0gKGF1ZGlvLT5pbl90YWlsICsgMSkgJiAoRlJBTUVfTlVNIC0gMSk7Ci0JCQlhdWRpby0+aW5fY291bnQtLTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJY291bnQgLT0gc2l6ZTsKLQkJCWJ1ZiArPSBzaXplOwotCQkJaWYgKChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkpIHsKLQkJCQlpZiAoIWF1ZGlvLT5lb3NfYWNrKSB7Ci0JCQkJCU1NX0RCRygic2VuZGluZyByZWFkIHB0ciBjb21tYW5kIFwKLQkJCQkJCQklZCAlZFxuIiwKLQkJCQkJCQlhdWRpby0+ZHNwX2NudCwKLQkJCQkJCQlhdWRpby0+aW5fdGFpbCk7Ci0JCQkJCWF1ZGFhY19pbl9kc3BfcmVhZF9idWZmZXIoYXVkaW8sCi0JCQkJCQkJYXVkaW8tPmRzcF9jbnQrKyk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJzaG9ydCByZWFkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCi0JaWYgKGJ1ZiA+IHN0YXJ0KQotCQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHJlY19wY21fc2VuZF9kYXRhKHN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlNTV9EQkcoIlxuIik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWlmICghYXVkaW8tPnJ1bm5pbmcpCi0JCWdvdG8gZG9uZTsKLQotCWlmIChuZWVkZWQgJiYgIWF1ZGlvLT53Zmx1c2gpIHsKLQkJLyogV2Ugd2VyZSBjYWxsZWQgZnJvbSB0aGUgY2FsbGJhY2sgYmVjYXVzZSB0aGUgRFNQCi0JCSAqIHJlcXVlc3RlZCBtb3JlIGRhdGEuICBOb3RlIHRoYXQgdGhlIERTUCBkb2VzIHdhbnQKLQkJICogbW9yZSBkYXRhLCBhbmQgaWYgYSBidWZmZXIgd2FzIGluLWZsaWdodCwgbWFyayBpdAotCQkgKiBhcyBhdmFpbGFibGUgKHNpbmNlIHRoZSBEU1AgbXVzdCBub3cgYmUgZG9uZSB3aXRoCi0JCSAqIGl0KS4KLQkJICovCi0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZikgewotCQkJTU1fREJHKCJmcmFtZSAlZCBmcmVlXG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCQkJZnJhbWUtPnVzZWQgPSAwOwotCQkJYXVkaW8tPm91dF90YWlsIF49IDE7Ci0JCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCX0KLQl9Ci0KLQlpZiAoYXVkaW8tPm91dF9uZWVkZWQpIHsKLQkJLyogSWYgdGhlIERTUCBjdXJyZW50bHkgd2FudHMgZGF0YSBhbmQgd2UgaGF2ZSBhCi0JCSAqIGJ1ZmZlciBhdmFpbGFibGUsIHdlIHdpbGwgc2VuZCBpdCBhbmQgcmVzZXQKLQkJICogdGhlIG5lZWRlZCBmbGFnLiAgV2UnbGwgbWFyayB0aGUgYnVmZmVyIGFzIGluLWZsaWdodAotCQkgKiBzbyB0aGF0IGl0IHdvbid0IGJlIHJlY3ljbGVkIHVudGlsIHRoZSBuZXh0IGJ1ZmZlcgotCQkgKiBpcyByZXF1ZXN0ZWQKLQkJICovCi0KLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQpIHsKLQkJCUJVR19PTihmcmFtZS0+dXNlZCA9PSAweGZmZmZmZmZmKTsKLQkJCWF1ZHJlY19wY21fYnVmZmVyX3B0cl9yZWZyZXNoKGF1ZGlvLAotCQkJCQkJIGF1ZGlvLT5vdXRfdGFpbCwKLQkJCQkJCSAgICBmcmFtZS0+dXNlZCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDB4ZmZmZmZmZmY7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCX0KLQl9Ci0gZG9uZToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotCi1zdGF0aWMgaW50IGF1ZGFhY19pbl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IGEsIGxvZmZfdCBiLCBpbnQgZGF0YXN5bmMpCi0KLXsKLQlzdHJ1Y3QgYXVkaW9fYWFjX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoIWF1ZGlvLT5ydW5uaW5nIHx8IChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmVfbm9sb2NrOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJYXVkaW8tPndmbHVzaCk7Ci0JTU1fREJHKCJ3YWtlZCBvbiBieSBzb21lIGV2ZW50IGF1ZGlvLT53Zmx1c2ggPSAlZFxuIiwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci1kb25lX25vbG9jazoKLQlyZXR1cm4gcmM7Ci0KLX0KLQotaW50IGF1ZHJlY19hYWNfcHJvY2Vzc19lb3Moc3RydWN0IGF1ZGlvX2FhY19pbiAqYXVkaW8sCi0JCWNvbnN0IGNoYXIgX191c2VyICpidWZfc3RhcnQsIHVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplKQotewotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWludCByYyA9IDA7Ci0KLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKGF1ZGlvLT5vdXRfbmVlZGVkICYmCi0JCWF1ZGlvLT5vdXRbMF0udXNlZCA9PSAwICYmCi0JCWF1ZGlvLT5vdXRbMV0udXNlZCA9PSAwKQotCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGZyYW1lLT5kYXRhLCBidWZfc3RhcnQsIG1maWVsZF9zaXplKSkgewotCQlyYyA9IC1FRkFVTFQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlmcmFtZS0+bWZpZWxkX3N6ID0gbWZpZWxkX3NpemU7Ci0JYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JZnJhbWUtPnVzZWQgPSBtZmllbGRfc2l6ZTsKLQlNTV9EQkcoImNvcHlpbmcgbWV0YV9vdXQgZnJhbWUtPnVzZWQgPSAlZFxuIiwgZnJhbWUtPnVzZWQpOwotCWF1ZHJlY19wY21fc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotc3RhdGljIHNzaXplX3QgYXVkYWFjX2luX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCWNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW9fYWFjX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JY2hhciAqY3B5X3B0cjsKLQlpbnQgcmMgPSAwLCBlb3NfY29uZGl0aW9uID0gQVVEUFJFUFJPQ19BQUNfRU9TX05PTkU7Ci0JdW5zaWduZWQgc2hvcnQgbWZpZWxkX3NpemUgPSAwOwotCWludCB3cml0ZV9jb3VudCA9IDA7Ci0JTU1fREJHKCJjbnQ9JWRcbiIsIGNvdW50KTsKLQotCWlmIChjb3VudCAmIDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGF1ZGlvLT5tb2RlICE9IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0JLyogaWYgc3VwcGxpZWQgY291bnQgaXMgbW9yZSB0aGFuIGRyaXZlciBidWZmZXIgc2l6ZQotCSAqIHRoZW4gb25seSBjb3B5IGRyaXZlciBidWZmZXIgc2l6ZQotCSAqLwotCWlmIChjb3VudCA+IGZyYW1lLT5zaXplKQotCQljb3VudCA9IGZyYW1lLT5zaXplOwotCi0Jd3JpdGVfY291bnQgPSBjb3VudDsKLQljcHlfcHRyID0gZnJhbWUtPmRhdGE7Ci0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJICAgICAgKGZyYW1lLT51c2VkID09IDApCi0JCQkJCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWlmIChhdWRpby0+bWZpZWxkKSB7Ci0JCWlmIChidWYgPT0gc3RhcnQpIHsKLQkJCS8qIFByb2Nlc3NpbmcgYmVnaW5uaW5nIG9mIHVzZXIgYnVmZmVyICovCi0JCQlpZiAoX19nZXRfdXNlcihtZmllbGRfc2l6ZSwKLQkJCQkodW5zaWduZWQgc2hvcnQgX191c2VyICopIGJ1ZikpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0gZWxzZSBpZiAobWZpZWxkX3NpemUgPiBjb3VudCkgewotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJTU1fREJHKCJtZiBvZmZzZXRfdmFsICV4XG4iLCBtZmllbGRfc2l6ZSk7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCBtZmllbGRfc2l6ZSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCS8qIENoZWNrIGlmIEVPUyBmbGFnIGlzIHNldCBhbmQgYnVmZmVyIGhhcwotCQkJICogY29udGFpbnMganVzdCBtZXRhIGZpZWxkCi0JCQkgKi8KLQkJCWlmIChjcHlfcHRyW0FVRFBSRVBST0NfQUFDX0VPU19GTEdfT0ZGU0VUXSAmCi0JCQkJCUFVRFBSRVBST0NfQUFDX0VPU19GTEdfTUFTSykgewotCQkJCWVvc19jb25kaXRpb24gPSBBVURQUkVQUk9DX0FBQ19FT1NfU0VUOwotCQkJCU1NX0RCRygiRU9TIFNFVFxuIik7Ci0JCQkJaWYgKG1maWVsZF9zaXplID09IGNvdW50KSB7Ci0JCQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKLQkJCQkJZW9zX2NvbmRpdGlvbiA9IDA7Ci0JCQkJCWdvdG8gZXhpdDsKLQkJCQl9IGVsc2UKLQkJCQljcHlfcHRyW0FVRFBSRVBST0NfQUFDX0VPU19GTEdfT0ZGU0VUXSAmPQotCQkJCQl+QVVEUFJFUFJPQ19BQUNfRU9TX0ZMR19NQVNLOwotCQkJfQotCQkJY3B5X3B0ciArPSBtZmllbGRfc2l6ZTsKLQkJCWNvdW50IC09IG1maWVsZF9zaXplOwotCQkJYnVmICs9IG1maWVsZF9zaXplOwotCQl9IGVsc2UgewotCQkJbWZpZWxkX3NpemUgPSAwOwotCQkJTU1fREJHKCJjb250aW51b3VzIGJ1ZmZlclxuIik7Ci0JCX0KLQkJZnJhbWUtPm1maWVsZF9zeiA9IG1maWVsZF9zaXplOwotCX0KLQlNTV9EQkcoImNvcHlpbmcgdGhlIHN0cmVhbSBjb3VudCA9ICVkXG4iLCBjb3VudCk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGNweV9wdHIsIGJ1ZiwgY291bnQpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBlcnJvcjsKLQl9Ci1leGl0OgotCWZyYW1lLT51c2VkID0gY291bnQ7Ci0JYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JaWYgKCFhdWRpby0+Zmx1c2hfYWNrKQotCQlhdWRyZWNfcGNtX3NlbmRfZGF0YShhdWRpbywgMCk7Ci0JZWxzZSB7Ci0JCWF1ZHJlY19wY21fc2VuZF9kYXRhKGF1ZGlvLCAxKTsKLQkJYXVkaW8tPmZsdXNoX2FjayA9IDA7Ci0JfQotCWlmIChlb3NfY29uZGl0aW9uID09IEFVRFBSRVBST0NfQUFDX0VPU19TRVQpCi0JCXJjID0gYXVkcmVjX2FhY19wcm9jZXNzX2VvcyhhdWRpbywgc3RhcnQsIG1maWVsZF9zaXplKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlyZXR1cm4gd3JpdGVfY291bnQ7Ci1lcnJvcjoKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkYWFjX2luX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvX2FhY19pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkYWFjX2luX2Rpc2FibGUoYXVkaW8pOwotCWF1ZGFhY19pbl9mbHVzaChhdWRpbyk7Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRyZWMpOwotCi0KLQlhdWRwcmVwcm9jX2FlbmNfZnJlZShhdWRpby0+ZW5jX2lkKTsKLQlhdWRpby0+YXVkcmVjID0gTlVMTDsKLQlhdWRpby0+b3BlbmVkID0gMDsKLQotCWlmICgoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUwpICYmIFwKLQkgICAoYXVkaW8tPm91dF9kYXRhKSkgewotCQlpb25fdW5tYXBfa2VybmVsKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSk7Ci0JCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSk7Ci0JCWF1ZGlvLT5vdXRfZGF0YSA9IE5VTEw7Ci0JfQotCi0JaWYgKGF1ZGlvLT5kYXRhKSB7Ci0JCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci0JCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotCQlhdWRpby0+ZGF0YSA9IE5VTEw7Ci0JfQotCWlvbl9jbGllbnRfZGVzdHJveShhdWRpby0+Y2xpZW50KTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IGF1ZGlvX2FhY19pbiB0aGVfYXVkaW9fYWFjX2luOwotCi1zdGF0aWMgaW50IGF1ZGFhY19pbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpb19hYWNfaW4gKmF1ZGlvID0gJnRoZV9hdWRpb19hYWNfaW47Ci0JaW50IHJjOwotCWludCBlbmNpZDsKLQlpbnQgZG1hX3NpemUgPSAwOwotCWludCBsZW4gPSAwOwotCXVuc2lnbmVkIGxvbmcgaW9uZmxhZyA9IDA7Ci0JaW9uX3BoeXNfYWRkcl90IGFkZHIgPSAwOwotCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUgPSBOVUxMOwotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQgPSBOVUxMOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWlmIChhdWRpby0+b3BlbmVkKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlhdWRpby0+bW9kZSA9IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMOwotCQlkbWFfc2l6ZSA9IE5UX0RNQVNaOwotCQlNTV9EQkcoIk9wZW5lZCBmb3Igbm9uIHR1bm5lbCBtb2RlIGVuY29kaW5nXG4iKTsKLQl9IGVsc2UgaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWF1ZGlvLT5tb2RlID0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUw7Ci0JCWRtYV9zaXplID0gRE1BU1o7Ci0JCU1NX0RCRygiT3BlbmVkIGZvciB0dW5uZWwgbW9kZSBlbmNvZGluZ1xuIik7Ci0JfSBlbHNlIHsKLQkJTU1fRVJSKCJJbnZhbGlkIG1vZGVcbiIpOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBTZXR0aW5ncyB3aWxsIGJlIHJlLWNvbmZpZyBhdCBBVURJT19TRVRfQ09ORklHLAotCSAqIGJ1dCBhdCBsZWFzdCB3ZSBuZWVkIHRvIGhhdmUgaW5pdGlhbCBjb25maWcKLQkgKi8KLQlhdWRpby0+c2FtcF9yYXRlID0gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMTEwMjU7Ci0JYXVkaW8tPnNhbXBfcmF0ZV9pbmRleCA9IEFVRFJFQ19DTURfU0FNUF9SQVRFX0lORFhfMTEwMjU7Ci0KLQkvKiBGb3IgQUFDLCBiaXQgcmF0ZSBoYXJkIGNvZGVkLCBkZWZhdWx0IHNldHRpbmdzIGlzCi0JICogc2FtcGxlIHJhdGUgKDExMDI1KSB4IGNoYW5uZWwgY291bnQgKDEpIHggcmVjb3JkaW5nIHF1YWxpdHkgKDEuNzUpCi0JICogPSAxOTI5MyBicHMgICovCi0JYXVkaW8tPmJpdF9yYXRlID0gMTkyOTM7Ci0JYXVkaW8tPnJlY29yZF9xdWFsaXR5ID0gMHgxYzAwOwotCi0JYXVkaW8tPmNoYW5uZWxfbW9kZSA9IEFVRFJFQ19DTURfU1RFUkVPX01PREVfTU9OTzsKLQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUwpCi0JCQlhdWRpby0+YnVmZmVyX3NpemUgPSAoQUFDX0ZSQU1FX1NJWkUgKyAxNCk7Ci0JZWxzZQotCQkJYXVkaW8tPmJ1ZmZlcl9zaXplID0gKEZSQU1FX1NJWkUgLSA4KTsKLQlhdWRpby0+ZW5jX3R5cGUgPSBBVURSRUNfQ01EX1RZUEVfMF9JTkRFWF9BQUMgfCBhdWRpby0+bW9kZTsKLQotCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkgewotCQlyYyA9IGF1ZG1ncl9vcGVuKCZhdWRpby0+YXVkbWdyKTsKLQkJaWYgKHJjKQotCQkJZ290byBkb25lOwotCX0KLQotCWVuY2lkID0gYXVkcHJlcHJvY19hZW5jX2FsbG9jKGF1ZGlvLT5lbmNfdHlwZSwgJmF1ZGlvLT5tb2R1bGVfbmFtZSwKLQkJCSZhdWRpby0+cXVldWVfaWRzKTsKLQlpZiAoZW5jaWQgPCAwKSB7Ci0JCU1NX0VSUigiTm8gZnJlZSBlbmNvZGVyIGF2YWlsYWJsZVxuIik7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQlhdWRpby0+ZW5jX2lkID0gZW5jaWQ7Ci0KLQlyYyA9IG1zbV9hZHNwX2dldChhdWRpby0+bW9kdWxlX25hbWUsICZhdWRpby0+YXVkcmVjLAotCQkJICAgJmF1ZHJlY19hYWNfYWRzcF9vcHMsIGF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJYXVkcHJlcHJvY19hZW5jX2ZyZWUoYXVkaW8tPmVuY19pZCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhdWRpby0+ZHNwX2NudCA9IDA7Ci0JYXVkaW8tPnN0b3BwZWQgPSAwOwotCWF1ZGlvLT53Zmx1c2ggPSAwOwotCWF1ZGlvLT5yZmx1c2ggPSAwOwotCWF1ZGlvLT5mbHVzaF9hY2sgPSAwOwotCi0JYXVkYWFjX2luX2ZsdXNoKGF1ZGlvKTsKLQlhdWRhYWNfb3V0X2ZsdXNoKGF1ZGlvKTsKLQotCi0JY2xpZW50ID0gbXNtX2lvbl9jbGllbnRfY3JlYXRlKFVJTlRfTUFYLCAiQXVkaW9fQUFDX2luX2NsaWVudCIpOwotCWlmIChJU19FUlJfT1JfTlVMTChjbGllbnQpKSB7Ci0JCU1NX0VSUigiVW5hYmxlIHRvIGNyZWF0ZSBJT04gY2xpZW50XG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGNsaWVudF9jcmVhdGVfZXJyb3I7Ci0JfQotCWF1ZGlvLT5jbGllbnQgPSBjbGllbnQ7Ci0KLQlNTV9EQkcoImFsbG9jYXRpbmcgbWVtIHN6ID0gJWRcbiIsIGRtYV9zaXplKTsKLQloYW5kbGUgPSBpb25fYWxsb2MoY2xpZW50LCBkbWFfc2l6ZSwgU1pfNEssCi0JCUlPTl9IRUFQKElPTl9BVURJT19IRUFQX0lEKSwgMCk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGhhbmRsZSkpIHsKLQkJTU1fRVJSKCJVbmFibGUgdG8gY3JlYXRlIGFsbG9jYXRlIE8vUCBidWZmZXJzXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dHB1dF9idWZmX2FsbG9jX2Vycm9yOwotCX0KLQotCWF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUgPSBoYW5kbGU7Ci0KLQlyYyA9IGlvbl9waHlzKGNsaWVudCAsIGhhbmRsZSwgJmFkZHIsICZsZW4pOwotCWlmIChyYykgewotCQlNTV9FUlIoIk8vUCBidWZmZXJzOkludmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I7Ci0JfSBlbHNlIHsKLQkJTU1fSU5GTygiTy9QIGJ1ZmZlcnM6dmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCX0KLQlhdWRpby0+cGh5cyA9IChpbnQzMl90KWFkZHI7Ci0KLQlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKGNsaWVudCwgaGFuZGxlLCAmaW9uZmxhZyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiY291bGQgbm90IGdldCBmbGFncyBmb3IgdGhlIGhhbmRsZVxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRwdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I7Ci0JfQotCi0JYXVkaW8tPm1hcF92X3JlYWQgPSBpb25fbWFwX2tlcm5lbChjbGllbnQsIGhhbmRsZSk7Ci0JaWYgKElTX0VSUihhdWRpby0+bWFwX3ZfcmVhZCkpIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgbWFwIHJlYWQgYnVmZmVycyxmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQkoaW50KWF1ZGlvKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dHB1dF9idWZmX21hcF9lcnJvcjsKLQl9Ci0JYXVkaW8tPmRhdGEgPSBhdWRpby0+bWFwX3ZfcmVhZDsKLQlNTV9EQkcoInJlYWQgYnVmOiBwaHkgYWRkciAweCUwOHgga2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQlhdWRpby0+cGh5cywgKGludClhdWRpby0+ZGF0YSk7Ci0KLQlhdWRpby0+b3V0X2RhdGEgPSBOVUxMOwotCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkgewotCi0JCU1NX0RCRygiYWxsb2NhdGluZyBCVUZGRVJfU0laRSAgJWRcbiIsIEJVRkZFUl9TSVpFKTsKLQkJaGFuZGxlID0gaW9uX2FsbG9jKGNsaWVudCwgQlVGRkVSX1NJWkUsCi0JCQkJU1pfNEssIElPTl9IRUFQKElPTl9BVURJT19IRUFQX0lEKSwgMCk7Ci0JCWlmIChJU19FUlJfT1JfTlVMTChoYW5kbGUpKSB7Ci0JCQlNTV9FUlIoIlVuYWJsZSB0byBjcmVhdGUgYWxsb2NhdGUgSS9QIGJ1ZmZlcnNcbiIpOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBpbnB1dF9idWZmX2FsbG9jX2Vycm9yOwotCQl9Ci0KLQkJYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlID0gaGFuZGxlOwotCi0JCXJjID0gaW9uX3BoeXMoY2xpZW50ICwgaGFuZGxlLCAmYWRkciwgJmxlbik7Ci0JCWlmIChyYykgewotCQkJTU1fRVJSKCJJL1AgYnVmZmVyczpJbnZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGlucHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9JTkZPKCJHb3QgdmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkJKHVuc2lnbmVkIGludCkgYWRkciwKLQkJCQkodW5zaWduZWQgaW50KSBsZW4pOwotCQl9Ci0JCWF1ZGlvLT5vdXRfcGh5cyA9IChpbnQzMl90KWFkZHI7Ci0KLQkJcmMgPSBpb25faGFuZGxlX2dldF9mbGFncyhjbGllbnQsCi0JCQloYW5kbGUsICZpb25mbGFnKTsKLQkJaWYgKHJjKSB7Ci0JCQlNTV9FUlIoImNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIpOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBpbnB1dF9idWZmX2dldF9mbGFnc19lcnJvcjsKLQkJfQotCi0JCWF1ZGlvLT5tYXBfdl93cml0ZSA9IGlvbl9tYXBfa2VybmVsKGNsaWVudCwgaGFuZGxlKTsKLQkJaWYgKElTX0VSUihhdWRpby0+bWFwX3Zfd3JpdGUpKSB7Ci0JCQlNTV9FUlIoImNvdWxkIG5vdCBtYXAgd3JpdGUgYnVmZmVyc1xuIik7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGlucHV0X2J1ZmZfbWFwX2Vycm9yOwotCQl9Ci0JCWF1ZGlvLT5vdXRfZGF0YSA9IGF1ZGlvLT5tYXBfdl93cml0ZTsKLQkJTU1fREJHKCJ3cml0ZSBidWY6IHBoeSBhZGRyIDB4JTA4eCBrZXJuZWwgYWRkciAweCUwOHhcbiIsCi0JCQkJCSh1bnNpZ25lZCBpbnQpYWRkciwKLQkJCQkJKHVuc2lnbmVkIGludClhdWRpby0+b3V0X2RhdGEpOwotCi0JCS8qIEluaXRpYWxpemUgYnVmZmVyICovCi0JCWF1ZGlvLT5vdXRbMF0uZGF0YSA9IGF1ZGlvLT5vdXRfZGF0YSArIDA7Ci0JCWF1ZGlvLT5vdXRbMF0uYWRkciA9IGF1ZGlvLT5vdXRfcGh5cyArIDA7Ci0JCWF1ZGlvLT5vdXRbMF0uc2l6ZSA9IE9VVF9CVUZGRVJfU0laRTsKLQotCQlhdWRpby0+b3V0WzFdLmRhdGEgPSBhdWRpby0+b3V0X2RhdGEgKyBPVVRfQlVGRkVSX1NJWkU7Ci0JCWF1ZGlvLT5vdXRbMV0uYWRkciA9IGF1ZGlvLT5vdXRfcGh5cyArIE9VVF9CVUZGRVJfU0laRTsKLQkJYXVkaW8tPm91dFsxXS5zaXplID0gT1VUX0JVRkZFUl9TSVpFOwotCi0JCU1NX0RCRygiYXVkaW8tPm91dFswXS5kYXRhID0gJWQgIGF1ZGlvLT5vdXRbMV0uZGF0YSA9ICVkIiwKLQkJCQkodW5zaWduZWQgaW50KWF1ZGlvLT5vdXRbMF0uZGF0YSwKLQkJCQkodW5zaWduZWQgaW50KWF1ZGlvLT5vdXRbMV0uZGF0YSk7Ci0JCWF1ZGlvLT5tZmllbGQgPSBOVF9GUkFNRV9IRUFERVJfU0laRTsKLQkJYXVkaW8tPm91dF9mcmFtZV9jbnQrKzsKLQl9Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0JYXVkaW8tPm9wZW5lZCA9IDE7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotaW5wdXRfYnVmZl9tYXBfZXJyb3I6Ci1pbnB1dF9idWZmX2dldF9mbGFnc19lcnJvcjoKLWlucHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I6Ci0JaW9uX2ZyZWUoY2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotaW5wdXRfYnVmZl9hbGxvY19lcnJvcjoKLQlpb25fdW5tYXBfa2VybmVsKGNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci1vdXRwdXRfYnVmZl9tYXBfZXJyb3I6Ci1vdXRwdXRfYnVmZl9nZXRfcGh5c19lcnJvcjoKLW91dHB1dF9idWZmX2dldF9mbGFnc19lcnJvcjoKLQlpb25fZnJlZShjbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotb3V0cHV0X2J1ZmZfYWxsb2NfZXJyb3I6Ci0JaW9uX2NsaWVudF9kZXN0cm95KGNsaWVudCk7Ci1jbGllbnRfY3JlYXRlX2Vycm9yOgotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcmVjKTsKLQotCWF1ZHByZXByb2NfYWVuY19mcmVlKGF1ZGlvLT5lbmNfaWQpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYWFjX2luX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGF1ZGFhY19pbl9vcGVuLAotCS5yZWxlYXNlCT0gYXVkYWFjX2luX3JlbGVhc2UsCi0JLnJlYWQJCT0gYXVkYWFjX2luX3JlYWQsCi0JLndyaXRlCQk9IGF1ZGFhY19pbl93cml0ZSwKLQkuZnN5bmMJCT0gYXVkYWFjX2luX2ZzeW5jLAotCS51bmxvY2tlZF9pb2N0bAk9IGF1ZGFhY19pbl9pb2N0bCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRhYWNfaW5fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX2FhY19pbiIsCi0JLmZvcHMJPSAmYXVkaW9fYWFjX2luX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRhYWNfaW5faW5pdCh2b2lkKQotewotCW11dGV4X2luaXQoJnRoZV9hdWRpb19hYWNfaW4ubG9jayk7Ci0JbXV0ZXhfaW5pdCgmdGhlX2F1ZGlvX2FhY19pbi5yZWFkX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZ0aGVfYXVkaW9fYWFjX2luLmRzcF9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfYXVkaW9fYWFjX2luLndhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoZV9hdWRpb19hYWNfaW4ud2FpdF9lbmFibGUpOwotCW11dGV4X2luaXQoJnRoZV9hdWRpb19hYWNfaW4ud3JpdGVfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdGhlX2F1ZGlvX2FhY19pbi53cml0ZV93YWl0KTsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkYWFjX2luX21pc2MpOwotfQotZGV2aWNlX2luaXRjYWxsKGF1ZGFhY19pbl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX2FjMy5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fYWMzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OWIzMjIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fYWMzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYwICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL2F1ZGlvX2FjMy5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDksIDIwMTEtMjAxMyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIGNvZGUgYWxzbyBib3Jyb3dzIGZyb20gYXVkaW9fYWFjLmMsIHdoaWNoIGlzCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGZpbmQgaXQgYXQgaHR0cDovL3d3dy5mc2Yub3JnLgotICovCi0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZWFybHlzdXNwZW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19hYzMuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdS5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXVfZG9tYWlucy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcGNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHBtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHAuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcGxheWNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcGxheW1zZy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVybXRjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX21lbXR5cGVzLmg+Ci0KLSNpbmNsdWRlICJhdWRtZ3IuaCIKLQotI2RlZmluZSBCVUZTWgkJCTQwOTYKLSNkZWZpbmUgRE1BU1oJCQkoQlVGU1ogKiAyKQotCi0jZGVmaW5lIEFVRERFQ19ERUNfQUMzCQkyMwotCi0jZGVmaW5lIFBDTV9CVUZTWgkJNjE2OCAvKiBtYXhpbXVtIGZyYW1lIHNpemUgaXMgNTEyICogNiBzYW1wbGVzICovCi0jZGVmaW5lIFBDTV9CVUZfTUFYX0NPVU5UCTUgIC8qIERTUCBvbmx5IGFjY2VwdHMgNSBidWZmZXJzIGF0IG1vc3QKLQkJCQkgICAgKiBidXQgc3VwcG9ydCAyIGJ1ZmZlcnMgY3VycmVudGx5Ci0JCQkJICAgKi8KLSNkZWZpbmUgUk9VVElOR19NT0RFX0ZUUlQJMQotI2RlZmluZSBST1VUSU5HX01PREVfUlQJCTIKLQotLyogRGVjb2RlciBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBBVURQUFRBU0sgKi8KLSNkZWZpbmUgQVVEUFBfREVDX1NUQVRVU19TTEVFUAkwCi0jZGVmaW5lCUFVRFBQX0RFQ19TVEFUVVNfSU5JVCAgMQotI2RlZmluZSBBVURQUF9ERUNfU1RBVFVTX0NGRyAgIDIKLSNkZWZpbmUgQVVEUFBfREVDX1NUQVRVU19QTEFZICAzCi0KLSNkZWZpbmUgQVVEQUMzX01FVEFGSUVMRF9NQVNLIDB4RkZGRjAwMDAKLSNkZWZpbmUgQVVEQUMzX0VPU19GTEdfT0ZGU0VUIDB4MEEgLyogT2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIGJ1ZmZlciAqLwotI2RlZmluZSBBVURBQzNfRU9TX0ZMR19NQVNLIDB4MDEKLSNkZWZpbmUgQVVEQUMzX0VPU19OT05FIDB4MCAvKiBObyBFT1MgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgQVVEQUMzX0VPU19TRVQgMHgxIC8qIEVPUyBzZXQgaW4gbWV0YSBmaWVsZCAqLwotCi0jZGVmaW5lIEFVREFDM19FVkVOVF9OVU0gMTAgLyogRGVmYXVsdCBudW1iZXIgb2YgcHJlLWFsbG9jYXRlZCBldmVudCBwYWNrZXRzICovCi0KLXN0cnVjdCBidWZmZXIgewotCXZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgc2l6ZTsKLQl1bnNpZ25lZCB1c2VkOwkJLyogSW5wdXQgdXNhZ2UgYWN0dWFsIERTUCBwcm9kdWNlZCBQQ00gc2l6ZSAgKi8KLQl1bnNpZ25lZCBhZGRyOwotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zejsgLyogb25seSB1c2VmdWwgZm9yIGRhdGEgaGFzIG1ldGEgZmllbGQgKi8KLX07Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RydWN0IGF1ZGFjM19zdXNwZW5kX2N0bCB7Ci0Jc3RydWN0IGVhcmx5X3N1c3BlbmQgbm9kZTsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvOwotfTsKLSNlbmRpZgotCi1zdHJ1Y3QgYXVkYWMzX2V2ZW50IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JaW50IGV2ZW50X3R5cGU7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLX07Ci0KLXN0cnVjdCBhdWRpbyB7Ci0Jc3RydWN0IGJ1ZmZlciBvdXRbMl07Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JdWludDhfdCBvdXRfaGVhZDsKLQl1aW50OF90IG91dF90YWlsOwotCXVpbnQ4X3Qgb3V0X25lZWRlZDsJLyogbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGRzcCBpcyB3YWl0aW5nIGZvciAqLwotCi0JYXRvbWljX3Qgb3V0X2J5dGVzOwotCi0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IG11dGV4IHdyaXRlX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd3JpdGVfd2FpdDsKLQotCS8qIEhvc3QgUENNIHNlY3Rpb24gKi8KLQlzdHJ1Y3QgYnVmZmVyIGluW1BDTV9CVUZfTUFYX0NPVU5UXTsKLQlzdHJ1Y3QgbXV0ZXggcmVhZF9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHJlYWRfd2FpdDsJLyogV2FpdCBxdWV1ZSBmb3IgcmVhZCAqLwotCWNoYXIgKnJlYWRfZGF0YTsJLyogcG9pbnRlciB0byByZWFkZXIgYnVmZmVyICovCi0JaW50MzJfdCByZWFkX3BoeXM7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgcmVhZGVyIGJ1ZmZlciAqLwotCXVpbnQ4X3QgcmVhZF9uZXh0OwkvKiBpbmRleCB0byBpbnB1dCBidWZmZXJzIHRvIGJlIHJlYWQgbmV4dCAqLwotCXVpbnQ4X3QgZmlsbF9uZXh0OwkvKiBpbmRleCB0byBidWZmZXIgdGhhdCBEU1Agc2hvdWxkIGJlIGZpbGxpbmcgKi8KLQl1aW50OF90IHBjbV9idWZfY291bnQ7CS8qIG51bWJlciBvZiBwY20gYnVmZmVyIGFsbG9jYXRlZCAqLwotCS8qIC0tLS0gRW5kIG9mIEhvc3QgUENNIHNlY3Rpb24gKi8KLQotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKmF1ZHBsYXk7Ci0Jc3RydWN0IGF1ZG1nciBhdWRtZ3I7Ci0Jc3RydWN0IG1zbV9hdWRpb19hYzNfY29uZmlnIGFjM19jb25maWc7Ci0KLQkvKiBkYXRhIGFsbG9jYXRlZCBmb3IgdmFyaW91cyBidWZmZXJzICovCi0JY2hhciAqZGF0YTsKLQlpbnQzMl90IHBoeXM7ICAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHdyaXRlIGJ1ZmZlciAqLwotCXZvaWQgKm1hcF92X3JlYWQ7Ci0Jdm9pZCAqbWFwX3Zfd3JpdGU7Ci0KLQlpbnQgbWZpZWxkOyAvKiBtZXRhIGZpZWxkIGVtYmVkZGVkIGluIGRhdGEgKi8KLQlpbnQgcmZsdXNoOyAvKiBSZWFkICBmbHVzaCAqLwotCWludCB3Zmx1c2g7IC8qIFdyaXRlIGZsdXNoICovCi0JdWludDhfdCBvcGVuZWQ7Ci0JdWludDhfdCBlbmFibGVkOwotCXVpbnQ4X3QgcnVubmluZzsKLQl1aW50OF90IHN0b3BwZWQ7CS8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQl1aW50OF90IHBjbV9mZWVkYmFjazsKLQl1aW50OF90IGJ1Zl9yZWZyZXNoOwotCWludCB0ZW9zOyAvKiB2YWxpZCBvbmx5IGlmIHR1bm5lbCBtb2RlICYgbm8gZGF0YSBsZWZ0IGZvciBkZWNvZGVyICovCi0JZW51bSBtc21fYXVkX2RlY29kZXJfc3RhdGUgZGVjX3N0YXRlOwkvKiBSZXByZXNlbnRzIGRlY29kZXIgc3RhdGUgKi8KLQlpbnQgcm10X3Jlc291cmNlX3JlbGVhc2VkOwotCi0JY29uc3QgY2hhciAqbW9kdWxlX25hbWU7Ci0JdW5zaWduZWQgcXVldWVfaWQ7Ci0JdWludDE2X3QgZGVjX2lkOwotCXVpbnQzMl90IHJlYWRfcHRyX29mZnNldDsKLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0Jc3RydWN0IGF1ZGFjM19zdXNwZW5kX2N0bCBzdXNwZW5kX2N0bDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotI2VuZGlmCi0KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9ldmVudF9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50X3F1ZXVlOwotCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3dhaXQ7Ci0Jc3BpbmxvY2tfdCBldmVudF9xdWV1ZV9sb2NrOwotCXN0cnVjdCBtdXRleCBnZXRfZXZlbnRfbG9jazsKLQlpbnQgZXZlbnRfYWJvcnQ7Ci0KLQlpbnQgZXFfZW5hYmxlOwotCWludCBlcV9uZWVkc19jb21taXQ7Ci0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyIGVxOwotCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUgdm9sX3BhbjsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBpb25faGFuZGxlICppbnB1dF9idWZmX2hhbmRsZTsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqb3V0cHV0X2J1ZmZfaGFuZGxlOwotfTsKLQotc3RhdGljIGludCBhdWRkZWNfZHNwX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKTsKLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX3JvdXRpbmdfbW9kZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZGFjM19zZW5kX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgbmVlZGVkKTsKLXN0YXRpYyB2b2lkIGF1ZGFjM19kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpOwotc3RhdGljIHZvaWQgYXVkYWMzX2NvbmZpZ19ob3N0cGNtKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkYWMzX2J1ZmZlcl9yZWZyZXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdGF0aWMgdm9pZCBhdWRhYzNfcG9zdF9ldmVudChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCk7Ci0jZW5kaWYKLQotc3RhdGljIGludCBybXRfcHV0X3Jlc291cmNlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZF9jb2RlY19jb25maWdfY21kIGNtZDsKLQl1bnNpZ25lZCBzaG9ydCBjbGllbnRfaWR4OwotCi0JY21kLmNtZF9pZCA9IFJNX0NNRF9BVURfQ09ERUNfQ0ZHOwotCWNtZC5jbGllbnRfaWQgPSBSTV9BVURfQ0xJRU5UX0lEOwotCWNtZC50YXNrX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuZW5hYmxlID0gUk1UX0RJU0FCTEU7Ci0JY21kLmRlY190eXBlID0gQVVEREVDX0RFQ19BQzM7Ci0JY2xpZW50X2lkeCA9ICgoY21kLmNsaWVudF9pZCA8PCA4KSB8IGNtZC50YXNrX2lkKTsKLQotCXJldHVybiBwdXRfYWRzcF9yZXNvdXJjZShjbGllbnRfaWR4LCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgcm10X2dldF9yZXNvdXJjZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRfY29kZWNfY29uZmlnX2NtZCBjbWQ7Ci0JdW5zaWduZWQgc2hvcnQgY2xpZW50X2lkeDsKLQotCWNtZC5jbWRfaWQgPSBSTV9DTURfQVVEX0NPREVDX0NGRzsKLQljbWQuY2xpZW50X2lkID0gUk1fQVVEX0NMSUVOVF9JRDsKLQljbWQudGFza19pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmVuYWJsZSA9IFJNVF9FTkFCTEU7Ci0JY21kLmRlY190eXBlID0gQVVEREVDX0RFQ19BQzM7Ci0JY2xpZW50X2lkeCA9ICgoY21kLmNsaWVudF9pZCA8PCA4KSB8IGNtZC50YXNrX2lkKTsKLQlyZXR1cm4gZ2V0X2Fkc3BfcmVzb3VyY2UoY2xpZW50X2lkeCwgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkYWMzX2VuYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRtZ3JfY29uZmlnIGNmZzsKLQlpbnQgcmM7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCi0JaWYgKGF1ZGlvLT5lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWlmIChhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID09IDEpIHsKLQkJYXVkaW8tPnJtdF9yZXNvdXJjZV9yZWxlYXNlZCA9IDA7Ci0JCXJjID0gcm10X2dldF9yZXNvdXJjZShhdWRpbyk7Ci0JCWlmIChyYykgewotCQkJTU1fRVJSKCJBRFNQIHJlc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgQUMzIlwKLQkJCQkiIHNlc3Npb24gMHglMDh4IG9uIGRlY29kZXI6ICVkXG4gSWdub3JpbmciXAotCQkJCSIgZXJyb3IgYW5kIGdvaW5nIGFoZWFkIHdpdGggdGhlIHBsYXliYWNrXG4iLAotCQkJCShpbnQpYXVkaW8sIGF1ZGlvLT5kZWNfaWQpOwotCQl9Ci0JfQotCi0JYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCWF1ZGlvLT5vdXRfdGFpbCA9IDA7Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCi0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spIHsKLQkJY2ZnLnR4X3JhdGUgPSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV9OT05FOwotCQljZmcucnhfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzQ4MDAwOwotCQljZmcuZGVmX21ldGhvZCA9IFJQQ19BVURfREVGX01FVEhPRF9QTEFZQkFDSzsKLQkJY2ZnLmNvZGVjID0gUlBDX0FVRF9ERUZfQ09ERUNfQUMzOwotCQljZmcuc25kX21ldGhvZCA9IFJQQ19TTkRfTUVUSE9EX01JREk7Ci0KLQkJcmMgPSBhdWRtZ3JfZW5hYmxlKCZhdWRpby0+YXVkbWdyLCAmY2ZnKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJbXNtX2Fkc3BfZHVtcChhdWRpby0+YXVkcGxheSk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0KLQlpZiAobXNtX2Fkc3BfZW5hYmxlKGF1ZGlvLT5hdWRwbGF5KSkgewotCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRwbGF5KSBmYWlsZWRcbiIpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykKLQkJCWF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKGF1ZHBwX2VuYWJsZShhdWRpby0+ZGVjX2lkLCBhdWRhYzNfZHNwX2V2ZW50LCBhdWRpbykpIHsKLQkJTU1fRVJSKCJhdWRwcF9lbmFibGUoKSBmYWlsZWRcbiIpOwotCQltc21fYWRzcF9kaXNhYmxlKGF1ZGlvLT5hdWRwbGF5KTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spCi0JCQlhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRhYzNfZGlzYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWludCByYyA9IDA7Ci0JaWYgKGF1ZGlvLT5lbmFibGVkKSB7Ci0JCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCQlhdWRkZWNfZHNwX2NvbmZpZyhhdWRpbywgMCk7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXQsCi0JCQkJYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORSwKLQkJCQltc2Vjc190b19qaWZmaWVzKE1TTV9BVURfREVDT0RFUl9XQUlUX01TKSk7Ci0JCWlmIChyYyA9PSAwKQotCQkJcmMgPSAtRVRJTUVET1VUOwotCQllbHNlIGlmIChhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlhdWRwcF9kaXNhYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spIHsKLQkJCXJjID0gYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQltc21fYWRzcF9kdW1wKGF1ZGlvLT5hdWRwbGF5KTsKLQkJfQotCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCXJtdF9wdXRfcmVzb3VyY2UoYXVkaW8pOwotCQlhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID0gMTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHZvaWQgYXVkYWMzX3VwZGF0ZV9wY21fYnVmX2VudHJ5KHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCQkJCSB1aW50MzJfdCAqcGF5bG9hZCkKLXsKLQl1aW50OF90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoYXVkaW8tPnJmbHVzaCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBheWxvYWRbMV07IGluZGV4KyspIHsKLQkJaWYgKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyCi0JCQkJPT0gcGF5bG9hZFsyICsgaW5kZXggKiAyXSkgewotCQkJTU1fREJHKCJpblslZF0gcmVhZHlcbiIsIGF1ZGlvLT5maWxsX25leHQpOwotCQkJYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnVzZWQgPQotCQkJCXBheWxvYWRbMyArIGluZGV4ICogMl07Ci0JCQlpZiAoKCsrYXVkaW8tPmZpbGxfbmV4dCkgPT0gYXVkaW8tPnBjbV9idWZfY291bnQpCi0JCQkJYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0KLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiZXhwZWN0ZWQ9JXggcmV0PSV4XG4iLAotCQkJCWF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyLAotCQkJCXBheWxvYWRbMSArIGluZGV4ICogMl0pOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS51c2VkID09IDApIHsKLQkJYXVkYWMzX2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQl9IGVsc2UgewotCQlNTV9EQkcoInJlYWQgY2Fubm90IGtlZXAgdXBcbiIpOwotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAxOwotCX0KLQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGxheV9kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgICB2b2lkICgqZ2V0ZXZlbnQpICh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBkYXRhOwotCXVpbnQzMl90IG1zZ1syOF07Ci0JZ2V0ZXZlbnQobXNnLCBzaXplb2YobXNnKSk7Ci0KLQlNTV9EQkcoIm1zZ19pZD0leFxuIiwgaWQpOwotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBMQVlfTVNHX0RFQ19ORUVEU19EQVRBOgotCQlhdWRhYzNfc2VuZF9kYXRhKGF1ZGlvLCAxKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURQTEFZX01TR19CVUZGRVJfVVBEQVRFOgotCQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCQlhdWRhYzNfdXBkYXRlX3BjbV9idWZfZW50cnkoYXVkaW8sIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgQURTUF9NRVNTQUdFX0lEOgotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6IG1vZHVsZSBlbmFibGUoYXVkcGxheXRhc2spXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJ1bmV4cGVjdGVkIG1lc3NhZ2UgZnJvbSBkZWNvZGVyXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFjM19kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IHByaXZhdGU7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQUF9NU0dfU1RBVFVTX01TRzp7Ci0JCQl1bnNpZ25lZCBzdGF0dXMgPSBtc2dbMV07Ci0KLQkJCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfU0xFRVA6IHsKLQkJCQl1aW50MTZfdCByZWFzb24gPSBtc2dbMl07Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czpzbGVlcCByZWFzb24gPTB4JTA0eFxuIiwKLQkJCQkJcmVhc29uKTsKLQkJCQlpZiAoKHJlYXNvbiA9PSBBVURQUF9NU0dfUkVBU09OX01FTSkKLQkJCQkJfHwgKHJlYXNvbiA9PQotCQkJCQlBVURQUF9NU0dfUkVBU09OX05PREVDT0RFUikpIHsKLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfRkFJTFVSRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0gZWxzZSBpZiAocmVhc29uID09IEFVRFBQX01TR19SRUFTT05fTk9ORSkgewotCQkJCQkvKiBkZWNvZGVyIGlzIGluIGRpc2FibGUgc3RhdGUgKi8KLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfQ0xPU0U7Ci0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfSU5JVDoKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBpbml0XG4iKTsKLQkJCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJCQkJYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoYXVkaW8pOwotCQkJCWVsc2UKLQkJCQkJYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhhdWRpbyk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19DRkc6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogY2ZnXG4iKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19QTEFZOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IHBsYXlcbiIpOwotCQkJCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCQkJCWF1ZGFjM19jb25maWdfaG9zdHBjbShhdWRpbyk7Ci0JCQkJCWF1ZGFjM19idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JCQkJfQotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfU1VDQ0VTUzsKLQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCU1NX0VSUigidW5rbm93biBkZWNvZGVyIHN0YXR1c1xuIik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVEUFBfTVNHX0NGR19NU0c6Ci0JCWlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9FTkEpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBFTkFCTEVcbiIpOwotCQkJYXVkZGVjX2RzcF9jb25maWcoYXVkaW8sIDEpOwotCQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAxOwotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3Bhbik7Ci0JCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsCWF1ZGlvLT5lcV9lbmFibGUsCi0JCQkJCQkJCSZhdWRpby0+ZXEpOwotCQkJYXVkcHBfYXZzeW5jKGF1ZGlvLT5kZWNfaWQsIDIyMDUwKTsKLQkJfSBlbHNlIGlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9ESVMpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBESVNBQkxFXG4iKTsKLQkJCWF1ZHBwX2F2c3luYyhhdWRpby0+ZGVjX2lkLCAwKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyAlZD9cbiIsIG1zZ1swXSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfUk9VVElOR19BQ0s6Ci0JCU1NX0RCRygiUk9VVElOR19BQ0tcbiIpOwotCQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfRkxVU0hfQUNLOgotCQlNTV9EQkcoIkZMVVNIX0FDS1xuIik7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJCWF1ZGFjM19idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX1BDTURNQU1JU1NFRDoKLQkJTU1fREJHKCJQQ01ETUFNSVNTRURcbiIpOwotCQlhdWRpby0+dGVvcyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJVTktOT1dOICglZClcbiIsIGlkKTsKLQl9Ci0KLX0KLQotc3RydWN0IG1zbV9hZHNwX29wcyBhdWRwbGF5X2Fkc3Bfb3BzX2FjMyA9IHsKLQkuZXZlbnQgPSBhdWRwbGF5X2RzcF9ldmVudCwKLX07Ci0KLSNkZWZpbmUgYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcGxheSwgYXVkaW8tPnF1ZXVlX2lkLCBcCi0JCQljbWQsIGxlbikKLQotc3RhdGljIGludCBhdWRkZWNfZHNwX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCXUxNiBjZmdfZGVjX2NtZFtBVURQUF9DTURfQ0ZHX0RFQ19UWVBFX0xFTiAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCldOwotCi0JbWVtc2V0KGNmZ19kZWNfY21kLCAwLCBzaXplb2YoY2ZnX2RlY19jbWQpKTsKLQotCWNmZ19kZWNfY21kWzBdID0gQVVEUFBfQ01EX0NGR19ERUNfVFlQRTsKLQlpZiAoZW5hYmxlKQotCQljZmdfZGVjX2NtZFsxICsgYXVkaW8tPmRlY19pZF0gPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCUFVRFBQX0NNRF9FTkFfREVDX1YgfCBBVURERUNfREVDX0FDMzsKLQllbHNlCi0JCWNmZ19kZWNfY21kWzEgKyBhdWRpby0+ZGVjX2lkXSA9IEFVRFBQX0NNRF9VUERBVERFX0NGR19ERUMgfAotCQkJQVVEUFBfQ01EX0RJU19ERUNfVjsKLQotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMSgmY2ZnX2RlY19jbWQsIHNpemVvZihjZmdfZGVjX2NtZCkpOwotfQotc3RhdGljIGludCBnZXRfZnJlcXVlbmN5X2luZGV4KHVuc2lnbmVkIHNob3J0IGZyZXF1ZW5jeSkKLXsKLQlzd2l0Y2ggKGZyZXF1ZW5jeSkgewotCWNhc2UgNDgwMDA6IHJldHVybiAwOwotCWNhc2UgNDQxMDA6IHJldHVybiAxOwotCWNhc2UgMzIwMDA6IHJldHVybiAyOwotCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOwotCX0KLX0KLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19hYzMgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY29tbW9uLmNtZF9pZCA9IEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVM7Ci0JLyogZHNwIG5lZWRzIHdvcmQgc2l6ZSAqLwotCWNtZC5jb21tb24ubGVuZ3RoID0gQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNU19BQzNfTEVOID4+IDE7Ci0JY21kLmNvbW1vbi5kZWNfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5jb21tb24uaW5wdXRfc2FtcGxpbmdfZnJlcXVlbmN5ID0gKGF1ZGlvLT5hYzNfY29uZmlnKS5mc0NvZDsKLQotCWNtZC5pbmRleFswXSA9ICgoKGF1ZGlvLT5hYzNfY29uZmlnKS5udW1DaGFucyA8PCA4KSAmIDB4RkYwMCkgfAotCQkJCSgoYXVkaW8tPmFjM19jb25maWcpLndvcmRTaXplICYgMHgwMEZGKTsKLQotCWNtZC5pbmRleFsxXSA9ICgoKGF1ZGlvLT5hYzNfY29uZmlnKS5rQ2FwYWJsZU1vZGUgPDwgMTIpICYgMHhGMDAwKSB8Ci0JCQkJKCgoYXVkaW8tPmFjM19jb25maWcpLmNvbXBNb2RlIDw8IDgpICYgMHgwRjAwKSB8Ci0JCQkJKCgoYXVkaW8tPmFjM19jb25maWcpLm91dExmZU9uIDw8IDQpICYgMHgwMEYwKSB8Ci0JCQkJKChhdWRpby0+YWMzX2NvbmZpZykub3V0cHV0TW9kZSAmIDB4MDAwRik7Ci0KLQljbWQuaW5kZXhbMl0gPSAoKCgoYXVkaW8tPmFjM19jb25maWcpLnN0ZXJlb01vZGUgPDwgMTIpICYgMHhGMDAwKSB8Ci0JCQkoKChhdWRpby0+YWMzX2NvbmZpZykuZHVhbE1vbm9Nb2RlIDw8IDgpICYgMHgwRjAwKSB8Ci0JCQkoKGdldF9mcmVxdWVuY3lfaW5kZXgoKGF1ZGlvLT5hYzNfY29uZmlnKS5mc0NvZCkgPDwgNCkKLQkJCSYgMHgwMEYwKSkgJiAweEZGRjA7IC8qIGxhc3QgNCBieXRlcyBhcmUgcmVzZXJ2ZWQgKi8KLQotCWNtZC5pbmRleFszXSA9IChhdWRpby0+YWMzX2NvbmZpZykucGNtU2NhbGVGYWM7Ci0JY21kLmluZGV4WzRdID0gKGF1ZGlvLT5hYzNfY29uZmlnKS5keW5SbmdTY2FsZUhpOwotCWNtZC5pbmRleFs1XSA9IChhdWRpby0+YWMzX2NvbmZpZykuZHluUm5nU2NhbGVMb3c7Ci0KLQljbWQuaW5kZXhbNl0gPSAoKChhdWRpby0+YWMzX2NvbmZpZykudXNlcl9kb3dubWl4X2ZsYWcgPDwgOCkgJiAweEZGMDApfAotCQkJKChhdWRpby0+YWMzX2NvbmZpZykudXNlcl9rYXJhb2tlX2ZsYWcgJiAweDAwRkYpOwotCi0JY21kLmluZGV4WzddID0gKGF1ZGlvLT5hYzNfY29uZmlnKS5kbV9hZGRyZXNzX2hpZ2g7Ci0JY21kLmluZGV4WzhdID0gKGF1ZGlvLT5hYzNfY29uZmlnKS5kbV9hZGRyZXNzX2xvdzsKLQljbWQuaW5kZXhbOV0gPSAoYXVkaW8tPmFjM19jb25maWcpLmtvX2FkZHJlc3NfaGlnaDsKLQljbWQuaW5kZXhbMTBdID0gKGF1ZGlvLT5hYzNfY29uZmlnKS5rb19hZGRyZXNzX2hpZ2g7Ci0KLQljbWQuaW5kZXhbMTFdID0gKCgoYXVkaW8tPmFjM19jb25maWcpLm1heF9yZXBfY291bnQgPDwgMSkgJiAweEZGRkUpIHwKLQkJCSgoYXVkaW8tPmFjM19jb25maWcpLmVycm9yX2NvbmNlYWxtZW50ICYgMHgwMDAxKTsKLQotCWNtZC5pbmRleFsxMl0gPSAoKChhdWRpby0+YWMzX2NvbmZpZykuY2hhbm5lbF9yb3V0aW5nX21vZGVbM10gPDwgMTIpCi0JCQkmIDB4RjAwMCkgfAotCQkJKCgoYXVkaW8tPmFjM19jb25maWcpLmNoYW5uZWxfcm91dGluZ19tb2RlWzJdIDw8IDgpCi0JCQkmIDB4MEYwMCkgfAotCQkJKCgoYXVkaW8tPmFjM19jb25maWcpLmNoYW5uZWxfcm91dGluZ19tb2RlWzFdIDw8IDQpCi0JCQkmIDB4MDBGMCkgfAotCQkJKChhdWRpby0+YWMzX2NvbmZpZykuY2hhbm5lbF9yb3V0aW5nX21vZGVbMF0gJiAweDAwMEYpOwotCi0JY21kLmluZGV4WzEzXSA9ICgoKChhdWRpby0+YWMzX2NvbmZpZykuY2hhbm5lbF9yb3V0aW5nX21vZGVbNV0gPDwgMTIpCi0JCQkmIDB4RjAwMCkgfAotCQkJKCgoYXVkaW8tPmFjM19jb25maWcpLmNoYW5uZWxfcm91dGluZ19tb2RlWzRdIDw8IDgpCi0JCQkmIDB4MEYwMCkpICYgMHhGRjAwOyAvKiBsYXN0IDggYnl0ZXMgYXJlIHJlc2VydmVkICovCi0KLQlhdWRwcF9zZW5kX3F1ZXVlMigmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9yb3V0aW5nX21vZGUgY21kOwotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUFBfQ01EX1JPVVRJTkdfTU9ERTsKLQljbWQub2JqZWN0X251bWJlciA9IGF1ZGlvLT5kZWNfaWQ7Ci0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfRlRSVDsKLQllbHNlCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfUlQ7Ci0KLQlhdWRwcF9zZW5kX3F1ZXVlMSgmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcGxheV9kc3Bfc2VuZF9kYXRhX2F2YWlsKHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCQkJICAgICAgIHVuc2lnbmVkIGlkeCwgdW5zaWduZWQgbGVuKQotewotCXN0cnVjdCBhdWRwbGF5X2NtZF9iaXRzdHJlYW1fZGF0YV9hdmFpbF9udDIgY21kOwotCi0JY21kLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0JJVFNUUkVBTV9EQVRBX0FWQUlMX05UMjsKLQlpZiAoYXVkaW8tPm1maWVsZCkKLQkJY21kLmRlY29kZXJfaWQgPSBBVURBQzNfTUVUQUZJRUxEX01BU0sgfAotCQkJKGF1ZGlvLT5vdXRbaWR4XS5tZmllbGRfc3ogPj4gMSk7Ci0JZWxzZQotCQljbWQuZGVjb2Rlcl9pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmJ1Zl9wdHIgPSBhdWRpby0+b3V0W2lkeF0uYWRkcjsKLQljbWQuYnVmX3NpemUgPSBsZW4gLyAyOwotCWNtZC5wYXJ0aXRpb25fbnVtYmVyID0gMDsKLQkvKiBjb21wbGV0ZSB3cml0ZXMgdG8gdGhlIGlucHV0IGJ1ZmZlciAqLwotCXdtYigpOwotCXJldHVybiBhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFjM19idWZmZXJfcmVmcmVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwbGF5X2NtZF9idWZmZXJfcmVmcmVzaCByZWZyZXNoX2NtZDsKLQotCXJlZnJlc2hfY21kLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0JVRkZFUl9SRUZSRVNIOwotCXJlZnJlc2hfY21kLm51bV9idWZmZXJzID0gMTsKLQlyZWZyZXNoX2NtZC5idWYwX2FkZHJlc3MgPSBhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uYWRkcjsKLQlyZWZyZXNoX2NtZC5idWYwX2xlbmd0aCA9IGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5zaXplOwotCi0JcmVmcmVzaF9jbWQuYnVmX3JlYWRfY291bnQgPSAwOwotCU1NX0RCRygiYnVmMF9hZGRyPSV4IGJ1ZjBfbGVuPSVkXG4iLCByZWZyZXNoX2NtZC5idWYwX2FkZHJlc3MsCi0JCQlyZWZyZXNoX2NtZC5idWYwX2xlbmd0aCk7Ci0JKHZvaWQpYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJnJlZnJlc2hfY21kLCBzaXplb2YocmVmcmVzaF9jbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkYWMzX2NvbmZpZ19ob3N0cGNtKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2hwY21fYnVmX2NmZyBjZmdfY21kOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQljZmdfY21kLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0hQQ01fQlVGX0NGRzsKLQljZmdfY21kLm1heF9idWZmZXJzID0gMTsKLQljZmdfY21kLmJ5dGVfc3dhcCA9IDA7Ci0JY2ZnX2NtZC5ob3N0cGNtX2NvbmZpZyA9ICgweDgwMDApIHwgKDB4NDAwMCk7Ci0JY2ZnX2NtZC5mZWVkYmFja19mcmVxdWVuY3kgPSAxOwotCWNmZ19jbWQucGFydGl0aW9uX251bWJlciA9IDA7Ci0JKHZvaWQpYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJmNmZ19jbWQsIHNpemVvZihjZmdfY21kKSk7Ci0KLX0KLQotc3RhdGljIHZvaWQgYXVkYWMzX3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWF1ZGlvLT5ydW5uaW5nKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAobmVlZGVkICYmICFhdWRpby0+d2ZsdXNoKSB7Ci0JCS8qIFdlIHdlcmUgY2FsbGVkIGZyb20gdGhlIGNhbGxiYWNrIGJlY2F1c2UgdGhlIERTUAotCQkgKiByZXF1ZXN0ZWQgbW9yZSBkYXRhLiAgTm90ZSB0aGF0IHRoZSBEU1AgZG9lcyB3YW50Ci0JCSAqIG1vcmUgZGF0YSwgYW5kIGlmIGEgYnVmZmVyIHdhcyBpbi1mbGlnaHQsIG1hcmsgaXQKLQkJICogYXMgYXZhaWxhYmxlIChzaW5jZSB0aGUgRFNQIG11c3Qgbm93IGJlIGRvbmUgd2l0aAotCQkgKiBpdCkuCi0JCSAqLwotCQlhdWRpby0+b3V0X25lZWRlZCA9IDE7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpIHsKLQkJCU1NX0RCRygiZnJhbWUgJWQgZnJlZVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJCWZyYW1lLT51c2VkID0gMDsKLQkJCWF1ZGlvLT5vdXRfdGFpbCBePSAxOwotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl9Ci0JfQotCi0JaWYgKGF1ZGlvLT5vdXRfbmVlZGVkKSB7Ci0JCS8qIElmIHRoZSBEU1AgY3VycmVudGx5IHdhbnRzIGRhdGEgYW5kIHdlIGhhdmUgYQotCQkgKiBidWZmZXIgYXZhaWxhYmxlLCB3ZSB3aWxsIHNlbmQgaXQgYW5kIHJlc2V0Ci0JCSAqIHRoZSBuZWVkZWQgZmxhZy4gIFdlJ2xsIG1hcmsgdGhlIGJ1ZmZlciBhcyBpbi1mbGlnaHQKLQkJICogc28gdGhhdCBpdCB3b24ndCBiZSByZWN5Y2xlZCB1bnRpbCB0aGUgbmV4dCBidWZmZXIKLQkJICogaXMgcmVxdWVzdGVkCi0JCSAqLwotCi0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkKSB7Ci0JCQlCVUdfT04oZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZik7Ci0JCQlNTV9EQkcoImZyYW1lICVkIGJ1c3lcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JCQlhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoYXVkaW8sIGF1ZGlvLT5vdXRfdGFpbCwKLQkJCQkJCSAgICBmcmFtZS0+dXNlZCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDB4ZmZmZmZmZmY7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCX0KLQl9Ci1kb25lOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHZvaWQgYXVkYWMzX2ZsdXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdWRpby0+b3V0WzBdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRbMV0udXNlZCA9IDA7Ci0JYXVkaW8tPm91dF9oZWFkID0gMDsKLQlhdWRpby0+b3V0X3RhaWwgPSAwOwotCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdG9taWNfc2V0KCZhdWRpby0+b3V0X2J5dGVzLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkYWMzX2ZsdXNoX3BjbV9idWYoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1aW50OF90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUENNX0JVRl9NQVhfQ09VTlQ7IGluZGV4KyspCi0JCWF1ZGlvLT5pbltpbmRleF0udXNlZCA9IDA7Ci0JYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLS8qY2hlY2sgaWYgZnVuYyB0byBiZSBhZGRlZCB0byB2YWxpZGF0ZSB1c2VyIGRhdGEqLwotCi1zdGF0aWMgdm9pZCBhdWRhYzNfaW9wb3J0X3Jlc2V0KHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JLyogTWFrZSBzdXJlIHJlYWQvd3JpdGUgdGhyZWFkIGFyZSBmcmVlIGZyb20KLQkgKiBzbGVlcCBhbmQga25vd2luZyB0aGF0IHN5c3RlbSBpcyBub3QgYWJsZQotCSAqIHRvIHByb2Nlc3MgaW8gcmVxdWVzdCBhdCB0aGUgbW9tZW50Ci0JICovCi0Jd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlhdWRhYzNfZmx1c2goYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCWF1ZGFjM19mbHVzaF9wY21fYnVmKGF1ZGlvKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotfQotCi1zdGF0aWMgaW50IGF1ZGFjM19ldmVudHNfcGVuZGluZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGVtcHR5OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JZW1wdHkgPSAhbGlzdF9lbXB0eSgmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCXJldHVybiBlbXB0eSB8fCBhdWRpby0+ZXZlbnRfYWJvcnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFjM19yZXNldF9ldmVudF9xdWV1ZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGF1ZGFjM19ldmVudCAqZHJ2X2V2dDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmV2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWRhYzNfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJc3RydWN0IGF1ZGFjM19ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQkJa2ZyZWUoZHJ2X2V2dCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLQotc3RhdGljIGxvbmcgYXVkYWMzX3Byb2Nlc3NfZXZlbnRfcmVxKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHZvaWQgX191c2VyICphcmcpCi17Ci0JbG9uZyByYzsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50IHVzcl9ldnQ7Ci0Jc3RydWN0IGF1ZGFjM19ldmVudCAqZHJ2X2V2dCA9IE5VTEw7Ci0JaW50IHRpbWVvdXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmdXNyX2V2dCwgYXJnLCBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19ldmVudCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXRpbWVvdXQgPSAoaW50KSB1c3JfZXZ0LnRpbWVvdXRfbXM7Ci0KLQlpZiAodGltZW91dCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCgKLQkJCWF1ZGlvLT5ldmVudF93YWl0LCBhdWRhYzNfZXZlbnRzX3BlbmRpbmcoYXVkaW8pLAotCQkJbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7Ci0JCWlmIChyYyA9PSAwKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JfSBlbHNlIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCi0JCQlhdWRpby0+ZXZlbnRfd2FpdCwgYXVkYWMzX2V2ZW50c19wZW5kaW5nKGF1ZGlvKSk7Ci0JfQotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGF1ZGlvLT5ldmVudF9hYm9ydCkgewotCQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAwOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyYyA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSkpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkYWMzX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCX0KLQlpZiAoZHJ2X2V2dCkgewotCQl1c3JfZXZ0LmV2ZW50X3R5cGUgPSBkcnZfZXZ0LT5ldmVudF90eXBlOwotCQl1c3JfZXZ0LmV2ZW50X3BheWxvYWQgPSBkcnZfZXZ0LT5wYXlsb2FkOwotCQlsaXN0X2FkZF90YWlsKCZkcnZfZXZ0LT5saXN0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCX0gZWxzZQotCQlyYyA9IC0xOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIXJjICYmIGNvcHlfdG9fdXNlcihhcmcsICZ1c3JfZXZ0LCBzaXplb2YodXNyX2V2dCkpKQotCQlyYyA9IC1FRkFVTFQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZW5hYmxlX2VxKHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0JaWYgKGF1ZGlvLT5lcV9lbmFibGUgPT0gZW5hYmxlICYmICFhdWRpby0+ZXFfbmVlZHNfY29tbWl0KQotCQlyZXR1cm4gMDsKLQotCWF1ZGlvLT5lcV9lbmFibGUgPSBlbmFibGU7Ci0KLQlpZiAoYXVkaW8tPnJ1bm5pbmcpIHsKLQkJYXVkcHBfZHNwX3NldF9lcShhdWRpby0+ZGVjX2lkLCBlbmFibGUsICZhdWRpby0+ZXEpOwotCQlhdWRpby0+ZXFfbmVlZHNfY29tbWl0ID0gMDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIGF1ZGFjM19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXVpbnQxNl90IGVuYWJsZV9tYXNrOwotCWludCBlbmFibGU7Ci0JaW50IHByZXZfc3RhdGU7Ci0JdW5zaWduZWQgbG9uZyBpb25mbGFnID0gMDsKLQlpb25fcGh5c19hZGRyX3QgYWRkciA9IDA7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7Ci0JaW50IGxlbiA9IDA7Ci0KLQlNTV9EQkcoImNtZCA9ICVkXG4iLCBjbWQpOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0VOQUJMRV9BVURQUDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZlbmFibGVfbWFzaywgKHZvaWQgKikgYXJnLAotCQkJCQkJc2l6ZW9mKGVuYWJsZV9tYXNrKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQllbmFibGUgPSAoZW5hYmxlX21hc2sgJiBFUV9FTkFCTEUpID8gMSA6IDA7Ci0JCWF1ZGlvX2VuYWJsZV9lcShhdWRpbywgZW5hYmxlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3Bhbik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfUEFOOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnBhbiA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3Bhbik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfRVE6Ci0JCXByZXZfc3RhdGUgPSBhdWRpby0+ZXFfZW5hYmxlOwotCQlhdWRpby0+ZXFfZW5hYmxlID0gMDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhdWRpby0+ZXEubnVtX2JhbmRzLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGF1ZGlvLT5lcSkgLQotCQkJCShBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfQ09NTU9OX0xFTiArIDIpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPmVxX2VuYWJsZSA9IHByZXZfc3RhdGU7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAxOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCWlmICgtRUlOVkFMICE9IHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9FVkVOVCkgewotCQlNTV9EQkcoIkFVRElPX0dFVF9FVkVOVFxuIik7Ci0JCWlmIChtdXRleF90cnlsb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spKSB7Ci0JCQlyYyA9IGF1ZGFjM19wcm9jZXNzX2V2ZW50X3JlcShhdWRpbywKLQkJCQkJKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCQltdXRleF91bmxvY2soJmF1ZGlvLT5nZXRfZXZlbnRfbG9jayk7Ci0JCX0gZWxzZQotCQkJcmMgPSAtRUJVU1k7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlpZiAoY21kID09IEFVRElPX0FCT1JUX0dFVF9FVkVOVCkgewotCQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0JCXJldHVybiAwOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6Ci0JCU1NX0RCRygiQVVESU9fU1RBUlRcbiIpOwotCQlyYyA9IGF1ZGFjM19lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUsCi0JCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0RFQ09ERVJfV0FJVF9NUykpOwotCQkJTU1fSU5GTygiZGVjX3N0YXRlICVkIHJjID0gJWRcbiIsIGF1ZGlvLT5kZWNfc3RhdGUsIHJjKTsKLQotCQkJaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1MpIHsKLQkJCQlNTV9FUlIoIkluIGF1ZGlvLT5kZWNfc3RhdGUgIT1cbiIpOwotCQkJCXJjID0gLUVOT0RFVjsKLQkJCX0gZWxzZQotCQkJCXJjID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NUT1A6Ci0JCU1NX0RCRygiQVVESU9fU1RPUFxuIik7Ci0JCXJjID0gYXVkYWMzX2Rpc2FibGUoYXVkaW8pOwotCQlhdWRhYzNfaW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQljYXNlIEFVRElPX0ZMVVNIOgotCQlNTV9EQkcoIkFVRElPX0ZMVVNIXG4iKTsKLQkJYXVkaW8tPnJmbHVzaCA9IDE7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAxOwotCQlhdWRhYzNfaW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCQlhdWRwcF9mbHVzaChhdWRpby0+ZGVjX2lkKTsKLQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCSFhdWRpby0+d2ZsdXNoKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlNTV9FUlIoIkFVRElPX0ZMVVNIIGludGVycnVwdGVkXG4iKTsKLQkJCQlyYyA9IC1FSU5UUjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcgotCQkJCSgmY29uZmlnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYXVkaW8tPm1maWVsZCA9IGNvbmZpZy5tZXRhX2ZpZWxkOwotCQkJcmMgPSAwOwotCQkJTU1fREJHKCJBVURJT19TRVRfQ09ORklHIGFwcGxpY2FibGUgb25seSJcCi0JCQkJIiBmb3IgbWV0YSBmaWVsZCBjb25maWd1cmF0aW9uXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19HRVRfQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IEJVRlNaOwotCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IDI7Ci0JCQljb25maWcuc2FtcGxlX3JhdGUgPSAoYXVkaW8tPmFjM19jb25maWcpLmZzQ29kOwotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSAyOwotCQkJY29uZmlnLm1ldGFfZmllbGQgPSAwOwotCQkJY29uZmlnLnVudXNlZFswXSA9IDA7Ci0JCQljb25maWcudW51c2VkWzFdID0gMDsKLQkJCWNvbmZpZy51bnVzZWRbMl0gPSAwOwotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fR0VUX0FDM19DT05GSUc6ewotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmF1ZGlvLT5hYzNfY29uZmlnLAotCQkJCXNpemVvZihhdWRpby0+YWMzX2NvbmZpZykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fU0VUX0FDM19DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19hYzNfY29uZmlnIHVzcl9jb25maWc7Ci0KLQkJCWlmIChjb3B5X2Zyb21fdXNlcgotCQkJCSgmdXNyX2NvbmZpZywgKHZvaWQgKilhcmcsCi0JCQkJCXNpemVvZih1c3JfY29uZmlnKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWF1ZGlvLT5hYzNfY29uZmlnID0gdXNyX2NvbmZpZzsKLQkJCXJjID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19HRVRfUENNX0NPTkZJRzp7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX3BjbV9jb25maWcgY29uZmlnOwotCQkJY29uZmlnLnBjbV9mZWVkYmFjayA9IGF1ZGlvLT5wY21fZmVlZGJhY2s7Ci0JCQljb25maWcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9NQVhfQ09VTlQ7Ci0JCQljb25maWcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1o7Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY29uZmlnLCBzaXplb2YoY29uZmlnKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19TRVRfUENNX0NPTkZJRzp7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX3BjbV9jb25maWcgY29uZmlnOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkgICAgKCZjb25maWcsICh2b2lkICopYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY29uZmlnLnBjbV9mZWVkYmFjayAhPSBhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0KLQkJCQlNTV9FUlIoIk5vdCBzdWZmaWNpZW50IHBlcm1pc3Npb24gdG8iXAotCQkJCQkiIGNoYW5nZSB0aGUgcGxheWJhY2sgbW9kZVxuIik7Ci0JCQkJcmMgPSAtRUFDQ0VTOwotCQkJCWJyZWFrOwotCi0JCQl9Ci0JCQlpZiAoKGNvbmZpZy5idWZmZXJfY291bnQgPiBQQ01fQlVGX01BWF9DT1VOVCkgfHwKLQkJCSAgICAoY29uZmlnLmJ1ZmZlcl9jb3VudCA9PSAxKSkKLQkJCQljb25maWcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9NQVhfQ09VTlQ7Ci0KLQkJCWlmIChjb25maWcuYnVmZmVyX3NpemUgPCBQQ01fQlVGU1opCi0JCQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaOwotCi0JCQkvKiBDaGVjayBpZiBwY20gZmVlZGJhY2sgaXMgcmVxdWlyZWQgKi8KLQkJCWlmICgoY29uZmlnLnBjbV9mZWVkYmFjaykgJiYgKCFhdWRpby0+cmVhZF9kYXRhKSkgewotCQkJCU1NX0RCRygiYWxsb2NhdGUgUENNIGJ1ZiAlZFxuIiwKLQkJCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCAqCi0JCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSk7Ci0JCQkJaGFuZGxlID0gaW9uX2FsbG9jKGF1ZGlvLT5jbGllbnQsCi0JCQkJCShjb25maWcuYnVmZmVyX3NpemUgKgotCQkJCQljb25maWcuYnVmZmVyX2NvdW50KSwKLQkJCQkJU1pfNEssIElPTl9IRUFQKElPTl9BVURJT19IRUFQX0lEKSwgMCk7Ci0JCQkJaWYgKElTX0VSUl9PUl9OVUxMKGhhbmRsZSkpIHsKLQkJCQkJTU1fRVJSKCJVbmFibGUgdG8gYWxsb2MgSS9QIGJ1ZmZzXG4iKTsKLQkJCQkJYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlID0gTlVMTDsKLQkJCQkJcmMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgPSBoYW5kbGU7Ci0KLQkJCQlyYyA9IGlvbl9waHlzKGF1ZGlvLT5jbGllbnQgLAotCQkJCQloYW5kbGUsICZhZGRyLCAmbGVuKTsKLQkJCQlpZiAocmMpIHsKLQkJCQkJTU1fRVJSKCJJbnZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJCQkJKHVuc2lnbmVkIGludCkgYWRkciwKLQkJCQkJCSh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JCQkJCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci0JCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTU1fSU5GTygiR290IHZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJCQkJKHVuc2lnbmVkIGludCkgYXVkaW8tPnJlYWRfcGh5cywKLQkJCQkJCSh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JCQkJfQotCQkJCWF1ZGlvLT5yZWFkX3BoeXMgPSAoaW50MzJfdClhZGRyOwotCi0JCQkJcmMgPSBpb25faGFuZGxlX2dldF9mbGFncyhhdWRpby0+Y2xpZW50LAotCQkJCQloYW5kbGUsICZpb25mbGFnKTsKLQkJCQlpZiAocmMpIHsKLQkJCQkJTU1fRVJSKCJjb3VsZCBub3QgZ2V0IGZsYWdzXG4iKTsKLQkJCQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgaGFuZGxlKTsKLQkJCQkJYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlID0gTlVMTDsKLQkJCQkJcmMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlhdWRpby0+bWFwX3ZfcmVhZCA9IGlvbl9tYXBfa2VybmVsKAotCQkJCQlhdWRpby0+Y2xpZW50LCBoYW5kbGUpOwotCQkJCWlmIChJU19FUlIoYXVkaW8tPm1hcF92X3JlYWQpKSB7Ci0JCQkJCU1NX0VSUigibWFwIG9mIHJlYWQgYnVmIGZhaWxlZFxuIik7Ci0JCQkJCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci0JCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQl9IGVsc2UgewotCQkJCQl1aW50OF90IGluZGV4OwotCQkJCQl1aW50MzJfdCBvZmZzZXQgPSAwOwotCQkJCQlhdWRpby0+cmVhZF9kYXRhID0KLQkJCQkJCWF1ZGlvLT5tYXBfdl9yZWFkOwotCQkJCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCQkJCQlhdWRpby0+cGNtX2J1Zl9jb3VudCA9Ci0JCQkJCSAgICBjb25maWcuYnVmZmVyX2NvdW50OwotCQkJCQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQkJCQkJYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0KLQkJCQkJZm9yIChpbmRleCA9IDA7Ci0JCQkJCSAgICAgaW5kZXggPCBjb25maWcuYnVmZmVyX2NvdW50OwotCQkJCQkgICAgIGluZGV4KyspIHsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0uZGF0YSA9Ci0JCQkJCQkgICAgYXVkaW8tPnJlYWRfZGF0YSArIG9mZnNldDsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0uYWRkciA9Ci0JCQkJCQkgICAgYXVkaW8tPnJlYWRfcGh5cyArIG9mZnNldDsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9Ci0JCQkJCQkgICAgY29uZmlnLmJ1ZmZlcl9zaXplOwotCQkJCQkJYXVkaW8tPmluW2luZGV4XS51c2VkID0gMDsKLQkJCQkJCW9mZnNldCArPSBjb25maWcuYnVmZmVyX3NpemU7Ci0JCQkJCX0KLQkJCQkJTU1fREJHKCJyZWFkIGJ1ZjogcGh5IGFkZHIiXAotCQkJCQkJIiAweCUwOHgga2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQkJCQkJYXVkaW8tPnJlYWRfcGh5cywKLQkJCQkJCShpbnQpYXVkaW8tPnJlYWRfZGF0YSk7Ci0JCQkJCXJjID0gMDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJjID0gMDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19QQVVTRToKLQkJTU1fREJHKCJBVURJT19QQVVTRSAlbGRcbiIsIGFyZyk7Ci0JCXJjID0gYXVkcHBfcGF1c2UoYXVkaW8tPmRlY19pZCwgKGludCkgYXJnKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIE9ubHkgdXNlZnVsIGluIHR1bm5lbC1tb2RlICovCi1zdGF0aWMgaW50IGF1ZGFjM19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IGEsIGxvZmZfdCBiLCBpbnQgZGF0YXN5bmMpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoIWF1ZGlvLT5ydW5uaW5nIHx8IGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmVfbm9sb2NrOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoIWF1ZGlvLT5vdXRbMF0udXNlZCAmJgotCQkhYXVkaW8tPm91dFsxXS51c2VkICYmCi0JCWF1ZGlvLT5vdXRfbmVlZGVkKSB8fCBhdWRpby0+d2ZsdXNoKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQllbHNlIGlmIChhdWRpby0+d2ZsdXNoKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogcGNtIGRtYW1pc3MgbWVzc2FnZSBpcyBzZW50IGNvbnRpbm91c2x5Ci0JICogd2hlbiBkZWNvZGVyIGlzIHN0YXJ2ZWQgc28gbm8gcmFjZQotCSAqIGNvbmRpdGlvbiBjb25jZXJuCi0JICovCi0JYXVkaW8tPnRlb3MgPSAwOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCWF1ZGlvLT50ZW9zIHx8IGF1ZGlvLT53Zmx1c2gpOwotCi0JaWYgKGF1ZGlvLT53Zmx1c2gpCi0JCXJjID0gLUVCVVNZOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotZG9uZV9ub2xvY2s6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRhYzNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJICAgIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCWludCByYyA9IDA7Ci0JaWYgKCFhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCU1NX0VSUigicmV0dXJuaW5nIGZyb20gcmVhZCBhcyB0dW5uZWwgbW9kZVxuIik7Ci0JCXJldHVybiAwOwotCQkvKiBQQ00gZmVlZGJhY2sgaXMgbm90IGVuYWJsZWQuIE5vdGhpbmcgdG8gcmVhZCAqLwotCX0KLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPnJlYWRfd2FpdCwKLQkJCQkoYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQgPiAwKSB8fAotCQkJCShhdWRpby0+c3RvcHBlZCkgfHwgKGF1ZGlvLT5yZmx1c2gpKTsKLQotCQlNTV9EQkcoIndhaXQgdGVybWluYXRlZCBjb3VudCVkXG4iLCBjb3VudCk7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQkJaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT5yZmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvdW50IDwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQpIHsKLQkJCS8qIFJlYWQgbXVzdCBoYXBwZW4gaW4gZnJhbWUgYm91bmRhcnkuIFNpbmNlIGRyaXZlciBkb2VzCi0JCQkgKiBub3Qga25vdyBmcmFtZSBzaXplLCByZWFkIGNvdW50IG11c3QgYmUgZ3JlYXRlciBvcgotCQkJICogZXF1YWwgdG8gc2l6ZSBvZiBQQ00gc2FtcGxlcwotCQkJICovCi0JCQlNTV9EQkcoInJlYWQgc3RvcCAtIHBhcnRpYWwgZnJhbWVcbiIpOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9EQkcoInJlYWQgZnJvbSBpblslZF1cbiIsIGF1ZGlvLT5yZWFkX25leHQpOwotCQkJLyogb3JkZXIgcmVhZHMgZnJvbSB0aGUgb3V0cHV0IGJ1ZmZlciAqLwotCQkJcm1iKCk7Ci0JCQlpZiAoY29weV90b191c2VyCi0JCQkgICAgKGJ1ZiwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLmRhdGEsCi0JCQkgICAgIGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkKSkgewotCQkJCU1NX0VSUigiaW52YWxpZCBhZGRyICV4XG4iLAotCQkJCSAgICAgICAodW5zaWduZWQgaW50KWJ1Zik7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY291bnQgLT0gYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQ7Ci0JCQlidWYgKz0gYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQ7Ci0JCQlhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCA9IDA7Ci0JCQlpZiAoKCsrYXVkaW8tPnJlYWRfbmV4dCkgPT0gYXVkaW8tPnBjbV9idWZfY291bnQpCi0JCQkJYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JCQlicmVhazsKLQkJCQkvKiBGb3JjZSB0byBleGl0IHdoaWxlIGxvb3AKLQkJCQkgKiB0byBwcmV2ZW50IG91dHB1dCB0aHJlYWQKLQkJCQkgKiBzbGVlcCB0b28gbG9uZyBpZiBkYXRhIGlzCi0JCQkJICogbm90IHJlYWR5IGF0IHRoaXMgbW9tZW50Ci0JCQkJICovCi0KLQkJfQotCX0KLQkvKiBkb24ndCBmZWVkIG91dHB1dCBidWZmZXIgdG8gSFcgZGVjb2RlciBkdXJpbmcgZmx1c2hpbmcKLQkgKiBidWZmZXIgcmVmcmVzaCBjb21tYW5kIHdpbGwgYmUgc2VudCBvbmNlIGZsdXNoIGNvbXBsZXRlcwotCSAqIHNlbmQgYnVmIHJlZnJlc2ggY29tbWFuZCBoZXJlIGNhbiBjb25mdXNlIEhXIGRlY29kZXIKLQkgKi8KLQlpZiAoYXVkaW8tPmJ1Zl9yZWZyZXNoICYmICFhdWRpby0+cmZsdXNoKSB7Ci0JCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDA7Ci0JCU1NX0RCRygia2ljayBzdGFydCBwY20gZmVlZGJhY2sgYWdhaW5cbiIpOwotCQlhdWRhYzNfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCWlmIChidWYgPiBzdGFydCkKLQkJcmMgPSBidWYgLSBzdGFydDsKLQlNTV9EQkcoInJlYWQgJWQgYnl0ZXNcbiIsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkYWMzX3Byb2Nlc3NfZW9zKHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCWNvbnN0IGNoYXIgX191c2VyICpidWZfc3RhcnQsIHVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0KLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKGF1ZGlvLT5vdXRfbmVlZGVkICYmCi0JCWF1ZGlvLT5vdXRbMF0udXNlZCA9PSAwICYmCi0JCWF1ZGlvLT5vdXRbMV0udXNlZCA9PSAwKQotCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoZnJhbWUtPmRhdGEsIGJ1Zl9zdGFydCwgbWZpZWxkX3NpemUpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlmcmFtZS0+dXNlZCA9IG1maWVsZF9zaXplOwotCWF1ZGFjM19zZW5kX2RhdGEoYXVkaW8sIDApOwotCi1kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkYWMzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCXNpemVfdCB4ZmVyOwotCWNoYXIgKmNweV9wdHI7Ci0JdW5zaWduZWQgc2hvcnQgbWZpZWxkX3NpemUgPSAwOwotCWludCByYyA9IDAsIGVvc19jb25kaXRpb24gPSBBVURBQzNfRU9TX05PTkU7Ci0KLQlNTV9EQkcoImNudD0lZFxuIiwgY291bnQpOwotCi0JaWYgKGNvdW50ICYgMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0JCWNweV9wdHIgPSBmcmFtZS0+ZGF0YTsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJCSAgICAgIChmcmFtZS0+dXNlZCA9PSAwKQotCQkJCQkJfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQkJCQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChhdWRpby0+bWZpZWxkKSB7Ci0JCQlpZiAoYnVmID09IHN0YXJ0KSB7Ci0JCQkJLyogUHJvY2Vzc2luZyBiZWdpbm5pbmcgb2YgdXNlciBidWZmZXIgKi8KLQkJCQlpZiAoX19nZXRfdXNlcihtZmllbGRfc2l6ZSwKLQkJCQkJKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSBidWYpKSB7Ci0JCQkJCXJjID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIGlmIChtZmllbGRfc2l6ZSA+IGNvdW50KSB7Ci0JCQkJCXJjID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCU1NX0RCRygibWYgb2Zmc2V0X3ZhbCAleFxuIiwgbWZpZWxkX3NpemUpOwotCQkJCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsCi0JCQkJCQkJbWZpZWxkX3NpemUpKSB7Ci0JCQkJCXJjID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8qIENoZWNrIGlmIEVPUyBmbGFnIGlzIHNldCBhbmQgYnVmZmVyIGhhcwotCQkJCSAqIGNvbnRhaW5zIGp1c3QgbWV0YSBmaWVsZAotCQkJCSAqLwotCQkJCWlmIChjcHlfcHRyW0FVREFDM19FT1NfRkxHX09GRlNFVF0gJgotCQkJCQkJQVVEQUMzX0VPU19GTEdfTUFTSykgewotCQkJCQlNTV9EQkcoImVvcyBzZXRcbiIpOwotCQkJCQllb3NfY29uZGl0aW9uID0gQVVEQUMzX0VPU19TRVQ7Ci0JCQkJCWlmIChtZmllbGRfc2l6ZSA9PSBjb3VudCkgewotCQkJCQkJYnVmICs9IG1maWVsZF9zaXplOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZQotCQkJCQljcHlfcHRyW0FVREFDM19FT1NfRkxHX09GRlNFVF0gJj0KLQkJCQkJCX5BVURBQzNfRU9TX0ZMR19NQVNLOwotCQkJCX0KLQkJCQkgLyogQ2hlY2sgRU9TIHRvIHNlZSBpZiAqLwotCQkJCWNweV9wdHIgKz0gbWZpZWxkX3NpemU7Ci0JCQkJY291bnQgLT0gbWZpZWxkX3NpemU7Ci0JCQkJYnVmICs9IG1maWVsZF9zaXplOwotCQkJIH0gZWxzZSB7Ci0JCQkJIG1maWVsZF9zaXplID0gMDsKLQkJCQkgTU1fREJHKCJjb250aW51b3VzIGJ1ZmZlclxuIik7Ci0JCQkgfQotCQkJIGZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQkJfQotCi0JCXhmZXIgPSAoY291bnQgPiAoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkpID8KLQkJCShmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSA6IGNvdW50OwotCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCB4ZmVyKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJZnJhbWUtPnVzZWQgPSB4ZmVyICsgbWZpZWxkX3NpemU7Ci0JCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCQljb3VudCAtPSB4ZmVyOwotCQlidWYgKz0geGZlcjsKLQkJYXVkYWMzX3NlbmRfZGF0YShhdWRpbywgMCk7Ci0JfQotCWlmIChlb3NfY29uZGl0aW9uID09IEFVREFDM19FT1NfU0VUKQotCQlyYyA9IGF1ZGFjM19wcm9jZXNzX2VvcyhhdWRpbywgc3RhcnQsIG1maWVsZF9zaXplKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlpZiAoIXJjKSB7Ci0JCWlmIChidWYgPiBzdGFydCkKLQkJCXJldHVybiBidWYgLSBzdGFydDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGFjM19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlNTV9JTkZPKCJhdWRpbyBpbnN0YW5jZSAweCUwOHggZnJlZWluZ1xuIiwgKGludClhdWRpbyk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGFjM19kaXNhYmxlKGF1ZGlvKTsKLQlpZiAoYXVkaW8tPnJtdF9yZXNvdXJjZV9yZWxlYXNlZCA9PSAwKQotCQlybXRfcHV0X3Jlc291cmNlKGF1ZGlvKTsKLQlhdWRhYzNfZmx1c2goYXVkaW8pOwotCWF1ZGFjM19mbHVzaF9wY21fYnVmKGF1ZGlvKTsKLQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHBsYXkpOwotCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCXVucmVnaXN0ZXJfZWFybHlfc3VzcGVuZCgmYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUpOwotI2VuZGlmCi0JYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0JYXVkYWMzX3Jlc2V0X2V2ZW50X3F1ZXVlKGF1ZGlvKTsKLQlpb25fdW5tYXBfa2VybmVsKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotCWlmIChhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgIT0gTlVMTCkgewotCQlpb25fdW5tYXBfa2VybmVsKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSk7Ci0JCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSk7Ci0JfQotCWlvbl9jbGllbnRfZGVzdHJveShhdWRpby0+Y2xpZW50KTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlpZiAoYXVkaW8tPmRlbnRyeSkKLQkJZGVidWdmc19yZW1vdmUoYXVkaW8tPmRlbnRyeSk7Ci0jZW5kaWYKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RhdGljIHZvaWQgYXVkYWMzX3Bvc3RfZXZlbnQoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHR5cGUsCi0JCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQpCi17Ci0Jc3RydWN0IGF1ZGFjM19ldmVudCAqZV9ub2RlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSkgewotCQllX25vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkYWMzX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmVfbm9kZS0+bGlzdCk7Ci0JfSBlbHNlIHsKLQkJZV9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGFjM19ldmVudCksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWVfbm9kZSkgewotCQkJTU1fRVJSKCJObyBtZW0gdG8gcG9zdCBldmVudCAlZFxuIiwgdHlwZSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JZV9ub2RlLT5ldmVudF90eXBlID0gdHlwZTsKLQllX25vZGUtPnBheWxvYWQgPSBwYXlsb2FkOwotCi0JbGlzdF9hZGRfdGFpbCgmZV9ub2RlLT5saXN0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLX0KLQotc3RhdGljIHZvaWQgYXVkYWMzX3N1c3BlbmQoc3RydWN0IGVhcmx5X3N1c3BlbmQgKmgpCi17Ci0Jc3RydWN0IGF1ZGFjM19zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWRhYzNfc3VzcGVuZF9jdGwsIG5vZGUpOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWF1ZGFjM19wb3N0X2V2ZW50KGN0bC0+YXVkaW8sIEFVRElPX0VWRU5UX1NVU1BFTkQsIHBheWxvYWQpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhYzNfcmVzdW1lKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRhYzNfc3VzcGVuZF9jdGwgKmN0bCA9Ci0JCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgYXVkYWMzX3N1c3BlbmRfY3RsLCBub2RlKTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlhdWRhYzNfcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9SRVNVTUUsIHBheWxvYWQpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBzc2l6ZV90IGF1ZGFjM19kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGFjM19kZWJ1Z19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQljb25zdCBpbnQgZGVidWdfYnVmbWF4ID0gMTAyNDsKLQlzdGF0aWMgY2hhciBidWZmZXJbMTAyNF07Ci0JaW50IG4gPSAwLCBpOwotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JbiA9IHNjbnByaW50ZihidWZmZXIsIGRlYnVnX2J1Zm1heCwgIm9wZW5lZCAlZFxuIiwgYXVkaW8tPm9wZW5lZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJlbmFibGVkICVkXG4iLCBhdWRpby0+ZW5hYmxlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJzdG9wcGVkICVkXG4iLCBhdWRpby0+c3RvcHBlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJwY21fZmVlZGJhY2sgJWRcbiIsIGF1ZGlvLT5wY21fZmVlZGJhY2spOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X2J1Zl9zeiAlZFxuIiwgYXVkaW8tPm91dFswXS5zaXplKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInBjbV9idWZfY291bnQgJWRcbiIsIGF1ZGlvLT5wY21fYnVmX2NvdW50KTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInBjbV9idWZfc3ogJWRcbiIsIGF1ZGlvLT5pblswXS5zaXplKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInZvbHVtZSAleFxuIiwgYXVkaW8tPnZvbF9wYW4udm9sdW1lKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkvKiBGb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBvbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHdoZW4KLQkgKiB3aGVuIHBsYXliYWNrIGhhbHRzIHVuZXhwZWN0ZWRseS4gVGh1cywgbm8gbXV0dWFsIGV4Y2x1c2lvbgotCSAqIGVuZm9yY2VkCi0JICovCi0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJ3Zmx1c2ggJWRcbiIsIGF1ZGlvLT53Zmx1c2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicmZsdXNoICVkXG4iLCBhdWRpby0+cmZsdXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInJ1bm5pbmcgJWRcbiIsIGF1ZGlvLT5ydW5uaW5nKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImRlYyBzdGF0ZSAlZFxuIiwgYXVkaW8tPmRlY19zdGF0ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJvdXRfbmVlZGVkICVkXG4iLCBhdWRpby0+b3V0X25lZWRlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJvdXRfaGVhZCAlZFxuIiwgYXVkaW8tPm91dF9oZWFkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dF90YWlsICVkXG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0WzBdLnVzZWQgJWRcbiIsIGF1ZGlvLT5vdXRbMF0udXNlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJvdXRbMV0udXNlZCAlZFxuIiwgYXVkaW8tPm91dFsxXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImJ1ZmZlcl9yZWZyZXNoICVkXG4iLCBhdWRpby0+YnVmX3JlZnJlc2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicmVhZF9uZXh0ICVkXG4iLCBhdWRpby0+cmVhZF9uZXh0KTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImZpbGxfbmV4dCAlZFxuIiwgYXVkaW8tPmZpbGxfbmV4dCk7Ci0JZm9yIChpID0gMDsgaSA8IGF1ZGlvLT5wY21fYnVmX2NvdW50OyBpKyspCi0JCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJImluWyVkXS5zaXplICVkXG4iLCBpLCBhdWRpby0+aW5baV0udXNlZCk7Ci0JYnVmZmVyW25dID0gMDsKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkYWMzX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWRhYzNfZGVidWdfcmVhZCwKLQkub3BlbiA9IGF1ZGFjM19kZWJ1Z19vcGVuLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGF1ZGFjM19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBOVUxMOwotCWludCByYywgZGVjX2F0dHJiLCBkZWNpZCwgaTsKLQlzdHJ1Y3QgYXVkYWMzX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCWludCBsZW4gPSAwOwotCXVuc2lnbmVkIGxvbmcgaW9uZmxhZyA9IDA7Ci0JaW9uX3BoeXNfYWRkcl90IGFkZHIgPSAwOwotCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUgPSBOVUxMOwotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQgPSBOVUxMOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCi0JY2hhciBuYW1lW3NpemVvZiAibXNtX2FjM18iICsgNV07Ci0jZW5kaWYKLQotCS8qIEFsbG9jYXRlIGF1ZGlvIGluc3RhbmNlLCBzZXQgdG8gemVybyAqLwotCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhdWRpbykgewotCQlNTV9FUlIoIm5vIG1lbW9yeSB0byBhbGxvY2F0ZSBhdWRpbyBpbnN0YW5jZVxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQlNTV9JTkZPKCJhdWRpbyBpbnN0YW5jZSAweCUwOHggY3JlYXRlZFxuIiwgKGludClhdWRpbyk7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgZGVjb2RlciAqLwotCWRlY19hdHRyYiA9IEFVRERFQ19ERUNfQUMzOwotCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9OT05UVU5ORUw7Ci0JCWF1ZGlvLT5wY21fZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREVfUExBWUJBQ0s7Ci0JfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWRlY19hdHRyYiB8PSBNU01fQVVEX01PREVfVFVOTkVMOwotCQlhdWRpby0+cGNtX2ZlZWRiYWNrID0gVFVOTkVMX01PREVfUExBWUJBQ0s7Ci0JfSBlbHNlIHsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JZGVjaWQgPSBhdWRwcF9hZGVjX2FsbG9jKGRlY19hdHRyYiwgJmF1ZGlvLT5tb2R1bGVfbmFtZSwKLQkJCSZhdWRpby0+cXVldWVfaWQpOwotCi0JaWYgKGRlY2lkIDwgMCkgewotCQlNTV9FUlIoIk5vIGZyZWUgZGVjb2RlciBhdmFpbGFibGUsIGZyZWVpbmcgaW5zdGFuY2UgMHglMDh4XG4iLAotCQkJCShpbnQpYXVkaW8pOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJZ290byBkb25lOwotCX0KLQotCWF1ZGlvLT5kZWNfaWQgPSBkZWNpZCAmIE1TTV9BVURfREVDT0RFUl9NQVNLOwotCi0JY2xpZW50ID0gbXNtX2lvbl9jbGllbnRfY3JlYXRlKFVJTlRfTUFYLCAiQXVkaW9fQUMzX2NsaWVudCIpOwotCWlmIChJU19FUlJfT1JfTlVMTChjbGllbnQpKSB7Ci0JCU1NX0VSUigiVW5hYmxlIHRvIGNyZWF0ZSBJT04gY2xpZW50XG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGNsaWVudF9jcmVhdGVfZXJyb3I7Ci0JfQotCWF1ZGlvLT5jbGllbnQgPSBjbGllbnQ7Ci0KLQloYW5kbGUgPSBpb25fYWxsb2MoY2xpZW50LCBETUFTWiwgU1pfNEssCi0JCQlJT05fSEVBUChJT05fQVVESU9fSEVBUF9JRCksIDApOwotCWlmIChJU19FUlJfT1JfTlVMTChoYW5kbGUpKSB7Ci0JCU1NX0VSUigiVW5hYmxlIHRvIGNyZWF0ZSBhbGxvY2F0ZSBPL1AgYnVmZmVyc1xuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRwdXRfYnVmZl9hbGxvY19lcnJvcjsKLQl9Ci0KLQlhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlID0gaGFuZGxlOwotCi0JcmMgPSBpb25fcGh5cyhjbGllbnQsIGhhbmRsZSwgJmFkZHIsICZsZW4pOwotCWlmIChyYykgewotCQlNTV9FUlIoIk8vUCBidWZmZXJzOkludmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCQlnb3RvIG91dHB1dF9idWZmX2dldF9waHlzX2Vycm9yOwotCX0gZWxzZSB7Ci0JCU1NX0lORk8oIk8vUCBidWZmZXJzOnZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJKHVuc2lnbmVkIGludCkgYWRkciwgKHVuc2lnbmVkIGludCkgbGVuKTsKLQl9Ci0JYXVkaW8tPnBoeXMgPSAoaW50MzJfdClhZGRyOwotCi0JcmMgPSBpb25faGFuZGxlX2dldF9mbGFncyhjbGllbnQsIGhhbmRsZSwgJmlvbmZsYWcpOwotCWlmIChyYykgewotCQlNTV9FUlIoImNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIpOwotCQlnb3RvIG91dHB1dF9idWZmX2dldF9mbGFnc19lcnJvcjsKLQl9Ci0KLQlhdWRpby0+bWFwX3Zfd3JpdGUgPSBpb25fbWFwX2tlcm5lbChjbGllbnQsIGhhbmRsZSk7Ci0JaWYgKElTX0VSUihhdWRpby0+bWFwX3Zfd3JpdGUpKSB7Ci0JCU1NX0VSUigiY291bGQgbm90IG1hcCB3cml0ZSBidWZmZXJzLGZyZWVpbmcgaW5zdGFuY2UgMHglMDh4XG4iLAotCQkJCShpbnQpYXVkaW8pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfbWFwX2Vycm9yOwotCX0KLQlhdWRpby0+ZGF0YSA9IGF1ZGlvLT5tYXBfdl93cml0ZTsKLQlNTV9EQkcoIndyaXRlIGJ1ZjogcGh5IGFkZHIgMHglMDh4IGtlcm5lbCBhZGRyIDB4JTA4eFxuIiwKLQkJYXVkaW8tPnBoeXMsIChpbnQpYXVkaW8tPmRhdGEpOwotCi0JcmMgPSBtc21fYWRzcF9nZXQoYXVkaW8tPm1vZHVsZV9uYW1lLCAmYXVkaW8tPmF1ZHBsYXksCi0JCQkmYXVkcGxheV9hZHNwX29wc19hYzMsIGF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJmYWlsZWQgdG8gZ2V0ICVzIG1vZHVsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJYXVkaW8tPm1vZHVsZV9uYW1lLCAoaW50KWF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spCi0JCQlhdWRtZ3JfY2xvc2UoJmF1ZGlvLT5hdWRtZ3IpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyYyA9IHJtdF9nZXRfcmVzb3VyY2UoYXVkaW8pOwotCWlmIChyYykgewotCQlNTV9FUlIoIkFEU1AgcmVzb3VyY2VzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBBQzMgc2Vzc2lvbiJcCi0JCQkiIDB4JTA4eCBvbiBkZWNvZGVyOiAlZFxuIiwgKGludClhdWRpbywgYXVkaW8tPmRlY19pZCk7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrID09IFRVTk5FTF9NT0RFX1BMQVlCQUNLKQotCQkJYXVkbWdyX2Nsb3NlKCZhdWRpby0+YXVkbWdyKTsKLQkJbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRwbGF5KTsKLQkJZ290byBlcnI7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBhbGwgbG9ja3Mgb2YgYXVkaW8gaW5zdGFuY2UgKi8KLQlhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgPSBOVUxMOwotCW11dGV4X2luaXQoJmF1ZGlvLT5sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPnJlYWRfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmRzcF9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jayk7Ci0KLQlhdWRpby0+b3V0WzBdLmRhdGEgPSBhdWRpby0+ZGF0YSArIDA7Ci0JYXVkaW8tPm91dFswXS5hZGRyID0gYXVkaW8tPnBoeXMgKyAwOwotCWF1ZGlvLT5vdXRbMF0uc2l6ZSA9IEJVRlNaOwotCi0JYXVkaW8tPm91dFsxXS5kYXRhID0gYXVkaW8tPmRhdGEgKyBCVUZTWjsKLQlhdWRpby0+b3V0WzFdLmFkZHIgPSBhdWRpby0+cGh5cyArIEJVRlNaOwotCWF1ZGlvLT5vdXRbMV0uc2l6ZSA9IEJVRlNaOwotCi0JYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gMHgzRkZGOwotCi0JKGF1ZGlvLT5hYzNfY29uZmlnKS53b3JkU2l6ZSA9IEFVREFDM19ERUZfV09SRFNJWkU7Ci0JKGF1ZGlvLT5hYzNfY29uZmlnKS51c2VyX2Rvd25taXhfZmxhZyA9IEFVREFDM19ERUZfVVNFUl9ET1dOTUlYX0ZMQUc7Ci0JKGF1ZGlvLT5hYzNfY29uZmlnKS51c2VyX2thcmFva2VfZmxhZyA9IEFVREFDM19ERUZfVVNFUl9LQVJBT0tFX0ZMQUc7Ci0JKGF1ZGlvLT5hYzNfY29uZmlnKS5lcnJvcl9jb25jZWFsbWVudCA9IEFVREFDM19ERUZfRVJST1JfQ09OQ0VBTE1FTlQ7Ci0JKGF1ZGlvLT5hYzNfY29uZmlnKS5tYXhfcmVwX2NvdW50ID0gQVVEQUMzX0RFRl9NQVhfUkVQRUFUX0NPVU5UOwotCi0JYXVkYWMzX2ZsdXNoKGF1ZGlvKTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOwotCWF1ZGlvLT5vcGVuZWQgPSAxOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXNucHJpbnRmKG5hbWUsIHNpemVvZiBuYW1lLCAibXNtX2FjM18lMDR4IiwgYXVkaW8tPmRlY19pZCk7Ci0JYXVkaW8tPmRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQlOVUxMLCAodm9pZCAqKSBhdWRpbywgJmF1ZGFjM19kZWJ1Z19mb3BzKTsKLQotCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCi0JCU1NX0RCRygiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5sZXZlbCA9IEVBUkxZX1NVU1BFTkRfTEVWRUxfRElTQUJMRV9GQjsKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5yZXN1bWUgPSBhdWRhYzNfcmVzdW1lOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLnN1c3BlbmQgPSBhdWRhYzNfc3VzcGVuZDsKLQlhdWRpby0+c3VzcGVuZF9jdGwuYXVkaW8gPSBhdWRpbzsKLQlyZWdpc3Rlcl9lYXJseV9zdXNwZW5kKCZhdWRpby0+c3VzcGVuZF9jdGwubm9kZSk7Ci0jZW5kaWYKLQlmb3IgKGkgPSAwOyBpIDwgQVVEQUMzX0VWRU5UX05VTTsgaSsrKSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRhYzNfZXZlbnQpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGVfbm9kZSkKLQkJCWxpc3RfYWRkX3RhaWwoJmVfbm9kZS0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQkJZWxzZSB7Ci0JCQlNTV9FUlIoImV2ZW50IHBrdCBhbGxvYyBmYWlsZWRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci1kb25lOgotCXJldHVybiByYzsKLWVycjoKLQlpb25fdW5tYXBfa2VybmVsKGNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci1vdXRwdXRfYnVmZl9tYXBfZXJyb3I6Ci1vdXRwdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I6Ci1vdXRwdXRfYnVmZl9nZXRfcGh5c19lcnJvcjoKLQlpb25fZnJlZShjbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotb3V0cHV0X2J1ZmZfYWxsb2NfZXJyb3I6Ci0JaW9uX2NsaWVudF9kZXN0cm95KGNsaWVudCk7Ci1jbGllbnRfY3JlYXRlX2Vycm9yOgotCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19hYzNfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IGF1ZGFjM19vcGVuLAotCS5yZWxlYXNlID0gYXVkYWMzX3JlbGVhc2UsCi0JLnJlYWQgPSBhdWRhYzNfcmVhZCwKLQkud3JpdGUgPSBhdWRhYzNfd3JpdGUsCi0JLnVubG9ja2VkX2lvY3RsID0gYXVkYWMzX2lvY3RsLAotCS5mc3luYyA9IGF1ZGFjM19mc3luYywKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2FjM19taXNjID0gewotCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZSA9ICJtc21fYWMzIiwKLQkuZm9wcyA9ICZhdWRpb19hYzNfZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGFjM19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2FjM19taXNjKTsKLQotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXVkYWMzX2V4aXQodm9pZCkKLXsKLQltaXNjX2RlcmVnaXN0ZXIoJmF1ZGlvX2FjM19taXNjKTsKLX0KLQotbW9kdWxlX2luaXQoYXVkYWMzX2luaXQpOwotbW9kdWxlX2V4aXQoYXVkYWMzX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1TTSBBQzMgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19hY2RiLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19hY2RiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwOGY1NDQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fYWNkYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcwNCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9tYXJpbWJhLmg+Ci0jaW5jbHVkZSA8bWFjaC9kYWwuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdV9kb21haW5zLmg+Ci0jaW5jbHVkZSA8bWFjaC9zb2NpbmZvLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHByZXByb2MuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHBjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHByZXByb2NjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHByZXByb2Ntc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHBtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L2F1ZGlvX2FjZGJpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9hY2RiX2NvbW1hbmRzLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9hdWRpb19hY2RiX2RlZi5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9tZW10eXBlcy5oPgotCi0jaW5jbHVkZSAiYXVkbWdyLmgiCi0KLS8qIHRoaXMgaXMgdGhlIEFDREIgZGV2aWNlIElEICovCi0jZGVmaW5lIERBTERFVklDRUlEX0FDREIJCTB4MDIwMDAwNjkKLSNkZWZpbmUgQUNEQl9QT1JUX05BTUUJCQkiREFMMDAiCi0jZGVmaW5lIEFDREJfQ1BVCQkJU01EX0FQUFNfTU9ERU0KLSNkZWZpbmUgQUNEQl9CVUZfU0laRQkJCTQwOTYKLSNkZWZpbmUgRkxVRU5DRV9CVUZfU0laRQk0OTgKLQotI2RlZmluZSBBQ0RCX1ZBTFVFU19OT1RfRklMTEVECQkwCi0jZGVmaW5lIEFDREJfVkFMVUVTX0ZJTExFRAkJMQotI2RlZmluZSBNQVhfUkVUUlkJCQkxMAotCi0jZGVmaW5lIENPTU1PTl9PQkpfSUQgICAgICAgICAgICAgICAgICAgNgotCi0vKmJlbG93IG1hY3JvIGlzIHVzZWQgdG8gYWxpZ24gdGhlIHNlc3Npb24gaW5mbyByZWNlaXZlZCBmcm9tCi1EZXZjdGwgZHJpdmVyIHdpdGggdGhlIHN0YXRlIG1lbnRpb25lZCBhcyBub3QgdG8gYWx0ZXIgdGhlCi1FeGlzdGluZyBjb2RlKi8KLSNkZWZpbmUgQVVEUkVDX09GRlNFVAkyCi0vKiBycGMgdGFibGUgaW5kZXggKi8KLWVudW0gewotCUFDREJfREFMX0lPQ1RMID0gREFMREVWSUNFX0ZJUlNUX0RFVklDRV9BUElfSURYCi19OwotCi1lbnVtIHsKLQlDQUxfREFUQV9SRUFEWQk9IDB4MSwKLQlBVURQUF9SRUFEWQk9IDB4MiwKLQlBVURSRUNfUkVBRFkJPSAweDQsCi19OwotCi1zdHJ1Y3QgYWNkYl9kYXRhIHsKLQl2b2lkICpoYW5kbGU7Ci0KLQl1MzIgcGh5c19hZGRyOwotCXU4ICp2aXJ0X2FkZHI7Ci0KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNiX3RocmVhZF90YXNrOwotCXN0cnVjdCBkZXZpY2VfaW5mb19jYWxsYmFjayBkZXZfY2I7Ci0KLQl1MzIgYWNkYl9zdGF0ZTsKLQlzdHJ1Y3QgYXVkcHBfZXZlbnRfY2FsbGJhY2sgYXVkcHBfY2I7Ci0Jc3RydWN0IGF1ZHByZXByb2NfZXZlbnRfY2FsbGJhY2sgYXVkcHJlcHJvY19jYjsKLQlzdHJ1Y3QgZGV2X2V2dF9tc2cgKmRldmljZV9pbmZvOwotCi0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3BjbSAqcHBfaWlyOwotCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19tYmFkcmMgKnBwX21iYWRyYzsKLQlhdWRwcmVwcm9jX2NtZF9jZmdfYWdjX3BhcmFtcyAqcHJlcHJvY19hZ2M7Ci0JYXVkcHJlcHJvY19jbWRfY2ZnX2lpcl90dW5pbmdfZmlsdGVyX3BhcmFtcyAqcHJlcHJvY19paXI7Ci0JYXVkcHJlcHJvY19jbWRfY2ZnX25zX3BhcmFtcyAqcHJlcHJvY19uczsKLQlzdHJ1Y3QgYWNkYl9tYmFkcmNfYmxvY2sgbWJhZHJjX2Jsb2NrOwotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlzdHJ1Y3QgbXV0ZXggYWNkYl9tdXRleDsKLQl1MzIgZGV2aWNlX2NiX2NvbXBsOwotCXUzMiBhdWRwcF9jYl9jb21wbDsKLQl1MzIgcHJlcHJvY19jYl9jb21wbDsKLQl1MzIgYXVkcHBfY2JfcmVlbmFibGVfY29tcGw7Ci0JdTggcHJlcHJvY19zdHJlYW1faWQ7Ci0JdTggYXVkcmVjX2FwcGxpZWQ7Ci0JdTMyIG11bHRpcGxlX3Nlc3Npb25zOwotCXUzMiBjdXJfdHhfc2Vzc2lvbjsKLQlzdHJ1Y3QgYWNkYl9yZXN1bHQgYWNkYl9yZXN1bHQ7Ci0JdWludDMyX3QgYXVkcHBfZGlzYWJsZWRfZmVhdHVyZXM7Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCWludCBkZWNfaWQ7Ci0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyIGVxOwotCXN0cnVjdCBhdWRyZWNfc2Vzc2lvbl9pbmZvIHNlc3Npb25faW5mbzsKLQkvKnBtZW0gaW5mbyovCi0JdW5zaWduZWQgbG9uZyBwYWRkcjsKLQl1bnNpZ25lZCBsb25nIGt2YWRkcjsKLQl1bnNpZ25lZCBsb25nIHBtZW1fbGVuOwotCXN0cnVjdCBmaWxlICpmaWxlOwotCS8qIHBtZW0gZm9yIGdldCBhY2RiIGJsayAqLwotCXVuc2lnbmVkIGxvbmcJZ2V0X2Jsa19wYWRkcjsKLQl1OAkJKmdldF9ibGtfa3ZhZGRyOwotCXZvaWQgKm1hcF92X2dldF9ibGs7Ci19OwotCi1zdGF0aWMgc3RydWN0IGFjZGJfZGF0YQkJYWNkYl9kYXRhOwotCi1zdHJ1Y3QgYWNkYl9jYWNoZV9ub2RlIHsKLQl1MzIgbm9kZV9zdGF0dXM7Ci0JczMyIHN0cmVhbV9pZDsKLQl1MzIgcGh5c19hZGRyX2FjZGJfdmFsdWVzOwotCXZvaWQgKm1hcF92X2FkZHI7Ci0JdTggKnZpcnRfYWRkcl9hY2RiX3ZhbHVlczsKLQlzdHJ1Y3QgZGV2X2V2dF9tc2cgZGV2aWNlX2luZm87Ci19OwotCi1zdHJ1Y3QgYWNkYl9jYWNoZV9ub2RlIGFjZGJfY2FjaGVfcng7Ci0KLS8qZm9yIFRYIGRldmljZXMgYWNkYiB2YWx1ZXMgYXJlIGFwcGxpZWQgYmFzZWQgb24gQVVEUkVDIHNlc3Npb24gYW5kCi10aGUgZGVwdGggb2YgdGhlIHR4IGNhY2hlIGlzIGRlZmluZSBieSBudW1iZXIgb2YgQVVEUkVDIHNlc3Npb25zIHN1cHBvcnRlZCovCi1zdHJ1Y3QgYWNkYl9jYWNoZV9ub2RlIGFjZGJfY2FjaGVfdHg7Ci0KLS8qQXVkcmVjIHNlc3Npb24gaW5mbyBpbmNsdWRlcyBBdHRyaWJ1dGVzIFNhbXBsaW5nIGZyZXF1ZW5jeSBhbmQgZW5jX2lkICovCi1zdHJ1Y3QgYXVkcmVjX3Nlc3Npb25faW5mbyBzZXNzaW9uX2luZm87Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0KLSNkZWZpbmUgUlRDX01BWF9USU1FT1VUIDUwMCAvKiA1MDAgbXMgKi8KLSNkZWZpbmUgUE1FTV9SVENfQUNEQl9RVUVSWV9NRU0gNDA5NgotI2RlZmluZSBFWFRSQUNUX0hJR0hfV09SRCh4KSAoKHggJiAweEZGRkYwMDAwKT4+MTYpCi0jZGVmaW5lIEVYVFJBQ1RfTE9XX1dPUkQoeCkgKDB4MDAwMEZGRkYgJiB4KQotI2RlZmluZQlBQ0RCX1JUQ19UWCAweEYxCi0jZGVmaW5lCUFDREJfUlRDX1JYIDB4MUYKLQotCi1zdGF0aWMgdTMyIGFjZGJfYXVkcHBfZW50cnlbXVs0XSA9IHsKLQotCXsKLQlBQklEX0FVRElPX1JUQ19WT0xVTUVfUEFOX1JYLFwKLQlJSURfQVVESU9fUlRDX1ZPTFVNRV9QQU5fUEFSQU1FVEVSUyxcCi0JQVVEUFBfQ01EX1ZPTFVNRV9QQU4sXAotCUFDREJfUlRDX1JYCi0JfSwKLQl7Ci0JQUJJRF9BVURJT19JSVJfUlgsXAotCUlJRF9BVURJT19JSVJfQ09FRkYsXAotCUFVRFBQX0NNRF9JSVJfVFVOSU5HX0ZJTFRFUiwKLQlBQ0RCX1JUQ19SWAotCX0sCi0JewotCUFCSURfQVVESU9fUlRDX0VRVUFMSVpFUl9QQVJBTUVURVJTLFwKLQlJSURfQVVESU9fUlRDX0VRVUFMSVpFUl9QQVJBTUVURVJTLFwKLQlBVURQUF9DTURfRVFVQUxJWkVSLFwKLQlBQ0RCX1JUQ19SWAotCX0sCi0JewotCUFCSURfQVVESU9fUlRDX1NQQSxcCi0JSUlEX0FVRElPX1JUQ19TUEFfUEFSQU1FVEVSUyxcCi0JQVVEUFBfQ01EX1NQRUNUUk9HUkFNLAotCUFDREJfUlRDX1JYCi0JfSwKLQl7Ci0JQUJJRF9BVURJT19TVEZfUlgsXAotCUlJRF9BVURJT19JSVJfQ09FRkYsXAotCUFVRFBQX0NNRF9TSURFQ0hBSU5fVFVOSU5HX0ZJTFRFUixcCi0JQUNEQl9SVENfUlgKLQl9LAotCXsKLQlBQklEX0FVRElPX01CQURSQ19SWCxcCi0JSUlEX0FVRElPX1JUQ19NQkFEUkNfUEFSQU1FVEVSUyxcCi0JQVVEUFBfQ01EX01CQURSQyxcCi0JQUNEQl9SVENfUlgKLQl9LAotCXsKLQlBQklEX0FVRElPX0FHQ19UWCxcCi0JSUlEX0FVRElPX0FHQ19QQVJBTUVURVJTLFwKLQlBVURQUkVQUk9DX0NNRF9DRkdfQUdDX1BBUkFNUyxcCi0JQUNEQl9SVENfVFgKLQl9LAotCXsKLQlBQklEX0FVRElPX0FHQ19UWCxcCi0JSUlEX0FVRElPX1JUQ19BR0NfUEFSQU1FVEVSUyxcCi0JQVVEUFJFUFJPQ19DTURfQ0ZHX0FHQ19QQVJBTVMsXAotCUFDREJfUlRDX1RYCi0JfSwKLQl7Ci0JQUJJRF9BVURJT19OU19UWCxcCi0JSUlEX05TX1BBUkFNRVRFUlMsXAotCUFVRFBSRVBST0NfQ01EX0NGR19OU19QQVJBTVMsXAotCUFDREJfUlRDX1RYCi0JfSwKLQl7Ci0JQUJJRF9BVURJT19JSVJfVFgsXAotCUlJRF9BVURJT19SVENfVFhfSUlSX0NPRUZGLFwKLQlBVURQUkVQUk9DX0NNRF9DRkdfSUlSX1RVTklOR19GSUxURVJfUEFSQU1TLFwKLQlBQ0RCX1JUQ19UWAotCX0sCi0JewotCUFCSURfQVVESU9fSUlSX1RYLFwKLQlJSURfQVVESU9fSUlSX0NPRUZGLFwKLQlBVURQUkVQUk9DX0NNRF9DRkdfSUlSX1RVTklOR19GSUxURVJfUEFSQU1TLFwKLQlBQ0RCX1JUQ19UWAotCX0KLSAvKkFueSBuZXcgZW50cmllcyBzaG91bGQgYmUgYWRkZWQgaGVyZSovCi19OwotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZ2V0X3NldF9hYmlkX2RlbnRyeTsKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpnZXRfc2V0X2FiaWRfZGF0YV9kZW50cnk7Ci0KLXN0cnVjdCBydGNfYWNkYl9wbWVtIHsKLQl1OCAqdmlyYWRkcjsKLQlpbnQzMl90IHBoeXM7Ci0Jdm9pZCAqbWFwX3ZfcnRjOwotfTsKLQotc3RydWN0IHJ0Y19hY2RiX2RhdGEgewotCXUzMiBhY2RiX2lkOwotCXUzMiBjbWRfaWQ7Ci0JdTMyIHNldF9hYmlkOwotCXUzMiBzZXRfaWlkOwotCXUzMiBhYmlkOwotCXUzMiBlcnI7Ci0JYm9vbCB2YWxpZF9hYmlkOwotCXUzMiB0eF9yeF9jdGw7Ci0Jc3RydWN0IHJ0Y19hY2RiX3BtZW0gcnRjX3JlYWQ7Ci0Jc3RydWN0IHJ0Y19hY2RiX3BtZW0gcnRjX3dyaXRlOwotCXdhaXRfcXVldWVfaGVhZF90ICB3YWl0OwotfTsKLQotc3RydWN0IGdldF9hYmlkIHsKLQl1MzIJY21kX2lkOwotCXUzMglhY2RiX2lkOwotCXUzMglzZXRfYWJpZDsKLQl1MzIJc2V0X2lpZDsKLX07Ci0KLXN0cnVjdCBhY2RiX2Jsb2NrX21iYWRyY19ydGMgewotCXUxNiBlbmFibGU7Ci0JdTE2IG51bV9iYW5kczsKLQl1MTYgZG93bl9zYW1wX2xldmVsOwotCXUxNiBhZHJjX2RlbGF5OwotCXUxNiBleHRfYnVmX3NpemU7Ci0JdTE2IGV4dF9wYXJ0aXRpb247Ci0JdTE2IGV4dF9idWZfbXN3OwotCXUxNiBleHRfYnVmX2xzdzsKLQlzdHJ1Y3QgYWRyY19jb25maWcgYWRyY19iYW5kW0FVRFBQX01BWF9NQkFEUkNfQkFORFNdOwotCXNpZ25lZCBpbnQgZXh0X2J1ZmZbMTk2XTsKLX0gX19wYWNrZWQ7Ci0KLWVudW0gewotCUFDREJfUlRDX1NVQ0NFU1MsCi0JQUNEQl9SVENfRVJSX0lOVkFMSURfREVWSUNFLAotCUFDREJfUlRDX0VSUl9ERVZJQ0VfSU5BQ1RJVkUsCi0JQUNEQl9SVENfRVJSX0lOVkFMSURfQUJJRCwKLQlBQ0RCX1JUQ19EU1BfRkFJTFVSRSwKLQlBQ0RCX1JUQ19EU1BfRkVBVFVSRV9OT1RfQVZBSUxBQkxFLAotCUFDREJfUlRDX0VSUl9JTlZBTElEX0xFTiwKLQlBQ0RCX1JUQ19FUlJfVU5LTk9XTl9GQUlMVVJFLAotCUFDREJfUlRDX1BFTkRJTkdfUkVTUE9OU0UsCi0JQUNEQl9SVENfSU5JVF9GQUlMVVJFLAotfTsKLQotc3RhdGljICBzdHJ1Y3QgcnRjX2FjZGJfZGF0YSBydGNfYWNkYjsKLQotc3RhdGljIGludCBydGNfZ2V0c2V0YWJpZF9kYmdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCU1NX0RCRygiR0VULVNFVCBBQklEIE9wZW4gZGVidWcgaW50ZiAlc1xuIixcCi0JCQkoY2hhciAqKSBmaWxlLT5wcml2YXRlX2RhdGEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbCBnZXRfZmVhdHVyZV9pZCh1MzIgc2V0X2FiaWQsIHUzMiBpaWQsIHVuc2lnbmVkIHNob3J0ICpmZWF0dXJlX2lkKQotewotCWJvb2wgcmV0X3ZhbHVlID0gZmFsc2U7Ci0JaW50IGkgPSAwOwotCi0JZm9yICg7IGkgPCAoc2l6ZW9mKGFjZGJfYXVkcHBfZW50cnkpIC8gc2l6ZW9mKGFjZGJfYXVkcHBfZW50cnlbMF0pKTtcCi0JCWkrKykgewotCQlpZiAoYWNkYl9hdWRwcF9lbnRyeVtpXVswXSA9PSBzZXRfYWJpZCAmJgotCQkJYWNkYl9hdWRwcF9lbnRyeVtpXVsxXSA9PSBpaWQpIHsKLQkJCSpmZWF0dXJlX2lkID0gIGFjZGJfYXVkcHBfZW50cnlbaV1bMl07Ci0JCQlydGNfYWNkYi50eF9yeF9jdGwgPSBhY2RiX2F1ZHBwX2VudHJ5W2ldWzNdOwotCQkJcmV0X3ZhbHVlID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiByZXRfdmFsdWU7Ci19Ci1zdGF0aWMgc3NpemVfdCBydGNfZ2V0c2V0YWJpZF9kYmdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkJCWNvbnN0IGNoYXIgX191c2VyICp1YnVmLAotCQkJCQlzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0ICBnZXRfYWJpZCB3cml0ZV9hYmlkOwotCXVuc2lnbmVkIHNob3J0IGZlYXRfaWQgPSAwOwotCXJ0Y19hY2RiLnZhbGlkX2FiaWQgPSBmYWxzZTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmd3JpdGVfYWJpZCwgXAotCQkodm9pZCAqKXVidWYsIHNpemVvZihzdHJ1Y3QgZ2V0X2FiaWQpKSkgewotCQlNTV9FUlIoIkFDREIgREFUQSBXUklURSAtIElOVkFMSUQgUkVBRCBMRU5cbiIpOwotCQlydGNfYWNkYi5lcnIgPSBBQ0RCX1JUQ19FUlJfSU5WQUxJRF9MRU47Ci0JCXJldHVybiBjbnQ7Ci0JfQotCU1NX0RCRygiU0VUIEFCSUQgOiBDbWQgSUQ6ICVkIERldmljZTolZCBBQklEOiVkIElJRCA6ICVkIGNudDogJWRcbiIsXAotCQl3cml0ZV9hYmlkLmNtZF9pZCwgd3JpdGVfYWJpZC5hY2RiX2lkLFwKLQkJd3JpdGVfYWJpZC5zZXRfYWJpZCwgd3JpdGVfYWJpZC5zZXRfaWlkLCBjbnQpOwotCWlmICh3cml0ZV9hYmlkLmFjZGJfaWQgPiBBQ0RCX0lEX01BWCB8fAotCQl3cml0ZV9hYmlkLmFjZGJfaWQgPCBBQ0RCX0lEX0hBTkRTRVRfU1BLUil7Ci0JCXJ0Y19hY2RiLmVyciA9IEFDREJfUlRDX0VSUl9JTlZBTElEX0RFVklDRTsKLQkJcmV0dXJuIGNudDsKLQl9Ci0KLQlydGNfYWNkYi5lcnIgPSBBQ0RCX1JUQ19FUlJfSU5WQUxJRF9BQklEOwotCXJ0Y19hY2RiLmFiaWQgPSB3cml0ZV9hYmlkLnNldF9hYmlkOwotCWlmIChnZXRfZmVhdHVyZV9pZCh3cml0ZV9hYmlkLnNldF9hYmlkLCBcCi0JCXdyaXRlX2FiaWQuc2V0X2lpZCwgJmZlYXRfaWQpKSB7Ci0JCXJ0Y19hY2RiLmVyciA9IEFDREJfUlRDX1NVQ0NFU1M7Ci0JCXJ0Y19hY2RiLmNtZF9pZCA9IHdyaXRlX2FiaWQuY21kX2lkOwotCQlydGNfYWNkYi5hY2RiX2lkID0gd3JpdGVfYWJpZC5hY2RiX2lkOwotCQlydGNfYWNkYi5zZXRfYWJpZCA9IGZlYXRfaWQ7Ci0JCXJ0Y19hY2RiLnZhbGlkX2FiaWQgPSB0cnVlOwotCQlydGNfYWNkYi5zZXRfaWlkID0gd3JpdGVfYWJpZC5zZXRfaWlkOwotCX0KLQlyZXR1cm4gY250OwotfQotc3RhdGljIHNzaXplX3QJcnRjX2dldHNldGFiaWRfZGJnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0YXRpYyBjaGFyIGJ1ZmZlclsxMDI0XTsKLQlpbnQgbiA9IDA7Ci0JdTMyIG1zZyA9IHJ0Y19hY2RiLmVycjsKLQltZW1jcHkoYnVmZmVyLCAmcnRjX2FjZGIuY21kX2lkLCBzaXplb2Yoc3RydWN0IGdldF9hYmlkKSk7Ci0JbWVtY3B5KGJ1ZmZlcisxNiwgJm1zZywgNCk7Ci0JbiA9IDIwOwotCU1NX0lORk8oIlNFVCBBQklEIDogQ21kIElEOiAleCBEZXZpY2U6JXggQUJJRDoleCBJSUQgOiAleCBFcnI6ICVkXG4iLFwKLQkJcnRjX2FjZGIuY21kX2lkLCBydGNfYWNkYi5hY2RiX2lkLCBydGNfYWNkYi5zZXRfYWJpZCxcCi0JCXJ0Y19hY2RiLnNldF9paWQsIHJ0Y19hY2RiLmVycik7Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGJ1ZmZlciwgbik7Ci19Ci0KLXN0YXRpYyBpbnQgcnRjX2dldHNldGFiaWRfZGF0YV9kYmdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCU1NX0lORk8oIkdFVC1TRVQgQUJJRCBEQVRBIE9wZW4gZGVidWcgaW50ZiAlc1xuIiwKLQkJKGNoYXIgKikgZmlsZS0+cHJpdmF0ZV9kYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBhY2RiX3J0Y19zZXRfZXJyKHUzMiBlcnJfY29kZSkKLXsKLQlpZiAocnRjX2FjZGIuZXJyID09IEFDREJfUlRDX1BFTkRJTkdfUkVTUE9OU0UpIHsKLQkJaWYgKGVycl9jb2RlID09IDB4RkZGRikgewotCQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfU1VDQ0VTUzsKLQkJCU1NX0lORk8oIlJUQyBSRUFEIFNVQ0NFU1MtLS1cbiIpOwotCQl9IGVsc2UgaWYgKGVycl9jb2RlID09IDApIHsKLQkJCXJ0Y19hY2RiLmVyciA9IEFDREJfUlRDX0RTUF9GQUlMVVJFOwotCQkJTU1fSU5GTygiUlRDIFJFQUQgRkFJTC0tLVxuIik7Ci0JCX0gZWxzZSBpZiAoZXJyX2NvZGUgPT0gMSkgewotCQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfRFNQX0ZFQVRVUkVfTk9UX0FWQUlMQUJMRTsKLQkJCU1NX0lORk8oIlJUQyBSRUFEIEZFQVQgVU5BVkFJTEFCTEUtLS1cbiIpOwotCQl9IGVsc2UgewotCQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfRFNQX0ZBSUxVUkU7Ci0JCQlNTV9JTkZPKCJSVEMgRXJyIENPREUtLS1cbiIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfRFNQX0ZBSUxVUkU7Ci0JCU1NX0VSUigiUlRDIEVyciBjb2RlIEludmFsaWQgU3RhdGVcbiIpOwotCX0KLQl3YWtlX3VwKCZydGNfYWNkYi53YWl0KTsKLX0KLQotc3RhdGljIHNzaXplX3QJcnRjX2dldHNldGFiaWRfZGF0YV9kYmdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJCQlsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RhdGljIGNoYXIgYnVmZmVyW1BNRU1fUlRDX0FDREJfUVVFUllfTUVNXTsKLQlpbnQgcmMsIG4gPSAwOwotCWludCBjb3VudGVyID0gMDsKLQlzdHJ1Y3QgcnRjX2FjZGJfcG1lbSAqcnRjX3JlYWQgPSAmcnRjX2FjZGIucnRjX3JlYWQ7Ci0JbWVtc2V0KCZidWZmZXIsIDAsIFBNRU1fUlRDX0FDREJfUVVFUllfTUVNKTsKLQotCWlmIChydGNfYWNkYi52YWxpZF9hYmlkICE9IHRydWUpIHsKLQkJTU1fRVJSKCJBQ0RCIERBVEEgUkVBRCAtLS1JTlZBTElEIEFCSURcbiIpOwotCQluID0gMDsKLQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfRVJSX0lOVkFMSURfQUJJRDsKLQl9IGVsc2UgewotCQlpZiAoUE1FTV9SVENfQUNEQl9RVUVSWV9NRU0gPCBjb3VudCkgewotCQkJTU1fRVJSKCJBQ0RCIERBVEEgUkVBRCAtLS0iXAotCQkJCSJJTlZBTElEIFJFQUQgTEVOICV4XG4iLCBjb3VudCk7Ci0JCQluID0gMDsKLQkJCXJ0Y19hY2RiLmVyciA9IEFDREJfUlRDX0VSUl9JTlZBTElEX0xFTjsKLQkJfSBlbHNlIHsKLQkJCXJ0Y19hY2RiLmVyciA9IEFDREJfUlRDX1BFTkRJTkdfUkVTUE9OU0U7Ci0JCQlpZiAocnRjX3JlYWQtPnZpcmFkZHIgIT0gTlVMTCkgewotCQkJCW1lbXNldChydGNfcmVhZC0+dmlyYWRkciwKLQkJCQkJMCwgUE1FTV9SVENfQUNEQl9RVUVSWV9NRU0pOwotCQkJfQotCQkJaWYgKHJ0Y19hY2RiLnR4X3J4X2N0bCA9PSBBQ0RCX1JUQ19SWCkgewotCQkJCXN0cnVjdCBydGNfYXVkcHBfcmVhZF9kYXRhIHJ0Y19yZWFkX2NtZDsKLQkJCQlydGNfcmVhZF9jbWQuY21kX2lkID0KLQkJCQkJQVVEUFBfQ01EX1BQX0ZFQVRfUVVFUllfUEFSQU1TOwotCQkJCXJ0Y19yZWFkX2NtZC5vYmpfaWQgPQotCQkJCQlBVURQUF9DTURfQ09QUF9TVFJFQU07Ci0JCQkJcnRjX3JlYWRfY21kLmZlYXR1cmVfaWQgPSBydGNfYWNkYi5zZXRfYWJpZDsKLQkJCQlydGNfcmVhZF9jbWQuZXh0YnVmc2l6ZW1zdyA9Ci0JCQkJCUVYVFJBQ1RfSElHSF9XT1JEKFwKLQkJCQkJCVBNRU1fUlRDX0FDREJfUVVFUllfTUVNKTsKLQkJCQlydGNfcmVhZF9jbWQuZXh0YnVmc2l6ZWxzdyA9Ci0JCQkJCUVYVFJBQ1RfTE9XX1dPUkQoXAotCQkJCQkJUE1FTV9SVENfQUNEQl9RVUVSWV9NRU0pOwotCQkJCXJ0Y19yZWFkX2NtZC5leHRwYXJ0ID0gMHgwMDAwOwotCQkJCXJ0Y19yZWFkX2NtZC5leHRidWZzdGFydG1zdyA9Ci0JCQkJCUVYVFJBQ1RfSElHSF9XT1JEKHJ0Y19yZWFkLT5waHlzKTsKLQkJCQlydGNfcmVhZF9jbWQuZXh0YnVmc3RhcnRsc3cgPQotCQkJCQlFWFRSQUNUX0xPV19XT1JEKHJ0Y19yZWFkLT5waHlzKTsKLQkJCQlyYyA9IGF1ZHBwX3NlbmRfcXVldWUyKCZydGNfcmVhZF9jbWQsCi0JCQkJCQlzaXplb2YocnRjX3JlYWRfY21kKSk7Ci0JCQl9IGVsc2UgaWYgKHJ0Y19hY2RiLnR4X3J4X2N0bCA9PSBBQ0RCX1JUQ19UWCkgewotCQkJCXN0cnVjdCBydGNfYXVkcHJlcHJvY19yZWFkX2RhdGEgcnRjX2F1ZHByZXByb2M7Ci0JCQkJcnRjX2F1ZHByZXByb2MuY21kX2lkID0KLQkJCQkJQVVEUFJFUFJPQ19DTURfRkVBVF9RVUVSWV9QQVJBTVM7Ci0JCQkJcnRjX2F1ZHByZXByb2MuZmVhdHVyZV9pZCA9IHJ0Y19hY2RiLnNldF9hYmlkOwotCQkJCSAvKkFVRFJFQzEgaXMgdXNlZCBmb3IgcGNtIHJlY29yZGluZyAqLwotCQkJCXJ0Y19hdWRwcmVwcm9jLnN0cmVhbV9pZCA9IDE7Ci0JCQkJcnRjX2F1ZHByZXByb2MuZXh0YnVmc2l6ZW1zdyA9Ci0JCQkJCUVYVFJBQ1RfSElHSF9XT1JEKFwKLQkJCQkJCVBNRU1fUlRDX0FDREJfUVVFUllfTUVNKTsKLQkJCQlydGNfYXVkcHJlcHJvYy5leHRidWZzaXplbHN3ID0KLQkJCQkJRVhUUkFDVF9MT1dfV09SRChcCi0JCQkJCQlQTUVNX1JUQ19BQ0RCX1FVRVJZX01FTSk7Ci0JCQkJcnRjX2F1ZHByZXByb2MuZXh0cGFydCA9IDB4MDAwMDsKLQkJCQlydGNfYXVkcHJlcHJvYy5leHRidWZzdGFydG1zdyA9Ci0JCQkJCUVYVFJBQ1RfSElHSF9XT1JEKHJ0Y19yZWFkLT5waHlzKTsKLQkJCQlydGNfYXVkcHJlcHJvYy5leHRidWZzdGFydGxzdyA9Ci0JCQkJCUVYVFJBQ1RfTE9XX1dPUkQocnRjX3JlYWQtPnBoeXMpOwotCQkJCXJjID0gIGF1ZHByZXByb2Nfc2VuZF9wcmVwcm9jY21kcXVldWUoCi0JCQkJCQkmcnRjX2F1ZHByZXByb2MsXAotCQkJCQkJc2l6ZW9mKHJ0Y19hdWRwcmVwcm9jKSk7Ci0JCQkJTU1fSU5GTygiQUNEQiBSRUFEIENvbW1hbmQgUkMgLS0tPiV4LCJcCi0JCQkJCSJzdHJlYW1faWQgJXhcbiIsIHJjLAotCQkJCQlhY2RiX2RhdGEucHJlcHJvY19zdHJlYW1faWQpOwotCQkJfQotCQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChydGNfYWNkYi53YWl0LAotCQkJCQkocnRjX2FjZGIuZXJyICE9Ci0JCQkJCUFDREJfUlRDX1BFTkRJTkdfUkVTUE9OU0UpLAotCQkJCQltc2Vjc190b19qaWZmaWVzKFJUQ19NQVhfVElNRU9VVCkpOwotCQlNTV9JTkZPKCJBQ0RCIFJFQUQgQUNLIENvdW50ID0gJXggRXJyID0gJXhcbiIsCi0JCQljb3VudCwgcnRjX2FjZGIuZXJyKTsKLQkJewotCQkJaWYgKHJ0Y19hY2RiLmVyciA9PSBBQ0RCX1JUQ19TVUNDRVNTCi0JCQkJJiYgcnRjX3JlYWQtPnZpcmFkZHIgIT0gTlVMTCkgewotCQkJCW1lbWNweShidWZmZXIsIHJ0Y19yZWFkLT52aXJhZGRyLCBjb3VudCk7Ci0JCQkJbiA9IGNvdW50OwotCQkJCXdoaWxlIChjb3VudGVyIDwgY291bnQpIHsKLQkJCQkJTU1fREJHKCIleCIsIFwKLQkJCQkJCXJ0Y19yZWFkLT52aXJhZGRyW2NvdW50ZXJdKTsKLQkJCQkJY291bnRlcisrOwotCQkJCQl9Ci0JCQkJfQotCQl9Ci0JfQotCX0KLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKLX0KLQotc3RhdGljIGJvb2wgYWNkYl9zZXRfdHhfcnRjKGNvbnN0IGNoYXIgKnVidWYsIHNpemVfdCB3cml0ZWNvdW50KQotewotCWF1ZHByZXByb2NfY21kX2NmZ19paXJfdHVuaW5nX2ZpbHRlcl9wYXJhbXMgKnByZXByb2NfaWlyOwotCWF1ZHByZXByb2NfY21kX2NmZ19hZ2NfcGFyYW1zICpwcmVwcm9jX2FnYzsKLQlhdWRwcmVwcm9jX2NtZF9jZmdfbnNfcGFyYW1zICpwcmVwcm9jX25zOwotCXMzMglyZXN1bHQgPSAwOwotCWJvb2wgcmV0dmFsID0gZmFsc2U7Ci0JdW5zaWduZWQgc2hvcnQgaWlyY21kc2l6ZSA9Ci0JCXNpemVvZihhdWRwcmVwcm9jX2NtZF9jZmdfaWlyX3R1bmluZ19maWx0ZXJfcGFyYW1zKTsKLQl1bnNpZ25lZCBzaG9ydCBpaXJjbWRpZCA9IEFVRFBSRVBST0NfQ01EX0NGR19JSVJfVFVOSU5HX0ZJTFRFUl9QQVJBTVM7Ci0KLQlydGNfYWNkYi5lcnIgPSBBQ0RCX1JUQ19FUlJfVU5LTk9XTl9GQUlMVVJFOwotCi0Jc3dpdGNoIChydGNfYWNkYi5zZXRfYWJpZCkgewotCi0JY2FzZSBBVURQUkVQUk9DX0NNRF9DRkdfQUdDX1BBUkFNUzoKLQl7Ci0JCXByZXByb2NfYWdjID0ga21hbGxvYyhzaXplb2YoXAotCQkJCQlhdWRwcmVwcm9jX2NtZF9jZmdfYWdjX3BhcmFtcyksXAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKChzaXplb2YoYXVkcHJlcHJvY19jbWRfY2ZnX2FnY19wYXJhbXMpIC1cCi0JCQkoc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkpCi0JCQk8IHdyaXRlY291bnQpIHsKLQkJCQlNTV9FUlIoIkFDREIgREFUQSBXUklURSAtLSJcCi0JCQkJCSJBR0MgVFggd3JpdGVjb3VudCA+IERTUCBzdHJ1Y3RcbiIpOwotCQl9IGVsc2UgewotCQkJaWYgKHByZXByb2NfYWdjICE9IE5VTEwpIHsKLQkJCQljaGFyICpiYXNlOyB1bnNpZ25lZCBzaG9ydCBvZmZzZXQ7Ci0JCQkJdW5zaWduZWQgc2hvcnQgKm9mZnNldF9hZGRyOwotCQkJCWJhc2UgPSAoY2hhciAqKXByZXByb2NfYWdjOwotCQkJCW9mZnNldCA9IG9mZnNldG9mKFwKLQkJCQkJYXVkcHJlcHJvY19jbWRfY2ZnX2FnY19wYXJhbXMsXAotCQkJCQkJdHhfYWdjX3BhcmFtX21hc2spOwotCQkJCW9mZnNldF9hZGRyID0gKHVuc2lnbmVkIHNob3J0ICopKGJhc2UgKyBvZmZzZXQpOwotCQkJCWlmICgoY29weV9mcm9tX3VzZXIob2Zmc2V0X2FkZHIsXAotCQkJCQkodm9pZCAqKXVidWYsIHdyaXRlY291bnQpKSA9PSAweDAwKSB7Ci0JCQkJCXByZXByb2NfYWdjLT5jbWRfaWQgPQotCQkJCQkJQVVEUFJFUFJPQ19DTURfQ0ZHX0FHQ19QQVJBTVM7Ci0KLQkJCQkJcmVzdWx0ID0gYXVkcHJlcHJvY19kc3Bfc2V0X2FnYygKLQkJCQkJCXByZXByb2NfYWdjLAotCQkJCQkJc2l6ZW9mKFwKLQkJCQkJCWF1ZHByZXByb2NfY21kX2NmZ19hZ2NfcGFyYW1zKSk7Ci0JCQkJCWlmIChyZXN1bHQpIHsKLQkJCQkJCU1NX0VSUigiQUNEQj0+IEZhaWxlZCB0byAiXAotCQkJCQkJCSJzZW5kIEFHQyBkYXRhIHRvICJcCi0JCQkJCQkJInByZXByb2MpXG4iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHZhbCA9IHRydWU7Ci0JCQkJCSAgICAgICB9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS0tIlwKLQkJCQkJCSJHQyBUeCBjb3B5X2Zyb21fdXNlciBGYWlsXG4iKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCU1NX0VSUigiQUNEQiBEQVRBIFdSSVRFIC0tIlwKLQkJCQkJIkFHQyBUWCBrYWxsb2MgRmFpbGVkIExFTlxuIik7Ci0JCQl9Ci0JCX0KLQkJaWYgKHByZXByb2NfYWdjICE9IE5VTEwpCi0JCQlrZnJlZShwcmVwcm9jX2FnYyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFBSRVBST0NfQ01EX0NGR19OU19QQVJBTVM6Ci0JewotCi0JCXByZXByb2NfbnMgPSBrbWFsbG9jKHNpemVvZihcCi0JCQkJCWF1ZHByZXByb2NfY21kX2NmZ19uc19wYXJhbXMpLFwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmICgoc2l6ZW9mKGF1ZHByZXByb2NfY21kX2NmZ19uc19wYXJhbXMpIC1cCi0JCQkJKHNpemVvZih1bnNpZ25lZCBzaG9ydCkpKQotCQkJCTwgd3JpdGVjb3VudCkgewotCQkJCU1NX0VSUigiQUNEQiBEQVRBIFdSSVRFIC0tIlwKLQkJCQkJIk5TIFRYIHdyaXRlY291bnQgPiBEU1Agc3RydWN0XG4iKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChwcmVwcm9jX25zICE9IE5VTEwpIHsKLQkJCQljaGFyICpiYXNlOyB1bnNpZ25lZCBzaG9ydCBvZmZzZXQ7Ci0JCQkJdW5zaWduZWQgc2hvcnQgKm9mZnNldF9hZGRyOwotCQkJCWJhc2UgPSAoY2hhciAqKXByZXByb2NfbnM7Ci0JCQkJb2Zmc2V0ID0gb2Zmc2V0b2YoXAotCQkJCQkJYXVkcHJlcHJvY19jbWRfY2ZnX25zX3BhcmFtcyxcCi0JCQkJCQllY19tb2RlX25ldyk7Ci0JCQkJb2Zmc2V0X2FkZHIgPSAodW5zaWduZWQgc2hvcnQgKikoYmFzZSArIG9mZnNldCk7Ci0JCQkJaWYgKChjb3B5X2Zyb21fdXNlcihvZmZzZXRfYWRkcixcCi0JCQkJCSh2b2lkICopdWJ1Ziwgd3JpdGVjb3VudCkpID09IDB4MDApIHsKLQkJCQkJcHJlcHJvY19ucy0+Y21kX2lkID0KLQkJCQkJCUFVRFBSRVBST0NfQ01EX0NGR19OU19QQVJBTVM7Ci0JCQkJCXJlc3VsdCA9IGF1ZHByZXByb2NfZHNwX3NldF9ucygKLQkJCQkJCXByZXByb2NfbnMsCi0JCQkJCQlzaXplb2YoXAotCQkJCQkJYXVkcHJlcHJvY19jbWRfY2ZnX25zX3BhcmFtcykpOwotCQkJCQlpZiAocmVzdWx0KSB7Ci0JCQkJCQlNTV9FUlIoIkFDREI9PiBGYWlsZWQgdG8gc2VuZCAiXAotCQkJCQkJCSJOUyBkYXRhIHRvIHByZXByb2NcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dmFsID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCU1NX0VSUigiQUNEQiBEQVRBIFdSSVRFIC0tLU5TIFR4ICJcCi0JCQkJCQkiY29weV9mcm9tX3VzZXIgRmFpbFxuIik7Ci0JCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS1OUyBUWCAiXAotCQkJCQkia2FsbG9jIEZhaWxlZCBMRU5cbiIpOwotCQkJfQotCQl9Ci0JCWlmIChwcmVwcm9jX25zICE9IE5VTEwpCi0JCQlrZnJlZShwcmVwcm9jX25zKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFJFUFJPQ19DTURfQ0ZHX0lJUl9UVU5JTkdfRklMVEVSX1BBUkFNUzoKLQl7Ci0KLQkJcHJlcHJvY19paXIgPSBrbWFsbG9jKHNpemVvZihcCi0JCQkJYXVkcHJlcHJvY19jbWRfY2ZnX2lpcl90dW5pbmdfZmlsdGVyX3BhcmFtcyksXAotCQkJCUdGUF9LRVJORUwpOwotCQlpZiAoKHNpemVvZihcCi0JCQlhdWRwcmVwcm9jX2NtZF9jZmdfaWlyX3R1bmluZ19maWx0ZXJfcGFyYW1zKS1cCi0JCQkoc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkpCi0JCQk8IHdyaXRlY291bnQpIHsKLQkJCU1NX0VSUigiQUNEQiBEQVRBIFdSSVRFIC0tSUlSIFRYIHdyaXRlY291bnQgIlwKLQkJCQkJCSI+IERTUCBzdHJ1Y3RcbiIpOwotCQl9IGVsc2UgewotCQkJaWYgKHByZXByb2NfaWlyICE9IE5VTEwpIHsKLQkJCQljaGFyICpiYXNlOyB1bnNpZ25lZCBzaG9ydCBvZmZzZXQ7Ci0JCQkJdW5zaWduZWQgc2hvcnQgKm9mZnNldF9hZGRyOwotCQkJCWJhc2UgPSAoY2hhciAqKXByZXByb2NfaWlyOwotCQkJCW9mZnNldCA9IG9mZnNldG9mKFwKLQkJCQlhdWRwcmVwcm9jX2NtZF9jZmdfaWlyX3R1bmluZ19maWx0ZXJfcGFyYW1zLFwKLQkJCQlhY3RpdmVfZmxhZyk7Ci0JCQkJb2Zmc2V0X2FkZHIgPSAodW5zaWduZWQgc2hvcnQgKikoYmFzZSArIFwKLQkJCQkJCW9mZnNldCk7Ci0JCQkJaWYgKChjb3B5X2Zyb21fdXNlcihvZmZzZXRfYWRkcixcCi0JCQkJCSh2b2lkICopdWJ1Ziwgd3JpdGVjb3VudCkpID09IDB4MDApIHsKLQkJCQkJcHJlcHJvY19paXItPmNtZF9pZCA9IGlpcmNtZGlkOwotCQkJCQlyZXN1bHQgPSBhdWRwcmVwcm9jX2RzcF9zZXRfaWlyKFwKLQkJCQkJCQlwcmVwcm9jX2lpciwKLQkJCQkJCQlpaXJjbWRzaXplKTsKLQkJCQkJaWYgKHJlc3VsdCkgewotCQkJCQkJTU1fRVJSKCJBQ0RCPT4gRmFpbGVkIHRvIHNlbmQgIlwKLQkJCQkJCSJJSVIgZGF0YSB0byBwcmVwcm9jXG4iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHZhbCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlNTV9FUlIoIkFDREIgREFUQSBXUklURSAtLS1JSVIgVHggIlwKLQkJCQkJCSJjb3B5X2Zyb21fdXNlciBGYWlsXG4iKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCU1NX0VSUigiQUNEQiBEQVRBIFdSSVRFIC0tSUlSIFRYIGthbGxvYyAiXAotCQkJCQkiRmFpbGVkIExFTlxuIik7Ci0JCSAgICAgfQotCQl9Ci0JCWlmIChwcmVwcm9jX2lpciAhPSBOVUxMKQotCQkJa2ZyZWUocHJlcHJvY19paXIpOwotCQlicmVhazsKLQl9Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBib29sIGFjZGJfc2V0X3J4X3J0Yyhjb25zdCBjaGFyICp1YnVmLCBzaXplX3Qgd3JpdGVjb3VudCkKLXsKLQotCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUgKnZvbHBhbl9jb25maWc7Ci0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX21iYWRyYyAqbWJhZHJjX2NvbmZpZzsKLQlzdHJ1Y3QgYWNkYl9ibG9ja19tYmFkcmNfcnRjICphY2RiX21iYWRyY19ydGM7Ci0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyICplcV9jb25maWc7Ci0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3BjbSAqaWlyX2NvbmZpZzsKLQlzdHJ1Y3QgcnRjX2FjZGJfcG1lbSAqcnRjX3dyaXRlID0gJnJ0Y19hY2RiLnJ0Y193cml0ZTsKLQlzMzIJcmVzdWx0ID0gMDsKLQlib29sIHJldHZhbCA9IGZhbHNlOwotCi0Jc3dpdGNoIChydGNfYWNkYi5zZXRfYWJpZCkgewotCWNhc2UgQVVEUFBfQ01EX1ZPTFVNRV9QQU46Ci0JewotCQl2b2xwYW5fY29uZmlnID0gIGttYWxsb2Moc2l6ZW9mKFwKLQkJCQkJIGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUpLFwKLQkJCQkJIEdGUF9LRVJORUwpOwotCQlpZiAoKHNpemVvZihhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfdm9sdW1lKSAtXAotCQkJc2l6ZW9mKGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19jb21tb24pKQotCQkJPCB3cml0ZWNvdW50KSB7Ci0JCQlNTV9FUlIoIkFDREIgREFUQSBXUklURSAtLSAiXAotCQkJCSJWb2xQYW4gd3JpdGVjb3VudCA+IERTUCBzdHJ1Y3RcbiIpOwotCQl9IGVsc2UgewotCQkJaWYgKHZvbHBhbl9jb25maWcgIT0gTlVMTCkgewotCQkJCWNoYXIgKmJhc2U7IHVuc2lnbmVkIHNob3J0IG9mZnNldDsKLQkJCQl1bnNpZ25lZCBzaG9ydCAqb2Zmc2V0X2FkZHI7Ci0JCQkJYmFzZSA9IChjaGFyICopdm9scGFuX2NvbmZpZzsKLQkJCQlvZmZzZXQgPSBvZmZzZXRvZihcCi0JCQkJCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUsXAotCQkJCQl2b2x1bWUpOwotCQkJCW9mZnNldF9hZGRyID0gKHVuc2lnbmVkIHNob3J0ICopKGJhc2Urb2Zmc2V0KTsKLQkJCQlpZiAoKGNvcHlfZnJvbV91c2VyKG9mZnNldF9hZGRyLFwKLQkJCQkJKHZvaWQgKil1YnVmLCB3cml0ZWNvdW50KSkgPT0gMHgwMCkgewotCQkJCQlNTV9FUlIoIkFDREIgUlggV1JJVEUgREFUQTogIlwKLQkJCQkJCSJBVURQUF9DTURfVk9MVU1FX1BBTlxuIik7Ci0JCQkJCXJlc3VsdCA9IGF1ZHBwX3NldF92b2x1bWVfYW5kX3BhbigKLQkJCQkJCUNPTU1PTl9PQkpfSUQsCi0JCQkJCQl2b2xwYW5fY29uZmlnLT52b2x1bWUsCi0JCQkJCQl2b2xwYW5fY29uZmlnLT5wYW4pOwotCQkJCQlpZiAocmVzdWx0KSB7Ci0JCQkJCQlNTV9FUlIoIkFDREI9PiBGYWlsZWQgdG8gIlwKLQkJCQkJCQkic2VuZCBWT0xQQU4gZGF0YSB0byIKLQkJCQkJCQkiIHBvc3Rwcm9jXG4iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHZhbCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlNTV9FUlIoIkFDREIgREFUQSBXUklURSAtLS0iXAotCQkJCQkJImNvcHlfZnJvbV91c2VyIEZhaWxcbiIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS0iXAotCQkJCQkiVm9sIFBhbiBrYWxsb2MgRmFpbGVkIExFTlxuIik7Ci0JCQl9Ci0JCX0KLQlpZiAodm9scGFuX2NvbmZpZyAhPSBOVUxMKQotCQlrZnJlZSh2b2xwYW5fY29uZmlnKTsKLQlicmVhazsKLQl9Ci0KLQljYXNlIEFVRFBQX0NNRF9JSVJfVFVOSU5HX0ZJTFRFUjoKLQl7Ci0JCWlpcl9jb25maWcgPSAga21hbGxvYyhzaXplb2YoXAotCQkJCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19wY20pLFwKLQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKChzaXplb2YoYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3BjbSkgLVwKLQkJCXNpemVvZihhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfY29tbW9uKSkKLQkJCTwgd3JpdGVjb3VudCkgewotCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS0iXAotCQkJCQkiSUlSIFJYIHdyaXRlY291bnQgPiBEU1Agc3RydWN0XG4iKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChpaXJfY29uZmlnICE9IE5VTEwpIHsKLQkJCQljaGFyICpiYXNlOyB1bnNpZ25lZCBzaG9ydCBvZmZzZXQ7Ci0JCQkJdW5zaWduZWQgc2hvcnQgKm9mZnNldF9hZGRyOwotCQkJCWJhc2UgPSAoY2hhciAqKWlpcl9jb25maWc7Ci0JCQkJb2Zmc2V0ID0gb2Zmc2V0b2YoXAotCQkJCQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfcGNtLFwKLQkJCQkJYWN0aXZlX2ZsYWcpOwotCQkJCW9mZnNldF9hZGRyID0gKHVuc2lnbmVkIHNob3J0ICopKGJhc2Urb2Zmc2V0KTsKLQkJCQlpZiAoKGNvcHlfZnJvbV91c2VyKG9mZnNldF9hZGRyLFwKLQkJCQkJKHZvaWQgKil1YnVmLCB3cml0ZWNvdW50KSkgPT0gMHgwMCkgewotCQkJCQlNTV9FUlIoIkFDREIgUlggV1JJVEUgREFUQToiXAotCQkJCQkiQVVEUFBfQ01EX0lJUl9UVU5JTkdfRklMVEVSXG4iKTsKLQkJCQkJcmVzdWx0ID0gYXVkcHBfZHNwX3NldF9yeF9paXIoCi0JCQkJCQlDT01NT05fT0JKX0lELAotCQkJCQkJaWlyX2NvbmZpZy0+YWN0aXZlX2ZsYWcsXAotCQkJCQkJaWlyX2NvbmZpZyk7Ci0JCQkJCWlmIChyZXN1bHQpIHsKLQkJCQkJCU1NX0VSUigiQUNEQj0+IEZhaWxlZCB0byBzZW5kIlwKLQkJCQkJCQkiSUlSIGRhdGEgdG8iXAotCQkJCQkJCSJwb3N0cHJvY1xuIik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR2YWwgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS0tIlwKLQkJCQkJCSJJSVIgUnggY29weV9mcm9tX3VzZXIgRmFpbFxuIik7Ci0JCQkJICAgICAgfQotCQkJIH0gZWxzZSB7Ci0JCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS0iXAotCQkJCQkiYWNkYl9paXJfYmxvY2sga2FsbG9jIEZhaWxlZCBMRU5cbiIpOwotCQkJfQotCQl9Ci0JCWlmIChpaXJfY29uZmlnICE9IE5VTEwpCi0JCQlrZnJlZShpaXJfY29uZmlnKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFBfQ01EX0VRVUFMSVpFUjoKLQl7Ci0JCWVxX2NvbmZpZyA9ICBrbWFsbG9jKHNpemVvZihcCi0JCQkJYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyKSxcCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKChzaXplb2YoYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyKSAtXAotCQkJc2l6ZW9mKGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19jb21tb24pKQotCQkJPCB3cml0ZWNvdW50KSB7Ci0JCQlNTV9FUlIoIkFDREIgREFUQSBXUklURSAtLSJcCi0JCQkiRVEgUlggd3JpdGVjb3VudCA+IERTUCBzdHJ1Y3RcbiIpOwotCQl9IGVsc2UgewotCQkJaWYgKGVxX2NvbmZpZyAhPSBOVUxMKSB7Ci0JCQkJY2hhciAqYmFzZTsgdW5zaWduZWQgc2hvcnQgb2Zmc2V0OwotCQkJCXVuc2lnbmVkIHNob3J0ICpvZmZzZXRfYWRkcjsKLQkJCQliYXNlID0gKGNoYXIgKillcV9jb25maWc7Ci0JCQkJb2Zmc2V0ID0gb2Zmc2V0b2YoXAotCQkJCQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfZXFhbGl6ZXIsXAotCQkJCQllcV9mbGFnKTsKLQkJCQlvZmZzZXRfYWRkciA9ICh1bnNpZ25lZCBzaG9ydCAqKShiYXNlK29mZnNldCk7Ci0JCQkJaWYgKChjb3B5X2Zyb21fdXNlcihvZmZzZXRfYWRkcixcCi0JCQkJCSh2b2lkICopdWJ1Ziwgd3JpdGVjb3VudCkpID09IDB4MDApIHsKLQkJCQkJTU1fRVJSKCJBQ0RCIFJYIFdSSVRFIlwKLQkJCQkJIkRBVEE6QVVEUFBfQ01EX0VRVUFMSVpFUlxuIik7Ci0JCQkJCXJlc3VsdCA9IGF1ZHBwX2RzcF9zZXRfZXEoCi0JCQkJCQlDT01NT05fT0JKX0lELAotCQkJCQkJZXFfY29uZmlnLT5lcV9mbGFnLFwKLQkJCQkJCWVxX2NvbmZpZyk7Ci0JCQkJCWlmIChyZXN1bHQpIHsKLQkJCQkJCU1NX0VSUigiQUNEQj0+IEZhaWxlZCB0byAiXAotCQkJCQkJInNlbmQgRVEgZGF0YSB0byBwb3N0cHJvY1xuIik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR2YWwgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS0tIlwKLQkJCQkJIkVRIFJ4IGNvcHlfZnJvbV91c2VyIEZhaWxcbiIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS0iXAotCQkJCQkiRVEga2FsbG9jIEZhaWxlZCBMRU5cbiIpOwotCQkJfQotCQl9Ci0JCWlmIChlcV9jb25maWcgIT0gTlVMTCkKLQkJCWtmcmVlKGVxX2NvbmZpZyk7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgQVVEUFBfQ01EX01CQURSQzoKLQl7Ci0JCWFjZGJfbWJhZHJjX3J0YyA9ICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgXAotCQkJCQlhY2RiX2Jsb2NrX21iYWRyY19ydGMpLFwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCW1iYWRyY19jb25maWcgPSAga21hbGxvYyhzaXplb2YoXAotCQkJCQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfbWJhZHJjKSxcCi0JCQkJCUdGUF9LRVJORUwpOwotCQlpZiAobWJhZHJjX2NvbmZpZyAhPSBOVUxMICYmIGFjZGJfbWJhZHJjX3J0YyAhPSBOVUxMKSB7Ci0JCQlpZiAoKGNvcHlfZnJvbV91c2VyKGFjZGJfbWJhZHJjX3J0YyxcCi0JCQkJKHZvaWQgKil1YnVmLAotCQkJCXNpemVvZihzdHJ1Y3QgYWNkYl9ibG9ja19tYmFkcmNfcnRjKSkpCi0JCQkJPT0gMHgwMCkgewotCi0JCQkJbWVtc2V0KG1iYWRyY19jb25maWcsIDAsCi0JCQkJCXNpemVvZihcCi0JCQkJCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19tYmFkcmMpKTsKLQotCQkJCW1iYWRyY19jb25maWctPmVuYWJsZSA9Ci0JCQkJCQlhY2RiX21iYWRyY19ydGMtPmVuYWJsZTsKLQkJCQltYmFkcmNfY29uZmlnLT5udW1fYmFuZHMgPQotCQkJCQkJYWNkYl9tYmFkcmNfcnRjLT5udW1fYmFuZHM7Ci0JCQkJbWJhZHJjX2NvbmZpZy0+ZG93bl9zYW1wX2xldmVsID0KLQkJCQlhY2RiX21iYWRyY19ydGMtPmRvd25fc2FtcF9sZXZlbDsKLQkJCQltYmFkcmNfY29uZmlnLT5hZHJjX2RlbGF5ID0KLQkJCQkJYWNkYl9tYmFkcmNfcnRjLT5hZHJjX2RlbGF5OwotCQkJCW1lbWNweShtYmFkcmNfY29uZmlnLT5hZHJjX2JhbmQsXAotCQkJCQlhY2RiX21iYWRyY19ydGMtPmFkcmNfYmFuZCxcCi0JCQkJCUFVRFBQX01BWF9NQkFEUkNfQkFORFMgKlwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBhZHJjX2NvbmZpZykpOwotCQkJCWlmIChtYmFkcmNfY29uZmlnLT5udW1fYmFuZHMgPiAxKSB7Ci0JCQkJCW1iYWRyY19jb25maWctPmV4dF9idWZfc2l6ZSA9Ci0JCQkJCQkoOTcgKiAyKSArICgzMyAqIDIgKiBcCi0JCQkJCShtYmFkcmNfY29uZmlnLT5udW1fYmFuZHMgLSAyKSk7Ci0JCQkJfQotCQkJCW1iYWRyY19jb25maWctPmV4dF9wYXJ0aXRpb24gPSAwOwotCQkJCW1iYWRyY19jb25maWctPmV4dF9idWZfbHN3ID0KLQkJCQkJKHUxNikgRVhUUkFDVF9MT1dfV09SRChcCi0JCQkJCQlydGNfd3JpdGUtPnBoeXMpOwotCQkJCW1iYWRyY19jb25maWctPmV4dF9idWZfbXN3ID0KLQkJCQkJKHUxNikgRVhUUkFDVF9ISUdIX1dPUkQoXAotCQkJCQkJcnRjX3dyaXRlLT5waHlzKTsKLQkJCQltZW1jcHkocnRjX3dyaXRlLT52aXJhZGRyLAotCQkJCQlhY2RiX21iYWRyY19ydGMtPmV4dF9idWZmLAotCQkJCQkoMTk2KnNpemVvZihzaWduZWQgaW50KSkpOwotCQkJCXJlc3VsdCA9IGF1ZHBwX2RzcF9zZXRfbWJhZHJjKAotCQkJCQkJQ09NTU9OX09CSl9JRCwKLQkJCQkJCW1iYWRyY19jb25maWctPmVuYWJsZSwKLQkJCQkJCW1iYWRyY19jb25maWcpOwotCQkJCWlmIChyZXN1bHQpIHsKLQkJCQkJTU1fRVJSKCJBQ0RCPT4gRmFpbGVkIHRvICJcCi0JCQkJCQkiU2VuZCBNQkFEUkMgZGF0YSAiXAotCQkJCQkJInRvIHBvc3Rwcm9jXG4iKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR2YWwgPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS0tIlwKLQkJCQkJIk1CQURSQyBSeCBjb3B5X2Zyb21fdXNlciBGYWlsXG4iKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiQUNEQiBEQVRBIFdSSVRFIC0tTUJBRFJDIGthbGxvYyBGYWlsZWQgTEVOXG4iKTsKLQkJfQotCQlpZiAobWJhZHJjX2NvbmZpZyAhPSBOVUxMKQotCQkJa2ZyZWUobWJhZHJjX2NvbmZpZyk7Ci0JCWlmIChhY2RiX21iYWRyY19ydGMgIT0gTlVMTCkKLQkJCWtmcmVlKGFjZGJfbWJhZHJjX3J0Yyk7Ci0JYnJlYWs7Ci0JfQotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotc3RhdGljIHNzaXplX3QgcnRjX2dldHNldGFiaWRfZGF0YV9kYmdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkJCQljb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwKLQkJCQkJCXNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKLXsKLQlpZiAocnRjX2FjZGIudmFsaWRfYWJpZCAhPSB0cnVlKSB7Ci0JCU1NX0lORk8oIkFDREIgREFUQSBSRUFEIC0tLUlOVkFMSUQgQUJJRFxuIik7Ci0JCXJ0Y19hY2RiLmVyciA9IEFDREJfUlRDX0VSUl9JTlZBTElEX0FCSUQ7Ci0JfSBlbHNlIHsKLQkJaWYgKHJ0Y19hY2RiLnR4X3J4X2N0bCA9PSBBQ0RCX1JUQ19SWCkgewotCQkJaWYgKGFjZGJfc2V0X3J4X3J0Yyh1YnVmLCBjbnQpKSB7Ci0JCQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfU1VDQ0VTUzsKLQkJCX0gZWxzZSB7Ci0JCQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfRVJSX1VOS05PV05fRkFJTFVSRTsKLQkJCQljbnQgPSAwOwotCQkJfQotCQl9IGVsc2UgaWYgKHJ0Y19hY2RiLnR4X3J4X2N0bCA9PSBBQ0RCX1JUQ19UWCkgewotCQkJaWYgKGFjZGJfc2V0X3R4X3J0Yyh1YnVmLCBjbnQpKSB7Ci0JCQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfU1VDQ0VTUzsKLQkJCX0gZWxzZSB7Ci0JCQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfRVJSX1VOS05PV05fRkFJTFVSRTsKLQkJCQljbnQgPSAwOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBjbnQ7Ci19Ci0KLQotc3RhdGljIGNvbnN0CXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnRjX2FjZGJfZGF0YV9kZWJ1Z19mb3BzID0gewotCS5vcGVuID0gcnRjX2dldHNldGFiaWRfZGF0YV9kYmdfb3BlbiwKLQkud3JpdGUgPSBydGNfZ2V0c2V0YWJpZF9kYXRhX2RiZ193cml0ZSwKLQkucmVhZCA9IHJ0Y19nZXRzZXRhYmlkX2RhdGFfZGJnX3JlYWQKLX07Ci0KLXN0YXRpYyBjb25zdAlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ0Y19hY2RiX2RlYnVnX2ZvcHMgPSB7Ci0JLm9wZW4gPSBydGNfZ2V0c2V0YWJpZF9kYmdfb3BlbiwKLQkud3JpdGUgPSBydGNfZ2V0c2V0YWJpZF9kYmdfd3JpdGUsCi0JLnJlYWQgPSBydGNfZ2V0c2V0YWJpZF9kYmdfcmVhZAotfTsKLQotc3RhdGljIHZvaWQgcnRjX2FjZGJfZGVpbml0KHZvaWQpCi17Ci0Jc3RydWN0IHJ0Y19hY2RiX3BtZW0gKnJ0Y19yZWFkID0gJnJ0Y19hY2RiLnJ0Y19yZWFkOwotCXN0cnVjdCBydGNfYWNkYl9wbWVtICpydGNfd3JpdGUgPSAmcnRjX2FjZGIucnRjX3dyaXRlOwotCWlmIChnZXRfc2V0X2FiaWRfZGVudHJ5KSB7Ci0JCU1NX0RCRygiR2V0U2V0IEFCSUQgcmVtb3ZlIGRlYnVnZnNcbiIpOwotCQlkZWJ1Z2ZzX3JlbW92ZShnZXRfc2V0X2FiaWRfZGVudHJ5KTsKLQl9Ci0KLQlpZiAoZ2V0X3NldF9hYmlkX2RhdGFfZGVudHJ5KSB7Ci0JCU1NX0RCRygiR2V0U2V0IEFCSUQgcmVtb3ZlIGRlYnVnZnNcbiIpOwotCQlkZWJ1Z2ZzX3JlbW92ZShnZXRfc2V0X2FiaWRfZGF0YV9kZW50cnkpOwotCX0KLQlydGNfYWNkYi5hYmlkID0gMDsKLQlydGNfYWNkYi5hY2RiX2lkID0gMDsKLQlydGNfYWNkYi5jbWRfaWQgPSAwOwotCXJ0Y19hY2RiLmVyciA9IDE7Ci0JcnRjX2FjZGIuc2V0X2FiaWQgPSAwOwotCXJ0Y19hY2RiLnNldF9paWQgPSAwOwotCXJ0Y19hY2RiLnR4X3J4X2N0bCA9IDA7Ci0JcnRjX2FjZGIudmFsaWRfYWJpZCA9IGZhbHNlOwotCi0JaWYgKHJ0Y19yZWFkLT52aXJhZGRyICE9IE5VTEwgfHwgKCh2b2lkICopcnRjX3JlYWQtPnBoeXMpICE9IE5VTEwpIHsKLQkJaW91bm1hcChydGNfcmVhZC0+bWFwX3ZfcnRjKTsKLQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcihydGNfcmVhZC0+cGh5cyk7Ci0JfQotCWlmIChydGNfd3JpdGUtPnZpcmFkZHIgIT0gTlVMTCB8fCAoKHZvaWQgKilydGNfd3JpdGUtPnBoeXMpICE9IE5VTEwpIHsKLQkJaW91bm1hcChydGNfd3JpdGUtPm1hcF92X3J0Yyk7Ci0JCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIocnRjX3dyaXRlLT5waHlzKTsKLQl9Ci19Ci0KLXN0YXRpYyBib29sIHJ0Y19hY2RiX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgcnRjX2FjZGJfcG1lbSAqcnRjX3JlYWQgPSAmcnRjX2FjZGIucnRjX3JlYWQ7Ci0Jc3RydWN0IHJ0Y19hY2RiX3BtZW0gKnJ0Y193cml0ZSA9ICZydGNfYWNkYi5ydGNfd3JpdGU7Ci0JczMyIHJlc3VsdCA9IDA7Ci0JY2hhciBuYW1lW3NpemVvZiAiZ2V0X3NldF9hYmlkIisxXTsKLQljaGFyIG5hbWUxW3NpemVvZiAiZ2V0X3NldF9hYmlkX2RhdGEiKzFdOwotCXJ0Y19hY2RiLmFiaWQgPSAwOwotCXJ0Y19hY2RiLmFjZGJfaWQgPSAwOwotCXJ0Y19hY2RiLmNtZF9pZCA9IDA7Ci0JcnRjX2FjZGIuZXJyID0gMTsKLQlydGNfYWNkYi5zZXRfYWJpZCA9IDA7Ci0JcnRjX2FjZGIuc2V0X2lpZCA9IDA7Ci0JcnRjX2FjZGIudmFsaWRfYWJpZCA9IGZhbHNlOwotCXJ0Y19hY2RiLnR4X3J4X2N0bCA9IDA7Ci0KLQlzbnByaW50ZihuYW1lLCBzaXplb2YgbmFtZSwgImdldF9zZXRfYWJpZCIpOwotCWdldF9zZXRfYWJpZF9kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsCi0JCQlTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVR08sCi0JCQlOVUxMLCBOVUxMLCAmcnRjX2FjZGJfZGVidWdfZm9wcyk7Ci0JaWYgKElTX0VSUihnZXRfc2V0X2FiaWRfZGVudHJ5KSkgewotCQlNTV9FUlIoIlNFVCBHRVQgQUJJRCBkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzbnByaW50ZihuYW1lMSwgc2l6ZW9mIG5hbWUxLCAiZ2V0X3NldF9hYmlkX2RhdGEiKTsKLQlnZXRfc2V0X2FiaWRfZGF0YV9kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUxLAotCQkJU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVUdPLAotCQkJTlVMTCwgTlVMTCwKLQkJCSZydGNfYWNkYl9kYXRhX2RlYnVnX2ZvcHMpOwotCWlmIChJU19FUlIoZ2V0X3NldF9hYmlkX2RhdGFfZGVudHJ5KSkgewotCQlNTV9FUlIoIlNFVCBHRVQgQUJJRCBEQVRBIlwKLQkJCQkiIGRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXJ0Y19yZWFkLT5waHlzID0gYWxsb2NhdGVfY29udGlndW91c19lYmlfbm9tYXAoUE1FTV9SVENfQUNEQl9RVUVSWV9NRU0sCi0JCQkJCQkJCSBTWl80Syk7Ci0KLQlpZiAoIXJ0Y19yZWFkLT5waHlzKSB7Ci0JCU1NX0VSUigiQUNEQiBDYW5ub3QgYWxsb2NhdGUgcGh5c2ljYWwgbWVtb3J5XG4iKTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JcnRjX3JlYWQtPm1hcF92X3J0YyA9IGlvcmVtYXAocnRjX3JlYWQtPnBoeXMsCi0JCQkJUE1FTV9SVENfQUNEQl9RVUVSWV9NRU0pOwotCi0JaWYgKElTX0VSUihydGNfcmVhZC0+bWFwX3ZfcnRjKSkgewotCQlNTV9FUlIoIkFDREIgQ291bGQgbm90IG1hcCBwaHlzaWNhbCBhZGRyZXNzXG4iKTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JcnRjX3JlYWQtPnZpcmFkZHIgPSBydGNfcmVhZC0+bWFwX3ZfcnRjOwotCW1lbXNldChydGNfcmVhZC0+dmlyYWRkciwgMCwgUE1FTV9SVENfQUNEQl9RVUVSWV9NRU0pOwotCi0JcnRjX3dyaXRlLT5waHlzID0gYWxsb2NhdGVfY29udGlndW91c19lYmlfbm9tYXAoUE1FTV9SVENfQUNEQl9RVUVSWV9NRU0sCi0JCQkJCQkJCVNaXzRLKTsKLQotCWlmICghcnRjX3dyaXRlLT5waHlzKSB7Ci0JCU1NX0VSUigiQUNEQiBDYW5ub3QgYWxsb2NhdGUgcGh5c2ljYWwgbWVtb3J5XG4iKTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JcnRjX3dyaXRlLT5tYXBfdl9ydGMgPSBpb3JlbWFwKHJ0Y193cml0ZS0+cGh5cywKLQkJCQlQTUVNX1JUQ19BQ0RCX1FVRVJZX01FTSk7Ci0KLQlpZiAoSVNfRVJSKHJ0Y193cml0ZS0+bWFwX3ZfcnRjKSkgewotCQlNTV9FUlIoIkFDREIgQ291bGQgbm90IG1hcCBwaHlzaWNhbCBhZGRyZXNzXG4iKTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JcnRjX3dyaXRlLT52aXJhZGRyID0gcnRjX3dyaXRlLT5tYXBfdl9ydGM7Ci0JbWVtc2V0KHJ0Y193cml0ZS0+dmlyYWRkciwgMCwgUE1FTV9SVENfQUNEQl9RVUVSWV9NRU0pOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJ0Y19hY2RiLndhaXQpOwotCXJldHVybiB0cnVlOwotZXJyb3I6Ci0JTU1fREJHKCJJTklUIFJUQyBGQUlMRUQgUkVNT1ZJTkcgUlRDIERFQlVHIEZTXG4iKTsKLQlpZiAoZ2V0X3NldF9hYmlkX2RlbnRyeSkgewotCQlNTV9EQkcoIkdldFNldCBBQklEIHJlbW92ZSBkZWJ1Z2ZzXG4iKTsKLQkJZGVidWdmc19yZW1vdmUoZ2V0X3NldF9hYmlkX2RlbnRyeSk7Ci0JfQotCi0JaWYgKGdldF9zZXRfYWJpZF9kYXRhX2RlbnRyeSkgewotCQlNTV9EQkcoIkdldFNldCBBQklEIHJlbW92ZSBkZWJ1Z2ZzXG4iKTsKLQkJZGVidWdmc19yZW1vdmUoZ2V0X3NldF9hYmlkX2RhdGFfZGVudHJ5KTsKLQl9Ci0JaWYgKHJ0Y19yZWFkLT52aXJhZGRyICE9IE5VTEwgfHwgKCh2b2lkICopcnRjX3JlYWQtPnBoeXMpICE9IE5VTEwpIHsKLQkJaW91bm1hcChydGNfcmVhZC0+bWFwX3ZfcnRjKTsKLQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcihydGNfcmVhZC0+cGh5cyk7Ci0JfQotCWlmIChydGNfd3JpdGUtPnZpcmFkZHIgIT0gTlVMTCB8fCAoKHZvaWQgKilydGNfd3JpdGUtPnBoeXMpICE9IE5VTEwpIHsKLQkJaW91bm1hcChydGNfd3JpdGUtPm1hcF92X3J0Yyk7Ci0JCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIocnRjX3dyaXRlLT5waHlzKTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotI2Vsc2UKLXZvaWQgYWNkYl9ydGNfc2V0X2Vycih1MzIgZXJyX2NvZGUpCi17Ci0JcmV0dXJuIDAKLX0KLSNlbmRpZiAvKkNPTkZJR19ERUJVR19GUyovCi1zdGF0aWMgczMyIGFjZGJfc2V0X2NhbGlicmF0aW9uX2Jsayh1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYWNkYl9jbWRfZGV2aWNlIGFjZGJfY21kOwotCXMzMiByZXN1bHQgPSAwOwotCi0JTU1fREJHKCJhY2RiX3NldF9jYWxpYnJhdGlvbl9ibGtcbiIpOwotCWlmIChjb3B5X2Zyb21fdXNlcigmYWNkYl9jbWQsIChzdHJ1Y3QgYWNkYl9jbWRfZGV2aWNlICopYXJnLAotCQkJc2l6ZW9mKGFjZGJfY21kKSkpIHsKLQkJTU1fRVJSKCJGYWlsZWQgY29weSBjb21tYW5kIHN0cnVjdCBmcm9tIHVzZXIgaW4iXAotCQkJImFjZGJfc2V0X2NhbGlicmF0aW9uX2Jsa1xuIik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQlhY2RiX2NtZC5waHlzX2J1ZiA9ICh1MzIgKilhY2RiX2RhdGEucGFkZHI7Ci0KLQlNTV9EQkcoImFjZGJfY21kLnBoeXNfYnVmICV4XG4iLCAodTMyKWFjZGJfY21kLnBoeXNfYnVmKTsKLQotCXJlc3VsdCA9IGRhbHJwY19mY25fOChBQ0RCX0RBTF9JT0NUTCwgYWNkYl9kYXRhLmhhbmRsZSwKLQkJCShjb25zdCB2b2lkICopJmFjZGJfY21kLCBzaXplb2YoYWNkYl9jbWQpLAotCQkJJmFjZGJfZGF0YS5hY2RiX3Jlc3VsdCwKLQkJCXNpemVvZihhY2RiX2RhdGEuYWNkYl9yZXN1bHQpKTsKLQotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCU1NX0VSUigiQUNEQj0+IERldmljZSBTZXQgUlBDIGZhaWx1cmUiXAotCQkJIiByZXN1bHQgPSAlZFxuIiwgcmVzdWx0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJTU1fRVJSKCJBQ0RCPT4gRGV2aWNlIFNldCBSUEMgc3VjY2Vzc1xuIik7Ci0JCWlmIChhY2RiX2RhdGEuYWNkYl9yZXN1bHQucmVzdWx0ID09IEFDREJfUkVTX1NVQ0NFU1MpCi0JCQlNTV9EQkcoIkFDREJfU0VUX0RFVklDRSBTdWNjZXNzXG4iKTsKLQkJZWxzZSBpZiAoYWNkYl9kYXRhLmFjZGJfcmVzdWx0LnJlc3VsdCA9PSBBQ0RCX1JFU19GQUlMVVJFKQotCQkJTU1fRVJSKCJBQ0RCX1NFVF9ERVZJQ0UgRmFpbHVyZVxuIik7Ci0JCWVsc2UgaWYgKGFjZGJfZGF0YS5hY2RiX3Jlc3VsdC5yZXN1bHQgPT0gQUNEQl9SRVNfQkFEUEFSTSkKLQkJCU1NX0VSUigiQUNEQl9TRVRfREVWSUNFIEJhZFBhcmFtc1xuIik7Ci0JCWVsc2UKLQkJCU1NX0VSUigiVW5rbm93biBlcnJvclxuIik7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBzMzIgYWNkYl9nZXRfY2FsaWJyYXRpb25fYmxrKHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXMzMiByZXN1bHQgPSAwOwotCXN0cnVjdCBhY2RiX2NtZF9kZXZpY2UgYWNkYl9jbWQ7Ci0KLQlNTV9EQkcoImFjZGJfZ2V0X2NhbGlicmF0aW9uX2Jsa1xuIik7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmFjZGJfY21kLCAoc3RydWN0IGFjZGJfY21kX2RldmljZSAqKWFyZywKLQkJCXNpemVvZihhY2RiX2NtZCkpKSB7Ci0JCU1NX0VSUigiRmFpbGVkIGNvcHkgY29tbWFuZCBzdHJ1Y3QgZnJvbSB1c2VyIGluIlwKLQkJCSJhY2RiX2dldF9jYWxpYnJhdGlvbl9ibGtcbiIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JYWNkYl9jbWQucGh5c19idWYgPSAodTMyICopYWNkYl9kYXRhLnBhZGRyOwotCU1NX0VSUigiYWNkYl9jbWQucGh5c19idWYgJXhcbiIsICh1MzIpYWNkYl9jbWQucGh5c19idWYpOwotCi0JcmVzdWx0ID0gZGFscnBjX2Zjbl84KEFDREJfREFMX0lPQ1RMLCBhY2RiX2RhdGEuaGFuZGxlLAotCQkJKGNvbnN0IHZvaWQgKikmYWNkYl9jbWQsIHNpemVvZihhY2RiX2NtZCksCi0JCQkmYWNkYl9kYXRhLmFjZGJfcmVzdWx0LAotCQkJc2l6ZW9mKGFjZGJfZGF0YS5hY2RiX3Jlc3VsdCkpOwotCi0JaWYgKHJlc3VsdCA8IDApIHsKLQkJTU1fRVJSKCJBQ0RCPT4gRGV2aWNlIEdldCBSUEMgZmFpbHVyZSJcCi0JCQkiIHJlc3VsdCA9ICVkXG4iLCByZXN1bHQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9IGVsc2UgewotCQlNTV9FUlIoIkFDREI9PiBEZXZpY2UgR2V0IFJQQyBTdWNjZXNzXG4iKTsKLQkJaWYgKGFjZGJfZGF0YS5hY2RiX3Jlc3VsdC5yZXN1bHQgPT0gQUNEQl9SRVNfU1VDQ0VTUykKLQkJCU1NX0RCRygiQUNEQl9HRVRfREVWSUNFIFN1Y2Nlc3NcbiIpOwotCQllbHNlIGlmIChhY2RiX2RhdGEuYWNkYl9yZXN1bHQucmVzdWx0ID09IEFDREJfUkVTX0ZBSUxVUkUpCi0JCQlNTV9FUlIoIkFDREJfR0VUX0RFVklDRSBGYWlsdXJlXG4iKTsKLQkJZWxzZSBpZiAoYWNkYl9kYXRhLmFjZGJfcmVzdWx0LnJlc3VsdCA9PSBBQ0RCX1JFU19CQURQQVJNKQotCQkJTU1fRVJSKCJBQ0RCX0dFVF9ERVZJQ0UgQmFkUGFyYW1zXG4iKTsKLQkJZWxzZQotCQkJTU1fRVJSKCJVbmtub3duIGVycm9yXG4iKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBhdWRpb19hY2RiX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JTU1fREJHKCIlc1xuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotc3RhdGljIGludCBhdWRpb19hY2RiX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JTU1fREJHKCIlc1xuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19hY2RiX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmMgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCi0JTU1fREJHKCIlc1xuIiwgX19mdW5jX18pOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NFVF9FUToKLQkJTU1fREJHKCJJT0NUTCBTRVRfRVFfQ09ORklHXG4iKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhY2RiX2RhdGEuZXEubnVtX2JhbmRzLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGFjZGJfZGF0YS5lcSkgLQotCQkJCShBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfQ09NTU9OX0xFTiArIDIpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmFjZGJfZGF0YS5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IGF1ZHBwX2RzcF9zZXRfZXEoQ09NTU9OX09CSl9JRCwgMSwKLQkJCSZhY2RiX2RhdGEuZXEpOwotCQlpZiAocmMgPCAwKQotCQkJTU1fRVJSKCJBVURQUCByZXR1cm5lZCBlcnIgPSVkXG4iLCByYyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjZGJfZGF0YS5kc3BfbG9jaywgZmxhZ3MpOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9BQ0RCX0JMSzoKLQkJTU1fREJHKCJJT0NUTCBBVURJT19TRVRfQUNEQl9CTEtcbiIpOwotCQlyYyA9IGFjZGJfc2V0X2NhbGlicmF0aW9uX2JsayhhcmcpOwotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9BQ0RCX0JMSzoKLQkJTU1fREJHKCJJT2lDVEwgQVVESU9fR0VUX0FDREJfQkxLXG4iKTsKLQkJcmMgPSBhY2RiX2dldF9jYWxpYnJhdGlvbl9ibGsoYXJnKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fREJHKCJVbmtub3duIElPQ1RMJWRcbiIsIGNtZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY2RiX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSBhdWRpb19hY2RiX29wZW4sCi0JLnJlbGVhc2UgPSBhdWRpb19hY2RiX3JlbGVhc2UsCi0JLmxsc2VlayA9IG5vX2xsc2VlaywKLQkudW5sb2NrZWRfaW9jdGwgPSBhdWRpb19hY2RiX2lvY3RsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhY2RiX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gIm1zbV9hY2RiIiwKLQkuZm9wcwk9ICZhY2RiX2ZvcHMsCi19OwotCi1zdGF0aWMgczMyIGFjZGJfZ2V0X2NhbGlicmF0aW9uKHZvaWQpCi17Ci0Jc3RydWN0IGFjZGJfY21kX2dldF9kZXZpY2VfdGFibGUJYWNkYl9jbWQ7Ci0JczMyCQkJCQlyZXN1bHQgPSAwOwotCXUzMiBpdGVyYXRpb25zID0gMDsKLQotCU1NX0RCRygiYWNkYiBzdGF0ZSA9ICVkXG4iLCBhY2RiX2RhdGEuYWNkYl9zdGF0ZSk7Ci0KLQlhY2RiX2NtZC5jb21tYW5kX2lkID0gQUNEQl9HRVRfREVWSUNFX1RBQkxFOwotCWFjZGJfY21kLmRldmljZV9pZCA9IGFjZGJfZGF0YS5kZXZpY2VfaW5mby0+YWNkYl9pZDsKLQlhY2RiX2NtZC5uZXR3b3JrX2lkID0gMHgwMTA4QjE1MzsKLQlhY2RiX2NtZC5zYW1wbGVfcmF0ZV9pZCA9IGFjZGJfZGF0YS5kZXZpY2VfaW5mby0+c2FtcGxlX3JhdGU7Ci0JYWNkYl9jbWQudG90YWxfYnl0ZXMgPSBBQ0RCX0JVRl9TSVpFOwotCWFjZGJfY21kLnBoeXNfYnVmID0gKHUzMiAqKWFjZGJfZGF0YS5waHlzX2FkZHI7Ci0JTU1fREJHKCJkZXZpY2VfaWQgPSAlZCwgc2FtcGxpbmdfZnJlcSA9ICVkXG4iLAotCQkJCWFjZGJfY21kLmRldmljZV9pZCwgYWNkYl9jbWQuc2FtcGxlX3JhdGVfaWQpOwotCi0JZG8gewotCQlyZXN1bHQgPSBkYWxycGNfZmNuXzgoQUNEQl9EQUxfSU9DVEwsIGFjZGJfZGF0YS5oYW5kbGUsCi0JCQkJKGNvbnN0IHZvaWQgKikmYWNkYl9jbWQsIHNpemVvZihhY2RiX2NtZCksCi0JCQkJJmFjZGJfZGF0YS5hY2RiX3Jlc3VsdCwKLQkJCQlzaXplb2YoYWNkYl9kYXRhLmFjZGJfcmVzdWx0KSk7Ci0KLQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCU1NX0VSUigiQUNEQj0+IERldmljZSB0YWJsZSBSUEMgZmFpbHVyZSJcCi0JCQkJIiByZXN1bHQgPSAlZFxuIiwgcmVzdWx0KTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJLypmb2xsb3dpbmcgY2hlY2sgaXMgaW50cm9kdWNlZCB0byBoYW5kbGUgYm9vdCB1cCByYWNlCi0JCWNvbmRpdGlvbiBiZXR3ZWVuIEFVRENBTCBTVyBwZWVycyBydW5uaW5nIG9uIGFwcHMKLQkJYW5kIG1vZGVtIChBQ0RCX1JFU19CQURTVEFURSBpbmRpY2F0ZXMgbW9kZW0gQVVEQ0FMIFNXIGlzCi0JCW5vdCBpbiBpbml0aWFsaXplZCBzYXRlKSB3ZSBuZWVkIHRvIHJldHJ5IHRvIGdldCBBQ0RCCi0JCXZhbHVlcyovCi0JCWlmIChhY2RiX2RhdGEuYWNkYl9yZXN1bHQucmVzdWx0ID09IEFDREJfUkVTX0JBRFNUQVRFKSB7Ci0JCQltc2xlZXAoNTAwKTsKLQkJCWl0ZXJhdGlvbnMrKzsKLQkJfSBlbHNlIGlmIChhY2RiX2RhdGEuYWNkYl9yZXN1bHQucmVzdWx0ID09IEFDREJfUkVTX1NVQ0NFU1MpIHsKLQkJCU1NX0RCRygiTW9kZW0gcXVlcnkgZm9yIGFjZGIgdmFsdWVzIGlzIHN1Y2Nlc3NmdWwiXAotCQkJCQkiIChpdGVyYXRpb25zID0gJWQpXG4iLCBpdGVyYXRpb25zKTsKLQkJCWFjZGJfZGF0YS5hY2RiX3N0YXRlIHw9IENBTF9EQVRBX1JFQURZOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiQUNEQj0+IG1vZGVtIGZhaWxlZCB0byBmaWxsIGFjZGIgdmFsdWVzLCJcCi0JCQkJCSIgcmV1c2x0ID0gJWQsIChpdGVyYXRpb25zID0gJWQpXG4iLAotCQkJCQlhY2RiX2RhdGEuYWNkYl9yZXN1bHQucmVzdWx0LAotCQkJCQlpdGVyYXRpb25zKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9IHdoaWxlIChpdGVyYXRpb25zIDwgTUFYX1JFVFJZKTsKLQlNTV9FUlIoIkFDREI9PiBBVURDQUwgU1cgb24gbW9kZW0gaXMgbm90IGluIGludGlhaWxpemVkIHN0YXRlICglZClcbiIsCi0JCQlhY2RiX2RhdGEuYWNkYl9yZXN1bHQucmVzdWx0KTsKLWVycm9yOgotCXJlc3VsdCA9IC1FSU5WQUw7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotczMyIGFjZGJfZ2V0X2NhbGlicmF0aW9uX2RhdGEoc3RydWN0IGFjZGJfZ2V0X2Jsb2NrICpnZXRfYmxvY2spCi17Ci0JczMyIHJlc3VsdCA9IC1FSU5WQUw7Ci0Jc3RydWN0IGFjZGJfY21kX2RldmljZSBhY2RiX2NtZDsKLQlzdHJ1Y3QgYWNkYl9yZXN1bHQgYWNkYl9yZXN1bHQ7Ci0KLQlNTV9EQkcoImFjZGJfZ2V0X2NhbGlicmF0aW9uX2RhdGFcbiIpOwotCi0JYWNkYl9jbWQuY29tbWFuZF9pZCA9IEFDREJfR0VUX0RFVklDRTsKLQlhY2RiX2NtZC5uZXR3b3JrX2lkID0gMHgwMTA4QjE1MzsKLQlhY2RiX2NtZC5kZXZpY2VfaWQgPSBnZXRfYmxvY2stPmFjZGJfaWQ7Ci0JYWNkYl9jbWQuc2FtcGxlX3JhdGVfaWQgPSBnZXRfYmxvY2stPnNhbXBsZV9yYXRlX2lkOwotCWFjZGJfY21kLmludGVyZmFjZV9pZCA9IGdldF9ibG9jay0+aW50ZXJmYWNlX2lkOwotCWFjZGJfY21kLmFsZ29yaXRobV9ibG9ja19pZCA9IGdldF9ibG9jay0+YWxnb3JpdGhtX2Jsb2NrX2lkOwotCWFjZGJfY21kLnRvdGFsX2J5dGVzID0gZ2V0X2Jsb2NrLT50b3RhbF9ieXRlczsKLQlhY2RiX2NtZC5waHlzX2J1ZiA9ICh1MzIgKilhY2RiX2RhdGEuZ2V0X2Jsa19wYWRkcjsKLQotCXJlc3VsdCA9IGRhbHJwY19mY25fOChBQ0RCX0RBTF9JT0NUTCwgYWNkYl9kYXRhLmhhbmRsZSwKLQkJCShjb25zdCB2b2lkICopJmFjZGJfY21kLCBzaXplb2YoYWNkYl9jbWQpLAotCQkJJmFjZGJfcmVzdWx0LAotCQkJc2l6ZW9mKGFjZGJfcmVzdWx0KSk7Ci0KLQlpZiAocmVzdWx0IDwgMCkgewotCQlNTV9FUlIoIkFDREI9PiBEZXZpY2UgR2V0IFJQQyBmYWlsdXJlIlwKLQkJCSIgcmVzdWx0ID0gJWRcbiIsIHJlc3VsdCk7Ci0JCWdvdG8gZXJyX3N0YXRlOwotCX0gZWxzZSB7Ci0JCU1NX0RCRygiQUNEQj0+IERldmljZSBHZXQgUlBDIFN1Y2Nlc3NcbiIpOwotCQlpZiAoYWNkYl9yZXN1bHQucmVzdWx0ID09IEFDREJfUkVTX1NVQ0NFU1MpIHsKLQkJCU1NX0RCRygiQUNEQl9HRVRfREVWSUNFIFN1Y2Nlc3NcbiIpOwotCQkJcmVzdWx0ID0gMDsKLQkJCW1lbWNweShnZXRfYmxvY2stPmJ1Zl9wdHIsIGFjZGJfZGF0YS5nZXRfYmxrX2t2YWRkciwKLQkJCQkJZ2V0X2Jsb2NrLT50b3RhbF9ieXRlcyk7Ci0JCX0gZWxzZSBpZiAoYWNkYl9yZXN1bHQucmVzdWx0ID09IEFDREJfUkVTX0ZBSUxVUkUpCi0JCQlNTV9FUlIoIkFDREJfR0VUX0RFVklDRSBGYWlsdXJlXG4iKTsKLQkJZWxzZSBpZiAoYWNkYl9yZXN1bHQucmVzdWx0ID09IEFDREJfUkVTX0JBRFBBUk0pCi0JCQlNTV9FUlIoIkFDREJfR0VUX0RFVklDRSBCYWRQYXJhbXNcbiIpOwotCQllbHNlCi0JCQlNTV9FUlIoIlVua25vd24gZXJyb3JcbiIpOwotCX0KLWVycl9zdGF0ZToKLQlyZXR1cm4gcmVzdWx0OwotfQotRVhQT1JUX1NZTUJPTChhY2RiX2dldF9jYWxpYnJhdGlvbl9kYXRhKTsKLQotaW50IGlzX2FjZGJfZW5hYmxlZCgpCi17Ci0JaWYgKGFjZGJfZGF0YS5oYW5kbGUgIT0gTlVMTCkKLQkJcmV0dXJuIDE7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaXNfYWNkYl9lbmFibGVkKTsKLQotc3RhdGljIHU4IGNoZWNrX2RldmljZV9pbmZvX2FscmVhZHlfcHJlc2VudCgKLQkJc3RydWN0IGRldl9ldnRfbXNnIGRldmljZV9pbmZvLAotCQkJc3RydWN0IGFjZGJfY2FjaGVfbm9kZSAqYWNkYl9jYWNoZV9mcmVlX25vZGUpCi17Ci0JaWYgKChkZXZpY2VfaW5mby5zYW1wbGVfcmF0ZSA9PQotCQkJCWFjZGJfY2FjaGVfZnJlZV9ub2RlLT5kZXZpY2VfaW5mby5cCi0JCQkJc2FtcGxlX3JhdGUpICYmCi0JCQkoZGV2aWNlX2luZm8uYWNkYl9pZCA9PQotCQkJCWFjZGJfY2FjaGVfZnJlZV9ub2RlLT5kZXZpY2VfaW5mby5hY2RiX2lkKSkgewotCQlNTV9EQkcoImFjZGIgdmFsdWVzIGFyZSBhbHJlYWR5IHByZXNlbnRcbiIpOwotCQkvKmlmIGFjZGIgc3RhdGUgaXMgbm90IHNldCBmb3IgQ0FMX0RBVEFfUkVBRFkgYW5kIG5vZGUgc3RhdHVzCi0JCWlzIGZpbGxlZCwgYWNkYiBzdGF0ZSBzaG91bGQgYmUgdXBkYXRlZCB3aXRoIENBTF9EQVRBX1JFQURZCi0JCXN0YXRlKi8KLQkJYWNkYl9kYXRhLmFjZGJfc3RhdGUgfD0gQ0FMX0RBVEFfUkVBRFk7Ci0JCXJldHVybiAxOyAvKm5vZGUgaXMgcHJlc2VudCBidXQgc3RhdHVzIGFzIGZpbGxlZCovCi0JfQotCU1NX0RCRygiY29weWluZyBkZXZpY2UgaW5mbyBpbnRvIG5vZGVcbiIpOwotCS8qYXMgZGV2aWNlIGluZm9ybWF0aW9uIGlzIG5vdCBwcmVzZW50IGluIGNhY2hlIGNvcHkKLQl0aGUgY3VycmVudCBkZXZpY2UgaW5mb3JtYXRpb24gaW50byB0aGUgbm9kZSovCi0JbWVtY3B5KCZhY2RiX2NhY2hlX2ZyZWVfbm9kZS0+ZGV2aWNlX2luZm8sCi0JCQkJICZkZXZpY2VfaW5mbywgc2l6ZW9mKGRldmljZV9pbmZvKSk7Ci0JcmV0dXJuIDA7IC8qY2FudCBmaW5kIHRoZSBub2RlKi8KLX0KLQotc3RhdGljIHN0cnVjdCBhY2RiX2lpcl9ibG9jayAqZ2V0X2F1ZHBwX2lycl9ibG9jayh2b2lkKQotewotCXN0cnVjdCBoZWFkZXIgKnByc19oZHI7Ci0JdTMyIGluZGV4ID0gMDsKLQotCXdoaWxlIChpbmRleCA8IGFjZGJfZGF0YS5hY2RiX3Jlc3VsdC51c2VkX2J5dGVzKSB7Ci0JCXByc19oZHIgPSAoc3RydWN0IGhlYWRlciAqKShhY2RiX2RhdGEudmlydF9hZGRyICsgaW5kZXgpOwotCQlpZiAocHJzX2hkci0+ZGJvcl9zaWduYXR1cmUgPT0gREJPUl9TSUdOQVRVUkUpIHsKLQkJCWlmIChwcnNfaGRyLT5hYmlkID09IEFCSURfQVVESU9fSUlSX1JYKSB7Ci0JCQkJaWYgKHByc19oZHItPmlpZCA9PSBJSURfQVVESU9fSUlSX0NPRUZGKQotCQkJCQlyZXR1cm4gKHN0cnVjdCBhY2RiX2lpcl9ibG9jayAqKQotCQkJCQkJKGFjZGJfZGF0YS52aXJ0X2FkZHIgKyBpbmRleAotCQkJCQkJICsgc2l6ZW9mKHN0cnVjdCBoZWFkZXIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gcHJzX2hkci0+ZGF0YV9sZW4gKwotCQkJCQkJc2l6ZW9mKHN0cnVjdCBoZWFkZXIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIHMzMiBhY2RiX2ZpbGxfYXVkcHBfaWlyKHZvaWQpCi17Ci0Jc3RydWN0IGFjZGJfaWlyX2Jsb2NrICphY2RiX2lpcjsKLQlzMzIgaSA9IDA7Ci0KLQlhY2RiX2lpciA9IGdldF9hdWRwcF9pcnJfYmxvY2soKTsKLQlpZiAoYWNkYl9paXIgPT0gTlVMTCkgewotCQlNTV9FUlIoInVuYWJsZSB0byBmaW5kICBhdWRwcCBpaXIgYmxvY2sgcmV0dXJuaW5nXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCW1lbXNldChhY2RiX2RhdGEucHBfaWlyLCAwLCBzaXplb2YoKmFjZGJfZGF0YS5wcF9paXIpKTsKLQotCWFjZGJfZGF0YS5wcF9paXItPmFjdGl2ZV9mbGFnID0gYWNkYl9paXItPmVuYWJsZV9mbGFnOwotCWFjZGJfZGF0YS5wcF9paXItPm51bV9iYW5kcyA9IGFjZGJfaWlyLT5zdGFnZV9jb3VudDsKLQlmb3IgKDsgaSA8IGFjZGJfaWlyLT5zdGFnZV9jb3VudDsgaSsrKSB7Ci0JCWFjZGJfZGF0YS5wcF9paXItPnBhcmFtc19maWx0ZXIuZmlsdGVyXzRfcGFyYW1zLgotCQkJbnVtZXJhdG9yX2ZpbHRlcltpXS5udW1lcmF0b3JfYjBfZmlsdGVyX2xzdyA9Ci0JCQlhY2RiX2lpci0+c3RhZ2VzW2ldLmIwX2xvOwotCQlhY2RiX2RhdGEucHBfaWlyLT5wYXJhbXNfZmlsdGVyLmZpbHRlcl80X3BhcmFtcy4KLQkJCW51bWVyYXRvcl9maWx0ZXJbaV0ubnVtZXJhdG9yX2IwX2ZpbHRlcl9tc3cgPQotCQkJYWNkYl9paXItPnN0YWdlc1tpXS5iMF9oaTsKLQkJYWNkYl9kYXRhLnBwX2lpci0+cGFyYW1zX2ZpbHRlci5maWx0ZXJfNF9wYXJhbXMuCi0JCQludW1lcmF0b3JfZmlsdGVyW2ldLm51bWVyYXRvcl9iMV9maWx0ZXJfbHN3ID0KLQkJCWFjZGJfaWlyLT5zdGFnZXNbaV0uYjFfbG87Ci0JCWFjZGJfZGF0YS5wcF9paXItPnBhcmFtc19maWx0ZXIuZmlsdGVyXzRfcGFyYW1zLgotCQkJbnVtZXJhdG9yX2ZpbHRlcltpXS5udW1lcmF0b3JfYjFfZmlsdGVyX21zdyA9Ci0JCQlhY2RiX2lpci0+c3RhZ2VzW2ldLmIxX2hpOwotCQlhY2RiX2RhdGEucHBfaWlyLT5wYXJhbXNfZmlsdGVyLmZpbHRlcl80X3BhcmFtcy4KLQkJCW51bWVyYXRvcl9maWx0ZXJbaV0ubnVtZXJhdG9yX2IyX2ZpbHRlcl9sc3cgPQotCQkJYWNkYl9paXItPnN0YWdlc1tpXS5iMl9sbzsKLQkJYWNkYl9kYXRhLnBwX2lpci0+cGFyYW1zX2ZpbHRlci5maWx0ZXJfNF9wYXJhbXMuCi0JCQludW1lcmF0b3JfZmlsdGVyW2ldLm51bWVyYXRvcl9iMl9maWx0ZXJfbXN3ID0KLQkJCWFjZGJfaWlyLT5zdGFnZXNbaV0uYjJfaGk7Ci0JCWFjZGJfZGF0YS5wcF9paXItPnBhcmFtc19maWx0ZXIuZmlsdGVyXzRfcGFyYW1zLgotCQkJZGVub21pbmF0b3JfZmlsdGVyW2ldLmRlbm9taW5hdG9yX2EwX2ZpbHRlcl9sc3cgPQotCQkJYWNkYl9paXItPnN0YWdlc19hW2ldLmExX2xvOwotCQlhY2RiX2RhdGEucHBfaWlyLT5wYXJhbXNfZmlsdGVyLmZpbHRlcl80X3BhcmFtcy4KLQkJCWRlbm9taW5hdG9yX2ZpbHRlcltpXS5kZW5vbWluYXRvcl9hMF9maWx0ZXJfbXN3ID0KLQkJCWFjZGJfaWlyLT5zdGFnZXNfYVtpXS5hMV9oaTsKLQkJYWNkYl9kYXRhLnBwX2lpci0+cGFyYW1zX2ZpbHRlci5maWx0ZXJfNF9wYXJhbXMuCi0JCQlkZW5vbWluYXRvcl9maWx0ZXJbaV0uZGVub21pbmF0b3JfYTFfZmlsdGVyX2xzdyA9Ci0JCQlhY2RiX2lpci0+c3RhZ2VzX2FbaV0uYTJfbG87Ci0JCWFjZGJfZGF0YS5wcF9paXItPnBhcmFtc19maWx0ZXIuZmlsdGVyXzRfcGFyYW1zLgotCQkJZGVub21pbmF0b3JfZmlsdGVyW2ldLmRlbm9taW5hdG9yX2ExX2ZpbHRlcl9tc3cgPQotCQkJYWNkYl9paXItPnN0YWdlc19hW2ldLmEyX2hpOwotCQlhY2RiX2RhdGEucHBfaWlyLT5wYXJhbXNfZmlsdGVyLmZpbHRlcl80X3BhcmFtcy4KLQkJCXNoaWZ0X2ZhY3Rvcl9maWx0ZXJbaV0uc2hpZnRfZmFjdG9yXzAgPQotCQkJYWNkYl9paXItPnNoaWZ0X2ZhY3RvcltpXTsKLQkJYWNkYl9kYXRhLnBwX2lpci0+cGFyYW1zX2ZpbHRlci5maWx0ZXJfNF9wYXJhbXMucGFuX2ZpbHRlcltpXS4KLQkJCXBhbl9maWx0ZXJfMCA9IGFjZGJfaWlyLT5wYW5baV07Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBleHRyYWN0X21iYWRyYyh1MzIgKnBoeV9hZGRyLCBzdHJ1Y3QgaGVhZGVyICpwcnNfaGRyLCB1MzIgKmluZGV4KQotewotCWlmIChwcnNfaGRyLT5paWQgPT0gSUlEX01CQURSQ19FWFRfQlVGRikgewotCQlNTV9EQkcoIkdvdCBJSUQgPSBJSURfTUJBRFJDX0VYVF9CVUZGXG4iKTsKLQkJKnBoeV9hZGRyID0gYWNkYl9kYXRhLnBoeXNfYWRkcgkrICppbmRleCArCi0JCQkJCXNpemVvZihzdHJ1Y3QgaGVhZGVyKTsKLQkJbWVtY3B5KGFjZGJfZGF0YS5tYmFkcmNfYmxvY2suZXh0X2J1ZiwKLQkJCQkoYWNkYl9kYXRhLnZpcnRfYWRkciArICppbmRleCArCi0JCQkJCXNpemVvZihzdHJ1Y3QgaGVhZGVyKSksIDE5NioyKTsKLQkJTU1fREJHKCJwaHlfYWRkciA9ICV4XG4iLCAqcGh5X2FkZHIpOwotCQkqaW5kZXggKz0gcHJzX2hkci0+ZGF0YV9sZW4gKyBzaXplb2Yoc3RydWN0IGhlYWRlcik7Ci0JfSBlbHNlIGlmIChwcnNfaGRyLT5paWQgPT0gSUlEX01CQURSQ19CQU5EX0NPTkZJRykgewotCQlNTV9EQkcoIkdvdCBJSUQgPT0gSUlEX01CQURSQ19CQU5EX0NPTkZJR1xuIik7Ci0JCW1lbWNweShhY2RiX2RhdGEubWJhZHJjX2Jsb2NrLmJhbmRfY29uZmlnLCAoYWNkYl9kYXRhLnZpcnRfYWRkcgotCQkJCQkrICppbmRleCArIHNpemVvZihzdHJ1Y3QgaGVhZGVyKSksCi0JCQkJc2l6ZW9mKHN0cnVjdCBtYmFkcmNfYmFuZF9jb25maWdfdHlwZSkgKgotCQkJCQkgYWNkYl9kYXRhLm1iYWRyY19ibG9jay5wYXJhbWV0ZXJzLlwKLQkJCQkJCW1iYWRyY19udW1fYmFuZHMpOwotCQkqaW5kZXggKz0gcHJzX2hkci0+ZGF0YV9sZW4gKyBzaXplb2Yoc3RydWN0IGhlYWRlcik7Ci0JfSBlbHNlIGlmIChwcnNfaGRyLT5paWQgPT0gSUlEX01CQURSQ19QQVJBTUVURVJTKSB7Ci0JCXN0cnVjdCBtYmFkcmNfcGFyYW1ldGVyICp0bXA7Ci0JCXRtcCA9IChzdHJ1Y3QgbWJhZHJjX3BhcmFtZXRlciAqKShhY2RiX2RhdGEudmlydF9hZGRyICsgKmluZGV4Ci0JCQkJCQkrIHNpemVvZihzdHJ1Y3QgaGVhZGVyKSk7Ci0JCU1NX0RCRygiR290IElJRCA9PSBJSURfTUJBRFJDX1BBUkFNRVRFUlMiKTsKLQkJYWNkYl9kYXRhLm1iYWRyY19ibG9jay5wYXJhbWV0ZXJzLm1iYWRyY19lbmFibGUgPQotCQkJCQkJCXRtcC0+bWJhZHJjX2VuYWJsZTsKLQkJYWNkYl9kYXRhLm1iYWRyY19ibG9jay5wYXJhbWV0ZXJzLm1iYWRyY19udW1fYmFuZHMgPQotCQkJCQkJCXRtcC0+bWJhZHJjX251bV9iYW5kczsKLQkJYWNkYl9kYXRhLm1iYWRyY19ibG9jay5wYXJhbWV0ZXJzLm1iYWRyY19kb3duX3NhbXBsZV9sZXZlbCA9Ci0JCQkJCQl0bXAtPm1iYWRyY19kb3duX3NhbXBsZV9sZXZlbDsKLQkJYWNkYl9kYXRhLm1iYWRyY19ibG9jay5wYXJhbWV0ZXJzLm1iYWRyY19kZWxheSA9Ci0JCQkJCQkJdG1wLT5tYmFkcmNfZGVsYXk7Ci0JCSppbmRleCArPSBwcnNfaGRyLT5kYXRhX2xlbiArIHNpemVvZihzdHJ1Y3QgaGVhZGVyKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGdldF9hdWRwcF9tYmFkcmNfYmxvY2sodTMyICpwaHlfYWRkcikKLXsKLQlzdHJ1Y3QgaGVhZGVyICpwcnNfaGRyOwotCXUzMiBpbmRleCA9IDA7Ci0KLQl3aGlsZSAoaW5kZXggPCBhY2RiX2RhdGEuYWNkYl9yZXN1bHQudXNlZF9ieXRlcykgewotCQlwcnNfaGRyID0gKHN0cnVjdCBoZWFkZXIgKikoYWNkYl9kYXRhLnZpcnRfYWRkciArIGluZGV4KTsKLQotCQlpZiAocHJzX2hkci0+ZGJvcl9zaWduYXR1cmUgPT0gREJPUl9TSUdOQVRVUkUpIHsKLQkJCWlmIChwcnNfaGRyLT5hYmlkID09IEFCSURfQVVESU9fTUJBRFJDX1JYKSB7Ci0JCQkJaWYgKChwcnNfaGRyLT5paWQgPT0gSUlEX01CQURSQ19FWFRfQlVGRikKLQkJCQkJfHwgKHByc19oZHItPmlpZCA9PQotCQkJCQkJSUlEX01CQURSQ19CQU5EX0NPTkZJRykKLQkJCQkJfHwgKHByc19oZHItPmlpZCA9PQotCQkJCQkJSUlEX01CQURSQ19QQVJBTUVURVJTKSkgewotCQkJCQlleHRyYWN0X21iYWRyYyhwaHlfYWRkciwgcHJzX2hkciwKLQkJCQkJCQkJJmluZGV4KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ICs9IHByc19oZHItPmRhdGFfbGVuICsKLQkJCQkJCXNpemVvZihzdHJ1Y3QgaGVhZGVyKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgczMyIGFjZGJfZmlsbF9hdWRwcF9tYmFkcmModm9pZCkKLXsKLQl1MzIgbWJhZHJjX3BoeXNfYWRkciA9IC0xOwotCWdldF9hdWRwcF9tYmFkcmNfYmxvY2soJm1iYWRyY19waHlzX2FkZHIpOwotCWlmIChJU19FUlJfVkFMVUUobWJhZHJjX3BoeXNfYWRkcikpIHsKLQkJTU1fRVJSKCJmYWlsZWQgdG8gZ2V0IG1iYWRyYyBibG9ja1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW1lbXNldChhY2RiX2RhdGEucHBfbWJhZHJjLCAwLCBzaXplb2YoKmFjZGJfZGF0YS5wcF9tYmFkcmMpKTsKLQotCWFjZGJfZGF0YS5wcF9tYmFkcmMtPmVuYWJsZSA9IGFjZGJfZGF0YS5tYmFkcmNfYmxvY2suXAotCQkJCQlwYXJhbWV0ZXJzLm1iYWRyY19lbmFibGU7Ci0JYWNkYl9kYXRhLnBwX21iYWRyYy0+bnVtX2JhbmRzID0KLQkJCQlhY2RiX2RhdGEubWJhZHJjX2Jsb2NrLlwKLQkJCQkJcGFyYW1ldGVycy5tYmFkcmNfbnVtX2JhbmRzOwotCWFjZGJfZGF0YS5wcF9tYmFkcmMtPmRvd25fc2FtcF9sZXZlbCA9Ci0JCQkJYWNkYl9kYXRhLm1iYWRyY19ibG9jay5wYXJhbWV0ZXJzLlwKLQkJCQkJbWJhZHJjX2Rvd25fc2FtcGxlX2xldmVsOwotCWFjZGJfZGF0YS5wcF9tYmFkcmMtPmFkcmNfZGVsYXkgPQotCQkJCWFjZGJfZGF0YS5tYmFkcmNfYmxvY2sucGFyYW1ldGVycy5cCi0JCQkJCW1iYWRyY19kZWxheTsKLQotCWlmIChhY2RiX2RhdGEubWJhZHJjX2Jsb2NrLnBhcmFtZXRlcnMubWJhZHJjX251bV9iYW5kcyA+IDEpCi0JCWFjZGJfZGF0YS5wcF9tYmFkcmMtPmV4dF9idWZfc2l6ZSA9ICg5NyAqIDIpICsKLQkJCSgzMyAqIDIgKiAoYWNkYl9kYXRhLm1iYWRyY19ibG9jay5wYXJhbWV0ZXJzLlwKLQkJCQkJbWJhZHJjX251bV9iYW5kcyAtIDIpKTsKLQotCWFjZGJfZGF0YS5wcF9tYmFkcmMtPmV4dF9wYXJ0aXRpb24gPSAwOwotCWFjZGJfZGF0YS5wcF9tYmFkcmMtPmV4dF9idWZfbHN3ID0gKHUxNikobWJhZHJjX3BoeXNfYWRkclwKLQkJCQkJCSAmIDB4RkZGRik7Ci0JYWNkYl9kYXRhLnBwX21iYWRyYy0+ZXh0X2J1Zl9tc3cgPSAodTE2KSgobWJhZHJjX3BoeXNfYWRkclwKLQkJCQkJCSAmIDB4RkZGRjAwMDApID4+IDE2KTsKLQltZW1jcHkoYWNkYl9kYXRhLnBwX21iYWRyYy0+YWRyY19iYW5kLCBhY2RiX2RhdGEubWJhZHJjX2Jsb2NrLlwKLQkJCQkJYmFuZF9jb25maWcsCi0JCXNpemVvZihzdHJ1Y3QgbWJhZHJjX2JhbmRfY29uZmlnX3R5cGUpICoKLQkJYWNkYl9kYXRhLm1iYWRyY19ibG9jay5wYXJhbWV0ZXJzLm1iYWRyY19udW1fYmFuZHMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgczMyIGFjZGJfY2FsaWJyYXRlX2F1ZHBwKHZvaWQpCi17Ci0JczMyCXJlc3VsdCA9IDA7Ci0KLQlyZXN1bHQgPSBhY2RiX2ZpbGxfYXVkcHBfaWlyKCk7Ci0JaWYgKCFJU19FUlJfVkFMVUUocmVzdWx0KSkgewotCQlyZXN1bHQgPSBhdWRwcF9kc3Bfc2V0X3J4X2lpcihDT01NT05fT0JKX0lELAotCQkJCWFjZGJfZGF0YS5wcF9paXItPmFjdGl2ZV9mbGFnLAotCQkJCQlhY2RiX2RhdGEucHBfaWlyKTsKLQkJaWYgKHJlc3VsdCkgewotCQkJTU1fRVJSKCJBQ0RCPT4gRmFpbGVkIHRvIHNlbmQgSUlSIGRhdGEgdG8gcG9zdHByb2NcbiIpOwotCQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfSBlbHNlCi0JCQlNTV9EQkcoIkFVRFBQIGlzIGNhbGlicmF0ZWQgd2l0aCBJSVIgcGFyYW1ldGVyc1xuIik7Ci0JfQotCXJlc3VsdCA9IGFjZGJfZmlsbF9hdWRwcF9tYmFkcmMoKTsKLQlpZiAoIUlTX0VSUl9WQUxVRShyZXN1bHQpKSB7Ci0JCXJlc3VsdCA9IGF1ZHBwX2RzcF9zZXRfbWJhZHJjKENPTU1PTl9PQkpfSUQsCi0JCQkJCWFjZGJfZGF0YS5wcF9tYmFkcmMtPmVuYWJsZSwKLQkJCQkJYWNkYl9kYXRhLnBwX21iYWRyYyk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCU1NX0VSUigiQUNEQj0+IEZhaWxlZCB0byBzZW5kIE1CQURSQyBkYXRhIHRvIlwKLQkJCQkJIiBwb3N0cHJvY1xuIik7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9IGVsc2UKLQkJCU1NX0RCRygiQVVEUFAgaXMgY2FsaWJyYXRlZCB3aXRoIE1CQURSQyBwYXJhbWV0ZXJzIik7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgczMyIGFjZGJfcmVfZW5hYmxlX2F1ZHBwKHZvaWQpCi17Ci0JczMyCXJlc3VsdCA9IDA7Ci0KLQlpZiAoKGFjZGJfZGF0YS5hdWRwcF9kaXNhYmxlZF9mZWF0dXJlcyAmCi0JCQkoMSA8PCBBVURQUF9DTURfSUlSX1RVTklOR19GSUxURVIpKQotCQkJPT0gKDEgPDwgQVVEUFBfQ01EX0lJUl9UVU5JTkdfRklMVEVSKSkgewotCQlyZXN1bHQgPSBhdWRwcF9kc3Bfc2V0X3J4X2lpcihDT01NT05fT0JKX0lELAotCQkJCWFjZGJfZGF0YS5wcF9paXItPmFjdGl2ZV9mbGFnLAotCQkJCWFjZGJfZGF0YS5wcF9paXIpOwotCQlpZiAocmVzdWx0KSB7Ci0JCQlNTV9FUlIoIkFDREI9PiBGYWlsZWQgdG8gc2VuZCBJSVIgZGF0YSB0byBwb3N0cHJvY1xuIik7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQl9IGVsc2UgewotCQkJTU1fREJHKCJSZS1lbmFibGUgSUlSIHBhcmFtZXRlcnMiKTsKLQkJfQotCX0KLQlpZiAoKGFjZGJfZGF0YS5hdWRwcF9kaXNhYmxlZF9mZWF0dXJlcyAmICgxIDw8IEFVRFBQX0NNRF9NQkFEUkMpKQotCQkJPT0gKDEgPDwgQVVEUFBfQ01EX01CQURSQykpIHsKLQkJcmVzdWx0ID0gYXVkcHBfZHNwX3NldF9tYmFkcmMoQ09NTU9OX09CSl9JRCwKLQkJCQlhY2RiX2RhdGEucHBfbWJhZHJjLT5lbmFibGUsCi0JCQkJYWNkYl9kYXRhLnBwX21iYWRyYyk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCU1NX0VSUigiQUNEQj0+IEZhaWxlZCB0byBzZW5kIE1CQURSQyBkYXRhIHRvIlwKLQkJCQkJIiBwb3N0cHJvY1xuIik7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQl9IGVsc2UgewotCQkJTU1fREJHKCJSZS1lbmFibGUgTUJBRFJDIHBhcmFtZXRlcnMiKTsKLQkJfQotCX0KLQlhY2RiX2RhdGEuYXVkcHBfZGlzYWJsZWRfZmVhdHVyZXMgPSAwOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYWNkYl9hZ2NfYmxvY2sgKmdldF9hdWRwcmVwcm9jX2FnY19ibG9jayh2b2lkKQotewotCXN0cnVjdCBoZWFkZXIgKnByc19oZHI7Ci0JdTMyIGluZGV4ID0gMDsKLQotCXdoaWxlIChpbmRleCA8IGFjZGJfZGF0YS5hY2RiX3Jlc3VsdC51c2VkX2J5dGVzKSB7Ci0JCXByc19oZHIgPSAoc3RydWN0IGhlYWRlciAqKShhY2RiX2RhdGEudmlydF9hZGRyICsgaW5kZXgpOwotCQlpZiAocHJzX2hkci0+ZGJvcl9zaWduYXR1cmUgPT0gREJPUl9TSUdOQVRVUkUpIHsKLQkJCWlmIChwcnNfaGRyLT5hYmlkID09IEFCSURfQVVESU9fQUdDX1RYKSB7Ci0JCQkJaWYgKHByc19oZHItPmlpZCA9PSBJSURfQVVESU9fQUdDX1BBUkFNRVRFUlMpIHsKLQkJCQkJTU1fREJHKCJHT1QgQUJJRF9BVURJT19BR0NfVFhcbiIpOwotCQkJCQlyZXR1cm4gKHN0cnVjdCBhY2RiX2FnY19ibG9jayAqKQotCQkJCQkJKGFjZGJfZGF0YS52aXJ0X2FkZHIgKyBpbmRleAotCQkJCQkJICsgc2l6ZW9mKHN0cnVjdCBoZWFkZXIpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ICs9IHByc19oZHItPmRhdGFfbGVuICsKLQkJCQkJCXNpemVvZihzdHJ1Y3QgaGVhZGVyKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgczMyIGFjZGJfZmlsbF9hdWRwcmVwcm9jX2FnYyh2b2lkKQotewotCXN0cnVjdCBhY2RiX2FnY19ibG9jawkqYWNkYl9hZ2M7Ci0KLQlhY2RiX2FnYyA9IGdldF9hdWRwcmVwcm9jX2FnY19ibG9jaygpOwotCWlmICghYWNkYl9hZ2MpIHsKLQkJTU1fREJHKCJ1bmFibGUgdG8gZmluZCBwcmVwcm9jIGFnYyBwYXJhbWV0ZXJzIHdpbmRpbmcgdXBcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbWVtc2V0KGFjZGJfZGF0YS5wcmVwcm9jX2FnYywgMCwgc2l6ZW9mKCphY2RiX2RhdGEucHJlcHJvY19hZ2MpKTsKLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPmNtZF9pZCA9IEFVRFBSRVBST0NfQ01EX0NGR19BR0NfUEFSQU1TOwotCS8qIDB4RkUwMCB0byBjb25maWd1cmUgYWxsIHBhcmFtZXRlcnMgKi8KLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPnR4X2FnY19wYXJhbV9tYXNrID0gMHhGRkZGOwotCWlmIChhY2RiX2FnYy0+ZW5hYmxlX3N0YXR1cykKLQkJYWNkYl9kYXRhLnByZXByb2NfYWdjLT50eF9hZ2NfZW5hYmxlX2ZsYWcgPQotCQkJQVVEUFJFUFJPQ19DTURfVFhfQUdDX0VOQV9GTEFHX0VOQTsKLQllbHNlCi0JCWFjZGJfZGF0YS5wcmVwcm9jX2FnYy0+dHhfYWdjX2VuYWJsZV9mbGFnID0KLQkJCUFVRFBSRVBST0NfQ01EX1RYX0FHQ19FTkFfRkxBR19ESVM7Ci0KLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPmNvbXBfcmxpbmtfc3RhdGljX2dhaW4gPQotCQlhY2RiX2FnYy0+Y29tcF9ybGlua19zdGF0aWNfZ2FpbjsKLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPmNvbXBfcmxpbmtfYWlnX2ZsYWcgPQotCQlhY2RiX2FnYy0+Y29tcF9ybGlua19haWdfZmxhZzsKLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPmV4cGFuZGVyX3JsaW5rX3RoID0KLQkJYWNkYl9hZ2MtPmV4cF9ybGlua190aHJlc2hvbGQ7Ci0JYWNkYl9kYXRhLnByZXByb2NfYWdjLT5leHBhbmRlcl9ybGlua19zbG9wZSA9Ci0JCWFjZGJfYWdjLT5leHBfcmxpbmtfc2xvcGU7Ci0JYWNkYl9kYXRhLnByZXByb2NfYWdjLT5jb21wcmVzc29yX3JsaW5rX3RoID0KLQkJYWNkYl9hZ2MtPmNvbXBfcmxpbmtfdGhyZXNob2xkOwotCWFjZGJfZGF0YS5wcmVwcm9jX2FnYy0+Y29tcHJlc3Nvcl9ybGlua19zbG9wZSA9Ci0JCWFjZGJfYWdjLT5jb21wX3JsaW5rX3Nsb3BlOwotCi0JLyogMHhGRkYwIHRvIGNvbmZpZ3VyZSBhbGwgcGFyYW1ldGVycyAqLwotCWFjZGJfZGF0YS5wcmVwcm9jX2FnYy0+dHhfYWRjX2FnY19wYXJhbV9tYXNrID0gMHhGRkZGOwotCi0JYWNkYl9kYXRhLnByZXByb2NfYWdjLT5jb21wX3JsaW5rX2FpZ19hdHRhY2trID0KLQkJYWNkYl9hZ2MtPmNvbXBfcmxpbmtfYWlnX2F0dGFja19rOwotCWFjZGJfZGF0YS5wcmVwcm9jX2FnYy0+Y29tcF9ybGlua19haWdfbGVha19kb3duID0KLQkJYWNkYl9hZ2MtPmNvbXBfcmxpbmtfYWlnX2xlYWtfZG93bjsKLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPmNvbXBfcmxpbmtfYWlnX2xlYWtfdXAgPQotCQlhY2RiX2FnYy0+Y29tcF9ybGlua19haWdfbGVha191cDsKLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPmNvbXBfcmxpbmtfYWlnX21heCA9Ci0JCWFjZGJfYWdjLT5jb21wX3JsaW5rX2FpZ19tYXg7Ci0JYWNkYl9kYXRhLnByZXByb2NfYWdjLT5jb21wX3JsaW5rX2FpZ19taW4gPQotCQlhY2RiX2FnYy0+Y29tcF9ybGlua19haWdfbWluOwotCWFjZGJfZGF0YS5wcmVwcm9jX2FnYy0+Y29tcF9ybGlua19haWdfcmVsZWFzZWsgPQotCQlhY2RiX2FnYy0+Y29tcF9ybGlua19haWdfcmVsZWFzZV9rOwotCWFjZGJfZGF0YS5wcmVwcm9jX2FnYy0+Y29tcF9ybGlua19haWdfbGVha3JhdGVfZmFzdCA9Ci0JCWFjZGJfYWdjLT5jb21wX3JsaW5rX2FpZ19zbV9sZWFrX3JhdGVfZmFzdDsKLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPmNvbXBfcmxpbmtfYWlnX2xlYWtyYXRlX3Nsb3cgPQotCQlhY2RiX2FnYy0+Y29tcF9ybGlua19haWdfc21fbGVha19yYXRlX3Nsb3c7Ci0JYWNkYl9kYXRhLnByZXByb2NfYWdjLT5jb21wX3JsaW5rX2F0dGFja2tfbXN3ID0KLQkJYWNkYl9hZ2MtPmNvbXBfcmxpbmtfYXR0YWNrX2tfbXN3OwotCWFjZGJfZGF0YS5wcmVwcm9jX2FnYy0+Y29tcF9ybGlua19hdHRhY2trX2xzdyA9Ci0JCWFjZGJfYWdjLT5jb21wX3JsaW5rX2F0dGFja19rX2xzdzsKLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPmNvbXBfcmxpbmtfZGVsYXkgPQotCQlhY2RiX2FnYy0+Y29tcF9ybGlua19kZWxheTsKLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPmNvbXBfcmxpbmtfcmVsZWFzZWtfbXN3ID0KLQkJYWNkYl9hZ2MtPmNvbXBfcmxpbmtfcmVsZWFzZV9rX21zdzsKLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPmNvbXBfcmxpbmtfcmVsZWFzZWtfbHN3ID0KLQkJYWNkYl9hZ2MtPmNvbXBfcmxpbmtfcmVsZWFzZV9rX2xzdzsKLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPmNvbXBfcmxpbmtfcm1zX3RhdiA9Ci0JCWFjZGJfYWdjLT5jb21wX3JsaW5rX3Jtc190cmF2OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGFjZGJfaWlyX2Jsb2NrICpnZXRfYXVkcHJlcHJvY19pcnJfYmxvY2sodm9pZCkKLXsKLQotCXN0cnVjdCBoZWFkZXIgKnByc19oZHI7Ci0JdTMyIGluZGV4ID0gMDsKLQotCXdoaWxlIChpbmRleCA8IGFjZGJfZGF0YS5hY2RiX3Jlc3VsdC51c2VkX2J5dGVzKSB7Ci0JCXByc19oZHIgPSAoc3RydWN0IGhlYWRlciAqKShhY2RiX2RhdGEudmlydF9hZGRyICsgaW5kZXgpOwotCi0JCWlmIChwcnNfaGRyLT5kYm9yX3NpZ25hdHVyZSA9PSBEQk9SX1NJR05BVFVSRSkgewotCQkJaWYgKHByc19oZHItPmFiaWQgPT0gQUJJRF9BVURJT19JSVJfVFgpIHsKLQkJCQlpZiAocHJzX2hkci0+aWlkID09IElJRF9BVURJT19JSVJfQ09FRkYpCi0JCQkJCXJldHVybiAoc3RydWN0IGFjZGJfaWlyX2Jsb2NrICopCi0JCQkJCQkoYWNkYl9kYXRhLnZpcnRfYWRkciArIGluZGV4Ci0JCQkJCQkgKyBzaXplb2Yoc3RydWN0IGhlYWRlcikpOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCArPSBwcnNfaGRyLT5kYXRhX2xlbiArCi0JCQkJCQlzaXplb2Yoc3RydWN0IGhlYWRlcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotCi1zdGF0aWMgczMyIGFjZGJfZmlsbF9hdWRwcmVwcm9jX2lpcih2b2lkKQotewotCXN0cnVjdCBhY2RiX2lpcl9ibG9jawkqYWNkYl9paXI7Ci0KLQotCWFjZGJfaWlyID0gIGdldF9hdWRwcmVwcm9jX2lycl9ibG9jaygpOwotCWlmICghYWNkYl9paXIpIHsKLQkJTU1fREJHKCJ1bmFibGUgdG8gZmluZCBwcmVwcm9jIGlpciBwYXJhbWV0ZXJzIHdpbmRpbmcgdXBcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbWVtc2V0KGFjZGJfZGF0YS5wcmVwcm9jX2lpciwgMCwgc2l6ZW9mKCphY2RiX2RhdGEucHJlcHJvY19paXIpKTsKLQotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+Y21kX2lkID0KLQkJQVVEUFJFUFJPQ19DTURfQ0ZHX0lJUl9UVU5JTkdfRklMVEVSX1BBUkFNUzsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPmFjdGl2ZV9mbGFnID0gYWNkYl9paXItPmVuYWJsZV9mbGFnOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtX2JhbmRzID0gYWNkYl9paXItPnN0YWdlX2NvdW50OwotCi0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1lcmF0b3JfY29lZmZfYjBfZmlsdGVyMF9sc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzWzBdLmIwX2xvOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtZXJhdG9yX2NvZWZmX2IwX2ZpbHRlcjBfbXN3ID0KLQkJYWNkYl9paXItPnN0YWdlc1swXS5iMF9oaTsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPm51bWVyYXRvcl9jb2VmZl9iMV9maWx0ZXIwX2xzdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNbMF0uYjFfbG87Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1lcmF0b3JfY29lZmZfYjFfZmlsdGVyMF9tc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzWzBdLmIxX2hpOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtZXJhdG9yX2NvZWZmX2IyX2ZpbHRlcjBfbHN3ID0KLQkJYWNkYl9paXItPnN0YWdlc1swXS5iMl9sbzsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPm51bWVyYXRvcl9jb2VmZl9iMl9maWx0ZXIwX21zdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNbMF0uYjJfaGk7Ci0KLQlhY2RiX2RhdGEucHJlcHJvY19paXItPm51bWVyYXRvcl9jb2VmZl9iMF9maWx0ZXIxX2xzdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNbMV0uYjBfbG87Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1lcmF0b3JfY29lZmZfYjBfZmlsdGVyMV9tc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzWzFdLmIwX2hpOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtZXJhdG9yX2NvZWZmX2IxX2ZpbHRlcjFfbHN3ID0KLQkJYWNkYl9paXItPnN0YWdlc1sxXS5iMV9sbzsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPm51bWVyYXRvcl9jb2VmZl9iMV9maWx0ZXIxX21zdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNbMV0uYjFfaGk7Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1lcmF0b3JfY29lZmZfYjJfZmlsdGVyMV9sc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzWzFdLmIyX2xvOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtZXJhdG9yX2NvZWZmX2IyX2ZpbHRlcjFfbXN3ID0KLQkJYWNkYl9paXItPnN0YWdlc1sxXS5iMl9oaTsKLQotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtZXJhdG9yX2NvZWZmX2IwX2ZpbHRlcjJfbHN3ID0KLQkJYWNkYl9paXItPnN0YWdlc1syXS5iMF9sbzsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPm51bWVyYXRvcl9jb2VmZl9iMF9maWx0ZXIyX21zdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNbMl0uYjBfaGk7Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1lcmF0b3JfY29lZmZfYjFfZmlsdGVyMl9sc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzWzJdLmIxX2xvOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtZXJhdG9yX2NvZWZmX2IxX2ZpbHRlcjJfbXN3ID0KLQkJYWNkYl9paXItPnN0YWdlc1syXS5iMV9oaTsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPm51bWVyYXRvcl9jb2VmZl9iMl9maWx0ZXIyX2xzdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNbMl0uYjJfbG87Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1lcmF0b3JfY29lZmZfYjJfZmlsdGVyMl9tc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzWzJdLmIyX2hpOwotCi0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1lcmF0b3JfY29lZmZfYjBfZmlsdGVyM19sc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzWzNdLmIwX2xvOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtZXJhdG9yX2NvZWZmX2IwX2ZpbHRlcjNfbXN3ID0KLQkJYWNkYl9paXItPnN0YWdlc1szXS5iMF9oaTsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPm51bWVyYXRvcl9jb2VmZl9iMV9maWx0ZXIzX2xzdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNbM10uYjFfbG87Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1lcmF0b3JfY29lZmZfYjFfZmlsdGVyM19tc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzWzNdLmIxX2hpOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtZXJhdG9yX2NvZWZmX2IyX2ZpbHRlcjNfbHN3ID0KLQkJYWNkYl9paXItPnN0YWdlc1szXS5iMl9sbzsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPm51bWVyYXRvcl9jb2VmZl9iMl9maWx0ZXIzX21zdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNbM10uYjJfaGk7Ci0KLQlhY2RiX2RhdGEucHJlcHJvY19paXItPmRlbm9taW5hdG9yX2NvZWZmX2EwX2ZpbHRlcjBfbHN3ID0KLQkJYWNkYl9paXItPnN0YWdlc19hWzBdLmExX2xvOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+ZGVub21pbmF0b3JfY29lZmZfYTBfZmlsdGVyMF9tc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzX2FbMF0uYTFfaGk7Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5kZW5vbWluYXRvcl9jb2VmZl9hMV9maWx0ZXIwX2xzdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNfYVswXS5hMl9sbzsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPmRlbm9taW5hdG9yX2NvZWZmX2ExX2ZpbHRlcjBfbXN3ID0KLQkJYWNkYl9paXItPnN0YWdlc19hWzBdLmEyX2hpOwotCi0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5kZW5vbWluYXRvcl9jb2VmZl9hMF9maWx0ZXIxX2xzdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNfYVsxXS5hMV9sbzsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPmRlbm9taW5hdG9yX2NvZWZmX2EwX2ZpbHRlcjFfbXN3ID0KLQkJYWNkYl9paXItPnN0YWdlc19hWzFdLmExX2hpOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+ZGVub21pbmF0b3JfY29lZmZfYTFfZmlsdGVyMV9sc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzX2FbMV0uYTJfbG87Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5kZW5vbWluYXRvcl9jb2VmZl9hMV9maWx0ZXIxX21zdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNfYVsxXS5hMl9oaTsKLQotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+ZGVub21pbmF0b3JfY29lZmZfYTBfZmlsdGVyMl9sc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzX2FbMl0uYTFfbG87Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5kZW5vbWluYXRvcl9jb2VmZl9hMF9maWx0ZXIyX21zdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNfYVsyXS5hMV9oaTsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPmRlbm9taW5hdG9yX2NvZWZmX2ExX2ZpbHRlcjJfbHN3ID0KLQkJYWNkYl9paXItPnN0YWdlc19hWzJdLmEyX2xvOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+ZGVub21pbmF0b3JfY29lZmZfYTFfZmlsdGVyMl9tc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzX2FbMl0uYTJfaGk7Ci0KLQlhY2RiX2RhdGEucHJlcHJvY19paXItPmRlbm9taW5hdG9yX2NvZWZmX2EwX2ZpbHRlcjNfbHN3ID0KLQkJYWNkYl9paXItPnN0YWdlc19hWzNdLmExX2xvOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+ZGVub21pbmF0b3JfY29lZmZfYTBfZmlsdGVyM19tc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzX2FbM10uYTFfaGk7Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5kZW5vbWluYXRvcl9jb2VmZl9hMV9maWx0ZXIzX2xzdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNfYVszXS5hMl9sbzsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPmRlbm9taW5hdG9yX2NvZWZmX2ExX2ZpbHRlcjNfbXN3ID0KLQkJYWNkYl9paXItPnN0YWdlc19hWzNdLmEyX2hpOwotCi0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5zaGlmdF9mYWN0b3JfZmlsdGVyMCA9Ci0JCWFjZGJfaWlyLT5zaGlmdF9mYWN0b3JbMF07Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5zaGlmdF9mYWN0b3JfZmlsdGVyMSA9Ci0JCWFjZGJfaWlyLT5zaGlmdF9mYWN0b3JbMV07Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5zaGlmdF9mYWN0b3JfZmlsdGVyMiA9Ci0JCWFjZGJfaWlyLT5zaGlmdF9mYWN0b3JbMl07Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5zaGlmdF9mYWN0b3JfZmlsdGVyMyA9Ci0JCWFjZGJfaWlyLT5zaGlmdF9mYWN0b3JbM107Ci0KLQlhY2RiX2RhdGEucHJlcHJvY19paXItPmNoYW5uZWxfc2VsZWN0ZWQwID0KLQkJYWNkYl9paXItPnBhblswXTsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPmNoYW5uZWxfc2VsZWN0ZWQxID0KLQkJYWNkYl9paXItPnBhblsxXTsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPmNoYW5uZWxfc2VsZWN0ZWQyID0KLQkJYWNkYl9paXItPnBhblsyXTsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPmNoYW5uZWxfc2VsZWN0ZWQzID0KLQkJYWNkYl9paXItPnBhblszXTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBhY2RiX25zX3R4X2Jsb2NrICpnZXRfYXVkcHJlcHJvY19uc19ibG9jayh2b2lkKQotewotCi0Jc3RydWN0IGhlYWRlciAqcHJzX2hkcjsKLQl1MzIgaW5kZXggPSAwOwotCi0Jd2hpbGUgKGluZGV4IDwgYWNkYl9kYXRhLmFjZGJfcmVzdWx0LnVzZWRfYnl0ZXMpIHsKLQkJcHJzX2hkciA9IChzdHJ1Y3QgaGVhZGVyICopKGFjZGJfZGF0YS52aXJ0X2FkZHIgKyBpbmRleCk7Ci0KLQkJaWYgKHByc19oZHItPmRib3Jfc2lnbmF0dXJlID09IERCT1JfU0lHTkFUVVJFKSB7Ci0JCQlpZiAocHJzX2hkci0+YWJpZCA9PSBBQklEX0FVRElPX05TX1RYKSB7Ci0JCQkJaWYgKHByc19oZHItPmlpZCA9PSBJSURfTlNfUEFSQU1FVEVSUykKLQkJCQkJcmV0dXJuIChzdHJ1Y3QgYWNkYl9uc190eF9ibG9jayAqKQotCQkJCQkJKGFjZGJfZGF0YS52aXJ0X2FkZHIgKyBpbmRleAotCQkJCQkJICsgc2l6ZW9mKHN0cnVjdCBoZWFkZXIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gcHJzX2hkci0+ZGF0YV9sZW4gKwotCQkJCQkJc2l6ZW9mKHN0cnVjdCBoZWFkZXIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzMzIgYWNkYl9maWxsX2F1ZHByZXByb2NfbnModm9pZCkKLXsKLQlzdHJ1Y3QgYWNkYl9uc190eF9ibG9jawkqYWNkYl9uczsKLQkvKiBUTyBETzogZG8gd2UgZW5hYmxlX3N0YXR1c19maWxsZWQgKi8KLQlhY2RiX25zID0gZ2V0X2F1ZHByZXByb2NfbnNfYmxvY2soKTsKLQlpZiAoIWFjZGJfbnMpIHsKLQkJTU1fREJHKCJ1bmFibGUgdG8gZmluZCBwcmVwcm9jIG5zIHBhcmFtZXRlcnMgd2luZGluZyB1cFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQltZW1zZXQoYWNkYl9kYXRhLnByZXByb2NfbnMsIDAsIHNpemVvZigqYWNkYl9kYXRhLnByZXByb2NfbnMpKTsKLQlhY2RiX2RhdGEucHJlcHJvY19ucy0+Y21kX2lkID0gQVVEUFJFUFJPQ19DTURfQ0ZHX05TX1BBUkFNUzsKLQotCWFjZGJfZGF0YS5wcmVwcm9jX25zLT5lY19tb2RlX25ldyAgPSBhY2RiX25zLT5lY19tb2RlX25ldzsKLQlhY2RiX2RhdGEucHJlcHJvY19ucy0+ZGVuc19nYW1tYV9uID0gYWNkYl9ucy0+ZGVuc19nYW1tYV9uOwotCWFjZGJfZGF0YS5wcmVwcm9jX25zLT5kZW5zX25mZV9ibG9ja19zaXplICA9Ci0JCQkJCWFjZGJfbnMtPmRlbnNfbmZlX2Jsb2NrX3NpemU7Ci0JYWNkYl9kYXRhLnByZXByb2NfbnMtPmRlbnNfbGltaXRfbnMgPSBhY2RiX25zLT5kZW5zX2xpbWl0X25zOwotCWFjZGJfZGF0YS5wcmVwcm9jX25zLT5kZW5zX2xpbWl0X25zX2QgID0gYWNkYl9ucy0+ZGVuc19saW1pdF9uc19kOwotCWFjZGJfZGF0YS5wcmVwcm9jX25zLT53Yl9nYW1tYV9lICA9IGFjZGJfbnMtPndiX2dhbW1hX2U7Ci0JYWNkYl9kYXRhLnByZXByb2NfbnMtPndiX2dhbW1hX24gID0gYWNkYl9ucy0+d2JfZ2FtbWFfbjsKLQotCXJldHVybiAwOwotfQotCi1zMzIgYWNkYl9jYWxpYnJhdGVfYXVkcHJlcHJvYyh2b2lkKQotewotCXMzMglyZXN1bHQgPSAwOwotCi0JcmVzdWx0ID0gYWNkYl9maWxsX2F1ZHByZXByb2NfYWdjKCk7Ci0JaWYgKCFJU19FUlJfVkFMVUUocmVzdWx0KSkgewotCQlyZXN1bHQgPSBhdWRwcmVwcm9jX2RzcF9zZXRfYWdjKGFjZGJfZGF0YS5wcmVwcm9jX2FnYywgc2l6ZW9mKAotCQkJCQlhdWRwcmVwcm9jX2NtZF9jZmdfYWdjX3BhcmFtcykpOwotCQlpZiAocmVzdWx0KSB7Ci0JCQlNTV9FUlIoIkFDREI9PiBGYWlsZWQgdG8gc2VuZCBBR0MgZGF0YSB0byBwcmVwcm9jKVxuIik7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9IGVsc2UKLQkJCU1NX0RCRygiQVVEUFJFQyBpcyBjYWxpYnJhdGVkIHdpdGggQUdDIHBhcmFtZXRlcnMiKTsKLQl9Ci0JcmVzdWx0ID0gYWNkYl9maWxsX2F1ZHByZXByb2NfaWlyKCk7Ci0JaWYgKCFJU19FUlJfVkFMVUUocmVzdWx0KSkgewotCQlyZXN1bHQgPSBhdWRwcmVwcm9jX2RzcF9zZXRfaWlyKGFjZGJfZGF0YS5wcmVwcm9jX2lpciwKLQkJCQlzaXplb2YoXAotCQkJCWF1ZHByZXByb2NfY21kX2NmZ19paXJfdHVuaW5nX2ZpbHRlcl9wYXJhbXMpKTsKLQkJaWYgKHJlc3VsdCkgewotCQkJTU1fRVJSKCJBQ0RCPT4gRmFpbGVkIHRvIHNlbmQgSUlSIGRhdGEgdG8gcHJlcHJvY1xuIik7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9IGVsc2UKLQkJCU1NX0RCRygiYXVkcHJlcHJvYyBpcyBjYWxpYnJhdGVkIHdpdGggaWlyIHBhcmFtZXRlcnMiKTsKLQl9Ci0KLQlyZXN1bHQgPSBhY2RiX2ZpbGxfYXVkcHJlcHJvY19ucygpOwotCWlmICghSVNfRVJSX1ZBTFVFKHJlc3VsdCkpIHsKLQkJcmVzdWx0ID0gYXVkcHJlcHJvY19kc3Bfc2V0X25zKGFjZGJfZGF0YS5wcmVwcm9jX25zLAotCQkJCQkJc2l6ZW9mKFwKLQkJCQkJCWF1ZHByZXByb2NfY21kX2NmZ19uc19wYXJhbXMpKTsKLQkJaWYgKHJlc3VsdCkgewotCQkJTU1fRVJSKCJBQ0RCPT4gRmFpbGVkIHRvIHNlbmQgTlMgZGF0YSB0byBwcmVwcm9jXG4iKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0gZWxzZQotCQkJTU1fREJHKCJhdWRwcmVwcm9jIGlzIGNhbGlicmF0ZWQgd2l0aCBOUyBwYXJhbWV0ZXJzIik7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgczMyIGFjZGJfc2VuZF9jYWxpYnJhdGlvbih2b2lkKQotewotCXMzMiByZXN1bHQgPSAwOwotCi0JaWYgKGFjZGJfZGF0YS5kZXZpY2VfaW5mby0+ZGV2X3R5cGUucnhfZGV2aWNlKSB7Ci0JCXJlc3VsdCA9IGFjZGJfY2FsaWJyYXRlX2F1ZHBwKCk7Ci0JCWlmIChyZXN1bHQpCi0JCQlnb3RvIGRvbmU7Ci0JfSBlbHNlIGlmIChhY2RiX2RhdGEuZGV2aWNlX2luZm8tPmRldl90eXBlLnR4X2RldmljZSkgewotCQlyZXN1bHQgPSBhY2RiX2NhbGlicmF0ZV9hdWRwcmVwcm9jKCk7Ci0JCWlmIChyZXN1bHQpCi0JCQlnb3RvIGRvbmU7Ci0JCWFjZGJfZGF0YS5hdWRyZWNfYXBwbGllZCB8PSBBVURSRUNfUkVBRFk7Ci0JCU1NX0RCRygiYWNkYl9kYXRhLmF1ZHJlY19hcHBsaWVkID0gJXhcbiIsCi0JCQkJCWFjZGJfZGF0YS5hdWRyZWNfYXBwbGllZCk7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdTggY2hlY2tfdHhfYWNkYl92YWx1ZXNfY2FjaGVkKHZvaWQpCi17Ci0JaWYgKChhY2RiX2RhdGEuZGV2aWNlX2luZm8tPnNhbXBsZV9yYXRlID09Ci0JCWFjZGJfY2FjaGVfdHguZGV2aWNlX2luZm8uc2FtcGxlX3JhdGUpICYmCi0JCShhY2RiX2RhdGEuZGV2aWNlX2luZm8tPmFjZGJfaWQgPT0KLQkJYWNkYl9jYWNoZV90eC5kZXZpY2VfaW5mby5hY2RiX2lkKSAmJgotCQkoYWNkYl9jYWNoZV90eC5ub2RlX3N0YXR1cyA9PQotCQkJCQkJQUNEQl9WQUxVRVNfRklMTEVEKSkKLQkJcmV0dXJuIDA7Ci0JZWxzZQotCQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlX3R4X2RldmljZV9yZWFkeV9jYWxsYmFjayh2b2lkKQotewotCXU4IGFjZGJfdmFsdWVfYXBwbHkgPSAwOwotCXU4IHJlc3VsdCA9IDA7Ci0KLQkvKmNoZWNrIHdoZWF0aGVyIEFVRFJFQyBlbmFibGVkIGJlZm9yZSBkZXZpY2UgY2FsbCBiYWNrcyovCi0JaWYgKChhY2RiX2RhdGEuYWNkYl9zdGF0ZSAmIEFVRFJFQ19SRUFEWSkgJiYKLQkJCSEoYWNkYl9kYXRhLmF1ZHJlY19hcHBsaWVkICYgQVVEUkVDX1JFQURZKSkgewotCQlNTV9EQkcoIkFVRFJFQyBhbHJlYWR5IGVuYWJsZWQgYXBwbHkgYWNkYiB2YWx1ZXNcbiIpOwotCQlhY2RiX3ZhbHVlX2FwcGx5IHw9IEFVRFJFQ19SRUFEWTsKLQl9Ci0JaWYgKGFjZGJfdmFsdWVfYXBwbHkpIHsKLQkJaWYgKHNlc3Npb25faW5mby5zYW1wbGluZ19mcmVxKQotCQkJYWNkYl9kYXRhLmRldmljZV9pbmZvLT5zYW1wbGVfcmF0ZSA9Ci0JCQkJCXNlc3Npb25faW5mby5zYW1wbGluZ19mcmVxOwotCQlyZXN1bHQgPSBjaGVja190eF9hY2RiX3ZhbHVlc19jYWNoZWQoKTsKLQkJaWYgKHJlc3VsdCkgewotCQkJcmVzdWx0ID0gYWNkYl9nZXRfY2FsaWJyYXRpb24oKTsKLQkJCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQkJTU1fRVJSKCJOb3QgYWJsZSB0byBnZXQgY2FsaWJyYXRpb24iXAotCQkJCQkJIiBkYXRhIGNvbnRpbnVlXG4iKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJYWNkYl9jYWNoZV90eC5ub2RlX3N0YXR1cyA9IEFDREJfVkFMVUVTX0ZJTExFRDsKLQkJYWNkYl9zZW5kX2NhbGlicmF0aW9uKCk7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGFjZGJfY2FjaGVfbm9kZSAqZ2V0X2FjZGJfdmFsdWVzX2Zyb21fY2FjaGVfdHgodTMyIHN0cmVhbV9pZCkKLXsKLQlNTV9EQkcoInNlYXJjaGluZyBub2RlIHdpdGggc3RyZWFtX2lkIik7Ci0JaWYgKChhY2RiX2NhY2hlX3R4LnN0cmVhbV9pZCA9PSBzdHJlYW1faWQpICYmCi0JCQkoYWNkYl9jYWNoZV90eC5ub2RlX3N0YXR1cyA9PQotCQkJCQlBQ0RCX1ZBTFVFU19OT1RfRklMTEVEKSkgewotCQkJcmV0dXJuICZhY2RiX2NhY2hlX3R4OwotCX0KLQlNTV9EQkcoIkVycm9yISBpbiBmaW5kaW5nIG5vZGVcbiIpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfYWNkYl9kYXRhX3N0cnVjdChzdHJ1Y3QgYWNkYl9jYWNoZV9ub2RlICpjdXJfbm9kZSkKLXsKLQlpZiAoY3VyX25vZGUpIHsKLQkJYWNkYl9kYXRhLmRldmljZV9pbmZvID0gJmN1cl9ub2RlLT5kZXZpY2VfaW5mbzsKLQkJYWNkYl9kYXRhLnZpcnRfYWRkciA9IGN1cl9ub2RlLT52aXJ0X2FkZHJfYWNkYl92YWx1ZXM7Ci0JCWFjZGJfZGF0YS5waHlzX2FkZHIgPSBjdXJfbm9kZS0+cGh5c19hZGRyX2FjZGJfdmFsdWVzOwotCX0gZWxzZQotCQlNTV9FUlIoImVycm9yIGluIGN1cmVudCBub2RlXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgc2VuZF9hY2RiX3ZhbHVlc19mb3JfYWN0aXZlX2RldmljZXModm9pZCkKLXsKLQlpZiAoYWNkYl9jYWNoZV9yeC5ub2RlX3N0YXR1cyA9PQotCQkJQUNEQl9WQUxVRVNfRklMTEVEKSB7Ci0JCXVwZGF0ZV9hY2RiX2RhdGFfc3RydWN0KCZhY2RiX2NhY2hlX3J4KTsKLQkJaWYgKGFjZGJfZGF0YS5hY2RiX3N0YXRlICYgQ0FMX0RBVEFfUkVBRFkpCi0JCQlhY2RiX3NlbmRfY2FsaWJyYXRpb24oKTsKLQl9Ci19Ci0KLXN0YXRpYyBzMzIgaW5pdGlhbGl6ZV9ycGModm9pZCkKLXsKLQlzMzIgcmVzdWx0ID0gMDsKLQotCXJlc3VsdCA9IGRhbGRldmljZV9hdHRhY2goREFMREVWSUNFSURfQUNEQiwgQUNEQl9QT1JUX05BTUUsCi0JCQlBQ0RCX0NQVSwgJmFjZGJfZGF0YS5oYW5kbGUpOwotCi0JaWYgKHJlc3VsdCkgewotCQlNTV9FUlIoIkFDREI9PiBEZXZpY2UgQXR0YWNoIGZhaWxlZFxuIik7Ci0JCXJlc3VsdCA9IC1FTk9ERVY7Ci0JCWdvdG8gZG9uZTsKLQl9Ci1kb25lOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB1MzIgYWxsb2NhdGVfbWVtb3J5X2FjZGJfY2FjaGVfdHgodm9pZCkKLXsKLQl1MzIgcmVzdWx0ID0gMDsKLQkvKmluaXRpYWxpemUgbG9jYWwgY2FjaGUgKi8KLQlhY2RiX2NhY2hlX3R4LnBoeXNfYWRkcl9hY2RiX3ZhbHVlcyA9Ci0JCWFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKEFDREJfQlVGX1NJWkUsCi0JCQkJU1pfNEspOwotCi0JaWYgKCFhY2RiX2NhY2hlX3R4LnBoeXNfYWRkcl9hY2RiX3ZhbHVlcykgewotCQlNTV9FUlIoIkFDREI9PiBDYW5ub3QgYWxsb2NhdGUgcGh5c2ljYWwgbWVtb3J5XG4iKTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JYWNkYl9jYWNoZV90eC5tYXBfdl9hZGRyID0gaW9yZW1hcCgKLQkJCWFjZGJfY2FjaGVfdHgucGh5c19hZGRyX2FjZGJfdmFsdWVzLAotCQkJQUNEQl9CVUZfU0laRSk7Ci0JaWYgKElTX0VSUihhY2RiX2NhY2hlX3R4Lm1hcF92X2FkZHIpKSB7Ci0JCU1NX0VSUigiQUNEQj0+IENvdWxkIG5vdCBtYXAgcGh5c2ljYWwgYWRkcmVzc1xuIik7Ci0JCXJlc3VsdCA9IC1FTk9NRU07Ci0JCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoCi0JCQkJYWNkYl9jYWNoZV90eC5waHlzX2FkZHJfYWNkYl92YWx1ZXMpOwotCQlnb3RvIGVycm9yOwotCX0KLQlhY2RiX2NhY2hlX3R4LnZpcnRfYWRkcl9hY2RiX3ZhbHVlcyA9Ci0JCWFjZGJfY2FjaGVfdHgubWFwX3ZfYWRkcjsKLQltZW1zZXQoYWNkYl9jYWNoZV90eC52aXJ0X2FkZHJfYWNkYl92YWx1ZXMsIDAsCi0JCQlBQ0RCX0JVRl9TSVpFKTsKLQlyZXR1cm4gcmVzdWx0OwotZXJyb3I6Ci0JaW91bm1hcChhY2RiX2NhY2hlX3R4Lm1hcF92X2FkZHIpOwotCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoCi0JCQlhY2RiX2NhY2hlX3R4LnBoeXNfYWRkcl9hY2RiX3ZhbHVlcyk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHUzMiBhbGxvY2F0ZV9tZW1vcnlfYWNkYl9jYWNoZV9yeCh2b2lkKQotewotCXUzMiByZXN1bHQgPSAwOwotCi0JLyppbml0aWFsaXplIGxvY2FsIGNhY2hlICovCi0JYWNkYl9jYWNoZV9yeC5waHlzX2FkZHJfYWNkYl92YWx1ZXMgPQotCQlhbGxvY2F0ZV9jb250aWd1b3VzX2ViaV9ub21hcCgKLQkJCQlBQ0RCX0JVRl9TSVpFLCBTWl80Syk7Ci0KLQlpZiAoIWFjZGJfY2FjaGVfcngucGh5c19hZGRyX2FjZGJfdmFsdWVzKSB7Ci0JCU1NX0VSUigiQUNEQj0+IENhbiBub3QgYWxsb2NhdGUgcGh5c2ljYWwgbWVtb3J5XG4iKTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JYWNkYl9jYWNoZV9yeC5tYXBfdl9hZGRyID0KLQkJaW9yZW1hcChhY2RiX2NhY2hlX3J4LnBoeXNfYWRkcl9hY2RiX3ZhbHVlcywKLQkJCQlBQ0RCX0JVRl9TSVpFKTsKLQlpZiAoSVNfRVJSKGFjZGJfY2FjaGVfcngubWFwX3ZfYWRkcikpIHsKLQkJTU1fRVJSKCJBQ0RCPT4gQ291bGQgbm90IG1hcCBwaHlzaWNhbCBhZGRyZXNzXG4iKTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcigKLQkJCQlhY2RiX2NhY2hlX3J4LnBoeXNfYWRkcl9hY2RiX3ZhbHVlcyk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWFjZGJfY2FjaGVfcngudmlydF9hZGRyX2FjZGJfdmFsdWVzID0KLQkJYWNkYl9jYWNoZV9yeC5tYXBfdl9hZGRyOwotCW1lbXNldChhY2RiX2NhY2hlX3J4LnZpcnRfYWRkcl9hY2RiX3ZhbHVlcywgMCwKLQkJCUFDREJfQlVGX1NJWkUpOwotCXJldHVybiByZXN1bHQ7Ci1lcnJvcjoKLQlpb3VubWFwKGFjZGJfY2FjaGVfcngubWFwX3ZfYWRkcik7Ci0JZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcigKLQkJCWFjZGJfY2FjaGVfcngucGh5c19hZGRyX2FjZGJfdmFsdWVzKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdTMyIGFsbG9jYXRlX21lbW9yeV9hY2RiX2dldF9ibGsodm9pZCkKLXsKLQl1MzIgcmVzdWx0ID0gMDsKLQlhY2RiX2RhdGEuZ2V0X2Jsa19wYWRkciA9IGFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKAotCQkJCQkJQUNEQl9CVUZfU0laRSwgU1pfNEspOwotCWlmICghYWNkYl9kYXRhLmdldF9ibGtfcGFkZHIpIHsKLQkJTU1fRVJSKCJBQ0RCPT4gQ2Fubm90IGFsbG9jYXRlIHBoeXNpY2FsIG1lbW9yeVxuIik7Ci0JCXJlc3VsdCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWFjZGJfZGF0YS5tYXBfdl9nZXRfYmxrID0gaW9yZW1hcChhY2RiX2RhdGEuZ2V0X2Jsa19wYWRkciwKLQkJCQkJQUNEQl9CVUZfU0laRSk7Ci0JaWYgKElTX0VSUihhY2RiX2RhdGEubWFwX3ZfZ2V0X2JsaykpIHsKLQkJTU1fRVJSKCJBQ0RCPT4gQ291bGQgbm90IG1hcCBwaHlzaWNhbCBhZGRyZXNzXG4iKTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcigKLQkJCQkJYWNkYl9kYXRhLmdldF9ibGtfcGFkZHIpOwotCQlnb3RvIGVycm9yOwotCX0KLQlhY2RiX2RhdGEuZ2V0X2Jsa19rdmFkZHIgPSBhY2RiX2RhdGEubWFwX3ZfZ2V0X2JsazsKLQltZW1zZXQoYWNkYl9kYXRhLmdldF9ibGtfa3ZhZGRyLCAwLCBBQ0RCX0JVRl9TSVpFKTsKLWVycm9yOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfbWVtb3J5X2FjZGJfY2FjaGVfcngodm9pZCkKLXsKLQlpb3VubWFwKGFjZGJfY2FjaGVfcngubWFwX3ZfYWRkcik7Ci0JZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcigKLQkJCWFjZGJfY2FjaGVfcngucGh5c19hZGRyX2FjZGJfdmFsdWVzKTsKLX0KLQotc3RhdGljIHZvaWQgZnJlZV9tZW1vcnlfYWNkYl9jYWNoZV90eCh2b2lkKQotewotCi0JaW91bm1hcChhY2RiX2NhY2hlX3R4Lm1hcF92X2FkZHIpOwotCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoCi0JCQlhY2RiX2NhY2hlX3R4LnBoeXNfYWRkcl9hY2RiX3ZhbHVlcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfbWVtb3J5X2FjZGJfZ2V0X2Jsayh2b2lkKQotewotCWlvdW5tYXAoYWNkYl9kYXRhLm1hcF92X2dldF9ibGspOwotCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYWNkYl9kYXRhLmdldF9ibGtfcGFkZHIpOwotfQotCi1zdGF0aWMgczMyIGluaXRpYWxpemVfbWVtb3J5KHZvaWQpCi17Ci0JczMyIHJlc3VsdCA9IDA7Ci0KLQlyZXN1bHQgPSBhbGxvY2F0ZV9tZW1vcnlfYWNkYl9nZXRfYmxrKCk7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJTU1fRVJSKCJtZW1vcnkgYWxsb2NhdGlvbiBmb3IgZ2V0IGJsayBmYWlsZWRcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmVzdWx0ID0gYWxsb2NhdGVfbWVtb3J5X2FjZGJfY2FjaGVfcngoKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlNTV9FUlIoIm1lbW9yeSBhbGxvY2F0aW9uIGZvciByeCBjYWNoZSBpcyBmYWlsZWRcbiIpOwotCQlmcmVlX21lbW9yeV9hY2RiX2dldF9ibGsoKTsKLQkJZ290byBkb25lOwotCX0KLQlyZXN1bHQgPSBhbGxvY2F0ZV9tZW1vcnlfYWNkYl9jYWNoZV90eCgpOwotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCU1NX0VSUigibWVtb3J5IGFsbG9jYXRpb24gZm9yIHR4IGNhY2hlIGlzIGZhaWxlZFxuIik7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfZ2V0X2JsaygpOwotCQlmcmVlX21lbW9yeV9hY2RiX2NhY2hlX3J4KCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYWNkYl9kYXRhLnBwX2lpciA9IGttYWxsb2Moc2l6ZW9mKCphY2RiX2RhdGEucHBfaWlyKSwKLQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGFjZGJfZGF0YS5wcF9paXIgPT0gTlVMTCkgewotCQlNTV9FUlIoIkFDREI9PiBDb3VsZCBub3QgYWxsb2NhdGUgcG9zdHByb2MgaWlyIG1lbW9yeVxuIik7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfZ2V0X2JsaygpOwotCQlmcmVlX21lbW9yeV9hY2RiX2NhY2hlX3J4KCk7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfY2FjaGVfdHgoKTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCWFjZGJfZGF0YS5wcF9tYmFkcmMgPSBrbWFsbG9jKHNpemVvZigqYWNkYl9kYXRhLnBwX21iYWRyYyksIEdGUF9LRVJORUwpOwotCWlmIChhY2RiX2RhdGEucHBfbWJhZHJjID09IE5VTEwpIHsKLQkJTU1fRVJSKCJBQ0RCPT4gQ291bGQgbm90IGFsbG9jYXRlIHBvc3Rwcm9jIG1iYWRyYyBtZW1vcnlcbiIpOwotCQlmcmVlX21lbW9yeV9hY2RiX2dldF9ibGsoKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9jYWNoZV9yeCgpOwotCQlmcmVlX21lbW9yeV9hY2RiX2NhY2hlX3R4KCk7Ci0JCWtmcmVlKGFjZGJfZGF0YS5wcF9paXIpOwotCQlyZXN1bHQgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYWNkYl9kYXRhLnByZXByb2NfYWdjID0ga21hbGxvYyhzaXplb2YoKmFjZGJfZGF0YS5wcmVwcm9jX2FnYyksCi0JCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGFjZGJfZGF0YS5wcmVwcm9jX2FnYyA9PSBOVUxMKSB7Ci0JCU1NX0VSUigiQUNEQj0+IENvdWxkIG5vdCBhbGxvY2F0ZSBwcmVwcm9jIGFnYyBtZW1vcnlcbiIpOwotCQlmcmVlX21lbW9yeV9hY2RiX2dldF9ibGsoKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9jYWNoZV9yeCgpOwotCQlmcmVlX21lbW9yeV9hY2RiX2NhY2hlX3R4KCk7Ci0JCWtmcmVlKGFjZGJfZGF0YS5wcF9paXIpOwotCQlrZnJlZShhY2RiX2RhdGEucHBfbWJhZHJjKTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCWFjZGJfZGF0YS5wcmVwcm9jX2lpciA9IGttYWxsb2Moc2l6ZW9mKCphY2RiX2RhdGEucHJlcHJvY19paXIpLAotCQkJCQkJCUdGUF9LRVJORUwpOwotCWlmIChhY2RiX2RhdGEucHJlcHJvY19paXIgPT0gTlVMTCkgewotCQlNTV9FUlIoIkFDREI9PiBDb3VsZCBub3QgYWxsb2NhdGUgcHJlcHJvYyBpaXIgbWVtb3J5XG4iKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9nZXRfYmxrKCk7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfY2FjaGVfcngoKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9jYWNoZV90eCgpOwotCQlrZnJlZShhY2RiX2RhdGEucHBfaWlyKTsKLQkJa2ZyZWUoYWNkYl9kYXRhLnBwX21iYWRyYyk7Ci0JCWtmcmVlKGFjZGJfZGF0YS5wcmVwcm9jX2FnYyk7Ci0JCXJlc3VsdCA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhY2RiX2RhdGEucHJlcHJvY19ucyA9IGttYWxsb2Moc2l6ZW9mKCphY2RiX2RhdGEucHJlcHJvY19ucyksCi0JCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGFjZGJfZGF0YS5wcmVwcm9jX25zID09IE5VTEwpIHsKLQkJTU1fRVJSKCJBQ0RCPT4gQ291bGQgbm90IGFsbG9jYXRlIHByZXByb2MgbnMgbWVtb3J5XG4iKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9nZXRfYmxrKCk7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfY2FjaGVfcngoKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9jYWNoZV90eCgpOwotCQlrZnJlZShhY2RiX2RhdGEucHBfaWlyKTsKLQkJa2ZyZWUoYWNkYl9kYXRhLnBwX21iYWRyYyk7Ci0JCWtmcmVlKGFjZGJfZGF0YS5wcmVwcm9jX2FnYyk7Ci0JCWtmcmVlKGFjZGJfZGF0YS5wcmVwcm9jX2lpcik7Ci0JCXJlc3VsdCA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci1kb25lOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB1OCBjaGVja19kZXZpY2VfY2hhbmdlKHN0cnVjdCBkZXZfZXZ0X21zZyBkZXZpY2VfaW5mbykKLXsKLQlpZiAoIWFjZGJfZGF0YS5kZXZpY2VfaW5mbykgewotCQlNTV9FUlIoIm5vdCBwb2ludGluZyB0byBwcmV2aW91cyB2YWxpZCBkZXZpY2UgZGV0YWlsXG4iKTsKLQkJcmV0dXJuIDE7IC8qZGV2aWNlIGluZm8gd2lsbCBub3QgYmUgcG9pbnRpbmcgdG8qLwotCQkJLyogdmFsaWQgZGV2aWNlIHdoZW4gYWNkYiBkcml2ZXIgY29tZXMgdXAqLwotCX0KLQlpZiAoKGRldmljZV9pbmZvLnNhbXBsZV9yYXRlID09Ci0JCQkJYWNkYl9kYXRhLmRldmljZV9pbmZvLT5zYW1wbGVfcmF0ZSkgJiYKLQkJKGRldmljZV9pbmZvLmFjZGJfaWQgPT0gYWNkYl9kYXRhLmRldmljZV9pbmZvLT5hY2RiX2lkKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRldmljZV9jYihzdHJ1Y3QgZGV2X2V2dF9tc2cgKmV2dCwgdm9pZCAqcHJpdmF0ZSkKLXsKLQlzdHJ1Y3QgY2FkX2RldmljZV9pbmZvX3R5cGUgZGV2X3R5cGU7Ci0Jc3RydWN0IGFjZGJfY2FjaGVfbm9kZSAqYWNkYl9jYWNoZV9mcmVlX25vZGUgPSAgTlVMTDsKLQl1MzIgc2Vzc2lvbl9pZCA9IDA7Ci0JdTggcmV0ID0gMDsKLQl1OCBkZXZpY2VfY2hhbmdlID0gMDsKLQotCS8qaWYgc2Vzc2lvbiB2YWx1ZSBpcyB6ZXJvIGl0IGluZGljYXRlcyB0aGF0IGRldmljZSBjYWxsIGJhY2sgaXMgZm9yCi0Jdm9pY2UgY2FsbCB3ZSB3aWxsIGRyb3AgdGhlIHJlcXVlc3QgYXMgYWNkYiB2YWx1ZXMgZm9yIHZvaWNlIGNhbGwgaXMKLQlub3QgYXBwbGllZCBmcm9tIGFjZGIgZHJpdmVyKi8KLQlpZiAoIWV2dC0+c2Vzc2lvbl9pbmZvKSB7Ci0JCU1NX0RCRygibm8gYWN0aXZlIHNlc3Npb25zIGFuZCBjYWxsIGJhY2sgaXMgZm9yIlwKLQkJCQkiIHZvaWNlIGNhbGxcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKChldnQtPmRldl90eXBlLnJ4X2RldmljZSkgJiYKLQkJCShldnQtPmFjZGJfaWQgPT0gUFNFVURPX0FDREJfSUQpKSB7Ci0JCU1NX0lORk8oImRldmljZSBjYiBpcyBmb3IgcnggZGV2aWNlIHdpdGggcHNldWRvIGFjZGIgaWRcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWRldl90eXBlID0gZXZ0LT5kZXZfdHlwZTsKLQlNTV9EQkcoInNhbXBsZV9yYXRlID0gJWRcbiIsIGV2dC0+c2FtcGxlX3JhdGUpOwotCU1NX0RCRygiYWNkYl9pZCA9ICVkXG4iLCBldnQtPmFjZGJfaWQpOwotCU1NX0RCRygic2Vzc2lvbnMgPSAlZFxuIiwgZXZ0LT5zZXNzaW9uX2luZm8pOwotCU1NX0RCRygiYWNkYl9zdGF0ZSA9ICV4XG4iLCBhY2RiX2RhdGEuYWNkYl9zdGF0ZSk7Ci0JbXV0ZXhfbG9jaygmYWNkYl9kYXRhLmFjZGJfbXV0ZXgpOwotCWRldmljZV9jaGFuZ2UgPSBjaGVja19kZXZpY2VfY2hhbmdlKCpldnQpOwotCWlmICghZGV2aWNlX2NoYW5nZSkgewotCQlpZiAoZGV2X3R5cGUudHhfZGV2aWNlKSB7Ci0JCQlpZiAoIShhY2RiX2RhdGEuYWNkYl9zdGF0ZSAmIEFVRFJFQ19SRUFEWSkpCi0JCQkJYWNkYl9kYXRhLmF1ZHJlY19hcHBsaWVkICY9IH5BVURSRUNfUkVBRFk7Ci0KLQkJCWFjZGJfZGF0YS5hY2RiX3N0YXRlICY9IH5DQUxfREFUQV9SRUFEWTsKLQkJCWdvdG8gdXBkYXRlX2NhY2hlOwotCQl9Ci0JfSBlbHNlCi0JCS8qIHN0YXRlIGlzIHVwZGF0ZWQgdG8gcXVlcnkgdGhlIG1vZGVtIGZvciB2YWx1ZXMgKi8KLQkJYWNkYl9kYXRhLmFjZGJfc3RhdGUgJj0gfkNBTF9EQVRBX1JFQURZOwotCi11cGRhdGVfY2FjaGU6Ci0JaWYgKGRldl90eXBlLnR4X2RldmljZSkgewotCQkvKk9ubHkgb25lIHJlY29yZGluZyBzZXNzaW9uIHBvc3NpYmxlKi8KLQkJc2Vzc2lvbl9pZCA9IDA7Ci0JCWFjZGJfY2FjaGVfZnJlZV9ub2RlID0JJmFjZGJfY2FjaGVfdHg7Ci0JCXJldCAgPSBjaGVja19kZXZpY2VfaW5mb19hbHJlYWR5X3ByZXNlbnQoCi0JCQkJKmV2dCwKLQkJCQlhY2RiX2NhY2hlX2ZyZWVfbm9kZSk7Ci0JCWFjZGJfY2FjaGVfZnJlZV9ub2RlLT5zdHJlYW1faWQgPSBzZXNzaW9uX2lkOwotCQlhY2RiX2RhdGEuY3VyX3R4X3Nlc3Npb24gPSBzZXNzaW9uX2lkOwotCX0gZWxzZSB7Ci0JCWFjZGJfY2FjaGVfZnJlZV9ub2RlID0gJmFjZGJfY2FjaGVfcng7Ci0JCXJldCA9IGNoZWNrX2RldmljZV9pbmZvX2FscmVhZHlfcHJlc2VudCgqZXZ0LAotCQkJCQkJYWNkYl9jYWNoZV9mcmVlX25vZGUpOwotCQlpZiAocmV0ID09IDEpIHsKLQkJCU1NX0RCRygiZ290IGRldmljZSByZWFkeSBjYWxsIGJhY2sgZm9yIGFub3RoZXIgIlwKLQkJCQkJImF1ZHBsYXkgdGFzayBzZXNzaW9ucyBvbiBzYW1lIENPUFBcbiIpOwotCQkJbXV0ZXhfdW5sb2NrKCZhY2RiX2RhdGEuYWNkYl9tdXRleCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0JdXBkYXRlX2FjZGJfZGF0YV9zdHJ1Y3QoYWNkYl9jYWNoZV9mcmVlX25vZGUpOwotCWFjZGJfZGF0YS5kZXZpY2VfY2JfY29tcGwgPSAxOwotCW11dGV4X3VubG9jaygmYWNkYl9kYXRhLmFjZGJfbXV0ZXgpOwotCXdha2VfdXAoJmFjZGJfZGF0YS53YWl0KTsKLWRvbmU6Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgczMyIHJlZ2lzdGVyX2RldmljZV9jYih2b2lkKQotewotCXMzMiByZXN1bHQgPSAwOwotCWFjZGJfZGF0YS5kZXZfY2IuZnVuYyA9IGRldmljZV9jYjsKLQlhY2RiX2RhdGEuZGV2X2NiLnByaXZhdGUgPSAodm9pZCAqKSZhY2RiX2RhdGE7Ci0KLQlyZXN1bHQgPSBhdWRtZ3JfcmVnaXN0ZXJfZGV2aWNlX2luZm9fY2FsbGJhY2soJmFjZGJfZGF0YS5kZXZfY2IpOwotCi0JaWYgKHJlc3VsdCkgewotCQlNTV9FUlIoIkFDREI9PiBDb3VsZCBub3QgcmVnaXN0ZXIgZGV2aWNlIGNhbGxiYWNrXG4iKTsKLQkJcmVzdWx0ID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgYXVkcHBfY2Iodm9pZCAqcHJpdmF0ZSwgdTMyIGlkLCB1MTYgKm1zZykKLXsKLQlNTV9EQkcoIlxuIik7Ci0KLQlpZiAoaWQgPT0gQVVEUFBfTVNHX1BQX0RJU0FCTEVfRkVFREJBQ0spIHsKLQkJYWNkYl9kYXRhLmF1ZHBwX2Rpc2FibGVkX2ZlYXR1cmVzIHw9Ci0JCQkoKHVpbnQzMl90KShtc2dbQVVEUFBfRElTQUJMRV9GRUFUU19NU1ddIDw8IDE2KSB8Ci0JCQkgbXNnW0FVRFBQX0RJU0FCTEVfRkVBVFNfTFNXXSk7Ci0JCU1NX0lORk8oIkFVRFBQIGRpc2FibGUgZmVlZGJhY2s6ICV4IiwKLQkJCQlhY2RiX2RhdGEuYXVkcHBfZGlzYWJsZWRfZmVhdHVyZXMpOwotCQlnb3RvIGRvbmU7Ci0JfSBlbHNlIGlmIChpZCA9PSBBVURQUF9NU0dfUFBfRkVBVFNfUkVfRU5BQkxFKSB7Ci0JCU1NX0lORk8oIkFVRFBQIHJlLWVuYWJsZSBtZXNzYWFnZTogJXgiLAotCQkJCWFjZGJfZGF0YS5hdWRwcF9kaXNhYmxlZF9mZWF0dXJlcyk7Ci0JCWFjZGJfZGF0YS5hdWRwcF9jYl9yZWVuYWJsZV9jb21wbCA9IDE7Ci0JCXdha2VfdXAoJmFjZGJfZGF0YS53YWl0KTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChpZCAhPSBBVURQUF9NU0dfQ0ZHX01TRykKLQkJZ290byBkb25lOwotCi0JaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0RJUykgewotCQlpZiAoLS1hY2RiX2NhY2hlX3J4LnN0cmVhbV9pZCA8PSAwKSB7Ci0JCQlhY2RiX2RhdGEuYWNkYl9zdGF0ZSAmPSB+QVVEUFBfUkVBRFk7Ci0JCQlhY2RiX2NhY2hlX3J4LnN0cmVhbV9pZCA9IDA7Ci0JCQlNTV9EQkcoIkFVRFBQX01TR19FTkFfRElTXG4iKTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCS8qc3RyZWFtX2lkIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBudW1iZXIgb2YgYWN0aXZlKi8KLQkvKnNlc3Npb25zIGFjdGl2ZSBvbiB0aGlzIGRldmljZSovCi0JYWNkYl9jYWNoZV9yeC5zdHJlYW1faWQrKzsKLQotCWFjZGJfZGF0YS5hY2RiX3N0YXRlIHw9IEFVRFBQX1JFQURZOwotCWFjZGJfZGF0YS5hdWRwcF9jYl9jb21wbCA9IDE7Ci0Jd2FrZV91cCgmYWNkYl9kYXRhLndhaXQpOwotZG9uZToKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBzOCBoYW5kbGVfYXVkcHJlcHJvY19jYih2b2lkKQotewotCXN0cnVjdCBhY2RiX2NhY2hlX25vZGUgKmFjZGJfY2FjaGVkX3ZhbHVlczsKLQlzOCByZXN1bHQgPSAwOwotCXU4IHN0cmVhbV9pZCA9IGFjZGJfZGF0YS5wcmVwcm9jX3N0cmVhbV9pZDsKLQlhY2RiX2RhdGEucHJlcHJvY19jYl9jb21wbCA9IDA7Ci0JYWNkYl9jYWNoZWRfdmFsdWVzID0gZ2V0X2FjZGJfdmFsdWVzX2Zyb21fY2FjaGVfdHgoc3RyZWFtX2lkKTsKLQlpZiAoYWNkYl9jYWNoZWRfdmFsdWVzID09IE5VTEwpIHsKLQkJTU1fREJHKCJFUlJPUjogdG8gZ2V0IGNoYWNoZWQgYWNkYiB2YWx1ZXNcbiIpOwotCQlyZXR1cm4gLUVQRVJNOwotCX0KLQl1cGRhdGVfYWNkYl9kYXRhX3N0cnVjdChhY2RiX2NhY2hlZF92YWx1ZXMpOwotCi0JaWYgKHNlc3Npb25faW5mby5zYW1wbGluZ19mcmVxKQotCQlhY2RiX2RhdGEuZGV2aWNlX2luZm8tPnNhbXBsZV9yYXRlID0KLQkJCXNlc3Npb25faW5mby5zYW1wbGluZ19mcmVxOwotCi0JaWYgKCEoYWNkYl9kYXRhLmFjZGJfc3RhdGUgJiBDQUxfREFUQV9SRUFEWSkpIHsKLQkJcmVzdWx0ID0gY2hlY2tfdHhfYWNkYl92YWx1ZXNfY2FjaGVkKCk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCXJlc3VsdCA9IGFjZGJfZ2V0X2NhbGlicmF0aW9uKCk7Ci0JCQlpZiAocmVzdWx0IDwgMCkgewotCQkJCU1NX0VSUigiZmFpbGVkIHRvIGdldCBjYWxpYnJhdGlvbiBkYXRhXG4iKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCWFjZGJfY2FjaGVkX3ZhbHVlcy0+bm9kZV9zdGF0dXMgPSBBQ0RCX1ZBTFVFU19GSUxMRUQ7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHByZXByb2NfY2Iodm9pZCAqcHJpdmF0ZSwgdTMyIGlkLCB2b2lkICpldmVudF9kYXRhKQotewotCXU4IHJlc3VsdCA9IDA7Ci0JdWludDE2X3QgKm1zZyA9IGV2ZW50X2RhdGE7Ci0JaW50IHN0cmVhbV9pZCA9IDA7IC8qIE9ubHkgc2luZ2xlIHR1bm5lbCBtb2RlIHJlY29yZGluZyBzdXBwb3J0ZWQgKi8KLQlpZiAoaWQgIT0gQVVEUFJFUFJPQ19NU0dfQ01EX0NGR19ET05FX01TRykKLQkJZ290byBkb25lOwotCi0JYWNkYl9kYXRhLnByZXByb2Nfc3RyZWFtX2lkID0gc3RyZWFtX2lkOwotCWdldF9hdWRyZWNfc2Vzc2lvbl9pbmZvKCZzZXNzaW9uX2luZm8pOwotCU1NX0RCRygic3RhdHVzX2ZsYWcgPSAleFxuIiwgbXNnWzBdKTsKLQlpZiAobXNnWzBdICA9PSBBVURQUkVQUk9DX01TR19TVEFUVVNfRkxBR19ESVMpIHsKLQkJYWNkYl9kYXRhLmFjZGJfc3RhdGUgJj0gfkFVRFJFQ19SRUFEWTsKLQkJYWNkYl9jYWNoZV90eC5ub2RlX3N0YXR1cyA9XAotCQkJCQkJQUNEQl9WQUxVRVNfTk9UX0ZJTExFRDsKLQkJYWNkYl9kYXRhLmFjZGJfc3RhdGUgJj0gfkNBTF9EQVRBX1JFQURZOwotCQlnb3RvIGRvbmU7Ci0JfQotCS8qRm9sbG93aW5nIGNoZWNrIGlzIGFkZGVkIHRvIG1ha2Ugc3VyZSB0aGF0IGRldmljZSBpbmZvCi0JICBpcyB1cGRhdGVkLiBhdWRwcmUgcHJvYyBsYXllciBlbmFibGVkIHdpdGhvdXQgZGV2aWNlCi0JICBjYWxsYmFjayBhdCB0aGlzIHNjZW5hcmlvIHdlIHNob3VsZCBub3QgYWNjZXNzCi0JICBkZXZpY2UgaW5mb3JtYXRpb24KLQkgKi8KLQlpZiAoYWNkYl9kYXRhLmRldmljZV9pbmZvICYmCi0JCQlzZXNzaW9uX2luZm8uc2FtcGxpbmdfZnJlcSkgewotCQlhY2RiX2RhdGEuZGV2aWNlX2luZm8tPnNhbXBsZV9yYXRlID0KLQkJCXNlc3Npb25faW5mby5zYW1wbGluZ19mcmVxOwotCQlyZXN1bHQgPSBjaGVja190eF9hY2RiX3ZhbHVlc19jYWNoZWQoKTsKLQkJaWYgKCFyZXN1bHQpIHsKLQkJCU1NX0lORk8oImFjZGIgdmFsdWVzIGZvciB0aGUgc3RyZWFtIGlzIiBcCi0JCQkJCSIgcXVlcnJpZWQgZnJvbSBtb2RlbSIpOwotCQkJYWNkYl9kYXRhLmFjZGJfc3RhdGUgfD0gQ0FMX0RBVEFfUkVBRFk7Ci0JCX0gZWxzZSB7Ci0JCQlhY2RiX2RhdGEuYWNkYl9zdGF0ZSAmPSB+Q0FMX0RBVEFfUkVBRFk7Ci0JCX0KLQl9Ci0JYWNkYl9kYXRhLmFjZGJfc3RhdGUgfD0gQVVEUkVDX1JFQURZOwotCi0JYWNkYl9kYXRhLnByZXByb2NfY2JfY29tcGwgPSAxOwotCU1NX0RCRygiYWNkYl9kYXRhLmFjZGJfc3RhdGUgPSAleFxuIiwgYWNkYl9kYXRhLmFjZGJfc3RhdGUpOwotCXdha2VfdXAoJmFjZGJfZGF0YS53YWl0KTsKLWRvbmU6Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgczMyIHJlZ2lzdGVyX2F1ZHBwX2NiKHZvaWQpCi17Ci0JczMyIHJlc3VsdCA9IDA7Ci0KLQlhY2RiX2RhdGEuYXVkcHBfY2IuZm4gPSBhdWRwcF9jYjsKLQlhY2RiX2RhdGEuYXVkcHBfY2IucHJpdmF0ZSA9IE5VTEw7Ci0JcmVzdWx0ID0gYXVkcHBfcmVnaXN0ZXJfZXZlbnRfY2FsbGJhY2soJmFjZGJfZGF0YS5hdWRwcF9jYik7Ci0JaWYgKHJlc3VsdCkgewotCQlNTV9FUlIoIkFDREI9PiBDb3VsZCBub3QgcmVnaXN0ZXIgYXVkcHAgY2FsbGJhY2tcbiIpOwotCQlyZXN1bHQgPSAtRU5PREVWOwotCQlnb3RvIGRvbmU7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgczMyIHJlZ2lzdGVyX2F1ZHByZXByb2NfY2Iodm9pZCkKLXsKLQlzMzIgcmVzdWx0ID0gMDsKLQotCWFjZGJfZGF0YS5hdWRwcmVwcm9jX2NiLmZuID0gYXVkcHJlcHJvY19jYjsKLQlhY2RiX2RhdGEuYXVkcHJlcHJvY19jYi5wcml2YXRlID0gTlVMTDsKLQlyZXN1bHQgPSBhdWRwcmVwcm9jX3JlZ2lzdGVyX2V2ZW50X2NhbGxiYWNrKCZhY2RiX2RhdGEuYXVkcHJlcHJvY19jYik7Ci0JaWYgKHJlc3VsdCkgewotCQlNTV9FUlIoIkFDREI9PiBDb3VsZCBub3QgcmVnaXN0ZXIgYXVkcHJlcHJvYyBjYWxsYmFja1xuIik7Ci0JCXJlc3VsdCA9IC1FTk9ERVY7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHMzMiBhY2RiX2luaXRpYWxpemVfZGF0YSh2b2lkKQotewotCXMzMglyZXN1bHQgPSAwOwotCi0JbXV0ZXhfaW5pdCgmYWNkYl9kYXRhLmFjZGJfbXV0ZXgpOwotCi0JcmVzdWx0ID0gaW5pdGlhbGl6ZV9ycGMoKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIGVycjsKLQotCXJlc3VsdCA9IGluaXRpYWxpemVfbWVtb3J5KCk7Ci0JaWYgKHJlc3VsdCkKLQkJZ290byBlcnIxOwotCi0JcmVzdWx0ID0gcmVnaXN0ZXJfZGV2aWNlX2NiKCk7Ci0JaWYgKHJlc3VsdCkKLQkJZ290byBlcnIyOwotCi0JcmVzdWx0ID0gcmVnaXN0ZXJfYXVkcHBfY2IoKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIGVycjM7Ci0KLQlyZXN1bHQgPSByZWdpc3Rlcl9hdWRwcmVwcm9jX2NiKCk7Ci0JaWYgKHJlc3VsdCkKLQkJZ290byBlcnI0OwotCi0KLQlyZXR1cm4gcmVzdWx0OwotCi1lcnI0OgotCXJlc3VsdCA9IGF1ZHByZXByb2NfdW5yZWdpc3Rlcl9ldmVudF9jYWxsYmFjaygmYWNkYl9kYXRhLmF1ZHByZXByb2NfY2IpOwotCWlmIChyZXN1bHQpCi0JCU1NX0VSUigiQUNEQj0+IENvdWxkIG5vdCB1bnJlZ2lzdGVyIGF1ZHByZXByb2MgY2FsbGJhY2tcbiIpOwotZXJyMzoKLQlyZXN1bHQgPSBhdWRwcF91bnJlZ2lzdGVyX2V2ZW50X2NhbGxiYWNrKCZhY2RiX2RhdGEuYXVkcHBfY2IpOwotCWlmIChyZXN1bHQpCi0JCU1NX0VSUigiQUNEQj0+IENvdWxkIG5vdCB1bnJlZ2lzdGVyIGF1ZHBwIGNhbGxiYWNrXG4iKTsKLWVycjI6Ci0JcmVzdWx0ID0gYXVkbWdyX2RlcmVnaXN0ZXJfZGV2aWNlX2luZm9fY2FsbGJhY2soJmFjZGJfZGF0YS5kZXZfY2IpOwotCWlmIChyZXN1bHQpCi0JCU1NX0VSUigiQUNEQj0+IENvdWxkIG5vdCB1bnJlZ2lzdGVyIGRldmljZSBjYWxsYmFja1xuIik7Ci1lcnIxOgotCWRhbGRldmljZV9kZXRhY2goYWNkYl9kYXRhLmhhbmRsZSk7Ci0JYWNkYl9kYXRhLmhhbmRsZSA9IE5VTEw7Ci1lcnI6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHMzMiBhY2RiX2NhbGlicmF0ZV9kZXZpY2Uodm9pZCAqZGF0YSkKLXsKLQlzMzIgcmVzdWx0ID0gMDsKLQotCS8qIGluaXRpYWxpemUgZHJpdmVyICovCi0JcmVzdWx0ID0gYWNkYl9pbml0aWFsaXplX2RhdGEoKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIGRvbmU7Ci0KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQlNTV9EQkcoIldhaXRpbmcgZm9yIGNhbGwgYmFjayBldmVudHNcbiIpOwotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYWNkYl9kYXRhLndhaXQsCi0JCQkJCShhY2RiX2RhdGEuZGV2aWNlX2NiX2NvbXBsCi0JCQkJCXwgYWNkYl9kYXRhLmF1ZHBwX2NiX2NvbXBsCi0JCQkJCXwgYWNkYl9kYXRhLmF1ZHBwX2NiX3JlZW5hYmxlX2NvbXBsCi0JCQkJCXwgYWNkYl9kYXRhLnByZXByb2NfY2JfY29tcGwpKTsKLQkJbXV0ZXhfbG9jaygmYWNkYl9kYXRhLmFjZGJfbXV0ZXgpOwotCQlpZiAoYWNkYl9kYXRhLmRldmljZV9jYl9jb21wbCkgewotCQkJYWNkYl9kYXRhLmRldmljZV9jYl9jb21wbCA9IDA7Ci0JCQlpZiAoIShhY2RiX2RhdGEuYWNkYl9zdGF0ZSAmIENBTF9EQVRBX1JFQURZKSkgewotCQkJCWlmIChhY2RiX2RhdGEuZGV2aWNlX2luZm8tPmRldl90eXBlLnJ4X2RldmljZSkgewotCQkJCQkvKndlIG5lZWQgdG8gZ2V0IGNhbGlicmF0aW9uIHZhbHVlcwotCQkJCQlvbmx5IGZvciBSWCBkZXZpY2UgYXMgcmVzYW1wbGVyCi0JCQkJCW1vdmVkIHRvIHN0YXJ0IG9mIHRoZSBwcmUgLSBwcm9jIGNoYWluCi0JCQkJCXR4IGNhbGlicmF0aW9uIHZhbHVlIHdpbGwgYmUgYmFzZWQgb24KLQkJCQkJc2FtcGxpbmcgZnJlcXVlbmN5IHdoYXQgYXVkcmVjIGlzCi0JCQkJCWNvbmZpZ3VyZWQsIGNhbGlicmF0aW9uIHZhbHVlcyBmb3IgdHgKLQkJCQkJZGV2aWNlIGFyZSBmZXRjaCBpbiBhdWRwcmVwcm9jCi0JCQkJCWNhbGxiYWNrKi8KLQkJCQkJcmVzdWx0ID0gYWNkYl9nZXRfY2FsaWJyYXRpb24oKTsKLQkJCQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCQkJCW11dGV4X3VubG9jaygKLQkJCQkJCQkmYWNkYl9kYXRhLmFjZGJfbXV0ZXgpOwotCQkJCQkJTU1fRVJSKCJOb3QgYWJsZSB0byBnZXQgIlwKLQkJCQkJCQkiY2FsaWJyYXRpb24gIlwKLQkJCQkJCQkiZGF0YSBjb250aW51ZVxuIik7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCU1NX0RCRygiYWNkYiBzdGF0ZSA9ICVkXG4iLAotCQkJCQkgYWNkYl9kYXRhLmFjZGJfc3RhdGUpOwotCQkJaWYgKGFjZGJfZGF0YS5kZXZpY2VfaW5mby0+ZGV2X3R5cGUudHhfZGV2aWNlKQotCQkJCWhhbmRsZV90eF9kZXZpY2VfcmVhZHlfY2FsbGJhY2soKTsKLQkJCWVsc2UgewotCQkJCWlmIChhY2RiX2RhdGEuYXVkcHBfY2JfcmVlbmFibGVfY29tcGwpIHsKLQkJCQkJTU1fSU5GTygiUmVzZXQgZGlzYWJsZWQgZmVhdHVyZSBmbGFnIik7Ci0JCQkJCWFjZGJfZGF0YS5hdWRwcF9kaXNhYmxlZF9mZWF0dXJlcyA9IDA7Ci0JCQkJCWFjZGJfZGF0YS5hdWRwcF9jYl9yZWVuYWJsZV9jb21wbCA9IDA7Ci0JCQkJfQotCQkJCWFjZGJfY2FjaGVfcngubm9kZV9zdGF0dXMgPVwKLQkJCQkJCUFDREJfVkFMVUVTX0ZJTExFRDsKLQkJCQlpZiAoYWNkYl9kYXRhLmFjZGJfc3RhdGUgJgotCQkJCQkJQVVEUFBfUkVBRFkpIHsKLQkJCQkJTU1fREJHKCJBVURQUCBhbHJlYWR5IGVuYWJsZWQgIlwKLQkJCQkJCQkiYXBwbHkgYWNkYiB2YWx1ZXNcbiIpOwotCQkJCQlnb3RvIGFwcGx5OwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghKGFjZGJfZGF0YS5hdWRwcF9jYl9jb21wbCB8fAotCQkJCWFjZGJfZGF0YS5hdWRwcF9jYl9yZWVuYWJsZV9jb21wbCB8fAotCQkJCWFjZGJfZGF0YS5wcmVwcm9jX2NiX2NvbXBsKSkgewotCQkJTU1fREJHKCJuZWVkIHRvIHdhaXQgZm9yIGVpdGhlciBBVURQUCAvIEFVRFBSRVBST0MgIlwKLQkJCQkJIkV2ZW50XG4iKTsKLQkJCW11dGV4X3VubG9jaygmYWNkYl9kYXRhLmFjZGJfbXV0ZXgpOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9EQkcoImdvdCBhdWRwcCAvIHByZXByb2MgY2FsbCBiYWNrXG4iKTsKLQkJCWlmIChhY2RiX2RhdGEuYXVkcHBfY2JfY29tcGwpIHsKLQkJCQlpZiAoYWNkYl9kYXRhLmF1ZHBwX2NiX3JlZW5hYmxlX2NvbXBsKSB7Ci0JCQkJCU1NX0lORk8oIlJlc2V0IGRpc2FibGVkIGZlYXR1cmUgZmxhZyIpOwotCQkJCQlhY2RiX2RhdGEuYXVkcHBfZGlzYWJsZWRfZmVhdHVyZXMgPSAwOwotCQkJCQlhY2RiX2RhdGEuYXVkcHBfY2JfcmVlbmFibGVfY29tcGwgPSAwOwotCQkJCX0KLQkJCQlzZW5kX2FjZGJfdmFsdWVzX2Zvcl9hY3RpdmVfZGV2aWNlcygpOwotCQkJCWFjZGJfZGF0YS5hdWRwcF9jYl9jb21wbCA9IDA7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZhY2RiX2RhdGEuYWNkYl9tdXRleCk7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKGFjZGJfZGF0YS5hdWRwcF9jYl9yZWVuYWJsZV9jb21wbCkgewotCQkJCWFjZGJfcmVfZW5hYmxlX2F1ZHBwKCk7Ci0JCQkJYWNkYl9kYXRhLmF1ZHBwX2Rpc2FibGVkX2ZlYXR1cmVzID0gMDsKLQkJCQlhY2RiX2RhdGEuYXVkcHBfY2JfcmVlbmFibGVfY29tcGwgPSAwOwotCQkJCW11dGV4X3VubG9jaygmYWNkYl9kYXRhLmFjZGJfbXV0ZXgpOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQgPSBoYW5kbGVfYXVkcHJlcHJvY19jYigpOwotCQkJCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQkJCW11dGV4X3VubG9jaygmYWNkYl9kYXRhLmFjZGJfbXV0ZXgpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLWFwcGx5OgotCQlpZiAoYWNkYl9kYXRhLmFjZGJfc3RhdGUgJiBDQUxfREFUQV9SRUFEWSkKLQkJCXJlc3VsdCA9IGFjZGJfc2VuZF9jYWxpYnJhdGlvbigpOwotCi0JCW11dGV4X3VubG9jaygmYWNkYl9kYXRhLmFjZGJfbXV0ZXgpOwotCX0KLWRvbmU6Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFjZGJfaW5pdCh2b2lkKQotewotCi0JczMyIHJlc3VsdCA9IDA7Ci0KLQltZW1zZXQoJmFjZGJfZGF0YSwgMCwgc2l6ZW9mKGFjZGJfZGF0YSkpOwotCXNwaW5fbG9ja19pbml0KCZhY2RiX2RhdGEuZHNwX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFjZGJfZGF0YS53YWl0KTsKLQlhY2RiX2RhdGEuY2JfdGhyZWFkX3Rhc2sgPSBrdGhyZWFkX3J1bihhY2RiX2NhbGlicmF0ZV9kZXZpY2UsCi0JCU5VTEwsICJhY2RiX2NiX3RocmVhZCIpOwotCi0JaWYgKElTX0VSUihhY2RiX2RhdGEuY2JfdGhyZWFkX3Rhc2spKSB7Ci0JCU1NX0VSUigiQUNEQj0+IENvdWxkIG5vdCByZWdpc3RlciBjYiB0aHJlYWRcbiIpOwotCQlyZXN1bHQgPSAtRU5PREVWOwotCQlnb3RvIGVycjsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQkvKlRoaXMgaXMgUlRDIHNwZWNpZmljIElOSVQgdXNlZCBvbmx5IHdpdGggZGVidWdmcyovCi0JaWYgKCFydGNfYWNkYl9pbml0KCkpCi0JCU1NX0VSUigiUlRDIEFDREI9PklOSVQgRmFpbHVyZVxuIik7Ci0KLSNlbmRpZgotCi0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmFjZGJfbWlzYyk7Ci1lcnI6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGFjZGJfZXhpdCh2b2lkKQotewotCXMzMglyZXN1bHQgPSAwOwotCi0JcmVzdWx0ID0gYXVkbWdyX2RlcmVnaXN0ZXJfZGV2aWNlX2luZm9fY2FsbGJhY2soJmFjZGJfZGF0YS5kZXZfY2IpOwotCWlmIChyZXN1bHQpCi0JCU1NX0VSUigiQUNEQj0+IENvdWxkIG5vdCB1bnJlZ2lzdGVyIGRldmljZSBjYWxsYmFja1xuIik7Ci0KLQlyZXN1bHQgPSBhdWRwcF91bnJlZ2lzdGVyX2V2ZW50X2NhbGxiYWNrKCZhY2RiX2RhdGEuYXVkcHBfY2IpOwotCWlmIChyZXN1bHQpCi0JCU1NX0VSUigiQUNEQj0+IENvdWxkIG5vdCB1bnJlZ2lzdGVyIGF1ZHBwIGNhbGxiYWNrXG4iKTsKLQotCXJlc3VsdCA9IGF1ZHByZXByb2NfdW5yZWdpc3Rlcl9ldmVudF9jYWxsYmFjaygmYWNkYl9kYXRhLlwKLQkJCQlhdWRwcmVwcm9jX2NiKTsKLQlpZiAocmVzdWx0KQotCQlNTV9FUlIoIkFDREI9PiBDb3VsZCBub3QgdW5yZWdpc3RlciBhdWRwcmVwcm9jIGNhbGxiYWNrXG4iKTsKLQotCXJlc3VsdCA9IGt0aHJlYWRfc3RvcChhY2RiX2RhdGEuY2JfdGhyZWFkX3Rhc2spOwotCWlmIChyZXN1bHQpCi0JCU1NX0VSUigiQUNEQj0+IENvdWxkIG5vdCBzdG9wIGt0aHJlYWRcbiIpOwotCi0JZnJlZV9tZW1vcnlfYWNkYl9nZXRfYmxrKCk7Ci0KLQlpb3VubWFwKGFjZGJfY2FjaGVfdHgubWFwX3ZfYWRkcik7Ci0JZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcigKLQkJCWFjZGJfY2FjaGVfdHgucGh5c19hZGRyX2FjZGJfdmFsdWVzKTsKLQlpb3VubWFwKGFjZGJfY2FjaGVfcngubWFwX3ZfYWRkcik7Ci0JZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcigKLQkJCWFjZGJfY2FjaGVfcngucGh5c19hZGRyX2FjZGJfdmFsdWVzKTsKLQlrZnJlZShhY2RiX2RhdGEuZGV2aWNlX2luZm8pOwotCWtmcmVlKGFjZGJfZGF0YS5wcF9paXIpOwotCWtmcmVlKGFjZGJfZGF0YS5wcF9tYmFkcmMpOwotCWtmcmVlKGFjZGJfZGF0YS5wcmVwcm9jX2FnYyk7Ci0Ja2ZyZWUoYWNkYl9kYXRhLnByZXByb2NfaWlyKTsKLQlrZnJlZShhY2RiX2RhdGEucHJlcHJvY19ucyk7Ci0JbXV0ZXhfZGVzdHJveSgmYWNkYl9kYXRhLmFjZGJfbXV0ZXgpOwotCW1lbXNldCgmYWNkYl9kYXRhLCAwLCBzaXplb2YoYWNkYl9kYXRhKSk7Ci0JI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXJ0Y19hY2RiX2RlaW5pdCgpOwotCSNlbmRpZgotfQotCi1sYXRlX2luaXRjYWxsKGFjZGJfaW5pdCk7Ci1tb2R1bGVfZXhpdChhY2RiX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1TTSA4eDI1IEF1ZGlvIEFDREIgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19hbXJuYi5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fYW1ybmIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyZGM0Zi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19hbXJuYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcwNyArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19hbXJuYi5jCi0gKgotICogYW1ybmIgYXVkaW8gZGVjb2RlciBkZXZpY2UKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSwgMjAxMS0yMDEzIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIEJhc2VkIG9uIHRoZSBtcDMgbmF0aXZlIGRyaXZlciBpbiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19tcDMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqCi0gKiBBbGwgc291cmNlIGNvZGUgaW4gdGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBleGNlcHQKLSAqIHdoZXJlIGluZGljYXRlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCi0gKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBmaW5kIGl0IGF0IGh0dHA6Ly93d3cuZnNmLm9yZwotICovCi0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZWFybHlzdXNwZW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KLQotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdV9kb21haW5zLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwY21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcG1zZy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwbGF5Y21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwbGF5bXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNXJtdGNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fbWVtdHlwZXMuaD4KLQotI2luY2x1ZGUgImF1ZG1nci5oIgotCi0jZGVmaW5lIEJVRlNaIDEwMjQgLyogSG9sZCBtaW5pbXVtIDcwMG1zIHZvaWNlIGRhdGEgYW5kIDE0IGJ5dGVzIG9mIG1ldGEgaW4qLwotI2RlZmluZSBETUFTWiAoQlVGU1ogKiAyKQotCi0jZGVmaW5lIEFVRFBMQVlfSU5WQUxJRF9SRUFEX1BUUl9PRkZTRVQJMHhGRkZGCi0jZGVmaW5lIEFVRERFQ19ERUNfQU1STkIgMTAKLQotI2RlZmluZSBQQ01fQlVGU1pfTUlOIDE2MjQgLyogMTAwbXMgd29ydGggb2YgZGF0YSBhbmQgMjQgYnl0ZXMgb2YgbWV0YSBvdXQqLwotI2RlZmluZSBBTVJOQl9ERUNPREVEX0ZSU1ogMzIwIC8qIEFNUi1OQiAyMG1zIDhLSHogbW9ubyBQQ00gc2l6ZSAqLwotI2RlZmluZSBQQ01fQlVGX01BWF9DT1VOVCA1CS8qIERTUCBvbmx5IGFjY2VwdHMgNSBidWZmZXJzIGF0IG1vc3QKLQkJCQkgICBidXQgc3VwcG9ydCAyIGJ1ZmZlcnMgY3VycmVudGx5ICovCi0jZGVmaW5lIFJPVVRJTkdfTU9ERV9GVFJUIDEKLSNkZWZpbmUgUk9VVElOR19NT0RFX1JUIDIKLS8qIERlY29kZXIgc3RhdHVzIHJlY2VpdmVkIGZyb20gQVVEUFBUQVNLICovCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX1NMRUVQCTAKLSNkZWZpbmUJIEFVRFBQX0RFQ19TVEFUVVNfSU5JVCAgMQotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19DRkcgICAyCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX1BMQVkgIDMKLQotI2RlZmluZSBBVURBTVJOQl9NRVRBRklFTERfTUFTSyAweEZGRkYwMDAwCi0jZGVmaW5lIEFVREFNUk5CX0VPU19GTEdfT0ZGU0VUIDB4MEEgLyogT2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIGJ1ZmZlciAqLwotI2RlZmluZSBBVURBTVJOQl9FT1NfRkxHX01BU0sgMHgwMQotI2RlZmluZSBBVURBTVJOQl9FT1NfTk9ORSAweDAgLyogTm8gRU9TIGRldGVjdGVkICovCi0jZGVmaW5lIEFVREFNUk5CX0VPU19TRVQgMHgxIC8qIEVPUyBzZXQgaW4gbWV0YSBmaWVsZCAqLwotCi0jZGVmaW5lIEFVREFNUk5CX0VWRU5UX05VTSAxMCAvKiBEZWZhdWx0IG51bWJlciBvZiBwcmUtYWxsb2NhdGVkIGV2ZW50IHBrdHMgKi8KLQotc3RydWN0IGJ1ZmZlciB7Ci0Jdm9pZCAqZGF0YTsKLQl1bnNpZ25lZCBzaXplOwotCXVuc2lnbmVkIHVzZWQ7CQkvKiBJbnB1dCB1c2FnZSBhY3R1YWwgRFNQIHByb2R1Y2VkIFBDTSBzaXplICAqLwotCXVuc2lnbmVkIGFkZHI7Ci0JdW5zaWduZWQgc2hvcnQgbWZpZWxkX3N6OyAvKm9ubHkgdXNlZnVsIGZvciBkYXRhIGhhcyBtZXRhIGZpZWxkICovCi19OwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0cnVjdCBhdWRhbXJuYl9zdXNwZW5kX2N0bCB7Ci0Jc3RydWN0IGVhcmx5X3N1c3BlbmQgbm9kZTsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvOwotfTsKLSNlbmRpZgotCi1zdHJ1Y3QgYXVkYW1ybmJfZXZlbnR7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCWludCBldmVudF90eXBlOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci19OwotCi1zdHJ1Y3QgYXVkaW8gewotCXN0cnVjdCBidWZmZXIgb3V0WzJdOwotCi0Jc3BpbmxvY2tfdCBkc3BfbG9jazsKLQotCXVpbnQ4X3Qgb3V0X2hlYWQ7Ci0JdWludDhfdCBvdXRfdGFpbDsKLQl1aW50OF90IG91dF9uZWVkZWQ7CS8qIG51bWJlciBvZiBidWZmZXJzIHRoZSBkc3AgaXMgd2FpdGluZyBmb3IgKi8KLQotCWF0b21pY190IG91dF9ieXRlczsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtdXRleCB3cml0ZV9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlX3dhaXQ7Ci0KLQkvKiBIb3N0IFBDTSBzZWN0aW9uICovCi0Jc3RydWN0IGJ1ZmZlciBpbltQQ01fQlVGX01BWF9DT1VOVF07Ci0Jc3RydWN0IG11dGV4IHJlYWRfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkX3dhaXQ7CS8qIFdhaXQgcXVldWUgZm9yIHJlYWQgKi8KLQljaGFyICpyZWFkX2RhdGE7CS8qIHBvaW50ZXIgdG8gcmVhZGVyIGJ1ZmZlciAqLwotCWludDMyX3QgcmVhZF9waHlzOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHJlYWRlciBidWZmZXIgKi8KLQl1aW50OF90IHJlYWRfbmV4dDsJLyogaW5kZXggdG8gaW5wdXQgYnVmZmVycyB0byBiZSByZWFkIG5leHQgKi8KLQl1aW50OF90IGZpbGxfbmV4dDsJLyogaW5kZXggdG8gYnVmZmVyIHRoYXQgRFNQIHNob3VsZCBiZSBmaWxsaW5nICovCi0JdWludDhfdCBwY21fYnVmX2NvdW50OwkvKiBudW1iZXIgb2YgcGNtIGJ1ZmZlciBhbGxvY2F0ZWQgKi8KLQkvKiAtLS0tIEVuZCBvZiBIb3N0IFBDTSBzZWN0aW9uICovCi0KLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICphdWRwbGF5OwotCi0Jc3RydWN0IGF1ZG1nciBhdWRtZ3I7Ci0KLQkvKiBkYXRhIGFsbG9jYXRlZCBmb3IgdmFyaW91cyBidWZmZXJzICovCi0JY2hhciAqZGF0YTsKLQlpbnQzMl90IHBoeXM7IC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygd3JpdGUgYnVmZmVyICovCi0Jdm9pZCAqbWFwX3ZfcmVhZDsKLQl2b2lkICptYXBfdl93cml0ZTsKLQotCi0JaW50IG1maWVsZDsgLyogbWV0YSBmaWVsZCBlbWJlZGRlZCBpbiBkYXRhICovCi0JaW50IHJmbHVzaDsgLyogUmVhZCAgZmx1c2ggKi8KLQlpbnQgd2ZsdXNoOyAvKiBXcml0ZSBmbHVzaCAqLwotCXVpbnQ4X3Qgb3BlbmVkOjE7Ci0JdWludDhfdCBlbmFibGVkOjE7Ci0JdWludDhfdCBydW5uaW5nOjE7Ci0JdWludDhfdCBzdG9wcGVkOjE7CS8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQl1aW50OF90IHBjbV9mZWVkYmFjazoxOwotCXVpbnQ4X3QgYnVmX3JlZnJlc2g6MTsKLQlpbnQgdGVvczsgLyogdmFsaWQgb25seSBpZiB0dW5uZWwgbW9kZSAmIG5vIGRhdGEgbGVmdCBmb3IgZGVjb2RlciAqLwotCWVudW0gbXNtX2F1ZF9kZWNvZGVyX3N0YXRlIGRlY19zdGF0ZTsJLyogUmVwcmVzZW50cyBkZWNvZGVyIHN0YXRlICovCi0JaW50IHJtdF9yZXNvdXJjZV9yZWxlYXNlZDsKLQotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIHF1ZXVlX2lkOwotCXVpbnQxNl90IGRlY19pZDsKLQl1aW50MzJfdCByZWFkX3B0cl9vZmZzZXQ7Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCXN0cnVjdCBhdWRhbXJuYl9zdXNwZW5kX2N0bCBzdXNwZW5kX2N0bDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotI2VuZGlmCi0KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9ldmVudF9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50X3F1ZXVlOwotCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3dhaXQ7Ci0Jc3BpbmxvY2tfdCBldmVudF9xdWV1ZV9sb2NrOwotCXN0cnVjdCBtdXRleCBnZXRfZXZlbnRfbG9jazsKLQlpbnQgZXZlbnRfYWJvcnQ7Ci0KLQlpbnQgZXFfZW5hYmxlOwotCWludCBlcV9uZWVkc19jb21taXQ7Ci0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyIGVxOwotCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUgdm9sX3BhbjsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBpb25faGFuZGxlICppbnB1dF9idWZmX2hhbmRsZTsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqb3V0cHV0X2J1ZmZfaGFuZGxlOwotfTsKLQotc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfYW1ybmIgewotICAgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19jb21tb24gICAgIGNvbW1vbjsKLSAgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9fY2ZnOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSA7Ci0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRhbXJuYl9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgbmVlZGVkKTsKLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX2NvbmZpZ19ob3N0cGNtKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkYW1ybmJfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRhbXJuYl9kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpOwotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdGF0aWMgdm9pZCBhdWRhbXJuYl9wb3N0X2V2ZW50KHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCB0eXBlLAotCQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkKTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IHJtdF9wdXRfcmVzb3VyY2Uoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkX2NvZGVjX2NvbmZpZ19jbWQgY21kOwotCXVuc2lnbmVkIHNob3J0IGNsaWVudF9pZHg7Ci0KLQljbWQuY21kX2lkID0gUk1fQ01EX0FVRF9DT0RFQ19DRkc7Ci0JY21kLmNsaWVudF9pZCA9IFJNX0FVRF9DTElFTlRfSUQ7Ci0JY21kLnRhc2tfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5lbmFibGUgPSBSTVRfRElTQUJMRTsKLQljbWQuZGVjX3R5cGUgPSBBVURERUNfREVDX0FNUk5COwotCWNsaWVudF9pZHggPSAoKGNtZC5jbGllbnRfaWQgPDwgOCkgfCBjbWQudGFza19pZCk7Ci0KLQlyZXR1cm4gcHV0X2Fkc3BfcmVzb3VyY2UoY2xpZW50X2lkeCwgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IHJtdF9nZXRfcmVzb3VyY2Uoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkX2NvZGVjX2NvbmZpZ19jbWQgY21kOwotCXVuc2lnbmVkIHNob3J0IGNsaWVudF9pZHg7Ci0KLQljbWQuY21kX2lkID0gUk1fQ01EX0FVRF9DT0RFQ19DRkc7Ci0JY21kLmNsaWVudF9pZCA9IFJNX0FVRF9DTElFTlRfSUQ7Ci0JY21kLnRhc2tfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5lbmFibGUgPSBSTVRfRU5BQkxFOwotCWNtZC5kZWNfdHlwZSA9IEFVRERFQ19ERUNfQU1STkI7Ci0JY2xpZW50X2lkeCA9ICgoY21kLmNsaWVudF9pZCA8PCA4KSB8IGNtZC50YXNrX2lkKTsKLQotCXJldHVybiBnZXRfYWRzcF9yZXNvdXJjZShjbGllbnRfaWR4LCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRhbXJuYl9lbmFibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkbWdyX2NvbmZpZyBjZmc7Ci0JaW50IHJjOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JaWYgKGF1ZGlvLT5ybXRfcmVzb3VyY2VfcmVsZWFzZWQgPT0gMSkgewotCQlhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID0gMDsKLQkJcmMgPSBybXRfZ2V0X3Jlc291cmNlKGF1ZGlvKTsKLQkJaWYgKHJjKSB7Ci0JCQlNTV9FUlIoIkFEU1AgcmVzb3VyY2VzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBBTVJOQiBcCi0JCQkJc2Vzc2lvbiAweCUwOHggb24gZGVjb2RlcjogJWRcbiBJZ25vcmluZyBcCi0JCQkJZXJyb3IgYW5kIGdvaW5nIGFoZWFkIHdpdGggdGhlIHBsYXliYWNrXG4iLAotCQkJCShpbnQpYXVkaW8sIGF1ZGlvLT5kZWNfaWQpOwotCQl9Ci0JfQotCi0JYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCWF1ZGlvLT5vdXRfdGFpbCA9IDA7Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCi0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spIHsKLQkJY2ZnLnR4X3JhdGUgPSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV9OT05FOwotCQljZmcucnhfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzQ4MDAwOwotCQljZmcuZGVmX21ldGhvZCA9IFJQQ19BVURfREVGX01FVEhPRF9QTEFZQkFDSzsKLQkJY2ZnLmNvZGVjID0gUlBDX0FVRF9ERUZfQ09ERUNfQU1SX05COwotCQljZmcuc25kX21ldGhvZCA9IFJQQ19TTkRfTUVUSE9EX01JREk7Ci0KLQkJcmMgPSBhdWRtZ3JfZW5hYmxlKCZhdWRpby0+YXVkbWdyLCAmY2ZnKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJbXNtX2Fkc3BfZHVtcChhdWRpby0+YXVkcGxheSk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0KLQlpZiAobXNtX2Fkc3BfZW5hYmxlKGF1ZGlvLT5hdWRwbGF5KSkgewotCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRwbGF5KSBmYWlsZWRcbiIpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykKLQkJCWF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKGF1ZHBwX2VuYWJsZShhdWRpby0+ZGVjX2lkLCBhdWRhbXJuYl9kc3BfZXZlbnQsIGF1ZGlvKSkgewotCQlNTV9FUlIoImF1ZHBwX2VuYWJsZSgpIGZhaWxlZFxuIik7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykKLQkJCWF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWF1ZGlvLT5lbmFibGVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGFtcm5iX2Rpc2FibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JaWYgKGF1ZGlvLT5lbmFibGVkKSB7Ci0JCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCQlhdWRkZWNfZHNwX2NvbmZpZyhhdWRpbywgMCk7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXQsCi0JCQkJYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORSwKLQkJCQltc2Vjc190b19qaWZmaWVzKE1TTV9BVURfREVDT0RFUl9XQUlUX01TKSk7Ci0JCWlmIChyYyA9PSAwKQotCQkJcmMgPSAtRVRJTUVET1VUOwotCQllbHNlIGlmIChhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlhdWRwcF9kaXNhYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spIHsKLQkJCXJjID0gYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQltc21fYWRzcF9kdW1wKGF1ZGlvLT5hdWRwbGF5KTsKLQkJfQotCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCXJtdF9wdXRfcmVzb3VyY2UoYXVkaW8pOwotCQlhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID0gMTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX3VwZGF0ZV9wY21fYnVmX2VudHJ5KHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCXVpbnQzMl90ICpwYXlsb2FkKQotewotCXVpbnQ4X3QgaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChhdWRpby0+cmZsdXNoKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGF5bG9hZFsxXTsgaW5kZXgrKykgewotCQlpZiAoYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHIgPT0KLQkJICAgIHBheWxvYWRbMiArIGluZGV4ICogMl0pIHsKLQkJCU1NX0RCRygiaW5bJWRdIHJlYWR5XG4iLCBhdWRpby0+ZmlsbF9uZXh0KTsKLQkJCWF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS51c2VkID0KLQkJCSAgICBwYXlsb2FkWzMgKyBpbmRleCAqIDJdOwotCQkJaWYgKCgrK2F1ZGlvLT5maWxsX25leHQpID09IGF1ZGlvLT5wY21fYnVmX2NvdW50KQotCQkJCWF1ZGlvLT5maWxsX25leHQgPSAwOwotCi0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoImV4cGVjdGVkPSV4IHJldD0leFxuIiwKLQkJCQlhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uYWRkciwKLQkJCQlwYXlsb2FkWzEgKyBpbmRleCAqIDJdKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0udXNlZCA9PSAwKSB7Ci0JCWF1ZGFtcm5iX2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQl9IGVsc2UgewotCQlNTV9EQkcoInJlYWQgY2Fubm90IGtlZXAgdXBcbiIpOwotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAxOwotCX0KLQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGxheV9kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgICB2b2lkICgqZ2V0ZXZlbnQpICh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBkYXRhOwotCXVpbnQzMl90IG1zZ1syOF07Ci0JZ2V0ZXZlbnQobXNnLCBzaXplb2YobXNnKSk7Ci0KLQlNTV9EQkcoIm1zZ19pZD0leFxuIiwgaWQpOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUExBWV9NU0dfREVDX05FRURTX0RBVEE6Ci0JCWF1ZGFtcm5iX3NlbmRfZGF0YShhdWRpbywgMSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURQTEFZX01TR19CVUZGRVJfVVBEQVRFOgotCQlhdWRhbXJuYl91cGRhdGVfcGNtX2J1Zl9lbnRyeShhdWRpbywgbXNnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFEU1BfTUVTU0FHRV9JRDoKLQkJTU1fREJHKCJSZWNlaXZlZCBBRFNQIGV2ZW50OiBtb2R1bGUgZW5hYmxlKGF1ZHBsYXl0YXNrKVxuIik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJTU1fRVJSKCJ1bmV4cGVjdGVkIG1lc3NhZ2UgZnJvbSBkZWNvZGVyXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX2RzcF9ldmVudCh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gcHJpdmF0ZTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBQX01TR19TVEFUVVNfTVNHOnsKLQkJCXVuc2lnbmVkIHN0YXR1cyA9IG1zZ1sxXTsKLQotCQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19TTEVFUDogewotCQkJCXVpbnQxNl90IHJlYXNvbiA9IG1zZ1syXTsKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOnNsZWVwIHJlYXNvbiA9IFwKLQkJCQkJCTB4JTA0eFxuIiwgcmVhc29uKTsKLQkJCQlpZiAoKHJlYXNvbiA9PSBBVURQUF9NU0dfUkVBU09OX01FTSkKLQkJCQkJfHwgKHJlYXNvbiA9PQotCQkJCQlBVURQUF9NU0dfUkVBU09OX05PREVDT0RFUikpIHsKLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfRkFJTFVSRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0gZWxzZSBpZiAocmVhc29uID09IEFVRFBQX01TR19SRUFTT05fTk9ORSkgewotCQkJCQkvKiBkZWNvZGVyIGlzIGluIGRpc2FibGUgc3RhdGUgKi8KLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfQ0xPU0U7Ci0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfSU5JVDoKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBpbml0IFxuIik7Ci0JCQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCQkJCWF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKGF1ZGlvKTsKLQkJCQllbHNlCi0JCQkJCWF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoYXVkaW8pOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfQ0ZHOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IGNmZyBcbiIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX1BMQVk6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogcGxheSBcbiIpOwotCQkJCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCQkJCWF1ZGFtcm5iX2NvbmZpZ19ob3N0cGNtKGF1ZGlvKTsKLQkJCQkJYXVkYW1ybmJfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCQkJCX0KLQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1M7Ci0JCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlNTV9FUlIoInVua25vd24gZGVjb2RlciBzdGF0dXMgXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURQUF9NU0dfQ0ZHX01TRzoKLQkJaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0VOQSkgewotCQkJTU1fREJHKCJDRkdfTVNHIEVOQUJMRVxuIik7Ci0JCQlhdWRkZWNfZHNwX2NvbmZpZyhhdWRpbywgMSk7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCQlhdWRpby0+cnVubmluZyA9IDE7Ci0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuKTsKLQkJCWF1ZHBwX2RzcF9zZXRfZXEoYXVkaW8tPmRlY19pZCwJYXVkaW8tPmVxX2VuYWJsZSwKLQkJCQkJCQkJJmF1ZGlvLT5lcSk7Ci0JCQlhdWRwcF9hdnN5bmMoYXVkaW8tPmRlY19pZCwgMjIwNTApOwotCQl9IGVsc2UgaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0RJUykgewotCQkJTU1fREJHKCJDRkdfTVNHIERJU0FCTEVcbiIpOwotCQkJYXVkcHBfYXZzeW5jKGF1ZGlvLT5kZWNfaWQsIDApOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAwOwotCQl9IGVsc2UgewotCQkJTU1fREJHKCJDRkdfTVNHICVkP1xuIiwgbXNnWzBdKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRFBQX01TR19ST1VUSU5HX0FDSzoKLQkJTU1fREJHKCJST1VUSU5HX0FDSyBtb2RlPSVkXG4iLCBtc2dbMV0pOwotCQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfRkxVU0hfQUNLOgotCQlNTV9EQkcoIkZMVVNIX0FDS1xuIik7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJCWF1ZGFtcm5iX2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfUENNRE1BTUlTU0VEOgotCQlNTV9EQkcoIlBDTURNQU1JU1NFRFxuIik7Ci0JCWF1ZGlvLT50ZW9zID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlNTV9FUlIoIlVOS05PV04gKCVkKVxuIiwgaWQpOwotCX0KLQotfQotCi1zdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHBsYXlfYWRzcF9vcHNfYW1ybmIgPSB7Ci0JLmV2ZW50ID0gYXVkcGxheV9kc3BfZXZlbnQsCi19OwotCi0jZGVmaW5lIGF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHBsYXksIGF1ZGlvLT5xdWV1ZV9pZCwgXAotCQkJY21kLCBsZW4pCi0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQl1MTYgY2ZnX2RlY19jbWRbQVVEUFBfQ01EX0NGR19ERUNfVFlQRV9MRU4gLyBzaXplb2YodW5zaWduZWQgc2hvcnQpXTsKLQotCW1lbXNldChjZmdfZGVjX2NtZCwgMCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci0JY2ZnX2RlY19jbWRbMF0gPSBBVURQUF9DTURfQ0ZHX0RFQ19UWVBFOwotCWlmIChlbmFibGUpCi0JCWNmZ19kZWNfY21kWzEgKyBhdWRpby0+ZGVjX2lkXSA9IEFVRFBQX0NNRF9VUERBVERFX0NGR19ERUMgfAotCQkJQVVEUFBfQ01EX0VOQV9ERUNfViB8IEFVRERFQ19ERUNfQU1STkI7Ci0JZWxzZQotCQljZmdfZGVjX2NtZFsxICsgYXVkaW8tPmRlY19pZF0gPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCUFVRFBQX0NNRF9ESVNfREVDX1Y7Ci0KLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTEoJmNmZ19kZWNfY21kLCBzaXplb2YoY2ZnX2RlY19jbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX2Ftcm5iIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNvbW1vbi5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TOwotCWNtZC5jb21tb24ubGVuZ3RoID0gQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNU19WMTNLX0xFTjsKLQljbWQuY29tbW9uLmRlY19pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmNvbW1vbi5pbnB1dF9zYW1wbGluZ19mcmVxdWVuY3kgPSA4MDAwOwotCWNtZC5zdGVyZW9fY2ZnID0gQVVEUFBfQ01EX1BDTV9JTlRGX01PTk9fVjsKLQotCWF1ZHBwX3NlbmRfcXVldWUyKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX3JvdXRpbmdfbW9kZSBjbWQ7Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURQUF9DTURfUk9VVElOR19NT0RFOwotCWNtZC5vYmplY3RfbnVtYmVyID0gYXVkaW8tPmRlY19pZDsKLQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJY21kLnJvdXRpbmdfbW9kZSA9IFJPVVRJTkdfTU9ERV9GVFJUOwotCWVsc2UKLQkJY21kLnJvdXRpbmdfbW9kZSA9IFJPVVRJTkdfTU9ERV9SVDsKLQotCWF1ZHBwX3NlbmRfcXVldWUxKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJCQkgICAgICAgdW5zaWduZWQgaWR4LCB1bnNpZ25lZCBsZW4pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2JpdHN0cmVhbV9kYXRhX2F2YWlsX250MiBjbWQ7Ci0KLQljbWQuY21kX2lkID0gQVVEUExBWV9DTURfQklUU1RSRUFNX0RBVEFfQVZBSUxfTlQyOwotCWlmIChhdWRpby0+bWZpZWxkKQotCQljbWQuZGVjb2Rlcl9pZCA9IEFVREFNUk5CX01FVEFGSUVMRF9NQVNLIHwKLQkJCShhdWRpby0+b3V0W2lkeF0ubWZpZWxkX3N6ID4+IDEpOwotCWVsc2UKLQkJY21kLmRlY29kZXJfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5idWZfcHRyID0gYXVkaW8tPm91dFtpZHhdLmFkZHI7Ci0JY21kLmJ1Zl9zaXplID0gbGVuIC8gMjsKLQljbWQucGFydGl0aW9uX251bWJlciA9IDA7Ci0JLyogY29tcGxldGUgd3JpdGVzIHRvIHRoZSBpbnB1dCBidWZmZXIgKi8KLQl3bWIoKTsKLQlyZXR1cm4gYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhbXJuYl9idWZmZXJfcmVmcmVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwbGF5X2NtZF9idWZmZXJfcmVmcmVzaCByZWZyZXNoX2NtZDsKLQotCXJlZnJlc2hfY21kLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0JVRkZFUl9SRUZSRVNIOwotCXJlZnJlc2hfY21kLm51bV9idWZmZXJzID0gMTsKLQlyZWZyZXNoX2NtZC5idWYwX2FkZHJlc3MgPSBhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uYWRkcjsKLQlyZWZyZXNoX2NtZC5idWYwX2xlbmd0aCA9IGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5zaXplIC0KLQkgIChhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uc2l6ZSAlIEFNUk5CX0RFQ09ERURfRlJTWikgKwotCSAgKGF1ZGlvLT5tZmllbGQgPyAyNCA6IDApOwotCXJlZnJlc2hfY21kLmJ1Zl9yZWFkX2NvdW50ID0gMDsKLQlNTV9EQkcoImJ1ZjBfYWRkcj0leCBidWYwX2xlbj0lZFxuIiwgcmVmcmVzaF9jbWQuYnVmMF9hZGRyZXNzLAotCQkJcmVmcmVzaF9jbWQuYnVmMF9sZW5ndGgpOwotCSh2b2lkKWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZyZWZyZXNoX2NtZCwgc2l6ZW9mKHJlZnJlc2hfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX2NvbmZpZ19ob3N0cGNtKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2hwY21fYnVmX2NmZyBjZmdfY21kOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQljZmdfY21kLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0hQQ01fQlVGX0NGRzsKLQljZmdfY21kLm1heF9idWZmZXJzID0gYXVkaW8tPnBjbV9idWZfY291bnQ7Ci0JY2ZnX2NtZC5ieXRlX3N3YXAgPSAwOwotCWNmZ19jbWQuaG9zdHBjbV9jb25maWcgPSAoMHg4MDAwKSB8ICgweDQwMDApOwotCWNmZ19jbWQuZmVlZGJhY2tfZnJlcXVlbmN5ID0gMTsKLQljZmdfY21kLnBhcnRpdGlvbl9udW1iZXIgPSAwOwotCSh2b2lkKWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZjZmdfY21kLCBzaXplb2YoY2ZnX2NtZCkpOwotCi19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWF1ZGlvLT5ydW5uaW5nKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAobmVlZGVkICYmICFhdWRpby0+d2ZsdXNoKSB7Ci0JCS8qIFdlIHdlcmUgY2FsbGVkIGZyb20gdGhlIGNhbGxiYWNrIGJlY2F1c2UgdGhlIERTUAotCQkgKiByZXF1ZXN0ZWQgbW9yZSBkYXRhLiAgTm90ZSB0aGF0IHRoZSBEU1AgZG9lcyB3YW50Ci0JCSAqIG1vcmUgZGF0YSwgYW5kIGlmIGEgYnVmZmVyIHdhcyBpbi1mbGlnaHQsIG1hcmsgaXQKLQkJICogYXMgYXZhaWxhYmxlIChzaW5jZSB0aGUgRFNQIG11c3Qgbm93IGJlIGRvbmUgd2l0aAotCQkgKiBpdCkuCi0JCSAqLwotCQlhdWRpby0+b3V0X25lZWRlZCA9IDE7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpIHsKLQkJCWZyYW1lLT51c2VkID0gMDsKLQkJCWF1ZGlvLT5vdXRfdGFpbCBePSAxOwotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl9Ci0JfQotCi0JaWYgKGF1ZGlvLT5vdXRfbmVlZGVkKSB7Ci0JCS8qIElmIHRoZSBEU1AgY3VycmVudGx5IHdhbnRzIGRhdGEgYW5kIHdlIGhhdmUgYQotCQkgKiBidWZmZXIgYXZhaWxhYmxlLCB3ZSB3aWxsIHNlbmQgaXQgYW5kIHJlc2V0Ci0JCSAqIHRoZSBuZWVkZWQgZmxhZy4gIFdlJ2xsIG1hcmsgdGhlIGJ1ZmZlciBhcyBpbi1mbGlnaHQKLQkJICogc28gdGhhdCBpdCB3b24ndCBiZSByZWN5Y2xlZCB1bnRpbCB0aGUgbmV4dCBidWZmZXIKLQkJICogaXMgcmVxdWVzdGVkCi0JCSAqLwotCi0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkKSB7Ci0JCQlCVUdfT04oZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZik7Ci0JCQlNTV9EQkcoImZyYW1lICVkIGJ1c3lcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JCQlhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoYXVkaW8sIGF1ZGlvLT5vdXRfdGFpbCwKLQkJCQkJCSAgICBmcmFtZS0+dXNlZCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDB4ZmZmZmZmZmY7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCX0KLQl9Ci0gZG9uZToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkZXZpY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX2ZsdXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdWRpby0+b3V0WzBdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRbMV0udXNlZCA9IDA7Ci0JYXVkaW8tPm91dF9oZWFkID0gMDsKLQlhdWRpby0+b3V0X3RhaWwgPSAwOwotCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdG9taWNfc2V0KCZhdWRpby0+b3V0X2J5dGVzLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkYW1ybmJfZmx1c2hfcGNtX2J1ZihzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVpbnQ4X3QgaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBQQ01fQlVGX01BWF9DT1VOVDsgaW5kZXgrKykKLQkJYXVkaW8tPmluW2luZGV4XS51c2VkID0gMDsKLQotCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDA7Ci0JYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX2lvcG9ydF9yZXNldChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCS8qIE1ha2Ugc3VyZSByZWFkL3dyaXRlIHRocmVhZCBhcmUgZnJlZSBmcm9tCi0JICogc2xlZXAgYW5kIGtub3dpbmcgdGhhdCBzeXN0ZW0gaXMgbm90IGFibGUKLQkgKiB0byBwcm9jZXNzIGlvIHJlcXVlc3QgYXQgdGhlIG1vbWVudAotCSAqLwotCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JYXVkYW1ybmJfZmx1c2goYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCWF1ZGFtcm5iX2ZsdXNoX3BjbV9idWYoYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkYW1ybmJfZXZlbnRzX3BlbmRpbmcoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlbXB0eTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWVtcHR5ID0gIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gZW1wdHkgfHwgYXVkaW8tPmV2ZW50X2Fib3J0OwotfQotCi1zdGF0aWMgdm9pZCBhdWRhbXJuYl9yZXNldF9ldmVudF9xdWV1ZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGF1ZGFtcm5iX2V2ZW50ICpkcnZfZXZ0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZGFtcm5iX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkYW1ybmJfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgbG9uZyBhdWRhbXJuYl9wcm9jZXNzX2V2ZW50X3JlcShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB2b2lkIF9fdXNlciAqYXJnKQotewotCWxvbmcgcmM7Ci0Jc3RydWN0IG1zbV9hdWRpb19ldmVudCB1c3JfZXZ0OwotCXN0cnVjdCBhdWRhbXJuYl9ldmVudCAqZHJ2X2V2dCA9IE5VTEw7Ci0JaW50IHRpbWVvdXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmdXNyX2V2dCwgYXJnLCBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19ldmVudCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXRpbWVvdXQgPSAoaW50KSB1c3JfZXZ0LnRpbWVvdXRfbXM7Ci0KLQlpZiAodGltZW91dCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCgKLQkJCWF1ZGlvLT5ldmVudF93YWl0LCBhdWRhbXJuYl9ldmVudHNfcGVuZGluZyhhdWRpbyksCi0JCQltc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9IGVsc2UgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCWF1ZGlvLT5ldmVudF93YWl0LCBhdWRhbXJuYl9ldmVudHNfcGVuZGluZyhhdWRpbykpOwotCX0KLQotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCWlmIChhdWRpby0+ZXZlbnRfYWJvcnQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMDsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcmMgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+ZXZlbnRfcXVldWUpKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZGFtcm5iX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCX0KLQotCWlmIChkcnZfZXZ0KSB7Ci0JCXVzcl9ldnQuZXZlbnRfdHlwZSA9IGRydl9ldnQtPmV2ZW50X3R5cGU7Ci0JCXVzcl9ldnQuZXZlbnRfcGF5bG9hZCA9IGRydl9ldnQtPnBheWxvYWQ7Ci0JCWxpc3RfYWRkX3RhaWwoJmRydl9ldnQtPmxpc3QsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JfSBlbHNlCi0JCXJjID0gLTE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghcmMgJiYgY29weV90b191c2VyKGFyZywgJnVzcl9ldnQsIHNpemVvZih1c3JfZXZ0KSkpCi0JCXJjID0gLUVGQVVMVDsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19lbmFibGVfZXEoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlpZiAoYXVkaW8tPmVxX2VuYWJsZSA9PSBlbmFibGUgJiYgIWF1ZGlvLT5lcV9uZWVkc19jb21taXQpCi0JCXJldHVybiAwOwotCi0JYXVkaW8tPmVxX2VuYWJsZSA9IGVuYWJsZTsKLQotCWlmIChhdWRpby0+cnVubmluZykgewotCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsIGVuYWJsZSwgJmF1ZGlvLT5lcSk7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgYXVkYW1ybmJfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQl1aW50MTZfdCBlbmFibGVfbWFzazsKLQlpbnQgZW5hYmxlOwotCWludCBwcmV2X3N0YXRlOwotCXVuc2lnbmVkIGxvbmcgaW9uZmxhZyA9IDA7Ci0JaW9uX3BoeXNfYWRkcl90IGFkZHIgPSAwOwotCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUgPSBOVUxMOwotCWludCBsZW4gPSAwOwotCi0JTU1fREJHKCJjbWQgPSAlZFxuIiwgY21kKTsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX1NUQVRTKSB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCXN0YXRzLmJ5dGVfY291bnQgPSBhdWRwcF9hdnN5bmNfYnl0ZV9jb3VudChhdWRpby0+ZGVjX2lkKTsKLQkJc3RhdHMuc2FtcGxlX2NvdW50ID0gYXVkcHBfYXZzeW5jX3NhbXBsZV9jb3VudChhdWRpby0+ZGVjX2lkKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fRU5BQkxFX0FVRFBQOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmVuYWJsZV9tYXNrLCAodm9pZCAqKSBhcmcsCi0JCQkJCQlzaXplb2YoZW5hYmxlX21hc2spKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWVuYWJsZSA9IChlbmFibGVfbWFzayAmIEVRX0VOQUJMRSkgPyAxIDogMDsKLQkJYXVkaW9fZW5hYmxlX2VxKGF1ZGlvLCBlbmFibGUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9WT0xVTUU6Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gYXJnOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX1NFVF9QQU46Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPnZvbF9wYW4ucGFuID0gYXJnOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX1NFVF9FUToKLQkJcHJldl9zdGF0ZSA9IGF1ZGlvLT5lcV9lbmFibGU7Ci0JCWF1ZGlvLT5lcV9lbmFibGUgPSAwOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmF1ZGlvLT5lcS5udW1fYmFuZHMsICh2b2lkICopIGFyZywKLQkJCQlzaXplb2YoYXVkaW8tPmVxKSAtCi0JCQkJKEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNU19DT01NT05fTEVOICsgMikpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlhdWRpby0+ZXFfZW5hYmxlID0gcHJldl9zdGF0ZTsKLQkJYXVkaW8tPmVxX25lZWRzX2NvbW1pdCA9IDE7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKC1FSU5WQUwgIT0gcmMpCi0JCXJldHVybiByYzsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX0VWRU5UKSB7Ci0JCU1NX0RCRygiQVVESU9fR0VUX0VWRU5UXG4iKTsKLQkJaWYgKG11dGV4X3RyeWxvY2soJmF1ZGlvLT5nZXRfZXZlbnRfbG9jaykpIHsKLQkJCXJjID0gYXVkYW1ybmJfcHJvY2Vzc19ldmVudF9yZXEoYXVkaW8sCi0JCQkJCSh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCQl9IGVsc2UKLQkJCXJjID0gLUVCVVNZOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKGNtZCA9PSBBVURJT19BQk9SVF9HRVRfRVZFTlQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCQlNTV9EQkcoIkFVRElPX1NUQVJUXG4iKTsKLQkJcmMgPSBhdWRhbXJuYl9lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUsCi0JCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0RFQ09ERVJfV0FJVF9NUykpOwotCQkJTU1fSU5GTygiZGVjX3N0YXRlICVkIHJjID0gJWRcbiIsIGF1ZGlvLT5kZWNfc3RhdGUsIHJjKTsKLQotCQkJaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1MpCi0JCQkJcmMgPSAtRU5PREVWOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NUT1A6Ci0JCU1NX0RCRygiQVVESU9fU1RPUFxuIik7Ci0JCXJjID0gYXVkYW1ybmJfZGlzYWJsZShhdWRpbyk7Ci0JCWF1ZGFtcm5iX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19GTFVTSDoKLQkJTU1fREJHKCJBVURJT19GTFVTSFxuIik7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAxOwotCQlhdWRpby0+d2ZsdXNoID0gMTsKLQkJYXVkYW1ybmJfaW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCQlhdWRwcF9mbHVzaChhdWRpby0+ZGVjX2lkKTsKLQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCSFhdWRpby0+d2ZsdXNoKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlNTV9FUlIoIkFVRElPX0ZMVVNIIGludGVycnVwdGVkXG4iKTsKLQkJCQlyYyA9IC1FSU5UUjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcgotCQkJICAgICgmY29uZmlnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYXVkaW8tPm1maWVsZCA9IGNvbmZpZy5tZXRhX2ZpZWxkOwotCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gQlVGU1o7Ci0JCQljb25maWcuYnVmZmVyX2NvdW50ID0gMjsKLQkJCWNvbmZpZy5zYW1wbGVfcmF0ZSA9IDgwMDA7Ci0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JCQljb25maWcubWV0YV9maWVsZCA9IDA7Ci0JCQljb25maWcudW51c2VkWzBdID0gMDsKLQkJCWNvbmZpZy51bnVzZWRbMV0gPSAwOwotCQkJY29uZmlnLnVudXNlZFsyXSA9IDA7Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY29uZmlnLAotCQkJCQkgc2l6ZW9mKGNvbmZpZykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0KLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19HRVRfUENNX0NPTkZJRzp7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX3BjbV9jb25maWcgY29uZmlnOwotCQkJY29uZmlnLnBjbV9mZWVkYmFjayA9IGF1ZGlvLT5wY21fZmVlZGJhY2s7Ci0JCQljb25maWcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9NQVhfQ09VTlQ7Ci0JCQljb25maWcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNvbmZpZywKLQkJCQkJIHNpemVvZihjb25maWcpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX1NFVF9QQ01fQ09ORklHOnsKLQkJc3RydWN0IG1zbV9hdWRpb19wY21fY29uZmlnIGNvbmZpZzsKLQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCSAgICAoJmNvbmZpZywgKHZvaWQgKilhcmcsIHNpemVvZihjb25maWcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvbmZpZy5wY21fZmVlZGJhY2sgIT0gYXVkaW8tPnBjbV9mZWVkYmFjaykgewotCQkJTU1fRVJSKCJOb3Qgc3VmZmljaWVudCBwZXJtaXNzaW9uIHRvIgotCQkJCSAiY2hhbmdlIHRoZSBwbGF5YmFjayBtb2RlXG4iKTsKLQkJCXJjID0gLUVBQ0NFUzsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICgoY29uZmlnLmJ1ZmZlcl9jb3VudCA+IFBDTV9CVUZfTUFYX0NPVU5UKSB8fAotCQkgICAgKGNvbmZpZy5idWZmZXJfY291bnQgPT0gMSkpCi0JCQljb25maWcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9NQVhfQ09VTlQ7Ci0KLQkJaWYgKGNvbmZpZy5idWZmZXJfc2l6ZSA8IFBDTV9CVUZTWl9NSU4pCi0JCQljb25maWcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCi0JCQkvKiBDaGVjayBpZiBwY20gZmVlZGJhY2sgaXMgcmVxdWlyZWQgKi8KLQkJaWYgKChjb25maWcucGNtX2ZlZWRiYWNrKSAmJiAoIWF1ZGlvLT5yZWFkX2RhdGEpKSB7Ci0JCQlNTV9EQkcoImFsbG9jYXRlIFBDTSBidWYgJWRcbiIsCi0JCQkJCWNvbmZpZy5idWZmZXJfY291bnQgKgotCQkJCQljb25maWcuYnVmZmVyX3NpemUpOwotCQkJCWhhbmRsZSA9IGlvbl9hbGxvYyhhdWRpby0+Y2xpZW50LAotCQkJCQkoY29uZmlnLmJ1ZmZlcl9zaXplICoKLQkJCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCksCi0JCQkJCVNaXzRLLCBJT05fSEVBUChJT05fQVVESU9fSEVBUF9JRCksIDApOwotCQkJCWlmIChJU19FUlJfT1JfTlVMTChoYW5kbGUpKSB7Ci0JCQkJCU1NX0VSUigiVW5hYmxlIHRvIGFsbG9jIEkvUCBidWZmc1xuIik7Ci0JCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlID0gaGFuZGxlOwotCi0JCQkJcmMgPSBpb25fcGh5cyhhdWRpby0+Y2xpZW50ICwKLQkJCQkJaGFuZGxlLCAmYWRkciwgJmxlbik7Ci0JCQkJaWYgKHJjKSB7Ci0JCQkJCU1NX0VSUigiSW52YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsCi0JCQkJCQkodW5zaWduZWQgaW50KSBsZW4pOwotCQkJCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBoYW5kbGUpOwotCQkJCQlhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgPSBOVUxMOwotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU1NX0lORk8oIkdvdCB2YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCQkJCSh1bnNpZ25lZCBpbnQpIGF1ZGlvLT5yZWFkX3BoeXMsCi0JCQkJCQkodW5zaWduZWQgaW50KSBsZW4pOwotCQkJCX0KLQkJCQlhdWRpby0+cmVhZF9waHlzID0gKGludDMyX3QpYWRkcjsKLQotCQkJCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MoYXVkaW8tPmNsaWVudCwKLQkJCQkJaGFuZGxlLCAmaW9uZmxhZyk7Ci0JCQkJaWYgKHJjKSB7Ci0JCQkJCU1NX0VSUigiY291bGQgbm90IGdldCBmbGFnc1xuIik7Ci0JCQkJCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci0JCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWF1ZGlvLT5tYXBfdl9yZWFkID0gaW9uX21hcF9rZXJuZWwoCi0JCQkJCWF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci0JCQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl9yZWFkKSkgewotCQkJCU1NX0VSUigiZmFpbGVkIHRvIG1hcCByZWFkIGJ1ZlxuIik7Ci0JCQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgaGFuZGxlKTsKLQkJCQlhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgPSBOVUxMOwotCQkJCXJjID0gLUVOT01FTTsKLQkJCX0gZWxzZSB7Ci0JCQkJdWludDhfdCBpbmRleDsKLQkJCQl1aW50MzJfdCBvZmZzZXQgPSAwOwotCQkJCWF1ZGlvLT5yZWFkX2RhdGEgPQotCQkJCQkJYXVkaW8tPm1hcF92X3JlYWQ7Ci0JCQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQkJCQlhdWRpby0+cGNtX2J1Zl9jb3VudCA9Ci0JCQkJCWNvbmZpZy5idWZmZXJfY291bnQ7Ci0JCQkJYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JCQkJYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0KLQkJCQlmb3IgKGluZGV4ID0gMDsKLQkJCQlpbmRleCA8IGNvbmZpZy5idWZmZXJfY291bnQ7IGluZGV4KyspIHsKLQkJCQkJYXVkaW8tPmluW2luZGV4XS5kYXRhID0KLQkJCQkJCWF1ZGlvLT5yZWFkX2RhdGEgKyBvZmZzZXQ7Ci0JCQkJCWF1ZGlvLT5pbltpbmRleF0uYWRkciA9Ci0JCQkJCSAgICBhdWRpby0+cmVhZF9waHlzICsgb2Zmc2V0OwotCQkJCQlhdWRpby0+aW5baW5kZXhdLnNpemUgPQotCQkJCQkgICAgY29uZmlnLmJ1ZmZlcl9zaXplOwotCQkJCQlhdWRpby0+aW5baW5kZXhdLnVzZWQgPSAwOwotCQkJCQlvZmZzZXQgKz0gY29uZmlnLmJ1ZmZlcl9zaXplOwotCQkJCX0KLQkJCQlNTV9EQkcoInJlYWQgYnVmOiBwaHkgYWRkciAweCUwOHgga2VybmVsIFwKLQkJCQkJYWRkciAweCUwOHhcbiIsIGF1ZGlvLT5yZWFkX3BoeXMsCi0JCQkJCShpbnQpYXVkaW8tPnJlYWRfZGF0YSk7Ci0JCQkJcmMgPSAwOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmMgPSAwOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotLyogT25seSB1c2VmdWwgaW4gdHVubmVsLW1vZGUgKi8KLXN0YXRpYyBpbnQgYXVkYW1ybmJfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBhLCBsb2ZmX3QgYiwgaW50IGRhdGFzeW5jKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQlpZiAoIWF1ZGlvLT5ydW5uaW5nIHx8IGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmVfbm9sb2NrOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoIWF1ZGlvLT5vdXRbMF0udXNlZCAmJgotCQkhYXVkaW8tPm91dFsxXS51c2VkICYmCi0JCWF1ZGlvLT5vdXRfbmVlZGVkKSB8fCBhdWRpby0+d2ZsdXNoKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQllbHNlIGlmIChhdWRpby0+d2ZsdXNoKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogcGNtIGRtYW1pc3MgbWVzc2FnZSBpcyBzZW50IGNvbnRpbm91c2x5Ci0JICogd2hlbiBkZWNvZGVyIGlzIHN0YXJ2ZWQgc28gbm8gcmFjZQotCSAqIGNvbmRpdGlvbiBjb25jZXJuCi0JICovCi0JYXVkaW8tPnRlb3MgPSAwOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCWF1ZGlvLT50ZW9zIHx8IGF1ZGlvLT53Zmx1c2gpOwotCi0JaWYgKGF1ZGlvLT53Zmx1c2gpCi0JCXJjID0gLUVCVVNZOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotZG9uZV9ub2xvY2s6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRhbXJuYl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCi0JCQkgIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCWludCByYyA9IDA7Ci0KLQlpZiAoIWF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCXJldHVybiAwOyAvKiBQQ00gZmVlZGJhY2sgaXMgbm90IGVuYWJsZWQuIE5vdGhpbmcgdG8gcmVhZCAqLwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JTU1fREJHKCIlZCBcbiIsCWNvdW50KTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT5yZWFkX3dhaXQsCi0JCQkoYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQgPiAwKSB8fAotCQkJKGF1ZGlvLT5zdG9wcGVkKSB8fCAoYXVkaW8tPnJmbHVzaCkpOwotCi0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPnJmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChjb3VudCA8IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkKSB7Ci0JCQkvKiBSZWFkIG11c3QgaGFwcGVuIGluIGZyYW1lIGJvdW5kYXJ5LiBTaW5jZSBkcml2ZXIgZG9lcwotCQkJICogbm90IGtub3cgZnJhbWUgc2l6ZSwgcmVhZCBjb3VudCBtdXN0IGJlIGdyZWF0ZXIgb3IKLQkJCSAqIGVxdWFsIHRvIHNpemUgb2YgUENNIHNhbXBsZXMKLQkJCSAqLwotCQkJTU1fREJHKCJyZWFkIHN0b3AgLSBwYXJ0aWFsIGZyYW1lXG4iKTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJTU1fREJHKCJyZWFkIGZyb20gaW5bJWRdXG4iLCBhdWRpby0+cmVhZF9uZXh0KTsKLQkJCS8qIG9yZGVyIHJlYWRzIGZyb20gdGhlIG91dHB1dCBidWZmZXIgKi8KLQkJCXJtYigpOwotCQkJaWYgKGNvcHlfdG9fdXNlcgotCQkJICAgIChidWYsIGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS5kYXRhLAotCQkJICAgICBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCkpIHsKLQkJCQlNTV9FUlIoImludmFsaWQgYWRkciAleCBcbiIsICh1bnNpZ25lZCBpbnQpYnVmKTsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljb3VudCAtPSBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZDsKLQkJCWJ1ZiArPSBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZDsKLQkJCWF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkID0gMDsKLQkJCWlmICgoKythdWRpby0+cmVhZF9uZXh0KSA9PSBhdWRpby0+cGNtX2J1Zl9jb3VudCkKLQkJCQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogZG9uJ3QgZmVlZCBvdXRwdXQgYnVmZmVyIHRvIEhXIGRlY29kZXIgZHVyaW5nIGZsdXNoaW5nCi0JICogYnVmZmVyIHJlZnJlc2ggY29tbWFuZCB3aWxsIGJlIHNlbnQgb25jZSBmbHVzaCBjb21wbGV0ZXMKLQkgKiBzZW5kIGJ1ZiByZWZyZXNoIGNvbW1hbmQgaGVyZSBjYW4gY29uZnVzZSBIVyBkZWNvZGVyCi0JICovCi0JaWYgKGF1ZGlvLT5idWZfcmVmcmVzaCAmJiAhYXVkaW8tPnJmbHVzaCkgewotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCQlNTV9EQkcoImtpY2sgc3RhcnQgcGNtIGZlZWRiYWNrIGFnYWluXG4iKTsKLQkJYXVkYW1ybmJfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCX0KLQotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0KLQlpZiAoYnVmID4gc3RhcnQpCi0JCXJjID0gYnVmIC0gc3RhcnQ7Ci0KLQlNTV9EQkcoInJlYWQgJWQgYnl0ZXNcbiIsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkYW1ybmJfcHJvY2Vzc19lb3Moc3RydWN0IGF1ZGlvICphdWRpbywKLQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1Zl9zdGFydCwgdW5zaWduZWQgc2hvcnQgbWZpZWxkX3NpemUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQotCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoYXVkaW8tPm91dF9uZWVkZWQgJiYKLQkJYXVkaW8tPm91dFswXS51c2VkID09IDAgJiYKLQkJYXVkaW8tPm91dFsxXS51c2VkID09IDApCi0JCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcihmcmFtZS0+ZGF0YSwgYnVmX3N0YXJ0LCBtZmllbGRfc2l6ZSkpIHsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZnJhbWUtPm1maWVsZF9zeiA9IG1maWVsZF9zaXplOwotCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCWZyYW1lLT51c2VkID0gbWZpZWxkX3NpemU7Ci0JYXVkYW1ybmJfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGFtcm5iX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQlzaXplX3QgeGZlcjsKLQljaGFyICpjcHlfcHRyOwotCWludCByYyA9IDAsIGVvc19jb25kaXRpb24gPSBBVURBTVJOQl9FT1NfTk9ORTsKLQl1bnNpZ25lZCBzaG9ydCBtZmllbGRfc2l6ZSA9IDA7Ci0KLQlNTV9EQkcoImNudD0lZFxuIiwgY291bnQpOwotCi0JaWYgKGNvdW50ICYgMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0JCWNweV9wdHIgPSBmcmFtZS0+ZGF0YTsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJCSAgICAgIChmcmFtZS0+dXNlZCA9PSAwKQotCQkJCQkJfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQkJCQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQotCQlNTV9EQkcoImJ1ZmZlciBhdmFpbGFibGVcbiIpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGF1ZGlvLT5tZmllbGQpIHsKLQkJCWlmIChidWYgPT0gc3RhcnQpIHsKLQkJCQkvKiBQcm9jZXNzaW5nIGJlZ2lubmluZyBvZiB1c2VyIGJ1ZmZlciAqLwotCQkJCWlmIChfX2dldF91c2VyKG1maWVsZF9zaXplLAotCQkJCQkodW5zaWduZWQgc2hvcnQgX191c2VyICopIGJ1ZikpIHsKLQkJCQkJcmMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgCWlmIChtZmllbGRfc2l6ZSA+IGNvdW50KSB7Ci0JCQkJCXJjID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCU1NX0RCRygibWYgb2Zmc2V0X3ZhbCAleFxuIiwgbWZpZWxkX3NpemUpOwotCQkJCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIG1maWVsZF9zaXplKSkgewotCQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvKiBDaGVjayBpZiBFT1MgZmxhZyBpcyBzZXQgYW5kIGJ1ZmZlcgotCQkJCSAqIGNvbnRhaW5zIGp1c3QgbWV0YSBmaWVsZAotCQkJCSAqLwotCQkJCWlmIChjcHlfcHRyW0FVREFNUk5CX0VPU19GTEdfT0ZGU0VUXSAmCi0JCQkJCQlBVURBTVJOQl9FT1NfRkxHX01BU0spIHsKLQkJCQkJTU1fREJHKCJlb3Mgc2V0XG4iKTsKLQkJCQkJZW9zX2NvbmRpdGlvbiA9IEFVREFNUk5CX0VPU19TRVQ7Ci0JCQkJCWlmIChtZmllbGRfc2l6ZSA9PSBjb3VudCkgewotCQkJCQkJYnVmICs9IG1maWVsZF9zaXplOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZQotCQkJCQljcHlfcHRyW0FVREFNUk5CX0VPU19GTEdfT0ZGU0VUXSAmPQotCQkJCQkJCX5BVURBTVJOQl9FT1NfRkxHX01BU0s7Ci0JCQkJfQotCQkJCWNweV9wdHIgKz0gbWZpZWxkX3NpemU7Ci0JCQkJY291bnQgLT0gbWZpZWxkX3NpemU7Ci0JCQkJYnVmICs9IG1maWVsZF9zaXplOwotCQkJfSBlbHNlIHsKLQkJCQltZmllbGRfc2l6ZSA9IDA7Ci0JCQkJTU1fREJHKCJjb250aW51b3VzIGJ1ZmZlclxuIik7Ci0JCQl9Ci0JCQlmcmFtZS0+bWZpZWxkX3N6ID0gbWZpZWxkX3NpemU7Ci0JCX0KLQotCQl4ZmVyID0gKGNvdW50ID4gKGZyYW1lLT5zaXplIC0gbWZpZWxkX3NpemUpKSA/Ci0JCQkoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkgOiBjb3VudDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNweV9wdHIsIGJ1ZiwgeGZlcikpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZnJhbWUtPnVzZWQgPSAoeGZlciArIG1maWVsZF9zaXplKTsKLQkJYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JCWNvdW50IC09IHhmZXI7Ci0JCWJ1ZiArPSB4ZmVyOwotCi0JCWF1ZGFtcm5iX3NlbmRfZGF0YShhdWRpbywgMCk7Ci0KLQl9Ci0JaWYgKGVvc19jb25kaXRpb24gPT0gQVVEQU1STkJfRU9TX1NFVCkKLQkJcmMgPSBhdWRhbXJuYl9wcm9jZXNzX2VvcyhhdWRpbywgc3RhcnQsIG1maWVsZF9zaXplKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlpZiAoIXJjKSB7Ci0JCWlmIChidWYgPiBzdGFydCkKLQkJCXJldHVybiBidWYgLSBzdGFydDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGFtcm5iX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCU1NX0lORk8oImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBmcmVlaW5nXG4iLCAoaW50KWF1ZGlvKTsKLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkYW1ybmJfZGlzYWJsZShhdWRpbyk7Ci0JaWYgKGF1ZGlvLT5ybXRfcmVzb3VyY2VfcmVsZWFzZWQgPT0gMCkKLQkJcm10X3B1dF9yZXNvdXJjZShhdWRpbyk7Ci0JYXVkYW1ybmJfZmx1c2goYXVkaW8pOwotCWF1ZGFtcm5iX2ZsdXNoX3BjbV9idWYoYXVkaW8pOwotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci0JYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0JdW5yZWdpc3Rlcl9lYXJseV9zdXNwZW5kKCZhdWRpby0+c3VzcGVuZF9jdGwubm9kZSk7Ci0jZW5kaWYKLQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAxOwotCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQlhdWRhbXJuYl9yZXNldF9ldmVudF9xdWV1ZShhdWRpbyk7Ci0JaW9uX3VubWFwX2tlcm5lbChhdWRpby0+Y2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLQlpZiAoYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlICE9IE5VTEwpIHsKLQkJaW9uX3VubWFwX2tlcm5lbChhdWRpby0+Y2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotCX0KLQlpb25fY2xpZW50X2Rlc3Ryb3koYXVkaW8tPmNsaWVudCk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JaWYgKGF1ZGlvLT5kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKGF1ZGlvLT5kZW50cnkpOwotI2VuZGlmCi0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX3Bvc3RfZXZlbnQoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHR5cGUsCi0JCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQpCi17Ci0Jc3RydWN0IGF1ZGFtcm5iX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpKSB7Ci0JCWVfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWRhbXJuYl9ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZlX25vZGUtPmxpc3QpOwotCX0gZWxzZSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRhbXJuYl9ldmVudCksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWVfbm9kZSkgewotCQkJTU1fRVJSKCJObyBtZW0gdG8gcG9zdCBldmVudCAlZFxuIiwgdHlwZSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JZV9ub2RlLT5ldmVudF90eXBlID0gdHlwZTsKLQllX25vZGUtPnBheWxvYWQgPSBwYXlsb2FkOwotCi0JbGlzdF9hZGRfdGFpbCgmZV9ub2RlLT5saXN0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLX0KLQotc3RhdGljIHZvaWQgYXVkYW1ybmJfc3VzcGVuZChzdHJ1Y3QgZWFybHlfc3VzcGVuZCAqaCkKLXsKLQlzdHJ1Y3QgYXVkYW1ybmJfc3VzcGVuZF9jdGwgKmN0bCA9Ci0JCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgYXVkYW1ybmJfc3VzcGVuZF9jdGwsIG5vZGUpOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWF1ZGFtcm5iX3Bvc3RfZXZlbnQoY3RsLT5hdWRpbywgQVVESU9fRVZFTlRfU1VTUEVORCwgcGF5bG9hZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX3Jlc3VtZShzdHJ1Y3QgZWFybHlfc3VzcGVuZCAqaCkKLXsKLQlzdHJ1Y3QgYXVkYW1ybmJfc3VzcGVuZF9jdGwgKmN0bCA9Ci0JCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgYXVkYW1ybmJfc3VzcGVuZF9jdGwsIG5vZGUpOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWF1ZGFtcm5iX3Bvc3RfZXZlbnQoY3RsLT5hdWRpbywgQVVESU9fRVZFTlRfUkVTVU1FLCBwYXlsb2FkKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgc3NpemVfdCBhdWRhbXJuYl9kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGFtcm5iX2RlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNvbnN0IGludCBkZWJ1Z19idWZtYXggPSAxMDI0OwotCXN0YXRpYyBjaGFyIGJ1ZmZlclsxMDI0XTsKLQlpbnQgbiA9IDAsIGk7Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQluID0gc2NucHJpbnRmKGJ1ZmZlciwgZGVidWdfYnVmbWF4LCAib3BlbmVkICVkXG4iLCBhdWRpby0+b3BlbmVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImVuYWJsZWQgJWRcbiIsIGF1ZGlvLT5lbmFibGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInN0b3BwZWQgJWRcbiIsIGF1ZGlvLT5zdG9wcGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInBjbV9mZWVkYmFjayAlZFxuIiwgYXVkaW8tPnBjbV9mZWVkYmFjayk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJvdXRfYnVmX3N6ICVkXG4iLCBhdWRpby0+b3V0WzBdLnNpemUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicGNtX2J1Zl9jb3VudCAlZCBcbiIsIGF1ZGlvLT5wY21fYnVmX2NvdW50KTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInBjbV9idWZfc3ogJWQgXG4iLCBhdWRpby0+aW5bMF0uc2l6ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJ2b2x1bWUgJXggXG4iLCBhdWRpby0+dm9sX3Bhbi52b2x1bWUpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCS8qIEZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIG9ubHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgd2hlbgotCSAqIHdoZW4gcGxheWJhY2sgaGFsdHMgdW5leHBlY3RlZGx5LiBUaHVzLCBubyBtdXR1YWwgZXhjbHVzaW9uCi0JICogZW5mb3JjZWQKLQkgKi8KLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIndmbHVzaCAlZFxuIiwgYXVkaW8tPndmbHVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJyZmx1c2ggJWRcbiIsIGF1ZGlvLT5yZmx1c2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicnVubmluZyAlZCBcbiIsIGF1ZGlvLT5ydW5uaW5nKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImRlYyBzdGF0ZSAlZCBcbiIsIGF1ZGlvLT5kZWNfc3RhdGUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X25lZWRlZCAlZCBcbiIsIGF1ZGlvLT5vdXRfbmVlZGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dF9oZWFkICVkIFxuIiwgYXVkaW8tPm91dF9oZWFkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dF90YWlsICVkIFxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dFswXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFswXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dFsxXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFsxXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImJ1ZmZlcl9yZWZyZXNoICVkIFxuIiwgYXVkaW8tPmJ1Zl9yZWZyZXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInJlYWRfbmV4dCAlZCBcbiIsIGF1ZGlvLT5yZWFkX25leHQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiZmlsbF9uZXh0ICVkIFxuIiwgYXVkaW8tPmZpbGxfbmV4dCk7Ci0JZm9yIChpID0gMDsgaSA8IGF1ZGlvLT5wY21fYnVmX2NvdW50OyBpKyspCi0JCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJImluWyVkXS51c2VkICVkIFxuIiwgaSwgYXVkaW8tPmluW2ldLnVzZWQpOwotCWJ1ZmZlcltuXSA9IDA7Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGJ1ZmZlciwgbik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGFtcm5iX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWRhbXJuYl9kZWJ1Z19yZWFkLAotCS5vcGVuID0gYXVkYW1ybmJfZGVidWdfb3BlbiwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBhdWRhbXJuYl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBOVUxMOwotCWludCByYywgZGVjX2F0dHJiLCBkZWNpZCwgaTsKLQlzdHJ1Y3QgYXVkYW1ybmJfZXZlbnQgKmVfbm9kZSA9IE5VTEw7Ci0JdW5zaWduZWQgbWVtX3N6ID0gRE1BU1o7Ci0JdW5zaWduZWQgbG9uZyBpb25mbGFnID0gMDsKLQlpb25fcGh5c19hZGRyX3QgYWRkciA9IDA7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCA9IE5VTEw7Ci0JaW50IGxlbiA9IDA7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JLyogNCBieXRlcyByZXByZXNlbnRzIGRlY29kZXIgbnVtYmVyLCAxIGJ5dGUgZm9yIHRlcm1pbmF0ZSBzdHJpbmcgKi8KLQljaGFyIG5hbWVbc2l6ZW9mICJtc21fYW1ybmJfIiArIDVdOwotI2VuZGlmCi0KLQkvKiBBbGxvY2F0ZSBNZW0gZm9yIGF1ZGlvIGluc3RhbmNlICovCi0JYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWF1ZGlvKSB7Ci0JCU1NX0VSUigibm8gbWVtb3J5IHRvIGFsbG9jYXRlIGF1ZGlvIGluc3RhbmNlIFxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQlNTV9JTkZPKCJhdWRpbyBpbnN0YW5jZSAweCUwOHggY3JlYXRlZFxuIiwgKGludClhdWRpbyk7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgZGVjb2RlciAqLwotCWRlY19hdHRyYiA9IEFVRERFQ19ERUNfQU1STkI7Ci0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlkZWNfYXR0cmIgfD0gTVNNX0FVRF9NT0RFX05PTlRVTk5FTDsKLQkJYXVkaW8tPnBjbV9mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERV9QTEFZQkFDSzsKLQl9IGVsc2UgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCSEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9UVU5ORUw7Ci0JCWF1ZGlvLT5wY21fZmVlZGJhY2sgPSBUVU5ORUxfTU9ERV9QTEFZQkFDSzsKLQl9IGVsc2UgewotCQlrZnJlZShhdWRpbyk7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBkb25lOwotCX0KLQotCWRlY2lkID0gYXVkcHBfYWRlY19hbGxvYyhkZWNfYXR0cmIsICZhdWRpby0+bW9kdWxlX25hbWUsCi0JCQkmYXVkaW8tPnF1ZXVlX2lkKTsKLQotCWlmIChkZWNpZCA8IDApIHsKLQkJTU1fRVJSKCJObyBmcmVlIGRlY29kZXIgYXZhaWxhYmxlLCBmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQkoaW50KWF1ZGlvKTsKLQkJcmMgPSAtRU5PREVWOwotCQlrZnJlZShhdWRpbyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhdWRpby0+ZGVjX2lkID0gZGVjaWQgJiBNU01fQVVEX0RFQ09ERVJfTUFTSzsKLQotCWNsaWVudCA9IG1zbV9pb25fY2xpZW50X2NyZWF0ZShVSU5UX01BWCwgIkF1ZGlvX0FNUl9OQl9DbGllbnQiKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoY2xpZW50KSkgewotCQlwcl9lcnIoIlVuYWJsZSB0byBjcmVhdGUgSU9OIGNsaWVudFxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBjbGllbnRfY3JlYXRlX2Vycm9yOwotCX0KLQlhdWRpby0+Y2xpZW50ID0gY2xpZW50OwotCi0JaGFuZGxlID0gaW9uX2FsbG9jKGNsaWVudCwgbWVtX3N6LCBTWl80SywKLQkJSU9OX0hFQVAoSU9OX0FVRElPX0hFQVBfSUQpLCAwKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoaGFuZGxlKSkgewotCQlNTV9FUlIoIlVuYWJsZSB0byBjcmVhdGUgYWxsb2NhdGUgTy9QIGJ1ZmZlcnNcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfYWxsb2NfZXJyb3I7Ci0JfQotCWF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUgPSBoYW5kbGU7Ci0KLQlyYyA9IGlvbl9waHlzKGNsaWVudCwgaGFuZGxlLCAmYWRkciwgJmxlbik7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiTy9QIGJ1ZmZlcnM6SW52YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I7Ci0JfSBlbHNlIHsKLQkJTU1fSU5GTygiTy9QIGJ1ZmZlcnM6dmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCX0KLQlhdWRpby0+cGh5cyA9IChpbnQzMl90KWFkZHI7Ci0KLQotCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MoY2xpZW50LCBoYW5kbGUsICZpb25mbGFnKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgZ2V0IGZsYWdzIGZvciB0aGUgaGFuZGxlXG4iKTsKLQkJZ290byBvdXRwdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I7Ci0JfQotCi0JYXVkaW8tPm1hcF92X3dyaXRlID0gaW9uX21hcF9rZXJuZWwoY2xpZW50LCBoYW5kbGUpOwotCWlmIChJU19FUlIoYXVkaW8tPm1hcF92X3dyaXRlKSkgewotCQlNTV9FUlIoImNvdWxkIG5vdCBtYXAgd3JpdGUgYnVmZmVyc1xuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRwdXRfYnVmZl9tYXBfZXJyb3I7Ci0JfQotCWF1ZGlvLT5kYXRhID0gYXVkaW8tPm1hcF92X3dyaXRlOwotCU1NX0RCRygid3JpdGUgYnVmOiBwaHkgYWRkciAweCUwOHgga2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQlhdWRpby0+cGh5cywgKGludClhdWRpby0+ZGF0YSk7Ci0KLQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykgewotCQlyYyA9IGF1ZG1ncl9vcGVuKCZhdWRpby0+YXVkbWdyKTsKLQkJaWYgKHJjKSB7Ci0JCQlNTV9FUlIoImF1ZG1nciBvcGVuIGZhaWxlZCwgZnJlZWluZyBpbnN0YW5jZSBcCi0JCQkJCTB4JTA4eFxuIiwgKGludClhdWRpbyk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQotCXJjID0gbXNtX2Fkc3BfZ2V0KGF1ZGlvLT5tb2R1bGVfbmFtZSwgJmF1ZGlvLT5hdWRwbGF5LAotCQkmYXVkcGxheV9hZHNwX29wc19hbXJuYiwgYXVkaW8pOwotCWlmIChyYykgewotCQlNTV9FUlIoImZhaWxlZCB0byBnZXQgJXMgbW9kdWxlLCBmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQlhdWRpby0+bW9kdWxlX25hbWUsIChpbnQpYXVkaW8pOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykKLQkJCWF1ZG1ncl9jbG9zZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJjID0gcm10X2dldF9yZXNvdXJjZShhdWRpbyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiQURTUCByZXNvdXJjZXMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIEFNUk5CIHNlc3Npb24gXAotCQkJIDB4JTA4eCBvbiBkZWNvZGVyOiAlZFxuIiwgKGludClhdWRpbywgYXVkaW8tPmRlY19pZCk7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrID09IFRVTk5FTF9NT0RFX1BMQVlCQUNLKQotCQkJYXVkbWdyX2Nsb3NlKCZhdWRpby0+YXVkbWdyKTsKLQkJbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRwbGF5KTsKLQkJZ290byBlcnI7Ci0JfQotCi0JYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlID0gTlVMTDsKLQotCW11dGV4X2luaXQoJmF1ZGlvLT5sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPnJlYWRfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmRzcF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2spOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0KLQlhdWRpby0+b3V0WzBdLmRhdGEgPSBhdWRpby0+ZGF0YSArIDA7Ci0JYXVkaW8tPm91dFswXS5hZGRyID0gYXVkaW8tPnBoeXMgKyAwOwotCWF1ZGlvLT5vdXRbMF0uc2l6ZSA9IEJVRlNaOwotCi0JYXVkaW8tPm91dFsxXS5kYXRhID0gYXVkaW8tPmRhdGEgKyBCVUZTWjsKLQlhdWRpby0+b3V0WzFdLmFkZHIgPSBhdWRpby0+cGh5cyArIEJVRlNaOwotCWF1ZGlvLT5vdXRbMV0uc2l6ZSA9IEJVRlNaOwotCi0JYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gMHgyMDAwOwotCi0JYXVkYW1ybmJfZmx1c2goYXVkaW8pOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0JYXVkaW8tPm9wZW5lZCA9IDE7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mIG5hbWUsICJtc21fYW1ybmJfJTA0eCIsIGF1ZGlvLT5kZWNfaWQpOwotCWF1ZGlvLT5kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJTlVMTCwgKHZvaWQgKikgYXVkaW8sICZhdWRhbXJuYl9kZWJ1Z19mb3BzKTsKLQotCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCi0JCU1NX0RCRygiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5sZXZlbCA9IEVBUkxZX1NVU1BFTkRfTEVWRUxfRElTQUJMRV9GQjsKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5yZXN1bWUgPSBhdWRhbXJuYl9yZXN1bWU7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUuc3VzcGVuZCA9IGF1ZGFtcm5iX3N1c3BlbmQ7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLmF1ZGlvID0gYXVkaW87Ci0JcmVnaXN0ZXJfZWFybHlfc3VzcGVuZCgmYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUpOwotI2VuZGlmCi0JZm9yIChpID0gMDsgaSA8IEFVREFNUk5CX0VWRU5UX05VTTsgaSsrKSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRhbXJuYl9ldmVudCksIEdGUF9LRVJORUwpOwotCQlpZiAoZV9ub2RlKQotCQkJbGlzdF9hZGRfdGFpbCgmZV9ub2RlLT5saXN0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCQllbHNlIHsKLQkJCU1NX0VSUigiZXZlbnQgcGt0IGFsbG9jIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotZXJyOgotCWlvbl91bm1hcF9rZXJuZWwoY2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLW91dHB1dF9idWZmX21hcF9lcnJvcjoKLW91dHB1dF9idWZmX2dldF9waHlzX2Vycm9yOgotb3V0cHV0X2J1ZmZfZ2V0X2ZsYWdzX2Vycm9yOgotCWlvbl9mcmVlKGNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci1vdXRwdXRfYnVmZl9hbGxvY19lcnJvcjoKLQlpb25fY2xpZW50X2Rlc3Ryb3koY2xpZW50KTsKLWNsaWVudF9jcmVhdGVfZXJyb3I6Ci0JYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2Ftcm5iX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSBhdWRhbXJuYl9vcGVuLAotCS5yZWxlYXNlID0gYXVkYW1ybmJfcmVsZWFzZSwKLQkucmVhZCA9IGF1ZGFtcm5iX3JlYWQsCi0JLndyaXRlID0gYXVkYW1ybmJfd3JpdGUsCi0JLnVubG9ja2VkX2lvY3RsID0gYXVkYW1ybmJfaW9jdGwsCi0JLmZzeW5jID0gYXVkYW1ybmJfZnN5bmMsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19hbXJuYl9taXNjID0gewotCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZSA9ICJtc21fYW1ybmIiLAotCS5mb3BzID0gJmF1ZGlvX2Ftcm5iX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRhbXJuYl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2Ftcm5iX21pc2MpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXVkYW1ybmJfZXhpdCh2b2lkKQotewotCW1pc2NfZGVyZWdpc3RlcigmYXVkaW9fYW1ybmJfbWlzYyk7Ci19Ci0KLW1vZHVsZV9pbml0KGF1ZGFtcm5iX2luaXQpOwotbW9kdWxlX2V4aXQoYXVkYW1ybmJfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIEFNUi1OQiBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX2Ftcm5iX2luLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19hbXJuYl9pbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWNhNzRkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX2Ftcm5iX2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIwICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX2Ftcm5iX2luLmMKLSAqCi0gKiBhbXJuYiBlbmNvZGVyIGRldmljZQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMS0yMDEzIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29kZSBpcyBiYXNlZCBpbiBwYXJ0IG9uIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX2luLmMsIHdoaWNoIGlzCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGZpbmQgaXQgYXQgaHR0cDovL3d3dy5mc2Yub3JnLgotICoKLSAqLwotCi0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fYW1ybmIuaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1vcnlfYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+Ci0KLSNpbmNsdWRlICJhdWRtZ3IuaCIKLQotI2luY2x1ZGUgPG1hY2gvbXNtX3JwY3JvdXRlci5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX21lbXR5cGVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdS5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXVfZG9tYWlucy5oPgotCi0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcmVwcm9jLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHByZXByb2NjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHByZXByb2Ntc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcmVjY21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRyZWNtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLSNkZWZpbmUgRlJBTUVfSEVBREVSX1NJWkUJOCAvKiA4IGJ5dGVzIGZyYW1lIGhlYWRlciAqLwotI2RlZmluZSBOVF9GUkFNRV9IRUFERVJfU0laRQkyNCAvKiAyNCBieXRlcyBmcmFtZSBoZWFkZXIgKi8KLS8qIEZSQU1FX05VTSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvICovCi0jZGVmaW5lIEZSQU1FX05VTQk4Ci0jZGVmaW5lIEFNUk5CX0ZSQU1FX1NJWkUJMzYgLyogMzYgYnl0ZXMgZGF0YSAqLwotLypUdW5uZWwgbW9kZSA6IDE1MzYgYnl0ZXMgZGF0YSArIDggYnl0ZSBoZWFkZXIqLwotI2RlZmluZSBGUkFNRV9TSVpFCShBTVJOQl9GUkFNRV9TSVpFICsgRlJBTUVfSEVBREVSX1NJWkUpCi0vKiAxNTM2IGJ5dGVzIGRhdGEgICsgMjQgbWV0YSBmaWVsZCovCi0jZGVmaW5lIE5UX0ZSQU1FX1NJWkUJKEFNUk5CX0ZSQU1FX1NJWkUgKyBOVF9GUkFNRV9IRUFERVJfU0laRSkKLSNkZWZpbmUgRE1BU1oJCShGUkFNRV9TSVpFICogRlJBTUVfTlVNKQotI2RlZmluZSBOVF9ETUFTWgkoTlRfRlJBTUVfU0laRSAqIEZSQU1FX05VTSkKLSNkZWZpbmUgT1VUX0ZSQU1FX05VTQkyCi0jZGVmaW5lIE9VVF9CVUZGRVJfU0laRSAoNCAqIDEwMjQgKyBOVF9GUkFNRV9IRUFERVJfU0laRSkKLSNkZWZpbmUgQlVGRkVSX1NJWkUJKE9VVF9CVUZGRVJfU0laRSAqIE9VVF9GUkFNRV9OVU0pCi0KLS8qIE9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBidWZmZXIqLwotI2RlZmluZSBBVURQUkVQUk9DX0FNUk5CX0VPU19GTEdfT0ZGU0VUIDB4MEEKLSNkZWZpbmUgQVVEUFJFUFJPQ19BTVJOQl9FT1NfRkxHX01BU0sgMHgwMQotI2RlZmluZSBBVURQUkVQUk9DX0FNUk5CX0VPU19OT05FIDB4MCAvKiBObyBFT1MgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgQVVEUFJFUFJPQ19BTVJOQl9FT1NfU0VUIDB4MSAvKiBFT1Mgc2V0IGluIG1ldGEgZmllbGQgKi8KLQotc3RydWN0IGJ1ZmZlciB7Ci0Jdm9pZCAqZGF0YTsKLQl1aW50MzJfdCBzaXplOwotCXVpbnQzMl90IHJlYWQ7Ci0JdWludDMyX3QgYWRkcjsKLQl1aW50MzJfdCB1c2VkOwotCXVpbnQzMl90IG1maWVsZF9zejsKLX07Ci0KLXN0cnVjdCBhdWRpb19hbXJuYl9pbiB7Ci0Jc3RydWN0IGJ1ZmZlciBpbltGUkFNRV9OVU1dOwotCi0Jc3BpbmxvY2tfdCBkc3BfbG9jazsKLQotCWF0b21pY190IGluX2J5dGVzOwotCWF0b21pY190IGluX3NhbXBsZXM7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggcmVhZF9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9lbmFibGU7Ci0JLyp3cml0ZSBzZWN0aW9uKi8KLQlzdHJ1Y3QgYnVmZmVyIG91dFtPVVRfRlJBTUVfTlVNXTsKLQotCXVpbnQ4X3Qgb3V0X2hlYWQ7Ci0JdWludDhfdCBvdXRfdGFpbDsKLQl1aW50OF90IG91dF9uZWVkZWQ7CS8qIG51bWJlciBvZiBidWZmZXJzIHRoZSBkc3AgaXMgd2FpdGluZyBmb3IgKi8KLQl1aW50MzJfdCBvdXRfY291bnQ7Ci0KLQlzdHJ1Y3QgbXV0ZXggd3JpdGVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3cml0ZV93YWl0OwotCWludDMyX3Qgb3V0X3BoeXM7IC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygd3JpdGUgYnVmZmVyICovCi0JY2hhciAqb3V0X2RhdGE7Ci0JdWludDhfdCBtZmllbGQ7IC8qIG1ldGEgZmllbGQgZW1iZWRkZWQgaW4gZGF0YSAqLwotCXVpbnQ4X3Qgd2ZsdXNoOyAvKndyaXRlIGZsdXNoICovCi0JdWludDhfdCByZmx1c2g7IC8qcmVhZCBmbHVzaCovCi0JdWludDMyX3Qgb3V0X2ZyYW1lX2NudDsKLQotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKmF1ZHJlYzsKLQotCS8qIGNvbmZpZ3VyYXRpb24gdG8gdXNlIG9uIG5leHQgZW5hYmxlICovCi0JdWludDMyX3Qgc2FtcF9yYXRlOwotCXVpbnQzMl90IGNoYW5uZWxfbW9kZTsKLQl1aW50MzJfdCBidWZmZXJfc2l6ZTsKLQl1aW50MzJfdCBlbmNfdHlwZTsgLyogMCBmb3IgV0FWICwxIGZvciBBQUMsMTAgZm9yIEFNUk5CICovCi0JdWludDMyX3QgbW9kZTsgLyogVCBvciBOVCBNb2RlKi8KLQlzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWcgYW1ybmJfZW5jX2NmZzsKLQotCXVpbnQzMl90IGRzcF9jbnQ7Ci0JdWludDMyX3QgaW5faGVhZDsgLyogbmV4dCBidWZmZXIgZHNwIHdpbGwgd3JpdGUgKi8KLQl1aW50MzJfdCBpbl90YWlsOyAvKiBuZXh0IGJ1ZmZlciByZWFkKCkgd2lsbCByZWFkICovCi0JdWludDMyX3QgaW5fY291bnQ7IC8qIG51bWJlciBvZiBidWZmZXJzIGF2YWlsYWJsZSB0byByZWFkKCkgKi8KLQotCXVpbnQzMl90IGVvc19hY2s7Ci0JdWludDMyX3QgZmx1c2hfYWNrOwotCi0JY29uc3QgY2hhciAqbW9kdWxlX25hbWU7Ci0JdW5zaWduZWQgcXVldWVfaWRzOwotCXVpbnQxNl90IGVuY19pZDsgLyogU2Vzc2lvbiBJZCAqLwotCi0JdW5zaWduZWQgc2hvcnQgc2FtcF9yYXRlX2luZGV4OwotCXVpbnQzMl90IGF1ZHJlY19vYmpfaWR4IDsKLQotCXN0cnVjdCBhdWRtZ3IgYXVkbWdyOwotCi0JLyogZGF0YSBhbGxvY2F0ZWQgZm9yIHZhcmlvdXMgYnVmZmVycyAqLwotCWNoYXIgKmRhdGE7Ci0JZG1hX2FkZHJfdCBwaHlzOwotCXZvaWQgKm1hcF92X3dyaXRlOwotCi0JdWludDhfdCBvcGVuZWQ7Ci0JdWludDhfdCBlbmFibGVkOwotCXVpbnQ4X3QgcnVubmluZzsKLQl1aW50OF90IHN0b3BwZWQ7IC8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBpb25faGFuZGxlICppbnB1dF9idWZmX2hhbmRsZTsKLQotCXN0cnVjdCBhdWRyZWNfc2Vzc2lvbl9pbmZvIHNlc3Npb25faW5mbzsgLyphdWRyZWMgc2Vzc2lvbiBpbmZvKi8KLX07Ci0KLXN0cnVjdCBhdWRpb19mcmFtZSB7Ci0JdWludDE2X3QgZnJhbWVfY291bnRfbHN3OwotCXVpbnQxNl90IGZyYW1lX2NvdW50X21zdzsKLQl1aW50MTZfdCBmcmFtZV9sZW5ndGg7Ci0JdWludDE2X3QgZXJhc2VkX3BjbTsKLQl1bnNpZ25lZCBjaGFyIHJhd19iaXRzdHJlYW1bXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhdWRpb19mcmFtZV9udCB7Ci0JdWludDE2X3QgbWV0YWRhdGFfbGVuOwotCXVpbnQxNl90IGZyYW1lX2NvdW50X2xzdzsKLQl1aW50MTZfdCBmcmFtZV9jb3VudF9tc3c7Ci0JdWludDE2X3QgZnJhbWVfbGVuZ3RoOwotCXVpbnQxNl90IGVyYXNlZF9wY207Ci0JdWludDE2X3QgcmVzZXJ2ZWQ7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9kd29yZF9sc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9kd29yZF9tc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9sc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9tc3c7Ci0JdWludDE2X3QgbmZsYWdfbHN3OwotCXVpbnQxNl90IG5mbGFnX21zdzsKLQl1bnNpZ25lZCBjaGFyIHJhd19iaXRzdHJlYW1bXTsgLyogc2FtcGxlcyAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFtcm5iX2VuY29kZWRfbWV0YV9vdXQgewotCXVpbnQxNl90IG1ldGFkYXRhX2xlbjsKLQl1aW50MTZfdCB0aW1lX3N0YW1wX2R3b3JkX2xzdzsKLQl1aW50MTZfdCB0aW1lX3N0YW1wX2R3b3JkX21zdzsKLQl1aW50MTZfdCB0aW1lX3N0YW1wX2xzdzsKLQl1aW50MTZfdCB0aW1lX3N0YW1wX21zdzsKLQl1aW50MTZfdCBuZmxhZ19sc3c7Ci0JdWludDE2X3QgbmZsYWdfbXN3OwotfTsKLQotLyogQXVkcmVjIFF1ZXVlIGNvbW1hbmQgc2VudCBtYWNybydzICovCi0jZGVmaW5lIGF1ZGlvX3NlbmRfcXVldWVfcHJlKGF1ZGlvLCBjbWQsIGxlbikgXAotCW1zbV9hZHNwX3dyaXRlKGF1ZGlvLT5hdWRwcmUsIFFEU1BfdVBBdWRQcmVQcm9jQ21kUXVldWUsIGNtZCwgbGVuKQotCi0jZGVmaW5lIGF1ZGlvX3NlbmRfcXVldWVfcmVjYnMoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHJlYywgKChhdWRpby0+cXVldWVfaWRzICYgMHhGRkZGMDAwMCkgPj4gMTYpLFwKLQkJCWNtZCwgbGVuKQotI2RlZmluZSBhdWRpb19zZW5kX3F1ZXVlX3JlYyhhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcmVjLCAoYXVkaW8tPnF1ZXVlX2lkcyAmIDB4MDAwMEZGRkYpLFwKLQkJCWNtZCwgbGVuKQotCi1zdGF0aWMgaW50IGF1ZGFtcm5iX2luX2RzcF9lbmFibGUoc3RydWN0IGF1ZGlvX2Ftcm5iX2luICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgaW50IGF1ZGFtcm5iX2luX2VuY3BhcmFtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9fYW1ybmJfaW4gKmF1ZGlvKTsKLXN0YXRpYyBpbnQgYXVkYW1ybmJfaW5fZW5jbWVtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9fYW1ybmJfaW4gKmF1ZGlvKTsKLXN0YXRpYyBpbnQgYXVkYW1ybmJfaW5fZHNwX3JlYWRfYnVmZmVyKHN0cnVjdCBhdWRpb19hbXJuYl9pbiAqYXVkaW8sCi0JCQkJdWludDMyX3QgcmVhZF9jbnQpOwotc3RhdGljIHZvaWQgYXVkYW1ybmJfaW5fZmx1c2goc3RydWN0IGF1ZGlvX2Ftcm5iX2luICphdWRpbyk7Ci0KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX2luX2dldF9kc3BfZnJhbWVzKHN0cnVjdCBhdWRpb19hbXJuYl9pbiAqYXVkaW8pOwotc3RhdGljIGludCBhdWRwY21fY29uZmlnKHN0cnVjdCBhdWRpb19hbXJuYl9pbiAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkYW1ybmJfb3V0X2ZsdXNoKHN0cnVjdCBhdWRpb19hbXJuYl9pbiAqYXVkaW8pOwotc3RhdGljIGludCBhdWRhbXJuYl9pbl9yb3V0aW5nX21vZGVfY29uZmlnKHN0cnVjdCBhdWRpb19hbXJuYl9pbiAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcmVjX3BjbV9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvX2Ftcm5iX2luICphdWRpbywgdW5zaWduZWQgbmVlZGVkKTsKLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX250X2luX2dldF9kc3BfZnJhbWVzKHN0cnVjdCBhdWRpb19hbXJuYl9pbiAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkYW1ybmJfaW5fZmx1c2goc3RydWN0IGF1ZGlvX2Ftcm5iX2luICphdWRpbyk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBjb252ZXJ0X3NhbXBfaW5kZXgodW5zaWduZWQgaW5kZXgpCi17Ci0Jc3dpdGNoIChpbmRleCkgewotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfNDgwMDA6CXJldHVybiA0ODAwMDsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzQ0MTAwOglyZXR1cm4gNDQxMDA7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8zMjAwMDoJcmV0dXJuIDMyMDAwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMjQwMDA6CXJldHVybiAyNDAwMDsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzIyMDUwOglyZXR1cm4gMjIwNTA7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xNjAwMDoJcmV0dXJuIDE2MDAwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMTIwMDA6CXJldHVybiAxMjAwMDsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzExMDI1OglyZXR1cm4gMTEwMjU7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV84MDAwOglyZXR1cm4gODAwMDsKLQlkZWZhdWx0OgkJCQlyZXR1cm4gMTEwMjU7Ci0JfQotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZHByZV9kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsICB2b2lkICpldmVudF9kYXRhKQotewotCi0JdWludDE2X3QgKm1zZyA9IGV2ZW50X2RhdGE7Ci0KLQlpZiAoIW1zZykKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUFJFUFJPQ19NU0dfQ01EX0NGR19ET05FX01TRzoKLQkJTU1fREJHKCJ0eXBlICVkLCBzdGF0dXNfZmxhZyAlZFxuIixcCi0JCQltc2dbMF0sIG1zZ1sxXSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFJFUFJPQ19NU0dfRVJST1JfTVNHX0lEOgotCQlNTV9JTkZPKCJlcnJfaW5kZXggJWRcbiIsIG1zZ1swXSk7Ci0JCWJyZWFrOwotCWNhc2UgQURTUF9NRVNTQUdFX0lEOgotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6IG1vZHVsZSBlbmFibGUoYXVkcHJlcHJvY3Rhc2spXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJ1bmtub3duIGV2ZW50ICVkXG4iLCBpZCk7Ci0JfQotfQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGFtcm5iX2luX2VuYWJsZShzdHJ1Y3QgYXVkaW9fYW1ybmJfaW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRtZ3JfY29uZmlnIGNmZzsKLQlpbnQzMl90IHJjOwotCi0JaWYgKGF1ZGlvLT5lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWNmZy50eF9yYXRlID0gYXVkaW8tPnNhbXBfcmF0ZTsKLQljZmcucnhfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFX05PTkU7Ci0JY2ZnLmRlZl9tZXRob2QgPSBSUENfQVVEX0RFRl9NRVRIT0RfUkVDT1JEOwotCWNmZy5jb2RlYyA9IFJQQ19BVURfREVGX0NPREVDX0FNUl9OQjsKLQljZmcuc25kX21ldGhvZCA9IFJQQ19TTkRfTUVUSE9EX01JREk7Ci0KLQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJcmMgPSBhdWRtZ3JfZW5hYmxlKCZhdWRpby0+YXVkbWdyLCAmY2ZnKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlpZiAoYXVkcHJlcHJvY19lbmFibGUoYXVkaW8tPmVuY19pZCwKLQkJCQkmYXVkcHJlX2RzcF9ldmVudCwgYXVkaW8pKSB7Ci0JCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRwcmVwcm9jKSBmYWlsZWRcbiIpOwotCQkJYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQkJLyp1cGRhdGUgYXVyZWMgc2Vzc2lvbiBpbmZvIGluIGF1ZHByZXByb2MgbGF5ZXIqLwotCQlhdWRpby0+c2Vzc2lvbl9pbmZvLnNlc3Npb25faWQgPSBhdWRpby0+ZW5jX2lkOwotCQlhdWRpby0+c2Vzc2lvbl9pbmZvLnNhbXBsaW5nX2ZyZXEgPQotCQkJY29udmVydF9zYW1wX2luZGV4KGF1ZGlvLT5zYW1wX3JhdGUpOwotCQlhdWRwcmVwcm9jX3VwZGF0ZV9hdWRyZWNfaW5mbygmYXVkaW8tPnNlc3Npb25faW5mbyk7Ci0JfQotCi0JaWYgKG1zbV9hZHNwX2VuYWJsZShhdWRpby0+YXVkcmVjKSkgewotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJCWF1ZHByZXByb2NfZGlzYWJsZShhdWRpby0+ZW5jX2lkLCBhdWRpbyk7Ci0JCQlhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCX0KLQkJTU1fRVJSKCJtc21fYWRzcF9lbmFibGUoYXVkcmVjKSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JYXVkYW1ybmJfaW5fZHNwX2VuYWJsZShhdWRpbywgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGFtcm5iX2luX2Rpc2FibGUoc3RydWN0IGF1ZGlvX2Ftcm5iX2luICphdWRpbykKLXsKLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCi0JCWF1ZGFtcm5iX2luX2RzcF9lbmFibGUoYXVkaW8sIDApOwotCi0JCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXRfZW5hYmxlLAotCQkJCWF1ZGlvLT5ydW5uaW5nID09IDAsIDEqSFopOwotCQltc21fYWRzcF9kaXNhYmxlKGF1ZGlvLT5hdWRyZWMpOwotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJCS8qcmVzZXQgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSBpbmZvcm1hdGlvbiBhdAotCQkJYXVkcHJlcHJvYyBsYXllciovCi0JCQlhdWRpby0+c2Vzc2lvbl9pbmZvLnNhbXBsaW5nX2ZyZXEgPSAwOwotCQkJYXVkcHJlcHJvY191cGRhdGVfYXVkcmVjX2luZm8oJmF1ZGlvLT5zZXNzaW9uX2luZm8pOwotCQkJYXVkcHJlcHJvY19kaXNhYmxlKGF1ZGlvLT5lbmNfaWQsIGF1ZGlvKTsKLQkJCWF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXVkYW1ybmJfaW5fZ2V0X2RzcF9mcmFtZXMoc3RydWN0IGF1ZGlvX2Ftcm5iX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkaW9fZnJhbWUgKmZyYW1lOwotCXVpbnQzMl90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW5kZXggPSBhdWRpby0+aW5faGVhZDsKLQotCWZyYW1lID0gKHZvaWQgKikgKCgoY2hhciAqKWF1ZGlvLT5pbltpbmRleF0uZGF0YSkgLQotCQlzaXplb2YoKmZyYW1lKSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCi0JLyogU2VuZAlDb21wbGV0ZSBUcmFuc2NvZGVkIERhdGEsIG5vdCBhY3R1YWwgZnJhbWUgcGFydCAgKi8KLQlhdWRpby0+aW5baW5kZXhdLnNpemUgPSBGUkFNRV9TSVpFIC0gKHNpemVvZigqZnJhbWUpKTsKLQkvKiBzdGF0aXN0aWNzIG9mIHJlYWQgKi8KLQlhdG9taWNfYWRkKGF1ZGlvLT5pbltpbmRleF0uc2l6ZSwgJmF1ZGlvLT5pbl9ieXRlcyk7Ci0JYXRvbWljX2FkZCgxLCAmYXVkaW8tPmluX3NhbXBsZXMpOwotCi0JYXVkaW8tPmluX2hlYWQgPSAoYXVkaW8tPmluX2hlYWQgKyAxKSAmIChGUkFNRV9OVU0gLSAxKTsKLQotCS8qIElmIG92ZXJmbG93LCBtb3ZlIHRoZSB0YWlsIGluZGV4IGZvd2FyZC4gKi8KLQlpZiAoYXVkaW8tPmluX2hlYWQgPT0gYXVkaW8tPmluX3RhaWwpIHsKLQkJTU1fRVJSKCJFcnJvciEgbm90IGFibGUgdG8ga2VlcCB1cCB0aGUgcmVhZFxuIik7Ci0JCWF1ZGlvLT5pbl90YWlsID0gKGF1ZGlvLT5pbl90YWlsICsgMSkgJiAoRlJBTUVfTlVNIC0gMSk7Ci0JCU1NX0VSUigiaW5fY291bnQgPSAlZFxuIiwgYXVkaW8tPmluX2NvdW50KTsKLQl9IGVsc2UKLQkJYXVkaW8tPmluX2NvdW50Kys7Ci0KLQlhdWRhbXJuYl9pbl9kc3BfcmVhZF9idWZmZXIoYXVkaW8sIGF1ZGlvLT5kc3BfY250KyspOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCi0Jd2FrZV91cCgmYXVkaW8tPndhaXQpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhbXJuYl9udF9pbl9nZXRfZHNwX2ZyYW1lcyhzdHJ1Y3QgYXVkaW9fYW1ybmJfaW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRpb19mcmFtZV9udCAqbnRfZnJhbWU7Ci0JdWludDMyX3QgaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWluZGV4ID0gYXVkaW8tPmluX2hlYWQ7Ci0JbnRfZnJhbWUgPSAodm9pZCAqKSAoKChjaGFyICopYXVkaW8tPmluW2luZGV4XS5kYXRhKSAtIFwKLQkJCQlzaXplb2Yoc3RydWN0IGF1ZGlvX2ZyYW1lX250KSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9IG50X2ZyYW1lLT5mcmFtZV9sZW5ndGg7Ci0JLyogc3RhdGlzdGljcyBvZiByZWFkICovCi0JYXRvbWljX2FkZChhdWRpby0+aW5baW5kZXhdLnNpemUsICZhdWRpby0+aW5fYnl0ZXMpOwotCWF0b21pY19hZGQoMSwgJmF1ZGlvLT5pbl9zYW1wbGVzKTsKLQotCWF1ZGlvLT5pbl9oZWFkID0gKGF1ZGlvLT5pbl9oZWFkICsgMSkgJiAoRlJBTUVfTlVNIC0gMSk7Ci0KLQkvKiBJZiBvdmVyZmxvdywgbW92ZSB0aGUgdGFpbCBpbmRleCBmb3dhcmQuICovCi0JaWYgKGF1ZGlvLT5pbl9oZWFkID09IGF1ZGlvLT5pbl90YWlsKQotCQlNTV9EQkcoIkVycm9yISBub3QgYWJsZSB0byBrZWVwIHVwIHRoZSByZWFkXG4iKTsKLQllbHNlCi0JCWF1ZGlvLT5pbl9jb3VudCsrOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cCgmYXVkaW8tPndhaXQpOwotfQotCi1zdGF0aWMgaW50IGF1ZHJlY19wY21fYnVmZmVyX3B0cl9yZWZyZXNoKHN0cnVjdCBhdWRpb19hbXJuYl9pbiAqYXVkaW8sCi0JCQkJICAgICAgIHVuc2lnbmVkIGlkeCwgdW5zaWduZWQgbGVuKQotewotCXN0cnVjdCBhdWRyZWNfY21kX3BjbV9idWZmZXJfcHRyX3JlZnJlc2hfYXJtX2VuYyBjbWQ7Ci0KLQlpZiAobGVuID09ICBOVF9GUkFNRV9IRUFERVJfU0laRSkKLQkJbGVuID0gbGVuIC8gMjsKLQllbHNlCi0JCWxlbiA9IChsZW4gKyBOVF9GUkFNRV9IRUFERVJfU0laRSkgLyAyOwotCU1NX0RCRygibGVuID0gJWRcbiIsIGxlbik7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUkVDX0NNRF9QQ01fQlVGRkVSX1BUUl9SRUZSRVNIX0FSTV9UT19FTkM7Ci0JY21kLm51bV9idWZmZXJzID0gMTsKLQlpZiAoY21kLm51bV9idWZmZXJzID09IDEpIHsKLQkJY21kLmJ1Zl9hZGRyZXNzX2xlbmd0aFswXSA9IChhdWRpby0+b3V0W2lkeF0uYWRkciAmCi0JCQkJCQkJMHhmZmZmMDAwMCkgPj4gMTY7Ci0JCWNtZC5idWZfYWRkcmVzc19sZW5ndGhbMV0gPSAoYXVkaW8tPm91dFtpZHhdLmFkZHIgJgotCQkJCQkJCTB4MDAwMGZmZmYpOwotCQljbWQuYnVmX2FkZHJlc3NfbGVuZ3RoWzJdID0gKGxlbiAmIDB4ZmZmZjAwMDApID4+IDE2OwotCQljbWQuYnVmX2FkZHJlc3NfbGVuZ3RoWzNdID0gKGxlbiAmIDB4MDAwMGZmZmYpOwotCX0KLQlhdWRpby0+b3V0X2ZyYW1lX2NudCsrOwotCXJldHVybiBhdWRpb19zZW5kX3F1ZXVlX3JlYyhhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGF1ZHBjbV9jb25maWcoc3RydWN0IGF1ZGlvX2Ftcm5iX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9wY21fY2ZnX2FybV90b19lbmMgY21kOwotCU1NX0RCRygiXG4iKTsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURSRUNfQ01EX1BDTV9DRkdfQVJNX1RPX0VOQzsKLQljbWQuY29uZmlnX3VwZGF0ZV9mbGFnID0gQVVEUkVDX1BDTV9DT05GSUdfVVBEQVRFX0ZMQUdfRU5BQkxFOwotCWNtZC5lbmFibGVfZmxhZyA9IEFVRFJFQ19FTkFCTEVfRkxBR19WQUxVRTsKLQljbWQuc2FtcGxpbmdfZnJlcSA9IGNvbnZlcnRfc2FtcF9pbmRleChhdWRpby0+c2FtcF9yYXRlKTsKLQlpZiAoIWF1ZGlvLT5jaGFubmVsX21vZGUpCi0JCWNtZC5jaGFubmVscyA9IDE7Ci0JZWxzZQotCQljbWQuY2hhbm5lbHMgPSAyOwotCWNtZC5mcmVxdWVuY3lfb2ZfaW50aW1hdGlvbiA9IDE7Ci0JY21kLm1heF9udW1iZXJfb2ZfYnVmZmVycyA9IE9VVF9GUkFNRV9OVU07Ci0JcmV0dXJuIGF1ZGlvX3NlbmRfcXVldWVfcmVjKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLQotc3RhdGljIGludCBhdWRhbXJuYl9pbl9yb3V0aW5nX21vZGVfY29uZmlnKHN0cnVjdCBhdWRpb19hbXJuYl9pbiAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHJlY19jbWRfcm91dGluZ19tb2RlIGNtZDsKLQotCU1NX0RCRygiXG4iKTsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURSRUNfQ01EX1JPVVRJTkdfTU9ERTsKLQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUwpCi0JCWNtZC5yb3V0aW5nX21vZGUgPSAxOwotCXJldHVybiBhdWRpb19zZW5kX3F1ZXVlX3JlYyhhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRyZWNfZHNwX2V2ZW50KHZvaWQgKmRhdGEsIHVuc2lnbmVkIGlkLCBzaXplX3QgbGVuLAotCQkJICAgIHZvaWQgKCpnZXRldmVudCkodm9pZCAqcHRyLCBzaXplX3QgbGVuKSkKLXsKLQlzdHJ1Y3QgYXVkaW9fYW1ybmJfaW4gKmF1ZGlvID0gZGF0YTsKLQlpZiAoZGF0YSkKLQkJYXVkaW8gPSBkYXRhOwotCWVsc2UgewotCQlNTV9FUlIoImludmFsaWQgZGF0YSBmb3IgZXZlbnQgJXhcbiIsIGlkKTsKLQkJcmV0dXJuOwotCX0KLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFJFQ19NU0dfQ01EX0NGR19ET05FX01TRzogewotCQlzdHJ1Y3QgYXVkcmVjX21zZ19jbWRfY2ZnX2RvbmVfbXNnIGNtZF9jZmdfZG9uZV9tc2c7Ci0JCWdldGV2ZW50KCZjbWRfY2ZnX2RvbmVfbXNnLCBBVURSRUNfTVNHX0NNRF9DRkdfRE9ORV9NU0dfTEVOKTsKLQkJaWYgKGNtZF9jZmdfZG9uZV9tc2cuYXVkcmVjX2VuY190eXBlICYgXAotCQkJCUFVRFJFQ19NU0dfQ0ZHX0RPTkVfRU5DX0VOQSkgewotCQkJYXVkaW8tPmF1ZHJlY19vYmpfaWR4ID0gY21kX2NmZ19kb25lX21zZy5hdWRyZWNfb2JqX2lkeDsKLQkJCU1NX0RCRygiQ0ZHIEVOQUJMRURcbiIpOwotCQkJaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKSB7Ci0JCQkJTU1fREJHKCJyb3V0aW5nIGNvbW1hbmRcbiIpOwotCQkJCWF1ZGFtcm5iX2luX3JvdXRpbmdfbW9kZV9jb25maWcoYXVkaW8pOwotCQkJfSBlbHNlIHsKLQkJCQlhdWRhbXJuYl9pbl9lbmNtZW1fY29uZmlnKGF1ZGlvKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygiQ0ZHIFNMRUVQXG4iKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0X2VuYWJsZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX01TR19DTURfUk9VVElOR19NT0RFX0RPTkVfTVNHOiB7Ci0JCXN0cnVjdCBhdWRyZWNfbXNnX2NtZF9yb3V0aW5nX21vZGVfZG9uZV9tc2cgXAotCQkJcm91dGluZ19tc2c7Ci0JCWdldGV2ZW50KCZyb3V0aW5nX21zZywgQVVEUkVDX01TR19DTURfUk9VVElOR19NT0RFX0RPTkVfTVNHKTsKLQkJTU1fREJHKCJBVURSRUNfTVNHX0NNRF9ST1VUSU5HX01PREVfRE9ORV9NU0ciKTsKLQkJaWYgKHJvdXRpbmdfbXNnLmNvbmZpZ3VyYXRpb24gPT0gMCkgewotCQkJTU1fRVJSKCJyb3V0aW5nIGNvbmZpZ3VyYXRpb24gZmFpbGVkXG4iKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0X2VuYWJsZSk7Ci0JCX0gZWxzZQotCQkJYXVkYW1ybmJfaW5fZW5jbWVtX2NvbmZpZyhhdWRpbyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19NU0dfQ01EX0FSRUNfTUVNX0NGR19ET05FX01TRzogewotCQlNTV9EQkcoIkFSRUNfTUVNX0NGR19ET05FX01TR1xuIik7Ci0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkKLQkJCWF1ZGFtcm5iX2luX2VuY3BhcmFtX2NvbmZpZyhhdWRpbyk7Ci0JCWVsc2UKLQkJCWF1ZHBjbV9jb25maWcoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIEFVRFJFQ19DTURfUENNX0NGR19BUk1fVE9fRU5DX0RPTkVfTVNHOiB7Ci0JCU1NX0RCRygiQVVEUkVDX0NNRF9QQ01fQ0ZHX0FSTV9UT19FTkNfRE9ORV9NU0ciKTsKLQkJYXVkYW1ybmJfaW5fZW5jcGFyYW1fY29uZmlnKGF1ZGlvKTsKLQkgICAgYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX01TR19DTURfQVJFQ19QQVJBTV9DRkdfRE9ORV9NU0c6IHsKLQkJTU1fREJHKCJBVURSRUNfTVNHX0NNRF9BUkVDX1BBUkFNX0NGR19ET05FX01TR1xuIik7Ci0JCWF1ZGlvLT5ydW5uaW5nID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPndhaXRfZW5hYmxlKTsKLQkJaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKQotCQkJYXVkcmVjX3BjbV9zZW5kX2RhdGEoYXVkaW8sIDEpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfQ01EX1BDTV9CVUZGRVJfUFRSX1VQREFURV9BUk1fVE9fRU5DX01TRzogewotCQlNTV9EQkcoInB0cl91cGRhdGUgcmVjaWV2ZWQgZnJvbSBEU1BcbiIpOwotCQlhdWRyZWNfcGNtX3NlbmRfZGF0YShhdWRpbywgMSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19NU0dfTk9fRVhUX1BLVF9BVkFJTEFCTEVfTVNHOiB7Ci0JCXN0cnVjdCBhdWRyZWNfbXNnX25vX2V4dF9wa3RfYXZhaWxfbXNnIGVycl9tc2c7Ci0JCWdldGV2ZW50KCZlcnJfbXNnLCBBVURSRUNfTVNHX05PX0VYVF9QS1RfQVZBSUxBQkxFX01TR19MRU4pOwotCQlNTV9EQkcoIk5PX0VYVF9QS1RfQVZBSUxBQkxFX01TRyAleFxuIixcCi0JCQllcnJfbXNnLmF1ZHJlY19lcnJfaWQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfTVNHX1BBQ0tFVF9SRUFEWV9NU0c6IHsKLQkJc3RydWN0IGF1ZHJlY19tc2dfcGFja2V0X3JlYWR5X21zZyBwa3RfcmVhZHlfbXNnOwotCi0JCWdldGV2ZW50KCZwa3RfcmVhZHlfbXNnLCBBVURSRUNfTVNHX1BBQ0tFVF9SRUFEWV9NU0dfTEVOKTsKLQkJTU1fREJHKCJVUF9QQUNLRVRfUkVBRFlfTVNHOiB3cml0ZSBjbnQgbXN3ICAlZCBcCi0JCXdyaXRlIGNudCBsc3cgJWQgcmVhZCBjbnQgbXN3ICVkICByZWFkIGNudCBsc3cgJWQgXG4iLFwKLQkJcGt0X3JlYWR5X21zZy5wa3RfY291bnRlcl9tc3csIFwKLQkJcGt0X3JlYWR5X21zZy5wa3RfY291bnRlcl9sc3csIFwKLQkJcGt0X3JlYWR5X21zZy5wa3RfcmVhZF9jbnRfbXN3LCBcCi0JCXBrdF9yZWFkeV9tc2cucGt0X3JlYWRfY250X2xzdyk7Ci0KLQkJYXVkYW1ybmJfaW5fZ2V0X2RzcF9mcmFtZXMoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfVVBfTlRfUEFDS0VUX1JFQURZX01TRzogewotCQlzdHJ1Y3QgYXVkcmVjX3VwX250X3BhY2tldF9yZWFkeV9tc2cgcGt0X3JlYWR5X21zZzsKLQotCQlnZXRldmVudCgmcGt0X3JlYWR5X21zZywgQVVEUkVDX1VQX05UX1BBQ0tFVF9SRUFEWV9NU0dfTEVOKTsKLQkJTU1fREJHKCJVUF9OVF9QQUNLRVRfUkVBRFlfTVNHOiB3cml0ZSBjbnQgbHN3ICAlZCBcCi0JCXdyaXRlIGNudCBtc3cgJWQgcmVhZCBjbnQgbHN3ICVkICByZWFkIGNudCBtc3cgJWQgXG4iLFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfcGFja2V0d3JpdGVfY250X2xzdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY19wYWNrZXR3cml0ZV9jbnRfbXN3LCBcCi0JCXBrdF9yZWFkeV9tc2cuYXVkcmVjX3VwcHJldl9yZWFkY291bnRfbHN3LCBcCi0JCXBrdF9yZWFkeV9tc2cuYXVkcmVjX3VwcHJldl9yZWFkY291bnRfbXN3KTsKLQotCQlhdWRhbXJuYl9udF9pbl9nZXRfZHNwX2ZyYW1lcyhhdWRpbyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19DTURfRkxVU0hfRE9ORV9NU0c6IHsKLQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQlhdWRpby0+Zmx1c2hfYWNrID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlNTV9EQkcoImZsdXNoIGFjayByZWNpZXZlZFxuIik7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFEU1BfTUVTU0FHRV9JRDoKLQkJTU1fREJHKCJSZWNlaXZlZCBBRFNQIGV2ZW50OiBtb2R1bGUgXAotCQkJCWVuYWJsZS9kaXNhYmxlKGF1ZHJlY3Rhc2spXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJ1bmtub3duIGV2ZW50ICVkXG4iLCBpZCk7Ci0JfQotfQotCi1zdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHJlY19hbXJuYl9hZHNwX29wcyA9IHsKLQkuZXZlbnQgPSBhdWRyZWNfZHNwX2V2ZW50LAotfTsKLQotc3RhdGljIGludCBhdWRhbXJuYl9pbl9kc3BfZW5hYmxlKHN0cnVjdCBhdWRpb19hbXJuYl9pbiAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0Jc3RydWN0IGF1ZHJlY19jbWRfZW5jX2NmZyBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURSRUNfQ01EX0VOQ19DRkc7Ci0JY21kLmF1ZHJlY19lbmNfdHlwZSA9IChhdWRpby0+ZW5jX3R5cGUgJiAweEZGKSB8Ci0JKGVuYWJsZSA/IEFVRFJFQ19DTURfRU5DX0VOQSA6IEFVRFJFQ19DTURfRU5DX0RJUyk7Ci0JLyogRG9uJ3QgY2FyZSBvbiBlbmFibGUsIHJlcXVpcmVkIG9uIGRpc2FibGUgKi8KLQljbWQuYXVkcmVjX29ial9pZHggPSBhdWRpby0+YXVkcmVjX29ial9pZHg7Ci0KLQlyZXR1cm4gYXVkaW9fc2VuZF9xdWV1ZV9yZWMoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRhbXJuYl9pbl9lbmNtZW1fY29uZmlnKHN0cnVjdCBhdWRpb19hbXJuYl9pbiAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHJlY19jbWRfYXJlY21lbV9jZmcgY21kOwotCXVpbnQxNl90ICpkYXRhID0gKHZvaWQgKikgYXVkaW8tPmRhdGE7Ci0JdWludDhfdCBuOwotCXVpbnQxNl90IGhlYWRlcl9sZW4gPSAwOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWNtZC5jbWRfaWQgPSBBVURSRUNfQ01EX0FSRUNNRU1fQ0ZHOwotCWNtZC5hdWRyZWNfb2JqX2lkeCA9IGF1ZGlvLT5hdWRyZWNfb2JqX2lkeDsKLQkvKiBSYXRlIGF0IHdoaWNoIHBhY2tldCBjb21wbGV0ZSBtZXNzYWdlIGNvbWVzICovCi0JY21kLmF1ZHJlY191cF9wa3RfaW50bV9jbnQgPSAxOwotCWNtZC5hdWRyZWNfZXh0cGt0X2J1ZmZlcl9tc3cgPSBhdWRpby0+cGh5cyA+PiAxNjsKLQljbWQuYXVkcmVjX2V4dHBrdF9idWZmZXJfbHN3ID0gYXVkaW8tPnBoeXM7Ci0JLyogTWF4IEJ1ZmZlciBubyBhdmFpbGFibGUgZm9yIGZyYW1lcyAqLwotCWNtZC5hdWRyZWNfZXh0cGt0X2J1ZmZlcl9udW0gPSBGUkFNRV9OVU07Ci0KLQkvKiBwcmVwYXJlIGJ1ZmZlciBwb2ludGVyczoKLQkgKiBUOjM2IGJ5dGVzIGFtcm5iIHBhY2tldCArIDQgaGFsZndvcmQgaGVhZGVyCi0JICogTlQ6MzYgYnl0ZXMgYW1ybmIgcGFja2V0ICsgMTIgaGFsZndvcmQgaGVhZGVyCi0JICovCi0JaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfVFVOTkVMKQotCQloZWFkZXJfbGVuID0gRlJBTUVfSEVBREVSX1NJWkUvMjsKLQllbHNlCi0JCWhlYWRlcl9sZW4gPSBOVF9GUkFNRV9IRUFERVJfU0laRS8yOwotCi0JZm9yIChuID0gMDsgbiA8IEZSQU1FX05VTTsgbisrKSB7Ci0JCWF1ZGlvLT5pbltuXS5kYXRhID0gZGF0YSArIGhlYWRlcl9sZW47Ci0JCWRhdGEgKz0gKEFNUk5CX0ZSQU1FX1NJWkUvMikgKyBoZWFkZXJfbGVuOwotCQlNTV9EQkcoIjB4JTh4XG4iLCAodWludDMyX3QpKGF1ZGlvLT5pbltuXS5kYXRhIC0gaGVhZGVyX2xlbioyKSk7Ci0JfQotCi0JcmV0dXJuIGF1ZGlvX3NlbmRfcXVldWVfcmVjKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkYW1ybmJfaW5fZW5jcGFyYW1fY29uZmlnKHN0cnVjdCBhdWRpb19hbXJuYl9pbiAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHJlY19jbWRfYXJlY3BhcmFtX2Ftcm5iX2NmZyBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCi0JY21kLmNvbW1vbi5jbWRfaWQgPSBBVURSRUNfQ01EX0FSRUNQQVJBTV9DRkc7Ci0JY21kLmNvbW1vbi5hdWRyZWNfb2JqX2lkeCA9IGF1ZGlvLT5hdWRyZWNfb2JqX2lkeDsKLQljbWQuc2FtcF9yYXRlX2lkeCA9IGF1ZGlvLT5zYW1wX3JhdGVfaW5kZXg7IC8qIDhrIFNhbXBsaW5nIHJhdGUgKi8KLQljbWQudm9pY2VtZW1vZW5jd2VpZ2h0MSA9IGF1ZGlvLT5hbXJuYl9lbmNfY2ZnLnZvaWNlbWVtb2VuY3dlaWdodDE7Ci0JY21kLnZvaWNlbWVtb2VuY3dlaWdodDIgPSBhdWRpby0+YW1ybmJfZW5jX2NmZy52b2ljZW1lbW9lbmN3ZWlnaHQyOwotCWNtZC52b2ljZW1lbW9lbmN3ZWlnaHQzID0gYXVkaW8tPmFtcm5iX2VuY19jZmcudm9pY2VtZW1vZW5jd2VpZ2h0MzsKLQljbWQudm9pY2VtZW1vZW5jd2VpZ2h0NCA9IGF1ZGlvLT5hbXJuYl9lbmNfY2ZnLnZvaWNlbWVtb2VuY3dlaWdodDQ7Ci0JY21kLnVwZGF0ZV9tb2RlID0gMHg4MDAwIHwgMHgwMDAwOwotCWNtZC5kdHhfbW9kZSA9IGF1ZGlvLT5hbXJuYl9lbmNfY2ZnLmR0eF9tb2RlX2VuYWJsZTsKLQljbWQudGVzdF9tb2RlID0gYXVkaW8tPmFtcm5iX2VuY19jZmcudGVzdF9tb2RlX2VuYWJsZTsKLQljbWQudXNlZF9tb2RlID0gYXVkaW8tPmFtcm5iX2VuY19jZmcuZW5jX21vZGU7Ci0KLQlNTV9EQkcoImNtZC5jb21tb24uY21kX2lkID0gMHglNHhcbiIsIGNtZC5jb21tb24uY21kX2lkKTsKLQlNTV9EQkcoImNtZC5jb21tb24uYXVkcmVjX29ial9pZHggPSAweCU0eFxuIiwKLQkJCWNtZC5jb21tb24uYXVkcmVjX29ial9pZHgpOwotCU1NX0RCRygiY21kLnNhbXBfcmF0ZV9pZHggPSAweCU0eFxuIiwgY21kLnNhbXBfcmF0ZV9pZHgpOwotCU1NX0RCRygiY21kLnZvaWNlbWVtb2VuY3dlaWdodDEgPSAweCU0eFxuIiwKLQkJCWNtZC52b2ljZW1lbW9lbmN3ZWlnaHQxKTsKLQlNTV9EQkcoImNtZC52b2ljZW1lbW9lbmN3ZWlnaHQyID0gMHglNHhcbiIsCi0JCQljbWQudm9pY2VtZW1vZW5jd2VpZ2h0Mik7Ci0JTU1fREJHKCJjbWQudm9pY2VtZW1vZW5jd2VpZ2h0MyA9IDB4JTR4XG4iLAotCQkJY21kLnZvaWNlbWVtb2VuY3dlaWdodDMpOwotCU1NX0RCRygiY21kLnZvaWNlbWVtb2VuY3dlaWdodDQgPSAweCU0eFxuIiwKLQkJCWNtZC52b2ljZW1lbW9lbmN3ZWlnaHQ0KTsKLQlNTV9EQkcoImNtZC51cGRhdGVfbW9kZSA9IDB4JTR4XG4iLCBjbWQudXBkYXRlX21vZGUpOwotCU1NX0RCRygiY21kLmR0eF9tb2RlID0gMHglNHhcbiIsIGNtZC5kdHhfbW9kZSk7Ci0JTU1fREJHKCJjbWQudGVzdF9tb2RlID0gMHglNHhcbiIsIGNtZC50ZXN0X21vZGUpOwotCU1NX0RCRygiY21kLnVzZWRfbW9kZSA9IDB4JTR4XG4iLCBjbWQudXNlZF9tb2RlKTsKLQotCXJldHVybiBhdWRpb19zZW5kX3F1ZXVlX3JlYyhhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGF1ZGFtcm5iX2ZsdXNoX2NvbW1hbmQoc3RydWN0IGF1ZGlvX2Ftcm5iX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9mbHVzaCBjbWQ7Ci0JTU1fREJHKCJcbiIpOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfRkxVU0g7Ci0JcmV0dXJuIGF1ZGlvX3NlbmRfcXVldWVfcmVjKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci1zdGF0aWMgaW50IGF1ZGFtcm5iX2luX2RzcF9yZWFkX2J1ZmZlcihzdHJ1Y3QgYXVkaW9fYW1ybmJfaW4gKmF1ZGlvLAotCQl1aW50MzJfdCByZWFkX2NudCkKLXsKLQlhdWRyZWNfY21kX3BhY2tldF9leHRfcHRyIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfUEFDS0VUX0VYVF9QVFI7Ci0JY21kLnR5cGUgPSBhdWRpby0+YXVkcmVjX29ial9pZHg7Ci0JY21kLmN1cnJfcmVjX2NvdW50X21zdyA9IHJlYWRfY250ID4+IDE2OwotCWNtZC5jdXJyX3JlY19jb3VudF9sc3cgPSByZWFkX2NudDsKLQotCXJldHVybiBhdWRpb19zZW5kX3F1ZXVlX3JlY2JzKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZGV2aWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdm9pZCBhdWRhbXJuYl9pb3BvcnRfcmVzZXQoc3RydWN0IGF1ZGlvX2Ftcm5iX2luICphdWRpbykKLXsKLQkvKiBNYWtlIHN1cmUgcmVhZC93cml0ZSB0aHJlYWQgYXJlIGZyZWUgZnJvbQotCSAqIHNsZWVwIGFuZCBrbm93aW5nIHRoYXQgc3lzdGVtIGlzIG5vdCBhYmxlCi0JICogdG8gcHJvY2VzcyBpbyByZXF1ZXN0IGF0IHRoZSBtb21lbnQKLQkgKi8KLQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCWF1ZGFtcm5iX2luX2ZsdXNoKGF1ZGlvKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JYXVkYW1ybmJfb3V0X2ZsdXNoKGF1ZGlvKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhbXJuYl9pbl9mbHVzaChzdHJ1Y3QgYXVkaW9fYW1ybmJfaW4gKmF1ZGlvKQotewotCXVpbnQ4X3QgaTsKLQotCWF1ZGlvLT5kc3BfY250ID0gMDsKLQlhdWRpby0+aW5faGVhZCA9IDA7Ci0JYXVkaW8tPmluX3RhaWwgPSAwOwotCWF1ZGlvLT5pbl9jb3VudCA9IDA7Ci0JYXVkaW8tPmVvc19hY2sgPSAwOwotCWZvciAoaSA9IEZSQU1FX05VTS0xOyBpID49IDA7IGktLSkgewotCQlhdWRpby0+aW5baV0uc2l6ZSA9IDA7Ci0JCWF1ZGlvLT5pbltpXS5yZWFkID0gMDsKLQl9Ci0JTU1fREJHKCJpbl9ieXRlcyAlZFxuIiwgYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9ieXRlcykpOwotCU1NX0RCRygiaW5fc2FtcGxlcyAlZFxuIiwgYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9zYW1wbGVzKSk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPmluX2J5dGVzLCAwKTsKLQlhdG9taWNfc2V0KCZhdWRpby0+aW5fc2FtcGxlcywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX291dF9mbHVzaChzdHJ1Y3QgYXVkaW9fYW1ybmJfaW4gKmF1ZGlvKQotewotCXVpbnQ4X3QgaTsKLQotCWF1ZGlvLT5vdXRfaGVhZCA9IDA7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+b3V0X2NvdW50ID0gMDsKLQlmb3IgKGkgPSBPVVRfRlJBTUVfTlVNLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCWF1ZGlvLT5vdXRbaV0uc2l6ZSA9IDA7Ci0JCWF1ZGlvLT5vdXRbaV0ucmVhZCA9IDA7Ci0JCWF1ZGlvLT5vdXRbaV0udXNlZCA9IDA7Ci0JfQotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBsb25nIGF1ZGFtcm5iX2luX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhdWRpb19hbXJuYl9pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlNTV9EQkcoIlxuIik7Ci0JaWYgKGNtZCA9PSBBVURJT19HRVRfU1RBVFMpIHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyBzdGF0czsKLQkJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7Ci0JCXN0YXRzLmJ5dGVfY291bnQgPSBhdG9taWNfcmVhZCgmYXVkaW8tPmluX2J5dGVzKTsKLQkJc3RhdHMuc2FtcGxlX2NvdW50ID0gYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9zYW1wbGVzKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIHJjOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJcmMgPSBhdWRhbXJuYl9pbl9lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9Ci0JCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdF9lbmFibGUsCi0JCQkJYXVkaW8tPnJ1bm5pbmcgIT0gMCwgMSpIWik7Ci0JCQlNTV9JTkZPKCJzdGF0ZSAlZCByYyA9ICVkXG4iLCBhdWRpby0+cnVubmluZywgcmMpOwotCi0JCQlpZiAoYXVkaW8tPnJ1bm5pbmcgPT0gMCkKLQkJCQlyYyA9IC1FTk9ERVY7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQl9Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU1RPUDogewotCQlyYyA9IGF1ZGFtcm5iX2luX2Rpc2FibGUoYXVkaW8pOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0ZMVVNIOiB7Ci0JCU1NX0RCRygiQVVESU9fRkxVU0hcbiIpOwotCQlhdWRpby0+cmZsdXNoID0gMTsKLQkJYXVkaW8tPndmbHVzaCA9IDE7Ci0JCWF1ZGFtcm5iX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWlmIChhdWRpby0+cnVubmluZykgewotCQkJYXVkYW1ybmJfZmx1c2hfY29tbWFuZChhdWRpbyk7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkhYXVkaW8tPndmbHVzaCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJTU1fRVJSKCJBVURJT19GTFVTSCBpbnRlcnJ1cHRlZFxuIik7Ci0JCQkJcmMgPSAtRUlOVFI7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6IHsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjZmc7Ci0JCW1lbXNldCgmY2ZnLCAwLCBzaXplb2YoY2ZnKSk7Ci0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkgewotCQkJY2ZnLmJ1ZmZlcl9zaXplID0gT1VUX0JVRkZFUl9TSVpFOwotCQkJY2ZnLmJ1ZmZlcl9jb3VudCA9IE9VVF9GUkFNRV9OVU07Ci0JCX0gZWxzZSB7Ci0JCQljZmcuYnVmZmVyX3NpemUgPSBhdWRpby0+YnVmZmVyX3NpemU7Ci0JCQljZmcuYnVmZmVyX2NvdW50ID0gRlJBTUVfTlVNOwotCQl9Ci0JCWNmZy5zYW1wbGVfcmF0ZSA9IGNvbnZlcnRfc2FtcF9pbmRleChhdWRpby0+c2FtcF9yYXRlKTsKLQkJY2ZnLmNoYW5uZWxfY291bnQgPSAxOwotCQljZmcudHlwZSA9IDA7Ci0JCWNmZy51bnVzZWRbMF0gPSAwOwotCQljZmcudW51c2VkWzFdID0gMDsKLQkJY2ZnLnVudXNlZFsyXSA9IDA7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmY2ZnLCBzaXplb2YoY2ZnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX1NUUkVBTV9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnIGNmZzsKLQkJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihjZmcpKTsKLQkJY2ZnLmJ1ZmZlcl9zaXplID0gYXVkaW8tPmJ1ZmZlcl9zaXplOwotCQljZmcuYnVmZmVyX2NvdW50ID0gRlJBTUVfTlVNOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY2ZnLCBzaXplb2YoY2ZnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX1NUUkVBTV9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnIGNmZzsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsICh2b2lkICopIGFyZywgc2l6ZW9mKGNmZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBBbGxvdyBvbmx5IHNpbmdsZSBmcmFtZSAqLwotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJCWlmIChjZmcuYnVmZmVyX3NpemUgIT0gKEZSQU1FX1NJWkUgLSA4KSkgewotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChjZmcuYnVmZmVyX3NpemUgIT0gKEFNUk5CX0ZSQU1FX1NJWkUgKyAxNCkpIHsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXVkaW8tPmJ1ZmZlcl9zaXplID0gY2ZnLmJ1ZmZlcl9zaXplOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIEFVRElPX0dFVF9BTVJOQl9FTkNfQ09ORklHOiB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZhdWRpby0+YW1ybmJfZW5jX2NmZywKLQkJCXNpemVvZihhdWRpby0+YW1ybmJfZW5jX2NmZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9BTVJOQl9FTkNfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYW1ybmJfZW5jX2NvbmZpZyBjZmc7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcgotCQkJKCZjZmcsICh2b2lkICopYXJnLCBzaXplb2YoY2ZnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfSBlbHNlCi0JCQlyYyA9IDA7Ci0JCWF1ZGlvLT5hbXJuYl9lbmNfY2ZnLnZvaWNlbWVtb2VuY3dlaWdodDEgPQotCQkJCQljZmcudm9pY2VtZW1vZW5jd2VpZ2h0MTsKLQkJYXVkaW8tPmFtcm5iX2VuY19jZmcudm9pY2VtZW1vZW5jd2VpZ2h0MiA9Ci0JCQkJCWNmZy52b2ljZW1lbW9lbmN3ZWlnaHQyOwotCQlhdWRpby0+YW1ybmJfZW5jX2NmZy52b2ljZW1lbW9lbmN3ZWlnaHQzID0KLQkJCQkJY2ZnLnZvaWNlbWVtb2VuY3dlaWdodDM7Ci0JCWF1ZGlvLT5hbXJuYl9lbmNfY2ZnLnZvaWNlbWVtb2VuY3dlaWdodDQgPQotCQkJCQljZmcudm9pY2VtZW1vZW5jd2VpZ2h0NDsKLQkJYXVkaW8tPmFtcm5iX2VuY19jZmcuZHR4X21vZGVfZW5hYmxlID0gY2ZnLmR0eF9tb2RlX2VuYWJsZTsKLQkJYXVkaW8tPmFtcm5iX2VuY19jZmcudGVzdF9tb2RlX2VuYWJsZSA9IGNmZy50ZXN0X21vZGVfZW5hYmxlOwotCQlhdWRpby0+YW1ybmJfZW5jX2NmZy5lbmNfbW9kZSA9IGNmZy5lbmNfbW9kZTsKLQkJLyogUnVuIHRpbWUgY2hhbmdlIG9mIFBhcmFtICovCi0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkYW1ybmJfaW5fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQljaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvX2Ftcm5iX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQl2b2lkICpkYXRhOwotCXVpbnQzMl90IGluZGV4OwotCXVpbnQzMl90IHNpemU7Ci0JaW50MzJfdCByYyA9IDA7Ci0Jc3RydWN0IGFtcm5iX2VuY29kZWRfbWV0YV9vdXQgbWV0YV9maWVsZDsKLQlzdHJ1Y3QgYXVkaW9fZnJhbWVfbnQgKm50X2ZyYW1lOwotCU1NX0RCRygiY291bnQgPSAlZFxuIiwgY291bnQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCi0JCQlhdWRpby0+d2FpdCwgKGF1ZGlvLT5pbl9jb3VudCA+IDApIHx8IGF1ZGlvLT5zdG9wcGVkIHx8Ci0JCQlhdWRpby0+cmZsdXNoKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCi0JCWlmIChhdWRpby0+cmZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChhdWRpby0+c3RvcHBlZCAmJiAhYXVkaW8tPmluX2NvdW50KSB7Ci0JCQlNTV9EQkcoIkRyaXZlciBpbiBzdG9wIHN0YXRlLCBObyBtb3JlIGJ1ZmZlciB0byByZWFkIik7Ci0JCQlyYyA9IDA7LyogRW5kIG9mIEZpbGUgKi8KLQkJCWJyZWFrOwotCQl9Ci0KLQkJaW5kZXggPSBhdWRpby0+aW5fdGFpbDsKLQkJZGF0YSA9ICh1aW50OF90ICopIGF1ZGlvLT5pbltpbmRleF0uZGF0YTsKLQkJc2l6ZSA9IGF1ZGlvLT5pbltpbmRleF0uc2l6ZTsKLQotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUwpIHsKLQkJCW50X2ZyYW1lID0gKHN0cnVjdCBhdWRpb19mcmFtZV9udCAqKShkYXRhIC0KLQkJCQkJc2l6ZW9mKHN0cnVjdCBhdWRpb19mcmFtZV9udCkpOwotCQkJbWVtY3B5KChjaGFyICopJm1ldGFfZmllbGQudGltZV9zdGFtcF9kd29yZF9sc3csCi0JCQkJKGNoYXIgKikmbnRfZnJhbWUtPnRpbWVfc3RhbXBfZHdvcmRfbHN3LAotCQkJCShzaXplb2Yoc3RydWN0IGFtcm5iX2VuY29kZWRfbWV0YV9vdXQpIC0gXAotCQkJCXNpemVvZih1aW50MTZfdCkpKTsKLQkJCW1ldGFfZmllbGQubWV0YWRhdGFfbGVuID0KLQkJCQkJc2l6ZW9mKHN0cnVjdCBhbXJuYl9lbmNvZGVkX21ldGFfb3V0KTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKGNoYXIgKilzdGFydCwgKGNoYXIgKikmbWV0YV9maWVsZCwKLQkJCQlzaXplb2Yoc3RydWN0IGFtcm5iX2VuY29kZWRfbWV0YV9vdXQpKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChudF9mcmFtZS0+bmZsYWdfbHN3ICYgMHgwMDAxKSB7Ci0JCQkJTU1fRVJSKCJyZWNpZXZlZCBFT1MgaW4gcmVhZCBjYWxsXG4iKTsKLQkJCQlhdWRpby0+ZW9zX2FjayA9IDE7Ci0JCQl9Ci0JCQlidWYgKz0gc2l6ZW9mKHN0cnVjdCBhbXJuYl9lbmNvZGVkX21ldGFfb3V0KTsKLQkJCWNvdW50IC09IHNpemVvZihzdHJ1Y3QgYW1ybmJfZW5jb2RlZF9tZXRhX291dCk7Ci0JCX0KLQkJaWYgKGNvdW50ID49IHNpemUpIHsKLQkJCS8qIG9yZGVyIHRoZSByZWFkcyBvbiB0aGUgYnVmZmVyICovCi0JCQlkbWFfY29oZXJlbnRfcG9zdF9vcHMoKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBkYXRhLCBzaXplKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJCWlmIChpbmRleCAhPSBhdWRpby0+aW5fdGFpbCkgewotCQkJCS8qIG92ZXJydW4gLS0gZGF0YSBpcwotCQkJCSAqIGludmFsaWQgYW5kIHdlIG5lZWQgdG8gcmV0cnkgKi8KLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9IDA7Ci0JCQlhdWRpby0+aW5fdGFpbCA9IChhdWRpby0+aW5fdGFpbCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCQkJYXVkaW8tPmluX2NvdW50LS07Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJCWNvdW50IC09IHNpemU7Ci0JCQlidWYgKz0gc2l6ZTsKLQkJCWlmICgoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUwpKSB7Ci0JCQkJaWYgKCFhdWRpby0+ZW9zX2FjaykgewotCQkJCQlNTV9EQkcoInNlbmRpbmcgcmVhZCBwdHIgY29tbWFuZCBcCi0JCQkJCQkJJWQgJWRcbiIsCi0JCQkJCQkJYXVkaW8tPmRzcF9jbnQsCi0JCQkJCQkJYXVkaW8tPmluX3RhaWwpOwotCQkJCQlhdWRhbXJuYl9pbl9kc3BfcmVhZF9idWZmZXIoYXVkaW8sCi0JCQkJCQkJYXVkaW8tPmRzcF9jbnQrKyk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJzaG9ydCByZWFkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQotCWlmIChidWYgPiBzdGFydCkKLQkJcmV0dXJuIGJ1ZiAtIHN0YXJ0OwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBhdWRyZWNfcGNtX3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW9fYW1ybmJfaW4gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlNTV9EQkcoIlxuIik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWlmICghYXVkaW8tPnJ1bm5pbmcpCi0JCWdvdG8gZG9uZTsKLQotCWlmIChuZWVkZWQgJiYgIWF1ZGlvLT53Zmx1c2gpIHsKLQkJLyogV2Ugd2VyZSBjYWxsZWQgZnJvbSB0aGUgY2FsbGJhY2sgYmVjYXVzZSB0aGUgRFNQCi0JCSAqIHJlcXVlc3RlZCBtb3JlIGRhdGEuICBOb3RlIHRoYXQgdGhlIERTUCBkb2VzIHdhbnQKLQkJICogbW9yZSBkYXRhLCBhbmQgaWYgYSBidWZmZXIgd2FzIGluLWZsaWdodCwgbWFyayBpdAotCQkgKiBhcyBhdmFpbGFibGUgKHNpbmNlIHRoZSBEU1AgbXVzdCBub3cgYmUgZG9uZSB3aXRoCi0JCSAqIGl0KS4KLQkJICovCi0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZikgewotCQkJTU1fREJHKCJmcmFtZSAlZCBmcmVlXG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCQkJZnJhbWUtPnVzZWQgPSAwOwotCQkJYXVkaW8tPm91dF90YWlsIF49IDE7Ci0JCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCX0KLQl9Ci0KLQlpZiAoYXVkaW8tPm91dF9uZWVkZWQpIHsKLQkJLyogSWYgdGhlIERTUCBjdXJyZW50bHkgd2FudHMgZGF0YSBhbmQgd2UgaGF2ZSBhCi0JCSAqIGJ1ZmZlciBhdmFpbGFibGUsIHdlIHdpbGwgc2VuZCBpdCBhbmQgcmVzZXQKLQkJICogdGhlIG5lZWRlZCBmbGFnLiAgV2UnbGwgbWFyayB0aGUgYnVmZmVyIGFzIGluLWZsaWdodAotCQkgKiBzbyB0aGF0IGl0IHdvbid0IGJlIHJlY3ljbGVkIHVudGlsIHRoZSBuZXh0IGJ1ZmZlcgotCQkgKiBpcyByZXF1ZXN0ZWQKLQkJICovCi0KLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQpIHsKLQkJCUJVR19PTihmcmFtZS0+dXNlZCA9PSAweGZmZmZmZmZmKTsKLQkJCWF1ZHJlY19wY21fYnVmZmVyX3B0cl9yZWZyZXNoKGF1ZGlvLAotCQkJCQkJIGF1ZGlvLT5vdXRfdGFpbCwKLQkJCQkJCSAgICBmcmFtZS0+dXNlZCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDB4ZmZmZmZmZmY7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCX0KLQl9Ci0gZG9uZToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBhdWRhbXJuYl9pbl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IGEsIGxvZmZfdCBiLCBpbnQgZGF0YXN5bmMpCi0KLXsKLQlzdHJ1Y3QgYXVkaW9fYW1ybmJfaW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludDMyX3QgcmMgPSAwOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoIWF1ZGlvLT5ydW5uaW5nIHx8IChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmVfbm9sb2NrOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJYXVkaW8tPndmbHVzaCk7Ci0JTU1fREJHKCJ3YWtlZCBvbiBieSBzb21lIGV2ZW50IGF1ZGlvLT53Zmx1c2ggPSAlZFxuIiwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci1kb25lX25vbG9jazoKLQlyZXR1cm4gcmM7Ci0KLX0KLQotaW50IGF1ZHJlY19hbXJuYl9wcm9jZXNzX2VvcyhzdHJ1Y3QgYXVkaW9fYW1ybmJfaW4gKmF1ZGlvLAotCQljb25zdCBjaGFyIF9fdXNlciAqYnVmX3N0YXJ0LCB1bnNpZ25lZCBzaG9ydCBtZmllbGRfc2l6ZSkKLXsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQlpbnQzMl90IHJjID0gMDsKLQotCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoYXVkaW8tPm91dF9uZWVkZWQgJiYKLQkJYXVkaW8tPm91dFswXS51c2VkID09IDAgJiYKLQkJYXVkaW8tPm91dFsxXS51c2VkID09IDApCi0JCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoY29weV9mcm9tX3VzZXIoZnJhbWUtPmRhdGEsIGJ1Zl9zdGFydCwgbWZpZWxkX3NpemUpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlmcmFtZS0+dXNlZCA9IG1maWVsZF9zaXplOwotCU1NX0RCRygiY29weWluZyBtZXRhX291dCBmcmFtZS0+dXNlZCA9ICVkXG4iLCBmcmFtZS0+dXNlZCk7Ci0JYXVkcmVjX3BjbV9zZW5kX2RhdGEoYXVkaW8sIDApOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGFtcm5iX2luX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCWNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW9fYW1ybmJfaW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQljaGFyICpjcHlfcHRyOwotCWludDMyX3QgcmMgPSAwLCBlb3NfY29uZGl0aW9uID0gQVVEUFJFUFJPQ19BTVJOQl9FT1NfTk9ORTsKLQl1bnNpZ25lZCBzaG9ydCBtZmllbGRfc2l6ZSA9IDA7Ci0JaW50MzJfdCB3cml0ZV9jb3VudCA9IDA7Ci0JTU1fREJHKCJjbnQ9JWRcbiIsIGNvdW50KTsKLQotCWlmIChjb3VudCAmIDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGF1ZGlvLT5tb2RlICE9IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0JLyogaWYgc3VwcGxpZWQgY291bnQgaXMgbW9yZSB0aGFuIGRyaXZlciBidWZmZXIgc2l6ZQotCSAqIHRoZW4gb25seSBjb3B5IGRyaXZlciBidWZmZXIgc2l6ZQotCSAqLwotCWlmIChjb3VudCA+IGZyYW1lLT5zaXplKQotCQljb3VudCA9IGZyYW1lLT5zaXplOwotCi0Jd3JpdGVfY291bnQgPSBjb3VudDsKLQljcHlfcHRyID0gZnJhbWUtPmRhdGE7Ci0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJICAgICAgKGZyYW1lLT51c2VkID09IDApCi0JCQkJCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWlmIChhdWRpby0+bWZpZWxkKSB7Ci0JCWlmIChidWYgPT0gc3RhcnQpIHsKLQkJCS8qIFByb2Nlc3NpbmcgYmVnaW5uaW5nIG9mIHVzZXIgYnVmZmVyICovCi0JCQlpZiAoX19nZXRfdXNlcihtZmllbGRfc2l6ZSwKLQkJCQkodW5zaWduZWQgc2hvcnQgX191c2VyICopIGJ1ZikpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0gZWxzZSBpZiAobWZpZWxkX3NpemUgPiBjb3VudCkgewotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJTU1fREJHKCJtZiBvZmZzZXRfdmFsICV4XG4iLCBtZmllbGRfc2l6ZSk7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCBtZmllbGRfc2l6ZSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCS8qIENoZWNrIGlmIEVPUyBmbGFnIGlzIHNldCBhbmQgYnVmZmVyIGhhcwotCQkJICogY29udGFpbnMganVzdCBtZXRhIGZpZWxkCi0JCQkgKi8KLQkJCWlmIChjcHlfcHRyW0FVRFBSRVBST0NfQU1STkJfRU9TX0ZMR19PRkZTRVRdICYKLQkJCQkJQVVEUFJFUFJPQ19BTVJOQl9FT1NfRkxHX01BU0spIHsKLQkJCQllb3NfY29uZGl0aW9uID0gQVVEUFJFUFJPQ19BTVJOQl9FT1NfU0VUOwotCQkJCU1NX0RCRygiRU9TIFNFVFxuIik7Ci0JCQkJaWYgKG1maWVsZF9zaXplID09IGNvdW50KSB7Ci0JCQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKLQkJCQkJZW9zX2NvbmRpdGlvbiA9IDA7Ci0JCQkJCWdvdG8gZXhpdDsKLQkJCQl9IGVsc2UKLQkJCQljcHlfcHRyW0FVRFBSRVBST0NfQU1STkJfRU9TX0ZMR19PRkZTRVRdICY9Ci0JCQkJCX5BVURQUkVQUk9DX0FNUk5CX0VPU19GTEdfTUFTSzsKLQkJCX0KLQkJCWNweV9wdHIgKz0gbWZpZWxkX3NpemU7Ci0JCQljb3VudCAtPSBtZmllbGRfc2l6ZTsKLQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKLQkJfSBlbHNlIHsKLQkJCW1maWVsZF9zaXplID0gMDsKLQkJCU1NX0RCRygiY29udGludW91cyBidWZmZXJcbiIpOwotCQl9Ci0JCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQl9Ci0JTU1fREJHKCJjb3B5aW5nIHRoZSBzdHJlYW0gY291bnQgPSAlZFxuIiwgY291bnQpOwotCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIGNvdW50KSkgewotCQlyYyA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotZXhpdDoKLQlmcmFtZS0+dXNlZCA9IGNvdW50OwotCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCWlmICghYXVkaW8tPmZsdXNoX2FjaykKLQkJYXVkcmVjX3BjbV9zZW5kX2RhdGEoYXVkaW8sIDApOwotCWVsc2UgewotCQlhdWRyZWNfcGNtX3NlbmRfZGF0YShhdWRpbywgMSk7Ci0JCWF1ZGlvLT5mbHVzaF9hY2sgPSAwOwotCX0KLQlpZiAoZW9zX2NvbmRpdGlvbiA9PSBBVURQUkVQUk9DX0FNUk5CX0VPU19TRVQpCi0JCXJjID0gYXVkcmVjX2Ftcm5iX3Byb2Nlc3NfZW9zKGF1ZGlvLCBzdGFydCwgbWZpZWxkX3NpemUpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXJldHVybiB3cml0ZV9jb3VudDsKLWVycm9yOgotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRhbXJuYl9pbl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpb19hbXJuYl9pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50MzJfdCBkbWFfc2l6ZSA9IDA7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGFtcm5iX2luX2Rpc2FibGUoYXVkaW8pOwotCWF1ZGFtcm5iX2luX2ZsdXNoKGF1ZGlvKTsKLQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHJlYyk7Ci0KLQlhdWRwcmVwcm9jX2FlbmNfZnJlZShhdWRpby0+ZW5jX2lkKTsKLQlhdWRpby0+YXVkcmVjID0gTlVMTDsKLQlhdWRpby0+b3BlbmVkID0gMDsKLQlpZiAoKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKSAmJiBcCi0JICAgKGF1ZGlvLT5vdXRfZGF0YSkpIHsKLQkJaW9uX3VubWFwX2tlcm5lbChhdWRpby0+Y2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotCQlhdWRpby0+b3V0X2RhdGEgPSBOVUxMOwotCX0KLQlpZiAoYXVkaW8tPmRhdGEpIHsKLQkJaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfVFVOTkVMKQotCQkJZG1hX3NpemUgPSBETUFTWjsKLQkJZWxzZQotCQkJZG1hX3NpemUgPSBOVF9ETUFTWjsKLQotCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLAotCQkJZG1hX3NpemUsIGF1ZGlvLT5kYXRhLCBhdWRpby0+cGh5cyk7Ci0JCWF1ZGlvLT5kYXRhID0gTlVMTDsKLQl9Ci0JaW9uX2NsaWVudF9kZXN0cm95KGF1ZGlvLT5jbGllbnQpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgYXVkaW9fYW1ybmJfaW4gdGhlX2F1ZGlvX2Ftcm5iX2luOwotCi1zdGF0aWMgaW50IGF1ZGFtcm5iX2luX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvX2Ftcm5iX2luICphdWRpbyA9ICZ0aGVfYXVkaW9fYW1ybmJfaW47Ci0JaW50MzJfdCByYzsKLQlpbnQgZW5jaWQ7Ci0JaW50MzJfdCBkbWFfc2l6ZSA9IDA7Ci0JaW50IGxlbiA9IDA7Ci0JdW5zaWduZWQgbG9uZyBpb25mbGFnID0gMDsKLQlpb25fcGh5c19hZGRyX3QgYWRkciA9IDA7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCA9IE5VTEw7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JaWYgKGF1ZGlvLT5vcGVuZWQpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWF1ZGlvLT5tb2RlID0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUw7Ci0JCWRtYV9zaXplID0gTlRfRE1BU1o7Ci0JCU1NX0RCRygiT3BlbmVkIGZvciBub24gdHVubmVsIG1vZGUgZW5jb2RpbmdcbiIpOwotCX0gZWxzZSBpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJYXVkaW8tPm1vZGUgPSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTDsKLQkJZG1hX3NpemUgPSBETUFTWjsKLQkJTU1fREJHKCJPcGVuZWQgZm9yIHR1bm5lbCBtb2RlIGVuY29kaW5nXG4iKTsKLQl9IGVsc2UgewotCQlNTV9FUlIoIkludmFsaWQgbW9kZVxuIik7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIFNldHRpbmdzIHdpbGwgYmUgcmUtY29uZmlnIGF0IEFVRElPX1NFVF9DT05GSUcsCi0JICogYnV0IGF0IGxlYXN0IHdlIG5lZWQgdG8gaGF2ZSBpbml0aWFsIGNvbmZpZwotCSAqLwotCWF1ZGlvLT5zYW1wX3JhdGUgPSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV84MDAwLAotCWF1ZGlvLT5zYW1wX3JhdGVfaW5kZXggPSBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzgwMDA7Ci0JYXVkaW8tPmNoYW5uZWxfbW9kZSA9IEFVRFJFQ19DTURfU1RFUkVPX01PREVfTU9OTzsKLQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUwpCi0JCQlhdWRpby0+YnVmZmVyX3NpemUgPSAoQU1STkJfRlJBTUVfU0laRSArIDE0KTsKLQllbHNlCi0JCQlhdWRpby0+YnVmZmVyX3NpemUgPSAoRlJBTUVfU0laRSAtIDgpOwotCWF1ZGlvLT5lbmNfdHlwZSA9IEFVRFJFQ19DTURfVFlQRV8wX0lOREVYX0FNUk5CIHwgYXVkaW8tPm1vZGU7Ci0KLQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJcmMgPSBhdWRtZ3Jfb3BlbigmYXVkaW8tPmF1ZG1ncik7Ci0JCWlmIChyYykKLQkJCWdvdG8gZG9uZTsKLQl9Ci0JYXVkaW8tPmFtcm5iX2VuY19jZmcudm9pY2VtZW1vZW5jd2VpZ2h0MSA9IDB4MDAwMDsKLQlhdWRpby0+YW1ybmJfZW5jX2NmZy52b2ljZW1lbW9lbmN3ZWlnaHQyID0gMHgwMDAwOwotCWF1ZGlvLT5hbXJuYl9lbmNfY2ZnLnZvaWNlbWVtb2VuY3dlaWdodDMgPSAweDQwMDA7Ci0JYXVkaW8tPmFtcm5iX2VuY19jZmcudm9pY2VtZW1vZW5jd2VpZ2h0NCA9IDB4MDAwMDsKLQlhdWRpby0+YW1ybmJfZW5jX2NmZy5kdHhfbW9kZV9lbmFibGUgPSAwOwotCWF1ZGlvLT5hbXJuYl9lbmNfY2ZnLnRlc3RfbW9kZV9lbmFibGUgPSAwOwotCWF1ZGlvLT5hbXJuYl9lbmNfY2ZnLmVuY19tb2RlID0gNzsKLQotCWVuY2lkID0gYXVkcHJlcHJvY19hZW5jX2FsbG9jKGF1ZGlvLT5lbmNfdHlwZSwgJmF1ZGlvLT5tb2R1bGVfbmFtZSwKLQkJCSZhdWRpby0+cXVldWVfaWRzKTsKLQlpZiAoZW5jaWQgPCAwKSB7Ci0JCU1NX0VSUigiTm8gZnJlZSBlbmNvZGVyIGF2YWlsYWJsZVxuIik7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQlhdWRpby0+ZW5jX2lkID0gZW5jaWQ7Ci0JcmMgPSBtc21fYWRzcF9nZXQoYXVkaW8tPm1vZHVsZV9uYW1lLCAmYXVkaW8tPmF1ZHJlYywKLQkJCSAgICZhdWRyZWNfYW1ybmJfYWRzcF9vcHMsIGF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJYXVkcHJlcHJvY19hZW5jX2ZyZWUoYXVkaW8tPmVuY19pZCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhdWRpby0+ZHNwX2NudCA9IDA7Ci0JYXVkaW8tPnN0b3BwZWQgPSAwOwotCWF1ZGlvLT53Zmx1c2ggPSAwOwotCWF1ZGlvLT5yZmx1c2ggPSAwOwotCWF1ZGlvLT5mbHVzaF9hY2sgPSAwOwotCi0JYXVkYW1ybmJfaW5fZmx1c2goYXVkaW8pOwotCWF1ZGFtcm5iX291dF9mbHVzaChhdWRpbyk7Ci0JLyogdXNlZCBkbWFfYWxsY29fY29oZXJlbnQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCA3eDI3ICovCi0JYXVkaW8tPmRhdGEgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgZG1hX3NpemUsCi0JCQkJICAgICAgICZhdWRpby0+cGh5cywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhdWRpby0+ZGF0YSkgewotCQlNTV9FUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSBETUEgYnVmZmVyXG4iKTsKLQkJZ290byBldnRfZXJyb3I7Ci0JfQotCi0JY2xpZW50ID0gbXNtX2lvbl9jbGllbnRfY3JlYXRlKFVJTlRfTUFYLCAiQXVkaW9fQU1STkJfaW5fY2xpZW50Iik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGNsaWVudCkpIHsKLQkJTU1fRVJSKCJVbmFibGUgdG8gY3JlYXRlIElPTiBjbGllbnRcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gY2xpZW50X2NyZWF0ZV9lcnJvcjsKLQl9Ci0JYXVkaW8tPmNsaWVudCA9IGNsaWVudDsKLQotCWF1ZGlvLT5vdXRfZGF0YSA9IE5VTEw7Ci0JaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKSB7Ci0JCU1NX0RCRygiYWxsb2NhdGluZyBCVUZGRVJfU0laRSAgJWRcbiIsIEJVRkZFUl9TSVpFKTsKLQkJaGFuZGxlID0gaW9uX2FsbG9jKGNsaWVudCwgQlVGRkVSX1NJWkUsCi0JCQkJU1pfNEssIElPTl9IRUFQKElPTl9BVURJT19IRUFQX0lEKSwgMCk7Ci0JCWlmIChJU19FUlJfT1JfTlVMTChoYW5kbGUpKSB7Ci0JCQlNTV9FUlIoIlVuYWJsZSB0byBjcmVhdGUgYWxsb2NhdGUgd3JpdGUgYnVmZmVyc1xuIik7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGlucHV0X2J1ZmZfYWxsb2NfZXJyb3I7Ci0JCX0KLQotCQlhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgPSBoYW5kbGU7Ci0KLQkJcmMgPSBpb25fcGh5cyhjbGllbnQgLCBoYW5kbGUsICZhZGRyLCAmbGVuKTsKLQkJaWYgKHJjKSB7Ci0JCQlNTV9FUlIoIkkvUCBidWZmZXJzOkludmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkJKHVuc2lnbmVkIGludCkgYWRkciwgKHVuc2lnbmVkIGludCkgbGVuKTsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gaW5wdXRfYnVmZl9nZXRfcGh5c19lcnJvcjsKLQkJfSBlbHNlIHsKLQkJCU1NX0lORk8oIkdvdCB2YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCQkodW5zaWduZWQgaW50KSBhZGRyLAotCQkJCSh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JCX0KLQkJYXVkaW8tPm91dF9waHlzID0gKGludDMyX3QpYWRkcjsKLQotCQlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKGNsaWVudCwKLQkJCWhhbmRsZSwgJmlvbmZsYWcpOwotCQlpZiAocmMpIHsKLQkJCU1NX0VSUigiY291bGQgbm90IGdldCBmbGFncyBmb3IgdGhlIGhhbmRsZVxuIik7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGlucHV0X2J1ZmZfZ2V0X2ZsYWdzX2Vycm9yOwotCQl9Ci0KLQkJYXVkaW8tPm1hcF92X3dyaXRlID0gaW9uX21hcF9rZXJuZWwoY2xpZW50LCBoYW5kbGUpOwotCQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl93cml0ZSkpIHsKLQkJCU1NX0VSUigiY291bGQgbm90IG1hcCB3cml0ZSBidWZmZXJzXG4iKTsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gaW5wdXRfYnVmZl9tYXBfZXJyb3I7Ci0JCX0KLQkJYXVkaW8tPm91dF9kYXRhID0gYXVkaW8tPm1hcF92X3dyaXRlOwotCQlNTV9EQkcoIndyaXRlIGJ1ZjogcGh5IGFkZHIgMHglMDh4IGtlcm5lbCBhZGRyIDB4JTA4eFxuIiwKLQkJCQkJKHVuc2lnbmVkIGludClhZGRyLAotCQkJCQkodW5zaWduZWQgaW50KWF1ZGlvLT5vdXRfZGF0YSk7Ci0KLQkJLyogSW5pdGlhbGl6ZSBidWZmZXIgKi8KLQkJYXVkaW8tPm91dFswXS5kYXRhID0gYXVkaW8tPm91dF9kYXRhICsgMDsKLQkJYXVkaW8tPm91dFswXS5hZGRyID0gYXVkaW8tPm91dF9waHlzICsgMDsKLQkJYXVkaW8tPm91dFswXS5zaXplID0gT1VUX0JVRkZFUl9TSVpFOwotCi0JCWF1ZGlvLT5vdXRbMV0uZGF0YSA9IGF1ZGlvLT5vdXRfZGF0YSArIE9VVF9CVUZGRVJfU0laRTsKLQkJYXVkaW8tPm91dFsxXS5hZGRyID0gYXVkaW8tPm91dF9waHlzICsgT1VUX0JVRkZFUl9TSVpFOwotCQlhdWRpby0+b3V0WzFdLnNpemUgPSBPVVRfQlVGRkVSX1NJWkU7Ci0KLQkJTU1fREJHKCJhdWRpby0+b3V0WzBdLmRhdGEgPSAlZCAgYXVkaW8tPm91dFsxXS5kYXRhID0gJWQiLAotCQkJCSh1aW50MzJfdClhdWRpby0+b3V0WzBdLmRhdGEsCi0JCQkJKHVpbnQzMl90KWF1ZGlvLT5vdXRbMV0uZGF0YSk7Ci0JCWF1ZGlvLT5tZmllbGQgPSBOVF9GUkFNRV9IRUFERVJfU0laRTsKLQkJYXVkaW8tPm91dF9mcmFtZV9jbnQrKzsKLQl9Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0JYXVkaW8tPm9wZW5lZCA9IDE7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotaW5wdXRfYnVmZl9tYXBfZXJyb3I6Ci1pbnB1dF9idWZmX2dldF9waHlzX2Vycm9yOgotaW5wdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I6Ci0JaW9uX2ZyZWUoY2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotaW5wdXRfYnVmZl9hbGxvY19lcnJvcjoKLQlpb25fY2xpZW50X2Rlc3Ryb3koY2xpZW50KTsKLWNsaWVudF9jcmVhdGVfZXJyb3I6Ci0JZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgZG1hX3NpemUsIGF1ZGlvLT5kYXRhLCBhdWRpby0+cGh5cyk7Ci1ldnRfZXJyb3I6Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRyZWMpOwotCi0JYXVkcHJlcHJvY19hZW5jX2ZyZWUoYXVkaW8tPmVuY19pZCk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBhdWRhbXJuYl9pbl9vcGVuLAotCS5yZWxlYXNlCT0gYXVkYW1ybmJfaW5fcmVsZWFzZSwKLQkucmVhZAkJPSBhdWRhbXJuYl9pbl9yZWFkLAotCS53cml0ZQkJPSBhdWRhbXJuYl9pbl93cml0ZSwKLQkuZnN5bmMJCT0gYXVkYW1ybmJfaW5fZnN5bmMsCi0JLnVubG9ja2VkX2lvY3RsCT0gYXVkYW1ybmJfaW5faW9jdGwsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRhbXJuYl9pbl9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fYW1ybmJfaW4iLAotCS5mb3BzCT0gJmF1ZGlvX2ZvcHMsCi19OwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgc3NpemVfdCBhdWRhbXJuYl9pbl9kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGFtcm5iX2luX2RlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNvbnN0IGludDMyX3QgZGVidWdfYnVmbWF4ID0gMTAyNDsKLQlzdGF0aWMgY2hhciBidWZmZXJbMTAyNF07Ci0JaW50MzJfdCBuID0gMCwgaTsKLQlzdHJ1Y3QgYXVkaW9fYW1ybmJfaW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCW4gPSBzY25wcmludGYoYnVmZmVyLCBkZWJ1Z19idWZtYXgsICJvcGVuZWQgJWRcbiIsIGF1ZGlvLT5vcGVuZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiZW5hYmxlZCAlZFxuIiwgYXVkaW8tPmVuYWJsZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkic3RvcHBlZCAlZFxuIiwgYXVkaW8tPnN0b3BwZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiYXVkcmVjX29ial9pZHggJWRcbiIsIGF1ZGlvLT5hdWRyZWNfb2JqX2lkeCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJkc3BfY250ICVkIFxuIiwgYXVkaW8tPmRzcF9jbnQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiaW5fY291bnQgJWQgXG4iLCBhdWRpby0+aW5fY291bnQpOwotCWZvciAoaSA9IDA7IGkgPCBGUkFNRV9OVU07IGkrKykKLQkJbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJhdWRpby0+aW5bJWRdLnNpemUgJWQgXG4iLCBpLCBhdWRpby0+aW5baV0uc2l6ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JLyogRm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgb25seSB1c2VmdWwgZm9yIGRlYnVnZ2luZyB3aGVuCi0JICogd2hlbiByZWNvcmQgaGFsdHMgdW5leHBlY3RlZGx5LiBUaHVzLCBubyBtdXR1YWwgZXhjbHVzaW9uCi0JICogZW5mb3JjZWQKLQkgKi8KLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInJ1bm5pbmcgJWQgXG4iLCBhdWRpby0+cnVubmluZyk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJidWZmZXJfc2l6ZSAlZCBcbiIsIGF1ZGlvLT5idWZmZXJfc2l6ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJpbl9oZWFkICVkIFxuIiwgYXVkaW8tPmluX2hlYWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiaW5fdGFpbCAlZCBcbiIsIGF1ZGlvLT5pbl90YWlsKTsKLQlidWZmZXJbbl0gPSAwOwotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCBidWZmZXIsIG4pOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRhbXJuYl9pbl9kZWJ1Z19mb3BzID0gewotCS5yZWFkID0gYXVkYW1ybmJfaW5fZGVidWdfcmVhZCwKLQkub3BlbiA9IGF1ZGFtcm5iX2luX2RlYnVnX29wZW4sCi19OwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGFtcm5iX2luX2luaXQodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7Ci0jZW5kaWYKLQotCW11dGV4X2luaXQoJnRoZV9hdWRpb19hbXJuYl9pbi5sb2NrKTsKLQltdXRleF9pbml0KCZ0aGVfYXVkaW9fYW1ybmJfaW4ucmVhZF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmdGhlX2F1ZGlvX2Ftcm5iX2luLmRzcF9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfYXVkaW9fYW1ybmJfaW4ud2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdGhlX2F1ZGlvX2Ftcm5iX2luLndhaXRfZW5hYmxlKTsKLQltdXRleF9pbml0KCZ0aGVfYXVkaW9fYW1ybmJfaW4ud3JpdGVfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdGhlX2F1ZGlvX2Ftcm5iX2luLndyaXRlX3dhaXQpOwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgibXNtX2Ftcm5iX2luIiwgU19JRlJFRyB8IFNfSVJVR08sIE5VTEwsCi0JCSh2b2lkICopICZ0aGVfYXVkaW9fYW1ybmJfaW4sICZhdWRhbXJuYl9pbl9kZWJ1Z19mb3BzKTsKLQotCWlmIChJU19FUlIoZGVudHJ5KSkKLQkJTU1fRVJSKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7Ci0jZW5kaWYKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkYW1ybmJfaW5fbWlzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdWRhbXJuYl9pbl9leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZhdWRhbXJuYl9pbl9taXNjKTsKLX0KLQotbW9kdWxlX2luaXQoYXVkYW1ybmJfaW5faW5pdCk7Ci1tb2R1bGVfZXhpdChhdWRhbXJuYl9pbl9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gQU1STkIgRW5jb2RlciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX2FtcndiLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19hbXJ3Yi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjNhMWFiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX2FtcndiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzc0ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX2FtcndiLmMKLSAqCi0gKiBhbXJ3YiBhdWRpbyBkZWNvZGVyIGRldmljZQotICoKLSAqIEJhc2VkIG9uIHRoZSBtcDMgbmF0aXZlIGRyaXZlciBpbiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19tcDMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMS0yMDEyIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIEFsbCBzb3VyY2UgY29kZSBpbiB0aGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGV4Y2VwdAotICogd2hlcmUgaW5kaWNhdGVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKLSAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGZpbmQgaXQgYXQgaHR0cDovL3d3dy5mc2Yub3JnCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9lYXJseXN1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtb3J5X2FsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgotCi0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXUuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11X2RvbWFpbnMuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHBjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBsYXljbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBsYXltc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1cm10Y21kaS5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9tZW10eXBlcy5oPgotCi0jaW5jbHVkZSAiYXVkbWdyLmgiCi0KLSNkZWZpbmUgQlVGU1ogNDExMCAvKiBIb2xkIG1pbmltdW0gNzAwbXMgdm9pY2UgZGF0YSBhbmQgMTQgYnl0ZXMgb2YgbWV0YSBpbiovCi0jZGVmaW5lIERNQVNaIChCVUZTWiAqIDIpCi0KLSNkZWZpbmUgQVVEUExBWV9JTlZBTElEX1JFQURfUFRSX09GRlNFVAkweEZGRkYKLSNkZWZpbmUgQVVEREVDX0RFQ19BTVJXQiAxMQotCi0jZGVmaW5lIFBDTV9CVUZTWl9NSU4gODIxNiAvKiAxMDBtcyB3b3J0aCBvZiBkYXRhIGFuZCAyNCBieXRlcyBvZiBtZXRhIG91dCovCi0jZGVmaW5lIFBDTV9CVUZfTUFYX0NPVU5UIDUJLyogRFNQIG9ubHkgYWNjZXB0cyA1IGJ1ZmZlcnMgYXQgbW9zdAotCQkJCSAgIGJ1dCBzdXBwb3J0IDIgYnVmZmVycyBjdXJyZW50bHkgKi8KLSNkZWZpbmUgUk9VVElOR19NT0RFX0ZUUlQgMQotI2RlZmluZSBST1VUSU5HX01PREVfUlQgMgotLyogRGVjb2RlciBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBBVURQUFRBU0sgKi8KLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfU0xFRVAJMAotI2RlZmluZQkgQVVEUFBfREVDX1NUQVRVU19JTklUICAxCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX0NGRyAgIDIKLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfUExBWSAgMwotCi0jZGVmaW5lIEFVREFNUldCX01FVEFGSUVMRF9NQVNLIDB4RkZGRjAwMDAKLSNkZWZpbmUgQVVEQU1SV0JfRU9TX0ZMR19PRkZTRVQgMHgwQSAvKiBPZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgYnVmZmVyICovCi0jZGVmaW5lIEFVREFNUldCX0VPU19GTEdfTUFTSyAweDAxCi0jZGVmaW5lIEFVREFNUldCX0VPU19OT05FIDB4MCAvKiBObyBFT1MgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgQVVEQU1SV0JfRU9TX1NFVCAweDEgLyogRU9TIHNldCBpbiBtZXRhIGZpZWxkICovCi0KLSNkZWZpbmUgQVVEQU1SV0JfRVZFTlRfTlVNIDEwIC8qIERlZmF1bHQgbnVtYmVyIG9mIHByZS1hbGxvY2F0ZWQgZXZlbnQgcGt0cyAqLwotCi1zdHJ1Y3QgYnVmZmVyIHsKLQl2b2lkICpkYXRhOwotCXVuc2lnbmVkIHNpemU7Ci0JdW5zaWduZWQgdXNlZDsJCS8qIElucHV0IHVzYWdlIGFjdHVhbCBEU1AgcHJvZHVjZWQgUENNIHNpemUgICovCi0JdW5zaWduZWQgYWRkcjsKLQl1bnNpZ25lZCBzaG9ydCBtZmllbGRfc3o7IC8qb25seSB1c2VmdWwgZm9yIGRhdGEgaGFzIG1ldGEgZmllbGQgKi8KLX07Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RydWN0IGF1ZGFtcndiX3N1c3BlbmRfY3RsIHsKLQlzdHJ1Y3QgZWFybHlfc3VzcGVuZCBub2RlOwotCXN0cnVjdCBhdWRpbyAqYXVkaW87Ci19OwotI2VuZGlmCi0KLXN0cnVjdCBhdWRhbXJ3Yl9ldmVudHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JaW50IGV2ZW50X3R5cGU7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLX07Ci0KLXN0cnVjdCBhdWRpbyB7Ci0Jc3RydWN0IGJ1ZmZlciBvdXRbMl07Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JdWludDhfdCBvdXRfaGVhZDsKLQl1aW50OF90IG91dF90YWlsOwotCXVpbnQ4X3Qgb3V0X25lZWRlZDsJLyogbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGRzcCBpcyB3YWl0aW5nIGZvciAqLwotCi0JYXRvbWljX3Qgb3V0X2J5dGVzOwotCi0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IG11dGV4IHdyaXRlX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd3JpdGVfd2FpdDsKLQotCS8qIEhvc3QgUENNIHNlY3Rpb24gKi8KLQlzdHJ1Y3QgYnVmZmVyIGluW1BDTV9CVUZfTUFYX0NPVU5UXTsKLQlzdHJ1Y3QgbXV0ZXggcmVhZF9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHJlYWRfd2FpdDsJLyogV2FpdCBxdWV1ZSBmb3IgcmVhZCAqLwotCWNoYXIgKnJlYWRfZGF0YTsJLyogcG9pbnRlciB0byByZWFkZXIgYnVmZmVyICovCi0JaW50MzJfdCByZWFkX3BoeXM7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgcmVhZGVyIGJ1ZmZlciAqLwotCXVpbnQ4X3QgcmVhZF9uZXh0OwkvKiBpbmRleCB0byBpbnB1dCBidWZmZXJzIHRvIGJlIHJlYWQgbmV4dCAqLwotCXVpbnQ4X3QgZmlsbF9uZXh0OwkvKiBpbmRleCB0byBidWZmZXIgdGhhdCBEU1Agc2hvdWxkIGJlIGZpbGxpbmcgKi8KLQl1aW50OF90IHBjbV9idWZfY291bnQ7CS8qIG51bWJlciBvZiBwY20gYnVmZmVyIGFsbG9jYXRlZCAqLwotCS8qIC0tLS0gRW5kIG9mIEhvc3QgUENNIHNlY3Rpb24gKi8KLQotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKmF1ZHBsYXk7Ci0Jc3RydWN0IGF1ZG1nciBhdWRtZ3I7Ci0KLQkvKiBjb25maWd1cmF0aW9uIHRvIHVzZSBvbiBuZXh0IGVuYWJsZSAqLwotCXVpbnQzMl90IG91dF9zYW1wbGVfcmF0ZTsKLQl1aW50MzJfdCBvdXRfY2hhbm5lbF9tb2RlOwotCi0JLyogZGF0YSBhbGxvY2F0ZWQgZm9yIHZhcmlvdXMgYnVmZmVycyAqLwotCWNoYXIgKmRhdGE7Ci0JaW50MzJfdCBwaHlzOyAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHdyaXRlIGJ1ZmZlciAqLwotCXZvaWQgKm1hcF92X3JlYWQ7Ci0Jdm9pZCAqbWFwX3Zfd3JpdGU7Ci0JaW50IG1maWVsZDsgLyogbWV0YSBmaWVsZCBlbWJlZGRlZCBpbiBkYXRhICovCi0JaW50IHJmbHVzaDsgLyogUmVhZCAgZmx1c2ggKi8KLQlpbnQgd2ZsdXNoOyAvKiBXcml0ZSBmbHVzaCAqLwotCWludCBvcGVuZWQ7Ci0JaW50IGVuYWJsZWQ7Ci0JaW50IHJ1bm5pbmc7Ci0JaW50IHN0b3BwZWQ7CS8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQlpbnQgcGNtX2ZlZWRiYWNrOwotCWludCBidWZfcmVmcmVzaDsKLQlpbnQgcm10X3Jlc291cmNlX3JlbGVhc2VkOwotCWludCB0ZW9zOyAvKiB2YWxpZCBvbmx5IGlmIHR1bm5lbCBtb2RlICYgbm8gZGF0YSBsZWZ0IGZvciBkZWNvZGVyICovCi0JZW51bSBtc21fYXVkX2RlY29kZXJfc3RhdGUgZGVjX3N0YXRlOwkvKiBSZXByZXNlbnRzIGRlY29kZXIgc3RhdGUgKi8KLQlpbnQgcmVzZXJ2ZWQ7IC8qIEEgYnl0ZSBpcyBiZWluZyByZXNlcnZlZCAqLwotCWNoYXIgcnN2X2J5dGU7IC8qIEhhbmRsZSBvZGQgbGVuZ3RoIHVzZXIgZGF0YSAqLwotCi0JY29uc3QgY2hhciAqbW9kdWxlX25hbWU7Ci0JdW5zaWduZWQgcXVldWVfaWQ7Ci0JdWludDE2X3QgZGVjX2lkOwotCXVpbnQzMl90IHJlYWRfcHRyX29mZnNldDsKLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0Jc3RydWN0IGF1ZGFtcndiX3N1c3BlbmRfY3RsIHN1c3BlbmRfY3RsOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7Ci0jZW5kaWYKLQotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmcmVlX2V2ZW50X3F1ZXVlOwotCXN0cnVjdCBsaXN0X2hlYWQgZXZlbnRfcXVldWU7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgZXZlbnRfd2FpdDsKLQlzcGlubG9ja190IGV2ZW50X3F1ZXVlX2xvY2s7Ci0Jc3RydWN0IG11dGV4IGdldF9ldmVudF9sb2NrOwotCWludCBldmVudF9hYm9ydDsKLQotCWludCBlcV9lbmFibGU7Ci0JaW50IGVxX25lZWRzX2NvbW1pdDsKLQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfZXFhbGl6ZXIgZXE7Ci0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3ZvbHVtZSB2b2xfcGFuOwotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQ7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmlucHV0X2J1ZmZfaGFuZGxlOwotCXN0cnVjdCBpb25faGFuZGxlICpvdXRwdXRfYnVmZl9oYW5kbGU7Ci19OwotCi1zdGF0aWMgaW50IGF1ZGRlY19kc3BfY29uZmlnKHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCBlbmFibGUpOwotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkYW1yd2Jfc2VuZF9kYXRhKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVuc2lnbmVkIG5lZWRlZCk7Ci1zdGF0aWMgdm9pZCBhdWRhbXJ3Yl9jb25maWdfaG9zdHBjbShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZGFtcndiX2J1ZmZlcl9yZWZyZXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkYW1yd2JfZHNwX2V2ZW50KHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGlkLCB1aW50MTZfdCAqbXNnKTsKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RhdGljIHZvaWQgYXVkYW1yd2JfcG9zdF9ldmVudChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCk7Ci0jZW5kaWYKLQotc3RhdGljIGludCBybXRfcHV0X3Jlc291cmNlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZF9jb2RlY19jb25maWdfY21kIGNtZDsKLQl1bnNpZ25lZCBzaG9ydCBjbGllbnRfaWR4OwotCi0JY21kLmNtZF9pZCA9IFJNX0NNRF9BVURfQ09ERUNfQ0ZHOwotCWNtZC5jbGllbnRfaWQgPSBSTV9BVURfQ0xJRU5UX0lEOwotCWNtZC50YXNrX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuZW5hYmxlID0gUk1UX0RJU0FCTEU7Ci0JY21kLmRlY190eXBlID0gQVVEREVDX0RFQ19BTVJXQjsKLQljbGllbnRfaWR4ID0gKChjbWQuY2xpZW50X2lkIDw8IDgpIHwgY21kLnRhc2tfaWQpOwotCi0JcmV0dXJuIHB1dF9hZHNwX3Jlc291cmNlKGNsaWVudF9pZHgsICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBybXRfZ2V0X3Jlc291cmNlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZF9jb2RlY19jb25maWdfY21kIGNtZDsKLQl1bnNpZ25lZCBzaG9ydCBjbGllbnRfaWR4OwotCi0JY21kLmNtZF9pZCA9IFJNX0NNRF9BVURfQ09ERUNfQ0ZHOwotCWNtZC5jbGllbnRfaWQgPSBSTV9BVURfQ0xJRU5UX0lEOwotCWNtZC50YXNrX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuZW5hYmxlID0gUk1UX0VOQUJMRTsKLQljbWQuZGVjX3R5cGUgPSBBVURERUNfREVDX0FNUldCOwotCWNsaWVudF9pZHggPSAoKGNtZC5jbGllbnRfaWQgPDwgOCkgfCBjbWQudGFza19pZCk7Ci0KLQlyZXR1cm4gZ2V0X2Fkc3BfcmVzb3VyY2UoY2xpZW50X2lkeCwgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkYW1yd2JfZW5hYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZG1ncl9jb25maWcgY2ZnOwotCWludCByYzsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JaWYgKGF1ZGlvLT5ybXRfcmVzb3VyY2VfcmVsZWFzZWQgPT0gMSkgewotCQlhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID0gMDsKLQkJcmMgPSBybXRfZ2V0X3Jlc291cmNlKGF1ZGlvKTsKLQkJaWYgKHJjKSB7Ci0JCQlNTV9FUlIoIkFEU1AgcmVzb3VyY2VzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBBTVJXQiBcCi0JCQkJc2Vzc2lvbiAweCUwOHggb24gZGVjb2RlcjogJWRcbiBJZ25vcmluZyBcCi0JCQkJZXJyb3IgYW5kIGdvaW5nIGFoZWFkIHdpdGggdGhlIHBsYXliYWNrXG4iLAotCQkJCShpbnQpYXVkaW8sIGF1ZGlvLT5kZWNfaWQpOwotCQl9Ci0JfQotCi0JYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCWF1ZGlvLT5vdXRfdGFpbCA9IDA7Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCi0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spIHsKLQkJY2ZnLnR4X3JhdGUgPSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV9OT05FOwotCQljZmcucnhfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzQ4MDAwOwotCQljZmcuZGVmX21ldGhvZCA9IFJQQ19BVURfREVGX01FVEhPRF9QTEFZQkFDSzsKLQkJY2ZnLmNvZGVjID0gUlBDX0FVRF9ERUZfQ09ERUNfQU1SX1dCOwotCQljZmcuc25kX21ldGhvZCA9IFJQQ19TTkRfTUVUSE9EX01JREk7Ci0KLQkJcmMgPSBhdWRtZ3JfZW5hYmxlKCZhdWRpby0+YXVkbWdyLCAmY2ZnKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJbXNtX2Fkc3BfZHVtcChhdWRpby0+YXVkcGxheSk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0KLQlpZiAobXNtX2Fkc3BfZW5hYmxlKGF1ZGlvLT5hdWRwbGF5KSkgewotCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRwbGF5KSBmYWlsZWRcbiIpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykKLQkJCWF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKGF1ZHBwX2VuYWJsZShhdWRpby0+ZGVjX2lkLCBhdWRhbXJ3Yl9kc3BfZXZlbnQsIGF1ZGlvKSkgewotCQlNTV9FUlIoImF1ZHBwX2VuYWJsZSgpIGZhaWxlZFxuIik7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykKLQkJCWF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWF1ZGlvLT5lbmFibGVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGFtcndiX2Rpc2FibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JaWYgKGF1ZGlvLT5lbmFibGVkKSB7Ci0JCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCQlhdWRkZWNfZHNwX2NvbmZpZyhhdWRpbywgMCk7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXQsCi0JCQkJYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORSwKLQkJCQltc2Vjc190b19qaWZmaWVzKE1TTV9BVURfREVDT0RFUl9XQUlUX01TKSk7Ci0JCWlmIChyYyA9PSAwKQotCQkJcmMgPSAtRVRJTUVET1VUOwotCQllbHNlIGlmIChhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlhdWRwcF9kaXNhYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spIHsKLQkJCXJjID0gYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQltc21fYWRzcF9kdW1wKGF1ZGlvLT5hdWRwbGF5KTsKLQkJfQotCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCXJtdF9wdXRfcmVzb3VyY2UoYXVkaW8pOwotCQlhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID0gMTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZGFtcndiX3VwZGF0ZV9wY21fYnVmX2VudHJ5KHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCXVpbnQzMl90ICpwYXlsb2FkKQotewotCXVpbnQ4X3QgaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChhdWRpby0+cmZsdXNoKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGF5bG9hZFsxXTsgaW5kZXgrKykgewotCQlpZiAoYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHIgPT0KLQkJICAgIHBheWxvYWRbMiArIGluZGV4ICogMl0pIHsKLQkJCU1NX0RCRygiaW5bJWRdIHJlYWR5XG4iLCBhdWRpby0+ZmlsbF9uZXh0KTsKLQkJCWF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS51c2VkID0KLQkJCSAgICBwYXlsb2FkWzMgKyBpbmRleCAqIDJdOwotCQkJaWYgKCgrK2F1ZGlvLT5maWxsX25leHQpID09IGF1ZGlvLT5wY21fYnVmX2NvdW50KQotCQkJCWF1ZGlvLT5maWxsX25leHQgPSAwOwotCi0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoImV4cGVjdGVkPSV4IHJldD0leFxuIiwKLQkJCQkJYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHIsCi0JCQkJCXBheWxvYWRbMSArIGluZGV4ICogMl0pOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS51c2VkID09IDApIHsKLQkJYXVkYW1yd2JfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCX0gZWxzZSB7Ci0JCU1NX0RCRygicmVhZCBjYW5ub3Qga2VlcCB1cFxuIik7Ci0JCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDE7Ci0JfQotCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwbGF5X2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgc2l6ZV90IGxlbiwKLQkJCSAgICAgIHZvaWQgKCpnZXRldmVudCkgKHZvaWQgKnB0ciwgc2l6ZV90IGxlbikpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGRhdGE7Ci0JdWludDMyX3QgbXNnWzI4XTsKLQlnZXRldmVudChtc2csIHNpemVvZihtc2cpKTsKLQotCU1NX0RCRygibXNnX2lkPSV4XG4iLCBpZCk7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQTEFZX01TR19ERUNfTkVFRFNfREFUQToKLQkJYXVkYW1yd2Jfc2VuZF9kYXRhKGF1ZGlvLCAxKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBMQVlfTVNHX0JVRkZFUl9VUERBVEU6Ci0JCWF1ZGFtcndiX3VwZGF0ZV9wY21fYnVmX2VudHJ5KGF1ZGlvLCBtc2cpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigidW5leHBlY3RlZCBtZXNzYWdlIGZyb20gZGVjb2RlclxuIik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhdWRhbXJ3Yl9kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IHByaXZhdGU7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQUF9NU0dfU1RBVFVTX01TRzp7Ci0JCQl1bnNpZ25lZCBzdGF0dXMgPSBtc2dbMV07Ci0KLQkJCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfU0xFRVA6IHsKLQkJCQl1aW50MTZfdCByZWFzb24gPSBtc2dbMl07Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czpzbGVlcCByZWFzb249MHglMDR4XG4iLAotCQkJCQlyZWFzb24pOwotCQkJCWlmICgocmVhc29uID09IEFVRFBQX01TR19SRUFTT05fTUVNKQotCQkJCQl8fCAocmVhc29uID09Ci0JCQkJCUFVRFBQX01TR19SRUFTT05fTk9ERUNPREVSKSkgewotCQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9GQUlMVVJFOwotCQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJfSBlbHNlIGlmIChyZWFzb24gPT0gQVVEUFBfTVNHX1JFQVNPTl9OT05FKSB7Ci0JCQkJCS8qIGRlY29kZXIgaXMgaW4gZGlzYWJsZSBzdGF0ZSAqLwotCQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19JTklUOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IGluaXRcbiIpOwotCQkJCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQkJCQlhdWRwcF9jbWRfY2ZnX3JvdXRpbmdfbW9kZShhdWRpbyk7Ci0JCQkJZWxzZQotCQkJCQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKGF1ZGlvKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX0NGRzoKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBjZmdcbiIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX1BMQVk6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogcGxheVxuIik7Ci0JCQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJCQkJYXVkYW1yd2JfY29uZmlnX2hvc3RwY20oYXVkaW8pOwotCQkJCQlhdWRhbXJ3Yl9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JCQkJfQotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfU1VDQ0VTUzsKLQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCU1NX0RCRygidW5rbm93biBkZWNvZGVyIHN0YXR1c1xuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVEUFBfTVNHX0NGR19NU0c6Ci0JCWlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9FTkEpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBFTkFCTEVcbiIpOwotCQkJYXVkZGVjX2RzcF9jb25maWcoYXVkaW8sIDEpOwotCQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAxOwotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3Bhbik7Ci0JCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsCWF1ZGlvLT5lcV9lbmFibGUsCi0JCQkJCQkJCSZhdWRpby0+ZXEpOwotCQkJYXVkcHBfYXZzeW5jKGF1ZGlvLT5kZWNfaWQsIDIyMDUwKTsKLQkJfSBlbHNlIGlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9ESVMpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBESVNBQkxFXG4iKTsKLQkJCWF1ZHBwX2F2c3luYyhhdWRpby0+ZGVjX2lkLCAwKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyAlZD9cbiIsIG1zZ1swXSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfUk9VVElOR19BQ0s6Ci0JCU1NX0RCRygiUk9VVElOR19BQ0sgbW9kZT0lZFxuIiwgbXNnWzFdKTsKLQkJYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhhdWRpbyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX0ZMVVNIX0FDSzoKLQkJTU1fREJHKCJGTFVTSF9BQ0tcbiIpOwotCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCQlhdWRhbXJ3Yl9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX1BDTURNQU1JU1NFRDoKLQkJTU1fREJHKCJQQ01ETUFNSVNTRURcbiIpOwotCQlhdWRpby0+dGVvcyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fREJHKCJVTktOT1dOICglZClcbiIsIGlkKTsKLQl9Ci0KLX0KLQotc3RydWN0IG1zbV9hZHNwX29wcyBhdWRwbGF5X2Fkc3Bfb3BzX2FtcndiID0gewotCS5ldmVudCA9IGF1ZHBsYXlfZHNwX2V2ZW50LAotfTsKLQotI2RlZmluZSBhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCBjbWQsIGxlbikgXAotCW1zbV9hZHNwX3dyaXRlKGF1ZGlvLT5hdWRwbGF5LCBhdWRpby0+cXVldWVfaWQsIFwKLQkJCWNtZCwgbGVuKQotCi1zdGF0aWMgaW50IGF1ZGRlY19kc3BfY29uZmlnKHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0JdTE2IGNmZ19kZWNfY21kW0FVRFBQX0NNRF9DRkdfREVDX1RZUEVfTEVOIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KV07Ci0KLQltZW1zZXQoY2ZnX2RlY19jbWQsIDAsIHNpemVvZihjZmdfZGVjX2NtZCkpOwotCWNmZ19kZWNfY21kWzBdID0gQVVEUFBfQ01EX0NGR19ERUNfVFlQRTsKLQlpZiAoZW5hYmxlKQotCQljZmdfZGVjX2NtZFsxICsgYXVkaW8tPmRlY19pZF0gPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCUFVRFBQX0NNRF9FTkFfREVDX1YgfCBBVURERUNfREVDX0FNUldCOwotCWVsc2UKLQkJY2ZnX2RlY19jbWRbMSArIGF1ZGlvLT5kZWNfaWRdID0gQVVEUFBfQ01EX1VQREFUREVfQ0ZHX0RFQyB8Ci0JCQlBVURQUF9DTURfRElTX0RFQ19WOwotCi0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUxKCZjZmdfZGVjX2NtZCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19hbXJ3YiBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jb21tb24uY21kX2lkID0gQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNUzsKLQljbWQuY29tbW9uLmxlbmd0aCA9IEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVNfQU1SV0JfTEVOOwotCWNtZC5jb21tb24uZGVjX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuY29tbW9uLmlucHV0X3NhbXBsaW5nX2ZyZXF1ZW5jeSA9IGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGU7Ci0JY21kLnN0ZXJlb19jZmcgPSBhdWRpby0+b3V0X2NoYW5uZWxfbW9kZTsKLQlhdWRwcF9zZW5kX3F1ZXVlMigmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9yb3V0aW5nX21vZGUgY21kOwotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUFBfQ01EX1JPVVRJTkdfTU9ERTsKLQljbWQub2JqZWN0X251bWJlciA9IGF1ZGlvLT5kZWNfaWQ7Ci0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfRlRSVDsKLQllbHNlCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfUlQ7Ci0KLQlhdWRwcF9zZW5kX3F1ZXVlMSgmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcGxheV9kc3Bfc2VuZF9kYXRhX2F2YWlsKHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCQkJICAgICAgIHVuc2lnbmVkIGlkeCwgdW5zaWduZWQgbGVuKQotewotCXN0cnVjdCBhdWRwbGF5X2NtZF9iaXRzdHJlYW1fZGF0YV9hdmFpbF9udDIgY21kOwotCi0JY21kLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0JJVFNUUkVBTV9EQVRBX0FWQUlMX05UMjsKLQlpZiAoYXVkaW8tPm1maWVsZCkKLQkJY21kLmRlY29kZXJfaWQgPSBBVURBTVJXQl9NRVRBRklFTERfTUFTSyB8Ci0JCQkoYXVkaW8tPm91dFtpZHhdLm1maWVsZF9zeiA+PiAxKTsKLQllbHNlCi0JCWNtZC5kZWNvZGVyX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuYnVmX3B0ciA9IGF1ZGlvLT5vdXRbaWR4XS5hZGRyOwotCWNtZC5idWZfc2l6ZSA9IGxlbiAvIDI7Ci0JY21kLnBhcnRpdGlvbl9udW1iZXIgPSAwOwotCXJldHVybiBhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFtcndiX2J1ZmZlcl9yZWZyZXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2J1ZmZlcl9yZWZyZXNoIHJlZnJlc2hfY21kOwotCi0JcmVmcmVzaF9jbWQuY21kX2lkID0gQVVEUExBWV9DTURfQlVGRkVSX1JFRlJFU0g7Ci0JcmVmcmVzaF9jbWQubnVtX2J1ZmZlcnMgPSAxOwotCXJlZnJlc2hfY21kLmJ1ZjBfYWRkcmVzcyA9IGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyOwotCXJlZnJlc2hfY21kLmJ1ZjBfbGVuZ3RoID0gYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnNpemU7Ci0JcmVmcmVzaF9jbWQuYnVmX3JlYWRfY291bnQgPSAwOwotCU1NX0RCRygiYnVmMF9hZGRyPSV4IGJ1ZjBfbGVuPSVkXG4iLCByZWZyZXNoX2NtZC5idWYwX2FkZHJlc3MsCi0JCQlyZWZyZXNoX2NtZC5idWYwX2xlbmd0aCk7Ci0JKHZvaWQpYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJnJlZnJlc2hfY21kLCBzaXplb2YocmVmcmVzaF9jbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkYW1yd2JfY29uZmlnX2hvc3RwY20oc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfaHBjbV9idWZfY2ZnIGNmZ19jbWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWNmZ19jbWQuY21kX2lkID0gQVVEUExBWV9DTURfSFBDTV9CVUZfQ0ZHOwotCWNmZ19jbWQubWF4X2J1ZmZlcnMgPSBhdWRpby0+cGNtX2J1Zl9jb3VudDsKLQljZmdfY21kLmJ5dGVfc3dhcCA9IDA7Ci0JY2ZnX2NtZC5ob3N0cGNtX2NvbmZpZyA9ICgweDgwMDApIHwgKDB4NDAwMCk7Ci0JY2ZnX2NtZC5mZWVkYmFja19mcmVxdWVuY3kgPSAxOwotCWNmZ19jbWQucGFydGl0aW9uX251bWJlciA9IDA7Ci0JKHZvaWQpYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJmNmZ19jbWQsIHNpemVvZihjZmdfY21kKSk7Ci0KLX0KLQotc3RhdGljIHZvaWQgYXVkYW1yd2Jfc2VuZF9kYXRhKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVuc2lnbmVkIG5lZWRlZCkKLXsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWlmICghYXVkaW8tPnJ1bm5pbmcpCi0JCWdvdG8gZG9uZTsKLQotCWlmIChuZWVkZWQgJiYgIWF1ZGlvLT53Zmx1c2gpIHsKLQkJLyogV2Ugd2VyZSBjYWxsZWQgZnJvbSB0aGUgY2FsbGJhY2sgYmVjYXVzZSB0aGUgRFNQCi0JCSAqIHJlcXVlc3RlZCBtb3JlIGRhdGEuICBOb3RlIHRoYXQgdGhlIERTUCBkb2VzIHdhbnQKLQkJICogbW9yZSBkYXRhLCBhbmQgaWYgYSBidWZmZXIgd2FzIGluLWZsaWdodCwgbWFyayBpdAotCQkgKiBhcyBhdmFpbGFibGUgKHNpbmNlIHRoZSBEU1AgbXVzdCBub3cgYmUgZG9uZSB3aXRoCi0JCSAqIGl0KS4KLQkJICovCi0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZikgewotCQkJZnJhbWUtPnVzZWQgPSAwOwotCQkJYXVkaW8tPm91dF90YWlsIF49IDE7Ci0JCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCX0KLQl9Ci0KLQlpZiAoYXVkaW8tPm91dF9uZWVkZWQpIHsKLQkJLyogSWYgdGhlIERTUCBjdXJyZW50bHkgd2FudHMgZGF0YSBhbmQgd2UgaGF2ZSBhCi0JCSAqIGJ1ZmZlciBhdmFpbGFibGUsIHdlIHdpbGwgc2VuZCBpdCBhbmQgcmVzZXQKLQkJICogdGhlIG5lZWRlZCBmbGFnLiAgV2UnbGwgbWFyayB0aGUgYnVmZmVyIGFzIGluLWZsaWdodAotCQkgKiBzbyB0aGF0IGl0IHdvbid0IGJlIHJlY3ljbGVkIHVudGlsIHRoZSBuZXh0IGJ1ZmZlcgotCQkgKiBpcyByZXF1ZXN0ZWQKLQkJICovCi0KLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQpIHsKLQkJCUJVR19PTihmcmFtZS0+dXNlZCA9PSAweGZmZmZmZmZmKTsKLQkJCU1NX0RCRygiZnJhbWUgJWQgYnVzeVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJCWF1ZHBsYXlfZHNwX3NlbmRfZGF0YV9hdmFpbChhdWRpbywgYXVkaW8tPm91dF90YWlsLAotCQkJCQkJICAgIGZyYW1lLT51c2VkKTsKLQkJCWZyYW1lLT51c2VkID0gMHhmZmZmZmZmZjsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJfQotCX0KLSBkb25lOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHZvaWQgYXVkYW1yd2JfZmx1c2goc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWF1ZGlvLT5vdXRbMF0udXNlZCA9IDA7Ci0JYXVkaW8tPm91dFsxXS51c2VkID0gMDsKLQlhdWRpby0+b3V0X2hlYWQgPSAwOwotCWF1ZGlvLT5vdXRfdGFpbCA9IDA7Ci0JYXVkaW8tPnJlc2VydmVkID0gMDsKLQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9ieXRlcywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFtcndiX2ZsdXNoX3BjbV9idWYoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1aW50OF90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUENNX0JVRl9NQVhfQ09VTlQ7IGluZGV4KyspCi0JCWF1ZGlvLT5pbltpbmRleF0udXNlZCA9IDA7Ci0KLQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCWF1ZGlvLT5yZWFkX25leHQgPSAwOwotCWF1ZGlvLT5maWxsX25leHQgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhbXJ3Yl9pb3BvcnRfcmVzZXQoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQkvKiBNYWtlIHN1cmUgcmVhZC93cml0ZSB0aHJlYWQgYXJlIGZyZWUgZnJvbQotCSAqIHNsZWVwIGFuZCBrbm93aW5nIHRoYXQgc3lzdGVtIGlzIG5vdCBhYmxlCi0JICogdG8gcHJvY2VzcyBpbyByZXF1ZXN0IGF0IHRoZSBtb21lbnQKLQkgKi8KLQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCWF1ZGFtcndiX2ZsdXNoKGF1ZGlvKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlhdWRhbXJ3Yl9mbHVzaF9wY21fYnVmKGF1ZGlvKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotfQotCi1zdGF0aWMgaW50IGF1ZGFtcndiX2V2ZW50c19wZW5kaW5nKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZW1wdHk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQllbXB0eSA9ICFsaXN0X2VtcHR5KCZhdWRpby0+ZXZlbnRfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGVtcHR5IHx8IGF1ZGlvLT5ldmVudF9hYm9ydDsKLX0KLQotc3RhdGljIHZvaWQgYXVkYW1yd2JfcmVzZXRfZXZlbnRfcXVldWUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBhdWRhbXJ3Yl9ldmVudCAqZHJ2X2V2dDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmV2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWRhbXJ3Yl9ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQkJa2ZyZWUoZHJ2X2V2dCk7Ci0JfQotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZGFtcndiX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIGxvbmcgYXVkYW1yd2JfcHJvY2Vzc19ldmVudF9yZXEoc3RydWN0IGF1ZGlvICphdWRpbywgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlsb25nIHJjOwotCXN0cnVjdCBtc21fYXVkaW9fZXZlbnQgdXNyX2V2dDsKLQlzdHJ1Y3QgYXVkYW1yd2JfZXZlbnQgKmRydl9ldnQgPSBOVUxMOwotCWludCB0aW1lb3V0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnVzcl9ldnQsIGFyZywgc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fZXZlbnQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQl0aW1lb3V0ID0gKGludCkgdXNyX2V2dC50aW1lb3V0X21zOwotCi0JaWYgKHRpbWVvdXQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCi0JCQlhdWRpby0+ZXZlbnRfd2FpdCwgYXVkYW1yd2JfZXZlbnRzX3BlbmRpbmcoYXVkaW8pLAotCQkJbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7Ci0JCWlmIChyYyA9PSAwKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JfSBlbHNlIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCi0JCQlhdWRpby0+ZXZlbnRfd2FpdCwgYXVkYW1yd2JfZXZlbnRzX3BlbmRpbmcoYXVkaW8pKTsKLQl9Ci0KLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoYXVkaW8tPmV2ZW50X2Fib3J0KSB7Ci0JCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDA7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJjID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmV2ZW50X3F1ZXVlKSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmV2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWRhbXJ3Yl9ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQl9Ci0KLQlpZiAoZHJ2X2V2dCkgewotCQl1c3JfZXZ0LmV2ZW50X3R5cGUgPSBkcnZfZXZ0LT5ldmVudF90eXBlOwotCQl1c3JfZXZ0LmV2ZW50X3BheWxvYWQgPSBkcnZfZXZ0LT5wYXlsb2FkOwotCQlsaXN0X2FkZF90YWlsKCZkcnZfZXZ0LT5saXN0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCX0gZWxzZQotCQlyYyA9IC0xOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIXJjICYmIGNvcHlfdG9fdXNlcihhcmcsICZ1c3JfZXZ0LCBzaXplb2YodXNyX2V2dCkpKQotCQlyYyA9IC1FRkFVTFQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZW5hYmxlX2VxKHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0JaWYgKGF1ZGlvLT5lcV9lbmFibGUgPT0gZW5hYmxlICYmICFhdWRpby0+ZXFfbmVlZHNfY29tbWl0KQotCQlyZXR1cm4gMDsKLQotCWF1ZGlvLT5lcV9lbmFibGUgPSBlbmFibGU7Ci0KLQlpZiAoYXVkaW8tPnJ1bm5pbmcpIHsKLQkJYXVkcHBfZHNwX3NldF9lcShhdWRpby0+ZGVjX2lkLCBlbmFibGUsICZhdWRpby0+ZXEpOwotCQlhdWRpby0+ZXFfbmVlZHNfY29tbWl0ID0gMDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIGF1ZGFtcndiX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0JdWludDE2X3QgZW5hYmxlX21hc2s7Ci0JaW50IGVuYWJsZTsKLQlpbnQgcHJldl9zdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGlvbmZsYWcgPSAwOwotCWlvbl9waHlzX2FkZHJfdCBhZGRyID0gMDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKLQlpbnQgbGVuID0gMDsKLQotCU1NX0RCRygiY21kID0gJWRcbiIsIGNtZCk7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCQlzdGF0cy5ieXRlX2NvdW50ID0gYXVkcHBfYXZzeW5jX2J5dGVfY291bnQoYXVkaW8tPmRlY19pZCk7Ci0JCXN0YXRzLnNhbXBsZV9jb3VudCA9IGF1ZHBwX2F2c3luY19zYW1wbGVfY291bnQoYXVkaW8tPmRlY19pZCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0VOQUJMRV9BVURQUDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZlbmFibGVfbWFzaywgKHZvaWQgKikgYXJnLAotCQkJCQkJc2l6ZW9mKGVuYWJsZV9tYXNrKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQllbmFibGUgPSAoZW5hYmxlX21hc2sgJiBFUV9FTkFCTEUpID8gMSA6IDA7Ci0JCWF1ZGlvX2VuYWJsZV9lcShhdWRpbywgZW5hYmxlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3Bhbik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfUEFOOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnBhbiA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3Bhbik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfRVE6Ci0JCXByZXZfc3RhdGUgPSBhdWRpby0+ZXFfZW5hYmxlOwotCQlhdWRpby0+ZXFfZW5hYmxlID0gMDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhdWRpby0+ZXEubnVtX2JhbmRzLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGF1ZGlvLT5lcSkgLQotCQkJCShBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfQ09NTU9OX0xFTiArIDIpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPmVxX2VuYWJsZSA9IHByZXZfc3RhdGU7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAxOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCWlmICgtRUlOVkFMICE9IHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9FVkVOVCkgewotCQlNTV9EQkcoIkFVRElPX0dFVF9FVkVOVFxuIik7Ci0JCWlmIChtdXRleF90cnlsb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spKSB7Ci0JCQlyYyA9IGF1ZGFtcndiX3Byb2Nlc3NfZXZlbnRfcmVxKGF1ZGlvLAotCQkJCQkodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQkJfSBlbHNlCi0JCQlyYyA9IC1FQlVTWTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmIChjbWQgPT0gQVVESU9fQUJPUlRfR0VUX0VWRU5UKSB7Ci0JCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDoKLQkJTU1fREJHKCJBVURJT19TVEFSVFxuIik7Ci0JCXJjID0gYXVkYW1yd2JfZW5hYmxlKGF1ZGlvKTsKLQkJaWYgKCFyYykgewotCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdCwKLQkJCQlhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoTVNNX0FVRF9ERUNPREVSX1dBSVRfTVMpKTsKLQkJCU1NX0lORk8oImRlY19zdGF0ZSAlZCByYyA9ICVkXG4iLCBhdWRpby0+ZGVjX3N0YXRlLCByYyk7Ci0KLQkJCWlmIChhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9TVUNDRVNTKQotCQkJCXJjID0gLUVOT0RFVjsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TVE9QOgotCQlNTV9EQkcoIkFVRElPX1NUT1BcbiIpOwotCQlyYyA9IGF1ZGFtcndiX2Rpc2FibGUoYXVkaW8pOwotCQlhdWRhbXJ3Yl9pb3BvcnRfcmVzZXQoYXVkaW8pOwotCQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fRkxVU0g6Ci0JCU1NX0RCRygiIEFVRElPX0ZMVVNIXG4iKTsKLQkJYXVkaW8tPnJmbHVzaCA9IDE7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAxOwotCQlhdWRhbXJ3Yl9pb3BvcnRfcmVzZXQoYXVkaW8pOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpIHsKLQkJCWF1ZHBwX2ZsdXNoKGF1ZGlvLT5kZWNfaWQpOwotCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJIWF1ZGlvLT53Zmx1c2gpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCU1NX0VSUigiQVVESU9fRkxVU0ggaW50ZXJydXB0ZWRcbiIpOwotCQkJCXJjID0gLUVJTlRSOwotCQkJfQotCQl9IGVsc2UgewotCQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkgICAgKCZjb25maWcsICh2b2lkICopYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY29uZmlnLmNoYW5uZWxfY291bnQgPT0gMSkKLQkJCQljb25maWcuY2hhbm5lbF9jb3VudCA9Ci0JCQkJCUFVRFBQX0NNRF9QQ01fSU5URl9NT05PX1Y7Ci0JCQllbHNlIGlmIChjb25maWcuY2hhbm5lbF9jb3VudCA9PSAyKQotCQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0KLQkJCQkJQVVEUFBfQ01EX1BDTV9JTlRGX1NURVJFT19WOwotCQkJZWxzZQotCQkJCXJjID0gLUVJTlZBTDsKLQkJCWF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID0gY29uZmlnLmNoYW5uZWxfY291bnQ7Ci0JCQlhdWRpby0+b3V0X3NhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotCQkJYXVkaW8tPm1maWVsZCA9IGNvbmZpZy5tZXRhX2ZpZWxkOwotCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gQlVGU1o7Ci0JCQljb25maWcuYnVmZmVyX2NvdW50ID0gMjsKLQkJCWNvbmZpZy5zYW1wbGVfcmF0ZSA9IGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGU7Ci0JCQlpZiAoYXVkaW8tPm91dF9jaGFubmVsX21vZGUgPT0KLQkJCQkJQVVEUFBfQ01EX1BDTV9JTlRGX01PTk9fVikKLQkJCQljb25maWcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JCQllbHNlCi0JCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSAyOwotCQkJY29uZmlnLm1ldGFfZmllbGQgPSAwOwotCQkJY29uZmlnLnVudXNlZFswXSA9IDA7Ci0JCQljb25maWcudW51c2VkWzFdID0gMDsKLQkJCWNvbmZpZy51bnVzZWRbMl0gPSAwOwotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNvbmZpZywKLQkJCQkJIHNpemVvZihjb25maWcpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCi0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fR0VUX1BDTV9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19wY21fY29uZmlnIGNvbmZpZzsKLQkJCWNvbmZpZy5wY21fZmVlZGJhY2sgPSAwOwotCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfTUFYX0NPVU5UOwotCQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjb25maWcsCi0JCQkJCSBzaXplb2YoY29uZmlnKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19TRVRfUENNX0NPTkZJRzp7Ci0JCXN0cnVjdCBtc21fYXVkaW9fcGNtX2NvbmZpZyBjb25maWc7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcgotCQkgICAgKCZjb25maWcsICh2b2lkICopYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICgoY29uZmlnLmJ1ZmZlcl9jb3VudCA+IFBDTV9CVUZfTUFYX0NPVU5UKSB8fAotCQkgICAgKGNvbmZpZy5idWZmZXJfY291bnQgPT0gMSkpCi0JCQljb25maWcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9NQVhfQ09VTlQ7Ci0KLQkJaWYgKGNvbmZpZy5idWZmZXJfc2l6ZSA8IFBDTV9CVUZTWl9NSU4pCi0JCQljb25maWcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCi0JCQkvKiBDaGVjayBpZiBwY20gZmVlZGJhY2sgaXMgcmVxdWlyZWQgKi8KLQkJaWYgKChjb25maWcucGNtX2ZlZWRiYWNrKSAmJiAoIWF1ZGlvLT5yZWFkX2RhdGEpKSB7Ci0JCQlNTV9EQkcoImFsbG9jYXRlIFBDTSBidWYgJWRcbiIsIGNvbmZpZy5idWZmZXJfY291bnQgKgotCQkJCQljb25maWcuYnVmZmVyX3NpemUpOwotCQkJCWhhbmRsZSA9IGlvbl9hbGxvYyhhdWRpby0+Y2xpZW50LAotCQkJCQkoY29uZmlnLmJ1ZmZlcl9zaXplICoKLQkJCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCksCi0JCQkJCVNaXzRLLCBJT05fSEVBUChJT05fQVVESU9fSEVBUF9JRCksIDApOwotCQkJCWlmIChJU19FUlJfT1JfTlVMTChoYW5kbGUpKSB7Ci0JCQkJCU1NX0VSUigiVW5hYmxlIHRvIGFsbG9jIEkvUCBidWZmc1xuIik7Ci0JCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlID0gaGFuZGxlOwotCi0JCQkJcmMgPSBpb25fcGh5cyhhdWRpby0+Y2xpZW50ICwKLQkJCQkJaGFuZGxlLCAmYWRkciwgJmxlbik7Ci0JCQkJaWYgKHJjKSB7Ci0JCQkJCU1NX0VSUigiSW52YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsCi0JCQkJCQkodW5zaWduZWQgaW50KSBsZW4pOwotCQkJCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBoYW5kbGUpOwotCQkJCQlhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgPSBOVUxMOwotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU1NX0lORk8oIkdvdCB2YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCQkJCSh1bnNpZ25lZCBpbnQpIGF1ZGlvLT5yZWFkX3BoeXMsCi0JCQkJCQkodW5zaWduZWQgaW50KSBsZW4pOwotCQkJCX0KLQkJCQlhdWRpby0+cmVhZF9waHlzID0gKGludDMyX3QpYWRkcjsKLQotCQkJCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MoYXVkaW8tPmNsaWVudCwKLQkJCQkJaGFuZGxlLCAmaW9uZmxhZyk7Ci0JCQkJaWYgKHJjKSB7Ci0JCQkJCU1NX0VSUigiY291bGQgbm90IGdldCBmbGFnc1xuIik7Ci0JCQkJCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci0JCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWF1ZGlvLT5tYXBfdl9yZWFkID0gaW9uX21hcF9rZXJuZWwoCi0JCQkJCWF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci0JCQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl9yZWFkKSkgewotCQkJCU1NX0VSUigiZmFpbGVkIHRvIG1hcCBtZW0gZm9yIHJlYWQgYnVmXG4iKTsKLQkJCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBoYW5kbGUpOwotCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0JCQkJcmMgPSAtRU5PTUVNOwotCQkJfSBlbHNlIHsKLQkJCQl1aW50OF90IGluZGV4OwotCQkJCXVpbnQzMl90IG9mZnNldCA9IDA7Ci0JCQkJYXVkaW8tPnJlYWRfZGF0YSA9IGF1ZGlvLT5tYXBfdl9yZWFkOwotCQkJCWF1ZGlvLT5wY21fZmVlZGJhY2sgPSAxOwotCQkJCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDA7Ci0JCQkJYXVkaW8tPnBjbV9idWZfY291bnQgPQotCQkJCQljb25maWcuYnVmZmVyX2NvdW50OwotCQkJCWF1ZGlvLT5yZWFkX25leHQgPSAwOwotCQkJCWF1ZGlvLT5maWxsX25leHQgPSAwOwotCi0JCQkJZm9yIChpbmRleCA9IDA7Ci0JCQkJaW5kZXggPCBjb25maWcuYnVmZmVyX2NvdW50OyBpbmRleCsrKSB7Ci0JCQkJCWF1ZGlvLT5pbltpbmRleF0uZGF0YSA9Ci0JCQkJCQlhdWRpby0+cmVhZF9kYXRhICsgb2Zmc2V0OwotCQkJCQlhdWRpby0+aW5baW5kZXhdLmFkZHIgPQotCQkJCQkgICAgYXVkaW8tPnJlYWRfcGh5cyArIG9mZnNldDsKLQkJCQkJYXVkaW8tPmluW2luZGV4XS5zaXplID0KLQkJCQkJICAgIGNvbmZpZy5idWZmZXJfc2l6ZTsKLQkJCQkJYXVkaW8tPmluW2luZGV4XS51c2VkID0gMDsKLQkJCQkJb2Zmc2V0ICs9IGNvbmZpZy5idWZmZXJfc2l6ZTsKLQkJCQl9Ci0JCQkJTU1fREJHKCJyZWFkIGJ1ZjogcGh5IGFkZHIgMHglMDh4IFwKLQkJCQkJCWtlcm5lbCBhZGRyIDB4JTA4eFxuIiwKLQkJCQkJCWF1ZGlvLT5yZWFkX3BoeXMsCi0JCQkJCQkoaW50KWF1ZGlvLT5yZWFkX2RhdGEpOwotCQkJCXJjID0gMDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJjID0gMDsKLQkJfQotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIE9ubHkgdXNlZnVsIGluIHR1bm5lbC1tb2RlICovCi1zdGF0aWMgaW50IGF1ZGFtcndiX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgYSwgbG9mZl90IGIsCi0JaW50IGRhdGFzeW5jKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQlpZiAoIWF1ZGlvLT5ydW5uaW5nIHx8IGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmVfbm9sb2NrOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoIWF1ZGlvLT5vdXRbMF0udXNlZCAmJgotCQkhYXVkaW8tPm91dFsxXS51c2VkICYmCi0JCWF1ZGlvLT5vdXRfbmVlZGVkKSB8fCBhdWRpby0+d2ZsdXNoKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQllbHNlIGlmIChhdWRpby0+d2ZsdXNoKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGF1ZGlvLT5yZXNlcnZlZCkgewotCQlNTV9EQkcoInNlbmQgcmVzZXJ2ZWQgYnl0ZVxuIik7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJKChjaGFyICopIGZyYW1lLT5kYXRhKVswXSA9IGF1ZGlvLT5yc3ZfYnl0ZTsKLQkJKChjaGFyICopIGZyYW1lLT5kYXRhKVsxXSA9IDA7Ci0JCWZyYW1lLT51c2VkID0gMjsKLQkJYXVkYW1yd2Jfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCSghYXVkaW8tPm91dFswXS51c2VkICYmCi0JCQkhYXVkaW8tPm91dFsxXS51c2VkICYmCi0JCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gZG9uZTsKLQkJZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQkvKiBwY20gZG1hbWlzcyBtZXNzYWdlIGlzIHNlbnQgY29udGlub3VzbHkKLQkgKiB3aGVuIGRlY29kZXIgaXMgc3RhcnZlZCBzbyBubyByYWNlCi0JICogY29uZGl0aW9uIGNvbmNlcm4KLQkgKi8KLQlhdWRpby0+dGVvcyA9IDA7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJYXVkaW8tPnRlb3MgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAoYXVkaW8tPndmbHVzaCkKLQkJcmMgPSAtRUJVU1k7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci1kb25lX25vbG9jazoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGFtcndiX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCSAgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0JaW50IHJjID0gMDsKLQotCWlmICghYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJcmV0dXJuIDA7IC8qIFBDTSBmZWVkYmFjayBpcyBub3QgZW5hYmxlZC4gTm90aGluZyB0byByZWFkICovCi0KLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlNTV9EQkcoImNvdW50ICVkXG4iLCBjb3VudCk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+cmVhZF93YWl0LAotCQkJKGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkID4gMCkgfHwKLQkJCShhdWRpby0+c3RvcHBlZCkgfHwgKGF1ZGlvLT5yZmx1c2gpKTsKLQotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT5yZmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY291bnQgPCBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCkgewotCQkJLyogUmVhZCBtdXN0IGhhcHBlbiBpbiBmcmFtZSBib3VuZGFyeS4gU2luY2UgZHJpdmVyIGRvZXMKLQkJCSAqIG5vdCBrbm93IGZyYW1lIHNpemUsIHJlYWQgY291bnQgbXVzdCBiZSBncmVhdGVyIG9yCi0JCQkgKiBlcXVhbCB0byBzaXplIG9mIFBDTSBzYW1wbGVzCi0JCQkgKi8KLQkJCU1NX0RCRygicmVhZCBzdG9wIC0gcGFydGlhbCBmcmFtZVxuIik7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygicmVhZCBmcm9tIGluWyVkXVxuIiwKLQkJCQlhdWRpby0+cmVhZF9uZXh0KTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcgotCQkJICAgIChidWYsIGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS5kYXRhLAotCQkJICAgICBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCkpIHsKLQkJCQlNTV9FUlIoImludmFsaWQgYWRkciAleCBcbiIsICh1bnNpZ25lZCBpbnQpYnVmKTsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljb3VudCAtPSBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZDsKLQkJCWJ1ZiArPSBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZDsKLQkJCWF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkID0gMDsKLQkJCWlmICgoKythdWRpby0+cmVhZF9uZXh0KSA9PSBhdWRpby0+cGNtX2J1Zl9jb3VudCkKLQkJCQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogZG9uJ3QgZmVlZCBvdXRwdXQgYnVmZmVyIHRvIEhXIGRlY29kZXIgZHVyaW5nIGZsdXNoaW5nCi0JICogYnVmZmVyIHJlZnJlc2ggY29tbWFuZCB3aWxsIGJlIHNlbnQgb25jZSBmbHVzaCBjb21wbGV0ZXMKLQkgKiBzZW5kIGJ1ZiByZWZyZXNoIGNvbW1hbmQgaGVyZSBjYW4gY29uZnVzZSBIVyBkZWNvZGVyCi0JICovCi0JaWYgKGF1ZGlvLT5idWZfcmVmcmVzaCAmJiAhYXVkaW8tPnJmbHVzaCkgewotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCQlNTV9FUlIoImtpY2sgc3RhcnQgcGNtIGZlZWRiYWNrIGFnYWluXG4iKTsKLQkJYXVkYW1yd2JfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCX0KLQotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0KLQlpZiAoYnVmID4gc3RhcnQpCi0JCXJjID0gYnVmIC0gc3RhcnQ7Ci0KLQlNTV9EQkcoInJlYWQgJWQgYnl0ZXNcbiIsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkYW1yd2JfcHJvY2Vzc19lb3Moc3RydWN0IGF1ZGlvICphdWRpbywKLQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1Zl9zdGFydCwgdW5zaWduZWQgc2hvcnQgbWZpZWxkX3NpemUpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JY2hhciAqYnVmX3B0cjsKLQlpbnQgcmMgPSAwOwotCi0JTU1fREJHKCJzaWduYWwgaW5wdXQgRU9TIHJlc2VydmVkPSVkXG4iLCBhdWRpby0+cmVzZXJ2ZWQpOwotCWlmIChhdWRpby0+cmVzZXJ2ZWQpIHsKLQkJTU1fREJHKCJQYXNzIHJlc2VydmUgYnl0ZVxuIik7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQkJYnVmX3B0ciA9IGZyYW1lLT5kYXRhOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkJKGZyYW1lLT51c2VkID09IDApCi0JCQkJCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYnVmX3B0clswXSA9IGF1ZGlvLT5yc3ZfYnl0ZTsKLQlidWZfcHRyWzFdID0gMDsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlmcmFtZS0+bWZpZWxkX3N6ID0gMDsKLQlhdWRpby0+cmVzZXJ2ZWQgPSAwOwotCWZyYW1lLT51c2VkID0gMjsKLQlhdWRhbXJ3Yl9zZW5kX2RhdGEoYXVkaW8sIDApOwotCX0KLQotCU1NX0RCRygiTm93IHNpZ25hbCBpbnB1dCBFT1MgYWZ0ZXIgcmVzZXJ2ZWQgYnl0ZXMgJWQgJWQgJWRcbiIsCi0JCWF1ZGlvLT5vdXRbMF0udXNlZCwgYXVkaW8tPm91dFsxXS51c2VkLCBhdWRpby0+b3V0X25lZWRlZCk7Ci0KLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKGF1ZGlvLT5vdXRfbmVlZGVkICYmCi0JCWF1ZGlvLT5vdXRbMF0udXNlZCA9PSAwICYmCi0JCWF1ZGlvLT5vdXRbMV0udXNlZCA9PSAwKQotCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoZnJhbWUtPmRhdGEsIGJ1Zl9zdGFydCwgbWZpZWxkX3NpemUpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlmcmFtZS0+dXNlZCA9IG1maWVsZF9zaXplOwotCWF1ZGFtcndiX3NlbmRfZGF0YShhdWRpbywgMCk7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRhbXJ3Yl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0Jc2l6ZV90IHhmZXI7Ci0JY2hhciAqY3B5X3B0cjsKLQlpbnQgcmMgPSAwLCBlb3NfY29uZGl0aW9uID0gQVVEQU1SV0JfRU9TX05PTkU7Ci0JdW5zaWduZWQgc2hvcnQgbWZpZWxkX3NpemUgPSAwOwotCXVuc2lnbmVkIGRzaXplOwotCi0JTU1fREJHKCJjbnQ9JWRcbiIsIGNvdW50KTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQkJY3B5X3B0ciA9IGZyYW1lLT5kYXRhOwotCQlkc2l6ZSA9IDA7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCQkgICAgICAoZnJhbWUtPnVzZWQgPT0gMCkKLQkJCQkJCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQkJCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0KLQkJTU1fREJHKCJidWZmZXIgYXZhaWxhYmxlXG4iKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChhdWRpby0+bWZpZWxkKSB7Ci0JCQlpZiAoYnVmID09IHN0YXJ0KSB7Ci0JCQkJLyogUHJvY2Vzc2luZyBiZWdpbm5pbmcgb2YgdXNlciBidWZmZXIgKi8KLQkJCQlpZiAoX19nZXRfdXNlcihtZmllbGRfc2l6ZSwKLQkJCQkJKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSBidWYpKSB7Ci0JCQkJCXJjID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIAlpZiAobWZpZWxkX3NpemUgPiBjb3VudCkgewotCQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlNTV9EQkcoIm1mIG9mZnNldF92YWwgJXhcbiIsIG1maWVsZF9zaXplKTsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCBtZmllbGRfc2l6ZSkpIHsKLQkJCQkJcmMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyogQ2hlY2sgaWYgRU9TIGZsYWcgaXMgc2V0IGFuZCBidWZmZXIKLQkJCQkgKiBjb250YWlucyBqdXN0IG1ldGEgZmllbGQKLQkJCQkgKi8KLQkJCQlpZiAoY3B5X3B0cltBVURBTVJXQl9FT1NfRkxHX09GRlNFVF0gJgotCQkJCQkJQVVEQU1SV0JfRU9TX0ZMR19NQVNLKSB7Ci0JCQkJCU1NX0RCRygiZW9zIHNldFxuIik7Ci0JCQkJCWVvc19jb25kaXRpb24gPSBBVURBTVJXQl9FT1NfU0VUOwotCQkJCQlpZiAobWZpZWxkX3NpemUgPT0gY291bnQpIHsKLQkJCQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UKLQkJCQkJY3B5X3B0cltBVURBTVJXQl9FT1NfRkxHX09GRlNFVF0gJj0KLQkJCQkJCQl+QVVEQU1SV0JfRU9TX0ZMR19NQVNLOwotCQkJCX0KLQkJCQljcHlfcHRyICs9IG1maWVsZF9zaXplOwotCQkJCWNvdW50IC09IG1maWVsZF9zaXplOwotCQkJCWRzaXplICs9IG1maWVsZF9zaXplOwotCQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWZpZWxkX3NpemUgPSAwOwotCQkJCU1NX0RCRygiY29udGludW91cyBidWZmZXJcbiIpOwotCQkJfQotCQkJZnJhbWUtPm1maWVsZF9zeiA9IG1maWVsZF9zaXplOwotCQl9Ci0KLQkJaWYgKGF1ZGlvLT5yZXNlcnZlZCkgewotCQkJTU1fREJHKCJhcHBlbmQgcmVzZXJ2ZWQgYnl0ZSAleFxuIiwgYXVkaW8tPnJzdl9ieXRlKTsKLQkJCSpjcHlfcHRyID0gYXVkaW8tPnJzdl9ieXRlOwotCQkJeGZlciA9IChjb3VudCA+ICgoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkgLSAxKSkgPwotCQkJCSgoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkgLSAxKSA6IGNvdW50OwotCQkJY3B5X3B0cisrOwotCQkJZHNpemUgKz0gMTsKLQkJCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JCX0gZWxzZQotCQkJeGZlciA9IChjb3VudCA+IChmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSkgPwotCQkJCShmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSA6IGNvdW50OwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIHhmZXIpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWRzaXplICs9IHhmZXI7Ci0JCWlmIChkc2l6ZSAmIDEpIHsKLQkJCWF1ZGlvLT5yc3ZfYnl0ZSA9ICgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbZHNpemUgLSAxXTsKLQkJCU1NX0RCRygib2RkIGxlbmd0aCBidWYgcmVzZXJ2ZSBsYXN0IGJ5dGUgJXhcbiIsCi0JCQkJCWF1ZGlvLT5yc3ZfYnl0ZSk7Ci0JCQlhdWRpby0+cmVzZXJ2ZWQgPSAxOwotCQkJZHNpemUtLTsKLQkJfQotCQljb3VudCAtPSB4ZmVyOwotCQlidWYgKz0geGZlcjsKLQotCQlpZiAoZHNpemUgPiAwKSB7Ci0JCQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQkJCWZyYW1lLT51c2VkID0gZHNpemU7Ci0JCQlhdWRhbXJ3Yl9zZW5kX2RhdGEoYXVkaW8sIDApOwotCQl9Ci0JfQotCU1NX0RCRygiZW9zX2NvbmRpdGlvbiAleCBidWZbMHgleF0gc3RhcnRbMHgleF1cbiIsIGVvc19jb25kaXRpb24sCi0JCQkoaW50KSBidWYsIChpbnQpIHN0YXJ0KTsKLQlpZiAoZW9zX2NvbmRpdGlvbiA9PSBBVURBTVJXQl9FT1NfU0VUKQotCQlyYyA9IGF1ZGFtcndiX3Byb2Nlc3NfZW9zKGF1ZGlvLCBzdGFydCwgbWZpZWxkX3NpemUpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCWlmICghcmMpIHsKLQkJaWYgKGJ1ZiA+IHN0YXJ0KQotCQkJcmV0dXJuIGJ1ZiAtIHN0YXJ0OwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkYW1yd2JfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JTU1fSU5GTygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGZyZWVpbmdcbiIsIChpbnQpYXVkaW8pOwotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRhbXJ3Yl9kaXNhYmxlKGF1ZGlvKTsKLQlpZiAoYXVkaW8tPnJtdF9yZXNvdXJjZV9yZWxlYXNlZCA9PSAwKQotCQlybXRfcHV0X3Jlc291cmNlKGF1ZGlvKTsKLQlhdWRhbXJ3Yl9mbHVzaChhdWRpbyk7Ci0JYXVkYW1yd2JfZmx1c2hfcGNtX2J1ZihhdWRpbyk7Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRwbGF5KTsKLQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQl1bnJlZ2lzdGVyX2Vhcmx5X3N1c3BlbmQoJmF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlKTsKLSNlbmRpZgotCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDE7Ci0Jd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCWF1ZGFtcndiX3Jlc2V0X2V2ZW50X3F1ZXVlKGF1ZGlvKTsKLQlpb25fdW5tYXBfa2VybmVsKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotCWlmIChhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgIT0gTlVMTCkgewotCQlpb25fdW5tYXBfa2VybmVsKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSk7Ci0JCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSk7Ci0JfQotCWlvbl9jbGllbnRfZGVzdHJveShhdWRpby0+Y2xpZW50KTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlpZiAoYXVkaW8tPmRlbnRyeSkKLQkJZGVidWdmc19yZW1vdmUoYXVkaW8tPmRlbnRyeSk7Ci0jZW5kaWYKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RhdGljIHZvaWQgYXVkYW1yd2JfcG9zdF9ldmVudChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCkKLXsKLQlzdHJ1Y3QgYXVkYW1yd2JfZXZlbnQgKmVfbm9kZSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSkpIHsKLQkJZV9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZGFtcndiX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmVfbm9kZS0+bGlzdCk7Ci0JfSBlbHNlIHsKLQkJZV9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGFtcndiX2V2ZW50KSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghZV9ub2RlKSB7Ci0JCQlNTV9FUlIoIk5vIG1lbSB0byBwb3N0IGV2ZW50ICVkXG4iLCB0eXBlKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQllX25vZGUtPmV2ZW50X3R5cGUgPSB0eXBlOwotCWVfbm9kZS0+cGF5bG9hZCA9IHBheWxvYWQ7Ci0KLQlsaXN0X2FkZF90YWlsKCZlX25vZGUtPmxpc3QsICZhdWRpby0+ZXZlbnRfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhbXJ3Yl9zdXNwZW5kKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRhbXJ3Yl9zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWRhbXJ3Yl9zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkYW1yd2JfcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9TVVNQRU5ELCBwYXlsb2FkKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkYW1yd2JfcmVzdW1lKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRhbXJ3Yl9zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWRhbXJ3Yl9zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkYW1yd2JfcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9SRVNVTUUsIHBheWxvYWQpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBzc2l6ZV90IGF1ZGFtcndiX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkYW1yd2JfZGVidWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY29uc3QgaW50IGRlYnVnX2J1Zm1heCA9IDEwMjQ7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyWzEwMjRdOwotCWludCBuID0gMCwgaTsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCW4gPSBzY25wcmludGYoYnVmZmVyLCBkZWJ1Z19idWZtYXgsICJvcGVuZWQgJWRcbiIsIGF1ZGlvLT5vcGVuZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiZW5hYmxlZCAlZFxuIiwgYXVkaW8tPmVuYWJsZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkic3RvcHBlZCAlZFxuIiwgYXVkaW8tPnN0b3BwZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicGNtX2ZlZWRiYWNrICVkXG4iLCBhdWRpby0+cGNtX2ZlZWRiYWNrKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dF9idWZfc3ogJWRcbiIsIGF1ZGlvLT5vdXRbMF0uc2l6ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJwY21fYnVmX2NvdW50ICVkIFxuIiwgYXVkaW8tPnBjbV9idWZfY291bnQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicGNtX2J1Zl9zeiAlZCBcbiIsIGF1ZGlvLT5pblswXS5zaXplKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInZvbHVtZSAleCBcbiIsIGF1ZGlvLT52b2xfcGFuLnZvbHVtZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJzYW1wbGUgcmF0ZSAlZCBcbiIsIGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiY2hhbm5lbCBtb2RlICVkIFxuIiwgYXVkaW8tPm91dF9jaGFubmVsX21vZGUpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCS8qIEZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIG9ubHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgd2hlbgotCSAqIHdoZW4gcGxheWJhY2sgaGFsdHMgdW5leHBlY3RlZGx5LiBUaHVzLCBubyBtdXR1YWwgZXhjbHVzaW9uCi0JICogZW5mb3JjZWQKLQkgKi8KLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIndmbHVzaCAlZFxuIiwgYXVkaW8tPndmbHVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJyZmx1c2ggJWRcbiIsIGF1ZGlvLT5yZmx1c2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicnVubmluZyAlZCBcbiIsIGF1ZGlvLT5ydW5uaW5nKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImRlYyBzdGF0ZSAlZCBcbiIsIGF1ZGlvLT5kZWNfc3RhdGUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X25lZWRlZCAlZCBcbiIsIGF1ZGlvLT5vdXRfbmVlZGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dF9oZWFkICVkIFxuIiwgYXVkaW8tPm91dF9oZWFkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dF90YWlsICVkIFxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dFswXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFswXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dFsxXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFsxXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImJ1ZmZlcl9yZWZyZXNoICVkIFxuIiwgYXVkaW8tPmJ1Zl9yZWZyZXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInJlYWRfbmV4dCAlZCBcbiIsIGF1ZGlvLT5yZWFkX25leHQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiZmlsbF9uZXh0ICVkIFxuIiwgYXVkaW8tPmZpbGxfbmV4dCk7Ci0JZm9yIChpID0gMDsgaSA8IGF1ZGlvLT5wY21fYnVmX2NvdW50OyBpKyspCi0JCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJImluWyVkXS51c2VkICVkIFxuIiwgaSwgYXVkaW8tPmluW2ldLnVzZWQpOwotCWJ1ZmZlcltuXSA9IDA7Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGJ1ZmZlciwgbik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGFtcndiX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWRhbXJ3Yl9kZWJ1Z19yZWFkLAotCS5vcGVuID0gYXVkYW1yd2JfZGVidWdfb3BlbiwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBhdWRhbXJ3Yl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBOVUxMOwotCWludCByYyA9IDAsIGRlY19hdHRyYiwgZGVjaWQsIGk7Ci0Jc3RydWN0IGF1ZGFtcndiX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIG1lbV9zeiA9IERNQVNaOwotCXVuc2lnbmVkIGxvbmcgaW9uZmxhZyA9IDA7Ci0JaW9uX3BoeXNfYWRkcl90IGFkZHIgPSAwOwotCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUgPSBOVUxMOwotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQgPSBOVUxMOwotCWludCBsZW4gPSAwOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCi0JY2hhciBuYW1lW3NpemVvZiAibXNtX2FtcndiXyIgKyA1XTsKLSNlbmRpZgotCi0JLyogQWxsb2NhdGUgTWVtIGZvciBhdWRpbyBpbnN0YW5jZSAqLwotCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhdWRpbykgewotCQlNTV9FUlIoIk5vIG1lbW9yeSB0byBhbGxvY2F0ZSBhdWRpbyBpbnN0YW5jZVxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQlNTV9JTkZPKCJhdWRpbyBpbnN0YW5jZSAweCUwOHggY3JlYXRlZFxuIiwgKGludClhdWRpbyk7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgZGVjb2RlciAqLwotCWRlY19hdHRyYiA9IEFVRERFQ19ERUNfQU1SV0I7Ci0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCWRlY19hdHRyYiB8PSBNU01fQVVEX01PREVfTk9OVFVOTkVMOwotCWVsc2UKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9UVU5ORUw7Ci0KLQlkZWNpZCA9IGF1ZHBwX2FkZWNfYWxsb2MoZGVjX2F0dHJiLCAmYXVkaW8tPm1vZHVsZV9uYW1lLAotCQkJJmF1ZGlvLT5xdWV1ZV9pZCk7Ci0KLQlpZiAoZGVjaWQgPCAwKSB7Ci0JCU1NX0VSUigiTm8gZnJlZSBkZWNvZGVyIGF2YWlsYWJsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJKGludClhdWRpbyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJa2ZyZWUoYXVkaW8pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYXVkaW8tPmRlY19pZCA9IGRlY2lkICYgTVNNX0FVRF9ERUNPREVSX01BU0s7Ci0KLQljbGllbnQgPSBtc21faW9uX2NsaWVudF9jcmVhdGUoVUlOVF9NQVgsICJBdWRpb19BTVJfV0JfQ2xpZW50Iik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGNsaWVudCkpIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gY3JlYXRlIElPTiBjbGllbnRcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gY2xpZW50X2NyZWF0ZV9lcnJvcjsKLQl9Ci0JYXVkaW8tPmNsaWVudCA9IGNsaWVudDsKLQotCWhhbmRsZSA9IGlvbl9hbGxvYyhjbGllbnQsIG1lbV9zeiwgU1pfNEssCi0JCUlPTl9IRUFQKElPTl9BVURJT19IRUFQX0lEKSwgMCk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGhhbmRsZSkpIHsKLQkJTU1fRVJSKCJVbmFibGUgdG8gY3JlYXRlIGFsbG9jYXRlIE8vUCBidWZmZXJzXG4iKTsKLQkJZ290byBvdXRwdXRfYnVmZl9hbGxvY19lcnJvcjsKLQl9Ci0JYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSA9IGhhbmRsZTsKLQotCXJjID0gaW9uX3BoeXMoY2xpZW50LCBoYW5kbGUsICZhZGRyLCAmbGVuKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJPL1AgYnVmZmVyczpJbnZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJKHVuc2lnbmVkIGludCkgYWRkciwgKHVuc2lnbmVkIGludCkgbGVuKTsKLQkJZ290byBvdXRwdXRfYnVmZl9nZXRfcGh5c19lcnJvcjsKLQl9IGVsc2UgewotCQlNTV9JTkZPKCJPL1AgYnVmZmVyczp2YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JfQotCWF1ZGlvLT5waHlzID0gKGludDMyX3QpYWRkcjsKLQotCi0JcmMgPSBpb25faGFuZGxlX2dldF9mbGFncyhjbGllbnQsIGhhbmRsZSwgJmlvbmZsYWcpOwotCWlmIChyYykgewotCQlNTV9FUlIoImNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIpOwotCQlnb3RvIG91dHB1dF9idWZmX2dldF9mbGFnc19lcnJvcjsKLQl9Ci0KLQlhdWRpby0+bWFwX3Zfd3JpdGUgPSBpb25fbWFwX2tlcm5lbChjbGllbnQsIGhhbmRsZSk7Ci0JaWYgKElTX0VSUihhdWRpby0+bWFwX3Zfd3JpdGUpKSB7Ci0JCU1NX0VSUigiY291bGQgbm90IG1hcCB3cml0ZSBidWZmZXJzXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dHB1dF9idWZmX21hcF9lcnJvcjsKLQl9Ci0JYXVkaW8tPmRhdGEgPSBhdWRpby0+bWFwX3Zfd3JpdGU7Ci0JTU1fREJHKCJ3cml0ZSBidWY6IHBoeSBhZGRyIDB4JTA4eCBrZXJuZWwgYWRkciAweCUwOHhcbiIsCi0JCWF1ZGlvLT5waHlzLCAoaW50KWF1ZGlvLT5kYXRhKTsKLQotCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrID09IFRVTk5FTF9NT0RFX1BMQVlCQUNLKSB7Ci0JCXJjID0gYXVkbWdyX29wZW4oJmF1ZGlvLT5hdWRtZ3IpOwotCQlpZiAocmMpIHsKLQkJCU1NX0VSUigiYXVkbWdyIG9wZW4gZmFpbGVkLCBmcmVlaW5nIGluc3RhbmNlIFwKLQkJCQkJMHglMDh4XG4iLCAoaW50KWF1ZGlvKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCi0JcmMgPSBtc21fYWRzcF9nZXQoYXVkaW8tPm1vZHVsZV9uYW1lLCAmYXVkaW8tPmF1ZHBsYXksCi0JCSZhdWRwbGF5X2Fkc3Bfb3BzX2FtcndiLCBhdWRpbyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiZmFpbGVkIHRvIGdldCAlcyBtb2R1bGUsIGZyZWVpbmcgaW5zdGFuY2UgMHglMDh4XG4iLAotCQkJCWF1ZGlvLT5tb2R1bGVfbmFtZSwgKGludClhdWRpbyk7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrID09IFRVTk5FTF9NT0RFX1BMQVlCQUNLKQotCQkJYXVkbWdyX2Nsb3NlKCZhdWRpby0+YXVkbWdyKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmMgPSBybXRfZ2V0X3Jlc291cmNlKGF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJBRFNQIHJlc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgQU1SV0Igc2Vzc2lvbiBcCi0JCQkgMHglMDh4IG9uIGRlY29kZXI6ICVkXG4iLCAoaW50KWF1ZGlvLCBhdWRpby0+ZGVjX2lkKTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spCi0JCQlhdWRtZ3JfY2xvc2UoJmF1ZGlvLT5hdWRtZ3IpOwotCQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHBsYXkpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgPSBOVUxMOwotCW11dGV4X2luaXQoJmF1ZGlvLT5sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPnJlYWRfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmRzcF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2spOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0KLQlhdWRpby0+b3V0WzBdLmRhdGEgPSBhdWRpby0+ZGF0YSArIDA7Ci0JYXVkaW8tPm91dFswXS5hZGRyID0gYXVkaW8tPnBoeXMgKyAwOwotCWF1ZGlvLT5vdXRbMF0uc2l6ZSA9IEJVRlNaOwotCi0JYXVkaW8tPm91dFsxXS5kYXRhID0gYXVkaW8tPmRhdGEgKyBCVUZTWjsKLQlhdWRpby0+b3V0WzFdLmFkZHIgPSBhdWRpby0+cGh5cyArIEJVRlNaOwotCWF1ZGlvLT5vdXRbMV0uc2l6ZSA9IEJVRlNaOwotCi0JYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gMHgyMDAwOwotCWF1ZGlvLT52b2xfcGFuLnBhbiA9IDB4MDsKLQlhdWRpby0+ZXFfZW5hYmxlID0gMDsKLQlhdWRpby0+b3V0X3NhbXBsZV9yYXRlID0gNDQxMDA7Ci0JYXVkaW8tPm91dF9jaGFubmVsX21vZGUgPSBBVURQUF9DTURfUENNX0lOVEZfU1RFUkVPX1Y7Ci0KLQlhdWRhbXJ3Yl9mbHVzaChhdWRpbyk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQlhdWRpby0+b3BlbmVkID0gMTsKLQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAwOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXNucHJpbnRmKG5hbWUsIHNpemVvZiBuYW1lLCAibXNtX2FtcndiXyUwNHgiLCBhdWRpby0+ZGVjX2lkKTsKLQlhdWRpby0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCU5VTEwsICh2b2lkICopIGF1ZGlvLCAmYXVkYW1yd2JfZGVidWdfZm9wcyk7Ci0KLQlpZiAoSVNfRVJSKGF1ZGlvLT5kZW50cnkpKQotCQlNTV9EQkcoImRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUubGV2ZWwgPSBFQVJMWV9TVVNQRU5EX0xFVkVMX0RJU0FCTEVfRkI7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUucmVzdW1lID0gYXVkYW1yd2JfcmVzdW1lOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLnN1c3BlbmQgPSBhdWRhbXJ3Yl9zdXNwZW5kOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5hdWRpbyA9IGF1ZGlvOwotCXJlZ2lzdGVyX2Vhcmx5X3N1c3BlbmQoJmF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlKTsKLSNlbmRpZgotCWZvciAoaSA9IDA7IGkgPCBBVURBTVJXQl9FVkVOVF9OVU07IGkrKykgewotCQllX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkYW1yd2JfZXZlbnQpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGVfbm9kZSkKLQkJCWxpc3RfYWRkX3RhaWwoJmVfbm9kZS0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQkJZWxzZSB7Ci0JCQlNTV9FUlIoImV2ZW50IHBrdCBhbGxvYyBmYWlsZWRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci1kb25lOgotCXJldHVybiByYzsKLWVycjoKLQlpb25fdW5tYXBfa2VybmVsKGNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci1vdXRwdXRfYnVmZl9tYXBfZXJyb3I6Ci1vdXRwdXRfYnVmZl9nZXRfcGh5c19lcnJvcjoKLW91dHB1dF9idWZmX2dldF9mbGFnc19lcnJvcjoKLQlpb25fZnJlZShjbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotb3V0cHV0X2J1ZmZfYWxsb2NfZXJyb3I6Ci0JaW9uX2NsaWVudF9kZXN0cm95KGNsaWVudCk7Ci1jbGllbnRfY3JlYXRlX2Vycm9yOgotCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19hbXJ3Yl9mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gYXVkYW1yd2Jfb3BlbiwKLQkucmVsZWFzZSA9IGF1ZGFtcndiX3JlbGVhc2UsCi0JLnJlYWQgPSBhdWRhbXJ3Yl9yZWFkLAotCS53cml0ZSA9IGF1ZGFtcndiX3dyaXRlLAotCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGFtcndiX2lvY3RsLAotCS5mc3luYyA9IGF1ZGFtcndiX2ZzeW5jLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fYW1yd2JfbWlzYyA9IHsKLQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUgPSAibXNtX2FtcndiIiwKLQkuZm9wcyA9ICZhdWRpb19hbXJ3Yl9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkYW1yd2JfaW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19hbXJ3Yl9taXNjKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGF1ZGFtcndiX2V4aXQodm9pZCkKLXsKLQltaXNjX2RlcmVnaXN0ZXIoJmF1ZGlvX2FtcndiX21pc2MpOwotfQotCi1tb2R1bGVfaW5pdChhdWRhbXJ3Yl9pbml0KTsKLW1vZHVsZV9leGl0KGF1ZGFtcndiX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1TTSBBTVItV0IgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19ldnJjLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19ldnJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NjEyYTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fZXZyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcwMSArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9hdWRpb19ldnJjLmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSwgMjAxMS0yMDEyIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29kZSBhbHNvIGJvcnJvd3MgZnJvbSBhdWRpb19hYWMuYywgd2hpY2ggaXMKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gZmluZCBpdCBhdCBodHRwOi8vd3d3LmZzZi5vcmcuCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9lYXJseXN1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtb3J5X2FsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgotCi0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXUuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11X2RvbWFpbnMuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHBjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBsYXljbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBsYXltc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1cm10Y21kaS5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9tZW10eXBlcy5oPgotCi0jaW5jbHVkZSAiYXVkbWdyLmgiCi0KLS8qIEhvbGQgMzAgcGFja2V0cyBvZiAyNCBieXRlcyBlYWNoIGFuZCAxNCBieXRlcyBvZiBtZXRhIGluICovCi0jZGVmaW5lIEJVRlNaIAkJCTczNAotI2RlZmluZSBETUFTWiAJCQkoQlVGU1ogKiAyKQotCi0jZGVmaW5lIEFVRERFQ19ERUNfRVZSQyAJMTIKLQotI2RlZmluZSBQQ01fQlVGU1pfTUlOIAkJMTYyNAkvKiAxMDBtcyB3b3J0aCBvZiBkYXRhIGFuZAotCQkJCQkgICBhbmQgMjQgYnl0ZXMgb2YgbWV0YSBvdXQgKi8KLSNkZWZpbmUgUENNX0JVRl9NQVhfQ09VTlQgCTUKLS8qIERTUCBvbmx5IGFjY2VwdHMgNSBidWZmZXJzIGF0IG1vc3QKLSAqIGJ1dCBzdXBwb3J0IDIgYnVmZmVycyBjdXJyZW50bHkKLSAqLwotI2RlZmluZSBFVlJDX0RFQ09ERURfRlJTWiAJMzIwCS8qIEVWUkMgMjBtcyA4S0h6IG1vbm8gUENNIHNpemUgKi8KLQotI2RlZmluZSBST1VUSU5HX01PREVfRlRSVCAJMQotI2RlZmluZSBST1VUSU5HX01PREVfUlQgCTIKLS8qIERlY29kZXIgc3RhdHVzIHJlY2VpdmVkIGZyb20gQVVEUFBUQVNLICovCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX1NMRUVQCTAKLSNkZWZpbmUJIEFVRFBQX0RFQ19TVEFUVVNfSU5JVCAgMQotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19DRkcgICAyCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX1BMQVkgIDMKLQotI2RlZmluZSBBVURFVlJDX01FVEFGSUVMRF9NQVNLIDB4RkZGRjAwMDAKLSNkZWZpbmUgQVVERVZSQ19FT1NfRkxHX09GRlNFVCAweDBBIC8qIE9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBidWZmZXIgKi8KLSNkZWZpbmUgQVVERVZSQ19FT1NfRkxHX01BU0sgMHgwMQotI2RlZmluZSBBVURFVlJDX0VPU19OT05FIDB4MCAvKiBObyBFT1MgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgQVVERVZSQ19FT1NfU0VUIDB4MSAvKiBFT1Mgc2V0IGluIG1ldGEgZmllbGQgKi8KLQotI2RlZmluZSBBVURFVlJDX0VWRU5UX05VTSAxMCAvKiBEZWZhdWx0IG51bWJlciBvZiBwcmUtYWxsb2NhdGVkIGV2ZW50IHBhY2tldHMgKi8KLQotc3RydWN0IGJ1ZmZlciB7Ci0Jdm9pZCAqZGF0YTsKLQl1bnNpZ25lZCBzaXplOwotCXVuc2lnbmVkIHVzZWQ7CQkvKiBJbnB1dCB1c2FnZSBhY3R1YWwgRFNQIHByb2R1Y2VkIFBDTSBzaXplICAqLwotCXVuc2lnbmVkIGFkZHI7Ci0JdW5zaWduZWQgc2hvcnQgbWZpZWxkX3N6OyAvKm9ubHkgdXNlZnVsIGZvciBkYXRhIGhhcyBtZXRhIGZpZWxkICovCi19OwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0cnVjdCBhdWRldnJjX3N1c3BlbmRfY3RsIHsKLQlzdHJ1Y3QgZWFybHlfc3VzcGVuZCBub2RlOwotCXN0cnVjdCBhdWRpbyAqYXVkaW87Ci19OwotI2VuZGlmCi0KLXN0cnVjdCBhdWRldnJjX2V2ZW50ewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlpbnQgZXZlbnRfdHlwZTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotfTsKLQotc3RydWN0IGF1ZGlvIHsKLQlzdHJ1Y3QgYnVmZmVyIG91dFsyXTsKLQotCXNwaW5sb2NrX3QgZHNwX2xvY2s7Ci0KLQl1aW50OF90IG91dF9oZWFkOwotCXVpbnQ4X3Qgb3V0X3RhaWw7Ci0JdWludDhfdCBvdXRfbmVlZGVkOwkvKiBudW1iZXIgb2YgYnVmZmVycyB0aGUgZHNwIGlzIHdhaXRpbmcgZm9yICovCi0KLQlhdG9taWNfdCBvdXRfYnl0ZXM7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggd3JpdGVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3cml0ZV93YWl0OwotCi0JLyogSG9zdCBQQ00gc2VjdGlvbiAqLwotCXN0cnVjdCBidWZmZXIgaW5bUENNX0JVRl9NQVhfQ09VTlRdOwotCXN0cnVjdCBtdXRleCByZWFkX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF93YWl0OwkvKiBXYWl0IHF1ZXVlIGZvciByZWFkICovCi0JY2hhciAqcmVhZF9kYXRhOwkvKiBwb2ludGVyIHRvIHJlYWRlciBidWZmZXIgKi8KLQlpbnQzMl90IHJlYWRfcGh5czsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiByZWFkZXIgYnVmZmVyICovCi0JdWludDhfdCByZWFkX25leHQ7CS8qIGluZGV4IHRvIGlucHV0IGJ1ZmZlcnMgdG8gYmUgcmVhZCBuZXh0ICovCi0JdWludDhfdCBmaWxsX25leHQ7CS8qIGluZGV4IHRvIGJ1ZmZlciB0aGF0IERTUCBzaG91bGQgYmUgZmlsbGluZyAqLwotCXVpbnQ4X3QgcGNtX2J1Zl9jb3VudDsJLyogbnVtYmVyIG9mIHBjbSBidWZmZXIgYWxsb2NhdGVkICovCi0JLyogLS0tLSBFbmQgb2YgSG9zdCBQQ00gc2VjdGlvbiAqLwotCi0Jc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqYXVkcGxheTsKLQlzdHJ1Y3QgYXVkbWdyIGF1ZG1ncjsKLQotCS8qIGRhdGEgYWxsb2NhdGVkIGZvciB2YXJpb3VzIGJ1ZmZlcnMgKi8KLQljaGFyICpkYXRhOwotCWludDMyX3QgcGh5czsgIC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygd3JpdGUgYnVmZmVyICovCi0Jdm9pZCAqbWFwX3ZfcmVhZDsKLQl2b2lkICptYXBfdl93cml0ZTsKLQotCWludCBtZmllbGQ7IC8qIG1ldGEgZmllbGQgZW1iZWRkZWQgaW4gZGF0YSAqLwotCWludCByZmx1c2g7IC8qIFJlYWQgIGZsdXNoICovCi0JaW50IHdmbHVzaDsgLyogV3JpdGUgZmx1c2ggKi8KLQl1aW50OF90IG9wZW5lZDoxOwotCXVpbnQ4X3QgZW5hYmxlZDoxOwotCXVpbnQ4X3QgcnVubmluZzoxOwotCXVpbnQ4X3Qgc3RvcHBlZDoxOwkvKiBzZXQgd2hlbiBzdG9wcGVkLCBjbGVhcmVkIG9uIGZsdXNoICovCi0JdWludDhfdCBwY21fZmVlZGJhY2s6MTsKLQl1aW50OF90IGJ1Zl9yZWZyZXNoOjE7Ci0JaW50IHRlb3M7IC8qIHZhbGlkIG9ubHkgaWYgdHVubmVsIG1vZGUgJiBubyBkYXRhIGxlZnQgZm9yIGRlY29kZXIgKi8KLQllbnVtIG1zbV9hdWRfZGVjb2Rlcl9zdGF0ZSBkZWNfc3RhdGU7CS8qIFJlcHJlc2VudHMgZGVjb2RlciBzdGF0ZSAqLwotCWludCBybXRfcmVzb3VyY2VfcmVsZWFzZWQ7Ci0KLQljb25zdCBjaGFyICptb2R1bGVfbmFtZTsKLQl1bnNpZ25lZCBxdWV1ZV9pZDsKLQl1aW50MTZfdCBkZWNfaWQ7Ci0JdWludDMyX3QgcmVhZF9wdHJfb2Zmc2V0OwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQlzdHJ1Y3QgYXVkZXZyY19zdXNwZW5kX2N0bCBzdXNwZW5kX2N0bDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotI2VuZGlmCi0KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9ldmVudF9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50X3F1ZXVlOwotCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3dhaXQ7Ci0Jc3BpbmxvY2tfdCBldmVudF9xdWV1ZV9sb2NrOwotCXN0cnVjdCBtdXRleCBnZXRfZXZlbnRfbG9jazsKLQlpbnQgZXZlbnRfYWJvcnQ7Ci0KLQlpbnQgZXFfZW5hYmxlOwotCWludCBlcV9uZWVkc19jb21taXQ7Ci0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyIGVxOwotCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUgdm9sX3BhbjsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBpb25faGFuZGxlICppbnB1dF9idWZmX2hhbmRsZTsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqb3V0cHV0X2J1ZmZfaGFuZGxlOwotfTsKLQotc3RhdGljIGludCBhdWRkZWNfZHNwX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKTsKLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX3JvdXRpbmdfbW9kZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZGV2cmNfc2VuZF9kYXRhKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVuc2lnbmVkIG5lZWRlZCk7Ci1zdGF0aWMgdm9pZCBhdWRldnJjX2RzcF9ldmVudCh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZyk7Ci1zdGF0aWMgdm9pZCBhdWRldnJjX2NvbmZpZ19ob3N0cGNtKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkZXZyY19idWZmZXJfcmVmcmVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RhdGljIHZvaWQgYXVkZXZyY19wb3N0X2V2ZW50KHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCB0eXBlLAotCQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkKTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IHJtdF9wdXRfcmVzb3VyY2Uoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkX2NvZGVjX2NvbmZpZ19jbWQgY21kOwotCXVuc2lnbmVkIHNob3J0IGNsaWVudF9pZHg7Ci0KLQljbWQuY21kX2lkID0gUk1fQ01EX0FVRF9DT0RFQ19DRkc7Ci0JY21kLmNsaWVudF9pZCA9IFJNX0FVRF9DTElFTlRfSUQ7Ci0JY21kLnRhc2tfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5lbmFibGUgPSBSTVRfRElTQUJMRTsKLQljbWQuZGVjX3R5cGUgPSBBVURERUNfREVDX0VWUkM7Ci0JY2xpZW50X2lkeCA9ICgoY21kLmNsaWVudF9pZCA8PCA4KSB8IGNtZC50YXNrX2lkKTsKLQotCXJldHVybiBwdXRfYWRzcF9yZXNvdXJjZShjbGllbnRfaWR4LCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgcm10X2dldF9yZXNvdXJjZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRfY29kZWNfY29uZmlnX2NtZCBjbWQ7Ci0JdW5zaWduZWQgc2hvcnQgY2xpZW50X2lkeDsKLQotCWNtZC5jbWRfaWQgPSBSTV9DTURfQVVEX0NPREVDX0NGRzsKLQljbWQuY2xpZW50X2lkID0gUk1fQVVEX0NMSUVOVF9JRDsKLQljbWQudGFza19pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmVuYWJsZSA9IFJNVF9FTkFCTEU7Ci0JY21kLmRlY190eXBlID0gQVVEREVDX0RFQ19FVlJDOwotCWNsaWVudF9pZHggPSAoKGNtZC5jbGllbnRfaWQgPDwgOCkgfCBjbWQudGFza19pZCk7Ci0KLQlyZXR1cm4gZ2V0X2Fkc3BfcmVzb3VyY2UoY2xpZW50X2lkeCwgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkZXZyY19lbmFibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkbWdyX2NvbmZpZyBjZmc7Ci0JaW50IHJjOwotCi0JaWYgKGF1ZGlvLT5lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWlmIChhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID09IDEpIHsKLQkJYXVkaW8tPnJtdF9yZXNvdXJjZV9yZWxlYXNlZCA9IDA7Ci0JCXJjID0gcm10X2dldF9yZXNvdXJjZShhdWRpbyk7Ci0JCWlmIChyYykgewotCQkJTU1fRVJSKCJBRFNQIHJlc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgRVZSQyBcCi0JCQkJc2Vzc2lvbiAweCUwOHggb24gZGVjb2RlcjogJWRcbiBJZ25vcmluZyBcCi0JCQkJZXJyb3IgYW5kIGdvaW5nIGFoZWFkIHdpdGggdGhlIHBsYXliYWNrXG4iLAotCQkJCShpbnQpYXVkaW8sIGF1ZGlvLT5kZWNfaWQpOwotCQl9Ci0JfQotCi0JYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCWF1ZGlvLT5vdXRfdGFpbCA9IDA7Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCi0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spIHsKLQkJY2ZnLnR4X3JhdGUgPSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV9OT05FOwotCQljZmcucnhfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzQ4MDAwOwotCQljZmcuZGVmX21ldGhvZCA9IFJQQ19BVURfREVGX01FVEhPRF9QTEFZQkFDSzsKLQkJY2ZnLmNvZGVjID0gUlBDX0FVRF9ERUZfQ09ERUNfRVZSQzsKLQkJY2ZnLnNuZF9tZXRob2QgPSBSUENfU05EX01FVEhPRF9NSURJOwotCi0JCXJjID0gYXVkbWdyX2VuYWJsZSgmYXVkaW8tPmF1ZG1nciwgJmNmZyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCW1zbV9hZHNwX2R1bXAoYXVkaW8tPmF1ZHBsYXkpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCi0JaWYgKG1zbV9hZHNwX2VuYWJsZShhdWRpby0+YXVkcGxheSkpIHsKLQkJTU1fRVJSKCJtc21fYWRzcF9lbmFibGUoYXVkcGxheSkgZmFpbGVkXG4iKTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spCi0JCQlhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChhdWRwcF9lbmFibGUoYXVkaW8tPmRlY19pZCwgYXVkZXZyY19kc3BfZXZlbnQsIGF1ZGlvKSkgewotCQlNTV9FUlIoImF1ZHBwX2VuYWJsZSgpIGZhaWxlZFxuIik7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykKLQkJCWF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWF1ZGlvLT5lbmFibGVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGV2cmNfZGlzYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWludCByYyA9IDA7Ci0JaWYgKGF1ZGlvLT5lbmFibGVkKSB7Ci0JCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCQlhdWRkZWNfZHNwX2NvbmZpZyhhdWRpbywgMCk7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXQsCi0JCQkJYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORSwKLQkJCQltc2Vjc190b19qaWZmaWVzKE1TTV9BVURfREVDT0RFUl9XQUlUX01TKSk7Ci0JCWlmIChyYyA9PSAwKQotCQkJcmMgPSAtRVRJTUVET1VUOwotCQllbHNlIGlmIChhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlhdWRwcF9kaXNhYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spIHsKLQkJCXJjID0gYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQltc21fYWRzcF9kdW1wKGF1ZGlvLT5hdWRwbGF5KTsKLQkJfQotCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCXJtdF9wdXRfcmVzb3VyY2UoYXVkaW8pOwotCQlhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID0gMTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHZvaWQgYXVkZXZyY191cGRhdGVfcGNtX2J1Zl9lbnRyeShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQkJCQkgdWludDMyX3QgKnBheWxvYWQpCi17Ci0JdWludDhfdCBpbmRleDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGF1ZGlvLT5yZmx1c2gpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwYXlsb2FkWzFdOyBpbmRleCsrKSB7Ci0JCWlmIChhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uYWRkcgotCQkJCT09IHBheWxvYWRbMiArIGluZGV4ICogMl0pIHsKLQkJCU1NX0RCRygiaW5bJWRdIHJlYWR5XG4iLCBhdWRpby0+ZmlsbF9uZXh0KTsKLQkJCWF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS51c2VkID0KLQkJCQlwYXlsb2FkWzMgKyBpbmRleCAqIDJdOwotCQkJaWYgKCgrK2F1ZGlvLT5maWxsX25leHQpID09IGF1ZGlvLT5wY21fYnVmX2NvdW50KQotCQkJCWF1ZGlvLT5maWxsX25leHQgPSAwOwotCi0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoImV4cGVjdGVkPSV4IHJldD0leFxuIiwKLQkJCQlhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uYWRkciwKLQkJCQlwYXlsb2FkWzEgKyBpbmRleCAqIDJdKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0udXNlZCA9PSAwKSB7Ci0JCWF1ZGV2cmNfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCX0gZWxzZSB7Ci0JCU1NX0RCRygicmVhZCBjYW5ub3Qga2VlcCB1cFxuIik7Ci0JCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDE7Ci0JfQotCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwbGF5X2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgc2l6ZV90IGxlbiwKLQkJCSAgICAgIHZvaWQgKCpnZXRldmVudCkgKHZvaWQgKnB0ciwgc2l6ZV90IGxlbikpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGRhdGE7Ci0JdWludDMyX3QgbXNnWzI4XTsKLQlnZXRldmVudChtc2csIHNpemVvZihtc2cpKTsKLQotCU1NX0RCRygibXNnX2lkPSV4XG4iLCBpZCk7Ci0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUExBWV9NU0dfREVDX05FRURTX0RBVEE6Ci0JCWF1ZGV2cmNfc2VuZF9kYXRhKGF1ZGlvLCAxKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURQTEFZX01TR19CVUZGRVJfVVBEQVRFOgotCQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCQlhdWRldnJjX3VwZGF0ZV9wY21fYnVmX2VudHJ5KGF1ZGlvLCBtc2cpOwotCQlicmVhazsKLQljYXNlIEFEU1BfTUVTU0FHRV9JRDoKLQkJTU1fREJHKCJSZWNlaXZlZCBBRFNQIGV2ZW50OiBtb2R1bGUgZW5hYmxlKGF1ZHBsYXl0YXNrKVxuIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1NX0VSUigidW5leHBlY3RlZCBtZXNzYWdlIGZyb20gZGVjb2RlciBcbiIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXVkZXZyY19kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IHByaXZhdGU7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQUF9NU0dfU1RBVFVTX01TRzp7Ci0JCQl1bnNpZ25lZCBzdGF0dXMgPSBtc2dbMV07Ci0KLQkJCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfU0xFRVA6IHsKLQkJCQl1aW50MTZfdCByZWFzb24gPSBtc2dbMl07Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czpzbGVlcCByZWFzb24gPSBcCi0JCQkJCQkweCUwNHhcbiIsIHJlYXNvbik7Ci0JCQkJaWYgKChyZWFzb24gPT0gQVVEUFBfTVNHX1JFQVNPTl9NRU0pCi0JCQkJCXx8IChyZWFzb24gPT0KLQkJCQkJQVVEUFBfTVNHX1JFQVNPTl9OT0RFQ09ERVIpKSB7Ci0JCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX0ZBSUxVUkU7Ci0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQl9IGVsc2UgaWYgKHJlYXNvbiA9PSBBVURQUF9NU0dfUkVBU09OX05PTkUpIHsKLQkJCQkJLyogZGVjb2RlciBpcyBpbiBkaXNhYmxlIHN0YXRlICovCi0JCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX0NMT1NFOwotCQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX0lOSVQ6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogaW5pdCBcbiIpOwotCQkJCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQkJCQlhdWRwcF9jbWRfY2ZnX3JvdXRpbmdfbW9kZShhdWRpbyk7Ci0JCQkJZWxzZQotCQkJCQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKGF1ZGlvKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX0NGRzoKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBjZmcgXG4iKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19QTEFZOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IHBsYXkgXG4iKTsKLQkJCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykgewotCQkJCQlhdWRldnJjX2NvbmZpZ19ob3N0cGNtKGF1ZGlvKTsKLQkJCQkJYXVkZXZyY19idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JCQkJfQotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfU1VDQ0VTUzsKLQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCU1NX0VSUigidW5rbm93biBkZWNvZGVyIHN0YXR1cyBcbiIpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRFBQX01TR19DRkdfTVNHOgotCQlpZiAobXNnWzBdID09IEFVRFBQX01TR19FTkFfRU5BKSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgRU5BQkxFXG4iKTsKLQkJCWF1ZGRlY19kc3BfY29uZmlnKGF1ZGlvLCAxKTsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMTsKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihhdWRpby0+ZGVjX2lkLCAmYXVkaW8tPnZvbF9wYW4pOwotCQkJYXVkcHBfZHNwX3NldF9lcShhdWRpby0+ZGVjX2lkLAlhdWRpby0+ZXFfZW5hYmxlLAotCQkJCQkJCQkmYXVkaW8tPmVxKTsKLQkJCWF1ZHBwX2F2c3luYyhhdWRpby0+ZGVjX2lkLCAyMjA1MCk7Ci0JCX0gZWxzZSBpZiAobXNnWzBdID09IEFVRFBQX01TR19FTkFfRElTKSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgRElTQUJMRVxuIik7Ci0JCQlhdWRwcF9hdnN5bmMoYXVkaW8tPmRlY19pZCwgMCk7Ci0JCQlhdWRpby0+cnVubmluZyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgJWQ/XG4iLCBtc2dbMF0pOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX1JPVVRJTkdfQUNLOgotCQlNTV9EQkcoIlJPVVRJTkdfQUNLXG4iKTsKLQkJYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhhdWRpbyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX0ZMVVNIX0FDSzoKLQkJTU1fREJHKCJGTFVTSF9BQ0tcbiIpOwotCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCQlhdWRldnJjX2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfUENNRE1BTUlTU0VEOgotCQlNTV9EQkcoIlBDTURNQU1JU1NFRFxuIik7Ci0JCWF1ZGlvLT50ZW9zID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlNTV9FUlIoIlVOS05PV04gKCVkKVxuIiwgaWQpOwotCX0KLQotfQotCi1zdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHBsYXlfYWRzcF9vcHNfZXZyYyA9IHsKLQkuZXZlbnQgPSBhdWRwbGF5X2RzcF9ldmVudCwKLX07Ci0KLSNkZWZpbmUgYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcGxheSwgYXVkaW8tPnF1ZXVlX2lkLCBcCi0JCQljbWQsIGxlbikKLQotc3RhdGljIGludCBhdWRkZWNfZHNwX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCXUxNiBjZmdfZGVjX2NtZFtBVURQUF9DTURfQ0ZHX0RFQ19UWVBFX0xFTiAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCldOwotCi0JbWVtc2V0KGNmZ19kZWNfY21kLCAwLCBzaXplb2YoY2ZnX2RlY19jbWQpKTsKLQotCWNmZ19kZWNfY21kWzBdID0gQVVEUFBfQ01EX0NGR19ERUNfVFlQRTsKLQlpZiAoZW5hYmxlKQotCQljZmdfZGVjX2NtZFsxICsgYXVkaW8tPmRlY19pZF0gPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCUFVRFBQX0NNRF9FTkFfREVDX1YgfCBBVURERUNfREVDX0VWUkM7Ci0JZWxzZQotCQljZmdfZGVjX2NtZFsxICsgYXVkaW8tPmRlY19pZF0gPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCUFVRFBQX0NNRF9ESVNfREVDX1Y7Ci0KLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTEoJmNmZ19kZWNfY21kLCBzaXplb2YoY2ZnX2RlY19jbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX2V2cmMgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY29tbW9uLmNtZF9pZCA9IEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVM7Ci0JY21kLmNvbW1vbi5sZW5ndGggPSBzaXplb2YoY21kKTsKLQljbWQuY29tbW9uLmRlY19pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmNvbW1vbi5pbnB1dF9zYW1wbGluZ19mcmVxdWVuY3kgPSA4MDAwOwotCWNtZC5zdGVyZW9fY2ZnID0gQVVEUFBfQ01EX1BDTV9JTlRGX01PTk9fVjsKLQotCWF1ZHBwX3NlbmRfcXVldWUyKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX3JvdXRpbmdfbW9kZSBjbWQ7Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURQUF9DTURfUk9VVElOR19NT0RFOwotCWNtZC5vYmplY3RfbnVtYmVyID0gYXVkaW8tPmRlY19pZDsKLQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJY21kLnJvdXRpbmdfbW9kZSA9IFJPVVRJTkdfTU9ERV9GVFJUOwotCWVsc2UKLQkJY21kLnJvdXRpbmdfbW9kZSA9IFJPVVRJTkdfTU9ERV9SVDsKLQotCWF1ZHBwX3NlbmRfcXVldWUxKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJCQkgICAgICAgdW5zaWduZWQgaWR4LCB1bnNpZ25lZCBsZW4pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2JpdHN0cmVhbV9kYXRhX2F2YWlsX250MiBjbWQ7Ci0KLQljbWQuY21kX2lkID0gQVVEUExBWV9DTURfQklUU1RSRUFNX0RBVEFfQVZBSUxfTlQyOwotCWlmIChhdWRpby0+bWZpZWxkKQotCQljbWQuZGVjb2Rlcl9pZCA9IEFVREVWUkNfTUVUQUZJRUxEX01BU0sgfAotCQkJKGF1ZGlvLT5vdXRbaWR4XS5tZmllbGRfc3ogPj4gMSk7Ci0JZWxzZQotCQljbWQuZGVjb2Rlcl9pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmJ1Zl9wdHIgPSBhdWRpby0+b3V0W2lkeF0uYWRkcjsKLQljbWQuYnVmX3NpemUgPSBsZW4gLyAyOwotCWNtZC5wYXJ0aXRpb25fbnVtYmVyID0gMDsKLQkvKiBjb21wbGV0ZSB3cml0ZXMgdG8gdGhlIGlucHV0IGJ1ZmZlciAqLwotCXdtYigpOwotCXJldHVybiBhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGV2cmNfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfYnVmZmVyX3JlZnJlc2ggcmVmcmVzaF9jbWQ7Ci0KLQlyZWZyZXNoX2NtZC5jbWRfaWQgPSBBVURQTEFZX0NNRF9CVUZGRVJfUkVGUkVTSDsKLQlyZWZyZXNoX2NtZC5udW1fYnVmZmVycyA9IDE7Ci0JcmVmcmVzaF9jbWQuYnVmMF9hZGRyZXNzID0gYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHI7Ci0JcmVmcmVzaF9jbWQuYnVmMF9sZW5ndGggPSBhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uc2l6ZTsKLQotCXJlZnJlc2hfY21kLmJ1Zl9yZWFkX2NvdW50ID0gMDsKLQlNTV9EQkcoImJ1ZjBfYWRkcj0leCBidWYwX2xlbj0lZFxuIiwgcmVmcmVzaF9jbWQuYnVmMF9hZGRyZXNzLAotCQkJcmVmcmVzaF9jbWQuYnVmMF9sZW5ndGgpOwotCWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZyZWZyZXNoX2NtZCwgc2l6ZW9mKHJlZnJlc2hfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGV2cmNfY29uZmlnX2hvc3RwY20oc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfaHBjbV9idWZfY2ZnIGNmZ19jbWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWNmZ19jbWQuY21kX2lkID0gQVVEUExBWV9DTURfSFBDTV9CVUZfQ0ZHOwotCWNmZ19jbWQubWF4X2J1ZmZlcnMgPSAxOwotCWNmZ19jbWQuYnl0ZV9zd2FwID0gMDsKLQljZmdfY21kLmhvc3RwY21fY29uZmlnID0gKDB4ODAwMCkgfCAoMHg0MDAwKTsKLQljZmdfY21kLmZlZWRiYWNrX2ZyZXF1ZW5jeSA9IDE7Ci0JY2ZnX2NtZC5wYXJ0aXRpb25fbnVtYmVyID0gMDsKLQlhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY2ZnX2NtZCwgc2l6ZW9mKGNmZ19jbWQpKTsKLQotfQotCi1zdGF0aWMgdm9pZCBhdWRldnJjX3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWF1ZGlvLT5ydW5uaW5nKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAobmVlZGVkICYmICFhdWRpby0+d2ZsdXNoKSB7Ci0JCS8qIFdlIHdlcmUgY2FsbGVkIGZyb20gdGhlIGNhbGxiYWNrIGJlY2F1c2UgdGhlIERTUAotCQkgKiByZXF1ZXN0ZWQgbW9yZSBkYXRhLiAgTm90ZSB0aGF0IHRoZSBEU1AgZG9lcyB3YW50Ci0JCSAqIG1vcmUgZGF0YSwgYW5kIGlmIGEgYnVmZmVyIHdhcyBpbi1mbGlnaHQsIG1hcmsgaXQKLQkJICogYXMgYXZhaWxhYmxlIChzaW5jZSB0aGUgRFNQIG11c3Qgbm93IGJlIGRvbmUgd2l0aAotCQkgKiBpdCkuCi0JCSAqLwotCQlhdWRpby0+b3V0X25lZWRlZCA9IDE7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpIHsKLQkJCU1NX0RCRygiZnJhbWUgJWQgZnJlZVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJCWZyYW1lLT51c2VkID0gMDsKLQkJCWF1ZGlvLT5vdXRfdGFpbCBePSAxOwotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl9Ci0JfQotCi0JaWYgKGF1ZGlvLT5vdXRfbmVlZGVkKSB7Ci0JCS8qIElmIHRoZSBEU1AgY3VycmVudGx5IHdhbnRzIGRhdGEgYW5kIHdlIGhhdmUgYQotCQkgKiBidWZmZXIgYXZhaWxhYmxlLCB3ZSB3aWxsIHNlbmQgaXQgYW5kIHJlc2V0Ci0JCSAqIHRoZSBuZWVkZWQgZmxhZy4gIFdlJ2xsIG1hcmsgdGhlIGJ1ZmZlciBhcyBpbi1mbGlnaHQKLQkJICogc28gdGhhdCBpdCB3b24ndCBiZSByZWN5Y2xlZCB1bnRpbCB0aGUgbmV4dCBidWZmZXIKLQkJICogaXMgcmVxdWVzdGVkCi0JCSAqLwotCi0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkKSB7Ci0JCQlCVUdfT04oZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZik7Ci0JCQlNTV9EQkcoImZyYW1lICVkIGJ1c3lcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JCQlhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoYXVkaW8sIGF1ZGlvLT5vdXRfdGFpbCwKLQkJCQkJCSAgICBmcmFtZS0+dXNlZCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDB4ZmZmZmZmZmY7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCX0KLQl9Ci1kb25lOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHZvaWQgYXVkZXZyY19mbHVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JYXVkaW8tPm91dFswXS51c2VkID0gMDsKLQlhdWRpby0+b3V0WzFdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRfaGVhZCA9IDA7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9ieXRlcywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGV2cmNfZmx1c2hfcGNtX2J1ZihzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVpbnQ4X3QgaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBQQ01fQlVGX01BWF9DT1VOVDsgaW5kZXgrKykKLQkJYXVkaW8tPmluW2luZGV4XS51c2VkID0gMDsKLQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCWF1ZGlvLT5yZWFkX25leHQgPSAwOwotCWF1ZGlvLT5maWxsX25leHQgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRldnJjX2lvcG9ydF9yZXNldChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCS8qIE1ha2Ugc3VyZSByZWFkL3dyaXRlIHRocmVhZCBhcmUgZnJlZSBmcm9tCi0JICogc2xlZXAgYW5kIGtub3dpbmcgdGhhdCBzeXN0ZW0gaXMgbm90IGFibGUKLQkgKiB0byBwcm9jZXNzIGlvIHJlcXVlc3QgYXQgdGhlIG1vbWVudAotCSAqLwotCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JYXVkZXZyY19mbHVzaChhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JYXVkZXZyY19mbHVzaF9wY21fYnVmKGF1ZGlvKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotfQotCi1zdGF0aWMgaW50IGF1ZGV2cmNfZXZlbnRzX3BlbmRpbmcoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlbXB0eTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWVtcHR5ID0gIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gZW1wdHkgfHwgYXVkaW8tPmV2ZW50X2Fib3J0OwotfQotCi1zdGF0aWMgdm9pZCBhdWRldnJjX3Jlc2V0X2V2ZW50X3F1ZXVlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYXVkZXZyY19ldmVudCAqZHJ2X2V2dDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmV2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWRldnJjX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCXN0cnVjdCBhdWRldnJjX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKLX0KLQotCi1zdGF0aWMgbG9uZyBhdWRldnJjX3Byb2Nlc3NfZXZlbnRfcmVxKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHZvaWQgX191c2VyICphcmcpCi17Ci0JbG9uZyByYzsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50IHVzcl9ldnQ7Ci0Jc3RydWN0IGF1ZGV2cmNfZXZlbnQgKmRydl9ldnQgPSBOVUxMOwotCWludCB0aW1lb3V0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnVzcl9ldnQsIGFyZywgc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fZXZlbnQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQl0aW1lb3V0ID0gKGludCkgdXNyX2V2dC50aW1lb3V0X21zOwotCi0JaWYgKHRpbWVvdXQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCi0JCQlhdWRpby0+ZXZlbnRfd2FpdCwgYXVkZXZyY19ldmVudHNfcGVuZGluZyhhdWRpbyksCi0JCQltc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9IGVsc2UgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCWF1ZGlvLT5ldmVudF93YWl0LCBhdWRldnJjX2V2ZW50c19wZW5kaW5nKGF1ZGlvKSk7Ci0JfQotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGF1ZGlvLT5ldmVudF9hYm9ydCkgewotCQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAwOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyYyA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSkpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkZXZyY19ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQl9Ci0JaWYgKGRydl9ldnQpIHsKLQkJdXNyX2V2dC5ldmVudF90eXBlID0gZHJ2X2V2dC0+ZXZlbnRfdHlwZTsKLQkJdXNyX2V2dC5ldmVudF9wYXlsb2FkID0gZHJ2X2V2dC0+cGF5bG9hZDsKLQkJbGlzdF9hZGRfdGFpbCgmZHJ2X2V2dC0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQl9IGVsc2UKLQkJcmMgPSAtMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFyYyAmJiBjb3B5X3RvX3VzZXIoYXJnLCAmdXNyX2V2dCwgc2l6ZW9mKHVzcl9ldnQpKSkKLQkJcmMgPSAtRUZBVUxUOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2VuYWJsZV9lcShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCWlmIChhdWRpby0+ZXFfZW5hYmxlID09IGVuYWJsZSAmJiAhYXVkaW8tPmVxX25lZWRzX2NvbW1pdCkKLQkJcmV0dXJuIDA7Ci0KLQlhdWRpby0+ZXFfZW5hYmxlID0gZW5hYmxlOwotCi0JaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCWF1ZHBwX2RzcF9zZXRfZXEoYXVkaW8tPmRlY19pZCwgZW5hYmxlLCAmYXVkaW8tPmVxKTsKLQkJYXVkaW8tPmVxX25lZWRzX2NvbW1pdCA9IDA7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyBhdWRldnJjX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJICB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0JdWludDE2X3QgZW5hYmxlX21hc2s7Ci0JaW50IGVuYWJsZTsKLQlpbnQgcHJldl9zdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGlvbmZsYWcgPSAwOwotCWlvbl9waHlzX2FkZHJfdCBhZGRyID0gMDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKLQlpbnQgbGVuID0gMDsKLQotCU1NX0RCRygiY21kID0gJWRcbiIsIGNtZCk7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCQlzdGF0cy5ieXRlX2NvdW50ID0gYXVkcHBfYXZzeW5jX2J5dGVfY291bnQoYXVkaW8tPmRlY19pZCk7Ci0JCXN0YXRzLnNhbXBsZV9jb3VudCA9IGF1ZHBwX2F2c3luY19zYW1wbGVfY291bnQoYXVkaW8tPmRlY19pZCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0VOQUJMRV9BVURQUDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZlbmFibGVfbWFzaywgKHZvaWQgKikgYXJnLAotCQkJCQkJc2l6ZW9mKGVuYWJsZV9tYXNrKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQllbmFibGUgPSAoZW5hYmxlX21hc2sgJiBFUV9FTkFCTEUpID8gMSA6IDA7Ci0JCWF1ZGlvX2VuYWJsZV9lcShhdWRpbywgZW5hYmxlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3Bhbik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfUEFOOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnBhbiA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3Bhbik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfRVE6Ci0JCXByZXZfc3RhdGUgPSBhdWRpby0+ZXFfZW5hYmxlOwotCQlhdWRpby0+ZXFfZW5hYmxlID0gMDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhdWRpby0+ZXEubnVtX2JhbmRzLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGF1ZGlvLT5lcSkgLQotCQkJCShBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfQ09NTU9OX0xFTiArIDIpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPmVxX2VuYWJsZSA9IHByZXZfc3RhdGU7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAxOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCWlmICgtRUlOVkFMICE9IHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9FVkVOVCkgewotCQlNTV9EQkcoIkFVRElPX0dFVF9FVkVOVFxuIik7Ci0JCWlmIChtdXRleF90cnlsb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spKSB7Ci0JCQlyYyA9IGF1ZGV2cmNfcHJvY2Vzc19ldmVudF9yZXEoYXVkaW8sCi0JCQkJCSh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCQl9IGVsc2UKLQkJCXJjID0gLUVCVVNZOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKGNtZCA9PSBBVURJT19BQk9SVF9HRVRfRVZFTlQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCQlNTV9EQkcoIkFVRElPX1NUQVJUXG4iKTsKLQkJcmMgPSBhdWRldnJjX2VuYWJsZShhdWRpbyk7Ci0JCWlmICghcmMpIHsKLQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXQsCi0JCQkJYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORSwKLQkJCQltc2Vjc190b19qaWZmaWVzKE1TTV9BVURfREVDT0RFUl9XQUlUX01TKSk7Ci0JCQlNTV9JTkZPKCJkZWNfc3RhdGUgJWQgcmMgPSAlZFxuIiwgYXVkaW8tPmRlY19zdGF0ZSwgcmMpOwotCi0JCQlpZiAoYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfU1VDQ0VTUykKLQkJCQlyYyA9IC1FTk9ERVY7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU1RPUDoKLQkJTU1fREJHKCJBVURJT19TVE9QXG4iKTsKLQkJcmMgPSBhdWRldnJjX2Rpc2FibGUoYXVkaW8pOwotCQlhdWRldnJjX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19GTFVTSDoKLQkJTU1fREJHKCJBVURJT19GTFVTSFxuIik7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAxOwotCQlhdWRpby0+d2ZsdXNoID0gMTsKLQkJYXVkZXZyY19pb3BvcnRfcmVzZXQoYXVkaW8pOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpIHsKLQkJCWF1ZHBwX2ZsdXNoKGF1ZGlvLT5kZWNfaWQpOwotCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJIWF1ZGlvLT53Zmx1c2gpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCU1NX0VSUigiQVVESU9fRkxVU0ggaW50ZXJydXB0ZWRcbiIpOwotCQkJCXJjID0gLUVJTlRSOwotCQkJfQotCQl9IGVsc2UgewotCQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkJKCZjb25maWcsICh2b2lkICopYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlhdWRpby0+bWZpZWxkID0gY29uZmlnLm1ldGFfZmllbGQ7Ci0JCQlyYyA9IDA7Ci0JCQlNTV9EQkcoIkFVRElPX1NFVF9DT05GSUcgYXBwbGljYWJsZSBvbmx5IFwKLQkJCQlmb3IgbWV0YSBmaWVsZCBjb25maWd1cmF0aW9uXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19HRVRfQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IEJVRlNaOwotCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IDI7Ci0JCQljb25maWcuc2FtcGxlX3JhdGUgPSA4MDAwOwotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSAxOwotCQkJY29uZmlnLm1ldGFfZmllbGQgPSAwOwotCQkJY29uZmlnLnVudXNlZFswXSA9IDA7Ci0JCQljb25maWcudW51c2VkWzFdID0gMDsKLQkJCWNvbmZpZy51bnVzZWRbMl0gPSAwOwotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fR0VUX1BDTV9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19wY21fY29uZmlnIGNvbmZpZzsKLQkJCWNvbmZpZy5wY21fZmVlZGJhY2sgPSBhdWRpby0+cGNtX2ZlZWRiYWNrOwotCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfTUFYX0NPVU5UOwotCQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjb25maWcsIHNpemVvZihjb25maWcpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX1NFVF9QQ01fQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fcGNtX2NvbmZpZyBjb25maWc7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIKLQkJCSAgICAoJmNvbmZpZywgKHZvaWQgKilhcmcsIHNpemVvZihjb25maWcpKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjb25maWcucGNtX2ZlZWRiYWNrICE9IGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJCQlNTV9FUlIoIk5vdCBzdWZmaWNpZW50IHBlcm1pc3Npb24gdG8iCi0JCQkJCSAiY2hhbmdlIHRoZSBwbGF5YmFjayBtb2RlXG4iKTsKLQkJCQlyYyA9IC1FQUNDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoKGNvbmZpZy5idWZmZXJfY291bnQgPiBQQ01fQlVGX01BWF9DT1VOVCkgfHwKLQkJCSAgICAoY29uZmlnLmJ1ZmZlcl9jb3VudCA9PSAxKSkKLQkJCQljb25maWcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9NQVhfQ09VTlQ7Ci0KLQkJCWlmIChjb25maWcuYnVmZmVyX3NpemUgPCBQQ01fQlVGU1pfTUlOKQotCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47Ci0KLQkJCS8qIENoZWNrIGlmIHBjbSBmZWVkYmFjayBpcyByZXF1aXJlZCAqLwotCQkJaWYgKChjb25maWcucGNtX2ZlZWRiYWNrKSAmJiAoIWF1ZGlvLT5yZWFkX2RhdGEpKSB7Ci0JCQkJTU1fREJHKCJhbGxvY2F0ZSBQQ00gYnVmICVkXG4iLAotCQkJCQljb25maWcuYnVmZmVyX2NvdW50ICoKLQkJCQkJY29uZmlnLmJ1ZmZlcl9zaXplKTsKLQkJCQloYW5kbGUgPSBpb25fYWxsb2MoYXVkaW8tPmNsaWVudCwKLQkJCQkJKGNvbmZpZy5idWZmZXJfc2l6ZSAqCi0JCQkJCWNvbmZpZy5idWZmZXJfY291bnQpLAotCQkJCQlTWl80SywgSU9OX0hFQVAoSU9OX0FVRElPX0hFQVBfSUQpLCAwKTsKLQkJCQlpZiAoSVNfRVJSX09SX05VTEwoaGFuZGxlKSkgewotCQkJCQlNTV9FUlIoIlVuYWJsZSB0byBhbGxvYyBJL1AgYnVmZnNcbiIpOwotCQkJCQlhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgPSBOVUxMOwotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IGhhbmRsZTsKLQotCQkJCXJjID0gaW9uX3BoeXMoYXVkaW8tPmNsaWVudCAsCi0JCQkJCWhhbmRsZSwgJmFkZHIsICZsZW4pOwotCQkJCWlmIChyYykgewotCQkJCQlNTV9FUlIoIkludmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkJCQkodW5zaWduZWQgaW50KSBhZGRyLAotCQkJCQkJKHVuc2lnbmVkIGludCkgbGVuKTsKLQkJCQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgaGFuZGxlKTsKLQkJCQkJYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlID0gTlVMTDsKLQkJCQkJcmMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQlNTV9JTkZPKCJHb3QgdmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkJCQkodW5zaWduZWQgaW50KSBhdWRpby0+cmVhZF9waHlzLAotCQkJCQkJKHVuc2lnbmVkIGludCkgbGVuKTsKLQkJCQl9Ci0JCQkJYXVkaW8tPnJlYWRfcGh5cyA9IChpbnQzMl90KWFkZHI7Ci0KLQkJCQlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKGF1ZGlvLT5jbGllbnQsCi0JCQkJCWhhbmRsZSwgJmlvbmZsYWcpOwotCQkJCWlmIChyYykgewotCQkJCQlNTV9FUlIoImNvdWxkIG5vdCBnZXQgZmxhZ3NcbiIpOwotCQkJCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBoYW5kbGUpOwotCQkJCQlhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgPSBOVUxMOwotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlhdWRpby0+bWFwX3ZfcmVhZCA9IGlvbl9tYXBfa2VybmVsKAotCQkJCQlhdWRpby0+Y2xpZW50LCBoYW5kbGUpOwotCQkJCWlmIChJU19FUlIoYXVkaW8tPm1hcF92X3JlYWQpKSB7Ci0JCQkJCU1NX0VSUigiZmFpbGVkIHRvIG1hcCBtZW0iCi0JCQkJCQkJIiBmb3IgcmVhZCBidWZcbiIpOwotCQkJCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBoYW5kbGUpOwotCQkJCQlhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgPSBOVUxMOwotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdWludDhfdCBpbmRleDsKLQkJCQkJdWludDMyX3Qgb2Zmc2V0ID0gMDsKLQkJCQkJYXVkaW8tPnJlYWRfZGF0YSA9Ci0JCQkJCQlhdWRpby0+bWFwX3ZfcmVhZDsKLQkJCQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQkJCQkJYXVkaW8tPnBjbV9idWZfY291bnQgPQotCQkJCQkgICAgY29uZmlnLmJ1ZmZlcl9jb3VudDsKLQkJCQkJYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JCQkJCWF1ZGlvLT5maWxsX25leHQgPSAwOwotCi0JCQkJCWZvciAoaW5kZXggPSAwOwotCQkJCQkgICAgIGluZGV4IDwgY29uZmlnLmJ1ZmZlcl9jb3VudDsKLQkJCQkJICAgICBpbmRleCsrKSB7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLmRhdGEgPQotCQkJCQkJICAgIGF1ZGlvLT5yZWFkX2RhdGEgKyBvZmZzZXQ7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLmFkZHIgPQotCQkJCQkJICAgIGF1ZGlvLT5yZWFkX3BoeXMgKyBvZmZzZXQ7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLnNpemUgPQotCQkJCQkJICAgIGNvbmZpZy5idWZmZXJfc2l6ZTsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0udXNlZCA9IDA7Ci0JCQkJCQlvZmZzZXQgKz0gY29uZmlnLmJ1ZmZlcl9zaXplOwotCQkJCQl9Ci0JCQkJCU1NX0RCRygicmVhZCBidWY6IHBoeSBhZGRyIFwKLQkJCQkJCTB4JTA4eCBrZXJuZWwgYWRkciAweCUwOHhcbiIsCi0JCQkJCQlhdWRpby0+cmVhZF9waHlzLAotCQkJCQkJKGludClhdWRpby0+cmVhZF9kYXRhKTsKLQkJCQkJcmMgPSAwOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmMgPSAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX1BBVVNFOgotCQlNTV9EQkcoIkFVRElPX1BBVVNFICVsZFxuIiwgYXJnKTsKLQkJcmMgPSBhdWRwcF9wYXVzZShhdWRpby0+ZGVjX2lkLCAoaW50KSBhcmcpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotLyogT25seSB1c2VmdWwgaW4gdHVubmVsLW1vZGUgKi8KLXN0YXRpYyBpbnQgYXVkZXZyY19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IGEsIGxvZmZfdCBiLCBpbnQgZGF0YXN5bmMpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoIWF1ZGlvLT5ydW5uaW5nIHx8IGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmVfbm9sb2NrOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoIWF1ZGlvLT5vdXRbMF0udXNlZCAmJgotCQkhYXVkaW8tPm91dFsxXS51c2VkICYmCi0JCWF1ZGlvLT5vdXRfbmVlZGVkKSB8fCBhdWRpby0+d2ZsdXNoKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQllbHNlIGlmIChhdWRpby0+d2ZsdXNoKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogcGNtIGRtYW1pc3MgbWVzc2FnZSBpcyBzZW50IGNvbnRpbm91c2x5Ci0JICogd2hlbiBkZWNvZGVyIGlzIHN0YXJ2ZWQgc28gbm8gcmFjZQotCSAqIGNvbmRpdGlvbiBjb25jZXJuCi0JICovCi0JYXVkaW8tPnRlb3MgPSAwOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCWF1ZGlvLT50ZW9zIHx8IGF1ZGlvLT53Zmx1c2gpOwotCi0JaWYgKGF1ZGlvLT53Zmx1c2gpCi0JCXJjID0gLUVCVVNZOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotZG9uZV9ub2xvY2s6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRldnJjX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCSAgICBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlpbnQgcmMgPSAwOwotCWlmICghYXVkaW8tPnBjbV9mZWVkYmFjaykgewotCQlyZXR1cm4gMDsKLQkJLyogUENNIGZlZWRiYWNrIGlzIG5vdCBlbmFibGVkLiBOb3RoaW5nIHRvIHJlYWQgKi8KLQl9Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT5yZWFkX3dhaXQsCi0JCQkJKGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkID4gMCkgfHwKLQkJCQkoYXVkaW8tPnN0b3BwZWQpIHx8IChhdWRpby0+cmZsdXNoKSk7Ci0KLQkJTU1fREJHKCJ3YWl0IHRlcm1pbmF0ZWQgXG4iKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPnJmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY291bnQgPCBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCkgewotCQkJLyogUmVhZCBtdXN0IGhhcHBlbiBpbiBmcmFtZSBib3VuZGFyeS4gU2luY2UgZHJpdmVyIGRvZXMKLQkJCSAqIG5vdCBrbm93IGZyYW1lIHNpemUsIHJlYWQgY291bnQgbXVzdCBiZSBncmVhdGVyIG9yCi0JCQkgKiBlcXVhbCB0byBzaXplIG9mIFBDTSBzYW1wbGVzCi0JCQkgKi8KLQkJCU1NX0RCRygicmVhZCBzdG9wIC0gcGFydGlhbCBmcmFtZVxuIik7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygicmVhZCBmcm9tIGluWyVkXVxuIiwgYXVkaW8tPnJlYWRfbmV4dCk7Ci0JCQkvKiBvcmRlciByZWFkcyBmcm9tIHRoZSBvdXRwdXQgYnVmZmVyICovCi0JCQlybWIoKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIKLQkJCSAgICAoYnVmLCBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0uZGF0YSwKLQkJCSAgICAgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQpKSB7Ci0JCQkJTU1fRVJSKCJpbnZhbGlkIGFkZHIgJXggXG4iLAotCQkJCSAgICAgICAodW5zaWduZWQgaW50KWJ1Zik7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY291bnQgLT0gYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQ7Ci0JCQlidWYgKz0gYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQ7Ci0JCQlhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCA9IDA7Ci0JCQlpZiAoKCsrYXVkaW8tPnJlYWRfbmV4dCkgPT0gYXVkaW8tPnBjbV9idWZfY291bnQpCi0JCQkJYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JCQlicmVhazsKLQkJCQkvKiBGb3JjZSB0byBleGl0IHdoaWxlIGxvb3AKLQkJCQkgKiB0byBwcmV2ZW50IG91dHB1dCB0aHJlYWQKLQkJCQkgKiBzbGVlcCB0b28gbG9uZyBpZiBkYXRhIGlzCi0JCQkJICogbm90IHJlYWR5IGF0IHRoaXMgbW9tZW50Ci0JCQkJICovCi0KLQkJfQotCX0KLQkvKiBkb24ndCBmZWVkIG91dHB1dCBidWZmZXIgdG8gSFcgZGVjb2RlciBkdXJpbmcgZmx1c2hpbmcKLQkgKiBidWZmZXIgcmVmcmVzaCBjb21tYW5kIHdpbGwgYmUgc2VudCBvbmNlIGZsdXNoIGNvbXBsZXRlcwotCSAqIHNlbmQgYnVmIHJlZnJlc2ggY29tbWFuZCBoZXJlIGNhbiBjb25mdXNlIEhXIGRlY29kZXIKLQkgKi8KLQlpZiAoYXVkaW8tPmJ1Zl9yZWZyZXNoICYmICFhdWRpby0+cmZsdXNoKSB7Ci0JCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDA7Ci0JCU1NX0RCRygia2ljayBzdGFydCBwY20gZmVlZGJhY2sgYWdhaW5cbiIpOwotCQlhdWRldnJjX2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlpZiAoYnVmID4gc3RhcnQpCi0JCXJjID0gYnVmIC0gc3RhcnQ7Ci0JTU1fREJHKCJyZWFkICVkIGJ5dGVzXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGV2cmNfcHJvY2Vzc19lb3Moc3RydWN0IGF1ZGlvICphdWRpbywKLQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1Zl9zdGFydCwgdW5zaWduZWQgc2hvcnQgbWZpZWxkX3NpemUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQotCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoYXVkaW8tPm91dF9uZWVkZWQgJiYKLQkJYXVkaW8tPm91dFswXS51c2VkID09IDAgJiYKLQkJYXVkaW8tPm91dFsxXS51c2VkID09IDApCi0JCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcihmcmFtZS0+ZGF0YSwgYnVmX3N0YXJ0LCBtZmllbGRfc2l6ZSkpIHsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZnJhbWUtPm1maWVsZF9zeiA9IG1maWVsZF9zaXplOwotCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCWZyYW1lLT51c2VkID0gbWZpZWxkX3NpemU7Ci0JYXVkZXZyY19zZW5kX2RhdGEoYXVkaW8sIDApOwotCi1kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkZXZyY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQlzaXplX3QgeGZlcjsKLQljaGFyICpjcHlfcHRyOwotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplID0gMDsKLQlpbnQgcmMgPSAwLCBlb3NfY29uZGl0aW9uID0gQVVERVZSQ19FT1NfTk9ORTsKLQotCU1NX0RCRygiY250PSVkXG4iLCBjb3VudCk7Ci0KLQlpZiAoY291bnQgJiAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQkJY3B5X3B0ciA9IGZyYW1lLT5kYXRhOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkJICAgICAgKGZyYW1lLT51c2VkID09IDApCi0JCQkJCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCQkJCQl8fCAoYXVkaW8tPndmbHVzaCkpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGF1ZGlvLT5tZmllbGQpIHsKLQkJCWlmIChidWYgPT0gc3RhcnQpIHsKLQkJCQkvKiBQcm9jZXNzaW5nIGJlZ2lubmluZyBvZiB1c2VyIGJ1ZmZlciAqLwotCQkJCWlmIChfX2dldF91c2VyKG1maWVsZF9zaXplLAotCQkJCQkodW5zaWduZWQgc2hvcnQgX191c2VyICopIGJ1ZikpIHsKLQkJCQkJcmMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgaWYgKG1maWVsZF9zaXplID4gY291bnQpIHsKLQkJCQkJcmMgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJTU1fREJHKCJtZiBvZmZzZXRfdmFsICV4XG4iLCBtZmllbGRfc2l6ZSk7Ci0JCQkJaWYgKGNvcHlfZnJvbV91c2VyKGNweV9wdHIsIGJ1ZiwKLQkJCQkJCQltZmllbGRfc2l6ZSkpIHsKLQkJCQkJcmMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyogQ2hlY2sgaWYgRU9TIGZsYWcgaXMgc2V0IGFuZCBidWZmZXIgaGFzCi0JCQkJICogY29udGFpbnMganVzdCBtZXRhIGZpZWxkCi0JCQkJICovCi0JCQkJaWYgKGNweV9wdHJbQVVERVZSQ19FT1NfRkxHX09GRlNFVF0gJgotCQkJCQkJQVVERVZSQ19FT1NfRkxHX01BU0spIHsKLQkJCQkJTU1fREJHKCJlb3Mgc2V0XG4iKTsKLQkJCQkJZW9zX2NvbmRpdGlvbiA9IEFVREVWUkNfRU9TX1NFVDsKLQkJCQkJaWYgKG1maWVsZF9zaXplID09IGNvdW50KSB7Ci0JCQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlCi0JCQkJCWNweV9wdHJbQVVERVZSQ19FT1NfRkxHX09GRlNFVF0gJj0KLQkJCQkJCX5BVURFVlJDX0VPU19GTEdfTUFTSzsKLQkJCQl9Ci0JCQkJIC8qIENoZWNrIEVPUyB0byBzZWUgaWYgKi8KLQkJCQljcHlfcHRyICs9IG1maWVsZF9zaXplOwotCQkJCWNvdW50IC09IG1maWVsZF9zaXplOwotCQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKLQkJCSB9IGVsc2UgewotCQkJCSBtZmllbGRfc2l6ZSA9IDA7Ci0JCQkJIE1NX0RCRygiY29udGludW91cyBidWZmZXJcbiIpOwotCQkJIH0KLQkJCSBmcmFtZS0+bWZpZWxkX3N6ID0gbWZpZWxkX3NpemU7Ci0JCX0KLQotCQl4ZmVyID0gKGNvdW50ID4gKGZyYW1lLT5zaXplIC0gbWZpZWxkX3NpemUpKSA/Ci0JCQkoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkgOiBjb3VudDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNweV9wdHIsIGJ1ZiwgeGZlcikpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZnJhbWUtPnVzZWQgPSB4ZmVyICsgbWZpZWxkX3NpemU7Ci0JCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCQljb3VudCAtPSB4ZmVyOwotCQlidWYgKz0geGZlcjsKLQkJYXVkZXZyY19zZW5kX2RhdGEoYXVkaW8sIDApOwotCX0KLQlpZiAoZW9zX2NvbmRpdGlvbiA9PSBBVURFVlJDX0VPU19TRVQpCi0JCXJjID0gYXVkZXZyY19wcm9jZXNzX2VvcyhhdWRpbywgc3RhcnQsIG1maWVsZF9zaXplKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlpZiAoIXJjKSB7Ci0JCWlmIChidWYgPiBzdGFydCkKLQkJCXJldHVybiBidWYgLSBzdGFydDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGV2cmNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JTU1fSU5GTygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGZyZWVpbmdcbiIsIChpbnQpYXVkaW8pOwotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRldnJjX2Rpc2FibGUoYXVkaW8pOwotCWlmIChhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID09IDApCi0JCXJtdF9wdXRfcmVzb3VyY2UoYXVkaW8pOwotCWF1ZGV2cmNfZmx1c2goYXVkaW8pOwotCWF1ZGV2cmNfZmx1c2hfcGNtX2J1ZihhdWRpbyk7Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRwbGF5KTsKLQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQl1bnJlZ2lzdGVyX2Vhcmx5X3N1c3BlbmQoJmF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlKTsKLSNlbmRpZgotCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDE7Ci0Jd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCWF1ZGV2cmNfcmVzZXRfZXZlbnRfcXVldWUoYXVkaW8pOwotCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci0JaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci0JaWYgKGF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSAhPSBOVUxMKSB7Ci0JCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLQl9Ci0JaW9uX2NsaWVudF9kZXN0cm95KGF1ZGlvLT5jbGllbnQpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCWlmIChhdWRpby0+ZGVudHJ5KQotCQlkZWJ1Z2ZzX3JlbW92ZShhdWRpby0+ZGVudHJ5KTsKLSNlbmRpZgotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdGF0aWMgdm9pZCBhdWRldnJjX3Bvc3RfZXZlbnQoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHR5cGUsCi0JCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQpCi17Ci0Jc3RydWN0IGF1ZGV2cmNfZXZlbnQgKmVfbm9kZSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSkpIHsKLQkJZV9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZGV2cmNfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZV9ub2RlLT5saXN0KTsKLQl9IGVsc2UgewotCQllX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkZXZyY19ldmVudCksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWVfbm9kZSkgewotCQkJTU1fRVJSKCJObyBtZW0gdG8gcG9zdCBldmVudCAlZFxuIiwgdHlwZSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JZV9ub2RlLT5ldmVudF90eXBlID0gdHlwZTsKLQllX25vZGUtPnBheWxvYWQgPSBwYXlsb2FkOwotCi0JbGlzdF9hZGRfdGFpbCgmZV9ub2RlLT5saXN0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLX0KLQotc3RhdGljIHZvaWQgYXVkZXZyY19zdXNwZW5kKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRldnJjX3N1c3BlbmRfY3RsICpjdGwgPQotCQljb250YWluZXJfb2YoaCwgc3RydWN0IGF1ZGV2cmNfc3VzcGVuZF9jdGwsIG5vZGUpOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWF1ZGV2cmNfcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9TVVNQRU5ELCBwYXlsb2FkKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkZXZyY19yZXN1bWUoc3RydWN0IGVhcmx5X3N1c3BlbmQgKmgpCi17Ci0Jc3RydWN0IGF1ZGV2cmNfc3VzcGVuZF9jdGwgKmN0bCA9Ci0JCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgYXVkZXZyY19zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkZXZyY19wb3N0X2V2ZW50KGN0bC0+YXVkaW8sIEFVRElPX0VWRU5UX1JFU1VNRSwgcGF5bG9hZCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIHNzaXplX3QgYXVkZXZyY19kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGV2cmNfZGVidWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY29uc3QgaW50IGRlYnVnX2J1Zm1heCA9IDEwMjQ7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyWzEwMjRdOwotCWludCBuID0gMCwgaTsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCW4gPSBzY25wcmludGYoYnVmZmVyLCBkZWJ1Z19idWZtYXgsICJvcGVuZWQgJWRcbiIsIGF1ZGlvLT5vcGVuZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiZW5hYmxlZCAlZFxuIiwgYXVkaW8tPmVuYWJsZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkic3RvcHBlZCAlZFxuIiwgYXVkaW8tPnN0b3BwZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicGNtX2ZlZWRiYWNrICVkXG4iLCBhdWRpby0+cGNtX2ZlZWRiYWNrKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dF9idWZfc3ogJWRcbiIsIGF1ZGlvLT5vdXRbMF0uc2l6ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJwY21fYnVmX2NvdW50ICVkIFxuIiwgYXVkaW8tPnBjbV9idWZfY291bnQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicGNtX2J1Zl9zeiAlZCBcbiIsIGF1ZGlvLT5pblswXS5zaXplKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInZvbHVtZSAleCBcbiIsIGF1ZGlvLT52b2xfcGFuLnZvbHVtZSk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JLyogRm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgb25seSB1c2VmdWwgZm9yIGRlYnVnZ2luZyB3aGVuCi0JICogd2hlbiBwbGF5YmFjayBoYWx0cyB1bmV4cGVjdGVkbHkuIFRodXMsIG5vIG11dHVhbCBleGNsdXNpb24KLQkgKiBlbmZvcmNlZAotCSAqLwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkid2ZsdXNoICVkXG4iLCBhdWRpby0+d2ZsdXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInJmbHVzaCAlZFxuIiwgYXVkaW8tPnJmbHVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJydW5uaW5nICVkIFxuIiwgYXVkaW8tPnJ1bm5pbmcpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiZGVjIHN0YXRlICVkIFxuIiwgYXVkaW8tPmRlY19zdGF0ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJvdXRfbmVlZGVkICVkIFxuIiwgYXVkaW8tPm91dF9uZWVkZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X2hlYWQgJWQgXG4iLCBhdWRpby0+b3V0X2hlYWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X3RhaWwgJWQgXG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0WzBdLnVzZWQgJWQgXG4iLCBhdWRpby0+b3V0WzBdLnVzZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0WzFdLnVzZWQgJWQgXG4iLCBhdWRpby0+b3V0WzFdLnVzZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiYnVmZmVyX3JlZnJlc2ggJWQgXG4iLCBhdWRpby0+YnVmX3JlZnJlc2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicmVhZF9uZXh0ICVkIFxuIiwgYXVkaW8tPnJlYWRfbmV4dCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJmaWxsX25leHQgJWQgXG4iLCBhdWRpby0+ZmlsbF9uZXh0KTsKLQlmb3IgKGkgPSAwOyBpIDwgYXVkaW8tPnBjbV9idWZfY291bnQ7IGkrKykKLQkJbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkiaW5bJWRdLnNpemUgJWQgXG4iLCBpLCBhdWRpby0+aW5baV0udXNlZCk7Ci0JYnVmZmVyW25dID0gMDsKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkZXZyY19kZWJ1Z19mb3BzID0gewotCS5yZWFkID0gYXVkZXZyY19kZWJ1Z19yZWFkLAotCS5vcGVuID0gYXVkZXZyY19kZWJ1Z19vcGVuLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGF1ZGV2cmNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gTlVMTDsKLQlpbnQgcmMsIGRlY19hdHRyYiwgZGVjaWQsIGk7Ci0Jc3RydWN0IGF1ZGV2cmNfZXZlbnQgKmVfbm9kZSA9IE5VTEw7Ci0JdW5zaWduZWQgbWVtX3N6ID0gRE1BU1o7Ci0JdW5zaWduZWQgbG9uZyBpb25mbGFnID0gMDsKLQlpb25fcGh5c19hZGRyX3QgYWRkciA9IDA7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCA9IE5VTEw7Ci0JaW50IGxlbiA9IDA7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9ldnJjXyIgKyA1XTsKLSNlbmRpZgotCi0JLyogQWxsb2NhdGUgYXVkaW8gaW5zdGFuY2UsIHNldCB0byB6ZXJvICovCi0JYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWF1ZGlvKSB7Ci0JCU1NX0VSUigibm8gbWVtb3J5IHRvIGFsbG9jYXRlIGF1ZGlvIGluc3RhbmNlXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCU1NX0lORk8oImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBjcmVhdGVkXG4iLCAoaW50KWF1ZGlvKTsKLQotCS8qIEFsbG9jYXRlIHRoZSBkZWNvZGVyICovCi0JZGVjX2F0dHJiID0gQVVEREVDX0RFQ19FVlJDOwotCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9OT05UVU5ORUw7Ci0JCWF1ZGlvLT5wY21fZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREVfUExBWUJBQ0s7Ci0JfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWRlY19hdHRyYiB8PSBNU01fQVVEX01PREVfVFVOTkVMOwotCQlhdWRpby0+cGNtX2ZlZWRiYWNrID0gVFVOTkVMX01PREVfUExBWUJBQ0s7Ci0JfSBlbHNlIHsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JZGVjaWQgPSBhdWRwcF9hZGVjX2FsbG9jKGRlY19hdHRyYiwgJmF1ZGlvLT5tb2R1bGVfbmFtZSwKLQkJCSZhdWRpby0+cXVldWVfaWQpOwotCi0JaWYgKGRlY2lkIDwgMCkgewotCQlNTV9FUlIoIk5vIGZyZWUgZGVjb2RlciBhdmFpbGFibGUsIGZyZWVpbmcgaW5zdGFuY2UgMHglMDh4XG4iLAotCQkJCShpbnQpYXVkaW8pOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJZ290byBkb25lOwotCX0KLQotCWF1ZGlvLT5kZWNfaWQgPSBkZWNpZCAmIE1TTV9BVURfREVDT0RFUl9NQVNLOwotCi0JY2xpZW50ID0gbXNtX2lvbl9jbGllbnRfY3JlYXRlKFVJTlRfTUFYLCAiQXVkaW9fRVZSQ19DbGllbnQiKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoY2xpZW50KSkgewotCQlwcl9lcnIoIlVuYWJsZSB0byBjcmVhdGUgSU9OIGNsaWVudFxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBjbGllbnRfY3JlYXRlX2Vycm9yOwotCX0KLQlhdWRpby0+Y2xpZW50ID0gY2xpZW50OwotCi0JaGFuZGxlID0gaW9uX2FsbG9jKGNsaWVudCwgbWVtX3N6LCBTWl80SywKLQkJSU9OX0hFQVAoSU9OX0FVRElPX0hFQVBfSUQpLCAwKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoaGFuZGxlKSkgewotCQlNTV9FUlIoIlVuYWJsZSB0byBjcmVhdGUgYWxsb2NhdGUgTy9QIGJ1ZmZlcnNcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfYWxsb2NfZXJyb3I7Ci0JfQotCWF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUgPSBoYW5kbGU7Ci0KLQlyYyA9IGlvbl9waHlzKGNsaWVudCwgaGFuZGxlLCAmYWRkciwgJmxlbik7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiTy9QIGJ1ZmZlcnM6SW52YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I7Ci0JfSBlbHNlIHsKLQkJTU1fSU5GTygiTy9QIGJ1ZmZlcnM6dmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCX0KLQlhdWRpby0+cGh5cyA9IChpbnQzMl90KWFkZHI7Ci0KLQotCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MoY2xpZW50LCBoYW5kbGUsICZpb25mbGFnKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgZ2V0IGZsYWdzIGZvciB0aGUgaGFuZGxlXG4iKTsKLQkJZ290byBvdXRwdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I7Ci0JfQotCi0JYXVkaW8tPm1hcF92X3dyaXRlID0gaW9uX21hcF9rZXJuZWwoY2xpZW50LCBoYW5kbGUpOwotCWlmIChJU19FUlIoYXVkaW8tPm1hcF92X3dyaXRlKSkgewotCQlNTV9FUlIoImNvdWxkIG5vdCBtYXAgd3JpdGUgYnVmZmVyc1xuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRwdXRfYnVmZl9tYXBfZXJyb3I7Ci0JfQotCWF1ZGlvLT5kYXRhID0gYXVkaW8tPm1hcF92X3dyaXRlOwotCU1NX0RCRygid3JpdGUgYnVmOiBwaHkgYWRkciAweCUwOHgga2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQlhdWRpby0+cGh5cywgKGludClhdWRpby0+ZGF0YSk7Ci0KLQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykgewotCQlyYyA9IGF1ZG1ncl9vcGVuKCZhdWRpby0+YXVkbWdyKTsKLQkJaWYgKHJjKSB7Ci0JCQlNTV9FUlIoImF1ZG1nciBvcGVuIGZhaWxlZCwgZnJlZWluZyBpbnN0YW5jZSBcCi0JCQkJCTB4JTA4eFxuIiwgKGludClhdWRpbyk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQotCXJjID0gbXNtX2Fkc3BfZ2V0KGF1ZGlvLT5tb2R1bGVfbmFtZSwgJmF1ZGlvLT5hdWRwbGF5LAotCQkJJmF1ZHBsYXlfYWRzcF9vcHNfZXZyYywgYXVkaW8pOwotCi0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiZmFpbGVkIHRvIGdldCAlcyBtb2R1bGUsIGZyZWVpbmcgaW5zdGFuY2UgMHglMDh4XG4iLAotCQkJCWF1ZGlvLT5tb2R1bGVfbmFtZSwgKGludClhdWRpbyk7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrID09IFRVTk5FTF9NT0RFX1BMQVlCQUNLKQotCQkJYXVkbWdyX2Nsb3NlKCZhdWRpby0+YXVkbWdyKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmMgPSBybXRfZ2V0X3Jlc291cmNlKGF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJBRFNQIHJlc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgRVZSQyBzZXNzaW9uIFwKLQkJCSAweCUwOHggb24gZGVjb2RlcjogJWRcbiIsIChpbnQpYXVkaW8sIGF1ZGlvLT5kZWNfaWQpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykKLQkJCWF1ZG1ncl9jbG9zZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0KLQkvKiBJbml0aWFsaXplIGFsbCBsb2NrcyBvZiBhdWRpbyBpbnN0YW5jZSAqLwotCW11dGV4X2luaXQoJmF1ZGlvLT5sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPnJlYWRfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmRzcF9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jayk7Ci0KLQlhdWRpby0+b3V0WzBdLmRhdGEgPSBhdWRpby0+ZGF0YSArIDA7Ci0JYXVkaW8tPm91dFswXS5hZGRyID0gYXVkaW8tPnBoeXMgKyAwOwotCWF1ZGlvLT5vdXRbMF0uc2l6ZSA9IEJVRlNaOwotCi0JYXVkaW8tPm91dFsxXS5kYXRhID0gYXVkaW8tPmRhdGEgKyBCVUZTWjsKLQlhdWRpby0+b3V0WzFdLmFkZHIgPSBhdWRpby0+cGh5cyArIEJVRlNaOwotCWF1ZGlvLT5vdXRbMV0uc2l6ZSA9IEJVRlNaOwotCi0JYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gMHgzRkZGOwotCi0JYXVkZXZyY19mbHVzaChhdWRpbyk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQlhdWRpby0+b3BlbmVkID0gMTsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlzbnByaW50ZihuYW1lLCBzaXplb2YgbmFtZSwgIm1zbV9ldnJjXyUwNHgiLCBhdWRpby0+ZGVjX2lkKTsKLQlhdWRpby0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCU5VTEwsICh2b2lkICopIGF1ZGlvLCAmYXVkZXZyY19kZWJ1Z19mb3BzKTsKLQotCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCi0JCU1NX0RCRygiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5sZXZlbCA9IEVBUkxZX1NVU1BFTkRfTEVWRUxfRElTQUJMRV9GQjsKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5yZXN1bWUgPSBhdWRldnJjX3Jlc3VtZTsKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5zdXNwZW5kID0gYXVkZXZyY19zdXNwZW5kOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5hdWRpbyA9IGF1ZGlvOwotCXJlZ2lzdGVyX2Vhcmx5X3N1c3BlbmQoJmF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlKTsKLSNlbmRpZgotCWZvciAoaSA9IDA7IGkgPCBBVURFVlJDX0VWRU5UX05VTTsgaSsrKSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRldnJjX2V2ZW50KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChlX25vZGUpCi0JCQlsaXN0X2FkZF90YWlsKCZlX25vZGUtPmxpc3QsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JCWVsc2UgewotCQkJTU1fRVJSKCJldmVudCBwa3QgYWxsb2MgZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotZG9uZToKLQlyZXR1cm4gcmM7Ci1lcnI6Ci0JaW9uX3VubWFwX2tlcm5lbChjbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotb3V0cHV0X2J1ZmZfbWFwX2Vycm9yOgotb3V0cHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I6Ci1vdXRwdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I6Ci0JaW9uX2ZyZWUoY2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLW91dHB1dF9idWZmX2FsbG9jX2Vycm9yOgotCWlvbl9jbGllbnRfZGVzdHJveShjbGllbnQpOwotY2xpZW50X2NyZWF0ZV9lcnJvcjoKLQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fZXZyY19mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gYXVkZXZyY19vcGVuLAotCS5yZWxlYXNlID0gYXVkZXZyY19yZWxlYXNlLAotCS5yZWFkID0gYXVkZXZyY19yZWFkLAotCS53cml0ZSA9IGF1ZGV2cmNfd3JpdGUsCi0JLnVubG9ja2VkX2lvY3RsID0gYXVkZXZyY19pb2N0bCwKLQkuZnN5bmMgPSBhdWRldnJjX2ZzeW5jLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fZXZyY19taXNjID0gewotCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZSA9ICJtc21fZXZyYyIsCi0JLmZvcHMgPSAmYXVkaW9fZXZyY19mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkZXZyY19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2V2cmNfbWlzYyk7Ci0KLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGF1ZGV2cmNfZXhpdCh2b2lkKQotewotCW1pc2NfZGVyZWdpc3RlcigmYXVkaW9fZXZyY19taXNjKTsKLX0KLQotbW9kdWxlX2luaXQoYXVkZXZyY19pbml0KTsKLW1vZHVsZV9leGl0KGF1ZGV2cmNfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIEVWUkMgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19ldnJjX2luLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19ldnJjX2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhOGMzZTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fZXZyY19pbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2MyArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19ldnJjX2luLmMKLSAqCi0gKiBldnJjIGF1ZGlvIGlucHV0IGRldmljZQotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgYmFzZWQgaW4gcGFydCBvbiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2V2cmNfaW4uYywKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fcWNwLmg+Ci0KLQotI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KLQotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fbWVtdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fcnBjcm91dGVyLmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdS5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXVfZG9tYWlucy5oPgotCi0jaW5jbHVkZSAiYXVkbWdyLmgiCi0KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHJlcHJvYy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcmVwcm9jY21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcmVwcm9jbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHJlY2NtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcmVjbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi0jZGVmaW5lIEZSQU1FX0hFQURFUl9TSVpFCTggLyogOCBieXRlcyBmcmFtZSBoZWFkZXIgKi8KLSNkZWZpbmUgTlRfRlJBTUVfSEVBREVSX1NJWkUJMjQgLyogMjQgYnl0ZXMgZnJhbWUgaGVhZGVyICovCi0vKiBGUkFNRV9OVU0gbXVzdCBiZSBhIHBvd2VyIG9mIHR3byAqLwotI2RlZmluZSBGUkFNRV9OVU0JOAotI2RlZmluZSBFVlJDX0ZSQU1FX1NJWkUJMzYgLyogMzYgYnl0ZXMgZGF0YSAqLwotLypUdW5uZWwgbW9kZSA6IDM2IGJ5dGVzIGRhdGEgKyA4IGJ5dGUgaGVhZGVyKi8KLSNkZWZpbmUgRlJBTUVfU0laRQkoRVZSQ19GUkFNRV9TSVpFICsgRlJBTUVfSEVBREVSX1NJWkUpCi0gLyogMzYgYnl0ZXMgZGF0YSAgKyAyNCBtZXRhIGZpZWxkKi8KLSNkZWZpbmUgTlRfRlJBTUVfU0laRQkoRVZSQ19GUkFNRV9TSVpFICsgTlRfRlJBTUVfSEVBREVSX1NJWkUpCi0jZGVmaW5lIERNQVNaCQkoRlJBTUVfU0laRSAqIEZSQU1FX05VTSkKLSNkZWZpbmUgTlRfRE1BU1oJKE5UX0ZSQU1FX1NJWkUgKiBGUkFNRV9OVU0pCi0jZGVmaW5lIE9VVF9GUkFNRV9OVU0JMgotI2RlZmluZSBPVVRfQlVGRkVSX1NJWkUgKDQgKiAxMDI0ICsgTlRfRlJBTUVfSEVBREVSX1NJWkUpCi0jZGVmaW5lIEJVRkZFUl9TSVpFCShPVVRfQlVGRkVSX1NJWkUgKiBPVVRfRlJBTUVfTlVNKQotCi0jZGVmaW5lIEFVRFBSRVBST0NfRVZSQ19FT1NfRkxHX09GRlNFVCAweDBBIC8qIE9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBidWZmZXIqLwotI2RlZmluZSBBVURQUkVQUk9DX0VWUkNfRU9TX0ZMR19NQVNLIDB4MDEKLSNkZWZpbmUgQVVEUFJFUFJPQ19FVlJDX0VPU19OT05FIDB4MCAvKiBObyBFT1MgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgQVVEUFJFUFJPQ19FVlJDX0VPU19TRVQgMHgxIC8qIEVPUyBzZXQgaW4gbWV0YSBmaWVsZCAqLwotCi1zdHJ1Y3QgYnVmZmVyIHsKLQl2b2lkICpkYXRhOwotCXVpbnQzMl90IHNpemU7Ci0JdWludDMyX3QgcmVhZDsKLQl1aW50MzJfdCBhZGRyOwotCXVpbnQzMl90IHVzZWQ7Ci0JdWludDMyX3QgbWZpZWxkX3N6OwotfTsKLQotc3RydWN0IGF1ZGlvX2V2cmNfaW4gewotCXN0cnVjdCBidWZmZXIgaW5bRlJBTUVfTlVNXTsKLQotCXNwaW5sb2NrX3QgZHNwX2xvY2s7Ci0KLQlhdG9taWNfdCBpbl9ieXRlczsKLQlhdG9taWNfdCBpbl9zYW1wbGVzOwotCi0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IG11dGV4IHJlYWRfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfZW5hYmxlOwotCS8qd3JpdGUgc2VjdGlvbiovCi0Jc3RydWN0IGJ1ZmZlciBvdXRbT1VUX0ZSQU1FX05VTV07Ci0KLQl1aW50OF90IG91dF9oZWFkOwotCXVpbnQ4X3Qgb3V0X3RhaWw7Ci0JdWludDhfdCBvdXRfbmVlZGVkOwkvKiBudW1iZXIgb2YgYnVmZmVycyB0aGUgZHNwIGlzIHdhaXRpbmcgZm9yICovCi0JdWludDMyX3Qgb3V0X2NvdW50OwotCi0Jc3RydWN0IG11dGV4IHdyaXRlX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd3JpdGVfd2FpdDsKLQlpbnQzMl90IG91dF9waHlzOyAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHdyaXRlIGJ1ZmZlciAqLwotCWNoYXIgKm91dF9kYXRhOwotCWludCBtZmllbGQ7IC8qIG1ldGEgZmllbGQgZW1iZWRkZWQgaW4gZGF0YSAqLwotCWludCB3Zmx1c2g7IC8qd3JpdGUgZmx1c2ggKi8KLQlpbnQgcmZsdXNoOyAvKnJlYWQgZmx1c2gqLwotCWludCBvdXRfZnJhbWVfY250OwotCi0Jc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqYXVkcmVjOwotCi0KLQkvKiBjb25maWd1cmF0aW9uIHRvIHVzZSBvbiBuZXh0IGVuYWJsZSAqLwotCXVpbnQzMl90IHNhbXBfcmF0ZTsKLQl1aW50MzJfdCBjaGFubmVsX21vZGU7Ci0JdWludDMyX3QgYnVmZmVyX3NpemU7IC8qIEZyYW1lIHNpemUgKDM2IGJ5dGVzKSAqLwotCXVpbnQzMl90IGVuY190eXBlOyAvKiAxMSBmb3IgRVZSQyAqLwotCXVpbnQzMl90IG1vZGU7IC8qIFQgb3IgTlQgTW9kZSovCi0KLQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZyBjZmc7Ci0KLQl1aW50MzJfdCBkc3BfY250OwotCXVpbnQzMl90IGluX2hlYWQ7IC8qIG5leHQgYnVmZmVyIGRzcCB3aWxsIHdyaXRlICovCi0JdWludDMyX3QgaW5fdGFpbDsgLyogbmV4dCBidWZmZXIgcmVhZCgpIHdpbGwgcmVhZCAqLwotCXVpbnQzMl90IGluX2NvdW50OyAvKiBudW1iZXIgb2YgYnVmZmVycyBhdmFpbGFibGUgdG8gcmVhZCgpICovCi0KLQl1aW50MzJfdCBlb3NfYWNrOwotCXVpbnQzMl90IGZsdXNoX2FjazsKLQotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIHF1ZXVlX2lkczsKLQl1aW50MTZfdCBlbmNfaWQ7IC8qIFNlc3Npb24gSWQgKi8KLQotCXVuc2lnbmVkIHNob3J0IHNhbXBfcmF0ZV9pbmRleDsKLQl1aW50MzJfdCBhdWRyZWNfb2JqX2lkeCA7Ci0KLQlzdHJ1Y3QgYXVkbWdyIGF1ZG1ncjsKLQotCS8qIGRhdGEgYWxsb2NhdGVkIGZvciB2YXJpb3VzIGJ1ZmZlcnMgKi8KLQljaGFyICpkYXRhOwotCWRtYV9hZGRyX3QgcGh5czsKLQotCXZvaWQgKm1hcF92X3JlYWQ7Ci0Jdm9pZCAqbWFwX3Zfd3JpdGU7Ci0KLQlpbnQgb3BlbmVkOwotCWludCBlbmFibGVkOwotCWludCBydW5uaW5nOwotCWludCBzdG9wcGVkOyAvKiBzZXQgd2hlbiBzdG9wcGVkLCBjbGVhcmVkIG9uIGZsdXNoICovCi0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaW5wdXRfYnVmZl9oYW5kbGU7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKm91dHB1dF9idWZmX2hhbmRsZTsKLQotCXN0cnVjdCBhdWRyZWNfc2Vzc2lvbl9pbmZvIHNlc3Npb25faW5mbzsgLyphdWRyZWMgc2Vzc2lvbiBpbmZvKi8KLX07Ci0KLXN0cnVjdCBhdWRpb19mcmFtZSB7Ci0JdWludDE2X3QgZnJhbWVfY291bnRfbHN3OwotCXVpbnQxNl90IGZyYW1lX2NvdW50X21zdzsKLQl1aW50MTZfdCBmcmFtZV9sZW5ndGg7Ci0JdWludDE2X3QgZXJhc2VkX3BjbTsKLQl1bnNpZ25lZCBjaGFyIHJhd19iaXRzdHJlYW1bXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhdWRpb19mcmFtZV9udCB7Ci0JdWludDE2X3QgbWV0YWRhdGFfbGVuOwotCXVpbnQxNl90IGZyYW1lX2NvdW50X2xzdzsKLQl1aW50MTZfdCBmcmFtZV9jb3VudF9tc3c7Ci0JdWludDE2X3QgZnJhbWVfbGVuZ3RoOwotCXVpbnQxNl90IGVyYXNlZF9wY207Ci0JdWludDE2X3QgcmVzZXJ2ZWQ7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9kd29yZF9sc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9kd29yZF9tc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9sc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9tc3c7Ci0JdWludDE2X3QgbmZsYWdfbHN3OwotCXVpbnQxNl90IG5mbGFnX21zdzsKLQl1bnNpZ25lZCBjaGFyIHJhd19iaXRzdHJlYW1bXTsgLyogc2FtcGxlcyAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGV2cmNfZW5jb2RlZF9tZXRhX291dCB7Ci0JdWludDE2X3QgbWV0YWRhdGFfbGVuOwotCXVpbnQxNl90IHRpbWVfc3RhbXBfZHdvcmRfbHN3OwotCXVpbnQxNl90IHRpbWVfc3RhbXBfZHdvcmRfbXN3OwotCXVpbnQxNl90IHRpbWVfc3RhbXBfbHN3OwotCXVpbnQxNl90IHRpbWVfc3RhbXBfbXN3OwotCXVpbnQxNl90IG5mbGFnX2xzdzsKLQl1aW50MTZfdCBuZmxhZ19tc3c7Ci19OwotCi0vKiBBdWRyZWMgUXVldWUgY29tbWFuZCBzZW50IG1hY3JvJ3MgKi8KLSNkZWZpbmUgYXVkaW9fc2VuZF9xdWV1ZV9wcmUoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHByZSwgUURTUF91UEF1ZFByZVByb2NDbWRRdWV1ZSwgY21kLCBsZW4pCi0KLSNkZWZpbmUgYXVkaW9fc2VuZF9xdWV1ZV9yZWNicyhhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcmVjLCAoKGF1ZGlvLT5xdWV1ZV9pZHMgJiAweEZGRkYwMDAwKSA+PiAxNiksXAotCQkJY21kLCBsZW4pCi0jZGVmaW5lIGF1ZGlvX3NlbmRfcXVldWVfcmVjKGF1ZGlvLCBjbWQsIGxlbikgXAotCW1zbV9hZHNwX3dyaXRlKGF1ZGlvLT5hdWRyZWMsIChhdWRpby0+cXVldWVfaWRzICYgMHgwMDAwRkZGRiksXAotCQkJY21kLCBsZW4pCi0KLXN0YXRpYyBpbnQgYXVkZXZyY19pbl9kc3BfZW5hYmxlKHN0cnVjdCBhdWRpb19ldnJjX2luICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgaW50IGF1ZGV2cmNfaW5fZW5jcGFyYW1fY29uZmlnKHN0cnVjdCBhdWRpb19ldnJjX2luICphdWRpbyk7Ci1zdGF0aWMgaW50IGF1ZGV2cmNfaW5fZW5jbWVtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9fZXZyY19pbiAqYXVkaW8pOwotc3RhdGljIGludCBhdWRldnJjX2luX2RzcF9yZWFkX2J1ZmZlcihzdHJ1Y3QgYXVkaW9fZXZyY19pbiAqYXVkaW8sCi0JCQkJdWludDMyX3QgcmVhZF9jbnQpOwotc3RhdGljIHZvaWQgYXVkZXZyY19pbl9mbHVzaChzdHJ1Y3QgYXVkaW9fZXZyY19pbiAqYXVkaW8pOwotCi1zdGF0aWMgdm9pZCBhdWRldnJjX2luX2dldF9kc3BfZnJhbWVzKHN0cnVjdCBhdWRpb19ldnJjX2luICphdWRpbyk7Ci1zdGF0aWMgaW50IGF1ZHBjbV9jb25maWcoc3RydWN0IGF1ZGlvX2V2cmNfaW4gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZGV2cmNfb3V0X2ZsdXNoKHN0cnVjdCBhdWRpb19ldnJjX2luICphdWRpbyk7Ci1zdGF0aWMgaW50IGF1ZGV2cmNfaW5fcm91dGluZ19tb2RlX2NvbmZpZyhzdHJ1Y3QgYXVkaW9fZXZyY19pbiAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcmVjX3BjbV9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvX2V2cmNfaW4gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpOwotc3RhdGljIHZvaWQgYXVkZXZyY19udF9pbl9nZXRfZHNwX2ZyYW1lcyhzdHJ1Y3QgYXVkaW9fZXZyY19pbiAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkZXZyY19pbl9mbHVzaChzdHJ1Y3QgYXVkaW9fZXZyY19pbiAqYXVkaW8pOwotCi1zdGF0aWMgdW5zaWduZWQgY29udmVydF9zYW1wX2luZGV4KHVuc2lnbmVkIGluZGV4KQotewotCXN3aXRjaCAoaW5kZXgpIHsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzQ4MDAwOglyZXR1cm4gNDgwMDA7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV80NDEwMDoJcmV0dXJuIDQ0MTAwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMzIwMDA6CXJldHVybiAzMjAwMDsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzI0MDAwOglyZXR1cm4gMjQwMDA7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8yMjA1MDoJcmV0dXJuIDIyMDUwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMTYwMDA6CXJldHVybiAxNjAwMDsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzEyMDAwOglyZXR1cm4gMTIwMDA7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xMTAyNToJcmV0dXJuIDExMDI1OwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfODAwMDoJcmV0dXJuIDgwMDA7Ci0JZGVmYXVsdDoJCQkJcmV0dXJuIDExMDI1OwotCX0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkc3AgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgdm9pZCBhdWRwcmVfZHNwX2V2ZW50KHZvaWQgKmRhdGEsIHVuc2lnbmVkIGlkLCAgdm9pZCAqZXZlbnRfZGF0YSkKLXsKLQotCXVpbnQxNl90ICptc2cgPSBldmVudF9kYXRhOwotCi0JaWYgKCFtc2cpCi0JCXJldHVybjsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBSRVBST0NfTVNHX0NNRF9DRkdfRE9ORV9NU0c6Ci0JCU1NX0RCRygidHlwZSAlZCwgc3RhdHVzX2ZsYWcgJWRcbiIsXAotCQkJbXNnWzBdLCBtc2dbMV0pOwotCQlicmVhazsKLQljYXNlIEFVRFBSRVBST0NfTVNHX0VSUk9SX01TR19JRDoKLQkJTU1fSU5GTygiZXJyX2luZGV4ICVkXG4iLCBtc2dbMF0pOwotCQlicmVhazsKLQljYXNlIEFEU1BfTUVTU0FHRV9JRDoKLQkJTU1fREJHKCJSZWNlaXZlZCBBRFNQIGV2ZW50OiBtb2R1bGUgZW5hYmxlKGF1ZHByZXByb2N0YXNrKVxuIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1NX0VSUigidW5rbm93biBldmVudCAlZFxuIiwgaWQpOwotCX0KLX0KLQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkZXZyY19pbl9lbmFibGUoc3RydWN0IGF1ZGlvX2V2cmNfaW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRtZ3JfY29uZmlnIGNmZzsKLQlpbnQgcmM7Ci0KLQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JY2ZnLnR4X3JhdGUgPSBhdWRpby0+c2FtcF9yYXRlOwotCWNmZy5yeF9yYXRlID0gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfTk9ORTsKLQljZmcuZGVmX21ldGhvZCA9IFJQQ19BVURfREVGX01FVEhPRF9SRUNPUkQ7Ci0JY2ZnLmNvZGVjID0gUlBDX0FVRF9ERUZfQ09ERUNfRVZSQzsKLQljZmcuc25kX21ldGhvZCA9IFJQQ19TTkRfTUVUSE9EX01JREk7Ci0KLQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJcmMgPSBhdWRtZ3JfZW5hYmxlKCZhdWRpby0+YXVkbWdyLCAmY2ZnKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlpZiAoYXVkcHJlcHJvY19lbmFibGUoYXVkaW8tPmVuY19pZCwKLQkJCQkmYXVkcHJlX2RzcF9ldmVudCwgYXVkaW8pKSB7Ci0JCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRwcmVwcm9jKSBmYWlsZWRcbiIpOwotCQkJYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQkvKnVwZGF0ZSBhdXJlYyBzZXNzaW9uIGluZm8gaW4gYXVkcHJlcHJvYyBsYXllciovCi0JCWF1ZGlvLT5zZXNzaW9uX2luZm8uc2Vzc2lvbl9pZCA9IGF1ZGlvLT5lbmNfaWQ7Ci0JCWF1ZGlvLT5zZXNzaW9uX2luZm8uc2FtcGxpbmdfZnJlcSA9Ci0JCQljb252ZXJ0X3NhbXBfaW5kZXgoYXVkaW8tPnNhbXBfcmF0ZSk7Ci0JCWF1ZHByZXByb2NfdXBkYXRlX2F1ZHJlY19pbmZvKCZhdWRpby0+c2Vzc2lvbl9pbmZvKTsKLQl9Ci0KLQlpZiAobXNtX2Fkc3BfZW5hYmxlKGF1ZGlvLT5hdWRyZWMpKSB7Ci0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkgewotCQkJYXVkcHJlcHJvY19kaXNhYmxlKGF1ZGlvLT5lbmNfaWQsIGF1ZGlvKTsKLQkJCWF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJfQotCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRyZWMpIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWF1ZGlvLT5lbmFibGVkID0gMTsKLQlhdWRldnJjX2luX2RzcF9lbmFibGUoYXVkaW8sIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRldnJjX2luX2Rpc2FibGUoc3RydWN0IGF1ZGlvX2V2cmNfaW4gKmF1ZGlvKQotewotCWlmIChhdWRpby0+ZW5hYmxlZCkgewotCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0KLQkJYXVkZXZyY19pbl9kc3BfZW5hYmxlKGF1ZGlvLCAwKTsKLQotCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0X2VuYWJsZSwKLQkJCQlhdWRpby0+cnVubmluZyA9PSAwLCAxKkhaKTsKLQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHJlYyk7Ci0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkgewotCQkJYXVkcHJlcHJvY19kaXNhYmxlKGF1ZGlvLT5lbmNfaWQsIGF1ZGlvKTsKLQkJCS8qcmVzZXQgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSBpbmZvcm1hdGlvbiBhdAotCQkJYXVkcHJlcHJvYyBsYXllciovCi0JCQlhdWRpby0+c2Vzc2lvbl9pbmZvLnNhbXBsaW5nX2ZyZXEgPSAwOwotCQkJYXVkcHJlcHJvY191cGRhdGVfYXVkcmVjX2luZm8oJmF1ZGlvLT5zZXNzaW9uX2luZm8pOwotCQkJYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhdWRldnJjX2luX2dldF9kc3BfZnJhbWVzKHN0cnVjdCBhdWRpb19ldnJjX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkaW9fZnJhbWUgKmZyYW1lOwotCXVpbnQzMl90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpbmRleCA9IGF1ZGlvLT5pbl9oZWFkOwotCi0JZnJhbWUgPSAodm9pZCAqKSAoKChjaGFyICopYXVkaW8tPmluW2luZGV4XS5kYXRhKSAtCi0JCQlzaXplb2YoKmZyYW1lKSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9IGZyYW1lLT5mcmFtZV9sZW5ndGg7Ci0KLQkvKiBzdGF0aXN0aWNzIG9mIHJlYWQgKi8KLQlhdG9taWNfYWRkKGF1ZGlvLT5pbltpbmRleF0uc2l6ZSwgJmF1ZGlvLT5pbl9ieXRlcyk7Ci0JYXRvbWljX2FkZCgxLCAmYXVkaW8tPmluX3NhbXBsZXMpOwotCi0JYXVkaW8tPmluX2hlYWQgPSAoYXVkaW8tPmluX2hlYWQgKyAxKSAmIChGUkFNRV9OVU0gLSAxKTsKLQotCS8qIElmIG92ZXJmbG93LCBtb3ZlIHRoZSB0YWlsIGluZGV4IGZvd2FyZC4gKi8KLQlpZiAoYXVkaW8tPmluX2hlYWQgPT0gYXVkaW8tPmluX3RhaWwpIHsKLQkJTU1fRVJSKCJFcnJvciEgbm90IGFibGUgdG8ga2VlcCB1cCB0aGUgcmVhZFxuIik7Ci0JCWF1ZGlvLT5pbl90YWlsID0gKGF1ZGlvLT5pbl90YWlsICsgMSkgJiAoRlJBTUVfTlVNIC0gMSk7Ci0JCU1NX0VSUigiaW5fY291bnQgPSAlZFxuIiwgYXVkaW8tPmluX2NvdW50KTsKLQl9IGVsc2UKLQkJYXVkaW8tPmluX2NvdW50Kys7Ci0KLQlhdWRldnJjX2luX2RzcF9yZWFkX2J1ZmZlcihhdWRpbywgYXVkaW8tPmRzcF9jbnQrKyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0KLQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGV2cmNfbnRfaW5fZ2V0X2RzcF9mcmFtZXMoc3RydWN0IGF1ZGlvX2V2cmNfaW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRpb19mcmFtZV9udCAqbnRfZnJhbWU7Ci0JdWludDMyX3QgaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWluZGV4ID0gYXVkaW8tPmluX2hlYWQ7Ci0JbnRfZnJhbWUgPSAodm9pZCAqKSAoKChjaGFyICopYXVkaW8tPmluW2luZGV4XS5kYXRhKSAtIFwKLQkJCQlzaXplb2Yoc3RydWN0IGF1ZGlvX2ZyYW1lX250KSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9IG50X2ZyYW1lLT5mcmFtZV9sZW5ndGg7Ci0JLyogc3RhdGlzdGljcyBvZiByZWFkICovCi0JYXRvbWljX2FkZChhdWRpby0+aW5baW5kZXhdLnNpemUsICZhdWRpby0+aW5fYnl0ZXMpOwotCWF0b21pY19hZGQoMSwgJmF1ZGlvLT5pbl9zYW1wbGVzKTsKLQotCWF1ZGlvLT5pbl9oZWFkID0gKGF1ZGlvLT5pbl9oZWFkICsgMSkgJiAoRlJBTUVfTlVNIC0gMSk7Ci0KLQkvKiBJZiBvdmVyZmxvdywgbW92ZSB0aGUgdGFpbCBpbmRleCBmb3dhcmQuICovCi0JaWYgKGF1ZGlvLT5pbl9oZWFkID09IGF1ZGlvLT5pbl90YWlsKQotCQlNTV9EQkcoIkVycm9yISBub3QgYWJsZSB0byBrZWVwIHVwIHRoZSByZWFkXG4iKTsKLQllbHNlCi0JCWF1ZGlvLT5pbl9jb3VudCsrOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cCgmYXVkaW8tPndhaXQpOwotfQotCi1zdGF0aWMgaW50IGF1ZHJlY19wY21fYnVmZmVyX3B0cl9yZWZyZXNoKHN0cnVjdCBhdWRpb19ldnJjX2luICphdWRpbywKLQkJCQkgICAgICAgdW5zaWduZWQgaWR4LCB1bnNpZ25lZCBsZW4pCi17Ci0Jc3RydWN0IGF1ZHJlY19jbWRfcGNtX2J1ZmZlcl9wdHJfcmVmcmVzaF9hcm1fZW5jIGNtZDsKLQotCWlmIChsZW4gPT0gIE5UX0ZSQU1FX0hFQURFUl9TSVpFKQotCQlsZW4gPSBsZW4gLyAyOwotCWVsc2UKLQkJbGVuID0gKGxlbiArIE5UX0ZSQU1FX0hFQURFUl9TSVpFKSAvIDI7Ci0JTU1fREJHKCJsZW4gPSAlZFxuIiwgbGVuKTsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURSRUNfQ01EX1BDTV9CVUZGRVJfUFRSX1JFRlJFU0hfQVJNX1RPX0VOQzsKLQljbWQubnVtX2J1ZmZlcnMgPSAxOwotCWlmIChjbWQubnVtX2J1ZmZlcnMgPT0gMSkgewotCQljbWQuYnVmX2FkZHJlc3NfbGVuZ3RoWzBdID0gKGF1ZGlvLT5vdXRbaWR4XS5hZGRyICYKLQkJCQkJCQkweGZmZmYwMDAwKSA+PiAxNjsKLQkJY21kLmJ1Zl9hZGRyZXNzX2xlbmd0aFsxXSA9IChhdWRpby0+b3V0W2lkeF0uYWRkciAmCi0JCQkJCQkJMHgwMDAwZmZmZik7Ci0JCWNtZC5idWZfYWRkcmVzc19sZW5ndGhbMl0gPSAobGVuICYgMHhmZmZmMDAwMCkgPj4gMTY7Ci0JCWNtZC5idWZfYWRkcmVzc19sZW5ndGhbM10gPSAobGVuICYgMHgwMDAwZmZmZik7Ci0JfQotCWF1ZGlvLT5vdXRfZnJhbWVfY250Kys7Ci0JcmV0dXJuIGF1ZGlvX3NlbmRfcXVldWVfcmVjKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcGNtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9fZXZyY19pbiAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHJlY19jbWRfcGNtX2NmZ19hcm1fdG9fZW5jIGNtZDsKLQlNTV9EQkcoIlxuIik7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUkVDX0NNRF9QQ01fQ0ZHX0FSTV9UT19FTkM7Ci0JY21kLmNvbmZpZ191cGRhdGVfZmxhZyA9IEFVRFJFQ19QQ01fQ09ORklHX1VQREFURV9GTEFHX0VOQUJMRTsKLQljbWQuZW5hYmxlX2ZsYWcgPSBBVURSRUNfRU5BQkxFX0ZMQUdfVkFMVUU7Ci0JY21kLnNhbXBsaW5nX2ZyZXEgPSBjb252ZXJ0X3NhbXBfaW5kZXgoYXVkaW8tPnNhbXBfcmF0ZSk7Ci0JaWYgKCFhdWRpby0+Y2hhbm5lbF9tb2RlKQotCQljbWQuY2hhbm5lbHMgPSAxOwotCWVsc2UKLQkJY21kLmNoYW5uZWxzID0gMjsKLQljbWQuZnJlcXVlbmN5X29mX2ludGltYXRpb24gPSAxOwotCWNtZC5tYXhfbnVtYmVyX29mX2J1ZmZlcnMgPSBPVVRfRlJBTUVfTlVNOwotCXJldHVybiBhdWRpb19zZW5kX3F1ZXVlX3JlYyhhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi0KLXN0YXRpYyBpbnQgYXVkZXZyY19pbl9yb3V0aW5nX21vZGVfY29uZmlnKHN0cnVjdCBhdWRpb19ldnJjX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9yb3V0aW5nX21vZGUgY21kOwotCi0JTU1fREJHKCJcbiIpOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfUk9VVElOR19NT0RFOwotCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkKLQkJY21kLnJvdXRpbmdfbW9kZSA9IDE7Ci0JcmV0dXJuIGF1ZGlvX3NlbmRfcXVldWVfcmVjKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHJlY19kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgdm9pZCAoKmdldGV2ZW50KSh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRpb19ldnJjX2luICphdWRpbyA9IE5VTEw7Ci0KLQlpZiAoZGF0YSkKLQkJYXVkaW8gPSBkYXRhOwotCWVsc2UgewotCQlNTV9FUlIoImludmFsaWQgZGF0YSBmb3IgZXZlbnQgJXhcbiIsIGlkKTsKLQkJcmV0dXJuOwotCX0KLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFJFQ19NU0dfQ01EX0NGR19ET05FX01TRzogewotCQlzdHJ1Y3QgYXVkcmVjX21zZ19jbWRfY2ZnX2RvbmVfbXNnIGNtZF9jZmdfZG9uZV9tc2c7Ci0JCWdldGV2ZW50KCZjbWRfY2ZnX2RvbmVfbXNnLCBBVURSRUNfTVNHX0NNRF9DRkdfRE9ORV9NU0dfTEVOKTsKLQkJaWYgKGNtZF9jZmdfZG9uZV9tc2cuYXVkcmVjX2VuY190eXBlICYgXAotCQkJCUFVRFJFQ19NU0dfQ0ZHX0RPTkVfRU5DX0VOQSkgewotCQkJYXVkaW8tPmF1ZHJlY19vYmpfaWR4ID0gY21kX2NmZ19kb25lX21zZy5hdWRyZWNfb2JqX2lkeDsKLQkJCU1NX0RCRygiQ0ZHIEVOQUJMRURcbiIpOwotCQkJaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKSB7Ci0JCQkJTU1fREJHKCJyb3V0aW5nIGNvbW1hbmRcbiIpOwotCQkJCWF1ZGV2cmNfaW5fcm91dGluZ19tb2RlX2NvbmZpZyhhdWRpbyk7Ci0JCQl9IGVsc2UgewotCQkJCWF1ZGV2cmNfaW5fZW5jbWVtX2NvbmZpZyhhdWRpbyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlNTV9EQkcoIkNGRyBTTEVFUFxuIik7Ci0JCQlhdWRpby0+cnVubmluZyA9IDA7Ci0JCQl3YWtlX3VwKCZhdWRpby0+d2FpdF9lbmFibGUpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19NU0dfQ01EX1JPVVRJTkdfTU9ERV9ET05FX01TRzogewotCQlzdHJ1Y3QgYXVkcmVjX21zZ19jbWRfcm91dGluZ19tb2RlX2RvbmVfbXNnIFwKLQkJCXJvdXRpbmdfbXNnOwotCQlnZXRldmVudCgmcm91dGluZ19tc2csIEFVRFJFQ19NU0dfQ01EX1JPVVRJTkdfTU9ERV9ET05FX01TRyk7Ci0JCU1NX0RCRygiQVVEUkVDX01TR19DTURfUk9VVElOR19NT0RFX0RPTkVfTVNHIik7Ci0JCWlmIChyb3V0aW5nX21zZy5jb25maWd1cmF0aW9uID09IDApIHsKLQkJCU1NX0VSUigicm91dGluZyBjb25maWd1cmF0aW9uIGZhaWxlZFxuIik7Ci0JCQlhdWRpby0+cnVubmluZyA9IDA7Ci0JCQl3YWtlX3VwKCZhdWRpby0+d2FpdF9lbmFibGUpOwotCQl9IGVsc2UKLQkJCWF1ZGV2cmNfaW5fZW5jbWVtX2NvbmZpZyhhdWRpbyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19NU0dfQ01EX0FSRUNfTUVNX0NGR19ET05FX01TRzogewotCQlNTV9EQkcoIkFSRUNfTUVNX0NGR19ET05FX01TR1xuIik7Ci0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkKLQkJCWF1ZGV2cmNfaW5fZW5jcGFyYW1fY29uZmlnKGF1ZGlvKTsKLQkJZWxzZQotCQkJYXVkcGNtX2NvbmZpZyhhdWRpbyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19DTURfUENNX0NGR19BUk1fVE9fRU5DX0RPTkVfTVNHOiB7Ci0JCU1NX0RCRygiQVVEUkVDX0NNRF9QQ01fQ0ZHX0FSTV9UT19FTkNfRE9ORV9NU0ciKTsKLQkJYXVkZXZyY19pbl9lbmNwYXJhbV9jb25maWcoYXVkaW8pOwotCSAgICBicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfTVNHX0NNRF9BUkVDX1BBUkFNX0NGR19ET05FX01TRzogewotCQlNTV9EQkcoIkFVRFJFQ19NU0dfQ01EX0FSRUNfUEFSQU1fQ0ZHX0RPTkVfTVNHXG4iKTsKLQkJYXVkaW8tPnJ1bm5pbmcgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+d2FpdF9lbmFibGUpOwotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUwpCi0JCQlhdWRyZWNfcGNtX3NlbmRfZGF0YShhdWRpbywgMSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19DTURfUENNX0JVRkZFUl9QVFJfVVBEQVRFX0FSTV9UT19FTkNfTVNHOiB7Ci0JCU1NX0RCRygicHRyX3VwZGF0ZSByZWNpZXZlZCBmcm9tIERTUFxuIik7Ci0JCWF1ZHJlY19wY21fc2VuZF9kYXRhKGF1ZGlvLCAxKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX01TR19OT19FWFRfUEtUX0FWQUlMQUJMRV9NU0c6IHsKLQkJc3RydWN0IGF1ZHJlY19tc2dfbm9fZXh0X3BrdF9hdmFpbF9tc2cgZXJyX21zZzsKLQkJZ2V0ZXZlbnQoJmVycl9tc2csIEFVRFJFQ19NU0dfTk9fRVhUX1BLVF9BVkFJTEFCTEVfTVNHX0xFTik7Ci0JCU1NX0RCRygiTk9fRVhUX1BLVF9BVkFJTEFCTEVfTVNHICV4XG4iLFwKLQkJCWVycl9tc2cuYXVkcmVjX2Vycl9pZCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19NU0dfUEFDS0VUX1JFQURZX01TRzogewotCQlzdHJ1Y3QgYXVkcmVjX21zZ19wYWNrZXRfcmVhZHlfbXNnIHBrdF9yZWFkeV9tc2c7Ci0KLQkJZ2V0ZXZlbnQoJnBrdF9yZWFkeV9tc2csIEFVRFJFQ19NU0dfUEFDS0VUX1JFQURZX01TR19MRU4pOwotCQlNTV9EQkcoIlVQX1BBQ0tFVF9SRUFEWV9NU0c6IHdyaXRlIGNudCBtc3cgICVkIFwKLQkJd3JpdGUgY250IGxzdyAlZCByZWFkIGNudCBtc3cgJWQgIHJlYWQgY250IGxzdyAlZCBcbiIsXAotCQlwa3RfcmVhZHlfbXNnLnBrdF9jb3VudGVyX21zdywgXAotCQlwa3RfcmVhZHlfbXNnLnBrdF9jb3VudGVyX2xzdywgXAotCQlwa3RfcmVhZHlfbXNnLnBrdF9yZWFkX2NudF9tc3csIFwKLQkJcGt0X3JlYWR5X21zZy5wa3RfcmVhZF9jbnRfbHN3KTsKLQotCQlhdWRldnJjX2luX2dldF9kc3BfZnJhbWVzKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX1VQX05UX1BBQ0tFVF9SRUFEWV9NU0c6IHsKLQkJc3RydWN0IGF1ZHJlY191cF9udF9wYWNrZXRfcmVhZHlfbXNnIHBrdF9yZWFkeV9tc2c7Ci0KLQkJZ2V0ZXZlbnQoJnBrdF9yZWFkeV9tc2csIEFVRFJFQ19VUF9OVF9QQUNLRVRfUkVBRFlfTVNHX0xFTik7Ci0JCU1NX0RCRygiVVBfTlRfUEFDS0VUX1JFQURZX01TRzogd3JpdGUgY250IGxzdyAgJWQgXAotCQl3cml0ZSBjbnQgbXN3ICVkIHJlYWQgY250IGxzdyAlZCAgcmVhZCBjbnQgbXN3ICVkIFxuIixcCi0JCXBrdF9yZWFkeV9tc2cuYXVkcmVjX3BhY2tldHdyaXRlX2NudF9sc3csIFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfcGFja2V0d3JpdGVfY250X21zdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY191cHByZXZfcmVhZGNvdW50X2xzdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY191cHByZXZfcmVhZGNvdW50X21zdyk7Ci0KLQkJYXVkZXZyY19udF9pbl9nZXRfZHNwX2ZyYW1lcyhhdWRpbyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19DTURfRkxVU0hfRE9ORV9NU0c6IHsKLQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQlhdWRpby0+Zmx1c2hfYWNrID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlNTV9EQkcoImZsdXNoIGFjayByZWNpZXZlZFxuIik7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFEU1BfTUVTU0FHRV9JRDoKLQkJTU1fREJHKCJSZWNlaXZlZCBBRFNQIGV2ZW50OiBtb2R1bGUgXAotCQkJCWVuYWJsZS9kaXNhYmxlKGF1ZHJlY3Rhc2spXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJ1bmtub3duIGV2ZW50ICVkXG4iLCBpZCk7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9hZHNwX29wcyBhdWRyZWNfZXZyY19hZHNwX29wcyA9IHsKLQkuZXZlbnQgPSBhdWRyZWNfZHNwX2V2ZW50LAotfTsKLQotc3RhdGljIGludCBhdWRldnJjX2luX2RzcF9lbmFibGUoc3RydWN0IGF1ZGlvX2V2cmNfaW4gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCXN0cnVjdCBhdWRyZWNfY21kX2VuY19jZmcgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUkVDX0NNRF9FTkNfQ0ZHOwotCWNtZC5hdWRyZWNfZW5jX3R5cGUgPSAoYXVkaW8tPmVuY190eXBlICYgMHhGRikgfAotCQkJKGVuYWJsZSA/IEFVRFJFQ19DTURfRU5DX0VOQSA6IEFVRFJFQ19DTURfRU5DX0RJUyk7Ci0JLyogRG9uJ3QgY2FyZSAqLwotCWNtZC5hdWRyZWNfb2JqX2lkeCA9IGF1ZGlvLT5hdWRyZWNfb2JqX2lkeDsKLQotCXJldHVybiBhdWRpb19zZW5kX3F1ZXVlX3JlYyhhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGF1ZGV2cmNfaW5fZW5jbWVtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9fZXZyY19pbiAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHJlY19jbWRfYXJlY21lbV9jZmcgY21kOwotCXVpbnQxNl90ICpkYXRhID0gKHZvaWQgKikgYXVkaW8tPmRhdGE7Ci0JaW50IG47Ci0JaW50IGhlYWRlcl9sZW4gPSAwOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWNtZC5jbWRfaWQgPSBBVURSRUNfQ01EX0FSRUNNRU1fQ0ZHOwotCWNtZC5hdWRyZWNfb2JqX2lkeCA9IGF1ZGlvLT5hdWRyZWNfb2JqX2lkeDsKLQkvKiBSYXRlIGF0IHdoaWNoIHBhY2tldCBjb21wbGV0ZSBtZXNzYWdlIGNvbWVzICovCi0JY21kLmF1ZHJlY191cF9wa3RfaW50bV9jbnQgPSAxOwotCWNtZC5hdWRyZWNfZXh0cGt0X2J1ZmZlcl9tc3cgPSBhdWRpby0+cGh5cyA+PiAxNjsKLQljbWQuYXVkcmVjX2V4dHBrdF9idWZmZXJfbHN3ID0gYXVkaW8tPnBoeXM7Ci0JLyogTWF4IEJ1ZmZlciBubyBhdmFpbGFibGUgZm9yIGZyYW1lcyAqLwotCWNtZC5hdWRyZWNfZXh0cGt0X2J1ZmZlcl9udW0gPSBGUkFNRV9OVU07Ci0KLQkvKiBwcmVwYXJlIGJ1ZmZlciBwb2ludGVyczoKLQkgKiBUOjM2IGJ5dGVzIGV2cmMgcGFja2V0ICsgNCBoYWxmd29yZCBoZWFkZXIKLQkgKiBOVDozNiBieXRlcyBldnJjIHBhY2tldCArIDEyIGhhbGZ3b3JkIGhlYWRlcgotCSAqLwotCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkKLQkJaGVhZGVyX2xlbiA9IEZSQU1FX0hFQURFUl9TSVpFLzI7Ci0JZWxzZQotCQloZWFkZXJfbGVuID0gTlRfRlJBTUVfSEVBREVSX1NJWkUvMjsKLQotCWZvciAobiA9IDA7IG4gPCBGUkFNRV9OVU07IG4rKykgewotCQlhdWRpby0+aW5bbl0uZGF0YSA9IGRhdGEgKyBoZWFkZXJfbGVuOwotCQlkYXRhICs9IChFVlJDX0ZSQU1FX1NJWkUvMikgKyBoZWFkZXJfbGVuOwotCQlNTV9EQkcoIjB4JTh4XG4iLCAoaW50KShhdWRpby0+aW5bbl0uZGF0YSAtIGhlYWRlcl9sZW4qMikpOwotCX0KLQotCXJldHVybiBhdWRpb19zZW5kX3F1ZXVlX3JlYyhhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGF1ZGV2cmNfaW5fZW5jcGFyYW1fY29uZmlnKHN0cnVjdCBhdWRpb19ldnJjX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9hcmVjcGFyYW1fZXZyY19jZmcgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY29tbW9uLmNtZF9pZCA9IEFVRFJFQ19DTURfQVJFQ1BBUkFNX0NGRzsKLQljbWQuY29tbW9uLmF1ZHJlY19vYmpfaWR4ID0gYXVkaW8tPmF1ZHJlY19vYmpfaWR4OwotCWNtZC5lbmNfbWluX3JhdGUgPSBhdWRpby0+Y2ZnLm1pbl9iaXRfcmF0ZTsKLQljbWQuZW5jX21heF9yYXRlID0gYXVkaW8tPmNmZy5tYXhfYml0X3JhdGU7Ci0JY21kLnJhdGVfbW9kdWxhdGlvbl9jbWQgPSAwOyAgLyogRGVmYXVsdCBzZXQgdG8gMCAqLwotCi0JcmV0dXJuIGF1ZGlvX3NlbmRfcXVldWVfcmVjKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkZXZyY19mbHVzaF9jb21tYW5kKHN0cnVjdCBhdWRpb19ldnJjX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9mbHVzaCBjbWQ7Ci0JTU1fREJHKCJcbiIpOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfRkxVU0g7Ci0JcmV0dXJuIGF1ZGlvX3NlbmRfcXVldWVfcmVjKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkZXZyY19pbl9kc3BfcmVhZF9idWZmZXIoc3RydWN0IGF1ZGlvX2V2cmNfaW4gKmF1ZGlvLAotCQl1aW50MzJfdCByZWFkX2NudCkKLXsKLQlhdWRyZWNfY21kX3BhY2tldF9leHRfcHRyIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfUEFDS0VUX0VYVF9QVFI7Ci0JY21kLnR5cGUgPSBhdWRpby0+YXVkcmVjX29ial9pZHg7Ci0JY21kLmN1cnJfcmVjX2NvdW50X21zdyA9IHJlYWRfY250ID4+IDE2OwotCWNtZC5jdXJyX3JlY19jb3VudF9sc3cgPSByZWFkX2NudDsKLQotCXJldHVybiBhdWRpb19zZW5kX3F1ZXVlX3JlY2JzKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZGV2aWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdm9pZCBhdWRldnJjX2lvcG9ydF9yZXNldChzdHJ1Y3QgYXVkaW9fZXZyY19pbiAqYXVkaW8pCi17Ci0JLyogTWFrZSBzdXJlIHJlYWQvd3JpdGUgdGhyZWFkIGFyZSBmcmVlIGZyb20KLQkgKiBzbGVlcCBhbmQga25vd2luZyB0aGF0IHN5c3RlbSBpcyBub3QgYWJsZQotCSAqIHRvIHByb2Nlc3MgaW8gcmVxdWVzdCBhdCB0aGUgbW9tZW50Ci0JICovCi0Jd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCWF1ZGV2cmNfaW5fZmx1c2goYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0Jd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlhdWRldnJjX291dF9mbHVzaChhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGV2cmNfaW5fZmx1c2goc3RydWN0IGF1ZGlvX2V2cmNfaW4gKmF1ZGlvKQotewotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlhdWRpby0+ZHNwX2NudCA9IDA7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWF1ZGlvLT5pbl9oZWFkID0gMDsKLQlhdWRpby0+aW5fdGFpbCA9IDA7Ci0JYXVkaW8tPmluX2NvdW50ID0gMDsKLQlhdWRpby0+ZW9zX2FjayA9IDA7Ci0JZm9yIChpID0gRlJBTUVfTlVNLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCWF1ZGlvLT5pbltpXS5zaXplID0gMDsKLQkJYXVkaW8tPmluW2ldLnJlYWQgPSAwOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlNTV9EQkcoImluX2J5dGVzICVkXG4iLCBhdG9taWNfcmVhZCgmYXVkaW8tPmluX2J5dGVzKSk7Ci0JTU1fREJHKCJpbl9zYW1wbGVzICVkXG4iLCBhdG9taWNfcmVhZCgmYXVkaW8tPmluX3NhbXBsZXMpKTsKLQlhdG9taWNfc2V0KCZhdWRpby0+aW5fYnl0ZXMsIDApOwotCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9zYW1wbGVzLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkZXZyY19vdXRfZmx1c2goc3RydWN0IGF1ZGlvX2V2cmNfaW4gKmF1ZGlvKQotewotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlhdWRpby0+b3V0X2hlYWQgPSAwOwotCWF1ZGlvLT5vdXRfY291bnQgPSAwOwotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdWRpby0+b3V0X3RhaWwgPSAwOwotCWZvciAoaSA9IE9VVF9GUkFNRV9OVU0tMTsgaSA+PSAwOyBpLS0pIHsKLQkJYXVkaW8tPm91dFtpXS5zaXplID0gMDsKLQkJYXVkaW8tPm91dFtpXS5yZWFkID0gMDsKLQkJYXVkaW8tPm91dFtpXS51c2VkID0gMDsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZGV2aWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIGxvbmcgYXVkZXZyY19pbl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYXVkaW9fZXZyY19pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsKLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCQlzdGF0cy5ieXRlX2NvdW50ID0gYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9ieXRlcyk7Ci0JCXN0YXRzLnNhbXBsZV9jb3VudCA9IGF0b21pY19yZWFkKCZhdWRpby0+aW5fc2FtcGxlcyk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCXJjID0gYXVkZXZyY19pbl9lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9Ci0JCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdF9lbmFibGUsCi0JCQkJYXVkaW8tPnJ1bm5pbmcgIT0gMCwgMSpIWik7Ci0JCQlNTV9EQkcoInN0YXRlICVkIHJjID0gJWRcbiIsIGF1ZGlvLT5ydW5uaW5nLCByYyk7Ci0KLQkJCWlmIChhdWRpby0+cnVubmluZyA9PSAwKQotCQkJCXJjID0gLUVOT0RFVjsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCX0KLQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TVE9QOiB7Ci0JCXJjID0gYXVkZXZyY19pbl9kaXNhYmxlKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fRkxVU0g6IHsKLQkJTU1fREJHKCJBVURJT19GTFVTSFxuIik7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAxOwotCQlhdWRpby0+d2ZsdXNoID0gMTsKLQkJYXVkZXZyY19pb3BvcnRfcmVzZXQoYXVkaW8pOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpIHsKLQkJCWF1ZGV2cmNfZmx1c2hfY29tbWFuZChhdWRpbyk7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkhYXVkaW8tPndmbHVzaCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJTU1fRVJSKCJBVURJT19GTFVTSCBpbnRlcnJ1cHRlZFxuIik7Ci0JCQkJcmMgPSAtRUlOVFI7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY2ZnOwotCQltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOwotCQljZmcuYnVmZmVyX3NpemUgPSBPVVRfQlVGRkVSX1NJWkU7Ci0JCWNmZy5idWZmZXJfY291bnQgPSBPVVRfRlJBTUVfTlVNOwotCQljZmcuc2FtcGxlX3JhdGUgPSBjb252ZXJ0X3NhbXBfaW5kZXgoYXVkaW8tPnNhbXBfcmF0ZSk7Ci0JCWNmZy5jaGFubmVsX2NvdW50ID0gMTsKLQkJY2ZnLnR5cGUgPSAwOwotCQljZmcudW51c2VkWzBdID0gMDsKLQkJY2ZnLnVudXNlZFsxXSA9IDA7Ci0JCWNmZy51bnVzZWRbMl0gPSAwOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmNmZywgc2l6ZW9mKGNmZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9TVFJFQU1fQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBjZmc7Ci0JCW1lbXNldCgmY2ZnLCAwLCBzaXplb2YoY2ZnKSk7Ci0JCWNmZy5idWZmZXJfc2l6ZSA9IGF1ZGlvLT5idWZmZXJfc2l6ZTsKLQkJY2ZnLmJ1ZmZlcl9jb3VudCA9IEZSQU1FX05VTTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNmZywgc2l6ZW9mKGNmZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9TVFJFQU1fQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBjZmc7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKSBhcmcsIHNpemVvZihjZmcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogQWxsb3cgb25seSBzaW5nbGUgZnJhbWUgKi8KLQkJaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfVFVOTkVMKSB7Ci0JCQlpZiAoY2ZnLmJ1ZmZlcl9zaXplICE9IChGUkFNRV9TSVpFIC0gOCkpIHsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY2ZnLmJ1ZmZlcl9zaXplICE9IChFVlJDX0ZSQU1FX1NJWkUgKyAxNCkpIHsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXVkaW8tPmJ1ZmZlcl9zaXplID0gY2ZnLmJ1ZmZlcl9zaXplOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfRVZSQ19FTkNfQ09ORklHOiB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmYXVkaW8tPmNmZywgc2l6ZW9mKGF1ZGlvLT5jZmcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0VWUkNfRU5DX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZyBjZmc7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKSBhcmcsIHNpemVvZihjZmcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJTU1fREJHKCIwWCU4eCwgMHglOHgsIDB4JTh4XG4iLCBjZmcubWluX2JpdF9yYXRlLAotCQkJCWNmZy5tYXhfYml0X3JhdGUsIGNmZy5jZG1hX3JhdGUpOwotCQlpZiAoY2ZnLm1pbl9iaXRfcmF0ZSA+IENETUFfUkFURV9GVUxMIHx8IFwKLQkJCQkgY2ZnLm1pbl9iaXRfcmF0ZSA8IENETUFfUkFURV9FSUdIVEgpIHsKLQkJCU1NX0VSUigiaW52YWxpZCBtaW4gYml0cmF0ZVxuIik7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY2ZnLm1heF9iaXRfcmF0ZSA+IENETUFfUkFURV9GVUxMIHx8IFwKLQkJCQljZmcubWF4X2JpdF9yYXRlIDwgQ0RNQV9SQVRFX0VJR0hUSCkgewotCQkJTU1fRVJSKCJpbnZhbGlkIG1heCBiaXRyYXRlXG4iKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIFJlY29yZGluZyBEb2VzIG5vdCBzdXBwb3J0IEVyYXNlIGFuZCBCbGFuayAqLwotCQlpZiAoY2ZnLmNkbWFfcmF0ZSA+IENETUFfUkFURV9GVUxMIHx8Ci0JCQljZmcuY2RtYV9yYXRlIDwgQ0RNQV9SQVRFX0VJR0hUSCkgewotCQkJTU1fRVJSKCJpbnZhbGlkIHFjZWxwIGNkbWEgcmF0ZVxuIik7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQltZW1jcHkoJmF1ZGlvLT5jZmcsICZjZmcsIHNpemVvZihjZmcpKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRldnJjX2luX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpb19ldnJjX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQl2b2lkICpkYXRhOwotCXVpbnQzMl90IGluZGV4OwotCXVpbnQzMl90IHNpemU7Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgZXZyY19lbmNvZGVkX21ldGFfb3V0IG1ldGFfZmllbGQ7Ci0Jc3RydWN0IGF1ZGlvX2ZyYW1lX250ICpudF9mcmFtZTsKLQlNTV9EQkcoImNvdW50ID0gJWRcbiIsIGNvdW50KTsKLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAotCQkJYXVkaW8tPndhaXQsIChhdWRpby0+aW5fY291bnQgPiAwKSB8fCBhdWRpby0+c3RvcHBlZCB8fAotCQkJYXVkaW8tPnJmbHVzaCk7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQotCQlpZiAoYXVkaW8tPnJmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYXVkaW8tPnN0b3BwZWQgJiYgIWF1ZGlvLT5pbl9jb3VudCkgewotCQkJTU1fREJHKCJEcml2ZXIgaW4gc3RvcCBzdGF0ZSwgTm8gbW9yZSBidWZmZXIgdG8gcmVhZCIpOwotCQkJcmMgPSAwOy8qIEVuZCBvZiBGaWxlICovCi0JCQlicmVhazsKLQkJfQotCi0JCWluZGV4ID0gYXVkaW8tPmluX3RhaWw7Ci0JCWRhdGEgPSAodWludDhfdCAqKSBhdWRpby0+aW5baW5kZXhdLmRhdGE7Ci0JCXNpemUgPSBhdWRpby0+aW5baW5kZXhdLnNpemU7Ci0KLQkJaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKSB7Ci0JCQludF9mcmFtZSA9IChzdHJ1Y3QgYXVkaW9fZnJhbWVfbnQgKikoZGF0YSAtCi0JCQkJCXNpemVvZihzdHJ1Y3QgYXVkaW9fZnJhbWVfbnQpKTsKLQkJCW1lbWNweSgoY2hhciAqKSZtZXRhX2ZpZWxkLnRpbWVfc3RhbXBfZHdvcmRfbHN3LAotCQkJCShjaGFyICopJm50X2ZyYW1lLT50aW1lX3N0YW1wX2R3b3JkX2xzdywKLQkJCQkoc2l6ZW9mKHN0cnVjdCBldnJjX2VuY29kZWRfbWV0YV9vdXQpIC0gXAotCQkJCXNpemVvZih1aW50MTZfdCkpKTsKLQkJCW1ldGFfZmllbGQubWV0YWRhdGFfbGVuID0KLQkJCQkJc2l6ZW9mKHN0cnVjdCBldnJjX2VuY29kZWRfbWV0YV9vdXQpOwotCQkJaWYgKGNvcHlfdG9fdXNlcigoY2hhciAqKXN0YXJ0LCAoY2hhciAqKSZtZXRhX2ZpZWxkLAotCQkJCQlzaXplb2Yoc3RydWN0IGV2cmNfZW5jb2RlZF9tZXRhX291dCkpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKG50X2ZyYW1lLT5uZmxhZ19sc3cgJiAweDAwMDEpIHsKLQkJCQlNTV9FUlIoInJlY2lldmVkIEVPUyBpbiByZWFkIGNhbGxcbiIpOwotCQkJCWF1ZGlvLT5lb3NfYWNrID0gMTsKLQkJCX0KLQkJCWJ1ZiArPSBzaXplb2Yoc3RydWN0IGV2cmNfZW5jb2RlZF9tZXRhX291dCk7Ci0JCQljb3VudCAtPSBzaXplb2Yoc3RydWN0IGV2cmNfZW5jb2RlZF9tZXRhX291dCk7Ci0JCX0KLQkJaWYgKGNvdW50ID49IHNpemUpIHsKLQkJCS8qIG9yZGVyIHRoZSByZWFkcyBvbiB0aGUgYnVmZmVyICovCi0JCQlkbWFfY29oZXJlbnRfcG9zdF9vcHMoKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBkYXRhLCBzaXplKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJCWlmIChpbmRleCAhPSBhdWRpby0+aW5fdGFpbCkgewotCQkJCS8qIG92ZXJydW4gLS0gZGF0YSBpcwotCQkJCSAqIGludmFsaWQgYW5kIHdlIG5lZWQgdG8gcmV0cnkgKi8KLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9IDA7Ci0JCQlhdWRpby0+aW5fdGFpbCA9IChhdWRpby0+aW5fdGFpbCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCQkJYXVkaW8tPmluX2NvdW50LS07Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJCWNvdW50IC09IHNpemU7Ci0JCQlidWYgKz0gc2l6ZTsKLQkJCWlmICgoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUwpKSB7Ci0JCQkJaWYgKCFhdWRpby0+ZW9zX2FjaykgewotCQkJCQlNTV9EQkcoInNlbmRpbmcgcmVhZCBwdHIgY29tbWFuZCBcCi0JCQkJCQkJJWQgJWRcbiIsCi0JCQkJCQkJYXVkaW8tPmRzcF9jbnQsCi0JCQkJCQkJYXVkaW8tPmluX3RhaWwpOwotCQkJCQlhdWRldnJjX2luX2RzcF9yZWFkX2J1ZmZlcihhdWRpbywKLQkJCQkJCQlhdWRpby0+ZHNwX2NudCsrKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoInNob3J0IHJlYWRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0KLQlpZiAoYnVmID4gc3RhcnQpCi0JCXJldHVybiBidWYgLSBzdGFydDsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgYXVkcmVjX3BjbV9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvX2V2cmNfaW4gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlNTV9EQkcoIlxuIik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWlmICghYXVkaW8tPnJ1bm5pbmcpCi0JCWdvdG8gZG9uZTsKLQotCWlmIChuZWVkZWQgJiYgIWF1ZGlvLT53Zmx1c2gpIHsKLQkJLyogV2Ugd2VyZSBjYWxsZWQgZnJvbSB0aGUgY2FsbGJhY2sgYmVjYXVzZSB0aGUgRFNQCi0JCSAqIHJlcXVlc3RlZCBtb3JlIGRhdGEuICBOb3RlIHRoYXQgdGhlIERTUCBkb2VzIHdhbnQKLQkJICogbW9yZSBkYXRhLCBhbmQgaWYgYSBidWZmZXIgd2FzIGluLWZsaWdodCwgbWFyayBpdAotCQkgKiBhcyBhdmFpbGFibGUgKHNpbmNlIHRoZSBEU1AgbXVzdCBub3cgYmUgZG9uZSB3aXRoCi0JCSAqIGl0KS4KLQkJICovCi0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZikgewotCQkJTU1fREJHKCJmcmFtZSAlZCBmcmVlXG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCQkJZnJhbWUtPnVzZWQgPSAwOwotCQkJYXVkaW8tPm91dF90YWlsIF49IDE7Ci0JCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCX0KLQl9Ci0KLQlpZiAoYXVkaW8tPm91dF9uZWVkZWQpIHsKLQkJLyogSWYgdGhlIERTUCBjdXJyZW50bHkgd2FudHMgZGF0YSBhbmQgd2UgaGF2ZSBhCi0JCSAqIGJ1ZmZlciBhdmFpbGFibGUsIHdlIHdpbGwgc2VuZCBpdCBhbmQgcmVzZXQKLQkJICogdGhlIG5lZWRlZCBmbGFnLiAgV2UnbGwgbWFyayB0aGUgYnVmZmVyIGFzIGluLWZsaWdodAotCQkgKiBzbyB0aGF0IGl0IHdvbid0IGJlIHJlY3ljbGVkIHVudGlsIHRoZSBuZXh0IGJ1ZmZlcgotCQkgKiBpcyByZXF1ZXN0ZWQKLQkJICovCi0KLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQpIHsKLQkJCUJVR19PTihmcmFtZS0+dXNlZCA9PSAweGZmZmZmZmZmKTsKLQkJCWF1ZHJlY19wY21fYnVmZmVyX3B0cl9yZWZyZXNoKGF1ZGlvLAotCQkJCQkJIGF1ZGlvLT5vdXRfdGFpbCwKLQkJCQkJCSAgICBmcmFtZS0+dXNlZCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDB4ZmZmZmZmZmY7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCX0KLQl9Ci0gZG9uZToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBhdWRldnJjX2luX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgYSwgbG9mZl90IGIsCi0JaW50IGRhdGFzeW5jKQotCi17Ci0Jc3RydWN0IGF1ZGlvX2V2cmNfaW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWlmICghYXVkaW8tPnJ1bm5pbmcgfHwgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfVFVOTkVMKSkgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZV9ub2xvY2s7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQlhdWRpby0+d2ZsdXNoKTsKLQlNTV9EQkcoIndha2VkIG9uIGJ5IHNvbWUgZXZlbnQgYXVkaW8tPndmbHVzaCA9ICVkXG4iLCBhdWRpby0+d2ZsdXNoKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQllbHNlIGlmIChhdWRpby0+d2ZsdXNoKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotZG9uZToKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLWRvbmVfbm9sb2NrOgotCXJldHVybiByYzsKLQotfQotCi1pbnQgYXVkcmVjX2V2cmNfcHJvY2Vzc19lb3Moc3RydWN0IGF1ZGlvX2V2cmNfaW4gKmF1ZGlvLAotCQljb25zdCBjaGFyIF9fdXNlciAqYnVmX3N0YXJ0LCB1bnNpZ25lZCBzaG9ydCBtZmllbGRfc2l6ZSkKLXsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQlpbnQgcmMgPSAwOwotCi0JZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF9oZWFkOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCShhdWRpby0+b3V0X25lZWRlZCAmJgotCQlhdWRpby0+b3V0WzBdLnVzZWQgPT0gMCAmJgotCQlhdWRpby0+b3V0WzFdLnVzZWQgPT0gMCkKLQkJfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQl8fCAoYXVkaW8tPndmbHVzaCkpOwotCi0JaWYgKHJjIDwgMCkKLQkJZ290byBkb25lOwotCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChjb3B5X2Zyb21fdXNlcihmcmFtZS0+ZGF0YSwgYnVmX3N0YXJ0LCBtZmllbGRfc2l6ZSkpIHsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZnJhbWUtPm1maWVsZF9zeiA9IG1maWVsZF9zaXplOwotCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCWZyYW1lLT51c2VkID0gbWZpZWxkX3NpemU7Ci0JTU1fREJHKCJjb3B5aW5nIG1ldGFfb3V0IGZyYW1lLT51c2VkID0gJWRcbiIsIGZyYW1lLT51c2VkKTsKLQlhdWRyZWNfcGNtX3NlbmRfZGF0YShhdWRpbywgMCk7Ci1kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkZXZyY19pbl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvX2V2cmNfaW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQljaGFyICpjcHlfcHRyOwotCWludCByYyA9IDAsIGVvc19jb25kaXRpb24gPSBBVURQUkVQUk9DX0VWUkNfRU9TX05PTkU7Ci0JdW5zaWduZWQgc2hvcnQgbWZpZWxkX3NpemUgPSAwOwotCWludCB3cml0ZV9jb3VudCA9IDA7Ci0JTU1fREJHKCJjbnQ9JWRcbiIsIGNvdW50KTsKLQotCWlmIChjb3VudCAmIDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGF1ZGlvLT5tb2RlICE9IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0JLyogaWYgc3VwcGxpZWQgY291bnQgaXMgbW9yZSB0aGFuIGRyaXZlciBidWZmZXIgc2l6ZQotCSAqIHRoZW4gb25seSBjb3B5IGRyaXZlciBidWZmZXIgc2l6ZQotCSAqLwotCWlmIChjb3VudCA+IGZyYW1lLT5zaXplKQotCQljb3VudCA9IGZyYW1lLT5zaXplOwotCi0Jd3JpdGVfY291bnQgPSBjb3VudDsKLQljcHlfcHRyID0gZnJhbWUtPmRhdGE7Ci0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJICAgICAgKGZyYW1lLT51c2VkID09IDApCi0JCQkJCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWlmIChhdWRpby0+bWZpZWxkKSB7Ci0JCWlmIChidWYgPT0gc3RhcnQpIHsKLQkJCS8qIFByb2Nlc3NpbmcgYmVnaW5uaW5nIG9mIHVzZXIgYnVmZmVyICovCi0JCQlpZiAoX19nZXRfdXNlcihtZmllbGRfc2l6ZSwKLQkJCQkodW5zaWduZWQgc2hvcnQgX191c2VyICopIGJ1ZikpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0gZWxzZSBpZiAobWZpZWxkX3NpemUgPiBjb3VudCkgewotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJTU1fREJHKCJtZiBvZmZzZXRfdmFsICV4XG4iLCBtZmllbGRfc2l6ZSk7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCBtZmllbGRfc2l6ZSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCS8qIENoZWNrIGlmIEVPUyBmbGFnIGlzIHNldCBhbmQgYnVmZmVyIGhhcwotCQkJICogY29udGFpbnMganVzdCBtZXRhIGZpZWxkCi0JCQkgKi8KLQkJCWlmIChjcHlfcHRyW0FVRFBSRVBST0NfRVZSQ19FT1NfRkxHX09GRlNFVF0gJgotCQkJCQlBVURQUkVQUk9DX0VWUkNfRU9TX0ZMR19NQVNLKSB7Ci0JCQkJZW9zX2NvbmRpdGlvbiA9IEFVRFBSRVBST0NfRVZSQ19FT1NfU0VUOwotCQkJCU1NX0RCRygiRU9TIFNFVFxuIik7Ci0JCQkJaWYgKG1maWVsZF9zaXplID09IGNvdW50KSB7Ci0JCQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKLQkJCQkJZW9zX2NvbmRpdGlvbiA9IDA7Ci0JCQkJCWdvdG8gZXhpdDsKLQkJCQl9IGVsc2UKLQkJCQljcHlfcHRyW0FVRFBSRVBST0NfRVZSQ19FT1NfRkxHX09GRlNFVF0gJj0KLQkJCQkJfkFVRFBSRVBST0NfRVZSQ19FT1NfRkxHX01BU0s7Ci0JCQl9Ci0JCQljcHlfcHRyICs9IG1maWVsZF9zaXplOwotCQkJY291bnQgLT0gbWZpZWxkX3NpemU7Ci0JCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCX0gZWxzZSB7Ci0JCQltZmllbGRfc2l6ZSA9IDA7Ci0JCQlNTV9EQkcoImNvbnRpbnVvdXMgYnVmZmVyXG4iKTsKLQkJfQotCQlmcmFtZS0+bWZpZWxkX3N6ID0gbWZpZWxkX3NpemU7Ci0JfQotCU1NX0RCRygiY29weWluZyB0aGUgc3RyZWFtIGNvdW50ID0gJWRcbiIsIGNvdW50KTsKLQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCBjb3VudCkpIHsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIGVycm9yOwotCX0KLWV4aXQ6Ci0JZnJhbWUtPnVzZWQgPSBjb3VudDsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlpZiAoIWF1ZGlvLT5mbHVzaF9hY2spCi0JCWF1ZHJlY19wY21fc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQllbHNlIHsKLQkJYXVkcmVjX3BjbV9zZW5kX2RhdGEoYXVkaW8sIDEpOwotCQlhdWRpby0+Zmx1c2hfYWNrID0gMDsKLQl9Ci0JaWYgKGVvc19jb25kaXRpb24gPT0gQVVEUFJFUFJPQ19FVlJDX0VPU19TRVQpCi0JCXJjID0gYXVkcmVjX2V2cmNfcHJvY2Vzc19lb3MoYXVkaW8sIHN0YXJ0LCBtZmllbGRfc2l6ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JcmV0dXJuIHdyaXRlX2NvdW50OwotZXJyb3I6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGV2cmNfaW5fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW9fZXZyY19pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkZXZyY19pbl9kaXNhYmxlKGF1ZGlvKTsKLQlhdWRldnJjX2luX2ZsdXNoKGF1ZGlvKTsKLQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHJlYyk7Ci0KLQlhdWRwcmVwcm9jX2FlbmNfZnJlZShhdWRpby0+ZW5jX2lkKTsKLQlhdWRpby0+YXVkcmVjID0gTlVMTDsKLQlhdWRpby0+b3BlbmVkID0gMDsKLQlpZiAoKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKSAmJiBcCi0JICAgKGF1ZGlvLT5vdXRfZGF0YSkpIHsKLQkJaW9uX3VubWFwX2tlcm5lbChhdWRpby0+Y2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotCQlhdWRpby0+b3V0X2RhdGEgPSBOVUxMOwotCX0KLQlpZiAoYXVkaW8tPmRhdGEpIHsKLQkJaW9uX3VubWFwX2tlcm5lbChhdWRpby0+Y2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci0JCWF1ZGlvLT5kYXRhID0gTlVMTDsKLQl9Ci0JaW9uX2NsaWVudF9kZXN0cm95KGF1ZGlvLT5jbGllbnQpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGF1ZGlvX2V2cmNfaW4gdGhlX2F1ZGlvX2V2cmNfaW47Ci0KLXN0YXRpYyBpbnQgYXVkZXZyY19pbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpb19ldnJjX2luICphdWRpbyA9ICZ0aGVfYXVkaW9fZXZyY19pbjsKLQlpbnQgcmM7Ci0JaW50IGVuY2lkOwotCWludCBkbWFfc2l6ZSA9IDA7Ci0JaW50IGxlbiA9IDA7Ci0JdW5zaWduZWQgbG9uZyBpb25mbGFnID0gMDsKLQlpb25fcGh5c19hZGRyX3QgYWRkciA9IDA7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCA9IE5VTEw7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JaWYgKGF1ZGlvLT5vcGVuZWQpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWF1ZGlvLT5tb2RlID0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUw7Ci0JCWRtYV9zaXplID0gTlRfRE1BU1o7Ci0JCU1NX0RCRygiT3BlbmVkIGZvciBub24gdHVubmVsIG1vZGUgZW5jb2RpbmdcbiIpOwotCX0gZWxzZSBpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJYXVkaW8tPm1vZGUgPSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTDsKLQkJZG1hX3NpemUgPSBETUFTWjsKLQkJTU1fREJHKCJPcGVuZWQgZm9yIHR1bm5lbCBtb2RlIGVuY29kaW5nXG4iKTsKLQl9IGVsc2UgewotCQlNTV9FUlIoIkludmFsaWQgbW9kZVxuIik7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIFNldHRpbmdzIHdpbGwgYmUgcmUtY29uZmlnIGF0IEFVRElPX1NFVF9DT05GSUcsCi0JICogYnV0IGF0IGxlYXN0IHdlIG5lZWQgdG8gaGF2ZSBpbml0aWFsIGNvbmZpZwotCSAqLwotCWF1ZGlvLT5zYW1wX3JhdGUgPSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV84MDAwLAotCWF1ZGlvLT5zYW1wX3JhdGVfaW5kZXggPSBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzgwMDA7Ci0JYXVkaW8tPmNoYW5uZWxfbW9kZSA9IEFVRFJFQ19DTURfU1RFUkVPX01PREVfTU9OTzsKLQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUwpCi0JCWF1ZGlvLT5idWZmZXJfc2l6ZSA9IChFVlJDX0ZSQU1FX1NJWkUgKyAxNCk7Ci0JZWxzZQotCQlhdWRpby0+YnVmZmVyX3NpemUgPSBFVlJDX0ZSQU1FX1NJWkU7Ci0JYXVkaW8tPmVuY190eXBlID0gQVVEUkVDX0NNRF9UWVBFXzBfSU5ERVhfRVZSQyB8IGF1ZGlvLT5tb2RlOwotCi0JYXVkaW8tPmNmZy5jZG1hX3JhdGUgPSBDRE1BX1JBVEVfRlVMTDsKLQlhdWRpby0+Y2ZnLm1pbl9iaXRfcmF0ZSA9IENETUFfUkFURV9GVUxMOwotCWF1ZGlvLT5jZmcubWF4X2JpdF9yYXRlID0gQ0RNQV9SQVRFX0ZVTEw7Ci0KLQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJcmMgPSBhdWRtZ3Jfb3BlbigmYXVkaW8tPmF1ZG1ncik7Ci0JCWlmIChyYykKLQkJCWdvdG8gZG9uZTsKLQl9Ci0KLQllbmNpZCA9IGF1ZHByZXByb2NfYWVuY19hbGxvYyhhdWRpby0+ZW5jX3R5cGUsICZhdWRpby0+bW9kdWxlX25hbWUsCi0JCQkmYXVkaW8tPnF1ZXVlX2lkcyk7Ci0JaWYgKGVuY2lkIDwgMCkgewotCQlNTV9FUlIoIk5vIGZyZWUgZW5jb2RlciBhdmFpbGFibGVcbiIpOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYXVkaW8tPmVuY19pZCA9IGVuY2lkOwotCi0JcmMgPSBtc21fYWRzcF9nZXQoYXVkaW8tPm1vZHVsZV9uYW1lLCAmYXVkaW8tPmF1ZHJlYywKLQkJCSAgICZhdWRyZWNfZXZyY19hZHNwX29wcywgYXVkaW8pOwotCWlmIChyYykgewotCQlhdWRwcmVwcm9jX2FlbmNfZnJlZShhdWRpby0+ZW5jX2lkKTsKLQkJZ290byBkb25lOwotCX0KLQotCWF1ZGlvLT5kc3BfY250ID0gMDsKLQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JYXVkaW8tPndmbHVzaCA9IDA7Ci0JYXVkaW8tPnJmbHVzaCA9IDA7Ci0JYXVkaW8tPmZsdXNoX2FjayA9IDA7Ci0KLQlhdWRldnJjX2luX2ZsdXNoKGF1ZGlvKTsKLQlhdWRldnJjX291dF9mbHVzaChhdWRpbyk7Ci0KLQljbGllbnQgPSBtc21faW9uX2NsaWVudF9jcmVhdGUoVUlOVF9NQVgsICJBdWRpb19FVlJDX2luX2NsaWVudCIpOwotCWlmIChJU19FUlJfT1JfTlVMTChjbGllbnQpKSB7Ci0JCU1NX0VSUigiVW5hYmxlIHRvIGNyZWF0ZSBJT04gY2xpZW50XG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGNsaWVudF9jcmVhdGVfZXJyb3I7Ci0JfQotCWF1ZGlvLT5jbGllbnQgPSBjbGllbnQ7Ci0KLQlNTV9EQkcoImFsbG9jYXRpbmcgbWVtIHN6ID0gJWRcbiIsIGRtYV9zaXplKTsKLQloYW5kbGUgPSBpb25fYWxsb2MoY2xpZW50LCBkbWFfc2l6ZSwgU1pfNEssCi0JCUlPTl9IRUFQKElPTl9BVURJT19IRUFQX0lEKSwgMCk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGhhbmRsZSkpIHsKLQkJTU1fRVJSKCJVbmFibGUgdG8gY3JlYXRlIGFsbG9jYXRlIE8vUCBidWZmZXJzXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dHB1dF9idWZmX2FsbG9jX2Vycm9yOwotCX0KLQotCWF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUgPSBoYW5kbGU7Ci0KLQlyYyA9IGlvbl9waHlzKGNsaWVudCAsIGhhbmRsZSwgJmFkZHIsICZsZW4pOwotCWlmIChyYykgewotCQlNTV9FUlIoIk8vUCBidWZmZXJzOkludmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I7Ci0JfSBlbHNlIHsKLQkJTU1fSU5GTygiTy9QIGJ1ZmZlcnM6dmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCX0KLQlhdWRpby0+cGh5cyA9IChpbnQzMl90KWFkZHI7Ci0KLQlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKGNsaWVudCwgaGFuZGxlLCAmaW9uZmxhZyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiY291bGQgbm90IGdldCBmbGFncyBmb3IgdGhlIGhhbmRsZVxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRwdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I7Ci0JfQotCi0JYXVkaW8tPm1hcF92X3JlYWQgPSBpb25fbWFwX2tlcm5lbChjbGllbnQsIGhhbmRsZSk7Ci0JaWYgKElTX0VSUihhdWRpby0+bWFwX3ZfcmVhZCkpIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgbWFwIHJlYWQgYnVmZmVycyxmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQkoaW50KWF1ZGlvKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dHB1dF9idWZmX21hcF9lcnJvcjsKLQl9Ci0JYXVkaW8tPmRhdGEgPSBhdWRpby0+bWFwX3ZfcmVhZDsKLQlNTV9EQkcoInJlYWQgYnVmOiBwaHkgYWRkciAweCUwOHgga2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQlhdWRpby0+cGh5cywgKGludClhdWRpby0+ZGF0YSk7Ci0KLQlhdWRpby0+b3V0X2RhdGEgPSBOVUxMOwotCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkgewotCQlNTV9EQkcoImFsbG9jYXRpbmcgQlVGRkVSX1NJWkUgICVkXG4iLCBCVUZGRVJfU0laRSk7Ci0JCWhhbmRsZSA9IGlvbl9hbGxvYyhjbGllbnQsIEJVRkZFUl9TSVpFLAotCQkJCVNaXzRLLCBJT05fSEVBUChJT05fQVVESU9fSEVBUF9JRCksIDApOwotCQlpZiAoSVNfRVJSX09SX05VTEwoaGFuZGxlKSkgewotCQkJTU1fRVJSKCJVbmFibGUgdG8gY3JlYXRlIGFsbG9jYXRlIEkvUCBidWZmZXJzXG4iKTsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gaW5wdXRfYnVmZl9hbGxvY19lcnJvcjsKLQkJfQotCi0JCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IGhhbmRsZTsKLQotCQlyYyA9IGlvbl9waHlzKGNsaWVudCAsIGhhbmRsZSwgJmFkZHIsICZsZW4pOwotCQlpZiAocmMpIHsKLQkJCU1NX0VSUigiSS9QIGJ1ZmZlcnM6SW52YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBpbnB1dF9idWZmX2FsbG9jX2Vycm9yOwotCQl9IGVsc2UgewotCQkJTU1fSU5GTygiR290IHZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsCi0JCQkJKHVuc2lnbmVkIGludCkgbGVuKTsKLQkJfQotCQlhdWRpby0+b3V0X3BoeXMgPSAoaW50MzJfdClhZGRyOwotCi0JCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MoY2xpZW50LAotCQkJaGFuZGxlLCAmaW9uZmxhZyk7Ci0JCWlmIChyYykgewotCQkJTU1fRVJSKCJjb3VsZCBub3QgZ2V0IGZsYWdzIGZvciB0aGUgaGFuZGxlXG4iKTsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gaW5wdXRfYnVmZl9hbGxvY19lcnJvcjsKLQkJfQotCi0JCWF1ZGlvLT5tYXBfdl93cml0ZSA9IGlvbl9tYXBfa2VybmVsKGNsaWVudCwgaGFuZGxlKTsKLQkJaWYgKElTX0VSUihhdWRpby0+bWFwX3Zfd3JpdGUpKSB7Ci0JCQlNTV9FUlIoImNvdWxkIG5vdCBtYXAgd3JpdGUgYnVmZmVyc1xuIik7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGlucHV0X2J1ZmZfbWFwX2Vycm9yOwotCQl9Ci0JCWF1ZGlvLT5vdXRfZGF0YSA9IGF1ZGlvLT5tYXBfdl93cml0ZTsKLQkJTU1fREJHKCJ3cml0ZSBidWY6IHBoeSBhZGRyIDB4JTA4eCBrZXJuZWwgYWRkciAweCUwOHhcbiIsCi0JCQkJCSh1bnNpZ25lZCBpbnQpYWRkciwKLQkJCQkJKHVuc2lnbmVkIGludClhdWRpby0+b3V0X2RhdGEpOwotCi0JCS8qIEluaXRpYWxpemUgYnVmZmVyICovCi0JCWF1ZGlvLT5vdXRbMF0uZGF0YSA9IGF1ZGlvLT5vdXRfZGF0YSArIDA7Ci0JCWF1ZGlvLT5vdXRbMF0uYWRkciA9IGF1ZGlvLT5vdXRfcGh5cyArIDA7Ci0JCWF1ZGlvLT5vdXRbMF0uc2l6ZSA9IE9VVF9CVUZGRVJfU0laRTsKLQotCQlhdWRpby0+b3V0WzFdLmRhdGEgPSBhdWRpby0+b3V0X2RhdGEgKyBPVVRfQlVGRkVSX1NJWkU7Ci0JCWF1ZGlvLT5vdXRbMV0uYWRkciA9IGF1ZGlvLT5vdXRfcGh5cyArIE9VVF9CVUZGRVJfU0laRTsKLQkJYXVkaW8tPm91dFsxXS5zaXplID0gT1VUX0JVRkZFUl9TSVpFOwotCi0JCU1NX0RCRygiYXVkaW8tPm91dFswXS5kYXRhID0gJWQgIGF1ZGlvLT5vdXRbMV0uZGF0YSA9ICVkIiwKLQkJCQkodW5zaWduZWQgaW50KWF1ZGlvLT5vdXRbMF0uZGF0YSwKLQkJCQkodW5zaWduZWQgaW50KWF1ZGlvLT5vdXRbMV0uZGF0YSk7Ci0JCWF1ZGlvLT5tZmllbGQgPSBOVF9GUkFNRV9IRUFERVJfU0laRTsKLQkJYXVkaW8tPm91dF9mcmFtZV9jbnQrKzsKLQl9Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0JYXVkaW8tPm9wZW5lZCA9IDE7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotaW5wdXRfYnVmZl9tYXBfZXJyb3I6Ci0JaW9uX2ZyZWUoY2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotaW5wdXRfYnVmZl9hbGxvY19lcnJvcjoKLQlpb25fdW5tYXBfa2VybmVsKGNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci1vdXRwdXRfYnVmZl9tYXBfZXJyb3I6Ci1vdXRwdXRfYnVmZl9nZXRfcGh5c19lcnJvcjoKLW91dHB1dF9idWZmX2dldF9mbGFnc19lcnJvcjoKLQlpb25fZnJlZShjbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotb3V0cHV0X2J1ZmZfYWxsb2NfZXJyb3I6Ci0JaW9uX2NsaWVudF9kZXN0cm95KGNsaWVudCk7Ci1jbGllbnRfY3JlYXRlX2Vycm9yOgotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcmVjKTsKLQotCWF1ZHByZXByb2NfYWVuY19mcmVlKGF1ZGlvLT5lbmNfaWQpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fZXZyY19pbl9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBhdWRldnJjX2luX29wZW4sCi0JLnJlbGVhc2UJPSBhdWRldnJjX2luX3JlbGVhc2UsCi0JLnJlYWQJCT0gYXVkZXZyY19pbl9yZWFkLAotCS53cml0ZQkJPSBhdWRldnJjX2luX3dyaXRlLAotCS5mc3luYwkJPSBhdWRldnJjX2luX2ZzeW5jLAotCS51bmxvY2tlZF9pb2N0bAk9IGF1ZGV2cmNfaW5faW9jdGwsCi19OwotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkZXZyY19pbl9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fZXZyY19pbiIsCi0JLmZvcHMJPSAmYXVkaW9fZXZyY19pbl9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkZXZyY19pbl9pbml0KHZvaWQpCi17Ci0JbXV0ZXhfaW5pdCgmdGhlX2F1ZGlvX2V2cmNfaW4ubG9jayk7Ci0JbXV0ZXhfaW5pdCgmdGhlX2F1ZGlvX2V2cmNfaW4ucmVhZF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmdGhlX2F1ZGlvX2V2cmNfaW4uZHNwX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoZV9hdWRpb19ldnJjX2luLndhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoZV9hdWRpb19ldnJjX2luLndhaXRfZW5hYmxlKTsKLQltdXRleF9pbml0KCZ0aGVfYXVkaW9fZXZyY19pbi53cml0ZV9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfYXVkaW9fZXZyY19pbi53cml0ZV93YWl0KTsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkZXZyY19pbl9taXNjKTsKLX0KLWRldmljZV9pbml0Y2FsbChhdWRldnJjX2luX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fZm0uYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX2ZtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1N2E0MDcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fZm0uYworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19mbS5jCi0gKgotICogcGNtIGF1ZGlvIG91dHB1dCBkZXZpY2UKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLSNpbmNsdWRlICJhdWRtZ3IuaCIKLQotc3RydWN0IGF1ZGlvIHsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlpbnQgb3BlbmVkOwotCWludCBlbmFibGVkOwotCWludCBydW5uaW5nOwotCXN0cnVjdCBhdWRtZ3IgYXVkbWdyOwotCXVpbnQxNl90IHZvbHVtZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXVkaW8gZm1fYXVkaW87Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRpb19lbmFibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkbWdyX2NvbmZpZyBjZmc7Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JY2ZnLnR4X3JhdGUgPSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV80ODAwMDsKLQljZmcucnhfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzQ4MDAwOwotCWNmZy5kZWZfbWV0aG9kID0gUlBDX0FVRF9ERUZfTUVUSE9EX0hPU1RfUENNOwotCWNmZy5jb2RlYyA9IFJQQ19BVURfREVGX0NPREVDX1BDTTsKLQljZmcuc25kX21ldGhvZCA9IFJQQ19TTkRfTUVUSE9EX1ZPSUNFOwotCi0JcmMgPSBhdWRtZ3JfZW5hYmxlKCZhdWRpby0+YXVkbWdyLCAmY2ZnKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JcmV0dXJuIHJjOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkaW9fZGlzYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JaWYgKGF1ZGlvLT5lbmFibGVkKSB7Ci0JCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgYXVkaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gLUVJTlZBTDsKLQotCU1NX0RCRygiY21kICVkIiwgY21kKTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6Ci0JCU1NX0RCRygiQVVESU9fU1RBUlRcbiIpOwotCQlyYyA9IGF1ZGlvX2VuYWJsZShhdWRpbyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU1RPUDoKLQkJTU1fREJHKCJBVURJT19TVE9QXG4iKTsKLQkJcmMgPSBhdWRpb19kaXNhYmxlKGF1ZGlvKTsKLQkJYXVkaW8tPnJ1bm5pbmcgPSAwOwotCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JTU1fREJHKCJhdWRpbyBpbnN0YW5jZSAweCUwOHggZnJlZWluZ1xuIiwgKGludClhdWRpbyk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGlvX2Rpc2FibGUoYXVkaW8pOwotCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JYXVkaW8tPm9wZW5lZCA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gJmZtX2F1ZGlvOwotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQotCWlmIChhdWRpby0+b3BlbmVkKSB7Ci0JCU1NX0VSUigiYnVzeVxuIik7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmMgPSBhdWRtZ3Jfb3BlbigmYXVkaW8tPmF1ZG1ncik7Ci0KLQlpZiAocmMpIHsKLQkJTU1fRVJSKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGxpc3RuZXRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOwotCWF1ZGlvLT5vcGVuZWQgPSAxOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fZm1fZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gYXVkaW9fb3BlbiwKLQkucmVsZWFzZQk9IGF1ZGlvX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0gYXVkaW9faW9jdGwsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19mbV9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fZm0iLAotCS5mb3BzCT0gJmF1ZGlvX2ZtX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9ICZmbV9hdWRpbzsKLQotCW11dGV4X2luaXQoJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fZm1fbWlzYyk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhdWRpb19pbml0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gRk0gZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19pbi5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9faW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZjMmFjMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19pbi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTk2ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX2luLmMKLSAqCi0gKiBwY20gYXVkaW8gaW5wdXQgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fYWFjLmg+Ci0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9ycGNyb3V0ZXIuaD4KLQotI2luY2x1ZGUgImF1ZG1nci5oIgotCi0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHByZXByb2NjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHByZXByb2Ntc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcmVjY21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRyZWNtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLS8qIEZSQU1FX05VTSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvICovCi0jZGVmaW5lIEZSQU1FX05VTQkJKDgpCi0jZGVmaW5lIEZSQU1FX1NJWkUJCSgyMDUyICogMikKLSNkZWZpbmUgTU9OT19EQVRBX1NJWkUJCSgyMDQ4KQotI2RlZmluZSBTVEVSRU9fREFUQV9TSVpFCShNT05PX0RBVEFfU0laRSAqIDIpCi0jZGVmaW5lIERNQVNaIAkJCShGUkFNRV9TSVpFICogRlJBTUVfTlVNKQotCi1zdHJ1Y3QgYnVmZmVyIHsKLQl2b2lkICpkYXRhOwotCXVpbnQzMl90IHNpemU7Ci0JdWludDMyX3QgcmVhZDsKLQl1aW50MzJfdCBhZGRyOwotfTsKLQotc3RydWN0IGF1ZGlvX2luIHsKLQlzdHJ1Y3QgYnVmZmVyIGluW0ZSQU1FX05VTV07Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JYXRvbWljX3QgaW5fYnl0ZXM7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggcmVhZF9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0KLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICphdWRwcmU7Ci0Jc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqYXVkcmVjOwotCi0JLyogY29uZmlndXJhdGlvbiB0byB1c2Ugb24gbmV4dCBlbmFibGUgKi8KLQl1aW50MzJfdCBzYW1wX3JhdGU7Ci0JdWludDMyX3QgY2hhbm5lbF9tb2RlOwotCXVpbnQzMl90IGJ1ZmZlcl9zaXplOyAvKiAyMDQ4IGZvciBtb25vLCA0MDk2IGZvciBzdGVyZW8gKi8KLQl1aW50MzJfdCB0eXBlOyAvKiAwIGZvciBQQ00gLDEgZm9yIEFBQyAqLwotCXVpbnQzMl90IGJpdF9yYXRlOyAvKiBiaXQgcmF0ZSBmb3IgQUFDICovCi0JdWludDMyX3QgcmVjb3JkX3F1YWxpdHk7IC8qIHJlY29yZCBxdWFsaXR5IChiaXRzL3NhbXBsZS9jaGFubmVsKQotCQkJCSAgICBmb3IgQUFDKi8KLQl1aW50MzJfdCBidWZmZXJfY2ZnX2lvY3RsOyAvKiB0byBhbGxvdyBhbnkgb25lIG9mIGJ1ZmZlciBzZXQgaW9jdGwgKi8KLQl1aW50MzJfdCBkc3BfY250OwotCXVpbnQzMl90IGluX2hlYWQ7IC8qIG5leHQgYnVmZmVyIGRzcCB3aWxsIHdyaXRlICovCi0JdWludDMyX3QgaW5fdGFpbDsgLyogbmV4dCBidWZmZXIgcmVhZCgpIHdpbGwgcmVhZCAqLwotCXVpbnQzMl90IGluX2NvdW50OyAvKiBudW1iZXIgb2YgYnVmZmVycyBhdmFpbGFibGUgdG8gcmVhZCgpICovCi0KLQl1bnNpZ25lZCBzaG9ydCBzYW1wX3JhdGVfaW5kZXg7Ci0KLQlzdHJ1Y3QgYXVkbWdyIGF1ZG1ncjsKLQotCS8qIGRhdGEgYWxsb2NhdGVkIGZvciB2YXJpb3VzIGJ1ZmZlcnMgKi8KLQljaGFyICpkYXRhOwotCWRtYV9hZGRyX3QgcGh5czsKLQotCWludCBvcGVuZWQ7Ci0JaW50IGVuYWJsZWQ7Ci0JaW50IHJ1bm5pbmc7Ci0JaW50IHN0b3BwZWQ7IC8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQotCS8qIGF1ZHByZSBzZXR0aW5ncyAqLwotCWludCB0eF9hZ2NfZW5hYmxlOwotCWF1ZHByZXByb2NfY21kX2NmZ19hZ2NfcGFyYW1zIHR4X2FnY19jZmc7Ci0JaW50IG5zX2VuYWJsZTsKLQlhdWRwcmVwcm9jX2NtZF9jZmdfbnNfcGFyYW1zIG5zX2NmZzsKLQkvKiBGb3IgZGlmZmVyZW50IHNhbXBsZSByYXRlLCB0aGUgY29lZmYgbWlnaHQgYmUgZGlmZmVyZW50LiAqCi0JICogQWxsIHRoZSBjb2VmZiBzaG91bGQgYmUgcGFzc2VkIGZyb20gdXNlciBzcGFjZQkgICAgKi8KLQlpbnQgaWlyX2VuYWJsZTsKLQlhdWRwcmVwcm9jX2NtZF9jZmdfaWlyX3R1bmluZ19maWx0ZXJfcGFyYW1zIGlpcl9jZmc7Ci19OwotCi1zdGF0aWMgaW50IGF1ZGlvX2luX2RzcF9lbmFibGUoc3RydWN0IGF1ZGlvX2luICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgaW50IGF1ZGlvX2luX2VuY29kZXJfY29uZmlnKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pOwotc3RhdGljIGludCBhdWRpb19kc3BfcmVhZF9idWZmZXIoc3RydWN0IGF1ZGlvX2luICphdWRpbywgdWludDMyX3QgcmVhZF9jbnQpOwotc3RhdGljIHZvaWQgYXVkaW9fZmx1c2goc3RydWN0IGF1ZGlvX2luICphdWRpbyk7Ci1zdGF0aWMgaW50IGF1ZGlvX2RzcF9zZXRfdHhfYWdjKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pOwotc3RhdGljIGludCBhdWRpb19kc3Bfc2V0X25zKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pOwotc3RhdGljIGludCBhdWRpb19kc3Bfc2V0X2lpcihzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLQotc3RhdGljIHVuc2lnbmVkIGNvbnZlcnRfZHNwX3NhbXBfaW5kZXgodW5zaWduZWQgaW5kZXgpCi17Ci0Jc3dpdGNoIChpbmRleCkgewotCWNhc2UgNDgwMDA6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzQ4MDAwOwotCWNhc2UgNDQxMDA6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzQ0MTAwOwotCWNhc2UgMzIwMDA6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzMyMDAwOwotCWNhc2UgMjQwMDA6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzI0MDAwOwotCWNhc2UgMjIwNTA6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzIyMDUwOwotCWNhc2UgMTYwMDA6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzE2MDAwOwotCWNhc2UgMTIwMDA6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzEyMDAwOwotCWNhc2UgMTEwMjU6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzExMDI1OwotCWNhc2UgODAwMDoJcmV0dXJuIEFVRFJFQ19DTURfU0FNUF9SQVRFX0lORFhfODAwMDsKLQlkZWZhdWx0OiAJcmV0dXJuIEFVRFJFQ19DTURfU0FNUF9SQVRFX0lORFhfMTEwMjU7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgY29udmVydF9zYW1wX3JhdGUodW5zaWduZWQgaHopCi17Ci0Jc3dpdGNoIChoeikgewotCWNhc2UgNDgwMDA6IHJldHVybiBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV80ODAwMDsKLQljYXNlIDQ0MTAwOiByZXR1cm4gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfNDQxMDA7Ci0JY2FzZSAzMjAwMDogcmV0dXJuIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzMyMDAwOwotCWNhc2UgMjQwMDA6IHJldHVybiBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8yNDAwMDsKLQljYXNlIDIyMDUwOiByZXR1cm4gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMjIwNTA7Ci0JY2FzZSAxNjAwMDogcmV0dXJuIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzE2MDAwOwotCWNhc2UgMTIwMDA6IHJldHVybiBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xMjAwMDsKLQljYXNlIDExMDI1OiByZXR1cm4gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMTEwMjU7Ci0JY2FzZSA4MDAwOiAgcmV0dXJuIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzgwMDA7Ci0JZGVmYXVsdDogICAgcmV0dXJuIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzExMDI1OwotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGNvbnZlcnRfc2FtcF9pbmRleCh1bnNpZ25lZCBpbmRleCkKLXsKLQlzd2l0Y2ggKGluZGV4KSB7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV80ODAwMDoJcmV0dXJuIDQ4MDAwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfNDQxMDA6CXJldHVybiA0NDEwMDsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzMyMDAwOglyZXR1cm4gMzIwMDA7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8yNDAwMDoJcmV0dXJuIDI0MDAwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMjIwNTA6CXJldHVybiAyMjA1MDsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzE2MDAwOglyZXR1cm4gMTYwMDA7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xMjAwMDoJcmV0dXJuIDEyMDAwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMTEwMjU6CXJldHVybiAxMTAyNTsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzgwMDA6CXJldHVybiA4MDAwOwotCWRlZmF1bHQ6IAkJCQlyZXR1cm4gMTEwMjU7Ci0JfQotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkaW9faW5fZW5hYmxlKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZG1ncl9jb25maWcgY2ZnOwotCWludCByYzsKLQotCWlmIChhdWRpby0+ZW5hYmxlZCkKLQkJcmV0dXJuIDA7Ci0KLQljZmcudHhfcmF0ZSA9IGF1ZGlvLT5zYW1wX3JhdGU7Ci0JY2ZnLnJ4X3JhdGUgPSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV9OT05FOwotCWNmZy5kZWZfbWV0aG9kID0gUlBDX0FVRF9ERUZfTUVUSE9EX1JFQ09SRDsKLQlpZiAoYXVkaW8tPnR5cGUgPT0gQVVEUkVDX0NNRF9UWVBFXzBfSU5ERVhfV0FWKQotCQljZmcuY29kZWMgPSBSUENfQVVEX0RFRl9DT0RFQ19QQ007Ci0JZWxzZQotCQljZmcuY29kZWMgPSBSUENfQVVEX0RFRl9DT0RFQ19BQUM7Ci0JY2ZnLnNuZF9tZXRob2QgPSBSUENfU05EX01FVEhPRF9NSURJOwotCi0JcmMgPSBhdWRtZ3JfZW5hYmxlKCZhdWRpby0+YXVkbWdyLCAmY2ZnKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAobXNtX2Fkc3BfZW5hYmxlKGF1ZGlvLT5hdWRwcmUpKSB7Ci0JCU1NX0VSUigibXNtX2Fkc3BfZW5hYmxlKGF1ZHByZSkgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWlmIChtc21fYWRzcF9lbmFibGUoYXVkaW8tPmF1ZHJlYykpIHsKLQkJTU1fRVJSKCJtc21fYWRzcF9lbmFibGUoYXVkcmVjKSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JYXVkaW9faW5fZHNwX2VuYWJsZShhdWRpbywgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGlvX2luX2Rpc2FibGUoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCi0JCWF1ZGlvX2luX2RzcF9lbmFibGUoYXVkaW8sIDApOwotCi0JCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQotCQltc21fYWRzcF9kaXNhYmxlKGF1ZGlvLT5hdWRyZWMpOwotCQltc21fYWRzcF9kaXNhYmxlKGF1ZGlvLT5hdWRwcmUpOwotCQlhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZHByZV9kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgdm9pZCAoKmdldGV2ZW50KSh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXVpbnQxNl90IG1zZ1syXTsKLQlnZXRldmVudChtc2csIHNpemVvZihtc2cpKTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBSRVBST0NfTVNHX0NNRF9DRkdfRE9ORV9NU0c6Ci0JCU1NX0lORk8oInR5cGUgJWQsIHN0YXR1c19mbGFnICVkXG4iLCBtc2dbMF0sIG1zZ1sxXSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFJFUFJPQ19NU0dfRVJST1JfTVNHX0lEOgotCQlNTV9JTkZPKCJlcnJfaW5kZXggJWRcbiIsIG1zZ1swXSk7Ci0JCWJyZWFrOwotCWNhc2UgQURTUF9NRVNTQUdFX0lEOgotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6IG1vZHVsZSBlbmFibGUoYXVkcHJlcHJvY3Rhc2spXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJ1bmtub3duIGV2ZW50ICVkXG4iLCBpZCk7Ci0JfQotfQotCi1zdHJ1Y3QgYXVkaW9fZnJhbWUgewotCXVpbnQxNl90IGNvdW50X2xvdzsKLQl1aW50MTZfdCBjb3VudF9oaWdoOwotCXVpbnQxNl90IGJ5dGVzOwotCXVpbnQxNl90IHVua25vd247Ci0JdW5zaWduZWQgY2hhciBzYW1wbGVzW107Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdGF0aWMgdm9pZCBhdWRpb19pbl9nZXRfZHNwX2ZyYW1lcyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRpb19mcmFtZSAqZnJhbWU7Ci0JdWludDMyX3QgaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQlpbmRleCA9IGF1ZGlvLT5pbl9oZWFkOwotCi0JCS8qIFhYWCBjaGVjayBmb3IgYm9ndXMgZnJhbWUgc2l6ZT8gKi8KLQotCQlmcmFtZSA9ICh2b2lkICopICgoKGNoYXIgKilhdWRpby0+aW5baW5kZXhdLmRhdGEpIC0KLQkJCQkgc2l6ZW9mKCpmcmFtZSkpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9IGZyYW1lLT5ieXRlczsKLQotCQlhdWRpby0+aW5faGVhZCA9IChhdWRpby0+aW5faGVhZCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCi0JCS8qIElmIG92ZXJmbG93LCBtb3ZlIHRoZSB0YWlsIGluZGV4IGZvd2FyZC4gKi8KLQkJaWYgKGF1ZGlvLT5pbl9oZWFkID09IGF1ZGlvLT5pbl90YWlsKQotCQkJYXVkaW8tPmluX3RhaWwgPSAoYXVkaW8tPmluX3RhaWwgKyAxKSAmIChGUkFNRV9OVU0gLSAxKTsKLQkJZWxzZQotCQkJYXVkaW8tPmluX2NvdW50Kys7Ci0KLQkJYXVkaW9fZHNwX3JlYWRfYnVmZmVyKGF1ZGlvLCBhdWRpby0+ZHNwX2NudCsrKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0KLQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRyZWNfZHNwX2V2ZW50KHZvaWQgKmRhdGEsIHVuc2lnbmVkIGlkLCBzaXplX3QgbGVuLAotCQkJICAgIHZvaWQgKCpnZXRldmVudCkodm9pZCAqcHRyLCBzaXplX3QgbGVuKSkKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gZGF0YTsKLQl1aW50MTZfdCBtc2dbM107Ci0JZ2V0ZXZlbnQobXNnLCBzaXplb2YobXNnKSk7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURSRUNfTVNHX0NNRF9DRkdfRE9ORV9NU0c6Ci0JCWlmIChtc2dbMF0gJiBBVURSRUNfTVNHX0NGR19ET05FX1RZUEVfMF9VUERBVEUpIHsKLQkJCWlmIChtc2dbMF0gJiBBVURSRUNfTVNHX0NGR19ET05FX1RZUEVfMF9FTkEpIHsKLQkJCQlNTV9JTkZPKCJDRkcgRU5BQkxFRFxuIik7Ci0JCQkJYXVkaW9faW5fZW5jb2Rlcl9jb25maWcoYXVkaW8pOwotCQkJfSBlbHNlIHsKLQkJCQlNTV9JTkZPKCJDRkcgU0xFRVBcbiIpOwotCQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJCQlhdWRpby0+dHhfYWdjX2VuYWJsZSA9IDA7Ci0JCQkJYXVkaW8tPm5zX2VuYWJsZSA9IDA7Ci0JCQkJYXVkaW8tPmlpcl9lbmFibGUgPSAwOwotCQkJfQotCQl9IGVsc2UgewotCQkJTU1fSU5GTygiQ01EX0NGR19ET05FICV4XG4iLCBtc2dbMF0pOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVEUkVDX01TR19DTURfQVJFQ19QQVJBTV9DRkdfRE9ORV9NU0c6IHsKLQkJTU1fSU5GTygiUEFSQU0gQ0ZHIERPTkVcbiIpOwotCQlhdWRpby0+cnVubmluZyA9IDE7Ci0JCWF1ZGlvX2RzcF9zZXRfdHhfYWdjKGF1ZGlvKTsKLQkJYXVkaW9fZHNwX3NldF9ucyhhdWRpbyk7Ci0JCWF1ZGlvX2RzcF9zZXRfaWlyKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX01TR19GQVRBTF9FUlJfTVNHOgotCQlNTV9FUlIoIkVSUk9SICV4XG4iLCBtc2dbMF0pOwotCQlicmVhazsKLQljYXNlIEFVRFJFQ19NU0dfUEFDS0VUX1JFQURZX01TRzoKLS8qIFJFQ19EQkcoInR5cGUgJXgsIGNvdW50ICVkIiwgbXNnWzBdLCAobXNnWzFdIHwgKG1zZ1syXSA8PCAxNikpKTsgKi8KLQkJYXVkaW9faW5fZ2V0X2RzcF9mcmFtZXMoYXVkaW8pOwotCQlicmVhazsKLQljYXNlIEFEU1BfTUVTU0FHRV9JRDoKLQkJTU1fREJHKCJSZWNlaXZlZCBBRFNQIGV2ZW50OiBtb2R1bGUgXAotCQkJCWVuYWJsZS9kaXNhYmxlKGF1ZHJlY3Rhc2spXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJ1bmtub3duIGV2ZW50ICVkXG4iLCBpZCk7Ci0JfQotfQotCi1zdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHByZV9hZHNwX29wcyA9IHsKLQkuZXZlbnQgPSBhdWRwcmVfZHNwX2V2ZW50LAotfTsKLQotc3RydWN0IG1zbV9hZHNwX29wcyBhdWRyZWNfYWRzcF9vcHMgPSB7Ci0JLmV2ZW50ID0gYXVkcmVjX2RzcF9ldmVudCwKLX07Ci0KLQotI2RlZmluZSBhdWRpb19zZW5kX3F1ZXVlX3ByZShhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcHJlLCBRRFNQX3VQQXVkUHJlUHJvY0NtZFF1ZXVlLCBjbWQsIGxlbikKLSNkZWZpbmUgYXVkaW9fc2VuZF9xdWV1ZV9yZWNicyhhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcmVjLCBRRFNQX3VQQXVkUmVjQml0U3RyZWFtUXVldWUsIGNtZCwgbGVuKQotI2RlZmluZSBhdWRpb19zZW5kX3F1ZXVlX3JlYyhhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcmVjLCBcCi0JUURTUF91UEF1ZFJlY0NtZFF1ZXVlLCBjbWQsIGxlbikKLQotLyogQ29udmVydCBCaXQgUmF0ZSB0byBSZWNvcmQgUXVhbGl0eSBmaWVsZCBvZiBEU1AgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYml0cmF0ZV90b19yZWNvcmRfcXVhbGl0eSh1bnNpZ25lZCBpbnQgc2FtcGxlX3JhdGUsCi0gICAgdW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBiaXRfcmF0ZSkgewotCXVuc2lnbmVkIGludCB0ZW1wOwotCi0JdGVtcCA9IHNhbXBsZV9yYXRlICogY2hhbm5lbDsKLQlNTV9EQkcoIiBzYW1wbGUgcmF0ZSAqICBjaGFubmVsID0gJWQgXG4iLCB0ZW1wKTsKLQkvKiBUbyByZXByZXNlbnQgaW4gUTEyIGZpeGVkIGZvcm1hdCAqLwotCXRlbXAgPSAoYml0X3JhdGUgKiA0MDk2KSAvIHRlbXA7Ci0JTU1fREJHKCIgUmVjb3JkIFF1YWxpdHkgPSAweCU4eCBcbiIsIHRlbXApOwotCXJldHVybiB0ZW1wOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2RzcF9zZXRfdHhfYWdjKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pCi17Ci0JYXVkcHJlcHJvY19jbWRfY2ZnX2FnY19wYXJhbXMgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWF1ZGlvLT50eF9hZ2NfY2ZnLmNtZF9pZCA9IEFVRFBSRVBST0NfQ01EX0NGR19BR0NfUEFSQU1TOwotCWlmIChhdWRpby0+dHhfYWdjX2VuYWJsZSkgewotCQkvKiBjbWQudHhfYWdjX3BhcmFtX21hc2sgPSAweEZFMDAgZnJvbSBzYW1wbGUgY29kZSAqLwotCQlhdWRpby0+dHhfYWdjX2NmZy50eF9hZ2NfcGFyYW1fbWFzayA9Ci0JCSgxIDw8IEFVRFBSRVBST0NfQ01EX1RYX0FHQ19QQVJBTV9NQVNLX0NPTVBfU0xPUEUpIHwKLQkJKDEgPDwgQVVEUFJFUFJPQ19DTURfVFhfQUdDX1BBUkFNX01BU0tfQ09NUF9USCkgfAotCQkoMSA8PCBBVURQUkVQUk9DX0NNRF9UWF9BR0NfUEFSQU1fTUFTS19FWFBfU0xPUEUpIHwKLQkJKDEgPDwgQVVEUFJFUFJPQ19DTURfVFhfQUdDX1BBUkFNX01BU0tfRVhQX1RIKSB8Ci0JCSgxIDw8IEFVRFBSRVBST0NfQ01EX1RYX0FHQ19QQVJBTV9NQVNLX0NPTVBfQUlHX0ZMQUcpIHwKLQkJKDEgPDwgQVVEUFJFUFJPQ19DTURfVFhfQUdDX1BBUkFNX01BU0tfQ09NUF9TVEFUSUNfR0FJTikgfAotCQkoMSA8PCBBVURQUkVQUk9DX0NNRF9UWF9BR0NfUEFSQU1fTUFTS19UWF9BR0NfRU5BX0ZMQUcpOwotCQlhdWRpby0+dHhfYWdjX2NmZy50eF9hZ2NfZW5hYmxlX2ZsYWcgPQotCQkJQVVEUFJFUFJPQ19DTURfVFhfQUdDX0VOQV9GTEFHX0VOQTsKLQkJLyogY21kLnBhcmFtX21hc2sgPSAweEZGRjAgZnJvbSBzYW1wbGUgY29kZSAqLwotCQlhdWRpby0+dHhfYWdjX2NmZy5wYXJhbV9tYXNrID0KLQkJCSgxIDw8IEFVRFBSRVBST0NfQ01EX1BBUkFNX01BU0tfUk1TX1RBWSkgfAotCQkJKDEgPDwgQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19SRUxFQVNFSykgfAotCQkJKDEgPDwgQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19ERUxBWSkgfAotCQkJKDEgPDwgQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19BVFRBQ0tLKSB8Ci0JCQkoMSA8PCBBVURQUkVQUk9DX0NNRF9QQVJBTV9NQVNLX0xFQUtSQVRFX1NMT1cpIHwKLQkJCSgxIDw8IEFVRFBSRVBST0NfQ01EX1BBUkFNX01BU0tfTEVBS1JBVEVfRkFTVCkgfAotCQkJKDEgPDwgQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19BSUdfUkVMRUFTRUspIHwKLQkJCSgxIDw8IEFVRFBSRVBST0NfQ01EX1BBUkFNX01BU0tfQUlHX01JTikgfAotCQkJKDEgPDwgQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19BSUdfTUFYKSB8Ci0JCQkoMSA8PCBBVURQUkVQUk9DX0NNRF9QQVJBTV9NQVNLX0xFQUtfVVApIHwKLQkJCSgxIDw8IEFVRFBSRVBST0NfQ01EX1BBUkFNX01BU0tfTEVBS19ET1dOKSB8Ci0JCQkoMSA8PCBBVURQUkVQUk9DX0NNRF9QQVJBTV9NQVNLX0FJR19BVFRBQ0tLKTsKLQl9IGVsc2UgewotCQlhdWRpby0+dHhfYWdjX2NmZy50eF9hZ2NfcGFyYW1fbWFzayA9Ci0JCQkoMSA8PCBBVURQUkVQUk9DX0NNRF9UWF9BR0NfUEFSQU1fTUFTS19UWF9BR0NfRU5BX0ZMQUcpOwotCQlhdWRpby0+dHhfYWdjX2NmZy50eF9hZ2NfZW5hYmxlX2ZsYWcgPQotCQkJQVVEUFJFUFJPQ19DTURfVFhfQUdDX0VOQV9GTEFHX0RJUzsKLQl9Ci0JY21kID0gYXVkaW8tPnR4X2FnY19jZmc7Ci0KLQlyZXR1cm4gYXVkaW9fc2VuZF9xdWV1ZV9wcmUoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRpb19lbmFibGVfdHhfYWdjKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0JaWYgKGF1ZGlvLT50eF9hZ2NfZW5hYmxlICE9IGVuYWJsZSkgewotCQlhdWRpby0+dHhfYWdjX2VuYWJsZSA9IGVuYWJsZTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkaW9fZHNwX3NldF90eF9hZ2MoYXVkaW8pOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19kc3Bfc2V0X25zKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pCi17Ci0JYXVkcHJlcHJvY19jbWRfY2ZnX25zX3BhcmFtcyBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCi0JYXVkaW8tPm5zX2NmZy5jbWRfaWQgPSBBVURQUkVQUk9DX0NNRF9DRkdfTlNfUEFSQU1TOwotCi0JaWYgKGF1ZGlvLT5uc19lbmFibGUpIHsKLQkJLyogY21kLmVjX21vZGVfbmV3IGlzIGZpeGVkIGFzIDB4MDA2NCB3aGVuIGVuYWJsZQotCQkgKiBmcm9tIHNhbXBsZSBjb2RlICovCi0JCWF1ZGlvLT5uc19jZmcuZWNfbW9kZV9uZXcgPQotCQkJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9ORVdfTlNfRU5BIHwKLQkJCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX0hCX0VOQSB8Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19WQV9FTkE7Ci0JfSBlbHNlIHsKLQkJYXVkaW8tPm5zX2NmZy5lY19tb2RlX25ldyA9Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19OTE1TX0RJUyB8Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19ERVNfRElTIHwKLQkJCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX05TX0RJUyB8Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19DTklfRElTIHwKLQkJCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX05MRVNfRElTIHwKLQkJCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX0hCX0RJUyB8Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19WQV9ESVMgfAotCQkJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9ORVdfUENEX0RJUyB8Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19GRUhJX0RJUyB8Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19ORUhJX0RJUyB8Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19OTFBQX0RJUyB8Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19GTkVfRElTIHwKLQkJCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX1BSRU5MTVNfRElTOwotCX0KLQljbWQgPSBhdWRpby0+bnNfY2ZnOwotCi0JcmV0dXJuIGF1ZGlvX3NlbmRfcXVldWVfcHJlKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZW5hYmxlX25zKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0JaWYgKGF1ZGlvLT5uc19lbmFibGUgIT0gZW5hYmxlKSB7Ci0JCWF1ZGlvLT5uc19lbmFibGUgPSBlbmFibGU7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZGlvX2RzcF9zZXRfbnMoYXVkaW8pOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19kc3Bfc2V0X2lpcihzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCWF1ZHByZXByb2NfY21kX2NmZ19paXJfdHVuaW5nX2ZpbHRlcl9wYXJhbXMgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWF1ZGlvLT5paXJfY2ZnLmNtZF9pZCA9IEFVRFBSRVBST0NfQ01EX0NGR19JSVJfVFVOSU5HX0ZJTFRFUl9QQVJBTVM7Ci0KLQlpZiAoYXVkaW8tPmlpcl9lbmFibGUpCi0JCS8qIGNtZC5hY3RpdmVfZmxhZyBpcyAweEZGRkYgZnJvbSBzYW1wbGUgY29kZSBidXQgMHgwMDAxIGhlcmUgKi8KLQkJYXVkaW8tPmlpcl9jZmcuYWN0aXZlX2ZsYWcgPSBBVURQUkVQUk9DX0NNRF9JSVJfQUNUSVZFX0ZMQUdfRU5BOwotCWVsc2UKLQkJYXVkaW8tPmlpcl9jZmcuYWN0aXZlX2ZsYWcgPSBBVURQUkVQUk9DX0NNRF9JSVJfQUNUSVZFX0ZMQUdfRElTOwotCi0JY21kID0gYXVkaW8tPmlpcl9jZmc7Ci0KLQlyZXR1cm4gYXVkaW9fc2VuZF9xdWV1ZV9wcmUoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRpb19lbmFibGVfaWlyKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0JaWYgKGF1ZGlvLT5paXJfZW5hYmxlICE9IGVuYWJsZSkgewotCQlhdWRpby0+aWlyX2VuYWJsZSA9IGVuYWJsZTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkaW9fZHNwX3NldF9paXIoYXVkaW8pOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19pbl9kc3BfZW5hYmxlKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0JYXVkcmVjX2NtZF9jZmcgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUkVDX0NNRF9DRkc7Ci0JY21kLnR5cGVfMCA9IGVuYWJsZSA/IEFVRFJFQ19DTURfVFlQRV8wX0VOQSA6IEFVRFJFQ19DTURfVFlQRV8wX0RJUzsKLQljbWQudHlwZV8wIHw9IChBVURSRUNfQ01EX1RZUEVfMF9VUERBVEUgfCBhdWRpby0+dHlwZSk7Ci0JY21kLnR5cGVfMSA9IDA7Ci0KLQlyZXR1cm4gYXVkaW9fc2VuZF9xdWV1ZV9yZWMoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRpb19pbl9lbmNvZGVyX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCWF1ZHJlY19jbWRfYXJlYzBwYXJhbV9jZmcgY21kOwotCXVpbnQxNl90ICpkYXRhID0gKHZvaWQgKikgYXVkaW8tPmRhdGE7Ci0JdW5zaWduZWQgbjsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfQVJFQzBQQVJBTV9DRkc7Ci0JY21kLnB0cl90b19leHRwa3RfYnVmZmVyX21zdyA9IGF1ZGlvLT5waHlzID4+IDE2OwotCWNtZC5wdHJfdG9fZXh0cGt0X2J1ZmZlcl9sc3cgPSBhdWRpby0+cGh5czsKLQljbWQuYnVmX2xlbiA9IEZSQU1FX05VTTsgLyogQm90aCBXQVYgYW5kIEFBQyB1c2UgOCBmcmFtZXMgKi8KLQljbWQuc2FtcF9yYXRlX2luZGV4ID0gYXVkaW8tPnNhbXBfcmF0ZV9pbmRleDsKLQljbWQuc3RlcmVvX21vZGUgPSBhdWRpby0+Y2hhbm5lbF9tb2RlOyAvKiAwIGZvciBtb25vLCAxIGZvciBzdGVyZW8gKi8KLQotCS8qIGNtZC5yZWNfcXVhbGl0eSBpcyBiYXNlZCBvbiB1c2VyIHNldCBiaXQgcmF0ZSAvIHNhbXBsZSByYXRlIC8KLQkgKiBjaGFubmVsCi0JICovCi0JY21kLnJlY19xdWFsaXR5ID0gYXVkaW8tPnJlY29yZF9xdWFsaXR5OwotCi0JLyogcHJlcGFyZSBidWZmZXIgcG9pbnRlcnM6Ci0JICogTW9ubzogMTAyNCBzYW1wbGVzICsgNCBoYWxmd29yZCBoZWFkZXIKLQkgKiBTdGVyZW86IDIwNDggc2FtcGxlcyArIDQgaGFsZndvcmQgaGVhZGVyCi0JICogQUFDCi0JICogTW9uby9TdGVyZTogNzY4ICsgNCBoYWxmd29yZCBoZWFkZXIKLQkgKi8KLQlmb3IgKG4gPSAwOyBuIDwgRlJBTUVfTlVNOyBuKyspIHsKLQkJYXVkaW8tPmluW25dLmRhdGEgPSBkYXRhICsgNDsKLQkJaWYgKGF1ZGlvLT50eXBlID09IEFVRFJFQ19DTURfVFlQRV8wX0lOREVYX1dBVikKLQkJCWRhdGEgKz0gKDQgKyAoYXVkaW8tPmNoYW5uZWxfbW9kZSA/IDIwNDggOiAxMDI0KSk7Ci0JCWVsc2UgaWYgKGF1ZGlvLT50eXBlID09IEFVRFJFQ19DTURfVFlQRV8wX0lOREVYX0FBQykKLQkJCWRhdGEgKz0gKDQgKyA3NjgpOwotCX0KLQotCXJldHVybiBhdWRpb19zZW5kX3F1ZXVlX3JlYyhhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2RzcF9yZWFkX2J1ZmZlcihzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLCB1aW50MzJfdCByZWFkX2NudCkKLXsKLQlhdWRyZWNfY21kX3BhY2tldF9leHRfcHRyIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfUEFDS0VUX0VYVF9QVFI7Ci0JLyogQm90aCBXQVYgYW5kIEFBQyB1c2UgQVVEUkVDX0NNRF9UWVBFXzAgKi8KLQljbWQudHlwZSA9IEFVRFJFQ19DTURfVFlQRV8wOwotCWNtZC5jdXJyX3JlY19jb3VudF9tc3cgPSByZWFkX2NudCA+PiAxNjsKLQljbWQuY3Vycl9yZWNfY291bnRfbHN3ID0gcmVhZF9jbnQ7Ci0KLQlyZXR1cm4gYXVkaW9fc2VuZF9xdWV1ZV9yZWNicyhhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHZvaWQgYXVkaW9fZmx1c2goc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlpbnQgaTsKLQotCWF1ZGlvLT5kc3BfY250ID0gMDsKLQlhdWRpby0+aW5faGVhZCA9IDA7Ci0JYXVkaW8tPmluX3RhaWwgPSAwOwotCWF1ZGlvLT5pbl9jb3VudCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IEZSQU1FX05VTTsgaSsrKSB7Ci0JCWF1ZGlvLT5pbltpXS5zaXplID0gMDsKLQkJYXVkaW8tPmluW2ldLnJlYWQgPSAwOwotCX0KLX0KLQotc3RhdGljIGxvbmcgYXVkaW9faW5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmM7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCQlzdGF0cy5ieXRlX2NvdW50ID0gYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9ieXRlcyk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6Ci0JCXJjID0gYXVkaW9faW5fZW5hYmxlKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TVE9QOgotCQlyYyA9IGF1ZGlvX2luX2Rpc2FibGUoYXVkaW8pOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fRkxVU0g6Ci0JCWlmIChhdWRpby0+c3RvcHBlZCkgewotCQkJLyogTWFrZSBzdXJlIHdlJ3JlIHN0b3BwZWQgYW5kIHdlIHdha2UgYW55IHRocmVhZHMKLQkJCSAqIHRoYXQgbWlnaHQgYmUgYmxvY2tlZCBob2xkaW5nIHRoZSByZWFkX2xvY2suCi0JCQkgKiBXaGlsZSBhdWRpby0+c3RvcHBlZCByZWFkIHRocmVhZHMgd2lsbCBhbHdheXMKLQkJCSAqIGV4aXQgaW1tZWRpYXRlbHkuCi0JCQkgKi8KLQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCQkJYXVkaW9fZmx1c2goYXVkaW8pOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQkJfQotCWNhc2UgQVVESU9fU0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjZmc7Ci0JCS8qIFRoZSBiZWxvdyBjb2RlIGlzIHRvIG1ha2UgbXV0dWFsIGV4Y2x1c2l2ZSBiZXR3ZWVuCi0JCSAqIEFVRElPX1NFVF9DT05GSUcgYW5kIEFVRElPX1NFVF9TVFJFQU1fQ09ORklHLgotCQkgKiBBbGxvdyBhbnkgb25lIElPQ1RMLgotCQkgKi8KLQkJaWYgKGF1ZGlvLT5idWZmZXJfY2ZnX2lvY3RsID09IEFVRElPX1NFVF9TVFJFQU1fQ09ORklHKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgKHZvaWQgKikgYXJnLCBzaXplb2YoY2ZnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjZmcuY2hhbm5lbF9jb3VudCA9PSAxKSB7Ci0JCQljZmcuY2hhbm5lbF9jb3VudCA9IEFVRFJFQ19DTURfU1RFUkVPX01PREVfTU9OTzsKLQkJfSBlbHNlIGlmIChjZmcuY2hhbm5lbF9jb3VudCA9PSAyKSB7Ci0JCQljZmcuY2hhbm5lbF9jb3VudCA9IEFVRFJFQ19DTURfU1RFUkVPX01PREVfU1RFUkVPOwotCQl9IGVsc2UgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY2ZnLnR5cGUgPT0gMCkgewotCQkJY2ZnLnR5cGUgPSBBVURSRUNfQ01EX1RZUEVfMF9JTkRFWF9XQVY7Ci0JCX0gZWxzZSBpZiAoY2ZnLnR5cGUgPT0gMSkgewotCQkJY2ZnLnR5cGUgPSBBVURSRUNfQ01EX1RZUEVfMF9JTkRFWF9BQUM7Ci0JCX0gZWxzZSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlhdWRpby0+c2FtcF9yYXRlID0gY29udmVydF9zYW1wX3JhdGUoY2ZnLnNhbXBsZV9yYXRlKTsKLQkJYXVkaW8tPnNhbXBfcmF0ZV9pbmRleCA9Ci0JCSAgY29udmVydF9kc3Bfc2FtcF9pbmRleChjZmcuc2FtcGxlX3JhdGUpOwotCQlhdWRpby0+Y2hhbm5lbF9tb2RlID0gY2ZnLmNoYW5uZWxfY291bnQ7Ci0JCWF1ZGlvLT5idWZmZXJfc2l6ZSA9Ci0JCQkJYXVkaW8tPmNoYW5uZWxfbW9kZSA/IFNURVJFT19EQVRBX1NJWkUKLQkJCQkJCQk6IE1PTk9fREFUQV9TSVpFOwotCQlhdWRpby0+dHlwZSA9IGNmZy50eXBlOwotCQlhdWRpby0+YnVmZmVyX2NmZ19pb2N0bCA9IEFVRElPX1NFVF9DT05GSUc7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjZmc7Ci0JCWNmZy5idWZmZXJfc2l6ZSA9IGF1ZGlvLT5idWZmZXJfc2l6ZTsKLQkJY2ZnLmJ1ZmZlcl9jb3VudCA9IEZSQU1FX05VTTsKLQkJY2ZnLnNhbXBsZV9yYXRlID0gY29udmVydF9zYW1wX2luZGV4KGF1ZGlvLT5zYW1wX3JhdGUpOwotCQlpZiAoYXVkaW8tPmNoYW5uZWxfbW9kZSA9PSBBVURSRUNfQ01EX1NURVJFT19NT0RFX01PTk8pCi0JCQljZmcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JCWVsc2UKLQkJCWNmZy5jaGFubmVsX2NvdW50ID0gMjsKLQkJaWYgKGF1ZGlvLT50eXBlID09IEFVRFJFQ19DTURfVFlQRV8wX0lOREVYX1dBVikKLQkJCWNmZy50eXBlID0gMDsKLQkJZWxzZQotCQkJY2ZnLnR5cGUgPSAxOwotCQljZmcudW51c2VkWzBdID0gMDsKLQkJY2ZnLnVudXNlZFsxXSA9IDA7Ci0JCWNmZy51bnVzZWRbMl0gPSAwOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmNmZywgc2l6ZW9mKGNmZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9TVFJFQU1fQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBjZmc7Ci0JCWNmZy5idWZmZXJfc2l6ZSA9IGF1ZGlvLT5idWZmZXJfc2l6ZTsKLQkJY2ZnLmJ1ZmZlcl9jb3VudCA9IEZSQU1FX05VTTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNmZywgc2l6ZW9mKGNmZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9TVFJFQU1fQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBjZmc7Ci0JCS8qIFRoZSBiZWxvdyBjb2RlIGlzIHRvIG1ha2UgbXV0dWFsIGV4Y2x1c2l2ZSBiZXR3ZWVuCi0JCSAqIEFVRElPX1NFVF9DT05GSUcgYW5kIEFVRElPX1NFVF9TVFJFQU1fQ09ORklHLgotCQkgKiBBbGxvdyBhbnkgb25lIElPQ1RMLgotCQkgKi8KLQkJaWYgKGF1ZGlvLT5idWZmZXJfY2ZnX2lvY3RsID09IEFVRElPX1NFVF9DT05GSUcpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNmZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfSBlbHNlCi0JCQlyYyA9IDA7Ci0JCWF1ZGlvLT5idWZmZXJfc2l6ZSA9IGNmZy5idWZmZXJfc2l6ZTsKLQkJLyogVGhlIElPQ1RMIGlzIG9ubHkgb2YgQUFDLCBzZXQgdGhlIGVuY29kZXIgYXMgQUFDICovCi0JCWF1ZGlvLT50eXBlID0gMTsKLQkJYXVkaW8tPmJ1ZmZlcl9jZmdfaW9jdGwgPSBBVURJT19TRVRfU1RSRUFNX0NPTkZJRzsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0FBQ19FTkNfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcgY2ZnOwotCQlpZiAoYXVkaW8tPmNoYW5uZWxfbW9kZSA9PSBBVURSRUNfQ01EX1NURVJFT19NT0RFX01PTk8pCi0JCQljZmcuY2hhbm5lbHMgPSAxOwotCQllbHNlCi0JCQljZmcuY2hhbm5lbHMgPSAyOwotCQljZmcuc2FtcGxlX3JhdGUgPSBjb252ZXJ0X3NhbXBfaW5kZXgoYXVkaW8tPnNhbXBfcmF0ZSk7Ci0JCWNmZy5iaXRfcmF0ZSA9IGF1ZGlvLT5iaXRfcmF0ZTsKLQkJY2ZnLnN0cmVhbV9mb3JtYXQgPSBBVURJT19BQUNfRk9STUFUX1JBVzsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNmZywgc2l6ZW9mKGNmZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9BQUNfRU5DX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnIGNmZzsKLQkJdW5zaWduZWQgaW50IHJlY29yZF9xdWFsaXR5OwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgKHZvaWQgKilhcmcsIHNpemVvZihjZmcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNmZy5zdHJlYW1fZm9ybWF0ICE9IEFVRElPX0FBQ19GT1JNQVRfUkFXKSB7Ci0JCQlNTV9FUlIoInVuc3VwcG9ydGVkIEFBQyBmb3JtYXRcbiIpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmVjb3JkX3F1YWxpdHkgPSBiaXRyYXRlX3RvX3JlY29yZF9xdWFsaXR5KGNmZy5zYW1wbGVfcmF0ZSwKLQkJCQkJY2ZnLmNoYW5uZWxzLCBjZmcuYml0X3JhdGUpOwotCQkvKiBSYW5nZSBvZiBSZWNvcmQgUXVhbGl0eSBTdXBwb3J0ZWQgYnkgRFNQLCBRMTIgZm9ybWF0ICovCi0JCWlmICgocmVjb3JkX3F1YWxpdHkgPCAweDgwMCkgfHwgKHJlY29yZF9xdWFsaXR5ID4gMHg0MDAwKSkgewotCQkJTU1fRVJSKCJVbnN1cHBvcnRlZCBiaXQgcmF0ZSBcbiIpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNmZy5jaGFubmVscyA9PSAxKSB7Ci0JCQljZmcuY2hhbm5lbHMgPSBBVURSRUNfQ01EX1NURVJFT19NT0RFX01PTk87Ci0JCX0gZWxzZSBpZiAoY2ZnLmNoYW5uZWxzID09IDIpIHsKLQkJCWNmZy5jaGFubmVscyA9IEFVRFJFQ19DTURfU1RFUkVPX01PREVfU1RFUkVPOwotCQl9IGVsc2UgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPnNhbXBfcmF0ZSA9IGNvbnZlcnRfc2FtcF9yYXRlKGNmZy5zYW1wbGVfcmF0ZSk7Ci0JCWF1ZGlvLT5zYW1wX3JhdGVfaW5kZXggPQotCQkgIGNvbnZlcnRfZHNwX3NhbXBfaW5kZXgoY2ZnLnNhbXBsZV9yYXRlKTsKLQkJYXVkaW8tPmNoYW5uZWxfbW9kZSA9IGNmZy5jaGFubmVsczsKLQkJYXVkaW8tPmJpdF9yYXRlID0gY2ZnLmJpdF9yYXRlOwotCQlhdWRpby0+cmVjb3JkX3F1YWxpdHkgPSByZWNvcmRfcXVhbGl0eTsKLQkJTU1fREJHKCIgUmVjb3JkIFF1YWxpdHkgPSAweCU4eCBcbiIsIGF1ZGlvLT5yZWNvcmRfcXVhbGl0eSk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRpb19pbl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCWNoYXIgX191c2VyICpidWYsCi0JCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXZvaWQgKmRhdGE7Ci0JdWludDMyX3QgaW5kZXg7Ci0JdWludDMyX3Qgc2l6ZTsKLQlpbnQgcmMgPSAwOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCWF1ZGlvLT53YWl0LCAoYXVkaW8tPmluX2NvdW50ID4gMCkgfHwgYXVkaW8tPnN0b3BwZWQpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGF1ZGlvLT5zdG9wcGVkICYmICFhdWRpby0+aW5fY291bnQpIHsKLQkJCXJjID0gMDsvKiBFbmQgb2YgRmlsZSAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpbmRleCA9IGF1ZGlvLT5pbl90YWlsOwotCQlkYXRhID0gKHVpbnQ4X3QgKikgYXVkaW8tPmluW2luZGV4XS5kYXRhOwotCQlzaXplID0gYXVkaW8tPmluW2luZGV4XS5zaXplOwotCQlpZiAoY291bnQgPj0gc2l6ZSkgewotCQkJLyogb3JkZXIgdGhlIHJlYWRzIG9uIHRoZSBidWZmZXIgKi8KLQkJCWRtYV9jb2hlcmVudF9wb3N0X29wcygpOwotCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGRhdGEsIHNpemUpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJaWYgKGluZGV4ICE9IGF1ZGlvLT5pbl90YWlsKSB7Ci0JCQkvKiBvdmVycnVuIC0tIGRhdGEgaXMgaW52YWxpZCBhbmQgd2UgbmVlZCB0byByZXRyeSAqLwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYXVkaW8tPmluW2luZGV4XS5zaXplID0gMDsKLQkJCWF1ZGlvLT5pbl90YWlsID0gKGF1ZGlvLT5pbl90YWlsICsgMSkgJiAoRlJBTUVfTlVNIC0gMSk7Ci0JCQlhdWRpby0+aW5fY291bnQtLTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJY291bnQgLT0gc2l6ZTsKLQkJCWJ1ZiArPSBzaXplOwotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJzaG9ydCByZWFkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChhdWRpby0+dHlwZSA9PSBBVURSRUNfQ01EX1RZUEVfMF9JTkRFWF9BQUMpCi0JCQlicmVhazsgLyogQUFDIG9ubHkgcmVhZCBvbmUgZnJhbWUgKi8KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQotCWlmIChidWYgPiBzdGFydCkKLQkJcmV0dXJuIGJ1ZiAtIHN0YXJ0OwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRpb19pbl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9faW5fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGlvX2luX2Rpc2FibGUoYXVkaW8pOwotCWF1ZGlvX2ZsdXNoKGF1ZGlvKTsKLQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHJlYyk7Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRwcmUpOwotCWF1ZGlvLT5hdWRyZWMgPSBOVUxMOwotCWF1ZGlvLT5hdWRwcmUgPSBOVUxMOwotCWF1ZGlvLT5vcGVuZWQgPSAwOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgYXVkaW9faW4gdGhlX2F1ZGlvX2luOwotCi1zdGF0aWMgaW50IGF1ZGlvX2luX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9ICZ0aGVfYXVkaW9faW47Ci0JaW50IHJjOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWlmIChhdWRpby0+b3BlbmVkKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogU2V0dGluZ3Mgd2lsbCBiZSByZS1jb25maWcgYXQgQVVESU9fU0VUX0NPTkZJRywKLQkgKiBidXQgYXQgbGVhc3Qgd2UgbmVlZCB0byBoYXZlIGluaXRpYWwgY29uZmlnCi0JICovCi0JYXVkaW8tPnNhbXBfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzExMDI1OwotCWF1ZGlvLT5zYW1wX3JhdGVfaW5kZXggPSBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzExMDI1OwotCWF1ZGlvLT5jaGFubmVsX21vZGUgPSBBVURSRUNfQ01EX1NURVJFT19NT0RFX01PTk87Ci0JYXVkaW8tPmJ1ZmZlcl9zaXplID0gTU9OT19EQVRBX1NJWkU7Ci0JYXVkaW8tPnR5cGUgPSBBVURSRUNfQ01EX1RZUEVfMF9JTkRFWF9XQVY7Ci0KLQkvKiBGb3IgQUFDLCBiaXQgcmF0ZSBoYXJkIGNvZGVkLCBkZWZhdWx0IHNldHRpbmdzIGlzCi0JICogc2FtcGxlIHJhdGUgKDExMDI1KSB4IGNoYW5uZWwgY291bnQgKDEpIHggcmVjb3JkaW5nIHF1YWxpdHkgKDEuNzUpCi0JICogPSAxOTI5MyBicHMgICovCi0JYXVkaW8tPmJpdF9yYXRlID0gMTkyOTM7Ci0JYXVkaW8tPnJlY29yZF9xdWFsaXR5ID0gMHgxYzAwOwotCi0JcmMgPSBhdWRtZ3Jfb3BlbigmYXVkaW8tPmF1ZG1ncik7Ci0JaWYgKHJjKQotCQlnb3RvIGRvbmU7Ci0JcmMgPSBtc21fYWRzcF9nZXQoIkFVRFBSRVBST0NUQVNLIiwgJmF1ZGlvLT5hdWRwcmUsCi0JCQkJJmF1ZHByZV9hZHNwX29wcywgYXVkaW8pOwotCWlmIChyYykKLQkJZ290byBkb25lOwotCXJjID0gbXNtX2Fkc3BfZ2V0KCJBVURSRUNUQVNLIiwgJmF1ZGlvLT5hdWRyZWMsCi0JCQkgICAmYXVkcmVjX2Fkc3Bfb3BzLCBhdWRpbyk7Ci0JaWYgKHJjKQotCQlnb3RvIGRvbmU7Ci0KLQlhdWRpby0+ZHNwX2NudCA9IDA7Ci0JYXVkaW8tPnN0b3BwZWQgPSAwOwotCWF1ZGlvLT5idWZmZXJfY2ZnX2lvY3RsID0gMDsgLyogTm8gdmFsaWQgaW9jdGwgc2V0ICovCi0KLQlhdWRpb19mbHVzaChhdWRpbyk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQlhdWRpby0+b3BlbmVkID0gMTsKLQlyYyA9IDA7Ci1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgYXVkcHJlX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDAsIGVuYWJsZTsKLQl1aW50MTZfdCBlbmFibGVfbWFzazsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fRU5BQkxFX0FVRFBSRToKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZlbmFibGVfbWFzaywgKHZvaWQgKikgYXJnLAotCQkJCQkJc2l6ZW9mKGVuYWJsZV9tYXNrKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZW5hYmxlID0gKGVuYWJsZV9tYXNrICYgQUdDX0VOQUJMRSkgPyAxIDogMDsKLQkJYXVkaW9fZW5hYmxlX3R4X2FnYyhhdWRpbywgZW5hYmxlKTsKLQkJZW5hYmxlID0gKGVuYWJsZV9tYXNrICYgTlNfRU5BQkxFKSA/IDEgOiAwOwotCQlhdWRpb19lbmFibGVfbnMoYXVkaW8sIGVuYWJsZSk7Ci0JCWVuYWJsZSA9IChlbmFibGVfbWFzayAmIFRYX0lJUl9FTkFCTEUpID8gMSA6IDA7Ci0JCWF1ZGlvX2VuYWJsZV9paXIoYXVkaW8sIGVuYWJsZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfQUdDOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmF1ZGlvLT50eF9hZ2NfY2ZnLCAodm9pZCAqKSBhcmcsCi0JCQkJCQlzaXplb2YoYXVkaW8tPnR4X2FnY19jZmcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX1NFVF9OUzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhdWRpby0+bnNfY2ZnLCAodm9pZCAqKSBhcmcsCi0JCQkJCQlzaXplb2YoYXVkaW8tPm5zX2NmZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fU0VUX1RYX0lJUjoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhdWRpby0+aWlyX2NmZywgKHZvaWQgKikgYXJnLAotCQkJCQkJc2l6ZW9mKGF1ZGlvLT5paXJfY2ZnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRwcmVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gJnRoZV9hdWRpb19pbjsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGF1ZGlvX2luX29wZW4sCi0JLnJlbGVhc2UJPSBhdWRpb19pbl9yZWxlYXNlLAotCS5yZWFkCQk9IGF1ZGlvX2luX3JlYWQsCi0JLndyaXRlCQk9IGF1ZGlvX2luX3dyaXRlLAotCS51bmxvY2tlZF9pb2N0bAk9IGF1ZGlvX2luX2lvY3RsLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9faW5fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX3BjbV9pbiIsCi0JLmZvcHMJPSAmYXVkaW9fZm9wcywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZHByZV9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBhdWRwcmVfb3BlbiwKLQkudW5sb2NrZWRfaW9jdGwJPSBhdWRwcmVfaW9jdGwsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRwcmVfbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX3ByZXByb2NfY3RsIiwKLQkuZm9wcwk9ICZhdWRwcmVfZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGlvX2luX2luaXQodm9pZCkKLXsKLQl0aGVfYXVkaW9faW4uZGF0YSA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBETUFTWiwKLQkJCQkJICAgICAgICZ0aGVfYXVkaW9faW4ucGh5cywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0aGVfYXVkaW9faW4uZGF0YSkgewotCQlNTV9FUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSBETUEgYnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JbXV0ZXhfaW5pdCgmdGhlX2F1ZGlvX2luLmxvY2spOwotCW11dGV4X2luaXQoJnRoZV9hdWRpb19pbi5yZWFkX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZ0aGVfYXVkaW9faW4uZHNwX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoZV9hdWRpb19pbi53YWl0KTsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9faW5fbWlzYykgfHwgbWlzY19yZWdpc3RlcigmYXVkcHJlX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoYXVkaW9faW5faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19scGEuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX2xwYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjBkNjhhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX2xwYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUyMCArMCwwIEBACi0KLS8qIGF1ZGlvX2xwYS5jIC0gbG93IHBvd2VyIGF1ZGlvIGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogQmFzZWQgb24gdGhlIFBDTSBkZWNvZGVyIGRyaXZlciBpbiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19wY20uYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqCi0gKiBBbGwgc291cmNlIGNvZGUgaW4gdGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBleGNlcHQKLSAqIHdoZXJlIGluZGljYXRlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCi0gKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBmaW5kIGl0IGF0IGh0dHA6Ly93d3cuZnNmLm9yZwotICovCi0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9lYXJseXN1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLQotCi0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXUuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11X2RvbWFpbnMuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHBjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBsYXljbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBsYXltc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1cm10Y21kaS5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1vcnlfYWxsb2MuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9tZW10eXBlcy5oPgotCi0jaW5jbHVkZSAiYXVkbWdyLmgiCi0KLS8qIGZvciBxdWV1ZSBpZHMgLSBzaG91bGQgYmUgcmVsYXRpdmUgdG8gbW9kdWxlIG51bWJlciovCi0jaW5jbHVkZSAiYWRzcC5oIgotCi0jZGVmaW5lIEFEUlZfU1RBVFVTX0FJT19JTlRGIDB4MDAwMDAwMDEKLSNkZWZpbmUgQURSVl9TVEFUVVNfT0JVRl9HSVZFTiAweDAwMDAwMDAyCi0jZGVmaW5lIEFEUlZfU1RBVFVTX0lCVUZfR0lWRU4gMHgwMDAwMDAwNAotI2RlZmluZSBBRFJWX1NUQVRVU19GU1lOQyAweDAwMDAwMDA4Ci0KLSNkZWZpbmUgTVNNX01BWF9WT0xVTUUgMHgyMDAwCi0vKiAxNyBhZGRlZCB0byBhdm9pZCBtb3JlIGRldmlhdGlvbiAqLwotI2RlZmluZSBNU01fVk9MVU1FX1NURVAgKE1TTV9NQVhfVk9MVU1FKzE3KQotI2RlZmluZSBNU01fVk9MVU1FX0ZBQ1RPUiAoMTAwMDApCi0KLS8qIFNpemUgbXVzdCBiZSBwb3dlciBvZiAyICovCi0jZGVmaW5lIE1BWF9CVUYgMgotI2RlZmluZSBCVUZTWiAoNTI0Mjg4KQotCi0jZGVmaW5lIEFVRERFQ19ERUNfUENNIDAKLQotLyogRGVjb2RlciBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBBVURQUFRBU0sgKi8KLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfU0xFRVAJMAotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19JTklUICAxCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX0NGRyAgIDIKLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfUExBWSAgMwotCi0jZGVmaW5lIEFVRFBDTV9FVkVOVF9OVU0gMTAgLyogRGVmYXVsdCBudW1iZXIgb2YgcHJlLWFsbG9jYXRlZCBldmVudCBwYWNrZXRzICovCi0KLSNkZWZpbmUgX19DT05UQUlOUyhyLCB2LCBsKSAoewkJCQkJXAotCXR5cGVvZihyKSBfX3IgPSByOwkJCQkJXAotCXR5cGVvZih2KSBfX3YgPSB2OwkJCQkJXAotCXR5cGVvZih2KSBfX2UgPSBfX3YgKyBsOwkJCQlcCi0JaW50IHJlcyA9ICgoX192ID49IF9fci0+dmFkZHIpICYmCQkJXAotCQkoX19lIDw9IF9fci0+dmFkZHIgKyBfX3ItPmxlbikpOwkJXAotCXJlczsJCQkJCQkJXAotfSkKLQotI2RlZmluZSBDT05UQUlOUyhyMSwgcjIpICh7CQkJCQlcCi0JdHlwZW9mKHIyKSBfX3IyID0gcjI7CQkJCQlcCi0JX19DT05UQUlOUyhyMSwgX19yMi0+dmFkZHIsIF9fcjItPmxlbik7CQkJXAotfSkKLQotI2RlZmluZSBJTl9SQU5HRShyLCB2KSAoewkJCQkJXAotCXR5cGVvZihyKSBfX3IgPSByOwkJCQkJXAotCXR5cGVvZih2KSBfX3Z2ID0gdjsJCQkJCVwKLQlpbnQgcmVzID0gKChfX3Z2ID49IF9fci0+dmFkZHIpICYmCQkJXAotCQkoX192diA8IChfX3ItPnZhZGRyICsgX19yLT5sZW4pKSk7CQlcCi0JcmVzOwkJCQkJCQlcCi19KQotCi0jZGVmaW5lIE9WRVJMQVBTKHIxLCByMikgKHsJCQkJCVwKLQl0eXBlb2YocjEpIF9fcjEgPSByMTsJCQkJCVwKLQl0eXBlb2YocjIpIF9fcjIgPSByMjsJCQkJCVwKLQl0eXBlb2YoX19yMi0+dmFkZHIpIF9fdiA9IF9fcjItPnZhZGRyOwkJCVwKLQl0eXBlb2YoX192KSBfX2UgPSBfX3YgKyBfX3IyLT5sZW4gLSAxOwkJCVwKLQlpbnQgcmVzID0gKElOX1JBTkdFKF9fcjEsIF9fdikgfHwgSU5fUkFOR0UoX19yMSwgX19lKSk7CVwKLQlyZXM7CQkJCQkJCVwKLX0pCi0KLXN0cnVjdCBhdWRpbzsKLQotc3RydWN0IGJ1ZmZlciB7Ci0Jdm9pZCAqZGF0YTsKLQl1bnNpZ25lZCBzaXplOwotCXVuc2lnbmVkIHVzZWQ7CQkvKiBJbnB1dCB1c2FnZSBhY3R1YWwgRFNQIHByb2R1Y2VkIFBDTSBzaXplICAqLwotCXVuc2lnbmVkIGFkZHI7Ci19OwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0cnVjdCBhdWRwY21fc3VzcGVuZF9jdGwgewotc3RydWN0IGVhcmx5X3N1c3BlbmQgbm9kZTsKLXN0cnVjdCBhdWRpbyAqYXVkaW87Ci19OwotI2VuZGlmCi0KLXN0cnVjdCBhdWRwY21fZXZlbnQgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlpbnQgZXZlbnRfdHlwZTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotfTsKLQotc3RydWN0IGF1ZGxwYV9pb25fcmVnaW9uIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZTsKLQlpbnQgZmQ7Ci0Jdm9pZCAqdmFkZHI7Ci0JdW5zaWduZWQgbG9uZyBwYWRkcjsKLQl1bnNpZ25lZCBsb25nIGt2YWRkcjsKLQl1bnNpZ25lZCBsb25nIGxlbjsKLQl1bnNpZ25lZCByZWZfY250OwotfTsKLQotc3RydWN0IGF1ZHBjbV9idWZmZXJfbm9kZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBtc21fYXVkaW9fYWlvX2J1ZiBidWY7Ci0JdW5zaWduZWQgbG9uZyBwYWRkcjsKLX07Ci0KLXN0cnVjdCBhdWRpbyB7Ci0Jc3RydWN0IGJ1ZmZlciBvdXRbMl07Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JdWludDhfdCBvdXRfaGVhZDsKLQl1aW50OF90IG91dF90YWlsOwotCXVpbnQ4X3Qgb3V0X25lZWRlZDsgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGRzcCBpcyB3YWl0aW5nIGZvciAqLwotCXN0cnVjdCBsaXN0X2hlYWQgb3V0X3F1ZXVlOyAvKiBxdWV1ZSB0byByZXRhaW4gb3V0cHV0IGJ1ZmZlcnMgKi8KLQlhdG9taWNfdCBvdXRfYnl0ZXM7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggd3JpdGVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3cml0ZV93YWl0OwotCi0Jc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqYXVkcGxheTsKLQotCS8qIGNvbmZpZ3VyYXRpb24gdG8gdXNlIG9uIG5leHQgZW5hYmxlICovCi0JdWludDMyX3Qgb3V0X3NhbXBsZV9yYXRlOwotCXVpbnQzMl90IG91dF9jaGFubmVsX21vZGU7Ci0JdWludDMyX3Qgb3V0X2JpdHM7IC8qIGJpdHMgcGVyIHNhbXBsZSAqLwotCi0Jc3RydWN0IGF1ZG1nciBhdWRtZ3I7Ci0KLQkvKiBkYXRhIGFsbG9jYXRlZCBmb3IgdmFyaW91cyBidWZmZXJzICovCi0JY2hhciAqZGF0YTsKLQlpbnQzMl90IHBoeXM7Ci0Jc3RydWN0IG1zbV9tYXBwZWRfYnVmZmVyICptYXBfdl93cml0ZTsKLQotCXVpbnQzMl90IGRydl9zdGF0dXM7Ci0JaW50IHdmbHVzaDsgLyogV3JpdGUgZmx1c2ggKi8KLQlpbnQgb3BlbmVkOwotCWludCBlbmFibGVkOwotCWludCBydW5uaW5nOwotCWludCBzdG9wcGVkOyAvKiBzZXQgd2hlbiBzdG9wcGVkLCBjbGVhcmVkIG9uIGZsdXNoICovCi0JaW50IHRlb3M7IC8qIHZhbGlkIG9ubHkgaWYgdHVubmVsIG1vZGUgJiBubyBkYXRhIGxlZnQgZm9yIGRlY29kZXIgKi8KLQlpbnQgcm10X3Jlc291cmNlX3JlbGVhc2VkOwotCWVudW0gbXNtX2F1ZF9kZWNvZGVyX3N0YXRlIGRlY19zdGF0ZTsgLyogUmVwcmVzZW50cyBkZWNvZGVyIHN0YXRlICovCi0JaW50IHJlc2VydmVkOyAvKiBBIGJ5dGUgaXMgYmVpbmcgcmVzZXJ2ZWQgKi8KLQljaGFyIHJzdl9ieXRlOyAvKiBIYW5kbGUgb2RkIGxlbmd0aCB1c2VyIGRhdGEgKi8KLQotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIHF1ZXVlX2lkOwotCi0JdW5zaWduZWQgbG9uZyB2b2x1bWU7Ci0KLQl1aW50MTZfdCBkZWNfaWQ7Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCXN0cnVjdCBhdWRwY21fc3VzcGVuZF9jdGwgc3VzcGVuZF9jdGw7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLSNlbmRpZgotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmcmVlX2V2ZW50X3F1ZXVlOwotCXN0cnVjdCBsaXN0X2hlYWQgZXZlbnRfcXVldWU7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgZXZlbnRfd2FpdDsKLQlzcGlubG9ja190IGV2ZW50X3F1ZXVlX2xvY2s7Ci0Jc3RydWN0IG11dGV4IGdldF9ldmVudF9sb2NrOwotCWludCBldmVudF9hYm9ydDsKLQotCXN0cnVjdCBsaXN0X2hlYWQgaW9uX3JlZ2lvbl9xdWV1ZTsKLQlpbnQgYnVmZmVyX2NvdW50OwotCWludCBidWZmZXJfc2l6ZTsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50OwotfTsKLQotc3RhdGljIGludCBhdWRkZWNfZHNwX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKTsKLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRpb19kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpOwotc3RhdGljIHZvaWQgYXVkcGNtX3Bvc3RfZXZlbnQoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHR5cGUsCi0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBhdWRscGFfaW9uX2ZpeHVwKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHZvaWQgKmFkZHIsCi0JdW5zaWduZWQgbG9uZyBsZW4sIGludCByZWZfdXApOwotc3RhdGljIHZvaWQgYXVkcGNtX2FzeW5jX3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCXVuc2lnbmVkIG5lZWRlZCk7Ci0KLQotc3RhdGljIGludCBybXRfcHV0X3Jlc291cmNlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZF9jb2RlY19jb25maWdfY21kIGNtZDsKLQl1bnNpZ25lZCBzaG9ydCBjbGllbnRfaWR4OwotCi0JY21kLmNtZF9pZCA9IFJNX0NNRF9BVURfQ09ERUNfQ0ZHOwotCWNtZC5jbGllbnRfaWQgPSBSTV9BVURfQ0xJRU5UX0lEOwotCWNtZC50YXNrX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuZW5hYmxlID0gUk1UX0RJU0FCTEU7Ci0JY21kLmRlY190eXBlID0gQVVEREVDX0RFQ19QQ007Ci0JY2xpZW50X2lkeCA9ICgoY21kLmNsaWVudF9pZCA8PCA4KSB8IGNtZC50YXNrX2lkKTsKLQotCXJldHVybiBwdXRfYWRzcF9yZXNvdXJjZShjbGllbnRfaWR4LCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgcm10X2dldF9yZXNvdXJjZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRfY29kZWNfY29uZmlnX2NtZCBjbWQ7Ci0JdW5zaWduZWQgc2hvcnQgY2xpZW50X2lkeDsKLQotCWNtZC5jbWRfaWQgPSBSTV9DTURfQVVEX0NPREVDX0NGRzsKLQljbWQuY2xpZW50X2lkID0gUk1fQVVEX0NMSUVOVF9JRDsKLQljbWQudGFza19pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmVuYWJsZSA9IFJNVF9FTkFCTEU7Ci0JY21kLmRlY190eXBlID0gQVVEREVDX0RFQ19QQ007Ci0JY2xpZW50X2lkeCA9ICgoY21kLmNsaWVudF9pZCA8PCA4KSB8IGNtZC50YXNrX2lkKTsKLQotCXJldHVybiBnZXRfYWRzcF9yZXNvdXJjZShjbGllbnRfaWR4LCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRpb19lbmFibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkbWdyX2NvbmZpZyBjZmc7Ci0JaW50IHJjOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JaWYgKGF1ZGlvLT5ybXRfcmVzb3VyY2VfcmVsZWFzZWQgPT0gMSkgewotCQlhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID0gMDsKLQkJcmMgPSBybXRfZ2V0X3Jlc291cmNlKGF1ZGlvKTsKLQkJaWYgKHJjKQotCQkJTU1fRVJSKCJBRFNQIHJlc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZSIpOwotCX0KLQotCWF1ZGlvLT5kZWNfc3RhdGUgPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORTsKLQlhdWRpby0+b3V0X3RhaWwgPSAwOwotCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQotCWNmZy50eF9yYXRlID0gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfTk9ORTsKLQljZmcucnhfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzQ4MDAwOwotCWNmZy5kZWZfbWV0aG9kID0gUlBDX0FVRF9ERUZfTUVUSE9EX1BMQVlCQUNLOwotCWNmZy5jb2RlYyA9IFJQQ19BVURfREVGX0NPREVDX1BDTTsKLQljZmcuc25kX21ldGhvZCA9IFJQQ19TTkRfTUVUSE9EX01JREk7Ci0KLQlyYyA9IGF1ZG1ncl9lbmFibGUoJmF1ZGlvLT5hdWRtZ3IsICZjZmcpOwotCWlmIChyYyA8IDApIHsKLQkJbXNtX2Fkc3BfZHVtcChhdWRpby0+YXVkcGxheSk7Ci0JCXJldHVybiByYzsKLQl9Ci0JaWYgKG1zbV9hZHNwX2VuYWJsZShhdWRpby0+YXVkcGxheSkpIHsKLQkJTU1fRVJSKCJtc21fYWRzcF9lbmFibGUoYXVkcGxheSkgZmFpbGVkXG4iKTsKLQkJYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAoYXVkcHBfZW5hYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvX2RzcF9ldmVudCwgYXVkaW8pKSB7Ci0JCU1NX0VSUigiYXVkcHBfZW5hYmxlKCkgZmFpbGVkXG4iKTsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRpby0+YXVkcGxheSk7Ci0JCWF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JYXVkaW8tPmVuYWJsZWQgPSAxOwotCXJldHVybiAwOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkaW9fZGlzYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWludCByYyA9IDA7Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQlhdWRpby0+ZGVjX3N0YXRlID0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkU7Ci0JCWF1ZGRlY19kc3BfY29uZmlnKGF1ZGlvLCAwKTsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdCwKLQkJCQlhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoTVNNX0FVRF9ERUNPREVSX1dBSVRfTVMpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWVsc2UgaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX0NMT1NFKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQltc21fYWRzcF9kaXNhYmxlKGF1ZGlvLT5hdWRwbGF5KTsKLQkJYXVkcHBfZGlzYWJsZShhdWRpby0+ZGVjX2lkLCBhdWRpbyk7Ci0JCXJjID0gYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQlpZiAocmMgPCAwKQotCQkJbXNtX2Fkc3BfZHVtcChhdWRpby0+YXVkcGxheSk7Ci0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJcm10X3B1dF9yZXNvdXJjZShhdWRpbyk7Ci0JCWF1ZGlvLT5ybXRfcmVzb3VyY2VfcmVsZWFzZWQgPSAxOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZHNwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgYXVkcGxheV9kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgICB2b2lkICgqZ2V0ZXZlbnQpICh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBkYXRhOwotCXVpbnQzMl90IG1zZ1syOF07Ci0JZ2V0ZXZlbnQobXNnLCBzaXplb2YobXNnKSk7Ci0KLQlNTV9EQkcoIm1zZ19pZD0leFxuIiwgaWQpOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUExBWV9NU0dfREVDX05FRURTX0RBVEE6Ci0JCWF1ZHBjbV9hc3luY19zZW5kX2RhdGEoYXVkaW8sIDEpOwotCQlicmVhazsKLQljYXNlIEFEU1BfTUVTU0FHRV9JRDoKLQkJTU1fREJHKCJSZWNlaXZlZCBBRFNQIGV2ZW50OiBtb2R1bGUgZW5hYmxlKGF1ZHBsYXl0YXNrKVxuIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1NX0VSUigidW5leHBlY3RlZCBtZXNzYWdlIGZyb20gZGVjb2RlclxuIik7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fZHNwX2V2ZW50KHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGlkLCB1aW50MTZfdCAqbXNnKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBwcml2YXRlOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUFBfTVNHX1NUQVRVU19NU0c6ewotCQkJdW5zaWduZWQgc3RhdHVzID0gbXNnWzFdOwotCi0JCQlzd2l0Y2ggKHN0YXR1cykgewotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX1NMRUVQOiB7Ci0JCQkJdWludDE2X3QgcmVhc29uID0gbXNnWzJdOwotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IHNsZWVwIHJlYXNvbiA9MHglMDR4XG4iLAotCQkJCQkJcmVhc29uKTsKLQkJCQlpZiAoKHJlYXNvbiA9PSBBVURQUF9NU0dfUkVBU09OX01FTSkKLQkJCQkJCXx8IChyZWFzb24gPT0KLQkJCQkJCUFVRFBQX01TR19SRUFTT05fTk9ERUNPREVSKSkgewotCQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9GQUlMVVJFOwotCQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJfSBlbHNlIGlmIChyZWFzb24gPT0gQVVEUFBfTVNHX1JFQVNPTl9OT05FKSB7Ci0JCQkJCS8qIGRlY29kZXIgaXMgaW4gZGlzYWJsZSBzdGF0ZSAqLwotCQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19JTklUOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IGluaXRcbiIpOwotCQkJCWF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoYXVkaW8pOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfQ0ZHOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IGNmZ1xuIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfUExBWToKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBwbGF5XG4iKTsKLQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1M7Ci0JCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlNTV9FUlIoInVua25vd24gZGVjb2RlciBzdGF0dXNcbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRFBQX01TR19DRkdfTVNHOgotCQlpZiAobXNnWzBdID09IEFVRFBQX01TR19FTkFfRU5BKSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgRU5BQkxFXG4iKTsKLQkJCWF1ZGRlY19kc3BfY29uZmlnKGF1ZGlvLCAxKTsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMTsKLQkJCWF1ZHBwX3NldF92b2x1bWVfYW5kX3BhbihhdWRpby0+ZGVjX2lkLCBhdWRpby0+dm9sdW1lLAotCQkJCQkwKTsKLQkJfSBlbHNlIGlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9ESVMpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBESVNBQkxFXG4iKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiQ0ZHX01TRyAlZD9cbiIsCW1zZ1swXSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfRkxVU0hfQUNLOgotCQlNTV9EQkcoIkZMVVNIX0FDS1xuIik7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURQUF9NU0dfUENNRE1BTUlTU0VEOgotCQlNTV9EQkcoIlBDTURNQU1JU1NFRFxuIik7Ci0JCWF1ZGlvLT50ZW9zID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiVU5LTk9XTiAoJWQpXG4iLCBpZCk7Ci0JfQotCi19Ci0KLQotc3RydWN0IG1zbV9hZHNwX29wcyBhdWRscGFkZWNfYWRzcF9vcHMgPSB7Ci0JLmV2ZW50ID0gYXVkcGxheV9kc3BfZXZlbnQsCi19OwotCi0KLSNkZWZpbmUgYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcGxheSwgYXVkaW8tPnF1ZXVlX2lkLCBcCi0JCQljbWQsIGxlbikKLQotc3RhdGljIGludCBhdWRkZWNfZHNwX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCXUxNiBjZmdfZGVjX2NtZFtBVURQUF9DTURfQ0ZHX0RFQ19UWVBFX0xFTiAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCldOwotCi0JbWVtc2V0KGNmZ19kZWNfY21kLCAwLCBzaXplb2YoY2ZnX2RlY19jbWQpKTsKLQotCWNmZ19kZWNfY21kWzBdID0gQVVEUFBfQ01EX0NGR19ERUNfVFlQRTsKLQlpZiAoZW5hYmxlKQotCQljZmdfZGVjX2NtZFsxICsgYXVkaW8tPmRlY19pZF0gPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCQlBVURQUF9DTURfRU5BX0RFQ19WIHwgQVVEREVDX0RFQ19QQ00gfAotCQkJCUFVRFBQX0NNRF9MUEFfTU9ERTsKLQllbHNlCi0JCWNmZ19kZWNfY21kWzEgKyBhdWRpby0+ZGVjX2lkXSA9IEFVRFBQX0NNRF9VUERBVERFX0NGR19ERUMgfAotCQkJCUFVRFBQX0NNRF9ESVNfREVDX1Y7Ci0KLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTEoJmNmZ19kZWNfY21kLCBzaXplb2YoY2ZnX2RlY19jbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfd2F2IGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNvbW1vbi5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TOwotCWNtZC5jb21tb24ubGVuZ3RoID0gQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNU19XQVZfTEVOOwotCWNtZC5jb21tb24uZGVjX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuY29tbW9uLmlucHV0X3NhbXBsaW5nX2ZyZXF1ZW5jeSA9IGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGU7Ci0JY21kLnN0ZXJlb19jZmcgPSBhdWRpby0+b3V0X2NoYW5uZWxfbW9kZTsKLQljbWQucGNtX3dpZHRoID0gYXVkaW8tPm91dF9iaXRzOwotCWNtZC5zaWduID0gMDsKLQlhdWRwcF9zZW5kX3F1ZXVlMigmY21kLCBzaXplb2YoY21kKSk7Ci19Ci1zdGF0aWMgdm9pZCBhdWRwY21fYXN5bmNfc2VuZF9kYXRhKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVuc2lnbmVkIG5lZWRlZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFhdWRpby0+cnVubmluZykKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCi0JaWYgKG5lZWRlZCAmJiAhYXVkaW8tPndmbHVzaCkgewotCQlhdWRpby0+b3V0X25lZWRlZCA9IDE7Ci0JCWlmIChhdWRpby0+ZHJ2X3N0YXR1cyAmIEFEUlZfU1RBVFVTX09CVUZfR0lWRU4pIHsKLQkJCS8qIHBvcCBvbmUgbm9kZSBvdXQgb2YgcXVldWUgKi8KLQkJCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0JCQlzdHJ1Y3QgYXVkcGNtX2J1ZmZlcl9ub2RlICp1c2VkX2J1ZjsKLQotCQkJTU1fREJHKCJjb25zdW1lZFxuIik7Ci0KLQkJCUJVR19PTihsaXN0X2VtcHR5KCZhdWRpby0+b3V0X3F1ZXVlKSk7Ci0JCQl1c2VkX2J1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5vdXRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZHBjbV9idWZmZXJfbm9kZSwgbGlzdCk7Ci0JCQlsaXN0X2RlbCgmdXNlZF9idWYtPmxpc3QpOwotCQkJcGF5bG9hZC5haW9fYnVmID0gdXNlZF9idWYtPmJ1ZjsKLQkJCWF1ZHBjbV9wb3N0X2V2ZW50KGF1ZGlvLCBBVURJT19FVkVOVF9XUklURV9ET05FLAotCQkJCXBheWxvYWQpOwotCQkJa2ZyZWUodXNlZF9idWYpOwotCQkJYXVkaW8tPmRydl9zdGF0dXMgJj0gfkFEUlZfU1RBVFVTX09CVUZfR0lWRU47Ci0JCX0KLQl9Ci0JaWYgKGF1ZGlvLT5vdXRfbmVlZGVkKSB7Ci0JCXN0cnVjdCBhdWRwY21fYnVmZmVyX25vZGUgKm5leHRfYnVmOwotCQlhdWRwbGF5X2NtZF9iaXRzdHJlYW1fZGF0YV9hdmFpbCBjbWQ7Ci0JCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPm91dF9xdWV1ZSkpIHsKLQkJCW5leHRfYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPm91dF9xdWV1ZSwKLQkJCQkJc3RydWN0IGF1ZHBjbV9idWZmZXJfbm9kZSwgbGlzdCk7Ci0JCQlNTV9EQkcoIm5leHRfYnVmICVwXG4iLCBuZXh0X2J1Zik7Ci0JCQlpZiAobmV4dF9idWYpIHsKLQkJCQlNTV9EQkcoIm5leHQgYnVmIHBoeSAlbHggbGVuICVkXG4iLAotCQkJCW5leHRfYnVmLT5wYWRkciwgbmV4dF9idWYtPmJ1Zi5kYXRhX2xlbik7Ci0KLQkJCQljbWQuY21kX2lkID0gQVVEUExBWV9DTURfQklUU1RSRUFNX0RBVEFfQVZBSUw7Ci0JCQkJaWYgKG5leHRfYnVmLT5idWYuZGF0YV9sZW4pCi0JCQkJCWNtZC5kZWNvZGVyX2lkID0gYXVkaW8tPmRlY19pZDsKLQkJCQllbHNlIHsKLQkJCQkJY21kLmRlY29kZXJfaWQgPSAtMTsKLQkJCQkJTU1fREJHKCJpbnB1dCBFT1Mgc2lnbmFsZWRcbiIpOwotCQkJCX0KLQkJCQljbWQuYnVmX3B0cgk9ICh1bnNpZ25lZCkgbmV4dF9idWYtPnBhZGRyOwotCQkJCWNtZC5idWZfc2l6ZSA9IG5leHRfYnVmLT5idWYuZGF0YV9sZW4gPj4gMTsKLQkJCQljbWQucGFydGl0aW9uX251bWJlcgk9IDA7Ci0JCQkJLyogY29tcGxldGUgd3JpdGVzIHRvIHRoZSBpbnB1dCBidWZmZXIgKi8KLQkJCQl3bWIoKTsKLQkJCQlhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci0JCQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQkJCWF1ZGlvLT5kcnZfc3RhdHVzIHw9IEFEUlZfU1RBVFVTX09CVUZfR0lWRU47Ci0JCQl9Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZGV2aWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgYXVkcGNtX2FzeW5jX2ZsdXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBjbV9idWZmZXJfbm9kZSAqYnVmX25vZGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPm91dF9xdWV1ZSkgewotCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXVkcGNtX2J1ZmZlcl9ub2RlLCBsaXN0KTsKLQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKLQkJcGF5bG9hZC5haW9fYnVmID0gYnVmX25vZGUtPmJ1ZjsKLQkJYXVkcGNtX3Bvc3RfZXZlbnQoYXVkaW8sIEFVRElPX0VWRU5UX1dSSVRFX0RPTkUsCi0JCQkJcGF5bG9hZCk7Ci0JCWtmcmVlKGJ1Zl9ub2RlKTsKLQl9Ci0JYXVkaW8tPmRydl9zdGF0dXMgJj0gfkFEUlZfU1RBVFVTX09CVUZfR0lWRU47Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCWF0b21pY19zZXQoJmF1ZGlvLT5vdXRfYnl0ZXMsIDApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotc3RhdGljIHZvaWQgYXVkaW9faW9wb3J0X3Jlc2V0KHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfQUlPX0lOVEYpIHsKLQkJLyogSWYgZnN5bmMgaXMgaW4gcHJvZ3Jlc3MsIG1ha2Ugc3VyZQotCQkgKiByZXR1cm4gdmFsdWUgb2YgZnN5bmMgaW5kaWNhdGVzCi0JCSAqIGFib3J0IGR1ZSB0byBmbHVzaAotCQkgKi8KLQkJaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfRlNZTkMpIHsKLQkJCU1NX0RCRygiZnN5bmMgaW4gcHJvZ3Jlc3NcbiIpOwotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQkJbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCQkJYXVkcGNtX2FzeW5jX2ZsdXNoKGF1ZGlvKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCQl9IGVsc2UKLQkJCWF1ZHBjbV9hc3luY19mbHVzaChhdWRpbyk7Ci0JfSBlbHNlIHsKLQkJLyogTWFrZSBzdXJlIHJlYWQvd3JpdGUgdGhyZWFkIGFyZSBmcmVlIGZyb20KLQkJICogc2xlZXAgYW5kIGtub3dpbmcgdGhhdCBzeXN0ZW0gaXMgbm90IGFibGUKLQkJICogdG8gcHJvY2VzcyBpbyByZXF1ZXN0IGF0IHRoZSBtb21lbnQKLQkJICovCi0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCQlhdWRwY21fYXN5bmNfZmx1c2goYXVkaW8pOwotCQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcGNtX2V2ZW50c19wZW5kaW5nKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZW1wdHk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQllbXB0eSA9ICFsaXN0X2VtcHR5KCZhdWRpby0+ZXZlbnRfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGVtcHR5IHx8IGF1ZGlvLT5ldmVudF9hYm9ydDsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGNtX3Jlc2V0X2V2ZW50X3F1ZXVlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYXVkcGNtX2V2ZW50ICpkcnZfZXZ0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQlzdHJ1Y3QgYXVkcGNtX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCXN0cnVjdCBhdWRwY21fZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgbG9uZyBhdWRwY21fcHJvY2Vzc19ldmVudF9yZXEoc3RydWN0IGF1ZGlvICphdWRpbywgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlsb25nIHJjOwotCXN0cnVjdCBtc21fYXVkaW9fZXZlbnQgdXNyX2V2dDsKLQlzdHJ1Y3QgYXVkcGNtX2V2ZW50ICpkcnZfZXZ0ID0gTlVMTDsKLQlpbnQgdGltZW91dDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ1c3JfZXZ0LCBhcmcsIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JdGltZW91dCA9IChpbnQpIHVzcl9ldnQudGltZW91dF9tczsKLQotCWlmICh0aW1lb3V0ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAotCQkJYXVkaW8tPmV2ZW50X3dhaXQsIGF1ZHBjbV9ldmVudHNfcGVuZGluZyhhdWRpbyksCi0JCQltc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9IGVsc2UgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCWF1ZGlvLT5ldmVudF93YWl0LCBhdWRwY21fZXZlbnRzX3BlbmRpbmcoYXVkaW8pKTsKLQl9Ci0KLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoYXVkaW8tPmV2ZW50X2Fib3J0KSB7Ci0JCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDA7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmV2ZW50X3F1ZXVlKSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmV2ZW50X3F1ZXVlLAotCQkJc3RydWN0IGF1ZHBjbV9ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQl9Ci0JaWYgKGRydl9ldnQpIHsKLQkJdXNyX2V2dC5ldmVudF90eXBlID0gZHJ2X2V2dC0+ZXZlbnRfdHlwZTsKLQkJdXNyX2V2dC5ldmVudF9wYXlsb2FkID0gZHJ2X2V2dC0+cGF5bG9hZDsKLQkJbGlzdF9hZGRfdGFpbCgmZHJ2X2V2dC0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQl9IGVsc2UKLQkJcmMgPSAtMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGRydl9ldnQgJiYgZHJ2X2V2dC0+ZXZlbnRfdHlwZSA9PSBBVURJT19FVkVOVF9XUklURV9ET05FKSB7Ci0JCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQkJYXVkbHBhX2lvbl9maXh1cChhdWRpbywgZHJ2X2V2dC0+cGF5bG9hZC5haW9fYnVmLmJ1Zl9hZGRyLAotCQkJCSAgZHJ2X2V2dC0+cGF5bG9hZC5haW9fYnVmLmJ1Zl9sZW4sIDApOwotCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQl9Ci0JaWYgKCFyYyAmJiBjb3B5X3RvX3VzZXIoYXJnLCAmdXNyX2V2dCwgc2l6ZW9mKHVzcl9ldnQpKSkKLQkJcmMgPSAtRUZBVUxUOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGxwYV9pb25fY2hlY2soc3RydWN0IGF1ZGlvICphdWRpbywKLQkJdm9pZCAqdmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQotewotCXN0cnVjdCBhdWRscGFfaW9uX3JlZ2lvbiAqcmVnaW9uX2VsdDsKLQlzdHJ1Y3QgYXVkbHBhX2lvbl9yZWdpb24gdCA9IHsudmFkZHIgPSB2YWRkciwgLmxlbiA9IGxlbiB9OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZWdpb25fZWx0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUsIGxpc3QpIHsKLQkJaWYgKENPTlRBSU5TKHJlZ2lvbl9lbHQsICZ0KSB8fCBDT05UQUlOUygmdCwgcmVnaW9uX2VsdCkgfHwKLQkJICAgIE9WRVJMQVBTKHJlZ2lvbl9lbHQsICZ0KSkgewotCQkJTU1fRVJSKCJbJXBdOnJlZ2lvbiAodmFkZHIgJXAgbGVuICVsZCkiCi0JCQkJIiBjbGFzaGVzIHdpdGggcmVnaXN0ZXJlZCByZWdpb24iCi0JCQkJIiAodmFkZHIgJXAgcGFkZHIgJXAgbGVuICVsZClcbiIsCi0JCQkJYXVkaW8sIHZhZGRyLCBsZW4sCi0JCQkJcmVnaW9uX2VsdC0+dmFkZHIsCi0JCQkJKHZvaWQgKilyZWdpb25fZWx0LT5wYWRkciwgcmVnaW9uX2VsdC0+bGVuKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50IGF1ZGxwYV9pb25fYWRkKHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX2lvbl9pbmZvICppbmZvKQotewotCWlvbl9waHlzX2FkZHJfdCBwYWRkcjsKLQlzaXplX3QgbGVuOwotCXVuc2lnbmVkIGxvbmcga3ZhZGRyOwotCXN0cnVjdCBhdWRscGFfaW9uX3JlZ2lvbiAqcmVnaW9uOwotCWludCByYyA9IC1FSU5WQUw7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZTsKLQl1bnNpZ25lZCBsb25nIGlvbmZsYWc7Ci0KLQlNTV9FUlIoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCXJlZ2lvbiA9IGttYWxsb2Moc2l6ZW9mKCpyZWdpb24pLCBHRlBfS0VSTkVMKTsKLQotCWlmICghcmVnaW9uKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlbmQ7Ci0JfQotCWhhbmRsZSA9IGlvbl9pbXBvcnRfZG1hX2J1ZihhdWRpby0+Y2xpZW50LCBpbmZvLT5mZCk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGhhbmRsZSkpIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBoYW5kbGUgb2YgdGhlIGdpdmVuIGZkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gaW1wb3J0X2Vycm9yOwotCX0KLQlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSwgJmlvbmZsYWcpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGZsYWdzIGZvciB0aGUgaGFuZGxlXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmxhZ19lcnJvcjsKLQl9Ci0Ja3ZhZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9uX21hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgaGFuZGxlKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoKHZvaWQgKilrdmFkZHIpKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgdmlydHVhbCBhZGRyZXNzXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gbWFwX2Vycm9yOwotCX0KLQlyYyA9IGlvbl9waHlzKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSwgJnBhZGRyLCAmbGVuKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBwaHlzaWNhbCBhZGRyZXNzXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gaW9uX2Vycm9yOwotCX0KLQlyYyA9IGF1ZGxwYV9pb25fY2hlY2soYXVkaW8sIGluZm8tPnZhZGRyLCBsZW4pOwotCWlmIChyYyA8IDApIHsKLQkJTU1fRVJSKCJhdWRwY21faW9uX2NoZWNrIGZhaWxlZFxuIik7Ci0JCWdvdG8gaW9uX2Vycm9yOwotCX0KLQlyZWdpb24tPmhhbmRsZSA9IGhhbmRsZTsKLQlyZWdpb24tPnZhZGRyID0gaW5mby0+dmFkZHI7Ci0JcmVnaW9uLT5mZCA9IGluZm8tPmZkOwotCXJlZ2lvbi0+cGFkZHIgPSBwYWRkcjsKLQlyZWdpb24tPmt2YWRkciA9IGt2YWRkcjsKLQlyZWdpb24tPmxlbiA9IGxlbjsKLQlyZWdpb24tPnJlZl9jbnQgPSAwOwotCU1NX0RCRygiWyVwXTphZGQgcmVnaW9uIHBhZGRyICVseCB2YWRkciAlcCwgbGVuICVsdSBrdmFkZHIgJWx4XG4iLAotCQlhdWRpbywgcmVnaW9uLT5wYWRkciwgcmVnaW9uLT52YWRkciwKLQkJcmVnaW9uLT5sZW4sIHJlZ2lvbi0+a3ZhZGRyKTsKLQlsaXN0X2FkZF90YWlsKCZyZWdpb24tPmxpc3QsICZhdWRpby0+aW9uX3JlZ2lvbl9xdWV1ZSk7Ci0KLQlyZXR1cm4gcmM7Ci0KLWlvbl9lcnJvcjoKLQlpb25fdW5tYXBfa2VybmVsKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci1tYXBfZXJyb3I6Ci1mbGFnX2Vycm9yOgotCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci1pbXBvcnRfZXJyb3I6Ci0Ja2ZyZWUocmVnaW9uKTsKLWVuZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkbHBhX2lvbl9yZW1vdmUoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJCXN0cnVjdCBtc21fYXVkaW9faW9uX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IGF1ZGxwYV9pb25fcmVnaW9uICpyZWdpb247Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5pb25fcmVnaW9uX3F1ZXVlKSB7Ci0JCXJlZ2lvbiA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXVkbHBhX2lvbl9yZWdpb24sIGxpc3QpOwotCi0JCWlmIChyZWdpb24gIT0gTlVMTCAmJiAocmVnaW9uLT5mZCA9PSBpbmZvLT5mZCkgJiYKLQkJICAgIChyZWdpb24tPnZhZGRyID09IGluZm8tPnZhZGRyKSkgewotCQkJaWYgKHJlZ2lvbi0+cmVmX2NudCkgewotCQkJCU1NX0RCRygiJXNbJXBdOnJlZ2lvbiAlcCBpbiB1c2UgcmVmX2NudCAlZFxuIiwKLQkJCQkJX19mdW5jX18sIGF1ZGlvLCByZWdpb24sCi0JCQkJCXJlZ2lvbi0+cmVmX2NudCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlNTV9EQkcoInJlbW92ZSByZWdpb24gZmQgJWQgdmFkZHIgJXBcbiIsCi0JCQkJaW5mby0+ZmQsIGluZm8tPnZhZGRyKTsKLQkJCWxpc3RfZGVsKCZyZWdpb24tPmxpc3QpOwotCQkJaW9uX3VubWFwX2tlcm5lbChhdWRpby0+Y2xpZW50LCByZWdpb24tPmhhbmRsZSk7Ci0JCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCByZWdpb24tPmhhbmRsZSk7Ci0JCQlrZnJlZShyZWdpb24pOwotCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkbHBhX2lvbl9sb29rdXBfdmFkZHIoc3RydWN0IGF1ZGlvICphdWRpbywgdm9pZCAqYWRkciwKLQkJCXVuc2lnbmVkIGxvbmcgbGVuLCBzdHJ1Y3QgYXVkbHBhX2lvbl9yZWdpb24gKipyZWdpb24pCi17Ci0Jc3RydWN0IGF1ZGxwYV9pb25fcmVnaW9uICpyZWdpb25fZWx0OwotCWludCBtYXRjaF9jb3VudCA9IDA7Ci0JKnJlZ2lvbiA9IE5VTEw7Ci0KLQkvKiByZXR1cm5zIHBoeXNpY2FsIGFkZHJlc3Mgb3IgemVybyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkocmVnaW9uX2VsdCwgJmF1ZGlvLT5pb25fcmVnaW9uX3F1ZXVlLCBsaXN0KSB7Ci0JCWlmIChhZGRyID49IHJlZ2lvbl9lbHQtPnZhZGRyICYmCi0JCSAgICBhZGRyIDwgcmVnaW9uX2VsdC0+dmFkZHIgKyByZWdpb25fZWx0LT5sZW4gJiYKLQkJICAgIGFkZHIgKyBsZW4gPD0gcmVnaW9uX2VsdC0+dmFkZHIgKyByZWdpb25fZWx0LT5sZW4pIHsKLQkJCS8qIG9mZnNldCBzaW5jZSB3ZSBjb3VsZCBwYXNzIHZhZGRyIGluc2lkZSBhIHJlZ2lzdGVyZAotCQkJICogaW9uIGJ1ZmZlcgotCQkJICovCi0KLQkJCW1hdGNoX2NvdW50Kys7Ci0JCQlpZiAoISpyZWdpb24pCi0JCQkJKnJlZ2lvbiA9IHJlZ2lvbl9lbHQ7Ci0JCX0KLQl9Ci0KLQlpZiAobWF0Y2hfY291bnQgPiAxKSB7Ci0JCU1NX0VSUigiJXNbJXBdOm11bHRpcGxlIGhpdHMgZm9yIHZhZGRyICVwLCBsZW4gJWxkXG4iLAotCQkJIF9fZnVuY19fLCBhdWRpbywgYWRkciwgbGVuKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZWdpb25fZWx0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUsCi0JCQkJCWxpc3QpIHsKLQkJCWlmIChhZGRyID49IHJlZ2lvbl9lbHQtPnZhZGRyICYmCi0JCQlhZGRyIDwgcmVnaW9uX2VsdC0+dmFkZHIgKyByZWdpb25fZWx0LT5sZW4gJiYKLQkJCWFkZHIgKyBsZW4gPD0gcmVnaW9uX2VsdC0+dmFkZHIgKyByZWdpb25fZWx0LT5sZW4pCi0JCQkJCU1NX0VSUigiXHQlc1slcF06JXAsICVsZCAtLT4gJXBcbiIsCi0JCQkJCQlfX2Z1bmNfXywgYXVkaW8sCi0JCQkJCQlyZWdpb25fZWx0LT52YWRkciwKLQkJCQkJCXJlZ2lvbl9lbHQtPmxlbiwKLQkJCQkJCSh2b2lkICopcmVnaW9uX2VsdC0+cGFkZHIpOwotCQl9Ci0JfQotCXJldHVybiAqcmVnaW9uID8gMCA6IC0xOwotfQotc3RhdGljIHVuc2lnbmVkIGxvbmcgYXVkbHBhX2lvbl9maXh1cChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB2b2lkICphZGRyLAotCQkgICAgdW5zaWduZWQgbG9uZyBsZW4sIGludCByZWZfdXApCi17Ci0Jc3RydWN0IGF1ZGxwYV9pb25fcmVnaW9uICpyZWdpb247Ci0JdW5zaWduZWQgbG9uZyBwYWRkcjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYXVkbHBhX2lvbl9sb29rdXBfdmFkZHIoYXVkaW8sIGFkZHIsIGxlbiwgJnJlZ2lvbik7Ci0JaWYgKHJldCkgewotCQlNTV9FUlIoIiVzWyVwXTpsb29rdXAgKCVwLCAlbGQpIGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fLCBhdWRpbywgYWRkciwgbGVuKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChyZWZfdXApCi0JCXJlZ2lvbi0+cmVmX2NudCsrOwotCWVsc2UKLQkJcmVnaW9uLT5yZWZfY250LS07Ci0JTU1fREJHKCJmb3VuZCByZWdpb24gJXAgcmVmX2NudCAlZFxuIiwgcmVnaW9uLCByZWdpb24tPnJlZl9jbnQpOwotCXBhZGRyID0gcmVnaW9uLT5wYWRkciArIChhZGRyIC0gcmVnaW9uLT52YWRkcik7Ci0JcmV0dXJuIHBhZGRyOwotfQotCi0vKiBhdWRpbyAtPiBsb2NrIG11c3QgYmUgaGVsZCBhdCB0aGlzIHBvaW50ICovCi1zdGF0aWMgaW50IGF1ZGxwYV9haW9fYnVmX2FkZChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBkaXIsCi0Jdm9pZCBfX3VzZXIgKmFyZykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBhdWRwY21fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlOwotCi0JYnVmX25vZGUgPSBrbWFsbG9jKHNpemVvZigqYnVmX25vZGUpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghYnVmX25vZGUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZidWZfbm9kZS0+YnVmLCBhcmcsIHNpemVvZihidWZfbm9kZS0+YnVmKSkpIHsKLQkJa2ZyZWUoYnVmX25vZGUpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlNTV9EQkcoIm5vZGUgJXAgZGlyICV4IGJ1Zl9hZGRyICVwIGJ1Zl9sZW4gJWQgZGF0YV9sZW4iCi0JCQkiJWRcbiIsIGJ1Zl9ub2RlLCBkaXIsCi0JCQlidWZfbm9kZS0+YnVmLmJ1Zl9hZGRyLCBidWZfbm9kZS0+YnVmLmJ1Zl9sZW4sCi0JCQlidWZfbm9kZS0+YnVmLmRhdGFfbGVuKTsKLQotCWJ1Zl9ub2RlLT5wYWRkciA9IGF1ZGxwYV9pb25fZml4dXAoCi0JCWF1ZGlvLCBidWZfbm9kZS0+YnVmLmJ1Zl9hZGRyLAotCQlidWZfbm9kZS0+YnVmLmJ1Zl9sZW4sIDEpOwotCWlmIChkaXIpIHsKLQkJLyogd3JpdGUgKi8KLQkJaWYgKCFidWZfbm9kZS0+cGFkZHIgfHwKLQkJICAgIChidWZfbm9kZS0+cGFkZHIgJiAweDEpIHx8Ci0JCSAgICAoYnVmX25vZGUtPmJ1Zi5kYXRhX2xlbiAmIDB4MSkpIHsKLQkJCWtmcmVlKGJ1Zl9ub2RlKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsICZhdWRpby0+b3V0X3F1ZXVlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZHBjbV9hc3luY19zZW5kX2RhdGEoYXVkaW8sIDApOwotCX0KLQlNTV9EQkcoIkFkZCBidWZfbm9kZSAlcCBwYWRkciAlbHhcbiIsIGJ1Zl9ub2RlLCBidWZfbm9kZS0+cGFkZHIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIGF1ZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoImNtZCA9ICVkXG4iLCBjbWQpOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfU1RBVFMpIHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyBzdGF0czsKLQkJc3RhdHMuYnl0ZV9jb3VudCA9IGF1ZHBwX2F2c3luY19ieXRlX2NvdW50KGF1ZGlvLT5kZWNfaWQpOwotCQlzdGF0cy5zYW1wbGVfY291bnQgPSBhdWRwcF9hdnN5bmNfc2FtcGxlX2NvdW50KGF1ZGlvLT5kZWNfaWQpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGNtZCA9PSBBVURJT19TRVRfVk9MVU1FKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQotCQlhdWRpby0+dm9sdW1lID0gTVNNX1ZPTFVNRV9TVEVQICogYXJnOwotCQlhdWRpby0+dm9sdW1lIC89IE1TTV9WT0xVTUVfRkFDVE9SOwotCi0JCWlmIChhdWRpby0+dm9sdW1lID4gTVNNX01BWF9WT0xVTUUpCi0JCQlhdWRpby0+dm9sdW1lID0gTVNNX01BWF9WT0xVTUU7Ci0KLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfc2V0X3ZvbHVtZV9hbmRfcGFuKGF1ZGlvLT5kZWNfaWQsCi0JCQlhdWRpby0+dm9sdW1lLCAwKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoY21kID09IEFVRElPX0dFVF9FVkVOVCkgewotCQlNTV9EQkcoIkFVRElPX0dFVF9FVkVOVFxuIik7Ci0JCWlmIChtdXRleF90cnlsb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spKSB7Ci0JCQlyYyA9IGF1ZHBjbV9wcm9jZXNzX2V2ZW50X3JlcShhdWRpbywKLQkJCQkodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQkJfSBlbHNlCi0JCQlyYyA9IC1FQlVTWTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmIChjbWQgPT0gQVVESU9fQUJPUlRfR0VUX0VWRU5UKSB7Ci0JCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDoKLQkJTU1fREJHKCJBVURJT19TVEFSVFxuIik7Ci0JCXJjID0gYXVkaW9fZW5hYmxlKGF1ZGlvKTsKLQkJaWYgKCFyYykgewotCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdCwKLQkJCQlhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoTVNNX0FVRF9ERUNPREVSX1dBSVRfTVMpKTsKLQkJCU1NX0lORk8oImRlY19zdGF0ZSAlZCByYyA9ICVkXG4iLCBhdWRpby0+ZGVjX3N0YXRlLCByYyk7Ci0KLQkJCWlmIChhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9TVUNDRVNTKQotCQkJCXJjID0gLUVOT0RFVjsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TVE9QOgotCQlNTV9EQkcoIkFVRElPX1NUT1BcbiIpOwotCQlyYyA9IGF1ZGlvX2Rpc2FibGUoYXVkaW8pOwotCQlhdWRpb19pb3BvcnRfcmVzZXQoYXVkaW8pOwotCQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fRkxVU0g6Ci0JCU1NX0RCRygiQVVESU9fRkxVU0hcbiIpOwotCQlhdWRpby0+d2ZsdXNoID0gMTsKLQkJYXVkaW9faW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCQlhdWRwcF9mbHVzaChhdWRpby0+ZGVjX2lkKTsKLQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCSFhdWRpby0+d2ZsdXNoKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlNTV9FUlIoIkFVRElPX0ZMVVNIIGludGVycnVwdGVkXG4iKTsKLQkJCQlyYyA9IC1FSU5UUjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb25maWcsICh2b2lkICopIGFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29uZmlnLmNoYW5uZWxfY291bnQgPT0gMSkgewotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSBBVURQUF9DTURfUENNX0lOVEZfTU9OT19WOwotCQl9IGVsc2UgaWYgKGNvbmZpZy5jaGFubmVsX2NvdW50ID09IDIpIHsKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gQVVEUFBfQ01EX1BDTV9JTlRGX1NURVJFT19WOwotCQl9IGVsc2UgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvbmZpZy5iaXRzID09IDgpCi0JCQljb25maWcuYml0cyA9IEFVRFBQX0NNRF9XQVZfUENNX1dJRFRIXzg7Ci0JCWVsc2UgaWYgKGNvbmZpZy5iaXRzID09IDE2KQotCQkJY29uZmlnLmJpdHMgPSBBVURQUF9DTURfV0FWX1BDTV9XSURUSF8xNjsKLQkJZWxzZSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlhdWRpby0+b3V0X3NhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotCQlhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9IGNvbmZpZy5jaGFubmVsX2NvdW50OwotCQlhdWRpby0+b3V0X2JpdHMgPSBjb25maWcuYml0czsKLQkJYXVkaW8tPmJ1ZmZlcl9jb3VudCA9IGNvbmZpZy5idWZmZXJfY291bnQ7Ci0JCWF1ZGlvLT5idWZmZXJfc2l6ZSA9IGNvbmZpZy5idWZmZXJfc2l6ZTsKLQkJTU1fREJHKCJBVURJT19TRVRfQ09ORklHXG4iKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjb25maWc7Ci0JCWNvbmZpZy5idWZmZXJfY291bnQgPSBhdWRpby0+YnVmZmVyX2NvdW50OwotCQljb25maWcuYnVmZmVyX3NpemUgPSBhdWRpby0+YnVmZmVyX3NpemU7Ci0JCWNvbmZpZy5zYW1wbGVfcmF0ZSA9IGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGU7Ci0JCWlmIChhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9PSBBVURQUF9DTURfUENNX0lOVEZfTU9OT19WKQotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSAxOwotCQllbHNlCi0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IDI7Ci0JCWlmIChhdWRpby0+b3V0X2JpdHMgPT0gQVVEUFBfQ01EX1dBVl9QQ01fV0lEVEhfOCkKLQkJCWNvbmZpZy5iaXRzID0gODsKLQkJZWxzZSBpZiAoYXVkaW8tPm91dF9iaXRzID09IEFVRFBQX0NNRF9XQVZfUENNX1dJRFRIXzE2KQotCQkJY29uZmlnLmJpdHMgPSAxNjsKLQkJZWxzZQotCQkJY29uZmlnLmJpdHMgPSAxNjsKLQkJY29uZmlnLnVudXNlZFswXSA9IDA7Ci0JCWNvbmZpZy51bnVzZWRbMV0gPSAwOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmY29uZmlnLCBzaXplb2YoY29uZmlnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJTU1fREJHKCJBVURJT19HRVRfQ09ORklHXG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0KLQljYXNlIEFVRElPX1BBVVNFOgotCQlNTV9EQkcoIkFVRElPX1BBVVNFICVsZFxuIiwgYXJnKTsKLQkJcmMgPSBhdWRwcF9wYXVzZShhdWRpby0+ZGVjX2lkLCAoaW50KSBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fUkVHSVNURVJfSU9OOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9faW9uX2luZm8gaW5mbzsKLQkJTU1fRVJSKCJBVURJT19SRUdJU1RFUl9JT05cbiIpOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCAodm9pZCAqKSBhcmcsIHNpemVvZihpbmZvKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJZWxzZQotCQkJCXJjID0gYXVkbHBhX2lvbl9hZGQoYXVkaW8sICZpbmZvKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQljYXNlIEFVRElPX0RFUkVHSVNURVJfSU9OOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9faW9uX2luZm8gaW5mbzsKLQkJTU1fRVJSKCJBVURJT19ERVJFR0lTVEVSX0lPTlxuIik7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sICh2b2lkICopIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQllbHNlCi0JCQkJcmMgPSBhdWRscGFfaW9uX3JlbW92ZShhdWRpbywgJmluZm8pOwotCQkJYnJlYWs7Ci0JCX0KLQotCWNhc2UgQVVESU9fQVNZTkNfV1JJVEU6Ci0JCWlmIChhdWRpby0+ZHJ2X3N0YXR1cyAmIEFEUlZfU1RBVFVTX0ZTWU5DKQotCQkJcmMgPSAtRUJVU1k7Ci0JCWVsc2UKLQkJCXJjID0gYXVkbHBhX2Fpb19idWZfYWRkKGF1ZGlvLCAxLCAodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX0FTWU5DX1JFQUQ6Ci0JCU1NX0VSUigiQVVESU9fQVNZTkNfUkVBRCBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJcmMgPSAtRVBFUk07Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIE9ubHkgdXNlZnVsIGluIHR1bm5lbC1tb2RlICovCi1pbnQgYXVkbHBhX2FzeW5jX2ZzeW5jKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQkvKiBCbG9ja2luZyBjbGllbnQgc2VuZHMgbW9yZSBkYXRhICovCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGlvLT5kcnZfc3RhdHVzIHw9IEFEUlZfU1RBVFVTX0ZTWU5DOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCS8qIHBjbSBkbWFtaXNzIG1lc3NhZ2UgaXMgc2VudCBjb250aW5vdXNseQotCSAqIHdoZW4gZGVjb2RlciBpcyBzdGFydmVkIHNvIG5vIHJhY2UKLQkgKiBjb25kaXRpb24gY29uY2VybgotCSAqLwotCWF1ZGlvLT50ZW9zID0gMDsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoYXVkaW8tPnRlb3MgJiYgYXVkaW8tPm91dF9uZWVkZWQgJiYKLQkJbGlzdF9lbXB0eSgmYXVkaW8tPm91dF9xdWV1ZSkpCi0JCXx8IGF1ZGlvLT53Zmx1c2ggfHwgYXVkaW8tPnN0b3BwZWQpOwotCi0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpCi0JCXJjID0gLUVCVVNZOwotCi0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGlvLT5kcnZfc3RhdHVzICY9IH5BRFJWX1NUQVRVU19GU1lOQzsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQotCXJldHVybiByYzsKLX0KLQotaW50IGF1ZGxwYV9zeW5jX2ZzeW5jKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKCFhdWRpby0+b3V0WzBdLnVzZWQgJiYKLQkJIWF1ZGlvLT5vdXRbMV0udXNlZCAmJgotCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChhdWRpby0+cmVzZXJ2ZWQpIHsKLQkJTU1fREJHKCJzZW5kIHJlc2VydmVkIGJ5dGVcbiIpOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMF0gPSBhdWRpby0+cnN2X2J5dGU7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMV0gPSAwOwotCQlmcmFtZS0+dXNlZCA9IDI7Ci0JCWF1ZHBjbV9hc3luY19zZW5kX2RhdGEoYXVkaW8sIDApOwotCi0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJKCFhdWRpby0+b3V0WzBdLnVzZWQgJiYKLQkJCSFhdWRpby0+b3V0WzFdLnVzZWQgJiYKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkKSB8fCBhdWRpby0+d2ZsdXNoKTsKLQotCQlpZiAocmMgPCAwKQotCQkJZ290byBkb25lOwotCQllbHNlIGlmIChhdWRpby0+d2ZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCS8qIHBjbSBkbWFtaXNzIG1lc3NhZ2UgaXMgc2VudCBjb250aW5vdXNseQotCSAqIHdoZW4gZGVjb2RlciBpcyBzdGFydmVkIHNvIG5vIHJhY2UKLQkgKiBjb25kaXRpb24gY29uY2VybgotCSAqLwotCWF1ZGlvLT50ZW9zID0gMDsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQlhdWRpby0+dGVvcyB8fCBhdWRpby0+d2ZsdXNoKTsKLQotCWlmIChhdWRpby0+d2ZsdXNoKQotCQlyYyA9IC1FQlVTWTsKLQotZG9uZToKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBhdWRscGFfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBhLCBsb2ZmX3QgYiwKLQlpbnQgZGF0YXN5bmMpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCWlmICghYXVkaW8tPnJ1bm5pbmcpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIGF1ZGxwYV9hc3luY19mc3luYyhhdWRpbyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBjbV9yZXNldF9pb25fcmVnaW9uKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZGxwYV9pb25fcmVnaW9uICpyZWdpb247Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhdWRpby0+aW9uX3JlZ2lvbl9xdWV1ZSkgewotCQlyZWdpb24gPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGF1ZGxwYV9pb25fcmVnaW9uLCBsaXN0KTsKLQkJbGlzdF9kZWwoJnJlZ2lvbi0+bGlzdCk7Ci0JCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgcmVnaW9uLT5oYW5kbGUpOwotCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCByZWdpb24tPmhhbmRsZSk7Ci0JCWtmcmVlKHJlZ2lvbik7Ci0JfQotCi0JcmV0dXJuOwotfQotc3RhdGljIGludCBhdWRpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlNTV9EQkcoImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBmcmVlaW5nXG4iLCAoaW50KWF1ZGlvKTsKLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkaW9fZGlzYWJsZShhdWRpbyk7Ci0JaWYgKGF1ZGlvLT5ybXRfcmVzb3VyY2VfcmVsZWFzZWQgPT0gMCkKLQkJcm10X3B1dF9yZXNvdXJjZShhdWRpbyk7Ci0JYXVkcGNtX2FzeW5jX2ZsdXNoKGF1ZGlvKTsKLQlhdWRwY21fcmVzZXRfaW9uX3JlZ2lvbihhdWRpbyk7Ci0KLQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHBsYXkpOwotCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCXVucmVnaXN0ZXJfZWFybHlfc3VzcGVuZCgmYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUpOwotI2VuZGlmCi0JYXVkaW8tPm9wZW5lZCA9IDA7Ci0JYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0JYXVkcGNtX3Jlc2V0X2V2ZW50X3F1ZXVlKGF1ZGlvKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlpZiAoYXVkaW8tPmRlbnRyeSkKLQkJZGVidWdmc19yZW1vdmUoYXVkaW8tPmRlbnRyeSk7Ci0jZW5kaWYKLQlpb25fY2xpZW50X2Rlc3Ryb3koYXVkaW8tPmNsaWVudCk7Ci0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwY21fcG9zdF9ldmVudChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkKQotewotCXN0cnVjdCBhdWRwY21fZXZlbnQgKmVfbm9kZSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSkpIHsKLQkJZV9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUsCi0JCQlzdHJ1Y3QgYXVkcGNtX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmVfbm9kZS0+bGlzdCk7Ci0JfSBlbHNlIHsKLQkJZV9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZHBjbV9ldmVudCksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWVfbm9kZSkgewotCQkJTU1fRVJSKCJObyBtZW0gdG8gcG9zdCBldmVudCAlZFxuIiwgdHlwZSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JZV9ub2RlLT5ldmVudF90eXBlID0gdHlwZTsKLQllX25vZGUtPnBheWxvYWQgPSBwYXlsb2FkOwotCi0JbGlzdF9hZGRfdGFpbCgmZV9ub2RlLT5saXN0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLX0KLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdGF0aWMgdm9pZCBhdWRwY21fc3VzcGVuZChzdHJ1Y3QgZWFybHlfc3VzcGVuZCAqaCkKLXsKLQlzdHJ1Y3QgYXVkcGNtX3N1c3BlbmRfY3RsICpjdGwgPQotCQljb250YWluZXJfb2YoaCwgc3RydWN0IGF1ZHBjbV9zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkcGNtX3Bvc3RfZXZlbnQoY3RsLT5hdWRpbywgQVVESU9fRVZFTlRfU1VTUEVORCwgcGF5bG9hZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBjbV9yZXN1bWUoc3RydWN0IGVhcmx5X3N1c3BlbmQgKmgpCi17Ci0Jc3RydWN0IGF1ZHBjbV9zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWRwY21fc3VzcGVuZF9jdGwsIG5vZGUpOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWF1ZHBjbV9wb3N0X2V2ZW50KGN0bC0+YXVkaW8sIEFVRElPX0VWRU5UX1JFU1VNRSwgcGF5bG9hZCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIHNzaXplX3QgYXVkcGNtX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkcGNtX2RlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNvbnN0IGludCBkZWJ1Z19idWZtYXggPSA0MDk2OwotCXN0YXRpYyBjaGFyIGJ1ZmZlcls0MDk2XTsKLQlpbnQgbiA9IDA7Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQluID0gc2NucHJpbnRmKGJ1ZmZlciwgZGVidWdfYnVmbWF4LCAib3BlbmVkICVkXG4iLCBhdWRpby0+b3BlbmVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJlbmFibGVkICVkXG4iLCBhdWRpby0+ZW5hYmxlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAic3RvcHBlZCAlZFxuIiwgYXVkaW8tPnN0b3BwZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dF9idWZfc3ogJWRcbiIsIGF1ZGlvLT5vdXRbMF0uc2l6ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAidm9sdW1lICVseFxuIiwgYXVkaW8tPnZvbHVtZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAic2FtcGxlIHJhdGUgJWRcbiIsIGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCSJjaGFubmVsIG1vZGUgJWRcbiIsIGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkvKiBGb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBvbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHdoZW4KLQkgKiB3aGVuIHBsYXliYWNrIGhhbHRzIHVuZXhwZWN0ZWRseS4gVGh1cywgbm8gbXV0dWFsIGV4Y2x1c2lvbgotCSAqIGVuZm9yY2VkCi0JICovCi0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAid2ZsdXNoICVkXG4iLCBhdWRpby0+d2ZsdXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJydW5uaW5nICVkXG4iLCBhdWRpby0+cnVubmluZyk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkiZGVjIHN0YXRlICVkXG4iLCBhdWRpby0+ZGVjX3N0YXRlKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfbmVlZGVkICVkXG4iLCBhdWRpby0+b3V0X25lZWRlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0X2hlYWQgJWRcbiIsIGF1ZGlvLT5vdXRfaGVhZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0X3RhaWwgJWRcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0WzBdLnVzZWQgJWRcbiIsIGF1ZGlvLT5vdXRbMF0udXNlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0WzFdLnVzZWQgJWRcbiIsIGF1ZGlvLT5vdXRbMV0udXNlZCk7Ci0JYnVmZmVyW25dID0gMDsKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkcGNtX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWRwY21fZGVidWdfcmVhZCwKLQkub3BlbiA9IGF1ZHBjbV9kZWJ1Z19vcGVuLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IE5VTEw7Ci0JaW50IHJjLCBpLCBkZWNfYXR0cmIsIGRlY2lkOwotCXN0cnVjdCBhdWRwY21fZXZlbnQgKmVfbm9kZSA9IE5VTEw7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9scGFfIiArIDVdOwotI2VuZGlmCi0KLQkvKiBBbGxvY2F0ZSBhdWRpbyBpbnN0YW5jZSwgc2V0IHRvIHplcm8gKi8KLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpbyksIEdGUF9LRVJORUwpOwotCWlmICghYXVkaW8pIHsKLQkJTU1fRVJSKCJubyBtZW1vcnkgdG8gYWxsb2NhdGUgYXVkaW8gaW5zdGFuY2VcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JTU1fREJHKCJhdWRpbyBpbnN0YW5jZSAweCUwOHggY3JlYXRlZFxuIiwgKGludClhdWRpbyk7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgZGVjb2RlciAqLwotCWRlY19hdHRyYiA9IEFVRERFQ19ERUNfUENNOwotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCU1NX0VSUigiTm9uLVR1bm5lbGVkIG1vZGUgbm90IHN1cHBvcnRlZFxuIik7Ci0JCXJjID0gLUVQRVJNOwotCQlrZnJlZShhdWRpbyk7Ci0JCWdvdG8gZG9uZTsKLQl9IGVsc2UKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9UVU5ORUw7Ci0KLQlkZWNpZCA9IGF1ZHBwX2FkZWNfYWxsb2MoZGVjX2F0dHJiLCAmYXVkaW8tPm1vZHVsZV9uYW1lLAotCQkJJmF1ZGlvLT5xdWV1ZV9pZCk7Ci0JaWYgKGRlY2lkIDwgMCkgewotCQlNTV9FUlIoIk5vIGZyZWUgZGVjb2RlciBhdmFpbGFibGVcbiIpOwotCQlyYyA9IC1FTk9ERVY7Ci0JCU1NX0RCRygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGZyZWVpbmdcbiIsIChpbnQpYXVkaW8pOwotCQlrZnJlZShhdWRpbyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYXVkaW8tPmRlY19pZCA9IGRlY2lkICYgTVNNX0FVRF9ERUNPREVSX01BU0s7Ci0KLQlhdWRpby0+YnVmZmVyX3NpemUgPSBCVUZTWjsKLQlhdWRpby0+YnVmZmVyX2NvdW50ID0gTUFYX0JVRjsKLQlyYyA9IGF1ZG1ncl9vcGVuKCZhdWRpby0+YXVkbWdyKTsKLQlpZiAocmMpCi0JCWdvdG8gZXJyOwotCi0JcmMgPSBtc21fYWRzcF9nZXQoYXVkaW8tPm1vZHVsZV9uYW1lLCAmYXVkaW8tPmF1ZHBsYXksCi0JCQkmYXVkbHBhZGVjX2Fkc3Bfb3BzLCBhdWRpbyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiZmFpbGVkIHRvIGdldCAlcyBtb2R1bGVcbiIsIGF1ZGlvLT5tb2R1bGVfbmFtZSk7Ci0JCWF1ZG1ncl9jbG9zZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJjID0gcm10X2dldF9yZXNvdXJjZShhdWRpbyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiQURTUCByZXNvdXJjZXMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIFBDTSBzZXNzaW9uIik7Ci0JCWF1ZG1ncl9jbG9zZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIEluaXRpYWxpemUgYWxsIGxvY2tzIG9mIGF1ZGlvIGluc3RhbmNlICovCi0JbXV0ZXhfaW5pdCgmYXVkaW8tPmxvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZHNwX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPm91dF9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5pb25fcmVnaW9uX3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+ZXZlbnRfcXVldWUpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrKTsKLQotCWF1ZGlvLT5vdXRfc2FtcGxlX3JhdGUgPSA0NDEwMDsKLQlhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9IEFVRFBQX0NNRF9QQ01fSU5URl9TVEVSRU9fVjsKLQlhdWRpby0+b3V0X2JpdHMgPSBBVURQUF9DTURfV0FWX1BDTV9XSURUSF8xNjsKLQlhdWRpby0+dm9sdW1lID0gMHgyMDAwOwotCWF1ZHBjbV9hc3luY19mbHVzaChhdWRpbyk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQlhdWRpby0+b3BlbmVkID0gMTsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXNucHJpbnRmKG5hbWUsIHNpemVvZiBuYW1lLCAibXNtX3BjbV9scF9kZWNfJTA0eCIsIGF1ZGlvLT5kZWNfaWQpOwotCWF1ZGlvLT5kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQlOVUxMLCAodm9pZCAqKSBhdWRpbywgJmF1ZHBjbV9kZWJ1Z19mb3BzKTsKLQotCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCi0JCU1NX0RCRygiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5sZXZlbCA9IEVBUkxZX1NVU1BFTkRfTEVWRUxfRElTQUJMRV9GQjsKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5yZXN1bWUgPSBhdWRwY21fcmVzdW1lOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLnN1c3BlbmQgPSBhdWRwY21fc3VzcGVuZDsKLQlhdWRpby0+c3VzcGVuZF9jdGwuYXVkaW8gPSBhdWRpbzsKLQlyZWdpc3Rlcl9lYXJseV9zdXNwZW5kKCZhdWRpby0+c3VzcGVuZF9jdGwubm9kZSk7Ci0jZW5kaWYKLQlmb3IgKGkgPSAwOyBpIDwgQVVEUENNX0VWRU5UX05VTTsgaSsrKSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRwY21fZXZlbnQpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGVfbm9kZSkKLQkJCWxpc3RfYWRkX3RhaWwoJmVfbm9kZS0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQkJZWxzZSB7Ci0JCQlNTV9FUlIoImV2ZW50IHBrdCBhbGxvYyBmYWlsZWRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlhdWRpby0+Y2xpZW50ID0gbXNtX2lvbl9jbGllbnRfY3JlYXRlKFVJTlRfTUFYLCAiQXVkaW9fTFBBX0NsaWVudCIpOwotCWlmIChJU19FUlJfT1JfTlVMTChhdWRpby0+Y2xpZW50KSkgewotCQlwcl9lcnIoIlVuYWJsZSB0byBjcmVhdGUgSU9OIGNsaWVudFxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQlNTV9EQkcoIklvbiBjbGllbnQgY3JlYXRlZFxuIik7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotZXJyOgotCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLQlNTV9EQkcoImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBmcmVlaW5nXG4iLCAoaW50KWF1ZGlvKTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19wY21fbHBfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gYXVkaW9fb3BlbiwKLQkucmVsZWFzZQk9IGF1ZGlvX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0gYXVkaW9faW9jdGwsCi0JLmZzeW5jID0gYXVkbHBhX2ZzeW5jLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fbHBhX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gIm1zbV9wY21fbHBfZGVjIiwKLQkuZm9wcwk9ICZhdWRpb19wY21fbHBfZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGlvX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fbHBhX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoYXVkaW9faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19tcDMuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX21wMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzEwZTFlLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX21wMy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2MiArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19tcDMuYwotICoKLSAqIG1wMyBhdWRpbyBvdXRwdXQgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9lYXJseXN1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KLQotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdV9kb21haW5zLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fbWVtdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHBjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBsYXljbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBsYXltc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1cm10Y21kaS5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLQotI2luY2x1ZGUgImF1ZG1nci5oIgotCi0jZGVmaW5lIEFEUlZfU1RBVFVTX0FJT19JTlRGIDB4MDAwMDAwMDEKLSNkZWZpbmUgQURSVl9TVEFUVVNfT0JVRl9HSVZFTiAweDAwMDAwMDAyCi0jZGVmaW5lIEFEUlZfU1RBVFVTX0lCVUZfR0lWRU4gMHgwMDAwMDAwNAotI2RlZmluZSBBRFJWX1NUQVRVU19GU1lOQyAweDAwMDAwMDA4Ci0KLS8qIFNpemUgbXVzdCBiZSBwb3dlciBvZiAyICovCi0jZGVmaW5lIEJVRlNaX01BWCAzMjc2OAotI2RlZmluZSBCVUZTWl9NSU4gNDA5NgotI2RlZmluZSBETUFTWl9NQVggKEJVRlNaX01BWCAqIDIpCi0jZGVmaW5lIERNQVNaX01JTiAoQlVGU1pfTUlOICogMikKLQotI2RlZmluZSBBVURQTEFZX0lOVkFMSURfUkVBRF9QVFJfT0ZGU0VUCTB4RkZGRgotI2RlZmluZSBBVURERUNfREVDX01QMyAyCi0KLSNkZWZpbmUgUENNX0JVRlNaX01JTiA0ODAwCS8qIEhvbGQgb25lIHN0ZXJlbyBNUDMgZnJhbWUgKi8KLSNkZWZpbmUgUENNX0JVRl9NQVhfQ09VTlQgNQkvKiBEU1Agb25seSBhY2NlcHRzIDUgYnVmZmVycyBhdCBtb3N0Ci0JCQkJICAgYnV0IHN1cHBvcnQgMiBidWZmZXJzIGN1cnJlbnRseSAqLwotI2RlZmluZSBST1VUSU5HX01PREVfRlRSVCAxCi0jZGVmaW5lIFJPVVRJTkdfTU9ERV9SVCAyCi0vKiBEZWNvZGVyIHN0YXR1cyByZWNlaXZlZCBmcm9tIEFVRFBQVEFTSyAqLwotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19TTEVFUAkwCi0jZGVmaW5lCSBBVURQUF9ERUNfU1RBVFVTX0lOSVQgIDEKLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfQ0ZHICAgMgotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19QTEFZICAzCi0KLSNkZWZpbmUgQVVETVAzX01FVEFGSUVMRF9NQVNLIDB4RkZGRjAwMDAKLSNkZWZpbmUgQVVETVAzX0VPU19GTEdfT0ZGU0VUIDB4MEEgLyogT2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIGJ1ZmZlciAqLwotI2RlZmluZSBBVURNUDNfRU9TX0ZMR19NQVNLIDB4MDEKLSNkZWZpbmUgQVVETVAzX0VPU19OT05FIDB4MCAvKiBObyBFT1MgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgQVVETVAzX0VPU19TRVQgMHgxIC8qIEVPUyBzZXQgaW4gbWV0YSBmaWVsZCAqLwotCi0jZGVmaW5lIEFVRE1QM19FVkVOVF9OVU0gMTAgLyogRGVmYXVsdCBudW1iZXIgb2YgcHJlLWFsbG9jYXRlZCBldmVudCBwYWNrZXRzICovCi0KLSNkZWZpbmUgX19DT05UQUlOUyhyLCB2LCBsKSAoewkJCQkJXAotCXR5cGVvZihyKSBfX3IgPSByOwkJCQkJXAotCXR5cGVvZih2KSBfX3YgPSB2OwkJCQkJXAotCXR5cGVvZih2KSBfX2UgPSBfX3YgKyBsOwkJCQlcCi0JaW50IHJlcyA9ICgoX192ID49IF9fci0+dmFkZHIpICYmIAkJCVwKLQkJKF9fZSA8PSBfX3ItPnZhZGRyICsgX19yLT5sZW4pKTsJCVwKLQlyZXM7CQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgQ09OVEFJTlMocjEsIHIyKSAoewkJCQkJXAotCXR5cGVvZihyMikgX19yMiA9IHIyOwkJCQkJXAotCV9fQ09OVEFJTlMocjEsIF9fcjItPnZhZGRyLCBfX3IyLT5sZW4pOwkJCVwKLX0pCi0KLSNkZWZpbmUgSU5fUkFOR0UociwgdikgKHsJCQkJCVwKLQl0eXBlb2YocikgX19yID0gcjsJCQkJCVwKLQl0eXBlb2YodikgX192diA9IHY7CQkJCQlcCi0JaW50IHJlcyA9ICgoX192diA+PSBfX3ItPnZhZGRyKSAmJgkJCVwKLQkJKF9fdnYgPCAoX19yLT52YWRkciArIF9fci0+bGVuKSkpOwkJXAotCXJlczsJCQkJCQkJXAotfSkKLQotI2RlZmluZSBPVkVSTEFQUyhyMSwgcjIpICh7CQkJCQlcCi0JdHlwZW9mKHIxKSBfX3IxID0gcjE7CQkJCQlcCi0JdHlwZW9mKHIyKSBfX3IyID0gcjI7CQkJCQlcCi0JdHlwZW9mKF9fcjItPnZhZGRyKSBfX3YgPSBfX3IyLT52YWRkcjsJCQlcCi0JdHlwZW9mKF9fdikgX19lID0gX192ICsgX19yMi0+bGVuIC0gMTsJCQlcCi0JaW50IHJlcyA9IChJTl9SQU5HRShfX3IxLCBfX3YpIHx8IElOX1JBTkdFKF9fcjEsIF9fZSkpOwlcCi0JcmVzOwkJCQkJCQlcCi19KQotCi1zdHJ1Y3QgYXVkaW87Ci0KLXN0cnVjdCBidWZmZXIgewotCXZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgc2l6ZTsKLQl1bnNpZ25lZCB1c2VkOwkJLyogSW5wdXQgdXNhZ2UgYWN0dWFsIERTUCBwcm9kdWNlZCBQQ00gc2l6ZSAgKi8KLQl1bnNpZ25lZCBhZGRyOwotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zejsgLypvbmx5IHVzZWZ1bCBmb3IgZGF0YSBoYXMgbWV0YSBmaWVsZCAqLwotfTsKLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdHJ1Y3QgYXVkbXAzX3N1c3BlbmRfY3RsIHsKLSAgc3RydWN0IGVhcmx5X3N1c3BlbmQgbm9kZTsKLSAgc3RydWN0IGF1ZGlvICphdWRpbzsKLX07Ci0jZW5kaWYKLQotc3RydWN0IGF1ZG1wM19ldmVudCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCWludCBldmVudF90eXBlOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci19OwotCi1zdHJ1Y3QgYXVkbXAzX2lvbl9yZWdpb24gewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOwotCWludCBmZDsKLQl2b2lkICp2YWRkcjsKLQl1bnNpZ25lZCBsb25nIHBhZGRyOwotCXVuc2lnbmVkIGxvbmcga3ZhZGRyOwotCXVuc2lnbmVkIGxvbmcgbGVuOwotCXVuc2lnbmVkIHJlZl9jbnQ7Ci19OwotCi1zdHJ1Y3QgYXVkbXAzX2J1ZmZlcl9ub2RlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IG1zbV9hdWRpb19haW9fYnVmIGJ1ZjsKLQl1bnNpZ25lZCBsb25nIHBhZGRyOwotfTsKLQotc3RydWN0IGF1ZG1wM19kcnZfb3BlcmF0aW9ucyB7Ci0Jdm9pZCAoKnBjbV9idWZfdXBkYXRlKShzdHJ1Y3QgYXVkaW8gKiwgdWludDMyX3QgKik7Ci0Jdm9pZCAoKmJ1ZmZlcl9yZWZyZXNoKShzdHJ1Y3QgYXVkaW8gKik7Ci0Jdm9pZCAoKnNlbmRfZGF0YSkoc3RydWN0IGF1ZGlvICosIHVuc2lnbmVkKTsKLQl2b2lkICgqb3V0X2ZsdXNoKShzdHJ1Y3QgYXVkaW8gKik7Ci0Jdm9pZCAoKmluX2ZsdXNoKShzdHJ1Y3QgYXVkaW8gKik7Ci0JaW50ICgqZnN5bmMpKHN0cnVjdCBhdWRpbyAqKTsKLX07Ci0KLXN0cnVjdCBhdWRpbyB7Ci0Jc3RydWN0IGJ1ZmZlciBvdXRbMl07Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JdWludDhfdCBvdXRfaGVhZDsKLQl1aW50OF90IG91dF90YWlsOwotCXVpbnQ4X3Qgb3V0X25lZWRlZDsgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGRzcCBpcyB3YWl0aW5nIGZvciAqLwotCXVuc2lnbmVkIG91dF9kbWFfc3o7Ci0Jc3RydWN0IGxpc3RfaGVhZCBvdXRfcXVldWU7IC8qIHF1ZXVlIHRvIHJldGFpbiBvdXRwdXQgYnVmZmVycyAqLwotCWF0b21pY190IG91dF9ieXRlczsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtdXRleCB3cml0ZV9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlX3dhaXQ7Ci0KLQkvKiBIb3N0IFBDTSBzZWN0aW9uICovCi0Jc3RydWN0IGJ1ZmZlciBpbltQQ01fQlVGX01BWF9DT1VOVF07Ci0Jc3RydWN0IG11dGV4IHJlYWRfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkX3dhaXQ7CS8qIFdhaXQgcXVldWUgZm9yIHJlYWQgKi8KLQljaGFyICpyZWFkX2RhdGE7CS8qIHBvaW50ZXIgdG8gcmVhZGVyIGJ1ZmZlciAqLwotCWludDMyX3QgcmVhZF9waHlzOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHJlYWRlciBidWZmZXIgKi8KLQl1aW50OF90IHJlYWRfbmV4dDsJLyogaW5kZXggdG8gaW5wdXQgYnVmZmVycyB0byBiZSByZWFkIG5leHQgKi8KLQl1aW50OF90IGZpbGxfbmV4dDsJLyogaW5kZXggdG8gYnVmZmVyIHRoYXQgRFNQIHNob3VsZCBiZSBmaWxsaW5nICovCi0JdWludDhfdCBwY21fYnVmX2NvdW50OwkvKiBudW1iZXIgb2YgcGNtIGJ1ZmZlciBhbGxvY2F0ZWQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGluX3F1ZXVlOyAvKiBxdWV1ZSB0byByZXRhaW4gaW5wdXQgYnVmZmVycyAqLwotCS8qIC0tLS0gRW5kIG9mIEhvc3QgUENNIHNlY3Rpb24gKi8KLQotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKmF1ZHBsYXk7Ci0KLQkvKiBjb25maWd1cmF0aW9uIHRvIHVzZSBvbiBuZXh0IGVuYWJsZSAqLwotCXVpbnQzMl90IG91dF9zYW1wbGVfcmF0ZTsKLQl1aW50MzJfdCBvdXRfY2hhbm5lbF9tb2RlOwotCi0Jc3RydWN0IGF1ZG1nciBhdWRtZ3I7Ci0KLQkvKiBkYXRhIGFsbG9jYXRlZCBmb3IgdmFyaW91cyBidWZmZXJzICovCi0JY2hhciAqZGF0YTsKLQlpbnQzMl90IHBoeXM7IC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygd3JpdGUgYnVmZmVyICovCi0Jdm9pZCAqbWFwX3ZfcmVhZDsKLQl2b2lkICptYXBfdl93cml0ZTsKLQotCXVpbnQzMl90IGRydl9zdGF0dXM7Ci0JaW50IG1maWVsZDsgLyogbWV0YSBmaWVsZCBlbWJlZGRlZCBpbiBkYXRhICovCi0JaW50IHJmbHVzaDsgLyogUmVhZCAgZmx1c2ggKi8KLQlpbnQgd2ZsdXNoOyAvKiBXcml0ZSBmbHVzaCAqLwotCWludCBvcGVuZWQ7Ci0JaW50IGVuYWJsZWQ7Ci0JaW50IHJ1bm5pbmc7Ci0JaW50IHN0b3BwZWQ7IC8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQlpbnQgcGNtX2ZlZWRiYWNrOwotCWludCBidWZfcmVmcmVzaDsKLQlpbnQgcm10X3Jlc291cmNlX3JlbGVhc2VkOwotCWludCB0ZW9zOyAvKiB2YWxpZCBvbmx5IGlmIHR1bm5lbCBtb2RlICYgbm8gZGF0YSBsZWZ0IGZvciBkZWNvZGVyICovCi0JZW51bSBtc21fYXVkX2RlY29kZXJfc3RhdGUgZGVjX3N0YXRlOwkvKiBSZXByZXNlbnRzIGRlY29kZXIgc3RhdGUgKi8KLQlpbnQgcmVzZXJ2ZWQ7IC8qIEEgYnl0ZSBpcyBiZWluZyByZXNlcnZlZCAqLwotCWNoYXIgcnN2X2J5dGU7IC8qIEhhbmRsZSBvZGQgbGVuZ3RoIHVzZXIgZGF0YSAqLwotCi0JY29uc3QgY2hhciAqbW9kdWxlX25hbWU7Ci0JdW5zaWduZWQgcXVldWVfaWQ7Ci0JdWludDE2X3QgZGVjX2lkOwotCXVpbnQzMl90IHJlYWRfcHRyX29mZnNldDsKLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0Jc3RydWN0IGF1ZG1wM19zdXNwZW5kX2N0bCBzdXNwZW5kX2N0bDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotI2VuZGlmCi0KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9ldmVudF9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50X3F1ZXVlOwotCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3dhaXQ7Ci0Jc3BpbmxvY2tfdCBldmVudF9xdWV1ZV9sb2NrOwotCXN0cnVjdCBtdXRleCBnZXRfZXZlbnRfbG9jazsKLQlpbnQgZXZlbnRfYWJvcnQ7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkIGlvbl9yZWdpb25fcXVldWU7IC8qIHByb3RlY3RlZCBieSBsb2NrICovCi0Jc3RydWN0IGF1ZG1wM19kcnZfb3BlcmF0aW9ucyBkcnZfb3BzOwotCi0JaW50IGVxX2VuYWJsZTsKLQlpbnQgZXFfbmVlZHNfY29tbWl0OwotCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19lcWFsaXplciBlcTsKLQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfdm9sdW1lIHZvbF9wYW47Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaW5wdXRfYnVmZl9oYW5kbGU7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKm91dHB1dF9idWZmX2hhbmRsZTsKLX07Ci0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRwbGF5X3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpOwotc3RhdGljIHZvaWQgYXVkcGxheV9jb25maWdfaG9zdHBjbShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZHBsYXlfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRpb19kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpOwotc3RhdGljIHZvaWQgYXVkbXAzX3Bvc3RfZXZlbnQoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHR5cGUsCi0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBhdWRtcDNfaW9uX2ZpeHVwKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHZvaWQgKmFkZHIsCi0JCQkJdW5zaWduZWQgbG9uZyBsZW4sIGludCByZWZfdXApOwotCi1zdGF0aWMgaW50IHJtdF9wdXRfcmVzb3VyY2Uoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkX2NvZGVjX2NvbmZpZ19jbWQgY21kOwotCXVuc2lnbmVkIHNob3J0IGNsaWVudF9pZHg7Ci0KLQljbWQuY21kX2lkID0gUk1fQ01EX0FVRF9DT0RFQ19DRkc7Ci0JY21kLmNsaWVudF9pZCA9IFJNX0FVRF9DTElFTlRfSUQ7Ci0JY21kLnRhc2tfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5lbmFibGUgPSBSTVRfRElTQUJMRTsKLQljbWQuZGVjX3R5cGUgPSBBVURERUNfREVDX01QMzsKLQljbGllbnRfaWR4ID0gKChjbWQuY2xpZW50X2lkIDw8IDgpIHwgY21kLnRhc2tfaWQpOwotCi0JcmV0dXJuIHB1dF9hZHNwX3Jlc291cmNlKGNsaWVudF9pZHgsICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBybXRfZ2V0X3Jlc291cmNlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZF9jb2RlY19jb25maWdfY21kIGNtZDsKLQl1bnNpZ25lZCBzaG9ydCBjbGllbnRfaWR4OwotCi0JY21kLmNtZF9pZCA9IFJNX0NNRF9BVURfQ09ERUNfQ0ZHOwotCWNtZC5jbGllbnRfaWQgPSBSTV9BVURfQ0xJRU5UX0lEOwotCWNtZC50YXNrX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuZW5hYmxlID0gUk1UX0VOQUJMRTsKLQljbWQuZGVjX3R5cGUgPSBBVURERUNfREVDX01QMzsKLQljbGllbnRfaWR4ID0gKChjbWQuY2xpZW50X2lkIDw8IDgpIHwgY21kLnRhc2tfaWQpOwotCi0JcmV0dXJuIGdldF9hZHNwX3Jlc291cmNlKGNsaWVudF9pZHgsICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGlvX2VuYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRtZ3JfY29uZmlnIGNmZzsKLQlpbnQgcmM7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCi0JaWYgKGF1ZGlvLT5lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWlmIChhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID09IDEpIHsKLQkJYXVkaW8tPnJtdF9yZXNvdXJjZV9yZWxlYXNlZCA9IDA7Ci0JCXJjID0gcm10X2dldF9yZXNvdXJjZShhdWRpbyk7Ci0JCWlmIChyYykgewotCQkJTU1fRVJSKCJBRFNQIHJlc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgTVAzIFwKLQkJCQlzZXNzaW9uIDB4JTA4eCBvbiBkZWNvZGVyOiAlZFxuIElnbm9yaW5nIFwKLQkJCQllcnJvciBhbmQgZ29pbmcgYWhlYWQgd2l0aCB0aGUgcGxheWJhY2tcbiIsCi0JCQkJKGludClhdWRpbywgYXVkaW8tPmRlY19pZCk7Ci0JCX0KLQl9Ci0KLQlhdWRpby0+ZGVjX3N0YXRlID0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkU7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0KLQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykgewotCQljZmcudHhfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFX05PTkU7Ci0JCWNmZy5yeF9yYXRlID0gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfNDgwMDA7Ci0JCWNmZy5kZWZfbWV0aG9kID0gUlBDX0FVRF9ERUZfTUVUSE9EX1BMQVlCQUNLOwotCQljZmcuY29kZWMgPSBSUENfQVVEX0RFRl9DT0RFQ19NUDM7Ci0JCWNmZy5zbmRfbWV0aG9kID0gUlBDX1NORF9NRVRIT0RfTUlESTsKLQotCQlyYyA9IGF1ZG1ncl9lbmFibGUoJmF1ZGlvLT5hdWRtZ3IsICZjZmcpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQltc21fYWRzcF9kdW1wKGF1ZGlvLT5hdWRwbGF5KTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCWlmIChtc21fYWRzcF9lbmFibGUoYXVkaW8tPmF1ZHBsYXkpKSB7Ci0JCU1NX0VSUigibXNtX2Fkc3BfZW5hYmxlKGF1ZHBsYXkpIGZhaWxlZFxuIik7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrID09IFRVTk5FTF9NT0RFX1BMQVlCQUNLKQotCQkJYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAoYXVkcHBfZW5hYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvX2RzcF9ldmVudCwgYXVkaW8pKSB7Ci0JCU1NX0VSUigiYXVkcHBfZW5hYmxlKCkgZmFpbGVkXG4iKTsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRpby0+YXVkcGxheSk7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrID09IFRVTk5FTF9NT0RFX1BMQVlCQUNLKQotCQkJYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRpb19kaXNhYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JaW50IHJjID0gMDsKLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWlmIChhdWRpby0+ZW5hYmxlZCkgewotCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCWF1ZGlvLT5kZWNfc3RhdGUgPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORTsKLQkJYXVkZGVjX2RzcF9jb25maWcoYXVkaW8sIDApOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUsCi0JCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0RFQ09ERVJfV0FJVF9NUykpOwotCQlpZiAocmMgPT0gMCkKLQkJCXJjID0gLUVUSU1FRE9VVDsKLQkJZWxzZSBpZiAoYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfQ0xPU0UpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCQltc21fYWRzcF9kaXNhYmxlKGF1ZGlvLT5hdWRwbGF5KTsKLQkJYXVkcHBfZGlzYWJsZShhdWRpby0+ZGVjX2lkLCBhdWRpbyk7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrID09IFRVTk5FTF9NT0RFX1BMQVlCQUNLKSB7Ci0JCQlyYyA9IGF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJbXNtX2Fkc3BfZHVtcChhdWRpby0+YXVkcGxheSk7Ci0JCX0KLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQlybXRfcHV0X3Jlc291cmNlKGF1ZGlvKTsKLQkJYXVkaW8tPnJtdF9yZXNvdXJjZV9yZWxlYXNlZCA9IDE7Ci0JfQotCXJldHVybiByYzsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkc3AgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgdm9pZCBhdWRtcDNfYXN5bmNfcGNtX2J1Zl91cGRhdGUoc3RydWN0IGF1ZGlvICphdWRpbywgdWludDMyX3QgKnBheWxvYWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBldmVudF9wYXlsb2FkOwotCXN0cnVjdCBhdWRtcDNfYnVmZmVyX25vZGUgKmZpbGxlZF9idWY7Ci0JdWludDhfdCBpbmRleDsKLQotCWlmIChhdWRpby0+cmZsdXNoKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGF5bG9hZFsxXTsgaW5kZXgrKykgewotCQlCVUdfT04obGlzdF9lbXB0eSgmYXVkaW8tPmluX3F1ZXVlKSk7Ci0JCWZpbGxlZF9idWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+aW5fcXVldWUsCi0JCQkJCXN0cnVjdCBhdWRtcDNfYnVmZmVyX25vZGUsIGxpc3QpOwotCQlpZiAoZmlsbGVkX2J1Zi0+cGFkZHIgPT0gcGF5bG9hZFsyICsgaW5kZXggKiAyXSkgewotCQkJbGlzdF9kZWwoJmZpbGxlZF9idWYtPmxpc3QpOwotCQkJZXZlbnRfcGF5bG9hZC5haW9fYnVmID0gZmlsbGVkX2J1Zi0+YnVmOwotCQkJZXZlbnRfcGF5bG9hZC5haW9fYnVmLmRhdGFfbGVuID0KLQkJCQlwYXlsb2FkWzMgKyBpbmRleCAqIDJdOwotCQkJTU1fREJHKCJwY20gYnVmICVwIGRhdGFfbGVuICVkXG4iLCBmaWxsZWRfYnVmLAotCQkJCQlldmVudF9wYXlsb2FkLmFpb19idWYuZGF0YV9sZW4pOwotCQkJYXVkbXAzX3Bvc3RfZXZlbnQoYXVkaW8sIEFVRElPX0VWRU5UX1JFQURfRE9ORSwKLQkJCQkJCWV2ZW50X3BheWxvYWQpOwotCQkJa2ZyZWUoZmlsbGVkX2J1Zik7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoImV4cGVjdGVkPSVseCByZXQ9JXhcbiIsIGZpbGxlZF9idWYtPnBhZGRyLAotCQkJCQlwYXlsb2FkWzIgKyBpbmRleCAqIDJdKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JYXVkaW8tPmRydl9zdGF0dXMgJj0gfkFEUlZfU1RBVFVTX0lCVUZfR0lWRU47Ci0JYXVkaW8tPmRydl9vcHMuYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCi19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX3VwZGF0ZV9wY21fYnVmX2VudHJ5KHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVpbnQzMl90ICpwYXlsb2FkKQotewotCXVpbnQ4X3QgaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChhdWRpby0+cmZsdXNoKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGF5bG9hZFsxXTsgaW5kZXgrKykgewotCQlpZiAoYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHIgPT0KLQkJICAgIHBheWxvYWRbMiArIGluZGV4ICogMl0pIHsKLQkJCU1NX0RCRygiaW5bJWRdIHJlYWR5XG4iLCBhdWRpby0+ZmlsbF9uZXh0KTsKLQkJCWF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS51c2VkID0KLQkJCSAgcGF5bG9hZFszICsgaW5kZXggKiAyXTsKLQkJCWlmICgoKythdWRpby0+ZmlsbF9uZXh0KSA9PSBhdWRpby0+cGNtX2J1Zl9jb3VudCkKLQkJCQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLQotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJleHBlY3RlZD0leCByZXQ9JXhcbiIsCi0JCQkJCWF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyLAotCQkJCQlwYXlsb2FkWzIgKyBpbmRleCAqIDJdKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0udXNlZCA9PSAwKSB7Ci0JCWF1ZGlvLT5kcnZfb3BzLmJ1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQl9IGVsc2UgewotCQlNTV9EQkcoInJlYWQgY2Fubm90IGtlZXAgdXBcbiIpOwotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAxOwotCX0KLQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQotfQotCi1zdGF0aWMgdm9pZCBhdWRwbGF5X2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgc2l6ZV90IGxlbiwKLQkJCSAgICAgIHZvaWQgKCpnZXRldmVudCkgKHZvaWQgKnB0ciwgc2l6ZV90IGxlbikpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGRhdGE7Ci0JdWludDMyX3QgbXNnWzI4XTsKLQlnZXRldmVudChtc2csIHNpemVvZihtc2cpKTsKLQotCU1NX0RCRygibXNnX2lkPSV4XG4iLCBpZCk7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQTEFZX01TR19ERUNfTkVFRFNfREFUQToKLQkJYXVkaW8tPmRydl9vcHMuc2VuZF9kYXRhKGF1ZGlvLCAxKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBMQVlfTVNHX0JVRkZFUl9VUERBVEU6Ci0JCWF1ZGlvLT5kcnZfb3BzLnBjbV9idWZfdXBkYXRlKGF1ZGlvLCBtc2cpOwotCQlicmVhazsKLQotCWNhc2UgQURTUF9NRVNTQUdFX0lEOgotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6IG1vZHVsZSBlbmFibGUoYXVkcGxheXRhc2spXG4iKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlNTV9FUlIoInVuZXhwZWN0ZWQgbWVzc2FnZSBmcm9tIGRlY29kZXIgXG4iKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhdWRpb19kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IHByaXZhdGU7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQUF9NU0dfU1RBVFVTX01TRzp7Ci0JCQl1bnNpZ25lZCBzdGF0dXMgPSBtc2dbMV07Ci0KLQkJCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfU0xFRVA6IHsKLQkJCQl1aW50MTZfdCByZWFzb24gPSBtc2dbMl07Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogc2xlZXAgcmVhc29uPTB4JTA0eFxuIiwKLQkJCQkJCXJlYXNvbik7Ci0JCQkJaWYgKChyZWFzb24gPT0gQVVEUFBfTVNHX1JFQVNPTl9NRU0pCi0JCQkJCXx8IChyZWFzb24gPT0KLQkJCQkJQVVEUFBfTVNHX1JFQVNPTl9OT0RFQ09ERVIpKSB7Ci0JCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX0ZBSUxVUkU7Ci0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQl9IGVsc2UgaWYgKHJlYXNvbiA9PSBBVURQUF9NU0dfUkVBU09OX05PTkUpIHsKLQkJCQkJLyogZGVjb2RlciBpcyBpbiBkaXNhYmxlIHN0YXRlICovCi0JCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX0NMT1NFOwotCQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX0lOSVQ6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogaW5pdCBcbiIpOwotCQkJCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQkJCQlhdWRwcF9jbWRfY2ZnX3JvdXRpbmdfbW9kZShhdWRpbyk7Ci0JCQkJZWxzZQotCQkJCQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKGF1ZGlvKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX0NGRzoKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBjZmcgXG4iKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19QTEFZOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IHBsYXkgXG4iKTsKLQkJCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykgewotCQkJCQlhdWRwbGF5X2NvbmZpZ19ob3N0cGNtKGF1ZGlvKTsKLQkJCQkJYXVkaW8tPmRydl9vcHMuYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCQkJCX0KLQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1M7Ci0JCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlNTV9FUlIoInVua25vd24gZGVjb2RlciBzdGF0dXMgXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURQUF9NU0dfQ0ZHX01TRzoKLQkJaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0VOQSkgewotCQkJTU1fREJHKCJDRkdfTVNHIEVOQUJMRVxuIik7Ci0JCQlhdWRkZWNfZHNwX2NvbmZpZyhhdWRpbywgMSk7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCQlhdWRpby0+cnVubmluZyA9IDE7Ci0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuKTsKLQkJCWF1ZHBwX2RzcF9zZXRfZXEoYXVkaW8tPmRlY19pZCwgYXVkaW8tPmVxX2VuYWJsZSwKLQkJCQkJCQkJJmF1ZGlvLT5lcSk7Ci0JCQlhdWRwcF9hdnN5bmMoYXVkaW8tPmRlY19pZCwgMjIwNTApOwotCQl9IGVsc2UgaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0RJUykgewotCQkJTU1fREJHKCJDRkdfTVNHIERJU0FCTEVcbiIpOwotCQkJYXVkcHBfYXZzeW5jKGF1ZGlvLT5kZWNfaWQsIDApOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAwOwotCQl9IGVsc2UgewotCQkJTU1fREJHKCJDRkdfTVNHICVkP1xuIiwgbXNnWzBdKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRFBQX01TR19ST1VUSU5HX0FDSzoKLQkJTU1fREJHKCJST1VUSU5HX0FDSyBtb2RlPSVkXG4iLAltc2dbMV0pOwotCQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKGF1ZGlvKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBQX01TR19GTFVTSF9BQ0s6Ci0JCU1NX0RCRygiRkxVU0hfQUNLXG4iKTsKLQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQkJYXVkaW8tPmRydl9vcHMuYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCQlicmVhazsKLQotCWNhc2UgQVVEUFBfTVNHX1BDTURNQU1JU1NFRDoKLQkJTU1fREJHKCJQQ01ETUFNSVNTRURcbiIpOwotCQlhdWRpby0+dGVvcyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlNTV9FUlIoIlVOS05PV04gKCVkKVxuIiwgaWQpOwotCX0KLQotfQotCi0KLXN0cnVjdCBtc21fYWRzcF9vcHMgYXVkcGxheV9hZHNwX29wcyA9IHsKLQkuZXZlbnQgPSBhdWRwbGF5X2RzcF9ldmVudCwKLX07Ci0KLQotI2RlZmluZSBhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCBjbWQsIGxlbikgXAotCW1zbV9hZHNwX3dyaXRlKGF1ZGlvLT5hdWRwbGF5LCBhdWRpby0+cXVldWVfaWQsIFwKLQkJCWNtZCwgbGVuKQotCi1zdGF0aWMgaW50IGF1ZGRlY19kc3BfY29uZmlnKHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0JdTE2IGNmZ19kZWNfY21kW0FVRFBQX0NNRF9DRkdfREVDX1RZUEVfTEVOIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KV07Ci0KLQltZW1zZXQoY2ZnX2RlY19jbWQsIDAsIHNpemVvZihjZmdfZGVjX2NtZCkpOwotCi0JY2ZnX2RlY19jbWRbMF0gPSBBVURQUF9DTURfQ0ZHX0RFQ19UWVBFOwotCWlmIChlbmFibGUpCi0JCWNmZ19kZWNfY21kWzEgKyBhdWRpby0+ZGVjX2lkXSA9IEFVRFBQX0NNRF9VUERBVERFX0NGR19ERUMgfAotCQkJQVVEUFBfQ01EX0VOQV9ERUNfViB8IEFVRERFQ19ERUNfTVAzOwotCWVsc2UKLQkJY2ZnX2RlY19jbWRbMSArIGF1ZGlvLT5kZWNfaWRdID0gQVVEUFBfQ01EX1VQREFUREVfQ0ZHX0RFQyB8Ci0JCQlBVURQUF9DTURfRElTX0RFQ19WOwotCi0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUxKCZjZmdfZGVjX2NtZCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX21wMyBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jb21tb24uY21kX2lkID0gQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNUzsKLQljbWQuY29tbW9uLmxlbmd0aCA9IEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVNfTVAzX0xFTjsKLQljbWQuY29tbW9uLmRlY19pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmNvbW1vbi5pbnB1dF9zYW1wbGluZ19mcmVxdWVuY3kgPSBhdWRpby0+b3V0X3NhbXBsZV9yYXRlOwotCi0JYXVkcHBfc2VuZF9xdWV1ZTIoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX3JvdXRpbmdfbW9kZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwcF9jbWRfcm91dGluZ19tb2RlIGNtZDsKLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFBQX0NNRF9ST1VUSU5HX01PREU7Ci0JY21kLm9iamVjdF9udW1iZXIgPSBhdWRpby0+ZGVjX2lkOwotCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQljbWQucm91dGluZ19tb2RlID0gUk9VVElOR19NT0RFX0ZUUlQ7Ci0JZWxzZQotCQljbWQucm91dGluZ19tb2RlID0gUk9VVElOR19NT0RFX1JUOwotCi0JYXVkcHBfc2VuZF9xdWV1ZTEoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGF1ZHBsYXlfZHNwX3NlbmRfZGF0YV9hdmFpbChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQkJCQl1bnNpZ25lZCBpZHgsIHVuc2lnbmVkIGxlbikKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfYml0c3RyZWFtX2RhdGFfYXZhaWxfbnQyIGNtZDsKLQotCWNtZC5jbWRfaWQJCT0gQVVEUExBWV9DTURfQklUU1RSRUFNX0RBVEFfQVZBSUxfTlQyOwotCWlmIChhdWRpby0+bWZpZWxkKQotCQljbWQuZGVjb2Rlcl9pZCA9IEFVRE1QM19NRVRBRklFTERfTUFTSyB8Ci0JCQkoYXVkaW8tPm91dFtpZHhdLm1maWVsZF9zeiA+PiAxKTsKLQllbHNlCi0JCWNtZC5kZWNvZGVyX2lkCQk9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmJ1Zl9wdHIJCT0gYXVkaW8tPm91dFtpZHhdLmFkZHI7Ci0JY21kLmJ1Zl9zaXplCQk9IGxlbi8yOwotCWNtZC5wYXJ0aXRpb25fbnVtYmVyCT0gMDsKLQkvKiBjb21wbGV0ZSBhbGwgdGhlIHdyaXRlcyB0byB0aGUgaW5wdXQgYnVmZmVyICovCi0Jd21iKCk7Ci0JcmV0dXJuIGF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotLyogQ2FsbGVyIGhvbGRzIGlycV9sb2NrICovCi1zdGF0aWMgdm9pZCBhdWRtcDNfYXN5bmNfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfYnVmZmVyX3JlZnJlc2ggcmVmcmVzaF9jbWQ7Ci0Jc3RydWN0IGF1ZG1wM19idWZmZXJfbm9kZSAqbmV4dF9idWY7Ci0KLQlpZiAoIWF1ZGlvLT5ydW5uaW5nIHx8Ci0JICAgIGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfSUJVRl9HSVZFTikKLQkJcmV0dXJuOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+aW5fcXVldWUpKSB7Ci0JCW5leHRfYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmluX3F1ZXVlLAotCQkgICAgc3RydWN0IGF1ZG1wM19idWZmZXJfbm9kZSwgbGlzdCk7Ci0JCWlmICghbmV4dF9idWYpCi0JCQlyZXR1cm47Ci0JCU1NX0RCRygibmV4dCBidWYgJXAgcGh5ICVseCBsZW4gJWRcbiIsIG5leHRfYnVmLAotCQkJCW5leHRfYnVmLT5wYWRkciwgbmV4dF9idWYtPmJ1Zi5idWZfbGVuKTsKLQkJcmVmcmVzaF9jbWQuY21kX2lkID0gQVVEUExBWV9DTURfQlVGRkVSX1JFRlJFU0g7Ci0JCXJlZnJlc2hfY21kLm51bV9idWZmZXJzID0gMTsKLQkJcmVmcmVzaF9jbWQuYnVmMF9hZGRyZXNzID0gbmV4dF9idWYtPnBhZGRyOwotCQlyZWZyZXNoX2NtZC5idWYwX2xlbmd0aCA9IG5leHRfYnVmLT5idWYuYnVmX2xlbiAtCi0JCQkobmV4dF9idWYtPmJ1Zi5idWZfbGVuICUgNTc2KSArCi0JCQkoYXVkaW8tPm1maWVsZCA/IDI0IDogMCk7IC8qIE1wMyBmcmFtZSBzaXplICovCi0JCXJlZnJlc2hfY21kLmJ1Zl9yZWFkX2NvdW50ID0gMDsKLQkJYXVkaW8tPmRydl9zdGF0dXMgfD0gQURSVl9TVEFUVVNfSUJVRl9HSVZFTjsKLQkJKHZvaWQpIGF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZyZWZyZXNoX2NtZCwKLQkJCXNpemVvZihyZWZyZXNoX2NtZCkpOwotCX0KLQotfQotCi1zdGF0aWMgdm9pZCBhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2J1ZmZlcl9yZWZyZXNoIHJlZnJlc2hfY21kOwotCi0JcmVmcmVzaF9jbWQuY21kX2lkID0gQVVEUExBWV9DTURfQlVGRkVSX1JFRlJFU0g7Ci0JcmVmcmVzaF9jbWQubnVtX2J1ZmZlcnMgPSAxOwotCXJlZnJlc2hfY21kLmJ1ZjBfYWRkcmVzcyA9IGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyOwotCXJlZnJlc2hfY21kLmJ1ZjBfbGVuZ3RoID0gYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnNpemUgLQotCQkoYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnNpemUgJSA1NzYpICsKLQkJKGF1ZGlvLT5tZmllbGQgPyAyNCA6IDApOyAvKiBNcDMgZnJhbWUgc2l6ZSAqLwotCXJlZnJlc2hfY21kLmJ1Zl9yZWFkX2NvdW50ID0gMDsKLQlNTV9EQkcoImJ1ZjBfYWRkcj0leCBidWYwX2xlbj0lZFxuIiwgcmVmcmVzaF9jbWQuYnVmMF9hZGRyZXNzLAotCQkJcmVmcmVzaF9jbWQuYnVmMF9sZW5ndGgpOwotCSh2b2lkKWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZyZWZyZXNoX2NtZCwgc2l6ZW9mKHJlZnJlc2hfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfY29uZmlnX2hvc3RwY20oc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfaHBjbV9idWZfY2ZnIGNmZ19jbWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWNmZ19jbWQuY21kX2lkID0gQVVEUExBWV9DTURfSFBDTV9CVUZfQ0ZHOwotCWNmZ19jbWQubWF4X2J1ZmZlcnMgPSAxOwotCWNmZ19jbWQuYnl0ZV9zd2FwID0gMDsKLQljZmdfY21kLmhvc3RwY21fY29uZmlnID0gKDB4ODAwMCkgfCAoMHg0MDAwKTsKLQljZmdfY21kLmZlZWRiYWNrX2ZyZXF1ZW5jeSA9IDE7Ci0JY2ZnX2NtZC5wYXJ0aXRpb25fbnVtYmVyID0gMDsKLQkodm9pZClhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY2ZnX2NtZCwgc2l6ZW9mKGNmZ19jbWQpKTsKLQotfQotCi1zdGF0aWMgdm9pZCBhdWRtcDNfYXN5bmNfc2VuZF9kYXRhKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVuc2lnbmVkIG5lZWRlZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWlmICghYXVkaW8tPnJ1bm5pbmcpCi0JCWdvdG8gZG9uZTsKLQotCWlmIChuZWVkZWQgJiYgIWF1ZGlvLT53Zmx1c2gpIHsKLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAxOwotCQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19PQlVGX0dJVkVOKSB7Ci0JCQkvKiBwb3Agb25lIG5vZGUgb3V0IG9mIHF1ZXVlICovCi0JCQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCQkJc3RydWN0IGF1ZG1wM19idWZmZXJfbm9kZSAqdXNlZF9idWY7Ci0KLQkJCU1NX0RCRygiY29uc3VtZWRcbiIpOwotCQkJQlVHX09OKGxpc3RfZW1wdHkoJmF1ZGlvLT5vdXRfcXVldWUpKTsKLQkJCXVzZWRfYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPm91dF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkbXAzX2J1ZmZlcl9ub2RlLCBsaXN0KTsKLQkJCWxpc3RfZGVsKCZ1c2VkX2J1Zi0+bGlzdCk7Ci0JCQlwYXlsb2FkLmFpb19idWYgPSB1c2VkX2J1Zi0+YnVmOwotCQkJYXVkbXAzX3Bvc3RfZXZlbnQoYXVkaW8sIEFVRElPX0VWRU5UX1dSSVRFX0RPTkUsCi0JCQkJcGF5bG9hZCk7Ci0JCQlrZnJlZSh1c2VkX2J1Zik7Ci0JCQlhdWRpby0+ZHJ2X3N0YXR1cyAmPSB+QURSVl9TVEFUVVNfT0JVRl9HSVZFTjsKLQkJfQotCi0JfQotCi0JaWYgKGF1ZGlvLT5vdXRfbmVlZGVkKSB7Ci0JCXN0cnVjdCBhdWRtcDNfYnVmZmVyX25vZGUgKm5leHRfYnVmOwotCQlzdHJ1Y3QgYXVkcGxheV9jbWRfYml0c3RyZWFtX2RhdGFfYXZhaWxfbnQyIGNtZDsKLQkJaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+b3V0X3F1ZXVlKSkgewotCQkJbmV4dF9idWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+b3V0X3F1ZXVlLAotCQkJCQlzdHJ1Y3QgYXVkbXAzX2J1ZmZlcl9ub2RlLCBsaXN0KTsKLQkJCU1NX0RCRygibmV4dF9idWYgJXBcbiIsIG5leHRfYnVmKTsKLQkJCWlmIChuZXh0X2J1ZikgewotCQkJCU1NX0RCRygibmV4dCBidWYgcGh5ICVseCBsZW4gJWRcbiIsCi0JCQkJCQluZXh0X2J1Zi0+cGFkZHIsCi0JCQkJCQluZXh0X2J1Zi0+YnVmLmRhdGFfbGVuKTsKLQotCQkJCWNtZC5jbWRfaWQgPQotCQkJCQlBVURQTEFZX0NNRF9CSVRTVFJFQU1fREFUQV9BVkFJTF9OVDI7Ci0JCQkJaWYgKGF1ZGlvLT5tZmllbGQpCi0JCQkJCWNtZC5kZWNvZGVyX2lkID0gQVVETVAzX01FVEFGSUVMRF9NQVNLIHwKLQkJCQkJCShuZXh0X2J1Zi0+YnVmLm1maWVsZF9zeiA+PiAxKTsKLQkJCQllbHNlCi0JCQkJCWNtZC5kZWNvZGVyX2lkID0gYXVkaW8tPmRlY19pZDsKLQkJCQljbWQuYnVmX3B0cgk9ICh1bnNpZ25lZCkgbmV4dF9idWYtPnBhZGRyOwotCQkJCWNtZC5idWZfc2l6ZSA9IG5leHRfYnVmLT5idWYuZGF0YV9sZW4gPj4gMTsKLQkJCQljbWQucGFydGl0aW9uX251bWJlcgk9IDA7Ci0JCQkJLyogY29tcGxldGUgdGhlIHdyaXRlcyB0byB0aGUgaW5wdXQgYnVmZmVyICovCi0JCQkJd21iKCk7Ci0JCQkJYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotCQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJCQlhdWRpby0+ZHJ2X3N0YXR1cyB8PSBBRFJWX1NUQVRVU19PQlVGX0dJVkVOOwotCQkJfQotCQl9Ci0JfQotCi1kb25lOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwbGF5X3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWF1ZGlvLT5ydW5uaW5nKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAobmVlZGVkICYmICFhdWRpby0+d2ZsdXNoKSB7Ci0JCS8qIFdlIHdlcmUgY2FsbGVkIGZyb20gdGhlIGNhbGxiYWNrIGJlY2F1c2UgdGhlIERTUAotCQkgKiByZXF1ZXN0ZWQgbW9yZSBkYXRhLiAgTm90ZSB0aGF0IHRoZSBEU1AgZG9lcyB3YW50Ci0JCSAqIG1vcmUgZGF0YSwgYW5kIGlmIGEgYnVmZmVyIHdhcyBpbi1mbGlnaHQsIG1hcmsgaXQKLQkJICogYXMgYXZhaWxhYmxlIChzaW5jZSB0aGUgRFNQIG11c3Qgbm93IGJlIGRvbmUgd2l0aAotCQkgKiBpdCkuCi0JCSAqLwotCQlhdWRpby0+b3V0X25lZWRlZCA9IDE7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpIHsKLQkJCU1NX0RCRygiZnJhbWUgJWQgZnJlZVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJCWZyYW1lLT51c2VkID0gMDsKLQkJCWF1ZGlvLT5vdXRfdGFpbCBePSAxOwotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl9Ci0JfQotCi0JaWYgKGF1ZGlvLT5vdXRfbmVlZGVkKSB7Ci0JCS8qIElmIHRoZSBEU1AgY3VycmVudGx5IHdhbnRzIGRhdGEgYW5kIHdlIGhhdmUgYQotCQkgKiBidWZmZXIgYXZhaWxhYmxlLCB3ZSB3aWxsIHNlbmQgaXQgYW5kIHJlc2V0Ci0JCSAqIHRoZSBuZWVkZWQgZmxhZy4gIFdlJ2xsIG1hcmsgdGhlIGJ1ZmZlciBhcyBpbi1mbGlnaHQKLQkJICogc28gdGhhdCBpdCB3b24ndCBiZSByZWN5Y2xlZCB1bnRpbCB0aGUgbmV4dCBidWZmZXIKLQkJICogaXMgcmVxdWVzdGVkCi0JCSAqLwotCi0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkKSB7Ci0JCSAgQlVHX09OKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpOwotCQkgIE1NX0RCRygiZnJhbWUgJWQgYnVzeVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJICBhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoYXVkaW8sIGF1ZGlvLT5vdXRfdGFpbCwKLQkJCQkJICAgICAgZnJhbWUtPnVzZWQpOwotCQkgIGZyYW1lLT51c2VkID0gMHhmZmZmZmZmZjsKLQkJICBhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCX0KLQl9Ci1kb25lOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZG1wM19hc3luY19mbHVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRtcDNfYnVmZmVyX25vZGUgKmJ1Zl9ub2RlOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5vdXRfcXVldWUpIHsKLQkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGF1ZG1wM19idWZmZXJfbm9kZSwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0JCXBheWxvYWQuYWlvX2J1ZiA9IGJ1Zl9ub2RlLT5idWY7Ci0JCWF1ZG1wM19wb3N0X2V2ZW50KGF1ZGlvLCBBVURJT19FVkVOVF9XUklURV9ET05FLAotCQkJCXBheWxvYWQpOwotCQlrZnJlZShidWZfbm9kZSk7Ci0JfQotCWF1ZGlvLT5kcnZfc3RhdHVzICY9IH5BRFJWX1NUQVRVU19PQlVGX0dJVkVOOwotCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQlhdG9taWNfc2V0KCZhdWRpby0+b3V0X2J5dGVzLCAwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fZmx1c2goc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWF1ZGlvLT5vdXRbMF0udXNlZCA9IDA7Ci0JYXVkaW8tPm91dFsxXS51c2VkID0gMDsKLQlhdWRpby0+b3V0X2hlYWQgPSAwOwotCWF1ZGlvLT5vdXRfdGFpbCA9IDA7Ci0JYXVkaW8tPnJlc2VydmVkID0gMDsKLQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9ieXRlcywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZG1wM19hc3luY19mbHVzaF9wY21fYnVmKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZG1wM19idWZmZXJfbm9kZSAqYnVmX25vZGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmluX3F1ZXVlKSB7Ci0JCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhdWRtcDNfYnVmZmVyX25vZGUsIGxpc3QpOwotCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCQlwYXlsb2FkLmFpb19idWYgPSBidWZfbm9kZS0+YnVmOwotCQlwYXlsb2FkLmFpb19idWYuZGF0YV9sZW4gPSAwOwotCQlhdWRtcDNfcG9zdF9ldmVudChhdWRpbywgQVVESU9fRVZFTlRfUkVBRF9ET05FLAotCQkJCXBheWxvYWQpOwotCQlrZnJlZShidWZfbm9kZSk7Ci0JfQotCWF1ZGlvLT5kcnZfc3RhdHVzICY9IH5BRFJWX1NUQVRVU19JQlVGX0dJVkVOOwotCi19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2ZsdXNoX3BjbV9idWYoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1aW50OF90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUENNX0JVRl9NQVhfQ09VTlQ7IGluZGV4KyspCi0JCWF1ZGlvLT5pbltpbmRleF0udXNlZCA9IDA7Ci0JYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkaW9faW9wb3J0X3Jlc2V0KHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfQUlPX0lOVEYpIHsKLQkJLyogSWYgZnN5bmMgaXMgaW4gcHJvZ3Jlc3MsIG1ha2Ugc3VyZQotCQkgKiByZXR1cm4gdmFsdWUgb2YgZnN5bmMgaW5kaWNhdGVzCi0JCSAqIGFib3J0IGR1ZSB0byBmbHVzaAotCQkgKi8KLQkJaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfRlNZTkMpIHsKLQkJCU1NX0RCRygiZnN5bmMgaW4gcHJvZ3Jlc3NcbiIpOwotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQkJbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCQkJYXVkaW8tPmRydl9vcHMub3V0X2ZsdXNoKGF1ZGlvKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCQl9IGVsc2UKLQkJCWF1ZGlvLT5kcnZfb3BzLm91dF9mbHVzaChhdWRpbyk7Ci0JCWF1ZGlvLT5kcnZfb3BzLmluX2ZsdXNoKGF1ZGlvKTsKLQl9IGVsc2UgewotCQkvKiBNYWtlIHN1cmUgcmVhZC93cml0ZSB0aHJlYWQgYXJlIGZyZWUgZnJvbQotCQkgKiBzbGVlcCBhbmQga25vd2luZyB0aGF0IHN5c3RlbSBpcyBub3QgYWJsZQotCQkgKiB0byBwcm9jZXNzIGlvIHJlcXVlc3QgYXQgdGhlIG1vbWVudAotCQkgKi8KLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JCWF1ZGlvLT5kcnZfb3BzLm91dF9mbHVzaChhdWRpbyk7Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQkJbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JCWF1ZGlvLT5kcnZfb3BzLmluX2ZsdXNoKGF1ZGlvKTsKLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYXVkbXAzX2V2ZW50c19wZW5kaW5nKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZW1wdHk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQllbXB0eSA9ICFsaXN0X2VtcHR5KCZhdWRpby0+ZXZlbnRfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGVtcHR5IHx8IGF1ZGlvLT5ldmVudF9hYm9ydDsKLX0KLQotc3RhdGljIHZvaWQgYXVkbXAzX3Jlc2V0X2V2ZW50X3F1ZXVlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYXVkbXAzX2V2ZW50ICpkcnZfZXZ0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQlzdHJ1Y3QgYXVkbXAzX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCXN0cnVjdCBhdWRtcDNfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgbG9uZyBhdWRtcDNfcHJvY2Vzc19ldmVudF9yZXEoc3RydWN0IGF1ZGlvICphdWRpbywgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlsb25nIHJjOwotCXN0cnVjdCBtc21fYXVkaW9fZXZlbnQgdXNyX2V2dDsKLQlzdHJ1Y3QgYXVkbXAzX2V2ZW50ICpkcnZfZXZ0ID0gTlVMTDsKLQlpbnQgdGltZW91dDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ1c3JfZXZ0LCBhcmcsIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JdGltZW91dCA9IChpbnQpIHVzcl9ldnQudGltZW91dF9tczsKLQotCWlmICh0aW1lb3V0ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAotCQkJYXVkaW8tPmV2ZW50X3dhaXQsIGF1ZG1wM19ldmVudHNfcGVuZGluZyhhdWRpbyksCi0JCQltc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9IGVsc2UgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCWF1ZGlvLT5ldmVudF93YWl0LCBhdWRtcDNfZXZlbnRzX3BlbmRpbmcoYXVkaW8pKTsKLQl9Ci0KLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoYXVkaW8tPmV2ZW50X2Fib3J0KSB7Ci0JCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDA7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJjID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmV2ZW50X3F1ZXVlKSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmV2ZW50X3F1ZXVlLAotCQkJc3RydWN0IGF1ZG1wM19ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQl9Ci0JaWYgKGRydl9ldnQpIHsKLQkJdXNyX2V2dC5ldmVudF90eXBlID0gZHJ2X2V2dC0+ZXZlbnRfdHlwZTsKLQkJdXNyX2V2dC5ldmVudF9wYXlsb2FkID0gZHJ2X2V2dC0+cGF5bG9hZDsKLQkJbGlzdF9hZGRfdGFpbCgmZHJ2X2V2dC0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQl9IGVsc2UKLQkJcmMgPSAtMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGRydl9ldnQtPmV2ZW50X3R5cGUgPT0gQVVESU9fRVZFTlRfV1JJVEVfRE9ORSB8fAotCSAgICBkcnZfZXZ0LT5ldmVudF90eXBlID09IEFVRElPX0VWRU5UX1JFQURfRE9ORSkgewotCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JCWF1ZG1wM19pb25fZml4dXAoYXVkaW8sIGRydl9ldnQtPnBheWxvYWQuYWlvX2J1Zi5idWZfYWRkciwKLQkJCQkgIGRydl9ldnQtPnBheWxvYWQuYWlvX2J1Zi5idWZfbGVuLCAwKTsKLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JfQotCi0JLyogb3JkZXIgcmVhZHMgZnJvbSB0aGUgb3V0cHV0IGJ1ZmZlciAqLwotCWlmIChkcnZfZXZ0LT5ldmVudF90eXBlID09IEFVRElPX0VWRU5UX1JFQURfRE9ORSkKLQkJcm1iKCk7Ci0KLQlpZiAoIXJjICYmIGNvcHlfdG9fdXNlcihhcmcsICZ1c3JfZXZ0LCBzaXplb2YodXNyX2V2dCkpKQotCQlyYyA9IC1FRkFVTFQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkbXAzX2lvbl9jaGVjayhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQl2b2lkICp2YWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCi17Ci0Jc3RydWN0IGF1ZG1wM19pb25fcmVnaW9uICpyZWdpb25fZWx0OwotCXN0cnVjdCBhdWRtcDNfaW9uX3JlZ2lvbiB0ID0geyAudmFkZHIgPSB2YWRkciwgLmxlbiA9IGxlbiB9OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZWdpb25fZWx0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUsIGxpc3QpIHsKLQkJaWYgKENPTlRBSU5TKHJlZ2lvbl9lbHQsICZ0KSB8fCBDT05UQUlOUygmdCwgcmVnaW9uX2VsdCkgfHwKLQkJICAgIE9WRVJMQVBTKHJlZ2lvbl9lbHQsICZ0KSkgewotCQkJTU1fRVJSKCJyZWdpb24gKHZhZGRyICVwIGxlbiAlbGQpIgotCQkJCSIgY2xhc2hlcyB3aXRoIHJlZ2lzdGVyZWQgcmVnaW9uIgotCQkJCSIgKHZhZGRyICVwIHBhZGRyICVwIGxlbiAlbGQpXG4iLAotCQkJCXZhZGRyLCBsZW4sCi0JCQkJcmVnaW9uX2VsdC0+dmFkZHIsCi0JCQkJKHZvaWQgKilyZWdpb25fZWx0LT5wYWRkciwKLQkJCQlyZWdpb25fZWx0LT5sZW4pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRtcDNfaW9uX2FkZChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQkJc3RydWN0IG1zbV9hdWRpb19pb25faW5mbyAqaW5mbykKLXsKLQlpb25fcGh5c19hZGRyX3QgcGFkZHI7Ci0Jc2l6ZV90IGxlbjsKLQl1bnNpZ25lZCBsb25nIGt2YWRkcjsKLQlzdHJ1Y3QgYXVkbXAzX2lvbl9yZWdpb24gKnJlZ2lvbjsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGU7Ci0JdW5zaWduZWQgbG9uZyBpb25mbGFnOwotCXZvaWQgKnRlbXBfcHRyOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlyZWdpb24gPSBrbWFsbG9jKHNpemVvZigqcmVnaW9uKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIXJlZ2lvbikgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZW5kOwotCX0KLQotCWhhbmRsZSA9IGlvbl9pbXBvcnRfZG1hX2J1ZihhdWRpby0+Y2xpZW50LCBpbmZvLT5mZCk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGhhbmRsZSkpIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBoYW5kbGUgb2YgdGhlIGdpdmVuIGZkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gaW1wb3J0X2Vycm9yOwotCX0KLQotCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MoYXVkaW8tPmNsaWVudCwgaGFuZGxlLCAmaW9uZmxhZyk7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIsIF9fZnVuY19fKTsKLQkJZ290byBmbGFnX2Vycm9yOwotCX0KLQotCXRlbXBfcHRyID0gaW9uX21hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgaGFuZGxlKTsKLQlpZiAoSVNfRVJSX09SX05VTEwodGVtcF9wdHIpKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgdmlydHVhbCBhZGRyZXNzXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gbWFwX2Vycm9yOwotCX0KLQlrdmFkZHIgPSAodW5zaWduZWQgbG9uZykgdGVtcF9wdHI7Ci0KLQlyYyA9IGlvbl9waHlzKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSwgJnBhZGRyLCAmbGVuKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBwaHlzaWNhbCBhZGRyZXNzXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gaW9uX2Vycm9yOwotCX0KLQotCXJjID0gYXVkbXAzX2lvbl9jaGVjayhhdWRpbywgaW5mby0+dmFkZHIsIGxlbik7Ci0JaWYgKHJjIDwgMCkgewotCQlNTV9FUlIoImF1ZHBjbV9pb25fY2hlY2sgZmFpbGVkXG4iKTsKLQkJZ290byBpb25fZXJyb3I7Ci0JfQotCi0JcmVnaW9uLT5oYW5kbGUgPSBoYW5kbGU7Ci0JcmVnaW9uLT52YWRkciA9IGluZm8tPnZhZGRyOwotCXJlZ2lvbi0+ZmQgPSBpbmZvLT5mZDsKLQlyZWdpb24tPnBhZGRyID0gcGFkZHI7Ci0JcmVnaW9uLT5rdmFkZHIgPSBrdmFkZHI7Ci0JcmVnaW9uLT5sZW4gPSBsZW47Ci0JcmVnaW9uLT5yZWZfY250ID0gMDsKLQlNTV9EQkcoIlslcF06YWRkIHJlZ2lvbiBwYWRkciAlbHggdmFkZHIgJXAsIGxlbiAlbHUga3ZhZGRyICVseFxuIiwKLQkJYXVkaW8sIHJlZ2lvbi0+cGFkZHIsIHJlZ2lvbi0+dmFkZHIsCi0JCXJlZ2lvbi0+bGVuLCByZWdpb24tPmt2YWRkcik7Ci0JbGlzdF9hZGRfdGFpbCgmcmVnaW9uLT5saXN0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUpOwotCXJldHVybiByYzsKLQotaW9uX2Vycm9yOgotCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgaGFuZGxlKTsKLW1hcF9lcnJvcjoKLWZsYWdfZXJyb3I6Ci0JaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgaGFuZGxlKTsKLWltcG9ydF9lcnJvcjoKLQlrZnJlZShyZWdpb24pOwotZW5kOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRtcDNfaW9uX3JlbW92ZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQkJc3RydWN0IG1zbV9hdWRpb19pb25faW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3QgYXVkbXAzX2lvbl9yZWdpb24gKnJlZ2lvbjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCWludCByYyA9IC1FSU5WQUw7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUpIHsKLQkJcmVnaW9uID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhdWRtcDNfaW9uX3JlZ2lvbiwgbGlzdCk7Ci0KLQkJaWYgKHJlZ2lvbiAhPSBOVUxMICYmIChyZWdpb24tPmZkID09IGluZm8tPmZkKSAmJgotCQkgICAgKHJlZ2lvbi0+dmFkZHIgPT0gaW5mby0+dmFkZHIpKSB7Ci0JCQlpZiAocmVnaW9uLT5yZWZfY250KSB7Ci0JCQkJTU1fREJHKCIlc1slcF06cmVnaW9uICVwIGluIHVzZSByZWZfY250ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8sIHJlZ2lvbiwKLQkJCQkJcmVnaW9uLT5yZWZfY250KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCU1NX0RCRygicmVtb3ZlIHJlZ2lvbiBmZCAlZCB2YWRkciAlcFxuIiwKLQkJCQlpbmZvLT5mZCwgaW5mby0+dmFkZHIpOwotCQkJbGlzdF9kZWwoJnJlZ2lvbi0+bGlzdCk7Ci0JCQlpb25fdW5tYXBfa2VybmVsKGF1ZGlvLT5jbGllbnQsIHJlZ2lvbi0+aGFuZGxlKTsKLQkJCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIHJlZ2lvbi0+aGFuZGxlKTsKLQkJCWtmcmVlKHJlZ2lvbik7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRtcDNfaW9uX2xvb2t1cF92YWRkcihzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB2b2lkICphZGRyLAotCQkJdW5zaWduZWQgbG9uZyBsZW4sIHN0cnVjdCBhdWRtcDNfaW9uX3JlZ2lvbiAqKnJlZ2lvbikKLXsKLQlzdHJ1Y3QgYXVkbXAzX2lvbl9yZWdpb24gKnJlZ2lvbl9lbHQ7Ci0JaW50IG1hdGNoX2NvdW50ID0gMDsKLQkqcmVnaW9uID0gTlVMTDsKLQotCS8qIHJldHVybnMgcGh5c2ljYWwgYWRkcmVzcyBvciB6ZXJvICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZWdpb25fZWx0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUsIGxpc3QpIHsKLQkJaWYgKGFkZHIgPj0gcmVnaW9uX2VsdC0+dmFkZHIgJiYKLQkJICAgIGFkZHIgPCByZWdpb25fZWx0LT52YWRkciArIHJlZ2lvbl9lbHQtPmxlbiAmJgotCQkgICAgYWRkciArIGxlbiA8PSByZWdpb25fZWx0LT52YWRkciArIHJlZ2lvbl9lbHQtPmxlbikgewotCQkJLyogb2Zmc2V0IHNpbmNlIHdlIGNvdWxkIHBhc3MgdmFkZHIgaW5zaWRlIGEgcmVnaXN0ZXJkCi0JCQkgKiBpb24gYnVmZmVyCi0JCQkgKi8KLQotCQkJbWF0Y2hfY291bnQrKzsKLQkJCWlmICghKnJlZ2lvbikKLQkJCQkqcmVnaW9uID0gcmVnaW9uX2VsdDsKLQkJfQotCX0KLQotCWlmIChtYXRjaF9jb3VudCA+IDEpIHsKLQkJTU1fRVJSKCIlc1slcF06bXVsdGlwbGUgaGl0cyBmb3IgdmFkZHIgJXAsIGxlbiAlbGRcbiIsCi0JCQkgX19mdW5jX18sIGF1ZGlvLCBhZGRyLCBsZW4pOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZ2lvbl9lbHQsICZhdWRpby0+aW9uX3JlZ2lvbl9xdWV1ZSwKLQkJCQkJbGlzdCkgewotCQkJaWYgKGFkZHIgPj0gcmVnaW9uX2VsdC0+dmFkZHIgJiYKLQkJCWFkZHIgPCByZWdpb25fZWx0LT52YWRkciArIHJlZ2lvbl9lbHQtPmxlbiAmJgotCQkJYWRkciArIGxlbiA8PSByZWdpb25fZWx0LT52YWRkciArIHJlZ2lvbl9lbHQtPmxlbikKLQkJCQkJTU1fRVJSKCJcdCVzWyVwXTolcCwgJWxkIC0tPiAlcFxuIiwKLQkJCQkJCV9fZnVuY19fLCBhdWRpbywKLQkJCQkJCXJlZ2lvbl9lbHQtPnZhZGRyLAotCQkJCQkJcmVnaW9uX2VsdC0+bGVuLAotCQkJCQkJKHZvaWQgKilyZWdpb25fZWx0LT5wYWRkcik7Ci0JCX0KLQl9Ci0JcmV0dXJuICpyZWdpb24gPyAwIDogLTE7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgYXVkbXAzX2lvbl9maXh1cChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB2b2lkICphZGRyLAotCQkgICAgdW5zaWduZWQgbG9uZyBsZW4sIGludCByZWZfdXApCi17Ci0Jc3RydWN0IGF1ZG1wM19pb25fcmVnaW9uICpyZWdpb247Ci0JdW5zaWduZWQgbG9uZyBwYWRkcjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYXVkbXAzX2lvbl9sb29rdXBfdmFkZHIoYXVkaW8sIGFkZHIsIGxlbiwgJnJlZ2lvbik7Ci0JaWYgKHJldCkgewotCQlNTV9FUlIoImxvb2t1cCAoJXAsICVsZCkgZmFpbGVkXG4iLCBhZGRyLCBsZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHJlZl91cCkKLQkJcmVnaW9uLT5yZWZfY250Kys7Ci0JZWxzZQotCQlyZWdpb24tPnJlZl9jbnQtLTsKLQlNTV9EQkcoImZvdW5kIHJlZ2lvbiAlcCByZWZfY250ICVkXG4iLCByZWdpb24sIHJlZ2lvbi0+cmVmX2NudCk7Ci0JcGFkZHIgPSByZWdpb24tPnBhZGRyICsgKGFkZHIgLSByZWdpb24tPnZhZGRyKTsKLQlyZXR1cm4gcGFkZHI7Ci19Ci0KLS8qIGF1ZGlvIC0+IGxvY2sgbXVzdCBiZSBoZWxkIGF0IHRoaXMgcG9pbnQgKi8KLXN0YXRpYyBpbnQgYXVkbXAzX2Fpb19idWZfYWRkKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVuc2lnbmVkIGRpciwKLQl2b2lkIF9fdXNlciAqYXJnKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGF1ZG1wM19idWZmZXJfbm9kZSAqYnVmX25vZGU7Ci0KLQlidWZfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKCpidWZfbm9kZSksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFidWZfbm9kZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1Zl9ub2RlLT5idWYsIGFyZywgc2l6ZW9mKGJ1Zl9ub2RlLT5idWYpKSkgewotCQlrZnJlZShidWZfbm9kZSk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCU1NX0RCRygibm9kZSAlcCBkaXIgJXggYnVmX2FkZHIgJXAgYnVmX2xlbiAlZCBkYXRhX2xlbiBcCi0JCQklZFxuIiwgYnVmX25vZGUsIGRpciwKLQkJCWJ1Zl9ub2RlLT5idWYuYnVmX2FkZHIsIGJ1Zl9ub2RlLT5idWYuYnVmX2xlbiwKLQkJCWJ1Zl9ub2RlLT5idWYuZGF0YV9sZW4pOwotCi0JYnVmX25vZGUtPnBhZGRyID0gYXVkbXAzX2lvbl9maXh1cCgKLQkJYXVkaW8sIGJ1Zl9ub2RlLT5idWYuYnVmX2FkZHIsCi0JCWJ1Zl9ub2RlLT5idWYuYnVmX2xlbiwgMSk7Ci0KLQlpZiAoZGlyKSB7Ci0JCS8qIHdyaXRlICovCi0JCWlmICghYnVmX25vZGUtPnBhZGRyIHx8Ci0JCSAgICAoYnVmX25vZGUtPnBhZGRyICYgMHgxKSB8fAotCQkgICAgKGJ1Zl9ub2RlLT5idWYuZGF0YV9sZW4gJiAweDEpIHx8Ci0JCSAgICAoIWF1ZGlvLT5wY21fZmVlZGJhY2sgJiYKLQkJICAgICFidWZfbm9kZS0+YnVmLmRhdGFfbGVuKSkgewotCQkJa2ZyZWUoYnVmX25vZGUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwgJmF1ZGlvLT5vdXRfcXVldWUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPmRydl9vcHMuc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQl9IGVsc2UgewotCQkvKiByZWFkICovCi0JCWlmICghYnVmX25vZGUtPnBhZGRyIHx8Ci0JCSAgICAoYnVmX25vZGUtPnBhZGRyICYgMHgxKSB8fAotCQkgICAgKGJ1Zl9ub2RlLT5idWYuYnVmX2xlbiA8IFBDTV9CVUZTWl9NSU4pKSB7Ci0JCQlrZnJlZShidWZfbm9kZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmYXVkaW8tPmluX3F1ZXVlKTsKLQkJYXVkaW8tPmRydl9vcHMuYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQl9Ci0KLQlNTV9EQkcoIkFkZCBidWZfbm9kZSAlcCBwYWRkciAlbHhcbiIsIGJ1Zl9ub2RlLCBidWZfbm9kZS0+cGFkZHIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZW5hYmxlX2VxKHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0JaWYgKGF1ZGlvLT5lcV9lbmFibGUgPT0gZW5hYmxlICYmICFhdWRpby0+ZXFfbmVlZHNfY29tbWl0KQotCQlyZXR1cm4gMDsKLQotCWF1ZGlvLT5lcV9lbmFibGUgPSBlbmFibGU7Ci0KLQlpZiAoYXVkaW8tPnJ1bm5pbmcpIHsKLQkJYXVkcHBfZHNwX3NldF9lcShhdWRpby0+ZGVjX2lkLCBlbmFibGUsICZhdWRpby0+ZXEpOwotCQlhdWRpby0+ZXFfbmVlZHNfY29tbWl0ID0gMDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIGF1ZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0JdWludDE2X3QgZW5hYmxlX21hc2s7Ci0JaW50IGVuYWJsZTsKLQlpbnQgcHJldl9zdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGlvbmZsYWcgPSAwOwotCWlvbl9waHlzX2FkZHJfdCBhZGRyID0gMDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKLQlpbnQgbGVuID0gMDsKLQotCU1NX0RCRygiY21kID0gJWRcbiIsIGNtZCk7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCQlzdGF0cy5ieXRlX2NvdW50ID0gYXVkcHBfYXZzeW5jX2J5dGVfY291bnQoYXVkaW8tPmRlY19pZCk7Ci0JCXN0YXRzLnNhbXBsZV9jb3VudCA9IGF1ZHBwX2F2c3luY19zYW1wbGVfY291bnQoYXVkaW8tPmRlY19pZCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCX0KLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19FTkFCTEVfQVVEUFA6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZW5hYmxlX21hc2ssICh2b2lkICopIGFyZywKLQkJCQkJCXNpemVvZihlbmFibGVfbWFzaykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJZW5hYmxlID0gKGVuYWJsZV9tYXNrICYgRVFfRU5BQkxFKSA/IDEgOiAwOwotCQlhdWRpb19lbmFibGVfZXEoYXVkaW8sIGVuYWJsZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX1ZPTFVNRToKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+dm9sX3Bhbi52b2x1bWUgPSBhcmc7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihhdWRpby0+ZGVjX2lkLCAmYXVkaW8tPnZvbF9wYW4pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fU0VUX1BBTjoKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+dm9sX3Bhbi5wYW4gPSBhcmc7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihhdWRpby0+ZGVjX2lkLCAmYXVkaW8tPnZvbF9wYW4pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fU0VUX0VROgotCQlwcmV2X3N0YXRlID0gYXVkaW8tPmVxX2VuYWJsZTsKLQkJYXVkaW8tPmVxX2VuYWJsZSA9IDA7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYXVkaW8tPmVxLm51bV9iYW5kcywgKHZvaWQgKikgYXJnLAotCQkJCXNpemVvZihhdWRpby0+ZXEpIC0KLQkJCQkoQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TX0NPTU1PTl9MRU4gKyAyKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWF1ZGlvLT5lcV9lbmFibGUgPSBwcmV2X3N0YXRlOwotCQlhdWRpby0+ZXFfbmVlZHNfY29tbWl0ID0gMTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoLUVJTlZBTCAhPSByYykKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfRVZFTlQpIHsKLQkJTU1fREJHKCIgQVVESU9fR0VUX0VWRU5UXG4iKTsKLQkJaWYgKG11dGV4X3RyeWxvY2soJmF1ZGlvLT5nZXRfZXZlbnRfbG9jaykpIHsKLQkJCXJjID0gYXVkbXAzX3Byb2Nlc3NfZXZlbnRfcmVxKGF1ZGlvLAotCQkJCSh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCQl9IGVsc2UKLQkJCXJjID0gLUVCVVNZOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKGNtZCA9PSBBVURJT19BQk9SVF9HRVRfRVZFTlQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCQlNTV9EQkcoIkFVRElPX1NUQVJUXG4iKTsKLQkJcmMgPSBhdWRpb19lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUsCi0JCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0RFQ09ERVJfV0FJVF9NUykpOwotCQkJTU1fSU5GTygiZGVjX3N0YXRlICVkIHJjID0gJWRcbiIsIGF1ZGlvLT5kZWNfc3RhdGUsIHJjKTsKLQotCQkJaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1MpCi0JCQkJcmMgPSAtRU5PREVWOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NUT1A6Ci0JCU1NX0RCRygiQVVESU9fU1RPUFxuIik7Ci0JCXJjID0gYXVkaW9fZGlzYWJsZShhdWRpbyk7Ci0JCWF1ZGlvX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19GTFVTSDoKLQkJTU1fREJHKCJBVURJT19GTFVTSFxuIik7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAxOwotCQlhdWRpby0+d2ZsdXNoID0gMTsKLQkJYXVkaW9faW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCQlhdWRwcF9mbHVzaChhdWRpby0+ZGVjX2lkKTsKLQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCSFhdWRpby0+d2ZsdXNoKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlNTV9FUlIoIkFVRElPX0ZMVVNIIGludGVycnVwdGVkXG4iKTsKLQkJCQlyYyA9IC1FSU5UUjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX1NFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbmZpZywgKHZvaWQgKikgYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjb25maWcuY2hhbm5lbF9jb3VudCA9PSAxKSB7Ci0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IEFVRFBQX0NNRF9QQ01fSU5URl9NT05PX1Y7Ci0JCX0gZWxzZSBpZiAoY29uZmlnLmNoYW5uZWxfY291bnQgPT0gMikgewotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSBBVURQUF9DTURfUENNX0lOVEZfU1RFUkVPX1Y7Ci0JCX0gZWxzZSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlhdWRpby0+bWZpZWxkID0gY29uZmlnLm1ldGFfZmllbGQ7Ci0JCWF1ZGlvLT5vdXRfc2FtcGxlX3JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0JCWF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID0gY29uZmlnLmNoYW5uZWxfY291bnQ7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjb25maWc7Ci0JCWNvbmZpZy5idWZmZXJfc2l6ZSA9IChhdWRpby0+b3V0X2RtYV9zeiA+PiAxKTsKLQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IDI7Ci0JCWNvbmZpZy5zYW1wbGVfcmF0ZSA9IGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGU7Ci0JCWlmIChhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9PSBBVURQUF9DTURfUENNX0lOVEZfTU9OT19WKSB7Ci0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IDI7Ci0JCX0KLQkJY29uZmlnLm1ldGFfZmllbGQgPSAwOwotCQljb25maWcudW51c2VkWzBdID0gMDsKLQkJY29uZmlnLnVudXNlZFsxXSA9IDA7Ci0JCWNvbmZpZy51bnVzZWRbMl0gPSAwOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0gZWxzZSB7Ci0JCQlyYyA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX1BDTV9DT05GSUc6ewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3BjbV9jb25maWcgY29uZmlnOwotCQljb25maWcucGNtX2ZlZWRiYWNrID0gYXVkaW8tPnBjbV9mZWVkYmFjazsKLQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfTUFYX0NPVU5UOwotCQljb25maWcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY29uZmlnLAotCQkJIHNpemVvZihjb25maWcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfUENNX0NPTkZJRzp7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX3BjbV9jb25maWcgY29uZmlnOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkgICAgKCZjb25maWcsICh2b2lkICopYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChjb25maWcucGNtX2ZlZWRiYWNrICE9IGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJCQlNTV9FUlIoIk5vdCBzdWZmaWNpZW50IHBlcm1pc3Npb24gdG8iCi0JCQkJCSAiY2hhbmdlIHRoZSBwbGF5YmFjayBtb2RlXG4iKTsKLQkJCQlyYyA9IC1FQUNDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19BSU9fSU5URikgewotCQkJCXJjID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKChjb25maWcuYnVmZmVyX2NvdW50ID4gUENNX0JVRl9NQVhfQ09VTlQpIHx8Ci0JCQkgICAgKGNvbmZpZy5idWZmZXJfY291bnQgPT0gMSkpCi0JCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfTUFYX0NPVU5UOwotCi0JCQlpZiAoY29uZmlnLmJ1ZmZlcl9zaXplIDwgUENNX0JVRlNaX01JTikKLQkJCQljb25maWcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCi0JCQkvKiBDaGVjayBpZiBwY20gZmVlZGJhY2sgaXMgcmVxdWlyZWQgKi8KLQkJCWlmICgoY29uZmlnLnBjbV9mZWVkYmFjaykgJiYgKCFhdWRpby0+cmVhZF9kYXRhKSkgewotCQkJCU1NX0RCRygiYWxsb2NhdGUgUENNIGJ1ZmZlciAlZFxuIiwKLQkJCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCAqCi0JCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSk7Ci0KLQkJCQloYW5kbGUgPSBpb25fYWxsb2MoYXVkaW8tPmNsaWVudCwKLQkJCQkJKGNvbmZpZy5idWZmZXJfc2l6ZSAqCi0JCQkJCWNvbmZpZy5idWZmZXJfY291bnQpLAotCQkJCQlTWl80SywgSU9OX0hFQVAoSU9OX0FVRElPX0hFQVBfSUQpLCAwKTsKLQkJCQlpZiAoSVNfRVJSX09SX05VTEwoaGFuZGxlKSkgewotCQkJCQlNTV9FUlIoIlVuYWJsZSB0byBhbGxvYyBJL1AgYnVmZnNcbiIpOwotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IGhhbmRsZTsKLQotCQkJCXJjID0gaW9uX3BoeXMoYXVkaW8tPmNsaWVudCAsCi0JCQkJCWhhbmRsZSwgJmFkZHIsICZsZW4pOwotCQkJCWlmIChyYykgewotCQkJCQlNTV9FUlIoIkludmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkJCQkodW5zaWduZWQgaW50KSBhZGRyLAotCQkJCQkJKHVuc2lnbmVkIGludCkgbGVuKTsKLQkJCQkJcmMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQlNTV9JTkZPKCJHb3QgdmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkJCQkodW5zaWduZWQgaW50KSBhdWRpby0+cmVhZF9waHlzLAotCQkJCQkJKHVuc2lnbmVkIGludCkgbGVuKTsKLQkJCQl9Ci0JCQkJYXVkaW8tPnJlYWRfcGh5cyA9IChpbnQzMl90KWFkZHI7Ci0KLQkJCQlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKGF1ZGlvLT5jbGllbnQsCi0JCQkJCWhhbmRsZSwgJmlvbmZsYWcpOwotCQkJCWlmIChyYykgewotCQkJCQlNTV9FUlIoImNvdWxkIG5vdCBnZXQgZmxhZ3NcbiIpOwotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWF1ZGlvLT5tYXBfdl9yZWFkID0gaW9uX21hcF9rZXJuZWwoCi0JCQkJCWF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci0KLQkJCQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl9yZWFkKSkgewotCQkJCQlNTV9FUlIoIm1hcCBvZiByZWFkIGJ1ZiBmYWlsZWRcbiIpOwotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdWludDhfdCBpbmRleDsKLQkJCQkJdWludDMyX3Qgb2Zmc2V0ID0gMDsKLQkJCQkJYXVkaW8tPnJlYWRfZGF0YSA9Ci0JCQkJCQlhdWRpby0+bWFwX3ZfcmVhZDsKLQkJCQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQkJCQkJYXVkaW8tPnBjbV9idWZfY291bnQgPQotCQkJCQkgICAgY29uZmlnLmJ1ZmZlcl9jb3VudDsKLQkJCQkJYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JCQkJCWF1ZGlvLT5maWxsX25leHQgPSAwOwotCi0JCQkJCWZvciAoaW5kZXggPSAwOwotCQkJCQkgICAgIGluZGV4IDwgY29uZmlnLmJ1ZmZlcl9jb3VudDsKLQkJCQkJICAgICBpbmRleCsrKSB7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLmRhdGEgPQotCQkJCQkJICAgIGF1ZGlvLT5yZWFkX2RhdGEgKyBvZmZzZXQ7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLmFkZHIgPQotCQkJCQkJICAgIGF1ZGlvLT5yZWFkX3BoeXMgKyBvZmZzZXQ7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLnNpemUgPQotCQkJCQkJICAgIGNvbmZpZy5idWZmZXJfc2l6ZTsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0udXNlZCA9IDA7Ci0JCQkJCQlvZmZzZXQgKz0gY29uZmlnLmJ1ZmZlcl9zaXplOwotCQkJCQl9Ci0JCQkJCXJjID0gMDsKLQkJCQkJTU1fREJHKCJyZWFkIGJ1ZjogcGh5IGFkZHIgXAotCQkJCQkJMHglMDh4IGtlcm5lbCBhZGRyIDB4JTA4eFxuIiwKLQkJCQkJCWF1ZGlvLT5yZWFkX3BoeXMsCi0JCQkJCQkoaW50KWF1ZGlvLT5yZWFkX2RhdGEpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmMgPSAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX1BBVVNFOgotCQlNTV9EQkcoIkFVRElPX1BBVVNFICVsZFxuIiwgYXJnKTsKLQkJcmMgPSBhdWRwcF9wYXVzZShhdWRpby0+ZGVjX2lkLCAoaW50KSBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fUkVHSVNURVJfSU9OOiB7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX2lvbl9pbmZvIGluZm87Ci0JCQlNTV9EQkcoIkFVRElPX1JFR0lTVEVSX0lPTlxuIik7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sICh2b2lkICopIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQllbHNlCi0JCQkJcmMgPSBhdWRtcDNfaW9uX2FkZChhdWRpbywgJmluZm8pOwotCQkJYnJlYWs7Ci0JCX0KLQotCWNhc2UgQVVESU9fREVSRUdJU1RFUl9JT046IHsKLQkJCXN0cnVjdCBtc21fYXVkaW9faW9uX2luZm8gaW5mbzsKLQkJCU1NX0RCRygiQVVESU9fREVSRUdJU1RFUl9JT05cbiIpOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCAodm9pZCAqKSBhcmcsIHNpemVvZihpbmZvKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJZWxzZQotCQkJCXJjID0gYXVkbXAzX2lvbl9yZW1vdmUoYXVkaW8sICZpbmZvKTsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19BU1lOQ19XUklURToKLQkJaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfRlNZTkMpCi0JCQlyYyA9IC1FQlVTWTsKLQkJZWxzZQotCQkJcmMgPSBhdWRtcDNfYWlvX2J1Zl9hZGQoYXVkaW8sIDEsICh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fQVNZTkNfUkVBRDoKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCQlyYyA9IGF1ZG1wM19haW9fYnVmX2FkZChhdWRpbywgMCwgKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCWVsc2UKLQkJCXJjID0gLUVQRVJNOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKiBPbmx5IHVzZWZ1bCBpbiB0dW5uZWwtbW9kZSAqLwotaW50IGF1ZG1wM19hc3luY19mc3luYyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCi0JLyogQmxvY2tpbmcgY2xpZW50IHNlbmRzIG1vcmUgZGF0YSAqLwotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRpby0+ZHJ2X3N0YXR1cyB8PSBBRFJWX1NUQVRVU19GU1lOQzsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQkvKiBwY20gZG1hbWlzcyBtZXNzYWdlIGlzIHNlbnQgY29udGlub3VzbHkKLQkgKiB3aGVuIGRlY29kZXIgaXMgc3RhcnZlZCBzbyBubyByYWNlCi0JICogY29uZGl0aW9uIGNvbmNlcm4KLQkgKi8KLQlhdWRpby0+dGVvcyA9IDA7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKGF1ZGlvLT50ZW9zICYmIGF1ZGlvLT5vdXRfbmVlZGVkICYmCi0JCWxpc3RfZW1wdHkoJmF1ZGlvLT5vdXRfcXVldWUpKQotCQl8fCBhdWRpby0+d2ZsdXNoIHx8IGF1ZGlvLT5zdG9wcGVkKTsKLQotCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKQotCQlyYyA9IC1FQlVTWTsKLQotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRpby0+ZHJ2X3N0YXR1cyAmPSB+QURSVl9TVEFUVVNfRlNZTkM7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBhdWRtcDNfc3luY19mc3luYyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCSghYXVkaW8tPm91dFswXS51c2VkICYmCi0JCSFhdWRpby0+b3V0WzFdLnVzZWQgJiYKLQkJYXVkaW8tPm91dF9uZWVkZWQpIHx8IGF1ZGlvLT53Zmx1c2gpOwotCi0JaWYgKHJjIDwgMCkKLQkJZ290byBkb25lOwotCWVsc2UgaWYgKGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoYXVkaW8tPnJlc2VydmVkKSB7Ci0JCU1NX0RCRygic2VuZCByZXNlcnZlZCBieXRlXG4iKTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQkoKGNoYXIgKikgZnJhbWUtPmRhdGEpWzBdID0gYXVkaW8tPnJzdl9ieXRlOwotCQkoKGNoYXIgKikgZnJhbWUtPmRhdGEpWzFdID0gMDsKLQkJZnJhbWUtPnVzZWQgPSAyOwotCQlhdWRpby0+ZHJ2X29wcy5zZW5kX2RhdGEoYXVkaW8sIDApOwotCi0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJKCFhdWRpby0+b3V0WzBdLnVzZWQgJiYKLQkJCSFhdWRpby0+b3V0WzFdLnVzZWQgJiYKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkKSB8fCBhdWRpby0+d2ZsdXNoKTsKLQotCQlpZiAocmMgPCAwKQotCQkJZ290byBkb25lOwotCQllbHNlIGlmIChhdWRpby0+d2ZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCS8qIHBjbSBkbWFtaXNzIG1lc3NhZ2UgaXMgc2VudCBjb250aW5vdXNseQotCSAqIHdoZW4gZGVjb2RlciBpcyBzdGFydmVkIHNvIG5vIHJhY2UKLQkgKiBjb25kaXRpb24gY29uY2VybgotCSAqLwotCWF1ZGlvLT50ZW9zID0gMDsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQlhdWRpby0+dGVvcyB8fCBhdWRpby0+d2ZsdXNoKTsKLQotCWlmIChhdWRpby0+d2ZsdXNoKQotCQlyYyA9IC1FQlVTWTsKLQotZG9uZToKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBhdWRtcDNfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBhLCBsb2ZmX3QgYiwgaW50IGRhdGFzeW5jKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoIWF1ZGlvLT5ydW5uaW5nIHx8IGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIGF1ZGlvLT5kcnZfb3BzLmZzeW5jKGF1ZGlvKTsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkaW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJICBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfQUlPX0lOVEYpCi0JCXJldHVybiAtRVBFUk07Ci0JZWxzZSBpZiAoIWF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCXJldHVybiAwOyAvKiBQQ00gZmVlZGJhY2sgZGlzYWJsZWQuIE5vdGhpbmcgdG8gcmVhZCAqLwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JTU1fREJHKCIlZCBcbiIsCWNvdW50KTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAotCQkJYXVkaW8tPnJlYWRfd2FpdCwKLQkJCShhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0uCi0JCQl1c2VkID4gMCkgfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQkJfHwgKGF1ZGlvLT5yZmx1c2gpKTsKLQotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT5yZmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY291bnQgPCBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCkgewotCQkJLyogUmVhZCBtdXN0IGhhcHBlbiBpbiBmcmFtZSBib3VuZGFyeS4gU2luY2UKLQkJCSAqIGRyaXZlciBkb2VzIG5vdCBrbm93IGZyYW1lIHNpemUsIHJlYWQgY291bnQKLQkJCSAqIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbAotCQkJICogdG8gc2l6ZSBvZiBQQ00gc2FtcGxlcwotCQkJICovCi0JCQlNTV9EQkcoIm5vIHBhcnRpYWwgZnJhbWUgZG9uZSByZWFkaW5nXG4iKTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJTU1fREJHKCJyZWFkIGZyb20gaW5bJWRdXG4iLCBhdWRpby0+cmVhZF9uZXh0KTsKLQkJCS8qIG9yZGVyIHJlYWRzIGZyb20gdGhlIG91dHB1dCBidWZmZXIgKi8KLQkJCXJtYigpOwotCQkJaWYgKGNvcHlfdG9fdXNlcgotCQkJICAgIChidWYsIGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS5kYXRhLAotCQkJICAgICBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCkpIHsKLQkJCQlNTV9FUlIoImludmFsaWQgYWRkciAleCBcbiIsICh1bnNpZ25lZCBpbnQpYnVmKTsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljb3VudCAtPSBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZDsKLQkJCWJ1ZiArPSBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZDsKLQkJCWF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkID0gMDsKLQkJCWlmICgoKythdWRpby0+cmVhZF9uZXh0KSA9PSBhdWRpby0+cGNtX2J1Zl9jb3VudCkKLQkJCQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQkJCWJyZWFrOwkvKiBGb3JjZSB0byBleGl0IHdoaWxlIGxvb3AKLQkJCQkgKiB0byBwcmV2ZW50IG91dHB1dCB0aHJlYWQKLQkJCQkgKiBzbGVlcCB0b28gbG9uZyBpZiBkYXRhIGlzCi0JCQkJICogbm90IHJlYWR5IGF0IHRoaXMgbW9tZW50LgotCQkJCSAqLwotCQl9Ci0JfQotCi0JLyogZG9uJ3QgZmVlZCBvdXRwdXQgYnVmZmVyIHRvIEhXIGRlY29kZXIgZHVyaW5nIGZsdXNoaW5nCi0JICogYnVmZmVyIHJlZnJlc2ggY29tbWFuZCB3aWxsIGJlIHNlbnQgb25jZSBmbHVzaCBjb21wbGV0ZXMKLQkgKiBzZW5kIGJ1ZiByZWZyZXNoIGNvbW1hbmQgaGVyZSBjYW4gY29uZnVzZSBIVyBkZWNvZGVyCi0JICovCi0JaWYgKGF1ZGlvLT5idWZfcmVmcmVzaCAmJiAhYXVkaW8tPnJmbHVzaCkgewotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCQlNTV9EQkcoImtpY2sgc3RhcnQgcGNtIGZlZWRiYWNrIGFnYWluXG4iKTsKLQkJYXVkaW8tPmRydl9vcHMuYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCX0KLQotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0KLQlpZiAoYnVmID4gc3RhcnQpCi0JCXJjID0gYnVmIC0gc3RhcnQ7Ci0KLQlNTV9EQkcoInJlYWQgJWQgYnl0ZXNcbiIsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkbXAzX3Byb2Nlc3NfZW9zKHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCWNvbnN0IGNoYXIgX191c2VyICpidWZfc3RhcnQsIHVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JY2hhciAqYnVmX3B0cjsKLQotCWlmIChhdWRpby0+cmVzZXJ2ZWQpIHsKLQkJTU1fREJHKCJmbHVzaCByZXNlcnZlIGJ5dGVcbiIpOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0JCWJ1Zl9wdHIgPSBmcmFtZS0+ZGF0YTsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkoZnJhbWUtPnVzZWQgPT0gMCkKLQkJCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGRvbmU7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWJ1Zl9wdHJbMF0gPSBhdWRpby0+cnN2X2J5dGU7Ci0JCWJ1Zl9wdHJbMV0gPSAwOwotCQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQkJZnJhbWUtPm1maWVsZF9zeiA9IDA7Ci0JCWZyYW1lLT51c2VkID0gMjsKLQkJYXVkaW8tPnJlc2VydmVkID0gMDsKLQkJYXVkaW8tPmRydl9vcHMuc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQl9Ci0KLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKGF1ZGlvLT5vdXRfbmVlZGVkICYmCi0JCWF1ZGlvLT5vdXRbMF0udXNlZCA9PSAwICYmCi0JCWF1ZGlvLT5vdXRbMV0udXNlZCA9PSAwKQotCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoZnJhbWUtPmRhdGEsIGJ1Zl9zdGFydCwgbWZpZWxkX3NpemUpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlmcmFtZS0+dXNlZCA9IG1maWVsZF9zaXplOwotCWF1ZGlvLT5kcnZfb3BzLnNlbmRfZGF0YShhdWRpbywgMCk7Ci1kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCXNpemVfdCB4ZmVyOwotCWNoYXIgKmNweV9wdHI7Ci0JaW50IHJjID0gMCwgZW9zX2NvbmRpdGlvbiA9IEFVRE1QM19FT1NfTk9ORTsKLQl1bnNpZ25lZCBkc2l6ZTsKLQl1bnNpZ25lZCBzaG9ydCBtZmllbGRfc2l6ZSA9IDA7Ci0KLQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19BSU9fSU5URikKLQkJcmV0dXJuIC1FUEVSTTsKLQotCU1NX0RCRygiY250PSVkXG4iLCBjb3VudCk7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0JCWNweV9wdHIgPSBmcmFtZS0+ZGF0YTsKLQkJZHNpemUgPSAwOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkJICAgICAgKGZyYW1lLT51c2VkID09IDApCi0JCQkJCSAgICAgIHx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQkJCSAgfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYXVkaW8tPm1maWVsZCkgewotCQkJaWYgKGJ1ZiA9PSBzdGFydCkgewotCQkJCS8qIFByb2Nlc3NpbmcgYmVnaW5uaW5nIG9mIHVzZXIgYnVmZmVyICovCi0JCQkJaWYgKF9fZ2V0X3VzZXIobWZpZWxkX3NpemUsCi0JCQkJCSh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgYnVmKSkgewotCQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSAgaWYgKG1maWVsZF9zaXplID4gY291bnQpIHsKLQkJCQkJcmMgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJTU1fREJHKCJtZiBvZmZzZXRfdmFsICV4XG4iLCBtZmllbGRfc2l6ZSk7Ci0JCQkJaWYgKGNvcHlfZnJvbV91c2VyKGNweV9wdHIsIGJ1ZiwgbWZpZWxkX3NpemUpKSB7Ci0JCQkJCXJjID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8qIENoZWNrIGlmIEVPUyBmbGFnIGlzIHNldCBhbmQgYnVmZmVyIGhhcwotCQkJCSAqIGNvbnRhaW5zIGp1c3QgbWV0YSBmaWVsZAotCQkJCSAqLwotCQkJCWlmIChjcHlfcHRyW0FVRE1QM19FT1NfRkxHX09GRlNFVF0gJgotCQkJCQkJIEFVRE1QM19FT1NfRkxHX01BU0spIHsKLQkJCQkJTU1fREJHKCJFT1MgU0VUXG4iKTsKLQkJCQkJZW9zX2NvbmRpdGlvbiA9IEFVRE1QM19FT1NfU0VUOwotCQkJCQlpZiAobWZpZWxkX3NpemUgPT0gY291bnQpIHsKLQkJCQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UKLQkJCQkJCWNweV9wdHJbQVVETVAzX0VPU19GTEdfT0ZGU0VUXQotCQkJCQkJCSY9IH5BVURNUDNfRU9TX0ZMR19NQVNLOwotCQkJCX0KLQkJCQljcHlfcHRyICs9IG1maWVsZF9zaXplOwotCQkJCWNvdW50IC09IG1maWVsZF9zaXplOwotCQkJCWRzaXplICs9IG1maWVsZF9zaXplOwotCQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWZpZWxkX3NpemUgPSAwOwotCQkJCU1NX0RCRygiY29udGludW91cyBidWZmZXJcbiIpOwotCQkJfQotCQkJZnJhbWUtPm1maWVsZF9zeiA9IG1maWVsZF9zaXplOwotCQl9Ci0KLQkJaWYgKGF1ZGlvLT5yZXNlcnZlZCkgewotCQkJTU1fREJHKCJhcHBlbmQgcmVzZXJ2ZWQgYnl0ZSAleFxuIiwgYXVkaW8tPnJzdl9ieXRlKTsKLQkJCSpjcHlfcHRyID0gYXVkaW8tPnJzdl9ieXRlOwotCQkJeGZlciA9IChjb3VudCA+ICgoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkgLSAxKSkgPwotCQkJCShmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSAtIDEgOiBjb3VudDsKLQkJCWNweV9wdHIrKzsKLQkJCWRzaXplICs9IDE7Ci0JCQlhdWRpby0+cmVzZXJ2ZWQgPSAwOwotCQl9IGVsc2UKLQkJCXhmZXIgPSAoY291bnQgPiAoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkpID8KLQkJCQkoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkgOiBjb3VudDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCB4ZmVyKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlkc2l6ZSArPSB4ZmVyOwotCQlpZiAoZHNpemUgJiAxKSB7Ci0JCQlhdWRpby0+cnN2X2J5dGUgPSAoKGNoYXIgKikgZnJhbWUtPmRhdGEpW2RzaXplIC0gMV07Ci0JCQlNTV9EQkcoIm9kZCBsZW5ndGggYnVmIHJlc2VydmUgbGFzdCBieXRlICV4XG4iLAotCQkJCQlhdWRpby0+cnN2X2J5dGUpOwotCQkJYXVkaW8tPnJlc2VydmVkID0gMTsKLQkJCWRzaXplLS07Ci0JCX0KLQkJY291bnQgLT0geGZlcjsKLQkJYnVmICs9IHhmZXI7Ci0KLQkJaWYgKGRzaXplID4gMCkgewotCQkJYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JCQlmcmFtZS0+dXNlZCA9IGRzaXplOwotCQkJYXVkaW8tPmRydl9vcHMuc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQkJfQotCX0KLQlpZiAoZW9zX2NvbmRpdGlvbiA9PSBBVURNUDNfRU9TX1NFVCkKLQkJcmMgPSBhdWRtcDNfcHJvY2Vzc19lb3MoYXVkaW8sIHN0YXJ0LCBtZmllbGRfc2l6ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JaWYgKCFyYykgewotCQlpZiAoYnVmID4gc3RhcnQpCi0JCQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci0JfQotCXJldHVybiByYzsKLX0KLXN0YXRpYyB2b2lkIGF1ZG1wM19yZXNldF9pb25fcmVnaW9uKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZG1wM19pb25fcmVnaW9uICpyZWdpb247Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhdWRpby0+aW9uX3JlZ2lvbl9xdWV1ZSkgewotCQlyZWdpb24gPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGF1ZG1wM19pb25fcmVnaW9uLCBsaXN0KTsKLQkJbGlzdF9kZWwoJnJlZ2lvbi0+bGlzdCk7Ci0JCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgcmVnaW9uLT5oYW5kbGUpOwotCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCByZWdpb24tPmhhbmRsZSk7Ci0JCWtmcmVlKHJlZ2lvbik7Ci0JfQotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCU1NX0lORk8oImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBmcmVlaW5nXG4iLCAoaW50KWF1ZGlvKTsKLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkaW9fZGlzYWJsZShhdWRpbyk7Ci0JaWYgKGF1ZGlvLT5ybXRfcmVzb3VyY2VfcmVsZWFzZWQgPT0gMCkKLQkJcm10X3B1dF9yZXNvdXJjZShhdWRpbyk7Ci0JYXVkaW8tPmRydl9vcHMub3V0X2ZsdXNoKGF1ZGlvKTsKLQlhdWRpby0+ZHJ2X29wcy5pbl9mbHVzaChhdWRpbyk7Ci0JYXVkbXAzX3Jlc2V0X2lvbl9yZWdpb24oYXVkaW8pOwotCi0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRwbGF5KTsKLQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQl1bnJlZ2lzdGVyX2Vhcmx5X3N1c3BlbmQoJmF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlKTsKLSNlbmRpZgotCWF1ZGlvLT5vcGVuZWQgPSAwOwotCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDE7Ci0Jd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCWF1ZG1wM19yZXNldF9ldmVudF9xdWV1ZShhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JaWYgKGF1ZGlvLT5kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKGF1ZGlvLT5kZW50cnkpOwotI2VuZGlmCi0JaWYgKCEoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19BSU9fSU5URikpIHsKLQkJaW9uX3VubWFwX2tlcm5lbChhdWRpby0+Y2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci0JCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLQl9Ci0JaW9uX2NsaWVudF9kZXN0cm95KGF1ZGlvLT5jbGllbnQpOwotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXVkbXAzX3Bvc3RfZXZlbnQoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHR5cGUsCi0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCkKLXsKLQlzdHJ1Y3QgYXVkbXAzX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpKSB7Ci0JCWVfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJc3RydWN0IGF1ZG1wM19ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZlX25vZGUtPmxpc3QpOwotCX0gZWxzZSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRtcDNfZXZlbnQpLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFlX25vZGUpIHsKLQkJCU1NX0VSUigiTm8gbWVtIHRvIHBvc3QgZXZlbnQgJWRcbiIsIHR5cGUpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWVfbm9kZS0+ZXZlbnRfdHlwZSA9IHR5cGU7Ci0JZV9ub2RlLT5wYXlsb2FkID0gcGF5bG9hZDsKLQotCWxpc3RfYWRkX3RhaWwoJmVfbm9kZS0+bGlzdCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RhdGljIHZvaWQgYXVkbXAzX3N1c3BlbmQoc3RydWN0IGVhcmx5X3N1c3BlbmQgKmgpCi17Ci0Jc3RydWN0IGF1ZG1wM19zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWRtcDNfc3VzcGVuZF9jdGwsIG5vZGUpOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWF1ZG1wM19wb3N0X2V2ZW50KGN0bC0+YXVkaW8sIEFVRElPX0VWRU5UX1NVU1BFTkQsIHBheWxvYWQpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRtcDNfcmVzdW1lKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRtcDNfc3VzcGVuZF9jdGwgKmN0bCA9Ci0JCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgYXVkbXAzX3N1c3BlbmRfY3RsLCBub2RlKTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlhdWRtcDNfcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9SRVNVTUUsIHBheWxvYWQpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBzc2l6ZV90IGF1ZG1wM19kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZG1wM19kZWJ1Z19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQljb25zdCBpbnQgZGVidWdfYnVmbWF4ID0gNDA5NjsKLQlzdGF0aWMgY2hhciBidWZmZXJbNDA5Nl07Ci0JaW50IG4gPSAwLCBpOwotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JbiA9IHNjbnByaW50ZihidWZmZXIsIGRlYnVnX2J1Zm1heCwgIm9wZW5lZCAlZFxuIiwgYXVkaW8tPm9wZW5lZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAiZW5hYmxlZCAlZFxuIiwgYXVkaW8tPmVuYWJsZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInN0b3BwZWQgJWRcbiIsIGF1ZGlvLT5zdG9wcGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJwY21fZmVlZGJhY2sgJWRcbiIsIGF1ZGlvLT5wY21fZmVlZGJhY2spOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dF9idWZfc3ogJWRcbiIsIGF1ZGlvLT5vdXRbMF0uc2l6ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicGNtX2J1Zl9jb3VudCAlZCBcbiIsIGF1ZGlvLT5wY21fYnVmX2NvdW50KTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJwY21fYnVmX3N6ICVkIFxuIiwgYXVkaW8tPmluWzBdLnNpemUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInZvbHVtZSAleCBcbiIsIGF1ZGlvLT52b2xfcGFuLnZvbHVtZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAic2FtcGxlIHJhdGUgJWQgXG4iLCBhdWRpby0+b3V0X3NhbXBsZV9yYXRlKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkiY2hhbm5lbCBtb2RlICVkIFxuIiwgYXVkaW8tPm91dF9jaGFubmVsX21vZGUpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCS8qIEZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIG9ubHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgd2hlbgotCSAqIHdoZW4gcGxheWJhY2sgaGFsdHMgdW5leHBlY3RlZGx5LiBUaHVzLCBubyBtdXR1YWwgZXhjbHVzaW9uCi0JICogZW5mb3JjZWQKLQkgKi8KLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJ3Zmx1c2ggJWRcbiIsIGF1ZGlvLT53Zmx1c2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInJmbHVzaCAlZFxuIiwgYXVkaW8tPnJmbHVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicnVubmluZyAlZCBcbiIsIGF1ZGlvLT5ydW5uaW5nKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSJkZWMgc3RhdGUgJWQgXG4iLCBhdWRpby0+ZGVjX3N0YXRlKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfbmVlZGVkICVkIFxuIiwgYXVkaW8tPm91dF9uZWVkZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dF9oZWFkICVkIFxuIiwgYXVkaW8tPm91dF9oZWFkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfdGFpbCAlZCBcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0WzBdLnVzZWQgJWQgXG4iLCBhdWRpby0+b3V0WzBdLnVzZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dFsxXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFsxXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJidWZmZXJfcmVmcmVzaCAlZCBcbiIsIGF1ZGlvLT5idWZfcmVmcmVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicmVhZF9uZXh0ICVkIFxuIiwgYXVkaW8tPnJlYWRfbmV4dCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAiZmlsbF9uZXh0ICVkIFxuIiwgYXVkaW8tPmZpbGxfbmV4dCk7Ci0JZm9yIChpID0gMDsgaSA8IGF1ZGlvLT5wY21fYnVmX2NvdW50OyBpKyspCi0JCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiaW5bJWRdLnNpemUgJWQgXG4iLCBpLCBhdWRpby0+aW5baV0udXNlZCk7Ci0JYnVmZmVyW25dID0gMDsKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkbXAzX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWRtcDNfZGVidWdfcmVhZCwKLQkub3BlbiA9IGF1ZG1wM19kZWJ1Z19vcGVuLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0KLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gTlVMTDsKLQlpbnQgcmMsIGksIGRlY19hdHRyYiwgZGVjaWQ7Ci0Jc3RydWN0IGF1ZG1wM19ldmVudCAqZV9ub2RlID0gTlVMTDsKLQl1bnNpZ25lZCBtZW1fc3ogPSBETUFTWl9NQVg7Ci0JdW5zaWduZWQgbG9uZyBpb25mbGFnID0gMDsKLQlpb25fcGh5c19hZGRyX3QgYWRkciA9IDA7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCA9IE5VTEw7Ci0JaW50IGxlbiA9IDA7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9tcDNfIiArIDVdOwotI2VuZGlmCi0KLQkvKiBBbGxvY2F0ZSBhdWRpbyBpbnN0YW5jZSwgc2V0IHRvIHplcm8gKi8KLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpbyksIEdGUF9LRVJORUwpOwotCWlmICghYXVkaW8pIHsKLQkJTU1fRVJSKCJubyBtZW1vcnkgdG8gYWxsb2NhdGUgYXVkaW8gaW5zdGFuY2UgXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCU1NX0lORk8oImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBjcmVhdGVkXG4iLCAoaW50KWF1ZGlvKTsKLQotCS8qIEFsbG9jYXRlIHRoZSBkZWNvZGVyICovCi0JZGVjX2F0dHJiID0gQVVEREVDX0RFQ19NUDM7Ci0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlkZWNfYXR0cmIgfD0gTVNNX0FVRF9NT0RFX05PTlRVTk5FTDsKLQkJYXVkaW8tPnBjbV9mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERV9QTEFZQkFDSzsKLQl9IGVsc2UgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCSEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9UVU5ORUw7Ci0JCWF1ZGlvLT5wY21fZmVlZGJhY2sgPSBUVU5ORUxfTU9ERV9QTEFZQkFDSzsKLQl9IGVsc2UgewotCQlrZnJlZShhdWRpbyk7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBkb25lOwotCX0KLQotCWRlY2lkID0gYXVkcHBfYWRlY19hbGxvYyhkZWNfYXR0cmIsICZhdWRpby0+bW9kdWxlX25hbWUsCi0JCQkmYXVkaW8tPnF1ZXVlX2lkKTsKLQlpZiAoZGVjaWQgPCAwKSB7Ci0JCU1NX0VSUigiTm8gZnJlZSBkZWNvZGVyIGF2YWlsYWJsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJKGludClhdWRpbyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJa2ZyZWUoYXVkaW8pOwotCQlnb3RvIGRvbmU7Ci0JfQotCWF1ZGlvLT5kZWNfaWQgPSBkZWNpZCAmIE1TTV9BVURfREVDT0RFUl9NQVNLOwotCi0JY2xpZW50ID0gbXNtX2lvbl9jbGllbnRfY3JlYXRlKFVJTlRfTUFYLCAiQXVkaW9fTVAzX0NsaWVudCIpOwotCWlmIChJU19FUlJfT1JfTlVMTChjbGllbnQpKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGNyZWF0ZSBJT04gY2xpZW50XG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGNsaWVudF9jcmVhdGVfZXJyb3I7Ci0JfQotCWF1ZGlvLT5jbGllbnQgPSBjbGllbnQ7Ci0KLQkvKiBOb24gQUlPIGludGVyZmFjZSAqLwotCWlmICghKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkgewotCi0JCU1NX0RCRygibWVtc3ogPSAlZFxuIiwgbWVtX3N6KTsKLQotCQloYW5kbGUgPSBpb25fYWxsb2MoY2xpZW50LCBtZW1fc3osIFNaXzRLLAotCQkJSU9OX0hFQVAoSU9OX0FVRElPX0hFQVBfSUQpLCAwKTsKLQkJaWYgKElTX0VSUl9PUl9OVUxMKGhhbmRsZSkpIHsKLQkJCU1NX0VSUigiVW5hYmxlIHRvIGNyZWF0ZSBhbGxvY2F0ZSBPL1AgYnVmZmVyc1xuIik7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dHB1dF9idWZmX2FsbG9jX2Vycm9yOwotCQl9Ci0JCWF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUgPSBoYW5kbGU7Ci0KLQkJcmMgPSBpb25fcGh5cyhjbGllbnQgLCBoYW5kbGUsICZhZGRyLCAmbGVuKTsKLQkJaWYgKHJjKSB7Ci0JCQlNTV9FUlIoIk8vUCBidWZmZXJzOkludmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkJKHVuc2lnbmVkIGludCkgYWRkciwgKHVuc2lnbmVkIGludCkgbGVuKTsKLQkJCWdvdG8gb3V0cHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9JTkZPKCJPL1AgYnVmZmVyczp2YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCQl9Ci0JCWF1ZGlvLT5waHlzID0gKGludDMyX3QpYWRkcjsKLQotCi0JCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MoY2xpZW50LCBoYW5kbGUsICZpb25mbGFnKTsKLQkJaWYgKHJjKSB7Ci0JCQlNTV9FUlIoImNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIpOwotCQkJZ290byBvdXRwdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I7Ci0JCX0KLQotCQlhdWRpby0+bWFwX3Zfd3JpdGUgPSBpb25fbWFwX2tlcm5lbChjbGllbnQsIGhhbmRsZSk7Ci0JCWlmIChJU19FUlIoYXVkaW8tPm1hcF92X3dyaXRlKSkgewotCQkJTU1fRVJSKCJjb3VsZCBub3QgbWFwIHdyaXRlIGJ1ZmZlcnNcbiIpOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBvdXRwdXRfYnVmZl9tYXBfZXJyb3I7Ci0JCX0KLQkJYXVkaW8tPmRhdGEgPSBhdWRpby0+bWFwX3Zfd3JpdGU7Ci0JCU1NX0RCRygid3JpdGUgYnVmOiBwaHkgYWRkciAweCUwOHgga2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQkJYXVkaW8tPnBoeXMsIChpbnQpYXVkaW8tPmRhdGEpOwotCi0JCWF1ZGlvLT5vdXRfZG1hX3N6ID0gbWVtX3N6OwotCX0KLQotCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrID09IFRVTk5FTF9NT0RFX1BMQVlCQUNLKSB7Ci0JCXJjID0gYXVkbWdyX29wZW4oJmF1ZGlvLT5hdWRtZ3IpOwotCQlpZiAocmMpIHsKLQkJCU1NX0VSUigiYXVkbWdyIG9wZW4gZmFpbGVkLCBmcmVlaW5nIGluc3RhbmNlIFwKLQkJCQkJMHglMDh4XG4iLCAoaW50KWF1ZGlvKTsKLQkJCWlmICghKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKLQkJCQlnb3RvIGVycjsKLQkJCWVsc2UKLQkJCQlnb3RvIHJlc291cmNlX2VycjsKLQkJfQotCX0KLQotCXJjID0gbXNtX2Fkc3BfZ2V0KGF1ZGlvLT5tb2R1bGVfbmFtZSwgJmF1ZGlvLT5hdWRwbGF5LAotCQkmYXVkcGxheV9hZHNwX29wcywgYXVkaW8pOwotCi0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiZmFpbGVkIHRvIGdldCAlcyBtb2R1bGUsIGZyZWVpbmcgaW5zdGFuY2UgMHglMDh4XG4iLAotCQkJCWF1ZGlvLT5tb2R1bGVfbmFtZSwgKGludClhdWRpbyk7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrID09IFRVTk5FTF9NT0RFX1BMQVlCQUNLKQotCQkJYXVkbWdyX2Nsb3NlKCZhdWRpby0+YXVkbWdyKTsKLQkJaWYgKCEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKQotCQkJZ290byBlcnI7Ci0JCWVsc2UKLQkJCWdvdG8gcmVzb3VyY2VfZXJyOwotCX0KLQotCXJjID0gcm10X2dldF9yZXNvdXJjZShhdWRpbyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiQURTUCByZXNvdXJjZXMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIE1QMyBzZXNzaW9uIFwKLQkJCSAweCUwOHggb24gZGVjb2RlcjogJWRcbiIsIChpbnQpYXVkaW8sIGF1ZGlvLT5kZWNfaWQpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykKLQkJCWF1ZG1ncl9jbG9zZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci0JCWlmICghKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKLQkJCWdvdG8gZXJyOwotCQllbHNlCi0JCQlnb3RvIHJlc291cmNlX2VycjsKLQl9Ci0KLQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJTU1fREJHKCJzZXQgdG8gYWlvIGludGVyZmFjZVxuIik7Ci0JCWF1ZGlvLT5kcnZfc3RhdHVzIHw9IEFEUlZfU1RBVFVTX0FJT19JTlRGOwotCQlhdWRpby0+ZHJ2X29wcy5wY21fYnVmX3VwZGF0ZSA9IGF1ZG1wM19hc3luY19wY21fYnVmX3VwZGF0ZTsKLQkJYXVkaW8tPmRydl9vcHMuYnVmZmVyX3JlZnJlc2ggPSBhdWRtcDNfYXN5bmNfYnVmZmVyX3JlZnJlc2g7Ci0JCWF1ZGlvLT5kcnZfb3BzLnNlbmRfZGF0YSA9IGF1ZG1wM19hc3luY19zZW5kX2RhdGE7Ci0JCWF1ZGlvLT5kcnZfb3BzLm91dF9mbHVzaCA9IGF1ZG1wM19hc3luY19mbHVzaDsKLQkJYXVkaW8tPmRydl9vcHMuaW5fZmx1c2ggPSBhdWRtcDNfYXN5bmNfZmx1c2hfcGNtX2J1ZjsKLQkJYXVkaW8tPmRydl9vcHMuZnN5bmMgPSBhdWRtcDNfYXN5bmNfZnN5bmM7Ci0JfSBlbHNlIHsKLQkJTU1fREJHKCJzZXQgdG8gc3RkIGlvIGludGVyZmFjZVxuIik7Ci0JCWF1ZGlvLT5kcnZfb3BzLnBjbV9idWZfdXBkYXRlID0gYXVkaW9fdXBkYXRlX3BjbV9idWZfZW50cnk7Ci0JCWF1ZGlvLT5kcnZfb3BzLmJ1ZmZlcl9yZWZyZXNoID0gYXVkcGxheV9idWZmZXJfcmVmcmVzaDsKLQkJYXVkaW8tPmRydl9vcHMuc2VuZF9kYXRhID0gYXVkcGxheV9zZW5kX2RhdGE7Ci0JCWF1ZGlvLT5kcnZfb3BzLm91dF9mbHVzaCA9IGF1ZGlvX2ZsdXNoOwotCQlhdWRpby0+ZHJ2X29wcy5pbl9mbHVzaCA9IGF1ZGlvX2ZsdXNoX3BjbV9idWY7Ci0JCWF1ZGlvLT5kcnZfb3BzLmZzeW5jID0gYXVkbXAzX3N5bmNfZnN5bmM7Ci0JCWF1ZGlvLT5vdXRbMF0uZGF0YSA9IGF1ZGlvLT5kYXRhICsgMDsKLQkJYXVkaW8tPm91dFswXS5hZGRyID0gYXVkaW8tPnBoeXMgKyAwOwotCQlhdWRpby0+b3V0WzBdLnNpemUgPSAoYXVkaW8tPm91dF9kbWFfc3ogPj4gMSk7Ci0KLQkJYXVkaW8tPm91dFsxXS5kYXRhID0gYXVkaW8tPmRhdGEgKyBhdWRpby0+b3V0WzBdLnNpemU7Ci0JCWF1ZGlvLT5vdXRbMV0uYWRkciA9IGF1ZGlvLT5waHlzICsgYXVkaW8tPm91dFswXS5zaXplOwotCQlhdWRpby0+b3V0WzFdLnNpemUgPSBhdWRpby0+b3V0WzBdLnNpemU7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBhbGwgbG9ja3Mgb2YgYXVkaW8gaW5zdGFuY2UgKi8KLQltdXRleF9pbml0KCZhdWRpby0+bG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPndyaXRlX2xvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT5yZWFkX2xvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT5nZXRfZXZlbnRfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmF1ZGlvLT5kc3BfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+b3V0X3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmluX3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUpOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2spOwotCi0JYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSA9IDQ0MTAwOwotCWF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID0gQVVEUFBfQ01EX1BDTV9JTlRGX1NURVJFT19WOwotCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IDB4MjAwMDsKLQotCWF1ZGlvLT5kcnZfb3BzLm91dF9mbHVzaChhdWRpbyk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQlhdWRpby0+b3BlbmVkID0gMTsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlzbnByaW50ZihuYW1lLCBzaXplb2YgbmFtZSwgIm1zbV9tcDNfJTA0eCIsIGF1ZGlvLT5kZWNfaWQpOwotCWF1ZGlvLT5kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJTlVMTCwgKHZvaWQgKikgYXVkaW8sICZhdWRtcDNfZGVidWdfZm9wcyk7Ci0KLQlpZiAoSVNfRVJSKGF1ZGlvLT5kZW50cnkpKQotCQlNTV9EQkcoImRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUubGV2ZWwgPSBFQVJMWV9TVVNQRU5EX0xFVkVMX0RJU0FCTEVfRkI7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUucmVzdW1lID0gYXVkbXAzX3Jlc3VtZTsKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5zdXNwZW5kID0gYXVkbXAzX3N1c3BlbmQ7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLmF1ZGlvID0gYXVkaW87Ci0JcmVnaXN0ZXJfZWFybHlfc3VzcGVuZCgmYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUpOwotI2VuZGlmCi0JZm9yIChpID0gMDsgaSA8IEFVRE1QM19FVkVOVF9OVU07IGkrKykgewotCQllX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkbXAzX2V2ZW50KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChlX25vZGUpCi0JCQlsaXN0X2FkZF90YWlsKCZlX25vZGUtPmxpc3QsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JCWVsc2UgewotCQkJTU1fRVJSKCJldmVudCBwa3QgYWxsb2MgZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi1kb25lOgotCXJldHVybiByYzsKLWVycjoKLQlpb25fdW5tYXBfa2VybmVsKGNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci1vdXRwdXRfYnVmZl9tYXBfZXJyb3I6Ci1vdXRwdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I6Ci1vdXRwdXRfYnVmZl9nZXRfcGh5c19lcnJvcjoKLQlpb25fZnJlZShjbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotb3V0cHV0X2J1ZmZfYWxsb2NfZXJyb3I6Ci0JaW9uX2NsaWVudF9kZXN0cm95KGNsaWVudCk7Ci1jbGllbnRfY3JlYXRlX2Vycm9yOgotcmVzb3VyY2VfZXJyOgotCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19tcDNfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gYXVkaW9fb3BlbiwKLQkucmVsZWFzZQk9IGF1ZGlvX3JlbGVhc2UsCi0JLnJlYWQJCT0gYXVkaW9fcmVhZCwKLQkud3JpdGUJCT0gYXVkaW9fd3JpdGUsCi0JLnVubG9ja2VkX2lvY3RsCT0gYXVkaW9faW9jdGwsCi0JLmZzeW5jID0gYXVkbXAzX2ZzeW5jLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fbXAzX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gIm1zbV9tcDMiLAotCS5mb3BzCT0gJmF1ZGlvX21wM19mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9faW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19tcDNfbWlzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdWRpb19leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZhdWRpb19tcDNfbWlzYyk7Ci19Ci0KLW1vZHVsZV9pbml0KGF1ZGlvX2luaXQpOwotbW9kdWxlX2V4aXQoYXVkaW9fZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIE1QMyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX212cy5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fbXZzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYWJhODIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fbXZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQ2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX212cy5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgotCi0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX3JwY3JvdXRlci5oPgotI2luY2x1ZGUgPG1hY2gvY3B1aWRsZS5oPgotCi0jZGVmaW5lIE1WU19QUk9HIDB4MzAwMDAwMTQKLSNkZWZpbmUgTVZTX1ZFUlMgMHgwMDAzMDAwMQotI2RlZmluZSBNVlNfVkVSU19DT01QX1ZFUjIgMHgwMDA2MDAwMQotI2RlZmluZSBNVlNfVkVSU19DT01QX1ZFUjMgMHgwMDAzMDAwMQotCi0KLSNkZWZpbmUgTVZTX0NMSUVOVF9JRF9WT0lQIDB4MDAwMDAwMDMKLQotI2RlZmluZSBNVlNfQUNRVUlSRV9QUk9DIDQKLSNkZWZpbmUgTVZTX0VOQUJMRV9QUk9DIDUKLSNkZWZpbmUgTVZTX1JFTEVBU0VfUFJPQyA2Ci0jZGVmaW5lIE1WU19BTVJfU0VUX0FNUl9NT0RFX1BST0MgNwotI2RlZmluZSBNVlNfQU1SX1NFVF9BV0JfTU9ERV9QUk9DIDgKLSNkZWZpbmUgTVZTX1ZPQ19TRVRfRlJBTUVfUkFURV9QUk9DIDEwCi0jZGVmaW5lIE1WU19HU01fU0VUX0RUWF9NT0RFX1BST0MgMTEKLSNkZWZpbmUgTVZTX0c3MjlBX1NFVF9NT0RFX1BST0MgMTIKLSNkZWZpbmUgTVZTX0c3MTFfR0VUX01PREVfUFJPQyAxNAotI2RlZmluZSBNVlNfRzcxMV9TRVRfTU9ERV9QUk9DIDE1Ci0jZGVmaW5lIE1WU19HNzExQV9HRVRfTU9ERV9QUk9DIDE2Ci0jZGVmaW5lIE1WU19HNzExQV9TRVRfTU9ERV9QUk9DIDE3Ci0jZGVmaW5lIE1WU19HNzIyX1NFVF9NT0RFX1BST0MgMjAKLSNkZWZpbmUgTVZTX0c3MjJfR0VUX01PREVfUFJPQyAyMQotI2RlZmluZSBNVlNfU0VUX0RUWF9NT0RFX1BST0MgMjIKLQotI2RlZmluZSBNVlNfRVZFTlRfQ0JfVFlQRV9QUk9DIDEKLSNkZWZpbmUgTVZTX1BBQ0tFVF9VTF9GTl9UWVBFX1BST0MgMgotI2RlZmluZSBNVlNfUEFDS0VUX0RMX0ZOX1RZUEVfUFJPQyAzCi0KLSNkZWZpbmUgTVZTX0NCX0ZVTkNfSUQgMHhBQUFBQkJCQgotI2RlZmluZSBNVlNfVUxfQ0JfRlVOQ19JRCAweEJCQkJDQ0NDCi0jZGVmaW5lIE1WU19ETF9DQl9GVU5DX0lEIDB4Q0NDQ0REREQKLQotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9WT0NfVFggMQotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9WT0NfUlggMgotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9BTVJfVUwgMwotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9BTVJfREwgNAotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9HU01fVUwgNQotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9HU01fREwgNgotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9IUl9VTCA3Ci0jZGVmaW5lIE1WU19GUkFNRV9NT0RFX0hSX0RMIDgKLSNkZWZpbmUgTVZTX0ZSQU1FX01PREVfRzcxMV9VTCA5Ci0jZGVmaW5lIE1WU19GUkFNRV9NT0RFX0c3MTFfREwgMTAKLSNkZWZpbmUgTVZTX0ZSQU1FX01PREVfUENNX1VMIDEzCi0jZGVmaW5lIE1WU19GUkFNRV9NT0RFX1BDTV9ETCAxNAotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9QQ01fV0JfVUwgMjMKLSNkZWZpbmUgTVZTX0ZSQU1FX01PREVfUENNX1dCX0RMIDI0Ci0jZGVmaW5lIE1WU19GUkFNRV9NT0RFX0c3MjlBX1VMIDE3Ci0jZGVmaW5lIE1WU19GUkFNRV9NT0RFX0c3MjlBX0RMIDE4Ci0jZGVmaW5lIE1WU19GUkFNRV9NT0RFX0c3MTFBX1VMIDE5Ci0jZGVmaW5lIE1WU19GUkFNRV9NT0RFX0c3MTFBX0RMIDIwCi0jZGVmaW5lIE1WU19GUkFNRV9NT0RFX0c3MjJfVUwgMjEKLSNkZWZpbmUgTVZTX0ZSQU1FX01PREVfRzcyMl9ETCAyMgotCi0KLQotI2RlZmluZSBNVlNfUEtUX0NPTlRFWFRfSVNSIDB4MDAwMDAwMDEKLQotI2RlZmluZSBSUENfVFlQRV9SRVFVRVNUIDAKLSNkZWZpbmUgUlBDX1RZUEVfUkVQTFkgMQotCi0jZGVmaW5lIFJQQ19TVEFUVVNfRkFJTFVSRSAwCi0jZGVmaW5lIFJQQ19TVEFUVVNfU1VDQ0VTUyAxCi0jZGVmaW5lIFJQQ19TVEFUVVNfUkVKRUNUIDEKLQotI2RlZmluZSBSUENfQ09NTU9OX0hEUl9TWiAgKHNpemVvZih1aW50MzJfdCkgKiAyKQotI2RlZmluZSBSUENfUkVRVUVTVF9IRFJfU1ogKHNpemVvZihzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyKSkKLSNkZWZpbmUgUlBDX1JFUExZX0hEUl9TWiAgIChzaXplb2YodWludDMyX3QpICogMykKLQotZW51bSBhdWRpb19tdnNfc3RhdGVfdHlwZSB7Ci0JQVVESU9fTVZTX0NMT1NFRCwKLQlBVURJT19NVlNfT1BFTkVELAotCUFVRElPX01WU19TVEFSVEVELAotCUFVRElPX01WU19TVE9QUEVECi19OwotCi1lbnVtIGF1ZGlvX212c19ldmVudF90eXBlIHsKLQlBVURJT19NVlNfQ09NTUFORCwKLQlBVURJT19NVlNfTU9ERSwKLQlBVURJT19NVlNfTk9USUZZCi19OwotCi1lbnVtIGF1ZGlvX212c19jbWRfc3RhdHVzX3R5cGUgewotCUFVRElPX01WU19DTURfRkFJTFVSRSwKLQlBVURJT19NVlNfQ01EX0JVU1ksCi0JQVVESU9fTVZTX0NNRF9TVUNDRVNTCi19OwotCi1lbnVtIGF1ZGlvX212c19tb2RlX3N0YXR1c190eXBlIHsKLQlBVURJT19NVlNfTU9ERV9OT1RfQVZBSUwsCi0JQVVESU9fTVZTX01PREVfSU5JVCwKLQlBVURJT19NVlNfTU9ERV9SRUFEWQotfTsKLQotZW51bSBhdWRpb19tdnNfcGt0X3N0YXR1c190eXBlIHsKLQlBVURJT19NVlNfUEtUX05PUk1BTCwKLQlBVURJT19NVlNfUEtUX0ZBU1QsCi0JQVVESU9fTVZTX1BLVF9TTE9XCi19OwotCi0vKiBQYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBNVlMgYWNxdWlyZS4gKi8KLXN0cnVjdCBycGNfYXVkaW9fbXZzX2FjcXVpcmVfYXJncyB7Ci0JdWludDMyX3QgY2xpZW50X2lkOwotCXVpbnQzMl90IGNiX2Z1bmNfaWQ7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fbXZzX2FjcXVpcmVfbXNnIHsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIHJwY19oZHI7Ci0Jc3RydWN0IHJwY19hdWRpb19tdnNfYWNxdWlyZV9hcmdzIGFjcXVpcmVfYXJnczsKLX07Ci0KLS8qIFBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIE1WUyBlbmFibGUuICovCi1zdHJ1Y3QgcnBjX2F1ZGlvX212c19lbmFibGVfYXJncyB7Ci0JdWludDMyX3QgY2xpZW50X2lkOwotCXVpbnQzMl90IG1vZGU7Ci0JdWludDMyX3QgdWxfY2JfZnVuY19pZDsKLQl1aW50MzJfdCBkbF9jYl9mdW5jX2lkOwotCXVpbnQzMl90IGNvbnRleHQ7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fbXZzX2VuYWJsZV9tc2cgewotCXN0cnVjdCBycGNfcmVxdWVzdF9oZHIgcnBjX2hkcjsKLQlzdHJ1Y3QgcnBjX2F1ZGlvX212c19lbmFibGVfYXJncyBlbmFibGVfYXJnczsKLX07Ci0KLS8qIFBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIE1WUyByZWxlYXNlLiAqLwotc3RydWN0IGF1ZGlvX212c19yZWxlYXNlX21zZyB7Ci0Jc3RydWN0IHJwY19yZXF1ZXN0X2hkciBycGNfaGRyOwotCXVpbnQzMl90IGNsaWVudF9pZDsKLX07Ci0KLS8qIFBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIHNldHRpbmcgQU1SIG1vZGUuICovCi1zdHJ1Y3QgYXVkaW9fbXZzX3NldF9hbXJfbW9kZV9tc2cgewotCXN0cnVjdCBycGNfcmVxdWVzdF9oZHIgcnBjX2hkcjsKLQl1aW50MzJfdCBhbXJfbW9kZTsKLX07Ci0KLS8qIFBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIHNldHRpbmcgRFRYLiAqLwotc3RydWN0IGF1ZGlvX212c19zZXRfZHR4X21vZGVfbXNnIHsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIHJwY19oZHI7Ci0JdWludDMyX3QgZHR4X21vZGU7Ci19OwotCi0vKiBQYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBzZXR0aW5nIEVWUkMgbW9kZS4gKi8KLXN0cnVjdCBhdWRpb19tdnNfc2V0X3ZvY19tb2RlX21zZyB7Ci0Jc3RydWN0IHJwY19yZXF1ZXN0X2hkciBycGNfaGRyOwotCXVpbnQzMl90IG1heF9yYXRlOwotCXVpbnQzMl90IG1pbl9yYXRlOwotfTsKLQotLyogUGFyYW1ldGVycyBmb3IgRzcxMSBtb2RlICovCi1zdHJ1Y3QgYXVkaW9fbXZzX3NldF9nNzExX21vZGVfbXNnIHsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIHJwY19oZHI7Ci0JdWludDMyX3QgZzcxMV9tb2RlOwotfTsKLQotLyogUGFyYW1ldGVycyBmb3IgRzcyOSBtb2RlICovCi1zdHJ1Y3QgYXVkaW9fbXZzX3NldF9nNzI5X21vZGVfbXNnIHsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIHJwY19oZHI7Ci0JdWludDMyX3QgZzcyOV9tb2RlOwotfTsKLQotLyogUGFyYW1ldGVycyBmb3IgRzcyMiBtb2RlICovCi1zdHJ1Y3QgYXVkaW9fbXZzX3NldF9nNzIyX21vZGVfbXNnIHsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIHJwY19oZHI7Ci0JdWludDMyX3QgZzcyMl9tb2RlOwotfTsKLQotCi0vKiBQYXJhbWV0ZXJzIGZvciBHNzExQSBtb2RlICovCi1zdHJ1Y3QgYXVkaW9fbXZzX3NldF9nNzExQV9tb2RlX21zZyB7Ci0Jc3RydWN0IHJwY19yZXF1ZXN0X2hkciBycGNfaGRyOwotCXVpbnQzMl90IGc3MTFBX21vZGU7Ci19OwotCi0vKiBQYXJhbWV0ZXJzIGZvciBFRlIgRlIgYW5kIEhSIG1vZGUgKi8KLXN0cnVjdCBhdWRpb19tdnNfc2V0X2Vmcl9tb2RlX21zZyB7Ci0Jc3RydWN0IHJwY19yZXF1ZXN0X2hkciBycGNfaGRyOwotCXVpbnQzMl90IGVmcl9tb2RlOwotfTsKLQotdW5pb24gYXVkaW9fbXZzX2V2ZW50X2RhdGEgewotCXN0cnVjdCBtdnNfZXZfY29tbWFuZF90eXBlIHsKLQkJdWludDMyX3QgZXZlbnQ7Ci0JCXVpbnQzMl90IGNsaWVudF9pZDsKLQkJdWludDMyX3QgY21kX3N0YXR1czsKLQl9IG12c19ldl9jb21tYW5kX3R5cGU7Ci0KLQlzdHJ1Y3QgbXZzX2V2X21vZGVfdHlwZSB7Ci0JCXVpbnQzMl90IGV2ZW50OwotCQl1aW50MzJfdCBjbGllbnRfaWQ7Ci0JCXVpbnQzMl90IG1vZGVfc3RhdHVzOwotCQl1aW50MzJfdCBtb2RlOwotCX0gbXZzX2V2X21vZGVfdHlwZTsKLQotCXN0cnVjdCBtdnNfZXZfbm90aWZ5X3R5cGUgewotCQl1aW50MzJfdCBldmVudDsKLQkJdWludDMyX3QgY2xpZW50X2lkOwotCQl1aW50MzJfdCBidWZfZGlyOwotCQl1aW50MzJfdCBtYXhfZnJhbWVzOwotCX0gbXZzX2V2X25vdGlmeV90eXBlOwotfTsKLQotc3RydWN0IGF1ZGlvX212c19jYl9mdW5jX2FyZ3MgewotCXVpbnQzMl90IGNiX2Z1bmNfaWQ7Ci0JdWludDMyX3QgdmFsaWRfcHRyOwotCXVpbnQzMl90IGV2ZW50OwotCXVuaW9uIGF1ZGlvX212c19ldmVudF9kYXRhIGV2ZW50X2RhdGE7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fbXZzX2ZyYW1lX2luZm9faGRyIHsKLQl1aW50MzJfdCBmcmFtZV9tb2RlOwotCXVpbnQzMl90IG12c19tb2RlOwotCXVpbnQxNl90IGJ1Zl9mcmVlX2NudDsKLX07Ci0KLXN0cnVjdCBhdWRpb19tdnNfdWxfcmVwbHkgewotCXN0cnVjdCBycGNfcmVwbHlfaGRyIHJlcGx5X2hkcjsKLQl1aW50MzJfdCB2YWxpZF9wa3Rfc3RhdHVzX3B0cjsKLQl1aW50MzJfdCBwa3Rfc3RhdHVzOwotfTsKLQotc3RydWN0IGF1ZGlvX212c19kbF9jYl9mdW5jX2FyZ3MgewotCXVpbnQzMl90IGNiX2Z1bmNfaWQ7Ci0KLQl1aW50MzJfdCB2YWxpZF9wdHI7Ci0JdWludDMyX3QgZnJhbWVfbW9kZTsKLQl1aW50MzJfdCBmcmFtZV9tb2RlX2lnbm9yZTsKLQotCXN0cnVjdCBhdWRpb19tdnNfZnJhbWVfaW5mb19oZHIgZnJhbWVfaW5mb19oZHI7Ci0KLQl1aW50MzJfdCBhbXJfZnJhbWU7Ci0JdWludDMyX3QgYW1yX21vZGU7Ci19OwotLypnZW5lcmFsIGNvZGVjIHBhcmFtZXRlcnMgaW5jbHVkZXMgQU1SLCBHNzExQSwgUENNCi1HNzI5LCBWT0MgYW5kIEhSIHZvY29kZXJzCi0qLwotc3RydWN0IGducl9jZGNfcGFyYW0gewotCXVpbnQzMl90IHBhcmFtMTsKLQl1aW50MzJfdCBwYXJhbTI7Ci0JdWludDMyX3QgdmFsaWRfcGt0X3N0YXR1c19wdHI7Ci0JdWludDMyX3QgcGt0X3N0YXR1czsKLX07Ci0vKkc3MTEgY29kZWMgcGFyYW1ldGVyKi8KLXN0cnVjdCBnNzExX3BhcmFtIHsKLQl1aW50MzJfdCBwYXJhbTE7Ci0JdWludDMyX3QgdmFsaWRfcGt0X3N0YXR1c19wdHI7Ci0JdWludDMyX3QgcGt0X3N0YXR1czsKLX07Ci0KLXVuaW9uIGNvZGVjX3BhcmFtIHsKLQlzdHJ1Y3QgZ25yX2NkY19wYXJhbSBnbnJfYXJnOwotCXN0cnVjdCBnNzExX3BhcmFtIGc3MTFfYXJnOwotfTsKLQotc3RydWN0IGF1ZGlvX212c19kbF9yZXBseSB7Ci0Jc3RydWN0IHJwY19yZXBseV9oZHIgcmVwbHlfaGRyOwotCi0JdWludDMyX3Qgdm9jX3BrdFtNVlNfTUFYX1ZPQ19QS1RfU0laRS80XTsKLQotCXVpbnQzMl90IHZhbGlkX2ZyYW1lX2luZm9fcHRyOwotCXVpbnQzMl90IGZyYW1lX21vZGU7Ci0JdWludDMyX3QgZnJhbWVfbW9kZV9hZ2FpbjsKLQotCXN0cnVjdCBhdWRpb19tdnNfZnJhbWVfaW5mb19oZHIgZnJhbWVfaW5mb19oZHI7Ci0JdW5pb24gY29kZWNfcGFyYW0gY2RjX3BhcmFtOwotfTsKLQotc3RydWN0IGF1ZGlvX212c19idWZfbm9kZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBtc21fYXVkaW9fbXZzX2ZyYW1lIGZyYW1lOwotfTsKLQotLyogRWFjaCBidWZmZXIgaXMgMjAgbXMsIHF1ZXVlIGhvbGRzIDIwMCBtcyBvZiBkYXRhLiAqLwotI2RlZmluZSBNVlNfTUFYX1FfTEVOIDEwCi0KLXN0cnVjdCBhdWRpb19tdnNfaW5mb190eXBlIHsKLQllbnVtIGF1ZGlvX212c19zdGF0ZV90eXBlIHN0YXRlOwotCXVpbnQzMl90IGZyYW1lX21vZGU7Ci0JdWludDMyX3QgbXZzX21vZGU7Ci0JdWludDMyX3QgYnVmX2ZyZWVfY250OwotCXVpbnQzMl90IHJhdGVfdHlwZTsKLQl1aW50MzJfdCBkdHhfbW9kZTsKLQotCXN0cnVjdCBtc21fcnBjX2VuZHBvaW50ICpycGNfZW5kcHQ7Ci0JdWludDMyX3QgcnBjX3Byb2c7Ci0JdWludDMyX3QgcnBjX3ZlcjsKLQl1aW50MzJfdCBycGNfc3RhdHVzOwotCi0JdWludDhfdCAqbWVtX2NodW5rOwotCi0Jc3RydWN0IGxpc3RfaGVhZCBpbl9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfaW5fcXVldWU7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkIG91dF9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfb3V0X3F1ZXVlOwotCi0Jc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBtb2RlX3dhaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgaW5fd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBvdXRfd2FpdDsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtdXRleCBpbl9sb2NrOwotCXN0cnVjdCBtdXRleCBvdXRfbG9jazsKLQotCXN0cnVjdCB3YWtlX2xvY2sgc3VzcGVuZF9sb2NrOwotCXN0cnVjdCBwbV9xb3NfcmVxdWVzdCBwbV9xb3NfcmVxOwotCi0Jc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGU7Ci19OwotCi1zdGF0aWMgc3RydWN0IGF1ZGlvX212c19pbmZvX3R5cGUgYXVkaW9fbXZzX2luZm87Ci0KLXN0YXRpYyBpbnQgYXVkaW9fbXZzX3NldHVwX21vZGUoc3RydWN0IGF1ZGlvX212c19pbmZvX3R5cGUgKmF1ZGlvKQotewotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCi0Jc3dpdGNoIChhdWRpby0+bXZzX21vZGUpIHsKLQljYXNlIE1WU19NT0RFX0FNUjoKLQljYXNlIE1WU19NT0RFX0FNUl9XQjogewotCQlzdHJ1Y3QgYXVkaW9fbXZzX3NldF9hbXJfbW9kZV9tc2cgc2V0X2Ftcl9tb2RlX21zZzsKLQkJc3RydWN0IGF1ZGlvX212c19zZXRfZHR4X21vZGVfbXNnIHNldF9kdHhfbW9kZV9tc2c7Ci0KLQkJLyogU2V0IEFNUiBtb2RlLiAqLwotCQltZW1zZXQoJnNldF9hbXJfbW9kZV9tc2csIDAsIHNpemVvZihzZXRfYW1yX21vZGVfbXNnKSk7Ci0JCXNldF9hbXJfbW9kZV9tc2cuYW1yX21vZGUgPSBjcHVfdG9fYmUzMihhdWRpby0+cmF0ZV90eXBlKTsKLQotCQlpZiAoYXVkaW8tPm12c19tb2RlID09IE1WU19NT0RFX0FNUikgewotCQkJbXNtX3JwY19zZXR1cF9yZXEoJnNldF9hbXJfbW9kZV9tc2cucnBjX2hkciwKLQkJCQkJICBhdWRpby0+cnBjX3Byb2csCi0JCQkJCSAgYXVkaW8tPnJwY192ZXIsCi0JCQkJCSAgTVZTX0FNUl9TRVRfQU1SX01PREVfUFJPQyk7Ci0JCX0gZWxzZSB7Ci0JCQltc21fcnBjX3NldHVwX3JlcSgmc2V0X2Ftcl9tb2RlX21zZy5ycGNfaGRyLAotCQkJCQkgIGF1ZGlvLT5ycGNfcHJvZywKLQkJCQkJICBhdWRpby0+cnBjX3ZlciwKLQkJCQkJICBNVlNfQU1SX1NFVF9BV0JfTU9ERV9QUk9DKTsKLQkJfQotCi0JCWF1ZGlvLT5ycGNfc3RhdHVzID0gUlBDX1NUQVRVU19GQUlMVVJFOwotCQlyYyA9IG1zbV9ycGNfd3JpdGUoYXVkaW8tPnJwY19lbmRwdCwKLQkJCQkgICAmc2V0X2Ftcl9tb2RlX21zZywKLQkJCQkgICBzaXplb2Yoc2V0X2Ftcl9tb2RlX21zZykpOwotCi0JCWlmIChyYyA+PSAwKSB7Ci0JCQlNTV9EQkcoIlJQQyB3cml0ZSBmb3Igc2V0IGFtciBtb2RlIGRvbmVcbiIpOwotCi0JCQkvKiBTYXZlIHRoZSBNVlMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gKi8KLQkJCWF1ZGlvLT5mcmFtZV9tb2RlID0gTVZTX0ZSQU1FX01PREVfQU1SX0RMOwotCi0JCQkvKiBEaXNhYmxlIERUWC4gKi8KLQkJCW1lbXNldCgmc2V0X2R0eF9tb2RlX21zZywgMCwgc2l6ZW9mKHNldF9kdHhfbW9kZV9tc2cpKTsKLQkJCXNldF9kdHhfbW9kZV9tc2cuZHR4X21vZGUgPSBjcHVfdG9fYmUzMigwKTsKLQotCQkJbXNtX3JwY19zZXR1cF9yZXEoJnNldF9kdHhfbW9kZV9tc2cucnBjX2hkciwKLQkJCQkJICBhdWRpby0+cnBjX3Byb2csCi0JCQkJCSAgYXVkaW8tPnJwY192ZXIsCi0JCQkJCSAgTVZTX1NFVF9EVFhfTU9ERV9QUk9DKTsKLQotCQkJYXVkaW8tPnJwY19zdGF0dXMgPSBSUENfU1RBVFVTX0ZBSUxVUkU7Ci0JCQlyYyA9IG1zbV9ycGNfd3JpdGUoYXVkaW8tPnJwY19lbmRwdCwKLQkJCQkJICAgJnNldF9kdHhfbW9kZV9tc2csCi0JCQkJCSAgIHNpemVvZihzZXRfZHR4X21vZGVfbXNnKSk7Ci0KLQkJCWlmIChyYyA+PSAwKSB7Ci0JCQkJTU1fREJHKCJSUEMgd3JpdGUgZm9yIHNldCBkdHggZG9uZVxuIik7Ci0KLQkJCQlyYyA9IDA7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoIlJQQyB3cml0ZSBmb3Igc2V0IGFtciBtb2RlIGZhaWxlZCAlZFxuIiwgcmMpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIE1WU19NT0RFX1BDTToKLQljYXNlIE1WU19NT0RFX0xJTkVBUl9QQ006IHsKLQkJLyogUENNIGRvZXMgbm90IGhhdmUgYW55IHBhcmFtcyB0byBiZSBzZXQuCi0JCVNhdmUgdGhlIE1WUyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiAqLwotCQlhdWRpby0+cmF0ZV90eXBlID0gTVZTX0FNUl9NT0RFX1VOREVGOwotCQlhdWRpby0+ZnJhbWVfbW9kZSA9IE1WU19GUkFNRV9NT0RFX1BDTV9ETDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgTVZTX01PREVfUENNX1dCOiB7Ci0JCWF1ZGlvLT5yYXRlX3R5cGUgPSBNVlNfQU1SX01PREVfVU5ERUY7Ci0JCWF1ZGlvLT5mcmFtZV9tb2RlID0gTVZTX0ZSQU1FX01PREVfUENNX1dCX0RMOwotCQlicmVhazsKLQl9Ci0JY2FzZSBNVlNfTU9ERV9JUzEyNzoKLQljYXNlIE1WU19NT0RFX0lTNzMzOgotCWNhc2UgTVZTX01PREVfNEdWX05COgotCWNhc2UgTVZTX01PREVfNEdWX1dCOiB7Ci0JCXN0cnVjdCBhdWRpb19tdnNfc2V0X3ZvY19tb2RlX21zZyBzZXRfdm9jX21vZGVfbXNnOwotCi0JCS8qIFNldCBFVlJDIG1vZGUuICovCi0JCW1lbXNldCgmc2V0X3ZvY19tb2RlX21zZywgMCwgc2l6ZW9mKHNldF92b2NfbW9kZV9tc2cpKTsKLQkJc2V0X3ZvY19tb2RlX21zZy5taW5fcmF0ZSA9IGNwdV90b19iZTMyKGF1ZGlvLT5yYXRlX3R5cGUpOwotCQlzZXRfdm9jX21vZGVfbXNnLm1heF9yYXRlID0gY3B1X3RvX2JlMzIoYXVkaW8tPnJhdGVfdHlwZSk7Ci0KLQkJTU1fREJHKCJhdWRpby0+bXZzX21vZGUgJWQgYXVkaW8tPnJhdGVfdHlwZSAlZFxuIiwKLQkJCWF1ZGlvLT5tdnNfbW9kZSwgYXVkaW8tPnJhdGVfdHlwZSk7Ci0JCW1zbV9ycGNfc2V0dXBfcmVxKCZzZXRfdm9jX21vZGVfbXNnLnJwY19oZHIsCi0JCQkJICBhdWRpby0+cnBjX3Byb2csCi0JCQkJICBhdWRpby0+cnBjX3ZlciwKLQkJCQkgIE1WU19WT0NfU0VUX0ZSQU1FX1JBVEVfUFJPQyk7Ci0KLQkJYXVkaW8tPnJwY19zdGF0dXMgPSBSUENfU1RBVFVTX0ZBSUxVUkU7Ci0JCXJjID0gbXNtX3JwY193cml0ZShhdWRpby0+cnBjX2VuZHB0LAotCQkJCSAgICZzZXRfdm9jX21vZGVfbXNnLAotCQkJCSAgIHNpemVvZihzZXRfdm9jX21vZGVfbXNnKSk7Ci0KLQkJaWYgKHJjID49IDApIHsKLQkJCU1NX0RCRygiUlBDIHdyaXRlIGZvciBzZXQgdm9jIG1vZGUgZG9uZVxuIik7Ci0KLQkJCS8qIFNhdmUgdGhlIE1WUyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiAqLwotCQkJYXVkaW8tPmZyYW1lX21vZGUgPSBNVlNfRlJBTUVfTU9ERV9WT0NfUlg7Ci0KLQkJCXJjID0gMDsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiUlBDIHdyaXRlIGZvciBzZXQgdm9jIG1vZGUgZmFpbGVkICVkXG4iLCByYyk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgTVZTX01PREVfRzcxMTogewotCQlzdHJ1Y3QgYXVkaW9fbXZzX3NldF9nNzExX21vZGVfbXNnIHNldF9nNzExX21vZGVfbXNnOwotCi0JCS8qIFNldCBHNzExIG1vZGUuICovCi0JCW1lbXNldCgmc2V0X2c3MTFfbW9kZV9tc2csIDAsIHNpemVvZihzZXRfZzcxMV9tb2RlX21zZykpOwotCQlzZXRfZzcxMV9tb2RlX21zZy5nNzExX21vZGUgPSBjcHVfdG9fYmUzMihhdWRpby0+cmF0ZV90eXBlKTsKLQotCQlNTV9EQkcoIm1vZGUgb2YgZzcxMTolZFxuIiwgc2V0X2c3MTFfbW9kZV9tc2cuZzcxMV9tb2RlKTsKLQotCQltc21fcnBjX3NldHVwX3JlcSgmc2V0X2c3MTFfbW9kZV9tc2cucnBjX2hkciwKLQkJCQkgYXVkaW8tPnJwY19wcm9nLAotCQkJCSBhdWRpby0+cnBjX3ZlciwKLQkJCQkgTVZTX0c3MTFfU0VUX01PREVfUFJPQyk7Ci0KLQkJYXVkaW8tPnJwY19zdGF0dXMgPSBSUENfU1RBVFVTX0ZBSUxVUkU7Ci0JCXJjID0gbXNtX3JwY193cml0ZShhdWRpby0+cnBjX2VuZHB0LAotCQkJCSAgJnNldF9nNzExX21vZGVfbXNnLAotCQkJCSAgc2l6ZW9mKHNldF9nNzExX21vZGVfbXNnKSk7Ci0KLQkJaWYgKHJjID49IDApIHsKLQkJCU1NX0RCRygiUlBDIHdyaXRlIGZvciBzZXQgZzcxMSBtb2RlIGRvbmVcbiIpOwotCQkJLyogU2F2ZSB0aGUgTVZTIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICovCi0JCQlhdWRpby0+ZnJhbWVfbW9kZSA9IE1WU19GUkFNRV9NT0RFX0c3MTFfREw7Ci0KLQkJCXJjID0gMDsKLQkJfSBlbHNlIHsKLQkJICAgICAgIE1NX0VSUigiUlBDIHdyaXRlIGZvciBzZXQgZzcxMSBtb2RlIGZhaWxlZCAlZFxuIiwgcmMpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIE1WU19NT0RFX0c3MjlBOiB7Ci0JCXN0cnVjdCBhdWRpb19tdnNfc2V0X2c3MjlfbW9kZV9tc2cgc2V0X2c3MjlfbW9kZV9tc2c7Ci0KLQkJLyogU2V0IEc3MjkgbW9kZS4gKi8KLQkJbWVtc2V0KCZzZXRfZzcyOV9tb2RlX21zZywgMCwgc2l6ZW9mKHNldF9nNzI5X21vZGVfbXNnKSk7Ci0JCXNldF9nNzI5X21vZGVfbXNnLmc3MjlfbW9kZSA9IGNwdV90b19iZTMyKGF1ZGlvLT5kdHhfbW9kZSk7Ci0KLQkJTU1fREJHKCJtb2RlIG9mIGc3Mjk6JWRcbiIsCi0JCQkgICAgICAgc2V0X2c3MjlfbW9kZV9tc2cuZzcyOV9tb2RlKTsKLQotCQltc21fcnBjX3NldHVwX3JlcSgmc2V0X2c3MjlfbW9kZV9tc2cucnBjX2hkciwKLQkJCQkgYXVkaW8tPnJwY19wcm9nLAotCQkJCSBhdWRpby0+cnBjX3ZlciwKLQkJCQkgTVZTX0c3MjlBX1NFVF9NT0RFX1BST0MpOwotCi0JCWF1ZGlvLT5ycGNfc3RhdHVzID0gUlBDX1NUQVRVU19GQUlMVVJFOwotCQlyYyA9IG1zbV9ycGNfd3JpdGUoYXVkaW8tPnJwY19lbmRwdCwKLQkJCQkgICZzZXRfZzcyOV9tb2RlX21zZywKLQkJCQkgIHNpemVvZihzZXRfZzcyOV9tb2RlX21zZykpOwotCi0JCWlmIChyYyA+PSAwKSB7Ci0JCQlNTV9EQkcoIlJQQyB3cml0ZSBmb3Igc2V0IGc3MjkgbW9kZSBkb25lXG4iKTsKLQotCQkJLyogU2F2ZSB0aGUgTVZTIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICovCi0JCQlhdWRpby0+ZnJhbWVfbW9kZSA9IE1WU19GUkFNRV9NT0RFX0c3MjlBX0RMOwotCi0JCQlyYyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCSAgICAgICBNTV9FUlIoIlJQQyB3cml0ZSBmb3Igc2V0IGc3MjkgbW9kZSBmYWlsZWQgJWRcbiIsIHJjKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBNVlNfTU9ERV9HNzIyOiB7Ci0JCXN0cnVjdCBhdWRpb19tdnNfc2V0X2c3MjJfbW9kZV9tc2cgc2V0X2c3MjJfbW9kZV9tc2c7Ci0KLQkJLyogU2V0IEc3MjIgbW9kZS4gKi8KLQkJbWVtc2V0KCZzZXRfZzcyMl9tb2RlX21zZywgMCwgc2l6ZW9mKHNldF9nNzIyX21vZGVfbXNnKSk7Ci0JCXNldF9nNzIyX21vZGVfbXNnLmc3MjJfbW9kZSA9IGNwdV90b19iZTMyKGF1ZGlvLT5yYXRlX3R5cGUpOwotCi0JCU1NX0RCRygibW9kZSBvZiBnNzIyOiVkXG4iLAotCQkgICAgICBzZXRfZzcyMl9tb2RlX21zZy5nNzIyX21vZGUpOwotCi0JCW1zbV9ycGNfc2V0dXBfcmVxKCZzZXRfZzcyMl9tb2RlX21zZy5ycGNfaGRyLAotCQkJYXVkaW8tPnJwY19wcm9nLAotCQkJYXVkaW8tPnJwY192ZXIsCi0JCQlNVlNfRzcyMl9TRVRfTU9ERV9QUk9DKTsKLQotCQlhdWRpby0+cnBjX3N0YXR1cyA9IFJQQ19TVEFUVVNfRkFJTFVSRTsKLQkJcmMgPSBtc21fcnBjX3dyaXRlKGF1ZGlvLT5ycGNfZW5kcHQsCi0JCQkgJnNldF9nNzIyX21vZGVfbXNnLAotCQkJIHNpemVvZihzZXRfZzcyMl9tb2RlX21zZykpOwotCi0JCWlmIChyYyA+PSAwKSB7Ci0JCQlNTV9EQkcoIlJQQyB3cml0ZSBmb3Igc2V0IGc3MjIgbW9kZSBkb25lXG4iKTsKLQotCQkJLyogU2F2ZSB0aGUgTVZTIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICovCi0JCQlhdWRpby0+ZnJhbWVfbW9kZSA9IE1WU19GUkFNRV9NT0RFX0c3MjJfREw7Ci0KLQkJCXJjID0gMDsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBNVlNfTU9ERV9HNzExQTogewotCQlzdHJ1Y3QgYXVkaW9fbXZzX3NldF9nNzExQV9tb2RlX21zZyBzZXRfZzcxMUFfbW9kZV9tc2c7Ci0JCXN0cnVjdCBhdWRpb19tdnNfc2V0X2R0eF9tb2RlX21zZyBzZXRfZHR4X21vZGVfbXNnOwotCi0JCS8qIFNldCBHNzExQSBtb2RlLiAqLwotCQltZW1zZXQoJnNldF9nNzExQV9tb2RlX21zZywgMCwgc2l6ZW9mKHNldF9nNzExQV9tb2RlX21zZykpOwotCQlzZXRfZzcxMUFfbW9kZV9tc2cuZzcxMUFfbW9kZSA9IGNwdV90b19iZTMyKGF1ZGlvLT5yYXRlX3R5cGUpOwotCi0JCU1NX0RCRygibW9kZSBvZiBnNzExQTolZFxuIiwKLQkJICAgICAgIHNldF9nNzExQV9tb2RlX21zZy5nNzExQV9tb2RlKTsKLQotCQltc21fcnBjX3NldHVwX3JlcSgmc2V0X2c3MTFBX21vZGVfbXNnLnJwY19oZHIsCi0JCQkgYXVkaW8tPnJwY19wcm9nLAotCQkJIGF1ZGlvLT5ycGNfdmVyLAotCQkJIE1WU19HNzExQV9TRVRfTU9ERV9QUk9DKTsKLQotCQlhdWRpby0+cnBjX3N0YXR1cyA9IFJQQ19TVEFUVVNfRkFJTFVSRTsKLQkJcmMgPSBtc21fcnBjX3dyaXRlKGF1ZGlvLT5ycGNfZW5kcHQsCi0JCQkgICZzZXRfZzcxMUFfbW9kZV9tc2csCi0JCQkgIHNpemVvZihzZXRfZzcxMUFfbW9kZV9tc2cpKTsKLQotCQlpZiAocmMgPj0gMCkgewotCQkJTU1fREJHKCJSUEMgd3JpdGUgZm9yIHNldCBnNzExQSBtb2RlIGRvbmVcbiIpOwotCi0JCQkvKiBTYXZlIHRoZSBNVlMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gKi8KLQkJCWF1ZGlvLT5mcmFtZV9tb2RlID0gTVZTX0ZSQU1FX01PREVfRzcxMUFfREw7Ci0JCQkvKiBTZXQgRFRYIE1PREUuICovCi0JCQltZW1zZXQoJnNldF9kdHhfbW9kZV9tc2csIDAsIHNpemVvZihzZXRfZHR4X21vZGVfbXNnKSk7Ci0JCQlzZXRfZHR4X21vZGVfbXNnLmR0eF9tb2RlID0KLQkJCQljcHVfdG9fYmUzMigoYXVkaW8tPmR0eF9tb2RlKSk7Ci0KLQkJCW1zbV9ycGNfc2V0dXBfcmVxKCZzZXRfZHR4X21vZGVfbXNnLnJwY19oZHIsCi0JCQkJCSAgYXVkaW8tPnJwY19wcm9nLAotCQkJCQkgIGF1ZGlvLT5ycGNfdmVyLAotCQkJCQkgIE1WU19TRVRfRFRYX01PREVfUFJPQyk7Ci0KLQkJCWF1ZGlvLT5ycGNfc3RhdHVzID0gUlBDX1NUQVRVU19GQUlMVVJFOwotCQkJcmMgPSBtc21fcnBjX3dyaXRlKGF1ZGlvLT5ycGNfZW5kcHQsCi0JCQkJCSAgICZzZXRfZHR4X21vZGVfbXNnLAotCQkJCQkgICBzaXplb2Yoc2V0X2R0eF9tb2RlX21zZykpOwotCi0JCQlpZiAocmMgPj0gMCkgewotCQkJCU1NX0RCRygiUlBDIHdyaXRlIGZvciBzZXQgZHR4IGRvbmVcbiIpOwotCi0JCQkJcmMgPSAwOwotCQkJfQotCQkJcmMgPSAwOwotCQl9IGVsc2UgewotCQlNTV9FUlIoIlJQQyB3cml0ZSBmb3Igc2V0IGc3MTFBIG1vZGUgZmFpbGVkICVkXG4iLCByYyk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgTVZTX01PREVfRUZSOgotCWNhc2UgTVZTX01PREVfRlI6Ci0JY2FzZSBNVlNfTU9ERV9IUjogewotCQlzdHJ1Y3QgYXVkaW9fbXZzX3NldF9lZnJfbW9kZV9tc2cgc2V0X2Vmcl9tb2RlX21zZzsKLQotCQkvKiBTZXQgRzcyOSBtb2RlLiAqLwotCQltZW1zZXQoJnNldF9lZnJfbW9kZV9tc2csIDAsIHNpemVvZihzZXRfZWZyX21vZGVfbXNnKSk7Ci0JCXNldF9lZnJfbW9kZV9tc2cuZWZyX21vZGUgPSBjcHVfdG9fYmUzMihhdWRpby0+ZHR4X21vZGUpOwotCi0JCU1NX0RCRygibW9kZSBvZiBFRlIsIEZSIGFuZCBIUjolZFxuIiwKLQkJCSAgICAgICBzZXRfZWZyX21vZGVfbXNnLmVmcl9tb2RlKTsKLQotCQltc21fcnBjX3NldHVwX3JlcSgmc2V0X2Vmcl9tb2RlX21zZy5ycGNfaGRyLAotCQkJCSBhdWRpby0+cnBjX3Byb2csCi0JCQkJIGF1ZGlvLT5ycGNfdmVyLAotCQkJCSBNVlNfR1NNX1NFVF9EVFhfTU9ERV9QUk9DKTsKLQotCQlhdWRpby0+cnBjX3N0YXR1cyA9IFJQQ19TVEFUVVNfRkFJTFVSRTsKLQkJcmMgPSBtc21fcnBjX3dyaXRlKGF1ZGlvLT5ycGNfZW5kcHQsCi0JCQkJICAmc2V0X2Vmcl9tb2RlX21zZywKLQkJCQkgIHNpemVvZihzZXRfZWZyX21vZGVfbXNnKSk7Ci0KLQkJaWYgKHJjID49IDApIHsKLQkJCU1NX0RCRygiUlBDIHdyaXRlIGZvciBzZXQgRUZSLCBGUiBhbmQgSFIgbW9kZSBkb25lXG4iKTsKLQotCQkJLyogU2F2ZSB0aGUgTVZTIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICovCi0JCQlpZiAoKGF1ZGlvLT5tdnNfbW9kZSA9PSBNVlNfTU9ERV9FRlIpIHx8Ci0JCQkJKGF1ZGlvLT5tdnNfbW9kZSA9PSBNVlNfTU9ERV9GUikpCi0JCQkJYXVkaW8tPmZyYW1lX21vZGUgPSBNVlNfRlJBTUVfTU9ERV9HU01fREw7Ci0JCQlpZiAoYXVkaW8tPm12c19tb2RlID09IE1WU19NT0RFX0hSKQotCQkJCWF1ZGlvLT5mcmFtZV9tb2RlID0gTVZTX0ZSQU1FX01PREVfSFJfREw7Ci0KLQkJCXJjID0gMDsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiUlBDIHdyaXRlIGZvciBzZXQgRUZSLCBGUiIKLQkJCQkiYW5kIEhSIG1vZGUgZmFpbGVkICVkXG4iLCByYyk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQkJTU1fRVJSKCJEZWZhdWx0IGNhc2VcbiIpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fbXZzX3NldHVwKHN0cnVjdCBhdWRpb19tdnNfaW5mb190eXBlICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBhdWRpb19tdnNfZW5hYmxlX21zZyBlbmFibGVfbXNnOwotCi0JTU1fREJHKCJcbiIpOwotCi0JLyogRW5hYmxlIE1WUy4gKi8KLQltZW1zZXQoJmVuYWJsZV9tc2csIDAsIHNpemVvZihlbmFibGVfbXNnKSk7Ci0JZW5hYmxlX21zZy5lbmFibGVfYXJncy5jbGllbnRfaWQgPSBjcHVfdG9fYmUzMihNVlNfQ0xJRU5UX0lEX1ZPSVApOwotCWVuYWJsZV9tc2cuZW5hYmxlX2FyZ3MubW9kZSA9IGNwdV90b19iZTMyKGF1ZGlvLT5tdnNfbW9kZSk7Ci0JZW5hYmxlX21zZy5lbmFibGVfYXJncy51bF9jYl9mdW5jX2lkID0gY3B1X3RvX2JlMzIoTVZTX1VMX0NCX0ZVTkNfSUQpOwotCWVuYWJsZV9tc2cuZW5hYmxlX2FyZ3MuZGxfY2JfZnVuY19pZCA9IGNwdV90b19iZTMyKE1WU19ETF9DQl9GVU5DX0lEKTsKLQllbmFibGVfbXNnLmVuYWJsZV9hcmdzLmNvbnRleHQgPSBjcHVfdG9fYmUzMihNVlNfUEtUX0NPTlRFWFRfSVNSKTsKLQotCW1zbV9ycGNfc2V0dXBfcmVxKCZlbmFibGVfbXNnLnJwY19oZHIsCi0JCQkgIGF1ZGlvLT5ycGNfcHJvZywKLQkJCSAgYXVkaW8tPnJwY192ZXIsCi0JCQkgIE1WU19FTkFCTEVfUFJPQyk7Ci0KLQlhdWRpby0+cnBjX3N0YXR1cyA9IFJQQ19TVEFUVVNfRkFJTFVSRTsKLQlyYyA9IG1zbV9ycGNfd3JpdGUoYXVkaW8tPnJwY19lbmRwdCwgJmVuYWJsZV9tc2csIHNpemVvZihlbmFibGVfbXNnKSk7Ci0KLQlpZiAocmMgPj0gMCkgewotCQlNTV9EQkcoIlJQQyB3cml0ZSBmb3IgZW5hYmxlIGRvbmVcbiIpOwotCi0JCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGF1ZGlvLT5tb2RlX3dhaXQsCi0JCQkJKGF1ZGlvLT5ycGNfc3RhdHVzICE9IFJQQ19TVEFUVVNfRkFJTFVSRSksCi0JCQkJMTAgKiBIWik7Ci0KLQkJaWYgKHJjID4gMCkgewotCQkJTU1fREJHKCJXYWl0IGV2ZW50IGZvciBlbmFibGUgc3VjY2VlZGVkXG4iKTsKLQkJCXJjID0gYXVkaW9fbXZzX3NldHVwX21vZGUoYXVkaW8pOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCU1NX0VSUigiVW5rbm93biBNVlMgbW9kZSAlZFxuIiwKLQkJCQkgICAgICAgYXVkaW8tPm12c19tb2RlKTsKLQkJCX0KLQkJCU1NX0VSUigicmMgdmFsdWUgYWZ0ZXIgbW9kZSBzZXR1cDogJWRcbiIsIHJjKTsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiV2FpdCBldmVudCBmb3IgZW5hYmxlIGZhaWxlZCAlZFxuIiwgcmMpOwotCQl9Ci0JfSBlbHNlIHsKLQkJTU1fRVJSKCJSUEMgd3JpdGUgZm9yIGVuYWJsZSBmYWlsZWQgJWRcbiIsIHJjKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fbXZzX3N0YXJ0KHN0cnVjdCBhdWRpb19tdnNfaW5mb190eXBlICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBhdWRpb19tdnNfYWNxdWlyZV9tc2cgYWNxdWlyZV9tc2c7Ci0KLQlNTV9EQkcoIlxuIik7Ci0KLQkvKiBQcmV2ZW50IHNsZWVwLiAqLwotCXdha2VfbG9jaygmYXVkaW8tPnN1c3BlbmRfbG9jayk7Ci0JcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KCZhdWRpby0+cG1fcW9zX3JlcSwKLQkJCSAgICAgIG1zbV9jcHVpZGxlX2dldF9kZWVwX2lkbGVfbGF0ZW5jeSgpKTsKLQotCS8qIEFjcXVpcmUgTVZTLiAqLwotCW1lbXNldCgmYWNxdWlyZV9tc2csIDAsIHNpemVvZihhY3F1aXJlX21zZykpOwotCWFjcXVpcmVfbXNnLmFjcXVpcmVfYXJncy5jbGllbnRfaWQgPSBjcHVfdG9fYmUzMihNVlNfQ0xJRU5UX0lEX1ZPSVApOwotCWFjcXVpcmVfbXNnLmFjcXVpcmVfYXJncy5jYl9mdW5jX2lkID0gY3B1X3RvX2JlMzIoTVZTX0NCX0ZVTkNfSUQpOwotCi0JbXNtX3JwY19zZXR1cF9yZXEoJmFjcXVpcmVfbXNnLnJwY19oZHIsCi0JCQkgIGF1ZGlvLT5ycGNfcHJvZywKLQkJCSAgYXVkaW8tPnJwY192ZXIsCi0JCQkgIE1WU19BQ1FVSVJFX1BST0MpOwotCi0JYXVkaW8tPnJwY19zdGF0dXMgPSBSUENfU1RBVFVTX0ZBSUxVUkU7Ci0JcmMgPSBtc21fcnBjX3dyaXRlKGF1ZGlvLT5ycGNfZW5kcHQsCi0JCQkgICAmYWNxdWlyZV9tc2csCi0JCQkgICBzaXplb2YoYWNxdWlyZV9tc2cpKTsKLQotCWlmIChyYyA+PSAwKSB7Ci0JCU1NX0RCRygiUlBDIHdyaXRlIGZvciBhY3F1aXJlIGRvbmVcbiIpOwotCi0JCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJKGF1ZGlvLT5ycGNfc3RhdHVzICE9IFJQQ19TVEFUVVNfRkFJTFVSRSksCi0JCQkxICogSFopOwotCi0JCWlmIChyYyA+IDApIHsKLQotCQkJcmMgPSBhdWRpb19tdnNfc2V0dXAoYXVkaW8pOwotCi0JCQlpZiAocmMgPT0gMCkKLQkJCQlhdWRpby0+c3RhdGUgPSBBVURJT19NVlNfU1RBUlRFRDsKLQotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJXYWl0IGV2ZW50IGZvciBhY3F1aXJlIGZhaWxlZCAlZFxuIiwgcmMpOwotCi0JCQlyYyA9IC1FQlVTWTsKLQkJfQotCX0gZWxzZSB7Ci0JCU1NX0VSUigiUlBDIHdyaXRlIGZvciBhY3F1aXJlIGZhaWxlZCAlZFxuIiwgcmMpOwotCi0JCXJjID0gLUVCVVNZOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19tdnNfc3RvcChzdHJ1Y3QgYXVkaW9fbXZzX2luZm9fdHlwZSAqYXVkaW8pCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYXVkaW9fbXZzX3JlbGVhc2VfbXNnIHJlbGVhc2VfbXNnOwotCi0JTU1fREJHKCJcbiIpOwotCi0JLyogUmVsZWFzZSBNVlMuICovCi0JbWVtc2V0KCZyZWxlYXNlX21zZywgMCwgc2l6ZW9mKHJlbGVhc2VfbXNnKSk7Ci0JcmVsZWFzZV9tc2cuY2xpZW50X2lkID0gY3B1X3RvX2JlMzIoTVZTX0NMSUVOVF9JRF9WT0lQKTsKLQotCW1zbV9ycGNfc2V0dXBfcmVxKCZyZWxlYXNlX21zZy5ycGNfaGRyLAotCQkJICBhdWRpby0+cnBjX3Byb2csCi0JCQkgIGF1ZGlvLT5ycGNfdmVyLAotCQkJICBNVlNfUkVMRUFTRV9QUk9DKTsKLQotCWF1ZGlvLT5ycGNfc3RhdHVzID0gUlBDX1NUQVRVU19GQUlMVVJFOwotCXJjID0gbXNtX3JwY193cml0ZShhdWRpby0+cnBjX2VuZHB0LCAmcmVsZWFzZV9tc2csIHNpemVvZihyZWxlYXNlX21zZykpOwotCi0JaWYgKHJjID49IDApIHsKLQkJTU1fREJHKCJSUEMgd3JpdGUgZm9yIHJlbGVhc2UgZG9uZVxuIik7Ci0KLQkJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYXVkaW8tPm1vZGVfd2FpdCwKLQkJCQkoYXVkaW8tPnJwY19zdGF0dXMgIT0gUlBDX1NUQVRVU19GQUlMVVJFKSwKLQkJCQkxICogSFopOwotCi0JCWlmIChyYyA+IDApIHsKLQkJCU1NX0RCRygiV2FpdCBldmVudCBmb3IgcmVsZWFzZSBzdWNjZWVkZWRcbiIpOwotCi0JCQlhdWRpby0+c3RhdGUgPSBBVURJT19NVlNfU1RPUFBFRDsKLQotCQkJLyogVW4tYmxvY2sgcmVhZCBpbiBjYXNlIGl0IGlzIHdhaXRpbmcgZm9yIGRhdGEuICovCi0JCQl3YWtlX3VwKCZhdWRpby0+b3V0X3dhaXQpOwotCQkJcmMgPSAwOwotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJXYWl0IGV2ZW50IGZvciByZWxlYXNlIGZhaWxlZCAlZFxuIiwgcmMpOwotCQl9Ci0JfSBlbHNlIHsKLQkJTU1fRVJSKCJSUEMgd3JpdGUgZm9yIHJlbGVhc2UgZmFpbGVkICVkXG4iLCByYyk7Ci0JfQotCi0JLyogQWxsb3cgc2xlZXAuICovCi0JcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KCZhdWRpby0+cG1fcW9zX3JlcSwgUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotCXdha2VfdW5sb2NrKCZhdWRpby0+c3VzcGVuZF9sb2NrKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fbXZzX3Byb2Nlc3NfcnBjX3JlcXVlc3QodWludDMyX3QgcHJvY2VkdXJlLAotCQkJCQkgIHVpbnQzMl90IHhpZCwKLQkJCQkJICB2b2lkICpkYXRhLAotCQkJCQkgIHVpbnQzMl90IGxlbmd0aCwKLQkJCQkJICBzdHJ1Y3QgYXVkaW9fbXZzX2luZm9fdHlwZSAqYXVkaW8pCi17Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsKLQotCXN3aXRjaCAocHJvY2VkdXJlKSB7Ci0JY2FzZSBNVlNfRVZFTlRfQ0JfVFlQRV9QUk9DOiB7Ci0JCXN0cnVjdCBhdWRpb19tdnNfY2JfZnVuY19hcmdzICphcmdzID0gZGF0YTsKLQkJc3RydWN0IHJwY19yZXBseV9oZHIgcmVwbHlfaGRyOwotCi0JCU1NX0RCRygiTVZTIENCIENCX0ZVTkNfSUQgMHgleFxuIiwKLQkJCSBiZTMyX3RvX2NwdShhcmdzLT5jYl9mdW5jX2lkKSk7Ci0KLQkJaWYgKGJlMzJfdG9fY3B1KGFyZ3MtPnZhbGlkX3B0cikpIHsKLQkJCXVpbnQzMl90IGV2ZW50X3R5cGUgPSBiZTMyX3RvX2NwdShhcmdzLT5ldmVudCk7Ci0KLQkJCU1NX0RCRygiTVZTIENCIGV2ZW50IHR5cGUgJWRcbiIsCi0JCQkJIGJlMzJfdG9fY3B1KGFyZ3MtPmV2ZW50KSk7Ci0KLQkJCWlmIChldmVudF90eXBlID09IEFVRElPX01WU19DT01NQU5EKSB7Ci0JCQkJdWludDMyX3QgY21kX3N0YXR1cyA9IGJlMzJfdG9fY3B1KAotCQkJYXJncy0+ZXZlbnRfZGF0YS5tdnNfZXZfY29tbWFuZF90eXBlLmNtZF9zdGF0dXMpOwotCi0JCQkJTU1fREJHKCJNVlMgQ0IgY29tbWFuZCBzdGF0dXMgJWRcbiIsCi0JCQkJCWNtZF9zdGF0dXMpOwotCi0JCQkJaWYgKGNtZF9zdGF0dXMgPT0gQVVESU9fTVZTX0NNRF9TVUNDRVNTKSB7Ci0JCQkJCWF1ZGlvLT5ycGNfc3RhdHVzID0gUlBDX1NUQVRVU19TVUNDRVNTOwotCQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJfQotCi0JCQl9IGVsc2UgaWYgKGV2ZW50X3R5cGUgPT0gQVVESU9fTVZTX01PREUpIHsKLQkJCQl1aW50MzJfdCBtb2RlX3N0YXR1cyA9IGJlMzJfdG9fY3B1KAotCQkJCWFyZ3MtPmV2ZW50X2RhdGEubXZzX2V2X21vZGVfdHlwZS5tb2RlX3N0YXR1cyk7Ci0KLQkJCQlNTV9EQkcoIk1WUyBDQiBtb2RlIHN0YXR1cyAlZFxuIiwgbW9kZV9zdGF0dXMpOwotCi0JCQkJaWYgKG1vZGVfc3RhdHVzID09IEFVRElPX01WU19NT0RFX1JFQURZKSB7Ci0JCQkJCWF1ZGlvLT5ycGNfc3RhdHVzID0gUlBDX1NUQVRVU19TVUNDRVNTOwotCQkJCQl3YWtlX3VwKCZhdWRpby0+bW9kZV93YWl0KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCU1NX0VSUigiTVZTIENCIHVua25vd24gZXZlbnQgdHlwZSAlZFxuIiwKLQkJCQkJZXZlbnRfdHlwZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoIk1WUyBDQiBldmVudCBwb2ludGVyIG5vdCB2YWxpZFxuIik7Ci0JCX0KLQotCQkvKiBTZW5kIGFjayB0byBtb2RlbS4gKi8KLQkJbWVtc2V0KCZyZXBseV9oZHIsIDAsIHNpemVvZihyZXBseV9oZHIpKTsKLQkJcmVwbHlfaGRyLnhpZCA9IGNwdV90b19iZTMyKHhpZCk7Ci0JCXJlcGx5X2hkci50eXBlID0gY3B1X3RvX2JlMzIoUlBDX1RZUEVfUkVQTFkpOwotCQlyZXBseV9oZHIucmVwbHlfc3RhdCA9IGNwdV90b19iZTMyKFJQQ01TR19SRVBMWVNUQVRfQUNDRVBURUQpOwotCi0JCXJlcGx5X2hkci5kYXRhLmFjY19oZHIuYWNjZXB0X3N0YXQgPSBjcHVfdG9fYmUzMigKLQkJCVJQQ19BQ0NFUFRTVEFUX1NVQ0NFU1MpOwotCQlyZXBseV9oZHIuZGF0YS5hY2NfaGRyLnZlcmZfZmxhdm9yID0gMDsKLQkJcmVwbHlfaGRyLmRhdGEuYWNjX2hkci52ZXJmX2xlbmd0aCA9IDA7Ci0KLQkJcmMgPSBtc21fcnBjX3dyaXRlKGF1ZGlvLT5ycGNfZW5kcHQsCi0JCQkJICAgJnJlcGx5X2hkciwKLQkJCQkgICBzaXplb2YocmVwbHlfaGRyKSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCU1NX0VSUigiUlBDIHdyaXRlIGZvciByZXNwb25zZSBmYWlsZWQgJWRcbiIsIHJjKTsKLQotCQlicmVhazsKLQl9Ci0KLQljYXNlIE1WU19QQUNLRVRfVUxfRk5fVFlQRV9QUk9DOiB7Ci0JCXVpbnQzMl90ICphcmdzID0gZGF0YTsKLQkJdWludDMyX3QgcGt0X2xlbjsKLQkJdWludDMyX3QgZnJhbWVfbW9kZTsKLQkJc3RydWN0IGF1ZGlvX212c191bF9yZXBseSB1bF9yZXBseTsKLQkJc3RydWN0IGF1ZGlvX212c19idWZfbm9kZSAqYnVmX25vZGUgPSBOVUxMOwotCi0JCU1NX0RCRygiTVZTIFVMIENCX0ZVTkNfSUQgMHgleFxuIiwKLQkJCSBiZTMyX3RvX2NwdSgqYXJncykpOwotCQlhcmdzKys7Ci0KLQkJcGt0X2xlbiA9IGJlMzJfdG9fY3B1KCphcmdzKTsKLQkJTU1fREJHKCJVTCBwa3RfbGVuICVkXG4iLCBwa3RfbGVuKTsKLQkJYXJncysrOwotCi0JCS8qIENvcHkgdGhlIHZvY29kZXIgcGFja2V0cy4gKi8KLQkJbXV0ZXhfbG9jaygmYXVkaW8tPm91dF9sb2NrKTsKLQotCQlpZiAoIWxpc3RfZW1wdHkoJmF1ZGlvLT5mcmVlX291dF9xdWV1ZSkpIHsKLQkJCWJ1Zl9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmZyZWVfb3V0X3F1ZXVlLAotCQkJCQkJICAgIHN0cnVjdCBhdWRpb19tdnNfYnVmX25vZGUsCi0JCQkJCQkgICAgbGlzdCk7Ci0JCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCi0JCQltZW1jcHkoJmJ1Zl9ub2RlLT5mcmFtZS52b2NfcGt0WzBdLCBhcmdzLCBwa3RfbGVuKTsKLQkJCWJ1Zl9ub2RlLT5mcmFtZS5sZW4gPSBwa3RfbGVuOwotCQkJcGt0X2xlbiA9IEFMSUdOKHBrdF9sZW4sIDQpOwotCQkJYXJncyA9IGFyZ3MgKyBwa3RfbGVuLzQ7Ci0KLQkJCU1NX0RCRygiVUwgdmFsaWRfcHRyIDB4JXhcbiIsCi0JCQkJIGJlMzJfdG9fY3B1KCphcmdzKSk7Ci0JCQlhcmdzKys7Ci0KLQkJCWZyYW1lX21vZGUgPSBiZTMyX3RvX2NwdSgqYXJncyk7Ci0JCQlNTV9EQkcoIlVMIGZyYW1lX21vZGUgJWRcbiIsCi0JCQkJIGZyYW1lX21vZGUpOwotCQkJYXJncysrOwotCi0JCQlNTV9EQkcoIlVMIGZyYW1lX21vZGUgJWRcbiIsCi0JCQkJIGJlMzJfdG9fY3B1KCphcmdzKSk7Ci0JCQlhcmdzKys7Ci0KLQkJCU1NX0RCRygiVUwgZnJhbWVfbW9kZSAlZFxuIiwKLQkJCQkgYmUzMl90b19jcHUoKmFyZ3MpKTsKLQkJCWFyZ3MrKzsKLQotCQkJTU1fREJHKCJVTCBtdnNfbW9kZSAlZFxuIiwKLQkJCQkgYmUzMl90b19jcHUoKmFyZ3MpKTsKLQkJCWFyZ3MrKzsKLQotCQkJTU1fREJHKCJVTCBidWZfZnJlZV9jbnQgJWRcbiIsCi0JCQkJIGJlMzJfdG9fY3B1KCphcmdzKSk7Ci0JCQlhcmdzKys7Ci0KLQkJCWlmIChmcmFtZV9tb2RlID09IE1WU19GUkFNRV9NT0RFX0FNUl9VTCkgewotCQkJCS8qIEV4dHJhY3QgQU1SIGZyYW1lIHR5cGUuICovCi0JCQkJYnVmX25vZGUtPmZyYW1lLmZyYW1lX3R5cGUgPSBiZTMyX3RvX2NwdSgqYXJncyk7Ci0KLQkJCQlNTV9EQkcoIlVMIEFNUiBmcmFtZV90eXBlICVkXG4iLAotCQkJCQkgYmUzMl90b19jcHUoKmFyZ3MpKTsKLQkJCX0gZWxzZSBpZiAoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9QQ01fVUwpIHsKLQkJCQkvKiBQQ00gZG9lc24ndCBoYXZlIGZyYW1lX3R5cGUgKi8KLQkJCQlidWZfbm9kZS0+ZnJhbWUuZnJhbWVfdHlwZSA9IDA7Ci0JCQl9IGVsc2UgaWYgKGZyYW1lX21vZGUgPT0gTVZTX0ZSQU1FX01PREVfVk9DX1RYKSB7Ci0JCQkJLyogRXh0cmFjdGluZyBFVlJDIGN1cnJlbnQgYnVmZmVyIGZyYW1lIHJhdGUqLwotCQkJCWJ1Zl9ub2RlLT5mcmFtZS5mcmFtZV90eXBlID0gYmUzMl90b19jcHUoKmFyZ3MpOwotCQkJCXByX2RlYnVnKCIlczogVUwgRVZSQyBmcmFtZV90eXBlICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYmUzMl90b19jcHUoKmFyZ3MpKTsKLQkJCX0gZWxzZSBpZiAoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9HNzExX1VMKSB7Ci0JCQkJLyogRXh0cmFjdCBHNzExIGZyYW1lIHR5cGUuICovCi0JCQkJYnVmX25vZGUtPmZyYW1lLmZyYW1lX3R5cGUgPSBiZTMyX3RvX2NwdSgqYXJncyk7Ci0KLQkJCQlNTV9EQkcoIlVMIEc3MTEgZnJhbWVfdHlwZSAlZFxuIiwKLQkJCQkJYmUzMl90b19jcHUoKmFyZ3MpKTsKLQkJCX0gZWxzZSBpZiAoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9HNzI5QV9VTCkgewotCQkJCS8qIEV4dHJhY3QgRzcyOSBmcmFtZSB0eXBlLiAqLwotCQkJCWJ1Zl9ub2RlLT5mcmFtZS5mcmFtZV90eXBlID0gYmUzMl90b19jcHUoKmFyZ3MpOwotCi0JCQkJTU1fREJHKCJVTCBHNzI5IGZyYW1lX3R5cGUgJWRcbiIsCi0JCQkJCWJlMzJfdG9fY3B1KCphcmdzKSk7Ci0JCQl9IGVsc2UgaWYgKGZyYW1lX21vZGUgPT0gTVZTX0ZSQU1FX01PREVfRzcyMl9VTCkgewotCQkJCS8qIEV4dHJhY3QgRzcyMiBmcmFtZSB0eXBlLiAqLwotCQkJCWJ1Zl9ub2RlLT5mcmFtZS5mcmFtZV90eXBlID0gYmUzMl90b19jcHUoKmFyZ3MpOwotCi0JCQkJTU1fREJHKCJVTCBHNzIyIGZyYW1lX3R5cGUgJWRcbiIsCi0JCQkJICAgICAgIGJlMzJfdG9fY3B1KCphcmdzKSk7Ci0JCQl9IGVsc2UgaWYgKGZyYW1lX21vZGUgPT0gTVZTX0ZSQU1FX01PREVfRzcxMUFfVUwpIHsKLQkJCQkvKiBFeHRyYWN0IEc3MTFBIGZyYW1lIHR5cGUuICovCi0JCQkJYnVmX25vZGUtPmZyYW1lLmZyYW1lX3R5cGUgPSBiZTMyX3RvX2NwdSgqYXJncyk7Ci0KLQkJCQlNTV9EQkcoIlVMIEc3MTFBIGZyYW1lX3R5cGUgJWRcbiIsCi0JCQkJICAgICAgIGJlMzJfdG9fY3B1KCphcmdzKSk7Ci0JCQl9IGVsc2UgaWYgKChmcmFtZV9tb2RlID09IE1WU19GUkFNRV9NT0RFX0dTTV9VTCkgfHwKLQkJCQkgICAoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9IUl9VTCkpIHsKLQkJCQkvKiBFeHRyYWN0IEVGUiwgRlIgYW5kIEhSIGZyYW1lIHR5cGUuICovCi0JCQkJYnVmX25vZGUtPmZyYW1lLmZyYW1lX3R5cGUgPSBiZTMyX3RvX2NwdSgqYXJncyk7Ci0KLQkJCQlNTV9EQkcoIlVMIEVGUixGUixIUiBmcmFtZV90eXBlICVkXG4iLAotCQkJCQliZTMyX3RvX2NwdSgqYXJncykpOwotCQkJfSBlbHNlIHsKLQkJCQlNTV9EQkcoIlVMIFVua25vd24gZnJhbWUgbW9kZSAlZFxuIiwKLQkJCQkgICAgICAgZnJhbWVfbW9kZSk7Ci0JCQl9Ci0KLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmYXVkaW8tPm91dF9xdWV1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoIlVMIGRhdGEgZHJvcHBlZCwgcmVhZCBpcyBzbG93XG4iKTsKLQkJfQotCi0JCW11dGV4X3VubG9jaygmYXVkaW8tPm91dF9sb2NrKTsKLQotCQl3YWtlX3VwKCZhdWRpby0+b3V0X3dhaXQpOwotCi0JCS8qIFNlbmQgVUwgbWVzc2FnZSBhY2NlcHQgdG8gbW9kZW0uICovCi0JCW1lbXNldCgmdWxfcmVwbHksIDAsIHNpemVvZih1bF9yZXBseSkpOwotCQl1bF9yZXBseS5yZXBseV9oZHIueGlkID0gY3B1X3RvX2JlMzIoeGlkKTsKLQkJdWxfcmVwbHkucmVwbHlfaGRyLnR5cGUgPSBjcHVfdG9fYmUzMihSUENfVFlQRV9SRVBMWSk7Ci0JCXVsX3JlcGx5LnJlcGx5X2hkci5yZXBseV9zdGF0ID0gY3B1X3RvX2JlMzIoCi0JCQlSUENNU0dfUkVQTFlTVEFUX0FDQ0VQVEVEKTsKLQotCQl1bF9yZXBseS5yZXBseV9oZHIuZGF0YS5hY2NfaGRyLmFjY2VwdF9zdGF0ID0gY3B1X3RvX2JlMzIoCi0JCQlSUENfQUNDRVBUU1RBVF9TVUNDRVNTKTsKLQkJdWxfcmVwbHkucmVwbHlfaGRyLmRhdGEuYWNjX2hkci52ZXJmX2ZsYXZvciA9IDA7Ci0JCXVsX3JlcGx5LnJlcGx5X2hkci5kYXRhLmFjY19oZHIudmVyZl9sZW5ndGggPSAwOwotCi0JCXVsX3JlcGx5LnZhbGlkX3BrdF9zdGF0dXNfcHRyID0gY3B1X3RvX2JlMzIoMHgwMDAwMDAwMSk7Ci0JCXVsX3JlcGx5LnBrdF9zdGF0dXMgPSBjcHVfdG9fYmUzMigweDAwMDAwMDAwKTsKLQotCQlyYyA9IG1zbV9ycGNfd3JpdGUoYXVkaW8tPnJwY19lbmRwdCwKLQkJCQkgICAmdWxfcmVwbHksCi0JCQkJICAgc2l6ZW9mKHVsX3JlcGx5KSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCU1NX0VSUigiUlBDIHdyaXRlIGZvciBVTCByZXNwb25zZSBmYWlsZWQgJWRcbiIsCi0JCQkgICAgICAgcmMpOwotCi0JCWJyZWFrOwotCX0KLQotCWNhc2UgTVZTX1BBQ0tFVF9ETF9GTl9UWVBFX1BST0M6IHsKLQkJc3RydWN0IGF1ZGlvX212c19kbF9jYl9mdW5jX2FyZ3MgKmFyZ3MgPSBkYXRhOwotCQlzdHJ1Y3QgYXVkaW9fbXZzX2RsX3JlcGx5IGRsX3JlcGx5OwotCQl1aW50MzJfdCBmcmFtZV9tb2RlOwotCQlzdHJ1Y3QgYXVkaW9fbXZzX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0KLQkJTU1fREJHKCJNVlMgREwgQ0IgQ0JfRlVOQ19JRCAweCV4XG4iLAotCQkJIGJlMzJfdG9fY3B1KGFyZ3MtPmNiX2Z1bmNfaWQpKTsKLQotCQlmcmFtZV9tb2RlID0gYmUzMl90b19jcHUoYXJncy0+ZnJhbWVfbW9kZSk7Ci0JCU1NX0RCRygiREwgZnJhbWVfbW9kZSAlZFxuIiwgZnJhbWVfbW9kZSk7Ci0KLQkJLyogUHJlcGFyZSBhbmQgc2VuZCB0aGUgREwgcGFja2V0cyB0byBtb2RlbS4gKi8KLQkJbWVtc2V0KCZkbF9yZXBseSwgMCwgc2l6ZW9mKGRsX3JlcGx5KSk7Ci0JCWRsX3JlcGx5LnJlcGx5X2hkci54aWQgPSBjcHVfdG9fYmUzMih4aWQpOwotCQlkbF9yZXBseS5yZXBseV9oZHIudHlwZSA9IGNwdV90b19iZTMyKFJQQ19UWVBFX1JFUExZKTsKLQkJZGxfcmVwbHkucmVwbHlfaGRyLnJlcGx5X3N0YXQgPSBjcHVfdG9fYmUzMigKLQkJCVJQQ01TR19SRVBMWVNUQVRfQUNDRVBURUQpOwotCi0JCWRsX3JlcGx5LnJlcGx5X2hkci5kYXRhLmFjY19oZHIuYWNjZXB0X3N0YXQgPSBjcHVfdG9fYmUzMigKLQkJCVJQQ19BQ0NFUFRTVEFUX1NVQ0NFU1MpOwotCQlkbF9yZXBseS5yZXBseV9oZHIuZGF0YS5hY2NfaGRyLnZlcmZfZmxhdm9yID0gMDsKLQkJZGxfcmVwbHkucmVwbHlfaGRyLmRhdGEuYWNjX2hkci52ZXJmX2xlbmd0aCA9IDA7Ci0KLQkJbXV0ZXhfbG9jaygmYXVkaW8tPmluX2xvY2spOwotCi0JCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmluX3F1ZXVlKSkgewotCQkJYnVmX25vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+aW5fcXVldWUsCi0JCQkJCQkgICAgc3RydWN0IGF1ZGlvX212c19idWZfbm9kZSwKLQkJCQkJCSAgICBsaXN0KTsKLQkJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0KLQkJCW1lbWNweSgmZGxfcmVwbHkudm9jX3BrdCwKLQkJCSAgICAgICAmYnVmX25vZGUtPmZyYW1lLnZvY19wa3RbMF0sCi0JCQkgICAgICAgYnVmX25vZGUtPmZyYW1lLmxlbik7Ci0KLQkJCU1NX0RCRygiZnJhbWUgbW9kZSAlZCBidWZfbm9kZS0+ZnJhbWUubGVuICVkXG4iLAotCQkJCSBmcmFtZV9tb2RlLCBidWZfbm9kZS0+ZnJhbWUubGVuKTsKLQkJCWlmIChmcmFtZV9tb2RlID09IE1WU19GUkFNRV9NT0RFX0FNUl9ETCkgewotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5nbnJfYXJnLnBhcmFtMSA9IGNwdV90b19iZTMyKAotCQkJCQlidWZfbm9kZS0+ZnJhbWUuZnJhbWVfdHlwZSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGFyYW0yID0KLQkJCQkJCWNwdV90b19iZTMyKGF1ZGlvLT5yYXRlX3R5cGUpOwotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5cCi0JCQkJCQlnbnJfYXJnLnZhbGlkX3BrdF9zdGF0dXNfcHRyID0KLQkJCQkJCQljcHVfdG9fYmUzMigweDAwMDAwMDAxKTsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZ25yX2FyZy5wa3Rfc3RhdHVzID0KLQkJCQkJY3B1X3RvX2JlMzIoQVVESU9fTVZTX1BLVF9OT1JNQUwpOwotCQkJfSBlbHNlIGlmIChmcmFtZV9tb2RlID09IE1WU19GUkFNRV9NT0RFX1BDTV9ETCkgewotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5nbnJfYXJnLnBhcmFtMSA9IDA7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGFyYW0yID0gMDsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uXAotCQkJCQkJZ25yX2FyZy52YWxpZF9wa3Rfc3RhdHVzX3B0ciA9Ci0JCQkJCQkJY3B1X3RvX2JlMzIoMHgwMDAwMDAwMSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGt0X3N0YXR1cyA9Ci0JCQkJCWNwdV90b19iZTMyKEFVRElPX01WU19QS1RfTk9STUFMKTsKLQkJCX0gZWxzZSBpZiAoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9WT0NfUlgpIHsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZ25yX2FyZy5wYXJhbTEgPQotCQkJCQljcHVfdG9fYmUzMihidWZfbm9kZS0+ZnJhbWUuZnJhbWVfdHlwZSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGFyYW0yID0gMDsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uXAotCQkJCQkJZ25yX2FyZy52YWxpZF9wa3Rfc3RhdHVzX3B0ciA9Ci0JCQkJCQkJY3B1X3RvX2JlMzIoMHgwMDAwMDAwMSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGt0X3N0YXR1cyA9Ci0JCQkJCWNwdV90b19iZTMyKEFVRElPX01WU19QS1RfTk9STUFMKTsKLQkJCX0gZWxzZSBpZiAoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9HNzExX0RMKSB7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmc3MTFfYXJnLnBhcmFtMSA9Ci0JCQkJY3B1X3RvX2JlMzIoYnVmX25vZGUtPmZyYW1lLmZyYW1lX3R5cGUpOwotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5cCi0JCQkJCQlnNzExX2FyZy52YWxpZF9wa3Rfc3RhdHVzX3B0ciA9Ci0JCQkJCQkJY3B1X3RvX2JlMzIoMHgwMDAwMDAwMSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmc3MTFfYXJnLnBrdF9zdGF0dXMgPQotCQkJCQljcHVfdG9fYmUzMihBVURJT19NVlNfUEtUX05PUk1BTCk7Ci0JCQl9IGVsc2UgaWYgKGZyYW1lX21vZGUgPT0gTVZTX0ZSQU1FX01PREVfRzcyOUFfREwpIHsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZ25yX2FyZy5wYXJhbTEgPSBjcHVfdG9fYmUzMigKLQkJCQkgICAgICAgYnVmX25vZGUtPmZyYW1lLmZyYW1lX3R5cGUpOwotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5nbnJfYXJnLnBhcmFtMiA9Ci0JCQkJCQljcHVfdG9fYmUzMihhdWRpby0+cmF0ZV90eXBlKTsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uXAotCQkJCQkJZ25yX2FyZy52YWxpZF9wa3Rfc3RhdHVzX3B0ciA9Ci0JCQkJCQkJY3B1X3RvX2JlMzIoMHgwMDAwMDAwMSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGt0X3N0YXR1cyA9Ci0JCQkJCWNwdV90b19iZTMyKEFVRElPX01WU19QS1RfTk9STUFMKTsKLQkJCX0gZWxzZSBpZiAoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9HNzIyX0RMKSB7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGFyYW0xID0gY3B1X3RvX2JlMzIoCi0JCQkJICAgICAgYnVmX25vZGUtPmZyYW1lLmZyYW1lX3R5cGUpOwotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5nbnJfYXJnLnBhcmFtMiA9Ci0JCQkJCQljcHVfdG9fYmUzMihhdWRpby0+cmF0ZV90eXBlKTsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uXAotCQkJCQkJZ25yX2FyZy52YWxpZF9wa3Rfc3RhdHVzX3B0ciA9Ci0JCQkJCQkJY3B1X3RvX2JlMzIoMHgwMDAwMDAwMSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGt0X3N0YXR1cyA9Ci0JCQkJCWNwdV90b19iZTMyKEFVRElPX01WU19QS1RfTk9STUFMKTsKLQkJCX0gZWxzZSBpZiAoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9HNzExQV9ETCkgewotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5nbnJfYXJnLnBhcmFtMSA9IGNwdV90b19iZTMyKAotCQkJCSAgICAgICBidWZfbm9kZS0+ZnJhbWUuZnJhbWVfdHlwZSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGFyYW0yID0KLQkJCQkJCWNwdV90b19iZTMyKGF1ZGlvLT5yYXRlX3R5cGUpOwotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5cCi0JCQkJCQlnbnJfYXJnLnZhbGlkX3BrdF9zdGF0dXNfcHRyID0KLQkJCQkJCQljcHVfdG9fYmUzMigweDAwMDAwMDAxKTsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZ25yX2FyZy5wa3Rfc3RhdHVzID0KLQkJCQkJY3B1X3RvX2JlMzIoQVVESU9fTVZTX1BLVF9OT1JNQUwpOwotCQkJfSBlbHNlIGlmICgoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9HU01fREwpIHx8Ci0JCQkJICAgKGZyYW1lX21vZGUgPT0gTVZTX0ZSQU1FX01PREVfSFJfREwpKSB7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGFyYW0xID0gY3B1X3RvX2JlMzIoCi0JCQkJICAgICAgIGJ1Zl9ub2RlLT5mcmFtZS5mcmFtZV90eXBlKTsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZ25yX2FyZy5wYXJhbTIgPQotCQkJCQkJY3B1X3RvX2JlMzIoYXVkaW8tPnJhdGVfdHlwZSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLlwKLQkJCQkJCWducl9hcmcudmFsaWRfcGt0X3N0YXR1c19wdHIgPQotCQkJCQkJCWNwdV90b19iZTMyKDB4MDAwMDAwMDEpOwotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5nbnJfYXJnLnBrdF9zdGF0dXMgPQotCQkJCQljcHVfdG9fYmUzMihBVURJT19NVlNfUEtUX05PUk1BTCk7Ci0JCQl9IGVsc2UgewotCQkJCU1NX0VSUigiREwgVW5rbm93biBmcmFtZSBtb2RlICVkXG4iLAotCQkJCSAgICAgICBmcmFtZV9tb2RlKTsKLQkJCX0KLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmYXVkaW8tPmZyZWVfaW5fcXVldWUpOwotCQl9IGVsc2UgewotCQkJTU1fREJHKCJObyBETCBkYXRhIGF2YWlsYWJsZSB0byBzZW5kIHRvIE1WU1xuIik7Ci0JCQlpZiAoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9HNzExX0RMKSB7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLlwKLQkJCQkJCWc3MTFfYXJnLnZhbGlkX3BrdF9zdGF0dXNfcHRyID0KLQkJCQkJCQljcHVfdG9fYmUzMigweDAwMDAwMDAxKTsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZzcxMV9hcmcucGt0X3N0YXR1cyA9Ci0JCQkJCQljcHVfdG9fYmUzMihBVURJT19NVlNfUEtUX1NMT1cpOwotCQkJfSBlbHNlIHsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uXAotCQkJCQkJZ25yX2FyZy52YWxpZF9wa3Rfc3RhdHVzX3B0ciA9Ci0JCQkJCQkJY3B1X3RvX2JlMzIoMHgwMDAwMDAwMSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGt0X3N0YXR1cyA9Ci0JCQkJCQljcHVfdG9fYmUzMihBVURJT19NVlNfUEtUX1NMT1cpOwotCQkJfQotCQl9Ci0KLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+aW5fbG9jayk7Ci0KLQkJd2FrZV91cCgmYXVkaW8tPmluX3dhaXQpOwotCQlkbF9yZXBseS52YWxpZF9mcmFtZV9pbmZvX3B0ciA9IGNwdV90b19iZTMyKDB4MDAwMDAwMDEpOwotCi0JCWRsX3JlcGx5LmZyYW1lX21vZGUgPSBjcHVfdG9fYmUzMihhdWRpby0+ZnJhbWVfbW9kZSk7Ci0JCWRsX3JlcGx5LmZyYW1lX21vZGVfYWdhaW4gPSBjcHVfdG9fYmUzMihhdWRpby0+ZnJhbWVfbW9kZSk7Ci0KLQkJZGxfcmVwbHkuZnJhbWVfaW5mb19oZHIuZnJhbWVfbW9kZSA9Ci0JCQljcHVfdG9fYmUzMihhdWRpby0+ZnJhbWVfbW9kZSk7Ci0JCWRsX3JlcGx5LmZyYW1lX2luZm9faGRyLm12c19tb2RlID0gY3B1X3RvX2JlMzIoYXVkaW8tPm12c19tb2RlKTsKLQkJZGxfcmVwbHkuZnJhbWVfaW5mb19oZHIuYnVmX2ZyZWVfY250ID0gMDsKLQotCQlyYyA9IG1zbV9ycGNfd3JpdGUoYXVkaW8tPnJwY19lbmRwdCwKLQkJCQkgICAmZGxfcmVwbHksCi0JCQkJICAgc2l6ZW9mKGRsX3JlcGx5KSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCU1NX0VSUigiUlBDIHdyaXRlIGZvciBETCByZXNwb25zZSBmYWlsZWQgJWRcbiIsCi0JCQkgICAgICAgcmMpOwotCi0JCWJyZWFrOwotCX0KLQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiVW5rbm93biBDQiB0eXBlICVkXG4iLCBwcm9jZWR1cmUpOwotCX0KLX0KLQotc3RhdGljIGludCBhdWRpb19tdnNfdGhyZWFkKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGF1ZGlvX212c19pbmZvX3R5cGUgKmF1ZGlvID0gZGF0YTsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyICpycGNfaGRyID0gTlVMTDsKLQotCU1NX0RCRygiXG4iKTsKLQotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0KLQkJaW50IHJwY19oZHJfbGVuID0gbXNtX3JwY19yZWFkKGF1ZGlvLT5ycGNfZW5kcHQsCi0JCQkJCSAgICAgICAodm9pZCAqKikgJnJwY19oZHIsCi0JCQkJCSAgICAgICAtMSwKLQkJCQkJICAgICAgIC0xKTsKLQotCQlpZiAocnBjX2hkcl9sZW4gPCAwKSB7Ci0JCQlNTV9FUlIoIlJQQyByZWFkIGZhaWxlZCAlZFxuIiwKLQkJCSAgICAgICBycGNfaGRyX2xlbik7Ci0KLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKChycGNfaGRyX2xlbiA9PSAwKSAmJgotCQkJCShhdWRpby0+c3RhdGUgPT0gQVVESU9fTVZTX0NMT1NFRCkpIHsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKHJwY19oZHJfbGVuIDwgUlBDX0NPTU1PTl9IRFJfU1opIHsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgewotCQkJdWludDMyX3QgcnBjX3R5cGUgPSBiZTMyX3RvX2NwdShycGNfaGRyLT50eXBlKTsKLQkJCWlmIChycGNfdHlwZSA9PSBSUENfVFlQRV9SRVBMWSkgewotCQkJCXN0cnVjdCBycGNfcmVwbHlfaGRyICpycGNfcmVwbHkgPQotCQkJCQkodm9pZCAqKSBycGNfaGRyOwotCQkJCXVpbnQzMl90IHJlcGx5X3N0YXR1czsKLQotCQkJCWlmIChycGNfaGRyX2xlbiA8IFJQQ19SRVBMWV9IRFJfU1opCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJcmVwbHlfc3RhdHVzID0KLQkJCQkJYmUzMl90b19jcHUocnBjX3JlcGx5LT5yZXBseV9zdGF0KTsKLQotCQkJCWlmIChyZXBseV9zdGF0dXMgIT0gUlBDTVNHX1JFUExZU1RBVF9BQ0NFUFRFRCkgewotCQkJCQkvKiBJZiB0aGUgY29tbWFuZCBpcyBub3QgYWNjZXB0ZWQsIHRoZXJlCi0JCQkJCSAqIHdpbGwgYmUgbm8gcmVzcG9uc2UgY2FsbGJhY2suIFdha2UKLQkJCQkJICogdGhlIGNhbGxlciBhbmQgcmVwb3J0IGVycm9yLiAqLwotCQkJCQlhdWRpby0+cnBjX3N0YXR1cyA9IFJQQ19TVEFUVVNfUkVKRUNUOwotCi0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQotCQkJCQlNTV9FUlIoIlJQQyByZXBseSBzdGF0dXMgZGVuaWVkXG4iKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHJwY190eXBlID09IFJQQ19UWVBFX1JFUVVFU1QpIHsKLQkJCQlpZiAocnBjX2hkcl9sZW4gPCBSUENfUkVRVUVTVF9IRFJfU1opCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJYXVkaW9fbXZzX3Byb2Nlc3NfcnBjX3JlcXVlc3QoCi0JCQkJCWJlMzJfdG9fY3B1KHJwY19oZHItPnByb2NlZHVyZSksCi0JCQkJCWJlMzJfdG9fY3B1KHJwY19oZHItPnhpZCksCi0JCQkJCSh2b2lkICopIChycGNfaGRyICsgMSksCi0JCQkJCShycGNfaGRyX2xlbiAtIHNpemVvZigqcnBjX2hkcikpLAotCQkJCQlhdWRpbyk7Ci0JCQl9IGVsc2UgewotCQkJCU1NX0VSUigiVW5leHBlY3RlZCBSUEMgdHlwZSAlZFxuIiwgcnBjX3R5cGUpOwotCQkJfQotCQl9Ci0KLQkJa2ZyZWUocnBjX2hkcik7Ci0JCXJwY19oZHIgPSBOVUxMOwotCX0KLQljb21wbGV0ZV9hbmRfZXhpdCgmYXVkaW8tPmNvbXBsZXRlLCAwKTsKLQlNTV9EQkcoIk1WUyB0aHJlYWQgc3RvcHBlZFxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19tdnNfYWxsb2NfYnVmKHN0cnVjdCBhdWRpb19tdnNfaW5mb190eXBlICphdWRpbykKLXsKLQlpbnQgaSA9IDA7Ci0Jc3RydWN0IGF1ZGlvX212c19idWZfbm9kZSAqYnVmX25vZGUgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbmV4dCA9IE5VTEw7Ci0KLQlNTV9EQkcoIlxuIik7Ci0KLQkvKiBBbGxvY2F0ZSBpbnB1dCBidWZmZXJzLiAqLwotCWZvciAoaSA9IDA7IGkgPCBNVlNfTUFYX1FfTEVOOyBpKyspIHsKLQkJYnVmX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkaW9fbXZzX2J1Zl9ub2RlKSwKLQkJCQkgICBHRlBfS0VSTkVMKTsKLQotCQlpZiAoYnVmX25vZGUgIT0gTlVMTCkgewotCQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsCi0JCQkJICAgICAgJmF1ZGlvLT5mcmVlX2luX3F1ZXVlKTsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiTm8gbWVtb3J5IGZvciBJTyBidWZmZXJzXG4iKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCWJ1Zl9ub2RlID0gTlVMTDsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVycy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgTVZTX01BWF9RX0xFTjsgaSsrKSB7Ci0JCWJ1Zl9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvX212c19idWZfbm9kZSksCi0JCQkJICAgR0ZQX0tFUk5FTCk7Ci0KLQkJaWYgKGJ1Zl9ub2RlICE9IE5VTEwpIHsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LAotCQkJCSAgICAgICZhdWRpby0+ZnJlZV9vdXRfcXVldWUpOwotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJObyBtZW1vcnkgZm9yIElPIGJ1ZmZlcnNcbiIpOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJYnVmX25vZGUgPSBOVUxMOwotCX0KLQotCXJldHVybiAwOwotCi1lcnI6Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2luX3F1ZXVlKSB7Ci0JCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhdWRpb19tdnNfYnVmX25vZGUsIGxpc3QpOwotCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCQlrZnJlZShidWZfbm9kZSk7Ci0JCWJ1Zl9ub2RlID0gTlVMTDsKLQl9Ci0KLQlwdHIgPSBuZXh0ID0gTlVMTDsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmZyZWVfb3V0X3F1ZXVlKSB7Ci0JCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhdWRpb19tdnNfYnVmX25vZGUsIGxpc3QpOwotCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCQlrZnJlZShidWZfbm9kZSk7Ci0JCWJ1Zl9ub2RlID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fbXZzX2ZyZWVfYnVmKHN0cnVjdCBhdWRpb19tdnNfaW5mb190eXBlICphdWRpbykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBOVUxMOwotCXN0cnVjdCBhdWRpb19tdnNfYnVmX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKLQotCU1NX0RCRygiXG4iKTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5pbl9sb2NrKTsKLQkvKiBGcmVlIGlucHV0IGJ1ZmZlcnMuICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5pbl9xdWV1ZSkgewotCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXVkaW9fbXZzX2J1Zl9ub2RlLCBsaXN0KTsKLQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKLQkJa2ZyZWUoYnVmX25vZGUpOwotCQlidWZfbm9kZSA9IE5VTEw7Ci0JfQotCi0JcHRyID0gbmV4dCA9IE5VTEw7Ci0JLyogRnJlZSBmcmVlX2lucHV0IGJ1ZmZlcnMuICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2luX3F1ZXVlKSB7Ci0JCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhdWRpb19tdnNfYnVmX25vZGUsIGxpc3QpOwotCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCQlrZnJlZShidWZfbm9kZSk7Ci0JCWJ1Zl9ub2RlID0gTlVMTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+aW5fbG9jayk7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+b3V0X2xvY2spOwotCXB0ciA9IG5leHQgPSBOVUxMOwotCS8qIEZyZWUgb3V0cHV0IGJ1ZmZlcnMuICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5vdXRfcXVldWUpIHsKLQkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGF1ZGlvX212c19idWZfbm9kZSwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0JCWtmcmVlKGJ1Zl9ub2RlKTsKLQkJYnVmX25vZGUgPSBOVUxMOwotCX0KLQotCS8qIEZyZWUgZnJlZV9pb3V0cHV0IGJ1ZmZlcnMuICovCi0JcHRyID0gbmV4dCA9IE5VTEw7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX291dF9xdWV1ZSkgewotCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXVkaW9fbXZzX2J1Zl9ub2RlLCBsaXN0KTsKLQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKLQkJa2ZyZWUoYnVmX25vZGUpOwotCQlidWZfbm9kZSA9IE5VTEw7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPm91dF9sb2NrKTsKLX0KLXN0YXRpYyBpbnQgYXVkaW9fbXZzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0KLQlzdHJ1Y3QgYXVkaW9fbXZzX2luZm9fdHlwZSAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlNTV9EQkcoIlxuIik7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JaWYgKGF1ZGlvLT5zdGF0ZSA9PSBBVURJT19NVlNfU1RBUlRFRCkKLQkJYXVkaW9fbXZzX3N0b3AoYXVkaW8pOwotCWF1ZGlvLT5zdGF0ZSA9IEFVRElPX01WU19DTE9TRUQ7Ci0JbXNtX3JwY19yZWFkX3dha2V1cChhdWRpby0+cnBjX2VuZHB0KTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZhdWRpby0+Y29tcGxldGUpOwotCW1zbV9ycGNfY2xvc2UoYXVkaW8tPnJwY19lbmRwdCk7Ci0JYXVkaW8tPnRhc2sgPSBOVUxMOwotCWF1ZGlvX212c19mcmVlX2J1ZihhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0KLQlNTV9EQkcoIlJlbGVhc2UgZG9uZVxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGlvX212c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgICAgIHNpemVfdCBjb3VudCwKLQkJCSAgICAgIGxvZmZfdCAqcG9zKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGF1ZGlvX212c19idWZfbm9kZSAqYnVmX25vZGUgPSBOVUxMOwotCXN0cnVjdCBhdWRpb19tdnNfaW5mb190eXBlICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCU1NX0RCRygiXG4iKTsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPm91dF93YWl0LAotCQkJKCFsaXN0X2VtcHR5KCZhdWRpby0+b3V0X3F1ZXVlKSB8fAotCQkJIGF1ZGlvLT5zdGF0ZSA9PSBBVURJT19NVlNfU1RPUFBFRCksCi0JCQkxICogSFopOwotCi0JaWYgKHJjID4gMCkgewotCQltdXRleF9sb2NrKCZhdWRpby0+b3V0X2xvY2spOwotCQlpZiAoKGF1ZGlvLT5zdGF0ZSA9PSBBVURJT19NVlNfU1RBUlRFRCkgJiYKLQkJICAgICghbGlzdF9lbXB0eSgmYXVkaW8tPm91dF9xdWV1ZSkpKSB7Ci0KLQkJCWlmIChjb3VudCA+PSBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19tdnNfZnJhbWUpKSB7Ci0JCQkJYnVmX25vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+b3V0X3F1ZXVlLAotCQkJCQkJc3RydWN0IGF1ZGlvX212c19idWZfbm9kZSwKLQkJCQkJCWxpc3QpOwotCQkJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0KLQkJCQlyYyA9IGNvcHlfdG9fdXNlcihidWYsCi0JCQkJCSZidWZfbm9kZS0+ZnJhbWUsCi0JCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX212c19mcmFtZSkpOwotCi0JCQkJaWYgKHJjID09IDApIHsKLQkJCQkJcmMgPSBidWZfbm9kZS0+ZnJhbWUubGVuICsKLQkJCQkJICAgIHNpemVvZihidWZfbm9kZS0+ZnJhbWUuZnJhbWVfdHlwZSkgKwotCQkJCQkgICAgc2l6ZW9mKGJ1Zl9ub2RlLT5mcmFtZS5sZW4pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU1NX0VSUigiQ29weSB0byB1c2VyIHJldHVuZWQgJWQiLCByYyk7Ci0KLQkJCQkJcmMgPSAtRUZBVUxUOwotCQkJCX0KLQotCQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LAotCQkJCQkgICAgICAmYXVkaW8tPmZyZWVfb3V0X3F1ZXVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTU1fRVJSKCJSZWFkIGNvdW50ICVkIDwgc2l6ZW9mKGZyYW1lKSAlZCIsCi0JCQkJICAgICAgIGNvdW50LAotCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19tdnNfZnJhbWUpKTsKLQotCQkJCXJjID0gLUVOT01FTTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiUmVhZCBwZXJmb3JtZWQgaW4gc3RhdGUgJWRcbiIsCi0JCQkgICAgICAgYXVkaW8tPnN0YXRlKTsKLQotCQkJcmMgPSAtRVBFUk07Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+b3V0X2xvY2spOwotCi0JfSBlbHNlIGlmIChyYyA9PSAwKSB7Ci0JCU1NX0VSUigiTm8gVUwgZGF0YSBhdmFpbGFibGVcbiIpOwotCi0JCXJjID0gLUVUSU1FRE9VVDsKLQl9IGVsc2UgewotCQlNTV9FUlIoIlJlYWQgd2FzIGludGVycnVwdGVkXG4iKTsKLQotCQlyYyA9IC1FUkVTVEFSVFNZUzsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGlvX212c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgICAgIHNpemVfdCBjb3VudCwKLQkJCSAgICAgICBsb2ZmX3QgKnBvcykKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBhdWRpb19tdnNfYnVmX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKLQlzdHJ1Y3QgYXVkaW9fbXZzX2luZm9fdHlwZSAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlNTV9EQkcoIlxuIik7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT5pbl93YWl0LAotCQkoIWxpc3RfZW1wdHkoJmF1ZGlvLT5mcmVlX2luX3F1ZXVlKSB8fAotCQlhdWRpby0+c3RhdGUgPT0gQVVESU9fTVZTX1NUT1BQRUQpLCAxICogSFopOwotCWlmIChyYyA+IDApIHsKLQkJbXV0ZXhfbG9jaygmYXVkaW8tPmluX2xvY2spOwotCQlpZiAoYXVkaW8tPnN0YXRlID09IEFVRElPX01WU19TVEFSVEVEKSB7Ci0JCQlpZiAoY291bnQgPD0gc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fbXZzX2ZyYW1lKSkgewotCQkJCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmZyZWVfaW5fcXVldWUpKSB7Ci0JCQkJCWJ1Zl9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgKLQkJCQkJCSZhdWRpby0+ZnJlZV9pbl9xdWV1ZSwKLQkJCQkJCXN0cnVjdCBhdWRpb19tdnNfYnVmX25vZGUsCi0JCQkJCQlsaXN0KTsKLQkJCQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKLQotCQkJCQlyYyA9IGNvcHlfZnJvbV91c2VyKCZidWZfbm9kZS0+ZnJhbWUsCi0JCQkJCQkJICAgIGJ1ZiwKLQkJCQkJCQkgICAgY291bnQpOwotCi0JCQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LAotCQkJCQkJICAgICAgJmF1ZGlvLT5pbl9xdWV1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTU1fRVJSKCJObyBmcmVlIERMIGJ1ZmZzXG4iKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCU1NX0VSUigiV3JpdGUgY291bnQgJWQgPiBzaXplb2YoZnJhbWUpICVkIiwKLQkJCQkJY291bnQsCi0JCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX212c19mcmFtZSkpOwotCi0JCQkJcmMgPSAtRU5PTUVNOwotCQkJfQotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJXcml0ZSBwZXJmb3JtZWQgaW4gaW52YWxpZCBzdGF0ZSAlZFxuIiwKLQkJCQlhdWRpby0+c3RhdGUpOwotCi0JCQlyYyA9IC1FUEVSTTsKLQkJfQotCQltdXRleF91bmxvY2soJmF1ZGlvLT5pbl9sb2NrKTsKLQl9IGVsc2UgaWYgKHJjID09IDApIHsKLQkJTU1fRVJSKCIlczogTm8gZnJlZSBETCBidWZmc1xuIiwgX19mdW5jX18pOwotCi0JCXJjID0gLUVUSU1FRE9VVDsKLQl9IGVsc2UgewotCQlNTV9FUlIoIiVzOiB3cml0ZSB3YXMgaW50ZXJydXB0ZWRcbiIsIF9fZnVuY19fKTsKLQotCQlyYyA9IC1FUkVTVEFSVFNZUzsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19tdnNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmMgPSAwOwotCi0Jc3RydWN0IGF1ZGlvX212c19pbmZvX3R5cGUgKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JTU1fREJHKCJcbiIpOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0dFVF9NVlNfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fbXZzX2NvbmZpZyBjb25maWc7Ci0KLQkJTU1fREJHKCJHRVRfTVZTX0NPTkZJRyBtdnNfbW9kZSAlZCByYXRlX3R5cGUgJWRcbiIsCi0JCQljb25maWcubXZzX21vZGUsIGNvbmZpZy5yYXRlX3R5cGUpOwotCi0JCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQkJY29uZmlnLm12c19tb2RlID0gYXVkaW8tPm12c19tb2RlOwotCQljb25maWcucmF0ZV90eXBlID0gYXVkaW8tPnJhdGVfdHlwZTsKLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0KLQkJcmMgPSBjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjb25maWcsIHNpemVvZihjb25maWcpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyYyA9IHNpemVvZihjb25maWcpOwotCQllbHNlCi0JCQlNTV9FUlIoIkNvbmZpZyBjb3B5IGZhaWxlZCAlZFxuIiwgcmMpOwotCi0JCWJyZWFrOwotCX0KLQotCWNhc2UgQVVESU9fU0VUX01WU19DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19tdnNfY29uZmlnIGNvbmZpZzsKLQotCQlNTV9EQkcoIklPQ1RMIFNFVF9NVlNfQ09ORklHXG4iKTsKLQotCQlyYyA9IGNvcHlfZnJvbV91c2VyKCZjb25maWcsICh2b2lkICopYXJnLCBzaXplb2YoY29uZmlnKSk7Ci0JCWlmIChyYyA9PSAwKSB7Ci0JCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0KLQkJCWlmIChhdWRpby0+c3RhdGUgPT0gQVVESU9fTVZTX09QRU5FRCkgewotCQkJCWF1ZGlvLT5tdnNfbW9kZSA9IGNvbmZpZy5tdnNfbW9kZTsKLQkJCQlhdWRpby0+cmF0ZV90eXBlID0gY29uZmlnLnJhdGVfdHlwZTsKLQkJCQlhdWRpby0+ZHR4X21vZGUgPSBjb25maWcuZHR4X21vZGU7Ci0JCQl9IGVsc2UgewotCQkJCU1NX0VSUigiU2V0IGNvbmZnIGNhbGxlZCBpbiBzdGF0ZSAlZFxuIiwKLQkJCQkgICAgICAgYXVkaW8tPnN0YXRlKTsKLQotCQkJCXJjID0gLUVQRVJNOwotCQkJfQotCi0JCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiQ29uZmlnIGNvcHkgZmFpbGVkICVkXG4iLCByYyk7Ci0JCX0KLQotCQlicmVhazsKLQl9Ci0KLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCU1NX0RCRygiSU9DVEwgU1RBUlRcbiIpOwotCi0JCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQotCQlpZiAoYXVkaW8tPnN0YXRlID09IEFVRElPX01WU19PUEVORUQgfHwKLQkJICAgIGF1ZGlvLT5zdGF0ZSA9PSBBVURJT19NVlNfU1RPUFBFRCkgewotCQkJcmMgPSBhdWRpb19tdnNfc3RhcnQoYXVkaW8pOwotCQkJaWYgKHJjICE9IDApCi0JCQkJYXVkaW9fbXZzX3N0b3AoYXVkaW8pOwotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJTdGFydCBjYWxsZWQgaW4gaW52YWxpZCBzdGF0ZSAlZFxuIiwKLQkJCSAgICAgICBhdWRpby0+c3RhdGUpOwotCi0JCQlyYyA9IC1FUEVSTTsKLQkJfQotCi0JCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCi0JCWJyZWFrOwotCX0KLQotCWNhc2UgQVVESU9fU1RPUDogewotCQlNTV9EQkcoIklPQ1RMIFNUT1BcbiIpOwotCi0JCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQotCQlpZiAoYXVkaW8tPnN0YXRlID09IEFVRElPX01WU19TVEFSVEVEKSB7Ci0JCQlyYyA9IGF1ZGlvX212c19zdG9wKGF1ZGlvKTsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiU3RvcCBjYWxsZWQgaW4gaW52YWxpZCBzdGF0ZSAlZFxuIiwKLQkJCSAgICAgICBhdWRpby0+c3RhdGUpOwotCi0JCQlyYyA9IC1FUEVSTTsKLQkJfQotCi0JCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCQlicmVhazsKLQl9Ci0KLQlkZWZhdWx0OiB7Ci0JCU1NX0VSUigiVW5rbm93biBJT0NUTCAlZFxuIiwgY21kKTsKLQl9Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX212c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoIlxuIik7Ci0KLQltdXRleF9sb2NrKCZhdWRpb19tdnNfaW5mby5sb2NrKTsKLQotCWlmIChhdWRpb19tdnNfaW5mby5zdGF0ZSAhPSBBVURJT19NVlNfQ0xPU0VEKSB7Ci0JCU1NX0VSUigiTVZTIGRyaXZlciBleGlzdHMsIHN0YXRlICVkXG4iLAotCQkJCWF1ZGlvX212c19pbmZvLnN0YXRlKTsKLQotCQlyYyA9IC1FQlVTWTsKLQkJbXV0ZXhfdW5sb2NrKCZhdWRpb19tdnNfaW5mby5sb2NrKTsKLQkJZ290byBkb25lOwotCX0KLQotCW11dGV4X3VubG9jaygmYXVkaW9fbXZzX2luZm8ubG9jayk7Ci0KLQlhdWRpb19tdnNfaW5mby5ycGNfZW5kcHQgPSBtc21fcnBjX2Nvbm5lY3RfY29tcGF0aWJsZShNVlNfUFJPRywKLQkJCQkJTVZTX1ZFUlNfQ09NUF9WRVIyLAotCQkJCQlNU01fUlBDX1VOSU5URVJSVVBUSUJMRSk7Ci0KLQlpZiAoSVNfRVJSKGF1ZGlvX212c19pbmZvLnJwY19lbmRwdCkpIHsKLQkJTU1fRVJSKCJNVlMgUlBDIGNvbm5lY3QgZmFpbGVkIHZlciAweCV4XG4iLAotCQkJCU1WU19WRVJTX0NPTVBfVkVSMik7Ci0JCWF1ZGlvX212c19pbmZvLnJwY19lbmRwdCA9IG1zbV9ycGNfY29ubmVjdF9jb21wYXRpYmxlKE1WU19QUk9HLAotCQkJCQlNVlNfVkVSU19DT01QX1ZFUjMsCi0JCQkJCU1TTV9SUENfVU5JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKElTX0VSUihhdWRpb19tdnNfaW5mby5ycGNfZW5kcHQpKSB7Ci0JCQlNTV9FUlIoIk1WUyBSUEMgY29ubmVjdCBmYWlsZWQgdmVyIDB4JXhcbiIsCi0JCQkJTVZTX1ZFUlNfQ09NUF9WRVIzKTsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygiTVZTIFJQQyBjb25uZWN0IHN1Y2NlZWRlZCB2ZXIgMHgleFxuIiwKLQkJCQlNVlNfVkVSU19DT01QX1ZFUjMpOwotCQkJYXVkaW9fbXZzX2luZm8ucnBjX3Byb2cgPSBNVlNfUFJPRzsKLQkJCWF1ZGlvX212c19pbmZvLnJwY192ZXIgPSBNVlNfVkVSU19DT01QX1ZFUjM7Ci0JCX0KLQl9IGVsc2UgewotCQlNTV9EQkcoIk1WUyBSUEMgY29ubmVjdCBzdWNjZWVkZWQgdmVyIDB4JXhcbiIsCi0JCQlNVlNfVkVSU19DT01QX1ZFUjIpOwotCQlhdWRpb19tdnNfaW5mby5ycGNfcHJvZyA9IE1WU19QUk9HOwotCQlhdWRpb19tdnNfaW5mby5ycGNfdmVyID0gTVZTX1ZFUlNfQ09NUF9WRVIyOwotCX0KLQlhdWRpb19tdnNfaW5mby50YXNrID0ga3RocmVhZF9ydW4oYXVkaW9fbXZzX3RocmVhZCwKLQkJCQkJICAmYXVkaW9fbXZzX2luZm8sCi0JCQkJCSAgImF1ZGlvX212cyIpOwotCWlmIChJU19FUlIoYXVkaW9fbXZzX2luZm8udGFzaykpIHsKLQkJTU1fRVJSKCJNVlMgdGhyZWFkIGNyZWF0ZSBmYWlsZWRcbiIpOwotCQlyYyA9IFBUUl9FUlIoYXVkaW9fbXZzX2luZm8udGFzayk7Ci0JCWF1ZGlvX212c19pbmZvLnRhc2sgPSBOVUxMOwotCQltc21fcnBjX2Nsb3NlKGF1ZGlvX212c19pbmZvLnJwY19lbmRwdCk7Ci0JCWF1ZGlvX212c19pbmZvLnJwY19lbmRwdCA9IE5VTEw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpb19tdnNfaW5mby5sb2NrKTsKLQotCWlmIChhdWRpb19tdnNfaW5mby50YXNrICE9IE5VTEwgfHwKLQkJCWF1ZGlvX212c19pbmZvLnJwY19lbmRwdCAhPSBOVUxMKSB7Ci0JCXJjID0gYXVkaW9fbXZzX2FsbG9jX2J1ZigmYXVkaW9fbXZzX2luZm8pOwotCi0JCWlmIChyYyA9PSAwKSB7Ci0JCQlhdWRpb19tdnNfaW5mby5zdGF0ZSA9IEFVRElPX01WU19PUEVORUQ7Ci0JCQlmaWxlLT5wcml2YXRlX2RhdGEgPSAmYXVkaW9fbXZzX2luZm87Ci0JCX0KLQl9ICBlbHNlIHsKLQkJTU1fRVJSKCJNVlMgdGhyZWFkIGFuZCBSUEMgZW5kIHBvaW50IGRvIG5vdCBleGlzdFxuIik7Ci0KLQkJcmMgPSAtRU5PREVWOwotCX0KLQotCW11dGV4X3VubG9jaygmYXVkaW9fbXZzX2luZm8ubG9jayk7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19tdnNfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IGF1ZGlvX212c19vcGVuLAotCS5yZWxlYXNlID0gYXVkaW9fbXZzX3JlbGVhc2UsCi0JLnJlYWQgPSBhdWRpb19tdnNfcmVhZCwKLQkud3JpdGUgPSBhdWRpb19tdnNfd3JpdGUsCi0JLnVubG9ja2VkX2lvY3RsID0gYXVkaW9fbXZzX2lvY3RsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19tdnNfbWlzYyA9IHsKLQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUgPSAibXNtX212cyIsCi0JLmZvcHMgPSAmYXVkaW9fbXZzX2ZvcHMKLX07Ci1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19tdnNfaW5pdCh2b2lkKQotewotCW1lbXNldCgmYXVkaW9fbXZzX2luZm8sIDAsIHNpemVvZihhdWRpb19tdnNfaW5mbykpOwotCW11dGV4X2luaXQoJmF1ZGlvX212c19pbmZvLmxvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvX212c19pbmZvLmluX2xvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvX212c19pbmZvLm91dF9sb2NrKTsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvX212c19pbmZvLndhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvX212c19pbmZvLm1vZGVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW9fbXZzX2luZm8uaW5fd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW9fbXZzX2luZm8ub3V0X3dhaXQpOwotCi0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvX212c19pbmZvLmluX3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW9fbXZzX2luZm8uZnJlZV9pbl9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvX212c19pbmZvLm91dF9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvX212c19pbmZvLmZyZWVfb3V0X3F1ZXVlKTsKLQotCWluaXRfY29tcGxldGlvbigmYXVkaW9fbXZzX2luZm8uY29tcGxldGUpOwotCi0Jd2FrZV9sb2NrX2luaXQoJmF1ZGlvX212c19pbmZvLnN1c3BlbmRfbG9jaywKLQkJICAgICAgIFdBS0VfTE9DS19TVVNQRU5ELAotCQkgICAgICAgImF1ZGlvX212c19zdXNwZW5kIik7Ci0JcG1fcW9zX2FkZF9yZXF1ZXN0KCZhdWRpb19tdnNfaW5mby5wbV9xb3NfcmVxLCBQTV9RT1NfQ1BVX0RNQV9MQVRFTkNZLAotCQkJCVBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19tdnNfbWlzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdWRpb19tdnNfZXhpdCh2b2lkKQotewotCU1NX0RCRygiXG4iKTsKLQotCXdha2VfbG9ja19kZXN0cm95KCZhdWRpb19tdnNfaW5mby5zdXNwZW5kX2xvY2spOwotCW1pc2NfZGVyZWdpc3RlcigmYXVkaW9fbXZzX21pc2MpOwotfQotCi1tb2R1bGVfaW5pdChhdWRpb19tdnNfaW5pdCk7Ci1tb2R1bGVfZXhpdChhdWRpb19tdnNfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIE1WUyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fb3V0LmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19vdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdmOWY0Yy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19vdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMzMgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fb3V0LmMKLSAqCi0gKiBwY20gYXVkaW8gb3V0cHV0IGRldmljZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9xb3MuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotCi0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bWFjaC9jcHVpZGxlLmg+Ci0KLSNpbmNsdWRlICJhdWRtZ3IuaCIKLQotI2luY2x1ZGUgPG1hY2gvcWRzcDUvYXVkaW9fYWNkYl9kZWYuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHBjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2h0Y19wd3JzaW5rLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi0jaW5jbHVkZSAiZXZsb2cuaCIKLQotI2RlZmluZSBMT0dfQVVESU9fRVZFTlRTIDEKLSNkZWZpbmUgTE9HX0FVRElPX0ZBVUxUUyAwCi0KLSNkZWZpbmUgU1JTX0lEX0dMT0JBTAkJCTB4MDAwMDAwMDEKLSNkZWZpbmUgU1JTX0lEX1dPV0hECQkJMHgwMDAwMDAwMgotI2RlZmluZSBTUlNfSURfQ1NIUAkJCTB4MDAwMDAwMDMKLSNkZWZpbmUgU1JTX0lEX0hQRgkJCTB4MDAwMDAwMDQKLSNkZWZpbmUgU1JTX0lEX1BFUQkJCTB4MDAwMDAwMDUKLSNkZWZpbmUgU1JTX0lEX0hMCQkJMHgwMDAwMDAwNgotCi0jZGVmaW5lIFNSU19NQVNLX0cgMQotI2RlZmluZSBTUlNfTUFTS19XIDIKLSNkZWZpbmUgU1JTX01BU0tfQyA0Ci0jZGVmaW5lIFNSU19NQVNLX0hQIDgKLSNkZWZpbmUgU1JTX01BU0tfUCAxNgotI2RlZmluZSBTUlNfTUFTS19ITCAzMgotCi0KLWVudW0gewotCUVWX05VTEwsCi0JRVZfT1BFTiwKLQlFVl9XUklURSwKLQlFVl9SRVRVUk4sCi0JRVZfSU9DVEwsCi0JRVZfV1JJVEVfV0FJVCwKLQlFVl9XQUlUX0VWRU5ULAotCUVWX0ZJTExfQlVGRkVSLAotCUVWX1NFTkRfQlVGRkVSLAotCUVWX0RTUF9FVkVOVCwKLQlFVl9FTkFCTEUsCi19OwotCi0jaWYgKExPR19BVURJT19FVkVOVFMgIT0gMSkKLXN0YXRpYyBpbmxpbmUgdm9pZCBMT0codW5zaWduZWQgaWQsIHVuc2lnbmVkIGFyZykge30KLSNlbHNlCi1zdGF0aWMgY29uc3QgY2hhciAqcGNtX2xvZ19zdHJpbmdzW10gPSB7Ci0JIk5VTEwiLAotCSJPUEVOIiwKLQkiV1JJVEUiLAotCSJSRVRVUk4iLAotCSJJT0NUTCIsCi0JIldSSVRFX1dBSVQiLAotCSJXQUlUX0VWRU5UIiwKLQkiRklMTF9CVUZGRVIiLAotCSJTRU5EX0JVRkZFUiIsCi0JIkRTUF9FVkVOVCIsCi0JIkVOQUJMRSIsCi19OwotCi1ERUNMQVJFX0xPRyhwY21fbG9nLCA2NCwgcGNtX2xvZ19zdHJpbmdzKTsKLQotc3RhdGljIGludCBfX2luaXQgX3BjbV9sb2dfaW5pdCh2b2lkKQotewotCXJldHVybiBldl9sb2dfaW5pdCgmcGNtX2xvZyk7Ci19Ci1tb2R1bGVfaW5pdChfcGNtX2xvZ19pbml0KTsKLQotI2RlZmluZSBMT0coaWQsYXJnKSBldl9sb2dfd3JpdGUoJnBjbV9sb2csIGlkLCBhcmcpCi0jZW5kaWYKLQotCi0KLQotCi0jZGVmaW5lIEJVRlNaICg1MjQ4KQotI2RlZmluZSBETUFTWiAoQlVGU1ogKiAyKQotCi0jZGVmaW5lIENPTU1PTl9PQkpfSUQgNgotCi1zdHJ1Y3QgYnVmZmVyIHsKLQl2b2lkICpkYXRhOwotCXVuc2lnbmVkIHNpemU7Ci0JdW5zaWduZWQgdXNlZDsKLQl1bnNpZ25lZCBhZGRyOwotfTsKLQotc3RydWN0IGF1ZGlvIHsKLQlzdHJ1Y3QgYnVmZmVyIG91dFsyXTsKLQotCXNwaW5sb2NrX3QgZHNwX2xvY2s7Ci0KLQl1aW50OF90IG91dF9oZWFkOwotCXVpbnQ4X3Qgb3V0X3RhaWw7Ci0JdWludDhfdCBvdXRfbmVlZGVkOyAvKiBudW1iZXIgb2YgYnVmZmVycyB0aGUgZHNwIGlzIHdhaXRpbmcgZm9yICovCi0KLQlhdG9taWNfdCBvdXRfYnl0ZXM7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggd3JpdGVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCi0JLyogY29uZmlndXJhdGlvbiB0byB1c2Ugb24gbmV4dCBlbmFibGUgKi8KLQl1aW50MzJfdCBvdXRfc2FtcGxlX3JhdGU7Ci0JdWludDMyX3Qgb3V0X2NoYW5uZWxfbW9kZTsKLQl1aW50MzJfdCBvdXRfd2VpZ2h0OwotCXVpbnQzMl90IG91dF9idWZmZXJfc2l6ZTsKLQotCXN0cnVjdCBhdWRtZ3IgYXVkbWdyOwotCi0JLyogZGF0YSBhbGxvY2F0ZWQgZm9yIHZhcmlvdXMgYnVmZmVycyAqLwotCWNoYXIgKmRhdGE7Ci0JZG1hX2FkZHJfdCBwaHlzOwotCi0JaW50IHRlb3M7IC8qIHZhbGlkIG9ubHkgaWYgdHVubmVsIG1vZGUgJiBubyBkYXRhIGxlZnQgZm9yIGRlY29kZXIgKi8KLQlpbnQgb3BlbmVkOwotCWludCBlbmFibGVkOwotCWludCBydW5uaW5nOwotCWludCBzdG9wcGVkOyAvKiBzZXQgd2hlbiBzdG9wcGVkLCBjbGVhcmVkIG9uIGZsdXNoICovCi0KLQlzdHJ1Y3Qgd2FrZV9sb2NrIHdha2Vsb2NrOwotCXN0cnVjdCBwbV9xb3NfcmVxdWVzdCBwbV9xb3NfcmVxOwotCi0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3ZvbHVtZSB2b2xfcGFuOwotfTsKLQotc3RydWN0IGF1ZGlvX2NvcHAgewotCWludCBtYmFkcmNfZW5hYmxlOwotCWludCBtYmFkcmNfbmVlZHNfY29tbWl0OwotCWNoYXIgKm1iYWRyY19kYXRhOwotCWRtYV9hZGRyX3QgbWJhZHJjX3BoeXM7Ci0KLQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfbWJhZHJjIG1iYWRyYzsKLQotCWludCBlcV9lbmFibGU7Ci0JaW50IGVxX25lZWRzX2NvbW1pdDsKLQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfZXFhbGl6ZXIgZXE7Ci0KLQlpbnQgcnhfaWlyX2VuYWJsZTsKLQlpbnQgcnhfaWlyX25lZWRzX2NvbW1pdDsKLQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfcGNtIGlpcjsKLQotCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUgdm9sX3BhbjsKLQotCWludCBxY29uY2VydF9wbHVzX2VuYWJsZTsKLQlpbnQgcWNvbmNlcnRfcGx1c19uZWVkc19jb21taXQ7Ci0KLQlpbnQgc3JzX2VuYWJsZTsKLQlpbnQgc3JzX25lZWRzX2NvbW1pdDsKLQlpbnQgc3JzX2ZlYXR1cmVfbWFzazsKLQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfcWNvbmNlcnQgcWNvbmNlcnRfcGx1czsKLQlpbnQgc3JzX2N1cnJlbnRfZmVhdHVyZV9tYXNrOwotCXVpbnQzMl90IGF1ZHBwX2Rpc2FibGVkX2ZlYXR1cmVzOwotCi0JaW50IHN0YXR1czsKLQlpbnQgb3BlbmVkOwotCXN0cnVjdCBtdXRleCBsb2NrOwotCi0Jc3RydWN0IGF1ZHBwX2V2ZW50X2NhbGxiYWNrIGVjYjsKLQotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3JzdG1fZyBnOwotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3JzdG1fdyB3OwotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3JzdG1fYyBjOwotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3JzdG1faCBoOwotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3JzdG1fcCBwOwotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3JzdG1fbCBsOwotfSB0aGVfYXVkaW9fY29wcDsKLQotc3RhdGljIHZvaWQgYXVkaW9fcHJldmVudF9zbGVlcChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0Jd2FrZV9sb2NrKCZhdWRpby0+d2FrZWxvY2spOwotCXBtX3Fvc191cGRhdGVfcmVxdWVzdCgmYXVkaW8tPnBtX3Fvc19yZXEsCi0JCQkgICAgICBtc21fY3B1aWRsZV9nZXRfZGVlcF9pZGxlX2xhdGVuY3koKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2FsbG93X3NsZWVwKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KCZhdWRpby0+cG1fcW9zX3JlcSwgUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotCXdha2VfdW5sb2NrKCZhdWRpby0+d2FrZWxvY2spOwotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZHNwX291dF9lbmFibGUoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHllcyk7Ci1zdGF0aWMgaW50IGF1ZGlvX2RzcF9zZW5kX2J1ZmZlcihzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBpZCwgdW5zaWduZWQgbGVuKTsKLQotc3RhdGljIHZvaWQgYXVkaW9fZHNwX2V2ZW50KHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGlkLCB1aW50MTZfdCAqbXNnKTsKLXN0YXRpYyBpbnQgYXVkaW9fZW5hYmxlX3Nyc190cnVtZWRpYShzdHJ1Y3QgYXVkaW9fY29wcCAqYXVkaW9fY29wcCwgaW50IGVuYWJsZSk7Ci0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkaW9fZW5hYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZG1ncl9jb25maWcgY2ZnOwotCWludCByYzsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCXJldHVybiAwOwkKLQotCS8qIHJlZnVzZSB0byBzdGFydCBpZiB3ZSdyZSBub3QgcmVhZHkgKi8KLQlpZiAoIWF1ZGlvLT5vdXRbMF0udXNlZCB8fCAhYXVkaW8tPm91dFsxXS51c2VkKQotCQlyZXR1cm4gLUVJTzsKLQotCS8qIHdlIHN0YXJ0IGJ1ZmZlcnMgMCBhbmQgMSwgc28gYnVmZmVyIDAgd2lsbCBiZSB0aGUKLQkgKiBuZXh0IG9uZSB0aGUgZHNwIHdpbGwgd2FudAotCSAqLwotCWF1ZGlvLT5vdXRfdGFpbCA9IDA7Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCi0JY2ZnLnR4X3JhdGUgPSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV9OT05FOwotCWNmZy5yeF9yYXRlID0gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfNDgwMDA7Ci0JY2ZnLmRlZl9tZXRob2QgPSBSUENfQVVEX0RFRl9NRVRIT0RfSE9TVF9QQ007Ci0JY2ZnLmNvZGVjID0gUlBDX0FVRF9ERUZfQ09ERUNfUENNOwotCWNmZy5zbmRfbWV0aG9kID0gUlBDX1NORF9NRVRIT0RfTUlESTsKLQotCWF1ZGlvX3ByZXZlbnRfc2xlZXAoYXVkaW8pOwkKLQlyYyA9IGF1ZG1ncl9lbmFibGUoJmF1ZGlvLT5hdWRtZ3IsICZjZmcpOwotCWlmIChyYyA8IDApIHsKLQkJYXVkaW9fYWxsb3dfc2xlZXAoYXVkaW8pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKGF1ZHBwX2VuYWJsZSgtMSwgYXVkaW9fZHNwX2V2ZW50LCBhdWRpbykpIHsKLQkJTU1fRVJSKCJhdWRwcF9lbmFibGUoKSBmYWlsZWRcbiIpOwotCQlhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCWF1ZGlvX2FsbG93X3NsZWVwKGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JYXVkaW8tPmVuYWJsZWQgPSAxOwotCWh0Y19wd3JzaW5rX3NldChQV1JTSU5LX0FVRElPLCAxMDApOwotCXJldHVybiAwOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkaW9fZGlzYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JaWYgKGF1ZGlvLT5lbmFibGVkKSB7Ci0JCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJYXVkaW9fZHNwX291dF9lbmFibGUoYXVkaW8sIDApOwotCi0JCWF1ZHBwX2Rpc2FibGUoLTEsIGF1ZGlvKTsKLQotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCWF1ZGlvX2FsbG93X3NsZWVwKGF1ZGlvKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgYXVkaW9fY29tbWl0X3BlbmRpbmdfcHBfcGFyYW1zKHZvaWQgKnByaXYsIHVuc2lnbmVkIGlkLCB1aW50MTZfdCAqbXNnKQotewotCXN0cnVjdCBhdWRpb19jb3BwICphdWRpb19jb3BwID0gcHJpdjsKLQotCWlmIChhdWRpb19jb3BwID09IE5VTEwpIHsKLQkJTU1fRVJSKCJOVUxMIGF1ZGlvIGNvcHAgcG9pbnRlclxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoQVVEUFBfTVNHX0NGR19NU0cgPT0gaWQgJiYgbXNnWzBdID09IEFVRFBQX01TR19FTkFfRElTKSB7Ci0JCWF1ZGlvX2NvcHAtPmF1ZHBwX2Rpc2FibGVkX2ZlYXR1cmVzID0gMDsKLQkJcmV0dXJuOwotCX0KLQlpZiAoQVVEUFBfTVNHX0NGR19NU0cgPT0gaWQgJiYgbXNnWzBdID09IEFVRFBQX01TR19FTkFfRU5BKQotCQlhdWRpb19jb3BwLT5hdWRwcF9kaXNhYmxlZF9mZWF0dXJlcyA9IDA7Ci0KLQlpZiAoIWF1ZGlvX2NvcHAtPnN0YXR1cykKLQkJcmV0dXJuOwotCi0JaWYgKGlkID09IEFVRFBQX01TR19QUF9ESVNBQkxFX0ZFRURCQUNLKSB7Ci0JCWF1ZGlvX2NvcHAtPmF1ZHBwX2Rpc2FibGVkX2ZlYXR1cmVzIHw9Ci0JCQkoKHVpbnQzMl90KShtc2dbQVVEUFBfRElTQUJMRV9GRUFUU19NU1ddIDw8IDE2KSB8Ci0JCQkgbXNnW0FVRFBQX0RJU0FCTEVfRkVBVFNfTFNXXSk7Ci0JCU1NX0RCRygiQVVEUFAgZGlzYWJsZSBmZWVkYmFjazogJXgiLAotCQkJCWF1ZGlvX2NvcHAtPmF1ZHBwX2Rpc2FibGVkX2ZlYXR1cmVzKTsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoaWQgPT0gQVVEUFBfTVNHX1BQX0ZFQVRTX1JFX0VOQUJMRSkgewotCQlNTV9EQkcoIkFVRFBQIHJlLWVuYWJsZSBtZXNzYWFnZTogJXgsIGFjZGJfZW5hYmxlZCAlZCIsCi0JCQlhdWRpb19jb3BwLT5hdWRwcF9kaXNhYmxlZF9mZWF0dXJlcywgaXNfYWNkYl9lbmFibGVkKCkpOwotCQlpZiAoIWlzX2FjZGJfZW5hYmxlZCgpKSB7Ci0JCQlpZiAoKGF1ZGlvX2NvcHAtPmF1ZHBwX2Rpc2FibGVkX2ZlYXR1cmVzICYKLQkJCQkoMSA8PCBBVURQUF9DTURfTUJBRFJDKSkgPT0KLQkJCQkoMSA8PCBBVURQUF9DTURfTUJBRFJDKSkgewotCQkJCWF1ZHBwX2RzcF9zZXRfbWJhZHJjKENPTU1PTl9PQkpfSUQsCi0JCQkJCQlhdWRpb19jb3BwLT5tYmFkcmNfZW5hYmxlLAotCQkJCQkJJmF1ZGlvX2NvcHAtPm1iYWRyYyk7Ci0JCQl9Ci0JCQlpZiAoKGF1ZGlvX2NvcHAtPmF1ZHBwX2Rpc2FibGVkX2ZlYXR1cmVzICYKLQkJCQkoMSA8PCBBVURQUF9DTURfRVFVQUxJWkVSKSkgPT0KLQkJCQkoMSA8PCBBVURQUF9DTURfRVFVQUxJWkVSKSkgewotCQkJCWF1ZHBwX2RzcF9zZXRfZXEoQ09NTU9OX09CSl9JRCwKLQkJCQkJCWF1ZGlvX2NvcHAtPmVxX2VuYWJsZSwKLQkJCQkJCSZhdWRpb19jb3BwLT5lcSk7Ci0JCQl9Ci0JCQlpZiAoKGF1ZGlvX2NvcHAtPmF1ZHBwX2Rpc2FibGVkX2ZlYXR1cmVzICYKLQkJCQkoMSA8PCBBVURQUF9DTURfSUlSX1RVTklOR19GSUxURVIpKSA9PQotCQkJCSgxIDw8IEFVRFBQX0NNRF9JSVJfVFVOSU5HX0ZJTFRFUikpIHsKLQkJCQlhdWRwcF9kc3Bfc2V0X3J4X2lpcihDT01NT05fT0JKX0lELAotCQkJCQkJYXVkaW9fY29wcC0+cnhfaWlyX2VuYWJsZSwKLQkJCQkJCSZhdWRpb19jb3BwLT5paXIpOwotCQkJfQotCQkJaWYgKChhdWRpb19jb3BwLT5hdWRwcF9kaXNhYmxlZF9mZWF0dXJlcyAmCi0JCQkJKDEgPDwgQVVEUFBfQ01EX1FDT05DRVJUKSkgPT0KLQkJCQkJKDEgPDwgQVVEUFBfQ01EX1FDT05DRVJUKSkgewotCQkJCWF1ZHBwX2RzcF9zZXRfcWNvbmNlcnRfcGx1cyhDT01NT05fT0JKX0lELAotCQkJCQlhdWRpb19jb3BwLT5xY29uY2VydF9wbHVzX2VuYWJsZSwKLQkJCQkJJmF1ZGlvX2NvcHAtPnFjb25jZXJ0X3BsdXMpOwotCQkJfQotCQl9Ci0JCWlmICgoYXVkaW9fY29wcC0+YXVkcHBfZGlzYWJsZWRfZmVhdHVyZXMgJiAoMSA8PCBBVURQUF9DTURfU1JTKSkKLQkJCT09ICgxIDw8IEFVRFBQX0NNRF9TUlMpKSB7Ci0JCQlpZiAoYXVkaW9fY29wcC0+c3JzX2N1cnJlbnRfZmVhdHVyZV9tYXNrICYgU1JTX01BU0tfVykKLQkJCQlhdWRwcF9kc3Bfc2V0X3J4X3Nyc190cnVtZWRpYV93KCZhdWRpb19jb3BwLT53KTsKLQkJCWlmIChhdWRpb19jb3BwLT5zcnNfY3VycmVudF9mZWF0dXJlX21hc2sgJiBTUlNfTUFTS19DKQotCQkJCWF1ZHBwX2RzcF9zZXRfcnhfc3JzX3RydW1lZGlhX2MoJmF1ZGlvX2NvcHAtPmMpOwotCQkJaWYgKGF1ZGlvX2NvcHAtPnNyc19jdXJyZW50X2ZlYXR1cmVfbWFzayAmIFNSU19NQVNLX0hQKQotCQkJCWF1ZHBwX2RzcF9zZXRfcnhfc3JzX3RydW1lZGlhX2goJmF1ZGlvX2NvcHAtPmgpOwotCQkJaWYgKGF1ZGlvX2NvcHAtPnNyc19jdXJyZW50X2ZlYXR1cmVfbWFzayAmIFNSU19NQVNLX1ApCi0JCQkJYXVkcHBfZHNwX3NldF9yeF9zcnNfdHJ1bWVkaWFfcCgmYXVkaW9fY29wcC0+cCk7Ci0JCQlpZiAoYXVkaW9fY29wcC0+c3JzX2N1cnJlbnRfZmVhdHVyZV9tYXNrICYgU1JTX01BU0tfSEwpCi0JCQkJYXVkcHBfZHNwX3NldF9yeF9zcnNfdHJ1bWVkaWFfbCgmYXVkaW9fY29wcC0+bCk7Ci0JCQlpZiAoYXVkaW9fY29wcC0+c3JzX2N1cnJlbnRfZmVhdHVyZV9tYXNrICYgU1JTX01BU0tfRykKLQkJCQlhdWRwcF9kc3Bfc2V0X3J4X3Nyc190cnVtZWRpYV9nKCZhdWRpb19jb3BwLT5nKTsKLQkJfQotCQlhdWRpb19jb3BwLT5hdWRwcF9kaXNhYmxlZF9mZWF0dXJlcyA9IDA7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIWlzX2FjZGJfZW5hYmxlZCgpKSB7Ci0JCWF1ZHBwX2RzcF9zZXRfbWJhZHJjKENPTU1PTl9PQkpfSUQsIGF1ZGlvX2NvcHAtPm1iYWRyY19lbmFibGUsCi0JCQkJCQkmYXVkaW9fY29wcC0+bWJhZHJjKTsKLQotCQlhdWRwcF9kc3Bfc2V0X2VxKENPTU1PTl9PQkpfSUQsIGF1ZGlvX2NvcHAtPmVxX2VuYWJsZSwKLQkJCQkJCSZhdWRpb19jb3BwLT5lcSk7Ci0JCWF1ZHBwX2RzcF9zZXRfcnhfaWlyKENPTU1PTl9PQkpfSUQsIGF1ZGlvX2NvcHAtPnJ4X2lpcl9lbmFibGUsCi0JCQkJCQkJJmF1ZGlvX2NvcHAtPmlpcik7Ci0JCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihDT01NT05fT0JKX0lELCAmYXVkaW9fY29wcC0+dm9sX3Bhbik7Ci0KLQkJYXVkcHBfZHNwX3NldF9xY29uY2VydF9wbHVzKENPTU1PTl9PQkpfSUQsCi0JCQkJYXVkaW9fY29wcC0+cWNvbmNlcnRfcGx1c19lbmFibGUsCi0JCQkJJmF1ZGlvX2NvcHAtPnFjb25jZXJ0X3BsdXMpOwotCX0KLQlhdWRpb19lbmFibGVfc3JzX3RydW1lZGlhKGF1ZGlvX2NvcHAsIHRydWUpOwotfQotRVhQT1JUX1NZTUJPTChhdWRpb19jb21taXRfcGVuZGluZ19wcF9wYXJhbXMpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZGlvX2RzcF9ldmVudCh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gcHJpdmF0ZTsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JTE9HKEVWX0RTUF9FVkVOVCwgaWQpOwotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBQX01TR19IT1NUX1BDTV9JTlRGX01TRzogewotCQl1bnNpZ25lZCBpZCA9IG1zZ1syXTsKLQkJdW5zaWduZWQgaWR4ID0gbXNnWzNdIC0gMTsKLQotCQkvKiBNTV9JTkZPKCJIT1NUX1BDTSBpZCAlZCBpZHggJWRcbiIsIGlkLCBpZHgpOyAqLwotCQlpZiAoaWQgIT0gQVVEUFBfTVNHX0hPU1RQQ01fSURfQVJNX1JYKSB7Ci0JCQlNTV9FUlIoImJvZ3VzIGlkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpZHggPiAxKSB7Ci0JCQlNTV9FUlIoImJvZ3VzIGJ1ZmZlciBpZHhcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWlmIChhdWRpby0+cnVubmluZykgewotCQkJYXRvbWljX2FkZChhdWRpby0+b3V0W2lkeF0udXNlZCwgJmF1ZGlvLT5vdXRfYnl0ZXMpOwotCQkJYXVkaW8tPm91dFtpZHhdLnVzZWQgPSAwOwotCi0JCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCQlpZiAoZnJhbWUtPnVzZWQpIHsKLQkJCQlhdWRpb19kc3Bfc2VuZF9idWZmZXIoCi0JCQkJCWF1ZGlvLCBhdWRpby0+b3V0X3RhaWwsIGZyYW1lLT51c2VkKTsKLQkJCQlhdWRpby0+b3V0X3RhaWwgXj0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXVkaW8tPm91dF9uZWVkZWQrKzsKLQkJCX0KLQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFBfTVNHX1BDTURNQU1JU1NFRDoKLQkJTU1fSU5GTygiUENNRE1BTUlTU0VEICVkXG4iLCBtc2dbMF0pOwotCQlhdWRpby0+dGVvcyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfQ0ZHX01TRzoKLQkJaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0VOQSkgewotCQkJTE9HKEVWX0VOQUJMRSwgMSk7Ci0JCQlNTV9EQkcoIkNGR19NU0cgRU5BQkxFXG4iKTsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMTsKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3Bhbig1LCAmYXVkaW8tPnZvbF9wYW4pOwotCQkJYXVkaW9fZHNwX291dF9lbmFibGUoYXVkaW8sIDEpOwotCQl9IGVsc2UgaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0RJUykgewotCQkJTE9HKEVWX0VOQUJMRSwgMCk7Ci0JCQlNTV9EQkcoIkNGR19NU0cgRElTQUJMRVxuIik7Ci0JCQlhdWRpby0+cnVubmluZyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoIkNGR19NU0cgJWQ/XG4iLCBtc2dbMF0pOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiVU5LTk9XTiAoJWQpXG4iLCBpZCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2RzcF9vdXRfZW5hYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCB5ZXMpCi17Ci0JYXVkcHBfY21kX3BjbV9pbnRmIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZAk9IEFVRFBQX0NNRF9QQ01fSU5URl8yOyAKLQljbWQub2JqZWN0X251bQk9IEFVRFBQX0NNRF9QQ01fSU5URl9PQkpFQ1RfTlVNOwotCWNtZC5jb25maWcJPSBBVURQUF9DTURfUENNX0lOVEZfQ09ORklHX0NNRF9WOwotCWNtZC5pbnRmX3R5cGUJPSBBVURQUF9DTURfUENNX0lOVEZfUlhfRU5BX0FSTVRPRFNQX1Y7Ci0KLQlpZiAoeWVzKSB7Ci0JCWNtZC53cml0ZV9idWYxTFNXCT0gYXVkaW8tPm91dFswXS5hZGRyOwotCQljbWQud3JpdGVfYnVmMU1TVwk9IGF1ZGlvLT5vdXRbMF0uYWRkciA+PiAxNjsKLQkJaWYgKGF1ZGlvLT5vdXRbMF0udXNlZCkKLQkJCWNtZC53cml0ZV9idWYxX2xlbgk9IGF1ZGlvLT5vdXRbMF0udXNlZDsKLQkJZWxzZQotCQkJY21kLndyaXRlX2J1ZjFfbGVuCT0gYXVkaW8tPm91dFswXS5zaXplOwotCQljbWQud3JpdGVfYnVmMkxTVwk9IGF1ZGlvLT5vdXRbMV0uYWRkcjsKLQkJY21kLndyaXRlX2J1ZjJNU1cJPSBhdWRpby0+b3V0WzFdLmFkZHIgPj4gMTY7Ci0JCWlmIChhdWRpby0+b3V0WzFdLnVzZWQpCi0JCQljbWQud3JpdGVfYnVmMl9sZW4JPSBhdWRpby0+b3V0WzFdLnVzZWQ7Ci0JCWVsc2UKLQkJCWNtZC53cml0ZV9idWYyX2xlbgk9IGF1ZGlvLT5vdXRbMV0uc2l6ZTsKLQkJY21kLmFybV90b19yeF9mbGFnCT0gQVVEUFBfQ01EX1BDTV9JTlRGX0VOQV9WOwotCQljbWQud2VpZ2h0X2RlY29kZXJfdG9fcnggPSBhdWRpby0+b3V0X3dlaWdodDsKLQkJY21kLndlaWdodF9hcm1fdG9fcngJPSAxOwotCQljbWQucGFydGl0aW9uX251bWJlcl9hcm1fdG9fZHNwID0gMDsKLQkJY21kLnNhbXBsZV9yYXRlCQk9IGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGU7Ci0JCWNtZC5jaGFubmVsX21vZGUJPSBhdWRpby0+b3V0X2NoYW5uZWxfbW9kZTsKLQl9Ci0JCi0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUyKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRpb19kc3Bfc2VuZF9idWZmZXIoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgaWR4LCB1bnNpZ25lZCBsZW4pCi17Ci0JYXVkcHBfY21kX3BjbV9pbnRmX3NlbmRfYnVmZmVyIGNtZDsKLQkKLQljbWQuY21kX2lkCQk9IEFVRFBQX0NNRF9QQ01fSU5URl8yOwotCWNtZC5ob3N0X3BjbV9vYmplY3QJPSBBVURQUF9DTURfUENNX0lOVEZfT0JKRUNUX05VTTsKLQljbWQuY29uZmlnCQk9IEFVRFBQX0NNRF9QQ01fSU5URl9CVUZGRVJfQ01EX1Y7Ci0JY21kLmludGZfdHlwZQkJPSBBVURQUF9DTURfUENNX0lOVEZfUlhfRU5BX0FSTVRPRFNQX1Y7Ci0JY21kLmRzcF90b19hcm1fYnVmX2lkCT0gMDsKLQljbWQuYXJtX3RvX2RzcF9idWZfaWQJPSBpZHggKyAxOwotCWNtZC5hcm1fdG9fZHNwX2J1Zl9sZW4JPSBsZW47Ci0KLQlMT0coRVZfU0VORF9CVUZGRVIsIGlkeCk7Ci0JZG1hX2NvaGVyZW50X3ByZV9vcHMoKTsKLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTIoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGludCBhdWRpb19lbmFibGVfbWJhZHJjKHN0cnVjdCBhdWRpb19jb3BwICphdWRpb19jb3BwLCBpbnQgZW5hYmxlKQotewotCWlmIChhdWRpb19jb3BwLT5tYmFkcmNfZW5hYmxlID09IGVuYWJsZSAmJgotCQkJCSFhdWRpb19jb3BwLT5tYmFkcmNfbmVlZHNfY29tbWl0KQotCQlyZXR1cm4gMDsKLQotCWF1ZGlvX2NvcHAtPm1iYWRyY19lbmFibGUgPSBlbmFibGU7Ci0JaWYgKGlzX2F1ZHBwX2VuYWJsZSgpKSB7Ci0JCWF1ZHBwX2RzcF9zZXRfbWJhZHJjKENPTU1PTl9PQkpfSUQsIGVuYWJsZSwKLQkJCQkJCSZhdWRpb19jb3BwLT5tYmFkcmMpOwotCQlhdWRpb19jb3BwLT5tYmFkcmNfbmVlZHNfY29tbWl0ID0gMDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19lbmFibGVfZXEoc3RydWN0IGF1ZGlvX2NvcHAgKmF1ZGlvX2NvcHAsIGludCBlbmFibGUpCi17Ci0JaWYgKGF1ZGlvX2NvcHAtPmVxX2VuYWJsZSA9PSBlbmFibGUgJiYKLQkJCQkhYXVkaW9fY29wcC0+ZXFfbmVlZHNfY29tbWl0KQotCQlyZXR1cm4gMDsKLQotCWF1ZGlvX2NvcHAtPmVxX2VuYWJsZSA9IGVuYWJsZTsKLQotCWlmIChpc19hdWRwcF9lbmFibGUoKSkgewotCQlhdWRwcF9kc3Bfc2V0X2VxKENPTU1PTl9PQkpfSUQsIGVuYWJsZSwgJmF1ZGlvX2NvcHAtPmVxKTsKLQkJYXVkaW9fY29wcC0+ZXFfbmVlZHNfY29tbWl0ID0gMDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZW5hYmxlX3J4X2lpcihzdHJ1Y3QgYXVkaW9fY29wcCAqYXVkaW9fY29wcCwgaW50IGVuYWJsZSkKLXsKLQlpZiAoYXVkaW9fY29wcC0+cnhfaWlyX2VuYWJsZSA9PSBlbmFibGUgJiYKLQkJCQkhYXVkaW9fY29wcC0+cnhfaWlyX25lZWRzX2NvbW1pdCkKLQkJcmV0dXJuIDA7Ci0KLQlhdWRpb19jb3BwLT5yeF9paXJfZW5hYmxlID0gZW5hYmxlOwotCi0JaWYgKGlzX2F1ZHBwX2VuYWJsZSgpKSB7Ci0JCWF1ZHBwX2RzcF9zZXRfcnhfaWlyKENPTU1PTl9PQkpfSUQsIGVuYWJsZSwgJmF1ZGlvX2NvcHAtPmlpcik7Ci0JCWF1ZGlvX2NvcHAtPnJ4X2lpcl9uZWVkc19jb21taXQgPSAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19lbmFibGVfc3JzX3RydW1lZGlhKHN0cnVjdCBhdWRpb19jb3BwICphdWRpb19jb3BwLCBpbnQgZW5hYmxlKQotewotCi0JaWYgKCFhdWRpb19jb3BwLT5zcnNfbmVlZHNfY29tbWl0KQotCQlyZXR1cm4gMDsKLQotCWF1ZGlvX2NvcHAtPnNyc19lbmFibGUgPSBlbmFibGU7Ci0KLQlNTV9EQkcoIkVuYWJsZSBTUlMgZmxhZ3MgMHgleCBlbmFibGUgJWRcbiIsCi0JCWF1ZGlvX2NvcHAtPnNyc19mZWF0dXJlX21hc2ssIGVuYWJsZSk7Ci0JaWYgKGlzX2F1ZHBwX2VuYWJsZSgpKSB7Ci0JCU1NX0RCRygiVXBkYXRpbmcgYXVkcHAgZm9yIHNyc1xuIik7Ci0JCWlmIChhdWRpb19jb3BwLT5zcnNfZmVhdHVyZV9tYXNrICYgU1JTX01BU0tfVykKLQkJCWF1ZHBwX2RzcF9zZXRfcnhfc3JzX3RydW1lZGlhX3coJmF1ZGlvX2NvcHAtPncpOwotCQlpZiAoYXVkaW9fY29wcC0+c3JzX2ZlYXR1cmVfbWFzayAmIFNSU19NQVNLX0MpCi0JCQlhdWRwcF9kc3Bfc2V0X3J4X3Nyc190cnVtZWRpYV9jKCZhdWRpb19jb3BwLT5jKTsKLQkJaWYgKGF1ZGlvX2NvcHAtPnNyc19mZWF0dXJlX21hc2sgJiBTUlNfTUFTS19IUCkKLQkJCWF1ZHBwX2RzcF9zZXRfcnhfc3JzX3RydW1lZGlhX2goJmF1ZGlvX2NvcHAtPmgpOwotCQlpZiAoYXVkaW9fY29wcC0+c3JzX2ZlYXR1cmVfbWFzayAmIFNSU19NQVNLX1ApCi0JCQlhdWRwcF9kc3Bfc2V0X3J4X3Nyc190cnVtZWRpYV9wKCZhdWRpb19jb3BwLT5wKTsKLQkJaWYgKGF1ZGlvX2NvcHAtPnNyc19mZWF0dXJlX21hc2sgJiBTUlNfTUFTS19ITCkKLQkJCWF1ZHBwX2RzcF9zZXRfcnhfc3JzX3RydW1lZGlhX2woJmF1ZGlvX2NvcHAtPmwpOwotCQlpZiAoYXVkaW9fY29wcC0+c3JzX2ZlYXR1cmVfbWFzayAmIFNSU19NQVNLX0cpCi0JCQlhdWRwcF9kc3Bfc2V0X3J4X3Nyc190cnVtZWRpYV9nKCZhdWRpb19jb3BwLT5nKTsKLQotCQlhdWRpb19jb3BwLT5zcnNfY3VycmVudF9mZWF0dXJlX21hc2sgPQotCQkJYXVkaW9fY29wcC0+c3JzX2ZlYXR1cmVfbWFzazsKLQkJYXVkaW9fY29wcC0+c3JzX25lZWRzX2NvbW1pdCA9IDA7Ci0JCWF1ZGlvX2NvcHAtPnNyc19mZWF0dXJlX21hc2sgPSAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19lbmFibGVfdm9sX3BhbihzdHJ1Y3QgYXVkaW9fY29wcCAqYXVkaW9fY29wcCkKLXsKLQlpZiAoaXNfYXVkcHBfZW5hYmxlKCkpCi0JCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihDT01NT05fT0JKX0lELCAmYXVkaW9fY29wcC0+dm9sX3Bhbik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZW5hYmxlX3Fjb25jZXJ0X3BsdXMoc3RydWN0IGF1ZGlvX2NvcHAgKmF1ZGlvX2NvcHAsIGludCBlbmFibGUpCi17Ci0JaWYgKGF1ZGlvX2NvcHAtPnFjb25jZXJ0X3BsdXNfZW5hYmxlID09IGVuYWJsZSAmJgotCQkJCSFhdWRpb19jb3BwLT5xY29uY2VydF9wbHVzX25lZWRzX2NvbW1pdCkKLQkJcmV0dXJuIDA7Ci0KLQlhdWRpb19jb3BwLT5xY29uY2VydF9wbHVzX2VuYWJsZSA9IGVuYWJsZTsKLQotCWlmIChpc19hdWRwcF9lbmFibGUoKSkgewotCQlhdWRwcF9kc3Bfc2V0X3Fjb25jZXJ0X3BsdXMoQ09NTU9OX09CSl9JRCwgZW5hYmxlLAotCQkJCQkmYXVkaW9fY29wcC0+cWNvbmNlcnRfcGx1cyk7Ci0JCWF1ZGlvX2NvcHAtPnFjb25jZXJ0X3BsdXNfbmVlZHNfY29tbWl0ID0gMDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2ZsdXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JYXVkaW8tPm91dFswXS51c2VkID0gMDsKLQlhdWRpby0+b3V0WzFdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRfaGVhZCA9IDA7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+c3RvcHBlZCA9IDA7Ci19Ci0KLXN0YXRpYyBsb25nIGF1ZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCQlzdGF0cy5ieXRlX2NvdW50ID0gYXRvbWljX3JlYWQoJmF1ZGlvLT5vdXRfYnl0ZXMpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkKikgYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCX0KLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKDUsICZhdWRpby0+dm9sX3Bhbik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgQVVESU9fU0VUX1BBTjoKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+dm9sX3Bhbi5wYW4gPSBhcmc7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3Bhbig1LCAmYXVkaW8tPnZvbF9wYW4pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JTE9HKEVWX0lPQ1RMLCBjbWQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6Ci0JCXJjID0gYXVkaW9fZW5hYmxlKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TVE9QOgotCQlyYyA9IGF1ZGlvX2Rpc2FibGUoYXVkaW8pOwotCQlicmVhazsKLQljYXNlIEFVRElPX0ZMVVNIOgotCQlpZiAoYXVkaW8tPnN0b3BwZWQpIHsKLQkJCS8qIE1ha2Ugc3VyZSB3ZSdyZSBzdG9wcGVkIGFuZCB3ZSB3YWtlIGFueSB0aHJlYWRzCi0JCQkgKiB0aGF0IG1pZ2h0IGJlIGJsb2NrZWQgaG9sZGluZyB0aGUgd3JpdGVfbG9jay4KLQkJCSAqIFdoaWxlIGF1ZGlvLT5zdG9wcGVkIHdyaXRlIHRocmVhZHMgd2lsbCBhbHdheXMKLQkJCSAqIGV4aXQgaW1tZWRpYXRlbHkuCi0JCQkgKi8KLQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQkJCWF1ZGlvX2ZsdXNoKGF1ZGlvKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjb25maWc7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY29uZmlnLCAodm9pZCopIGFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29uZmlnLmNoYW5uZWxfY291bnQgPT0gMSkgewotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSBBVURQUF9DTURfUENNX0lOVEZfTU9OT19WOwotCQl9IGVsc2UgaWYgKGNvbmZpZy5jaGFubmVsX2NvdW50ID09IDIpIHsKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50PSBBVURQUF9DTURfUENNX0lOVEZfU1RFUkVPX1Y7Ci0JCX0gZWxzZSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlhdWRpby0+b3V0X3NhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotCQlhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9IGNvbmZpZy5jaGFubmVsX2NvdW50OwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQljb25maWcuYnVmZmVyX3NpemUgPSBCVUZTWjsKLQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IDI7Ci0JCWNvbmZpZy5zYW1wbGVfcmF0ZSA9IGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGU7Ci0JCWlmIChhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9PSBBVURQUF9DTURfUENNX0lOVEZfTU9OT19WKSB7Ci0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IDI7Ci0JCX0KLQkJY29uZmlnLnVudXNlZFswXSA9IDA7Ci0JCWNvbmZpZy51bnVzZWRbMV0gPSAwOwotCQljb25maWcudW51c2VkWzJdID0gMDsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCopIGFyZywgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0gZWxzZSB7Ci0JCQlyYyA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKiBPbmx5IHVzZWZ1bCBpbiB0dW5uZWwtbW9kZSAqLwotc3RhdGljIGludCBhdWRpb19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IGEsIGxvZmZfdCBiLCBpbnQgZGF0YXN5bmMpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFhdWRpby0+cnVubmluZykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d2FpdCwKLQkJKCFhdWRpby0+b3V0WzBdLnVzZWQgJiYKLQkJIWF1ZGlvLT5vdXRbMV0udXNlZCkpOwotCi0JaWYgKHJjIDwgMCkKLQkJZ290byBkb25lOwotCi0JLyogcGNtIGRtYW1pc3MgbWVzc2FnZSBpcyBzZW50IGNvbnRpbm91c2x5IHdoZW4KLQkgKiBkZWNvZGVyIGlzIHN0YXJ2ZWQgc28gbm8gcmFjZSBjb25kaXRpb24gY29uY2VybgotCSAqLwotCi0JYXVkaW8tPnRlb3MgPSAwOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndhaXQsCi0JCWF1ZGlvLT50ZW9zKTsKLQotZG9uZToKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHJ0X3BvbGljeShpbnQgcG9saWN5KQotewotCWlmICh1bmxpa2VseShwb2xpY3kgPT0gU0NIRURfRklGTykgfHwgdW5saWtlbHkocG9saWN5ID09IFNDSEVEX1JSKSkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHRhc2tfaGFzX3J0X3BvbGljeShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCi17Ci0JcmV0dXJuIHJ0X3BvbGljeShwLT5wb2xpY3kpOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRpb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IHNjaGVkX3BhcmFtIHMgPSB7IC5zY2hlZF9wcmlvcml0eSA9IDEgfTsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCXNpemVfdCB4ZmVyOwotCWludCBvbGRfcHJpbyA9IGN1cnJlbnQtPnJ0X3ByaW9yaXR5OwotCWludCBvbGRfcG9saWN5ID0gY3VycmVudC0+cG9saWN5OwotCWludCBjYXBfbmljZSA9IGNhcF9yYWlzZWQoY3VycmVudF9jYXAoKSwgQ0FQX1NZU19OSUNFKTsKLQlpbnQgcmMgPSAwOwotCi0JTE9HKEVWX1dSSVRFLCBjb3VudCB8IChhdWRpby0+cnVubmluZyA8PCAyOCkgfCAoYXVkaW8tPnN0b3BwZWQgPDwgMjQpKTsKLQotCS8qIGp1c3QgZm9yIHRoaXMgd3JpdGUsIHNldCB1cyByZWFsLXRpbWUgKi8KLQlpZiAoIXRhc2tfaGFzX3J0X3BvbGljeShjdXJyZW50KSkgewotCQlzdHJ1Y3QgY3JlZCAqbmV3ID0gcHJlcGFyZV9jcmVkcygpOwotCQljYXBfcmFpc2UobmV3LT5jYXBfZWZmZWN0aXZlLCBDQVBfU1lTX05JQ0UpOwotCQljb21taXRfY3JlZHMobmV3KTsKLQkJaWYgKChzY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudCwgU0NIRURfUlIsICZzKSkgPCAwKQotCQkJTU1fRVJSKCJzY2hlZF9zZXRzY2hlZHVsZXIgZmFpbGVkXG4iKTsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0KLQkJTE9HKEVWX1dBSVRfRVZFTlQsIDApOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d2FpdCwKLQkJCQkJICAgICAgKGZyYW1lLT51c2VkID09IDApIHx8IChhdWRpby0+c3RvcHBlZCkpOwotCQlMT0coRVZfV0FJVF9FVkVOVCwgMSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQkJeGZlciA9IGNvdW50ID4gZnJhbWUtPnNpemUgPyBmcmFtZS0+c2l6ZSA6IGNvdW50OwotCQlpZiAoY29weV9mcm9tX3VzZXIoZnJhbWUtPmRhdGEsIGJ1ZiwgeGZlcikpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWZyYW1lLT51c2VkID0geGZlcjsKLQkJYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JCWNvdW50IC09IHhmZXI7Ci0JCWJ1ZiArPSB4ZmVyOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJTE9HKEVWX0ZJTExfQlVGRkVSLCBhdWRpby0+b3V0X2hlYWQgXiAxKTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQgJiYgYXVkaW8tPm91dF9uZWVkZWQpIHsKLQkJCWF1ZGlvX2RzcF9zZW5kX2J1ZmZlcihhdWRpbywgYXVkaW8tPm91dF90YWlsLCBmcmFtZS0+dXNlZCk7Ci0JCQlhdWRpby0+b3V0X3RhaWwgXj0gMTsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkLS07Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0KLQkvKiByZXN0b3JlIHNjaGVkdWxpbmcgcG9saWN5IGFuZCBwcmlvcml0eSAqLwotCWlmICghcnRfcG9saWN5KG9sZF9wb2xpY3kpKSB7Ci0JCXN0cnVjdCBzY2hlZF9wYXJhbSB2ID0geyAuc2NoZWRfcHJpb3JpdHkgPSBvbGRfcHJpbyB9OwotCQlpZiAoKHNjaGVkX3NldHNjaGVkdWxlcihjdXJyZW50LCBvbGRfcG9saWN5LCAmdikpIDwgMCkKLQkJCU1NX0VSUigic2NoZWRfc2V0c2NoZWR1bGVyIGZhaWxlZFxuIik7Ci0JCWlmIChsaWtlbHkoIWNhcF9uaWNlKSkgewotCQkJc3RydWN0IGNyZWQgKm5ldyA9IHByZXBhcmVfY3JlZHMoKTsKLQkJCWNhcF9sb3dlcihuZXctPmNhcF9lZmZlY3RpdmUsIENBUF9TWVNfTklDRSk7Ci0JCQljb21taXRfY3JlZHMobmV3KTsKLQkJfQotCX0KLQotCUxPRyhFVl9SRVRVUk4sKGJ1ZiA+IHN0YXJ0KSA/IChidWYgLSBzdGFydCkgOiByYyk7Ci0JaWYgKGJ1ZiA+IHN0YXJ0KQotCQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci0JcmV0dXJuIHJjOwkKLX0KLQotc3RhdGljIGludCBhdWRpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlMT0coRVZfT1BFTiwgMCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGlvX2Rpc2FibGUoYXVkaW8pOwotCWF1ZGlvX2ZsdXNoKGF1ZGlvKTsKLQlhdWRpby0+b3BlbmVkID0gMDsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlodGNfcHdyc2lua19zZXQoUFdSU0lOS19BVURJTywgMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBhdWRpbyB0aGVfYXVkaW87Ci0KLXN0YXRpYyBpbnQgYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gJnRoZV9hdWRpbzsKLQlpbnQgcmM7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0KLQlpZiAoYXVkaW8tPm9wZW5lZCkgewotCQlNTV9FUlIoImJ1c3lcbiIpOwotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICghYXVkaW8tPmRhdGEpIHsKLQkJYXVkaW8tPmRhdGEgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgRE1BU1osIAotCQkJCQkJICZhdWRpby0+cGh5cywgR0ZQX0tFUk5FTCk7Ci0JCWlmICghYXVkaW8tPmRhdGEpIHsKLQkJCU1NX0VSUigiY291bGQgbm90IGFsbG9jYXRlIERNQSBidWZmZXJzXG4iKTsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCXJjID0gYXVkbWdyX29wZW4oJmF1ZGlvLT5hdWRtZ3IpOwotCWlmIChyYykKLQkJZ290byBkb25lOwotCi0JYXVkaW8tPm91dF9idWZmZXJfc2l6ZSA9IEJVRlNaOwotCWF1ZGlvLT5vdXRfc2FtcGxlX3JhdGUgPSA0ODAwMDsKLQlhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9IEFVRFBQX0NNRF9QQ01fSU5URl9TVEVSRU9fVjsKLQlhdWRpby0+b3V0X3dlaWdodCA9IDEwMDsKLQotCWF1ZGlvLT5vdXRbMF0uZGF0YSA9IGF1ZGlvLT5kYXRhICsgMDsKLQlhdWRpby0+b3V0WzBdLmFkZHIgPSBhdWRpby0+cGh5cyArIDA7Ci0JYXVkaW8tPm91dFswXS5zaXplID0gQlVGU1o7Ci0JCi0JYXVkaW8tPm91dFsxXS5kYXRhID0gYXVkaW8tPmRhdGEgKyBCVUZTWjsKLQlhdWRpby0+b3V0WzFdLmFkZHIgPSBhdWRpby0+cGh5cyArIEJVRlNaOwotCWF1ZGlvLT5vdXRbMV0uc2l6ZSA9IEJVRlNaOwotCi0JYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gMHgyMDAwOwotCWF1ZGlvLT52b2xfcGFuLnBhbiA9IDB4MDsKLQotCWF1ZGlvX2ZsdXNoKGF1ZGlvKTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOwotCWF1ZGlvLT5vcGVuZWQgPSAxOwotCXJjID0gMDsKLQlMT0coRVZfT1BFTiwgMSk7Ci1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgYXVkcHBfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhdWRpb19jb3BwICphdWRpb19jb3BwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDAsIGVuYWJsZTsKLQl1aW50MTZfdCBlbmFibGVfbWFzazsKLQlpbnQgcHJldl9zdGF0ZTsKLQl1aW50MzJfdCB0b19zZXQsIHNpemUgPSAwOwotCXZvaWQgKnRtcGJ1ZiwgKnNyc19wYXJhbXMgPSBOVUxMOwotCi0JbXV0ZXhfbG9jaygmYXVkaW9fY29wcC0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0VOQUJMRV9BVURQUDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZlbmFibGVfbWFzaywgKHZvaWQgKikgYXJnLAotCQkJCQkJc2l6ZW9mKGVuYWJsZV9tYXNrKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZW5hYmxlID0gKChlbmFibGVfbWFzayAmIEFEUkNfRU5BQkxFKSB8fAotCQkJCShlbmFibGVfbWFzayAmIE1CQURSQ19FTkFCTEUpKSA/IDEgOiAwOwotCQlhdWRpb19lbmFibGVfbWJhZHJjKGF1ZGlvX2NvcHAsIGVuYWJsZSk7Ci0JCWVuYWJsZSA9IChlbmFibGVfbWFzayAmIEVRX0VOQUJMRSkgPyAxIDogMDsKLQkJYXVkaW9fZW5hYmxlX2VxKGF1ZGlvX2NvcHAsIGVuYWJsZSk7Ci0JCWVuYWJsZSA9IChlbmFibGVfbWFzayAmIElJUl9FTkFCTEUpID8gMSA6IDA7Ci0JCWF1ZGlvX2VuYWJsZV9yeF9paXIoYXVkaW9fY29wcCwgZW5hYmxlKTsKLQkJZW5hYmxlID0gKGVuYWJsZV9tYXNrICYgUUNPTkNFUlRfUExVU19FTkFCTEUpID8gMSA6IDA7Ci0JCWF1ZGlvX2VuYWJsZV9xY29uY2VydF9wbHVzKGF1ZGlvX2NvcHAsIGVuYWJsZSk7Ci0JCWVuYWJsZSA9IChlbmFibGVfbWFzayAmIFNSU19FTkFCTEUpID8gMSA6IDA7Ci0JCWF1ZGlvX2VuYWJsZV9zcnNfdHJ1bWVkaWEoYXVkaW9fY29wcCwgZW5hYmxlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX1NFVF9NQkFEUkM6IHsKLQkJdWludDMyX3QgbWJhZHJjX2NvZWZmX2J1ZjsKLQkJcHJldl9zdGF0ZSA9IGF1ZGlvX2NvcHAtPm1iYWRyY19lbmFibGU7Ci0JCWF1ZGlvX2NvcHAtPm1iYWRyY19lbmFibGUgPSAwOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmF1ZGlvX2NvcHAtPm1iYWRyYy5udW1fYmFuZHMsICh2b2lkICopIGFyZywKLQkJCQlzaXplb2YoYXVkaW9fY29wcC0+bWJhZHJjKSAtCi0JCQkJKEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNU19DT01NT05fTEVOICsgMikpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlIGlmIChhdWRpb19jb3BwLT5tYmFkcmMuZXh0X2J1Zl9zaXplKSB7Ci0JCQltYmFkcmNfY29lZmZfYnVmID0gKHVpbnQzMl90KSAoKGNoYXIgKikgYXJnICsKLQkJCQkJc2l6ZW9mKGF1ZGlvX2NvcHAtPm1iYWRyYykgLQotCQkJCShBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfQ09NTU9OX0xFTiArIDIpKTsKLQkJCWlmICgoY29weV9mcm9tX3VzZXIoYXVkaW9fY29wcC0+bWJhZHJjX2RhdGEsCi0JCQkJCSh2b2lkICopIG1iYWRyY19jb2VmZl9idWYsCi0JCQkJCUFVRFBQX01CQURSQ19FWFRFUk5BTF9CVUZfU0laRSAqIDIpKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWF1ZGlvX2NvcHAtPm1iYWRyYy5leHRfYnVmX2xzdyA9Ci0JCQkJCWF1ZGlvX2NvcHAtPm1iYWRyY19waHlzICYgMHhGRkZGOwotCQkJYXVkaW9fY29wcC0+bWJhZHJjLmV4dF9idWZfbXN3ID0KLQkJCQkoKGF1ZGlvX2NvcHAtPm1iYWRyY19waHlzICYgMHhGRkZGMDAwMCkgPj4gMTYpOwotCQl9Ci0JCWF1ZGlvX2NvcHAtPm1iYWRyY19lbmFibGUgPSBwcmV2X3N0YXRlOwotCQlpZiAoIXJjKQotCQkJYXVkaW9fY29wcC0+bWJhZHJjX25lZWRzX2NvbW1pdCA9IDE7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgQVVESU9fU0VUX0FEUkM6IHsKLQkJCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfYWRyYyBhZHJjOwotCQkJcHJldl9zdGF0ZSA9IGF1ZGlvX2NvcHAtPm1iYWRyY19lbmFibGU7Ci0JCQlhdWRpb19jb3BwLT5tYmFkcmNfZW5hYmxlID0gMDsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmYWRyYy5jb21wcmVzc2lvbl90aCwgKHZvaWQgKikgYXJnLAotCQkJCQkJCXNpemVvZihhZHJjKSAtIDIpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWF1ZGlvX2NvcHAtPm1iYWRyY19lbmFibGUgPSBwcmV2X3N0YXRlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYXVkaW9fY29wcC0+bWJhZHJjLm51bV9iYW5kcyA9IDE7Ci0JCQlhdWRpb19jb3BwLT5tYmFkcmMuZG93bl9zYW1wX2xldmVsID0gODsKLQkJCWF1ZGlvX2NvcHAtPm1iYWRyYy5hZHJjX2RlbGF5ID0gYWRyYy5hZHJjX2RlbGF5OwotCQkJYXVkaW9fY29wcC0+bWJhZHJjLmV4dF9idWZfc2l6ZSA9IDA7Ci0JCQlhdWRpb19jb3BwLT5tYmFkcmMuZXh0X3BhcnRpdGlvbiA9IDA7Ci0JCQlhdWRpb19jb3BwLT5tYmFkcmMuYWRyY19iYW5kWzBdLnN1YmJhbmRfZW5hYmxlID0gMTsKLQkJCWF1ZGlvX2NvcHAtPm1iYWRyYy5hZHJjX2JhbmRbMF0uYWRyY19zdWJfbXV0ZSA9IDA7Ci0JCQlhdWRpb19jb3BwLT5tYmFkcmMuYWRyY19iYW5kWzBdLnJtc190aW1lID0KLQkJCQkJCQkJYWRyYy5ybXNfdGltZTsKLQkJCWF1ZGlvX2NvcHAtPm1iYWRyYy5hZHJjX2JhbmRbMF0uY29tcHJlc3Npb25fdGggPQotCQkJCQkJCWFkcmMuY29tcHJlc3Npb25fdGg7Ci0JCQlhdWRpb19jb3BwLT5tYmFkcmMuYWRyY19iYW5kWzBdLmNvbXByZXNzaW9uX3Nsb3BlID0KLQkJCQkJCQlhZHJjLmNvbXByZXNzaW9uX3Nsb3BlOwotCQkJYXVkaW9fY29wcC0+bWJhZHJjLmFkcmNfYmFuZFswXS5hdHRhY2tfY29uc3RfbHN3ID0KLQkJCQkJCQlhZHJjLmF0dGFja19jb25zdF9sc3c7Ci0JCQlhdWRpb19jb3BwLT5tYmFkcmMuYWRyY19iYW5kWzBdLmF0dGFja19jb25zdF9tc3cgPQotCQkJCQkJCWFkcmMuYXR0YWNrX2NvbnN0X21zdzsKLQkJCWF1ZGlvX2NvcHAtPm1iYWRyYy5hZHJjX2JhbmRbMF0ucmVsZWFzZV9jb25zdF9sc3cgPQotCQkJCQkJCWFkcmMucmVsZWFzZV9jb25zdF9sc3c7Ci0JCQlhdWRpb19jb3BwLT5tYmFkcmMuYWRyY19iYW5kWzBdLnJlbGVhc2VfY29uc3RfbXN3ID0KLQkJCQkJCQlhZHJjLnJlbGVhc2VfY29uc3RfbXN3OwotCQkJYXVkaW9fY29wcC0+bWJhZHJjLmFkcmNfYmFuZFswXS5tYWtldXBfZ2FpbiA9IDB4MjAwMDsKLQkJCWF1ZGlvX2NvcHAtPm1iYWRyY19lbmFibGUgPSBwcmV2X3N0YXRlOwotCQkJYXVkaW9fY29wcC0+bWJhZHJjX25lZWRzX2NvbW1pdCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCi0JY2FzZSBBVURJT19TRVRfRVE6Ci0JCXByZXZfc3RhdGUgPSBhdWRpb19jb3BwLT5lcV9lbmFibGU7Ci0JCWF1ZGlvX2NvcHAtPmVxX2VuYWJsZSA9IDA7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYXVkaW9fY29wcC0+ZXEubnVtX2JhbmRzLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGF1ZGlvX2NvcHAtPmVxKSAtCi0JCQkJKEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNU19DT01NT05fTEVOICsgMikpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlhdWRpb19jb3BwLT5lcV9lbmFibGUgPSBwcmV2X3N0YXRlOwotCQlhdWRpb19jb3BwLT5lcV9uZWVkc19jb21taXQgPSAxOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fU0VUX1JYX0lJUjoKLQkJcHJldl9zdGF0ZSA9IGF1ZGlvX2NvcHAtPnJ4X2lpcl9lbmFibGU7Ci0JCWF1ZGlvX2NvcHAtPnJ4X2lpcl9lbmFibGUgPSAwOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmF1ZGlvX2NvcHAtPmlpci5udW1fYmFuZHMsICh2b2lkICopIGFyZywKLQkJCQlzaXplb2YoYXVkaW9fY29wcC0+aWlyKSAtCi0JCQkJKEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNU19DT01NT05fTEVOICsgMikpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlhdWRpb19jb3BwLT5yeF9paXJfZW5hYmxlID0gcHJldl9zdGF0ZTsKLQkJYXVkaW9fY29wcC0+cnhfaWlyX25lZWRzX2NvbW1pdCA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlhdWRpb19jb3BwLT52b2xfcGFuLnZvbHVtZSA9IGFyZzsKLQkJYXVkaW9fZW5hYmxlX3ZvbF9wYW4oYXVkaW9fY29wcCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfUEFOOgotCQlhdWRpb19jb3BwLT52b2xfcGFuLnBhbiA9IGFyZzsKLQkJYXVkaW9fZW5hYmxlX3ZvbF9wYW4oYXVkaW9fY29wcCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfUUNPTkNFUlRfUExVUzoKLQkJcHJldl9zdGF0ZSA9IGF1ZGlvX2NvcHAtPnFjb25jZXJ0X3BsdXNfZW5hYmxlOwotCQlhdWRpb19jb3BwLT5xY29uY2VydF9wbHVzX2VuYWJsZSA9IDA7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYXVkaW9fY29wcC0+cWNvbmNlcnRfcGx1cy5vcF9tb2RlLAotCQkJCSh2b2lkICopIGFyZywKLQkJCQlzaXplb2YoYXVkaW9fY29wcC0+cWNvbmNlcnRfcGx1cykgLQotCQkJCShBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfQ09NTU9OX0xFTiArIDIpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYXVkaW9fY29wcC0+cWNvbmNlcnRfcGx1c19lbmFibGUgPSBwcmV2X3N0YXRlOwotCQlhdWRpb19jb3BwLT5xY29uY2VydF9wbHVzX25lZWRzX2NvbW1pdCA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfU1JTX1RSVU1FRElBX1BBUkFNOiB7Ci0JCXByZXZfc3RhdGUgPSBhdWRpb19jb3BwLT5zcnNfZW5hYmxlOwotCQlhdWRpb19jb3BwLT5zcnNfZW5hYmxlID0gMDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnRvX3NldCwgKHZvaWQgKilhcmcsIHNpemVvZih1aW50MzJfdCkpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlzd2l0Y2ggKHRvX3NldCkgewotCQljYXNlIFNSU19JRF9HTE9CQUw6Ci0JCQlzcnNfcGFyYW1zID0gKHZvaWQgKilhdWRpb19jb3BwLT5nLnY7Ci0JCQlzaXplID0gc2l6ZW9mKGF1ZGlvX2NvcHAtPmcudik7Ci0JCQlhdWRpb19jb3BwLT5zcnNfZmVhdHVyZV9tYXNrIHw9IFNSU19NQVNLX0c7Ci0JCQlicmVhazsKLQkJY2FzZSBTUlNfSURfV09XSEQ6Ci0JCQlzcnNfcGFyYW1zID0gKHZvaWQgKilhdWRpb19jb3BwLT53LnY7Ci0JCQlzaXplID0gc2l6ZW9mKGF1ZGlvX2NvcHAtPncudik7Ci0JCQlhdWRpb19jb3BwLT5zcnNfZmVhdHVyZV9tYXNrIHw9IFNSU19NQVNLX1c7Ci0JCQlicmVhazsKLQkJY2FzZSBTUlNfSURfQ1NIUDoKLQkJCXNyc19wYXJhbXMgPSAodm9pZCAqKWF1ZGlvX2NvcHAtPmMudjsKLQkJCXNpemUgPSBzaXplb2YoYXVkaW9fY29wcC0+Yy52KTsKLQkJCWF1ZGlvX2NvcHAtPnNyc19mZWF0dXJlX21hc2sgfD0gU1JTX01BU0tfQzsKLQkJCWJyZWFrOwotCQljYXNlIFNSU19JRF9IUEY6Ci0JCQlzcnNfcGFyYW1zID0gKHZvaWQgKilhdWRpb19jb3BwLT5oLnY7Ci0JCQlzaXplID0gc2l6ZW9mKGF1ZGlvX2NvcHAtPmgudik7Ci0JCQlhdWRpb19jb3BwLT5zcnNfZmVhdHVyZV9tYXNrIHw9IFNSU19NQVNLX0hQOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1JTX0lEX1BFUToKLQkJCXNyc19wYXJhbXMgPSAodm9pZCAqKWF1ZGlvX2NvcHAtPnAudjsKLQkJCXNpemUgPSBzaXplb2YoYXVkaW9fY29wcC0+cC52KTsKLQkJCWF1ZGlvX2NvcHAtPnNyc19mZWF0dXJlX21hc2sgfD0gU1JTX01BU0tfUDsKLQkJCWJyZWFrOwotCQljYXNlIFNSU19JRF9ITDoKLQkJCXNyc19wYXJhbXMgPSAodm9pZCAqKWF1ZGlvX2NvcHAtPmwudjsKLQkJCXNpemUgPSBzaXplb2YoYXVkaW9fY29wcC0+bC52KTsKLQkJCWF1ZGlvX2NvcHAtPnNyc19mZWF0dXJlX21hc2sgfD0gU1JTX01BU0tfSEw7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCU1NX0VSUigiU1JTIFRydU1lZGlhIGVycm9yOiBpbnZhbGlkIGlvY3RsXG4iKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChyYyA+PSAwKSB7Ci0JCQl0bXBidWYgPSBremFsbG9jKHNpemVvZih1aW50MzJfdCkgKyBzaXplICwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXRtcGJ1ZikgewotCQkJCU1NX0VSUigiU1JTIFRydU1lZGlhIGVycm9yOiBubyBrZXJuZWwgbWVtXG4iKTsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjb3B5X2Zyb21fdXNlcih0bXBidWYsICh2b2lkICopYXJnLAotCQkJCQkJc2l6ZW9mKHVpbnQzMl90KSArIHNpemUpKQotCQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJbWVtY3B5KHNyc19wYXJhbXMsCi0JCQkJCSYoKCh1aW50MzJfdCAqKXRtcGJ1ZilbMV0pLCBzaXplKTsKLQkJCQlrZnJlZSh0bXBidWYpOwotCQkJfQotCQl9Ci0KLQkJTU1fREJHKCJJb2N0bCBTUlMgZmxhZ3M9MHgleFxuIiwgYXVkaW9fY29wcC0+c3JzX2ZlYXR1cmVfbWFzayk7Ci0JCWlmIChyYyA8IDApCi0JCQlNTV9FUlIoIlNSUyBUcnVNZWRpYSBlcnJvciBzZXR0aW5nIHBhcmFtcyBmYWlsZWQuXG4iKTsKLQkJZWxzZXsKLQkJCWF1ZGlvX2NvcHAtPnNyc19uZWVkc19jb21taXQgPSAxOwotCQkJYXVkaW9fY29wcC0+c3JzX2VuYWJsZSA9IHByZXZfc3RhdGU7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQotCW11dGV4X3VubG9jaygmYXVkaW9fY29wcC0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZHBwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvX2NvcHAgKmF1ZGlvX2NvcHAgPSAmdGhlX2F1ZGlvX2NvcHA7Ci0JaW50IHJjOwotCi0JbXV0ZXhfbG9jaygmYXVkaW9fY29wcC0+bG9jayk7Ci0JaWYgKGF1ZGlvX2NvcHAtPm9wZW5lZCkgewotCQltdXRleF91bmxvY2soJmF1ZGlvX2NvcHAtPmxvY2spOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCWF1ZGlvX2NvcHAtPm9wZW5lZCA9IDE7Ci0KLQlpZiAoIWF1ZGlvX2NvcHAtPnN0YXR1cykgewotCQlhdWRpb19jb3BwLT5lY2IuZm4gPSBhdWRpb19jb21taXRfcGVuZGluZ19wcF9wYXJhbXM7Ci0JCWF1ZGlvX2NvcHAtPmVjYi5wcml2YXRlID0gYXVkaW9fY29wcDsKLQkJcmMgPSBhdWRwcF9yZWdpc3Rlcl9ldmVudF9jYWxsYmFjaygmYXVkaW9fY29wcC0+ZWNiKTsKLQkJaWYgKHJjKSB7Ci0JCQlhdWRpb19jb3BwLT5vcGVuZWQgPSAwOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpb19jb3BwLT5sb2NrKTsKLQkJCXJldHVybiByYzsKLQkJfQotCQlhdWRpb19jb3BwLT5tYmFkcmNfZGF0YSA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLAotCQkJCUFVRFBQX01CQURSQ19FWFRFUk5BTF9CVUZfU0laRSAqIDIsCi0JCQkJICZhdWRpb19jb3BwLT5tYmFkcmNfcGh5cywgR0ZQX0tFUk5FTCk7Ci0JCWlmICghYXVkaW9fY29wcC0+bWJhZHJjX2RhdGEpIHsKLQkJCU1NX0VSUigiY291bGQgbm90IGFsbG9jYXRlIERNQSBidWZmZXJzXG4iKTsKLQkJCWF1ZGlvX2NvcHAtPm9wZW5lZCA9IDA7Ci0JCQlhdWRwcF91bnJlZ2lzdGVyX2V2ZW50X2NhbGxiYWNrKCZhdWRpb19jb3BwLT5lY2IpOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpb19jb3BwLT5sb2NrKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCWF1ZGlvX2NvcHAtPnZvbF9wYW4udm9sdW1lID0gMHgyMDAwOwotCQlhdWRpb19jb3BwLT52b2xfcGFuLnBhbiA9IDB4MDsKLQkJYXVkaW9fY29wcC0+c3RhdHVzID0gMTsKLQl9Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpb19jb3BwOwotCW11dGV4X3VubG9jaygmYXVkaW9fY29wcC0+bG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRwcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpb19jb3BwICphdWRpb19jb3BwID0gJnRoZV9hdWRpb19jb3BwOwotCi0JYXVkaW9fY29wcC0+b3BlbmVkID0gMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBhdWRpb19vcGVuLAotCS5yZWxlYXNlCT0gYXVkaW9fcmVsZWFzZSwKLQkucmVhZAkJPSBhdWRpb19yZWFkLAotCS53cml0ZQkJPSBhdWRpb193cml0ZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBhdWRpb19pb2N0bCwKLQkuZnN5bmMJCT0gYXVkaW9fZnN5bmMsCi19OwotCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRwcF9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBhdWRwcF9vcGVuLAotCS5yZWxlYXNlCT0gYXVkcHBfcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBhdWRwcF9pb2N0bCwKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gIm1zbV9wY21fb3V0IiwKLQkuZm9wcwk9ICZhdWRpb19mb3BzLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkcHBfbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX3BjbV9jdGwiLAotCS5mb3BzCT0gJmF1ZHBwX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19pbml0KHZvaWQpCi17Ci0JbXV0ZXhfaW5pdCgmdGhlX2F1ZGlvLmxvY2spOwotCW11dGV4X2luaXQoJnRoZV9hdWRpby53cml0ZV9sb2NrKTsKLQltdXRleF9pbml0KCZ0aGVfYXVkaW9fY29wcC5sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmdGhlX2F1ZGlvLmRzcF9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfYXVkaW8ud2FpdCk7Ci0Jd2FrZV9sb2NrX2luaXQoJnRoZV9hdWRpby53YWtlbG9jaywgV0FLRV9MT0NLX1NVU1BFTkQsICJhdWRpb19wY20iKTsKLQlwbV9xb3NfYWRkX3JlcXVlc3QoJnRoZV9hdWRpby5wbV9xb3NfcmVxLCBQTV9RT1NfQ1BVX0RNQV9MQVRFTkNZLAotCQkJCVBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQlyZXR1cm4gKG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX21pc2MpIHx8IG1pc2NfcmVnaXN0ZXIoJmF1ZHBwX21pc2MpKTsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGF1ZGlvX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fcGNtLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19wY20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmYzJiZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19wY20uYworKysgL2Rldi9udWxsCkBAIC0xLDE3NDYgKzAsMCBAQAotCi0vKiBhdWRpb19wY20uYyAtIHBjbSBhdWRpbyBkZWNvZGVyIGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBCYXNlZCBvbiB0aGUgbXAzIGRlY29kZXIgZHJpdmVyIGluIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX21wMy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICoKLSAqIEFsbCBzb3VyY2UgY29kZSBpbiB0aGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGV4Y2VwdAotICogd2hlcmUgaW5kaWNhdGVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKLSAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGZpbmQgaXQgYXQgaHR0cDovL3d3dy5mc2Yub3JnCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vhcmx5c3VzcGVuZC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotCi0KLSNpbmNsdWRlIDxtYWNoL21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdS5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXVfZG9tYWlucy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcGNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHBtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHAuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcGxheWNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcGxheW1zZy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVybXRjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9hbGxvYy5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX21lbXR5cGVzLmg+Ci0KLSNpbmNsdWRlICJhdWRtZ3IuaCIKLQotLyogZm9yIHF1ZXVlIGlkcyAtIHNob3VsZCBiZSByZWxhdGl2ZSB0byBtb2R1bGUgbnVtYmVyKi8KLSNpbmNsdWRlICJhZHNwLmgiCi0KLSNkZWZpbmUgQURSVl9TVEFUVVNfQUlPX0lOVEYgMHgwMDAwMDAwMQotI2RlZmluZSBBRFJWX1NUQVRVU19PQlVGX0dJVkVOIDB4MDAwMDAwMDIKLSNkZWZpbmUgQURSVl9TVEFUVVNfSUJVRl9HSVZFTiAweDAwMDAwMDA0Ci0jZGVmaW5lIEFEUlZfU1RBVFVTX0ZTWU5DIDB4MDAwMDAwMDgKLQotLyogU2l6ZSBtdXN0IGJlIHBvd2VyIG9mIDIgKi8KLSNkZWZpbmUgQlVGU1pfTUFYIDMyNzY4Ci0jZGVmaW5lIEJVRlNaX01JTiA0MDk2Ci0jZGVmaW5lIERNQVNaX01BWCAoQlVGU1pfTUFYICogMikKLSNkZWZpbmUgRE1BU1pfTUlOIChCVUZTWl9NSU4gKiAyKQotCi0jZGVmaW5lIEFVRERFQ19ERUNfUENNIDAKLQotLyogRGVjb2RlciBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBBVURQUFRBU0sgKi8KLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfU0xFRVAJMAotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19JTklUICAxCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX0NGRyAgIDIKLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfUExBWSAgMwotCi0jZGVmaW5lIEFVRFBDTV9FVkVOVF9OVU0gMTAgLyogRGVmYXVsdCBudW1iZXIgb2YgcHJlLWFsbG9jYXRlZCBldmVudCBwYWNrZXRzICovCi0KLSNkZWZpbmUgX19DT05UQUlOUyhyLCB2LCBsKSAoewkJCQkJXAotCXR5cGVvZihyKSBfX3IgPSByOwkJCQkJXAotCXR5cGVvZih2KSBfX3YgPSB2OwkJCQkJXAotCXR5cGVvZih2KSBfX2UgPSBfX3YgKyBsOwkJCQlcCi0JaW50IHJlcyA9ICgoX192ID49IF9fci0+dmFkZHIpICYmIAkJCVwKLQkJKF9fZSA8PSBfX3ItPnZhZGRyICsgX19yLT5sZW4pKTsJCVwKLQlyZXM7CQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgQ09OVEFJTlMocjEsIHIyKSAoewkJCQkJXAotCXR5cGVvZihyMikgX19yMiA9IHIyOwkJCQkJXAotCV9fQ09OVEFJTlMocjEsIF9fcjItPnZhZGRyLCBfX3IyLT5sZW4pOwkJCVwKLX0pCi0KLSNkZWZpbmUgSU5fUkFOR0UociwgdikgKHsJCQkJCVwKLQl0eXBlb2YocikgX19yID0gcjsJCQkJCVwKLQl0eXBlb2YodikgX192diA9IHY7CQkJCQlcCi0JaW50IHJlcyA9ICgoX192diA+PSBfX3ItPnZhZGRyKSAmJgkJCVwKLQkJKF9fdnYgPCAoX19yLT52YWRkciArIF9fci0+bGVuKSkpOwkJXAotCXJlczsJCQkJCQkJXAotfSkKLQotI2RlZmluZSBPVkVSTEFQUyhyMSwgcjIpICh7CQkJCQlcCi0JdHlwZW9mKHIxKSBfX3IxID0gcjE7CQkJCQlcCi0JdHlwZW9mKHIyKSBfX3IyID0gcjI7CQkJCQlcCi0JdHlwZW9mKF9fcjItPnZhZGRyKSBfX3YgPSBfX3IyLT52YWRkcjsJCQlcCi0JdHlwZW9mKF9fdikgX19lID0gX192ICsgX19yMi0+bGVuIC0gMTsJCQlcCi0JaW50IHJlcyA9IChJTl9SQU5HRShfX3IxLCBfX3YpIHx8IElOX1JBTkdFKF9fcjEsIF9fZSkpOwlcCi0JcmVzOwkJCQkJCQlcCi19KQotCi1zdHJ1Y3QgYXVkaW87Ci0KLXN0cnVjdCBidWZmZXIgewotCXZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgc2l6ZTsKLQl1bnNpZ25lZCB1c2VkOwkJLyogSW5wdXQgdXNhZ2UgYWN0dWFsIERTUCBwcm9kdWNlZCBQQ00gc2l6ZSAgKi8KLQl1bnNpZ25lZCBhZGRyOwotfTsKLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdHJ1Y3QgYXVkcGNtX3N1c3BlbmRfY3RsIHsKLSAgc3RydWN0IGVhcmx5X3N1c3BlbmQgbm9kZTsKLSAgc3RydWN0IGF1ZGlvICphdWRpbzsKLX07Ci0jZW5kaWYKLQotc3RydWN0IGF1ZHBjbV9ldmVudCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCWludCBldmVudF90eXBlOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci19OwotCi1zdHJ1Y3QgYXVkcGNtX2lvbl9yZWdpb24gewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOwotCWludCBmZDsKLQl2b2lkICp2YWRkcjsKLQl1bnNpZ25lZCBsb25nIHBhZGRyOwotCXVuc2lnbmVkIGxvbmcga3ZhZGRyOwotCXVuc2lnbmVkIGxvbmcgbGVuOwotCXVuc2lnbmVkIHJlZl9jbnQ7Ci19OwotCi1zdHJ1Y3QgYXVkcGNtX2J1ZmZlcl9ub2RlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IG1zbV9hdWRpb19haW9fYnVmIGJ1ZjsKLQl1bnNpZ25lZCBsb25nIHBhZGRyOwotfTsKLQotc3RydWN0IGF1ZHBjbV9kcnZfb3BlcmF0aW9ucyB7Ci0Jdm9pZCAoKnNlbmRfZGF0YSkoc3RydWN0IGF1ZGlvICosIHVuc2lnbmVkKTsKLQl2b2lkICgqb3V0X2ZsdXNoKShzdHJ1Y3QgYXVkaW8gKik7Ci0JaW50ICgqZnN5bmMpKHN0cnVjdCBhdWRpbyAqKTsKLX07Ci0KLXN0cnVjdCBhdWRpbyB7Ci0Jc3RydWN0IGJ1ZmZlciBvdXRbMl07Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JdWludDhfdCBvdXRfaGVhZDsKLQl1aW50OF90IG91dF90YWlsOwotCXVpbnQ4X3Qgb3V0X25lZWRlZDsgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGRzcCBpcyB3YWl0aW5nIGZvciAqLwotCXVuc2lnbmVkIG91dF9kbWFfc3o7Ci0Jc3RydWN0IGxpc3RfaGVhZCBvdXRfcXVldWU7IC8qIHF1ZXVlIHRvIHJldGFpbiBvdXRwdXQgYnVmZmVycyAqLwotCWF0b21pY190IG91dF9ieXRlczsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtdXRleCB3cml0ZV9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlX3dhaXQ7Ci0KLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICphdWRwbGF5OwotCi0JLyogY29uZmlndXJhdGlvbiB0byB1c2Ugb24gbmV4dCBlbmFibGUgKi8KLQl1aW50MzJfdCBvdXRfc2FtcGxlX3JhdGU7Ci0JdWludDMyX3Qgb3V0X2NoYW5uZWxfbW9kZTsKLQl1aW50MzJfdCBvdXRfYml0czsgLyogYml0cyBwZXIgc2FtcGxlICovCi0KLQlzdHJ1Y3QgYXVkbWdyIGF1ZG1ncjsKLQotCS8qIGRhdGEgYWxsb2NhdGVkIGZvciB2YXJpb3VzIGJ1ZmZlcnMgKi8KLQljaGFyICpkYXRhOwotCWludDMyX3QgcGh5czsKLQl2b2lkICptYXBfdl93cml0ZTsKLQotCXVpbnQzMl90IGRydl9zdGF0dXM7Ci0JaW50IHdmbHVzaDsgLyogV3JpdGUgZmx1c2ggKi8KLQlpbnQgb3BlbmVkOwotCWludCBlbmFibGVkOwotCWludCBydW5uaW5nOwotCWludCBzdG9wcGVkOyAvKiBzZXQgd2hlbiBzdG9wcGVkLCBjbGVhcmVkIG9uIGZsdXNoICovCi0JaW50IHRlb3M7IC8qIHZhbGlkIG9ubHkgaWYgdHVubmVsIG1vZGUgJiBubyBkYXRhIGxlZnQgZm9yIGRlY29kZXIgKi8KLQlpbnQgcm10X3Jlc291cmNlX3JlbGVhc2VkOwotCWVudW0gbXNtX2F1ZF9kZWNvZGVyX3N0YXRlIGRlY19zdGF0ZTsgLyogUmVwcmVzZW50cyBkZWNvZGVyIHN0YXRlICovCi0JaW50IHJlc2VydmVkOyAvKiBBIGJ5dGUgaXMgYmVpbmcgcmVzZXJ2ZWQgKi8KLQljaGFyIHJzdl9ieXRlOyAvKiBIYW5kbGUgb2RkIGxlbmd0aCB1c2VyIGRhdGEgKi8KLQotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIHF1ZXVlX2lkOwotCi0JdW5zaWduZWQgdm9sdW1lOwotCi0JdWludDE2X3QgZGVjX2lkOwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQlzdHJ1Y3QgYXVkcGNtX3N1c3BlbmRfY3RsIHN1c3BlbmRfY3RsOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7Ci0jZW5kaWYKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9ldmVudF9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50X3F1ZXVlOwotCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3dhaXQ7Ci0Jc3BpbmxvY2tfdCBldmVudF9xdWV1ZV9sb2NrOwotCXN0cnVjdCBtdXRleCBnZXRfZXZlbnRfbG9jazsKLQlpbnQgZXZlbnRfYWJvcnQ7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkIGlvbl9yZWdpb25fcXVldWU7Ci0Jc3RydWN0IGF1ZHBjbV9kcnZfb3BlcmF0aW9ucyBkcnZfb3BzOwotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQ7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKm91dHB1dF9idWZmX2hhbmRsZTsKLX07Ci0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcGxheV9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgbmVlZGVkKTsKLXN0YXRpYyB2b2lkIGF1ZGlvX2RzcF9ldmVudCh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZyk7Ci1zdGF0aWMgdm9pZCBhdWRwY21fcG9zdF9ldmVudChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGF1ZHBjbV9pb25fZml4dXAoc3RydWN0IGF1ZGlvICphdWRpbywgdm9pZCAqYWRkciwKLQl1bnNpZ25lZCBsb25nIGxlbiwgaW50IHJlZl91cCk7Ci0KLXN0YXRpYyBpbnQgcm10X3B1dF9yZXNvdXJjZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRfY29kZWNfY29uZmlnX2NtZCBjbWQ7Ci0JdW5zaWduZWQgc2hvcnQgY2xpZW50X2lkeDsKLQotCWNtZC5jbWRfaWQgPSBSTV9DTURfQVVEX0NPREVDX0NGRzsKLQljbWQuY2xpZW50X2lkID0gUk1fQVVEX0NMSUVOVF9JRDsKLQljbWQudGFza19pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmVuYWJsZSA9IFJNVF9ESVNBQkxFOwotCWNtZC5kZWNfdHlwZSA9IEFVRERFQ19ERUNfUENNOwotCWNsaWVudF9pZHggPSAoKGNtZC5jbGllbnRfaWQgPDwgOCkgfCBjbWQudGFza19pZCk7Ci0KLQlyZXR1cm4gcHV0X2Fkc3BfcmVzb3VyY2UoY2xpZW50X2lkeCwgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IHJtdF9nZXRfcmVzb3VyY2Uoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkX2NvZGVjX2NvbmZpZ19jbWQgY21kOwotCXVuc2lnbmVkIHNob3J0IGNsaWVudF9pZHg7Ci0KLQljbWQuY21kX2lkID0gUk1fQ01EX0FVRF9DT0RFQ19DRkc7Ci0JY21kLmNsaWVudF9pZCA9IFJNX0FVRF9DTElFTlRfSUQ7Ci0JY21kLnRhc2tfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5lbmFibGUgPSBSTVRfRU5BQkxFOwotCWNtZC5kZWNfdHlwZSA9IEFVRERFQ19ERUNfUENNOwotCWNsaWVudF9pZHggPSAoKGNtZC5jbGllbnRfaWQgPDwgOCkgfCBjbWQudGFza19pZCk7Ci0KLQlyZXR1cm4gZ2V0X2Fkc3BfcmVzb3VyY2UoY2xpZW50X2lkeCwgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkaW9fZW5hYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZG1ncl9jb25maWcgY2ZnOwotCWludCByYzsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JaWYgKGF1ZGlvLT5lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWlmIChhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID09IDEpIHsKLQkJYXVkaW8tPnJtdF9yZXNvdXJjZV9yZWxlYXNlZCA9IDA7Ci0JCXJjID0gcm10X2dldF9yZXNvdXJjZShhdWRpbyk7Ci0JCWlmIChyYykgewotCQkJTU1fRVJSKCJBRFNQIHJlc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgUENNIFwKLQkJCQlzZXNzaW9uIDB4JTA4eCBvbiBkZWNvZGVyOiAlZFxuIElnbm9yaW5nIFwKLQkJCQllcnJvciBhbmQgZ29pbmcgYWhlYWQgd2l0aCB0aGUgcGxheWJhY2tcbiIsCi0JCQkJKGludClhdWRpbywgYXVkaW8tPmRlY19pZCk7Ci0JCX0KLQl9Ci0KLQlhdWRpby0+ZGVjX3N0YXRlID0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkU7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0KLQljZmcudHhfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFX05PTkU7Ci0JY2ZnLnJ4X3JhdGUgPSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV80ODAwMDsKLQljZmcuZGVmX21ldGhvZCA9IFJQQ19BVURfREVGX01FVEhPRF9QTEFZQkFDSzsKLQljZmcuY29kZWMgPSBSUENfQVVEX0RFRl9DT0RFQ19QQ007Ci0JY2ZnLnNuZF9tZXRob2QgPSBSUENfU05EX01FVEhPRF9NSURJOwotCi0JcmMgPSBhdWRtZ3JfZW5hYmxlKCZhdWRpby0+YXVkbWdyLCAmY2ZnKTsKLQlpZiAocmMgPCAwKSB7Ci0JCW1zbV9hZHNwX2R1bXAoYXVkaW8tPmF1ZHBsYXkpOwotCQlyZXR1cm4gcmM7Ci0JfQotCWlmIChtc21fYWRzcF9lbmFibGUoYXVkaW8tPmF1ZHBsYXkpKSB7Ci0JCU1NX0VSUigibXNtX2Fkc3BfZW5hYmxlKGF1ZHBsYXkpIGZhaWxlZFxuIik7Ci0JCWF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKGF1ZHBwX2VuYWJsZShhdWRpby0+ZGVjX2lkLCBhdWRpb19kc3BfZXZlbnQsIGF1ZGlvKSkgewotCQlNTV9FUlIoImF1ZHBwX2VuYWJsZSgpIGZhaWxlZFxuIik7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWF1ZGlvLT5lbmFibGVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGlvX2Rpc2FibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JaWYgKGF1ZGlvLT5lbmFibGVkKSB7Ci0JCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCQlhdWRkZWNfZHNwX2NvbmZpZyhhdWRpbywgMCk7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXQsCi0JCQkJYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORSwKLQkJCQltc2Vjc190b19qaWZmaWVzKE1TTV9BVURfREVDT0RFUl9XQUlUX01TKSk7Ci0JCWlmIChyYyA9PSAwKQotCQkJcmMgPSAtRVRJTUVET1VUOwotCQllbHNlIGlmIChhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRpby0+YXVkcGxheSk7Ci0JCWF1ZHBwX2Rpc2FibGUoYXVkaW8tPmRlY19pZCwgYXVkaW8pOwotCQlyYyA9IGF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJaWYgKHJjIDwgMCkKLQkJCW1zbV9hZHNwX2R1bXAoYXVkaW8tPmF1ZHBsYXkpOwotCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCXJtdF9wdXRfcmVzb3VyY2UoYXVkaW8pOwotCQlhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID0gMTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfZHNwX2V2ZW50KHZvaWQgKmRhdGEsIHVuc2lnbmVkIGlkLCBzaXplX3QgbGVuLAotCQkJICAgICAgdm9pZCAoKmdldGV2ZW50KSAodm9pZCAqcHRyLCBzaXplX3QgbGVuKSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZGF0YTsKLQl1aW50MzJfdCBtc2dbMjhdOwotCWdldGV2ZW50KG1zZywgc2l6ZW9mKG1zZykpOwotCi0JTU1fREJHKCJtc2dfaWQ9JXhcbiIsIGlkKTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBMQVlfTVNHX0RFQ19ORUVEU19EQVRBOgotCQlhdWRpby0+ZHJ2X29wcy5zZW5kX2RhdGEoYXVkaW8sIDEpOwotCQlicmVhazsKLQljYXNlIEFEU1BfTUVTU0FHRV9JRDoKLQkJTU1fREJHKCJSZWNlaXZlZCBBRFNQIGV2ZW50OiBtb2R1bGUgZW5hYmxlKGF1ZHBsYXl0YXNrKVxuIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1NX0VSUigidW5leHBlY3RlZCBtZXNzYWdlIGZyb20gZGVjb2RlciBcbiIpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2RzcF9ldmVudCh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gcHJpdmF0ZTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBQX01TR19TVEFUVVNfTVNHOnsKLQkJCXVuc2lnbmVkIHN0YXR1cyA9IG1zZ1sxXTsKLQotCQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19TTEVFUDogewotCQkJCXVpbnQxNl90IHJlYXNvbiA9IG1zZ1syXTsKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBzbGVlcCByZWFzb24gPSBcCi0JCQkJCQkweCUwNHhcbiIsIHJlYXNvbik7Ci0JCQkJaWYgKChyZWFzb24gPT0gQVVEUFBfTVNHX1JFQVNPTl9NRU0pCi0JCQkJCQl8fCAocmVhc29uID09Ci0JCQkJCQlBVURQUF9NU0dfUkVBU09OX05PREVDT0RFUikpIHsKLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfRkFJTFVSRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0gZWxzZSBpZiAocmVhc29uID09IEFVRFBQX01TR19SRUFTT05fTk9ORSkgewotCQkJCQkvKiBkZWNvZGVyIGlzIGluIGRpc2FibGUgc3RhdGUgKi8KLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfQ0xPU0U7Ci0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfSU5JVDoKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBpbml0XG4iKTsKLQkJCQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKGF1ZGlvKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX0NGRzoKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBjZmcgXG4iKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19QTEFZOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IHBsYXkgXG4iKTsKLQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1M7Ci0JCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlNTV9FUlIoInVua25vd24gZGVjb2RlciBzdGF0dXMgXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURQUF9NU0dfQ0ZHX01TRzoKLQkJaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0VOQSkgewotCQkJTU1fREJHKCJDRkdfTVNHIEVOQUJMRVxuIik7Ci0JCQlhdWRkZWNfZHNwX2NvbmZpZyhhdWRpbywgMSk7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCQlhdWRpby0+cnVubmluZyA9IDE7Ci0JCQlhdWRwcF9zZXRfdm9sdW1lX2FuZF9wYW4oYXVkaW8tPmRlY19pZCwgYXVkaW8tPnZvbHVtZSwKLQkJCQkJMCk7Ci0JCX0gZWxzZSBpZiAobXNnWzBdID09IEFVRFBQX01TR19FTkFfRElTKSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgRElTQUJMRVxuIik7Ci0JCQlhdWRpby0+cnVubmluZyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoIkNGR19NU0cgJWQ/XG4iLAltc2dbMF0pOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX0ZMVVNIX0FDSzoKLQkJTU1fREJHKCJGTFVTSF9BQ0tcbiIpOwotCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlicmVhazsKLQotCWNhc2UgQVVEUFBfTVNHX1BDTURNQU1JU1NFRDoKLQkJTU1fREJHKCJQQ01ETUFNSVNTRURcbiIpOwotCQlhdWRpby0+dGVvcyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlNTV9FUlIoIlVOS05PV04gKCVkKVxuIiwgaWQpOwotCX0KLQotfQotCi0KLXN0cnVjdCBtc21fYWRzcF9vcHMgYXVkcGNtZGVjX2Fkc3Bfb3BzID0gewotCS5ldmVudCA9IGF1ZHBsYXlfZHNwX2V2ZW50LAotfTsKLQotCi0jZGVmaW5lIGF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHBsYXksIGF1ZGlvLT5xdWV1ZV9pZCwgXAotCQkJY21kLCBsZW4pCi0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQl1MTYgY2ZnX2RlY19jbWRbQVVEUFBfQ01EX0NGR19ERUNfVFlQRV9MRU4gLyBzaXplb2YodW5zaWduZWQgc2hvcnQpXTsKLQotCW1lbXNldChjZmdfZGVjX2NtZCwgMCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci0KLQljZmdfZGVjX2NtZFswXSA9IEFVRFBQX0NNRF9DRkdfREVDX1RZUEU7Ci0JaWYgKGVuYWJsZSkKLQkJY2ZnX2RlY19jbWRbMSArIGF1ZGlvLT5kZWNfaWRdID0gQVVEUFBfQ01EX1VQREFUREVfQ0ZHX0RFQyB8Ci0JCQkJQVVEUFBfQ01EX0VOQV9ERUNfViB8IEFVRERFQ19ERUNfUENNOwotCWVsc2UKLQkJY2ZnX2RlY19jbWRbMSArIGF1ZGlvLT5kZWNfaWRdID0gQVVEUFBfQ01EX1VQREFUREVfQ0ZHX0RFQyB8Ci0JCQkJQVVEUFBfQ01EX0RJU19ERUNfVjsKLQotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMSgmY2ZnX2RlY19jbWQsIHNpemVvZihjZmdfZGVjX2NtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc193YXYgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY29tbW9uLmNtZF9pZCA9IEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVM7Ci0JY21kLmNvbW1vbi5sZW5ndGggPSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TX1dBVl9MRU47Ci0JY21kLmNvbW1vbi5kZWNfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5jb21tb24uaW5wdXRfc2FtcGxpbmdfZnJlcXVlbmN5ID0gYXVkaW8tPm91dF9zYW1wbGVfcmF0ZTsKLQljbWQuc3RlcmVvX2NmZyA9IGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlOwotCWNtZC5wY21fd2lkdGggPSBhdWRpby0+b3V0X2JpdHM7Ci0JY21kLnNpZ24gPSAwOwotCWF1ZHBwX3NlbmRfcXVldWUyKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJCQkJdW5zaWduZWQgaWR4LCB1bnNpZ25lZCBsZW4pCi17Ci0JYXVkcGxheV9jbWRfYml0c3RyZWFtX2RhdGFfYXZhaWwgY21kOwotCi0JY21kLmNtZF9pZAkJPSBBVURQTEFZX0NNRF9CSVRTVFJFQU1fREFUQV9BVkFJTDsKLQljbWQuZGVjb2Rlcl9pZAkJPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5idWZfcHRyCQk9IGF1ZGlvLT5vdXRbaWR4XS5hZGRyOwotCWNtZC5idWZfc2l6ZQkJPSBsZW4vMjsKLQljbWQucGFydGl0aW9uX251bWJlcgk9IDA7Ci0JLyogY29tcGxldGUgd3JpdGVzIHRvIHRoZSBpbnB1dCBidWZmZXIgKi8KLQl3bWIoKTsKLQlyZXR1cm4gYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwY21fYXN5bmNfc2VuZF9kYXRhKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVuc2lnbmVkIG5lZWRlZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFhdWRpby0+cnVubmluZykKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCi0JaWYgKG5lZWRlZCAmJiAhYXVkaW8tPndmbHVzaCkgewotCQlhdWRpby0+b3V0X25lZWRlZCA9IDE7Ci0JCWlmIChhdWRpby0+ZHJ2X3N0YXR1cyAmIEFEUlZfU1RBVFVTX09CVUZfR0lWRU4pIHsKLQkJCS8qIHBvcCBvbmUgbm9kZSBvdXQgb2YgcXVldWUgKi8KLQkJCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0JCQlzdHJ1Y3QgYXVkcGNtX2J1ZmZlcl9ub2RlICp1c2VkX2J1ZjsKLQotCQkJTU1fREJHKCJjb25zdW1lZFxuIik7Ci0KLQkJCUJVR19PTihsaXN0X2VtcHR5KCZhdWRpby0+b3V0X3F1ZXVlKSk7Ci0JCQl1c2VkX2J1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5vdXRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZHBjbV9idWZmZXJfbm9kZSwgbGlzdCk7Ci0JCQlsaXN0X2RlbCgmdXNlZF9idWYtPmxpc3QpOwotCQkJcGF5bG9hZC5haW9fYnVmID0gdXNlZF9idWYtPmJ1ZjsKLQkJCWF1ZHBjbV9wb3N0X2V2ZW50KGF1ZGlvLCBBVURJT19FVkVOVF9XUklURV9ET05FLAotCQkJCXBheWxvYWQpOwotCQkJa2ZyZWUodXNlZF9idWYpOwotCQkJYXVkaW8tPmRydl9zdGF0dXMgJj0gfkFEUlZfU1RBVFVTX09CVUZfR0lWRU47Ci0JCX0KLQl9Ci0JaWYgKGF1ZGlvLT5vdXRfbmVlZGVkKSB7Ci0JCXN0cnVjdCBhdWRwY21fYnVmZmVyX25vZGUgKm5leHRfYnVmOwotCQlhdWRwbGF5X2NtZF9iaXRzdHJlYW1fZGF0YV9hdmFpbCBjbWQ7Ci0JCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPm91dF9xdWV1ZSkpIHsKLQkJCW5leHRfYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPm91dF9xdWV1ZSwKLQkJCQkJc3RydWN0IGF1ZHBjbV9idWZmZXJfbm9kZSwgbGlzdCk7Ci0JCQlNTV9EQkcoIm5leHRfYnVmICVwXG4iLCBuZXh0X2J1Zik7Ci0JCQlpZiAobmV4dF9idWYpIHsKLQkJCQlNTV9EQkcoIm5leHQgYnVmIHBoeSAlbHggbGVuICVkXG4iLAotCQkJCW5leHRfYnVmLT5wYWRkciwgbmV4dF9idWYtPmJ1Zi5kYXRhX2xlbik7Ci0KLQkJCQljbWQuY21kX2lkID0gQVVEUExBWV9DTURfQklUU1RSRUFNX0RBVEFfQVZBSUw7Ci0JCQkJaWYgKG5leHRfYnVmLT5idWYuZGF0YV9sZW4pCi0JCQkJCWNtZC5kZWNvZGVyX2lkID0gYXVkaW8tPmRlY19pZDsKLQkJCQllbHNlIHsKLQkJCQkJY21kLmRlY29kZXJfaWQgPSAtMTsKLQkJCQkJTU1fREJHKCJpbnB1dCBFT1Mgc2lnbmFsZWRcbiIpOwotCQkJCX0KLQkJCQljbWQuYnVmX3B0cgk9ICh1bnNpZ25lZCkgbmV4dF9idWYtPnBhZGRyOwotCQkJCWNtZC5idWZfc2l6ZSA9IG5leHRfYnVmLT5idWYuZGF0YV9sZW4gPj4gMTsKLQkJCQljbWQucGFydGl0aW9uX251bWJlcgk9IDA7Ci0JCQkJLyogY29tcGxldGUgd3JpdGVzIHRvIHRoZSBpbnB1dCBidWZmZXIgKi8KLQkJCQl3bWIoKTsKLQkJCQlhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci0JCQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQkJCWF1ZGlvLT5kcnZfc3RhdHVzIHw9IEFEUlZfU1RBVFVTX09CVUZfR0lWRU47Ci0JCQl9Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfc2VuZF9kYXRhKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVuc2lnbmVkIG5lZWRlZCkKLXsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFhdWRpby0+cnVubmluZykKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCi0JaWYgKG5lZWRlZCAmJiAhYXVkaW8tPndmbHVzaCkgewotCQkvKiBXZSB3ZXJlIGNhbGxlZCBmcm9tIHRoZSBjYWxsYmFjayBiZWNhdXNlIHRoZSBEU1AKLQkJICogcmVxdWVzdGVkIG1vcmUgZGF0YS4gIE5vdGUgdGhhdCB0aGUgRFNQIGRvZXMgd2FudAotCQkgKiBtb3JlIGRhdGEsIGFuZCBpZiBhIGJ1ZmZlciB3YXMgaW4tZmxpZ2h0LCBtYXJrIGl0Ci0JCSAqIGFzIGF2YWlsYWJsZSAoc2luY2UgdGhlIERTUCBtdXN0IG5vdyBiZSBkb25lIHdpdGgKLQkJICogaXQpLgotCQkgKi8KLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAxOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCWlmIChmcmFtZS0+dXNlZCA9PSAweGZmZmZmZmZmKSB7Ci0JCQlNTV9EQkcoImZyYW1lICVkIGZyZWVcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDA7Ci0JCQlhdWRpby0+b3V0X3RhaWwgXj0gMTsKLQkJCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJfQotCX0KLQotCWlmIChhdWRpby0+b3V0X25lZWRlZCkgewotCQkvKiBJZiB0aGUgRFNQIGN1cnJlbnRseSB3YW50cyBkYXRhIGFuZCB3ZSBoYXZlIGEKLQkJICogYnVmZmVyIGF2YWlsYWJsZSwgd2Ugd2lsbCBzZW5kIGl0IGFuZCByZXNldAotCQkgKiB0aGUgbmVlZGVkIGZsYWcuICBXZSdsbCBtYXJrIHRoZSBidWZmZXIgYXMgaW4tZmxpZ2h0Ci0JCSAqIHNvIHRoYXQgaXQgd29uJ3QgYmUgcmVjeWNsZWQgdW50aWwgdGhlIG5leHQgYnVmZmVyCi0JCSAqIGlzIHJlcXVlc3RlZAotCQkgKi8KLQotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCWlmIChmcmFtZS0+dXNlZCkgewotCQkJQlVHX09OKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpOwotCQkJTU1fREJHKCJmcmFtZSAlZCBidXN5XG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCQkJYXVkcGxheV9kc3Bfc2VuZF9kYXRhX2F2YWlsKGF1ZGlvLCBhdWRpby0+b3V0X3RhaWwsCi0JCQkJCWZyYW1lLT51c2VkKTsKLQkJCWZyYW1lLT51c2VkID0gMHhmZmZmZmZmZjsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkZXZpY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgdm9pZCBhdWRwY21fYXN5bmNfZmx1c2goc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGNtX2J1ZmZlcl9ub2RlICpidWZfbm9kZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhdWRpby0+b3V0X3F1ZXVlKSB7Ci0JCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhdWRwY21fYnVmZmVyX25vZGUsIGxpc3QpOwotCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCQlwYXlsb2FkLmFpb19idWYgPSBidWZfbm9kZS0+YnVmOwotCQlhdWRwY21fcG9zdF9ldmVudChhdWRpbywgQVVESU9fRVZFTlRfV1JJVEVfRE9ORSwKLQkJCQlwYXlsb2FkKTsKLQkJa2ZyZWUoYnVmX25vZGUpOwotCX0KLQlhdWRpby0+ZHJ2X3N0YXR1cyAmPSB+QURSVl9TVEFUVVNfT0JVRl9HSVZFTjsKLQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9ieXRlcywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2ZsdXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdWRpby0+b3V0WzBdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRbMV0udXNlZCA9IDA7Ci0JYXVkaW8tPm91dF9oZWFkID0gMDsKLQlhdWRpby0+b3V0X3RhaWwgPSAwOwotCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWF0b21pY19zZXQoJmF1ZGlvLT5vdXRfYnl0ZXMsIDApOwotfQotCi1zdGF0aWMgdm9pZCBhdWRpb19pb3BvcnRfcmVzZXQoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19BSU9fSU5URikgewotCQkvKiBJZiBmc3luYyBpcyBpbiBwcm9ncmVzcywgbWFrZSBzdXJlCi0JCSAqIHJldHVybiB2YWx1ZSBvZiBmc3luYyBpbmRpY2F0ZXMKLQkJICogYWJvcnQgZHVlIHRvIGZsdXNoCi0JCSAqLwotCQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19GU1lOQykgewotCQkJTU1fREJHKCJmc3luYyBpbiBwcm9ncmVzc1xuIik7Ci0JCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JCQlhdWRpby0+ZHJ2X29wcy5vdXRfZmx1c2goYXVkaW8pOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JCX0gZWxzZQotCQkJYXVkaW8tPmRydl9vcHMub3V0X2ZsdXNoKGF1ZGlvKTsKLQl9IGVsc2UgewotCQkvKiBNYWtlIHN1cmUgcmVhZC93cml0ZSB0aHJlYWQgYXJlIGZyZWUgZnJvbQotCQkgKiBzbGVlcCBhbmQga25vd2luZyB0aGF0IHN5c3RlbSBpcyBub3QgYWJsZQotCQkgKiB0byBwcm9jZXNzIGlvIHJlcXVlc3QgYXQgdGhlIG1vbWVudAotCQkgKi8KLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JCWF1ZGlvLT5kcnZfb3BzLm91dF9mbHVzaChhdWRpbyk7Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCX0KLX0KLQotc3RhdGljIGludCBhdWRwY21fZXZlbnRzX3BlbmRpbmcoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlbXB0eTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWVtcHR5ID0gIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gZW1wdHkgfHwgYXVkaW8tPmV2ZW50X2Fib3J0OwotfQotCi1zdGF0aWMgdm9pZCBhdWRwY21fcmVzZXRfZXZlbnRfcXVldWUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBhdWRwY21fZXZlbnQgKmRydl9ldnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhdWRpby0+ZXZlbnRfcXVldWUpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5ldmVudF9xdWV1ZSwKLQkJCXN0cnVjdCBhdWRwY21fZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJc3RydWN0IGF1ZHBjbV9ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQkJa2ZyZWUoZHJ2X2V2dCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBsb25nIGF1ZHBjbV9wcm9jZXNzX2V2ZW50X3JlcShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB2b2lkIF9fdXNlciAqYXJnKQotewotCWxvbmcgcmM7Ci0Jc3RydWN0IG1zbV9hdWRpb19ldmVudCB1c3JfZXZ0OwotCXN0cnVjdCBhdWRwY21fZXZlbnQgKmRydl9ldnQgPSBOVUxMOwotCWludCB0aW1lb3V0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnVzcl9ldnQsIGFyZywgc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fZXZlbnQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQl0aW1lb3V0ID0gKGludCkgdXNyX2V2dC50aW1lb3V0X21zOwotCi0JaWYgKHRpbWVvdXQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCi0JCQlhdWRpby0+ZXZlbnRfd2FpdCwgYXVkcGNtX2V2ZW50c19wZW5kaW5nKGF1ZGlvKSwKLQkJCW1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOwotCQlpZiAocmMgPT0gMCkKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCX0gZWxzZSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAotCQkJYXVkaW8tPmV2ZW50X3dhaXQsIGF1ZHBjbV9ldmVudHNfcGVuZGluZyhhdWRpbykpOwotCX0KLQotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCWlmIChhdWRpby0+ZXZlbnRfYWJvcnQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMDsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+ZXZlbnRfcXVldWUpKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQlzdHJ1Y3QgYXVkcGNtX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCX0KLQlpZiAoZHJ2X2V2dCkgewotCQl1c3JfZXZ0LmV2ZW50X3R5cGUgPSBkcnZfZXZ0LT5ldmVudF90eXBlOwotCQl1c3JfZXZ0LmV2ZW50X3BheWxvYWQgPSBkcnZfZXZ0LT5wYXlsb2FkOwotCQlsaXN0X2FkZF90YWlsKCZkcnZfZXZ0LT5saXN0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCX0gZWxzZQotCQlyYyA9IC0xOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoZHJ2X2V2dCAmJiBkcnZfZXZ0LT5ldmVudF90eXBlID09IEFVRElPX0VWRU5UX1dSSVRFX0RPTkUpIHsKLQkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCQlhdWRwY21faW9uX2ZpeHVwKGF1ZGlvLCBkcnZfZXZ0LT5wYXlsb2FkLmFpb19idWYuYnVmX2FkZHIsCi0JCQkJICBkcnZfZXZ0LT5wYXlsb2FkLmFpb19idWYuYnVmX2xlbiwgMCk7Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCX0KLQlpZiAoIXJjICYmIGNvcHlfdG9fdXNlcihhcmcsICZ1c3JfZXZ0LCBzaXplb2YodXNyX2V2dCkpKQotCQlyYyA9IC1FRkFVTFQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcGNtX2lvbl9jaGVjayhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQl2b2lkICp2YWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCi17Ci0Jc3RydWN0IGF1ZHBjbV9pb25fcmVnaW9uICpyZWdpb25fZWx0OwotCXN0cnVjdCBhdWRwY21faW9uX3JlZ2lvbiB0ID0gey52YWRkciA9IHZhZGRyLCAubGVuID0gbGVuIH07Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZ2lvbl9lbHQsICZhdWRpby0+aW9uX3JlZ2lvbl9xdWV1ZSwgbGlzdCkgewotCQlpZiAoQ09OVEFJTlMocmVnaW9uX2VsdCwgJnQpIHx8IENPTlRBSU5TKCZ0LCByZWdpb25fZWx0KSB8fAotCQkgICAgT1ZFUkxBUFMocmVnaW9uX2VsdCwgJnQpKSB7Ci0JCQlNTV9FUlIoIlslcF06cmVnaW9uICh2YWRkciAlcCBsZW4gJWxkKSIKLQkJCQkiIGNsYXNoZXMgd2l0aCByZWdpc3RlcmVkIHJlZ2lvbiIKLQkJCQkiICh2YWRkciAlcCBwYWRkciAlcCBsZW4gJWxkKVxuIiwKLQkJCQlhdWRpbywgdmFkZHIsIGxlbiwKLQkJCQlyZWdpb25fZWx0LT52YWRkciwKLQkJCQkodm9pZCAqKXJlZ2lvbl9lbHQtPnBhZGRyLCByZWdpb25fZWx0LT5sZW4pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbnQgYXVkcGNtX2lvbl9hZGQoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJCXN0cnVjdCBtc21fYXVkaW9faW9uX2luZm8gKmluZm8pCi17Ci0JaW9uX3BoeXNfYWRkcl90IHBhZGRyOwotCXNpemVfdCBsZW47Ci0JdW5zaWduZWQgbG9uZyBrdmFkZHI7Ci0Jc3RydWN0IGF1ZHBjbV9pb25fcmVnaW9uICpyZWdpb247Ci0JaW50IHJjID0gLUVJTlZBTDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOwotCXVuc2lnbmVkIGxvbmcgaW9uZmxhZzsKLQotCU1NX0VSUigiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JcmVnaW9uID0ga21hbGxvYyhzaXplb2YoKnJlZ2lvbiksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFyZWdpb24pIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGVuZDsKLQl9Ci0JaGFuZGxlID0gaW9uX2ltcG9ydF9kbWFfYnVmKGF1ZGlvLT5jbGllbnQsIGluZm8tPmZkKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoaGFuZGxlKSkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGhhbmRsZSBvZiB0aGUgZ2l2ZW4gZmRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBpbXBvcnRfZXJyb3I7Ci0JfQotCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MoYXVkaW8tPmNsaWVudCwgaGFuZGxlLCAmaW9uZmxhZyk7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIsIF9fZnVuY19fKTsKLQkJZ290byBmbGFnX2Vycm9yOwotCX0KLQlrdmFkZHIgPSAodW5zaWduZWQgbG9uZylpb25fbWFwX2tlcm5lbChhdWRpby0+Y2xpZW50LCBoYW5kbGUpOwotCWlmIChJU19FUlJfT1JfTlVMTCgodm9pZCAqKWt2YWRkcikpIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCB2aXJ0dWFsIGFkZHJlc3NcbiIsIF9fZnVuY19fKTsKLQkJZ290byBtYXBfZXJyb3I7Ci0JfQotCXJjID0gaW9uX3BoeXMoYXVkaW8tPmNsaWVudCwgaGFuZGxlLCAmcGFkZHIsICZsZW4pOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IHBoeXNpY2FsIGFkZHJlc3NcbiIsIF9fZnVuY19fKTsKLQkJZ290byBpb25fZXJyb3I7Ci0JfQotCXJjID0gYXVkcGNtX2lvbl9jaGVjayhhdWRpbywgaW5mby0+dmFkZHIsIGxlbik7Ci0JaWYgKHJjIDwgMCkgewotCQlNTV9FUlIoImF1ZHBjbV9pb25fY2hlY2sgZmFpbGVkXG4iKTsKLQkJZ290byBpb25fZXJyb3I7Ci0JfQotCXJlZ2lvbi0+aGFuZGxlID0gaGFuZGxlOwotCXJlZ2lvbi0+dmFkZHIgPSBpbmZvLT52YWRkcjsKLQlyZWdpb24tPmZkID0gaW5mby0+ZmQ7Ci0JcmVnaW9uLT5wYWRkciA9IHBhZGRyOwotCXJlZ2lvbi0+a3ZhZGRyID0ga3ZhZGRyOwotCXJlZ2lvbi0+bGVuID0gbGVuOwotCXJlZ2lvbi0+cmVmX2NudCA9IDA7Ci0JTU1fREJHKCJbJXBdOmFkZCByZWdpb24gcGFkZHIgJWx4IHZhZGRyICVwLCBsZW4gJWx1IGt2YWRkciAlbHhcbiIsCi0JCWF1ZGlvLCByZWdpb24tPnBhZGRyLCByZWdpb24tPnZhZGRyLAotCQlyZWdpb24tPmxlbiwgcmVnaW9uLT5rdmFkZHIpOwotCWxpc3RfYWRkX3RhaWwoJnJlZ2lvbi0+bGlzdCwgJmF1ZGlvLT5pb25fcmVnaW9uX3F1ZXVlKTsKLQotCXJldHVybiByYzsKLQotaW9uX2Vycm9yOgotCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgaGFuZGxlKTsKLW1hcF9lcnJvcjoKLWZsYWdfZXJyb3I6Ci0JaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgaGFuZGxlKTsKLWltcG9ydF9lcnJvcjoKLQlrZnJlZShyZWdpb24pOwotZW5kOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRwY21faW9uX3JlbW92ZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQkJc3RydWN0IG1zbV9hdWRpb19pb25faW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3QgYXVkcGNtX2lvbl9yZWdpb24gKnJlZ2lvbjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCWludCByYyA9IC1FSU5WQUw7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUpIHsKLQkJcmVnaW9uID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhdWRwY21faW9uX3JlZ2lvbiwgbGlzdCk7Ci0KLQkJaWYgKHJlZ2lvbiAhPSBOVUxMICYmIChyZWdpb24tPmZkID09IGluZm8tPmZkKSAmJgotCQkgICAgKHJlZ2lvbi0+dmFkZHIgPT0gaW5mby0+dmFkZHIpKSB7Ci0JCQlpZiAocmVnaW9uLT5yZWZfY250KSB7Ci0JCQkJTU1fREJHKCIlc1slcF06cmVnaW9uICVwIGluIHVzZSByZWZfY250ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8sIHJlZ2lvbiwKLQkJCQkJcmVnaW9uLT5yZWZfY250KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCU1NX0RCRygicmVtb3ZlIHJlZ2lvbiBmZCAlZCB2YWRkciAlcFxuIiwKLQkJCQlpbmZvLT5mZCwgaW5mby0+dmFkZHIpOwotCQkJbGlzdF9kZWwoJnJlZ2lvbi0+bGlzdCk7Ci0JCQlpb25fdW5tYXBfa2VybmVsKGF1ZGlvLT5jbGllbnQsIHJlZ2lvbi0+aGFuZGxlKTsKLQkJCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIHJlZ2lvbi0+aGFuZGxlKTsKLQkJCWtmcmVlKHJlZ2lvbik7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRwY21faW9uX2xvb2t1cF92YWRkcihzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB2b2lkICphZGRyLAotCQkJdW5zaWduZWQgbG9uZyBsZW4sIHN0cnVjdCBhdWRwY21faW9uX3JlZ2lvbiAqKnJlZ2lvbikKLXsKLQlzdHJ1Y3QgYXVkcGNtX2lvbl9yZWdpb24gKnJlZ2lvbl9lbHQ7Ci0JaW50IG1hdGNoX2NvdW50ID0gMDsKLQkqcmVnaW9uID0gTlVMTDsKLQotCS8qIHJldHVybnMgcGh5c2ljYWwgYWRkcmVzcyBvciB6ZXJvICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZWdpb25fZWx0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUsIGxpc3QpIHsKLQkJaWYgKGFkZHIgPj0gcmVnaW9uX2VsdC0+dmFkZHIgJiYKLQkJICAgIGFkZHIgPCByZWdpb25fZWx0LT52YWRkciArIHJlZ2lvbl9lbHQtPmxlbiAmJgotCQkgICAgYWRkciArIGxlbiA8PSByZWdpb25fZWx0LT52YWRkciArIHJlZ2lvbl9lbHQtPmxlbikgewotCQkJLyogb2Zmc2V0IHNpbmNlIHdlIGNvdWxkIHBhc3MgdmFkZHIgaW5zaWRlIGEgcmVnaXN0ZXJkCi0JCQkgKiBpb24gYnVmZmVyCi0JCQkgKi8KLQotCQkJbWF0Y2hfY291bnQrKzsKLQkJCWlmICghKnJlZ2lvbikKLQkJCQkqcmVnaW9uID0gcmVnaW9uX2VsdDsKLQkJfQotCX0KLQotCWlmIChtYXRjaF9jb3VudCA+IDEpIHsKLQkJTU1fRVJSKCIlc1slcF06bXVsdGlwbGUgaGl0cyBmb3IgdmFkZHIgJXAsIGxlbiAlbGRcbiIsCi0JCQkgX19mdW5jX18sIGF1ZGlvLCBhZGRyLCBsZW4pOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZ2lvbl9lbHQsICZhdWRpby0+aW9uX3JlZ2lvbl9xdWV1ZSwKLQkJCQkJbGlzdCkgewotCQkJaWYgKGFkZHIgPj0gcmVnaW9uX2VsdC0+dmFkZHIgJiYKLQkJCSAgICBhZGRyIDwgcmVnaW9uX2VsdC0+dmFkZHIgKyByZWdpb25fZWx0LT5sZW4gJiYKLQkJCSAgICBhZGRyICsgbGVuIDw9IHJlZ2lvbl9lbHQtPnZhZGRyICsgcmVnaW9uX2VsdC0+bGVuKQotCQkJCQlNTV9FUlIoIlx0JXNbJXBdOiVwLCAlbGQgLS0+ICVwXG4iLAotCQkJCQkJX19mdW5jX18sIGF1ZGlvLAotCQkJCQkJcmVnaW9uX2VsdC0+dmFkZHIsCi0JCQkJCQlyZWdpb25fZWx0LT5sZW4sCi0JCQkJCQkodm9pZCAqKXJlZ2lvbl9lbHQtPnBhZGRyKTsKLQkJfQotCX0KLQlyZXR1cm4gKnJlZ2lvbiA/IDAgOiAtMTsKLX0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGF1ZHBjbV9pb25fZml4dXAoc3RydWN0IGF1ZGlvICphdWRpbywgdm9pZCAqYWRkciwKLQkJICAgIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgcmVmX3VwKQotewotCXN0cnVjdCBhdWRwY21faW9uX3JlZ2lvbiAqcmVnaW9uOwotCXVuc2lnbmVkIGxvbmcgcGFkZHI7Ci0JaW50IHJldDsKLQotCXJldCA9IGF1ZHBjbV9pb25fbG9va3VwX3ZhZGRyKGF1ZGlvLCBhZGRyLCBsZW4sICZyZWdpb24pOwotCWlmIChyZXQpIHsKLQkJTU1fRVJSKCIlc1slcF06bG9va3VwICglcCwgJWxkKSBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXywgYXVkaW8sIGFkZHIsIGxlbik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAocmVmX3VwKQotCQlyZWdpb24tPnJlZl9jbnQrKzsKLQllbHNlCi0JCXJlZ2lvbi0+cmVmX2NudC0tOwotCU1NX0RCRygiZm91bmQgcmVnaW9uICVwIHJlZl9jbnQgJWRcbiIsIHJlZ2lvbiwgcmVnaW9uLT5yZWZfY250KTsKLQlwYWRkciA9IHJlZ2lvbi0+cGFkZHIgKyAoYWRkciAtIHJlZ2lvbi0+dmFkZHIpOwotCXJldHVybiBwYWRkcjsKLX0KLQotLyogYXVkaW8gLT4gbG9jayBtdXN0IGJlIGhlbGQgYXQgdGhpcyBwb2ludCAqLwotc3RhdGljIGludCBhdWRwY21fYWlvX2J1Zl9hZGQoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgZGlyLAotCXZvaWQgX191c2VyICphcmcpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYXVkcGNtX2J1ZmZlcl9ub2RlICpidWZfbm9kZTsKLQotCWJ1Zl9ub2RlID0ga21hbGxvYyhzaXplb2YoKmJ1Zl9ub2RlKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWJ1Zl9ub2RlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmX25vZGUtPmJ1ZiwgYXJnLCBzaXplb2YoYnVmX25vZGUtPmJ1ZikpKSB7Ci0JCWtmcmVlKGJ1Zl9ub2RlKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JTU1fREJHKCJub2RlICVwIGRpciAleCBidWZfYWRkciAlcCBidWZfbGVuICVkIGRhdGFfbGVuICVkXG4iLAotCQkJYnVmX25vZGUsIGRpciwgYnVmX25vZGUtPmJ1Zi5idWZfYWRkciwKLQkJCWJ1Zl9ub2RlLT5idWYuYnVmX2xlbiwgYnVmX25vZGUtPmJ1Zi5kYXRhX2xlbik7Ci0KLQlidWZfbm9kZS0+cGFkZHIgPSBhdWRwY21faW9uX2ZpeHVwKAotCQlhdWRpbywgYnVmX25vZGUtPmJ1Zi5idWZfYWRkciwKLQkJYnVmX25vZGUtPmJ1Zi5idWZfbGVuLCAxKTsKLQlpZiAoZGlyKSB7Ci0JCS8qIHdyaXRlICovCi0JCWlmICghYnVmX25vZGUtPnBhZGRyIHx8Ci0JCSAgICAoYnVmX25vZGUtPnBhZGRyICYgMHgxKSB8fAotCQkgICAgKGJ1Zl9ub2RlLT5idWYuZGF0YV9sZW4gJiAweDEpIHx8Ci0JCSAgICAoIWJ1Zl9ub2RlLT5idWYuZGF0YV9sZW4pKSB7Ci0JCQlrZnJlZShidWZfbm9kZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmYXVkaW8tPm91dF9xdWV1ZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+ZHJ2X29wcy5zZW5kX2RhdGEoYXVkaW8sIDApOwotCX0KLQotCU1NX0RCRygiQWRkIGJ1Zl9ub2RlICVwIHBhZGRyICVseFxuIiwgYnVmX25vZGUsIGJ1Zl9ub2RlLT5wYWRkcik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgYXVkaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiY21kID0gJWRcbiIsIGNtZCk7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCQlzdGF0cy5ieXRlX2NvdW50ID0gYXVkcHBfYXZzeW5jX2J5dGVfY291bnQoYXVkaW8tPmRlY19pZCk7Ci0JCXN0YXRzLnNhbXBsZV9jb3VudCA9IGF1ZHBwX2F2c3luY19zYW1wbGVfY291bnQoYXVkaW8tPmRlY19pZCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoY21kID09IEFVRElPX1NFVF9WT0xVTUUpIHsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+dm9sdW1lID0gYXJnOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9zZXRfdm9sdW1lX2FuZF9wYW4oYXVkaW8tPmRlY19pZCwgYXJnLCAwKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoY21kID09IEFVRElPX0dFVF9FVkVOVCkgewotCQlNTV9EQkcoIkFVRElPX0dFVF9FVkVOVFxuIik7Ci0JCWlmIChtdXRleF90cnlsb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spKSB7Ci0JCQlyYyA9IGF1ZHBjbV9wcm9jZXNzX2V2ZW50X3JlcShhdWRpbywKLQkJCQkodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQkJfSBlbHNlCi0JCQlyYyA9IC1FQlVTWTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmIChjbWQgPT0gQVVESU9fQUJPUlRfR0VUX0VWRU5UKSB7Ci0JCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDoKLQkJTU1fREJHKCJBVURJT19TVEFSVFxuIik7Ci0JCXJjID0gYXVkaW9fZW5hYmxlKGF1ZGlvKTsKLQkJaWYgKCFyYykgewotCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdCwKLQkJCQlhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoTVNNX0FVRF9ERUNPREVSX1dBSVRfTVMpKTsKLQkJCU1NX0lORk8oImRlY19zdGF0ZSAlZCByYyA9ICVkXG4iLCBhdWRpby0+ZGVjX3N0YXRlLCByYyk7Ci0KLQkJCWlmIChhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9TVUNDRVNTKQotCQkJCXJjID0gLUVOT0RFVjsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TVE9QOgotCQlNTV9EQkcoIkFVRElPX1NUT1BcbiIpOwotCQlyYyA9IGF1ZGlvX2Rpc2FibGUoYXVkaW8pOwotCQlhdWRpb19pb3BvcnRfcmVzZXQoYXVkaW8pOwotCQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fRkxVU0g6Ci0JCU1NX0RCRygiQVVESU9fRkxVU0hcbiIpOwotCQlhdWRpby0+d2ZsdXNoID0gMTsKLQkJYXVkaW9faW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCQlhdWRwcF9mbHVzaChhdWRpby0+ZGVjX2lkKTsKLQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCSFhdWRpby0+d2ZsdXNoKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlNTV9FUlIoIkFVRElPX0ZMVVNIIGludGVycnVwdGVkXG4iKTsKLQkJCQlyYyA9IC1FSU5UUjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb25maWcsICh2b2lkICopIGFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29uZmlnLmNoYW5uZWxfY291bnQgPT0gMSkgewotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSBBVURQUF9DTURfUENNX0lOVEZfTU9OT19WOwotCQl9IGVsc2UgaWYgKGNvbmZpZy5jaGFubmVsX2NvdW50ID09IDIpIHsKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gQVVEUFBfQ01EX1BDTV9JTlRGX1NURVJFT19WOwotCQl9IGVsc2UgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvbmZpZy5iaXRzID09IDgpCi0JCQljb25maWcuYml0cyA9IEFVRFBQX0NNRF9XQVZfUENNX1dJRFRIXzg7Ci0JCWVsc2UgaWYgKGNvbmZpZy5iaXRzID09IDE2KQotCQkJY29uZmlnLmJpdHMgPSBBVURQUF9DTURfV0FWX1BDTV9XSURUSF8xNjsKLQkJZWxzZSBpZiAoY29uZmlnLmJpdHMgPT0gMjQpCi0JCQljb25maWcuYml0cyA9IEFVRFBQX0NNRF9XQVZfUENNX1dJRFRIXzI0OwotCQllbHNlIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWF1ZGlvLT5vdXRfc2FtcGxlX3JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0JCWF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID0gY29uZmlnLmNoYW5uZWxfY291bnQ7Ci0JCWF1ZGlvLT5vdXRfYml0cyA9IGNvbmZpZy5iaXRzOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gKGF1ZGlvLT5vdXRfZG1hX3N6ID4+IDEpOwotCQljb25maWcuYnVmZmVyX2NvdW50ID0gMjsKLQkJY29uZmlnLnNhbXBsZV9yYXRlID0gYXVkaW8tPm91dF9zYW1wbGVfcmF0ZTsKLQkJaWYgKGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID09IEFVRFBQX0NNRF9QQ01fSU5URl9NT05PX1YpCi0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JCWVsc2UKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gMjsKLQkJaWYgKGF1ZGlvLT5vdXRfYml0cyA9PSBBVURQUF9DTURfV0FWX1BDTV9XSURUSF84KQotCQkJY29uZmlnLmJpdHMgPSA4OwotCQllbHNlIGlmIChhdWRpby0+b3V0X2JpdHMgPT0gQVVEUFBfQ01EX1dBVl9QQ01fV0lEVEhfMjQpCi0JCQljb25maWcuYml0cyA9IDI0OwotCQllbHNlCi0JCQljb25maWcuYml0cyA9IDE2OwotCQljb25maWcudW51c2VkWzBdID0gMDsKLQkJY29uZmlnLnVudXNlZFsxXSA9IDA7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZjb25maWcsIHNpemVvZihjb25maWcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0KLQotCWNhc2UgQVVESU9fUEFVU0U6Ci0JCU1NX0RCRygiQVVESU9fUEFVU0UgJWxkXG4iLCBhcmcpOwotCQlyYyA9IGF1ZHBwX3BhdXNlKGF1ZGlvLT5kZWNfaWQsIChpbnQpIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19SRUdJU1RFUl9JT046IHsKLQkJc3RydWN0IG1zbV9hdWRpb19pb25faW5mbyBpbmZvOwotCQlNTV9FUlIoIkFVRElPX1JFR0lTVEVSX0lPTlxuIik7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sICh2b2lkICopIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQllbHNlCi0JCQkJcmMgPSBhdWRwY21faW9uX2FkZChhdWRpbywgJmluZm8pOwotCQkJYnJlYWs7Ci0JCX0KLQotCWNhc2UgQVVESU9fREVSRUdJU1RFUl9JT046IHsKLQkJc3RydWN0IG1zbV9hdWRpb19pb25faW5mbyBpbmZvOwotCQlNTV9FUlIoIkFVRElPX0RFUkVHSVNURVJfSU9OXG4iKTsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgKHZvaWQgKikgYXJnLCBzaXplb2YoaW5mbykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IGF1ZHBjbV9pb25fcmVtb3ZlKGF1ZGlvLCAmaW5mbyk7Ci0JCQlicmVhazsKLQkJfQotCi0JY2FzZSBBVURJT19BU1lOQ19XUklURToKLQkJaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfRlNZTkMpCi0JCQlyYyA9IC1FQlVTWTsKLQkJZWxzZQotCQkJcmMgPSBhdWRwY21fYWlvX2J1Zl9hZGQoYXVkaW8sIDEsICh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fQVNZTkNfUkVBRDoKLQkJTU1fRVJSKCJBVURJT19BU1lOQ19SRUFEIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQlyYyA9IC1FUEVSTTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotLyogT25seSB1c2VmdWwgaW4gdHVubmVsLW1vZGUgKi8KLWludCBhdWRwY21fYXN5bmNfZnN5bmMoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQotCS8qIEJsb2NraW5nIGNsaWVudCBzZW5kcyBtb3JlIGRhdGEgKi8KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkaW8tPmRydl9zdGF0dXMgfD0gQURSVl9TVEFUVVNfRlNZTkM7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JLyogcGNtIGRtYW1pc3MgbWVzc2FnZSBpcyBzZW50IGNvbnRpbm91c2x5Ci0JICogd2hlbiBkZWNvZGVyIGlzIHN0YXJ2ZWQgc28gbm8gcmFjZQotCSAqIGNvbmRpdGlvbiBjb25jZXJuCi0JICovCi0JYXVkaW8tPnRlb3MgPSAwOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCShhdWRpby0+dGVvcyAmJiBhdWRpby0+b3V0X25lZWRlZCAmJgotCQlsaXN0X2VtcHR5KCZhdWRpby0+b3V0X3F1ZXVlKSkKLQkJfHwgYXVkaW8tPndmbHVzaCB8fCBhdWRpby0+c3RvcHBlZCk7Ci0KLQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkKLQkJcmMgPSAtRUJVU1k7Ci0KLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkaW8tPmRydl9zdGF0dXMgJj0gfkFEUlZfU1RBVFVTX0ZTWU5DOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgYXVkcGNtX3N5bmNfZnN5bmMoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQlpbnQgcmMgPSAwOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoIWF1ZGlvLT5vdXRbMF0udXNlZCAmJgotCQkhYXVkaW8tPm91dFsxXS51c2VkICYmCi0JCWF1ZGlvLT5vdXRfbmVlZGVkKSB8fCBhdWRpby0+d2ZsdXNoKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQllbHNlIGlmIChhdWRpby0+d2ZsdXNoKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGF1ZGlvLT5yZXNlcnZlZCkgewotCQlNTV9EQkcoInNlbmQgcmVzZXJ2ZWQgYnl0ZVxuIik7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJKChjaGFyICopIGZyYW1lLT5kYXRhKVswXSA9IGF1ZGlvLT5yc3ZfYnl0ZTsKLQkJKChjaGFyICopIGZyYW1lLT5kYXRhKVsxXSA9IDA7Ci0JCWZyYW1lLT51c2VkID0gMjsKLQkJYXVkaW8tPmRydl9vcHMuc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCSghYXVkaW8tPm91dFswXS51c2VkICYmCi0JCQkhYXVkaW8tPm91dFsxXS51c2VkICYmCi0JCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gZG9uZTsKLQkJZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQkvKiBwY20gZG1hbWlzcyBtZXNzYWdlIGlzIHNlbnQgY29udGlub3VzbHkKLQkgKiB3aGVuIGRlY29kZXIgaXMgc3RhcnZlZCBzbyBubyByYWNlCi0JICogY29uZGl0aW9uIGNvbmNlcm4KLQkgKi8KLQlhdWRpby0+dGVvcyA9IDA7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJYXVkaW8tPnRlb3MgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAoYXVkaW8tPndmbHVzaCkKLQkJcmMgPSAtRUJVU1k7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgYXVkcGNtX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgYSwgbG9mZl90IGIsIGludCBkYXRhc3luYykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKCFhdWRpby0+cnVubmluZykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gYXVkaW8tPmRydl9vcHMuZnN5bmMoYXVkaW8pOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRpb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0Jc2l6ZV90IHhmZXI7Ci0JY2hhciAqY3B5X3B0cjsKLQlpbnQgcmMgPSAwOwotCXVuc2lnbmVkIGRzaXplOwotCi0JaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfQUlPX0lOVEYpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlNTV9EQkcoImNudD0lZFxuIiwgY291bnQpOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF9oZWFkOwotCQljcHlfcHRyID0gZnJhbWUtPmRhdGE7Ci0JCWRzaXplID0gMDsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJCSAgICAgIChmcmFtZS0+dXNlZCA9PSAwKQotCQkJCQkgICAgICB8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCQkJCQkgIHx8IChhdWRpby0+d2ZsdXNoKSk7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQkJaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoYXVkaW8tPnJlc2VydmVkKSB7Ci0JCQlNTV9EQkcoImFwcGVuZCByZXNlcnZlZCBieXRlICV4XG4iLCBhdWRpby0+cnN2X2J5dGUpOwotCQkJKmNweV9wdHIgPSBhdWRpby0+cnN2X2J5dGU7Ci0JCQl4ZmVyID0gKGNvdW50ID4gKGZyYW1lLT5zaXplIC0gMSkpID8KLQkJCQlmcmFtZS0+c2l6ZSAtIDEgOiBjb3VudDsKLQkJCWNweV9wdHIrKzsKLQkJCWRzaXplID0gMTsKLQkJCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JCX0gZWxzZQotCQkJeGZlciA9IChjb3VudCA+IGZyYW1lLT5zaXplKSA/IGZyYW1lLT5zaXplIDogY291bnQ7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNweV9wdHIsIGJ1ZiwgeGZlcikpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZHNpemUgKz0geGZlcjsKLQkJaWYgKGRzaXplICYgMSkgewotCQkJYXVkaW8tPnJzdl9ieXRlID0gKChjaGFyICopIGZyYW1lLT5kYXRhKVtkc2l6ZSAtIDFdOwotCQkJTU1fREJHKCJvZGQgbGVuZ3RoIGJ1ZiByZXNlcnZlIGxhc3QgYnl0ZSAleFxuIiwKLQkJCQkJYXVkaW8tPnJzdl9ieXRlKTsKLQkJCWF1ZGlvLT5yZXNlcnZlZCA9IDE7Ci0JCQlkc2l6ZS0tOwotCQl9Ci0JCWNvdW50IC09IHhmZXI7Ci0JCWJ1ZiArPSB4ZmVyOwotCi0JCWlmIChkc2l6ZSA+IDApIHsKLQkJCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCQkJZnJhbWUtPnVzZWQgPSBkc2l6ZTsKLQkJCWF1ZGlvLT5kcnZfb3BzLnNlbmRfZGF0YShhdWRpbywgMCk7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JaWYgKGJ1ZiA+IHN0YXJ0KQotCQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBjbV9yZXNldF9pb25fcmVnaW9uKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBjbV9pb25fcmVnaW9uICpyZWdpb247Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhdWRpby0+aW9uX3JlZ2lvbl9xdWV1ZSkgewotCQlyZWdpb24gPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGF1ZHBjbV9pb25fcmVnaW9uLCBsaXN0KTsKLQkJbGlzdF9kZWwoJnJlZ2lvbi0+bGlzdCk7Ci0JCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgcmVnaW9uLT5oYW5kbGUpOwotCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCByZWdpb24tPmhhbmRsZSk7Ci0JCWtmcmVlKHJlZ2lvbik7Ci0JfQotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCU1NX0RCRygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGZyZWVpbmdcbiIsIChpbnQpYXVkaW8pOwotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRpb19kaXNhYmxlKGF1ZGlvKTsKLQlpZiAoYXVkaW8tPnJtdF9yZXNvdXJjZV9yZWxlYXNlZCA9PSAwKQotCQlybXRfcHV0X3Jlc291cmNlKGF1ZGlvKTsKLQlhdWRpby0+ZHJ2X29wcy5vdXRfZmx1c2goYXVkaW8pOwotCWF1ZHBjbV9yZXNldF9pb25fcmVnaW9uKGF1ZGlvKTsKLQotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci0JYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0JdW5yZWdpc3Rlcl9lYXJseV9zdXNwZW5kKCZhdWRpby0+c3VzcGVuZF9jdGwubm9kZSk7Ci0jZW5kaWYKLQlhdWRpby0+b3BlbmVkID0gMDsKLQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAxOwotCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQlhdWRwY21fcmVzZXRfZXZlbnRfcXVldWUoYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCWlmIChhdWRpby0+ZGVudHJ5KQotCQlkZWJ1Z2ZzX3JlbW92ZShhdWRpby0+ZGVudHJ5KTsKLSNlbmRpZgotCWlvbl9jbGllbnRfZGVzdHJveShhdWRpby0+Y2xpZW50KTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBjbV9wb3N0X2V2ZW50KHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCB0eXBlLAotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQpCi17Ci0Jc3RydWN0IGF1ZHBjbV9ldmVudCAqZV9ub2RlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSkgewotCQllX25vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCXN0cnVjdCBhdWRwY21fZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZV9ub2RlLT5saXN0KTsKLQl9IGVsc2UgewotCQllX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkcGNtX2V2ZW50KSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghZV9ub2RlKSB7Ci0JCQlNTV9FUlIoIk5vIG1lbSB0byBwb3N0IGV2ZW50ICVkXG4iLCB0eXBlKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQllX25vZGUtPmV2ZW50X3R5cGUgPSB0eXBlOwotCWVfbm9kZS0+cGF5bG9hZCA9IHBheWxvYWQ7Ci0KLQlsaXN0X2FkZF90YWlsKCZlX25vZGUtPmxpc3QsICZhdWRpby0+ZXZlbnRfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotfQotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0YXRpYyB2b2lkIGF1ZHBjbV9zdXNwZW5kKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRwY21fc3VzcGVuZF9jdGwgKmN0bCA9Ci0JCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgYXVkcGNtX3N1c3BlbmRfY3RsLCBub2RlKTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlhdWRwY21fcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9TVVNQRU5ELCBwYXlsb2FkKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGNtX3Jlc3VtZShzdHJ1Y3QgZWFybHlfc3VzcGVuZCAqaCkKLXsKLQlzdHJ1Y3QgYXVkcGNtX3N1c3BlbmRfY3RsICpjdGwgPQotCQljb250YWluZXJfb2YoaCwgc3RydWN0IGF1ZHBjbV9zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkcGNtX3Bvc3RfZXZlbnQoY3RsLT5hdWRpbywgQVVESU9fRVZFTlRfUkVTVU1FLCBwYXlsb2FkKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgc3NpemVfdCBhdWRwY21fZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRwY21fZGVidWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY29uc3QgaW50IGRlYnVnX2J1Zm1heCA9IDQwOTY7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyWzQwOTZdOwotCWludCBuID0gMDsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCW4gPSBzY25wcmludGYoYnVmZmVyLCBkZWJ1Z19idWZtYXgsICJvcGVuZWQgJWRcbiIsIGF1ZGlvLT5vcGVuZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgImVuYWJsZWQgJWRcbiIsIGF1ZGlvLT5lbmFibGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJzdG9wcGVkICVkXG4iLCBhdWRpby0+c3RvcHBlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0X2J1Zl9zeiAlZFxuIiwgYXVkaW8tPm91dFswXS5zaXplKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJ2b2x1bWUgJXggXG4iLCBhdWRpby0+dm9sdW1lKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJzYW1wbGUgcmF0ZSAlZCBcbiIsIGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCSJjaGFubmVsIG1vZGUgJWQgXG4iLCBhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JLyogRm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgb25seSB1c2VmdWwgZm9yIGRlYnVnZ2luZyB3aGVuCi0JICogd2hlbiBwbGF5YmFjayBoYWx0cyB1bmV4cGVjdGVkbHkuIFRodXMsIG5vIG11dHVhbCBleGNsdXNpb24KLQkgKiBlbmZvcmNlZAotCSAqLwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIndmbHVzaCAlZFxuIiwgYXVkaW8tPndmbHVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicnVubmluZyAlZCBcbiIsIGF1ZGlvLT5ydW5uaW5nKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSJkZWMgc3RhdGUgJWQgXG4iLCBhdWRpby0+ZGVjX3N0YXRlKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfbmVlZGVkICVkIFxuIiwgYXVkaW8tPm91dF9uZWVkZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dF9oZWFkICVkIFxuIiwgYXVkaW8tPm91dF9oZWFkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfdGFpbCAlZCBcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0WzBdLnVzZWQgJWQgXG4iLCBhdWRpby0+b3V0WzBdLnVzZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dFsxXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFsxXS51c2VkKTsKLQlidWZmZXJbbl0gPSAwOwotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCBidWZmZXIsIG4pOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRwY21fZGVidWdfZm9wcyA9IHsKLQkucmVhZCA9IGF1ZHBjbV9kZWJ1Z19yZWFkLAotCS5vcGVuID0gYXVkcGNtX2RlYnVnX29wZW4sCi19OwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gTlVMTDsKLQlpbnQgcmMsIGksIGRlY19hdHRyYiwgZGVjaWQ7Ci0Jc3RydWN0IGF1ZHBjbV9ldmVudCAqZV9ub2RlID0gTlVMTDsKLQl1bnNpZ25lZCBtZW1fc3ogPSBETUFTWl9NQVg7Ci0JdW5zaWduZWQgbG9uZyBpb25mbGFnID0gMDsKLQlpb25fcGh5c19hZGRyX3QgYWRkciA9IDA7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCA9IE5VTEw7Ci0JaW50IGxlbiA9IDA7Ci0KLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCi0JY2hhciBuYW1lW3NpemVvZiAibXNtX3BjbV9kZWNfIiArIDVdOwotI2VuZGlmCi0KLQkvKiBBbGxvY2F0ZSBhdWRpbyBpbnN0YW5jZSwgc2V0IHRvIHplcm8gKi8KLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpbyksIEdGUF9LRVJORUwpOwotCWlmICghYXVkaW8pIHsKLQkJTU1fRVJSKCJubyBtZW1vcnkgdG8gYWxsb2NhdGUgYXVkaW8gaW5zdGFuY2UgXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCU1NX0RCRygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGNyZWF0ZWRcbiIsIChpbnQpYXVkaW8pOwotCi0JLyogQWxsb2NhdGUgdGhlIGRlY29kZXIgKi8KLQlkZWNfYXR0cmIgPSBBVURERUNfREVDX1BDTTsKLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlNTV9FUlIoIk5vbi1UdW5uZWxlZCBtb2RlIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQlyYyA9IC1FUEVSTTsKLQkJa2ZyZWUoYXVkaW8pOwotCQlnb3RvIGRvbmU7Ci0JfSBlbHNlCi0JCWRlY19hdHRyYiB8PSBNU01fQVVEX01PREVfVFVOTkVMOwotCi0JZGVjaWQgPSBhdWRwcF9hZGVjX2FsbG9jKGRlY19hdHRyYiwgJmF1ZGlvLT5tb2R1bGVfbmFtZSwKLQkJCSZhdWRpby0+cXVldWVfaWQpOwotCWlmIChkZWNpZCA8IDApIHsKLQkJTU1fRVJSKCJObyBmcmVlIGRlY29kZXIgYXZhaWxhYmxlXG4iKTsKLQkJcmMgPSAtRU5PREVWOwotCQlNTV9EQkcoImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBmcmVlaW5nXG4iLCAoaW50KWF1ZGlvKTsKLQkJa2ZyZWUoYXVkaW8pOwotCQlnb3RvIGRvbmU7Ci0JfQotCWF1ZGlvLT5kZWNfaWQgPSBkZWNpZCAmIE1TTV9BVURfREVDT0RFUl9NQVNLOwotCi0JY2xpZW50ID0gbXNtX2lvbl9jbGllbnRfY3JlYXRlKFVJTlRfTUFYLCAiQXVkaW9fUENNX0NsaWVudCIpOwotCWlmIChJU19FUlJfT1JfTlVMTChjbGllbnQpKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGNyZWF0ZSBJT04gY2xpZW50XG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGNsaWVudF9jcmVhdGVfZXJyb3I7Ci0JfQotCWF1ZGlvLT5jbGllbnQgPSBjbGllbnQ7Ci0KLQkvKiBOb24gQUlPIGludGVyZmFjZSAqLwotCWlmICghKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkgewotCi0JCU1NX0RCRygibWVtc3ogPSAlZFxuIiwgbWVtX3N6KTsKLQotCQloYW5kbGUgPSBpb25fYWxsb2MoY2xpZW50LCBtZW1fc3osIFNaXzRLLAotCQkJSU9OX0hFQVAoSU9OX0FVRElPX0hFQVBfSUQpLCAwKTsKLQkJaWYgKElTX0VSUl9PUl9OVUxMKGhhbmRsZSkpIHsKLQkJCU1NX0VSUigiVW5hYmxlIHRvIGNyZWF0ZSBhbGxvY2F0ZSBPL1AgYnVmZmVyc1xuIik7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dHB1dF9idWZmX2FsbG9jX2Vycm9yOwotCQl9Ci0JCWF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUgPSBoYW5kbGU7Ci0KLQkJcmMgPSBpb25fcGh5cyhjbGllbnQgLCBoYW5kbGUsICZhZGRyLCAmbGVuKTsKLQkJaWYgKHJjKSB7Ci0JCQlNTV9FUlIoIk8vUCBidWZmZXJzOkludmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkJKHVuc2lnbmVkIGludCkgYWRkciwgKHVuc2lnbmVkIGludCkgbGVuKTsKLQkJCWdvdG8gb3V0cHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9JTkZPKCJPL1AgYnVmZmVyczp2YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCQl9Ci0JCWF1ZGlvLT5waHlzID0gKGludDMyX3QpYWRkcjsKLQotCi0JCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MoY2xpZW50LCBoYW5kbGUsICZpb25mbGFnKTsKLQkJaWYgKHJjKSB7Ci0JCQlNTV9FUlIoImNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIpOwotCQkJZ290byBvdXRwdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I7Ci0JCX0KLQotCQlhdWRpby0+bWFwX3Zfd3JpdGUgPSBpb25fbWFwX2tlcm5lbChjbGllbnQsIGhhbmRsZSk7Ci0JCWlmIChJU19FUlIoYXVkaW8tPm1hcF92X3dyaXRlKSkgewotCQkJTU1fRVJSKCJjb3VsZCBub3QgbWFwIHdyaXRlIGJ1ZmZlcnNcbiIpOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBvdXRwdXRfYnVmZl9tYXBfZXJyb3I7Ci0JCX0KLQkJYXVkaW8tPmRhdGEgPSBhdWRpby0+bWFwX3Zfd3JpdGU7Ci0JCU1NX0RCRygid3JpdGUgYnVmOiBwaHkgYWRkciAweCUwOHgga2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQkJYXVkaW8tPnBoeXMsIChpbnQpYXVkaW8tPmRhdGEpOwotCi0JCWF1ZGlvLT5vdXRfZG1hX3N6ID0gbWVtX3N6OwotCX0KLQotCXJjID0gYXVkbWdyX29wZW4oJmF1ZGlvLT5hdWRtZ3IpOwotCWlmIChyYykKLQkJZ290byBlcnI7Ci0KLQlyYyA9IG1zbV9hZHNwX2dldChhdWRpby0+bW9kdWxlX25hbWUsICZhdWRpby0+YXVkcGxheSwKLQkJCSZhdWRwY21kZWNfYWRzcF9vcHMsIGF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJmYWlsZWQgdG8gZ2V0ICVzIG1vZHVsZVxuIiwgYXVkaW8tPm1vZHVsZV9uYW1lKTsKLQkJYXVkbWdyX2Nsb3NlKCZhdWRpby0+YXVkbWdyKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmMgPSBybXRfZ2V0X3Jlc291cmNlKGF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJBRFNQIHJlc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgUENNIHNlc3Npb24gXAotCQkJIDB4JTA4eCBvbiBkZWNvZGVyOiAlZFxuIiwgKGludClhdWRpbywgYXVkaW8tPmRlY19pZCk7Ci0JCWF1ZG1ncl9jbG9zZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQlNTV9EQkcoInNldCB0byBhaW8gaW50ZXJmYWNlXG4iKTsKLQkJYXVkaW8tPmRydl9zdGF0dXMgfD0gQURSVl9TVEFUVVNfQUlPX0lOVEY7Ci0JCWF1ZGlvLT5kcnZfb3BzLnNlbmRfZGF0YSA9IGF1ZHBjbV9hc3luY19zZW5kX2RhdGE7Ci0JCWF1ZGlvLT5kcnZfb3BzLm91dF9mbHVzaCA9IGF1ZHBjbV9hc3luY19mbHVzaDsKLQkJYXVkaW8tPmRydl9vcHMuZnN5bmMgPSBhdWRwY21fYXN5bmNfZnN5bmM7Ci0JfSBlbHNlIHsKLQkJTU1fREJHKCJzZXQgdG8gc3RkIGlvIGludGVyZmFjZVxuIik7Ci0JCWF1ZGlvLT5kcnZfb3BzLnNlbmRfZGF0YSA9IGF1ZHBsYXlfc2VuZF9kYXRhOwotCQlhdWRpby0+ZHJ2X29wcy5vdXRfZmx1c2ggPSBhdWRpb19mbHVzaDsKLQkJYXVkaW8tPmRydl9vcHMuZnN5bmMgPSBhdWRwY21fc3luY19mc3luYzsKLQkJYXVkaW8tPm91dFswXS5kYXRhID0gYXVkaW8tPmRhdGEgKyAwOwotCQlhdWRpby0+b3V0WzBdLmFkZHIgPSBhdWRpby0+cGh5cyArIDA7Ci0JCWF1ZGlvLT5vdXRbMF0uc2l6ZSA9IChhdWRpby0+b3V0X2RtYV9zeiA+PiAxKTsKLQotCQlhdWRpby0+b3V0WzFdLmRhdGEgPSBhdWRpby0+ZGF0YSArIGF1ZGlvLT5vdXRbMF0uc2l6ZTsKLQkJYXVkaW8tPm91dFsxXS5hZGRyID0gYXVkaW8tPnBoeXMgKyBhdWRpby0+b3V0WzBdLnNpemU7Ci0JCWF1ZGlvLT5vdXRbMV0uc2l6ZSA9IGF1ZGlvLT5vdXRbMF0uc2l6ZTsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIGFsbCBsb2NrcyBvZiBhdWRpbyBpbnN0YW5jZSAqLwotCW11dGV4X2luaXQoJmF1ZGlvLT5sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmRzcF9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5vdXRfcXVldWUpOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+aW9uX3JlZ2lvbl9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jayk7Ci0KLQlhdWRpby0+b3V0X3NhbXBsZV9yYXRlID0gNDQxMDA7Ci0JYXVkaW8tPm91dF9jaGFubmVsX21vZGUgPSBBVURQUF9DTURfUENNX0lOVEZfU1RFUkVPX1Y7Ci0JYXVkaW8tPm91dF9iaXRzID0gQVVEUFBfQ01EX1dBVl9QQ01fV0lEVEhfMTY7Ci0JYXVkaW8tPnZvbHVtZSA9IDB4MjAwMDsKLQlhdWRpby0+ZHJ2X29wcy5vdXRfZmx1c2goYXVkaW8pOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0JYXVkaW8tPm9wZW5lZCA9IDE7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlzbnByaW50ZihuYW1lLCBzaXplb2YgbmFtZSwgIm1zbV9wY21fZGVjXyUwNHgiLCBhdWRpby0+ZGVjX2lkKTsKLQlhdWRpby0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJTlVMTCwgKHZvaWQgKikgYXVkaW8sICZhdWRwY21fZGVidWdfZm9wcyk7Ci0KLQlpZiAoSVNfRVJSKGF1ZGlvLT5kZW50cnkpKQotCQlNTV9EQkcoImRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUubGV2ZWwgPSBFQVJMWV9TVVNQRU5EX0xFVkVMX0RJU0FCTEVfRkI7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUucmVzdW1lID0gYXVkcGNtX3Jlc3VtZTsKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5zdXNwZW5kID0gYXVkcGNtX3N1c3BlbmQ7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLmF1ZGlvID0gYXVkaW87Ci0JcmVnaXN0ZXJfZWFybHlfc3VzcGVuZCgmYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUpOwotI2VuZGlmCi0JZm9yIChpID0gMDsgaSA8IEFVRFBDTV9FVkVOVF9OVU07IGkrKykgewotCQllX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkcGNtX2V2ZW50KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChlX25vZGUpCi0JCQlsaXN0X2FkZF90YWlsKCZlX25vZGUtPmxpc3QsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JCWVsc2UgewotCQkJTU1fRVJSKCJldmVudCBwa3QgYWxsb2MgZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotZG9uZToKLQlyZXR1cm4gcmM7Ci1lcnI6Ci0JaW9uX3VubWFwX2tlcm5lbChjbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotb3V0cHV0X2J1ZmZfbWFwX2Vycm9yOgotb3V0cHV0X2J1ZmZfZ2V0X2ZsYWdzX2Vycm9yOgotb3V0cHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I6Ci0JaW9uX2ZyZWUoY2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLW91dHB1dF9idWZmX2FsbG9jX2Vycm9yOgotCWlvbl9jbGllbnRfZGVzdHJveShjbGllbnQpOwotY2xpZW50X2NyZWF0ZV9lcnJvcjoKLQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0JTU1fREJHKCJhdWRpbyBpbnN0YW5jZSAweCUwOHggZnJlZWluZ1xuIiwgKGludClhdWRpbyk7Ci0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fcGNtX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGF1ZGlvX29wZW4sCi0JLnJlbGVhc2UJPSBhdWRpb19yZWxlYXNlLAotCS53cml0ZQkJPSBhdWRpb193cml0ZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBhdWRpb19pb2N0bCwKLQkuZnN5bmMgPSBhdWRwY21fZnN5bmMsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19wY21fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX3BjbV9kZWMiLAotCS5mb3BzCT0gJmF1ZGlvX3BjbV9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9faW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19wY21fbWlzYyk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhdWRpb19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX3BjbV9pbi5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fcGNtX2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1Nzg3ZmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fcGNtX2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDExICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX3BjbV9pbi5jCi0gKgotICogcGNtIGF1ZGlvIGlucHV0IGRldmljZQotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgYmFzZWQgaW4gcGFydCBvbiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX3BjbV9pbi5jLAotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLQotI2luY2x1ZGUgPG1hY2gvbXNtX21lbXR5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtb3J5X2FsbG9jLmg+Ci0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9ycGNyb3V0ZXIuaD4KLQotI2luY2x1ZGUgImF1ZG1nci5oIgotCi0jaW5jbHVkZSA8bWFjaC9xZHNwNS9hdWRpb19hY2RiX2RlZi5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcmVwcm9jLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHByZXByb2NjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHByZXByb2Ntc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcmVjY21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRyZWNtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLS8qIEZSQU1FX05VTSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvICovCi0jZGVmaW5lIEZSQU1FX05VTQkJKDgpCi0jZGVmaW5lIEZSQU1FX1NJWkUJCSgyMDUyICogMikKLSNkZWZpbmUgTU9OT19EQVRBX1NJWkUJCSgyMDQ4KQotI2RlZmluZSBTVEVSRU9fREFUQV9TSVpFCShNT05PX0RBVEFfU0laRSAqIDIpCi0jZGVmaW5lIERNQVNaCQkJKEZSQU1FX1NJWkUgKiBGUkFNRV9OVU0pCi0jZGVmaW5lIE1TTV9BVURfQlVGRkVSX1VQREFURV9XQUlUX01TIDIwMDAKLQotc3RydWN0IGJ1ZmZlciB7Ci0Jdm9pZCAqZGF0YTsKLQl1aW50MzJfdCBzaXplOwotCXVpbnQzMl90IHJlYWQ7Ci0JdWludDMyX3QgYWRkcjsKLX07Ci0KLXN0cnVjdCBhdWRpb19pbiB7Ci0Jc3RydWN0IGJ1ZmZlciBpbltGUkFNRV9OVU1dOwotCi0Jc3BpbmxvY2tfdCBkc3BfbG9jazsKLQotCWF0b21pY190IGluX2J5dGVzOwotCi0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IG11dGV4IHJlYWRfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCi0Jc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqYXVkcmVjOwotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIHF1ZXVlX2lkczsKLQl1aW50MTZfdCBlbmNfaWQ7IC8qIFNlc3Npb24gSWQgKi8KLQotCS8qIGNvbmZpZ3VyYXRpb24gdG8gdXNlIG9uIG5leHQgZW5hYmxlICovCi0JdWludDMyX3Qgc2FtcF9yYXRlOwotCXVpbnQzMl90IGNoYW5uZWxfbW9kZTsKLQl1aW50MzJfdCBidWZmZXJfc2l6ZTsgLyogMjA0OCBmb3IgbW9ubywgNDA5NiBmb3Igc3RlcmVvICovCi0JdWludDMyX3QgZW5jX3R5cGU7IC8qIDAgZm9yIFBDTSAqLwotCXVpbnQzMl90IG1vZGU7IC8qIFR1bm5lbCBmb3IgUENNICovCi0JdWludDMyX3QgZHNwX2NudDsKLQl1aW50MzJfdCBpbl9oZWFkOyAvKiBuZXh0IGJ1ZmZlciBkc3Agd2lsbCB3cml0ZSAqLwotCXVpbnQzMl90IGluX3RhaWw7IC8qIG5leHQgYnVmZmVyIHJlYWQoKSB3aWxsIHJlYWQgKi8KLQl1aW50MzJfdCBpbl9jb3VudDsgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgYXZhaWxhYmxlIHRvIHJlYWQoKSAqLwotCi0JdW5zaWduZWQgc2hvcnQgc2FtcF9yYXRlX2luZGV4OwotCXVpbnQzMl90IGF1ZHJlY19vYmpfaWR4IDsKLQotCXN0cnVjdCBhdWRtZ3IgYXVkbWdyOwotCi0JLyogZGF0YSBhbGxvY2F0ZWQgZm9yIHZhcmlvdXMgYnVmZmVycyAqLwotCWNoYXIgKmRhdGE7Ci0JZG1hX2FkZHJfdCBwaHlzOwotCi0JaW50IG9wZW5lZDsKLQlpbnQgZW5hYmxlZDsKLQlpbnQgcnVubmluZzsKLQlpbnQgc3RvcHBlZDsgLyogc2V0IHdoZW4gc3RvcHBlZCwgY2xlYXJlZCBvbiBmbHVzaCAqLwotCXN0cnVjdCBhdWRyZWNfc2Vzc2lvbl9pbmZvIHNlc3Npb25faW5mbzsgLyphdWRyZWMgc2Vzc2lvbiBpbmZvKi8KLQotCS8qIGF1ZHByZSBzZXR0aW5ncyAqLwotCWludCB0eF9hZ2NfZW5hYmxlOwotCWF1ZHByZXByb2NfY21kX2NmZ19hZ2NfcGFyYW1zIHR4X2FnY19jZmc7Ci0JaW50IG5zX2VuYWJsZTsKLQlhdWRwcmVwcm9jX2NtZF9jZmdfbnNfcGFyYW1zIG5zX2NmZzsKLQkvKiBGb3IgZGlmZmVyZW50IHNhbXBsZSByYXRlLCB0aGUgY29lZmYgbWlnaHQgYmUgZGlmZmVyZW50LiAqCi0JICogQWxsIHRoZSBjb2VmZiBzaG91bGQgYmUgcGFzc2VkIGZyb20gdXNlciBzcGFjZQkgICAgKi8KLQlpbnQgaWlyX2VuYWJsZTsKLQlhdWRwcmVwcm9jX2NtZF9jZmdfaWlyX3R1bmluZ19maWx0ZXJfcGFyYW1zIGlpcl9jZmc7Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqb3V0cHV0X2J1ZmZfaGFuZGxlOwotfTsKLQotc3RhdGljIGludCBhdWRwY21faW5fZHNwX2VuYWJsZShzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLCBpbnQgZW5hYmxlKTsKLXN0YXRpYyBpbnQgYXVkcGNtX2luX2VuY21lbV9jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbyk7Ci1zdGF0aWMgaW50IGF1ZHBjbV9pbl9lbmNwYXJhbV9jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbyk7Ci1zdGF0aWMgaW50IGF1ZHBjbV9pbl9kc3BfcmVhZF9idWZmZXIoc3RydWN0IGF1ZGlvX2luICphdWRpbywgdWludDMyX3QgcmVhZF9jbnQpOwotc3RhdGljIHZvaWQgYXVkcGNtX2luX2ZsdXNoKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pOwotc3RhdGljIGludCBhdWRpb19kc3Bfc2V0X3R4X2FnYyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLXN0YXRpYyBpbnQgYXVkaW9fZHNwX3NldF9ucyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLXN0YXRpYyBpbnQgYXVkaW9fZHNwX3NldF9paXIoc3RydWN0IGF1ZGlvX2luICphdWRpbyk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBjb252ZXJ0X2RzcF9zYW1wX2luZGV4KHVuc2lnbmVkIGluZGV4KQotewotCXN3aXRjaCAoaW5kZXgpIHsKLQljYXNlIDQ4MDAwOglyZXR1cm4gQVVEUkVDX0NNRF9TQU1QX1JBVEVfSU5EWF80ODAwMDsKLQljYXNlIDQ0MTAwOglyZXR1cm4gQVVEUkVDX0NNRF9TQU1QX1JBVEVfSU5EWF80NDEwMDsKLQljYXNlIDMyMDAwOglyZXR1cm4gQVVEUkVDX0NNRF9TQU1QX1JBVEVfSU5EWF8zMjAwMDsKLQljYXNlIDI0MDAwOglyZXR1cm4gQVVEUkVDX0NNRF9TQU1QX1JBVEVfSU5EWF8yNDAwMDsKLQljYXNlIDIyMDUwOglyZXR1cm4gQVVEUkVDX0NNRF9TQU1QX1JBVEVfSU5EWF8yMjA1MDsKLQljYXNlIDE2MDAwOglyZXR1cm4gQVVEUkVDX0NNRF9TQU1QX1JBVEVfSU5EWF8xNjAwMDsKLQljYXNlIDEyMDAwOglyZXR1cm4gQVVEUkVDX0NNRF9TQU1QX1JBVEVfSU5EWF8xMjAwMDsKLQljYXNlIDExMDI1OglyZXR1cm4gQVVEUkVDX0NNRF9TQU1QX1JBVEVfSU5EWF8xMTAyNTsKLQljYXNlIDgwMDA6CXJldHVybiBBVURSRUNfQ01EX1NBTVBfUkFURV9JTkRYXzgwMDA7Ci0JZGVmYXVsdDoJcmV0dXJuIEFVRFJFQ19DTURfU0FNUF9SQVRFX0lORFhfMTEwMjU7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgY29udmVydF9zYW1wX3JhdGUodW5zaWduZWQgaHopCi17Ci0Jc3dpdGNoIChoeikgewotCWNhc2UgNDgwMDA6IHJldHVybiBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV80ODAwMDsKLQljYXNlIDQ0MTAwOiByZXR1cm4gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfNDQxMDA7Ci0JY2FzZSAzMjAwMDogcmV0dXJuIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzMyMDAwOwotCWNhc2UgMjQwMDA6IHJldHVybiBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8yNDAwMDsKLQljYXNlIDIyMDUwOiByZXR1cm4gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMjIwNTA7Ci0JY2FzZSAxNjAwMDogcmV0dXJuIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzE2MDAwOwotCWNhc2UgMTIwMDA6IHJldHVybiBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xMjAwMDsKLQljYXNlIDExMDI1OiByZXR1cm4gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMTEwMjU7Ci0JY2FzZSA4MDAwOiAgcmV0dXJuIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzgwMDA7Ci0JZGVmYXVsdDogICAgcmV0dXJuIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzExMDI1OwotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGNvbnZlcnRfc2FtcF9pbmRleCh1bnNpZ25lZCBpbmRleCkKLXsKLQlzd2l0Y2ggKGluZGV4KSB7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV80ODAwMDoJcmV0dXJuIDQ4MDAwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfNDQxMDA6CXJldHVybiA0NDEwMDsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzMyMDAwOglyZXR1cm4gMzIwMDA7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8yNDAwMDoJcmV0dXJuIDI0MDAwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMjIwNTA6CXJldHVybiAyMjA1MDsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzE2MDAwOglyZXR1cm4gMTYwMDA7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xMjAwMDoJcmV0dXJuIDEyMDAwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMTEwMjU6CXJldHVybiAxMTAyNTsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzgwMDA6CXJldHVybiA4MDAwOwotCWRlZmF1bHQ6CQkJCXJldHVybiAxMTAyNTsKLQl9Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZHNwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgYXVkcHJlX2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgIHZvaWQgKmV2ZW50X2RhdGEpCi17Ci0KLQl1aW50MTZfdCAqbXNnID0gZXZlbnRfZGF0YTsKLQotCWlmICghbXNnKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQUkVQUk9DX01TR19DTURfQ0ZHX0RPTkVfTVNHOgotCQlNTV9EQkcoInR5cGUgJWQsIHN0YXR1c19mbGFnICVkXG4iLFwKLQkJCW1zZ1swXSwgbXNnWzFdKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURQUkVQUk9DX01TR19FUlJPUl9NU0dfSUQ6Ci0JCU1NX0lORk8oImVycl9pbmRleCAlZFxuIiwgbXNnWzBdKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRFNQX01FU1NBR0VfSUQ6Ci0JCU1NX0RCRygiUmVjZWl2ZWQgQURTUCBldmVudDogbW9kdWxlIGVuYWJsZShhdWRwcmVwcm9jdGFzaylcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlNTV9FUlIoInVua25vd24gZXZlbnQgJWRcbiIsIGlkKTsKLQl9Ci19Ci0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZHBjbV9pbl9lbmFibGUoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkbWdyX2NvbmZpZyBjZmc7Ci0JaW50IHJjOwotCi0JaWYgKGF1ZGlvLT5lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWNmZy50eF9yYXRlID0gYXVkaW8tPnNhbXBfcmF0ZTsKLQljZmcucnhfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFX05PTkU7Ci0JY2ZnLmRlZl9tZXRob2QgPSBSUENfQVVEX0RFRl9NRVRIT0RfUkVDT1JEOwotCWNmZy5jb2RlYyA9IFJQQ19BVURfREVGX0NPREVDX1BDTTsKLQljZmcuc25kX21ldGhvZCA9IFJQQ19TTkRfTUVUSE9EX01JREk7Ci0KLQlyYyA9IGF1ZG1ncl9lbmFibGUoJmF1ZGlvLT5hdWRtZ3IsICZjZmcpOwotCWlmIChyYyA8IDApIHsKLQkJbXNtX2Fkc3BfZHVtcChhdWRpby0+YXVkcmVjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlpZiAoYXVkcHJlcHJvY19lbmFibGUoYXVkaW8tPmVuY19pZCwgJmF1ZHByZV9kc3BfZXZlbnQsIGF1ZGlvKSkgewotCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRwcmVwcm9jKSBmYWlsZWRcbiIpOwotCQlhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChtc21fYWRzcF9lbmFibGUoYXVkaW8tPmF1ZHJlYykpIHsKLQkJYXVkcHJlcHJvY19kaXNhYmxlKGF1ZGlvLT5lbmNfaWQsIGF1ZGlvKTsKLQkJYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRyZWMpIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWF1ZGlvLT5lbmFibGVkID0gMTsKLQlhdWRwY21faW5fZHNwX2VuYWJsZShhdWRpbywgMSk7Ci0KLQkvKnVwZGF0ZSBhdXJlYyBzZXNzaW9uIGluZm8gaW4gYXVkcHJlcHJvYyBsYXllciovCi0JYXVkaW8tPnNlc3Npb25faW5mby5zZXNzaW9uX2lkID0gYXVkaW8tPmVuY19pZDsKLQlhdWRpby0+c2Vzc2lvbl9pbmZvLnNhbXBsaW5nX2ZyZXEgPQotCQkJY29udmVydF9zYW1wX2luZGV4KGF1ZGlvLT5zYW1wX3JhdGUpOwotCWF1ZHByZXByb2NfdXBkYXRlX2F1ZHJlY19pbmZvKCZhdWRpby0+c2Vzc2lvbl9pbmZvKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkcGNtX2luX2Rpc2FibGUoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlpbnQgcmM7Ci0KLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCi0JCWF1ZHBjbV9pbl9kc3BfZW5hYmxlKGF1ZGlvLCAwKTsKLQotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQotCQltc21fYWRzcF9kaXNhYmxlKGF1ZGlvLT5hdWRyZWMpOwotCQlhdWRwcmVwcm9jX2Rpc2FibGUoYXVkaW8tPmVuY19pZCwgYXVkaW8pOwotCQkvKnJlc2V0IHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgaW5mb3JtYXRpb24gYXQgYXVkcHJlcHJvYyBsYXllciovCi0JCWF1ZGlvLT5zZXNzaW9uX2luZm8uc2FtcGxpbmdfZnJlcSA9IDA7Ci0JCWF1ZHByZXByb2NfdXBkYXRlX2F1ZHJlY19pbmZvKCZhdWRpby0+c2Vzc2lvbl9pbmZvKTsKLQkJcmMgPSBhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCWlmIChyYyA8IDApCi0JCQltc21fYWRzcF9kdW1wKGF1ZGlvLT5hdWRyZWMpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IGF1ZGlvX2ZyYW1lIHsKLQl1aW50MTZfdCBjb3VudF9sb3c7Ci0JdWludDE2X3QgY291bnRfaGlnaDsKLQl1aW50MTZfdCBieXRlczsKLQl1aW50MTZfdCB1bmtub3duOwotCXVuc2lnbmVkIGNoYXIgc2FtcGxlc1tdOwotfSBfX3BhY2tlZDsKLQotc3RhdGljIHZvaWQgYXVkcGNtX2luX2dldF9kc3BfZnJhbWVzKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZGlvX2ZyYW1lICpmcmFtZTsKLQl1aW50MzJfdCBpbmRleDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaW5kZXggPSBhdWRpby0+aW5faGVhZDsKLQotCWZyYW1lID0gKHZvaWQgKikgKCgoY2hhciAqKWF1ZGlvLT5pbltpbmRleF0uZGF0YSkgLQotCQkJc2l6ZW9mKCpmcmFtZSkpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdWRpby0+aW5baW5kZXhdLnNpemUgPSBmcmFtZS0+Ynl0ZXM7Ci0KLQlhdWRpby0+aW5faGVhZCA9IChhdWRpby0+aW5faGVhZCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCi0JLyogSWYgb3ZlcmZsb3csIG1vdmUgdGhlIHRhaWwgaW5kZXggZm93YXJkLiAqLwotCWlmIChhdWRpby0+aW5faGVhZCA9PSBhdWRpby0+aW5fdGFpbCkgewotCQlhdWRpby0+aW5fdGFpbCA9IChhdWRpby0+aW5fdGFpbCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCQlNTV9FUlIoIkVycm9yISBub3QgYWJsZSB0byBrZWVwIHVwIHRoZSByZWFkXG4iKTsKLQl9IGVsc2UKLQkJYXVkaW8tPmluX2NvdW50Kys7Ci0KLQlhdWRwY21faW5fZHNwX3JlYWRfYnVmZmVyKGF1ZGlvLCBhdWRpby0+ZHNwX2NudCsrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQotCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcmVjX2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgc2l6ZV90IGxlbiwKLQkJCSAgICB2b2lkICgqZ2V0ZXZlbnQpKHZvaWQgKnB0ciwgc2l6ZV90IGxlbikpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IE5VTEw7Ci0JdWludDE2X3QgbXNnWzNdOwotCi0JaWYgKGRhdGEpCi0JCWF1ZGlvID0gZGF0YTsKLQllbHNlIHsKLQkJTU1fRVJSKCJpbnZhbGlkIGRhdGEgZm9yIGV2ZW50ICV4XG4iLCBpZCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlnZXRldmVudChtc2csIHNpemVvZihtc2cpKTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFJFQ19NU0dfQ01EX0NGR19ET05FX01TRzogewotCQlpZiAobXNnWzBdICYgQVVEUkVDX01TR19DRkdfRE9ORV9FTkNfRU5BKSB7Ci0JCQlhdWRpby0+YXVkcmVjX29ial9pZHggPSBtc2dbMV07Ci0JCQlNTV9JTkZPKCJDRkcgRU5BQkxFRFxuIik7Ci0JCQlhdWRwY21faW5fZW5jbWVtX2NvbmZpZyhhdWRpbyk7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9JTkZPKCJDRkcgU0xFRVBcbiIpOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAwOwotCQkJYXVkaW8tPnR4X2FnY19lbmFibGUgPSAwOwotCQkJYXVkaW8tPm5zX2VuYWJsZSA9IDA7Ci0JCQlhdWRpby0+aWlyX2VuYWJsZSA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX01TR19DTURfQVJFQ19NRU1fQ0ZHX0RPTkVfTVNHOiB7Ci0JCU1NX0RCRygiQVJFQ19NRU1fQ0ZHX0RPTkVfTVNHXG4iKTsKLQkJYXVkcGNtX2luX2VuY3BhcmFtX2NvbmZpZyhhdWRpbyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19NU0dfQ01EX0FSRUNfUEFSQU1fQ0ZHX0RPTkVfTVNHOiB7Ci0JCU1NX0lORk8oIlBBUkFNIENGRyBET05FXG4iKTsKLQkJYXVkaW8tPnJ1bm5pbmcgPSAxOwotCQlpZiAoaXNfYWNkYl9lbmFibGVkKCkpCi0JCQlicmVhazsKLQkJYXVkaW9fZHNwX3NldF90eF9hZ2MoYXVkaW8pOwotCQlhdWRpb19kc3Bfc2V0X25zKGF1ZGlvKTsKLQkJYXVkaW9fZHNwX3NldF9paXIoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfTVNHX05PX0VYVF9QS1RfQVZBSUxBQkxFX01TRzogewotCQlNTV9EQkcoIkVSUk9SICV4XG4iLCBtc2dbMF0pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfTVNHX1BBQ0tFVF9SRUFEWV9NU0c6IHsKLQkJc3RydWN0IGF1ZHJlY19tc2dfcGFja2V0X3JlYWR5X21zZyBwa3RfcmVhZHlfbXNnOwotCi0JCWdldGV2ZW50KCZwa3RfcmVhZHlfbXNnLCBBVURSRUNfTVNHX1BBQ0tFVF9SRUFEWV9NU0dfTEVOKTsKLQkJTU1fREJHKCJVUF9QQUNLRVRfUkVBRFlfTVNHOiB3cml0ZSBjbnQgbXN3ICAlZCBcCi0JCXdyaXRlIGNudCBsc3cgJWQgcmVhZCBjbnQgbXN3ICVkICByZWFkIGNudCBsc3cgJWQgXG4iLFwKLQkJcGt0X3JlYWR5X21zZy5wa3RfY291bnRlcl9tc3csIFwKLQkJcGt0X3JlYWR5X21zZy5wa3RfY291bnRlcl9sc3csIFwKLQkJcGt0X3JlYWR5X21zZy5wa3RfcmVhZF9jbnRfbXN3LCBcCi0JCXBrdF9yZWFkeV9tc2cucGt0X3JlYWRfY250X2xzdyk7Ci0KLQkJYXVkcGNtX2luX2dldF9kc3BfZnJhbWVzKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQURTUF9NRVNTQUdFX0lEOiB7Ci0JCU1NX0RCRygiUmVjZWl2ZWQgQURTUCBldmVudDogbW9kdWxlIFwKLQkJCQllbmFibGUvZGlzYWJsZShhdWRyZWN0YXNrKVxuIik7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlNTV9FUlIoInVua25vd24gZXZlbnQgJWRcbiIsIGlkKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHJlY19hZHNwX29wcyA9IHsKLQkuZXZlbnQgPSBhdWRyZWNfZHNwX2V2ZW50LAotfTsKLQotI2RlZmluZSBhdWRpb19zZW5kX3F1ZXVlX3JlY2JzKGF1ZGlvLCBjbWQsIGxlbikgXAotCW1zbV9hZHNwX3dyaXRlKGF1ZGlvLT5hdWRyZWMsICgoYXVkaW8tPnF1ZXVlX2lkcyAmIDB4RkZGRjAwMDApID4+IDE2KSxcCi0JCQljbWQsIGxlbikKLSNkZWZpbmUgYXVkaW9fc2VuZF9xdWV1ZV9yZWMoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHJlYywgKGF1ZGlvLT5xdWV1ZV9pZHMgJiAweDAwMDBGRkZGKSxcCi0JCQljbWQsIGxlbikKLQotc3RhdGljIGludCBhdWRpb19kc3Bfc2V0X3R4X2FnYyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCWF1ZHByZXByb2NfY21kX2NmZ19hZ2NfcGFyYW1zIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0KLQlhdWRpby0+dHhfYWdjX2NmZy5jbWRfaWQgPSBBVURQUkVQUk9DX0NNRF9DRkdfQUdDX1BBUkFNUzsKLQlpZiAoYXVkaW8tPnR4X2FnY19lbmFibGUpIHsKLQkJLyogY21kLnR4X2FnY19wYXJhbV9tYXNrID0gMHhGRTAwIGZyb20gc2FtcGxlIGNvZGUgKi8KLQkJYXVkaW8tPnR4X2FnY19jZmcudHhfYWdjX3BhcmFtX21hc2sgPQotCQkoMSA8PCBBVURQUkVQUk9DX0NNRF9UWF9BR0NfUEFSQU1fTUFTS19DT01QX1NMT1BFKSB8Ci0JCSgxIDw8IEFVRFBSRVBST0NfQ01EX1RYX0FHQ19QQVJBTV9NQVNLX0NPTVBfVEgpIHwKLQkJKDEgPDwgQVVEUFJFUFJPQ19DTURfVFhfQUdDX1BBUkFNX01BU0tfRVhQX1NMT1BFKSB8Ci0JCSgxIDw8IEFVRFBSRVBST0NfQ01EX1RYX0FHQ19QQVJBTV9NQVNLX0VYUF9USCkgfAotCQkoMSA8PCBBVURQUkVQUk9DX0NNRF9UWF9BR0NfUEFSQU1fTUFTS19DT01QX0FJR19GTEFHKSB8Ci0JCSgxIDw8IEFVRFBSRVBST0NfQ01EX1RYX0FHQ19QQVJBTV9NQVNLX0NPTVBfU1RBVElDX0dBSU4pIHwKLQkJKDEgPDwgQVVEUFJFUFJPQ19DTURfVFhfQUdDX1BBUkFNX01BU0tfVFhfQUdDX0VOQV9GTEFHKTsKLQkJYXVkaW8tPnR4X2FnY19jZmcudHhfYWdjX2VuYWJsZV9mbGFnID0KLQkJCUFVRFBSRVBST0NfQ01EX1RYX0FHQ19FTkFfRkxBR19FTkE7Ci0JCS8qIGNtZC5wYXJhbV9tYXNrID0gMHhGRkYwIGZyb20gc2FtcGxlIGNvZGUgKi8KLQkJYXVkaW8tPnR4X2FnY19jZmcudHhfYWdjX3BhcmFtX21hc2sgPQotCQkJKDEgPDwgQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19STVNfVEFZKSB8Ci0JCQkoMSA8PCBBVURQUkVQUk9DX0NNRF9QQVJBTV9NQVNLX1JFTEVBU0VLKSB8Ci0JCQkoMSA8PCBBVURQUkVQUk9DX0NNRF9QQVJBTV9NQVNLX0RFTEFZKSB8Ci0JCQkoMSA8PCBBVURQUkVQUk9DX0NNRF9QQVJBTV9NQVNLX0FUVEFDS0spIHwKLQkJCSgxIDw8IEFVRFBSRVBST0NfQ01EX1BBUkFNX01BU0tfTEVBS1JBVEVfU0xPVykgfAotCQkJKDEgPDwgQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19MRUFLUkFURV9GQVNUKSB8Ci0JCQkoMSA8PCBBVURQUkVQUk9DX0NNRF9QQVJBTV9NQVNLX0FJR19SRUxFQVNFSykgfAotCQkJKDEgPDwgQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19BSUdfTUlOKSB8Ci0JCQkoMSA8PCBBVURQUkVQUk9DX0NNRF9QQVJBTV9NQVNLX0FJR19NQVgpIHwKLQkJCSgxIDw8IEFVRFBSRVBST0NfQ01EX1BBUkFNX01BU0tfTEVBS19VUCkgfAotCQkJKDEgPDwgQVVEUFJFUFJPQ19DTURfUEFSQU1fTUFTS19MRUFLX0RPV04pIHwKLQkJCSgxIDw8IEFVRFBSRVBST0NfQ01EX1BBUkFNX01BU0tfQUlHX0FUVEFDS0spOwotCX0gZWxzZSB7Ci0JCWF1ZGlvLT50eF9hZ2NfY2ZnLnR4X2FnY19wYXJhbV9tYXNrID0KLQkJCSgxIDw8IEFVRFBSRVBST0NfQ01EX1RYX0FHQ19QQVJBTV9NQVNLX1RYX0FHQ19FTkFfRkxBRyk7Ci0JCWF1ZGlvLT50eF9hZ2NfY2ZnLnR4X2FnY19lbmFibGVfZmxhZyA9Ci0JCQlBVURQUkVQUk9DX0NNRF9UWF9BR0NfRU5BX0ZMQUdfRElTOwotCX0KLQljbWQgPSBhdWRpby0+dHhfYWdjX2NmZzsKLQotCXJldHVybiBhdWRwcmVwcm9jX2RzcF9zZXRfYWdjKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRpb19lbmFibGVfdHhfYWdjKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0JaWYgKGF1ZGlvLT50eF9hZ2NfZW5hYmxlICE9IGVuYWJsZSkgewotCQlhdWRpby0+dHhfYWdjX2VuYWJsZSA9IGVuYWJsZTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkaW9fZHNwX3NldF90eF9hZ2MoYXVkaW8pOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19kc3Bfc2V0X25zKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pCi17Ci0JYXVkcHJlcHJvY19jbWRfY2ZnX25zX3BhcmFtcyBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCi0JYXVkaW8tPm5zX2NmZy5jbWRfaWQgPSBBVURQUkVQUk9DX0NNRF9DRkdfTlNfUEFSQU1TOwotCi0JaWYgKGF1ZGlvLT5uc19lbmFibGUpIHsKLQkJLyogY21kLmVjX21vZGVfbmV3IGlzIGZpeGVkIGFzIDB4MDA2NCB3aGVuIGVuYWJsZQotCQkgKiBmcm9tIHNhbXBsZSBjb2RlICovCi0JCWF1ZGlvLT5uc19jZmcuZWNfbW9kZV9uZXcgPQotCQkJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9ORVdfTlNfRU5BIHwKLQkJCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX0hCX0VOQSB8Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19WQV9FTkE7Ci0JfSBlbHNlIHsKLQkJYXVkaW8tPm5zX2NmZy5lY19tb2RlX25ldyA9Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19OTE1TX0RJUyB8Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19ERVNfRElTIHwKLQkJCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX05TX0RJUyB8Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19DTklfRElTIHwKLQkJCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX05MRVNfRElTIHwKLQkJCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX0hCX0RJUyB8Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19WQV9ESVMgfAotCQkJQVVEUFJFUFJPQ19DTURfRUNfTU9ERV9ORVdfUENEX0RJUyB8Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19GRUhJX0RJUyB8Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19ORUhJX0RJUyB8Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19OTFBQX0RJUyB8Ci0JCQlBVURQUkVQUk9DX0NNRF9FQ19NT0RFX05FV19GTkVfRElTIHwKLQkJCUFVRFBSRVBST0NfQ01EX0VDX01PREVfTkVXX1BSRU5MTVNfRElTOwotCX0KLQljbWQgPSBhdWRpby0+bnNfY2ZnOwotCi0JcmV0dXJuIGF1ZHByZXByb2NfZHNwX3NldF9ucygmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZW5hYmxlX25zKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0JaWYgKGF1ZGlvLT5uc19lbmFibGUgIT0gZW5hYmxlKSB7Ci0JCWF1ZGlvLT5uc19lbmFibGUgPSBlbmFibGU7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZGlvX2RzcF9zZXRfbnMoYXVkaW8pOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19kc3Bfc2V0X2lpcihzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCWF1ZHByZXByb2NfY21kX2NmZ19paXJfdHVuaW5nX2ZpbHRlcl9wYXJhbXMgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWF1ZGlvLT5paXJfY2ZnLmNtZF9pZCA9IEFVRFBSRVBST0NfQ01EX0NGR19JSVJfVFVOSU5HX0ZJTFRFUl9QQVJBTVM7Ci0KLQlpZiAoYXVkaW8tPmlpcl9lbmFibGUpCi0JCS8qIGNtZC5hY3RpdmVfZmxhZyBpcyAweEZGRkYgZnJvbSBzYW1wbGUgY29kZSBidXQgMHgwMDAxIGhlcmUgKi8KLQkJYXVkaW8tPmlpcl9jZmcuYWN0aXZlX2ZsYWcgPSBBVURQUkVQUk9DX0NNRF9JSVJfQUNUSVZFX0ZMQUdfRU5BOwotCWVsc2UKLQkJYXVkaW8tPmlpcl9jZmcuYWN0aXZlX2ZsYWcgPSBBVURQUkVQUk9DX0NNRF9JSVJfQUNUSVZFX0ZMQUdfRElTOwotCi0JY21kID0gYXVkaW8tPmlpcl9jZmc7Ci0KLQlyZXR1cm4gYXVkcHJlcHJvY19kc3Bfc2V0X2lpcigmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZW5hYmxlX2lpcihzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCWlmIChhdWRpby0+aWlyX2VuYWJsZSAhPSBlbmFibGUpIHsKLQkJYXVkaW8tPmlpcl9lbmFibGUgPSBlbmFibGU7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZGlvX2RzcF9zZXRfaWlyKGF1ZGlvKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcGNtX2luX2RzcF9lbmFibGUoc3RydWN0IGF1ZGlvX2luICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9lbmNfY2ZnIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfRU5DX0NGRzsKLQotCWNtZC5hdWRyZWNfZW5jX3R5cGUgPSAoYXVkaW8tPmVuY190eXBlICYgMHhGRikgfAotCShlbmFibGUgPyBBVURSRUNfQ01EX0VOQ19FTkEgOiBBVURSRUNfQ01EX0VOQ19ESVMpOwotCS8qIERvbid0IGNhcmUgKi8KLQljbWQuYXVkcmVjX29ial9pZHggPSBhdWRpby0+YXVkcmVjX29ial9pZHg7Ci0KLQlyZXR1cm4gYXVkaW9fc2VuZF9xdWV1ZV9yZWMoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRwY21faW5fZW5jbWVtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRyZWNfY21kX2FyZWNtZW1fY2ZnIGNtZDsKLQl1aW50MTZfdCBjbnQgPSAwOwotCXVpbnQxNl90ICpkYXRhID0gKHZvaWQgKikgYXVkaW8tPmRhdGE7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCi0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfQVJFQ01FTV9DRkc7Ci0JY21kLmF1ZHJlY19vYmpfaWR4ID0gYXVkaW8tPmF1ZHJlY19vYmpfaWR4OwotCS8qIFJhdGUgYXQgd2hpY2ggcGFja2V0IGNvbXBsZXRlIG1lc3NhZ2UgY29tZXMgKi8KLQljbWQuYXVkcmVjX3VwX3BrdF9pbnRtX2NudCA9IDE7Ci0JY21kLmF1ZHJlY19leHRwa3RfYnVmZmVyX21zdyA9IGF1ZGlvLT5waHlzID4+IDE2OwotCWNtZC5hdWRyZWNfZXh0cGt0X2J1ZmZlcl9sc3cgPSBhdWRpby0+cGh5czsKLQkvKiBNYXggQnVmZmVyIG5vIGF2YWlsYWJsZSBmb3IgZnJhbWVzICovCi0JY21kLmF1ZHJlY19leHRwa3RfYnVmZmVyX251bSA9IEZSQU1FX05VTTsKLQotCS8qIHByZXBhcmUgYnVmZmVyIHBvaW50ZXJzOgotCSAqIE1vbm86IDEwMjQgc2FtcGxlcyArIDQgaGFsZndvcmQgaGVhZGVyCi0JICogU3RlcmVvOiAyMDQ4IHNhbXBsZXMgKyA0IGhhbGZ3b3JkIGhlYWRlcgotCSAqLwotCWZvciAoY250ID0gMDsgY250IDwgRlJBTUVfTlVNOyBjbnQrKykgewotCQlhdWRpby0+aW5bY250XS5kYXRhID0gZGF0YSArIDQ7Ci0JCQlkYXRhICs9ICg0ICsgKGF1ZGlvLT5jaGFubmVsX21vZGUgPyAyMDQ4IDogMTAyNCkpOwotCX0KLQotCXJldHVybiBhdWRpb19zZW5kX3F1ZXVlX3JlYyhhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGF1ZHBjbV9pbl9lbmNwYXJhbV9jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9hcmVjcGFyYW1fd2F2X2NmZyBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jb21tb24uY21kX2lkID0gQVVEUkVDX0NNRF9BUkVDUEFSQU1fQ0ZHOwotCWNtZC5jb21tb24uYXVkcmVjX29ial9pZHggPSBhdWRpby0+YXVkcmVjX29ial9pZHg7Ci0JY21kLnNhbXBfcmF0ZV9pZHggPSBhdWRpby0+c2FtcF9yYXRlX2luZGV4OwotCWNtZC5zdGVyZW9fbW9kZSA9IGF1ZGlvLT5jaGFubmVsX21vZGU7IC8qIDAgZm9yIG1vbm8sIDEgZm9yIHN0ZXJlbyAqLwotCi0JcmV0dXJuIGF1ZGlvX3NlbmRfcXVldWVfcmVjKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcGNtX2luX2RzcF9yZWFkX2J1ZmZlcihzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLCB1aW50MzJfdCByZWFkX2NudCkKLXsKLQlhdWRyZWNfY21kX3BhY2tldF9leHRfcHRyIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfUEFDS0VUX0VYVF9QVFI7Ci0JY21kLnR5cGUgPSBhdWRpby0+YXVkcmVjX29ial9pZHg7Ci0JY21kLmN1cnJfcmVjX2NvdW50X21zdyA9IHJlYWRfY250ID4+IDE2OwotCWNtZC5jdXJyX3JlY19jb3VudF9sc3cgPSByZWFkX2NudDsKLQotCXJldHVybiBhdWRpb19zZW5kX3F1ZXVlX3JlY2JzKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZGV2aWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdm9pZCBhdWRwY21faW5fZmx1c2goc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlpbnQgaTsKLQotCWF1ZGlvLT5kc3BfY250ID0gMDsKLQlhdWRpby0+aW5faGVhZCA9IDA7Ci0JYXVkaW8tPmluX3RhaWwgPSAwOwotCWF1ZGlvLT5pbl9jb3VudCA9IDA7Ci0JZm9yIChpID0gRlJBTUVfTlVNLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCWF1ZGlvLT5pbltpXS5zaXplID0gMDsKLQkJYXVkaW8tPmluW2ldLnJlYWQgPSAwOwotCX0KLX0KLQotc3RhdGljIGxvbmcgYXVkcGNtX2luX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX1NUQVRTKSB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCXN0YXRzLmJ5dGVfY291bnQgPSBhdG9taWNfcmVhZCgmYXVkaW8tPmluX2J5dGVzKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQlyYyA9IGF1ZHBjbV9pbl9lbmFibGUoYXVkaW8pOwotCQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NUT1A6Ci0JCXJjID0gYXVkcGNtX2luX2Rpc2FibGUoYXVkaW8pOwotCQlicmVhazsKLQljYXNlIEFVRElPX0ZMVVNIOgotCQlpZiAoYXVkaW8tPnN0b3BwZWQpIHsKLQkJCS8qIE1ha2Ugc3VyZSB3ZSdyZSBzdG9wcGVkIGFuZCB3ZSB3YWtlIGFueSB0aHJlYWRzCi0JCQkgKiB0aGF0IG1pZ2h0IGJlIGJsb2NrZWQgaG9sZGluZyB0aGUgcmVhZF9sb2NrLgotCQkJICogV2hpbGUgYXVkaW8tPnN0b3BwZWQgcmVhZCB0aHJlYWRzIHdpbGwgYWx3YXlzCi0JCQkgKiBleGl0IGltbWVkaWF0ZWx5LgotCQkJICovCi0JCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQkJCWF1ZHBjbV9pbl9mbHVzaChhdWRpbyk7Ci0JCQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjZmc7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsICh2b2lkICopIGFyZywgc2l6ZW9mKGNmZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY2ZnLmNoYW5uZWxfY291bnQgPT0gMSkgewotCQkJY2ZnLmNoYW5uZWxfY291bnQgPSBBVURSRUNfQ01EX1NURVJFT19NT0RFX01PTk87Ci0JCX0gZWxzZSBpZiAoY2ZnLmNoYW5uZWxfY291bnQgPT0gMikgewotCQkJY2ZnLmNoYW5uZWxfY291bnQgPSBBVURSRUNfQ01EX1NURVJFT19NT0RFX1NURVJFTzsKLQkJfSBlbHNlIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYXVkaW8tPnNhbXBfcmF0ZSA9IGNvbnZlcnRfc2FtcF9yYXRlKGNmZy5zYW1wbGVfcmF0ZSk7Ci0JCWF1ZGlvLT5zYW1wX3JhdGVfaW5kZXggPQotCQkgIGNvbnZlcnRfZHNwX3NhbXBfaW5kZXgoY2ZnLnNhbXBsZV9yYXRlKTsKLQkJYXVkaW8tPmNoYW5uZWxfbW9kZSA9IGNmZy5jaGFubmVsX2NvdW50OwotCQlhdWRpby0+YnVmZmVyX3NpemUgPQotCQkJCWF1ZGlvLT5jaGFubmVsX21vZGUgPyBTVEVSRU9fREFUQV9TSVpFCi0JCQkJCQkJOiBNT05PX0RBVEFfU0laRTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjZmc7Ci0JCWNmZy5idWZmZXJfc2l6ZSA9IGF1ZGlvLT5idWZmZXJfc2l6ZTsKLQkJY2ZnLmJ1ZmZlcl9jb3VudCA9IEZSQU1FX05VTTsKLQkJY2ZnLnNhbXBsZV9yYXRlID0gY29udmVydF9zYW1wX2luZGV4KGF1ZGlvLT5zYW1wX3JhdGUpOwotCQlpZiAoYXVkaW8tPmNoYW5uZWxfbW9kZSA9PSBBVURSRUNfQ01EX1NURVJFT19NT0RFX01PTk8pCi0JCQljZmcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JCWVsc2UKLQkJCWNmZy5jaGFubmVsX2NvdW50ID0gMjsKLQkJY2ZnLnR5cGUgPSAwOwotCQljZmcudW51c2VkWzBdID0gMDsKLQkJY2ZnLnVudXNlZFsxXSA9IDA7Ci0JCWNmZy51bnVzZWRbMl0gPSAwOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmNmZywgc2l6ZW9mKGNmZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZHBjbV9pbl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCWNoYXIgX191c2VyICpidWYsCi0JCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXZvaWQgKmRhdGE7Ci0JdWludDMyX3QgaW5kZXg7Ci0JdWludDMyX3Qgc2l6ZTsKLQlpbnQgcmMgPSAwOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAotCQkJYXVkaW8tPndhaXQsIChhdWRpby0+aW5fY291bnQgPiAwKSB8fCBhdWRpby0+c3RvcHBlZCwKLQkJCW1zZWNzX3RvX2ppZmZpZXMoTVNNX0FVRF9CVUZGRVJfVVBEQVRFX1dBSVRfTVMpKTsKLQkJaWYgKHJjID09IDApIHsKLQkJCXJjID0gLUVUSU1FRE9VVDsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKHJjIDwgMCkgewotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoYXVkaW8tPnN0b3BwZWQgJiYgIWF1ZGlvLT5pbl9jb3VudCkgewotCQkJcmMgPSAwOy8qIEVuZCBvZiBGaWxlICovCi0JCQlicmVhazsKLQkJfQotCi0JCWluZGV4ID0gYXVkaW8tPmluX3RhaWw7Ci0JCWRhdGEgPSAodWludDhfdCAqKSBhdWRpby0+aW5baW5kZXhdLmRhdGE7Ci0JCXNpemUgPSBhdWRpby0+aW5baW5kZXhdLnNpemU7Ci0JCWlmIChjb3VudCA+PSBzaXplKSB7Ci0JCQkvKiBvcmRlciB0aGUgcmVhZHMgb24gdGhlIGJ1ZmZlciAqLwotCQkJZG1hX2NvaGVyZW50X3Bvc3Rfb3BzKCk7Ci0JCQlpZiAoY29weV90b191c2VyKGJ1ZiwgZGF0YSwgc2l6ZSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCQlpZiAoaW5kZXggIT0gYXVkaW8tPmluX3RhaWwpIHsKLQkJCQkvKiBvdmVycnVuIC0tIGRhdGEgaXMgaW52YWxpZCBhbmQgd2UgbmVlZCB0bwotCQkJCSAqIHJldHJ5Ci0JCQkJICovCi0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlhdWRpby0+aW5baW5kZXhdLnNpemUgPSAwOwotCQkJYXVkaW8tPmluX3RhaWwgPSAoYXVkaW8tPmluX3RhaWwgKyAxKSAmIChGUkFNRV9OVU0gLSAxKTsKLQkJCWF1ZGlvLT5pbl9jb3VudC0tOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCQljb3VudCAtPSBzaXplOwotCQkJYnVmICs9IHNpemU7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoInNob3J0IHJlYWRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQotCWlmIChidWYgPiBzdGFydCkKLQkJcmV0dXJuIGJ1ZiAtIHN0YXJ0OwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRwY21faW5fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IGF1ZHBjbV9pbl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkcGNtX2luX2Rpc2FibGUoYXVkaW8pOwotCWF1ZHBjbV9pbl9mbHVzaChhdWRpbyk7Ci0JYXVkcHJlcHJvY19hZW5jX2ZyZWUoYXVkaW8tPmVuY19pZCk7Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRyZWMpOwotCWF1ZGlvLT5hdWRyZWMgPSBOVUxMOwotCWF1ZGlvLT5vcGVuZWQgPSAwOwotCWlmIChhdWRpby0+ZGF0YSkgewotCQlpb25fdW5tYXBfa2VybmVsKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLQkJYXVkaW8tPmRhdGEgPSBOVUxMOwotCX0KLQlpb25fY2xpZW50X2Rlc3Ryb3koYXVkaW8tPmNsaWVudCk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYXVkaW9faW4gdGhlX2F1ZGlvX2luOwotCi1zdGF0aWMgaW50IGF1ZHBjbV9pbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSAmdGhlX2F1ZGlvX2luOwotCWludCByYzsKLQlpbnQgbGVuID0gMDsKLQl1bnNpZ25lZCBsb25nIGlvbmZsYWcgPSAwOwotCWlvbl9waHlzX2FkZHJfdCBhZGRyID0gMDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50ID0gTlVMTDsKLQotCWludCBlbmNpZDsKLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JaWYgKGF1ZGlvLT5vcGVuZWQpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBTZXR0aW5ncyB3aWxsIGJlIHJlLWNvbmZpZyBhdCBBVURJT19TRVRfQ09ORklHLAotCSAqIGJ1dCBhdCBsZWFzdCB3ZSBuZWVkIHRvIGhhdmUgaW5pdGlhbCBjb25maWcKLQkgKi8KLQlhdWRpby0+bW9kZSA9IE1TTV9BVURfRU5DX01PREVfVFVOTkVMOwotCWF1ZGlvLT5zYW1wX3JhdGUgPSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xMTAyNTsKLQlhdWRpby0+c2FtcF9yYXRlX2luZGV4ID0gQVVEUkVDX0NNRF9TQU1QX1JBVEVfSU5EWF8xMTAyNTsKLQlhdWRpby0+Y2hhbm5lbF9tb2RlID0gQVVEUkVDX0NNRF9TVEVSRU9fTU9ERV9NT05POwotCWF1ZGlvLT5idWZmZXJfc2l6ZSA9IE1PTk9fREFUQV9TSVpFOwotCWF1ZGlvLT5lbmNfdHlwZSA9IEFVRFJFQ19DTURfVFlQRV8wX0lOREVYX1dBViB8IGF1ZGlvLT5tb2RlOwotCi0JcmMgPSBhdWRtZ3Jfb3BlbigmYXVkaW8tPmF1ZG1ncik7Ci0JaWYgKHJjKQotCQlnb3RvIGRvbmU7Ci0JZW5jaWQgPSBhdWRwcmVwcm9jX2FlbmNfYWxsb2MoYXVkaW8tPmVuY190eXBlLCAmYXVkaW8tPm1vZHVsZV9uYW1lLAotCQkJJmF1ZGlvLT5xdWV1ZV9pZHMpOwotCWlmIChlbmNpZCA8IDApIHsKLQkJTU1fRVJSKCJObyBmcmVlIGVuY29kZXIgYXZhaWxhYmxlXG4iKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGRvbmU7Ci0JfQotCWF1ZGlvLT5lbmNfaWQgPSBlbmNpZDsKLQotCXJjID0gbXNtX2Fkc3BfZ2V0KGF1ZGlvLT5tb2R1bGVfbmFtZSwgJmF1ZGlvLT5hdWRyZWMsCi0JCQkgICAmYXVkcmVjX2Fkc3Bfb3BzLCBhdWRpbyk7Ci0JaWYgKHJjKSB7Ci0JCWF1ZHByZXByb2NfYWVuY19mcmVlKGF1ZGlvLT5lbmNfaWQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYXVkaW8tPmRzcF9jbnQgPSAwOwotCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQotCWF1ZHBjbV9pbl9mbHVzaChhdWRpbyk7Ci0KLQljbGllbnQgPSBtc21faW9uX2NsaWVudF9jcmVhdGUoVUlOVF9NQVgsICJBdWRpb19QQ01faW5fY2xpZW50Iik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGNsaWVudCkpIHsKLQkJTU1fRVJSKCJVbmFibGUgdG8gY3JlYXRlIElPTiBjbGllbnRcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gY2xpZW50X2NyZWF0ZV9lcnJvcjsKLQl9Ci0JYXVkaW8tPmNsaWVudCA9IGNsaWVudDsKLQotCU1NX0RCRygiYWxsb2NhdGluZyBtZW0gc3ogPSAlZFxuIiwgRE1BU1opOwotCWhhbmRsZSA9IGlvbl9hbGxvYyhjbGllbnQsIERNQVNaLCBTWl80SywKLQkJSU9OX0hFQVAoSU9OX0FVRElPX0hFQVBfSUQpLCAwKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoaGFuZGxlKSkgewotCQlNTV9FUlIoIlVuYWJsZSB0byBjcmVhdGUgYWxsb2NhdGUgTy9QIGJ1ZmZlcnNcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfYWxsb2NfZXJyb3I7Ci0JfQotCi0JYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSA9IGhhbmRsZTsKLQotCXJjID0gaW9uX3BoeXMoY2xpZW50ICwgaGFuZGxlLCAmYWRkciwgJmxlbik7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiTy9QIGJ1ZmZlcnM6SW52YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRwdXRfYnVmZl9nZXRfcGh5c19lcnJvcjsKLQl9IGVsc2UgewotCQlNTV9JTkZPKCJPL1AgYnVmZmVyczp2YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JfQotCWF1ZGlvLT5waHlzID0gKGludDMyX3QpYWRkcjsKLQotCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MoY2xpZW50LCBoYW5kbGUsICZpb25mbGFnKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgZ2V0IGZsYWdzIGZvciB0aGUgaGFuZGxlXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dHB1dF9idWZmX2dldF9mbGFnc19lcnJvcjsKLQl9Ci0KLQlhdWRpby0+ZGF0YSA9IGlvbl9tYXBfa2VybmVsKGNsaWVudCwgaGFuZGxlKTsKLQlpZiAoSVNfRVJSKGF1ZGlvLT5kYXRhKSkgewotCQlNTV9FUlIoImNvdWxkIG5vdCBtYXAgcmVhZCBidWZmZXJzLGZyZWVpbmcgaW5zdGFuY2UgMHglMDh4XG4iLAotCQkJCShpbnQpYXVkaW8pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfbWFwX2Vycm9yOwotCX0KLQlNTV9EQkcoInJlYWQgYnVmOiBwaHkgYWRkciAweCUwOHgga2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQlhdWRpby0+cGh5cywgKGludClhdWRpby0+ZGF0YSk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQlhdWRpby0+b3BlbmVkID0gMTsKLQlyYyA9IDA7Ci1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLW91dHB1dF9idWZmX21hcF9lcnJvcjoKLW91dHB1dF9idWZmX2dldF9waHlzX2Vycm9yOgotb3V0cHV0X2J1ZmZfZ2V0X2ZsYWdzX2Vycm9yOgotCWlvbl9mcmVlKGNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci1vdXRwdXRfYnVmZl9hbGxvY19lcnJvcjoKLQlpb25fY2xpZW50X2Rlc3Ryb3koY2xpZW50KTsKLWNsaWVudF9jcmVhdGVfZXJyb3I6Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRyZWMpOwotCWF1ZHByZXByb2NfYWVuY19mcmVlKGF1ZGlvLT5lbmNfaWQpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgYXVkcHJlX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDAsIGVuYWJsZTsKLQl1aW50MTZfdCBlbmFibGVfbWFzazsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fRU5BQkxFX0FVRFBSRToKLQotCQlpZiAoaXNfYWNkYl9lbmFibGVkKCkpIHsKLQkJCU1NX0lORk8oIkF1ZHBwIGlzIHN1cHBvcnRlZCB2aWEgYWNkYlxuIik7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmVuYWJsZV9tYXNrLCAodm9pZCAqKSBhcmcsCi0JCQkJCQlzaXplb2YoZW5hYmxlX21hc2spKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQllbmFibGUgPSAoZW5hYmxlX21hc2sgJiBBR0NfRU5BQkxFKSA/IDEgOiAwOwotCQlhdWRpb19lbmFibGVfdHhfYWdjKGF1ZGlvLCBlbmFibGUpOwotCQllbmFibGUgPSAoZW5hYmxlX21hc2sgJiBOU19FTkFCTEUpID8gMSA6IDA7Ci0JCWF1ZGlvX2VuYWJsZV9ucyhhdWRpbywgZW5hYmxlKTsKLQkJZW5hYmxlID0gKGVuYWJsZV9tYXNrICYgVFhfSUlSX0VOQUJMRSkgPyAxIDogMDsKLQkJYXVkaW9fZW5hYmxlX2lpcihhdWRpbywgZW5hYmxlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX1NFVF9BR0M6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYXVkaW8tPnR4X2FnY19jZmcsICh2b2lkICopIGFyZywKLQkJCQkJCXNpemVvZihhdWRpby0+dHhfYWdjX2NmZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fU0VUX05TOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmF1ZGlvLT5uc19jZmcsICh2b2lkICopIGFyZywKLQkJCQkJCXNpemVvZihhdWRpby0+bnNfY2ZnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfVFhfSUlSOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmF1ZGlvLT5paXJfY2ZnLCAodm9pZCAqKSBhcmcsCi0JCQkJCQlzaXplb2YoYXVkaW8tPmlpcl9jZmcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZHByZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSAmdGhlX2F1ZGlvX2luOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gYXVkcGNtX2luX29wZW4sCi0JLnJlbGVhc2UJPSBhdWRwY21faW5fcmVsZWFzZSwKLQkucmVhZAkJPSBhdWRwY21faW5fcmVhZCwKLQkud3JpdGUJCT0gYXVkcGNtX2luX3dyaXRlLAotCS51bmxvY2tlZF9pb2N0bAk9IGF1ZHBjbV9pbl9pb2N0bCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRwY21faW5fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX3BjbV9pbiIsCi0JLmZvcHMJPSAmYXVkaW9fZm9wcywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZHByZV9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBhdWRwcmVfb3BlbiwKLQkudW5sb2NrZWRfaW9jdGwJPSBhdWRwcmVfaW9jdGwsCi19OwotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkcHJlX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gIm1zbV9wcmVwcm9jX2N0bCIsCi0JLmZvcHMJPSAmYXVkcHJlX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRwY21faW5faW5pdCh2b2lkKQotewotCi0JbXV0ZXhfaW5pdCgmdGhlX2F1ZGlvX2luLmxvY2spOwotCW11dGV4X2luaXQoJnRoZV9hdWRpb19pbi5yZWFkX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZ0aGVfYXVkaW9faW4uZHNwX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoZV9hdWRpb19pbi53YWl0KTsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkcGNtX2luX21pc2MpIHx8IG1pc2NfcmVnaXN0ZXIoJmF1ZHByZV9taXNjKTsKLX0KLWRldmljZV9pbml0Y2FsbChhdWRwY21faW5faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19xY2VscC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fcWNlbHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiZGU5MS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19xY2VscC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY5OCArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19xY2VscC5jCi0gKgotICogcWNlbHAgMTNrIGF1ZGlvIGRlY29kZXIgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDksIDIwMTEtMjAxMiBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgYmFzZWQgaW4gcGFydCBvbiBhdWRpb19tcDMuYywgd2hpY2ggaXMKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gZmluZCBpdCBhdCBodHRwOi8vd3d3LmZzZi5vcmcuCi0gKgotICovCi0KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZWFybHlzdXNwZW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1vcnlfYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdS5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXVfZG9tYWlucy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcGNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHBtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHAuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcGxheWNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcGxheW1zZy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVybXRjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX21lbXR5cGVzLmg+Ci0KLSNpbmNsdWRlICJhdWRtZ3IuaCIKLQotI2RlZmluZSBCVUZTWiAxMDk0IC8qIFFDRUxQIDEzSyBIb2xkIDYwMG1zIHBhY2tldCBkYXRhID0gMzYgKiAzMCBhbmQKLQkJICAgICAgMTQgYnl0ZXMgb2YgbWV0YSBpbiAqLwotI2RlZmluZSBCVUZfQ09VTlQgMgotI2RlZmluZSBETUFTWiAoQlVGU1ogKiBCVUZfQ09VTlQpCi0KLSNkZWZpbmUgUENNX0JVRlNaX01JTiAxNjI0IC8qIDEwMG1zIHdvcnRoIG9mIGRhdGEgYW5kCi0JCQkgICAgICAyNCBieXRlcyBvZiBtZXRhIG91dCAgKi8KLSNkZWZpbmUgUENNX0JVRl9NQVhfQ09VTlQgNQotCi0jZGVmaW5lIEFVRERFQ19ERUNfUUNFTFAgOQotCi0jZGVmaW5lCVJPVVRJTkdfTU9ERV9GVFJUCTEKLSNkZWZpbmUJUk9VVElOR19NT0RFX1JUCQkyCi0vKiBEZWNvZGVyIHN0YXR1cyByZWNlaXZlZCBmcm9tIEFVRFBQVEFTSyAqLwotI2RlZmluZQlBVURQUF9ERUNfU1RBVFVTX1NMRUVQCTAKLSNkZWZpbmUJQVVEUFBfREVDX1NUQVRVU19JTklUCTEKLSNkZWZpbmUJQVVEUFBfREVDX1NUQVRVU19DRkcJMgotI2RlZmluZQlBVURQUF9ERUNfU1RBVFVTX1BMQVkJMwotCi0jZGVmaW5lIEFVRFFDRUxQX01FVEFGSUVMRF9NQVNLIDB4RkZGRjAwMDAKLSNkZWZpbmUgQVVEUUNFTFBfRU9TX0ZMR19PRkZTRVQgMHgwQSAvKiBPZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgYnVmZmVyICovCi0jZGVmaW5lIEFVRFFDRUxQX0VPU19GTEdfTUFTSyAweDAxCi0jZGVmaW5lIEFVRFFDRUxQX0VPU19OT05FIDB4MCAvKiBObyBFT1MgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgQVVEUUNFTFBfRU9TX1NFVCAweDEgLyogRU9TIHNldCBpbiBtZXRhIGZpZWxkICovCi0KLSNkZWZpbmUgQVVEUUNFTFBfRVZFTlRfTlVNIDEwIC8qIERlZmF1bHQgbnVtYmVyIG9mIHByZS1hbGxvY2F0ZWQgZXZlbnQgcGt0cyAqLwotCi1zdHJ1Y3QgYnVmZmVyIHsKLQl2b2lkICpkYXRhOwotCXVuc2lnbmVkIHNpemU7Ci0JdW5zaWduZWQgdXNlZDsJCS8qIElucHV0IHVzYWdlIGFjdHVhbCBEU1AgcHJvZHVjZWQgUENNIHNpemUgICovCi0JdW5zaWduZWQgYWRkcjsKLQl1bnNpZ25lZCBzaG9ydCBtZmllbGRfc3o7IC8qb25seSB1c2VmdWwgZm9yIGRhdGEgaGFzIG1ldGEgZmllbGQgKi8KLX07Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RydWN0IGF1ZHFjZWxwX3N1c3BlbmRfY3RsIHsKLQlzdHJ1Y3QgZWFybHlfc3VzcGVuZCBub2RlOwotCXN0cnVjdCBhdWRpbyAqYXVkaW87Ci19OwotI2VuZGlmCi0KLXN0cnVjdCBhdWRxY2VscF9ldmVudHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JaW50IGV2ZW50X3R5cGU7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLX07Ci0KLXN0cnVjdCBhdWRpbyB7Ci0Jc3RydWN0IGJ1ZmZlciBvdXRbQlVGX0NPVU5UXTsKLQotCXNwaW5sb2NrX3QgZHNwX2xvY2s7Ci0KLQl1aW50OF90IG91dF9oZWFkOwotCXVpbnQ4X3Qgb3V0X3RhaWw7Ci0JdWludDhfdCBvdXRfbmVlZGVkOwkvKiBudW1iZXIgb2YgYnVmZmVycyB0aGUgZHNwIGlzIHdhaXRpbmcgZm9yICovCi0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggd3JpdGVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3cml0ZV93YWl0OwotCi0JLyogSG9zdCBQQ00gc2VjdGlvbiAtIFNUQVJUICovCi0Jc3RydWN0IGJ1ZmZlciBpbltQQ01fQlVGX01BWF9DT1VOVF07Ci0Jc3RydWN0IG11dGV4IHJlYWRfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkX3dhaXQ7ICAgIC8qIFdhaXQgcXVldWUgZm9yIHJlYWQgKi8KLQljaGFyICpyZWFkX2RhdGE7ICAgICAgICAvKiBwb2ludGVyIHRvIHJlYWRlciBidWZmZXIgKi8KLQlpbnQzMl90IHJlYWRfcGh5czsgICAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHJlYWRlciBidWZmZXIgKi8KLQl1aW50OF90IHJlYWRfbmV4dDsgICAgICAvKiBpbmRleCB0byBpbnB1dCBidWZmZXJzIHRvIGJlIHJlYWQgbmV4dCAqLwotCXVpbnQ4X3QgZmlsbF9uZXh0OyAgICAgIC8qIGluZGV4IHRvIGJ1ZmZlciB0aGF0IERTUCBzaG91bGQgYmUgZmlsbGluZyAqLwotCXVpbnQ4X3QgcGNtX2J1Zl9jb3VudDsgIC8qIG51bWJlciBvZiBwY20gYnVmZmVyIGFsbG9jYXRlZCAqLwotCS8qIEhvc3QgUENNIHNlY3Rpb24gLSBFTkQgKi8KLQotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKmF1ZHBsYXk7Ci0KLQlzdHJ1Y3QgYXVkbWdyIGF1ZG1ncjsKLQotCS8qIGRhdGEgYWxsb2NhdGVkIGZvciB2YXJpb3VzIGJ1ZmZlcnMgKi8KLQljaGFyICpkYXRhOwotCWludDMyX3QgcGh5czsgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB3cml0ZSBidWZmZXIgKi8KLQl2b2lkICptYXBfdl9yZWFkOwotCXZvaWQgKm1hcF92X3dyaXRlOwotCWludCBtZmllbGQ7IC8qIG1ldGEgZmllbGQgZW1iZWRkZWQgaW4gZGF0YSAqLwotCWludCByZmx1c2g7IC8qIFJlYWQgIGZsdXNoICovCi0JaW50IHdmbHVzaDsgLyogV3JpdGUgZmx1c2ggKi8KLQl1aW50OF90IG9wZW5lZDoxOwotCXVpbnQ4X3QgZW5hYmxlZDoxOwotCXVpbnQ4X3QgcnVubmluZzoxOwotCXVpbnQ4X3Qgc3RvcHBlZDoxOwkvKiBzZXQgd2hlbiBzdG9wcGVkLCBjbGVhcmVkIG9uIGZsdXNoICovCi0JdWludDhfdCBwY21fZmVlZGJhY2s6MTsgLyogc2V0IHdoZW4gbm9uLXR1bm5lbCBtb2RlICovCi0JdWludDhfdCBidWZfcmVmcmVzaDoxOwotCWludCB0ZW9zOyAvKiB2YWxpZCBvbmx5IGlmIHR1bm5lbCBtb2RlICYgbm8gZGF0YSBsZWZ0IGZvciBkZWNvZGVyICovCi0JZW51bSBtc21fYXVkX2RlY29kZXJfc3RhdGUgZGVjX3N0YXRlOwkvKiBSZXByZXNlbnRzIGRlY29kZXIgc3RhdGUgKi8KLQlpbnQgcm10X3Jlc291cmNlX3JlbGVhc2VkOwotCi0JY29uc3QgY2hhciAqbW9kdWxlX25hbWU7Ci0JdW5zaWduZWQgcXVldWVfaWQ7Ci0JdWludDE2X3QgZGVjX2lkOwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQlzdHJ1Y3QgYXVkcWNlbHBfc3VzcGVuZF9jdGwgc3VzcGVuZF9jdGw7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLSNlbmRpZgotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfZXZlbnRfcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBldmVudF9xdWV1ZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF93YWl0OwotCXNwaW5sb2NrX3QgZXZlbnRfcXVldWVfbG9jazsKLQlzdHJ1Y3QgbXV0ZXggZ2V0X2V2ZW50X2xvY2s7Ci0JaW50IGV2ZW50X2Fib3J0OwotCi0JaW50IGVxX2VuYWJsZTsKLQlpbnQgZXFfbmVlZHNfY29tbWl0OwotCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19lcWFsaXplciBlcTsKLQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfdm9sdW1lIHZvbF9wYW47Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaW5wdXRfYnVmZl9oYW5kbGU7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKm91dHB1dF9idWZmX2hhbmRsZTsKLX07Ci0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRxY2VscF9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgbmVlZGVkKTsKLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX2NvbmZpZ19ob3N0cGNtKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcWNlbHBfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRxY2VscF9kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpOwotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdGF0aWMgdm9pZCBhdWRxY2VscF9wb3N0X2V2ZW50KHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCB0eXBlLAotCQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkKTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IHJtdF9wdXRfcmVzb3VyY2Uoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkX2NvZGVjX2NvbmZpZ19jbWQgY21kOwotCXVuc2lnbmVkIHNob3J0IGNsaWVudF9pZHg7Ci0KLQljbWQuY21kX2lkID0gUk1fQ01EX0FVRF9DT0RFQ19DRkc7Ci0JY21kLmNsaWVudF9pZCA9IFJNX0FVRF9DTElFTlRfSUQ7Ci0JY21kLnRhc2tfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5lbmFibGUgPSBSTVRfRElTQUJMRTsKLQljbWQuZGVjX3R5cGUgPSBBVURERUNfREVDX1FDRUxQOwotCWNsaWVudF9pZHggPSAoKGNtZC5jbGllbnRfaWQgPDwgOCkgfCBjbWQudGFza19pZCk7Ci0KLQlyZXR1cm4gcHV0X2Fkc3BfcmVzb3VyY2UoY2xpZW50X2lkeCwgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IHJtdF9nZXRfcmVzb3VyY2Uoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkX2NvZGVjX2NvbmZpZ19jbWQgY21kOwotCXVuc2lnbmVkIHNob3J0IGNsaWVudF9pZHg7Ci0KLQljbWQuY21kX2lkID0gUk1fQ01EX0FVRF9DT0RFQ19DRkc7Ci0JY21kLmNsaWVudF9pZCA9IFJNX0FVRF9DTElFTlRfSUQ7Ci0JY21kLnRhc2tfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5lbmFibGUgPSBSTVRfRU5BQkxFOwotCWNtZC5kZWNfdHlwZSA9IEFVRERFQ19ERUNfUUNFTFA7Ci0JY2xpZW50X2lkeCA9ICgoY21kLmNsaWVudF9pZCA8PCA4KSB8IGNtZC50YXNrX2lkKTsKLQotCXJldHVybiBnZXRfYWRzcF9yZXNvdXJjZShjbGllbnRfaWR4LCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRxY2VscF9lbmFibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkbWdyX2NvbmZpZyBjZmc7Ci0JaW50IHJjOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JaWYgKGF1ZGlvLT5ybXRfcmVzb3VyY2VfcmVsZWFzZWQgPT0gMSkgewotCQlhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID0gMDsKLQkJcmMgPSBybXRfZ2V0X3Jlc291cmNlKGF1ZGlvKTsKLQkJaWYgKHJjKSB7Ci0JCQlNTV9FUlIoIkFEU1AgcmVzb3VyY2VzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBRQ0VMUCBcCi0JCQkJc2Vzc2lvbiAweCUwOHggb24gZGVjb2RlcjogJWRcbiBJZ25vcmluZyBcCi0JCQkJZXJyb3IgYW5kIGdvaW5nIGFoZWFkIHdpdGggdGhlIHBsYXliYWNrXG4iLAotCQkJCShpbnQpYXVkaW8sIGF1ZGlvLT5kZWNfaWQpOwotCQl9Ci0JfQotCi0JYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCWF1ZGlvLT5vdXRfdGFpbCA9IDA7Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCi0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spIHsKLQkJY2ZnLnR4X3JhdGUgPSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV9OT05FOwotCQljZmcucnhfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzQ4MDAwOwotCQljZmcuZGVmX21ldGhvZCA9IFJQQ19BVURfREVGX01FVEhPRF9QTEFZQkFDSzsKLQkJY2ZnLmNvZGVjID0gUlBDX0FVRF9ERUZfQ09ERUNfMTNLOwotCQljZmcuc25kX21ldGhvZCA9IFJQQ19TTkRfTUVUSE9EX01JREk7Ci0KLQkJcmMgPSBhdWRtZ3JfZW5hYmxlKCZhdWRpby0+YXVkbWdyLCAmY2ZnKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJbXNtX2Fkc3BfZHVtcChhdWRpby0+YXVkcGxheSk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0KLQlpZiAobXNtX2Fkc3BfZW5hYmxlKGF1ZGlvLT5hdWRwbGF5KSkgewotCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRwbGF5KSBmYWlsZWRcbiIpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykKLQkJCWF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKGF1ZHBwX2VuYWJsZShhdWRpby0+ZGVjX2lkLCBhdWRxY2VscF9kc3BfZXZlbnQsIGF1ZGlvKSkgewotCQlNTV9FUlIoImF1ZHBwX2VuYWJsZSgpIGZhaWxlZFxuIik7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykKLQkJCWF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWF1ZGlvLT5lbmFibGVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZHFjZWxwX2Rpc2FibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JaWYgKGF1ZGlvLT5lbmFibGVkKSB7Ci0JCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCQlhdWRkZWNfZHNwX2NvbmZpZyhhdWRpbywgMCk7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXQsCi0JCQkJYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORSwKLQkJCQltc2Vjc190b19qaWZmaWVzKE1TTV9BVURfREVDT0RFUl9XQUlUX01TKSk7Ci0JCWlmIChyYyA9PSAwKQotCQkJcmMgPSAtRVRJTUVET1VUOwotCQllbHNlIGlmIChhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlhdWRwcF9kaXNhYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spIHsKLQkJCXJjID0gYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQltc21fYWRzcF9kdW1wKGF1ZGlvLT5hdWRwbGF5KTsKLQkJfQotCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCXJtdF9wdXRfcmVzb3VyY2UoYXVkaW8pOwotCQlhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID0gMTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX3VwZGF0ZV9wY21fYnVmX2VudHJ5KHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JdWludDMyX3QgKnBheWxvYWQpCi17Ci0JdWludDhfdCBpbmRleDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGF1ZGlvLT5yZmx1c2gpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwYXlsb2FkWzFdOyBpbmRleCsrKSB7Ci0JCWlmIChhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uYWRkciA9PQotCQkJcGF5bG9hZFsyICsgaW5kZXggKiAyXSkgewotCQkJTU1fREJHKCJpblslZF0gcmVhZHlcbiIsIGF1ZGlvLT5maWxsX25leHQpOwotCQkJYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnVzZWQgPQotCQkJcGF5bG9hZFszICsgaW5kZXggKiAyXTsKLQkJCWlmICgoKythdWRpby0+ZmlsbF9uZXh0KSA9PSBhdWRpby0+cGNtX2J1Zl9jb3VudCkKLQkJCQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiZXhwZWN0ZWQ9JXggcmV0PSV4XG4iLAotCQkJCWF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyLAotCQkJCXBheWxvYWRbMSArIGluZGV4ICogMl0pOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS51c2VkID09IDApIHsKLQkJYXVkcWNlbHBfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCX0gZWxzZSB7Ci0JCU1NX0RCRygicmVhZCBjYW5ub3Qga2VlcCB1cFxuIik7Ci0JCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDE7Ci0JfQotCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwbGF5X2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgc2l6ZV90IGxlbiwKLQkJCSAgICAgIHZvaWQgKCpnZXRldmVudCkgKHZvaWQgKnB0ciwgc2l6ZV90IGxlbikpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGRhdGE7Ci0JdWludDMyX3QgbXNnWzI4XTsKLQlnZXRldmVudChtc2csIHNpemVvZihtc2cpKTsKLQotCU1NX0RCRygibXNnX2lkPSV4XG4iLCBpZCk7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQTEFZX01TR19ERUNfTkVFRFNfREFUQToKLQkJYXVkcWNlbHBfc2VuZF9kYXRhKGF1ZGlvLCAxKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBMQVlfTVNHX0JVRkZFUl9VUERBVEU6Ci0JCWF1ZHFjZWxwX3VwZGF0ZV9wY21fYnVmX2VudHJ5KGF1ZGlvLCBtc2cpOwotCQlicmVhazsKLQotCWNhc2UgQURTUF9NRVNTQUdFX0lEOgotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6IG1vZHVsZSBlbmFibGUoYXVkcGxheXRhc2spXG4iKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlNTV9FUlIoInVuZXhwZWN0ZWQgbWVzc2FnZSBmcm9tIGRlY29kZXIgXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX2RzcF9ldmVudCh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gcHJpdmF0ZTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBQX01TR19TVEFUVVNfTVNHOnsKLQkJCXVuc2lnbmVkIHN0YXR1cyA9IG1zZ1sxXTsKLQotCQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19TTEVFUDogewotCQkJCXVpbnQxNl90IHJlYXNvbiA9IG1zZ1syXTsKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOnNsZWVwIHJlYXNvbiA9IFwKLQkJCQkJCTB4JTA0eFxuIiwgcmVhc29uKTsKLQkJCQlpZiAoKHJlYXNvbiA9PSBBVURQUF9NU0dfUkVBU09OX01FTSkKLQkJCQkJfHwgKHJlYXNvbiA9PQotCQkJCQlBVURQUF9NU0dfUkVBU09OX05PREVDT0RFUikpIHsKLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9GQUlMVVJFOwotCQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJfSBlbHNlIGlmIChyZWFzb24gPT0gQVVEUFBfTVNHX1JFQVNPTl9OT05FKSB7Ci0JCQkJCS8qIGRlY29kZXIgaXMgaW4gZGlzYWJsZSBzdGF0ZSAqLwotCQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19JTklUOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IGluaXQgXG4iKTsKLQkJCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJCQkJYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoYXVkaW8pOwotCQkJCWVsc2UKLQkJCQkJYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhhdWRpbyk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19DRkc6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogY2ZnIFxuIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfUExBWToKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBwbGF5IFxuIik7Ci0JCQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJCQkJYXVkcWNlbHBfY29uZmlnX2hvc3RwY20oYXVkaW8pOwotCQkJCQlhdWRxY2VscF9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JCQkJfQotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfU1VDQ0VTUzsKLQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCU1NX0VSUigidW5rbm93biBkZWNvZGVyIHN0YXR1c1xuIik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVEUFBfTVNHX0NGR19NU0c6Ci0JCWlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9FTkEpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBFTkFCTEVcbiIpOwotCQkJYXVkZGVjX2RzcF9jb25maWcoYXVkaW8sIDEpOwotCQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAxOwotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3Bhbik7Ci0JCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsCWF1ZGlvLT5lcV9lbmFibGUsCi0JCQkJCQkJCSZhdWRpby0+ZXEpOwotCQkJYXVkcHBfYXZzeW5jKGF1ZGlvLT5kZWNfaWQsIDIyMDUwKTsKLQkJfSBlbHNlIGlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9ESVMpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBESVNBQkxFXG4iKTsKLQkJCWF1ZHBwX2F2c3luYyhhdWRpby0+ZGVjX2lkLCAwKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyAlZD9cbiIsIG1zZ1swXSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfUk9VVElOR19BQ0s6Ci0JCU1NX0RCRygiUk9VVElOR19BQ0sgbW9kZT0lZFxuIiwgbXNnWzFdKTsKLQkJYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhhdWRpbyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX0ZMVVNIX0FDSzoKLQkJTU1fREJHKCJGTFVTSF9BQ0tcbiIpOwotCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCQlhdWRxY2VscF9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX1BDTURNQU1JU1NFRDoKLQkJTU1fREJHKCJQQ01ETUFNSVNTRURcbiIpOwotCQlhdWRpby0+dGVvcyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJVTktOT1dOICglZClcbiIsIGlkKTsKLQl9Ci0KLX0KLQotc3RydWN0IG1zbV9hZHNwX29wcyBhdWRwbGF5X2Fkc3Bfb3BzX3FjZWxwID0gewotCS5ldmVudCA9IGF1ZHBsYXlfZHNwX2V2ZW50LAotfTsKLQotI2RlZmluZSBhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCBjbWQsIGxlbikgXAotCW1zbV9hZHNwX3dyaXRlKGF1ZGlvLT5hdWRwbGF5LCBhdWRpby0+cXVldWVfaWQsIFwKLQkJY21kLCBsZW4pCi0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQl1MTYgY2ZnX2RlY19jbWRbQVVEUFBfQ01EX0NGR19ERUNfVFlQRV9MRU4gLyBzaXplb2YodW5zaWduZWQgc2hvcnQpXTsKLQotCW1lbXNldChjZmdfZGVjX2NtZCwgMCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci0KLQljZmdfZGVjX2NtZFswXSA9IEFVRFBQX0NNRF9DRkdfREVDX1RZUEU7Ci0JaWYgKGVuYWJsZSkKLQkJY2ZnX2RlY19jbWRbMSArIGF1ZGlvLT5kZWNfaWRdID0gQVVEUFBfQ01EX1VQREFUREVfQ0ZHX0RFQyB8Ci0JCQlBVURQUF9DTURfRU5BX0RFQ19WIHwgQVVEREVDX0RFQ19RQ0VMUDsKLQllbHNlCi0JCWNmZ19kZWNfY21kWzEgKyBhdWRpby0+ZGVjX2lkXSA9IEFVRFBQX0NNRF9VUERBVERFX0NGR19ERUMgfAotCQkJQVVEUFBfQ01EX0RJU19ERUNfVjsKLQotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMSgmY2ZnX2RlY19jbWQsIHNpemVvZihjZmdfZGVjX2NtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfdjEzayBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jb21tb24uY21kX2lkID0gQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNUzsKLQljbWQuY29tbW9uLmxlbmd0aCA9IEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVNfVjEzS19MRU47Ci0JY21kLmNvbW1vbi5kZWNfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5jb21tb24uaW5wdXRfc2FtcGxpbmdfZnJlcXVlbmN5ID0gODAwMDsKLQljbWQuc3RlcmVvX2NmZyA9IEFVRFBQX0NNRF9QQ01fSU5URl9NT05PX1Y7Ci0KLQlhdWRwcF9zZW5kX3F1ZXVlMigmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9yb3V0aW5nX21vZGUgY21kOwotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUFBfQ01EX1JPVVRJTkdfTU9ERTsKLQljbWQub2JqZWN0X251bWJlciA9IGF1ZGlvLT5kZWNfaWQ7Ci0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfRlRSVDsKLQllbHNlCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfUlQ7Ci0JYXVkcHBfc2VuZF9xdWV1ZTEoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGF1ZHBsYXlfZHNwX3NlbmRfZGF0YV9hdmFpbChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQkJCSAgICAgICB1bnNpZ25lZCBpZHgsIHVuc2lnbmVkIGxlbikKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfYml0c3RyZWFtX2RhdGFfYXZhaWxfbnQyIGNtZDsKLQotCWNtZC5jbWRfaWQgPSBBVURQTEFZX0NNRF9CSVRTVFJFQU1fREFUQV9BVkFJTF9OVDI7Ci0JaWYgKGF1ZGlvLT5tZmllbGQpCi0JCWNtZC5kZWNvZGVyX2lkID0gQVVEUUNFTFBfTUVUQUZJRUxEX01BU0sgfAotCQkJKGF1ZGlvLT5vdXRbaWR4XS5tZmllbGRfc3ogPj4gMSk7Ci0JZWxzZQotCQljbWQuZGVjb2Rlcl9pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmJ1Zl9wdHIgPSBhdWRpby0+b3V0W2lkeF0uYWRkcjsKLQljbWQuYnVmX3NpemUgPSBsZW4gLyAyOwotCWNtZC5wYXJ0aXRpb25fbnVtYmVyID0gMDsKLQkvKiBjb21wbGV0ZSB3cml0ZXMgdG8gdGhlIGlucHV0IGJ1ZmZlciAqLwotCXdtYigpOwotCXJldHVybiBhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX2J1ZmZlcl9yZWZyZXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2J1ZmZlcl9yZWZyZXNoIHJlZnJlc2hfY21kOwotCi0JcmVmcmVzaF9jbWQuY21kX2lkID0gQVVEUExBWV9DTURfQlVGRkVSX1JFRlJFU0g7Ci0JcmVmcmVzaF9jbWQubnVtX2J1ZmZlcnMgPSAxOwotCXJlZnJlc2hfY21kLmJ1ZjBfYWRkcmVzcyA9IGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyOwotCXJlZnJlc2hfY21kLmJ1ZjBfbGVuZ3RoID0gYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnNpemU7Ci0JcmVmcmVzaF9jbWQuYnVmX3JlYWRfY291bnQgPSAwOwotCU1NX0RCRygiYnVmMF9hZGRyPSV4IGJ1ZjBfbGVuPSVkXG4iLCByZWZyZXNoX2NtZC5idWYwX2FkZHJlc3MsCi0JCQlyZWZyZXNoX2NtZC5idWYwX2xlbmd0aCk7Ci0KLQkodm9pZClhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmcmVmcmVzaF9jbWQsIHNpemVvZihyZWZyZXNoX2NtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRxY2VscF9jb25maWdfaG9zdHBjbShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwbGF5X2NtZF9ocGNtX2J1Zl9jZmcgY2ZnX2NtZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JY2ZnX2NtZC5jbWRfaWQgPSBBVURQTEFZX0NNRF9IUENNX0JVRl9DRkc7Ci0JY2ZnX2NtZC5tYXhfYnVmZmVycyA9IDE7Ci0JY2ZnX2NtZC5ieXRlX3N3YXAgPSAwOwotCWNmZ19jbWQuaG9zdHBjbV9jb25maWcgPSAoMHg4MDAwKSB8ICgweDQwMDApOwotCWNmZ19jbWQuZmVlZGJhY2tfZnJlcXVlbmN5ID0gMTsKLQljZmdfY21kLnBhcnRpdGlvbl9udW1iZXIgPSAwOwotCi0JKHZvaWQpYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJmNmZ19jbWQsIHNpemVvZihjZmdfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWF1ZGlvLT5ydW5uaW5nKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAobmVlZGVkICYmICFhdWRpby0+d2ZsdXNoKSB7Ci0JCS8qIFdlIHdlcmUgY2FsbGVkIGZyb20gdGhlIGNhbGxiYWNrIGJlY2F1c2UgdGhlIERTUAotCQkgKiByZXF1ZXN0ZWQgbW9yZSBkYXRhLiAgTm90ZSB0aGF0IHRoZSBEU1AgZG9lcyB3YW50Ci0JCSAqIG1vcmUgZGF0YSwgYW5kIGlmIGEgYnVmZmVyIHdhcyBpbi1mbGlnaHQsIG1hcmsgaXQKLQkJICogYXMgYXZhaWxhYmxlIChzaW5jZSB0aGUgRFNQIG11c3Qgbm93IGJlIGRvbmUgd2l0aAotCQkgKiBpdCkuCi0JCSAqLwotCQlhdWRpby0+b3V0X25lZWRlZCA9IDE7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpIHsKLQkJCU1NX0RCRygiZnJhbWUgJWQgZnJlZVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJCWZyYW1lLT51c2VkID0gMDsKLQkJCWF1ZGlvLT5vdXRfdGFpbCBePSAxOwotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl9Ci0JfQotCi0JaWYgKGF1ZGlvLT5vdXRfbmVlZGVkKSB7Ci0JCS8qIElmIHRoZSBEU1AgY3VycmVudGx5IHdhbnRzIGRhdGEgYW5kIHdlIGhhdmUgYQotCQkgKiBidWZmZXIgYXZhaWxhYmxlLCB3ZSB3aWxsIHNlbmQgaXQgYW5kIHJlc2V0Ci0JCSAqIHRoZSBuZWVkZWQgZmxhZy4gIFdlJ2xsIG1hcmsgdGhlIGJ1ZmZlciBhcyBpbi1mbGlnaHQKLQkJICogc28gdGhhdCBpdCB3b24ndCBiZSByZWN5Y2xlZCB1bnRpbCB0aGUgbmV4dCBidWZmZXIKLQkJICogaXMgcmVxdWVzdGVkCi0JCSAqLwotCi0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkKSB7Ci0JCQlCVUdfT04oZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZik7Ci0JCQlNTV9EQkcoImZyYW1lICVkIGJ1c3lcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JCQlhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoYXVkaW8sIGF1ZGlvLT5vdXRfdGFpbCwKLQkJCQkJCSAgICBmcmFtZS0+dXNlZCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDB4ZmZmZmZmZmY7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCX0KLQl9Ci0gZG9uZToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkZXZpY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX2ZsdXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdWRpby0+b3V0WzBdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRbMV0udXNlZCA9IDA7Ci0JYXVkaW8tPm91dF9oZWFkID0gMDsKLQlhdWRpby0+b3V0X3RhaWwgPSAwOwotCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcWNlbHBfZmx1c2hfcGNtX2J1ZihzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVpbnQ4X3QgaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBQQ01fQlVGX01BWF9DT1VOVDsgaW5kZXgrKykKLQkJYXVkaW8tPmluW2luZGV4XS51c2VkID0gMDsKLQotCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDA7Ci0JYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX2lvcG9ydF9yZXNldChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCS8qIE1ha2Ugc3VyZSByZWFkL3dyaXRlIHRocmVhZCBhcmUgZnJlZSBmcm9tCi0JICogc2xlZXAgYW5kIGtub3dpbmcgdGhhdCBzeXN0ZW0gaXMgbm90IGFibGUKLQkgKiB0byBwcm9jZXNzIGlvIHJlcXVlc3QgYXQgdGhlIG1vbWVudAotCSAqLwotCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JYXVkcWNlbHBfZmx1c2goYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCWF1ZHFjZWxwX2ZsdXNoX3BjbV9idWYoYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcWNlbHBfZXZlbnRzX3BlbmRpbmcoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlbXB0eTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWVtcHR5ID0gIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gZW1wdHkgfHwgYXVkaW8tPmV2ZW50X2Fib3J0OwotfQotCi1zdGF0aWMgdm9pZCBhdWRxY2VscF9yZXNldF9ldmVudF9xdWV1ZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGF1ZHFjZWxwX2V2ZW50ICpkcnZfZXZ0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZHFjZWxwX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkcWNlbHBfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi0KLXN0YXRpYyBsb25nIGF1ZHFjZWxwX3Byb2Nlc3NfZXZlbnRfcmVxKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHZvaWQgX191c2VyICphcmcpCi17Ci0JbG9uZyByYzsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50IHVzcl9ldnQ7Ci0Jc3RydWN0IGF1ZHFjZWxwX2V2ZW50ICpkcnZfZXZ0ID0gTlVMTDsKLQlpbnQgdGltZW91dDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ1c3JfZXZ0LCBhcmcsIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JdGltZW91dCA9IChpbnQpIHVzcl9ldnQudGltZW91dF9tczsKLQotCWlmICh0aW1lb3V0ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAotCQkJYXVkaW8tPmV2ZW50X3dhaXQsIGF1ZHFjZWxwX2V2ZW50c19wZW5kaW5nKGF1ZGlvKSwKLQkJCW1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOwotCQlpZiAocmMgPT0gMCkKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCX0gZWxzZSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAotCQkJYXVkaW8tPmV2ZW50X3dhaXQsIGF1ZHFjZWxwX2V2ZW50c19wZW5kaW5nKGF1ZGlvKSk7Ci0JfQotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGF1ZGlvLT5ldmVudF9hYm9ydCkgewotCQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAwOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyYyA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSkpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkcWNlbHBfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JfQotCi0JaWYgKGRydl9ldnQpIHsKLQkJdXNyX2V2dC5ldmVudF90eXBlID0gZHJ2X2V2dC0+ZXZlbnRfdHlwZTsKLQkJdXNyX2V2dC5ldmVudF9wYXlsb2FkID0gZHJ2X2V2dC0+cGF5bG9hZDsKLQkJbGlzdF9hZGRfdGFpbCgmZHJ2X2V2dC0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQl9IGVsc2UKLQkJcmMgPSAtMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWlmICghcmMgJiYgY29weV90b191c2VyKGFyZywgJnVzcl9ldnQsIHNpemVvZih1c3JfZXZ0KSkpCi0JCXJjID0gLUVGQVVMVDsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19lbmFibGVfZXEoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlpZiAoYXVkaW8tPmVxX2VuYWJsZSA9PSBlbmFibGUgJiYgIWF1ZGlvLT5lcV9uZWVkc19jb21taXQpCi0JCXJldHVybiAwOwotCi0JYXVkaW8tPmVxX2VuYWJsZSA9IGVuYWJsZTsKLQotCWlmIChhdWRpby0+cnVubmluZykgewotCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsIGVuYWJsZSwgJmF1ZGlvLT5lcSk7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgYXVkcWNlbHBfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQl1aW50MTZfdCBlbmFibGVfbWFzazsKLQlpbnQgZW5hYmxlOwotCWludCBwcmV2X3N0YXRlOwotCXVuc2lnbmVkIGxvbmcgaW9uZmxhZyA9IDA7Ci0JaW9uX3BoeXNfYWRkcl90IGFkZHIgPSAwOwotCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUgPSBOVUxMOwotCWludCBsZW4gPSAwOwotCi0JTU1fREJHKCJjbWQgPSAlZFxuIiwgY21kKTsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX1NUQVRTKSB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCXN0YXRzLmJ5dGVfY291bnQgPSBhdWRwcF9hdnN5bmNfYnl0ZV9jb3VudChhdWRpby0+ZGVjX2lkKTsKLQkJc3RhdHMuc2FtcGxlX2NvdW50ID0gYXVkcHBfYXZzeW5jX3NhbXBsZV9jb3VudChhdWRpby0+ZGVjX2lkKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fRU5BQkxFX0FVRFBQOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmVuYWJsZV9tYXNrLCAodm9pZCAqKSBhcmcsCi0JCQkJCQlzaXplb2YoZW5hYmxlX21hc2spKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWVuYWJsZSA9IChlbmFibGVfbWFzayAmIEVRX0VOQUJMRSkgPyAxIDogMDsKLQkJYXVkaW9fZW5hYmxlX2VxKGF1ZGlvLCBlbmFibGUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9WT0xVTUU6Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gYXJnOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX1NFVF9QQU46Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPnZvbF9wYW4ucGFuID0gYXJnOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX1NFVF9FUToKLQkJcHJldl9zdGF0ZSA9IGF1ZGlvLT5lcV9lbmFibGU7Ci0JCWF1ZGlvLT5lcV9lbmFibGUgPSAwOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmF1ZGlvLT5lcS5udW1fYmFuZHMsICh2b2lkICopIGFyZywKLQkJCQlzaXplb2YoYXVkaW8tPmVxKSAtCi0JCQkJKEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNU19DT01NT05fTEVOICsgMikpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlhdWRpby0+ZXFfZW5hYmxlID0gcHJldl9zdGF0ZTsKLQkJYXVkaW8tPmVxX25lZWRzX2NvbW1pdCA9IDE7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKC1FSU5WQUwgIT0gcmMpCi0JCXJldHVybiByYzsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX0VWRU5UKSB7Ci0JCU1NX0RCRygiQVVESU9fR0VUX0VWRU5UXG4iKTsKLQkJaWYgKG11dGV4X3RyeWxvY2soJmF1ZGlvLT5nZXRfZXZlbnRfbG9jaykpIHsKLQkJCXJjID0gYXVkcWNlbHBfcHJvY2Vzc19ldmVudF9yZXEoYXVkaW8sCi0JCQkJCSh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCQl9IGVsc2UKLQkJCXJjID0gLUVCVVNZOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKGNtZCA9PSBBVURJT19BQk9SVF9HRVRfRVZFTlQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCQlNTV9EQkcoIkFVRElPX1NUQVJUXG4iKTsKLQkJcmMgPSBhdWRxY2VscF9lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUsCi0JCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0RFQ09ERVJfV0FJVF9NUykpOwotCQkJTU1fSU5GTygiZGVjX3N0YXRlICVkIHJjID0gJWRcbiIsIGF1ZGlvLT5kZWNfc3RhdGUsIHJjKTsKLQotCQkJaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1MpCi0JCQkJcmMgPSAtRU5PREVWOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NUT1A6Ci0JCU1NX0RCRygiQVVESU9fU1RPUFxuIik7Ci0JCXJjID0gYXVkcWNlbHBfZGlzYWJsZShhdWRpbyk7Ci0JCWF1ZHFjZWxwX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19GTFVTSDoKLQkJTU1fREJHKCJBVURJT19GTFVTSFxuIik7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAxOwotCQlhdWRpby0+d2ZsdXNoID0gMTsKLQkJYXVkcWNlbHBfaW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCQlhdWRwcF9mbHVzaChhdWRpby0+ZGVjX2lkKTsKLQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCSFhdWRpby0+d2ZsdXNoKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlNTV9FUlIoIkFVRElPX0ZMVVNIIGludGVycnVwdGVkXG4iKTsKLQkJCQlyYyA9IC1FSU5UUjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmY29uZmlnLCAodm9pZCAqKWFyZywKLQkJCQlzaXplb2YoY29uZmlnKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlhdWRpby0+bWZpZWxkID0gY29uZmlnLm1ldGFfZmllbGQ7Ci0JCQlNTV9EQkcoIkFVRElPX1NFVF9DT05GSUcgYXBwbGljYWJsZSBcCi0JCQkJZm9yIG1ldGFmaWVsZCBjb25maWd1cmF0aW9uXG4iKTsKLQkJCXJjID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19HRVRfQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IEJVRlNaOwotCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IEJVRl9DT1VOVDsKLQkJCWNvbmZpZy5zYW1wbGVfcmF0ZSA9IDgwMDA7Ci0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JCQljb25maWcubWV0YV9maWVsZCA9IDA7Ci0JCQljb25maWcudW51c2VkWzBdID0gMDsKLQkJCWNvbmZpZy51bnVzZWRbMV0gPSAwOwotCQkJY29uZmlnLnVudXNlZFsyXSA9IDA7Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY29uZmlnLAotCQkJCQkgc2l6ZW9mKGNvbmZpZykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0KLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19HRVRfUENNX0NPTkZJRzp7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX3BjbV9jb25maWcgY29uZmlnOwotCi0JCQljb25maWcucGNtX2ZlZWRiYWNrID0gYXVkaW8tPnBjbV9mZWVkYmFjazsKLQkJCWNvbmZpZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX01BWF9DT1VOVDsKLQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY29uZmlnLAotCQkJCXNpemVvZihjb25maWcpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX1NFVF9QQ01fQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fcGNtX2NvbmZpZyBjb25maWc7Ci0KLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmY29uZmlnLCAodm9pZCAqKWFyZywKLQkJCQlzaXplb2YoY29uZmlnKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY29uZmlnLnBjbV9mZWVkYmFjayAhPSBhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCQkJTU1fRVJSKCJOb3Qgc3VmZmljaWVudCBwZXJtaXNzaW9uIHRvIgotCQkJCQkgImNoYW5nZSB0aGUgcGxheWJhY2sgbW9kZVxuIik7Ci0JCQkJcmMgPSAtRUFDQ0VTOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKChjb25maWcuYnVmZmVyX2NvdW50ID4gUENNX0JVRl9NQVhfQ09VTlQpIHx8Ci0JCQkJKGNvbmZpZy5idWZmZXJfY291bnQgPT0gMSkpCi0JCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfTUFYX0NPVU5UOwotCi0JCQlpZiAoY29uZmlnLmJ1ZmZlcl9zaXplIDwgUENNX0JVRlNaX01JTikKLQkJCQljb25maWcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCi0JCQkvKiBDaGVjayBpZiBwY20gZmVlZGJhY2sgaXMgcmVxdWlyZWQgKi8KLQkJCWlmICgoY29uZmlnLnBjbV9mZWVkYmFjaykgJiYgKCFhdWRpby0+cmVhZF9kYXRhKSkgewotCQkJCU1NX0RCRygiYWxsb2NhdGUgUENNIGJ1ZiAlZFxuIiwKLQkJCQljb25maWcuYnVmZmVyX2NvdW50ICogY29uZmlnLmJ1ZmZlcl9zaXplKTsKLQkJCQloYW5kbGUgPSBpb25fYWxsb2MoYXVkaW8tPmNsaWVudCwKLQkJCQkJKGNvbmZpZy5idWZmZXJfc2l6ZSAqCi0JCQkJCWNvbmZpZy5idWZmZXJfY291bnQpLAotCQkJCQlTWl80SywgSU9OX0hFQVAoSU9OX0FVRElPX0hFQVBfSUQpLCAwKTsKLQkJCQlpZiAoSVNfRVJSX09SX05VTEwoaGFuZGxlKSkgewotCQkJCQlNTV9FUlIoIlVuYWJsZSB0byBhbGxvYyBJL1AgYnVmZnNcbiIpOwotCQkJCQlhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgPSBOVUxMOwotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IGhhbmRsZTsKLQotCQkJCXJjID0gaW9uX3BoeXMoYXVkaW8tPmNsaWVudCAsCi0JCQkJCWhhbmRsZSwgJmFkZHIsICZsZW4pOwotCQkJCWlmIChyYykgewotCQkJCQlNTV9FUlIoIkludmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkJCQkodW5zaWduZWQgaW50KSBhZGRyLAotCQkJCQkJKHVuc2lnbmVkIGludCkgbGVuKTsKLQkJCQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgaGFuZGxlKTsKLQkJCQkJYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlID0gTlVMTDsKLQkJCQkJcmMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQlNTV9JTkZPKCJHb3QgdmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkJCQkodW5zaWduZWQgaW50KSBhdWRpby0+cmVhZF9waHlzLAotCQkJCQkJKHVuc2lnbmVkIGludCkgbGVuKTsKLQkJCQl9Ci0JCQkJYXVkaW8tPnJlYWRfcGh5cyA9IChpbnQzMl90KWFkZHI7Ci0KLQkJCQlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKGF1ZGlvLT5jbGllbnQsCi0JCQkJCWhhbmRsZSwgJmlvbmZsYWcpOwotCQkJCWlmIChyYykgewotCQkJCQlNTV9FUlIoImNvdWxkIG5vdCBnZXQgZmxhZ3NcbiIpOwotCQkJCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBoYW5kbGUpOwotCQkJCQlhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgPSBOVUxMOwotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlhdWRpby0+bWFwX3ZfcmVhZCA9IGlvbl9tYXBfa2VybmVsKAotCQkJCQlhdWRpby0+Y2xpZW50LCBoYW5kbGUpOwotCQkJCWlmIChJU19FUlIoYXVkaW8tPm1hcF92X3JlYWQpKSB7Ci0JCQkJCU1NX0VSUigiZmFpbGVkIHRvIG1hcCByZWFkIGJ1ZlxuIik7Ci0JCQkJCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci0JCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQl9IGVsc2UgewotCQkJCQl1aW50OF90IGluZGV4OwotCQkJCQl1aW50MzJfdCBvZmZzZXQgPSAwOwotCQkJCQlhdWRpby0+cmVhZF9kYXRhID0KLQkJCQkJCWF1ZGlvLT5tYXBfdl9yZWFkOwotCQkJCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCQkJCQlhdWRpby0+cGNtX2J1Zl9jb3VudCA9Ci0JCQkJCQljb25maWcuYnVmZmVyX2NvdW50OwotCQkJCQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQkJCQkJYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0KLQkJCQkJZm9yIChpbmRleCA9IDA7Ci0JCQkJCWluZGV4IDwgY29uZmlnLmJ1ZmZlcl9jb3VudDsgaW5kZXgrKykgewotCQkJCQkJYXVkaW8tPmluW2luZGV4XS5kYXRhID0KLQkJCQkJCWF1ZGlvLT5yZWFkX2RhdGEgKyBvZmZzZXQ7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLmFkZHIgPQotCQkJCQkJYXVkaW8tPnJlYWRfcGh5cyArIG9mZnNldDsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9Ci0JCQkJCQljb25maWcuYnVmZmVyX3NpemU7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLnVzZWQgPSAwOwotCQkJCQkJb2Zmc2V0ICs9IGNvbmZpZy5idWZmZXJfc2l6ZTsKLQkJCQkJfQotCQkJCQlNTV9EQkcoInJlYWQgYnVmOiBwaHkgYWRkciAweCUwOHggXAotCQkJCQkJa2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQkJCQkJYXVkaW8tPnJlYWRfcGh5cywKLQkJCQkJCShpbnQpYXVkaW8tPnJlYWRfZGF0YSk7Ci0JCQkJCXJjID0gMDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJjID0gMDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19QQVVTRToKLQkJTU1fREJHKCJBVURJT19QQVVTRSAlbGRcbiIsIGFyZyk7Ci0JCXJjID0gYXVkcHBfcGF1c2UoYXVkaW8tPmRlY19pZCwgKGludCkgYXJnKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIE9ubHkgdXNlZnVsIGluIHR1bm5lbC1tb2RlICovCi1zdGF0aWMgaW50IGF1ZHFjZWxwX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgYSwgbG9mZl90IGIsCi0JaW50IGRhdGFzeW5jKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JaWYgKCFhdWRpby0+cnVubmluZyB8fCBhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lX25vbG9jazsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKCFhdWRpby0+b3V0WzBdLnVzZWQgJiYKLQkJIWF1ZGlvLT5vdXRbMV0udXNlZCAmJgotCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIHBjbSBkbWFtaXNzIG1lc3NhZ2UgaXMgc2VudCBjb250aW5vdXNseQotCSAqIHdoZW4gZGVjb2RlciBpcyBzdGFydmVkIHNvIG5vIHJhY2UKLQkgKiBjb25kaXRpb24gY29uY2VybgotCSAqLwotCWF1ZGlvLT50ZW9zID0gMDsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQlhdWRpby0+dGVvcyB8fCBhdWRpby0+d2ZsdXNoKTsKLQotCWlmIChhdWRpby0+d2ZsdXNoKQotCQlyYyA9IC1FQlVTWTsKLQotZG9uZToKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLWRvbmVfbm9sb2NrOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkcWNlbHBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0JaW50IHJjID0gMDsKLQotCWlmICghYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJcmV0dXJuIDA7IC8qIFBDTSBmZWVkYmFjayBpcyBub3QgZW5hYmxlZC4gTm90aGluZyB0byByZWFkICovCi0KLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlNTV9EQkcoIiVkXG4iLCBjb3VudCk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+cmVhZF93YWl0LAotCQkJCShhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCA+IDApIHx8Ci0JCQkJKGF1ZGlvLT5zdG9wcGVkKSB8fCAoYXVkaW8tPnJmbHVzaCkpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT5yZmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY291bnQgPCBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCkgewotCQkJLyogUmVhZCBtdXN0IGhhcHBlbiBpbiBmcmFtZSBib3VuZGFyeS4gU2luY2UgZHJpdmVyIGRvZXMKLQkJCW5vdCBrbm93IGZyYW1lIHNpemUsIHJlYWQgY291bnQgbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsCi0JCQl0byBzaXplIG9mIFBDTSBzYW1wbGVzICovCi0JCQlNTV9EQkcoInJlYWQgc3RvcCAtIHBhcnRpYWwgZnJhbWVcbiIpOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9EQkcoInJlYWQgZnJvbSBpblslZF1cbiIsIGF1ZGlvLT5yZWFkX25leHQpOwotCQkJLyogb3JkZXIgcmVhZHMgZnJvbSB0aGUgb3V0cHV0IGJ1ZmZlciAqLwotCQkJcm1iKCk7Ci0JCQlpZiAoY29weV90b191c2VyKGJ1ZiwKLQkJCQlhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0uZGF0YSwKLQkJCQlhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCkpIHsKLQkJCQlNTV9FUlIoImludmFsaWQgYWRkciAleFxuIiwgKHVuc2lnbmVkIGludClidWYpOwotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNvdW50IC09IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkOwotCQkJYnVmICs9IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkOwotCQkJYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQgPSAwOwotCQkJaWYgKCgrK2F1ZGlvLT5yZWFkX25leHQpID09IGF1ZGlvLT5wY21fYnVmX2NvdW50KQotCQkJCWF1ZGlvLT5yZWFkX25leHQgPSAwOwotCQkJYnJlYWs7Ci0JCQkJLyogRm9yY2UgdG8gZXhpdCB3aGlsZSBsb29wCi0JCQkJICogdG8gcHJldmVudCBvdXRwdXQgdGhyZWFkCi0JCQkJICogc2xlZXAgdG9vIGxvbmcgaWYgZGF0YSBpcwotCQkJCSAqIG5vdCByZWFkeSBhdCB0aGlzIG1vbWVudC4KLQkJCQkgKi8KLQkJfQotCX0KLQotCS8qIGRvbid0IGZlZWQgb3V0cHV0IGJ1ZmZlciB0byBIVyBkZWNvZGVyIGR1cmluZyBmbHVzaGluZwotCSAqIGJ1ZmZlciByZWZyZXNoIGNvbW1hbmQgd2lsbCBiZSBzZW50IG9uY2UgZmx1c2ggY29tcGxldGVzCi0JICogc2VuZCBidWYgcmVmcmVzaCBjb21tYW5kIGhlcmUgY2FuIGNvbmZ1c2UgSFcgZGVjb2RlcgotCSAqLwotCWlmIChhdWRpby0+YnVmX3JlZnJlc2ggJiYgIWF1ZGlvLT5yZmx1c2gpIHsKLQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQkJTU1fREJHKCJraWNrIHN0YXJ0IHBjbSBmZWVkYmFjayBhZ2FpblxuIik7Ci0JCWF1ZHFjZWxwX2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCi0JaWYgKGJ1ZiA+IHN0YXJ0KQotCQlyYyA9IGJ1ZiAtIHN0YXJ0OwotCi0JTU1fREJHKCJyZWFkICVkIGJ5dGVzXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZHFjZWxwX3Byb2Nlc3NfZW9zKHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCWNvbnN0IGNoYXIgX191c2VyICpidWZfc3RhcnQsIHVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplKQotewotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWludCByYyA9IDA7Ci0KLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKGF1ZGlvLT5vdXRfbmVlZGVkICYmCi0JCWF1ZGlvLT5vdXRbMF0udXNlZCA9PSAwICYmCi0JCWF1ZGlvLT5vdXRbMV0udXNlZCA9PSAwKQotCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoZnJhbWUtPmRhdGEsIGJ1Zl9zdGFydCwgbWZpZWxkX3NpemUpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlmcmFtZS0+dXNlZCA9IG1maWVsZF9zaXplOwotCWF1ZHFjZWxwX3NlbmRfZGF0YShhdWRpbywgMCk7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRxY2VscF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0Jc2l6ZV90IHhmZXI7Ci0JY2hhciAqY3B5X3B0cjsKLQlpbnQgcmMgPSAwLCBlb3NfY29uZGl0aW9uID0gQVVEUUNFTFBfRU9TX05PTkU7Ci0JdW5zaWduZWQgc2hvcnQgbWZpZWxkX3NpemUgPSAwOwotCi0JTU1fREJHKCJjbnQ9JWRcbiIsIGNvdW50KTsKLQotCWlmIChjb3VudCAmIDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF9oZWFkOwotCQljcHlfcHRyID0gZnJhbWUtPmRhdGE7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCQkgICAgICAoZnJhbWUtPnVzZWQgPT0gMCkKLQkJCQkJCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQkJCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0JCU1NX0RCRygiYnVmZmVyIGF2YWlsYWJsZVxuIik7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQkJaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoYXVkaW8tPm1maWVsZCkgewotCQkJaWYgKGJ1ZiA9PSBzdGFydCkgewotCQkJCS8qIFByb2Nlc3NpbmcgYmVnaW5uaW5nIG9mIHVzZXIgYnVmZmVyICovCi0JCQkJaWYgKF9fZ2V0X3VzZXIobWZpZWxkX3NpemUsCi0JCQkJCSh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgYnVmKSkgewotCQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSAJaWYgKG1maWVsZF9zaXplID4gY291bnQpIHsKLQkJCQkJcmMgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJTU1fREJHKCJtZiBvZmZzZXRfdmFsICV4XG4iLCBtZmllbGRfc2l6ZSk7Ci0JCQkJaWYgKGNvcHlfZnJvbV91c2VyKGNweV9wdHIsIGJ1ZiwgbWZpZWxkX3NpemUpKSB7Ci0JCQkJCXJjID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8qIENoZWNrIGlmIEVPUyBmbGFnIGlzIHNldCBhbmQgYnVmZmVyIGhhcwotCQkJCSAqIGNvbnRhaW5zIGp1c3QgbWV0YSBmaWVsZAotCQkJCSAqLwotCQkJCWlmIChjcHlfcHRyW0FVRFFDRUxQX0VPU19GTEdfT0ZGU0VUXSAmCi0JCQkJCQlBVURRQ0VMUF9FT1NfRkxHX01BU0spIHsKLQkJCQkJTU1fREJHKCJFT1MgU0VUXG4iKTsKLQkJCQkJZW9zX2NvbmRpdGlvbiA9IEFVRFFDRUxQX0VPU19TRVQ7Ci0JCQkJCWlmIChtZmllbGRfc2l6ZSA9PSBjb3VudCkgewotCQkJCQkJYnVmICs9IG1maWVsZF9zaXplOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZQotCQkJCQljcHlfcHRyW0FVRFFDRUxQX0VPU19GTEdfT0ZGU0VUXSAmPQotCQkJCQkJfkFVRFFDRUxQX0VPU19GTEdfTUFTSzsKLQkJCQl9Ci0JCQkJY3B5X3B0ciArPSBtZmllbGRfc2l6ZTsKLQkJCQljb3VudCAtPSBtZmllbGRfc2l6ZTsKLQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQl9IGVsc2UgewotCQkJCW1maWVsZF9zaXplID0gMDsKLQkJCQlNTV9EQkcoImNvbnRpbnVvdXMgYnVmZmVyXG4iKTsKLQkJCX0KLQkJCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQkJfQotCi0JCXhmZXIgPSAoY291bnQgPiAoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkpID8KLQkJCShmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSA6IGNvdW50OwotCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCB4ZmVyKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlmcmFtZS0+dXNlZCA9IHhmZXIgKyBtZmllbGRfc2l6ZTsKLQkJYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JCWNvdW50IC09IHhmZXI7Ci0JCWJ1ZiArPSB4ZmVyOwotCQlhdWRxY2VscF9zZW5kX2RhdGEoYXVkaW8sIDApOwotCX0KLQlpZiAoZW9zX2NvbmRpdGlvbiA9PSBBVURRQ0VMUF9FT1NfU0VUKQotCQlyYyA9IGF1ZHFjZWxwX3Byb2Nlc3NfZW9zKGF1ZGlvLCBzdGFydCwgbWZpZWxkX3NpemUpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCWlmICghcmMpIHsKLQkJaWYgKGJ1ZiA+IHN0YXJ0KQotCQkJcmV0dXJuIGJ1ZiAtIHN0YXJ0OwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcWNlbHBfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JTU1fSU5GTygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGZyZWVpbmdcbiIsIChpbnQpIGF1ZGlvKTsKLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkcWNlbHBfZGlzYWJsZShhdWRpbyk7Ci0JaWYgKGF1ZGlvLT5ybXRfcmVzb3VyY2VfcmVsZWFzZWQgPT0gMCkKLQkJcm10X3B1dF9yZXNvdXJjZShhdWRpbyk7Ci0JYXVkcWNlbHBfZmx1c2goYXVkaW8pOwotCWF1ZHFjZWxwX2ZsdXNoX3BjbV9idWYoYXVkaW8pOwotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci0JYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0JdW5yZWdpc3Rlcl9lYXJseV9zdXNwZW5kKCZhdWRpby0+c3VzcGVuZF9jdGwubm9kZSk7Ci0jZW5kaWYKLQlhdWRpby0+b3BlbmVkID0gMDsKLQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAxOwotCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQlhdWRxY2VscF9yZXNldF9ldmVudF9xdWV1ZShhdWRpbyk7Ci0JaW9uX3VubWFwX2tlcm5lbChhdWRpby0+Y2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLQlpZiAoYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlICE9IE5VTEwpIHsKLQkJaW9uX3VubWFwX2tlcm5lbChhdWRpby0+Y2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotCX0KLQlpb25fY2xpZW50X2Rlc3Ryb3koYXVkaW8tPmNsaWVudCk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JaWYgKGF1ZGlvLT5kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKGF1ZGlvLT5kZW50cnkpOwotI2VuZGlmCi0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX3Bvc3RfZXZlbnQoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHR5cGUsCi0JCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQpCi17Ci0Jc3RydWN0IGF1ZHFjZWxwX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpKSB7Ci0JCWVfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWRxY2VscF9ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZlX25vZGUtPmxpc3QpOwotCX0gZWxzZSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRxY2VscF9ldmVudCksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWVfbm9kZSkgewotCQkJTU1fRVJSKCJObyBtZW0gdG8gcG9zdCBldmVudCAlZFxuIiwgdHlwZSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JZV9ub2RlLT5ldmVudF90eXBlID0gdHlwZTsKLQllX25vZGUtPnBheWxvYWQgPSBwYXlsb2FkOwotCi0JbGlzdF9hZGRfdGFpbCgmZV9ub2RlLT5saXN0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcWNlbHBfc3VzcGVuZChzdHJ1Y3QgZWFybHlfc3VzcGVuZCAqaCkKLXsKLQlzdHJ1Y3QgYXVkcWNlbHBfc3VzcGVuZF9jdGwgKmN0bCA9Ci0JCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgYXVkcWNlbHBfc3VzcGVuZF9jdGwsIG5vZGUpOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWF1ZHFjZWxwX3Bvc3RfZXZlbnQoY3RsLT5hdWRpbywgQVVESU9fRVZFTlRfU1VTUEVORCwgcGF5bG9hZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX3Jlc3VtZShzdHJ1Y3QgZWFybHlfc3VzcGVuZCAqaCkKLXsKLQlzdHJ1Y3QgYXVkcWNlbHBfc3VzcGVuZF9jdGwgKmN0bCA9Ci0JCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgYXVkcWNlbHBfc3VzcGVuZF9jdGwsIG5vZGUpOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWF1ZHFjZWxwX3Bvc3RfZXZlbnQoY3RsLT5hdWRpbywgQVVESU9fRVZFTlRfUkVTVU1FLCBwYXlsb2FkKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgc3NpemVfdCBhdWRxY2VscF9kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZHFjZWxwX2RlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNvbnN0IGludCBkZWJ1Z19idWZtYXggPSAxMDI0OwotCXN0YXRpYyBjaGFyIGJ1ZmZlclsxMDI0XTsKLQlpbnQgbiA9IDAsIGk7Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQluID0gc2NucHJpbnRmKGJ1ZmZlciwgZGVidWdfYnVmbWF4LCAib3BlbmVkICVkXG4iLCBhdWRpby0+b3BlbmVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImVuYWJsZWQgJWRcbiIsIGF1ZGlvLT5lbmFibGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInN0b3BwZWQgJWRcbiIsIGF1ZGlvLT5zdG9wcGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInBjbV9mZWVkYmFjayAlZFxuIiwgYXVkaW8tPnBjbV9mZWVkYmFjayk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJvdXRfYnVmX3N6ICVkXG4iLCBhdWRpby0+b3V0WzBdLnNpemUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicGNtX2J1Zl9jb3VudCAlZCBcbiIsIGF1ZGlvLT5wY21fYnVmX2NvdW50KTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInBjbV9idWZfc3ogJWQgXG4iLCBhdWRpby0+aW5bMF0uc2l6ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJ2b2x1bWUgJXggXG4iLCBhdWRpby0+dm9sX3Bhbi52b2x1bWUpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCS8qIEZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIG9ubHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgd2hlbgotCSAqIHdoZW4gcGxheWJhY2sgaGFsdHMgdW5leHBlY3RlZGx5LiBUaHVzLCBubyBtdXR1YWwgZXhjbHVzaW9uCi0JICogZW5mb3JjZWQKLQkgKi8KLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIndmbHVzaCAlZFxuIiwgYXVkaW8tPndmbHVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJyZmx1c2ggJWRcbiIsIGF1ZGlvLT5yZmx1c2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicnVubmluZyAlZCBcbiIsIGF1ZGlvLT5ydW5uaW5nKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImRlYyBzdGF0ZSAlZCBcbiIsIGF1ZGlvLT5kZWNfc3RhdGUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X25lZWRlZCAlZCBcbiIsIGF1ZGlvLT5vdXRfbmVlZGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dF9oZWFkICVkIFxuIiwgYXVkaW8tPm91dF9oZWFkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dF90YWlsICVkIFxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dFswXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFswXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dFsxXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFsxXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImJ1ZmZlcl9yZWZyZXNoICVkIFxuIiwgYXVkaW8tPmJ1Zl9yZWZyZXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInJlYWRfbmV4dCAlZCBcbiIsIGF1ZGlvLT5yZWFkX25leHQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiZmlsbF9uZXh0ICVkIFxuIiwgYXVkaW8tPmZpbGxfbmV4dCk7Ci0JZm9yIChpID0gMDsgaSA8IGF1ZGlvLT5wY21fYnVmX2NvdW50OyBpKyspCi0JCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJImluWyVkXS5zaXplICVkIFxuIiwgaSwgYXVkaW8tPmluW2ldLnVzZWQpOwotCWJ1ZmZlcltuXSA9IDA7Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGJ1ZmZlciwgbik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZHFjZWxwX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWRxY2VscF9kZWJ1Z19yZWFkLAotCS5vcGVuID0gYXVkcWNlbHBfZGVidWdfb3BlbiwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBhdWRxY2VscF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBOVUxMOwotCWludCByYywgZGVjX2F0dHJiLCBkZWNpZCwgaTsKLQlzdHJ1Y3QgYXVkcWNlbHBfZXZlbnQgKmVfbm9kZSA9IE5VTEw7Ci0JdW5zaWduZWQgbWVtX3N6ID0gRE1BU1o7Ci0JdW5zaWduZWQgbG9uZyBpb25mbGFnID0gMDsKLQlpb25fcGh5c19hZGRyX3QgYWRkciA9IDA7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCA9IE5VTEw7Ci0JaW50IGxlbiA9IDA7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JLyogNCBieXRlcyByZXByZXNlbnRzIGRlY29kZXIgbnVtYmVyLCAxIGJ5dGUgZm9yIHRlcm1pbmF0ZSBzdHJpbmcgKi8KLQljaGFyIG5hbWVbc2l6ZW9mICJtc21fcWNlbHBfIiArIDVdOwotI2VuZGlmCi0KLQkvKiBDcmVhdGUgYXVkaW8gaW5zdGFuY2UsIHNldCB0byB6ZXJvICovCi0JYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWF1ZGlvKSB7Ci0JCU1NX0VSUigibm8gbWVtb3J5IHRvIGFsbG9jYXRlIGF1ZGlvIGluc3RhbmNlXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCU1NX0lORk8oImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBjcmVhdGVkXG4iLCAoaW50KWF1ZGlvKTsKLQotCS8qIEFsbG9jYXRlIHRoZSBkZWNvZGVyICovCi0JZGVjX2F0dHJiID0gQVVEREVDX0RFQ19RQ0VMUDsKLQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWRlY19hdHRyYiB8PSBNU01fQVVEX01PREVfTk9OVFVOTkVMOwotCQlhdWRpby0+cGNtX2ZlZWRiYWNrID0gTk9OX1RVTk5FTF9NT0RFX1BMQVlCQUNLOwotCX0gZWxzZSBpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlkZWNfYXR0cmIgfD0gTVNNX0FVRF9NT0RFX1RVTk5FTDsKLQkJYXVkaW8tPnBjbV9mZWVkYmFjayA9IFRVTk5FTF9NT0RFX1BMQVlCQUNLOwotCX0gZWxzZSB7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmMgPSAtRUFDQ0VTOwotCQlnb3RvIGRvbmU7Ci0JfQotCWRlY2lkID0gYXVkcHBfYWRlY19hbGxvYyhkZWNfYXR0cmIsICZhdWRpby0+bW9kdWxlX25hbWUsCi0JCQkmYXVkaW8tPnF1ZXVlX2lkKTsKLQlpZiAoZGVjaWQgPCAwKSB7Ci0JCU1NX0VSUigiTm8gZnJlZSBkZWNvZGVyIGF2YWlsYWJsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJKGludClhdWRpbyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJa2ZyZWUoYXVkaW8pOwotCQlnb3RvIGRvbmU7Ci0JfQotCWF1ZGlvLT5kZWNfaWQgPSBkZWNpZCAmIE1TTV9BVURfREVDT0RFUl9NQVNLOwotCi0JY2xpZW50ID0gbXNtX2lvbl9jbGllbnRfY3JlYXRlKFVJTlRfTUFYLCAiQXVkaW9fUUNFTFBfQ2xpZW50Iik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGNsaWVudCkpIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gY3JlYXRlIElPTiBjbGllbnRcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gY2xpZW50X2NyZWF0ZV9lcnJvcjsKLQl9Ci0JYXVkaW8tPmNsaWVudCA9IGNsaWVudDsKLQotCWhhbmRsZSA9IGlvbl9hbGxvYyhjbGllbnQsIG1lbV9zeiwgU1pfNEssCi0JCUlPTl9IRUFQKElPTl9BVURJT19IRUFQX0lEKSwgMCk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGhhbmRsZSkpIHsKLQkJTU1fRVJSKCJVbmFibGUgdG8gY3JlYXRlIGFsbG9jYXRlIE8vUCBidWZmZXJzXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dHB1dF9idWZmX2FsbG9jX2Vycm9yOwotCX0KLQlhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlID0gaGFuZGxlOwotCi0JcmMgPSBpb25fcGh5cyhjbGllbnQsIGhhbmRsZSwgJmFkZHIsICZsZW4pOwotCWlmIChyYykgewotCQlNTV9FUlIoIk8vUCBidWZmZXJzOkludmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCQlnb3RvIG91dHB1dF9idWZmX2dldF9waHlzX2Vycm9yOwotCX0gZWxzZSB7Ci0JCU1NX0lORk8oIk8vUCBidWZmZXJzOnZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJKHVuc2lnbmVkIGludCkgYWRkciwgKHVuc2lnbmVkIGludCkgbGVuKTsKLQl9Ci0JYXVkaW8tPnBoeXMgPSAoaW50MzJfdClhZGRyOwotCi0KLQlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKGNsaWVudCwgaGFuZGxlLCAmaW9uZmxhZyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiY291bGQgbm90IGdldCBmbGFncyBmb3IgdGhlIGhhbmRsZVxuIik7Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfZ2V0X2ZsYWdzX2Vycm9yOwotCX0KLQotCWF1ZGlvLT5tYXBfdl93cml0ZSA9IGlvbl9tYXBfa2VybmVsKGNsaWVudCwgaGFuZGxlKTsKLQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl93cml0ZSkpIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgbWFwIHdyaXRlIGJ1ZmZlcnNcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfbWFwX2Vycm9yOwotCX0KLQlhdWRpby0+ZGF0YSA9IGF1ZGlvLT5tYXBfdl93cml0ZTsKLQlNTV9EQkcoIndyaXRlIGJ1ZjogcGh5IGFkZHIgMHglMDh4IGtlcm5lbCBhZGRyIDB4JTA4eFxuIiwKLQkJYXVkaW8tPnBoeXMsIChpbnQpYXVkaW8tPmRhdGEpOwotCi0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spIHsKLQkJcmMgPSBhdWRtZ3Jfb3BlbigmYXVkaW8tPmF1ZG1ncik7Ci0JCWlmIChyYykgewotCQkJTU1fRVJSKCJhdWRtZ3Igb3BlbiBmYWlsZWQsIGZyZWVpbmcgaW5zdGFuY2UgXAotCQkJCQkweCUwOHhcbiIsIChpbnQpYXVkaW8pOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0KLQlyYyA9IG1zbV9hZHNwX2dldChhdWRpby0+bW9kdWxlX25hbWUsICZhdWRpby0+YXVkcGxheSwKLQkJJmF1ZHBsYXlfYWRzcF9vcHNfcWNlbHAsIGF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJmYWlsZWQgdG8gZ2V0ICVzIG1vZHVsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJYXVkaW8tPm1vZHVsZV9uYW1lLCAoaW50KWF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spCi0JCQlhdWRtZ3JfY2xvc2UoJmF1ZGlvLT5hdWRtZ3IpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyYyA9IHJtdF9nZXRfcmVzb3VyY2UoYXVkaW8pOwotCWlmIChyYykgewotCQlNTV9FUlIoIkFEU1AgcmVzb3VyY2VzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBRQ0VMUCBzZXNzaW9uIFwKLQkJCSAweCUwOHggb24gZGVjb2RlcjogJWRcbiIsIChpbnQpYXVkaW8sIGF1ZGlvLT5kZWNfaWQpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykKLQkJCWF1ZG1ncl9jbG9zZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0KLQkvKiBJbml0aWFsaXplIGFsbCBsb2NrcyBvZiBhdWRpbyBpbnN0YW5jZSAqLwotCW11dGV4X2luaXQoJmF1ZGlvLT5sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPnJlYWRfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmRzcF9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jayk7Ci0KLQkvKiBJbml0aWFsaXplIGJ1ZmZlciAqLwotCWF1ZGlvLT5vdXRbMF0uZGF0YSA9IGF1ZGlvLT5kYXRhICsgMDsKLQlhdWRpby0+b3V0WzBdLmFkZHIgPSBhdWRpby0+cGh5cyArIDA7Ci0JYXVkaW8tPm91dFswXS5zaXplID0gQlVGU1o7Ci0KLQlhdWRpby0+b3V0WzFdLmRhdGEgPSBhdWRpby0+ZGF0YSArIEJVRlNaOwotCWF1ZGlvLT5vdXRbMV0uYWRkciA9IGF1ZGlvLT5waHlzICsgQlVGU1o7Ci0JYXVkaW8tPm91dFsxXS5zaXplID0gQlVGU1o7Ci0KLQlhdWRpby0+dm9sX3Bhbi52b2x1bWUgPSAweDIwMDA7Ci0KLQlhdWRxY2VscF9mbHVzaChhdWRpbyk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQlhdWRpby0+b3BlbmVkID0gMTsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlzbnByaW50ZihuYW1lLCBzaXplb2YgbmFtZSwgIm1zbV9xY2VscF8lMDR4IiwgYXVkaW8tPmRlY19pZCk7Ci0JYXVkaW8tPmRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQlOVUxMLCAodm9pZCAqKSBhdWRpbywgJmF1ZHFjZWxwX2RlYnVnX2ZvcHMpOwotCi0JaWYgKElTX0VSUihhdWRpby0+ZGVudHJ5KSkKLQkJTU1fREJHKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLmxldmVsID0gRUFSTFlfU1VTUEVORF9MRVZFTF9ESVNBQkxFX0ZCOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLnJlc3VtZSA9IGF1ZHFjZWxwX3Jlc3VtZTsKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5zdXNwZW5kID0gYXVkcWNlbHBfc3VzcGVuZDsKLQlhdWRpby0+c3VzcGVuZF9jdGwuYXVkaW8gPSBhdWRpbzsKLQlyZWdpc3Rlcl9lYXJseV9zdXNwZW5kKCZhdWRpby0+c3VzcGVuZF9jdGwubm9kZSk7Ci0jZW5kaWYKLQlmb3IgKGkgPSAwOyBpIDwgQVVEUUNFTFBfRVZFTlRfTlVNOyBpKyspIHsKLQkJZV9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZHFjZWxwX2V2ZW50KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChlX25vZGUpCi0JCQlsaXN0X2FkZF90YWlsKCZlX25vZGUtPmxpc3QsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JCWVsc2UgewotCQkJTU1fRVJSKCJldmVudCBwa3QgYWxsb2MgZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotZG9uZToKLQlyZXR1cm4gcmM7Ci1lcnI6Ci0JaW9uX3VubWFwX2tlcm5lbChjbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotb3V0cHV0X2J1ZmZfbWFwX2Vycm9yOgotb3V0cHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I6Ci1vdXRwdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I6Ci0JaW9uX2ZyZWUoY2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLW91dHB1dF9idWZmX2FsbG9jX2Vycm9yOgotCWlvbl9jbGllbnRfZGVzdHJveShjbGllbnQpOwotY2xpZW50X2NyZWF0ZV9lcnJvcjoKLQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fcWNlbHBfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IGF1ZHFjZWxwX29wZW4sCi0JLnJlbGVhc2UgPSBhdWRxY2VscF9yZWxlYXNlLAotCS5yZWFkID0gYXVkcWNlbHBfcmVhZCwKLQkud3JpdGUgPSBhdWRxY2VscF93cml0ZSwKLQkudW5sb2NrZWRfaW9jdGwgPSBhdWRxY2VscF9pb2N0bCwKLQkuZnN5bmMgPSBhdWRxY2VscF9mc3luYywKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX3FjZWxwX21pc2MgPSB7Ci0JLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lID0gIm1zbV9xY2VscCIsCi0JLmZvcHMgPSAmYXVkaW9fcWNlbHBfZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZHFjZWxwX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fcWNlbHBfbWlzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdWRxY2VscF9leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZhdWRpb19xY2VscF9taXNjKTsKLX0KLQotbW9kdWxlX2luaXQoYXVkcWNlbHBfaW5pdCk7Ci1tb2R1bGVfZXhpdChhdWRxY2VscF9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gUUNFTFAgMTNLIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fcWNlbHBfaW4uYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX3FjZWxwX2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZGE0YjkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fcWNlbHBfaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDE0NjggKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fcWNlbHBfaW4uYwotICoKLSAqIHFjZWxwIGF1ZGlvIGlucHV0IGRldmljZQotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgYmFzZWQgaW4gcGFydCBvbiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX3FjZWxwX2luLmMsCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX3FjcC5oPgotCi0KLSNpbmNsdWRlIDxsaW51eC9tZW1vcnlfYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+Ci0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotCi0jaW5jbHVkZSA8bWFjaC9tc21fbWVtdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fcnBjcm91dGVyLmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdS5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXVfZG9tYWlucy5oPgotI2luY2x1ZGUgImF1ZG1nci5oIgotCi0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHByZXByb2MuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHJlcHJvY2NtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHJlcHJvY21zZy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRyZWNjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHJlY21zZy5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLQotI2RlZmluZSBGUkFNRV9IRUFERVJfU0laRQk4IC8qIDggYnl0ZXMgZnJhbWUgaGVhZGVyICovCi0jZGVmaW5lIE5UX0ZSQU1FX0hFQURFUl9TSVpFCTI0IC8qIDI0IGJ5dGVzIGZyYW1lIGhlYWRlciAqLwotLyogRlJBTUVfTlVNIG11c3QgYmUgYSBwb3dlciBvZiB0d28gKi8KLSNkZWZpbmUgRlJBTUVfTlVNCTgKLSNkZWZpbmUgUUNFTFBfRlJBTUVfU0laRQkzNiAvKiAzNiBieXRlcyBkYXRhICovCi0vKlR1bm5lbCBtb2RlIDogMzYgYnl0ZXMgZGF0YSArIDggYnl0ZSBoZWFkZXIqLwotI2RlZmluZSBGUkFNRV9TSVpFCShRQ0VMUF9GUkFNRV9TSVpFICsgRlJBTUVfSEVBREVSX1NJWkUpCi0gLyogMzYgYnl0ZXMgZGF0YSAgKyAyNCBtZXRhIGZpZWxkKi8KLSNkZWZpbmUgTlRfRlJBTUVfU0laRQkoUUNFTFBfRlJBTUVfU0laRSArIE5UX0ZSQU1FX0hFQURFUl9TSVpFKQotI2RlZmluZSBETUFTWgkJKEZSQU1FX1NJWkUgKiBGUkFNRV9OVU0pCi0jZGVmaW5lIE5UX0RNQVNaCShOVF9GUkFNRV9TSVpFICogRlJBTUVfTlVNKQotI2RlZmluZSBPVVRfRlJBTUVfTlVNCTIKLSNkZWZpbmUgT1VUX0JVRkZFUl9TSVpFICg0ICogMTAyNCArIE5UX0ZSQU1FX0hFQURFUl9TSVpFKQotI2RlZmluZSBCVUZGRVJfU0laRQkoT1VUX0JVRkZFUl9TSVpFICogT1VUX0ZSQU1FX05VTSkKLQotLyogT2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIGJ1ZmZlciovCi0jZGVmaW5lIEFVRFBSRVBST0NfUUNFTFBfRU9TX0ZMR19PRkZTRVQgMHgwQQotI2RlZmluZSBBVURQUkVQUk9DX1FDRUxQX0VPU19GTEdfTUFTSyAweDAxCi0jZGVmaW5lIEFVRFBSRVBST0NfUUNFTFBfRU9TX05PTkUgMHgwIC8qIE5vIEVPUyBkZXRlY3RlZCAqLwotI2RlZmluZSBBVURQUkVQUk9DX1FDRUxQX0VPU19TRVQgMHgxIC8qIEVPUyBzZXQgaW4gbWV0YSBmaWVsZCAqLwotCi1zdHJ1Y3QgYnVmZmVyIHsKLQl2b2lkICpkYXRhOwotCXVpbnQzMl90IHNpemU7Ci0JdWludDMyX3QgcmVhZDsKLQl1aW50MzJfdCBhZGRyOwotCXVpbnQzMl90IHVzZWQ7Ci0JdWludDMyX3QgbWZpZWxkX3N6OwotfTsKLQotc3RydWN0IGF1ZGlvX3FjZWxwX2luIHsKLQlzdHJ1Y3QgYnVmZmVyIGluW0ZSQU1FX05VTV07Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JYXRvbWljX3QgaW5fYnl0ZXM7Ci0JYXRvbWljX3QgaW5fc2FtcGxlczsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtdXRleCByZWFkX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X2VuYWJsZTsKLQkvKndyaXRlIHNlY3Rpb24qLwotCXN0cnVjdCBidWZmZXIgb3V0W09VVF9GUkFNRV9OVU1dOwotCi0JdWludDhfdCBvdXRfaGVhZDsKLQl1aW50OF90IG91dF90YWlsOwotCXVpbnQ4X3Qgb3V0X25lZWRlZDsJLyogbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGRzcCBpcyB3YWl0aW5nIGZvciAqLwotCXVpbnQzMl90IG91dF9jb3VudDsKLQotCXN0cnVjdCBtdXRleCB3cml0ZV9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlX3dhaXQ7Ci0JaW50MzJfdCBvdXRfcGh5czsgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB3cml0ZSBidWZmZXIgKi8KLQljaGFyICpvdXRfZGF0YTsKLQlpbnQgbWZpZWxkOyAvKiBtZXRhIGZpZWxkIGVtYmVkZGVkIGluIGRhdGEgKi8KLQlpbnQgd2ZsdXNoOyAvKndyaXRlIGZsdXNoICovCi0JaW50IHJmbHVzaDsgLypyZWFkIGZsdXNoKi8KLQlpbnQgb3V0X2ZyYW1lX2NudDsKLQotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKmF1ZHJlYzsKLQotCi0JLyogY29uZmlndXJhdGlvbiB0byB1c2Ugb24gbmV4dCBlbmFibGUgKi8KLQl1aW50MzJfdCBzYW1wX3JhdGU7Ci0JdWludDMyX3QgY2hhbm5lbF9tb2RlOwotCXVpbnQzMl90IGJ1ZmZlcl9zaXplOyAvKiBGcmFtZSBzaXplICgzNiBieXRlcykgKi8KLQl1aW50MzJfdCBlbmNfdHlwZTsgLyogMTEgZm9yIFFDRUxQICovCi0JdWludDMyX3QgbW9kZTsgLyogVCBvciBOVCBNb2RlKi8KLQotCXN0cnVjdCBtc21fYXVkaW9fcWNlbHBfZW5jX2NvbmZpZyBjZmc7Ci0KLQl1aW50MzJfdCBkc3BfY250OwotCXVpbnQzMl90IGluX2hlYWQ7IC8qIG5leHQgYnVmZmVyIGRzcCB3aWxsIHdyaXRlICovCi0JdWludDMyX3QgaW5fdGFpbDsgLyogbmV4dCBidWZmZXIgcmVhZCgpIHdpbGwgcmVhZCAqLwotCXVpbnQzMl90IGluX2NvdW50OyAvKiBudW1iZXIgb2YgYnVmZmVycyBhdmFpbGFibGUgdG8gcmVhZCgpICovCi0KLQl1aW50MzJfdCBlb3NfYWNrOwotCXVpbnQzMl90IGZsdXNoX2FjazsKLQotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIHF1ZXVlX2lkczsKLQl1aW50MTZfdCBlbmNfaWQ7IC8qIFNlc3Npb24gSWQgKi8KLQotCXVuc2lnbmVkIHNob3J0IHNhbXBfcmF0ZV9pbmRleDsKLQl1aW50MzJfdCBhdWRyZWNfb2JqX2lkeCA7Ci0KLQlzdHJ1Y3QgYXVkbWdyIGF1ZG1ncjsKLQotCS8qIGRhdGEgYWxsb2NhdGVkIGZvciB2YXJpb3VzIGJ1ZmZlcnMgKi8KLQljaGFyICpkYXRhOwotCWRtYV9hZGRyX3QgcGh5czsKLQotCXZvaWQgKm1hcF92X3JlYWQ7Ci0Jdm9pZCAqbWFwX3Zfd3JpdGU7Ci0KLQlpbnQgb3BlbmVkOwotCWludCBlbmFibGVkOwotCWludCBydW5uaW5nOwotCWludCBzdG9wcGVkOyAvKiBzZXQgd2hlbiBzdG9wcGVkLCBjbGVhcmVkIG9uIGZsdXNoICovCi0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaW5wdXRfYnVmZl9oYW5kbGU7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKm91dHB1dF9idWZmX2hhbmRsZTsKLQotCXN0cnVjdCBhdWRyZWNfc2Vzc2lvbl9pbmZvIHNlc3Npb25faW5mbzsgLyphdWRyZWMgc2Vzc2lvbiBpbmZvKi8KLX07Ci0KLXN0cnVjdCBhdWRpb19mcmFtZSB7Ci0JdWludDE2X3QgZnJhbWVfY291bnRfbHN3OwotCXVpbnQxNl90IGZyYW1lX2NvdW50X21zdzsKLQl1aW50MTZfdCBmcmFtZV9sZW5ndGg7Ci0JdWludDE2X3QgZXJhc2VkX3BjbTsKLQl1bnNpZ25lZCBjaGFyIHJhd19iaXRzdHJlYW1bXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhdWRpb19mcmFtZV9udCB7Ci0JdWludDE2X3QgbWV0YWRhdGFfbGVuOwotCXVpbnQxNl90IGZyYW1lX2NvdW50X2xzdzsKLQl1aW50MTZfdCBmcmFtZV9jb3VudF9tc3c7Ci0JdWludDE2X3QgZnJhbWVfbGVuZ3RoOwotCXVpbnQxNl90IGVyYXNlZF9wY207Ci0JdWludDE2X3QgcmVzZXJ2ZWQ7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9kd29yZF9sc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9kd29yZF9tc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9sc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9tc3c7Ci0JdWludDE2X3QgbmZsYWdfbHN3OwotCXVpbnQxNl90IG5mbGFnX21zdzsKLQl1bnNpZ25lZCBjaGFyIHJhd19iaXRzdHJlYW1bXTsgLyogc2FtcGxlcyAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHFjZWxwX2VuY29kZWRfbWV0YV9vdXQgewotCXVpbnQxNl90IG1ldGFkYXRhX2xlbjsKLQl1aW50MTZfdCB0aW1lX3N0YW1wX2R3b3JkX2xzdzsKLQl1aW50MTZfdCB0aW1lX3N0YW1wX2R3b3JkX21zdzsKLQl1aW50MTZfdCB0aW1lX3N0YW1wX2xzdzsKLQl1aW50MTZfdCB0aW1lX3N0YW1wX21zdzsKLQl1aW50MTZfdCBuZmxhZ19sc3c7Ci0JdWludDE2X3QgbmZsYWdfbXN3OwotfTsKLQotLyogQXVkcmVjIFF1ZXVlIGNvbW1hbmQgc2VudCBtYWNybydzICovCi0jZGVmaW5lIGF1ZGlvX3NlbmRfcXVldWVfcHJlKGF1ZGlvLCBjbWQsIGxlbikgXAotCW1zbV9hZHNwX3dyaXRlKGF1ZGlvLT5hdWRwcmUsIFFEU1BfdVBBdWRQcmVQcm9jQ21kUXVldWUsIGNtZCwgbGVuKQotCi0jZGVmaW5lIGF1ZGlvX3NlbmRfcXVldWVfcmVjYnMoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHJlYywgKChhdWRpby0+cXVldWVfaWRzICYgMHhGRkZGMDAwMCkgPj4gMTYpLFwKLQkJCWNtZCwgbGVuKQotI2RlZmluZSBhdWRpb19zZW5kX3F1ZXVlX3JlYyhhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcmVjLCAoYXVkaW8tPnF1ZXVlX2lkcyAmIDB4MDAwMEZGRkYpLFwKLQkJCWNtZCwgbGVuKQotCi1zdGF0aWMgaW50IGF1ZHFjZWxwX2luX2RzcF9lbmFibGUoc3RydWN0IGF1ZGlvX3FjZWxwX2luICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgaW50IGF1ZHFjZWxwX2luX2VuY3BhcmFtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9fcWNlbHBfaW4gKmF1ZGlvKTsKLXN0YXRpYyBpbnQgYXVkcWNlbHBfaW5fZW5jbWVtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9fcWNlbHBfaW4gKmF1ZGlvKTsKLXN0YXRpYyBpbnQgYXVkcWNlbHBfaW5fZHNwX3JlYWRfYnVmZmVyKHN0cnVjdCBhdWRpb19xY2VscF9pbiAqYXVkaW8sCi0JCQkJdWludDMyX3QgcmVhZF9jbnQpOwotc3RhdGljIHZvaWQgYXVkcWNlbHBfaW5fZmx1c2goc3RydWN0IGF1ZGlvX3FjZWxwX2luICphdWRpbyk7Ci0KLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX2luX2dldF9kc3BfZnJhbWVzKHN0cnVjdCBhdWRpb19xY2VscF9pbiAqYXVkaW8pOwotc3RhdGljIGludCBhdWRwY21fY29uZmlnKHN0cnVjdCBhdWRpb19xY2VscF9pbiAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcWNlbHBfb3V0X2ZsdXNoKHN0cnVjdCBhdWRpb19xY2VscF9pbiAqYXVkaW8pOwotc3RhdGljIGludCBhdWRxY2VscF9pbl9yb3V0aW5nX21vZGVfY29uZmlnKHN0cnVjdCBhdWRpb19xY2VscF9pbiAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcmVjX3BjbV9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvX3FjZWxwX2luICphdWRpbywgdW5zaWduZWQgbmVlZGVkKTsKLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX250X2luX2dldF9kc3BfZnJhbWVzKHN0cnVjdCBhdWRpb19xY2VscF9pbiAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcWNlbHBfaW5fZmx1c2goc3RydWN0IGF1ZGlvX3FjZWxwX2luICphdWRpbyk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBjb252ZXJ0X3NhbXBfaW5kZXgodW5zaWduZWQgaW5kZXgpCi17Ci0Jc3dpdGNoIChpbmRleCkgewotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfNDgwMDA6CXJldHVybiA0ODAwMDsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzQ0MTAwOglyZXR1cm4gNDQxMDA7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8zMjAwMDoJcmV0dXJuIDMyMDAwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMjQwMDA6CXJldHVybiAyNDAwMDsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzIyMDUwOglyZXR1cm4gMjIwNTA7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xNjAwMDoJcmV0dXJuIDE2MDAwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMTIwMDA6CXJldHVybiAxMjAwMDsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzExMDI1OglyZXR1cm4gMTEwMjU7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV84MDAwOglyZXR1cm4gODAwMDsKLQlkZWZhdWx0OgkJCQlyZXR1cm4gMTEwMjU7Ci0JfQotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZHByZV9kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsICB2b2lkICpldmVudF9kYXRhKQotewotCi0JdWludDE2X3QgKm1zZyA9IGV2ZW50X2RhdGE7Ci0KLQlpZiAoIW1zZykKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUFJFUFJPQ19NU0dfQ01EX0NGR19ET05FX01TRzoKLQkJTU1fREJHKCJ0eXBlICVkLCBzdGF0dXNfZmxhZyAlZFxuIixcCi0JCQltc2dbMF0sIG1zZ1sxXSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFJFUFJPQ19NU0dfRVJST1JfTVNHX0lEOgotCQlNTV9JTkZPKCJlcnJfaW5kZXggJWRcbiIsIG1zZ1swXSk7Ci0JCWJyZWFrOwotCWNhc2UgQURTUF9NRVNTQUdFX0lEOgotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6IG1vZHVsZSBlbmFibGUoYXVkcHJlcHJvY3Rhc2spXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJ1bmtub3duIGV2ZW50ICVkXG4iLCBpZCk7Ci0JfQotfQotCi0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRxY2VscF9pbl9lbmFibGUoc3RydWN0IGF1ZGlvX3FjZWxwX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkbWdyX2NvbmZpZyBjZmc7Ci0JaW50IHJjOwotCi0JaWYgKGF1ZGlvLT5lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWNmZy50eF9yYXRlID0gYXVkaW8tPnNhbXBfcmF0ZTsKLQljZmcucnhfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFX05PTkU7Ci0JY2ZnLmRlZl9tZXRob2QgPSBSUENfQVVEX0RFRl9NRVRIT0RfUkVDT1JEOwotCWNmZy5jb2RlYyA9IFJQQ19BVURfREVGX0NPREVDXzEzSzsKLQljZmcuc25kX21ldGhvZCA9IFJQQ19TTkRfTUVUSE9EX01JREk7Ci0KLQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJcmMgPSBhdWRtZ3JfZW5hYmxlKCZhdWRpby0+YXVkbWdyLCAmY2ZnKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlpZiAoYXVkcHJlcHJvY19lbmFibGUoYXVkaW8tPmVuY19pZCwKLQkJCQkmYXVkcHJlX2RzcF9ldmVudCwgYXVkaW8pKSB7Ci0JCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRwcmVwcm9jKSBmYWlsZWRcbiIpOwotCQkJYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQkvKnVwZGF0ZSBhdXJlYyBzZXNzaW9uIGluZm8gaW4gYXVkcHJlcHJvYyBsYXllciovCi0JCWF1ZGlvLT5zZXNzaW9uX2luZm8uc2Vzc2lvbl9pZCA9IGF1ZGlvLT5lbmNfaWQ7Ci0JCWF1ZGlvLT5zZXNzaW9uX2luZm8uc2FtcGxpbmdfZnJlcSA9Ci0JCQljb252ZXJ0X3NhbXBfaW5kZXgoYXVkaW8tPnNhbXBfcmF0ZSk7Ci0JCWF1ZHByZXByb2NfdXBkYXRlX2F1ZHJlY19pbmZvKCZhdWRpby0+c2Vzc2lvbl9pbmZvKTsKLQl9Ci0JaWYgKG1zbV9hZHNwX2VuYWJsZShhdWRpby0+YXVkcmVjKSkgewotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJCWF1ZHByZXByb2NfZGlzYWJsZShhdWRpby0+ZW5jX2lkLCBhdWRpbyk7Ci0JCQlhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCX0KLQkJTU1fRVJSKCJtc21fYWRzcF9lbmFibGUoYXVkcmVjKSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JYXVkcWNlbHBfaW5fZHNwX2VuYWJsZShhdWRpbywgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZHFjZWxwX2luX2Rpc2FibGUoc3RydWN0IGF1ZGlvX3FjZWxwX2luICphdWRpbykKLXsKLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCi0JCWF1ZHFjZWxwX2luX2RzcF9lbmFibGUoYXVkaW8sIDApOwotCi0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0X2VuYWJsZSwKLQkJCQlhdWRpby0+cnVubmluZyA9PSAwLCAxKkhaKTsKLQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHJlYyk7Ci0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkgewotCQkJYXVkcHJlcHJvY19kaXNhYmxlKGF1ZGlvLT5lbmNfaWQsIGF1ZGlvKTsKLQkJCWF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJCS8qcmVzZXQgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSBpbmZvcm1hdGlvbiBhdAotCQkJICBhdWRwcmVwcm9jIGxheWVyKi8KLQkJCWF1ZGlvLT5zZXNzaW9uX2luZm8uc2FtcGxpbmdfZnJlcSA9IDA7Ci0JCQlhdWRwcmVwcm9jX3VwZGF0ZV9hdWRyZWNfaW5mbygmYXVkaW8tPnNlc3Npb25faW5mbyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX2luX2dldF9kc3BfZnJhbWVzKHN0cnVjdCBhdWRpb19xY2VscF9pbiAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZGlvX2ZyYW1lICpmcmFtZTsKLQl1aW50MzJfdCBpbmRleDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaW5kZXggPSBhdWRpby0+aW5faGVhZDsKLQotCWZyYW1lID0gKHZvaWQgKikgKCgoY2hhciAqKWF1ZGlvLT5pbltpbmRleF0uZGF0YSkgLQotCQkJc2l6ZW9mKCpmcmFtZSkpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdWRpby0+aW5baW5kZXhdLnNpemUgPSBmcmFtZS0+ZnJhbWVfbGVuZ3RoOwotCi0JLyogc3RhdGlzdGljcyBvZiByZWFkICovCi0JYXRvbWljX2FkZChhdWRpby0+aW5baW5kZXhdLnNpemUsICZhdWRpby0+aW5fYnl0ZXMpOwotCWF0b21pY19hZGQoMSwgJmF1ZGlvLT5pbl9zYW1wbGVzKTsKLQotCWF1ZGlvLT5pbl9oZWFkID0gKGF1ZGlvLT5pbl9oZWFkICsgMSkgJiAoRlJBTUVfTlVNIC0gMSk7Ci0KLQkvKiBJZiBvdmVyZmxvdywgbW92ZSB0aGUgdGFpbCBpbmRleCBmb3dhcmQuICovCi0JaWYgKGF1ZGlvLT5pbl9oZWFkID09IGF1ZGlvLT5pbl90YWlsKSB7Ci0JCU1NX0VSUigiRXJyb3IhIG5vdCBhYmxlIHRvIGtlZXAgdXAgdGhlIHJlYWRcbiIpOwotCQlhdWRpby0+aW5fdGFpbCA9IChhdWRpby0+aW5fdGFpbCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCQlNTV9FUlIoImluX2NvdW50ID0gJWRcbiIsIGF1ZGlvLT5pbl9jb3VudCk7Ci0JfSBlbHNlCi0JCWF1ZGlvLT5pbl9jb3VudCsrOwotCi0JYXVkcWNlbHBfaW5fZHNwX3JlYWRfYnVmZmVyKGF1ZGlvLCBhdWRpby0+ZHNwX2NudCsrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQotCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcWNlbHBfbnRfaW5fZ2V0X2RzcF9mcmFtZXMoc3RydWN0IGF1ZGlvX3FjZWxwX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkaW9fZnJhbWVfbnQgKm50X2ZyYW1lOwotCXVpbnQzMl90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpbmRleCA9IGF1ZGlvLT5pbl9oZWFkOwotCW50X2ZyYW1lID0gKHZvaWQgKikgKCgoY2hhciAqKWF1ZGlvLT5pbltpbmRleF0uZGF0YSkgLSBcCi0JCQkJc2l6ZW9mKHN0cnVjdCBhdWRpb19mcmFtZV9udCkpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdWRpby0+aW5baW5kZXhdLnNpemUgPSBudF9mcmFtZS0+ZnJhbWVfbGVuZ3RoOwotCS8qIHN0YXRpc3RpY3Mgb2YgcmVhZCAqLwotCWF0b21pY19hZGQoYXVkaW8tPmluW2luZGV4XS5zaXplLCAmYXVkaW8tPmluX2J5dGVzKTsKLQlhdG9taWNfYWRkKDEsICZhdWRpby0+aW5fc2FtcGxlcyk7Ci0KLQlhdWRpby0+aW5faGVhZCA9IChhdWRpby0+aW5faGVhZCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCi0JLyogSWYgb3ZlcmZsb3csIG1vdmUgdGhlIHRhaWwgaW5kZXggZm93YXJkLiAqLwotCWlmIChhdWRpby0+aW5faGVhZCA9PSBhdWRpby0+aW5fdGFpbCkKLQkJTU1fREJHKCJFcnJvciEgbm90IGFibGUgdG8ga2VlcCB1cCB0aGUgcmVhZFxuIik7Ci0JZWxzZQotCQlhdWRpby0+aW5fY291bnQrKzsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLX0KLQotc3RhdGljIGludCBhdWRyZWNfcGNtX2J1ZmZlcl9wdHJfcmVmcmVzaChzdHJ1Y3QgYXVkaW9fcWNlbHBfaW4gKmF1ZGlvLAotCQkJCSAgICAgICB1bnNpZ25lZCBpZHgsIHVuc2lnbmVkIGxlbikKLXsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9wY21fYnVmZmVyX3B0cl9yZWZyZXNoX2FybV9lbmMgY21kOwotCi0JaWYgKGxlbiA9PSAgTlRfRlJBTUVfSEVBREVSX1NJWkUpCi0JCWxlbiA9IGxlbiAvIDI7Ci0JZWxzZQotCQlsZW4gPSAobGVuICsgTlRfRlJBTUVfSEVBREVSX1NJWkUpIC8gMjsKLQlNTV9EQkcoImxlbiA9ICVkXG4iLCBsZW4pOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfUENNX0JVRkZFUl9QVFJfUkVGUkVTSF9BUk1fVE9fRU5DOwotCWNtZC5udW1fYnVmZmVycyA9IDE7Ci0JaWYgKGNtZC5udW1fYnVmZmVycyA9PSAxKSB7Ci0JCWNtZC5idWZfYWRkcmVzc19sZW5ndGhbMF0gPSAoYXVkaW8tPm91dFtpZHhdLmFkZHIgJgotCQkJCQkJCTB4ZmZmZjAwMDApID4+IDE2OwotCQljbWQuYnVmX2FkZHJlc3NfbGVuZ3RoWzFdID0gKGF1ZGlvLT5vdXRbaWR4XS5hZGRyICYKLQkJCQkJCQkweDAwMDBmZmZmKTsKLQkJY21kLmJ1Zl9hZGRyZXNzX2xlbmd0aFsyXSA9IChsZW4gJiAweGZmZmYwMDAwKSA+PiAxNjsKLQkJY21kLmJ1Zl9hZGRyZXNzX2xlbmd0aFszXSA9IChsZW4gJiAweDAwMDBmZmZmKTsKLQl9Ci0JYXVkaW8tPm91dF9mcmFtZV9jbnQrKzsKLQlyZXR1cm4gYXVkaW9fc2VuZF9xdWV1ZV9yZWMoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRwY21fY29uZmlnKHN0cnVjdCBhdWRpb19xY2VscF9pbiAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHJlY19jbWRfcGNtX2NmZ19hcm1fdG9fZW5jIGNtZDsKLQlNTV9EQkcoIlxuIik7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUkVDX0NNRF9QQ01fQ0ZHX0FSTV9UT19FTkM7Ci0JY21kLmNvbmZpZ191cGRhdGVfZmxhZyA9IEFVRFJFQ19QQ01fQ09ORklHX1VQREFURV9GTEFHX0VOQUJMRTsKLQljbWQuZW5hYmxlX2ZsYWcgPSBBVURSRUNfRU5BQkxFX0ZMQUdfVkFMVUU7Ci0JY21kLnNhbXBsaW5nX2ZyZXEgPSBjb252ZXJ0X3NhbXBfaW5kZXgoYXVkaW8tPnNhbXBfcmF0ZSk7Ci0JaWYgKCFhdWRpby0+Y2hhbm5lbF9tb2RlKQotCQljbWQuY2hhbm5lbHMgPSAxOwotCWVsc2UKLQkJY21kLmNoYW5uZWxzID0gMjsKLQljbWQuZnJlcXVlbmN5X29mX2ludGltYXRpb24gPSAxOwotCWNtZC5tYXhfbnVtYmVyX29mX2J1ZmZlcnMgPSBPVVRfRlJBTUVfTlVNOwotCXJldHVybiBhdWRpb19zZW5kX3F1ZXVlX3JlYyhhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi0KLXN0YXRpYyBpbnQgYXVkcWNlbHBfaW5fcm91dGluZ19tb2RlX2NvbmZpZyhzdHJ1Y3QgYXVkaW9fcWNlbHBfaW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRyZWNfY21kX3JvdXRpbmdfbW9kZSBjbWQ7Ci0KLQlNTV9EQkcoIlxuIik7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUkVDX0NNRF9ST1VUSU5HX01PREU7Ci0JaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKQotCQljbWQucm91dGluZ19tb2RlID0gMTsKLQlyZXR1cm4gYXVkaW9fc2VuZF9xdWV1ZV9yZWMoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcmVjX2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgc2l6ZV90IGxlbiwKLQkJCSAgICB2b2lkICgqZ2V0ZXZlbnQpKHZvaWQgKnB0ciwgc2l6ZV90IGxlbikpCi17Ci0Jc3RydWN0IGF1ZGlvX3FjZWxwX2luICphdWRpbyA9IE5VTEw7Ci0KLQlpZiAoZGF0YSkKLQkJYXVkaW8gPSBkYXRhOwotCWVsc2UgewotCQlNTV9FUlIoImludmFsaWQgZGF0YSBmb3IgZXZlbnQgJXhcbiIsIGlkKTsKLQkJcmV0dXJuOwotCX0KLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFJFQ19NU0dfQ01EX0NGR19ET05FX01TRzogewotCQlzdHJ1Y3QgYXVkcmVjX21zZ19jbWRfY2ZnX2RvbmVfbXNnIGNtZF9jZmdfZG9uZV9tc2c7Ci0JCWdldGV2ZW50KCZjbWRfY2ZnX2RvbmVfbXNnLCBBVURSRUNfTVNHX0NNRF9DRkdfRE9ORV9NU0dfTEVOKTsKLQkJaWYgKGNtZF9jZmdfZG9uZV9tc2cuYXVkcmVjX2VuY190eXBlICYgXAotCQkJCUFVRFJFQ19NU0dfQ0ZHX0RPTkVfRU5DX0VOQSkgewotCQkJYXVkaW8tPmF1ZHJlY19vYmpfaWR4ID0gY21kX2NmZ19kb25lX21zZy5hdWRyZWNfb2JqX2lkeDsKLQkJCU1NX0RCRygiQ0ZHIEVOQUJMRURcbiIpOwotCQkJaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKSB7Ci0JCQkJTU1fREJHKCJyb3V0aW5nIGNvbW1hbmRcbiIpOwotCQkJCWF1ZHFjZWxwX2luX3JvdXRpbmdfbW9kZV9jb25maWcoYXVkaW8pOwotCQkJfSBlbHNlIHsKLQkJCQlhdWRxY2VscF9pbl9lbmNtZW1fY29uZmlnKGF1ZGlvKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygiQ0ZHIFNMRUVQXG4iKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0X2VuYWJsZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX01TR19DTURfUk9VVElOR19NT0RFX0RPTkVfTVNHOiB7Ci0JCXN0cnVjdCBhdWRyZWNfbXNnX2NtZF9yb3V0aW5nX21vZGVfZG9uZV9tc2cgXAotCQkJcm91dGluZ19tc2c7Ci0JCWdldGV2ZW50KCZyb3V0aW5nX21zZywgQVVEUkVDX01TR19DTURfUk9VVElOR19NT0RFX0RPTkVfTVNHKTsKLQkJTU1fREJHKCJBVURSRUNfTVNHX0NNRF9ST1VUSU5HX01PREVfRE9ORV9NU0ciKTsKLQkJaWYgKHJvdXRpbmdfbXNnLmNvbmZpZ3VyYXRpb24gPT0gMCkgewotCQkJTU1fRVJSKCJyb3V0aW5nIGNvbmZpZ3VyYXRpb24gZmFpbGVkXG4iKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0X2VuYWJsZSk7Ci0JCX0gZWxzZQotCQkJYXVkcWNlbHBfaW5fZW5jbWVtX2NvbmZpZyhhdWRpbyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19NU0dfQ01EX0FSRUNfTUVNX0NGR19ET05FX01TRzogewotCQlNTV9EQkcoIkFSRUNfTUVNX0NGR19ET05FX01TR1xuIik7Ci0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkKLQkJCWF1ZHFjZWxwX2luX2VuY3BhcmFtX2NvbmZpZyhhdWRpbyk7Ci0JCWVsc2UKLQkJCWF1ZHBjbV9jb25maWcoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfQ01EX1BDTV9DRkdfQVJNX1RPX0VOQ19ET05FX01TRzogewotCQlNTV9EQkcoIkFVRFJFQ19DTURfUENNX0NGR19BUk1fVE9fRU5DX0RPTkVfTVNHIik7Ci0JCWF1ZHFjZWxwX2luX2VuY3BhcmFtX2NvbmZpZyhhdWRpbyk7Ci0JICAgIGJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19NU0dfQ01EX0FSRUNfUEFSQU1fQ0ZHX0RPTkVfTVNHOiB7Ci0JCU1NX0RCRygiQVVEUkVDX01TR19DTURfQVJFQ19QQVJBTV9DRkdfRE9ORV9NU0dcbiIpOwotCQlhdWRpby0+cnVubmluZyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53YWl0X2VuYWJsZSk7Ci0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkKLQkJCWF1ZHJlY19wY21fc2VuZF9kYXRhKGF1ZGlvLCAxKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX0NNRF9QQ01fQlVGRkVSX1BUUl9VUERBVEVfQVJNX1RPX0VOQ19NU0c6IHsKLQkJTU1fREJHKCJwdHJfdXBkYXRlIHJlY2lldmVkIGZyb20gRFNQXG4iKTsKLQkJYXVkcmVjX3BjbV9zZW5kX2RhdGEoYXVkaW8sIDEpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfTVNHX05PX0VYVF9QS1RfQVZBSUxBQkxFX01TRzogewotCQlzdHJ1Y3QgYXVkcmVjX21zZ19ub19leHRfcGt0X2F2YWlsX21zZyBlcnJfbXNnOwotCQlnZXRldmVudCgmZXJyX21zZywgQVVEUkVDX01TR19OT19FWFRfUEtUX0FWQUlMQUJMRV9NU0dfTEVOKTsKLQkJTU1fREJHKCJOT19FWFRfUEtUX0FWQUlMQUJMRV9NU0cgJXhcbiIsXAotCQkJZXJyX21zZy5hdWRyZWNfZXJyX2lkKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX01TR19QQUNLRVRfUkVBRFlfTVNHOiB7Ci0JCXN0cnVjdCBhdWRyZWNfbXNnX3BhY2tldF9yZWFkeV9tc2cgcGt0X3JlYWR5X21zZzsKLQotCQlnZXRldmVudCgmcGt0X3JlYWR5X21zZywgQVVEUkVDX01TR19QQUNLRVRfUkVBRFlfTVNHX0xFTik7Ci0JCU1NX0RCRygiVVBfUEFDS0VUX1JFQURZX01TRzogd3JpdGUgY250IG1zdyAgJWQgXAotCQl3cml0ZSBjbnQgbHN3ICVkIHJlYWQgY250IG1zdyAlZCAgcmVhZCBjbnQgbHN3ICVkIFxuIixcCi0JCXBrdF9yZWFkeV9tc2cucGt0X2NvdW50ZXJfbXN3LCBcCi0JCXBrdF9yZWFkeV9tc2cucGt0X2NvdW50ZXJfbHN3LCBcCi0JCXBrdF9yZWFkeV9tc2cucGt0X3JlYWRfY250X21zdywgXAotCQlwa3RfcmVhZHlfbXNnLnBrdF9yZWFkX2NudF9sc3cpOwotCi0JCWF1ZHFjZWxwX2luX2dldF9kc3BfZnJhbWVzKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX1VQX05UX1BBQ0tFVF9SRUFEWV9NU0c6IHsKLQkJc3RydWN0IGF1ZHJlY191cF9udF9wYWNrZXRfcmVhZHlfbXNnIHBrdF9yZWFkeV9tc2c7Ci0KLQkJZ2V0ZXZlbnQoJnBrdF9yZWFkeV9tc2csIEFVRFJFQ19VUF9OVF9QQUNLRVRfUkVBRFlfTVNHX0xFTik7Ci0JCU1NX0RCRygiVVBfTlRfUEFDS0VUX1JFQURZX01TRzogd3JpdGUgY250IGxzdyAgJWQgXAotCQl3cml0ZSBjbnQgbXN3ICVkIHJlYWQgY250IGxzdyAlZCAgcmVhZCBjbnQgbXN3ICVkIFxuIixcCi0JCXBrdF9yZWFkeV9tc2cuYXVkcmVjX3BhY2tldHdyaXRlX2NudF9sc3csIFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfcGFja2V0d3JpdGVfY250X21zdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY191cHByZXZfcmVhZGNvdW50X2xzdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY191cHByZXZfcmVhZGNvdW50X21zdyk7Ci0KLQkJYXVkcWNlbHBfbnRfaW5fZ2V0X2RzcF9mcmFtZXMoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfQ01EX0ZMVVNIX0RPTkVfTVNHOiB7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJYXVkaW8tPmZsdXNoX2FjayA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJTU1fREJHKCJmbHVzaCBhY2sgcmVjaWV2ZWRcbiIpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBRFNQX01FU1NBR0VfSUQ6Ci0JCU1NX0RCRygiUmVjZWl2ZWQgQURTUCBldmVudDogbW9kdWxlIFwKLQkJCQllbmFibGUvZGlzYWJsZShhdWRyZWN0YXNrKVxuIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1NX0VSUigidW5rbm93biBldmVudCAlZFxuIiwgaWQpOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBtc21fYWRzcF9vcHMgYXVkcmVjX3FjZWxwX2Fkc3Bfb3BzID0gewotCS5ldmVudCA9IGF1ZHJlY19kc3BfZXZlbnQsCi19OwotCi1zdGF0aWMgaW50IGF1ZHFjZWxwX2luX2RzcF9lbmFibGUoc3RydWN0IGF1ZGlvX3FjZWxwX2luICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9lbmNfY2ZnIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfRU5DX0NGRzsKLQljbWQuYXVkcmVjX2VuY190eXBlID0gKGF1ZGlvLT5lbmNfdHlwZSAmIDB4RkYpIHwKLQkJCShlbmFibGUgPyBBVURSRUNfQ01EX0VOQ19FTkEgOiBBVURSRUNfQ01EX0VOQ19ESVMpOwotCS8qIERvbid0IGNhcmUgKi8KLQljbWQuYXVkcmVjX29ial9pZHggPSBhdWRpby0+YXVkcmVjX29ial9pZHg7Ci0KLQlyZXR1cm4gYXVkaW9fc2VuZF9xdWV1ZV9yZWMoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRxY2VscF9pbl9lbmNtZW1fY29uZmlnKHN0cnVjdCBhdWRpb19xY2VscF9pbiAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHJlY19jbWRfYXJlY21lbV9jZmcgY21kOwotCXVpbnQxNl90ICpkYXRhID0gKHZvaWQgKikgYXVkaW8tPmRhdGE7Ci0JaW50IG47Ci0JaW50IGhlYWRlcl9sZW4gPSAwOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWNtZC5jbWRfaWQgPSBBVURSRUNfQ01EX0FSRUNNRU1fQ0ZHOwotCWNtZC5hdWRyZWNfb2JqX2lkeCA9IGF1ZGlvLT5hdWRyZWNfb2JqX2lkeDsKLQkvKiBSYXRlIGF0IHdoaWNoIHBhY2tldCBjb21wbGV0ZSBtZXNzYWdlIGNvbWVzICovCi0JY21kLmF1ZHJlY191cF9wa3RfaW50bV9jbnQgPSAxOwotCWNtZC5hdWRyZWNfZXh0cGt0X2J1ZmZlcl9tc3cgPSBhdWRpby0+cGh5cyA+PiAxNjsKLQljbWQuYXVkcmVjX2V4dHBrdF9idWZmZXJfbHN3ID0gYXVkaW8tPnBoeXM7Ci0JLyogTWF4IEJ1ZmZlciBubyBhdmFpbGFibGUgZm9yIGZyYW1lcyAqLwotCWNtZC5hdWRyZWNfZXh0cGt0X2J1ZmZlcl9udW0gPSBGUkFNRV9OVU07Ci0KLQkvKiBwcmVwYXJlIGJ1ZmZlciBwb2ludGVyczoKLQkgKiBUOjM2IGJ5dGVzIHFjZWxwIHBhY2tldCArIDQgaGFsZndvcmQgaGVhZGVyCi0JICogTlQ6MzYgYnl0ZXMgcWNlbHAgcGFja2V0ICsgMTIgaGFsZndvcmQgaGVhZGVyCi0JICovCi0JaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfVFVOTkVMKQotCQloZWFkZXJfbGVuID0gRlJBTUVfSEVBREVSX1NJWkUvMjsKLQllbHNlCi0JCWhlYWRlcl9sZW4gPSBOVF9GUkFNRV9IRUFERVJfU0laRS8yOwotCi0JZm9yIChuID0gMDsgbiA8IEZSQU1FX05VTTsgbisrKSB7Ci0JCWF1ZGlvLT5pbltuXS5kYXRhID0gZGF0YSArIGhlYWRlcl9sZW47Ci0JCWRhdGEgKz0gKFFDRUxQX0ZSQU1FX1NJWkUvMikgKyBoZWFkZXJfbGVuOwotCQlNTV9EQkcoIjB4JTh4XG4iLCAoaW50KShhdWRpby0+aW5bbl0uZGF0YSAtIGhlYWRlcl9sZW4qMikpOwotCX0KLQotCXJldHVybiBhdWRpb19zZW5kX3F1ZXVlX3JlYyhhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGF1ZHFjZWxwX2luX2VuY3BhcmFtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9fcWNlbHBfaW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRyZWNfY21kX2FyZWNwYXJhbV9xY2VscF9jZmcgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY29tbW9uLmNtZF9pZCA9IEFVRFJFQ19DTURfQVJFQ1BBUkFNX0NGRzsKLQljbWQuY29tbW9uLmF1ZHJlY19vYmpfaWR4ID0gYXVkaW8tPmF1ZHJlY19vYmpfaWR4OwotCWNtZC5lbmNfbWluX3JhdGUgPSBhdWRpby0+Y2ZnLm1pbl9iaXRfcmF0ZTsKLQljbWQuZW5jX21heF9yYXRlID0gYXVkaW8tPmNmZy5tYXhfYml0X3JhdGU7Ci0JY21kLnJhdGVfbW9kdWxhdGlvbl9jbWQgPSAwOyAgLyogRGVmYXVsdCBzZXQgdG8gMCAqLwotCWNtZC5yZWR1Y2VkX3JhdGVfbGV2ZWwgPSAwOyAgLyogRGVmYXVsdCBzZXQgdG8gMCAqLwotCi0JcmV0dXJuIGF1ZGlvX3NlbmRfcXVldWVfcmVjKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcWNlbHBfZmx1c2hfY29tbWFuZChzdHJ1Y3QgYXVkaW9fcWNlbHBfaW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRyZWNfY21kX2ZsdXNoIGNtZDsKLQlNTV9EQkcoIlxuIik7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUkVDX0NNRF9GTFVTSDsKLQlyZXR1cm4gYXVkaW9fc2VuZF9xdWV1ZV9yZWMoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRxY2VscF9pbl9kc3BfcmVhZF9idWZmZXIoc3RydWN0IGF1ZGlvX3FjZWxwX2luICphdWRpbywKLQkJdWludDMyX3QgcmVhZF9jbnQpCi17Ci0JYXVkcmVjX2NtZF9wYWNrZXRfZXh0X3B0ciBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURSRUNfQ01EX1BBQ0tFVF9FWFRfUFRSOwotCWNtZC50eXBlID0gYXVkaW8tPmF1ZHJlY19vYmpfaWR4OwotCWNtZC5jdXJyX3JlY19jb3VudF9tc3cgPSByZWFkX2NudCA+PiAxNjsKLQljbWQuY3Vycl9yZWNfY291bnRfbHN3ID0gcmVhZF9jbnQ7Ci0KLQlyZXR1cm4gYXVkaW9fc2VuZF9xdWV1ZV9yZWNicyhhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHZvaWQgYXVkcWNlbHBfaW9wb3J0X3Jlc2V0KHN0cnVjdCBhdWRpb19xY2VscF9pbiAqYXVkaW8pCi17Ci0JLyogTWFrZSBzdXJlIHJlYWQvd3JpdGUgdGhyZWFkIGFyZSBmcmVlIGZyb20KLQkgKiBzbGVlcCBhbmQga25vd2luZyB0aGF0IHN5c3RlbSBpcyBub3QgYWJsZQotCSAqIHRvIHByb2Nlc3MgaW8gcmVxdWVzdCBhdCB0aGUgbW9tZW50Ci0JICovCi0Jd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCWF1ZHFjZWxwX2luX2ZsdXNoKGF1ZGlvKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JYXVkcWNlbHBfb3V0X2ZsdXNoKGF1ZGlvKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcWNlbHBfaW5fZmx1c2goc3RydWN0IGF1ZGlvX3FjZWxwX2luICphdWRpbykKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JYXVkaW8tPmVvc19hY2sgPSAwOwotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdWRpby0+ZHNwX2NudCA9IDA7Ci0JYXVkaW8tPmluX2hlYWQgPSAwOwotCWF1ZGlvLT5pbl90YWlsID0gMDsKLQlhdWRpby0+aW5fY291bnQgPSAwOwotCWZvciAoaSA9IEZSQU1FX05VTS0xOyBpID49IDA7IGktLSkgewotCQlhdWRpby0+aW5baV0uc2l6ZSA9IDA7Ci0JCWF1ZGlvLT5pbltpXS5yZWFkID0gMDsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JTU1fREJHKCJpbl9ieXRlcyAlZFxuIiwgYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9ieXRlcykpOwotCU1NX0RCRygiaW5fc2FtcGxlcyAlZFxuIiwgYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9zYW1wbGVzKSk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPmluX2J5dGVzLCAwKTsKLQlhdG9taWNfc2V0KCZhdWRpby0+aW5fc2FtcGxlcywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX291dF9mbHVzaChzdHJ1Y3QgYXVkaW9fcWNlbHBfaW4gKmF1ZGlvKQotewotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlhdWRpby0+b3V0X2hlYWQgPSAwOwotCWF1ZGlvLT5vdXRfY291bnQgPSAwOwotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdWRpby0+b3V0X3RhaWwgPSAwOwotCWZvciAoaSA9IE9VVF9GUkFNRV9OVU0tMTsgaSA+PSAwOyBpLS0pIHsKLQkJYXVkaW8tPm91dFtpXS5zaXplID0gMDsKLQkJYXVkaW8tPm91dFtpXS5yZWFkID0gMDsKLQkJYXVkaW8tPm91dFtpXS51c2VkID0gMDsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZGV2aWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIGxvbmcgYXVkcWNlbHBfaW5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGF1ZGlvX3FjZWxwX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JTU1fREJHKCJcbiIpOwotCWlmIChjbWQgPT0gQVVESU9fR0VUX1NUQVRTKSB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdGF0cykpOwotCQlzdGF0cy5ieXRlX2NvdW50ID0gYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9ieXRlcyk7Ci0JCXN0YXRzLnNhbXBsZV9jb3VudCA9IGF0b21pY19yZWFkKCZhdWRpby0+aW5fc2FtcGxlcyk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCXJjID0gYXVkcWNlbHBfaW5fZW5hYmxlKGF1ZGlvKTsKLQkJaWYgKCFyYykgewotCQkJcmMgPQotCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXRfZW5hYmxlLAotCQkJCWF1ZGlvLT5ydW5uaW5nICE9IDAsIDEqSFopOwotCQkJTU1fREJHKCJzdGF0ZSAlZCByYyA9ICVkXG4iLCBhdWRpby0+cnVubmluZywgcmMpOwotCi0JCQlpZiAoYXVkaW8tPnJ1bm5pbmcgPT0gMCkKLQkJCQlyYyA9IC1FTk9ERVY7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQl9Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU1RPUDogewotCQlyYyA9IGF1ZHFjZWxwX2luX2Rpc2FibGUoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19GTFVTSDogewotCQlNTV9EQkcoIkFVRElPX0ZMVVNIXG4iKTsKLQkJYXVkaW8tPnJmbHVzaCA9IDE7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAxOwotCQlhdWRxY2VscF9pb3BvcnRfcmVzZXQoYXVkaW8pOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpIHsKLQkJCWF1ZHFjZWxwX2ZsdXNoX2NvbW1hbmQoYXVkaW8pOwotCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJIWF1ZGlvLT53Zmx1c2gpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCU1NX0VSUigiQVVESU9fRkxVU0ggaW50ZXJydXB0ZWRcbiIpOwotCQkJCXJjID0gLUVJTlRSOwotCQkJfQotCQl9IGVsc2UgewotCQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNmZzsKLQkJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihjZmcpKTsKLQkJY2ZnLmJ1ZmZlcl9zaXplID0gT1VUX0JVRkZFUl9TSVpFOwotCQljZmcuYnVmZmVyX2NvdW50ID0gT1VUX0ZSQU1FX05VTTsKLQkJY2ZnLnNhbXBsZV9yYXRlID0gY29udmVydF9zYW1wX2luZGV4KGF1ZGlvLT5zYW1wX3JhdGUpOwotCQljZmcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JCWNmZy50eXBlID0gMDsKLQkJY2ZnLnVudXNlZFswXSA9IDA7Ci0JCWNmZy51bnVzZWRbMV0gPSAwOwotCQljZmcudW51c2VkWzJdID0gMDsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZjZmcsIHNpemVvZihjZmcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfU1RSRUFNX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgY2ZnOwotCQltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOwotCQljZmcuYnVmZmVyX3NpemUgPSBhdWRpby0+YnVmZmVyX3NpemU7Ci0JCWNmZy5idWZmZXJfY291bnQgPSBGUkFNRV9OVU07Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjZmcsIHNpemVvZihjZmcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfU1RSRUFNX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgY2ZnOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgKHZvaWQgKikgYXJnLCBzaXplb2YoY2ZnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIEFsbG93IG9ubHkgc2luZ2xlIGZyYW1lICovCi0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkgewotCQkJaWYgKGNmZy5idWZmZXJfc2l6ZSAhPSAoRlJBTUVfU0laRSAtIDgpKSB7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGNmZy5idWZmZXJfc2l6ZSAhPSAoUUNFTFBfRlJBTUVfU0laRSArIDE0KSkgewotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlhdWRpby0+YnVmZmVyX3NpemUgPSBjZmcuYnVmZmVyX3NpemU7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9RQ0VMUF9FTkNfQ09ORklHOiB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmYXVkaW8tPmNmZywgc2l6ZW9mKGF1ZGlvLT5jZmcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX1FDRUxQX0VOQ19DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnIGNmZzsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsICh2b2lkICopIGFyZywgc2l6ZW9mKGNmZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlNTV9EQkcoIjBYJTh4LCAweCU4eCwgMHglOHhcbiIsIGNmZy5taW5fYml0X3JhdGUsCi0JCQkJY2ZnLm1heF9iaXRfcmF0ZSwgY2ZnLmNkbWFfcmF0ZSk7Ci0JCWlmIChjZmcubWluX2JpdF9yYXRlID4gQ0RNQV9SQVRFX0ZVTEwgfHwgXAotCQkJCSBjZmcubWluX2JpdF9yYXRlIDwgQ0RNQV9SQVRFX0VJR0hUSCkgewotCQkJTU1fRVJSKCJpbnZhbGlkIG1pbiBiaXRyYXRlXG4iKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjZmcubWF4X2JpdF9yYXRlID4gQ0RNQV9SQVRFX0ZVTEwgfHwgXAotCQkJCWNmZy5tYXhfYml0X3JhdGUgPCBDRE1BX1JBVEVfRUlHSFRIKSB7Ci0JCQlNTV9FUlIoImludmFsaWQgbWF4IGJpdHJhdGVcbiIpOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogUmVjb3JkaW5nIERvZXMgbm90IHN1cHBvcnQgRXJhc2UgYW5kIEJsYW5rICovCi0JCWlmIChjZmcuY2RtYV9yYXRlID4gQ0RNQV9SQVRFX0ZVTEwgfHwKLQkJCWNmZy5jZG1hX3JhdGUgPCBDRE1BX1JBVEVfRUlHSFRIKSB7Ci0JCQlNTV9FUlIoImludmFsaWQgcWNlbHAgY2RtYSByYXRlXG4iKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCW1lbWNweSgmYXVkaW8tPmNmZywgJmNmZywgc2l6ZW9mKGNmZykpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZHFjZWxwX2luX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpb19xY2VscF9pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jdm9pZCAqZGF0YTsKLQl1aW50MzJfdCBpbmRleDsKLQl1aW50MzJfdCBzaXplOwotCWludCByYyA9IDA7Ci0Jc3RydWN0IHFjZWxwX2VuY29kZWRfbWV0YV9vdXQgbWV0YV9maWVsZDsKLQlzdHJ1Y3QgYXVkaW9fZnJhbWVfbnQgKm50X2ZyYW1lOwotCU1NX0RCRygiY291bnQgPSAlZFxuIiwgY291bnQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCi0JCQlhdWRpby0+d2FpdCwgKGF1ZGlvLT5pbl9jb3VudCA+IDApIHx8IGF1ZGlvLT5zdG9wcGVkIHx8Ci0JCQlhdWRpby0+cmZsdXNoKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCi0JCWlmIChhdWRpby0+cmZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChhdWRpby0+c3RvcHBlZCAmJiAhYXVkaW8tPmluX2NvdW50KSB7Ci0JCQlNTV9EQkcoIkRyaXZlciBpbiBzdG9wIHN0YXRlLCBObyBtb3JlIGJ1ZmZlciB0byByZWFkIik7Ci0JCQlyYyA9IDA7LyogRW5kIG9mIEZpbGUgKi8KLQkJCWJyZWFrOwotCQl9Ci0KLQkJaW5kZXggPSBhdWRpby0+aW5fdGFpbDsKLQkJZGF0YSA9ICh1aW50OF90ICopIGF1ZGlvLT5pbltpbmRleF0uZGF0YTsKLQkJc2l6ZSA9IGF1ZGlvLT5pbltpbmRleF0uc2l6ZTsKLQotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUwpIHsKLQkJCW50X2ZyYW1lID0gKHN0cnVjdCBhdWRpb19mcmFtZV9udCAqKShkYXRhIC0KLQkJCQkJc2l6ZW9mKHN0cnVjdCBhdWRpb19mcmFtZV9udCkpOwotCQkJbWVtY3B5KChjaGFyICopJm1ldGFfZmllbGQudGltZV9zdGFtcF9kd29yZF9sc3csCi0JCQkJKGNoYXIgKikmbnRfZnJhbWUtPnRpbWVfc3RhbXBfZHdvcmRfbHN3LAotCQkJCShzaXplb2Yoc3RydWN0IHFjZWxwX2VuY29kZWRfbWV0YV9vdXQpIC0gXAotCQkJCXNpemVvZih1aW50MTZfdCkpKTsKLQkJCW1ldGFfZmllbGQubWV0YWRhdGFfbGVuID0KLQkJCQkJc2l6ZW9mKHN0cnVjdCBxY2VscF9lbmNvZGVkX21ldGFfb3V0KTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKGNoYXIgKilzdGFydCwgKGNoYXIgKikmbWV0YV9maWVsZCwKLQkJCQlzaXplb2Yoc3RydWN0IHFjZWxwX2VuY29kZWRfbWV0YV9vdXQpKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChudF9mcmFtZS0+bmZsYWdfbHN3ICYgMHgwMDAxKSB7Ci0JCQkJTU1fRVJSKCJyZWNpZXZlZCBFT1MgaW4gcmVhZCBjYWxsXG4iKTsKLQkJCQlhdWRpby0+ZW9zX2FjayA9IDE7Ci0JCQl9Ci0JCQlidWYgKz0gc2l6ZW9mKHN0cnVjdCBxY2VscF9lbmNvZGVkX21ldGFfb3V0KTsKLQkJCWNvdW50IC09IHNpemVvZihzdHJ1Y3QgcWNlbHBfZW5jb2RlZF9tZXRhX291dCk7Ci0JCX0KLQkJaWYgKGNvdW50ID49IHNpemUpIHsKLQkJCS8qIG9yZGVyIHRoZSByZWFkcyBvbiB0aGUgYnVmZmVyICovCi0JCQlkbWFfY29oZXJlbnRfcG9zdF9vcHMoKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBkYXRhLCBzaXplKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJCWlmIChpbmRleCAhPSBhdWRpby0+aW5fdGFpbCkgewotCQkJCS8qIG92ZXJydW4gLS0gZGF0YSBpcwotCQkJCSAqIGludmFsaWQgYW5kIHdlIG5lZWQgdG8gcmV0cnkgKi8KLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9IDA7Ci0JCQlhdWRpby0+aW5fdGFpbCA9IChhdWRpby0+aW5fdGFpbCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCQkJYXVkaW8tPmluX2NvdW50LS07Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJCWNvdW50IC09IHNpemU7Ci0JCQlidWYgKz0gc2l6ZTsKLQkJCWlmICgoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUwpKSB7Ci0JCQkJaWYgKCFhdWRpby0+ZW9zX2FjaykgewotCQkJCQlNTV9EQkcoInNlbmRpbmcgcmVhZCBwdHIgY29tbWFuZCBcCi0JCQkJCQkJJWQgJWRcbiIsCi0JCQkJCQkJYXVkaW8tPmRzcF9jbnQsCi0JCQkJCQkJYXVkaW8tPmluX3RhaWwpOwotCQkJCQlhdWRxY2VscF9pbl9kc3BfcmVhZF9idWZmZXIoYXVkaW8sCi0JCQkJCQkJYXVkaW8tPmRzcF9jbnQrKyk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJzaG9ydCByZWFkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCi0JaWYgKGJ1ZiA+IHN0YXJ0KQotCQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHJlY19wY21fc2VuZF9kYXRhKHN0cnVjdCBhdWRpb19xY2VscF9pbiAqYXVkaW8sIHVuc2lnbmVkIG5lZWRlZCkKLXsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCU1NX0RCRygiXG4iKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhdWRpby0+cnVubmluZykKLQkJZ290byBkb25lOwotCi0JaWYgKG5lZWRlZCAmJiAhYXVkaW8tPndmbHVzaCkgewotCQkvKiBXZSB3ZXJlIGNhbGxlZCBmcm9tIHRoZSBjYWxsYmFjayBiZWNhdXNlIHRoZSBEU1AKLQkJICogcmVxdWVzdGVkIG1vcmUgZGF0YS4gIE5vdGUgdGhhdCB0aGUgRFNQIGRvZXMgd2FudAotCQkgKiBtb3JlIGRhdGEsIGFuZCBpZiBhIGJ1ZmZlciB3YXMgaW4tZmxpZ2h0LCBtYXJrIGl0Ci0JCSAqIGFzIGF2YWlsYWJsZSAoc2luY2UgdGhlIERTUCBtdXN0IG5vdyBiZSBkb25lIHdpdGgKLQkJICogaXQpLgotCQkgKi8KLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAxOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCWlmIChmcmFtZS0+dXNlZCA9PSAweGZmZmZmZmZmKSB7Ci0JCQlNTV9EQkcoImZyYW1lICVkIGZyZWVcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDA7Ci0JCQlhdWRpby0+b3V0X3RhaWwgXj0gMTsKLQkJCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJfQotCX0KLQotCWlmIChhdWRpby0+b3V0X25lZWRlZCkgewotCQkvKiBJZiB0aGUgRFNQIGN1cnJlbnRseSB3YW50cyBkYXRhIGFuZCB3ZSBoYXZlIGEKLQkJICogYnVmZmVyIGF2YWlsYWJsZSwgd2Ugd2lsbCBzZW5kIGl0IGFuZCByZXNldAotCQkgKiB0aGUgbmVlZGVkIGZsYWcuICBXZSdsbCBtYXJrIHRoZSBidWZmZXIgYXMgaW4tZmxpZ2h0Ci0JCSAqIHNvIHRoYXQgaXQgd29uJ3QgYmUgcmVjeWNsZWQgdW50aWwgdGhlIG5leHQgYnVmZmVyCi0JCSAqIGlzIHJlcXVlc3RlZAotCQkgKi8KLQotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCWlmIChmcmFtZS0+dXNlZCkgewotCQkJQlVHX09OKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpOwotCQkJYXVkcmVjX3BjbV9idWZmZXJfcHRyX3JlZnJlc2goYXVkaW8sCi0JCQkJCQkgYXVkaW8tPm91dF90YWlsLAotCQkJCQkJICAgIGZyYW1lLT51c2VkKTsKLQkJCWZyYW1lLT51c2VkID0gMHhmZmZmZmZmZjsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJfQotCX0KLSBkb25lOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IGF1ZHFjZWxwX2luX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgYSwgbG9mZl90IGIsCi0JaW50IGRhdGFzeW5jKQotCi17Ci0Jc3RydWN0IGF1ZGlvX3FjZWxwX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoIWF1ZGlvLT5ydW5uaW5nIHx8IChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmVfbm9sb2NrOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJYXVkaW8tPndmbHVzaCk7Ci0JTU1fREJHKCJ3YWtlZCBvbiBieSBzb21lIGV2ZW50IGF1ZGlvLT53Zmx1c2ggPSAlZFxuIiwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci1kb25lX25vbG9jazoKLQlyZXR1cm4gcmM7Ci0KLX0KLQotaW50IGF1ZHJlY19xY2VscF9wcm9jZXNzX2VvcyhzdHJ1Y3QgYXVkaW9fcWNlbHBfaW4gKmF1ZGlvLAotCQljb25zdCBjaGFyIF9fdXNlciAqYnVmX3N0YXJ0LCB1bnNpZ25lZCBzaG9ydCBtZmllbGRfc2l6ZSkKLXsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQlpbnQgcmMgPSAwOwotCi0JZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF9oZWFkOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCShhdWRpby0+b3V0X25lZWRlZCAmJgotCQlhdWRpby0+b3V0WzBdLnVzZWQgPT0gMCAmJgotCQlhdWRpby0+b3V0WzFdLnVzZWQgPT0gMCkKLQkJfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQl8fCAoYXVkaW8tPndmbHVzaCkpOwotCi0JaWYgKHJjIDwgMCkKLQkJZ290byBkb25lOwotCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChjb3B5X2Zyb21fdXNlcihmcmFtZS0+ZGF0YSwgYnVmX3N0YXJ0LCBtZmllbGRfc2l6ZSkpIHsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZnJhbWUtPm1maWVsZF9zeiA9IG1maWVsZF9zaXplOwotCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCWZyYW1lLT51c2VkID0gbWZpZWxkX3NpemU7Ci0JTU1fREJHKCJjb3B5aW5nIG1ldGFfb3V0IGZyYW1lLT51c2VkID0gJWRcbiIsIGZyYW1lLT51c2VkKTsKLQlhdWRyZWNfcGNtX3NlbmRfZGF0YShhdWRpbywgMCk7Ci1kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkcWNlbHBfaW5fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpb19xY2VscF9pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWNoYXIgKmNweV9wdHI7Ci0JaW50IHJjID0gMCwgZW9zX2NvbmRpdGlvbiA9IEFVRFBSRVBST0NfUUNFTFBfRU9TX05PTkU7Ci0JdW5zaWduZWQgc2hvcnQgbWZpZWxkX3NpemUgPSAwOwotCWludCB3cml0ZV9jb3VudCA9IDA7Ci0JTU1fREJHKCJjbnQ9JWRcbiIsIGNvdW50KTsKLQotCWlmIChjb3VudCAmIDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGF1ZGlvLT5tb2RlICE9IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0JLyogaWYgc3VwcGxpZWQgY291bnQgaXMgbW9yZSB0aGFuIGRyaXZlciBidWZmZXIgc2l6ZQotCSAqIHRoZW4gb25seSBjb3B5IGRyaXZlciBidWZmZXIgc2l6ZQotCSAqLwotCWlmIChjb3VudCA+IGZyYW1lLT5zaXplKQotCQljb3VudCA9IGZyYW1lLT5zaXplOwotCi0Jd3JpdGVfY291bnQgPSBjb3VudDsKLQljcHlfcHRyID0gZnJhbWUtPmRhdGE7Ci0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJICAgICAgKGZyYW1lLT51c2VkID09IDApCi0JCQkJCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWlmIChhdWRpby0+bWZpZWxkKSB7Ci0JCWlmIChidWYgPT0gc3RhcnQpIHsKLQkJCS8qIFByb2Nlc3NpbmcgYmVnaW5uaW5nIG9mIHVzZXIgYnVmZmVyICovCi0JCQlpZiAoX19nZXRfdXNlcihtZmllbGRfc2l6ZSwKLQkJCQkodW5zaWduZWQgc2hvcnQgX191c2VyICopIGJ1ZikpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0gZWxzZSBpZiAobWZpZWxkX3NpemUgPiBjb3VudCkgewotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJTU1fREJHKCJtZiBvZmZzZXRfdmFsICV4XG4iLCBtZmllbGRfc2l6ZSk7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCBtZmllbGRfc2l6ZSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCS8qIENoZWNrIGlmIEVPUyBmbGFnIGlzIHNldCBhbmQgYnVmZmVyIGhhcwotCQkJICogY29udGFpbnMganVzdCBtZXRhIGZpZWxkCi0JCQkgKi8KLQkJCWlmIChjcHlfcHRyW0FVRFBSRVBST0NfUUNFTFBfRU9TX0ZMR19PRkZTRVRdICYKLQkJCQkJQVVEUFJFUFJPQ19RQ0VMUF9FT1NfRkxHX01BU0spIHsKLQkJCQllb3NfY29uZGl0aW9uID0gQVVEUFJFUFJPQ19RQ0VMUF9FT1NfU0VUOwotCQkJCU1NX0RCRygiRU9TIFNFVFxuIik7Ci0JCQkJaWYgKG1maWVsZF9zaXplID09IGNvdW50KSB7Ci0JCQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKLQkJCQkJZW9zX2NvbmRpdGlvbiA9IDA7Ci0JCQkJCWdvdG8gZXhpdDsKLQkJCQl9IGVsc2UKLQkJCQljcHlfcHRyW0FVRFBSRVBST0NfUUNFTFBfRU9TX0ZMR19PRkZTRVRdICY9Ci0JCQkJCX5BVURQUkVQUk9DX1FDRUxQX0VPU19GTEdfTUFTSzsKLQkJCX0KLQkJCWNweV9wdHIgKz0gbWZpZWxkX3NpemU7Ci0JCQljb3VudCAtPSBtZmllbGRfc2l6ZTsKLQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKLQkJfSBlbHNlIHsKLQkJCW1maWVsZF9zaXplID0gMDsKLQkJCU1NX0RCRygiY29udGludW91cyBidWZmZXJcbiIpOwotCQl9Ci0JCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQl9Ci0JTU1fREJHKCJjb3B5aW5nIHRoZSBzdHJlYW0gY291bnQgPSAlZFxuIiwgY291bnQpOwotCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIGNvdW50KSkgewotCQlyYyA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotZXhpdDoKLQlmcmFtZS0+dXNlZCA9IGNvdW50OwotCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCWlmICghYXVkaW8tPmZsdXNoX2FjaykKLQkJYXVkcmVjX3BjbV9zZW5kX2RhdGEoYXVkaW8sIDApOwotCWVsc2UgewotCQlhdWRyZWNfcGNtX3NlbmRfZGF0YShhdWRpbywgMSk7Ci0JCWF1ZGlvLT5mbHVzaF9hY2sgPSAwOwotCX0KLQlpZiAoZW9zX2NvbmRpdGlvbiA9PSBBVURQUkVQUk9DX1FDRUxQX0VPU19TRVQpCi0JCXJjID0gYXVkcmVjX3FjZWxwX3Byb2Nlc3NfZW9zKGF1ZGlvLCBzdGFydCwgbWZpZWxkX3NpemUpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXJldHVybiB3cml0ZV9jb3VudDsKLWVycm9yOgotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRxY2VscF9pbl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpb19xY2VscF9pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkcWNlbHBfaW5fZGlzYWJsZShhdWRpbyk7Ci0JYXVkcWNlbHBfaW5fZmx1c2goYXVkaW8pOwotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcmVjKTsKLQotCWF1ZHByZXByb2NfYWVuY19mcmVlKGF1ZGlvLT5lbmNfaWQpOwotCWF1ZGlvLT5hdWRyZWMgPSBOVUxMOwotCWF1ZGlvLT5vcGVuZWQgPSAwOwotCi0JaWYgKChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkgJiYgXAotCSAgIChhdWRpby0+b3V0X2RhdGEpKSB7Ci0JCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLQkJYXVkaW8tPm91dF9kYXRhID0gTlVMTDsKLQl9Ci0KLQlpZiAoYXVkaW8tPmRhdGEpIHsKLQkJaW9uX3VubWFwX2tlcm5lbChhdWRpby0+Y2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci0JCWF1ZGlvLT5kYXRhID0gTlVMTDsKLQl9Ci0JaW9uX2NsaWVudF9kZXN0cm95KGF1ZGlvLT5jbGllbnQpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGF1ZGlvX3FjZWxwX2luIHRoZV9hdWRpb19xY2VscF9pbjsKLQotc3RhdGljIGludCBhdWRxY2VscF9pbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpb19xY2VscF9pbiAqYXVkaW8gPSAmdGhlX2F1ZGlvX3FjZWxwX2luOwotCWludCByYzsKLQlpbnQgZW5jaWQ7Ci0JaW50IGRtYV9zaXplID0gMDsKLQlpbnQgbGVuID0gMDsKLQl1bnNpZ25lZCBsb25nIGlvbmZsYWcgPSAwOwotCWlvbl9waHlzX2FkZHJfdCBhZGRyID0gMDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50ID0gTlVMTDsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlpZiAoYXVkaW8tPm9wZW5lZCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJYXVkaW8tPm1vZGUgPSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTDsKLQkJZG1hX3NpemUgPSBOVF9ETUFTWjsKLQkJTU1fREJHKCJPcGVuZWQgZm9yIG5vbiB0dW5uZWwgbW9kZSBlbmNvZGluZ1xuIik7Ci0JfSBlbHNlIGlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlhdWRpby0+bW9kZSA9IE1TTV9BVURfRU5DX01PREVfVFVOTkVMOwotCQlkbWFfc2l6ZSA9IERNQVNaOwotCQlNTV9EQkcoIk9wZW5lZCBmb3IgdHVubmVsIG1vZGUgZW5jb2RpbmdcbiIpOwotCX0gZWxzZSB7Ci0JCU1NX0VSUigiSW52YWxpZCBtb2RlXG4iKTsKLQkJcmMgPSAtRUFDQ0VTOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogU2V0dGluZ3Mgd2lsbCBiZSByZS1jb25maWcgYXQgQVVESU9fU0VUX0NPTkZJRywKLQkgKiBidXQgYXQgbGVhc3Qgd2UgbmVlZCB0byBoYXZlIGluaXRpYWwgY29uZmlnCi0JICovCi0JYXVkaW8tPnNhbXBfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzgwMDAsCi0JYXVkaW8tPnNhbXBfcmF0ZV9pbmRleCA9IEFVRFJFQ19DTURfU0FNUF9SQVRFX0lORFhfODAwMDsKLQlhdWRpby0+Y2hhbm5lbF9tb2RlID0gQVVEUkVDX0NNRF9TVEVSRU9fTU9ERV9NT05POwotCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkKLQkJYXVkaW8tPmJ1ZmZlcl9zaXplID0gKFFDRUxQX0ZSQU1FX1NJWkUgKyAxNCk7Ci0JZWxzZQotCQlhdWRpby0+YnVmZmVyX3NpemUgPSBRQ0VMUF9GUkFNRV9TSVpFOwotCWF1ZGlvLT5lbmNfdHlwZSA9IEFVRFJFQ19DTURfVFlQRV8wX0lOREVYX1FDRUxQIHwgYXVkaW8tPm1vZGU7Ci0KLQlhdWRpby0+Y2ZnLmNkbWFfcmF0ZSA9IENETUFfUkFURV9GVUxMOwotCWF1ZGlvLT5jZmcubWluX2JpdF9yYXRlID0gQ0RNQV9SQVRFX0ZVTEw7Ci0JYXVkaW8tPmNmZy5tYXhfYml0X3JhdGUgPSBDRE1BX1JBVEVfRlVMTDsKLQotCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkgewotCQlyYyA9IGF1ZG1ncl9vcGVuKCZhdWRpby0+YXVkbWdyKTsKLQkJaWYgKHJjKQotCQkJZ290byBkb25lOwotCX0KLQotCWVuY2lkID0gYXVkcHJlcHJvY19hZW5jX2FsbG9jKGF1ZGlvLT5lbmNfdHlwZSwgJmF1ZGlvLT5tb2R1bGVfbmFtZSwKLQkJCSZhdWRpby0+cXVldWVfaWRzKTsKLQlpZiAoZW5jaWQgPCAwKSB7Ci0JCU1NX0VSUigiTm8gZnJlZSBlbmNvZGVyIGF2YWlsYWJsZVxuIik7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQlhdWRpby0+ZW5jX2lkID0gZW5jaWQ7Ci0KLQlyYyA9IG1zbV9hZHNwX2dldChhdWRpby0+bW9kdWxlX25hbWUsICZhdWRpby0+YXVkcmVjLAotCQkJICAgJmF1ZHJlY19xY2VscF9hZHNwX29wcywgYXVkaW8pOwotCWlmIChyYykgewotCQlhdWRwcmVwcm9jX2FlbmNfZnJlZShhdWRpby0+ZW5jX2lkKTsKLQkJZ290byBkb25lOwotCX0KLQotCWF1ZGlvLT5kc3BfY250ID0gMDsKLQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JYXVkaW8tPndmbHVzaCA9IDA7Ci0JYXVkaW8tPnJmbHVzaCA9IDA7Ci0JYXVkaW8tPmZsdXNoX2FjayA9IDA7Ci0KLQlhdWRxY2VscF9pbl9mbHVzaChhdWRpbyk7Ci0JYXVkcWNlbHBfb3V0X2ZsdXNoKGF1ZGlvKTsKLQotCWNsaWVudCA9IG1zbV9pb25fY2xpZW50X2NyZWF0ZShVSU5UX01BWCwgIkF1ZGlvX1FDRUxQX2luX2NsaWVudCIpOwotCWlmIChJU19FUlJfT1JfTlVMTChjbGllbnQpKSB7Ci0JCU1NX0VSUigiVW5hYmxlIHRvIGNyZWF0ZSBJT04gY2xpZW50XG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGNsaWVudF9jcmVhdGVfZXJyb3I7Ci0JfQotCWF1ZGlvLT5jbGllbnQgPSBjbGllbnQ7Ci0KLQlNTV9EQkcoImFsbG9jYXRpbmcgbWVtIHN6ID0gJWRcbiIsIGRtYV9zaXplKTsKLQloYW5kbGUgPSBpb25fYWxsb2MoY2xpZW50LCBkbWFfc2l6ZSwgU1pfNEssCi0JCUlPTl9IRUFQKElPTl9BVURJT19IRUFQX0lEKSwgMCk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGhhbmRsZSkpIHsKLQkJTU1fRVJSKCJVbmFibGUgdG8gY3JlYXRlIGFsbG9jYXRlIE8vUCBidWZmZXJzXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dHB1dF9idWZmX2FsbG9jX2Vycm9yOwotCX0KLQotCWF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUgPSBoYW5kbGU7Ci0KLQlyYyA9IGlvbl9waHlzKGNsaWVudCAsIGhhbmRsZSwgJmFkZHIsICZsZW4pOwotCWlmIChyYykgewotCQlNTV9FUlIoIk8vUCBidWZmZXJzOkludmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I7Ci0JfSBlbHNlIHsKLQkJTU1fSU5GTygiTy9QIGJ1ZmZlcnM6dmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCX0KLQlhdWRpby0+cGh5cyA9IChpbnQzMl90KWFkZHI7Ci0KLQlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKGNsaWVudCwgaGFuZGxlLCAmaW9uZmxhZyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiY291bGQgbm90IGdldCBmbGFncyBmb3IgdGhlIGhhbmRsZVxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRwdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I7Ci0JfQotCi0JYXVkaW8tPm1hcF92X3JlYWQgPSBpb25fbWFwX2tlcm5lbChjbGllbnQsIGhhbmRsZSk7Ci0JaWYgKElTX0VSUihhdWRpby0+bWFwX3ZfcmVhZCkpIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgbWFwIHJlYWQgYnVmZmVycyxmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQkoaW50KWF1ZGlvKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dHB1dF9idWZmX21hcF9lcnJvcjsKLQl9Ci0JYXVkaW8tPmRhdGEgPSBhdWRpby0+bWFwX3ZfcmVhZDsKLQlNTV9EQkcoInJlYWQgYnVmOiBwaHkgYWRkciAweCUwOHgga2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQlhdWRpby0+cGh5cywgKGludClhdWRpby0+ZGF0YSk7Ci0KLQlhdWRpby0+b3V0X2RhdGEgPSBOVUxMOwotCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkgewotCQlNTV9EQkcoImFsbG9jYXRpbmcgQlVGRkVSX1NJWkUgICVkXG4iLCBCVUZGRVJfU0laRSk7Ci0JCWhhbmRsZSA9IGlvbl9hbGxvYyhjbGllbnQsIEJVRkZFUl9TSVpFLAotCQkJCVNaXzRLLCBJT05fSEVBUChJT05fQVVESU9fSEVBUF9JRCksIDApOwotCQlpZiAoSVNfRVJSX09SX05VTEwoaGFuZGxlKSkgewotCQkJTU1fRVJSKCJVbmFibGUgdG8gY3JlYXRlIGFsbG9jYXRlIEkvUCBidWZmZXJzXG4iKTsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gaW5wdXRfYnVmZl9hbGxvY19lcnJvcjsKLQkJfQotCi0JCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IGhhbmRsZTsKLQotCQlyYyA9IGlvbl9waHlzKGNsaWVudCAsIGhhbmRsZSwgJmFkZHIsICZsZW4pOwotCQlpZiAocmMpIHsKLQkJCU1NX0VSUigiSS9QIGJ1ZmZlcnM6SW52YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBpbnB1dF9idWZmX2dldF9waHlzX2Vycm9yOwotCQl9IGVsc2UgewotCQkJTU1fSU5GTygiR290IHZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsCi0JCQkJKHVuc2lnbmVkIGludCkgbGVuKTsKLQkJfQotCQlhdWRpby0+b3V0X3BoeXMgPSAoaW50MzJfdClhZGRyOwotCi0JCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MoY2xpZW50LAotCQkJaGFuZGxlLCAmaW9uZmxhZyk7Ci0JCWlmIChyYykgewotCQkJTU1fRVJSKCJjb3VsZCBub3QgZ2V0IGZsYWdzIGZvciB0aGUgaGFuZGxlXG4iKTsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gaW5wdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I7Ci0JCX0KLQotCQlhdWRpby0+bWFwX3Zfd3JpdGUgPSBpb25fbWFwX2tlcm5lbChjbGllbnQsIGhhbmRsZSk7Ci0JCWlmIChJU19FUlIoYXVkaW8tPm1hcF92X3dyaXRlKSkgewotCQkJTU1fRVJSKCJjb3VsZCBub3QgbWFwIHdyaXRlIGJ1ZmZlcnNcbiIpOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBpbnB1dF9idWZmX21hcF9lcnJvcjsKLQkJfQotCQlhdWRpby0+b3V0X2RhdGEgPSBhdWRpby0+bWFwX3Zfd3JpdGU7Ci0JCU1NX0RCRygid3JpdGUgYnVmOiBwaHkgYWRkciAweCUwOHgga2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQkJCQkodW5zaWduZWQgaW50KWFkZHIsCi0JCQkJCSh1bnNpZ25lZCBpbnQpYXVkaW8tPm91dF9kYXRhKTsKLQotCQkvKiBJbml0aWFsaXplIGJ1ZmZlciAqLwotCQlhdWRpby0+b3V0WzBdLmRhdGEgPSBhdWRpby0+b3V0X2RhdGEgKyAwOwotCQlhdWRpby0+b3V0WzBdLmFkZHIgPSBhdWRpby0+b3V0X3BoeXMgKyAwOwotCQlhdWRpby0+b3V0WzBdLnNpemUgPSBPVVRfQlVGRkVSX1NJWkU7Ci0KLQkJYXVkaW8tPm91dFsxXS5kYXRhID0gYXVkaW8tPm91dF9kYXRhICsgT1VUX0JVRkZFUl9TSVpFOwotCQlhdWRpby0+b3V0WzFdLmFkZHIgPSBhdWRpby0+b3V0X3BoeXMgKyBPVVRfQlVGRkVSX1NJWkU7Ci0JCWF1ZGlvLT5vdXRbMV0uc2l6ZSA9IE9VVF9CVUZGRVJfU0laRTsKLQotCQlNTV9EQkcoImF1ZGlvLT5vdXRbMF0uZGF0YSA9ICVkICBhdWRpby0+b3V0WzFdLmRhdGEgPSAlZCIsCi0JCQkJKHVuc2lnbmVkIGludClhdWRpby0+b3V0WzBdLmRhdGEsCi0JCQkJKHVuc2lnbmVkIGludClhdWRpby0+b3V0WzFdLmRhdGEpOwotCQlhdWRpby0+bWZpZWxkID0gTlRfRlJBTUVfSEVBREVSX1NJWkU7Ci0JCWF1ZGlvLT5vdXRfZnJhbWVfY250Kys7Ci0JfQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOwotCWF1ZGlvLT5vcGVuZWQgPSAxOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLWlucHV0X2J1ZmZfbWFwX2Vycm9yOgotaW5wdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I6Ci1pbnB1dF9idWZmX2dldF9waHlzX2Vycm9yOgotCWlvbl9mcmVlKGNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLWlucHV0X2J1ZmZfYWxsb2NfZXJyb3I6Ci0JaW9uX3VubWFwX2tlcm5lbChjbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotb3V0cHV0X2J1ZmZfbWFwX2Vycm9yOgotb3V0cHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I6Ci1vdXRwdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I6Ci0JaW9uX2ZyZWUoY2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLW91dHB1dF9idWZmX2FsbG9jX2Vycm9yOgotCWlvbl9jbGllbnRfZGVzdHJveShjbGllbnQpOwotY2xpZW50X2NyZWF0ZV9lcnJvcjoKLQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHJlYyk7Ci0KLQlhdWRwcmVwcm9jX2FlbmNfZnJlZShhdWRpby0+ZW5jX2lkKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX3FjZWxwX2luX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGF1ZHFjZWxwX2luX29wZW4sCi0JLnJlbGVhc2UJPSBhdWRxY2VscF9pbl9yZWxlYXNlLAotCS5yZWFkCQk9IGF1ZHFjZWxwX2luX3JlYWQsCi0JLndyaXRlCQk9IGF1ZHFjZWxwX2luX3dyaXRlLAotCS5mc3luYwkJPSBhdWRxY2VscF9pbl9mc3luYywKLQkudW5sb2NrZWRfaW9jdGwJPSBhdWRxY2VscF9pbl9pb2N0bCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRxY2VscF9pbl9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fcWNlbHBfaW4iLAotCS5mb3BzCT0gJmF1ZGlvX3FjZWxwX2luX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRxY2VscF9pbl9pbml0KHZvaWQpCi17Ci0JbXV0ZXhfaW5pdCgmdGhlX2F1ZGlvX3FjZWxwX2luLmxvY2spOwotCW11dGV4X2luaXQoJnRoZV9hdWRpb19xY2VscF9pbi5yZWFkX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZ0aGVfYXVkaW9fcWNlbHBfaW4uZHNwX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoZV9hdWRpb19xY2VscF9pbi53YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfYXVkaW9fcWNlbHBfaW4ud2FpdF9lbmFibGUpOwotCW11dGV4X2luaXQoJnRoZV9hdWRpb19xY2VscF9pbi53cml0ZV9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfYXVkaW9fcWNlbHBfaW4ud3JpdGVfd2FpdCk7Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1ZHFjZWxwX2luX21pc2MpOwotfQotZGV2aWNlX2luaXRjYWxsKGF1ZHFjZWxwX2luX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fdm9pY2VfbGIuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX3ZvaWNlX2xiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3M2RlZmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fdm9pY2VfbGIuYworKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX3JwY3JvdXRlci5oPgotCi0jaW5jbHVkZSAiYXVkbWdyX25ldy5oIgotCi0jZGVmaW5lIFZPSUNFTE9PUEJBQ0tfUFJPRwkweDMwMDAwMEI4Ci0jZGVmaW5lIFZPSUNFTE9PUF9WRVJTCTB4MDAwMTAwMDEKLQotI2RlZmluZSBWT0lDRUxPT1BCQUNLX1NUQVJUX1BST0MgMgotI2RlZmluZSBWT0lDRUxPT1BCQUNLX1NUT1BfUFJPQyAzCi0KLSNkZWZpbmUgUlBDX1RZUEVfUkVRVUVTVCAwCi0jZGVmaW5lIFJQQ19UWVBFX1JFUExZIDEKLQotI2RlZmluZSBSUENfU1RBVFVTX0ZBSUxVUkUgMAotI2RlZmluZSBSUENfU1RBVFVTX1NVQ0NFU1MgMQotI2RlZmluZSBSUENfU1RBVFVTX1JFSkVDVCAxCi0KLSNkZWZpbmUgUlBDX0NPTU1PTl9IRFJfU1ogIChzaXplb2YodWludDMyX3QpICogMikKLSNkZWZpbmUgUlBDX1JFUVVFU1RfSERSX1NaIChzaXplb2Yoc3RydWN0IHJwY19yZXF1ZXN0X2hkcikpCi0jZGVmaW5lIFJQQ19SRVBMWV9IRFJfU1ogICAoc2l6ZW9mKHVpbnQzMl90KSAqIDMpCi0KLSNkZWZpbmUgTUFYX0xFTiAzMgotCi1zdHJ1Y3QgYXVkaW8gewotCXN0cnVjdCBtc21fcnBjX2VuZHBvaW50ICpycGNfZW5kcHQ7Ci0JdWludDMyX3QgcnBjX3Byb2c7Ci0JdWludDMyX3QgcnBjX3ZlcjsKLQl1aW50MzJfdCBycGNfc3RhdHVzOwotCXN0cnVjdCBhdWRtZ3IgYXVkbWdyOwotCi0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotCi0Jc3RydWN0IG11dGV4IGxvY2s7Ci0KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7Ci0KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCWludCBlbmFibGVkOwotCWludCB0aHJlYWRfZXhpdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXVkaW8gdGhlX2F1ZGlvOwotCi1zdGF0aWMgaW50IGF1ZGlvX3ZvaWNlX2xvb3BiYWNrX3RocmVhZCh2b2lkICpkYXRhKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBkYXRhOwotCXN0cnVjdCBycGNfcmVxdWVzdF9oZHIgKnJwY19oZHIgPSBOVUxMOwotCWludCBycGNfaGRyX2xlbjsKLQotCU1NX0RCRygiXG4iKTsKLQotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCWlmIChycGNfaGRyICE9IE5VTEwpIHsKLQkJCWtmcmVlKHJwY19oZHIpOwotCQkJcnBjX2hkciA9IE5VTEw7Ci0JCX0KLQotCQlpZiAoYXVkaW8tPnRocmVhZF9leGl0KQotCQkJYnJlYWs7Ci0KLQkJcnBjX2hkcl9sZW4gPSBtc21fcnBjX3JlYWQoYXVkaW8tPnJwY19lbmRwdCwKLQkJCQkJICAgICAgICh2b2lkICoqKSAmcnBjX2hkciwKLQkJCQkJICAgICAgIC0xLAotCQkJCQkgICAgICAgLTEpOwotCQlpZiAocnBjX2hkcl9sZW4gPCAwKSB7Ci0JCQlNTV9FUlIoIlJQQyByZWFkIGZhaWxlZCAlZFxuIiwgcnBjX2hkcl9sZW4pOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAocnBjX2hkcl9sZW4gPCBSUENfQ09NTU9OX0hEUl9TWikgewotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQl1aW50MzJfdCBycGNfdHlwZSA9IGJlMzJfdG9fY3B1KHJwY19oZHItPnR5cGUpOwotCQkJaWYgKHJwY190eXBlID09IFJQQ19UWVBFX1JFUExZKSB7Ci0JCQkJc3RydWN0IHJwY19yZXBseV9oZHIgKnJwY19yZXBseSA9Ci0JCQkJCSAodm9pZCAqKSBycGNfaGRyOwotCQkJCXVpbnQzMl90IHJlcGx5X3N0YXR1czsKLQotCQkJCXJlcGx5X3N0YXR1cyA9Ci0JCQkJCWJlMzJfdG9fY3B1KHJwY19yZXBseS0+cmVwbHlfc3RhdCk7Ci0KLQkJCQlpZiAocmVwbHlfc3RhdHVzID09IFJQQ19BQ0NFUFRTVEFUX1NVQ0NFU1MpCi0JCQkJCWF1ZGlvLT5ycGNfc3RhdHVzID0gXAotCQkJCQkJCVJQQ19TVEFUVVNfU1VDQ0VTUzsKLQkJCQllbHNlIHsKLQkJCQkJYXVkaW8tPnJwY19zdGF0dXMgPSBcCi0JCQkJCQkJUlBDX1NUQVRVU19SRUpFQ1Q7Ci0JCQkJCU1NX0VSUigiUlBDIHJlcGx5IHN0YXR1cyBkZW5pZWRcbiIpOwotCQkJCX0KLQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQl9IGVsc2UgewotCQkJCU1NX0VSUigiVW5leHBlY3RlZCBSUEMgdHlwZSAlZFxuIiwgcnBjX3R5cGUpOwotCQkJfQotCQl9Ci0JfQotCWtmcmVlKHJwY19oZHIpOwotCXJwY19oZHIgPSBOVUxMOwotCi0JTU1fREJHKCJBdWRpbyBWb2ljZSBMb29vcGJhY2sgdGhyZWFkIHN0b3BwZWRcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fdm9pY2VfbG9vcGJhY2tfc3RhcnQoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBhdWRtZ3JfY29uZmlnIGNmZzsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIHJwY19oZHI7Ci0KLQlNTV9EQkcoIlxuIik7Ci0KLQljZmcudHhfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzgwMDA7Ci0JY2ZnLnJ4X3JhdGUgPSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV84MDAwOwotCWNmZy5kZWZfbWV0aG9kID0gUlBDX0FVRF9ERUZfTUVUSE9EX1ZPSUNFOwotCWNmZy5jb2RlYyA9IFJQQ19BVURfREVGX0NPREVDX1ZPQ19DRE1BOwotCWNmZy5zbmRfbWV0aG9kID0gUlBDX1NORF9NRVRIT0RfVk9JQ0U7Ci0JcmMgPSBhdWRtZ3JfZW5hYmxlKCZhdWRpby0+YXVkbWdyLCAmY2ZnKTsKLQlpZiAocmMgPCAwKSB7Ci0JCU1NX0VSUigiYXVkbWdyIG9wZW4gZmFpbGVkLCBmcmVlaW5nIGluc3RhbmNlXG4iKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbWVtc2V0KCZycGNfaGRyLCAwLCBzaXplb2YocnBjX2hkcikpOwotCi0JbXNtX3JwY19zZXR1cF9yZXEoJnJwY19oZHIsCi0JCQlhdWRpby0+cnBjX3Byb2csCi0JCQlhdWRpby0+cnBjX3ZlciwKLQkJCVZPSUNFTE9PUEJBQ0tfU1RBUlRfUFJPQyk7Ci0KLQlhdWRpby0+cnBjX3N0YXR1cyA9IFJQQ19TVEFUVVNfRkFJTFVSRTsKLQlyYyA9IG1zbV9ycGNfd3JpdGUoYXVkaW8tPnJwY19lbmRwdCwKLQkJCSAgICZycGNfaGRyLAotCQkJICAgc2l6ZW9mKHJwY19oZHIpKTsKLQlpZiAocmMgPj0gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhdWRpby0+d2FpdCwKLQkJCShhdWRpby0+cnBjX3N0YXR1cyAhPSBSUENfU1RBVFVTX0ZBSUxVUkUpLAotCQkJMSAqIEhaKTsKLQkJaWYgKHJjID4gMCkgewotCQkJaWYgKGF1ZGlvLT5ycGNfc3RhdHVzICE9IFJQQ19TVEFUVVNfU1VDQ0VTUykgewotCQkJCU1NX0VSUigiU3RhcnQgbG9vcGJhY2sgZmFpbGVkICVkXG4iLCByYyk7Ci0JCQkJcmMgPSAtRUJVU1k7Ci0JCQl9IGVsc2UgewotCQkJCXJjID0gMDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiV2FpdCBldmVudCBmb3IgYWNxdWlyZSBmYWlsZWQgJWRcbiIsIHJjKTsKLQkJCXJjID0gLUVCVVNZOwotCQl9Ci0JfSBlbHNlIHsKLQkJYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQlNTV9FUlIoIlJQQyB3cml0ZSBmb3Igc3RhcnQgbG9vcGJhY2sgZmFpbGVkICVkXG4iLCByYyk7Ci0JCXJjID0gLUVCVVNZOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX3ZvaWNlX2xvb3BiYWNrX3N0b3Aoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBycGNfcmVxdWVzdF9oZHIgcnBjX2hkcjsKLQotCU1NX0RCRygiXG4iKTsKLQotCW1lbXNldCgmcnBjX2hkciwgMCwgc2l6ZW9mKHJwY19oZHIpKTsKLQotCW1zbV9ycGNfc2V0dXBfcmVxKCZycGNfaGRyLAotCQkJICBhdWRpby0+cnBjX3Byb2csCi0JCQkgIGF1ZGlvLT5ycGNfdmVyLAotCQkJICBWT0lDRUxPT1BCQUNLX1NUT1BfUFJPQyk7Ci0KLQlhdWRpby0+cnBjX3N0YXR1cyA9IFJQQ19TVEFUVVNfRkFJTFVSRTsKLQlhdWRpby0+dGhyZWFkX2V4aXQgPSAxOwotCXJjID0gbXNtX3JwY193cml0ZShhdWRpby0+cnBjX2VuZHB0LAotCQkJICAgJnJwY19oZHIsCi0JCQkgICBzaXplb2YocnBjX2hkcikpOwotCWlmIChyYyA+PSAwKSB7Ci0KLQkJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYXVkaW8tPndhaXQsCi0JCQkJKGF1ZGlvLT5ycGNfc3RhdHVzICE9IFJQQ19TVEFUVVNfRkFJTFVSRSksCi0JCQkJMSAqIEhaKTsKLQkJaWYgKHJjID4gMCkgewotCQkJTU1fREJHKCJXYWl0IGV2ZW50IGZvciByZWxlYXNlIHN1Y2NlZWRlZFxuIik7Ci0JCQlyYyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoIldhaXQgZXZlbnQgZm9yIHJlbGVhc2UgZmFpbGVkICVkXG4iLCByYyk7Ci0JCX0KLQl9IGVsc2UgewotCQlNTV9FUlIoIlJQQyB3cml0ZSBmb3IgcmVsZWFzZSBmYWlsZWQgJWRcbiIsIHJjKTsKLQl9Ci0KLQlhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fdm9pY2VfbG9vcGJhY2tfb3BlbihzdHJ1Y3QgYXVkaW8gKmF1ZGlvX2luZm8pCi17Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsKLQotCXJjID0gYXVkbWdyX29wZW4oJmF1ZGlvX2luZm8tPmF1ZG1ncik7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiYXVkbWdyIG9wZW4gZmFpbGVkLCBmcmVlaW5nIGluc3RhbmNlXG4iKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYXVkaW9faW5mby0+cnBjX2VuZHB0ID0gbXNtX3JwY19jb25uZWN0X2NvbXBhdGlibGUoVk9JQ0VMT09QQkFDS19QUk9HLAotCQkJVk9JQ0VMT09QX1ZFUlMsCi0JCQlNU01fUlBDX1VOSU5URVJSVVBUSUJMRSk7Ci0JaWYgKElTX0VSUihhdWRpb19pbmZvLT5ycGNfZW5kcHQpKSB7Ci0JCU1NX0VSUigiVk9JQ0UgTE9PUEJBQ0sgUlBDIGNvbm5lY3RcCi0JCQkJZmFpbGVkIHZlciAweCV4XG4iLAotCQkJCVZPSUNFTE9PUF9WRVJTKTsKLQkJcmMgPSBQVFJfRVJSKGF1ZGlvX2luZm8tPnJwY19lbmRwdCk7Ci0JCWF1ZGlvX2luZm8tPnJwY19lbmRwdCA9IE5VTEw7Ci0JCXJjID0gLUVJTlZBTDsKLQl9IGVsc2UgewotCQlNTV9EQkcoIlZPSUNFIExPT1BCQUNLIGNvbm5lY3Qgc3VjY2VlZGVkIHZlciAweCV4XG4iLAotCQkJCVZPSUNFTE9PUF9WRVJTKTsKLQkJYXVkaW9faW5mby0+dGhyZWFkX2V4aXQgPSAwOwotCQlhdWRpb19pbmZvLT50YXNrID0ga3RocmVhZF9ydW4oYXVkaW9fdm9pY2VfbG9vcGJhY2tfdGhyZWFkLAotCQkJCWF1ZGlvX2luZm8sCi0JCQkJImF1ZGlvX3ZvaWNlX2xvb3BiYWNrIik7Ci0JCWlmIChJU19FUlIoYXVkaW9faW5mby0+dGFzaykpIHsKLQkJCU1NX0VSUigidm9pY2UgbG9vcGJhY2sgdGhyZWFkIGNyZWF0ZSBmYWlsZWRcbiIpOwotCQkJcmMgPSBQVFJfRVJSKGF1ZGlvX2luZm8tPnRhc2spOwotCQkJYXVkaW9faW5mby0+dGFzayA9IE5VTEw7Ci0JCQltc21fcnBjX2Nsb3NlKGF1ZGlvX2luZm8tPnJwY19lbmRwdCk7Ci0JCQlhdWRpb19pbmZvLT5ycGNfZW5kcHQgPSBOVUxMOwotCQkJcmMgPSAtRUlOVkFMOwotCQl9Ci0JCWF1ZGlvX2luZm8tPnJwY19wcm9nID0gVk9JQ0VMT09QQkFDS19QUk9HOwotCQlhdWRpb19pbmZvLT5ycGNfdmVyID0gVk9JQ0VMT09QX1ZFUlM7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fdm9pY2VfbG9vcGJhY2tfY2xvc2Uoc3RydWN0IGF1ZGlvICphdWRpb19pbmZvKQotewotCU1NX0RCRygiXG4iKTsKLQltc21fcnBjX2Nsb3NlKGF1ZGlvX2luZm8tPnJwY19lbmRwdCk7Ci0JYXVkaW9faW5mby0+cnBjX2VuZHB0ID0gTlVMTDsKLQlhdWRtZ3JfY2xvc2UoJmF1ZGlvX2luZm8tPmF1ZG1ncik7Ci0JYXVkaW9faW5mby0+dGFzayA9IE5VTEw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGlvX3ZvaWNlX2xvb3BiYWNrX2RlYnVnX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCWNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkJc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQotewotCWNoYXIgbGJ1ZltNQVhfTEVOXTsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGNudCA+IChNQVhfTEVOIC0gMSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWVtc2V0KCZsYnVmWzBdLCAwLCBzaXplb2YobGJ1ZikpOwotCi0JcmMgPSBjb3B5X2Zyb21fdXNlcihsYnVmLCBidWYsIGNudCk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiVW5hYmxlIHRvIGNvcHkgZGF0YSBmcm9tIHVzZXIgc3BhY2VcbiIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlsYnVmW2NudF0gPSAnXDAnOwotCi0JaWYgKCFzdHJuY21wKCZsYnVmWzBdLCAiMSIsIGNudC0xKSkgewotCQltdXRleF9sb2NrKCZ0aGVfYXVkaW8ubG9jayk7Ci0JCWlmICghdGhlX2F1ZGlvLmVuYWJsZWQpIHsKLQkJCXJjID0gYXVkaW9fdm9pY2VfbG9vcGJhY2tfb3BlbigmdGhlX2F1ZGlvKTsKLQkJCWlmICghcmMpIHsKLQkJCQlyYyA9IGF1ZGlvX3ZvaWNlX2xvb3BiYWNrX3N0YXJ0KCZ0aGVfYXVkaW8pOwotCQkJCWlmIChyYyA8IDApIHsKLQkJCQkJdGhlX2F1ZGlvLmVuYWJsZWQgPSAwOwotCQkJCQlhdWRpb192b2ljZV9sb29wYmFja19jbG9zZSgmdGhlX2F1ZGlvKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aGVfYXVkaW8uZW5hYmxlZCA9IDE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCW11dGV4X3VubG9jaygmdGhlX2F1ZGlvLmxvY2spOwotCX0gZWxzZSBpZiAoIXN0cm5jbXAobGJ1ZiwgIjAiLCBjbnQtMSkpIHsKLQkJbXV0ZXhfbG9jaygmdGhlX2F1ZGlvLmxvY2spOwotCQlpZiAodGhlX2F1ZGlvLmVuYWJsZWQpIHsKLQkJCWF1ZGlvX3ZvaWNlX2xvb3BiYWNrX3N0b3AoJnRoZV9hdWRpbyk7Ci0JCQlhdWRpb192b2ljZV9sb29wYmFja19jbG9zZSgmdGhlX2F1ZGlvKTsKLQkJCXRoZV9hdWRpby5lbmFibGVkID0gMDsKLQkJfQotCQltdXRleF91bmxvY2soJnRoZV9hdWRpby5sb2NrKTsKLQl9IGVsc2UgewotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCi0JaWYgKHJjID09IDApIHsKLQkJcmMgPSBjbnQ7Ci0JfSBlbHNlIHsKLQkJTU1fSU5GTygicmMgPSAlZFxuIiwgcmMpOwotCQlNTV9JTkZPKCJcbldyb25nIGNvbW1hbmQ6IFVzZSA9PlxuIik7Ci0JCU1NX0lORk8oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCQlNTV9JTkZPKCJUbyBTdGFydCBMb29wYmFjazo6IGVjaG8gXCIxXCI+L3N5cy9rZXJuZWwvZGVidWcvXAotCQkJdm9pY2VfbG9vcGJhY2tcbiIpOwotCQlNTV9JTkZPKCJUbyBTdG9wIExvb3BiYWNrOjogZWNobyBcIjBcIj4vc3lzL2tlcm5lbC9kZWJ1Zy9cCi0JCQl2b2ljZV9sb29wYmFja1xuIik7Ci0JCU1NX0lORk8oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRpb192b2ljZV9sb29wYmFja19kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCXN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JTU1fREJHKCJBdWRpbyBWb2ljZWxvb3AgZGVidWdmcyBvcGVuZWRcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2b2ljZV9sb29wYmFja19kZWJ1Z19mb3BzID0gewotCS53cml0ZSA9IGF1ZGlvX3ZvaWNlX2xvb3BiYWNrX2RlYnVnX3dyaXRlLAotCS5vcGVuID0gYXVkaW9fdm9pY2VfbG9vcGJhY2tfZGVidWdfb3BlbiwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGlvX2luaXQodm9pZCkKLXsKLQlpbnQgcmMgPSAwOwotCW1lbXNldCgmdGhlX2F1ZGlvLCAwLCBzaXplb2YodGhlX2F1ZGlvKSk7Ci0KLQltdXRleF9pbml0KCZ0aGVfYXVkaW8ubG9jayk7Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfYXVkaW8ud2FpdCk7Ci0KLQl0aGVfYXVkaW8uZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgidm9pY2VfbG9vcGJhY2siLAotCQkJU19JRlJFRyB8IFNfSVJVR08sCi0JCQlOVUxMLAotCQkJTlVMTCwgJnZvaWNlX2xvb3BiYWNrX2RlYnVnX2ZvcHMpOwotCWlmIChJU19FUlIodGhlX2F1ZGlvLmRlbnRyeSkpCi0JCU1NX0VSUigiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOwotCi0JcmV0dXJuIHJjOwotfQotbGF0ZV9pbml0Y2FsbChhdWRpb19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX3ZvaWNlbWVtby5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fdm9pY2VtZW1vLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3Mjk1YjcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fdm9pY2VtZW1vLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5ODIgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fdm9pY2VtZW1vLmMKLSAqCi0gKiBWb2ljZSBNZW1vIGRldmljZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgYmFzZWQgaW4gcGFydCBvbiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19tcDMuYwotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBmaW5kIGl0IGF0IGh0dHA6Ly93d3cuZnNmLm9yZy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fdm9pY2VtZW1vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9ycGNyb3V0ZXIuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLSNpbmNsdWRlICJhdWRtZ3IuaCIKLQotI2RlZmluZSBTTkRfUFJPR19WRVJTICJyczMwMDAwMDAyOjB4MDAwMjAwMDEiCi0jZGVmaW5lIFNORF9QUk9HIDB4MzAwMDAwMDIKLSNkZWZpbmUgU05EX1ZFUlNfQ09NUCAweDAwMDIwMDAxCi0jZGVmaW5lIFNORF9WRVJTMl9DT01QIDB4MDAwMzAwMDEKLQotI2RlZmluZSBTTkRfVk9DX1JFQ19TVEFSVF9QUk9DICAgICAgICAgICAgICAgICAgMTkKLSNkZWZpbmUgU05EX1ZPQ19SRUNfU1RPUF9QUk9DICAgICAgICAgICAgICAgICAgIDIwCi0jZGVmaW5lIFNORF9WT0NfUkVDX1BBVVNFX1BST0MJCQkyMQotI2RlZmluZSBTTkRfVk9DX1JFQ19SRVNVTUVfUFJPQyAgICAgICAgICAgICAgICAgMjIKLSNkZWZpbmUgU05EX1ZPQ19SRUNfUFVUX0JVRl9QUk9DICAgICAgICAgICAgICAgIDIzCi0KLSNkZWZpbmUgU05EX1ZPQ19SRUNfQVZfU1lOQ19DQl9QVFJfUFJPQyAJOQotI2RlZmluZSBTTkRfVk9DX1JFQ19DQl9GVU5DX1RZUEVfUFJPQyAJCTEwCi0KLSNkZWZpbmUgUkVDX0NMSUVOVF9EQVRBCQkweDExMjIzMzQ0Ci0jZGVmaW5lIERBVEFfQ0JfRlVOQ19JRAkJMHgxMjM0NTY3OAotI2RlZmluZSBBVl9TWU5DX0NCX0ZVTkNfSUQJMHg4NzY1NDMyMQotI2RlZmluZSBDTElFTlRfREFUQQkJMHhhYWJiY2NkZAotCi0jZGVmaW5lIFJQQ19UWVBFX1JFUVVFU1QgMAotI2RlZmluZSBSUENfVFlQRV9SRVBMWSAxCi0KLSNkZWZpbmUgUlBDX1NUQVRVU19GQUlMVVJFIDAKLSNkZWZpbmUgUlBDX1NUQVRVU19TVUNDRVNTIDEKLQotI2RlZmluZSBSUENfVkVSU0lPTiAyCi0KLSNkZWZpbmUgUlBDX0NPTU1PTl9IRFJfU1ogIChzaXplb2YodWludDMyX3QpICogMikKLSNkZWZpbmUgUlBDX1JFUVVFU1RfSERSX1NaIChzaXplb2Yoc3RydWN0IHJwY19yZXF1ZXN0X2hkcikpCi0jZGVmaW5lIFJQQ19SRVBMWV9IRFJfU1ogICAoc2l6ZW9mKHVpbnQzMl90KSAqIDMpCi0jZGVmaW5lIFJQQ19SRVBMWV9TWiAgICAgICAoc2l6ZW9mKHVpbnQzMl90KSAqIDYpCi0KLSNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUgMzYgLyogUUNFTFAgLSAzNiwgQU1STkIgLSAzMiwgRVZSQyAtIDI0ICovCi0jZGVmaW5lIE1BWF9SRUNfQlVGX0NPVU5UIDUgLyogTWF4aW11bSBzdXBwb3J0ZWQgdm9jIHJlYyBidWZmZXJzICovCi0jZGVmaW5lIE1BWF9SRUNfQlVGX1NJWkUgKE1BWF9GUkFNRV9TSVpFICogMTApCi0jZGVmaW5lIE1BWF9WT0lDRU1FTU9fQlVGX1NJWkUgIFwKLQkoKE1BWF9SRUNfQlVGX1NJWkUpKk1BWF9SRUNfQlVGX0NPVU5UKSAvKiA1IGJ1ZmZlcnMgZm9yIDIwMG1zIGZyYW1lICovCi0jZGVmaW5lIE1TTV9BVURfQlVGRkVSX1VQREFURV9XQUlUX01TIDIwMDAKLQotZW51bSBycGNfdm9jX3JlY19zdGF0dXNfdHlwZSB7Ci0JUlBDX1ZPQ19SRUNfU1RBVF9TVUNDRVNTID0gMSwKLQlSUENfVk9DX1JFQ19TVEFUX0RPTkUgPSAyLAotCVJQQ19WT0NfUkVDX1NUQVRfQVVUT19TVE9QID0gNCwKLQlSUENfVk9DX1JFQ19TVEFUX1BBVVNFRCA9IDgsCi0JUlBDX1ZPQ19SRUNfU1RBVF9SRVNVTUVEID0gMTYsCi0JUlBDX1ZPQ19SRUNfU1RBVF9FUlJPUiA9IDMyLAotCVJQQ19WT0NfUkVDX1NUQVRfQlVGRkVSX0VSUk9SID0gNjQsCi0JUlBDX1ZPQ19SRUNfU1RBVF9JTlZBTElEX1BBUkFNID0gMTI4LAotCVJQQ19WT0NfUkVDX1NUQVRfSU5UX1RJTUUgPSAyNTYsCi0JUlBDX1ZPQ19SRUNfU1RBVF9EQVRBID0gNTEyLAotCVJQQ19WT0NfUkVDX1NUQVRfTk9UX1JFQURZID0gMTAyNCwKLQlSUENfVk9DX1JFQ19TVEFUX0lORk9STV9FVlJDID0gMjA0OCwKLQlSUENfVk9DX1JFQ19TVEFUX0lORk9STV8xM0sgPSA0MDk2LAotCVJQQ19WT0NfUkVDX1NUQVRfSU5GT1JNX0FNUiA9IDgxOTIsCi0JUlBDX1ZPQ19SRUNfU1RBVF9JTkZPUk1fTUFYID0gNjU1MzUKLX07Ci0KLXN0cnVjdCBycGNfc25kX3ZvY19yZWNfc3RhcnRfYXJncyB7Ci0JdWludDMyX3QgcGFyYW1fc3RhdHVzOyAvKiAxID0gdmFsaWQsIDAgPSBub3QgdmFsaWQgKi8KLQl1aW50MzJfdCByZWNfdHlwZTsKLQl1aW50MzJfdCByZWNfaW50ZXJ2YWxfbXM7Ci0JdWludDMyX3QgYXV0b19zdG9wX21zOwotCXVpbnQzMl90IGNhcGFiaWxpdHk7Ci0JdWludDMyX3QgbWF4X3JhdGU7Ci0JdWludDMyX3QgbWluX3JhdGU7Ci0JdWludDMyX3QgZnJhbWVfZm9ybWF0OwotCXVpbnQzMl90IGR0eF9lbmFibGU7Ci0JdWludDMyX3QgZGF0YV9yZXFfbXM7Ci0JdWludDMyX3QgcmVjX2NsaWVudF9kYXRhOwotCi0JdWludDMyX3QgY2JfZnVuY19pZDsKLQl1aW50MzJfdCBzeW5jX2NiX2Z1bmNfaWQ7Ci0JdWludDMyX3QgY2xpZW50X2RhdGE7Ci19OwotCi1zdHJ1Y3QgcnBjX3NuZF92b2NfcmVjX3B1dF9idWZfYXJncyB7Ci0JdWludDMyX3QgYnVmOwotCXVpbnQzMl90IG51bV9ieXRlczsKLX07Ci0KLXN0cnVjdCBzbmRfdm9jX3JlY19zdGFydF9tc2cgewotCXN0cnVjdCBycGNfcmVxdWVzdF9oZHIgaGRyOwotCXN0cnVjdCBycGNfc25kX3ZvY19yZWNfc3RhcnRfYXJncyBhcmdzOwotfTsKLQotc3RydWN0IHNuZF92b2NfcmVjX3B1dF9idWZfbXNnIHsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIGhkcjsKLQlzdHJ1Y3QgcnBjX3NuZF92b2NfcmVjX3B1dF9idWZfYXJncyBhcmdzOwotfTsKLQotc3RydWN0IHNuZF92b2NfcmVjX2F2X3N5bmNfY2JfZnVuY19kYXRhIHsKLQl1aW50MzJfdCBzeW5jX2NiX2Z1bmNfaWQ7Ci0JdWludDMyX3Qgc3RhdHVzOyAgLyogUG9pbnRlciBzdGF0dXMgKDEgPSB2YWxpZCwgMCAgPSBpbnZhbGlkKSAqLwotCXVpbnQzMl90IG51bV9zYW1wbGVzOwotCXVpbnQzMl90IHRpbWVfc3RhbXBbMl07Ci0JdWludDMyX3QgbG9zdF9zYW1wbGVzOwotCXVpbnQzMl90IGZyYW1lX2luZGV4OwotCXVpbnQzMl90IGNsaWVudF9kYXRhOwotfTsKLQotc3RydWN0IHNuZF92b2NfcmVjX2NiX2Z1bmNfZndfZGF0YSB7Ci0JdWludDMyX3QgZndfcHRyX3N0YXR1czsgLyogRlcgUG9pbnRlciBzdGF0dXMgKDE9dmFsaWQsMD1pbnZhbGlkKSAqLwotCXVpbnQzMl90IHJlY19idWZmZXJfc2l6ZTsKLQl1aW50MzJfdCBkYXRhW01BWF9SRUNfQlVGX1NJWkUvNF07Ci0JdWludDMyX3QgcmVjX2J1ZmZlcl9zaXplX2NvcHk7Ci0JdWludDMyX3QgcmVjX251bV9mcmFtZXM7IC8qIE51bWJlciBvZiB2b2ljZSBmcmFtZXMgKi8KLQl1aW50MzJfdCByZWNfbGVuZ3RoOyAvKiBWYWxpZCBkYXRhIGluIHJlY29yZCBidWZmZXIgPQotCQkJICAgICAgKiBkYXRhX3JlcV9tcyBhbW91bnQgb2YgZGF0YSAqLwotCXVpbnQzMl90IGNsaWVudF9kYXRhOyAvKiBBMTEgcmVjIGJ1ZmZlciBwb2ludGVyICovCi0JdWludDMyX3QgcndfcHRyX3N0YXR1czsgLyogUlcgUG9pbnRlciBzdGF0dXMgKDE9dmFsaWQsMD1pbnZhbGlkKSAqLwotfTsKLQotc3RydWN0IHNuZF92b2NfcmVjX2NiX2Z1bmNfcndfZGF0YSB7Ci0JdWludDMyX3QgZndfcHRyX3N0YXR1czsgLyogRlcgUG9pbnRlciBzdGF0dXMgKDE9dmFsaWQsMD1pbnZhbGlkKSAqLwotCXVpbnQzMl90IHJ3X3B0cl9zdGF0dXM7IC8qIFJXIFBvaW50ZXIgc3RhdHVzICgxPXZhbGlkLDA9aW52YWxpZCkgKi8KLQl1aW50MzJfdCByZWNfYnVmZmVyX3NpemU7Ci0JdWludDMyX3QgZGF0YVtNQVhfUkVDX0JVRl9TSVpFLzRdOwotCXVpbnQzMl90IHJlY19idWZmZXJfc2l6ZV9jb3B5OwotCXVpbnQzMl90IHJlY19udW1fZnJhbWVzOyAvKiBOdW1iZXIgb2Ygdm9pY2UgZnJhbWVzICovCi0JdWludDMyX3QgcmVjX2xlbmd0aDsgLyogVmFsaWQgZGF0YSBpbiByZWNvcmQgYnVmZmVyID0KLQkJCSAgICAgICogZGF0YV9yZXFfbXMgYW1vdW50IG9mIGRhdGEgKi8KLQl1aW50MzJfdCBjbGllbnRfZGF0YTsgLyogQTExIHJlYyBidWZmZXIgcG9pbnRlciAqLwotfTsKLQotc3RydWN0IHNuZF92b2NfcmVjX2RhdGFfY2JfZnVuY19kYXRhIHsKLQl1aW50MzJfdCBjYl9mdW5jX2lkOwotCXVpbnQzMl90IHN0YXR1czsgLyogUG9pbnRlciBzdGF0dXMgKDEgPSB2YWxpZCwgMCAgPSBpbnZhbGlkKSAqLwotCXVpbnQzMl90IHJlY19zdGF0dXM7Ci0KLQl1bmlvbiB7Ci0JCXN0cnVjdCBzbmRfdm9jX3JlY19jYl9mdW5jX2Z3X2RhdGEgZndfZGF0YTsKLQkJc3RydWN0IHNuZF92b2NfcmVjX2NiX2Z1bmNfcndfZGF0YSByd19kYXRhOwotCX0gcGt0OwotfTsKLQotc3RydWN0IGJ1ZmZlciB7Ci0Jdm9pZCAqZGF0YTsKLQl1bnNpZ25lZCBzaXplOwotCXVuc2lnbmVkIHVzZWQ7IC8qIFVzYWdlIGFjdHVhbCByZWNvcmRlZCBkYXRhICovCi0JdW5zaWduZWQgYWRkcjsKLQl1bnNpZ25lZCBudW1mcmFtZXM7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fdm9pY2VtZW1vIHsKLQl1aW50MzJfdCBieXRlX2NvdW50OyAvKiBQYXNzIHN0YXRpc3RpY3MgdG8gdXNlciBzcGFjZSBmb3IKLQkJCSAgICAgICogdGltZSBzdGFtcGluZyAqLwotCXVpbnQzMl90IGZyYW1lX2NvdW50OwotCi0JaW50IG9wZW5lZDsKLQlpbnQgZW5hYmxlZDsKLQlpbnQgcnVubmluZzsKLQlpbnQgc3RvcHBlZDsKLQlpbnQgcGF1c2VfcmVzdW1lOwotCi0JdWludDMyX3QgcnBjX3Byb2c7Ci0JdWludDMyX3QgcnBjX3ZlcjsKLQl1aW50MzJfdCBycGNfeGlkOwotCXVpbnQzMl90IHJwY19zdGF0dXM7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggcmVhZF9sb2NrOwotCXN0cnVjdCBtdXRleCBkc3BfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkX3dhaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQotCXN0cnVjdCBidWZmZXIgaW5bTUFYX1JFQ19CVUZfQ09VTlRdOwotCWNoYXIgKnJlY19idWZfcHRyOwotCWRtYV9hZGRyX3QgcGh5czsKLQl1aW50MzJfdCByZWNfYnVmX3NpemU7Ci0JdWludDhfdCByZWFkX25leHQ7CS8qIGluZGV4IHRvIGlucHV0IGJ1ZmZlcnMgdG8gYmUgcmVhZCBuZXh0ICovCi0JdWludDhfdCBmaWxsX25leHQ7CS8qIGluZGV4IHRvIGJ1ZmZlciB0aGF0IHNob3VsZCBiZSBmaWxsZWQgYXMKLQkJCQkgKiBkYXRhIGNvbWVzIGZyb20gQTkgKi8KLQotCXN0cnVjdCBhdWRtZ3IgYXVkbWdyOwotCi0Jc3RydWN0IG1zbV9hdWRpb192b2ljZW1lbW9fY29uZmlnIHZvaWNlbWVtb19jZmc7Ci0KLQlzdHJ1Y3QgbXNtX3JwY19lbmRwb2ludCAqc25kZXB0OwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXVkaW9fdm9pY2VtZW1vIHRoZV9hdWRpb192b2ljZW1lbW87Ci0KLXN0YXRpYyBpbnQgYXVkdm9pY2VtZW1vX3ZhbGlkYXRlX3Vzcl9jb25maWcoCi0JCXN0cnVjdCBtc21fYXVkaW9fdm9pY2VtZW1vX2NvbmZpZyAqY29uZmlnKQotewotCWludCByYyA9IC0xOyAvKiBlcnJvciAqLwotCi0JaWYgKGNvbmZpZy0+cmVjX3R5cGUgIT0gUlBDX1ZPQ19SRUNfRk9SV0FSRCAmJgotCQljb25maWctPnJlY190eXBlICE9IFJQQ19WT0NfUkVDX1JFVkVSU0UgJiYKLQkJY29uZmlnLT5yZWNfdHlwZSAhPSBSUENfVk9DX1JFQ19CT1RIKQotCQlnb3RvIGRvbmU7Ci0KLQkvKiBRQ0VMUCwgRVZSQywgQU1SLU5CIG9ubHkgKi8KLQlpZiAoY29uZmlnLT5jYXBhYmlsaXR5ICE9IFJQQ19WT0NfQ0FQX0lTNzMzICYmCi0JCWNvbmZpZy0+Y2FwYWJpbGl0eSAhPSBSUENfVk9DX0NBUF9JUzEyNyAmJgotCQljb25maWctPmNhcGFiaWxpdHkgIT0gUlBDX1ZPQ19DQVBfQU1SKQotCQlnb3RvIGRvbmU7Ci0KLQkvKiBRQ1AsIEFNUiBmb3JtYXQgc3VwcG9ydGVkICovCi0JaWYgKChjb25maWctPmZyYW1lX2Zvcm1hdCAhPSBSUENfVk9DX1BCX05BVElWRV9RQ1ApICYmCi0JCShjb25maWctPmZyYW1lX2Zvcm1hdCAhPSBSUENfVk9DX1BCX0FNUikpCi0JCWdvdG8gZG9uZTsKLQotCWlmICgoY29uZmlnLT5mcmFtZV9mb3JtYXQgPT0gUlBDX1ZPQ19QQl9BTVIpICYmCi0JCShjb25maWctPmNhcGFiaWxpdHkgIT0gUlBDX1ZPQ19DQVBfQU1SKSkKLQkJZ290byBkb25lOwotCi0JLyogVG8gbWFrZSBzdXJlLCBtYXgga2VybmVsIGJ1ZiBzaXplIG1hdGNoZXMKLQkgKiB3aXRoIG1heCBkYXRhIHJlcXVlc3QgdGltZSAqLwotCWlmIChjb25maWctPmRhdGFfcmVxX21zID4gKChNQVhfUkVDX0JVRl9TSVpFL01BWF9GUkFNRV9TSVpFKSoyMCkpCi0JCWdvdG8gZG9uZTsKLQotCXJjID0gMDsKLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBhdWR2b2ljZW1lbW9fZmx1c2hfYnVmKHN0cnVjdCBhdWRpb192b2ljZW1lbW8gKmF1ZGlvKQotewotCXVpbnQ4X3QgaW5kZXg7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhfUkVDX0JVRl9DT1VOVDsgaW5kZXgrKykKLQkJYXVkaW8tPmluW2luZGV4XS51c2VkID0gMDsKLQotCWF1ZGlvLT5yZWFkX25leHQgPSAwOwotCW11dGV4X2xvY2soJmF1ZGlvLT5kc3BfbG9jayk7Ci0JYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+ZHNwX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBhdWR2b2ljZW1lbW9faW9wb3J0X3Jlc2V0KHN0cnVjdCBhdWRpb192b2ljZW1lbW8gKmF1ZGlvKQotewotCS8qIE1ha2Ugc3VyZSByZWFkL3dyaXRlIHRocmVhZCBhcmUgZnJlZSBmcm9tCi0JICogc2xlZXAgYW5kIGtub3dpbmcgdGhhdCBzeXN0ZW0gaXMgbm90IGFibGUKLQkgKiB0byBwcm9jZXNzIGlvIHJlcXVlc3QgYXQgdGhlIG1vbWVudAotCSAqLwotCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCWF1ZHZvaWNlbWVtb19mbHVzaF9idWYoYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWR2b2ljZW1lbW9fZW5hYmxlKHN0cnVjdCBhdWRpb192b2ljZW1lbW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRtZ3JfY29uZmlnIGNmZzsKLQlzdHJ1Y3Qgc25kX3ZvY19yZWNfcHV0X2J1Zl9tc2cgYm1zZzsKLQlzdHJ1Y3Qgc25kX3ZvY19yZWNfc3RhcnRfbXNnIG1zZzsKLQl1aW50OF90IGluZGV4OwotCXVpbnQzMl90IG9mZnNldCA9IDA7Ci0JaW50IHJjOwotCi0JaWYgKGF1ZGlvLT5lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCS8qIENvZGVjIC8gbWV0aG9kIGNvbmZpZ3VyZSB0byBhdWRtZ3IgY2xpZW50ICovCi0JY2ZnLnR4X3JhdGUgPSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV84MDAwOwotCWNmZy5yeF9yYXRlID0gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfTk9ORTsKLQljZmcuZGVmX21ldGhvZCA9IFJQQ19BVURfREVGX01FVEhPRF9SRUNPUkQ7Ci0KLQlpZiAoYXVkaW8tPnZvaWNlbWVtb19jZmcuY2FwYWJpbGl0eSA9PSBSUENfVk9DX0NBUF9JUzczMykKLQkJY2ZnLmNvZGVjID0gUlBDX0FVRF9ERUZfQ09ERUNfVk9DXzEzSzsKLQllbHNlIGlmIChhdWRpby0+dm9pY2VtZW1vX2NmZy5jYXBhYmlsaXR5ID09IFJQQ19WT0NfQ0FQX0lTMTI3KQotCQljZmcuY29kZWMgPSBSUENfQVVEX0RFRl9DT0RFQ19WT0NfRVZSQzsKLQllbHNlCi0JCWNmZy5jb2RlYyA9IFJQQ19BVURfREVGX0NPREVDX1ZPQ19BTVI7IC8qIFJQQ19WT0NfQ0FQX0FNUiAqLwotCi0JY2ZnLnNuZF9tZXRob2QgPSBSUENfU05EX01FVEhPRF9WT0lDRTsKLQlyYyA9IGF1ZG1ncl9lbmFibGUoJmF1ZGlvLT5hdWRtZ3IsICZjZmcpOwotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JLyogQ29uZmlndXJlIFZPQyBSZWMgYnVmZmVyICovCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX1JFQ19CVUZfQ09VTlQ7IGluZGV4KyspIHsKLQkJYXVkaW8tPmluW2luZGV4XS5kYXRhID0gYXVkaW8tPnJlY19idWZfcHRyICsgb2Zmc2V0OwotCQlhdWRpby0+aW5baW5kZXhdLmFkZHIgPSBhdWRpby0+cGh5cyArIG9mZnNldDsKLQkJYXVkaW8tPmluW2luZGV4XS5zaXplID0gYXVkaW8tPnJlY19idWZfc2l6ZTsKLQkJYXVkaW8tPmluW2luZGV4XS51c2VkID0gMDsKLQkJYXVkaW8tPmluW2luZGV4XS5udW1mcmFtZXMgPSAwOwotCQlvZmZzZXQgKz0gYXVkaW8tPnJlY19idWZfc2l6ZTsKLQkJYm1zZy5hcmdzLmJ1ZiA9ICh1aW50MzJfdCkgYXVkaW8tPmluW2luZGV4XS5kYXRhOwotCQlibXNnLmFyZ3MubnVtX2J5dGVzID0gY3B1X3RvX2JlMzIoYXVkaW8tPmluW2luZGV4XS5zaXplKTsKLQkJTU1fREJHKCJyZWNfYnVmX3B0cj0weCU4eCwgcmVjX2J1Zl9zaXplID0gMHglOHhcbiIsCi0JCQkJYm1zZy5hcmdzLmJ1ZiwgYm1zZy5hcmdzLm51bV9ieXRlcyk7Ci0KLQkJbXNtX3JwY19zZXR1cF9yZXEoJmJtc2cuaGRyLCBhdWRpby0+cnBjX3Byb2csIGF1ZGlvLT5ycGNfdmVyLAotCQkJCVNORF9WT0NfUkVDX1BVVF9CVUZfUFJPQyk7Ci0JCWF1ZGlvLT5ycGNfeGlkID0gYm1zZy5oZHIueGlkOwotCQlhdWRpby0+cnBjX3N0YXR1cyA9IFJQQ19TVEFUVVNfRkFJTFVSRTsKLQkJbXNtX3JwY193cml0ZShhdWRpby0+c25kZXB0LCAmYm1zZywgc2l6ZW9mKGJtc2cpKTsKLQkJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYXVkaW8tPndhaXQsCi0JCQlhdWRpby0+cnBjX3N0YXR1cyAhPSBSUENfU1RBVFVTX0ZBSUxVUkUsIDEgKiBIWik7Ci0JCWlmIChyYyA9PSAwKQotCQkJZ290byBlcnI7Ci0JfQotCi0KLQkvKiBTdGFydCBSZWNvcmRpbmcgKi8KLQltc2cuYXJncy5wYXJhbV9zdGF0dXMgPSBjcHVfdG9fYmUzMigweDAwMDAwMDAxKTsKLQltc2cuYXJncy5yZWNfdHlwZSA9IGNwdV90b19iZTMyKGF1ZGlvLT52b2ljZW1lbW9fY2ZnLnJlY190eXBlKTsKLQltc2cuYXJncy5yZWNfaW50ZXJ2YWxfbXMgPQotCQljcHVfdG9fYmUzMihhdWRpby0+dm9pY2VtZW1vX2NmZy5yZWNfaW50ZXJ2YWxfbXMpOwotCW1zZy5hcmdzLmF1dG9fc3RvcF9tcyA9IGNwdV90b19iZTMyKGF1ZGlvLT52b2ljZW1lbW9fY2ZnLmF1dG9fc3RvcF9tcyk7Ci0JbXNnLmFyZ3MuY2FwYWJpbGl0eSA9IGNwdV90b19iZTMyKGF1ZGlvLT52b2ljZW1lbW9fY2ZnLmNhcGFiaWxpdHkpOwotCW1zZy5hcmdzLm1heF9yYXRlID0gY3B1X3RvX2JlMzIoYXVkaW8tPnZvaWNlbWVtb19jZmcubWF4X3JhdGUpOwotCW1zZy5hcmdzLm1pbl9yYXRlID0gY3B1X3RvX2JlMzIoYXVkaW8tPnZvaWNlbWVtb19jZmcubWluX3JhdGUpOwotCW1zZy5hcmdzLmZyYW1lX2Zvcm1hdCA9IGNwdV90b19iZTMyKGF1ZGlvLT52b2ljZW1lbW9fY2ZnLmZyYW1lX2Zvcm1hdCk7Ci0JbXNnLmFyZ3MuZHR4X2VuYWJsZSA9IGNwdV90b19iZTMyKGF1ZGlvLT52b2ljZW1lbW9fY2ZnLmR0eF9lbmFibGUpOwotCW1zZy5hcmdzLmRhdGFfcmVxX21zID0gY3B1X3RvX2JlMzIoYXVkaW8tPnZvaWNlbWVtb19jZmcuZGF0YV9yZXFfbXMpOwotCW1zZy5hcmdzLnJlY19jbGllbnRfZGF0YSA9IGNwdV90b19iZTMyKFJFQ19DTElFTlRfREFUQSk7Ci0JbXNnLmFyZ3MuY2JfZnVuY19pZCA9IGNwdV90b19iZTMyKERBVEFfQ0JfRlVOQ19JRCk7Ci0JbXNnLmFyZ3Muc3luY19jYl9mdW5jX2lkID0gY3B1X3RvX2JlMzIoQVZfU1lOQ19DQl9GVU5DX0lEKTsKLQltc2cuYXJncy5jbGllbnRfZGF0YSA9IGNwdV90b19iZTMyKENMSUVOVF9EQVRBKTsKLQotCW1zbV9ycGNfc2V0dXBfcmVxKCZtc2cuaGRyLCBhdWRpby0+cnBjX3Byb2csIGF1ZGlvLT5ycGNfdmVyLAotCQkJU05EX1ZPQ19SRUNfU1RBUlRfUFJPQyk7Ci0KLQlhdWRpby0+cnBjX3hpZCA9IG1zZy5oZHIueGlkOwotCWF1ZGlvLT5ycGNfc3RhdHVzID0gUlBDX1NUQVRVU19GQUlMVVJFOwotCW1zbV9ycGNfd3JpdGUoYXVkaW8tPnNuZGVwdCwgJm1zZywgc2l6ZW9mKG1zZykpOwotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQlhdWRpby0+cnBjX3N0YXR1cyAhPSBSUENfU1RBVFVTX0ZBSUxVUkUsIDEgKiBIWik7Ci0JaWYgKHJjID09IDApCi0JCWdvdG8gZXJyOwotCi0JYXVkaW8tPnJwY194aWQgPSAwOwotCWF1ZGlvLT5lbmFibGVkID0gMTsKLQlyZXR1cm4gMDsKLQotZXJyOgotCWF1ZGlvLT5ycGNfeGlkID0gMDsKLQlhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0JTU1fRVJSKCJGYWlsXG4iKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWR2b2ljZW1lbW9fZGlzYWJsZShzdHJ1Y3QgYXVkaW9fdm9pY2VtZW1vICphdWRpbykKLXsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIHJoZHI7Ci0JaW50IHJjID0gMDsKLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJbXNtX3JwY19zZXR1cF9yZXEoJnJoZHIsIGF1ZGlvLT5ycGNfcHJvZywgYXVkaW8tPnJwY192ZXIsCi0JCQkJU05EX1ZPQ19SRUNfU1RPUF9QUk9DKTsKLQkJcmMgPSBtc21fcnBjX3dyaXRlKGF1ZGlvLT5zbmRlcHQsICZyaGRyLCBzaXplb2YocmhkcikpOwotCQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhdWRpby0+d2FpdCwgYXVkaW8tPnN0b3BwZWQgPT0gMSwKLQkJCQkxICogSFopOwotCQlpZiAocmMgPT0gMCkKLQkJCWF1ZGlvLT5zdG9wcGVkID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JCWF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogUlBDIFJlcGx5IEdlbmVyYXRvciAqLwotc3RhdGljIHZvaWQgcnBjX3JlcGx5KHN0cnVjdCBtc21fcnBjX2VuZHBvaW50ICplcHQsIHVpbnQzMl90IHhpZCkKLXsKLQlpbnQgcmMgPSAwOwotCXVpbnQ4X3QgcmVwbHlfYnVmW3NpemVvZihzdHJ1Y3QgcnBjX3JlcGx5X2hkcildOwotCXN0cnVjdCBycGNfcmVwbHlfaGRyICpyZXBseSA9IChzdHJ1Y3QgcnBjX3JlcGx5X2hkciAqKXJlcGx5X2J1ZjsKLQotCU1NX0RCRygiaW5zaWRlXG4iKTsKLQlyZXBseS0+eGlkID0gY3B1X3RvX2JlMzIoeGlkKTsKLQlyZXBseS0+dHlwZSA9IGNwdV90b19iZTMyKFJQQ19UWVBFX1JFUExZKTsgLyogcmVwbHkgKi8KLQlyZXBseS0+cmVwbHlfc3RhdCA9IGNwdV90b19iZTMyKFJQQ01TR19SRVBMWVNUQVRfQUNDRVBURUQpOwotCi0JcmVwbHktPmRhdGEuYWNjX2hkci5hY2NlcHRfc3RhdCA9IGNwdV90b19iZTMyKFJQQ19BQ0NFUFRTVEFUX1NVQ0NFU1MpOwotCXJlcGx5LT5kYXRhLmFjY19oZHIudmVyZl9mbGF2b3IgPSAwOwotCXJlcGx5LT5kYXRhLmFjY19oZHIudmVyZl9sZW5ndGggPSAwOwotCi0JcmMgPSBtc21fcnBjX3dyaXRlKGVwdCwgcmVwbHlfYnVmLCBzaXplb2YocmVwbHlfYnVmKSk7Ci0JaWYgKHJjIDwgMCkKLQkJTU1fRVJSKCJjb3VsZCBub3Qgd3JpdGUgUlBDIHJlc3BvbnNlOiAlZFxuIiwgcmMpOwotfQotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX3JwY19yZXF1ZXN0KHVpbnQzMl90IHByb2MsIHVpbnQzMl90IHhpZCwKLQkJdm9pZCAqZGF0YSwgaW50IGxlbiwgdm9pZCAqcHJpdmF0ZSkKLXsKLQlzdHJ1Y3QgYXVkaW9fdm9pY2VtZW1vICphdWRpbyA9IHByaXZhdGU7Ci0KLQlNTV9EQkcoImluc2lkZVxuIik7Ci0JLyogU2VuZGluZyBBY2sgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QKLQkgKiB0byBtYWtlIHN1cmUgQTkgZ2V0IHJlc3BvbnNlIGltbWVkaWF0ZQotCSAqIEhvd2V2ZXIsIGlmIHRoZXJlIGlzIHZhbGlkYXRpb24gb2YgcmVxdWVzdCBwbGFubmVkCi0JICogbWF5IGJlIG1vdmUgdGhpcyByZXBseSBBY2sgYXQgdGhlIGVuZCAqLwotCXJwY19yZXBseShhdWRpby0+c25kZXB0LCB4aWQpOwotCXN3aXRjaCAocHJvYykgewotCWNhc2UgU05EX1ZPQ19SRUNfQVZfU1lOQ19DQl9QVFJfUFJPQzogewotCQlNTV9EQkcoIkFWIFN5bmMgQ0I6ZnVuY19pZD0weCU4eCxzdGF0dXM9MHgleFxuIiwKLQkJCWJlMzJfdG9fY3B1KCggXAotCQkJKHN0cnVjdCBzbmRfdm9jX3JlY19hdl9zeW5jX2NiX2Z1bmNfZGF0YSAqKVwKLQkJCWRhdGEpLT5zeW5jX2NiX2Z1bmNfaWQpLFwKLQkJCWJlMzJfdG9fY3B1KCggXAotCQkJKHN0cnVjdCBzbmRfdm9jX3JlY19hdl9zeW5jX2NiX2Z1bmNfZGF0YSAqKVwKLQkJCWRhdGEpLT5zdGF0dXMpKTsKLQkJYnJlYWs7Ci0JCX0KLQljYXNlIFNORF9WT0NfUkVDX0NCX0ZVTkNfVFlQRV9QUk9DOiB7Ci0JCXN0cnVjdCBzbmRfdm9jX3JlY19kYXRhX2NiX2Z1bmNfZGF0YSAqZGF0YWNiX2RhdGEKLQkJCT0gKHZvaWQgKikoZGF0YSk7Ci0JCXN0cnVjdCBzbmRfdm9jX3JlY19wdXRfYnVmX21zZyBibXNnOwotCQl1aW50MzJfdCByZWNfc3RhdHVzID0gYmUzMl90b19jcHUoZGF0YWNiX2RhdGEtPnJlY19zdGF0dXMpOwotCi0JCU1NX0RCRygiRGF0YSBDQjpmdW5jX2lkPTB4JTh4LHN0YXR1cz0weCV4LFwKLQkJCXJlY19zdGF0dXM9MHgleFxuIiwKLQkJCWJlMzJfdG9fY3B1KGRhdGFjYl9kYXRhLT5jYl9mdW5jX2lkKSxcCi0JCQliZTMyX3RvX2NwdShkYXRhY2JfZGF0YS0+c3RhdHVzKSxcCi0JCQliZTMyX3RvX2NwdShkYXRhY2JfZGF0YS0+cmVjX3N0YXR1cykpOwotCi0JCS8qIERhdGEgcmVjb3JkZWQgKi8KLQkJaWYgKChyZWNfc3RhdHVzID09IFJQQ19WT0NfUkVDX1NUQVRfREFUQSkgfHwKLQkJKHJlY19zdGF0dXMgPT0gUlBDX1ZPQ19SRUNfU1RBVF9ET05FKSkgewotCQkJaWYgKGRhdGFjYl9kYXRhLT5wa3QuZndfZGF0YS5md19wdHJfc3RhdHVzICYmCi0JCQliZTMyX3RvX2NwdShkYXRhY2JfZGF0YS0+cGt0LmZ3X2RhdGEucmVjX2xlbmd0aCkgJiYKLQkJCWJlMzJfdG9fY3B1KGRhdGFjYl9kYXRhLT5wa3QuZndfZGF0YS5yZWNfbGVuZ3RoKQotCQkJPD0gTUFYX1JFQ19CVUZfU0laRSkgewotCi0JCQkJTU1fREJHKCJDb3B5IEZXIGxpbms6cmVjX2J1Zl9zaXplIFwKLQkJCQk9IDB4JTA4eCwgcmVjX2xlbmd0aD0weCUwOHhcbiIsCi0JCQkJYmUzMl90b19jcHUoIFwKLQkJCQlkYXRhY2JfZGF0YS0+cGt0LmZ3X2RhdGEuIFwKLQkJCQlyZWNfYnVmZmVyX3NpemVfY29weSksXAotCQkJCWJlMzJfdG9fY3B1KGRhdGFjYl9kYXRhLT5wa3QuZndfZGF0YS4gXAotCQkJCXJlY19sZW5ndGgpKTsKLQotCQkJCW11dGV4X2xvY2soJmF1ZGlvLT5kc3BfbG9jayk7Ci0JCQkJbWVtY3B5KGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5kYXRhLCBcCi0JCQkJCSYoZGF0YWNiX2RhdGEtPnBrdC5md19kYXRhLmRhdGFbMF0pLCBcCi0JCQkJYmUzMl90b19jcHUoCi0JCQkJZGF0YWNiX2RhdGEtPnBrdC5md19kYXRhLnJlY19sZW5ndGgpKTsKLQkJCQlhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0udXNlZCA9Ci0JCQkJYmUzMl90b19jcHUoCi0JCQkJCWRhdGFjYl9kYXRhLT5wa3QuZndfZGF0YS5yZWNfbGVuZ3RoKTsKLQkJCQlhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0ubnVtZnJhbWVzID0KLQkJCQliZTMyX3RvX2NwdSgKLQkJCQlkYXRhY2JfZGF0YS0+cGt0LmZ3X2RhdGEucmVjX251bV9mcmFtZXMpOwotCQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmRzcF9sb2NrKTsKLQkJCX0gZWxzZSBpZiAoZGF0YWNiX2RhdGEtPnBrdC5yd19kYXRhLnJ3X3B0cl9zdGF0dXMgJiYKLQkJCWJlMzJfdG9fY3B1KGRhdGFjYl9kYXRhLT5wa3QucndfZGF0YS5yZWNfbGVuZ3RoKSAmJgotCQkJYmUzMl90b19jcHUoZGF0YWNiX2RhdGEtPnBrdC5yd19kYXRhLnJlY19sZW5ndGgpCi0JCQk8PSBNQVhfUkVDX0JVRl9TSVpFKSB7Ci0KLQkJCQlNTV9EQkcoIkNvcHkgUlcgbGluazpyZWNfYnVmX3NpemUgXAotCQkJCT0weCUwOHgsIHJlY19sZW5ndGg9MHglMDh4XG4iLAotCQkJCWJlMzJfdG9fY3B1KCBcCi0JCQkJZGF0YWNiX2RhdGEtPnBrdC5yd19kYXRhLiBcCi0JCQkJcmVjX2J1ZmZlcl9zaXplX2NvcHkpLFwKLQkJCQliZTMyX3RvX2NwdShkYXRhY2JfZGF0YS0+cGt0LnJ3X2RhdGEuIFwKLQkJCQlyZWNfbGVuZ3RoKSk7Ci0KLQkJCQltdXRleF9sb2NrKCZhdWRpby0+ZHNwX2xvY2spOwotCQkJCW1lbWNweShhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uZGF0YSwgXAotCQkJCSYoZGF0YWNiX2RhdGEtPnBrdC5yd19kYXRhLmRhdGFbMF0pLCBcCi0JCQkJYmUzMl90b19jcHUoCi0JCQkJCWRhdGFjYl9kYXRhLT5wa3QucndfZGF0YS5yZWNfbGVuZ3RoKSk7Ci0JCQkJYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnVzZWQgPQotCQkJCWJlMzJfdG9fY3B1KAotCQkJCQlkYXRhY2JfZGF0YS0+cGt0LnJ3X2RhdGEucmVjX2xlbmd0aCk7Ci0JCQkJYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLm51bWZyYW1lcyA9Ci0JCQkJYmUzMl90b19jcHUoCi0JCQkJZGF0YWNiX2RhdGEtPnBrdC5yd19kYXRhLnJlY19udW1fZnJhbWVzKTsKLQkJCQltdXRleF91bmxvY2soJmF1ZGlvLT5kc3BfbG9jayk7Ci0JCQl9IGVsc2UgewotCQkJCU1NX0VSUigiRlc6IHB0cl9zdGF0dXMgJWQsIHJlY19sZW5ndGg9MHglMDh4LCIKLQkJCQkiUlc6IHB0cl9zdGF0dXMgJWQsIHJlY19sZW5ndGg9MHglMDh4XG4iLAotCQkJCWRhdGFjYl9kYXRhLT5wa3QuZndfZGF0YS5md19wdHJfc3RhdHVzLCBcCi0JCQkJYmUzMl90b19jcHUoIFwKLQkJCQlkYXRhY2JfZGF0YS0+cGt0LmZ3X2RhdGEucmVjX2xlbmd0aCksIFwKLQkJCQlkYXRhY2JfZGF0YS0+cGt0LnJ3X2RhdGEucndfcHRyX3N0YXR1cywgXAotCQkJCWJlMzJfdG9fY3B1KCBcCi0JCQkJZGF0YWNiX2RhdGEtPnBrdC5yd19kYXRhLnJlY19sZW5ndGgpKTsKLQkJCX0KLQkJCWlmIChyZWNfc3RhdHVzICE9IFJQQ19WT0NfUkVDX1NUQVRfRE9ORSkgewotCQkJCS8qIE5vdCBlbmQgb2YgcmVjb3JkICovCi0JCQkJYm1zZy5hcmdzLmJ1ZiA9IFwKLQkJCQkodWludDMyX3QpIGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5kYXRhOwotCQkJCWJtc2cuYXJncy5udW1fYnl0ZXMgPSBcCi0JCQkJYmUzMl90b19jcHUoYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnNpemUpOwotCi0JCQkJaWYgKCsrYXVkaW8tPmZpbGxfbmV4dCA9PSAgTUFYX1JFQ19CVUZfQ09VTlQpCi0JCQkJCWF1ZGlvLT5maWxsX25leHQgPSAwOwotCi0JCQkJbXNtX3JwY19zZXR1cF9yZXEoJmJtc2cuaGRyLCBhdWRpby0+cnBjX3Byb2csCi0JCQkJYXVkaW8tPnJwY192ZXIsIFNORF9WT0NfUkVDX1BVVF9CVUZfUFJPQyk7Ci0KLQkJCQltc21fcnBjX3dyaXRlKGF1ZGlvLT5zbmRlcHQsICZibXNnLAotCQkJCXNpemVvZihibXNnKSk7Ci0KLQkJCQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogSW5kaWNhdGlvbiByZWNvcmQgc3RvcHBlZCBncmFjZWZ1bGx5ICovCi0JCQkJTU1fREJHKCJFbmQgT2YgVm9pY2UgUmVjb3JkXG4iKTsKLQkJCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJfQotCQl9IGVsc2UgaWYgKHJlY19zdGF0dXMgPT0gUlBDX1ZPQ19SRUNfU1RBVF9QQVVTRUQpIHsKLQkJCU1NX0RCRygiIFZvaWNlIFJlY29yZCBQQVVTRURcbiIpOwotCQkJYXVkaW8tPnBhdXNlX3Jlc3VtZSA9IDE7Ci0JCX0gZWxzZSBpZiAocmVjX3N0YXR1cyA9PSBSUENfVk9DX1JFQ19TVEFUX1JFU1VNRUQpIHsKLQkJCU1NX0RCRygiIFZvaWNlIFJlY29yZCBSRVNVTUVEXG4iKTsKLQkJCWF1ZGlvLT5wYXVzZV9yZXN1bWUgPSAwOwotCQl9IGVsc2UgaWYgKChyZWNfc3RhdHVzID09IFJQQ19WT0NfUkVDX1NUQVRfRVJST1IpIHx8Ci0JCShyZWNfc3RhdHVzID09IFJQQ19WT0NfUkVDX1NUQVRfSU5WQUxJRF9QQVJBTSkgfHwKLQkJKHJlY19zdGF0dXMgPT0gUlBDX1ZPQ19SRUNfU1RBVF9CVUZGRVJfRVJST1IpKQotCQkJTU1fRVJSKCJlcnJvciByZWNvcmRpbmcgPTB4JTh4XG4iLAotCQkJCXJlY19zdGF0dXMpOwotCQllbHNlIGlmIChyZWNfc3RhdHVzID09IFJQQ19WT0NfUkVDX1NUQVRfSU5UX1RJTUUpCi0JCQlNTV9EQkcoIkZyYW1lcyByZWNvcmRlZCBtYXRjaGVzIGludGVydmFsIFwKLQkJCQkJY2FsbGJhY2sgdGltZVxuIik7Ci0JCWVsc2UgaWYgKHJlY19zdGF0dXMgPT0gUlBDX1ZPQ19SRUNfU1RBVF9BVVRPX1NUT1ApIHsKLQkJCU1NX0RCRygiIFZvaWNlIFJlY29yZCBBVVRPIFNUT1BcbiIpOwotCQkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQkJd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JCQlhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCQlhdWR2b2ljZW1lbW9faW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCQl9Ci0JCQlicmVhazsKLQkJfQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiVU5LTk9XTiBQUk9DICwgcHJvYyA9IDB4JTh4IFxuIiwgcHJvYyk7Ci0JfQotfQotCi1zdGF0aWMgaW50IHZvaWNlbWVtb19ycGNfdGhyZWFkKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGF1ZGlvX3ZvaWNlbWVtbyAqYXVkaW8gPSBkYXRhOwotCXN0cnVjdCBycGNfcmVxdWVzdF9oZHIgKmhkciA9IE5VTEw7Ci0JdWludDMyX3QgdHlwZTsKLQlpbnQgbGVuOwotCi0JTU1fREJHKCJzdGFydFxuIik7Ci0KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQlrZnJlZShoZHIpOwotCQloZHIgPSBOVUxMOwotCi0JCWxlbiA9IG1zbV9ycGNfcmVhZChhdWRpby0+c25kZXB0LCAodm9pZCAqKikgJmhkciwgLTEsIC0xKTsKLQkJTU1fREJHKCJycGNfcmVhZCBsZW4gPSAweCV4XG4iLCBsZW4pOwotCQlpZiAobGVuIDwgMCkgewotCQkJTU1fRVJSKCJycGMgcmVhZCBmYWlsZWQgKCVkKVxuIiwgbGVuKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChsZW4gPCBSUENfQ09NTU9OX0hEUl9TWikKLQkJCWNvbnRpbnVlOwotCQl0eXBlID0gYmUzMl90b19jcHUoaGRyLT50eXBlKTsKLQkJaWYgKHR5cGUgPT0gUlBDX1RZUEVfUkVQTFkpIHsKLQkJCXN0cnVjdCBycGNfcmVwbHlfaGRyICpyZXAgPSAodm9pZCAqKSBoZHI7Ci0JCQl1aW50MzJfdCBzdGF0dXM7Ci0JCQlpZiAobGVuIDwgUlBDX1JFUExZX0hEUl9TWikKLQkJCQljb250aW51ZTsKLQkJCXN0YXR1cyA9IGJlMzJfdG9fY3B1KHJlcC0+cmVwbHlfc3RhdCk7Ci0JCQlpZiAoc3RhdHVzID09IFJQQ01TR19SRVBMWVNUQVRfQUNDRVBURUQpIHsKLQkJCQlzdGF0dXMgPQotCQkJCWJlMzJfdG9fY3B1KHJlcC0+ZGF0YS5hY2NfaGRyLmFjY2VwdF9zdGF0KTsKLQotCQkJCS8qIENvbmZpcm0gbWFqb3IgUlBDIHN1Y2Nlc3MgZHVyaW5nIG9wZW4qLwotCQkJCWlmICgoYXVkaW8tPmVuYWJsZWQgPT0gMCkgJiYKLQkJCQkJKHN0YXR1cyA9PSBSUENfQUNDRVBUU1RBVF9TVUNDRVNTKSAmJgotCQkJCQkoYXVkaW8tPnJwY194aWQgPT0gcmVwLT54aWQpKSB7Ci0JCQkJCQlhdWRpby0+cnBjX3N0YXR1cyA9IFwKLQkJCQkJCQlSUENfU1RBVFVTX1NVQ0NFU1M7Ci0JCQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJfQotCQkJCU1NX0RCRygicnBjX3JlcGx5IHN0YXR1cyAweCU4eFxuIiwgc3RhdHVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTU1fRVJSKCJycGNfcmVwbHkgZGVuaWVkIVxuIik7Ci0JCQl9Ci0JCQkvKiBwcm9jZXNzIHJlcGx5ICovCi0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmICh0eXBlID09IFJQQ19UWVBFX1JFUVVFU1QpIHsKLQkJCWlmIChsZW4gPCBSUENfUkVRVUVTVF9IRFJfU1opCi0JCQkJY29udGludWU7Ci0JCQlwcm9jZXNzX3JwY19yZXF1ZXN0KGJlMzJfdG9fY3B1KGhkci0+cHJvY2VkdXJlKSwKLQkJCQkJCWJlMzJfdG9fY3B1KGhkci0+eGlkKSwKLQkJCQkJCSh2b2lkICopIChoZHIgKyAxKSwKLQkJCQkJCWxlbiAtIHNpemVvZigqaGRyKSwKLQkJCQkJCWF1ZGlvKTsKLQkJfSBlbHNlCi0JCQlNTV9FUlIoIlVuZXhwZWN0ZWQgdHlwZSAoJWQpXG4iLCB0eXBlKTsKLQl9Ci0JTU1fREJHKCJzdG9wXG4iKTsKLQlrZnJlZShoZHIpOwotCWhkciA9IE5VTEw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkZXZpY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgbG9uZyBhdWRpb192b2ljZW1lbW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGF1ZGlvX3ZvaWNlbWVtbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX1NUQVRTKSB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdGF0cykpOwotCQltdXRleF9sb2NrKCZhdWRpby0+ZHNwX2xvY2spOwotCQlzdGF0cy5ieXRlX2NvdW50ID0gYXVkaW8tPmJ5dGVfY291bnQ7Ci0JCXN0YXRzLnNhbXBsZV9jb3VudCA9IGF1ZGlvLT5mcmFtZV9jb3VudDsKLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+ZHNwX2xvY2spOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCQlNTV9EQkcoIkFVRElPX1NUQVJUXG4iKTsKLQkJCWF1ZGlvLT5ieXRlX2NvdW50ID0gMDsKLQkJCWF1ZGlvLT5mcmFtZV9jb3VudCA9IDA7Ci0JCQlpZiAoYXVkaW8tPnZvaWNlbWVtb19jZmcucmVjX3R5cGUgIT0gUlBDX1ZPQ19SRUNfTk9ORSkKLQkJCQlyYyA9IGF1ZHZvaWNlbWVtb19lbmFibGUoYXVkaW8pOwotCQkJZWxzZQotCQkJCXJjID0gLUVJTlZBTDsKLQkJCU1NX0RCRygiQVVESU9fU1RBUlQgcmMgJWRcbiIsIHJjKTsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19TVE9QOiB7Ci0JCQlNTV9EQkcoIkFVRElPX1NUT1BcbiIpOwotCQkJcmMgPSBhdWR2b2ljZW1lbW9fZGlzYWJsZShhdWRpbyk7Ci0JCQlhdWR2b2ljZW1lbW9faW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJCU1NX0RCRygiQVVESU9fU1RPUCByYyAlZFxuIiwgcmMpOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6IHsKLQkJCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNmZzsKLQkJCU1NX0RCRygiQVVESU9fR0VUX0NPTkZJR1xuIik7Ci0JCQljZmcuYnVmZmVyX3NpemUgPSBhdWRpby0+cmVjX2J1Zl9zaXplOwotCQkJY2ZnLmJ1ZmZlcl9jb3VudCA9IE1BWF9SRUNfQlVGX0NPVU5UOwotCQkJY2ZnLnNhbXBsZV9yYXRlID0gODAwMDsgLyogVm9pY2UgRW5jb2RlciB3b3JrcyBvbiA4aywKLQkJCQkJCSAqIE1vbm8gKi8KLQkJCWNmZy5jaGFubmVsX2NvdW50ID0gMTsKLQkJCWNmZy50eXBlID0gMDsKLQkJCWNmZy51bnVzZWRbMF0gPSAwOwotCQkJY2ZnLnVudXNlZFsxXSA9IDA7Ci0JCQljZmcudW51c2VkWzJdID0gMDsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmY2ZnLCBzaXplb2YoY2ZnKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQkJCU1NX0RCRygiQVVESU9fR0VUX0NPTkZJRyByYyAlZFxuIiwgcmMpOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX0dFVF9WT0lDRU1FTU9fQ09ORklHOiB7Ci0JCQlNTV9EQkcoIkFVRElPX0dFVF9WT0lDRU1FTU9fQ09ORklHXG4iKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZhdWRpby0+dm9pY2VtZW1vX2NmZywKLQkJCQlzaXplb2YoYXVkaW8tPnZvaWNlbWVtb19jZmcpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQkJTU1fREJHKCJBVURJT19HRVRfVk9JQ0VNRU1PX0NPTkZJRyByYyAlZFxuIiwgcmMpOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX1NFVF9WT0lDRU1FTU9fQ09ORklHOiB7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX3ZvaWNlbWVtb19jb25maWcgdXNyX2NvbmZpZzsKLQkJCU1NX0RCRygiQVVESU9fU0VUX1ZPSUNFTUVNT19DT05GSUdcbiIpOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkJKCZ1c3JfY29uZmlnLCAodm9pZCAqKWFyZywKLQkJCQlzaXplb2YodXNyX2NvbmZpZykpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGF1ZHZvaWNlbWVtb192YWxpZGF0ZV91c3JfY29uZmlnKCZ1c3JfY29uZmlnKQotCQkJCQk9PSAwKSB7Ci0JCQkJYXVkaW8tPnZvaWNlbWVtb19jZmcgPSB1c3JfY29uZmlnOwotCQkJCXJjID0gMDsKLQkJCX0gZWxzZQotCQkJCXJjID0gLUVJTlZBTDsKLQkJCU1NX0RCRygiQVVESU9fU0VUX1ZPSUNFTUVNT19DT05GSUcgcmMgJWRcbiIsIHJjKTsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19QQVVTRTogewotCQkJc3RydWN0IHJwY19yZXF1ZXN0X2hkciByaGRyOwotCQkJTU1fREJHKCJBVURJT19QQVVTRVxuIik7Ci0JCQlpZiAoYXJnID09IDEpCi0JCQkJbXNtX3JwY19zZXR1cF9yZXEoJnJoZHIsIGF1ZGlvLT5ycGNfcHJvZywKLQkJCQlhdWRpby0+cnBjX3ZlciwgU05EX1ZPQ19SRUNfUEFVU0VfUFJPQyk7Ci0JCQllbHNlCi0JCQkJbXNtX3JwY19zZXR1cF9yZXEoJnJoZHIsIGF1ZGlvLT5ycGNfcHJvZywKLQkJCQlhdWRpby0+cnBjX3ZlciwgU05EX1ZPQ19SRUNfUkVTVU1FX1BST0MpOwotCi0JCQlyYyA9IG1zbV9ycGNfd3JpdGUoYXVkaW8tPnNuZGVwdCwgJnJoZHIsIHNpemVvZihyaGRyKSk7Ci0JCQlNTV9EQkcoIkFVRElPX1BBVVNFIGV4aXQgJWRcbiIsCXJjKTsKLQkJCWJyZWFrOwotCQl9Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJJT0NUTCAlZCBub3Qgc3VwcG9ydGVkXG4iLCBjbWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkaW9fdm9pY2VtZW1vX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpb192b2ljZW1lbW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlpbnQgcmMgPSAwOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0KLQlNTV9EQkcoImJ1ZmYgcmVhZCA9MHglOHggXG4iLCBjb3VudCk7Ci0KLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPnJlYWRfd2FpdCwKLQkJCShhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCA+IDApIHx8Ci0JCQkoYXVkaW8tPnN0b3BwZWQpLAotCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0JVRkZFUl9VUERBVEVfV0FJVF9NUykpOwotCi0JCWlmIChyYyA9PSAwKSB7Ci0JCQlyYyA9IC1FVElNRURPVVQ7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChyYyA8IDApCi0JCQlicmVhazsKLQotCQlpZiAoYXVkaW8tPnN0b3BwZWQpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvdW50IDwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQpIHsKLQkJCS8qIFJlYWQgbXVzdCBoYXBwZW4gaW4gZnJhbWUgYm91bmRhcnkuIFNpbmNlIGRyaXZlciBkb2VzCi0JCQkgKiBub3Qgc3BsaXQgZnJhbWVzLCByZWFkIGNvdW50IG11c3QgYmUgZ3JlYXRlciBvcgotCQkJICogZXF1YWwgdG8gc2l6ZSBvZiBleGlzdGluZyBmcmFtZXMgdG8gY29weQotCQkJICovCi0JCQlNTV9EQkcoInJlYWQgbm90IGluIGZyYW1lIGJvdW5kYXJ5XG4iKTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJbXV0ZXhfbG9jaygmYXVkaW8tPmRzcF9sb2NrKTsKLQkJCWRtYV9jb2hlcmVudF9wb3N0X29wcygpOwotCQkJaWYgKGNvcHlfdG9fdXNlcgotCQkJCShidWYsIGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS5kYXRhLAotCQkJCWF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkKSkgewotCQkJCU1NX0VSUigiaW52YWxpZCBhZGRyICV4IFxuIiwgKHVuc2lnbmVkIGludClidWYpOwotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQltdXRleF91bmxvY2soJmF1ZGlvLT5kc3BfbG9jayk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljb3VudCAtPSBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZDsKLQkJCWF1ZGlvLT5ieXRlX2NvdW50ICs9IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkOwotCQkJYXVkaW8tPmZyYW1lX2NvdW50ICs9Ci0JCQlhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0ubnVtZnJhbWVzOwotCQkJYnVmICs9IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkOwotCQkJYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQgPSAwOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+ZHNwX2xvY2spOwotCQkJaWYgKCgrK2F1ZGlvLT5yZWFkX25leHQpID09IE1BWF9SRUNfQlVGX0NPVU5UKQotCQkJCWF1ZGlvLT5yZWFkX25leHQgPSAwOwotCQkJaWYgKGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkID09IDApCi0JCQkJYnJlYWs7ICAvKiBObyBkYXRhIHJlYWR5IGF0IHRoaXMgbW9tZW50Ci0JCQkJCSAqIEV4aXQgd2hpbGUgbG9vcCB0byBwcmV2ZW50Ci0JCQkJCSAqIG91dHB1dCB0aHJlYWQgc2xlZXAgdG9vIGxvbmcKLQkJCQkJICovCi0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlpZiAoYnVmID4gc3RhcnQpCi0JCXJjID0gYnVmIC0gc3RhcnQ7Ci0JTU1fREJHKCJleGl0IHJldHVybiA9MHglOHhcbiIsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGlvX3ZvaWNlbWVtb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fdm9pY2VtZW1vX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvX3ZvaWNlbWVtbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkdm9pY2VtZW1vX2Rpc2FibGUoYXVkaW8pOwotCWF1ZHZvaWNlbWVtb19mbHVzaF9idWYoYXVkaW8pOwotCWF1ZGlvLT5vcGVuZWQgPSAwOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX3ZvaWNlbWVtb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpb192b2ljZW1lbW8gKmF1ZGlvID0gJnRoZV9hdWRpb192b2ljZW1lbW87Ci0JaW50IHJjOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWlmIChhdWRpby0+b3BlbmVkKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmMgPSBhdWRtZ3Jfb3BlbigmYXVkaW8tPmF1ZG1ncik7Ci0KLQlpZiAocmMpCi0JCWdvdG8gZG9uZTsKLQotCS8qU2V0IGRlZmF1bHQgcGFyYW0gdG8gTm9uZSovCi0JbWVtc2V0KCZhdWRpby0+dm9pY2VtZW1vX2NmZywgMCwgc2l6ZW9mKGF1ZGlvLT52b2ljZW1lbW9fY2ZnKSk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQlhdWRpby0+b3BlbmVkID0gMTsKLQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JcmMgPSAwOwotZG9uZToKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGF1ZGlvX3ZvaWNlbWVtb19vcGVuLAotCS5yZWxlYXNlCT0gYXVkaW9fdm9pY2VtZW1vX3JlbGVhc2UsCi0JLnJlYWQJCT0gYXVkaW9fdm9pY2VtZW1vX3JlYWQsCi0JLndyaXRlCQk9IGF1ZGlvX3ZvaWNlbWVtb193cml0ZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBhdWRpb192b2ljZW1lbW9faW9jdGwsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb192b2ljZW1lbW9fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX3ZvaWNlbWVtbyIsCi0JLmZvcHMJPSAmYXVkaW9fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgYXVkaW9fdm9pY2VtZW1vX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjOwotCi0JaWYgKChwZGV2LT5pZCAhPSAoU05EX1ZFUlNfQ09NUCAmIFJQQ19WRVJTSU9OX01BSk9SX01BU0spKSAmJgotCSAgICAocGRldi0+aWQgIT0gKFNORF9WRVJTMl9DT01QICYgUlBDX1ZFUlNJT05fTUFKT1JfTUFTSykpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2luaXQoJnRoZV9hdWRpb192b2ljZW1lbW8ubG9jayk7Ci0JbXV0ZXhfaW5pdCgmdGhlX2F1ZGlvX3ZvaWNlbWVtby5yZWFkX2xvY2spOwotCW11dGV4X2luaXQoJnRoZV9hdWRpb192b2ljZW1lbW8uZHNwX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoZV9hdWRpb192b2ljZW1lbW8ucmVhZF93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfYXVkaW9fdm9pY2VtZW1vLndhaXQpOwotCi0JdGhlX2F1ZGlvX3ZvaWNlbWVtby5yZWNfYnVmX3B0ciA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLAotCQkJCQlNQVhfVk9JQ0VNRU1PX0JVRl9TSVpFLAotCQkJCQkmdGhlX2F1ZGlvX3ZvaWNlbWVtby5waHlzLCBHRlBfS0VSTkVMKTsKLQlpZiAodGhlX2F1ZGlvX3ZvaWNlbWVtby5yZWNfYnVmX3B0ciA9PSBOVUxMKSB7Ci0JCU1NX0VSUigiZXJyb3IgYWxsb2NhdGluZyBtZW1vcnlcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCXJldHVybiByYzsKLQl9Ci0JdGhlX2F1ZGlvX3ZvaWNlbWVtby5yZWNfYnVmX3NpemUgPSBNQVhfUkVDX0JVRl9TSVpFOwotCU1NX0RCRygicmVjX2J1Zl9wdHIgPSAweCU4eCwgcGh5cyA9IDB4JTh4IFxuIiwKLQkJKHVpbnQzMl90KSB0aGVfYXVkaW9fdm9pY2VtZW1vLnJlY19idWZfcHRyLCBcCi0JCXRoZV9hdWRpb192b2ljZW1lbW8ucGh5cyk7Ci0KLQl0aGVfYXVkaW9fdm9pY2VtZW1vLnNuZGVwdCA9IG1zbV9ycGNfY29ubmVjdF9jb21wYXRpYmxlKFNORF9QUk9HLAotCQkJCQlTTkRfVkVSU19DT01QLCBNU01fUlBDX1VOSU5URVJSVVBUSUJMRSk7Ci0JaWYgKElTX0VSUih0aGVfYXVkaW9fdm9pY2VtZW1vLnNuZGVwdCkpIHsKLQkJTU1fREJHKCJjb25uZWN0IGZhaWxlZCB3aXRoIFZFUlMgXAotCQkJCT0gJXgsIHRyeWluZyBhZ2FpbiB3aXRoIGFub3RoZXIgQVBJXG4iLAotCQkJCVNORF9WRVJTX0NPTVApOwotCQl0aGVfYXVkaW9fdm9pY2VtZW1vLnNuZGVwdCA9IG1zbV9ycGNfY29ubmVjdF9jb21wYXRpYmxlKAotCQkJCQlTTkRfUFJPRywgU05EX1ZFUlMyX0NPTVAsCi0JCQkJCU1TTV9SUENfVU5JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKElTX0VSUih0aGVfYXVkaW9fdm9pY2VtZW1vLnNuZGVwdCkpIHsKLQkJCXJjID0gUFRSX0VSUih0aGVfYXVkaW9fdm9pY2VtZW1vLnNuZGVwdCk7Ci0JCQl0aGVfYXVkaW9fdm9pY2VtZW1vLnNuZGVwdCA9IE5VTEw7Ci0JCQlNTV9FUlIoIkZhaWxlZCB0byBjb25uZWN0IHRvIHNuZCBzdmNcbiIpOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJdGhlX2F1ZGlvX3ZvaWNlbWVtby5ycGNfdmVyID0gU05EX1ZFUlMyX0NPTVA7Ci0JfSBlbHNlCi0JCXRoZV9hdWRpb192b2ljZW1lbW8ucnBjX3ZlciA9IFNORF9WRVJTX0NPTVA7Ci0KLQl0aGVfYXVkaW9fdm9pY2VtZW1vLnRhc2sgPSBrdGhyZWFkX3J1bih2b2ljZW1lbW9fcnBjX3RocmVhZCwKLQkJCQkJJnRoZV9hdWRpb192b2ljZW1lbW8sICJ2b2ljZW1lbW9fcnBjIik7Ci0JaWYgKElTX0VSUih0aGVfYXVkaW9fdm9pY2VtZW1vLnRhc2spKSB7Ci0JCXJjID0gUFRSX0VSUih0aGVfYXVkaW9fdm9pY2VtZW1vLnRhc2spOwotCQl0aGVfYXVkaW9fdm9pY2VtZW1vLnRhc2sgPSBOVUxMOwotCQltc21fcnBjX2Nsb3NlKHRoZV9hdWRpb192b2ljZW1lbW8uc25kZXB0KTsKLQkJdGhlX2F1ZGlvX3ZvaWNlbWVtby5zbmRlcHQgPSBOVUxMOwotCQlNTV9FUlIoIkZhaWxlZCB0byBjcmVhdGUgdm9pY2VtZW1vX3JwYyB0YXNrXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCXRoZV9hdWRpb192b2ljZW1lbW8ucnBjX3Byb2cgPSBTTkRfUFJPRzsKLQotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb192b2ljZW1lbW9fbWlzYyk7Ci1lcnI6Ci0JZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgTUFYX1ZPSUNFTUVNT19CVUZfU0laRSwKLQkJdGhlX2F1ZGlvX3ZvaWNlbWVtby5yZWNfYnVmX3B0ciwKLQkJdGhlX2F1ZGlvX3ZvaWNlbWVtby5waHlzKTsKLQl0aGVfYXVkaW9fdm9pY2VtZW1vLnJlY19idWZfcHRyID0gTlVMTDsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdWRpb192b2ljZW1lbW9fZXhpdCh2b2lkKQotewotCS8qIENsb3NlIHRoZSBSUEMgY29ubmVjdGlvbiB0byBtYWtlIHRocmVhZCB0byBjb21lb3V0ICovCi0JbXNtX3JwY19jbG9zZSh0aGVfYXVkaW9fdm9pY2VtZW1vLnNuZGVwdCk7Ci0JdGhlX2F1ZGlvX3ZvaWNlbWVtby5zbmRlcHQgPSBOVUxMOwotCWt0aHJlYWRfc3RvcCh0aGVfYXVkaW9fdm9pY2VtZW1vLnRhc2spOwotCXRoZV9hdWRpb192b2ljZW1lbW8udGFzayA9IE5VTEw7Ci0JaWYgKHRoZV9hdWRpb192b2ljZW1lbW8ucmVjX2J1Zl9wdHIpCi0JCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIE1BWF9WT0lDRU1FTU9fQlVGX1NJWkUsCi0JCQl0aGVfYXVkaW9fdm9pY2VtZW1vLnJlY19idWZfcHRyLAotCQkJdGhlX2F1ZGlvX3ZvaWNlbWVtby5waHlzKTsKLQl0aGVfYXVkaW9fdm9pY2VtZW1vLnJlY19idWZfcHRyID0gTlVMTDsKLQltaXNjX2RlcmVnaXN0ZXIoJmF1ZGlvX3ZvaWNlbWVtb19taXNjKTsKLX0KLQotc3RhdGljIGNoYXIgYXVkaW9fdm9pY2VtZW1vX3JwY19uYW1lW10gPSAicnMwMDAwMDAwMCI7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF1ZGlvX3ZvaWNlbWVtb19kcml2ZXIgPSB7Ci0JLnByb2JlID0gYXVkaW9fdm9pY2VtZW1vX3Byb2JlLAotCS5kcml2ZXIgPSB7Ci0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi0gfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9fdm9pY2VtZW1vX2luaXQodm9pZCkKLXsKLQlzbnByaW50ZihhdWRpb192b2ljZW1lbW9fcnBjX25hbWUsIHNpemVvZihhdWRpb192b2ljZW1lbW9fcnBjX25hbWUpLAotCQkJInJzJTA4eCIsIFNORF9QUk9HKTsKLQlhdWRpb192b2ljZW1lbW9fZHJpdmVyLmRyaXZlci5uYW1lID0gYXVkaW9fdm9pY2VtZW1vX3JwY19uYW1lOwotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmF1ZGlvX3ZvaWNlbWVtb19kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChhdWRpb192b2ljZW1lbW9faW5pdCk7Ci1tb2R1bGVfZXhpdChhdWRpb192b2ljZW1lbW9fZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIFZvaWNlIE1lbW8gZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfQVVUSE9SKCJRVUFMQ09NTSIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fd21hLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb193bWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5NzM5Zi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb193bWEuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NTEgKzAsMCBAQAotLyogYXVkaW9fd21hLmMgLSB3bWEgYXVkaW8gZGVjb2RlciBkcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogQmFzZWQgb24gdGhlIG1wMyBuYXRpdmUgZHJpdmVyIGluIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX21wMy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICoKLSAqIEFsbCBzb3VyY2UgY29kZSBpbiB0aGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGV4Y2VwdAotICogd2hlcmUgaW5kaWNhdGVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKLSAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGZpbmQgaXQgYXQgaHR0cDovL3d3dy5mc2Yub3JnCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9lYXJseXN1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX3dtYS5oPgotI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KLQotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdV9kb21haW5zLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwY21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcG1zZy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcC5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwbGF5Y21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwbGF5bXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNXJtdGNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fbWVtdHlwZXMuaD4KLQotI2luY2x1ZGUgImF1ZG1nci5oIgotCi0vKiBTaXplIG11c3QgYmUgcG93ZXIgb2YgMiAqLwotI2RlZmluZSBCVUZTWl9NQVggCTIwNjIJLyogSW5jbHVkZXMgbWV0YSBpbiBzaXplICovCi0jZGVmaW5lIEJVRlNaX01JTiAJMTAzOAkvKiBJbmNsdWRlcyBtZXRhIGluIHNpemUgKi8KLSNkZWZpbmUgRE1BU1pfTUFYIAkoQlVGU1pfTUFYICogMikKLSNkZWZpbmUgRE1BU1pfTUlOIAkoQlVGU1pfTUlOICogMikKLQotI2RlZmluZSBBVURQTEFZX0lOVkFMSURfUkVBRF9QVFJfT0ZGU0VUCTB4RkZGRgotI2RlZmluZSBBVURERUNfREVDX1dNQSA0Ci0KLSNkZWZpbmUgUENNX0JVRlNaX01JTiAJODIxNiAJLyogSG9sZCBvbmUgc3RlcmVvIFdNQSBmcmFtZSBhbmQgbWV0YSBvdXQqLwotI2RlZmluZSBQQ01fQlVGX01BWF9DT1VOVCA1CS8qIERTUCBvbmx5IGFjY2VwdHMgNSBidWZmZXJzIGF0IG1vc3QKLQkJCQkgICBidXQgc3VwcG9ydCAyIGJ1ZmZlcnMgY3VycmVudGx5ICovCi0jZGVmaW5lIFJPVVRJTkdfTU9ERV9GVFJUIDEKLSNkZWZpbmUgUk9VVElOR19NT0RFX1JUIDIKLS8qIERlY29kZXIgc3RhdHVzIHJlY2VpdmVkIGZyb20gQVVEUFBUQVNLICovCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX1NMRUVQCTAKLSNkZWZpbmUJIEFVRFBQX0RFQ19TVEFUVVNfSU5JVCAgMQotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19DRkcgICAyCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX1BMQVkgIDMKLQotI2RlZmluZSBBVURXTUFfTUVUQUZJRUxEX01BU0sgMHhGRkZGMDAwMAotI2RlZmluZSBBVURXTUFfRU9TX0ZMR19PRkZTRVQgMHgwQSAvKiBPZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgYnVmZmVyICovCi0jZGVmaW5lIEFVRFdNQV9FT1NfRkxHX01BU0sgMHgwMQotI2RlZmluZSBBVURXTUFfRU9TX05PTkUgMHgwIC8qIE5vIEVPUyBkZXRlY3RlZCAqLwotI2RlZmluZSBBVURXTUFfRU9TX1NFVCAweDEgLyogRU9TIHNldCBpbiBtZXRhIGZpZWxkICovCi0KLSNkZWZpbmUgQVVEV01BX0VWRU5UX05VTSAxMCAvKiBEZWZhdWx0IG51bWJlciBvZiBwcmUtYWxsb2NhdGVkIGV2ZW50IHBhY2tldHMgKi8KLQotc3RydWN0IGJ1ZmZlciB7Ci0Jdm9pZCAqZGF0YTsKLQl1bnNpZ25lZCBzaXplOwotCXVuc2lnbmVkIHVzZWQ7CQkvKiBJbnB1dCB1c2FnZSBhY3R1YWwgRFNQIHByb2R1Y2VkIFBDTSBzaXplICAqLwotCXVuc2lnbmVkIGFkZHI7Ci0JdW5zaWduZWQgc2hvcnQgbWZpZWxkX3N6OyAvKm9ubHkgdXNlZnVsIGZvciBkYXRhIGhhcyBtZXRhIGZpZWxkICovCi19OwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0cnVjdCBhdWR3bWFfc3VzcGVuZF9jdGwgewotCXN0cnVjdCBlYXJseV9zdXNwZW5kIG5vZGU7Ci0Jc3RydWN0IGF1ZGlvICphdWRpbzsKLX07Ci0jZW5kaWYKLQotc3RydWN0IGF1ZHdtYV9ldmVudHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JaW50IGV2ZW50X3R5cGU7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLX07Ci0KLXN0cnVjdCBhdWRpbyB7Ci0Jc3RydWN0IGJ1ZmZlciBvdXRbMl07Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JdWludDhfdCBvdXRfaGVhZDsKLQl1aW50OF90IG91dF90YWlsOwotCXVpbnQ4X3Qgb3V0X25lZWRlZDsgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGRzcCBpcyB3YWl0aW5nIGZvciAqLwotCXVuc2lnbmVkIG91dF9kbWFfc3o7Ci0KLQlhdG9taWNfdCBvdXRfYnl0ZXM7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggd3JpdGVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3cml0ZV93YWl0OwotCi0JLyogSG9zdCBQQ00gc2VjdGlvbiAqLwotCXN0cnVjdCBidWZmZXIgaW5bUENNX0JVRl9NQVhfQ09VTlRdOwotCXN0cnVjdCBtdXRleCByZWFkX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF93YWl0OwkvKiBXYWl0IHF1ZXVlIGZvciByZWFkICovCi0JY2hhciAqcmVhZF9kYXRhOwkvKiBwb2ludGVyIHRvIHJlYWRlciBidWZmZXIgKi8KLQlpbnQzMl90IHJlYWRfcGh5czsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiByZWFkZXIgYnVmZmVyICovCi0JdWludDhfdCByZWFkX25leHQ7CS8qIGluZGV4IHRvIGlucHV0IGJ1ZmZlcnMgdG8gYmUgcmVhZCBuZXh0ICovCi0JdWludDhfdCBmaWxsX25leHQ7CS8qIGluZGV4IHRvIGJ1ZmZlciB0aGF0IERTUCBzaG91bGQgYmUgZmlsbGluZyAqLwotCXVpbnQ4X3QgcGNtX2J1Zl9jb3VudDsJLyogbnVtYmVyIG9mIHBjbSBidWZmZXIgYWxsb2NhdGVkICovCi0JLyogLS0tLSBFbmQgb2YgSG9zdCBQQ00gc2VjdGlvbiAqLwotCi0Jc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqYXVkcGxheTsKLQotCS8qIGNvbmZpZ3VyYXRpb24gdG8gdXNlIG9uIG5leHQgZW5hYmxlICovCi0JdWludDMyX3Qgb3V0X3NhbXBsZV9yYXRlOwotCXVpbnQzMl90IG91dF9jaGFubmVsX21vZGU7Ci0KLQlzdHJ1Y3QgbXNtX2F1ZGlvX3dtYV9jb25maWcgd21hX2NvbmZpZzsKLQlzdHJ1Y3QgYXVkbWdyIGF1ZG1ncjsKLQotCS8qIGRhdGEgYWxsb2NhdGVkIGZvciB2YXJpb3VzIGJ1ZmZlcnMgKi8KLQljaGFyICpkYXRhOwotCWludDMyX3QgcGh5czsgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB3cml0ZSBidWZmZXIgKi8KLQl2b2lkICptYXBfdl9yZWFkOwotCXZvaWQgKm1hcF92X3dyaXRlOwotCi0JaW50IG1maWVsZDsgLyogbWV0YSBmaWVsZCBlbWJlZGRlZCBpbiBkYXRhICovCi0JaW50IHJmbHVzaDsgLyogUmVhZCAgZmx1c2ggKi8KLQlpbnQgd2ZsdXNoOyAvKiBXcml0ZSBmbHVzaCAqLwotCWludCBvcGVuZWQ7Ci0JaW50IGVuYWJsZWQ7Ci0JaW50IHJ1bm5pbmc7Ci0JaW50IHN0b3BwZWQ7IC8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQlpbnQgcGNtX2ZlZWRiYWNrOwotCWludCBidWZfcmVmcmVzaDsKLQlpbnQgcm10X3Jlc291cmNlX3JlbGVhc2VkOwotCWludCB0ZW9zOyAvKiB2YWxpZCBvbmx5IGlmIHR1bm5lbCBtb2RlICYgbm8gZGF0YSBsZWZ0IGZvciBkZWNvZGVyICovCi0JZW51bSBtc21fYXVkX2RlY29kZXJfc3RhdGUgZGVjX3N0YXRlOwkvKiBSZXByZXNlbnRzIGRlY29kZXIgc3RhdGUgKi8KLQlpbnQgcmVzZXJ2ZWQ7IC8qIEEgYnl0ZSBpcyBiZWluZyByZXNlcnZlZCAqLwotCWNoYXIgcnN2X2J5dGU7IC8qIEhhbmRsZSBvZGQgbGVuZ3RoIHVzZXIgZGF0YSAqLwotCi0JY29uc3QgY2hhciAqbW9kdWxlX25hbWU7Ci0JdW5zaWduZWQgcXVldWVfaWQ7Ci0JdWludDE2X3QgZGVjX2lkOwotCXVpbnQzMl90IHJlYWRfcHRyX29mZnNldDsKLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0Jc3RydWN0IGF1ZHdtYV9zdXNwZW5kX2N0bCBzdXNwZW5kX2N0bDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotI2VuZGlmCi0KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9ldmVudF9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50X3F1ZXVlOwotCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3dhaXQ7Ci0Jc3BpbmxvY2tfdCBldmVudF9xdWV1ZV9sb2NrOwotCXN0cnVjdCBtdXRleCBnZXRfZXZlbnRfbG9jazsKLQlpbnQgZXZlbnRfYWJvcnQ7Ci0KLQlpbnQgZXFfZW5hYmxlOwotCWludCBlcV9uZWVkc19jb21taXQ7Ci0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyIGVxOwotCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUgdm9sX3BhbjsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBpb25faGFuZGxlICppbnB1dF9idWZmX2hhbmRsZTsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqb3V0cHV0X2J1ZmZfaGFuZGxlOwotfTsKLQotc3RhdGljIGludCBhdWRkZWNfZHNwX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKTsKLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX3JvdXRpbmdfbW9kZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZHBsYXlfc2VuZF9kYXRhKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVuc2lnbmVkIG5lZWRlZCk7Ci1zdGF0aWMgdm9pZCBhdWRwbGF5X2NvbmZpZ19ob3N0cGNtKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcGxheV9idWZmZXJfcmVmcmVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZGlvX2RzcF9ldmVudCh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZyk7Ci0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0YXRpYyB2b2lkIGF1ZHdtYV9wb3N0X2V2ZW50KHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCB0eXBlLAotCQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkKTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IHJtdF9wdXRfcmVzb3VyY2Uoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkX2NvZGVjX2NvbmZpZ19jbWQgY21kOwotCXVuc2lnbmVkIHNob3J0IGNsaWVudF9pZHg7Ci0KLQljbWQuY21kX2lkID0gUk1fQ01EX0FVRF9DT0RFQ19DRkc7Ci0JY21kLmNsaWVudF9pZCA9IFJNX0FVRF9DTElFTlRfSUQ7Ci0JY21kLnRhc2tfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5lbmFibGUgPSBSTVRfRElTQUJMRTsKLQljbWQuZGVjX3R5cGUgPSBBVURERUNfREVDX1dNQTsKLQljbGllbnRfaWR4ID0gKChjbWQuY2xpZW50X2lkIDw8IDgpIHwgY21kLnRhc2tfaWQpOwotCi0JcmV0dXJuIHB1dF9hZHNwX3Jlc291cmNlKGNsaWVudF9pZHgsICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBybXRfZ2V0X3Jlc291cmNlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZF9jb2RlY19jb25maWdfY21kIGNtZDsKLQl1bnNpZ25lZCBzaG9ydCBjbGllbnRfaWR4OwotCi0JY21kLmNtZF9pZCA9IFJNX0NNRF9BVURfQ09ERUNfQ0ZHOwotCWNtZC5jbGllbnRfaWQgPSBSTV9BVURfQ0xJRU5UX0lEOwotCWNtZC50YXNrX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuZW5hYmxlID0gUk1UX0VOQUJMRTsKLQljbWQuZGVjX3R5cGUgPSBBVURERUNfREVDX1dNQTsKLQljbGllbnRfaWR4ID0gKChjbWQuY2xpZW50X2lkIDw8IDgpIHwgY21kLnRhc2tfaWQpOwotCi0JcmV0dXJuIGdldF9hZHNwX3Jlc291cmNlKGNsaWVudF9pZHgsICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGlvX2VuYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRtZ3JfY29uZmlnIGNmZzsKLQlpbnQgcmM7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWlmIChhdWRpby0+ZW5hYmxlZCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoYXVkaW8tPnJtdF9yZXNvdXJjZV9yZWxlYXNlZCA9PSAxKSB7Ci0JCWF1ZGlvLT5ybXRfcmVzb3VyY2VfcmVsZWFzZWQgPSAwOwotCQlyYyA9IHJtdF9nZXRfcmVzb3VyY2UoYXVkaW8pOwotCQlpZiAocmMpIHsKLQkJCU1NX0VSUigiQURTUCByZXNvdXJjZXMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIFdNQSBcCi0JCQkJc2Vzc2lvbiAweCUwOHggb24gZGVjb2RlcjogJWRcbiBJZ25vcmluZyBcCi0JCQkJZXJyb3IgYW5kIGdvaW5nIGFoZWFkIHdpdGggdGhlIHBsYXliYWNrXG4iLAotCQkJCShpbnQpYXVkaW8sIGF1ZGlvLT5kZWNfaWQpOwotCQl9Ci0JfQotCi0JYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCWF1ZGlvLT5vdXRfdGFpbCA9IDA7Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCi0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spIHsKLQkJY2ZnLnR4X3JhdGUgPSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV9OT05FOwotCQljZmcucnhfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzQ4MDAwOwotCQljZmcuZGVmX21ldGhvZCA9IFJQQ19BVURfREVGX01FVEhPRF9QTEFZQkFDSzsKLQkJY2ZnLmNvZGVjID0gUlBDX0FVRF9ERUZfQ09ERUNfV01BOwotCQljZmcuc25kX21ldGhvZCA9IFJQQ19TTkRfTUVUSE9EX01JREk7Ci0KLQkJcmMgPSBhdWRtZ3JfZW5hYmxlKCZhdWRpby0+YXVkbWdyLCAmY2ZnKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJbXNtX2Fkc3BfZHVtcChhdWRpby0+YXVkcGxheSk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0KLQlpZiAobXNtX2Fkc3BfZW5hYmxlKGF1ZGlvLT5hdWRwbGF5KSkgewotCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRwbGF5KSBmYWlsZWRcbiIpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykKLQkJCWF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKGF1ZHBwX2VuYWJsZShhdWRpby0+ZGVjX2lkLCBhdWRpb19kc3BfZXZlbnQsIGF1ZGlvKSkgewotCQlNTV9FUlIoImF1ZHBwX2VuYWJsZSgpIGZhaWxlZFxuIik7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykKLQkJCWF1ZG1ncl9kaXNhYmxlKCZhdWRpby0+YXVkbWdyKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JYXVkaW8tPmVuYWJsZWQgPSAxOwotCXJldHVybiAwOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkaW9fZGlzYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWludCByYyA9IDA7Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQlhdWRpby0+ZGVjX3N0YXRlID0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkU7Ci0JCWF1ZGRlY19kc3BfY29uZmlnKGF1ZGlvLCAwKTsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdCwKLQkJCQlhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoTVNNX0FVRF9ERUNPREVSX1dBSVRfTVMpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWVsc2UgaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX0NMT1NFKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRpby0+YXVkcGxheSk7Ci0JCWF1ZHBwX2Rpc2FibGUoYXVkaW8tPmRlY19pZCwgYXVkaW8pOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykgewotCQkJcmMgPSBhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCQlpZiAocmMgPCAwKQotCQkJCW1zbV9hZHNwX2R1bXAoYXVkaW8tPmF1ZHBsYXkpOwotCQl9Ci0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJcm10X3B1dF9yZXNvdXJjZShhdWRpbyk7Ci0JCWF1ZGlvLT5ybXRfcmVzb3VyY2VfcmVsZWFzZWQgPSAxOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZHNwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgYXVkaW9fdXBkYXRlX3BjbV9idWZfZW50cnkoc3RydWN0IGF1ZGlvICphdWRpbywKLQl1aW50MzJfdCAqcGF5bG9hZCkKLXsKLQl1aW50OF90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoYXVkaW8tPnJmbHVzaCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBheWxvYWRbMV07IGluZGV4KyspIHsKLQkJaWYgKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyID09Ci0JCQlwYXlsb2FkWzIgKyBpbmRleCAqIDJdKSB7Ci0JCQlNTV9EQkcoImF1ZGlvX3VwZGF0ZV9wY21fYnVmX2VudHJ5OiBcCi0JCQkJaW5bJWRdIHJlYWR5XG4iLCBhdWRpby0+ZmlsbF9uZXh0KTsKLQkJCWF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS51c2VkID0KLQkJCXBheWxvYWRbMyArIGluZGV4ICogMl07Ci0JCQlpZiAoKCsrYXVkaW8tPmZpbGxfbmV4dCkgPT0gYXVkaW8tPnBjbV9idWZfY291bnQpCi0JCQkJYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoImF1ZGlvX3VwZGF0ZV9wY21fYnVmX2VudHJ5OiBcCi0JCQkJZXhwZWN0ZWQ9JXggcmV0PSV4XG4iLAotCQkJCWF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyLAotCQkJCXBheWxvYWRbMSArIGluZGV4ICogMl0pOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS51c2VkID09IDApIHsKLQkJYXVkcGxheV9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JfSBlbHNlIHsKLQkJTU1fREJHKCJyZWFkIGNhbm5vdCBrZWVwIHVwXG4iKTsKLQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMTsKLQl9Ci0Jd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfZHNwX2V2ZW50KHZvaWQgKmRhdGEsIHVuc2lnbmVkIGlkLCBzaXplX3QgbGVuLAotCQkJICAgICAgdm9pZCAoKmdldGV2ZW50KSAodm9pZCAqcHRyLCBzaXplX3QgbGVuKSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZGF0YTsKLQl1aW50MzJfdCBtc2dbMjhdOwotCi0JZ2V0ZXZlbnQobXNnLCBzaXplb2YobXNnKSk7Ci0KLQlNTV9EQkcoIm1zZ19pZD0leFxuIiwgaWQpOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUExBWV9NU0dfREVDX05FRURTX0RBVEE6Ci0JCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAxKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBMQVlfTVNHX0JVRkZFUl9VUERBVEU6Ci0JCWF1ZGlvX3VwZGF0ZV9wY21fYnVmX2VudHJ5KGF1ZGlvLCBtc2cpOwotCQlicmVhazsKLQotCWNhc2UgQURTUF9NRVNTQUdFX0lEOgotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6IG1vZHVsZSBlbmFibGUoYXVkcGxheXRhc2spXG4iKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlNTV9FUlIoInVuZXhwZWN0ZWQgbWVzc2FnZSBmcm9tIGRlY29kZXIgXG4iKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhdWRpb19kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IHByaXZhdGU7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQUF9NU0dfU1RBVFVTX01TRzp7Ci0JCQl1bnNpZ25lZCBzdGF0dXMgPSBtc2dbMV07Ci0KLQkJCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfU0xFRVA6IHsKLQkJCQl1aW50MTZfdCByZWFzb24gPSBtc2dbMl07Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czpzbGVlcCByZWFzb24gPSBcCi0JCQkJCQkweCUwNHhcbiIsIHJlYXNvbik7Ci0JCQkJaWYgKChyZWFzb24gPT0gQVVEUFBfTVNHX1JFQVNPTl9NRU0pCi0JCQkJCXx8IChyZWFzb24gPT0KLQkJCQkJQVVEUFBfTVNHX1JFQVNPTl9OT0RFQ09ERVIpKSB7Ci0JCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX0ZBSUxVUkU7Ci0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQl9IGVsc2UgaWYgKHJlYXNvbiA9PSBBVURQUF9NU0dfUkVBU09OX05PTkUpIHsKLQkJCQkJLyogZGVjb2RlciBpcyBpbiBkaXNhYmxlIHN0YXRlICovCi0JCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX0NMT1NFOwotCQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX0lOSVQ6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogaW5pdFxuIik7Ci0JCQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCQkJCWF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKGF1ZGlvKTsKLQkJCQllbHNlCi0JCQkJCWF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoYXVkaW8pOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfQ0ZHOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IGNmZ1xuIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfUExBWToKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBwbGF5XG4iKTsKLQkJCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykgewotCQkJCQlhdWRwbGF5X2NvbmZpZ19ob3N0cGNtKGF1ZGlvKTsKLQkJCQkJYXVkcGxheV9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JCQkJfQotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfU1VDQ0VTUzsKLQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCU1NX0VSUigidW5rbm93biBkZWNvZGVyIHN0YXR1c1xuIik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVEUFBfTVNHX0NGR19NU0c6Ci0JCWlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9FTkEpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBFTkFCTEVcbiIpOwotCQkJYXVkZGVjX2RzcF9jb25maWcoYXVkaW8sIDEpOwotCQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAxOwotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3Bhbik7Ci0JCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsCWF1ZGlvLT5lcV9lbmFibGUsCi0JCQkJCQkJCSZhdWRpby0+ZXEpOwotCQkJYXVkcHBfYXZzeW5jKGF1ZGlvLT5kZWNfaWQsIDIyMDUwKTsKLQkJfSBlbHNlIGlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9ESVMpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBESVNBQkxFXG4iKTsKLQkJCWF1ZHBwX2F2c3luYyhhdWRpby0+ZGVjX2lkLCAwKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyAlZD9cbiIsIG1zZ1swXSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfUk9VVElOR19BQ0s6Ci0JCU1NX0RCRygiUk9VVElOR19BQ0sgbW9kZT0lZFxuIiwgbXNnWzFdKTsKLQkJYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhhdWRpbyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURQUF9NU0dfRkxVU0hfQUNLOgotCQlNTV9EQkcoIkZMVVNIX0FDS1xuIik7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJCWF1ZHBsYXlfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCQlicmVhazsKLQljYXNlIEFVRFBQX01TR19QQ01ETUFNSVNTRUQ6Ci0JCU1NX0RCRygiUENNRE1BTUlTU0VEXG4iKTsKLQkJYXVkaW8tPnRlb3MgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJTU1fRVJSKCJVTktOT1dOICglZClcbiIsIGlkKTsKLQl9Ci0KLX0KLQotc3RhdGljIHN0cnVjdCBtc21fYWRzcF9vcHMgYXVkcGxheV9hZHNwX29wc193bWEgPSB7Ci0JLmV2ZW50ID0gYXVkcGxheV9kc3BfZXZlbnQsCi19OwotCi0jZGVmaW5lIGF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHBsYXksIGF1ZGlvLT5xdWV1ZV9pZCwgXAotCQkJY21kLCBsZW4pCi0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQl1MTYgY2ZnX2RlY19jbWRbQVVEUFBfQ01EX0NGR19ERUNfVFlQRV9MRU4gLyBzaXplb2YodW5zaWduZWQgc2hvcnQpXTsKLQotCW1lbXNldChjZmdfZGVjX2NtZCwgMCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci0JY2ZnX2RlY19jbWRbMF0gPSBBVURQUF9DTURfQ0ZHX0RFQ19UWVBFOwotCWlmIChlbmFibGUpCi0JCWNmZ19kZWNfY21kWzEgKyBhdWRpby0+ZGVjX2lkXSA9IEFVRFBQX0NNRF9VUERBVERFX0NGR19ERUMgfAotCQkJQVVEUFBfQ01EX0VOQV9ERUNfViB8IEFVRERFQ19ERUNfV01BOwotCWVsc2UKLQkJY2ZnX2RlY19jbWRbMSArIGF1ZGlvLT5kZWNfaWRdID0gQVVEUFBfQ01EX1VQREFUREVfQ0ZHX0RFQyB8Ci0JCQlBVURQUF9DTURfRElTX0RFQ19WOwotCi0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUxKCZjZmdfZGVjX2NtZCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc193bWEgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY29tbW9uLmNtZF9pZCA9IEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVM7Ci0JY21kLmNvbW1vbi5sZW5ndGggPSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TX1dNQV9MRU47Ci0JY21kLmNvbW1vbi5kZWNfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5jb21tb24uaW5wdXRfc2FtcGxpbmdfZnJlcXVlbmN5ID0gYXVkaW8tPm91dF9zYW1wbGVfcmF0ZTsKLQotCS8qCi0JICogVGVzdCBkb25lIGZvciBzYW1wbGUgd2l0aCB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24KLQkgKiBhcm1kYXRhcmVxdGhyIAk9IDEyNjIKLQkgKiBjaGFubmVsc2RlY29kZWQgCT0gMShNT05PKS8yKFNURVJFTykKLQkgKiB3bWFieXRlc3BlcnNlYyAJPSBUZXN0ZWQgd2l0aCA2MDAzIEJ5dGVzIHBlciBzZWMKLQkgKiB3bWFzYW1wbGluZ2ZyZXEJPSA0NDEwMAotCSAqIHdtYWVuY29kZXJvcHRzCT0gMzEKLQkgKi8KLQotCWNtZC5hcm1kYXRhcmVxdGhyID0gYXVkaW8tPndtYV9jb25maWcuYXJtZGF0YXJlcXRocjsKLQljbWQuY2hhbm5lbHNkZWNvZGVkID0gYXVkaW8tPndtYV9jb25maWcuY2hhbm5lbHNkZWNvZGVkOwotCWNtZC53bWFieXRlc3BlcnNlYyA9IGF1ZGlvLT53bWFfY29uZmlnLndtYWJ5dGVzcGVyc2VjOwotCWNtZC53bWFzYW1wbGluZ2ZyZXEgPSBhdWRpby0+d21hX2NvbmZpZy53bWFzYW1wbGluZ2ZyZXE7Ci0JY21kLndtYWVuY29kZXJvcHRzID0gYXVkaW8tPndtYV9jb25maWcud21hZW5jb2Rlcm9wdHM7Ci0KLQlhdWRwcF9zZW5kX3F1ZXVlMigmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9yb3V0aW5nX21vZGUgY21kOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURQUF9DTURfUk9VVElOR19NT0RFOwotCWNtZC5vYmplY3RfbnVtYmVyID0gYXVkaW8tPmRlY19pZDsKLQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJY21kLnJvdXRpbmdfbW9kZSA9IFJPVVRJTkdfTU9ERV9GVFJUOwotCWVsc2UKLQkJY21kLnJvdXRpbmdfbW9kZSA9IFJPVVRJTkdfTU9ERV9SVDsKLQotCWF1ZHBwX3NlbmRfcXVldWUxKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGxheV9idWZmZXJfcmVmcmVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwbGF5X2NtZF9idWZmZXJfcmVmcmVzaCByZWZyZXNoX2NtZDsKLQotCXJlZnJlc2hfY21kLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0JVRkZFUl9SRUZSRVNIOwotCXJlZnJlc2hfY21kLm51bV9idWZmZXJzID0gMTsKLQlyZWZyZXNoX2NtZC5idWYwX2FkZHJlc3MgPSBhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uYWRkcjsKLQlyZWZyZXNoX2NtZC5idWYwX2xlbmd0aCA9IGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5zaXplOwotCXJlZnJlc2hfY21kLmJ1Zl9yZWFkX2NvdW50ID0gMDsKLQotCU1NX0RCRygiYnVmMF9hZGRyPSV4IGJ1ZjBfbGVuPSVkXG4iLAotCQkJcmVmcmVzaF9jbWQuYnVmMF9hZGRyZXNzLAotCQkJcmVmcmVzaF9jbWQuYnVmMF9sZW5ndGgpOwotCi0JKHZvaWQpYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJnJlZnJlc2hfY21kLCBzaXplb2YocmVmcmVzaF9jbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGxheV9jb25maWdfaG9zdHBjbShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwbGF5X2NtZF9ocGNtX2J1Zl9jZmcgY2ZnX2NtZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JY2ZnX2NtZC5jbWRfaWQgPSBBVURQTEFZX0NNRF9IUENNX0JVRl9DRkc7Ci0JY2ZnX2NtZC5tYXhfYnVmZmVycyA9IGF1ZGlvLT5wY21fYnVmX2NvdW50OwotCWNmZ19jbWQuYnl0ZV9zd2FwID0gMDsKLQljZmdfY21kLmhvc3RwY21fY29uZmlnID0gKDB4ODAwMCkgfCAoMHg0MDAwKTsKLQljZmdfY21kLmZlZWRiYWNrX2ZyZXF1ZW5jeSA9IDE7Ci0JY2ZnX2NtZC5wYXJ0aXRpb25fbnVtYmVyID0gMDsKLQotCSh2b2lkKWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZjZmdfY21kLCBzaXplb2YoY2ZnX2NtZCkpOwotfQotCi0KLXN0YXRpYyBpbnQgYXVkcGxheV9kc3Bfc2VuZF9kYXRhX2F2YWlsKHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCQkJCXVuc2lnbmVkIGlkeCwgdW5zaWduZWQgbGVuKQotewotCXN0cnVjdCBhdWRwbGF5X2NtZF9iaXRzdHJlYW1fZGF0YV9hdmFpbF9udDIgY21kOwotCi0JY21kLmNtZF9pZAkJPSBBVURQTEFZX0NNRF9CSVRTVFJFQU1fREFUQV9BVkFJTF9OVDI7Ci0JaWYgKGF1ZGlvLT5tZmllbGQpCi0JCWNtZC5kZWNvZGVyX2lkID0gQVVEV01BX01FVEFGSUVMRF9NQVNLIHwKLQkJCShhdWRpby0+b3V0W2lkeF0ubWZpZWxkX3N6ID4+IDEpOwotCWVsc2UKLQkJY21kLmRlY29kZXJfaWQJCT0gYXVkaW8tPmRlY19pZDsKLQljbWQuYnVmX3B0cgkJPSBhdWRpby0+b3V0W2lkeF0uYWRkcjsKLQljbWQuYnVmX3NpemUJCT0gbGVuLzI7Ci0JY21kLnBhcnRpdGlvbl9udW1iZXIJPSAwOwotCS8qIGNvbXBsZXRlIHdyaXRlcyB0byB0aGUgaW5wdXQgYnVmZmVyICovCi0Jd21iKCk7Ci0JcmV0dXJuIGF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGxheV9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgbmVlZGVkKQotewotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhdWRpby0+cnVubmluZykKLQkJZ290byBkb25lOwotCi0JaWYgKGF1ZGlvLT53Zmx1c2gpIHsKLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAxOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKG5lZWRlZCAmJiAhYXVkaW8tPndmbHVzaCkgewotCQkvKiBXZSB3ZXJlIGNhbGxlZCBmcm9tIHRoZSBjYWxsYmFjayBiZWNhdXNlIHRoZSBEU1AKLQkJICogcmVxdWVzdGVkIG1vcmUgZGF0YS4gIE5vdGUgdGhhdCB0aGUgRFNQIGRvZXMgd2FudAotCQkgKiBtb3JlIGRhdGEsIGFuZCBpZiBhIGJ1ZmZlciB3YXMgaW4tZmxpZ2h0LCBtYXJrIGl0Ci0JCSAqIGFzIGF2YWlsYWJsZSAoc2luY2UgdGhlIERTUCBtdXN0IG5vdyBiZSBkb25lIHdpdGgKLQkJICogaXQpLgotCQkgKi8KLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAxOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCWlmIChmcmFtZS0+dXNlZCA9PSAweGZmZmZmZmZmKSB7Ci0JCQlNTV9EQkcoImZyYW1lICVkIGZyZWVcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDA7Ci0JCQlhdWRpby0+b3V0X3RhaWwgXj0gMTsKLQkJCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJfQotCX0KLQotCWlmIChhdWRpby0+b3V0X25lZWRlZCkgewotCQkvKiBJZiB0aGUgRFNQIGN1cnJlbnRseSB3YW50cyBkYXRhIGFuZCB3ZSBoYXZlIGEKLQkJICogYnVmZmVyIGF2YWlsYWJsZSwgd2Ugd2lsbCBzZW5kIGl0IGFuZCByZXNldAotCQkgKiB0aGUgbmVlZGVkIGZsYWcuICBXZSdsbCBtYXJrIHRoZSBidWZmZXIgYXMgaW4tZmxpZ2h0Ci0JCSAqIHNvIHRoYXQgaXQgd29uJ3QgYmUgcmVjeWNsZWQgdW50aWwgdGhlIG5leHQgYnVmZmVyCi0JCSAqIGlzIHJlcXVlc3RlZAotCQkgKi8KLQotCQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCWlmIChmcmFtZS0+dXNlZCkgewotCQkJQlVHX09OKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpOwotCQkJTU1fREJHKCJmcmFtZSAlZCBidXN5XG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCQkJYXVkcGxheV9kc3Bfc2VuZF9kYXRhX2F2YWlsKGF1ZGlvLCBhdWRpby0+b3V0X3RhaWwsCi0JCQkJCQkJCWZyYW1lLT51c2VkKTsKLQkJCWZyYW1lLT51c2VkID0gMHhmZmZmZmZmZjsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJfQotCX0KLWRvbmU6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZGV2aWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdm9pZCBhdWRpb19mbHVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JYXVkaW8tPm91dFswXS51c2VkID0gMDsKLQlhdWRpby0+b3V0WzFdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRfaGVhZCA9IDA7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+cmVzZXJ2ZWQgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWF0b21pY19zZXQoJmF1ZGlvLT5vdXRfYnl0ZXMsIDApOwotfQotCi1zdGF0aWMgdm9pZCBhdWRpb19mbHVzaF9wY21fYnVmKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdWludDhfdCBpbmRleDsKLQotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUENNX0JVRl9NQVhfQ09VTlQ7IGluZGV4KyspCi0JCWF1ZGlvLT5pbltpbmRleF0udXNlZCA9IDA7Ci0JYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkaW9faW9wb3J0X3Jlc2V0KHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JLyogTWFrZSBzdXJlIHJlYWQvd3JpdGUgdGhyZWFkIGFyZSBmcmVlIGZyb20KLQkgKiBzbGVlcCBhbmQga25vd2luZyB0aGF0IHN5c3RlbSBpcyBub3QgYWJsZQotCSAqIHRvIHByb2Nlc3MgaW8gcmVxdWVzdCBhdCB0aGUgbW9tZW50Ci0JICovCi0Jd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlhdWRpb19mbHVzaChhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JYXVkaW9fZmx1c2hfcGNtX2J1ZihhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLX0KLQotc3RhdGljIGludCBhdWR3bWFfZXZlbnRzX3BlbmRpbmcoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlbXB0eTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWVtcHR5ID0gIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gZW1wdHkgfHwgYXVkaW8tPmV2ZW50X2Fib3J0OwotfQotCi1zdGF0aWMgdm9pZCBhdWR3bWFfcmVzZXRfZXZlbnRfcXVldWUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBhdWR3bWFfZXZlbnQgKmRydl9ldnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhdWRpby0+ZXZlbnRfcXVldWUpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkd21hX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkd21hX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIGxvbmcgYXVkd21hX3Byb2Nlc3NfZXZlbnRfcmVxKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHZvaWQgX191c2VyICphcmcpCi17Ci0JbG9uZyByYzsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50IHVzcl9ldnQ7Ci0Jc3RydWN0IGF1ZHdtYV9ldmVudCAqZHJ2X2V2dCA9IE5VTEw7Ci0JaW50IHRpbWVvdXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmdXNyX2V2dCwgYXJnLCBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19ldmVudCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXRpbWVvdXQgPSAoaW50KSB1c3JfZXZ0LnRpbWVvdXRfbXM7Ci0KLQlpZiAodGltZW91dCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCgKLQkJCQlhdWRpby0+ZXZlbnRfd2FpdCwgYXVkd21hX2V2ZW50c19wZW5kaW5nKGF1ZGlvKSwKLQkJCQltc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9IGVsc2UgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCWF1ZGlvLT5ldmVudF93YWl0LCBhdWR3bWFfZXZlbnRzX3BlbmRpbmcoYXVkaW8pKTsKLQl9Ci0KLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoYXVkaW8tPmV2ZW50X2Fib3J0KSB7Ci0JCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDA7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJjID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmV2ZW50X3F1ZXVlKSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmV2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWR3bWFfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JfQotCi0JaWYgKGRydl9ldnQpIHsKLQkJdXNyX2V2dC5ldmVudF90eXBlID0gZHJ2X2V2dC0+ZXZlbnRfdHlwZTsKLQkJdXNyX2V2dC5ldmVudF9wYXlsb2FkID0gZHJ2X2V2dC0+cGF5bG9hZDsKLQkJbGlzdF9hZGRfdGFpbCgmZHJ2X2V2dC0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQl9IGVsc2UKLQkJcmMgPSAtMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFyYyAmJiBjb3B5X3RvX3VzZXIoYXJnLCAmdXNyX2V2dCwgc2l6ZW9mKHVzcl9ldnQpKSkKLQkJcmMgPSAtRUZBVUxUOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2VuYWJsZV9lcShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCWlmIChhdWRpby0+ZXFfZW5hYmxlID09IGVuYWJsZSAmJiAhYXVkaW8tPmVxX25lZWRzX2NvbW1pdCkKLQkJcmV0dXJuIDA7Ci0KLQlhdWRpby0+ZXFfZW5hYmxlID0gZW5hYmxlOwotCi0JaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCWF1ZHBwX2RzcF9zZXRfZXEoYXVkaW8tPmRlY19pZCwgZW5hYmxlLCAmYXVkaW8tPmVxKTsKLQkJYXVkaW8tPmVxX25lZWRzX2NvbW1pdCA9IDA7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXVpbnQxNl90IGVuYWJsZV9tYXNrOwotCWludCBlbmFibGU7Ci0JaW50IHByZXZfc3RhdGU7Ci0JdW5zaWduZWQgbG9uZyBpb25mbGFnID0gMDsKLQlpb25fcGh5c19hZGRyX3QgYWRkciA9IDA7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7Ci0JaW50IGxlbiA9IDA7Ci0KLQlNTV9EQkcoImNtZCA9ICVkXG4iLCBjbWQpOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfU1RBVFMpIHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyBzdGF0czsKLQkJc3RhdHMuYnl0ZV9jb3VudCA9IGF1ZHBwX2F2c3luY19ieXRlX2NvdW50KGF1ZGlvLT5kZWNfaWQpOwotCQlzdGF0cy5zYW1wbGVfY291bnQgPSBhdWRwcF9hdnN5bmNfc2FtcGxlX2NvdW50KGF1ZGlvLT5kZWNfaWQpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCX0KLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19FTkFCTEVfQVVEUFA6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZW5hYmxlX21hc2ssICh2b2lkICopIGFyZywKLQkJCQkJCXNpemVvZihlbmFibGVfbWFzaykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJZW5hYmxlID0gKGVuYWJsZV9tYXNrICYgRVFfRU5BQkxFKSA/IDEgOiAwOwotCQlhdWRpb19lbmFibGVfZXEoYXVkaW8sIGVuYWJsZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX1ZPTFVNRToKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+dm9sX3Bhbi52b2x1bWUgPSBhcmc7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihhdWRpby0+ZGVjX2lkLCAmYXVkaW8tPnZvbF9wYW4pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fU0VUX1BBTjoKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+dm9sX3Bhbi5wYW4gPSBhcmc7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihhdWRpby0+ZGVjX2lkLCAmYXVkaW8tPnZvbF9wYW4pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fU0VUX0VROgotCQlwcmV2X3N0YXRlID0gYXVkaW8tPmVxX2VuYWJsZTsKLQkJYXVkaW8tPmVxX2VuYWJsZSA9IDA7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYXVkaW8tPmVxLm51bV9iYW5kcywgKHZvaWQgKikgYXJnLAotCQkJCXNpemVvZihhdWRpby0+ZXEpIC0KLQkJCQkoQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TX0NPTU1PTl9MRU4gKyAyKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWF1ZGlvLT5lcV9lbmFibGUgPSBwcmV2X3N0YXRlOwotCQlhdWRpby0+ZXFfbmVlZHNfY29tbWl0ID0gMTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoLUVJTlZBTCAhPSByYykKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfRVZFTlQpIHsKLQkJTU1fREJHKCJBVURJT19HRVRfRVZFTlRcbiIpOwotCQlpZiAobXV0ZXhfdHJ5bG9jaygmYXVkaW8tPmdldF9ldmVudF9sb2NrKSkgewotCQkJcmMgPSBhdWR3bWFfcHJvY2Vzc19ldmVudF9yZXEoYXVkaW8sCi0JCQkJCSh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCQl9IGVsc2UKLQkJCXJjID0gLUVCVVNZOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKGNtZCA9PSBBVURJT19BQk9SVF9HRVRfRVZFTlQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCQlNTV9EQkcoIkFVRElPX1NUQVJUXG4iKTsKLQkJcmMgPSBhdWRpb19lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUsCi0JCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0RFQ09ERVJfV0FJVF9NUykpOwotCQkJTU1fSU5GTygiZGVjX3N0YXRlICVkIHJjID0gJWRcbiIsIGF1ZGlvLT5kZWNfc3RhdGUsIHJjKTsKLQotCQkJaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1MpCi0JCQkJcmMgPSAtRU5PREVWOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NUT1A6Ci0JCU1NX0RCRygiQVVESU9fU1RPUFxuIik7Ci0JCXJjID0gYXVkaW9fZGlzYWJsZShhdWRpbyk7Ci0JCWF1ZGlvX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19GTFVTSDoKLQkJTU1fREJHKCJBVURJT19GTFVTSFxuIik7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAxOwotCQlhdWRpby0+d2ZsdXNoID0gMTsKLQkJYXVkaW9faW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCQlhdWRwcF9mbHVzaChhdWRpby0+ZGVjX2lkKTsKLQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCSFhdWRpby0+d2ZsdXNoKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlNTV9FUlIoIkFVRElPX0ZMVVNIIGludGVycnVwdGVkXG4iKTsKLQkJCQlyYyA9IC1FSU5UUjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb25maWcsICh2b2lkICopIGFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29uZmlnLmNoYW5uZWxfY291bnQgPT0gMSkgewotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSBBVURQUF9DTURfUENNX0lOVEZfTU9OT19WOwotCQl9IGVsc2UgaWYgKGNvbmZpZy5jaGFubmVsX2NvdW50ID09IDIpIHsKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gQVVEUFBfQ01EX1BDTV9JTlRGX1NURVJFT19WOwotCQl9IGVsc2UgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPm1maWVsZCA9IGNvbmZpZy5tZXRhX2ZpZWxkOwotCQlhdWRpby0+b3V0X3NhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotCQlhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9IGNvbmZpZy5jaGFubmVsX2NvdW50OwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQljb25maWcuYnVmZmVyX3NpemUgPSAoYXVkaW8tPm91dF9kbWFfc3ogPj4gMSk7Ci0JCWNvbmZpZy5idWZmZXJfY291bnQgPSAyOwotCQljb25maWcuc2FtcGxlX3JhdGUgPSBhdWRpby0+b3V0X3NhbXBsZV9yYXRlOwotCQlpZiAoYXVkaW8tPm91dF9jaGFubmVsX21vZGUgPT0gQVVEUFBfQ01EX1BDTV9JTlRGX01PTk9fVikKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gMTsKLQkJZWxzZQotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSAyOwotCQljb25maWcubWV0YV9maWVsZCA9IDA7Ci0JCWNvbmZpZy51bnVzZWRbMF0gPSAwOwotCQljb25maWcudW51c2VkWzFdID0gMDsKLQkJY29uZmlnLnVudXNlZFsyXSA9IDA7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmY29uZmlnLCBzaXplb2YoY29uZmlnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfV01BX0NPTkZJRzp7Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYXVkaW8tPndtYV9jb25maWcsCi0JCQkJc2l6ZW9mKGF1ZGlvLT53bWFfY29uZmlnKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19TRVRfV01BX0NPTkZJRzp7Ci0JCXN0cnVjdCBtc21fYXVkaW9fd21hX2NvbmZpZyB1c3JfY29uZmlnOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcgotCQkJKCZ1c3JfY29uZmlnLCAodm9pZCAqKWFyZywKLQkJCXNpemVvZih1c3JfY29uZmlnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYXVkaW8tPndtYV9jb25maWcgPSB1c3JfY29uZmlnOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9QQ01fQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fcGNtX2NvbmZpZyBjb25maWc7Ci0JCQljb25maWcucGNtX2ZlZWRiYWNrID0gYXVkaW8tPnBjbV9mZWVkYmFjazsKLQkJCWNvbmZpZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX01BWF9DT1VOVDsKLQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY29uZmlnLAotCQkJCQkgc2l6ZW9mKGNvbmZpZykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fU0VUX1BDTV9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19wY21fY29uZmlnIGNvbmZpZzsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcgotCQkJICAgICgmY29uZmlnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGNvbmZpZy5wY21fZmVlZGJhY2sgIT0gYXVkaW8tPnBjbV9mZWVkYmFjaykgewotCQkJCU1NX0VSUigiTm90IHN1ZmZpY2llbnQgcGVybWlzc2lvbiB0byIKLQkJCQkJICJjaGFuZ2UgdGhlIHBsYXliYWNrIG1vZGVcbiIpOwotCQkJCXJjID0gLUVBQ0NFUzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICgoY29uZmlnLmJ1ZmZlcl9jb3VudCA+IFBDTV9CVUZfTUFYX0NPVU5UKSB8fAotCQkJICAgIChjb25maWcuYnVmZmVyX2NvdW50ID09IDEpKQotCQkJCWNvbmZpZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX01BWF9DT1VOVDsKLQotCQkJaWYgKGNvbmZpZy5idWZmZXJfc2l6ZSA8IFBDTV9CVUZTWl9NSU4pCi0JCQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKLQotCQkJLyogQ2hlY2sgaWYgcGNtIGZlZWRiYWNrIGlzIHJlcXVpcmVkICovCi0JCQlpZiAoKGNvbmZpZy5wY21fZmVlZGJhY2spICYmICghYXVkaW8tPnJlYWRfZGF0YSkpIHsKLQkJCQlNTV9EQkcoImFsbG9jYXRlIFBDTSBidWZmZXIgJWRcbiIsCi0JCQkJCQljb25maWcuYnVmZmVyX2NvdW50ICoKLQkJCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSk7Ci0JCQkJaGFuZGxlID0gaW9uX2FsbG9jKGF1ZGlvLT5jbGllbnQsCi0JCQkJCShjb25maWcuYnVmZmVyX3NpemUgKgotCQkJCQljb25maWcuYnVmZmVyX2NvdW50KSwKLQkJCQkJU1pfNEssIElPTl9IRUFQKElPTl9BVURJT19IRUFQX0lEKSwgMCk7Ci0JCQkJaWYgKElTX0VSUl9PUl9OVUxMKGhhbmRsZSkpIHsKLQkJCQkJTU1fRVJSKCJVbmFibGUgdG8gYWxsb2MgSS9QIGJ1ZmZzXG4iKTsKLQkJCQkJYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlID0gTlVMTDsKLQkJCQkJcmMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgPSBoYW5kbGU7Ci0KLQkJCQlyYyA9IGlvbl9waHlzKGF1ZGlvLT5jbGllbnQgLAotCQkJCQloYW5kbGUsICZhZGRyLCAmbGVuKTsKLQkJCQlpZiAocmMpIHsKLQkJCQkJTU1fRVJSKCJJbnZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJCQkJKHVuc2lnbmVkIGludCkgYWRkciwKLQkJCQkJCSh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JCQkJCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci0JCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTU1fSU5GTygiR290IHZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJCQkJKHVuc2lnbmVkIGludCkgYXVkaW8tPnJlYWRfcGh5cywKLQkJCQkJCSh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JCQkJfQotCQkJCWF1ZGlvLT5yZWFkX3BoeXMgPSAoaW50MzJfdClhZGRyOwotCi0JCQkJcmMgPSBpb25faGFuZGxlX2dldF9mbGFncyhhdWRpby0+Y2xpZW50LAotCQkJCQloYW5kbGUsICZpb25mbGFnKTsKLQkJCQlpZiAocmMpIHsKLQkJCQkJTU1fRVJSKCJjb3VsZCBub3QgZ2V0IGZsYWdzXG4iKTsKLQkJCQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgaGFuZGxlKTsKLQkJCQkJYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlID0gTlVMTDsKLQkJCQkJcmMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlhdWRpby0+bWFwX3ZfcmVhZCA9IGlvbl9tYXBfa2VybmVsKAotCQkJCQlhdWRpby0+Y2xpZW50LCBoYW5kbGUpOwotCQkJCWlmIChJU19FUlIoYXVkaW8tPm1hcF92X3JlYWQpKSB7Ci0JCQkJCU1NX0VSUigibWFwIG9mIHJlYWQgYnVmIGZhaWxlZFxuIik7Ci0JCQkJCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci0JCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQl9IGVsc2UgewotCQkJCQl1aW50OF90IGluZGV4OwotCQkJCQl1aW50MzJfdCBvZmZzZXQgPSAwOwotCQkJCQlhdWRpby0+cmVhZF9kYXRhID0KLQkJCQkJCWF1ZGlvLT5tYXBfdl9yZWFkOwotCQkJCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCQkJCQlhdWRpby0+cGNtX2J1Zl9jb3VudCA9Ci0JCQkJCSAgICBjb25maWcuYnVmZmVyX2NvdW50OwotCQkJCQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQkJCQkJYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0KLQkJCQkJZm9yIChpbmRleCA9IDA7Ci0JCQkJCSAgICAgaW5kZXggPCBjb25maWcuYnVmZmVyX2NvdW50OwotCQkJCQkgICAgIGluZGV4KyspIHsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0uZGF0YSA9Ci0JCQkJCQkgICAgYXVkaW8tPnJlYWRfZGF0YSArIG9mZnNldDsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0uYWRkciA9Ci0JCQkJCQkgICAgYXVkaW8tPnJlYWRfcGh5cyArIG9mZnNldDsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9Ci0JCQkJCQkgICAgY29uZmlnLmJ1ZmZlcl9zaXplOwotCQkJCQkJYXVkaW8tPmluW2luZGV4XS51c2VkID0gMDsKLQkJCQkJCW9mZnNldCArPSBjb25maWcuYnVmZmVyX3NpemU7Ci0JCQkJCX0KLQkJCQkJTU1fREJHKCJyZWFkIGJ1ZjogcGh5IGFkZHIgXAotCQkJCQkJMHglMDh4IGtlcm5lbCBhZGRyIDB4JTA4eFxuIiwKLQkJCQkJCWF1ZGlvLT5yZWFkX3BoeXMsCi0JCQkJCQkoaW50KWF1ZGlvLT5yZWFkX2RhdGEpOwotCQkJCQlyYyA9IDA7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyYyA9IDA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fUEFVU0U6Ci0JCU1NX0RCRygiQVVESU9fUEFVU0UgJWxkXG4iLCBhcmcpOwotCQlyYyA9IGF1ZHBwX3BhdXNlKGF1ZGlvLT5kZWNfaWQsIChpbnQpIGFyZyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKiBPbmx5IHVzZWZ1bCBpbiB0dW5uZWwtbW9kZSAqLwotc3RhdGljIGludCBhdWRpb19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IGEsIGxvZmZfdCBiLAotCWludCBkYXRhc3luYykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCi0JaWYgKCFhdWRpby0+cnVubmluZyB8fCBhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lX25vbG9jazsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKCFhdWRpby0+b3V0WzBdLnVzZWQgJiYKLQkJIWF1ZGlvLT5vdXRbMV0udXNlZCAmJgotCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChhdWRpby0+cmVzZXJ2ZWQpIHsKLQkJTU1fREJHKCJzZW5kIHJlc2VydmVkIGJ5dGVcbiIpOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMF0gPSBhdWRpby0+cnN2X2J5dGU7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMV0gPSAwOwotCQlmcmFtZS0+dXNlZCA9IDI7Ci0JCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCSghYXVkaW8tPm91dFswXS51c2VkICYmCi0JCQkhYXVkaW8tPm91dFsxXS51c2VkICYmCi0JCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gZG9uZTsKLQkJZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQkvKiBwY20gZG1hbWlzcyBtZXNzYWdlIGlzIHNlbnQgY29udGlub3VzbHkKLQkgKiB3aGVuIGRlY29kZXIgaXMgc3RhcnZlZCBzbyBubyByYWNlCi0JICogY29uZGl0aW9uIGNvbmNlcm4KLQkgKi8KLQlhdWRpby0+dGVvcyA9IDA7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJYXVkaW8tPnRlb3MgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAoYXVkaW8tPndmbHVzaCkKLQkJcmMgPSAtRUJVU1k7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci1kb25lX25vbG9jazoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCSAgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0JaW50IHJjID0gMDsKLQotCWlmICghYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJcmV0dXJuIDA7IC8qIFBDTSBmZWVkYmFjayBpcyBub3QgZW5hYmxlZC4gTm90aGluZyB0byByZWFkICovCi0KLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlNTV9EQkcoIiVkIFxuIiwgY291bnQpOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPnJlYWRfd2FpdCwKLQkJCShhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCA+IDApIHx8Ci0JCQkoYXVkaW8tPnN0b3BwZWQpIHx8IChhdWRpby0+cmZsdXNoKSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCi0JCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+cmZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvdW50IDwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQpIHsKLQkJCS8qIFJlYWQgbXVzdCBoYXBwZW4gaW4gZnJhbWUgYm91bmRhcnkuIFNpbmNlIGRyaXZlcgotCQkJICAgZG9lcyBub3Qga25vdyBmcmFtZSBzaXplLCByZWFkIGNvdW50IG11c3QgYmUgZ3JlYXRlcgotCQkJICAgb3IgZXF1YWwgdG8gc2l6ZSBvZiBQQ00gc2FtcGxlcyAqLwotCQkJTU1fREJHKCJhdWRpb19yZWFkOiBubyBwYXJ0aWFsIGZyYW1lIGRvbmUgcmVhZGluZ1xuIik7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygiYXVkaW9fcmVhZDogcmVhZCBmcm9tIGluWyVkXVxuIiwKLQkJCQkJYXVkaW8tPnJlYWRfbmV4dCk7Ci0JCQkvKiBvcmRlciByZWFkcyBmcm9tIHRoZSBvdXRwdXQgYnVmZmVyICovCi0JCQlybWIoKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIKLQkJCSAgICAoYnVmLCBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0uZGF0YSwKLQkJCSAgICAgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQpKSB7Ci0JCQkJTU1fRVJSKCJpbnZhbGlkIGFkZHIgJXggXG4iLCAodW5zaWduZWQgaW50KWJ1Zik7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY291bnQgLT0gYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQ7Ci0JCQlidWYgKz0gYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQ7Ci0JCQlhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCA9IDA7Ci0JCQlpZiAoKCsrYXVkaW8tPnJlYWRfbmV4dCkgPT0gYXVkaW8tPnBjbV9idWZfY291bnQpCi0JCQkJYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JCQlicmVhazsJLyogRm9yY2UgdG8gZXhpdCB3aGlsZSBsb29wCi0JCQkJICogdG8gcHJldmVudCBvdXRwdXQgdGhyZWFkCi0JCQkJICogc2xlZXAgdG9vIGxvbmcgaWYgZGF0YSBpcwotCQkJCSAqIG5vdCByZWFkeSBhdCB0aGlzIG1vbWVudC4KLQkJCQkgKi8KLQkJfQotCX0KLQotCS8qIGRvbid0IGZlZWQgb3V0cHV0IGJ1ZmZlciB0byBIVyBkZWNvZGVyIGR1cmluZyBmbHVzaGluZwotCSAqIGJ1ZmZlciByZWZyZXNoIGNvbW1hbmQgd2lsbCBiZSBzZW50IG9uY2UgZmx1c2ggY29tcGxldGVzCi0JICogc2VuZCBidWYgcmVmcmVzaCBjb21tYW5kIGhlcmUgY2FuIGNvbmZ1c2UgSFcgZGVjb2RlcgotCSAqLwotCWlmIChhdWRpby0+YnVmX3JlZnJlc2ggJiYgIWF1ZGlvLT5yZmx1c2gpIHsKLQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQkJTU1fREJHKCJraWNrIHN0YXJ0IHBjbSBmZWVkYmFjayBhZ2FpblxuIik7Ci0JCWF1ZHBsYXlfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCX0KLQotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0KLQlpZiAoYnVmID4gc3RhcnQpCi0JCXJjID0gYnVmIC0gc3RhcnQ7Ci0KLQlNTV9EQkcoInJlYWQgJWQgYnl0ZXNcbiIsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkd21hX3Byb2Nlc3NfZW9zKHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCWNvbnN0IGNoYXIgX191c2VyICpidWZfc3RhcnQsIHVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JY2hhciAqYnVmX3B0cjsKLQotCWlmIChhdWRpby0+cmVzZXJ2ZWQpIHsKLQkJTU1fREJHKCJmbHVzaCByZXNlcnZlIGJ5dGVcbiIpOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0JCWJ1Zl9wdHIgPSBmcmFtZS0+ZGF0YTsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJKGZyYW1lLT51c2VkID09IDApCi0JCQkJfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQkJCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGRvbmU7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWJ1Zl9wdHJbMF0gPSBhdWRpby0+cnN2X2J5dGU7Ci0JCWJ1Zl9wdHJbMV0gPSAwOwotCQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQkJZnJhbWUtPm1maWVsZF9zeiA9IDA7Ci0JCWZyYW1lLT51c2VkID0gMjsKLQkJYXVkaW8tPnJlc2VydmVkID0gMDsKLQkJYXVkcGxheV9zZW5kX2RhdGEoYXVkaW8sIDApOwotCX0KLQotCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoYXVkaW8tPm91dF9uZWVkZWQgJiYKLQkJYXVkaW8tPm91dFswXS51c2VkID09IDAgJiYKLQkJYXVkaW8tPm91dFsxXS51c2VkID09IDApCi0JCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcihmcmFtZS0+ZGF0YSwgYnVmX3N0YXJ0LCBtZmllbGRfc2l6ZSkpIHsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZnJhbWUtPm1maWVsZF9zeiA9IG1maWVsZF9zaXplOwotCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCWZyYW1lLT51c2VkID0gbWZpZWxkX3NpemU7Ci0JYXVkcGxheV9zZW5kX2RhdGEoYXVkaW8sIDApOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGlvX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQlzaXplX3QgeGZlcjsKLQljaGFyICpjcHlfcHRyOwotCWludCByYyA9IDAsIGVvc19jb25kaXRpb24gPSBBVURXTUFfRU9TX05PTkU7Ci0JdW5zaWduZWQgZHNpemU7Ci0JdW5zaWduZWQgc2hvcnQgbWZpZWxkX3NpemUgPSAwOwotCi0JTU1fREJHKCJjbnQ9JWRcbiIsIGNvdW50KTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQkJY3B5X3B0ciA9IGZyYW1lLT5kYXRhOwotCQlkc2l6ZSA9IDA7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCQkgICAgICAoZnJhbWUtPnVzZWQgPT0gMCkKLQkJCQkJICAgICAgfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQkJCQkJICB8fCAoYXVkaW8tPndmbHVzaCkpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChhdWRpby0+bWZpZWxkKSB7Ci0JCQlpZiAoYnVmID09IHN0YXJ0KSB7Ci0JCQkJLyogUHJvY2Vzc2luZyBiZWdpbm5pbmcgb2YgdXNlciBidWZmZXIgKi8KLQkJCQlpZiAoX19nZXRfdXNlcihtZmllbGRfc2l6ZSwKLQkJCQkJKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSBidWYpKSB7Ci0JCQkJCXJjID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlICBpZiAobWZpZWxkX3NpemUgPiBjb3VudCkgewotCQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlNTV9EQkcoImF1ZGlvX3dyaXRlOiBtZiBvZmZzZXRfdmFsICV4XG4iLAotCQkJCQkJbWZpZWxkX3NpemUpOwotCQkJCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIG1maWVsZF9zaXplKSkgewotCQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvKiBDaGVjayBpZiBFT1MgZmxhZyBpcyBzZXQgYW5kIGJ1ZmZlciBoYXMKLQkJCQkgKiBjb250YWlucyBqdXN0IG1ldGEgZmllbGQKLQkJCQkgKi8KLQkJCQlpZiAoY3B5X3B0cltBVURXTUFfRU9TX0ZMR19PRkZTRVRdICYKLQkJCQkJCSBBVURXTUFfRU9TX0ZMR19NQVNLKSB7Ci0JCQkJCU1NX0RCRygiYXVkaW9fd3JpdGU6IEVPUyBTRVRcbiIpOwotCQkJCQllb3NfY29uZGl0aW9uID0gQVVEV01BX0VPU19TRVQ7Ci0JCQkJCWlmIChtZmllbGRfc2l6ZSA9PSBjb3VudCkgewotCQkJCQkJYnVmICs9IG1maWVsZF9zaXplOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZQotCQkJCQkJY3B5X3B0cltBVURXTUFfRU9TX0ZMR19PRkZTRVRdCi0JCQkJCQkJJj0gfkFVRFdNQV9FT1NfRkxHX01BU0s7Ci0JCQkJfQotCQkJCWNweV9wdHIgKz0gbWZpZWxkX3NpemU7Ci0JCQkJY291bnQgLT0gbWZpZWxkX3NpemU7Ci0JCQkJZHNpemUgKz0gbWZpZWxkX3NpemU7Ci0JCQkJYnVmICs9IG1maWVsZF9zaXplOwotCQkJfSBlbHNlIHsKLQkJCQltZmllbGRfc2l6ZSA9IDA7Ci0JCQkJTU1fREJHKCJhdWRpb193cml0ZTogY29udGludW91cyBidWZmZXJcbiIpOwotCQkJfQotCQkJZnJhbWUtPm1maWVsZF9zeiA9IG1maWVsZF9zaXplOwotCQl9Ci0KLQkJaWYgKGF1ZGlvLT5yZXNlcnZlZCkgewotCQkJTU1fREJHKCJhcHBlbmQgcmVzZXJ2ZWQgYnl0ZSAleFxuIiwgYXVkaW8tPnJzdl9ieXRlKTsKLQkJCSpjcHlfcHRyID0gYXVkaW8tPnJzdl9ieXRlOwotCQkJeGZlciA9IChjb3VudCA+ICgoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkgLSAxKSkgPwotCQkJCShmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSAtIDEgOiBjb3VudDsKLQkJCWNweV9wdHIrKzsKLQkJCWRzaXplICs9IDE7Ci0JCQlhdWRpby0+cmVzZXJ2ZWQgPSAwOwotCQl9IGVsc2UKLQkJCXhmZXIgPSAoY291bnQgPiAoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkpID8KLQkJCQkoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkgOiBjb3VudDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCB4ZmVyKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlkc2l6ZSArPSB4ZmVyOwotCQlpZiAoZHNpemUgJiAxKSB7Ci0JCQlhdWRpby0+cnN2X2J5dGUgPSAoKGNoYXIgKikgZnJhbWUtPmRhdGEpW2RzaXplIC0gMV07Ci0JCQlNTV9EQkcoIm9kZCBsZW5ndGggYnVmIHJlc2VydmUgbGFzdCBieXRlICV4XG4iLAotCQkJCQlhdWRpby0+cnN2X2J5dGUpOwotCQkJYXVkaW8tPnJlc2VydmVkID0gMTsKLQkJCWRzaXplLS07Ci0JCX0KLQkJY291bnQgLT0geGZlcjsKLQkJYnVmICs9IHhmZXI7Ci0KLQkJaWYgKGRzaXplID4gMCkgewotCQkJYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JCQlmcmFtZS0+dXNlZCA9IGRzaXplOwotCQkJYXVkcGxheV9zZW5kX2RhdGEoYXVkaW8sIDApOwotCQl9Ci0JfQotCWlmIChlb3NfY29uZGl0aW9uID09IEFVRFdNQV9FT1NfU0VUKQotCQlyYyA9IGF1ZHdtYV9wcm9jZXNzX2VvcyhhdWRpbywgc3RhcnQsIG1maWVsZF9zaXplKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlpZiAoIXJjKSB7Ci0JCWlmIChidWYgPiBzdGFydCkKLQkJCXJldHVybiBidWYgLSBzdGFydDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCU1NX0lORk8oImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBmcmVlaW5nXG4iLCAoaW50KWF1ZGlvKTsKLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkaW9fZGlzYWJsZShhdWRpbyk7Ci0JaWYgKGF1ZGlvLT5ybXRfcmVzb3VyY2VfcmVsZWFzZWQgPT0gMCkKLQkJcm10X3B1dF9yZXNvdXJjZShhdWRpbyk7Ci0JYXVkaW9fZmx1c2goYXVkaW8pOwotCWF1ZGlvX2ZsdXNoX3BjbV9idWYoYXVkaW8pOwotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci0JYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0JdW5yZWdpc3Rlcl9lYXJseV9zdXNwZW5kKCZhdWRpby0+c3VzcGVuZF9jdGwubm9kZSk7Ci0jZW5kaWYKLQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAxOwotCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQlhdWR3bWFfcmVzZXRfZXZlbnRfcXVldWUoYXVkaW8pOwotCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci0JaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci0JaWYgKGF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSAhPSBOVUxMKSB7Ci0JCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLQl9Ci0JaW9uX2NsaWVudF9kZXN0cm95KGF1ZGlvLT5jbGllbnQpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCWlmIChhdWRpby0+ZGVudHJ5KQotCQlkZWJ1Z2ZzX3JlbW92ZShhdWRpby0+ZGVudHJ5KTsKLSNlbmRpZgotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdGF0aWMgdm9pZCBhdWR3bWFfcG9zdF9ldmVudChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCkKLXsKLQlzdHJ1Y3QgYXVkd21hX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpKSB7Ci0JCWVfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWR3bWFfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZV9ub2RlLT5saXN0KTsKLQl9IGVsc2UgewotCQllX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkd21hX2V2ZW50KSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghZV9ub2RlKSB7Ci0JCQlNTV9FUlIoIk5vIG1lbSB0byBwb3N0IGV2ZW50ICVkXG4iLCB0eXBlKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQllX25vZGUtPmV2ZW50X3R5cGUgPSB0eXBlOwotCWVfbm9kZS0+cGF5bG9hZCA9IHBheWxvYWQ7Ci0KLQlsaXN0X2FkZF90YWlsKCZlX25vZGUtPmxpc3QsICZhdWRpby0+ZXZlbnRfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotfQotCi1zdGF0aWMgdm9pZCBhdWR3bWFfc3VzcGVuZChzdHJ1Y3QgZWFybHlfc3VzcGVuZCAqaCkKLXsKLQlzdHJ1Y3QgYXVkd21hX3N1c3BlbmRfY3RsICpjdGwgPQotCQljb250YWluZXJfb2YoaCwgc3RydWN0IGF1ZHdtYV9zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkd21hX3Bvc3RfZXZlbnQoY3RsLT5hdWRpbywgQVVESU9fRVZFTlRfU1VTUEVORCwgcGF5bG9hZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHdtYV9yZXN1bWUoc3RydWN0IGVhcmx5X3N1c3BlbmQgKmgpCi17Ci0Jc3RydWN0IGF1ZHdtYV9zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWR3bWFfc3VzcGVuZF9jdGwsIG5vZGUpOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWF1ZHdtYV9wb3N0X2V2ZW50KGN0bC0+YXVkaW8sIEFVRElPX0VWRU5UX1JFU1VNRSwgcGF5bG9hZCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIHNzaXplX3QgYXVkd21hX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkd21hX2RlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNvbnN0IGludCBkZWJ1Z19idWZtYXggPSA0MDk2OwotCXN0YXRpYyBjaGFyIGJ1ZmZlcls0MDk2XTsKLQlpbnQgbiA9IDAsIGk7Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQluID0gc2NucHJpbnRmKGJ1ZmZlciwgZGVidWdfYnVmbWF4LCAib3BlbmVkICVkXG4iLCBhdWRpby0+b3BlbmVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJlbmFibGVkICVkXG4iLCBhdWRpby0+ZW5hYmxlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAic3RvcHBlZCAlZFxuIiwgYXVkaW8tPnN0b3BwZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInBjbV9mZWVkYmFjayAlZFxuIiwgYXVkaW8tPnBjbV9mZWVkYmFjayk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0X2J1Zl9zeiAlZFxuIiwgYXVkaW8tPm91dFswXS5zaXplKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJwY21fYnVmX2NvdW50ICVkIFxuIiwgYXVkaW8tPnBjbV9idWZfY291bnQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInBjbV9idWZfc3ogJWQgXG4iLCBhdWRpby0+aW5bMF0uc2l6ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAidm9sdW1lICV4IFxuIiwgYXVkaW8tPnZvbF9wYW4udm9sdW1lKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJzYW1wbGUgcmF0ZSAlZCBcbiIsIGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCSJjaGFubmVsIG1vZGUgJWQgXG4iLCBhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JLyogRm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgb25seSB1c2VmdWwgZm9yIGRlYnVnZ2luZyB3aGVuCi0JICogd2hlbiBwbGF5YmFjayBoYWx0cyB1bmV4cGVjdGVkbHkuIFRodXMsIG5vIG11dHVhbCBleGNsdXNpb24KLQkgKiBlbmZvcmNlZAotCSAqLwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIndmbHVzaCAlZFxuIiwgYXVkaW8tPndmbHVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicmZsdXNoICVkXG4iLCBhdWRpby0+cmZsdXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJydW5uaW5nICVkIFxuIiwgYXVkaW8tPnJ1bm5pbmcpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiZGVjIHN0YXRlICVkIFxuIiwgYXVkaW8tPmRlY19zdGF0ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0X25lZWRlZCAlZCBcbiIsIGF1ZGlvLT5vdXRfbmVlZGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfaGVhZCAlZCBcbiIsIGF1ZGlvLT5vdXRfaGVhZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0X3RhaWwgJWQgXG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dFswXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFswXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRbMV0udXNlZCAlZCBcbiIsIGF1ZGlvLT5vdXRbMV0udXNlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAiYnVmZmVyX3JlZnJlc2ggJWQgXG4iLCBhdWRpby0+YnVmX3JlZnJlc2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInJlYWRfbmV4dCAlZCBcbiIsIGF1ZGlvLT5yZWFkX25leHQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgImZpbGxfbmV4dCAlZCBcbiIsIGF1ZGlvLT5maWxsX25leHQpOwotCWZvciAoaSA9IDA7IGkgPCBhdWRpby0+cGNtX2J1Zl9jb3VudDsgaSsrKQotCQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImluWyVkXS5zaXplICVkIFxuIiwgaSwgYXVkaW8tPmluW2ldLnVzZWQpOwotCWJ1ZmZlcltuXSA9IDA7Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGJ1ZmZlciwgbik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZHdtYV9kZWJ1Z19mb3BzID0gewotCS5yZWFkID0gYXVkd21hX2RlYnVnX3JlYWQsCi0JLm9wZW4gPSBhdWR3bWFfZGVidWdfb3BlbiwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBhdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBOVUxMOwotCWludCByYywgZGVjX2F0dHJiLCBkZWNpZCwgaTsKLQl1bnNpZ25lZCBtZW1fc3ogPSBETUFTWl9NQVg7Ci0Jc3RydWN0IGF1ZHdtYV9ldmVudCAqZV9ub2RlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGlvbmZsYWcgPSAwOwotCWlvbl9waHlzX2FkZHJfdCBhZGRyID0gMDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50ID0gTlVMTDsKLQlpbnQgbGVuID0gMDsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV93bWFfIiArIDVdOwotI2VuZGlmCi0KLQkvKiBBbGxvY2F0ZSBNZW0gZm9yIGF1ZGlvIGluc3RhbmNlICovCi0JYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWF1ZGlvKSB7Ci0JCU1NX0VSUigibm8gbWVtb3J5IHRvIGFsbG9jYXRlIGF1ZGlvIGluc3RhbmNlIFxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQlNTV9JTkZPKCJhdWRpbyBpbnN0YW5jZSAweCUwOHggY3JlYXRlZFxuIiwgKGludClhdWRpbyk7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgZGVjb2RlciAqLwotCWRlY19hdHRyYiA9IEFVRERFQ19ERUNfV01BOwotCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9OT05UVU5ORUw7Ci0JCWF1ZGlvLT5wY21fZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREVfUExBWUJBQ0s7Ci0JfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWRlY19hdHRyYiB8PSBNU01fQVVEX01PREVfVFVOTkVMOwotCQlhdWRpby0+cGNtX2ZlZWRiYWNrID0gVFVOTkVMX01PREVfUExBWUJBQ0s7Ci0JfSBlbHNlIHsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlkZWNpZCA9IGF1ZHBwX2FkZWNfYWxsb2MoZGVjX2F0dHJiLCAmYXVkaW8tPm1vZHVsZV9uYW1lLAotCQkJJmF1ZGlvLT5xdWV1ZV9pZCk7Ci0KLQlpZiAoZGVjaWQgPCAwKSB7Ci0JCU1NX0VSUigiTm8gZnJlZSBkZWNvZGVyIGF2YWlsYWJsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJKGludClhdWRpbyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJa2ZyZWUoYXVkaW8pOwotCQlnb3RvIGRvbmU7Ci0JfQotCWF1ZGlvLT5kZWNfaWQgPSBkZWNpZCAmIE1TTV9BVURfREVDT0RFUl9NQVNLOwotCi0JY2xpZW50ID0gbXNtX2lvbl9jbGllbnRfY3JlYXRlKFVJTlRfTUFYLCAiQXVkaW9fV01BX0NsaWVudCIpOwotCWlmIChJU19FUlJfT1JfTlVMTChjbGllbnQpKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGNyZWF0ZSBJT04gY2xpZW50XG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGNsaWVudF9jcmVhdGVfZXJyb3I7Ci0JfQotCWF1ZGlvLT5jbGllbnQgPSBjbGllbnQ7Ci0KLQloYW5kbGUgPSBpb25fYWxsb2MoY2xpZW50LCBtZW1fc3osIFNaXzRLLAotCQlJT05fSEVBUChJT05fQVVESU9fSEVBUF9JRCksIDApOwotCWlmIChJU19FUlJfT1JfTlVMTChoYW5kbGUpKSB7Ci0JCU1NX0VSUigiVW5hYmxlIHRvIGNyZWF0ZSBhbGxvY2F0ZSBPL1AgYnVmZmVyc1xuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRwdXRfYnVmZl9hbGxvY19lcnJvcjsKLQl9Ci0JYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSA9IGhhbmRsZTsKLQotCXJjID0gaW9uX3BoeXMoY2xpZW50LCBoYW5kbGUsICZhZGRyLCAmbGVuKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJPL1AgYnVmZmVyczpJbnZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJKHVuc2lnbmVkIGludCkgYWRkciwgKHVuc2lnbmVkIGludCkgbGVuKTsKLQkJZ290byBvdXRwdXRfYnVmZl9nZXRfcGh5c19lcnJvcjsKLQl9IGVsc2UgewotCQlNTV9JTkZPKCJPL1AgYnVmZmVyczp2YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JfQotCWF1ZGlvLT5waHlzID0gKGludDMyX3QpYWRkcjsKLQotCi0JcmMgPSBpb25faGFuZGxlX2dldF9mbGFncyhjbGllbnQsIGhhbmRsZSwgJmlvbmZsYWcpOwotCWlmIChyYykgewotCQlNTV9FUlIoImNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIpOwotCQlnb3RvIG91dHB1dF9idWZmX2dldF9mbGFnc19lcnJvcjsKLQl9Ci0KLQlhdWRpby0+bWFwX3Zfd3JpdGUgPSBpb25fbWFwX2tlcm5lbChjbGllbnQsIGhhbmRsZSk7Ci0JaWYgKElTX0VSUihhdWRpby0+bWFwX3Zfd3JpdGUpKSB7Ci0JCU1NX0VSUigiY291bGQgbm90IG1hcCB3cml0ZSBidWZmZXJzXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dHB1dF9idWZmX21hcF9lcnJvcjsKLQl9Ci0JYXVkaW8tPmRhdGEgPSBhdWRpby0+bWFwX3Zfd3JpdGU7Ci0JTU1fREJHKCJ3cml0ZSBidWY6IHBoeSBhZGRyIDB4JTA4eCBrZXJuZWwgYWRkciAweCUwOHhcbiIsCi0JCWF1ZGlvLT5waHlzLCAoaW50KWF1ZGlvLT5kYXRhKTsKLQotCWF1ZGlvLT5vdXRfZG1hX3N6ID0gbWVtX3N6OwotCi0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2sgPT0gVFVOTkVMX01PREVfUExBWUJBQ0spIHsKLQkJcmMgPSBhdWRtZ3Jfb3BlbigmYXVkaW8tPmF1ZG1ncik7Ci0JCWlmIChyYykgewotCQkJTU1fRVJSKCJhdWRtZ3Igb3BlbiBmYWlsZWQsIGZyZWVpbmcgaW5zdGFuY2UgXAotCQkJCQkweCUwOHhcbiIsIChpbnQpYXVkaW8pOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0KLQlyYyA9IG1zbV9hZHNwX2dldChhdWRpby0+bW9kdWxlX25hbWUsICZhdWRpby0+YXVkcGxheSwKLQkJCSZhdWRwbGF5X2Fkc3Bfb3BzX3dtYSwgYXVkaW8pOwotCWlmIChyYykgewotCQlNTV9FUlIoImZhaWxlZCB0byBnZXQgJXMgbW9kdWxlLCBmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQlhdWRpby0+bW9kdWxlX25hbWUsIChpbnQpYXVkaW8pOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykKLQkJCWF1ZG1ncl9jbG9zZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJjID0gcm10X2dldF9yZXNvdXJjZShhdWRpbyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiQURTUCByZXNvdXJjZXMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIFdNQSBzZXNzaW9uIFwKLQkJCSAweCUwOHggb24gZGVjb2RlcjogJWRcbiIsIChpbnQpYXVkaW8sIGF1ZGlvLT5kZWNfaWQpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjayA9PSBUVU5ORUxfTU9ERV9QTEFZQkFDSykKLQkJCWF1ZG1ncl9jbG9zZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPmxvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+cmVhZF9sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZHNwX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+cmVhZF93YWl0KTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+ZXZlbnRfcXVldWUpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrKTsKLQotCWF1ZGlvLT5vdXRbMF0uZGF0YSA9IGF1ZGlvLT5kYXRhICsgMDsKLQlhdWRpby0+b3V0WzBdLmFkZHIgPSBhdWRpby0+cGh5cyArIDA7Ci0JYXVkaW8tPm91dFswXS5zaXplID0gYXVkaW8tPm91dF9kbWFfc3ogPj4gMTsKLQotCWF1ZGlvLT5vdXRbMV0uZGF0YSA9IGF1ZGlvLT5kYXRhICsgYXVkaW8tPm91dFswXS5zaXplOwotCWF1ZGlvLT5vdXRbMV0uYWRkciA9IGF1ZGlvLT5waHlzICsgYXVkaW8tPm91dFswXS5zaXplOwotCWF1ZGlvLT5vdXRbMV0uc2l6ZSA9IGF1ZGlvLT5vdXRbMF0uc2l6ZTsKLQotCWF1ZGlvLT53bWFfY29uZmlnLmFybWRhdGFyZXF0aHIgPSAgMTI2MjsKLQlhdWRpby0+d21hX2NvbmZpZy5jaGFubmVsc2RlY29kZWQgPSAyOwotCWF1ZGlvLT53bWFfY29uZmlnLndtYWJ5dGVzcGVyc2VjID0gNjAwMzsKLQlhdWRpby0+d21hX2NvbmZpZy53bWFzYW1wbGluZ2ZyZXEgPSA0NDEwMDsKLQlhdWRpby0+d21hX2NvbmZpZy53bWFlbmNvZGVyb3B0cyA9IDMxOwotCi0JYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSA9IDQ0MTAwOwotCWF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID0gQVVEUFBfQ01EX1BDTV9JTlRGX1NURVJFT19WOwotCi0JYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gMHgyMDAwOwotCi0JYXVkaW9fZmx1c2goYXVkaW8pOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0JYXVkaW8tPm9wZW5lZCA9IDE7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mIG5hbWUsICJtc21fd21hXyUwNHgiLCBhdWRpby0+ZGVjX2lkKTsKLQlhdWRpby0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQlOVUxMLCAodm9pZCAqKSBhdWRpbywKLQkJCQkmYXVkd21hX2RlYnVnX2ZvcHMpOwotCi0JaWYgKElTX0VSUihhdWRpby0+ZGVudHJ5KSkKLQkJTU1fREJHKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLmxldmVsID0gRUFSTFlfU1VTUEVORF9MRVZFTF9ESVNBQkxFX0ZCOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLnJlc3VtZSA9IGF1ZHdtYV9yZXN1bWU7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUuc3VzcGVuZCA9IGF1ZHdtYV9zdXNwZW5kOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5hdWRpbyA9IGF1ZGlvOwotCXJlZ2lzdGVyX2Vhcmx5X3N1c3BlbmQoJmF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlKTsKLSNlbmRpZgotCWZvciAoaSA9IDA7IGkgPCBBVURXTUFfRVZFTlRfTlVNOyBpKyspIHsKLQkJZV9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZHdtYV9ldmVudCksIEdGUF9LRVJORUwpOwotCQlpZiAoZV9ub2RlKQotCQkJbGlzdF9hZGRfdGFpbCgmZV9ub2RlLT5saXN0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCQllbHNlIHsKLQkJCU1NX0VSUigiZXZlbnQgcGt0IGFsbG9jIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotZXJyOgotCWlvbl91bm1hcF9rZXJuZWwoY2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLW91dHB1dF9idWZmX21hcF9lcnJvcjoKLW91dHB1dF9idWZmX2dldF9waHlzX2Vycm9yOgotb3V0cHV0X2J1ZmZfZ2V0X2ZsYWdzX2Vycm9yOgotCWlvbl9mcmVlKGNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci1vdXRwdXRfYnVmZl9hbGxvY19lcnJvcjoKLQlpb25fY2xpZW50X2Rlc3Ryb3koY2xpZW50KTsKLWNsaWVudF9jcmVhdGVfZXJyb3I6Ci0JYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX3dtYV9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBhdWRpb19vcGVuLAotCS5yZWxlYXNlCT0gYXVkaW9fcmVsZWFzZSwKLQkucmVhZCAJCT0gYXVkaW9fcmVhZCwKLQkud3JpdGUJCT0gYXVkaW9fd3JpdGUsCi0JLnVubG9ja2VkX2lvY3RsCT0gYXVkaW9faW9jdGwsCi0JLmZzeW5jIAkJPSBhdWRpb19mc3luYywKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX3dtYV9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fd21hIiwKLQkuZm9wcwk9ICZhdWRpb193bWFfZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGlvX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fd21hX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoYXVkaW9faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb193bWFwcm8uYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX3dtYXByby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTFkMWQ2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZGlvX3dtYXByby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgzNyArMCwwIEBACi0vKiBhdWRpb193bWFwcm8uYyAtIHdtYXBybyBhdWRpbyBkZWNvZGVyIGRyaXZlcgotICoKLSAqIEJhc2VkIG9uIHRoZSBtcDMgbmF0aXZlIGRyaXZlciBpbiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRpb19tcDMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBBbGwgc291cmNlIGNvZGUgaW4gdGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBleGNlcHQKLSAqIHdoZXJlIGluZGljYXRlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCi0gKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBmaW5kIGl0IGF0IGh0dHA6Ly93d3cuZnNmLm9yZwotICovCi0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZWFybHlzdXNwZW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb193bWFwcm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwY21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcG1zZy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcC5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwbGF5Y21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwbGF5bXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNXJtdGNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fbWVtdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdV9kb21haW5zLmg+Ci0KLSNpbmNsdWRlICJhdWRtZ3IuaCIKLQotLyogU2l6ZSBtdXN0IGJlIHBvd2VyIG9mIDIgKi8KLSNkZWZpbmUgQlVGU1pfTUFYCTgyMDYJLyogSW5jbHVkZXMgbWV0YSBpbiBzaXplICovCi0jZGVmaW5lIEJVRlNaX01JTiAJMjA2MgkvKiBJbmNsdWRlcyBtZXRhIGluIHNpemUgKi8KLSNkZWZpbmUgRE1BU1pfTUFYIAkoQlVGU1pfTUFYICogMikKLSNkZWZpbmUgRE1BU1pfTUlOIAkoQlVGU1pfTUlOICogMikKLQotI2RlZmluZSBBVURQTEFZX0lOVkFMSURfUkVBRF9QVFJfT0ZGU0VUCTB4RkZGRgotI2RlZmluZSBBVURERUNfREVDX1dNQVBSTyAxMwotCi0jZGVmaW5lIFBDTV9CVUZTWl9NSU4gCTgyMTYgCS8qIEhvbGQgb25lIHN0ZXJlbyBXTUFQUk8gZnJhbWUgYW5kIG1ldGEgb3V0Ki8KLSNkZWZpbmUgUENNX0JVRl9NQVhfQ09VTlQgNQkvKiBEU1Agb25seSBhY2NlcHRzIDUgYnVmZmVycyBhdCBtb3N0Ci0JCQkJICAgYnV0IHN1cHBvcnQgMiBidWZmZXJzIGN1cnJlbnRseSAqLwotI2RlZmluZSBST1VUSU5HX01PREVfRlRSVCAxCi0jZGVmaW5lIFJPVVRJTkdfTU9ERV9SVCAyCi0vKiBEZWNvZGVyIHN0YXR1cyByZWNlaXZlZCBmcm9tIEFVRFBQVEFTSyAqLwotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19TTEVFUAkwCi0jZGVmaW5lCSBBVURQUF9ERUNfU1RBVFVTX0lOSVQgIDEKLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfQ0ZHICAgMgotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19QTEFZICAzCi0KLSNkZWZpbmUgQVVEV01BUFJPX01FVEFGSUVMRF9NQVNLIDB4RkZGRjAwMDAKLSNkZWZpbmUgQVVEV01BUFJPX0VPU19GTEdfT0ZGU0VUIDB4MEEgLyogT2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIGJ1ZmZlciAqLwotI2RlZmluZSBBVURXTUFQUk9fRU9TX0ZMR19NQVNLIDB4MDEKLSNkZWZpbmUgQVVEV01BUFJPX0VPU19OT05FIDB4MCAvKiBObyBFT1MgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgQVVEV01BUFJPX0VPU19TRVQgMHgxIC8qIEVPUyBzZXQgaW4gbWV0YSBmaWVsZCAqLwotCi0jZGVmaW5lIEFVRFdNQVBST19FVkVOVF9OVU0gMTAgLyogRGVmYXVsdCBuby4gb2YgcHJlLWFsbG9jYXRlZCBldmVudCBwYWNrZXRzICovCi0KLXN0cnVjdCBidWZmZXIgewotCXZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgc2l6ZTsKLQl1bnNpZ25lZCB1c2VkOwkJLyogSW5wdXQgdXNhZ2UgYWN0dWFsIERTUCBwcm9kdWNlZCBQQ00gc2l6ZSAgKi8KLQl1bnNpZ25lZCBhZGRyOwotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zejsgLypvbmx5IHVzZWZ1bCBmb3IgZGF0YSBoYXMgbWV0YSBmaWVsZCAqLwotfTsKLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdHJ1Y3QgYXVkd21hcHJvX3N1c3BlbmRfY3RsIHsKLQlzdHJ1Y3QgZWFybHlfc3VzcGVuZCBub2RlOwotCXN0cnVjdCBhdWRpbyAqYXVkaW87Ci19OwotI2VuZGlmCi0KLXN0cnVjdCBhdWR3bWFwcm9fZXZlbnR7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCWludCBldmVudF90eXBlOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci19OwotCi1zdHJ1Y3QgYXVkaW8gewotCXN0cnVjdCBidWZmZXIgb3V0WzJdOwotCi0Jc3BpbmxvY2tfdCBkc3BfbG9jazsKLQotCXVpbnQ4X3Qgb3V0X2hlYWQ7Ci0JdWludDhfdCBvdXRfdGFpbDsKLQl1aW50OF90IG91dF9uZWVkZWQ7IC8qIG51bWJlciBvZiBidWZmZXJzIHRoZSBkc3AgaXMgd2FpdGluZyBmb3IgKi8KLQl1bnNpZ25lZCBvdXRfZG1hX3N6OwotCi0JYXRvbWljX3Qgb3V0X2J5dGVzOwotCi0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IG11dGV4IHdyaXRlX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd3JpdGVfd2FpdDsKLQotCS8qIEhvc3QgUENNIHNlY3Rpb24gKi8KLQlzdHJ1Y3QgYnVmZmVyIGluW1BDTV9CVUZfTUFYX0NPVU5UXTsKLQlzdHJ1Y3QgbXV0ZXggcmVhZF9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHJlYWRfd2FpdDsJLyogV2FpdCBxdWV1ZSBmb3IgcmVhZCAqLwotCWNoYXIgKnJlYWRfZGF0YTsJLyogcG9pbnRlciB0byByZWFkZXIgYnVmZmVyICovCi0JaW50MzJfdCByZWFkX3BoeXM7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgcmVhZGVyIGJ1ZmZlciAqLwotCXVpbnQ4X3QgcmVhZF9uZXh0OwkvKiBpbmRleCB0byBpbnB1dCBidWZmZXJzIHRvIGJlIHJlYWQgbmV4dCAqLwotCXVpbnQ4X3QgZmlsbF9uZXh0OwkvKiBpbmRleCB0byBidWZmZXIgdGhhdCBEU1Agc2hvdWxkIGJlIGZpbGxpbmcgKi8KLQl1aW50OF90IHBjbV9idWZfY291bnQ7CS8qIG51bWJlciBvZiBwY20gYnVmZmVyIGFsbG9jYXRlZCAqLwotCS8qIC0tLS0gRW5kIG9mIEhvc3QgUENNIHNlY3Rpb24gKi8KLQotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKmF1ZHBsYXk7Ci0KLQkvKiBjb25maWd1cmF0aW9uIHRvIHVzZSBvbiBuZXh0IGVuYWJsZSAqLwotCXVpbnQzMl90IG91dF9zYW1wbGVfcmF0ZTsKLQl1aW50MzJfdCBvdXRfY2hhbm5lbF9tb2RlOwotCi0Jc3RydWN0IG1zbV9hdWRpb193bWFwcm9fY29uZmlnIHdtYXByb19jb25maWc7Ci0Jc3RydWN0IGF1ZG1nciBhdWRtZ3I7Ci0KLQkvKiBkYXRhIGFsbG9jYXRlZCBmb3IgdmFyaW91cyBidWZmZXJzICovCi0JY2hhciAqZGF0YTsKLQlpbnQzMl90IHBoeXM7IC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygd3JpdGUgYnVmZmVyICovCi0Jdm9pZCAqbWFwX3ZfcmVhZDsKLQl2b2lkICptYXBfdl93cml0ZTsKLQotCWludCBtZmllbGQ7IC8qIG1ldGEgZmllbGQgZW1iZWRkZWQgaW4gZGF0YSAqLwotCWludCByZmx1c2g7IC8qIFJlYWQgIGZsdXNoICovCi0JaW50IHdmbHVzaDsgLyogV3JpdGUgZmx1c2ggKi8KLQlpbnQgb3BlbmVkOwotCWludCBlbmFibGVkOwotCWludCBydW5uaW5nOwotCWludCBzdG9wcGVkOyAvKiBzZXQgd2hlbiBzdG9wcGVkLCBjbGVhcmVkIG9uIGZsdXNoICovCi0JaW50IHBjbV9mZWVkYmFjazsKLQlpbnQgYnVmX3JlZnJlc2g7Ci0JaW50IHJtdF9yZXNvdXJjZV9yZWxlYXNlZDsKLQlpbnQgdGVvczsgLyogdmFsaWQgb25seSBpZiB0dW5uZWwgbW9kZSAmIG5vIGRhdGEgbGVmdCBmb3IgZGVjb2RlciAqLwotCWVudW0gbXNtX2F1ZF9kZWNvZGVyX3N0YXRlIGRlY19zdGF0ZTsJLyogUmVwcmVzZW50cyBkZWNvZGVyIHN0YXRlICovCi0JaW50IHJlc2VydmVkOyAvKiBBIGJ5dGUgaXMgYmVpbmcgcmVzZXJ2ZWQgKi8KLQljaGFyIHJzdl9ieXRlOyAvKiBIYW5kbGUgb2RkIGxlbmd0aCB1c2VyIGRhdGEgKi8KLQotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIHF1ZXVlX2lkOwotCXVpbnQxNl90IGRlY19pZDsKLQl1aW50MzJfdCByZWFkX3B0cl9vZmZzZXQ7Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCXN0cnVjdCBhdWR3bWFwcm9fc3VzcGVuZF9jdGwgc3VzcGVuZF9jdGw7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLSNlbmRpZgotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfZXZlbnRfcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBldmVudF9xdWV1ZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF93YWl0OwotCXNwaW5sb2NrX3QgZXZlbnRfcXVldWVfbG9jazsKLQlzdHJ1Y3QgbXV0ZXggZ2V0X2V2ZW50X2xvY2s7Ci0JaW50IGV2ZW50X2Fib3J0OwotCi0JaW50IGVxX2VuYWJsZTsKLQlpbnQgZXFfbmVlZHNfY29tbWl0OwotCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19lcWFsaXplciBlcTsKLQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfdm9sdW1lIHZvbF9wYW47Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaW5wdXRfYnVmZl9oYW5kbGU7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKm91dHB1dF9idWZmX2hhbmRsZTsKLX07Ci0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRwbGF5X3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpOwotc3RhdGljIHZvaWQgYXVkcGxheV9jb25maWdfaG9zdHBjbShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZHBsYXlfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRpb19kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpOwotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdGF0aWMgdm9pZCBhdWR3bWFwcm9fcG9zdF9ldmVudChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCk7Ci0jZW5kaWYKLQotc3RhdGljIGludCBybXRfcHV0X3Jlc291cmNlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZF9jb2RlY19jb25maWdfY21kIGNtZDsKLQl1bnNpZ25lZCBzaG9ydCBjbGllbnRfaWR4OwotCi0JY21kLmNtZF9pZCA9IFJNX0NNRF9BVURfQ09ERUNfQ0ZHOwotCWNtZC5jbGllbnRfaWQgPSBSTV9BVURfQ0xJRU5UX0lEOwotCWNtZC50YXNrX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuZW5hYmxlID0gUk1UX0RJU0FCTEU7Ci0JY21kLmRlY190eXBlID0gQVVEREVDX0RFQ19XTUFQUk87Ci0JY2xpZW50X2lkeCA9ICgoY21kLmNsaWVudF9pZCA8PCA4KSB8IGNtZC50YXNrX2lkKTsKLQotCXJldHVybiBwdXRfYWRzcF9yZXNvdXJjZShjbGllbnRfaWR4LCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgcm10X2dldF9yZXNvdXJjZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRfY29kZWNfY29uZmlnX2NtZCBjbWQ7Ci0JdW5zaWduZWQgc2hvcnQgY2xpZW50X2lkeDsKLQotCWNtZC5jbWRfaWQgPSBSTV9DTURfQVVEX0NPREVDX0NGRzsKLQljbWQuY2xpZW50X2lkID0gUk1fQVVEX0NMSUVOVF9JRDsKLQljbWQudGFza19pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmVuYWJsZSA9IFJNVF9FTkFCTEU7Ci0JY21kLmRlY190eXBlID0gQVVEREVDX0RFQ19XTUFQUk87Ci0JY2xpZW50X2lkeCA9ICgoY21kLmNsaWVudF9pZCA8PCA4KSB8IGNtZC50YXNrX2lkKTsKLQotCXJldHVybiBnZXRfYWRzcF9yZXNvdXJjZShjbGllbnRfaWR4LCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRpb19lbmFibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkbWdyX2NvbmZpZyBjZmc7Ci0JaW50IHJjOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JaWYgKGF1ZGlvLT5ybXRfcmVzb3VyY2VfcmVsZWFzZWQgPT0gMSkgewotCQlhdWRpby0+cm10X3Jlc291cmNlX3JlbGVhc2VkID0gMDsKLQkJcmMgPSBybXRfZ2V0X3Jlc291cmNlKGF1ZGlvKTsKLQkJaWYgKHJjKSB7Ci0JCQlNTV9FUlIoIkFEU1AgcmVzb3VyY2VzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBXTUFQUk8gXAotCQkJCXNlc3Npb24gMHglMDh4IG9uIGRlY29kZXI6ICVkXG4gSWdub3JpbmcgXAotCQkJCWVycm9yIGFuZCBnb2luZyBhaGVhZCB3aXRoIHRoZSBwbGF5YmFja1xuIiwKLQkJCQkoaW50KWF1ZGlvLCBhdWRpby0+ZGVjX2lkKTsKLQkJfQotCX0KLQotCWF1ZGlvLT5kZWNfc3RhdGUgPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORTsKLQlhdWRpby0+b3V0X3RhaWwgPSAwOwotCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQotCWNmZy50eF9yYXRlID0gUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfTk9ORTsKLQljZmcucnhfcmF0ZSA9IFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzQ4MDAwOwotCWNmZy5kZWZfbWV0aG9kID0gUlBDX0FVRF9ERUZfTUVUSE9EX1BMQVlCQUNLOwotCWNmZy5jb2RlYyA9IFJQQ19BVURfREVGX0NPREVDX1dNQTsKLQljZmcuc25kX21ldGhvZCA9IFJQQ19TTkRfTUVUSE9EX01JREk7Ci0KLQlyYyA9IGF1ZG1ncl9lbmFibGUoJmF1ZGlvLT5hdWRtZ3IsICZjZmcpOwotCWlmIChyYyA8IDApIHsKLQkJbXNtX2Fkc3BfZHVtcChhdWRpby0+YXVkcGxheSk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlpZiAobXNtX2Fkc3BfZW5hYmxlKGF1ZGlvLT5hdWRwbGF5KSkgewotCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRwbGF5KSBmYWlsZWRcbiIpOwotCQlhdWRtZ3JfZGlzYWJsZSgmYXVkaW8tPmF1ZG1ncik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChhdWRwcF9lbmFibGUoYXVkaW8tPmRlY19pZCwgYXVkaW9fZHNwX2V2ZW50LCBhdWRpbykpIHsKLQkJTU1fRVJSKCJhdWRwcF9lbmFibGUoKSBmYWlsZWRcbiIpOwotCQltc21fYWRzcF9kaXNhYmxlKGF1ZGlvLT5hdWRwbGF5KTsKLQkJYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRpb19kaXNhYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JaW50IHJjID0gMDsKLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWlmIChhdWRpby0+ZW5hYmxlZCkgewotCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCWF1ZGlvLT5kZWNfc3RhdGUgPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORTsKLQkJYXVkZGVjX2RzcF9jb25maWcoYXVkaW8sIDApOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUsCi0JCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0RFQ09ERVJfV0FJVF9NUykpOwotCQlpZiAocmMgPT0gMCkKLQkJCXJjID0gLUVUSU1FRE9VVDsKLQkJZWxzZSBpZiAoYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfQ0xPU0UpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCQltc21fYWRzcF9kaXNhYmxlKGF1ZGlvLT5hdWRwbGF5KTsKLQkJYXVkcHBfZGlzYWJsZShhdWRpby0+ZGVjX2lkLCBhdWRpbyk7Ci0JCXJjID0gYXVkbWdyX2Rpc2FibGUoJmF1ZGlvLT5hdWRtZ3IpOwotCQlpZiAocmMgPCAwKQotCQkJbXNtX2Fkc3BfZHVtcChhdWRpby0+YXVkcGxheSk7Ci0KLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQlybXRfcHV0X3Jlc291cmNlKGF1ZGlvKTsKLQkJYXVkaW8tPnJtdF9yZXNvdXJjZV9yZWxlYXNlZCA9IDE7Ci0JfQotCXJldHVybiByYzsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkc3AgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgdm9pZCBhdWRpb191cGRhdGVfcGNtX2J1Zl9lbnRyeShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCXVpbnQzMl90ICpwYXlsb2FkKQotewotCXVpbnQ4X3QgaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChhdWRpby0+cmZsdXNoKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGF5bG9hZFsxXTsgaW5kZXgrKykgewotCQlpZiAoYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHIgPT0KLQkJCXBheWxvYWRbMiArIGluZGV4ICogMl0pIHsKLQkJCU1NX0RCRygiYXVkaW9fdXBkYXRlX3BjbV9idWZfZW50cnk6IFwKLQkJCQlpblslZF0gcmVhZHlcbiIsIGF1ZGlvLT5maWxsX25leHQpOwotCQkJYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnVzZWQgPQotCQkJcGF5bG9hZFszICsgaW5kZXggKiAyXTsKLQkJCWlmICgoKythdWRpby0+ZmlsbF9uZXh0KSA9PSBhdWRpby0+cGNtX2J1Zl9jb3VudCkKLQkJCQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiYXVkaW9fdXBkYXRlX3BjbV9idWZfZW50cnk6IFwKLQkJCQlleHBlY3RlZD0leCByZXQ9JXhcbiIsCi0JCQkJYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHIsCi0JCQkJcGF5bG9hZFsxICsgaW5kZXggKiAyXSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnVzZWQgPT0gMCkgewotCQlhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQl9IGVsc2UgewotCQlNTV9EQkcoInJlYWQgY2Fubm90IGtlZXAgdXBcbiIpOwotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAxOwotCX0KLQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGxheV9kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgICB2b2lkICgqZ2V0ZXZlbnQpICh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBkYXRhOwotCXVpbnQzMl90IG1zZ1syOF07Ci0KLQlnZXRldmVudChtc2csIHNpemVvZihtc2cpKTsKLQotCU1NX0RCRygibXNnX2lkPSV4XG4iLCBpZCk7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQTEFZX01TR19ERUNfTkVFRFNfREFUQToKLQkJYXVkcGxheV9zZW5kX2RhdGEoYXVkaW8sIDEpOwotCQlicmVhazsKLQotCWNhc2UgQVVEUExBWV9NU0dfQlVGRkVSX1VQREFURToKLQkJYXVkaW9fdXBkYXRlX3BjbV9idWZfZW50cnkoYXVkaW8sIG1zZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBRFNQX01FU1NBR0VfSUQ6Ci0JCU1NX0RCRygiUmVjZWl2ZWQgQURTUCBldmVudDogbW9kdWxlIGVuYWJsZShhdWRwbGF5dGFzaylcbiIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigidW5leHBlY3RlZCBtZXNzYWdlIGZyb20gZGVjb2RlciBcbiIpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2RzcF9ldmVudCh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gcHJpdmF0ZTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBQX01TR19TVEFUVVNfTVNHOnsKLQkJCXVuc2lnbmVkIHN0YXR1cyA9IG1zZ1sxXTsKLQotCQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19TTEVFUDogewotCQkJCXVpbnQxNl90IHJlYXNvbiA9IG1zZ1syXTsKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOnNsZWVwIHJlYXNvbiA9IFwKLQkJCQkJCTB4JTA0eFxuIiwgcmVhc29uKTsKLQkJCQlpZiAoKHJlYXNvbiA9PSBBVURQUF9NU0dfUkVBU09OX01FTSkKLQkJCQkJfHwgKHJlYXNvbiA9PQotCQkJCQlBVURQUF9NU0dfUkVBU09OX05PREVDT0RFUikpIHsKLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfRkFJTFVSRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0gZWxzZSBpZiAocmVhc29uID09IEFVRFBQX01TR19SRUFTT05fTk9ORSkgewotCQkJCQkvKiBkZWNvZGVyIGlzIGluIGRpc2FibGUgc3RhdGUgKi8KLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfQ0xPU0U7Ci0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfSU5JVDoKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBpbml0XG4iKTsKLQkJCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJCQkJYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoYXVkaW8pOwotCQkJCWVsc2UKLQkJCQkJYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhhdWRpbyk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19DRkc6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogY2ZnXG4iKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19QTEFZOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IHBsYXlcbiIpOwotCQkJCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCQkJCWF1ZHBsYXlfY29uZmlnX2hvc3RwY20oYXVkaW8pOwotCQkJCQlhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQkJCQl9Ci0JCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9TVUNDRVNTOwotCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJTU1fRVJSKCJ1bmtub3duIGRlY29kZXIgc3RhdHVzXG4iKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURQUF9NU0dfQ0ZHX01TRzoKLQkJaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0VOQSkgewotCQkJTU1fREJHKCJDRkdfTVNHIEVOQUJMRVxuIik7Ci0JCQlhdWRkZWNfZHNwX2NvbmZpZyhhdWRpbywgMSk7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCQlhdWRpby0+cnVubmluZyA9IDE7Ci0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuKTsKLQkJCWF1ZHBwX2RzcF9zZXRfZXEoYXVkaW8tPmRlY19pZCwJYXVkaW8tPmVxX2VuYWJsZSwKLQkJCQkJCQkJJmF1ZGlvLT5lcSk7Ci0JCQlhdWRwcF9hdnN5bmMoYXVkaW8tPmRlY19pZCwgMjIwNTApOwotCQl9IGVsc2UgaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0RJUykgewotCQkJTU1fREJHKCJDRkdfTVNHIERJU0FCTEVcbiIpOwotCQkJYXVkcHBfYXZzeW5jKGF1ZGlvLT5kZWNfaWQsIDApOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAwOwotCQl9IGVsc2UgewotCQkJTU1fREJHKCJDRkdfTVNHICVkP1xuIiwgbXNnWzBdKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRFBQX01TR19ST1VUSU5HX0FDSzoKLQkJTU1fREJHKCJST1VUSU5HX0FDSyBtb2RlPSVkXG4iLCBtc2dbMV0pOwotCQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKGF1ZGlvKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBQX01TR19GTFVTSF9BQ0s6Ci0JCU1NX0RCRygiRkxVU0hfQUNLXG4iKTsKLQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQkJYXVkcGxheV9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX1BDTURNQU1JU1NFRDoKLQkJTU1fREJHKCJQQ01ETUFNSVNTRURcbiIpOwotCQlhdWRpby0+dGVvcyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlNTV9FUlIoIlVOS05PV04gKCVkKVxuIiwgaWQpOwotCX0KLQotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9hZHNwX29wcyBhdWRwbGF5X2Fkc3Bfb3BzX3dtYXBybyA9IHsKLQkuZXZlbnQgPSBhdWRwbGF5X2RzcF9ldmVudCwKLX07Ci0KLSNkZWZpbmUgYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcGxheSwgYXVkaW8tPnF1ZXVlX2lkLCBcCi0JCQljbWQsIGxlbikKLQotc3RhdGljIGludCBhdWRkZWNfZHNwX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCXUxNiBjZmdfZGVjX2NtZFtBVURQUF9DTURfQ0ZHX0RFQ19UWVBFX0xFTiAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCldOwotCi0JbWVtc2V0KGNmZ19kZWNfY21kLCAwLCBzaXplb2YoY2ZnX2RlY19jbWQpKTsKLQljZmdfZGVjX2NtZFswXSA9IEFVRFBQX0NNRF9DRkdfREVDX1RZUEU7Ci0JaWYgKGVuYWJsZSkKLQkJY2ZnX2RlY19jbWRbMSArIGF1ZGlvLT5kZWNfaWRdID0gQVVEUFBfQ01EX1VQREFUREVfQ0ZHX0RFQyB8Ci0JCQlBVURQUF9DTURfRU5BX0RFQ19WIHwgQVVEREVDX0RFQ19XTUFQUk87Ci0JZWxzZQotCQljZmdfZGVjX2NtZFsxICsgYXVkaW8tPmRlY19pZF0gPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCUFVRFBQX0NNRF9ESVNfREVDX1Y7Ci0KLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTEoJmNmZ19kZWNfY21kLCBzaXplb2YoY2ZnX2RlY19jbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX3dtYXBybyBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jb21tb24uY21kX2lkID0gQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNUzsKLQljbWQuY29tbW9uLmxlbmd0aCA9IEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVNfV01BUFJPX0xFTjsKLQljbWQuY29tbW9uLmRlY19pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmNvbW1vbi5pbnB1dF9zYW1wbGluZ19mcmVxdWVuY3kgPSBhdWRpby0+b3V0X3NhbXBsZV9yYXRlOwotCi0JY21kLmFybWRhdGFyZXF0aHIgPSBhdWRpby0+d21hcHJvX2NvbmZpZy5hcm1kYXRhcmVxdGhyOwotCWNtZC5udW1jaGFubmVscyA9IGF1ZGlvLT53bWFwcm9fY29uZmlnLm51bWNoYW5uZWxzOwotCWNtZC52YWxpZGJpdHNwZXJzYW1wbGUgPSBhdWRpby0+d21hcHJvX2NvbmZpZy52YWxpZGJpdHNwZXJzYW1wbGU7Ci0JY21kLmZvcm1hdHRhZyA9IGF1ZGlvLT53bWFwcm9fY29uZmlnLmZvcm1hdHRhZzsKLQljbWQuc2FtcGxpbmdyYXRlID0gYXVkaW8tPndtYXByb19jb25maWcuc2FtcGxpbmdyYXRlOwotCWNtZC5hdmdieXRlc3BlcnNlY29uZCA9IGF1ZGlvLT53bWFwcm9fY29uZmlnLmF2Z2J5dGVzcGVyc2Vjb25kOwotCWNtZC5hc2ZwYWNrZXRsZW5ndGggPSBhdWRpby0+d21hcHJvX2NvbmZpZy5hc2ZwYWNrZXRsZW5ndGg7Ci0JY21kLmNoYW5uZWxtYXNrID0gYXVkaW8tPndtYXByb19jb25maWcuY2hhbm5lbG1hc2s7Ci0JY21kLmVuY29kZW9wdCA9IGF1ZGlvLT53bWFwcm9fY29uZmlnLmVuY29kZW9wdDsKLQljbWQuYWR2YW5jZWRlbmNvZGVvcHQgPSBhdWRpby0+d21hcHJvX2NvbmZpZy5hZHZhbmNlZGVuY29kZW9wdDsKLQljbWQuYWR2YW5jZWRlbmNvZGVvcHQyID0gYXVkaW8tPndtYXByb19jb25maWcuYWR2YW5jZWRlbmNvZGVvcHQyOwotCi0JYXVkcHBfc2VuZF9xdWV1ZTIoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX3JvdXRpbmdfbW9kZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwcF9jbWRfcm91dGluZ19tb2RlIGNtZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUFBfQ01EX1JPVVRJTkdfTU9ERTsKLQljbWQub2JqZWN0X251bWJlciA9IGF1ZGlvLT5kZWNfaWQ7Ci0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfRlRSVDsKLQllbHNlCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfUlQ7Ci0KLQlhdWRwcF9zZW5kX3F1ZXVlMSgmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfYnVmZmVyX3JlZnJlc2ggcmVmcmVzaF9jbWQ7Ci0KLQlyZWZyZXNoX2NtZC5jbWRfaWQgPSBBVURQTEFZX0NNRF9CVUZGRVJfUkVGUkVTSDsKLQlyZWZyZXNoX2NtZC5udW1fYnVmZmVycyA9IDE7Ci0JcmVmcmVzaF9jbWQuYnVmMF9hZGRyZXNzID0gYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHI7Ci0JcmVmcmVzaF9jbWQuYnVmMF9sZW5ndGggPSBhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uc2l6ZTsKLQlyZWZyZXNoX2NtZC5idWZfcmVhZF9jb3VudCA9IDA7Ci0KLQlNTV9EQkcoImJ1ZjBfYWRkcj0leCBidWYwX2xlbj0lZFxuIiwKLQkJCXJlZnJlc2hfY21kLmJ1ZjBfYWRkcmVzcywKLQkJCXJlZnJlc2hfY21kLmJ1ZjBfbGVuZ3RoKTsKLQotCSh2b2lkKWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZyZWZyZXNoX2NtZCwgc2l6ZW9mKHJlZnJlc2hfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfY29uZmlnX2hvc3RwY20oc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfaHBjbV9idWZfY2ZnIGNmZ19jbWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWNmZ19jbWQuY21kX2lkID0gQVVEUExBWV9DTURfSFBDTV9CVUZfQ0ZHOwotCWNmZ19jbWQubWF4X2J1ZmZlcnMgPSBhdWRpby0+cGNtX2J1Zl9jb3VudDsKLQljZmdfY21kLmJ5dGVfc3dhcCA9IDA7Ci0JY2ZnX2NtZC5ob3N0cGNtX2NvbmZpZyA9ICgweDgwMDApIHwgKDB4NDAwMCk7Ci0JY2ZnX2NtZC5mZWVkYmFja19mcmVxdWVuY3kgPSAxOwotCWNmZ19jbWQucGFydGl0aW9uX251bWJlciA9IDA7Ci0KLQkodm9pZClhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY2ZnX2NtZCwgc2l6ZW9mKGNmZ19jbWQpKTsKLX0KLQotCi1zdGF0aWMgaW50IGF1ZHBsYXlfZHNwX3NlbmRfZGF0YV9hdmFpbChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQkJCQl1bnNpZ25lZCBpZHgsIHVuc2lnbmVkIGxlbikKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfYml0c3RyZWFtX2RhdGFfYXZhaWxfbnQyIGNtZDsKLQotCWNtZC5jbWRfaWQJCT0gQVVEUExBWV9DTURfQklUU1RSRUFNX0RBVEFfQVZBSUxfTlQyOwotCWlmIChhdWRpby0+bWZpZWxkKQotCQljbWQuZGVjb2Rlcl9pZCA9IEFVRFdNQVBST19NRVRBRklFTERfTUFTSyB8Ci0JCQkoYXVkaW8tPm91dFtpZHhdLm1maWVsZF9zeiA+PiAxKTsKLQllbHNlCi0JCWNtZC5kZWNvZGVyX2lkCQk9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmJ1Zl9wdHIJCT0gYXVkaW8tPm91dFtpZHhdLmFkZHI7Ci0JY21kLmJ1Zl9zaXplCQk9IGxlbi8yOwotCWNtZC5wYXJ0aXRpb25fbnVtYmVyCT0gMDsKLQlyZXR1cm4gYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwbGF5X3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWF1ZGlvLT5ydW5uaW5nKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAoYXVkaW8tPndmbHVzaCkgewotCQlhdWRpby0+b3V0X25lZWRlZCA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAobmVlZGVkICYmICFhdWRpby0+d2ZsdXNoKSB7Ci0JCS8qIFdlIHdlcmUgY2FsbGVkIGZyb20gdGhlIGNhbGxiYWNrIGJlY2F1c2UgdGhlIERTUAotCQkgKiByZXF1ZXN0ZWQgbW9yZSBkYXRhLiAgTm90ZSB0aGF0IHRoZSBEU1AgZG9lcyB3YW50Ci0JCSAqIG1vcmUgZGF0YSwgYW5kIGlmIGEgYnVmZmVyIHdhcyBpbi1mbGlnaHQsIG1hcmsgaXQKLQkJICogYXMgYXZhaWxhYmxlIChzaW5jZSB0aGUgRFNQIG11c3Qgbm93IGJlIGRvbmUgd2l0aAotCQkgKiBpdCkuCi0JCSAqLwotCQlhdWRpby0+b3V0X25lZWRlZCA9IDE7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpIHsKLQkJCU1NX0RCRygiZnJhbWUgJWQgZnJlZVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJCWZyYW1lLT51c2VkID0gMDsKLQkJCWF1ZGlvLT5vdXRfdGFpbCBePSAxOwotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl9Ci0JfQotCi0JaWYgKGF1ZGlvLT5vdXRfbmVlZGVkKSB7Ci0JCS8qIElmIHRoZSBEU1AgY3VycmVudGx5IHdhbnRzIGRhdGEgYW5kIHdlIGhhdmUgYQotCQkgKiBidWZmZXIgYXZhaWxhYmxlLCB3ZSB3aWxsIHNlbmQgaXQgYW5kIHJlc2V0Ci0JCSAqIHRoZSBuZWVkZWQgZmxhZy4gIFdlJ2xsIG1hcmsgdGhlIGJ1ZmZlciBhcyBpbi1mbGlnaHQKLQkJICogc28gdGhhdCBpdCB3b24ndCBiZSByZWN5Y2xlZCB1bnRpbCB0aGUgbmV4dCBidWZmZXIKLQkJICogaXMgcmVxdWVzdGVkCi0JCSAqLwotCi0JCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkKSB7Ci0JCQlCVUdfT04oZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZik7Ci0JCQlNTV9EQkcoImZyYW1lICVkIGJ1c3lcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JCQlhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoYXVkaW8sIGF1ZGlvLT5vdXRfdGFpbCwKLQkJCQkJCQkJZnJhbWUtPnVzZWQpOwotCQkJZnJhbWUtPnVzZWQgPSAweGZmZmZmZmZmOwotCQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQl9Ci0JfQotZG9uZToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkZXZpY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyB2b2lkIGF1ZGlvX2ZsdXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdWRpby0+b3V0WzBdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRbMV0udXNlZCA9IDA7Ci0JYXVkaW8tPm91dF9oZWFkID0gMDsKLQlhdWRpby0+b3V0X3RhaWwgPSAwOwotCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9ieXRlcywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2ZsdXNoX3BjbV9idWYoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1aW50OF90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUENNX0JVRl9NQVhfQ09VTlQ7IGluZGV4KyspCi0JCWF1ZGlvLT5pbltpbmRleF0udXNlZCA9IDA7Ci0JYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkaW9faW9wb3J0X3Jlc2V0KHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JLyogTWFrZSBzdXJlIHJlYWQvd3JpdGUgdGhyZWFkIGFyZSBmcmVlIGZyb20KLQkgKiBzbGVlcCBhbmQga25vd2luZyB0aGF0IHN5c3RlbSBpcyBub3QgYWJsZQotCSAqIHRvIHByb2Nlc3MgaW8gcmVxdWVzdCBhdCB0aGUgbW9tZW50Ci0JICovCi0Jd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlhdWRpb19mbHVzaChhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JYXVkaW9fZmx1c2hfcGNtX2J1ZihhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLX0KLQotc3RhdGljIGludCBhdWR3bWFwcm9fZXZlbnRzX3BlbmRpbmcoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlbXB0eTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWVtcHR5ID0gIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gZW1wdHkgfHwgYXVkaW8tPmV2ZW50X2Fib3J0OwotfQotCi1zdGF0aWMgdm9pZCBhdWR3bWFwcm9fcmVzZXRfZXZlbnRfcXVldWUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBhdWR3bWFwcm9fZXZlbnQgKmRydl9ldnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhdWRpby0+ZXZlbnRfcXVldWUpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkd21hcHJvX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkd21hcHJvX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIGxvbmcgYXVkd21hcHJvX3Byb2Nlc3NfZXZlbnRfcmVxKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHZvaWQgX191c2VyICphcmcpCi17Ci0JbG9uZyByYzsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50IHVzcl9ldnQ7Ci0Jc3RydWN0IGF1ZHdtYXByb19ldmVudCAqZHJ2X2V2dCA9IE5VTEw7Ci0JaW50IHRpbWVvdXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmdXNyX2V2dCwgYXJnLCBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19ldmVudCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXRpbWVvdXQgPSAoaW50KSB1c3JfZXZ0LnRpbWVvdXRfbXM7Ci0KLQlpZiAodGltZW91dCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+ZXZlbnRfd2FpdCwKLQkJCQlhdWR3bWFwcm9fZXZlbnRzX3BlbmRpbmcoYXVkaW8pLAotCQkJCW1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOwotCQlpZiAocmMgPT0gMCkKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCX0gZWxzZSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAotCQkJYXVkaW8tPmV2ZW50X3dhaXQsIGF1ZHdtYXByb19ldmVudHNfcGVuZGluZyhhdWRpbykpOwotCX0KLQotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCWlmIChhdWRpby0+ZXZlbnRfYWJvcnQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMDsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcmMgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+ZXZlbnRfcXVldWUpKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZHdtYXByb19ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQl9Ci0KLQlpZiAoZHJ2X2V2dCkgewotCQl1c3JfZXZ0LmV2ZW50X3R5cGUgPSBkcnZfZXZ0LT5ldmVudF90eXBlOwotCQl1c3JfZXZ0LmV2ZW50X3BheWxvYWQgPSBkcnZfZXZ0LT5wYXlsb2FkOwotCQlsaXN0X2FkZF90YWlsKCZkcnZfZXZ0LT5saXN0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCX0gZWxzZQotCQlyYyA9IC0xOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIXJjICYmIGNvcHlfdG9fdXNlcihhcmcsICZ1c3JfZXZ0LCBzaXplb2YodXNyX2V2dCkpKQotCQlyYyA9IC1FRkFVTFQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZW5hYmxlX2VxKHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0JaWYgKGF1ZGlvLT5lcV9lbmFibGUgPT0gZW5hYmxlICYmICFhdWRpby0+ZXFfbmVlZHNfY29tbWl0KQotCQlyZXR1cm4gMDsKLQotCWF1ZGlvLT5lcV9lbmFibGUgPSBlbmFibGU7Ci0KLQlpZiAoYXVkaW8tPnJ1bm5pbmcpIHsKLQkJYXVkcHBfZHNwX3NldF9lcShhdWRpby0+ZGVjX2lkLCBlbmFibGUsICZhdWRpby0+ZXEpOwotCQlhdWRpby0+ZXFfbmVlZHNfY29tbWl0ID0gMDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIGF1ZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0JdWludDE2X3QgZW5hYmxlX21hc2s7Ci0JaW50IGVuYWJsZTsKLQlpbnQgcHJldl9zdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGlvbmZsYWcgPSAwOwotCWlvbl9waHlzX2FkZHJfdCBhZGRyID0gMDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKLQlpbnQgbGVuID0gMDsKLQotCU1NX0RCRygiY21kID0gJWRcbiIsIGNtZCk7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCQlzdGF0cy5ieXRlX2NvdW50ID0gYXVkcHBfYXZzeW5jX2J5dGVfY291bnQoYXVkaW8tPmRlY19pZCk7Ci0JCXN0YXRzLnNhbXBsZV9jb3VudCA9IGF1ZHBwX2F2c3luY19zYW1wbGVfY291bnQoYXVkaW8tPmRlY19pZCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0VOQUJMRV9BVURQUDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZlbmFibGVfbWFzaywgKHZvaWQgKikgYXJnLAotCQkJCQkJc2l6ZW9mKGVuYWJsZV9tYXNrKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQllbmFibGUgPSAoZW5hYmxlX21hc2sgJiBFUV9FTkFCTEUpID8gMSA6IDA7Ci0JCWF1ZGlvX2VuYWJsZV9lcShhdWRpbywgZW5hYmxlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3Bhbik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfUEFOOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnBhbiA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3Bhbik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfRVE6Ci0JCXByZXZfc3RhdGUgPSBhdWRpby0+ZXFfZW5hYmxlOwotCQlhdWRpby0+ZXFfZW5hYmxlID0gMDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhdWRpby0+ZXEubnVtX2JhbmRzLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGF1ZGlvLT5lcSkgLQotCQkJCShBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfQ09NTU9OX0xFTiArIDIpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPmVxX2VuYWJsZSA9IHByZXZfc3RhdGU7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAxOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCWlmICgtRUlOVkFMICE9IHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9FVkVOVCkgewotCQlNTV9EQkcoIkFVRElPX0dFVF9FVkVOVFxuIik7Ci0JCWlmIChtdXRleF90cnlsb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spKSB7Ci0JCQlyYyA9IGF1ZHdtYXByb19wcm9jZXNzX2V2ZW50X3JlcShhdWRpbywKLQkJCQkJKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCQltdXRleF91bmxvY2soJmF1ZGlvLT5nZXRfZXZlbnRfbG9jayk7Ci0JCX0gZWxzZQotCQkJcmMgPSAtRUJVU1k7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlpZiAoY21kID09IEFVRElPX0FCT1JUX0dFVF9FVkVOVCkgewotCQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0JCXJldHVybiAwOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6Ci0JCU1NX0RCRygiQVVESU9fU1RBUlRcbiIpOwotCQlyYyA9IGF1ZGlvX2VuYWJsZShhdWRpbyk7Ci0JCWlmICghcmMpIHsKLQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXQsCi0JCQkJYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORSwKLQkJCQltc2Vjc190b19qaWZmaWVzKE1TTV9BVURfREVDT0RFUl9XQUlUX01TKSk7Ci0JCQlNTV9JTkZPKCJkZWNfc3RhdGUgJWQgcmMgPSAlZFxuIiwgYXVkaW8tPmRlY19zdGF0ZSwgcmMpOwotCi0JCQlpZiAoYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfU1VDQ0VTUykKLQkJCQlyYyA9IC1FTk9ERVY7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU1RPUDoKLQkJTU1fREJHKCJBVURJT19TVE9QXG4iKTsKLQkJcmMgPSBhdWRpb19kaXNhYmxlKGF1ZGlvKTsKLQkJYXVkaW9faW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQljYXNlIEFVRElPX0ZMVVNIOgotCQlNTV9EQkcoIkFVRElPX0ZMVVNIXG4iKTsKLQkJYXVkaW8tPnJmbHVzaCA9IDE7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAxOwotCQlhdWRpb19pb3BvcnRfcmVzZXQoYXVkaW8pOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpIHsKLQkJCWF1ZHBwX2ZsdXNoKGF1ZGlvLT5kZWNfaWQpOwotCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJIWF1ZGlvLT53Zmx1c2gpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCU1NX0VSUigiQVVESU9fRkxVU0ggaW50ZXJydXB0ZWRcbiIpOwotCQkJCXJjID0gLUVJTlRSOwotCQkJfQotCQl9IGVsc2UgewotCQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbmZpZywgKHZvaWQgKikgYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjb25maWcuY2hhbm5lbF9jb3VudCA9PSAxKSB7Ci0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IEFVRFBQX0NNRF9QQ01fSU5URl9NT05PX1Y7Ci0JCX0gZWxzZSBpZiAoY29uZmlnLmNoYW5uZWxfY291bnQgPT0gMikgewotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSBBVURQUF9DTURfUENNX0lOVEZfU1RFUkVPX1Y7Ci0JCX0gZWxzZSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlhdWRpby0+bWZpZWxkID0gY29uZmlnLm1ldGFfZmllbGQ7Ci0JCWF1ZGlvLT5vdXRfc2FtcGxlX3JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0JCWF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID0gY29uZmlnLmNoYW5uZWxfY291bnQ7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjb25maWc7Ci0JCWNvbmZpZy5idWZmZXJfc2l6ZSA9IChhdWRpby0+b3V0X2RtYV9zeiA+PiAxKTsKLQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IDI7Ci0JCWNvbmZpZy5zYW1wbGVfcmF0ZSA9IGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGU7Ci0JCWlmIChhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9PSBBVURQUF9DTURfUENNX0lOVEZfTU9OT19WKQotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSAxOwotCQllbHNlCi0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IDI7Ci0JCWNvbmZpZy5tZXRhX2ZpZWxkID0gMDsKLQkJY29uZmlnLnVudXNlZFswXSA9IDA7Ci0JCWNvbmZpZy51bnVzZWRbMV0gPSAwOwotCQljb25maWcudW51c2VkWzJdID0gMDsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZjb25maWcsIHNpemVvZihjb25maWcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCi0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9XTUFQUk9fQ09ORklHOnsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZhdWRpby0+d21hcHJvX2NvbmZpZywKLQkJCQlzaXplb2YoYXVkaW8tPndtYXByb19jb25maWcpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX1NFVF9XTUFQUk9fQ09ORklHOnsKLQkJc3RydWN0IG1zbV9hdWRpb193bWFwcm9fY29uZmlnIHVzcl9jb25maWc7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkoJnVzcl9jb25maWcsICh2b2lkICopYXJnLAotCQkJc2l6ZW9mKHVzcl9jb25maWcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlhdWRpby0+d21hcHJvX2NvbmZpZyA9IHVzcl9jb25maWc7Ci0KLQkJLyogTmVlZCB0byBzd2FwIHRoZSBmaXJzdCBhbmQgbGFzdCB3b3JkcyBvZiBhZHZhbmNlZGVuY29kZW9wdDIKLQkJICogYXMgRFNQIGNhbm5vdCByZWFkIDMyLWJpdCB2YXJpYWJsZSBhdCBhIHRpbWUuIE5lZWQgdG8gYmUKLQkJICogc3BsaXQgaW50byB0d28gMTYtYml0IGFuZCBzd2FwIHRoZW0gYXMgcmVxdWlyZWQgYnkgRFNQICovCi0KLQkJYXVkaW8tPndtYXByb19jb25maWcuYWR2YW5jZWRlbmNvZGVvcHQyID0KLQkJCSgoYXVkaW8tPndtYXByb19jb25maWcuYWR2YW5jZWRlbmNvZGVvcHQyICYgMHhGRkZGMDAwMCkKLQkJCSA+PiAxNikgfCAoKGF1ZGlvLT53bWFwcm9fY29uZmlnLmFkdmFuY2VkZW5jb2Rlb3B0MgotCQkJIDw8IDE2KSAmIDB4RkZGRjAwMDApOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9QQ01fQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fcGNtX2NvbmZpZyBjb25maWc7Ci0JCQljb25maWcucGNtX2ZlZWRiYWNrID0gYXVkaW8tPnBjbV9mZWVkYmFjazsKLQkJCWNvbmZpZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX01BWF9DT1VOVDsKLQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY29uZmlnLAotCQkJCQkgc2l6ZW9mKGNvbmZpZykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fU0VUX1BDTV9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19wY21fY29uZmlnIGNvbmZpZzsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcgotCQkJICAgICgmY29uZmlnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGNvbmZpZy5wY21fZmVlZGJhY2sgIT0gYXVkaW8tPnBjbV9mZWVkYmFjaykgewotCQkJCU1NX0VSUigiTm90IHN1ZmZpY2llbnQgcGVybWlzc2lvbiB0byIKLQkJCQkJCSJjaGFuZ2UgdGhlIHBsYXliYWNrIG1vZGVcbiIpOwotCQkJCXJjID0gLUVBQ0NFUzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICgoY29uZmlnLmJ1ZmZlcl9jb3VudCA+IFBDTV9CVUZfTUFYX0NPVU5UKSB8fAotCQkJICAgIChjb25maWcuYnVmZmVyX2NvdW50ID09IDEpKQotCQkJCWNvbmZpZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX01BWF9DT1VOVDsKLQotCQkJaWYgKGNvbmZpZy5idWZmZXJfc2l6ZSA8IFBDTV9CVUZTWl9NSU4pCi0JCQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKLQotCQkJLyogQ2hlY2sgaWYgcGNtIGZlZWRiYWNrIGlzIHJlcXVpcmVkICovCi0JCQlpZiAoKGNvbmZpZy5wY21fZmVlZGJhY2spICYmICghYXVkaW8tPnJlYWRfZGF0YSkpIHsKLQkJCQlNTV9EQkcoImFsbG9jYXRlIFBDTSBidWZmZXIgJWRcbiIsCi0JCQkJCQljb25maWcuYnVmZmVyX2NvdW50ICoKLQkJCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSk7Ci0JCQkJaGFuZGxlID0gaW9uX2FsbG9jKGF1ZGlvLT5jbGllbnQsCi0JCQkJCShjb25maWcuYnVmZmVyX3NpemUgKgotCQkJCQljb25maWcuYnVmZmVyX2NvdW50KSwKLQkJCQkJU1pfNEssIElPTl9IRUFQKElPTl9BVURJT19IRUFQX0lEKSwgMCk7Ci0JCQkJaWYgKElTX0VSUl9PUl9OVUxMKGhhbmRsZSkpIHsKLQkJCQkJTU1fRVJSKCJVbmFibGUgdG8gYWxsb2MgSS9QIGJ1ZmZzXG4iKTsKLQkJCQkJYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlID0gTlVMTDsKLQkJCQkJcmMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgPSBoYW5kbGU7Ci0KLQkJCQlyYyA9IGlvbl9waHlzKGF1ZGlvLT5jbGllbnQgLAotCQkJCQloYW5kbGUsICZhZGRyLCAmbGVuKTsKLQkJCQlpZiAocmMpIHsKLQkJCQkJTU1fRVJSKCJJbnZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJCQkJKHVuc2lnbmVkIGludCkgYWRkciwKLQkJCQkJCSh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JCQkJCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci0JCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTU1fSU5GTygiR290IHZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJCQkJKHVuc2lnbmVkIGludCkgYXVkaW8tPnJlYWRfcGh5cywKLQkJCQkJCSh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JCQkJfQotCQkJCWF1ZGlvLT5yZWFkX3BoeXMgPSAoaW50MzJfdClhZGRyOwotCi0JCQkJcmMgPSBpb25faGFuZGxlX2dldF9mbGFncyhhdWRpby0+Y2xpZW50LAotCQkJCQloYW5kbGUsICZpb25mbGFnKTsKLQkJCQlpZiAocmMpIHsKLQkJCQkJTU1fRVJSKCJjb3VsZCBub3QgZ2V0IGZsYWdzXG4iKTsKLQkJCQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgaGFuZGxlKTsKLQkJCQkJYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlID0gTlVMTDsKLQkJCQkJcmMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlhdWRpby0+bWFwX3ZfcmVhZCA9IGlvbl9tYXBfa2VybmVsKAotCQkJCQlhdWRpby0+Y2xpZW50LCBoYW5kbGUpOwotCQkJCWlmIChJU19FUlIoYXVkaW8tPm1hcF92X3JlYWQpKSB7Ci0JCQkJCU1NX0VSUigibWFwIG9mIHJlYWQgYnVmIGZhaWxlZFxuIik7Ci0JCQkJCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci0JCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQl9IGVsc2UgewotCQkJCQl1aW50OF90IGluZGV4OwotCQkJCQl1aW50MzJfdCBvZmZzZXQgPSAwOwotCQkJCQlhdWRpby0+cmVhZF9kYXRhID0gYXVkaW8tPm1hcF92X3JlYWQ7Ci0JCQkJCWF1ZGlvLT5wY21fZmVlZGJhY2sgPSAxOwotCQkJCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCQkJCQlhdWRpby0+cGNtX2J1Zl9jb3VudCA9Ci0JCQkJCSAgICBjb25maWcuYnVmZmVyX2NvdW50OwotCQkJCQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQkJCQkJYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0KLQkJCQkJZm9yIChpbmRleCA9IDA7Ci0JCQkJCSAgICAgaW5kZXggPCBjb25maWcuYnVmZmVyX2NvdW50OwotCQkJCQkgICAgIGluZGV4KyspIHsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0uZGF0YSA9Ci0JCQkJCQkgICAgYXVkaW8tPnJlYWRfZGF0YSArIG9mZnNldDsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0uYWRkciA9Ci0JCQkJCQkgICAgYXVkaW8tPnJlYWRfcGh5cyArIG9mZnNldDsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9Ci0JCQkJCQkgICAgY29uZmlnLmJ1ZmZlcl9zaXplOwotCQkJCQkJYXVkaW8tPmluW2luZGV4XS51c2VkID0gMDsKLQkJCQkJCW9mZnNldCArPSBjb25maWcuYnVmZmVyX3NpemU7Ci0JCQkJCX0KLQkJCQkJTU1fREJHKCJyZWFkIGJ1ZjogcGh5IGFkZHIgXAotCQkJCQkJMHglMDh4IGtlcm5lbCBhZGRyIDB4JTA4eFxuIiwKLQkJCQkJCWF1ZGlvLT5yZWFkX3BoeXMsCi0JCQkJCQkoaW50KWF1ZGlvLT5yZWFkX2RhdGEpOwotCQkJCQlyYyA9IDA7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyYyA9IDA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fUEFVU0U6Ci0JCU1NX0RCRygiQVVESU9fUEFVU0UgJWxkXG4iLCBhcmcpOwotCQlyYyA9IGF1ZHBwX3BhdXNlKGF1ZGlvLT5kZWNfaWQsIChpbnQpIGFyZyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKiBPbmx5IHVzZWZ1bCBpbiB0dW5uZWwtbW9kZSAqLwotc3RhdGljIGludCBhdWRpb19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IGEsIGxvZmZfdCBiLAotCWludCBkYXRhc3luYykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCi0JaWYgKCFhdWRpby0+cnVubmluZyB8fCBhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lX25vbG9jazsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKCFhdWRpby0+b3V0WzBdLnVzZWQgJiYKLQkJIWF1ZGlvLT5vdXRbMV0udXNlZCAmJgotCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChhdWRpby0+cmVzZXJ2ZWQpIHsKLQkJTU1fREJHKCJzZW5kIHJlc2VydmVkIGJ5dGVcbiIpOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMF0gPSBhdWRpby0+cnN2X2J5dGU7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMV0gPSAwOwotCQlmcmFtZS0+dXNlZCA9IDI7Ci0JCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCSghYXVkaW8tPm91dFswXS51c2VkICYmCi0JCQkhYXVkaW8tPm91dFsxXS51c2VkICYmCi0JCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gZG9uZTsKLQkJZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQkvKiBwY20gZG1hbWlzcyBtZXNzYWdlIGlzIHNlbnQgY29udGlub3VzbHkKLQkgKiB3aGVuIGRlY29kZXIgaXMgc3RhcnZlZCBzbyBubyByYWNlCi0JICogY29uZGl0aW9uIGNvbmNlcm4KLQkgKi8KLQlhdWRpby0+dGVvcyA9IDA7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJYXVkaW8tPnRlb3MgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAoYXVkaW8tPndmbHVzaCkKLQkJcmMgPSAtRUJVU1k7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci1kb25lX25vbG9jazoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCSAgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0JaW50IHJjID0gMDsKLQotCWlmICghYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJcmV0dXJuIDA7IC8qIFBDTSBmZWVkYmFjayBpcyBub3QgZW5hYmxlZC4gTm90aGluZyB0byByZWFkICovCi0KLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlNTV9EQkcoIiVkIFxuIiwgY291bnQpOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPnJlYWRfd2FpdCwKLQkJCShhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCA+IDApIHx8Ci0JCQkoYXVkaW8tPnN0b3BwZWQpIHx8IChhdWRpby0+cmZsdXNoKSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCi0JCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+cmZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvdW50IDwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQpIHsKLQkJCS8qIFJlYWQgbXVzdCBoYXBwZW4gaW4gZnJhbWUgYm91bmRhcnkuIFNpbmNlIGRyaXZlcgotCQkJICAgZG9lcyBub3Qga25vdyBmcmFtZSBzaXplLCByZWFkIGNvdW50IG11c3QgYmUgZ3JlYXRlcgotCQkJICAgb3IgZXF1YWwgdG8gc2l6ZSBvZiBQQ00gc2FtcGxlcyAqLwotCQkJTU1fREJHKCJhdWRpb19yZWFkOiBubyBwYXJ0aWFsIGZyYW1lIGRvbmUgcmVhZGluZ1xuIik7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygiYXVkaW9fcmVhZDogcmVhZCBmcm9tIGluWyVkXVxuIiwKLQkJCQkJYXVkaW8tPnJlYWRfbmV4dCk7Ci0JCQlpZiAoY29weV90b191c2VyCi0JCQkgICAgKGJ1ZiwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLmRhdGEsCi0JCQkgICAgIGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkKSkgewotCQkJCU1NX0VSUigiaW52YWxpZCBhZGRyICV4IFxuIiwgKHVuc2lnbmVkIGludClidWYpOwotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNvdW50IC09IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkOwotCQkJYnVmICs9IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkOwotCQkJYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQgPSAwOwotCQkJaWYgKCgrK2F1ZGlvLT5yZWFkX25leHQpID09IGF1ZGlvLT5wY21fYnVmX2NvdW50KQotCQkJCWF1ZGlvLT5yZWFkX25leHQgPSAwOwotCQkJYnJlYWs7CS8qIEZvcmNlIHRvIGV4aXQgd2hpbGUgbG9vcAotCQkJCSAqIHRvIHByZXZlbnQgb3V0cHV0IHRocmVhZAotCQkJCSAqIHNsZWVwIHRvbyBsb25nIGlmIGRhdGEgaXMKLQkJCQkgKiBub3QgcmVhZHkgYXQgdGhpcyBtb21lbnQuCi0JCQkJICovCi0JCX0KLQl9Ci0KLQkvKiBkb24ndCBmZWVkIG91dHB1dCBidWZmZXIgdG8gSFcgZGVjb2RlciBkdXJpbmcgZmx1c2hpbmcKLQkgKiBidWZmZXIgcmVmcmVzaCBjb21tYW5kIHdpbGwgYmUgc2VudCBvbmNlIGZsdXNoIGNvbXBsZXRlcwotCSAqIHNlbmQgYnVmIHJlZnJlc2ggY29tbWFuZCBoZXJlIGNhbiBjb25mdXNlIEhXIGRlY29kZXIKLQkgKi8KLQlpZiAoYXVkaW8tPmJ1Zl9yZWZyZXNoICYmICFhdWRpby0+cmZsdXNoKSB7Ci0JCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDA7Ci0JCU1NX0RCRygia2ljayBzdGFydCBwY20gZmVlZGJhY2sgYWdhaW5cbiIpOwotCQlhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCi0JaWYgKGJ1ZiA+IHN0YXJ0KQotCQlyYyA9IGJ1ZiAtIHN0YXJ0OwotCi0JTU1fREJHKCJyZWFkICVkIGJ5dGVzXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZHdtYXByb19wcm9jZXNzX2VvcyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQljb25zdCBjaGFyIF9fdXNlciAqYnVmX3N0YXJ0LCB1bnNpZ25lZCBzaG9ydCBtZmllbGRfc2l6ZSkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWNoYXIgKmJ1Zl9wdHI7Ci0KLQlpZiAoYXVkaW8tPnJlc2VydmVkKSB7Ci0JCU1NX0RCRygiZmx1c2ggcmVzZXJ2ZSBieXRlXG4iKTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF9oZWFkOwotCQlidWZfcHRyID0gZnJhbWUtPmRhdGE7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCShmcmFtZS0+dXNlZCA9PSAwKQotCQkJCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQl8fCAoYXVkaW8tPndmbHVzaCkpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBkb25lOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlidWZfcHRyWzBdID0gYXVkaW8tPnJzdl9ieXRlOwotCQlidWZfcHRyWzFdID0gMDsKLQkJYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JCWZyYW1lLT5tZmllbGRfc3ogPSAwOwotCQlmcmFtZS0+dXNlZCA9IDI7Ci0JCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQl9Ci0KLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKGF1ZGlvLT5vdXRfbmVlZGVkICYmCi0JCWF1ZGlvLT5vdXRbMF0udXNlZCA9PSAwICYmCi0JCWF1ZGlvLT5vdXRbMV0udXNlZCA9PSAwKQotCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoZnJhbWUtPmRhdGEsIGJ1Zl9zdGFydCwgbWZpZWxkX3NpemUpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlmcmFtZS0+dXNlZCA9IG1maWVsZF9zaXplOwotCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRpb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0Jc2l6ZV90IHhmZXI7Ci0JY2hhciAqY3B5X3B0cjsKLQlpbnQgcmMgPSAwLCBlb3NfY29uZGl0aW9uID0gQVVEV01BUFJPX0VPU19OT05FOwotCXVuc2lnbmVkIGRzaXplOwotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplID0gMDsKLQotCU1NX0RCRygiY250PSVkXG4iLCBjb3VudCk7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0JCWNweV9wdHIgPSBmcmFtZS0+ZGF0YTsKLQkJZHNpemUgPSAwOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkJICAgICAgKGZyYW1lLT51c2VkID09IDApCi0JCQkJCSAgICAgIHx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQkJCSAgfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYXVkaW8tPm1maWVsZCkgewotCQkJaWYgKGJ1ZiA9PSBzdGFydCkgewotCQkJCS8qIFByb2Nlc3NpbmcgYmVnaW5uaW5nIG9mIHVzZXIgYnVmZmVyICovCi0JCQkJaWYgKF9fZ2V0X3VzZXIobWZpZWxkX3NpemUsCi0JCQkJCSh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgYnVmKSkgewotCQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSAgaWYgKG1maWVsZF9zaXplID4gY291bnQpIHsKLQkJCQkJcmMgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJTU1fREJHKCJhdWRpb193cml0ZTogbWYgb2Zmc2V0X3ZhbCAleFxuIiwKLQkJCQkJCW1maWVsZF9zaXplKTsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCBtZmllbGRfc2l6ZSkpIHsKLQkJCQkJcmMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyogQ2hlY2sgaWYgRU9TIGZsYWcgaXMgc2V0IGFuZCBidWZmZXIgaGFzCi0JCQkJICogY29udGFpbnMganVzdCBtZXRhIGZpZWxkCi0JCQkJICovCi0JCQkJaWYgKGNweV9wdHJbQVVEV01BUFJPX0VPU19GTEdfT0ZGU0VUXSAmCi0JCQkJCQkgQVVEV01BUFJPX0VPU19GTEdfTUFTSykgewotCQkJCQlNTV9EQkcoImF1ZGlvX3dyaXRlOiBFT1MgU0VUXG4iKTsKLQkJCQkJZW9zX2NvbmRpdGlvbiA9IEFVRFdNQVBST19FT1NfU0VUOwotCQkJCQlpZiAobWZpZWxkX3NpemUgPT0gY291bnQpIHsKLQkJCQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UKLQkJCQkJY3B5X3B0cltBVURXTUFQUk9fRU9TX0ZMR19PRkZTRVRdCi0JCQkJCQkmPSB+QVVEV01BUFJPX0VPU19GTEdfTUFTSzsKLQkJCQl9Ci0JCQkJY3B5X3B0ciArPSBtZmllbGRfc2l6ZTsKLQkJCQljb3VudCAtPSBtZmllbGRfc2l6ZTsKLQkJCQlkc2l6ZSArPSBtZmllbGRfc2l6ZTsKLQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQl9IGVsc2UgewotCQkJCW1maWVsZF9zaXplID0gMDsKLQkJCQlNTV9EQkcoImF1ZGlvX3dyaXRlOiBjb250aW51b3VzIGJ1ZmZlclxuIik7Ci0JCQl9Ci0JCQlmcmFtZS0+bWZpZWxkX3N6ID0gbWZpZWxkX3NpemU7Ci0JCX0KLQotCQlpZiAoYXVkaW8tPnJlc2VydmVkKSB7Ci0JCQlNTV9EQkcoImFwcGVuZCByZXNlcnZlZCBieXRlICV4XG4iLCBhdWRpby0+cnN2X2J5dGUpOwotCQkJKmNweV9wdHIgPSBhdWRpby0+cnN2X2J5dGU7Ci0JCQl4ZmVyID0gKGNvdW50ID4gKChmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSAtIDEpKSA/Ci0JCQkJKGZyYW1lLT5zaXplIC0gbWZpZWxkX3NpemUpIC0gMSA6IGNvdW50OwotCQkJY3B5X3B0cisrOwotCQkJZHNpemUgKz0gMTsKLQkJCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JCX0gZWxzZQotCQkJeGZlciA9IChjb3VudCA+IChmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSkgPwotCQkJCShmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSA6IGNvdW50OwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIHhmZXIpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWRzaXplICs9IHhmZXI7Ci0JCWlmIChkc2l6ZSAmIDEpIHsKLQkJCWF1ZGlvLT5yc3ZfYnl0ZSA9ICgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbZHNpemUgLSAxXTsKLQkJCU1NX0RCRygib2RkIGxlbmd0aCBidWYgcmVzZXJ2ZSBsYXN0IGJ5dGUgJXhcbiIsCi0JCQkJCWF1ZGlvLT5yc3ZfYnl0ZSk7Ci0JCQlhdWRpby0+cmVzZXJ2ZWQgPSAxOwotCQkJZHNpemUtLTsKLQkJfQotCQljb3VudCAtPSB4ZmVyOwotCQlidWYgKz0geGZlcjsKLQotCQlpZiAoZHNpemUgPiAwKSB7Ci0JCQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQkJCWZyYW1lLT51c2VkID0gZHNpemU7Ci0JCQlhdWRwbGF5X3NlbmRfZGF0YShhdWRpbywgMCk7Ci0JCX0KLQl9Ci0JaWYgKGVvc19jb25kaXRpb24gPT0gQVVEV01BUFJPX0VPU19TRVQpCi0JCXJjID0gYXVkd21hcHJvX3Byb2Nlc3NfZW9zKGF1ZGlvLCBzdGFydCwgbWZpZWxkX3NpemUpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCWlmICghcmMpIHsKLQkJaWYgKGJ1ZiA+IHN0YXJ0KQotCQkJcmV0dXJuIGJ1ZiAtIHN0YXJ0OwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JTU1fSU5GTygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGZyZWVpbmdcbiIsIChpbnQpYXVkaW8pOwotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRpb19kaXNhYmxlKGF1ZGlvKTsKLQlpZiAoYXVkaW8tPnJtdF9yZXNvdXJjZV9yZWxlYXNlZCA9PSAwKQotCQlybXRfcHV0X3Jlc291cmNlKGF1ZGlvKTsKLQlhdWRpb19mbHVzaChhdWRpbyk7Ci0JYXVkaW9fZmx1c2hfcGNtX2J1ZihhdWRpbyk7Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRwbGF5KTsKLQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQl1bnJlZ2lzdGVyX2Vhcmx5X3N1c3BlbmQoJmF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlKTsKLSNlbmRpZgotCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDE7Ci0Jd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCWF1ZHdtYXByb19yZXNldF9ldmVudF9xdWV1ZShhdWRpbyk7Ci0JaW9uX3VubWFwX2tlcm5lbChhdWRpby0+Y2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLQlpZiAoYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlICE9IE5VTEwpIHsKLQkJaW9uX3VubWFwX2tlcm5lbChhdWRpby0+Y2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotCX0KLQlpb25fY2xpZW50X2Rlc3Ryb3koYXVkaW8tPmNsaWVudCk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JaWYgKGF1ZGlvLT5kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKGF1ZGlvLT5kZW50cnkpOwotI2VuZGlmCi0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0YXRpYyB2b2lkIGF1ZHdtYXByb19wb3N0X2V2ZW50KHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCB0eXBlLAotCQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkKQotewotCXN0cnVjdCBhdWR3bWFwcm9fZXZlbnQgKmVfbm9kZSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSkpIHsKLQkJZV9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZHdtYXByb19ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZlX25vZGUtPmxpc3QpOwotCX0gZWxzZSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWR3bWFwcm9fZXZlbnQpLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFlX25vZGUpIHsKLQkJCU1NX0VSUigiTm8gbWVtIHRvIHBvc3QgZXZlbnQgJWRcbiIsIHR5cGUpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWVfbm9kZS0+ZXZlbnRfdHlwZSA9IHR5cGU7Ci0JZV9ub2RlLT5wYXlsb2FkID0gcGF5bG9hZDsKLQotCWxpc3RfYWRkX3RhaWwoJmVfbm9kZS0+bGlzdCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHdtYXByb19zdXNwZW5kKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWR3bWFwcm9fc3VzcGVuZF9jdGwgKmN0bCA9Ci0JCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgYXVkd21hcHJvX3N1c3BlbmRfY3RsLCBub2RlKTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlhdWR3bWFwcm9fcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9TVVNQRU5ELCBwYXlsb2FkKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkd21hcHJvX3Jlc3VtZShzdHJ1Y3QgZWFybHlfc3VzcGVuZCAqaCkKLXsKLQlzdHJ1Y3QgYXVkd21hcHJvX3N1c3BlbmRfY3RsICpjdGwgPQotCQljb250YWluZXJfb2YoaCwgc3RydWN0IGF1ZHdtYXByb19zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkd21hcHJvX3Bvc3RfZXZlbnQoY3RsLT5hdWRpbywgQVVESU9fRVZFTlRfUkVTVU1FLCBwYXlsb2FkKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgc3NpemVfdCBhdWR3bWFwcm9fZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWR3bWFwcm9fZGVidWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY29uc3QgaW50IGRlYnVnX2J1Zm1heCA9IDQwOTY7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyWzQwOTZdOwotCWludCBuID0gMCwgaTsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCW4gPSBzY25wcmludGYoYnVmZmVyLCBkZWJ1Z19idWZtYXgsICJvcGVuZWQgJWRcbiIsIGF1ZGlvLT5vcGVuZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgImVuYWJsZWQgJWRcbiIsIGF1ZGlvLT5lbmFibGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJzdG9wcGVkICVkXG4iLCBhdWRpby0+c3RvcHBlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicGNtX2ZlZWRiYWNrICVkXG4iLCBhdWRpby0+cGNtX2ZlZWRiYWNrKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfYnVmX3N6ICVkXG4iLCBhdWRpby0+b3V0WzBdLnNpemUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInBjbV9idWZfY291bnQgJWQgXG4iLCBhdWRpby0+cGNtX2J1Zl9jb3VudCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicGNtX2J1Zl9zeiAlZCBcbiIsIGF1ZGlvLT5pblswXS5zaXplKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJ2b2x1bWUgJXggXG4iLCBhdWRpby0+dm9sX3Bhbi52b2x1bWUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInNhbXBsZSByYXRlICVkIFxuIiwgYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJImNoYW5uZWwgbW9kZSAlZCBcbiIsIGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkvKiBGb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBvbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHdoZW4KLQkgKiB3aGVuIHBsYXliYWNrIGhhbHRzIHVuZXhwZWN0ZWRseS4gVGh1cywgbm8gbXV0dWFsIGV4Y2x1c2lvbgotCSAqIGVuZm9yY2VkCi0JICovCi0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAid2ZsdXNoICVkXG4iLCBhdWRpby0+d2ZsdXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJyZmx1c2ggJWRcbiIsIGF1ZGlvLT5yZmx1c2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInJ1bm5pbmcgJWQgXG4iLCBhdWRpby0+cnVubmluZyk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJkZWMgc3RhdGUgJWQgXG4iLCBhdWRpby0+ZGVjX3N0YXRlKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfbmVlZGVkICVkIFxuIiwgYXVkaW8tPm91dF9uZWVkZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dF9oZWFkICVkIFxuIiwgYXVkaW8tPm91dF9oZWFkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfdGFpbCAlZCBcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0WzBdLnVzZWQgJWQgXG4iLCBhdWRpby0+b3V0WzBdLnVzZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dFsxXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFsxXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJidWZmZXJfcmVmcmVzaCAlZCBcbiIsIGF1ZGlvLT5idWZfcmVmcmVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicmVhZF9uZXh0ICVkIFxuIiwgYXVkaW8tPnJlYWRfbmV4dCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAiZmlsbF9uZXh0ICVkIFxuIiwgYXVkaW8tPmZpbGxfbmV4dCk7Ci0JZm9yIChpID0gMDsgaSA8IGF1ZGlvLT5wY21fYnVmX2NvdW50OyBpKyspCi0JCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiaW5bJWRdLnNpemUgJWQgXG4iLCBpLCBhdWRpby0+aW5baV0udXNlZCk7Ci0JYnVmZmVyW25dID0gMDsKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkd21hcHJvX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWR3bWFwcm9fZGVidWdfcmVhZCwKLQkub3BlbiA9IGF1ZHdtYXByb19kZWJ1Z19vcGVuLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IE5VTEw7Ci0JaW50IHJjLCBkZWNfYXR0cmIsIGRlY2lkLCBpOwotCXVuc2lnbmVkIG1lbV9zeiA9IERNQVNaX01BWDsKLQlzdHJ1Y3QgYXVkd21hcHJvX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgaW9uZmxhZyA9IDA7Ci0JaW9uX3BoeXNfYWRkcl90IGFkZHIgPSAwOwotCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUgPSBOVUxMOwotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQgPSBOVUxMOwotCWludCBsZW4gPSAwOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCi0JY2hhciBuYW1lW3NpemVvZiAibXNtX3dtYXByb18iICsgNV07Ci0jZW5kaWYKLQotCS8qIEFsbG9jYXRlIE1lbSBmb3IgYXVkaW8gaW5zdGFuY2UgKi8KLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpbyksIEdGUF9LRVJORUwpOwotCWlmICghYXVkaW8pIHsKLQkJTU1fRVJSKCJubyBtZW1vcnkgdG8gYWxsb2NhdGUgYXVkaW8gaW5zdGFuY2UgXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCU1NX0lORk8oImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBjcmVhdGVkXG4iLCAoaW50KWF1ZGlvKTsKLQotCS8qIEFsbG9jYXRlIHRoZSBkZWNvZGVyICovCi0JZGVjX2F0dHJiID0gQVVEREVDX0RFQ19XTUFQUk87Ci0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlkZWNfYXR0cmIgfD0gTVNNX0FVRF9NT0RFX05PTlRVTk5FTDsKLQkJYXVkaW8tPnBjbV9mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERV9QTEFZQkFDSzsKLQl9IGVsc2UgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCSEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9UVU5ORUw7Ci0JCWF1ZGlvLT5wY21fZmVlZGJhY2sgPSBUVU5ORUxfTU9ERV9QTEFZQkFDSzsKLQl9IGVsc2UgewotCQlrZnJlZShhdWRpbyk7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBkb25lOwotCX0KLQotCWRlY2lkID0gYXVkcHBfYWRlY19hbGxvYyhkZWNfYXR0cmIsICZhdWRpby0+bW9kdWxlX25hbWUsCi0JCQkmYXVkaW8tPnF1ZXVlX2lkKTsKLQotCWlmIChkZWNpZCA8IDApIHsKLQkJTU1fRVJSKCJObyBmcmVlIGRlY29kZXIgYXZhaWxhYmxlLCBmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQkoaW50KWF1ZGlvKTsKLQkJcmMgPSAtRU5PREVWOwotCQlrZnJlZShhdWRpbyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYXVkaW8tPmRlY19pZCA9IGRlY2lkICYgTVNNX0FVRF9ERUNPREVSX01BU0s7Ci0KLQljbGllbnQgPSBtc21faW9uX2NsaWVudF9jcmVhdGUoVUlOVF9NQVgsICJBdWRpb19XTUFfUFJPX0NsaWVudCIpOwotCWlmIChJU19FUlJfT1JfTlVMTChjbGllbnQpKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGNyZWF0ZSBJT04gY2xpZW50XG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGNsaWVudF9jcmVhdGVfZXJyb3I7Ci0JfQotCWF1ZGlvLT5jbGllbnQgPSBjbGllbnQ7Ci0KLQloYW5kbGUgPSBpb25fYWxsb2MoY2xpZW50LCBtZW1fc3osIFNaXzRLLAotCQlJT05fSEVBUChJT05fQVVESU9fSEVBUF9JRCksIDApOwotCWlmIChJU19FUlJfT1JfTlVMTChoYW5kbGUpKSB7Ci0JCU1NX0VSUigiVW5hYmxlIHRvIGNyZWF0ZSBhbGxvY2F0ZSBPL1AgYnVmZmVyc1xuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRwdXRfYnVmZl9hbGxvY19lcnJvcjsKLQl9Ci0JYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSA9IGhhbmRsZTsKLQotCXJjID0gaW9uX3BoeXMoY2xpZW50LCBoYW5kbGUsICZhZGRyLCAmbGVuKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJPL1AgYnVmZmVyczpJbnZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJKHVuc2lnbmVkIGludCkgYWRkciwgKHVuc2lnbmVkIGludCkgbGVuKTsKLQkJZ290byBvdXRwdXRfYnVmZl9nZXRfcGh5c19lcnJvcjsKLQl9IGVsc2UgewotCQlNTV9JTkZPKCJPL1AgYnVmZmVyczp2YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JfQotCWF1ZGlvLT5waHlzID0gKGludDMyX3QpYWRkcjsKLQotCi0JcmMgPSBpb25faGFuZGxlX2dldF9mbGFncyhjbGllbnQsIGhhbmRsZSwgJmlvbmZsYWcpOwotCWlmIChyYykgewotCQlNTV9FUlIoImNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIpOwotCQlnb3RvIG91dHB1dF9idWZmX2dldF9mbGFnc19lcnJvcjsKLQl9Ci0KLQlhdWRpby0+bWFwX3Zfd3JpdGUgPSBpb25fbWFwX2tlcm5lbChjbGllbnQsIGhhbmRsZSk7Ci0JaWYgKElTX0VSUihhdWRpby0+bWFwX3Zfd3JpdGUpKSB7Ci0JCU1NX0VSUigiY291bGQgbm90IG1hcCB3cml0ZSBidWZmZXJzXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dHB1dF9idWZmX21hcF9lcnJvcjsKLQl9Ci0JYXVkaW8tPmRhdGEgPSBhdWRpby0+bWFwX3Zfd3JpdGU7Ci0JTU1fREJHKCJ3cml0ZSBidWY6IHBoeSBhZGRyIDB4JTA4eCBrZXJuZWwgYWRkciAweCUwOHhcbiIsCi0JCWF1ZGlvLT5waHlzLCAoaW50KWF1ZGlvLT5kYXRhKTsKLQotCWF1ZGlvLT5vdXRfZG1hX3N6ID0gbWVtX3N6OwotCi0JcmMgPSBhdWRtZ3Jfb3BlbigmYXVkaW8tPmF1ZG1ncik7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiYXVkbWdyIG9wZW4gZmFpbGVkLCBmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQkoaW50KWF1ZGlvKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmMgPSBtc21fYWRzcF9nZXQoYXVkaW8tPm1vZHVsZV9uYW1lLCAmYXVkaW8tPmF1ZHBsYXksCi0JCQkmYXVkcGxheV9hZHNwX29wc193bWFwcm8sIGF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJmYWlsZWQgdG8gZ2V0ICVzIG1vZHVsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJYXVkaW8tPm1vZHVsZV9uYW1lLCAoaW50KWF1ZGlvKTsKLQkJYXVkbWdyX2Nsb3NlKCZhdWRpby0+YXVkbWdyKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmMgPSBybXRfZ2V0X3Jlc291cmNlKGF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJBRFNQIHJlc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgV01BUFJPIHNlc3Npb24gXAotCQkJIDB4JTA4eCBvbiBkZWNvZGVyOiAlZFxuIiwgKGludClhdWRpbywgYXVkaW8tPmRlY19pZCk7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrID09IFRVTk5FTF9NT0RFX1BMQVlCQUNLKQotCQkJYXVkbWdyX2Nsb3NlKCZhdWRpby0+YXVkbWdyKTsKLQkJbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRwbGF5KTsKLQkJZ290byBlcnI7Ci0JfQotCi0JYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlID0gTlVMTDsKLQltdXRleF9pbml0KCZhdWRpby0+bG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPndyaXRlX2xvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT5yZWFkX2xvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT5nZXRfZXZlbnRfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmF1ZGlvLT5kc3BfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2spOwotCi0JYXVkaW8tPm91dFswXS5kYXRhID0gYXVkaW8tPmRhdGEgKyAwOwotCWF1ZGlvLT5vdXRbMF0uYWRkciA9IGF1ZGlvLT5waHlzICsgMDsKLQlhdWRpby0+b3V0WzBdLnNpemUgPSBhdWRpby0+b3V0X2RtYV9zeiA+PiAxOwotCi0JYXVkaW8tPm91dFsxXS5kYXRhID0gYXVkaW8tPmRhdGEgKyBhdWRpby0+b3V0WzBdLnNpemU7Ci0JYXVkaW8tPm91dFsxXS5hZGRyID0gYXVkaW8tPnBoeXMgKyBhdWRpby0+b3V0WzBdLnNpemU7Ci0JYXVkaW8tPm91dFsxXS5zaXplID0gYXVkaW8tPm91dFswXS5zaXplOwotCi0JYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSA9IDQ0MTAwOwotCWF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID0gQVVEUFBfQ01EX1BDTV9JTlRGX1NURVJFT19WOwotCi0JYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gMHgyMDAwOwotCi0JYXVkaW9fZmx1c2goYXVkaW8pOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0JYXVkaW8tPm9wZW5lZCA9IDE7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mIG5hbWUsICJtc21fd21hcHJvXyUwNHgiLCBhdWRpby0+ZGVjX2lkKTsKLQlhdWRpby0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQlOVUxMLCAodm9pZCAqKSBhdWRpbywKLQkJCQkmYXVkd21hcHJvX2RlYnVnX2ZvcHMpOwotCi0JaWYgKElTX0VSUihhdWRpby0+ZGVudHJ5KSkKLQkJTU1fREJHKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLmxldmVsID0gRUFSTFlfU1VTUEVORF9MRVZFTF9ESVNBQkxFX0ZCOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLnJlc3VtZSA9IGF1ZHdtYXByb19yZXN1bWU7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUuc3VzcGVuZCA9IGF1ZHdtYXByb19zdXNwZW5kOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5hdWRpbyA9IGF1ZGlvOwotCXJlZ2lzdGVyX2Vhcmx5X3N1c3BlbmQoJmF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlKTsKLSNlbmRpZgotCWZvciAoaSA9IDA7IGkgPCBBVURXTUFQUk9fRVZFTlRfTlVNOyBpKyspIHsKLQkJZV9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZHdtYXByb19ldmVudCksIEdGUF9LRVJORUwpOwotCQlpZiAoZV9ub2RlKQotCQkJbGlzdF9hZGRfdGFpbCgmZV9ub2RlLT5saXN0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCQllbHNlIHsKLQkJCU1NX0VSUigiZXZlbnQgcGt0IGFsbG9jIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotZXJyOgotCWlvbl91bm1hcF9rZXJuZWwoY2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLW91dHB1dF9idWZmX21hcF9lcnJvcjoKLW91dHB1dF9idWZmX2dldF9waHlzX2Vycm9yOgotb3V0cHV0X2J1ZmZfZ2V0X2ZsYWdzX2Vycm9yOgotCWlvbl9mcmVlKGNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci1vdXRwdXRfYnVmZl9hbGxvY19lcnJvcjoKLQlpb25fY2xpZW50X2Rlc3Ryb3koY2xpZW50KTsKLWNsaWVudF9jcmVhdGVfZXJyb3I6Ci0JYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX3dtYXByb19mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBhdWRpb19vcGVuLAotCS5yZWxlYXNlCT0gYXVkaW9fcmVsZWFzZSwKLQkucmVhZCAJCT0gYXVkaW9fcmVhZCwKLQkud3JpdGUJCT0gYXVkaW9fd3JpdGUsCi0JLnVubG9ja2VkX2lvY3RsCT0gYXVkaW9faW9jdGwsCi0JLmZzeW5jIAkJPSBhdWRpb19mc3luYywKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX3dtYXByb19taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fd21hcHJvIiwKLQkuZm9wcwk9ICZhdWRpb193bWFwcm9fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGlvX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fd21hcHJvX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoYXVkaW9faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRtZ3IuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZG1nci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzQwNTg1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZG1nci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTI2ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZG1nci5jCi0gKgotICogaW50ZXJmYWNlIHRvICJhdWRtZ3IiIHNlcnZpY2Ugb24gdGhlIGJhc2ViYW5kIGNwdQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiwgMjAxMyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fcnBjcm91dGVyLmg+Ci0KLSNpbmNsdWRlICJhdWRtZ3IuaCIKLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLSNkZWZpbmUgU1RBVEVfQ0xPU0VEICAgIDAKLSNkZWZpbmUgU1RBVEVfRElTQUJMRUQgIDEKLSNkZWZpbmUgU1RBVEVfRU5BQkxJTkcgIDIKLSNkZWZpbmUgU1RBVEVfRU5BQkxFRCAgIDMKLSNkZWZpbmUgU1RBVEVfRElTQUJMSU5HIDQKLSNkZWZpbmUgU1RBVEVfRVJST1IJNQotI2RlZmluZSBNQVhfREVWSUNFX0lORk9fQ0FMTEJBQ0sgMQotI2RlZmluZSBTRVNTSU9OX1ZPSUNFIDAKLSNkZWZpbmUgU0VTU0lPTl9QTEFZQkFDSyAxCi0jZGVmaW5lIFNFU1NJT05fUkVDT1JESU5HIDIKLQotLyogc3RvcmUgaW5mb3JtYXRpb24gdXNlZCBhY3Jvc3MgY29tcGxldGUgYXVkbWdyIHNlc3Npb25zICovCi1zdHJ1Y3QgYXVkbWdyX2dsb2JhbCB7Ci0Jc3RydWN0IG11dGV4ICpsb2NrOwotCXN0cnVjdCBtc21fcnBjX2VuZHBvaW50ICplcHQ7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwotCXVpbnQzMl90IHJwY192ZXJzaW9uOwotCXVpbnQzMl90IHJ4X2RldmljZTsKLQl1aW50MzJfdCB0eF9kZXZpY2U7Ci0JaW50IGNhZDsKLQlzdHJ1Y3QgZGV2aWNlX2luZm9fY2FsbGJhY2sgKmRldmljZV9jYltNQVhfREVWSUNFX0lORk9fQ0FMTEJBQ0tdOwotCi19Owotc3RhdGljIERFRklORV9NVVRFWChhdWRtZ3JfbG9jayk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXVkbWdyX2dsb2JhbCB0aGVfYXVkbWdyX3N0YXRlID0gewotCS5sb2NrID0gJmF1ZG1ncl9sb2NrLAotfTsKLQotc3RhdGljIHZvaWQgYXVkbWdyX3JwY19jb25uZWN0KHN0cnVjdCBhdWRtZ3JfZ2xvYmFsICphbWcpCi17Ci0JYW1nLT5jYWQgPSAwOwotCWFtZy0+ZXB0ID0gbXNtX3JwY19jb25uZWN0X2NvbXBhdGlibGUoQVVETUdSX1BST0csCi0JCQlBVURNR1JfVkVSU19DT01QX1ZFUjMsCi0JCQlNU01fUlBDX1VOSU5URVJSVVBUSUJMRSk7Ci0JaWYgKElTX0VSUihhbWctPmVwdCkpIHsKLQkJTU1fREJHKCJjb25uZWN0IGZhaWxlZCB3aXRoIGN1cnJlbnQgVkVSUyJcCi0JCQkJIj0gJXgsIHRyeWluZyBhZ2FpbiB3aXRoICBDYWQgQVBJXG4iLAotCQkJCUFVRE1HUl9WRVJTX0NPTVBfVkVSMyk7Ci0JCWFtZy0+ZXB0ID0gbXNtX3JwY19jb25uZWN0X2NvbXBhdGlibGUoQVVETUdSX1BST0csCi0JCQkJQVVETUdSX1ZFUlNfQ09NUF9WRVI0LAotCQkJCU1TTV9SUENfVU5JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKElTX0VSUihhbWctPmVwdCkpIHsKLQkJCWFtZy0+ZXB0ID0gbXNtX3JwY19jb25uZWN0X2NvbXBhdGlibGUoQVVETUdSX1BST0csCi0JCQkJCUFVRE1HUl9WRVJTX0NPTVBfVkVSMiwKLQkJCQkJTVNNX1JQQ19VTklOVEVSUlVQVElCTEUpOwotCQkJaWYgKElTX0VSUihhbWctPmVwdCkpIHsKLQkJCQlNTV9FUlIoImNvbm5lY3QgZmFpbGVkIHdpdGggY3VycmVudCBWRVJTIiBcCi0JCQkJCSI9ICV4LCB0cnlpbmcgYWdhaW4gd2l0aCBhbm90aGVyIEFQSVxuIiwKLQkJCQkJQVVETUdSX1ZFUlNfQ09NUF9WRVIyKTsKLQkJCQlhbWctPmVwdCA9IG1zbV9ycGNfY29ubmVjdF9jb21wYXRpYmxlKAotCQkJCQkJQVVETUdSX1BST0csCi0JCQkJCQlBVURNR1JfVkVSU19DT01QLAotCQkJCQkJTVNNX1JQQ19VTklOVEVSUlVQVElCTEUpOwotCQkJCWlmIChJU19FUlIoYW1nLT5lcHQpKSB7Ci0JCQkJCU1NX0VSUigiY29ubmVjdCBmYWlsZWQgd2l0aCBjdXJyZW50IiBcCi0JCQkJCQkiVkVSUz0leCwgdHJ5aW5nIGFnYWluIHdpdGgiIFwKLQkJCQkJCSJhbm90aGVyIEFQSVxuIiwKLQkJCQkJCUFVRE1HUl9WRVJTX0NPTVApOwotCQkJCQlhbWctPmVwdCA9IG1zbV9ycGNfY29ubmVjdChBVURNR1JfUFJPRywKLQkJCQkJCUFVRE1HUl9WRVJTLAotCQkJCQkJTVNNX1JQQ19VTklOVEVSUlVQVElCTEUpOwotCQkJCQlhbWctPnJwY192ZXJzaW9uID0gQVVETUdSX1ZFUlM7Ci0JCQkJfSBlbHNlCi0JCQkJCWFtZy0+cnBjX3ZlcnNpb24gPSBBVURNR1JfVkVSU19DT01QOwotCQkJfSBlbHNlCi0JCQkJYW1nLT5ycGNfdmVyc2lvbiA9IEFVRE1HUl9WRVJTX0NPTVBfVkVSMjsKLQkJfSBlbHNlIHsKLQkJCWFtZy0+cnBjX3ZlcnNpb24gPSBBVURNR1JfVkVSU19DT01QX1ZFUjQ7Ci0JCQlhbWctPmNhZCA9IDE7Ci0JCX0KLQl9IGVsc2UKLQkJYW1nLT5ycGNfdmVyc2lvbiA9IEFVRE1HUl9WRVJTX0NPTVBfVkVSMzsKLQotCWlmIChJU19FUlIoYW1nLT5lcHQpKSB7Ci0JCWFtZy0+ZXB0ID0gTlVMTDsKLQkJTU1fRVJSKCJmYWlsZWQgdG8gY29ubmVjdCB0byBhdWRtZ3Igc3ZjXG4iKTsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIHJwY19hY2soc3RydWN0IG1zbV9ycGNfZW5kcG9pbnQgKmVwdCwgdWludDMyX3QgeGlkKQotewotCXVpbnQzMl90IHJlcFs2XTsKLQotCXJlcFswXSA9IGNwdV90b19iZTMyKHhpZCk7Ci0JcmVwWzFdID0gY3B1X3RvX2JlMzIoMSk7Ci0JcmVwWzJdID0gY3B1X3RvX2JlMzIoUlBDTVNHX1JFUExZU1RBVF9BQ0NFUFRFRCk7Ci0JcmVwWzNdID0gY3B1X3RvX2JlMzIoUlBDX0FDQ0VQVFNUQVRfU1VDQ0VTUyk7Ci0JcmVwWzRdID0gMDsKLQlyZXBbNV0gPSAwOwotCi0JbXNtX3JwY193cml0ZShlcHQsIHJlcCwgc2l6ZW9mKHJlcCkpOwotfQotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX2F1ZG1ncl9jYWxsYmFjayhzdHJ1Y3QgYXVkbWdyX2dsb2JhbCAqYW1nLAotCQkJCSAgIHZvaWQgKmFyZ3MsIGludCBsZW4pCi17Ci0Jc3RydWN0IGF1ZG1nciAqYW07Ci0JaW50IGkgPSAwOwotCXN0cnVjdCBycGNfYXVkbWdyX2NiX2RldmljZV9pbmZvICp0ZW1wOwotCi0JLyogQWxsb3cgb25seSBpZiBjb21wbGV0ZSBhcmd1bWVudHMgcmVjZXZpZWQqLwotCWlmIChsZW4gPCBNSU5fUlBDX0RBVEFfTEVOR1RIKQotCQlyZXR1cm47Ci0KLQkvKiBBbGxvdyBvbmx5IGlmIHZhbGlkIGFyZ3VtZW50ICovCi0JaWYgKGJlMzJfdG9fY3B1KCgoc3RydWN0IHJwY19hdWRtZ3JfY2JfY29tbW9uICopYXJncyktPnNldF90b19vbmUpICE9IDEpCi0JCXJldHVybjsKLQotCXN3aXRjaCAoYmUzMl90b19jcHUoKChzdHJ1Y3QgcnBjX2F1ZG1ncl9jYl9jb21tb24gKilhcmdzKS0+c3RhdHVzKSkgewotCWNhc2UgUlBDX0FVRE1HUl9TVEFUVVNfUkVBRFk6Ci0JCWFtID0gKHN0cnVjdCBhdWRtZ3IgKikgYmUzMl90b19jcHUoCi0JCQkoKHN0cnVjdCBycGNfYXVkbWdyX2NiX3JlYWR5ICopYXJncyktPmNsaWVudF9kYXRhKTsKLQkJaWYgKCFhbSkKLQkJCXJldHVybjsKLQkJYW0tPmhhbmRsZSA9IGJlMzJfdG9fY3B1KAotCQkJCSgoc3RydWN0IHJwY19hdWRtZ3JfY2JfcmVhZHkgKilhcmdzKS0+dS5oYW5kbGUpOwotCQlNTV9JTkZPKCJycGMgUkVBRFkgaGFuZGxlPTB4JTA4eFxuIiwgYW0tPmhhbmRsZSk7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0FVRE1HUl9TVEFUVVNfQ09ERUNfQ09ORklHOiB7Ci0JCU1NX0lORk8oInJwYyBDT0RFQ19DT05GSUdcbiIpOwotCQlhbSA9IChzdHJ1Y3QgYXVkbWdyICopIGJlMzJfdG9fY3B1KAotCQkJKChzdHJ1Y3QgcnBjX2F1ZG1ncl9jYl9yZWFkeSAqKWFyZ3MpLT5jbGllbnRfZGF0YSk7Ci0JCWlmICghYW0pCi0JCQlyZXR1cm47Ci0JCWlmIChhbS0+c3RhdGUgIT0gU1RBVEVfRU5BQkxFRCkKLQkJCWFtLT5zdGF0ZSA9IFNUQVRFX0VOQUJMRUQ7Ci0JCWlmICghYW1nLT5jYWQpIHsKLQkJCXdha2VfdXAoJmFtLT53YWl0KTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGFtLT5ldnQuc2Vzc2lvbl9pbmZvID09IFNFU1NJT05fUExBWUJBQ0sgJiYKLQkJCWFtLT5ldnQuZGV2X3R5cGUucnhfZGV2aWNlICE9IGFtZy0+cnhfZGV2aWNlKSB7Ci0JCQlhbS0+ZXZ0LmRldl90eXBlLnJ4X2RldmljZSA9IGFtZy0+cnhfZGV2aWNlOwotCQkJYW0tPmV2dC5kZXZfdHlwZS50eF9kZXZpY2UgPSAwOwotCQkJYW0tPmV2dC5hY2RiX2lkID0gYW0tPmV2dC5kZXZfdHlwZS5yeF9kZXZpY2U7Ci0JCX0KLQkJaWYgKGFtLT5ldnQuc2Vzc2lvbl9pbmZvID09IFNFU1NJT05fUkVDT1JESU5HICYmCi0JCQlhbS0+ZXZ0LmRldl90eXBlLnR4X2RldmljZSAhPSBhbWctPnR4X2RldmljZSkgewotCQkJYW0tPmV2dC5kZXZfdHlwZS5yeF9kZXZpY2UgPSAwOwotCQkJYW0tPmV2dC5kZXZfdHlwZS50eF9kZXZpY2UgPSBhbWctPnR4X2RldmljZTsKLQkJCWFtLT5ldnQuYWNkYl9pZCA9IGFtLT5ldnQuZGV2X3R5cGUudHhfZGV2aWNlOwotCQl9Ci0KLQkJd2hpbGUgKChhbWctPmRldmljZV9jYltpXSAhPSBOVUxMKSAmJgotCQkJCShpIDwgTUFYX0RFVklDRV9JTkZPX0NBTExCQUNLKSAmJgotCQkJCShhbWctPmNhZCkpIHsKLQkJCWFtZy0+ZGV2aWNlX2NiW2ldLT5mdW5jKCYoYW0tPmV2dCksCi0JCQkJCWFtZy0+ZGV2aWNlX2NiW2ldLT5wcml2YXRlKTsKLQkJCWkrKzsKLQkJfQotCQl3YWtlX3VwKCZhbS0+d2FpdCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIFJQQ19BVURNR1JfU1RBVFVTX1BFTkRJTkc6Ci0JCU1NX0VSUigiUEVORElORz9cbiIpOwotCQlicmVhazsKLQljYXNlIFJQQ19BVURNR1JfU1RBVFVTX1NVU1BFTkQ6Ci0JCU1NX0VSUigiU1VTUEVORD9cbiIpOwotCQlicmVhazsKLQljYXNlIFJQQ19BVURNR1JfU1RBVFVTX0ZBSUxVUkU6Ci0JCU1NX0VSUigiRkFJTFVSRVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0FVRE1HUl9TVEFUVVNfVk9MVU1FX0NIQU5HRToKLQkJTU1fRVJSKCJWT0xVTUVfQ0hBTkdFP1xuIik7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0FVRE1HUl9TVEFUVVNfRElTQUJMRUQ6Ci0JCU1NX0VSUigiRElTQUJMRURcbiIpOwotCQlhbSA9IChzdHJ1Y3QgYXVkbWdyICopIGJlMzJfdG9fY3B1KAotCQkJKChzdHJ1Y3QgcnBjX2F1ZG1ncl9jYl9yZWFkeSAqKWFyZ3MpLT5jbGllbnRfZGF0YSk7Ci0JCWlmICghYW0pCi0JCQlyZXR1cm47Ci0JCWFtLT5zdGF0ZSA9IFNUQVRFX0RJU0FCTEVEOwotCQl3YWtlX3VwKCZhbS0+d2FpdCk7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0FVRE1HUl9TVEFUVVNfRVJST1I6Ci0JCU1NX0VSUigiRVJST1I/XG4iKTsKLQkJYW0gPSAoc3RydWN0IGF1ZG1nciAqKSBiZTMyX3RvX2NwdSgKLQkJCSgoc3RydWN0IHJwY19hdWRtZ3JfY2JfcmVhZHkgKilhcmdzKS0+Y2xpZW50X2RhdGEpOwotCQlpZiAoIWFtKQotCQkJcmV0dXJuOwotCQlhbS0+c3RhdGUgPSBTVEFURV9FUlJPUjsKLQkJd2FrZV91cCgmYW0tPndhaXQpOwotCQlicmVhazsKLQljYXNlIFJQQ19BVURNR1JfU1RBVFVTX0RFVklDRV9JTkZPOgotCQlNTV9JTkZPKCJycGMgREVWSUNFX0lORk9cbiIpOwotCQlpZiAoIWFtZy0+Y2FkKQotCQkJYnJlYWs7Ci0JCXRlbXAgPSAoc3RydWN0IHJwY19hdWRtZ3JfY2JfZGV2aWNlX2luZm8gKilhcmdzOwotCQlhbSA9IChzdHJ1Y3QgYXVkbWdyICopIGJlMzJfdG9fY3B1KHRlbXAtPmNsaWVudF9kYXRhKTsKLQkJaWYgKCFhbSkKLQkJCXJldHVybjsKLQkJaWYgKGFtLT5ldnQuc2Vzc2lvbl9pbmZvID09IFNFU1NJT05fUExBWUJBQ0spIHsKLQkJCWFtLT5ldnQuZGV2X3R5cGUucnhfZGV2aWNlID0KLQkJCQkJYmUzMl90b19jcHUodGVtcC0+ZC5yeF9kZXZpY2UpOwotCQkJYW0tPmV2dC5kZXZfdHlwZS50eF9kZXZpY2UgPSAwOwotCQkJYW0tPmV2dC5hY2RiX2lkID0gYW0tPmV2dC5kZXZfdHlwZS5yeF9kZXZpY2U7Ci0JCQlhbWctPnJ4X2RldmljZSA9IGFtLT5ldnQuZGV2X3R5cGUucnhfZGV2aWNlOwotCQl9IGVsc2UgaWYgKGFtLT5ldnQuc2Vzc2lvbl9pbmZvID09IFNFU1NJT05fUkVDT1JESU5HKSB7Ci0JCQlhbS0+ZXZ0LmRldl90eXBlLnJ4X2RldmljZSA9IDA7Ci0JCQlhbS0+ZXZ0LmRldl90eXBlLnR4X2RldmljZSA9Ci0JCQkJCWJlMzJfdG9fY3B1KHRlbXAtPmQudHhfZGV2aWNlKTsKLQkJCWFtLT5ldnQuYWNkYl9pZCA9IGFtLT5ldnQuZGV2X3R5cGUudHhfZGV2aWNlOwotCQkJYW1nLT50eF9kZXZpY2UgPSBhbS0+ZXZ0LmRldl90eXBlLnR4X2RldmljZTsKLQkJfQotCQlhbS0+ZXZ0LmRldl90eXBlLmVhcl9tdXRlID0KLQkJCQkJYmUzMl90b19jcHUodGVtcC0+ZC5lYXJfbXV0ZSk7Ci0JCWFtLT5ldnQuZGV2X3R5cGUubWljX211dGUgPQotCQkJCQliZTMyX3RvX2NwdSh0ZW1wLT5kLm1pY19tdXRlKTsKLQkJYW0tPmV2dC5kZXZfdHlwZS52b2x1bWUgPQotCQkJCQliZTMyX3RvX2NwdSh0ZW1wLT5kLnZvbHVtZSk7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0FVRE1HUl9TVEFUVVNfREVWSUNFX0NPTkZJRzoKLQkJTU1fRVJSKCJycGMgREVWSUNFX0NPTkZJR1xuIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcHJvY2Vzc19ycGNfcmVxdWVzdCh1aW50MzJfdCBwcm9jLCB1aW50MzJfdCB4aWQsCi0JCQkJdm9pZCAqZGF0YSwgaW50IGxlbiwgdm9pZCAqcHJpdmF0ZSkKLXsKLQlzdHJ1Y3QgYXVkbWdyX2dsb2JhbCAqYW1nID0gcHJpdmF0ZTsKLQotCWlmIChwcm9jID09IEFVRE1HUl9DQl9GVU5DX1BUUikKLQkJcHJvY2Vzc19hdWRtZ3JfY2FsbGJhY2soYW1nLCBkYXRhLCBsZW4pOwotCWVsc2UKLQkJTU1fRVJSKCJ1bmtub3duIHJwYyBwcm9jICVkXG4iLCBwcm9jKTsKLQlycGNfYWNrKGFtZy0+ZXB0LCB4aWQpOwotfQotCi0jZGVmaW5lIFJQQ19UWVBFX1JFUVVFU1QgMAotI2RlZmluZSBSUENfVFlQRV9SRVBMWSAxCi0KLSNkZWZpbmUgUlBDX1ZFUlNJT04gMgotCi0jZGVmaW5lIFJQQ19DT01NT05fSERSX1NaICAoc2l6ZW9mKHVpbnQzMl90KSAqIDIpCi0jZGVmaW5lIFJQQ19SRVFVRVNUX0hEUl9TWiAoc2l6ZW9mKHN0cnVjdCBycGNfcmVxdWVzdF9oZHIpKQotI2RlZmluZSBSUENfUkVQTFlfSERSX1NaICAgKHNpemVvZih1aW50MzJfdCkgKiAzKQotI2RlZmluZSBSUENfUkVQTFlfU1ogICAgICAgKHNpemVvZih1aW50MzJfdCkgKiA2KQotCi1zdGF0aWMgaW50IGF1ZG1ncl9ycGNfdGhyZWFkKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGF1ZG1ncl9nbG9iYWwgKmFtZyA9IGRhdGE7Ci0Jc3RydWN0IHJwY19yZXF1ZXN0X2hkciAqaGRyID0gTlVMTDsKLQl1aW50MzJfdCB0eXBlOwotCWludCBsZW47Ci0KLQlNTV9JTkZPKCJzdGFydFxuIik7Ci0KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQlpZiAoaGRyKSB7Ci0JCQlrZnJlZShoZHIpOwotCQkJaGRyID0gTlVMTDsKLQkJfQotCQlsZW4gPSBtc21fcnBjX3JlYWQoYW1nLT5lcHQsICh2b2lkICoqKSAmaGRyLCAtMSwgLTEpOwotCQlpZiAobGVuIDwgMCkgewotCQkJTU1fRVJSKCJycGMgcmVhZCBmYWlsZWQgKCVkKVxuIiwgbGVuKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChsZW4gPCBSUENfQ09NTU9OX0hEUl9TWikKLQkJCWNvbnRpbnVlOwotCi0JCXR5cGUgPSBiZTMyX3RvX2NwdShoZHItPnR5cGUpOwotCQlpZiAodHlwZSA9PSBSUENfVFlQRV9SRVBMWSkgewotCQkJc3RydWN0IHJwY19yZXBseV9oZHIgKnJlcCA9ICh2b2lkICopIGhkcjsKLQkJCXVpbnQzMl90IHN0YXR1czsKLQkJCWlmIChsZW4gPCBSUENfUkVQTFlfSERSX1NaKQotCQkJCWNvbnRpbnVlOwotCQkJc3RhdHVzID0gYmUzMl90b19jcHUocmVwLT5yZXBseV9zdGF0KTsKLQkJCWlmIChzdGF0dXMgPT0gUlBDTVNHX1JFUExZU1RBVF9BQ0NFUFRFRCkgewotCQkJCXN0YXR1cyA9IGJlMzJfdG9fY3B1KHJlcC0+ZGF0YS5hY2NfaGRyLmFjY2VwdF9zdGF0KTsKLQkJCQlNTV9JTkZPKCJycGNfcmVwbHkgc3RhdHVzICVkXG4iLCBzdGF0dXMpOwotCQkJfSBlbHNlIHsKLQkJCQlNTV9JTkZPKCJycGNfcmVwbHkgZGVuaWVkIVxuIik7Ci0JCQl9Ci0JCQkvKiBwcm9jZXNzIHJlcGx5ICovCi0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChsZW4gPCBSUENfUkVRVUVTVF9IRFJfU1opCi0JCQljb250aW51ZTsKLQotCQlwcm9jZXNzX3JwY19yZXF1ZXN0KGJlMzJfdG9fY3B1KGhkci0+cHJvY2VkdXJlKSwKLQkJCQkgICAgYmUzMl90b19jcHUoaGRyLT54aWQpLAotCQkJCSAgICAodm9pZCAqKSAoaGRyICsgMSksCi0JCQkJICAgIGxlbiAtIHNpemVvZigqaGRyKSwKLQkJCQkgICAgZGF0YSk7Ci0JfQotCU1NX0lORk8oImV4aXRcbiIpOwotCWlmIChoZHIpIHsKLQkJa2ZyZWUoaGRyKTsKLQkJaGRyID0gTlVMTDsKLQl9Ci0JYW1nLT50YXNrID0gTlVMTDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNvbnZlcnRfc2FtcF9pbmRleCh1bnNpZ25lZCBpbmRleCkKLXsKLQlzd2l0Y2ggKGluZGV4KSB7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV80ODAwMDoJcmV0dXJuIDQ4MDAwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfNDQxMDA6CXJldHVybiA0NDEwMDsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzMyMDAwOglyZXR1cm4gMzIwMDA7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8yNDAwMDoJcmV0dXJuIDI0MDAwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMjIwNTA6CXJldHVybiAyMjA1MDsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzE2MDAwOglyZXR1cm4gMTYwMDA7Ci0JY2FzZSBSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xMjAwMDoJcmV0dXJuIDEyMDAwOwotCWNhc2UgUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfMTEwMjU6CXJldHVybiAxMTAyNTsKLQljYXNlIFJQQ19BVURfREVGX1NBTVBMRV9SQVRFXzgwMDA6CXJldHVybiA4MDAwOwotCWRlZmF1bHQ6CQkJCXJldHVybiAxMTAyNTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGdldF9jdXJyZW50X3Nlc3Npb25faW5mbyhzdHJ1Y3QgYXVkbWdyICphbSwKLQkJCQlzdHJ1Y3QgYXVkbWdyX2NvbmZpZyAqY2ZnKQotewotCWlmIChjZmctPmRlZl9tZXRob2QgPT0gUlBDX0FVRF9ERUZfTUVUSE9EX1BMQVlCQUNLIHx8Ci0JICAgKGNmZy0+ZGVmX21ldGhvZCA9PSBSUENfQVVEX0RFRl9NRVRIT0RfSE9TVF9QQ00gJiYgY2ZnLT5yeF9yYXRlKSkgewotCQlhbS0+ZXZ0LnNlc3Npb25faW5mbyA9IFNFU1NJT05fUExBWUJBQ0s7IC8qIHBsYXliYWNrICovCi0JCWFtLT5ldnQuc2FtcGxlX3JhdGUgPSBjb252ZXJ0X3NhbXBfaW5kZXgoY2ZnLT5yeF9yYXRlKTsKLQl9IGVsc2UgaWYgKGNmZy0+ZGVmX21ldGhvZCA9PSBSUENfQVVEX0RFRl9NRVRIT0RfUkVDT1JEKSB7Ci0JCWFtLT5ldnQuc2Vzc2lvbl9pbmZvID0gU0VTU0lPTl9SRUNPUkRJTkc7IC8qIHJlY29yZGluZyAqLwotCQlhbS0+ZXZ0LnNhbXBsZV9yYXRlID0gY29udmVydF9zYW1wX2luZGV4KGNmZy0+dHhfcmF0ZSk7Ci0JfSBlbHNlCi0JCWFtLT5ldnQuc2Vzc2lvbl9pbmZvID0gU0VTU0lPTl9WT0lDRTsKLX0KLQotc3RydWN0IGF1ZG1ncl9lbmFibGVfbXNnIHsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIGhkcjsKLQlzdHJ1Y3QgcnBjX2F1ZG1ncl9lbmFibGVfY2xpZW50X2FyZ3MgYXJnczsKLX07Ci0KLXN0cnVjdCBhdWRtZ3JfZGlzYWJsZV9tc2cgewotCXN0cnVjdCBycGNfcmVxdWVzdF9oZHIgaGRyOwotCXVpbnQzMl90IGhhbmRsZTsKLX07Ci0KLWludCBhdWRtZ3Jfb3BlbihzdHJ1Y3QgYXVkbWdyICphbSkKLXsKLQlzdHJ1Y3QgYXVkbWdyX2dsb2JhbCAqYW1nID0gJnRoZV9hdWRtZ3Jfc3RhdGU7Ci0JaW50IHJjOwotCi0JaWYgKGFtLT5zdGF0ZSAhPSBTVEFURV9DTE9TRUQpCi0JCXJldHVybiAwOwotCi0JbXV0ZXhfbG9jayhhbWctPmxvY2spOwotCi0JLyogY29ubmVjdCB0byBhdWRtZ3IgZW5kIHBvaW50IGFuZCBwb2xsaW5nIHRocmVhZCBvbmx5IG9uY2UgKi8KLQlpZiAoYW1nLT5lcHQgPT0gTlVMTCkgewotCQlhdWRtZ3JfcnBjX2Nvbm5lY3QoYW1nKTsKLQkJaWYgKElTX0VSUihhbWctPmVwdCkpIHsKLQkJCXJjID0gUFRSX0VSUihhbWctPmVwdCk7Ci0JCQlhbWctPmVwdCA9IE5VTEw7Ci0JCQlNTV9FUlIoImZhaWxlZCB0byBjb25uZWN0IHRvIGF1ZG1nciBzdmNcbiIpOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJYW1nLT50YXNrID0ga3RocmVhZF9ydW4oYXVkbWdyX3JwY190aHJlYWQsIGFtZywgImF1ZG1ncl9ycGMiKTsKLQkJaWYgKElTX0VSUihhbWctPnRhc2spKSB7Ci0JCQlyYyA9IFBUUl9FUlIoYW1nLT50YXNrKTsKLQkJCWFtZy0+dGFzayA9IE5VTEw7Ci0JCQltc21fcnBjX2Nsb3NlKGFtZy0+ZXB0KTsKLQkJCWFtZy0+ZXB0ID0gTlVMTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCS8qIEluaXRpYWxpemUgc2Vzc2lvbiBwYXJhbWV0ZXJzICovCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmYW0tPndhaXQpOwotCWFtLT5zdGF0ZSA9IFNUQVRFX0RJU0FCTEVEOwotCXJjID0gMDsKLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKGFtZy0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTChhdWRtZ3Jfb3Blbik7Ci0KLWludCBhdWRtZ3JfY2xvc2Uoc3RydWN0IGF1ZG1nciAqYW0pCi17Ci0JcmV0dXJuIC1FQlVTWTsKLX0KLUVYUE9SVF9TWU1CT0woYXVkbWdyX2Nsb3NlKTsKLQotaW50IGF1ZG1ncl9lbmFibGUoc3RydWN0IGF1ZG1nciAqYW0sIHN0cnVjdCBhdWRtZ3JfY29uZmlnICpjZmcpCi17Ci0Jc3RydWN0IGF1ZG1ncl9nbG9iYWwgKmFtZyA9ICZ0aGVfYXVkbWdyX3N0YXRlOwotCXN0cnVjdCBhdWRtZ3JfZW5hYmxlX21zZyBtc2c7Ci0JaW50IHJjOwotCi0JaWYgKGFtLT5zdGF0ZSA9PSBTVEFURV9FTkFCTEVEKQotCQlyZXR1cm4gMDsKLQotCWlmIChhbS0+c3RhdGUgPT0gU1RBVEVfRElTQUJMSU5HKQotCQlNTV9FUlIoInN0YXRlIGlzIERJU0FCTElORyBpbiBlbmFibGU/XG4iKTsKLQlhbS0+c3RhdGUgPSBTVEFURV9FTkFCTElORzsKLQotCU1NX0lORk8oInNlc3Npb24gMHglMDh4XG4iLCAoaW50KSBhbSk7Ci0JbXNnLmFyZ3Muc2V0X3RvX29uZSA9IGNwdV90b19iZTMyKDEpOwotCW1zZy5hcmdzLnR4X3NhbXBsZV9yYXRlID0gY3B1X3RvX2JlMzIoY2ZnLT50eF9yYXRlKTsKLQltc2cuYXJncy5yeF9zYW1wbGVfcmF0ZSA9IGNwdV90b19iZTMyKGNmZy0+cnhfcmF0ZSk7Ci0JbXNnLmFyZ3MuZGVmX21ldGhvZCA9IGNwdV90b19iZTMyKGNmZy0+ZGVmX21ldGhvZCk7Ci0JbXNnLmFyZ3MuY29kZWNfdHlwZSA9IGNwdV90b19iZTMyKGNmZy0+Y29kZWMpOwotCW1zZy5hcmdzLnNuZF9tZXRob2QgPSBjcHVfdG9fYmUzMihjZmctPnNuZF9tZXRob2QpOwotCW1zZy5hcmdzLmNiX2Z1bmMgPSBjcHVfdG9fYmUzMigweDExMTExMTExKTsKLQltc2cuYXJncy5jbGllbnRfZGF0YSA9IGNwdV90b19iZTMyKChpbnQpYW0pOwotCi0JZ2V0X2N1cnJlbnRfc2Vzc2lvbl9pbmZvKGFtLCBjZmcpOwotCW1zbV9ycGNfc2V0dXBfcmVxKCZtc2cuaGRyLCBBVURNR1JfUFJPRywgYW1nLT5ycGNfdmVyc2lvbiwKLQkJCSAgQVVETUdSX0VOQUJMRV9DTElFTlQpOwotCi0JcmMgPSBtc21fcnBjX3dyaXRlKGFtZy0+ZXB0LCAmbXNnLCBzaXplb2YobXNnKSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYW0tPndhaXQsIGFtLT5zdGF0ZSAhPSBTVEFURV9FTkFCTElORywgMTUgKiBIWik7Ci0JaWYgKHJjID09IDApIHsKLQkJTU1fRVJSKCJBUk05IGRpZCBub3QgcmVwbHkgdG8gUlBDIGFtLT5zdGF0ZSA9ICVkXG4iLCBhbS0+c3RhdGUpOwotCX0KLQlpZiAoYW0tPnN0YXRlID09IFNUQVRFX0VOQUJMRUQpCi0JCXJldHVybiAwOwotCi0JYW0tPmV2dC5zZXNzaW9uX2luZm8gPSAtMTsKLQlNTV9FUlIoInVuZXhwZWN0ZWQgc3RhdGUgJWQgd2hpbGUgZW5hYmxpbmc/IVxuIiwgYW0tPnN0YXRlKTsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLUVYUE9SVF9TWU1CT0woYXVkbWdyX2VuYWJsZSk7Ci0KLWludCBhdWRtZ3JfZGlzYWJsZShzdHJ1Y3QgYXVkbWdyICphbSkKLXsKLQlzdHJ1Y3QgYXVkbWdyX2dsb2JhbCAqYW1nID0gJnRoZV9hdWRtZ3Jfc3RhdGU7Ci0Jc3RydWN0IGF1ZG1ncl9kaXNhYmxlX21zZyBtc2c7Ci0JaW50IHJjOwotCi0JaWYgKGFtLT5zdGF0ZSA9PSBTVEFURV9ESVNBQkxFRCkKLQkJcmV0dXJuIDA7Ci0KLQlNTV9JTkZPKCJzZXNzaW9uIDB4JTA4eFxuIiwgKGludCkgYW0pOwotCWFtLT5ldnQuc2Vzc2lvbl9pbmZvID0gLTE7Ci0JbXNnLmhhbmRsZSA9IGNwdV90b19iZTMyKGFtLT5oYW5kbGUpOwotCW1zbV9ycGNfc2V0dXBfcmVxKCZtc2cuaGRyLCBBVURNR1JfUFJPRywgYW1nLT5ycGNfdmVyc2lvbiwKLQkJCSAgQVVETUdSX0RJU0FCTEVfQ0xJRU5UKTsKLQotCWFtLT5zdGF0ZSA9IFNUQVRFX0RJU0FCTElORzsKLQotCXJjID0gbXNtX3JwY193cml0ZShhbWctPmVwdCwgJm1zZywgc2l6ZW9mKG1zZykpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFtLT53YWl0LCBhbS0+c3RhdGUgIT0gU1RBVEVfRElTQUJMSU5HLCAxNSAqIEhaKTsKLQlpZiAocmMgPT0gMCkgewotCQlNTV9FUlIoIkFSTTkgZGlkIG5vdCByZXBseSB0byBSUEMgYW0tPnN0YXRlID0gJWRcbiIsIGFtLT5zdGF0ZSk7Ci0JfQotCi0JaWYgKGFtLT5zdGF0ZSA9PSBTVEFURV9ESVNBQkxFRCkKLQkJcmV0dXJuIDA7Ci0KLQlNTV9FUlIoInVuZXhwZWN0ZWQgc3RhdGUgJWQgd2hpbGUgZGlzYWJsaW5nPyFcbiIsIGFtLT5zdGF0ZSk7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZG1ncl9kaXNhYmxlKTsKLQotaW50IGF1ZG1ncl9yZWdpc3Rlcl9kZXZpY2VfaW5mb19jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlX2luZm9fY2FsbGJhY2sgKmRjYikKLXsKLQlzdHJ1Y3QgYXVkbWdyX2dsb2JhbCAqYW1nID0gJnRoZV9hdWRtZ3Jfc3RhdGU7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RFVklDRV9JTkZPX0NBTExCQUNLOyBpKyspIHsKLQkJaWYgKE5VTEwgPT0gYW1nLT5kZXZpY2VfY2JbaV0pIHsKLQkJCWFtZy0+ZGV2aWNlX2NiW2ldID0gZGNiOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZG1ncl9yZWdpc3Rlcl9kZXZpY2VfaW5mb19jYWxsYmFjayk7Ci0KLWludCBhdWRtZ3JfZGVyZWdpc3Rlcl9kZXZpY2VfaW5mb19jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlX2luZm9fY2FsbGJhY2sgKmRjYikKLXsKLQlzdHJ1Y3QgYXVkbWdyX2dsb2JhbCAqYW1nID0gJnRoZV9hdWRtZ3Jfc3RhdGU7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RFVklDRV9JTkZPX0NBTExCQUNLOyBpKyspIHsKLQkJaWYgKGRjYiA9PSBhbWctPmRldmljZV9jYltpXSkgewotCQkJYW1nLT5kZXZpY2VfY2JbaV0gPSBOVUxMOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZG1ncl9kZXJlZ2lzdGVyX2RldmljZV9pbmZvX2NhbGxiYWNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZG1nci5oIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkbWdyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYTA4OTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkbWdyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkbWdyLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSwgMjAxMiBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9BVURJT19SUENfSF8KLSNkZWZpbmUgX0FVRElPX1JQQ19IXwotCi0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHBwY21kaS5oPgotCi1lbnVtIHJwY19hdWRfZGVmX3NhbXBsZV9yYXRlX3R5cGUgewotCVJQQ19BVURfREVGX1NBTVBMRV9SQVRFX05PTkUsCi0JUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfODAwMCwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xMTAyNSwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xMjAwMCwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xNjAwMCwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8yMjA1MCwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8yNDAwMCwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8zMjAwMCwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV80NDEwMCwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV80ODAwMCwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV9NQVgsCi19OwotCi1lbnVtIHJwY19hdWRfZGVmX21ldGhvZF90eXBlIHsKLQlSUENfQVVEX0RFRl9NRVRIT0RfTk9ORSwKLQlSUENfQVVEX0RFRl9NRVRIT0RfS0VZX0JFRVAsCi0JUlBDX0FVRF9ERUZfTUVUSE9EX1BMQVlCQUNLLAotCVJQQ19BVURfREVGX01FVEhPRF9WT0lDRSwKLQlSUENfQVVEX0RFRl9NRVRIT0RfUkVDT1JELAotCVJQQ19BVURfREVGX01FVEhPRF9IT1NUX1BDTSwKLQlSUENfQVVEX0RFRl9NRVRIT0RfTUlESV9PVVQsCi0JUlBDX0FVRF9ERUZfTUVUSE9EX1JFQ09SRF9TQkMsCi0JUlBDX0FVRF9ERUZfTUVUSE9EX0RUTUZfUklOR0VSLAotCVJQQ19BVURfREVGX01FVEhPRF9NQVgsCi19OwotCi1lbnVtIHJwY19hdWRfZGVmX2NvZGVjX3R5cGUgewotCVJQQ19BVURfREVGX0NPREVDX05PTkUsCi0JUlBDX0FVRF9ERUZfQ09ERUNfRFRNRiwKLQlSUENfQVVEX0RFRl9DT0RFQ19NSURJLAotCVJQQ19BVURfREVGX0NPREVDX01QMywKLQlSUENfQVVEX0RFRl9DT0RFQ19QQ00sCi0JUlBDX0FVRF9ERUZfQ09ERUNfQUFDLAotCVJQQ19BVURfREVGX0NPREVDX1dNQSwKLQlSUENfQVVEX0RFRl9DT0RFQ19SQSwKLQlSUENfQVVEX0RFRl9DT0RFQ19BRFBDTSwKLQlSUENfQVVEX0RFRl9DT0RFQ19HQVVESU8sCi0JUlBDX0FVRF9ERUZfQ09ERUNfVk9DX0VWUkMsCi0JUlBDX0FVRF9ERUZfQ09ERUNfVk9DXzEzSywKLQlSUENfQVVEX0RFRl9DT0RFQ19WT0NfNEdWX05CLAotCVJQQ19BVURfREVGX0NPREVDX1ZPQ19BTVIsCi0JUlBDX0FVRF9ERUZfQ09ERUNfVk9DX0VGUiwKLQlSUENfQVVEX0RFRl9DT0RFQ19WT0NfRlIsCi0JUlBDX0FVRF9ERUZfQ09ERUNfVk9DX0hSLAotCVJQQ19BVURfREVGX0NPREVDX1ZPQ19DRE1BLAotCVJQQ19BVURfREVGX0NPREVDX1ZPQ19DRE1BX1dCLAotCVJQQ19BVURfREVGX0NPREVDX1ZPQ19VTVRTLAotCVJQQ19BVURfREVGX0NPREVDX1ZPQ19VTVRTX1dCLAotCVJQQ19BVURfREVGX0NPREVDX1NCQywKLQlSUENfQVVEX0RFRl9DT0RFQ19WT0NfUENNLAotCVJQQ19BVURfREVGX0NPREVDX0FNUl9XQiwKLQlSUENfQVVEX0RFRl9DT0RFQ19BTVJfV0JfUExVUywKLQlSUENfQVVEX0RFRl9DT0RFQ19BQUNfQlNBQywKLQlSUENfQVVEX0RFRl9DT0RFQ19NQVgsCi0JUlBDX0FVRF9ERUZfQ09ERUNfQU1SX05CLAotCVJQQ19BVURfREVGX0NPREVDXzEzSywKLQlSUENfQVVEX0RFRl9DT0RFQ19FVlJDLAotCVJQQ19BVURfREVGX0NPREVDX0FDMywKLQlSUENfQVVEX0RFRl9DT0RFQ19NQVhfMDAyLAotfTsKLQotZW51bSBycGNfc25kX21ldGhvZF90eXBlIHsKLQlSUENfU05EX01FVEhPRF9WT0lDRSA9IDAsCi0JUlBDX1NORF9NRVRIT0RfS0VZX0JFRVAsCi0JUlBDX1NORF9NRVRIT0RfTUVTU0FHRSwKLQlSUENfU05EX01FVEhPRF9SSU5HLAotCVJQQ19TTkRfTUVUSE9EX01JREksCi0JUlBDX1NORF9NRVRIT0RfQVVYLAotCVJQQ19TTkRfTUVUSE9EX01BWCwKLX07Ci0KLWVudW0gcnBjX3ZvY19jb2RlY190eXBlIHsKLQlSUENfVk9DX0NPREVDX0RFRkFVTFQsCi0JUlBDX1ZPQ19DT0RFQ19PTl9DSElQXzAgPSBSUENfVk9DX0NPREVDX0RFRkFVTFQsCi0JUlBDX1ZPQ19DT0RFQ19PTl9DSElQXzEsCi0JUlBDX1ZPQ19DT0RFQ19TVEVSRU9fSEVBRFNFVCwKLQlSUENfVk9DX0NPREVDX09OX0NISVBfQVVYLAotCVJQQ19WT0NfQ09ERUNfQlRfT0ZGX0JPQVJELAotCVJQQ19WT0NfQ09ERUNfQlRfQTJEUCwKLQlSUENfVk9DX0NPREVDX09GRl9CT0FSRCwKLQlSUENfVk9DX0NPREVDX1NEQUMsCi0JUlBDX1ZPQ19DT0RFQ19SWF9FWFRfU0RBQ19UWF9JTlRFUk5BTCwKLQlSUENfVk9DX0NPREVDX0lOX1NURVJFT19TQURDX09VVF9NT05PX0hBTkRTRVQsCi0JUlBDX1ZPQ19DT0RFQ19JTl9TVEVSRU9fU0FEQ19PVVRfU1RFUkVPX0hFQURTRVQsCi0JUlBDX1ZPQ19DT0RFQ19UWF9JTlRfU0FEQ19SWF9FWFRfQVVYUENNLAotCVJQQ19WT0NfQ09ERUNfRVhUX1NURVJFT19TQURDX09VVF9NT05PX0hBTkRTRVQsCi0JUlBDX1ZPQ19DT0RFQ19FWFRfU1RFUkVPX1NBRENfT1VUX1NURVJFT19IRUFEU0VULAotCVJQQ19WT0NfQ09ERUNfVFRZX09OX0NISVBfMSwKLQlSUENfVk9DX0NPREVDX1RUWV9PRkZfQk9BUkQsCi0JUlBDX1ZPQ19DT0RFQ19UVFlfVkNPLAotCVJQQ19WT0NfQ09ERUNfVFRZX0hDTywKLQlSUENfVk9DX0NPREVDX09OX0NISVBfMF9EVUFMX01JQywKLQlSUENfVk9DX0NPREVDX01BWCwKLQlSUENfVk9DX0NPREVDX05PTkUsCi19OwotCi1lbnVtIHJwY19hdWRtZ3Jfc3RhdHVzX3R5cGUgewotCVJQQ19BVURNR1JfU1RBVFVTX1JFQURZLAotCVJQQ19BVURNR1JfU1RBVFVTX0NPREVDX0NPTkZJRywKLQlSUENfQVVETUdSX1NUQVRVU19QRU5ESU5HLAotCVJQQ19BVURNR1JfU1RBVFVTX1NVU1BFTkQsCi0JUlBDX0FVRE1HUl9TVEFUVVNfRkFJTFVSRSwKLQlSUENfQVVETUdSX1NUQVRVU19WT0xVTUVfQ0hBTkdFLAotCVJQQ19BVURNR1JfU1RBVFVTX0RJU0FCTEVELAotCVJQQ19BVURNR1JfU1RBVFVTX0VSUk9SLAotCVJQQ19BVURNR1JfU1RBVFVTX0RFVklDRV9DT05GSUcsCi0JUlBDX0FVRE1HUl9TVEFUVVNfREVWSUNFX0lORk8KLQotfTsKLQotc3RydWN0IHJwY19hdWRtZ3JfZW5hYmxlX2NsaWVudF9hcmdzIHsKLQl1aW50MzJfdCBzZXRfdG9fb25lOwotCXVpbnQzMl90IHR4X3NhbXBsZV9yYXRlOwotCXVpbnQzMl90IHJ4X3NhbXBsZV9yYXRlOwotCXVpbnQzMl90IGRlZl9tZXRob2Q7Ci0JdWludDMyX3QgY29kZWNfdHlwZTsKLQl1aW50MzJfdCBzbmRfbWV0aG9kOwotCi0JdWludDMyX3QgY2JfZnVuYzsKLQl1aW50MzJfdCBjbGllbnRfZGF0YTsKLX07Ci0JCi0jZGVmaW5lIEFVRE1HUl9FTkFCTEVfQ0xJRU5UCQkJMgotI2RlZmluZSBBVURNR1JfRElTQUJMRV9DTElFTlQJCQkzCi0jZGVmaW5lIEFVRE1HUl9TVVNQRU5EX0VWRU5UX1JTUAkJNAotI2RlZmluZSBBVURNR1JfUkVHSVNURVJfT1BFUkFUSU9OX0xJU1RFTkVSCTUKLSNkZWZpbmUgQVVETUdSX1VOUkVHSVNURVJfT1BFUkFUSU9OX0xJU1RFTkVSCTYKLSNkZWZpbmUgQVVETUdSX1JFR0lTVEVSX0NPREVDX0xJU1RFTkVSCQk3Ci0jZGVmaW5lIEFVRE1HUl9HRVRfUlhfU0FNUExFX1JBVEUJCTgKLSNkZWZpbmUgQVVETUdSX0dFVF9UWF9TQU1QTEVfUkFURQkJOQotI2RlZmluZSBBVURNR1JfU0VUX0RFVklDRV9NT0RFCQkJMTAKLSNkZWZpbmUgTUlOX1JQQ19EQVRBX0xFTkdUSCAxNgotCi0jZGVmaW5lIEFVRE1HUl9QUk9HX1ZFUlMgInJzMzAwMDAwMTM6MHg3ZmVjY2JmZiIKLSNkZWZpbmUgQVVETUdSX1BST0cgMHgzMDAwMDAxMwotI2RlZmluZSBBVURNR1JfVkVSUyAweDdmZWNjYmZmCi0jZGVmaW5lIEFVRE1HUl9WRVJTX0NPTVAgMHgwMDAxMDAwMQotI2RlZmluZSBBVURNR1JfVkVSU19DT01QX1ZFUjIgMHgwMDAyMDAwMQotI2RlZmluZSBBVURNR1JfVkVSU19DT01QX1ZFUjMgMHgwMDAzMDAwMQotI2RlZmluZSBBVURNR1JfVkVSU19DT01QX1ZFUjQgMHgwMDA0MDAwMQotCi1zdHJ1Y3QgY2FkX2RldmljZV9pbmZvX3R5cGUgewotCXVpbnQzMl90IHJ4X2RldmljZTsKLQl1aW50MzJfdCB0eF9kZXZpY2U7Ci0JdWludDMyX3QgZWFyX211dGU7Ci0JdWludDMyX3QgbWljX211dGU7Ci0JdWludDMyX3Qgdm9sdW1lOwotfTsKLQotc3RydWN0IHJwY19hdWRtZ3JfY2JfY29tbW9uIHsKLQl1aW50MzJfdCBjYl9pZDsgLyogY2JfZnVuYyAqLwotCXVpbnQzMl90IHN0YXR1czsgLyogQXVkbWdyIHN0YXR1cyAqLwotCXVpbnQzMl90IHNldF90b19vbmU7ICAvKiBQb2ludGVyIHN0YXR1cyAoMSA9IHZhbGlkLCAwICA9IGludmFsaWQpICovCi0JdWludDMyX3QgZGlzYzsKLQkvKiBkaXNjID0gQVVETUdSX1NUQVRVU19SRUFEWSA9PiBkYXRhPWhhbmRsZQotCSAgIGRpc2MgPSBBVURNR1JfU1RBVFVTX0NPREVDX0NPTkZJRyA9PiBkYXRhID0gdm9sdW1lCi0JICAgZGlzYyA9IEFVRE1HUl9TVEFUVVNfRElTQUJMRUQgPT4gZGF0YSA9c3RhdHVzX2Rpc2FibGVkCi0JICAgZGlzYyA9IEFVRE1HUl9TVEFUVVNfVk9MVU1FX0NIQU5HRSA9PiBkYXRhID0gdm9sdW1lX2NoYW5nZSAqLwotfTsKLQotc3RydWN0IHJwY19hdWRtZ3JfY2JfcmVhZHkgewotCXN0cnVjdCBycGNfYXVkbWdyX2NiX2NvbW1vbiBjX2RhdGE7Ci0JdW5pb24gewotCQl1aW50MzJfdCBoYW5kbGU7Ci0JCXVpbnQzMl90IHZvbHVtZTsKLQkJdWludDMyX3Qgc3RhdHVzX2Rpc2FibGVkOwotCQl1aW50MzJfdCB2b2x1bWVfY2hhbmdlOwotCX0gdTsKLQl1aW50MzJfdCBjbGllbnRfZGF0YTsKLX07Ci0KLXN0cnVjdCBycGNfYXVkbWdyX2NiX2RldmljZV9pbmZvIHsKLQlzdHJ1Y3QgcnBjX2F1ZG1ncl9jYl9jb21tb24gY19kYXRhOwotCXN0cnVjdCBjYWRfZGV2aWNlX2luZm9fdHlwZSBkOwotCXVpbnQzMl90IGNsaWVudF9kYXRhOwotfTsKLQotI2RlZmluZSBBVURNR1JfQ0JfRlVOQ19QVFIJCQkxCi0jZGVmaW5lIEFVRE1HUl9PUFJfTFNUTlJfQ0JfRlVOQ19QVFIJCTIKLSNkZWZpbmUgQVVETUdSX0NPREVDX0xTVFJfRlVOQ19QVFIJCTMKLQotc3RydWN0IGRldl9ldnRfbXNnIHsKLQlzdHJ1Y3QgY2FkX2RldmljZV9pbmZvX3R5cGUgZGV2X3R5cGU7Ci0JdWludDMyX3QgYWNkYl9pZDsKLQlpbnQgc2Vzc2lvbl9pbmZvOwotCXVpbnQzMl90IHNhbXBsZV9yYXRlOwotfTsKLQotdHlwZWRlZiB2b2lkICgqZGV2aWNlX2luZm9fZnVuYykoc3RydWN0IGRldl9ldnRfbXNnICpldnRfbXNnLCB2b2lkICpwcml2YXRlKTsKLQotc3RydWN0IGRldmljZV9pbmZvX2NhbGxiYWNrIHsKLQlkZXZpY2VfaW5mb19mdW5jIGZ1bmM7Ci0Jdm9pZCAqcHJpdmF0ZTsKLX07Ci0KLXN0cnVjdCBhdWRtZ3IgewotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0JdWludDMyX3QgaGFuZGxlOwotCWludCBzdGF0ZTsKLQlzdHJ1Y3QgZGV2X2V2dF9tc2cgZXZ0OwotfTsKLQotc3RydWN0IGF1ZG1ncl9jb25maWcgewotCXVpbnQzMl90IHR4X3JhdGU7Ci0JdWludDMyX3QgcnhfcmF0ZTsKLQl1aW50MzJfdCBkZWZfbWV0aG9kOwotCXVpbnQzMl90IGNvZGVjOwotCXVpbnQzMl90IHNuZF9tZXRob2Q7Ci19OwotCi1pbnQgYXVkbWdyX3JlZ2lzdGVyX2RldmljZV9pbmZvX2NhbGxiYWNrKHN0cnVjdCBkZXZpY2VfaW5mb19jYWxsYmFjayAqZGNiKTsKLWludCBhdWRtZ3JfZGVyZWdpc3Rlcl9kZXZpY2VfaW5mb19jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlX2luZm9fY2FsbGJhY2sgKmRjYik7Ci0KLWludCBhdWRtZ3Jfb3BlbihzdHJ1Y3QgYXVkbWdyICphbSk7Ci1pbnQgYXVkbWdyX2Nsb3NlKHN0cnVjdCBhdWRtZ3IgKmFtKTsKLWludCBhdWRtZ3JfZW5hYmxlKHN0cnVjdCBhdWRtZ3IgKmFtLCBzdHJ1Y3QgYXVkbWdyX2NvbmZpZyAqY2ZnKTsKLWludCBhdWRtZ3JfZGlzYWJsZShzdHJ1Y3QgYXVkbWdyICphbSk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZG1ncl9uZXcuaCBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZG1ncl9uZXcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc3NWE5My4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRtZ3JfbmV3LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkbWdyLmgKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCwyMDEyIChjKSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9BUkNIX0FSTV9NQUNIX01TTV9BVURNR1JfTkVXX0gKLSNkZWZpbmUgX0FSQ0hfQVJNX01BQ0hfTVNNX0FVRE1HUl9ORVdfSAotCi1lbnVtIHJwY19hdWRfZGVmX3NhbXBsZV9yYXRlX3R5cGUgewotCVJQQ19BVURfREVGX1NBTVBMRV9SQVRFX05PTkUsCi0JUlBDX0FVRF9ERUZfU0FNUExFX1JBVEVfODAwMCwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xMTAyNSwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xMjAwMCwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8xNjAwMCwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8yMjA1MCwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8yNDAwMCwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV8zMjAwMCwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV80NDEwMCwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV80ODAwMCwKLQlSUENfQVVEX0RFRl9TQU1QTEVfUkFURV9NQVgsCi19OwotCi1lbnVtIHJwY19hdWRfZGVmX21ldGhvZF90eXBlIHsKLQlSUENfQVVEX0RFRl9NRVRIT0RfTk9ORSwKLQlSUENfQVVEX0RFRl9NRVRIT0RfS0VZX0JFRVAsCi0JUlBDX0FVRF9ERUZfTUVUSE9EX1BMQVlCQUNLLAotCVJQQ19BVURfREVGX01FVEhPRF9WT0lDRSwKLQlSUENfQVVEX0RFRl9NRVRIT0RfUkVDT1JELAotCVJQQ19BVURfREVGX01FVEhPRF9IT1NUX1BDTSwKLQlSUENfQVVEX0RFRl9NRVRIT0RfTUlESV9PVVQsCi0JUlBDX0FVRF9ERUZfTUVUSE9EX1JFQ09SRF9TQkMsCi0JUlBDX0FVRF9ERUZfTUVUSE9EX0RUTUZfUklOR0VSLAotCVJQQ19BVURfREVGX01FVEhPRF9NQVgsCi19OwotCi1lbnVtIHJwY19hdWRfZGVmX2NvZGVjX3R5cGUgewotCVJQQ19BVURfREVGX0NPREVDX05PTkUsCi0JUlBDX0FVRF9ERUZfQ09ERUNfRFRNRiwKLQlSUENfQVVEX0RFRl9DT0RFQ19NSURJLAotCVJQQ19BVURfREVGX0NPREVDX01QMywKLQlSUENfQVVEX0RFRl9DT0RFQ19QQ00sCi0JUlBDX0FVRF9ERUZfQ09ERUNfQUFDLAotCVJQQ19BVURfREVGX0NPREVDX1dNQSwKLQlSUENfQVVEX0RFRl9DT0RFQ19SQSwKLQlSUENfQVVEX0RFRl9DT0RFQ19BRFBDTSwKLQlSUENfQVVEX0RFRl9DT0RFQ19HQVVESU8sCi0JUlBDX0FVRF9ERUZfQ09ERUNfVk9DX0VWUkMsCi0JUlBDX0FVRF9ERUZfQ09ERUNfVk9DXzEzSywKLQlSUENfQVVEX0RFRl9DT0RFQ19WT0NfNEdWX05CLAotCVJQQ19BVURfREVGX0NPREVDX1ZPQ19BTVIsCi0JUlBDX0FVRF9ERUZfQ09ERUNfVk9DX0VGUiwKLQlSUENfQVVEX0RFRl9DT0RFQ19WT0NfRlIsCi0JUlBDX0FVRF9ERUZfQ09ERUNfVk9DX0hSLAotCVJQQ19BVURfREVGX0NPREVDX1ZPQ19DRE1BLAotCVJQQ19BVURfREVGX0NPREVDX1ZPQ19DRE1BX1dCLAotCVJQQ19BVURfREVGX0NPREVDX1ZPQ19VTVRTLAotCVJQQ19BVURfREVGX0NPREVDX1ZPQ19VTVRTX1dCLAotCVJQQ19BVURfREVGX0NPREVDX1NCQywKLQlSUENfQVVEX0RFRl9DT0RFQ19WT0NfUENNLAotCVJQQ19BVURfREVGX0NPREVDX0FNUl9XQiwKLQlSUENfQVVEX0RFRl9DT0RFQ19BTVJfV0JfUExVUywKLQlSUENfQVVEX0RFRl9DT0RFQ19BQUNfQlNBQywKLQlSUENfQVVEX0RFRl9DT0RFQ19NQVgsCi0JUlBDX0FVRF9ERUZfQ09ERUNfQU1SX05CLAotCVJQQ19BVURfREVGX0NPREVDXzEzSywKLQlSUENfQVVEX0RFRl9DT0RFQ19FVlJDLAotCVJQQ19BVURfREVGX0NPREVDX0FDMywKLQlSUENfQVVEX0RFRl9DT0RFQ19NQVhfMDAyLAotfTsKLQotZW51bSBycGNfc25kX21ldGhvZF90eXBlIHsKLQlSUENfU05EX01FVEhPRF9WT0lDRSA9IDAsCi0JUlBDX1NORF9NRVRIT0RfS0VZX0JFRVAsCi0JUlBDX1NORF9NRVRIT0RfTUVTU0FHRSwKLQlSUENfU05EX01FVEhPRF9SSU5HLAotCVJQQ19TTkRfTUVUSE9EX01JREksCi0JUlBDX1NORF9NRVRIT0RfQVVYLAotCVJQQ19TTkRfTUVUSE9EX01BWCwKLX07Ci0KLWVudW0gcnBjX3ZvY19jb2RlY190eXBlIHsKLQlSUENfVk9DX0NPREVDX0RFRkFVTFQsCi0JUlBDX1ZPQ19DT0RFQ19PTl9DSElQXzAgPSBSUENfVk9DX0NPREVDX0RFRkFVTFQsCi0JUlBDX1ZPQ19DT0RFQ19PTl9DSElQXzEsCi0JUlBDX1ZPQ19DT0RFQ19TVEVSRU9fSEVBRFNFVCwKLQlSUENfVk9DX0NPREVDX09OX0NISVBfQVVYLAotCVJQQ19WT0NfQ09ERUNfQlRfT0ZGX0JPQVJELAotCVJQQ19WT0NfQ09ERUNfQlRfQTJEUCwKLQlSUENfVk9DX0NPREVDX09GRl9CT0FSRCwKLQlSUENfVk9DX0NPREVDX1NEQUMsCi0JUlBDX1ZPQ19DT0RFQ19SWF9FWFRfU0RBQ19UWF9JTlRFUk5BTCwKLQlSUENfVk9DX0NPREVDX0lOX1NURVJFT19TQURDX09VVF9NT05PX0hBTkRTRVQsCi0JUlBDX1ZPQ19DT0RFQ19JTl9TVEVSRU9fU0FEQ19PVVRfU1RFUkVPX0hFQURTRVQsCi0JUlBDX1ZPQ19DT0RFQ19UWF9JTlRfU0FEQ19SWF9FWFRfQVVYUENNLAotCVJQQ19WT0NfQ09ERUNfRVhUX1NURVJFT19TQURDX09VVF9NT05PX0hBTkRTRVQsCi0JUlBDX1ZPQ19DT0RFQ19FWFRfU1RFUkVPX1NBRENfT1VUX1NURVJFT19IRUFEU0VULAotCVJQQ19WT0NfQ09ERUNfVFRZX09OX0NISVBfMSwKLQlSUENfVk9DX0NPREVDX1RUWV9PRkZfQk9BUkQsCi0JUlBDX1ZPQ19DT0RFQ19UVFlfVkNPLAotCVJQQ19WT0NfQ09ERUNfVFRZX0hDTywKLQlSUENfVk9DX0NPREVDX09OX0NISVBfMF9EVUFMX01JQywKLQlSUENfVk9DX0NPREVDX01BWCwKLQlSUENfVk9DX0NPREVDX05PTkUsCi19OwotCi1lbnVtIHJwY19hdWRtZ3Jfc3RhdHVzX3R5cGUgewotCVJQQ19BVURNR1JfU1RBVFVTX1JFQURZLAotCVJQQ19BVURNR1JfU1RBVFVTX0NPREVDX0NPTkZJRywKLQlSUENfQVVETUdSX1NUQVRVU19QRU5ESU5HLAotCVJQQ19BVURNR1JfU1RBVFVTX1NVU1BFTkQsCi0JUlBDX0FVRE1HUl9TVEFUVVNfRkFJTFVSRSwKLQlSUENfQVVETUdSX1NUQVRVU19WT0xVTUVfQ0hBTkdFLAotCVJQQ19BVURNR1JfU1RBVFVTX0RJU0FCTEVELAotCVJQQ19BVURNR1JfU1RBVFVTX0VSUk9SLAotfTsKLQotc3RydWN0IHJwY19hdWRtZ3JfZW5hYmxlX2NsaWVudF9hcmdzIHsKLQl1aW50MzJfdCBzZXRfdG9fb25lOwotCXVpbnQzMl90IHR4X3NhbXBsZV9yYXRlOwotCXVpbnQzMl90IHJ4X3NhbXBsZV9yYXRlOwotCXVpbnQzMl90IGRlZl9tZXRob2Q7Ci0JdWludDMyX3QgY29kZWNfdHlwZTsKLQl1aW50MzJfdCBzbmRfbWV0aG9kOwotCi0JdWludDMyX3QgY2JfZnVuYzsKLQl1aW50MzJfdCBjbGllbnRfZGF0YTsKLX07Ci0JCi0jZGVmaW5lIEFVRE1HUl9FTkFCTEVfQ0xJRU5UCQkJMgotI2RlZmluZSBBVURNR1JfRElTQUJMRV9DTElFTlQJCQkzCi0jZGVmaW5lIEFVRE1HUl9TVVNQRU5EX0VWRU5UX1JTUAkJNAotI2RlZmluZSBBVURNR1JfUkVHSVNURVJfT1BFUkFUSU9OX0xJU1RFTkVSCTUKLSNkZWZpbmUgQVVETUdSX1VOUkVHSVNURVJfT1BFUkFUSU9OX0xJU1RFTkVSCTYKLSNkZWZpbmUgQVVETUdSX1JFR0lTVEVSX0NPREVDX0xJU1RFTkVSCQk3Ci0jZGVmaW5lIEFVRE1HUl9HRVRfUlhfU0FNUExFX1JBVEUJCTgKLSNkZWZpbmUgQVVETUdSX0dFVF9UWF9TQU1QTEVfUkFURQkJOQotI2RlZmluZSBBVURNR1JfU0VUX0RFVklDRV9NT0RFCQkJMTAKLQotI2RlZmluZSBBVURNR1JfUFJPRyAweDMwMDAwMDEzCi0jZGVmaW5lIEFVRE1HUl9WRVJTIE1TTV9SUENfVkVSUygxLDApCi0KLXN0cnVjdCBycGNfYXVkbWdyX2NiX2Z1bmNfcHRyIHsKLQl1aW50MzJfdCBjYl9pZDsKLQl1aW50MzJfdCBzdGF0dXM7IC8qIEF1ZG1nciBzdGF0dXMgKi8KLQl1aW50MzJfdCBzZXRfdG9fb25lOyAgLyogUG9pbnRlciBzdGF0dXMgKDEgPSB2YWxpZCwgMCAgPSBpbnZhbGlkKSAqLwotCXVpbnQzMl90IGRpc2M7Ci0JLyogZGlzYyA9IEFVRE1HUl9TVEFUVVNfUkVBRFkgPT4gZGF0YT1oYW5kbGUKLQkgICBkaXNjID0gQVVETUdSX1NUQVRVU19DT0RFQ19DT05GSUcgPT4gZGF0YSA9IGhhbmRsZQotCSAgIGRpc2MgPSBBVURNR1JfU1RBVFVTX0RJU0FCTEVEID0+IGRhdGEgPXN0YXR1c19kaXNhYmxlZAotCSAgIGRpc2MgPSBBVURNR1JfU1RBVFVTX1ZPTFVNRV9DSEFOR0UgPT4gZGF0YSA9IHZvbHVtZS1jaGFuZ2UgKi8KLQl1bmlvbiB7Ci0JCXVpbnQzMl90IGhhbmRsZTsKLQkJdWludDMyX3Qgdm9sdW1lOwotCQl1aW50MzJfdCBzdGF0dXNfZGlzYWJsZWQ7Ci0JCXVpbnQzMl90IHZvbHVtZV9jaGFuZ2U7Ci0JfSB1OwotfTsKLQotI2RlZmluZSBBVURNR1JfQ0JfRlVOQ19QVFIJCQkxCi0jZGVmaW5lIEFVRE1HUl9PUFJfTFNUTlJfQ0JfRlVOQ19QVFIJCTIKLSNkZWZpbmUgQVVETUdSX0NPREVDX0xTVFJfRlVOQ19QVFIJCTMKLQotI2RlZmluZSBBVURNR1JfQ0JfUFJPRyAweDMxMDAwMDEzCi0jZGVmaW5lIEFVRE1HUl9DQl9WRVJTIDB4ZjhlM2UyZDkKLQotc3RydWN0IGF1ZG1nciB7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQl1aW50MzJfdCBoYW5kbGU7Ci0Jc3RydWN0IG1zbV9ycGNfZW5kcG9pbnQgKmVwdDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7Ci0JaW50IHN0YXRlOwotfTsKLQotc3RydWN0IGF1ZG1ncl9jb25maWcgewotCXVpbnQzMl90IHR4X3JhdGU7Ci0JdWludDMyX3QgcnhfcmF0ZTsKLQl1aW50MzJfdCBkZWZfbWV0aG9kOwotCXVpbnQzMl90IGNvZGVjOwotCXVpbnQzMl90IHNuZF9tZXRob2Q7Ci19OwotCi1pbnQgYXVkbWdyX29wZW4oc3RydWN0IGF1ZG1nciAqYW0pOwotaW50IGF1ZG1ncl9jbG9zZShzdHJ1Y3QgYXVkbWdyICphbSk7Ci1pbnQgYXVkbWdyX2VuYWJsZShzdHJ1Y3QgYXVkbWdyICphbSwgc3RydWN0IGF1ZG1ncl9jb25maWcgKmNmZyk7Ci1pbnQgYXVkbWdyX2Rpc2FibGUoc3RydWN0IGF1ZG1nciAqYW0pOwotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRwcC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkcHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjMDBhNC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRwcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzOCArMCwwIEBACi0KLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZHBwLmMKLSAqCi0gKiBjb21tb24gY29kZSB0byBkZWFsIHdpdGggdGhlIEFVRFBQIGRzcCB0YXNrIChhdWRpbyBwb3N0cHJvYykKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgMjAxMi0yMDEzIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9hZHNwLmg+Ci0KLSNpbmNsdWRlICJhdWRtZ3IuaCIKLQotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcGNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHBtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHAuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fYWNkYmkuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLSNpbmNsdWRlICJldmxvZy5oIgotCi1lbnVtIHsKLQlFVl9OVUxMLAotCUVWX0VOQUJMRSwKLQlFVl9ESVNBQkxFLAotCUVWX0VWRU5ULAotCUVWX0RBVEEsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqZHNwX2xvZ19zdHJpbmdzW10gPSB7Ci0JIk5VTEwiLAotCSJFTkFCTEUiLAotCSJESVNBQkxFIiwKLQkiRVZFTlQiLAotCSJEQVRBIiwKLX07Ci0KLURFQ0xBUkVfTE9HKGRzcF9sb2csIDY0LCBkc3BfbG9nX3N0cmluZ3MpOwotCi1zdGF0aWMgaW50IF9faW5pdCBfZHNwX2xvZ19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGV2X2xvZ19pbml0KCZkc3BfbG9nKTsKLX0KLQotbW9kdWxlX2luaXQoX2RzcF9sb2dfaW5pdCk7Ci0jZGVmaW5lIExPRyhpZCxhcmcpIGV2X2xvZ193cml0ZSgmZHNwX2xvZywgaWQsIGFyZykKLQotc3RhdGljIERFRklORV9NVVRFWChhdWRwcF9sb2NrKTsKLXN0YXRpYyBERUZJTkVfTVVURVgoYXVkcHBfZGVjX2xvY2spOwotCi0jZGVmaW5lIENIX0NPVU5UIDUKLSNkZWZpbmUgQVVEUFBfQ0xOVF9NQVhfQ09VTlQgNgotI2RlZmluZSBBVURQUF9BVlNZTkNfSU5GT19TSVpFIDcKLQotI2RlZmluZSBBVURQUF9TUlNfUEFSQU1TIDIKLSNkZWZpbmUgQVVEUFBfU1JTX1BBUkFNU19HIDAKLSNkZWZpbmUgQVVEUFBfU1JTX1BBUkFNU19XIDEKLSNkZWZpbmUgQVVEUFBfU1JTX1BBUkFNU19DIDIKLSNkZWZpbmUgQVVEUFBfU1JTX1BBUkFNU19IIDMKLSNkZWZpbmUgQVVEUFBfU1JTX1BBUkFNU19QIDQKLSNkZWZpbmUgQVVEUFBfU1JTX1BBUkFNU19MIDUKLQotI2RlZmluZSBBVURQUF9DTURfQ0ZHX09CSl9VUERBVEUgMHg4MDAwCi0jZGVmaW5lIEFVRFBQX0NNRF9FUV9GTEFHX0RJUwkweDAwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX0VRX0ZMQUdfRU5BCS0xCi0jZGVmaW5lIEFVRFBQX0NNRF9JSVJfRkxBR19ESVMJICAweDAwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX0lJUl9GTEFHX0VOQQkgIC0xCi0KLSNkZWZpbmUgTUFYX0VWRU5UX0NBTExCQUNLX0NMSUVOVFMJMgotCi0jZGVmaW5lIEFVRFBQX0NPTkNVUlJFTkNZX0RFRkFVTFQgNgkvKiBBbGwgbm9uIHR1bm5lbCBtb2RlICovCi0jZGVmaW5lIEFVRFBQX01BWF9ERUNPREVSX0NOVCA1Ci0jZGVmaW5lIEFVRFBQX0NPREVDX01BU0sgMHgwMDAwMDBGRgotI2RlZmluZSBBVURQUF9NT0RFX01BU0sgMHgwMDAwMEYwMAotI2RlZmluZSBBVURQUF9PUF9NQVNLIDB4RjAwMDAwMDAKLQotc3RydWN0IGF1ZHBwX2RlY29kZXJfaW5mbyB7Ci0JdW5zaWduZWQgaW50IGNvZGVjOwotCXBpZF90IHBpZDsKLX07Ci0KLXN0cnVjdCBhdWRwcF9zdGF0ZSB7Ci0Jc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kOwotCWF1ZHBwX2V2ZW50X2Z1bmMgZnVuY1tBVURQUF9DTE5UX01BWF9DT1VOVF07Ci0Jdm9pZCAqcHJpdmF0ZVtBVURQUF9DTE5UX01BWF9DT1VOVF07Ci0Jc3RydWN0IG11dGV4ICpsb2NrOwotCXVuc2lnbmVkIG9wZW5fY291bnQ7Ci0JdW5zaWduZWQgZW5hYmxlZDsKLQotCS8qIFJlbGF0ZWQgdG8gZGVjb2RlciBhbGxvY2F0aW9uICovCi0Jc3RydWN0IG11dGV4ICpsb2NrX2RlYzsKLQlzdHJ1Y3QgbXNtX2Fkc3BkZWNfZGF0YWJhc2UgKmRlY19kYXRhYmFzZTsKLQlzdHJ1Y3QgYXVkcHBfZGVjb2Rlcl9pbmZvIGRlY19pbmZvX3RhYmxlW0FVRFBQX01BWF9ERUNPREVSX0NOVF07Ci0JdW5zaWduZWQgZGVjX2ludXNlOwotCXVuc2lnbmVkIGxvbmcgY29uY3VycmVuY3k7Ci0KLQkvKiB3aGljaCBjaGFubmVscyBhcmUgYWN0dWFsbHkgZW5hYmxlZCAqLwotCXVuc2lnbmVkIGF2c3luY19tYXNrOwotCi0JLyogZmxhZ3MsIDQ4IGJpdHMgc2FtcGxlL2J5dGVzIGNvdW50ZXIgcGVyIGNoYW5uZWwgKi8KLQl1aW50MTZfdCBhdnN5bmNbQ0hfQ09VTlQgKiBBVURQUF9DTE5UX01BWF9DT1VOVCArIDFdOwotCXN0cnVjdCBhdWRwcF9ldmVudF9jYWxsYmFjayAqY2JfdGJsW01BWF9FVkVOVF9DQUxMQkFDS19DTElFTlRTXTsKLQotCXNwaW5sb2NrX3QgYXZzeW5jX2xvY2s7Ci0KLQl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF93YWl0OwotfTsKLQotc3RydWN0IGF1ZHBwX3N0YXRlIHRoZV9hdWRwcF9zdGF0ZSA9IHsKLQkubG9jayA9ICZhdWRwcF9sb2NrLAotCS5sb2NrX2RlYyA9ICZhdWRwcF9kZWNfbG9jaywKLX07Ci0KLWludCBhdWRwcF9zZW5kX3F1ZXVlMSh2b2lkICpjbWQsIHVuc2lnbmVkIGxlbikKLXsKLQlyZXR1cm4gbXNtX2Fkc3Bfd3JpdGUodGhlX2F1ZHBwX3N0YXRlLm1vZCwKLQkJCSAgICAgIFFEU1BfdVBBdWRQUENtZDFRdWV1ZSwgY21kLCBsZW4pOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9zZW5kX3F1ZXVlMSk7Ci0KLWludCBhdWRwcF9zZW5kX3F1ZXVlMih2b2lkICpjbWQsIHVuc2lnbmVkIGxlbikKLXsKLQlyZXR1cm4gbXNtX2Fkc3Bfd3JpdGUodGhlX2F1ZHBwX3N0YXRlLm1vZCwKLQkJCSAgICAgIFFEU1BfdVBBdWRQUENtZDJRdWV1ZSwgY21kLCBsZW4pOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9zZW5kX3F1ZXVlMik7Ci0KLWludCBhdWRwcF9zZW5kX3F1ZXVlMyh2b2lkICpjbWQsIHVuc2lnbmVkIGxlbikKLXsKLQlyZXR1cm4gbXNtX2Fkc3Bfd3JpdGUodGhlX2F1ZHBwX3N0YXRlLm1vZCwKLQkJCSAgICAgIFFEU1BfdVBBdWRQUENtZDNRdWV1ZSwgY21kLCBsZW4pOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9zZW5kX3F1ZXVlMyk7Ci0KLXN0YXRpYyBpbnQgYXVkcHBfZHNwX2NvbmZpZyhpbnQgZW5hYmxlKQotewotCWF1ZHBwX2NtZF9jZmcgY21kOwotCi0JY21kLmNtZF9pZCA9IEFVRFBQX0NNRF9DRkc7Ci0JY21kLmNmZyA9IGVuYWJsZSA/IEFVRFBQX0NNRF9DRkdfRU5BQkxFIDogQVVEUFBfQ01EX0NGR19TTEVFUDsKLQotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMSgmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLWludCBpc19hdWRwcF9lbmFibGUodm9pZCkKLXsKLQlzdHJ1Y3QgYXVkcHBfc3RhdGUgKmF1ZHBwID0gJnRoZV9hdWRwcF9zdGF0ZTsKLQotCXJldHVybiBhdWRwcC0+ZW5hYmxlZDsKLX0KLUVYUE9SVF9TWU1CT0woaXNfYXVkcHBfZW5hYmxlKTsKLQotaW50IGF1ZHBwX3JlZ2lzdGVyX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBhdWRwcF9ldmVudF9jYWxsYmFjayAqZWNiKQotewotCXN0cnVjdCBhdWRwcF9zdGF0ZSAqYXVkcHAgPSAmdGhlX2F1ZHBwX3N0YXRlOwotCWludCBpOwotCi0JbXV0ZXhfbG9jayhhdWRwcC0+bG9jayk7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9FVkVOVF9DQUxMQkFDS19DTElFTlRTOyArK2kpIHsKLQkJaWYgKE5VTEwgPT0gYXVkcHAtPmNiX3RibFtpXSkgewotCQkJYXVkcHAtPmNiX3RibFtpXSA9IGVjYjsKLQkJCW11dGV4X3VubG9jayhhdWRwcC0+bG9jayk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQltdXRleF91bmxvY2soYXVkcHAtPmxvY2spOwotCXJldHVybiAtMTsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcHBfcmVnaXN0ZXJfZXZlbnRfY2FsbGJhY2spOwotCi1pbnQgYXVkcHBfdW5yZWdpc3Rlcl9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYXVkcHBfZXZlbnRfY2FsbGJhY2sgKmVjYikKLXsKLQlzdHJ1Y3QgYXVkcHBfc3RhdGUgKmF1ZHBwID0gJnRoZV9hdWRwcF9zdGF0ZTsKLQlpbnQgaTsKLQotCW11dGV4X2xvY2soYXVkcHAtPmxvY2spOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfRVZFTlRfQ0FMTEJBQ0tfQ0xJRU5UUzsgKytpKSB7Ci0JCWlmIChlY2IgPT0gYXVkcHAtPmNiX3RibFtpXSkgewotCQkJYXVkcHAtPmNiX3RibFtpXSA9IE5VTEw7Ci0JCQltdXRleF91bmxvY2soYXVkcHAtPmxvY2spOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKGF1ZHBwLT5sb2NrKTsKLQlyZXR1cm4gLTE7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHBwX3VucmVnaXN0ZXJfZXZlbnRfY2FsbGJhY2spOwotCi1zdGF0aWMgdm9pZCBhdWRwcF9icm9hZGNhc3Qoc3RydWN0IGF1ZHBwX3N0YXRlICphdWRwcCwgdW5zaWduZWQgaWQsCi0JCQkgICAgdWludDE2X3QgKm1zZykKLXsKLQl1bnNpZ25lZCBuOwotCi0JaWYgKChpZCAhPSBBVURQUF9NU0dfUFBfRElTQUJMRV9GRUVEQkFDSykgJiYKLQkJKGlkICE9IEFVRFBQX01TR19QUF9GRUFUU19SRV9FTkFCTEUpKSB7Ci0JCWZvciAobiA9IDA7IG4gPCBBVURQUF9DTE5UX01BWF9DT1VOVDsgbisrKSB7Ci0JCQlpZiAoYXVkcHAtPmZ1bmNbbl0pCi0JCQkJYXVkcHAtPmZ1bmNbbl0gKGF1ZHBwLT5wcml2YXRlW25dLCBpZCwgbXNnKTsKLQkJfQotCX0KLQotCWZvciAobiA9IDA7IG4gPCBNQVhfRVZFTlRfQ0FMTEJBQ0tfQ0xJRU5UUzsgKytuKQotCQlpZiAoYXVkcHAtPmNiX3RibFtuXSAmJiBhdWRwcC0+Y2JfdGJsW25dLT5mbikKLQkJCWF1ZHBwLT5jYl90Ymxbbl0tPmZuKGF1ZHBwLT5jYl90Ymxbbl0tPnByaXZhdGUsIGlkLAotCQkJCQkgICAgIG1zZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX25vdGlmeV9jbG50KHN0cnVjdCBhdWRwcF9zdGF0ZSAqYXVkcHAsIHVuc2lnbmVkIGNsbnRfaWQsCi0JCQkgICAgICB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZykKLXsKLQlpZiAoY2xudF9pZCA8IEFVRFBQX0NMTlRfTUFYX0NPVU5UICYmIGF1ZHBwLT5mdW5jW2NsbnRfaWRdKQotCQlhdWRwcC0+ZnVuY1tjbG50X2lkXSAoYXVkcHAtPnByaXZhdGVbY2xudF9pZF0sIGlkLCBtc2cpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwcF9oYW5kbGVfcGNtZG1hbWlzcyhzdHJ1Y3QgYXVkcHBfc3RhdGUgKmF1ZHBwLAotCQkJCSAgICB1aW50MTZfdCBiaXRfbWFzaykKLXsKLQl1aW50OF90IGJfaW5kZXg7Ci0KLQlmb3IgKGJfaW5kZXggPSAwOyBiX2luZGV4IDwgQVVEUFBfQ0xOVF9NQVhfQ09VTlQ7IGJfaW5kZXgrKykgewotCQlpZiAoYml0X21hc2sgJiAoMHgxIDw8IGJfaW5kZXgpKQotCQkJaWYgKGF1ZHBwLT5mdW5jW2JfaW5kZXhdKQotCQkJCWF1ZHBwLT5mdW5jW2JfaW5kZXhdIChhdWRwcC0+cHJpdmF0ZVtiX2luZGV4XSwKLQkJCQkJCSAgICAgIEFVRFBQX01TR19QQ01ETUFNSVNTRUQsCi0JCQkJCQkgICAgICAmYml0X21hc2spOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXVkcHBfZmFrZV9ldmVudChzdHJ1Y3QgYXVkcHBfc3RhdGUgKmF1ZHBwLCBpbnQgaWQsCi0JCQkgICAgIHVuc2lnbmVkIGV2ZW50LCB1bnNpZ25lZCBhcmcpCi17Ci0JdWludDE2X3QgbXNnWzFdOwotCW1zZ1swXSA9IGFyZzsKLQlhdWRwcC0+ZnVuY1tpZF0gKGF1ZHBwLT5wcml2YXRlW2lkXSwgZXZlbnQsIG1zZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgc2l6ZV90IGxlbiwKLQkJCSAgICB2b2lkICgqZ2V0ZXZlbnQpICh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRwcF9zdGF0ZSAqYXVkcHAgPSBkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdWludDE2X3QgbXNnWzhdOwotCWludCBjaWQgPSAwOwotCi0JaWYgKGlkID09IEFVRFBQX01TR19BVlNZTkNfTVNHKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRwcC0+YXZzeW5jX2xvY2ssIGZsYWdzKTsKLQkJZ2V0ZXZlbnQoYXVkcHAtPmF2c3luYywgc2l6ZW9mKGF1ZHBwLT5hdnN5bmMpKTsKLQotCQkvKiBtYXNrIG9mZiBhbnkgY2hhbm5lbHMgd2UncmUgbm90IHdhdGNoaW5nIHRvIGF2b2lkCi0JCSAqIGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGdldCBvbmUgbGFzdCB1cGRhdGUgYWZ0ZXIKLQkJICogZGlzYWJsaW5nIGF2c3luYyBhbmQgZW5kIHVwIGluIGFuIG9kZCBzdGF0ZSB3aGVuCi0JCSAqIHdlIG5leHQgcmVhZC4uLgotCQkgKi8KLQkJYXVkcHAtPmF2c3luY1swXSAmPSBhdWRwcC0+YXZzeW5jX21hc2s7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZHBwLT5hdnN5bmNfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JZ2V0ZXZlbnQobXNnLCBzaXplb2YobXNnKSk7Ci0KLQlMT0coRVZfRVZFTlQsIChpZCA8PCAxNikgfCBtc2dbMF0pOwotCUxPRyhFVl9EQVRBLCAobXNnWzFdIDw8IDE2KSB8IG1zZ1syXSk7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQUF9NU0dfU1RBVFVTX01TRzp7Ci0JCQl1bnNpZ25lZCBjaWQgPSBtc2dbMF07Ci0JCQlNTV9EQkcoInN0YXR1cyAlZCAlZCAlZFxuIiwgY2lkLCBtc2dbMV0sIG1zZ1syXSk7Ci0JCQlpZiAoKGNpZCA8IDUpICYmIGF1ZHBwLT5mdW5jW2NpZF0pCi0JCQkJYXVkcHAtPmZ1bmNbY2lkXSAoYXVkcHAtPnByaXZhdGVbY2lkXSwgaWQsIG1zZyk7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVEUFBfTVNHX0hPU1RfUENNX0lOVEZfTVNHOgotCQlpZiAoYXVkcHAtPmZ1bmNbNV0pCi0JCQlhdWRwcC0+ZnVuY1s1XSAoYXVkcHAtPnByaXZhdGVbNV0sIGlkLCBtc2cpOwotCQlicmVhazsKLQljYXNlIEFVRFBQX01TR19QQ01ETUFNSVNTRUQ6Ci0JCWF1ZHBwX2hhbmRsZV9wY21kbWFtaXNzKGF1ZHBwLCBtc2dbMF0pOwotCQlicmVhazsKLQljYXNlIEFVRFBQX01TR19DRkdfTVNHOgotCQlpZiAobXNnWzBdID09IEFVRFBQX01TR19FTkFfRU5BKSB7Ci0JCQlNTV9JTkZPKCJFTkFCTEVcbiIpOwotCQkJaWYgKCFhdWRwcC0+ZW5hYmxlZCkgewotCQkJCWF1ZHBwLT5lbmFibGVkID0gMTsKLQkJCQl3YWtlX3VwKCZhdWRwcC0+ZXZlbnRfd2FpdCk7Ci0JCQkJYXVkcHBfYnJvYWRjYXN0KGF1ZHBwLCBpZCwgbXNnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2lkID0gbXNnWzFdOwotCQkJCWF1ZHBwX2Zha2VfZXZlbnQoYXVkcHAsIGNpZCwKLQkJCQkJaWQsIEFVRFBQX01TR19FTkFfRU5BKTsKLQkJCX0KLQotCQl9IGVsc2UgaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0RJUykgewotCQkJaWYgKGF1ZHBwLT5vcGVuX2NvdW50ID09IDApIHsKLQkJCQlNTV9JTkZPKCJESVNBQkxFXG4iKTsKLQkJCQlhdWRwcC0+ZW5hYmxlZCA9IDA7Ci0JCQkJd2FrZV91cCgmYXVkcHAtPmV2ZW50X3dhaXQpOwotCQkJCWF1ZHBwX2Jyb2FkY2FzdChhdWRwcCwgaWQsIG1zZyk7Ci0JCQl9IGVsc2UgewotCQkJCWNpZCA9IG1zZ1sxXTsKLQkJCQlhdWRwcF9mYWtlX2V2ZW50KGF1ZHBwLCBjaWQsCi0JCQkJCWlkLCBBVURQUF9NU0dfRU5BX0RJUyk7Ci0JCQkJYXVkcHAtPmZ1bmNbY2lkXSA9IE5VTEw7Ci0JCQkJYXVkcHAtPnByaXZhdGVbY2lkXSA9IE5VTEw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoImludmFsaWQgY29uZmlnIG1zZyAlZFxuIiwgbXNnWzBdKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRFBQX01TR19ST1VUSU5HX0FDSzoKLQkJYXVkcHBfbm90aWZ5X2NsbnQoYXVkcHAsIG1zZ1swXSwgaWQsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX0ZMVVNIX0FDSzoKLQkJYXVkcHBfbm90aWZ5X2NsbnQoYXVkcHAsIG1zZ1swXSwgaWQsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgQURTUF9NRVNTQUdFX0lEOgotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6IG1vZHVsZSBlbmFibGUvZGlzYWJsZShhdWRwcHRhc2spIik7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX0ZFQVRfUVVFUllfRE1fRE9ORToKLQkJTU1fSU5GTygiIFJUQyBBQ0sgLS0+ICV4ICV4ICV4XG4iLCBtc2dbMF0sXAotCQkJbXNnWzFdLCBtc2dbMl0pOwotCQlhY2RiX3J0Y19zZXRfZXJyKG1zZ1syXSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX1BQX0RJU0FCTEVfRkVFREJBQ0s6Ci0JCU1NX0RCRygiUFAgRGlzYWJsZSBmZWVkYmFjayBkdWUgdG8gbWlwcyBsaW1pdGF0aW9uIik7Ci0JCWF1ZHBwX2Jyb2FkY2FzdChhdWRwcCwgaWQsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX1BQX0ZFQVRTX1JFX0VOQUJMRToKLQkJTU1fREJHKCJSZS1lbmFibGUgdGhlIGRpc2FibGVkIFBQIGZlYXR1cmVzIik7Ci0JCWF1ZHBwX2Jyb2FkY2FzdChhdWRwcCwgaWQsIG1zZyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1NX0VSUigidW5oYW5kbGVkIG1zZyBpZCAleFxuIiwgaWQpOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBtc21fYWRzcF9vcHMgYWRzcF9vcHMgPSB7Ci0JLmV2ZW50ID0gYXVkcHBfZHNwX2V2ZW50LAotfTsKLQotaW50IGF1ZHBwX2VuYWJsZShpbnQgaWQsIGF1ZHBwX2V2ZW50X2Z1bmMgZnVuYywgdm9pZCAqcHJpdmF0ZSkKLXsKLQlzdHJ1Y3QgYXVkcHBfc3RhdGUgKmF1ZHBwID0gJnRoZV9hdWRwcF9zdGF0ZTsKLQl1aW50MTZfdCBtc2dbOF07Ci0JaW50IHJlcyA9IDA7Ci0JaW50IHJjOwotCi0JaWYgKGlkIDwgLTEgfHwgaWQgPiA0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChpZCA9PSAtMSkKLQkJaWQgPSA1OwotCi0JbXV0ZXhfbG9jayhhdWRwcC0+bG9jayk7Ci0JaWYgKGF1ZHBwLT5mdW5jW2lkXSkgewotCQlyZXMgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWF1ZHBwLT5mdW5jW2lkXSA9IGZ1bmM7Ci0JYXVkcHAtPnByaXZhdGVbaWRdID0gcHJpdmF0ZTsKLQotCUxPRyhFVl9FTkFCTEUsIDEpOwotCWlmIChhdWRwcC0+b3Blbl9jb3VudCsrID09IDApIHsKLQkJTU1fREJHKCJlbmFibGVcbiIpOwotCQlyZXMgPSBtc21fYWRzcF9nZXQoIkFVRFBQVEFTSyIsICZhdWRwcC0+bW9kLCAmYWRzcF9vcHMsIGF1ZHBwKTsKLQkJaWYgKHJlcyA8IDApIHsKLQkJCU1NX0VSUigiY2Fubm90IG9wZW4gQVVEUFBUQVNLXG4iKTsKLQkJCWF1ZHBwLT5vcGVuX2NvdW50ID0gMDsKLQkJCWF1ZHBwLT5mdW5jW2lkXSA9IE5VTEw7Ci0JCQlhdWRwcC0+cHJpdmF0ZVtpZF0gPSBOVUxMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJTE9HKEVWX0VOQUJMRSwgMik7Ci0JCW1zbV9hZHNwX2VuYWJsZShhdWRwcC0+bW9kKTsKLQkJYXVkcHBfZHNwX2NvbmZpZygxKTsKLQkJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYXVkcHAtPmV2ZW50X3dhaXQsCi0JCQkJCShhdWRwcC0+ZW5hYmxlZCA9PSAxKSwKLQkJCQkJMyAqIEhaKTsKLQkJaWYgKHJjID09IDApCi0JCQltc21fYWRzcF9kdW1wKGF1ZHBwLT5tb2QpOwotCX0gZWxzZSB7Ci0JCWlmIChhdWRwcC0+ZW5hYmxlZCkgewotCQkJbXNnWzBdID0gQVVEUFBfTVNHX0VOQV9FTkE7Ci0JCQltc2dbMV0gPSBpZDsKLQkJCXJlcyA9IG1zbV9hZHNwX2dlbmVyYXRlX2V2ZW50KGF1ZHBwLCBhdWRwcC0+bW9kLAotCQkJCQkgQVVEUFBfTVNHX0NGR19NU0csIHNpemVvZihtc2cpLAotCQkJCQkgc2l6ZW9mKHVpbnQxNl90KSwgKHZvaWQgKiltc2cpOwotCQkJaWYgKHJlcyA8IDApCi0JCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQlyZXMgPSAwOwotb3V0OgotCW11dGV4X3VubG9jayhhdWRwcC0+bG9jayk7Ci0JcmV0dXJuIHJlczsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcHBfZW5hYmxlKTsKLQotdm9pZCBhdWRwcF9kaXNhYmxlKGludCBpZCwgdm9pZCAqcHJpdmF0ZSkKLXsKLQlzdHJ1Y3QgYXVkcHBfc3RhdGUgKmF1ZHBwID0gJnRoZV9hdWRwcF9zdGF0ZTsKLQl1aW50MTZfdCBtc2dbOF07Ci0JaW50IHJjOwotCi0JaWYgKGlkIDwgLTEgfHwgaWQgPiA0KQotCQlyZXR1cm47Ci0KLQlpZiAoaWQgPT0gLTEpCi0JCWlkID0gNTsKLQotCW11dGV4X2xvY2soYXVkcHAtPmxvY2spOwotCUxPRyhFVl9ESVNBQkxFLCAxKTsKLQlpZiAoIWF1ZHBwLT5mdW5jW2lkXSkKLQkJZ290byBvdXQ7Ci0JaWYgKGF1ZHBwLT5wcml2YXRlW2lkXSAhPSBwcml2YXRlKQotCQlnb3RvIG91dDsKLQotCW1zZ1swXSA9IEFVRFBQX01TR19FTkFfRElTOwotCW1zZ1sxXSA9IGlkOwotCXJjID0gbXNtX2Fkc3BfZ2VuZXJhdGVfZXZlbnQoYXVkcHAsIGF1ZHBwLT5tb2QsCi0JCQkJIEFVRFBQX01TR19DRkdfTVNHLCBzaXplb2YobXNnKSwKLQkJCQkgc2l6ZW9mKHVpbnQxNl90KSwgKHZvaWQgKiltc2cpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gb3V0OwotCi0JaWYgKC0tYXVkcHAtPm9wZW5fY291bnQgPT0gMCkgewotCQlNTV9EQkcoImRpc2FibGVcbiIpOwotCQlMT0coRVZfRElTQUJMRSwgMik7Ci0JCWF1ZHBwX2RzcF9jb25maWcoMCk7Ci0JCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGF1ZHBwLT5ldmVudF93YWl0LAotCQkJCQkoYXVkcHAtPmVuYWJsZWQgPT0gMCksCi0JCQkJCTMgKiBIWik7Ci0JCWlmIChhdWRwcC0+ZW5hYmxlZCA9PSAwKQotCQkJTU1fSU5GTygiUmVjZWl2ZWQgQ0ZHX01TR19ESVNBQkxFIGZyb20gQURTUFxuIik7Ci0JCWVsc2UgewotCQkJTU1fRVJSKCJEaWRuJ3QgcmVjZWl2ZSBDRkdfTVNHIERJU0FCTEUgXAotCQkJCQltZXNzYWdlIGZyb20gQURTUFxuIik7Ci0JCQlpZiAocmMgPT0gMCkKLQkJCQltc21fYWRzcF9kdW1wKGF1ZHBwLT5tb2QpOwotCQl9Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkcHAtPm1vZCk7Ci0JCW1zbV9hZHNwX3B1dChhdWRwcC0+bW9kKTsKLQkJYXVkcHAtPm1vZCA9IE5VTEw7Ci0JfQotb3V0OgotCW11dGV4X3VubG9jayhhdWRwcC0+bG9jayk7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHBwX2Rpc2FibGUpOwotCi0jZGVmaW5lIEJBRF9JRChpZCkgKChpZCA8IDApIHx8IChpZCA+PSBDSF9DT1VOVCkpCi0KLXZvaWQgYXVkcHBfYXZzeW5jKGludCBpZCwgdW5zaWduZWQgcmF0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWF1ZHBwX2NtZF9hdnN5bmMgY21kOwotCi0JaWYgKEJBRF9JRChpZCkpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGVfYXVkcHBfc3RhdGUuYXZzeW5jX2xvY2ssIGZsYWdzKTsKLQlpZiAocmF0ZSkKLQkJdGhlX2F1ZHBwX3N0YXRlLmF2c3luY19tYXNrIHw9ICgxIDw8IGlkKTsKLQllbHNlCi0JCXRoZV9hdWRwcF9zdGF0ZS5hdnN5bmNfbWFzayAmPSAofigxIDw8IGlkKSk7Ci0JdGhlX2F1ZHBwX3N0YXRlLmF2c3luY1swXSAmPSB0aGVfYXVkcHBfc3RhdGUuYXZzeW5jX21hc2s7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhlX2F1ZHBwX3N0YXRlLmF2c3luY19sb2NrLCBmbGFncyk7Ci0KLQljbWQuY21kX2lkID0gQVVEUFBfQ01EX0FWU1lOQzsKLQljbWQub2JqZWN0X251bWJlciA9IGlkOwotCWNtZC5pbnRlcnJ1cHRfaW50ZXJ2YWxfbHN3ID0gcmF0ZTsKLQljbWQuaW50ZXJydXB0X2ludGVydmFsX21zdyA9IHJhdGUgPj4gMTY7Ci0JYXVkcHBfc2VuZF9xdWV1ZTEoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9hdnN5bmMpOwotCi11bnNpZ25lZCBhdWRwcF9hdnN5bmNfc2FtcGxlX2NvdW50KGludCBpZCkKLXsKLQlzdHJ1Y3QgYXVkcHBfc3RhdGUgKmF1ZHBwID0gJnRoZV9hdWRwcF9zdGF0ZTsKLQl1aW50MTZfdCAqYXZzeW5jID0gYXVkcHAtPmF2c3luYzsKLQl1bnNpZ25lZCB2YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBtYXNrOwotCi0JaWYgKEJBRF9JRChpZCkpCi0JCXJldHVybiAwOwotCi0JbWFzayA9IDEgPDwgaWQ7Ci0JaWQgPSBpZCAqIEFVRFBQX0FWU1lOQ19JTkZPX1NJWkUgKyAyOwotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRwcC0+YXZzeW5jX2xvY2ssIGZsYWdzKTsKLQlpZiAoYXZzeW5jWzBdICYgbWFzaykKLQkJdmFsID0gKGF2c3luY1tpZF0gPDwgMTYpIHwgYXZzeW5jW2lkICsgMV07Ci0JZWxzZQotCQl2YWwgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZHBwLT5hdnN5bmNfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHZhbDsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcHBfYXZzeW5jX3NhbXBsZV9jb3VudCk7Ci0KLXVuc2lnbmVkIGF1ZHBwX2F2c3luY19ieXRlX2NvdW50KGludCBpZCkKLXsKLQlzdHJ1Y3QgYXVkcHBfc3RhdGUgKmF1ZHBwID0gJnRoZV9hdWRwcF9zdGF0ZTsKLQl1aW50MTZfdCAqYXZzeW5jID0gYXVkcHAtPmF2c3luYzsKLQl1bnNpZ25lZCB2YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBtYXNrOwotCi0JaWYgKEJBRF9JRChpZCkpCi0JCXJldHVybiAwOwotCi0JbWFzayA9IDEgPDwgaWQ7Ci0JaWQgPSBpZCAqIEFVRFBQX0FWU1lOQ19JTkZPX1NJWkUgKyA1OwotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRwcC0+YXZzeW5jX2xvY2ssIGZsYWdzKTsKLQlpZiAoYXZzeW5jWzBdICYgbWFzaykKLQkJdmFsID0gKGF2c3luY1tpZF0gPDwgMTYpIHwgYXZzeW5jW2lkICsgMV07Ci0JZWxzZQotCQl2YWwgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZHBwLT5hdnN5bmNfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHZhbDsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcHBfYXZzeW5jX2J5dGVfY291bnQpOwotCi1pbnQgYXVkcHBfc2V0X3ZvbHVtZV9hbmRfcGFuKHVuc2lnbmVkIGlkLCB1bnNpZ25lZCB2b2x1bWUsIGludCBwYW4pCi17Ci0JLyogY21kLCBvYmpfY2ZnWzddLCBjbWRfdHlwZSwgdm9sdW1lLCBwYW4gKi8KLQl1aW50MTZfdCBjbWRbMTFdOwotCi0JaWYgKGlkID4gNikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1zZXQoY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kWzBdID0gQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TOwotCWNtZFsxICsgaWRdID0gQVVEUFBfQ01EX0NGR19PQkpfVVBEQVRFOwotCWNtZFs4XSA9IEFVRFBQX0NNRF9WT0xVTUVfUEFOOwotCWNtZFs5XSA9IHZvbHVtZTsKLQljbWRbMTBdID0gcGFuOwotCi0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUzKGNtZCwgc2l6ZW9mKGNtZCkpOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9zZXRfdm9sdW1lX2FuZF9wYW4pOwotCi0vKiBJbXBsZW1lbnRhdGlvbiBvZiBDT1BQIGZlYXR1cmVzICovCi1pbnQgYXVkcHBfZHNwX3NldF9tYmFkcmModW5zaWduZWQgaWQsIHVuc2lnbmVkIGVuYWJsZSwKLQkJCSBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfbWJhZHJjICptYmFkcmMpCi17Ci0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX21iYWRyYyBjbWQ7Ci0KLQlpZiAoaWQgIT0gNikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jb21tb24uY29tbWFuX2NmZyA9IEFVRFBQX0NNRF9DRkdfT0JKX1VQREFURTsKLQljbWQuY29tbW9uLmNvbW1hbmRfdHlwZSA9IEFVRFBQX0NNRF9NQkFEUkM7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCW1lbWNweSgmY21kLm51bV9iYW5kcywgJm1iYWRyYy0+bnVtX2JhbmRzLAotCQkgICAgICAgc2l6ZW9mKCptYmFkcmMpIC0KLQkJICAgICAgIChBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfQ09NTU9OX0xFTiArIDIpKTsKLQkJY21kLmVuYWJsZSA9IEFVRFBQX0NNRF9BRFJDX0ZMQUdfRU5BOwotCX0gZWxzZQotCQljbWQuZW5hYmxlID0gQVVEUFBfQ01EX0FEUkNfRkxBR19ESVM7Ci0KLQkvKm9yZGVyIHRoZSB3cml0ZXMgdG8gbWJhZHJjICovCi0JZG1hX2NvaGVyZW50X3ByZV9vcHMoKTsKLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTMoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9kc3Bfc2V0X21iYWRyYyk7Ci0KLWludCBhdWRwcF9kc3Bfc2V0X3Fjb25jZXJ0X3BsdXModW5zaWduZWQgaWQsIHVuc2lnbmVkIGVuYWJsZSwKLQkJCQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfcWNvbmNlcnQgKgotCQkJCXFjb25jZXJ0X3BsdXMpCi17Ci0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3Fjb25jZXJ0IGNtZDsKLQlpZiAoaWQgIT0gNikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jb21tb24uY29tbWFuX2NmZyA9IEFVRFBQX0NNRF9DRkdfT0JKX1VQREFURTsKLQljbWQuY29tbW9uLmNvbW1hbmRfdHlwZSA9IEFVRFBQX0NNRF9RQ09OQ0VSVDsKLQotCWlmIChlbmFibGUpIHsKLQkJbWVtY3B5KCZjbWQub3BfbW9kZSwgJnFjb25jZXJ0X3BsdXMtPm9wX21vZGUsCi0JCSAgICAgICBzaXplb2YoYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3Fjb25jZXJ0KSAtCi0JCSAgICAgICAoQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TX0NPTU1PTl9MRU4gKyAyKSk7Ci0JCWNtZC5lbmFibGVfZmxhZyA9IEFVRFBQX0NNRF9BRFJDX0ZMQUdfRU5BOwotCX0gZWxzZQotCQljbWQuZW5hYmxlX2ZsYWcgPSBBVURQUF9DTURfQURSQ19GTEFHX0RJUzsKLQotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMygmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLWludCBhdWRwcF9kc3Bfc2V0X3J4X2lpcih1bnNpZ25lZCBpZCwgdW5zaWduZWQgZW5hYmxlLAotCQkJIGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19wY20gKmlpcikKLXsKLQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfcGNtIGNtZDsKLQotCWlmIChpZCAhPSA2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNvbW1vbi5jb21tYW5fY2ZnID0gQVVEUFBfQ01EX0NGR19PQkpfVVBEQVRFOwotCWNtZC5jb21tb24uY29tbWFuZF90eXBlID0gQVVEUFBfQ01EX0lJUl9UVU5JTkdfRklMVEVSOwotCi0JaWYgKGVuYWJsZSkgewotCQljbWQuYWN0aXZlX2ZsYWcgPSBBVURQUF9DTURfSUlSX0ZMQUdfRU5BOwotCQljbWQubnVtX2JhbmRzID0gaWlyLT5udW1fYmFuZHM7Ci0JCW1lbWNweSgmY21kLnBhcmFtc19maWx0ZXIsICZpaXItPnBhcmFtc19maWx0ZXIsCi0JCSAgICAgICBzaXplb2YoaWlyLT5wYXJhbXNfZmlsdGVyKSk7Ci0JfSBlbHNlCi0JCWNtZC5hY3RpdmVfZmxhZyA9IEFVRFBQX0NNRF9JSVJfRkxBR19ESVM7Ci0KLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTMoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9kc3Bfc2V0X3J4X2lpcik7Ci0KLWludCBhdWRwcF9kc3Bfc2V0X3J4X3Nyc190cnVtZWRpYV9nKAotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3JzdG1fZyAqc3JzdG0pCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19zcnN0bV9nIGNtZDsKLQotCU1NX0RCRygiJXNcbiIsIF9fZnVuY19fKTsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jb21tb24uY21kX2lkID0gQVVEUFBfU1JTX1BBUkFNUzsKLQljbWQuY29tbW9uLmNvbW1hbl9jZmcgPSBBVURQUF9DTURfQ0ZHX09CSl9VUERBVEU7Ci0JY21kLmNvbW1vbi5jb21tYW5kX3R5cGUgPSBBVURQUF9TUlNfUEFSQU1TX0c7Ci0KLQltZW1jcHkoY21kLnYsIHNyc3RtLT52LCBzaXplb2Yoc3JzdG0tPnYpKTsKLQotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMygmY21kLCBzaXplb2YoY21kKSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHBwX2RzcF9zZXRfcnhfc3JzX3RydW1lZGlhX2cpOwotCi1pbnQgYXVkcHBfZHNwX3NldF9yeF9zcnNfdHJ1bWVkaWFfdygKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3Nyc3RtX3cgKnNyc3RtKQotewotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3JzdG1fdyBjbWQ7Ci0KLQlNTV9EQkcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY29tbW9uLmNtZF9pZCA9IEFVRFBQX1NSU19QQVJBTVM7Ci0JY21kLmNvbW1vbi5jb21tYW5fY2ZnID0gQVVEUFBfQ01EX0NGR19PQkpfVVBEQVRFOwotCWNtZC5jb21tb24uY29tbWFuZF90eXBlID0gQVVEUFBfU1JTX1BBUkFNU19XOwotCi0JbWVtY3B5KGNtZC52LCBzcnN0bS0+diwgc2l6ZW9mKHNyc3RtLT52KSk7Ci0KLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTMoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9kc3Bfc2V0X3J4X3Nyc190cnVtZWRpYV93KTsKLQotaW50IGF1ZHBwX2RzcF9zZXRfcnhfc3JzX3RydW1lZGlhX2MoCi0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19zcnN0bV9jICpzcnN0bSkKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3Nyc3RtX2MgY21kOwotCi0JTU1fREJHKCIlc1xuIiwgX19mdW5jX18pOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNvbW1vbi5jbWRfaWQgPSBBVURQUF9TUlNfUEFSQU1TOwotCWNtZC5jb21tb24uY29tbWFuX2NmZyA9IEFVRFBQX0NNRF9DRkdfT0JKX1VQREFURTsKLQljbWQuY29tbW9uLmNvbW1hbmRfdHlwZSA9IEFVRFBQX1NSU19QQVJBTVNfQzsKLQotCW1lbWNweShjbWQudiwgc3JzdG0tPnYsIHNpemVvZihzcnN0bS0+dikpOwotCi0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUzKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcHBfZHNwX3NldF9yeF9zcnNfdHJ1bWVkaWFfYyk7Ci0KLWludCBhdWRwcF9kc3Bfc2V0X3J4X3Nyc190cnVtZWRpYV9oKAotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3JzdG1faCAqc3JzdG0pCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19zcnN0bV9oIGNtZDsKLQotCU1NX0RCRygiJXNcbiIsIF9fZnVuY19fKTsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jb21tb24uY21kX2lkID0gQVVEUFBfU1JTX1BBUkFNUzsKLQljbWQuY29tbW9uLmNvbW1hbl9jZmcgPSBBVURQUF9DTURfQ0ZHX09CSl9VUERBVEU7Ci0JY21kLmNvbW1vbi5jb21tYW5kX3R5cGUgPSBBVURQUF9TUlNfUEFSQU1TX0g7Ci0KLQltZW1jcHkoY21kLnYsIHNyc3RtLT52LCBzaXplb2Yoc3JzdG0tPnYpKTsKLQotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMygmY21kLCBzaXplb2YoY21kKSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHBwX2RzcF9zZXRfcnhfc3JzX3RydW1lZGlhX2gpOwotCi1pbnQgYXVkcHBfZHNwX3NldF9yeF9zcnNfdHJ1bWVkaWFfcCgKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3Nyc3RtX3AgKnNyc3RtKQotewotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3JzdG1fcCBjbWQ7Ci0KLQlNTV9EQkcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY29tbW9uLmNtZF9pZCA9IEFVRFBQX1NSU19QQVJBTVM7Ci0JY21kLmNvbW1vbi5jb21tYW5fY2ZnID0gQVVEUFBfQ01EX0NGR19PQkpfVVBEQVRFOwotCWNtZC5jb21tb24uY29tbWFuZF90eXBlID0gQVVEUFBfU1JTX1BBUkFNU19QOwotCi0JbWVtY3B5KGNtZC52LCBzcnN0bS0+diwgc2l6ZW9mKHNyc3RtLT52KSk7Ci0KLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTMoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9kc3Bfc2V0X3J4X3Nyc190cnVtZWRpYV9wKTsKLQotaW50IGF1ZHBwX2RzcF9zZXRfcnhfc3JzX3RydW1lZGlhX2woCi0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19zcnN0bV9sICpzcnN0bSkKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3Nyc3RtX2wgY21kOwotCi0JTU1fREJHKCIlc1xuIiwgX19mdW5jX18pOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNvbW1vbi5jbWRfaWQgPSBBVURQUF9TUlNfUEFSQU1TOwotCWNtZC5jb21tb24uY29tbWFuX2NmZyA9IEFVRFBQX0NNRF9DRkdfT0JKX1VQREFURTsKLQljbWQuY29tbW9uLmNvbW1hbmRfdHlwZSA9IEFVRFBQX1NSU19QQVJBTVNfTDsKLQotCW1lbWNweShjbWQudiwgc3JzdG0tPnYsIHNpemVvZihzcnN0bS0+dikpOwotCi0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUzKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcHBfZHNwX3NldF9yeF9zcnNfdHJ1bWVkaWFfbCk7Ci0KLS8qIEltcGxlbWVudGF0aW9uIE9mIENPUFAgKyBQT1BQICovCi1pbnQgYXVkcHBfZHNwX3NldF9lcSh1bnNpZ25lZCBpZCwgdW5zaWduZWQgZW5hYmxlLAotCQkgICAgIGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19lcWFsaXplciAqZXEpCi17Ci0JYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyIGNtZDsKLQl1bnNpZ25lZCBzaG9ydCAqaWRfcHRyID0gKHVuc2lnbmVkIHNob3J0ICopJmNtZDsKLQotCWlmIChpZCA+IDYgfHwgaWQgPT0gNSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWlkX3B0clsxICsgaWRdID0gQVVEUFBfQ01EX0NGR19PQkpfVVBEQVRFOwotCWNtZC5jb21tb24uY29tbWFuZF90eXBlID0gQVVEUFBfQ01EX0VRVUFMSVpFUjsKLQotCWlmIChlbmFibGUpIHsKLQkJY21kLmVxX2ZsYWcgPSBBVURQUF9DTURfRVFfRkxBR19FTkE7Ci0JCWNtZC5udW1fYmFuZHMgPSBlcS0+bnVtX2JhbmRzOwotCQltZW1jcHkoJmNtZC5lcV9jb2VmZiwgJmVxLT5lcV9jb2VmZiwgc2l6ZW9mKGVxLT5lcV9jb2VmZikpOwotCX0gZWxzZQotCQljbWQuZXFfZmxhZyA9IEFVRFBQX0NNRF9FUV9GTEFHX0RJUzsKLQotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMygmY21kLCBzaXplb2YoY21kKSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHBwX2RzcF9zZXRfZXEpOwotCi1pbnQgYXVkcHBfZHNwX3NldF92b2xfcGFuKHVuc2lnbmVkIGlkLAotCQkJICBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfdm9sdW1lICp2b2xfcGFuKQotewotCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUgY21kOwotCXVuc2lnbmVkIHNob3J0ICppZF9wdHIgPSAodW5zaWduZWQgc2hvcnQgKikmY21kOwotCi0JaWYgKGlkID4gNikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWlkX3B0clsxICsgaWRdID0gQVVEUFBfQ01EX0NGR19PQkpfVVBEQVRFOwotCWNtZC5jb21tb24uY29tbWFuZF90eXBlID0gQVVEUFBfQ01EX1ZPTFVNRV9QQU47Ci0KLQljbWQudm9sdW1lID0gdm9sX3Bhbi0+dm9sdW1lOwotCWNtZC5wYW4gPSB2b2xfcGFuLT5wYW47Ci0KLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTMoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4pOwotCi1pbnQgYXVkcHBfcGF1c2UodW5zaWduZWQgaWQsIGludCBwYXVzZSkKLXsKLQkvKiBwYXVzZSAxID0gcGF1c2UgMCA9IHJlc3VtZSAqLwotCXUxNiBwYXVzZV9jbWRbQVVEUFBfQ01EX0RFQ19DVFJMX0xFTiAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCldOwotCi0JaWYgKGlkID49IENIX0NPVU5UKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1lbXNldChwYXVzZV9jbWQsIDAsIHNpemVvZihwYXVzZV9jbWQpKTsKLQotCXBhdXNlX2NtZFswXSA9IEFVRFBQX0NNRF9ERUNfQ1RSTDsKLQlpZiAocGF1c2UgPT0gMSkKLQkJcGF1c2VfY21kWzEgKyBpZF0gPSBBVURQUF9DTURfVVBEQVRFX1YgfCBBVURQUF9DTURfUEFVU0VfVjsKLQllbHNlIGlmIChwYXVzZSA9PSAwKQotCQlwYXVzZV9jbWRbMSArIGlkXSA9IEFVRFBQX0NNRF9VUERBVEVfViB8IEFVRFBQX0NNRF9SRVNVTUVfVjsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUxKHBhdXNlX2NtZCwgc2l6ZW9mKHBhdXNlX2NtZCkpOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9wYXVzZSk7Ci0KLWludCBhdWRwcF9mbHVzaCh1bnNpZ25lZCBpZCkKLXsKLQl1MTYgZmx1c2hfY21kW0FVRFBQX0NNRF9ERUNfQ1RSTF9MRU4gLyBzaXplb2YodW5zaWduZWQgc2hvcnQpXTsKLQotCWlmIChpZCA+PSBDSF9DT1VOVCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1zZXQoZmx1c2hfY21kLCAwLCBzaXplb2YoZmx1c2hfY21kKSk7Ci0KLQlmbHVzaF9jbWRbMF0gPSBBVURQUF9DTURfREVDX0NUUkw7Ci0JZmx1c2hfY21kWzEgKyBpZF0gPSBBVURQUF9DTURfVVBEQVRFX1YgfCBBVURQUF9DTURfRkxVU0hfVjsKLQotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMShmbHVzaF9jbWQsIHNpemVvZihmbHVzaF9jbWQpKTsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcHBfZmx1c2gpOwotCi0vKiBkZWNfYXR0cmIgPSA3OjAsIDAgLSBObyBEZWNvZGVyLCBlbHNlIHN1cHBvcnRlZCBkZWNvZGVyICoKLSAqIGxpa2UgbXAzLCBhYWMsIHdtYSBldGMgLi4uICoKLSAqICAgICAgICAgICA9ICAxNTo4LCBiaXRbOF0gPSAxIC0gVHVubmVsLCBiaXRbOV0gPSAxIC0gTm9uVHVubmVsICoKLSAqICAgICAgICAgICA9ICAzMToxNiwgcmVzZXJ2ZWQgKi8KLWludCBhdWRwcF9hZGVjX2FsbG9jKHVuc2lnbmVkIGRlY19hdHRyYiwgY29uc3QgY2hhciAqKm1vZHVsZV9uYW1lLAotCQkgICAgIHVuc2lnbmVkICpxdWV1ZWlkKQotewotCXN0cnVjdCBhdWRwcF9zdGF0ZSAqYXVkcHAgPSAmdGhlX2F1ZHBwX3N0YXRlOwotCWludCBkZWNpZCA9IC0xLCBpZHgsIGxpZHgsIG1vZGUsIGNvZGVjOwotCWludCBjb2RlY3Nfc3VwcG9ydGVkLCBtaW5fY29kZWNzX3N1cHBvcnRlZDsKLQl1bnNpZ25lZCBpbnQgKmNvbmN1cnJlbmN5X2VudHJ5OwotCW11dGV4X2xvY2soYXVkcHAtPmxvY2tfZGVjKTsKLQkvKiBSZXByZXNlbnRzIGluIGJpdCBtYXNrICovCi0JbW9kZSA9ICgoZGVjX2F0dHJiICYgQVVEUFBfTU9ERV9NQVNLKSA8PCAxNik7Ci0JY29kZWMgPSAoMSA8PCAoZGVjX2F0dHJiICYgQVVEUFBfQ09ERUNfTUFTSykpOwotCS8qIFBvaW50IHRvIExhc3QgZW50cnkgb2YgdGhlIHJvdyAqLwotCWNvbmN1cnJlbmN5X2VudHJ5ID0gKChhdWRwcC0+ZGVjX2RhdGFiYXNlLT5kZWNfY29uY3VycmVuY3lfdGFibGUgKwotCQkJICAgICAgKChhdWRwcC0+Y29uY3VycmVuY3kgKyAxKSAqCi0JCQkgICAgICAgKGF1ZHBwLT5kZWNfZGF0YWJhc2UtPm51bV9kZWMpKSkgLSAxKTsKLQotCWxpZHggPSBhdWRwcC0+ZGVjX2RhdGFiYXNlLT5udW1fZGVjOwotCW1pbl9jb2RlY3Nfc3VwcG9ydGVkID0gc2l6ZW9mKHVuc2lnbmVkIGludCkgKiA4OwotCi0JTU1fREJHKCJtb2RlID0gMHglMDh4IGNvZGVjID0gMHglMDh4XG4iLCBtb2RlLCBjb2RlYyk7Ci0KLQlmb3IgKGlkeCA9IGxpZHg7IGlkeCA+IDA7IGlkeC0tLCBjb25jdXJyZW5jeV9lbnRyeS0tKSB7Ci0JCWlmICghKGF1ZHBwLT5kZWNfaW51c2UgJiAoMSA8PCAoaWR4IC0gMSkpKSkgewotCQkJaWYgKChtb2RlICYgKmNvbmN1cnJlbmN5X2VudHJ5KSAmJgotCQkJICAgIChjb2RlYyAmICpjb25jdXJyZW5jeV9lbnRyeSkpIHsKLQkJCQkvKiBDaGVjayBzdXBwb3J0cyBtaW5pbXVtIG51bWJlciBjb2RlY3MgKi8KLQkJCQljb2RlY3Nfc3VwcG9ydGVkID0KLQkJCQkgICAgYXVkcHAtPmRlY19kYXRhYmFzZS0+ZGVjX2luZm9fbGlzdFtpZHggLQotCQkJCQkJCQkgICAgICAgMV0uCi0JCQkJICAgIG5yX2NvZGVjX3N1cHBvcnQ7Ci0JCQkJaWYgKGNvZGVjc19zdXBwb3J0ZWQgPCBtaW5fY29kZWNzX3N1cHBvcnRlZCkgewotCQkJCQlsaWR4ID0gaWR4IC0gMTsKLQkJCQkJbWluX2NvZGVjc19zdXBwb3J0ZWQgPSBjb2RlY3Nfc3VwcG9ydGVkOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCWlmIChsaWR4IDwgYXVkcHAtPmRlY19kYXRhYmFzZS0+bnVtX2RlYykgewotCQlhdWRwcC0+ZGVjX2ludXNlIHw9ICgxIDw8IGxpZHgpOwotCQkqbW9kdWxlX25hbWUgPQotCQkgICAgYXVkcHAtPmRlY19kYXRhYmFzZS0+ZGVjX2luZm9fbGlzdFtsaWR4XS5tb2R1bGVfbmFtZTsKLQkJKnF1ZXVlaWQgPQotCQkgICAgYXVkcHAtPmRlY19kYXRhYmFzZS0+ZGVjX2luZm9fbGlzdFtsaWR4XS5tb2R1bGVfcXVldWVpZDsKLQkJZGVjaWQgPSBhdWRwcC0+ZGVjX2RhdGFiYXNlLT5kZWNfaW5mb19saXN0W2xpZHhdLm1vZHVsZV9kZWNpZDsKLQkJYXVkcHAtPmRlY19pbmZvX3RhYmxlW2xpZHhdLmNvZGVjID0KLQkJICAgIChkZWNfYXR0cmIgJiBBVURQUF9DT0RFQ19NQVNLKTsKLQkJYXVkcHAtPmRlY19pbmZvX3RhYmxlW2xpZHhdLnBpZCA9IGN1cnJlbnQtPnBpZDsKLQkJLyogcG9pbnQgdG8gcm93IHRvIGdldCBzdXBwb3J0ZWQgb3BlcmF0aW9uICovCi0JCWNvbmN1cnJlbmN5X2VudHJ5ID0KLQkJICAgICgoYXVkcHAtPmRlY19kYXRhYmFzZS0+ZGVjX2NvbmN1cnJlbmN5X3RhYmxlICsKLQkJICAgICAgKChhdWRwcC0+Y29uY3VycmVuY3kpICogKGF1ZHBwLT5kZWNfZGF0YWJhc2UtPm51bV9kZWMpKSkgKwotCQkgICAgIGxpZHgpOwotCQlkZWNpZCB8PSAoKCpjb25jdXJyZW5jeV9lbnRyeSAmIEFVRFBQX09QX01BU0spID4+IDEyKTsKLQkJTU1fSU5GTygiZGVjaWQgPTB4JTA4eCBtb2R1bGVfbmFtZT0lcywgcXVldWVpZD0lZCBcbiIsCi0JCQlkZWNpZCwgKm1vZHVsZV9uYW1lLCAqcXVldWVpZCk7Ci0JfQotCW11dGV4X3VubG9jayhhdWRwcC0+bG9ja19kZWMpOwotCXJldHVybiBkZWNpZDsKLQotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9hZGVjX2FsbG9jKTsKLQotdm9pZCBhdWRwcF9hZGVjX2ZyZWUoaW50IGRlY2lkKQotewotCXN0cnVjdCBhdWRwcF9zdGF0ZSAqYXVkcHAgPSAmdGhlX2F1ZHBwX3N0YXRlOwotCWludCBpZHg7Ci0JbXV0ZXhfbG9jayhhdWRwcC0+bG9ja19kZWMpOwotCWZvciAoaWR4ID0gYXVkcHAtPmRlY19kYXRhYmFzZS0+bnVtX2RlYzsgaWR4ID4gMDsgaWR4LS0pIHsKLQkJaWYgKGF1ZHBwLT5kZWNfZGF0YWJhc2UtPmRlY19pbmZvX2xpc3RbaWR4IC0gMV0ubW9kdWxlX2RlY2lkID09Ci0JCSAgICBkZWNpZCkgewotCQkJYXVkcHAtPmRlY19pbnVzZSAmPSB+KDEgPDwgKGlkeCAtIDEpKTsKLQkJCWF1ZHBwLT5kZWNfaW5mb190YWJsZVtpZHggLSAxXS5jb2RlYyA9IC0xOwotCQkJYXVkcHAtPmRlY19pbmZvX3RhYmxlW2lkeCAtIDFdLnBpZCA9IDA7Ci0JCQlNTV9JTkZPKCJmcmVlIGRlY2lkID0lZCBcbiIsIGRlY2lkKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCW11dGV4X3VubG9jayhhdWRwcC0+bG9ja19kZWMpOwotCXJldHVybjsKLQotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9hZGVjX2ZyZWUpOwotCi1zdGF0aWMgc3NpemVfdCBjb25jdXJyZW5jeV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBhdWRwcF9zdGF0ZSAqYXVkcHAgPSAmdGhlX2F1ZHBwX3N0YXRlOwotCWludCByYzsKLQltdXRleF9sb2NrKGF1ZHBwLT5sb2NrX2RlYyk7Ci0JcmMgPSBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgYXVkcHAtPmNvbmN1cnJlbmN5KTsKLQltdXRleF91bmxvY2soYXVkcHAtPmxvY2tfZGVjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGNvbmN1cnJlbmN5X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBhdWRwcF9zdGF0ZSAqYXVkcHAgPSAmdGhlX2F1ZHBwX3N0YXRlOwotCXVuc2lnbmVkIGxvbmcgY29uY3VycmVuY3k7Ci0JaW50IHJjID0gLTE7Ci0JbXV0ZXhfbG9jayhhdWRwcC0+bG9ja19kZWMpOwotCWlmIChhdWRwcC0+ZGVjX2ludXNlKSB7Ci0JCU1NX0VSUigiQ2FuIG5vdCBjaGFuZ2UgcHJvZmlsZSwgd2hpbGUgcGxheWJhY2sgaW4gcHJvZ3Jlc3NcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCXJjID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmNvbmN1cnJlbmN5KTsKLQlpZiAoIXJjICYmCi0JCShjb25jdXJyZW5jeSA8IGF1ZHBwLT5kZWNfZGF0YWJhc2UtPm51bV9jb25jdXJyZW5jeV9zdXBwb3J0KSkgewotCQlhdWRwcC0+Y29uY3VycmVuY3kgPSBjb25jdXJyZW5jeTsKLQkJTU1fREJHKCJDb25jdXJyZW5jeSBjYXNlICVsZFxuIiwgYXVkcHAtPmNvbmN1cnJlbmN5KTsKLQkJcmMgPSBjb3VudDsKLQl9IGVsc2UgewotCQlNTV9FUlIoIk5vdCBhIHZhbGlkIENvbmN1cnJlbmN5IGNhc2VcbiIpOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQotZG9uZToKLQltdXRleF91bmxvY2soYXVkcHAtPmxvY2tfZGVjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRlY29kZXJfaW5mb19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7Ci1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfZGVjb2RlcltBVURQUF9NQVhfREVDT0RFUl9DTlRdID0gewotCV9fQVRUUihkZWNvZGVyMCwgU19JUlVHTywgZGVjb2Rlcl9pbmZvX3Nob3csIE5VTEwpLAotCV9fQVRUUihkZWNvZGVyMSwgU19JUlVHTywgZGVjb2Rlcl9pbmZvX3Nob3csIE5VTEwpLAotCV9fQVRUUihkZWNvZGVyMiwgU19JUlVHTywgZGVjb2Rlcl9pbmZvX3Nob3csIE5VTEwpLAotCV9fQVRUUihkZWNvZGVyMywgU19JUlVHTywgZGVjb2Rlcl9pbmZvX3Nob3csIE5VTEwpLAotCV9fQVRUUihkZWNvZGVyNCwgU19JUlVHTywgZGVjb2Rlcl9pbmZvX3Nob3csIE5VTEwpLAotfTsKLQotc3RhdGljIHNzaXplX3QgZGVjb2Rlcl9pbmZvX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCWludCBjcHlfc3ogPSAwOwotCXN0cnVjdCBhdWRwcF9zdGF0ZSAqYXVkcHAgPSAmdGhlX2F1ZHBwX3N0YXRlOwotCWNvbnN0IHB0cmRpZmZfdCBvZmYgPSBhdHRyIC0gZGV2X2F0dHJfZGVjb2RlcjsJLyogZGVjb2RlciBudW1iZXIgKi8KLQltdXRleF9sb2NrKGF1ZHBwLT5sb2NrX2RlYyk7Ci0JY3B5X3N6ICs9IHNjbnByaW50ZihidWYgKyBjcHlfc3osIFBBR0VfU0laRSAtIGNweV9zeiwgIiVkOiIsCi0JCQkgICAgYXVkcHAtPmRlY19pbmZvX3RhYmxlW29mZl0uY29kZWMpOwotCWNweV9zeiArPSBzY25wcmludGYoYnVmICsgY3B5X3N6LCBQQUdFX1NJWkUgLSBjcHlfc3osICIlZFxuIiwKLQkJCSAgICBhdWRwcC0+ZGVjX2luZm9fdGFibGVbb2ZmXS5waWQpOwotCW11dGV4X3VubG9jayhhdWRwcC0+bG9ja19kZWMpOwotCXJldHVybiBjcHlfc3o7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihjb25jdXJyZW5jeSwgU19JV1VTUiB8IFNfSVJVR08sIGNvbmN1cnJlbmN5X3Nob3csCi0JICAgIGNvbmN1cnJlbmN5X3N0b3JlKTsKLXN0YXRpYyBpbnQgYXVkcHBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmMsIGlkeDsKLQlzdHJ1Y3QgYXVkcHBfc3RhdGUgKmF1ZHBwID0gJnRoZV9hdWRwcF9zdGF0ZTsKLQlhdWRwcC0+Y29uY3VycmVuY3kgPSBBVURQUF9DT05DVVJSRU5DWV9ERUZBVUxUOwotCWF1ZHBwLT5kZWNfZGF0YWJhc2UgPQotCSAgICAoc3RydWN0IG1zbV9hZHNwZGVjX2RhdGFiYXNlICopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQlNTV9JTkZPKCJOdW1iZXIgb2YgZGVjb2RlciBzdXBwb3J0ZWQgJWRcbiIsCi0JCQlhdWRwcC0+ZGVjX2RhdGFiYXNlLT5udW1fZGVjKTsKLQlNTV9JTkZPKCJOdW1iZXIgb2YgY29uY3VycmVuY3kgc3VwcG9ydGVkICVkXG4iLAotCQkJYXVkcHAtPmRlY19kYXRhYmFzZS0+bnVtX2NvbmN1cnJlbmN5X3N1cHBvcnQpOwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkcHAtPmV2ZW50X3dhaXQpOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmF1ZHBwLT5hdnN5bmNfbG9jayk7Ci0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IGF1ZHBwLT5kZWNfZGF0YWJhc2UtPm51bV9kZWM7IGlkeCsrKSB7Ci0JCWF1ZHBwLT5kZWNfaW5mb190YWJsZVtpZHhdLmNvZGVjID0gLTE7Ci0JCWF1ZHBwLT5kZWNfaW5mb190YWJsZVtpZHhdLnBpZCA9IDA7Ci0JCU1NX0lORk8oIm1vZHVsZV9uYW1lOiVzXG4iLAotCQkJYXVkcHAtPmRlY19kYXRhYmFzZS0+ZGVjX2luZm9fbGlzdFtpZHhdLm1vZHVsZV9uYW1lKTsKLQkJTU1fSU5GTygicXVldWVpZDolZFxuIiwKLQkJCWF1ZHBwLT5kZWNfZGF0YWJhc2UtPmRlY19pbmZvX2xpc3RbaWR4XS5tb2R1bGVfcXVldWVpZCk7Ci0JCU1NX0lORk8oImRlY2lkOiVkXG4iLAotCQkJYXVkcHAtPmRlY19kYXRhYmFzZS0+ZGVjX2luZm9fbGlzdFtpZHhdLm1vZHVsZV9kZWNpZCk7Ci0JCU1NX0lORk8oIm5yX2NvZGVjX3N1cHBvcnQ6JWRcbiIsCi0JCQlhdWRwcC0+ZGVjX2RhdGFiYXNlLT5kZWNfaW5mb19saXN0W2lkeF0uCi0JCQlucl9jb2RlY19zdXBwb3J0KTsKLQl9Ci0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IGF1ZHBwLT5kZWNfZGF0YWJhc2UtPm51bV9kZWM7IGlkeCsrKSB7Ci0JCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9kZWNvZGVyW2lkeF0pOwotCQlpZiAocmMpCi0JCQlnb3RvIGVycjsKLQl9Ci0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2NvbmN1cnJlbmN5KTsKLQlpZiAocmMpCi0JCWdvdG8gZXJyOwotCWVsc2UKLQkJZ290byBkb25lOwotZXJyOgotCXdoaWxlIChpZHgtLSkKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9kZWNvZGVyW2lkeF0pOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF1ZHBwX3BsYXRfZHJpdmVyID0gewotCS5wcm9iZSA9IGF1ZHBwX3Byb2JlLAotCS5kcml2ZXIgPSB7Ci0JCSAgIC5uYW1lID0gIm1zbV9hZHNwZGVjIiwKLQkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCSAgIH0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRwcF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXVkcHBfcGxhdF9kcml2ZXIpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoYXVkcHBfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRwcmVwcm9jLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRwcmVwcm9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZDkxNTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkcHJlcHJvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8qCi0gKiBDb21tb24gY29kZSB0byBkZWFsIHdpdGggdGhlIEFVRFBSRVBST0MgZHNwIHRhc2sgKGF1ZGlvIHByZXByb2Nlc3NpbmcpCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIEJhc2VkIG9uIHRoZSBhdWRwcCBsYXllciBpbiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRwcC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNS9xZHNwNWF1ZHByZXByb2MuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcmVjY21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19hY2RiaS5oPgotCi0KLXN0YXRpYyBERUZJTkVfTVVURVgoYXVkcHJlcHJvY19sb2NrKTsKLQotc3RydWN0IG1zbV9hZHNwZW5jX2luZm8gewotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIG1vZHVsZV9xdWV1ZWlkczsKLQlpbnQgbW9kdWxlX2VuY2lkOyAvKiBzdHJlYW1pZCAqLwotCWludCBlbmNfZm9ybWF0czsgLyogc3VwcG9ydGVkIGZvcm1hdHMgKi8KLQlpbnQgbnJfY29kZWNfc3VwcG9ydDsgLyogbnVtYmVyIG9mIGNvZGVjIHN1cG9ydGVkICovCi19OwotCi0jZGVmaW5lIEVOQ19NT0RVTEVfSU5GTyhuYW1lLCBxdWV1ZWlkcywgZW5jaWQsIGZvcm1hdHMsIG5yX2NvZGVjKSBcCi0Jey5tb2R1bGVfbmFtZSA9IG5hbWUsIC5tb2R1bGVfcXVldWVpZHMgPSBxdWV1ZWlkcywgXAotCSAubW9kdWxlX2VuY2lkID0gZW5jaWQsIC5lbmNfZm9ybWF0cyA9IGZvcm1hdHMsIFwKLQkgLm5yX2NvZGVjX3N1cHBvcnQgPSBucl9jb2RlYyB9Ci0KLSNpZmRlZiBDT05GSUdfTVNNN1gyN0FfQVVESU8KLSNkZWZpbmUgRU5DMF9GT1JNQVQgKCgxPDxBVURSRUNfQ01EX1RZUEVfMV9JTkRFWF9TQkMpfCBcCi0JCSgxPDxBVURSRUNfQ01EX1RZUEVfMF9JTkRFWF9BQUMpfCBcCi0JCSgxPDxBVURSRUNfQ01EX1RZUEVfMF9JTkRFWF9BTVJOQil8IFwKLQkJKDE8PEFVRFJFQ19DTURfVFlQRV8wX0lOREVYX0VWUkMpfCBcCi0JCSgxPDxBVURSRUNfQ01EX1RZUEVfMF9JTkRFWF9RQ0VMUCkpCi0KLSNkZWZpbmUgRU5DMV9GT1JNQVQgKDE8PEFVRFJFQ19DTURfVFlQRV8wX0lOREVYX1dBVikKLSNlbHNlCi0jZGVmaW5lIEVOQzBfRk9STUFUICgoMTw8QVVEUkVDX0NNRF9UWVBFXzBfSU5ERVhfV0FWKXwgXAotCQkoMTw8QVVEUkVDX0NNRF9UWVBFXzFfSU5ERVhfU0JDKXwgXAotCQkoMTw8QVVEUkVDX0NNRF9UWVBFXzBfSU5ERVhfQUFDKXwgXAotCQkoMTw8QVVEUkVDX0NNRF9UWVBFXzBfSU5ERVhfQU1STkIpfCBcCi0JCSgxPDxBVURSRUNfQ01EX1RZUEVfMF9JTkRFWF9FVlJDKXwgXAotCQkoMTw8QVVEUkVDX0NNRF9UWVBFXzBfSU5ERVhfUUNFTFApKQotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX0VOQ19DT1VOVCAyCi0jZGVmaW5lIE1BWF9FVkVOVF9DQUxMQkFDS19DTElFTlRTIDIKLQotc3RydWN0IG1zbV9hZHNwZW5jX2RhdGFiYXNlIHsKLQl1bnNpZ25lZCBudW1fZW5jOwotCXN0cnVjdCBtc21fYWRzcGVuY19pbmZvICplbmNfaW5mb19saXN0OwotfTsKLQotI2lmZGVmIENPTkZJR19NU003WDI3QV9BVURJTwotc3RhdGljIHN0cnVjdCBtc21fYWRzcGVuY19pbmZvIGVuY19pbmZvX2xpc3RbXSA9IHsKLQlFTkNfTU9EVUxFX0lORk8oIkFVRFJFQ1RBU0siLCBcCi0JCQkoKFFEU1BfdVBBdWRSZWNCaXRTdHJlYW1RdWV1ZSA8PCAxNil8IFwKLQkJCSAgUURTUF91UEF1ZFJlY0NtZFF1ZXVlKSwgMCwgXAotCQkJKEVOQzBfRk9STUFUIHwgKDEgPDwgTVNNX0FEU1BfRU5DX01PREVfVFVOTkVMKSB8IFwKLQkJCSgxIDw8IE1TTV9BRFNQX0VOQ19NT0RFX05PTl9UVU5ORUwpKSwgNSksCi0KLQlFTkNfTU9EVUxFX0lORk8oIkFVRFJFQzFUQVNLIiwgXAotCQkJKChRRFNQX3VQQXVkUmVjMUJpdFN0cmVhbVF1ZXVlIDw8IDE2KXwgXAotCQkJICBRRFNQX3VQQXVkUmVjMUNtZFF1ZXVlKSwgMSwgXAotCQkJKEVOQzFfRk9STUFUIHwgKDEgPDwgTVNNX0FEU1BfRU5DX01PREVfVFVOTkVMKSksIDEpLAotfTsKLSNlbHNlCi1zdGF0aWMgc3RydWN0IG1zbV9hZHNwZW5jX2luZm8gZW5jX2luZm9fbGlzdFtdID0gewotCUVOQ19NT0RVTEVfSU5GTygiQVVEUkVDVEFTSyIsCi0JCQkoKFFEU1BfdVBBdWRSZWNCaXRTdHJlYW1RdWV1ZSA8PCAxNil8IFwKLQkJCSAgUURTUF91UEF1ZFJlY0NtZFF1ZXVlKSwgMCwgXAotCQkJKEVOQzBfRk9STUFUIHwgKDEgPDwgTVNNX0FEU1BfRU5DX01PREVfVFVOTkVMKSksIDYpLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IG1zbV9hZHNwZW5jX2RhdGFiYXNlIG1zbV9lbmNfZGF0YWJhc2UgPSB7Ci0JLm51bV9lbmMgPSBBUlJBWV9TSVpFKGVuY19pbmZvX2xpc3QpLAotCS5lbmNfaW5mb19saXN0ID0gZW5jX2luZm9fbGlzdCwKLX07Ci0KLXN0cnVjdCBhdWRwcmVwcm9jX3N0YXRlIHsKLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2Q7Ci0JYXVkcHJlcHJvY19ldmVudF9mdW5jIGZ1bmNbTUFYX0VOQ19DT1VOVF07Ci0Jdm9pZCAqcHJpdmF0ZVtNQVhfRU5DX0NPVU5UXTsKLQlzdHJ1Y3QgbXV0ZXggKmxvY2s7Ci0JdW5zaWduZWQgb3Blbl9jb3VudDsKLQl1bnNpZ25lZCBlbmNfaW51c2U7Ci0Jc3RydWN0IGF1ZHByZXByb2NfZXZlbnRfY2FsbGJhY2sgKmNiX3RibFtNQVhfRVZFTlRfQ0FMTEJBQ0tfQ0xJRU5UU107Ci19OwotCi1zdGF0aWMgc3RydWN0IGF1ZHJlY19zZXNzaW9uX2luZm8gc2Vzc2lvbl9pbmZvOwotCi1zdGF0aWMgc3RydWN0IGF1ZHByZXByb2Nfc3RhdGUgdGhlX2F1ZHByZXByb2Nfc3RhdGUgPSB7Ci0JLmxvY2sgPSAmYXVkcHJlcHJvY19sb2NrLAotfTsKLQotLyogRFNQIHByZXByb2MgZXZlbnQgaGFuZGxlciAqLwotc3RhdGljIHZvaWQgYXVkcHJlcHJvY19kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgdm9pZCAoKmdldGV2ZW50KSh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRwcmVwcm9jX3N0YXRlICphdWRwcmVwcm9jID0gZGF0YTsKLQl1aW50MTZfdCBtc2dbMl07Ci0JTU1fRVJSKCJhdWRwcmVwcm9jX2RzcF9ldmVudCAlaWQiLCBpZCk7Ci0KLQlnZXRldmVudChtc2csIHNpemVvZihtc2cpKTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBSRVBST0NfTVNHX0NNRF9DRkdfRE9ORV9NU0c6Ci0JCU1NX0RCRygidHlwZSAlZCwgc3RhdHVzX2ZsYWcgJWRcbiIsIG1zZ1swXSwgbXNnWzFdKTsKLQkJaWYgKGF1ZHByZXByb2MtPmZ1bmNbMF0pCi0JCQlhdWRwcmVwcm9jLT5mdW5jWzBdKAotCQkJYXVkcHJlcHJvYy0+cHJpdmF0ZVswXSwgaWQsCi0JCQkmbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURQUkVQUk9DX01TR19FUlJPUl9NU0dfSUQ6Ci0JCU1NX0lORk8oImVycl9pbmRleCAlZFxuIiwgbXNnWzBdKTsKLQkJaWYgKGF1ZHByZXByb2MtPmZ1bmNbMF0pCi0JCQlhdWRwcmVwcm9jLT5mdW5jWzBdKAotCQkJYXVkcHJlcHJvYy0+cHJpdmF0ZVswXSwgaWQsCi0JCQkmbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRFNQX01FU1NBR0VfSUQ6Ci0JCU1NX0RCRygiUmVjZWl2ZWQgQURTUCBldmVudDogbW9kdWxlIGVuYWJsZShhdWRwcmVwcm9jdGFzaylcbiIpOwotCQlpZiAoYXVkcHJlcHJvYy0+ZnVuY1swXSkKLQkJCWF1ZHByZXByb2MtPmZ1bmNbMF0oCi0JCQlhdWRwcmVwcm9jLT5wcml2YXRlWzBdLCBpZCwKLQkJCSZtc2cpOwotCQlicmVhazsKLQljYXNlIEFVRFBSRVBST0NfTVNHX0ZFQVRfUVVFUllfRE1fRE9ORToKLQkgICB7Ci0JICAgIHVpbnQxNl90IG1zZ1szXTsKLQkgICAgZ2V0ZXZlbnQobXNnLCBzaXplb2YobXNnKSk7Ci0JICAgIE1NX0lORk8oIlJUQyBBQ0sgLS0+ICV4ICV4ICV4XG4iLCBtc2dbMF0sIG1zZ1sxXSwgbXNnWzJdKTsKLQkgICAgYWNkYl9ydGNfc2V0X2Vycihtc2dbMl0pOwotCSAgIH0KLQlicmVhazsKLQlkZWZhdWx0OgotCQlNTV9FUlIoInVua25vd24gZXZlbnQgJWRcbiIsIGlkKTsKLQl9Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9hZHNwX29wcyBhZHNwX29wcyA9IHsKLQkuZXZlbnQgPSBhdWRwcmVwcm9jX2RzcF9ldmVudCwKLX07Ci0KLS8qIEVYUE9SVEVEIEFQSSdzICovCi1pbnQgYXVkcHJlcHJvY19lbmFibGUoaW50IGVuY19pZCwgYXVkcHJlcHJvY19ldmVudF9mdW5jIGZ1bmMsIHZvaWQgKnByaXZhdGUpCi17Ci0Jc3RydWN0IGF1ZHByZXByb2Nfc3RhdGUgKmF1ZHByZXByb2MgPSAmdGhlX2F1ZHByZXByb2Nfc3RhdGU7Ci0JaW50IHJlcyA9IDA7Ci0JdWludDE2X3QgbXNnWzJdOwotCWludCBuID0gMDsKLQlNTV9EQkcoImF1ZHByZXByb2NfZW5hYmxlICVkXG4iLCBlbmNfaWQpOwotCi0JaWYgKGVuY19pZCA8IDAgfHwgZW5jX2lkID4gKE1BWF9FTkNfQ09VTlQgLSAxKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKGF1ZHByZXByb2MtPmxvY2spOwotCWlmIChhdWRwcmVwcm9jLT5mdW5jW2VuY19pZF0pIHsKLQkJcmVzID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlhdWRwcmVwcm9jLT5mdW5jW2VuY19pZF0gPSBmdW5jOwotCWF1ZHByZXByb2MtPnByaXZhdGVbZW5jX2lkXSA9IHByaXZhdGU7Ci0KLQkvKiBGaXJzdCBjbGllbnQgdG8gZW5hYmxlIHByZXByb2MgdGFzayAqLwotCWlmIChhdWRwcmVwcm9jLT5vcGVuX2NvdW50KysgPT0gMCkgewotCQlNTV9EQkcoIkdldCBBVURQUkVQUk9DVEFTS1xuIik7Ci0JCXJlcyA9IG1zbV9hZHNwX2dldCgiQVVEUFJFUFJPQ1RBU0siLCAmYXVkcHJlcHJvYy0+bW9kLAotCQkJCSZhZHNwX29wcywgYXVkcHJlcHJvYyk7Ci0JCWlmIChyZXMgPCAwKSB7Ci0JCQlNTV9FUlIoIkNhbiBub3QgZ2V0IEFVRFBSRVBST0NUQVNLXG4iKTsKLQkJCWF1ZHByZXByb2MtPm9wZW5fY291bnQgPSAwOwotCQkJYXVkcHJlcHJvYy0+ZnVuY1tlbmNfaWRdID0gTlVMTDsKLQkJCWF1ZHByZXByb2MtPnByaXZhdGVbZW5jX2lkXSA9IE5VTEw7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlpZiAobXNtX2Fkc3BfZW5hYmxlKGF1ZHByZXByb2MtPm1vZCkpIHsKLQkJCWF1ZHByZXByb2MtPm9wZW5fY291bnQgPSAwOwotCQkJYXVkcHJlcHJvYy0+ZnVuY1tlbmNfaWRdID0gTlVMTDsKLQkJCWF1ZHByZXByb2MtPnByaXZhdGVbZW5jX2lkXSA9IE5VTEw7Ci0JCQltc21fYWRzcF9wdXQoYXVkcHJlcHJvYy0+bW9kKTsKLQkJCWF1ZHByZXByb2MtPm1vZCA9IE5VTEw7Ci0JCQlyZXMgPSAtRU5PREVWOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0JbXNnWzBdID0gQVVEUFJFUFJPQ19NU0dfU1RBVFVTX0ZMQUdfRU5BOwotCS8qIEdlbmVyYXRlIGF1ZHByZSBlbmFibGVkIG1lc3NhZ2UgZm9yIHJlZ2lzdGVyZWQgY2xpZW50cyAqLwotCWZvciAobiA9IDA7IG4gPCBNQVhfRVZFTlRfQ0FMTEJBQ0tfQ0xJRU5UUzsgKytuKSB7Ci0JCQlpZiAoYXVkcHJlcHJvYy0+Y2JfdGJsW25dICYmCi0JCQkJCWF1ZHByZXByb2MtPmNiX3RibFtuXS0+Zm4pIHsKLQkJCQlhdWRwcmVwcm9jLT5jYl90Ymxbbl0tPmZuKCBcCi0JCQkJCQlhdWRwcmVwcm9jLT5jYl90Ymxbbl0tPnByaXZhdGUsXAotCQkJCQkJQVVEUFJFUFJPQ19NU0dfQ01EX0NGR19ET05FX01TRywKLQkJCQkJCSh2b2lkICopICZtc2cpOwotCQkJfQotCX0KLQlyZXMgPSAwOwotb3V0OgotCW11dGV4X3VubG9jayhhdWRwcmVwcm9jLT5sb2NrKTsKLQlyZXR1cm4gcmVzOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcmVwcm9jX2VuYWJsZSk7Ci0KLQotdm9pZCBhdWRwcmVwcm9jX2Rpc2FibGUoaW50IGVuY19pZCwgdm9pZCAqcHJpdmF0ZSkKLXsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19zdGF0ZSAqYXVkcHJlcHJvYyA9ICZ0aGVfYXVkcHJlcHJvY19zdGF0ZTsKLQl1aW50MTZfdCBtc2dbMl07Ci0JaW50IG4gPSAwOwotCi0JaWYgKGVuY19pZCA8IDAgfHwgZW5jX2lkID4gKE1BWF9FTkNfQ09VTlQgLSAxKSkKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jayhhdWRwcmVwcm9jLT5sb2NrKTsKLQlpZiAoIWF1ZHByZXByb2MtPmZ1bmNbZW5jX2lkXSkKLQkJZ290byBvdXQ7Ci0JaWYgKGF1ZHByZXByb2MtPnByaXZhdGVbZW5jX2lkXSAhPSBwcml2YXRlKQotCQlnb3RvIG91dDsKLQotCWF1ZHByZXByb2MtPmZ1bmNbZW5jX2lkXSA9IE5VTEw7Ci0JYXVkcHJlcHJvYy0+cHJpdmF0ZVtlbmNfaWRdID0gTlVMTDsKLQotCS8qIExhc3QgY2xpZW50IHRoZW4gZGlzYWJsZSBwcmVwcm9jIHRhc2sgKi8KLQlpZiAoLS1hdWRwcmVwcm9jLT5vcGVuX2NvdW50ID09IDApIHsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRwcmVwcm9jLT5tb2QpOwotCQlNTV9EQkcoIlB1dCBBVURQUkVQUk9DVEFTS1xuIik7Ci0JCW1zbV9hZHNwX3B1dChhdWRwcmVwcm9jLT5tb2QpOwotCQlhdWRwcmVwcm9jLT5tb2QgPSBOVUxMOwotCX0KLQltc2dbMF0gPSBBVURQUkVQUk9DX01TR19TVEFUVVNfRkxBR19ESVM7Ci0JLyogR2VuZXJhdGUgYXVkcHJlIGVuYWJsZWQgbWVzc2FnZSBmb3IgcmVnaXN0ZXJlZCBjbGllbnRzICovCi0JZm9yIChuID0gMDsgbiA8IE1BWF9FVkVOVF9DQUxMQkFDS19DTElFTlRTOyArK24pIHsKLQkJCWlmIChhdWRwcmVwcm9jLT5jYl90Ymxbbl0gJiYKLQkJCQkJYXVkcHJlcHJvYy0+Y2JfdGJsW25dLT5mbikgewotCQkJCWF1ZHByZXByb2MtPmNiX3RibFtuXS0+Zm4oIFwKLQkJCQkJCWF1ZHByZXByb2MtPmNiX3RibFtuXS0+cHJpdmF0ZSxcCi0JCQkJCQlBVURQUkVQUk9DX01TR19DTURfQ0ZHX0RPTkVfTVNHLAotCQkJCQkJKHZvaWQgKikgJm1zZyk7Ci0JCQl9Ci0JfQotb3V0OgotCW11dGV4X3VubG9jayhhdWRwcmVwcm9jLT5sb2NrKTsKLQlyZXR1cm47Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHByZXByb2NfZGlzYWJsZSk7Ci0KLWludCBhdWRwcmVwcm9jX3VwZGF0ZV9hdWRyZWNfaW5mbygKLQkJCXN0cnVjdCBhdWRyZWNfc2Vzc2lvbl9pbmZvICphdWRyZWNfc2Vzc2lvbl9pbmZvKQotewotCWlmICghYXVkcmVjX3Nlc3Npb25faW5mbykgewotCQlNTV9FUlIoImVycm9yIGluIGF1ZHJlYyBzZXNzaW9uIGluZm8gYWRkcmVzc1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoYXVkcmVjX3Nlc3Npb25faW5mby0+c2Vzc2lvbl9pZCA8IE1BWF9FTkNfQ09VTlQpIHsKLQkJbWVtY3B5KCZzZXNzaW9uX2luZm8sCi0JCQkJYXVkcmVjX3Nlc3Npb25faW5mbywKLQkJCQlzaXplb2Yoc3RydWN0IGF1ZHJlY19zZXNzaW9uX2luZm8pKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcmVwcm9jX3VwZGF0ZV9hdWRyZWNfaW5mbyk7Ci0KLWludCBnZXRfYXVkcmVjX3Nlc3Npb25faW5mbyhzdHJ1Y3QgYXVkcmVjX3Nlc3Npb25faW5mbyAqaW5mbykKLXsKLQlpZiAoIWluZm8pIHsKLQkJTU1fRVJSKCJlcnJvciBpbiBhdWRyZWMgc2Vzc2lvbiBpbmZvIGFkZHJlc3NcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodGhlX2F1ZHByZXByb2Nfc3RhdGUub3Blbl9jb3VudCA9PSAwKSB7Ci0JCU1NX0VSUigiTm8gYXVkIHByZSBzZXNzaW9uIGFjdGl2ZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW1lbWNweShpbmZvLCAmc2Vzc2lvbl9pbmZvLCBzaXplb2Yoc3RydWN0IGF1ZHJlY19zZXNzaW9uX2luZm8pKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChnZXRfYXVkcmVjX3Nlc3Npb25faW5mbyk7Ci0KLWludCBhdWRwcmVwcm9jX3JlZ2lzdGVyX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBhdWRwcmVwcm9jX2V2ZW50X2NhbGxiYWNrICplY2IpCi17Ci0Jc3RydWN0IGF1ZHByZXByb2Nfc3RhdGUgKmF1ZHByZXByb2MgPSAmdGhlX2F1ZHByZXByb2Nfc3RhdGU7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0VWRU5UX0NBTExCQUNLX0NMSUVOVFM7ICsraSkgewotCQlpZiAoTlVMTCA9PSBhdWRwcmVwcm9jLT5jYl90YmxbaV0pIHsKLQkJCWF1ZHByZXByb2MtPmNiX3RibFtpXSA9IGVjYjsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcmVwcm9jX3JlZ2lzdGVyX2V2ZW50X2NhbGxiYWNrKTsKLQotaW50IGF1ZHByZXByb2NfdW5yZWdpc3Rlcl9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYXVkcHJlcHJvY19ldmVudF9jYWxsYmFjayAqZWNiKQotewotCXN0cnVjdCBhdWRwcmVwcm9jX3N0YXRlICphdWRwcmVwcm9jID0gJnRoZV9hdWRwcmVwcm9jX3N0YXRlOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9FVkVOVF9DQUxMQkFDS19DTElFTlRTOyArK2kpIHsKLQkJaWYgKGVjYiA9PSBhdWRwcmVwcm9jLT5jYl90YmxbaV0pIHsKLQkJCWF1ZHByZXByb2MtPmNiX3RibFtpXSA9IE5VTEw7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLS8qIGVuY190eXBlID0gc3VwcG9ydGVkIGVuY29kZSBmb3JtYXQgKgotICogbGlrZSBwY20sIGFhYywgc2JjLCBldnJjLCBxY2VscCwgYW1ybmIgZXRjIC4uLiAqCi0gKi8KLWludCBhdWRwcmVwcm9jX2FlbmNfYWxsb2ModW5zaWduZWQgZW5jX3R5cGUsIGNvbnN0IGNoYXIgKiptb2R1bGVfbmFtZSwKLQkJICAgICB1bnNpZ25lZCAqcXVldWVfaWRzKQotewotCXN0cnVjdCBhdWRwcmVwcm9jX3N0YXRlICphdWRwcmVwcm9jID0gJnRoZV9hdWRwcmVwcm9jX3N0YXRlOwotCWludCBlbmNpZCA9IC0xLCBpZHgsIGxpZHgsIG1vZGUsIGNvZGVjOwotCWludCBjb2RlY3Nfc3VwcG9ydGVkLCBtaW5fY29kZWNzX3N1cHBvcnRlZDsKLQotCW11dGV4X2xvY2soYXVkcHJlcHJvYy0+bG9jayk7Ci0JLyogUmVwcmVzZW50cyBpbiBiaXQgbWFzayAqLwotCW1vZGUgPSAoKGVuY190eXBlICYgQVVEUFJFUFJPQ19NT0RFX01BU0spIDw8IDE2KTsKLQljb2RlYyA9ICgxIDw8IChlbmNfdHlwZSAmIEFVRFBSRVBST0NfQ09ERUNfTUFTSykpOwotCi0JbGlkeCA9IG1zbV9lbmNfZGF0YWJhc2UubnVtX2VuYzsKLQltaW5fY29kZWNzX3N1cHBvcnRlZCA9IHNpemVvZih1bnNpZ25lZCBpbnQpICogODsKLQlNTV9EQkcoIm1vZGUgPSAweCUwOHggY29kZWMgPSAweCUwOHhcbiIsIG1vZGUsIGNvZGVjKTsKLQotCWZvciAoaWR4ID0gbGlkeC0xOyBpZHggPj0gMDsgaWR4LS0pIHsKLQkJLyogZW5jb2RlciBmcmVlIGFuZCBzdXBwb3J0cyB0aGUgZm9ybWF0ICovCi0JCWlmICghKGF1ZHByZXByb2MtPmVuY19pbnVzZSAmICgxIDw8IChpZHgpKSkgJiYKLQkJKChtb2RlICYgbXNtX2VuY19kYXRhYmFzZS5lbmNfaW5mb19saXN0W2lkeF0uZW5jX2Zvcm1hdHMpCi0JCT09IG1vZGUpICYmICgoY29kZWMgJgotCQltc21fZW5jX2RhdGFiYXNlLmVuY19pbmZvX2xpc3RbaWR4XS5lbmNfZm9ybWF0cykKLQkJPT0gY29kZWMpKXsKLQkJCS8qIENoZWNrIHN1cHBvcnRzIG1pbmltdW0gbnVtYmVyIGNvZGVjcyAqLwotCQkJY29kZWNzX3N1cHBvcnRlZCA9Ci0JCQltc21fZW5jX2RhdGFiYXNlLmVuY19pbmZvX2xpc3RbaWR4XS5ucl9jb2RlY19zdXBwb3J0OwotCQkJaWYgKGNvZGVjc19zdXBwb3J0ZWQgPCBtaW5fY29kZWNzX3N1cHBvcnRlZCkgewotCQkJCWxpZHggPSBpZHg7Ci0JCQkJbWluX2NvZGVjc19zdXBwb3J0ZWQgPSBjb2RlY3Nfc3VwcG9ydGVkOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKGxpZHggPCBtc21fZW5jX2RhdGFiYXNlLm51bV9lbmMpIHsKLQkJYXVkcHJlcHJvYy0+ZW5jX2ludXNlIHw9ICgxIDw8IGxpZHgpOwotCQkqbW9kdWxlX25hbWUgPQotCQkgICAgbXNtX2VuY19kYXRhYmFzZS5lbmNfaW5mb19saXN0W2xpZHhdLm1vZHVsZV9uYW1lOwotCQkqcXVldWVfaWRzID0KLQkJICAgIG1zbV9lbmNfZGF0YWJhc2UuZW5jX2luZm9fbGlzdFtsaWR4XS5tb2R1bGVfcXVldWVpZHM7Ci0JCWVuY2lkID0gbXNtX2VuY19kYXRhYmFzZS5lbmNfaW5mb19saXN0W2xpZHhdLm1vZHVsZV9lbmNpZDsKLQl9Ci0KLQltdXRleF91bmxvY2soYXVkcHJlcHJvYy0+bG9jayk7Ci0JcmV0dXJuIGVuY2lkOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcmVwcm9jX2FlbmNfYWxsb2MpOwotCi12b2lkIGF1ZHByZXByb2NfYWVuY19mcmVlKGludCBlbmNfaWQpCi17Ci0Jc3RydWN0IGF1ZHByZXByb2Nfc3RhdGUgKmF1ZHByZXByb2MgPSAmdGhlX2F1ZHByZXByb2Nfc3RhdGU7Ci0JaW50IGlkeDsKLQotCW11dGV4X2xvY2soYXVkcHJlcHJvYy0+bG9jayk7Ci0JZm9yIChpZHggPSAwOyBpZHggPCBtc21fZW5jX2RhdGFiYXNlLm51bV9lbmM7IGlkeCsrKSB7Ci0JCWlmIChtc21fZW5jX2RhdGFiYXNlLmVuY19pbmZvX2xpc3RbaWR4XS5tb2R1bGVfZW5jaWQgPT0KLQkJICAgIGVuY19pZCkgewotCQkJYXVkcHJlcHJvYy0+ZW5jX2ludXNlICY9IH4oMSA8PCBpZHgpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKGF1ZHByZXByb2MtPmxvY2spOwotCXJldHVybjsKLQotfQotRVhQT1JUX1NZTUJPTChhdWRwcmVwcm9jX2FlbmNfZnJlZSk7Ci0KLWludCBhdWRwcmVwcm9jX2RzcF9zZXRfYWdjKAotCQlhdWRwcmVwcm9jX2NtZF9jZmdfYWdjX3BhcmFtcyAqYWdjX2NmZywKLQkJdW5zaWduZWQgbGVuKQotewotCXJldHVybiBtc21fYWRzcF93cml0ZSh0aGVfYXVkcHJlcHJvY19zdGF0ZS5tb2QsCi0JCQlRRFNQX3VQQXVkUHJlUHJvY0NtZFF1ZXVlLCBhZ2NfY2ZnLCBsZW4pOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcmVwcm9jX2RzcF9zZXRfYWdjKTsKLQotaW50IGF1ZHByZXByb2NfZHNwX3NldF9ucygKLQlhdWRwcmVwcm9jX2NtZF9jZmdfbnNfcGFyYW1zICpuc19jZmcsCi0JdW5zaWduZWQgbGVuKQotewotCXJldHVybiBtc21fYWRzcF93cml0ZSh0aGVfYXVkcHJlcHJvY19zdGF0ZS5tb2QsCi0JCQlRRFNQX3VQQXVkUHJlUHJvY0NtZFF1ZXVlLCBuc19jZmcsIGxlbik7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHByZXByb2NfZHNwX3NldF9ucyk7Ci0KLWludCBhdWRwcmVwcm9jX2RzcF9zZXRfaWlyKAotCQlhdWRwcmVwcm9jX2NtZF9jZmdfaWlyX3R1bmluZ19maWx0ZXJfcGFyYW1zICppaXJfY2ZnLAotCQl1bnNpZ25lZCBsZW4pCi17Ci0JcmV0dXJuIG1zbV9hZHNwX3dyaXRlKHRoZV9hdWRwcmVwcm9jX3N0YXRlLm1vZCwKLQkJCVFEU1BfdVBBdWRQcmVQcm9jQ21kUXVldWUsIGlpcl9jZmcsIGxlbik7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHByZXByb2NfZHNwX3NldF9paXIpOwotCi1pbnQgYXVkcHJlcHJvY19zZW5kX3ByZXByb2NjbWRxdWV1ZSh2b2lkICpjbWQsIHVuc2lnbmVkIGxlbikKLXsKLQlyZXR1cm4gbXNtX2Fkc3Bfd3JpdGUodGhlX2F1ZHByZXByb2Nfc3RhdGUubW9kLAotCQkJUURTUF91UEF1ZFByZVByb2NDbWRRdWV1ZSwgY21kLCBsZW4pOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcmVwcm9jX3NlbmRfcHJlcHJvY2NtZHF1ZXVlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2F1ZHJlYy5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkcmVjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMzQ1MTguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkcmVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkcmVjLmMKLSAqCi0gKiBjb21tb24gY29kZSB0byBkZWFsIHdpdGggdGhlIEFVRFJFQyBkc3AgdGFzayAoYXVkaW8gcmVjb3JkaW5nKQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOSwyMDEyIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIEJhc2VkIG9uIHRoZSBhdWRwcCBsYXllciBpbiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRwcC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBmaW5kIGl0IGF0IGh0dHA6Ly93d3cuZnNmLm9yZy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9hZHNwLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcmVjY21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRyZWNtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHJlcHJvYy5oPgotCi0jaW5jbHVkZSAiYXVkbWdyLmgiCi0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi1zdGF0aWMgREVGSU5FX01VVEVYKGF1ZHJlY19sb2NrKTsKLQotI2RlZmluZSBNQVhfRU5DX0NPVU5UIDggLyogTWF4IGVuY29kZXIgc3VwcG9ydGVkICovCi0KLSNkZWZpbmUgRU5DX1NFU1NJT05fRlJFRSAwCi0jZGVmaW5lIEVOQ19TRVNTSU9OX0FDVElWRSAxCi0KLXN0cnVjdCBlbmNfc2Vzc2lvbiB7Ci0JdW5zaWduZWQgZW5jX3R5cGU7ICAvKiBQYXJhbSB0byBpZGVudGlmeSB0eXBlIG9mIGVuY29kZXIgKi8KLQl1bnNpZ25lZCBhdWRyZWNfb2JqX2lkeDsgIC8qIFBhcmFtIHRvIGlkZW50aWZ5IFJFQ19PQkogb3IgU2Vzc2lvbiBJRCAqLwotCWF1ZHJlY19ldmVudF9mdW5jIGV2ZW50X2Z1bmM7IC8qIEV2ZW50IENhbGwgYmFjawotCQkJCQlyb3V0aW5lIGZvciB0aGUgZW5jb2RlciAqLwotCXZvaWQgKnByaXZhdGU7CS8qIHByaXZhdGUgZGF0YSBlbGVtZW50IHBhc3NlZCBhcwotCQkJCXBhcnQgb2YgRXZlbnQgQ2FsbCBiYWNrICByb3V0aW5lICovCi0JdW5zaWduZWQgc3RhdGU7IC8qIEN1cnJlbnQgc3RhdGUgb2YgdGhlIGVuY29kZXIgc2Vzc2lvbiAsCi0JCQkJZnJlZSwgYWN0aXZlKi8KLX07Ci0KLXN0cnVjdCBhdWRyZWNfc3RhdGUgewotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKmF1ZHJlY19tb2Q7Ci0Jc3RydWN0IGVuY19zZXNzaW9uIGVuY19zZXNzaW9uW01BWF9FTkNfQ09VTlRdOwotCXN0cnVjdCBtdXRleCAqbG9jazsKLQl1bnNpZ25lZCBlbmNfY291bnQ7Ci19OwotCi1zdHJ1Y3QgYXVkcmVjX3N0YXRlIHRoZV9hdWRyZWNfc3RhdGUgPSB7Ci0JLmxvY2sgPSAmYXVkcmVjX2xvY2ssCi19OwotCi1pbnQgYXVkcmVjdGFza19zZW5kX2NtZHF1ZXVlKHZvaWQgKmNtZCwgdW5zaWduZWQgbGVuKQotewotCXJldHVybiBtc21fYWRzcF93cml0ZSh0aGVfYXVkcmVjX3N0YXRlLmF1ZHJlY19tb2QsCi0JCQkJUURTUF91UEF1ZFJlY0NtZFF1ZXVlLCBjbWQsIGxlbik7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHJlY3Rhc2tfc2VuZF9jbWRxdWV1ZSk7Ci0KLWludCBhdWRyZWN0YXNrX3NlbmRfYml0c3RyZWFtcXVldWUodm9pZCAqY21kLCB1bnNpZ25lZCBsZW4pCi17Ci0JcmV0dXJuIG1zbV9hZHNwX3dyaXRlKHRoZV9hdWRyZWNfc3RhdGUuYXVkcmVjX21vZCwKLQkJCQlRRFNQX3VQQXVkUmVjQml0U3RyZWFtUXVldWUsIGNtZCwgbGVuKTsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcmVjdGFza19zZW5kX2JpdHN0cmVhbXF1ZXVlKTsKLQotc3RhdGljIHZvaWQgYXVkcmVjdGFza19kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgdm9pZCAoKmdldGV2ZW50KSh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRyZWNfc3RhdGUgKmF1ZHJlYyA9IGRhdGE7Ci0JaW50IGNudDsKLQl1aW50MTZfdCBtc2dbNV07IC8qIE1heCBzaXplIG9mIG1lc3NhZ2UgKi8KLQlnZXRldmVudChtc2csIGxlbik7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURSRUNfTVNHX0NNRF9DRkdfRE9ORV9NU0c6IHsKLQkJTU1fREJHKCJDTUQgQ0ZHIERPTkUgJXhcbiIsIG1zZ1sxXSk7Ci0JCWlmIChtc2dbMF0gJiBBVURSRUNfTVNHX0NGR19ET05FX0VOQ19FTkEpIHsKLQkJCWZvciAoY250ID0gMDsgY250IDwgTUFYX0VOQ19DT1VOVCA7IGNudCsrKSB7Ci0JCQkJaWYgKGF1ZHJlYy0+ZW5jX3Nlc3Npb25bY250XS5lbmNfdHlwZSA9PQotCQkJCQkobXNnWzBdICYgQVVEUkVDX0NNRF9FTkNfVFlQRV9NQVNLKSkgewotCQkJCQlhdWRyZWMtPmVuY19zZXNzaW9uW2NudF0uYXVkcmVjX29ial9pZHgKLQkJCQkJID0gbXNnWzFdOwotCQkJCQlhdWRyZWMtPmVuY19zZXNzaW9uW2NudF0uZXZlbnRfZnVuYygKLQkJCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLnByaXZhdGUsIGlkLAotCQkJCQltc2cpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGNudCA9IDA7IGNudCA8IE1BWF9FTkNfQ09VTlQgOyBjbnQrKykgewotCQkJCWlmIChhdWRyZWMtPmVuY19zZXNzaW9uW2NudF0uZW5jX3R5cGUgPT0KLQkJCQkJKG1zZ1swXSAmIEFVRFJFQ19DTURfRU5DX1RZUEVfTUFTSykpIHsKLQkJCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLmV2ZW50X2Z1bmMoCi0JCQkJCWF1ZHJlYy0+ZW5jX3Nlc3Npb25bY250XS5wcml2YXRlLCBpZCwKLQkJCQkJbXNnKTsKLQkJCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLmF1ZHJlY19vYmpfaWR4Ci0JCQkJCT0gMHhGRkZGRkZGRjsKLQkJCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLnN0YXRlCi0JCQkJCT0gRU5DX1NFU1NJT05fRlJFRTsKLQkJCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLmVuY190eXBlCi0JCQkJCT0gMHhGRkZGRkZGRjsKLQkJCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLmV2ZW50X2Z1bmMKLQkJCQkJPSBOVUxMOwotCQkJCQlhdWRyZWMtPmVuY19zZXNzaW9uW2NudF0ucHJpdmF0ZQotCQkJCQk9IE5VTEw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfTVNHX0NNRF9BUkVDX01FTV9DRkdfRE9ORV9NU0c6IHsKLQkJTU1fREJHKCJDTUQgQVJFQyBNRU0gQ0ZHIERPTkUgJXhcbiIsIG1zZ1swXSk7Ci0JCWZvciAoY250ID0gMDsgY250IDwgTUFYX0VOQ19DT1VOVCA7IGNudCsrKSB7Ci0JCQlpZiAoYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLmF1ZHJlY19vYmpfaWR4ID09Ci0JCQkJbXNnWzBdKSB7Ci0JCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLmV2ZW50X2Z1bmMoCi0JCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLnByaXZhdGUsIGlkLCBtc2cpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19NU0dfQ01EX0FSRUNfUEFSQU1fQ0ZHX0RPTkVfTVNHOiB7Ci0JCU1NX0RCRygiQ01EIEFSRUMgUEFSQU0gQ0ZHIERPTkUgJXhcbiIsIG1zZ1swXSk7Ci0JCWZvciAoY250ID0gMDsgY250IDwgTUFYX0VOQ19DT1VOVCA7IGNudCsrKSB7Ci0JCQlpZiAoYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLmF1ZHJlY19vYmpfaWR4ID09Ci0JCQkJbXNnWzBdKSB7Ci0JCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLmV2ZW50X2Z1bmMoCi0JCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLnByaXZhdGUsIGlkLCBtc2cpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19NU0dfUEFDS0VUX1JFQURZX01TRzogewotCQlNTV9EQkcoIlBDSyBSRUFEWSAleFxuIiwgbXNnWzBdKTsKLQkJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhfRU5DX0NPVU5UIDsgY250KyspIHsKLQkJCWlmIChhdWRyZWMtPmVuY19zZXNzaW9uW2NudF0uYXVkcmVjX29ial9pZHggPT0KLQkJCQltc2dbMF0pIHsKLQkJCQlhdWRyZWMtPmVuY19zZXNzaW9uW2NudF0uZXZlbnRfZnVuYygKLQkJCQlhdWRyZWMtPmVuY19zZXNzaW9uW2NudF0ucHJpdmF0ZSwgaWQsIG1zZyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX01TR19GQVRBTF9FUlJfTVNHOiB7Ci0JCU1NX0VSUigiRVJST1IgJXhcbiIsIG1zZ1swXSk7Ci0JCWlmIChtc2dbMV0gJiBBVURSRUNfTVNHX0ZBVEFMX0VSUl9UWVBFXzApIHsKLQkJCWZvciAoY250ID0gMDsgY250IDwgTUFYX0VOQ19DT1VOVCA7IGNudCsrKSB7Ci0JCQkJaWYgKGF1ZHJlYy0+ZW5jX3Nlc3Npb25bY250XS5hdWRyZWNfb2JqX2lkeCA9PQotCQkJCQltc2dbMF0pIHsKLQkJCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLmV2ZW50X2Z1bmMoCi0JCQkJCWF1ZHJlYy0+ZW5jX3Nlc3Npb25bY250XS5wcml2YXRlLCBpZCwKLQkJCQkJbXNnKTsKLQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobXNnWzFdICYgQVVEUkVDX01TR19GQVRBTF9FUlJfVFlQRV8xKSB7Ci0JCQljbnQgPSBhdWRyZWMtPmVuY19jb3VudC0xOwotCQkJaWYgKGF1ZHJlYy0+ZW5jX3Nlc3Npb25bY250XS5ldmVudF9mdW5jKQotCQkJCWF1ZHJlYy0+ZW5jX3Nlc3Npb25bY250XS5ldmVudF9mdW5jKAotCQkJCWF1ZHJlYy0+ZW5jX3Nlc3Npb25bY250XS5wcml2YXRlLCBpZCwKLQkJCQltc2cpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFEU1BfTUVTU0FHRV9JRDoKLQkJTU1fREJHKCJSZWNlaXZlZCBBRFNQIGV2ZW50OiBtb2R1bGUgXAotCQkJCWVuYWJsZS9kaXNhYmxlKGF1ZHJlY3Rhc2spXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJ1bmtub3duIGV2ZW50ICVkXG4iLCBpZCk7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9hZHNwX29wcyBhZHNwX29wcyA9IHsKLQkuZXZlbnQgPSBhdWRyZWN0YXNrX2RzcF9ldmVudCwKLX07Ci0KLWludCBhdWRyZWN0YXNrX2VuYWJsZSh1bnNpZ25lZCBlbmNfdHlwZSwgYXVkcmVjX2V2ZW50X2Z1bmMgZnVuYywgdm9pZCAqcHJpdmF0ZSkKLXsKLQlzdHJ1Y3QgYXVkcmVjX3N0YXRlICphdWRyZWMgPSAmdGhlX2F1ZHJlY19zdGF0ZTsKLQlpbnQgY250LCByYyA9IDA7Ci0KLQltdXRleF9sb2NrKGF1ZHJlYy0+bG9jayk7Ci0KLQlpZiAoYXVkcmVjLT5lbmNfY291bnQrKyA9PSAwKSB7Ci0JCU1NX0RCRygiZW5hYmxlXG4iKTsKLQkJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhfRU5DX0NPVU5UIDsgY250KyspIHsKLQkJCWlmIChhdWRyZWMtPmVuY19zZXNzaW9uW2NudF0uc3RhdGUgPT0KLQkJCQlFTkNfU0VTU0lPTl9GUkVFKSB7Ci0JCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLnN0YXRlID0KLQkJCQlFTkNfU0VTU0lPTl9BQ1RJVkU7Ci0JCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLmVuY190eXBlID0gZW5jX3R5cGU7Ci0JCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLmV2ZW50X2Z1bmMgPSBmdW5jOwotCQkJCWF1ZHJlYy0+ZW5jX3Nlc3Npb25bY250XS5wcml2YXRlID0gcHJpdmF0ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyYyA9IG1zbV9hZHNwX2dldCgiQVVEUkVDVEFTSyIsICZhdWRyZWMtPmF1ZHJlY19tb2QsICZhZHNwX29wcywKLQkJCQkJYXVkcmVjKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJTU1fRVJSKCJjYW5ub3Qgb3BlbiBBVURSRUNUQVNLXG4iKTsKLQkJCWF1ZHJlYy0+ZW5jX2NvdW50ID0gMDsKLQkJCWF1ZHJlYy0+ZW5jX3Nlc3Npb25bY250XS5zdGF0ZSA9IEVOQ19TRVNTSU9OX0ZSRUU7Ci0JCQlhdWRyZWMtPmVuY19zZXNzaW9uW2NudF0uZW5jX3R5cGUgPSAweEZGRkZGRkZGOwotCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLmV2ZW50X2Z1bmMgPSBOVUxMOwotCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLnByaXZhdGUgPSBOVUxMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJbXNtX2Fkc3BfZW5hYmxlKGF1ZHJlYy0+YXVkcmVjX21vZCk7Ci0JfSBlbHNlIHsKLQkJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhfRU5DX0NPVU5UIDsgY250KyspIHsKLQkJCWlmIChhdWRyZWMtPmVuY19zZXNzaW9uW2NudF0uc3RhdGUgPT0KLQkJCQlFTkNfU0VTU0lPTl9GUkVFKSB7Ci0JCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLnN0YXRlID0KLQkJCQlFTkNfU0VTU0lPTl9BQ1RJVkU7Ci0JCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLmVuY190eXBlID0gZW5jX3R5cGU7Ci0JCQkJYXVkcmVjLT5lbmNfc2Vzc2lvbltjbnRdLmV2ZW50X2Z1bmMgPSBmdW5jOwotCQkJCWF1ZHJlYy0+ZW5jX3Nlc3Npb25bY250XS5wcml2YXRlID0gcHJpdmF0ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlpZiAoY250ID09IE1BWF9FTkNfQ09VTlQpCi0JCXJjID0gLUVCVVNZOwotCWVsc2UKLQkJcmMgPSAwOwotCi1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKGF1ZHJlYy0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTChhdWRyZWN0YXNrX2VuYWJsZSk7Ci0KLXZvaWQgYXVkcmVjdGFza19kaXNhYmxlKHVuc2lnbmVkIGVuY190eXBlLCB2b2lkICpwcml2YXRlKQotewotCXN0cnVjdCBhdWRyZWNfc3RhdGUgKmF1ZHJlYyA9ICZ0aGVfYXVkcmVjX3N0YXRlOwotCi0JbXV0ZXhfbG9jayhhdWRyZWMtPmxvY2spOwotCi0JaWYgKC0tYXVkcmVjLT5lbmNfY291bnQgPT0gMCkgewotCQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCQltc21fYWRzcF9kaXNhYmxlKGF1ZHJlYy0+YXVkcmVjX21vZCk7Ci0JCW1zbV9hZHNwX3B1dChhdWRyZWMtPmF1ZHJlY19tb2QpOwotCQlhdWRyZWMtPmF1ZHJlY19tb2QgPSBOVUxMOwotCX0KLQotCW11dGV4X3VubG9jayhhdWRyZWMtPmxvY2spOwotfQotRVhQT1JUX1NZTUJPTChhdWRyZWN0YXNrX2Rpc2FibGUpOwotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9kc3BfZGVidWcuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2RzcF9kZWJ1Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTczYTYwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2RzcF9kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLQotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9pb21hcC5oPgotCi0jaW5jbHVkZSAiZHNwX2RlYnVnLmgiCi0KLXN0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBkc3Bfd2FpdDsKLXN0YXRpYyBpbnQgZHNwX2hhc19jcmFzaGVkOwotc3RhdGljIGludCBkc3Bfd2FpdF9jb3VudDsKLQotc3RhdGljIGF0b21pY190IGRzcF9jcmFzaF9jb3VudCA9IEFUT01JQ19JTklUKDApOwotc3RhdGljIGRzcF9zdGF0ZV9jYiBjYl9wdHI7Ci0KLSNkZWZpbmUgTUFYX0xFTiA2NAotI2RlZmluZSBIRFJfTEVOIDIwCi0jZGVmaW5lIE5VTV9EU1BfUkFNX0JBTktTIDMKLQotc3RhdGljIGNoYXIgbF9idWZbTUFYX0xFTl07Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZHNwX2RlbnRyeTsKLSNlbmRpZgotCi12b2lkIHE1YXVkaW9fZHNwX25vdF9yZXNwb25kaW5nKHZvaWQpCi17Ci0JaWYgKGNiX3B0cikKLQkJY2JfcHRyKERTUF9TVEFURV9DUkFTSEVEKTsKLQotCU1NX0RCRygiZW50ZXJlZCBxNWF1ZGlvX2RzcF9ub3RfcmVzcG9uZGluZ1xuIik7Ci0JaWYgKGF0b21pY19hZGRfcmV0dXJuKDEsICZkc3BfY3Jhc2hfY291bnQpICE9IDEpIHsKLQkJTU1fRVJSKCJxNWF1ZGlvX2RzcF9ub3RfcmVzcG9uZGluZygpIFwKLQkJCS0gcGFya2luZyBhZGRpdGlvbmFsIGNyYXNoZXIuLi5cbiIpOwotCQlmb3IgKDs7KQotCQkJbXNsZWVwKDEwMDApOwotCX0KLQlpZiAoZHNwX3dhaXRfY291bnQpIHsKLQkJZHNwX2hhc19jcmFzaGVkID0gMTsKLQkJd2FrZV91cCgmZHNwX3dhaXQpOwotCi0JCXdoaWxlIChkc3BfaGFzX2NyYXNoZWQgIT0gMikKLQkJCXdhaXRfZXZlbnQoZHNwX3dhaXQsIGRzcF9oYXNfY3Jhc2hlZCA9PSAyKTsKLQl9IGVsc2UgewotCQlNTV9FUlIoInE1YXVkaW9fZHNwX25vdF9yZXNwb25kaW5nKCkgLSBubyB3YWl0ZXI/XG4iKTsKLQl9Ci0KLQlpZiAoY2JfcHRyKQotCQljYl9wdHIoRFNQX1NUQVRFX0NSQVNIX0RVTVBfRE9ORSk7Ci19Ci0KLXN0YXRpYyBpbnQgZHNwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRzcF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCWNoYXIgY21kWzMyXTsKLQotCWlmIChjb3VudCA+PSBzaXplb2YoY21kKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGNtZCwgYnVmLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCWNtZFtjb3VudF0gPSAwOwotCi0JaWYgKChjb3VudCA+IDEpICYmIChjbWRbY291bnQtMV0gPT0gJ1xuJykpCi0JCWNtZFtjb3VudC0xXSA9IDA7Ci0KLQlpZiAoIXN0cm5jbXAoY21kLCAid2FpdC1mb3ItY3Jhc2giLCBzaXplb2YoIndhaXQtZm9yLWNyYXNoIikpKSB7Ci0JCXdoaWxlICghZHNwX2hhc19jcmFzaGVkKSB7Ci0JCQlpbnQgcmVzOwotCQkJZHNwX3dhaXRfY291bnQrKzsKLQkJCXJlcyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkc3Bfd2FpdCwKLQkJCQkJCQlkc3BfaGFzX2NyYXNoZWQpOwotCQkJaWYgKHJlcyA8IDApIHsKLQkJCQlkc3Bfd2FpdF9jb3VudC0tOwotCQkJCXJldHVybiByZXM7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKCFzdHJuY21wKGNtZCwgImJvb20iLCBzaXplb2YoImJvb20iKSkpIHsKLQkJcTVhdWRpb19kc3Bfbm90X3Jlc3BvbmRpbmcoKTsKLQl9IGVsc2UgaWYgKCFzdHJuY21wKGNtZCwgImNvbnRpbnVlLWNyYXNoIiwgc2l6ZW9mKCJjb250aW51ZS1jcmFzaCIpKSkgewotCQlkc3BfaGFzX2NyYXNoZWQgPSAyOwotCQl3YWtlX3VwKCZkc3Bfd2FpdCk7Ci0JfSBlbHNlIHsKLQkJTU1fRVJSKCJbJXM6JXNdIHVua25vd24gZHNwX2RlYnVnIGNvbW1hbmQ6ICVzXG4iLCBfX01NX0ZJTEVfXywKLQkJCQlfX2Z1bmNfXywgY21kKTsKLQl9Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRzcF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzaXplX3QgYWN0dWFsID0gMDsKLQlzdGF0aWMgdm9pZCAqZHNwX2FkZHI7Ci0Jc3RhdGljIHVuc2lnbmVkIGNvcHlfb2tfY291bnQ7Ci0KLQlNTV9JTkZPKCJwb3MgPSAlbGxkXG4iLCAqcG9zKTsKLQlpZiAoKnBvcyA+PSBEU1BfUkFNX1NJWkUgKiBOVU1fRFNQX1JBTV9CQU5LUykKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoKnBvcyA9PSAwKQotCQlkc3BfYWRkciA9ICgqcG9zICsgUkFNQV9CQVNFKTsKLQllbHNlIGlmICgqcG9zID09IERTUF9SQU1fU0laRSkKLQkJZHNwX2FkZHIgPSBSQU1CX0JBU0U7Ci0JZWxzZSBpZiAoKnBvcyA+PSBEU1BfUkFNX1NJWkUgKiAyKQotCQlkc3BfYWRkciA9IFJBTUNfQkFTRTsKLQotCU1NX0lORk8oImRzcF9hZGRyID0gJXBcbiIsIGRzcF9hZGRyKTsKLQl3aGlsZSAoY291bnQgPj0gUEFHRV9TSVpFKSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBkc3BfYWRkciwgUEFHRV9TSVpFKSkgewotCQkJTU1fRVJSKCJbJXM6JXNdIGNvcHkgZXJyb3IgQCAlcFxuIiwgX19NTV9GSUxFX18sCi0JCQkJCV9fZnVuY19fLCBidWYpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJY29weV9va19jb3VudCArPSBQQUdFX1NJWkU7Ci0JCWRzcF9hZGRyID0gKGNoYXIgKilkc3BfYWRkciArIFBBR0VfU0laRTsKLQkJYnVmICs9IFBBR0VfU0laRTsKLQkJYWN0dWFsICs9IFBBR0VfU0laRTsKLQkJY291bnQgLT0gUEFHRV9TSVpFOwotCX0KLQotCSpwb3MgKz0gYWN0dWFsOwotCXJldHVybiBhY3R1YWw7Ci19Ci0KLXN0YXRpYyBpbnQgZHNwX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBkc3BfZGVidWdfcmVnaXN0ZXIoZHNwX3N0YXRlX2NiIHB0cikKLXsKLQlpZiAocHRyID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY2JfcHRyID0gcHRyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRzcF9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBkc3Bfb3BlbiwKLQkucmVhZAkJPSBkc3BfcmVhZCwKLQkud3JpdGUJCT0gZHNwX3dyaXRlLAotCS5yZWxlYXNlCT0gZHNwX3JlbGVhc2UsCi19OwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZHNwX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gImRzcF9kZWJ1ZyIsCi0JLmZvcHMJPSAmZHNwX2ZvcHMsCi19OwotI2VuZGlmCi0KLXN0YXRpYyBzc2l6ZV90IGRzcF9kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JTU1fREJHKCJhZHNwIGRlYnVnZnMgb3BlbmVkXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgZHNwX2RlYnVnX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlpbnQgbGVuOwotCi0JaWYgKGNvdW50IDwgMCkKLQkJcmV0dXJuIDA7Ci0JbGVuID0gY291bnQgPiAoTUFYX0xFTiAtIDEpID8gKE1BWF9MRU4gLSAxKSA6IGNvdW50OwotCWlmIChjb3B5X2Zyb21fdXNlcihsX2J1ZiArIEhEUl9MRU4sIGJ1ZiwgbGVuKSkgewotCQlNTV9FUlIoIlVuYWJsZSB0byBjb3B5IGRhdGEgZnJvbSB1c2VyIHNwYWNlXG4iKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCWxfYnVmW2xlbiArIEhEUl9MRU5dID0gMDsKLQlpZiAobF9idWZbbGVuICsgSERSX0xFTiAtIDFdID09ICdcbicpIHsKLQkJbF9idWZbbGVuICsgSERSX0xFTiAtIDFdID0gMDsKLQkJbGVuLS07Ci0JfQotCWlmICghc3RybmNtcChsX2J1ZiArIEhEUl9MRU4sICJib29tIiwgNjQpKSB7Ci0JCXE1YXVkaW9fZHNwX25vdF9yZXNwb25kaW5nKCk7Ci0JfSBlbHNlIGlmICghc3RybmNtcChsX2J1ZiArIEhEUl9MRU4sICJjb250aW51ZS1jcmFzaCIsCi0JCQkJc2l6ZW9mKCJjb250aW51ZS1jcmFzaCIpKSkgewotCQlkc3BfaGFzX2NyYXNoZWQgPSAyOwotCQl3YWtlX3VwKCZkc3Bfd2FpdCk7Ci0JfSBlbHNlCi0JCU1NX0VSUigiVW5rbm93biBjb21tYW5kXG4iKTsKLQotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRzcF9kZWJ1Z19mb3BzID0gewotCS53cml0ZSA9IGRzcF9kZWJ1Z193cml0ZSwKLQkub3BlbiA9IGRzcF9kZWJ1Z19vcGVuLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgZHNwX2luaXQodm9pZCkKLXsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkc3Bfd2FpdCk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JZHNwX2RlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImRzcF9kZWJ1ZyIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJTlVMTCwgKHZvaWQgKikgTlVMTCwgJmRzcF9kZWJ1Z19mb3BzKTsKLQotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZkc3BfbWlzYyk7Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmIC8qIENPTkZJR19ERUJVR19GUyAqLwotfQotCi1kZXZpY2VfaW5pdGNhbGwoZHNwX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvZHNwX2RlYnVnLmggYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9kc3BfZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVjMTRjYS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9kc3BfZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0RTUF9ERUJVR19IXwotI2RlZmluZSBfX0RTUF9ERUJVR19IXwotCi10eXBlZGVmIGludCAoKmRzcF9zdGF0ZV9jYikoaW50IHN0YXRlKTsKLWludCBkc3BfZGVidWdfcmVnaXN0ZXIoZHNwX3N0YXRlX2NiIHB0cik7Ci0KLSNkZWZpbmUgRFNQX1NUQVRFX0NSQVNIRUQgICAgICAgICAweDAKLSNkZWZpbmUgRFNQX1NUQVRFX0NSQVNIX0RVTVBfRE9ORSAweDEKLQotI2RlZmluZSBSQU1BX0JBU0UgTVNNX0FENV9CQVNFCi0jZGVmaW5lIFJBTUJfQkFTRSAoKFJBTUFfQkFTRSkgKyAoMHgyMDAwMDApKQotI2RlZmluZSBSQU1DX0JBU0UgKChSQU1CX0JBU0UpICsgKDB4MjAwMDAwKSkKLSNkZWZpbmUgRFNQX1JBTV9TSVpFIDB4NDAwMDAKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9ldmxvZy5oIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvZXZsb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYwZjE2Yi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9ldmxvZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L2V2bG9nLmgKLSAqCi0gKiBzaW1wbGUgZXZlbnQgbG9nIGRlYnVnZ2luZyBmYWNpbGl0eQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotCi0jZGVmaW5lIEVWX0xPR19FTlRSWV9OQU1FKG4pIG4jI19lbnRyeQotCi0jZGVmaW5lIERFQ0xBUkVfTE9HKF9uYW1lLCBfc2l6ZSwgX3N0cikgXAotc3RhdGljIHN0cnVjdCBldl9lbnRyeSBFVl9MT0dfRU5UUllfTkFNRShfbmFtZSlbX3NpemVdOyBcCi1zdGF0aWMgc3RydWN0IGV2X2xvZyBfbmFtZSA9IHsgXAotCS5uYW1lID0gI19uYW1lLCBcCi0JLnN0cmluZ3MgPSBfc3RyLCBcCi0JLm51bV9zdHJpbmdzID0gQVJSQVlfU0laRShfc3RyKSwgXAotCS5lbnRyeSA9IEVWX0xPR19FTlRSWV9OQU1FKF9uYW1lKSwgXAotCS5tYXggPSBBUlJBWV9TSVpFKEVWX0xPR19FTlRSWV9OQU1FKF9uYW1lKSksIFwKLX0KLQotc3RydWN0IGV2X2VudHJ5IHsKLQlzdHJ1Y3QgdGltZXNwZWMgd2hlbjsKLQl1aW50MzJfdCBpZDsKLQl1aW50MzJfdCBhcmc7Ci19OwotCQotc3RydWN0IGV2X2xvZyB7Ci0Jc3RydWN0IGV2X2VudHJ5ICplbnRyeTsKLQl1bnNpZ25lZCBtYXg7Ci0JdW5zaWduZWQgbmV4dDsKLQl1bnNpZ25lZCBmYXVsdDsKLQljb25zdCBjaGFyICoqc3RyaW5nczsKLQl1bnNpZ25lZCBudW1fc3RyaW5nczsKLQljb25zdCBjaGFyICpuYW1lOwotfTsKLQotc3RhdGljIGNoYXIgZXZfYnVmWzQwOTZdOwotCi1zdGF0aWMgc3NpemVfdCBldl9sb2dfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBldl9sb2cgKmxvZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZXZfZW50cnkgKmVudHJ5OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHNpemUgPSAwOwotCXVuc2lnbmVkIG4sIGlkLCBtYXg7Ci0Jc3RydWN0IHRpbWVzcGVjIG5vdywgdDsKLQkKLQltYXggPSBsb2ctPm1heDsKLQlnZXRuc3RpbWVvZmRheSgmbm93KTsKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JbiA9IChsb2ctPm5leHQgLSAxKSAmIChtYXggLSAxKTsKLQllbnRyeSA9IGxvZy0+ZW50cnk7Ci0Jd2hpbGUgKG4gIT0gbG9nLT5uZXh0KSB7Ci0JCXQgPSB0aW1lc3BlY19zdWIobm93LCBlbnRyeVtuXS53aGVuKTsKLQkJaWQgPSBlbnRyeVtuXS5pZDsKLQkJaWYgKGlkKSB7Ci0JCQljb25zdCBjaGFyICpzdHI7Ci0JCQlpZiAoaWQgPCBsb2ctPm51bV9zdHJpbmdzKQotCQkJCXN0ciA9IGxvZy0+c3RyaW5nc1tpZF07Ci0JCQllbHNlCi0JCQkJc3RyID0gIlVOS05PV04iOwotCQkJc2l6ZSArPSBzY25wcmludGYoZXZfYnVmICsgc2l6ZSwgNDA5NiAtIHNpemUsCi0JCQkJCSAgIiVsdS4lMDNsdSAlMDh4ICVzXG4iLAotCQkJCQkgIHQudHZfc2VjLCB0LnR2X25zZWMgLyAxMDAwMDAwLAotCQkJCQkgIGVudHJ5W25dLmFyZywgc3RyKTsKLQkJfQotCQluID0gKG4gLSAxKSAmIChtYXggLSAxKTsKLQl9Ci0JbG9nLT5mYXVsdCA9IDA7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCBldl9idWYsIHNpemUpOwotfQotCi1zdGF0aWMgdm9pZCBldl9sb2dfd3JpdGUoc3RydWN0IGV2X2xvZyAqbG9nLCB1bnNpZ25lZCBpZCwgdW5zaWduZWQgYXJnKQotewotCXN0cnVjdCBldl9lbnRyeSAqZW50cnk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlpZiAobG9nLT5mYXVsdCkgewotCQlpZiAobG9nLT5mYXVsdCA9PSAxKQotCQkJZ290byBkb25lOwotCQlsb2ctPmZhdWx0LS07Ci0JfQotCi0JZW50cnkgPSBsb2ctPmVudHJ5ICsgbG9nLT5uZXh0OwotCWdldG5zdGltZW9mZGF5KCZlbnRyeS0+d2hlbik7Ci0JZW50cnktPmlkID0gaWQ7Ci0JZW50cnktPmFyZyA9IGFyZzsKLQlsb2ctPm5leHQgPSAobG9nLT5uZXh0ICsgMSkgJiAobG9nLT5tYXggLSAxKTsKLWRvbmU6Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IGV2X2xvZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV2X2xvZ19vcHMgPSB7Ci0JLnJlYWQgPSBldl9sb2dfcmVhZCwKLQkub3BlbiA9IGV2X2xvZ19vcGVuLAotfTsKLQotc3RhdGljIGludCBldl9sb2dfaW5pdChzdHJ1Y3QgZXZfbG9nICpsb2cpCi17Ci0JZGVidWdmc19jcmVhdGVfZmlsZShsb2ctPm5hbWUsIDA0NDQsIDAsIGxvZywgJmV2X2xvZ19vcHMpOwotCXJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9zbmQuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L3NuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjM3OWRjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L3NuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjc1ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L3NuZC5jCi0gKgotICogaW50ZXJmYWNlIHRvICJzbmQiIHNlcnZpY2Ugb24gdGhlIGJhc2ViYW5kIGNwdQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoYykgMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX3JwY3JvdXRlci5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLQotc3RydWN0IHNuZF9jdHh0IHsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlpbnQgb3BlbmVkOwotCXN0cnVjdCBtc21fcnBjX2VuZHBvaW50ICplcHQ7Ci0Jc3RydWN0IG1zbV9zbmRfZW5kcG9pbnRzICpzbmRfZXB0czsKLX07Ci0KLXN0cnVjdCBzbmRfc3lzX2N0eHQgewotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtc21fcnBjX2VuZHBvaW50ICplcHQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zeXNfY3R4dCB0aGVfc25kX3N5czsKLQotc3RhdGljIHN0cnVjdCBzbmRfY3R4dCB0aGVfc25kOwotCi0jZGVmaW5lIFJQQ19TTkRfUFJPRwkweDMwMDAwMDAyCi0jZGVmaW5lIFJQQ19TTkRfQ0JfUFJPRwkweDMxMDAwMDAyCi0KLSNkZWZpbmUgUlBDX1NORF9WRVJTICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAxCi0jZGVmaW5lIFJQQ19TTkRfVkVSUzIgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDEKLQotI2RlZmluZSBTTkRfU0VUX0RFVklDRV9QUk9DIDIKLSNkZWZpbmUgU05EX1NFVF9WT0xVTUVfUFJPQyAzCi0jZGVmaW5lIFNORF9BVkNfQ1RMX1BST0MgMjkKLSNkZWZpbmUgU05EX0FHQ19DVExfUFJPQyAzMAotCi1zdHJ1Y3QgcnBjX3NuZF9zZXRfZGV2aWNlX2FyZ3MgewotCXVpbnQzMl90IGRldmljZTsKLQl1aW50MzJfdCBlYXJfbXV0ZTsKLQl1aW50MzJfdCBtaWNfbXV0ZTsKLQotCXVpbnQzMl90IGNiX2Z1bmM7Ci0JdWludDMyX3QgY2xpZW50X2RhdGE7Ci19OwotCi1zdHJ1Y3QgcnBjX3NuZF9zZXRfdm9sdW1lX2FyZ3MgewotCXVpbnQzMl90IGRldmljZTsKLQl1aW50MzJfdCBtZXRob2Q7Ci0JdWludDMyX3Qgdm9sdW1lOwotCi0JdWludDMyX3QgY2JfZnVuYzsKLQl1aW50MzJfdCBjbGllbnRfZGF0YTsKLX07Ci0KLXN0cnVjdCBycGNfc25kX2F2Y19jdGxfYXJncyB7Ci0JdWludDMyX3QgYXZjX2N0bDsKLQl1aW50MzJfdCBjYl9mdW5jOwotCXVpbnQzMl90IGNsaWVudF9kYXRhOwotfTsKLQotc3RydWN0IHJwY19zbmRfYWdjX2N0bF9hcmdzIHsKLQl1aW50MzJfdCBhZ2NfY3RsOwotCXVpbnQzMl90IGNiX2Z1bmM7Ci0JdWludDMyX3QgY2xpZW50X2RhdGE7Ci19OwotCi1zdHJ1Y3Qgc25kX3NldF9kZXZpY2VfbXNnIHsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIGhkcjsKLQlzdHJ1Y3QgcnBjX3NuZF9zZXRfZGV2aWNlX2FyZ3MgYXJnczsKLX07Ci0KLXN0cnVjdCBzbmRfc2V0X3ZvbHVtZV9tc2cgewotCXN0cnVjdCBycGNfcmVxdWVzdF9oZHIgaGRyOwotCXN0cnVjdCBycGNfc25kX3NldF92b2x1bWVfYXJncyBhcmdzOwotfTsKLQotc3RydWN0IHNuZF9hdmNfY3RsX21zZyB7Ci0Jc3RydWN0IHJwY19yZXF1ZXN0X2hkciBoZHI7Ci0Jc3RydWN0IHJwY19zbmRfYXZjX2N0bF9hcmdzIGFyZ3M7Ci19OwotCi1zdHJ1Y3Qgc25kX2FnY19jdGxfbXNnIHsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIGhkcjsKLQlzdHJ1Y3QgcnBjX3NuZF9hZ2NfY3RsX2FyZ3MgYXJnczsKLX07Ci0KLXN0cnVjdCBzbmRfZW5kcG9pbnQgKmdldF9zbmRfZW5kcG9pbnRzKGludCAqc2l6ZSk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX211dGUoaW50IG11dGUpCi17Ci0JcmV0dXJuIChtdXRlID09IFNORF9NVVRFX01VVEVEIHx8Ci0JCW11dGUgPT0gU05EX01VVEVfVU5NVVRFRCkgPyAwIDogLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCBnZXRfZW5kcG9pbnQoc3RydWN0IHNuZF9jdHh0ICpzbmQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByYyA9IDAsIGluZGV4OwotCXN0cnVjdCBtc21fc25kX2VuZHBvaW50IGVwdDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmZXB0LCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihlcHQpKSkgewotCQlNTV9FUlIoInNuZF9pb2N0bCBnZXQgZW5kcG9pbnQ6IGludmFsaWQgcmVhZCBwb2ludGVyXG4iKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaW5kZXggPSBlcHQuaWQ7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzbmQtPnNuZF9lcHRzLT5udW0pIHsKLQkJTU1fRVJSKCJzbmRfaW9jdGwgZ2V0IGVuZHBvaW50OiBpbnZhbGlkIGluZGV4IVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWVwdC5pZCA9IHNuZC0+c25kX2VwdHMtPmVuZHBvaW50c1tpbmRleF0uaWQ7Ci0Jc3RybmNweShlcHQubmFtZSwKLQkJc25kLT5zbmRfZXB0cy0+ZW5kcG9pbnRzW2luZGV4XS5uYW1lLAotCQlzaXplb2YoZXB0Lm5hbWUpKTsKLQotCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmZXB0LCBzaXplb2YoZXB0KSkpIHsKLQkJTU1fRVJSKCJzbmRfaW9jdGwgZ2V0IGVuZHBvaW50OiBpbnZhbGlkIHdyaXRlIHBvaW50ZXJcbiIpOwotCQlyYyA9IC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBzbmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBzbmRfc2V0X2RldmljZV9tc2cgZG1zZzsKLQlzdHJ1Y3Qgc25kX3NldF92b2x1bWVfbXNnIHZtc2c7Ci0Jc3RydWN0IHNuZF9hdmNfY3RsX21zZyBhdmNfbXNnOwotCXN0cnVjdCBzbmRfYWdjX2N0bF9tc2cgYWdjX21zZzsKLQotCXN0cnVjdCBtc21fc25kX2RldmljZV9jb25maWcgZGV2OwotCXN0cnVjdCBtc21fc25kX3ZvbHVtZV9jb25maWcgdm9sOwotCXN0cnVjdCBzbmRfY3R4dCAqc25kID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQl1aW50MzJfdCBhdmMsIGFnYzsKLQotCW11dGV4X2xvY2soJnNuZC0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORF9TRVRfREVWSUNFOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmRldiwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKGRldikpKSB7Ci0JCQlNTV9FUlIoInNldCBkZXZpY2U6IGludmFsaWQgcG9pbnRlclxuIik7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWRtc2cuYXJncy5kZXZpY2UgPSBjcHVfdG9fYmUzMihkZXYuZGV2aWNlKTsKLQkJZG1zZy5hcmdzLmVhcl9tdXRlID0gY3B1X3RvX2JlMzIoZGV2LmVhcl9tdXRlKTsKLQkJZG1zZy5hcmdzLm1pY19tdXRlID0gY3B1X3RvX2JlMzIoZGV2Lm1pY19tdXRlKTsKLQkJaWYgKGNoZWNrX211dGUoZGV2LmVhcl9tdXRlKSA8IDAgfHwKLQkJCQljaGVja19tdXRlKGRldi5taWNfbXV0ZSkgPCAwKSB7Ci0JCQlNTV9FUlIoInNldCBkZXZpY2U6IGludmFsaWQgbXV0ZSBzdGF0dXNcbiIpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJZG1zZy5hcmdzLmNiX2Z1bmMgPSAtMTsKLQkJZG1zZy5hcmdzLmNsaWVudF9kYXRhID0gMDsKLQotCQlNTV9JTkZPKCJzbmRfc2V0X2RldmljZSAlZCAlZCAlZFxuIiwgZGV2LmRldmljZSwKLQkJCQlkZXYuZWFyX211dGUsIGRldi5taWNfbXV0ZSk7Ci0KLQkJcmMgPSBtc21fcnBjX2NhbGwoc25kLT5lcHQsCi0JCQlTTkRfU0VUX0RFVklDRV9QUk9DLAotCQkJJmRtc2csIHNpemVvZihkbXNnKSwgNSAqIEhaKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNORF9TRVRfVk9MVU1FOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJnZvbCwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKHZvbCkpKSB7Ci0JCQlNTV9FUlIoInNldCB2b2x1bWU6IGludmFsaWQgcG9pbnRlclxuIik7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCXZtc2cuYXJncy5kZXZpY2UgPSBjcHVfdG9fYmUzMih2b2wuZGV2aWNlKTsKLQkJdm1zZy5hcmdzLm1ldGhvZCA9IGNwdV90b19iZTMyKHZvbC5tZXRob2QpOwotCQlpZiAodm9sLm1ldGhvZCAhPSBTTkRfTUVUSE9EX1ZPSUNFKSB7Ci0JCQlNTV9FUlIoInNldCB2b2x1bWU6IGludmFsaWQgbWV0aG9kXG4iKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJdm1zZy5hcmdzLnZvbHVtZSA9IGNwdV90b19iZTMyKHZvbC52b2x1bWUpOwotCQl2bXNnLmFyZ3MuY2JfZnVuYyA9IC0xOwotCQl2bXNnLmFyZ3MuY2xpZW50X2RhdGEgPSAwOwotCi0JCU1NX0lORk8oInNuZF9zZXRfdm9sdW1lICVkICVkICVkXG4iLCB2b2wuZGV2aWNlLAotCQkJCXZvbC5tZXRob2QsIHZvbC52b2x1bWUpOwotCi0JCXJjID0gbXNtX3JwY19jYWxsKHNuZC0+ZXB0LAotCQkJU05EX1NFVF9WT0xVTUVfUFJPQywKLQkJCSZ2bXNnLCBzaXplb2Yodm1zZyksIDUgKiBIWik7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRfQVZDX0NUTDoKLQkJaWYgKGdldF91c2VyKGF2YywgKHVpbnQzMl90IF9fdXNlciAqKSBhcmcpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmICgoYXZjICE9IDEpICYmIChhdmMgIT0gMCkpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYXZjX21zZy5hcmdzLmF2Y19jdGwgPSBjcHVfdG9fYmUzMihhdmMpOwotCQlhdmNfbXNnLmFyZ3MuY2JfZnVuYyA9IC0xOwotCQlhdmNfbXNnLmFyZ3MuY2xpZW50X2RhdGEgPSAwOwotCi0JCU1NX0lORk8oInNuZF9hdmNfY3RsICVkXG4iLCBhdmMpOwotCi0JCXJjID0gbXNtX3JwY19jYWxsKHNuZC0+ZXB0LAotCQkJU05EX0FWQ19DVExfUFJPQywKLQkJCSZhdmNfbXNnLCBzaXplb2YoYXZjX21zZyksIDUgKiBIWik7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRfQUdDX0NUTDoKLQkJaWYgKGdldF91c2VyKGFnYywgKHVpbnQzMl90IF9fdXNlciAqKSBhcmcpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmICgoYWdjICE9IDEpICYmIChhZ2MgIT0gMCkpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWFnY19tc2cuYXJncy5hZ2NfY3RsID0gY3B1X3RvX2JlMzIoYWdjKTsKLQkJYWdjX21zZy5hcmdzLmNiX2Z1bmMgPSAtMTsKLQkJYWdjX21zZy5hcmdzLmNsaWVudF9kYXRhID0gMDsKLQotCQlNTV9JTkZPKCJzbmRfYWdjX2N0bCAlZFxuIiwgYWdjKTsKLQotCQlyYyA9IG1zbV9ycGNfY2FsbChzbmQtPmVwdCwKLQkJCVNORF9BR0NfQ1RMX1BST0MsCi0JCQkmYWdjX21zZywgc2l6ZW9mKGFnY19tc2cpLCA1ICogSFopOwotCQlicmVhazsKLQotCWNhc2UgU05EX0dFVF9OVU1fRU5EUE9JTlRTOgotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKLQkJCQkmc25kLT5zbmRfZXB0cy0+bnVtLCBzaXplb2YodW5zaWduZWQpKSkgewotCQkJTU1fRVJSKCJnZXQgZW5kcG9pbnQ6IGludmFsaWQgcG9pbnRlclxuIik7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORF9HRVRfRU5EUE9JTlQ6Ci0JCXJjID0gZ2V0X2VuZHBvaW50KHNuZCwgYXJnKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlNTV9FUlIoInVua25vd24gY29tbWFuZFxuIik7Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCW11dGV4X3VubG9jaygmc25kLT5sb2NrKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzbmRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc25kX2N0eHQgKnNuZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmM7Ci0KLQltdXRleF9sb2NrKCZzbmQtPmxvY2spOwotCXJjID0gbXNtX3JwY19jbG9zZShzbmQtPmVwdCk7Ci0JaWYgKHJjIDwgMCkKLQkJTU1fRVJSKCJtc21fcnBjX2Nsb3NlIGZhaWxlZFxuIik7Ci0Jc25kLT5lcHQgPSBOVUxMOwotCXNuZC0+b3BlbmVkID0gMDsKLQltdXRleF91bmxvY2soJnNuZC0+bG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50IHNuZF9zeXNfcmVsZWFzZSh2b2lkKQotewotCXN0cnVjdCBzbmRfc3lzX2N0eHQgKnNuZF9zeXMgPSAmdGhlX3NuZF9zeXM7Ci0JaW50IHJjID0gMDsKLQotCW11dGV4X2xvY2soJnNuZF9zeXMtPmxvY2spOwotCXJjID0gbXNtX3JwY19jbG9zZShzbmRfc3lzLT5lcHQpOwotCWlmIChyYyA8IDApCi0JCU1NX0VSUigibXNtX3JwY19jbG9zZSBmYWlsZWRcbiIpOwotCXNuZF9zeXMtPmVwdCA9IE5VTEw7Ci0JbXV0ZXhfdW5sb2NrKCZzbmRfc3lzLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50IHNuZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBzbmRfY3R4dCAqc25kID0gJnRoZV9zbmQ7Ci0JaW50IHJjID0gMDsKLQotCW11dGV4X2xvY2soJnNuZC0+bG9jayk7Ci0JaWYgKHNuZC0+b3BlbmVkID09IDApIHsKLQkJaWYgKHNuZC0+ZXB0ID09IE5VTEwpIHsKLQkJCXNuZC0+ZXB0ID0gbXNtX3JwY19jb25uZWN0X2NvbXBhdGlibGUoUlBDX1NORF9QUk9HLAotCQkJCQlSUENfU05EX1ZFUlMsIDApOwotCQkJaWYgKElTX0VSUihzbmQtPmVwdCkpIHsKLQkJCQlNTV9EQkcoImNvbm5lY3QgZmFpbGVkIHdpdGggY3VycmVudCBWRVJTIFwKLQkJCQkJPSAleCwgdHJ5aW5nIGFnYWluIHdpdGggYW5vdGhlciBBUElcbiIsCi0JCQkJCVJQQ19TTkRfVkVSUzIpOwotCQkJCXNuZC0+ZXB0ID0KLQkJCQkJbXNtX3JwY19jb25uZWN0X2NvbXBhdGlibGUoUlBDX1NORF9QUk9HLAotCQkJCQkJCVJQQ19TTkRfVkVSUzIsIDApOwotCQkJfQotCQkJaWYgKElTX0VSUihzbmQtPmVwdCkpIHsKLQkJCQlyYyA9IFBUUl9FUlIoc25kLT5lcHQpOwotCQkJCXNuZC0+ZXB0ID0gTlVMTDsKLQkJCQlNTV9FUlIoImZhaWxlZCB0byBjb25uZWN0IHNuZCBzdmNcbiIpOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQl9Ci0JCWZpbGUtPnByaXZhdGVfZGF0YSA9IHNuZDsKLQkJc25kLT5vcGVuZWQgPSAxOwotCX0gZWxzZSB7Ci0JCU1NX0VSUigic25kIGFscmVhZHkgb3BlbmVkXG4iKTsKLQkJcmMgPSAtRUJVU1k7Ci0JfQotCi1lcnI6Ci0JbXV0ZXhfdW5sb2NrKCZzbmQtPmxvY2spOwotCXJldHVybiByYzsKLX0KLXN0YXRpYyBpbnQgc25kX3N5c19vcGVuKHZvaWQpCi17Ci0Jc3RydWN0IHNuZF9zeXNfY3R4dCAqc25kX3N5cyA9ICZ0aGVfc25kX3N5czsKLQlpbnQgcmMgPSAwOwotCi0JbXV0ZXhfbG9jaygmc25kX3N5cy0+bG9jayk7Ci0JaWYgKHNuZF9zeXMtPmVwdCA9PSBOVUxMKSB7Ci0JCXNuZF9zeXMtPmVwdCA9IG1zbV9ycGNfY29ubmVjdF9jb21wYXRpYmxlKFJQQ19TTkRfUFJPRywKLQkJCVJQQ19TTkRfVkVSUywgMCk7Ci0JCWlmIChJU19FUlIoc25kX3N5cy0+ZXB0KSkgewotCQkJTU1fREJHKCJjb25uZWN0IGZhaWxlZCB3aXRoIGN1cnJlbnQgVkVSUyBcCi0JCQkJPSAleCwgdHJ5aW5nIGFnYWluIHdpdGggYW5vdGhlciBBUElcbiIsCi0JCQkJUlBDX1NORF9WRVJTMik7Ci0JCQlzbmRfc3lzLT5lcHQgPSBtc21fcnBjX2Nvbm5lY3RfY29tcGF0aWJsZShSUENfU05EX1BST0csCi0JCQkJCVJQQ19TTkRfVkVSUzIsIDApOwotCQl9Ci0JCWlmIChJU19FUlIoc25kX3N5cy0+ZXB0KSkgewotCQkJcmMgPSBQVFJfRVJSKHNuZF9zeXMtPmVwdCk7Ci0JCQlzbmRfc3lzLT5lcHQgPSBOVUxMOwotCQkJTU1fRVJSKCJmYWlsZWQgdG8gY29ubmVjdCBzbmQgc3ZjXG4iKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfSBlbHNlCi0JCU1NX0RCRygic25kIGFscmVhZHkgb3BlbmVkXG4iKTsKLQotZXJyOgotCW11dGV4X3VubG9jaygmc25kX3N5cy0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbmRfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gc25kX29wZW4sCi0JLnJlbGVhc2UJPSBzbmRfcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBzbmRfaW9jdGwsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBzbmRfbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX3NuZCIsCi0JLmZvcHMJPSAmc25kX2ZvcHMsCi19OwotCi1zdGF0aWMgbG9uZyBzbmRfYWdjX2VuYWJsZSh1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3Qgc25kX3N5c19jdHh0ICpzbmRfc3lzID0gJnRoZV9zbmRfc3lzOwotCXN0cnVjdCBzbmRfYWdjX2N0bF9tc2cgYWdjX21zZzsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKChhcmcgIT0gMSkgJiYgKGFyZyAhPSAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlhZ2NfbXNnLmFyZ3MuYWdjX2N0bCA9IGNwdV90b19iZTMyKGFyZyk7Ci0JYWdjX21zZy5hcmdzLmNiX2Z1bmMgPSAtMTsKLQlhZ2NfbXNnLmFyZ3MuY2xpZW50X2RhdGEgPSAwOwotCi0JTU1fREJHKCJzbmRfYWdjX2N0bCAlbGQsJWRcbiIsIGFyZywgYWdjX21zZy5hcmdzLmFnY19jdGwpOwotCi0JcmMgPSBtc21fcnBjX2NhbGwoc25kX3N5cy0+ZXB0LAotCQlTTkRfQUdDX0NUTF9QUk9DLAotCQkmYWdjX21zZywgc2l6ZW9mKGFnY19tc2cpLCA1ICogSFopOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgc25kX2F2Y19lbmFibGUodW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHNuZF9zeXNfY3R4dCAqc25kX3N5cyA9ICZ0aGVfc25kX3N5czsKLQlzdHJ1Y3Qgc25kX2F2Y19jdGxfbXNnIGF2Y19tc2c7Ci0JaW50IHJjID0gMDsKLQotCWlmICgoYXJnICE9IDEpICYmIChhcmcgIT0gMCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JYXZjX21zZy5hcmdzLmF2Y19jdGwgPSBjcHVfdG9fYmUzMihhcmcpOwotCi0JYXZjX21zZy5hcmdzLmNiX2Z1bmMgPSAtMTsKLQlhdmNfbXNnLmFyZ3MuY2xpZW50X2RhdGEgPSAwOwotCi0JTU1fREJHKCJzbmRfYXZjX2N0bCAlbGQsJWRcbiIsIGFyZywgYXZjX21zZy5hcmdzLmF2Y19jdGwpOwotCi0JcmMgPSBtc21fcnBjX2NhbGwoc25kX3N5cy0+ZXB0LAotCQlTTkRfQVZDX0NUTF9QUk9DLAotCQkmYXZjX21zZywgc2l6ZW9mKGF2Y19tc2cpLCA1ICogSFopOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3Qgc25kX2FnY19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQotewotCXNzaXplX3Qgc3RhdHVzOwotCXN0cnVjdCBzbmRfc3lzX2N0eHQgKnNuZF9zeXMgPSAmdGhlX3NuZF9zeXM7Ci0JaW50IHJjID0gMDsKLQotCXJjID0gc25kX3N5c19vcGVuKCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQltdXRleF9sb2NrKCZzbmRfc3lzLT5sb2NrKTsKLQotCWlmIChzeXNmc19zdHJlcShidWYsICJlbmFibGUiKSkKLQkJc3RhdHVzID0gc25kX2FnY19lbmFibGUoMSk7Ci0JZWxzZSBpZiAoc3lzZnNfc3RyZXEoYnVmLCAiZGlzYWJsZSIpKQotCQlzdGF0dXMgPSBzbmRfYWdjX2VuYWJsZSgwKTsKLQllbHNlCi0JCXN0YXR1cyA9IC1FSU5WQUw7Ci0KLQltdXRleF91bmxvY2soJnNuZF9zeXMtPmxvY2spOwotCXJjID0gc25kX3N5c19yZWxlYXNlKCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gc3RhdHVzID8gOiBzaXplOwotfQotCi1zdGF0aWMgc3NpemVfdCBzbmRfYXZjX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCi17Ci0Jc3NpemVfdCBzdGF0dXM7Ci0Jc3RydWN0IHNuZF9zeXNfY3R4dCAqc25kX3N5cyA9ICZ0aGVfc25kX3N5czsKLQlpbnQgcmMgPSAwOwotCi0JcmMgPSBzbmRfc3lzX29wZW4oKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCW11dGV4X2xvY2soJnNuZF9zeXMtPmxvY2spOwotCi0JaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgImVuYWJsZSIpKQotCQlzdGF0dXMgPSBzbmRfYXZjX2VuYWJsZSgxKTsKLQllbHNlIGlmIChzeXNmc19zdHJlcShidWYsICJkaXNhYmxlIikpCi0JCXN0YXR1cyA9IHNuZF9hdmNfZW5hYmxlKDApOwotCWVsc2UKLQkJc3RhdHVzID0gLUVJTlZBTDsKLQotCW11dGV4X3VubG9jaygmc25kX3N5cy0+bG9jayk7Ci0JcmMgPSBzbmRfc3lzX3JlbGVhc2UoKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCXJldHVybiBzdGF0dXMgPyA6IHNpemU7Ci19Ci0KLXN0YXRpYyBsb25nIHNuZF92b2xfZW5hYmxlKGNvbnN0IGNoYXIgKmFyZykKLXsKLQlzdHJ1Y3Qgc25kX3N5c19jdHh0ICpzbmRfc3lzID0gJnRoZV9zbmRfc3lzOwotCXN0cnVjdCBzbmRfc2V0X3ZvbHVtZV9tc2cgdm1zZzsKLQlzdHJ1Y3QgbXNtX3NuZF92b2x1bWVfY29uZmlnIHZvbDsKLQlpbnQgcmMgPSAwOwotCi0JcmMgPSBzc2NhbmYoYXJnLCAiJWQgJWQgJWQiLCAmdm9sLmRldmljZSwgJnZvbC5tZXRob2QsICZ2b2wudm9sdW1lKTsKLQlpZiAocmMgIT0gMykgewotCQlNTV9FUlIoIkludmFsaWQgYXJndW1lbnRzLiBVc2FnZTogPGRldmljZT4gPG1ldGhvZD4gXAotCQkJCTx2b2x1bWU+XG4iKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0Jdm1zZy5hcmdzLmRldmljZSA9IGNwdV90b19iZTMyKHZvbC5kZXZpY2UpOwotCXZtc2cuYXJncy5tZXRob2QgPSBjcHVfdG9fYmUzMih2b2wubWV0aG9kKTsKLQlpZiAodm9sLm1ldGhvZCAhPSBTTkRfTUVUSE9EX1ZPSUNFKSB7Ci0JCU1NX0VSUigic25kX2lvY3RsIHNldCB2b2x1bWU6IGludmFsaWQgbWV0aG9kXG4iKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0Jdm1zZy5hcmdzLnZvbHVtZSA9IGNwdV90b19iZTMyKHZvbC52b2x1bWUpOwotCXZtc2cuYXJncy5jYl9mdW5jID0gLTE7Ci0Jdm1zZy5hcmdzLmNsaWVudF9kYXRhID0gMDsKLQotCU1NX0RCRygic25kX3NldF92b2x1bWUgJWQgJWQgJWRcbiIsIHZvbC5kZXZpY2UsIHZvbC5tZXRob2QsCi0JCQl2b2wudm9sdW1lKTsKLQotCXJjID0gbXNtX3JwY19jYWxsKHNuZF9zeXMtPmVwdCwKLQkJU05EX1NFVF9WT0xVTUVfUFJPQywKLQkJJnZtc2csIHNpemVvZih2bXNnKSwgNSAqIEhaKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBsb25nIHNuZF9kZXZfZW5hYmxlKGNvbnN0IGNoYXIgKmFyZykKLXsKLQlzdHJ1Y3Qgc25kX3N5c19jdHh0ICpzbmRfc3lzID0gJnRoZV9zbmRfc3lzOwotCXN0cnVjdCBzbmRfc2V0X2RldmljZV9tc2cgZG1zZzsKLQlzdHJ1Y3QgbXNtX3NuZF9kZXZpY2VfY29uZmlnIGRldjsKLQlpbnQgcmMgPSAwOwotCi0JcmMgPSBzc2NhbmYoYXJnLCAiJWQgJWQgJWQiLCAmZGV2LmRldmljZSwgJmRldi5lYXJfbXV0ZSwgJmRldi5taWNfbXV0ZSk7Ci0JaWYgKHJjICE9IDMpIHsKLQkJTU1fRVJSKCJJbnZhbGlkIGFyZ3VtZW50cy4gVXNhZ2U6IDxkZXZpY2U+IDxlYXJfbXV0ZT4gXAotCQkJCTxtaWNfbXV0ZT5cbiIpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCXJldHVybiByYzsKLQl9Ci0JZG1zZy5hcmdzLmRldmljZSA9IGNwdV90b19iZTMyKGRldi5kZXZpY2UpOwotCWRtc2cuYXJncy5lYXJfbXV0ZSA9IGNwdV90b19iZTMyKGRldi5lYXJfbXV0ZSk7Ci0JZG1zZy5hcmdzLm1pY19tdXRlID0gY3B1X3RvX2JlMzIoZGV2Lm1pY19tdXRlKTsKLQlpZiAoY2hlY2tfbXV0ZShkZXYuZWFyX211dGUpIDwgMCB8fAotCQkJY2hlY2tfbXV0ZShkZXYubWljX211dGUpIDwgMCkgewotCQlNTV9FUlIoInNuZF9pb2N0bCBzZXQgZGV2aWNlOiBpbnZhbGlkIG11dGUgc3RhdHVzXG4iKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlyZXR1cm4gcmM7Ci0JfQotCWRtc2cuYXJncy5jYl9mdW5jID0gLTE7Ci0JZG1zZy5hcmdzLmNsaWVudF9kYXRhID0gMDsKLQotCU1NX0lORk8oInNuZF9zZXRfZGV2aWNlICVkICVkICVkXG4iLCBkZXYuZGV2aWNlLCBkZXYuZWFyX211dGUsCi0JCQlkZXYubWljX211dGUpOwotCi0JcmMgPSBtc21fcnBjX2NhbGwoc25kX3N5cy0+ZXB0LAotCQlTTkRfU0VUX0RFVklDRV9QUk9DLAotCQkmZG1zZywgc2l6ZW9mKGRtc2cpLCA1ICogSFopOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3Qgc25kX2Rldl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQotewotCXNzaXplX3Qgc3RhdHVzOwotCXN0cnVjdCBzbmRfc3lzX2N0eHQgKnNuZF9zeXMgPSAmdGhlX3NuZF9zeXM7Ci0JaW50IHJjID0gMDsKLQotCXJjID0gc25kX3N5c19vcGVuKCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQltdXRleF9sb2NrKCZzbmRfc3lzLT5sb2NrKTsKLQlzdGF0dXMgPSBzbmRfZGV2X2VuYWJsZShidWYpOwotCW11dGV4X3VubG9jaygmc25kX3N5cy0+bG9jayk7Ci0KLQlyYyA9IHNuZF9zeXNfcmVsZWFzZSgpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIHN0YXR1cyA/IDogc2l6ZTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc25kX3ZvbF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQotewotCXNzaXplX3Qgc3RhdHVzOwotCXN0cnVjdCBzbmRfc3lzX2N0eHQgKnNuZF9zeXMgPSAmdGhlX3NuZF9zeXM7Ci0JaW50IHJjID0gMDsKLQotCXJjID0gc25kX3N5c19vcGVuKCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQltdXRleF9sb2NrKCZzbmRfc3lzLT5sb2NrKTsKLQlzdGF0dXMgPSBzbmRfdm9sX2VuYWJsZShidWYpOwotCW11dGV4X3VubG9jaygmc25kX3N5cy0+bG9jayk7Ci0KLQlyYyA9IHNuZF9zeXNfcmVsZWFzZSgpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIHN0YXR1cyA/IDogc2l6ZTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGFnYywgU19JV1VTUiB8IFNfSVJVR08sCi0JCU5VTEwsIHNuZF9hZ2Nfc3RvcmUpOwotCi1zdGF0aWMgREVWSUNFX0FUVFIoYXZjLCBTX0lXVVNSIHwgU19JUlVHTywKLQkJTlVMTCwgc25kX2F2Y19zdG9yZSk7Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihkZXZpY2UsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQlOVUxMLCBzbmRfZGV2X3N0b3JlKTsKLQotc3RhdGljIERFVklDRV9BVFRSKHZvbHVtZSwgU19JV1VTUiB8IFNfSVJVR08sCi0JCU5VTEwsIHNuZF92b2xfc3RvcmUpOwotCi1zdGF0aWMgaW50IHNuZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzbmRfY3R4dCAqc25kID0gJnRoZV9zbmQ7Ci0Jc3RydWN0IHNuZF9zeXNfY3R4dCAqc25kX3N5cyA9ICZ0aGVfc25kX3N5czsKLQlpbnQgcmMgPSAwOwotCi0JbXV0ZXhfaW5pdCgmc25kLT5sb2NrKTsKLQltdXRleF9pbml0KCZzbmRfc3lzLT5sb2NrKTsKLQlzbmRfc3lzLT5lcHQgPSBOVUxMOwotCXNuZC0+c25kX2VwdHMgPSAoc3RydWN0IG1zbV9zbmRfZW5kcG9pbnRzICopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JcmMgPSBtaXNjX3JlZ2lzdGVyKCZzbmRfbWlzYyk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZShzbmRfbWlzYy50aGlzX2RldmljZSwgJmRldl9hdHRyX2FnYyk7Ci0JaWYgKHJjKSB7Ci0JCW1pc2NfZGVyZWdpc3Rlcigmc25kX21pc2MpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoc25kX21pc2MudGhpc19kZXZpY2UsICZkZXZfYXR0cl9hdmMpOwotCWlmIChyYykgewotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoc25kX21pc2MudGhpc19kZXZpY2UsCi0JCQkJCQkmZGV2X2F0dHJfYWdjKTsKLQkJbWlzY19kZXJlZ2lzdGVyKCZzbmRfbWlzYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZShzbmRfbWlzYy50aGlzX2RldmljZSwgJmRldl9hdHRyX2RldmljZSk7Ci0JaWYgKHJjKSB7Ci0JCWRldmljZV9yZW1vdmVfZmlsZShzbmRfbWlzYy50aGlzX2RldmljZSwKLQkJCQkJCSZkZXZfYXR0cl9hZ2MpOwotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoc25kX21pc2MudGhpc19kZXZpY2UsCi0JCQkJCQkmZGV2X2F0dHJfYXZjKTsKLQkJbWlzY19kZXJlZ2lzdGVyKCZzbmRfbWlzYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZShzbmRfbWlzYy50aGlzX2RldmljZSwgJmRldl9hdHRyX3ZvbHVtZSk7Ci0JaWYgKHJjKSB7Ci0JCWRldmljZV9yZW1vdmVfZmlsZShzbmRfbWlzYy50aGlzX2RldmljZSwKLQkJCQkJCSZkZXZfYXR0cl9hZ2MpOwotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoc25kX21pc2MudGhpc19kZXZpY2UsCi0JCQkJCQkmZGV2X2F0dHJfYXZjKTsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKHNuZF9taXNjLnRoaXNfZGV2aWNlLAotCQkJCQkJJmRldl9hdHRyX2RldmljZSk7Ci0JCW1pc2NfZGVyZWdpc3Rlcigmc25kX21pc2MpOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc25kX3BsYXRfZHJpdmVyID0gewotCS5wcm9iZSA9IHNuZF9wcm9iZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc21fc25kIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNuZF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc25kX3BsYXRfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoc25kX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvc25kX2FkaWUuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L3NuZF9hZGllLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MGVkOTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvc25kX2FkaWUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX3JwY3JvdXRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1L3NuZF9hZGllLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi1zdGF0aWMgc3RydWN0IGFkaWVfc3ZjX2NsaWVudCBhZGllX2NsaWVudFtBRElFX1NWQ19NQVhfQ0xJRU5UU107Ci1zdGF0aWMgREVGSU5FX01VVEVYKGFkaWVfY2xpZW50X2xvY2spOwotCi1zdGF0aWMgaW50IGFkaWVfc3ZjX3Byb2Nlc3NfY2Ioc3RydWN0IG1zbV9ycGNfY2xpZW50ICpjbGllbnQsCi0JCQkJIHZvaWQgKmJ1ZmZlciwgaW50IGluX3NpemUpCi17Ci0JaW50IHJjLCBpZDsKLQl1aW50MzJfdCBhY2NlcHRfc3RhdHVzOwotCXN0cnVjdCBycGNfcmVxdWVzdF9oZHIgKnJlcTsKLQlzdHJ1Y3QgYWRpZV9zdmNfY2xpZW50X3JlZ2lzdGVyX2NiX2NiX2FyZ3MgYXJnLCAqYnVmX3B0cjsKLQotCXJlcSA9IChzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyICopYnVmZmVyOwotCWZvciAoaWQgPSAwOyBpZCA8IEFESUVfU1ZDX01BWF9DTElFTlRTOyBpZCsrKSB7Ci0JCWlmIChhZGllX2NsaWVudFtpZF0ucnBjX2NsaWVudCA9PSBjbGllbnQpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGlkID09IEFESUVfU1ZDX01BWF9DTElFTlRTKSB7Ci0JCU1NX0VSUigiUlBDIHJlcGx5IHdpdGggaW52YWxpZCBycGMgY2xpZW50XG4iKTsKLQkJYWNjZXB0X3N0YXR1cyA9IFJQQ19BQ0NFUFRTVEFUX1NZU1RFTV9FUlI7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWJ1Zl9wdHIgPSAoc3RydWN0IGFkaWVfc3ZjX2NsaWVudF9yZWdpc3Rlcl9jYl9jYl9hcmdzICopKHJlcSArIDEpOwotCWFyZy5jYl9pZAkJPSBiZTMyX3RvX2NwdShidWZfcHRyLT5jYl9pZCk7Ci0JYXJnLnNpemUJCT0gYmUzMl90b19jcHUoYnVmX3B0ci0+c2l6ZSk7Ci0JYXJnLmNsaWVudF9pZAkJPSBiZTMyX3RvX2NwdShidWZfcHRyLT5jbGllbnRfaWQpOwotCWFyZy5hZGllX2Jsb2NrCQk9IGJlMzJfdG9fY3B1KGJ1Zl9wdHItPmFkaWVfYmxvY2spOwotCWFyZy5zdGF0dXMJCT0gYmUzMl90b19jcHUoYnVmX3B0ci0+c3RhdHVzKTsKLQlhcmcuY2xpZW50X29wZXJhdGlvbgk9IGJlMzJfdG9fY3B1KGJ1Zl9wdHItPmNsaWVudF9vcGVyYXRpb24pOwotCi0JaWYgKGFyZy5jYl9pZCAhPSBhZGllX2NsaWVudFtpZF0uY2JfaWQpIHsKLQkJTU1fRVJSKCJSUEMgcmVwbHkgd2l0aCBpbnZhbGlkIGludmFsaWQgY2JfaWRcbiIpOwotCQlhY2NlcHRfc3RhdHVzID0gUlBDX0FDQ0VQVFNUQVRfU1lTVEVNX0VSUjsKLQkJZ290byBlcnI7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYWRpZV9jbGllbnRbaWRdLmxvY2spOwotCXN3aXRjaCAoYXJnLmNsaWVudF9vcGVyYXRpb24pIHsKLQljYXNlIEFESUVfU1ZDX1JFR0lTVEVSX0NMSUVOVDoKLQkJTU1fREJHKCJBRElFX1NWQ19SRUdJU1RFUl9DTElFTlQgY2FsbGJhY2tcbiIpOwotCQlhZGllX2NsaWVudFtpZF0uY2xpZW50X2lkID0gYXJnLmNsaWVudF9pZDsKLQkJYnJlYWs7Ci0JY2FzZSBBRElFX1NWQ19ERVJFR0lTVEVSX0NMSUVOVDoKLQkJTU1fREJHKCJBRElFX1NWQ19ERVJFR0lTVEVSX0NMSUVOVCBjYWxsYmFja1xuIik7Ci0JCWJyZWFrOwotCWNhc2UgQURJRV9TVkNfQ09ORklHX0FESUVfQkxPQ0s6Ci0JCU1NX0RCRygiQURJRV9TVkNfQ09ORklHX0FESUVfQkxPQ0sgY2FsbGJhY2tcbiIpOwotCQlpZiAoYWRpZV9jbGllbnRbaWRdLmNsaWVudF9pZCAhPSBhcmcuY2xpZW50X2lkKSB7Ci0JCQltdXRleF91bmxvY2soJmFkaWVfY2xpZW50W2lkXS5sb2NrKTsKLQkJCWFjY2VwdF9zdGF0dXMgPSBSUENfQUNDRVBUU1RBVF9TWVNURU1fRVJSOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYWNjZXB0X3N0YXR1cyA9IFJQQ19BQ0NFUFRTVEFUX1NZU1RFTV9FUlI7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWFkaWVfY2xpZW50W2lkXS5zdGF0dXMgPSBhcmcuc3RhdHVzOwotCWFkaWVfY2xpZW50W2lkXS5hZGllX3N2Y19jYl9kb25lID0gMTsKLQltdXRleF91bmxvY2soJmFkaWVfY2xpZW50W2lkXS5sb2NrKTsKLQl3YWtlX3VwKCZhZGllX2NsaWVudFtpZF0ud3EpOwotCWFjY2VwdF9zdGF0dXMgPSBSUENfQUNDRVBUU1RBVF9TVUNDRVNTOwotCi1lcnI6Ci0JbXNtX3JwY19zdGFydF9hY2NlcHRlZF9yZXBseShjbGllbnQsIGJlMzJfdG9fY3B1KHJlcS0+eGlkKSwKLQkJCQkgICAgIGFjY2VwdF9zdGF0dXMpOwotCXJjID0gbXNtX3JwY19zZW5kX2FjY2VwdGVkX3JlcGx5KGNsaWVudCwgMCk7Ci0JaWYgKHJjKQotCQlNTV9FUlIoIiVzOiBzZW5kIGFjY2VwdGVkIHJlcGx5IGZhaWxlZDogJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYWRpZV9zdmNfcnBjX2NiX2Z1bmMoc3RydWN0IG1zbV9ycGNfY2xpZW50ICpjbGllbnQsCi0JCQkgICAgdm9pZCAqYnVmZmVyLCBpbnQgaW5fc2l6ZSkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBycGNfcmVxdWVzdF9oZHIgKnJlcTsKLQotCXJlcSA9IChzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyICopYnVmZmVyOwotCi0JTU1fREJHKCJwcm9jZWR1cmUgcmVjZWl2ZWQgdG8gcnBjIGNiICVkXG4iLAotCQkJYmUzMl90b19jcHUocmVxLT5wcm9jZWR1cmUpKTsKLQlzd2l0Y2ggKGJlMzJfdG9fY3B1KHJlcS0+cHJvY2VkdXJlKSkgewotCWNhc2UgQURJRV9TVkNfQ0xJRU5UX1NUQVRVU19GVU5DX1BUUl9UWVBFX1BST0M6Ci0JCXJjID0gYWRpZV9zdmNfcHJvY2Vzc19jYihjbGllbnQsIGJ1ZmZlciwgaW5fc2l6ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiJXM6IHByb2NlZHVyZSBub3Qgc3VwcG9ydGVkICVkXG4iLCBfX2Z1bmNfXywKLQkJICAgICAgIGJlMzJfdG9fY3B1KHJlcS0+cHJvY2VkdXJlKSk7Ci0JCW1zbV9ycGNfc3RhcnRfYWNjZXB0ZWRfcmVwbHkoY2xpZW50LCBiZTMyX3RvX2NwdShyZXEtPnhpZCksCi0JCQkJCSAgICAgUlBDX0FDQ0VQVFNUQVRfUFJPQ19VTkFWQUlMKTsKLQkJcmMgPSBtc21fcnBjX3NlbmRfYWNjZXB0ZWRfcmVwbHkoY2xpZW50LCAwKTsKLQkJaWYgKHJjKQotCQkJTU1fRVJSKCIlczogc2VuZGluZyByZXBseSBmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGFkaWVfc3ZjX2NsaWVudF9yZWdpc3Rlcl9hcmcoc3RydWN0IG1zbV9ycGNfY2xpZW50ICpjbGllbnQsCi0JCXZvaWQgKmJ1Ziwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYWRpZV9zdmNfY2xpZW50X3JlZ2lzdGVyX2NiX2FyZ3MgKmFyZzsKLQotCWFyZyA9IChzdHJ1Y3QgYWRpZV9zdmNfY2xpZW50X3JlZ2lzdGVyX2NiX2FyZ3MgKilkYXRhOwotCi0JKigoaW50ICopYnVmKSA9IGNwdV90b19iZTMyKChpbnQpYXJnLT5jYl9pZCk7Ci0JcmV0dXJuIHNpemVvZihpbnQpOwotfQotCi1zdGF0aWMgaW50IGFkaWVfc3ZjX2NsaWVudF9kZXJlZ2lzdGVyX2FyZyhzdHJ1Y3QgbXNtX3JwY19jbGllbnQgKmNsaWVudCwKLQkJdm9pZCAqYnVmLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBhZGllX3N2Y19jbGllbnRfZGVyZWdpc3Rlcl9jYl9hcmdzICphcmc7Ci0KLQlhcmcgPSAoc3RydWN0IGFkaWVfc3ZjX2NsaWVudF9kZXJlZ2lzdGVyX2NiX2FyZ3MgKilkYXRhOwotCi0JKigoaW50ICopYnVmKSA9IGNwdV90b19iZTMyKGFyZy0+Y2xpZW50X2lkKTsKLQlyZXR1cm4gc2l6ZW9mKGludCk7Ci19Ci0KLXN0YXRpYyBpbnQgYWRpZV9zdmNfY29uZmlnX2FkaWVfYmxvY2tfYXJnKHN0cnVjdCBtc21fcnBjX2NsaWVudCAqY2xpZW50LAotCQl2b2lkICpidWYsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGFkaWVfc3ZjX2NvbmZpZ19hZGllX2Jsb2NrX2NiX2FyZ3MgKmFyZzsKLQlpbnQgc2l6ZSA9IDA7Ci0KLQlhcmcgPSAoc3RydWN0IGFkaWVfc3ZjX2NvbmZpZ19hZGllX2Jsb2NrX2NiX2FyZ3MgKilkYXRhOwotCi0JKigoaW50ICopYnVmKSA9IGNwdV90b19iZTMyKGFyZy0+Y2xpZW50X2lkKTsKLQlzaXplICs9IHNpemVvZihpbnQpOwotCWJ1ZiArPSBzaXplb2YoaW50KTsKLQotCSooKGludCAqKWJ1ZikgPSBjcHVfdG9fYmUzMihhcmctPmFkaWVfYmxvY2spOwotCXNpemUgKz0gc2l6ZW9mKGludCk7Ci0JYnVmICs9IHNpemVvZihpbnQpOwotCi0JKigoaW50ICopYnVmKSA9IGNwdV90b19iZTMyKGFyZy0+Y29uZmlnKTsKLQlzaXplICs9IHNpemVvZihpbnQpOwotCi0JcmV0dXJuIHNpemU7Ci19Ci0KLS8qIFJldHVybnMgOiBjbGllbnQgaWQgb24gc3VjY2VzcwotICogICAgICAgICAgIGFuZCAtMSBvbiBmYWlsdXJlCi0gKi8KLWludCBhZGllX3N2Y19nZXQodm9pZCkKLXsKLQlpbnQgaWQsIHJjID0gMDsKLQlzdHJ1Y3QgYWRpZV9zdmNfY2xpZW50X3JlZ2lzdGVyX2NiX2FyZ3MgYXJnOwotCi0JbXV0ZXhfbG9jaygmYWRpZV9jbGllbnRfbG9jayk7Ci0JZm9yIChpZCA9IDA7IGlkIDwgQURJRV9TVkNfTUFYX0NMSUVOVFM7IGlkKyspIHsKLQkJaWYgKGFkaWVfY2xpZW50W2lkXS5jbGllbnRfaWQgPT0gLTEgJiYKLQkJCQlhZGllX2NsaWVudFtpZF0ucnBjX2NsaWVudCA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpZCA9PSBBRElFX1NWQ19NQVhfQ0xJRU5UUykgewotCQltdXRleF91bmxvY2soJmFkaWVfY2xpZW50X2xvY2spOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYWRpZV9jbGllbnRbaWRdLmxvY2spOwotCWFkaWVfY2xpZW50W2lkXS5ycGNfY2xpZW50ID0gbXNtX3JwY19yZWdpc3Rlcl9jbGllbnQoImFkaWVfY2xpZW50IiwKLQkJCQkJCQlBRElFX1NWQ19QUk9HLAotCQkJCQkJCUFESUVfU1ZDX1ZFUlMsIDEsCi0JCQkJCQkJYWRpZV9zdmNfcnBjX2NiX2Z1bmMpOwotCWlmIChJU19FUlIoYWRpZV9jbGllbnRbaWRdLnJwY19jbGllbnQpKSB7Ci0JCU1NX0VSUigiRmFpbGVkIHRvIHJlZ2lzdGVyIFJQQyBjbGllbnRcbiIpOwotCQlhZGllX2NsaWVudFtpZF0ucnBjX2NsaWVudCA9IE5VTEw7Ci0JCW11dGV4X3VubG9jaygmYWRpZV9jbGllbnRbaWRdLmxvY2spOwotCQltdXRleF91bmxvY2soJmFkaWVfY2xpZW50X2xvY2spOwotCQlyZXR1cm4gLTE7Ci0JfQotCW11dGV4X3VubG9jaygmYWRpZV9jbGllbnRfbG9jayk7Ci0KLQlhZGllX2NsaWVudFtpZF0uYWRpZV9zdmNfY2JfZG9uZSA9IDA7Ci0JYXJnLmNiX2lkID0gaWQ7Ci0JYWRpZV9jbGllbnRbaWRdLmNiX2lkID0gYXJnLmNiX2lkOwotCW11dGV4X3VubG9jaygmYWRpZV9jbGllbnRbaWRdLmxvY2spOwotCXJjID0gbXNtX3JwY19jbGllbnRfcmVxKGFkaWVfY2xpZW50W2lkXS5ycGNfY2xpZW50LAotCQkJCVNORF9BRElFX1NWQ19DTElFTlRfUkVHSVNURVJfUFJPQywKLQkJCQlhZGllX3N2Y19jbGllbnRfcmVnaXN0ZXJfYXJnLCAmYXJnLAotCQkJCQlOVUxMLCBOVUxMLCAtMSk7Ci0JaWYgKCFyYykgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhZGllX2NsaWVudFtpZF0ud3EsCi0JCQkJYWRpZV9jbGllbnRbaWRdLmFkaWVfc3ZjX2NiX2RvbmUpOwotCQltdXRleF9sb2NrKCZhZGllX2NsaWVudFtpZF0ubG9jayk7Ci0JCWlmICh1bmxpa2VseShyYyA8IDApKSB7Ci0JCQlpZiAocmMgPT0gLUVSRVNUQVJUU1lTKQotCQkJCU1NX0VSUigid2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlICIKLQkJCQkJCSJyZXR1cm5lZCAtRVJFU1RBUlRTWVNcbiIpOwotCQkJZWxzZQotCQkJCU1NX0VSUigid2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlICIKLQkJCQkJCSJyZXR1cm5lZCBlcnJvclxuIik7Ci0JCQlyYyA9IC0xOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJTU1fREJHKCJTdGF0dXMgJWQgcmVjZWl2ZWQgZnJvbSBDQiBmdW5jdGlvbiwgaWQgJWQgcmMgJWRcbiIsCi0JCSAgICAgICBhZGllX2NsaWVudFtpZF0uc3RhdHVzLCBhZGllX2NsaWVudFtpZF0uY2xpZW50X2lkLCByYyk7Ci0JCXJjID0gaWQ7Ci0JCWlmIChhZGllX2NsaWVudFtpZF0uc3RhdHVzID09IEFESUVfU1ZDX1NUQVRVU19GQUlMVVJFKSB7Ci0JCQlNTV9FUlIoIlJlY2VpdmVkIGZhaWxlZCBzdGF0dXMgZm9yIHJlZ2lzdGVyIHJlcXVlc3RcbiIpOwotCQkJcmMgPSAtMTsKLQkJfSBlbHNlCi0JCQlnb3RvIGRvbmU7Ci0JfSBlbHNlIHsKLQkJTU1fRVJSKCJGYWlsZWQgdG8gc2VuZCByZWdpc3RlciBjbGllbnQgcmVxdWVzdFxuIik7Ci0JCXJjID0gLTE7Ci0JCW11dGV4X2xvY2soJmFkaWVfY2xpZW50W2lkXS5sb2NrKTsKLQl9Ci1lcnI6Ci0JbXNtX3JwY191bnJlZ2lzdGVyX2NsaWVudChhZGllX2NsaWVudFtpZF0ucnBjX2NsaWVudCk7Ci0JYWRpZV9jbGllbnRbaWRdLnJwY19jbGllbnQgPSBOVUxMOwotCWFkaWVfY2xpZW50W2lkXS5jbGllbnRfaWQgPSAtMTsKLQlhZGllX2NsaWVudFtpZF0uY2JfaWQgPSBNU01fUlBDX0NMSUVOVF9OVUxMX0NCX0lEOwotCWFkaWVfY2xpZW50W2lkXS5hZGllX3N2Y19jYl9kb25lID0gMDsKLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhZGllX2NsaWVudFtpZF0ubG9jayk7Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTChhZGllX3N2Y19nZXQpOwotCi0vKiBSZXR1cm5zOiAwIG9uIHN1Y2NlcyBhbmQKLSAqICAgICAgICAgLTEgb24gZmFpbHVyZQotICovCi1pbnQgYWRpZV9zdmNfcHV0KGludCBpZCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBhZGllX3N2Y19jbGllbnRfZGVyZWdpc3Rlcl9jYl9hcmdzIGFyZzsKLQotCWlmIChpZCA8IDAgfHwgaWQgPj0gQURJRV9TVkNfTUFYX0NMSUVOVFMpCi0JCXJldHVybiAtMTsKLQotCW11dGV4X2xvY2soJmFkaWVfY2xpZW50W2lkXS5sb2NrKTsKLQlpZiAoYWRpZV9jbGllbnRbaWRdLmNsaWVudF9pZCA9PSAtMSB8fAotCQkJYWRpZV9jbGllbnRbaWRdLnJwY19jbGllbnQgPT0gTlVMTCkgewotCQltdXRleF91bmxvY2soJmFkaWVfY2xpZW50W2lkXS5sb2NrKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlhcmcuY2xpZW50X2lkID0gYWRpZV9jbGllbnRbaWRdLmNsaWVudF9pZDsKLQlhZGllX2NsaWVudFtpZF0uYWRpZV9zdmNfY2JfZG9uZSA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZhZGllX2NsaWVudFtpZF0ubG9jayk7Ci0JcmMgPSBtc21fcnBjX2NsaWVudF9yZXEoYWRpZV9jbGllbnRbaWRdLnJwY19jbGllbnQsCi0JCQkJCVNORF9BRElFX1NWQ19DTElFTlRfREVSRUdJU1RFUl9QUk9DLAotCQkJCQlhZGllX3N2Y19jbGllbnRfZGVyZWdpc3Rlcl9hcmcsICZhcmcsCi0JCQkJCU5VTEwsIE5VTEwsIC0xKTsKLQlpZiAoIXJjKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGFkaWVfY2xpZW50W2lkXS53cSwKLQkJCQlhZGllX2NsaWVudFtpZF0uYWRpZV9zdmNfY2JfZG9uZSk7Ci0JCWlmICh1bmxpa2VseShyYyA8IDApKSB7Ci0JCQlpZiAocmMgPT0gLUVSRVNUQVJUU1lTKQotCQkJCU1NX0VSUigid2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlICIKLQkJCQkJCSJyZXR1cm5lZCAtRVJFU1RBUlRTWVNcbiIpOwotCQkJZWxzZQotCQkJCU1NX0VSUigid2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlICIKLQkJCQkJCSJyZXR1cm5lZCBlcnJvclxuIik7Ci0JCQlyYyA9IC0xOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJTU1fREJHKCJTdGF0dXMgcmVjZWl2ZWQgZnJvbSBDQiBmdW5jdGlvblxuIik7Ci0JCW11dGV4X2xvY2soJmFkaWVfY2xpZW50W2lkXS5sb2NrKTsKLQkJaWYgKGFkaWVfY2xpZW50W2lkXS5zdGF0dXMgPT0gQURJRV9TVkNfU1RBVFVTX0ZBSUxVUkUpIHsKLQkJCXJjID0gLTE7Ci0JCX0gZWxzZSB7Ci0JCQltc21fcnBjX3VucmVnaXN0ZXJfY2xpZW50KGFkaWVfY2xpZW50W2lkXS5ycGNfY2xpZW50KTsKLQkJCWFkaWVfY2xpZW50W2lkXS5ycGNfY2xpZW50ID0gTlVMTDsKLQkJCWFkaWVfY2xpZW50W2lkXS5jbGllbnRfaWQgPSAtMTsKLQkJCWFkaWVfY2xpZW50W2lkXS5jYl9pZCA9IE1TTV9SUENfQ0xJRU5UX05VTExfQ0JfSUQ7Ci0JCQlhZGllX2NsaWVudFtpZF0uYWRpZV9zdmNfY2JfZG9uZSA9IDA7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZhZGllX2NsaWVudFtpZF0ubG9jayk7Ci0JfSBlbHNlIHsKLQkJTU1fRVJSKCJGYWlsZWQgdG8gc2VuZCBkZXJlZ2lzdGVyIGNsaWVudCByZXF1ZXN0XG4iKTsKLQkJcmMgPSAtMTsKLQl9Ci1lcnI6Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTChhZGllX3N2Y19wdXQpOwotCi0vKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MKLSAqICAgICAgICAgIDIgYWxyZWFkeSBpbiB1c2UKLSAqICAgICAgICAgLTEgb24gZmFpbHVyZQotICovCi1pbnQgYWRpZV9zdmNfY29uZmlnX2FkaWVfYmxvY2soaW50IGlkLAotCQllbnVtIGFkaWVfYmxvY2tfZW51bV90eXBlIGFkaWVfYmxvY2tfdHlwZSwgYm9vbCBlbmFibGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYWRpZV9zdmNfY29uZmlnX2FkaWVfYmxvY2tfY2JfYXJncyBhcmc7Ci0KLQlpZiAoaWQgPCAwIHx8IGlkID49IEFESUVfU1ZDX01BWF9DTElFTlRTKQotCQlyZXR1cm4gLTE7Ci0KLQltdXRleF9sb2NrKCZhZGllX2NsaWVudFtpZF0ubG9jayk7Ci0JaWYgKGFkaWVfY2xpZW50W2lkXS5jbGllbnRfaWQgPT0gLTEgfHwKLQkJCWFkaWVfY2xpZW50W2lkXS5ycGNfY2xpZW50ID09IE5VTEwpIHsKLQkJbXV0ZXhfdW5sb2NrKCZhZGllX2NsaWVudFtpZF0ubG9jayk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JYXJnLmNsaWVudF9pZCAJPSBhZGllX2NsaWVudFtpZF0uY2xpZW50X2lkOwotCWFyZy5hZGllX2Jsb2NrCT0gYWRpZV9ibG9ja190eXBlOwotCWFyZy5jb25maWcJPSAoZW51bSBhZGllX2NvbmZpZ19lbnVtX3R5cGUpZW5hYmxlOwotCWFkaWVfY2xpZW50W2lkXS5hZGllX3N2Y19jYl9kb25lID0gMDsKLQltdXRleF91bmxvY2soJmFkaWVfY2xpZW50W2lkXS5sb2NrKTsKLQlyYyA9IG1zbV9ycGNfY2xpZW50X3JlcShhZGllX2NsaWVudFtpZF0ucnBjX2NsaWVudCwKLQkJCQkJU05EX0FESUVfU1ZDX0NPTkZJR19BRElFX0JMT0NLX1BST0MsCi0JCQkJCWFkaWVfc3ZjX2NvbmZpZ19hZGllX2Jsb2NrX2FyZywgJmFyZywKLQkJCQkJTlVMTCwgTlVMTCwgLTEpOwotCWlmICghcmMpIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYWRpZV9jbGllbnRbaWRdLndxLAotCQkJCWFkaWVfY2xpZW50W2lkXS5hZGllX3N2Y19jYl9kb25lKTsKLQkJaWYgKHVubGlrZWx5KHJjIDwgMCkpIHsKLQkJCWlmIChyYyA9PSAtRVJFU1RBUlRTWVMpCi0JCQkJTU1fRVJSKCJ3YWl0X2V2ZW50X2ludGVycnVwdGlibGUgIgotCQkJCQkJInJldHVybmVkIC1FUkVTVEFSVFNZU1xuIik7Ci0JCQllbHNlCi0JCQkJTU1fRVJSKCJ3YWl0X2V2ZW50X2ludGVycnVwdGlibGUgIgotCQkJCQkJInJldHVybmVkIGVycm9yXG4iKTsKLQkJCXJjID0gLTE7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlNTV9EQkcoIlN0YXR1cyByZWNlaXZlZCBmcm9tIENCIGZ1bmN0aW9uXG4iKTsKLQkJbXV0ZXhfbG9jaygmYWRpZV9jbGllbnRbaWRdLmxvY2spOwotCQlpZiAoYWRpZV9jbGllbnRbaWRdLnN0YXR1cyA9PSBBRElFX1NWQ19TVEFUVVNfRkFJTFVSRSkKLQkJCXJjID0gLTE7Ci0JCWVsc2UKLQkJCXJjID0gYWRpZV9jbGllbnRbaWRdLnN0YXR1czsKLQkJbXV0ZXhfdW5sb2NrKCZhZGllX2NsaWVudFtpZF0ubG9jayk7Ci0JfSBlbHNlIHsKLQkJTU1fRVJSKCJGYWlsZWQgdG8gc2VuZCBhZGllIGJsb2NrIGNvbmZpZyByZXF1ZXN0XG4iKTsKLQkJcmMgPSAtMTsKLQl9Ci1lcnI6Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTChhZGllX3N2Y19jb25maWdfYWRpZV9ibG9jayk7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQotc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotCi1zdGF0aWMgc3NpemVfdCBzbmRfYWRpZV9kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNuZF9hZGllX2RlYnVnX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlpbnQgcmMgPSAwLCBvcCA9IDA7Ci0JaW50IGlkID0gMCwgYWRpZV9ibG9jayA9IDAsIGNvbmZpZyA9IDE7Ci0KLQlzc2NhbmYoYnVmLCAiJWQgJWQgJWQgJWQiLCAmb3AsICZpZCwgJmFkaWVfYmxvY2ssICZjb25maWcpOwotCU1NX0lORk8oIlxuVXNlciBpbnB1dDogb3AgJWQgaWQgJWQgYmxvY2sgJWQgY29uZmlnICVkXG4iLCBvcCwgaWQsCi0JCQlhZGllX2Jsb2NrLCBjb25maWcpOwotCXN3aXRjaCAob3ApIHsKLQljYXNlIEFESUVfU1ZDX1JFR0lTVEVSX0NMSUVOVDoKLQkJTU1fSU5GTygiQURJRV9TVkNfUkVHSVNURVJfQ0xJRU5UXG4iKTsKLQkJcmMgPSBhZGllX3N2Y19nZXQoKTsKLQkJaWYgKHJjID49IDApCi0JCQlNTV9JTkZPKCJDbGllbnQgcmVnaXN0ZXJlZDogJWRcbiIsIHJjKTsKLQkJZWxzZQotCQkJTU1fRVJSKCJGYWlsZWQgcmVnaXN0ZXJpbmcgY2xpZW50XG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRElFX1NWQ19ERVJFR0lTVEVSX0NMSUVOVDoKLQkJTU1fSU5GTygiQURJRV9TVkNfREVSRUdJU1RFUl9DTElFTlQ6ICVkXG4iLCBpZCk7Ci0JCXJjID0gYWRpZV9zdmNfcHV0KGlkKTsKLQkJaWYgKCFyYykKLQkJCU1NX0lORk8oIkNsaWVudCAlZCBkZXJlZ2lzdGVyZWRcbiIsIGlkKTsKLQkJZWxzZQotCQkJTU1fRVJSKCJGYWlsZWQgdW5yZWdpc3RlcmluZyB0aGUgY2xpZW50OiAlZFxuIiwJaWQpOwotCQlicmVhazsKLQljYXNlIEFESUVfU1ZDX0NPTkZJR19BRElFX0JMT0NLOgotCQlNTV9JTkZPKCJBRElFX1NWQ19DT05GSUdfQURJRV9CTE9DSzogaWQgJWQgYWRpZV9ibG9jayAlZCBcCi0JCQkJY29uZmlnICVkXG4iLCBpZCwgYWRpZV9ibG9jaywgY29uZmlnKTsKLQkJcmMgPSAgYWRpZV9zdmNfY29uZmlnX2FkaWVfYmxvY2soaWQsCi0JCQkoZW51bSBhZGllX2Jsb2NrX2VudW1fdHlwZSlhZGllX2Jsb2NrLCAoYm9vbCljb25maWcpOwotCQlpZiAoIXJjKQotCQkJTU1fSU5GTygiQURJRSBibG9jayAlZCAlcyIsIGFkaWVfYmxvY2ssCi0JCQkJCWNvbmZpZyA/ICJlbmFibGVkXG4iIDogImRpc2FibGVkXG4iKTsKLQkJZWxzZSBpZiAocmMgPT0gMikKLQkJCU1NX0lORk8oIkFESUUgYmxvY2sgJWQgYWxyZWFkeSBpbiB1c2VcbiIsIGFkaWVfYmxvY2spOwotCQllbHNlCi0JCQlNTV9FUlIoIkVSUk9SIGNvbmZpZ3VyaW5nIHRoZSBBRElFIGJsb2NrXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fSU5GTygiSW52YWxpZCBvcGVyYXRpb25cbiIpOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNuZF9hZGllX2RlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0YXRpYyBjaGFyIGJ1ZmZlclsxMDI0XTsKLQljb25zdCBpbnQgZGVidWdfYnVmbWF4ID0gc2l6ZW9mKGJ1ZmZlcik7Ci0JaW50IGlkLCBuID0gMDsKLQotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiTElTVCBPRiBDTElFTlRTXG4iKTsKLQlmb3IgKGlkID0gMDsgaWQgPCBBRElFX1NWQ19NQVhfQ0xJRU5UUyA7IGlkKyspIHsKLQkJaWYgKGFkaWVfY2xpZW50W2lkXS5jbGllbnRfaWQgIT0gLTEgJiYKLQkJCQlhZGllX2NsaWVudFtpZF0ucnBjX2NsaWVudCAhPSBOVUxMKSB7Ci0JCQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSJpZCAlZCBycGMgY2xpZW50IDB4JTA4eFxuIiwgaWQsCi0JCQkJKHVpbnQzMl90KWFkaWVfY2xpZW50W2lkXS5ycGNfY2xpZW50KTsKLQkJfQotCX0KLQlidWZmZXJbbl0gPSAwOwotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCBidWZmZXIsIG4pOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbmRfYWRpZV9kZWJ1Z19mb3BzID0gewotCS5yZWFkID0gc25kX2FkaWVfZGVidWdfcmVhZCwKLQkub3BlbiA9IHNuZF9hZGllX2RlYnVnX29wZW4sCi0JLndyaXRlID0gc25kX2FkaWVfZGVidWdfd3JpdGUsCi19OwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzbmRfYWRpZV9leGl0KHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JaWYgKGRlbnRyeSkKLQkJZGVidWdmc19yZW1vdmUoZGVudHJ5KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW50IF9faW5pdCBzbmRfYWRpZV9pbml0KHZvaWQpCi17Ci0JaW50IGlkOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9zbmRfYWRpZSJdOwotCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mIG5hbWUsICJtc21fc25kX2FkaWUiKTsKLQlkZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VHTywKLQkJCU5VTEwsIE5VTEwsICZzbmRfYWRpZV9kZWJ1Z19mb3BzKTsKLQlpZiAoSVNfRVJSKGRlbnRyeSkpCi0JCU1NX0RCRygiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOwotI2VuZGlmCi0JZm9yIChpZCA9IDA7IGlkIDwgQURJRV9TVkNfTUFYX0NMSUVOVFM7IGlkKyspIHsKLQkJYWRpZV9jbGllbnRbaWRdLmNsaWVudF9pZCA9IC0xOwotCQlhZGllX2NsaWVudFtpZF0uY2JfaWQgPSBNU01fUlBDX0NMSUVOVF9OVUxMX0NCX0lEOwotCQlhZGllX2NsaWVudFtpZF0uc3RhdHVzID0gMDsKLQkJYWRpZV9jbGllbnRbaWRdLmFkaWVfc3ZjX2NiX2RvbmUgPSAwOwotCQltdXRleF9pbml0KCZhZGllX2NsaWVudFtpZF0ubG9jayk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFkaWVfY2xpZW50W2lkXS53cSk7Ci0JCWFkaWVfY2xpZW50W2lkXS5ycGNfY2xpZW50ID0gTlVMTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLW1vZHVsZV9pbml0KHNuZF9hZGllX2luaXQpOwotbW9kdWxlX2V4aXQoc25kX2FkaWVfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9zbmRfY2FkLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9zbmRfY2FkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOTJjZWYyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L3NuZF9jYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDYwOCArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9zbmRfY2FkLmMKLSAqCi0gKiBpbnRlcmZhY2UgdG8gInNuZCIgc2VydmljZSBvbiB0aGUgYmFzZWJhbmQgY3B1Ci0gKiBUaGlzIGNvZGUgYWxzbyBib3Jyb3dzIGZyb20gc25kLmMsIHdoaWNoIGlzCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX3JwY3JvdXRlci5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0KLXN0cnVjdCBzbmRfY2FkX2N0eHQgewotCXN0cnVjdCBtdXRleCBsb2NrOwotCWludCBvcGVuZWQ7Ci0Jc3RydWN0IG1zbV9ycGNfZW5kcG9pbnQgKmVwdDsKLQlzdHJ1Y3QgbXNtX2NhZF9lbmRwb2ludHMgKmNhZF9lcHRzOwotfTsKLQotc3RydWN0IHNuZF9jYWRfc3lzX2N0eHQgewotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtc21fcnBjX2VuZHBvaW50ICplcHQ7Ci19OwotCi1zdHJ1Y3Qgc25kX2N1cnJfZGV2X2luZm8gewotCWludCByeF9kZXY7Ci0JaW50IHR4X2RldjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX2NhZF9zeXNfY3R4dCB0aGVfc25kX2NhZF9zeXM7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX2NhZF9jdHh0IHRoZV9zbmQ7Ci1zdGF0aWMgc3RydWN0IHNuZF9jdXJyX2Rldl9pbmZvIGN1cnJfZGV2OwotCi0jZGVmaW5lIFJQQ19TTkRfUFJPRwkweDMwMDAwMDAyCi0jZGVmaW5lIFJQQ19TTkRfQ0JfUFJPRwkweDMxMDAwMDAyCi0KLSNkZWZpbmUgUlBDX1NORF9WRVJTCTB4MDAwMzAwMDMKLQotI2RlZmluZSBTTkRfQ0FEX1NFVF9ERVZJQ0VfUFJPQyA0MAotI2RlZmluZSBTTkRfQ0FEX1NFVF9WT0xVTUVfUFJPQyAzOQotI2RlZmluZSBNQVhfU05EX0FDVElWRV9ERVZJQ0UgMgotCi1zdHJ1Y3QgcnBjX2NhZF9zZXRfZGV2aWNlX2FyZ3MgewotCXN0cnVjdCBjYWRfZGV2aWNlc190eXBlIGRldmljZTsKLQl1aW50MzJfdCBlYXJfbXV0ZTsKLQl1aW50MzJfdCBtaWNfbXV0ZTsKLQotCXVpbnQzMl90IGNiX2Z1bmM7Ci0JdWludDMyX3QgY2xpZW50X2RhdGE7Ci19OwotCi1zdHJ1Y3QgcnBjX2NhZF9zZXRfdm9sdW1lX2FyZ3MgewotCXN0cnVjdCBjYWRfZGV2aWNlc190eXBlIGRldmljZTsKLQl1aW50MzJfdCBtZXRob2Q7Ci0JdWludDMyX3Qgdm9sdW1lOwotCi0JdWludDMyX3QgY2JfZnVuYzsKLQl1aW50MzJfdCBjbGllbnRfZGF0YTsKLX07Ci0KLXN0cnVjdCBzbmRfY2FkX3NldF9kZXZpY2VfbXNnIHsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIGhkcjsKLQlzdHJ1Y3QgcnBjX2NhZF9zZXRfZGV2aWNlX2FyZ3MgYXJnczsKLX07Ci0KLXN0cnVjdCBzbmRfY2FkX3NldF92b2x1bWVfbXNnIHsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIGhkcjsKLQlzdHJ1Y3QgcnBjX2NhZF9zZXRfdm9sdW1lX2FyZ3MgYXJnczsKLX07Ci0KLXN0cnVjdCBjYWRfZW5kcG9pbnQgKmdldF9jYWRfZW5kcG9pbnRzKGludCAqc2l6ZSk7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7Ci0KLXN0YXRpYyBpbnQgcnRjX2dldGRldmljZV9kYmdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCU1NX0lORk8oImRlYnVnIGludGYgJXNcbiIsIChjaGFyICopIGZpbGUtPnByaXZhdGVfZGF0YSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHJ0Y19nZXRkZXZpY2VfZGJnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWludCBuID0gMDsKLQlzdGF0aWMgY2hhciAqYnVmZmVyOwotCXN0YXRpYyBjaGFyICpzd2FwX2J1ZjsKLQljb25zdCBpbnQgZGVidWdfYnVmbWF4ID0gMTAyNDsKLQlpbnQgc3dhcF9jb3VudCA9IDA7Ci0JaW50IHJjID0gMDsKLQlpbnQgZGV2X2NvdW50ID0gMDsKLQlpbnQgZGV2X2lkID0gMDsKLQlzdHJ1Y3QgbXNtX2NhZF9lbmRwb2ludHMgKm1zbV9jYWRfZXB0cyA9IHRoZV9zbmQuY2FkX2VwdHM7Ci0Jc3RydWN0IGNhZF9lbmRwb2ludCAqY2FkX2VwdHM7Ci0KLQlidWZmZXIgPSBrbWFsbG9jKHNpemVvZihjaGFyKSAqIDEwMjQsIEdGUF9LRVJORUwpOwotCWlmIChidWZmZXIgPT0gTlVMTCkgewotCQlNTV9FUlIoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgYnVmZmVyIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXN3YXBfYnVmID0ga21hbGxvYyhzaXplb2YoY2hhcikgKiAxMDI0LCBHRlBfS0VSTkVMKTsKLQlpZiAoc3dhcF9idWYgPT0gTlVMTCkgewotCQlNTV9FUlIoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3Igc3dhcCBidWZmZXIgZmFpbGVkXG4iKTsKLQkJa2ZyZWUoYnVmZmVyKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaWYgKG1zbV9jYWRfZXB0cy0+bnVtIDw9IDApIHsKLQkJZGV2X2NvdW50ID0gMDsKLQkJbiA9IHNjbnByaW50ZihidWZmZXIsIGRlYnVnX2J1Zm1heCwgIkRFVl9OTzoweCV4XG4iLAotCQkJCW1zbV9jYWRfZXB0cy0+bnVtKTsKLQl9IGVsc2UgewotCQlmb3IgKGRldl9pZCA9IDA7IGRldl9pZCA8IG1zbV9jYWRfZXB0cy0+bnVtOyBkZXZfaWQrKykgewotCQkJY2FkX2VwdHMgPSAmbXNtX2NhZF9lcHRzLT5lbmRwb2ludHNbZGV2X2lkXTsKLQkJCWlmIChJU19FUlIoY2FkX2VwdHMpKSB7Ci0JCQkJTU1fRVJSKCJpbnZhbGlkIHNuZCBlbmRwb2ludCBmb3IgZGV2X2lkICVkXG4iLAotCQkJCQlkZXZfaWQpOwotCQkJCXJjID0gUFRSX0VSUihjYWRfZXB0cyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICgoY2FkX2VwdHMtPmlkICE9IGN1cnJfZGV2LnR4X2RldikgJiYKLQkJCQkoY2FkX2VwdHMtPmlkICE9IGN1cnJfZGV2LnJ4X2RldikpCi0JCQkJY29udGludWU7Ci0KLQkJCW4gKz0gc2NucHJpbnRmKHN3YXBfYnVmICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkJIkFDREJfSUQ6MHgleDtDQVBCOjB4JXhcbiIsCi0JCQkJCWNhZF9lcHRzLT5pZCwKLQkJCQkJY2FkX2VwdHMtPmNhcGFiaWxpdHkpOwotCQkJZGV2X2NvdW50Kys7Ci0JCQlNTV9EQkcoIlJUQyBHZXQgRGV2aWNlICV4IENhcGIgJXggRGV2IENvdW50ICV4XG4iLAotCQkJCQlkZXZfaWQsIGNhZF9lcHRzLT5jYXBhYmlsaXR5LAotCQkJCQlkZXZfY291bnQpOwotCi0JCX0KLQl9Ci0Jc3dhcF9jb3VudCA9IHNjbnByaW50ZihidWZmZXIsIGRlYnVnX2J1Zm1heCwgXAotCQkJIkRFVl9OTzoweCV4XG4iLCBkZXZfY291bnQpOwotCi0JbWVtY3B5KGJ1ZmZlcitzd2FwX2NvdW50LCBzd2FwX2J1ZiwgbipzaXplb2YoY2hhcikpOwotCW4gPSBuK3N3YXBfY291bnQ7Ci0KLQlidWZmZXJbbl0gPSAwOwotCXJjID0gIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGJ1ZmZlciwgbik7Ci0Ja2ZyZWUoYnVmZmVyKTsKLQlrZnJlZShzd2FwX2J1Zik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBydGNfYWNkYl9kZWJ1Z19mb3BzID0gewotCS5vcGVuID0gcnRjX2dldGRldmljZV9kYmdfb3BlbiwKLQkucmVhZCA9IHJ0Y19nZXRkZXZpY2VfZGJnX3JlYWQKLX07Ci0KLXN0YXRpYyBpbnQgcnRjX2RlYnVnZnNfY3JlYXRlX2VudHJ5KHZvaWQpCi17Ci0JaW50IHJjID0gMDsKLQljaGFyIG5hbWVbc2l6ZW9mICJydGNfZ2V0X2RldmljZSIrMV07Ci0KLQlzbnByaW50ZihuYW1lLCBzaXplb2YgbmFtZSwgInJ0Y19nZXRfZGV2aWNlIik7Ci0JZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCU5VTEwsIE5VTEwsICZydGNfYWNkYl9kZWJ1Z19mb3BzKTsKLQlpZiAoSVNfRVJSKGRlbnRyeSkpIHsKLQkJTU1fRVJSKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7Ci0JCXJjID0gUFRSX0VSUihkZW50cnkpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0jZWxzZQotc3RhdGljIGludCBydGNfZGVidWdmc19jcmVhdGVfZW50cnkoKQotewotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX211dGUoaW50IG11dGUpCi17Ci0JcmV0dXJuIChtdXRlID09IFNORF9NVVRFX01VVEVEIHx8Ci0JCW11dGUgPT0gU05EX01VVEVfVU5NVVRFRCkgPyAwIDogLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCBnZXRfZW5kcG9pbnQoc3RydWN0IHNuZF9jYWRfY3R4dCAqc25kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmMgPSAwLCBpbmRleDsKLQlzdHJ1Y3QgbXNtX2NhZF9lbmRwb2ludCBlcHQ7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmVwdCwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoZXB0KSkpIHsKLQkJTU1fRVJSKCJjYWRfaW9jdGwgZ2V0IGVuZHBvaW50OiBpbnZhbGlkIHJlYWQgcG9pbnRlclxuIik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCWluZGV4ID0gZXB0LmlkOwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc25kLT5jYWRfZXB0cy0+bnVtKSB7Ci0JCU1NX0VSUigic25kX2lvY3RsIGdldCBlbmRwb2ludDogaW52YWxpZCBpbmRleCFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQllcHQuaWQgPSBzbmQtPmNhZF9lcHRzLT5lbmRwb2ludHNbaW5kZXhdLmlkOwotCXN0cmxjcHkoZXB0Lm5hbWUsCi0JCXNuZC0+Y2FkX2VwdHMtPmVuZHBvaW50c1tpbmRleF0ubmFtZSwKLQkJc2l6ZW9mKGVwdC5uYW1lKSk7Ci0KLQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmVwdCwgc2l6ZW9mKGVwdCkpKSB7Ci0JCU1NX0VSUigic25kX2lvY3RsIGdldCBlbmRwb2ludDogaW52YWxpZCB3cml0ZSBwb2ludGVyXG4iKTsKLQkJcmMgPSAtRUZBVUxUOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgc25kX2NhZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHNuZF9jYWRfc2V0X2RldmljZV9tc2cgZG1zZzsKLQlzdHJ1Y3Qgc25kX2NhZF9zZXRfdm9sdW1lX21zZyB2bXNnOwotCi0Jc3RydWN0IG1zbV9jYWRfZGV2aWNlX2NvbmZpZyBkZXY7Ci0Jc3RydWN0IG1zbV9jYWRfdm9sdW1lX2NvbmZpZyB2b2w7Ci0Jc3RydWN0IHNuZF9jYWRfY3R4dCAqc25kID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQltdXRleF9sb2NrKCZzbmQtPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRfU0VUX0RFVklDRToKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkZXYsICh2b2lkIF9fdXNlciAqKSBhcmcsIHNpemVvZihkZXYpKSkgewotCQkJTU1fRVJSKCJzZXQgZGV2aWNlOiBpbnZhbGlkIHBvaW50ZXJcbiIpOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlkbXNnLmFyZ3MuZGV2aWNlLnJ4X2RldmljZSA9IGNwdV90b19iZTMyKGRldi5kZXZpY2UucnhfZGV2aWNlKTsKLQkJZG1zZy5hcmdzLmRldmljZS50eF9kZXZpY2UgPSBjcHVfdG9fYmUzMihkZXYuZGV2aWNlLnR4X2RldmljZSk7Ci0JCWRtc2cuYXJncy5kZXZpY2UucGF0aHR5cGUgPSBjcHVfdG9fYmUzMihkZXYuZGV2aWNlLnBhdGh0eXBlKTsKLQkJZG1zZy5hcmdzLmVhcl9tdXRlID0gY3B1X3RvX2JlMzIoZGV2LmVhcl9tdXRlKTsKLQkJZG1zZy5hcmdzLm1pY19tdXRlID0gY3B1X3RvX2JlMzIoZGV2Lm1pY19tdXRlKTsKLQkJaWYgKGNoZWNrX211dGUoZGV2LmVhcl9tdXRlKSA8IDAgfHwKLQkJCQljaGVja19tdXRlKGRldi5taWNfbXV0ZSkgPCAwKSB7Ci0JCQlNTV9FUlIoInNldCBkZXZpY2U6IGludmFsaWQgbXV0ZSBzdGF0dXNcbiIpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJZG1zZy5hcmdzLmNiX2Z1bmMgPSAtMTsKLQkJZG1zZy5hcmdzLmNsaWVudF9kYXRhID0gMDsKLQkJY3Vycl9kZXYudHhfZGV2ID0gZGV2LmRldmljZS50eF9kZXZpY2U7Ci0JCWN1cnJfZGV2LnJ4X2RldiA9IGRldi5kZXZpY2UucnhfZGV2aWNlOwotCQlNTV9FUlIoInNuZF9jYWRfc2V0X2RldmljZSAlZCAlZCAlZCAlZFxuIiwgZGV2LmRldmljZS5yeF9kZXZpY2UsCi0JCQlkZXYuZGV2aWNlLnR4X2RldmljZSwgZGV2LmVhcl9tdXRlLCBkZXYubWljX211dGUpOwotCi0JCXJjID0gbXNtX3JwY19jYWxsKHNuZC0+ZXB0LAotCQkJU05EX0NBRF9TRVRfREVWSUNFX1BST0MsCi0JCQkmZG1zZywgc2l6ZW9mKGRtc2cpLCA1ICogSFopOwotCQlicmVhazsKLQotCWNhc2UgU05EX1NFVF9WT0xVTUU6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdm9sLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2Yodm9sKSkpIHsKLQkJCU1NX0VSUigic2V0IHZvbHVtZTogaW52YWxpZCBwb2ludGVyXG4iKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJdm1zZy5hcmdzLmRldmljZS5yeF9kZXZpY2UgPSBjcHVfdG9fYmUzMihkZXYuZGV2aWNlLnJ4X2RldmljZSk7Ci0JCXZtc2cuYXJncy5kZXZpY2UudHhfZGV2aWNlID0gY3B1X3RvX2JlMzIoZGV2LmRldmljZS50eF9kZXZpY2UpOwotCQl2bXNnLmFyZ3MubWV0aG9kID0gY3B1X3RvX2JlMzIodm9sLm1ldGhvZCk7Ci0JCWlmICh2b2wubWV0aG9kICE9IFNORF9NRVRIT0RfVk9JQ0UgJiYKLQkJCQl2b2wubWV0aG9kICE9IFNORF9NRVRIT0RfTUlESSkgewotCQkJTU1fRVJSKCJzZXQgdm9sdW1lOiBpbnZhbGlkIG1ldGhvZCAlZFxuIiwgdm9sLm1ldGhvZCk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCXZtc2cuYXJncy52b2x1bWUgPSBjcHVfdG9fYmUzMih2b2wudm9sdW1lKTsKLQkJdm1zZy5hcmdzLmNiX2Z1bmMgPSAtMTsKLQkJdm1zZy5hcmdzLmNsaWVudF9kYXRhID0gMDsKLQotCQlNTV9FUlIoInNuZF9jYWRfc2V0X3ZvbHVtZSAlZCAlZCAlZCAlZFxuIiwgdm9sLmRldmljZS5yeF9kZXZpY2UsCi0JCQkJdm9sLmRldmljZS50eF9kZXZpY2UsIHZvbC5tZXRob2QsIHZvbC52b2x1bWUpOwotCi0JCXJjID0gbXNtX3JwY19jYWxsKHNuZC0+ZXB0LAotCQkJU05EX0NBRF9TRVRfVk9MVU1FX1BST0MsCi0JCQkmdm1zZywgc2l6ZW9mKHZtc2cpLCA1ICogSFopOwotCi0JCWJyZWFrOwotCi0JY2FzZSBTTkRfR0VUX05VTV9FTkRQT0lOVFM6Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAotCQkJCSZzbmQtPmNhZF9lcHRzLT5udW0sIHNpemVvZih1bnNpZ25lZCkpKSB7Ci0JCQlNTV9FUlIoImdldCBlbmRwb2ludDogaW52YWxpZCBwb2ludGVyXG4iKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU05EX0dFVF9FTkRQT0lOVDoKLQkJcmMgPSBnZXRfZW5kcG9pbnQoc25kLCBhcmcpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigidW5rbm93biBjb21tYW5kXG4iKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZzbmQtPmxvY2spOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHNuZF9jYWRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc25kX2NhZF9jdHh0ICpzbmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjOwotCi0JbXV0ZXhfbG9jaygmc25kLT5sb2NrKTsKLQlyYyA9IG1zbV9ycGNfY2xvc2Uoc25kLT5lcHQpOwotCWlmIChyYyA8IDApCi0JCU1NX0VSUigibXNtX3JwY19jbG9zZSBmYWlsZWRcbiIpOwotCXNuZC0+ZXB0ID0gTlVMTDsKLQlzbmQtPm9wZW5lZCA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZzbmQtPmxvY2spOwotCXJldHVybiAwOwotfQotc3RhdGljIGludCBzbmRfY2FkX3N5c19yZWxlYXNlKHZvaWQpCi17Ci0Jc3RydWN0IHNuZF9jYWRfc3lzX2N0eHQgKnNuZF9jYWRfc3lzID0gJnRoZV9zbmRfY2FkX3N5czsKLQlpbnQgcmMgPSAwOwotCi0JbXV0ZXhfbG9jaygmc25kX2NhZF9zeXMtPmxvY2spOwotCXJjID0gbXNtX3JwY19jbG9zZShzbmRfY2FkX3N5cy0+ZXB0KTsKLQlpZiAocmMgPCAwKQotCQlNTV9FUlIoIm1zbV9ycGNfY2xvc2UgZmFpbGVkXG4iKTsKLQlzbmRfY2FkX3N5cy0+ZXB0ID0gTlVMTDsKLQltdXRleF91bmxvY2soJnNuZF9jYWRfc3lzLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50IHNuZF9jYWRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc25kX2NhZF9jdHh0ICpzbmQgPSAmdGhlX3NuZDsKLQlpbnQgcmMgPSAwOwotCi0JbXV0ZXhfbG9jaygmc25kLT5sb2NrKTsKLQlpZiAoc25kLT5vcGVuZWQgPT0gMCkgewotCQlpZiAoc25kLT5lcHQgPT0gTlVMTCkgewotCQkJc25kLT5lcHQgPSBtc21fcnBjX2Nvbm5lY3RfY29tcGF0aWJsZShSUENfU05EX1BST0csCi0JCQkJCVJQQ19TTkRfVkVSUywgMCk7Ci0JCQlpZiAoSVNfRVJSKHNuZC0+ZXB0KSkgewotCQkJCXJjID0gUFRSX0VSUihzbmQtPmVwdCk7Ci0JCQkJc25kLT5lcHQgPSBOVUxMOwotCQkJCU1NX0VSUigiY2FkIGNvbm5lY3QgZmFpbGVkIHdpdGggVkVSUyAleFxuIiwKLQkJCQkJUlBDX1NORF9WRVJTKTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJfQotCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBzbmQ7Ci0JCXNuZC0+b3BlbmVkID0gMTsKLQl9IGVsc2UgewotCQlNTV9FUlIoInNuZCBhbHJlYWR5IG9wZW5lZFxuIik7Ci0JCXJjID0gLUVCVVNZOwotCX0KLQotZXJyOgotCW11dGV4X3VubG9jaygmc25kLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50IHNuZF9jYWRfc3lzX29wZW4odm9pZCkKLXsKLQlzdHJ1Y3Qgc25kX2NhZF9zeXNfY3R4dCAqc25kX2NhZF9zeXMgPSAmdGhlX3NuZF9jYWRfc3lzOwotCWludCByYyA9IDA7Ci0KLQltdXRleF9sb2NrKCZzbmRfY2FkX3N5cy0+bG9jayk7Ci0JaWYgKHNuZF9jYWRfc3lzLT5lcHQgPT0gTlVMTCkgewotCQlzbmRfY2FkX3N5cy0+ZXB0ID0gbXNtX3JwY19jb25uZWN0X2NvbXBhdGlibGUoUlBDX1NORF9QUk9HLAotCQkJUlBDX1NORF9WRVJTLCAwKTsKLQkJaWYgKElTX0VSUihzbmRfY2FkX3N5cy0+ZXB0KSkgewotCQkJcmMgPSBQVFJfRVJSKHNuZF9jYWRfc3lzLT5lcHQpOwotCQkJc25kX2NhZF9zeXMtPmVwdCA9IE5VTEw7Ci0JCQlNTV9FUlIoImZ1bmMgJXMgOiBjYWQgY29ubmVjdCBmYWlsZWQgd2l0aCBWRVJTICV4XG4iLAotCQkJCV9fZnVuY19fLCBSUENfU05EX1ZFUlMpOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9IGVsc2UKLQkJTU1fREJHKCJzbmQgYWxyZWFkeSBvcGVuZWRcbiIpOwotZXJyOgotCW11dGV4X3VubG9jaygmc25kX2NhZF9zeXMtPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc25kX2NhZF9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBzbmRfY2FkX29wZW4sCi0JLnJlbGVhc2UJPSBzbmRfY2FkX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0gc25kX2NhZF9pb2N0bCwKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIHNuZF9jYWRfbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX2NhZCIsCi0JLmZvcHMJPSAmc25kX2NhZF9mb3BzLAotfTsKLQotc3RhdGljIGxvbmcgc25kX2NhZF92b2xfZW5hYmxlKGNvbnN0IGNoYXIgKmFyZykKLXsKLQlzdHJ1Y3Qgc25kX2NhZF9zeXNfY3R4dCAqc25kX2NhZF9zeXMgPSAmdGhlX3NuZF9jYWRfc3lzOwotCXN0cnVjdCBzbmRfY2FkX3NldF92b2x1bWVfbXNnIHZtc2c7Ci0Jc3RydWN0IG1zbV9jYWRfdm9sdW1lX2NvbmZpZyB2b2w7Ci0JaW50IHJjID0gMDsKLQotCXJjID0gc3NjYW5mKGFyZywgIiVkICVkICVkICVkIiwgJnZvbC5kZXZpY2UucnhfZGV2aWNlLAotCQkJJnZvbC5kZXZpY2UudHhfZGV2aWNlLCAmdm9sLm1ldGhvZCwgJnZvbC52b2x1bWUpOwotCWlmIChyYyAhPSA0KSB7Ci0JCU1NX0VSUigiSW52YWxpZCBhcmd1bWVudHMuIFVzYWdlOiA8cnhfZGV2aWNlPiA8dHhfZGV2aWNlPiIgXAotCQkJIm1ldGhvZD4gPHZvbHVtZT5cbiIpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQl2bXNnLmFyZ3MuZGV2aWNlLnJ4X2RldmljZSA9IGNwdV90b19iZTMyKHZvbC5kZXZpY2UucnhfZGV2aWNlKTsKLQl2bXNnLmFyZ3MuZGV2aWNlLnR4X2RldmljZSA9IGNwdV90b19iZTMyKHZvbC5kZXZpY2UudHhfZGV2aWNlKTsKLQl2bXNnLmFyZ3MubWV0aG9kID0gY3B1X3RvX2JlMzIodm9sLm1ldGhvZCk7Ci0JaWYgKHZvbC5tZXRob2QgIT0gU05EX01FVEhPRF9WT0lDRSAmJiB2b2wubWV0aG9kICE9IFNORF9NRVRIT0RfTUlESSkgewotCQlNTV9FUlIoInNuZF9jYWRfaW9jdGwgc2V0IHZvbHVtZTogaW52YWxpZCBtZXRob2RcbiIpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQl2bXNnLmFyZ3Mudm9sdW1lID0gY3B1X3RvX2JlMzIodm9sLnZvbHVtZSk7Ci0Jdm1zZy5hcmdzLmNiX2Z1bmMgPSAtMTsKLQl2bXNnLmFyZ3MuY2xpZW50X2RhdGEgPSAwOwotCi0JTU1fREJHKCJzbmRfY2FkX3NldF92b2x1bWUgJWQgJWQgJWQgJWRcbiIsIHZvbC5kZXZpY2UucnhfZGV2aWNlLAotCQkJdm9sLmRldmljZS50eF9kZXZpY2UsIHZvbC5tZXRob2QsIHZvbC52b2x1bWUpOwotCi0JcmMgPSBtc21fcnBjX2NhbGwoc25kX2NhZF9zeXMtPmVwdCwKLQkJU05EX0NBRF9TRVRfVk9MVU1FX1BST0MsCi0JCSZ2bXNnLCBzaXplb2Yodm1zZyksIDUgKiBIWik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBzbmRfY2FkX2Rldl9lbmFibGUoY29uc3QgY2hhciAqYXJnKQotewotCXN0cnVjdCBzbmRfY2FkX3N5c19jdHh0ICpzbmRfY2FkX3N5cyA9ICZ0aGVfc25kX2NhZF9zeXM7Ci0Jc3RydWN0IHNuZF9jYWRfc2V0X2RldmljZV9tc2cgZG1zZzsKLQlzdHJ1Y3QgbXNtX2NhZF9kZXZpY2VfY29uZmlnIGRldjsKLQlpbnQgcmMgPSAwOwotCi0KLQlyYyA9IHNzY2FuZihhcmcsICIlZCAlZCAlZCAlZCIsICZkZXYuZGV2aWNlLnJ4X2RldmljZSwKLQkJCSZkZXYuZGV2aWNlLnR4X2RldmljZSwgJmRldi5lYXJfbXV0ZSwgJmRldi5taWNfbXV0ZSk7Ci0JaWYgKHJjICE9IDQpIHsKLQkJTU1fRVJSKCJJbnZhbGlkIGFyZ3VtZW50cy4gVXNhZ2U6IDxyeF9kZXZpY2U+IDx0eF9kZXZpY2U+ICJcCi0JCQkiPGVhcl9tdXRlPiA8bWljX211dGU+XG4iKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlyZXR1cm4gcmM7Ci0JfQotCWRtc2cuYXJncy5kZXZpY2UucnhfZGV2aWNlID0gY3B1X3RvX2JlMzIoZGV2LmRldmljZS5yeF9kZXZpY2UpOwotCWRtc2cuYXJncy5kZXZpY2UudHhfZGV2aWNlID0gY3B1X3RvX2JlMzIoZGV2LmRldmljZS50eF9kZXZpY2UpOwotCWRtc2cuYXJncy5kZXZpY2UucGF0aHR5cGUgPSBjcHVfdG9fYmUzMihDQURfREVWSUNFX1BBVEhfUlhfVFgpOwotCWRtc2cuYXJncy5lYXJfbXV0ZSA9IGNwdV90b19iZTMyKGRldi5lYXJfbXV0ZSk7Ci0JZG1zZy5hcmdzLm1pY19tdXRlID0gY3B1X3RvX2JlMzIoZGV2Lm1pY19tdXRlKTsKLQlpZiAoY2hlY2tfbXV0ZShkZXYuZWFyX211dGUpIDwgMCB8fAotCQkJY2hlY2tfbXV0ZShkZXYubWljX211dGUpIDwgMCkgewotCQlNTV9FUlIoInNuZF9jYWRfaW9jdGwgc2V0IGRldmljZTogaW52YWxpZCBtdXRlIHN0YXR1c1xuIik7Ci0JCXJjID0gLUVJTlZBTDsKLQkJcmV0dXJuIHJjOwotCX0KLQlkbXNnLmFyZ3MuY2JfZnVuYyA9IC0xOwotCWRtc2cuYXJncy5jbGllbnRfZGF0YSA9IDA7Ci0JY3Vycl9kZXYudHhfZGV2ID0gZGV2LmRldmljZS50eF9kZXZpY2U7Ci0JY3Vycl9kZXYucnhfZGV2ID0gZGV2LmRldmljZS5yeF9kZXZpY2U7Ci0KLQlNTV9JTkZPKCJzbmRfY2FkX3NldF9kZXZpY2UgJWQgJWQgJWQgJWRcbiIsIGRldi5kZXZpY2UucnhfZGV2aWNlLAotCQkJZGV2LmRldmljZS50eF9kZXZpY2UsIGRldi5lYXJfbXV0ZSwgZGV2Lm1pY19tdXRlKTsKLQotCXJjID0gbXNtX3JwY19jYWxsKHNuZF9jYWRfc3lzLT5lcHQsCi0JCVNORF9DQURfU0VUX0RFVklDRV9QUk9DLAotCQkmZG1zZywgc2l6ZW9mKGRtc2cpLCA1ICogSFopOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3Qgc25kX2NhZF9kZXZfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKLXsKLQlzc2l6ZV90IHN0YXR1czsKLQlzdHJ1Y3Qgc25kX2NhZF9zeXNfY3R4dCAqc25kX2NhZF9zeXMgPSAmdGhlX3NuZF9jYWRfc3lzOwotCWludCByYyA9IDA7Ci0KLQlyYyA9IHNuZF9jYWRfc3lzX29wZW4oKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCW11dGV4X2xvY2soJnNuZF9jYWRfc3lzLT5sb2NrKTsKLQlzdGF0dXMgPSBzbmRfY2FkX2Rldl9lbmFibGUoYnVmKTsKLQltdXRleF91bmxvY2soJnNuZF9jYWRfc3lzLT5sb2NrKTsKLQotCXJjID0gc25kX2NhZF9zeXNfcmVsZWFzZSgpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIHN0YXR1cyA/IDogc2l6ZTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc25kX2NhZF92b2xfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKLXsKLQlzc2l6ZV90IHN0YXR1czsKLQlzdHJ1Y3Qgc25kX2NhZF9zeXNfY3R4dCAqc25kX2NhZF9zeXMgPSAmdGhlX3NuZF9jYWRfc3lzOwotCWludCByYyA9IDA7Ci0KLQlyYyA9IHNuZF9jYWRfc3lzX29wZW4oKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCW11dGV4X2xvY2soJnNuZF9jYWRfc3lzLT5sb2NrKTsKLQlzdGF0dXMgPSBzbmRfY2FkX3ZvbF9lbmFibGUoYnVmKTsKLQltdXRleF91bmxvY2soJnNuZF9jYWRfc3lzLT5sb2NrKTsKLQotCXJjID0gc25kX2NhZF9zeXNfcmVsZWFzZSgpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIHN0YXR1cyA/IDogc2l6ZTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGRldmljZSwgU19JV1VTUiB8IFNfSVJVR08sCi0JCU5VTEwsIHNuZF9jYWRfZGV2X3N0b3JlKTsKLQotc3RhdGljIERFVklDRV9BVFRSKHZvbHVtZSwgU19JV1VTUiB8IFNfSVJVR08sCi0JCU5VTEwsIHNuZF9jYWRfdm9sX3N0b3JlKTsKLQotc3RhdGljIGludCBzbmRfY2FkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNuZF9jYWRfY3R4dCAqc25kID0gJnRoZV9zbmQ7Ci0Jc3RydWN0IHNuZF9jYWRfc3lzX2N0eHQgKnNuZF9jYWRfc3lzID0gJnRoZV9zbmRfY2FkX3N5czsKLQlpbnQgcmMgPSAwOwotCi0JbXV0ZXhfaW5pdCgmc25kLT5sb2NrKTsKLQltdXRleF9pbml0KCZzbmRfY2FkX3N5cy0+bG9jayk7Ci0Jc25kX2NhZF9zeXMtPmVwdCA9IE5VTEw7Ci0Jc25kLT5jYWRfZXB0cyA9Ci0JCQkoc3RydWN0IG1zbV9jYWRfZW5kcG9pbnRzICopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JcmMgPSBtaXNjX3JlZ2lzdGVyKCZzbmRfY2FkX21pc2MpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoc25kX2NhZF9taXNjLnRoaXNfZGV2aWNlLCAmZGV2X2F0dHJfZGV2aWNlKTsKLQlpZiAocmMpIHsKLQkJbWlzY19kZXJlZ2lzdGVyKCZzbmRfY2FkX21pc2MpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoc25kX2NhZF9taXNjLnRoaXNfZGV2aWNlLCAmZGV2X2F0dHJfdm9sdW1lKTsKLQlpZiAocmMpIHsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKHNuZF9jYWRfbWlzYy50aGlzX2RldmljZSwKLQkJCQkJCSZkZXZfYXR0cl9kZXZpY2UpOwotCQltaXNjX2RlcmVnaXN0ZXIoJnNuZF9jYWRfbWlzYyk7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JcmMgPSBydGNfZGVidWdmc19jcmVhdGVfZW50cnkoKTsKLQlpZiAocmMpIHsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKHNuZF9jYWRfbWlzYy50aGlzX2RldmljZSwKLQkJCQkJCSZkZXZfYXR0cl92b2x1bWUpOwotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoc25kX2NhZF9taXNjLnRoaXNfZGV2aWNlLAotCQkJCQkJJmRldl9hdHRyX2RldmljZSk7Ci0JCW1pc2NfZGVyZWdpc3Rlcigmc25kX2NhZF9taXNjKTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNuZF9jYWRfcGxhdF9kcml2ZXIgPSB7Ci0JLnByb2JlID0gc25kX2NhZF9wcm9iZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc21fY2FkIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNuZF9jYWRfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuZF9jYWRfcGxhdF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChzbmRfY2FkX2luaXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1TTSBDQUQgU05EIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvc25kX3BjbV9jbGllbnQuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1L3NuZF9wY21fY2xpZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNTk2MDEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvc25kX3BjbV9jbGllbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX3JwY3JvdXRlci5oPgotCi0jZGVmaW5lIFNORF9WT0NfUENNX0lOVEVSRkFDRV9QUk9HCTB4MzAwMDAwMDIKLSNkZWZpbmUgU05EX1ZPQ19QQ01fSU5URVJGQUNFX1ZFUlMJMHgwMDAyMDAwNAotCi0vKiBTdXBwbHkgYWx3YXlzIDE2MCB3b3JkcyBvZiBQQ00gc2FtcGxlcyAoMjBtcyBkYXRhKSAqLwotI2RlZmluZSBNQVhfVk9DX0ZSQU1FX1NJWkUgMTYwCi0jZGVmaW5lIFZPQ19GUkFNRV9EVVJBVElPTiAyMAotLyogQnVmZmVyaW5nIGZvciBNYXhpbXVtIDggZnJhbWVzIGJldHdlZW4gdXNlcnNwYWNlIGFuZCBkcml2ZXIgKi8KLSNkZWZpbmUgTUFYX1ZPQ19GUkFNRVMgOAotI2RlZmluZSBCVUZTWiAoKE1BWF9WT0NfRlJBTUVfU0laRSoyKSpNQVhfVk9DX0ZSQU1FUykKLSNkZWZpbmUgU05EX1ZPQ19QQ01fQ0xJRU5UX0lOUFVUX0ZOX1RZUEVfUFJPQyAzCi0jZGVmaW5lIFNORF9WT0NfUkVHSVNURVJfUENNX0lOUFVUX0NMSUVOVF9QUk9DIDI0Ci0KLSNkZWZpbmUgU1RBUlRfQ0FMTEJBQ0tfSUQgMHgxMjM0NTY3OAotI2RlZmluZSBTVE9QX0NBTExCQUNLX0lEIDB4ZmZmZmZmZmYKLQotI2RlZmluZSBNQVhfV0FJVF9DT05TVU1FIChNQVhfVk9DX0ZSQU1FUyAqIFZPQ19GUkFNRV9EVVJBVElPTikKLS8qIFBDTSBJbnRlcmZhY2VzICovCi1lbnVtIHZvaWNlX3BjbV9pbnRlcmZhY2VfdHlwZSB7Ci0JVk9JQ0VfUENNX0lOVEVSRkFDRV9UWF9JTlBVVCA9IDMsIC8qIFBDTSBJbmplY3QgaW5wdXQgdG8gUHJlUHJvYyAqLwotfTsKLQotZW51bSB2b2ljZV9wY21faW50ZXJmYWNlX3JlZ19zdGF0dXNfdHlwZSB7Ci0JU1VDQ0VTUyA9IDAsIC8qIFN1Y2Nlc3MgMCwgZWxzZSBmYWlsdXJlICovCi19OwotCi0vKiBzdGF0dXMgdXNlZCBieSBQQ00gaW5wdXQgY2FsbGJhY2tzIHRvIGluZGljYXRlIGF2YWlsYWJpbGl0eSBvZiBQQ00gRGF0YSAqLwotZW51bSB2b2ljZV9wY21fZGF0YV9zdGF0dXNfdHlwZSB7Ci0JVk9JQ0VfUENNX0RBVEFfU1RBVFVTX0FWQUlMQUJMRSwgICAgLyogRGF0YSBhdmFpbGFibGUgZm9yIFBDTSBpbnB1dCAqLwotCVZPSUNFX1BDTV9EQVRBX1NUQVRVU19VTkFWQUlMQUJMRSwgIC8qIERhdGEgbm90IGF2YWlsYWJsZSAgICAgICAgICAgKi8KLQlWT0lDRV9QQ01fREFUQV9TVEFUVVNfTUFYCi19OwotCi0vKiBBcmd1bWVudCBuZWVkZWQgdG8gcmVnaXN0ZXIgUENNIGlucHV0ICBjbGllbnQgKi8KLXN0cnVjdCBzbmRfdm9pY2VfcGNtX2ludGVyZmFjZV9pcGNsbnRfcmVnX2FyZ3MgewotCS8qIEludGVyZmFjZSBudW1iZXIgc3BlY2lmaWVzIHRoZSBQQ00gaW5qZWN0IHBvaW50ICovCi0JZW51bSB2b2ljZV9wY21faW50ZXJmYWNlX3R5cGUgaW50ZXJmYWNlOwotCS8qIE5vbi1OVUxMIGluZGljYXRlcyBzdGFydCxOVUxMIGluZGljYXRlcyBzdG9wICovCi0JdWludDMyX3QgY2FsbGJhY2tfaWQ7Ci19OwotCi1zdHJ1Y3Qgc25kX3ZvaWNlX3BjbV9pbnRlcmZhY2VfaXBjbG50X3JlZ19zdGF0dXMgewotCWVudW0gdm9pY2VfcGNtX2ludGVyZmFjZV9yZWdfc3RhdHVzX3R5cGUgc3RhdHVzOwotfTsKLQotc3RydWN0IHNuZF92b2ljZV9wY21faW50ZXJmYWNlX2lwY2xudF9mbl90eXBlX2FyZ3MgewotCXVpbnQzMl90IGNhbGxiYWNrX2lkOwotCXVpbnQzMl90IHBjbV9kYXRhX3B0cl9ub3RfbnVsbDsKLQl1aW50MzJfdCBwY21fZGF0YV9tYXhfbGVuZ3RoOwotfTsKLQotc3RydWN0IHNuZF92b2ljZV9wY21faW50ZXJmYWNlX2lwY2xudF9mbl90eXBlX3JlcGx5IHsKLQllbnVtIHZvaWNlX3BjbV9kYXRhX3N0YXR1c190eXBlIHN0YXR1czsKLQlzdHJ1Y3QgewotCQl1aW50MzJfdCBwY21fZGF0YV9sZW47Ci0JCXN0cnVjdCB7Ci0JCQl1aW50MTZfdCBwY21fZGF0YV9pZ25vcmU7Ci0JCQl1aW50MTZfdCBwY21fZGF0YV92YWxpZDsKLQkJfSBwY21fZGF0YV92YWxbTUFYX1ZPQ19GUkFNRV9TSVpFXTsKLQl9IHBjbV9kYXRhOwotfTsKLQotc3RydWN0IGJ1ZmZlciB7Ci0Jdm9pZCAqZGF0YTsKLQl1bnNpZ25lZCBzaXplOwotCXVuc2lnbmVkIHVzZWQ7Ci19OwotCi1zdHJ1Y3QgYXVkaW8gewotCXN0cnVjdCBidWZmZXIgb3V0W01BWF9WT0NfRlJBTUVTXTsKLQotCXVpbnQ4X3Qgb3V0X2hlYWQ7Ci0JdWludDhfdCBvdXRfdGFpbDsKLQotCWF0b21pY190IG91dF9ieXRlczsKLQkvKiBkYXRhIGFsbG9jYXRlZCBmb3IgdmFyaW91cyBidWZmZXJzICovCi0JY2hhciAqZGF0YTsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtdXRleCB3cml0ZV9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgc3RvcF93YWl0OwotCi0JaW50IGJ1ZmZlcl9maW5pc2hlZDsKLQlpbnQgb3BlbmVkOwotCWludCBlbmFibGVkOwotCWludCBydW5uaW5nOwotCWludCBzdG9wcGVkOyAvKiBzZXQgd2hlbiBzdG9wcGVkICovCi0KLQlzdHJ1Y3QgbXNtX3JwY19jbGllbnQgKmNsaWVudDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXVkaW8gdGhlX2F1ZGlvOwotCi1zdGF0aWMgaW50IHNuZF92b2ljZV9wY21faW50ZXJmYWNlX2lwY2xudF9yZWdfYXJncygKLQlzdHJ1Y3QgbXNtX3JwY19jbGllbnQgKmNsaWVudCwgdm9pZCAqYnVmLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBzbmRfdm9pY2VfcGNtX2ludGVyZmFjZV9pcGNsbnRfcmVnX2FyZ3MgKmFyZzsKLQlpbnQgc2l6ZSA9IDA7Ci0KLQlhcmcgPSAoc3RydWN0IHNuZF92b2ljZV9wY21faW50ZXJmYWNlX2lwY2xudF9yZWdfYXJncyAqKWRhdGE7Ci0JKigoaW50ICopYnVmKSA9IGNwdV90b19iZTMyKGFyZy0+aW50ZXJmYWNlKTsKLQlzaXplICs9IHNpemVvZihpbnQpOwotCWJ1ZiArPSBzaXplb2YoaW50KTsKLQkqKChpbnQgKilidWYpID0gY3B1X3RvX2JlMzIoYXJnLT5jYWxsYmFja19pZCk7Ci0Jc2l6ZSArPSBzaXplb2YoaW50KTsKLQotCXJldHVybiBzaXplOwotfQotCi1zdGF0aWMgaW50IHNuZF92b2ljZV9wY21faW50ZXJmYWNlX2lwY2xudF9yZWdfc3RhdHVzKAotCXN0cnVjdCBtc21fcnBjX2NsaWVudCAqY2xpZW50LCB2b2lkICpidWYsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHNuZF92b2ljZV9wY21faW50ZXJmYWNlX2lwY2xudF9yZWdfc3RhdHVzICpyZXN1bHQgPQotCShzdHJ1Y3Qgc25kX3ZvaWNlX3BjbV9pbnRlcmZhY2VfaXBjbG50X3JlZ19zdGF0dXMgKilidWY7Ci0KLQkqKChpbnQgKilkYXRhKSA9ICBiZTMyX3RvX2NwdShyZXN1bHQtPnN0YXR1cyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHByb2Nlc3NfY2FsbGJhY2soc3RydWN0IGF1ZGlvICphdWRpbywKLQl2b2lkICpidWZmZXIsIGludCBpbl9zaXplKQotewotCXVpbnQzMl90IGFjY2VwdF9zdGF0dXMgPSBSUENfQUNDRVBUU1RBVF9TVUNDRVNTOwotCXN0cnVjdCBycGNfcmVxdWVzdF9oZHIgKnJlcTsKLQlzdHJ1Y3Qgc25kX3ZvaWNlX3BjbV9pbnRlcmZhY2VfaXBjbG50X2ZuX3R5cGVfYXJncyBhcmcsICpidWZfcHRyOwotCXN0cnVjdCBzbmRfdm9pY2VfcGNtX2ludGVyZmFjZV9pcGNsbnRfZm5fdHlwZV9yZXBseSAqcmVwbHk7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JdWludDMyX3Qgc3RhdHVzOwotCXVpbnQzMl90IHBjbV9kYXRhX2xlbjsKLQotCXJlcSA9IChzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyICopYnVmZmVyOwotCWJ1Zl9wdHIgPSAoc3RydWN0IHNuZF92b2ljZV9wY21faW50ZXJmYWNlX2lwY2xudF9mbl90eXBlX2FyZ3MgKilcCi0JCQkJKHJlcSArIDEpOwotCWFyZy5jYWxsYmFja19pZCA9IGJlMzJfdG9fY3B1KGJ1Zl9wdHItPmNhbGxiYWNrX2lkKTsKLQlhcmcucGNtX2RhdGFfcHRyX25vdF9udWxsID0gYmUzMl90b19jcHUoYnVmX3B0ci0+cGNtX2RhdGFfcHRyX25vdF9udWxsKTsKLQlhcmcucGNtX2RhdGFfbWF4X2xlbmd0aCA9IGJlMzJfdG9fY3B1KGJ1Zl9wdHItPnBjbV9kYXRhX21heF9sZW5ndGgpOwotCi0JTU1fREJHKCJjYWxsYmFja19pZCA9IDB4JTh4IHBjbV9kYXRhX3B0cl9ub3RfbnVsbCA9IDB4JTh4IlwKLQkJInBjbV9kYXRhX21heF9sZW5ndGggPSAweCU4eFxuIiwgYXJnLmNhbGxiYWNrX2lkLFwKLQkJYXJnLnBjbV9kYXRhX3B0cl9ub3RfbnVsbCwgYXJnLnBjbV9kYXRhX21heF9sZW5ndGgpOwotCS8qIEZsYWcgaW50ZXJmYWNlIGFzIHJ1bm5pbmcgKi8KLQlpZiAoIWF1ZGlvLT5ydW5uaW5nKQotCQlhdWRpby0+cnVubmluZyA9IDE7Ci0JaWYgKCFhcmcucGNtX2RhdGFfcHRyX25vdF9udWxsKSB7Ci0JCWFjY2VwdF9zdGF0dXMgPSBSUENfQUNDRVBUU1RBVF9TWVNURU1fRVJSOwotCQltc21fcnBjX3N0YXJ0X2FjY2VwdGVkX3JlcGx5KGF1ZGlvLT5jbGllbnQsCi0JCQliZTMyX3RvX2NwdShyZXEtPnhpZCksIGFjY2VwdF9zdGF0dXMpOwotCQltc21fcnBjX3NlbmRfYWNjZXB0ZWRfcmVwbHkoYXVkaW8tPmNsaWVudCwgMCk7Ci0JCXJldHVybjsKLQl9Ci0JcmVwbHkgPSAoc3RydWN0IHNuZF92b2ljZV9wY21faW50ZXJmYWNlX2lwY2xudF9mbl90eXBlX3JlcGx5ICopCi0JCW1zbV9ycGNfc3RhcnRfYWNjZXB0ZWRfcmVwbHkoYXVkaW8tPmNsaWVudCwKLQkJCWJlMzJfdG9fY3B1KHJlcS0+eGlkKSwgYWNjZXB0X3N0YXR1cyk7Ci0JZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCS8qIElmIERhdGEgYXZhaWxhYmxlLCBzZW5kIGRhdGEgKi8KLQlpZiAoZnJhbWUtPnVzZWQpIHsKLQkJaW50IGk7Ci0JCXVuc2lnbmVkIHNob3J0ICpzcmMgPSBmcmFtZS0+ZGF0YTsKLQkJYXRvbWljX2FkZChmcmFtZS0+dXNlZCwgJmF1ZGlvLT5vdXRfYnl0ZXMpOwotCQlzdGF0dXMgPSBWT0lDRV9QQ01fREFUQV9TVEFUVVNfQVZBSUxBQkxFOwotCQlwY21fZGF0YV9sZW4gPSBNQVhfVk9DX0ZSQU1FX1NJWkU7Ci0JCXhkcl9zZW5kX2ludDMyKCZhdWRpby0+Y2xpZW50LT5jYl94ZHIsICZzdGF0dXMpOwotCQl4ZHJfc2VuZF9pbnQzMigmYXVkaW8tPmNsaWVudC0+Y2JfeGRyLCAmcGNtX2RhdGFfbGVuKTsKLQkJLyogRXhwZWN0ZWQgY2JfeGRyIGJ1ZmZlciBzaXplIGlzIG1vcmUgdGhhbiBQQ00gYnVmZmVyIHNpemUgKi8KLQkJZm9yIChpID0gMDsgaSA8IE1BWF9WT0NfRlJBTUVfU0laRTsgaSsrLCArK3NyYykKLQkJCXhkcl9zZW5kX2ludDE2KCZhdWRpby0+Y2xpZW50LT5jYl94ZHIsIHNyYyk7Ci0JCWZyYW1lLT51c2VkID0gMDsKLQkJYXVkaW8tPm91dF90YWlsID0gKCgrK2F1ZGlvLT5vdXRfdGFpbCkgJSBNQVhfVk9DX0ZSQU1FUyk7Ci0JCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQl9IGVsc2UgewotCQlzdGF0dXMgPSBWT0lDRV9QQ01fREFUQV9TVEFUVVNfVU5BVkFJTEFCTEU7Ci0JCXBjbV9kYXRhX2xlbiA9IDA7Ci0JCXhkcl9zZW5kX2ludDMyKCZhdWRpby0+Y2xpZW50LT5jYl94ZHIsICZzdGF0dXMpOwotCQl4ZHJfc2VuZF9pbnQzMigmYXVkaW8tPmNsaWVudC0+Y2JfeGRyLCAmcGNtX2RhdGFfbGVuKTsKLQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkvKiBGbGFnIGFsbCBidWZmZXIgY29tcGxldGVkICovCi0JCWlmIChhdWRpby0+c3RvcHBlZCkgewotCQkJYXVkaW8tPmJ1ZmZlcl9maW5pc2hlZCA9IDE7Ci0JCQl3YWtlX3VwKCZhdWRpby0+c3RvcF93YWl0KTsKLQkJfQotCX0KLQlNTV9EQkcoIlByb3ZpZGVkIFBDTSBkYXRhID0gMHglOHhcbiIsIHJlcGx5LT5zdGF0dXMpOwotCW1zbV9ycGNfc2VuZF9hY2NlcHRlZF9yZXBseShhdWRpby0+Y2xpZW50LCAwKTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgcGNtX2ludGVyZmFjZV9wcm9jZXNzX2NhbGxiYWNrX3JvdXRpbmUoc3RydWN0IG1zbV9ycGNfY2xpZW50ICpjbGllbnQsCi0Jdm9pZCAqYnVmZmVyLCBpbnQgaW5fc2l6ZSkKLXsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyICpyZXE7Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9ICZ0aGVfYXVkaW87Ci0JaW50IHJjID0gMDsKLQotCXJlcSA9IChzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyICopYnVmZmVyOwotCi0JTU1fREJHKCJwcm9jIGlkID0gMHglOHggeGlkID0gMHglOHggc2l6ZSA9IDB4JTh4XG4iLAotCQliZTMyX3RvX2NwdShyZXEtPnByb2NlZHVyZSksIGJlMzJfdG9fY3B1KHJlcS0+eGlkKSwgaW5fc2l6ZSk7Ci0Jc3dpdGNoIChiZTMyX3RvX2NwdShyZXEtPnByb2NlZHVyZSkpIHsKLQkvKiBQcm9jZWR1cmUgd2hpY2ggY2FsbGVkIGV2ZXJ5IDIwbXMgZm9yIFBDTSBzYW1wbGVzIHJlcXVlc3QqLwotCWNhc2UgU05EX1ZPQ19QQ01fQ0xJRU5UX0lOUFVUX0ZOX1RZUEVfUFJPQzoKLQkJcHJvY2Vzc19jYWxsYmFjayhhdWRpbywgYnVmZmVyLCBpbl9zaXplKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJOb3Qgc3VwcG9ydGVkIHByb2NldWR1cmUgMHglOHhcbiIsCi0JCQliZTMyX3RvX2NwdShyZXEtPnByb2NlZHVyZSkpOwotCQkvKiBOb3Qgc3VwcG9ydGVkIFJQQyBQcm9jZWR1cmUsIHNlbmQgbmFnYXRpdmUgY29kZSAqLwotCQltc21fcnBjX3N0YXJ0X2FjY2VwdGVkX3JlcGx5KGNsaWVudCwgYmUzMl90b19jcHUocmVxLT54aWQpLAotCQkJCVJQQ19BQ0NFUFRTVEFUX1BST0NfVU5BVkFJTCk7Ci0JCW1zbV9ycGNfc2VuZF9hY2NlcHRlZF9yZXBseShjbGllbnQsIDApOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2ZsdXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JaW50IGNudDsKLQlmb3IgKGNudCA9IDA7IGNudCA8IE1BWF9WT0NfRlJBTUVTOyBjbnQrKykKLQkJYXVkaW8tPm91dFtjbnRdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRfaGVhZCA9IDA7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JYXVkaW8tPnJ1bm5pbmcgPSAwOwotCWF1ZGlvLT5idWZmZXJfZmluaXNoZWQgPSAwOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkaW9fZW5hYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JaW50IHJjOwotCXN0cnVjdCBzbmRfdm9pY2VfcGNtX2ludGVyZmFjZV9pcGNsbnRfcmVnX2FyZ3MgYXJnOwotCXN0cnVjdCBzbmRfdm9pY2VfcGNtX2ludGVyZmFjZV9pcGNsbnRfcmVnX3N0YXR1cyByZXN1bHQ7Ci0KLQkvKiB2b2ljZV9wY21faW50ZXJmYWNlX3R5cGUgKi8KLQlhcmcuaW50ZXJmYWNlID0gVk9JQ0VfUENNX0lOVEVSRkFDRV9UWF9JTlBVVDsKLQkvKiBTaG91bGQgYmUgbm9uLXplcm8sIHVuaXF1ZSAqLwotCWFyZy5jYWxsYmFja19pZCA9IFNUQVJUX0NBTExCQUNLX0lEOwotCS8qIFN0YXJ0IFZvaWNlIFBDTSBpbnRlcmZhY2UgKi8KLQlyYyA9IG1zbV9ycGNfY2xpZW50X3JlcShhdWRpby0+Y2xpZW50LAotCQkJCVNORF9WT0NfUkVHSVNURVJfUENNX0lOUFVUX0NMSUVOVF9QUk9DLAotCQkJCXNuZF92b2ljZV9wY21faW50ZXJmYWNlX2lwY2xudF9yZWdfYXJncywgJmFyZywKLQkJCQlzbmRfdm9pY2VfcGNtX2ludGVyZmFjZV9pcGNsbnRfcmVnX3N0YXR1cywKLQkJCQkmcmVzdWx0LCAtMSk7Ci0JTU1fREJHKCJpbnB1dCBjbGllbnQgcmVnaXN0cmF0aW9uIHN0YXR1cyByYyAweCU4eCByZXN1bHQgMHglOHhcbiIsCi0JCXJjLCByZXN1bHQuc3RhdHVzKTsKLQkvKiBJZiBlcnJvciBpbiBzZXJ2ZXIgc2lkZSAqLwotCWlmIChyYyA9PSAwKQotCQlpZiAocmVzdWx0LnN0YXR1cyAhPSBTVUNDRVNTKQotCQkJcmMgPSAtRU5PREVWOwotCXJldHVybiByYzsKLX0KLXN0YXRpYyBpbnQgYXVkaW9fZGlzYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWludCByYzsKLQlzdHJ1Y3Qgc25kX3ZvaWNlX3BjbV9pbnRlcmZhY2VfaXBjbG50X3JlZ19hcmdzIGFyZzsKLQlzdHJ1Y3Qgc25kX3ZvaWNlX3BjbV9pbnRlcmZhY2VfaXBjbG50X3JlZ19zdGF0dXMgcmVzdWx0OwotCi0JLyogV2FpdCB0aWxsIGFsbCBidWZmZXJzIGNvbnN1bWVkIHRvIHByZXZlbnQgZGF0YSBsb3NzCi0JICAgQWxzbyBlbnN1cmUgaWYgY2xpZW50IHN0b3BzIGR1ZSB0byB2b2NvZGVyIGRpc2FibGUKLQkgICBkbyBub3QgbG9vcCBmb3JldmVyICovCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+c3RvcF93YWl0LAotCQkhKGF1ZGlvLT5ydW5uaW5nKSB8fCAoYXVkaW8tPmJ1ZmZlcl9maW5pc2hlZCA9PSAxKSwKLQkJbXNlY3NfdG9famlmZmllcyhNQVhfV0FJVF9DT05TVU1FKSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIDA7Ci0JLyogdm9pY2VfcGNtX2ludGVyZmFjZV90eXBlICovCi0JYXJnLmludGVyZmFjZSA9IFZPSUNFX1BDTV9JTlRFUkZBQ0VfVFhfSU5QVVQ7Ci0JYXJnLmNhbGxiYWNrX2lkID0gU1RPUF9DQUxMQkFDS19JRDsgLyogU2hvdWxkIGJlIHplcm8gKi8KLQkvKiBTdG9wIFZvaWNlIFBDTSBpbnRlcmZhY2UgKi8KLQlyYyA9IG1zbV9ycGNfY2xpZW50X3JlcShhdWRpby0+Y2xpZW50LAotCQkJCVNORF9WT0NfUkVHSVNURVJfUENNX0lOUFVUX0NMSUVOVF9QUk9DLAotCQkJCXNuZF92b2ljZV9wY21faW50ZXJmYWNlX2lwY2xudF9yZWdfYXJncywgJmFyZywKLQkJCQlzbmRfdm9pY2VfcGNtX2ludGVyZmFjZV9pcGNsbnRfcmVnX3N0YXR1cywKLQkJCQkmcmVzdWx0LCAtMSk7Ci0JTU1fREJHKCJpbnB1dCBjbGllbnQgZGUtcmVnaXN0cmF0aW9uIHN0YXR1cyByYyAweCU4eCByZXN1bHQgMHglOHhcbiIsCi0JCXJjLCByZXN1bHQuc3RhdHVzKTsKLQkvKiBJZiBlcnJvciBpbiBzZXJ2ZXIgc2lkZSAqLwotCWlmIChyYyA9PSAwKQotCQlpZiAocmVzdWx0LnN0YXR1cyAhPSBTVUNDRVNTKQotCQkJcmMgPSAtRU5PREVWOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgYXVkaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gLUVJTlZBTDsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX1NUQVRTKSB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCXN0YXRzLmJ5dGVfY291bnQgPSBhdG9taWNfcmVhZCgmYXVkaW8tPm91dF9ieXRlcyk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6Ci0JCXJjID0gYXVkaW9fZW5hYmxlKGF1ZGlvKTsKLQkJaWYgKHJjID09IDApCi0JCQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU1RPUDoKLQkJaWYgKGF1ZGlvLT5lbmFibGVkKSB7Ci0JCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCQlyYyA9IGF1ZGlvX2Rpc2FibGUoYXVkaW8pOwotCQkJaWYgKHJjID09IDApIHsKLQkJCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCQkJYXVkaW8tPnJ1bm5pbmcgPSAwOwotCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCX0gZWxzZQotCQkJCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbmZpZywgKHZvaWQgKikgYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjb25maWcudHlwZSA9PSAwKSB7Ci0JCQkvKiBTZWxlY3Rpb24gZm9yIGRpZmZlcmVudCBQQ00gaW50ZWN0IHBvaW50ICovCi0JCX0gZWxzZSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQljb25maWcuYnVmZmVyX3NpemUgPSBNQVhfVk9DX0ZSQU1FX1NJWkUgKiAyOwotCQljb25maWcuYnVmZmVyX2NvdW50ID0gTUFYX1ZPQ19GUkFNRVM7Ci0JCWNvbmZpZy5zYW1wbGVfcmF0ZSA9IDgwMDA7Ci0JCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gMTsKLQkJY29uZmlnLnR5cGUgPSAwOwotCQljb25maWcudW51c2VkWzBdID0gMDsKLQkJY29uZmlnLnVudXNlZFsxXSA9IDA7Ci0JCWNvbmZpZy51bnVzZWRbMl0gPSAwOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OiB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJTU1fRVJSKCIgVW5zdXBwb3J0ZWQgaW9jdGwgMHglOHhcbiIsIGNtZCk7Ci0JfQotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgc3NpemVfdCBhdWRpb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRpb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQlzaXplX3QgeGZlcjsKLQlpbnQgcmMgPSAwOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCS8qIEVuc3VyZSB0byBjb3B5IG9ubHkgdGlsbCBmcmFtZSBib3VuZGFyeSAqLwotCXdoaWxlIChjb3VudCA+PSAoTUFYX1ZPQ19GUkFNRV9TSVpFKjIpKSB7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdCxcCi0JCQkJKGZyYW1lLT51c2VkID09IDApIHx8IChhdWRpby0+c3RvcHBlZCksCi0JCQkJbXNlY3NfdG9famlmZmllcyhNQVhfV0FJVF9DT05TVU1FKSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHJjID09IDApIHsKLQkJCXJjID0gLUVUSU1FRE9VVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJeGZlciA9IGNvdW50ID4gZnJhbWUtPnNpemUgPyBmcmFtZS0+c2l6ZSA6IGNvdW50OwotCQlpZiAoY29weV9mcm9tX3VzZXIoZnJhbWUtPmRhdGEsIGJ1ZiwgeGZlcikpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWZyYW1lLT51c2VkID0geGZlcjsKLQkJYXVkaW8tPm91dF9oZWFkID0gKCgrK2F1ZGlvLT5vdXRfaGVhZCkgJSBNQVhfVk9DX0ZSQU1FUyk7Ci0JCWNvdW50IC09IHhmZXI7Ci0JCWJ1ZiArPSB4ZmVyOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlNTV9EQkcoIndyaXRlIGRvbmUgMHglOHhcbiIsICh1bnNpZ25lZCBpbnQpKGJ1ZiAtIHN0YXJ0KSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXJldHVybiBidWYgLSBzdGFydDsKLX0KLQotc3RhdGljIGludCBhdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSAmdGhlX2F1ZGlvOwotCWludCByYywgY250OwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCi0JaWYgKGF1ZGlvLT5vcGVuZWQpIHsKLQkJTU1fRVJSKCJidXN5IGFzIGRyaXZlciBhbHJlYWR5IGluIG9wZW4gc3RhdGVcbiIpOwotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICghYXVkaW8tPmRhdGEpIHsKLQkJYXVkaW8tPmRhdGEgPSBrbWFsbG9jKEJVRlNaLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFhdWRpby0+ZGF0YSkgewotCQkJTU1fRVJSKCJjb3VsZCBub3QgYWxsb2NhdGUgYnVmZmVyc1xuIik7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQlhdWRpby0+Y2xpZW50ID0gbXNtX3JwY19yZWdpc3Rlcl9jbGllbnQoInZvaWNlX3BjbV9pbnRlcmZhY2VfY2xpZW50IiwKLQkJCQlTTkRfVk9DX1BDTV9JTlRFUkZBQ0VfUFJPRywKLQkJCQlTTkRfVk9DX1BDTV9JTlRFUkZBQ0VfVkVSUywgMSwKLQkJCQlwY21faW50ZXJmYWNlX3Byb2Nlc3NfY2FsbGJhY2tfcm91dGluZSk7Ci0JaWYgKElTX0VSUihhdWRpby0+Y2xpZW50KSkgewotCQlNTV9FUlIoIkZhaWxlZCB0byByZWdpc3RlciB2b2ljZSBwY20gaW50ZXJmYWNlIGNsaWVudCJcCi0JCQkidG8gMHglOHhcbiIsIFNORF9WT0NfUENNX0lOVEVSRkFDRV9QUk9HKTsKLQkJa2ZyZWUoYXVkaW8tPmRhdGEpOwotCQlhdWRpby0+ZGF0YSA9IE5VTEw7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQlNTV9JTkZPKCJ2b2ljZSBwY20gY2xpZW50IHJlZ2lzdHJlZCAlcFxuIiwgYXVkaW8tPmNsaWVudCk7Ci0JZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhfVk9DX0ZSQU1FUzsgY250KyspIHsKLQkJYXVkaW8tPm91dFtjbnRdLmRhdGEgPSAoYXVkaW8tPmRhdGEgK1wKLQkJCQkJKChNQVhfVk9DX0ZSQU1FX1NJWkUgKiAyKSAqIGNudCkpOwotCQlhdWRpby0+b3V0W2NudF0uc2l6ZSA9IE1BWF9WT0NfRlJBTUVfU0laRSAqIDI7Ci0JCU1NX0RCRygiZGF0YSBwdHIgPSAlcFxuIiwgYXVkaW8tPm91dFtjbnRdLmRhdGEpOwotCX0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQlhdWRpb19mbHVzaChhdWRpbyk7Ci0JYXVkaW8tPm9wZW5lZCA9IDE7Ci0JcmMgPSAwOwotZG9uZToKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWlmIChhdWRpby0+ZW5hYmxlZCkgewotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCWF1ZGlvX2Rpc2FibGUoYXVkaW8pOwotCQlhdWRpby0+cnVubmluZyA9IDA7Ci0JCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCX0KLQltc21fcnBjX3VucmVnaXN0ZXJfY2xpZW50KGF1ZGlvLT5jbGllbnQpOwotCWtmcmVlKGF1ZGlvLT5kYXRhKTsKLQlhdWRpby0+ZGF0YSA9IE5VTEw7Ci0JYXVkaW8tPm9wZW5lZCA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGF1ZGlvX29wZW4sCi0JLnJlbGVhc2UJPSBhdWRpb19yZWxlYXNlLAotCS5yZWFkCQk9IGF1ZGlvX3JlYWQsCi0JLndyaXRlCQk9IGF1ZGlvX3dyaXRlLAotCS51bmxvY2tlZF9pb2N0bAk9IGF1ZGlvX2lvY3RsLAotfTsKLQotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gInNuZF9wY21fY2xpZW50IiwKLQkuZm9wcwk9ICZhdWRpb19mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9faW5pdCh2b2lkKQotewotCW11dGV4X2luaXQoJnRoZV9hdWRpby5sb2NrKTsKLQltdXRleF9pbml0KCZ0aGVfYXVkaW8ud3JpdGVfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdGhlX2F1ZGlvLndhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoZV9hdWRpby5zdG9wX3dhaXQpOwotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19taXNjKTsKLX0KLWRldmljZV9pbml0Y2FsbChhdWRpb19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWUzYzFiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1vYmoteSArPSBhZmUubyBhdWRpb19pbnRlcmN0Lm8gbWkycy5vIGF1ZGlvX2Rldl9jdGwubyB2b2ljZS5vCi0KLWlmZXEgKCQoQ09ORklHX1RJTVBBTklfQ09ERUMpLCB5KQotb2JqLXkgKz0gc25kZGV2X2ljb2RlYy5vCi1lbHNlIGlmZXEgKCQoQ09ORklHX01BUklNQkFfQ09ERUMpLCB5KQotb2JqLXkgKz0gc25kZGV2X2ljb2RlYy5vCi1lbmRpZgotCi1vYmotJChDT05GSUdfTUFSSU1CQV9DT0RFQykgKz0gc25kZGV2X2RhdGFfbWFyaW1iYS5vCi1vYmotJChDT05GSUdfVElNUEFOSV9DT0RFQykgKz0gc25kZGV2X2RhdGFfdGltcGFuaS5vCi0KLW9iai15ICs9IGF1ZGlvX3BjbS5vIGF1ZHBwLm8gYXVkaW9fbXAzLm8gYXVkaW9fd21hLm8gYXVkaW9fYWFjLm8gYXVkaW9fYW1ybmIubwotb2JqLXkgKz0gYXVkaW9fYW1yd2IubyBhdWRpb193bWFwcm8ubyBhdWRpb19hZHBjbS5vIGF1ZGlvX2V2cmMubyBhdWRpb19xY2VscC5vCi1vYmoteSArPSBhdXhfcGNtLm8gc25kZGV2X2Vjb2RlYy5vIGF1ZGlvX291dC5vCi1vYmoteSArPSBhdWRpb19scGEubyBtcDNfZnVuY3MubyBwY21fZnVuY3Mubwotb2JqLXkgKz0gYXVkcHJlcHJvYy5vIGF1ZGlvX3BjbV9pbi5vIGF1ZGlvX2FhY19pbi5vIGF1ZGlvX2Ftcm5iX2luLm8gYXVkaW9fYTJkcF9pbi5vCi1vYmoteSArPSBhdWRpb19ldnJjX2luLm8gYXVkaW9fcWNlbHBfaW4ubwotb2JqLXkgKz0gYWRzcC5vIGFkc3BfZHJpdmVyLm8gYWRzcF9pbmZvLm8KLW9iai15ICs9IGF1ZGlvX2FjZGIubyBzbmRkZXZfdmlydHVhbC5vCi1vYmoteSArPSBhdWRpb19mbS5vCi1vYmoteSArPSBscGEubyBzbmRkZXZfbWkycy5vCi1vYmoteSArPSBhdWRpb19tdnMubwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYWRzcC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hZHNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MWVmMDAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hZHNwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjI1ICswLDAgQEAKLS8qCi0gKiBSZWdpc3Rlci9JbnRlcnJ1cHQgYWNjZXNzIGZvciB1c2Vyc3BhY2UgYURTUCBsaWJyYXJ5LgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5LDIwMTEtMjAxMiBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEF1dGhvcjogSWxpeWFuIE1hbGNoZXYgPGlibUBhbmRyb2lkLmNvbT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0vKiBUT0RPOgotICogLSBtb3ZlIHNoYXJlYWJsZSBycGMgY29kZSBvdXRzaWRlIG9mIGFkc3AuYwotICogLSBnZW5lcmFsIHNvbHV0aW9uIGZvciB2aXJ0LT5waHlzIHBhdGNodXAKLSAqIC0gcXVldWUgSURzIHNob3VsZCBiZSByZWxhdGl2ZSB0byBtb2R1bGVzCi0gKiAtIGRpc2FsbG93IGFjY2VzcyB0byBub24tYXNzb2NpYXRlZCBxdWV1ZXMKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9pb21hcC5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlICJhZHNwLmgiCi0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlbnRyeV9hZHNwOwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlbnRyeV93ZGF0YTsKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZW50cnlfcmRhdGE7Ci1zdGF0aWMgaW50IHdkdW1wLCByZHVtcDsKLSNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KLQotc3RhdGljIHN0cnVjdCBhZHNwX2luZm8gYWRzcF9pbmZvOwotc3RhdGljIHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKmFkc3BfbW9kdWxlczsKLXN0YXRpYyBpbnQgYWRzcF9vcGVuX2NvdW50OwotCi1zdGF0aWMgREVGSU5FX01VVEVYKGFkc3Bfb3Blbl9sb2NrKTsKLQotLyogcHJvdGVjdCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgQURTUCBjb21tYW5kL21lc3NhZ2UgcXVldWUgKi8KLXN0YXRpYyBzcGlubG9ja190IGFkc3BfY21kX2xvY2s7Ci1zdGF0aWMgc3BpbmxvY2tfdCBhZHNwX3dyaXRlX2xvY2s7Ci0KLXN0YXRpYyB1aW50MzJfdCBjdXJyZW50X2ltYWdlID0gLTE7Ci0KLXZvaWQgYWRzcF9zZXRfaW1hZ2Uoc3RydWN0IGFkc3BfaW5mbyAqaW5mbywgdWludDMyX3QgaW1hZ2UpCi17Ci0JY3VycmVudF9pbWFnZSA9IGltYWdlOwotfQotCi0vKgotICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1vZHVsZV9pZCBpcyBhdmFpbGFibGUgaW4gdGhlCi0gKiBtb2R1bGVfZW50cmllcyB0YWJsZS5JZiBtb2R1bGVfaWQgaXMgYXZhaWxhYmxlIHJldHVybnMgYDBgLgotICogSWYgbW9kdWxlX2lkIGlzIG5vdCBhdmFpbGFibGUgcmV0dXJucyBgLUVOWElPYC4KLSAqLwotc3RhdGljIGludDMyX3QgYWRzcF92YWxpZGF0ZV9tb2R1bGUodWludDMyX3QgbW9kdWxlX2lkKQotewotCXVpbnQzMl90CSpwdHI7Ci0JdWludDMyX3QJbW9kdWxlX2luZGV4OwotCXVpbnQzMl90CW51bV9tb2RfZW50cmllczsKLQotCXB0ciA9IGFkc3BfaW5mby5pbml0X2luZm9fcHRyLT5tb2R1bGVfZW50cmllczsKLQludW1fbW9kX2VudHJpZXMgPSBhZHNwX2luZm8uaW5pdF9pbmZvX3B0ci0+bW9kdWxlX3RhYmxlX3NpemU7Ci0KLQlmb3IgKG1vZHVsZV9pbmRleCA9IDA7IG1vZHVsZV9pbmRleCA8IG51bV9tb2RfZW50cmllczsgbW9kdWxlX2luZGV4KyspCi0JCWlmIChtb2R1bGVfaWQgPT0gcHRyW21vZHVsZV9pbmRleF0pCi0JCQlyZXR1cm4gMDsKLQotCXJldHVybiAtRU5YSU87Ci19Ci0KLXN0YXRpYyBpbnQzMl90IGFkc3BfdmFsaWRhdGVfcXVldWUodWludDMyX3QgbW9kX2lkLCB1bnNpZ25lZCBxX2lkeCwKLQkJCQkJCQl1aW50MzJfdCBzaXplKQotewotCWludDMyX3QgaTsKLQlzdHJ1Y3QgYWRzcF9ydG9zX21wX210b2FfaW5pdF9pbmZvX3R5cGUJKnNwdHI7Ci0KLQlzcHRyID0gYWRzcF9pbmZvLmluaXRfaW5mb19wdHI7Ci0JZm9yIChpID0gMDsgaSA8IHNwdHItPm1vZF90b19xX2VudHJpZXM7IGkrKykKLQkJaWYgKG1vZF9pZCA9PSBzcHRyLT5tb2RfdG9fcV90YmxbaV0ubW9kdWxlKQotCQkJaWYgKHFfaWR4ID09IHNwdHItPm1vZF90b19xX3RibFtpXS5xX3R5cGUpIHsKLQkJCQlpZiAoc2l6ZSA8PSBzcHRyLT5tb2RfdG9fcV90YmxbaV0ucV9tYXhfbGVuKQotCQkJCQlyZXR1cm4gMDsKLQkJCQlNTV9FUlIoInFfaWR4OiAlZCBpcyBub3QgYSB2YWxpZCBxdWV1ZSBcCi0JCQkJCWZvciBtb2R1bGUgJXhcbiIsIHFfaWR4LCBtb2RfaWQpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCU1NX0VSUigiY21kX2J1ZiBzaXplIGlzIG1vcmUgdGhhbiBhbGxvd2VkIHNpemVcbiIpOwotCXJldHVybiAtRUlOVkFMOwotfQotCi11aW50MzJfdCBhZHNwX2dldF9tb2R1bGUoc3RydWN0IGFkc3BfaW5mbyAqaW5mbywgdWludDMyX3QgdGFzaykKLXsKLQlyZXR1cm4gaW5mby0+dGFza190b19tb2R1bGVbY3VycmVudF9pbWFnZV1bdGFza107Ci19Ci0KLXVpbnQzMl90IGFkc3BfZ2V0X3F1ZXVlX29mZnNldChzdHJ1Y3QgYWRzcF9pbmZvICppbmZvLCB1aW50MzJfdCBxdWV1ZV9pZCkKLXsKLQlyZXR1cm4gaW5mby0+cXVldWVfb2Zmc2V0W2N1cnJlbnRfaW1hZ2VdW3F1ZXVlX2lkXTsKLX0KLQotc3RhdGljIGludCBycGNfYWRzcF9ydG9zX2FwcF90b19tb2RlbSh1aW50MzJfdCBjbWQsIHVpbnQzMl90IG1vZHVsZSwKLQkJCQkgICAgICBzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICphZHNwX21vZHVsZSkKLXsKLQlzdHJ1Y3QgYWRzcF9ydG9zX2F0b21fY21kIGFkc3BzdmNfY21kOwotCWludCBlcnI7Ci0KLQlhZHNwc3ZjX2NtZC5jbWQgPSBjbWQ7Ci0JYWRzcHN2Y19jbWQucHJvY19pZCA9IFJQQ19BRFNQX1JUT1NfUFJPQ19BUFBTOwotCWFkc3BzdmNfY21kLm1vZHVsZSA9IG1vZHVsZTsKLQlhZHNwc3ZjX2NtZC5jYl9oYW5kbGUgPSBhZHNwX2luZm8uY2JfaGFuZGxlOwotCi0JZXJyID0gZGFscnBjX2Zjbl81KERBTERFVklDRV9BRFNQX0NNRF9JRFggfCAweDgwMDAwMDAwLAotCQkJCQlhZHNwX2luZm8uaGFuZGxlLAotCQkJCQkmYWRzcHN2Y19jbWQsIHNpemVvZihhZHNwc3ZjX2NtZCkpOwotCWlmIChlcnIgPCAwKQotCQlNTV9FUlIoIkFEU1AgY29tbWFuZCBzZW5kIEZhaWxlZFxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZXRfbW9kdWxlX2luZGV4KHVpbnQzMl90IGlkKQotewotCWludCBtb2RfaWR4OwotCWZvciAobW9kX2lkeCA9IDA7IG1vZF9pZHggPCBhZHNwX2luZm8ubW9kdWxlX2NvdW50OyBtb2RfaWR4KyspCi0JCWlmIChhZHNwX2luZm8ubW9kdWxlW21vZF9pZHhdLmlkID09IGlkKQotCQkJcmV0dXJuIG1vZF9pZHg7Ci0KLQlyZXR1cm4gLUVOWElPOwotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqZmluZF9hZHNwX21vZHVsZV9ieV9pZCgKLQlzdHJ1Y3QgYWRzcF9pbmZvICppbmZvLCB1aW50MzJfdCBpZCkKLXsKLQlpbnQgbW9kX2lkeDsKLQotCWlmIChpZCA+IGluZm8tPm1heF9tb2R1bGVfaWQpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIHsKLQkJbW9kX2lkeCA9IGdldF9tb2R1bGVfaW5kZXgoaWQpOwotCQlpZiAobW9kX2lkeCA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJcmV0dXJuIGluZm8tPmlkX3RvX21vZHVsZVttb2RfaWR4XTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICpmaW5kX2Fkc3BfbW9kdWxlX2J5X25hbWUoCi0Jc3RydWN0IGFkc3BfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqbmFtZSkKLXsKLQl1bnNpZ25lZCBuOwotCWZvciAobiA9IDA7IG4gPCBpbmZvLT5tb2R1bGVfY291bnQ7IG4rKykKLQkJaWYgKCFzdHJjbXAobmFtZSwgYWRzcF9tb2R1bGVzW25dLm5hbWUpKQotCQkJcmV0dXJuIGFkc3BfbW9kdWxlcyArIG47Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBTZW5kIFJQQ19BRFNQX1JUT1NfQ01EX0dFVF9JTklUX0lORk8gY21kIHRvIEFSTTkgYW5kIGdldAotICogcXVldWUgb2Zmc2V0cyBhbmQgbW9kdWxlIGVudHJpZXMgKGluaXQgaW5mbykgYXMgcGFydCBvZiB0aGUgZXZlbnQuCi0gKi8KLXN0YXRpYyB2b2lkICBtc21fZ2V0X2luaXRfaW5mbyh2b2lkKQotewotCXN0cnVjdCBhZHNwX3J0b3NfYXRvbV9jbWQgY21kOwotCWludCBlcnI7Ci0KLQljbWQuY21kID0gUlBDX0FEU1BfUlRPU19DTURfR0VUX0lOSVRfSU5GTzsKLQljbWQucHJvY19pZCA9IFJQQ19BRFNQX1JUT1NfUFJPQ19BUFBTOwotCWNtZC5tb2R1bGUgPSAwOwotCWNtZC5jYl9oYW5kbGUgPSBhZHNwX2luZm8uY2JfaGFuZGxlOwotCi0JZXJyID0gZGFscnBjX2Zjbl81KERBTERFVklDRV9BRFNQX0NNRF9JRFggfCAweDgwMDAwMDAwLAotCQkJCQkJCWFkc3BfaW5mby5oYW5kbGUsCi0JCQkJCQkJJmNtZCwgc2l6ZW9mKGNtZCkpOwotCWlmIChlcnIgPCAwKQotCQlNTV9FUlIoIklOSVRfSU5GTyBjb21tYW5kIHNlbmQgRmFpbGVkXG4iKTsKLX0KLQotaW50IG1zbV9hZHNwX2dldChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICoqb3V0LAotCQkgc3RydWN0IG1zbV9hZHNwX29wcyAqb3BzLCB2b2lkICpkcml2ZXJfZGF0YSkKLXsKLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGU7Ci0JaW50IHJjID0gMDsKLQotCW1vZHVsZSA9IGZpbmRfYWRzcF9tb2R1bGVfYnlfbmFtZSgmYWRzcF9pbmZvLCBuYW1lKTsKLQlpZiAoIW1vZHVsZSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQltdXRleF9sb2NrKCZtb2R1bGUtPmxvY2spOwotCU1NX0RCRygib3BlbmluZyBtb2R1bGUgJXNcbiIsIG1vZHVsZS0+bmFtZSk7Ci0KLQlpZiAobW9kdWxlLT5vcHMpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCW11dGV4X3VubG9jaygmbW9kdWxlLT5sb2NrKTsKLQkJZ290byBkb25lOwotCX0KLQotCW1vZHVsZS0+b3BzID0gb3BzOwotCW1vZHVsZS0+ZHJpdmVyX2RhdGEgPSBkcml2ZXJfZGF0YTsKLQkqb3V0ID0gbW9kdWxlOwotCW11dGV4X3VubG9jaygmbW9kdWxlLT5sb2NrKTsKLQlyYyA9IHJwY19hZHNwX3J0b3NfYXBwX3RvX21vZGVtKFJQQ19BRFNQX1JUT1NfQ01EX1JFR0lTVEVSX0FQUCwKLQkJCQkJbW9kdWxlLT5pZCwgbW9kdWxlKTsKLQlpZiAocmMpIHsKLQkJbXV0ZXhfbG9jaygmbW9kdWxlLT5sb2NrKTsKLQkJbW9kdWxlLT5vcHMgPSBOVUxMOwotCQltb2R1bGUtPmRyaXZlcl9kYXRhID0gTlVMTDsKLQkJKm91dCA9IE5VTEw7Ci0JCU1NX0VSUigiUkVHSVNURVJfQVBQIGZhaWxlZFxuIik7Ci0JCW11dGV4X3VubG9jaygmbW9kdWxlLT5sb2NrKTsKLQkJZ290byBkb25lOwotCX0KLQotCU1NX0lORk8oIm1vZHVsZSAlcyBoYXMgYmVlbiByZWdpc3RlcmVkXG4iLCBtb2R1bGUtPm5hbWUpOwotCi1kb25lOgotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2Fkc3BfZ2V0KTsKLQotdm9pZCBtc21fYWRzcF9wdXQoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQltdXRleF9sb2NrKCZtb2R1bGUtPmxvY2spOwotCWlmIChtb2R1bGUtPm9wcykgewotCQlNTV9JTkZPKCJjbG9zaW5nIG1vZHVsZSAlc1xuIiwgbW9kdWxlLT5uYW1lKTsKLQotCQkvKiBsb2NrIHRvIGVuc3VyZSBhIGRzcCBldmVudCBjYW5ub3QgYmUgZGVsaXZlcmVkCi0JCSAqIGR1cmluZyBvciBhZnRlciByZW1vdmFsIG9mIHRoZSBvcHMgYW5kIGRyaXZlcl9kYXRhCi0JCSAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRzcF9jbWRfbG9jaywgZmxhZ3MpOwotCQltb2R1bGUtPm9wcyA9IE5VTEw7Ci0JCW1vZHVsZS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZHNwX2NtZF9sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKG1vZHVsZS0+c3RhdGUgIT0gQURTUF9TVEFURV9ESVNBQkxFRCkgewotCQkJTU1fSU5GTygiZGlzYWJsaW5nIG1vZHVsZSAlc1xuIiwgbW9kdWxlLT5uYW1lKTsKLQkJCW11dGV4X3VubG9jaygmbW9kdWxlLT5sb2NrKTsKLQkJCW1zbV9hZHNwX2Rpc2FibGUobW9kdWxlKTsKLQkJCXJldHVybjsKLQkJfQotCX0gZWxzZSB7Ci0JCU1NX0lORk8oIm1vZHVsZSAlcyBpcyBhbHJlYWR5IGNsb3NlZFxuIiwgbW9kdWxlLT5uYW1lKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZtb2R1bGUtPmxvY2spOwotfQotRVhQT1JUX1NZTUJPTChtc21fYWRzcF9wdXQpOwotCi1pbnQgX19tc21fYWRzcF93cml0ZShzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsIHVuc2lnbmVkIGRzcF9xdWV1ZV9hZGRyLAotCQkgICB2b2lkICpjbWRfYnVmLCBzaXplX3QgY21kX3NpemUpCi17Ci0JdWludDMyX3QgY3RybF93b3JkOwotCXVpbnQzMl90IGRzcF9xX2FkZHI7Ci0JdWludDMyX3QgZHNwX2FkZHI7Ci0JdWludDMyX3QgY21kX2lkID0gMDsKLQlpbnQgY250ID0gMDsKLQlpbnQgcmV0X3N0YXR1cyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYWRzcF9pbmZvICppbmZvOwotCi0JaWYgKCFtb2R1bGUgfHwgIWNtZF9idWYpIHsKLQkJTU1fRVJSKCJDYWxsZWQgd2l0aCBOVUxMIHBhcmFtZXRlcnNcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaW5mbyA9IG1vZHVsZS0+aW5mbzsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRzcF93cml0ZV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAobW9kdWxlLT5zdGF0ZSAhPSBBRFNQX1NUQVRFX0VOQUJMRUQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRzcF93cml0ZV9sb2NrLCBmbGFncyk7Ci0JCU1NX0VSUigibW9kdWxlICVzIG5vdCBlbmFibGVkIGJlZm9yZSB3cml0ZVxuIiwgbW9kdWxlLT5uYW1lKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWlmIChhZHNwX3ZhbGlkYXRlX21vZHVsZShtb2R1bGUtPmlkKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZHNwX3dyaXRlX2xvY2ssIGZsYWdzKTsKLQkJTU1fRVJSKCJtb2R1bGUgaWQgdmFsaWRhdGlvbiBmYWlsZWQgJXMgICVkXG4iLAotCQkJCW1vZHVsZS0+bmFtZSwgbW9kdWxlLT5pZCk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCWlmIChkc3BfcXVldWVfYWRkciA+PSBRRFNQX01BWF9OVU1fUVVFVUVTKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkc3Bfd3JpdGVfbG9jaywgZmxhZ3MpOwotCQlNTV9FUlIoIkludmFsaWQgUXVldWUgSW5kZXg6ICVkXG4iLCBkc3BfcXVldWVfYWRkcik7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCWlmIChhZHNwX3ZhbGlkYXRlX3F1ZXVlKG1vZHVsZS0+aWQsIGRzcF9xdWV1ZV9hZGRyLCBjbWRfc2l6ZSkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRzcF93cml0ZV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlkc3BfcV9hZGRyID0gYWRzcF9nZXRfcXVldWVfb2Zmc2V0KGluZm8sIGRzcF9xdWV1ZV9hZGRyKTsKLQlkc3BfcV9hZGRyICY9IEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfRFNQX0FERFJfTTsKLQotCS8qIFBvbGwgdW50aWwgdGhlIEFEU1AgaXMgcmVhZHkgdG8gYWNjZXB0IGEgY29tbWFuZC4KLQkgKiBXYWl0IGZvciAxMDB1cywgcmV0dXJuIGVycm9yIGlmIGl0J3Mgbm90IHJlc3BvbmRpbmcuCi0JICogSWYgdGhpcyByZXR1cm5zIGFuIGVycm9yLCB3ZSBuZWVkIHRvIGRpc2FibGUgQUxMIG1vZHVsZXMgYW5kCi0JICogdGhlbiByZXRyeS4KLQkgKi8KLQl3aGlsZSAoKChjdHJsX3dvcmQgPSByZWFkbChpbmZvLT53cml0ZV9jdHJsKSkgJgotCQlBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX1JFQURZX00pICE9Ci0JCUFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfUkVBRFlfVikgewotCQlpZiAoY250ID4gNTApIHsKLQkJCU1NX0VSUigidGltZW91dCB3YWl0aW5nIGZvciBEU1Agd3JpdGUgcmVhZHlcbiIpOwotCQkJcmV0X3N0YXR1cyA9IC1FSU87Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJTU1fREJHKCJ3YWl0aW5nIGZvciBEU1Agd3JpdGUgcmVhZHlcbiIpOwotCQl1ZGVsYXkoMik7Ci0JCWNudCsrOwotCX0KLQotCS8qIFNldCB0aGUgbXV0ZXggYml0cyAqLwotCWN0cmxfd29yZCAmPSB+KEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfTVVURVhfTSk7Ci0JY3RybF93b3JkIHw9ICBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX01VVEVYX05BVkFJTF9WOwotCi0JLyogQ2xlYXIgdGhlIGNvbW1hbmQgYml0cyAqLwotCWN0cmxfd29yZCAmPSB+KEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfQ01EX00pOwotCi0JLyogU2V0IHRoZSBxdWV1ZSBhZGRyZXNzIGJpdHMgKi8KLQljdHJsX3dvcmQgJj0gfihBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX0RTUF9BRERSX00pOwotCWN0cmxfd29yZCB8PSBkc3BfcV9hZGRyOwotCi0Jd3JpdGVsKGN0cmxfd29yZCwgaW5mby0+d3JpdGVfY3RybCk7Ci0KLQkvKiBHZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgdG8gdGhlIERTUC4gIFRoaXMgbm90aWZpZXMgdGhlIERTUCB0aGF0Ci0JICogd2UgYXJlIGFib3V0IHRvIHNlbmQgYSBjb21tYW5kIG9uIHRoaXMgcGFydGljdWxhciBxdWV1ZS4gIFRoZQotCSAqIERTUCB3aWxsIGluIHJlc3BvbnNlIGNoYW5nZSBpdHMgc3RhdGUuCi0JICovCi0Jd3JpdGVsKDEsIGluZm8tPnNlbmRfaXJxKTsKLQotCS8qIFBvbGwgdW50aWwgdGhlIGFkc3AgcmVzcG9uZHMgdG8gdGhlIGludGVycnVwdDsgdGhpcyBkb2VzIG5vdAotCSAqIGdlbmVyYXRlIGFuIGludGVycnVwdCBmcm9tIHRoZSBhZHNwLiAgVGhpcyBzaG91bGQgaGFwcGVuIHdpdGhpbgotCSAqIDVtcy4KLQkgKi8KLQljbnQgPSAwOwotCXdoaWxlICgocmVhZGwoaW5mby0+d3JpdGVfY3RybCkgJgotCQlBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX01VVEVYX00pID09Ci0JCUFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfTVVURVhfTkFWQUlMX1YpIHsKLQkJaWYgKGNudCA+IDI1MDApIHsKLQkJCU1NX0VSUigidGltZW91dCB3YWl0aW5nIGZvciBhZHNwIGFja1xuIik7Ci0JCQlyZXRfc3RhdHVzID0gLUVJTzsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQl1ZGVsYXkoMik7Ci0JCWNudCsrOwotCX0KLQotCS8qIFJlYWQgdGhlIGN0cmwgd29yZCAqLwotCWN0cmxfd29yZCA9IHJlYWRsKGluZm8tPndyaXRlX2N0cmwpOwotCi0JaWYgKChjdHJsX3dvcmQgJiBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX1NUQVRVU19NKSAhPQotCSAgICBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX05PX0VSUl9WKSB7Ci0JCXJldF9zdGF0dXMgPSAtRUFHQUlOOwotCQlnb3RvIGZhaWw7Ci0JfSBlbHNlIHsKLQkJLyogTm8gZXJyb3IgKi8KLQkJLyogR2V0IHRoZSBEU1AgYnVmZmVyIGFkZHJlc3MgKi8KLQkJZHNwX2FkZHIgPSAoY3RybF93b3JkICYgQURTUF9SVE9TX1dSSVRFX0NUUkxfV09SRF9EU1BfQUREUl9NKSArCi0JCQkgICAodWludDMyX3QpTVNNX0FENV9CQVNFOwotCi0JCWlmIChkc3BfYWRkciA8ICh1aW50MzJfdCkoTVNNX0FENV9CQVNFICsgUURTUF9SQU1DX09GRlNFVCkpIHsKLQkJCXVpbnQxNl90ICpidWZfcHRyID0gKHVpbnQxNl90ICopIGNtZF9idWY7Ci0JCQl1aW50MTZfdCAqZHNwX2FkZHIxNiA9ICh1aW50MTZfdCAqKWRzcF9hZGRyOwotCQkJY21kX3NpemUgLz0gc2l6ZW9mKHVpbnQxNl90KTsKLQotCQkJLyogU2F2ZSB0aGUgY29tbWFuZCBJRCAqLwotCQkJY21kX2lkID0gKHVpbnQzMl90KSBidWZfcHRyWzBdOwotCi0JCQkvKiBDb3B5IHRoZSBjb21tYW5kIHRvIERTUCBtZW1vcnkgKi8KLQkJCWNtZF9zaXplKys7Ci0JCQl3aGlsZSAoLS1jbWRfc2l6ZSkKLQkJCQkqZHNwX2FkZHIxNisrID0gKmJ1Zl9wdHIrKzsKLQkJfSBlbHNlIHsKLQkJCXVpbnQzMl90ICpidWZfcHRyID0gKHVpbnQzMl90ICopIGNtZF9idWY7Ci0JCQl1aW50MzJfdCAqZHNwX2FkZHIzMiA9ICh1aW50MzJfdCAqKWRzcF9hZGRyOwotCQkJY21kX3NpemUgLz0gc2l6ZW9mKHVpbnQzMl90KTsKLQotCQkJLyogU2F2ZSB0aGUgY29tbWFuZCBJRCAqLwotCQkJY21kX2lkID0gYnVmX3B0clswXTsKLQotCQkJY21kX3NpemUrKzsKLQkJCXdoaWxlICgtLWNtZF9zaXplKQotCQkJCSpkc3BfYWRkcjMyKysgPSAqYnVmX3B0cisrOwotCQl9Ci0KLQkJLyogU2V0IHRoZSBtdXRleCBiaXRzICovCi0JCWN0cmxfd29yZCAmPSB+KEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfTVVURVhfTSk7Ci0JCWN0cmxfd29yZCB8PSAgQURTUF9SVE9TX1dSSVRFX0NUUkxfV09SRF9NVVRFWF9OQVZBSUxfVjsKLQotCQkvKiBTZXQgdGhlIGNvbW1hbmQgYml0cyB0byB3cml0ZSBkb25lICovCi0JCWN0cmxfd29yZCAmPSB+KEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfQ01EX00pOwotCQljdHJsX3dvcmQgfD0gQURTUF9SVE9TX1dSSVRFX0NUUkxfV09SRF9DTURfV1JJVEVfRE9ORV9WOwotCi0JCS8qIFNldCB0aGUgcXVldWUgYWRkcmVzcyBiaXRzICovCi0JCWN0cmxfd29yZCAmPSB+KEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfRFNQX0FERFJfTSk7Ci0JCWN0cmxfd29yZCB8PSBkc3BfcV9hZGRyOwotCi0JCXdyaXRlbChjdHJsX3dvcmQsIGluZm8tPndyaXRlX2N0cmwpOwotCi0JCS8qIEdlbmVyYXRlIGFuIGludGVycnVwdCB0byB0aGUgRFNQLiAgSXQgZG9lcyBub3QgcmVzcG9uZCB3aXRoCi0JCSAqIGFuIGludGVycnVwdCwgYW5kIHdlIGRvIG5vdCBuZWVkIHRvIHdhaXQgZm9yIGl0IHRvCi0JCSAqIGFja25vd2xlZGdlLCBiZWNhdXNlIGl0IHdpbGwgaG9sZCB0aGUgbXV0ZXggbG9jayB1bnRpbCBpdCdzCi0JCSAqIHJlYWR5IHRvIHJlY2VpdmUgbW9yZSBjb21tYW5kcyBhZ2Fpbi4KLQkJICovCi0JCXdyaXRlbCgxLCBpbmZvLT5zZW5kX2lycSk7Ci0KLQkJbW9kdWxlLT5udW1fY29tbWFuZHMrKzsKLQl9IC8qIEN0cmwgd29yZCBzdGF0dXMgYml0cyB3ZXJlIDAwLCBubyBlcnJvciBpbiB0aGUgY3RybCB3b3JkICovCi0KLWZhaWw6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRzcF93cml0ZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldF9zdGF0dXM7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9hZHNwX3dyaXRlKTsKLQotaW50IG1zbV9hZHNwX3dyaXRlKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwgdW5zaWduZWQgZHNwX3F1ZXVlX2FkZHIsCi0JCQl2b2lkICpjbWRfYnVmLCBzaXplX3QgY21kX3NpemUpCi17Ci0JaW50IHJjLCByZXRyaWVzID0gMDsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQl1aW50MTZfdCAqcHRyOwotCWludCBpaTsKLQotCWlmICh3ZHVtcCA+IDApIHsKLQkJcHRyID0gY21kX2J1ZjsKLQkJcHJfaW5mbygiQS0+RDoleFxuIiwgbW9kdWxlLT5pZCk7Ci0JCXByX2luZm8oImFkc3A6ICV4ICVkXG4iLCBkc3BfcXVldWVfYWRkciwgY21kX3NpemUpOwotCQlmb3IgKGlpID0gMDsgaWkgPCBjbWRfc2l6ZS8yOyBpaSsrKQotCQkJcHJfaW5mbygiJXggIiwgcHRyW2lpXSk7Ci0JCXByX2luZm8oIlxuIik7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19ERUJVR19GUyAqLwotCWRvIHsKLQkJcmMgPSBfX21zbV9hZHNwX3dyaXRlKG1vZHVsZSwgZHNwX3F1ZXVlX2FkZHIsIGNtZF9idWYsCi0JCQkJCQkJCWNtZF9zaXplKTsKLQkJaWYgKHJjID09IC1FQUdBSU4pCi0JCQl1ZGVsYXkoNTApOwotCX0gd2hpbGUgKHJjID09IC1FQUdBSU4gJiYgcmV0cmllcysrIDwgMzAwKTsKLQlpZiAocmV0cmllcyA+IDIwKQotCQlNTV9JTkZPKCIlcyBjb21tYW5kIHRvb2sgJWQgYXR0ZW1wdHM6IHJjICVkXG4iLAotCQkJbW9kdWxlLT5uYW1lLCByZXRyaWVzLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi0jaWZkZWYgQ09ORklHX01TTV9BRFNQX1JFUE9SVF9FVkVOVFMKLXN0YXRpYyB2b2lkICpldmVudF9hZGRyOwotc3RhdGljIHZvaWQgcmVhZF9ldmVudCh2b2lkICpidWYsIHNpemVfdCBsZW4pCi17Ci0JdWludDMyX3QgZHB0clszXTsKLQlzdHJ1Y3QgYWRzcF9ydG9zX21wX210b2Ffc190eXBlICpzcHRyOwotCXN0cnVjdCBhZHNwX3J0b3NfbXBfbXRvYV90eXBlCSpwa3RfcHRyOwotCi0Jc3B0ciA9IGV2ZW50X2FkZHI7Ci0JcGt0X3B0ciA9ICZzcHRyLT5hZHNwX3J0b3NfbXBfbXRvYV9kYXRhLm1wX210b2FfcGFja2V0OwotCi0JZHB0clswXSA9IHNwdHItPm1wX210b2FfaGVhZGVyLmV2ZW50OwotCWRwdHJbMV0gPSBwa3RfcHRyLT5tb2R1bGU7Ci0JZHB0clsyXSA9IHBrdF9wdHItPmltYWdlOwotCi0JaWYgKGxlbiA+IEVWRU5UX0xFTikKLQkJbGVuID0gRVZFTlRfTEVOOwotCi0JbWVtY3B5KGJ1ZiwgZHB0ciwgbGVuKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBhZHNwX3J0b3NfbXRvYV9jYih2b2lkICpjb250ZXh0LCB1aW50MzJfdCBwYXJhbSwKLQkJCQkJdm9pZCAqZXZ0X2J1ZiwgdWludDMyX3QgbGVuKQotewotCXN0cnVjdCBhZHNwX3J0b3NfbXBfbXRvYV9zX3R5cGUgKmFyZ3MgPSBOVUxMOwotCXVpbnQzMl90IGV2ZW50ID0gMDsKLQl1aW50MzJfdCBwcm9jX2lkID0gMDsKLQl1aW50MzJfdCBtb2R1bGVfaWQ7Ci0JdWludDMyX3QgaW1hZ2U7Ci0Jc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlOwotCXN0cnVjdCBhZHNwX3J0b3NfbXBfbXRvYV90eXBlCSpwa3RfcHRyOwotCXN0cnVjdCBxdWV1ZV90b19vZmZzZXRfdHlwZQkqcXB0cjsKLQlzdHJ1Y3QgcXVldWVfdG9fb2Zmc2V0X3R5cGUJKnF0Ymw7Ci0Jc3RydWN0IG1vZF90b19xdWV1ZV9vZmZzZXRzCSptcXB0cjsKLQlzdHJ1Y3QgbW9kX3RvX3F1ZXVlX29mZnNldHMJKm1xdGJsOwotCXVpbnQzMl90CSptcHRyOwotCXVpbnQzMl90CSptdGJsOwotCXVpbnQzMl90CXFfaWR4OwotCXVpbnQzMl90CW51bV9lbnRyaWVzOwotCXVpbnQzMl90CWVudHJpZXNfcGVyX2ltYWdlOwotCXN0cnVjdCBhZHNwX3J0b3NfbXBfbXRvYV9pbml0X2luZm9fdHlwZSAqaXB0cjsKLQlzdHJ1Y3QgYWRzcF9ydG9zX21wX210b2FfaW5pdF9pbmZvX3R5cGUJKnNwdHI7Ci0JaW50MzJfdAkJaV9ubywgZV9pZHg7Ci0Jc3RhdGljIHVpbnQzMl90CWluaXRfaW5mb19jb21wbGV0ZWQ7Ci0Jc3RhdGljIHVpbnQzMl90IGluaXRfaW5mb19sZW4gPQotCQkJCXNpemVvZihzdHJ1Y3QgYWRzcF9ydG9zX21wX210b2FfaGVhZGVyX3R5cGUpOwotCXN0YXRpYyB1aW50MzJfdAluZXh0X2luaXRfaW5mb19ieXRlOwotCXN0YXRpYyB1aW50MzJfdCBleHBlY3RlZF9ieXRlID0gMTsKLQl1aW50MzJfdCBoZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBhZHNwX3J0b3NfbXBfbXRvYV9oZWFkZXJfdHlwZSk7Ci0KLQlpZiAobGVuKSB7Ci0JCWFyZ3MgPSAoc3RydWN0IGFkc3BfcnRvc19tcF9tdG9hX3NfdHlwZSAqKSBldnRfYnVmOwotCQlldmVudCA9IGFyZ3MtPm1wX210b2FfaGVhZGVyLmV2ZW50OwotCQlwcm9jX2lkID0gYXJncy0+bXBfbXRvYV9oZWFkZXIucHJvY19pZDsKLQl9Ci0KLQlpZiAoIWluaXRfaW5mb19jb21wbGV0ZWQgJiYgZXZlbnQgPT0gUlBDX0FEU1BfUlRPU19JTklUX0lORk8pIHsKLQkJbWVtY3B5KCgoY2hhciAqKWFkc3BfaW5mby5yYXdfZXZlbnQpICsgaW5pdF9pbmZvX2xlbiwKLQkJCQkJCShjaGFyICopZXZ0X2J1ZiArIGhkcl9sZW4gKyA0LAotCQkJCQkJCWxlbiAtICgoaGRyX2xlbiArIDQpKSk7Ci0JCWluaXRfaW5mb19sZW4gKz0gKGxlbiAtIChoZHJfbGVuICsgNCkpOwotCQlldnRfYnVmICs9IGhkcl9sZW47Ci0JCW5leHRfaW5pdF9pbmZvX2J5dGUgPSAqKHVpbnQzMl90ICopIGV2dF9idWY7Ci0JCWV4cGVjdGVkX2J5dGUgKz0gbGVuOwotCQlpZiAobmV4dF9pbml0X2luZm9fYnl0ZSAmJgotCQkJCShleHBlY3RlZF9ieXRlICE9IG5leHRfaW5pdF9pbmZvX2J5dGUpKSB7Ci0JCQlNTV9FUlIoIklOSVRfSU5GTyAtIGV4cGVjdGluZyBuZXh0IGJ5dGUgdG8gYmUgJWRcbiIKLQkJCQkiXHRidXQgQURTUFNWQyBpbmRpY2F0ZWQgbmV4dCBieXRlIHRvIGJlICVkXG4iLAotCQkJCWV4cGVjdGVkX2J5dGUsIG5leHRfaW5pdF9pbmZvX2J5dGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghbmV4dF9pbml0X2luZm9fYnl0ZSkgewotCQkJYXJncyA9IGFkc3BfaW5mby5yYXdfZXZlbnQ7Ci0JCQlhcmdzLT5tcF9tdG9hX2hlYWRlci5ldmVudCA9IGV2ZW50OwotCQkJYXJncy0+bXBfbXRvYV9oZWFkZXIucHJvY19pZCA9IHByb2NfaWQ7Ci0JCQlpbml0X2luZm9fY29tcGxldGVkID0gMTsKLQkJfSBlbHNlCi0JCQlyZXR1cm47Ci0JfQotCi0JaWYgKGV2ZW50ID09IFJQQ19BRFNQX1JUT1NfSU5JVF9JTkZPKSB7Ci0JCU1NX0lORk8oIklOSVRfSU5GTyBFdmVudFxuIik7Ci0JCXNwdHIgPSAmYXJncy0+YWRzcF9ydG9zX21wX210b2FfZGF0YS5tcF9tdG9hX2luaXRfcGFja2V0OwotCi0JCWlwdHIgPSBhZHNwX2luZm8uaW5pdF9pbmZvX3B0cjsKLQkJaXB0ci0+aW1hZ2VfY291bnQgPSBzcHRyLT5pbWFnZV9jb3VudDsKLQkJaWYgKGlwdHItPmltYWdlX2NvdW50ID4gSU1HX01BWCkKLQkJCWlwdHItPmltYWdlX2NvdW50ID0gSU1HX01BWDsKLQkJaXB0ci0+bnVtX3F1ZXVlX29mZnNldHMgPSBzcHRyLT5udW1fcXVldWVfb2Zmc2V0czsKLQkJbnVtX2VudHJpZXMgPSBpcHRyLT5udW1fcXVldWVfb2Zmc2V0czsKLQkJaWYgKG51bV9lbnRyaWVzID4gRU5UUklFU19NQVgpIHsKLQkJCW51bV9lbnRyaWVzID0gRU5UUklFU19NQVg7Ci0JCQlpcHRyLT5udW1fcXVldWVfb2Zmc2V0cyA9IEVOVFJJRVNfTUFYOwotCQl9Ci0JCXFwdHIgPSAmc3B0ci0+cXVldWVfb2Zmc2V0c190YmxbMF1bMF07Ci0JCWZvciAoaV9ubyA9IDA7IGlfbm8gPCBpcHRyLT5pbWFnZV9jb3VudDsgaV9ubysrKSB7Ci0JCQlxdGJsID0gJmlwdHItPnF1ZXVlX29mZnNldHNfdGJsW2lfbm9dWzBdOwotCQkJZm9yIChlX2lkeCA9IDA7IGVfaWR4IDwgbnVtX2VudHJpZXM7IGVfaWR4KyspIHsKLQkJCQlxdGJsW2VfaWR4XS5vZmZzZXQgPSBxcHRyLT5vZmZzZXQ7Ci0JCQkJcXRibFtlX2lkeF0ucXVldWUgPSBxcHRyLT5xdWV1ZTsKLQkJCQlxX2lkeCA9IHFwdHItPnF1ZXVlOwotCQkJCWlwdHItPnF1ZXVlX29mZnNldHNbaV9ub11bcV9pZHhdID0KLQkJCQkJCQlxdGJsW2VfaWR4XS5vZmZzZXQ7Ci0JCQkJcXB0cisrOwotCQkJfQotCQl9Ci0KLQkJbnVtX2VudHJpZXMgPSBzcHRyLT5udW1fdGFza19tb2R1bGVfZW50cmllczsKLQkJaWYgKG51bV9lbnRyaWVzID4gRU5UUklFU19NQVgpCi0JCQludW1fZW50cmllcyA9IEVOVFJJRVNfTUFYOwotCQlpcHRyLT5udW1fdGFza19tb2R1bGVfZW50cmllcyA9IG51bV9lbnRyaWVzOwotCQllbnRyaWVzX3Blcl9pbWFnZSA9IG51bV9lbnRyaWVzIC8gaXB0ci0+aW1hZ2VfY291bnQ7Ci0JCW1wdHIgPSAmc3B0ci0+dGFza190b19tb2R1bGVfdGJsWzBdWzBdOwotCQlmb3IgKGlfbm8gPSAwOyBpX25vIDwgaXB0ci0+aW1hZ2VfY291bnQ7IGlfbm8rKykgewotCQkJbXRibCA9ICZpcHRyLT50YXNrX3RvX21vZHVsZV90YmxbaV9ub11bMF07Ci0JCQlmb3IgKGVfaWR4ID0gMDsgZV9pZHggPCBlbnRyaWVzX3Blcl9pbWFnZTsgZV9pZHgrKykgewotCQkJCW10YmxbZV9pZHhdID0gKm1wdHI7Ci0JCQkJbXB0cisrOwotCQkJfQotCQl9Ci0KLQkJaXB0ci0+bW9kdWxlX3RhYmxlX3NpemUgPSBzcHRyLT5tb2R1bGVfdGFibGVfc2l6ZTsKLQkJaWYgKGlwdHItPm1vZHVsZV90YWJsZV9zaXplID4gTU9EVUxFU19NQVgpCi0JCQlpcHRyLT5tb2R1bGVfdGFibGVfc2l6ZSA9IE1PRFVMRVNfTUFYOwotCQltcHRyID0gJnNwdHItPm1vZHVsZV9lbnRyaWVzWzBdOwotCQlmb3IgKGlfbm8gPSAwOyBpX25vIDwgaXB0ci0+bW9kdWxlX3RhYmxlX3NpemU7IGlfbm8rKykKLQkJCWlwdHItPm1vZHVsZV9lbnRyaWVzW2lfbm9dID0gbXB0cltpX25vXTsKLQotCQltcXB0ciA9ICZzcHRyLT5tb2RfdG9fcV90YmxbMF07Ci0JCW1xdGJsID0gJmlwdHItPm1vZF90b19xX3RibFswXTsKLQkJaXB0ci0+bW9kX3RvX3FfZW50cmllcyA9IHNwdHItPm1vZF90b19xX2VudHJpZXM7Ci0JCWlmIChpcHRyLT5tb2RfdG9fcV9lbnRyaWVzID4gRU5UUklFU19NQVgpCi0JCQlpcHRyLT5tb2RfdG9fcV9lbnRyaWVzID0gRU5UUklFU19NQVg7Ci0JCWZvciAoZV9pZHggPSAwOyBlX2lkeCA8IGlwdHItPm1vZF90b19xX2VudHJpZXM7IGVfaWR4KyspIHsKLQkJCW1xdGJsW2VfaWR4XS5tb2R1bGUgPSBtcXB0ci0+bW9kdWxlOwotCQkJbXF0YmxbZV9pZHhdLnFfdHlwZSA9IG1xcHRyLT5xX3R5cGU7Ci0JCQltcXRibFtlX2lkeF0ucV9tYXhfbGVuID0gbXFwdHItPnFfbWF4X2xlbjsKLQkJCW1xcHRyKys7Ci0JCX0KLQotCQlhZHNwX2luZm8uaW5pdF9pbmZvX3N0YXRlID0gQURTUF9TVEFURV9JTklUX0lORk87Ci0JCWtmcmVlKGFkc3BfaW5mby5yYXdfZXZlbnQpOwotCQl3YWtlX3VwKCZhZHNwX2luZm8uaW5pdF9pbmZvX3dhaXQpOwotCQlyZXR1cm47Ci0JfQotCXBrdF9wdHIgPSAmYXJncy0+YWRzcF9ydG9zX21wX210b2FfZGF0YS5tcF9tdG9hX3BhY2tldDsKLQltb2R1bGVfaWQgPSBwa3RfcHRyLT5tb2R1bGU7Ci0JaW1hZ2UgICAgID0gcGt0X3B0ci0+aW1hZ2U7Ci0KLQlNTV9JTkZPKCJycGMgZXZlbnQ9JWQsIHByb2NfaWQ9JWQsIG1vZHVsZT0lZCwgaW1hZ2U9JWRcbiIsCi0JCWV2ZW50LCBwcm9jX2lkLCBtb2R1bGVfaWQsIGltYWdlKTsKLQotCW1vZHVsZSA9IGZpbmRfYWRzcF9tb2R1bGVfYnlfaWQoJmFkc3BfaW5mbywgbW9kdWxlX2lkKTsKLQlpZiAoIW1vZHVsZSkgewotCQlNTV9FUlIoIm1vZHVsZSAlZCBpcyBub3Qgc3VwcG9ydGVkIVxuIiwgbW9kdWxlX2lkKTsKLQkJcmV0dXJuOwotCX0KLQotCW11dGV4X2xvY2soJm1vZHVsZS0+bG9jayk7Ci0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgUlBDX0FEU1BfUlRPU19NT0RfUkVBRFk6Ci0JCU1NX0lORk8oIm1vZHVsZSAlczogUkVBRFlcbiIsIG1vZHVsZS0+bmFtZSk7Ci0JCW1vZHVsZS0+c3RhdGUgPSBBRFNQX1NUQVRFX0VOQUJMRUQ7Ci0JCXdha2VfdXAoJm1vZHVsZS0+c3RhdGVfd2FpdCk7Ci0JCWFkc3Bfc2V0X2ltYWdlKG1vZHVsZS0+aW5mbywgaW1hZ2UpOwotCQlicmVhazsKLQljYXNlIFJQQ19BRFNQX1JUT1NfTU9EX0RJU0FCTEU6Ci0JCU1NX0lORk8oIm1vZHVsZSAlczogRElTQUJMRURcbiIsIG1vZHVsZS0+bmFtZSk7Ci0JCW1vZHVsZS0+c3RhdGUgPSBBRFNQX1NUQVRFX0RJU0FCTEVEOwotCQl3YWtlX3VwKCZtb2R1bGUtPnN0YXRlX3dhaXQpOwotCQlicmVhazsKLQljYXNlIFJQQ19BRFNQX1JUT1NfU0VSVklDRV9SRVNFVDoKLQkJTU1fSU5GTygibW9kdWxlICVzOiBTRVJWSUNFX1JFU0VUXG4iLCBtb2R1bGUtPm5hbWUpOwotCQltb2R1bGUtPnN0YXRlID0gQURTUF9TVEFURV9ESVNBQkxFRDsKLQkJd2FrZV91cCgmbW9kdWxlLT5zdGF0ZV93YWl0KTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfQURTUF9SVE9TX0NNRF9TVUNDRVNTOgotCQlNTV9JTkZPKCJtb2R1bGUgJXM6IENNRF9TVUNDRVNTXG4iLCBtb2R1bGUtPm5hbWUpOwotCQlicmVhazsKLQljYXNlIFJQQ19BRFNQX1JUT1NfQ01EX0ZBSUw6Ci0JCU1NX0lORk8oIm1vZHVsZSAlczogQ01EX0ZBSUxcbiIsIG1vZHVsZS0+bmFtZSk7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0FEU1BfUlRPU19ESVNBQkxFX0ZBSUw6Ci0JCU1NX0lORk8oIm1vZHVsZSAlczogRElTQUJMRV9GQUlMXG4iLCBtb2R1bGUtPm5hbWUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlNTV9FUlIoInVua25vd24gZXZlbnQgJWRcbiIsIGV2ZW50KTsKLQkJbXV0ZXhfdW5sb2NrKCZtb2R1bGUtPmxvY2spOwotCQlyZXR1cm47Ci0JfQotI2lmZGVmIENPTkZJR19NU01fQURTUF9SRVBPUlRfRVZFTlRTCi0JZXZlbnRfYWRkciA9ICh1aW50MzJfdCAqKWV2dF9idWY7Ci0JaWYgKG1vZHVsZS0+b3BzKQotCQltb2R1bGUtPm9wcy0+ZXZlbnQobW9kdWxlLT5kcml2ZXJfZGF0YSwKLQkJCQkJRVZFTlRfTVNHX0lELAotCQkJCQlFVkVOVF9MRU4sCi0JCQkJCXJlYWRfZXZlbnQpOwotI2VuZGlmCi0JbXV0ZXhfdW5sb2NrKCZtb2R1bGUtPmxvY2spOwotfQotCi1zdGF0aWMgc2l6ZV90IHJlYWRfZXZlbnRfc2l6ZTsKLXN0YXRpYyB2b2lkICpyZWFkX2V2ZW50X2FkZHI7Ci0KLXN0YXRpYyB2b2lkIHJlYWRfZXZlbnRfMTYodm9pZCAqYnVmLCBzaXplX3QgbGVuKQotewotCXVpbnQxNl90ICpkc3QgPSBidWY7Ci0JdWludDE2X3QgKnNyYyA9IHJlYWRfZXZlbnRfYWRkcjsKLQlsZW4gLz0gMjsKLQlpZiAobGVuID4gcmVhZF9ldmVudF9zaXplKQotCQlsZW4gPSByZWFkX2V2ZW50X3NpemU7Ci0Jd2hpbGUgKGxlbi0tKQotCQkqZHN0KysgPSAqc3JjKys7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlYWRfZXZlbnRfMzIodm9pZCAqYnVmLCBzaXplX3QgbGVuKQotewotCXVpbnQzMl90ICpkc3QgPSBidWY7Ci0JdWludDMyX3QgKnNyYyA9IHJlYWRfZXZlbnRfYWRkcjsKLQlsZW4gLz0gMjsKLQlpZiAobGVuID4gcmVhZF9ldmVudF9zaXplKQotCQlsZW4gPSByZWFkX2V2ZW50X3NpemU7Ci0Jd2hpbGUgKGxlbi0tKQotCQkqZHN0KysgPSAqc3JjKys7Ci19Ci0KLXN0YXRpYyBpbnQgYWRzcF9ydG9zX3JlYWRfY3RybF93b3JkX2NtZF90YXN0X3RvX2hfdigKLQlzdHJ1Y3QgYWRzcF9pbmZvICppbmZvLCB2b2lkICpkc3BfYWRkcikKLXsKLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGU7Ci0JdW5zaWduZWQgcnRvc190YXNrX2lkOwotCXVuc2lnbmVkIG1zZ19pZDsKLQl1bnNpZ25lZCBtc2dfbGVuZ3RoOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXVpbnQxNl90ICpwdHI7Ci0JaW50IGlpOwotI2VuZGlmIC8qIENPTkZJR19ERUJVR19GUyAqLwotCXZvaWQgKCpmdW5jKSh2b2lkICosIHNpemVfdCk7Ci0KLQlpZiAoZHNwX2FkZHIgPj0gKHZvaWQgKikoTVNNX0FENV9CQVNFICsgUURTUF9SQU1DX09GRlNFVCkpIHsKLQkJdWludDMyX3QgKmRzcF9hZGRyMzIgPSBkc3BfYWRkcjsKLQkJdWludDMyX3QgdG1wID0gKmRzcF9hZGRyMzIrKzsKLQkJcnRvc190YXNrX2lkID0gKHRtcCAmIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9UQVNLX0lEX00pID4+IDg7Ci0JCW1zZ19pZCA9ICh0bXAgJiBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfTVNHX0lEX00pOwotCQlyZWFkX2V2ZW50X3NpemUgPSB0bXAgPj4gMTY7Ci0JCXJlYWRfZXZlbnRfYWRkciA9IGRzcF9hZGRyMzI7Ci0JCW1zZ19sZW5ndGggPSByZWFkX2V2ZW50X3NpemUgKiBzaXplb2YodWludDMyX3QpOwotCQlmdW5jID0gcmVhZF9ldmVudF8zMjsKLQl9IGVsc2UgewotCQl1aW50MTZfdCAqZHNwX2FkZHIxNiA9IGRzcF9hZGRyOwotCQl1aW50MTZfdCB0bXAgPSAqZHNwX2FkZHIxNisrOwotCQlydG9zX3Rhc2tfaWQgPSAodG1wICYgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX1RBU0tfSURfTSkgPj4gODsKLQkJbXNnX2lkID0gdG1wICYgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX01TR19JRF9NOwotCQlyZWFkX2V2ZW50X3NpemUgPSAqZHNwX2FkZHIxNisrOwotCQlyZWFkX2V2ZW50X2FkZHIgPSBkc3BfYWRkcjE2OwotCQltc2dfbGVuZ3RoID0gcmVhZF9ldmVudF9zaXplICogc2l6ZW9mKHVpbnQxNl90KTsKLQkJZnVuYyA9IHJlYWRfZXZlbnRfMTY7Ci0JfQotCi0JaWYgKHJ0b3NfdGFza19pZCA+IGluZm8tPm1heF90YXNrX2lkKSB7Ci0JCU1NX0VSUigiYm9ndXMgdGFzayBpZCAlZFxuIiwgcnRvc190YXNrX2lkKTsKLQkJcmV0dXJuIDA7Ci0JfQotCW1vZHVsZSA9IGZpbmRfYWRzcF9tb2R1bGVfYnlfaWQoaW5mbywKLQkJCQkJYWRzcF9nZXRfbW9kdWxlKGluZm8sIHJ0b3NfdGFza19pZCkpOwotCi0JaWYgKCFtb2R1bGUpIHsKLQkJTU1fRVJSKCJubyBtb2R1bGUgZm9yIHRhc2sgaWQgJWRcbiIsIHJ0b3NfdGFza19pZCk7Ci0JCXJldHVybiAwOwotCX0KLQotCW1vZHVsZS0+bnVtX2V2ZW50cysrOwotCi0JaWYgKCFtb2R1bGUtPm9wcykgewotCQlNTV9FUlIoIm1vZHVsZSAlcyBpcyBub3Qgb3BlblxuIiwgbW9kdWxlLT5uYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCWlmIChyZHVtcCA+IDApIHsKLQkJcHRyID0gcmVhZF9ldmVudF9hZGRyOwotCQlwcl9pbmZvKCJELT5BXG4iKTsKLQkJcHJfaW5mbygibV9pZCA9ICV4IGlkID0gJXhcbiIsIG1vZHVsZS0+aWQsIG1zZ19pZCk7Ci0JCWZvciAoaWkgPSAwOyBpaSA8IG1zZ19sZW5ndGgvMjsgaWkrKykKLQkJCXByX2luZm8oIiV4ICIsIHB0cltpaV0pOwotCQlwcl9pbmZvKCJcbiIpOwotCX0KLSNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KLQotCW1vZHVsZS0+b3BzLT5ldmVudChtb2R1bGUtPmRyaXZlcl9kYXRhLCBtc2dfaWQsIG1zZ19sZW5ndGgsIGZ1bmMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkc3BfZ2V0X2V2ZW50KHN0cnVjdCBhZHNwX2luZm8gKmluZm8pCi17Ci0JdWludDMyX3QgY3RybF93b3JkOwotCXVpbnQzMl90IHJlYWR5OwotCXZvaWQgKmRzcF9hZGRyOwotCXVpbnQzMl90IGNtZF90eXBlOwotCWludCBjbnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmMgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkc3BfY21kX2xvY2ssIGZsYWdzKTsKLQotCS8qIFdoZW5ldmVyIHRoZSBEU1AgaGFzIGEgbWVzc2FnZSwgaXQgdXBkYXRlcyB0aGlzIGNvbnRyb2wgd29yZAotCSAqIGFuZCBnZW5lcmF0ZXMgYW4gaW50ZXJydXB0LiAgV2hlbiB3ZSByZWNlaXZlIHRoZSBpbnRlcnJ1cHQsIHdlCi0JICogcmVhZCB0aGlzIHJlZ2lzdGVyIHRvIGZpbmQgb3V0IHdoYXQgQURTUCB0YXNrIHRoZSBjb21tYW5kIGlzCi0JICogY29tbWluZyBmcm9tLgotCSAqCi0JICogVGhlIEFEU1Agc2hvdWxkICphbHdheXMqIGJlIHJlYWR5IG9uIHRoZSBmaXJzdCBjYWxsLCBidXQgdGhlCi0JICogaXJxIGhhbmRsZXIgY2FsbHMgdXMgaW4gYSBsb29wICh0byBoYW5kbGUgYmFjay10by1iYWNrIGNvbW1hbmQKLQkgKiBwcm9jZXNzaW5nKSwgc28gd2UgZ2l2ZSB0aGUgRFNQIHNvbWUgdGltZSB0byByZXR1cm4gdG8gdGhlCi0JICogcmVhZHkgc3RhdGUuICBUaGUgRFNQIHdpbGwgbm90IGlzc3VlIGFub3RoZXIgSVJRIGZvciBldmVudHMKLQkgKiBwZW5kaW5nIGJldHdlZW4gdGhlIGZpcnN0IElSUSBhbmQgdGhlIGV2ZW50IHF1ZXVlIGJlaW5nIGRyYWluZWQsCi0JICogdW5mb3J0dW5hdGVseS4KLQkgKi8KLQotCWZvciAoY250ID0gMDsgY250IDwgNTA7IGNudCsrKSB7Ci0JCWN0cmxfd29yZCA9IHJlYWRsKGluZm8tPnJlYWRfY3RybCk7Ci0KLQkJaWYgKChjdHJsX3dvcmQgJiBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfRkxBR19NKSA9PQotCQkgICAgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX0ZMQUdfVVBfQ09OVF9WKQotCQkJZ290byByZWFkeTsKLQotCQl1ZGVsYXkoMik7Ci0JfQotCU1NX0VSUigibm90IHJlYWR5IGFmdGVyIDEwMHVTXG4iKTsKLQlyYyA9IC1FQlVTWTsKLQlnb3RvIGRvbmU7Ci0KLXJlYWR5OgotCS8qIEhlcmUgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBwZW5kaW5nIG1lc3NhZ2VzLiBJZiB0aGVyZSBhcmUKLQkgKiBub25lLCB3ZSBzaXBseSByZXR1cm4gLUVBR0FJTiB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGFyZSBubyBtb3JlCi0JICogbWVzc2FnZXMgcGVuZGluZy4KLQkgKi8KLQlyZWFkeSA9IGN0cmxfd29yZCAmIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9SRUFEWV9NOwotCWlmICgocmVhZHkgIT0gQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX1JFQURZX1YpICYmCi0JICAgIChyZWFkeSAhPSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfQ09OVF9WKSkgewotCQlyYyA9IC1FQUdBSU47Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBEU1Agc2F5cyB0aGF0IHRoZXJlIGFyZSBtZXNzYWdlcyB3YWl0aW5nIGZvciB0aGUgaG9zdCB0byByZWFkICovCi0KLQkvKiBHZXQgdGhlIENvbW1hbmQgVHlwZSAqLwotCWNtZF90eXBlID0gY3RybF93b3JkICYgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX0NNRF9UWVBFX007Ci0KLQkvKiBHZXQgdGhlIERTUCBidWZmZXIgYWRkcmVzcyAqLwotCWRzcF9hZGRyID0gKHZvaWQgKikoKGN0cmxfd29yZCAmCi0JCQkgICAgIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9EU1BfQUREUl9NKSArCi0JCQkgICAgKHVpbnQzMl90KU1TTV9BRDVfQkFTRSk7Ci0KLQkvKiBXZSBjYW4gb25seSBoYW5kbGUgVGFzay10by1Ib3N0IG1lc3NhZ2VzICovCi0JaWYgKGNtZF90eXBlICE9IEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9DTURfVEFTS19UT19IX1YpIHsKLQkJTU1fRVJSKCJ1bmtub3duIGRzcCBjbWRfdHlwZSAlZFxuIiwgY21kX3R5cGUpOwotCQlyYyA9IC1FSU87Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhZHNwX3J0b3NfcmVhZF9jdHJsX3dvcmRfY21kX3Rhc3RfdG9faF92KGluZm8sIGRzcF9hZGRyKTsKLQotCWN0cmxfd29yZCA9IHJlYWRsKGluZm8tPnJlYWRfY3RybCk7Ci0JY3RybF93b3JkICY9IH5BRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfUkVBRFlfTTsKLQotCS8qIFdyaXRlIGN0cmwgd29yZCB0byB0aGUgRFNQICovCi0Jd3JpdGVsKGN0cmxfd29yZCwgaW5mby0+cmVhZF9jdHJsKTsKLQotCS8qIEdlbmVyYXRlIGFuIGludGVycnVwdCB0byB0aGUgRFNQICovCi0Jd3JpdGVsKDEsIGluZm8tPnNlbmRfaXJxKTsKLQotZG9uZToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZHNwX2NtZF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYWRzcF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBhZHNwX2luZm8gKmluZm8gPSAmYWRzcF9pbmZvOwotCWludCBjbnQgPSAwOwotCWZvciAoY250ID0gMDsgY250IDwgMTU7IGNudCsrKQotCQlpZiAoYWRzcF9nZXRfZXZlbnQoaW5mbykgPCAwKQotCQkJYnJlYWs7Ci0JaWYgKGNudCA+IGluZm8tPmV2ZW50X2JhY2tsb2dfbWF4KQotCQlpbmZvLT5ldmVudF9iYWNrbG9nX21heCA9IGNudDsKLQlpbmZvLT5ldmVudHNfcmVjZWl2ZWQgKz0gY250OwotCWlmIChjbnQgPT0gMTUpCi0JCU1NX0VSUigidG9vIG1hbnkgKCVkKSBldmVudHMgZm9yIHNpbmdsZSBpcnEhXG4iLCBjbnQpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotaW50IGFkc3Bfc2V0X2Nsa3JhdGUoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLCB1bnNpZ25lZCBsb25nIGNsa19yYXRlKQotewotCWlmIChtb2R1bGUtPmNsayAmJiBjbGtfcmF0ZSkKLQkJcmV0dXJuIGNsa19zZXRfcmF0ZShtb2R1bGUtPmNsaywgY2xrX3JhdGUpOwotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLWludCBtc21fYWRzcF9lbmFibGUoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlKQotewotCWludCByYyA9IDA7Ci0KLQlNTV9JTkZPKCJlbmFibGUgJyVzJ3N0YXRlWyVkXSBpZFslZF1cbiIsCi0JCQkJbW9kdWxlLT5uYW1lLCBtb2R1bGUtPnN0YXRlLCBtb2R1bGUtPmlkKTsKLQotCW11dGV4X2xvY2soJm1vZHVsZS0+bG9jayk7Ci0Jc3dpdGNoIChtb2R1bGUtPnN0YXRlKSB7Ci0JY2FzZSBBRFNQX1NUQVRFX0RJU0FCTEVEOgotCQltb2R1bGUtPnN0YXRlID0gQURTUF9TVEFURV9FTkFCTElORzsKLQkJbXV0ZXhfdW5sb2NrKCZtb2R1bGUtPmxvY2spOwotCQlyYyA9IHJwY19hZHNwX3J0b3NfYXBwX3RvX21vZGVtKFJQQ19BRFNQX1JUT1NfQ01EX0VOQUJMRSwKLQkJCQkJCW1vZHVsZS0+aWQsIG1vZHVsZSk7Ci0JCWlmIChyYykgewotCQkJbXV0ZXhfbG9jaygmbW9kdWxlLT5sb2NrKTsKLQkJCW1vZHVsZS0+c3RhdGUgPSBBRFNQX1NUQVRFX0RJU0FCTEVEOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQobW9kdWxlLT5zdGF0ZV93YWl0LAotCQkJCQltb2R1bGUtPnN0YXRlICE9IEFEU1BfU1RBVEVfRU5BQkxJTkcsCi0JCQkJCTEgKiBIWik7Ci0JCW11dGV4X2xvY2soJm1vZHVsZS0+bG9jayk7Ci0JCWlmIChtb2R1bGUtPnN0YXRlID09IEFEU1BfU1RBVEVfRU5BQkxFRCkgewotCQkJcmMgPSAwOwotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJtb2R1bGUgJyVzJyBlbmFibGUgdGltZWQgb3V0XG4iLCBtb2R1bGUtPm5hbWUpOwotCQkJcmMgPSAtRVRJTUVET1VUOwotCQl9Ci0JCWlmIChtb2R1bGUtPm9wZW5fY291bnQrKyA9PSAwICYmIG1vZHVsZS0+Y2xrKQotCQkJY2xrX3ByZXBhcmVfZW5hYmxlKG1vZHVsZS0+Y2xrKTsKLQotCQltdXRleF9sb2NrKCZhZHNwX29wZW5fbG9jayk7Ci0JCWlmIChhZHNwX29wZW5fY291bnQrKyA9PSAwKQotCQkJZW5hYmxlX2lycShhZHNwX2luZm8uaW50X2Fkc3ApOwotCQltdXRleF91bmxvY2soJmFkc3Bfb3Blbl9sb2NrKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRFNQX1NUQVRFX0VOQUJMSU5HOgotCQlNTV9EQkcoIm1vZHVsZSAnJXMnIGVuYWJsZSBpbiBwcm9ncmVzc1xuIiwgbW9kdWxlLT5uYW1lKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRFNQX1NUQVRFX0VOQUJMRUQ6Ci0JCU1NX0RCRygibW9kdWxlICclcycgYWxyZWFkeSBlbmFibGVkXG4iLCBtb2R1bGUtPm5hbWUpOwotCQlicmVhazsKLQljYXNlIEFEU1BfU1RBVEVfRElTQUJMSU5HOgotCQlNTV9FUlIoIm1vZHVsZSAnJXMnIGRpc2FibGUgaW4gcHJvZ3Jlc3NcbiIsIG1vZHVsZS0+bmFtZSk7Ci0JCXJjID0gLUVCVVNZOwotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZtb2R1bGUtPmxvY2spOwotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2Fkc3BfZW5hYmxlKTsKLQotaW50IG1zbV9hZHNwX2Rpc2FibGVfZXZlbnRfcnNwKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSkKLXsKLQlpbnQgcmMgPSAwOwotCi0JbXV0ZXhfbG9jaygmbW9kdWxlLT5sb2NrKTsKLQotCXJjID0gcnBjX2Fkc3BfcnRvc19hcHBfdG9fbW9kZW0oUlBDX0FEU1BfUlRPU19DTURfRElTQUJMRV9FVkVOVF9SU1AsCi0JCQkJCQkJbW9kdWxlLT5pZCwgbW9kdWxlKTsKLQltdXRleF91bmxvY2soJm1vZHVsZS0+bG9jayk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9hZHNwX2Rpc2FibGVfZXZlbnRfcnNwKTsKLQotaW50IG1zbV9hZHNwX2Rpc2FibGUoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlKQotewotCWludCByYyA9IDA7Ci0KLQltdXRleF9sb2NrKCZtb2R1bGUtPmxvY2spOwotCXN3aXRjaCAobW9kdWxlLT5zdGF0ZSkgewotCWNhc2UgQURTUF9TVEFURV9ESVNBQkxFRDoKLQkJTU1fREJHKCJtb2R1bGUgJyVzJyBhbHJlYWR5IGRpc2FibGVkXG4iLCBtb2R1bGUtPm5hbWUpOwotCQltdXRleF91bmxvY2soJm1vZHVsZS0+bG9jayk7Ci0JCWJyZWFrOwotCWNhc2UgQURTUF9TVEFURV9FTkFCTElORzoKLQljYXNlIEFEU1BfU1RBVEVfRU5BQkxFRDoKLQkJbXV0ZXhfdW5sb2NrKCZtb2R1bGUtPmxvY2spOwotCQlyYyA9IHJwY19hZHNwX3J0b3NfYXBwX3RvX21vZGVtKFJQQ19BRFNQX1JUT1NfQ01EX0RJU0FCTEUsCi0JCQkJCQltb2R1bGUtPmlkLCBtb2R1bGUpOwotCQltdXRleF9sb2NrKCZtb2R1bGUtPmxvY2spOwotCQltb2R1bGUtPnN0YXRlID0gQURTUF9TVEFURV9ESVNBQkxFRDsKLQkJaWYgKC0tbW9kdWxlLT5vcGVuX2NvdW50ID09IDAgJiYgbW9kdWxlLT5jbGspCi0JCQljbGtfZGlzYWJsZV91bnByZXBhcmUobW9kdWxlLT5jbGspOwotCQltdXRleF91bmxvY2soJm1vZHVsZS0+bG9jayk7Ci0JCW11dGV4X2xvY2soJmFkc3Bfb3Blbl9sb2NrKTsKLQkJaWYgKC0tYWRzcF9vcGVuX2NvdW50ID09IDApIHsKLQkJCWRpc2FibGVfaXJxKGFkc3BfaW5mby5pbnRfYWRzcCk7Ci0JCQlNTV9JTkZPKCJkaXNhYmxlIGludGVycnVwdFxuIik7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZhZHNwX29wZW5fbG9jayk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9hZHNwX2Rpc2FibGUpOwotCi1zdGF0aWMgaW50IG1zbV9hZHNwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JdW5zaWduZWQgY291bnQ7Ci0JaW50IHJjLCBpOwotCi0JYWRzcF9pbmZvLmludF9hZHNwID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAoYWRzcF9pbmZvLmludF9hZHNwIDwgMCkgewotCQlNTV9FUlIoIm5vIGlycSByZXNvdXJjZT9cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlhZHNwX2luZm8uaW5pdF9pbmZvX3B0ciA9IGt6YWxsb2MoCi0JCShzaXplb2Yoc3RydWN0IGFkc3BfcnRvc19tcF9tdG9hX2luaXRfaW5mb190eXBlKSksIEdGUF9LRVJORUwpOwotCWlmICghYWRzcF9pbmZvLmluaXRfaW5mb19wdHIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYWRzcF9pbmZvLnJhd19ldmVudCA9IGt6YWxsb2MoCi0JCShzaXplb2Yoc3RydWN0IGFkc3BfcnRvc19tcF9tdG9hX3NfdHlwZSkpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFkc3BfaW5mby5yYXdfZXZlbnQpIHsKLQkJa2ZyZWUoYWRzcF9pbmZvLmluaXRfaW5mb19wdHIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyYyA9IGFkc3BfaW5pdF9pbmZvKCZhZHNwX2luZm8pOwotCWlmIChyYykgewotCQlrZnJlZShhZHNwX2luZm8uaW5pdF9pbmZvX3B0cik7Ci0JCWtmcmVlKGFkc3BfaW5mby5yYXdfZXZlbnQpOwotCQlyZXR1cm4gcmM7Ci0JfQotCWFkc3BfaW5mby5zZW5kX2lycSArPSAodWludDMyX3QpIE1TTV9BRDVfQkFTRTsKLQlhZHNwX2luZm8ucmVhZF9jdHJsICs9ICh1aW50MzJfdCkgTVNNX0FENV9CQVNFOwotCWFkc3BfaW5mby53cml0ZV9jdHJsICs9ICh1aW50MzJfdCkgTVNNX0FENV9CQVNFOwotCWNvdW50ID0gYWRzcF9pbmZvLm1vZHVsZV9jb3VudDsKLQotCWFkc3BfbW9kdWxlcyA9IGt6YWxsb2MoCi0JCShzaXplb2Yoc3RydWN0IG1zbV9hZHNwX21vZHVsZSkgKyBzaXplb2Yodm9pZCAqKSkgKgotCQljb3VudCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhZHNwX21vZHVsZXMpIHsKLQkJa2ZyZWUoYWRzcF9pbmZvLmluaXRfaW5mb19wdHIpOwotCQlrZnJlZShhZHNwX2luZm8ucmF3X2V2ZW50KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JYWRzcF9pbmZvLmlkX3RvX21vZHVsZSA9ICh2b2lkICopIChhZHNwX21vZHVsZXMgKyBjb3VudCk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmYWRzcF9jbWRfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkc3Bfd3JpdGVfbG9jayk7Ci0KLQlyYyA9IHJlcXVlc3RfaXJxKGFkc3BfaW5mby5pbnRfYWRzcCwgYWRzcF9pcnFfaGFuZGxlciwKLQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcsICJhZHNwIiwgMCk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBmYWlsX3JlcXVlc3RfaXJxOwotCWRpc2FibGVfaXJxKGFkc3BfaW5mby5pbnRfYWRzcCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2QgPSBhZHNwX21vZHVsZXMgKyBpOwotCQltdXRleF9pbml0KCZtb2QtPmxvY2spOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtb2QtPnN0YXRlX3dhaXQpOwotCQltb2QtPmluZm8gPSAmYWRzcF9pbmZvOwotCQltb2QtPm5hbWUgPSBhZHNwX2luZm8ubW9kdWxlW2ldLm5hbWU7Ci0JCW1vZC0+aWQgPSBhZHNwX2luZm8ubW9kdWxlW2ldLmlkOwotCQlpZiAoYWRzcF9pbmZvLm1vZHVsZVtpXS5jbGtfbmFtZSkKLQkJCW1vZC0+Y2xrID0gY2xrX2dldChOVUxMLCBhZHNwX2luZm8ubW9kdWxlW2ldLmNsa19uYW1lKTsKLQkJZWxzZQotCQkJbW9kLT5jbGsgPSBOVUxMOwotCQlpZiAobW9kLT5jbGsgJiYgYWRzcF9pbmZvLm1vZHVsZVtpXS5jbGtfcmF0ZSkKLQkJCWNsa19zZXRfcmF0ZShtb2QtPmNsaywgYWRzcF9pbmZvLm1vZHVsZVtpXS5jbGtfcmF0ZSk7Ci0JCW1vZC0+dmVyaWZ5X2NtZCA9IGFkc3BfaW5mby5tb2R1bGVbaV0udmVyaWZ5X2NtZDsKLQkJbW9kLT5wYXRjaF9ldmVudCA9IGFkc3BfaW5mby5tb2R1bGVbaV0ucGF0Y2hfZXZlbnQ7Ci0JCUlOSVRfSExJU1RfSEVBRCgmbW9kLT5wbWVtX3JlZ2lvbnMpOwotCQltb2QtPnBkZXYubmFtZSA9IGFkc3BfaW5mby5tb2R1bGVbaV0ucGRldl9uYW1lOwotCQltb2QtPnBkZXYuaWQgPSAtMTsKLQkJYWRzcF9pbmZvLmlkX3RvX21vZHVsZVtpXSA9IG1vZDsKLQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZtb2QtPnBkZXYpOwotCX0KLQotCW1zbV9hZHNwX3B1Ymxpc2hfY2RldnMoYWRzcF9tb2R1bGVzLCBjb3VudCk7Ci0KLQlyYyA9IGRhbGRldmljZV9hdHRhY2goREFMUlBDX0FEU1BTVkNfREVWSUNFSUQsIERBTFJQQ19BRFNQU1ZDX1BPUlQsCi0JCQkJCURBTFJQQ19BRFNQU1ZDX0RFU1QsICZhZHNwX2luZm8uaGFuZGxlKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJhZHNwIGF0dGFjaCBmYWlsZWQgOiAlZFxuIiwgcmMpOwotCQlnb3RvIGZhaWxfZGFsX2F0dGFjaDsKLQl9Ci0KLQlhZHNwX2luZm8uY2JfaGFuZGxlID0gZGFscnBjX2FsbG9jX2NiKGFkc3BfaW5mby5oYW5kbGUsCi0JCQkJCQlhZHNwX3J0b3NfbXRvYV9jYiwgTlVMTCk7Ci0JaWYgKGFkc3BfaW5mby5jYl9oYW5kbGUgPT0gTlVMTCkgewotCQlNTV9FUlIoIkNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOwotCQlnb3RvIGZhaWxfYWxsb2NhdGVfY2I7Ci0JfQotCi0JLyogR2V0IElOSVRfSU5GTyAqLwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFkc3BfaW5mby5pbml0X2luZm9fd2FpdCk7Ci0JbXNtX2dldF9pbml0X2luZm8oKTsKLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhZHNwX2luZm8uaW5pdF9pbmZvX3dhaXQsCi0JCWFkc3BfaW5mby5pbml0X2luZm9fc3RhdGUgPT0gQURTUF9TVEFURV9JTklUX0lORk8sCi0JCTEwICogSFopOwotCWlmICghcmMpIHsKLQkJTU1fRVJSKCJJTklUX0lORk8gZmFpbGVkXG4iKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCX0gZWxzZQotCQlyZXR1cm4gMDsKLQotZmFpbF9hbGxvY2F0ZV9jYjoKLQlkYWxkZXZpY2VfZGV0YWNoKGFkc3BfaW5mby5oYW5kbGUpOwotCWFkc3BfaW5mby5oYW5kbGUgPSBOVUxMOwotZmFpbF9kYWxfYXR0YWNoOgotCWVuYWJsZV9pcnEoYWRzcF9pbmZvLmludF9hZHNwKTsKLQlmcmVlX2lycShhZHNwX2luZm8uaW50X2Fkc3AsIDApOwotZmFpbF9yZXF1ZXN0X2lycToKLQlrZnJlZShhZHNwX21vZHVsZXMpOwotCWtmcmVlKGFkc3BfaW5mby5pbml0X2luZm9fcHRyKTsKLQlrZnJlZShhZHNwX2luZm8ucmF3X2V2ZW50KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBpbnQgZ2V0X3BhcmFtZXRlcnMoY2hhciAqYnVmLCBsb25nIGludCAqcGFyYW0xLCBpbnQgbnVtX29mX3BhcikKLXsKLQljaGFyICp0b2tlbjsKLQlpbnQgYmFzZSwgY250OwotCi0JdG9rZW4gPSBzdHJzZXAoJmJ1ZiwgIiAiKTsKLQotCWZvciAoY250ID0gMDsgY250IDwgbnVtX29mX3BhcjsgY250KyspIHsKLQkJaWYgKHRva2VuICE9IE5VTEwpIHsKLQkJCWlmICgodG9rZW5bMV0gPT0gJ3gnKSB8fCAodG9rZW5bMV0gPT0gJ1gnKSkKLQkJCQliYXNlID0gMTY7Ci0JCQllbHNlCi0JCQkJYmFzZSA9IDEwOwotCi0JCQlpZiAoc3RyaWN0X3N0cnRvdWwodG9rZW4sIGJhc2UsICZwYXJhbTFbY250XSkgIT0gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJdG9rZW4gPSBzdHJzZXAoJmJ1ZiwgIiAiKTsKLQkJCX0KLQkJZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZHNwX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlwcl9kZWJ1ZygiYWRzcCBkZWJ1Z2ZzIG9wZW5lZFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgc3NpemVfdCBhZHNwX2RlYnVnX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKLXsKLQljaGFyICphY2Nlc3Nfc3RyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgbGJ1ZlszMl07Ci0JaW50IHJjOwotCWxvbmcgaW50IHBhcmFtWzVdOwotCi0JaWYgKGNudCA+IHNpemVvZihsYnVmKSAtIDEpCi0JCXJldHVybiAtRUlOVkFMOwotCXJjID0gY29weV9mcm9tX3VzZXIobGJ1ZiwgYnVmLCBjbnQpOwotCWlmIChyYykgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY29weSBkYXRhIGZyb20gdXNlciBzcGFjZVxuIik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQlsYnVmW2NudF0gPSAnXDAnOwotCi0JaWYgKCFzdHJuY21wKGFjY2Vzc19zdHIsICJ3cml0ZV9sb2ciLCA5KSkgewotCQlpZiAoZ2V0X3BhcmFtZXRlcnMobGJ1ZiwgcGFyYW0sIDEpID09IDApIHsKLQkJCXN3aXRjaCAocGFyYW1bMF0pIHsKLQkJCWNhc2UgMToKLQkJCQlpZiAod2R1bXAgPD0gMCkKLQkJCQkJd2R1bXAgPSAxOwotCQkJCXByX2RlYnVnKCJ3cml0ZSBjbWQgdG8gRFNQKEEtPkQpIGR1bXAgXAotCQkJCQkgc3RhcnRlZDolZFxuIiwgd2R1bXApOwotCQkJCWJyZWFrOwotCQkJY2FzZSAwOgotCQkJCWlmICh3ZHVtcCA+IDApCi0JCQkJCXdkdW1wID0gMDsKLQkJCQlwcl9kZWJ1ZygiU3RvcCB3cml0ZSBjbWQgdG8gXAotCQkJCQkgRFNQKEEtPkQpOiVkXG4iLCB3ZHVtcCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlCi0JCQlyYyA9IC1FSU5WQUw7Ci0JfSBlbHNlIGlmICghc3RybmNtcChhY2Nlc3Nfc3RyLCAicmVhZF9sb2ciLCA4KSkgewotCQlpZiAoZ2V0X3BhcmFtZXRlcnMobGJ1ZiwgcGFyYW0sIDEpID09IDApIHsKLQkJCXN3aXRjaCAocGFyYW1bMF0pIHsKLQkJCWNhc2UgMToKLQkJCQlpZiAocmR1bXAgPD0gMCkKLQkJCQkJcmR1bXAgPSAxOwotCQkJCXByX2RlYnVnKCJ3cml0ZSBjbWQgZnJvbSBEU1AoRC0+QSkgZHVtcCBcCi0JCQkJCXN0YXJ0ZWQ6JWRcbiIsIHdkdW1wKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMDoKLQkJCQlpZiAocmR1bXAgPiAwKQotCQkJCQlyZHVtcCA9IDA7Ci0JCQkJcHJfZGVidWcoIlN0b3Agd3JpdGUgY21kIGZyb20gXAotCQkJCQlEU1AoRC0+QSk6JWRcbiIsIHdkdW1wKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UKLQkJCXJjID0gLUVJTlZBTDsKLQl9IGVsc2UgewotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCWlmIChyYyA9PSAwKQotCQlyYyA9IGNudDsKLQllbHNlIHsKLQkJcHJfZXJyKCIlczogcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJcHJfaW5mbygiXG5Xcm9uZyBjb21tYW5kOiBVc2UgPT5cbiIpOwotCQlwcl9pbmZvKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQkJcHJfaW5mbygiVG8gU3RhcnQgQS0+RDo6IGVjaG8gXCIxXCI+L3N5cy9rZXJuZWwvZGVidWcvIFwKLQkJCWFkc3BfY21kL3dyaXRlX2xvZ1xuIik7Ci0JCXByX2luZm8oIlRvIFN0YXJ0IEQtPkE6OiBlY2hvIFwiMVwiPi9zeXMva2VybmVsL2RlYnVnLyBcCi0JCQlhZHNwX2NtZC9yZWFkX2xvZ1xuIik7Ci0JCXByX2luZm8oIlRvIFN0b3AgIEEtPkQ6OiBlY2hvIFwiMFwiPi9zeXMva2VybmVsL2RlYnVnLyBcCi0JCQlhZHNwX2NtZC93cml0ZV9sb2dcbiIpOwotCQlwcl9pbmZvKCJUbyBTdG9wICBELT5BOjogZWNobyBcIjBcIj4vc3lzL2tlcm5lbC9kZWJ1Zy8gXAotCQkJYWRzcF9jbWQvcmVhZF9sb2dcbiIpOwotCQlwcl9pbmZvKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCX0KLQotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fYWRzcF9kcml2ZXIgPSB7Ci0JLnByb2JlID0gbXNtX2Fkc3BfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBjaGFyIG1zbV9hZHNwX2RyaXZlcl9uYW1lW10gPSAibXNtX2Fkc3AiOwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZHNwX2RlYnVnX2ZvcHMgPSB7Ci0JLndyaXRlID0gYWRzcF9kZWJ1Z193cml0ZSwKLQkub3BlbiA9IGFkc3BfZGVidWdfb3BlbiwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBfX2luaXQgYWRzcF9pbml0KHZvaWQpCi17Ci0JaW50IHJjOwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JZGVudHJ5X2Fkc3AgICAgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImFkc3BfY21kIiwgMCk7Ci0JaWYgKCFJU19FUlIoZGVudHJ5X2Fkc3ApKSB7Ci0JCWRlbnRyeV93ZGF0YSAgID0gZGVidWdmc19jcmVhdGVfZmlsZSgid3JpdGVfbG9nIiwgXAotCQkgU19JRlJFRyB8IFNfSVJVR08sIGRlbnRyeV9hZHNwLAotCQkgKHZvaWQgKikgIndyaXRlX2xvZyIgLCAmYWRzcF9kZWJ1Z19mb3BzKTsKLQkJZGVudHJ5X3JkYXRhICAgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZWFkX2xvZyIsIFwKLQkJIFNfSUZSRUcgfCBTX0lSVUdPLCBkZW50cnlfYWRzcCwKLQkJICh2b2lkICopICJyZWFkX2xvZyIsICZhZHNwX2RlYnVnX2ZvcHMpOwotCX0KLSNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KLQotCW1zbV9hZHNwX2RyaXZlci5kcml2ZXIubmFtZSA9IG1zbV9hZHNwX2RyaXZlcl9uYW1lOwotCXJjID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fYWRzcF9kcml2ZXIpOwotCU1NX0lORk8oIiVzIC0tICVkXG4iLCBtc21fYWRzcF9kcml2ZXJfbmFtZSwgcmMpOwotCXJldHVybiByYzsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGFkc3BfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2Fkc3AuaCBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYWRzcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWE1NzRiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYWRzcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBdXRob3I6IElsaXlhbiBNYWxjaGV2IDxpYm1AYW5kcm9pZC5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfQVJDSF9BUk1fTUFDSF9NU01fQURTUF9ICi0jZGVmaW5lIF9BUkNIX0FSTV9NQUNIX01TTV9BRFNQX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bWFjaC9kYWwuaD4KLQotaW50IGFkc3BfcG1lbV9maXh1cChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsIHZvaWQgKiphZGRyLAotCQkgICAgdW5zaWduZWQgbG9uZyBsZW4pOwotaW50IGFkc3BfcG1lbV9maXh1cF9rdmFkZHIoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLCB2b2lkICoqYWRkciwKLQkJCSAgIHVuc2lnbmVkIGxvbmcgKmt2YWRkciwgdW5zaWduZWQgbG9uZyBsZW4pOwotaW50IGFkc3BfcG1lbV9wYWRkcl9maXh1cChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsIHZvaWQgKiphZGRyKTsKLQotaW50IGFkc3BfdmZlX3ZlcmlmeV9jbWQoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotCQkJdW5zaWduZWQgaW50IHF1ZXVlX2lkLCB2b2lkICpjbWRfZGF0YSwKLQkJCXNpemVfdCBjbWRfc2l6ZSk7Ci1pbnQgYWRzcF9qcGVnX3ZlcmlmeV9jbWQoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotCQkJIHVuc2lnbmVkIGludCBxdWV1ZV9pZCwgdm9pZCAqY21kX2RhdGEsCi0JCQkgc2l6ZV90IGNtZF9zaXplKTsKLWludCBhZHNwX2xwbV92ZXJpZnlfY21kKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwKLQkJCXVuc2lnbmVkIGludCBxdWV1ZV9pZCwgdm9pZCAqY21kX2RhdGEsCi0JCQlzaXplX3QgY21kX3NpemUpOwotaW50IGFkc3BfdmlkZW9fdmVyaWZ5X2NtZChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCQkgIHVuc2lnbmVkIGludCBxdWV1ZV9pZCwgdm9pZCAqY21kX2RhdGEsCi0JCQkgIHNpemVfdCBjbWRfc2l6ZSk7Ci1pbnQgYWRzcF92aWRlb2VuY192ZXJpZnlfY21kKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwKLQkJCSAgdW5zaWduZWQgaW50IHF1ZXVlX2lkLCB2b2lkICpjbWRfZGF0YSwKLQkJCSAgc2l6ZV90IGNtZF9zaXplKTsKLQotCi1zdHJ1Y3QgYWRzcF9ldmVudDsKLQotaW50IGFkc3BfdmZlX3BhdGNoX2V2ZW50KHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwKLQkJCXN0cnVjdCBhZHNwX2V2ZW50ICpldmVudCk7Ci0KLWludCBhZHNwX2pwZWdfcGF0Y2hfZXZlbnQoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLAotCQkJc3RydWN0IGFkc3BfZXZlbnQgKmV2ZW50KTsKLQotCi1zdHJ1Y3QgYWRzcF9tb2R1bGVfaW5mbyB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQljb25zdCBjaGFyICpwZGV2X25hbWU7Ci0JdWludDMyX3QgaWQ7Ci0JY29uc3QgY2hhciAqY2xrX25hbWU7Ci0JdW5zaWduZWQgbG9uZyBjbGtfcmF0ZTsKLQlpbnQgKCp2ZXJpZnlfY21kKSAoc3RydWN0IG1zbV9hZHNwX21vZHVsZSosIHVuc2lnbmVkIGludCwgdm9pZCAqLAotCQkJICAgc2l6ZV90KTsKLQlpbnQgKCpwYXRjaF9ldmVudCkgKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUqLCBzdHJ1Y3QgYWRzcF9ldmVudCAqKTsKLX07Ci0KLSNkZWZpbmUgQURTUF9FVkVOVF9NQVhfU0laRSA0OTYKLSNkZWZpbmUgRVZFTlRfTEVOICAgICAgIDEyCi0jZGVmaW5lIEVWRU5UX01TR19JRCAoKHVpbnQxNl90KX4wKQotCi1zdHJ1Y3QgYWRzcF9ldmVudCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXVpbnQzMl90IHNpemU7IC8qIGFsd2F5cyBpbiBieXRlcyAqLwotCXVpbnQxNl90IG1zZ19pZDsKLQl1aW50MTZfdCB0eXBlOyAvKiAwIGZvciBtc2dzIChmcm9tIGFEU1ApLCAtMSBmb3IgZXZlbnRzIChmcm9tIEFSTTkpICovCi0JaW50IGlzMTY7IC8qIGFsd2F5cyAwIChtc2cgaXMgMzItYml0KSB3aGVuIHRoZSBldmVudCB0eXBlIGlzIDEoQVJNOSkgKi8KLQl1bmlvbiB7Ci0JCXVpbnQxNl90IG1zZzE2W0FEU1BfRVZFTlRfTUFYX1NJWkUgLyAyXTsKLQkJdWludDMyX3QgbXNnMzJbQURTUF9FVkVOVF9NQVhfU0laRSAvIDRdOwotCX0gZGF0YTsKLX07Ci0KLSNkZWZpbmUgREFMUlBDX0FEU1BTVkNfREVWSUNFSUQgMHgwMjAwMDA5QQotI2RlZmluZSBEQUxSUENfQURTUFNWQ19ERVNUIFNNRF9BUFBTX01PREVNCi0jZGVmaW5lIERBTFJQQ19BRFNQU1ZDX1BPUlQgIkRBTDAwIgotCi1lbnVtIHsKLQlEQUxERVZJQ0VfQURTUF9DTURfSURYID0gREFMREVWSUNFX0ZJUlNUX0RFVklDRV9BUElfSURYLAotfTsKLQotc3RydWN0IGFkc3BfcnRvc19hdG9tX2NtZCB7Ci0JdWludDMyX3QgY21kOwotCXVpbnQzMl90IHByb2NfaWQ7Ci0JdWludDMyX3QgbW9kdWxlOwotCXZvaWQgKmNiX2hhbmRsZTsKLX07Ci0KLWVudW0gcnBjX2Fkc3BfcnRvc19wcm9jX3R5cGUgewotCVJQQ19BRFNQX1JUT1NfUFJPQ19OT05FID0gMCwKLQlSUENfQURTUF9SVE9TX1BST0NfTU9ERU0gPSAxLAotCVJQQ19BRFNQX1JUT1NfUFJPQ19BUFBTID0gMiwKLX07Ci0KLWVudW0gewotCVJQQ19BRFNQX1JUT1NfQ01EX1JFR0lTVEVSX0FQUCwKLQlSUENfQURTUF9SVE9TX0NNRF9FTkFCTEUsCi0JUlBDX0FEU1BfUlRPU19DTURfRElTQUJMRSwKLQlSUENfQURTUF9SVE9TX0NNRF9LRVJORUxfQ09NTUFORCwKLQlSUENfQURTUF9SVE9TX0NNRF8xNl9DT01NQU5ELAotCVJQQ19BRFNQX1JUT1NfQ01EXzMyX0NPTU1BTkQsCi0JUlBDX0FEU1BfUlRPU19DTURfRElTQUJMRV9FVkVOVF9SU1AsCi0JUlBDX0FEU1BfUlRPU19DTURfUkVNT1RFX0VWRU5ULAotCVJQQ19BRFNQX1JUT1NfQ01EX1NFVF9TVEFURSwKLQlSUENfQURTUF9SVE9TX0NNRF9SRU1PVEVfSU5JVF9JTkZPX0VWRU5ULAotCVJQQ19BRFNQX1JUT1NfQ01EX0dFVF9JTklUX0lORk8sCi19OwotCi1lbnVtIHJwY19hZHNwX3J0b3NfbW9kX3N0YXR1c190eXBlIHsKLQlSUENfQURTUF9SVE9TX01PRF9SRUFEWSwKLQlSUENfQURTUF9SVE9TX01PRF9ESVNBQkxFLAotCVJQQ19BRFNQX1JUT1NfU0VSVklDRV9SRVNFVCwKLQlSUENfQURTUF9SVE9TX0NNRF9GQUlMLAotCVJQQ19BRFNQX1JUT1NfQ01EX1NVQ0NFU1MsCi0JUlBDX0FEU1BfUlRPU19JTklUX0lORk8sCi0JUlBDX0FEU1BfUlRPU19ESVNBQkxFX0ZBSUwsCi19OwotCi1lbnVtIHFkc3BfaW1hZ2VfdHlwZSB7Ci0JUURTUF9JTUFHRV9DT01CTywKLQlRRFNQX0lNQUdFX0dBVURJTywKLQlRRFNQX0lNQUdFX1FUVl9MUCwKLQlRRFNQX0lNQUdFX01BWCwKLQkvKiBETyBOT1QgVVNFOiBGb3JjZSB0aGlzIGVudW0gdG8gYmUgYSAzMmJpdCB0eXBlIHRvIGltcHJvdmUgc3BlZWQgKi8KLQlRRFNQX0lNQUdFXzMyQklUX0RVTU1ZID0gMHgxMDAwMAotfTsKLQotc3RydWN0IGFkc3BfcnRvc19tcF9tdG9hX2hlYWRlcl90eXBlIHsKLQllbnVtIHJwY19hZHNwX3J0b3NfbW9kX3N0YXR1c190eXBlICBldmVudDsKLQl1aW50MzJfdAkJICAgICAgICAgICAgdmVyc2lvbjsKLQllbnVtIHJwY19hZHNwX3J0b3NfcHJvY190eXBlICAgICAgICBwcm9jX2lkOwotfTsKLQotLyogQURTUCBSVE9TIE1QIENvbW11bmljYXRpb25zIC0gTW9kZW0gdG8gQVBQJ3MgIEV2ZW50IEluZm8qLwotc3RydWN0IGFkc3BfcnRvc19tcF9tdG9hX3R5cGUgewotCXVpbnQzMl90CW1vZHVsZTsKLQl1aW50MzJfdAlpbWFnZTsKLQl1aW50MzJfdAlhcHBzX29rdHM7Ci19OwotCi0vKiBBRFNQIFJUT1MgTVAgQ29tbXVuaWNhdGlvbnMgLSBNb2RlbSB0byBBUFAncyBJbml0IEluZm8gICovCi0jZGVmaW5lIElNR19NQVggICAgICAgICAyCi0jZGVmaW5lIEVOVFJJRVNfTUFYICAgICAzNgotI2RlZmluZSBNT0RVTEVTX01BWCAgICAgNjQKLSNkZWZpbmUgUVVFVUVTX01BWAk2NAotCi1zdHJ1Y3QgcXVldWVfdG9fb2Zmc2V0X3R5cGUgewotCXVpbnQzMl90CXF1ZXVlOwotCXVpbnQzMl90CW9mZnNldDsKLX07Ci0KLXN0cnVjdCBtb2RfdG9fcXVldWVfb2Zmc2V0cyB7Ci0JdWludDMyX3QgICAgICAgIG1vZHVsZTsKLQl1aW50MzJfdCAgICAgICAgcV90eXBlOwotCXVpbnQzMl90ICAgICAgICBxX21heF9sZW47Ci19OwotCi1zdHJ1Y3QgYWRzcF9ydG9zX21wX210b2FfaW5pdF9pbmZvX3R5cGUgewotCXVpbnQzMl90CWltYWdlX2NvdW50OwotCXVpbnQzMl90CW51bV9xdWV1ZV9vZmZzZXRzOwotCXN0cnVjdCBxdWV1ZV90b19vZmZzZXRfdHlwZQlxdWV1ZV9vZmZzZXRzX3RibFtJTUdfTUFYXVtFTlRSSUVTX01BWF07Ci0JdWludDMyX3QJbnVtX3Rhc2tfbW9kdWxlX2VudHJpZXM7Ci0JdWludDMyX3QJdGFza190b19tb2R1bGVfdGJsW0lNR19NQVhdW0VOVFJJRVNfTUFYXTsKLQotCXVpbnQzMl90CW1vZHVsZV90YWJsZV9zaXplOwotCXVpbnQzMl90CW1vZHVsZV9lbnRyaWVzW01PRFVMRVNfTUFYXTsKLQl1aW50MzJfdAltb2RfdG9fcV9lbnRyaWVzOwotCXN0cnVjdCBtb2RfdG9fcXVldWVfb2Zmc2V0cwltb2RfdG9fcV90YmxbRU5UUklFU19NQVhdOwotCS8qCi0JICogcXVldWVfb2Zmc2V0c1tdIGlzIHRvIHN0b3JlIG9ubHkgcXVldWVfb2Zmc2V0cwotCSAqLwotCXVpbnQzMl90CXF1ZXVlX29mZnNldHNbSU1HX01BWF1bUVVFVUVTX01BWF07Ci19OwotCi1zdHJ1Y3QgYWRzcF9ydG9zX21wX210b2Ffc190eXBlIHsKLQlzdHJ1Y3QgYWRzcF9ydG9zX21wX210b2FfaGVhZGVyX3R5cGUgbXBfbXRvYV9oZWFkZXI7Ci0KLQl1bmlvbiB7Ci0JCXN0cnVjdCBhZHNwX3J0b3NfbXBfbXRvYV9pbml0X2luZm9fdHlwZSBtcF9tdG9hX2luaXRfcGFja2V0OwotCQlzdHJ1Y3QgYWRzcF9ydG9zX21wX210b2FfdHlwZSBtcF9tdG9hX3BhY2tldDsKLQl9IGFkc3BfcnRvc19tcF9tdG9hX2RhdGE7Ci19OwotCi1zdHJ1Y3QgYWRzcF9pbmZvIHsKLQl1aW50MzJfdCBzZW5kX2lycTsKLQl1aW50MzJfdCByZWFkX2N0cmw7Ci0JdWludDMyX3Qgd3JpdGVfY3RybDsKLQotCXVpbnQzMl90IG1heF9tc2cxNl9zaXplOwotCXVpbnQzMl90IG1heF9tc2czMl9zaXplOwotCi0JdWludDMyX3QgbWF4X3Rhc2tfaWQ7Ci0JdWludDMyX3QgbWF4X21vZHVsZV9pZDsKLQl1aW50MzJfdCBtYXhfcXVldWVfaWQ7Ci0JdWludDMyX3QgbWF4X2ltYWdlX2lkOwotCi0JLyogZm9yIGVhY2ggaW1hZ2UgaWQsIGEgbWFwIG9mIHF1ZXVlIGlkIHRvIG9mZnNldCAqLwotCXVpbnQzMl90ICoqcXVldWVfb2Zmc2V0OwotCi0JLyogZm9yIGVhY2ggaW1hZ2UgaWQsIGEgbWFwIG9mIHRhc2sgaWQgdG8gbW9kdWxlIGlkICovCi0JdWludDMyX3QgKip0YXNrX3RvX21vZHVsZTsKLQotCS8qIGZvciBlYWNoIG1vZHVsZSBpZCwgbWFwIG9mIG1vZHVsZSBpZCB0byBtb2R1bGUgKi8KLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICoqaWRfdG9fbW9kdWxlOwotCi0JdWludDMyX3QgbW9kdWxlX2NvdW50OwotCXN0cnVjdCBhZHNwX21vZHVsZV9pbmZvICptb2R1bGU7Ci0KLQkvKiBzdGF0cyAqLwotCXVpbnQzMl90IGV2ZW50c19yZWNlaXZlZDsKLQl1aW50MzJfdCBldmVudF9iYWNrbG9nX21heDsKLQotCS8qIHJwY19jbGllbnQgZm9yIGluaXRfaW5mbyAqLwotCXN0cnVjdCBhZHNwX3J0b3NfbXBfbXRvYV9pbml0X2luZm9fdHlwZQkqaW5pdF9pbmZvX3B0cjsKLQlzdHJ1Y3QgYWRzcF9ydG9zX21wX210b2Ffc190eXBlICpyYXdfZXZlbnQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJaW5pdF9pbmZvX3dhaXQ7Ci0JdW5zaWduZWQgCQlpbml0X2luZm9fc3RhdGU7Ci0KLQl2b2lkICpoYW5kbGU7Ci0Jdm9pZCAqY2JfaGFuZGxlOwotCi0JLyogSW50ZXJydXB0IHZhbHVlICovCi0JaW50IGludF9hZHNwOwotfTsKLQotI2RlZmluZSBBRFNQX1NUQVRFX0RJU0FCTEVEICAgMAotI2RlZmluZSBBRFNQX1NUQVRFX0VOQUJMSU5HICAgMQotI2RlZmluZSBBRFNQX1NUQVRFX0VOQUJMRUQgICAgMgotI2RlZmluZSBBRFNQX1NUQVRFX0RJU0FCTElORyAgMwotI2RlZmluZSBBRFNQX1NUQVRFX0lOSVRfSU5GTyAgNAotCi1zdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlIHsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQljb25zdCBjaGFyICpuYW1lOwotCXVuc2lnbmVkIGlkOwotCXN0cnVjdCBhZHNwX2luZm8gKmluZm87Ci0KLQlzdHJ1Y3QgbXNtX2Fkc3Bfb3BzICpvcHM7Ci0Jdm9pZCAqZHJpdmVyX2RhdGE7Ci0KLQkvKiBzdGF0aXN0aWNzICovCi0JdW5zaWduZWQgbnVtX2NvbW1hbmRzOwotCXVuc2lnbmVkIG51bV9ldmVudHM7Ci0KLQl3YWl0X3F1ZXVlX2hlYWRfdCBzdGF0ZV93YWl0OwotCXVuc2lnbmVkIHN0YXRlOwotCi0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSBwZGV2OwotCXN0cnVjdCBjbGsgKmNsazsKLQlpbnQgb3Blbl9jb3VudDsKLQotCXN0cnVjdCBtdXRleCBwbWVtX3JlZ2lvbnNfbG9jazsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCBwbWVtX3JlZ2lvbnM7Ci0JaW50ICgqdmVyaWZ5X2NtZCkgKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUqLCB1bnNpZ25lZCBpbnQsIHZvaWQgKiwKLQkJCSAgIHNpemVfdCk7Ci0JaW50ICgqcGF0Y2hfZXZlbnQpIChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlKiwgc3RydWN0IGFkc3BfZXZlbnQgKik7Ci19OwotCi1leHRlcm4gdm9pZCBtc21fYWRzcF9wdWJsaXNoX2NkZXZzKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKiwgdW5zaWduZWQpOwotZXh0ZXJuIGludCBhZHNwX2luaXRfaW5mbyhzdHJ1Y3QgYWRzcF9pbmZvICppbmZvKTsKLQotLyogVmFsdWUgdG8gaW5kaWNhdGUgdGhhdCBhIHF1ZXVlIGlzIG5vdCBkZWZpbmVkIGZvciBhIHBhcnRpY3VsYXIgaW1hZ2UgKi8KLSNkZWZpbmUgUURTUF9SVE9TX05PX1FVRVVFICAweGZmZmZmZmZlCi0KLS8qCi0gKiBDb25zdGFudHMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBBRFNQIFJUT1MKLSAqLwotI2RlZmluZSBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX01VVEVYX00gICAgICAgICAgICAweDgwMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX01VVEVYX05BVkFJTF9WICAgICAweDgwMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX01VVEVYX0FWQUlMX1YgICAgICAweDAwMDAwMDAwVQotCi0jZGVmaW5lIEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfQ01EX00gICAgICAgICAgICAgIDB4NzAwMDAwMDBVCi0jZGVmaW5lIEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfQ01EX1dSSVRFX1JFUV9WICAgIDB4MDAwMDAwMDBVCi0jZGVmaW5lIEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfQ01EX1dSSVRFX0RPTkVfViAgIDB4MTAwMDAwMDBVCi0jZGVmaW5lIEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfQ01EX05PX0NNRF9WICAgICAgIDB4NzAwMDAwMDBVCi0KLSNkZWZpbmUgQURTUF9SVE9TX1dSSVRFX0NUUkxfV09SRF9TVEFUVVNfTSAgICAgICAgICAgMHgwRTAwMDAwMFUKLSNkZWZpbmUgQURTUF9SVE9TX1dSSVRFX0NUUkxfV09SRF9OT19FUlJfViAgICAgICAgICAgMHgwMDAwMDAwMFUKLSNkZWZpbmUgQURTUF9SVE9TX1dSSVRFX0NUUkxfV09SRF9OT19GUkVFX0JVRl9WICAgICAgMHgwMjAwMDAwMFUKLQotI2RlZmluZSBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX0tFUk5FTF9GTEdfTSAgICAgICAweDAxMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX0hUT0RfTVNHX1dSSVRFX1YgICAweDAwMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfV1JJVEVfQ1RSTF9XT1JEX0hUT0RfQ01EX1YgICAgICAgICAweDAxMDAwMDAwVQotCi0jZGVmaW5lIEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfRFNQX0FERFJfTSAgICAgICAgIDB4MDBGRkZGRkZVCi0jZGVmaW5lIEFEU1BfUlRPU19XUklURV9DVFJMX1dPUkRfSFRPRF9DTURfSURfTSAgICAgIDB4MDBGRkZGRkZVCi0KLS8qIENvbWJpbmF0aW9uIG9mIE1VVEVYIGFuZCBDTUQgYml0cyB0byBjaGVjayBpZiB0aGUgRFNQIGlzIGJ1c3kgKi8KLSNkZWZpbmUgQURTUF9SVE9TX1dSSVRFX0NUUkxfV09SRF9SRUFEWV9NICAgICAgICAgICAgMHhGMDAwMDAwMFUKLSNkZWZpbmUgQURTUF9SVE9TX1dSSVRFX0NUUkxfV09SRF9SRUFEWV9WICAgICAgICAgICAgMHg3MDAwMDAwMFUKLQotLyogUlRPUyB0byBIb3N0IHByb2Nlc3NvciBjb21tYW5kIG1hc2sgdmFsdWVzICovCi0jZGVmaW5lIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9GTEFHX00gICAgICAgICAgICAgIDB4ODAwMDAwMDBVCi0jZGVmaW5lIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9GTEFHX1VQX1dBSVRfViAgICAgIDB4MDAwMDAwMDBVCi0jZGVmaW5lIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9GTEFHX1VQX0NPTlRfViAgICAgIDB4ODAwMDAwMDBVCi0KLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX0NNRF9NICAgICAgICAgICAgICAgMHg2MDAwMDAwMFUKLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX1JFQURfRE9ORV9WICAgICAgICAgMHgwMDAwMDAwMFUKLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX1JFQURfUkVRX1YgICAgICAgICAgMHgyMDAwMDAwMFUKLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX05PX0NNRF9WICAgICAgICAgICAgMHg2MDAwMDAwMFUKLQotLyogQ29tYmluYXRpb24gb2YgRkxBRyBhbmQgQ09NTUFORCBiaXRzIHRvIGNoZWNrIGlmIE1TRyByZWFkeSAqLwotI2RlZmluZSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfUkVBRFlfTSAgICAgICAgICAgICAweEUwMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfUkVBRFlfViAgICAgICAgICAgICAweEEwMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfQ09OVF9WICAgICAgICAgICAgICAweEMwMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfRE9ORV9WICAgICAgICAgICAgICAweEUwMDAwMDAwVQotCi0jZGVmaW5lIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9TVEFUVVNfTSAgICAgICAgICAgIDB4MTgwMDAwMDBVCi0jZGVmaW5lIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9OT19FUlJfViAgICAgICAgICAgIDB4MDAwMDAwMDBVCi0KLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX0lOX1BST0dfTSAgICAgICAgICAgMHgwNDAwMDAwMFUKLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX05PX1JFQURfSU5fUFJPR19WICAgMHgwMDAwMDAwMFUKLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX1JFQURfSU5fUFJPR19WICAgICAgMHgwNDAwMDAwMFUKLQotI2RlZmluZSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfQ01EX1RZUEVfTSAgICAgICAgICAweDAzMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfQ01EX1RBU0tfVE9fSF9WICAgICAweDAwMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfQ01EX0tSTkxfVE9fSF9WICAgICAweDAxMDAwMDAwVQotI2RlZmluZSBBRFNQX1JUT1NfUkVBRF9DVFJMX1dPUkRfQ01EX0hfVE9fS1JOTF9DRk1fViAweDAyMDAwMDAwVQotCi0jZGVmaW5lIEFEU1BfUlRPU19SRUFEX0NUUkxfV09SRF9EU1BfQUREUl9NICAgICAgICAgIDB4MDBGRkZGRkZVCi0KLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX01TR19JRF9NICAgICAgICAgICAgMHgwMDAwMDBGRlUKLSNkZWZpbmUgQURTUF9SVE9TX1JFQURfQ1RSTF9XT1JEX1RBU0tfSURfTSAgICAgICAgICAgMHgwMDAwRkYwMFUKLQotLyogQmFzZSBhZGRyZXNzIG9mIERTUCBhbmQgRFNQIGhhcmR3YXJlIHJlZ2lzdGVycyAqLwotI2RlZmluZSBRRFNQX1JBTUNfT0ZGU0VUICAweDQwMDAwMAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYWRzcF9kcml2ZXIuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYWRzcF9kcml2ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3NGNhMy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2Fkc3BfZHJpdmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoYykgMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBdXRob3I6IElsaXlhbiBNYWxjaGV2IDxpYm1AYW5kcm9pZC5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgotI2luY2x1ZGUgImFkc3AuaCIKLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi1zdHJ1Y3QgYWRzcF9wbWVtX2luZm8gewotCWludCBmZDsKLQl2b2lkICp2YWRkcjsKLX07Ci0KLXN0cnVjdCBhZHNwX3BtZW1fcmVnaW9uIHsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSBsaXN0OwotCXZvaWQgKnZhZGRyOwotCXVuc2lnbmVkIGxvbmcgcGFkZHI7Ci0JdW5zaWduZWQgbG9uZyBrdmFkZHI7Ci0JdW5zaWduZWQgbG9uZyBsZW47Ci0Jc3RydWN0IGZpbGUgKmZpbGU7Ci19OwotCi1zdHJ1Y3QgYWRzcF9kZXZpY2UgewotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZTsKLQotCXNwaW5sb2NrX3QgZXZlbnRfcXVldWVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF93YWl0OwotCXN0cnVjdCBsaXN0X2hlYWQgZXZlbnRfcXVldWU7Ci0JaW50IGFib3J0OwotCi0JY29uc3QgY2hhciAqbmFtZTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7Ci0Jc3RydWN0IGNkZXYgY2RldjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRzcF9kZXZpY2UgKmlub2RlX3RvX2RldmljZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKLQotI2RlZmluZSBfX0NPTlRBSU5TKHIsIHYsIGwpICh7CQkJCQlcCi0JdHlwZW9mKHIpIF9fciA9IHI7CQkJCQlcCi0JdHlwZW9mKHYpIF9fdiA9IHY7CQkJCQlcCi0JdHlwZW9mKHYpIF9fZSA9IF9fdiArIGw7CQkJCVwKLQlpbnQgcmVzID0gX192ID49IF9fci0+dmFkZHIgJiYgCQkJCVwKLQkJX19lIDw9IF9fci0+dmFkZHIgKyBfX3ItPmxlbjsJCQlcCi0JcmVzOwkJCQkJCQlcCi19KQotCi0jZGVmaW5lIENPTlRBSU5TKHIxLCByMikgKHsJCQkJCVwKLQl0eXBlb2YocjIpIF9fcjIgPSByMjsJCQkJCVwKLQlfX0NPTlRBSU5TKHIxLCBfX3IyLT52YWRkciwgX19yMi0+bGVuKTsJCQlcCi19KQotCi0jZGVmaW5lIElOX1JBTkdFKHIsIHYpICh7CQkJCQlcCi0JdHlwZW9mKHIpIF9fciA9IHI7CQkJCQlcCi0JdHlwZW9mKHYpIF9fdnYgPSB2OwkJCQkJXAotCWludCByZXMgPSAoKF9fdnYgPj0gX19yLT52YWRkcikgJiYJCQlcCi0JCShfX3Z2IDwgKF9fci0+dmFkZHIgKyBfX3ItPmxlbikpKTsJCVwKLQlyZXM7CQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgT1ZFUkxBUFMocjEsIHIyKSAoewkJCQkJXAotCXR5cGVvZihyMSkgX19yMSA9IHIxOwkJCQkJXAotCXR5cGVvZihyMikgX19yMiA9IHIyOwkJCQkJXAotCXR5cGVvZihfX3IyLT52YWRkcikgX192ID0gX19yMi0+dmFkZHI7CQkJXAotCXR5cGVvZihfX3YpIF9fZSA9IF9fdiArIF9fcjItPmxlbiAtIDE7CQkJXAotCWludCByZXMgPSAoSU5fUkFOR0UoX19yMSwgX192KSB8fCBJTl9SQU5HRShfX3IxLCBfX2UpKTsJXAotCXJlczsJCQkJCQkJXAotfSkKLQotc3RhdGljIGludCBhZHNwX3BtZW1fbG9va3VwX3ZhZGRyKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwgdm9pZCAqKmFkZHIsCi0JCSAgICAgdW5zaWduZWQgbG9uZyBsZW4sIHN0cnVjdCBhZHNwX3BtZW1fcmVnaW9uICoqcmVnaW9uKQotewotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwotCXZvaWQgKnZhZGRyID0gKmFkZHI7Ci0Jc3RydWN0IGFkc3BfcG1lbV9yZWdpb24gKnJlZ2lvbl9lbHQ7Ci0KLQlpbnQgbWF0Y2hfY291bnQgPSAwOwotCi0JKnJlZ2lvbiA9IE5VTEw7Ci0KLQkvKiByZXR1cm5zIHBoeXNpY2FsIGFkZHJlc3Mgb3IgemVybyAqLwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZ2lvbl9lbHQsIG5vZGUsICZtb2R1bGUtPnBtZW1fcmVnaW9ucywgbGlzdCkgewotCQlpZiAodmFkZHIgPj0gcmVnaW9uX2VsdC0+dmFkZHIgJiYKLQkJICAgIHZhZGRyIDwgcmVnaW9uX2VsdC0+dmFkZHIgKyByZWdpb25fZWx0LT5sZW4gJiYKLQkJICAgIHZhZGRyICsgbGVuIDw9IHJlZ2lvbl9lbHQtPnZhZGRyICsgcmVnaW9uX2VsdC0+bGVuKSB7Ci0JCQkvKiBvZmZzZXQgc2luY2Ugd2UgY291bGQgcGFzcyB2YWRkciBpbnNpZGUgYSByZWdpc3RlcmQKLQkJCSAqIHBtZW0gYnVmZmVyCi0JCQkgKi8KLQotCQkJbWF0Y2hfY291bnQrKzsKLQkJCWlmICghKnJlZ2lvbikKLQkJCQkqcmVnaW9uID0gcmVnaW9uX2VsdDsKLQkJfQotCX0KLQotCWlmIChtYXRjaF9jb3VudCA+IDEpIHsKLQkJTU1fRVJSKCJtb2R1bGUgJXM6ICIKLQkJCSJtdWx0aXBsZSBoaXRzIGZvciB2YWRkciAlcCwgbGVuICVsZFxuIiwKLQkJCW1vZHVsZS0+bmFtZSwgdmFkZHIsIGxlbik7Ci0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZ2lvbl9lbHQsIG5vZGUsCi0JCQkJJm1vZHVsZS0+cG1lbV9yZWdpb25zLCBsaXN0KSB7Ci0JCQlpZiAodmFkZHIgPj0gcmVnaW9uX2VsdC0+dmFkZHIgJiYKLQkJCSAgICB2YWRkciA8IHJlZ2lvbl9lbHQtPnZhZGRyICsgcmVnaW9uX2VsdC0+bGVuICYmCi0JCQkgICAgdmFkZHIgKyBsZW4gPD0gcmVnaW9uX2VsdC0+dmFkZHIgKyByZWdpb25fZWx0LT5sZW4pCi0JCQkJTU1fRVJSKCIlcCwgJWxkIC0tPiAlcFxuIiwKLQkJCQkJcmVnaW9uX2VsdC0+dmFkZHIsCi0JCQkJCXJlZ2lvbl9lbHQtPmxlbiwKLQkJCQkJKHZvaWQgKilyZWdpb25fZWx0LT5wYWRkcik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKnJlZ2lvbiA/IDAgOiAtMTsKLX0KLQotaW50IGFkc3BfcG1lbV9maXh1cF9rdmFkZHIoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLCB2b2lkICoqYWRkciwKLQkJCSAgIHVuc2lnbmVkIGxvbmcgKmt2YWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCi17Ci0Jc3RydWN0IGFkc3BfcG1lbV9yZWdpb24gKnJlZ2lvbjsKLQl2b2lkICp2YWRkciA9ICphZGRyOwotCXVuc2lnbmVkIGxvbmcgKnBhZGRyID0gKHVuc2lnbmVkIGxvbmcgKilhZGRyOwotCWludCByZXQ7Ci0KLQlyZXQgPSBhZHNwX3BtZW1fbG9va3VwX3ZhZGRyKG1vZHVsZSwgYWRkciwgbGVuLCAmcmVnaW9uKTsKLQlpZiAocmV0KSB7Ci0JCU1NX0VSUigibm90IHBhdGNoaW5nICVzIChwYWRkciAmIGt2YWRkciksIgotCQkJIiBsb29rdXAgKCVwLCAlbGQpIGZhaWxlZFxuIiwKLQkJCW1vZHVsZS0+bmFtZSwgdmFkZHIsIGxlbik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCSpwYWRkciA9IHJlZ2lvbi0+cGFkZHIgKyAodmFkZHIgLSByZWdpb24tPnZhZGRyKTsKLQkqa3ZhZGRyID0gcmVnaW9uLT5rdmFkZHIgKyAodmFkZHIgLSByZWdpb24tPnZhZGRyKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGFkc3BfcG1lbV9maXh1cChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsIHZvaWQgKiphZGRyLAotCQkgICAgdW5zaWduZWQgbG9uZyBsZW4pCi17Ci0Jc3RydWN0IGFkc3BfcG1lbV9yZWdpb24gKnJlZ2lvbjsKLQl2b2lkICp2YWRkciA9ICphZGRyOwotCXVuc2lnbmVkIGxvbmcgKnBhZGRyID0gKHVuc2lnbmVkIGxvbmcgKilhZGRyOwotCWludCByZXQ7Ci0KLQlyZXQgPSBhZHNwX3BtZW1fbG9va3VwX3ZhZGRyKG1vZHVsZSwgYWRkciwgbGVuLCAmcmVnaW9uKTsKLQlpZiAocmV0KSB7Ci0JCU1NX0VSUigibm90IHBhdGNoaW5nICVzLCBsb29rdXAgKCVwLCAlbGQpIGZhaWxlZFxuIiwKLQkJCW1vZHVsZS0+bmFtZSwgdmFkZHIsIGxlbik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JKnBhZGRyID0gcmVnaW9uLT5wYWRkciArICh2YWRkciAtIHJlZ2lvbi0+dmFkZHIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkc3BfdmVyaWZ5X2NtZChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCQkgICB1bnNpZ25lZCBpbnQgcXVldWVfaWQsIHZvaWQgKmNtZF9kYXRhLAotCQkJICAgc2l6ZV90IGNtZF9zaXplKQotewotCS8qIGNhbGwgdGhlIHBlciBtb2R1bGUgdmVyaWZpZXIgKi8KLQlpZiAobW9kdWxlLT52ZXJpZnlfY21kKQotCQlyZXR1cm4gbW9kdWxlLT52ZXJpZnlfY21kKG1vZHVsZSwgcXVldWVfaWQsIGNtZF9kYXRhLAotCQkJCQkgICAgIGNtZF9zaXplKTsKLQllbHNlCi0JCU1NX0lORk8oIm5vIHBhY2tldCB2ZXJpZnlpbmcgZnVuY3Rpb24gIgotCQkJCSAiZm9yIHRhc2sgJXNcbiIsIG1vZHVsZS0+bmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIGFkc3Bfd3JpdGVfY21kKHN0cnVjdCBhZHNwX2RldmljZSAqYWRldiwgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlzdHJ1Y3QgYWRzcF9jb21tYW5kX3QgY21kOwotCXVuc2lnbmVkIGNoYXIgYnVmWzI1Nl07Ci0Jdm9pZCAqY21kX2RhdGE7Ci0JbG9uZyByYzsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihjbWQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoY21kLmxlbiA+IDI1NikgewotCQljbWRfZGF0YSA9IGttYWxsb2MoY21kLmxlbiwgR0ZQX1VTRVIpOwotCQlpZiAoIWNtZF9kYXRhKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JfSBlbHNlIHsKLQkJY21kX2RhdGEgPSBidWY7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGNtZF9kYXRhLCAodm9pZCBfX3VzZXIgKikoY21kLmRhdGEpLCBjbWQubGVuKSkgewotCQlyYyA9IC1FRkFVTFQ7Ci0JCWdvdG8gZW5kOwotCX0KLQotCW11dGV4X2xvY2soJmFkZXYtPm1vZHVsZS0+cG1lbV9yZWdpb25zX2xvY2spOwotCWlmIChhZHNwX3ZlcmlmeV9jbWQoYWRldi0+bW9kdWxlLCBjbWQucXVldWUsIGNtZF9kYXRhLCBjbWQubGVuKSkgewotCQlNTV9FUlIoIm1vZHVsZSAlczogdmVyaWZ5IGZhaWxlZC5cbiIsIGFkZXYtPm1vZHVsZS0+bmFtZSk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCXJjID0gbXNtX2Fkc3Bfd3JpdGUoYWRldi0+bW9kdWxlLCBjbWQucXVldWUsIGNtZF9kYXRhLCBjbWQubGVuKTsKLWVuZDoKLQltdXRleF91bmxvY2soJmFkZXYtPm1vZHVsZS0+cG1lbV9yZWdpb25zX2xvY2spOwotCi0JaWYgKGNtZC5sZW4gPiAyNTYpCi0JCWtmcmVlKGNtZF9kYXRhKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhZHNwX2V2ZW50c19wZW5kaW5nKHN0cnVjdCBhZHNwX2RldmljZSAqYWRldikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCB5ZXM7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkZXYtPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQl5ZXMgPSAhbGlzdF9lbXB0eSgmYWRldi0+ZXZlbnRfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkZXYtPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4geWVzIHx8IGFkZXYtPmFib3J0OwotfQotCi1zdGF0aWMgaW50IGFkc3BfcG1lbV9sb29rdXBfcGFkZHIoc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kdWxlLCB2b2lkICoqYWRkciwKLQkJICAgICBzdHJ1Y3QgYWRzcF9wbWVtX3JlZ2lvbiAqKnJlZ2lvbikKLXsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKLQl1bnNpZ25lZCBsb25nIHBhZGRyID0gKHVuc2lnbmVkIGxvbmcpKCphZGRyKTsKLQlzdHJ1Y3QgYWRzcF9wbWVtX3JlZ2lvbiAqcmVnaW9uX2VsdDsKLQotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZ2lvbl9lbHQsIG5vZGUsICZtb2R1bGUtPnBtZW1fcmVnaW9ucywgbGlzdCkgewotCQlpZiAocGFkZHIgPj0gcmVnaW9uX2VsdC0+cGFkZHIgJiYKLQkJICAgIHBhZGRyIDwgcmVnaW9uX2VsdC0+cGFkZHIgKyByZWdpb25fZWx0LT5sZW4pIHsKLQkJCSpyZWdpb24gPSByZWdpb25fZWx0OwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIC0xOwotfQotCi1pbnQgYWRzcF9wbWVtX3BhZGRyX2ZpeHVwKHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKm1vZHVsZSwgdm9pZCAqKmFkZHIpCi17Ci0Jc3RydWN0IGFkc3BfcG1lbV9yZWdpb24gKnJlZ2lvbjsKLQl1bnNpZ25lZCBsb25nIHBhZGRyID0gKHVuc2lnbmVkIGxvbmcpKCphZGRyKTsKLQl1bnNpZ25lZCBsb25nICp2YWRkciA9ICh1bnNpZ25lZCBsb25nICopYWRkcjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYWRzcF9wbWVtX2xvb2t1cF9wYWRkcihtb2R1bGUsIGFkZHIsICZyZWdpb24pOwotCWlmIChyZXQpIHsKLQkJTU1fRVJSKCJub3QgcGF0Y2hpbmcgJXMsIHBhZGRyICVwIGxvb2t1cCBmYWlsZWRcbiIsCi0JCQltb2R1bGUtPm5hbWUsIHZhZGRyKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkqdmFkZHIgPSAodW5zaWduZWQgbG9uZylyZWdpb24tPnZhZGRyICsgKHBhZGRyIC0gcmVnaW9uLT5wYWRkcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWRzcF9wYXRjaF9ldmVudChzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUsCi0JCQkJc3RydWN0IGFkc3BfZXZlbnQgKmV2ZW50KQotewotCS8qIGNhbGwgdGhlIHBlci1tb2R1bGUgbXNnIHZlcmlmaWVyICovCi0JaWYgKG1vZHVsZS0+cGF0Y2hfZXZlbnQpCi0JCXJldHVybiBtb2R1bGUtPnBhdGNoX2V2ZW50KG1vZHVsZSwgZXZlbnQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyBhZHNwX2dldF9ldmVudChzdHJ1Y3QgYWRzcF9kZXZpY2UgKmFkZXYsIHZvaWQgX191c2VyICphcmcpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYWRzcF9ldmVudCAqZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IGFkc3BfZXZlbnRfdCBldnQ7Ci0JaW50IHRpbWVvdXQ7Ci0JbG9uZyByYyA9IDA7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmV2dCwgYXJnLCBzaXplb2Yoc3RydWN0IGFkc3BfZXZlbnRfdCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXRpbWVvdXQgPSAoaW50KWV2dC50aW1lb3V0X21zOwotCi0JaWYgKHRpbWVvdXQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCi0JCQlhZGV2LT5ldmVudF93YWl0LCBhZHNwX2V2ZW50c19wZW5kaW5nKGFkZXYpLAotCQkJbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7Ci0JCWlmIChyYyA9PSAwKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JfSBlbHNlIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCi0JCQlhZGV2LT5ldmVudF93YWl0LCBhZHNwX2V2ZW50c19wZW5kaW5nKGFkZXYpKTsKLQl9Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGFkZXYtPmFib3J0KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhZGV2LT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZhZGV2LT5ldmVudF9xdWV1ZSkpIHsKLQkJZGF0YSA9IGxpc3RfZmlyc3RfZW50cnkoJmFkZXYtPmV2ZW50X3F1ZXVlLAotCQkJCQlzdHJ1Y3QgYWRzcF9ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkYXRhLT5saXN0KTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRldi0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFkYXRhKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCS8qIERTUCBtZXNzYWdlcyBhcmUgdHlwZSAwOyB0aGV5IG1heSBjb250YWluIHBoeXNpY2FsIGFkZHJlc3NlcyAqLwotCWlmIChkYXRhLT50eXBlID09IDApCi0JCWFkc3BfcGF0Y2hfZXZlbnQoYWRldi0+bW9kdWxlLCBkYXRhKTsKLQotCS8qIG1hcCBhZHNwX2V2ZW50IC0tPiBhZHNwX2V2ZW50X3QgKi8KLQlpZiAoZXZ0LmxlbiA8IGRhdGEtPnNpemUpIHsKLQkJcmMgPSAtRVRPT1NNQUxMOwotCQlnb3RvIGVuZDsKLQl9Ci0JaWYgKGRhdGEtPm1zZ19pZCAhPSBFVkVOVF9NU0dfSUQpIHsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKShldnQuZGF0YSksIGRhdGEtPmRhdGEubXNnMTYsCi0JCQkJCWRhdGEtPnNpemUpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGVuZDsKLQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKShldnQuZGF0YSksIGRhdGEtPmRhdGEubXNnMzIsCi0JCQkJCWRhdGEtPnNpemUpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCX0KLQotCWV2dC50eXBlID0gZGF0YS0+dHlwZTsgLyogMCAtLT4gZnJvbSBhRFNQLCAxIC0tPiBmcm9tIEFSTTkgKi8KLQlldnQubXNnX2lkID0gZGF0YS0+bXNnX2lkOwotCWV2dC5mbGFncyA9IGRhdGEtPmlzMTY7Ci0JZXZ0LmxlbiA9IGRhdGEtPnNpemU7Ci0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZldnQsIHNpemVvZihldnQpKSkKLQkJcmMgPSAtRUZBVUxUOwotZW5kOgotCWtmcmVlKGRhdGEpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgYWRzcF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGFkc3BfZGV2aWNlICphZGV2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFEU1BfSU9DVExfRU5BQkxFOgotCQlyZXR1cm4gbXNtX2Fkc3BfZW5hYmxlKGFkZXYtPm1vZHVsZSk7Ci0KLQljYXNlIEFEU1BfSU9DVExfRElTQUJMRToKLQkJcmV0dXJuIG1zbV9hZHNwX2Rpc2FibGUoYWRldi0+bW9kdWxlKTsKLQotCWNhc2UgQURTUF9JT0NUTF9ESVNBQkxFX0VWRU5UX1JTUDoKLQkJcmV0dXJuIG1zbV9hZHNwX2Rpc2FibGVfZXZlbnRfcnNwKGFkZXYtPm1vZHVsZSk7Ci0KLQljYXNlIEFEU1BfSU9DVExfRElTQUJMRV9BQ0s6Ci0JCU1NX0VSUigiQURTUF9JT0NUTF9ESVNBQkxFX0FDSyBpcyBub3QgaW1wbGVtZW50ZWRcbiIpOwotCQlicmVhazsKLQotCWNhc2UgQURTUF9JT0NUTF9XUklURV9DT01NQU5EOgotCQlyZXR1cm4gYWRzcF93cml0ZV9jbWQoYWRldiwgKHZvaWQgX191c2VyICopIGFyZyk7Ci0KLQljYXNlIEFEU1BfSU9DVExfR0VUX0VWRU5UOgotCQlyZXR1cm4gYWRzcF9nZXRfZXZlbnQoYWRldiwgKHZvaWQgX191c2VyICopIGFyZyk7Ci0KLQljYXNlIEFEU1BfSU9DVExfU0VUX0NMS1JBVEU6IHsKLQkJdW5zaWduZWQgbG9uZyBjbGtfcmF0ZTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjbGtfcmF0ZSwgKHZvaWQgKikgYXJnLCBzaXplb2YoY2xrX3JhdGUpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gYWRzcF9zZXRfY2xrcmF0ZShhZGV2LT5tb2R1bGUsIGNsa19yYXRlKTsKLQl9Ci0KLQljYXNlIEFEU1BfSU9DVExfQUJPUlRfRVZFTlRfUkVBRDoKLQkJYWRldi0+YWJvcnQgPSAxOwotCQl3YWtlX3VwKCZhZGV2LT5ldmVudF93YWl0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgYWRzcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCBhZHNwX2RldmljZSAqYWRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGUgPSBhZGV2LT5tb2R1bGU7Ci0JaW50IHJjID0gMDsKLQotCU1NX0lORk8oInJlbGVhc2UgJyVzJ1xuIiwgYWRldi0+bmFtZSk7Ci0KLQkvKiBjbGVhciBtb2R1bGUgYmVmb3JlIHB1dHRpbmcgaXQgdG8gYXZvaWQgcmFjZSB3aXRoIG9wZW4oKSAqLwotCWFkZXYtPm1vZHVsZSA9IE5VTEw7Ci0KLQltc21fYWRzcF9wdXQobW9kdWxlKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkc3BfZXZlbnQodm9pZCAqZHJpdmVyX2RhdGEsIHVuc2lnbmVkIGlkLCBzaXplX3QgbGVuLAotCQkgICAgICAgdm9pZCAoKmdldGV2ZW50KSh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhZHNwX2RldmljZSAqYWRldiA9IGRyaXZlcl9kYXRhOwotCXN0cnVjdCBhZHNwX2V2ZW50ICpldmVudDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGxlbiA+IEFEU1BfRVZFTlRfTUFYX1NJWkUpIHsKLQkJTU1fRVJSKCJldmVudCB0b28gbGFyZ2UgKCVkIGJ5dGVzKVxuIiwgbGVuKTsKLQkJcmV0dXJuOwotCX0KLQotCWV2ZW50ID0ga21hbGxvYyhzaXplb2YoKmV2ZW50KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFldmVudCkgewotCQlNTV9FUlIoImNhbm5vdCBhbGxvY2F0ZSBidWZmZXJcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlkICE9IEVWRU5UX01TR19JRCkgewotCQlldmVudC0+dHlwZSA9IDA7Ci0JCWV2ZW50LT5pczE2ID0gMDsKLQkJZXZlbnQtPm1zZ19pZCA9IGlkOwotCQlldmVudC0+c2l6ZSA9IGxlbjsKLQotCQlnZXRldmVudChldmVudC0+ZGF0YS5tc2cxNiwgbGVuKTsKLQl9IGVsc2UgewotCQlldmVudC0+dHlwZSA9IDE7Ci0JCWV2ZW50LT5pczE2ID0gMTsKLQkJZXZlbnQtPm1zZ19pZCA9IGlkOwotCQlldmVudC0+c2l6ZSA9IGxlbjsKLQkJZ2V0ZXZlbnQoZXZlbnQtPmRhdGEubXNnMzIsIGxlbik7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkZXYtPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZldmVudC0+bGlzdCwgJmFkZXYtPmV2ZW50X3F1ZXVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGV2LT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cCgmYWRldi0+ZXZlbnRfd2FpdCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGFkc3Bfb3BzID0gewotCS5ldmVudCA9IGFkc3BfZXZlbnQsCi19OwotCi1zdGF0aWMgaW50IGFkc3Bfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlzdHJ1Y3QgYWRzcF9kZXZpY2UgKmFkZXY7Ci0JaW50IHJjOwotCi0JcmMgPSBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlhZGV2ID0gaW5vZGVfdG9fZGV2aWNlKGlub2RlKTsKLQlpZiAoIWFkZXYpCi0JCXJldHVybiAtRU5PREVWOwotCi0JTU1fSU5GTygib3BlbiAnJXMnXG4iLCBhZGV2LT5uYW1lKTsKLQotCXJjID0gbXNtX2Fkc3BfZ2V0KGFkZXYtPm5hbWUsICZhZGV2LT5tb2R1bGUsICZhZHNwX29wcywgYWRldik7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlNTV9JTkZPKCJvcGVuZWQgbW9kdWxlICclcycgYWRldiAlcFxuIiwgYWRldi0+bmFtZSwgYWRldik7Ci0JZmlscC0+cHJpdmF0ZV9kYXRhID0gYWRldjsKLQlhZGV2LT5hYm9ydCA9IDA7Ci0JSU5JVF9ITElTVF9IRUFEKCZhZGV2LT5tb2R1bGUtPnBtZW1fcmVnaW9ucyk7Ci0JbXV0ZXhfaW5pdCgmYWRldi0+bW9kdWxlLT5wbWVtX3JlZ2lvbnNfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGFkc3BfZGV2aWNlX2NvdW50Owotc3RhdGljIHN0cnVjdCBhZHNwX2RldmljZSAqYWRzcF9kZXZpY2VzOwotCi1zdGF0aWMgc3RydWN0IGFkc3BfZGV2aWNlICppbm9kZV90b19kZXZpY2Uoc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQl1bnNpZ25lZCBuID0gTUlOT1IoaW5vZGUtPmlfcmRldik7Ci0JaWYgKG4gPCBhZHNwX2RldmljZV9jb3VudCkgewotCQlpZiAoYWRzcF9kZXZpY2VzW25dLmRldmljZSkKLQkJCXJldHVybiBhZHNwX2RldmljZXMgKyBuOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGRldl90IGFkc3BfZGV2bm87Ci1zdGF0aWMgc3RydWN0IGNsYXNzICphZHNwX2NsYXNzOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZHNwX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSBhZHNwX29wZW4sCi0JLnVubG9ja2VkX2lvY3RsID0gYWRzcF9pb2N0bCwKLQkucmVsZWFzZSA9IGFkc3BfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyB2b2lkIGFkc3BfY3JlYXRlKHN0cnVjdCBhZHNwX2RldmljZSAqYWRldiwgY29uc3QgY2hhciAqbmFtZSwKLQkJCXN0cnVjdCBkZXZpY2UgKnBhcmVudCwgZGV2X3QgZGV2dCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JaW50IHJjOwotCi0JZGV2ID0gZGV2aWNlX2NyZWF0ZShhZHNwX2NsYXNzLCBwYXJlbnQsIGRldnQsICIlcyIsIG5hbWUpOwotCWlmIChJU19FUlIoZGV2KSkKLQkJcmV0dXJuOwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmYWRldi0+ZXZlbnRfd2FpdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmFkZXYtPmV2ZW50X3F1ZXVlKTsKLQlzcGluX2xvY2tfaW5pdCgmYWRldi0+ZXZlbnRfcXVldWVfbG9jayk7Ci0KLQljZGV2X2luaXQoJmFkZXYtPmNkZXYsICZhZHNwX2ZvcHMpOwotCWFkZXYtPmNkZXYub3duZXIgPSBUSElTX01PRFVMRTsKLQotCXJjID0gY2Rldl9hZGQoJmFkZXYtPmNkZXYsIGRldnQsIDEpOwotCWlmIChyYyA8IDApIHsKLQkJZGV2aWNlX2Rlc3Ryb3koYWRzcF9jbGFzcywgZGV2dCk7Ci0JfSBlbHNlIHsKLQkJYWRldi0+ZGV2aWNlID0gZGV2OwotCQlhZGV2LT5uYW1lID0gbmFtZTsKLQl9Ci19Ci0KLXZvaWQgbXNtX2Fkc3BfcHVibGlzaF9jZGV2cyhzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2R1bGVzLCB1bnNpZ25lZCBuKQotewotCWludCByYzsKLQotCWFkc3BfZGV2aWNlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZHNwX2RldmljZSkgKiBuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFkc3BfZGV2aWNlcykKLQkJcmV0dXJuOwotCi0JYWRzcF9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgImFkc3AiKTsKLQlpZiAoSVNfRVJSKGFkc3BfY2xhc3MpKQotCQlnb3RvIGZhaWxfY3JlYXRlX2NsYXNzOwotCi0JcmMgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZhZHNwX2Rldm5vLCAwLCBuLCAiYWRzcCIpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZmFpbF9hbGxvY19yZWdpb247Ci0KLQlhZHNwX2RldmljZV9jb3VudCA9IG47Ci0JZm9yIChuID0gMDsgbiA8IGFkc3BfZGV2aWNlX2NvdW50OyBuKyspIHsKLQkJYWRzcF9jcmVhdGUoYWRzcF9kZXZpY2VzICsgbiwKLQkJCSAgICBtb2R1bGVzW25dLm5hbWUsICZtb2R1bGVzW25dLnBkZXYuZGV2LAotCQkJICAgIE1LREVWKE1BSk9SKGFkc3BfZGV2bm8pLCBuKSk7Ci0JfQotCi0JcmV0dXJuOwotCi1mYWlsX2FsbG9jX3JlZ2lvbjoKLQljbGFzc191bnJlZ2lzdGVyKGFkc3BfY2xhc3MpOwotZmFpbF9jcmVhdGVfY2xhc3M6Ci0Ja2ZyZWUoYWRzcF9kZXZpY2VzKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYWRzcF9pbmZvLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2Fkc3BfaW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2I4MTBkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYWRzcF9pbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSAiYWRzcC5oIgotCi0vKiBGaXJtd2FyZSBtb2R1bGVzICovCi0jZGVmaW5lIFFEU1BfTU9EVUxFX0tFUk5FTCAgICAgICAgICAgICAgICAgIDB4MDEwNmRkNGUKLSNkZWZpbmUgUURTUF9NT0RVTEVfQUZFVEFTSyAgICAgICAgICAgICAgICAgMHgwMTA2ZGQ2ZgotI2RlZmluZSBRRFNQX01PRFVMRV9BVURQTEFZMFRBU0sgICAgICAgICAgICAweDAxMDZkZDcwCi0jZGVmaW5lIFFEU1BfTU9EVUxFX0FVRFBMQVkxVEFTSyAgICAgICAgICAgIDB4MDEwNmRkNzEKLSNkZWZpbmUgUURTUF9NT0RVTEVfQVVEUFBUQVNLICAgICAgICAgICAgICAgMHgwMTA2ZGQ3MgotI2RlZmluZSBRRFNQX01PRFVMRV9WSURFT1RBU0sgICAgICAgICAgICAgICAweDAxMDZkZDczCi0jZGVmaW5lIFFEU1BfTU9EVUxFX1ZJREVPX0FBQ19WT0MgICAgICAgICAgIDB4MDEwNmRkNzQKLSNkZWZpbmUgUURTUF9NT0RVTEVfUENNX0RFQyAgICAgICAgICAgICAgICAgMHgwMTA2ZGQ3NQotI2RlZmluZSBRRFNQX01PRFVMRV9BVURJT19ERUNfTVAzICAgICAgICAgICAweDAxMDZkZDc2Ci0jZGVmaW5lIFFEU1BfTU9EVUxFX0FVRElPX0RFQ19BQUMgICAgICAgICAgIDB4MDEwNmRkNzcKLSNkZWZpbmUgUURTUF9NT0RVTEVfQVVESU9fREVDX1dNQSAgICAgICAgICAgMHgwMTA2ZGQ3OAotI2RlZmluZSBRRFNQX01PRFVMRV9IT1NUUENNICAgICAgICAgICAgICAgICAweDAxMDZkZDc5Ci0jZGVmaW5lIFFEU1BfTU9EVUxFX0RUTUYgICAgICAgICAgICAgICAgICAgIDB4MDEwNmRkN2EKLSNkZWZpbmUgUURTUF9NT0RVTEVfQVVEUkVDVEFTSyAgICAgICAgICAgICAgMHgwMTA2ZGQ3YgotI2RlZmluZSBRRFNQX01PRFVMRV9BVURQUkVQUk9DVEFTSyAgICAgICAgICAweDAxMDZkZDdjCi0jZGVmaW5lIFFEU1BfTU9EVUxFX1NCQ19FTkMgICAgICAgICAgICAgICAgIDB4MDEwNmRkN2QKLSNkZWZpbmUgUURTUF9NT0RVTEVfVk9DX1VNVFMgICAgICAgICAgICAgICAgMHgwMTA2ZGQ5YQotI2RlZmluZSBRRFNQX01PRFVMRV9WT0NfQ0RNQSAgICAgICAgICAgICAgICAweDAxMDZkZDk4Ci0jZGVmaW5lIFFEU1BfTU9EVUxFX1ZPQ19QQ00gICAgICAgICAgICAgICAgIDB4MDEwNmRkN2YKLSNkZWZpbmUgUURTUF9NT0RVTEVfVk9DRU5DVEFTSyAgICAgICAgICAgICAgMHgwMTA2ZGQ4MAotI2RlZmluZSBRRFNQX01PRFVMRV9WT0NERUNUQVNLICAgICAgICAgICAgICAweDAxMDZkZDgxCi0jZGVmaW5lIFFEU1BfTU9EVUxFX1ZPSUNFUFJPQ1RBU0sgICAgICAgICAgIDB4MDEwNmRkODIKLSNkZWZpbmUgUURTUF9NT0RVTEVfVklERU9FTkNUQVNLICAgICAgICAgICAgMHgwMTA2ZGQ4MwotI2RlZmluZSBRRFNQX01PRFVMRV9WRkVUQVNLICAgICAgICAgICAgICAgICAweDAxMDZkZDg0Ci0jZGVmaW5lIFFEU1BfTU9EVUxFX1dBVl9FTkMgICAgICAgICAgICAgICAgIDB4MDEwNmRkODUKLSNkZWZpbmUgUURTUF9NT0RVTEVfQUFDTENfRU5DICAgICAgICAgICAgICAgMHgwMTA2ZGQ4NgotI2RlZmluZSBRRFNQX01PRFVMRV9WSURFT19BTVIgICAgICAgICAgICAgICAweDAxMDZkZDg3Ci0jZGVmaW5lIFFEU1BfTU9EVUxFX1ZPQ19BTVIgICAgICAgICAgICAgICAgIDB4MDEwNmRkODgKLSNkZWZpbmUgUURTUF9NT0RVTEVfVk9DX0VWUkMgICAgICAgICAgICAgICAgMHgwMTA2ZGQ4OQotI2RlZmluZSBRRFNQX01PRFVMRV9WT0NfMTNLICAgICAgICAgICAgICAgICAweDAxMDZkZDhhCi0jZGVmaW5lIFFEU1BfTU9EVUxFX1ZPQ19GR1YgICAgICAgICAgICAgICAgIDB4MDEwNmRkOGIKLSNkZWZpbmUgUURTUF9NT0RVTEVfRElBR1RBU0sgICAgICAgICAgICAgICAgMHgwMTA2ZGQ4YwotI2RlZmluZSBRRFNQX01PRFVMRV9KUEVHVEFTSyAgICAgICAgICAgICAgICAweDAxMDZkZDhkCi0jZGVmaW5lIFFEU1BfTU9EVUxFX0xQTVRBU0sgICAgICAgICAgICAgICAgIDB4MDEwNmRkOGUKLSNkZWZpbmUgUURTUF9NT0RVTEVfUUNBTVRBU0sgICAgICAgICAgICAgICAgMHgwMTA2ZGQ4ZgotI2RlZmluZSBRRFNQX01PRFVMRV9NT0RNQVRIVEFTSyAgICAgICAgICAgICAweDAxMDZkZDkwCi0jZGVmaW5lIFFEU1BfTU9EVUxFX0FVRFBMQVkyVEFTSyAgICAgICAgICAgIDB4MDEwNmRkOTEKLSNkZWZpbmUgUURTUF9NT0RVTEVfQVVEUExBWTNUQVNLICAgICAgICAgICAgMHgwMTA2ZGQ5MgotI2RlZmluZSBRRFNQX01PRFVMRV9BVURQTEFZNFRBU0sgICAgICAgICAgICAweDAxMDZkZDkzCi0jZGVmaW5lIFFEU1BfTU9EVUxFX0dSQVBISUNTVEFTSyAgICAgICAgICAgIDB4MDEwNmRkOTQKLSNkZWZpbmUgUURTUF9NT0RVTEVfTUlESSAgICAgICAgICAgICAgICAgICAgMHgwMTA2ZGQ5NQotI2RlZmluZSBRRFNQX01PRFVMRV9HQVVESU8gICAgICAgICAgICAgICAgICAweDAxMDZkZDk2Ci0jZGVmaW5lIFFEU1BfTU9EVUxFX1ZERUNfTFBfTU9ERSAgICAgICAgICAgIDB4MDEwNmRkOTcKLSNkZWZpbmUgUURTUF9NT0RVTEVfVklERU9fQUFDX1ZPQ19UVVJCTyAgICAgMHgwMTA4OWY3NwotI2RlZmluZSBRRFNQX01PRFVMRV9WSURFT19BTVJfVFVSQk8gICAgICAgICAweDAxMDg5Zjc4Ci0jZGVmaW5lIFFEU1BfTU9EVUxFX1dNX1RVUkJPX01PREUgICAgICAgICAgIDB4MDEwODlmNzkKLSNkZWZpbmUgUURTUF9NT0RVTEVfVkRFQ19MUF9NT0RFX1RVUkJPICAgICAgMHgwMTA4OWY3YQotI2RlZmluZSBRRFNQX01PRFVMRV9BVURSRUMwVEFTSyAgICAgICAgICAgICAweDAxMDk2OTZmCi0jZGVmaW5lIFFEU1BfTU9EVUxFX0FVRFJFQzFUQVNLICAgICAgICAgICAgIDB4MDEwOTY5NzAKLSNkZWZpbmUgUURTUF9NT0RVTEVfQVVEUkVDMlRBU0sgICAgICAgICAgICAgMHgwMTBhMmY1OQotI2RlZmluZSBRRFNQX01PRFVMRV9NQVggICAgICAgICAgICAgICAgICAgICAweDdmZmZmZmZmCi0KLSAgIC8qIERPIE5PVCBVU0U6IEZvcmNlIHRoaXMgZW51bSB0byBiZSBhIDMyYml0IHR5cGUgdG8gaW1wcm92ZSBzcGVlZCAqLwotI2RlZmluZSBRRFNQX01PRFVMRV8zMkJJVF9EVU1NWSAweDEwMDAwCi0KLXN0YXRpYyB1aW50MzJfdCAqcWRzcF90YXNrX3RvX21vZHVsZVtJTUdfTUFYXTsKLXN0YXRpYyB1aW50MzJfdAkqcWRzcF9xdWV1ZV9vZmZzZXRfdGFibGVbSU1HX01BWF07Ci0KLSNkZWZpbmUgUURTUF9NT0RVTEUobiwgY2xrbmFtZSwgY2xrcmF0ZSwgdmVyaWZ5X2NtZF9mdW5jLCBwYXRjaF9ldmVudF9mdW5jKSBcCi0JeyAubmFtZSA9ICNuLCAucGRldl9uYW1lID0gImFkc3BfIiAjbiwgLmlkID0gUURTUF9NT0RVTEVfIyNuLCBcCi0JICAuY2xrX25hbWUgPSBjbGtuYW1lLCAuY2xrX3JhdGUgPSBjbGtyYXRlLCBcCi0JICAudmVyaWZ5X2NtZCA9IHZlcmlmeV9jbWRfZnVuYywgLnBhdGNoX2V2ZW50ID0gcGF0Y2hfZXZlbnRfZnVuYyB9Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRzcF9tb2R1bGVfaW5mbyBtb2R1bGVfaW5mb1tdID0gewotCVFEU1BfTU9EVUxFKEFVRFBMQVkwVEFTSywgTlVMTCwgMCwgTlVMTCwgTlVMTCksCi0JUURTUF9NT0RVTEUoQVVEUExBWTFUQVNLLCBOVUxMLCAwLCBOVUxMLCBOVUxMKSwKLQlRRFNQX01PRFVMRShBVURQTEFZMlRBU0ssIE5VTEwsIDAsIE5VTEwsIE5VTEwpLAotCVFEU1BfTU9EVUxFKEFVRFBMQVkzVEFTSywgTlVMTCwgMCwgTlVMTCwgTlVMTCksCi0JUURTUF9NT0RVTEUoQVVEUFBUQVNLLCBOVUxMLCAwLCBOVUxMLCBOVUxMKSwKLQlRRFNQX01PRFVMRShBVURQUkVQUk9DVEFTSywgTlVMTCwgMCwgTlVMTCwgTlVMTCksCi0JUURTUF9NT0RVTEUoQUZFVEFTSyAsIE5VTEwsIDAsIE5VTEwsIE5VTEwpLAotCVFEU1BfTU9EVUxFKEFVRFJFQzBUQVNLLCBOVUxMLCAwLCBOVUxMLCBOVUxMKSwKLQlRRFNQX01PRFVMRShBVURSRUMxVEFTSywgTlVMTCwgMCwgTlVMTCwgTlVMTCksCi0JUURTUF9NT0RVTEUoQVVEUkVDMlRBU0ssIE5VTEwsIDAsIE5VTEwsIE5VTEwpLAotfTsKLQotaW50IGFkc3BfaW5pdF9pbmZvKHN0cnVjdCBhZHNwX2luZm8gKmluZm8pCi17Ci0JdWludDMyX3QgaW1nX251bTsKLQotCWluZm8tPnNlbmRfaXJxID0gICAweDAwYzAwMjAwOwotCWluZm8tPnJlYWRfY3RybCA9ICAweDAwNDAwMDM4OwotCWluZm8tPndyaXRlX2N0cmwgPSAweDAwNDAwMDM0OwotCi0JaW5mby0+bWF4X21zZzE2X3NpemUgPSAxOTM7Ci0JaW5mby0+bWF4X21zZzMyX3NpemUgPSA4OwotCWZvciAoaW1nX251bSA9IDA7IGltZ19udW0gPCBJTUdfTUFYOyBpbWdfbnVtKyspCi0JCXFkc3BfcXVldWVfb2Zmc2V0X3RhYmxlW2ltZ19udW1dID0KLQkJJmluZm8tPmluaXRfaW5mb19wdHItPnF1ZXVlX29mZnNldHNbaW1nX251bV1bMF07Ci0KLQlmb3IgKGltZ19udW0gPSAwOyBpbWdfbnVtIDwgSU1HX01BWDsgaW1nX251bSsrKQotCQlxZHNwX3Rhc2tfdG9fbW9kdWxlW2ltZ19udW1dID0KLQkJJmluZm8tPmluaXRfaW5mb19wdHItPnRhc2tfdG9fbW9kdWxlX3RibFtpbWdfbnVtXVswXTsKLQlpbmZvLT5tYXhfdGFza19pZCA9IEVOVFJJRVNfTUFYOwotCWluZm8tPm1heF9tb2R1bGVfaWQgPSBRRFNQX01PRFVMRV9NQVggLSAxOwotCWluZm8tPm1heF9xdWV1ZV9pZCA9IFFEU1BfTUFYX05VTV9RVUVVRVM7Ci0JaW5mby0+bWF4X2ltYWdlX2lkID0gMDsKLQlpbmZvLT5xdWV1ZV9vZmZzZXQgPSBxZHNwX3F1ZXVlX29mZnNldF90YWJsZTsKLQlpbmZvLT50YXNrX3RvX21vZHVsZSA9IHFkc3BfdGFza190b19tb2R1bGU7Ci0KLQlpbmZvLT5tb2R1bGVfY291bnQgPSBBUlJBWV9TSVpFKG1vZHVsZV9pbmZvKTsKLQlpbmZvLT5tb2R1bGUgPSBtb2R1bGVfaW5mbzsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYWZlLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2FmZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTg1NmU1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYWZlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzQgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWFmZWNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhZmVtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYWZlLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLQotI2RlZmluZSBBRkVfTUFYX1RJTUVPVVQgNTAwIC8qIDUwMCBtcyAqLwotI2RlZmluZSBBRkVfTUFYX0NMTlQgNiAvKiA2IEhXIHBhdGggZGVmaW5lZCBzbyBmYXIgKi8KLSNkZWZpbmUgR0VUREVWSUNFSUQoeCkgKCh4KSAtIDEpCi0KLXN0cnVjdCBtc21fYWZlX3N0YXRlIHsKLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2Q7Ci0Jc3RydWN0IG1zbV9hZHNwX29wcyAgICBhZHNwX29wczsKLQlzdHJ1Y3QgbXV0ZXggICAgICAgICAgIGxvY2s7Ci0JdTggICAgICAgICAgICAgICAgICAgICBpbl91c2U7Ci0JdTggICAgICAgICAgICAgICAgICAgICBjb2RlY19jb25maWdbQUZFX01BWF9DTE5UXTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgIHdhaXQ7Ci0JdTgJCQlhdXhfY29uZl9mbGFnOwotfTsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfYWZlbGI7Ci0jZW5kaWYKLQotCi1zdGF0aWMgc3RydWN0IG1zbV9hZmVfc3RhdGUgdGhlX2FmZV9zdGF0ZTsKLQotI2RlZmluZSBhZmVfc2VuZF9xdWV1ZShhZmUsIGNtZCwgbGVuKSBcCi0gIG1zbV9hZHNwX3dyaXRlKGFmZS0+bW9kLCBRRFNQX2FwdUFmZVF1ZXVlLCBcCi0JY21kLCBsZW4pCi0KLXN0YXRpYyB2b2lkIGFmZV9kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgdm9pZCAoKmdldGV2ZW50KSh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBtc21fYWZlX3N0YXRlICphZmUgPSBkYXRhOwotCi0JTU1fREJHKCJtc2dfaWQgJWQgXG4iLCBpZCk7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBRkVfQVBVX01TR19DT0RFQ19DT05GSUdfQUNLOiB7Ci0JCXN0cnVjdCBhZmVfbXNnX2NvZGVjX2NvbmZpZ19hY2sgYWZlX2FjazsKLQkJZ2V0ZXZlbnQoJmFmZV9hY2ssIEFGRV9BUFVfTVNHX0NPREVDX0NPTkZJR19BQ0tfTEVOKTsKLQkJTU1fREJHKCIlczogZGV2aWNlX2lkOiAlZCBkZXZpY2UgYWN0aXZpdHk6ICVkXG4iLCBfX2Z1bmNfXywKLQkJYWZlX2Fjay5kZXZpY2VfaWQsIGFmZV9hY2suZGV2aWNlX2FjdGl2aXR5KTsKLQkJaWYgKGFmZV9hY2suZGV2aWNlX2FjdGl2aXR5ID09IEFGRV9NU0dfQ09ERUNfQ09ORklHX0RJU0FCTEVEKQotCQkJYWZlLT5jb2RlY19jb25maWdbR0VUREVWSUNFSUQoYWZlX2Fjay5kZXZpY2VfaWQpXSA9IDA7Ci0JCWVsc2UKLQkJCWFmZS0+Y29kZWNfY29uZmlnW0dFVERFVklDRUlEKGFmZV9hY2suZGV2aWNlX2lkKV0gPQotCQkJYWZlX2Fjay5kZXZpY2VfYWN0aXZpdHk7Ci0KLQkJd2FrZV91cCgmYWZlLT53YWl0KTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQUZFX0FQVV9NU0dfVk9DX1RJTUlOR19TVUNDRVNTOgotCQlNTV9JTkZPKCJSZWNlaXZlZCBWT0NfVElNSU5HX1NVQ0NFU1MgbWVzc2FnZSBmcm9tIEFGRVRBU0tcbiIpOwotCQlicmVhazsKLQljYXNlIEFEU1BfTUVTU0FHRV9JRDoKLQkJTU1fREJHKCJSZWNlaXZlZCBBRFNQIGV2ZW50OiBtb2R1bGUgZW5hYmxlL2Rpc2FibGUoYXVkcHB0YXNrKSIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlNTV9FUlIoInVuZXhwZWN0ZWQgbWVzc2FnZSBmcm9tIGFmZSBcbiIpOwotCX0KLQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgYWZlX2RzcF9jb2RlY19jb25maWcoc3RydWN0IG1zbV9hZmVfc3RhdGUgKmFmZSwKLQl1OCBwYXRoX2lkLCB1OCBlbmFibGUsIHN0cnVjdCBtc21fYWZlX2NvbmZpZyAqY29uZmlnKQotewotCXN0cnVjdCBhZmVfY21kX2NvZGVjX2NvbmZpZyBjbWQ7Ci0KLQlNTV9EQkcoIiVzKCkgJXBcbiIsIF9fZnVuY19fLCBjb25maWcpOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFGRV9DTURfQ09ERUNfQ09ORklHX0NNRDsKLQljbWQuZGV2aWNlX2lkID0gcGF0aF9pZDsKLQljbWQuYWN0aXZpdHkgPSBlbmFibGU7Ci0JaWYgKGNvbmZpZykgewotCQlNTV9EQkcoIiVzOiBzYW1wbGVfcmF0ZSAleCBjaCBtb2RlICV4IHZvbCAleFxuIiwKLQkJCV9fZnVuY19fLCBjb25maWctPnNhbXBsZV9yYXRlLAotCQkJY29uZmlnLT5jaGFubmVsX21vZGUsIGNvbmZpZy0+dm9sdW1lKTsKLQkJY21kLnNhbXBsZV9yYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKLQkJY21kLmNoYW5uZWxfbW9kZSA9IGNvbmZpZy0+Y2hhbm5lbF9tb2RlOwotCQljbWQudm9sdW1lID0gY29uZmlnLT52b2x1bWU7Ci0JfQotCWFmZV9zZW5kX3F1ZXVlKGFmZSwgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotLyogRnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGFmZSBtb2R1bGUgYmVlbiBlbmFibGVkICovCi12b2lkIGFmZV9sb29wYmFjayhpbnQgZW5hYmxlKQotewotCXN0cnVjdCBhZmVfY21kX2xvb3BiYWNrIGNtZDsKLQlzdHJ1Y3QgbXNtX2FmZV9zdGF0ZSAqYWZlOwotCi0JYWZlID0gJnRoZV9hZmVfc3RhdGU7Ci0JTU1fREJHKCJlbmFibGUgJWRcbiIsIGVuYWJsZSk7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQUZFX0NNRF9MT09QQkFDSzsKLQlpZiAoZW5hYmxlKQotCQljbWQuZW5hYmxlX2ZsYWcgPSBBRkVfTE9PUEJBQ0tfRU5BQkxFX0NPTU1BTkQ7Ci0KLQlhZmVfc2VuZF9xdWV1ZShhZmUsICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLUVYUE9SVF9TWU1CT0woYWZlX2xvb3BiYWNrKTsKLQotdm9pZCBhZmVfZXh0X2xvb3BiYWNrKGludCBlbmFibGUsIGludCByeF9jb3BwX2lkLCBpbnQgdHhfY29wcF9pZCkKLXsKLQlzdHJ1Y3QgYWZlX2NtZF9leHRfbG9vcGJhY2sgY21kOwotCXN0cnVjdCBtc21fYWZlX3N0YXRlICphZmU7Ci0KLQlhZmUgPSAmdGhlX2FmZV9zdGF0ZTsKLQlNTV9EQkcoImVuYWJsZSAlZFxuIiwgZW5hYmxlKTsKLQlpZiAoKHJ4X2NvcHBfaWQgPT0gMCkgJiYgKHR4X2NvcHBfaWQgPT0gMCkpIHsKLQkJYWZlX2xvb3BiYWNrKGVuYWJsZSk7Ci0JfSBlbHNlIHsKLQkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQkJY21kLmNtZF9pZCA9IEFGRV9DTURfRVhUX0xPT1BCQUNLOwotCQljbWQuc291cmNlX2lkID0gdHhfY29wcF9pZDsKLQkJY21kLmRzdF9pZCA9IHJ4X2NvcHBfaWQ7Ci0JCWlmIChlbmFibGUpCi0JCQljbWQuZW5hYmxlX2ZsYWcgPSBBRkVfTE9PUEJBQ0tfRU5BQkxFX0NPTU1BTkQ7Ci0KLQkJYWZlX3NlbmRfcXVldWUoYWZlLCAmY21kLCBzaXplb2YoY21kKSk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChhZmVfZXh0X2xvb3BiYWNrKTsKLQotdm9pZCBhZmVfZGV2aWNlX3ZvbHVtZV9jdHJsKHUxNiBkZXZpY2VfaWQsIHUxNiBkZXZpY2Vfdm9sdW1lKQotewotCXN0cnVjdCBhZmVfY21kX2RldmljZV92b2x1bWVfY3RybCBjbWQ7Ci0Jc3RydWN0IG1zbV9hZmVfc3RhdGUgKmFmZTsKLQotCWFmZSA9ICZ0aGVfYWZlX3N0YXRlOwotCU1NX0RCRygiZGV2aWNlIDB4JTR4IHZvbHVtZSAweCU0eFxuIiwgZGV2aWNlX2lkLCBkZXZpY2Vfdm9sdW1lKTsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBRkVfQ01EX0RFVklDRV9WT0xVTUVfQ1RSTDsKLQljbWQuZGV2aWNlX2lkID0gZGV2aWNlX2lkOwotCWNtZC5kZXZpY2Vfdm9sdW1lID0gZGV2aWNlX3ZvbHVtZTsKLQlhZmVfc2VuZF9xdWV1ZShhZmUsICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLUVYUE9SVF9TWU1CT0woYWZlX2RldmljZV92b2x1bWVfY3RybCk7Ci0KLWludCBhZmVfZW5hYmxlKHU4IHBhdGhfaWQsIHN0cnVjdCBtc21fYWZlX2NvbmZpZyAqY29uZmlnKQotewotCXN0cnVjdCBtc21fYWZlX3N0YXRlICphZmUgPSAmdGhlX2FmZV9zdGF0ZTsKLQlpbnQgcmM7Ci0KLQlNTV9EQkcoIiVzOiBwYXRoICVkXG4iLCBfX2Z1bmNfXywgcGF0aF9pZCk7Ci0JaWYgKChHRVRERVZJQ0VJRChwYXRoX2lkKSA8IDApIHx8IChHRVRERVZJQ0VJRChwYXRoX2lkKSA+IDUpKSB7Ci0JCU1NX0VSUigiSW52YWxpZCBwYXRoX2lkOiAlZFxuIiwgcGF0aF9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQltdXRleF9sb2NrKCZhZmUtPmxvY2spOwotCWlmICghYWZlLT5pbl91c2UgJiYgIWFmZS0+YXV4X2NvbmZfZmxhZykgewotCQkvKiBlbmFibGUgYWZlICovCi0JCXJjID0gbXNtX2Fkc3BfZ2V0KCJBRkVUQVNLIiwgJmFmZS0+bW9kLCAmYWZlLT5hZHNwX29wcywgYWZlKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJTU1fRVJSKCIlczogZmFpbGVkIHRvIGdldCBBRkVUQVNLIG1vZHVsZVxuIiwgX19mdW5jX18pOwotCQkJZ290byBlcnJvcl9hZHNwX2dldDsKLQkJfQotCQlyYyA9IG1zbV9hZHNwX2VuYWJsZShhZmUtPm1vZCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGVycm9yX2Fkc3BfZW5hYmxlOwotCX0KLQkvKiBJc3N1ZSBjb2RlYyBjb25maWcgY29tbWFuZCAqLwotCWFmZV9kc3BfY29kZWNfY29uZmlnKGFmZSwgcGF0aF9pZCwgMSwgY29uZmlnKTsKLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhZmUtPndhaXQsCi0JCWFmZS0+Y29kZWNfY29uZmlnW0dFVERFVklDRUlEKHBhdGhfaWQpXSwKLQkJbXNlY3NfdG9famlmZmllcyhBRkVfTUFYX1RJTUVPVVQpKTsKLQlpZiAoIXJjKSB7Ci0JCU1NX0VSUigiQUZFIGZhaWxlZCB0byByZXNwb25kIHdpdGhpbiAlZCBtc1xuIiwgQUZFX01BWF9USU1FT1VUKTsKLQkJcmMgPSAtRU5PREVWOwotCQlpZiAoIWFmZS0+aW5fdXNlKSB7Ci0JCQlpZiAoIWFmZS0+YXV4X2NvbmZfZmxhZyB8fAotCQkJKGFmZS0+YXV4X2NvbmZfZmxhZyAmJgotCQkJKHBhdGhfaWQgPT0gQUZFX0hXX1BBVEhfQVVYUENNX1JYIHx8Ci0JCQlwYXRoX2lkID09IEFGRV9IV19QQVRIX0FVWFBDTV9UWCkpKSB7Ci0JCQkJLyogY2xlYW4gdXAgaWYgdGhlcmUgaXMgbm8gY2xpZW50ICovCi0JCQkJbXNtX2Fkc3BfZGlzYWJsZShhZmUtPm1vZCk7Ci0JCQkJbXNtX2Fkc3BfcHV0KGFmZS0+bW9kKTsKLQkJCQlhZmUtPmF1eF9jb25mX2ZsYWcgPSAwOwotCQkJCWFmZS0+bW9kID0gTlVMTDsKLQkJCX0KLQkJfQotCi0JfSBlbHNlIHsKLQkJcmMgPSAwOwotCQlhZmUtPmluX3VzZSsrOwotCX0KLQotCW11dGV4X3VubG9jaygmYWZlLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci0KLWVycm9yX2Fkc3BfZW5hYmxlOgotCW1zbV9hZHNwX3B1dChhZmUtPm1vZCk7Ci0JYWZlLT5tb2QgPSBOVUxMOwotZXJyb3JfYWRzcF9nZXQ6Ci0JbXV0ZXhfdW5sb2NrKCZhZmUtPmxvY2spOwotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0woYWZlX2VuYWJsZSk7Ci0KLWludCBhZmVfY29uZmlnX2ZtX2NvZGVjKGludCBmbV9lbmFibGUsIHVpbnQxNl90IHNvdXJjZSkKLXsKLQlzdHJ1Y3QgYWZlX2NtZF9mbV9jb2RlY19jb25maWcgY21kOwotCXN0cnVjdCBtc21fYWZlX3N0YXRlICphZmUgPSAmdGhlX2FmZV9zdGF0ZTsKLQlpbnQgcmMgPSAwOwotCWludCBpID0gMDsKLQl1bnNpZ25lZCBzaG9ydCAqcHRybWVtID0gKHVuc2lnbmVkIHNob3J0ICopJmNtZDsKLQotCU1NX0lORk8oIiBjb25maWd1cmUgZm0gY29kZWNcbiIpOwotCW11dGV4X2xvY2soJmFmZS0+bG9jayk7Ci0JaWYgKCFhZmUtPmluX3VzZSkgewotCQkvKiBlbmFibGUgYWZlICovCi0JCXJjID0gbXNtX2Fkc3BfZ2V0KCJBRkVUQVNLIiwgJmFmZS0+bW9kLCAmYWZlLT5hZHNwX29wcywgYWZlKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJTU1fRVJSKCIlczogZmFpbGVkIHRvIGdldCBBRkVUQVNLIG1vZHVsZVxuIiwgX19mdW5jX18pOwotCQkJZ290byBlcnJvcl9hZHNwX2dldDsKLQkJfQotCQlyYyA9IG1zbV9hZHNwX2VuYWJsZShhZmUtPm1vZCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGVycm9yX2Fkc3BfZW5hYmxlOwotCX0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBRkVfQ01EX0ZNX1JYX1JPVVRJTkdfQ01EOwotCWNtZC5lbmFibGUgPSBmbV9lbmFibGU7Ci0JY21kLmRldmljZV9pZCA9IHNvdXJjZTsKLQotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY21kKS8yOyBpKyssICsrcHRybWVtKQotCQlNTV9EQkcoImNtZFslZF09MHglMDR4XG4iLCBpLCAqcHRybWVtKTsKLQlhZmVfc2VuZF9xdWV1ZShhZmUsICZjbWQsIHNpemVvZihjbWQpKTsKLQotCW11dGV4X3VubG9jaygmYWZlLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci1lcnJvcl9hZHNwX2VuYWJsZToKLQltc21fYWRzcF9wdXQoYWZlLT5tb2QpOwotCWFmZS0+bW9kID0gTlVMTDsKLWVycm9yX2Fkc3BfZ2V0OgotCW11dGV4X3VubG9jaygmYWZlLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKGFmZV9jb25maWdfZm1fY29kZWMpOwotCi1pbnQgYWZlX2NvbmZpZ19mbV92b2x1bWUodWludDE2X3Qgdm9sdW1lKQotewotCXN0cnVjdCBhZmVfY21kX2ZtX3ZvbHVtZV9jb25maWcgY21kOwotCXN0cnVjdCBtc21fYWZlX3N0YXRlICphZmUgPSAmdGhlX2FmZV9zdGF0ZTsKLQlpbnQgcmMgPSAwOwotCi0JTU1fSU5GTygiIGNvbmZpZ3VyZSBmbSB2b2x1bWVcbiIpOwotCW11dGV4X2xvY2soJmFmZS0+bG9jayk7Ci0JaWYgKCFhZmUtPmluX3VzZSkgewotCQkvKiBlbmFibGUgYWZlICovCi0JCXJjID0gbXNtX2Fkc3BfZ2V0KCJBRkVUQVNLIiwgJmFmZS0+bW9kLCAmYWZlLT5hZHNwX29wcywgYWZlKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJTU1fRVJSKCIlczogZmFpbGVkIHRvIGdldCBBRkVUQVNLIG1vZHVsZVxuIiwgX19mdW5jX18pOwotCQkJZ290byBlcnJvcl9hZHNwX2dldDsKLQkJfQotCQlyYyA9IG1zbV9hZHNwX2VuYWJsZShhZmUtPm1vZCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGVycm9yX2Fkc3BfZW5hYmxlOwotCX0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBRkVfQ01EX0ZNX1BMQVlCQUNLX1ZPTFVNRV9DTUQ7Ci0JY21kLnZvbHVtZSA9IHZvbHVtZTsKLQotCWFmZV9zZW5kX3F1ZXVlKGFmZSwgJmNtZCwgc2l6ZW9mKGNtZCkpOwotCi0JbXV0ZXhfdW5sb2NrKCZhZmUtPmxvY2spOwotCXJldHVybiByYzsKLWVycm9yX2Fkc3BfZW5hYmxlOgotCW1zbV9hZHNwX3B1dChhZmUtPm1vZCk7Ci0JYWZlLT5tb2QgPSBOVUxMOwotZXJyb3JfYWRzcF9nZXQ6Ci0JbXV0ZXhfdW5sb2NrKCZhZmUtPmxvY2spOwotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0woYWZlX2NvbmZpZ19mbV92b2x1bWUpOwotCi1pbnQgYWZlX2NvbmZpZ19mbV9jYWxpYnJhdGlvbl9nYWluKHVpbnQxNl90IGRldmljZV9pZCwKLQkJCXVpbnQxNl90IGNhbGlicmF0aW9uX2dhaW4pCi17Ci0Jc3RydWN0IGFmZV9jbWRfZm1fY2FsaWJnYWluX2NvbmZpZyBjbWQ7Ci0Jc3RydWN0IG1zbV9hZmVfc3RhdGUgKmFmZSA9ICZ0aGVfYWZlX3N0YXRlOwotCWludCByYyA9IDA7Ci0KLQlNTV9JTkZPKCJDb25maWd1cmUgZm9yIHJ4IGRldmljZSA9IDB4JTR4LCBnYWluID0gMHglNHhcbiIsIGRldmljZV9pZCwKLQkJCWNhbGlicmF0aW9uX2dhaW4pOwotCW11dGV4X2xvY2soJmFmZS0+bG9jayk7Ci0JaWYgKCFhZmUtPmluX3VzZSkgewotCQkvKiBlbmFibGUgYWZlICovCi0JCXJjID0gbXNtX2Fkc3BfZ2V0KCJBRkVUQVNLIiwgJmFmZS0+bW9kLCAmYWZlLT5hZHNwX29wcywgYWZlKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJTU1fRVJSKCIlczogZmFpbGVkIHRvIGdldCBBRkVUQVNLIG1vZHVsZVxuIiwgX19mdW5jX18pOwotCQkJZ290byBlcnJvcl9hZHNwX2dldDsKLQkJfQotCQlyYyA9IG1zbV9hZHNwX2VuYWJsZShhZmUtPm1vZCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGVycm9yX2Fkc3BfZW5hYmxlOwotCX0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBRkVfQ01EX0ZNX0NBTElCUkFUSU9OX0dBSU5fQ01EOwotCWNtZC5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7Ci0JY21kLmNhbGlicmF0aW9uX2dhaW4gPSBjYWxpYnJhdGlvbl9nYWluOwotCi0JYWZlX3NlbmRfcXVldWUoYWZlLCAmY21kLCBzaXplb2YoY21kKSk7Ci0KLQltdXRleF91bmxvY2soJmFmZS0+bG9jayk7Ci0JcmV0dXJuIHJjOwotZXJyb3JfYWRzcF9lbmFibGU6Ci0JbXNtX2Fkc3BfcHV0KGFmZS0+bW9kKTsKLQlhZmUtPm1vZCA9IE5VTEw7Ci1lcnJvcl9hZHNwX2dldDoKLQltdXRleF91bmxvY2soJmFmZS0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTChhZmVfY29uZmlnX2ZtX2NhbGlicmF0aW9uX2dhaW4pOwotCi1pbnQgYWZlX2NvbmZpZ19hdXhfY29kZWMoaW50IHBjbV9jdGxfdmFsdWUsIGludCBhdXhfY29kZWNfaW50Zl92YWx1ZSwKLQkJCQlpbnQgZGF0YV9mb3JtYXRfcGFkKQotewotCXN0cnVjdCBhZmVfY21kX2F1eF9jb2RlY19jb25maWcgY21kOwotCXN0cnVjdCBtc21fYWZlX3N0YXRlICphZmUgPSAmdGhlX2FmZV9zdGF0ZTsKLQlpbnQgcmMgPSAwOwotCi0JTU1fREJHKCIgY29uZmlndXJlIGF1eCBjb2RlYyBcbiIpOwotCW11dGV4X2xvY2soJmFmZS0+bG9jayk7Ci0JaWYgKCFhZmUtPmluX3VzZSAmJiAhYWZlLT5hdXhfY29uZl9mbGFnKSB7Ci0JCS8qIGVuYWJsZSBhZmUgKi8KLQkJcmMgPSBtc21fYWRzcF9nZXQoIkFGRVRBU0siLCAmYWZlLT5tb2QsICZhZmUtPmFkc3Bfb3BzLCBhZmUpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlNTV9FUlIoIiVzOiBmYWlsZWQgdG8gZ2V0IEFGRVRBU0sgbW9kdWxlXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGVycm9yX2Fkc3BfZ2V0OwotCQl9Ci0JCXJjID0gbXNtX2Fkc3BfZW5hYmxlKGFmZS0+bW9kKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gZXJyb3JfYWRzcF9lbmFibGU7Ci0JfQotCWFmZS0+YXV4X2NvbmZfZmxhZyA9IDE7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQUZFX0NNRF9BVVhfQ09ERUNfQ09ORklHX0NNRDsKLQljbWQuZG1hX3BhdGhfY3RsID0gMDsKLQljbWQucGNtX2N0bCA9IHBjbV9jdGxfdmFsdWU7Ci0JY21kLmVpZ2h0X2toel9pbnRfbW9kZSA9IDA7Ci0JY21kLmF1eF9jb2RlY19pbnRmX2N0bCA9IGF1eF9jb2RlY19pbnRmX3ZhbHVlOwotCWNtZC5kYXRhX2Zvcm1hdF9wYWRkaW5nX2luZm8gPSBkYXRhX2Zvcm1hdF9wYWQ7Ci0KLQlhZmVfc2VuZF9xdWV1ZShhZmUsICZjbWQsIHNpemVvZihjbWQpKTsKLQotCW11dGV4X3VubG9jaygmYWZlLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci1lcnJvcl9hZHNwX2VuYWJsZToKLQltc21fYWRzcF9wdXQoYWZlLT5tb2QpOwotCWFmZS0+bW9kID0gTlVMTDsKLWVycm9yX2Fkc3BfZ2V0OgotCW11dGV4X3VubG9jaygmYWZlLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKGFmZV9jb25maWdfYXV4X2NvZGVjKTsKLQotaW50IGFmZV9jb25maWdfcm1jX2Jsb2NrKHN0cnVjdCBhY2RiX3JtY19ibG9jayAqYWNkYl9ybWMpCi17Ci0Jc3RydWN0IGFmZV9jbWRfY2ZnX3JtYyBjbWQ7Ci0Jc3RydWN0IG1zbV9hZmVfc3RhdGUgKmFmZSA9ICZ0aGVfYWZlX3N0YXRlOwotCWludCByYyA9IDA7Ci0JaW50IGkgPSAwOwotCXVuc2lnbmVkIHNob3J0ICpwdHJtZW0gPSAodW5zaWduZWQgc2hvcnQgKikmY21kOwotCi0JTU1fREJHKCIgY29uZmlndXJlIHJtYyBibG9ja1xuIik7Ci0JbXV0ZXhfbG9jaygmYWZlLT5sb2NrKTsKLQlpZiAoIWFmZS0+aW5fdXNlICYmICFhZmUtPm1vZCkgewotCQkvKiBlbmFibGUgYWZlICovCi0JCXJjID0gbXNtX2Fkc3BfZ2V0KCJBRkVUQVNLIiwgJmFmZS0+bW9kLCAmYWZlLT5hZHNwX29wcywgYWZlKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJTU1fREJHKCIlczogZmFpbGVkIHRvIGdldCBBRkVUQVNLIG1vZHVsZVxuIiwgX19mdW5jX18pOwotCQkJZ290byBlcnJvcl9hZHNwX2dldDsKLQkJfQotCQlyYyA9IG1zbV9hZHNwX2VuYWJsZShhZmUtPm1vZCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGVycm9yX2Fkc3BfZW5hYmxlOwotCX0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBRkVfQ01EX0NGR19STUNfUEFSQU1TOwotCi0JY21kLnJtY19tb2RlID0gYWNkYl9ybWMtPnJtY19lbmFibGU7Ci0JY21kLnJtY19pcHdfbGVuZ3RoX21zID0JYWNkYl9ybWMtPnJtY19pcHdfbGVuZ3RoX21zOwotCWNtZC5ybWNfcGVha19sZW5ndGhfbXMgPSBhY2RiX3JtYy0+cm1jX3BlYWtfbGVuZ3RoX21zOwotCWNtZC5ybWNfaW5pdF9wdWxzZV9sZW5ndGhfbXMgPSBhY2RiX3JtYy0+cm1jX2luaXRfcHVsc2VfbGVuZ3RoX21zOwotCWNtZC5ybWNfdG90YWxfaW50X2xlbmd0aF9tcyA9IGFjZGJfcm1jLT5ybWNfdG90YWxfaW50X2xlbmd0aF9tczsKLQljbWQucm1jX3JhbXB1cGRuX2xlbmd0aF9tcyA9IGFjZGJfcm1jLT5ybWNfcmFtcHVwZG5fbGVuZ3RoX21zOwotCWNtZC5ybWNfZGVsYXlfbGVuZ3RoX21zID0gYWNkYl9ybWMtPnJtY19kZWxheV9sZW5ndGhfbXM7Ci0JY21kLnJtY19kZXRlY3Rfc3RhcnRfdGhyZXNoZGIgPSBhY2RiX3JtYy0+cm1jX2RldGVjdF9zdGFydF90aHJlc2hkYjsKLQljbWQucm1jX2luaXRfcHVsc2VfdGhyZXNoZGIgPSBhY2RiX3JtYy0+cm1jX2luaXRfcHVsc2VfdGhyZXNoZGI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNtZCkvMjsgaSsrLCArK3B0cm1lbSkKLQkJTU1fREJHKCJjbWRbJWRdPTB4JTA0eFxuIiwgaSwgKnB0cm1lbSk7Ci0JYWZlX3NlbmRfcXVldWUoYWZlLCAmY21kLCBzaXplb2YoY21kKSk7Ci0KLQltdXRleF91bmxvY2soJmFmZS0+bG9jayk7Ci0JcmV0dXJuIHJjOwotZXJyb3JfYWRzcF9lbmFibGU6Ci0JbXNtX2Fkc3BfcHV0KGFmZS0+bW9kKTsKLQlhZmUtPm1vZCA9IE5VTEw7Ci1lcnJvcl9hZHNwX2dldDoKLQltdXRleF91bmxvY2soJmFmZS0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTChhZmVfY29uZmlnX3JtY19ibG9jayk7Ci0KLWludCBhZmVfZGlzYWJsZSh1OCBwYXRoX2lkKQotewotCXN0cnVjdCBtc21fYWZlX3N0YXRlICphZmUgPSAmdGhlX2FmZV9zdGF0ZTsKLQlpbnQgcmM7Ci0KLQltdXRleF9sb2NrKCZhZmUtPmxvY2spOwotCi0JQlVHX09OKCFhZmUtPmluX3VzZSk7Ci0JTU1fREJHKCIlcygpIHBhdGhfaWQ6JWQgY29kZWMgc3RhdGU6JWRcbiIsIF9fZnVuY19fLCBwYXRoX2lkLAotCWFmZS0+Y29kZWNfY29uZmlnW0dFVERFVklDRUlEKHBhdGhfaWQpXSk7Ci0JYWZlX2RzcF9jb2RlY19jb25maWcoYWZlLCBwYXRoX2lkLCAwLCBOVUxMKTsKLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhZmUtPndhaXQsCi0JCSFhZmUtPmNvZGVjX2NvbmZpZ1tHRVRERVZJQ0VJRChwYXRoX2lkKV0sCi0JCW1zZWNzX3RvX2ppZmZpZXMoQUZFX01BWF9USU1FT1VUKSk7Ci0JaWYgKCFyYykgewotCQlNTV9FUlIoIkFGRSBmYWlsZWQgdG8gcmVzcG9uZCB3aXRoaW4gJWQgbXNcbiIsIEFGRV9NQVhfVElNRU9VVCk7Ci0JCXJjID0gLTE7Ci0JfSBlbHNlCi0JCXJjID0gMDsKLQlhZmUtPmluX3VzZS0tOwotCU1NX0RCRygiJXMoKSBpbl91c2U6JWQgXG4iLCBfX2Z1bmNfXywgYWZlLT5pbl91c2UpOwotCWlmICghYWZlLT5pbl91c2UpIHsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhZmUtPm1vZCk7Ci0JCW1zbV9hZHNwX3B1dChhZmUtPm1vZCk7Ci0JCWFmZS0+YXV4X2NvbmZfZmxhZyA9IDA7Ci0JCWFmZS0+bW9kID0gTlVMTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhZmUtPmxvY2spOwotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0woYWZlX2Rpc2FibGUpOwotCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBpbnQgYWZlX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlNTV9JTkZPKCJkZWJ1ZyBpbnRmICVzXG4iLCAoY2hhciAqKSBmaWxlLT5wcml2YXRlX2RhdGEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZmVfZGVidWdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsCi0JY29uc3QgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKLXsKLQljaGFyICpsYl9zdHIgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBjbWQ7Ci0KLQlpZiAoZ2V0X3VzZXIoY21kLCB1YnVmKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlNTV9JTkZPKCIlcyAlY1xuIiwgbGJfc3RyLCBjbWQpOwotCi0JaWYgKCFzdHJjbXAobGJfc3RyLCAiYWZlX2xvb3BiYWNrIikpIHsKLQkJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSAnMSc6Ci0JCQlhZmVfbG9vcGJhY2soMSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnMCc6Ci0JCQlhZmVfbG9vcGJhY2soMCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiBjbnQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmZV9kZWJ1Z19mb3BzID0gewotCS5vcGVuID0gYWZlX2RlYnVnX29wZW4sCi0JLndyaXRlID0gYWZlX2RlYnVnX3dyaXRlCi19OwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgX19pbml0IGFmZV9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IG1zbV9hZmVfc3RhdGUgKmFmZSA9ICZ0aGVfYWZlX3N0YXRlOwotCi0JTU1fSU5GTygiQUZFIGRyaXZlciBpbml0XG4iKTsKLQotCW1lbXNldChhZmUsIDAsIHNpemVvZihzdHJ1Y3QgbXNtX2FmZV9zdGF0ZSkpOwotCWFmZS0+YWRzcF9vcHMuZXZlbnQgPSBhZmVfZHNwX2V2ZW50OwotCW11dGV4X2luaXQoJmFmZS0+bG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYWZlLT53YWl0KTsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCWRlYnVnZnNfYWZlbGIgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhZmVfbG9vcGJhY2siLAotCVNfSUZSRUcgfCBTX0lXVUdPLCBOVUxMLCAodm9pZCAqKSAiYWZlX2xvb3BiYWNrIiwKLQkmYWZlX2RlYnVnX2ZvcHMpOwotI2VuZGlmCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGFmZV9leGl0KHZvaWQpCi17Ci0JTU1fSU5GTygiQUZFIGRyaXZlciBleGl0XG4iKTsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlpZiAoZGVidWdmc19hZmVsYikKLQkJZGVidWdmc19yZW1vdmUoZGVidWdmc19hZmVsYik7Ci0jZW5kaWYKLQlpZiAodGhlX2FmZV9zdGF0ZS5tb2QpCi0JCW1zbV9hZHNwX3B1dCh0aGVfYWZlX3N0YXRlLm1vZCk7Ci0JcmV0dXJuOwotfQotCi1tb2R1bGVfaW5pdChhZmVfaW5pdCk7Ci1tb2R1bGVfZXhpdChhZmVfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIEFGRSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fYTJkcF9pbi5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19hMmRwX2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjQ0ZjAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19hMmRwX2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMC0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBzYmMvcGNtIGF1ZGlvIGlucHV0IGRyaXZlcgotICogQmFzZWQgb24gdGhlIHBjbSBpbnB1dCBkcml2ZXIgaW4gYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19wY21faW4uYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoYykgMjAxMiBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBBbGwgc291cmNlIGNvZGUgaW4gdGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBleGNlcHQKLSAqIHdoZXJlIGluZGljYXRlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCi0gKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fc2JjLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9hbGxvYy5oPgotCi0jaW5jbHVkZSA8bWFjaC9pb21tdS5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXVfZG9tYWlucy5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9tZW10eXBlcy5oPgotI2luY2x1ZGUgPG1hY2gvc29jaW5mby5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHJlY2NtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRyZWNtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkcHJlcHJvYy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19kZXZfY3RsLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi0vKiBGUkFNRV9OVU0gbXVzdCBiZSBhIHBvd2VyIG9mIHR3byAqLwotI2RlZmluZSBGUkFNRV9OVU0JCSg4KQotI2RlZmluZSBGUkFNRV9TSVpFCQkoMjA1MiAqIDIpCi0jZGVmaW5lIEZSQU1FX1NJWkVfU0JDCQkoNzY4ICogMikKLSNkZWZpbmUgTU9OT19EQVRBX1NJWkUJCSgyMDQ4KQotI2RlZmluZSBTVEVSRU9fREFUQV9TSVpFCShNT05PX0RBVEFfU0laRSAqIDIpCi0jZGVmaW5lIERNQVNaIAkJCShGUkFNRV9TSVpFICogRlJBTUVfTlVNKQotCi1zdHJ1Y3QgYnVmZmVyIHsKLQl2b2lkICpkYXRhOwotCXVpbnQzMl90IHNpemU7Ci0JdWludDMyX3QgcmVhZDsKLQl1aW50MzJfdCBhZGRyOwotCXVpbnQzMl90IGZyYW1lX251bTsKLQl1aW50MzJfdCBmcmFtZV9sZW47Ci19OwotCi1zdHJ1Y3QgYXVkaW9fYTJkcF9pbiB7Ci0Jc3RydWN0IGJ1ZmZlciBpbltGUkFNRV9OVU1dOwotCi0Jc3BpbmxvY2tfdCBkc3BfbG9jazsKLQotCWF0b21pY190IGluX2J5dGVzOwotCWF0b21pY190IGluX3NhbXBsZXM7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggcmVhZF9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9lbmFibGU7Ci0KLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICphdWRyZWM7Ci0KLQlzdHJ1Y3QgYXVkcmVjX3Nlc3Npb25faW5mbyBzZXNzaW9uX2luZm87IC8qYXVkcmVjIHNlc3Npb24gaW5mbyovCi0KLQkvKiBjb25maWd1cmF0aW9uIHRvIHVzZSBvbiBuZXh0IGVuYWJsZSAqLwotCXVpbnQzMl90IHNhbXBfcmF0ZTsKLQl1aW50MzJfdCBjaGFubmVsX21vZGU7Ci0JdWludDMyX3QgYnVmZmVyX3NpemU7IC8qIDIwNDggZm9yIG1vbm8sIDQwOTYgZm9yIHN0ZXJlbyAqLwotCXVpbnQzMl90IGVuY190eXBlOwotCXN0cnVjdCBtc21fYXVkaW9fc2JjX2VuY19jb25maWcgY2ZnOwotCi0JdWludDMyX3QgZHNwX2NudDsKLQl1aW50MzJfdCBpbl9oZWFkOyAvKiBuZXh0IGJ1ZmZlciBkc3Agd2lsbCB3cml0ZSAqLwotCXVpbnQzMl90IGluX3RhaWw7IC8qIG5leHQgYnVmZmVyIHJlYWQoKSB3aWxsIHJlYWQgKi8KLQl1aW50MzJfdCBpbl9jb3VudDsgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgYXZhaWxhYmxlIHRvIHJlYWQoKSAqLwotCXVpbnQzMl90IG1vZGU7Ci0KLQljb25zdCBjaGFyICptb2R1bGVfbmFtZTsKLQl1bnNpZ25lZCBxdWV1ZV9pZHM7Ci0JdWludDE2X3QgZW5jX2lkOyAvKiBTZXNzaW9uIElkICovCi0KLQl1aW50MTZfdCBzb3VyY2U7IC8qIEVuY29kaW5nIHNvdXJjZSBiaXQgbWFzayAqLwotCXVpbnQzMl90IGRldmljZV9ldmVudHM7IC8qIGRldmljZSBldmVudHMgaW50ZXJlc3RlZCBpbiAqLwotCXVpbnQzMl90IGRldl9jbnQ7Ci0Jc3BpbmxvY2tfdCBkZXZfbG9jazsKLQotCS8qIGRhdGEgYWxsb2NhdGVkIGZvciB2YXJpb3VzIGJ1ZmZlcnMgKi8KLQljaGFyICpkYXRhOwotCWRtYV9hZGRyX3QgcGh5czsKLQl2b2lkICptc21fbWFwOwotCi0JaW50IG9wZW5lZDsKLQlpbnQgZW5hYmxlZDsKLQlpbnQgcnVubmluZzsKLQlpbnQgc3RvcHBlZDsgLyogc2V0IHdoZW4gc3RvcHBlZCwgY2xlYXJlZCBvbiBmbHVzaCAqLwotCWludCBhYm9ydDsgLyogc2V0IHdoZW4gZXJyb3IsIGxpa2Ugc2FtcGxlIHJhdGUgbWlzbWF0Y2ggKi8KLQljaGFyICpidWlsZF9pZDsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBpb25faGFuZGxlICpvdXRwdXRfYnVmZl9oYW5kbGU7Ci19OwotCi1zdGF0aWMgc3RydWN0IGF1ZGlvX2EyZHBfaW4gdGhlX2F1ZGlvX2EyZHBfaW47Ci0KLXN0cnVjdCB3YXZfZnJhbWUgewotCXVpbnQxNl90IGZyYW1lX2NvdW50X2xzdzsKLQl1aW50MTZfdCBmcmFtZV9jb3VudF9tc3c7Ci0JdWludDE2X3QgZnJhbWVfbGVuZ3RoOwotCXVpbnQxNl90IGVyYXNlZF9hMmRwOwotCXVuc2lnbmVkIGNoYXIgcmF3X2JpdHN0cmVhbVtdOyAvKiBzYW1wbGVzICovCi19OwotCi1zdHJ1Y3Qgc2JjX2ZyYW1lIHsKLQl1aW50MTZfdCBiaXRfcmF0ZV9tc3c7Ci0JdWludDE2X3QgYml0X3JhdGVfbHN3OwotCXVpbnQxNl90IGZyYW1lX2xlbmd0aDsKLQl1aW50MTZfdCBmcmFtZV9udW07Ci0JdW5zaWduZWQgY2hhciByYXdfYml0c3RyZWFtW107IC8qIHNhbXBsZXMgKi8KLX07Ci0KLXN0cnVjdCBhdWRpb19mcmFtZSB7Ci0JdW5pb24gewotCQlzdHJ1Y3Qgd2F2X2ZyYW1lIHdhdjsKLQkJc3RydWN0IHNiY19mcmFtZSBzYmM7Ci0JfSBhMmRwOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyogQXVkcmVjIFF1ZXVlIGNvbW1hbmQgc2VudCBtYWNybydzICovCi0jZGVmaW5lIGF1ZHJlY19zZW5kX2JpdHN0cmVhbXF1ZXVlKGF1ZGlvLCBjbWQsIGxlbikgXAotCW1zbV9hZHNwX3dyaXRlKGF1ZGlvLT5hdWRyZWMsICgoYXVkaW8tPnF1ZXVlX2lkcyAmIDB4RkZGRjAwMDApID4+IDE2KSxcCi0JCQljbWQsIGxlbikKLQotI2RlZmluZSBhdWRyZWNfc2VuZF9hdWRyZWNxdWV1ZShhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcmVjLCAoYXVkaW8tPnF1ZXVlX2lkcyAmIDB4MDAwMEZGRkYpLFwKLQkJCWNtZCwgbGVuKQotCi0vKiBEU1AgY29tbWFuZCBzZW5kIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBhdWRhMmRwX2luX2VuY19jb25maWcoc3RydWN0IGF1ZGlvX2EyZHBfaW4gKmF1ZGlvLCBpbnQgZW5hYmxlKTsKLXN0YXRpYyBpbnQgYXVkYTJkcF9pbl9wYXJhbV9jb25maWcoc3RydWN0IGF1ZGlvX2EyZHBfaW4gKmF1ZGlvKTsKLXN0YXRpYyBpbnQgYXVkYTJkcF9pbl9tZW1fY29uZmlnKHN0cnVjdCBhdWRpb19hMmRwX2luICphdWRpbyk7Ci1zdGF0aWMgaW50IGF1ZGEyZHBfaW5fcmVjb3JkX2NvbmZpZyhzdHJ1Y3QgYXVkaW9fYTJkcF9pbiAqYXVkaW8sIGludCBlbmFibGUpOwotc3RhdGljIGludCBhdWRhMmRwX2RzcF9yZWFkX2J1ZmZlcihzdHJ1Y3QgYXVkaW9fYTJkcF9pbiAqYXVkaW8sCi0JCQkJCQkJdWludDMyX3QgcmVhZF9jbnQpOwotCi1zdGF0aWMgdm9pZCBhdWRhMmRwX2luX2dldF9kc3BfZnJhbWVzKHN0cnVjdCBhdWRpb19hMmRwX2luICphdWRpbyk7Ci0KLXN0YXRpYyB2b2lkIGF1ZGEyZHBfaW5fZmx1c2goc3RydWN0IGF1ZGlvX2EyZHBfaW4gKmF1ZGlvKTsKLQotc3RhdGljIHZvaWQgYTJkcF9pbl9saXN0ZW5lcih1MzIgZXZ0X2lkLCB1bmlvbiBhdWRkZXZfZXZ0X2RhdGEgKmV2dF9wYXlsb2FkLAotCQkJCXZvaWQgKnByaXZhdGVfZGF0YSkKLXsKLQlzdHJ1Y3QgYXVkaW9fYTJkcF9pbiAqYXVkaW8gPSAoc3RydWN0IGF1ZGlvX2EyZHBfaW4gKikgcHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlNTV9EQkcoImV2dF9pZCA9IDB4JTh4XG4iLCBldnRfaWQpOwotCXN3aXRjaCAoZXZ0X2lkKSB7Ci0JY2FzZSBBVURERVZfRVZUX0RFVl9SRFk6IHsKLQkJTU1fREJHKCJBVURERVZfRVZUX0RFVl9SRFlcbiIpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRldl9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT5kZXZfY250Kys7Ci0JCWF1ZGlvLT5zb3VyY2UgfD0gKDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCi0JCWlmICgoYXVkaW8tPnJ1bm5pbmcgPT0gMSkgJiYgKGF1ZGlvLT5lbmFibGVkID09IDEpKQotCQkJYXVkYTJkcF9pbl9yZWNvcmRfY29uZmlnKGF1ZGlvLCAxKTsKLQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURERVZfRVZUX0RFVl9STFM6IHsKLQkJTU1fREJHKCJBVURERVZfRVZUX0RFVl9STFNcbiIpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRldl9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT5kZXZfY250LS07Ci0JCWF1ZGlvLT5zb3VyY2UgJj0gfigweDEgPDwgZXZ0X3BheWxvYWQtPnJvdXRpbmdfaWQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZGV2X2xvY2ssIGZsYWdzKTsKLQotCQlpZiAoIWF1ZGlvLT5ydW5uaW5nIHx8ICFhdWRpby0+ZW5hYmxlZCkKLQkJCWJyZWFrOwotCi0JCS8qIFR1cm4gb2YgYXMgcGVyIHNvdXJjZSAqLwotCQlpZiAoYXVkaW8tPnNvdXJjZSkKLQkJCWF1ZGEyZHBfaW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMSk7Ci0JCWVsc2UKLQkJCS8qIFR1cm4gb2ZmIGFsbCAqLwotCQkJYXVkYTJkcF9pbl9yZWNvcmRfY29uZmlnKGF1ZGlvLCAwKTsKLQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURERVZfRVZUX0ZSRVFfQ0hHOiB7Ci0JCU1NX0RCRygiRW5jb2RlciBEcml2ZXIgZ290IHNhbXBsZSByYXRlIGNoYW5nZSBldmVudFxuIik7Ci0JCU1NX0RCRygic2FtcGxlIHJhdGUgJWRcbiIsIGV2dF9wYXlsb2FkLT5mcmVxX2luZm8uc2FtcGxlX3JhdGUpOwotCQlNTV9EQkcoImRldl90eXBlICVkXG4iLCBldnRfcGF5bG9hZC0+ZnJlcV9pbmZvLmRldl90eXBlKTsKLQkJTU1fREJHKCJhY2RiX2Rldl9pZCAlZFxuIiwgZXZ0X3BheWxvYWQtPmZyZXFfaW5mby5hY2RiX2Rldl9pZCk7Ci0JCWlmIChhdWRpby0+cnVubmluZyA9PSAxKSB7Ci0JCQkvKiBTdG9wIFJlY29yZGluZyBzYW1wbGUgcmF0ZSBkb2VzIG5vdCBtYXRjaAotCQkJICAgd2l0aCBkZXZpY2Ugc2FtcGxlIHJhdGUgKi8KLQkJCWlmIChldnRfcGF5bG9hZC0+ZnJlcV9pbmZvLnNhbXBsZV9yYXRlICE9Ci0JCQkJYXVkaW8tPnNhbXBfcmF0ZSkgewotCQkJCWF1ZGEyZHBfaW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMCk7Ci0JCQkJYXVkaW8tPmFib3J0ID0gMTsKLQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigid3JvbmcgZXZlbnQgJWRcbiIsIGV2dF9pZCk7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkc3AgcHJlcHJvYyBldmVudCBoYW5kbGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgdm9pZCBhdWRwcmVwcm9jX2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgIHZvaWQgKm1zZykKLXsKLQlzdHJ1Y3QgYXVkaW9fYTJkcF9pbiAqYXVkaW8gPSBkYXRhOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUFJFUFJPQ19FUlJPUl9NU0c6IHsKLQkJc3RydWN0IGF1ZHByZXByb2NfZXJyX21zZyAqZXJyX21zZyA9IG1zZzsKLQotCQlNTV9FUlIoIkVSUk9SX01TRzogc3RyZWFtIGlkICVkIGVyciBpZHggJWRcbiIsCi0JCWVycl9tc2ctPnN0cmVhbV9pZCwgZXJyX21zZy0+YXVkX3ByZXByb2NfZXJyX2lkeCk7Ci0JCS8qIEVycm9yIGNhc2UgKi8KLQkJd2FrZV91cCgmYXVkaW8tPndhaXRfZW5hYmxlKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFJFUFJPQ19DTURfQ0ZHX0RPTkVfTVNHOiB7Ci0JCU1NX0RCRygiQ01EX0NGR19ET05FX01TRyBcbiIpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURQUkVQUk9DX0NNRF9FTkNfQ0ZHX0RPTkVfTVNHOiB7Ci0JCXN0cnVjdCBhdWRwcmVwcm9jX2NtZF9lbmNfY2ZnX2RvbmVfbXNnICplbmNfY2ZnX21zZyA9IG1zZzsKLQotCQlNTV9EQkcoIkNNRF9FTkNfQ0ZHX0RPTkVfTVNHOiBzdHJlYW0gaWQgJWQgZW5jIHR5cGUgXAotCQkJMHglOHhcbiIsIGVuY19jZmdfbXNnLT5zdHJlYW1faWQsCi0JCQllbmNfY2ZnX21zZy0+cmVjX2VuY190eXBlKTsKLQkJLyogRW5jb2RlciBlbmFibGUgc3VjY2VzcyAqLwotCQlpZiAoZW5jX2NmZ19tc2ctPnJlY19lbmNfdHlwZSAmIEVOQ09ERV9FTkFCTEUpCi0JCQlhdWRhMmRwX2luX3BhcmFtX2NvbmZpZyhhdWRpbyk7Ci0JCWVsc2UgeyAvKiBFbmNvZGVyIGRpc2FibGUgc3VjY2VzcyAqLwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAwOwotCQkJYXVkYTJkcF9pbl9yZWNvcmRfY29uZmlnKGF1ZGlvLCAwKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURQUkVQUk9DX0NNRF9FTkNfUEFSQU1fQ0ZHX0RPTkVfTVNHOiB7Ci0JCU1NX0RCRygiQ01EX0VOQ19QQVJBTV9DRkdfRE9ORV9NU0cgXG4iKTsKLQkJYXVkYTJkcF9pbl9tZW1fY29uZmlnKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFJFUFJPQ19BRkVfQ01EX0FVRElPX1JFQ09SRF9DRkdfRE9ORV9NU0c6IHsKLQkJTU1fREJHKCJBRkVfQ01EX0FVRElPX1JFQ09SRF9DRkdfRE9ORV9NU0cgXG4iKTsKLQkJd2FrZV91cCgmYXVkaW8tPndhaXRfZW5hYmxlKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiVW5rbm93biBFdmVudCBpZCAlZFxuIiwgaWQpOwotCX0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkc3AgYXVkcmVjIGV2ZW50IGhhbmRsZXItLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZHJlY19kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgdm9pZCAoKmdldGV2ZW50KSh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRpb19hMmRwX2luICphdWRpbyA9IGRhdGE7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURSRUNfQ01EX01FTV9DRkdfRE9ORV9NU0c6IHsKLQkJTU1fREJHKCJDTURfTUVNX0NGR19ET05FIE1TRyBET05FXG4iKTsKLQkJYXVkaW8tPnJ1bm5pbmcgPSAxOwotCQlpZiAoYXVkaW8tPmRldl9jbnQgPiAwKQotCQkJYXVkYTJkcF9pbl9yZWNvcmRfY29uZmlnKGF1ZGlvLCAxKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX0ZBVEFMX0VSUl9NU0c6IHsKLQkJc3RydWN0IGF1ZHJlY19mYXRhbF9lcnJfbXNnIGZhdGFsX2Vycl9tc2c7Ci0KLQkJZ2V0ZXZlbnQoJmZhdGFsX2Vycl9tc2csIEFVRFJFQ19GQVRBTF9FUlJfTVNHX0xFTik7Ci0JCU1NX0VSUigiRkFUQUxfRVJSX01TRzogZXJyIGlkICVkXG4iLAotCQkJCWZhdGFsX2Vycl9tc2cuYXVkcmVjX2Vycl9pZCk7Ci0JCS8qIEVycm9yIHN0b3AgdGhlIGVuY29kZXIgKi8KLQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19VUF9QQUNLRVRfUkVBRFlfTVNHOiB7Ci0JCXN0cnVjdCBhdWRyZWNfdXBfcGt0X3JlYWR5X21zZyBwa3RfcmVhZHlfbXNnOwotCi0JCWdldGV2ZW50KCZwa3RfcmVhZHlfbXNnLCBBVURSRUNfVVBfUEFDS0VUX1JFQURZX01TR19MRU4pOwotCQlNTV9EQkcoIlVQX1BBQ0tFVF9SRUFEWV9NU0c6IHdyaXRlIGNudCBsc3cgICVkIFwKLQkJd3JpdGUgY250IG1zdyAlZCByZWFkIGNudCBsc3cgJWQgIHJlYWQgY250IG1zdyAlZCBcbiIsXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY19wYWNrZXRfd3JpdGVfY250X2xzdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY19wYWNrZXRfd3JpdGVfY250X21zdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY191cF9wcmV2X3JlYWRfY250X2xzdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY191cF9wcmV2X3JlYWRfY250X21zdyk7Ci0KLQkJYXVkYTJkcF9pbl9nZXRfZHNwX2ZyYW1lcyhhdWRpbyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFEU1BfTUVTU0FHRV9JRDogewotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6IG1vZHVsZSBhdWRyZWN0YXNrXG4iKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiVW5rbm93biBFdmVudCBpZCAlZFxuIiwgaWQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXVkYTJkcF9pbl9nZXRfZHNwX2ZyYW1lcyhzdHJ1Y3QgYXVkaW9fYTJkcF9pbiAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZGlvX2ZyYW1lICpmcmFtZTsKLQl1aW50MzJfdCBpbmRleDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaW5kZXggPSBhdWRpby0+aW5faGVhZDsKLQotCWZyYW1lID0gKHZvaWQgKikgKCgoY2hhciAqKWF1ZGlvLT5pbltpbmRleF0uZGF0YSkgLSBcCi0JCQkgc2l6ZW9mKCpmcmFtZSkpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWlmIChhdWRpby0+ZW5jX3R5cGUgPT0gRU5DX1RZUEVfV0FWKQotCQlhdWRpby0+aW5baW5kZXhdLnNpemUgPSBmcmFtZS0+YTJkcC53YXYuZnJhbWVfbGVuZ3RoOwotCWVsc2UgaWYgKGF1ZGlvLT5lbmNfdHlwZSA9PSBFTkNfVFlQRV9TQkMpIHsKLQkJYXVkaW8tPmluW2luZGV4XS5zaXplID0gZnJhbWUtPmEyZHAuc2JjLmZyYW1lX2xlbmd0aCAqCi0JCQkJCQlmcmFtZS0+YTJkcC5zYmMuZnJhbWVfbnVtOwotCQlhdWRpby0+aW5baW5kZXhdLmZyYW1lX251bSA9IGZyYW1lLT5hMmRwLnNiYy5mcmFtZV9udW07Ci0JCWF1ZGlvLT5pbltpbmRleF0uZnJhbWVfbGVuID0gZnJhbWUtPmEyZHAuc2JjLmZyYW1lX2xlbmd0aDsKLQl9Ci0KLQkvKiBzdGF0aXN0aWNzIG9mIHJlYWQgKi8KLQlhdG9taWNfYWRkKGF1ZGlvLT5pbltpbmRleF0uc2l6ZSwgJmF1ZGlvLT5pbl9ieXRlcyk7Ci0JYXRvbWljX2FkZCgxLCAmYXVkaW8tPmluX3NhbXBsZXMpOwotCi0JYXVkaW8tPmluX2hlYWQgPSAoYXVkaW8tPmluX2hlYWQgKyAxKSAmIChGUkFNRV9OVU0gLSAxKTsKLQotCS8qIElmIG92ZXJmbG93LCBtb3ZlIHRoZSB0YWlsIGluZGV4IGZvd2FyZC4gKi8KLQlpZiAoYXVkaW8tPmluX2hlYWQgPT0gYXVkaW8tPmluX3RhaWwpCi0JCWF1ZGlvLT5pbl90YWlsID0gKGF1ZGlvLT5pbl90YWlsICsgMSkgJiAoRlJBTUVfTlVNIC0gMSk7Ci0JZWxzZQotCQlhdWRpby0+aW5fY291bnQrKzsKLQotCWF1ZGEyZHBfZHNwX3JlYWRfYnVmZmVyKGF1ZGlvLCBhdWRpby0+ZHNwX2NudCsrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHJlY19hZHNwX29wcyA9IHsKLQkuZXZlbnQgPSBhdWRyZWNfZHNwX2V2ZW50LAotfTsKLQotc3RhdGljIGludCBhdWRhMmRwX2luX2VuY19jb25maWcoc3RydWN0IGF1ZGlvX2EyZHBfaW4gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCXN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfZW5jX2NmZyBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWlmIChhdWRpby0+YnVpbGRfaWRbMTddID09ICcxJykgewotCQljbWQuY21kX2lkID0gQVVEUFJFUFJPQ19BVURSRUNfQ01EX0VOQ19DRkdfMjsKLQl9IGVsc2UgewotCQljbWQuY21kX2lkID0gQVVEUFJFUFJPQ19BVURSRUNfQ01EX0VOQ19DRkc7Ci0JfQotCWNtZC5zdHJlYW1faWQgPSBhdWRpby0+ZW5jX2lkOwotCi0JaWYgKGVuYWJsZSkKLQkJY21kLmF1ZHJlY19lbmNfdHlwZSA9IGF1ZGlvLT5lbmNfdHlwZSB8IEVOQ09ERV9FTkFCTEU7Ci0JZWxzZQotCQljbWQuYXVkcmVjX2VuY190eXBlICY9IH4oRU5DT0RFX0VOQUJMRSk7Ci0KLQlyZXR1cm4gYXVkcHJlcHJvY19zZW5kX2F1ZHJlY2NtZHF1ZXVlKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRhMmRwX2luX3BhcmFtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9fYTJkcF9pbiAqYXVkaW8pCi17Ci0JaWYgKGF1ZGlvLT5lbmNfdHlwZSA9PSBFTkNfVFlQRV9XQVYpIHsKLQkJc3RydWN0IGF1ZHByZXByb2NfYXVkcmVjX2NtZF9wYXJtX2NmZ193YXYgY21kOwotCi0JCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JCWNtZC5jb21tb24uY21kX2lkID0gQVVEUFJFUFJPQ19BVURSRUNfQ01EX1BBUkFNX0NGRzsKLQkJY21kLmNvbW1vbi5zdHJlYW1faWQgPSBhdWRpby0+ZW5jX2lkOwotCi0JCWNtZC5hdWRfcmVjX3NhbXBsZXJhdGVfaWR4ID0gYXVkaW8tPnNhbXBfcmF0ZTsKLQkJY21kLmF1ZF9yZWNfc3RlcmVvX21vZGUgPSBhdWRpby0+Y2hhbm5lbF9tb2RlOwotCQlyZXR1cm4gYXVkcHJlcHJvY19zZW5kX2F1ZHJlY2NtZHF1ZXVlKCZjbWQsIHNpemVvZihjbWQpKTsKLQl9IGVsc2UgaWYgKGF1ZGlvLT5lbmNfdHlwZSA9PSBFTkNfVFlQRV9TQkMpIHsKLQkJc3RydWN0IGF1ZHByZXByb2NfYXVkcmVjX2NtZF9wYXJtX2NmZ19zYmMgY21kOwotCi0JCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JCWNtZC5jb21tb24uY21kX2lkID0gQVVEUFJFUFJPQ19BVURSRUNfQ01EX1BBUkFNX0NGRzsKLQkJY21kLmNvbW1vbi5zdHJlYW1faWQgPSBhdWRpby0+ZW5jX2lkOwotCQljbWQuYXVkX3JlY19zYmNfZW5jX3BhcmFtID0KLQkJCShhdWRpby0+Y2ZnLm51bWJlcl9vZl9ibG9ja3MgPDwKLQkJCUFVRFJFQ19TQkNfRU5DX1BBUkFNX05VTV9TVUJfQkxPQ0tTX01BU0spIHwKLQkJCShhdWRpby0+Y2ZnLm51bWJlcl9vZl9zdWJiYW5kcyA8PAotCQkJQVVEUkVDX1NCQ19FTkNfUEFSQU1fTlVNX1NVQl9CQU5EU19NQVNLKSB8Ci0JCQkoYXVkaW8tPmNmZy5tb2RlIDw8Ci0JCQlBVURSRUNfU0JDX0VOQ19QQVJBTV9NT0RFX01BU0spIHwKLQkJCShhdWRpby0+Y2ZnLmJpdF9hbGxvY2F0aW9uIDw8Ci0JCQlBVURSRUNfU0JDX0VOQ19QQVJBTV9CSVRfQUxMT0NfTUFTSyk7Ci0JCWNtZC5hdWRfcmVjX3NiY19iaXRfcmF0ZV9tc3cgPQotCQkJKGF1ZGlvLT5jZmcuYml0X3JhdGUgJiAweEZGRkYwMDAwKSA+PiAxNjsKLQkJY21kLmF1ZF9yZWNfc2JjX2JpdF9yYXRlX2xzdyA9Ci0JCQkoYXVkaW8tPmNmZy5iaXRfcmF0ZSAmIDB4RkZGRik7Ci0JCXJldHVybiBhdWRwcmVwcm9jX3NlbmRfYXVkcmVjY21kcXVldWUoJmNtZCwgc2l6ZW9mKGNtZCkpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogVG8gRG86IG1zbV9zbmRkZXZfcm91dGVfZW5jKGF1ZGlvLT5lbmNfaWQpOyAqLwotc3RhdGljIGludCBhdWRhMmRwX2luX3JlY29yZF9jb25maWcoc3RydWN0IGF1ZGlvX2EyZHBfaW4gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCXN0cnVjdCBhdWRwcmVwcm9jX2FmZV9jbWRfYXVkaW9fcmVjb3JkX2NmZyBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURQUkVQUk9DX0FGRV9DTURfQVVESU9fUkVDT1JEX0NGRzsKLQljbWQuc3RyZWFtX2lkID0gYXVkaW8tPmVuY19pZDsKLQlpZiAoZW5hYmxlKQotCQljbWQuZGVzdGluYXRpb25fYWN0aXZpdHkgPSBBVURJT19SRUNPUkRJTkdfVFVSTl9PTjsKLQllbHNlCi0JCWNtZC5kZXN0aW5hdGlvbl9hY3Rpdml0eSA9IEFVRElPX1JFQ09SRElOR19UVVJOX09GRjsKLQotCWNtZC5zb3VyY2VfbWl4X21hc2sgPSBhdWRpby0+c291cmNlOwotCWlmIChhdWRpby0+ZW5jX2lkID09IDIpIHsKLQkJaWYgKChjbWQuc291cmNlX21peF9tYXNrICYKLQkJCQlJTlRFUk5BTF9DT0RFQ19UWF9TT1VSQ0VfTUlYX01BU0spIHx8Ci0JCQkoY21kLnNvdXJjZV9taXhfbWFzayAmIEFVWF9DT0RFQ19UWF9TT1VSQ0VfTUlYX01BU0spIHx8Ci0JCQkoY21kLnNvdXJjZV9taXhfbWFzayAmIFZPSUNFX1VMX1NPVVJDRV9NSVhfTUFTSykgfHwKLQkJCShjbWQuc291cmNlX21peF9tYXNrICYgVk9JQ0VfRExfU09VUkNFX01JWF9NQVNLKSkgewotCQkJY21kLnBpcGVfaWQgPSBTT1VSQ0VfUElQRV8xOwotCQl9Ci0JCWlmIChjbWQuc291cmNlX21peF9tYXNrICYKLQkJCQlBVURQUF9BMkRQX1BJUEVfU09VUkNFX01JWF9NQVNLKQotCQkJY21kLnBpcGVfaWQgfD0gU09VUkNFX1BJUEVfMDsKLQl9Ci0JcmV0dXJuIGF1ZHByZXByb2Nfc2VuZF9hdWRyZWNjbWRxdWV1ZSgmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkYTJkcF9pbl9tZW1fY29uZmlnKHN0cnVjdCBhdWRpb19hMmRwX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9hcmVjbWVtX2NmZyBjbWQ7Ci0JdWludDE2X3QgKmRhdGEgPSAodm9pZCAqKSBhdWRpby0+ZGF0YTsKLQlpbnQgbjsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfTUVNX0NGR19DTUQ7Ci0JY21kLmF1ZHJlY191cF9wa3RfaW50bV9jb3VudCA9IDE7Ci0JY21kLmF1ZHJlY19leHRfcGt0X3N0YXJ0X2FkZHJfbXN3ID0gYXVkaW8tPnBoeXMgPj4gMTY7Ci0JY21kLmF1ZHJlY19leHRfcGt0X3N0YXJ0X2FkZHJfbHN3ID0gYXVkaW8tPnBoeXM7Ci0JY21kLmF1ZHJlY19leHRfcGt0X2J1Zl9udW1iZXIgPSBGUkFNRV9OVU07Ci0KLQkvKiBwcmVwYXJlIGJ1ZmZlciBwb2ludGVyczoKLQkgKiBXYXY6Ci0JICogTW9ubzogMTAyNCBzYW1wbGVzICsgNCBoYWxmd29yZCBoZWFkZXIKLQkgKiBTdGVyZW86IDIwNDggc2FtcGxlcyArIDQgaGFsZndvcmQgaGVhZGVyCi0JICogU0JDOgotCSAqIDc2OCArIDQgaGFsZndvcmQgaGVhZGVyCi0JICovCi0JaWYgKGF1ZGlvLT5lbmNfdHlwZSA9PSBFTkNfVFlQRV9TQkMpIHsKLQkJZm9yIChuID0gMDsgbiA8IEZSQU1FX05VTTsgbisrKSB7Ci0JCQlhdWRpby0+aW5bbl0uZGF0YSA9IGRhdGEgKyA0OwotCQkJZGF0YSArPSAoNCArIChGUkFNRV9TSVpFX1NCQy8yKSk7Ci0JCQlNTV9EQkcoIjB4JTh4XG4iLCAoaW50KShhdWRpby0+aW5bbl0uZGF0YSAtIDgpKTsKLQkJfQotCX0gZWxzZSBpZiAoYXVkaW8tPmVuY190eXBlID09IEVOQ19UWVBFX1dBVikgewotCQlmb3IgKG4gPSAwOyBuIDwgRlJBTUVfTlVNOyBuKyspIHsKLQkJCWF1ZGlvLT5pbltuXS5kYXRhID0gZGF0YSArIDQ7Ci0JCQlkYXRhICs9ICg0ICsgKGF1ZGlvLT5jaGFubmVsX21vZGUgPyAyMDQ4IDogMTAyNCkpOwotCQkJTU1fREJHKCIweCU4eFxuIiwgKGludCkoYXVkaW8tPmluW25dLmRhdGEgLSA4KSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gYXVkcmVjX3NlbmRfYXVkcmVjcXVldWUoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRhMmRwX2RzcF9yZWFkX2J1ZmZlcihzdHJ1Y3QgYXVkaW9fYTJkcF9pbiAqYXVkaW8sCi0JCQkJCQkJdWludDMyX3QgcmVhZF9jbnQpCi17Ci0Jc3RydWN0IHVwX2F1ZHJlY19wYWNrZXRfZXh0X3B0ciBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBVUF9BVURSRUNfUEFDS0VUX0VYVF9QVFI7Ci0JY21kLmF1ZHJlY191cF9jdXJyX3JlYWRfY291bnRfbXN3ID0gcmVhZF9jbnQgPj4gMTY7Ci0JY21kLmF1ZHJlY191cF9jdXJyX3JlYWRfY291bnRfbHN3ID0gcmVhZF9jbnQ7Ci0KLQlyZXR1cm4gYXVkcmVjX3NlbmRfYml0c3RyZWFtcXVldWUoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGEyZHBfaW5fZW5hYmxlKHN0cnVjdCBhdWRpb19hMmRwX2luICphdWRpbykKLXsKLQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JaWYgKGF1ZHByZXByb2NfZW5hYmxlKGF1ZGlvLT5lbmNfaWQsICZhdWRwcmVwcm9jX2RzcF9ldmVudCwgYXVkaW8pKSB7Ci0JCU1NX0VSUigibXNtX2Fkc3BfZW5hYmxlKGF1ZHByZXByb2MpIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChtc21fYWRzcF9lbmFibGUoYXVkaW8tPmF1ZHJlYykpIHsKLQkJTU1fRVJSKCJtc21fYWRzcF9lbmFibGUoYXVkcmVjKSBmYWlsZWRcbiIpOwotCQlhdWRwcmVwcm9jX2Rpc2FibGUoYXVkaW8tPmVuY19pZCwgYXVkaW8pOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JYXVkaW8tPmVuYWJsZWQgPSAxOwotCWF1ZGEyZHBfaW5fZW5jX2NvbmZpZyhhdWRpbywgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGEyZHBfaW5fZGlzYWJsZShzdHJ1Y3QgYXVkaW9fYTJkcF9pbiAqYXVkaW8pCi17Ci0JaWYgKGF1ZGlvLT5lbmFibGVkKSB7Ci0JCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJYXVkYTJkcF9pbl9lbmNfY29uZmlnKGF1ZGlvLCAwKTsKLQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdF9lbmFibGUsCi0JCQkJYXVkaW8tPnJ1bm5pbmcgPT0gMCwgMSpIWik7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHJlYyk7Ci0JCWF1ZHByZXByb2NfZGlzYWJsZShhdWRpby0+ZW5jX2lkLCBhdWRpbyk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhMmRwX2luX2ZsdXNoKHN0cnVjdCBhdWRpb19hMmRwX2luICphdWRpbykKLXsKLQlpbnQgaTsKLQotCWF1ZGlvLT5kc3BfY250ID0gMDsKLQlhdWRpby0+aW5faGVhZCA9IDA7Ci0JYXVkaW8tPmluX3RhaWwgPSAwOwotCWF1ZGlvLT5pbl9jb3VudCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IEZSQU1FX05VTTsgaSsrKSB7Ci0JCWF1ZGlvLT5pbltpXS5zaXplID0gMDsKLQkJYXVkaW8tPmluW2ldLnJlYWQgPSAwOwotCX0KLQlNTV9EQkcoImluX2J5dGVzICVkXG4iLCBhdG9taWNfcmVhZCgmYXVkaW8tPmluX2J5dGVzKSk7Ci0JTU1fREJHKCJpbl9zYW1wbGVzICVkXG4iLCBhdG9taWNfcmVhZCgmYXVkaW8tPmluX3NhbXBsZXMpKTsKLQlhdG9taWNfc2V0KCZhdWRpby0+aW5fYnl0ZXMsIDApOwotCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9zYW1wbGVzLCAwKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkZXZpY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgbG9uZyBhdWRhMmRwX2luX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhdWRpb19hMmRwX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfU1RBVFMpIHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyBzdGF0czsKLQkJc3RhdHMuYnl0ZV9jb3VudCA9IGF0b21pY19yZWFkKCZhdWRpby0+aW5fYnl0ZXMpOwotCQlzdGF0cy5zYW1wbGVfY291bnQgPSBhdG9taWNfcmVhZCgmYXVkaW8tPmluX3NhbXBsZXMpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQl1aW50MzJfdCBmcmVxOwotCQkvKiBQb2xsIGF0IDQ4S0h6IGFsd2F5cyAqLwotCQlmcmVxID0gNDgwMDA7Ci0JCU1NX0RCRygiQVVESU9fU1RBUlRcbiIpOwotCQlyYyA9IG1zbV9zbmRkZXZfcmVxdWVzdF9mcmVxKCZmcmVxLCBhdWRpby0+ZW5jX2lkLAotCQkJCQlTTkRERVZfQ0FQX1RYLCBBVURERVZfQ0xOVF9FTkMpOwotCQlNTV9EQkcoInNhbXBsZSByYXRlIGNvbmZpZ3VyZWQgJWQgc2FtcGxlIHJhdGUgcmVxdWVzdGVkICVkXG4iLAotCQkJCWZyZXEsIGF1ZGlvLT5zYW1wX3JhdGUpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlNTV9EQkcoInNhbXBsZSByYXRlIGNhbiBub3QgYmUgc2V0LCByZXR1cm4gY29kZSAlZFxuIixcCi0JCQkJCQkJcmMpOwotCQkJbXNtX3NuZGRldl93aXRoZHJhd19mcmVxKGF1ZGlvLT5lbmNfaWQsCi0JCQkJCQlTTkRERVZfQ0FQX1RYLCBBVURERVZfQ0xOVF9FTkMpOwotCQkJTU1fREJHKCJtc21fc25kZGV2X3dpdGhkcmF3X2ZyZXFcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyp1cGRhdGUgYXVyZWMgc2Vzc2lvbiBpbmZvIGluIGF1ZHByZXByb2MgbGF5ZXIqLwotCQlhdWRpby0+c2Vzc2lvbl9pbmZvLnNlc3Npb25faWQgPSBhdWRpby0+ZW5jX2lkOwotCQlhdWRpby0+c2Vzc2lvbl9pbmZvLnNhbXBsaW5nX2ZyZXEgPSBhdWRpby0+c2FtcF9yYXRlOwotCQlhdWRwcmVwcm9jX3VwZGF0ZV9hdWRyZWNfaW5mbygmYXVkaW8tPnNlc3Npb25faW5mbyk7Ci0JCXJjID0gYXVkYTJkcF9pbl9lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9Ci0JCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdF9lbmFibGUsCi0JCQkJYXVkaW8tPnJ1bm5pbmcgIT0gMCwgMSpIWik7Ci0JCQlNTV9EQkcoInN0YXRlICVkIHJjID0gJWRcbiIsIGF1ZGlvLT5ydW5uaW5nLCByYyk7Ci0KLQkJCWlmIChhdWRpby0+cnVubmluZyA9PSAwKSB7Ci0JCQkJcmMgPSAtRU5PREVWOwotCQkJCW1zbV9zbmRkZXZfd2l0aGRyYXdfZnJlcShhdWRpby0+ZW5jX2lkLAotCQkJCQlTTkRERVZfQ0FQX1RYLCBBVURERVZfQ0xOVF9FTkMpOwotCQkJCU1NX0RCRygibXNtX3NuZGRldl93aXRoZHJhd19mcmVxXG4iKTsKLQkJCX0gZWxzZQotCQkJCXJjID0gMDsKLQkJfQotCQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NUT1A6IHsKLQkJLypyZXNldCB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5IGluZm9ybWF0aW9uIGF0IGF1ZHByZXByb2MgbGF5ZXIqLwotCQlhdWRpby0+c2Vzc2lvbl9pbmZvLnNhbXBsaW5nX2ZyZXEgPSAwOwotCQlhdWRwcmVwcm9jX3VwZGF0ZV9hdWRyZWNfaW5mbygmYXVkaW8tPnNlc3Npb25faW5mbyk7Ci0JCXJjID0gYXVkYTJkcF9pbl9kaXNhYmxlKGF1ZGlvKTsKLQkJcmMgPSBtc21fc25kZGV2X3dpdGhkcmF3X2ZyZXEoYXVkaW8tPmVuY19pZCwKLQkJCQkJU05EREVWX0NBUF9UWCwgQVVEREVWX0NMTlRfRU5DKTsKLQkJTU1fREJHKCJtc21fc25kZGV2X3dpdGhkcmF3X2ZyZXFcbiIpOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCWF1ZGlvLT5hYm9ydCA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0ZMVVNIOiB7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCkgewotCQkJLyogTWFrZSBzdXJlIHdlJ3JlIHN0b3BwZWQgYW5kIHdlIHdha2UgYW55IHRocmVhZHMKLQkJCSAqIHRoYXQgbWlnaHQgYmUgYmxvY2tlZCBob2xkaW5nIHRoZSByZWFkX2xvY2suCi0JCQkgKiBXaGlsZSBhdWRpby0+c3RvcHBlZCByZWFkIHRocmVhZHMgd2lsbCBhbHdheXMKLQkJCSAqIGV4aXQgaW1tZWRpYXRlbHkuCi0JCQkgKi8KLQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCQkJYXVkYTJkcF9pbl9mbHVzaChhdWRpbyk7Ci0JCQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9TVFJFQU1fQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBjZmc7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKSBhcmcsIHNpemVvZihjZmcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogQWxsb3cgb25seSBzaW5nbGUgZnJhbWUgKi8KLQkJaWYgKChhdWRpby0+ZW5jX3R5cGUgPT0gRU5DX1RZUEVfU0JDKSAmJgotCQkJCShjZmcuYnVmZmVyX3NpemUgIT0gRlJBTUVfU0laRV9TQkMpKQotCQkJcmMgPSAtRUlOVkFMOwotCQllbHNlCi0JCQlhdWRpby0+YnVmZmVyX3NpemUgPSBjZmcuYnVmZmVyX3NpemU7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9TVFJFQU1fQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBjZmc7Ci0JCW1lbXNldCgmY2ZnLCAwLCBzaXplb2YoY2ZnKSk7Ci0JCWlmIChhdWRpby0+ZW5jX3R5cGUgPT0gRU5DX1RZUEVfU0JDKQotCQkJY2ZnLmJ1ZmZlcl9zaXplID0gRlJBTUVfU0laRV9TQkM7Ci0JCWVsc2UKLQkJCWNmZy5idWZmZXJfc2l6ZSA9IE1PTk9fREFUQV9TSVpFOwotCQljZmcuYnVmZmVyX2NvdW50ID0gRlJBTUVfTlVNOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmNmZywgc2l6ZW9mKGNmZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfU0JDX0VOQ19DT05GSUc6IHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhdWRpby0+Y2ZnLCAodm9pZCAqKSBhcmcsCi0JCQkJCQlzaXplb2YoYXVkaW8tPmNmZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlhdWRpby0+c2FtcF9yYXRlID0gYXVkaW8tPmNmZy5zYW1wbGVfcmF0ZTsKLQkJYXVkaW8tPmNoYW5uZWxfbW9kZSA9IGF1ZGlvLT5jZmcuY2hhbm5lbHM7Ci0JCWF1ZGlvLT5lbmNfdHlwZSA9IEVOQ19UWVBFX1NCQzsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjZmc7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKSBhcmcsIHNpemVvZihjZmcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNmZy5jaGFubmVsX2NvdW50ID09IDEpIHsKLQkJCWNmZy5jaGFubmVsX2NvdW50ID0gQVVEUkVDX0NNRF9NT0RFX01PTk87Ci0JCQlhdWRpby0+YnVmZmVyX3NpemUgPSBNT05PX0RBVEFfU0laRTsKLQkJfSBlbHNlIGlmIChjZmcuY2hhbm5lbF9jb3VudCA9PSAyKSB7Ci0JCQljZmcuY2hhbm5lbF9jb3VudCA9IEFVRFJFQ19DTURfTU9ERV9TVEVSRU87Ci0JCQlhdWRpby0+YnVmZmVyX3NpemUgPSBTVEVSRU9fREFUQV9TSVpFOwotCQl9IGVsc2UgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPnNhbXBfcmF0ZSA9IGNmZy5zYW1wbGVfcmF0ZTsKLQkJYXVkaW8tPmNoYW5uZWxfbW9kZSA9IGNmZy5jaGFubmVsX2NvdW50OwotCQlhdWRpby0+ZW5jX3R5cGUgPSBFTkNfVFlQRV9XQVY7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9TQkNfRU5DX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3NiY19lbmNfY29uZmlnIGNmZzsKLQkJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihjZmcpKTsKLQkJY2ZnLmJpdF9hbGxvY2F0aW9uID0gYXVkaW8tPmNmZy5iaXRfYWxsb2NhdGlvbjsKLQkJY2ZnLm1vZGUgPSAgYXVkaW8tPmNmZy5tb2RlOwotCQljZmcubnVtYmVyX29mX3N1YmJhbmRzID0gYXVkaW8tPmNmZy5udW1iZXJfb2Zfc3ViYmFuZHM7Ci0JCWNmZy5udW1iZXJfb2ZfYmxvY2tzID0gYXVkaW8tPmNmZy5udW1iZXJfb2ZfYmxvY2tzOwotCQljZmcuc2FtcGxlX3JhdGUgPSBhdWRpby0+c2FtcF9yYXRlOwotCQljZmcuY2hhbm5lbHMgPSBhdWRpby0+Y2hhbm5lbF9tb2RlOwotCQljZmcuYml0X3JhdGUgPSBhdWRpby0+Y2ZnLmJpdF9yYXRlOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmNmZywgc2l6ZW9mKGNmZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNmZzsKLQkJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihjZmcpKTsKLQkJY2ZnLmJ1ZmZlcl9jb3VudCA9IEZSQU1FX05VTTsKLQkJY2ZnLnNhbXBsZV9yYXRlID0gYXVkaW8tPnNhbXBfcmF0ZTsKLQkJaWYgKGF1ZGlvLT5jaGFubmVsX21vZGUgPT0gQVVEUkVDX0NNRF9NT0RFX01PTk8pIHsKLQkJCWNmZy5jaGFubmVsX2NvdW50ID0gMTsKLQkJCWNmZy5idWZmZXJfc2l6ZSA9IE1PTk9fREFUQV9TSVpFOwotCQl9IGVsc2UgewotCQkJY2ZnLmNoYW5uZWxfY291bnQgPSAyOwotCQkJY2ZnLmJ1ZmZlcl9zaXplID0gU1RFUkVPX0RBVEFfU0laRTsKLQkJfQotCQljZmcudHlwZSA9IEVOQ19UWVBFX1dBVjsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZjZmcsIHNpemVvZihjZmcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX1NFU1NJT05fSUQ6IHsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZhdWRpby0+ZW5jX2lkLAotCQkJc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGEyZHBfaW5fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQljaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvX2EyZHBfaW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXZvaWQgKmRhdGE7Ci0JdWludDMyX3QgaW5kZXg7Ci0JdWludDMyX3Qgc2l6ZTsKLQlpbnQgcmMgPSAwOwotCXVpbnQzMl90IGZfbGVuID0gMCwgZl9udW0gPSAwOwotCWludCBpID0gMDsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCi0JCQlhdWRpby0+d2FpdCwgKGF1ZGlvLT5pbl9jb3VudCA+IDApIHx8IGF1ZGlvLT5zdG9wcGVkIHx8Ci0JCQlhdWRpby0+YWJvcnQpOwotCi0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQotCQlpZiAoYXVkaW8tPnN0b3BwZWQgJiYgIWF1ZGlvLT5pbl9jb3VudCkgewotCQkJTU1fREJHKCJEcml2ZXIgaW4gc3RvcCBzdGF0ZSwgTm8gbW9yZSBidWZmZXIgdG8gcmVhZCIpOwotCQkJcmMgPSAwOy8qIEVuZCBvZiBGaWxlICovCi0JCQlicmVhazsKLQkJfQotCi0JCWlmIChhdWRpby0+YWJvcnQpIHsKLQkJCXJjID0gLUVQRVJNOyAvKiBOb3QgcGVybWl0dGVkIGR1ZSB0byBhYm9ydCAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpbmRleCA9IGF1ZGlvLT5pbl90YWlsOwotCQlkYXRhID0gKHVpbnQ4X3QgKikgYXVkaW8tPmluW2luZGV4XS5kYXRhOwotCQlzaXplID0gYXVkaW8tPmluW2luZGV4XS5zaXplOwotCQlpZiAoY291bnQgPj0gc2l6ZSkgewotCQkJaWYgKGF1ZGlvLT5lbmNfdHlwZSA9PSBFTkNfVFlQRV9TQkMgJiYKLQkJCQkoYXVkaW8tPmluW2luZGV4XS5mcmFtZV9sZW4gJSAyKSkgewotCQkJCWZfbGVuID0gYXVkaW8tPmluW2luZGV4XS5mcmFtZV9sZW47Ci0JCQkJZl9udW0gPSBhdWRpby0+aW5baW5kZXhdLmZyYW1lX251bTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgZl9udW07IGkrKykgewotCQkJCQlpZiAoY29weV90b191c2VyKCZidWZbaSAqIGZfbGVuXSwKLQkJCQkJKHVpbnQ4X3QgKikgKGRhdGEgKyAoaSAqIChmX2xlbiArIDEpKSksCi0JCQkJCWZfbGVuKSkgewotCQkJCQkJcmMgPSAtRUZBVUxUOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBkYXRhLCBzaXplKSkgewotCQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJCWlmIChpbmRleCAhPSBhdWRpby0+aW5fdGFpbCkgewotCQkJCS8qIG92ZXJydW4gLS0gZGF0YSBpcwotCQkJCSAqIGludmFsaWQgYW5kIHdlIG5lZWQgdG8gcmV0cnkgKi8KLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9IDA7Ci0JCQlhdWRpby0+aW5fdGFpbCA9IChhdWRpby0+aW5fdGFpbCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCQkJYXVkaW8tPmluX2NvdW50LS07Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJCWNvdW50IC09IHNpemU7Ci0JCQlidWYgKz0gc2l6ZTsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigic2hvcnQgcmVhZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCWlmIChidWYgPiBzdGFydCkKLQkJcmV0dXJuIGJ1ZiAtIHN0YXJ0OwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRhMmRwX2luX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCWNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCBhdWRhMmRwX2luX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvX2EyZHBfaW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCS8qIHdpdGggZHJhdyBmcmVxdWVuY3kgZm9yIHNlc3Npb24KLQkgICBpbmNhc2Ugbm90IHN0b3BwZWQgdGhlIGRyaXZlciAqLwotCW1zbV9zbmRkZXZfd2l0aGRyYXdfZnJlcShhdWRpby0+ZW5jX2lkLCBTTkRERVZfQ0FQX1RYLAotCQkJCQlBVURERVZfQ0xOVF9FTkMpOwotCWF1ZGRldl91bnJlZ2lzdGVyX2V2dF9saXN0bmVyKEFVRERFVl9DTE5UX0VOQywgYXVkaW8tPmVuY19pZCk7Ci0JLypyZXNldCB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5IGluZm9ybWF0aW9uIGF0IGF1ZHByZXByb2MgbGF5ZXIqLwotCWF1ZGlvLT5zZXNzaW9uX2luZm8uc2FtcGxpbmdfZnJlcSA9IDA7Ci0JYXVkcHJlcHJvY191cGRhdGVfYXVkcmVjX2luZm8oJmF1ZGlvLT5zZXNzaW9uX2luZm8pOwotCWF1ZGEyZHBfaW5fZGlzYWJsZShhdWRpbyk7Ci0JYXVkYTJkcF9pbl9mbHVzaChhdWRpbyk7Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRyZWMpOwotCWF1ZHByZXByb2NfYWVuY19mcmVlKGF1ZGlvLT5lbmNfaWQpOwotCWF1ZGlvLT5hdWRyZWMgPSBOVUxMOwotCWF1ZGlvLT5vcGVuZWQgPSAwOwotCWlmIChhdWRpby0+ZGF0YSkgewotCQlpb25fdW5tYXBfa2VybmVsKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLQkJYXVkaW8tPmRhdGEgPSBOVUxMOwotCX0KLQlpb25fY2xpZW50X2Rlc3Ryb3koYXVkaW8tPmNsaWVudCk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkYTJkcF9pbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpb19hMmRwX2luICphdWRpbyA9ICZ0aGVfYXVkaW9fYTJkcF9pbjsKLQlpbnQgcmM7Ci0JaW50IGVuY2lkOwotCWludCBsZW4gPSAwOwotCXVuc2lnbmVkIGxvbmcgaW9uZmxhZyA9IDA7Ci0JaW9uX3BoeXNfYWRkcl90IGFkZHIgPSAwOwotCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUgPSBOVUxMOwotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQgPSBOVUxMOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWlmIChhdWRpby0+b3BlbmVkKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY2xpZW50ID0gbXNtX2lvbl9jbGllbnRfY3JlYXRlKFVJTlRfTUFYLCAiQXVkaW9fYTJkcF9pbl9jbGllbnQiKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoY2xpZW50KSkgewotCQlNTV9FUlIoIlVuYWJsZSB0byBjcmVhdGUgSU9OIGNsaWVudFxuIik7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gY2xpZW50X2NyZWF0ZV9lcnJvcjsKLQl9Ci0JYXVkaW8tPmNsaWVudCA9IGNsaWVudDsKLQotCU1NX0RCRygiYWxsb2NhdGluZyBtZW0gc3ogPSAlZFxuIiwgRE1BU1opOwotCWhhbmRsZSA9IGlvbl9hbGxvYyhjbGllbnQsIERNQVNaLCBTWl80SywKLQkJSU9OX0hFQVAoSU9OX0FVRElPX0hFQVBfSUQpLCAwKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoaGFuZGxlKSkgewotCQlNTV9FUlIoIlVuYWJsZSB0byBjcmVhdGUgYWxsb2NhdGUgTy9QIGJ1ZmZlcnNcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfYWxsb2NfZXJyb3I7Ci0JCX0KLQotCWF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUgPSBoYW5kbGU7Ci0KLQlyYyA9IGlvbl9waHlzKGNsaWVudCAsIGhhbmRsZSwgJmFkZHIsICZsZW4pOwotCWlmIChyYykgewotCQlNTV9FUlIoIk8vUCBidWZmZXJzOkludmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I7Ci0JfSBlbHNlIHsKLQkJTU1fSU5GTygiTy9QIGJ1ZmZlcnM6dmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCX0KLQlhdWRpby0+cGh5cyA9IChpbnQzMl90KWFkZHI7Ci0KLQlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKGNsaWVudCwgaGFuZGxlLCAmaW9uZmxhZyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiY291bGQgbm90IGdldCBmbGFncyBmb3IgdGhlIGhhbmRsZVxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRwdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I7Ci0JfQotCi0JYXVkaW8tPm1zbV9tYXAgPSBpb25fbWFwX2tlcm5lbChjbGllbnQsIGhhbmRsZSk7Ci0JaWYgKElTX0VSUihhdWRpby0+ZGF0YSkpIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgbWFwIHJlYWQgYnVmZmVycyxmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQkoaW50KWF1ZGlvKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dHB1dF9idWZmX21hcF9lcnJvcjsKLQl9Ci0JTU1fREJHKCJyZWFkIGJ1ZjogcGh5IGFkZHIgMHglMDh4IGtlcm5lbCBhZGRyIDB4JTA4eFxuIiwKLQkJYXVkaW8tPnBoeXMsIChpbnQpYXVkaW8tPmRhdGEpOwotCi0JYXVkaW8tPmRhdGEgPSAoY2hhciAqKWF1ZGlvLT5tc21fbWFwOwotCi0JTU1fREJHKCJNZW1vcnkgYWRkciA9IDB4JTh4ICBwaHkgYWRkciA9IDB4JTh4XG4iLFwKLQkJKGludCkgYXVkaW8tPmRhdGEsIChpbnQpIGF1ZGlvLT5waHlzKTsKLQotCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJTU1fRVJSKCJOb24gdHVubmVsIGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfSBlbHNlIGlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJYXVkaW8tPm1vZGUgPSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTDsKLQkJTU1fREJHKCJPcGVuZWQgZm9yIFR1bm5lbCBtb2RlIGVuY29kaW5nXG4iKTsKLQl9IGVsc2UgewotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JLyogU2V0dGluZ3Mgd2lsbCBiZSByZS1jb25maWcgYXQgQVVESU9fU0VUX0NPTkZJRy9TQkNfRU5DX0NPTkZJRywKLQkgKiBidXQgYXQgbGVhc3Qgd2UgbmVlZCB0byBoYXZlIGluaXRpYWwgY29uZmlnCi0JICovCi0JYXVkaW8tPmNoYW5uZWxfbW9kZSA9IEFVRFJFQ19DTURfTU9ERV9NT05POwotCWF1ZGlvLT5idWZmZXJfc2l6ZSA9IEZSQU1FX1NJWkVfU0JDOwotCWF1ZGlvLT5zYW1wX3JhdGUgPSA0ODAwMDsKLQlhdWRpby0+ZW5jX3R5cGUgPSBFTkNfVFlQRV9TQkMgfCBhdWRpby0+bW9kZTsKLQlhdWRpby0+Y2ZnLmJpdF9hbGxvY2F0aW9uID0gQVVESU9fU0JDX0JBX1NOUjsKLQlhdWRpby0+Y2ZnLm1vZGUgPSBBVURJT19TQkNfTU9ERV9KU1RFUkVPOwotCWF1ZGlvLT5jZmcubnVtYmVyX29mX3N1YmJhbmRzID0gQVVESU9fU0JDX0JBTkRTXzg7Ci0JYXVkaW8tPmNmZy5udW1iZXJfb2ZfYmxvY2tzID0gQVVESU9fU0JDX0JMT0NLU18xNjsKLQlhdWRpby0+Y2ZnLmJpdF9yYXRlID0gMzIwMDAwOyAvKiBtYXggNTEya2Jwcyhtb25vKSwgMzIwa2JzKG90aGVycykgKi8KLQotCWVuY2lkID0gYXVkcHJlcHJvY19hZW5jX2FsbG9jKGF1ZGlvLT5lbmNfdHlwZSwgJmF1ZGlvLT5tb2R1bGVfbmFtZSwKLQkJCSZhdWRpby0+cXVldWVfaWRzKTsKLQlpZiAoZW5jaWQgPCAwKSB7Ci0JCU1NX0VSUigiTm8gZnJlZSBlbmNvZGVyIGF2YWlsYWJsZVxuIik7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQlhdWRpby0+ZW5jX2lkID0gZW5jaWQ7Ci0KLQlyYyA9IG1zbV9hZHNwX2dldChhdWRpby0+bW9kdWxlX25hbWUsICZhdWRpby0+YXVkcmVjLAotCQkJICAgJmF1ZHJlY19hZHNwX29wcywgYXVkaW8pOwotCi0JaWYgKHJjKSB7Ci0JCWF1ZHByZXByb2NfYWVuY19mcmVlKGF1ZGlvLT5lbmNfaWQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYXVkaW8tPnN0b3BwZWQgPSAwOwotCWF1ZGlvLT5zb3VyY2UgPSAwOwotCWF1ZGlvLT5hYm9ydCA9IDA7Ci0JYXVkYTJkcF9pbl9mbHVzaChhdWRpbyk7Ci0JYXVkaW8tPmRldmljZV9ldmVudHMgPSBBVURERVZfRVZUX0RFVl9SRFkgfCBBVURERVZfRVZUX0RFVl9STFMgfAotCQkJCUFVRERFVl9FVlRfRlJFUV9DSEc7Ci0KLQlyYyA9IGF1ZGRldl9yZWdpc3Rlcl9ldnRfbGlzdG5lcihhdWRpby0+ZGV2aWNlX2V2ZW50cywKLQkJCQkJQVVEREVWX0NMTlRfRU5DLCBhdWRpby0+ZW5jX2lkLAotCQkJCQlhMmRwX2luX2xpc3RlbmVyLCAodm9pZCAqKSBhdWRpbyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiZmFpbGVkIHRvIHJlZ2lzdGVyIGRldmljZSBldmVudCBsaXN0ZW5lclxuIik7Ci0JCWdvdG8gZXZ0X2Vycm9yOwotCX0KLQlhdWRpby0+YnVpbGRfaWQgPSBzb2NpbmZvX2dldF9idWlsZF9pZCgpOwotCU1NX0RCRygiTW9kZW0gYnVpbGQgaWQgPSAlc1xuIiwgYXVkaW8tPmJ1aWxkX2lkKTsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQlhdWRpby0+b3BlbmVkID0gMTsKLQlyYyA9IDA7Ci1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLWV2dF9lcnJvcjoKLW91dHB1dF9idWZmX21hcF9lcnJvcjoKLW91dHB1dF9idWZmX2dldF9waHlzX2Vycm9yOgotb3V0cHV0X2J1ZmZfZ2V0X2ZsYWdzX2Vycm9yOgotCSBpb25fZnJlZShjbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotb3V0cHV0X2J1ZmZfYWxsb2NfZXJyb3I6Ci0JICAgIGlvbl9jbGllbnRfZGVzdHJveShjbGllbnQpOwotY2xpZW50X2NyZWF0ZV9lcnJvcjoKLQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHJlYyk7Ci0JYXVkcHJlcHJvY19hZW5jX2ZyZWUoYXVkaW8tPmVuY19pZCk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19hMmRwX2luX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGF1ZGEyZHBfaW5fb3BlbiwKLQkucmVsZWFzZQk9IGF1ZGEyZHBfaW5fcmVsZWFzZSwKLQkucmVhZAkJPSBhdWRhMmRwX2luX3JlYWQsCi0JLndyaXRlCQk9IGF1ZGEyZHBfaW5fd3JpdGUsCi0JLnVubG9ja2VkX2lvY3RsCT0gYXVkYTJkcF9pbl9pb2N0bCwKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2EyZHBfaW5fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX2EyZHBfaW4iLAotCS5mb3BzCT0gJmF1ZGlvX2EyZHBfaW5fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGEyZHBfaW5faW5pdCh2b2lkKQotewotCW11dGV4X2luaXQoJnRoZV9hdWRpb19hMmRwX2luLmxvY2spOwotCW11dGV4X2luaXQoJnRoZV9hdWRpb19hMmRwX2luLnJlYWRfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnRoZV9hdWRpb19hMmRwX2luLmRzcF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmdGhlX2F1ZGlvX2EyZHBfaW4uZGV2X2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoZV9hdWRpb19hMmRwX2luLndhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoZV9hdWRpb19hMmRwX2luLndhaXRfZW5hYmxlKTsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fYTJkcF9pbl9taXNjKTsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGF1ZGEyZHBfaW5faW5pdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIFNCQyBlbmNvZGUgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2FhYy5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19hYWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjZTVkNi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2FhYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAzNiArMCwwIEBACi0vKgotICogYWFjIGF1ZGlvIGRlY29kZXIgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZWFybHlzdXNwZW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19hYWMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1vcnlfYWxsb2MuaD4KLQotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdV9kb21haW5zLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHBtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRwbGF5Y21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBsYXltc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRwcC5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19kZXZfY3RsLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX21lbXR5cGVzLmg+Ci0KLQotI2RlZmluZSBCVUZTWiAzMjc2OAotI2RlZmluZSBETUFTWiAoQlVGU1ogKiAyKQotI2RlZmluZSBCVUZTWl9NSU4gNDA5NgotI2RlZmluZSBETUFTWl9NSU4gKEJVRlNaX01JTiAqIDIpCi0KLSNkZWZpbmUgQVVEUExBWV9JTlZBTElEX1JFQURfUFRSX09GRlNFVAkweEZGRkYKLSNkZWZpbmUgQVVEREVDX0RFQ19BQUMgNQotCi0jZGVmaW5lIFBDTV9CVUZTWl9NSU4gOTYwMAkvKiBIb2xkIG9uZSBzdGVyZW8gQUFDIGZyYW1lICovCi0jZGVmaW5lIFBDTV9CVUZfTUFYX0NPVU5UIDUJLyogRFNQIG9ubHkgYWNjZXB0cyA1IGJ1ZmZlcnMgYXQgbW9zdAotCQkJCSAgIGJ1dCBzdXBwb3J0IDIgYnVmZmVycyBjdXJyZW50bHkgKi8KLSNkZWZpbmUgUk9VVElOR19NT0RFX0ZUUlQgMQotI2RlZmluZSBST1VUSU5HX01PREVfUlQgMgotLyogRGVjb2RlciBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBBVURQUFRBU0sgKi8KLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfU0xFRVAJMAotI2RlZmluZQkgQVVEUFBfREVDX1NUQVRVU19JTklUICAxCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX0NGRyAgIDIKLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfUExBWSAgMwotCi0jZGVmaW5lIEFVREFBQ19NRVRBRklFTERfTUFTSyAweEZGRkYwMDAwCi0jZGVmaW5lIEFVREFBQ19FT1NfRkxHX09GRlNFVCAweDBBIC8qIE9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBidWZmZXIgKi8KLSNkZWZpbmUgQVVEQUFDX0VPU19GTEdfTUFTSyAweDAxCi0jZGVmaW5lIEFVREFBQ19FT1NfTk9ORSAweDAgLyogTm8gRU9TIGRldGVjdGVkICovCi0jZGVmaW5lIEFVREFBQ19FT1NfU0VUIDB4MSAvKiBFT1Mgc2V0IGluIG1ldGEgZmllbGQgKi8KLQotI2RlZmluZSBBVURBQUNfRVZFTlRfTlVNIDEwIC8qIERlZmF1bHQgbnVtYmVyIG9mIHByZS1hbGxvY2F0ZWQgZXZlbnQgcGFja2V0cyAqLwotCi0jZGVmaW5lIEJJVFNUUkVBTV9FUlJPUl9USFJFU0hPTERfVkFMVUUgMHgxIC8qIERFRkFVTFQgVEhSRVNIT0xEIFZBTFVFICovCi0KLXN0cnVjdCBidWZmZXIgewotCXZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgc2l6ZTsKLQl1bnNpZ25lZCB1c2VkOwkJLyogSW5wdXQgdXNhZ2UgYWN0dWFsIERTUCBwcm9kdWNlZCBQQ00gc2l6ZSAgKi8KLQl1bnNpZ25lZCBhZGRyOwotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zejsgLypvbmx5IHVzZWZ1bCBmb3IgZGF0YSBoYXMgbWV0YSBmaWVsZCAqLwotfTsKLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdHJ1Y3QgYXVkYWFjX3N1c3BlbmRfY3RsIHsKLQlzdHJ1Y3QgZWFybHlfc3VzcGVuZCBub2RlOwotCXN0cnVjdCBhdWRpbyAqYXVkaW87Ci19OwotI2VuZGlmCi0KLXN0cnVjdCBhdWRhYWNfZXZlbnR7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCWludCBldmVudF90eXBlOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci19OwotCi1zdHJ1Y3QgYXVkaW8gewotCXN0cnVjdCBidWZmZXIgb3V0WzJdOwotCi0Jc3BpbmxvY2tfdCBkc3BfbG9jazsKLQotCXVpbnQ4X3Qgb3V0X2hlYWQ7Ci0JdWludDhfdCBvdXRfdGFpbDsKLQl1aW50OF90IG91dF9uZWVkZWQ7CS8qIG51bWJlciBvZiBidWZmZXJzIHRoZSBkc3AgaXMgd2FpdGluZyBmb3IgKi8KLQl1bnNpZ25lZCBvdXRfZG1hX3N6OwotCi0JYXRvbWljX3Qgb3V0X2J5dGVzOwotCi0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IG11dGV4IHdyaXRlX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd3JpdGVfd2FpdDsKLQotCS8qIEhvc3QgUENNIHNlY3Rpb24gKi8KLQlzdHJ1Y3QgYnVmZmVyIGluW1BDTV9CVUZfTUFYX0NPVU5UXTsKLQlzdHJ1Y3QgbXV0ZXggcmVhZF9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHJlYWRfd2FpdDsJLyogV2FpdCBxdWV1ZSBmb3IgcmVhZCAqLwotCWNoYXIgKnJlYWRfZGF0YTsJLyogcG9pbnRlciB0byByZWFkZXIgYnVmZmVyICovCi0JaW50MzJfdCByZWFkX3BoeXM7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgcmVhZGVyIGJ1ZmZlciAqLwotCXVpbnQ4X3QgcmVhZF9uZXh0OwkvKiBpbmRleCB0byBpbnB1dCBidWZmZXJzIHRvIGJlIHJlYWQgbmV4dCAqLwotCXVpbnQ4X3QgZmlsbF9uZXh0OwkvKiBpbmRleCB0byBidWZmZXIgdGhhdCBEU1Agc2hvdWxkIGJlIGZpbGxpbmcgKi8KLQl1aW50OF90IHBjbV9idWZfY291bnQ7CS8qIG51bWJlciBvZiBwY20gYnVmZmVyIGFsbG9jYXRlZCAqLwotCS8qIC0tLS0gRW5kIG9mIEhvc3QgUENNIHNlY3Rpb24gKi8KLQotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKmF1ZHBsYXk7Ci0KLQkvKiBjb25maWd1cmF0aW9uIHRvIHVzZSBvbiBuZXh0IGVuYWJsZSAqLwotCXVpbnQzMl90IG91dF9zYW1wbGVfcmF0ZTsKLQl1aW50MzJfdCBvdXRfY2hhbm5lbF9tb2RlOwotCXN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyBhYWNfY29uZmlnOwotCi0JLyogQVYgc3luYyBJbmZvICovCi0JaW50IGF2c3luY19mbGFnOyAgICAgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSBmZWVkYmFjayBmcm9tIERTUCAqLwotCXdhaXRfcXVldWVfaGVhZF90IGF2c3luY193YWl0Oy8qIFdhaXQgcXVldWUgZm9yIEFWIFN5bmMgTWVzc2FnZSAgICAgKi8KLQkvKiA0OCBiaXRzIHNhbXBsZS9ieXRlcyBjb3VudGVyIHBlciBjaGFubmVsICovCi0JdWludDE2X3QgYXZzeW5jW0FVRFBQX0FWU1lOQ19DSF9DT1VOVCAqIEFVRFBQX0FWU1lOQ19OVU1fV09SRFMgKyAxXTsKLQotCS8qIGRhdGEgYWxsb2NhdGVkIGZvciB2YXJpb3VzIGJ1ZmZlcnMgKi8KLQljaGFyICpkYXRhOwotCWludDMyX3QgcGh5czsgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB3cml0ZSBidWZmZXIgKi8KLQl2b2lkICptYXBfdl9yZWFkOwotCXZvaWQgKm1hcF92X3dyaXRlOwotCi0JaW50IG1maWVsZDsgLyogbWV0YSBmaWVsZCBlbWJlZGRlZCBpbiBkYXRhICovCi0JaW50IHJmbHVzaDsgLyogUmVhZCAgZmx1c2ggKi8KLQlpbnQgd2ZsdXNoOyAvKiBXcml0ZSBmbHVzaCAqLwotCWludCBvcGVuZWQ7Ci0JaW50IGVuYWJsZWQ7Ci0JaW50IHJ1bm5pbmc7Ci0JaW50IHN0b3BwZWQ7CS8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQlpbnQgcGNtX2ZlZWRiYWNrOwotCWludCBidWZfcmVmcmVzaDsKLQlpbnQgdGVvczsgLyogdmFsaWQgb25seSBpZiB0dW5uZWwgbW9kZSAmIG5vIGRhdGEgbGVmdCBmb3IgZGVjb2RlciAqLwotCWVudW0gbXNtX2F1ZF9kZWNvZGVyX3N0YXRlIGRlY19zdGF0ZTsJLyogUmVwcmVzZW50cyBkZWNvZGVyIHN0YXRlICovCi0JaW50IHJlc2VydmVkOyAvKiBBIGJ5dGUgaXMgYmVpbmcgcmVzZXJ2ZWQgKi8KLQljaGFyIHJzdl9ieXRlOyAvKiBIYW5kbGUgb2RkIGxlbmd0aCB1c2VyIGRhdGEgKi8KLQotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIHF1ZXVlX2lkOwotCXVpbnQxNl90IGRlY19pZDsKLQl1aW50MzJfdCByZWFkX3B0cl9vZmZzZXQ7Ci0JaW50MTZfdCBzb3VyY2U7Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCXN0cnVjdCBhdWRhYWNfc3VzcGVuZF9jdGwgc3VzcGVuZF9jdGw7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLSNlbmRpZgotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfZXZlbnRfcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBldmVudF9xdWV1ZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF93YWl0OwotCXNwaW5sb2NrX3QgZXZlbnRfcXVldWVfbG9jazsKLQlzdHJ1Y3QgbXV0ZXggZ2V0X2V2ZW50X2xvY2s7Ci0JaW50IGV2ZW50X2Fib3J0OwotCXVpbnQzMl90IGRldmljZV9ldmVudHM7Ci0KLQlzdHJ1Y3QgbXNtX2F1ZGlvX2JpdHN0cmVhbV9pbmZvIHN0cmVhbV9pbmZvOwotCXN0cnVjdCBtc21fYXVkaW9fYml0c3RyZWFtX2Vycm9yX2luZm8gYml0c3RyZWFtX2Vycm9yX2luZm87Ci0JdWludDMyX3QgYml0c3RyZWFtX2Vycm9yX3RocmVzaG9sZF92YWx1ZTsKLQotCWludCBlcV9lbmFibGU7Ci0JaW50IGVxX25lZWRzX2NvbW1pdDsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyIGVxOwotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfdm9sdW1lIHZvbF9wYW47Ci19OwotCi1zdGF0aWMgaW50IGF1ZGRlY19kc3BfY29uZmlnKHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCBlbmFibGUpOwotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcGxheV9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgbmVlZGVkKTsKLXN0YXRpYyB2b2lkIGF1ZHBsYXlfZXJyb3JfdGhyZXNob2xkX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZHBsYXlfY29uZmlnX2hvc3RwY20oc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkaW9fZHNwX2V2ZW50KHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGlkLCB1aW50MTZfdCAqbXNnKTsKLXN0YXRpYyB2b2lkIGF1ZGFhY19wb3N0X2V2ZW50KHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCB0eXBlLAotCQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkKTsKLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGlvX2VuYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCWF1ZGlvLT5vdXRfdGFpbCA9IDA7Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCi0JaWYgKG1zbV9hZHNwX2VuYWJsZShhdWRpby0+YXVkcGxheSkpIHsKLQkJTU1fRVJSKCJtc21fYWRzcF9lbmFibGUoYXVkcGxheSkgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKGF1ZHBwX2VuYWJsZShhdWRpby0+ZGVjX2lkLCBhdWRpb19kc3BfZXZlbnQsIGF1ZGlvKSkgewotCQlNTV9FUlIoImF1ZHBwX2VuYWJsZSgpIGZhaWxlZFxuIik7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JYXVkaW8tPmVuYWJsZWQgPSAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhYWNfbGlzdG5lcih1MzIgZXZ0X2lkLCB1bmlvbiBhdWRkZXZfZXZ0X2RhdGEgKmV2dF9wYXlsb2FkLAotCQkJdm9pZCAqcHJpdmF0ZV9kYXRhKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSAoc3RydWN0IGF1ZGlvICopIHByaXZhdGVfZGF0YTsKLQlzd2l0Y2ggKGV2dF9pZCkgewotCWNhc2UgQVVEREVWX0VWVF9ERVZfUkRZOgotCQlNTV9EQkcoIjpBVURERVZfRVZUX0RFVl9SRFlcbiIpOwotCQlhdWRpby0+c291cmNlIHw9ICgweDEgPDwgZXZ0X3BheWxvYWQtPnJvdXRpbmdfaWQpOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcgPT0gMSAmJiBhdWRpby0+ZW5hYmxlZCA9PSAxKQotCQkJYXVkcHBfcm91dGVfc3RyZWFtKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvLT5zb3VyY2UpOwotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfREVWX1JMUzoKLQkJTU1fREJHKCI6QVVEREVWX0VWVF9ERVZfUkxTXG4iKTsKLQkJYXVkaW8tPnNvdXJjZSAmPSB+KDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0JCWlmIChhdWRpby0+cnVubmluZyA9PSAxICYmIGF1ZGlvLT5lbmFibGVkID09IDEpCi0JCQlhdWRwcF9yb3V0ZV9zdHJlYW0oYXVkaW8tPmRlY19pZCwgYXVkaW8tPnNvdXJjZSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRzoKLQkJYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gZXZ0X3BheWxvYWQtPnNlc3Npb25fdm9sOwotCQlNTV9EQkcoIjpBVURERVZfRVZUX1NUUkVBTV9WT0xfQ0hHLCBzdHJlYW0gdm9sICVkXG4iLAotCQkJCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSk7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihhdWRpby0+ZGVjX2lkLCAmYXVkaW8tPnZvbF9wYW4sCi0JCQkJCVBPUFApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlNTV9FUlIoIjpFUlJPUjp3cm9uZyBldmVudFxuIik7Ci0JCWJyZWFrOwotCX0KLX0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRpb19kaXNhYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JaW50IHJjID0gMDsKLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWlmIChhdWRpby0+ZW5hYmxlZCkgewotCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCWF1ZGlvLT5kZWNfc3RhdGUgPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORTsKLQkJYXVkZGVjX2RzcF9jb25maWcoYXVkaW8sIDApOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUsCi0JCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0RFQ09ERVJfV0FJVF9NUykpOwotCQlpZiAocmMgPT0gMCkKLQkJCXJjID0gLUVUSU1FRE9VVDsKLQkJZWxzZSBpZiAoYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfQ0xPU0UpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRpby0+YXVkcGxheSk7Ci0JCWF1ZHBwX2Rpc2FibGUoYXVkaW8tPmRlY19pZCwgYXVkaW8pOwotCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JfQotCXJldHVybiByYzsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkc3AgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgdm9pZCBhdWRpb191cGRhdGVfcGNtX2J1Zl9lbnRyeShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1aW50MzJfdCAqcGF5bG9hZCkKLXsKLQl1aW50OF90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoYXVkaW8tPnJmbHVzaCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBheWxvYWRbMV07IGluZGV4KyspIHsKLQkJaWYgKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyID09Ci0JCSAgICBwYXlsb2FkWzIgKyBpbmRleCAqIDJdKSB7Ci0JCQlNTV9EQkcoImluWyVkXSByZWFkeVxuIiwgYXVkaW8tPmZpbGxfbmV4dCk7Ci0JCQlhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0udXNlZCA9Ci0JCQkJcGF5bG9hZFszICsgaW5kZXggKiAyXTsKLQkJCWlmICgoKythdWRpby0+ZmlsbF9uZXh0KSA9PSBhdWRpby0+cGNtX2J1Zl9jb3VudCkKLQkJCQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLQotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJleHBlY3RlZD0leCByZXQ9JXhcbiIsCi0JCQkJYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHIsCi0JCQkJcGF5bG9hZFsxICsgaW5kZXggKiAyXSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnVzZWQgPT0gMCkgewotCQlhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQl9IGVsc2UgewotCQlNTV9EQkcoInJlYWQgY2Fubm90IGtlZXAgdXBcbiIpOwotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAxOwotCX0KLQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQotfQotCi1zdGF0aWMgdm9pZCBhdWRhYWNfYml0c3RyZWFtX2Vycm9yX2luZm8oc3RydWN0IGF1ZGlvICphdWRpbywgdWludDMyX3QgKnBheWxvYWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBlX3BheWxvYWQ7Ci0KLQlpZiAocGF5bG9hZFswXSAhPSBBVURERUNfREVDX0FBQykgewotCQlNTV9FUlIoIlVuZXhwZWN0ZWQgYml0c3RyZWFtIGVycm9yIGluZm8gZnJvbSBEU1A6XAotCQkJCUludmFsaWQgZGVjb2RlclxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBnZXQgc3RyZWFtIGluZm8gZnJvbSBEU1AgbXNnICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCi0JYXVkaW8tPmJpdHN0cmVhbV9lcnJvcl9pbmZvLmRlY19pZCA9IHBheWxvYWRbMF07Ci0JYXVkaW8tPmJpdHN0cmVhbV9lcnJvcl9pbmZvLmVycl9tc2dfaW5kaWNhdG9yID0gcGF5bG9hZFsxXTsKLQlhdWRpby0+Yml0c3RyZWFtX2Vycm9yX2luZm8uZXJyX3R5cGUgPSBwYXlsb2FkWzJdOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JTU1fRVJSKCJiaXRfc3RyZWFtX2Vycm9yX3R5cGU9JWQgZXJyb3JfY291bnQ9JWRcbiIsCi0JCQlhdWRpby0+Yml0c3RyZWFtX2Vycm9yX2luZm8uZXJyX3R5cGUsICgweDAwMDBGRkZGICYKLQkJCWF1ZGlvLT5iaXRzdHJlYW1fZXJyb3JfaW5mby5lcnJfbXNnX2luZGljYXRvcikpOwotCi0JLyogc2VuZCBldmVudCB0byBBUk0gdG8gbm90aWZ5IGVycm9yIGluZm8gY29taW5nICovCi0JZV9wYXlsb2FkLmVycm9yX2luZm8gPSBhdWRpby0+Yml0c3RyZWFtX2Vycm9yX2luZm87Ci0JYXVkYWFjX3Bvc3RfZXZlbnQoYXVkaW8sIEFVRElPX0VWRU5UX0JJVFNUUkVBTV9FUlJPUl9JTkZPLCBlX3BheWxvYWQpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhYWNfdXBkYXRlX3N0cmVhbV9pbmZvKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVpbnQzMl90ICpwYXlsb2FkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgZV9wYXlsb2FkOwotCi0JLyogZ2V0IHN0cmVhbSBpbmZvIGZyb20gRFNQIG1zZyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQotCWF1ZGlvLT5zdHJlYW1faW5mby5jb2RlY190eXBlID0gQVVESU9fQ09ERUNfVFlQRV9BQUM7Ci0JYXVkaW8tPnN0cmVhbV9pbmZvLmNoYW5faW5mbyA9ICgweDAwMDBGRkZGICYgcGF5bG9hZFsxXSk7Ci0JYXVkaW8tPnN0cmVhbV9pbmZvLnNhbXBsZV9yYXRlID0gKDB4MDAwMEZGRkYgJiBwYXlsb2FkWzJdKTsKLQlhdWRpby0+c3RyZWFtX2luZm8uYml0X3N0cmVhbV9pbmZvID0gKDB4MDAwMEZGRkYgJiBwYXlsb2FkWzNdKTsKLQlhdWRpby0+c3RyZWFtX2luZm8uYml0X3JhdGUgPSBwYXlsb2FkWzRdOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JTU1fREJHKCJjaGFuX2luZm89JWQsIHNhbXBsZV9yYXRlPSVkLCBiaXRfc3RyZWFtX2luZm89JWRcbiIsCi0JCQlhdWRpby0+c3RyZWFtX2luZm8uY2hhbl9pbmZvLAotCQkJYXVkaW8tPnN0cmVhbV9pbmZvLnNhbXBsZV9yYXRlLAotCQkJYXVkaW8tPnN0cmVhbV9pbmZvLmJpdF9zdHJlYW1faW5mbyk7Ci0KLQkvKiBzZW5kIGV2ZW50IHRvIEFSTSB0byBub3RpZnkgc3RlYW0gaW5mbyBjb21pbmcgKi8KLQllX3BheWxvYWQuc3RyZWFtX2luZm8gPSBhdWRpby0+c3RyZWFtX2luZm87Ci0JYXVkYWFjX3Bvc3RfZXZlbnQoYXVkaW8sIEFVRElPX0VWRU5UX1NUUkVBTV9JTkZPLCBlX3BheWxvYWQpOwotfQotc3RhdGljIHZvaWQgYXVkcGxheV9kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgICB2b2lkICgqZ2V0ZXZlbnQpICh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBkYXRhOwotCXVpbnQzMl90IG1zZ1syOF07Ci0JZ2V0ZXZlbnQobXNnLCBzaXplb2YobXNnKSk7Ci0KLQlNTV9EQkcoIm1zZ19pZD0leFxuIiwgaWQpOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUExBWV9NU0dfREVDX05FRURTX0RBVEE6Ci0JCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAxKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBMQVlfTVNHX0JVRkZFUl9VUERBVEU6Ci0JCWF1ZGlvX3VwZGF0ZV9wY21fYnVmX2VudHJ5KGF1ZGlvLCBtc2cpOwotCQlicmVhazsKLQotCWNhc2UgQVVEUExBWV9VUF9TVFJFQU1fSU5GTzoKLQkJaWYgKChtc2dbMV0gJiBBVURQTEFZX1NUUkVBTV9JTkZPX01TR19NQVNLKSA9PQotCQkJCUFVRFBMQVlfU1RSRUFNX0lORk9fTVNHX01BU0spIHsKLQkJCWF1ZGFhY19iaXRzdHJlYW1fZXJyb3JfaW5mbyhhdWRpbywgbXNnKTsKLQkJfSBlbHNlIHsKLQkJCWF1ZGFhY191cGRhdGVfc3RyZWFtX2luZm8oYXVkaW8sIG1zZyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBMQVlfVVBfT1VUUE9SVF9GTFVTSF9BQ0s6Ci0JCU1NX0RCRygiT1VUUE9SVF9GTFVTSF9BQ0tcbiIpOwotCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQkJYXVkcGxheV9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBRFNQX01FU1NBR0VfSUQ6Ci0JCU1NX0RCRygiUmVjZWl2ZWQgQURTUCBldmVudDogbW9kdWxlIGVuYWJsZShhdWRwbGF5dGFzaylcbiIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigidW5leHBlY3RlZCBtZXNzYWdlIGZyb20gZGVjb2RlciBcbiIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fZHNwX2V2ZW50KHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGlkLCB1aW50MTZfdCAqbXNnKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBwcml2YXRlOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUFBfTVNHX1NUQVRVU19NU0c6ewotCQkJdW5zaWduZWQgc3RhdHVzID0gbXNnWzFdOwotCi0JCQlzd2l0Y2ggKHN0YXR1cykgewotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX1NMRUVQOiB7Ci0JCQkJdWludDE2X3QgcmVhc29uID0gbXNnWzJdOwotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IHNsZWVwIHJlYXNvbiA9IFwKLQkJCQkJCTB4JTA0eFxuIiwgcmVhc29uKTsKLQkJCQlpZiAoKHJlYXNvbiA9PSBBVURQUF9NU0dfUkVBU09OX01FTSkKLQkJCQkJfHwgKHJlYXNvbiA9PQotCQkJCQlBVURQUF9NU0dfUkVBU09OX05PREVDT0RFUikpIHsKLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfRkFJTFVSRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0gZWxzZSBpZiAocmVhc29uID09IEFVRFBQX01TR19SRUFTT05fTk9ORSkgewotCQkJCQkvKiBkZWNvZGVyIGlzIGluIGRpc2FibGUgc3RhdGUgKi8KLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfQ0xPU0U7Ci0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfSU5JVDoKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBpbml0IFxuIik7Ci0JCQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCQkJCWF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKGF1ZGlvKTsKLQkJCQllbHNlCi0JCQkJCWF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoYXVkaW8pOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfQ0ZHOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IGNmZyBcbiIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX1BMQVk6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogcGxheSBcbiIpOwotCQkJCS8qIHNlbmQgIG1peGVyIGNvbW1hbmQgKi8KLQkJCQlhdWRwcF9yb3V0ZV9zdHJlYW0oYXVkaW8tPmRlY19pZCwKLQkJCQkJCWF1ZGlvLT5zb3VyY2UpOwotCQkJCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCQkJCWF1ZHBsYXlfZXJyb3JfdGhyZXNob2xkX2NvbmZpZyhhdWRpbyk7Ci0JCQkJCWF1ZHBsYXlfY29uZmlnX2hvc3RwY20oYXVkaW8pOwotCQkJCQlhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQkJCQl9Ci0JCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9TVUNDRVNTOwotCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJTU1fRVJSKCJ1bmtub3duIGRlY29kZXIgc3RhdHVzIFxuIik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVEUFBfTVNHX0NGR19NU0c6Ci0JCWlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9FTkEpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBFTkFCTEVcbiIpOwotCQkJYXVkZGVjX2RzcF9jb25maWcoYXVkaW8sIDEpOwotCQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAxOwotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvLT5lcV9lbmFibGUsCi0JCQkJCSZhdWRpby0+ZXEsIFBPUFApOwotCQl9IGVsc2UgaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0RJUykgewotCQkJTU1fREJHKCJDRkdfTVNHIERJU0FCTEVcbiIpOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAwOwotCQl9IGVsc2UgewotCQkJTU1fREJHKCJDRkdfTVNHICVkP1xuIiwJbXNnWzBdKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRFBQX01TR19ST1VUSU5HX0FDSzoKLQkJTU1fREJHKCJST1VUSU5HX0FDSyBtb2RlPSVkXG4iLAltc2dbMV0pOwotCQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKGF1ZGlvKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBQX01TR19GTFVTSF9BQ0s6Ci0JCU1NX0RCRygiRkxVU0hfQUNLXG4iKTsKLQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQkJYXVkcGxheV9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURQUF9NU0dfUENNRE1BTUlTU0VEOgotCQlNTV9EQkcoIlBDTURNQU1JU1NFRFxuIik7Ci0JCWF1ZGlvLT50ZW9zID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlicmVhazsKLQotCWNhc2UgQVVEUFBfTVNHX0FWU1lOQ19NU0c6Ci0JCU1NX0RCRygiQVVEUFBfTVNHX0FWU1lOQ19NU0dcbiIpOwotCQltZW1jcHkoJmF1ZGlvLT5hdnN5bmNbMF0sIG1zZywgc2l6ZW9mKGF1ZGlvLT5hdnN5bmMpKTsKLQkJYXVkaW8tPmF2c3luY19mbGFnID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPmF2c3luY193YWl0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlNTV9FUlIoIlVOS05PV04gKCVkKVxuIiwgaWQpOwotCX0KLQotfQotCi1zdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHBsYXlfYWRzcF9vcHNfYWFjID0gewotCS5ldmVudCA9IGF1ZHBsYXlfZHNwX2V2ZW50LAotfTsKLQotI2RlZmluZSBhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCBjbWQsIGxlbikgXAotCW1zbV9hZHNwX3dyaXRlKGF1ZGlvLT5hdWRwbGF5LCBhdWRpby0+cXVldWVfaWQsXAotCQkJY21kLCBsZW4pCi0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19kZWNfdHlwZSBjZmdfZGVjX2NtZDsKLQotCW1lbXNldCgmY2ZnX2RlY19jbWQsIDAsIHNpemVvZihjZmdfZGVjX2NtZCkpOwotCi0JY2ZnX2RlY19jbWQuY21kX2lkID0gQVVEUFBfQ01EX0NGR19ERUNfVFlQRTsKLQlpZiAoZW5hYmxlKQotCQljZmdfZGVjX2NtZC5kZWNfY2ZnID0gQVVEUFBfQ01EX1VQREFUREVfQ0ZHX0RFQyB8Ci0JCQkJQVVEUFBfQ01EX0VOQV9ERUNfViB8IEFVRERFQ19ERUNfQUFDOwotCWVsc2UKLQkJY2ZnX2RlY19jbWQuZGVjX2NmZyA9IEFVRFBQX0NNRF9VUERBVERFX0NGR19ERUMgfAotCQkJCUFVRFBQX0NNRF9ESVNfREVDX1Y7Ci0JY2ZnX2RlY19jbWQuZG1fbW9kZSA9IDB4MDsKLQljZmdfZGVjX2NtZC5zdHJlYW1faWQgPSBhdWRpby0+ZGVjX2lkOwotCi0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUxKCZjZmdfZGVjX2NtZCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19hYWMgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY29tbW9uLmNtZF9pZCA9IEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVM7Ci0JY21kLmNvbW1vbi5sZW5ndGggPSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TX0FBQ19MRU47Ci0JY21kLmNvbW1vbi5kZWNfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5jb21tb24uaW5wdXRfc2FtcGxpbmdfZnJlcXVlbmN5ID0gYXVkaW8tPm91dF9zYW1wbGVfcmF0ZTsKLQljbWQuZm9ybWF0ID0gYXVkaW8tPmFhY19jb25maWcuZm9ybWF0OwotCWNtZC5hdWRpb19vYmplY3QgPSBhdWRpby0+YWFjX2NvbmZpZy5hdWRpb19vYmplY3Q7Ci0JY21kLmVwX2NvbmZpZyA9IGF1ZGlvLT5hYWNfY29uZmlnLmVwX2NvbmZpZzsKLQljbWQuYWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQotCQlhdWRpby0+YWFjX2NvbmZpZy5hYWNfc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKLQljbWQuYWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KLQkJYXVkaW8tPmFhY19jb25maWcuYWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnOwotCWNtZC5hYWNfc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQotCQlhdWRpby0+YWFjX2NvbmZpZy5hYWNfc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JY21kLnNicl9vbl9mbGFnID0gYXVkaW8tPmFhY19jb25maWcuc2JyX29uX2ZsYWc7Ci0JY21kLnNicl9wc19vbl9mbGFnID0gYXVkaW8tPmFhY19jb25maWcuc2JyX3BzX29uX2ZsYWc7Ci0JY21kLmNoYW5uZWxfY29uZmlndXJhdGlvbiA9IGF1ZGlvLT5hYWNfY29uZmlnLmNoYW5uZWxfY29uZmlndXJhdGlvbjsKLQotCWF1ZHBwX3NlbmRfcXVldWUyKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX3JvdXRpbmdfbW9kZSBjbWQ7Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURQUF9DTURfUk9VVElOR19NT0RFOwotCWNtZC5vYmplY3RfbnVtYmVyID0gYXVkaW8tPmRlY19pZDsKLQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJY21kLnJvdXRpbmdfbW9kZSA9IFJPVVRJTkdfTU9ERV9GVFJUOwotCWVsc2UKLQkJY21kLnJvdXRpbmdfbW9kZSA9IFJPVVRJTkdfTU9ERV9SVDsKLQotCWF1ZHBwX3NlbmRfcXVldWUxKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJCQkgICAgICAgdW5zaWduZWQgaWR4LCB1bnNpZ25lZCBsZW4pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2JpdHN0cmVhbV9kYXRhX2F2YWlsX250MiBjbWQ7Ci0KLQljbWQuY21kX2lkID0gQVVEUExBWV9DTURfQklUU1RSRUFNX0RBVEFfQVZBSUxfTlQyOwotCWlmIChhdWRpby0+bWZpZWxkKQotCQljbWQuZGVjb2Rlcl9pZCA9IEFVREFBQ19NRVRBRklFTERfTUFTSyB8Ci0JCQkoYXVkaW8tPm91dFtpZHhdLm1maWVsZF9zeiA+PiAxKTsKLQllbHNlCi0JICAgIGNtZC5kZWNvZGVyX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuYnVmX3B0ciA9IGF1ZGlvLT5vdXRbaWR4XS5hZGRyOwotCWNtZC5idWZfc2l6ZSA9IGxlbiAvIDI7Ci0JY21kLnBhcnRpdGlvbl9udW1iZXIgPSAwOwotCXJldHVybiBhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfYnVmZmVyX3JlZnJlc2ggcmVmcmVzaF9jbWQ7Ci0KLQlyZWZyZXNoX2NtZC5jbWRfaWQgPSBBVURQTEFZX0NNRF9CVUZGRVJfUkVGUkVTSDsKLQlyZWZyZXNoX2NtZC5udW1fYnVmZmVycyA9IDE7Ci0JcmVmcmVzaF9jbWQuYnVmMF9hZGRyZXNzID0gYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHI7Ci0JLyogQUFDIGZyYW1lIHNpemUgKi8KLQlyZWZyZXNoX2NtZC5idWYwX2xlbmd0aCA9IGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5zaXplIC0KLQkJKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5zaXplICUgMTAyNCkKLQkJKyAoYXVkaW8tPm1maWVsZCA/IDI0IDogMCk7Ci0JcmVmcmVzaF9jbWQuYnVmX3JlYWRfY291bnQgPSAwOwotCU1NX0RCRygiYnVmMF9hZGRyPSV4IGJ1ZjBfbGVuPSVkXG4iLCByZWZyZXNoX2NtZC5idWYwX2FkZHJlc3MsCi0JCQlyZWZyZXNoX2NtZC5idWYwX2xlbmd0aCk7Ci0JKHZvaWQpYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJnJlZnJlc2hfY21kLCBzaXplb2YocmVmcmVzaF9jbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGxheV9vdXRwb3J0X2ZsdXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX291dHBvcnRfZmx1c2ggb3BfZmx1c2hfY21kOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlvcF9mbHVzaF9jbWQuY21kX2lkID0gQVVEUExBWV9DTURfT1VUUE9SVF9GTFVTSDsKLQkodm9pZClhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmb3BfZmx1c2hfY21kLCBzaXplb2Yob3BfZmx1c2hfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfZXJyb3JfdGhyZXNob2xkX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVuaW9uIGF1ZHBsYXlfY21kX2NoYW5uZWxfaW5mbyBjaF9jZmdfY21kOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQljaF9jZmdfY21kLnRocl91cGRhdGUuY21kX2lkID0gQVVEUExBWV9DTURfQ0hBTk5FTF9JTkZPOwotCWNoX2NmZ19jbWQudGhyX3VwZGF0ZS50aHJlc2hvbGRfdXBkYXRlID0gQVVEUExBWV9FUlJPUl9USFJFU0hPTERfRU5BQkxFOwotCWNoX2NmZ19jbWQudGhyX3VwZGF0ZS50aHJlc2hvbGRfdmFsdWUgPQotCQlhdWRpby0+Yml0c3RyZWFtX2Vycm9yX3RocmVzaG9sZF92YWx1ZTsKLQkodm9pZClhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY2hfY2ZnX2NtZCwgc2l6ZW9mKGNoX2NmZ19jbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGxheV9jb25maWdfaG9zdHBjbShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwbGF5X2NtZF9ocGNtX2J1Zl9jZmcgY2ZnX2NtZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JY2ZnX2NtZC5jbWRfaWQgPSBBVURQTEFZX0NNRF9IUENNX0JVRl9DRkc7Ci0JY2ZnX2NtZC5tYXhfYnVmZmVycyA9IGF1ZGlvLT5wY21fYnVmX2NvdW50OwotCWNmZ19jbWQuYnl0ZV9zd2FwID0gMDsKLQljZmdfY21kLmhvc3RwY21fY29uZmlnID0gKDB4ODAwMCkgfCAoMHg0MDAwKTsKLQljZmdfY21kLmZlZWRiYWNrX2ZyZXF1ZW5jeSA9IDE7Ci0JY2ZnX2NtZC5wYXJ0aXRpb25fbnVtYmVyID0gMDsKLQkodm9pZClhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY2ZnX2NtZCwgc2l6ZW9mKGNmZ19jbWQpKTsKLQotfQotCi1zdGF0aWMgdm9pZCBhdWRwbGF5X3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWF1ZGlvLT5ydW5uaW5nKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAobmVlZGVkICYmICFhdWRpby0+d2ZsdXNoKSB7Ci0JCS8qIFdlIHdlcmUgY2FsbGVkIGZyb20gdGhlIGNhbGxiYWNrIGJlY2F1c2UgdGhlIERTUAotCQkgKiByZXF1ZXN0ZWQgbW9yZSBkYXRhLiAgTm90ZSB0aGF0IHRoZSBEU1AgZG9lcyB3YW50Ci0JCSAqIG1vcmUgZGF0YSwgYW5kIGlmIGEgYnVmZmVyIHdhcyBpbi1mbGlnaHQsIG1hcmsgaXQKLQkJICogYXMgYXZhaWxhYmxlIChzaW5jZSB0aGUgRFNQIG11c3Qgbm93IGJlIGRvbmUgd2l0aAotCQkgKiBpdCkuCi0JCSAqLwotCQlhdWRpby0+b3V0X25lZWRlZCA9IDE7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpIHsKLQkJCU1NX0RCRygiZnJhbWUgJWQgZnJlZVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJCWZyYW1lLT51c2VkID0gMDsKLQkJCWF1ZGlvLT5vdXRfdGFpbCBePSAxOwotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl9Ci0JfQotCi0JaWYgKGF1ZGlvLT5vdXRfbmVlZGVkKSB7Ci0JCS8qIElmIHRoZSBEU1AgY3VycmVudGx5IHdhbnRzIGRhdGEgYW5kIHdlIGhhdmUgYQotCQkgKiBidWZmZXIgYXZhaWxhYmxlLCB3ZSB3aWxsIHNlbmQgaXQgYW5kIHJlc2V0Ci0JCSAqIHRoZSBuZWVkZWQgZmxhZy4gIFdlJ2xsIG1hcmsgdGhlIGJ1ZmZlciBhcyBpbi1mbGlnaHQKLQkJICogc28gdGhhdCBpdCB3b24ndCBiZSByZWN5Y2xlZCB1bnRpbCB0aGUgbmV4dCBidWZmZXIKLQkJICogaXMgcmVxdWVzdGVkCi0JCSAqLwotCi0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkKSB7Ci0JCQlCVUdfT04oZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZik7Ci0JCQlNTV9EQkcoImZyYW1lICVkIGJ1c3lcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JCQlhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoYXVkaW8sIGF1ZGlvLT5vdXRfdGFpbCwKLQkJCQkJCSAgICBmcmFtZS0+dXNlZCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDB4ZmZmZmZmZmY7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCX0KLQl9Ci0gZG9uZToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkZXZpY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyB2b2lkIGF1ZGlvX2ZsdXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JYXVkaW8tPm91dFswXS51c2VkID0gMDsKLQlhdWRpby0+b3V0WzFdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRfaGVhZCA9IDA7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+cmVzZXJ2ZWQgPSAwOwotCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQlhdG9taWNfc2V0KCZhdWRpby0+b3V0X2J5dGVzLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fZmx1c2hfcGNtX2J1ZihzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVpbnQ4X3QgaW5kZXg7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBQQ01fQlVGX01BWF9DT1VOVDsgaW5kZXgrKykKLQkJYXVkaW8tPmluW2luZGV4XS51c2VkID0gMDsKLQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCWF1ZGlvLT5yZWFkX25leHQgPSAwOwotCWF1ZGlvLT5maWxsX25leHQgPSAwOwotfQotCi1zdGF0aWMgaW50IGF1ZGFhY192YWxpZGF0ZV91c3JfY29uZmlnKHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyAqY29uZmlnKQotewotCWludCByZXRfdmFsID0gLTE7Ci0KLQlpZiAoY29uZmlnLT5mb3JtYXQgIT0gQVVESU9fQUFDX0ZPUk1BVF9BRFRTICYmCi0JCWNvbmZpZy0+Zm9ybWF0ICE9IEFVRElPX0FBQ19GT1JNQVRfUkFXICYmCi0JCWNvbmZpZy0+Zm9ybWF0ICE9IEFVRElPX0FBQ19GT1JNQVRfUFNVRURPX1JBVyAmJgotCQljb25maWctPmZvcm1hdCAhPSBBVURJT19BQUNfRk9STUFUX0xPQVMpCi0JCWdvdG8gZG9uZTsKLQotCWlmIChjb25maWctPmF1ZGlvX29iamVjdCAhPSBBVURJT19BQUNfT0JKRUNUX0xDICYmCi0JCWNvbmZpZy0+YXVkaW9fb2JqZWN0ICE9IEFVRElPX0FBQ19PQkpFQ1RfTFRQICYmCi0JCWNvbmZpZy0+YXVkaW9fb2JqZWN0ICE9IEFVRElPX0FBQ19PQkpFQ1RfQlNBQyAmJgotCQljb25maWctPmF1ZGlvX29iamVjdCAhPSBBVURJT19BQUNfT0JKRUNUX0VSTEMpCi0JCWdvdG8gZG9uZTsKLQotCWlmIChjb25maWctPmF1ZGlvX29iamVjdCA9PSBBVURJT19BQUNfT0JKRUNUX0VSTEMpIHsKLQkJaWYgKGNvbmZpZy0+ZXBfY29uZmlnID4gMykKLQkJCWdvdG8gZG9uZTsKLQkJaWYgKGNvbmZpZy0+YWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnICE9Ci0JCQlBVURJT19BQUNfU0NBX0RBVEFfUkVTX09GRiAmJgotCQkJY29uZmlnLT5hYWNfc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlX2ZsYWcgIT0KLQkJCUFVRElPX0FBQ19TQ0FfREFUQV9SRVNfT04pCi0JCQlnb3RvIGRvbmU7Ci0JCWlmIChjb25maWctPmFhY19zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZV9mbGFnICE9Ci0JCQlBVURJT19BQUNfU0VDX0RBVEFfUkVTX09GRiAmJgotCQkJY29uZmlnLT5hYWNfc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2VfZmxhZyAhPQotCQkJQVVESU9fQUFDX1NFQ19EQVRBX1JFU19PTikKLQkJCWdvdG8gZG9uZTsKLQkJaWYgKGNvbmZpZy0+YWFjX3NwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZV9mbGFnICE9Ci0JCQlBVURJT19BQUNfU1BFQ19EQVRBX1JFU19PRkYgJiYKLQkJCWNvbmZpZy0+YWFjX3NwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZV9mbGFnICE9Ci0JCQlBVURJT19BQUNfU1BFQ19EQVRBX1JFU19PTikKLQkJCWdvdG8gZG9uZTsKLQl9IGVsc2UgewotCQljb25maWctPmFhY19zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KLQkJCUFVRElPX0FBQ19TRUNfREFUQV9SRVNfT0ZGOwotCQljb25maWctPmFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9Ci0JCQlBVURJT19BQUNfU0NBX0RBVEFfUkVTX09GRjsKLQkJY29uZmlnLT5hYWNfc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQotCQkJQVVESU9fQUFDX1NQRUNfREFUQV9SRVNfT0ZGOwotCX0KLQotI2lmbmRlZiBDT05GSUdfQVVESU9fQUFDX1BMVVMKLQlpZiAoQVVESU9fQUFDX1NCUl9PTl9GTEFHX09GRiAhPSBjb25maWctPnNicl9vbl9mbGFnKQotCQlnb3RvIGRvbmU7Ci0jZWxzZQotCWlmIChjb25maWctPnNicl9vbl9mbGFnICE9IEFVRElPX0FBQ19TQlJfT05fRkxBR19PRkYgJiYKLQkJY29uZmlnLT5zYnJfb25fZmxhZyAhPSBBVURJT19BQUNfU0JSX09OX0ZMQUdfT04pCi0JCWdvdG8gZG9uZTsKLSNlbmRpZgotCi0jaWZuZGVmIENPTkZJR19BVURJT19FTkhBTkNFRF9BQUNfUExVUwotCWlmIChBVURJT19BQUNfU0JSX1BTX09OX0ZMQUdfT0ZGICE9IGNvbmZpZy0+c2JyX3BzX29uX2ZsYWcpCi0JCWdvdG8gZG9uZTsKLSNlbHNlCi0JaWYgKGNvbmZpZy0+c2JyX3BzX29uX2ZsYWcgIT0gQVVESU9fQUFDX1NCUl9QU19PTl9GTEFHX09GRiAmJgotCQljb25maWctPnNicl9wc19vbl9mbGFnICE9IEFVRElPX0FBQ19TQlJfUFNfT05fRkxBR19PTikKLQkJZ290byBkb25lOwotI2VuZGlmCi0KLQlpZiAoY29uZmlnLT5kdWFsX21vbm9fbW9kZSA+IEFVRElPX0FBQ19EVUFMX01PTk9fUExfU1IpCi0JCWdvdG8gZG9uZTsKLQotCWlmIChjb25maWctPmNoYW5uZWxfY29uZmlndXJhdGlvbiA+IDIpCi0JCWdvdG8gZG9uZTsKLQotCXJldF92YWwgPSAwOwotIGRvbmU6Ci0JcmV0dXJuIHJldF92YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2lvcG9ydF9yZXNldChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCS8qIE1ha2Ugc3VyZSByZWFkL3dyaXRlIHRocmVhZCBhcmUgZnJlZSBmcm9tCi0JICogc2xlZXAgYW5kIGtub3dpbmcgdGhhdCBzeXN0ZW0gaXMgbm90IGFibGUKLQkgKiB0byBwcm9jZXNzIGlvIHJlcXVlc3QgYXQgdGhlIG1vbWVudAotCSAqLwotCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JYXVkaW9fZmx1c2goYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCWF1ZGlvX2ZsdXNoX3BjbV9idWYoYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JYXVkaW8tPmF2c3luY19mbGFnID0gMTsKLQl3YWtlX3VwKCZhdWRpby0+YXZzeW5jX3dhaXQpOwotCi19Ci0KLXN0YXRpYyBpbnQgYXVkYWFjX2V2ZW50c19wZW5kaW5nKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZW1wdHk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQllbXB0eSA9ICFsaXN0X2VtcHR5KCZhdWRpby0+ZXZlbnRfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGVtcHR5IHx8IGF1ZGlvLT5ldmVudF9hYm9ydDsKLX0KLQotc3RhdGljIHZvaWQgYXVkYWFjX3Jlc2V0X2V2ZW50X3F1ZXVlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYXVkYWFjX2V2ZW50ICpkcnZfZXZ0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZGFhY19ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQkJa2ZyZWUoZHJ2X2V2dCk7Ci0JfQotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZGFhY19ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQkJa2ZyZWUoZHJ2X2V2dCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBsb25nIGF1ZGFhY19wcm9jZXNzX2V2ZW50X3JlcShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB2b2lkIF9fdXNlciAqYXJnKQotewotCWxvbmcgcmM7Ci0Jc3RydWN0IG1zbV9hdWRpb19ldmVudCB1c3JfZXZ0OwotCXN0cnVjdCBhdWRhYWNfZXZlbnQgKmRydl9ldnQgPSBOVUxMOwotCWludCB0aW1lb3V0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnVzcl9ldnQsIGFyZywgc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fZXZlbnQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQl0aW1lb3V0ID0gKGludCkgdXNyX2V2dC50aW1lb3V0X21zOwotCi0JaWYgKHRpbWVvdXQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCi0JCQlhdWRpby0+ZXZlbnRfd2FpdCwgYXVkYWFjX2V2ZW50c19wZW5kaW5nKGF1ZGlvKSwKLQkJCW1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOwotCQlpZiAocmMgPT0gMCkKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCX0gZWxzZSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAotCQkJYXVkaW8tPmV2ZW50X3dhaXQsIGF1ZGFhY19ldmVudHNfcGVuZGluZyhhdWRpbykpOwotCX0KLQotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCWlmIChhdWRpby0+ZXZlbnRfYWJvcnQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMDsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcmMgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+ZXZlbnRfcXVldWUpKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZGFhY19ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQl9Ci0JaWYgKGRydl9ldnQpIHsKLQkJdXNyX2V2dC5ldmVudF90eXBlID0gZHJ2X2V2dC0+ZXZlbnRfdHlwZTsKLQkJdXNyX2V2dC5ldmVudF9wYXlsb2FkID0gZHJ2X2V2dC0+cGF5bG9hZDsKLQkJbGlzdF9hZGRfdGFpbCgmZHJ2X2V2dC0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQl9IGVsc2UKLQkJcmMgPSAtMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFyYyAmJiBjb3B5X3RvX3VzZXIoYXJnLCAmdXNyX2V2dCwgc2l6ZW9mKHVzcl9ldnQpKSkKLQkJcmMgPSAtRUZBVUxUOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2VuYWJsZV9lcShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCWlmIChhdWRpby0+ZXFfZW5hYmxlID09IGVuYWJsZSAmJiAhYXVkaW8tPmVxX25lZWRzX2NvbW1pdCkKLQkJcmV0dXJuIDA7Ci0KLQlhdWRpby0+ZXFfZW5hYmxlID0gZW5hYmxlOwotCi0JaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCWF1ZHBwX2RzcF9zZXRfZXEoYXVkaW8tPmRlY19pZCwgZW5hYmxlLCAmYXVkaW8tPmVxLCBQT1BQKTsKLQkJYXVkaW8tPmVxX25lZWRzX2NvbW1pdCA9IDA7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2dldF9hdnN5bmNfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQkJCQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyAqc3RhdHMpCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlmIChhdWRpby0+ZGVjX2lkID09IGF1ZGlvLT5hdnN5bmNbMF0gJiYgYXVkaW8tPmF2c3luY19mbGFnKSB7Ci0JCS8qIGF2X3N5bmMgc2FtcGxlIGNvdW50ICovCi0JCXN0YXRzLT5zYW1wbGVfY291bnQgPSAoYXVkaW8tPmF2c3luY1syXSA8PCAxNikgfAotCQkJCQkJCShhdWRpby0+YXZzeW5jWzNdKTsKLQotCQkvKiBhdl9zeW5jIGJ5dGVfY291bnQgKi8KLQkJc3RhdHMtPmJ5dGVfY291bnQgPSAoYXVkaW8tPmF2c3luY1s1XSA8PCAxNikgfAotCQkJCQkJCShhdWRpby0+YXZzeW5jWzZdKTsKLQotCQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAwOwotCQlyYyA9IDA7Ci0JfQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm4gcmM7Ci0KLX0KLQotc3RhdGljIGxvbmcgYXVkaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQl1aW50MTZfdCBlbmFibGVfbWFzazsKLQlpbnQgZW5hYmxlOwotCWludCBwcmV2X3N0YXRlOwotCi0JTU1fREJHKCJjbWQgPSAlZFxuIiwgY21kKTsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX1NUQVRTKSB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0KLQkJYXVkaW8tPmF2c3luY19mbGFnID0gMDsKLQkJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7Ci0JCWlmIChhdWRwcF9xdWVyeV9hdnN5bmMoYXVkaW8tPmRlY19pZCkgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPmF2c3luY193YWl0LAotCQkJCShhdWRpby0+YXZzeW5jX2ZsYWcgPT0gMSksCi0JCQkJbXNlY3NfdG9famlmZmllcyhBVURQUF9BVlNZTkNfRVZFTlRfVElNRU9VVCkpOwotCi0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JCWVsc2UgaWYgKChyYyA+IDApIHx8ICgocmMgPT0gMCkgJiYgKGF1ZGlvLT5hdnN5bmNfZmxhZyA9PSAxKSkpIHsKLQkJCWlmIChhdWRpb19nZXRfYXZzeW5jX2RhdGEoYXVkaW8sICZzdGF0cykgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UKLQkJCXJldHVybiAtRUFHQUlOOwotCX0KLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19FTkFCTEVfQVVEUFA6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZW5hYmxlX21hc2ssICh2b2lkICopIGFyZywKLQkJCQkJCXNpemVvZihlbmFibGVfbWFzaykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJZW5hYmxlID0gKGVuYWJsZV9tYXNrICYgRVFfRU5BQkxFKSA/IDEgOiAwOwotCQlhdWRpb19lbmFibGVfZXEoYXVkaW8sIGVuYWJsZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX1ZPTFVNRToKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+dm9sX3Bhbi52b2x1bWUgPSBhcmc7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihhdWRpby0+ZGVjX2lkLCAmYXVkaW8tPnZvbF9wYW4sCi0JCQkJCVBPUFApOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fU0VUX1BBTjoKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+dm9sX3Bhbi5wYW4gPSBhcmc7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihhdWRpby0+ZGVjX2lkLCAmYXVkaW8tPnZvbF9wYW4sCi0JCQkJCVBPUFApOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fU0VUX0VROgotCQlwcmV2X3N0YXRlID0gYXVkaW8tPmVxX2VuYWJsZTsKLQkJYXVkaW8tPmVxX2VuYWJsZSA9IDA7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYXVkaW8tPmVxLm51bV9iYW5kcywgKHZvaWQgKikgYXJnLAotCQkJCXNpemVvZihhdWRpby0+ZXEpIC0KLQkJCQkoQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TX0NPTU1PTl9MRU4gKyAyKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWF1ZGlvLT5lcV9lbmFibGUgPSBwcmV2X3N0YXRlOwotCQlhdWRpby0+ZXFfbmVlZHNfY29tbWl0ID0gMTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoLUVJTlZBTCAhPSByYykKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfRVZFTlQpIHsKLQkJTU1fREJHKCJBVURJT19HRVRfRVZFTlRcbiIpOwotCQlpZiAobXV0ZXhfdHJ5bG9jaygmYXVkaW8tPmdldF9ldmVudF9sb2NrKSkgewotCQkJcmMgPSBhdWRhYWNfcHJvY2Vzc19ldmVudF9yZXEoYXVkaW8sCi0JCQkJCSh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCQl9IGVsc2UKLQkJCXJjID0gLUVCVVNZOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKGNtZCA9PSBBVURJT19BQk9SVF9HRVRfRVZFTlQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCQlNTV9EQkcoIkFVRElPX1NUQVJUXG4iKTsKLQkJcmMgPSBhdWRpb19lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUsCi0JCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0RFQ09ERVJfV0FJVF9NUykpOwotCQkJTU1fSU5GTygiZGVjX3N0YXRlICVkIHJjID0gJWRcbiIsIGF1ZGlvLT5kZWNfc3RhdGUsIHJjKTsKLQotCQkJaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1MpCi0JCQkJcmMgPSAtRU5PREVWOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NUT1A6Ci0JCU1NX0RCRygiQVVESU9fU1RPUFxuIik7Ci0JCXJjID0gYXVkaW9fZGlzYWJsZShhdWRpbyk7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMTsKLQkJYXVkaW9faW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQljYXNlIEFVRElPX0ZMVVNIOgotCQlNTV9EQkcoIkFVRElPX0ZMVVNIIHJ1bm5pbmc9JWRcbiIsIGF1ZGlvLT5ydW5uaW5nKTsKLQkJYXVkaW8tPnJmbHVzaCA9IDE7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAxOwotCQlhdWRpb19pb3BvcnRfcmVzZXQoYXVkaW8pOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpIHsKLQkJCWF1ZHBwX2ZsdXNoKGF1ZGlvLT5kZWNfaWQpOwotCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJIWF1ZGlvLT53Zmx1c2gpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCU1NX0VSUigiQVVESU9fRkxVU0ggaW50ZXJydXB0ZWRcbiIpOwotCQkJCXJjID0gLUVJTlRSOwotCQkJfQotCQl9IGVsc2UgewotCQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQVVESU9fT1VUUE9SVF9GTFVTSDoKLQkJTU1fREJHKCJBVURJT19PVVRQT1JUX0ZMVVNIXG4iKTsKLQkJYXVkaW8tPnJmbHVzaCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQkJYXVkaW9fZmx1c2hfcGNtX2J1ZihhdWRpbyk7Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JCWF1ZHBsYXlfb3V0cG9ydF9mbHVzaChhdWRpbyk7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT5yZWFkX3dhaXQsCi0JCQkJIWF1ZGlvLT5yZmx1c2gpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlNTV9FUlIoIkFVRFBMQVlfT1VUUE9SVF9GTFVTSCBpbnRlcnJ1cHRlZFxuIik7Ci0JCQlyYyA9IC1FSU5UUjsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQVVESU9fU0VUX0NPTkZJRzp7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjb25maWc7Ci0KLQkJCWlmIChjb3B5X2Zyb21fdXNlcgotCQkJICAgICgmY29uZmlnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoY29uZmlnLmNoYW5uZWxfY291bnQgPT0gMSkgewotCQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0KLQkJCQkgICAgQVVEUFBfQ01EX1BDTV9JTlRGX01PTk9fVjsKLQkJCX0gZWxzZSBpZiAoY29uZmlnLmNoYW5uZWxfY291bnQgPT0gMikgewotCQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0KLQkJCQkgICAgQVVEUFBfQ01EX1BDTV9JTlRGX1NURVJFT19WOwotCQkJfSBlbHNlIHsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWF1ZGlvLT5vdXRfc2FtcGxlX3JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0JCQlhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9IGNvbmZpZy5jaGFubmVsX2NvdW50OwotCQkJYXVkaW8tPm1maWVsZCA9IGNvbmZpZy5tZXRhX2ZpZWxkOwotCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gKGF1ZGlvLT5vdXRfZG1hX3N6ID4+IDEpOwotCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IDI7Ci0JCQljb25maWcuc2FtcGxlX3JhdGUgPSBhdWRpby0+b3V0X3NhbXBsZV9yYXRlOwotCQkJaWYgKGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID09Ci0JCQkgICAgQVVEUFBfQ01EX1BDTV9JTlRGX01PTk9fVikgewotCQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSAyOwotCQkJfQotCQkJY29uZmlnLm1ldGFfZmllbGQgPSAwOwotCQkJY29uZmlnLnVudXNlZFswXSA9IDA7Ci0JCQljb25maWcudW51c2VkWzFdID0gMDsKLQkJCWNvbmZpZy51bnVzZWRbMl0gPSAwOwotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNvbmZpZywKLQkJCQkJIHNpemVvZihjb25maWcpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCi0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fR0VUX0FBQ19DT05GSUc6ewotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmF1ZGlvLT5hYWNfY29uZmlnLAotCQkJCXNpemVvZihhdWRpby0+YWFjX2NvbmZpZykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fU0VUX0FBQ19DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnIHVzcl9jb25maWc7Ci0KLQkJCWlmIChjb3B5X2Zyb21fdXNlcgotCQkJCSgmdXNyX2NvbmZpZywgKHZvaWQgKilhcmcsCi0JCQkJCXNpemVvZih1c3JfY29uZmlnKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChhdWRhYWNfdmFsaWRhdGVfdXNyX2NvbmZpZygmdXNyX2NvbmZpZykgPT0gMCkgewotCQkJCWF1ZGlvLT5hYWNfY29uZmlnID0gdXNyX2NvbmZpZzsKLQkJCQlyYyA9IDA7Ci0JCQl9IGVsc2UKLQkJCQlyYyA9IC1FSU5WQUw7Ci0KLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19HRVRfUENNX0NPTkZJRzp7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX3BjbV9jb25maWcgY29uZmlnOwotCQkJY29uZmlnLnBjbV9mZWVkYmFjayA9IGF1ZGlvLT5wY21fZmVlZGJhY2s7Ci0JCQljb25maWcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9NQVhfQ09VTlQ7Ci0JCQljb25maWcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNvbmZpZywKLQkJCQkJIHNpemVvZihjb25maWcpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX1NFVF9QQ01fQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fcGNtX2NvbmZpZyBjb25maWc7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIKLQkJCSAgICAoJmNvbmZpZywgKHZvaWQgKilhcmcsIHNpemVvZihjb25maWcpKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjb25maWcucGNtX2ZlZWRiYWNrICE9IGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJCQlNTV9FUlIoIk5vdCBzdWZmaWNpZW50IHBlcm1pc3Npb24gdG8iCi0JCQkJCSAiY2hhbmdlIHRoZSBwbGF5YmFjayBtb2RlXG4iKTsKLQkJCQlyYyA9IC1FQUNDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoKGNvbmZpZy5idWZmZXJfY291bnQgPiBQQ01fQlVGX01BWF9DT1VOVCkgfHwKLQkJCSAgICAoY29uZmlnLmJ1ZmZlcl9jb3VudCA9PSAxKSkKLQkJCQljb25maWcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9NQVhfQ09VTlQ7Ci0KLQkJCWlmIChjb25maWcuYnVmZmVyX3NpemUgPCBQQ01fQlVGU1pfTUlOKQotCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47Ci0KLQkJCS8qIENoZWNrIGlmIHBjbSBmZWVkYmFjayBpcyByZXF1aXJlZCAqLwotCQkJaWYgKGNvbmZpZy5wY21fZmVlZGJhY2spIHsKLQkJCQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQkJCQkJYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JCQkJCWF1ZGlvLT5maWxsX25leHQgPSAwOwotCQkJfQotCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX1BBVVNFOgotCQlNTV9EQkcoIkFVRElPX1BBVVNFICVsZFxuIiwgYXJnKTsKLQkJcmMgPSBhdWRwcF9wYXVzZShhdWRpby0+ZGVjX2lkLCAoaW50KSBhcmcpOwotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9TVFJFQU1fSU5GTzp7Ci0JCWlmIChhdWRpby0+c3RyZWFtX2luZm8uc2FtcGxlX3JhdGUgPT0gMCkgewotCQkJLyogaGF2ZW4ndCByZWNlaXZlZCBEU1Agc3RyZWFtIGV2ZW50LAotCQkJdGhlIHN0cmVhbSBpbmZvIGlzIG5vdCB1cGRhdGVkICovCi0JCQlyYyA9IC1FUEVSTTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZhdWRpby0+c3RyZWFtX2luZm8sCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19iaXRzdHJlYW1faW5mbykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9CSVRTVFJFQU1fRVJST1JfSU5GTzp7Ci0JCWlmICgoYXVkaW8tPmJpdHN0cmVhbV9lcnJvcl9pbmZvLmVycl9tc2dfaW5kaWNhdG9yICYKLQkJCQlBVURQTEFZX1NUUkVBTV9JTkZPX01TR19NQVNLKSA9PQotCQkJCUFVRFBMQVlfU1RSRUFNX0lORk9fTVNHX01BU0spIHsKLQkJCS8qIGhhdmVuJ3QgcmVjZWl2ZWQgYml0c3RyZWFtIGVycm9yIGluZm8gZXZlbnQsCi0JCQl0aGUgYml0c3RyZWFtIGVycm9yIGluZm8gaXMgbm90IHVwZGF0ZWQgKi8KLQkJCXJjID0gLUVQRVJNOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmF1ZGlvLT5iaXRzdHJlYW1fZXJyb3JfaW5mbywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2JpdHN0cmVhbV9lcnJvcl9pbmZvKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX1NFU1NJT05fSUQ6Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmYXVkaW8tPmRlY19pZCwKLQkJCQlzaXplb2YodW5zaWduZWQgc2hvcnQpKSkKLQkJCXJjID0gIC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfRVJSX1RIUkVTSE9MRF9WQUxVRToKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhdWRpby0+Yml0c3RyZWFtX2Vycm9yX3RocmVzaG9sZF92YWx1ZSwKLQkJCQkJKHZvaWQgKilhcmcsIHNpemVvZih1aW50MzJfdCkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotLyogT25seSB1c2VmdWwgaW4gdHVubmVsLW1vZGUgKi8KLXN0YXRpYyBpbnQgYXVkYWFjX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgcHBvczEsIGxvZmZfdCBwcG9zMiwgaW50IGRhdGFzeW5jKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQlpZiAoIWF1ZGlvLT5ydW5uaW5nIHx8IGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmVfbm9sb2NrOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoIWF1ZGlvLT5vdXRbMF0udXNlZCAmJgotCQkhYXVkaW8tPm91dFsxXS51c2VkICYmCi0JCWF1ZGlvLT5vdXRfbmVlZGVkKSB8fCBhdWRpby0+d2ZsdXNoKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQllbHNlIGlmIChhdWRpby0+d2ZsdXNoKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGF1ZGlvLT5yZXNlcnZlZCkgewotCQlNTV9EQkcoInNlbmQgcmVzZXJ2ZWQgYnl0ZVxuIik7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJKChjaGFyICopIGZyYW1lLT5kYXRhKVswXSA9IGF1ZGlvLT5yc3ZfYnl0ZTsKLQkJKChjaGFyICopIGZyYW1lLT5kYXRhKVsxXSA9IDA7Ci0JCWZyYW1lLT51c2VkID0gMjsKLQkJYXVkcGxheV9zZW5kX2RhdGEoYXVkaW8sIDApOwotCi0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJKCFhdWRpby0+b3V0WzBdLnVzZWQgJiYKLQkJCSFhdWRpby0+b3V0WzFdLnVzZWQgJiYKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkKSB8fCBhdWRpby0+d2ZsdXNoKTsKLQotCQlpZiAocmMgPCAwKQotCQkJZ290byBkb25lOwotCQllbHNlIGlmIChhdWRpby0+d2ZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCS8qIHBjbSBkbWFtaXNzIG1lc3NhZ2UgaXMgc2VudCBjb250aW5vdXNseQotCSAqIHdoZW4gZGVjb2RlciBpcyBzdGFydmVkIHNvIG5vIHJhY2UKLQkgKiBjb25kaXRpb24gY29uY2VybgotCSAqLwotCWF1ZGlvLT50ZW9zID0gMDsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQlhdWRpby0+dGVvcyB8fCBhdWRpby0+d2ZsdXNoKTsKLQotCWlmIChhdWRpby0+d2ZsdXNoKQotCQlyYyA9IC1FQlVTWTsKLQotZG9uZToKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLWRvbmVfbm9sb2NrOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkaW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJICBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQlyZXR1cm4gMDsgLyogUENNIGZlZWRiYWNrIGlzIG5vdCBlbmFibGVkLiBOb3RoaW5nIHRvIHJlYWQgKi8KLQotCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCU1NX0RCRygidG8gcmVhZCAlZCBcbiIsIGNvdW50KTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPnJlYWRfd2FpdCwKLQkJCQkJICAgICAgKGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS4KLQkJCQkJCXVzZWQgPiAwKSB8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCQkJCQl8fCAoYXVkaW8tPnJmbHVzaCksCi0JCQltc2Vjc190b19qaWZmaWVzKE1TTV9BVURfQlVGRkVSX1VQREFURV9XQUlUX01TKSk7Ci0KLQkJaWYgKHJjID09IDApIHsKLQkJCXJjID0gLUVUSU1FRE9VVDsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCi0JCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+cmZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvdW50IDwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQpIHsKLQkJCS8qIFJlYWQgbXVzdCBoYXBwZW4gaW4gZnJhbWUgYm91bmRhcnkuIFNpbmNlIGRyaXZlcgotCQkJICAgZG9lcyBub3Qga25vdyBmcmFtZSBzaXplLCByZWFkIGNvdW50IG11c3QgYmUgZ3JlYXRlcgotCQkJICAgb3IgZXF1YWwgdG8gc2l6ZSBvZiBQQ00gc2FtcGxlcyAqLwotCQkJTU1fREJHKCJubyBwYXJ0aWFsIGZyYW1lIGRvbmUgcmVhZGluZ1xuIik7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygicmVhZCBmcm9tIGluWyVkXVxuIiwgYXVkaW8tPnJlYWRfbmV4dCk7Ci0JCQlpZiAoY29weV90b191c2VyCi0JCQkgICAgKGJ1ZiwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLmRhdGEsCi0JCQkgICAgIGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkKSkgewotCQkJCU1NX0VSUigiaW52YWxpZCBhZGRyICV4XG4iLCAodW5zaWduZWQgaW50KWJ1Zik7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY291bnQgLT0gYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQ7Ci0JCQlidWYgKz0gYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQ7Ci0JCQlhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCA9IDA7Ci0JCQlpZiAoKCsrYXVkaW8tPnJlYWRfbmV4dCkgPT0gYXVkaW8tPnBjbV9idWZfY291bnQpCi0JCQkJYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JCQlicmVhazsKLQkJCQkvKgotCQkJCSogRm9yY2UgdG8gZXhpdCB3aGlsZSBsb29wCi0JCQkJKiB0byBwcmV2ZW50IG91dHB1dCB0aHJlYWQKLQkJCQkqIHNsZWVwIHRvbyBsb25nIGlmIGRhdGEgaXMgbm90Ci0JCQkJKiByZWFkeSBhdCB0aGlzIG1vbWVudC4KLQkJCQkqLwotCQl9Ci0JfQotCi0JLyogZG9uJ3QgZmVlZCBvdXRwdXQgYnVmZmVyIHRvIEhXIGRlY29kZXIgZHVyaW5nIGZsdXNoaW5nCi0JICogYnVmZmVyIHJlZnJlc2ggY29tbWFuZCB3aWxsIGJlIHNlbnQgb25jZSBmbHVzaCBjb21wbGV0ZXMKLQkgKiBzZW5kIGJ1ZiByZWZyZXNoIGNvbW1hbmQgaGVyZSBjYW4gY29uZnVzZSBIVyBkZWNvZGVyCi0JICovCi0JaWYgKGF1ZGlvLT5idWZfcmVmcmVzaCAmJiAhYXVkaW8tPnJmbHVzaCkgewotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCQlNTV9EQkcoImtpY2sgc3RhcnQgcGNtIGZlZWRiYWNrIGFnYWluXG4iKTsKLQkJYXVkcGxheV9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQotCWlmIChidWYgPiBzdGFydCkKLQkJcmMgPSBidWYgLSBzdGFydDsKLQotCU1NX0RCRygicmVhZCAlZCBieXRlc1xuIiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRhYWNfcHJvY2Vzc19lb3Moc3RydWN0IGF1ZGlvICphdWRpbywKLQljb25zdCBjaGFyIF9fdXNlciAqYnVmX3N0YXJ0LCB1bnNpZ25lZCBzaG9ydCBtZmllbGRfc2l6ZSkKLXsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQljaGFyICpidWZfcHRyOwotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoInNpZ25hbCBpbnB1dCBFT1MgcmVzZXJ2ZWQ9JWRcbiIsIGF1ZGlvLT5yZXNlcnZlZCk7Ci0JaWYgKGF1ZGlvLT5yZXNlcnZlZCkgewotCQlNTV9EQkcoIlBhc3MgcmVzZXJ2ZSBieXRlXG4iKTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF9oZWFkOwotCQlidWZfcHRyID0gZnJhbWUtPmRhdGE7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCQkoZnJhbWUtPnVzZWQgPT0gMCkKLQkJCQkJfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQkJCQl8fCAoYXVkaW8tPndmbHVzaCkpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQlidWZfcHRyWzBdID0gYXVkaW8tPnJzdl9ieXRlOwotCWJ1Zl9wdHJbMV0gPSAwOwotCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCWZyYW1lLT5tZmllbGRfc3ogPSAwOwotCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JZnJhbWUtPnVzZWQgPSAyOwotCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQl9Ci0JTU1fREJHKCJOb3cgc2lnbmFsIGlucHV0IEVPUyBhZnRlciByZXNlcnZlZCBieXRlcyAlZCAlZCAlZFxuIiwKLQkJYXVkaW8tPm91dFswXS51c2VkLCBhdWRpby0+b3V0WzFdLnVzZWQsIGF1ZGlvLT5vdXRfbmVlZGVkKTsKLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKGF1ZGlvLT5vdXRfbmVlZGVkICYmCi0JCWF1ZGlvLT5vdXRbMF0udXNlZCA9PSAwICYmCi0JCWF1ZGlvLT5vdXRbMV0udXNlZCA9PSAwKQotCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoZnJhbWUtPmRhdGEsIGJ1Zl9zdGFydCwgbWZpZWxkX3NpemUpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlmcmFtZS0+dXNlZCA9IG1maWVsZF9zaXplOwotCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotc3RhdGljIHNzaXplX3QgYXVkaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCXNpemVfdCB4ZmVyOwotCWNoYXIgKmNweV9wdHI7Ci0JaW50IHJjID0gMCwgZW9zX2NvbmRpdGlvbiA9IEFVREFBQ19FT1NfTk9ORTsKLQl1bnNpZ25lZCBkc2l6ZTsKLQotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplID0gMDsKLQlNTV9EQkcoImNudD0lZFxuIiwgY291bnQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQkJY3B5X3B0ciA9IGZyYW1lLT5kYXRhOwotCQlkc2l6ZSA9IDA7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCQkgICAgICAoZnJhbWUtPnVzZWQgPT0gMCkKLQkJCQkJCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQkJCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQkJaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGF1ZGlvLT5tZmllbGQpIHsKLQkJCWlmIChidWYgPT0gc3RhcnQpIHsKLQkJCQkvKiBQcm9jZXNzaW5nIGJlZ2lubmluZyBvZiB1c2VyIGJ1ZmZlciAqLwotCQkJCWlmIChfX2dldF91c2VyKG1maWVsZF9zaXplLAotCQkJCQkodW5zaWduZWQgc2hvcnQgX191c2VyICopIGJ1ZikpIHsKLQkJCQkJcmMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgCWlmIChtZmllbGRfc2l6ZSA+IGNvdW50KSB7Ci0JCQkJCXJjID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCU1NX0RCRygibWYgb2Zmc2V0X3ZhbCAleFxuIiwgbWZpZWxkX3NpemUpOwotCQkJCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIG1maWVsZF9zaXplKSkgewotCQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvKiBDaGVjayBpZiBFT1MgZmxhZyBpcyBzZXQgYW5kIGJ1ZmZlciBoYXMKLQkJCQkqIGNvbnRhaW5zIGp1c3QgbWV0YSBmaWVsZAotCQkJCSovCi0JCQkJaWYgKGNweV9wdHJbQVVEQUFDX0VPU19GTEdfT0ZGU0VUXSAmCi0JCQkJCQlBVURBQUNfRU9TX0ZMR19NQVNLKSB7Ci0JCQkJCU1NX0RCRygiZW9zIHNldFxuIik7Ci0JCQkJCWVvc19jb25kaXRpb24gPSBBVURBQUNfRU9TX1NFVDsKLQkJCQkJaWYgKG1maWVsZF9zaXplID09IGNvdW50KSB7Ci0JCQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlCi0JCQkJCWNweV9wdHJbQVVEQUFDX0VPU19GTEdfT0ZGU0VUXSAmPQotCQkJCQkJCX5BVURBQUNfRU9TX0ZMR19NQVNLOwotCQkJCX0KLQkJCQkvKiBDaGVjayBFT1MgdG8gc2VlIGlmICovCi0JCQkJY3B5X3B0ciArPSBtZmllbGRfc2l6ZTsKLQkJCQljb3VudCAtPSBtZmllbGRfc2l6ZTsKLQkJCQlkc2l6ZSArPSBtZmllbGRfc2l6ZTsKLQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQl9IGVsc2UgewotCQkJCW1maWVsZF9zaXplID0gMDsKLQkJCQlNTV9EQkcoImNvbnRpbnVvdXMgYnVmZmVyXG4iKTsKLQkJCX0KLQkJCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQkJfQotCi0JCWlmIChhdWRpby0+cmVzZXJ2ZWQpIHsKLQkJCU1NX0RCRygiYXBwZW5kIHJlc2VydmVkIGJ5dGUgJXhcbiIsCi0JCQkJYXVkaW8tPnJzdl9ieXRlKTsKLQkJCSpjcHlfcHRyID0gYXVkaW8tPnJzdl9ieXRlOwotCQkJeGZlciA9IChjb3VudCA+ICgoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkgLSAxKSkgPwotCQkJCShmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSAtIDEgOiBjb3VudDsKLQkJCWNweV9wdHIrKzsKLQkJCWRzaXplICs9IDE7Ci0JCQlhdWRpby0+cmVzZXJ2ZWQgPSAwOwotCQl9IGVsc2UKLQkJCXhmZXIgPSAoY291bnQgPiAoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkpID8KLQkJCQkoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkgOiBjb3VudDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCB4ZmVyKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlkc2l6ZSArPSB4ZmVyOwotCQlpZiAoZHNpemUgJiAxKSB7Ci0JCQlhdWRpby0+cnN2X2J5dGUgPSAoKGNoYXIgKikgZnJhbWUtPmRhdGEpW2RzaXplIC0gMV07Ci0JCQlNTV9EQkcoIm9kZCBsZW5ndGggYnVmIHJlc2VydmUgbGFzdCBieXRlICV4XG4iLAotCQkJCQlhdWRpby0+cnN2X2J5dGUpOwotCQkJYXVkaW8tPnJlc2VydmVkID0gMTsKLQkJCWRzaXplLS07Ci0JCX0KLQkJY291bnQgLT0geGZlcjsKLQkJYnVmICs9IHhmZXI7Ci0KLQkJaWYgKGRzaXplID4gMCkgewotCQkJYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JCQlmcmFtZS0+dXNlZCA9IGRzaXplOwotCQkJYXVkcGxheV9zZW5kX2RhdGEoYXVkaW8sIDApOwotCQl9Ci0JfQotCU1NX0RCRygiZW9zX2NvbmRpdGlvbiAleCBidWZbMHgleF0gc3RhcnRbMHgleF1cbiIsIGVvc19jb25kaXRpb24sCi0JCQkoaW50KSBidWYsIChpbnQpIHN0YXJ0KTsKLQlpZiAoZW9zX2NvbmRpdGlvbiA9PSBBVURBQUNfRU9TX1NFVCkKLQkJcmMgPSBhdWRhYWNfcHJvY2Vzc19lb3MoYXVkaW8sIHN0YXJ0LCBtZmllbGRfc2l6ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JaWYgKCFyYykgewotCQlpZiAoYnVmID4gc3RhcnQpCi0JCQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlNTV9JTkZPKCJhdWRpbyBpbnN0YW5jZSAweCUwOHggZnJlZWluZ1xuIiwgKGludClhdWRpbyk7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkZGV2X3VucmVnaXN0ZXJfZXZ0X2xpc3RuZXIoQVVEREVWX0NMTlRfREVDLCBhdWRpby0+ZGVjX2lkKTsKLQlhdWRpb19kaXNhYmxlKGF1ZGlvKTsKLQlhdWRpb19mbHVzaChhdWRpbyk7Ci0JYXVkaW9fZmx1c2hfcGNtX2J1ZihhdWRpbyk7Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRwbGF5KTsKLQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQl1bnJlZ2lzdGVyX2Vhcmx5X3N1c3BlbmQoJmF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlKTsKLSNlbmRpZgotCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDE7Ci0Jd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCWF1ZGFhY19yZXNldF9ldmVudF9xdWV1ZShhdWRpbyk7Ci0JaW91bm1hcChhdWRpby0+bWFwX3Zfd3JpdGUpOwotCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPnBoeXMpOwotCWlvdW5tYXAoYXVkaW8tPm1hcF92X3JlYWQpOwotCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPnJlYWRfcGh5cyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JaWYgKGF1ZGlvLT5kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKGF1ZGlvLT5kZW50cnkpOwotI2VuZGlmCi0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhYWNfcG9zdF9ldmVudChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCkKLXsKLQlzdHJ1Y3QgYXVkYWFjX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpKSB7Ci0JCWVfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWRhYWNfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZV9ub2RlLT5saXN0KTsKLQl9IGVsc2UgewotCQllX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkYWFjX2V2ZW50KSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghZV9ub2RlKSB7Ci0JCQlNTV9FUlIoIk5vIG1lbSB0byBwb3N0IGV2ZW50ICVkXG4iLCB0eXBlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWVfbm9kZS0+ZXZlbnRfdHlwZSA9IHR5cGU7Ci0JZV9ub2RlLT5wYXlsb2FkID0gcGF5bG9hZDsKLQotCWxpc3RfYWRkX3RhaWwoJmVfbm9kZS0+bGlzdCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RhdGljIHZvaWQgYXVkYWFjX3N1c3BlbmQoc3RydWN0IGVhcmx5X3N1c3BlbmQgKmgpCi17Ci0Jc3RydWN0IGF1ZGFhY19zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWRhYWNfc3VzcGVuZF9jdGwsIG5vZGUpOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWF1ZGFhY19wb3N0X2V2ZW50KGN0bC0+YXVkaW8sIEFVRElPX0VWRU5UX1NVU1BFTkQsIHBheWxvYWQpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhYWNfcmVzdW1lKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRhYWNfc3VzcGVuZF9jdGwgKmN0bCA9Ci0JCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgYXVkYWFjX3N1c3BlbmRfY3RsLCBub2RlKTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlhdWRhYWNfcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9SRVNVTUUsIHBheWxvYWQpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBzc2l6ZV90IGF1ZGFhY19kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGFhY19kZWJ1Z19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQljb25zdCBpbnQgZGVidWdfYnVmbWF4ID0gMTAyNDsKLQlzdGF0aWMgY2hhciBidWZmZXJbMTAyNF07Ci0JaW50IG4gPSAwLCBpOwotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JbiA9IHNjbnByaW50ZihidWZmZXIsIGRlYnVnX2J1Zm1heCwgIm9wZW5lZCAlZFxuIiwgYXVkaW8tPm9wZW5lZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJlbmFibGVkICVkXG4iLCBhdWRpby0+ZW5hYmxlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJzdG9wcGVkICVkXG4iLCBhdWRpby0+c3RvcHBlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJwY21fZmVlZGJhY2sgJWRcbiIsIGF1ZGlvLT5wY21fZmVlZGJhY2spOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X2J1Zl9zeiAlZFxuIiwgYXVkaW8tPm91dFswXS5zaXplKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInBjbV9idWZfY291bnQgJWQgXG4iLCBhdWRpby0+cGNtX2J1Zl9jb3VudCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJwY21fYnVmX3N6ICVkIFxuIiwgYXVkaW8tPmluWzBdLnNpemUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkidm9sdW1lICV4IFxuIiwgYXVkaW8tPnZvbF9wYW4udm9sdW1lKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInNhbXBsZSByYXRlICVkIFxuIiwgYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJjaGFubmVsIG1vZGUgJWQgXG4iLCBhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JLyogRm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgb25seSB1c2VmdWwgZm9yIGRlYnVnZ2luZyB3aGVuCi0JICogd2hlbiBwbGF5YmFjayBoYWx0cyB1bmV4cGVjdGVkbHkuIFRodXMsIG5vIG11dHVhbCBleGNsdXNpb24KLQkgKiBlbmZvcmNlZAotCSAqLwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkid2ZsdXNoICVkXG4iLCBhdWRpby0+d2ZsdXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInJmbHVzaCAlZFxuIiwgYXVkaW8tPnJmbHVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJydW5uaW5nICVkIFxuIiwgYXVkaW8tPnJ1bm5pbmcpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiZGVjIHN0YXRlICVkIFxuIiwgYXVkaW8tPmRlY19zdGF0ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJvdXRfbmVlZGVkICVkIFxuIiwgYXVkaW8tPm91dF9uZWVkZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X2hlYWQgJWQgXG4iLCBhdWRpby0+b3V0X2hlYWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X3RhaWwgJWQgXG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0WzBdLnVzZWQgJWQgXG4iLCBhdWRpby0+b3V0WzBdLnVzZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0WzFdLnVzZWQgJWQgXG4iLCBhdWRpby0+b3V0WzFdLnVzZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiYnVmZmVyX3JlZnJlc2ggJWQgXG4iLCBhdWRpby0+YnVmX3JlZnJlc2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicmVhZF9uZXh0ICVkIFxuIiwgYXVkaW8tPnJlYWRfbmV4dCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJmaWxsX25leHQgJWQgXG4iLCBhdWRpby0+ZmlsbF9uZXh0KTsKLQlmb3IgKGkgPSAwOyBpIDwgYXVkaW8tPnBjbV9idWZfY291bnQ7IGkrKykKLQkJbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkiaW5bJWRdLnVzZWQgJWQgXG4iLCBpLCBhdWRpby0+aW5baV0udXNlZCk7Ci0JYnVmZmVyW25dID0gMDsKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkYWFjX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWRhYWNfZGVidWdfcmVhZCwKLQkub3BlbiA9IGF1ZGFhY19kZWJ1Z19vcGVuLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IE5VTEw7Ci0JaW50IHJjLCBkZWNfYXR0cmIsIGRlY2lkLCBpbmRleCwgb2Zmc2V0ID0gMDsKLQl1bnNpZ25lZCBwbWVtX3N6ID0gRE1BU1o7Ci0Jc3RydWN0IGF1ZGFhY19ldmVudCAqZV9ub2RlID0gTlVMTDsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9hYWNfIiArIDVdOwotI2VuZGlmCi0KLQkvKiBBbGxvY2F0ZSBhdWRpbyBpbnN0YW5jZSwgc2V0IHRvIHplcm8gKi8KLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpbyksIEdGUF9LRVJORUwpOwotCWlmICghYXVkaW8pIHsKLQkJTU1fRVJSKCJubyBtZW1vcnkgdG8gYWxsb2NhdGUgYXVkaW8gaW5zdGFuY2UgXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCU1NX0lORk8oImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBjcmVhdGVkXG4iLCAoaW50KWF1ZGlvKTsKLQotCS8qIEFsbG9jYXRlIHRoZSBkZWNvZGVyICovCi0JZGVjX2F0dHJiID0gQVVEREVDX0RFQ19BQUM7Ci0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlkZWNfYXR0cmIgfD0gTVNNX0FVRF9NT0RFX05PTlRVTk5FTDsKLQkJYXVkaW8tPnBjbV9mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERV9QTEFZQkFDSzsKLQl9IGVsc2UgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCSEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9UVU5ORUw7Ci0JCWF1ZGlvLT5wY21fZmVlZGJhY2sgPSBUVU5ORUxfTU9ERV9QTEFZQkFDSzsKLQl9IGVsc2UgewotCQlrZnJlZShhdWRpbyk7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBkb25lOwotCX0KLQlkZWNpZCA9IGF1ZHBwX2FkZWNfYWxsb2MoZGVjX2F0dHJiLCAmYXVkaW8tPm1vZHVsZV9uYW1lLAotCQkJJmF1ZGlvLT5xdWV1ZV9pZCk7Ci0KLQlpZiAoZGVjaWQgPCAwKSB7Ci0JCU1NX0VSUigiTm8gZnJlZSBkZWNvZGVyIGF2YWlsYWJsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJKGludClhdWRpbyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJa2ZyZWUoYXVkaW8pOwotCQlnb3RvIGRvbmU7Ci0JfQotCWF1ZGlvLT5kZWNfaWQgPSBkZWNpZCAmIE1TTV9BVURfREVDT0RFUl9NQVNLOwotCi0Jd2hpbGUgKHBtZW1fc3ogPj0gRE1BU1pfTUlOKSB7Ci0JCU1NX0RCRygicG1lbXN6ID0gJWRcbiIsIHBtZW1fc3opOwotCQlhdWRpby0+cGh5cyA9IGFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKHBtZW1fc3osIFNaXzRLKTsKLQkJaWYgKGF1ZGlvLT5waHlzKSB7Ci0JCQlhdWRpby0+bWFwX3Zfd3JpdGUgPQotCQkJCQlpb3JlbWFwKGF1ZGlvLT5waHlzLAotCQkJCQkJcG1lbV9zeik7Ci0JCQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl93cml0ZSkpIHsKLQkJCQlNTV9FUlIoImNvdWxkIG5vdCBtYXAgd3JpdGUgcGh5cyBhZGRyZXNzLCBcCi0JCQkJCQlmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQkJCShpbnQpYXVkaW8pOwotCQkJCXJjID0gLUVOT01FTTsKLQkJCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKGF1ZGlvLT5waHlzKTsKLQkJCQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0JCQkJa2ZyZWUoYXVkaW8pOwotCQkJCWdvdG8gZG9uZTsKLQkJCX0KLQkJCWF1ZGlvLT5kYXRhID0gKHU4ICopYXVkaW8tPm1hcF92X3dyaXRlOwotCQkJTU1fREJHKCJ3cml0ZSBidWY6IHBoeSBhZGRyIDB4JTA4eCBrZXJuZWwgYWRkciBcCi0JCQkJMHglMDh4XG4iLCBhdWRpby0+cGh5cywgKGludClhdWRpby0+ZGF0YSk7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChwbWVtX3N6ID09IERNQVNaX01JTikgewotCQkJTU1fRVJSKCJjb3VsZCBub3QgYWxsb2NhdGUgd3JpdGUgYnVmZmVycywgZnJlZWluZyBcCi0JCQkJCWluc3RhbmNlIDB4JTA4eFxuIiwgKGludClhdWRpbyk7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0JCQlrZnJlZShhdWRpbyk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0gZWxzZQotCQkJcG1lbV9zeiA+Pj0gMTsKLQl9Ci0JYXVkaW8tPm91dF9kbWFfc3ogPSBwbWVtX3N6OwotCi0JYXVkaW8tPnJlYWRfcGh5cyA9IGFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKFBDTV9CVUZTWl9NSU4KLQkJCQkJKiBQQ01fQlVGX01BWF9DT1VOVCwgU1pfNEspOwotCWlmICghYXVkaW8tPnJlYWRfcGh5cykgewotCQlNTV9FUlIoImNvdWxkIG5vdCBhbGxvY2F0ZSByZWFkIGJ1ZmZlcnMsIGZyZWVpbmcgaW5zdGFuY2UgXAotCQkJCTB4JTA4eFxuIiwgKGludClhdWRpbyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJaW91bm1hcChhdWRpby0+bWFwX3Zfd3JpdGUpOwotCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKGF1ZGlvLT5waHlzKTsKLQkJYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotCQlrZnJlZShhdWRpbyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYXVkaW8tPm1hcF92X3JlYWQgPSBpb3JlbWFwKGF1ZGlvLT5yZWFkX3BoeXMsCi0JCQkJUENNX0JVRlNaX01JTiAqIFBDTV9CVUZfTUFYX0NPVU5UKTsKLQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl9yZWFkKSkgewotCQlNTV9FUlIoImNvdWxkIG5vdCBtYXAgcmVhZCBwaHlzIGFkZHJlc3MsIGZyZWVpbmcgaW5zdGFuY2UgXAotCQkJCTB4JTA4eFxuIiwgKGludClhdWRpbyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJaW91bm1hcChhdWRpby0+bWFwX3Zfd3JpdGUpOwotCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKGF1ZGlvLT5waHlzKTsKLQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcihhdWRpby0+cmVhZF9waHlzKTsKLQkJYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotCQlrZnJlZShhdWRpbyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYXVkaW8tPnJlYWRfZGF0YSA9IGF1ZGlvLT5tYXBfdl9yZWFkOwotCU1NX0RCRygicmVhZCBidWY6IHBoeSBhZGRyIDB4JTA4eCBrZXJuZWwgYWRkciAweCUwOHhcbiIsCi0JCQkJYXVkaW8tPnJlYWRfcGh5cywgKGludClhdWRpby0+cmVhZF9kYXRhKTsKLQotCXJjID0gbXNtX2Fkc3BfZ2V0KGF1ZGlvLT5tb2R1bGVfbmFtZSwgJmF1ZGlvLT5hdWRwbGF5LAotCQkJICAmYXVkcGxheV9hZHNwX29wc19hYWMsIGF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJmYWlsZWQgdG8gZ2V0ICVzIG1vZHVsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJYXVkaW8tPm1vZHVsZV9uYW1lLCAoaW50KWF1ZGlvKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JbXV0ZXhfaW5pdCgmYXVkaW8tPmxvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+cmVhZF9sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZHNwX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+YXZzeW5jX3dhaXQpOwotCi0JYXVkaW8tPm91dFswXS5kYXRhID0gYXVkaW8tPmRhdGEgKyAwOwotCWF1ZGlvLT5vdXRbMF0uYWRkciA9IGF1ZGlvLT5waHlzICsgMDsKLQlhdWRpby0+b3V0WzBdLnNpemUgPSBhdWRpby0+b3V0X2RtYV9zeiA+PiAxOwotCi0JYXVkaW8tPm91dFsxXS5kYXRhID0gYXVkaW8tPmRhdGEgKyBhdWRpby0+b3V0WzBdLnNpemU7Ci0JYXVkaW8tPm91dFsxXS5hZGRyID0gYXVkaW8tPnBoeXMgKyBhdWRpby0+b3V0WzBdLnNpemU7Ci0JYXVkaW8tPm91dFsxXS5zaXplID0gYXVkaW8tPm91dFswXS5zaXplOwotCi0JYXVkaW8tPnBjbV9idWZfY291bnQgPSBQQ01fQlVGX01BWF9DT1VOVDsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBQQ01fQlVGX01BWF9DT1VOVDsgaW5kZXgrKykgewotCQlhdWRpby0+aW5baW5kZXhdLmRhdGEgPSBhdWRpby0+cmVhZF9kYXRhICsgb2Zmc2V0OwotCQlhdWRpby0+aW5baW5kZXhdLmFkZHIgPSBhdWRpby0+cmVhZF9waHlzICsgb2Zmc2V0OwotCQlhdWRpby0+aW5baW5kZXhdLnNpemUgPSBQQ01fQlVGU1pfTUlOOwotCQlhdWRpby0+aW5baW5kZXhdLnVzZWQgPSAwOwotCQlvZmZzZXQgKz0gUENNX0JVRlNaX01JTjsKLQl9Ci0KLQlhdWRpby0+b3V0X3NhbXBsZV9yYXRlID0gNDQxMDA7Ci0JYXVkaW8tPm91dF9jaGFubmVsX21vZGUgPSBBVURQUF9DTURfUENNX0lOVEZfU1RFUkVPX1Y7Ci0JYXVkaW8tPmFhY19jb25maWcuZm9ybWF0ID0gQVVESU9fQUFDX0ZPUk1BVF9BRFRTOwotCWF1ZGlvLT5hYWNfY29uZmlnLmF1ZGlvX29iamVjdCA9IEFVRElPX0FBQ19PQkpFQ1RfTEM7Ci0JYXVkaW8tPmFhY19jb25maWcuZXBfY29uZmlnID0gMDsKLQlhdWRpby0+YWFjX2NvbmZpZy5hYWNfc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9Ci0JCUFVRElPX0FBQ19TRUNfREFUQV9SRVNfT0ZGOwotCWF1ZGlvLT5hYWNfY29uZmlnLmFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9Ci0JCUFVRElPX0FBQ19TQ0FfREFUQV9SRVNfT0ZGOwotCWF1ZGlvLT5hYWNfY29uZmlnLmFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9Ci0JCUFVRElPX0FBQ19TUEVDX0RBVEFfUkVTX09GRjsKLSNpZmRlZiBDT05GSUdfQVVESU9fQUFDX1BMVVMKLQlhdWRpby0+YWFjX2NvbmZpZy5zYnJfb25fZmxhZyA9IEFVRElPX0FBQ19TQlJfT05fRkxBR19PTjsKLSNlbHNlCi0JYXVkaW8tPmFhY19jb25maWcuc2JyX29uX2ZsYWcgPSBBVURJT19BQUNfU0JSX09OX0ZMQUdfT0ZGOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FVRElPX0VOSEFOQ0VEX0FBQ19QTFVTCi0JYXVkaW8tPmFhY19jb25maWcuc2JyX3BzX29uX2ZsYWcgPSBBVURJT19BQUNfU0JSX1BTX09OX0ZMQUdfT047Ci0jZWxzZQotCWF1ZGlvLT5hYWNfY29uZmlnLnNicl9wc19vbl9mbGFnID0gQVVESU9fQUFDX1NCUl9QU19PTl9GTEFHX09GRjsKLSNlbmRpZgotCWF1ZGlvLT5hYWNfY29uZmlnLmR1YWxfbW9ub19tb2RlID0gQVVESU9fQUFDX0RVQUxfTU9OT19QTF9TUjsKLQlhdWRpby0+YWFjX2NvbmZpZy5jaGFubmVsX2NvbmZpZ3VyYXRpb24gPSAyOwotCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IDB4MjAwMDsKLQlhdWRpby0+Yml0c3RyZWFtX2Vycm9yX3RocmVzaG9sZF92YWx1ZSA9Ci0JCUJJVFNUUkVBTV9FUlJPUl9USFJFU0hPTERfVkFMVUU7Ci0KLQlhdWRpb19mbHVzaChhdWRpbyk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQlhdWRpby0+b3BlbmVkID0gMTsKLQotCWF1ZGlvLT5kZXZpY2VfZXZlbnRzID0gQVVEREVWX0VWVF9ERVZfUkRZCi0JCQkJfEFVRERFVl9FVlRfREVWX1JMU3wKLQkJCQlBVURERVZfRVZUX1NUUkVBTV9WT0xfQ0hHOwotCi0JcmMgPSBhdWRkZXZfcmVnaXN0ZXJfZXZ0X2xpc3RuZXIoYXVkaW8tPmRldmljZV9ldmVudHMsCi0JCQkJCUFVRERFVl9DTE5UX0RFQywKLQkJCQkJYXVkaW8tPmRlY19pZCwKLQkJCQkJYWFjX2xpc3RuZXIsCi0JCQkJCSh2b2lkICopYXVkaW8pOwotCWlmIChyYykgewotCQlNTV9FUlIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgbGlzdG5lclxuIiwgX19mdW5jX18pOwotCQlnb3RvIGV2ZW50X2VycjsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlzbnByaW50ZihuYW1lLCBzaXplb2YgbmFtZSwgIm1zbV9hYWNfJTA0eCIsIGF1ZGlvLT5kZWNfaWQpOwotCWF1ZGlvLT5kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCU5VTEwsICh2b2lkICopIGF1ZGlvLAotCQkJCSZhdWRhYWNfZGVidWdfZm9wcyk7Ci0KLQlpZiAoSVNfRVJSKGF1ZGlvLT5kZW50cnkpKQotCQlNTV9EQkcoImRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUubGV2ZWwgPSBFQVJMWV9TVVNQRU5EX0xFVkVMX0RJU0FCTEVfRkI7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUucmVzdW1lID0gYXVkYWFjX3Jlc3VtZTsKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5zdXNwZW5kID0gYXVkYWFjX3N1c3BlbmQ7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLmF1ZGlvID0gYXVkaW87Ci0JcmVnaXN0ZXJfZWFybHlfc3VzcGVuZCgmYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUpOwotI2VuZGlmCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgQVVEQUFDX0VWRU5UX05VTTsgaW5kZXgrKykgewotCQllX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkYWFjX2V2ZW50KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChlX25vZGUpCi0JCQlsaXN0X2FkZF90YWlsKCZlX25vZGUtPmxpc3QsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JCWVsc2UgewotCQkJTU1fRVJSKCJldmVudCBwa3QgYWxsb2MgZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCW1lbXNldCgmYXVkaW8tPnN0cmVhbV9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19iaXRzdHJlYW1faW5mbykpOwotCW1lbXNldCgmYXVkaW8tPmJpdHN0cmVhbV9lcnJvcl9pbmZvLCAwLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYml0c3RyZWFtX2luZm8pKTsKLWRvbmU6Ci0JcmV0dXJuIHJjOwotZXZlbnRfZXJyOgotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci1lcnI6Ci0JaW91bm1hcChhdWRpby0+bWFwX3Zfd3JpdGUpOwotCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPnBoeXMpOwotCWlvdW5tYXAoYXVkaW8tPm1hcF92X3JlYWQpOwotCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPnJlYWRfcGh5cyk7Ci0JYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2FhY19mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gYXVkaW9fb3BlbiwKLQkucmVsZWFzZSA9IGF1ZGlvX3JlbGVhc2UsCi0JLnJlYWQgPSBhdWRpb19yZWFkLAotCS53cml0ZSA9IGF1ZGlvX3dyaXRlLAotCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGlvX2lvY3RsLAotCS5mc3luYyA9IGF1ZGFhY19mc3luYwotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fYWFjX21pc2MgPSB7Ci0JLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lID0gIm1zbV9hYWMiLAotCS5mb3BzID0gJmF1ZGlvX2FhY19mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9faW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19hYWNfbWlzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdWRpb19leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZhdWRpb19hYWNfbWlzYyk7Ci19Ci0KLW1vZHVsZV9pbml0KGF1ZGlvX2luaXQpOwotbW9kdWxlX2V4aXQoYXVkaW9fZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIEFBQyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fYWFjX2luLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2FhY19pbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjFmNThkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fYWFjX2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDgxICswLDAgQEAKLS8qCi0gKiBhYWMgYXVkaW8gaW5wdXQgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19hYWMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1vcnlfYWxsb2MuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9tZW10eXBlcy5oPgotCi0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXUuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11X2RvbWFpbnMuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRyZWNjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcmVjbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZHByZXByb2MuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLSNpbmNsdWRlIDxtYWNoL3NvY2luZm8uaD4KLQotLyogRlJBTUVfTlVNIG11c3QgYmUgYSBwb3dlciBvZiB0d28gKi8KLSNkZWZpbmUgRlJBTUVfTlVNCQkoOCkKLSNkZWZpbmUgRlJBTUVfU0laRQkJKDc3MiAqIDIpIC8qIDE1MzYgYnl0ZXMgZGF0YSAqLwotI2RlZmluZSBOVF9GUkFNRV9TSVpFCSg3ODAgKiAyKSAvKiAxNTM2IGJ5dGVzIGRhdGEgICsgMjQgbWV0YSBmaWVsZCovCi0jZGVmaW5lIEFBQ19GUkFNRV9TSVpFCTE1MzYKLSNkZWZpbmUgRE1BU1ogCQkJKEZSQU1FX1NJWkUgKiBGUkFNRV9OVU0pCi0jZGVmaW5lIE9VVF9GUkFNRV9OVU0JKDIpCi0jZGVmaW5lIE1FVEFfT1VUX1NJWkUJKDI0KQotI2RlZmluZSBNRVRBX0lOX1NJWkUJKDE0KQotI2RlZmluZSBPVVRfQlVGRkVSX1NJWkUgKDMyICogMTAyNCArIE1FVEFfT1VUX1NJWkUpCi0jZGVmaW5lIEJVRkZFUl9TSVpFCQkoT1VUX0JVRkZFUl9TSVpFICogT1VUX0ZSQU1FX05VTSkKLQotI2RlZmluZSBBVURQUkVQUk9DX0FBQ19FT1NfRkxHX09GRlNFVCAweDBBIC8qIE9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBidWZmZXIgKi8KLSNkZWZpbmUgQVVEUFJFUFJPQ19BQUNfRU9TX0ZMR19NQVNLIDB4MDEKLSNkZWZpbmUgQVVEUFJFUFJPQ19BQUNfRU9TX05PTkUgMHgwIC8qIE5vIEVPUyBkZXRlY3RlZCAqLwotI2RlZmluZSBBVURQUkVQUk9DX0FBQ19FT1NfU0VUIDB4MSAvKiBFT1Mgc2V0IGluIG1ldGEgZmllbGQgKi8KLQotI2RlZmluZSBQQ01fQ09ORklHX1VQREFURV9GTEFHX0VOQUJMRSAtMQotI2RlZmluZSBQQ01fQ09ORklHX1VQREFURV9GTEFHX0RJU0FCTEUJMAotCi0jZGVmaW5lIEVOQUJMRV9GTEFHX1ZBTFVFCS0xCi0jZGVmaW5lIERJU0FCTEVfRkxBR19WQUxVRQkwCi0KLXN0cnVjdCBidWZmZXIgewotCXZvaWQgKmRhdGE7Ci0JdWludDMyX3Qgc2l6ZTsKLQl1aW50MzJfdCByZWFkOwotCXVpbnQzMl90IGFkZHI7Ci0JdWludDMyX3QgdXNlZDsKLQl1aW50MzJfdCBtZmllbGRfc3o7Ci19OwotCi1zdHJ1Y3QgYXVkaW9faW4gewotCXN0cnVjdCBidWZmZXIgaW5bRlJBTUVfTlVNXTsKLQotCXNwaW5sb2NrX3QgZHNwX2xvY2s7Ci0KLQlhdG9taWNfdCBpbl9ieXRlczsKLQlhdG9taWNfdCBpbl9zYW1wbGVzOwotCi0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IG11dGV4IHJlYWRfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfZW5hYmxlOwotCS8qd3JpdGUgc2VjdGlvbiovCi0Jc3RydWN0IGJ1ZmZlciBvdXRbT1VUX0ZSQU1FX05VTV07Ci0KLQl1aW50OF90IG91dF9oZWFkOwotCXVpbnQ4X3Qgb3V0X3RhaWw7Ci0JdWludDhfdCBvdXRfbmVlZGVkOwkvKiBudW1iZXIgb2YgYnVmZmVycyB0aGUgZHNwIGlzIHdhaXRpbmcgZm9yICovCi0JdWludDMyX3Qgb3V0X2NvdW50OwotCi0Jc3RydWN0IG11dGV4IHdyaXRlX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd3JpdGVfd2FpdDsKLQlpbnQzMl90IG91dF9waHlzOyAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHdyaXRlIGJ1ZmZlciAqLwotCWNoYXIgKm91dF9kYXRhOwotCXZvaWQgKm1hcF92X3JlYWQ7Ci0Jdm9pZCAqbWFwX3Zfd3JpdGU7Ci0KLQlpbnQgbWZpZWxkOyAvKiBtZXRhIGZpZWxkIGVtYmVkZGVkIGluIGRhdGEgKi8KLQlpbnQgd2ZsdXNoOyAvKndyaXRlIGZsdXNoICovCi0JaW50IHJmbHVzaDsgLypyZWFkIGZsdXNoKi8KLQlpbnQgb3V0X2ZyYW1lX2NudDsKLQotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKmF1ZHJlYzsKLQotCS8qIGNvbmZpZ3VyYXRpb24gdG8gdXNlIG9uIG5leHQgZW5hYmxlICovCi0JdWludDMyX3QgYnVmZmVyX3NpemU7IC8qIEZyYW1lIHNpemUgKDM2IGJ5dGVzKSAqLwotCXVpbnQzMl90IHNhbXBfcmF0ZTsKLQl1aW50MzJfdCBjaGFubmVsX21vZGU7Ci0JdWludDMyX3QgYml0X3JhdGU7IC8qIGJpdCByYXRlIGZvciBBQUMgKi8KLQl1aW50MzJfdCByZWNvcmRfcXVhbGl0eTsgLyogcmVjb3JkIHF1YWxpdHkgKGJpdHMvc2FtcGxlL2NoYW5uZWwpICovCi0JdWludDMyX3QgZW5jX3R5cGU7Ci0KLQl1aW50MzJfdCBkc3BfY250OwotCXVpbnQzMl90IGluX2hlYWQ7IC8qIG5leHQgYnVmZmVyIGRzcCB3aWxsIHdyaXRlICovCi0JdWludDMyX3QgaW5fdGFpbDsgLyogbmV4dCBidWZmZXIgcmVhZCgpIHdpbGwgcmVhZCAqLwotCXVpbnQzMl90IGluX2NvdW50OyAvKiBudW1iZXIgb2YgYnVmZmVycyBhdmFpbGFibGUgdG8gcmVhZCgpICovCi0JdWludDMyX3QgbW9kZTsKLQl1aW50MzJfdCBlb3NfYWNrOwotCXVpbnQzMl90IGZsdXNoX2FjazsKLQotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIHF1ZXVlX2lkczsKLQl1aW50MTZfdCBlbmNfaWQ7Ci0KLQlzdHJ1Y3QgYXVkcmVjX3Nlc3Npb25faW5mbyBzZXNzaW9uX2luZm87IC8qYXVkcmVjIHNlc3Npb24gaW5mbyovCi0JdWludDE2X3Qgc291cmNlOyAvKiBFbmNvZGluZyBzb3VyY2UgYml0IG1hc2sgKi8KLQl1aW50MzJfdCBkZXZpY2VfZXZlbnRzOyAvKiBkZXZpY2UgZXZlbnRzIGludGVyZXN0ZWQgaW4gKi8KLQl1aW50MzJfdCBkZXZfY250OwotCXNwaW5sb2NrX3QgZGV2X2xvY2s7Ci0KLQkvKiBkYXRhIGFsbG9jYXRlZCBmb3IgdmFyaW91cyBidWZmZXJzICovCi0JY2hhciAqZGF0YTsKLQlkbWFfYWRkcl90IHBoeXM7Ci0KLQlpbnQgb3BlbmVkOwotCWludCBlbmFibGVkOwotCWludCBydW5uaW5nOwotCWludCBzdG9wcGVkOyAvKiBzZXQgd2hlbiBzdG9wcGVkLCBjbGVhcmVkIG9uIGZsdXNoICovCi0JaW50IGFib3J0OyAvKiBzZXQgd2hlbiBlcnJvciwgbGlrZSBzYW1wbGUgcmF0ZSBtaXNtYXRjaCAqLwotCWNoYXIgKmJ1aWxkX2lkOwotfTsKLQotc3RydWN0IGF1ZGlvX2ZyYW1lIHsKLQl1aW50MTZfdCBmcmFtZV9jb3VudF9sc3c7Ci0JdWludDE2X3QgZnJhbWVfY291bnRfbXN3OwotCXVpbnQxNl90IGZyYW1lX2xlbmd0aDsKLQl1aW50MTZfdCBlcmFzZWRfcGNtOwotCXVuc2lnbmVkIGNoYXIgcmF3X2JpdHN0cmVhbVtdOyAvKiBzYW1wbGVzICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgYXVkaW9fZnJhbWVfbnQgewotCXVpbnQxNl90IG1ldGFkYXRhX2xlbjsKLQl1aW50MTZfdCBmcmFtZV9jb3VudF9sc3c7Ci0JdWludDE2X3QgZnJhbWVfY291bnRfbXN3OwotCXVpbnQxNl90IGZyYW1lX2xlbmd0aDsKLQl1aW50MTZfdCBlcmFzZWRfcGNtOwotCXVpbnQxNl90IHJlc2VydmVkOwotCXVpbnQxNl90IHRpbWVfc3RhbXBfZHdvcmRfbHN3OwotCXVpbnQxNl90IHRpbWVfc3RhbXBfZHdvcmRfbXN3OwotCXVpbnQxNl90IHRpbWVfc3RhbXBfbHN3OwotCXVpbnQxNl90IHRpbWVfc3RhbXBfbXN3OwotCXVpbnQxNl90IG5mbGFnX2xzdzsKLQl1aW50MTZfdCBuZmxhZ19tc3c7Ci0JdW5zaWduZWQgY2hhciByYXdfYml0c3RyZWFtW107IC8qIHNhbXBsZXMgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBhYWNfZW5jb2RlZF9tZXRhX2luIHsKLQl1aW50MTZfdCBtZXRhZGF0YV9sZW47Ci0JdWludDE2X3QgdGltZV9zdGFtcF9kd29yZF9sc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9kd29yZF9tc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9sc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9tc3c7Ci0JdWludDE2X3QgbmZsYWdfbHN3OwotCXVpbnQxNl90IG5mbGFnX21zdzsKLX07Ci0KLS8qIEF1ZHJlYyBRdWV1ZSBjb21tYW5kIHNlbnQgbWFjcm8ncyAqLwotI2RlZmluZSBhdWRyZWNfc2VuZF9iaXRzdHJlYW1xdWV1ZShhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcmVjLCAoKGF1ZGlvLT5xdWV1ZV9pZHMgJiAweEZGRkYwMDAwKSA+PiAxNiksXAotCQkJY21kLCBsZW4pCi0KLSNkZWZpbmUgYXVkcmVjX3NlbmRfYXVkcmVjcXVldWUoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHJlYywgKGF1ZGlvLT5xdWV1ZV9pZHMgJiAweDAwMDBGRkZGKSxcCi0JCQljbWQsIGxlbikKLQotLyogRFNQIGNvbW1hbmQgc2VuZCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgYXVkYWFjX2luX2VuY19jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgaW50IGF1ZGFhY19pbl9wYXJhbV9jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbyk7Ci1zdGF0aWMgaW50IGF1ZGFhY19pbl9tZW1fY29uZmlnKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pOwotc3RhdGljIGludCBhdWRhYWNfaW5fcmVjb3JkX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLCBpbnQgZW5hYmxlKTsKLXN0YXRpYyBpbnQgYXVkYWFjX2RzcF9yZWFkX2J1ZmZlcihzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLCB1aW50MzJfdCByZWFkX2NudCk7Ci0KLXN0YXRpYyB2b2lkIGF1ZGFhY19pbl9nZXRfZHNwX2ZyYW1lcyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLXN0YXRpYyBpbnQgYXVkcGNtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZGFhY19vdXRfZmx1c2goc3RydWN0IGF1ZGlvX2luICphdWRpbyk7Ci1zdGF0aWMgaW50IGF1ZHByZXByb2NfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvX2luICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRwcmVwcm9jX3BjbV9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvX2luICphdWRpbywgdW5zaWduZWQgbmVlZGVkKTsKLXN0YXRpYyB2b2lkIGF1ZGFhY19udF9pbl9nZXRfZHNwX2ZyYW1lcyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLQotc3RhdGljIHZvaWQgYXVkYWFjX2luX2ZsdXNoKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pOwotCi1zdGF0aWMgdm9pZCBhYWNfaW5fbGlzdGVuZXIodTMyIGV2dF9pZCwgdW5pb24gYXVkZGV2X2V2dF9kYXRhICpldnRfcGF5bG9hZCwKLQkJCQl2b2lkICpwcml2YXRlX2RhdGEpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IChzdHJ1Y3QgYXVkaW9faW4gKikgcHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlNTV9EQkcoImV2dF9pZCA9IDB4JTh4XG4iLCBldnRfaWQpOwotCXN3aXRjaCAoZXZ0X2lkKSB7Ci0JY2FzZSBBVURERVZfRVZUX0RFVl9SRFk6IHsKLQkJTU1fREJHKCJBVURERVZfRVZUX0RFVl9SRFlcbiIpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRldl9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT5kZXZfY250Kys7Ci0JCWF1ZGlvLT5zb3VyY2UgfD0gKDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCi0JCWlmICgoYXVkaW8tPnJ1bm5pbmcgPT0gMSkgJiYgKGF1ZGlvLT5lbmFibGVkID09IDEpICYmCi0JCQkoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpKQotCQkJYXVkYWFjX2luX3JlY29yZF9jb25maWcoYXVkaW8sIDEpOwotCi0JCWJyZWFrOwotCX0KLQljYXNlIEFVRERFVl9FVlRfREVWX1JMUzogewotCQlNTV9EQkcoIkFVRERFVl9FVlRfREVWX1JMU1xuIik7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZGV2X2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPmRldl9jbnQtLTsKLQkJYXVkaW8tPnNvdXJjZSAmPSB+KDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCi0JCWlmICgoIWF1ZGlvLT5ydW5uaW5nKSB8fCAoIWF1ZGlvLT5lbmFibGVkKSkKLQkJCWJyZWFrOwotCi0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkgewotCQkJLyogVHVybiBvZiBhcyBwZXIgc291cmNlICovCi0JCQlpZiAoYXVkaW8tPnNvdXJjZSkKLQkJCQlhdWRhYWNfaW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMSk7Ci0JCQllbHNlCi0JCQkvKiBUdXJuIG9mZiBhbGwgKi8KLQkJCQlhdWRhYWNfaW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEREVWX0VWVF9GUkVRX0NIRzogewotCQlNTV9EQkcoIkVuY29kZXIgRHJpdmVyIGdvdCBzYW1wbGUgcmF0ZSBjaGFuZ2UgZXZlbnRcbiIpOwotCQlNTV9EQkcoInNhbXBsZSByYXRlICVkXG4iLCBldnRfcGF5bG9hZC0+ZnJlcV9pbmZvLnNhbXBsZV9yYXRlKTsKLQkJTU1fREJHKCJkZXZfdHlwZSAlZFxuIiwgZXZ0X3BheWxvYWQtPmZyZXFfaW5mby5kZXZfdHlwZSk7Ci0JCU1NX0RCRygiYWNkYl9kZXZfaWQgJWRcbiIsIGV2dF9wYXlsb2FkLT5mcmVxX2luZm8uYWNkYl9kZXZfaWQpOwotCQlpZiAoKGF1ZGlvLT5ydW5uaW5nID09IDEpICYmIChhdWRpby0+ZW5hYmxlZCA9PSAxKSkgewotCQkJLyogU3RvcCBSZWNvcmRpbmcgc2FtcGxlIHJhdGUgZG9lcyBub3QgbWF0Y2gKLQkJCSAgIHdpdGggZGV2aWNlIHNhbXBsZSByYXRlICovCi0JCQlpZiAoZXZ0X3BheWxvYWQtPmZyZXFfaW5mby5zYW1wbGVfcmF0ZSAhPQotCQkJCWF1ZGlvLT5zYW1wX3JhdGUpIHsKLQkJCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpCi0JCQkJCWF1ZGFhY19pbl9yZWNvcmRfY29uZmlnKGF1ZGlvLCAwKTsKLQkJCQlhdWRpby0+YWJvcnQgPSAxOwotCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJ3cm9uZyBldmVudCAlZFxuIiwgZXZ0X2lkKTsKLQkJYnJlYWs7Ci0JfQotfQotCi0vKiBDb252ZXJ0IEJpdCBSYXRlIHRvIFJlY29yZCBRdWFsaXR5IGZpZWxkIG9mIERTUCAqLwotc3RhdGljIHVuc2lnbmVkIGludCBiaXRyYXRlX3RvX3JlY29yZF9xdWFsaXR5KHVuc2lnbmVkIGludCBzYW1wbGVfcmF0ZSwKLQkJdW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBiaXRfcmF0ZSkgewotCXVuc2lnbmVkIGludCB0ZW1wOwotCi0JdGVtcCA9IHNhbXBsZV9yYXRlICogY2hhbm5lbDsKLQlNTV9EQkcoIiBzYW1wbGUgcmF0ZSAqICBjaGFubmVsID0gJWQgXG4iLCB0ZW1wKTsKLQkvKiBUbyByZXByZXNlbnQgaW4gUTEyIGZpeGVkIGZvcm1hdCAqLwotCXRlbXAgPSAoYml0X3JhdGUgKiA0MDk2KSAvIHRlbXA7Ci0JTU1fREJHKCIgUmVjb3JkIFF1YWxpdHkgPSAweCU4eCBcbiIsIHRlbXApOwotCXJldHVybiB0ZW1wOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCBwcmVwcm9jIGV2ZW50IGhhbmRsZXItLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZHByZXByb2NfZHNwX2V2ZW50KHZvaWQgKmRhdGEsIHVuc2lnbmVkIGlkLCAgdm9pZCAqbXNnKQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSBkYXRhOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUFJFUFJPQ19FUlJPUl9NU0c6IHsKLQkJc3RydWN0IGF1ZHByZXByb2NfZXJyX21zZyAqZXJyX21zZyA9IG1zZzsKLQotCQlNTV9FUlIoIkVSUk9SX01TRzogc3RyZWFtIGlkICVkIGVyciBpZHggJWRcbiIsCi0JCWVycl9tc2ctPnN0cmVhbV9pZCwgZXJyX21zZy0+YXVkX3ByZXByb2NfZXJyX2lkeCk7Ci0JCS8qIEVycm9yIGNhc2UgKi8KLQkJd2FrZV91cCgmYXVkaW8tPndhaXRfZW5hYmxlKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFJFUFJPQ19DTURfQ0ZHX0RPTkVfTVNHOiB7Ci0JCU1NX0RCRygiQ01EX0NGR19ET05FX01TRyBcbiIpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURQUkVQUk9DX0NNRF9FTkNfQ0ZHX0RPTkVfTVNHOiB7Ci0JCXN0cnVjdCBhdWRwcmVwcm9jX2NtZF9lbmNfY2ZnX2RvbmVfbXNnICplbmNfY2ZnX21zZyA9IG1zZzsKLQotCQlNTV9EQkcoIkNNRF9FTkNfQ0ZHX0RPTkVfTVNHOiBzdHJlYW0gaWQgJWQgZW5jIHR5cGUgXAotCQkJMHglOHhcbiIsIGVuY19jZmdfbXNnLT5zdHJlYW1faWQsCi0JCQllbmNfY2ZnX21zZy0+cmVjX2VuY190eXBlKTsKLQkJLyogRW5jb2RlciBlbmFibGUgc3VjY2VzcyAqLwotCQlpZiAoZW5jX2NmZ19tc2ctPnJlY19lbmNfdHlwZSAmIEVOQ09ERV9FTkFCTEUpIHsKLQkJCWlmKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKSB7Ci0JCQkJTU1fREJHKCJyb3V0aW5nIGNvbW1hbmRcbiIpOwotCQkJCWF1ZHByZXByb2NfY21kX2NmZ19yb3V0aW5nX21vZGUoYXVkaW8pOwotCQkJfSBlbHNlIHsKLQkJCQlhdWRhYWNfaW5fcGFyYW1fY29uZmlnKGF1ZGlvKTsKLQkJCX0KLQkJfSBlbHNlIHsgLyogRW5jb2RlciBkaXNhYmxlIHN1Y2Nlc3MgKi8KLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkKLQkJCQlhdWRhYWNfaW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMCk7Ci0JCQllbHNlCi0JCQkJd2FrZV91cCgmYXVkaW8tPndhaXRfZW5hYmxlKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURQUkVQUk9DX0NNRF9FTkNfUEFSQU1fQ0ZHX0RPTkVfTVNHOiB7Ci0JCU1NX0RCRygiQ01EX0VOQ19QQVJBTV9DRkdfRE9ORV9NU0dcbiIpOwotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpCi0JCQlhdWRhYWNfaW5fbWVtX2NvbmZpZyhhdWRpbyk7Ci0JCWVsc2UKLQkJCWF1ZHBjbV9jb25maWcoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURQUkVQUk9DX0NNRF9ST1VUSU5HX01PREVfRE9ORV9NU0c6IHsKLQkJc3RydWN0IGF1ZHByZXByb2NfY21kX3JvdXRpbmdfbW9kZV9kb25lXAotCQkJCSpyb3V0aW5nX2NmZ19kb25lX21zZyA9IG1zZzsKLQkJaWYgKHJvdXRpbmdfY2ZnX2RvbmVfbXNnLT5jb25maWd1cmF0aW9uID09IDApIHsKLQkJCU1NX0lORk8oInJvdXRpbmcgY29uZmlndXJhdGlvbiBmYWlsZWRcbiIpOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAwOwotCQl9IGVsc2UKLQkJCWF1ZGFhY19pbl9wYXJhbV9jb25maWcoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURQUkVQUk9DX0FGRV9DTURfQVVESU9fUkVDT1JEX0NGR19ET05FX01TRzogewotCQlNTV9EQkcoIkFGRV9DTURfQVVESU9fUkVDT1JEX0NGR19ET05FX01TR1xuIik7Ci0JCXdha2VfdXAoJmF1ZGlvLT53YWl0X2VuYWJsZSk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlNTV9FUlIoIlVua25vd24gRXZlbnQgaWQgJWRcbiIsIGlkKTsKLQl9Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZHNwIGF1ZHJlYyBldmVudCBoYW5kbGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgdm9pZCBhdWRyZWNfZHNwX2V2ZW50KHZvaWQgKmRhdGEsIHVuc2lnbmVkIGlkLCBzaXplX3QgbGVuLAotCQkJICAgIHZvaWQgKCpnZXRldmVudCkodm9pZCAqcHRyLCBzaXplX3QgbGVuKSkKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gZGF0YTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFJFQ19DTURfTUVNX0NGR19ET05FX01TRzogewotCQlNTV9EQkcoIkNNRF9NRU1fQ0ZHX0RPTkUgTVNHIERPTkVcbiIpOwotCQlhdWRpby0+cnVubmluZyA9IDE7Ci0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkgewotCQkJaWYgKGF1ZGlvLT5kZXZfY250ID4gMCkKLQkJCQlhdWRhYWNfaW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMSk7Ci0JCX0gZWxzZSB7Ci0JCQlhdWRwcmVwcm9jX3BjbV9zZW5kX2RhdGEoYXVkaW8sIDEpOwotCQkJd2FrZV91cCgmYXVkaW8tPndhaXRfZW5hYmxlKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfRkFUQUxfRVJSX01TRzogewotCQlzdHJ1Y3QgYXVkcmVjX2ZhdGFsX2Vycl9tc2cgZmF0YWxfZXJyX21zZzsKLQotCQlnZXRldmVudCgmZmF0YWxfZXJyX21zZywgQVVEUkVDX0ZBVEFMX0VSUl9NU0dfTEVOKTsKLQkJTU1fRVJSKCJGQVRBTF9FUlJfTVNHOiBlcnIgaWQgJWRcbiIsCi0JCQkJZmF0YWxfZXJyX21zZy5hdWRyZWNfZXJyX2lkKTsKLQkJLyogRXJyb3Igc3RvcCB0aGUgZW5jb2RlciAqLwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKQotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfVVBfUEFDS0VUX1JFQURZX01TRzogewotCQlzdHJ1Y3QgYXVkcmVjX3VwX3BrdF9yZWFkeV9tc2cgcGt0X3JlYWR5X21zZzsKLQotCQlnZXRldmVudCgmcGt0X3JlYWR5X21zZywgQVVEUkVDX1VQX1BBQ0tFVF9SRUFEWV9NU0dfTEVOKTsKLQkJTU1fREJHKCJVUF9QQUNLRVRfUkVBRFlfTVNHOiB3cml0ZSBjbnQgbHN3ICAlZCBcCi0JCXdyaXRlIGNudCBtc3cgJWQgcmVhZCBjbnQgbHN3ICVkICByZWFkIGNudCBtc3cgJWQgXG4iLFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfcGFja2V0X3dyaXRlX2NudF9sc3csIFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfcGFja2V0X3dyaXRlX2NudF9tc3csIFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfdXBfcHJldl9yZWFkX2NudF9sc3csIFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfdXBfcHJldl9yZWFkX2NudF9tc3cpOwotCi0JCWF1ZGFhY19pbl9nZXRfZHNwX2ZyYW1lcyhhdWRpbyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19DTURfUENNX0JVRkZFUl9QVFJfVVBEQVRFX0FSTV9UT19FTkNfTVNHOiB7Ci0JCU1NX0RCRygicHRyX3VwZGF0ZSByZWNpZXZlZCBmcm9tIERTUFxuIik7Ci0JCWF1ZHByZXByb2NfcGNtX3NlbmRfZGF0YShhdWRpbywgMSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19DTURfUENNX0NGR19BUk1fVE9fRU5DX0RPTkVfTVNHOiB7Ci0JCU1NX0VSUigiQVVEUkVDX0NNRF9QQ01fQ0ZHX0FSTV9UT19FTkNfRE9ORV9NU0ciKTsKLQkJYXVkYWFjX2luX21lbV9jb25maWcoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfVVBfTlRfUEFDS0VUX1JFQURZX01TRzogewotCQlzdHJ1Y3QgYXVkcmVjX3VwX250X3BhY2tldF9yZWFkeV9tc2cgcGt0X3JlYWR5X21zZzsKLQotCQlnZXRldmVudCgmcGt0X3JlYWR5X21zZywgQVVEUkVDX1VQX05UX1BBQ0tFVF9SRUFEWV9NU0dfTEVOKTsKLQkJTU1fREJHKCJVUF9OVF9QQUNLRVRfUkVBRFlfTVNHOiB3cml0ZSBjbnQgbHN3ICAlZCBcCi0JCXdyaXRlIGNudCBtc3cgJWQgcmVhZCBjbnQgbHN3ICVkICByZWFkIGNudCBtc3cgJWQgXG4iLFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfcGFja2V0d3JpdGVfY250X2xzdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY19wYWNrZXR3cml0ZV9jbnRfbXN3LCBcCi0JCXBrdF9yZWFkeV9tc2cuYXVkcmVjX3VwcHJldl9yZWFkY291bnRfbHN3LCBcCi0JCXBrdF9yZWFkeV9tc2cuYXVkcmVjX3VwcHJldl9yZWFkY291bnRfbXN3KTsKLQotCQlhdWRhYWNfbnRfaW5fZ2V0X2RzcF9mcmFtZXMoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfQ01EX0VPU19BQ0tfTVNHOiB7Ci0JCU1NX0RCRygiZW9zIGFjayByZWNpZXZlZFxuIik7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19DTURfRkxVU0hfRE9ORV9NU0c6IHsKLQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQlhdWRpby0+Zmx1c2hfYWNrID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlNTV9EQkcoImZsdXNoIGFjayByZWNpZXZlZFxuIik7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFEU1BfTUVTU0FHRV9JRDogewotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6bW9kdWxlIGF1ZHJlY3Rhc2tcbiIpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJVbmtub3duIEV2ZW50IGlkICVkXG4iLCBpZCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhdWRhYWNfaW5fZ2V0X2RzcF9mcmFtZXMoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkaW9fZnJhbWUgKmZyYW1lOwotCXVpbnQzMl90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlNTV9EQkcoImhlYWQgPSAlZFxuIiwgYXVkaW8tPmluX2hlYWQpOwotCWluZGV4ID0gYXVkaW8tPmluX2hlYWQ7Ci0KLQlmcmFtZSA9ICh2b2lkICopICgoKGNoYXIgKilhdWRpby0+aW5baW5kZXhdLmRhdGEpIC0gXAotCQkJIHNpemVvZigqZnJhbWUpKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdWRpby0+aW5baW5kZXhdLnNpemUgPSBmcmFtZS0+ZnJhbWVfbGVuZ3RoOwotCi0JLyogc3RhdGlzdGljcyBvZiByZWFkICovCi0JYXRvbWljX2FkZChhdWRpby0+aW5baW5kZXhdLnNpemUsICZhdWRpby0+aW5fYnl0ZXMpOwotCWF0b21pY19hZGQoMSwgJmF1ZGlvLT5pbl9zYW1wbGVzKTsKLQotCWF1ZGlvLT5pbl9oZWFkID0gKGF1ZGlvLT5pbl9oZWFkICsgMSkgJiAoRlJBTUVfTlVNIC0gMSk7Ci0KLQkvKiBJZiBvdmVyZmxvdywgbW92ZSB0aGUgdGFpbCBpbmRleCBmb3dhcmQuICovCi0JaWYgKGF1ZGlvLT5pbl9oZWFkID09IGF1ZGlvLT5pbl90YWlsKSB7Ci0JCU1NX0VSUigiRXJyb3IhIG5vdCBhYmxlIHRvIGtlZXAgdXAgdGhlIHJlYWRcbiIpOwotCQlhdWRpby0+aW5fdGFpbCA9IChhdWRpby0+aW5fdGFpbCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCX0gZWxzZQotCQlhdWRpby0+aW5fY291bnQrKzsKLQotCWF1ZGFhY19kc3BfcmVhZF9idWZmZXIoYXVkaW8sIGF1ZGlvLT5kc3BfY250KyspOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCi0Jd2FrZV91cCgmYXVkaW8tPndhaXQpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhYWNfbnRfaW5fZ2V0X2RzcF9mcmFtZXMoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkaW9fZnJhbWVfbnQgKm50X2ZyYW1lOwotCXVpbnQzMl90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JTU1fREJHKCJoZWFkID0gJWRcbiIsIGF1ZGlvLT5pbl9oZWFkKTsKLQlpbmRleCA9IGF1ZGlvLT5pbl9oZWFkOwotCW50X2ZyYW1lID0gKHZvaWQgKikgKCgoY2hhciAqKWF1ZGlvLT5pbltpbmRleF0uZGF0YSkgLSBcCi0JCQkJc2l6ZW9mKHN0cnVjdCBhdWRpb19mcmFtZV9udCkpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdWRpby0+aW5baW5kZXhdLnNpemUgPSBudF9mcmFtZS0+ZnJhbWVfbGVuZ3RoOwotCS8qIHN0YXRpc3RpY3Mgb2YgcmVhZCAqLwotCWF0b21pY19hZGQoYXVkaW8tPmluW2luZGV4XS5zaXplLCAmYXVkaW8tPmluX2J5dGVzKTsKLQlhdG9taWNfYWRkKDEsICZhdWRpby0+aW5fc2FtcGxlcyk7Ci0KLQlhdWRpby0+aW5faGVhZCA9IChhdWRpby0+aW5faGVhZCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCi0JLyogSWYgb3ZlcmZsb3csIG1vdmUgdGhlIHRhaWwgaW5kZXggZm93YXJkLiAqLwotCWlmIChhdWRpby0+aW5faGVhZCA9PSBhdWRpby0+aW5fdGFpbCkKLQkJTU1fREJHKCJFcnJvciEgbm90IGFibGUgdG8ga2VlcCB1cCB0aGUgcmVhZFxuIik7Ci0JZWxzZQotCQlhdWRpby0+aW5fY291bnQrKzsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLX0KLQotCi1zdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHJlY19hYWNfYWRzcF9vcHMgPSB7Ci0JLmV2ZW50ID0gYXVkcmVjX2RzcF9ldmVudCwKLX07Ci0KLXN0YXRpYyBpbnQgYXVkcHJlcHJvY19wY21fYnVmZmVyX3B0cl9yZWZyZXNoKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sCi0JCQkJICAgICAgIHVuc2lnbmVkIGlkeCwgdW5zaWduZWQgbGVuKQotewotCXN0cnVjdCBhdWRyZWNfY21kX3BjbV9idWZmZXJfcHRyX3JlZnJlc2hfYXJtX2VuYyBjbWQ7Ci0KLQlpZiAobGVuID09ICBNRVRBX09VVF9TSVpFKQotCQlsZW4gPSBsZW4gLyAyOwotCWVsc2UKLQkJbGVuID0gKGxlbiArIE1FVEFfT1VUX1NJWkUpIC8gMjsKLQlNTV9EQkcoImxlbiA9ICVkXG4iLCBsZW4pOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfUENNX0JVRkZFUl9QVFJfUkVGUkVTSF9BUk1fVE9fRU5DOwotCWNtZC5udW1fYnVmZmVycyA9IDE7Ci0JaWYgKGNtZC5udW1fYnVmZmVycyA9PSAxKSB7Ci0JCWNtZC5idWZfYWRkcmVzc19sZW5ndGhbMF0gPSAoYXVkaW8tPm91dFtpZHhdLmFkZHIgJgotCQkJCQkJCTB4ZmZmZjAwMDApID4+IDE2OwotCQljbWQuYnVmX2FkZHJlc3NfbGVuZ3RoWzFdID0gKGF1ZGlvLT5vdXRbaWR4XS5hZGRyICYKLQkJCQkJCQkweDAwMDBmZmZmKTsKLQkJY21kLmJ1Zl9hZGRyZXNzX2xlbmd0aFsyXSA9IChsZW4gJiAweGZmZmYwMDAwKSA+PiAxNjsKLQkJY21kLmJ1Zl9hZGRyZXNzX2xlbmd0aFszXSA9IChsZW4gJiAweDAwMDBmZmZmKTsKLQl9Ci0JYXVkaW8tPm91dF9mcmFtZV9jbnQrKzsKLQlyZXR1cm4gYXVkcmVjX3NlbmRfYXVkcmVjcXVldWUoYXVkaW8sICh2b2lkICopJmNtZCwKLQkJCQkJKHVuc2lnbmVkIGludClzaXplb2YoY21kKSk7Ci19Ci0KLQotc3RhdGljIGludCBhdWRwY21fY29uZmlnKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHJlY19jbWRfcGNtX2NmZ19hcm1fdG9fZW5jIGNtZDsKLQlNTV9EQkcoIlxuIik7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUkVDX0NNRF9QQ01fQ0ZHX0FSTV9UT19FTkM7Ci0JY21kLmNvbmZpZ191cGRhdGVfZmxhZyA9IFBDTV9DT05GSUdfVVBEQVRFX0ZMQUdfRU5BQkxFOwotCWNtZC5lbmFibGVfZmxhZyA9IEVOQUJMRV9GTEFHX1ZBTFVFOwotCWNtZC5zYW1wbGluZ19mcmVxID0gYXVkaW8tPnNhbXBfcmF0ZTsKLQlpZiAoIWF1ZGlvLT5jaGFubmVsX21vZGUpCi0JCWNtZC5jaGFubmVscyA9IDE7Ci0JZWxzZQotCQljbWQuY2hhbm5lbHMgPSAyOwotCWNtZC5mcmVxdWVuY3lfb2ZfaW50aW1hdGlvbiA9IDE7Ci0JY21kLm1heF9udW1iZXJfb2ZfYnVmZmVycyA9IE9VVF9GUkFNRV9OVU07Ci0JcmV0dXJuIGF1ZHJlY19zZW5kX2F1ZHJlY3F1ZXVlKGF1ZGlvLCAodm9pZCAqKSZjbWQsCi0JCQkJCSh1bnNpZ25lZCBpbnQpc2l6ZW9mKGNtZCkpOwotfQotCi0KLXN0YXRpYyBpbnQgYXVkcHJlcHJvY19jbWRfY2ZnX3JvdXRpbmdfbW9kZShzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcm91dGluZ19tb2RlIGNtZDsKLQotCU1NX0RCRygiXG4iKTsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURQUkVQUk9DX0FVRFJFQ19DTURfUk9VVElOR19NT0RFOwotCWNtZC5zdHJlYW1faWQgPSBhdWRpby0+ZW5jX2lkOwotCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQURTUF9FTkNfTU9ERV9OT05fVFVOTkVMKQotCQljbWQucm91dGluZ19tb2RlID0gMTsKLQlyZXR1cm4gYXVkcHJlcHJvY19zZW5kX2F1ZHJlY2NtZHF1ZXVlKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotCi0KLXN0YXRpYyBpbnQgYXVkYWFjX2luX2VuY19jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19hdWRyZWNfY21kX2VuY19jZmcgY21kOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JaWYgKGF1ZGlvLT5idWlsZF9pZFsxN10gPT0gJzEnKSB7Ci0JCWNtZC5jbWRfaWQgPSBBVURQUkVQUk9DX0FVRFJFQ19DTURfRU5DX0NGR18yOwotCQlNTV9FUlIoInNlbmRpbmcgQVVEUFJFUFJPQ19BVURSRUNfQ01EX0VOQ19DRkdfMiBjb21tYW5kIik7Ci0JfSBlbHNlIHsKLQkJY21kLmNtZF9pZCA9IEFVRFBSRVBST0NfQVVEUkVDX0NNRF9FTkNfQ0ZHOwotCQlNTV9FUlIoInNlbmRpbmcgQVVEUFJFUFJPQ19BVURSRUNfQ01EX0VOQ19DRkcgY29tbWFuZCIpOwotCX0KLQljbWQuc3RyZWFtX2lkID0gYXVkaW8tPmVuY19pZDsKLQotCWlmIChlbmFibGUpCi0JCWNtZC5hdWRyZWNfZW5jX3R5cGUgPSBhdWRpby0+ZW5jX3R5cGUgfCBFTkNPREVfRU5BQkxFOwotCWVsc2UKLQkJY21kLmF1ZHJlY19lbmNfdHlwZSAmPSB+KEVOQ09ERV9FTkFCTEUpOwotCi0JcmV0dXJuIGF1ZHByZXByb2Nfc2VuZF9hdWRyZWNjbWRxdWV1ZSgmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkYWFjX2luX3BhcmFtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcGFybV9jZmdfYWFjIGNtZDsKLQotCU1NX0RCRygiXG4iKTsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jb21tb24uY21kX2lkID0gQVVEUFJFUFJPQ19BVURSRUNfQ01EX1BBUkFNX0NGRzsKLQljbWQuY29tbW9uLnN0cmVhbV9pZCA9IGF1ZGlvLT5lbmNfaWQ7Ci0KLQljbWQuYXVkX3JlY19zYW1wbGVyYXRlX2lkeCA9IGF1ZGlvLT5zYW1wX3JhdGU7Ci0JY21kLmF1ZF9yZWNfc3RlcmVvX21vZGUgPSBhdWRpby0+Y2hhbm5lbF9tb2RlOwotCWNtZC5yZWNvcmRpbmdfcXVhbGl0eSA9IGF1ZGlvLT5yZWNvcmRfcXVhbGl0eTsKLQotCXJldHVybiBhdWRwcmVwcm9jX3NlbmRfYXVkcmVjY21kcXVldWUoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi0vKiBUbyBEbzogbXNtX3NuZGRldl9yb3V0ZV9lbmMoYXVkaW8tPmVuY19pZCk7ICovCi1zdGF0aWMgaW50IGF1ZGFhY19pbl9yZWNvcmRfY29uZmlnKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0Jc3RydWN0IGF1ZHByZXByb2NfYWZlX2NtZF9hdWRpb19yZWNvcmRfY2ZnIGNtZDsKLQlNTV9EQkcoIlxuIik7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUFJFUFJPQ19BRkVfQ01EX0FVRElPX1JFQ09SRF9DRkc7Ci0JY21kLnN0cmVhbV9pZCA9IGF1ZGlvLT5lbmNfaWQ7Ci0JaWYgKGVuYWJsZSkKLQkJY21kLmRlc3RpbmF0aW9uX2FjdGl2aXR5ID0gQVVESU9fUkVDT1JESU5HX1RVUk5fT047Ci0JZWxzZQotCQljbWQuZGVzdGluYXRpb25fYWN0aXZpdHkgPSBBVURJT19SRUNPUkRJTkdfVFVSTl9PRkY7Ci0KLQljbWQuc291cmNlX21peF9tYXNrID0gYXVkaW8tPnNvdXJjZTsKLQlpZiAoYXVkaW8tPmVuY19pZCA9PSAyKSB7Ci0JCWlmICgoY21kLnNvdXJjZV9taXhfbWFzayAmIElOVEVSTkFMX0NPREVDX1RYX1NPVVJDRV9NSVhfTUFTSykgfHwKLQkJCShjbWQuc291cmNlX21peF9tYXNrICYgQVVYX0NPREVDX1RYX1NPVVJDRV9NSVhfTUFTSykgfHwKLQkJCShjbWQuc291cmNlX21peF9tYXNrICYgVk9JQ0VfVUxfU09VUkNFX01JWF9NQVNLKSB8fAotCQkJKGNtZC5zb3VyY2VfbWl4X21hc2sgJiBWT0lDRV9ETF9TT1VSQ0VfTUlYX01BU0spKSB7Ci0JCQljbWQucGlwZV9pZCA9IFNPVVJDRV9QSVBFXzE7Ci0JCX0KLQkJaWYgKGNtZC5zb3VyY2VfbWl4X21hc2sgJgotCQkJCUFVRFBQX0EyRFBfUElQRV9TT1VSQ0VfTUlYX01BU0spCi0JCQljbWQucGlwZV9pZCB8PSBTT1VSQ0VfUElQRV8wOwotCX0KLQlyZXR1cm4gYXVkcHJlcHJvY19zZW5kX2F1ZHJlY2NtZHF1ZXVlKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRhYWNfaW5fbWVtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRyZWNfY21kX2FyZWNtZW1fY2ZnIGNtZDsKLQl1aW50MTZfdCAqZGF0YSA9ICh2b2lkICopIGF1ZGlvLT5kYXRhOwotCWludCBuOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfTUVNX0NGR19DTUQ7Ci0JY21kLmF1ZHJlY191cF9wa3RfaW50bV9jb3VudCA9IDE7Ci0JY21kLmF1ZHJlY19leHRfcGt0X3N0YXJ0X2FkZHJfbXN3ID0gYXVkaW8tPnBoeXMgPj4gMTY7Ci0JY21kLmF1ZHJlY19leHRfcGt0X3N0YXJ0X2FkZHJfbHN3ID0gYXVkaW8tPnBoeXM7Ci0JY21kLmF1ZHJlY19leHRfcGt0X2J1Zl9udW1iZXIgPSBGUkFNRV9OVU07Ci0JTU1fREJHKCJhdWRpby0+cGh5cyA9ICV4XG4iLCBhdWRpby0+cGh5cyk7Ci0JLyogcHJlcGFyZSBidWZmZXIgcG9pbnRlcnM6Ci0JICogMTUzNiBieXRlcyBhYWMgcGFja2V0ICsgNCBoYWxmd29yZCBoZWFkZXIKLQkgKi8KLQlmb3IgKG4gPSAwOyBuIDwgRlJBTUVfTlVNOyBuKyspIHsKLQkJaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfVFVOTkVMKSB7Ci0JCQlhdWRpby0+aW5bbl0uZGF0YSA9IGRhdGEgKyA0OwotCQkJZGF0YSArPSAoRlJBTUVfU0laRS8yKTsKLQkJCU1NX0RCRygiMHglOHhcbiIsIChpbnQpKGF1ZGlvLT5pbltuXS5kYXRhIC0gOCkpOwotCQl9IGVsc2UgIHsKLQkJCWF1ZGlvLT5pbltuXS5kYXRhID0gZGF0YSArIDEyOwotCQkJZGF0YSArPSAoKEFBQ19GUkFNRV9TSVpFKSAvIDIpICsgMTI7Ci0JCQlNTV9EQkcoIjB4JTh4XG4iLCAoaW50KShhdWRpby0+aW5bbl0uZGF0YSAtIDI0KSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGF1ZHJlY19zZW5kX2F1ZHJlY3F1ZXVlKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkYWFjX2RzcF9yZWFkX2J1ZmZlcihzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLCB1aW50MzJfdCByZWFkX2NudCkKLXsKLQlzdHJ1Y3QgdXBfYXVkcmVjX3BhY2tldF9leHRfcHRyIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IFVQX0FVRFJFQ19QQUNLRVRfRVhUX1BUUjsKLQljbWQuYXVkcmVjX3VwX2N1cnJfcmVhZF9jb3VudF9tc3cgPSByZWFkX2NudCA+PiAxNjsKLQljbWQuYXVkcmVjX3VwX2N1cnJfcmVhZF9jb3VudF9sc3cgPSByZWFkX2NudDsKLQotCXJldHVybiBhdWRyZWNfc2VuZF9iaXRzdHJlYW1xdWV1ZShhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotc3RhdGljIGludCBhdWRhYWNfZmx1c2hfY29tbWFuZChzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRyZWNfY21kX2ZsdXNoIGNtZDsKLQlNTV9EQkcoIlxuIik7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUkVDX0NNRF9GTFVTSDsKLQlyZXR1cm4gYXVkcmVjX3NlbmRfYXVkcmVjcXVldWUoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGFhY19pbl9lbmFibGUoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JaWYgKGF1ZHByZXByb2NfZW5hYmxlKGF1ZGlvLT5lbmNfaWQsICZhdWRwcmVwcm9jX2RzcF9ldmVudCwgYXVkaW8pKSB7Ci0JCU1NX0VSUigibXNtX2Fkc3BfZW5hYmxlKGF1ZHByZXByb2MpIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChtc21fYWRzcF9lbmFibGUoYXVkaW8tPmF1ZHJlYykpIHsKLQkJTU1fRVJSKCJtc21fYWRzcF9lbmFibGUoYXVkcmVjKSBmYWlsZWRcbiIpOwotCQlhdWRwcmVwcm9jX2Rpc2FibGUoYXVkaW8tPmVuY19pZCwgYXVkaW8pOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JYXVkaW8tPmVuYWJsZWQgPSAxOwotCWF1ZGFhY19pbl9lbmNfY29uZmlnKGF1ZGlvLCAxKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkYWFjX2luX2Rpc2FibGUoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQlhdWRhYWNfaW5fZW5jX2NvbmZpZyhhdWRpbywgMCk7Ci0JCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXRfZW5hYmxlLAotCQkJCWF1ZGlvLT5ydW5uaW5nID09IDAsIDEqSFopOwotCQltc21fYWRzcF9kaXNhYmxlKGF1ZGlvLT5hdWRyZWMpOwotCQlhdWRwcmVwcm9jX2Rpc2FibGUoYXVkaW8tPmVuY19pZCwgYXVkaW8pOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXVkYWFjX2lvcG9ydF9yZXNldChzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCS8qIE1ha2Ugc3VyZSByZWFkL3dyaXRlIHRocmVhZCBhcmUgZnJlZSBmcm9tCi0JICogc2xlZXAgYW5kIGtub3dpbmcgdGhhdCBzeXN0ZW0gaXMgbm90IGFibGUKLQkgKiB0byBwcm9jZXNzIGlvIHJlcXVlc3QgYXQgdGhlIG1vbWVudAotCSAqLwotCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JYXVkYWFjX2luX2ZsdXNoKGF1ZGlvKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JYXVkYWFjX291dF9mbHVzaChhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkYWFjX2luX2ZsdXNoKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pCi17Ci0JaW50IGk7Ci0KLQlhdWRpby0+ZHNwX2NudCA9IDA7Ci0JYXVkaW8tPmluX2hlYWQgPSAwOwotCWF1ZGlvLT5pbl90YWlsID0gMDsKLQlhdWRpby0+aW5fY291bnQgPSAwOwotCWF1ZGlvLT5lb3NfYWNrID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfTlVNOyBpKyspIHsKLQkJYXVkaW8tPmluW2ldLnNpemUgPSAwOwotCQlhdWRpby0+aW5baV0ucmVhZCA9IDA7Ci0JfQotCU1NX0RCRygiaW5fYnl0ZXMgJWRcbiIsIGF0b21pY19yZWFkKCZhdWRpby0+aW5fYnl0ZXMpKTsKLQlNTV9EQkcoImluX3NhbXBsZXMgJWRcbiIsIGF0b21pY19yZWFkKCZhdWRpby0+aW5fc2FtcGxlcykpOwotCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9ieXRlcywgMCk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPmluX3NhbXBsZXMsIDApOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhYWNfb3V0X2ZsdXNoKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pCi17Ci0JaW50IGk7Ci0KLQlhdWRpby0+b3V0X2hlYWQgPSAwOwotCWF1ZGlvLT5vdXRfdGFpbCA9IDA7Ci0JYXVkaW8tPm91dF9jb3VudCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IE9VVF9GUkFNRV9OVU07IGkrKykgewotCQlhdWRpby0+b3V0W2ldLnNpemUgPSAwOwotCQlhdWRpby0+b3V0W2ldLnJlYWQgPSAwOwotCQlhdWRpby0+b3V0W2ldLnVzZWQgPSAwOwotCX0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkZXZpY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgbG9uZyBhdWRhYWNfaW5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfU1RBVFMpIHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyBzdGF0czsKLQkJc3RhdHMuYnl0ZV9jb3VudCA9IGF0b21pY19yZWFkKCZhdWRpby0+aW5fYnl0ZXMpOwotCQlzdGF0cy5zYW1wbGVfY291bnQgPSBhdG9taWNfcmVhZCgmYXVkaW8tPmluX3NhbXBsZXMpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQl1aW50MzJfdCBmcmVxOwotCQkvKiBQb2xsIGF0IDQ4S0h6IGFsd2F5cyAqLwotCQlmcmVxID0gNDgwMDA7Ci0JCU1NX0RCRygiQVVESU9fU1RBUlRcbiIpOwotCQlyYyA9IG1zbV9zbmRkZXZfcmVxdWVzdF9mcmVxKCZmcmVxLCBhdWRpby0+ZW5jX2lkLAotCQkJCQlTTkRERVZfQ0FQX1RYLCBBVURERVZfQ0xOVF9FTkMpOwotCQlNTV9EQkcoInNhbXBsZSByYXRlIGNvbmZpZ3VyZWQgJWQgc2FtcGxlIHJhdGUgcmVxdWVzdGVkICVkXG4iLAotCQkJCWZyZXEsIGF1ZGlvLT5zYW1wX3JhdGUpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlNTV9EQkcoIiBTYW1wbGUgcmF0ZSBjYW4gbm90IGJlIHNldCwgcmV0dXJuIGNvZGUgJWRcbiIsCi0JCQkJCQkJCSByYyk7Ci0JCQltc21fc25kZGV2X3dpdGhkcmF3X2ZyZXEoYXVkaW8tPmVuY19pZCwKLQkJCQkJU05EREVWX0NBUF9UWCwgQVVEREVWX0NMTlRfRU5DKTsKLQkJCU1NX0RCRygibXNtX3NuZGRldl93aXRoZHJhd19mcmVxXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qdXBkYXRlIGF1cmVjIHNlc3Npb24gaW5mbyBpbiBhdWRwcmVwcm9jIGxheWVyKi8KLQkJYXVkaW8tPnNlc3Npb25faW5mby5zZXNzaW9uX2lkID0gYXVkaW8tPmVuY19pZDsKLQkJYXVkaW8tPnNlc3Npb25faW5mby5zYW1wbGluZ19mcmVxID0gYXVkaW8tPnNhbXBfcmF0ZTsKLQkJYXVkcHJlcHJvY191cGRhdGVfYXVkcmVjX2luZm8oJmF1ZGlvLT5zZXNzaW9uX2luZm8pOwotCQlyYyA9IGF1ZGFhY19pbl9lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9Ci0JCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdF9lbmFibGUsCi0JCQkJYXVkaW8tPnJ1bm5pbmcgIT0gMCwgMSpIWik7Ci0JCQlNTV9EQkcoInN0YXRlICVkIHJjID0gJWRcbiIsIGF1ZGlvLT5ydW5uaW5nLCByYyk7Ci0KLQkJCWlmIChhdWRpby0+cnVubmluZyA9PSAwKQotCQkJCXJjID0gLUVOT0RFVjsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCX0KLQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TVE9QOiB7Ci0JCWF1ZGlvLT5zZXNzaW9uX2luZm8uc2FtcGxpbmdfZnJlcSA9IDA7Ci0JCWF1ZHByZXByb2NfdXBkYXRlX2F1ZHJlY19pbmZvKCZhdWRpby0+c2Vzc2lvbl9pbmZvKTsKLQkJcmMgPSBhdWRhYWNfaW5fZGlzYWJsZShhdWRpbyk7Ci0JCXJjID0gbXNtX3NuZGRldl93aXRoZHJhd19mcmVxKGF1ZGlvLT5lbmNfaWQsCi0JCQkJCVNORERFVl9DQVBfVFgsIEFVRERFVl9DTE5UX0VOQyk7Ci0JCU1NX0RCRygibXNtX3NuZGRldl93aXRoZHJhd19mcmVxXG4iKTsKLQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQlhdWRpby0+YWJvcnQgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19GTFVTSDoKLQkJTU1fREJHKCJBVURJT19GTFVTSFxuIik7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAxOwotCQlhdWRpby0+d2ZsdXNoID0gMTsKLQkJYXVkYWFjX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWlmIChhdWRpby0+cnVubmluZykgewotCQkJYXVkYWFjX2ZsdXNoX2NvbW1hbmQoYXVkaW8pOwotCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJIWF1ZGlvLT53Zmx1c2gpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCU1NX0VSUigiQVVESU9fRkxVU0ggaW50ZXJydXB0ZWRcbiIpOwotCQkJCXJjID0gLUVJTlRSOwotCQkJfQotCQl9IGVsc2UgewotCQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9TVFJFQU1fQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBjZmc7Ci0JCW1lbXNldCgmY2ZnLCAwLCBzaXplb2YoY2ZnKSk7Ci0JCWNmZy5idWZmZXJfc2l6ZSA9IGF1ZGlvLT5idWZmZXJfc2l6ZTsKLQkJY2ZnLmJ1ZmZlcl9jb3VudCA9IEZSQU1FX05VTTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNmZywgc2l6ZW9mKGNmZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfU1RSRUFNX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgY2ZnOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgKHZvaWQgKilhcmcsIHNpemVvZihjZmcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogQWxsb3cgb25seSBzaW5nbGUgZnJhbWUgKi8KLQkJaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfVFVOTkVMKSB7Ci0JCQlpZiAoY2ZnLmJ1ZmZlcl9zaXplICE9IChGUkFNRV9TSVpFIC0gOCkpIHsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY2ZnLmJ1ZmZlcl9zaXplICE9IChOVF9GUkFNRV9TSVpFIC0gMjQpKSB7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWF1ZGlvLT5idWZmZXJfc2l6ZSA9IGNmZy5idWZmZXJfc2l6ZTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3BjbV9jb25maWcgY2ZnOwotCQltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOwotCQljZmcuYnVmZmVyX3NpemUgPSBPVVRfQlVGRkVSX1NJWkU7Ci0JCWNmZy5idWZmZXJfY291bnQgPSBPVVRfRlJBTUVfTlVNOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY2ZnLCBzaXplb2YoY2ZnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9BQUNfRU5DX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnIGNmZzsKLQkJaWYgKGF1ZGlvLT5jaGFubmVsX21vZGUgPT0gQVVEUkVDX0NNRF9NT0RFX01PTk8pCi0JCQljZmcuY2hhbm5lbHMgPSAxOwotCQllbHNlCi0JCQljZmcuY2hhbm5lbHMgPSAyOwotCQljZmcuc2FtcGxlX3JhdGUgPSBhdWRpby0+c2FtcF9yYXRlOwotCQljZmcuYml0X3JhdGUgPSBhdWRpby0+Yml0X3JhdGU7Ci0JCWNmZy5zdHJlYW1fZm9ybWF0ID0gQVVESU9fQUFDX0ZPUk1BVF9SQVc7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjZmcsIHNpemVvZihjZmcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0FBQ19FTkNfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcgY2ZnOwotCQl1bnNpZ25lZCBpbnQgcmVjb3JkX3F1YWxpdHk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNmZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY2ZnLnN0cmVhbV9mb3JtYXQgIT0gQVVESU9fQUFDX0ZPUk1BVF9SQVcpIHsKLQkJCU1NX0VSUigidW5zdXBwb3J0ZWQgQUFDIGZvcm1hdFxuIik7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlyZWNvcmRfcXVhbGl0eSA9IGJpdHJhdGVfdG9fcmVjb3JkX3F1YWxpdHkoY2ZnLnNhbXBsZV9yYXRlLAotCQkJCQljZmcuY2hhbm5lbHMsIGNmZy5iaXRfcmF0ZSk7Ci0JCS8qIFJhbmdlIG9mIFJlY29yZCBRdWFsaXR5IFN1cHBvcnRlZCBieSBEU1AsIFExMiBmb3JtYXQgKi8KLQkJaWYgKChyZWNvcmRfcXVhbGl0eSA8IDB4ODAwKSB8fCAocmVjb3JkX3F1YWxpdHkgPiAweDQwMDApKSB7Ci0JCQlNTV9FUlIoIlVuc3VwcG9ydGVkIGJpdCByYXRlIFxuIik7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlNTV9EQkcoImNoYW5uZWxzID0gJWRcbiIsIGNmZy5jaGFubmVscyk7Ci0JCWlmIChjZmcuY2hhbm5lbHMgPT0gMSkgewotCQkJY2ZnLmNoYW5uZWxzID0gQVVEUkVDX0NNRF9NT0RFX01PTk87Ci0JCX0gZWxzZSBpZiAoY2ZnLmNoYW5uZWxzID09IDIpIHsKLQkJCWNmZy5jaGFubmVscyA9IEFVRFJFQ19DTURfTU9ERV9TVEVSRU87Ci0JCX0gZWxzZSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlNTV9EQkcoImNoYW5uZWxzID0gJWRcbiIsIGNmZy5jaGFubmVscyk7Ci0JCWF1ZGlvLT5zYW1wX3JhdGUgPSBjZmcuc2FtcGxlX3JhdGU7Ci0JCWF1ZGlvLT5jaGFubmVsX21vZGUgPSBjZmcuY2hhbm5lbHM7Ci0JCWF1ZGlvLT5iaXRfcmF0ZSA9IGNmZy5iaXRfcmF0ZTsKLQkJYXVkaW8tPnJlY29yZF9xdWFsaXR5ID0gcmVjb3JkX3F1YWxpdHk7Ci0JCU1NX0RCRygiIFJlY29yZCBRdWFsaXR5ID0gMHglOHggXG4iLCBhdWRpby0+cmVjb3JkX3F1YWxpdHkpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfU0VTU0lPTl9JRDogewotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmF1ZGlvLT5lbmNfaWQsCi0JCQlzaXplb2YodW5zaWduZWQgc2hvcnQpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkYWFjX2luX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jdm9pZCAqZGF0YTsKLQl1aW50MzJfdCBpbmRleDsKLQl1aW50MzJfdCBzaXplOwotCWludCByYyA9IDA7Ci0Jc3RydWN0IGFhY19lbmNvZGVkX21ldGFfaW4gbWV0YV9maWVsZDsKLQlzdHJ1Y3QgYXVkaW9fZnJhbWVfbnQgKm50X2ZyYW1lOwotCU1NX0RCRygiIGNvdW50ID0gJWRcbiIsIGNvdW50KTsKLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAotCQkJYXVkaW8tPndhaXQsIChhdWRpby0+aW5fY291bnQgPiAwKSB8fCBhdWRpby0+c3RvcHBlZCB8fAotCQkJCWF1ZGlvLT5hYm9ydCB8fCBhdWRpby0+cmZsdXNoKTsKLQotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGF1ZGlvLT5yZmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoYXVkaW8tPnN0b3BwZWQgJiYgIWF1ZGlvLT5pbl9jb3VudCkgewotCQkJTU1fREJHKCJEcml2ZXIgaW4gc3RvcCBzdGF0ZSwgTm8gbW9yZSBidWZmZXIgdG8gcmVhZCIpOwotCQkJcmMgPSAwOy8qIEVuZCBvZiBGaWxlICovCi0JCQlicmVhazsKLQkJfQotCi0JCWlmIChhdWRpby0+YWJvcnQpIHsKLQkJCXJjID0gLUVQRVJNOyAvKiBOb3QgcGVybWl0dGVkIGR1ZSB0byBhYm9ydCAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpbmRleCA9IGF1ZGlvLT5pbl90YWlsOwotCQlkYXRhID0gKHVpbnQ4X3QgKikgYXVkaW8tPmluW2luZGV4XS5kYXRhOwotCQlzaXplID0gYXVkaW8tPmluW2luZGV4XS5zaXplOwotCi0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkgewotCQkJbnRfZnJhbWUgPSAoc3RydWN0IGF1ZGlvX2ZyYW1lX250ICopKGRhdGEgLQotCQkJCQlzaXplb2Yoc3RydWN0IGF1ZGlvX2ZyYW1lX250KSk7Ci0JCQltZW1jcHkoKGNoYXIgKikmbWV0YV9maWVsZC50aW1lX3N0YW1wX2R3b3JkX2xzdywKLQkJCQkoY2hhciAqKSZudF9mcmFtZS0+dGltZV9zdGFtcF9kd29yZF9sc3csIDEyKTsKLQkJCW1ldGFfZmllbGQubWV0YWRhdGFfbGVuID0KLQkJCQkJc2l6ZW9mKHN0cnVjdCBhYWNfZW5jb2RlZF9tZXRhX2luKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKGNoYXIgKilzdGFydCwgKGNoYXIgKikmbWV0YV9maWVsZCwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBhYWNfZW5jb2RlZF9tZXRhX2luKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAobnRfZnJhbWUtPm5mbGFnX2xzdyAmIDB4MDAwMSkgewotCQkJCU1NX0VSUigicmVjaWV2ZWQgRU9TIGluIHJlYWQgY2FsbFxuIik7Ci0JCQkJYXVkaW8tPmVvc19hY2sgPSAxOwotCQkJfQotCQkJYnVmICs9IHNpemVvZihzdHJ1Y3QgYWFjX2VuY29kZWRfbWV0YV9pbik7Ci0JCQljb3VudCAtPSBzaXplb2Yoc3RydWN0IGFhY19lbmNvZGVkX21ldGFfaW4pOwotCQl9Ci0JCWlmIChjb3VudCA+PSBzaXplKSB7Ci0JCQlpZiAoY29weV90b191c2VyKGJ1ZiwgZGF0YSwgc2l6ZSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCQlpZiAoaW5kZXggIT0gYXVkaW8tPmluX3RhaWwpIHsKLQkJCQkvKiBvdmVycnVuIC0tIGRhdGEgaXMKLQkJCQkgKiBpbnZhbGlkIGFuZCB3ZSBuZWVkIHRvIHJldHJ5ICovCi0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlhdWRpby0+aW5baW5kZXhdLnNpemUgPSAwOwotCQkJYXVkaW8tPmluX3RhaWwgPSAoYXVkaW8tPmluX3RhaWwgKyAxKSAmIChGUkFNRV9OVU0gLSAxKTsKLQkJCWF1ZGlvLT5pbl9jb3VudC0tOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCQljb3VudCAtPSBzaXplOwotCQkJYnVmICs9IHNpemU7Ci0JCQlpZiAoKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKSAmJgotCQkJCQkJKCFhdWRpby0+ZW9zX2FjaykpIHsKLQkJCQlNTV9EQkcoInNlbmRpbmcgcmVhZCBwdHIgY29tbWFuZCAlZCAlZFxuIiwKLQkJCQkJCQlhdWRpby0+ZHNwX2NudCwKLQkJCQkJCQlhdWRpby0+aW5fdGFpbCk7Ci0JCQkJYXVkYWFjX2RzcF9yZWFkX2J1ZmZlcihhdWRpbywKLQkJCQkJCQlhdWRpby0+ZHNwX2NudCsrKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigic2hvcnQgcmVhZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlpZiAoYnVmID4gc3RhcnQpCi0JCXJldHVybiBidWYgLSBzdGFydDsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgYXVkcHJlcHJvY19wY21fc2VuZF9kYXRhKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sIHVuc2lnbmVkIG5lZWRlZCkKLXsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCU1NX0RCRygiXG4iKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhdWRpby0+cnVubmluZykKLQkJZ290byBkb25lOwotCi0JaWYgKG5lZWRlZCAmJiAhYXVkaW8tPndmbHVzaCkgewotCQkvKiBXZSB3ZXJlIGNhbGxlZCBmcm9tIHRoZSBjYWxsYmFjayBiZWNhdXNlIHRoZSBEU1AKLQkJICogcmVxdWVzdGVkIG1vcmUgZGF0YS4gIE5vdGUgdGhhdCB0aGUgRFNQIGRvZXMgd2FudAotCQkgKiBtb3JlIGRhdGEsIGFuZCBpZiBhIGJ1ZmZlciB3YXMgaW4tZmxpZ2h0LCBtYXJrIGl0Ci0JCSAqIGFzIGF2YWlsYWJsZSAoc2luY2UgdGhlIERTUCBtdXN0IG5vdyBiZSBkb25lIHdpdGgKLQkJICogaXQpLgotCQkgKi8KLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAxOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCWlmIChmcmFtZS0+dXNlZCA9PSAweGZmZmZmZmZmKSB7Ci0JCQlNTV9EQkcoImZyYW1lICVkIGZyZWVcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDA7Ci0JCQlhdWRpby0+b3V0X3RhaWwgXj0gMTsKLQkJCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJfQotCX0KLQotCWlmIChhdWRpby0+b3V0X25lZWRlZCkgewotCQkvKiBJZiB0aGUgRFNQIGN1cnJlbnRseSB3YW50cyBkYXRhIGFuZCB3ZSBoYXZlIGEKLQkJICogYnVmZmVyIGF2YWlsYWJsZSwgd2Ugd2lsbCBzZW5kIGl0IGFuZCByZXNldAotCQkgKiB0aGUgbmVlZGVkIGZsYWcuICBXZSdsbCBtYXJrIHRoZSBidWZmZXIgYXMgaW4tZmxpZ2h0Ci0JCSAqIHNvIHRoYXQgaXQgd29uJ3QgYmUgcmVjeWNsZWQgdW50aWwgdGhlIG5leHQgYnVmZmVyCi0JCSAqIGlzIHJlcXVlc3RlZAotCQkgKi8KLQotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCWlmIChmcmFtZS0+dXNlZCkgewotCQkJQlVHX09OKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpOwotCQkJTU1fREJHKCJmcmFtZSAlZCBidXN5XG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCQkJYXVkcHJlcHJvY19wY21fYnVmZmVyX3B0cl9yZWZyZXNoKGF1ZGlvLAotCQkJCQkJIGF1ZGlvLT5vdXRfdGFpbCwKLQkJCQkJCSAgICBmcmFtZS0+dXNlZCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDB4ZmZmZmZmZmY7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCX0KLQl9Ci0gZG9uZToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotCi1zdGF0aWMgaW50IGF1ZGFhY19pbl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHBwb3MxLCBsb2ZmX3QgcHBvczIsIGludCBkYXRhc3luYykKLQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JaWYgKCFhdWRpby0+cnVubmluZyB8fCAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lX25vbG9jazsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCWF1ZGlvLT53Zmx1c2gpOwotCU1NX0RCRygid2FrZWQgb24gYnkgc29tZSBldmVudCBhdWRpby0+d2ZsdXNoID0gJWRcbiIsIGF1ZGlvLT53Zmx1c2gpOwotCi0JaWYgKHJjIDwgMCkKLQkJZ290byBkb25lOwotCWVsc2UgaWYgKGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotZG9uZV9ub2xvY2s6Ci0JcmV0dXJuIHJjOwotCi19Ci0KLSBpbnQgYXVkcHJlcHJvY19hYWNfcHJvY2Vzc19lb3Moc3RydWN0IGF1ZGlvX2luICphdWRpbywKLQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1Zl9zdGFydCwgdW5zaWduZWQgc2hvcnQgbWZpZWxkX3NpemUpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JaW50IHJjID0gMDsKLQotCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoYXVkaW8tPm91dF9uZWVkZWQgJiYKLQkJYXVkaW8tPm91dFswXS51c2VkID09IDAgJiYKLQkJYXVkaW8tPm91dFsxXS51c2VkID09IDApCi0JCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoY29weV9mcm9tX3VzZXIoZnJhbWUtPmRhdGEsIGJ1Zl9zdGFydCwgbWZpZWxkX3NpemUpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlmcmFtZS0+dXNlZCA9IG1maWVsZF9zaXplOwotCU1NX0RCRygiY29weWluZyBtZXRhX291dCBmcmFtZS0+dXNlZCA9ICVkXG4iLCBmcmFtZS0+dXNlZCk7Ci0JYXVkcHJlcHJvY19wY21fc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRhYWNfaW5fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWNoYXIgKmNweV9wdHI7Ci0JaW50IHJjID0gMCwgZW9zX2NvbmRpdGlvbiA9IEFVRFBSRVBST0NfQUFDX0VPU19OT05FOwotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplID0gMDsKLQlpbnQgd3JpdGVfY291bnQgPSBjb3VudDsKLQlNTV9EQkcoImNudD0lZFxuIiwgY291bnQpOwotCi0JaWYgKGNvdW50ICYgMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF9oZWFkOwotCWNweV9wdHIgPSBmcmFtZS0+ZGF0YTsKLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkgICAgICAoZnJhbWUtPnVzZWQgPT0gMCkKLQkJCQkJfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQkJCQl8fCAoYXVkaW8tPndmbHVzaCkpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JaWYgKGF1ZGlvLT5tZmllbGQpIHsKLQkJaWYgKGJ1ZiA9PSBzdGFydCkgewotCQkJLyogUHJvY2Vzc2luZyBiZWdpbm5pbmcgb2YgdXNlciBidWZmZXIgKi8KLQkJCWlmIChfX2dldF91c2VyKG1maWVsZF9zaXplLAotCQkJCSh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgYnVmKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlnb3RvIGVycm9yOwotCQkJfSBlbHNlIGlmIChtZmllbGRfc2l6ZSA+IGNvdW50KSB7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlNTV9EQkcoIm1mIG9mZnNldF92YWwgJXhcbiIsIG1maWVsZF9zaXplKTsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIG1maWVsZF9zaXplKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJLyogQ2hlY2sgaWYgRU9TIGZsYWcgaXMgc2V0IGFuZCBidWZmZXIgaGFzCi0JCQkgKiBjb250YWlucyBqdXN0IG1ldGEgZmllbGQKLQkJCSAqLwotCQkJaWYgKGNweV9wdHJbQVVEUFJFUFJPQ19BQUNfRU9TX0ZMR19PRkZTRVRdICYKLQkJCQkJQVVEUFJFUFJPQ19BQUNfRU9TX0ZMR19NQVNLKSB7Ci0JCQkJTU1fREJHKCJFT1MgU0VUXG4iKTsKLQkJCQllb3NfY29uZGl0aW9uID0gQVVEUFJFUFJPQ19BQUNfRU9TX1NFVDsKLQkJCQlpZiAobWZpZWxkX3NpemUgPT0gY291bnQpIHsKLQkJCQkJYnVmICs9IG1maWVsZF9zaXplOwotCQkJCQlpZiAoYXVkaW8tPm1vZGUgPT0KLQkJCQkJCU1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKSB7Ci0JCQkJCQllb3NfY29uZGl0aW9uID0gMDsKLQkJCQkJCWdvdG8gZXhpdDsKLQkJCQkJfQotCQkJCQlnb3RvIGVycm9yOwotCQkJCX0gZWxzZQotCQkJCWNweV9wdHJbQVVEUFJFUFJPQ19BQUNfRU9TX0ZMR19PRkZTRVRdICY9Ci0JCQkJCX5BVURQUkVQUk9DX0FBQ19FT1NfRkxHX01BU0s7Ci0JCQl9Ci0JCQljcHlfcHRyICs9IG1maWVsZF9zaXplOwotCQkJY291bnQgLT0gbWZpZWxkX3NpemU7Ci0JCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCX0gZWxzZSB7Ci0JCQltZmllbGRfc2l6ZSA9IDA7Ci0JCQlNTV9EQkcoImNvbnRpbnVvdXMgYnVmZmVyXG4iKTsKLQkJfQotCQlmcmFtZS0+bWZpZWxkX3N6ID0gbWZpZWxkX3NpemU7Ci0JfQotCU1NX0RCRygiY29weWluZyB0aGUgc3RyZWFtIGNvdW50ID0gJWRcbiIsIGNvdW50KTsKLQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCBjb3VudCkpIHsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIGVycm9yOwotCX0KLWV4aXQ6Ci0JZnJhbWUtPnVzZWQgPSBjb3VudDsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlpZiAoIWF1ZGlvLT5mbHVzaF9hY2spCi0JCWF1ZHByZXByb2NfcGNtX3NlbmRfZGF0YShhdWRpbywgMCk7Ci0JZWxzZSB7Ci0JCWF1ZHByZXByb2NfcGNtX3NlbmRfZGF0YShhdWRpbywgMSk7Ci0JCWF1ZGlvLT5mbHVzaF9hY2sgPSAwOwotCX0KLQlpZiAoZW9zX2NvbmRpdGlvbiA9PSBBVURQUkVQUk9DX0FBQ19FT1NfU0VUKQotCQlyYyA9IGF1ZHByZXByb2NfYWFjX3Byb2Nlc3NfZW9zKGF1ZGlvLCBzdGFydCwgbWZpZWxkX3NpemUpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXJldHVybiB3cml0ZV9jb3VudDsKLWVycm9yOgotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRhYWNfaW5fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCS8qIHdpdGggZHJhdyBmcmVxdWVuY3kgZm9yIHNlc3Npb24KLQkgICBpbmNhc2Ugbm90IHN0b3BwZWQgdGhlIGRyaXZlciAqLwotCW1zbV9zbmRkZXZfd2l0aGRyYXdfZnJlcShhdWRpby0+ZW5jX2lkLCBTTkRERVZfQ0FQX1RYLAotCQkJCQlBVURERVZfQ0xOVF9FTkMpOwotCWF1ZGRldl91bnJlZ2lzdGVyX2V2dF9saXN0bmVyKEFVRERFVl9DTE5UX0VOQywgYXVkaW8tPmVuY19pZCk7Ci0JLypyZXNldCB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5IGluZm9ybWF0aW9uIGF0IGF1ZHByZXByb2MgbGF5ZXIqLwotCWF1ZGlvLT5zZXNzaW9uX2luZm8uc2FtcGxpbmdfZnJlcSA9IDA7Ci0JYXVkcHJlcHJvY191cGRhdGVfYXVkcmVjX2luZm8oJmF1ZGlvLT5zZXNzaW9uX2luZm8pOwotCWF1ZGFhY19pbl9kaXNhYmxlKGF1ZGlvKTsKLQlhdWRhYWNfaW5fZmx1c2goYXVkaW8pOwotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcmVjKTsKLQlhdWRwcmVwcm9jX2FlbmNfZnJlZShhdWRpby0+ZW5jX2lkKTsKLQlhdWRpby0+YXVkcmVjID0gTlVMTDsKLQlhdWRpby0+b3BlbmVkID0gMDsKLQlpZiAoYXVkaW8tPmRhdGEpIHsKLQkJaW91bm1hcChhdWRpby0+bWFwX3ZfcmVhZCk7Ci0JCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPnBoeXMpOwotCQlhdWRpby0+ZGF0YSA9IE5VTEw7Ci0JfQotCWlmIChhdWRpby0+b3V0X2RhdGEpIHsKLQkJaW91bm1hcChhdWRpby0+bWFwX3Zfd3JpdGUpOwotCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKGF1ZGlvLT5vdXRfcGh5cyk7Ci0JCWF1ZGlvLT5vdXRfZGF0YSA9IE5VTEw7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgYXVkaW9faW4gdGhlX2F1ZGlvX2FhY19pbjsKLQotc3RhdGljIGludCBhdWRhYWNfaW5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gJnRoZV9hdWRpb19hYWNfaW47Ci0JaW50IHJjOwotCWludCBlbmNpZDsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlpZiAoYXVkaW8tPm9wZW5lZCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQlhdWRpby0+cGh5cyA9IGFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKERNQVNaLCBTWl80Syk7Ci0JaWYgKGF1ZGlvLT5waHlzKSB7Ci0JCWF1ZGlvLT5tYXBfdl9yZWFkID0gaW9yZW1hcChhdWRpby0+cGh5cywgRE1BU1opOwotCQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl9yZWFkKSkgewotCQkJTU1fRVJSKCJjb3VsZCBub3QgbWFwIERNQSBidWZmZXJzXG4iKTsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPnBoeXMpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCWF1ZGlvLT5kYXRhID0gYXVkaW8tPm1hcF92X3JlYWQ7Ci0JfSBlbHNlIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgYWxsb2NhdGUgRE1BIGJ1ZmZlcnNcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JTU1fREJHKCJNZW1vcnkgYWRkciA9IDB4JTh4ICBwaHkgYWRkciA9IDB4JTh4XG4iLFwKLQkJKGludCkgYXVkaW8tPmRhdGEsIChpbnQpIGF1ZGlvLT5waHlzKTsKLQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlhdWRpby0+bW9kZSA9IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMOwotCX0gZWxzZSBpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCQkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWF1ZGlvLT5tb2RlID0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUw7Ci0JCU1NX0RCRygiT3BlbmVkIGZvciB0dW5uZWwgbW9kZSBlbmNvZGluZ1xuIik7Ci0JfSBlbHNlIHsKLQkJcmMgPSAtRUFDQ0VTOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogU2V0dGluZ3Mgd2lsbCBiZSByZS1jb25maWcgYXQgQVVESU9fU0VUX0NPTkZJRywKLQkgKiBidXQgYXQgbGVhc3Qgd2UgbmVlZCB0byBoYXZlIGluaXRpYWwgY29uZmlnCi0JICovCi0JIGlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkKLQkJCWF1ZGlvLT5idWZmZXJfc2l6ZSA9IChOVF9GUkFNRV9TSVpFIC0gMjQpOwotCWVsc2UKLQkJCWF1ZGlvLT5idWZmZXJfc2l6ZSA9IChGUkFNRV9TSVpFIC0gOCk7Ci0JYXVkaW8tPmVuY190eXBlID0gRU5DX1RZUEVfQUFDIHwgYXVkaW8tPm1vZGU7Ci0JYXVkaW8tPnNhbXBfcmF0ZSA9IDgwMDA7Ci0JYXVkaW8tPmNoYW5uZWxfbW9kZSA9IEFVRFJFQ19DTURfTU9ERV9NT05POwotCS8qIEZvciBBQUMsIGJpdCByYXRlIGhhcmQgY29kZWQsIGRlZmF1bHQgc2V0dGluZ3MgaXMKLQkgKiBzYW1wbGUgcmF0ZSAoODAwMCkgeCBjaGFubmVsIGNvdW50ICgxKSB4IHJlY29yZGluZyBxdWFsaXR5ICgxLjc1KQotCSAqID0gMTQwMDAgYnBzICAqLwotCWF1ZGlvLT5iaXRfcmF0ZSA9IDE0MDAwOwotCWF1ZGlvLT5yZWNvcmRfcXVhbGl0eSA9IDB4MWMwMDsKLQlNTV9EQkcoImVuY190eXBlID0gJXhcbiIsIGF1ZGlvLT5lbmNfdHlwZSk7Ci0JZW5jaWQgPSBhdWRwcmVwcm9jX2FlbmNfYWxsb2MoYXVkaW8tPmVuY190eXBlLCAmYXVkaW8tPm1vZHVsZV9uYW1lLAotCQkJJmF1ZGlvLT5xdWV1ZV9pZHMpOwotCWlmIChlbmNpZCA8IDApIHsKLQkJTU1fRVJSKCJObyBmcmVlIGVuY29kZXIgYXZhaWxhYmxlXG4iKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGRvbmU7Ci0JfQotCWF1ZGlvLT5lbmNfaWQgPSBlbmNpZDsKLQotCXJjID0gbXNtX2Fkc3BfZ2V0KGF1ZGlvLT5tb2R1bGVfbmFtZSwgJmF1ZGlvLT5hdWRyZWMsCi0JCQkgICAmYXVkcmVjX2FhY19hZHNwX29wcywgYXVkaW8pOwotCi0JaWYgKHJjKSB7Ci0JCWF1ZHByZXByb2NfYWVuY19mcmVlKGF1ZGlvLT5lbmNfaWQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYXVkaW8tPnN0b3BwZWQgPSAwOwotCWF1ZGlvLT5zb3VyY2UgPSAwOwotCWF1ZGlvLT5hYm9ydCA9IDA7Ci0JYXVkaW8tPndmbHVzaCA9IDA7Ci0JYXVkaW8tPnJmbHVzaCA9IDA7Ci0JYXVkaW8tPmZsdXNoX2FjayA9IDA7Ci0KLQlhdWRhYWNfaW5fZmx1c2goYXVkaW8pOwotCWF1ZGFhY19vdXRfZmx1c2goYXVkaW8pOwotCi0JYXVkaW8tPm91dF9waHlzID0gYWxsb2NhdGVfY29udGlndW91c19lYmlfbm9tYXAoQlVGRkVSX1NJWkUsIFNaXzRLKTsKLQlpZiAoIWF1ZGlvLT5vdXRfcGh5cykgewotCQlNTV9FUlIoImNvdWxkIG5vdCBhbGxvY2F0ZSB3cml0ZSBidWZmZXJzXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGV2dF9lcnJvcjsKLQl9IGVsc2UgewotCQlhdWRpby0+bWFwX3Zfd3JpdGUgPSBpb3JlbWFwKAotCQkJCQlhdWRpby0+b3V0X3BoeXMsIEJVRkZFUl9TSVpFKTsKLQkJaWYgKElTX0VSUihhdWRpby0+bWFwX3Zfd3JpdGUpKSB7Ci0JCQlNTV9FUlIoImNvdWxkIG5vdCBtYXAgd3JpdGUgcGh5cyBhZGRyZXNzXG4iKTsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPm91dF9waHlzKTsKLQkJCWdvdG8gZXZ0X2Vycm9yOwotCQl9Ci0JCWF1ZGlvLT5vdXRfZGF0YSA9IGF1ZGlvLT5tYXBfdl93cml0ZTsKLQkJTU1fREJHKCJ3cml0ZSBidWY6IHBoeSBhZGRyIDB4JTA4eCBrZXJuZWwgYWRkciAweCUwOHhcbiIsCi0JCQkJYXVkaW8tPm91dF9waHlzLCAoaW50KWF1ZGlvLT5vdXRfZGF0YSk7Ci0JfQotCWF1ZGlvLT5idWlsZF9pZCA9IHNvY2luZm9fZ2V0X2J1aWxkX2lkKCk7Ci0JTU1fREJHKCJNb2RlbSBidWlsZCBpZCA9ICVzXG4iLCBhdWRpby0+YnVpbGRfaWQpOwotCi0JCS8qIEluaXRpYWxpemUgYnVmZmVyICovCi0JYXVkaW8tPm91dFswXS5kYXRhID0gYXVkaW8tPm91dF9kYXRhICsgMDsKLQlhdWRpby0+b3V0WzBdLmFkZHIgPSBhdWRpby0+b3V0X3BoeXMgKyAwOwotCWF1ZGlvLT5vdXRbMF0uc2l6ZSA9IE9VVF9CVUZGRVJfU0laRTsKLQotCWF1ZGlvLT5vdXRbMV0uZGF0YSA9IGF1ZGlvLT5vdXRfZGF0YSArIE9VVF9CVUZGRVJfU0laRTsKLQlhdWRpby0+b3V0WzFdLmFkZHIgPSBhdWRpby0+b3V0X3BoeXMgKyBPVVRfQlVGRkVSX1NJWkU7Ci0JYXVkaW8tPm91dFsxXS5zaXplID0gT1VUX0JVRkZFUl9TSVpFOwotCi0JTU1fREJHKCJhdWRpby0+b3V0WzBdLmRhdGEgPSAlZCAgYXVkaW8tPm91dFsxXS5kYXRhID0gJWQiLAotCQkJCQkodW5zaWduZWQgaW50KWF1ZGlvLT5vdXRbMF0uZGF0YSwKLQkJCQkJKHVuc2lnbmVkIGludClhdWRpby0+b3V0WzFdLmRhdGEpOwotCWF1ZGlvLT5kZXZpY2VfZXZlbnRzID0gQVVEREVWX0VWVF9ERVZfUkRZIHwgQVVEREVWX0VWVF9ERVZfUkxTIHwKLQkJCQlBVURERVZfRVZUX0ZSRVFfQ0hHOwotCi0JcmMgPSBhdWRkZXZfcmVnaXN0ZXJfZXZ0X2xpc3RuZXIoYXVkaW8tPmRldmljZV9ldmVudHMsCi0JCQkJCUFVRERFVl9DTE5UX0VOQywgYXVkaW8tPmVuY19pZCwKLQkJCQkJYWFjX2luX2xpc3RlbmVyLCAodm9pZCAqKSBhdWRpbyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiZmFpbGVkIHRvIHJlZ2lzdGVyIGRldmljZSBldmVudCBsaXN0ZW5lclxuIik7Ci0JCWlvdW5tYXAoYXVkaW8tPm1hcF92X3dyaXRlKTsKLQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcihhdWRpby0+b3V0X3BoeXMpOwotCQlnb3RvIGV2dF9lcnJvcjsKLQl9Ci0JYXVkaW8tPm1maWVsZCA9IE1FVEFfT1VUX1NJWkU7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0JYXVkaW8tPm9wZW5lZCA9IDE7Ci0JYXVkaW8tPm91dF9mcmFtZV9jbnQrKzsKLQlyYyA9IDA7Ci1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLWV2dF9lcnJvcjoKLQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHJlYyk7Ci0JYXVkcHJlcHJvY19hZW5jX2ZyZWUoYXVkaW8tPmVuY19pZCk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19pbl9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBhdWRhYWNfaW5fb3BlbiwKLQkucmVsZWFzZQk9IGF1ZGFhY19pbl9yZWxlYXNlLAotCS5yZWFkCQk9IGF1ZGFhY19pbl9yZWFkLAotCS53cml0ZQkJPSBhdWRhYWNfaW5fd3JpdGUsCi0JLmZzeW5jCQk9IGF1ZGFhY19pbl9mc3luYywKLQkudW5sb2NrZWRfaW9jdGwJPSBhdWRhYWNfaW5faW9jdGwsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19hYWNfaW5fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX2FhY19pbiIsCi0JLmZvcHMJPSAmYXVkaW9faW5fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGFhY19pbl9pbml0KHZvaWQpCi17Ci0JbXV0ZXhfaW5pdCgmdGhlX2F1ZGlvX2FhY19pbi5sb2NrKTsKLQltdXRleF9pbml0KCZ0aGVfYXVkaW9fYWFjX2luLnJlYWRfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnRoZV9hdWRpb19hYWNfaW4uZHNwX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZ0aGVfYXVkaW9fYWFjX2luLmRldl9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfYXVkaW9fYWFjX2luLndhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoZV9hdWRpb19hYWNfaW4ud2FpdF9lbmFibGUpOwotCW11dGV4X2luaXQoJnRoZV9hdWRpb19hYWNfaW4ud3JpdGVfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdGhlX2F1ZGlvX2FhY19pbi53cml0ZV93YWl0KTsKLQotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19hYWNfaW5fbWlzYyk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhdWRhYWNfaW5faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2FjZGIuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fYWNkYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTM3OGJlLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fYWNkYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQyOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9tYXJpbWJhLmg+Ci0jaW5jbHVkZSA8bWFjaC9kYWwuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdV9kb21haW5zLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2Rldl9jdGwuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkcHAuaD4KLSNpbmNsdWRlIDxtYWNoL3NvY2luZm8uaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkcHJlcHJvYy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBwY21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHByZXByb2NjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHJlcHJvY21zZy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBwbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2FmZS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19hY2RiaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hY2RiX2NvbW1hbmRzLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2FjZGJfZGVmLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX21lbXR5cGVzLmg+Ci0KLS8qIHRoaXMgaXMgdGhlIEFDREIgZGV2aWNlIElEICovCi0jZGVmaW5lIERBTERFVklDRUlEX0FDREIJCTB4MDIwMDAwNjkKLSNkZWZpbmUgQUNEQl9QT1JUX05BTUUJCQkiREFMMDAiCi0jZGVmaW5lIEFDREJfQ1BVCQkJU01EX0FQUFNfTU9ERU0KLSNkZWZpbmUgQUNEQl9CVUZfU0laRQkJCTQwOTYKLSNkZWZpbmUgUEJFX0JVRl9TSVpFICAgICAgICAgICAgICAgICAgICAoMzMqMTAyNCkKLSNkZWZpbmUgRkxVRU5DRV9CVUZfU0laRQk0OTgKLQotI2RlZmluZSBBQ0RCX1ZBTFVFU19OT1RfRklMTEVECQkwCi0jZGVmaW5lIEFDREJfVkFMVUVTX0ZJTExFRAkJMQotI2RlZmluZSBNQVhfUkVUUlkJCQkxMAotCi0vKmJlbG93IG1hY3JvIGlzIHVzZWQgdG8gYWxpZ24gdGhlIHNlc3Npb24gaW5mbyByZWNlaXZlZCBmcm9tCi1EZXZjdGwgZHJpdmVyIHdpdGggdGhlIHN0YXRlIG1lbnRpb25lZCBhcyBub3QgdG8gYWx0ZXIgdGhlCi1FeGlzdGluZyBjb2RlKi8KLSNkZWZpbmUgQVVEUkVDX09GRlNFVAkyCi0vKiBycGMgdGFibGUgaW5kZXggKi8KLWVudW0gewotCUFDREJfRGFsQUNEQl9pb2N0bCA9IERBTERFVklDRV9GSVJTVF9ERVZJQ0VfQVBJX0lEWAotfTsKLQotZW51bSB7Ci0JQ0FMX0RBVEFfUkVBRFkJPSAweDEsCi0JQVVEUFBfUkVBRFkJPSAweDIsCi0JQVVEUkVDMF9SRUFEWQk9IDB4NCwKLQlBVURSRUMxX1JFQURZCT0gMHg4LAotCUFVRFJFQzJfUkVBRFkJPSAweDEwLAotfTsKLQotCi1zdHJ1Y3QgYWNkYl9kYXRhIHsKLQl2b2lkICpoYW5kbGU7Ci0KLQl1MzIgcGh5c19hZGRyOwotCXU4ICp2aXJ0X2FkZHI7Ci0KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNiX3RocmVhZF90YXNrOwotCXN0cnVjdCBhdWRkZXZfZXZ0X2F1ZGNhbF9pbmZvICpkZXZpY2VfaW5mbzsKLQotCXUzMiBhY2RiX3N0YXRlOwotCXN0cnVjdCBhdWRwcF9ldmVudF9jYWxsYmFjayBhdWRwcF9jYjsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19ldmVudF9jYWxsYmFjayBhdWRwcmVwcm9jX2NiOwotCi0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19wY20gKnBwX2lpcjsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19jYWxfZ2FpbiAqY2FsaWJfZ2Fpbl9yeDsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19wYmUgKnBiZV9ibG9jazsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX21iYWRyYyAqcHBfbWJhZHJjOwotCXN0cnVjdCBhdWRwcmVwcm9jX2NtZF9jZmdfYWdjX3BhcmFtcyAqcHJlcHJvY19hZ2M7Ci0Jc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19paXJfdHVuaW5nX2ZpbHRlcl9wYXJhbXMgKnByZXByb2NfaWlyOwotCXN0cnVjdCBhdWRwcmVwcm9jX2NtZF9jZmdfY2FsX2dhaW4gKmNhbGliX2dhaW5fdHg7Ci0Jc3RydWN0IGFjZGJfbWJhZHJjX2Jsb2NrIG1iYWRyY19ibG9jazsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19jbWRfY2ZnX2x2bnZfcGFyYW0gcHJlcHJvY19sdm52OwotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlzdHJ1Y3QgbXV0ZXggYWNkYl9tdXRleDsKLQl1MzIgZGV2aWNlX2NiX2NvbXBsOwotCXUzMiBhdWRwcF9jYl9jb21wbDsKLQl1MzIgcHJlcHJvY19jYl9jb21wbDsKLQl1OCBwcmVwcm9jX3N0cmVhbV9pZDsKLQl1OCBhdWRyZWNfYXBwbGllZDsKLQl1MzIgbXVsdGlwbGVfc2Vzc2lvbnM7Ci0JdTMyIGN1cl90eF9zZXNzaW9uOwotCXN0cnVjdCBhY2RiX3Jlc3VsdCBhY2RiX3Jlc3VsdDsKLQl1MTYgKnBiZV9leHRidWZmOwotCXUxNiAqcGJlX2VuYWJsZV9mbGFnOwotCXUzMiBmbHVlbmNlX2V4dGJ1ZmY7Ci0JdTggKmZsdWVuY2VfZXh0YnVmZl92aXJ0OwotCXZvaWQgKm1hcF92X2ZsdWVuY2U7Ci0KLQlzdHJ1Y3QgYWNkYl9wYmVfYmxvY2sgKnBiZV9ibGs7Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCWludCBkZWNfaWQ7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19lcWFsaXplciBlcTsKLQkgLypzdGF0dXMgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGZsdWVuY2UqLwotCWludCBmbGV1Y2VfZmVhdHVyZV9zdGF0dXNbTUFYX0FVRFJFQ19TRVNTSU9OU107Ci0Jc3RydWN0IGF1ZHJlY19zZXNzaW9uX2luZm8gc2Vzc2lvbl9pbmZvOwotCS8qcG1lbSBpbmZvKi8KLQlpbnQgcG1lbV9mZDsKLQl1bnNpZ25lZCBsb25nIHBhZGRyOwotCXVuc2lnbmVkIGxvbmcga3ZhZGRyOwotCXVuc2lnbmVkIGxvbmcgcG1lbV9sZW47Ci0Jc3RydWN0IGZpbGUgKmZpbGU7Ci0JLyogcG1lbSBmb3IgZ2V0IGFjZGIgYmxrICovCi0JdW5zaWduZWQgbG9uZwlnZXRfYmxrX3BhZGRyOwotCXU4CQkqZ2V0X2Jsa19rdmFkZHI7Ci0Jdm9pZCAqbWFwX3ZfZ2V0X2JsazsKLQljaGFyICpidWlsZF9pZDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWNkYl9kYXRhCQlhY2RiX2RhdGE7Ci0KLXN0cnVjdCBhY2RiX2NhY2hlX25vZGUgewotCXUzMiBub2RlX3N0YXR1czsKLQlzMzIgc3RyZWFtX2lkOwotCXUzMiBwaHlzX2FkZHJfYWNkYl92YWx1ZXM7Ci0Jdm9pZCAqbWFwX3ZfYWRkcjsKLQl1OCAqdmlydF9hZGRyX2FjZGJfdmFsdWVzOwotCXN0cnVjdCBhdWRkZXZfZXZ0X2F1ZGNhbF9pbmZvIGRldmljZV9pbmZvOwotfTsKLQotLypmb3IgUlggZGV2aWNlcyAgYWNkYiB2YWx1ZXMgYXJlIGFwcGxpZWQgYmFzZWQgb24gY29wcCBJRCBzbwotdGhlIGRlcHRoIG9mIHR4IGNhY2hlIGlzIE1BWCBudW1iZXIgb2YgQ09QUCBzdXBwb3J0ZWQgaW4gdGhlIHN5c3RlbSovCi1zdHJ1Y3QgYWNkYl9jYWNoZV9ub2RlIGFjZGJfY2FjaGVfcnhbTUFYX0NPUFBfTk9ERV9TVVBQT1JURURdOwotCi0vKmZvciBUWCBkZXZpY2VzIGFjZGIgdmFsdWVzIGFyZSBhcHBsaWVkIGJhc2VkIG9uIEFVRFJFQyBzZXNzaW9uIGFuZAotdGhlIGRlcHRoIG9mIHRoZSB0eCBjYWNoZSBpcyBkZWZpbmUgYnkgbnVtYmVyIG9mIEFVRFJFQyBzZXNzaW9ucyBzdXBwb3J0ZWQqLwotc3RydWN0IGFjZGJfY2FjaGVfbm9kZSBhY2RiX2NhY2hlX3R4W01BWF9BVURSRUNfU0VTU0lPTlNdOwotCi0vKkF1ZHJlYyBzZXNzaW9uIGluZm8gaW5jbHVkZXMgQXR0cmlidXRlcyBTYW1wbGluZyBmcmVxdWVuY3kgYW5kIGVuY19pZCAqLwotc3RydWN0IGF1ZHJlY19zZXNzaW9uX2luZm8gc2Vzc2lvbl9pbmZvW01BWF9BVURSRUNfU0VTU0lPTlNdOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCi0jZGVmaW5lIFJUQ19NQVhfVElNRU9VVCA1MDAgLyogNTAwIG1zICovCi0jZGVmaW5lIFBNRU1fUlRDX0FDREJfUVVFUllfTUVNIDQwOTYKLSNkZWZpbmUgRVhUUkFDVF9ISUdIX1dPUkQoeCkgKCh4ICYgMHhGRkZGMDAwMCk+PjE2KQotI2RlZmluZSBFWFRSQUNUX0xPV19XT1JEKHgpICgweDAwMDBGRkZGICYgeCkKLSNkZWZpbmUJQUNEQl9SVENfVFggMHhGMQotI2RlZmluZQlBQ0RCX1JUQ19SWCAweDFGCi0KLQotc3RhdGljIHUzMiBhY2RiX2F1ZHBwX2VudHJ5W11bNF0gPSB7Ci0KLSAgeyBBQklEX0FVRElPX1JUQ19WT0xVTUVfUEFOX1JYLFwKLSAgICBJSURfQVVESU9fUlRDX1ZPTFVNRV9QQU5fUEFSQU1FVEVSUyxcCi0gICAgQVVEUFBfQ01EX1ZPTFVNRV9QQU4sXAotICAgIEFDREJfUlRDX1JYCi0gICB9LAotICB7IEFCSURfQVVESU9fSUlSX1JYLFwKLSAgICAgSUlEX0FVRElPX0lJUl9DT0VGRixcCi0gICAgIEFVRFBQX0NNRF9JSVJfVFVOSU5HX0ZJTFRFUiwKLSAgICAgQUNEQl9SVENfUlgKLSAgIH0sCi0gIHsgQUJJRF9BVURJT19SVENfRVFVQUxJWkVSX1BBUkFNRVRFUlMsXAotICAgICBJSURfQVVESU9fUlRDX0VRVUFMSVpFUl9QQVJBTUVURVJTLFwKLSAgICAgQVVEUFBfQ01EX0VRVUFMSVpFUixcCi0gICAgIEFDREJfUlRDX1JYCi0gICB9LAotICB7IEFCSURfQVVESU9fUlRDX1NQQSxcCi0gICAgIElJRF9BVURJT19SVENfU1BBX1BBUkFNRVRFUlMsXAotICAgICBBVURQUF9DTURfU1BFQ1RST0dSQU0sCi0gICAgIEFDREJfUlRDX1JYCi0gICB9LAotICB7IEFCSURfQVVESU9fU1RGX1JYLFwKLSAgICAgSUlEX0FVRElPX0lJUl9DT0VGRixcCi0gICAgIEFVRFBQX0NNRF9TSURFQ0hBSU5fVFVOSU5HX0ZJTFRFUixcCi0gICAgIEFDREJfUlRDX1JYCi0gIH0sCi0gIHsKLSAgICAgQUJJRF9BVURJT19NQkFEUkNfUlgsXAotICAgICBJSURfQVVESU9fUlRDX01CQURSQ19QQVJBTUVURVJTLFwKLSAgICAgQVVEUFBfQ01EX01CQURSQyxcCi0gICAgIEFDREJfUlRDX1JYCi0gIH0sCi0gIHsKLSAgICBBQklEX0FVRElPX0FHQ19UWCxcCi0gICAgSUlEX0FVRElPX0FHQ19QQVJBTUVURVJTLFwKLSAgICBBVURQUkVQUk9DX0NNRF9DRkdfQUdDX1BBUkFNUyxcCi0gICAgQUNEQl9SVENfVFgKLSAgfSwKLSAgewotICAgIEFCSURfQVVESU9fQUdDX1RYLFwKLSAgICBJSURfQVVESU9fUlRDX0FHQ19QQVJBTUVURVJTLFwKLSAgICBBVURQUkVQUk9DX0NNRF9DRkdfQUdDX1BBUkFNUyxcCi0gICAgQUNEQl9SVENfVFgKLSAgfSwKLSAgewotICAgIEFCSURfQVVESU9fTlNfVFgsXAotICAgIElJRF9OU19QQVJBTUVURVJTLFwKLSAgICBBVURQUkVQUk9DX0NNRF9DRkdfTlNfUEFSQU1TLFwKLSAgICBBQ0RCX1JUQ19UWAotICB9LAotICB7Ci0gICAgIEFCSURfQVVESU9fSUlSX1RYLFwKLSAgICAgSUlEX0FVRElPX1JUQ19UWF9JSVJfQ09FRkYsXAotICAgICBBVURQUkVQUk9DX0NNRF9DRkdfSUlSX1RVTklOR19GSUxURVJfUEFSQU1TLFwKLSAgICAgQUNEQl9SVENfVFgKLSAgfSwKLSAgewotICAgICBBQklEX0FVRElPX0lJUl9UWCxcCi0gICAgIElJRF9BVURJT19JSVJfQ09FRkYsXAotICAgICBBVURQUkVQUk9DX0NNRF9DRkdfSUlSX1RVTklOR19GSUxURVJfUEFSQU1TLFwKLSAgICAgQUNEQl9SVENfVFgKLSAgfQotIC8qQW55IG5ldyBlbnRyaWVzIHNob3VsZCBiZSBhZGRlZCBoZXJlKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpnZXRfc2V0X2FiaWRfZGVudHJ5Owotc3RhdGljIHN0cnVjdCBkZW50cnkgKmdldF9zZXRfYWJpZF9kYXRhX2RlbnRyeTsKLQotc3RydWN0IHJ0Y19hY2RiX3BtZW0gewotCXU4ICp2aXJhZGRyOwotCWludDMyX3QgcGh5czsKLQl2b2lkICptYXBfdl9ydGM7Ci19OwotCi1zdHJ1Y3QgcnRjX2FjZGJfZGF0YSB7Ci0JdTMyIGFjZGJfaWQ7Ci0JdTMyIGNtZF9pZDsKLQl1MzIgc2V0X2FiaWQ7Ci0JdTMyIHNldF9paWQ7Ci0JdTMyIGFiaWQ7Ci0JdTMyIGVycjsKLQlib29sIHZhbGlkX2FiaWQ7Ci0JdTMyIHR4X3J4X2N0bDsKLQlzdHJ1Y3QgcnRjX2FjZGJfcG1lbSBydGNfcmVhZDsKLQlzdHJ1Y3QgcnRjX2FjZGJfcG1lbSBydGNfd3JpdGU7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgIHdhaXQ7Ci19OwotCi1zdHJ1Y3QgZ2V0X2FiaWQgewotCXUzMgljbWRfaWQ7Ci0JdTMyCWFjZGJfaWQ7Ci0JdTMyCXNldF9hYmlkOwotCXUzMglzZXRfaWlkOwotfTsKLQotc3RydWN0IGFjZGJfYmxvY2tfbWJhZHJjX3J0YyB7Ci0JdTE2IGVuYWJsZTsKLQl1MTYgbnVtX2JhbmRzOwotCXUxNiBkb3duX3NhbXBfbGV2ZWw7Ci0JdTE2IGFkcmNfZGVsYXk7Ci0JdTE2IGV4dF9idWZfc2l6ZTsKLQl1MTYgZXh0X3BhcnRpdGlvbjsKLQl1MTYgZXh0X2J1Zl9tc3c7Ci0JdTE2IGV4dF9idWZfbHN3OwotCXN0cnVjdCBhZHJjX2NvbmZpZyBhZHJjX2JhbmRbQVVEUFBfTUFYX01CQURSQ19CQU5EU107Ci0Jc2lnbmVkIGludCBFeHRCdWZmWzE5Nl07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1lbnVtIHsKLQlBQ0RCX1JUQ19TVUNDRVNTLAotCUFDREJfUlRDX0VSUl9JTlZBTElEX0RFVklDRSwKLQlBQ0RCX1JUQ19FUlJfREVWSUNFX0lOQUNUSVZFLAotCUFDREJfUlRDX0VSUl9JTlZBTElEX0FCSUQsCi0JQUNEQl9SVENfRFNQX0ZBSUxVUkUsCi0JQUNEQl9SVENfRFNQX0ZFQVRVUkVfTk9UX0FWQUlMQUJMRSwKLQlBQ0RCX1JUQ19FUlJfSU5WQUxJRF9MRU4sCi0JQUNEQl9SVENfRVJSX1VOS05PV05fRkFJTFVSRSwKLQlBQ0RCX1JUQ19QRU5ESU5HX1JFU1BPTlNFLAotCUFDREJfUlRDX0lOSVRfRkFJTFVSRSwKLX07Ci0KLXN0YXRpYyAgc3RydWN0IHJ0Y19hY2RiX2RhdGEgcnRjX2FjZGI7Ci0KLXN0YXRpYyBpbnQgcnRjX2dldHNldGFiaWRfZGJnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlNTV9JTkZPKCJHRVQtU0VUIEFCSUQgT3BlbiBkZWJ1ZyBpbnRmICVzXG4iLAotCQkJKGNoYXIgKikgZmlsZS0+cHJpdmF0ZV9kYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2wgZ2V0X2ZlYXR1cmVfaWQodTMyIHNldF9hYmlkLCB1MzIgaWlkLCB1bnNpZ25lZCBzaG9ydCAqZmVhdHVyZV9pZCkKLXsKLQlib29sIHJldF92YWx1ZSA9IGZhbHNlOwotCWludCBpID0gMDsKLQotCWZvciAoOyBpIDwgKHNpemVvZihhY2RiX2F1ZHBwX2VudHJ5KSAvIHNpemVvZihhY2RiX2F1ZHBwX2VudHJ5WzBdKSk7XAotCQlpKyspIHsKLQkJaWYgKGFjZGJfYXVkcHBfZW50cnlbaV1bMF0gPT0gc2V0X2FiaWQgJiYKLQkJCWFjZGJfYXVkcHBfZW50cnlbaV1bMV0gPT0gaWlkKSB7Ci0JCQkqZmVhdHVyZV9pZCA9ICBhY2RiX2F1ZHBwX2VudHJ5W2ldWzJdOwotCQkJcnRjX2FjZGIudHhfcnhfY3RsID0gYWNkYl9hdWRwcF9lbnRyeVtpXVszXTsKLQkJCXJldF92YWx1ZSA9IHRydWU7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gcmV0X3ZhbHVlOwotfQotc3RhdGljIHNzaXplX3QgcnRjX2dldHNldGFiaWRfZGJnX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLAotCQkJCQljb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwKLQkJCQkJc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCAgZ2V0X2FiaWQgd3JpdGVfYWJpZDsKLQl1bnNpZ25lZCBzaG9ydCBmZWF0X2lkID0gMDsKLQlydGNfYWNkYi52YWxpZF9hYmlkID0gZmFsc2U7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJndyaXRlX2FiaWQsIFwKLQkJKHZvaWQgKil1YnVmLCBzaXplb2Yoc3RydWN0IGdldF9hYmlkKSkpIHsKLQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLSBJTlZBTElEIFJFQUQgTEVOXG4iKTsKLQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfRVJSX0lOVkFMSURfTEVOOwotCQlyZXR1cm4gY250OwotCX0KLQlNTV9JTkZPKCJTRVQgQUJJRCA6IENtZCBJRDogJWQgRGV2aWNlOiVkIEFCSUQ6JWQgSUlEIDogJWQgY250OiAlZFxuIixcCi0JCXdyaXRlX2FiaWQuY21kX2lkLCB3cml0ZV9hYmlkLmFjZGJfaWQsCi0JCXdyaXRlX2FiaWQuc2V0X2FiaWQsIHdyaXRlX2FiaWQuc2V0X2lpZCwgY250KTsKLQlpZiAod3JpdGVfYWJpZC5hY2RiX2lkID4gQUNEQl9JRF9NQVggfHwKLQkJd3JpdGVfYWJpZC5hY2RiX2lkIDwgQUNEQl9JRF9IQU5EU0VUX1NQS1IpewotCQlydGNfYWNkYi5lcnIgPSBBQ0RCX1JUQ19FUlJfSU5WQUxJRF9ERVZJQ0U7Ci0JCXJldHVybiBjbnQ7Ci0JfQotCWlmICghaXNfZGV2X29wZW5lZCh3cml0ZV9hYmlkLmFjZGJfaWQpKQl7Ci0JCXJ0Y19hY2RiLmVyciA9IEFDREJfUlRDX0VSUl9ERVZJQ0VfSU5BQ1RJVkU7Ci0JCXJldHVybiBjbnQ7Ci0JfQotCXJ0Y19hY2RiLmVyciA9IEFDREJfUlRDX0VSUl9JTlZBTElEX0FCSUQ7Ci0JcnRjX2FjZGIuYWJpZCA9IHdyaXRlX2FiaWQuc2V0X2FiaWQ7Ci0JaWYgKGdldF9mZWF0dXJlX2lkKHdyaXRlX2FiaWQuc2V0X2FiaWQsIFwKLQkJd3JpdGVfYWJpZC5zZXRfaWlkLCAmZmVhdF9pZCkpIHsKLQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfU1VDQ0VTUzsKLQkJcnRjX2FjZGIuY21kX2lkID0gd3JpdGVfYWJpZC5jbWRfaWQ7Ci0JCXJ0Y19hY2RiLmFjZGJfaWQgPSB3cml0ZV9hYmlkLmFjZGJfaWQ7Ci0JCXJ0Y19hY2RiLnNldF9hYmlkID0gZmVhdF9pZDsKLQkJcnRjX2FjZGIudmFsaWRfYWJpZCA9IHRydWU7Ci0JCXJ0Y19hY2RiLnNldF9paWQgPSB3cml0ZV9hYmlkLnNldF9paWQ7Ci0JfQotCXJldHVybiBjbnQ7Ci19Ci1zdGF0aWMgc3NpemVfdAlydGNfZ2V0c2V0YWJpZF9kYmdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RhdGljIGNoYXIgYnVmZmVyWzEwMjRdOwotCWludCBuID0gMDsKLQl1MzIgbXNnID0gcnRjX2FjZGIuZXJyOwotCW1lbWNweShidWZmZXIsICZydGNfYWNkYi5jbWRfaWQsIHNpemVvZihzdHJ1Y3QgZ2V0X2FiaWQpKTsKLQltZW1jcHkoYnVmZmVyKzE2LCAmbXNnLCA0KTsKLQluID0gMjA7Ci0JTU1fSU5GTygiU0VUIEFCSUQgOiBDbWQgSUQ6ICV4IERldmljZToleCBBQklEOiV4IElJRCA6ICV4IEVycjogJWRcbiIsXAotCQlydGNfYWNkYi5jbWRfaWQsIHJ0Y19hY2RiLmFjZGJfaWQsIHJ0Y19hY2RiLnNldF9hYmlkLFwKLQkJcnRjX2FjZGIuc2V0X2lpZCwgcnRjX2FjZGIuZXJyKTsKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKLX0KLQotc3RhdGljIGludCBydGNfZ2V0c2V0YWJpZF9kYXRhX2RiZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JTU1fSU5GTygiR0VULVNFVCBBQklEIERBVEEgT3BlbiBkZWJ1ZyBpbnRmICVzXG4iLAotCQkoY2hhciAqKSBmaWxlLT5wcml2YXRlX2RhdGEpOwotCXJldHVybiAwOwotfQotCi12b2lkIGFjZGJfcnRjX3NldF9lcnIodTMyIEVyckNvZGUpCi17Ci0JaWYgKHJ0Y19hY2RiLmVyciA9PSBBQ0RCX1JUQ19QRU5ESU5HX1JFU1BPTlNFKSB7Ci0JCWlmIChFcnJDb2RlID09IDB4RkZGRikgewotCQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfU1VDQ0VTUzsKLQkJCU1NX0lORk8oIlJUQyBSRUFEIFNVQ0NFU1MtLS1cbiIpOwotCQl9IGVsc2UgaWYgKEVyckNvZGUgPT0gMCkgewotCQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfRFNQX0ZBSUxVUkU7Ci0JCQlNTV9JTkZPKCJSVEMgUkVBRCBGQUlMLS0tXG4iKTsKLQkJfSBlbHNlIGlmIChFcnJDb2RlID09IDEpIHsKLQkJCXJ0Y19hY2RiLmVyciA9IEFDREJfUlRDX0RTUF9GRUFUVVJFX05PVF9BVkFJTEFCTEU7Ci0JCQlNTV9JTkZPKCJSVEMgUkVBRCBGRUFUIFVOQVZBSUxBQkxFLS0tXG4iKTsKLQkJfSBlbHNlIHsKLQkJCXJ0Y19hY2RiLmVyciA9IEFDREJfUlRDX0RTUF9GQUlMVVJFOwotCQkJTU1fRVJSKCJSVEMgRXJyIENPREUtLS1cbiIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfRFNQX0ZBSUxVUkU7Ci0JCU1NX0VSUigiUlRDIEVyciBjb2RlIEludmFsaWQgU3RhdGVcbiIpOwotCX0KLQl3YWtlX3VwKCZydGNfYWNkYi53YWl0KTsKLX0KLXN0YXRpYyBzc2l6ZV90CXJ0Y19nZXRzZXRhYmlkX2RhdGFfZGJnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCWNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCQkJbG9mZl90ICpwcG9zKQotewotCXN0YXRpYyBjaGFyIGJ1ZmZlcltQTUVNX1JUQ19BQ0RCX1FVRVJZX01FTV07Ci0JaW50IHJjLCBuID0gMDsKLQlpbnQgY291bnRlciA9IDA7Ci0Jc3RydWN0IHJ0Y19hY2RiX3BtZW0gKnJ0Y19yZWFkID0gJnJ0Y19hY2RiLnJ0Y19yZWFkOwotCW1lbXNldCgmYnVmZmVyLCAwLCBQTUVNX1JUQ19BQ0RCX1FVRVJZX01FTSk7Ci0KLQlpZiAocnRjX2FjZGIudmFsaWRfYWJpZCAhPSB0cnVlKSB7Ci0JCU1NX0VSUigiQUNEQiBEQVRBIFJFQUQgLS0tSU5WQUxJRCBBQklEXG4iKTsKLQkJbiA9IDA7Ci0JCXJ0Y19hY2RiLmVyciA9IEFDREJfUlRDX0VSUl9JTlZBTElEX0FCSUQ7Ci0JfSBlbHNlIHsKLQkJaWYgKFBNRU1fUlRDX0FDREJfUVVFUllfTUVNIDwgY291bnQpIHsKLQkJCU1NX0VSUigiQUNEQiBEQVRBIFJFQUQgLS0tXAotCQkJCUlOVkFMSUQgUkVBRCBMRU4gJXhcbiIsIGNvdW50KTsKLQkJCW4gPSAwOwotCQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfRVJSX0lOVkFMSURfTEVOOwotCQl9IGVsc2UgewotCQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfUEVORElOR19SRVNQT05TRTsKLQkJCWlmIChydGNfcmVhZC0+dmlyYWRkciAhPSBOVUxMKSB7Ci0JCQkJbWVtc2V0KHJ0Y19yZWFkLT52aXJhZGRyLAotCQkJCQkwLCBQTUVNX1JUQ19BQ0RCX1FVRVJZX01FTSk7Ci0JCQl9Ci0JCQlpZiAocnRjX2FjZGIudHhfcnhfY3RsID09IEFDREJfUlRDX1JYKSB7Ci0JCQkJc3RydWN0IHJ0Y19hdWRwcF9yZWFkX2RhdGEgcnRjX3JlYWRfY21kOwotCQkJCXJ0Y19yZWFkX2NtZC5jbWRfaWQgPQotCQkJCQlBVURQUF9DTURfUFBfRkVBVF9RVUVSWV9QQVJBTVM7Ci0JCQkJcnRjX3JlYWRfY21kLm9ial9pZCA9Ci0JCQkJCUFVRFBQX0NNRF9DT1BQX1NUUkVBTTsKLQkJCQlydGNfcmVhZF9jbWQucm91dGVfaWQgPQotCQkJCQlhY2RiX2RhdGEuZGV2aWNlX2luZm8tPmRldl9pZDsKLQkJCQlydGNfcmVhZF9jbWQuZmVhdHVyZV9pZCA9IHJ0Y19hY2RiLnNldF9hYmlkOwotCQkJCXJ0Y19yZWFkX2NtZC5leHRidWZzaXplbXN3ID0KLQkJCQkJRVhUUkFDVF9ISUdIX1dPUkQoXAotCQkJCQkJUE1FTV9SVENfQUNEQl9RVUVSWV9NRU0pOwotCQkJCXJ0Y19yZWFkX2NtZC5leHRidWZzaXplbHN3ID0KLQkJCQkJRVhUUkFDVF9MT1dfV09SRChcCi0JCQkJCQlQTUVNX1JUQ19BQ0RCX1FVRVJZX01FTSk7Ci0JCQkJcnRjX3JlYWRfY21kLmV4dHBhcnQgPSAweDAwMDA7Ci0JCQkJcnRjX3JlYWRfY21kLmV4dGJ1ZnN0YXJ0bXN3ID0KLQkJCQkJRVhUUkFDVF9ISUdIX1dPUkQocnRjX3JlYWQtPnBoeXMpOwotCQkJCXJ0Y19yZWFkX2NtZC5leHRidWZzdGFydGxzdyA9Ci0JCQkJCUVYVFJBQ1RfTE9XX1dPUkQocnRjX3JlYWQtPnBoeXMpOwotCQkJCXJjID0gYXVkcHBfc2VuZF9xdWV1ZTIoJnJ0Y19yZWFkX2NtZCwKLQkJCQkJCXNpemVvZihydGNfcmVhZF9jbWQpKTsKLQkJCQlNTV9JTkZPKCJBQ0RCIFJFQUQgQ29tbWFuZCBSQyAtLS0+JXhcCi0JCQkJCVJvdXRlIElEPSV4XG4iLCByYyxcCi0JCQkJCWFjZGJfZGF0YS5kZXZpY2VfaW5mby0+ZGV2X2lkKTsKLQkJCX0gZWxzZSBpZiAocnRjX2FjZGIudHhfcnhfY3RsID09IEFDREJfUlRDX1RYKSB7Ci0JCQkJc3RydWN0IHJ0Y19hdWRwcmVwcm9jX3JlYWRfZGF0YSBydGNfYXVkcHJlcHJvYzsKLQkJCQlydGNfYXVkcHJlcHJvYy5jbWRfaWQgPQotCQkJCQlBVURQUkVQUk9DX0NNRF9GRUFUX1FVRVJZX1BBUkFNUzsKLQkJCQlydGNfYXVkcHJlcHJvYy5zdHJlYW1faWQgPQotCQkJCQlhY2RiX2RhdGEucHJlcHJvY19zdHJlYW1faWQ7Ci0JCQkJcnRjX2F1ZHByZXByb2MuZmVhdHVyZV9pZCA9IHJ0Y19hY2RiLnNldF9hYmlkOwotCQkJCXJ0Y19hdWRwcmVwcm9jLmV4dGJ1ZnNpemVtc3cgPQotCQkJCQlFWFRSQUNUX0hJR0hfV09SRChcCi0JCQkJCQlQTUVNX1JUQ19BQ0RCX1FVRVJZX01FTSk7Ci0JCQkJcnRjX2F1ZHByZXByb2MuZXh0YnVmc2l6ZWxzdyA9Ci0JCQkJCUVYVFJBQ1RfTE9XX1dPUkQoXAotCQkJCQkJUE1FTV9SVENfQUNEQl9RVUVSWV9NRU0pOwotCQkJCXJ0Y19hdWRwcmVwcm9jLmV4dHBhcnQgPSAweDAwMDA7Ci0JCQkJcnRjX2F1ZHByZXByb2MuZXh0YnVmc3RhcnRtc3cgPQotCQkJCQlFWFRSQUNUX0hJR0hfV09SRChydGNfcmVhZC0+cGh5cyk7Ci0JCQkJcnRjX2F1ZHByZXByb2MuZXh0YnVmc3RhcnRsc3cgPQotCQkJCQlFWFRSQUNUX0xPV19XT1JEKHJ0Y19yZWFkLT5waHlzKTsKLQkJCQlyYyA9ICBhdWRwcmVwcm9jX3NlbmRfcHJlcHJvY2NtZHF1ZXVlKAotCQkJCQkJJnJ0Y19hdWRwcmVwcm9jLFwKLQkJCQkJCXNpemVvZihydGNfYXVkcHJlcHJvYykpOwotCQkJCU1NX0lORk8oIkFDREIgUkVBRCBDb21tYW5kIFJDIC0tLT4leCxcCi0JCQkJCXN0cmVhbV9pZCAleFxuIiwgcmMsXAotCQkJCQlhY2RiX2RhdGEucHJlcHJvY19zdHJlYW1faWQpOwotCQkJfQotCQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChydGNfYWNkYi53YWl0LAotCQkJCQkocnRjX2FjZGIuZXJyICE9Ci0JCQkJCUFDREJfUlRDX1BFTkRJTkdfUkVTUE9OU0UpLAotCQkJCQltc2Vjc190b19qaWZmaWVzKFJUQ19NQVhfVElNRU9VVCkpOwotCQlNTV9JTkZPKCJBQ0RCIFJFQUQgQUNLIENvdW50ID0gJXggRXJyID0gJXhcbiIsCi0JCQljb3VudCwgcnRjX2FjZGIuZXJyKTsKLQkJewotCQkJaWYgKHJ0Y19hY2RiLmVyciA9PSBBQ0RCX1JUQ19TVUNDRVNTCi0JCQkJJiYgcnRjX3JlYWQtPnZpcmFkZHIgIT0gTlVMTCkgewotCQkJCW1lbWNweShidWZmZXIsIHJ0Y19yZWFkLT52aXJhZGRyLCBjb3VudCk7Ci0JCQkJbiA9IGNvdW50OwotCQkJCXdoaWxlIChjb3VudGVyIDwgY291bnQpIHsKLQkJCQkJTU1fREJHKCIleCIsIFwKLQkJCQkJCXJ0Y19yZWFkLT52aXJhZGRyW2NvdW50ZXJdKTsKLQkJCQkJY291bnRlcisrOwotCQkJCQl9Ci0JCQkJfQotCQl9Ci0JfQotCX0KLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKLX0KLQotc3RhdGljIGJvb2wgYWNkYl9zZXRfdHhfcnRjKGNvbnN0IGNoYXIgKnVidWYsIHNpemVfdCB3cml0ZWNvdW50KQotewotCXN0cnVjdCBhdWRwcmVwcm9jX2NtZF9jZmdfaWlyX3R1bmluZ19maWx0ZXJfcGFyYW1zICpwcmVwcm9jX2lpcjsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19jbWRfY2ZnX2FnY19wYXJhbXMgKnByZXByb2NfYWdjOwotCXN0cnVjdCBhdWRwcmVwcm9jX2NtZF9jZmdfbnNfcGFyYW1zICpwcmVwcm9jX25zOwotCXMzMglyZXN1bHQgPSAwOwotCWJvb2wgcmV0dmFsID0gZmFsc2U7Ci0JdW5zaWduZWQgc2hvcnQgaWlyY21kc2l6ZSA9Ci0JCXNpemVvZihzdHJ1Y3QgYXVkcHJlcHJvY19jbWRfY2ZnX2lpcl90dW5pbmdfZmlsdGVyX3BhcmFtcyk7Ci0JdW5zaWduZWQgc2hvcnQgaWlyY21kaWQgPSBBVURQUkVQUk9DX0NNRF9DRkdfSUlSX1RVTklOR19GSUxURVJfUEFSQU1TOwotCi0JcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfRVJSX1VOS05PV05fRkFJTFVSRTsKLQotCXN3aXRjaCAocnRjX2FjZGIuc2V0X2FiaWQpIHsKLQotCWNhc2UgQVVEUFJFUFJPQ19DTURfQ0ZHX0FHQ19QQVJBTVM6Ci0JY2FzZSBBVURQUkVQUk9DX0NNRF9DRkdfQUdDX1BBUkFNU18yOgotCXsKLQkJcHJlcHJvY19hZ2MgPSBrbWFsbG9jKHNpemVvZihcCi0JCQkJCXN0cnVjdCBhdWRwcmVwcm9jX2NtZF9jZmdfYWdjX3BhcmFtcyksXAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKChzaXplb2Yoc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19hZ2NfcGFyYW1zKSAtXAotCQkJKDIqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkpCi0JCQk8IHdyaXRlY291bnQpIHsKLQkJCQlNTV9FUlIoIkFDREIgREFUQSBXUklURSAtLVwKLQkJCQkJQUdDIFRYIHdyaXRlY291bnQgPiBEU1Agc3RydWN0XG4iKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChwcmVwcm9jX2FnYyAhPSBOVUxMKSB7Ci0JCQkJY2hhciAqYmFzZTsgdW5zaWduZWQgc2hvcnQgb2Zmc2V0OwotCQkJCXVuc2lnbmVkIHNob3J0ICpvZmZzZXRfYWRkcjsKLQkJCQliYXNlID0gKGNoYXIgKilwcmVwcm9jX2FnYzsKLQkJCQlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgXAotCQkJCQkJYXVkcHJlcHJvY19jbWRfY2ZnX2FnY19wYXJhbXMsXAotCQkJCQkJdHhfYWdjX3BhcmFtX21hc2spOwotCQkJCW9mZnNldF9hZGRyID0gKHVuc2lnbmVkIHNob3J0ICopKGJhc2UgKyBvZmZzZXQpOwotCQkJCWlmICgoY29weV9mcm9tX3VzZXIob2Zmc2V0X2FkZHIsXAotCQkJCQkodm9pZCAqKXVidWYsIHdyaXRlY291bnQpKSA9PSAweDAwKSB7Ci0JCQkJCXByZXByb2NfYWdjLT5jbWRfaWQgPQotCQkJCQkJQVVEUFJFUFJPQ19DTURfQ0ZHX0FHQ19QQVJBTVM7Ci0JCQkJCXByZXByb2NfYWdjLT5zdHJlYW1faWQgPQotCQkJCQkJYWNkYl9kYXRhLnByZXByb2Nfc3RyZWFtX2lkOwotCQkJCQlyZXN1bHQgPSBhdWRwcmVwcm9jX2RzcF9zZXRfYWdjKAotCQkJCQkJcHJlcHJvY19hZ2MsCi0JCQkJCQlzaXplb2Yoc3RydWN0IFwKLQkJCQkJCWF1ZHByZXByb2NfY21kX2NmZ19hZ2NfcGFyYW1zKSk7Ci0JCQkJCWlmIChyZXN1bHQpIHsKLQkJCQkJCU1NX0VSUigiQUNEQj0+IEZhaWxlZCB0byBcCi0JCQkJCQkJc2VuZCBBR0MgZGF0YSB0byBcCi0JCQkJCQkJcHJlcHJvYylcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dmFsID0gdHJ1ZTsKLQkJCQkJICAgICAgIH0KLQkJCQl9IGVsc2UgewotCQkJCQlNTV9FUlIoIkFDREIgREFUQSBXUklURSAtLS1cCi0JCQkJCQlHQyBUeCBjb3B5X2Zyb21fdXNlciBGYWlsXG4iKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCU1NX0VSUigiQUNEQiBEQVRBIFdSSVRFIC0tXAotCQkJCQlBR0MgVFgga2FsbG9jIEZhaWxlZCBMRU5cbiIpOwotCQkJfQotCQl9Ci0JCWlmIChwcmVwcm9jX2FnYyAhPSBOVUxMKQotCQkJa2ZyZWUocHJlcHJvY19hZ2MpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURQUkVQUk9DX0NNRF9DRkdfTlNfUEFSQU1TOgotCXsKLQotCQlwcmVwcm9jX25zID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IFwKLQkJCQkJYXVkcHJlcHJvY19jbWRfY2ZnX25zX3BhcmFtcyksXAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKChzaXplb2Yoc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19uc19wYXJhbXMpIC1cCi0JCQkJKDIgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKSkKLQkJCQk8IHdyaXRlY291bnQpIHsKLQkJCQlNTV9FUlIoIkFDREIgREFUQSBXUklURSAtLVwKLQkJCQkJTlMgVFggd3JpdGVjb3VudCA+IERTUCBzdHJ1Y3RcbiIpOwotCQl9IGVsc2UgewotCQkJaWYgKHByZXByb2NfbnMgIT0gTlVMTCkgewotCQkJCWNoYXIgKmJhc2U7IHVuc2lnbmVkIHNob3J0IG9mZnNldDsKLQkJCQl1bnNpZ25lZCBzaG9ydCAqb2Zmc2V0X2FkZHI7Ci0JCQkJYmFzZSA9IChjaGFyICopcHJlcHJvY19uczsKLQkJCQlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgXAotCQkJCQkJYXVkcHJlcHJvY19jbWRfY2ZnX25zX3BhcmFtcyxcCi0JCQkJCQllY19tb2RlX25ldyk7Ci0JCQkJb2Zmc2V0X2FkZHIgPSAodW5zaWduZWQgc2hvcnQgKikoYmFzZSArIG9mZnNldCk7Ci0JCQkJaWYgKChjb3B5X2Zyb21fdXNlcihvZmZzZXRfYWRkcixcCi0JCQkJCSh2b2lkICopdWJ1Ziwgd3JpdGVjb3VudCkpID09IDB4MDApIHsKLQkJCQkJcHJlcHJvY19ucy0+Y21kX2lkID0KLQkJCQkJCUFVRFBSRVBST0NfQ01EX0NGR19OU19QQVJBTVM7Ci0JCQkJCXByZXByb2NfbnMtPnN0cmVhbV9pZCA9Ci0JCQkJCQlhY2RiX2RhdGEucHJlcHJvY19zdHJlYW1faWQ7Ci0JCQkJCXJlc3VsdCA9IGF1ZHByZXByb2NfZHNwX3NldF9ucygKLQkJCQkJCXByZXByb2NfbnMsCi0JCQkJCQlzaXplb2Yoc3RydWN0IFwKLQkJCQkJCWF1ZHByZXByb2NfY21kX2NmZ19uc19wYXJhbXMpKTsKLQkJCQkJaWYgKHJlc3VsdCkgewotCQkJCQkJTU1fRVJSKCJBQ0RCPT4gRmFpbGVkIHRvIHNlbmQgXAotCQkJCQkJCU5TIGRhdGEgdG8gcHJlcHJvY1xuIik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR2YWwgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS0tTlMgVHggXAotCQkJCQkJY29weV9mcm9tX3VzZXIgRmFpbFxuIik7Ci0JCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS1OUyBUWFwKLQkJCQkJa2FsbG9jIEZhaWxlZCBMRU5cbiIpOwotCQkJfQotCQl9Ci0JCWlmIChwcmVwcm9jX25zICE9IE5VTEwpCi0JCQlrZnJlZShwcmVwcm9jX25zKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFJFUFJPQ19DTURfQ0ZHX0lJUl9UVU5JTkdfRklMVEVSX1BBUkFNUzoKLQl7Ci0KLQkJcHJlcHJvY19paXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgXAotCQkJCWF1ZHByZXByb2NfY21kX2NmZ19paXJfdHVuaW5nX2ZpbHRlcl9wYXJhbXMpLFwKLQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKChzaXplb2Yoc3RydWN0IFwKLQkJCWF1ZHByZXByb2NfY21kX2NmZ19paXJfdHVuaW5nX2ZpbHRlcl9wYXJhbXMpLVwKLQkJCSgyICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkpCi0JCQk8IHdyaXRlY291bnQpIHsKLQkJCU1NX0VSUigiQUNEQiBEQVRBIFdSSVRFIC0tSUlSIFRYIHdyaXRlY291bnRcCi0JCQkJCQk+IERTUCBzdHJ1Y3RcbiIpOwotCQl9IGVsc2UgewotCQkJaWYgKHByZXByb2NfaWlyICE9IE5VTEwpIHsKLQkJCQljaGFyICpiYXNlOyB1bnNpZ25lZCBzaG9ydCBvZmZzZXQ7Ci0JCQkJdW5zaWduZWQgc2hvcnQgKm9mZnNldF9hZGRyOwotCQkJCWJhc2UgPSAoY2hhciAqKXByZXByb2NfaWlyOwotCQkJCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBcCi0JCQkJYXVkcHJlcHJvY19jbWRfY2ZnX2lpcl90dW5pbmdfZmlsdGVyX3BhcmFtcyxcCi0JCQkJYWN0aXZlX2ZsYWcpOwotCQkJCW9mZnNldF9hZGRyID0gKHVuc2lnbmVkIHNob3J0ICopKGJhc2UgKyBcCi0JCQkJCQlvZmZzZXQpOwotCQkJCWlmICgoY29weV9mcm9tX3VzZXIob2Zmc2V0X2FkZHIsXAotCQkJCQkodm9pZCAqKXVidWYsIHdyaXRlY291bnQpKSA9PSAweDAwKSB7Ci0JCQkJCXByZXByb2NfaWlyLT5jbWRfaWQgPSBpaXJjbWRpZDsKLQkJCQkJcHJlcHJvY19paXItPnN0cmVhbV9pZCA9Ci0JCQkJCQlhY2RiX2RhdGEucHJlcHJvY19zdHJlYW1faWQ7Ci0JCQkJCXJlc3VsdCA9IGF1ZHByZXByb2NfZHNwX3NldF9paXIoXAotCQkJCQkJCXByZXByb2NfaWlyLAotCQkJCQkJCWlpcmNtZHNpemUpOwotCQkJCQlpZiAocmVzdWx0KSB7Ci0JCQkJCQlNTV9FUlIoIkFDREI9PiBGYWlsZWQgdG8gc2VuZFwKLQkJCQkJCUlJUiBkYXRhIHRvIHByZXByb2NcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dmFsID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCU1NX0VSUigiQUNEQiBEQVRBIFdSSVRFIC0tLUlJUiBUeCBcCi0JCQkJCQljb3B5X2Zyb21fdXNlciBGYWlsXG4iKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCU1NX0VSUigiQUNEQiBEQVRBIFdSSVRFIC0tSUlSIFRYIGthbGxvYyBcCi0JCQkJCUZhaWxlZCBMRU5cbiIpOwotCQkgICAgIH0KLQkJfQotCQlpZiAocHJlcHJvY19paXIgIT0gTlVMTCkKLQkJCWtmcmVlKHByZXByb2NfaWlyKTsKLQkJYnJlYWs7Ci0JfQotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgYm9vbCBhY2RiX3NldF9yeF9ydGMoY29uc3QgY2hhciAqdWJ1Ziwgc2l6ZV90IHdyaXRlY291bnQpCi17Ci0KLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3ZvbHBhbiAqdm9scGFuX2NvbmZpZzsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX21iYWRyYyAqbWJhZHJjX2NvbmZpZzsKLQlzdHJ1Y3QgYWNkYl9ibG9ja19tYmFkcmNfcnRjICphY2RiX21iYWRyY19ydGM7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19zaWRlY2hhaW4gKnN0Zl9jb25maWc7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19zcGVjdHJhbSAqc3BhX2NvbmZpZzsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyICplcV9jb25maWc7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19wY20gKmlpcl9jb25maWc7Ci0JdW5zaWduZWQgc2hvcnQgdGVtcF9zcGFbMzRdOwotCXN0cnVjdCBydGNfYWNkYl9wbWVtICpydGNfd3JpdGUgPSAmcnRjX2FjZGIucnRjX3dyaXRlOwotCXMzMglyZXN1bHQgPSAwOwotCWJvb2wgcmV0dmFsID0gZmFsc2U7Ci0KLQlzd2l0Y2ggKHJ0Y19hY2RiLnNldF9hYmlkKSB7Ci0JY2FzZSBBVURQUF9DTURfVk9MVU1FX1BBTjoKLQl7Ci0JCXZvbHBhbl9jb25maWcgPSAga21hbGxvYyhzaXplb2Yoc3RydWN0IFwKLQkJCQkJIGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2xwYW4pLFwKLQkJCQkJIEdGUF9LRVJORUwpOwotCQlpZiAoKHNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3ZvbHBhbikgLVwKLQkJCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2NvbW1vbikpCi0JCQk8IHdyaXRlY291bnQpIHsKLQkJCU1NX0VSUigiQUNEQiBEQVRBIFdSSVRFIC0tXAotCQkJCVZvbFBhbiB3cml0ZWNvdW50ID4gRFNQIHN0cnVjdFxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodm9scGFuX2NvbmZpZyAhPSBOVUxMKSB7Ci0JCQkJY2hhciAqYmFzZTsgdW5zaWduZWQgc2hvcnQgb2Zmc2V0OwotCQkJCXVuc2lnbmVkIHNob3J0ICpvZmZzZXRfYWRkcjsKLQkJCQliYXNlID0gKGNoYXIgKil2b2xwYW5fY29uZmlnOwotCQkJCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBcCi0JCQkJCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2xwYW4sXAotCQkJCQl2b2x1bWUpOwotCQkJCW9mZnNldF9hZGRyID0gKHVuc2lnbmVkIHNob3J0ICopKGJhc2Urb2Zmc2V0KTsKLQkJCQlpZiAoKGNvcHlfZnJvbV91c2VyKG9mZnNldF9hZGRyLFwKLQkJCQkJKHZvaWQgKil1YnVmLCB3cml0ZWNvdW50KSkgPT0gMHgwMCkgewotCQkJCQlNTV9FUlIoIkFDREIgUlggV1JJVEUgREFUQTpcCi0JCQkJCQlBVURQUF9DTURfVk9MVU1FX1BBTlxuIik7Ci0JCQkJCXJlc3VsdCA9IGF1ZHBwX3NldF92b2x1bWVfYW5kX3BhbigKLQkJCQkJCWFjZGJfZGF0YS5kZXZpY2VfaW5mby0+ZGV2X2lkLFwKLQkJCQkJCXZvbHBhbl9jb25maWctPnZvbHVtZSwKLQkJCQkJCXZvbHBhbl9jb25maWctPnBhbiwKLQkJCQkJCUNPUFApOwotCQkJCQlpZiAocmVzdWx0KSB7Ci0JCQkJCQlNTV9FUlIoIkFDREI9PiBGYWlsZWQgdG8gXAotCQkJCQkJCXNlbmQgVk9MUEFOIGRhdGEgdG8iCi0JCQkJCQkJIiBwb3N0cHJvY1xuIik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR2YWwgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS0tXAotCQkJCQkJY29weV9mcm9tX3VzZXIgRmFpbFxuIik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlNTV9FUlIoIkFDREIgREFUQSBXUklURSAtLVwKLQkJCQkJVm9sIFBhbiBrYWxsb2MgRmFpbGVkIExFTlxuIik7Ci0JCQl9Ci0JCX0KLQlpZiAodm9scGFuX2NvbmZpZyAhPSBOVUxMKQotCQlrZnJlZSh2b2xwYW5fY29uZmlnKTsKLQlicmVhazsKLQl9Ci0KLQljYXNlIEFVRFBQX0NNRF9JSVJfVFVOSU5HX0ZJTFRFUjoKLQl7Ci0JCWlpcl9jb25maWcgPSAga21hbGxvYyhzaXplb2Yoc3RydWN0IFwKLQkJCQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfcGNtKSxcCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmICgoc2l6ZW9mKHN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfcGNtKSAtXAotCQkJc2l6ZW9mKHN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfY29tbW9uKSkKLQkJCTwgd3JpdGVjb3VudCkgewotCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS1cCi0JCQkJCUlJUiBSWCB3cml0ZWNvdW50ID4gRFNQIHN0cnVjdFxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoaWlyX2NvbmZpZyAhPSBOVUxMKSB7Ci0JCQkJY2hhciAqYmFzZTsgdW5zaWduZWQgc2hvcnQgb2Zmc2V0OwotCQkJCXVuc2lnbmVkIHNob3J0ICpvZmZzZXRfYWRkcjsKLQkJCQliYXNlID0gKGNoYXIgKilpaXJfY29uZmlnOwotCQkJCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBcCi0JCQkJCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19wY20sXAotCQkJCQlhY3RpdmVfZmxhZyk7Ci0JCQkJb2Zmc2V0X2FkZHIgPSAodW5zaWduZWQgc2hvcnQgKikoYmFzZStvZmZzZXQpOwotCQkJCWlmICgoY29weV9mcm9tX3VzZXIob2Zmc2V0X2FkZHIsXAotCQkJCQkodm9pZCAqKXVidWYsIHdyaXRlY291bnQpKSA9PSAweDAwKSB7Ci0KLQkJCQkJaWlyX2NvbmZpZy0+Y29tbW9uLmNtZF9pZCA9Ci0JCQkJCQlBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVM7Ci0JCQkJCWlpcl9jb25maWctPmNvbW1vbi5zdHJlYW0gPQotCQkJCQkJQVVEUFBfQ01EX0NPUFBfU1RSRUFNOwotCQkJCQlpaXJfY29uZmlnLT5jb21tb24uc3RyZWFtX2lkID0gMDsKLQkJCQkJaWlyX2NvbmZpZy0+Y29tbW9uLm9ial9jZmcgPQotCQkJCQkJQVVEUFBfQ01EX09CSjBfVVBEQVRFOwotCQkJCQlpaXJfY29uZmlnLT5jb21tb24uY29tbWFuZF90eXBlID0gMDsKLQkJCQkJTU1fRVJSKCJBQ0RCIFJYIFdSSVRFIERBVEE6XAotCQkJCQlBVURQUF9DTURfSUlSX1RVTklOR19GSUxURVJcbiIpOwotCQkJCQlyZXN1bHQgPSBhdWRwcF9kc3Bfc2V0X3J4X2lpcigKLQkJCQkJCWFjZGJfZGF0YS5kZXZpY2VfaW5mby0+ZGV2X2lkLAotCQkJCQkJaWlyX2NvbmZpZy0+YWN0aXZlX2ZsYWcsXAotCQkJCQkJaWlyX2NvbmZpZywgQ09QUCk7Ci0JCQkJCWlmIChyZXN1bHQpIHsKLQkJCQkJCU1NX0VSUigiQUNEQj0+IEZhaWxlZCB0byBzZW5kXAotCQkJCQkJCUlJUiBkYXRhIHRvXAotCQkJCQkJCXBvc3Rwcm9jXG4iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHZhbCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlNTV9FUlIoIkFDREIgREFUQSBXUklURSAtLS1cCi0JCQkJCQlJSVIgUnggY29weV9mcm9tX3VzZXIgRmFpbFxuIik7Ci0JCQkJICAgICAgfQotCQkJIH0gZWxzZSB7Ci0JCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS1cCi0JCQkJCWFjZGJfaWlyX2Jsb2NrIGthbGxvYyBGYWlsZWQgTEVOXG4iKTsKLQkJCX0KLQkJfQotCQlpZiAoaWlyX2NvbmZpZyAhPSBOVUxMKQotCQkJa2ZyZWUoaWlyX2NvbmZpZyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFBQX0NNRF9FUVVBTElaRVI6Ci0JewotCQllcV9jb25maWcgPSAga21hbGxvYyhzaXplb2Yoc3RydWN0IFwKLQkJCQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfZXFhbGl6ZXIpLFwKLQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoKHNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyKSAtXAotCQkJc2l6ZW9mKHN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfY29tbW9uKSkKLQkJCTwgd3JpdGVjb3VudCkgewotCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS1cCi0JCQlFUSBSWCB3cml0ZWNvdW50ID4gRFNQIHN0cnVjdFxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZXFfY29uZmlnICE9IE5VTEwpIHsKLQkJCQljaGFyICpiYXNlOyB1bnNpZ25lZCBzaG9ydCBvZmZzZXQ7Ci0JCQkJdW5zaWduZWQgc2hvcnQgKm9mZnNldF9hZGRyOwotCQkJCWJhc2UgPSAoY2hhciAqKWVxX2NvbmZpZzsKLQkJCQlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgXAotCQkJCQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfZXFhbGl6ZXIsXAotCQkJCQllcV9mbGFnKTsKLQkJCQlvZmZzZXRfYWRkciA9ICh1bnNpZ25lZCBzaG9ydCAqKShiYXNlK29mZnNldCk7Ci0JCQkJaWYgKChjb3B5X2Zyb21fdXNlcihvZmZzZXRfYWRkcixcCi0JCQkJCSh2b2lkICopdWJ1Ziwgd3JpdGVjb3VudCkpID09IDB4MDApIHsKLQkJCQkJZXFfY29uZmlnLT5jb21tb24uY21kX2lkID0KLQkJCQkJCUFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNUzsKLQkJCQkJZXFfY29uZmlnLT5jb21tb24uc3RyZWFtID0KLQkJCQkJCUFVRFBQX0NNRF9DT1BQX1NUUkVBTTsKLQkJCQkJZXFfY29uZmlnLT5jb21tb24uc3RyZWFtX2lkID0gMDsKLQkJCQkJZXFfY29uZmlnLT5jb21tb24ub2JqX2NmZyA9Ci0JCQkJCQlBVURQUF9DTURfT0JKMF9VUERBVEU7Ci0JCQkJCWVxX2NvbmZpZy0+Y29tbW9uLmNvbW1hbmRfdHlwZSA9IDA7Ci0JCQkJCU1NX0VSUigiQUNEQiBSWCBXUklURVwKLQkJCQkJREFUQTpBVURQUF9DTURfRVFVQUxJWkVSXG4iKTsKLQkJCQkJcmVzdWx0ID0gYXVkcHBfZHNwX3NldF9lcSgKLQkJCQkJCWFjZGJfZGF0YS5kZXZpY2VfaW5mby0+ZGV2X2lkLAotCQkJCQkJZXFfY29uZmlnLT5lcV9mbGFnLFwKLQkJCQkJCWVxX2NvbmZpZywKLQkJCQkJCUNPUFApOwotCQkJCQlpZiAocmVzdWx0KSB7Ci0JCQkJCQlNTV9FUlIoIkFDREI9PiBGYWlsZWQgdG8gXAotCQkJCQkJc2VuZCBFUSBkYXRhIHRvIHBvc3Rwcm9jXG4iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHZhbCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlNTV9FUlIoIkFDREIgREFUQSBXUklURSAtLS1cCi0JCQkJCUVRIFJ4IGNvcHlfZnJvbV91c2VyIEZhaWxcbiIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS1cCi0JCQkJCUVRIGthbGxvYyBGYWlsZWQgTEVOXG4iKTsKLQkJCX0KLQkJfQotCQlpZiAoZXFfY29uZmlnICE9IE5VTEwpCi0JCQlrZnJlZShlcV9jb25maWcpOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIEFVRFBQX0NNRF9TUEVDVFJPR1JBTToKLQl7Ci0JCXNwYV9jb25maWcgPSAga21hbGxvYyhzaXplb2Yoc3RydWN0IFwKLQkJCQlhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfc3BlY3RyYW0pLFwKLQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKChzaXplb2Yoc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19zcGVjdHJhbSktXAotCQkJCXNpemVvZihzdHJ1Y3QgXAotCQkJCWF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19jb21tb24pKQotCQkJCTwgKDIgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKSkgewotCQkJCQlNTV9FUlIoIkFDREIgREFUQSBXUklURSAtLVNQQSBcCi0JCQkJCVJYIHdyaXRlY291bnQgPiBEU1Agc3RydWN0XG4iKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzcGFfY29uZmlnICE9IE5VTEwpIHsKLQkJCQlpZiAoKGNvcHlfZnJvbV91c2VyKCZ0ZW1wX3NwYVswXSxcCi0JCQkJCSh2b2lkICopdWJ1ZiwKLQkJCQkJKDM0ICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkpKQotCQkJCQk9PSAweDAwKSB7Ci0JCQkJCXNwYV9jb25maWctPmNvbW1vbi5jbWRfaWQgPQotCQkJCQkJQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TOwotCQkJCQlzcGFfY29uZmlnLT5jb21tb24uc3RyZWFtID0KLQkJCQkJCUFVRFBQX0NNRF9DT1BQX1NUUkVBTTsKLQkJCQkJc3BhX2NvbmZpZy0+Y29tbW9uLnN0cmVhbV9pZCA9IDA7Ci0JCQkJCXNwYV9jb25maWctPmNvbW1vbi5vYmpfY2ZnID0KLQkJCQkJCUFVRFBQX0NNRF9PQkowX1VQREFURTsKLQkJCQkJc3BhX2NvbmZpZy0+Y29tbW9uLmNvbW1hbmRfdHlwZSA9IDA7Ci0JCQkJCXNwYV9jb25maWctPnNhbXBsZV9pbnRlcnZhbCA9Ci0JCQkJCQl0ZW1wX3NwYVswXTsKLQkJCQkJc3BhX2NvbmZpZy0+bnVtX2NvZWZmID0gdGVtcF9zcGFbMV07Ci0JCQkJCU1NX0VSUigiQUNEQiBSWCBXUklURSBEQVRBOlwKLQkJCQkJCUFVRFBQX0NNRF9TUEVDVFJPR1JBTVxuIik7Ci0JCQkJCXJlc3VsdCA9IGF1ZHBwX2RzcF9zZXRfc3BhKAotCQkJCQkJYWNkYl9kYXRhLmRldmljZV9pbmZvLT5kZXZfaWQsXAotCQkJCQkJc3BhX2NvbmZpZywgQ09QUCk7Ci0JCQkJCWlmIChyZXN1bHQpIHsKLQkJCQkJCU1NX0VSUigiQUNEQj0+IEZhaWxlZCB0byBcCi0JCQkJCQkJc2VuZCBTUEEgZGF0YSBcCi0JCQkJCQkJdG8gcG9zdHByb2NcbiIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dmFsID0gdHJ1ZTsKLQkJCQkJICAgICAgfQotCQkJCX0gZWxzZSB7Ci0JCQkJCU1NX0VSUigiQUNEQiBEQVRBIFdSSVRFIFwKLQkJCQkJLS0tU1BBIFJ4IGNvcHlfZnJvbV91c2VyXAotCQkJCQlGYWlsXG4iKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCU1NX0VSUigiQUNEQiBEQVRBIFdSSVRFIC0tXAotCQkJCVNQQSBrYWxsb2MgRmFpbGVkIExFTlxuIik7Ci0JCQkgICAgICAgfQotCQkJfQotCQlpZiAoc3BhX2NvbmZpZyAhPSBOVUxMKQotCQkJa2ZyZWUoc3BhX2NvbmZpZyk7Ci0JYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFBfQ01EX01CQURSQzoKLQl7Ci0JCWFjZGJfbWJhZHJjX3J0YyA9ICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgXAotCQkJCQlhY2RiX2Jsb2NrX21iYWRyY19ydGMpLFwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCW1iYWRyY19jb25maWcgPSAga21hbGxvYyhzaXplb2Yoc3RydWN0IFwKLQkJCQkJYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX21iYWRyYyksXAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKG1iYWRyY19jb25maWcgIT0gTlVMTCAmJiBhY2RiX21iYWRyY19ydGMgIT0gTlVMTCkgewotCQkJaWYgKChjb3B5X2Zyb21fdXNlcihhY2RiX21iYWRyY19ydGMsXAotCQkJCSh2b2lkICopdWJ1ZiwKLQkJCQlzaXplb2Yoc3RydWN0IGFjZGJfYmxvY2tfbWJhZHJjX3J0YykpKQotCQkJCT09IDB4MDApIHsKLQkJCQltYmFkcmNfY29uZmlnLT5jb21tb24uY21kX2lkID0KLQkJCQkJQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TOwotCQkJCW1iYWRyY19jb25maWctPmNvbW1vbi5zdHJlYW0gPQotCQkJCQlBVURQUF9DTURfQ09QUF9TVFJFQU07Ci0JCQkJbWJhZHJjX2NvbmZpZy0+Y29tbW9uLnN0cmVhbV9pZCA9IDA7Ci0JCQkJbWJhZHJjX2NvbmZpZy0+Y29tbW9uLm9ial9jZmcgPQotCQkJCQlBVURQUF9DTURfT0JKMF9VUERBVEU7Ci0JCQkJbWJhZHJjX2NvbmZpZy0+Y29tbW9uLmNvbW1hbmRfdHlwZSA9IDA7Ci0JCQkJbWJhZHJjX2NvbmZpZy0+ZW5hYmxlID0KLQkJCQkJCWFjZGJfbWJhZHJjX3J0Yy0+ZW5hYmxlOwotCQkJCW1iYWRyY19jb25maWctPm51bV9iYW5kcyA9Ci0JCQkJCQlhY2RiX21iYWRyY19ydGMtPm51bV9iYW5kczsKLQkJCQltYmFkcmNfY29uZmlnLT5kb3duX3NhbXBfbGV2ZWwgPQotCQkJCWFjZGJfbWJhZHJjX3J0Yy0+ZG93bl9zYW1wX2xldmVsOwotCQkJCW1iYWRyY19jb25maWctPmFkcmNfZGVsYXkgPQotCQkJCQlhY2RiX21iYWRyY19ydGMtPmFkcmNfZGVsYXk7Ci0JCQkJbWVtY3B5KG1iYWRyY19jb25maWctPmFkcmNfYmFuZCxcCi0JCQkJCWFjZGJfbWJhZHJjX3J0Yy0+YWRyY19iYW5kLFwKLQkJCQkJQVVEUFBfTUFYX01CQURSQ19CQU5EUyAqXAotCQkJCQlzaXplb2Yoc3RydWN0IGFkcmNfY29uZmlnKSk7Ci0JCQkJaWYgKG1iYWRyY19jb25maWctPm51bV9iYW5kcyA+IDEpIHsKLQkJCQkJbWJhZHJjX2NvbmZpZy0+ZXh0X2J1Zl9zaXplID0KLQkJCQkJCSg5NyAqIDIpICsgKDMzICogMiAqIFwKLQkJCQkJKG1iYWRyY19jb25maWctPm51bV9iYW5kcyAtIDIpKTsKLQkJCQl9Ci0JCQkJbWJhZHJjX2NvbmZpZy0+ZXh0X3BhcnRpdGlvbiA9IDA7Ci0JCQkJbWJhZHJjX2NvbmZpZy0+ZXh0X2J1Zl9sc3cgPQotCQkJCQkodTE2KSBFWFRSQUNUX0xPV19XT1JEKFwKLQkJCQkJCXJ0Y193cml0ZS0+cGh5cyk7Ci0JCQkJbWJhZHJjX2NvbmZpZy0+ZXh0X2J1Zl9tc3cgPQotCQkJCQkodTE2KSBFWFRSQUNUX0hJR0hfV09SRChcCi0JCQkJCQlydGNfd3JpdGUtPnBoeXMpOwotCQkJCW1lbWNweShydGNfd3JpdGUtPnZpcmFkZHIsCi0JCQkJCWFjZGJfbWJhZHJjX3J0Yy0+RXh0QnVmZiwKLQkJCQkJKDE5NipzaXplb2Yoc2lnbmVkIGludCkpKTsKLQkJCQlyZXN1bHQgPSBhdWRwcF9kc3Bfc2V0X21iYWRyYygKLQkJCQkJCWFjZGJfZGF0YS5kZXZpY2VfaW5mby0+ZGV2X2lkLAotCQkJCQkJbWJhZHJjX2NvbmZpZy0+ZW5hYmxlLAotCQkJCQkJbWJhZHJjX2NvbmZpZywgQ09QUCk7Ci0JCQkJaWYgKHJlc3VsdCkgewotCQkJCQlNTV9FUlIoIkFDREI9PiBGYWlsZWQgdG8gXAotCQkJCQkJU2VuZCBNQkFEUkMgZGF0YSBcCi0JCQkJCQl0byBwb3N0cHJvY1xuIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dmFsID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCU1NX0VSUigiQUNEQiBEQVRBIFdSSVRFIC0tLVwKLQkJCQkJTUJBRFJDIFJ4IGNvcHlfZnJvbV91c2VyIEZhaWxcbiIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJBQ0RCIERBVEEgV1JJVEUgLS1NQkFEUkMga2FsbG9jIEZhaWxlZCBMRU5cbiIpOwotCQl9Ci0JCWlmIChtYmFkcmNfY29uZmlnICE9IE5VTEwpCi0JCQlrZnJlZShtYmFkcmNfY29uZmlnKTsKLQkJaWYgKGFjZGJfbWJhZHJjX3J0YyAhPSBOVUxMKQotCQkJa2ZyZWUoYWNkYl9tYmFkcmNfcnRjKTsKLQlicmVhazsKLQl9Ci0JY2FzZSBBVURQUF9DTURfU0lERUNIQUlOX1RVTklOR19GSUxURVI6Ci0JewotCQlzdGZfY29uZmlnID0gIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBcCi0JCQkJYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3NpZGVjaGFpbiksXAotCQkJCUdGUF9LRVJORUwpOwotCQlpZiAoKHNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3NpZGVjaGFpbikgLVwKLQkJCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2NvbW1vbikpCi0JCQk8IHdyaXRlY291bnQpIHsKLQkJCQlNTV9FUlIoIkFDREIgREFUQSBXUklURSAtLVwKLQkJCQkJU1RGIFJYIHdyaXRlY291bnQgPiBEU1Agc3RydWN0XG4iKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzdGZfY29uZmlnICE9IE5VTEwpIHsKLQkJCQljaGFyICpiYXNlOyB1bnNpZ25lZCBzaG9ydCBvZmZzZXQ7Ci0JCQkJdW5zaWduZWQgc2hvcnQgKm9mZnNldF9hZGRyOwotCQkJCWJhc2UgPSAoY2hhciAqKXN0Zl9jb25maWc7Ci0JCQkJb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IFwKLQkJCQkJYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3NpZGVjaGFpbixcCi0JCQkJCWFjdGl2ZV9mbGFnKTsKLQkJCQlvZmZzZXRfYWRkciA9ICh1bnNpZ25lZCBzaG9ydCAqKShiYXNlK29mZnNldCk7Ci0JCQkJaWYgKChjb3B5X2Zyb21fdXNlcihvZmZzZXRfYWRkcixcCi0JCQkJCSh2b2lkICopdWJ1Ziwgd3JpdGVjb3VudCkpID09IDB4MDApIHsKLQkJCQkJc3RmX2NvbmZpZy0+Y29tbW9uLmNtZF9pZCA9Ci0JCQkJCQlBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVM7Ci0JCQkJCXN0Zl9jb25maWctPmNvbW1vbi5zdHJlYW0gPQotCQkJCQkJQVVEUFBfQ01EX0NPUFBfU1RSRUFNOwotCQkJCQlzdGZfY29uZmlnLT5jb21tb24uc3RyZWFtX2lkID0gMDsKLQkJCQkJc3RmX2NvbmZpZy0+Y29tbW9uLm9ial9jZmcgPQotCQkJCQkJQVVEUFBfQ01EX09CSjBfVVBEQVRFOwotCQkJCQlzdGZfY29uZmlnLT5jb21tb24uY29tbWFuZF90eXBlID0gMDsKLQkJCQkJTU1fRVJSKCJBQ0RCIFJYIFdSSVRFIERBVEE6XAotCQkJCQlBVURQUF9DTURfU0lERUNIQUlOX1RVTklOR19GSUxURVJcbiIpOwotCQkJCXJlc3VsdCA9IGF1ZHBwX2RzcF9zZXRfc3RmKAotCQkJCQkJYWNkYl9kYXRhLmRldmljZV9pbmZvLT5kZXZfaWQsXAotCQkJCQkJc3RmX2NvbmZpZy0+YWN0aXZlX2ZsYWcsXAotCQkJCQkJc3RmX2NvbmZpZywgQ09QUCk7Ci0JCQkJCWlmIChyZXN1bHQpIHsKLQkJCQkJCU1NX0VSUigiQUNEQj0+IEZhaWxlZCB0byBzZW5kIFwKLQkJCQkJCVNURiBkYXRhIHRvIHBvc3Rwcm9jXG4iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHZhbCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlNTV9FUlIoIkFDREIgREFUQSBXUklURSAtLS1cCi0JCQkJCVNURiBSeCBjb3B5X2Zyb21fdXNlciBGYWlsXG4iKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCU1NX0VSUigiQUNEQiBEQVRBIFdSSVRFIFwKLQkJCQkJU1RGIGthbGxvYyBGYWlsZWQgTEVOXG4iKTsKLQkJfQotCX0KLQlpZiAoc3RmX2NvbmZpZyAhPSBOVUxMKQotCQlrZnJlZShzdGZfY29uZmlnKTsKLQlicmVhazsKLQl9Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci1zdGF0aWMgc3NpemVfdCBydGNfZ2V0c2V0YWJpZF9kYXRhX2RiZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCQkJCWNvbnN0IGNoYXIgX191c2VyICp1YnVmLAotCQkJCQkJc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQotewotCWlmIChydGNfYWNkYi52YWxpZF9hYmlkICE9IHRydWUpIHsKLQkJTU1fSU5GTygiQUNEQiBEQVRBIFJFQUQgLS0tSU5WQUxJRCBBQklEXG4iKTsKLQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfRVJSX0lOVkFMSURfQUJJRDsKLQl9IGVsc2UgewotCQlpZiAocnRjX2FjZGIudHhfcnhfY3RsID09IEFDREJfUlRDX1JYKSB7Ci0JCQlpZiAoYWNkYl9zZXRfcnhfcnRjKHVidWYsIGNudCkpIHsKLQkJCQlydGNfYWNkYi5lcnIgPSBBQ0RCX1JUQ19TVUNDRVNTOwotCQkJfSBlbHNlIHsKLQkJCXJ0Y19hY2RiLmVyciA9IEFDREJfUlRDX0VSUl9VTktOT1dOX0ZBSUxVUkU7Ci0JCQljbnQgPSAwOwotCQl9Ci0JfSBlbHNlIGlmIChydGNfYWNkYi50eF9yeF9jdGwgPT0gQUNEQl9SVENfVFgpIHsKLQkJaWYgKGFjZGJfc2V0X3R4X3J0Yyh1YnVmLCBjbnQpKSB7Ci0JCQlydGNfYWNkYi5lcnIgPSBBQ0RCX1JUQ19TVUNDRVNTOwotCQl9IGVsc2UgewotCQkJcnRjX2FjZGIuZXJyID0gQUNEQl9SVENfRVJSX1VOS05PV05fRkFJTFVSRTsKLQkJCWNudCA9IDA7Ci0JCX0KLQl9Ci0gIH0KLQlyZXR1cm4gY250OwotfQotCi0KLXN0YXRpYyBjb25zdAlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ0Y19hY2RiX2RhdGFfZGVidWdfZm9wcyA9IHsKLQkub3BlbiA9IHJ0Y19nZXRzZXRhYmlkX2RhdGFfZGJnX29wZW4sCi0JLndyaXRlID0gcnRjX2dldHNldGFiaWRfZGF0YV9kYmdfd3JpdGUsCi0JLnJlYWQgPSBydGNfZ2V0c2V0YWJpZF9kYXRhX2RiZ19yZWFkCi19OwotCi1zdGF0aWMgY29uc3QJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBydGNfYWNkYl9kZWJ1Z19mb3BzID0gewotCS5vcGVuID0gcnRjX2dldHNldGFiaWRfZGJnX29wZW4sCi0JLndyaXRlID0gcnRjX2dldHNldGFiaWRfZGJnX3dyaXRlLAotCS5yZWFkID0gcnRjX2dldHNldGFiaWRfZGJnX3JlYWQKLX07Ci0KLXN0YXRpYyB2b2lkIHJ0Y19hY2RiX2RlaW5pdCh2b2lkKQotewotCXN0cnVjdCBydGNfYWNkYl9wbWVtICpydGNfcmVhZCA9ICZydGNfYWNkYi5ydGNfcmVhZDsKLQlzdHJ1Y3QgcnRjX2FjZGJfcG1lbSAqcnRjX3dyaXRlID0gJnJ0Y19hY2RiLnJ0Y193cml0ZTsKLQlpZiAoZ2V0X3NldF9hYmlkX2RlbnRyeSkgewotCQlNTV9EQkcoIkdldFNldCBBQklEIHJlbW92ZSBkZWJ1Z2ZzXG4iKTsKLQkJZGVidWdmc19yZW1vdmUoZ2V0X3NldF9hYmlkX2RlbnRyeSk7Ci0JfQotCi0JaWYgKGdldF9zZXRfYWJpZF9kYXRhX2RlbnRyeSkgewotCQlNTV9EQkcoIkdldFNldCBBQklEIHJlbW92ZSBkZWJ1Z2ZzXG4iKTsKLQkJZGVidWdmc19yZW1vdmUoZ2V0X3NldF9hYmlkX2RhdGFfZGVudHJ5KTsKLQl9Ci0JcnRjX2FjZGIuYWJpZCA9IDA7Ci0JcnRjX2FjZGIuYWNkYl9pZCA9IDA7Ci0JcnRjX2FjZGIuY21kX2lkID0gMDsKLQlydGNfYWNkYi5lcnIgPSAxOwotCXJ0Y19hY2RiLnNldF9hYmlkID0gMDsKLQlydGNfYWNkYi5zZXRfaWlkID0gMDsKLQlydGNfYWNkYi50eF9yeF9jdGwgPSAwOwotCXJ0Y19hY2RiLnZhbGlkX2FiaWQgPSBmYWxzZTsKLQotCWlmIChydGNfcmVhZC0+dmlyYWRkciAhPSBOVUxMIHx8ICgodm9pZCAqKXJ0Y19yZWFkLT5waHlzKSAhPSBOVUxMKSB7Ci0JCWlvdW5tYXAocnRjX3JlYWQtPm1hcF92X3J0Yyk7Ci0JCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIocnRjX3JlYWQtPnBoeXMpOwotCX0KLQlpZiAocnRjX3dyaXRlLT52aXJhZGRyICE9IE5VTEwgfHwgKCh2b2lkICopcnRjX3dyaXRlLT5waHlzKSAhPSBOVUxMKSB7Ci0JCWlvdW5tYXAocnRjX3dyaXRlLT5tYXBfdl9ydGMpOwotCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKHJ0Y193cml0ZS0+cGh5cyk7Ci0JfQotfQotCi1zdGF0aWMgYm9vbCBydGNfYWNkYl9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHJ0Y19hY2RiX3BtZW0gKnJ0Y19yZWFkID0gJnJ0Y19hY2RiLnJ0Y19yZWFkOwotCXN0cnVjdCBydGNfYWNkYl9wbWVtICpydGNfd3JpdGUgPSAmcnRjX2FjZGIucnRjX3dyaXRlOwotCXMzMiByZXN1bHQgPSAwOwotCWNoYXIgbmFtZVtzaXplb2YgImdldF9zZXRfYWJpZCIrMV07Ci0JY2hhciBuYW1lMVtzaXplb2YgImdldF9zZXRfYWJpZF9kYXRhIisxXTsKLQlydGNfYWNkYi5hYmlkID0gMDsKLQlydGNfYWNkYi5hY2RiX2lkID0gMDsKLQlydGNfYWNkYi5jbWRfaWQgPSAwOwotCXJ0Y19hY2RiLmVyciA9IDE7Ci0JcnRjX2FjZGIuc2V0X2FiaWQgPSAwOwotCXJ0Y19hY2RiLnNldF9paWQgPSAwOwotCXJ0Y19hY2RiLnZhbGlkX2FiaWQgPSBmYWxzZTsKLQlydGNfYWNkYi50eF9yeF9jdGwgPSAwOwotCWlmIChhY2RiX2RhdGEuYnVpbGRfaWRbMTddID09ICcxJykgewotCQlzbnByaW50ZihuYW1lLCBzaXplb2YgbmFtZSwgImdldF9zZXRfYWJpZCIpOwotCQlnZXRfc2V0X2FiaWRfZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLAotCQkJCQlTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVR08sCi0JCQkJCU5VTEwsIE5VTEwsICZydGNfYWNkYl9kZWJ1Z19mb3BzKTsKLQkJaWYgKElTX0VSUihnZXRfc2V0X2FiaWRfZGVudHJ5KSkgewotCQkJTU1fRVJSKCJTRVQgR0VUIEFCSUQgZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJc25wcmludGYobmFtZTEsIHNpemVvZiBuYW1lMSwgImdldF9zZXRfYWJpZF9kYXRhIik7Ci0JCWdldF9zZXRfYWJpZF9kYXRhX2RlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZTEsCi0JCQkJCQlTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVR08sCi0JCQkJCQlOVUxMLCBOVUxMLAotCQkJCQkJJnJ0Y19hY2RiX2RhdGFfZGVidWdfZm9wcyk7Ci0JCWlmIChJU19FUlIoZ2V0X3NldF9hYmlkX2RhdGFfZGVudHJ5KSkgewotCQkJTU1fRVJSKCJTRVQgR0VUIEFCSUQgREFUQSIKLQkJCQkJIiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlydGNfcmVhZC0+cGh5cyA9IGFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKFBNRU1fUlRDX0FDREJfUVVFUllfTUVNLAotCQkJCQkJCQkgU1pfNEspOwotCi0JaWYgKCFydGNfcmVhZC0+cGh5cykgewotCQlNTV9FUlIoIkFDREIgQ2Fubm90IGFsbG9jYXRlIHBoeXNpY2FsIG1lbW9yeVxuIik7Ci0JCXJlc3VsdCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXJ0Y19yZWFkLT5tYXBfdl9ydGMgPSBpb3JlbWFwKHJ0Y19yZWFkLT5waHlzLAotCQkJCVBNRU1fUlRDX0FDREJfUVVFUllfTUVNKTsKLQotCWlmIChJU19FUlIocnRjX3JlYWQtPm1hcF92X3J0YykpIHsKLQkJTU1fRVJSKCJBQ0RCIENvdWxkIG5vdCBtYXAgcGh5c2ljYWwgYWRkcmVzc1xuIik7Ci0JCXJlc3VsdCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXJ0Y19yZWFkLT52aXJhZGRyID0gcnRjX3JlYWQtPm1hcF92X3J0YzsKLQltZW1zZXQocnRjX3JlYWQtPnZpcmFkZHIsIDAsIFBNRU1fUlRDX0FDREJfUVVFUllfTUVNKTsKLQotCXJ0Y193cml0ZS0+cGh5cyA9IGFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKFBNRU1fUlRDX0FDREJfUVVFUllfTUVNLAotCQkJCQkJCQlTWl80Syk7Ci0KLQlpZiAoIXJ0Y193cml0ZS0+cGh5cykgewotCQlNTV9FUlIoIkFDREIgQ2Fubm90IGFsbG9jYXRlIHBoeXNpY2FsIG1lbW9yeVxuIik7Ci0JCXJlc3VsdCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXJ0Y193cml0ZS0+bWFwX3ZfcnRjID0gaW9yZW1hcChydGNfd3JpdGUtPnBoeXMsCi0JCQkJUE1FTV9SVENfQUNEQl9RVUVSWV9NRU0pOwotCi0JaWYgKElTX0VSUihydGNfd3JpdGUtPm1hcF92X3J0YykpIHsKLQkJTU1fRVJSKCJBQ0RCIENvdWxkIG5vdCBtYXAgcGh5c2ljYWwgYWRkcmVzc1xuIik7Ci0JCXJlc3VsdCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXJ0Y193cml0ZS0+dmlyYWRkciA9IHJ0Y193cml0ZS0+bWFwX3ZfcnRjOwotCW1lbXNldChydGNfd3JpdGUtPnZpcmFkZHIsIDAsIFBNRU1fUlRDX0FDREJfUVVFUllfTUVNKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZydGNfYWNkYi53YWl0KTsKLQlyZXR1cm4gdHJ1ZTsKLWVycm9yOgotCU1NX0RCRygiSU5JVCBSVEMgRkFJTEVEIFJFTU9WSU5HIFJUQyBERUJVRyBGU1xuIik7Ci0JaWYgKGdldF9zZXRfYWJpZF9kZW50cnkpIHsKLQkJTU1fREJHKCJHZXRTZXQgQUJJRCByZW1vdmUgZGVidWdmc1xuIik7Ci0JCWRlYnVnZnNfcmVtb3ZlKGdldF9zZXRfYWJpZF9kZW50cnkpOwotCX0KLQotCWlmIChnZXRfc2V0X2FiaWRfZGF0YV9kZW50cnkpIHsKLQkJTU1fREJHKCJHZXRTZXQgQUJJRCByZW1vdmUgZGVidWdmc1xuIik7Ci0JCWRlYnVnZnNfcmVtb3ZlKGdldF9zZXRfYWJpZF9kYXRhX2RlbnRyeSk7Ci0JfQotCWlmIChydGNfcmVhZC0+dmlyYWRkciAhPSBOVUxMIHx8ICgodm9pZCAqKXJ0Y19yZWFkLT5waHlzKSAhPSBOVUxMKSB7Ci0JCWlvdW5tYXAocnRjX3JlYWQtPm1hcF92X3J0Yyk7Ci0JCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIocnRjX3JlYWQtPnBoeXMpOwotCX0KLQlpZiAocnRjX3dyaXRlLT52aXJhZGRyICE9IE5VTEwgfHwgKCh2b2lkICopcnRjX3dyaXRlLT5waHlzKSAhPSBOVUxMKSB7Ci0JCWlvdW5tYXAocnRjX3dyaXRlLT5tYXBfdl9ydGMpOwotCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKHJ0Y193cml0ZS0+cGh5cyk7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLSNlbmRpZiAvKkNPTkZJR19ERUJVR19GUyovCi1zdGF0aWMgczMyIGFjZGJfc2V0X2NhbGlicmF0aW9uX2Jsayh1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYWNkYl9jbWRfZGV2aWNlIGFjZGJfY21kOwotCXMzMiByZXN1bHQgPSAwOwotCi0JTU1fREJHKCJhY2RiX3NldF9jYWxpYnJhdGlvbl9ibGtcbiIpOwotCWlmIChjb3B5X2Zyb21fdXNlcigmYWNkYl9jbWQsIChzdHJ1Y3QgYWNkYl9jbWRfZGV2aWNlICopYXJnLAotCQkJc2l6ZW9mKGFjZGJfY21kKSkpIHsKLQkJTU1fRVJSKCJGYWlsZWQgY29weSBjb21tYW5kIHN0cnVjdCBmcm9tIHVzZXIgaW4iCi0JCQkiYWNkYl9zZXRfY2FsaWJyYXRpb25fYmxrXG4iKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCWFjZGJfY21kLnBoeXNfYnVmID0gKHUzMiAqKWFjZGJfZGF0YS5wYWRkcjsKLQotCU1NX0RCRygiYWNkYl9jbWQucGh5c19idWYgJXhcbiIsICh1MzIpYWNkYl9jbWQucGh5c19idWYpOwotCi0JcmVzdWx0ID0gZGFscnBjX2Zjbl84KEFDREJfRGFsQUNEQl9pb2N0bCwgYWNkYl9kYXRhLmhhbmRsZSwKLQkJCShjb25zdCB2b2lkICopJmFjZGJfY21kLCBzaXplb2YoYWNkYl9jbWQpLAotCQkJJmFjZGJfZGF0YS5hY2RiX3Jlc3VsdCwKLQkJCXNpemVvZihhY2RiX2RhdGEuYWNkYl9yZXN1bHQpKTsKLQotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCU1NX0VSUigiQUNEQj0+IERldmljZSBTZXQgUlBDIGZhaWx1cmUiCi0JCQkiIHJlc3VsdCA9ICVkXG4iLCByZXN1bHQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9IGVsc2UgewotCQlNTV9FUlIoIkFDREI9PiBEZXZpY2UgU2V0IFJQQyBzdWNjZXNzXG4iKTsKLQkJaWYgKGFjZGJfZGF0YS5hY2RiX3Jlc3VsdC5yZXN1bHQgPT0gQUNEQl9SRVNfU1VDQ0VTUykKLQkJCU1NX0RCRygiQUNEQl9TRVRfREVWSUNFIFN1Y2Nlc3NcbiIpOwotCQllbHNlIGlmIChhY2RiX2RhdGEuYWNkYl9yZXN1bHQucmVzdWx0ID09IEFDREJfUkVTX0ZBSUxVUkUpCi0JCQlNTV9FUlIoIkFDREJfU0VUX0RFVklDRSBGYWlsdXJlXG4iKTsKLQkJZWxzZSBpZiAoYWNkYl9kYXRhLmFjZGJfcmVzdWx0LnJlc3VsdCA9PSBBQ0RCX1JFU19CQURQQVJNKQotCQkJTU1fRVJSKCJBQ0RCX1NFVF9ERVZJQ0UgQmFkUGFyYW1zXG4iKTsKLQkJZWxzZQotCQkJTU1fRVJSKCJVbmtub3duIGVycm9yXG4iKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHMzMiBhY2RiX2dldF9jYWxpYnJhdGlvbl9ibGsodW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JczMyIHJlc3VsdCA9IDA7Ci0Jc3RydWN0IGFjZGJfY21kX2RldmljZSBhY2RiX2NtZDsKLQotCU1NX0RCRygiYWNkYl9nZXRfY2FsaWJyYXRpb25fYmxrXG4iKTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYWNkYl9jbWQsIChzdHJ1Y3QgYWNkYl9jbWRfZGV2aWNlICopYXJnLAotCQkJc2l6ZW9mKGFjZGJfY21kKSkpIHsKLQkJTU1fRVJSKCJGYWlsZWQgY29weSBjb21tYW5kIHN0cnVjdCBmcm9tIHVzZXIgaW4iCi0JCQkiYWNkYl9nZXRfY2FsaWJyYXRpb25fYmxrXG4iKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCWFjZGJfY21kLnBoeXNfYnVmID0gKHUzMiAqKWFjZGJfZGF0YS5wYWRkcjsKLQlNTV9FUlIoImFjZGJfY21kLnBoeXNfYnVmICV4XG4iLCAodTMyKWFjZGJfY21kLnBoeXNfYnVmKTsKLQotCXJlc3VsdCA9IGRhbHJwY19mY25fOChBQ0RCX0RhbEFDREJfaW9jdGwsIGFjZGJfZGF0YS5oYW5kbGUsCi0JCQkoY29uc3Qgdm9pZCAqKSZhY2RiX2NtZCwgc2l6ZW9mKGFjZGJfY21kKSwKLQkJCSZhY2RiX2RhdGEuYWNkYl9yZXN1bHQsCi0JCQlzaXplb2YoYWNkYl9kYXRhLmFjZGJfcmVzdWx0KSk7Ci0KLQlpZiAocmVzdWx0IDwgMCkgewotCQlNTV9FUlIoIkFDREI9PiBEZXZpY2UgR2V0IFJQQyBmYWlsdXJlIgotCQkJIiByZXN1bHQgPSAlZFxuIiwgcmVzdWx0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJTU1fRVJSKCJBQ0RCPT4gRGV2aWNlIEdldCBSUEMgU3VjY2Vzc1xuIik7Ci0JCWlmIChhY2RiX2RhdGEuYWNkYl9yZXN1bHQucmVzdWx0ID09IEFDREJfUkVTX1NVQ0NFU1MpCi0JCQlNTV9EQkcoIkFDREJfR0VUX0RFVklDRSBTdWNjZXNzXG4iKTsKLQkJZWxzZSBpZiAoYWNkYl9kYXRhLmFjZGJfcmVzdWx0LnJlc3VsdCA9PSBBQ0RCX1JFU19GQUlMVVJFKQotCQkJTU1fRVJSKCJBQ0RCX0dFVF9ERVZJQ0UgRmFpbHVyZVxuIik7Ci0JCWVsc2UgaWYgKGFjZGJfZGF0YS5hY2RiX3Jlc3VsdC5yZXN1bHQgPT0gQUNEQl9SRVNfQkFEUEFSTSkKLQkJCU1NX0VSUigiQUNEQl9HRVRfREVWSUNFIEJhZFBhcmFtc1xuIik7Ci0JCWVsc2UKLQkJCU1NX0VSUigiVW5rbm93biBlcnJvclxuIik7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fYWNkYl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCU1NX0RCRygiJXNcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbnQgYXVkaW9fYWNkYl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCU1NX0RCRygiJXNcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgYXVkaW9fYWNkYl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50IHJjID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQotCU1NX0RCRygiJXNcbiIsIF9fZnVuY19fKTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TRVRfRVE6Ci0JCU1NX0RCRygiSU9DVEwgU0VUX0VRX0NPTkZJR1xuIik7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYWNkYl9kYXRhLmVxLm51bV9iYW5kcywgKHZvaWQgKikgYXJnLAotCQkJCXNpemVvZihhY2RiX2RhdGEuZXEpIC0KLQkJCQkoQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TX0NPTU1PTl9MRU4gKyAyKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhY2RiX2RhdGEuZHNwX2xvY2ssIGZsYWdzKTsKLQkJYWNkYl9kYXRhLmRlY19pZCAgICA9IDA7Ci0JCXJjID0gYXVkcHBfZHNwX3NldF9lcShhY2RiX2RhdGEuZGVjX2lkLCAxLAotCQkJJmFjZGJfZGF0YS5lcSwgQ09QUCk7Ci0JCWlmIChyYyA8IDApCi0JCQlNTV9FUlIoIkFVRFBQIHJldHVybmVkIGVyciA9JWRcbiIsIHJjKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNkYl9kYXRhLmRzcF9sb2NrLCBmbGFncyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX0FDREJfQkxLOgotCQlNTV9EQkcoIklPQ1RMIEFVRElPX1NFVF9BQ0RCX0JMS1xuIik7Ci0JCXJjID0gYWNkYl9zZXRfY2FsaWJyYXRpb25fYmxrKGFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fR0VUX0FDREJfQkxLOgotCQlNTV9EQkcoIklPaUNUTCBBVURJT19HRVRfQUNEQl9CTEtcbiIpOwotCQlyYyA9IGFjZGJfZ2V0X2NhbGlicmF0aW9uX2JsayhhcmcpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlNTV9EQkcoIlVua25vd24gSU9DVEwlZFxuIiwgY21kKTsKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjZGJfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IGF1ZGlvX2FjZGJfb3BlbiwKLQkucmVsZWFzZSA9IGF1ZGlvX2FjZGJfcmVsZWFzZSwKLQkubGxzZWVrID0gbm9fbGxzZWVrLAotCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGlvX2FjZGJfaW9jdGwKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIGFjZGJfbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX2FjZGIiLAotCS5mb3BzCT0gJmFjZGJfZm9wcywKLX07Ci0KLXN0YXRpYyBzMzIgYWNkYl9nZXRfY2FsaWJyYXRpb24odm9pZCkKLXsKLQlzdHJ1Y3QgYWNkYl9jbWRfZ2V0X2RldmljZV90YWJsZQlhY2RiX2NtZDsKLQlzMzIJCQkJCXJlc3VsdCA9IDA7Ci0JdTMyIGl0ZXJhdGlvbnMgPSAwOwotCi0JTU1fREJHKCJhY2RiIHN0YXRlID0gJWRcbiIsIGFjZGJfZGF0YS5hY2RiX3N0YXRlKTsKLQotCWFjZGJfY21kLmNvbW1hbmRfaWQgPSBBQ0RCX0dFVF9ERVZJQ0VfVEFCTEU7Ci0JYWNkYl9jbWQuZGV2aWNlX2lkID0gYWNkYl9kYXRhLmRldmljZV9pbmZvLT5hY2RiX2lkOwotCWFjZGJfY21kLm5ldHdvcmtfaWQgPSAweDAxMDhCMTUzOwotCWFjZGJfY21kLnNhbXBsZV9yYXRlX2lkID0gYWNkYl9kYXRhLmRldmljZV9pbmZvLT5zYW1wbGVfcmF0ZTsKLQlhY2RiX2NtZC50b3RhbF9ieXRlcyA9IEFDREJfQlVGX1NJWkU7Ci0JYWNkYl9jbWQucGh5c19idWYgPSAodTMyICopYWNkYl9kYXRhLnBoeXNfYWRkcjsKLQlNTV9EQkcoImRldmljZV9pZCA9ICVkLCBzYW1wbGluZ19mcmVxID0gJWRcbiIsCi0JCQkJYWNkYl9jbWQuZGV2aWNlX2lkLCBhY2RiX2NtZC5zYW1wbGVfcmF0ZV9pZCk7Ci0KLQlkbyB7Ci0JCXJlc3VsdCA9IGRhbHJwY19mY25fOChBQ0RCX0RhbEFDREJfaW9jdGwsIGFjZGJfZGF0YS5oYW5kbGUsCi0JCQkJKGNvbnN0IHZvaWQgKikmYWNkYl9jbWQsIHNpemVvZihhY2RiX2NtZCksCi0JCQkJJmFjZGJfZGF0YS5hY2RiX3Jlc3VsdCwKLQkJCQlzaXplb2YoYWNkYl9kYXRhLmFjZGJfcmVzdWx0KSk7Ci0KLQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCU1NX0VSUigiQUNEQj0+IERldmljZSB0YWJsZSBSUEMgZmFpbHVyZSIKLQkJCQkiIHJlc3VsdCA9ICVkXG4iLCByZXN1bHQpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQkvKmZvbGxvd2luZyBjaGVjayBpcyBpbnRyb2R1Y2VkIHRvIGhhbmRsZSBib290IHVwIHJhY2UKLQkJY29uZGl0aW9uIGJldHdlZW4gQVVEQ0FMIFNXIHBlZXJzIHJ1bm5pbmcgb24gYXBwcwotCQlhbmQgbW9kZW0gKEFDREJfUkVTX0JBRFNUQVRFIGluZGljYXRlcyBtb2RlbSBBVURDQUwgU1cgaXMKLQkJbm90IGluIGluaXRpYWxpemVkIHNhdGUpIHdlIG5lZWQgdG8gcmV0cnkgdG8gZ2V0IEFDREIKLQkJdmFsdWVzKi8KLQkJaWYgKGFjZGJfZGF0YS5hY2RiX3Jlc3VsdC5yZXN1bHQgPT0gQUNEQl9SRVNfQkFEU1RBVEUpIHsKLQkJCW1zbGVlcCg1MDApOwotCQkJaXRlcmF0aW9ucysrOwotCQl9IGVsc2UgaWYgKGFjZGJfZGF0YS5hY2RiX3Jlc3VsdC5yZXN1bHQgPT0gQUNEQl9SRVNfU1VDQ0VTUykgewotCQkJTU1fREJHKCJNb2RlbSBxdWVyeSBmb3IgYWNkYiB2YWx1ZXMgaXMgc3VjY2Vzc2Z1bCIKLQkJCQkJIiAoaXRlcmF0aW9ucyA9ICVkKVxuIiwgaXRlcmF0aW9ucyk7Ci0JCQlhY2RiX2RhdGEuYWNkYl9zdGF0ZSB8PSBDQUxfREFUQV9SRUFEWTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoIkFDREI9PiBtb2RlbSBmYWlsZWQgdG8gZmlsbCBhY2RiIHZhbHVlcywiCi0JCQkJCSIgcmV1c2x0ID0gJWQsIChpdGVyYXRpb25zID0gJWQpXG4iLAotCQkJCQlhY2RiX2RhdGEuYWNkYl9yZXN1bHQucmVzdWx0LAotCQkJCQlpdGVyYXRpb25zKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9IHdoaWxlIChpdGVyYXRpb25zIDwgTUFYX1JFVFJZKTsKLQlNTV9FUlIoIkFDREI9PiBBVURDQUwgU1cgb24gbW9kZW0gaXMgbm90IGluIGludGlhaWxpemVkIHN0YXRlICglZClcbiIsCi0JCQlhY2RiX2RhdGEuYWNkYl9yZXN1bHQucmVzdWx0KTsKLWVycm9yOgotCXJlc3VsdCA9IC1FSU5WQUw7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotczMyIGFjZGJfZ2V0X2NhbGlicmF0aW9uX2RhdGEoc3RydWN0IGFjZGJfZ2V0X2Jsb2NrICpnZXRfYmxvY2spCi17Ci0JczMyIHJlc3VsdCA9IC1FSU5WQUw7Ci0Jc3RydWN0IGFjZGJfY21kX2RldmljZSBhY2RiX2NtZDsKLQlzdHJ1Y3QgYWNkYl9yZXN1bHQgYWNkYl9yZXN1bHQ7Ci0KLQlNTV9EQkcoImFjZGJfZ2V0X2NhbGlicmF0aW9uX2RhdGFcbiIpOwotCi0JYWNkYl9jbWQuY29tbWFuZF9pZCA9IEFDREJfR0VUX0RFVklDRTsKLQlhY2RiX2NtZC5uZXR3b3JrX2lkID0gMHgwMTA4QjE1MzsKLQlhY2RiX2NtZC5kZXZpY2VfaWQgPSBnZXRfYmxvY2stPmFjZGJfaWQ7Ci0JYWNkYl9jbWQuc2FtcGxlX3JhdGVfaWQgPSBnZXRfYmxvY2stPnNhbXBsZV9yYXRlX2lkOwotCWFjZGJfY21kLmludGVyZmFjZV9pZCA9IGdldF9ibG9jay0+aW50ZXJmYWNlX2lkOwotCWFjZGJfY21kLmFsZ29yaXRobV9ibG9ja19pZCA9IGdldF9ibG9jay0+YWxnb3JpdGhtX2Jsb2NrX2lkOwotCWFjZGJfY21kLnRvdGFsX2J5dGVzID0gZ2V0X2Jsb2NrLT50b3RhbF9ieXRlczsKLQlhY2RiX2NtZC5waHlzX2J1ZiA9ICh1MzIgKilhY2RiX2RhdGEuZ2V0X2Jsa19wYWRkcjsKLQotCXJlc3VsdCA9IGRhbHJwY19mY25fOChBQ0RCX0RhbEFDREJfaW9jdGwsIGFjZGJfZGF0YS5oYW5kbGUsCi0JCQkoY29uc3Qgdm9pZCAqKSZhY2RiX2NtZCwgc2l6ZW9mKGFjZGJfY21kKSwKLQkJCSZhY2RiX3Jlc3VsdCwKLQkJCXNpemVvZihhY2RiX3Jlc3VsdCkpOwotCi0JaWYgKHJlc3VsdCA8IDApIHsKLQkJTU1fRVJSKCJBQ0RCPT4gRGV2aWNlIEdldCBSUEMgZmFpbHVyZSIKLQkJCSIgcmVzdWx0ID0gJWRcbiIsIHJlc3VsdCk7Ci0JCWdvdG8gZXJyX3N0YXRlOwotCX0gZWxzZSB7Ci0JCU1NX0RCRygiQUNEQj0+IERldmljZSBHZXQgUlBDIFN1Y2Nlc3NcbiIpOwotCQlpZiAoYWNkYl9yZXN1bHQucmVzdWx0ID09IEFDREJfUkVTX1NVQ0NFU1MpIHsKLQkJCU1NX0RCRygiQUNEQl9HRVRfREVWSUNFIFN1Y2Nlc3NcbiIpOwotCQkJcmVzdWx0ID0gMDsKLQkJCW1lbWNweShnZXRfYmxvY2stPmJ1Zl9wdHIsIGFjZGJfZGF0YS5nZXRfYmxrX2t2YWRkciwKLQkJCQkJZ2V0X2Jsb2NrLT50b3RhbF9ieXRlcyk7Ci0JCX0gZWxzZSBpZiAoYWNkYl9yZXN1bHQucmVzdWx0ID09IEFDREJfUkVTX0ZBSUxVUkUpCi0JCQlNTV9FUlIoIkFDREJfR0VUX0RFVklDRSBGYWlsdXJlXG4iKTsKLQkJZWxzZSBpZiAoYWNkYl9yZXN1bHQucmVzdWx0ID09IEFDREJfUkVTX0JBRFBBUk0pCi0JCQlNTV9FUlIoIkFDREJfR0VUX0RFVklDRSBCYWRQYXJhbXNcbiIpOwotCQllbHNlCi0JCQlNTV9FUlIoIlVua25vd24gZXJyb3JcbiIpOwotCX0KLWVycl9zdGF0ZToKLQlyZXR1cm4gcmVzdWx0OwotfQotRVhQT1JUX1NZTUJPTChhY2RiX2dldF9jYWxpYnJhdGlvbl9kYXRhKTsKLQotc3RhdGljIHU4IGNoZWNrX2RldmljZV9pbmZvX2FscmVhZHlfcHJlc2VudCgKLQkJc3RydWN0IGF1ZGRldl9ldnRfYXVkY2FsX2luZm8gICBhdWRjYWxfaW5mbywKLQkJCXN0cnVjdCBhY2RiX2NhY2hlX25vZGUgKmFjZGJfY2FjaGVfZnJlZV9ub2RlKQotewotCWlmICgoYXVkY2FsX2luZm8uZGV2X2lkID09Ci0JCQkJYWNkYl9jYWNoZV9mcmVlX25vZGUtPmRldmljZV9pbmZvLmRldl9pZCkgJiYKLQkJKGF1ZGNhbF9pbmZvLnNhbXBsZV9yYXRlID09Ci0JCQkJYWNkYl9jYWNoZV9mcmVlX25vZGUtPmRldmljZV9pbmZvLlwKLQkJCQlzYW1wbGVfcmF0ZSkgJiYKLQkJCShhdWRjYWxfaW5mby5hY2RiX2lkID09Ci0JCQkJYWNkYl9jYWNoZV9mcmVlX25vZGUtPmRldmljZV9pbmZvLmFjZGJfaWQpKSB7Ci0JCU1NX0RCRygiYWNkYiB2YWx1ZXMgYXJlIGFscmVhZHkgcHJlc2VudFxuIik7Ci0JCS8qaWYgYWNkYiBzdGF0ZSBpcyBub3Qgc2V0IGZvciBDQUxfREFUQV9SRUFEWSBhbmQgbm9kZSBzdGF0dXMKLQkJaXMgZmlsbGVkLCBhY2RiIHN0YXRlIHNob3VsZCBiZSB1cGRhdGVkIHdpdGggQ0FMX0RBVEFfUkVBRFkKLQkJc3RhdGUqLwotCQlhY2RiX2RhdGEuYWNkYl9zdGF0ZSB8PSBDQUxfREFUQV9SRUFEWTsKLQkJLypjaGVja2luZyBmb3IgY2FjaGUgbm9kZSBzdGF0dXMgaWYgaXQgaXMgbm90IGZpbGxlZCB0aGVuIHRoZQotCQlhY2RiIHZhbHVlcyBhcmUgbm90IGNsZWFuZWQgZnJvbSBub2RlIHNvIHVwZGF0ZSBub2RlIHN0YXR1cwotCQl3aXRoIGFjZGIgdmFsdWUgZmlsbGVkKi8KLQkJaWYgKChhY2RiX2NhY2hlX2ZyZWVfbm9kZS0+bm9kZV9zdGF0dXMgIT0gQUNEQl9WQUxVRVNfRklMTEVEKSAmJgotCQkJKChhdWRjYWxfaW5mby5kZXZfdHlwZSAmIFJYX0RFVklDRSkgPT0gMSkpIHsKLQkJCU1NX0RCRygiZGV2aWNlIHdhcyByZWxlYXNlZCBlYXJsaWVyXG4iKTsKLQkJCWFjZGJfY2FjaGVfZnJlZV9ub2RlLT5ub2RlX3N0YXR1cyA9IEFDREJfVkFMVUVTX0ZJTExFRDsKLQkJCXJldHVybiAyOyAvKm5vZGUgaXMgcHJlc25ldCBidXQgc3RhdHVzIGFzIG5vdCBmaWxsZWQqLwotCQl9Ci0JCXJldHVybiAxOyAvKm5vZGUgaXMgcHJlc2VudCBidXQgc3RhdHVzIGFzIGZpbGxlZCovCi0JfQotCU1NX0RCRygiY29weWluZyBkZXZpY2UgaW5mbyBpbnRvIG5vZGVcbiIpOwotCS8qYXMgZGV2aWNlIGluZm9ybWF0aW9uIGlzIG5vdCBwcmVzZW50IGluIGNhY2hlIGNvcHkKLQl0aGUgY3VycmVudCBkZXZpY2UgaW5mb3JtYXRpb24gaW50byB0aGUgbm9kZSovCi0JbWVtY3B5KCZhY2RiX2NhY2hlX2ZyZWVfbm9kZS0+ZGV2aWNlX2luZm8sCi0JCQkJICZhdWRjYWxfaW5mbywgc2l6ZW9mKGF1ZGNhbF9pbmZvKSk7Ci0JcmV0dXJuIDA7IC8qY2FudCBmaW5kIHRoZSBub2RlKi8KLX0KLQotc3RhdGljIHN0cnVjdCBhY2RiX2lpcl9ibG9jayAqZ2V0X2F1ZHBwX2lycl9ibG9jayh2b2lkKQotewotCXN0cnVjdCBoZWFkZXIgKnByc19oZHI7Ci0JdTMyIGluZGV4ID0gMDsKLQotCXdoaWxlIChpbmRleCA8IGFjZGJfZGF0YS5hY2RiX3Jlc3VsdC51c2VkX2J5dGVzKSB7Ci0JCXByc19oZHIgPSAoc3RydWN0IGhlYWRlciAqKShhY2RiX2RhdGEudmlydF9hZGRyICsgaW5kZXgpOwotCQlpZiAocHJzX2hkci0+ZGJvcl9zaWduYXR1cmUgPT0gREJPUl9TSUdOQVRVUkUpIHsKLQkJCWlmIChwcnNfaGRyLT5hYmlkID09IEFCSURfQVVESU9fSUlSX1JYKSB7Ci0JCQkJaWYgKHByc19oZHItPmlpZCA9PSBJSURfQVVESU9fSUlSX0NPRUZGKQotCQkJCQlyZXR1cm4gKHN0cnVjdCBhY2RiX2lpcl9ibG9jayAqKQotCQkJCQkJKGFjZGJfZGF0YS52aXJ0X2FkZHIgKyBpbmRleAotCQkJCQkJICsgc2l6ZW9mKHN0cnVjdCBoZWFkZXIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gcHJzX2hkci0+ZGF0YV9sZW4gKwotCQkJCQkJc2l6ZW9mKHN0cnVjdCBoZWFkZXIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIHMzMiBhY2RiX2ZpbGxfYXVkcHBfaWlyKHZvaWQpCi17Ci0Jc3RydWN0IGFjZGJfaWlyX2Jsb2NrICphY2RiX2lpcjsKLQlzMzIgaSA9IDA7Ci0KLQlhY2RiX2lpciA9IGdldF9hdWRwcF9pcnJfYmxvY2soKTsKLQlpZiAoYWNkYl9paXIgPT0gTlVMTCkgewotCQlNTV9FUlIoInVuYWJsZSB0byBmaW5kICBhdWRwcCBpaXIgYmxvY2sgcmV0dXJuaW5nXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltZW1zZXQoYWNkYl9kYXRhLnBwX2lpciwgMCwgc2l6ZW9mKCphY2RiX2RhdGEucHBfaWlyKSk7Ci0KLQlhY2RiX2RhdGEucHBfaWlyLT5jb21tb24uY21kX2lkID0gQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TOwotCWFjZGJfZGF0YS5wcF9paXItPmNvbW1vbi5zdHJlYW0gPSBBVURQUF9DTURfQ09QUF9TVFJFQU07Ci0JYWNkYl9kYXRhLnBwX2lpci0+Y29tbW9uLnN0cmVhbV9pZCA9IDA7Ci0JYWNkYl9kYXRhLnBwX2lpci0+Y29tbW9uLm9ial9jZmcgPSBBVURQUF9DTURfT0JKMF9VUERBVEU7Ci0JYWNkYl9kYXRhLnBwX2lpci0+Y29tbW9uLmNvbW1hbmRfdHlwZSA9IDA7Ci0KLQlhY2RiX2RhdGEucHBfaWlyLT5hY3RpdmVfZmxhZyA9IGFjZGJfaWlyLT5lbmFibGVfZmxhZzsKLQlhY2RiX2RhdGEucHBfaWlyLT5udW1fYmFuZHMgPSBhY2RiX2lpci0+c3RhZ2VfY291bnQ7Ci0JZm9yICg7IGkgPCBhY2RiX2lpci0+c3RhZ2VfY291bnQ7IGkrKykgewotCQlhY2RiX2RhdGEucHBfaWlyLT5wYXJhbXNfZmlsdGVyLmZpbHRlcl80X3BhcmFtcy4KLQkJCW51bWVyYXRvcl9maWx0ZXJbaV0ubnVtZXJhdG9yX2IwX2ZpbHRlcl9sc3cgPQotCQkJYWNkYl9paXItPnN0YWdlc1tpXS5iMF9sbzsKLQkJYWNkYl9kYXRhLnBwX2lpci0+cGFyYW1zX2ZpbHRlci5maWx0ZXJfNF9wYXJhbXMuCi0JCQludW1lcmF0b3JfZmlsdGVyW2ldLm51bWVyYXRvcl9iMF9maWx0ZXJfbXN3ID0KLQkJCWFjZGJfaWlyLT5zdGFnZXNbaV0uYjBfaGk7Ci0JCWFjZGJfZGF0YS5wcF9paXItPnBhcmFtc19maWx0ZXIuZmlsdGVyXzRfcGFyYW1zLgotCQkJbnVtZXJhdG9yX2ZpbHRlcltpXS5udW1lcmF0b3JfYjFfZmlsdGVyX2xzdyA9Ci0JCQlhY2RiX2lpci0+c3RhZ2VzW2ldLmIxX2xvOwotCQlhY2RiX2RhdGEucHBfaWlyLT5wYXJhbXNfZmlsdGVyLmZpbHRlcl80X3BhcmFtcy4KLQkJCW51bWVyYXRvcl9maWx0ZXJbaV0ubnVtZXJhdG9yX2IxX2ZpbHRlcl9tc3cgPQotCQkJYWNkYl9paXItPnN0YWdlc1tpXS5iMV9oaTsKLQkJYWNkYl9kYXRhLnBwX2lpci0+cGFyYW1zX2ZpbHRlci5maWx0ZXJfNF9wYXJhbXMuCi0JCQludW1lcmF0b3JfZmlsdGVyW2ldLm51bWVyYXRvcl9iMl9maWx0ZXJfbHN3ID0KLQkJCWFjZGJfaWlyLT5zdGFnZXNbaV0uYjJfbG87Ci0JCWFjZGJfZGF0YS5wcF9paXItPnBhcmFtc19maWx0ZXIuZmlsdGVyXzRfcGFyYW1zLgotCQkJbnVtZXJhdG9yX2ZpbHRlcltpXS5udW1lcmF0b3JfYjJfZmlsdGVyX21zdyA9Ci0JCQlhY2RiX2lpci0+c3RhZ2VzW2ldLmIyX2hpOwotCQlhY2RiX2RhdGEucHBfaWlyLT5wYXJhbXNfZmlsdGVyLmZpbHRlcl80X3BhcmFtcy4KLQkJCWRlbm9taW5hdG9yX2ZpbHRlcltpXS5kZW5vbWluYXRvcl9hMF9maWx0ZXJfbHN3ID0KLQkJCWFjZGJfaWlyLT5zdGFnZXNfYVtpXS5hMV9sbzsKLQkJYWNkYl9kYXRhLnBwX2lpci0+cGFyYW1zX2ZpbHRlci5maWx0ZXJfNF9wYXJhbXMuCi0JCQlkZW5vbWluYXRvcl9maWx0ZXJbaV0uZGVub21pbmF0b3JfYTBfZmlsdGVyX21zdyA9Ci0JCQlhY2RiX2lpci0+c3RhZ2VzX2FbaV0uYTFfaGk7Ci0JCWFjZGJfZGF0YS5wcF9paXItPnBhcmFtc19maWx0ZXIuZmlsdGVyXzRfcGFyYW1zLgotCQkJZGVub21pbmF0b3JfZmlsdGVyW2ldLmRlbm9taW5hdG9yX2ExX2ZpbHRlcl9sc3cgPQotCQkJYWNkYl9paXItPnN0YWdlc19hW2ldLmEyX2xvOwotCQlhY2RiX2RhdGEucHBfaWlyLT5wYXJhbXNfZmlsdGVyLmZpbHRlcl80X3BhcmFtcy4KLQkJCWRlbm9taW5hdG9yX2ZpbHRlcltpXS5kZW5vbWluYXRvcl9hMV9maWx0ZXJfbXN3ID0KLQkJCWFjZGJfaWlyLT5zdGFnZXNfYVtpXS5hMl9oaTsKLQkJYWNkYl9kYXRhLnBwX2lpci0+cGFyYW1zX2ZpbHRlci5maWx0ZXJfNF9wYXJhbXMuCi0JCQlzaGlmdF9mYWN0b3JfZmlsdGVyW2ldLnNoaWZ0X2ZhY3Rvcl8wID0KLQkJCWFjZGJfaWlyLT5zaGlmdF9mYWN0b3JbaV07Ci0JCWFjZGJfZGF0YS5wcF9paXItPnBhcmFtc19maWx0ZXIuZmlsdGVyXzRfcGFyYW1zLnBhbl9maWx0ZXJbaV0uCi0JCQlwYW5fZmlsdGVyXzAgPSBhY2RiX2lpci0+cGFuW2ldOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZXh0cmFjdF9tYmFkcmModTMyICpwaHlfYWRkciwgc3RydWN0IGhlYWRlciAqcHJzX2hkciwgdTMyICppbmRleCkKLXsKLQlpZiAocHJzX2hkci0+aWlkID09IElJRF9NQkFEUkNfRVhUX0JVRkYpIHsKLQkJTU1fREJHKCJHb3QgSUlEID0gSUlEX01CQURSQ19FWFRfQlVGRlxuIik7Ci0JCSpwaHlfYWRkciA9IGFjZGJfZGF0YS5waHlzX2FkZHIJKyAqaW5kZXggKwotCQkJCQlzaXplb2Yoc3RydWN0IGhlYWRlcik7Ci0JCW1lbWNweShhY2RiX2RhdGEubWJhZHJjX2Jsb2NrLmV4dF9idWYsCi0JCQkJKGFjZGJfZGF0YS52aXJ0X2FkZHIgKyAqaW5kZXggKwotCQkJCQlzaXplb2Yoc3RydWN0IGhlYWRlcikpLCAxOTYqMik7Ci0JCU1NX0RCRygicGh5X2FkZHIgPSAleFxuIiwgKnBoeV9hZGRyKTsKLQkJKmluZGV4ICs9IHByc19oZHItPmRhdGFfbGVuICsgc2l6ZW9mKHN0cnVjdCBoZWFkZXIpOwotCX0gZWxzZSBpZiAocHJzX2hkci0+aWlkID09IElJRF9NQkFEUkNfQkFORF9DT05GSUcpIHsKLQkJTU1fREJHKCJHb3QgSUlEID09IElJRF9NQkFEUkNfQkFORF9DT05GSUdcbiIpOwotCQltZW1jcHkoYWNkYl9kYXRhLm1iYWRyY19ibG9jay5iYW5kX2NvbmZpZywgKGFjZGJfZGF0YS52aXJ0X2FkZHIKLQkJCQkJKyAqaW5kZXggKyBzaXplb2Yoc3RydWN0IGhlYWRlcikpLAotCQkJCXNpemVvZihzdHJ1Y3QgbWJhZHJjX2JhbmRfY29uZmlnX3R5cGUpICoKLQkJCQkJIGFjZGJfZGF0YS5tYmFkcmNfYmxvY2sucGFyYW1ldGVycy5cCi0JCQkJCQltYmFkcmNfbnVtX2JhbmRzKTsKLQkJKmluZGV4ICs9IHByc19oZHItPmRhdGFfbGVuICsgc2l6ZW9mKHN0cnVjdCBoZWFkZXIpOwotCX0gZWxzZSBpZiAocHJzX2hkci0+aWlkID09IElJRF9NQkFEUkNfUEFSQU1FVEVSUykgewotCQlzdHJ1Y3QgbWJhZHJjX3BhcmFtZXRlciAqdG1wOwotCQl0bXAgPSAoc3RydWN0IG1iYWRyY19wYXJhbWV0ZXIgKikoYWNkYl9kYXRhLnZpcnRfYWRkciArICppbmRleAotCQkJCQkJKyBzaXplb2Yoc3RydWN0IGhlYWRlcikpOwotCQlNTV9EQkcoIkdvdCBJSUQgPT0gSUlEX01CQURSQ19QQVJBTUVURVJTXG4iKTsKLQkJYWNkYl9kYXRhLm1iYWRyY19ibG9jay5wYXJhbWV0ZXJzLm1iYWRyY19lbmFibGUgPQotCQkJCQkJCXRtcC0+bWJhZHJjX2VuYWJsZTsKLQkJYWNkYl9kYXRhLm1iYWRyY19ibG9jay5wYXJhbWV0ZXJzLm1iYWRyY19udW1fYmFuZHMgPQotCQkJCQkJCXRtcC0+bWJhZHJjX251bV9iYW5kczsKLQkJYWNkYl9kYXRhLm1iYWRyY19ibG9jay5wYXJhbWV0ZXJzLm1iYWRyY19kb3duX3NhbXBsZV9sZXZlbCA9Ci0JCQkJCQl0bXAtPm1iYWRyY19kb3duX3NhbXBsZV9sZXZlbDsKLQkJYWNkYl9kYXRhLm1iYWRyY19ibG9jay5wYXJhbWV0ZXJzLm1iYWRyY19kZWxheSA9Ci0JCQkJCQkJdG1wLT5tYmFkcmNfZGVsYXk7Ci0JCSppbmRleCArPSBwcnNfaGRyLT5kYXRhX2xlbiArIHNpemVvZihzdHJ1Y3QgaGVhZGVyKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGdldF9hdWRwcF9tYmFkcmNfYmxvY2sodTMyICpwaHlfYWRkcikKLXsKLQlzdHJ1Y3QgaGVhZGVyICpwcnNfaGRyOwotCXUzMiBpbmRleCA9IDA7Ci0KLQl3aGlsZSAoaW5kZXggPCBhY2RiX2RhdGEuYWNkYl9yZXN1bHQudXNlZF9ieXRlcykgewotCQlwcnNfaGRyID0gKHN0cnVjdCBoZWFkZXIgKikoYWNkYl9kYXRhLnZpcnRfYWRkciArIGluZGV4KTsKLQotCQlpZiAocHJzX2hkci0+ZGJvcl9zaWduYXR1cmUgPT0gREJPUl9TSUdOQVRVUkUpIHsKLQkJCWlmIChwcnNfaGRyLT5hYmlkID09IEFCSURfQVVESU9fTUJBRFJDX1JYKSB7Ci0JCQkJaWYgKChwcnNfaGRyLT5paWQgPT0gSUlEX01CQURSQ19FWFRfQlVGRikKLQkJCQkJfHwgKHByc19oZHItPmlpZCA9PQotCQkJCQkJSUlEX01CQURSQ19CQU5EX0NPTkZJRykKLQkJCQkJfHwgKHByc19oZHItPmlpZCA9PQotCQkJCQkJSUlEX01CQURSQ19QQVJBTUVURVJTKSkgewotCQkJCQlleHRyYWN0X21iYWRyYyhwaHlfYWRkciwgcHJzX2hkciwKLQkJCQkJCQkJJmluZGV4KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ICs9IHByc19oZHItPmRhdGFfbGVuICsKLQkJCQkJCXNpemVvZihzdHJ1Y3QgaGVhZGVyKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgczMyIGFjZGJfZmlsbF9hdWRwcF9tYmFkcmModm9pZCkKLXsKLQl1MzIgbWJhZHJjX3BoeXNfYWRkciA9IC0xOwotCWdldF9hdWRwcF9tYmFkcmNfYmxvY2soJm1iYWRyY19waHlzX2FkZHIpOwotCWlmIChJU19FUlJfVkFMVUUobWJhZHJjX3BoeXNfYWRkcikpIHsKLQkJTU1fRVJSKCJmYWlsZWQgdG8gZ2V0IG1iYWRyYyBibG9ja1xuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQltZW1zZXQoYWNkYl9kYXRhLnBwX21iYWRyYywgMCwgc2l6ZW9mKCphY2RiX2RhdGEucHBfbWJhZHJjKSk7Ci0KLQlhY2RiX2RhdGEucHBfbWJhZHJjLT5jb21tb24uY21kX2lkID0gQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TOwotCWFjZGJfZGF0YS5wcF9tYmFkcmMtPmNvbW1vbi5zdHJlYW0gPSBBVURQUF9DTURfQ09QUF9TVFJFQU07Ci0JYWNkYl9kYXRhLnBwX21iYWRyYy0+Y29tbW9uLnN0cmVhbV9pZCA9IDA7Ci0JYWNkYl9kYXRhLnBwX21iYWRyYy0+Y29tbW9uLm9ial9jZmcgPSBBVURQUF9DTURfT0JKMF9VUERBVEU7Ci0JYWNkYl9kYXRhLnBwX21iYWRyYy0+Y29tbW9uLmNvbW1hbmRfdHlwZSA9IDA7Ci0KLQlhY2RiX2RhdGEucHBfbWJhZHJjLT5lbmFibGUgPSBhY2RiX2RhdGEubWJhZHJjX2Jsb2NrLlwKLQkJCQkJcGFyYW1ldGVycy5tYmFkcmNfZW5hYmxlOwotCWFjZGJfZGF0YS5wcF9tYmFkcmMtPm51bV9iYW5kcyA9Ci0JCQkJYWNkYl9kYXRhLm1iYWRyY19ibG9jay5cCi0JCQkJCXBhcmFtZXRlcnMubWJhZHJjX251bV9iYW5kczsKLQlhY2RiX2RhdGEucHBfbWJhZHJjLT5kb3duX3NhbXBfbGV2ZWwgPQotCQkJCWFjZGJfZGF0YS5tYmFkcmNfYmxvY2sucGFyYW1ldGVycy5cCi0JCQkJCW1iYWRyY19kb3duX3NhbXBsZV9sZXZlbDsKLQlhY2RiX2RhdGEucHBfbWJhZHJjLT5hZHJjX2RlbGF5ID0KLQkJCQlhY2RiX2RhdGEubWJhZHJjX2Jsb2NrLnBhcmFtZXRlcnMuXAotCQkJCQltYmFkcmNfZGVsYXk7Ci0KLQlpZiAoYWNkYl9kYXRhLm1iYWRyY19ibG9jay5wYXJhbWV0ZXJzLm1iYWRyY19udW1fYmFuZHMgPiAxKQotCQlhY2RiX2RhdGEucHBfbWJhZHJjLT5leHRfYnVmX3NpemUgPSAoOTcgKiAyKSArCi0JCQkoMzMgKiAyICogKGFjZGJfZGF0YS5tYmFkcmNfYmxvY2sucGFyYW1ldGVycy5cCi0JCQkJCW1iYWRyY19udW1fYmFuZHMgLSAyKSk7Ci0KLQlhY2RiX2RhdGEucHBfbWJhZHJjLT5leHRfcGFydGl0aW9uID0gMDsKLQlhY2RiX2RhdGEucHBfbWJhZHJjLT5leHRfYnVmX2xzdyA9ICh1MTYpKG1iYWRyY19waHlzX2FkZHJcCi0JCQkJCQkgJiAweEZGRkYpOwotCWFjZGJfZGF0YS5wcF9tYmFkcmMtPmV4dF9idWZfbXN3ID0gKHUxNikoKG1iYWRyY19waHlzX2FkZHJcCi0JCQkJCQkgJiAweEZGRkYwMDAwKSA+PiAxNik7Ci0JbWVtY3B5KGFjZGJfZGF0YS5wcF9tYmFkcmMtPmFkcmNfYmFuZCwgYWNkYl9kYXRhLm1iYWRyY19ibG9jay5cCi0JCQkJCWJhbmRfY29uZmlnLAotCQlzaXplb2Yoc3RydWN0IG1iYWRyY19iYW5kX2NvbmZpZ190eXBlKSAqCi0JCWFjZGJfZGF0YS5tYmFkcmNfYmxvY2sucGFyYW1ldGVycy5tYmFkcmNfbnVtX2JhbmRzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBhY2RiX2NhbGliX2dhaW5fcnggKmdldF9hdWRwcF9jYWxfZ2Fpbih2b2lkKQotewotCXN0cnVjdCBoZWFkZXIgKnByc19oZHI7Ci0JdTMyIGluZGV4ID0gMDsKLQotCXdoaWxlIChpbmRleCA8IGFjZGJfZGF0YS5hY2RiX3Jlc3VsdC51c2VkX2J5dGVzKSB7Ci0JCXByc19oZHIgPSAoc3RydWN0IGhlYWRlciAqKShhY2RiX2RhdGEudmlydF9hZGRyICsgaW5kZXgpOwotCQlpZiAocHJzX2hkci0+ZGJvcl9zaWduYXR1cmUgPT0gREJPUl9TSUdOQVRVUkUpIHsKLQkJCWlmIChwcnNfaGRyLT5hYmlkID09IEFCSURfQVVESU9fQ0FMSUJSQVRJT05fR0FJTl9SWCkgewotCQkJCWlmIChwcnNfaGRyLT5paWQgPT0KLQkJCQkJSUlEX0FVRElPX0NBTElCUkFUSU9OX0dBSU5fUlgpIHsKLQkJCQkJTU1fREJHKCJHb3QgYXVkcHBfY2FsaWJfZ2Fpbl9yeCIKLQkJCQkJIiBibG9ja1xuIik7Ci0JCQkJCXJldHVybiAoc3RydWN0IGFjZGJfY2FsaWJfZ2Fpbl9yeCAqKQotCQkJCQkJKGFjZGJfZGF0YS52aXJ0X2FkZHIgKyBpbmRleAotCQkJCQkJKyBzaXplb2Yoc3RydWN0IGhlYWRlcikpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gcHJzX2hkci0+ZGF0YV9sZW4gKwotCQkJCQlzaXplb2Yoc3RydWN0IGhlYWRlcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHMzMiBhY2RiX2ZpbGxfYXVkcHBfY2FsX2dhaW4odm9pZCkKLXsKLQlzdHJ1Y3QgYWNkYl9jYWxpYl9nYWluX3J4ICphY2RiX2NhbGliX2dhaW5fcnggPSBOVUxMOwotCi0JYWNkYl9jYWxpYl9nYWluX3J4ID0gZ2V0X2F1ZHBwX2NhbF9nYWluKCk7Ci0JaWYgKGFjZGJfY2FsaWJfZ2Fpbl9yeCA9PSBOVUxMKSB7Ci0JCU1NX0VSUigidW5hYmxlIHRvIGZpbmQgIGF1ZHBwIgotCQkJIiBjYWxpYnJhdGlvbiBnYWluIGJsb2NrIHJldHVybmluZ1xuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JTU1fREJHKCJDYWxpYnJhdGlvbiB2YWx1ZSIKLQkJIiBmb3IgY2FsaWJfZ2Fpbl9yeCAlZFxuIiwgYWNkYl9jYWxpYl9nYWluX3J4LT5hdWRwcGNhbGdhaW4pOwotCW1lbXNldChhY2RiX2RhdGEuY2FsaWJfZ2Fpbl9yeCwgMCwgc2l6ZW9mKCphY2RiX2RhdGEuY2FsaWJfZ2Fpbl9yeCkpOwotCi0JYWNkYl9kYXRhLmNhbGliX2dhaW5fcngtPmNvbW1vbi5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVM7Ci0JYWNkYl9kYXRhLmNhbGliX2dhaW5fcngtPmNvbW1vbi5zdHJlYW0gPSBBVURQUF9DTURfQ09QUF9TVFJFQU07Ci0JYWNkYl9kYXRhLmNhbGliX2dhaW5fcngtPmNvbW1vbi5zdHJlYW1faWQgPSAwOwotCWFjZGJfZGF0YS5jYWxpYl9nYWluX3J4LT5jb21tb24ub2JqX2NmZyA9IEFVRFBQX0NNRF9PQkowX1VQREFURTsKLQlhY2RiX2RhdGEuY2FsaWJfZ2Fpbl9yeC0+Y29tbW9uLmNvbW1hbmRfdHlwZSA9IDA7Ci0KLQlhY2RiX2RhdGEuY2FsaWJfZ2Fpbl9yeC0+YXVkcHBjYWxnYWluID0KLQkJCQlhY2RiX2NhbGliX2dhaW5fcngtPmF1ZHBwY2FsZ2FpbjsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZXh0cmFjdF9wYmVfYmxvY2soc3RydWN0IGhlYWRlciAqcHJzX2hkciwgdTMyICppbmRleCkKLXsKLQlpZiAocHJzX2hkci0+aWlkID09IElJRF9BVURJT19QQkVfUlhfRU5BQkxFX0ZMQUcpIHsKLQkJTU1fREJHKCJHb3QgSUlEID0gSUlEX0FVRElPX1BCRV9SWF9FTkFCTEVcbiIpOwotCQlhY2RiX2RhdGEucGJlX2VuYWJsZV9mbGFnID0gKHUxNiAqKShhY2RiX2RhdGEudmlydF9hZGRyICsKLQkJCQkJCQkqaW5kZXggKwotCQkJCQkJCXNpemVvZihzdHJ1Y3QgaGVhZGVyKSk7Ci0JCSppbmRleCArPSBwcnNfaGRyLT5kYXRhX2xlbiArIHNpemVvZihzdHJ1Y3QgaGVhZGVyKTsKLQl9IGVsc2UgaWYgKHByc19oZHItPmlpZCA9PSBJSURfUEJFX0NPTkZJR19QQVJBTUVURVJTKSB7Ci0JCU1NX0RCRygiR290IElJRCA9PSBJSURfUEJFX0NPTkZJR19QQVJBTUVURVJTXG4iKTsKLQkJYWNkYl9kYXRhLnBiZV9ibGsgPSAoc3RydWN0IGFjZGJfcGJlX2Jsb2NrICopCi0JCQkJCShhY2RiX2RhdGEudmlydF9hZGRyICsgKmluZGV4Ci0JCQkJCSsgc2l6ZW9mKHN0cnVjdCBoZWFkZXIpKTsKLQkJKmluZGV4ICs9IHByc19oZHItPmRhdGFfbGVuICsgc2l6ZW9mKHN0cnVjdCBoZWFkZXIpOwotCX0KLX0KLQotc3RhdGljIHMzMiBnZXRfYXVkcHBfcGJlX2Jsb2NrKHZvaWQpCi17Ci0Jc3RydWN0IGhlYWRlciAqcHJzX2hkcjsKLQl1MzIgaW5kZXggPSAwOwotCXMzMiByZXN1bHQgPSAtMTsKLQotCXdoaWxlIChpbmRleCA8IGFjZGJfZGF0YS5hY2RiX3Jlc3VsdC51c2VkX2J5dGVzKSB7Ci0JCXByc19oZHIgPSAoc3RydWN0IGhlYWRlciAqKShhY2RiX2RhdGEudmlydF9hZGRyICsgaW5kZXgpOwotCi0JCWlmIChwcnNfaGRyLT5kYm9yX3NpZ25hdHVyZSA9PSBEQk9SX1NJR05BVFVSRSkgewotCQkJaWYgKHByc19oZHItPmFiaWQgPT0gQUJJRF9BVURJT19QQkVfUlgpIHsKLQkJCQlpZiAoKHByc19oZHItPmlpZCA9PSBJSURfUEJFX0NPTkZJR19QQVJBTUVURVJTKQotCQkJCQl8fCAocHJzX2hkci0+aWlkID09Ci0JCQkJCQlJSURfQVVESU9fUEJFX1JYX0VOQUJMRV9GTEFHKSkgewotCQkJCQlleHRyYWN0X3BiZV9ibG9jayhwcnNfaGRyLCAmaW5kZXgpOwotCQkJCQlyZXN1bHQgPSAwOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gcHJzX2hkci0+ZGF0YV9sZW4gKwotCQkJCQlzaXplb2Yoc3RydWN0IGhlYWRlcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgczMyIGFjZGJfZmlsbF9hdWRwcF9wYmUodm9pZCkKLXsKLQlzMzIgcmVzdWx0ID0gLTE7Ci0KLQlyZXN1bHQgPSBnZXRfYXVkcHBfcGJlX2Jsb2NrKCk7Ci0JaWYgKElTX0VSUl9WQUxVRShyZXN1bHQpKQotCQlyZXR1cm4gcmVzdWx0OwotCW1lbXNldChhY2RiX2RhdGEucGJlX2Jsb2NrLCAwLCBzaXplb2YoKmFjZGJfZGF0YS5wYmVfYmxvY2spKTsKLQotCWFjZGJfZGF0YS5wYmVfYmxvY2stPmNvbW1vbi5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVM7Ci0JYWNkYl9kYXRhLnBiZV9ibG9jay0+Y29tbW9uLnN0cmVhbSA9IEFVRFBQX0NNRF9DT1BQX1NUUkVBTTsKLQlhY2RiX2RhdGEucGJlX2Jsb2NrLT5jb21tb24uc3RyZWFtX2lkID0gMDsKLQlhY2RiX2RhdGEucGJlX2Jsb2NrLT5jb21tb24ub2JqX2NmZyA9IEFVRFBQX0NNRF9PQkowX1VQREFURTsKLQlhY2RiX2RhdGEucGJlX2Jsb2NrLT5jb21tb24uY29tbWFuZF90eXBlID0gMDsKLQlhY2RiX2RhdGEucGJlX2Jsb2NrLT5wYmVfZW5hYmxlID0gKmFjZGJfZGF0YS5wYmVfZW5hYmxlX2ZsYWc7Ci0KLQlhY2RiX2RhdGEucGJlX2Jsb2NrLT5yZWFsYmFzc21peCA9IGFjZGJfZGF0YS5wYmVfYmxrLT5yZWFsYmFzc21peDsKLQlhY2RiX2RhdGEucGJlX2Jsb2NrLT5iYXNzY29sb3Jjb250cm9sID0KLQkJCQkJYWNkYl9kYXRhLnBiZV9ibGstPmJhc3Njb2xvcmNvbnRyb2w7Ci0JYWNkYl9kYXRhLnBiZV9ibG9jay0+bWFpbmNoYWluZGVsYXkgPSBhY2RiX2RhdGEucGJlX2Jsay0+bWFpbmNoYWluZGVsYXk7Ci0JYWNkYl9kYXRhLnBiZV9ibG9jay0+eG92ZXJmbHRvcmRlciA9IGFjZGJfZGF0YS5wYmVfYmxrLT54b3ZlcmZsdG9yZGVyOwotCWFjZGJfZGF0YS5wYmVfYmxvY2stPmJhbmRwYXNzZmx0b3JkZXIgPQotCQkJCQlhY2RiX2RhdGEucGJlX2Jsay0+YmFuZHBhc3NmbHRvcmRlcjsKLQlhY2RiX2RhdGEucGJlX2Jsb2NrLT5hZHJjZGVsYXkgPSBhY2RiX2RhdGEucGJlX2Jsay0+YWRyY2RlbGF5OwotCWFjZGJfZGF0YS5wYmVfYmxvY2stPmRvd25zYW1wbGVsZXZlbCA9Ci0JCQkJCWFjZGJfZGF0YS5wYmVfYmxrLT5kb3duc2FtcGxlbGV2ZWw7Ci0JYWNkYl9kYXRhLnBiZV9ibG9jay0+Y29tcHJtc3RhdiA9IGFjZGJfZGF0YS5wYmVfYmxrLT5jb21wcm1zdGF2OwotCWFjZGJfZGF0YS5wYmVfYmxvY2stPmV4cHRocmVzaG9sZCA9IGFjZGJfZGF0YS5wYmVfYmxrLT5leHB0aHJlc2hvbGQ7Ci0JYWNkYl9kYXRhLnBiZV9ibG9jay0+ZXhwc2xvcGUgPSBhY2RiX2RhdGEucGJlX2Jsay0+ZXhwc2xvcGU7Ci0JYWNkYl9kYXRhLnBiZV9ibG9jay0+Y29tcHRocmVzaG9sZCA9IGFjZGJfZGF0YS5wYmVfYmxrLT5jb21wdGhyZXNob2xkOwotCWFjZGJfZGF0YS5wYmVfYmxvY2stPmNvbXBzbG9wZSA9IGFjZGJfZGF0YS5wYmVfYmxrLT5jb21wc2xvcGU7Ci0JYWNkYl9kYXRhLnBiZV9ibG9jay0+Y3BtcGF0dGFja19sc3cgPSBhY2RiX2RhdGEucGJlX2Jsay0+Y3BtcGF0dGFja19sc3c7Ci0JYWNkYl9kYXRhLnBiZV9ibG9jay0+Y29tcGF0dGFja19tc3cgPSBhY2RiX2RhdGEucGJlX2Jsay0+Y29tcGF0dGFja19tc3c7Ci0JYWNkYl9kYXRhLnBiZV9ibG9jay0+Y29tcHJlbGVhc2VfbHN3ID0KLQkJCQkJYWNkYl9kYXRhLnBiZV9ibGstPmNvbXByZWxlYXNlX2xzdzsKLQlhY2RiX2RhdGEucGJlX2Jsb2NrLT5jb21wcmVsZWFzZV9tc3cgPQotCQkJCQlhY2RiX2RhdGEucGJlX2Jsay0+Y29tcHJlbGVhc2VfbXN3OwotCWFjZGJfZGF0YS5wYmVfYmxvY2stPmNvbXBtYWtldXBnYWluID0gYWNkYl9kYXRhLnBiZV9ibGstPmNvbXBtYWtldXBnYWluOwotCWFjZGJfZGF0YS5wYmVfYmxvY2stPmJhc2VsaW10aHJlc2hvbGQgPQotCQkJCQlhY2RiX2RhdGEucGJlX2Jsay0+YmFzZWxpbXRocmVzaG9sZDsKLQlhY2RiX2RhdGEucGJlX2Jsb2NrLT5oaWdobGltdGhyZXNob2xkID0KLQkJCQkJYWNkYl9kYXRhLnBiZV9ibGstPmhpZ2hsaW10aHJlc2hvbGQ7Ci0JYWNkYl9kYXRhLnBiZV9ibG9jay0+YmFzc2xpbW1ha2V1cGdhaW4gPQotCQkJCQlhY2RiX2RhdGEucGJlX2Jsay0+YmFzc2xpbW1ha2V1cGdhaW47Ci0JYWNkYl9kYXRhLnBiZV9ibG9jay0+aGlnaGxpbW1ha2V1cGdhaW4gPQotCQkJCQlhY2RiX2RhdGEucGJlX2Jsay0+aGlnaGxpbW1ha2V1cGdhaW47Ci0JYWNkYl9kYXRhLnBiZV9ibG9jay0+bGltYmFzc2dyYyA9IGFjZGJfZGF0YS5wYmVfYmxrLT5saW1iYXNzZ3JjOwotCWFjZGJfZGF0YS5wYmVfYmxvY2stPmxpbWhpZ2hncmMgPSBhY2RiX2RhdGEucGJlX2Jsay0+bGltaGlnaGdyYzsKLQlhY2RiX2RhdGEucGJlX2Jsb2NrLT5saW1kZWxheSA9IGFjZGJfZGF0YS5wYmVfYmxrLT5saW1kZWxheTsKLQltZW1jcHkoYWNkYl9kYXRhLnBiZV9ibG9jay0+ZmlsdGVyX2NvZWZmcywKLQkJYWNkYl9kYXRhLnBiZV9ibGstPmZpbHRlcl9jb2VmZnMsIHNpemVvZih1MTYpKjkwKTsKLQlhY2RiX2RhdGEucGJlX2Jsb2NrLT5leHRwYXJ0aXRpb24gPSAwOwotCWFjZGJfZGF0YS5wYmVfYmxvY2stPmV4dGJ1ZmZzaXplX2xzdyA9IFBCRV9CVUZfU0laRTsKLQlhY2RiX2RhdGEucGJlX2Jsb2NrLT5leHRidWZmc2l6ZV9tc3cgPSAwOwotCWFjZGJfZGF0YS5wYmVfYmxvY2stPmV4dGJ1ZmZzdGFydF9sc3cgPSAoKHUzMilhY2RiX2RhdGEucGJlX2V4dGJ1ZmYKLQkJCQkJCQkmIDB4RkZGRik7Ci0JYWNkYl9kYXRhLnBiZV9ibG9jay0+ZXh0YnVmZnN0YXJ0X21zdyA9ICgoKHUzMilhY2RiX2RhdGEucGJlX2V4dGJ1ZmYKLQkJCQkJCQkmIDB4RkZGRjAwMDApID4+IDE2KTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgczMyIGFjZGJfY2FsaWJyYXRlX2F1ZHBwKHZvaWQpCi17Ci0JczMyCXJlc3VsdCA9IDA7Ci0KLQlyZXN1bHQgPSBhY2RiX2ZpbGxfYXVkcHBfaWlyKCk7Ci0JaWYgKCFJU19FUlJfVkFMVUUocmVzdWx0KSkgewotCQlyZXN1bHQgPSBhdWRwcF9kc3Bfc2V0X3J4X2lpcihhY2RiX2RhdGEuZGV2aWNlX2luZm8tPmRldl9pZCwKLQkJCQlhY2RiX2RhdGEucHBfaWlyLT5hY3RpdmVfZmxhZywKLQkJCQkJYWNkYl9kYXRhLnBwX2lpciwgQ09QUCk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCU1NX0VSUigiQUNEQj0+IEZhaWxlZCB0byBzZW5kIElJUiBkYXRhIHRvIHBvc3Rwcm9jXG4iKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0gZWxzZQotCQkJTU1fREJHKCJBVURQUCBpcyBjYWxpYnJhdGVkIHdpdGggSUlSIHBhcmFtZXRlcnMiCi0JCQkJCSIgZm9yIENPUFAgSUQgJWRcbiIsCi0JCQkJCQlhY2RiX2RhdGEuZGV2aWNlX2luZm8tPmRldl9pZCk7Ci0JfQotCXJlc3VsdCA9IGFjZGJfZmlsbF9hdWRwcF9tYmFkcmMoKTsKLQlpZiAoIUlTX0VSUl9WQUxVRShyZXN1bHQpKSB7Ci0JCXJlc3VsdCA9IGF1ZHBwX2RzcF9zZXRfbWJhZHJjKGFjZGJfZGF0YS5kZXZpY2VfaW5mby0+ZGV2X2lkLAotCQkJCQlhY2RiX2RhdGEucHBfbWJhZHJjLT5lbmFibGUsCi0JCQkJCWFjZGJfZGF0YS5wcF9tYmFkcmMsIENPUFApOwotCQlpZiAocmVzdWx0KSB7Ci0JCQlNTV9FUlIoIkFDREI9PiBGYWlsZWQgdG8gc2VuZCBNQkFEUkMgZGF0YSB0byIKLQkJCQkJIiBwb3N0cHJvY1xuIik7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9IGVsc2UKLQkJCU1NX0RCRygiQVVEUFAgaXMgY2FsaWJyYXRlZCB3aXRoIE1CQURSQyBwYXJhbWV0ZXJzIgotCQkJCQkiIGZvciBDT1BQIElEICVkXG4iLAotCQkJCQlhY2RiX2RhdGEuZGV2aWNlX2luZm8tPmRldl9pZCk7Ci0JfQotCXJlc3VsdCA9IGFjZGJfZmlsbF9hdWRwcF9jYWxfZ2FpbigpOwotCWlmICghKElTX0VSUl9WQUxVRShyZXN1bHQpKSkgewotCQlyZXN1bHQgPSBhdWRwcF9kc3Bfc2V0X2dhaW5fcngoYWNkYl9kYXRhLmRldmljZV9pbmZvLT5kZXZfaWQsCi0JCQkJCWFjZGJfZGF0YS5jYWxpYl9nYWluX3J4LCBDT1BQKTsKLQkJaWYgKHJlc3VsdCkgewotCQkJTU1fRVJSKCJBQ0RCPT4gRmFpbGVkIHRvIHNlbmQgZ2Fpbl9yeCIKLQkJCQkiIGRhdGEgdG8gcG9zdHByb2NcbiIpOwotCQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfSBlbHNlCi0JCQlNTV9EQkcoIkFVRFBQIGlzIGNhbGlicmF0ZWQgd2l0aCBjYWxpYl9nYWluX3J4XG4iKTsKLQl9Ci0JcmVzdWx0ID0gYWNkYl9maWxsX2F1ZHBwX3BiZSgpOwotCWlmICghKElTX0VSUl9WQUxVRShyZXN1bHQpKSkgewotCQlyZXN1bHQgPSBhdWRwcF9kc3Bfc2V0X3BiZShhY2RiX2RhdGEuZGV2aWNlX2luZm8tPmRldl9pZCwKLQkJCQkJYWNkYl9kYXRhLnBiZV9ibG9jay0+cGJlX2VuYWJsZSwKLQkJCQkJYWNkYl9kYXRhLnBiZV9ibG9jaywgQ09QUCk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCU1NX0VSUigiQUNEQj0+IEZhaWxlZCB0byBzZW5kIHBiZSBibG9jayIKLQkJCQkiZGF0YSB0byBwb3N0cHJvY1xuIik7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0JCU1NX0RCRygiQVVEUFAgaXMgY2FsaWJhcnRlZCB3aXRoIFBCRVxuIik7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgc3RydWN0IGFjZGJfYWdjX2Jsb2NrICpnZXRfYXVkcHJlcHJvY19hZ2NfYmxvY2sodm9pZCkKLXsKLQlzdHJ1Y3QgaGVhZGVyICpwcnNfaGRyOwotCXUzMiBpbmRleCA9IDA7Ci0KLQl3aGlsZSAoaW5kZXggPCBhY2RiX2RhdGEuYWNkYl9yZXN1bHQudXNlZF9ieXRlcykgewotCQlwcnNfaGRyID0gKHN0cnVjdCBoZWFkZXIgKikoYWNkYl9kYXRhLnZpcnRfYWRkciArIGluZGV4KTsKLQkJaWYgKHByc19oZHItPmRib3Jfc2lnbmF0dXJlID09IERCT1JfU0lHTkFUVVJFKSB7Ci0JCQlpZiAocHJzX2hkci0+YWJpZCA9PSBBQklEX0FVRElPX0FHQ19UWCkgewotCQkJCWlmIChwcnNfaGRyLT5paWQgPT0gSUlEX0FVRElPX0FHQ19QQVJBTUVURVJTKSB7Ci0JCQkJCU1NX0RCRygiR09UIEFCSURfQVVESU9fQUdDX1RYXG4iKTsKLQkJCQkJcmV0dXJuIChzdHJ1Y3QgYWNkYl9hZ2NfYmxvY2sgKikKLQkJCQkJCShhY2RiX2RhdGEudmlydF9hZGRyICsgaW5kZXgKLQkJCQkJCSArIHNpemVvZihzdHJ1Y3QgaGVhZGVyKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCArPSBwcnNfaGRyLT5kYXRhX2xlbiArCi0JCQkJCQlzaXplb2Yoc3RydWN0IGhlYWRlcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHMzMiBhY2RiX2ZpbGxfYXVkcHJlcHJvY19hZ2Modm9pZCkKLXsKLQlzdHJ1Y3QgYWNkYl9hZ2NfYmxvY2sJKmFjZGJfYWdjOwotCi0JYWNkYl9hZ2MgPSBnZXRfYXVkcHJlcHJvY19hZ2NfYmxvY2soKTsKLQlpZiAoIWFjZGJfYWdjKSB7Ci0JCU1NX0RCRygidW5hYmxlIHRvIGZpbmQgcHJlcHJvYyBhZ2MgcGFyYW1ldGVycyB3aW5kaW5nIHVwXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltZW1zZXQoYWNkYl9kYXRhLnByZXByb2NfYWdjLCAwLCBzaXplb2YoKmFjZGJfZGF0YS5wcmVwcm9jX2FnYykpOwotCWFjZGJfZGF0YS5wcmVwcm9jX2FnYy0+Y21kX2lkID0gQVVEUFJFUFJPQ19DTURfQ0ZHX0FHQ19QQVJBTVM7Ci0JYWNkYl9kYXRhLnByZXByb2NfYWdjLT5zdHJlYW1faWQgPSBhY2RiX2RhdGEucHJlcHJvY19zdHJlYW1faWQ7Ci0JLyogMHhGRTAwIHRvIGNvbmZpZ3VyZSBhbGwgcGFyYW1ldGVycyAqLwotCWFjZGJfZGF0YS5wcmVwcm9jX2FnYy0+dHhfYWdjX3BhcmFtX21hc2sgPSAweEZGRkY7Ci0KLQlpZiAoYWNkYl9hZ2MtPmVuYWJsZV9zdGF0dXMpCi0JCWFjZGJfZGF0YS5wcmVwcm9jX2FnYy0+dHhfYWdjX2VuYWJsZV9mbGFnID0KLQkJCUFVRFBSRVBST0NfQ01EX1RYX0FHQ19FTkFfRkxBR19FTkE7Ci0JZWxzZQotCQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPnR4X2FnY19lbmFibGVfZmxhZyA9Ci0JCQlBVURQUkVQUk9DX0NNRF9UWF9BR0NfRU5BX0ZMQUdfRElTOwotCi0JYWNkYl9kYXRhLnByZXByb2NfYWdjLT5jb21wX3JsaW5rX3N0YXRpY19nYWluID0KLQkJYWNkYl9hZ2MtPmNvbXBfcmxpbmtfc3RhdGljX2dhaW47Ci0JYWNkYl9kYXRhLnByZXByb2NfYWdjLT5jb21wX3JsaW5rX2FpZ19mbGFnID0KLQkJYWNkYl9hZ2MtPmNvbXBfcmxpbmtfYWlnX2ZsYWc7Ci0JYWNkYl9kYXRhLnByZXByb2NfYWdjLT5leHBhbmRlcl9ybGlua190aCA9Ci0JCWFjZGJfYWdjLT5leHBfcmxpbmtfdGhyZXNob2xkOwotCWFjZGJfZGF0YS5wcmVwcm9jX2FnYy0+ZXhwYW5kZXJfcmxpbmtfc2xvcGUgPQotCQlhY2RiX2FnYy0+ZXhwX3JsaW5rX3Nsb3BlOwotCWFjZGJfZGF0YS5wcmVwcm9jX2FnYy0+Y29tcHJlc3Nvcl9ybGlua190aCA9Ci0JCWFjZGJfYWdjLT5jb21wX3JsaW5rX3RocmVzaG9sZDsKLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPmNvbXByZXNzb3Jfcmxpbmtfc2xvcGUgPQotCQlhY2RiX2FnYy0+Y29tcF9ybGlua19zbG9wZTsKLQotCS8qIDB4RkZGMCB0byBjb25maWd1cmUgYWxsIHBhcmFtZXRlcnMgKi8KLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPnR4X2FkY19hZ2NfcGFyYW1fbWFzayA9IDB4RkZGRjsKLQotCWFjZGJfZGF0YS5wcmVwcm9jX2FnYy0+Y29tcF9ybGlua19haWdfYXR0YWNrayA9Ci0JCWFjZGJfYWdjLT5jb21wX3JsaW5rX2FpZ19hdHRhY2tfazsKLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPmNvbXBfcmxpbmtfYWlnX2xlYWtfZG93biA9Ci0JCWFjZGJfYWdjLT5jb21wX3JsaW5rX2FpZ19sZWFrX2Rvd247Ci0JYWNkYl9kYXRhLnByZXByb2NfYWdjLT5jb21wX3JsaW5rX2FpZ19sZWFrX3VwID0KLQkJYWNkYl9hZ2MtPmNvbXBfcmxpbmtfYWlnX2xlYWtfdXA7Ci0JYWNkYl9kYXRhLnByZXByb2NfYWdjLT5jb21wX3JsaW5rX2FpZ19tYXggPQotCQlhY2RiX2FnYy0+Y29tcF9ybGlua19haWdfbWF4OwotCWFjZGJfZGF0YS5wcmVwcm9jX2FnYy0+Y29tcF9ybGlua19haWdfbWluID0KLQkJYWNkYl9hZ2MtPmNvbXBfcmxpbmtfYWlnX21pbjsKLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPmNvbXBfcmxpbmtfYWlnX3JlbGVhc2VrID0KLQkJYWNkYl9hZ2MtPmNvbXBfcmxpbmtfYWlnX3JlbGVhc2VfazsKLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPmNvbXBfcmxpbmtfYWlnX2xlYWtyYXRlX2Zhc3QgPQotCQlhY2RiX2FnYy0+Y29tcF9ybGlua19haWdfc21fbGVha19yYXRlX2Zhc3Q7Ci0JYWNkYl9kYXRhLnByZXByb2NfYWdjLT5jb21wX3JsaW5rX2FpZ19sZWFrcmF0ZV9zbG93ID0KLQkJYWNkYl9hZ2MtPmNvbXBfcmxpbmtfYWlnX3NtX2xlYWtfcmF0ZV9zbG93OwotCWFjZGJfZGF0YS5wcmVwcm9jX2FnYy0+Y29tcF9ybGlua19hdHRhY2trX21zdyA9Ci0JCWFjZGJfYWdjLT5jb21wX3JsaW5rX2F0dGFja19rX21zdzsKLQlhY2RiX2RhdGEucHJlcHJvY19hZ2MtPmNvbXBfcmxpbmtfYXR0YWNra19sc3cgPQotCQlhY2RiX2FnYy0+Y29tcF9ybGlua19hdHRhY2tfa19sc3c7Ci0JYWNkYl9kYXRhLnByZXByb2NfYWdjLT5jb21wX3JsaW5rX2RlbGF5ID0KLQkJYWNkYl9hZ2MtPmNvbXBfcmxpbmtfZGVsYXk7Ci0JYWNkYl9kYXRhLnByZXByb2NfYWdjLT5jb21wX3JsaW5rX3JlbGVhc2VrX21zdyA9Ci0JCWFjZGJfYWdjLT5jb21wX3JsaW5rX3JlbGVhc2Vfa19tc3c7Ci0JYWNkYl9kYXRhLnByZXByb2NfYWdjLT5jb21wX3JsaW5rX3JlbGVhc2VrX2xzdyA9Ci0JCWFjZGJfYWdjLT5jb21wX3JsaW5rX3JlbGVhc2Vfa19sc3c7Ci0JYWNkYl9kYXRhLnByZXByb2NfYWdjLT5jb21wX3JsaW5rX3Jtc190YXYgPQotCQlhY2RiX2FnYy0+Y29tcF9ybGlua19ybXNfdHJhdjsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBhY2RiX2lpcl9ibG9jayAqZ2V0X2F1ZHByZXByb2NfaXJyX2Jsb2NrKHZvaWQpCi17Ci0KLQlzdHJ1Y3QgaGVhZGVyICpwcnNfaGRyOwotCXUzMiBpbmRleCA9IDA7Ci0KLQl3aGlsZSAoaW5kZXggPCBhY2RiX2RhdGEuYWNkYl9yZXN1bHQudXNlZF9ieXRlcykgewotCQlwcnNfaGRyID0gKHN0cnVjdCBoZWFkZXIgKikoYWNkYl9kYXRhLnZpcnRfYWRkciArIGluZGV4KTsKLQotCQlpZiAocHJzX2hkci0+ZGJvcl9zaWduYXR1cmUgPT0gREJPUl9TSUdOQVRVUkUpIHsKLQkJCWlmIChwcnNfaGRyLT5hYmlkID09IEFCSURfQVVESU9fSUlSX1RYKSB7Ci0JCQkJaWYgKHByc19oZHItPmlpZCA9PSBJSURfQVVESU9fSUlSX0NPRUZGKQotCQkJCQlyZXR1cm4gKHN0cnVjdCBhY2RiX2lpcl9ibG9jayAqKQotCQkJCQkJKGFjZGJfZGF0YS52aXJ0X2FkZHIgKyBpbmRleAotCQkJCQkJICsgc2l6ZW9mKHN0cnVjdCBoZWFkZXIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gcHJzX2hkci0+ZGF0YV9sZW4gKwotCQkJCQkJc2l6ZW9mKHN0cnVjdCBoZWFkZXIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIHMzMiBhY2RiX2ZpbGxfYXVkcHJlcHJvY19paXIodm9pZCkKLXsKLQlzdHJ1Y3QgYWNkYl9paXJfYmxvY2sJKmFjZGJfaWlyOwotCi0KLQlhY2RiX2lpciA9ICBnZXRfYXVkcHJlcHJvY19pcnJfYmxvY2soKTsKLQlpZiAoIWFjZGJfaWlyKSB7Ci0JCU1NX0RCRygidW5hYmxlIHRvIGZpbmQgcHJlcHJvYyBpaXIgcGFyYW1ldGVycyB3aW5kaW5nIHVwXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltZW1zZXQoYWNkYl9kYXRhLnByZXByb2NfaWlyLCAwLCBzaXplb2YoKmFjZGJfZGF0YS5wcmVwcm9jX2lpcikpOwotCi0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5jbWRfaWQgPQotCQlBVURQUkVQUk9DX0NNRF9DRkdfSUlSX1RVTklOR19GSUxURVJfUEFSQU1TOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+c3RyZWFtX2lkID0gYWNkYl9kYXRhLnByZXByb2Nfc3RyZWFtX2lkOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+YWN0aXZlX2ZsYWcgPSBhY2RiX2lpci0+ZW5hYmxlX2ZsYWc7Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1fYmFuZHMgPSBhY2RiX2lpci0+c3RhZ2VfY291bnQ7Ci0KLQlhY2RiX2RhdGEucHJlcHJvY19paXItPm51bWVyYXRvcl9jb2VmZl9iMF9maWx0ZXIwX2xzdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNbMF0uYjBfbG87Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1lcmF0b3JfY29lZmZfYjBfZmlsdGVyMF9tc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzWzBdLmIwX2hpOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtZXJhdG9yX2NvZWZmX2IxX2ZpbHRlcjBfbHN3ID0KLQkJYWNkYl9paXItPnN0YWdlc1swXS5iMV9sbzsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPm51bWVyYXRvcl9jb2VmZl9iMV9maWx0ZXIwX21zdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNbMF0uYjFfaGk7Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1lcmF0b3JfY29lZmZfYjJfZmlsdGVyMF9sc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzWzBdLmIyX2xvOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtZXJhdG9yX2NvZWZmX2IyX2ZpbHRlcjBfbXN3ID0KLQkJYWNkYl9paXItPnN0YWdlc1swXS5iMl9oaTsKLQotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtZXJhdG9yX2NvZWZmX2IwX2ZpbHRlcjFfbHN3ID0KLQkJYWNkYl9paXItPnN0YWdlc1sxXS5iMF9sbzsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPm51bWVyYXRvcl9jb2VmZl9iMF9maWx0ZXIxX21zdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNbMV0uYjBfaGk7Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1lcmF0b3JfY29lZmZfYjFfZmlsdGVyMV9sc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzWzFdLmIxX2xvOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtZXJhdG9yX2NvZWZmX2IxX2ZpbHRlcjFfbXN3ID0KLQkJYWNkYl9paXItPnN0YWdlc1sxXS5iMV9oaTsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPm51bWVyYXRvcl9jb2VmZl9iMl9maWx0ZXIxX2xzdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNbMV0uYjJfbG87Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1lcmF0b3JfY29lZmZfYjJfZmlsdGVyMV9tc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzWzFdLmIyX2hpOwotCi0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1lcmF0b3JfY29lZmZfYjBfZmlsdGVyMl9sc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzWzJdLmIwX2xvOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtZXJhdG9yX2NvZWZmX2IwX2ZpbHRlcjJfbXN3ID0KLQkJYWNkYl9paXItPnN0YWdlc1syXS5iMF9oaTsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPm51bWVyYXRvcl9jb2VmZl9iMV9maWx0ZXIyX2xzdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNbMl0uYjFfbG87Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1lcmF0b3JfY29lZmZfYjFfZmlsdGVyMl9tc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzWzJdLmIxX2hpOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtZXJhdG9yX2NvZWZmX2IyX2ZpbHRlcjJfbHN3ID0KLQkJYWNkYl9paXItPnN0YWdlc1syXS5iMl9sbzsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPm51bWVyYXRvcl9jb2VmZl9iMl9maWx0ZXIyX21zdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNbMl0uYjJfaGk7Ci0KLQlhY2RiX2RhdGEucHJlcHJvY19paXItPm51bWVyYXRvcl9jb2VmZl9iMF9maWx0ZXIzX2xzdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNbM10uYjBfbG87Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1lcmF0b3JfY29lZmZfYjBfZmlsdGVyM19tc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzWzNdLmIwX2hpOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtZXJhdG9yX2NvZWZmX2IxX2ZpbHRlcjNfbHN3ID0KLQkJYWNkYl9paXItPnN0YWdlc1szXS5iMV9sbzsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPm51bWVyYXRvcl9jb2VmZl9iMV9maWx0ZXIzX21zdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNbM10uYjFfaGk7Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5udW1lcmF0b3JfY29lZmZfYjJfZmlsdGVyM19sc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzWzNdLmIyX2xvOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+bnVtZXJhdG9yX2NvZWZmX2IyX2ZpbHRlcjNfbXN3ID0KLQkJYWNkYl9paXItPnN0YWdlc1szXS5iMl9oaTsKLQotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+ZGVub21pbmF0b3JfY29lZmZfYTBfZmlsdGVyMF9sc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzX2FbMF0uYTFfbG87Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5kZW5vbWluYXRvcl9jb2VmZl9hMF9maWx0ZXIwX21zdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNfYVswXS5hMV9oaTsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPmRlbm9taW5hdG9yX2NvZWZmX2ExX2ZpbHRlcjBfbHN3ID0KLQkJYWNkYl9paXItPnN0YWdlc19hWzBdLmEyX2xvOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+ZGVub21pbmF0b3JfY29lZmZfYTFfZmlsdGVyMF9tc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzX2FbMF0uYTJfaGk7Ci0KLQlhY2RiX2RhdGEucHJlcHJvY19paXItPmRlbm9taW5hdG9yX2NvZWZmX2EwX2ZpbHRlcjFfbHN3ID0KLQkJYWNkYl9paXItPnN0YWdlc19hWzFdLmExX2xvOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+ZGVub21pbmF0b3JfY29lZmZfYTBfZmlsdGVyMV9tc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzX2FbMV0uYTFfaGk7Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5kZW5vbWluYXRvcl9jb2VmZl9hMV9maWx0ZXIxX2xzdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNfYVsxXS5hMl9sbzsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPmRlbm9taW5hdG9yX2NvZWZmX2ExX2ZpbHRlcjFfbXN3ID0KLQkJYWNkYl9paXItPnN0YWdlc19hWzFdLmEyX2hpOwotCi0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5kZW5vbWluYXRvcl9jb2VmZl9hMF9maWx0ZXIyX2xzdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNfYVsyXS5hMV9sbzsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPmRlbm9taW5hdG9yX2NvZWZmX2EwX2ZpbHRlcjJfbXN3ID0KLQkJYWNkYl9paXItPnN0YWdlc19hWzJdLmExX2hpOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+ZGVub21pbmF0b3JfY29lZmZfYTFfZmlsdGVyMl9sc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzX2FbMl0uYTJfbG87Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5kZW5vbWluYXRvcl9jb2VmZl9hMV9maWx0ZXIyX21zdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNfYVsyXS5hMl9oaTsKLQotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+ZGVub21pbmF0b3JfY29lZmZfYTBfZmlsdGVyM19sc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzX2FbM10uYTFfbG87Ci0JYWNkYl9kYXRhLnByZXByb2NfaWlyLT5kZW5vbWluYXRvcl9jb2VmZl9hMF9maWx0ZXIzX21zdyA9Ci0JCWFjZGJfaWlyLT5zdGFnZXNfYVszXS5hMV9oaTsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPmRlbm9taW5hdG9yX2NvZWZmX2ExX2ZpbHRlcjNfbHN3ID0KLQkJYWNkYl9paXItPnN0YWdlc19hWzNdLmEyX2xvOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+ZGVub21pbmF0b3JfY29lZmZfYTFfZmlsdGVyM19tc3cgPQotCQlhY2RiX2lpci0+c3RhZ2VzX2FbM10uYTJfaGk7Ci0KLQlhY2RiX2RhdGEucHJlcHJvY19paXItPnNoaWZ0X2ZhY3Rvcl9maWx0ZXIwID0KLQkJYWNkYl9paXItPnNoaWZ0X2ZhY3RvclswXTsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPnNoaWZ0X2ZhY3Rvcl9maWx0ZXIxID0KLQkJYWNkYl9paXItPnNoaWZ0X2ZhY3RvclsxXTsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPnNoaWZ0X2ZhY3Rvcl9maWx0ZXIyID0KLQkJYWNkYl9paXItPnNoaWZ0X2ZhY3RvclsyXTsKLQlhY2RiX2RhdGEucHJlcHJvY19paXItPnNoaWZ0X2ZhY3Rvcl9maWx0ZXIzID0KLQkJYWNkYl9paXItPnNoaWZ0X2ZhY3RvclszXTsKLQotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+cGFuX29mX2ZpbHRlcjAgPQotCQlhY2RiX2lpci0+cGFuWzBdOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+cGFuX29mX2ZpbHRlcjEgPQotCQlhY2RiX2lpci0+cGFuWzFdOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+cGFuX29mX2ZpbHRlcjIgPQotCQlhY2RiX2lpci0+cGFuWzJdOwotCWFjZGJfZGF0YS5wcmVwcm9jX2lpci0+cGFuX29mX2ZpbHRlcjMgPQotCQlhY2RiX2lpci0+cGFuWzNdOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGFjZGJfY2FsaWJfZ2Fpbl90eCAqZ2V0X2F1ZHByZXByb2NfY2FsX2dhaW4odm9pZCkKLXsKLQlzdHJ1Y3QgaGVhZGVyICpwcnNfaGRyOwotCXUzMiBpbmRleCA9IDA7Ci0KLQl3aGlsZSAoaW5kZXggPCBhY2RiX2RhdGEuYWNkYl9yZXN1bHQudXNlZF9ieXRlcykgewotCQlwcnNfaGRyID0gKHN0cnVjdCBoZWFkZXIgKikoYWNkYl9kYXRhLnZpcnRfYWRkciArIGluZGV4KTsKLQkJaWYgKHByc19oZHItPmRib3Jfc2lnbmF0dXJlID09IERCT1JfU0lHTkFUVVJFKSB7Ci0JCQlpZiAocHJzX2hkci0+YWJpZCA9PSBBQklEX0FVRElPX0NBTElCUkFUSU9OX0dBSU5fVFgpIHsKLQkJCQlpZiAocHJzX2hkci0+aWlkID09Ci0JCQkJCUlJRF9BVURJT19DQUxJQlJBVElPTl9HQUlOX1RYKSB7Ci0JCQkJCU1NX0RCRygiR290IGF1ZHByZXByb2NfY2FsaWJfZ2Fpbl90eCIKLQkJCQkJIiBibG9ja1xuIik7Ci0JCQkJCXJldHVybiAoc3RydWN0IGFjZGJfY2FsaWJfZ2Fpbl90eCAqKQotCQkJCQkJKGFjZGJfZGF0YS52aXJ0X2FkZHIgKyBpbmRleAotCQkJCQkJKyBzaXplb2Yoc3RydWN0IGhlYWRlcikpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gcHJzX2hkci0+ZGF0YV9sZW4gKwotCQkJCQlzaXplb2Yoc3RydWN0IGhlYWRlcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHMzMiBhY2RiX2ZpbGxfYXVkcHJlcHJvY19jYWxfZ2Fpbih2b2lkKQotewotCXN0cnVjdCBhY2RiX2NhbGliX2dhaW5fdHggKmFjZGJfY2FsaWJfZ2Fpbl90eCA9IE5VTEw7Ci0KLQlhY2RiX2NhbGliX2dhaW5fdHggPSBnZXRfYXVkcHJlcHJvY19jYWxfZ2FpbigpOwotCWlmIChhY2RiX2NhbGliX2dhaW5fdHggPT0gTlVMTCkgewotCQlNTV9FUlIoInVuYWJsZSB0byBmaW5kICBhdWRwcmVwcm9jIgotCQkJIiBjYWxpYnJhdGlvbiBibG9jayByZXR1cm5pbmdcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCU1NX0RCRygiQ2FsaWJyYXRpb24gdmFsdWUiCi0JCSIgZm9yIGNhbGliX2dhaW5fdHggJWRcbiIsIGFjZGJfY2FsaWJfZ2Fpbl90eC0+YXVkcHJlY2FsZ2Fpbik7Ci0JbWVtc2V0KGFjZGJfZGF0YS5jYWxpYl9nYWluX3R4LCAwLCBzaXplb2YoKmFjZGJfZGF0YS5jYWxpYl9nYWluX3R4KSk7Ci0KLQlhY2RiX2RhdGEuY2FsaWJfZ2Fpbl90eC0+Y21kX2lkID0KLQkJCQkJQVVEUFJFUFJPQ19DTURfQ0ZHX0NBTF9HQUlOX1BBUkFNUzsKLQlhY2RiX2RhdGEuY2FsaWJfZ2Fpbl90eC0+c3RyZWFtX2lkID0gYWNkYl9kYXRhLnByZXByb2Nfc3RyZWFtX2lkOwotCWFjZGJfZGF0YS5jYWxpYl9nYWluX3R4LT5hdWRwcmVjYWxnYWluID0KLQkJCQkJYWNkYl9jYWxpYl9nYWluX3R4LT5hdWRwcmVjYWxnYWluOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGFjZGJfcm1jX2Jsb2NrICpnZXRfcm1jX2Jsayh2b2lkKQotewotCXN0cnVjdCBoZWFkZXIgKnByc19oZHI7Ci0JdTMyIGluZGV4ID0gMDsKLQotCXdoaWxlIChpbmRleCA8IGFjZGJfZGF0YS5hY2RiX3Jlc3VsdC51c2VkX2J5dGVzKSB7Ci0JCXByc19oZHIgPSAoc3RydWN0IGhlYWRlciAqKShhY2RiX2RhdGEudmlydF9hZGRyICsgaW5kZXgpOwotCQlpZiAocHJzX2hkci0+ZGJvcl9zaWduYXR1cmUgPT0gREJPUl9TSUdOQVRVUkUpIHsKLQkJCWlmIChwcnNfaGRyLT5hYmlkID09IEFCSURfQVVESU9fUk1DX1RYKSB7Ci0JCQkJaWYgKHByc19oZHItPmlpZCA9PQotCQkJCQlJSURfQVVESU9fUk1DX1BBUkFNKSB7Ci0JCQkJCU1NX0RCRygiR290IGFmZV9ybWMgYmxvY2tcbiIpOwotCQkJCQlyZXR1cm4gKHN0cnVjdCBhY2RiX3JtY19ibG9jayAqKQotCQkJCQkJKGFjZGJfZGF0YS52aXJ0X2FkZHIgKyBpbmRleAotCQkJCQkJKyBzaXplb2Yoc3RydWN0IGhlYWRlcikpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gcHJzX2hkci0+ZGF0YV9sZW4gKwotCQkJCQlzaXplb2Yoc3RydWN0IGhlYWRlcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RydWN0IGFjZGJfZmx1ZW5jZV9ibG9jayAqZ2V0X2F1ZHBwX2ZsdWVuY2VfYmxvY2sodm9pZCkKLXsKLQlzdHJ1Y3QgaGVhZGVyICpwcnNfaGRyOwotCXUzMiBpbmRleCA9IDA7Ci0KLQl3aGlsZSAoaW5kZXggPCBhY2RiX2RhdGEuYWNkYl9yZXN1bHQudXNlZF9ieXRlcykgewotCQlwcnNfaGRyID0gKHN0cnVjdCBoZWFkZXIgKikoYWNkYl9kYXRhLnZpcnRfYWRkciArIGluZGV4KTsKLQotCQlpZiAocHJzX2hkci0+ZGJvcl9zaWduYXR1cmUgPT0gREJPUl9TSUdOQVRVUkUpIHsKLQkJCWlmIChwcnNfaGRyLT5hYmlkID09IEFCSURfQVVESU9fRkxVRU5DRV9UWCkgewotCQkJCWlmIChwcnNfaGRyLT5paWQgPT0gSUlEX0FVRElPX0ZMVUVOQ0VfVFgpIHsKLQkJCQkJTU1fREJHKCJnb3QgZmx1ZW5jZSBibG9ja1xuIik7Ci0JCQkJCXJldHVybiAoc3RydWN0IGFjZGJfZmx1ZW5jZV9ibG9jayAqKQotCQkJCQkJKGFjZGJfZGF0YS52aXJ0X2FkZHIgKyBpbmRleAotCQkJCQkJKyBzaXplb2Yoc3RydWN0IGhlYWRlcikpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gcHJzX2hkci0+ZGF0YV9sZW4gKwotCQkJCQlzaXplb2Yoc3RydWN0IGhlYWRlcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHMzMiBhY2RiX2ZpbGxfYXVkcHJlcHJvY19mbHVlbmNlKHZvaWQpCi17Ci0Jc3RydWN0IGFjZGJfZmx1ZW5jZV9ibG9jayAqZmx1ZW5jZV9ibG9jayA9IE5VTEw7Ci0JZmx1ZW5jZV9ibG9jayA9IGdldF9hdWRwcF9mbHVlbmNlX2Jsb2NrKCk7Ci0JaWYgKCFmbHVlbmNlX2Jsb2NrKSB7Ci0JCU1NX0VSUigiZXJyb3IgaW4gZmluZGluZyBmbHVlbmNlIGJsb2NrXG4iKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0JbWVtc2V0KCZhY2RiX2RhdGEucHJlcHJvY19sdm52LCAwLCBzaXplb2YoCi0JCQkJc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19sdm52X3BhcmFtKSk7Ci0JbWVtY3B5KGFjZGJfZGF0YS5mbHVlbmNlX2V4dGJ1ZmZfdmlydCwKLQkJCSZmbHVlbmNlX2Jsb2NrLT5jc190dW5pbmdNb2RlLAotCQkJKHNpemVvZihzdHJ1Y3QgYWNkYl9mbHVlbmNlX2Jsb2NrKSAtCi0JCQkJCXNpemVvZihmbHVlbmNlX2Jsb2NrLT5jc21vZGUpKSk7Ci0JYWNkYl9kYXRhLnByZXByb2NfbHZudi5jbWRfaWQgPSBBVURQUkVQUk9DX0NNRF9DRkdfTFZOVl9QQVJNUzsKLQlhY2RiX2RhdGEucHJlcHJvY19sdm52LnN0cmVhbV9pZCA9IGFjZGJfZGF0YS5wcmVwcm9jX3N0cmVhbV9pZDsKLQlhY2RiX2RhdGEucHJlcHJvY19sdm52LmNzX21vZGUgPSBmbHVlbmNlX2Jsb2NrLT5jc21vZGU7Ci0JYWNkYl9kYXRhLnByZXByb2NfbHZudi5sdm52X2V4dF9idWZfc2l6ZSA9IEZMVUVOQ0VfQlVGX1NJWkU7Ci0JYWNkYl9kYXRhLnByZXByb2NfbHZudi5sdm52X2V4dF9idWZfc3RhcnRfbHN3ID1cCi0JCQkJKCh1MzIpKGFjZGJfZGF0YS5mbHVlbmNlX2V4dGJ1ZmYpXAotCQkJCQkJJiAweDAwMDBGRkZGKTsKLQlhY2RiX2RhdGEucHJlcHJvY19sdm52Lmx2bnZfZXh0X2J1Zl9zdGFydF9tc3cgPVwKLQkJCQkoKCh1MzIpYWNkYl9kYXRhLmZsdWVuY2VfZXh0YnVmZlwKLQkJCQkJJiAweEZGRkYwMDAwKSA+PiAxNik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXMzMiBhY2RiX2NhbGlicmF0ZV9hdWRwcmVwcm9jKHZvaWQpCi17Ci0JczMyCXJlc3VsdCA9IDA7Ci0Jc3RydWN0IGFjZGJfcm1jX2Jsb2NrICphY2RiX3JtYyA9IE5VTEw7Ci0KLQlyZXN1bHQgPSBhY2RiX2ZpbGxfYXVkcHJlcHJvY19hZ2MoKTsKLQlpZiAoIUlTX0VSUl9WQUxVRShyZXN1bHQpKSB7Ci0JCXJlc3VsdCA9IGF1ZHByZXByb2NfZHNwX3NldF9hZ2MoYWNkYl9kYXRhLnByZXByb2NfYWdjLCBzaXplb2YoCi0JCQkJCXN0cnVjdCBhdWRwcmVwcm9jX2NtZF9jZmdfYWdjX3BhcmFtcykpOwotCQlpZiAocmVzdWx0KSB7Ci0JCQlNTV9FUlIoIkFDREI9PiBGYWlsZWQgdG8gc2VuZCBBR0MgZGF0YSB0byBwcmVwcm9jKVxuIik7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9IGVsc2UKLQkJCU1NX0RCRygiQVVEUFJFQyBpcyBjYWxpYnJhdGVkIHdpdGggQUdDIHBhcmFtZXRlcnMiCi0JCQkJIiBmb3IgQ09QUCBJRCAlZCBhbmQgQVVEUkVDIHNlc3Npb24gJWRcbiIsCi0JCQkJCWFjZGJfZGF0YS5kZXZpY2VfaW5mby0+ZGV2X2lkLAotCQkJCQlhY2RiX2RhdGEucHJlcHJvY19zdHJlYW1faWQpOwotCX0KLQlyZXN1bHQgPSBhY2RiX2ZpbGxfYXVkcHJlcHJvY19paXIoKTsKLQlpZiAoIUlTX0VSUl9WQUxVRShyZXN1bHQpKSB7Ci0JCXJlc3VsdCA9IGF1ZHByZXByb2NfZHNwX3NldF9paXIoYWNkYl9kYXRhLnByZXByb2NfaWlyLAotCQkJCXNpemVvZihzdHJ1Y3RcCi0JCQkJYXVkcHJlcHJvY19jbWRfY2ZnX2lpcl90dW5pbmdfZmlsdGVyX3BhcmFtcykpOwotCQlpZiAocmVzdWx0KSB7Ci0JCQlNTV9FUlIoIkFDREI9PiBGYWlsZWQgdG8gc2VuZCBJSVIgZGF0YSB0byBwcmVwcm9jXG4iKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0gZWxzZQotCQkJTU1fREJHKCJhdWRwcmVwcm9jIGlzIGNhbGlicmF0ZWQgd2l0aCBpaXIgcGFyYW1ldGVycyIKLQkJCSIgZm9yIENPUFAgSUQgJWQgYW5kIEFVUkVDIHNlc3Npb24gJWRcbiIsCi0JCQkJCWFjZGJfZGF0YS5kZXZpY2VfaW5mby0+ZGV2X2lkLAotCQkJCQlhY2RiX2RhdGEucHJlcHJvY19zdHJlYW1faWQpOwotCX0KLQlyZXN1bHQgPSBhY2RiX2ZpbGxfYXVkcHJlcHJvY19jYWxfZ2FpbigpOwotCWlmICghKElTX0VSUl9WQUxVRShyZXN1bHQpKSkgewotCQlyZXN1bHQgPSBhdWRwcmVwcm9jX2RzcF9zZXRfZ2Fpbl90eChhY2RiX2RhdGEuY2FsaWJfZ2Fpbl90eCwKLQkJCQlzaXplb2Yoc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19jYWxfZ2FpbikpOwotCQlpZiAocmVzdWx0KSB7Ci0JCQlNTV9FUlIoIkFDREI9PiBGYWlsZWQgdG8gc2VuZCBjYWxpYl9nYWluX3R4IgotCQkJCSIgZGF0YSB0byBwcmVwcm9jXG4iKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0gZWxzZQotCQkJTU1fREJHKCJBVURQUkVQUk9DIGlzIGNhbGlicmF0ZWQiCi0JCQkJIiB3aXRoIGNhbGliX2dhaW5fdHhcbiIpOwotCX0KLQlpZiAoYWNkYl9kYXRhLmJ1aWxkX2lkWzE3XSAhPSAnMCcpIHsKLQkJYWNkYl9ybWMgPSBnZXRfcm1jX2JsaygpOwotCQlpZiAoYWNkYl9ybWMgIT0gTlVMTCkgewotCQkJcmVzdWx0ID0gYWZlX2NvbmZpZ19ybWNfYmxvY2soYWNkYl9ybWMpOwotCQkJaWYgKHJlc3VsdCkgewotCQkJCU1NX0VSUigiQUNEQj0+IEZhaWxlZCB0byBzZW5kIHJtYyIKLQkJCQkJIiBkYXRhIHRvIGFmZVxuIik7Ci0JCQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9IGVsc2UKLQkJCQlNTV9EQkcoIkFGRSBpcyBjYWxpYnJhdGVkIHdpdGggcm1jIHBhcmFtc1xuIik7Ci0JCX0gZWxzZQotCQkJTU1fREJHKCJSTUMgYmxvY2sgd2FzIG5vdCBmb3VuZFxuIik7Ci0JfQotCWlmICghYWNkYl9kYXRhLmZsZXVjZV9mZWF0dXJlX3N0YXR1c1thY2RiX2RhdGEucHJlcHJvY19zdHJlYW1faWRdKSB7Ci0JCXJlc3VsdCA9IGFjZGJfZmlsbF9hdWRwcmVwcm9jX2ZsdWVuY2UoKTsKLQkJaWYgKCEoSVNfRVJSX1ZBTFVFKHJlc3VsdCkpKSB7Ci0JCQlyZXN1bHQgPSBhdWRwcmVwcm9jX2RzcF9zZXRfbHZudigKLQkJCQkJJmFjZGJfZGF0YS5wcmVwcm9jX2x2bnYsCi0JCQkJCXNpemVvZihzdHJ1Y3RcCi0JCQkJCWF1ZHByZXByb2NfY21kX2NmZ19sdm52X3BhcmFtKSk7Ci0JCQlpZiAocmVzdWx0KSB7Ci0JCQkJTU1fRVJSKCJBQ0RCPT4gRmFpbGVkIHRvIHNlbmQgbHZudiAiCi0JCQkJCQkiZGF0YSB0byBwcmVwcm9jXG4iKTsKLQkJCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJCWdvdG8gZG9uZTsKLQkJCX0gZWxzZQotCQkJCU1NX0RCRygiQVVEUFJFUFJPQyBpcyBjYWxpYnJhdGVkIgotCQkJCQkJIiB3aXRoIGx2bnYgcGFyYW1ldGVyc1xuIik7Ci0JCX0gZWxzZQotCQkJTU1fRVJSKCJmbHVlbmNlIGJsb2NrIGlzIG5vdCBmb3VuZFxuIik7Ci0JfSBlbHNlCi0JCU1NX0RCRygiZmx1ZW5jZSBibG9jayBvdmVycmlkZVxuIik7Ci1kb25lOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBzMzIgYWNkYl9zZW5kX2NhbGlicmF0aW9uKHZvaWQpCi17Ci0JczMyIHJlc3VsdCA9IDA7Ci0KLQlpZiAoKGFjZGJfZGF0YS5kZXZpY2VfaW5mby0+ZGV2X3R5cGUgJiBSWF9ERVZJQ0UpID09IDEpIHsKLQkJcmVzdWx0ID0gYWNkYl9jYWxpYnJhdGVfYXVkcHAoKTsKLQkJaWYgKHJlc3VsdCkKLQkJCWdvdG8gZG9uZTsKLQl9IGVsc2UgaWYgKChhY2RiX2RhdGEuZGV2aWNlX2luZm8tPmRldl90eXBlICYgVFhfREVWSUNFKSA9PSAyKSB7Ci0JCXJlc3VsdCA9IGFjZGJfY2FsaWJyYXRlX2F1ZHByZXByb2MoKTsKLQkJaWYgKHJlc3VsdCkKLQkJCWdvdG8gZG9uZTsKLQkJaWYgKGFjZGJfZGF0YS5wcmVwcm9jX3N0cmVhbV9pZCA9PSAwKQotCQkJYWNkYl9kYXRhLmF1ZHJlY19hcHBsaWVkIHw9IEFVRFJFQzBfUkVBRFk7Ci0JCWVsc2UgaWYgKGFjZGJfZGF0YS5wcmVwcm9jX3N0cmVhbV9pZCA9PSAxKQotCQkJYWNkYl9kYXRhLmF1ZHJlY19hcHBsaWVkIHw9IEFVRFJFQzFfUkVBRFk7Ci0JCWVsc2UgaWYgKGFjZGJfZGF0YS5wcmVwcm9jX3N0cmVhbV9pZCA9PSAyKQotCQkJYWNkYl9kYXRhLmF1ZHJlY19hcHBsaWVkIHw9IEFVRFJFQzJfUkVBRFk7Ci0JCU1NX0RCRygiYWNkYl9kYXRhLmF1ZHJlY19hcHBsaWVkID0gJXhcbiIsCi0JCQkJCWFjZGJfZGF0YS5hdWRyZWNfYXBwbGllZCk7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdTggY2hlY2tfdHhfYWNkYl92YWx1ZXNfY2FjaGVkKHZvaWQpCi17Ci0JdTggc3RyZWFtX2lkICA9IGFjZGJfZGF0YS5wcmVwcm9jX3N0cmVhbV9pZDsKLQotCWlmICgoYWNkYl9kYXRhLmRldmljZV9pbmZvLT5kZXZfaWQgPT0KLQkJYWNkYl9jYWNoZV90eFtzdHJlYW1faWRdLmRldmljZV9pbmZvLmRldl9pZCkgJiYKLQkJKGFjZGJfZGF0YS5kZXZpY2VfaW5mby0+c2FtcGxlX3JhdGUgPT0KLQkJYWNkYl9jYWNoZV90eFtzdHJlYW1faWRdLmRldmljZV9pbmZvLnNhbXBsZV9yYXRlKSAmJgotCQkoYWNkYl9kYXRhLmRldmljZV9pbmZvLT5hY2RiX2lkID09Ci0JCWFjZGJfY2FjaGVfdHhbc3RyZWFtX2lkXS5kZXZpY2VfaW5mby5hY2RiX2lkKSAmJgotCQkoYWNkYl9jYWNoZV90eFtzdHJlYW1faWRdLm5vZGVfc3RhdHVzID09Ci0JCQkJCQlBQ0RCX1ZBTFVFU19GSUxMRUQpKQotCQlyZXR1cm4gMDsKLQllbHNlCi0JCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVfdHhfZGV2aWNlX3JlYWR5X2NhbGxiYWNrKHZvaWQpCi17Ci0JdTggaSA9IDA7Ci0JdTggcmV0ID0gMDsKLQl1OCBhY2RiX3ZhbHVlX2FwcGx5ID0gMDsKLQl1OCByZXN1bHQgPSAwOwotCXU4IHN0cmVhbV9pZCA9IGFjZGJfZGF0YS5wcmVwcm9jX3N0cmVhbV9pZDsKLQotCWlmIChhY2RiX2RhdGEubXVsdGlwbGVfc2Vzc2lvbnMpIHsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9BVURSRUNfU0VTU0lPTlM7IGkrKykgewotCQkJLypjaGVjayBpcyB0byBleGNsdWRlIGNvcHlpbmcgYWNkYiB2YWx1ZXMgaW4gdGhlCi0JCQljdXJyZW50IG5vZGUgcG9pbnRlZCBieSBhY2RiX2RhdGEgc3RydWN0dXJlKi8KLQkJCWlmIChhY2RiX2NhY2hlX3R4W2ldLnBoeXNfYWRkcl9hY2RiX3ZhbHVlcyAhPQotCQkJCQkJCWFjZGJfZGF0YS5waHlzX2FkZHIpIHsKLQkJCQlyZXQgPSBjaGVja19kZXZpY2VfaW5mb19hbHJlYWR5X3ByZXNlbnQoXAotCQkJCQkJCSphY2RiX2RhdGEuZGV2aWNlX2luZm8sCi0JCQkJCQkJJmFjZGJfY2FjaGVfdHhbaV0pOwotCQkJCWlmIChyZXQpIHsKLQkJCQkJbWVtY3B5KChjaGFyICopYWNkYl9jYWNoZV90eFtpXS5cCi0JCQkJCQl2aXJ0X2FkZHJfYWNkYl92YWx1ZXMsCi0JCQkJCQkoY2hhciAqKWFjZGJfZGF0YS52aXJ0X2FkZHIsCi0JCQkJCQkJCUFDREJfQlVGX1NJWkUpOwotCQkJCQlhY2RiX2NhY2hlX3R4W2ldLm5vZGVfc3RhdHVzID0KLQkJCQkJCQlBQ0RCX1ZBTFVFU19GSUxMRUQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFjZGJfZGF0YS5tdWx0aXBsZV9zZXNzaW9ucyA9IDA7Ci0JfQotCS8qY2hlY2sgd2hlYXRoZXIgQVVEUkVDIGVuYWJsZWQgYmVmb3JlIGRldmljZSBjYWxsIGJhY2tzKi8KLQlpZiAoKGFjZGJfZGF0YS5hY2RiX3N0YXRlICYgQVVEUkVDMF9SRUFEWSkgJiYKLQkJCSEoYWNkYl9kYXRhLmF1ZHJlY19hcHBsaWVkICYgQVVEUkVDMF9SRUFEWSkpIHsKLQkJTU1fREJHKCJBVURSRUMwIGFscmVhZHkgZW5hYmxlZCBhcHBseSBhY2RiIHZhbHVlc1xuIik7Ci0JCWFjZGJfdmFsdWVfYXBwbHkgfD0gQVVEUkVDMF9SRUFEWTsKLQl9IGVsc2UgaWYgKChhY2RiX2RhdGEuYWNkYl9zdGF0ZSAmIEFVRFJFQzFfUkVBRFkpICYmCi0JCQkhKGFjZGJfZGF0YS5hdWRyZWNfYXBwbGllZCAmIEFVRFJFQzFfUkVBRFkpKSB7Ci0JCU1NX0RCRygiQVVEUkVDMSBhbHJlYWR5IGVuYWJsZWQgYXBwbHkgYWNkYiB2YWx1ZXNcbiIpOwotCQlhY2RiX3ZhbHVlX2FwcGx5IHw9IEFVRFJFQzFfUkVBRFk7Ci0JfSBlbHNlIGlmICgoYWNkYl9kYXRhLmFjZGJfc3RhdGUgJiBBVURSRUMyX1JFQURZKSAmJgotCQkJIShhY2RiX2RhdGEuYXVkcmVjX2FwcGxpZWQgJiBBVURSRUMyX1JFQURZKSkgewotCQlNTV9EQkcoIkFVRFJFQzIgYWxyZWFkeSBlbmFibGVkIGFwcGx5IGFjZGIgdmFsdWVzXG4iKTsKLQkJYWNkYl92YWx1ZV9hcHBseSB8PSBBVURSRUMyX1JFQURZOwotCX0KLQlpZiAoYWNkYl92YWx1ZV9hcHBseSkgewotCQlpZiAoc2Vzc2lvbl9pbmZvW3N0cmVhbV9pZF0uc2FtcGxpbmdfZnJlcSkKLQkJCWFjZGJfZGF0YS5kZXZpY2VfaW5mby0+c2FtcGxlX3JhdGUgPQotCQkJCQlzZXNzaW9uX2luZm9bc3RyZWFtX2lkXS5zYW1wbGluZ19mcmVxOwotCQlyZXN1bHQgPSBjaGVja190eF9hY2RiX3ZhbHVlc19jYWNoZWQoKTsKLQkJaWYgKHJlc3VsdCkgewotCQkJcmVzdWx0ID0gYWNkYl9nZXRfY2FsaWJyYXRpb24oKTsKLQkJCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQkJTU1fRVJSKCJOb3QgYWJsZSB0byBnZXQgY2FsaWJyYXRpb24iCi0JCQkJCQkiIGRhdGEgY29udGludWVcbiIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlhY2RiX2NhY2hlX3R4W3N0cmVhbV9pZF0ubm9kZV9zdGF0dXMgPSBBQ0RCX1ZBTFVFU19GSUxMRUQ7Ci0JCWFjZGJfc2VuZF9jYWxpYnJhdGlvbigpOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBhY2RiX2NhY2hlX25vZGUgKmdldF9hY2RiX3ZhbHVlc19mcm9tX2NhY2hlX3R4KHUzMiBzdHJlYW1faWQpCi17Ci0JTU1fREJHKCJzZWFyY2hpbmcgbm9kZSB3aXRoIHN0cmVhbV9pZCAlZFxuIiwgc3RyZWFtX2lkKTsKLQlpZiAoKGFjZGJfY2FjaGVfdHhbc3RyZWFtX2lkXS5zdHJlYW1faWQgPT0gc3RyZWFtX2lkKSAmJgotCQkJKGFjZGJfY2FjaGVfdHhbc3RyZWFtX2lkXS5ub2RlX3N0YXR1cyA9PQotCQkJCQlBQ0RCX1ZBTFVFU19OT1RfRklMTEVEKSkgewotCQkJcmV0dXJuICZhY2RiX2NhY2hlX3R4W3N0cmVhbV9pZF07Ci0JfQotCU1NX0RCRygiRXJyb3IhIGluIGZpbmRpbmcgbm9kZVxuIik7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9hY2RiX2RhdGFfc3RydWN0KHN0cnVjdCBhY2RiX2NhY2hlX25vZGUgKmN1cl9ub2RlKQotewotCWlmIChjdXJfbm9kZSkgewotCQlhY2RiX2RhdGEuZGV2aWNlX2luZm8gPSAmY3VyX25vZGUtPmRldmljZV9pbmZvOwotCQlhY2RiX2RhdGEudmlydF9hZGRyID0gY3VyX25vZGUtPnZpcnRfYWRkcl9hY2RiX3ZhbHVlczsKLQkJYWNkYl9kYXRhLnBoeXNfYWRkciA9IGN1cl9ub2RlLT5waHlzX2FkZHJfYWNkYl92YWx1ZXM7Ci0JfSBlbHNlCi0JCU1NX0VSUigiZXJyb3IgaW4gY3VyZW50IG5vZGVcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBzZW5kX2FjZGJfdmFsdWVzX2Zvcl9hY3RpdmVfZGV2aWNlcyh2b2lkKQotewotCXUzMiBpID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPUFBfTk9ERV9TVVBQT1JURUQ7IGkrKykgewotCQlpZiAoYWNkYl9jYWNoZV9yeFtpXS5ub2RlX3N0YXR1cyA9PQotCQkJCQlBQ0RCX1ZBTFVFU19GSUxMRUQpIHsKLQkJCXVwZGF0ZV9hY2RiX2RhdGFfc3RydWN0KCZhY2RiX2NhY2hlX3J4W2ldKTsKLQkJCWlmIChhY2RiX2RhdGEuYWNkYl9zdGF0ZSAmIENBTF9EQVRBX1JFQURZKQotCQkJCWFjZGJfc2VuZF9jYWxpYnJhdGlvbigpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgczMyIGluaXRpYWxpemVfcnBjKHZvaWQpCi17Ci0JczMyIHJlc3VsdCA9IDA7Ci0KLQlyZXN1bHQgPSBkYWxkZXZpY2VfYXR0YWNoKERBTERFVklDRUlEX0FDREIsIEFDREJfUE9SVF9OQU1FLAotCQkJQUNEQl9DUFUsICZhY2RiX2RhdGEuaGFuZGxlKTsKLQotCWlmIChyZXN1bHQpIHsKLQkJTU1fRVJSKCJBQ0RCPT4gRGV2aWNlIEF0dGFjaCBmYWlsZWRcbiIpOwotCQlyZXN1bHQgPSAtRU5PREVWOwotCQlnb3RvIGRvbmU7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdTMyIGFsbG9jYXRlX21lbW9yeV9hY2RiX2NhY2hlX3R4KHZvaWQpCi17Ci0JdTMyIHJlc3VsdCA9IDA7Ci0JdTMyIGkgPSAwOwotCXUzMiBlcnIgPSAwOwotCS8qaW5pdGlhbGl6ZSBsb2NhbCBjYWNoZSAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfQVVEUkVDX1NFU1NJT05TOyBpKyspIHsKLQkJYWNkYl9jYWNoZV90eFtpXS5waHlzX2FkZHJfYWNkYl92YWx1ZXMgPQotCQkJCWFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKEFDREJfQlVGX1NJWkUsCi0JCQkJCQkJCVNaXzRLKTsKLQotCQlpZiAoIWFjZGJfY2FjaGVfdHhbaV0ucGh5c19hZGRyX2FjZGJfdmFsdWVzKSB7Ci0JCQlNTV9FUlIoIkFDREI9PiBDYW5ub3QgYWxsb2NhdGUgcGh5c2ljYWwgbWVtb3J5XG4iKTsKLQkJCXJlc3VsdCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWFjZGJfY2FjaGVfdHhbaV0ubWFwX3ZfYWRkciA9IGlvcmVtYXAoCi0JCQkJCWFjZGJfY2FjaGVfdHhbaV0ucGh5c19hZGRyX2FjZGJfdmFsdWVzLAotCQkJCQkJQUNEQl9CVUZfU0laRSk7Ci0JCWlmIChJU19FUlIoYWNkYl9jYWNoZV90eFtpXS5tYXBfdl9hZGRyKSkgewotCQkJTU1fRVJSKCJBQ0RCPT4gQ291bGQgbm90IG1hcCBwaHlzaWNhbCBhZGRyZXNzXG4iKTsKLQkJCXJlc3VsdCA9IC1FTk9NRU07Ci0JCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKAotCQkJCQlhY2RiX2NhY2hlX3R4W2ldLnBoeXNfYWRkcl9hY2RiX3ZhbHVlcyk7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWFjZGJfY2FjaGVfdHhbaV0udmlydF9hZGRyX2FjZGJfdmFsdWVzID0KLQkJCQkJYWNkYl9jYWNoZV90eFtpXS5tYXBfdl9hZGRyOwotCQltZW1zZXQoYWNkYl9jYWNoZV90eFtpXS52aXJ0X2FkZHJfYWNkYl92YWx1ZXMsIDAsCi0JCQkJCQlBQ0RCX0JVRl9TSVpFKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLWVycm9yOgotCWZvciAoZXJyID0gMDsgZXJyIDwgaTsgZXJyKyspIHsKLQkJaW91bm1hcChhY2RiX2NhY2hlX3R4W2Vycl0ubWFwX3ZfYWRkcik7Ci0JCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoCi0JCQkJYWNkYl9jYWNoZV90eFtlcnJdLnBoeXNfYWRkcl9hY2RiX3ZhbHVlcyk7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB1MzIgYWxsb2NhdGVfbWVtb3J5X2FjZGJfY2FjaGVfcngodm9pZCkKLXsKLQl1MzIgcmVzdWx0ID0gMDsKLQl1MzIgaSA9IDA7Ci0JdTMyIGVyciA9IDA7Ci0KLQkvKmluaXRpYWxpemUgbG9jYWwgY2FjaGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPUFBfTk9ERV9TVVBQT1JURUQ7IGkrKykgewotCQlhY2RiX2NhY2hlX3J4W2ldLnBoeXNfYWRkcl9hY2RiX3ZhbHVlcyA9Ci0JCQkJCWFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKAotCQkJCQkJQUNEQl9CVUZfU0laRSwgU1pfNEspOwotCi0JCWlmICghYWNkYl9jYWNoZV9yeFtpXS5waHlzX2FkZHJfYWNkYl92YWx1ZXMpIHsKLQkJCU1NX0VSUigiQUNEQj0+IENhbiBub3QgYWxsb2NhdGUgcGh5c2ljYWwgbWVtb3J5XG4iKTsKLQkJCXJlc3VsdCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWFjZGJfY2FjaGVfcnhbaV0ubWFwX3ZfYWRkciA9Ci0JCQkJaW9yZW1hcChhY2RiX2NhY2hlX3J4W2ldLnBoeXNfYWRkcl9hY2RiX3ZhbHVlcywKLQkJCQkJQUNEQl9CVUZfU0laRSk7Ci0JCWlmIChJU19FUlIoYWNkYl9jYWNoZV9yeFtpXS5tYXBfdl9hZGRyKSkgewotCQkJTU1fRVJSKCJBQ0RCPT4gQ291bGQgbm90IG1hcCBwaHlzaWNhbCBhZGRyZXNzXG4iKTsKLQkJCXJlc3VsdCA9IC1FTk9NRU07Ci0JCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKAotCQkJCQlhY2RiX2NhY2hlX3J4W2ldLnBoeXNfYWRkcl9hY2RiX3ZhbHVlcyk7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWFjZGJfY2FjaGVfcnhbaV0udmlydF9hZGRyX2FjZGJfdmFsdWVzID0KLQkJCQkJYWNkYl9jYWNoZV9yeFtpXS5tYXBfdl9hZGRyOwotCQltZW1zZXQoYWNkYl9jYWNoZV9yeFtpXS52aXJ0X2FkZHJfYWNkYl92YWx1ZXMsIDAsCi0JCQkJCQlBQ0RCX0JVRl9TSVpFKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLWVycm9yOgotCWZvciAoZXJyID0gMDsgZXJyIDwgaTsgZXJyKyspIHsKLQkJaW91bm1hcChhY2RiX2NhY2hlX3J4W2Vycl0ubWFwX3ZfYWRkcik7Ci0JCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoCi0JCQkJYWNkYl9jYWNoZV9yeFtlcnJdLnBoeXNfYWRkcl9hY2RiX3ZhbHVlcyk7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB1MzIgYWxsb2NhdGVfbWVtb3J5X2FjZGJfZ2V0X2Jsayh2b2lkKQotewotCXUzMiByZXN1bHQgPSAwOwotCWFjZGJfZGF0YS5nZXRfYmxrX3BhZGRyID0gYWxsb2NhdGVfY29udGlndW91c19lYmlfbm9tYXAoCi0JCQkJCQlBQ0RCX0JVRl9TSVpFLCBTWl80Syk7Ci0JaWYgKCFhY2RiX2RhdGEuZ2V0X2Jsa19wYWRkcikgewotCQlNTV9FUlIoIkFDREI9PiBDYW5ub3QgYWxsb2NhdGUgcGh5c2ljYWwgbWVtb3J5XG4iKTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JYWNkYl9kYXRhLm1hcF92X2dldF9ibGsgPSBpb3JlbWFwKGFjZGJfZGF0YS5nZXRfYmxrX3BhZGRyLAotCQkJCQlBQ0RCX0JVRl9TSVpFKTsKLQlpZiAoSVNfRVJSKGFjZGJfZGF0YS5tYXBfdl9nZXRfYmxrKSkgewotCQlNTV9FUlIoIkFDREI9PiBDb3VsZCBub3QgbWFwIHBoeXNpY2FsIGFkZHJlc3NcbiIpOwotCQlyZXN1bHQgPSAtRU5PTUVNOwotCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKAotCQkJCQlhY2RiX2RhdGEuZ2V0X2Jsa19wYWRkcik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWFjZGJfZGF0YS5nZXRfYmxrX2t2YWRkciA9IGFjZGJfZGF0YS5tYXBfdl9nZXRfYmxrOwotCW1lbXNldChhY2RiX2RhdGEuZ2V0X2Jsa19rdmFkZHIsIDAsIEFDREJfQlVGX1NJWkUpOwotZXJyb3I6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgZnJlZV9tZW1vcnlfYWNkYl9jYWNoZV9yeCh2b2lkKQotewotCXUzMiBpID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09QUF9OT0RFX1NVUFBPUlRFRDsgaSsrKSB7Ci0JCWlvdW5tYXAoYWNkYl9jYWNoZV9yeFtpXS5tYXBfdl9hZGRyKTsKLQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcigKLQkJCQlhY2RiX2NhY2hlX3J4W2ldLnBoeXNfYWRkcl9hY2RiX3ZhbHVlcyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBmcmVlX21lbW9yeV9hY2RiX2NhY2hlX3R4KHZvaWQpCi17Ci0JdTMyIGkgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9BVURSRUNfU0VTU0lPTlM7IGkrKykgewotCQlpb3VubWFwKGFjZGJfY2FjaGVfdHhbaV0ubWFwX3ZfYWRkcik7Ci0JCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoCi0JCQkJYWNkYl9jYWNoZV90eFtpXS5waHlzX2FkZHJfYWNkYl92YWx1ZXMpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZnJlZV9tZW1vcnlfYWNkYl9nZXRfYmxrKHZvaWQpCi17Ci0JaW91bm1hcChhY2RiX2RhdGEubWFwX3ZfZ2V0X2Jsayk7Ci0JZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcihhY2RiX2RhdGEuZ2V0X2Jsa19wYWRkcik7Ci19Ci0KLXN0YXRpYyBzMzIgaW5pdGlhbGl6ZV9tZW1vcnkodm9pZCkKLXsKLQlzMzIgcmVzdWx0ID0gMDsKLQotCXJlc3VsdCA9IGFsbG9jYXRlX21lbW9yeV9hY2RiX2dldF9ibGsoKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlNTV9FUlIoIm1lbW9yeSBhbGxvY2F0aW9uIGZvciBnZXQgYmxrIGZhaWxlZFxuIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXN1bHQgPSBhbGxvY2F0ZV9tZW1vcnlfYWNkYl9jYWNoZV9yeCgpOwotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCU1NX0VSUigibWVtb3J5IGFsbG9jYXRpb24gZm9yIHJ4IGNhY2hlIGlzIGZhaWxlZFxuIik7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfZ2V0X2JsaygpOwotCQlnb3RvIGRvbmU7Ci0JfQotCXJlc3VsdCA9IGFsbG9jYXRlX21lbW9yeV9hY2RiX2NhY2hlX3R4KCk7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJTU1fRVJSKCJtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdHggY2FjaGUgaXMgZmFpbGVkXG4iKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9nZXRfYmxrKCk7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfY2FjaGVfcngoKTsKLQkJZ290byBkb25lOwotCX0KLQlhY2RiX2RhdGEucHBfaWlyID0ga21hbGxvYyhzaXplb2YoKmFjZGJfZGF0YS5wcF9paXIpLAotCQlHRlBfS0VSTkVMKTsKLQlpZiAoYWNkYl9kYXRhLnBwX2lpciA9PSBOVUxMKSB7Ci0JCU1NX0VSUigiQUNEQj0+IENvdWxkIG5vdCBhbGxvY2F0ZSBwb3N0cHJvYyBpaXIgbWVtb3J5XG4iKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9nZXRfYmxrKCk7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfY2FjaGVfcngoKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9jYWNoZV90eCgpOwotCQlyZXN1bHQgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYWNkYl9kYXRhLnBwX21iYWRyYyA9IGttYWxsb2Moc2l6ZW9mKCphY2RiX2RhdGEucHBfbWJhZHJjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGFjZGJfZGF0YS5wcF9tYmFkcmMgPT0gTlVMTCkgewotCQlNTV9FUlIoIkFDREI9PiBDb3VsZCBub3QgYWxsb2NhdGUgcG9zdHByb2MgbWJhZHJjIG1lbW9yeVxuIik7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfZ2V0X2JsaygpOwotCQlmcmVlX21lbW9yeV9hY2RiX2NhY2hlX3J4KCk7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfY2FjaGVfdHgoKTsKLQkJa2ZyZWUoYWNkYl9kYXRhLnBwX2lpcik7Ci0JCXJlc3VsdCA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYWNkYl9kYXRhLmNhbGliX2dhaW5fcnggPSBrbWFsbG9jKHNpemVvZigqYWNkYl9kYXRhLmNhbGliX2dhaW5fcngpLAotCQkJCQkJCUdGUF9LRVJORUwpOwotCWlmIChhY2RiX2RhdGEuY2FsaWJfZ2Fpbl9yeCA9PSBOVUxMKSB7Ci0JCU1NX0VSUigiQUNEQj0+IENvdWxkIG5vdCBhbGxvY2F0ZSIKLQkJCSIgcG9zdHByb2MgY2FsaWJfZ2Fpbl9yeCBtZW1vcnlcbiIpOwotCQlmcmVlX21lbW9yeV9hY2RiX2dldF9ibGsoKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9jYWNoZV9yeCgpOwotCQlmcmVlX21lbW9yeV9hY2RiX2NhY2hlX3R4KCk7Ci0JCWtmcmVlKGFjZGJfZGF0YS5wcF9paXIpOwotCQlrZnJlZShhY2RiX2RhdGEucHBfbWJhZHJjKTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCWFjZGJfZGF0YS5wcmVwcm9jX2FnYyA9IGttYWxsb2Moc2l6ZW9mKCphY2RiX2RhdGEucHJlcHJvY19hZ2MpLAotCQkJCQkJCUdGUF9LRVJORUwpOwotCWlmIChhY2RiX2RhdGEucHJlcHJvY19hZ2MgPT0gTlVMTCkgewotCQlNTV9FUlIoIkFDREI9PiBDb3VsZCBub3QgYWxsb2NhdGUgcHJlcHJvYyBhZ2MgbWVtb3J5XG4iKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9nZXRfYmxrKCk7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfY2FjaGVfcngoKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9jYWNoZV90eCgpOwotCQlrZnJlZShhY2RiX2RhdGEucHBfaWlyKTsKLQkJa2ZyZWUoYWNkYl9kYXRhLnBwX21iYWRyYyk7Ci0JCWtmcmVlKGFjZGJfZGF0YS5jYWxpYl9nYWluX3J4KTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCWFjZGJfZGF0YS5wcmVwcm9jX2lpciA9IGttYWxsb2Moc2l6ZW9mKCphY2RiX2RhdGEucHJlcHJvY19paXIpLAotCQkJCQkJCUdGUF9LRVJORUwpOwotCWlmIChhY2RiX2RhdGEucHJlcHJvY19paXIgPT0gTlVMTCkgewotCQlNTV9FUlIoIkFDREI9PiBDb3VsZCBub3QgYWxsb2NhdGUgcHJlcHJvYyBpaXIgbWVtb3J5XG4iKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9nZXRfYmxrKCk7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfY2FjaGVfcngoKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9jYWNoZV90eCgpOwotCQlrZnJlZShhY2RiX2RhdGEucHBfaWlyKTsKLQkJa2ZyZWUoYWNkYl9kYXRhLnBwX21iYWRyYyk7Ci0JCWtmcmVlKGFjZGJfZGF0YS5jYWxpYl9nYWluX3J4KTsKLQkJa2ZyZWUoYWNkYl9kYXRhLnByZXByb2NfYWdjKTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQlhY2RiX2RhdGEuY2FsaWJfZ2Fpbl90eCA9IGttYWxsb2Moc2l6ZW9mKCphY2RiX2RhdGEuY2FsaWJfZ2Fpbl90eCksCi0JCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGFjZGJfZGF0YS5jYWxpYl9nYWluX3R4ID09IE5VTEwpIHsKLQkJTU1fRVJSKCJBQ0RCPT4gQ291bGQgbm90IGFsbG9jYXRlIgotCQkJIiBwcmVwcm9jIGNhbGliX2dhaW5fdHggbWVtb3J5XG4iKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9nZXRfYmxrKCk7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfY2FjaGVfcngoKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9jYWNoZV90eCgpOwotCQlrZnJlZShhY2RiX2RhdGEucHBfaWlyKTsKLQkJa2ZyZWUoYWNkYl9kYXRhLnBwX21iYWRyYyk7Ci0JCWtmcmVlKGFjZGJfZGF0YS5jYWxpYl9nYWluX3J4KTsKLQkJa2ZyZWUoYWNkYl9kYXRhLnByZXByb2NfYWdjKTsKLQkJa2ZyZWUoYWNkYl9kYXRhLnByZXByb2NfaWlyKTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQlhY2RiX2RhdGEucGJlX2Jsb2NrID0ga21hbGxvYyhzaXplb2YoKmFjZGJfZGF0YS5wYmVfYmxvY2spLAotCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGFjZGJfZGF0YS5wYmVfYmxvY2sgPT0gTlVMTCkgewotCQlNTV9FUlIoIkFDREI9PiBDb3VsZCBub3QgYWxsb2NhdGUgcGJlX2Jsb2NrIG1lbW9yeVxuIik7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfZ2V0X2JsaygpOwotCQlmcmVlX21lbW9yeV9hY2RiX2NhY2hlX3J4KCk7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfY2FjaGVfdHgoKTsKLQkJa2ZyZWUoYWNkYl9kYXRhLnBwX2lpcik7Ci0JCWtmcmVlKGFjZGJfZGF0YS5wcF9tYmFkcmMpOwotCQlrZnJlZShhY2RiX2RhdGEuY2FsaWJfZ2Fpbl9yeCk7Ci0JCWtmcmVlKGFjZGJfZGF0YS5wcmVwcm9jX2FnYyk7Ci0JCWtmcmVlKGFjZGJfZGF0YS5wcmVwcm9jX2lpcik7Ci0JCWtmcmVlKGFjZGJfZGF0YS5jYWxpYl9nYWluX3R4KTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQlhY2RiX2RhdGEucGJlX2V4dGJ1ZmYgPSAodTE2ICopIGFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKAotCQkJCQkJUEJFX0JVRl9TSVpFLCBTWl80Syk7Ci0JaWYgKCFhY2RiX2RhdGEucGJlX2V4dGJ1ZmYpIHsKLQkJTU1fRVJSKCJBQ0RCPT4gQ2Fubm90IGFsbG9jYXRlIHBoeXNpY2FsIG1lbW9yeVxuIik7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfZ2V0X2JsaygpOwotCQlmcmVlX21lbW9yeV9hY2RiX2NhY2hlX3J4KCk7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfY2FjaGVfdHgoKTsKLQkJa2ZyZWUoYWNkYl9kYXRhLnBwX2lpcik7Ci0JCWtmcmVlKGFjZGJfZGF0YS5wcF9tYmFkcmMpOwotCQlrZnJlZShhY2RiX2RhdGEuY2FsaWJfZ2Fpbl9yeCk7Ci0JCWtmcmVlKGFjZGJfZGF0YS5wcmVwcm9jX2FnYyk7Ci0JCWtmcmVlKGFjZGJfZGF0YS5wcmVwcm9jX2lpcik7Ci0JCWtmcmVlKGFjZGJfZGF0YS5jYWxpYl9nYWluX3R4KTsKLQkJa2ZyZWUoYWNkYl9kYXRhLnBiZV9ibG9jayk7Ci0JCXJlc3VsdCA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYWNkYl9kYXRhLmZsdWVuY2VfZXh0YnVmZiA9IGFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKAotCQkJCQlGTFVFTkNFX0JVRl9TSVpFLCBTWl80Syk7Ci0JaWYgKCFhY2RiX2RhdGEuZmx1ZW5jZV9leHRidWZmKSB7Ci0JCU1NX0VSUigiQUNEQj0+IGNhbm5vdCBhbGxvY2F0ZSBwaHlzaWNhbCBtZW1vcnkgZm9yICIKLQkJCQkJImZsdWVuY2UgYmxvY2tcbiIpOwotCQlmcmVlX21lbW9yeV9hY2RiX2dldF9ibGsoKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9jYWNoZV9yeCgpOwotCQlmcmVlX21lbW9yeV9hY2RiX2NhY2hlX3R4KCk7Ci0JCWtmcmVlKGFjZGJfZGF0YS5wcF9paXIpOwotCQlrZnJlZShhY2RiX2RhdGEucHBfbWJhZHJjKTsKLQkJa2ZyZWUoYWNkYl9kYXRhLmNhbGliX2dhaW5fcngpOwotCQlrZnJlZShhY2RiX2RhdGEucHJlcHJvY19hZ2MpOwotCQlrZnJlZShhY2RiX2RhdGEucHJlcHJvY19paXIpOwotCQlrZnJlZShhY2RiX2RhdGEuY2FsaWJfZ2Fpbl90eCk7Ci0JCWtmcmVlKGFjZGJfZGF0YS5wYmVfYmxvY2spOwotCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKChpbnQzMl90KWFjZGJfZGF0YS5wYmVfZXh0YnVmZik7Ci0JCXJlc3VsdCA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYWNkYl9kYXRhLm1hcF92X2ZsdWVuY2UgPSBpb3JlbWFwKAotCQkJCWFjZGJfZGF0YS5mbHVlbmNlX2V4dGJ1ZmYsCi0JCQkJRkxVRU5DRV9CVUZfU0laRSk7Ci0JaWYgKElTX0VSUihhY2RiX2RhdGEubWFwX3ZfZmx1ZW5jZSkpIHsKLQkJTU1fRVJSKCJBQ0RCPT4gQ291bGQgbm90IG1hcCBwaHlzaWNhbCBhZGRyZXNzXG4iKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9nZXRfYmxrKCk7Ci0JCWZyZWVfbWVtb3J5X2FjZGJfY2FjaGVfcngoKTsKLQkJZnJlZV9tZW1vcnlfYWNkYl9jYWNoZV90eCgpOwotCQlrZnJlZShhY2RiX2RhdGEucHBfaWlyKTsKLQkJa2ZyZWUoYWNkYl9kYXRhLnBwX21iYWRyYyk7Ci0JCWtmcmVlKGFjZGJfZGF0YS5jYWxpYl9nYWluX3J4KTsKLQkJa2ZyZWUoYWNkYl9kYXRhLnByZXByb2NfYWdjKTsKLQkJa2ZyZWUoYWNkYl9kYXRhLnByZXByb2NfaWlyKTsKLQkJa2ZyZWUoYWNkYl9kYXRhLmNhbGliX2dhaW5fdHgpOwotCQlrZnJlZShhY2RiX2RhdGEucGJlX2Jsb2NrKTsKLQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcigKLQkJCQkoaW50MzJfdClhY2RiX2RhdGEucGJlX2V4dGJ1ZmYpOwotCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKAotCQkJCShpbnQzMl90KWFjZGJfZGF0YS5mbHVlbmNlX2V4dGJ1ZmYpOwotCQlyZXN1bHQgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfSBlbHNlCi0JCWFjZGJfZGF0YS5mbHVlbmNlX2V4dGJ1ZmZfdmlydCA9Ci0JCQkJCWFjZGJfZGF0YS5tYXBfdl9mbHVlbmNlOwotZG9uZToKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdTMyIGZyZWVfYWNkYl9jYWNoZV9ub2RlKHVuaW9uIGF1ZGRldl9ldnRfZGF0YSAqZXZ0KQotewotCXUzMiBzZXNzaW9uX2lkOwotCWlmICgoZXZ0LT5hdWRjYWxfaW5mby5kZXZfdHlwZSAmIFRYX0RFVklDRSkgPT0gMikgewotCQkvKlNlY29uZCBhcmd1bWVudCB0byBmaW5kX2ZpcnN0X2JpdCBzaG91bGQgYmUgbWF4aW11bSBudW1iZXIKLQkJb2YgYml0cyBpbnRlcmVzdGVkCi0JCSovCi0JCXNlc3Npb25faWQgPSBmaW5kX2ZpcnN0X2JpdCgKLQkJCQkodW5zaWduZWQgbG9uZyAqKSYoZXZ0LT5hdWRjYWxfaW5mby5zZXNzaW9ucyksCi0JCQkJc2l6ZW9mKGV2dC0+YXVkY2FsX2luZm8uc2Vzc2lvbnMpICogOCk7Ci0JCU1NX0RCRygiZnJlZWluZyBub2RlICVkIGZvciB0eCBkZXZpY2UiLCBzZXNzaW9uX2lkKTsKLQkJYWNkYl9jYWNoZV90eFtzZXNzaW9uX2lkXS4KLQkJCW5vZGVfc3RhdHVzID0gQUNEQl9WQUxVRVNfTk9UX0ZJTExFRDsKLQl9IGVsc2UgewotCQkJTU1fREJHKCJmcmVlaW5nIHJ4IGNhY2hlIG5vZGUgJWRcbiIsCi0JCQkJCQlldnQtPmF1ZGNhbF9pbmZvLmRldl9pZCk7Ci0JCQlhY2RiX2NhY2hlX3J4W2V2dC0+YXVkY2FsX2luZm8uZGV2X2lkXS4KLQkJCQlub2RlX3N0YXR1cyA9IEFDREJfVkFMVUVTX05PVF9GSUxMRUQ7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTggY2hlY2tfZGV2aWNlX2NoYW5nZShzdHJ1Y3QgYXVkZGV2X2V2dF9hdWRjYWxfaW5mbyBhdWRjYWxfaW5mbykKLXsKLQlpZiAoIWFjZGJfZGF0YS5kZXZpY2VfaW5mbykgewotCQlNTV9FUlIoIm5vdCBwb2ludGluZyB0byBwcmV2aW91cyB2YWxpZCBkZXZpY2UgZGV0YWlsXG4iKTsKLQkJcmV0dXJuIDE7IC8qZGV2aWNlIGluZm8gd2lsbCBub3QgYmUgcG9pbnRpbmcgdG8qLwotCQkJLyogdmFsaWQgZGV2aWNlIHdoZW4gYWNkYiBkcml2ZXIgY29tZXMgdXAqLwotCX0KLQlpZiAoKGF1ZGNhbF9pbmZvLmRldl9pZCA9PSBhY2RiX2RhdGEuZGV2aWNlX2luZm8tPmRldl9pZCkgJiYKLQkJKGF1ZGNhbF9pbmZvLnNhbXBsZV9yYXRlID09Ci0JCQkJYWNkYl9kYXRhLmRldmljZV9pbmZvLT5zYW1wbGVfcmF0ZSkgJiYKLQkJKGF1ZGNhbF9pbmZvLmFjZGJfaWQgPT0gYWNkYl9kYXRhLmRldmljZV9pbmZvLT5hY2RiX2lkKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRldmljZV9jYih1MzIgZXZ0X2lkLCB1bmlvbiBhdWRkZXZfZXZ0X2RhdGEgKmV2dCwgdm9pZCAqcHJpdmF0ZSkKLXsKLQlzdHJ1Y3QgYXVkZGV2X2V2dF9hdWRjYWxfaW5mbwlhdWRjYWxfaW5mbzsKLQlzdHJ1Y3QgYWNkYl9jYWNoZV9ub2RlICphY2RiX2NhY2hlX2ZyZWVfbm9kZSA9ICBOVUxMOwotCXUzMiBzdHJlYW1faWQgPSAwOwotCXU4IHJldCA9IDA7Ci0JdTggY291bnQgPSAwOwotCXU4IGkgPSAwOwotCXU4IGRldmljZV9jaGFuZ2UgPSAwOwotCi0JaWYgKCEoKGV2dF9pZCA9PSBBVURERVZfRVZUX0RFVl9SRFkpIHx8Ci0JCShldnRfaWQgPT0gQVVEREVWX0VWVF9ERVZfUkxTKSkpIHsKLQkJZ290byBkb25lOwotCX0KLQkvKmlmIHNlc3Npb24gdmFsdWUgaXMgemVybyBpdCBpbmRpY2F0ZXMgdGhhdCBkZXZpY2UgY2FsbCBiYWNrIGlzIGZvcgotCXZvaWNlIGNhbGwgd2Ugd2lsbCBkcm9wIHRoZSByZXF1ZXN0IGFzIGFjZGIgdmFsdWVzIGZvciB2b2ljZSBjYWxsIGlzCi0Jbm90IGFwcGxpZWQgZnJvbSBhY2RiIGRyaXZlciovCi0JaWYgKCFldnQtPmF1ZGNhbF9pbmZvLnNlc3Npb25zKSB7Ci0JCU1NX0RCRygibm8gYWN0aXZlIHNlc3Npb25zIGFuZCBjYWxsIGJhY2sgaXMgZm9yIgotCQkJCSIgdm9pY2UgY2FsbFxuIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKGV2dF9pZCA9PSBBVURERVZfRVZUX0RFVl9STFMpIHsKLQkJTU1fREJHKCJnb3QgcmVsZWFzZSBjb21tYW5kIGZvciBkZXYgJWRcbiIsCi0JCQkJCWV2dC0+YXVkY2FsX2luZm8uZGV2X2lkKTsKLQkJYWNkYl9kYXRhLmFjZGJfc3RhdGUgJj0gfkNBTF9EQVRBX1JFQURZOwotCQlmcmVlX2FjZGJfY2FjaGVfbm9kZShldnQpOwotCQkvKnJlc2V0IHRoZSBhcHBsaWVkIGZsYWcgZm9yIHRoZSBzZXNzaW9uIHJvdXRlZCB0byB0aGUgZGV2aWNlKi8KLQkJYWNkYl9kYXRhLmF1ZHJlY19hcHBsaWVkICY9IH4oZXZ0LT5hdWRjYWxfaW5mby5zZXNzaW9ucwotCQkJCQkJCTw8IEFVRFJFQ19PRkZTRVQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICgoKGV2dC0+YXVkY2FsX2luZm8uZGV2X3R5cGUgJiBSWF9ERVZJQ0UpID09IDEpICYmCi0JCQkoZXZ0LT5hdWRjYWxfaW5mby5hY2RiX2lkID09IFBTRVVET19BQ0RCX0lEKSkgewotCQlNTV9JTkZPKCJkZXZpY2UgY2IgaXMgZm9yIHJ4IGRldmljZSB3aXRoIHBzZXVkbyBhY2RiIGlkXG4iKTsKLQkJZ290byBkb25lOwotCX0KLQlhdWRjYWxfaW5mbyA9IGV2dC0+YXVkY2FsX2luZm87Ci0JTU1fREJHKCJkZXZfaWQgPSAlZFxuIiwgYXVkY2FsX2luZm8uZGV2X2lkKTsKLQlNTV9EQkcoInNhbXBsZV9yYXRlID0gJWRcbiIsIGF1ZGNhbF9pbmZvLnNhbXBsZV9yYXRlKTsKLQlNTV9EQkcoImFjZGJfaWQgPSAlZFxuIiwgYXVkY2FsX2luZm8uYWNkYl9pZCk7Ci0JTU1fREJHKCJzZXNzaW9ucyA9ICVkXG4iLCBhdWRjYWxfaW5mby5zZXNzaW9ucyk7Ci0JTU1fREJHKCJhY2RiX3N0YXRlID0gJXhcbiIsIGFjZGJfZGF0YS5hY2RiX3N0YXRlKTsKLQltdXRleF9sb2NrKCZhY2RiX2RhdGEuYWNkYl9tdXRleCk7Ci0JZGV2aWNlX2NoYW5nZSA9IGNoZWNrX2RldmljZV9jaGFuZ2UoYXVkY2FsX2luZm8pOwotCWlmICghZGV2aWNlX2NoYW5nZSkgewotCQlpZiAoKGF1ZGNhbF9pbmZvLmRldl90eXBlICYgVFhfREVWSUNFKSA9PSAyKSB7Ci0JCQlpZiAoIShhY2RiX2RhdGEuYWNkYl9zdGF0ZSAmIEFVRFJFQzBfUkVBRFkpKQotCQkJCWFjZGJfZGF0YS5hdWRyZWNfYXBwbGllZCAmPSB+QVVEUkVDMF9SRUFEWTsKLQkJCWlmICghKGFjZGJfZGF0YS5hY2RiX3N0YXRlICYgQVVEUkVDMV9SRUFEWSkpCi0JCQkJYWNkYl9kYXRhLmF1ZHJlY19hcHBsaWVkICY9IH5BVURSRUMxX1JFQURZOwotCQkJaWYgKCEoYWNkYl9kYXRhLmFjZGJfc3RhdGUgJiBBVURSRUMyX1JFQURZKSkKLQkJCQlhY2RiX2RhdGEuYXVkcmVjX2FwcGxpZWQgJj0gfkFVRFJFQzJfUkVBRFk7Ci0JCQkJYWNkYl9kYXRhLmFjZGJfc3RhdGUgJj0gfkNBTF9EQVRBX1JFQURZOwotCQkJCWdvdG8gdXBkYXRlX2NhY2hlOwotCQl9Ci0JfSBlbHNlCi0JCS8qIHN0YXRlIGlzIHVwZGF0ZWQgdG8gcXVlcnJ5IHRoZSBtb2RlbSBmb3IgdmFsdWVzICovCi0JCWFjZGJfZGF0YS5hY2RiX3N0YXRlICY9IH5DQUxfREFUQV9SRUFEWTsKLQotdXBkYXRlX2NhY2hlOgotCWlmICgoYXVkY2FsX2luZm8uZGV2X3R5cGUgJiBUWF9ERVZJQ0UpID09IDIpIHsKLQkJLypsb29wIGlzIHRvIHRha2UgY2FyZSBvZiB1c2UgY2FzZTotIG11bHRpcGxlIEF1ZHJlYwotCQlzZXNzaW9ucyBhcmUgcm91dGVkIGJlZm9yZSBlbmFibGluZyB0aGUgZGV2aWNlIGluIHRoaXMgdXNlCi0JCWNhc2Ugd2Ugd2lsbCBnZXQgdGhlIHNlc3Npb25zIHZhbHVlIGFzIGJpdHMgc2V0IGZvciBhbGwgdGhlCi0JCXNlc3Npb25zIHJvdXRlZCBiZWZvcmUgZGV2aWNlIGVuYWJsZSwgc28gd2Ugc2hvdWxkIHRha2UgY2FyZQotCQlvZiBjb3B5aW5nIGRldmljZSBpbmZvIHRvIGFsbCB0aGUgc2Vzc2lvbnMqLwotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0FVRFJFQ19TRVNTSU9OUzsgaSsrKSB7Ci0JCQlzdHJlYW1faWQgPSAoKGF1ZGNhbF9pbmZvLnNlc3Npb25zID4+IGkpICYgMHgwMSk7Ci0JCQlpZiAoc3RyZWFtX2lkKSB7Ci0JCQkJYWNkYl9jYWNoZV9mcmVlX25vZGUgPQkmYWNkYl9jYWNoZV90eFtpXTsKLQkJCQlyZXQgID0gY2hlY2tfZGV2aWNlX2luZm9fYWxyZWFkeV9wcmVzZW50KAotCQkJCQkJCWF1ZGNhbF9pbmZvLAotCQkJCQkJCWFjZGJfY2FjaGVfZnJlZV9ub2RlKTsKLQkJCQlhY2RiX2NhY2hlX2ZyZWVfbm9kZS0+c3RyZWFtX2lkID0gaTsKLQkJCQlhY2RiX2RhdGEuY3VyX3R4X3Nlc3Npb24gPSBpOwotCQkJCWNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvdW50ID4gMSkKLQkJCWFjZGJfZGF0YS5tdWx0aXBsZV9zZXNzaW9ucyA9IDE7Ci0JfSBlbHNlIHsKLQkJYWNkYl9jYWNoZV9mcmVlX25vZGUgPSAmYWNkYl9jYWNoZV9yeFthdWRjYWxfaW5mby5kZXZfaWRdOwotCQlyZXQgPSBjaGVja19kZXZpY2VfaW5mb19hbHJlYWR5X3ByZXNlbnQoYXVkY2FsX2luZm8sCi0JCQkJCQlhY2RiX2NhY2hlX2ZyZWVfbm9kZSk7Ci0JCWlmIChyZXQgPT0gMSkgewotCQkJTU1fREJHKCJnb3QgZGV2aWNlIHJlYWR5IGNhbGwgYmFjayBmb3IgYW5vdGhlciAiCi0JCQkJCSJhdWRwbGF5IHRhc2sgc2Vzc2lvbnMgb24gc2FtZSBDT1BQXG4iKTsKLQkJCS8qc3RyZWFtX2lkIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBudW1iZXIgb2YgYWN0aXZlKi8KLQkJCS8qc2Vzc2lvbnMgYWN0aXZlIG9uIHRoaXMgZGV2aWNlKi8KLQkJCWFjZGJfY2FjaGVfZnJlZV9ub2RlLT5zdHJlYW1faWQrKzsKLQkJCW11dGV4X3VubG9jaygmYWNkYl9kYXRhLmFjZGJfbXV0ZXgpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCWFjZGJfY2FjaGVfZnJlZV9ub2RlLT5zdHJlYW1faWQrKzsKLQl9Ci0JdXBkYXRlX2FjZGJfZGF0YV9zdHJ1Y3QoYWNkYl9jYWNoZV9mcmVlX25vZGUpOwotCWFjZGJfZGF0YS5kZXZpY2VfY2JfY29tcGwgPSAxOwotCW11dGV4X3VubG9jaygmYWNkYl9kYXRhLmFjZGJfbXV0ZXgpOwotCXdha2VfdXAoJmFjZGJfZGF0YS53YWl0KTsKLWRvbmU6Ci0JcmV0dXJuOwotfQotCi0KLXN0YXRpYyBzMzIgcmVnaXN0ZXJfZGV2aWNlX2NiKHZvaWQpCi17Ci0JczMyIHJlc3VsdCA9IDA7Ci0KLQlyZXN1bHQgPSBhdWRkZXZfcmVnaXN0ZXJfZXZ0X2xpc3RuZXIoKEFVRERFVl9FVlRfREVWX1JEWQotCQkJCQkJfCBBVURERVZfRVZUX0RFVl9STFMpLAotCQlBVURERVZfQ0xOVF9BVURJT0NBTCwgMCwgZGV2aWNlX2NiLCAodm9pZCAqKSZhY2RiX2RhdGEpOwotCi0JaWYgKHJlc3VsdCkgewotCQlNTV9FUlIoIkFDREI9PiBDb3VsZCBub3QgcmVnaXN0ZXIgZGV2aWNlIGNhbGxiYWNrXG4iKTsKLQkJcmVzdWx0ID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgYXVkcHBfY2Iodm9pZCAqcHJpdmF0ZSwgdTMyIGlkLCB1MTYgKm1zZykKLXsKLQlNTV9EQkcoIlxuIik7Ci0JaWYgKGlkICE9IEFVRFBQX01TR19DRkdfTVNHKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAobXNnWzBdID09IEFVRFBQX01TR19FTkFfRElTKSB7Ci0JCWlmICgtLWFjZGJfY2FjaGVfcnhbYWNkYl9kYXRhLlwKLQkJCQlkZXZpY2VfaW5mby0+ZGV2X2lkXS5zdHJlYW1faWQgPD0gMCkgewotCQkJYWNkYl9kYXRhLmFjZGJfc3RhdGUgJj0gfkFVRFBQX1JFQURZOwotCQkJYWNkYl9jYWNoZV9yeFthY2RiX2RhdGEuZGV2aWNlX2luZm8tPmRldl9pZF1cCi0JCQkJCS5zdHJlYW1faWQgPSAwOwotCQkJTU1fREJHKCJBVURQUF9NU0dfRU5BX0RJU1xuIik7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQotCWFjZGJfZGF0YS5hY2RiX3N0YXRlIHw9IEFVRFBQX1JFQURZOwotCWFjZGJfZGF0YS5hdWRwcF9jYl9jb21wbCA9IDE7Ci0Jd2FrZV91cCgmYWNkYl9kYXRhLndhaXQpOwotZG9uZToKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBzOCBoYW5kbGVfYXVkcHJlcHJvY19jYih2b2lkKQotewotCXN0cnVjdCBhY2RiX2NhY2hlX25vZGUgKmFjZGJfY2FjaGVkX3ZhbHVlczsKLQlzOCByZXN1bHQgPSAwOwotCXU4IHN0cmVhbV9pZCA9IGFjZGJfZGF0YS5wcmVwcm9jX3N0cmVhbV9pZDsKLQlhY2RiX2RhdGEucHJlcHJvY19jYl9jb21wbCA9IDA7Ci0JYWNkYl9jYWNoZWRfdmFsdWVzID0gZ2V0X2FjZGJfdmFsdWVzX2Zyb21fY2FjaGVfdHgoc3RyZWFtX2lkKTsKLQlpZiAoYWNkYl9jYWNoZWRfdmFsdWVzID09IE5VTEwpIHsKLQkJTU1fREJHKCJFUlJPUjogdG8gZ2V0IGNoYWNoZWQgYWNkYiB2YWx1ZXNcbiIpOwotCQlyZXR1cm4gLUVQRVJNOwotCX0KLQl1cGRhdGVfYWNkYl9kYXRhX3N0cnVjdChhY2RiX2NhY2hlZF92YWx1ZXMpOwotCWlmIChhY2RiX2RhdGEuZGV2aWNlX2luZm8tPmRldl9pZCA9PSBQU0VVRE9fQUNEQl9JRCkgewotCQlNTV9JTkZPKCJhdWRwcmVwcm9jIGlzIHJvdXRlZCB0byBwc2V1ZG8gZGV2aWNlXG4iKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JaWYgKGFjZGJfZGF0YS5idWlsZF9pZFsxN10gPT0gJzEnKSB7Ci0JCWlmIChzZXNzaW9uX2luZm9bc3RyZWFtX2lkXS5zYW1wbGluZ19mcmVxKQotCQkJYWNkYl9kYXRhLmRldmljZV9pbmZvLT5zYW1wbGVfcmF0ZSA9Ci0JCQkJCXNlc3Npb25faW5mb1tzdHJlYW1faWRdLnNhbXBsaW5nX2ZyZXE7Ci0JfQotCWlmICghKGFjZGJfZGF0YS5hY2RiX3N0YXRlICYgQ0FMX0RBVEFfUkVBRFkpKSB7Ci0JCXJlc3VsdCA9IGNoZWNrX3R4X2FjZGJfdmFsdWVzX2NhY2hlZCgpOwotCQlpZiAocmVzdWx0KSB7Ci0JCQlyZXN1bHQgPSBhY2RiX2dldF9jYWxpYnJhdGlvbigpOwotCQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCQlNTV9FUlIoImZhaWxlZCB0byBnZXQgY2FsaWJyYXRpb24gZGF0YVxuIik7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlhY2RiX2NhY2hlZF92YWx1ZXMtPm5vZGVfc3RhdHVzID0gQUNEQl9WQUxVRVNfRklMTEVEOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIGZsdWVuY2VfZmVhdHVyZV91cGRhdGUoaW50IGVuYWJsZSwgaW50IHN0cmVhbV9pZCkKLXsKLQlNTV9JTkZPKCJGbHVlbmNlIGZlYXR1cmUgb3ZlciByaWRlIHdpdGggPSAlZFxuIiwgZW5hYmxlKTsKLQlhY2RiX2RhdGEuZmxldWNlX2ZlYXR1cmVfc3RhdHVzW3N0cmVhbV9pZF0gPSBlbmFibGU7Ci19Ci1FWFBPUlRfU1lNQk9MKGZsdWVuY2VfZmVhdHVyZV91cGRhdGUpOwotCi1zdGF0aWMgdm9pZCBhdWRwcmVwcm9jX2NiKHZvaWQgKnByaXZhdGUsIHUzMiBpZCwgdm9pZCAqbXNnKQotewotCXN0cnVjdCBhdWRwcmVwcm9jX2NtZF9lbmNfY2ZnX2RvbmVfbXNnICp0bXA7Ci0JdTggcmVzdWx0ID0gMDsKLQlpbnQgc3RyZWFtX2lkID0gMDsKLQlpZiAoaWQgIT0gQVVEUFJFUFJPQ19DTURfRU5DX0NGR19ET05FX01TRykKLQkJZ290byBkb25lOwotCi0JdG1wID0gKHN0cnVjdCBhdWRwcmVwcm9jX2NtZF9lbmNfY2ZnX2RvbmVfbXNnICopbXNnOwotCWFjZGJfZGF0YS5wcmVwcm9jX3N0cmVhbV9pZCA9IHRtcC0+c3RyZWFtX2lkOwotCXN0cmVhbV9pZCA9IGFjZGJfZGF0YS5wcmVwcm9jX3N0cmVhbV9pZDsKLQlnZXRfYXVkcmVjX3Nlc3Npb25faW5mbyhzdHJlYW1faWQsICZzZXNzaW9uX2luZm9bc3RyZWFtX2lkXSk7Ci0JTU1fREJHKCJyZWNfZW5jX3R5cGUgPSAleFxuIiwgdG1wLT5yZWNfZW5jX3R5cGUpOwotCWlmICgodG1wLT5yZWNfZW5jX3R5cGUgJiAweDgwMDApID09Ci0JCQkJQVVEX1BSRVBST0NfQ09ORklHX0RJU0FCTEVEKSB7Ci0JCWlmIChhY2RiX2RhdGEucHJlcHJvY19zdHJlYW1faWQgPT0gMCkgewotCQkJYWNkYl9kYXRhLmFjZGJfc3RhdGUgJj0gfkFVRFJFQzBfUkVBRFk7Ci0JCQlhY2RiX2RhdGEuYXVkcmVjX2FwcGxpZWQgJj0gfkFVRFJFQzBfUkVBRFk7Ci0JCX0gZWxzZSBpZiAoYWNkYl9kYXRhLnByZXByb2Nfc3RyZWFtX2lkID09IDEpIHsKLQkJCWFjZGJfZGF0YS5hY2RiX3N0YXRlICY9IH5BVURSRUMxX1JFQURZOwotCQkJYWNkYl9kYXRhLmF1ZHJlY19hcHBsaWVkICY9IH5BVURSRUMxX1JFQURZOwotCQl9IGVsc2UgaWYgKGFjZGJfZGF0YS5wcmVwcm9jX3N0cmVhbV9pZCA9PSAyKSB7Ci0JCQlhY2RiX2RhdGEuYWNkYl9zdGF0ZSAmPSB+QVVEUkVDMl9SRUFEWTsKLQkJCWFjZGJfZGF0YS5hdWRyZWNfYXBwbGllZCAmPSB+QVVEUkVDMl9SRUFEWTsKLQkJfQotCQlhY2RiX2RhdGEuZmxldWNlX2ZlYXR1cmVfc3RhdHVzW3N0cmVhbV9pZF0gPSAwOwotCQlhY2RiX2NhY2hlX3R4W3RtcC0+c3RyZWFtX2lkXS5ub2RlX3N0YXR1cyA9XAotCQkJCQkJQUNEQl9WQUxVRVNfTk9UX0ZJTExFRDsKLQkJYWNkYl9kYXRhLmFjZGJfc3RhdGUgJj0gfkNBTF9EQVRBX1JFQURZOwotCQlnb3RvIGRvbmU7Ci0JfQotCS8qRm9sbG93aW5nIGNoZWNrIGlzIGFkZGVkIHRvIG1ha2Ugc3VyZSB0aGF0IGRldmljZSBpbmZvCi0JICBpcyB1cGRhdGVkLiBhdWRwcmUgcHJvYyBsYXllciBlbmFibGVkIHdpdGhvdXQgZGV2aWNlCi0JICBjYWxsYmFjayBhdCB0aGlzIHNjZW5hcmlvIHdlIHNob3VsZCBub3QgYWNjZXNzCi0JICBkZXZpY2UgaW5mb3JtYXRpb24KLQkgKi8KLQlpZiAoYWNkYl9kYXRhLmJ1aWxkX2lkWzE3XSAhPSAnMCcpIHsKLQkJaWYgKGFjZGJfZGF0YS5kZXZpY2VfaW5mbyAmJgotCQkJc2Vzc2lvbl9pbmZvW3N0cmVhbV9pZF0uc2FtcGxpbmdfZnJlcSkgewotCQkJYWNkYl9kYXRhLmRldmljZV9pbmZvLT5zYW1wbGVfcmF0ZSA9Ci0JCQkJCXNlc3Npb25faW5mb1tzdHJlYW1faWRdLnNhbXBsaW5nX2ZyZXE7Ci0JCQlyZXN1bHQgPSBjaGVja190eF9hY2RiX3ZhbHVlc19jYWNoZWQoKTsKLQkJCWlmICghcmVzdWx0KSB7Ci0JCQkJTU1fSU5GTygiYWNkYiB2YWx1ZXMgZm9yIHRoZSBzdHJlYW0gaXMiIFwKLQkJCQkJCQkiIHF1ZXJyaWVkIGZyb20gbW9kZW0iKTsKLQkJCQlhY2RiX2RhdGEuYWNkYl9zdGF0ZSB8PSBDQUxfREFUQV9SRUFEWTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWNkYl9kYXRhLmFjZGJfc3RhdGUgJj0gfkNBTF9EQVRBX1JFQURZOwotCQkJfQotCQl9Ci0JfQotCWlmIChhY2RiX2RhdGEucHJlcHJvY19zdHJlYW1faWQgPT0gMCkKLQkJYWNkYl9kYXRhLmFjZGJfc3RhdGUgfD0gQVVEUkVDMF9SRUFEWTsKLQllbHNlIGlmIChhY2RiX2RhdGEucHJlcHJvY19zdHJlYW1faWQgPT0gMSkKLQkJYWNkYl9kYXRhLmFjZGJfc3RhdGUgfD0gQVVEUkVDMV9SRUFEWTsKLQllbHNlIGlmIChhY2RiX2RhdGEucHJlcHJvY19zdHJlYW1faWQgPT0gMikKLQkJYWNkYl9kYXRhLmFjZGJfc3RhdGUgfD0gQVVEUkVDMl9SRUFEWTsKLQlhY2RiX2RhdGEucHJlcHJvY19jYl9jb21wbCA9IDE7Ci0JTU1fREJHKCJhY2RiX2RhdGEuYWNkYl9zdGF0ZSA9ICV4XG4iLCBhY2RiX2RhdGEuYWNkYl9zdGF0ZSk7Ci0Jd2FrZV91cCgmYWNkYl9kYXRhLndhaXQpOwotZG9uZToKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBzMzIgcmVnaXN0ZXJfYXVkcHBfY2Iodm9pZCkKLXsKLQlzMzIgcmVzdWx0ID0gMDsKLQotCWFjZGJfZGF0YS5hdWRwcF9jYi5mbiA9IGF1ZHBwX2NiOwotCWFjZGJfZGF0YS5hdWRwcF9jYi5wcml2YXRlID0gTlVMTDsKLQlyZXN1bHQgPSBhdWRwcF9yZWdpc3Rlcl9ldmVudF9jYWxsYmFjaygmYWNkYl9kYXRhLmF1ZHBwX2NiKTsKLQlpZiAocmVzdWx0KSB7Ci0JCU1NX0VSUigiQUNEQj0+IENvdWxkIG5vdCByZWdpc3RlciBhdWRwcCBjYWxsYmFja1xuIik7Ci0JCXJlc3VsdCA9IC1FTk9ERVY7Ci0JCWdvdG8gZG9uZTsKLQl9Ci1kb25lOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBzMzIgcmVnaXN0ZXJfYXVkcHJlcHJvY19jYih2b2lkKQotewotCXMzMiByZXN1bHQgPSAwOwotCi0JYWNkYl9kYXRhLmF1ZHByZXByb2NfY2IuZm4gPSBhdWRwcmVwcm9jX2NiOwotCWFjZGJfZGF0YS5hdWRwcmVwcm9jX2NiLnByaXZhdGUgPSBOVUxMOwotCXJlc3VsdCA9IGF1ZHByZXByb2NfcmVnaXN0ZXJfZXZlbnRfY2FsbGJhY2soJmFjZGJfZGF0YS5hdWRwcmVwcm9jX2NiKTsKLQlpZiAocmVzdWx0KSB7Ci0JCU1NX0VSUigiQUNEQj0+IENvdWxkIG5vdCByZWdpc3RlciBhdWRwcmVwcm9jIGNhbGxiYWNrXG4iKTsKLQkJcmVzdWx0ID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQotZG9uZToKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgczMyIGFjZGJfaW5pdGlhbGl6ZV9kYXRhKHZvaWQpCi17Ci0JczMyCXJlc3VsdCA9IDA7Ci0KLQltdXRleF9pbml0KCZhY2RiX2RhdGEuYWNkYl9tdXRleCk7Ci0KLQlyZXN1bHQgPSBpbml0aWFsaXplX3JwYygpOwotCWlmIChyZXN1bHQpCi0JCWdvdG8gZXJyOwotCi0JcmVzdWx0ID0gaW5pdGlhbGl6ZV9tZW1vcnkoKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIGVycjE7Ci0KLQlyZXN1bHQgPSByZWdpc3Rlcl9kZXZpY2VfY2IoKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIGVycjI7Ci0KLQlyZXN1bHQgPSByZWdpc3Rlcl9hdWRwcF9jYigpOwotCWlmIChyZXN1bHQpCi0JCWdvdG8gZXJyMzsKLQotCXJlc3VsdCA9IHJlZ2lzdGVyX2F1ZHByZXByb2NfY2IoKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIGVycjQ7Ci0KLQotCXJldHVybiByZXN1bHQ7Ci0KLWVycjQ6Ci0JcmVzdWx0ID0gYXVkcHJlcHJvY191bnJlZ2lzdGVyX2V2ZW50X2NhbGxiYWNrKCZhY2RiX2RhdGEuYXVkcHJlcHJvY19jYik7Ci0JaWYgKHJlc3VsdCkKLQkJTU1fRVJSKCJBQ0RCPT4gQ291bGQgbm90IHVucmVnaXN0ZXIgYXVkcHJlcHJvYyBjYWxsYmFja1xuIik7Ci1lcnIzOgotCXJlc3VsdCA9IGF1ZHBwX3VucmVnaXN0ZXJfZXZlbnRfY2FsbGJhY2soJmFjZGJfZGF0YS5hdWRwcF9jYik7Ci0JaWYgKHJlc3VsdCkKLQkJTU1fRVJSKCJBQ0RCPT4gQ291bGQgbm90IHVucmVnaXN0ZXIgYXVkcHAgY2FsbGJhY2tcbiIpOwotZXJyMjoKLQlyZXN1bHQgPSBhdWRkZXZfdW5yZWdpc3Rlcl9ldnRfbGlzdG5lcihBVURERVZfQ0xOVF9BVURJT0NBTCwgMCk7Ci0JaWYgKHJlc3VsdCkKLQkJTU1fRVJSKCJBQ0RCPT4gQ291bGQgbm90IHVucmVnaXN0ZXIgZGV2aWNlIGNhbGxiYWNrXG4iKTsKLWVycjE6Ci0JZGFsZGV2aWNlX2RldGFjaChhY2RiX2RhdGEuaGFuZGxlKTsKLQlhY2RiX2RhdGEuaGFuZGxlID0gTlVMTDsKLWVycjoKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgczMyIGluaXRpYWxpemVfbW9kZW1fYWNkYih2b2lkKQotewotCXN0cnVjdCBhY2RiX2NtZF9pbml0X2FkaWUgYWNkYl9jbWQ7Ci0JdTggY29kZWNfdHlwZSA9IC0xOwotCXMzMiByZXN1bHQgPSAwOwotCXU4IGl0ZXJhdGlvbnMgPSAwOwotCi0JY29kZWNfdHlwZSA9IGFkaWVfZ2V0X2RldGVjdGVkX2NvZGVjX3R5cGUoKTsKLQlpZiAoY29kZWNfdHlwZSA9PSBNQVJJTUJBX0lEKQotCQlhY2RiX2NtZC5hZGllX3R5cGUgPSBBQ0RCX0NVUlJFTlRfQURJRV9NT0RFX01BUklNQkE7Ci0JZWxzZSBpZiAoY29kZWNfdHlwZSA9PSBUSU1QQU5JX0lEKQotCQlhY2RiX2NtZC5hZGllX3R5cGUgPSBBQ0RCX0NVUlJFTlRfQURJRV9NT0RFX1RJTVBBTkk7Ci0JZWxzZQotCQlhY2RiX2NtZC5hZGllX3R5cGUgPSBBQ0RCX0NVUlJFTlRfQURJRV9NT0RFX1VOS05PV047Ci0JYWNkYl9jbWQuY29tbWFuZF9pZCA9IEFDREJfQ01EX0lOSVRJQUxJWkVfRk9SX0FESUU7Ci0JZG8gewotCQkvKkluaXRpYWxpemUgQUNEQiBzb2Z0d2FyZSBvbiBtb2RlbSBiYXNlZCBvbiBjb2RlYyB0eXBlKi8KLQkJcmVzdWx0ID0gZGFscnBjX2Zjbl84KEFDREJfRGFsQUNEQl9pb2N0bCwgYWNkYl9kYXRhLmhhbmRsZSwKLQkJCQkoY29uc3Qgdm9pZCAqKSZhY2RiX2NtZCwgc2l6ZW9mKGFjZGJfY21kKSwKLQkJCQkmYWNkYl9kYXRhLmFjZGJfcmVzdWx0LAotCQkJCXNpemVvZihhY2RiX2RhdGEuYWNkYl9yZXN1bHQpKTsKLQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCU1NX0VSUigiQUNEQj0+IFJQQyBmYWlsdXJlIHJlc3VsdCA9ICVkXG4iLCByZXN1bHQpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQkvKmZvbGxvd2luZyBjaGVjayBpcyBpbnRyb2R1Y2VkIHRvIGhhbmRsZSBib290IHVwIHJhY2UKLQkJY29uZGl0aW9uIGJldHdlZW4gQVVEQ0FMIFNXIHBlZXJzIHJ1bm5pbmcgb24gYXBwcwotCQlhbmQgbW9kZW0gKEFDREJfUkVTX0JBRFNUQVRFIGluZGljYXRlcyBtb2RlbSBBVURDQUwgU1cgaXMKLQkJbm90IGluIGluaXRpYWxpemVkIHNhdGUpIHdlIG5lZWQgdG8gcmV0cnkgdG8gZ2V0IEFDREIKLQkJaW5pdGlhbGl6ZWQqLwotCQlpZiAoYWNkYl9kYXRhLmFjZGJfcmVzdWx0LnJlc3VsdCA9PSBBQ0RCX1JFU19CQURTVEFURSkgewotCQkJbXNsZWVwKDUwMCk7Ci0JCQlpdGVyYXRpb25zKys7Ci0JCX0gZWxzZSBpZiAoYWNkYl9kYXRhLmFjZGJfcmVzdWx0LnJlc3VsdCA9PSBBQ0RCX1JFU19TVUNDRVNTKSB7Ci0JCQlNTV9EQkcoIk1vZGVtIEFDREIgU1cgaW5pdGlhbGl6ZWQgKChpdGVyYXRpb25zID0gJWQpXG4iLAotCQkJCQkJCWl0ZXJhdGlvbnMpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiQUNEQj0+IE1vZGVtIEFDREIgU1cgZmFpbGVkIHRvIGluaXRpYWxpemUiCi0JCQkJCSIgcmV1c2x0ID0gJWQsIChpdGVyYXRpb25zID0gJWQpXG4iLAotCQkJCQlhY2RiX2RhdGEuYWNkYl9yZXN1bHQucmVzdWx0LAotCQkJCQlpdGVyYXRpb25zKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9IHdoaWxlIChpdGVyYXRpb25zIDwgTUFYX1JFVFJZKTsKLQlNTV9FUlIoIkFDREI9PiBBVURDQUwgU1cgb24gbW9kZW0gaXMgbm90IGluIGludGlhaWxpemVkIHN0YXRlICglZClcbiIsCi0JCQlhY2RiX2RhdGEuYWNkYl9yZXN1bHQucmVzdWx0KTsKLWVycm9yOgotCXJlc3VsdCA9IC1FSU5WQUw7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHMzMiBhY2RiX2NhbGlicmF0ZV9kZXZpY2Uodm9pZCAqZGF0YSkKLXsKLQlzMzIgcmVzdWx0ID0gMDsKLQotCS8qIGluaXRpYWxpemUgZHJpdmVyICovCi0JcmVzdWx0ID0gYWNkYl9pbml0aWFsaXplX2RhdGEoKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIGRvbmU7Ci0JaWYgKGFjZGJfZGF0YS5idWlsZF9pZFsxN10gIT0gJzAnKSB7Ci0JCXJlc3VsdCA9IGluaXRpYWxpemVfbW9kZW1fYWNkYigpOwotCQlpZiAocmVzdWx0IDwgMCkKLQkJCU1NX0VSUigiZmFpbGVkIHRvIGluaXRpYWxpemUgbW9kZW0gQUNEQlxuIik7Ci0JfQotCi0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJTU1fREJHKCJXYWl0aW5nIGZvciBjYWxsIGJhY2sgZXZlbnRzXG4iKTsKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGFjZGJfZGF0YS53YWl0LAotCQkJCQkoYWNkYl9kYXRhLmRldmljZV9jYl9jb21wbAotCQkJCQl8IGFjZGJfZGF0YS5hdWRwcF9jYl9jb21wbAotCQkJCQl8IGFjZGJfZGF0YS5wcmVwcm9jX2NiX2NvbXBsKSk7Ci0JCW11dGV4X2xvY2soJmFjZGJfZGF0YS5hY2RiX211dGV4KTsKLQkJaWYgKGFjZGJfZGF0YS5kZXZpY2VfY2JfY29tcGwpIHsKLQkJCWFjZGJfZGF0YS5kZXZpY2VfY2JfY29tcGwgPSAwOwotCQkJaWYgKCEoYWNkYl9kYXRhLmFjZGJfc3RhdGUgJiBDQUxfREFUQV9SRUFEWSkpIHsKLQkJCQlpZiAoKGFjZGJfZGF0YS5kZXZpY2VfaW5mby0+ZGV2X3R5cGUKLQkJCQkJCQkmIFJYX0RFVklDRSkgPT0gMSkgewotCQkJCQkvKndlIG5lZWQgdG8gZ2V0IGNhbGlicmF0aW9uIHZhbHVlcwotCQkJCQlvbmx5IGZvciBSWCBkZXZpY2UgYXMgcmVzYW1wbGVyCi0JCQkJCW1vdmVkIHRvIHN0YXJ0IG9mIHRoZSBwcmUgLSBwcm9jIGNoYWluCi0JCQkJCXR4IGNhbGlicmF0aW9uIHZhbHVlIHdpbGwgYmUgYmFzZWQgb24KLQkJCQkJc2FtcGxpbmcgZnJlcXVlbmN5IHdoYXQgYXVkcmVjIGlzCi0JCQkJCWNvbmZpZ3VyZWQsIGNhbGlicmF0aW9uIHZhbHVlcyBmb3IgdHgKLQkJCQkJZGV2aWNlIGFyZSBmZXRjaCBpbiBhdWRwcmVwcm9jCi0JCQkJCWNhbGxiYWNrKi8KLQkJCQkJcmVzdWx0ID0gYWNkYl9nZXRfY2FsaWJyYXRpb24oKTsKLQkJCQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCQkJCW11dGV4X3VubG9jaygKLQkJCQkJCQkmYWNkYl9kYXRhLmFjZGJfbXV0ZXgpOwotCQkJCQkJTU1fRVJSKCJOb3QgYWJsZSB0byBnZXQgIgotCQkJCQkJCSJjYWxpYnJhdGlvbiAiCi0JCQkJCQkJImRhdGEgY29udGludWVcbiIpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlNTV9EQkcoImFjZGIgc3RhdGUgPSAlZFxuIiwKLQkJCQkJIGFjZGJfZGF0YS5hY2RiX3N0YXRlKTsKLQkJCWlmICgoYWNkYl9kYXRhLmRldmljZV9pbmZvLT5kZXZfdHlwZSAmIFRYX0RFVklDRSkgPT0gMikKLQkJCQloYW5kbGVfdHhfZGV2aWNlX3JlYWR5X2NhbGxiYWNrKCk7Ci0JCQllbHNlIHsKLQkJCQlhY2RiX2NhY2hlX3J4W2FjZGJfZGF0YS5kZXZpY2VfaW5mby0+ZGV2X2lkXVwKLQkJCQkJCS5ub2RlX3N0YXR1cyA9Ci0JCQkJCQlBQ0RCX1ZBTFVFU19GSUxMRUQ7Ci0JCQkJaWYgKGFjZGJfZGF0YS5hY2RiX3N0YXRlICYKLQkJCQkJCUFVRFBQX1JFQURZKSB7Ci0JCQkJCU1NX0RCRygiQVVEUFAgYWxyZWFkeSBlbmFibGVkICIKLQkJCQkJCQkiYXBwbHkgYWNkYiB2YWx1ZXNcbiIpOwotCQkJCQlnb3RvIGFwcGx5OwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghKGFjZGJfZGF0YS5hdWRwcF9jYl9jb21wbCB8fAotCQkJCWFjZGJfZGF0YS5wcmVwcm9jX2NiX2NvbXBsKSkgewotCQkJTU1fREJHKCJuZWVkIHRvIHdhaXQgZm9yIGVpdGhlciBBVURQUCAvIEFVRFBSRVBST0MgIgotCQkJCQkiRXZlbnRcbiIpOwotCQkJbXV0ZXhfdW5sb2NrKCZhY2RiX2RhdGEuYWNkYl9tdXRleCk7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygiZ290IGF1ZHBwIC8gcHJlcHJvYyBjYWxsIGJhY2tcbiIpOwotCQkJaWYgKGFjZGJfZGF0YS5hdWRwcF9jYl9jb21wbCkgewotCQkJCXNlbmRfYWNkYl92YWx1ZXNfZm9yX2FjdGl2ZV9kZXZpY2VzKCk7Ci0JCQkJYWNkYl9kYXRhLmF1ZHBwX2NiX2NvbXBsID0gMDsKLQkJCQltdXRleF91bmxvY2soJmFjZGJfZGF0YS5hY2RiX211dGV4KTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gaGFuZGxlX2F1ZHByZXByb2NfY2IoKTsKLQkJCQlpZiAocmVzdWx0IDwgMCkgewotCQkJCQltdXRleF91bmxvY2soJmFjZGJfZGF0YS5hY2RiX211dGV4KTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQl9Ci1hcHBseToKLQkJaWYgKGFjZGJfZGF0YS5hY2RiX3N0YXRlICYgQ0FMX0RBVEFfUkVBRFkpCi0JCQlyZXN1bHQgPSBhY2RiX3NlbmRfY2FsaWJyYXRpb24oKTsKLQotCQltdXRleF91bmxvY2soJmFjZGJfZGF0YS5hY2RiX211dGV4KTsKLQl9Ci1kb25lOgotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBhY2RiX2luaXQodm9pZCkKLXsKLQotCXMzMiByZXN1bHQgPSAwOwotCi0JbWVtc2V0KCZhY2RiX2RhdGEsIDAsIHNpemVvZihhY2RiX2RhdGEpKTsKLQlzcGluX2xvY2tfaW5pdCgmYWNkYl9kYXRhLmRzcF9sb2NrKTsKLQlhY2RiX2RhdGEuY2JfdGhyZWFkX3Rhc2sgPSBrdGhyZWFkX3J1bihhY2RiX2NhbGlicmF0ZV9kZXZpY2UsCi0JCU5VTEwsICJhY2RiX2NiX3RocmVhZCIpOwotCi0JaWYgKElTX0VSUihhY2RiX2RhdGEuY2JfdGhyZWFkX3Rhc2spKSB7Ci0JCU1NX0VSUigiQUNEQj0+IENvdWxkIG5vdCByZWdpc3RlciBjYiB0aHJlYWRcbiIpOwotCQlyZXN1bHQgPSAtRU5PREVWOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlhY2RiX2RhdGEuYnVpbGRfaWQgPSBzb2NpbmZvX2dldF9idWlsZF9pZCgpOwotCU1NX0lORk8oImJ1aWxkIGlkIHVzZWQgaXMgPSAlc1xuIiwgYWNkYl9kYXRhLmJ1aWxkX2lkKTsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCS8qVGhpcyBpcyBSVEMgc3BlY2lmaWMgSU5JVCB1c2VkIG9ubHkgd2l0aCBkZWJ1Z2ZzKi8KLQlpZiAoIXJ0Y19hY2RiX2luaXQoKSkKLQkJTU1fRVJSKCJSVEMgQUNEQj0+SU5JVCBGYWlsdXJlXG4iKTsKLQotI2VuZGlmCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmYWNkYl9kYXRhLndhaXQpOwotCi0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmFjZGJfbWlzYyk7Ci1lcnI6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGFjZGJfZXhpdCh2b2lkKQotewotCXMzMglyZXN1bHQgPSAwOwotCXUzMiBpID0gMDsKLQotCXJlc3VsdCA9IGF1ZGRldl91bnJlZ2lzdGVyX2V2dF9saXN0bmVyKEFVRERFVl9DTE5UX0FVRElPQ0FMLCAwKTsKLQlpZiAocmVzdWx0KQotCQlNTV9FUlIoIkFDREI9PiBDb3VsZCBub3QgdW5yZWdpc3RlciBkZXZpY2UgY2FsbGJhY2tcbiIpOwotCi0JcmVzdWx0ID0gYXVkcHBfdW5yZWdpc3Rlcl9ldmVudF9jYWxsYmFjaygmYWNkYl9kYXRhLmF1ZHBwX2NiKTsKLQlpZiAocmVzdWx0KQotCQlNTV9FUlIoIkFDREI9PiBDb3VsZCBub3QgdW5yZWdpc3RlciBhdWRwcCBjYWxsYmFja1xuIik7Ci0KLQlyZXN1bHQgPSBhdWRwcmVwcm9jX3VucmVnaXN0ZXJfZXZlbnRfY2FsbGJhY2soJmFjZGJfZGF0YS5cCi0JCQkJYXVkcHJlcHJvY19jYik7Ci0JaWYgKHJlc3VsdCkKLQkJTU1fRVJSKCJBQ0RCPT4gQ291bGQgbm90IHVucmVnaXN0ZXIgYXVkcHJlcHJvYyBjYWxsYmFja1xuIik7Ci0KLQlyZXN1bHQgPSBrdGhyZWFkX3N0b3AoYWNkYl9kYXRhLmNiX3RocmVhZF90YXNrKTsKLQlpZiAocmVzdWx0KQotCQlNTV9FUlIoIkFDREI9PiBDb3VsZCBub3Qgc3RvcCBrdGhyZWFkXG4iKTsKLQotCWZyZWVfbWVtb3J5X2FjZGJfZ2V0X2JsaygpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9DT1BQX05PREVfU1VQUE9SVEVEOyBpKyspIHsKLQkJaWYgKGkgPCBNQVhfQVVEUkVDX1NFU1NJT05TKSB7Ci0JCQlpb3VubWFwKGFjZGJfY2FjaGVfdHhbaV0ubWFwX3ZfYWRkcik7Ci0JCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKAotCQkJCQlhY2RiX2NhY2hlX3R4W2ldLnBoeXNfYWRkcl9hY2RiX3ZhbHVlcyk7Ci0JCX0KLQkJaW91bm1hcChhY2RiX2NhY2hlX3J4W2ldLm1hcF92X2FkZHIpOwotCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKAotCQkJCQlhY2RiX2NhY2hlX3J4W2ldLnBoeXNfYWRkcl9hY2RiX3ZhbHVlcyk7Ci0JfQotCWtmcmVlKGFjZGJfZGF0YS5kZXZpY2VfaW5mbyk7Ci0Ja2ZyZWUoYWNkYl9kYXRhLnBwX2lpcik7Ci0Ja2ZyZWUoYWNkYl9kYXRhLnBwX21iYWRyYyk7Ci0Ja2ZyZWUoYWNkYl9kYXRhLnByZXByb2NfYWdjKTsKLQlrZnJlZShhY2RiX2RhdGEucHJlcHJvY19paXIpOwotCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoCi0JCQkJKGludDMyX3QpYWNkYl9kYXRhLnBiZV9leHRidWZmKTsKLQlpb3VubWFwKGFjZGJfZGF0YS5tYXBfdl9mbHVlbmNlKTsKLQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKAotCQkJKGludDMyX3QpYWNkYl9kYXRhLmZsdWVuY2VfZXh0YnVmZik7Ci0JbXV0ZXhfZGVzdHJveSgmYWNkYl9kYXRhLmFjZGJfbXV0ZXgpOwotCW1lbXNldCgmYWNkYl9kYXRhLCAwLCBzaXplb2YoYWNkYl9kYXRhKSk7Ci0JI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXJ0Y19hY2RiX2RlaW5pdCgpOwotCSNlbmRpZgotfQotCi1sYXRlX2luaXRjYWxsKGFjZGJfaW5pdCk7Ci1tb2R1bGVfZXhpdChhY2RiX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1TTSA3eDMwIEF1ZGlvIEFDREIgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2FkcGNtLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2FkcGNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMmFhMGQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19hZHBjbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc1MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogQmFzZWQgb24gdGhlIG1wMyBuYXRpdmUgZHJpdmVyIGluIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fbXAzLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKgotICogQWxsIHNvdXJjZSBjb2RlIGluIHRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgZXhjZXB0Ci0gKiB3aGVyZSBpbmRpY2F0ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAotICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gZmluZCBpdCBhdCBodHRwOi8vd3d3LmZzZi5vcmcKLSAqLwotCi0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9lYXJseXN1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtb3J5X2FsbG9jLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2Rldl9jdGwuaD4KLQotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdV9kb21haW5zLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHBtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRwbGF5Y21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBsYXltc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRwcC5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9tZW10eXBlcy5oPgotCi0KLS8qIFNpemUgbXVzdCBiZSBwb3dlciBvZiAyICovCi0jZGVmaW5lIEJVRlNaX01BWCAJMzI3NjgJLyogSW5jbHVkZXMgbWV0YSBpbiBzaXplICovCi0jZGVmaW5lIEJVRlNaX01JTiAJNDA5NgkvKiBJbmNsdWRlcyBtZXRhIGluIHNpemUgKi8KLSNkZWZpbmUgRE1BU1pfTUFYIAkoQlVGU1pfTUFYICogMikKLSNkZWZpbmUgRE1BU1pfTUlOIAkoQlVGU1pfTUlOICogMikKLQotI2RlZmluZSBBVURQTEFZX0lOVkFMSURfUkVBRF9QVFJfT0ZGU0VUCTB4RkZGRgotI2RlZmluZSBBVURERUNfREVDX0FEUENNIDEKLQotI2RlZmluZSBQQ01fQlVGU1pfTUlOIAk4MjE2IAkvKiBIb2xkIG9uZSBzdGVyZW8gQURQQ00gZnJhbWUgYW5kIG1ldGEgb3V0Ki8KLSNkZWZpbmUgUENNX0JVRl9NQVhfQ09VTlQgNQkvKiBEU1Agb25seSBhY2NlcHRzIDUgYnVmZmVycyBhdCBtb3N0Ci0JCQkJICAgYnV0IHN1cHBvcnQgMiBidWZmZXJzIGN1cnJlbnRseSAqLwotI2RlZmluZSBST1VUSU5HX01PREVfRlRSVCAxCi0jZGVmaW5lIFJPVVRJTkdfTU9ERV9SVCAyCi0vKiBEZWNvZGVyIHN0YXR1cyByZWNlaXZlZCBmcm9tIEFVRFBQVEFTSyAqLwotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19TTEVFUAkwCi0jZGVmaW5lCSBBVURQUF9ERUNfU1RBVFVTX0lOSVQgIDEKLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfQ0ZHICAgMgotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19QTEFZICAzCi0KLSNkZWZpbmUgQVVEQURQQ01fTUVUQUZJRUxEX01BU0sgMHhGRkZGMDAwMAotI2RlZmluZSBBVURBRFBDTV9FT1NfRkxHX09GRlNFVCAweDBBIC8qIE9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBidWZmZXIgKi8KLSNkZWZpbmUgQVVEQURQQ01fRU9TX0ZMR19NQVNLIDB4MDEKLSNkZWZpbmUgQVVEQURQQ01fRU9TX05PTkUgMHgwIC8qIE5vIEVPUyBkZXRlY3RlZCAqLwotI2RlZmluZSBBVURBRFBDTV9FT1NfU0VUIDB4MSAvKiBFT1Mgc2V0IGluIG1ldGEgZmllbGQgKi8KLQotI2RlZmluZSBBVURBRFBDTV9FVkVOVF9OVU0gMTAgLyogRGVmYXVsdCBuby4gb2YgcHJlLWFsbG9jYXRlZCBldmVudCBwYWNrZXRzICovCi0KLXN0cnVjdCBidWZmZXIgewotCXZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgc2l6ZTsKLQl1bnNpZ25lZCB1c2VkOwkJLyogSW5wdXQgdXNhZ2UgYWN0dWFsIERTUCBwcm9kdWNlZCBQQ00gc2l6ZSAgKi8KLQl1bnNpZ25lZCBhZGRyOwotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zejsgLypvbmx5IHVzZWZ1bCBmb3IgZGF0YSBoYXMgbWV0YSBmaWVsZCAqLwotfTsKLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdHJ1Y3QgYXVkYWRwY21fc3VzcGVuZF9jdGwgewotCXN0cnVjdCBlYXJseV9zdXNwZW5kIG5vZGU7Ci0Jc3RydWN0IGF1ZGlvICphdWRpbzsKLX07Ci0jZW5kaWYKLQotc3RydWN0IGF1ZGFkcGNtX2V2ZW50ewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlpbnQgZXZlbnRfdHlwZTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotfTsKLQotc3RydWN0IGF1ZGlvIHsKLQlzdHJ1Y3QgYnVmZmVyIG91dFsyXTsKLQotCXNwaW5sb2NrX3QgZHNwX2xvY2s7Ci0KLQl1aW50OF90IG91dF9oZWFkOwotCXVpbnQ4X3Qgb3V0X3RhaWw7Ci0JdWludDhfdCBvdXRfbmVlZGVkOyAvKiBudW1iZXIgb2YgYnVmZmVycyB0aGUgZHNwIGlzIHdhaXRpbmcgZm9yICovCi0JdW5zaWduZWQgb3V0X2RtYV9zejsKLQotCWF0b21pY190IG91dF9ieXRlczsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtdXRleCB3cml0ZV9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlX3dhaXQ7Ci0KLQkvKiBIb3N0IFBDTSBzZWN0aW9uICovCi0Jc3RydWN0IGJ1ZmZlciBpbltQQ01fQlVGX01BWF9DT1VOVF07Ci0Jc3RydWN0IG11dGV4IHJlYWRfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkX3dhaXQ7CS8qIFdhaXQgcXVldWUgZm9yIHJlYWQgKi8KLQljaGFyICpyZWFkX2RhdGE7CS8qIHBvaW50ZXIgdG8gcmVhZGVyIGJ1ZmZlciAqLwotCWludDMyX3QgcmVhZF9waHlzOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHJlYWRlciBidWZmZXIgKi8KLQl1aW50OF90IHJlYWRfbmV4dDsJLyogaW5kZXggdG8gaW5wdXQgYnVmZmVycyB0byBiZSByZWFkIG5leHQgKi8KLQl1aW50OF90IGZpbGxfbmV4dDsJLyogaW5kZXggdG8gYnVmZmVyIHRoYXQgRFNQIHNob3VsZCBiZSBmaWxsaW5nICovCi0JdWludDhfdCBwY21fYnVmX2NvdW50OwkvKiBudW1iZXIgb2YgcGNtIGJ1ZmZlciBhbGxvY2F0ZWQgKi8KLQkvKiAtLS0tIEVuZCBvZiBIb3N0IFBDTSBzZWN0aW9uICovCi0KLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICphdWRwbGF5OwotCi0JLyogY29uZmlndXJhdGlvbiB0byB1c2Ugb24gbmV4dCBlbmFibGUgKi8KLQl1aW50MzJfdCBvdXRfc2FtcGxlX3JhdGU7Ci0JdWludDMyX3Qgb3V0X2NoYW5uZWxfbW9kZTsKLQl1aW50MzJfdCBvdXRfYmxvY2tfc2l6ZTsKLQotCS8qIGRhdGEgYWxsb2NhdGVkIGZvciB2YXJpb3VzIGJ1ZmZlcnMgKi8KLQljaGFyICpkYXRhOwotCWludDMyX3QgcGh5czsgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB3cml0ZSBidWZmZXIgKi8KLQl2b2lkICptYXBfdl9yZWFkOwotCXZvaWQgKm1hcF92X3dyaXRlOwotCWludCBtZmllbGQ7IC8qIG1ldGEgZmllbGQgZW1iZWRkZWQgaW4gZGF0YSAqLwotCWludCByZmx1c2g7IC8qIFJlYWQgIGZsdXNoICovCi0JaW50IHdmbHVzaDsgLyogV3JpdGUgZmx1c2ggKi8KLQlpbnQgb3BlbmVkOwotCWludCBlbmFibGVkOwotCWludCBydW5uaW5nOwotCWludCBzdG9wcGVkOyAvKiBzZXQgd2hlbiBzdG9wcGVkLCBjbGVhcmVkIG9uIGZsdXNoICovCi0JaW50IHBjbV9mZWVkYmFjazsKLQlpbnQgYnVmX3JlZnJlc2g7Ci0JaW50IHRlb3M7IC8qIHZhbGlkIG9ubHkgaWYgdHVubmVsIG1vZGUgJiBubyBkYXRhIGxlZnQgZm9yIGRlY29kZXIgKi8KLQllbnVtIG1zbV9hdWRfZGVjb2Rlcl9zdGF0ZSBkZWNfc3RhdGU7CS8qIFJlcHJlc2VudHMgZGVjb2RlciBzdGF0ZSAqLwotCWludCByZXNlcnZlZDsgLyogQSBieXRlIGlzIGJlaW5nIHJlc2VydmVkICovCi0JY2hhciByc3ZfYnl0ZTsgLyogSGFuZGxlIG9kZCBsZW5ndGggdXNlciBkYXRhICovCi0KLQljb25zdCBjaGFyICptb2R1bGVfbmFtZTsKLQl1bnNpZ25lZCBxdWV1ZV9pZDsKLQl1aW50MTZfdCBkZWNfaWQ7Ci0JdWludDMyX3QgcmVhZF9wdHJfb2Zmc2V0OwotCWludDE2X3Qgc291cmNlOwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQlzdHJ1Y3QgYXVkYWRwY21fc3VzcGVuZF9jdGwgc3VzcGVuZF9jdGw7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLSNlbmRpZgotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfZXZlbnRfcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBldmVudF9xdWV1ZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF93YWl0OwotCXNwaW5sb2NrX3QgZXZlbnRfcXVldWVfbG9jazsKLQlzdHJ1Y3QgbXV0ZXggZ2V0X2V2ZW50X2xvY2s7Ci0JaW50IGV2ZW50X2Fib3J0OwotCS8qIEFWIHN5bmMgSW5mbyAqLwotCWludCBhdnN5bmNfZmxhZzsgICAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgZmVlZGJhY2sgZnJvbSBEU1AgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBhdnN5bmNfd2FpdDsvKiBXYWl0IHF1ZXVlIGZvciBBViBTeW5jIE1lc3NhZ2UgICAgICovCi0JLyogZmxhZ3MsIDQ4IGJpdHMgc2FtcGxlL2J5dGVzIGNvdW50ZXIgcGVyIGNoYW5uZWwgKi8KLQl1aW50MTZfdCBhdnN5bmNbQVVEUFBfQVZTWU5DX0NIX0NPVU5UICogQVVEUFBfQVZTWU5DX05VTV9XT1JEUyArIDFdOwotCXVpbnQzMl90IGRldmljZV9ldmVudHM7Ci0KLQlpbnQgZXFfZW5hYmxlOwotCWludCBlcV9uZWVkc19jb21taXQ7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19lcWFsaXplciBlcTsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3ZvbHVtZSB2b2xfcGFuOwotfTsKLQotc3RhdGljIGludCBhdWRkZWNfZHNwX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKTsKLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX3JvdXRpbmdfbW9kZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZHBsYXlfc2VuZF9kYXRhKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVuc2lnbmVkIG5lZWRlZCk7Ci1zdGF0aWMgdm9pZCBhdWRwbGF5X2NvbmZpZ19ob3N0cGNtKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcGxheV9idWZmZXJfcmVmcmVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZGlvX2RzcF9ldmVudCh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZyk7Ci0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0YXRpYyB2b2lkIGF1ZGFkcGNtX3Bvc3RfZXZlbnQoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHR5cGUsCi0JCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQpOwotI2VuZGlmCi0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRpb19lbmFibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWlmIChhdWRpby0+ZW5hYmxlZCkKLQkJcmV0dXJuIDA7Ci0KLQlhdWRpby0+ZGVjX3N0YXRlID0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkU7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0KLQlpZiAobXNtX2Fkc3BfZW5hYmxlKGF1ZGlvLT5hdWRwbGF5KSkgewotCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRwbGF5KSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAoYXVkcHBfZW5hYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvX2RzcF9ldmVudCwgYXVkaW8pKSB7Ci0JCU1NX0VSUigiYXVkcHBfZW5hYmxlKCkgZmFpbGVkXG4iKTsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRpby0+YXVkcGxheSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWF1ZGlvLT5lbmFibGVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYWRwY21fbGlzdG5lcih1MzIgZXZ0X2lkLCB1bmlvbiBhdWRkZXZfZXZ0X2RhdGEgKmV2dF9wYXlsb2FkLAotCQkJdm9pZCAqcHJpdmF0ZV9kYXRhKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSAoc3RydWN0IGF1ZGlvICopIHByaXZhdGVfZGF0YTsKLQlzd2l0Y2ggKGV2dF9pZCkgewotCWNhc2UgQVVEREVWX0VWVF9ERVZfUkRZOgotCQlNTV9EQkcoIjpBVURERVZfRVZUX0RFVl9SRFlcbiIpOwotCQlhdWRpby0+c291cmNlIHw9ICgweDEgPDwgZXZ0X3BheWxvYWQtPnJvdXRpbmdfaWQpOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcgPT0gMSAmJiBhdWRpby0+ZW5hYmxlZCA9PSAxKQotCQkJYXVkcHBfcm91dGVfc3RyZWFtKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvLT5zb3VyY2UpOwotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfREVWX1JMUzoKLQkJTU1fREJHKCI6QVVEREVWX0VWVF9ERVZfUkxTXG4iKTsKLQkJaWYgKGF1ZGlvLT5kZWNfc3RhdGUgPT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1MgJiYKLQkJCQkJCQlhdWRpby0+ZW5hYmxlZCA9PSAxKQotCQkJYXVkcHBfcm91dGVfc3RyZWFtKGF1ZGlvLT5kZWNfaWQsCi0JCQkJbXNtX3NuZGRldl9yb3V0ZV9kZWMoYXVkaW8tPmRlY19pZCkpOwotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEc6Ci0JCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IGV2dF9wYXlsb2FkLT5zZXNzaW9uX3ZvbDsKLQkJTU1fREJHKCI6QVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRywgc3RyZWFtIHZvbCAlZFxuIiwKLQkJCQlhdWRpby0+dm9sX3Bhbi52b2x1bWUpOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuLAotCQkJCQlQT1BQKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCI6RVJST1I6d3JvbmcgZXZlbnRcbiIpOwotCQlicmVhazsKLQl9Ci19Ci0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkaW9fZGlzYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWludCByYyA9IDA7Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQlhdWRpby0+ZGVjX3N0YXRlID0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkU7Ci0JCWF1ZGRlY19kc3BfY29uZmlnKGF1ZGlvLCAwKTsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdCwKLQkJCQlhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoTVNNX0FVRF9ERUNPREVSX1dBSVRfTVMpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWVsc2UgaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX0NMT1NFKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlhdWRwcF9kaXNhYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvKTsKLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZHNwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgYXVkaW9fdXBkYXRlX3BjbV9idWZfZW50cnkoc3RydWN0IGF1ZGlvICphdWRpbywKLQl1aW50MzJfdCAqcGF5bG9hZCkKLXsKLQl1aW50OF90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoYXVkaW8tPnJmbHVzaCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBheWxvYWRbMV07IGluZGV4KyspIHsKLQkJaWYgKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyID09Ci0JCQlwYXlsb2FkWzIgKyBpbmRleCAqIDJdKSB7Ci0JCQlNTV9EQkcoImF1ZGlvX3VwZGF0ZV9wY21fYnVmX2VudHJ5OiBcCi0JCQkJaW5bJWRdIHJlYWR5XG4iLCBhdWRpby0+ZmlsbF9uZXh0KTsKLQkJCWF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS51c2VkID0KLQkJCXBheWxvYWRbMyArIGluZGV4ICogMl07Ci0JCQlpZiAoKCsrYXVkaW8tPmZpbGxfbmV4dCkgPT0gYXVkaW8tPnBjbV9idWZfY291bnQpCi0JCQkJYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoImF1ZGlvX3VwZGF0ZV9wY21fYnVmX2VudHJ5OiBcCi0JCQkJZXhwZWN0ZWQ9JXggcmV0PSV4XG4iLAotCQkJCWF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyLAotCQkJCXBheWxvYWRbMSArIGluZGV4ICogMl0pOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS51c2VkID09IDApIHsKLQkJYXVkcGxheV9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JfSBlbHNlIHsKLQkJTU1fREJHKCJyZWFkIGNhbm5vdCBrZWVwIHVwXG4iKTsKLQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMTsKLQl9Ci0Jd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfZHNwX2V2ZW50KHZvaWQgKmRhdGEsIHVuc2lnbmVkIGlkLCBzaXplX3QgbGVuLAotCQkJICAgICAgdm9pZCAoKmdldGV2ZW50KSAodm9pZCAqcHRyLCBzaXplX3QgbGVuKSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZGF0YTsKLQl1aW50MzJfdCBtc2dbMjhdOwotCi0JZ2V0ZXZlbnQobXNnLCBzaXplb2YobXNnKSk7Ci0KLQlNTV9EQkcoIm1zZ19pZD0leFxuIiwgaWQpOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUExBWV9NU0dfREVDX05FRURTX0RBVEE6Ci0JCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAxKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBMQVlfTVNHX0JVRkZFUl9VUERBVEU6Ci0JCWF1ZGlvX3VwZGF0ZV9wY21fYnVmX2VudHJ5KGF1ZGlvLCBtc2cpOwotCQlicmVhazsKLQotCWNhc2UgQURTUF9NRVNTQUdFX0lEOgotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6IG1vZHVsZSBlbmFibGUoYXVkcGxheXRhc2spXG4iKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlNTV9FUlIoInVuZXhwZWN0ZWQgbWVzc2FnZSBmcm9tIGRlY29kZXIgXG4iKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhdWRpb19kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IHByaXZhdGU7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQUF9NU0dfU1RBVFVTX01TRzp7Ci0JCQl1bnNpZ25lZCBzdGF0dXMgPSBtc2dbMV07Ci0KLQkJCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfU0xFRVA6IHsKLQkJCQl1aW50MTZfdCByZWFzb24gPSBtc2dbMl07Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czpzbGVlcCByZWFzb24gPSBcCi0JCQkJCQkweCUwNHhcbiIsIHJlYXNvbik7Ci0JCQkJaWYgKChyZWFzb24gPT0gQVVEUFBfTVNHX1JFQVNPTl9NRU0pCi0JCQkJCXx8IChyZWFzb24gPT0KLQkJCQkJQVVEUFBfTVNHX1JFQVNPTl9OT0RFQ09ERVIpKSB7Ci0JCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX0ZBSUxVUkU7Ci0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQl9IGVsc2UgaWYgKHJlYXNvbiA9PSBBVURQUF9NU0dfUkVBU09OX05PTkUpIHsKLQkJCQkJLyogZGVjb2RlciBpcyBpbiBkaXNhYmxlIHN0YXRlICovCi0JCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX0NMT1NFOwotCQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX0lOSVQ6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogaW5pdFxuIik7Ci0JCQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCQkJCWF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKGF1ZGlvKTsKLQkJCQllbHNlCi0JCQkJCWF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoYXVkaW8pOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfQ0ZHOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IGNmZ1xuIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfUExBWToKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBwbGF5IFxuIik7Ci0JCQkJLyogc2VuZCAgbWl4ZXIgY29tbWFuZCAqLwotCQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLAotCQkJCQkJYXVkaW8tPnNvdXJjZSk7Ci0JCQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJCQkJYXVkcGxheV9jb25maWdfaG9zdHBjbShhdWRpbyk7Ci0JCQkJCWF1ZHBsYXlfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCQkJCX0KLQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1M7Ci0JCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlNTV9FUlIoInVua25vd24gZGVjb2RlciBzdGF0dXNcbiIpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRFBQX01TR19DRkdfTVNHOgotCQlpZiAobXNnWzBdID09IEFVRFBQX01TR19FTkFfRU5BKSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgRU5BQkxFXG4iKTsKLQkJCWF1ZGRlY19kc3BfY29uZmlnKGF1ZGlvLCAxKTsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMTsKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihhdWRpby0+ZGVjX2lkLCAmYXVkaW8tPnZvbF9wYW4sCi0JCQkJCVBPUFApOwotCQkJYXVkcHBfZHNwX3NldF9lcShhdWRpby0+ZGVjX2lkLAlhdWRpby0+ZXFfZW5hYmxlLAotCQkJCQkmYXVkaW8tPmVxLCBQT1BQKTsKLQkJfSBlbHNlIGlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9ESVMpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBESVNBQkxFXG4iKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyAlZD9cbiIsIG1zZ1swXSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfUk9VVElOR19BQ0s6Ci0JCU1NX0RCRygiUk9VVElOR19BQ0sgbW9kZT0lZFxuIiwgbXNnWzFdKTsKLQkJYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhhdWRpbyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURQUF9NU0dfRkxVU0hfQUNLOgotCQlNTV9EQkcoIkZMVVNIX0FDS1xuIik7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJCWF1ZHBsYXlfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCQlicmVhazsKLQotCWNhc2UgQVVEUFBfTVNHX1BDTURNQU1JU1NFRDoKLQkJTU1fREJHKCJQQ01ETUFNSVNTRURcbiIpOwotCQlhdWRpby0+dGVvcyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBQX01TR19BVlNZTkNfTVNHOgotCQlNTV9EQkcoIkFVRFBQX01TR19BVlNZTkNfTVNHXG4iKTsKLQkJbWVtY3B5KCZhdWRpby0+YXZzeW5jWzBdLCBtc2csIHNpemVvZihhdWRpby0+YXZzeW5jKSk7Ci0JCWF1ZGlvLT5hdnN5bmNfZmxhZyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT5hdnN5bmNfd2FpdCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJTU1fRVJSKCJVTktOT1dOICglZClcbiIsIGlkKTsKLQl9Ci0KLX0KLQotc3RhdGljIHN0cnVjdCBtc21fYWRzcF9vcHMgYXVkcGxheV9hZHNwX29wc19hZHBjbSA9IHsKLQkuZXZlbnQgPSBhdWRwbGF5X2RzcF9ldmVudCwKLX07Ci0KLSNkZWZpbmUgYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcGxheSwgYXVkaW8tPnF1ZXVlX2lkLCBcCi0JCQljbWQsIGxlbikKLQotc3RhdGljIGludCBhdWRkZWNfZHNwX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2RlY190eXBlIGNmZ19kZWNfY21kOwotCi0JbWVtc2V0KCZjZmdfZGVjX2NtZCwgMCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci0KLQljZmdfZGVjX2NtZC5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX0RFQ19UWVBFOwotCWlmIChlbmFibGUpCi0JCWNmZ19kZWNfY21kLmRlY19jZmcgPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCQlBVURQUF9DTURfRU5BX0RFQ19WIHwgQVVEREVDX0RFQ19BRFBDTTsKLQllbHNlCi0JCWNmZ19kZWNfY21kLmRlY19jZmcgPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCQlBVURQUF9DTURfRElTX0RFQ19WOwotCWNmZ19kZWNfY21kLmRtX21vZGUgPSAweDA7Ci0JY2ZnX2RlY19jbWQuc3RyZWFtX2lkID0gYXVkaW8tPmRlY19pZDsKLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTEoJmNmZ19kZWNfY21kLCBzaXplb2YoY2ZnX2RlY19jbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX2FkcGNtIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNvbW1vbi5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TOwotCWNtZC5jb21tb24ubGVuZ3RoID0gQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNU19BRFBDTV9MRU47Ci0JY21kLmNvbW1vbi5kZWNfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5jb21tb24uaW5wdXRfc2FtcGxpbmdfZnJlcXVlbmN5ID0gYXVkaW8tPm91dF9zYW1wbGVfcmF0ZTsKLQotCWNtZC5zdGVyZW9fY2ZnID0gIGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlOwotCWNtZC5ibG9ja19zaXplID0gIGF1ZGlvLT5vdXRfYmxvY2tfc2l6ZTsKLQotCWF1ZHBwX3NlbmRfcXVldWUyKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX3JvdXRpbmdfbW9kZSBjbWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFBQX0NNRF9ST1VUSU5HX01PREU7Ci0JY21kLm9iamVjdF9udW1iZXIgPSBhdWRpby0+ZGVjX2lkOwotCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQljbWQucm91dGluZ19tb2RlID0gUk9VVElOR19NT0RFX0ZUUlQ7Ci0JZWxzZQotCQljbWQucm91dGluZ19tb2RlID0gUk9VVElOR19NT0RFX1JUOwotCi0JYXVkcHBfc2VuZF9xdWV1ZTEoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2J1ZmZlcl9yZWZyZXNoIHJlZnJlc2hfY21kOwotCi0JcmVmcmVzaF9jbWQuY21kX2lkID0gQVVEUExBWV9DTURfQlVGRkVSX1JFRlJFU0g7Ci0JcmVmcmVzaF9jbWQubnVtX2J1ZmZlcnMgPSAxOwotCXJlZnJlc2hfY21kLmJ1ZjBfYWRkcmVzcyA9IGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyOwotCXJlZnJlc2hfY21kLmJ1ZjBfbGVuZ3RoID0gYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnNpemU7Ci0JcmVmcmVzaF9jbWQuYnVmX3JlYWRfY291bnQgPSAwOwotCi0JTU1fREJHKCJidWYwX2FkZHI9JXggYnVmMF9sZW49JWRcbiIsCi0JCQlyZWZyZXNoX2NtZC5idWYwX2FkZHJlc3MsCi0JCQlyZWZyZXNoX2NtZC5idWYwX2xlbmd0aCk7Ci0KLQkodm9pZClhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmcmVmcmVzaF9jbWQsIHNpemVvZihyZWZyZXNoX2NtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwbGF5X2NvbmZpZ19ob3N0cGNtKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2hwY21fYnVmX2NmZyBjZmdfY21kOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQljZmdfY21kLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0hQQ01fQlVGX0NGRzsKLQljZmdfY21kLm1heF9idWZmZXJzID0gYXVkaW8tPnBjbV9idWZfY291bnQ7Ci0JY2ZnX2NtZC5ieXRlX3N3YXAgPSAwOwotCWNmZ19jbWQuaG9zdHBjbV9jb25maWcgPSAoMHg4MDAwKSB8ICgweDQwMDApOwotCWNmZ19jbWQuZmVlZGJhY2tfZnJlcXVlbmN5ID0gMTsKLQljZmdfY21kLnBhcnRpdGlvbl9udW1iZXIgPSAwOwotCi0JKHZvaWQpYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJmNmZ19jbWQsIHNpemVvZihjZmdfY21kKSk7Ci19Ci0KLQotc3RhdGljIGludCBhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJCQkJdW5zaWduZWQgaWR4LCB1bnNpZ25lZCBsZW4pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2JpdHN0cmVhbV9kYXRhX2F2YWlsX250MiBjbWQ7Ci0KLQljbWQuY21kX2lkCQk9IEFVRFBMQVlfQ01EX0JJVFNUUkVBTV9EQVRBX0FWQUlMX05UMjsKLQlpZiAoYXVkaW8tPm1maWVsZCkKLQkJY21kLmRlY29kZXJfaWQgPSBBVURBRFBDTV9NRVRBRklFTERfTUFTSyB8Ci0JCShhdWRpby0+b3V0W2lkeF0ubWZpZWxkX3N6ID4+IDEpOwotCWVsc2UKLQkJY21kLmRlY29kZXJfaWQJCT0gYXVkaW8tPmRlY19pZDsKLQljbWQuYnVmX3B0cgkJPSBhdWRpby0+b3V0W2lkeF0uYWRkcjsKLQljbWQuYnVmX3NpemUJCT0gbGVuLzI7Ci0JY21kLnBhcnRpdGlvbl9udW1iZXIJPSAwOwotCXJldHVybiBhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfc2VuZF9kYXRhKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVuc2lnbmVkIG5lZWRlZCkKLXsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWlmICghYXVkaW8tPnJ1bm5pbmcpCi0JCWdvdG8gZG9uZTsKLQotCWlmIChhdWRpby0+d2ZsdXNoKSB7Ci0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChuZWVkZWQgJiYgIWF1ZGlvLT53Zmx1c2gpIHsKLQkJLyogV2Ugd2VyZSBjYWxsZWQgZnJvbSB0aGUgY2FsbGJhY2sgYmVjYXVzZSB0aGUgRFNQCi0JCSAqIHJlcXVlc3RlZCBtb3JlIGRhdGEuICBOb3RlIHRoYXQgdGhlIERTUCBkb2VzIHdhbnQKLQkJICogbW9yZSBkYXRhLCBhbmQgaWYgYSBidWZmZXIgd2FzIGluLWZsaWdodCwgbWFyayBpdAotCQkgKiBhcyBhdmFpbGFibGUgKHNpbmNlIHRoZSBEU1AgbXVzdCBub3cgYmUgZG9uZSB3aXRoCi0JCSAqIGl0KS4KLQkJICovCi0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZikgewotCQkJTU1fREJHKCJmcmFtZSAlZCBmcmVlXG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCQkJZnJhbWUtPnVzZWQgPSAwOwotCQkJYXVkaW8tPm91dF90YWlsIF49IDE7Ci0JCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCX0KLQl9Ci0KLQlpZiAoYXVkaW8tPm91dF9uZWVkZWQpIHsKLQkJLyogSWYgdGhlIERTUCBjdXJyZW50bHkgd2FudHMgZGF0YSBhbmQgd2UgaGF2ZSBhCi0JCSAqIGJ1ZmZlciBhdmFpbGFibGUsIHdlIHdpbGwgc2VuZCBpdCBhbmQgcmVzZXQKLQkJICogdGhlIG5lZWRlZCBmbGFnLiAgV2UnbGwgbWFyayB0aGUgYnVmZmVyIGFzIGluLWZsaWdodAotCQkgKiBzbyB0aGF0IGl0IHdvbid0IGJlIHJlY3ljbGVkIHVudGlsIHRoZSBuZXh0IGJ1ZmZlcgotCQkgKiBpcyByZXF1ZXN0ZWQKLQkJICovCi0KLQkJTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQpIHsKLQkJCUJVR19PTihmcmFtZS0+dXNlZCA9PSAweGZmZmZmZmZmKTsKLQkJCU1NX0RCRygiZnJhbWUgJWQgYnVzeVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJCWF1ZHBsYXlfZHNwX3NlbmRfZGF0YV9hdmFpbChhdWRpbywgYXVkaW8tPm91dF90YWlsLAotCQkJCQkJCQlmcmFtZS0+dXNlZCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDB4ZmZmZmZmZmY7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCX0KLQl9Ci1kb25lOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHZvaWQgYXVkaW9fZmx1c2goc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlhdWRpby0+b3V0WzBdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRbMV0udXNlZCA9IDA7Ci0JYXVkaW8tPm91dF9oZWFkID0gMDsKLQlhdWRpby0+b3V0X3RhaWwgPSAwOwotCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9ieXRlcywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2ZsdXNoX3BjbV9idWYoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1aW50OF90IGluZGV4OwotCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUENNX0JVRl9NQVhfQ09VTlQ7IGluZGV4KyspCi0JCWF1ZGlvLT5pbltpbmRleF0udXNlZCA9IDA7Ci0JYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLX0KLQotc3RhdGljIHZvaWQgYXVkaW9faW9wb3J0X3Jlc2V0KHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JLyogTWFrZSBzdXJlIHJlYWQvd3JpdGUgdGhyZWFkIGFyZSBmcmVlIGZyb20KLQkgKiBzbGVlcCBhbmQga25vd2luZyB0aGF0IHN5c3RlbSBpcyBub3QgYWJsZQotCSAqIHRvIHByb2Nlc3MgaW8gcmVxdWVzdCBhdCB0aGUgbW9tZW50Ci0JICovCi0Jd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlhdWRpb19mbHVzaChhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JYXVkaW9fZmx1c2hfcGNtX2J1ZihhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAxOwotCXdha2VfdXAoJmF1ZGlvLT5hdnN5bmNfd2FpdCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkYWRwY21fZXZlbnRzX3BlbmRpbmcoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlbXB0eTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWVtcHR5ID0gIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gZW1wdHkgfHwgYXVkaW8tPmV2ZW50X2Fib3J0OwotfQotCi1zdGF0aWMgdm9pZCBhdWRhZHBjbV9yZXNldF9ldmVudF9xdWV1ZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGF1ZGFkcGNtX2V2ZW50ICpkcnZfZXZ0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZGFkcGNtX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkYWRwY21fZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgbG9uZyBhdWRhZHBjbV9wcm9jZXNzX2V2ZW50X3JlcShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB2b2lkIF9fdXNlciAqYXJnKQotewotCWxvbmcgcmM7Ci0Jc3RydWN0IG1zbV9hdWRpb19ldmVudCB1c3JfZXZ0OwotCXN0cnVjdCBhdWRhZHBjbV9ldmVudCAqZHJ2X2V2dCA9IE5VTEw7Ci0JaW50IHRpbWVvdXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmdXNyX2V2dCwgYXJnLCBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19ldmVudCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXRpbWVvdXQgPSAoaW50KSB1c3JfZXZ0LnRpbWVvdXRfbXM7Ci0KLQlpZiAodGltZW91dCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCgKLQkJCWF1ZGlvLT5ldmVudF93YWl0LCBhdWRhZHBjbV9ldmVudHNfcGVuZGluZyhhdWRpbyksCi0JCQltc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9IGVsc2UgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCWF1ZGlvLT5ldmVudF93YWl0LCBhdWRhZHBjbV9ldmVudHNfcGVuZGluZyhhdWRpbykpOwotCX0KLQotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCWlmIChhdWRpby0+ZXZlbnRfYWJvcnQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMDsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcmMgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+ZXZlbnRfcXVldWUpKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZGFkcGNtX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCX0KLQotCWlmIChkcnZfZXZ0KSB7Ci0JCXVzcl9ldnQuZXZlbnRfdHlwZSA9IGRydl9ldnQtPmV2ZW50X3R5cGU7Ci0JCXVzcl9ldnQuZXZlbnRfcGF5bG9hZCA9IGRydl9ldnQtPnBheWxvYWQ7Ci0JCWxpc3RfYWRkX3RhaWwoJmRydl9ldnQtPmxpc3QsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JfSBlbHNlCi0JCXJjID0gLTE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghcmMgJiYgY29weV90b191c2VyKGFyZywgJnVzcl9ldnQsIHNpemVvZih1c3JfZXZ0KSkpCi0JCXJjID0gLUVGQVVMVDsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19lbmFibGVfZXEoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlpZiAoYXVkaW8tPmVxX2VuYWJsZSA9PSBlbmFibGUgJiYgIWF1ZGlvLT5lcV9uZWVkc19jb21taXQpCi0JCXJldHVybiAwOwotCi0JYXVkaW8tPmVxX2VuYWJsZSA9IGVuYWJsZTsKLQotCWlmIChhdWRpby0+cnVubmluZykgewotCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsCWVuYWJsZSwgJmF1ZGlvLT5lcSwgUE9QUCk7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19nZXRfYXZzeW5jX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJCQkJCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgKnN0YXRzKQotewotCWludCByYyA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAoYXVkaW8tPmRlY19pZCA9PSBhdWRpby0+YXZzeW5jWzBdICYmIGF1ZGlvLT5hdnN5bmNfZmxhZykgewotCQkvKiBhdl9zeW5jIHNhbXBsZSBjb3VudCAqLwotCQlzdGF0cy0+c2FtcGxlX2NvdW50ID0gKGF1ZGlvLT5hdnN5bmNbMl0gPDwgMTYpIHwKLQkJCQkJCShhdWRpby0+YXZzeW5jWzNdKTsKLQotCQkvKiBhdl9zeW5jIGJ5dGVfY291bnQgKi8KLQkJc3RhdHMtPmJ5dGVfY291bnQgPSAoYXVkaW8tPmF2c3luY1s1XSA8PCAxNikgfAotCQkJCQkJKGF1ZGlvLT5hdnN5bmNbNl0pOwotCi0JCWF1ZGlvLT5hdnN5bmNfZmxhZyA9IDA7Ci0JCXJjID0gMDsKLQl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiByYzsKLQotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXVpbnQxNl90IGVuYWJsZV9tYXNrOwotCWludCBlbmFibGU7Ci0JaW50IHByZXZfc3RhdGU7Ci0KLQlNTV9EQkcoImNtZCA9ICVkXG4iLCBjbWQpOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfU1RBVFMpIHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyBzdGF0czsKLQotCQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAwOwotCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKLQkJaWYgKGF1ZHBwX3F1ZXJ5X2F2c3luYyhhdWRpby0+ZGVjX2lkKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+YXZzeW5jX3dhaXQsCi0JCQkJKGF1ZGlvLT5hdnN5bmNfZmxhZyA9PSAxKSwKLQkJCQltc2Vjc190b19qaWZmaWVzKEFVRFBQX0FWU1lOQ19FVkVOVF9USU1FT1VUKSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJZWxzZSBpZiAoKHJjID4gMCkgfHwgKChyYyA9PSAwKSAmJiAoYXVkaW8tPmF2c3luY19mbGFnID09IDEpKSkgewotCQkJaWYgKGF1ZGlvX2dldF9hdnN5bmNfZGF0YShhdWRpbywgJnN0YXRzKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0VOQUJMRV9BVURQUDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZlbmFibGVfbWFzaywgKHZvaWQgKikgYXJnLAotCQkJCQkJc2l6ZW9mKGVuYWJsZV9tYXNrKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQllbmFibGUgPSAoZW5hYmxlX21hc2sgJiBFUV9FTkFCTEUpID8gMSA6IDA7Ci0JCWF1ZGlvX2VuYWJsZV9lcShhdWRpbywgZW5hYmxlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfUEFOOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnBhbiA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfRVE6Ci0JCXByZXZfc3RhdGUgPSBhdWRpby0+ZXFfZW5hYmxlOwotCQlhdWRpby0+ZXFfZW5hYmxlID0gMDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhdWRpby0+ZXEubnVtX2JhbmRzLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGF1ZGlvLT5lcSkgLQotCQkJCShBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfQ09NTU9OX0xFTiArIDIpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPmVxX2VuYWJsZSA9IHByZXZfc3RhdGU7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAxOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCWlmICgtRUlOVkFMICE9IHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9FVkVOVCkgewotCQlNTV9EQkcoIkFVRElPX0dFVF9FVkVOVFxuIik7Ci0JCWlmIChtdXRleF90cnlsb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spKSB7Ci0JCQlyYyA9IGF1ZGFkcGNtX3Byb2Nlc3NfZXZlbnRfcmVxKGF1ZGlvLAotCQkJCQkodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQkJfSBlbHNlCi0JCQlyYyA9IC1FQlVTWTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmIChjbWQgPT0gQVVESU9fQUJPUlRfR0VUX0VWRU5UKSB7Ci0JCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDoKLQkJTU1fREJHKCJBVURJT19TVEFSVFxuIik7Ci0JCXJjID0gYXVkaW9fZW5hYmxlKGF1ZGlvKTsKLQkJaWYgKCFyYykgewotCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdCwKLQkJCQlhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoTVNNX0FVRF9ERUNPREVSX1dBSVRfTVMpKTsKLQkJCU1NX0lORk8oImRlY19zdGF0ZSAlZCByYyA9ICVkXG4iLCBhdWRpby0+ZGVjX3N0YXRlLCByYyk7Ci0KLQkJCWlmIChhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9TVUNDRVNTKQotCQkJCXJjID0gLUVOT0RFVjsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TVE9QOgotCQlNTV9EQkcoIkFVRElPX1NUT1BcbiIpOwotCQlyYyA9IGF1ZGlvX2Rpc2FibGUoYXVkaW8pOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCWF1ZGlvX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19GTFVTSDoKLQkJTU1fREJHKCJBVURJT19GTFVTSFxuIik7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAxOwotCQlhdWRpby0+d2ZsdXNoID0gMTsKLQkJYXVkaW9faW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCQlhdWRwcF9mbHVzaChhdWRpby0+ZGVjX2lkKTsKLQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCSFhdWRpby0+d2ZsdXNoKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlNTV9FUlIoIkFVRElPX0ZMVVNIIGludGVycnVwdGVkXG4iKTsKLQkJCQlyYyA9IC1FSU5UUjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb25maWcsICh2b2lkICopIGFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29uZmlnLmNoYW5uZWxfY291bnQgPT0gMSkgewotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSBBVURQUF9DTURfUENNX0lOVEZfTU9OT19WOwotCQl9IGVsc2UgaWYgKGNvbmZpZy5jaGFubmVsX2NvdW50ID09IDIpIHsKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gQVVEUFBfQ01EX1BDTV9JTlRGX1NURVJFT19WOwotCQl9IGVsc2UgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPm1maWVsZCA9IGNvbmZpZy5tZXRhX2ZpZWxkOwotCQlhdWRpby0+b3V0X3NhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotCQlhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9IGNvbmZpZy5jaGFubmVsX2NvdW50OwotCQlhdWRpby0+b3V0X2Jsb2NrX3NpemUgPSBjb25maWcuYml0czsKLQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gKGF1ZGlvLT5vdXRfZG1hX3N6ID4+IDEpOwotCQljb25maWcuYnVmZmVyX2NvdW50ID0gMjsKLQkJY29uZmlnLnNhbXBsZV9yYXRlID0gYXVkaW8tPm91dF9zYW1wbGVfcmF0ZTsKLQkJaWYgKGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID09IEFVRFBQX0NNRF9QQ01fSU5URl9NT05PX1YpCi0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JCWVsc2UKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gMjsKLQkJY29uZmlnLm1ldGFfZmllbGQgPSAwOwotCQljb25maWcudW51c2VkWzBdID0gMDsKLQkJY29uZmlnLnVudXNlZFsxXSA9IDA7Ci0JCWNvbmZpZy51bnVzZWRbMl0gPSAwOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX1BDTV9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19wY21fY29uZmlnIGNvbmZpZzsKLQkJCWNvbmZpZy5wY21fZmVlZGJhY2sgPSBhdWRpby0+cGNtX2ZlZWRiYWNrOwotCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfTUFYX0NPVU5UOwotCQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjb25maWcsCi0JCQkJCSBzaXplb2YoY29uZmlnKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19TRVRfUENNX0NPTkZJRzp7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX3BjbV9jb25maWcgY29uZmlnOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkgICAgKCZjb25maWcsICh2b2lkICopYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY29uZmlnLnBjbV9mZWVkYmFjayAhPSBhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCQkJTU1fRVJSKCJOb3Qgc3VmZmljaWVudCBwZXJtaXNzaW9uIHRvIgotCQkJCQkgImNoYW5nZSB0aGUgcGxheWJhY2sgbW9kZVxuIik7Ci0JCQkJcmMgPSAtRUFDQ0VTOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKChjb25maWcuYnVmZmVyX2NvdW50ID4gUENNX0JVRl9NQVhfQ09VTlQpIHx8Ci0JCQkgICAgKGNvbmZpZy5idWZmZXJfY291bnQgPT0gMSkpCi0JCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfTUFYX0NPVU5UOwotCi0JCQlpZiAoY29uZmlnLmJ1ZmZlcl9zaXplIDwgUENNX0JVRlNaX01JTikKLQkJCQljb25maWcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCi0JCQkvKiBDaGVjayBpZiBwY20gZmVlZGJhY2sgaXMgcmVxdWlyZWQgKi8KLQkJCWlmICgoY29uZmlnLnBjbV9mZWVkYmFjaykgJiYgKCFhdWRpby0+cmVhZF9kYXRhKSkgewotCQkJCU1NX0RCRygiYWxsb2NhdGUgUENNIGJ1ZmZlciAlZFxuIiwKLQkJCQkJCWNvbmZpZy5idWZmZXJfY291bnQgKgotCQkJCQkJY29uZmlnLmJ1ZmZlcl9zaXplKTsKLQkJCQlhdWRpby0+cmVhZF9waHlzID0KLQkJCQkJYWxsb2NhdGVfY29udGlndW91c19lYmlfbm9tYXAoCi0JCQkJCQkJY29uZmlnLmJ1ZmZlcl9zaXplICoKLQkJCQkJCQljb25maWcuYnVmZmVyX2NvdW50LAotCQkJCQkJCVNaXzRLKTsKLQkJCQlpZiAoIWF1ZGlvLT5yZWFkX3BoeXMpIHsKLQkJCQkJcmMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYXVkaW8tPm1hcF92X3JlYWQgPSBpb3JlbWFwKAotCQkJCQkJCWF1ZGlvLT5yZWFkX3BoeXMsCi0JCQkJCQkJY29uZmlnLmJ1ZmZlcl9zaXplICoKLQkJCQkJCQljb25maWcuYnVmZmVyX2NvdW50KTsKLQkJCQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl9yZWFkKSkgewotCQkJCQlNTV9FUlIoInJlYWQgYnVmIG1hcCBmYWlsXG4iKTsKLQkJCQkJcmMgPSAtRU5PTUVNOwotCQkJCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKAotCQkJCQkJCWF1ZGlvLT5yZWFkX3BoeXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXVpbnQ4X3QgaW5kZXg7Ci0JCQkJCXVpbnQzMl90IG9mZnNldCA9IDA7Ci0JCQkJCWF1ZGlvLT5yZWFkX2RhdGEgPQotCQkJCQkJYXVkaW8tPm1hcF92X3JlYWQ7Ci0JCQkJCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDA7Ci0JCQkJCWF1ZGlvLT5wY21fYnVmX2NvdW50ID0KLQkJCQkJICAgIGNvbmZpZy5idWZmZXJfY291bnQ7Ci0JCQkJCWF1ZGlvLT5yZWFkX25leHQgPSAwOwotCQkJCQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLQotCQkJCQlmb3IgKGluZGV4ID0gMDsKLQkJCQkJICAgICBpbmRleCA8IGNvbmZpZy5idWZmZXJfY291bnQ7Ci0JCQkJCSAgICAgaW5kZXgrKykgewotCQkJCQkJYXVkaW8tPmluW2luZGV4XS5kYXRhID0KLQkJCQkJCSAgICBhdWRpby0+cmVhZF9kYXRhICsgb2Zmc2V0OwotCQkJCQkJYXVkaW8tPmluW2luZGV4XS5hZGRyID0KLQkJCQkJCSAgICBhdWRpby0+cmVhZF9waHlzICsgb2Zmc2V0OwotCQkJCQkJYXVkaW8tPmluW2luZGV4XS5zaXplID0KLQkJCQkJCSAgICBjb25maWcuYnVmZmVyX3NpemU7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLnVzZWQgPSAwOwotCQkJCQkJb2Zmc2V0ICs9IGNvbmZpZy5idWZmZXJfc2l6ZTsKLQkJCQkJfQotCQkJCQlNTV9EQkcoInJlYWQgYnVmOiBwaHkgYWRkciBcCi0JCQkJCQkweCUwOHgga2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQkJCQkJYXVkaW8tPnJlYWRfcGh5cywKLQkJCQkJCShpbnQpYXVkaW8tPnJlYWRfZGF0YSk7Ci0JCQkJCXJjID0gMDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJjID0gMDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19QQVVTRToKLQkJTU1fREJHKCJBVURJT19QQVVTRSAlbGRcbiIsIGFyZyk7Ci0JCXJjID0gYXVkcHBfcGF1c2UoYXVkaW8tPmRlY19pZCwgKGludCkgYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19HRVRfU0VTU0lPTl9JRDoKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZhdWRpby0+ZGVjX2lkLAotCQkJCQlzaXplb2YodW5zaWduZWQgc2hvcnQpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotLyogT25seSB1c2VmdWwgaW4gdHVubmVsLW1vZGUgKi8KLXN0YXRpYyBpbnQgYXVkaW9fZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBwcG9zMSwgbG9mZl90IHBwb3MyLCBpbnQgZGF0YXN5bmMpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQlpbnQgcmMgPSAwOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQotCWlmICghYXVkaW8tPnJ1bm5pbmcgfHwgYXVkaW8tPnBjbV9mZWVkYmFjaykgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZV9ub2xvY2s7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCSghYXVkaW8tPm91dFswXS51c2VkICYmCi0JCSFhdWRpby0+b3V0WzFdLnVzZWQgJiYKLQkJYXVkaW8tPm91dF9uZWVkZWQpIHx8IGF1ZGlvLT53Zmx1c2gpOwotCi0JaWYgKHJjIDwgMCkKLQkJZ290byBkb25lOwotCWVsc2UgaWYgKGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoYXVkaW8tPnJlc2VydmVkKSB7Ci0JCU1NX0RCRygic2VuZCByZXNlcnZlZCBieXRlXG4iKTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQkoKGNoYXIgKikgZnJhbWUtPmRhdGEpWzBdID0gYXVkaW8tPnJzdl9ieXRlOwotCQkoKGNoYXIgKikgZnJhbWUtPmRhdGEpWzFdID0gMDsKLQkJZnJhbWUtPnVzZWQgPSAyOwotCQlhdWRwbGF5X3NlbmRfZGF0YShhdWRpbywgMCk7Ci0KLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkoIWF1ZGlvLT5vdXRbMF0udXNlZCAmJgotCQkJIWF1ZGlvLT5vdXRbMV0udXNlZCAmJgotCQkJYXVkaW8tPm91dF9uZWVkZWQpIHx8IGF1ZGlvLT53Zmx1c2gpOwotCi0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGRvbmU7Ci0JCWVsc2UgaWYgKGF1ZGlvLT53Zmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCi0JLyogcGNtIGRtYW1pc3MgbWVzc2FnZSBpcyBzZW50IGNvbnRpbm91c2x5Ci0JICogd2hlbiBkZWNvZGVyIGlzIHN0YXJ2ZWQgc28gbm8gcmFjZQotCSAqIGNvbmRpdGlvbiBjb25jZXJuCi0JICovCi0JYXVkaW8tPnRlb3MgPSAwOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCWF1ZGlvLT50ZW9zIHx8IGF1ZGlvLT53Zmx1c2gpOwotCi0JaWYgKGF1ZGlvLT53Zmx1c2gpCi0JCXJjID0gLUVCVVNZOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotZG9uZV9ub2xvY2s6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRpb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCi0JCQkgIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCWludCByYyA9IDA7Ci0KLQlpZiAoIWF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCXJldHVybiAwOyAvKiBQQ00gZmVlZGJhY2sgaXMgbm90IGVuYWJsZWQuIE5vdGhpbmcgdG8gcmVhZCAqLwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JTU1fREJHKCIlZCBcbiIsIGNvdW50KTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT5yZWFkX3dhaXQsCi0JCQkoYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQgPiAwKSB8fAotCQkJKGF1ZGlvLT5zdG9wcGVkKSB8fCAoYXVkaW8tPnJmbHVzaCkpOwotCi0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPnJmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChjb3VudCA8IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkKSB7Ci0JCQkvKiBSZWFkIG11c3QgaGFwcGVuIGluIGZyYW1lIGJvdW5kYXJ5LiBTaW5jZSBkcml2ZXIKLQkJCSAgIGRvZXMgbm90IGtub3cgZnJhbWUgc2l6ZSwgcmVhZCBjb3VudCBtdXN0IGJlIGdyZWF0ZXIKLQkJCSAgIG9yIGVxdWFsIHRvIHNpemUgb2YgUENNIHNhbXBsZXMgKi8KLQkJCU1NX0RCRygiYXVkaW9fcmVhZDogbm8gcGFydGlhbCBmcmFtZSBkb25lIHJlYWRpbmdcbiIpOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9EQkcoImF1ZGlvX3JlYWQ6IHJlYWQgZnJvbSBpblslZF1cbiIsCi0JCQkJCWF1ZGlvLT5yZWFkX25leHQpOwotCQkJaWYgKGNvcHlfdG9fdXNlcgotCQkJICAgIChidWYsIGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS5kYXRhLAotCQkJICAgICBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCkpIHsKLQkJCQlNTV9FUlIoImludmFsaWQgYWRkciAleCBcbiIsICh1bnNpZ25lZCBpbnQpYnVmKTsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljb3VudCAtPSBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZDsKLQkJCWJ1ZiArPSBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZDsKLQkJCWF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkID0gMDsKLQkJCWlmICgoKythdWRpby0+cmVhZF9uZXh0KSA9PSBhdWRpby0+cGNtX2J1Zl9jb3VudCkKLQkJCQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQkJCWJyZWFrOwkvKiBGb3JjZSB0byBleGl0IHdoaWxlIGxvb3AKLQkJCQkgKiB0byBwcmV2ZW50IG91dHB1dCB0aHJlYWQKLQkJCQkgKiBzbGVlcCB0b28gbG9uZyBpZiBkYXRhIGlzCi0JCQkJICogbm90IHJlYWR5IGF0IHRoaXMgbW9tZW50LgotCQkJCSAqLwotCQl9Ci0JfQotCi0JLyogZG9uJ3QgZmVlZCBvdXRwdXQgYnVmZmVyIHRvIEhXIGRlY29kZXIgZHVyaW5nIGZsdXNoaW5nCi0JICogYnVmZmVyIHJlZnJlc2ggY29tbWFuZCB3aWxsIGJlIHNlbnQgb25jZSBmbHVzaCBjb21wbGV0ZXMKLQkgKiBzZW5kIGJ1ZiByZWZyZXNoIGNvbW1hbmQgaGVyZSBjYW4gY29uZnVzZSBIVyBkZWNvZGVyCi0JICovCi0JaWYgKGF1ZGlvLT5idWZfcmVmcmVzaCAmJiAhYXVkaW8tPnJmbHVzaCkgewotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCQlNTV9EQkcoImtpY2sgc3RhcnQgcGNtIGZlZWRiYWNrIGFnYWluXG4iKTsKLQkJYXVkcGxheV9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQotCWlmIChidWYgPiBzdGFydCkKLQkJcmMgPSBidWYgLSBzdGFydDsKLQotCU1NX0RCRygicmVhZCAlZCBieXRlc1xuIiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRhZHBjbV9wcm9jZXNzX2VvcyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQljb25zdCBjaGFyIF9fdXNlciAqYnVmX3N0YXJ0LCB1bnNpZ25lZCBzaG9ydCBtZmllbGRfc2l6ZSkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWNoYXIgKmJ1Zl9wdHI7Ci0KLQlpZiAoYXVkaW8tPnJlc2VydmVkKSB7Ci0JCU1NX0RCRygiZmx1c2ggcmVzZXJ2ZSBieXRlXG4iKTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF9oZWFkOwotCQlidWZfcHRyID0gZnJhbWUtPmRhdGE7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCShmcmFtZS0+dXNlZCA9PSAwKQotCQkJCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQl8fCAoYXVkaW8tPndmbHVzaCkpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBkb25lOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlidWZfcHRyWzBdID0gYXVkaW8tPnJzdl9ieXRlOwotCQlidWZfcHRyWzFdID0gMDsKLQkJYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JCWZyYW1lLT5tZmllbGRfc3ogPSAwOwotCQlmcmFtZS0+dXNlZCA9IDI7Ci0JCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQl9Ci0KLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKGF1ZGlvLT5vdXRfbmVlZGVkICYmCi0JCWF1ZGlvLT5vdXRbMF0udXNlZCA9PSAwICYmCi0JCWF1ZGlvLT5vdXRbMV0udXNlZCA9PSAwKQotCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoZnJhbWUtPmRhdGEsIGJ1Zl9zdGFydCwgbWZpZWxkX3NpemUpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlmcmFtZS0+dXNlZCA9IG1maWVsZF9zaXplOwotCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRpb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0Jc2l6ZV90IHhmZXI7Ci0JY2hhciAqY3B5X3B0cjsKLQlpbnQgcmMgPSAwLCBlb3NfY29uZGl0aW9uID0gQVVEQURQQ01fRU9TX05PTkU7Ci0JdW5zaWduZWQgZHNpemU7Ci0JdW5zaWduZWQgc2hvcnQgbWZpZWxkX3NpemUgPSAwOwotCi0JTU1fREJHKCJjbnQ9JWRcbiIsIGNvdW50KTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQkJY3B5X3B0ciA9IGZyYW1lLT5kYXRhOwotCQlkc2l6ZSA9IDA7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCQkgICAgICAoZnJhbWUtPnVzZWQgPT0gMCkKLQkJCQkJICAgICAgfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQkJCQkJICB8fCAoYXVkaW8tPndmbHVzaCkpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChhdWRpby0+bWZpZWxkKSB7Ci0JCQlpZiAoYnVmID09IHN0YXJ0KSB7Ci0JCQkJLyogUHJvY2Vzc2luZyBiZWdpbm5pbmcgb2YgdXNlciBidWZmZXIgKi8KLQkJCQlpZiAoX19nZXRfdXNlcihtZmllbGRfc2l6ZSwKLQkJCQkJKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSBidWYpKSB7Ci0JCQkJCXJjID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlICBpZiAobWZpZWxkX3NpemUgPiBjb3VudCkgewotCQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlNTV9EQkcoImF1ZGlvX3dyaXRlOiBtZiBvZmZzZXRfdmFsICV4XG4iLAotCQkJCQkJbWZpZWxkX3NpemUpOwotCQkJCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIG1maWVsZF9zaXplKSkgewotCQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvKiBDaGVjayBpZiBFT1MgZmxhZyBpcyBzZXQgYW5kIGJ1ZmZlciBoYXMKLQkJCQkgKiBjb250YWlucyBqdXN0IG1ldGEgZmllbGQKLQkJCQkgKi8KLQkJCQlpZiAoY3B5X3B0cltBVURBRFBDTV9FT1NfRkxHX09GRlNFVF0gJgotCQkJCQkJIEFVREFEUENNX0VPU19GTEdfTUFTSykgewotCQkJCQlNTV9EQkcoImF1ZGlvX3dyaXRlOiBFT1MgU0VUXG4iKTsKLQkJCQkJZW9zX2NvbmRpdGlvbiA9IEFVREFEUENNX0VPU19TRVQ7Ci0JCQkJCWlmIChtZmllbGRfc2l6ZSA9PSBjb3VudCkgewotCQkJCQkJYnVmICs9IG1maWVsZF9zaXplOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZQotCQkJCQljcHlfcHRyW0FVREFEUENNX0VPU19GTEdfT0ZGU0VUXQotCQkJCQkJJj0gfkFVREFEUENNX0VPU19GTEdfTUFTSzsKLQkJCQl9Ci0JCQkJY3B5X3B0ciArPSBtZmllbGRfc2l6ZTsKLQkJCQljb3VudCAtPSBtZmllbGRfc2l6ZTsKLQkJCQlkc2l6ZSArPSBtZmllbGRfc2l6ZTsKLQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQl9IGVsc2UgewotCQkJCW1maWVsZF9zaXplID0gMDsKLQkJCQlNTV9EQkcoImF1ZGlvX3dyaXRlOiBjb250aW51b3VzIGJ1ZmZlclxuIik7Ci0JCQl9Ci0JCQlmcmFtZS0+bWZpZWxkX3N6ID0gbWZpZWxkX3NpemU7Ci0JCX0KLQotCQlpZiAoYXVkaW8tPnJlc2VydmVkKSB7Ci0JCQlNTV9EQkcoImFwcGVuZCByZXNlcnZlZCBieXRlICV4XG4iLCBhdWRpby0+cnN2X2J5dGUpOwotCQkJKmNweV9wdHIgPSBhdWRpby0+cnN2X2J5dGU7Ci0JCQl4ZmVyID0gKGNvdW50ID4gKChmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSAtIDEpKSA/Ci0JCQkJKGZyYW1lLT5zaXplIC0gbWZpZWxkX3NpemUpIC0gMSA6IGNvdW50OwotCQkJY3B5X3B0cisrOwotCQkJZHNpemUgKz0gMTsKLQkJCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JCX0gZWxzZQotCQkJeGZlciA9IChjb3VudCA+IChmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSkgPwotCQkJCShmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSA6IGNvdW50OwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIHhmZXIpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWRzaXplICs9IHhmZXI7Ci0JCWlmIChkc2l6ZSAmIDEpIHsKLQkJCWF1ZGlvLT5yc3ZfYnl0ZSA9ICgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbZHNpemUgLSAxXTsKLQkJCU1NX0RCRygib2RkIGxlbmd0aCBidWYgcmVzZXJ2ZSBsYXN0IGJ5dGUgJXhcbiIsCi0JCQkJCWF1ZGlvLT5yc3ZfYnl0ZSk7Ci0JCQlhdWRpby0+cmVzZXJ2ZWQgPSAxOwotCQkJZHNpemUtLTsKLQkJfQotCQljb3VudCAtPSB4ZmVyOwotCQlidWYgKz0geGZlcjsKLQotCQlpZiAoZHNpemUgPiAwKSB7Ci0JCQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQkJCWZyYW1lLT51c2VkID0gZHNpemU7Ci0JCQlhdWRwbGF5X3NlbmRfZGF0YShhdWRpbywgMCk7Ci0JCX0KLQl9Ci0JaWYgKGVvc19jb25kaXRpb24gPT0gQVVEQURQQ01fRU9TX1NFVCkKLQkJcmMgPSBhdWRhZHBjbV9wcm9jZXNzX2VvcyhhdWRpbywgc3RhcnQsIG1maWVsZF9zaXplKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlpZiAoIXJjKSB7Ci0JCWlmIChidWYgPiBzdGFydCkKLQkJCXJldHVybiBidWYgLSBzdGFydDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCU1NX0lORk8oImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBmcmVlaW5nXG4iLCAoaW50KWF1ZGlvKTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRkZXZfdW5yZWdpc3Rlcl9ldnRfbGlzdG5lcihBVURERVZfQ0xOVF9ERUMsIGF1ZGlvLT5kZWNfaWQpOwotCWF1ZGlvX2Rpc2FibGUoYXVkaW8pOwotCWF1ZGlvX2ZsdXNoKGF1ZGlvKTsKLQlhdWRpb19mbHVzaF9wY21fYnVmKGF1ZGlvKTsKLQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHBsYXkpOwotCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCXVucmVnaXN0ZXJfZWFybHlfc3VzcGVuZCgmYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUpOwotI2VuZGlmCi0JYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0JYXVkYWRwY21fcmVzZXRfZXZlbnRfcXVldWUoYXVkaW8pOwotCWlvdW5tYXAoYXVkaW8tPm1hcF92X3dyaXRlKTsKLQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKGF1ZGlvLT5waHlzKTsKLQlpZiAoYXVkaW8tPnJlYWRfZGF0YSkgewotCQlpb3VubWFwKGF1ZGlvLT5tYXBfdl9yZWFkKTsKLQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcihhdWRpby0+cmVhZF9waHlzKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JaWYgKGF1ZGlvLT5kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKGF1ZGlvLT5kZW50cnkpOwotI2VuZGlmCi0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0YXRpYyB2b2lkIGF1ZGFkcGNtX3Bvc3RfZXZlbnQoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHR5cGUsCi0JCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQpCi17Ci0Jc3RydWN0IGF1ZGFkcGNtX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpKSB7Ci0JCWVfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWRhZHBjbV9ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZlX25vZGUtPmxpc3QpOwotCX0gZWxzZSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRhZHBjbV9ldmVudCksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWVfbm9kZSkgewotCQkJTU1fRVJSKCJObyBtZW0gdG8gcG9zdCBldmVudCAlZFxuIiwgdHlwZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQllX25vZGUtPmV2ZW50X3R5cGUgPSB0eXBlOwotCWVfbm9kZS0+cGF5bG9hZCA9IHBheWxvYWQ7Ci0KLQlsaXN0X2FkZF90YWlsKCZlX25vZGUtPmxpc3QsICZhdWRpby0+ZXZlbnRfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhZHBjbV9zdXNwZW5kKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRhZHBjbV9zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWRhZHBjbV9zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkYWRwY21fcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9TVVNQRU5ELCBwYXlsb2FkKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkYWRwY21fcmVzdW1lKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRhZHBjbV9zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWRhZHBjbV9zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkYWRwY21fcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9SRVNVTUUsIHBheWxvYWQpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBzc2l6ZV90IGF1ZGFkcGNtX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkYWRwY21fZGVidWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY29uc3QgaW50IGRlYnVnX2J1Zm1heCA9IDQwOTY7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyWzQwOTZdOwotCWludCBuID0gMCwgaTsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCW4gPSBzY25wcmludGYoYnVmZmVyLCBkZWJ1Z19idWZtYXgsICJvcGVuZWQgJWRcbiIsIGF1ZGlvLT5vcGVuZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgImVuYWJsZWQgJWRcbiIsIGF1ZGlvLT5lbmFibGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJzdG9wcGVkICVkXG4iLCBhdWRpby0+c3RvcHBlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicGNtX2ZlZWRiYWNrICVkXG4iLCBhdWRpby0+cGNtX2ZlZWRiYWNrKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfYnVmX3N6ICVkXG4iLCBhdWRpby0+b3V0WzBdLnNpemUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInBjbV9idWZfY291bnQgJWQgXG4iLCBhdWRpby0+cGNtX2J1Zl9jb3VudCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicGNtX2J1Zl9zeiAlZCBcbiIsIGF1ZGlvLT5pblswXS5zaXplKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJ2b2x1bWUgJXggXG4iLCBhdWRpby0+dm9sX3Bhbi52b2x1bWUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInNhbXBsZSByYXRlICVkIFxuIiwgYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJImNoYW5uZWwgbW9kZSAlZCBcbiIsIGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkvKiBGb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBvbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHdoZW4KLQkgKiB3aGVuIHBsYXliYWNrIGhhbHRzIHVuZXhwZWN0ZWRseS4gVGh1cywgbm8gbXV0dWFsIGV4Y2x1c2lvbgotCSAqIGVuZm9yY2VkCi0JICovCi0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAid2ZsdXNoICVkXG4iLCBhdWRpby0+d2ZsdXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJyZmx1c2ggJWRcbiIsIGF1ZGlvLT5yZmx1c2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInJ1bm5pbmcgJWQgXG4iLCBhdWRpby0+cnVubmluZyk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJkZWMgc3RhdGUgJWQgXG4iLCBhdWRpby0+ZGVjX3N0YXRlKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfbmVlZGVkICVkIFxuIiwgYXVkaW8tPm91dF9uZWVkZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dF9oZWFkICVkIFxuIiwgYXVkaW8tPm91dF9oZWFkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfdGFpbCAlZCBcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0WzBdLnVzZWQgJWQgXG4iLCBhdWRpby0+b3V0WzBdLnVzZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dFsxXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFsxXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJidWZmZXJfcmVmcmVzaCAlZCBcbiIsIGF1ZGlvLT5idWZfcmVmcmVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicmVhZF9uZXh0ICVkIFxuIiwgYXVkaW8tPnJlYWRfbmV4dCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAiZmlsbF9uZXh0ICVkIFxuIiwgYXVkaW8tPmZpbGxfbmV4dCk7Ci0JZm9yIChpID0gMDsgaSA8IGF1ZGlvLT5wY21fYnVmX2NvdW50OyBpKyspCi0JCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiaW5bJWRdLnNpemUgJWQgXG4iLCBpLCBhdWRpby0+aW5baV0udXNlZCk7Ci0JYnVmZmVyW25dID0gMDsKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkYWRwY21fZGVidWdfZm9wcyA9IHsKLQkucmVhZCA9IGF1ZGFkcGNtX2RlYnVnX3JlYWQsCi0JLm9wZW4gPSBhdWRhZHBjbV9kZWJ1Z19vcGVuLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IE5VTEw7Ci0JaW50IHJjLCBkZWNfYXR0cmIsIGRlY2lkLCBpOwotCXVuc2lnbmVkIHBtZW1fc3ogPSBETUFTWl9NQVg7Ci0Jc3RydWN0IGF1ZGFkcGNtX2V2ZW50ICplX25vZGUgPSBOVUxMOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCi0JY2hhciBuYW1lW3NpemVvZiAibXNtX2FkcGNtXyIgKyA1XTsKLSNlbmRpZgotCi0JLyogQWxsb2NhdGUgTWVtIGZvciBhdWRpbyBpbnN0YW5jZSAqLwotCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhdWRpbykgewotCQlNTV9FUlIoIm5vIG1lbW9yeSB0byBhbGxvY2F0ZSBhdWRpbyBpbnN0YW5jZSBcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JTU1fSU5GTygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGNyZWF0ZWRcbiIsIChpbnQpYXVkaW8pOwotCi0JLyogQWxsb2NhdGUgdGhlIGRlY29kZXIgKi8KLQlkZWNfYXR0cmIgPSBBVURERUNfREVDX0FEUENNOwotCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9OT05UVU5ORUw7Ci0JCWF1ZGlvLT5wY21fZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREVfUExBWUJBQ0s7Ci0JfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWRlY19hdHRyYiB8PSBNU01fQVVEX01PREVfVFVOTkVMOwotCQlhdWRpby0+cGNtX2ZlZWRiYWNrID0gVFVOTkVMX01PREVfUExBWUJBQ0s7Ci0JfSBlbHNlIHsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlkZWNpZCA9IGF1ZHBwX2FkZWNfYWxsb2MoZGVjX2F0dHJiLCAmYXVkaW8tPm1vZHVsZV9uYW1lLAotCQkJJmF1ZGlvLT5xdWV1ZV9pZCk7Ci0KLQlpZiAoZGVjaWQgPCAwKSB7Ci0JCU1NX0VSUigiTm8gZnJlZSBkZWNvZGVyIGF2YWlsYWJsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJKGludClhdWRpbyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJa2ZyZWUoYXVkaW8pOwotCQlnb3RvIGRvbmU7Ci0JfQotCWF1ZGlvLT5kZWNfaWQgPSBkZWNpZCAmIE1TTV9BVURfREVDT0RFUl9NQVNLOwotCi0Jd2hpbGUgKHBtZW1fc3ogPj0gRE1BU1pfTUlOKSB7Ci0JCU1NX0RCRygicG1lbXN6ID0gJWRcbiIsIHBtZW1fc3opOwotCQlhdWRpby0+cGh5cyA9IGFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKHBtZW1fc3osCi0JCQkJCQkJCQlTWl80Syk7Ci0JCWlmIChhdWRpby0+cGh5cykgewotCQkJYXVkaW8tPm1hcF92X3dyaXRlID0gaW9yZW1hcChhdWRpby0+cGh5cywgcG1lbV9zeik7Ci0JCQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl93cml0ZSkpIHsKLQkJCQlNTV9FUlIoImNvdWxkIG5vdCBtYXAgd3JpdGUgcGh5cyBhZGRyZXNzLCBcCi0JCQkJCQlmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQkJCShpbnQpYXVkaW8pOwotCQkJCXJjID0gLUVOT01FTTsKLQkJCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKGF1ZGlvLT5waHlzKTsKLQkJCQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0JCQkJa2ZyZWUoYXVkaW8pOwotCQkJCWdvdG8gZG9uZTsKLQkJCX0KLQkJCWF1ZGlvLT5kYXRhID0gYXVkaW8tPm1hcF92X3dyaXRlOwotCQkJTU1fREJHKCJ3cml0ZSBidWY6IHBoeSBhZGRyIDB4JTA4eCBrZXJuZWwgYWRkciBcCi0JCQkJMHglMDh4XG4iLCBhdWRpby0+cGh5cywgKGludClhdWRpby0+ZGF0YSk7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChwbWVtX3N6ID09IERNQVNaX01JTikgewotCQkJTU1fRVJSKCJjb3VsZCBub3QgYWxsb2NhdGUgd3JpdGUgYnVmZmVycywgZnJlZWluZyBcCi0JCQkJCWluc3RhbmNlIDB4JTA4eFxuIiwgKGludClhdWRpbyk7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0JCQlrZnJlZShhdWRpbyk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0gZWxzZQotCQlwbWVtX3N6ID4+PSAxOwotCX0KLQlhdWRpby0+b3V0X2RtYV9zeiA9IHBtZW1fc3o7Ci0KLQlyYyA9IG1zbV9hZHNwX2dldChhdWRpby0+bW9kdWxlX25hbWUsICZhdWRpby0+YXVkcGxheSwKLQkJCSZhdWRwbGF5X2Fkc3Bfb3BzX2FkcGNtLCBhdWRpbyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiZmFpbGVkIHRvIGdldCAlcyBtb2R1bGUsIGZyZWVpbmcgaW5zdGFuY2UgMHglMDh4XG4iLAotCQkJCWF1ZGlvLT5tb2R1bGVfbmFtZSwgKGludClhdWRpbyk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCW11dGV4X2luaXQoJmF1ZGlvLT5sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPnJlYWRfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmRzcF9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPmF2c3luY193YWl0KTsKLQotCWF1ZGlvLT5vdXRbMF0uZGF0YSA9IGF1ZGlvLT5kYXRhICsgMDsKLQlhdWRpby0+b3V0WzBdLmFkZHIgPSBhdWRpby0+cGh5cyArIDA7Ci0JYXVkaW8tPm91dFswXS5zaXplID0gYXVkaW8tPm91dF9kbWFfc3ogPj4gMTsKLQotCWF1ZGlvLT5vdXRbMV0uZGF0YSA9IGF1ZGlvLT5kYXRhICsgYXVkaW8tPm91dFswXS5zaXplOwotCWF1ZGlvLT5vdXRbMV0uYWRkciA9IGF1ZGlvLT5waHlzICsgYXVkaW8tPm91dFswXS5zaXplOwotCWF1ZGlvLT5vdXRbMV0uc2l6ZSA9IGF1ZGlvLT5vdXRbMF0uc2l6ZTsKLQotCWF1ZGlvLT5vdXRfc2FtcGxlX3JhdGUgPSA0NDEwMDsKLQlhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9IEFVRFBQX0NNRF9QQ01fSU5URl9TVEVSRU9fVjsKLQotCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IDB4MjAwMDsKLQotCWF1ZGlvX2ZsdXNoKGF1ZGlvKTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOwotCWF1ZGlvLT5vcGVuZWQgPSAxOwotCi0JYXVkaW8tPmRldmljZV9ldmVudHMgPSBBVURERVZfRVZUX0RFVl9SRFkKLQkJCQl8QVVEREVWX0VWVF9ERVZfUkxTfAotCQkJCUFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEc7Ci0KLQlyYyA9IGF1ZGRldl9yZWdpc3Rlcl9ldnRfbGlzdG5lcihhdWRpby0+ZGV2aWNlX2V2ZW50cywKLQkJCQkJQVVEREVWX0NMTlRfREVDLAotCQkJCQlhdWRpby0+ZGVjX2lkLAotCQkJCQlhZHBjbV9saXN0bmVyLAotCQkJCQkodm9pZCAqKWF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGxpc3RuZXJcbiIsIF9fZnVuY19fKTsKLQkJZ290byBldmVudF9lcnI7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mIG5hbWUsICJtc21fYWRwY21fJTA0eCIsIGF1ZGlvLT5kZWNfaWQpOwotCWF1ZGlvLT5kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCU5VTEwsICh2b2lkICopIGF1ZGlvLAotCQkJCSZhdWRhZHBjbV9kZWJ1Z19mb3BzKTsKLQotCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCi0JCU1NX0RCRygiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5sZXZlbCA9IEVBUkxZX1NVU1BFTkRfTEVWRUxfRElTQUJMRV9GQjsKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5yZXN1bWUgPSBhdWRhZHBjbV9yZXN1bWU7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUuc3VzcGVuZCA9IGF1ZGFkcGNtX3N1c3BlbmQ7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLmF1ZGlvID0gYXVkaW87Ci0JcmVnaXN0ZXJfZWFybHlfc3VzcGVuZCgmYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUpOwotI2VuZGlmCi0JZm9yIChpID0gMDsgaSA8IEFVREFEUENNX0VWRU5UX05VTTsgaSsrKSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRhZHBjbV9ldmVudCksIEdGUF9LRVJORUwpOwotCQlpZiAoZV9ub2RlKQotCQkJbGlzdF9hZGRfdGFpbCgmZV9ub2RlLT5saXN0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCQllbHNlIHsKLQkJCU1NX0VSUigiZXZlbnQgcGt0IGFsbG9jIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotZXZlbnRfZXJyOgotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci1lcnI6Ci0JaW91bm1hcChhdWRpby0+bWFwX3Zfd3JpdGUpOwotCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPnBoeXMpOwotCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19hZHBjbV9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBhdWRpb19vcGVuLAotCS5yZWxlYXNlCT0gYXVkaW9fcmVsZWFzZSwKLQkucmVhZCAJCT0gYXVkaW9fcmVhZCwKLQkud3JpdGUJCT0gYXVkaW9fd3JpdGUsCi0JLnVubG9ja2VkX2lvY3RsCT0gYXVkaW9faW9jdGwsCi0JLmZzeW5jIAkJPSBhdWRpb19mc3luYywKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2FkcGNtX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gIm1zbV9hZHBjbSIsCi0JLmZvcHMJPSAmYXVkaW9fYWRwY21fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGlvX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fYWRwY21fbWlzYyk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhdWRpb19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fYW1ybmIuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fYW1ybmIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0ZjZlMS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2Ftcm5iLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQ0ICswLDAgQEAKLS8qCi0gKiBhbXJuYiBhdWRpbyBkZWNvZGVyIGRldmljZQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBCYXNlZCBvbiB0aGUgbXAzIG5hdGl2ZSBkcml2ZXIgaW4gYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkaW9fbXAzLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKgotICogQWxsIHNvdXJjZSBjb2RlIGluIHRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgZXhjZXB0Ci0gKiB3aGVyZSBpbmRpY2F0ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAotICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gZmluZCBpdCBhdCBodHRwOi8vd3d3LmZzZi5vcmcKLSAqLwotCi0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9lYXJseXN1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1vcnlfYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXUuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11X2RvbWFpbnMuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBwbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcGxheWNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRwbGF5bXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2Rldl9jdGwuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkcHAuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fbWVtdHlwZXMuaD4KLQotI2RlZmluZSBCVUZTWiAxMDI0IC8qIEhvbGQgbWluaW11bSA3MDBtcyB2b2ljZSBkYXRhIGFuZCAxNCBieXRlcyBvZiBtZXRhIGluKi8KLSNkZWZpbmUgRE1BU1ogKEJVRlNaICogMikKLQotI2RlZmluZSBBVURQTEFZX0lOVkFMSURfUkVBRF9QVFJfT0ZGU0VUCTB4RkZGRgotI2RlZmluZSBBVURERUNfREVDX0FNUk5CIDEwCi0KLSNkZWZpbmUgUENNX0JVRlNaX01JTiAxNjI0IC8qIDEwMG1zIHdvcnRoIG9mIGRhdGEgYW5kIDI0IGJ5dGVzIG9mIG1ldGEgb3V0Ki8KLSNkZWZpbmUgQU1STkJfREVDT0RFRF9GUlNaIDMyMCAvKiBBTVItTkIgMjBtcyA4S0h6IG1vbm8gUENNIHNpemUgKi8KLSNkZWZpbmUgUENNX0JVRl9NQVhfQ09VTlQgNQkvKiBEU1Agb25seSBhY2NlcHRzIDUgYnVmZmVycyBhdCBtb3N0Ci0JCQkJICAgYnV0IHN1cHBvcnQgMiBidWZmZXJzIGN1cnJlbnRseSAqLwotI2RlZmluZSBST1VUSU5HX01PREVfRlRSVCAxCi0jZGVmaW5lIFJPVVRJTkdfTU9ERV9SVCAyCi0vKiBEZWNvZGVyIHN0YXR1cyByZWNlaXZlZCBmcm9tIEFVRFBQVEFTSyAqLwotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19TTEVFUAkwCi0jZGVmaW5lCSBBVURQUF9ERUNfU1RBVFVTX0lOSVQgIDEKLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfQ0ZHICAgMgotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19QTEFZICAzCi0KLSNkZWZpbmUgQVVEQU1STkJfTUVUQUZJRUxEX01BU0sgMHhGRkZGMDAwMAotI2RlZmluZSBBVURBTVJOQl9FT1NfRkxHX09GRlNFVCAweDBBIC8qIE9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBidWZmZXIgKi8KLSNkZWZpbmUgQVVEQU1STkJfRU9TX0ZMR19NQVNLIDB4MDEKLSNkZWZpbmUgQVVEQU1STkJfRU9TX05PTkUgMHgwIC8qIE5vIEVPUyBkZXRlY3RlZCAqLwotI2RlZmluZSBBVURBTVJOQl9FT1NfU0VUIDB4MSAvKiBFT1Mgc2V0IGluIG1ldGEgZmllbGQgKi8KLQotI2RlZmluZSBBVURBTVJOQl9FVkVOVF9OVU0gMTAgLyogRGVmYXVsdCBudW1iZXIgb2YgcHJlLWFsbG9jYXRlZCBldmVudCBwa3RzICovCi0KLXN0cnVjdCBidWZmZXIgewotCXZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgc2l6ZTsKLQl1bnNpZ25lZCB1c2VkOwkJLyogSW5wdXQgdXNhZ2UgYWN0dWFsIERTUCBwcm9kdWNlZCBQQ00gc2l6ZSAgKi8KLQl1bnNpZ25lZCBhZGRyOwotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zejsgLypvbmx5IHVzZWZ1bCBmb3IgZGF0YSBoYXMgbWV0YSBmaWVsZCAqLwotfTsKLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdHJ1Y3QgYXVkYW1ybmJfc3VzcGVuZF9jdGwgewotCXN0cnVjdCBlYXJseV9zdXNwZW5kIG5vZGU7Ci0Jc3RydWN0IGF1ZGlvICphdWRpbzsKLX07Ci0jZW5kaWYKLQotc3RydWN0IGF1ZGFtcm5iX2V2ZW50ewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlpbnQgZXZlbnRfdHlwZTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotfTsKLQotc3RydWN0IGF1ZGlvIHsKLQlzdHJ1Y3QgYnVmZmVyIG91dFsyXTsKLQotCXNwaW5sb2NrX3QgZHNwX2xvY2s7Ci0KLQl1aW50OF90IG91dF9oZWFkOwotCXVpbnQ4X3Qgb3V0X3RhaWw7Ci0JdWludDhfdCBvdXRfbmVlZGVkOwkvKiBudW1iZXIgb2YgYnVmZmVycyB0aGUgZHNwIGlzIHdhaXRpbmcgZm9yICovCi0KLQlhdG9taWNfdCBvdXRfYnl0ZXM7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggd3JpdGVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3cml0ZV93YWl0OwotCi0JLyogSG9zdCBQQ00gc2VjdGlvbiAqLwotCXN0cnVjdCBidWZmZXIgaW5bUENNX0JVRl9NQVhfQ09VTlRdOwotCXN0cnVjdCBtdXRleCByZWFkX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF93YWl0OwkvKiBXYWl0IHF1ZXVlIGZvciByZWFkICovCi0JY2hhciAqcmVhZF9kYXRhOwkvKiBwb2ludGVyIHRvIHJlYWRlciBidWZmZXIgKi8KLQlpbnQzMl90IHJlYWRfcGh5czsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiByZWFkZXIgYnVmZmVyICovCi0JdWludDhfdCByZWFkX25leHQ7CS8qIGluZGV4IHRvIGlucHV0IGJ1ZmZlcnMgdG8gYmUgcmVhZCBuZXh0ICovCi0JdWludDhfdCBmaWxsX25leHQ7CS8qIGluZGV4IHRvIGJ1ZmZlciB0aGF0IERTUCBzaG91bGQgYmUgZmlsbGluZyAqLwotCXVpbnQ4X3QgcGNtX2J1Zl9jb3VudDsJLyogbnVtYmVyIG9mIHBjbSBidWZmZXIgYWxsb2NhdGVkICovCi0JLyogLS0tLSBFbmQgb2YgSG9zdCBQQ00gc2VjdGlvbiAqLwotCi0Jc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqYXVkcGxheTsKLQotCS8qIGRhdGEgYWxsb2NhdGVkIGZvciB2YXJpb3VzIGJ1ZmZlcnMgKi8KLQljaGFyICpkYXRhOwotCWludDMyX3QgcGh5czsgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB3cml0ZSBidWZmZXIgKi8KLQl2b2lkICptYXBfdl9yZWFkOwotCXZvaWQgKm1hcF92X3dyaXRlOwotCi0JaW50IG1maWVsZDsgLyogbWV0YSBmaWVsZCBlbWJlZGRlZCBpbiBkYXRhICovCi0JaW50IHJmbHVzaDsgLyogUmVhZCAgZmx1c2ggKi8KLQlpbnQgd2ZsdXNoOyAvKiBXcml0ZSBmbHVzaCAqLwotCXVpbnQ4X3Qgb3BlbmVkOjE7Ci0JdWludDhfdCBlbmFibGVkOjE7Ci0JdWludDhfdCBydW5uaW5nOjE7Ci0JdWludDhfdCBzdG9wcGVkOjE7CS8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQl1aW50OF90IHBjbV9mZWVkYmFjazoxOwotCXVpbnQ4X3QgYnVmX3JlZnJlc2g6MTsKLQlpbnQgdGVvczsgLyogdmFsaWQgb25seSBpZiB0dW5uZWwgbW9kZSAmIG5vIGRhdGEgbGVmdCBmb3IgZGVjb2RlciAqLwotCWVudW0gbXNtX2F1ZF9kZWNvZGVyX3N0YXRlIGRlY19zdGF0ZTsJLyogUmVwcmVzZW50cyBkZWNvZGVyIHN0YXRlICovCi0KLQljb25zdCBjaGFyICptb2R1bGVfbmFtZTsKLQl1bnNpZ25lZCBxdWV1ZV9pZDsKLQl1aW50MTZfdCBkZWNfaWQ7Ci0JdWludDMyX3QgcmVhZF9wdHJfb2Zmc2V0OwotCWludDE2X3Qgc291cmNlOwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQlzdHJ1Y3QgYXVkYW1ybmJfc3VzcGVuZF9jdGwgc3VzcGVuZF9jdGw7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLSNlbmRpZgotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfZXZlbnRfcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBldmVudF9xdWV1ZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF93YWl0OwotCXNwaW5sb2NrX3QgZXZlbnRfcXVldWVfbG9jazsKLQlzdHJ1Y3QgbXV0ZXggZ2V0X2V2ZW50X2xvY2s7Ci0JaW50IGV2ZW50X2Fib3J0OwotCS8qIEFWIHN5bmMgSW5mbyAqLwotCWludCBhdnN5bmNfZmxhZzsgICAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgZmVlZGJhY2sgZnJvbSBEU1AgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBhdnN5bmNfd2FpdDsvKiBXYWl0IHF1ZXVlIGZvciBBViBTeW5jIE1lc3NhZ2UgICAgICovCi0JLyogZmxhZ3MsIDQ4IGJpdHMgc2FtcGxlL2J5dGVzIGNvdW50ZXIgcGVyIGNoYW5uZWwgKi8KLQl1aW50MTZfdCBhdnN5bmNbQVVEUFBfQVZTWU5DX0NIX0NPVU5UICogQVVEUFBfQVZTWU5DX05VTV9XT1JEUyArIDFdOwotCi0JdWludDMyX3QgZGV2aWNlX2V2ZW50czsKLQotCWludCBlcV9lbmFibGU7Ci0JaW50IGVxX25lZWRzX2NvbW1pdDsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyIGVxOwotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfdm9sdW1lIHZvbF9wYW47Ci19OwotCi1zdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19hbXJuYiB7Ci0gICBzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19jb21tb24gIGNvbW1vbjsKLSAgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9fY2ZnOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSA7Ci0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRhbXJuYl9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgbmVlZGVkKTsKLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX2NvbmZpZ19ob3N0cGNtKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkYW1ybmJfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRhbXJuYl9kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpOwotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdGF0aWMgdm9pZCBhdWRhbXJuYl9wb3N0X2V2ZW50KHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCB0eXBlLAotCQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkKTsKLSNlbmRpZgotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkYW1ybmJfZW5hYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCWF1ZGlvLT5vdXRfdGFpbCA9IDA7Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCi0JaWYgKG1zbV9hZHNwX2VuYWJsZShhdWRpby0+YXVkcGxheSkpIHsKLQkJTU1fRVJSKCJtc21fYWRzcF9lbmFibGUoYXVkcGxheSkgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKGF1ZHBwX2VuYWJsZShhdWRpby0+ZGVjX2lkLCBhdWRhbXJuYl9kc3BfZXZlbnQsIGF1ZGlvKSkgewotCQlNTV9FUlIoImF1ZHBwX2VuYWJsZSgpIGZhaWxlZFxuIik7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JYXVkaW8tPmVuYWJsZWQgPSAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhbXJuYl9saXN0bmVyKHUzMiBldnRfaWQsIHVuaW9uIGF1ZGRldl9ldnRfZGF0YSAqZXZ0X3BheWxvYWQsCi0JCQl2b2lkICpwcml2YXRlX2RhdGEpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IChzdHJ1Y3QgYXVkaW8gKikgcHJpdmF0ZV9kYXRhOwotCXN3aXRjaCAoZXZ0X2lkKSB7Ci0JY2FzZSBBVURERVZfRVZUX0RFVl9SRFk6Ci0JCU1NX0RCRygiOkFVRERFVl9FVlRfREVWX1JEWVxuIik7Ci0JCWF1ZGlvLT5zb3VyY2UgfD0gKDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0JCWlmIChhdWRpby0+cnVubmluZyA9PSAxICYmIGF1ZGlvLT5lbmFibGVkID09IDEpCi0JCQlhdWRwcF9yb3V0ZV9zdHJlYW0oYXVkaW8tPmRlY19pZCwgYXVkaW8tPnNvdXJjZSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEREVWX0VWVF9ERVZfUkxTOgotCQlNTV9EQkcoIjpBVURERVZfRVZUX0RFVl9STFNcbiIpOwotCQlhdWRpby0+c291cmNlICY9IH4oMHgxIDw8IGV2dF9wYXlsb2FkLT5yb3V0aW5nX2lkKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nID09IDEgJiYgYXVkaW8tPmVuYWJsZWQgPT0gMSkKLQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLCBhdWRpby0+c291cmNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURERVZfRVZUX1NUUkVBTV9WT0xfQ0hHOgotCQlhdWRpby0+dm9sX3Bhbi52b2x1bWUgPSBldnRfcGF5bG9hZC0+c2Vzc2lvbl92b2w7Ci0JCU1NX0RCRygiOkFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEcsIHN0cmVhbSB2b2wgJWRcbiIsCi0JCQkJYXVkaW8tPnZvbF9wYW4udm9sdW1lKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiOkVSUk9SOndyb25nIGV2ZW50XG4iKTsKLQkJYnJlYWs7Ci0JfQotfQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGFtcm5iX2Rpc2FibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JaWYgKGF1ZGlvLT5lbmFibGVkKSB7Ci0JCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCQlhdWRkZWNfZHNwX2NvbmZpZyhhdWRpbywgMCk7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXQsCi0JCQkJYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORSwKLQkJCQltc2Vjc190b19qaWZmaWVzKE1TTV9BVURfREVDT0RFUl9XQUlUX01TKSk7Ci0JCWlmIChyYyA9PSAwKQotCQkJcmMgPSAtRVRJTUVET1VUOwotCQllbHNlIGlmIChhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCQltc21fYWRzcF9kaXNhYmxlKGF1ZGlvLT5hdWRwbGF5KTsKLQkJYXVkcHBfZGlzYWJsZShhdWRpby0+ZGVjX2lkLCBhdWRpbyk7Ci0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX3VwZGF0ZV9wY21fYnVmX2VudHJ5KHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCXVpbnQzMl90ICpwYXlsb2FkKQotewotCXVpbnQ4X3QgaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChhdWRpby0+cmZsdXNoKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGF5bG9hZFsxXTsgaW5kZXgrKykgewotCQlpZiAoYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHIgPT0KLQkJICAgIHBheWxvYWRbMiArIGluZGV4ICogMl0pIHsKLQkJCU1NX0RCRygiaW5bJWRdIHJlYWR5XG4iLCBhdWRpby0+ZmlsbF9uZXh0KTsKLQkJCWF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS51c2VkID0KLQkJCSAgICBwYXlsb2FkWzMgKyBpbmRleCAqIDJdOwotCQkJaWYgKCgrK2F1ZGlvLT5maWxsX25leHQpID09IGF1ZGlvLT5wY21fYnVmX2NvdW50KQotCQkJCWF1ZGlvLT5maWxsX25leHQgPSAwOwotCi0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoImV4cGVjdGVkPSV4IHJldD0leFxuIiwKLQkJCQlhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uYWRkciwKLQkJCQlwYXlsb2FkWzEgKyBpbmRleCAqIDJdKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0udXNlZCA9PSAwKSB7Ci0JCWF1ZGFtcm5iX2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQl9IGVsc2UgewotCQlNTV9EQkcoInJlYWQgY2Fubm90IGtlZXAgdXBcbiIpOwotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAxOwotCX0KLQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGxheV9kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgICB2b2lkICgqZ2V0ZXZlbnQpICh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBkYXRhOwotCXVpbnQzMl90IG1zZ1syOF07Ci0JZ2V0ZXZlbnQobXNnLCBzaXplb2YobXNnKSk7Ci0KLQlNTV9EQkcoIm1zZ19pZD0leFxuIiwgaWQpOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUExBWV9NU0dfREVDX05FRURTX0RBVEE6Ci0JCWF1ZGFtcm5iX3NlbmRfZGF0YShhdWRpbywgMSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURQTEFZX01TR19CVUZGRVJfVVBEQVRFOgotCQlhdWRhbXJuYl91cGRhdGVfcGNtX2J1Zl9lbnRyeShhdWRpbywgbXNnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFEU1BfTUVTU0FHRV9JRDoKLQkJTU1fREJHKCJSZWNlaXZlZCBBRFNQIGV2ZW50OiBtb2R1bGUgZW5hYmxlKGF1ZHBsYXl0YXNrKVxuIik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJTU1fRVJSKCJ1bmV4cGVjdGVkIG1lc3NhZ2UgZnJvbSBkZWNvZGVyXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX2RzcF9ldmVudCh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gcHJpdmF0ZTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBQX01TR19TVEFUVVNfTVNHOnsKLQkJCXVuc2lnbmVkIHN0YXR1cyA9IG1zZ1sxXTsKLQotCQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19TTEVFUDogewotCQkJCXVpbnQxNl90IHJlYXNvbiA9IG1zZ1syXTsKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOnNsZWVwIHJlYXNvbiA9IFwKLQkJCQkJCTB4JTA0eFxuIiwgcmVhc29uKTsKLQkJCQlpZiAoKHJlYXNvbiA9PSBBVURQUF9NU0dfUkVBU09OX01FTSkKLQkJCQkJfHwgKHJlYXNvbiA9PQotCQkJCQlBVURQUF9NU0dfUkVBU09OX05PREVDT0RFUikpIHsKLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfRkFJTFVSRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0gZWxzZSBpZiAocmVhc29uID09IEFVRFBQX01TR19SRUFTT05fTk9ORSkgewotCQkJCQkvKiBkZWNvZGVyIGlzIGluIGRpc2FibGUgc3RhdGUgKi8KLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfQ0xPU0U7Ci0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfSU5JVDoKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBpbml0IFxuIik7Ci0JCQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCQkJCWF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKGF1ZGlvKTsKLQkJCQllbHNlCi0JCQkJCWF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoYXVkaW8pOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfQ0ZHOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IGNmZyBcbiIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX1BMQVk6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogcGxheSBcbiIpOwotCQkJCS8qIHNlbmQgIG1peGVyIGNvbW1hbmQgKi8KLQkJCQlhdWRwcF9yb3V0ZV9zdHJlYW0oYXVkaW8tPmRlY19pZCwKLQkJCQkJCWF1ZGlvLT5zb3VyY2UpOwotCQkJCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCQkJCWF1ZGFtcm5iX2NvbmZpZ19ob3N0cGNtKGF1ZGlvKTsKLQkJCQkJYXVkYW1ybmJfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCQkJCX0KLQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1M7Ci0JCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlNTV9FUlIoInVua25vd24gZGVjb2RlciBzdGF0dXMgXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURQUF9NU0dfQ0ZHX01TRzoKLQkJaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0VOQSkgewotCQkJTU1fREJHKCJDRkdfTVNHIEVOQUJMRVxuIik7Ci0JCQlhdWRkZWNfZHNwX2NvbmZpZyhhdWRpbywgMSk7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCQlhdWRpby0+cnVubmluZyA9IDE7Ci0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuLAotCQkJCQlQT1BQKTsKLQkJCWF1ZHBwX2RzcF9zZXRfZXEoYXVkaW8tPmRlY19pZCwgYXVkaW8tPmVxX2VuYWJsZSwKLQkJCQkJJmF1ZGlvLT5lcSwgUE9QUCk7Ci0JCX0gZWxzZSBpZiAobXNnWzBdID09IEFVRFBQX01TR19FTkFfRElTKSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgRElTQUJMRVxuIik7Ci0JCQlhdWRpby0+cnVubmluZyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgJWQ/XG4iLCBtc2dbMF0pOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX1JPVVRJTkdfQUNLOgotCQlNTV9EQkcoIlJPVVRJTkdfQUNLIG1vZGU9JWRcbiIsIG1zZ1sxXSk7Ci0JCWF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoYXVkaW8pOwotCQlicmVhazsKLQljYXNlIEFVRFBQX01TR19GTFVTSF9BQ0s6Ci0JCU1NX0RCRygiRkxVU0hfQUNLXG4iKTsKLQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQkJYXVkYW1ybmJfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCQlicmVhazsKLQljYXNlIEFVRFBQX01TR19QQ01ETUFNSVNTRUQ6Ci0JCU1NX0RCRygiUENNRE1BTUlTU0VEXG4iKTsKLQkJYXVkaW8tPnRlb3MgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURQUF9NU0dfQVZTWU5DX01TRzoKLQkJTU1fREJHKCJBVURQUF9NU0dfQVZTWU5DX01TR1xuIik7Ci0JCW1lbWNweSgmYXVkaW8tPmF2c3luY1swXSwgbXNnLCBzaXplb2YoYXVkaW8tPmF2c3luYykpOwotCQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+YXZzeW5jX3dhaXQpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiVU5LTk9XTiAoJWQpXG4iLCBpZCk7Ci0JfQotCi19Ci0KLXN0cnVjdCBtc21fYWRzcF9vcHMgYXVkcGxheV9hZHNwX29wc19hbXJuYiA9IHsKLQkuZXZlbnQgPSBhdWRwbGF5X2RzcF9ldmVudCwKLX07Ci0KLSNkZWZpbmUgYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcGxheSwgYXVkaW8tPnF1ZXVlX2lkLCBcCi0JCQljbWQsIGxlbikKLQotc3RhdGljIGludCBhdWRkZWNfZHNwX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2RlY190eXBlIGNmZ19kZWNfY21kOwotCi0JbWVtc2V0KCZjZmdfZGVjX2NtZCwgMCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci0KLQljZmdfZGVjX2NtZC5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX0RFQ19UWVBFOwotCWlmIChlbmFibGUpCi0JCWNmZ19kZWNfY21kLmRlY19jZmcgPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCQlBVURQUF9DTURfRU5BX0RFQ19WIHwgQVVEREVDX0RFQ19BTVJOQjsKLQllbHNlCi0JCWNmZ19kZWNfY21kLmRlY19jZmcgPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCQlBVURQUF9DTURfRElTX0RFQ19WOwotCWNmZ19kZWNfY21kLmRtX21vZGUgPSAweDA7Ci0JY2ZnX2RlY19jbWQuc3RyZWFtX2lkID0gYXVkaW8tPmRlY19pZDsKLQotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMSgmY2ZnX2RlY19jbWQsIHNpemVvZihjZmdfZGVjX2NtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfYW1ybmIgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY29tbW9uLmNtZF9pZCA9IEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVM7Ci0JY21kLmNvbW1vbi5sZW5ndGggPSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TX1YxM0tfTEVOOwotCWNtZC5jb21tb24uZGVjX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuY29tbW9uLmlucHV0X3NhbXBsaW5nX2ZyZXF1ZW5jeSA9IDgwMDA7Ci0JY21kLnN0ZXJlb19jZmcgPSBBVURQUF9DTURfUENNX0lOVEZfTU9OT19WOwotCi0JYXVkcHBfc2VuZF9xdWV1ZTIoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX3JvdXRpbmdfbW9kZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwcF9jbWRfcm91dGluZ19tb2RlIGNtZDsKLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFBQX0NNRF9ST1VUSU5HX01PREU7Ci0JY21kLm9iamVjdF9udW1iZXIgPSBhdWRpby0+ZGVjX2lkOwotCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQljbWQucm91dGluZ19tb2RlID0gUk9VVElOR19NT0RFX0ZUUlQ7Ci0JZWxzZQotCQljbWQucm91dGluZ19tb2RlID0gUk9VVElOR19NT0RFX1JUOwotCi0JYXVkcHBfc2VuZF9xdWV1ZTEoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGF1ZHBsYXlfZHNwX3NlbmRfZGF0YV9hdmFpbChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQkJCSAgICAgICB1bnNpZ25lZCBpZHgsIHVuc2lnbmVkIGxlbikKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfYml0c3RyZWFtX2RhdGFfYXZhaWxfbnQyIGNtZDsKLQotCWNtZC5jbWRfaWQgPSBBVURQTEFZX0NNRF9CSVRTVFJFQU1fREFUQV9BVkFJTF9OVDI7Ci0JaWYgKGF1ZGlvLT5tZmllbGQpCi0JCWNtZC5kZWNvZGVyX2lkID0gQVVEQU1STkJfTUVUQUZJRUxEX01BU0sgfAotCQkJKGF1ZGlvLT5vdXRbaWR4XS5tZmllbGRfc3ogPj4gMSk7Ci0JZWxzZQotCQljbWQuZGVjb2Rlcl9pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmJ1Zl9wdHIgPSBhdWRpby0+b3V0W2lkeF0uYWRkcjsKLQljbWQuYnVmX3NpemUgPSBsZW4gLyAyOwotCWNtZC5wYXJ0aXRpb25fbnVtYmVyID0gMDsKLQlyZXR1cm4gYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhbXJuYl9idWZmZXJfcmVmcmVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwbGF5X2NtZF9idWZmZXJfcmVmcmVzaCByZWZyZXNoX2NtZDsKLQotCXJlZnJlc2hfY21kLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0JVRkZFUl9SRUZSRVNIOwotCXJlZnJlc2hfY21kLm51bV9idWZmZXJzID0gMTsKLQlyZWZyZXNoX2NtZC5idWYwX2FkZHJlc3MgPSBhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uYWRkcjsKLQlyZWZyZXNoX2NtZC5idWYwX2xlbmd0aCA9IGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5zaXplIC0KLQkgIChhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uc2l6ZSAlIEFNUk5CX0RFQ09ERURfRlJTWikgKwotCSAgKGF1ZGlvLT5tZmllbGQgPyAyNCA6IDApOwotCXJlZnJlc2hfY21kLmJ1Zl9yZWFkX2NvdW50ID0gMDsKLQlNTV9EQkcoImJ1ZjBfYWRkcj0leCBidWYwX2xlbj0lZFxuIiwgcmVmcmVzaF9jbWQuYnVmMF9hZGRyZXNzLAotCQkJcmVmcmVzaF9jbWQuYnVmMF9sZW5ndGgpOwotCSh2b2lkKWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZyZWZyZXNoX2NtZCwgc2l6ZW9mKHJlZnJlc2hfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX2NvbmZpZ19ob3N0cGNtKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2hwY21fYnVmX2NmZyBjZmdfY21kOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQljZmdfY21kLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0hQQ01fQlVGX0NGRzsKLQljZmdfY21kLm1heF9idWZmZXJzID0gYXVkaW8tPnBjbV9idWZfY291bnQ7Ci0JY2ZnX2NtZC5ieXRlX3N3YXAgPSAwOwotCWNmZ19jbWQuaG9zdHBjbV9jb25maWcgPSAoMHg4MDAwKSB8ICgweDQwMDApOwotCWNmZ19jbWQuZmVlZGJhY2tfZnJlcXVlbmN5ID0gMTsKLQljZmdfY21kLnBhcnRpdGlvbl9udW1iZXIgPSAwOwotCSh2b2lkKWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZjZmdfY21kLCBzaXplb2YoY2ZnX2NtZCkpOwotCi19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWF1ZGlvLT5ydW5uaW5nKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAobmVlZGVkICYmICFhdWRpby0+d2ZsdXNoKSB7Ci0JCS8qIFdlIHdlcmUgY2FsbGVkIGZyb20gdGhlIGNhbGxiYWNrIGJlY2F1c2UgdGhlIERTUAotCQkgKiByZXF1ZXN0ZWQgbW9yZSBkYXRhLiAgTm90ZSB0aGF0IHRoZSBEU1AgZG9lcyB3YW50Ci0JCSAqIG1vcmUgZGF0YSwgYW5kIGlmIGEgYnVmZmVyIHdhcyBpbi1mbGlnaHQsIG1hcmsgaXQKLQkJICogYXMgYXZhaWxhYmxlIChzaW5jZSB0aGUgRFNQIG11c3Qgbm93IGJlIGRvbmUgd2l0aAotCQkgKiBpdCkuCi0JCSAqLwotCQlhdWRpby0+b3V0X25lZWRlZCA9IDE7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpIHsKLQkJCWZyYW1lLT51c2VkID0gMDsKLQkJCWF1ZGlvLT5vdXRfdGFpbCBePSAxOwotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl9Ci0JfQotCi0JaWYgKGF1ZGlvLT5vdXRfbmVlZGVkKSB7Ci0JCS8qIElmIHRoZSBEU1AgY3VycmVudGx5IHdhbnRzIGRhdGEgYW5kIHdlIGhhdmUgYQotCQkgKiBidWZmZXIgYXZhaWxhYmxlLCB3ZSB3aWxsIHNlbmQgaXQgYW5kIHJlc2V0Ci0JCSAqIHRoZSBuZWVkZWQgZmxhZy4gIFdlJ2xsIG1hcmsgdGhlIGJ1ZmZlciBhcyBpbi1mbGlnaHQKLQkJICogc28gdGhhdCBpdCB3b24ndCBiZSByZWN5Y2xlZCB1bnRpbCB0aGUgbmV4dCBidWZmZXIKLQkJICogaXMgcmVxdWVzdGVkCi0JCSAqLwotCi0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkKSB7Ci0JCQlCVUdfT04oZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZik7Ci0JCQlNTV9EQkcoImZyYW1lICVkIGJ1c3lcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JCQlhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoYXVkaW8sIGF1ZGlvLT5vdXRfdGFpbCwKLQkJCQkJCSAgICBmcmFtZS0+dXNlZCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDB4ZmZmZmZmZmY7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCX0KLQl9Ci0gZG9uZToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkZXZpY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX2ZsdXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JYXVkaW8tPm91dFswXS51c2VkID0gMDsKLQlhdWRpby0+b3V0WzFdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRfaGVhZCA9IDA7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9ieXRlcywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX2ZsdXNoX3BjbV9idWYoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1aW50OF90IGluZGV4OwotCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUENNX0JVRl9NQVhfQ09VTlQ7IGluZGV4KyspCi0JCWF1ZGlvLT5pbltpbmRleF0udXNlZCA9IDA7Ci0KLQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCWF1ZGlvLT5yZWFkX25leHQgPSAwOwotCWF1ZGlvLT5maWxsX25leHQgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhbXJuYl9pb3BvcnRfcmVzZXQoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQkvKiBNYWtlIHN1cmUgcmVhZC93cml0ZSB0aHJlYWQgYXJlIGZyZWUgZnJvbQotCSAqIHNsZWVwIGFuZCBrbm93aW5nIHRoYXQgc3lzdGVtIGlzIG5vdCBhYmxlCi0JICogdG8gcHJvY2VzcyBpbyByZXF1ZXN0IGF0IHRoZSBtb21lbnQKLQkgKi8KLQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCWF1ZGFtcm5iX2ZsdXNoKGF1ZGlvKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlhdWRhbXJuYl9mbHVzaF9wY21fYnVmKGF1ZGlvKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCWF1ZGlvLT5hdnN5bmNfZmxhZyA9IDE7Ci0Jd2FrZV91cCgmYXVkaW8tPmF2c3luY193YWl0KTsKLX0KLQotc3RhdGljIGludCBhdWRhbXJuYl9ldmVudHNfcGVuZGluZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGVtcHR5OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JZW1wdHkgPSAhbGlzdF9lbXB0eSgmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCXJldHVybiBlbXB0eSB8fCBhdWRpby0+ZXZlbnRfYWJvcnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX3Jlc2V0X2V2ZW50X3F1ZXVlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYXVkYW1ybmJfZXZlbnQgKmRydl9ldnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhdWRpby0+ZXZlbnRfcXVldWUpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkYW1ybmJfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWRhbXJuYl9ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQkJa2ZyZWUoZHJ2X2V2dCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBsb25nIGF1ZGFtcm5iX3Byb2Nlc3NfZXZlbnRfcmVxKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHZvaWQgX191c2VyICphcmcpCi17Ci0JbG9uZyByYzsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50IHVzcl9ldnQ7Ci0Jc3RydWN0IGF1ZGFtcm5iX2V2ZW50ICpkcnZfZXZ0ID0gTlVMTDsKLQlpbnQgdGltZW91dDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ1c3JfZXZ0LCBhcmcsIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JdGltZW91dCA9IChpbnQpIHVzcl9ldnQudGltZW91dF9tczsKLQotCWlmICh0aW1lb3V0ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAotCQkJYXVkaW8tPmV2ZW50X3dhaXQsIGF1ZGFtcm5iX2V2ZW50c19wZW5kaW5nKGF1ZGlvKSwKLQkJCW1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOwotCQlpZiAocmMgPT0gMCkKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCX0gZWxzZSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAotCQkJYXVkaW8tPmV2ZW50X3dhaXQsIGF1ZGFtcm5iX2V2ZW50c19wZW5kaW5nKGF1ZGlvKSk7Ci0JfQotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGF1ZGlvLT5ldmVudF9hYm9ydCkgewotCQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAwOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyYyA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSkpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkYW1ybmJfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JfQotCi0JaWYgKGRydl9ldnQpIHsKLQkJdXNyX2V2dC5ldmVudF90eXBlID0gZHJ2X2V2dC0+ZXZlbnRfdHlwZTsKLQkJdXNyX2V2dC5ldmVudF9wYXlsb2FkID0gZHJ2X2V2dC0+cGF5bG9hZDsKLQkJbGlzdF9hZGRfdGFpbCgmZHJ2X2V2dC0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQl9IGVsc2UKLQkJcmMgPSAtMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFyYyAmJiBjb3B5X3RvX3VzZXIoYXJnLCAmdXNyX2V2dCwgc2l6ZW9mKHVzcl9ldnQpKSkKLQkJcmMgPSAtRUZBVUxUOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2VuYWJsZV9lcShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCWlmIChhdWRpby0+ZXFfZW5hYmxlID09IGVuYWJsZSAmJiAhYXVkaW8tPmVxX25lZWRzX2NvbW1pdCkKLQkJcmV0dXJuIDA7Ci0KLQlhdWRpby0+ZXFfZW5hYmxlID0gZW5hYmxlOwotCi0JaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCWF1ZHBwX2RzcF9zZXRfZXEoYXVkaW8tPmRlY19pZCwJZW5hYmxlLCAmYXVkaW8tPmVxLCBQT1BQKTsKLQkJYXVkaW8tPmVxX25lZWRzX2NvbW1pdCA9IDA7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2dldF9hdnN5bmNfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQkJCQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyAqc3RhdHMpCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlmIChhdWRpby0+ZGVjX2lkID09IGF1ZGlvLT5hdnN5bmNbMF0gJiYgYXVkaW8tPmF2c3luY19mbGFnKSB7Ci0JCS8qIGF2X3N5bmMgc2FtcGxlIGNvdW50ICovCi0JCXN0YXRzLT5zYW1wbGVfY291bnQgPSAoYXVkaW8tPmF2c3luY1syXSA8PCAxNikgfAotCQkJCQkJKGF1ZGlvLT5hdnN5bmNbM10pOwotCi0JCS8qIGF2X3N5bmMgYnl0ZV9jb3VudCAqLwotCQlzdGF0cy0+Ynl0ZV9jb3VudCA9IChhdWRpby0+YXZzeW5jWzVdIDw8IDE2KSB8Ci0JCQkJCQkoYXVkaW8tPmF2c3luY1s2XSk7Ci0KLQkJYXVkaW8tPmF2c3luY19mbGFnID0gMDsKLQkJcmMgPSAwOwotCX0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIHJjOwotCi19Ci0KLXN0YXRpYyBsb25nIGF1ZGFtcm5iX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0JdWludDE2X3QgZW5hYmxlX21hc2s7Ci0JaW50IGVuYWJsZTsKLQlpbnQgcHJldl9zdGF0ZTsKLQotCU1NX0RCRygiY21kID0gJWRcbiIsIGNtZCk7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCi0JCWF1ZGlvLT5hdnN5bmNfZmxhZyA9IDA7Ci0JCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdGF0cykpOwotCQlpZiAoYXVkcHBfcXVlcnlfYXZzeW5jKGF1ZGlvLT5kZWNfaWQpIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT5hdnN5bmNfd2FpdCwKLQkJCQkoYXVkaW8tPmF2c3luY19mbGFnID09IDEpLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoQVVEUFBfQVZTWU5DX0VWRU5UX1RJTUVPVVQpKTsKLQotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQllbHNlIGlmICgocmMgPiAwKSB8fCAoKHJjID09IDApICYmIChhdWRpby0+YXZzeW5jX2ZsYWcgPT0gMSkpKSB7Ci0JCQlpZiAoYXVkaW9fZ2V0X2F2c3luY19kYXRhKGF1ZGlvLCAmc3RhdHMpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fRU5BQkxFX0FVRFBQOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmVuYWJsZV9tYXNrLCAodm9pZCAqKSBhcmcsCi0JCQkJCQlzaXplb2YoZW5hYmxlX21hc2spKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWVuYWJsZSA9IChlbmFibGVfbWFzayAmIEVRX0VOQUJMRSkgPyAxIDogMDsKLQkJYXVkaW9fZW5hYmxlX2VxKGF1ZGlvLCBlbmFibGUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9WT0xVTUU6Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gYXJnOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuLAotCQkJCQlQT1BQKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX1NFVF9QQU46Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPnZvbF9wYW4ucGFuID0gYXJnOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuLAotCQkJCQlQT1BQKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX1NFVF9FUToKLQkJcHJldl9zdGF0ZSA9IGF1ZGlvLT5lcV9lbmFibGU7Ci0JCWF1ZGlvLT5lcV9lbmFibGUgPSAwOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmF1ZGlvLT5lcS5udW1fYmFuZHMsICh2b2lkICopIGFyZywKLQkJCQlzaXplb2YoYXVkaW8tPmVxKSAtCi0JCQkJKEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNU19DT01NT05fTEVOICsgMikpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlhdWRpby0+ZXFfZW5hYmxlID0gcHJldl9zdGF0ZTsKLQkJYXVkaW8tPmVxX25lZWRzX2NvbW1pdCA9IDE7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKC1FSU5WQUwgIT0gcmMpCi0JCXJldHVybiByYzsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX0VWRU5UKSB7Ci0JCU1NX0RCRygiQVVESU9fR0VUX0VWRU5UXG4iKTsKLQkJaWYgKG11dGV4X3RyeWxvY2soJmF1ZGlvLT5nZXRfZXZlbnRfbG9jaykpIHsKLQkJCXJjID0gYXVkYW1ybmJfcHJvY2Vzc19ldmVudF9yZXEoYXVkaW8sCi0JCQkJCSh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCQl9IGVsc2UKLQkJCXJjID0gLUVCVVNZOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKGNtZCA9PSBBVURJT19BQk9SVF9HRVRfRVZFTlQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCQlNTV9EQkcoIkFVRElPX1NUQVJUXG4iKTsKLQkJcmMgPSBhdWRhbXJuYl9lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUsCi0JCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0RFQ09ERVJfV0FJVF9NUykpOwotCQkJTU1fSU5GTygiZGVjX3N0YXRlICVkIHJjID0gJWRcbiIsIGF1ZGlvLT5kZWNfc3RhdGUsIHJjKTsKLQotCQkJaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1MpCi0JCQkJcmMgPSAtRU5PREVWOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NUT1A6Ci0JCU1NX0RCRygiQVVESU9fU1RPUFxuIik7Ci0JCXJjID0gYXVkYW1ybmJfZGlzYWJsZShhdWRpbyk7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMTsKLQkJYXVkYW1ybmJfaW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQljYXNlIEFVRElPX0ZMVVNIOgotCQlNTV9EQkcoIkFVRElPX0ZMVVNIXG4iKTsKLQkJYXVkaW8tPnJmbHVzaCA9IDE7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAxOwotCQlhdWRhbXJuYl9pb3BvcnRfcmVzZXQoYXVkaW8pOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpIHsKLQkJCWF1ZHBwX2ZsdXNoKGF1ZGlvLT5kZWNfaWQpOwotCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJIWF1ZGlvLT53Zmx1c2gpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCU1NX0VSUigiQVVESU9fRkxVU0ggaW50ZXJydXB0ZWRcbiIpOwotCQkJCXJjID0gLUVJTlRSOwotCQkJfQotCQl9IGVsc2UgewotCQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkgICAgKCZjb25maWcsICh2b2lkICopYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlhdWRpby0+bWZpZWxkID0gY29uZmlnLm1ldGFfZmllbGQ7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fR0VUX0NPTkZJRzp7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjb25maWc7Ci0JCQljb25maWcuYnVmZmVyX3NpemUgPSBCVUZTWjsKLQkJCWNvbmZpZy5idWZmZXJfY291bnQgPSAyOwotCQkJY29uZmlnLnNhbXBsZV9yYXRlID0gODAwMDsKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gMTsKLQkJCWNvbmZpZy5tZXRhX2ZpZWxkID0gMDsKLQkJCWNvbmZpZy51bnVzZWRbMF0gPSAwOwotCQkJY29uZmlnLnVudXNlZFsxXSA9IDA7Ci0JCQljb25maWcudW51c2VkWzJdID0gMDsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjb25maWcsCi0JCQkJCSBzaXplb2YoY29uZmlnKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX0dFVF9QQ01fQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fcGNtX2NvbmZpZyBjb25maWc7Ci0JCQljb25maWcucGNtX2ZlZWRiYWNrID0gYXVkaW8tPnBjbV9mZWVkYmFjazsKLQkJCWNvbmZpZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX01BWF9DT1VOVDsKLQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY29uZmlnLAotCQkJCQkgc2l6ZW9mKGNvbmZpZykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fU0VUX1BDTV9DT05GSUc6ewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3BjbV9jb25maWcgY29uZmlnOwotCQlpZiAoY29weV9mcm9tX3VzZXIKLQkJICAgICgmY29uZmlnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29uZmlnLnBjbV9mZWVkYmFjayAhPSBhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCQlNTV9FUlIoIk5vdCBzdWZmaWNpZW50IHBlcm1pc3Npb24gdG8iCi0JCQkJICJjaGFuZ2UgdGhlIHBsYXliYWNrIG1vZGVcbiIpOwotCQkJcmMgPSAtRUFDQ0VTOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKChjb25maWcuYnVmZmVyX2NvdW50ID4gUENNX0JVRl9NQVhfQ09VTlQpIHx8Ci0JCSAgICAoY29uZmlnLmJ1ZmZlcl9jb3VudCA9PSAxKSkKLQkJCWNvbmZpZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX01BWF9DT1VOVDsKLQotCQlpZiAoY29uZmlnLmJ1ZmZlcl9zaXplIDwgUENNX0JVRlNaX01JTikKLQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47Ci0KLQkJCS8qIENoZWNrIGlmIHBjbSBmZWVkYmFjayBpcyByZXF1aXJlZCAqLwotCQlpZiAoKGNvbmZpZy5wY21fZmVlZGJhY2spICYmICghYXVkaW8tPnJlYWRfZGF0YSkpIHsKLQkJCU1NX0RCRygiYWxsb2NhdGUgUENNIGJ1ZiAlZFxuIiwKLQkJCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCAqCi0JCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSk7Ci0JCQlhdWRpby0+cmVhZF9waHlzID0gYWxsb2NhdGVfY29udGlndW91c19lYmlfbm9tYXAoCi0JCQkJCQljb25maWcuYnVmZmVyX3NpemUgKgotCQkJCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCwKLQkJCQkJCVNaXzRLKTsKLQkJCWlmICghYXVkaW8tPnJlYWRfcGh5cykgewotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJYXVkaW8tPm1hcF92X3JlYWQgPSBpb3JlbWFwKAotCQkJCQkJYXVkaW8tPnJlYWRfcGh5cywKLQkJCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSAqCi0JCQkJCQljb25maWcuYnVmZmVyX2NvdW50KTsKLQkJCWlmIChJU19FUlIoYXVkaW8tPm1hcF92X3JlYWQpKSB7Ci0JCQkJTU1fRVJSKCJmYWlsZWQgdG8gbWFwIHJlYWQgcGh5cyBhZGRyZXNzXG4iKTsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcigKLQkJCQkJCQlhdWRpby0+cmVhZF9waHlzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdWludDhfdCBpbmRleDsKLQkJCQl1aW50MzJfdCBvZmZzZXQgPSAwOwotCQkJCWF1ZGlvLT5yZWFkX2RhdGEgPSBhdWRpby0+bWFwX3ZfcmVhZDsKLQkJCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCQkJCWF1ZGlvLT5wY21fYnVmX2NvdW50ID0KLQkJCQkJY29uZmlnLmJ1ZmZlcl9jb3VudDsKLQkJCQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQkJCQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLQotCQkJCWZvciAoaW5kZXggPSAwOwotCQkJCWluZGV4IDwgY29uZmlnLmJ1ZmZlcl9jb3VudDsgaW5kZXgrKykgewotCQkJCQlhdWRpby0+aW5baW5kZXhdLmRhdGEgPQotCQkJCQkJYXVkaW8tPnJlYWRfZGF0YSArIG9mZnNldDsKLQkJCQkJYXVkaW8tPmluW2luZGV4XS5hZGRyID0KLQkJCQkJICAgIGF1ZGlvLT5yZWFkX3BoeXMgKyBvZmZzZXQ7Ci0JCQkJCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9Ci0JCQkJCSAgICBjb25maWcuYnVmZmVyX3NpemU7Ci0JCQkJCWF1ZGlvLT5pbltpbmRleF0udXNlZCA9IDA7Ci0JCQkJCW9mZnNldCArPSBjb25maWcuYnVmZmVyX3NpemU7Ci0JCQkJfQotCQkJCU1NX0RCRygicmVhZCBidWY6IHBoeSBhZGRyIDB4JTA4eCBrZXJuZWwgXAotCQkJCQlhZGRyIDB4JTA4eFxuIiwgYXVkaW8tPnJlYWRfcGh5cywKLQkJCQkJKGludClhdWRpby0+cmVhZF9kYXRhKTsKLQkJCQlyYyA9IDA7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyYyA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX1NFU1NJT05fSUQ6Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmYXVkaW8tPmRlY19pZCwKLQkJCXNpemVvZih1bnNpZ25lZCBzaG9ydCkpKQotCQkJcmMgPSAgLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotLyogT25seSB1c2VmdWwgaW4gdHVubmVsLW1vZGUgKi8KLXN0YXRpYyBpbnQgYXVkYW1ybmJfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBwcG9zMSwgbG9mZl90IHBwb3MyLCBpbnQgZGF0YXN5bmMpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQotCWlmICghYXVkaW8tPnJ1bm5pbmcgfHwgYXVkaW8tPnBjbV9mZWVkYmFjaykgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZV9ub2xvY2s7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCSghYXVkaW8tPm91dFswXS51c2VkICYmCi0JCSFhdWRpby0+b3V0WzFdLnVzZWQgJiYKLQkJYXVkaW8tPm91dF9uZWVkZWQpIHx8IGF1ZGlvLT53Zmx1c2gpOwotCi0JaWYgKHJjIDwgMCkKLQkJZ290byBkb25lOwotCWVsc2UgaWYgKGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBwY20gZG1hbWlzcyBtZXNzYWdlIGlzIHNlbnQgY29udGlub3VzbHkKLQkgKiB3aGVuIGRlY29kZXIgaXMgc3RhcnZlZCBzbyBubyByYWNlCi0JICogY29uZGl0aW9uIGNvbmNlcm4KLQkgKi8KLQlhdWRpby0+dGVvcyA9IDA7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJYXVkaW8tPnRlb3MgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAoYXVkaW8tPndmbHVzaCkKLQkJcmMgPSAtRUJVU1k7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci1kb25lX25vbG9jazoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGFtcm5iX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCSAgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0JaW50IHJjID0gMDsKLQotCWlmICghYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJcmV0dXJuIDA7IC8qIFBDTSBmZWVkYmFjayBpcyBub3QgZW5hYmxlZC4gTm90aGluZyB0byByZWFkICovCi0KLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlNTV9EQkcoIiVkIFxuIiwJY291bnQpOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPnJlYWRfd2FpdCwKLQkJCShhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCA+IDApIHx8Ci0JCQkoYXVkaW8tPnN0b3BwZWQpIHx8IChhdWRpby0+cmZsdXNoKSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCi0JCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+cmZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvdW50IDwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQpIHsKLQkJCS8qIFJlYWQgbXVzdCBoYXBwZW4gaW4gZnJhbWUgYm91bmRhcnkuIFNpbmNlIGRyaXZlciBkb2VzCi0JCQkgKiBub3Qga25vdyBmcmFtZSBzaXplLCByZWFkIGNvdW50IG11c3QgYmUgZ3JlYXRlciBvcgotCQkJICogZXF1YWwgdG8gc2l6ZSBvZiBQQ00gc2FtcGxlcwotCQkJICovCi0JCQlNTV9EQkcoInJlYWQgc3RvcCAtIHBhcnRpYWwgZnJhbWVcbiIpOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9EQkcoInJlYWQgZnJvbSBpblslZF1cbiIsIGF1ZGlvLT5yZWFkX25leHQpOwotCi0JCQlpZiAoY29weV90b191c2VyCi0JCQkgICAgKGJ1ZiwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLmRhdGEsCi0JCQkgICAgIGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkKSkgewotCQkJCU1NX0VSUigiaW52YWxpZCBhZGRyICV4IFxuIiwgKHVuc2lnbmVkIGludClidWYpOwotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNvdW50IC09IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkOwotCQkJYnVmICs9IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkOwotCQkJYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQgPSAwOwotCQkJaWYgKCgrK2F1ZGlvLT5yZWFkX25leHQpID09IGF1ZGlvLT5wY21fYnVmX2NvdW50KQotCQkJCWF1ZGlvLT5yZWFkX25leHQgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBkb24ndCBmZWVkIG91dHB1dCBidWZmZXIgdG8gSFcgZGVjb2RlciBkdXJpbmcgZmx1c2hpbmcKLQkgKiBidWZmZXIgcmVmcmVzaCBjb21tYW5kIHdpbGwgYmUgc2VudCBvbmNlIGZsdXNoIGNvbXBsZXRlcwotCSAqIHNlbmQgYnVmIHJlZnJlc2ggY29tbWFuZCBoZXJlIGNhbiBjb25mdXNlIEhXIGRlY29kZXIKLQkgKi8KLQlpZiAoYXVkaW8tPmJ1Zl9yZWZyZXNoICYmICFhdWRpby0+cmZsdXNoKSB7Ci0JCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDA7Ci0JCU1NX0RCRygia2ljayBzdGFydCBwY20gZmVlZGJhY2sgYWdhaW5cbiIpOwotCQlhdWRhbXJuYl9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQotCWlmIChidWYgPiBzdGFydCkKLQkJcmMgPSBidWYgLSBzdGFydDsKLQotCU1NX0RCRygicmVhZCAlZCBieXRlc1xuIiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRhbXJuYl9wcm9jZXNzX2VvcyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQljb25zdCBjaGFyIF9fdXNlciAqYnVmX3N0YXJ0LCB1bnNpZ25lZCBzaG9ydCBtZmllbGRfc2l6ZSkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCi0JZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF9oZWFkOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCShhdWRpby0+b3V0X25lZWRlZCAmJgotCQlhdWRpby0+b3V0WzBdLnVzZWQgPT0gMCAmJgotCQlhdWRpby0+b3V0WzFdLnVzZWQgPT0gMCkKLQkJfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQl8fCAoYXVkaW8tPndmbHVzaCkpOwotCi0JaWYgKHJjIDwgMCkKLQkJZ290byBkb25lOwotCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGZyYW1lLT5kYXRhLCBidWZfc3RhcnQsIG1maWVsZF9zaXplKSkgewotCQlyYyA9IC1FRkFVTFQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlmcmFtZS0+bWZpZWxkX3N6ID0gbWZpZWxkX3NpemU7Ci0JYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JZnJhbWUtPnVzZWQgPSBtZmllbGRfc2l6ZTsKLQlhdWRhbXJuYl9zZW5kX2RhdGEoYXVkaW8sIDApOwotCi1kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkYW1ybmJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCXNpemVfdCB4ZmVyOwotCWNoYXIgKmNweV9wdHI7Ci0JaW50IHJjID0gMCwgZW9zX2NvbmRpdGlvbiA9IEFVREFNUk5CX0VPU19OT05FOwotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplID0gMDsKLQotCU1NX0RCRygiY250PSVkXG4iLCBjb3VudCk7Ci0KLQlpZiAoY291bnQgJiAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQkJY3B5X3B0ciA9IGZyYW1lLT5kYXRhOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkJICAgICAgKGZyYW1lLT51c2VkID09IDApCi0JCQkJCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCQkJCQl8fCAoYXVkaW8tPndmbHVzaCkpOwotCi0JCU1NX0RCRygiYnVmZmVyIGF2YWlsYWJsZVxuIik7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQkJaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoYXVkaW8tPm1maWVsZCkgewotCQkJaWYgKGJ1ZiA9PSBzdGFydCkgewotCQkJCS8qIFByb2Nlc3NpbmcgYmVnaW5uaW5nIG9mIHVzZXIgYnVmZmVyICovCi0JCQkJaWYgKF9fZ2V0X3VzZXIobWZpZWxkX3NpemUsCi0JCQkJCSh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgYnVmKSkgewotCQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSAJaWYgKG1maWVsZF9zaXplID4gY291bnQpIHsKLQkJCQkJcmMgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJTU1fREJHKCJtZiBvZmZzZXRfdmFsICV4XG4iLCBtZmllbGRfc2l6ZSk7Ci0JCQkJaWYgKGNvcHlfZnJvbV91c2VyKGNweV9wdHIsIGJ1ZiwgbWZpZWxkX3NpemUpKSB7Ci0JCQkJCXJjID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8qIENoZWNrIGlmIEVPUyBmbGFnIGlzIHNldCBhbmQgYnVmZmVyCi0JCQkJICogY29udGFpbnMganVzdCBtZXRhIGZpZWxkCi0JCQkJICovCi0JCQkJaWYgKGNweV9wdHJbQVVEQU1STkJfRU9TX0ZMR19PRkZTRVRdICYKLQkJCQkJCUFVREFNUk5CX0VPU19GTEdfTUFTSykgewotCQkJCQlNTV9EQkcoImVvcyBzZXRcbiIpOwotCQkJCQllb3NfY29uZGl0aW9uID0gQVVEQU1STkJfRU9TX1NFVDsKLQkJCQkJaWYgKG1maWVsZF9zaXplID09IGNvdW50KSB7Ci0JCQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlCi0JCQkJCWNweV9wdHJbQVVEQU1STkJfRU9TX0ZMR19PRkZTRVRdICY9Ci0JCQkJCQkJfkFVREFNUk5CX0VPU19GTEdfTUFTSzsKLQkJCQl9Ci0JCQkJY3B5X3B0ciArPSBtZmllbGRfc2l6ZTsKLQkJCQljb3VudCAtPSBtZmllbGRfc2l6ZTsKLQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQl9IGVsc2UgewotCQkJCW1maWVsZF9zaXplID0gMDsKLQkJCQlNTV9EQkcoImNvbnRpbnVvdXMgYnVmZmVyXG4iKTsKLQkJCX0KLQkJCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQkJfQotCi0JCXhmZXIgPSAoY291bnQgPiAoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkpID8KLQkJCShmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSA6IGNvdW50OwotCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCB4ZmVyKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlmcmFtZS0+dXNlZCA9ICh4ZmVyICsgbWZpZWxkX3NpemUpOwotCQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQkJY291bnQgLT0geGZlcjsKLQkJYnVmICs9IHhmZXI7Ci0KLQkJYXVkYW1ybmJfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQotCX0KLQlpZiAoZW9zX2NvbmRpdGlvbiA9PSBBVURBTVJOQl9FT1NfU0VUKQotCQlyYyA9IGF1ZGFtcm5iX3Byb2Nlc3NfZW9zKGF1ZGlvLCBzdGFydCwgbWZpZWxkX3NpemUpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCWlmICghcmMpIHsKLQkJaWYgKGJ1ZiA+IHN0YXJ0KQotCQkJcmV0dXJuIGJ1ZiAtIHN0YXJ0OwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkYW1ybmJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JTU1fSU5GTygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGZyZWVpbmdcbiIsIChpbnQpYXVkaW8pOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGRldl91bnJlZ2lzdGVyX2V2dF9saXN0bmVyKEFVRERFVl9DTE5UX0RFQywgYXVkaW8tPmRlY19pZCk7Ci0JYXVkYW1ybmJfZGlzYWJsZShhdWRpbyk7Ci0JYXVkYW1ybmJfZmx1c2goYXVkaW8pOwotCWF1ZGFtcm5iX2ZsdXNoX3BjbV9idWYoYXVkaW8pOwotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci0JYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0JdW5yZWdpc3Rlcl9lYXJseV9zdXNwZW5kKCZhdWRpby0+c3VzcGVuZF9jdGwubm9kZSk7Ci0jZW5kaWYKLQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAxOwotCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQlhdWRhbXJuYl9yZXNldF9ldmVudF9xdWV1ZShhdWRpbyk7Ci0JaW91bm1hcChhdWRpby0+bWFwX3Zfd3JpdGUpOwotCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPnBoeXMpOwotCWlmIChhdWRpby0+cmVhZF9kYXRhKSB7Ci0JCWlvdW5tYXAoYXVkaW8tPm1hcF92X3JlYWQpOwotCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKGF1ZGlvLT5yZWFkX3BoeXMpOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlpZiAoYXVkaW8tPmRlbnRyeSkKLQkJZGVidWdmc19yZW1vdmUoYXVkaW8tPmRlbnRyeSk7Ci0jZW5kaWYKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RhdGljIHZvaWQgYXVkYW1ybmJfcG9zdF9ldmVudChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCkKLXsKLQlzdHJ1Y3QgYXVkYW1ybmJfZXZlbnQgKmVfbm9kZSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSkpIHsKLQkJZV9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZGFtcm5iX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmVfbm9kZS0+bGlzdCk7Ci0JfSBlbHNlIHsKLQkJZV9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGFtcm5iX2V2ZW50KSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghZV9ub2RlKSB7Ci0JCQlNTV9FUlIoIk5vIG1lbSB0byBwb3N0IGV2ZW50ICVkXG4iLCB0eXBlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWVfbm9kZS0+ZXZlbnRfdHlwZSA9IHR5cGU7Ci0JZV9ub2RlLT5wYXlsb2FkID0gcGF5bG9hZDsKLQotCWxpc3RfYWRkX3RhaWwoJmVfbm9kZS0+bGlzdCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFtcm5iX3N1c3BlbmQoc3RydWN0IGVhcmx5X3N1c3BlbmQgKmgpCi17Ci0Jc3RydWN0IGF1ZGFtcm5iX3N1c3BlbmRfY3RsICpjdGwgPQotCQljb250YWluZXJfb2YoaCwgc3RydWN0IGF1ZGFtcm5iX3N1c3BlbmRfY3RsLCBub2RlKTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlhdWRhbXJuYl9wb3N0X2V2ZW50KGN0bC0+YXVkaW8sIEFVRElPX0VWRU5UX1NVU1BFTkQsIHBheWxvYWQpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhbXJuYl9yZXN1bWUoc3RydWN0IGVhcmx5X3N1c3BlbmQgKmgpCi17Ci0Jc3RydWN0IGF1ZGFtcm5iX3N1c3BlbmRfY3RsICpjdGwgPQotCQljb250YWluZXJfb2YoaCwgc3RydWN0IGF1ZGFtcm5iX3N1c3BlbmRfY3RsLCBub2RlKTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlhdWRhbXJuYl9wb3N0X2V2ZW50KGN0bC0+YXVkaW8sIEFVRElPX0VWRU5UX1JFU1VNRSwgcGF5bG9hZCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIHNzaXplX3QgYXVkYW1ybmJfZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRhbXJuYl9kZWJ1Z19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQljb25zdCBpbnQgZGVidWdfYnVmbWF4ID0gMTAyNDsKLQlzdGF0aWMgY2hhciBidWZmZXJbMTAyNF07Ci0JaW50IG4gPSAwLCBpOwotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JbiA9IHNjbnByaW50ZihidWZmZXIsIGRlYnVnX2J1Zm1heCwgIm9wZW5lZCAlZFxuIiwgYXVkaW8tPm9wZW5lZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJlbmFibGVkICVkXG4iLCBhdWRpby0+ZW5hYmxlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJzdG9wcGVkICVkXG4iLCBhdWRpby0+c3RvcHBlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJwY21fZmVlZGJhY2sgJWRcbiIsIGF1ZGlvLT5wY21fZmVlZGJhY2spOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X2J1Zl9zeiAlZFxuIiwgYXVkaW8tPm91dFswXS5zaXplKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInBjbV9idWZfY291bnQgJWQgXG4iLCBhdWRpby0+cGNtX2J1Zl9jb3VudCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJwY21fYnVmX3N6ICVkIFxuIiwgYXVkaW8tPmluWzBdLnNpemUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkidm9sdW1lICV4IFxuIiwgYXVkaW8tPnZvbF9wYW4udm9sdW1lKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkvKiBGb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBvbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHdoZW4KLQkgKiB3aGVuIHBsYXliYWNrIGhhbHRzIHVuZXhwZWN0ZWRseS4gVGh1cywgbm8gbXV0dWFsIGV4Y2x1c2lvbgotCSAqIGVuZm9yY2VkCi0JICovCi0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJ3Zmx1c2ggJWRcbiIsIGF1ZGlvLT53Zmx1c2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicmZsdXNoICVkXG4iLCBhdWRpby0+cmZsdXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInJ1bm5pbmcgJWQgXG4iLCBhdWRpby0+cnVubmluZyk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJkZWMgc3RhdGUgJWQgXG4iLCBhdWRpby0+ZGVjX3N0YXRlKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dF9uZWVkZWQgJWQgXG4iLCBhdWRpby0+b3V0X25lZWRlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJvdXRfaGVhZCAlZCBcbiIsIGF1ZGlvLT5vdXRfaGVhZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJvdXRfdGFpbCAlZCBcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJvdXRbMF0udXNlZCAlZCBcbiIsIGF1ZGlvLT5vdXRbMF0udXNlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJvdXRbMV0udXNlZCAlZCBcbiIsIGF1ZGlvLT5vdXRbMV0udXNlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJidWZmZXJfcmVmcmVzaCAlZCBcbiIsIGF1ZGlvLT5idWZfcmVmcmVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJyZWFkX25leHQgJWQgXG4iLCBhdWRpby0+cmVhZF9uZXh0KTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImZpbGxfbmV4dCAlZCBcbiIsIGF1ZGlvLT5maWxsX25leHQpOwotCWZvciAoaSA9IDA7IGkgPCBhdWRpby0+cGNtX2J1Zl9jb3VudDsgaSsrKQotCQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSJpblslZF0udXNlZCAlZCBcbiIsIGksIGF1ZGlvLT5pbltpXS51c2VkKTsKLQlidWZmZXJbbl0gPSAwOwotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCBidWZmZXIsIG4pOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRhbXJuYl9kZWJ1Z19mb3BzID0gewotCS5yZWFkID0gYXVkYW1ybmJfZGVidWdfcmVhZCwKLQkub3BlbiA9IGF1ZGFtcm5iX2RlYnVnX29wZW4sCi19OwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgYXVkYW1ybmJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gTlVMTDsKLQlpbnQgcmMsIGRlY19hdHRyYiwgZGVjaWQsIGk7Ci0Jc3RydWN0IGF1ZGFtcm5iX2V2ZW50ICplX25vZGUgPSBOVUxMOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCi0JY2hhciBuYW1lW3NpemVvZiAibXNtX2Ftcm5iXyIgKyA1XTsKLSNlbmRpZgotCi0JLyogQWxsb2NhdGUgTWVtIGZvciBhdWRpbyBpbnN0YW5jZSAqLwotCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhdWRpbykgewotCQlNTV9FUlIoIm5vIG1lbW9yeSB0byBhbGxvY2F0ZSBhdWRpbyBpbnN0YW5jZSBcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JTU1fSU5GTygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGNyZWF0ZWRcbiIsIChpbnQpYXVkaW8pOwotCi0JLyogQWxsb2NhdGUgdGhlIGRlY29kZXIgKi8KLQlkZWNfYXR0cmIgPSBBVURERUNfREVDX0FNUk5COwotCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9OT05UVU5ORUw7Ci0JCWF1ZGlvLT5wY21fZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREVfUExBWUJBQ0s7Ci0JfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWRlY19hdHRyYiB8PSBNU01fQVVEX01PREVfVFVOTkVMOwotCQlhdWRpby0+cGNtX2ZlZWRiYWNrID0gVFVOTkVMX01PREVfUExBWUJBQ0s7Ci0JfSBlbHNlIHsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlkZWNpZCA9IGF1ZHBwX2FkZWNfYWxsb2MoZGVjX2F0dHJiLCAmYXVkaW8tPm1vZHVsZV9uYW1lLAotCQkJJmF1ZGlvLT5xdWV1ZV9pZCk7Ci0KLQlpZiAoZGVjaWQgPCAwKSB7Ci0JCU1NX0VSUigiTm8gZnJlZSBkZWNvZGVyIGF2YWlsYWJsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJKGludClhdWRpbyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJa2ZyZWUoYXVkaW8pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYXVkaW8tPmRlY19pZCA9IGRlY2lkICYgTVNNX0FVRF9ERUNPREVSX01BU0s7Ci0KLQlhdWRpby0+cGh5cyA9IGFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKERNQVNaLCBTWl80Syk7Ci0JaWYgKCFhdWRpby0+cGh5cykgewotCQlNTV9FUlIoImNvdWxkIG5vdCBhbGxvY2F0ZSB3cml0ZSBidWZmZXJzLCBmcmVlaW5nIGluc3RhbmNlIFwKLQkJCQkweCUwOHhcbiIsIChpbnQpYXVkaW8pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLQkJa2ZyZWUoYXVkaW8pOwotCQlnb3RvIGRvbmU7Ci0JfSBlbHNlIHsKLQkJYXVkaW8tPm1hcF92X3dyaXRlID0gaW9yZW1hcChhdWRpby0+cGh5cywgRE1BU1opOwotCQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl93cml0ZSkpIHsKLQkJCU1NX0VSUigiY291bGQgbm90IG1hcCB3cml0ZSBwaHlzIGFkZHJlc3MsIGZyZWVpbmcgXAotCQkJCQlpbnN0YW5jZSAweCUwOHhcbiIsIChpbnQpYXVkaW8pOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcihhdWRpby0+cGh5cyk7Ci0JCQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0JCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKGF1ZGlvLT5waHlzKTsKLQkJCWtmcmVlKGF1ZGlvKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlhdWRpby0+ZGF0YSA9IGF1ZGlvLT5tYXBfdl93cml0ZTsKLQkJTU1fREJHKCJ3cml0ZSBidWY6IHBoeSBhZGRyIDB4JTA4eCBrZXJuZWwgYWRkciBcCi0JCQkJMHglMDh4XG4iLCBhdWRpby0+cGh5cywgKGludClhdWRpby0+ZGF0YSk7Ci0JfQotCi0JcmMgPSBtc21fYWRzcF9nZXQoYXVkaW8tPm1vZHVsZV9uYW1lLCAmYXVkaW8tPmF1ZHBsYXksCi0JCSZhdWRwbGF5X2Fkc3Bfb3BzX2Ftcm5iLCBhdWRpbyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiZmFpbGVkIHRvIGdldCAlcyBtb2R1bGUgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJYXVkaW8tPm1vZHVsZV9uYW1lLCAoaW50KWF1ZGlvKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JbXV0ZXhfaW5pdCgmYXVkaW8tPmxvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+cmVhZF9sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZHNwX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+YXZzeW5jX3dhaXQpOwotCi0JYXVkaW8tPm91dFswXS5kYXRhID0gYXVkaW8tPmRhdGEgKyAwOwotCWF1ZGlvLT5vdXRbMF0uYWRkciA9IGF1ZGlvLT5waHlzICsgMDsKLQlhdWRpby0+b3V0WzBdLnNpemUgPSBCVUZTWjsKLQotCWF1ZGlvLT5vdXRbMV0uZGF0YSA9IGF1ZGlvLT5kYXRhICsgQlVGU1o7Ci0JYXVkaW8tPm91dFsxXS5hZGRyID0gYXVkaW8tPnBoeXMgKyBCVUZTWjsKLQlhdWRpby0+b3V0WzFdLnNpemUgPSBCVUZTWjsKLQotCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IDB4MjAwMDsKLQotCWF1ZGFtcm5iX2ZsdXNoKGF1ZGlvKTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOwotCWF1ZGlvLT5vcGVuZWQgPSAxOwotCi0JYXVkaW8tPmRldmljZV9ldmVudHMgPSBBVURERVZfRVZUX0RFVl9SRFkKLQkJCQl8QVVEREVWX0VWVF9ERVZfUkxTfAotCQkJCUFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEc7Ci0KLQlyYyA9IGF1ZGRldl9yZWdpc3Rlcl9ldnRfbGlzdG5lcihhdWRpby0+ZGV2aWNlX2V2ZW50cywKLQkJCQkJQVVEREVWX0NMTlRfREVDLAotCQkJCQlhdWRpby0+ZGVjX2lkLAotCQkJCQlhbXJuYl9saXN0bmVyLAotCQkJCQkodm9pZCAqKWF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGxpc3RuZXJcbiIsIF9fZnVuY19fKTsKLQkJZ290byBldmVudF9lcnI7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mIG5hbWUsICJtc21fYW1ybmJfJTA0eCIsIGF1ZGlvLT5kZWNfaWQpOwotCWF1ZGlvLT5kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJTlVMTCwgKHZvaWQgKikgYXVkaW8sICZhdWRhbXJuYl9kZWJ1Z19mb3BzKTsKLQotCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCi0JCU1NX0RCRygiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5sZXZlbCA9IEVBUkxZX1NVU1BFTkRfTEVWRUxfRElTQUJMRV9GQjsKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5yZXN1bWUgPSBhdWRhbXJuYl9yZXN1bWU7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUuc3VzcGVuZCA9IGF1ZGFtcm5iX3N1c3BlbmQ7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLmF1ZGlvID0gYXVkaW87Ci0JcmVnaXN0ZXJfZWFybHlfc3VzcGVuZCgmYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUpOwotI2VuZGlmCi0JZm9yIChpID0gMDsgaSA8IEFVREFNUk5CX0VWRU5UX05VTTsgaSsrKSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRhbXJuYl9ldmVudCksIEdGUF9LRVJORUwpOwotCQlpZiAoZV9ub2RlKQotCQkJbGlzdF9hZGRfdGFpbCgmZV9ub2RlLT5saXN0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCQllbHNlIHsKLQkJCU1NX0VSUigiZXZlbnQgcGt0IGFsbG9jIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotZXZlbnRfZXJyOgotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci1lcnI6Ci0JaW91bm1hcChhdWRpby0+bWFwX3Zfd3JpdGUpOwotCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPnBoeXMpOwotCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19hbXJuYl9mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gYXVkYW1ybmJfb3BlbiwKLQkucmVsZWFzZSA9IGF1ZGFtcm5iX3JlbGVhc2UsCi0JLnJlYWQgPSBhdWRhbXJuYl9yZWFkLAotCS53cml0ZSA9IGF1ZGFtcm5iX3dyaXRlLAotCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGFtcm5iX2lvY3RsLAotCS5mc3luYyA9IGF1ZGFtcm5iX2ZzeW5jLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fYW1ybmJfbWlzYyA9IHsKLQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUgPSAibXNtX2Ftcm5iIiwKLQkuZm9wcyA9ICZhdWRpb19hbXJuYl9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkYW1ybmJfaW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19hbXJuYl9taXNjKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGF1ZGFtcm5iX2V4aXQodm9pZCkKLXsKLQltaXNjX2RlcmVnaXN0ZXIoJmF1ZGlvX2Ftcm5iX21pc2MpOwotfQotCi1tb2R1bGVfaW5pdChhdWRhbXJuYl9pbml0KTsKLW1vZHVsZV9leGl0KGF1ZGFtcm5iX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1TTSBBTVItTkIgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2Ftcm5iX2luLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2Ftcm5iX2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiM2MzZWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19hbXJuYl9pbi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUwICswLDAgQEAKLS8qCi0gKiBhbXJuYiBhdWRpbyBpbnB1dCBkZXZpY2UKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fYW1ybmIuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtb3J5X2FsbG9jLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2lvbW11Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdV9kb21haW5zLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPG1hY2gvc29jaW5mby5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHJlY2NtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRyZWNtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkcHJlcHJvYy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19kZXZfY3RsLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX21lbXR5cGVzLmg+Ci0KLS8qIEZSQU1FX05VTSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvICovCi0jZGVmaW5lIEZSQU1FX05VTQkJKDgpCi0jZGVmaW5lIEZSQU1FX1NJWkUJCSgyMiAqIDIpIC8qIDM2IGJ5dGVzIGRhdGEgKi8KLSNkZWZpbmUgRE1BU1ogCQkJKEZSQU1FX1NJWkUgKiBGUkFNRV9OVU0pCi0KLXN0cnVjdCBidWZmZXIgewotCXZvaWQgKmRhdGE7Ci0JdWludDMyX3Qgc2l6ZTsKLQl1aW50MzJfdCByZWFkOwotCXVpbnQzMl90IGFkZHI7Ci19OwotCi1zdHJ1Y3QgYXVkaW9faW4gewotCXN0cnVjdCBidWZmZXIgaW5bRlJBTUVfTlVNXTsKLQotCXNwaW5sb2NrX3QgZHNwX2xvY2s7Ci0KLQlhdG9taWNfdCBpbl9ieXRlczsKLQlhdG9taWNfdCBpbl9zYW1wbGVzOwotCi0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IG11dGV4IHJlYWRfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfZW5hYmxlOwotCi0Jc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqYXVkcmVjOwotCXN0cnVjdCBhdWRyZWNfc2Vzc2lvbl9pbmZvIHNlc3Npb25faW5mbzsgLyphdWRyZWMgc2Vzc2lvbiBpbmZvKi8KLQotCS8qIGNvbmZpZ3VyYXRpb24gdG8gdXNlIG9uIG5leHQgZW5hYmxlICovCi0JdWludDMyX3QgYnVmZmVyX3NpemU7IC8qIEZyYW1lIHNpemUgKDM2IGJ5dGVzKSAqLwotCXVpbnQzMl90IGVuY190eXBlOwotCi0JaW50IGR0eF9tb2RlOwotCXVpbnQzMl90IGZyYW1lX2Zvcm1hdDsKLQl1aW50MzJfdCB1c2VkX21vZGU7Ci0JdWludDMyX3QgcmVjX21vZGU7Ci0KLQl1aW50MzJfdCBkc3BfY250OwotCXVpbnQzMl90IGluX2hlYWQ7IC8qIG5leHQgYnVmZmVyIGRzcCB3aWxsIHdyaXRlICovCi0JdWludDMyX3QgaW5fdGFpbDsgLyogbmV4dCBidWZmZXIgcmVhZCgpIHdpbGwgcmVhZCAqLwotCXVpbnQzMl90IGluX2NvdW50OyAvKiBudW1iZXIgb2YgYnVmZmVycyBhdmFpbGFibGUgdG8gcmVhZCgpICovCi0JdWludDMyX3QgbW9kZTsKLQotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIHF1ZXVlX2lkczsKLQl1aW50MTZfdCBlbmNfaWQ7Ci0KLQl1aW50MTZfdCBzb3VyY2U7IC8qIEVuY29kaW5nIHNvdXJjZSBiaXQgbWFzayAqLwotCXVpbnQzMl90IGRldmljZV9ldmVudHM7Ci0JdWludDMyX3QgaW5fY2FsbDsKLQl1aW50MzJfdCBkZXZfY250OwotCWludCB2b2ljZV9zdGF0ZTsKLQlzcGlubG9ja190IGRldl9sb2NrOwotCi0JLyogZGF0YSBhbGxvY2F0ZWQgZm9yIHZhcmlvdXMgYnVmZmVycyAqLwotCWNoYXIgKmRhdGE7Ci0JZG1hX2FkZHJfdCBwaHlzOwotCXZvaWQgKm1hcF92X3JlYWQ7Ci0KLQlpbnQgb3BlbmVkOwotCWludCBlbmFibGVkOwotCWludCBydW5uaW5nOwotCWludCBzdG9wcGVkOyAvKiBzZXQgd2hlbiBzdG9wcGVkLCBjbGVhcmVkIG9uIGZsdXNoICovCi0JY2hhciAqYnVpbGRfaWQ7Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqYnVmZl9oYW5kbGU7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fZnJhbWUgewotCXVpbnQxNl90IGZyYW1lX2NvdW50X2xzdzsKLQl1aW50MTZfdCBmcmFtZV9jb3VudF9tc3c7Ci0JdWludDE2X3QgZnJhbWVfbGVuZ3RoOwotCXVpbnQxNl90IGVyYXNlZF9wY207Ci0JdW5zaWduZWQgY2hhciByYXdfYml0c3RyZWFtW107IC8qIHNhbXBsZXMgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qIEF1ZHJlYyBRdWV1ZSBjb21tYW5kIHNlbnQgbWFjcm8ncyAqLwotI2RlZmluZSBhdWRyZWNfc2VuZF9iaXRzdHJlYW1xdWV1ZShhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcmVjLCAoKGF1ZGlvLT5xdWV1ZV9pZHMgJiAweEZGRkYwMDAwKSA+PiAxNiksXAotCQkJY21kLCBsZW4pCi0KLSNkZWZpbmUgYXVkcmVjX3NlbmRfYXVkcmVjcXVldWUoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHJlYywgKGF1ZGlvLT5xdWV1ZV9pZHMgJiAweDAwMDBGRkZGKSxcCi0JCQljbWQsIGxlbikKLQotc3RydWN0IGF1ZGlvX2luIHRoZV9hdWRpb19hbXJuYl9pbjsKLQotLyogRFNQIGNvbW1hbmQgc2VuZCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgYXVkYW1ybmJfaW5fZW5jX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLCBpbnQgZW5hYmxlKTsKLXN0YXRpYyBpbnQgYXVkYW1ybmJfaW5fcGFyYW1fY29uZmlnKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pOwotc3RhdGljIGludCBhdWRhbXJuYl9pbl9tZW1fY29uZmlnKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pOwotc3RhdGljIGludCBhdWRhbXJuYl9pbl9yZWNvcmRfY29uZmlnKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sIGludCBlbmFibGUpOwotc3RhdGljIGludCBhdWRhbXJuYl9kc3BfcmVhZF9idWZmZXIoc3RydWN0IGF1ZGlvX2luICphdWRpbywgdWludDMyX3QgcmVhZF9jbnQpOwotCi1zdGF0aWMgdm9pZCBhdWRhbXJuYl9pbl9nZXRfZHNwX2ZyYW1lcyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLQotc3RhdGljIHZvaWQgYXVkYW1ybmJfaW5fZmx1c2goc3RydWN0IGF1ZGlvX2luICphdWRpbyk7Ci0KLXN0YXRpYyB2b2lkIGFtcm5iX2luX2xpc3RlbmVyKHUzMiBldnRfaWQsIHVuaW9uIGF1ZGRldl9ldnRfZGF0YSAqZXZ0X3BheWxvYWQsCi0JCQkJdm9pZCAqcHJpdmF0ZV9kYXRhKQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSAoc3RydWN0IGF1ZGlvX2luICopIHByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JTU1fREJHKCJldnRfaWQgPSAweCU4eFxuIiwgZXZ0X2lkKTsKLQlzd2l0Y2ggKGV2dF9pZCkgewotCWNhc2UgQVVEREVWX0VWVF9ERVZfUkRZOiB7Ci0JCU1NX0RCRygiQVVEREVWX0VWVF9ERVZfUkRZXG4iKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+ZGV2X2NudCsrOwotCQlpZiAoIWF1ZGlvLT5pbl9jYWxsKQotCQkJYXVkaW8tPnNvdXJjZSB8PSAoMHgxIDw8IGV2dF9wYXlsb2FkLT5yb3V0aW5nX2lkKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRldl9sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKChhdWRpby0+cnVubmluZyA9PSAxKSAmJiAoYXVkaW8tPmVuYWJsZWQgPT0gMSkpCi0JCQlhdWRhbXJuYl9pbl9yZWNvcmRfY29uZmlnKGF1ZGlvLCAxKTsKLQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURERVZfRVZUX0RFVl9STFM6IHsKLQkJTU1fREJHKCJBVURERVZfRVZUX0RFVl9STFNcbiIpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRldl9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT5kZXZfY250LS07Ci0JCWlmICghYXVkaW8tPmluX2NhbGwpCi0JCQlhdWRpby0+c291cmNlICY9IH4oMHgxIDw8IGV2dF9wYXlsb2FkLT5yb3V0aW5nX2lkKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRldl9sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKCghYXVkaW8tPnJ1bm5pbmcpIHx8ICghYXVkaW8tPmVuYWJsZWQpKQotCQkJYnJlYWs7Ci0KLQkJLyogVHVybiBvZiBhcyBwZXIgc291cmNlICovCi0JCWlmIChhdWRpby0+c291cmNlKQotCQkJYXVkYW1ybmJfaW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMSk7Ci0JCWVsc2UKLQkJCS8qIFR1cm4gb2ZmIGFsbCAqLwotCQkJYXVkYW1ybmJfaW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMCk7Ci0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEc6IHsKLQkJTU1fREJHKCJBVURERVZfRVZUX1ZPSUNFX1NUQVRFX0NIRywgc3RhdGUgPSAlZFxuIiwKLQkJCQlldnRfcGF5bG9hZC0+dm9pY2Vfc3RhdGUpOwotCQlhdWRpby0+dm9pY2Vfc3RhdGUgPSBldnRfcGF5bG9hZC0+dm9pY2Vfc3RhdGU7Ci0JCWlmIChhdWRpby0+aW5fY2FsbCAmJiBhdWRpby0+cnVubmluZykgewotCQkJaWYgKGF1ZGlvLT52b2ljZV9zdGF0ZSA9PSBWT0lDRV9TVEFURV9JTkNBTEwpCi0JCQkJYXVkYW1ybmJfaW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMSk7Ci0JCQllbHNlIGlmIChhdWRpby0+dm9pY2Vfc3RhdGUgPT0gVk9JQ0VfU1RBVEVfT0ZGQ0FMTCkgewotCQkJCWF1ZGFtcm5iX2luX3JlY29yZF9jb25maWcoYXVkaW8sIDApOwotCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCX0KLQkJfQotCi0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlNTV9FUlIoIndyb25nIGV2ZW50ICVkXG4iLCBldnRfaWQpOwotCQlicmVhazsKLQl9Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZHNwIHByZXByb2MgZXZlbnQgaGFuZGxlci0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgYXVkcHJlcHJvY19kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsICB2b2lkICptc2cpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IGRhdGE7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQUkVQUk9DX0VSUk9SX01TRzogewotCQlzdHJ1Y3QgYXVkcHJlcHJvY19lcnJfbXNnICplcnJfbXNnID0gbXNnOwotCi0JCU1NX0VSUigiRVJST1JfTVNHOiBzdHJlYW0gaWQgJWQgZXJyIGlkeCAlZFxuIiwKLQkJZXJyX21zZy0+c3RyZWFtX2lkLCBlcnJfbXNnLT5hdWRfcHJlcHJvY19lcnJfaWR4KTsKLQkJLyogRXJyb3IgY2FzZSAqLwotCQl3YWtlX3VwKCZhdWRpby0+d2FpdF9lbmFibGUpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURQUkVQUk9DX0NNRF9DRkdfRE9ORV9NU0c6IHsKLQkJTU1fREJHKCJDTURfQ0ZHX0RPTkVfTVNHIFxuIik7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFBSRVBST0NfQ01EX0VOQ19DRkdfRE9ORV9NU0c6IHsKLQkJc3RydWN0IGF1ZHByZXByb2NfY21kX2VuY19jZmdfZG9uZV9tc2cgKmVuY19jZmdfbXNnID0gbXNnOwotCi0JCU1NX0RCRygiQ01EX0VOQ19DRkdfRE9ORV9NU0c6IHN0cmVhbSBpZCAlZCBlbmMgdHlwZSBcCi0JCQkweCU4eFxuIiwgZW5jX2NmZ19tc2ctPnN0cmVhbV9pZCwKLQkJCWVuY19jZmdfbXNnLT5yZWNfZW5jX3R5cGUpOwotCQkvKiBFbmNvZGVyIGVuYWJsZSBzdWNjZXNzICovCi0JCWlmIChlbmNfY2ZnX21zZy0+cmVjX2VuY190eXBlICYgRU5DT0RFX0VOQUJMRSkKLQkJCWF1ZGFtcm5iX2luX3BhcmFtX2NvbmZpZyhhdWRpbyk7Ci0JCWVsc2UgeyAvKiBFbmNvZGVyIGRpc2FibGUgc3VjY2VzcyAqLwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAwOwotCQkJYXVkYW1ybmJfaW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFJFUFJPQ19DTURfRU5DX1BBUkFNX0NGR19ET05FX01TRzogewotCQlNTV9EQkcoIkNNRF9FTkNfUEFSQU1fQ0ZHX0RPTkVfTVNHIFxuIik7Ci0JCWF1ZGFtcm5iX2luX21lbV9jb25maWcoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURQUkVQUk9DX0FGRV9DTURfQVVESU9fUkVDT1JEX0NGR19ET05FX01TRzogewotCQlNTV9EQkcoIkFGRV9DTURfQVVESU9fUkVDT1JEX0NGR19ET05FX01TRyBcbiIpOwotCQl3YWtlX3VwKCZhdWRpby0+d2FpdF9lbmFibGUpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJVbmtub3duIEV2ZW50IGlkICVkXG4iLCBpZCk7Ci0JfQotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCBhdWRyZWMgZXZlbnQgaGFuZGxlci0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgYXVkcmVjX2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgc2l6ZV90IGxlbiwKLQkJCSAgICB2b2lkICgqZ2V0ZXZlbnQpKHZvaWQgKnB0ciwgc2l6ZV90IGxlbikpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IGRhdGE7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURSRUNfQ01EX01FTV9DRkdfRE9ORV9NU0c6IHsKLQkJTU1fREJHKCJDTURfTUVNX0NGR19ET05FIE1TRyBET05FXG4iKTsKLQkJYXVkaW8tPnJ1bm5pbmcgPSAxOwotCQlpZiAoKCFhdWRpby0+aW5fY2FsbCAmJiAoYXVkaW8tPmRldl9jbnQgPiAwKSkgfHwKLQkJCShhdWRpby0+aW5fY2FsbCAmJgotCQkJCShhdWRpby0+dm9pY2Vfc3RhdGUgPT0gVk9JQ0VfU1RBVEVfSU5DQUxMKSkpCi0JCQlhdWRhbXJuYl9pbl9yZWNvcmRfY29uZmlnKGF1ZGlvLCAxKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX0ZBVEFMX0VSUl9NU0c6IHsKLQkJc3RydWN0IGF1ZHJlY19mYXRhbF9lcnJfbXNnIGZhdGFsX2Vycl9tc2c7Ci0KLQkJZ2V0ZXZlbnQoJmZhdGFsX2Vycl9tc2csIEFVRFJFQ19GQVRBTF9FUlJfTVNHX0xFTik7Ci0JCU1NX0VSUigiRkFUQUxfRVJSX01TRzogZXJyIGlkICVkXG4iLAotCQkJCWZhdGFsX2Vycl9tc2cuYXVkcmVjX2Vycl9pZCk7Ci0JCS8qIEVycm9yIHN0b3AgdGhlIGVuY29kZXIgKi8KLQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19VUF9QQUNLRVRfUkVBRFlfTVNHOiB7Ci0JCXN0cnVjdCBhdWRyZWNfdXBfcGt0X3JlYWR5X21zZyBwa3RfcmVhZHlfbXNnOwotCi0JCWdldGV2ZW50KCZwa3RfcmVhZHlfbXNnLCBBVURSRUNfVVBfUEFDS0VUX1JFQURZX01TR19MRU4pOwotCQlNTV9EQkcoIlVQX1BBQ0tFVF9SRUFEWV9NU0c6IHdyaXRlIGNudCBsc3cgICVkIFwKLQkJd3JpdGUgY250IG1zdyAlZCByZWFkIGNudCBsc3cgJWQgIHJlYWQgY250IG1zdyAlZCBcbiIsXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY19wYWNrZXRfd3JpdGVfY250X2xzdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY19wYWNrZXRfd3JpdGVfY250X21zdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY191cF9wcmV2X3JlYWRfY250X2xzdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY191cF9wcmV2X3JlYWRfY250X21zdyk7Ci0KLQkJYXVkYW1ybmJfaW5fZ2V0X2RzcF9mcmFtZXMoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBRFNQX01FU1NBR0VfSUQ6IHsKLQkJTU1fREJHKCJSZWNlaXZlZCBBRFNQIGV2ZW50Om1vZHVsZSBhdWRyZWN0YXNrXG4iKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiVW5rbm93biBFdmVudCBpZCAlZFxuIiwgaWQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXVkYW1ybmJfaW5fZ2V0X2RzcF9mcmFtZXMoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkaW9fZnJhbWUgKmZyYW1lOwotCXVpbnQzMl90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpbmRleCA9IGF1ZGlvLT5pbl9oZWFkOwotCi0JZnJhbWUgPSAodm9pZCAqKSAoKChjaGFyICopYXVkaW8tPmluW2luZGV4XS5kYXRhKSAtIFwKLQkJCSBzaXplb2YoKmZyYW1lKSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JYXVkaW8tPmluW2luZGV4XS5zaXplID0gZnJhbWUtPmZyYW1lX2xlbmd0aDsKLQotCS8qIHN0YXRpc3RpY3Mgb2YgcmVhZCAqLwotCWF0b21pY19hZGQoYXVkaW8tPmluW2luZGV4XS5zaXplLCAmYXVkaW8tPmluX2J5dGVzKTsKLQlhdG9taWNfYWRkKDEsICZhdWRpby0+aW5fc2FtcGxlcyk7Ci0KLQlhdWRpby0+aW5faGVhZCA9IChhdWRpby0+aW5faGVhZCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCi0JLyogSWYgb3ZlcmZsb3csIG1vdmUgdGhlIHRhaWwgaW5kZXggZm93YXJkLiAqLwotCWlmIChhdWRpby0+aW5faGVhZCA9PSBhdWRpby0+aW5fdGFpbCkKLQkJYXVkaW8tPmluX3RhaWwgPSAoYXVkaW8tPmluX3RhaWwgKyAxKSAmIChGUkFNRV9OVU0gLSAxKTsKLQllbHNlCi0JCWF1ZGlvLT5pbl9jb3VudCsrOwotCi0JYXVkYW1ybmJfZHNwX3JlYWRfYnVmZmVyKGF1ZGlvLCBhdWRpby0+ZHNwX2NudCsrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQotCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLX0KLXN0cnVjdCBtc21fYWRzcF9vcHMgYXVkcmVjX2Ftcm5iX2Fkc3Bfb3BzID0gewotCS5ldmVudCA9IGF1ZHJlY19kc3BfZXZlbnQsCi19OwotCi1zdGF0aWMgaW50IGF1ZGFtcm5iX2luX2VuY19jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19hdWRyZWNfY21kX2VuY19jZmcgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQlpZiAoYXVkaW8tPmJ1aWxkX2lkWzE3XSA9PSAnMScpIHsKLQkJY21kLmNtZF9pZCA9IEFVRFBSRVBST0NfQVVEUkVDX0NNRF9FTkNfQ0ZHXzI7Ci0JCU1NX0VSUigic2VuZGluZyBBVURQUkVQUk9DX0FVRFJFQ19DTURfRU5DX0NGR18yIGNvbW1hbmQiKTsKLQl9IGVsc2UgewotCQljbWQuY21kX2lkID0gQVVEUFJFUFJPQ19BVURSRUNfQ01EX0VOQ19DRkc7Ci0JCU1NX0VSUigic2VuZGluZyBBVURQUkVQUk9DX0FVRFJFQ19DTURfRU5DX0NGRyBjb21tYW5kIik7Ci0JfQotCWNtZC5zdHJlYW1faWQgPSBhdWRpby0+ZW5jX2lkOwotCi0JaWYgKGVuYWJsZSkKLQkJY21kLmF1ZHJlY19lbmNfdHlwZSA9IGF1ZGlvLT5lbmNfdHlwZSB8IEVOQ09ERV9FTkFCTEU7Ci0JZWxzZQotCQljbWQuYXVkcmVjX2VuY190eXBlICY9IH4oRU5DT0RFX0VOQUJMRSk7Ci0KLQlyZXR1cm4gYXVkcHJlcHJvY19zZW5kX2F1ZHJlY2NtZHF1ZXVlKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRhbXJuYl9pbl9wYXJhbV9jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19hdWRyZWNfY21kX3Bhcm1fY2ZnX2Ftcm5iIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNvbW1vbi5jbWRfaWQgPSBBVURQUkVQUk9DX0FVRFJFQ19DTURfUEFSQU1fQ0ZHOwotCWNtZC5jb21tb24uc3RyZWFtX2lkID0gYXVkaW8tPmVuY19pZDsKLQotCWNtZC5kdHhfbW9kZSA9IGF1ZGlvLT5kdHhfbW9kZTsKLQljbWQudGVzdF9tb2RlID0gLTE7IC8qIERlZmF1bHQgc2V0IHRvIC0xICovCi0JY21kLnVzZWRfbW9kZSA9IGF1ZGlvLT51c2VkX21vZGU7Ci0KLQlyZXR1cm4gYXVkcHJlcHJvY19zZW5kX2F1ZHJlY2NtZHF1ZXVlKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotLyogVG8gRG86IG1zbV9zbmRkZXZfcm91dGVfZW5jKGF1ZGlvLT5lbmNfaWQpOyAqLwotc3RhdGljIGludCBhdWRhbXJuYl9pbl9yZWNvcmRfY29uZmlnKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0Jc3RydWN0IGF1ZHByZXByb2NfYWZlX2NtZF9hdWRpb19yZWNvcmRfY2ZnIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFBSRVBST0NfQUZFX0NNRF9BVURJT19SRUNPUkRfQ0ZHOwotCWNtZC5zdHJlYW1faWQgPSBhdWRpby0+ZW5jX2lkOwotCWlmIChlbmFibGUpCi0JCWNtZC5kZXN0aW5hdGlvbl9hY3Rpdml0eSA9IEFVRElPX1JFQ09SRElOR19UVVJOX09OOwotCWVsc2UKLQkJY21kLmRlc3RpbmF0aW9uX2FjdGl2aXR5ID0gQVVESU9fUkVDT1JESU5HX1RVUk5fT0ZGOwotCi0JY21kLnNvdXJjZV9taXhfbWFzayA9IGF1ZGlvLT5zb3VyY2U7Ci0JaWYgKGF1ZGlvLT5lbmNfaWQgPT0gMikgewotCQlpZiAoKGNtZC5zb3VyY2VfbWl4X21hc2sgJgotCQkJCUlOVEVSTkFMX0NPREVDX1RYX1NPVVJDRV9NSVhfTUFTSykgfHwKLQkJCShjbWQuc291cmNlX21peF9tYXNrICYgQVVYX0NPREVDX1RYX1NPVVJDRV9NSVhfTUFTSykgfHwKLQkJCShjbWQuc291cmNlX21peF9tYXNrICYgVk9JQ0VfVUxfU09VUkNFX01JWF9NQVNLKSB8fAotCQkJKGNtZC5zb3VyY2VfbWl4X21hc2sgJiBWT0lDRV9ETF9TT1VSQ0VfTUlYX01BU0spKSB7Ci0JCQljbWQucGlwZV9pZCA9IFNPVVJDRV9QSVBFXzE7Ci0JCX0KLQkJaWYgKGNtZC5zb3VyY2VfbWl4X21hc2sgJgotCQkJCUFVRFBQX0EyRFBfUElQRV9TT1VSQ0VfTUlYX01BU0spCi0JCQljbWQucGlwZV9pZCB8PSBTT1VSQ0VfUElQRV8wOwotCX0KLQotCXJldHVybiBhdWRwcmVwcm9jX3NlbmRfYXVkcmVjY21kcXVldWUoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGF1ZGFtcm5iX2luX21lbV9jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9hcmVjbWVtX2NmZyBjbWQ7Ci0JdWludDE2X3QgKmRhdGEgPSAodm9pZCAqKSBhdWRpby0+ZGF0YTsKLQlpbnQgbjsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfTUVNX0NGR19DTUQ7Ci0JY21kLmF1ZHJlY191cF9wa3RfaW50bV9jb3VudCA9IDE7Ci0JY21kLmF1ZHJlY19leHRfcGt0X3N0YXJ0X2FkZHJfbXN3ID0gYXVkaW8tPnBoeXMgPj4gMTY7Ci0JY21kLmF1ZHJlY19leHRfcGt0X3N0YXJ0X2FkZHJfbHN3ID0gYXVkaW8tPnBoeXM7Ci0JY21kLmF1ZHJlY19leHRfcGt0X2J1Zl9udW1iZXIgPSBGUkFNRV9OVU07Ci0KLQkvKiBwcmVwYXJlIGJ1ZmZlciBwb2ludGVyczoKLQkgKiAzNiBieXRlcyBhbXJuYiBwYWNrZXQgKyA0IGhhbGZ3b3JkIGhlYWRlcgotCSAqLwotCWZvciAobiA9IDA7IG4gPCBGUkFNRV9OVU07IG4rKykgewotCQlhdWRpby0+aW5bbl0uZGF0YSA9IGRhdGEgKyA0OwotCQlkYXRhICs9IChGUkFNRV9TSVpFLzIpOyAvKiB3b3JkIGluY3JlbWVudCAqLwotCQlNTV9EQkcoIjB4JTh4XG4iLCAoaW50KShhdWRpby0+aW5bbl0uZGF0YSAtIDgpKTsKLQl9Ci0KLQlyZXR1cm4gYXVkcmVjX3NlbmRfYXVkcmVjcXVldWUoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRhbXJuYl9kc3BfcmVhZF9idWZmZXIoc3RydWN0IGF1ZGlvX2luICphdWRpbywgdWludDMyX3QgcmVhZF9jbnQpCi17Ci0Jc3RydWN0IHVwX2F1ZHJlY19wYWNrZXRfZXh0X3B0ciBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBVUF9BVURSRUNfUEFDS0VUX0VYVF9QVFI7Ci0JY21kLmF1ZHJlY191cF9jdXJyX3JlYWRfY291bnRfbXN3ID0gcmVhZF9jbnQgPj4gMTY7Ci0JY21kLmF1ZHJlY191cF9jdXJyX3JlYWRfY291bnRfbHN3ID0gcmVhZF9jbnQ7Ci0KLQlyZXR1cm4gYXVkcmVjX3NlbmRfYml0c3RyZWFtcXVldWUoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGFtcm5iX2luX2VuYWJsZShzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCWlmIChhdWRpby0+ZW5hYmxlZCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoYXVkcHJlcHJvY19lbmFibGUoYXVkaW8tPmVuY19pZCwgJmF1ZHByZXByb2NfZHNwX2V2ZW50LCBhdWRpbykpIHsKLQkJTU1fRVJSKCJtc21fYWRzcF9lbmFibGUoYXVkcHJlcHJvYykgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKG1zbV9hZHNwX2VuYWJsZShhdWRpby0+YXVkcmVjKSkgewotCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRyZWMpIGZhaWxlZFxuIik7Ci0JCWF1ZHByZXByb2NfZGlzYWJsZShhdWRpby0+ZW5jX2lkLCBhdWRpbyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JYXVkYW1ybmJfaW5fZW5jX2NvbmZpZyhhdWRpbywgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGFtcm5iX2luX2Rpc2FibGUoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQlhdWRhbXJuYl9pbl9lbmNfY29uZmlnKGF1ZGlvLCAwKTsKLQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdF9lbmFibGUsCi0JCQkJYXVkaW8tPnJ1bm5pbmcgPT0gMCwgMSpIWik7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHJlYyk7Ci0JCWF1ZHByZXByb2NfZGlzYWJsZShhdWRpby0+ZW5jX2lkLCBhdWRpbyk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhbXJuYl9pbl9mbHVzaChzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCWludCBpOwotCi0JYXVkaW8tPmRzcF9jbnQgPSAwOwotCWF1ZGlvLT5pbl9oZWFkID0gMDsKLQlhdWRpby0+aW5fdGFpbCA9IDA7Ci0JYXVkaW8tPmluX2NvdW50ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfTlVNOyBpKyspIHsKLQkJYXVkaW8tPmluW2ldLnNpemUgPSAwOwotCQlhdWRpby0+aW5baV0ucmVhZCA9IDA7Ci0JfQotCU1NX0RCRygiaW5fYnl0ZXMgJWRcbiIsIGF0b21pY19yZWFkKCZhdWRpby0+aW5fYnl0ZXMpKTsKLQlNTV9EQkcoImluX3NhbXBsZXMgJWRcbiIsIGF0b21pY19yZWFkKCZhdWRpby0+aW5fc2FtcGxlcykpOwotCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9ieXRlcywgMCk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPmluX3NhbXBsZXMsIDApOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBsb25nIGF1ZGFtcm5iX2luX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX1NUQVRTKSB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdGF0cykpOwotCQlzdGF0cy5ieXRlX2NvdW50ID0gYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9ieXRlcyk7Ci0JCXN0YXRzLnNhbXBsZV9jb3VudCA9IGF0b21pY19yZWFkKCZhdWRpby0+aW5fc2FtcGxlcyk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCXVpbnQzMl90IGZyZXE7Ci0JCWZyZXEgPSA0ODAwMDsKLQkJTU1fREJHKCJBVURJT19TVEFSVFxuIik7Ci0JCWlmIChhdWRpby0+aW5fY2FsbCAmJiAoYXVkaW8tPnZvaWNlX3N0YXRlICE9Ci0JCQkJVk9JQ0VfU1RBVEVfSU5DQUxMKSkgewotCQkJcmMgPSAtRVBFUk07Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IG1zbV9zbmRkZXZfcmVxdWVzdF9mcmVxKCZmcmVxLCBhdWRpby0+ZW5jX2lkLAotCQkJCQlTTkRERVZfQ0FQX1RYLCBBVURERVZfQ0xOVF9FTkMpOwotCQlNTV9EQkcoInNhbXBsZSByYXRlIGNvbmZpZ3VyZWQgJWRcbiIsIGZyZXEpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlNTV9EQkcoIiBTYW1wbGUgcmF0ZSBjYW4gbm90IGJlIHNldCwgcmV0dXJuIGNvZGUgJWRcbiIsCi0JCQkJCQkJCSByYyk7Ci0JCQltc21fc25kZGV2X3dpdGhkcmF3X2ZyZXEoYXVkaW8tPmVuY19pZCwKLQkJCQkJU05EREVWX0NBUF9UWCwgQVVEREVWX0NMTlRfRU5DKTsKLQkJCU1NX0RCRygibXNtX3NuZGRldl93aXRoZHJhd19mcmVxXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qdXBkYXRlIGF1cmVjIHNlc3Npb24gaW5mbyBpbiBhdWRwcmVwcm9jIGxheWVyKi8KLQkJYXVkaW8tPnNlc3Npb25faW5mby5zZXNzaW9uX2lkID0gYXVkaW8tPmVuY19pZDsKLQkJLyphbXJuYiB3b3JrcyBvbmx5IG9uIDhLSHoqLwotCQlhdWRpby0+c2Vzc2lvbl9pbmZvLnNhbXBsaW5nX2ZyZXEgPSA4MDAwOwotCQlhdWRwcmVwcm9jX3VwZGF0ZV9hdWRyZWNfaW5mbygmYXVkaW8tPnNlc3Npb25faW5mbyk7Ci0JCXJjID0gYXVkYW1ybmJfaW5fZW5hYmxlKGF1ZGlvKTsKLQkJaWYgKCFyYykgewotCQkJcmMgPQotCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXRfZW5hYmxlLAotCQkJCWF1ZGlvLT5ydW5uaW5nICE9IDAsIDEqSFopOwotCQkJTU1fREJHKCJzdGF0ZSAlZCByYyA9ICVkXG4iLCBhdWRpby0+cnVubmluZywgcmMpOwotCi0JCQlpZiAoYXVkaW8tPnJ1bm5pbmcgPT0gMCkKLQkJCQlyYyA9IC1FTk9ERVY7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQl9Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU1RPUDogewotCQkvKnJlc2V0IHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgaW5mb3JtYXRpb24gYXQgYXVkcHJlcHJvYyBsYXllciovCi0JCWF1ZGlvLT5zZXNzaW9uX2luZm8uc2FtcGxpbmdfZnJlcSA9IDA7Ci0JCWF1ZHByZXByb2NfdXBkYXRlX2F1ZHJlY19pbmZvKCZhdWRpby0+c2Vzc2lvbl9pbmZvKTsKLQkJcmMgPSBhdWRhbXJuYl9pbl9kaXNhYmxlKGF1ZGlvKTsKLQkJcmMgPSBtc21fc25kZGV2X3dpdGhkcmF3X2ZyZXEoYXVkaW8tPmVuY19pZCwKLQkJCQkJU05EREVWX0NBUF9UWCwgQVVEREVWX0NMTlRfRU5DKTsKLQkJTU1fREJHKCJtc21fc25kZGV2X3dpdGhkcmF3X2ZyZXFcbiIpOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0ZMVVNIOiB7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCkgewotCQkJLyogTWFrZSBzdXJlIHdlJ3JlIHN0b3BwZWQgYW5kIHdlIHdha2UgYW55IHRocmVhZHMKLQkJCSAqIHRoYXQgbWlnaHQgYmUgYmxvY2tlZCBob2xkaW5nIHRoZSByZWFkX2xvY2suCi0JCQkgKiBXaGlsZSBhdWRpby0+c3RvcHBlZCByZWFkIHRocmVhZHMgd2lsbCBhbHdheXMKLQkJCSAqIGV4aXQgaW1tZWRpYXRlbHkuCi0JCQkgKi8KLQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCQkJYXVkYW1ybmJfaW5fZmx1c2goYXVkaW8pOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfU1RSRUFNX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgY2ZnOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgKHZvaWQgKikgYXJnLCBzaXplb2YoY2ZnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIEFsbG93IG9ubHkgc2luZ2xlIGZyYW1lICovCi0JCWlmIChjZmcuYnVmZmVyX3NpemUgIT0gKEZSQU1FX1NJWkUgLSA4KSkKLQkJCXJjID0gLUVJTlZBTDsKLQkJZWxzZQotCQkJYXVkaW8tPmJ1ZmZlcl9zaXplID0gY2ZnLmJ1ZmZlcl9zaXplOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfU1RSRUFNX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgY2ZnOwotCQltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOwotCQljZmcuYnVmZmVyX3NpemUgPSBhdWRpby0+YnVmZmVyX3NpemU7Ci0JCWNmZy5idWZmZXJfY291bnQgPSBGUkFNRV9OVU07Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmY2ZnLCBzaXplb2YoY2ZnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9BTVJOQl9FTkNfQ09ORklHX1YyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYW1ybmJfZW5jX2NvbmZpZ192MiBjZmc7Ci0JCW1lbXNldCgmY2ZnLCAwLCBzaXplb2YoY2ZnKSk7Ci0JCWNmZy5kdHhfZW5hYmxlID0gKChhdWRpby0+ZHR4X21vZGUgPT0gLTEpID8gMSA6IDApOwotCQljZmcuYmFuZF9tb2RlID0gYXVkaW8tPnVzZWRfbW9kZTsKLQkJY2ZnLmZyYW1lX2Zvcm1hdCA9IGF1ZGlvLT5mcmFtZV9mb3JtYXQ7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmY2ZnLCBzaXplb2YoY2ZnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9BTVJOQl9FTkNfQ09ORklHX1YyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYW1ybmJfZW5jX2NvbmZpZ192MiBjZmc7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKSBhcmcsIHNpemVvZihjZmcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogRFNQIGRvZXMgbm90IHN1cHBvcnQgYW55IG90aGVyIHRoYW4gZGVmYXVsdCBmb3JtYXQgKi8KLQkJaWYgKGF1ZGlvLT5mcmFtZV9mb3JtYXQgIT0gY2ZnLmZyYW1lX2Zvcm1hdCkgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNmZy5kdHhfZW5hYmxlID09IDApCi0JCQlhdWRpby0+ZHR4X21vZGUgPSAwOwotCQllbHNlIGlmIChjZmcuZHR4X2VuYWJsZSA9PSAxKQotCQkJYXVkaW8tPmR0eF9tb2RlID0gLTE7Ci0JCWVsc2UgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPnVzZWRfbW9kZSA9IGNmZy5iYW5kX21vZGU7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9JTkNBTEw6IHsKLQkJc3RydWN0IG1zbV92b2ljZXJlY19tb2RlIGNmZzsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsICh2b2lkICopIGFyZywgc2l6ZW9mKGNmZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY2ZnLnJlY19tb2RlICE9IFZPQ19SRUNfQk9USCAmJgotCQkJY2ZnLnJlY19tb2RlICE9IFZPQ19SRUNfVVBMSU5LICYmCi0JCQljZmcucmVjX21vZGUgIT0gVk9DX1JFQ19ET1dOTElOSykgewotCQkJTU1fRVJSKCJpbnZhbGlkIHJlY19tb2RlXG4iKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCQkJaWYgKGNmZy5yZWNfbW9kZSA9PSBWT0NfUkVDX1VQTElOSykKLQkJCQlhdWRpby0+c291cmNlID0gVk9JQ0VfVUxfU09VUkNFX01JWF9NQVNLOwotCQkJZWxzZSBpZiAoY2ZnLnJlY19tb2RlID09IFZPQ19SRUNfRE9XTkxJTkspCi0JCQkJYXVkaW8tPnNvdXJjZSA9IFZPSUNFX0RMX1NPVVJDRV9NSVhfTUFTSzsKLQkJCWVsc2UKLQkJCQlhdWRpby0+c291cmNlID0gVk9JQ0VfRExfU09VUkNFX01JWF9NQVNLIHwKLQkJCQkJCVZPSUNFX1VMX1NPVVJDRV9NSVhfTUFTSyA7Ci0JCQlhdWRpby0+aW5fY2FsbCA9IDE7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZGV2X2xvY2ssIGZsYWdzKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfU0VTU0lPTl9JRDogewotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmF1ZGlvLT5lbmNfaWQsCi0JCQlzaXplb2YodW5zaWduZWQgc2hvcnQpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkYW1ybmJfaW5fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQljaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQl2b2lkICpkYXRhOwotCXVpbnQzMl90IGluZGV4OwotCXVpbnQzMl90IHNpemU7Ci0JaW50IHJjID0gMDsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCi0JCQlhdWRpby0+d2FpdCwgKGF1ZGlvLT5pbl9jb3VudCA+IDApIHx8IGF1ZGlvLT5zdG9wcGVkCi0JCQl8fCAoYXVkaW8tPmluX2NhbGwgJiYgYXVkaW8tPnJ1bm5pbmcgJiYKLQkJCQkoYXVkaW8tPnZvaWNlX3N0YXRlID09IFZPSUNFX1NUQVRFX09GRkNBTEwpKSk7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQotCQlpZiAoIWF1ZGlvLT5pbl9jb3VudCkgewotCQkJaWYgKGF1ZGlvLT5zdG9wcGVkKSAgewotCQkJCXJjID0gMDsvKiBFbmQgb2YgRmlsZSAqLwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChhdWRpby0+aW5fY2FsbCAmJiBhdWRpby0+cnVubmluZyAmJgotCQkJCShhdWRpby0+dm9pY2Vfc3RhdGUgPT0gVk9JQ0VfU1RBVEVfT0ZGQ0FMTCkpIHsKLQkJCQlNTV9EQkcoIk5vdCBQZXJtaXR0ZWQgVm9pY2UgVGVybWluYXRlZFxuIik7Ci0JCQkJcmMgPSAtRVBFUk07IC8qIFZvaWNlIENhbGwgc3RvcHBlZCAqLwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaW5kZXggPSBhdWRpby0+aW5fdGFpbDsKLQkJZGF0YSA9ICh1aW50OF90ICopIGF1ZGlvLT5pbltpbmRleF0uZGF0YTsKLQkJc2l6ZSA9IGF1ZGlvLT5pbltpbmRleF0uc2l6ZTsKLQkJaWYgKGNvdW50ID49IHNpemUpIHsKLQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBkYXRhLCBzaXplKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJCWlmIChpbmRleCAhPSBhdWRpby0+aW5fdGFpbCkgewotCQkJCS8qIG92ZXJydW4gLS0gZGF0YSBpcwotCQkJCSAqIGludmFsaWQgYW5kIHdlIG5lZWQgdG8gcmV0cnkgKi8KLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9IDA7Ci0JCQlhdWRpby0+aW5fdGFpbCA9IChhdWRpby0+aW5fdGFpbCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCQkJYXVkaW8tPmluX2NvdW50LS07Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJCWNvdW50IC09IHNpemU7Ci0JCQlidWYgKz0gc2l6ZTsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigic2hvcnQgcmVhZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCi0JaWYgKGJ1ZiA+IHN0YXJ0KQotCQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGFtcm5iX2luX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCWNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCBhdWRhbXJuYl9pbl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlNTV9EQkcoIlxuIik7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGlvLT5pbl9jYWxsID0gMDsKLQkvKiB3aXRoIGRyYXcgZnJlcXVlbmN5IGZvciBzZXNzaW9uCi0JICAgaW5jYXNlIG5vdCBzdG9wcGVkIHRoZSBkcml2ZXIgKi8KLQltc21fc25kZGV2X3dpdGhkcmF3X2ZyZXEoYXVkaW8tPmVuY19pZCwgU05EREVWX0NBUF9UWCwKLQkJCQkJQVVEREVWX0NMTlRfRU5DKTsKLQlhdWRkZXZfdW5yZWdpc3Rlcl9ldnRfbGlzdG5lcihBVURERVZfQ0xOVF9FTkMsIGF1ZGlvLT5lbmNfaWQpOwotCS8qcmVzZXQgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSBpbmZvcm1hdGlvbiBhdCBhdWRwcmVwcm9jIGxheWVyKi8KLQlhdWRpby0+c2Vzc2lvbl9pbmZvLnNhbXBsaW5nX2ZyZXEgPSAwOwotCWF1ZHByZXByb2NfdXBkYXRlX2F1ZHJlY19pbmZvKCZhdWRpby0+c2Vzc2lvbl9pbmZvKTsKLQlhdWRhbXJuYl9pbl9kaXNhYmxlKGF1ZGlvKTsKLQlhdWRhbXJuYl9pbl9mbHVzaChhdWRpbyk7Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRyZWMpOwotCWF1ZHByZXByb2NfYWVuY19mcmVlKGF1ZGlvLT5lbmNfaWQpOwotCWF1ZGlvLT5hdWRyZWMgPSBOVUxMOwotCWF1ZGlvLT5vcGVuZWQgPSAwOwotCWlmIChhdWRpby0+ZGF0YSkgewotCQlpb25fdW5tYXBfa2VybmVsKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5idWZmX2hhbmRsZSk7Ci0JCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5idWZmX2hhbmRsZSk7Ci0JCWlvbl9jbGllbnRfZGVzdHJveShhdWRpby0+Y2xpZW50KTsKLQkJYXVkaW8tPmRhdGEgPSBOVUxMOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRhbXJuYl9pbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSAmdGhlX2F1ZGlvX2Ftcm5iX2luOwotCWludCByYzsKLQlpbnQgZW5jaWQ7Ci0JaW50IGxlbiA9IDA7Ci0JdW5zaWduZWQgbG9uZyBpb25mbGFnID0gMDsKLQlpb25fcGh5c19hZGRyX3QgYWRkciA9IDA7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCA9IE5VTEw7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JaWYgKGF1ZGlvLT5vcGVuZWQpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljbGllbnQgPSBtc21faW9uX2NsaWVudF9jcmVhdGUoVUlOVF9NQVgsICJBdWRpb19BTVJfSW5fQ2xpZW50Iik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGNsaWVudCkpIHsKLQkJTU1fRVJSKCJVbmFibGUgdG8gY3JlYXRlIElPTiBjbGllbnRcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gY2xpZW50X2NyZWF0ZV9lcnJvcjsKLQl9Ci0JYXVkaW8tPmNsaWVudCA9IGNsaWVudDsKLQotCWhhbmRsZSA9IGlvbl9hbGxvYyhjbGllbnQsIERNQVNaLCBTWl80SywKLQkJSU9OX0hFQVAoSU9OX0FVRElPX0hFQVBfSUQpLCAwKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoaGFuZGxlKSkgewotCQlNTV9FUlIoIlVuYWJsZSB0byBjcmVhdGUgYWxsb2NhdGUgTy9QIGJ1ZmZlcnNcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gYnVmZl9hbGxvY19lcnJvcjsKLQl9Ci0JYXVkaW8tPmJ1ZmZfaGFuZGxlID0gaGFuZGxlOwotCi0JcmMgPSBpb25fcGh5cyhjbGllbnQsIGhhbmRsZSwgJmFkZHIsICZsZW4pOwotCWlmIChyYykgewotCQlNTV9FUlIoIk8vUCBidWZmZXJzOkludmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCQlnb3RvIGJ1ZmZfZ2V0X3BoeXNfZXJyb3I7Ci0JfSBlbHNlIHsKLQkJTU1fSU5GTygiTy9QIGJ1ZmZlcnM6dmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCX0KLQlhdWRpby0+cGh5cyA9IChpbnQzMl90KWFkZHI7Ci0KLQlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKGNsaWVudCwgaGFuZGxlLCAmaW9uZmxhZyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiY291bGQgbm90IGdldCBmbGFncyBmb3IgdGhlIGhhbmRsZVxuIik7Ci0JCWdvdG8gYnVmZl9nZXRfZmxhZ3NfZXJyb3I7Ci0JfQotCi0JYXVkaW8tPm1hcF92X3JlYWQgPSBpb25fbWFwX2tlcm5lbChjbGllbnQsIGhhbmRsZSk7Ci0JaWYgKElTX0VSUihhdWRpby0+bWFwX3ZfcmVhZCkpIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgbWFwIHdyaXRlIGJ1ZmZlcnNcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gYnVmZl9tYXBfZXJyb3I7Ci0JfQotCWF1ZGlvLT5kYXRhID0gYXVkaW8tPm1hcF92X3JlYWQ7Ci0JTU1fREJHKCJ3cml0ZSBidWY6IHBoeSBhZGRyIDB4JTA4eCBrZXJuZWwgYWRkciAweCUwOHhcbiIsCi0JCWF1ZGlvLT5waHlzLCAoaW50KWF1ZGlvLT5kYXRhKTsKLQotCU1NX0RCRygiTWVtb3J5IGFkZHIgPSAweCU4eCAgcGh5IGFkZHIgPSAweCU4eFxuIixcCi0JCShpbnQpIGF1ZGlvLT5kYXRhLCAoaW50KSBhdWRpby0+cGh5cyk7Ci0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlyYyA9IC1FQUNDRVM7Ci0JCU1NX0VSUigiTm9uIHR1bm5lbCBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJZ290byBkb25lOwotCX0gZWxzZSBpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCQkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWF1ZGlvLT5tb2RlID0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUw7Ci0JCU1NX0RCRygiT3BlbmVkIGZvciB0dW5uZWwgbW9kZSBlbmNvZGluZ1xuIik7Ci0JfSBlbHNlIHsKLQkJcmMgPSAtRUFDQ0VTOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0KLQkvKiBTZXR0aW5ncyB3aWxsIGJlIHJlLWNvbmZpZyBhdCBBVURJT19TRVRfQ09ORklHLAotCSAqIGJ1dCBhdCBsZWFzdCB3ZSBuZWVkIHRvIGhhdmUgaW5pdGlhbCBjb25maWcKLQkgKi8KLQlhdWRpby0+YnVmZmVyX3NpemUgPSAoRlJBTUVfU0laRSAtIDgpOwotCWF1ZGlvLT5lbmNfdHlwZSA9IEVOQ19UWVBFX0FNUk5CIHwgYXVkaW8tPm1vZGU7Ci0JYXVkaW8tPmR0eF9tb2RlID0gLTE7Ci0JYXVkaW8tPmZyYW1lX2Zvcm1hdCA9IDA7Ci0JYXVkaW8tPnVzZWRfbW9kZSA9IDc7IC8qIEJpdCBSYXRlIDEyLjIga2JwcyBNUjEyMiAqLwotCi0JZW5jaWQgPSBhdWRwcmVwcm9jX2FlbmNfYWxsb2MoYXVkaW8tPmVuY190eXBlLCAmYXVkaW8tPm1vZHVsZV9uYW1lLAotCQkJJmF1ZGlvLT5xdWV1ZV9pZHMpOwotCWlmIChlbmNpZCA8IDApIHsKLQkJTU1fRVJSKCJObyBmcmVlIGVuY29kZXIgYXZhaWxhYmxlXG4iKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGRvbmU7Ci0JfQotCWF1ZGlvLT5lbmNfaWQgPSBlbmNpZDsKLQotCXJjID0gbXNtX2Fkc3BfZ2V0KGF1ZGlvLT5tb2R1bGVfbmFtZSwgJmF1ZGlvLT5hdWRyZWMsCi0JCQkgICAmYXVkcmVjX2Ftcm5iX2Fkc3Bfb3BzLCBhdWRpbyk7Ci0KLQlpZiAocmMpIHsKLQkJYXVkcHJlcHJvY19hZW5jX2ZyZWUoYXVkaW8tPmVuY19pZCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JYXVkaW8tPnNvdXJjZSA9IDA7Ci0KLQlhdWRhbXJuYl9pbl9mbHVzaChhdWRpbyk7Ci0KLQlhdWRpby0+ZGV2aWNlX2V2ZW50cyA9IEFVRERFVl9FVlRfREVWX1JEWSB8IEFVRERFVl9FVlRfREVWX1JMUyB8Ci0JCQkJQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEc7Ci0KLQlhdWRpby0+dm9pY2Vfc3RhdGUgPSBtc21fZ2V0X3ZvaWNlX3N0YXRlKCk7Ci0JcmMgPSBhdWRkZXZfcmVnaXN0ZXJfZXZ0X2xpc3RuZXIoYXVkaW8tPmRldmljZV9ldmVudHMsCi0JCQkJCUFVRERFVl9DTE5UX0VOQywgYXVkaW8tPmVuY19pZCwKLQkJCQkJYW1ybmJfaW5fbGlzdGVuZXIsICh2b2lkICopIGF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJmYWlsZWQgdG8gcmVnaXN0ZXIgZGV2aWNlIGV2ZW50IGxpc3RlbmVyXG4iKTsKLQkJZ290byBldnRfZXJyb3I7Ci0JfQotCWF1ZGlvLT5idWlsZF9pZCA9IHNvY2luZm9fZ2V0X2J1aWxkX2lkKCk7Ci0JTU1fREJHKCJNb2RlbSBidWlsZCBpZCA9ICVzXG4iLCBhdWRpby0+YnVpbGRfaWQpOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0JYXVkaW8tPm9wZW5lZCA9IDE7Ci1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLWV2dF9lcnJvcjoKLQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHJlYyk7Ci0JYXVkcHJlcHJvY19hZW5jX2ZyZWUoYXVkaW8tPmVuY19pZCk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JaW9uX3VubWFwX2tlcm5lbChjbGllbnQsIGF1ZGlvLT5idWZmX2hhbmRsZSk7Ci1idWZmX21hcF9lcnJvcjoKLWJ1ZmZfZ2V0X3BoeXNfZXJyb3I6Ci1idWZmX2dldF9mbGFnc19lcnJvcjoKLQlpb25fZnJlZShjbGllbnQsIGF1ZGlvLT5idWZmX2hhbmRsZSk7Ci1idWZmX2FsbG9jX2Vycm9yOgotCWlvbl9jbGllbnRfZGVzdHJveShjbGllbnQpOwotY2xpZW50X2NyZWF0ZV9lcnJvcjoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2luX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGF1ZGFtcm5iX2luX29wZW4sCi0JLnJlbGVhc2UJPSBhdWRhbXJuYl9pbl9yZWxlYXNlLAotCS5yZWFkCQk9IGF1ZGFtcm5iX2luX3JlYWQsCi0JLndyaXRlCQk9IGF1ZGFtcm5iX2luX3dyaXRlLAotCS51bmxvY2tlZF9pb2N0bAk9IGF1ZGFtcm5iX2luX2lvY3RsLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fYW1ybmJfaW5fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX2Ftcm5iX2luIiwKLQkuZm9wcwk9ICZhdWRpb19pbl9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkYW1ybmJfaW5faW5pdCh2b2lkKQotewotCW11dGV4X2luaXQoJnRoZV9hdWRpb19hbXJuYl9pbi5sb2NrKTsKLQltdXRleF9pbml0KCZ0aGVfYXVkaW9fYW1ybmJfaW4ucmVhZF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmdGhlX2F1ZGlvX2Ftcm5iX2luLmRzcF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmdGhlX2F1ZGlvX2Ftcm5iX2luLmRldl9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfYXVkaW9fYW1ybmJfaW4ud2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdGhlX2F1ZGlvX2Ftcm5iX2luLndhaXRfZW5hYmxlKTsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fYW1ybmJfaW5fbWlzYyk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhdWRhbXJuYl9pbl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fYW1yd2IuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fYW1yd2IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3MDZjNy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2FtcndiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzI2ICswLDAgQEAKLS8qIGFtcndiIGF1ZGlvIGRlY29kZXIgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIEJhc2VkIG9uIHRoZSBtcDMgbmF0aXZlIGRyaXZlciBpbiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX21wMy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICoKLSAqIEFsbCBzb3VyY2UgY29kZSBpbiB0aGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGV4Y2VwdAotICogd2hlcmUgaW5kaWNhdGVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKLSAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGZpbmQgaXQgYXQgaHR0cDovL3d3dy5mc2Yub3JnCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9lYXJseXN1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1vcnlfYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdS5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXVfZG9tYWlucy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBwbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcGxheWNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRwbGF5bXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2Rldl9jdGwuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkcHAuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fbWVtdHlwZXMuaD4KLQotI2RlZmluZSBCVUZTWiA0MTEwIC8qIEhvbGQgbWluaW11bSA3MDBtcyB2b2ljZSBkYXRhIGFuZCAxNCBieXRlcyBvZiBtZXRhIGluKi8KLSNkZWZpbmUgRE1BU1ogKEJVRlNaICogMikKLQotI2RlZmluZSBBVURQTEFZX0lOVkFMSURfUkVBRF9QVFJfT0ZGU0VUCTB4RkZGRgotI2RlZmluZSBBVURERUNfREVDX0FNUldCIDExCi0KLSNkZWZpbmUgUENNX0JVRlNaX01JTiA4MjE2IC8qIDEwMG1zIHdvcnRoIG9mIGRhdGEgYW5kIDI0IGJ5dGVzIG9mIG1ldGEgb3V0Ki8KLSNkZWZpbmUgUENNX0JVRl9NQVhfQ09VTlQgNQkvKiBEU1Agb25seSBhY2NlcHRzIDUgYnVmZmVycyBhdCBtb3N0Ci0JCQkJICAgYnV0IHN1cHBvcnQgMiBidWZmZXJzIGN1cnJlbnRseSAqLwotI2RlZmluZSBST1VUSU5HX01PREVfRlRSVCAxCi0jZGVmaW5lIFJPVVRJTkdfTU9ERV9SVCAyCi0vKiBEZWNvZGVyIHN0YXR1cyByZWNlaXZlZCBmcm9tIEFVRFBQVEFTSyAqLwotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19TTEVFUAkwCi0jZGVmaW5lCSBBVURQUF9ERUNfU1RBVFVTX0lOSVQgIDEKLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfQ0ZHICAgMgotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19QTEFZICAzCi0KLSNkZWZpbmUgQVVEQU1SV0JfTUVUQUZJRUxEX01BU0sgMHhGRkZGMDAwMAotI2RlZmluZSBBVURBTVJXQl9FT1NfRkxHX09GRlNFVCAweDBBIC8qIE9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBidWZmZXIgKi8KLSNkZWZpbmUgQVVEQU1SV0JfRU9TX0ZMR19NQVNLIDB4MDEKLSNkZWZpbmUgQVVEQU1SV0JfRU9TX05PTkUgMHgwIC8qIE5vIEVPUyBkZXRlY3RlZCAqLwotI2RlZmluZSBBVURBTVJXQl9FT1NfU0VUIDB4MSAvKiBFT1Mgc2V0IGluIG1ldGEgZmllbGQgKi8KLQotI2RlZmluZSBBVURBTVJXQl9FVkVOVF9OVU0gMTAgLyogRGVmYXVsdCBudW1iZXIgb2YgcHJlLWFsbG9jYXRlZCBldmVudCBwa3RzICovCi0KLXN0cnVjdCBidWZmZXIgewotCXZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgc2l6ZTsKLQl1bnNpZ25lZCB1c2VkOwkJLyogSW5wdXQgdXNhZ2UgYWN0dWFsIERTUCBwcm9kdWNlZCBQQ00gc2l6ZSAgKi8KLQl1bnNpZ25lZCBhZGRyOwotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zejsgLypvbmx5IHVzZWZ1bCBmb3IgZGF0YSBoYXMgbWV0YSBmaWVsZCAqLwotfTsKLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdHJ1Y3QgYXVkYW1yd2Jfc3VzcGVuZF9jdGwgewotCXN0cnVjdCBlYXJseV9zdXNwZW5kIG5vZGU7Ci0Jc3RydWN0IGF1ZGlvICphdWRpbzsKLX07Ci0jZW5kaWYKLQotc3RydWN0IGF1ZGFtcndiX2V2ZW50ewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlpbnQgZXZlbnRfdHlwZTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotfTsKLQotc3RydWN0IGF1ZGlvIHsKLQlzdHJ1Y3QgYnVmZmVyIG91dFsyXTsKLQotCXNwaW5sb2NrX3QgZHNwX2xvY2s7Ci0KLQl1aW50OF90IG91dF9oZWFkOwotCXVpbnQ4X3Qgb3V0X3RhaWw7Ci0JdWludDhfdCBvdXRfbmVlZGVkOwkvKiBudW1iZXIgb2YgYnVmZmVycyB0aGUgZHNwIGlzIHdhaXRpbmcgZm9yICovCi0KLQlhdG9taWNfdCBvdXRfYnl0ZXM7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggd3JpdGVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3cml0ZV93YWl0OwotCi0JLyogSG9zdCBQQ00gc2VjdGlvbiAqLwotCXN0cnVjdCBidWZmZXIgaW5bUENNX0JVRl9NQVhfQ09VTlRdOwotCXN0cnVjdCBtdXRleCByZWFkX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF93YWl0OwkvKiBXYWl0IHF1ZXVlIGZvciByZWFkICovCi0JY2hhciAqcmVhZF9kYXRhOwkvKiBwb2ludGVyIHRvIHJlYWRlciBidWZmZXIgKi8KLQlpbnQzMl90IHJlYWRfcGh5czsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiByZWFkZXIgYnVmZmVyICovCi0JdWludDhfdCByZWFkX25leHQ7CS8qIGluZGV4IHRvIGlucHV0IGJ1ZmZlcnMgdG8gYmUgcmVhZCBuZXh0ICovCi0JdWludDhfdCBmaWxsX25leHQ7CS8qIGluZGV4IHRvIGJ1ZmZlciB0aGF0IERTUCBzaG91bGQgYmUgZmlsbGluZyAqLwotCXVpbnQ4X3QgcGNtX2J1Zl9jb3VudDsJLyogbnVtYmVyIG9mIHBjbSBidWZmZXIgYWxsb2NhdGVkICovCi0JLyogLS0tLSBFbmQgb2YgSG9zdCBQQ00gc2VjdGlvbiAqLwotCi0Jc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqYXVkcGxheTsKLQotCS8qIGNvbmZpZ3VyYXRpb24gdG8gdXNlIG9uIG5leHQgZW5hYmxlICovCi0JdWludDMyX3Qgb3V0X3NhbXBsZV9yYXRlOwotCXVpbnQzMl90IG91dF9jaGFubmVsX21vZGU7Ci0KLQkvKiBkYXRhIGFsbG9jYXRlZCBmb3IgdmFyaW91cyBidWZmZXJzICovCi0JY2hhciAqZGF0YTsKLQlpbnQzMl90IHBoeXM7IC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygd3JpdGUgYnVmZmVyICovCi0KLQl2b2lkICptYXBfdl9yZWFkOwotCXZvaWQgKm1hcF92X3dyaXRlOwotCi0JaW50IG1maWVsZDsgLyogbWV0YSBmaWVsZCBlbWJlZGRlZCBpbiBkYXRhICovCi0JaW50IHJmbHVzaDsgLyogUmVhZCAgZmx1c2ggKi8KLQlpbnQgd2ZsdXNoOyAvKiBXcml0ZSBmbHVzaCAqLwotCWludCBvcGVuZWQ7Ci0JaW50IGVuYWJsZWQ7Ci0JaW50IHJ1bm5pbmc7Ci0JaW50IHN0b3BwZWQ7CS8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQlpbnQgcGNtX2ZlZWRiYWNrOwotCWludCBidWZfcmVmcmVzaDsKLQlpbnQgdGVvczsgLyogdmFsaWQgb25seSBpZiB0dW5uZWwgbW9kZSAmIG5vIGRhdGEgbGVmdCBmb3IgZGVjb2RlciAqLwotCWVudW0gbXNtX2F1ZF9kZWNvZGVyX3N0YXRlIGRlY19zdGF0ZTsJLyogUmVwcmVzZW50cyBkZWNvZGVyIHN0YXRlICovCi0JaW50IHJlc2VydmVkOyAvKiBBIGJ5dGUgaXMgYmVpbmcgcmVzZXJ2ZWQgKi8KLQljaGFyIHJzdl9ieXRlOyAvKiBIYW5kbGUgb2RkIGxlbmd0aCB1c2VyIGRhdGEgKi8KLQotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIHF1ZXVlX2lkOwotCXVpbnQxNl90IGRlY19pZDsKLQl1aW50MzJfdCByZWFkX3B0cl9vZmZzZXQ7Ci0JaW50MTZfdCBzb3VyY2U7Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCXN0cnVjdCBhdWRhbXJ3Yl9zdXNwZW5kX2N0bCBzdXNwZW5kX2N0bDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotI2VuZGlmCi0KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9ldmVudF9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50X3F1ZXVlOwotCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3dhaXQ7Ci0Jc3BpbmxvY2tfdCBldmVudF9xdWV1ZV9sb2NrOwotCXN0cnVjdCBtdXRleCBnZXRfZXZlbnRfbG9jazsKLQlpbnQgZXZlbnRfYWJvcnQ7Ci0JLyogQVYgc3luYyBJbmZvICovCi0JaW50IGF2c3luY19mbGFnOyAgICAgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSBmZWVkYmFjayBmcm9tIERTUCAqLwotCXdhaXRfcXVldWVfaGVhZF90IGF2c3luY193YWl0Oy8qIFdhaXQgcXVldWUgZm9yIEFWIFN5bmMgTWVzc2FnZSAgICAgKi8KLQkvKiBmbGFncywgNDggYml0cyBzYW1wbGUvYnl0ZXMgY291bnRlciBwZXIgY2hhbm5lbCAqLwotCXVpbnQxNl90IGF2c3luY1tBVURQUF9BVlNZTkNfQ0hfQ09VTlQgKiBBVURQUF9BVlNZTkNfTlVNX1dPUkRTICsgMV07Ci0KLQl1aW50MzJfdCBkZXZpY2VfZXZlbnRzOwotCi0JaW50IGVxX2VuYWJsZTsKLQlpbnQgZXFfbmVlZHNfY29tbWl0OwotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfZXFhbGl6ZXIgZXE7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUgdm9sX3BhbjsKLX07Ci0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRhbXJ3Yl9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgbmVlZGVkKTsKLXN0YXRpYyB2b2lkIGF1ZGFtcndiX2NvbmZpZ19ob3N0cGNtKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkYW1yd2JfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRhbXJ3Yl9kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpOwotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdGF0aWMgdm9pZCBhdWRhbXJ3Yl9wb3N0X2V2ZW50KHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCB0eXBlLAotCQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkKTsKLSNlbmRpZgotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkYW1yd2JfZW5hYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCi0JaWYgKGF1ZGlvLT5lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWF1ZGlvLT5kZWNfc3RhdGUgPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORTsKLQlhdWRpby0+b3V0X3RhaWwgPSAwOwotCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQotCWlmIChtc21fYWRzcF9lbmFibGUoYXVkaW8tPmF1ZHBsYXkpKSB7Ci0JCU1NX0VSUigibXNtX2Fkc3BfZW5hYmxlKGF1ZHBsYXkpIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChhdWRwcF9lbmFibGUoYXVkaW8tPmRlY19pZCwgYXVkYW1yd2JfZHNwX2V2ZW50LCBhdWRpbykpIHsKLQkJTU1fRVJSKCJhdWRwcF9lbmFibGUoKSBmYWlsZWRcbiIpOwotCQltc21fYWRzcF9kaXNhYmxlKGF1ZGlvLT5hdWRwbGF5KTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWF1ZGlvLT5lbmFibGVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYW1yd2JfbGlzdG5lcih1MzIgZXZ0X2lkLCB1bmlvbiBhdWRkZXZfZXZ0X2RhdGEgKmV2dF9wYXlsb2FkLAotCQkJdm9pZCAqcHJpdmF0ZV9kYXRhKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSAoc3RydWN0IGF1ZGlvICopIHByaXZhdGVfZGF0YTsKLQlzd2l0Y2ggKGV2dF9pZCkgewotCWNhc2UgQVVEREVWX0VWVF9ERVZfUkRZOgotCQlNTV9EQkcoIkFVRERFVl9FVlRfREVWX1JEWVxuIik7Ci0JCWF1ZGlvLT5zb3VyY2UgfD0gKDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0JCWlmIChhdWRpby0+cnVubmluZyA9PSAxICYmIGF1ZGlvLT5lbmFibGVkID09IDEpCi0JCQlhdWRwcF9yb3V0ZV9zdHJlYW0oYXVkaW8tPmRlY19pZCwgYXVkaW8tPnNvdXJjZSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEREVWX0VWVF9ERVZfUkxTOgotCQlNTV9EQkcoIkFVRERFVl9FVlRfREVWX1JMU1xuIik7Ci0JCWF1ZGlvLT5zb3VyY2UgJj0gfigweDEgPDwgZXZ0X3BheWxvYWQtPnJvdXRpbmdfaWQpOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcgPT0gMSAmJiBhdWRpby0+ZW5hYmxlZCA9PSAxKQotCQkJYXVkcHBfcm91dGVfc3RyZWFtKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvLT5zb3VyY2UpOwotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEc6Ci0JCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IGV2dF9wYXlsb2FkLT5zZXNzaW9uX3ZvbDsKLQkJTU1fREJHKCJBVURERVZfRVZUX1NUUkVBTV9WT0xfQ0hHLCBzdHJlYW0gdm9sICVkXG4iLAotCQkJCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSk7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihhdWRpby0+ZGVjX2lkLCAmYXVkaW8tPnZvbF9wYW4sCi0JCQkJCVBPUFApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlNTV9FUlIoIkVSUk9SOndyb25nIGV2ZW50XG4iKTsKLQkJYnJlYWs7Ci0JfQotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkYW1yd2JfZGlzYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWludCByYyA9IDA7Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQlhdWRpby0+ZGVjX3N0YXRlID0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkU7Ci0JCWF1ZGRlY19kc3BfY29uZmlnKGF1ZGlvLCAwKTsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdCwKLQkJCQlhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoTVNNX0FVRF9ERUNPREVSX1dBSVRfTVMpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWVsc2UgaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX0NMT1NFKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlhdWRwcF9kaXNhYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvKTsKLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZHNwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgYXVkYW1yd2JfdXBkYXRlX3BjbV9idWZfZW50cnkoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJdWludDMyX3QgKnBheWxvYWQpCi17Ci0JdWludDhfdCBpbmRleDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGF1ZGlvLT5yZmx1c2gpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwYXlsb2FkWzFdOyBpbmRleCsrKSB7Ci0JCWlmIChhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uYWRkciA9PQotCQkgICAgcGF5bG9hZFsyICsgaW5kZXggKiAyXSkgewotCQkJTU1fREJHKCJhdWRhbXJ3Yl91cGRhdGVfcGNtX2J1Zl9lbnRyeTogXAotCQkJCWluWyVkXSByZWFkeVxuIiwgYXVkaW8tPmZpbGxfbmV4dCk7Ci0JCQlhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0udXNlZCA9Ci0JCQkgICAgcGF5bG9hZFszICsgaW5kZXggKiAyXTsKLQkJCWlmICgoKythdWRpby0+ZmlsbF9uZXh0KSA9PSBhdWRpby0+cGNtX2J1Zl9jb3VudCkKLQkJCQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLQotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJleHBlY3RlZD0leCByZXQ9JXhcbiIsCi0JCQkJYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHIsCi0JCQkJcGF5bG9hZFsxICsgaW5kZXggKiAyXSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnVzZWQgPT0gMCkgewotCQlhdWRhbXJ3Yl9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JfSBlbHNlIHsKLQkJTU1fREJHKCJhdWRhbXJ3Yl91cGRhdGVfcGNtX2J1Zl9lbnRyeTogXAotCQkJCXJlYWQgY2Fubm90IGtlZXAgdXBcbiIpOwotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAxOwotCX0KLQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGxheV9kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgICB2b2lkICgqZ2V0ZXZlbnQpICh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBkYXRhOwotCXVpbnQzMl90IG1zZ1syOF07Ci0JZ2V0ZXZlbnQobXNnLCBzaXplb2YobXNnKSk7Ci0KLQlNTV9EQkcoImF1ZHBsYXlfZHNwX2V2ZW50OiBtc2dfaWQ9JXhcbiIsIGlkKTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBMQVlfTVNHX0RFQ19ORUVEU19EQVRBOgotCQlhdWRhbXJ3Yl9zZW5kX2RhdGEoYXVkaW8sIDEpOwotCQlicmVhazsKLQotCWNhc2UgQVVEUExBWV9NU0dfQlVGRkVSX1VQREFURToKLQkJYXVkYW1yd2JfdXBkYXRlX3BjbV9idWZfZW50cnkoYXVkaW8sIG1zZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBRFNQX01FU1NBR0VfSUQ6Ci0JCU1NX0RCRygiUmVjZWl2ZWQgQURTUCBldmVudDptb2R1bGUgYXVkcGxheXRhc2tcbiIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCU1NX0RCRygidW5leHBlY3RlZCBtZXNzYWdlIGZyb20gZGVjb2RlclxuIik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhdWRhbXJ3Yl9kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IHByaXZhdGU7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQUF9NU0dfU1RBVFVTX01TRzp7Ci0JCQl1bnNpZ25lZCBzdGF0dXMgPSBtc2dbMV07Ci0KLQkJCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfU0xFRVA6IHsKLQkJCQl1aW50MTZfdCByZWFzb24gPSBtc2dbMl07Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czpzbGVlcCByZWFzb249MHglMDR4XG4iLAotCQkJCQlyZWFzb24pOwotCQkJCWlmICgocmVhc29uID09IEFVRFBQX01TR19SRUFTT05fTUVNKQotCQkJCQl8fCAocmVhc29uID09Ci0JCQkJCUFVRFBQX01TR19SRUFTT05fTk9ERUNPREVSKSkgewotCQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9GQUlMVVJFOwotCQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJfSBlbHNlIGlmIChyZWFzb24gPT0gQVVEUFBfTVNHX1JFQVNPTl9OT05FKSB7Ci0JCQkJCS8qIGRlY29kZXIgaXMgaW4gZGlzYWJsZSBzdGF0ZSAqLwotCQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19JTklUOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IGluaXRcbiIpOwotCQkJCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQkJCQlhdWRwcF9jbWRfY2ZnX3JvdXRpbmdfbW9kZShhdWRpbyk7Ci0JCQkJZWxzZQotCQkJCQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKGF1ZGlvKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX0NGRzoKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBjZmdcbiIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX1BMQVk6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogcGxheVxuIik7Ci0JCQkJLyogc2VuZCAgbWl4ZXIgY29tbWFuZCAqLwotCQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLAotCQkJCQkJYXVkaW8tPnNvdXJjZSk7Ci0JCQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJCQkJYXVkYW1yd2JfY29uZmlnX2hvc3RwY20oYXVkaW8pOwotCQkJCQlhdWRhbXJ3Yl9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JCQkJfQotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfU1VDQ0VTUzsKLQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCU1NX0RCRygidW5rbm93biBkZWNvZGVyIHN0YXR1c1xuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVEUFBfTVNHX0NGR19NU0c6Ci0JCWlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9FTkEpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBFTkFCTEVcbiIpOwotCQkJYXVkZGVjX2RzcF9jb25maWcoYXVkaW8sIDEpOwotCQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAxOwotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsCWF1ZGlvLT5lcV9lbmFibGUsCi0JCQkJCSZhdWRpby0+ZXEsIFBPUFApOwotCQl9IGVsc2UgaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0RJUykgewotCQkJTU1fREJHKCJDRkdfTVNHIERJU0FCTEVcbiIpOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAwOwotCQl9IGVsc2UgewotCQkJTU1fREJHKCJDRkdfTVNHICVkP1xuIiwgbXNnWzBdKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRFBQX01TR19ST1VUSU5HX0FDSzoKLQkJTU1fREJHKCJST1VUSU5HX0FDSyBtb2RlPSVkXG4iLCBtc2dbMV0pOwotCQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfRkxVU0hfQUNLOgotCQlNTV9EQkcoIkZMVVNIX0FDS1xuIik7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJCWF1ZGFtcndiX2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfUENNRE1BTUlTU0VEOgotCQlNTV9EQkcoIlBDTURNQU1JU1NFRFxuIik7Ci0JCWF1ZGlvLT50ZW9zID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlicmVhazsKLQotCWNhc2UgQVVEUFBfTVNHX0FWU1lOQ19NU0c6Ci0JCU1NX0RCRygiQVVEUFBfTVNHX0FWU1lOQ19NU0dcbiIpOwotCQltZW1jcHkoJmF1ZGlvLT5hdnN5bmNbMF0sIG1zZywgc2l6ZW9mKGF1ZGlvLT5hdnN5bmMpKTsKLQkJYXVkaW8tPmF2c3luY19mbGFnID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPmF2c3luY193YWl0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlNTV9EQkcoIlVOS05PV04gKCVkKVxuIiwgaWQpOwotCX0KLQotfQotCi1zdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHBsYXlfYWRzcF9vcHNfYW1yd2IgPSB7Ci0JLmV2ZW50ID0gYXVkcGxheV9kc3BfZXZlbnQsCi19OwotCi0jZGVmaW5lIGF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHBsYXksIGF1ZGlvLT5xdWV1ZV9pZCwgXAotCQkJY21kLCBsZW4pCi0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19kZWNfdHlwZSBjZmdfZGVjX2NtZDsKLQotCW1lbXNldCgmY2ZnX2RlY19jbWQsIDAsIHNpemVvZihjZmdfZGVjX2NtZCkpOwotCi0JY2ZnX2RlY19jbWQuY21kX2lkID0gQVVEUFBfQ01EX0NGR19ERUNfVFlQRTsKLQlpZiAoZW5hYmxlKQotCQljZmdfZGVjX2NtZC5kZWNfY2ZnID0gQVVEUFBfQ01EX1VQREFUREVfQ0ZHX0RFQyB8Ci0JCQkJQVVEUFBfQ01EX0VOQV9ERUNfViB8IEFVRERFQ19ERUNfQU1SV0I7Ci0JZWxzZQotCQljZmdfZGVjX2NtZC5kZWNfY2ZnID0gQVVEUFBfQ01EX1VQREFUREVfQ0ZHX0RFQyB8Ci0JCQkJQVVEUFBfQ01EX0RJU19ERUNfVjsKLQljZmdfZGVjX2NtZC5kbV9tb2RlID0gMHgwOwotCWNmZ19kZWNfY21kLnN0cmVhbV9pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUxKCZjZmdfZGVjX2NtZCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19hbXJ3YiBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jb21tb24uY21kX2lkID0gQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNUzsKLQljbWQuY29tbW9uLmxlbmd0aCA9IEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVNfQU1SV0JfTEVOOwotCWNtZC5jb21tb24uZGVjX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuY29tbW9uLmlucHV0X3NhbXBsaW5nX2ZyZXF1ZW5jeSA9IGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGU7Ci0JY21kLnN0ZXJlb19jZmcgPSBhdWRpby0+b3V0X2NoYW5uZWxfbW9kZTsKLQlhdWRwcF9zZW5kX3F1ZXVlMigmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9yb3V0aW5nX21vZGUgY21kOwotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUFBfQ01EX1JPVVRJTkdfTU9ERTsKLQljbWQub2JqZWN0X251bWJlciA9IGF1ZGlvLT5kZWNfaWQ7Ci0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfRlRSVDsKLQllbHNlCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfUlQ7Ci0KLQlhdWRwcF9zZW5kX3F1ZXVlMSgmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcGxheV9kc3Bfc2VuZF9kYXRhX2F2YWlsKHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCQkJICAgICAgIHVuc2lnbmVkIGlkeCwgdW5zaWduZWQgbGVuKQotewotCXN0cnVjdCBhdWRwbGF5X2NtZF9iaXRzdHJlYW1fZGF0YV9hdmFpbF9udDIgY21kOwotCi0JY21kLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0JJVFNUUkVBTV9EQVRBX0FWQUlMX05UMjsKLQlpZiAoYXVkaW8tPm1maWVsZCkKLQkJY21kLmRlY29kZXJfaWQgPSBBVURBTVJXQl9NRVRBRklFTERfTUFTSyB8Ci0JCQkoYXVkaW8tPm91dFtpZHhdLm1maWVsZF9zeiA+PiAxKTsKLQllbHNlCi0JCWNtZC5kZWNvZGVyX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuYnVmX3B0ciA9IGF1ZGlvLT5vdXRbaWR4XS5hZGRyOwotCWNtZC5idWZfc2l6ZSA9IGxlbiAvIDI7Ci0JY21kLnBhcnRpdGlvbl9udW1iZXIgPSAwOwotCXJldHVybiBhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGFtcndiX2J1ZmZlcl9yZWZyZXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2J1ZmZlcl9yZWZyZXNoIHJlZnJlc2hfY21kOwotCi0JcmVmcmVzaF9jbWQuY21kX2lkID0gQVVEUExBWV9DTURfQlVGRkVSX1JFRlJFU0g7Ci0JcmVmcmVzaF9jbWQubnVtX2J1ZmZlcnMgPSAxOwotCXJlZnJlc2hfY21kLmJ1ZjBfYWRkcmVzcyA9IGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyOwotCXJlZnJlc2hfY21kLmJ1ZjBfbGVuZ3RoID0gYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnNpemU7Ci0JcmVmcmVzaF9jbWQuYnVmX3JlYWRfY291bnQgPSAwOwotCU1NX0RCRygiYnVmMF9hZGRyPSV4IGJ1ZjBfbGVuPSVkXG4iLCByZWZyZXNoX2NtZC5idWYwX2FkZHJlc3MsCi0JCQlyZWZyZXNoX2NtZC5idWYwX2xlbmd0aCk7Ci0JKHZvaWQpYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJnJlZnJlc2hfY21kLCBzaXplb2YocmVmcmVzaF9jbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkYW1yd2JfY29uZmlnX2hvc3RwY20oc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfaHBjbV9idWZfY2ZnIGNmZ19jbWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWNmZ19jbWQuY21kX2lkID0gQVVEUExBWV9DTURfSFBDTV9CVUZfQ0ZHOwotCWNmZ19jbWQubWF4X2J1ZmZlcnMgPSBhdWRpby0+cGNtX2J1Zl9jb3VudDsKLQljZmdfY21kLmJ5dGVfc3dhcCA9IDA7Ci0JY2ZnX2NtZC5ob3N0cGNtX2NvbmZpZyA9ICgweDgwMDApIHwgKDB4NDAwMCk7Ci0JY2ZnX2NtZC5mZWVkYmFja19mcmVxdWVuY3kgPSAxOwotCWNmZ19jbWQucGFydGl0aW9uX251bWJlciA9IDA7Ci0JKHZvaWQpYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJmNmZ19jbWQsIHNpemVvZihjZmdfY21kKSk7Ci0KLX0KLQotc3RhdGljIHZvaWQgYXVkYW1yd2Jfc2VuZF9kYXRhKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVuc2lnbmVkIG5lZWRlZCkKLXsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWlmICghYXVkaW8tPnJ1bm5pbmcpCi0JCWdvdG8gZG9uZTsKLQotCWlmIChuZWVkZWQgJiYgIWF1ZGlvLT53Zmx1c2gpIHsKLQkJLyogV2Ugd2VyZSBjYWxsZWQgZnJvbSB0aGUgY2FsbGJhY2sgYmVjYXVzZSB0aGUgRFNQCi0JCSAqIHJlcXVlc3RlZCBtb3JlIGRhdGEuICBOb3RlIHRoYXQgdGhlIERTUCBkb2VzIHdhbnQKLQkJICogbW9yZSBkYXRhLCBhbmQgaWYgYSBidWZmZXIgd2FzIGluLWZsaWdodCwgbWFyayBpdAotCQkgKiBhcyBhdmFpbGFibGUgKHNpbmNlIHRoZSBEU1AgbXVzdCBub3cgYmUgZG9uZSB3aXRoCi0JCSAqIGl0KS4KLQkJICovCi0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZikgewotCQkJZnJhbWUtPnVzZWQgPSAwOwotCQkJYXVkaW8tPm91dF90YWlsIF49IDE7Ci0JCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCX0KLQl9Ci0KLQlpZiAoYXVkaW8tPm91dF9uZWVkZWQpIHsKLQkJLyogSWYgdGhlIERTUCBjdXJyZW50bHkgd2FudHMgZGF0YSBhbmQgd2UgaGF2ZSBhCi0JCSAqIGJ1ZmZlciBhdmFpbGFibGUsIHdlIHdpbGwgc2VuZCBpdCBhbmQgcmVzZXQKLQkJICogdGhlIG5lZWRlZCBmbGFnLiAgV2UnbGwgbWFyayB0aGUgYnVmZmVyIGFzIGluLWZsaWdodAotCQkgKiBzbyB0aGF0IGl0IHdvbid0IGJlIHJlY3ljbGVkIHVudGlsIHRoZSBuZXh0IGJ1ZmZlcgotCQkgKiBpcyByZXF1ZXN0ZWQKLQkJICovCi0KLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQpIHsKLQkJCUJVR19PTihmcmFtZS0+dXNlZCA9PSAweGZmZmZmZmZmKTsKLQkJCU1NX0RCRygiZnJhbWUgJWQgYnVzeVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJCWF1ZHBsYXlfZHNwX3NlbmRfZGF0YV9hdmFpbChhdWRpbywgYXVkaW8tPm91dF90YWlsLAotCQkJCQkJICAgIGZyYW1lLT51c2VkKTsKLQkJCWZyYW1lLT51c2VkID0gMHhmZmZmZmZmZjsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJfQotCX0KLSBkb25lOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHZvaWQgYXVkYW1yd2JfZmx1c2goc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlhdWRpby0+b3V0WzBdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRbMV0udXNlZCA9IDA7Ci0JYXVkaW8tPm91dF9oZWFkID0gMDsKLQlhdWRpby0+b3V0X3RhaWwgPSAwOwotCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCWF0b21pY19zZXQoJmF1ZGlvLT5vdXRfYnl0ZXMsIDApOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhbXJ3Yl9mbHVzaF9wY21fYnVmKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdWludDhfdCBpbmRleDsKLQotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFBDTV9CVUZfTUFYX0NPVU5UOyBpbmRleCsrKQotCQlhdWRpby0+aW5baW5kZXhdLnVzZWQgPSAwOwotCi0JYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLX0KLQotc3RhdGljIHZvaWQgYXVkYW1yd2JfaW9wb3J0X3Jlc2V0KHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JLyogTWFrZSBzdXJlIHJlYWQvd3JpdGUgdGhyZWFkIGFyZSBmcmVlIGZyb20KLQkgKiBzbGVlcCBhbmQga25vd2luZyB0aGF0IHN5c3RlbSBpcyBub3QgYWJsZQotCSAqIHRvIHByb2Nlc3MgaW8gcmVxdWVzdCBhdCB0aGUgbW9tZW50Ci0JICovCi0Jd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlhdWRhbXJ3Yl9mbHVzaChhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JYXVkYW1yd2JfZmx1c2hfcGNtX2J1ZihhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAxOwotCXdha2VfdXAoJmF1ZGlvLT5hdnN5bmNfd2FpdCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkYW1yd2JfZXZlbnRzX3BlbmRpbmcoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlbXB0eTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWVtcHR5ID0gIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gZW1wdHkgfHwgYXVkaW8tPmV2ZW50X2Fib3J0OwotfQotCi1zdGF0aWMgdm9pZCBhdWRhbXJ3Yl9yZXNldF9ldmVudF9xdWV1ZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGF1ZGFtcndiX2V2ZW50ICpkcnZfZXZ0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZGFtcndiX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkYW1yd2JfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgbG9uZyBhdWRhbXJ3Yl9wcm9jZXNzX2V2ZW50X3JlcShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB2b2lkIF9fdXNlciAqYXJnKQotewotCWxvbmcgcmM7Ci0Jc3RydWN0IG1zbV9hdWRpb19ldmVudCB1c3JfZXZ0OwotCXN0cnVjdCBhdWRhbXJ3Yl9ldmVudCAqZHJ2X2V2dCA9IE5VTEw7Ci0JaW50IHRpbWVvdXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmdXNyX2V2dCwgYXJnLCBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19ldmVudCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXRpbWVvdXQgPSAoaW50KSB1c3JfZXZ0LnRpbWVvdXRfbXM7Ci0KLQlpZiAodGltZW91dCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCgKLQkJCWF1ZGlvLT5ldmVudF93YWl0LCBhdWRhbXJ3Yl9ldmVudHNfcGVuZGluZyhhdWRpbyksCi0JCQltc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9IGVsc2UgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCWF1ZGlvLT5ldmVudF93YWl0LCBhdWRhbXJ3Yl9ldmVudHNfcGVuZGluZyhhdWRpbykpOwotCX0KLQotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCWlmIChhdWRpby0+ZXZlbnRfYWJvcnQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMDsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcmMgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+ZXZlbnRfcXVldWUpKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZGFtcndiX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCX0KLQotCWlmIChkcnZfZXZ0KSB7Ci0JCXVzcl9ldnQuZXZlbnRfdHlwZSA9IGRydl9ldnQtPmV2ZW50X3R5cGU7Ci0JCXVzcl9ldnQuZXZlbnRfcGF5bG9hZCA9IGRydl9ldnQtPnBheWxvYWQ7Ci0JCWxpc3RfYWRkX3RhaWwoJmRydl9ldnQtPmxpc3QsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JfSBlbHNlCi0JCXJjID0gLTE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghcmMgJiYgY29weV90b191c2VyKGFyZywgJnVzcl9ldnQsIHNpemVvZih1c3JfZXZ0KSkpCi0JCXJjID0gLUVGQVVMVDsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19lbmFibGVfZXEoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlpZiAoYXVkaW8tPmVxX2VuYWJsZSA9PSBlbmFibGUgJiYgIWF1ZGlvLT5lcV9uZWVkc19jb21taXQpCi0JCXJldHVybiAwOwotCi0JYXVkaW8tPmVxX2VuYWJsZSA9IGVuYWJsZTsKLQotCWlmIChhdWRpby0+cnVubmluZykgewotCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsIGVuYWJsZSwgJmF1ZGlvLT5lcSwgUE9QUCk7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19nZXRfYXZzeW5jX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJCQkJCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgKnN0YXRzKQotewotCWludCByYyA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAoYXVkaW8tPmRlY19pZCA9PSBhdWRpby0+YXZzeW5jWzBdICYmIGF1ZGlvLT5hdnN5bmNfZmxhZykgewotCQkvKiBhdl9zeW5jIHNhbXBsZSBjb3VudCAqLwotCQlzdGF0cy0+c2FtcGxlX2NvdW50ID0gKGF1ZGlvLT5hdnN5bmNbMl0gPDwgMTYpIHwKLQkJCQkJCShhdWRpby0+YXZzeW5jWzNdKTsKLQotCQkvKiBhdl9zeW5jIGJ5dGVfY291bnQgKi8KLQkJc3RhdHMtPmJ5dGVfY291bnQgPSAoYXVkaW8tPmF2c3luY1s1XSA8PCAxNikgfAotCQkJCQkJKGF1ZGlvLT5hdnN5bmNbNl0pOwotCi0JCWF1ZGlvLT5hdnN5bmNfZmxhZyA9IDA7Ci0JCXJjID0gMDsKLQl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiByYzsKLQotfQotCi1zdGF0aWMgbG9uZyBhdWRhbXJ3Yl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXVpbnQxNl90IGVuYWJsZV9tYXNrOwotCWludCBlbmFibGU7Ci0JaW50IHByZXZfc3RhdGU7Ci0KLQlNTV9EQkcoImNtZCA9ICVkXG4iLCBjbWQpOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfU1RBVFMpIHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyBzdGF0czsKLQotCQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAwOwotCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKLQkJaWYgKGF1ZHBwX3F1ZXJ5X2F2c3luYyhhdWRpby0+ZGVjX2lkKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+YXZzeW5jX3dhaXQsCi0JCQkJKGF1ZGlvLT5hdnN5bmNfZmxhZyA9PSAxKSwKLQkJCQltc2Vjc190b19qaWZmaWVzKEFVRFBQX0FWU1lOQ19FVkVOVF9USU1FT1VUKSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJZWxzZSBpZiAoKHJjID4gMCkgfHwgKChyYyA9PSAwKSAmJiAoYXVkaW8tPmF2c3luY19mbGFnID09IDEpKSkgewotCQkJaWYgKGF1ZGlvX2dldF9hdnN5bmNfZGF0YShhdWRpbywgJnN0YXRzKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0VOQUJMRV9BVURQUDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZlbmFibGVfbWFzaywgKHZvaWQgKikgYXJnLAotCQkJCQkJc2l6ZW9mKGVuYWJsZV9tYXNrKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQllbmFibGUgPSAoZW5hYmxlX21hc2sgJiBFUV9FTkFCTEUpID8gMSA6IDA7Ci0JCWF1ZGlvX2VuYWJsZV9lcShhdWRpbywgZW5hYmxlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfUEFOOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnBhbiA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfRVE6Ci0JCXByZXZfc3RhdGUgPSBhdWRpby0+ZXFfZW5hYmxlOwotCQlhdWRpby0+ZXFfZW5hYmxlID0gMDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhdWRpby0+ZXEubnVtX2JhbmRzLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGF1ZGlvLT5lcSkgLQotCQkJCShBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfQ09NTU9OX0xFTiArIDIpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPmVxX2VuYWJsZSA9IHByZXZfc3RhdGU7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAxOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCWlmICgtRUlOVkFMICE9IHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9FVkVOVCkgewotCQlNTV9EQkcoIkFVRElPX0dFVF9FVkVOVFxuIik7Ci0JCWlmIChtdXRleF90cnlsb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spKSB7Ci0JCQlyYyA9IGF1ZGFtcndiX3Byb2Nlc3NfZXZlbnRfcmVxKGF1ZGlvLAotCQkJCQkodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQkJfSBlbHNlCi0JCQlyYyA9IC1FQlVTWTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmIChjbWQgPT0gQVVESU9fQUJPUlRfR0VUX0VWRU5UKSB7Ci0JCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDoKLQkJTU1fREJHKCJBVURJT19TVEFSVFxuIik7Ci0JCXJjID0gYXVkYW1yd2JfZW5hYmxlKGF1ZGlvKTsKLQkJaWYgKCFyYykgewotCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdCwKLQkJCQlhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoTVNNX0FVRF9ERUNPREVSX1dBSVRfTVMpKTsKLQkJCU1NX0lORk8oImRlY19zdGF0ZSAlZCByYyA9ICVkXG4iLCBhdWRpby0+ZGVjX3N0YXRlLCByYyk7Ci0KLQkJCWlmIChhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9TVUNDRVNTKQotCQkJCXJjID0gLUVOT0RFVjsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TVE9QOgotCQlNTV9EQkcoIkFVRElPX1NUT1BcbiIpOwotCQlyYyA9IGF1ZGFtcndiX2Rpc2FibGUoYXVkaW8pOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCWF1ZGFtcndiX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19GTFVTSDoKLQkJTU1fREJHKCJBVURJT19GTFVTSFxuIik7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAxOwotCQlhdWRpby0+d2ZsdXNoID0gMTsKLQkJYXVkYW1yd2JfaW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCQlhdWRwcF9mbHVzaChhdWRpby0+ZGVjX2lkKTsKLQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCSFhdWRpby0+d2ZsdXNoKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlNTV9FUlIoIkFVRElPX0ZMVVNIIGludGVycnVwdGVkXG4iKTsKLQkJCQlyYyA9IC1FSU5UUjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcgotCQkJICAgICgmY29uZmlnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGNvbmZpZy5jaGFubmVsX2NvdW50ID09IDEpCi0JCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPQotCQkJCQlBVURQUF9DTURfUENNX0lOVEZfTU9OT19WOwotCQkJZWxzZSBpZiAoY29uZmlnLmNoYW5uZWxfY291bnQgPT0gMikKLQkJCQljb25maWcuY2hhbm5lbF9jb3VudCA9Ci0JCQkJCUFVRFBQX0NNRF9QQ01fSU5URl9TVEVSRU9fVjsKLQkJCWVsc2UKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQlhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9IGNvbmZpZy5jaGFubmVsX2NvdW50OwotCQkJYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLQkJCWF1ZGlvLT5tZmllbGQgPSBjb25maWcubWV0YV9maWVsZDsKLQkJCXJjID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19HRVRfQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IEJVRlNaOwotCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IDI7Ci0JCQljb25maWcuc2FtcGxlX3JhdGUgPSBhdWRpby0+b3V0X3NhbXBsZV9yYXRlOwotCQkJaWYgKGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID09Ci0JCQkJCUFVRFBQX0NNRF9QQ01fSU5URl9NT05PX1YpCi0JCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSAxOwotCQkJZWxzZQotCQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gMjsKLQkJCWNvbmZpZy5tZXRhX2ZpZWxkID0gMDsKLQkJCWNvbmZpZy51bnVzZWRbMF0gPSAwOwotCQkJY29uZmlnLnVudXNlZFsxXSA9IDA7Ci0JCQljb25maWcudW51c2VkWzJdID0gMDsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjb25maWcsCi0JCQkJCSBzaXplb2YoY29uZmlnKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX0dFVF9QQ01fQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fcGNtX2NvbmZpZyBjb25maWc7Ci0JCQljb25maWcucGNtX2ZlZWRiYWNrID0gMDsKLQkJCWNvbmZpZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX01BWF9DT1VOVDsKLQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY29uZmlnLAotCQkJCQkgc2l6ZW9mKGNvbmZpZykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fU0VUX1BDTV9DT05GSUc6ewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3BjbV9jb25maWcgY29uZmlnOwotCQlpZiAoY29weV9mcm9tX3VzZXIKLQkJICAgICgmY29uZmlnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoKGNvbmZpZy5idWZmZXJfY291bnQgPiBQQ01fQlVGX01BWF9DT1VOVCkgfHwKLQkJICAgIChjb25maWcuYnVmZmVyX2NvdW50ID09IDEpKQotCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfTUFYX0NPVU5UOwotCi0JCWlmIChjb25maWcuYnVmZmVyX3NpemUgPCBQQ01fQlVGU1pfTUlOKQotCQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKLQotCQkJLyogQ2hlY2sgaWYgcGNtIGZlZWRiYWNrIGlzIHJlcXVpcmVkICovCi0JCWlmICgoY29uZmlnLnBjbV9mZWVkYmFjaykgJiYgKCFhdWRpby0+cmVhZF9kYXRhKSkgewotCQkJTU1fREJHKCJhbGxvY2F0ZSBQQ00gYnVmICVkXG4iLCBjb25maWcuYnVmZmVyX2NvdW50ICoKLQkJCQkJY29uZmlnLmJ1ZmZlcl9zaXplKTsKLQkJCWF1ZGlvLT5yZWFkX3BoeXMgPSBhbGxvY2F0ZV9jb250aWd1b3VzX2ViaV9ub21hcCgKLQkJCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSAqCi0JCQkJCQljb25maWcuYnVmZmVyX2NvdW50LAotCQkJCQkJU1pfNEspOwotCQkJaWYgKCFhdWRpby0+cmVhZF9waHlzKSB7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlhdWRpby0+bWFwX3ZfcmVhZCA9IGlvcmVtYXAoCi0JCQkJCQlhdWRpby0+cmVhZF9waHlzLAotCQkJCQkJY29uZmlnLmJ1ZmZlcl9zaXplICoKLQkJCQkJCWNvbmZpZy5idWZmZXJfY291bnQpOwotCQkJaWYgKElTX0VSUihhdWRpby0+bWFwX3ZfcmVhZCkpIHsKLQkJCQlNTV9FUlIoIkVycm9yIGNvdWxkIG5vdCBtYXAgcmVhZCIKLQkJCQkJCQkiIHBoeXMgYWRkcmVzc1xuIik7Ci0JCQkJcmMgPSAtRU5PTUVNOwotCQkJCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoCi0JCQkJCQkJYXVkaW8tPnJlYWRfcGh5cyk7Ci0JCQl9IGVsc2UgewotCQkJCXVpbnQ4X3QgaW5kZXg7Ci0JCQkJdWludDMyX3Qgb2Zmc2V0ID0gMDsKLQkJCQlhdWRpby0+cmVhZF9kYXRhID0gYXVkaW8tPm1hcF92X3JlYWQ7Ci0JCQkJYXVkaW8tPnBjbV9mZWVkYmFjayA9IDE7Ci0JCQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQkJCQlhdWRpby0+cGNtX2J1Zl9jb3VudCA9Ci0JCQkJCWNvbmZpZy5idWZmZXJfY291bnQ7Ci0JCQkJYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JCQkJYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0KLQkJCQlmb3IgKGluZGV4ID0gMDsKLQkJCQlpbmRleCA8IGNvbmZpZy5idWZmZXJfY291bnQ7IGluZGV4KyspIHsKLQkJCQkJYXVkaW8tPmluW2luZGV4XS5kYXRhID0KLQkJCQkJCWF1ZGlvLT5yZWFkX2RhdGEgKyBvZmZzZXQ7Ci0JCQkJCWF1ZGlvLT5pbltpbmRleF0uYWRkciA9Ci0JCQkJCSAgICBhdWRpby0+cmVhZF9waHlzICsgb2Zmc2V0OwotCQkJCQlhdWRpby0+aW5baW5kZXhdLnNpemUgPQotCQkJCQkgICAgY29uZmlnLmJ1ZmZlcl9zaXplOwotCQkJCQlhdWRpby0+aW5baW5kZXhdLnVzZWQgPSAwOwotCQkJCQlvZmZzZXQgKz0gY29uZmlnLmJ1ZmZlcl9zaXplOwotCQkJCX0KLQkJCQlNTV9EQkcoInJlYWQgYnVmOiBwaHkgYWRkciAweCUwOHggXAotCQkJCQkJa2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQkJCQkJYXVkaW8tPnJlYWRfcGh5cywKLQkJCQkJCShpbnQpYXVkaW8tPnJlYWRfZGF0YSk7Ci0JCQkJcmMgPSAwOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmMgPSAwOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9TRVNTSU9OX0lEOgotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmF1ZGlvLT5kZWNfaWQsCi0JCQkJCXNpemVvZih1bnNpZ25lZCBzaG9ydCkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKiBPbmx5IHVzZWZ1bCBpbiB0dW5uZWwtbW9kZSAqLwotc3RhdGljIGludCBhdWRhbXJ3Yl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHBwb3MxLCBsb2ZmX3QgcHBvczIsIGludCBkYXRhc3luYykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCi0JaWYgKCFhdWRpby0+cnVubmluZyB8fCBhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lX25vbG9jazsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKCFhdWRpby0+b3V0WzBdLnVzZWQgJiYKLQkJIWF1ZGlvLT5vdXRbMV0udXNlZCAmJgotCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChhdWRpby0+cmVzZXJ2ZWQpIHsKLQkJTU1fREJHKCJzZW5kIHJlc2VydmVkIGJ5dGVcbiIpOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMF0gPSBhdWRpby0+cnN2X2J5dGU7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMV0gPSAwOwotCQlmcmFtZS0+dXNlZCA9IDI7Ci0JCWF1ZGFtcndiX3NlbmRfZGF0YShhdWRpbywgMCk7Ci0KLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkoIWF1ZGlvLT5vdXRbMF0udXNlZCAmJgotCQkJIWF1ZGlvLT5vdXRbMV0udXNlZCAmJgotCQkJYXVkaW8tPm91dF9uZWVkZWQpIHx8IGF1ZGlvLT53Zmx1c2gpOwotCi0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGRvbmU7Ci0JCWVsc2UgaWYgKGF1ZGlvLT53Zmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCi0JLyogcGNtIGRtYW1pc3MgbWVzc2FnZSBpcyBzZW50IGNvbnRpbm91c2x5Ci0JICogd2hlbiBkZWNvZGVyIGlzIHN0YXJ2ZWQgc28gbm8gcmFjZQotCSAqIGNvbmRpdGlvbiBjb25jZXJuCi0JICovCi0JYXVkaW8tPnRlb3MgPSAwOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCWF1ZGlvLT50ZW9zIHx8IGF1ZGlvLT53Zmx1c2gpOwotCi0JaWYgKGF1ZGlvLT53Zmx1c2gpCi0JCXJjID0gLUVCVVNZOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotZG9uZV9ub2xvY2s6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRhbXJ3Yl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCi0JCQkgIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCWludCByYyA9IDA7Ci0KLQlpZiAoIWF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCXJldHVybiAwOyAvKiBQQ00gZmVlZGJhY2sgaXMgbm90IGVuYWJsZWQuIE5vdGhpbmcgdG8gcmVhZCAqLwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JTU1fREJHKCJjb3VudCAlZFxuIiwgY291bnQpOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPnJlYWRfd2FpdCwKLQkJCShhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCA+IDApIHx8Ci0JCQkoYXVkaW8tPnN0b3BwZWQpIHx8IChhdWRpby0+cmZsdXNoKSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCi0JCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+cmZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvdW50IDwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQpIHsKLQkJCS8qIFJlYWQgbXVzdCBoYXBwZW4gaW4gZnJhbWUgYm91bmRhcnkuIFNpbmNlIGRyaXZlciBkb2VzCi0JCQkgKiBub3Qga25vdyBmcmFtZSBzaXplLCByZWFkIGNvdW50IG11c3QgYmUgZ3JlYXRlciBvcgotCQkJICogZXF1YWwgdG8gc2l6ZSBvZiBQQ00gc2FtcGxlcwotCQkJICovCi0JCQlNTV9EQkcoInJlYWQgc3RvcCAtIHBhcnRpYWwgZnJhbWVcbiIpOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9EQkcoInJlYWQgZnJvbSBpblslZF1cbiIsIGF1ZGlvLT5yZWFkX25leHQpOwotCi0JCQlpZiAoY29weV90b191c2VyCi0JCQkgICAgKGJ1ZiwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLmRhdGEsCi0JCQkgICAgIGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkKSkgewotCQkJCU1NX0VSUigiaW52YWxpZCBhZGRyICV4XG4iLCAodW5zaWduZWQgaW50KWJ1Zik7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY291bnQgLT0gYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQ7Ci0JCQlidWYgKz0gYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQ7Ci0JCQlhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCA9IDA7Ci0JCQlpZiAoKCsrYXVkaW8tPnJlYWRfbmV4dCkgPT0gYXVkaW8tPnBjbV9idWZfY291bnQpCi0JCQkJYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIGRvbid0IGZlZWQgb3V0cHV0IGJ1ZmZlciB0byBIVyBkZWNvZGVyIGR1cmluZyBmbHVzaGluZwotCSAqIGJ1ZmZlciByZWZyZXNoIGNvbW1hbmQgd2lsbCBiZSBzZW50IG9uY2UgZmx1c2ggY29tcGxldGVzCi0JICogc2VuZCBidWYgcmVmcmVzaCBjb21tYW5kIGhlcmUgY2FuIGNvbmZ1c2UgSFcgZGVjb2RlcgotCSAqLwotCWlmIChhdWRpby0+YnVmX3JlZnJlc2ggJiYgIWF1ZGlvLT5yZmx1c2gpIHsKLQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQkJTU1fREJHKCJraWNrIHN0YXJ0IHBjbSBmZWVkYmFjayBhZ2FpblxuIik7Ci0JCWF1ZGFtcndiX2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCi0JaWYgKGJ1ZiA+IHN0YXJ0KQotCQlyYyA9IGJ1ZiAtIHN0YXJ0OwotCi0JTU1fREJHKCJyZWFkICVkIGJ5dGVzXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGFtcndiX3Byb2Nlc3NfZW9zKHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCWNvbnN0IGNoYXIgX191c2VyICpidWZfc3RhcnQsIHVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplKQotewotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWNoYXIgKmJ1Zl9wdHI7Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygic2lnbmFsIGlucHV0IEVPUyByZXNlcnZlZD0lZFxuIiwgYXVkaW8tPnJlc2VydmVkKTsKLQlpZiAoYXVkaW8tPnJlc2VydmVkKSB7Ci0JCU1NX0RCRygiUGFzcyByZXNlcnZlIGJ5dGVcbiIpOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0JCWJ1Zl9wdHIgPSBmcmFtZS0+ZGF0YTsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJCShmcmFtZS0+dXNlZCA9PSAwKQotCQkJCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCQkJCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBkb25lOwotCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCWJ1Zl9wdHJbMF0gPSBhdWRpby0+cnN2X2J5dGU7Ci0JYnVmX3B0clsxXSA9IDA7Ci0JYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JZnJhbWUtPm1maWVsZF9zeiA9IDA7Ci0JYXVkaW8tPnJlc2VydmVkID0gMDsKLQlmcmFtZS0+dXNlZCA9IDI7Ci0JYXVkYW1yd2Jfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQl9Ci0KLQlNTV9EQkcoIk5vdyBzaWduYWwgaW5wdXQgRU9TIGFmdGVyIHJlc2VydmVkIGJ5dGVzICVkICVkICVkXG4iLAotCQlhdWRpby0+b3V0WzBdLnVzZWQsIGF1ZGlvLT5vdXRbMV0udXNlZCwgYXVkaW8tPm91dF9uZWVkZWQpOwotCi0JZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF9oZWFkOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCShhdWRpby0+b3V0X25lZWRlZCAmJgotCQlhdWRpby0+b3V0WzBdLnVzZWQgPT0gMCAmJgotCQlhdWRpby0+b3V0WzFdLnVzZWQgPT0gMCkKLQkJfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQl8fCAoYXVkaW8tPndmbHVzaCkpOwotCi0JaWYgKHJjIDwgMCkKLQkJZ290byBkb25lOwotCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGZyYW1lLT5kYXRhLCBidWZfc3RhcnQsIG1maWVsZF9zaXplKSkgewotCQlyYyA9IC1FRkFVTFQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlmcmFtZS0+bWZpZWxkX3N6ID0gbWZpZWxkX3NpemU7Ci0JYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JZnJhbWUtPnVzZWQgPSBtZmllbGRfc2l6ZTsKLQlhdWRhbXJ3Yl9zZW5kX2RhdGEoYXVkaW8sIDApOwotCi1kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkYW1yd2Jfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCXNpemVfdCB4ZmVyOwotCWNoYXIgKmNweV9wdHI7Ci0JaW50IHJjID0gMCwgZW9zX2NvbmRpdGlvbiA9IEFVREFNUldCX0VPU19OT05FOwotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplID0gMDsKLQl1bnNpZ25lZCBkc2l6ZTsKLQotCU1NX0RCRygiY250PSVkXG4iLCBjb3VudCk7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0JCWNweV9wdHIgPSBmcmFtZS0+ZGF0YTsKLQkJZHNpemUgPSAwOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkJICAgICAgKGZyYW1lLT51c2VkID09IDApCi0JCQkJCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCQkJCQl8fCAoYXVkaW8tPndmbHVzaCkpOwotCi0JCU1NX0RCRygiYnVmZmVyIGF2YWlsYWJsZVxuIik7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQkJaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoYXVkaW8tPm1maWVsZCkgewotCQkJaWYgKGJ1ZiA9PSBzdGFydCkgewotCQkJCS8qIFByb2Nlc3NpbmcgYmVnaW5uaW5nIG9mIHVzZXIgYnVmZmVyICovCi0JCQkJaWYgKF9fZ2V0X3VzZXIobWZpZWxkX3NpemUsCi0JCQkJCSh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgYnVmKSkgewotCQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSAJaWYgKG1maWVsZF9zaXplID4gY291bnQpIHsKLQkJCQkJcmMgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJTU1fREJHKCJtZiBvZmZzZXRfdmFsICV4XG4iLCBtZmllbGRfc2l6ZSk7Ci0JCQkJaWYgKGNvcHlfZnJvbV91c2VyKGNweV9wdHIsIGJ1ZiwgbWZpZWxkX3NpemUpKSB7Ci0JCQkJCXJjID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8qIENoZWNrIGlmIEVPUyBmbGFnIGlzIHNldCBhbmQgYnVmZmVyCi0JCQkJICogY29udGFpbnMganVzdCBtZXRhIGZpZWxkCi0JCQkJICovCi0JCQkJaWYgKGNweV9wdHJbQVVEQU1SV0JfRU9TX0ZMR19PRkZTRVRdICYKLQkJCQkJCUFVREFNUldCX0VPU19GTEdfTUFTSykgewotCQkJCQlNTV9EQkcoImVvcyBzZXRcbiIpOwotCQkJCQllb3NfY29uZGl0aW9uID0gQVVEQU1SV0JfRU9TX1NFVDsKLQkJCQkJaWYgKG1maWVsZF9zaXplID09IGNvdW50KSB7Ci0JCQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlCi0JCQkJCWNweV9wdHJbQVVEQU1SV0JfRU9TX0ZMR19PRkZTRVRdICY9Ci0JCQkJCQkJfkFVREFNUldCX0VPU19GTEdfTUFTSzsKLQkJCQl9Ci0JCQkJY3B5X3B0ciArPSBtZmllbGRfc2l6ZTsKLQkJCQljb3VudCAtPSBtZmllbGRfc2l6ZTsKLQkJCQlkc2l6ZSArPSBtZmllbGRfc2l6ZTsKLQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQl9IGVsc2UgewotCQkJCW1maWVsZF9zaXplID0gMDsKLQkJCQlNTV9EQkcoImNvbnRpbnVvdXMgYnVmZmVyXG4iKTsKLQkJCX0KLQkJCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQkJfQotCi0JCWlmIChhdWRpby0+cmVzZXJ2ZWQpIHsKLQkJCU1NX0RCRygiYXBwZW5kIHJlc2VydmVkIGJ5dGUgJXhcbiIsIGF1ZGlvLT5yc3ZfYnl0ZSk7Ci0JCQkqY3B5X3B0ciA9IGF1ZGlvLT5yc3ZfYnl0ZTsKLQkJCXhmZXIgPSAoY291bnQgPiAoKGZyYW1lLT5zaXplIC0gbWZpZWxkX3NpemUpIC0gMSkpID8KLQkJCQkoKGZyYW1lLT5zaXplIC0gbWZpZWxkX3NpemUpIC0gMSkgOiBjb3VudDsKLQkJCWNweV9wdHIrKzsKLQkJCWRzaXplICs9IDE7Ci0JCQlhdWRpby0+cmVzZXJ2ZWQgPSAwOwotCQl9IGVsc2UKLQkJCXhmZXIgPSAoY291bnQgPiAoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkpID8KLQkJCQkoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkgOiBjb3VudDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCB4ZmVyKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlkc2l6ZSArPSB4ZmVyOwotCQlpZiAoZHNpemUgJiAxKSB7Ci0JCQlhdWRpby0+cnN2X2J5dGUgPSAoKGNoYXIgKikgZnJhbWUtPmRhdGEpW2RzaXplIC0gMV07Ci0JCQlNTV9EQkcoIm9kZCBsZW5ndGggYnVmIHJlc2VydmUgbGFzdCBieXRlICV4XG4iLAotCQkJCQlhdWRpby0+cnN2X2J5dGUpOwotCQkJYXVkaW8tPnJlc2VydmVkID0gMTsKLQkJCWRzaXplLS07Ci0JCX0KLQkJY291bnQgLT0geGZlcjsKLQkJYnVmICs9IHhmZXI7Ci0KLQkJaWYgKGRzaXplID4gMCkgewotCQkJYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JCQlmcmFtZS0+dXNlZCA9IGRzaXplOwotCQkJYXVkYW1yd2Jfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQkJfQotCX0KLQlNTV9EQkcoImVvc19jb25kaXRpb24gJXggYnVmWzB4JXhdIHN0YXJ0WzB4JXhdXG4iLCBlb3NfY29uZGl0aW9uLAotCQkJKGludCkgYnVmLCAoaW50KSBzdGFydCk7Ci0JaWYgKGVvc19jb25kaXRpb24gPT0gQVVEQU1SV0JfRU9TX1NFVCkKLQkJcmMgPSBhdWRhbXJ3Yl9wcm9jZXNzX2VvcyhhdWRpbywgc3RhcnQsIG1maWVsZF9zaXplKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlpZiAoIXJjKSB7Ci0JCWlmIChidWYgPiBzdGFydCkKLQkJCXJldHVybiBidWYgLSBzdGFydDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGFtcndiX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCU1NX0lORk8oImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBmcmVlaW5nXG4iLCAoaW50KWF1ZGlvKTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRkZXZfdW5yZWdpc3Rlcl9ldnRfbGlzdG5lcihBVURERVZfQ0xOVF9ERUMsIGF1ZGlvLT5kZWNfaWQpOwotCWF1ZGFtcndiX2Rpc2FibGUoYXVkaW8pOwotCWF1ZGFtcndiX2ZsdXNoKGF1ZGlvKTsKLQlhdWRhbXJ3Yl9mbHVzaF9wY21fYnVmKGF1ZGlvKTsKLQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHBsYXkpOwotCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCXVucmVnaXN0ZXJfZWFybHlfc3VzcGVuZCgmYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUpOwotI2VuZGlmCi0JYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0JYXVkYW1yd2JfcmVzZXRfZXZlbnRfcXVldWUoYXVkaW8pOwotCWlvdW5tYXAoYXVkaW8tPm1hcF92X3dyaXRlKTsKLQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKGF1ZGlvLT5waHlzKTsKLQlpZiAoYXVkaW8tPnJlYWRfZGF0YSkgewotCQlpb3VubWFwKGF1ZGlvLT5tYXBfdl9yZWFkKTsKLQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcihhdWRpby0+cmVhZF9waHlzKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JaWYgKGF1ZGlvLT5kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKGF1ZGlvLT5kZW50cnkpOwotI2VuZGlmCi0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0YXRpYyB2b2lkIGF1ZGFtcndiX3Bvc3RfZXZlbnQoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHR5cGUsCi0JCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQpCi17Ci0Jc3RydWN0IGF1ZGFtcndiX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpKSB7Ci0JCWVfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWRhbXJ3Yl9ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZlX25vZGUtPmxpc3QpOwotCX0gZWxzZSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRhbXJ3Yl9ldmVudCksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWVfbm9kZSkgewotCQkJTU1fRVJSKCJObyBtZW0gdG8gcG9zdCBldmVudCAlZFxuIiwgdHlwZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQllX25vZGUtPmV2ZW50X3R5cGUgPSB0eXBlOwotCWVfbm9kZS0+cGF5bG9hZCA9IHBheWxvYWQ7Ci0KLQlsaXN0X2FkZF90YWlsKCZlX25vZGUtPmxpc3QsICZhdWRpby0+ZXZlbnRfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRhbXJ3Yl9zdXNwZW5kKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRhbXJ3Yl9zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWRhbXJ3Yl9zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkYW1yd2JfcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9TVVNQRU5ELCBwYXlsb2FkKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkYW1yd2JfcmVzdW1lKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRhbXJ3Yl9zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWRhbXJ3Yl9zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkYW1yd2JfcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9SRVNVTUUsIHBheWxvYWQpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBzc2l6ZV90IGF1ZGFtcndiX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkYW1yd2JfZGVidWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY29uc3QgaW50IGRlYnVnX2J1Zm1heCA9IDEwMjQ7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyWzEwMjRdOwotCWludCBuID0gMCwgaTsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCW4gPSBzY25wcmludGYoYnVmZmVyLCBkZWJ1Z19idWZtYXgsICJvcGVuZWQgJWRcbiIsIGF1ZGlvLT5vcGVuZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiZW5hYmxlZCAlZFxuIiwgYXVkaW8tPmVuYWJsZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkic3RvcHBlZCAlZFxuIiwgYXVkaW8tPnN0b3BwZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicGNtX2ZlZWRiYWNrICVkXG4iLCBhdWRpby0+cGNtX2ZlZWRiYWNrKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dF9idWZfc3ogJWRcbiIsIGF1ZGlvLT5vdXRbMF0uc2l6ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJwY21fYnVmX2NvdW50ICVkIFxuIiwgYXVkaW8tPnBjbV9idWZfY291bnQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicGNtX2J1Zl9zeiAlZCBcbiIsIGF1ZGlvLT5pblswXS5zaXplKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInZvbHVtZSAleCBcbiIsIGF1ZGlvLT52b2xfcGFuLnZvbHVtZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJzYW1wbGUgcmF0ZSAlZCBcbiIsIGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiY2hhbm5lbCBtb2RlICVkIFxuIiwgYXVkaW8tPm91dF9jaGFubmVsX21vZGUpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCS8qIEZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIG9ubHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgd2hlbgotCSAqIHdoZW4gcGxheWJhY2sgaGFsdHMgdW5leHBlY3RlZGx5LiBUaHVzLCBubyBtdXR1YWwgZXhjbHVzaW9uCi0JICogZW5mb3JjZWQKLQkgKi8KLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIndmbHVzaCAlZFxuIiwgYXVkaW8tPndmbHVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJyZmx1c2ggJWRcbiIsIGF1ZGlvLT5yZmx1c2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicnVubmluZyAlZCBcbiIsIGF1ZGlvLT5ydW5uaW5nKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImRlYyBzdGF0ZSAlZCBcbiIsIGF1ZGlvLT5kZWNfc3RhdGUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X25lZWRlZCAlZCBcbiIsIGF1ZGlvLT5vdXRfbmVlZGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dF9oZWFkICVkIFxuIiwgYXVkaW8tPm91dF9oZWFkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dF90YWlsICVkIFxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dFswXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFswXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dFsxXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFsxXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImJ1ZmZlcl9yZWZyZXNoICVkIFxuIiwgYXVkaW8tPmJ1Zl9yZWZyZXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInJlYWRfbmV4dCAlZCBcbiIsIGF1ZGlvLT5yZWFkX25leHQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiZmlsbF9uZXh0ICVkIFxuIiwgYXVkaW8tPmZpbGxfbmV4dCk7Ci0JZm9yIChpID0gMDsgaSA8IGF1ZGlvLT5wY21fYnVmX2NvdW50OyBpKyspCi0JCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJImluWyVkXS51c2VkICVkIFxuIiwgaSwgYXVkaW8tPmluW2ldLnVzZWQpOwotCWJ1ZmZlcltuXSA9IDA7Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGJ1ZmZlciwgbik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGFtcndiX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWRhbXJ3Yl9kZWJ1Z19yZWFkLAotCS5vcGVuID0gYXVkYW1yd2JfZGVidWdfb3BlbiwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBhdWRhbXJ3Yl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBOVUxMOwotCWludCByYywgZGVjX2F0dHJiLCBkZWNpZCwgaTsKLQlzdHJ1Y3QgYXVkYW1yd2JfZXZlbnQgKmVfbm9kZSA9IE5VTEw7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JLyogNCBieXRlcyByZXByZXNlbnRzIGRlY29kZXIgbnVtYmVyLCAxIGJ5dGUgZm9yIHRlcm1pbmF0ZSBzdHJpbmcgKi8KLQljaGFyIG5hbWVbc2l6ZW9mICJtc21fYW1yd2JfIiArIDVdOwotI2VuZGlmCi0KLQkvKiBBbGxvY2F0ZSBNZW0gZm9yIGF1ZGlvIGluc3RhbmNlICovCi0JYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWF1ZGlvKSB7Ci0JCU1NX0VSUigibm8gbWVtb3J5IHRvIGFsbG9jYXRlIGF1ZGlvIGluc3RhbmNlXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCU1NX0lORk8oImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBjcmVhdGVkXG4iLCAoaW50KWF1ZGlvKTsKLQotCS8qIEFsbG9jYXRlIHRoZSBkZWNvZGVyICovCi0JZGVjX2F0dHJiID0gQVVEREVDX0RFQ19BTVJXQjsKLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9OT05UVU5ORUw7Ci0JZWxzZQotCQlkZWNfYXR0cmIgfD0gTVNNX0FVRF9NT0RFX1RVTk5FTDsKLQotCWRlY2lkID0gYXVkcHBfYWRlY19hbGxvYyhkZWNfYXR0cmIsICZhdWRpby0+bW9kdWxlX25hbWUsCi0JCQkmYXVkaW8tPnF1ZXVlX2lkKTsKLQotCWlmIChkZWNpZCA8IDApIHsKLQkJTU1fRVJSKCJObyBmcmVlIGRlY29kZXIgYXZhaWxhYmxlLCBmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQkoaW50KWF1ZGlvKTsKLQkJcmMgPSAtRU5PREVWOwotCQlrZnJlZShhdWRpbyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhdWRpby0+ZGVjX2lkID0gZGVjaWQgJiBNU01fQVVEX0RFQ09ERVJfTUFTSzsKLQotCWF1ZGlvLT5waHlzID0gYWxsb2NhdGVfY29udGlndW91c19lYmlfbm9tYXAoRE1BU1osIFNaXzRLKTsKLQlpZiAoIWF1ZGlvLT5waHlzKSB7Ci0JCU1NX0VSUigiY291bGQgbm90IGFsbG9jYXRlIHdyaXRlIGJ1ZmZlcnMsIGZyZWVpbmcgaW5zdGFuY2UgXAotCQkJCTB4JTA4eFxuIiwgKGludClhdWRpbyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotCQlrZnJlZShhdWRpbyk7Ci0JCWdvdG8gZG9uZTsKLQl9IGVsc2UgewotCQlhdWRpby0+bWFwX3Zfd3JpdGUgPSBpb3JlbWFwKGF1ZGlvLT5waHlzLCBETUFTWik7Ci0JCWlmIChJU19FUlIoYXVkaW8tPm1hcF92X3dyaXRlKSkgewotCQkJTU1fRVJSKCJjb3VsZCBub3QgbWFwIHdyaXRlIHBoeXMgYnVmZmVycywgZnJlZWluZyBcCi0JCQkJCWluc3RhbmNlIDB4JTA4eFxuIiwgKGludClhdWRpbyk7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKGF1ZGlvLT5waHlzKTsKLQkJCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLQkJCWtmcmVlKGF1ZGlvKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlhdWRpby0+ZGF0YSA9IGF1ZGlvLT5tYXBfdl93cml0ZTsKLQkJTU1fREJHKCJ3cml0ZSBidWY6IHBoeSBhZGRyIDB4JTA4eCBrZXJuZWwgYWRkciAweCUwOHhcbiIsCi0JCQkJYXVkaW8tPnBoeXMsIChpbnQpYXVkaW8tPmRhdGEpOwotCX0KLQotCXJjID0gbXNtX2Fkc3BfZ2V0KGF1ZGlvLT5tb2R1bGVfbmFtZSwgJmF1ZGlvLT5hdWRwbGF5LAotCQkmYXVkcGxheV9hZHNwX29wc19hbXJ3YiwgYXVkaW8pOwotCWlmIChyYykgewotCQlNTV9FUlIoImZhaWxlZCB0byBnZXQgJXMgbW9kdWxlIGZyZWVpbmcgaW5zdGFuY2UgMHglMDh4XG4iLAotCQkJCWF1ZGlvLT5tb2R1bGVfbmFtZSwgKGludClhdWRpbyk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCW11dGV4X2luaXQoJmF1ZGlvLT5sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPnJlYWRfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmRzcF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2spOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPmF2c3luY193YWl0KTsKLQotCWF1ZGlvLT5vdXRbMF0uZGF0YSA9IGF1ZGlvLT5kYXRhICsgMDsKLQlhdWRpby0+b3V0WzBdLmFkZHIgPSBhdWRpby0+cGh5cyArIDA7Ci0JYXVkaW8tPm91dFswXS5zaXplID0gQlVGU1o7Ci0KLQlhdWRpby0+b3V0WzFdLmRhdGEgPSBhdWRpby0+ZGF0YSArIEJVRlNaOwotCWF1ZGlvLT5vdXRbMV0uYWRkciA9IGF1ZGlvLT5waHlzICsgQlVGU1o7Ci0JYXVkaW8tPm91dFsxXS5zaXplID0gQlVGU1o7Ci0KLQlhdWRpby0+dm9sX3Bhbi52b2x1bWUgPSAweDIwMDA7Ci0JYXVkaW8tPnZvbF9wYW4ucGFuID0gMHgwOwotCWF1ZGlvLT5lcV9lbmFibGUgPSAwOwotCWF1ZGlvLT5vdXRfc2FtcGxlX3JhdGUgPSA0NDEwMDsKLQlhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9IEFVRFBQX0NNRF9QQ01fSU5URl9TVEVSRU9fVjsKLQotCWF1ZGFtcndiX2ZsdXNoKGF1ZGlvKTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOwotCWF1ZGlvLT5vcGVuZWQgPSAxOwotCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDA7Ci0JYXVkaW8tPmRldmljZV9ldmVudHMgPSBBVURERVZfRVZUX0RFVl9SRFkKLQkJCQl8QVVEREVWX0VWVF9ERVZfUkxTfAotCQkJCUFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEc7Ci0KLQlyYyA9IGF1ZGRldl9yZWdpc3Rlcl9ldnRfbGlzdG5lcihhdWRpby0+ZGV2aWNlX2V2ZW50cywKLQkJCQkJQVVEREVWX0NMTlRfREVDLAotCQkJCQlhdWRpby0+ZGVjX2lkLAotCQkJCQlhbXJ3Yl9saXN0bmVyLAotCQkJCQkodm9pZCAqKWF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJmYWlsZWQgdG8gcmVnaXN0ZXIgbGlzdG5lclxuIik7Ci0JCWdvdG8gZXZlbnRfZXJyOwotCX0KLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXNucHJpbnRmKG5hbWUsIHNpemVvZiBuYW1lLCAibXNtX2FtcndiXyUwNHgiLCBhdWRpby0+ZGVjX2lkKTsKLQlhdWRpby0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCU5VTEwsICh2b2lkICopIGF1ZGlvLCAmYXVkYW1yd2JfZGVidWdfZm9wcyk7Ci0KLQlpZiAoSVNfRVJSKGF1ZGlvLT5kZW50cnkpKQotCQlNTV9EQkcoImRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUubGV2ZWwgPSBFQVJMWV9TVVNQRU5EX0xFVkVMX0RJU0FCTEVfRkI7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUucmVzdW1lID0gYXVkYW1yd2JfcmVzdW1lOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLnN1c3BlbmQgPSBhdWRhbXJ3Yl9zdXNwZW5kOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5hdWRpbyA9IGF1ZGlvOwotCXJlZ2lzdGVyX2Vhcmx5X3N1c3BlbmQoJmF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlKTsKLSNlbmRpZgotCWZvciAoaSA9IDA7IGkgPCBBVURBTVJXQl9FVkVOVF9OVU07IGkrKykgewotCQllX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkYW1yd2JfZXZlbnQpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGVfbm9kZSkKLQkJCWxpc3RfYWRkX3RhaWwoJmVfbm9kZS0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQkJZWxzZSB7Ci0JCQlNTV9FUlIoImV2ZW50IHBrdCBhbGxvYyBmYWlsZWRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci1kb25lOgotCXJldHVybiByYzsKLWV2ZW50X2VycjoKLQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHBsYXkpOwotZXJyOgotCWlvdW5tYXAoYXVkaW8tPm1hcF92X3dyaXRlKTsKLQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKGF1ZGlvLT5waHlzKTsKLQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYW1yd2JfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IGF1ZGFtcndiX29wZW4sCi0JLnJlbGVhc2UgPSBhdWRhbXJ3Yl9yZWxlYXNlLAotCS5yZWFkID0gYXVkYW1yd2JfcmVhZCwKLQkud3JpdGUgPSBhdWRhbXJ3Yl93cml0ZSwKLQkudW5sb2NrZWRfaW9jdGwgPSBhdWRhbXJ3Yl9pb2N0bCwKLQkuZnN5bmMgPSBhdWRhbXJ3Yl9mc3luYywKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2FtcndiX21pc2MgPSB7Ci0JLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lID0gIm1zbV9hbXJ3YiIsCi0JLmZvcHMgPSAmYXVkaW9fYW1yd2JfZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGFtcndiX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fYW1yd2JfbWlzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdWRhbXJ3Yl9leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZhdWRpb19hbXJ3Yl9taXNjKTsKLX0KLQotbW9kdWxlX2luaXQoYXVkYW1yd2JfaW5pdCk7Ci1tb2R1bGVfZXhpdChhdWRhbXJ3Yl9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gQU1SLVdCIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19kZXZfY3RsLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2Rldl9jdGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0NDZlOC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2Rldl9jdGwuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMjggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2Rldl9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHBtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkcHAuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotCi0jaWZuZGVmIE1BWAotI2RlZmluZSAgTUFYKHgsIHkpICgoKHgpID4gKHkpKSA/ICh4KSA6ICh5KSkKLSNlbmRpZgotCi0KLXN0YXRpYyBERUZJTkVfTVVURVgoc2Vzc2lvbl9sb2NrKTsKLQotc3RydWN0IGF1ZGlvX2Rldl9jdHJsX3N0YXRlIHsKLQlzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICpkZXZzW0FVRElPX0RFVl9DVExfTUFYX0RFVl07Ci0JdTMyIG51bV9kZXY7Ci0JYXRvbWljX3Qgb3BlbmVkOwotCXN0cnVjdCBtc21fc25kZGV2X2luZm8gKnZvaWNlX3J4X2RldjsKLQlzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICp2b2ljZV90eF9kZXY7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgICAgICB3YWl0OwotfTsKLQotc3RhdGljIHN0cnVjdCBhdWRpb19kZXZfY3RybF9zdGF0ZSBhdWRpb19kZXZfY3RybDsKLXN0cnVjdCBldmVudF9saXN0bmVyIGV2ZW50OwotI2RlZmluZSBNQVhfREVDX1NFU1NJT05TCTcKLSNkZWZpbmUgTUFYX0VOQ19TRVNTSU9OUwkzCi0KLXN0cnVjdCBzZXNzaW9uX2ZyZXEgewotCWludCBmcmVxOwotCWludCBldnQ7Ci19OwotCi0KLXN0cnVjdCBhdWRpb19yb3V0aW5nX2luZm8gewotCXVuc2lnbmVkIHNob3J0IG1peGVyX21hc2tbTUFYX0RFQ19TRVNTSU9OU107Ci0JdW5zaWduZWQgc2hvcnQgYXVkcmVjX21peGVyX21hc2tbTUFYX0VOQ19TRVNTSU9OU107Ci0Jc3RydWN0IHNlc3Npb25fZnJlcSBkZWNfZnJlcVtNQVhfREVDX1NFU1NJT05TXTsKLQlzdHJ1Y3Qgc2Vzc2lvbl9mcmVxIGVuY19mcmVxW01BWF9FTkNfU0VTU0lPTlNdOwotCWludCBkdWFsX21pY19zZXR0aW5nW01BWF9FTkNfU0VTU0lPTlNdOwotCWludCB2b2ljZV90eF9kZXZfaWQ7Ci0JaW50IHZvaWNlX3J4X2Rldl9pZDsKLQlpbnQgdm9pY2VfdHhfc2FtcGxlX3JhdGU7Ci0JaW50IHZvaWNlX3J4X3NhbXBsZV9yYXRlOwotCXNpZ25lZCBpbnQgdm9pY2VfdHhfdm9sOwotCXNpZ25lZCBpbnQgdm9pY2Vfcnhfdm9sOwotCWludCB0eF9tdXRlOwotCWludCByeF9tdXRlOwotCWludCB2b2ljZV9zdGF0ZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXVkaW9fcm91dGluZ19pbmZvIHJvdXRpbmdfaW5mbzsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVudHJ5Owotc3RhdGljIGludCBydGNfZ2V0ZGV2aWNlX2RiZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JTU1fSU5GTygiZGVidWcgaW50ZiAlc1xuIiwgKGNoYXIgKikgZmlsZS0+cHJpdmF0ZV9kYXRhKTsKLQlyZXR1cm4gMDsKLX0KLWJvb2wgaXNfZGV2X29wZW5lZCh1MzIgYWRiX2lkKQotewotCi0JaW50IGRldl9pZCA9IDA7Ci0Jc3RydWN0IG1zbV9zbmRkZXZfaW5mbyAqZGV2X2luZm8gPSBOVUxMOwotCi0JZm9yIChkZXZfaWQgPSAwOyBkZXZfaWQgPCBhdWRpb19kZXZfY3RybC5udW1fZGV2OyBkZXZfaWQrKykgewotCQlkZXZfaW5mbyA9IGF1ZGlvX2Rldl9jdHJsX2ZpbmRfZGV2KGRldl9pZCk7Ci0JICAgICAgaWYgKElTX0VSUihkZXZfaW5mbykpIHsKLQkJTU1fRVJSKCJwYXNzIGludmFsaWQgZGV2X2lkICVkXG4iLCBkZXZfaWQpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGRldl9pbmZvLT5vcGVuZWQgJiYgKGRldl9pbmZvLT5hY2RiX2lkID09IGFkYl9pZCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotc3RhdGljIHNzaXplX3QgcnRjX2dldGRldmljZV9kYmdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RhdGljIGNoYXIgYnVmZmVyWzEwMjRdOwotCXN0YXRpYyBjaGFyIHN3YXBfYnVmWzEwMjRdOwotCWNvbnN0IGludCBkZWJ1Z19idWZtYXggPSBzaXplb2YoYnVmZmVyKTsKLQlpbnQgbiA9IDA7Ci0JaW50IHN3YXBfY291bnQgPSAwOwotCWludCByYyA9IDA7Ci0gICAgaW50IGRldl9jb3VudCA9IDA7Ci0JaW50IGRldl9pZCA9IDA7Ci0Jc3RydWN0IG1zbV9zbmRkZXZfaW5mbyAqZGV2X2luZm8gPSBOVUxMOwotCi0KLQlpZiAoYXVkaW9fZGV2X2N0cmwubnVtX2RldiA8PSAwKSB7Ci0JCU1NX0VSUigiSW52YWxpZCBubyBEZXZpY2UgcHJlc2VudFxuIik7Ci0JCWRldl9jb3VudCA9IDA7Ci0JCW4gPSBzY25wcmludGYoYnVmZmVyLCBkZWJ1Z19idWZtYXgsICJERVZfTk86MHgleFxuIiwgZGV2X2NvdW50KTsKLQl9IGVsc2UgewotCWZvciAoZGV2X2lkID0gMDsgZGV2X2lkIDwgYXVkaW9fZGV2X2N0cmwubnVtX2RldjsgZGV2X2lkKyspIHsKLQkJZGV2X2luZm8gPSBhdWRpb19kZXZfY3RybF9maW5kX2RldihkZXZfaWQpOwotCQlpZiAoSVNfRVJSKGRldl9pbmZvKSkgewotCQkJTU1fRVJSKCJwYXNzIGludmFsaWQgZGV2X2lkICVkXG4iLCBkZXZfaWQpOwotCQkJcmMgPSBQVFJfRVJSKGRldl9pbmZvKTsKLQkJCXJldHVybiByYzsKLQkJfQotCQlpZiAoZGV2X2luZm8tPm9wZW5lZCkgewotCQkJbiArPSBzY25wcmludGYoc3dhcF9idWYgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCQkiQUNEQl9JRDoweCV4O0NBUEI6MHgleFxuIiwKLQkJCQkJZGV2X2luZm8tPmFjZGJfaWQsCi0JCQkJCWRldl9pbmZvLT5jYXBhYmlsaXR5KTsKLQkJICAgICAgZGV2X2NvdW50Kys7Ci0JCSAgICAgIE1NX0RCRygiUlRDIEdldCBEZXZpY2UgJXggQ09QUCAleCBTZXNzaW9uIE1hc2sgXAotCQkJICAgICAgJXggQ2FwYiAleCBEZXYgQ291bnQgJXhcbiIsCi0JCQkgICAgIGRldl9pZCAsIGRldl9pbmZvLT5jb3BwX2lkLCBkZXZfaW5mby0+c2Vzc2lvbnMsCi0JCQkgICAgIGRldl9pbmZvLT5jYXBhYmlsaXR5LCBkZXZfY291bnQpOwotCi0JCX0KLQl9Ci0KLQlzd2FwX2NvdW50ID0gc2NucHJpbnRmKGJ1ZmZlciwgZGVidWdfYnVmbWF4LCBcCi0JCQkiREVWX05POjB4JXhcbiIsIGRldl9jb3VudCk7Ci0KLQltZW1jcHkoYnVmZmVyK3N3YXBfY291bnQsIHN3YXBfYnVmLCBuKnNpemVvZihjaGFyKSk7Ci0JbiA9IG4rc3dhcF9jb3VudDsKLQotCWJ1ZmZlcltuXSA9IDA7Ci0gICAgfQotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCBidWZmZXIsIG4pOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBydGNfYWNkYl9kZWJ1Z19mb3BzID0gewotCS5vcGVuID0gcnRjX2dldGRldmljZV9kYmdfb3BlbiwKLQkucmVhZCA9IHJ0Y19nZXRkZXZpY2VfZGJnX3JlYWQKLX07Ci0jZW5kaWYKLWludCBtc21fcmVzZXRfYWxsX2RldmljZSh2b2lkKQotewotCWludCByYyA9IDA7Ci0JaW50IGRldl9pZCA9IDA7Ci0Jc3RydWN0IG1zbV9zbmRkZXZfaW5mbyAqZGV2X2luZm8gPSBOVUxMOwotCi0JZm9yIChkZXZfaWQgPSAwOyBkZXZfaWQgPCBhdWRpb19kZXZfY3RybC5udW1fZGV2OyBkZXZfaWQrKykgewotCQlkZXZfaW5mbyA9IGF1ZGlvX2Rldl9jdHJsX2ZpbmRfZGV2KGRldl9pZCk7Ci0JCWlmIChJU19FUlIoZGV2X2luZm8pKSB7Ci0JCQlNTV9FUlIoInBhc3MgaW52YWxpZCBkZXZfaWQgJWRcbiIsIGRldl9pZCk7Ci0JCQlyYyA9IFBUUl9FUlIoZGV2X2luZm8pOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCWlmICghZGV2X2luZm8tPm9wZW5lZCkKLQkJCWNvbnRpbnVlOwotCQlNTV9EQkcoIlJlc2V0dGluZyBkZXZpY2UgJWQgYWN0aXZlIG9uIENPUFAgJWQiCi0JCQkid2l0aCAgMHglMDh4IGFzIHJvdXRpbmdcbiIsCi0JCQkJZGV2X2lkLCBkZXZfaW5mby0+Y29wcF9pZCwgZGV2X2luZm8tPnNlc3Npb25zKTsKLQkJYnJvYWRjYXN0X2V2ZW50KEFVRERFVl9FVlRfUkVMX1BFTkRJTkcsCi0JCQkJCWRldl9pZCwKLQkJCQkJU0VTU0lPTl9JR05PUkUpOwotCQlyYyA9IGRldl9pbmZvLT5kZXZfb3BzLmNsb3NlKGRldl9pbmZvKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJTU1fRVJSKCJTbmQgZGV2aWNlICVkIGZhaWxlZCBjbG9zZSFcbiIsIGRldl9pZCk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfaW5mby0+b3BlbmVkID0gMDsKLQkJCWJyb2FkY2FzdF9ldmVudChBVURERVZfRVZUX0RFVl9STFMsCi0JCQkJZGV2X2lkLAotCQkJCVNFU1NJT05fSUdOT1JFKTsKLQkJfQotCQlkZXZfaW5mby0+c2Vzc2lvbnMgPSAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX3Jlc2V0X2FsbF9kZXZpY2UpOwotCi1pbnQgbXNtX3NldF9kdWFsX21pY19jb25maWcoaW50IGVuY19zZXNzaW9uX2lkLCBpbnQgY29uZmlnKQotewotCWludCBpOwotCWlmIChlbmNfc2Vzc2lvbl9pZCA+PSBNQVhfRU5DX1NFU1NJT05TKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkvKmNvbmZpZyBpcyBzZXQoMSkgZHVhbCBtaWMgcmVjb3JkaW5nIGlzIHNlbGVjdGVkICovCi0JLypjb25maWcgaXMgcmVzZXQgKDApIGR1YWwgbWljIHJlY29yZGluZyBpcyBub3Qgc2VsZWN0ZWQqLwotCXJvdXRpbmdfaW5mby5kdWFsX21pY19zZXR0aW5nW2VuY19zZXNzaW9uX2lkXSA9IGNvbmZpZzsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0VOQ19TRVNTSU9OUzsgaSsrKQotCQlNTV9EQkcoImR1YWxfbWljX3NldHRpbmdbJWRdID0gJWRcbiIsCi0JCQlpLCByb3V0aW5nX2luZm8uZHVhbF9taWNfc2V0dGluZ1tpXSk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9zZXRfZHVhbF9taWNfY29uZmlnKTsKLQotaW50IG1zbV9nZXRfZHVhbF9taWNfY29uZmlnKGludCBlbmNfc2Vzc2lvbl9pZCkKLXsKLQlpZiAoZW5jX3Nlc3Npb25faWQgPj0gTUFYX0VOQ19TRVNTSU9OUykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIHJvdXRpbmdfaW5mby5kdWFsX21pY19zZXR0aW5nW2VuY19zZXNzaW9uX2lkXTsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2dldF9kdWFsX21pY19jb25maWcpOwotCi1pbnQgbXNtX2dldF92b2ljZV9zdGF0ZSh2b2lkKQotewotCU1NX0RCRygidm9pY2Ugc3RhdGUgJWRcbiIsIHJvdXRpbmdfaW5mby52b2ljZV9zdGF0ZSk7Ci0JcmV0dXJuIHJvdXRpbmdfaW5mby52b2ljZV9zdGF0ZTsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2dldF92b2ljZV9zdGF0ZSk7Ci0KLWludCBtc21fc2V0X3ZvaWNlX211dGUoaW50IGRpciwgaW50IG11dGUpCi17Ci0JTU1fREJHKCJkaXIgJXggbXV0ZSAleFxuIiwgZGlyLCBtdXRlKTsKLQlpZiAoIWF1ZGlvX2Rldl9jdHJsLnZvaWNlX3J4X2RldgotCQl8fCAhYXVkaW9fZGV2X2N0cmwudm9pY2VfdHhfZGV2KQotCQlyZXR1cm4gLUVQRVJNOwotCWlmIChkaXIgPT0gRElSX1RYKSB7Ci0JCXJvdXRpbmdfaW5mby50eF9tdXRlID0gbXV0ZTsKLQkJYnJvYWRjYXN0X2V2ZW50KEFVRERFVl9FVlRfREVWSUNFX1ZPTF9NVVRFX0NIRywKLQkJCXJvdXRpbmdfaW5mby52b2ljZV90eF9kZXZfaWQsIFNFU1NJT05fSUdOT1JFKTsKLQl9IGVsc2UKLQkJcmV0dXJuIC1FUEVSTTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX3NldF92b2ljZV9tdXRlKTsKLQotaW50IG1zbV9zZXRfdm9pY2Vfdm9sKGludCBkaXIsIHMzMiB2b2x1bWUpCi17Ci0JaWYgKCFhdWRpb19kZXZfY3RybC52b2ljZV9yeF9kZXYKLQkJfHwgIWF1ZGlvX2Rldl9jdHJsLnZvaWNlX3R4X2RldikKLQkJcmV0dXJuIC1FUEVSTTsKLQlpZiAoZGlyID09IERJUl9UWCkgewotCQlyb3V0aW5nX2luZm8udm9pY2VfdHhfdm9sID0gdm9sdW1lOwotCQlicm9hZGNhc3RfZXZlbnQoQVVEREVWX0VWVF9ERVZJQ0VfVk9MX01VVEVfQ0hHLAotCQkJCQlyb3V0aW5nX2luZm8udm9pY2VfdHhfZGV2X2lkLAotCQkJCQlTRVNTSU9OX0lHTk9SRSk7Ci0JfSBlbHNlIGlmIChkaXIgPT0gRElSX1JYKSB7Ci0JCXJvdXRpbmdfaW5mby52b2ljZV9yeF92b2wgPSB2b2x1bWU7Ci0JCWJyb2FkY2FzdF9ldmVudChBVURERVZfRVZUX0RFVklDRV9WT0xfTVVURV9DSEcsCi0JCQkJCXJvdXRpbmdfaW5mby52b2ljZV9yeF9kZXZfaWQsCi0JCQkJCVNFU1NJT05fSUdOT1JFKTsKLQl9IGVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9zZXRfdm9pY2Vfdm9sKTsKLQotdm9pZCBtc21fc25kZGV2X3JlZ2lzdGVyKHN0cnVjdCBtc21fc25kZGV2X2luZm8gKmRldl9pbmZvKQotewotCW11dGV4X2xvY2soJnNlc3Npb25fbG9jayk7Ci0JaWYgKGF1ZGlvX2Rldl9jdHJsLm51bV9kZXYgPCBBVURJT19ERVZfQ1RMX01BWF9ERVYpIHsKLQkJYXVkaW9fZGV2X2N0cmwuZGV2c1thdWRpb19kZXZfY3RybC5udW1fZGV2XSA9IGRldl9pbmZvOwotCQlkZXZfaW5mby0+ZGV2X3ZvbHVtZSA9IDUwOyAvKiA1MCUgICovCi0JCWRldl9pbmZvLT5zZXNzaW9ucyA9IDB4MDsKLQkJZGV2X2luZm8tPnVzYWdlX2NvdW50ID0gMDsKLQkJZGV2X2luZm8tPnNldF9zYW1wbGVfcmF0ZSA9IDA7Ci0JCWF1ZGlvX2Rldl9jdHJsLm51bV9kZXYrKzsKLQl9IGVsc2UKLQkJTU1fRVJSKCIlczogZGV2aWNlIHJlZ2lzdHJ5IG1heCBvdXRcbiIsIF9fZnVuY19fKTsKLQltdXRleF91bmxvY2soJnNlc3Npb25fbG9jayk7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9zbmRkZXZfcmVnaXN0ZXIpOwotCi1pbnQgbXNtX3NuZGRldl9kZXZjb3VudCh2b2lkKQotewotCXJldHVybiBhdWRpb19kZXZfY3RybC5udW1fZGV2OwotfQotRVhQT1JUX1NZTUJPTChtc21fc25kZGV2X2RldmNvdW50KTsKLQotaW50IG1zbV9zbmRkZXZfcXVlcnkoaW50IGRldl9pZCkKLXsKLQlpZiAoZGV2X2lkIDw9IGF1ZGlvX2Rldl9jdHJsLm51bV9kZXYpCi0JCQlyZXR1cm4gMDsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX3NuZGRldl9xdWVyeSk7Ci0KLWludCBtc21fc25kZGV2X2lzX3NldChpbnQgcG9wcF9pZCwgaW50IGNvcHBfaWQpCi17Ci0JcmV0dXJuIHJvdXRpbmdfaW5mby5taXhlcl9tYXNrW3BvcHBfaWRdICYgKDB4MSA8PCBjb3BwX2lkKTsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX3NuZGRldl9pc19zZXQpOwotCi11bnNpZ25lZCBzaG9ydCBtc21fc25kZGV2X3JvdXRlX2VuYyhpbnQgZW5jX2lkKQotewotCWlmIChlbmNfaWQgPj0gTUFYX0VOQ19TRVNTSU9OUykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIHJvdXRpbmdfaW5mby5hdWRyZWNfbWl4ZXJfbWFza1tlbmNfaWRdOwotfQotRVhQT1JUX1NZTUJPTChtc21fc25kZGV2X3JvdXRlX2VuYyk7Ci0KLXVuc2lnbmVkIHNob3J0IG1zbV9zbmRkZXZfcm91dGVfZGVjKGludCBwb3BwX2lkKQotewotCWlmIChwb3BwX2lkID49IE1BWF9ERUNfU0VTU0lPTlMpCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiByb3V0aW5nX2luZm8ubWl4ZXJfbWFza1twb3BwX2lkXTsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX3NuZGRldl9yb3V0ZV9kZWMpOwotCi1pbnQgbXNtX3NuZGRldl9zZXRfZGVjKGludCBwb3BwX2lkLCBpbnQgY29wcF9pZCwgaW50IHNldCkKLXsKLQlpZiAoc2V0KQotCQlyb3V0aW5nX2luZm8ubWl4ZXJfbWFza1twb3BwX2lkXSB8PSAoMHgxIDw8IGNvcHBfaWQpOwotCWVsc2UKLQkJcm91dGluZ19pbmZvLm1peGVyX21hc2tbcG9wcF9pZF0gJj0gfigweDEgPDwgY29wcF9pZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX3NuZGRldl9zZXRfZGVjKTsKLQotaW50IG1zbV9zbmRkZXZfc2V0X2VuYyhpbnQgcG9wcF9pZCwgaW50IGNvcHBfaWQsIGludCBzZXQpCi17Ci0JaWYgKHNldCkKLQkJcm91dGluZ19pbmZvLmF1ZHJlY19taXhlcl9tYXNrW3BvcHBfaWRdIHw9ICgweDEgPDwgY29wcF9pZCk7Ci0JZWxzZQotCQlyb3V0aW5nX2luZm8uYXVkcmVjX21peGVyX21hc2tbcG9wcF9pZF0gJj0gfigweDEgPDwgY29wcF9pZCk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9zbmRkZXZfc2V0X2VuYyk7Ci0KLWludCBtc21fZGV2aWNlX2lzX3ZvaWNlKGludCBkZXZfaWQpCi17Ci0JaWYgKChkZXZfaWQgPT0gcm91dGluZ19pbmZvLnZvaWNlX3J4X2Rldl9pZCkKLQkJfHwgKGRldl9pZCA9PSByb3V0aW5nX2luZm8udm9pY2VfdHhfZGV2X2lkKSkKLQkJcmV0dXJuIDA7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2RldmljZV9pc192b2ljZSk7Ci0KLWludCBtc21fc2V0X3ZvY19yb3V0ZShzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICpkZXZfaW5mbywKLQkJCWludCBzdHJlYW1fdHlwZSwgaW50IGRldl9pZCkKLXsKLQlpbnQgcmMgPSAwOwotCXUzMiBzZXNzaW9uX21hc2sgPSAwOwotCi0JbXV0ZXhfbG9jaygmc2Vzc2lvbl9sb2NrKTsKLQlzd2l0Y2ggKHN0cmVhbV90eXBlKSB7Ci0JY2FzZSBBVURJT19ST1VURV9TVFJFQU1fVk9JQ0VfUlg6Ci0JCWlmIChhdWRpb19kZXZfY3RybC52b2ljZV9yeF9kZXYpCi0JCQlhdWRpb19kZXZfY3RybC52b2ljZV9yeF9kZXYtPnNlc3Npb25zICY9IH4weEZGOwotCi0JCWlmICghKGRldl9pbmZvLT5jYXBhYmlsaXR5ICYgU05EREVWX0NBUF9SWCkgfAotCQkgICAgIShkZXZfaW5mby0+Y2FwYWJpbGl0eSAmIFNORERFVl9DQVBfVk9JQ0UpKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlhdWRpb19kZXZfY3RybC52b2ljZV9yeF9kZXYgPSBkZXZfaW5mbzsKLQkJaWYgKGF1ZGlvX2Rldl9jdHJsLnZvaWNlX3J4X2RldikgewotCQkJc2Vzc2lvbl9tYXNrID0KLQkJCQkweDEgPDwgKDggKiAoKGludClBVURERVZfQ0xOVF9WT0MtMSkpOwotCQkJYXVkaW9fZGV2X2N0cmwudm9pY2VfcnhfZGV2LT5zZXNzaW9ucyB8PQotCQkJCXNlc3Npb25fbWFzazsKLQkJfQotCQlyb3V0aW5nX2luZm8udm9pY2VfcnhfZGV2X2lkID0gZGV2X2lkOwotCQlicmVhazsKLQljYXNlIEFVRElPX1JPVVRFX1NUUkVBTV9WT0lDRV9UWDoKLQkJaWYgKGF1ZGlvX2Rldl9jdHJsLnZvaWNlX3R4X2RldikKLQkJCWF1ZGlvX2Rldl9jdHJsLnZvaWNlX3R4X2Rldi0+c2Vzc2lvbnMgJj0gfjB4RkY7Ci0KLQkJaWYgKCEoZGV2X2luZm8tPmNhcGFiaWxpdHkgJiBTTkRERVZfQ0FQX1RYKSB8Ci0JCSAgICAhKGRldl9pbmZvLT5jYXBhYmlsaXR5ICYgU05EREVWX0NBUF9WT0lDRSkpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYXVkaW9fZGV2X2N0cmwudm9pY2VfdHhfZGV2ID0gZGV2X2luZm87Ci0JCWlmIChhdWRpb19kZXZfY3RybC52b2ljZV9yeF9kZXYpIHsKLQkJCXNlc3Npb25fbWFzayA9Ci0JCQkJMHgxIDw8ICg4ICogKChpbnQpQVVEREVWX0NMTlRfVk9DLTEpKTsKLQkJCWF1ZGlvX2Rldl9jdHJsLnZvaWNlX3R4X2Rldi0+c2Vzc2lvbnMgfD0KLQkJCQlzZXNzaW9uX21hc2s7Ci0JCX0KLQkJcm91dGluZ19pbmZvLnZvaWNlX3R4X2Rldl9pZCA9IGRldl9pZDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJnNlc3Npb25fbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTChtc21fc2V0X3ZvY19yb3V0ZSk7Ci0KLXZvaWQgbXNtX3JlbGVhc2Vfdm9jX3RocmVhZCh2b2lkKQotewotCXdha2VfdXAoJmF1ZGlvX2Rldl9jdHJsLndhaXQpOwotfQotRVhQT1JUX1NZTUJPTChtc21fcmVsZWFzZV92b2NfdGhyZWFkKTsKLQotaW50IG1zbV9zbmRkZXZfZ2V0X2VuY19mcmVxKHNlc3Npb25faWQpCi17Ci0JcmV0dXJuIHJvdXRpbmdfaW5mby5lbmNfZnJlcVtzZXNzaW9uX2lkXS5mcmVxOwotfQotRVhQT1JUX1NZTUJPTChtc21fc25kZGV2X2dldF9lbmNfZnJlcSk7Ci0KLWludCBtc21fZ2V0X3ZvY19mcmVxKGludCAqdHhfZnJlcSwgaW50ICpyeF9mcmVxKQotewotCSp0eF9mcmVxID0gcm91dGluZ19pbmZvLnZvaWNlX3R4X3NhbXBsZV9yYXRlOwotCSpyeF9mcmVxID0gcm91dGluZ19pbmZvLnZvaWNlX3J4X3NhbXBsZV9yYXRlOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChtc21fZ2V0X3ZvY19mcmVxKTsKLQotaW50IG1zbV9nZXRfdm9jX3JvdXRlKHUzMiAqcnhfaWQsIHUzMiAqdHhfaWQpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmICghcnhfaWQgfHwgIXR4X2lkKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJnNlc3Npb25fbG9jayk7Ci0JaWYgKCFhdWRpb19kZXZfY3RybC52b2ljZV9yeF9kZXYgfHwgIWF1ZGlvX2Rldl9jdHJsLnZvaWNlX3R4X2RldikgewotCQlyYyA9IC1FTk9ERVY7Ci0JCW11dGV4X3VubG9jaygmc2Vzc2lvbl9sb2NrKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCSpyeF9pZCA9IGF1ZGlvX2Rldl9jdHJsLnZvaWNlX3J4X2Rldi0+YWNkYl9pZDsKLQkqdHhfaWQgPSBhdWRpb19kZXZfY3RybC52b2ljZV90eF9kZXYtPmFjZGJfaWQ7Ci0KLQltdXRleF91bmxvY2soJnNlc3Npb25fbG9jayk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9nZXRfdm9jX3JvdXRlKTsKLQotc3RydWN0IG1zbV9zbmRkZXZfaW5mbyAqYXVkaW9fZGV2X2N0cmxfZmluZF9kZXYodTMyIGRldl9pZCkKLXsKLQlzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICppbmZvOwotCi0JaWYgKChhdWRpb19kZXZfY3RybC5udW1fZGV2IC0gMSkgPCBkZXZfaWQpIHsKLQkJaW5mbyA9IEVSUl9QVFIoLUVOT0RFVik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JaW5mbyA9IGF1ZGlvX2Rldl9jdHJsLmRldnNbZGV2X2lkXTsKLWVycm9yOgotCXJldHVybiBpbmZvOwotCi19Ci1FWFBPUlRfU1lNQk9MKGF1ZGlvX2Rldl9jdHJsX2ZpbmRfZGV2KTsKLQotaW50IHNuZGRldl92b2ljZV9zZXRfdm9sdW1lKGludCB2b2wsIGludCBwYXRoKQotewotCWlmIChhdWRpb19kZXZfY3RybC52b2ljZV9yeF9kZXYKLQkJJiYgYXVkaW9fZGV2X2N0cmwudm9pY2VfdHhfZGV2KSB7Ci0JCWlmIChwYXRoKQotCQkJYXVkaW9fZGV2X2N0cmwudm9pY2VfdHhfZGV2LT5kZXZfdm9sdW1lID0gdm9sOwotCQllbHNlCi0JCQlhdWRpb19kZXZfY3RybC52b2ljZV9yeF9kZXYtPmRldl92b2x1bWUgPSB2b2w7Ci0JfSBlbHNlCi0JCXJldHVybiAtRU5PREVWOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChzbmRkZXZfdm9pY2Vfc2V0X3ZvbHVtZSk7Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZGV2X2N0cmxfZ2V0X2RldmljZXMoc3RydWN0IGF1ZGlvX2Rldl9jdHJsX3N0YXRlICpkZXZfY3RybCwKLQkJCQkgICAgICB2b2lkIF9fdXNlciAqYXJnKQotewotCWludCByYyA9IDA7Ci0JdTMyIGluZGV4OwotCXN0cnVjdCBtc21fc25kX2RldmljZV9saXN0IHdvcmtfbGlzdDsKLQlzdHJ1Y3QgbXNtX3NuZF9kZXZpY2VfaW5mbyAqd29ya190Ymw7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJndvcmtfbGlzdCwgYXJnLCBzaXplb2Yod29ya19saXN0KSkpIHsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWlmICh3b3JrX2xpc3QubnVtX2RldiA+IGRldl9jdHJsLT5udW1fZGV2KSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQl3b3JrX3RibCA9IGttYWxsb2Mod29ya19saXN0Lm51bV9kZXYgKgotCQlzaXplb2Yoc3RydWN0IG1zbV9zbmRfZGV2aWNlX2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXdvcmtfdGJsKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBkZXZfY3RybC0+bnVtX2RldjsgaW5kZXgrKykgewotCQl3b3JrX3RibFtpbmRleF0uZGV2X2lkID0gaW5kZXg7Ci0JCXdvcmtfdGJsW2luZGV4XS5kZXZfY2FwID0gZGV2X2N0cmwtPmRldnNbaW5kZXhdLT5jYXBhYmlsaXR5OwotCQlzdHJsY3B5KHdvcmtfdGJsW2luZGV4XS5kZXZfbmFtZSwgZGV2X2N0cmwtPmRldnNbaW5kZXhdLT5uYW1lLAotCQk2NCk7Ci0JfQotCi0JaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSAod29ya19saXN0Lmxpc3QpLCB3b3JrX3RibCwKLQkJIHdvcmtfbGlzdC5udW1fZGV2ICogc2l6ZW9mKHN0cnVjdCBtc21fc25kX2RldmljZV9pbmZvKSkpCi0JCXJjID0gLUVGQVVMVDsKLQlrZnJlZSh3b3JrX3RibCk7Ci1lcnJvcjoKLQlyZXR1cm4gcmM7Ci19Ci0KLQotaW50IGF1ZGRldl9yZWdpc3Rlcl9ldnRfbGlzdG5lcih1MzIgZXZ0X2lkLCB1MzIgY2xudF90eXBlLCB1MzIgY2xudF9pZCwKLQkJdm9pZCAoKmxpc3RuZXIpKHUzMiBldnRfaWQsCi0JCQl1bmlvbiBhdWRkZXZfZXZ0X2RhdGEgKmV2dF9wYXlsb2FkLAotCQkJdm9pZCAqcHJpdmF0ZV9kYXRhKSwKLQkJdm9pZCAqcHJpdmF0ZV9kYXRhKQotewotCWludCByYzsKLQlzdHJ1Y3QgbXNtX3NuZF9ldnRfbGlzdG5lciAqY2FsbGJhY2sgPSBOVUxMOwotCXN0cnVjdCBtc21fc25kX2V2dF9saXN0bmVyICpuZXdfY2I7Ci0KLQluZXdfY2IgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX3NuZF9ldnRfbGlzdG5lciksIEdGUF9LRVJORUwpOwotCWlmICghbmV3X2NiKSB7Ci0JCU1NX0VSUigiTm8gbWVtb3J5IHRvIGFkZCBuZXcgbGlzdGVuZXIgbm9kZVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW11dGV4X2xvY2soJnNlc3Npb25fbG9jayk7Ci0JbmV3X2NiLT5jYl9uZXh0ID0gTlVMTDsKLQluZXdfY2ItPmF1ZGRldl9ldnRfbGlzdGVuZXIgPSBsaXN0bmVyOwotCW5ld19jYi0+ZXZ0X2lkID0gZXZ0X2lkOwotCW5ld19jYi0+Y2xudF90eXBlID0gY2xudF90eXBlOwotCW5ld19jYi0+Y2xudF9pZCA9IGNsbnRfaWQ7Ci0JbmV3X2NiLT5wcml2YXRlX2RhdGEgPSBwcml2YXRlX2RhdGE7Ci0JaWYgKGV2ZW50LmNiID09IE5VTEwpIHsKLQkJZXZlbnQuY2IgPSBuZXdfY2I7Ci0JCW5ld19jYi0+Y2JfcHJldiA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJY2FsbGJhY2sgPSBldmVudC5jYjsKLQkJZm9yICg7IDspIHsKLQkJCWlmIChjYWxsYmFjay0+Y2JfbmV4dCA9PSBOVUxMKQotCQkJCWJyZWFrOwotCQkJZWxzZSB7Ci0JCQkJY2FsbGJhY2sgPSBjYWxsYmFjay0+Y2JfbmV4dDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQljYWxsYmFjay0+Y2JfbmV4dCA9IG5ld19jYjsKLQkJbmV3X2NiLT5jYl9wcmV2ID0gY2FsbGJhY2s7Ci0JfQotCWV2ZW50Lm51bV9saXN0bmVyKys7Ci0JbXV0ZXhfdW5sb2NrKCZzZXNzaW9uX2xvY2spOwotCXJjID0gMDsKLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZGRldl9yZWdpc3Rlcl9ldnRfbGlzdG5lcik7Ci0KLWludCBhdWRkZXZfdW5yZWdpc3Rlcl9ldnRfbGlzdG5lcih1MzIgY2xudF90eXBlLCB1MzIgY2xudF9pZCkKLXsKLQlzdHJ1Y3QgbXNtX3NuZF9ldnRfbGlzdG5lciAqY2FsbGJhY2sgPSBldmVudC5jYjsKLQlzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICppbmZvOwotCXUzMiBzZXNzaW9uX21hc2sgPSAwOwotCWludCBpID0gMDsKLQotCW11dGV4X2xvY2soJnNlc3Npb25fbG9jayk7Ci0Jd2hpbGUgKGNhbGxiYWNrICE9IE5VTEwpIHsKLQkJaWYgKChjYWxsYmFjay0+Y2xudF90eXBlID09IGNsbnRfdHlwZSkKLQkJCSYmIChjYWxsYmFjay0+Y2xudF9pZCA9PSBjbG50X2lkKSkKLQkJCWJyZWFrOwotCQkgY2FsbGJhY2sgPSBjYWxsYmFjay0+Y2JfbmV4dDsKLQl9Ci0JaWYgKGNhbGxiYWNrID09IE5VTEwpIHsKLQkJbXV0ZXhfdW5sb2NrKCZzZXNzaW9uX2xvY2spOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoKGNhbGxiYWNrLT5jYl9uZXh0ID09IE5VTEwpICYmIChjYWxsYmFjay0+Y2JfcHJldiA9PSBOVUxMKSkKLQkJZXZlbnQuY2IgPSBOVUxMOwotCWVsc2UgaWYgKGNhbGxiYWNrLT5jYl9uZXh0ID09IE5VTEwpCi0JCWNhbGxiYWNrLT5jYl9wcmV2LT5jYl9uZXh0ID0gTlVMTDsKLQllbHNlIGlmIChjYWxsYmFjay0+Y2JfcHJldiA9PSBOVUxMKSB7Ci0JCWNhbGxiYWNrLT5jYl9uZXh0LT5jYl9wcmV2ID0gTlVMTDsKLQkJZXZlbnQuY2IgPSBjYWxsYmFjay0+Y2JfbmV4dDsKLQl9IGVsc2UgewotCQljYWxsYmFjay0+Y2JfcHJldi0+Y2JfbmV4dCA9IGNhbGxiYWNrLT5jYl9uZXh0OwotCQljYWxsYmFjay0+Y2JfbmV4dC0+Y2JfcHJldiA9IGNhbGxiYWNrLT5jYl9wcmV2OwotCX0KLQlrZnJlZShjYWxsYmFjayk7Ci0KLQlzZXNzaW9uX21hc2sgPSAoMHgxIDw8IChjbG50X2lkKSkgPDwgKDggKiAoKGludCljbG50X3R5cGUtMSkpOwotCWZvciAoaSA9IDA7IGkgPCBhdWRpb19kZXZfY3RybC5udW1fZGV2OyBpKyspIHsKLQkJaW5mbyA9IGF1ZGlvX2Rldl9jdHJsLmRldnNbaV07Ci0JCWluZm8tPnNlc3Npb25zICY9IH5zZXNzaW9uX21hc2s7Ci0JfQotCWlmIChjbG50X3R5cGUgPT0gQVVEREVWX0NMTlRfRU5DKQotCQltc21fc2V0X2R1YWxfbWljX2NvbmZpZyhjbG50X2lkLCAwKTsKLQltdXRleF91bmxvY2soJnNlc3Npb25fbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZGRldl91bnJlZ2lzdGVyX2V2dF9saXN0bmVyKTsKLQotaW50IG1zbV9zbmRkZXZfd2l0aGRyYXdfZnJlcSh1MzIgc2Vzc2lvbl9pZCwgdTMyIGNhcGFiaWxpdHksIHUzMiBjbG50X3R5cGUpCi17Ci0JaW50IGkgPSAwOwotCXN0cnVjdCBtc21fc25kZGV2X2luZm8gKmluZm87Ci0JdTMyIHNlc3Npb25fbWFzayA9IDA7Ci0KLQlpZiAoKGNsbnRfdHlwZSA9PSBBVURERVZfQ0xOVF9WT0MpICYmIChzZXNzaW9uX2lkICE9IDApKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoKGNsbnRfdHlwZSA9PSBBVURERVZfQ0xOVF9ERUMpCi0JCQkmJiAoc2Vzc2lvbl9pZCA+PSBNQVhfREVDX1NFU1NJT05TKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKChjbG50X3R5cGUgPT0gQVVEREVWX0NMTlRfRU5DKQotCQkJJiYgKHNlc3Npb25faWQgPj0gTUFYX0VOQ19TRVNTSU9OUykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc2Vzc2lvbl9tYXNrID0gKDB4MSA8PCAoc2Vzc2lvbl9pZCkpIDw8ICg4ICogKChpbnQpY2xudF90eXBlLTEpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBhdWRpb19kZXZfY3RybC5udW1fZGV2OyBpKyspIHsKLQkJaW5mbyA9IGF1ZGlvX2Rldl9jdHJsLmRldnNbaV07Ci0JCWlmICgoaW5mby0+c2Vzc2lvbnMgJiBzZXNzaW9uX21hc2spCi0JCQkmJiAoaW5mby0+Y2FwYWJpbGl0eSAmIGNhcGFiaWxpdHkpKSB7Ci0JCQlpZiAoIShpbmZvLT5zZXNzaW9ucyAmIH4oc2Vzc2lvbl9tYXNrKSkpCi0JCQkJaW5mby0+c2V0X3NhbXBsZV9yYXRlID0gMDsKLQkJfQotCX0KLQlpZiAoY2xudF90eXBlID09IEFVRERFVl9DTE5UX0RFQykKLQkJcm91dGluZ19pbmZvLmRlY19mcmVxW3Nlc3Npb25faWRdLmZyZXEKLQkJCQkJPSAwOwotCWVsc2UgaWYgKGNsbnRfdHlwZSA9PSBBVURERVZfQ0xOVF9FTkMpCi0JCXJvdXRpbmdfaW5mby5lbmNfZnJlcVtzZXNzaW9uX2lkXS5mcmVxCi0JCQkJCT0gMDsKLQllbHNlIGlmIChjYXBhYmlsaXR5ID09IFNORERFVl9DQVBfVFgpCi0JCXJvdXRpbmdfaW5mby52b2ljZV90eF9zYW1wbGVfcmF0ZSA9IDA7Ci0JZWxzZQotCQlyb3V0aW5nX2luZm8udm9pY2Vfcnhfc2FtcGxlX3JhdGUgPSA0ODAwMDsKLQlyZXR1cm4gMDsKLX0KLQotaW50IG1zbV9zbmRkZXZfcmVxdWVzdF9mcmVxKGludCAqZnJlcSwgdTMyIHNlc3Npb25faWQsCi0JCQl1MzIgY2FwYWJpbGl0eSwgdTMyIGNsbnRfdHlwZSkKLXsKLQlpbnQgaSA9IDA7Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICppbmZvOwotCXUzMiBzZXRfZnJlcTsKLQl1MzIgc2Vzc2lvbl9tYXNrID0gMDsKLQl1MzIgY2xudF90eXBlX21hc2sgPSAwOwotCi0JTU1fREJHKCI6IGNsbnRfdHlwZSAweCUwOHhcbiIsIGNsbnRfdHlwZSk7Ci0KLQlpZiAoKGNsbnRfdHlwZSA9PSBBVURERVZfQ0xOVF9WT0MpICYmIChzZXNzaW9uX2lkICE9IDApKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoKGNsbnRfdHlwZSA9PSBBVURERVZfQ0xOVF9ERUMpCi0JCQkmJiAoc2Vzc2lvbl9pZCA+PSBNQVhfREVDX1NFU1NJT05TKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKChjbG50X3R5cGUgPT0gQVVEREVWX0NMTlRfRU5DKQotCQkJJiYgKHNlc3Npb25faWQgPj0gTUFYX0VOQ19TRVNTSU9OUykpCi0JCXJldHVybiAtRUlOVkFMOwotCXNlc3Npb25fbWFzayA9ICgoMHgxIDw8IHNlc3Npb25faWQpKSA8PCAoOCAqIChjbG50X3R5cGUtMSkpOwotCWNsbnRfdHlwZV9tYXNrID0gKDB4RkYgPDwgKDggKiAoY2xudF90eXBlLTEpKSk7Ci0JaWYgKCEoKmZyZXEgPT0gODAwMCkgJiYgISgqZnJlcSA9PSAxMTAyNSkgJiYKLQkJISgqZnJlcSA9PSAxMjAwMCkgJiYgISgqZnJlcSA9PSAxNjAwMCkgJiYKLQkJISgqZnJlcSA9PSAyMjA1MCkgJiYgISgqZnJlcSA9PSAyNDAwMCkgJiYKLQkJISgqZnJlcSA9PSAzMjAwMCkgJiYgISgqZnJlcSA9PSA0NDEwMCkgJiYKLQkJISgqZnJlcSA9PSA0ODAwMCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZm9yIChpID0gMDsgaSA8IGF1ZGlvX2Rldl9jdHJsLm51bV9kZXY7IGkrKykgewotCQlpbmZvID0gYXVkaW9fZGV2X2N0cmwuZGV2c1tpXTsKLQkJaWYgKChpbmZvLT5zZXNzaW9ucyAmIHNlc3Npb25fbWFzaykKLQkJCSYmIChpbmZvLT5jYXBhYmlsaXR5ICYgY2FwYWJpbGl0eSkpIHsKLQkJCXJjID0gMDsKLQkJCWlmICgoaW5mby0+c2Vzc2lvbnMgJiB+Y2xudF90eXBlX21hc2spCi0JCQkJJiYgKCgqZnJlcSAhPSA4MDAwKSAmJiAoKmZyZXEgIT0gMTYwMDApCi0JCQkJCSYmICgqZnJlcSAhPSA0ODAwMCkpKSB7Ci0JCQkJaWYgKGNsbnRfdHlwZSA9PSBBVURERVZfQ0xOVF9FTkMpIHsKLQkJCQkJcm91dGluZ19pbmZvLmVuY19mcmVxW3Nlc3Npb25faWRdLmZyZXEKLQkJCQkJCQk9IDA7Ci0JCQkJCXJldHVybiAtRVBFUk07Ci0JCQkJfSBlbHNlIGlmIChjbG50X3R5cGUgPT0gQVVEREVWX0NMTlRfREVDKSB7Ci0JCQkJCXJvdXRpbmdfaW5mby5kZWNfZnJlcVtzZXNzaW9uX2lkXS5mcmVxCi0JCQkJCQkJPSAwOwotCQkJCQlyZXR1cm4gLUVQRVJNOwotCQkJCX0KLQkJCX0KLQkJCWlmICgqZnJlcSA9PSBpbmZvLT5zZXRfc2FtcGxlX3JhdGUpIHsKLQkJCQlyYyA9IGluZm8tPnNldF9zYW1wbGVfcmF0ZTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXNldF9mcmVxID0gTUFYKCpmcmVxLCBpbmZvLT5zZXRfc2FtcGxlX3JhdGUpOwotCi0KLQkJCWlmIChjbG50X3R5cGUgPT0gQVVEREVWX0NMTlRfREVDKQotCQkJCXJvdXRpbmdfaW5mby5kZWNfZnJlcVtzZXNzaW9uX2lkXS5mcmVxCi0JCQkJCQk9IHNldF9mcmVxOwotCQkJZWxzZSBpZiAoY2xudF90eXBlID09IEFVRERFVl9DTE5UX0VOQykKLQkJCQlyb3V0aW5nX2luZm8uZW5jX2ZyZXFbc2Vzc2lvbl9pZF0uZnJlcQotCQkJCQkJPSBzZXRfZnJlcTsKLQkJCWVsc2UgaWYgKGNhcGFiaWxpdHkgPT0gU05EREVWX0NBUF9UWCkKLQkJCQlyb3V0aW5nX2luZm8udm9pY2VfdHhfc2FtcGxlX3JhdGUgPSBzZXRfZnJlcTsKLQotCQkJcmMgPSBzZXRfZnJlcTsKLQkJCSpmcmVxID0gc2V0X2ZyZXE7Ci0JCQkvKiBUaGVyZSBpcyBkaWZmZXJlbmNlIGluIGRldmljZSBzYW1wbGUgcmF0ZSB0bwotCQkJICogcmVxdWVzdGVkIHNhbXBsZSByYXRlLiBTbyB1cGRhdGUgZGV2aWNlIHNhbXBsZSByYXRlCi0JCQkgKiBhbmQgcHJvcGFnYXRlIHNhbXBsZSByYXRlIGNoYW5nZSBldmVudCB0byBhY3RpdmUKLQkJCSAqIHNlc3Npb25zIG9mIHRoZSBkZXZpY2UuCi0JCQkgKi8KLQkJCWlmIChpbmZvLT5zZXRfc2FtcGxlX3JhdGUgIT0gc2V0X2ZyZXEpIHsKLQkJCQlpbmZvLT5zZXRfc2FtcGxlX3JhdGUgPSBzZXRfZnJlcTsKLQkJCQlpZiAoaW5mby0+b3BlbmVkKSB7Ci0JCQkJCS8qIElnbm9yZSBwcm9wYWdhdGluZyBzYW1wbGUgcmF0ZQotCQkJCQkgKiBjaGFuZ2UgZXZlbnQgdG8gcmVxdWVzdGVkIGNsaWVudAotCQkJCQkgKiBzZXNzaW9uCi0JCQkJCSAqLwotCQkJCQlpZiAoY2xudF90eXBlID09IEFVRERFVl9DTE5UX0RFQykKLQkJCQkJCXJvdXRpbmdfaW5mby5cCi0JCQkJCQlkZWNfZnJlcVtzZXNzaW9uX2lkXS5ldnQgPSAxOwotCQkJCQllbHNlIGlmIChjbG50X3R5cGUgPT0gQVVEREVWX0NMTlRfRU5DKQotCQkJCQkJcm91dGluZ19pbmZvLlwKLQkJCQkJCWVuY19mcmVxW3Nlc3Npb25faWRdLmV2dCA9IDE7Ci0JCQkJCWJyb2FkY2FzdF9ldmVudChBVURERVZfRVZUX0ZSRVFfQ0hHLCBpLAotCQkJCQkJCQlTRVNTSU9OX0lHTk9SRSk7Ci0JCQkJCXNldF9mcmVxID0gaW5mby0+ZGV2X29wcy5zZXRfZnJlcShpbmZvLAotCQkJCQkJCQlzZXRfZnJlcSk7Ci0JCQkJCWJyb2FkY2FzdF9ldmVudChBVURERVZfRVZUX0RFVl9SRFksIGksCi0JCQkJCQkJCVNFU1NJT05fSUdOT1JFKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTU1fREJHKCJpbmZvLT5zZXRfc2FtcGxlX3JhdGUgPSAlZFxuIiwgaW5mby0+c2V0X3NhbXBsZV9yYXRlKTsKLQkJTU1fREJHKCJyb3V0aW5nX2luZm8uZW5jX2ZyZXEuZnJlcSA9ICVkXG4iLAotCQkJCQlyb3V0aW5nX2luZm8uZW5jX2ZyZXFbc2Vzc2lvbl9pZF0uZnJlcSk7Ci0JfQotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX3NuZGRldl9yZXF1ZXN0X2ZyZXEpOwotCi1pbnQgbXNtX3NuZGRldl9lbmFibGVfc2lkZXRvbmUodTMyIGRldl9pZCwgdTMyIGVuYWJsZSkKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IG1zbV9zbmRkZXZfaW5mbyAqZGV2X2luZm87Ci0KLQlNTV9EQkcoImRldl9pZCAlZCBlbmFibGUgJWRcbiIsIGRldl9pZCwgZW5hYmxlKTsKLQotCWRldl9pbmZvID0gYXVkaW9fZGV2X2N0cmxfZmluZF9kZXYoZGV2X2lkKTsKLQotCWlmIChJU19FUlIoZGV2X2luZm8pKSB7Ci0JCU1NX0VSUigiYmFkIGRldl9pZCAlZFxuIiwgZGV2X2lkKTsKLQkJcmMgPSAtRUlOVkFMOwotCX0gZWxzZSBpZiAoIWRldl9pbmZvLT5kZXZfb3BzLmVuYWJsZV9zaWRldG9uZSkgewotCQlNTV9EQkcoImRldiAlZCBubyBzaWRldG9uZSBzdXBwb3J0XG4iLCBkZXZfaWQpOwotCQlyYyA9IC1FUEVSTTsKLQl9IGVsc2UKLQkJcmMgPSBkZXZfaW5mby0+ZGV2X29wcy5lbmFibGVfc2lkZXRvbmUoZGV2X2luZm8sIGVuYWJsZSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9zbmRkZXZfZW5hYmxlX3NpZGV0b25lKTsKLQotc3RhdGljIGxvbmcgYXVkaW9fZGV2X2N0cmxfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGF1ZGlvX2Rldl9jdHJsX3N0YXRlICpkZXZfY3RybCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJnNlc3Npb25fbG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0dFVF9OVU1fU05EX0RFVklDRToKLQkJcmMgPSBwdXRfdXNlcihkZXZfY3RybC0+bnVtX2RldiwgKHVpbnQzMl90IF9fdXNlciAqKSBhcmcpOwotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9TTkRfREVWSUNFUzoKLQkJcmMgPSBhdWRpb19kZXZfY3RybF9nZXRfZGV2aWNlcyhkZXZfY3RybCwgKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fRU5BQkxFX1NORF9ERVZJQ0U6IHsKLQkJc3RydWN0IG1zbV9zbmRkZXZfaW5mbyAqZGV2X2luZm87Ci0JCXUzMiBkZXZfaWQ7Ci0KLQkJaWYgKGdldF91c2VyKGRldl9pZCwgKHUzMiBfX3VzZXIgKikgYXJnKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJZGV2X2luZm8gPSBhdWRpb19kZXZfY3RybF9maW5kX2RldihkZXZfaWQpOwotCQlpZiAoSVNfRVJSKGRldl9pbmZvKSkKLQkJCXJjID0gUFRSX0VSUihkZXZfaW5mbyk7Ci0JCWVsc2UgewotCQkJcmMgPSBkZXZfaW5mby0+ZGV2X29wcy5vcGVuKGRldl9pbmZvKTsKLQkJCWlmICghcmMpCi0JCQkJZGV2X2luZm8tPm9wZW5lZCA9IDE7Ci0JCQl3YWtlX3VwKCZhdWRpb19kZXZfY3RybC53YWl0KTsKLQkJfQotCQlicmVhazsKLQotCX0KLQotCWNhc2UgQVVESU9fRElTQUJMRV9TTkRfREVWSUNFOiB7Ci0JCXN0cnVjdCBtc21fc25kZGV2X2luZm8gKmRldl9pbmZvOwotCQl1MzIgZGV2X2lkOwotCi0JCWlmIChnZXRfdXNlcihkZXZfaWQsICh1MzIgX191c2VyICopIGFyZykpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWRldl9pbmZvID0gYXVkaW9fZGV2X2N0cmxfZmluZF9kZXYoZGV2X2lkKTsKLQkJaWYgKElTX0VSUihkZXZfaW5mbykpCi0JCQlyYyA9IFBUUl9FUlIoZGV2X2luZm8pOwotCQllbHNlIHsKLQkJCXJjID0gZGV2X2luZm8tPmRldl9vcHMuY2xvc2UoZGV2X2luZm8pOwotCQkJZGV2X2luZm8tPm9wZW5lZCA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBBVURJT19ST1VURV9TVFJFQU06IHsKLQkJc3RydWN0IG1zbV9hdWRpb19yb3V0ZV9jb25maWcgcm91dGVfY2ZnOwotCQlzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICpkZXZfaW5mbzsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnJvdXRlX2NmZywgKHZvaWQgX191c2VyICopIGFyZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX3JvdXRlX2NvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlNTV9EQkcoIiVzOiByb3V0ZSBjZmcgJWQgJWQgdHlwZVxuIiwgX19mdW5jX18sCi0JCXJvdXRlX2NmZy5kZXZfaWQsIHJvdXRlX2NmZy5zdHJlYW1fdHlwZSk7Ci0JCWRldl9pbmZvID0gYXVkaW9fZGV2X2N0cmxfZmluZF9kZXYocm91dGVfY2ZnLmRldl9pZCk7Ci0JCWlmIChJU19FUlIoZGV2X2luZm8pKSB7Ci0JCQlNTV9FUlIoIiVzOiBwYXNzIGludmFsaWQgZGV2X2lkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IFBUUl9FUlIoZGV2X2luZm8pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzd2l0Y2ggKHJvdXRlX2NmZy5zdHJlYW1fdHlwZSkgewotCi0JCWNhc2UgQVVESU9fUk9VVEVfU1RSRUFNX1ZPSUNFX1JYOgotCQkJaWYgKCEoZGV2X2luZm8tPmNhcGFiaWxpdHkgJiBTTkRERVZfQ0FQX1JYKSB8Ci0JCQkgICAgIShkZXZfaW5mby0+Y2FwYWJpbGl0eSAmIFNORERFVl9DQVBfVk9JQ0UpKSB7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGV2X2N0cmwtPnZvaWNlX3J4X2RldiA9IGRldl9pbmZvOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVVESU9fUk9VVEVfU1RSRUFNX1ZPSUNFX1RYOgotCQkJaWYgKCEoZGV2X2luZm8tPmNhcGFiaWxpdHkgJiBTTkRERVZfQ0FQX1RYKSB8Ci0JCQkgICAgIShkZXZfaW5mby0+Y2FwYWJpbGl0eSAmIFNORERFVl9DQVBfVk9JQ0UpKSB7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGV2X2N0cmwtPnZvaWNlX3R4X2RldiA9IGRldl9pbmZvOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJnNlc3Npb25fbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2Rldl9jdHJsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JTU1fREJHKCJvcGVuIGF1ZGlvX2Rldl9jdHJsXG4iKTsKLQlhdG9taWNfaW5jKCZhdWRpb19kZXZfY3RybC5vcGVuZWQpOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9ICZhdWRpb19kZXZfY3RybDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19kZXZfY3RybF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCU1NX0RCRygicmVsZWFzZSBhdWRpb19kZXZfY3RybFxuIik7Ci0JYXRvbWljX2RlYygmYXVkaW9fZGV2X2N0cmwub3BlbmVkKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fZGV2X2N0cmxfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IGF1ZGlvX2Rldl9jdHJsX29wZW4sCi0JLnJlbGVhc2UgPSBhdWRpb19kZXZfY3RybF9yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGlvX2Rldl9jdHJsX2lvY3RsLAotfTsKLQotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19kZXZfY3RybF9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fYXVkaW9fZGV2X2N0cmwiLAotCS5mb3BzCT0gJmF1ZGlvX2Rldl9jdHJsX2ZvcHMsCi19OwotCi0vKiBzZXNzaW9uIGlkIGlzIDMyIGJpdCByb3V0aW5nIG1hc2sgcGVyIGRldmljZQotICogMC03IGZvciB2b2ljZSBjbGllbnRzCi0gKiA4LTE1IGZvciBEZWNvZGVyIGNsaWVudHMKLSAqIDE2LTIzIGZvciBFbmNvZGVyIGNsaWVudHMKLSAqIDI0LTMxIERvIG5vdCBjYXJlCi0gKi8KLXZvaWQgYnJvYWRjYXN0X2V2ZW50KHUzMiBldnRfaWQsIHUzMiBkZXZfaWQsIHUzMiBzZXNzaW9uX2lkKQotewotCWludCBjbG50X2lkID0gMCwgaTsKLQl1bmlvbiBhdWRkZXZfZXZ0X2RhdGEgKmV2dF9wYXlsb2FkOwotCXN0cnVjdCBtc21fc25kX2V2dF9saXN0bmVyICpjYWxsYmFjazsKLQlzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICpkZXZfaW5mbyA9IE5VTEw7Ci0JdTMyIHNlc3Npb25fbWFzayA9IDA7Ci0Jc3RhdGljIGludCBwZW5kaW5nX3NlbnQ7Ci0KLQlNTV9EQkcoIjogZXZ0X2lkID0gJWRcbiIsIGV2dF9pZCk7Ci0KLQlpZiAoKGV2dF9pZCAhPSBBVURERVZfRVZUX1NUQVJUX1ZPSUNFKQotCQkmJiAoZXZ0X2lkICE9IEFVRERFVl9FVlRfRU5EX1ZPSUNFKQotCQkmJiAoZXZ0X2lkICE9IEFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEcpCi0JCSYmIChldnRfaWQgIT0gQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEcpKSB7Ci0JCWRldl9pbmZvID0gYXVkaW9fZGV2X2N0cmxfZmluZF9kZXYoZGV2X2lkKTsKLQkJaWYgKElTX0VSUihkZXZfaW5mbykpIHsKLQkJCU1NX0VSUigicGFzcyBpbnZhbGlkIGRldl9pZFxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlpZiAoZXZlbnQuY2IgIT0gTlVMTCkKLQkJY2FsbGJhY2sgPSBldmVudC5jYjsKLQllbHNlCi0JCXJldHVybjsKLQotCWV2dF9wYXlsb2FkID0ga3phbGxvYyhzaXplb2YodW5pb24gYXVkZGV2X2V2dF9kYXRhKSwKLQkJCUdGUF9LRVJORUwpOwotCWlmIChldnRfcGF5bG9hZCA9PSBOVUxMKSB7Ci0JCU1NX0VSUigiTWVtb3J5IGFsbG9jYXRpb24gZm9yIGV2ZW50IHBheWxvYWQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCW11dGV4X2xvY2soJnNlc3Npb25fbG9jayk7Ci0KLQlpZiAoZXZ0X2lkID09IEFVRERFVl9FVlRfVk9JQ0VfU1RBVEVfQ0hHKQotCQlyb3V0aW5nX2luZm8udm9pY2Vfc3RhdGUgPSBkZXZfaWQ7Ci0KLQlmb3IgKDsgOykgewotCQlpZiAoIShldnRfaWQgJiBjYWxsYmFjay0+ZXZ0X2lkKSkgewotCQkJaWYgKGNhbGxiYWNrLT5jYl9uZXh0ID09IE5VTEwpCi0JCQkJYnJlYWs7Ci0JCQllbHNlIHsKLQkJCQljYWxsYmFjayA9IGNhbGxiYWNrLT5jYl9uZXh0OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCWNsbnRfaWQgPSBjYWxsYmFjay0+Y2xudF9pZDsKLQkJbWVtc2V0KGV2dF9wYXlsb2FkLCAwLCBzaXplb2YodW5pb24gYXVkZGV2X2V2dF9kYXRhKSk7Ci0KLQkJaWYgKChldnRfaWQgPT0gQVVEREVWX0VWVF9TVEFSVF9WT0lDRSkKLQkJCXx8IChldnRfaWQgPT0gQVVEREVWX0VWVF9FTkRfVk9JQ0UpKQotCQkJZ290byBza2lwX2NoZWNrOwotCQlpZiAoY2FsbGJhY2stPmNsbnRfdHlwZSA9PSBBVURERVZfQ0xOVF9BVURJT0NBTCkKLQkJCWdvdG8gYXVkX2NhbDsKLQotCQlzZXNzaW9uX21hc2sgPSAoMHgxIDw8IChjbG50X2lkKSkKLQkJCQk8PCAoOCAqICgoaW50KWNhbGxiYWNrLT5jbG50X3R5cGUtMSkpOwotCi0JCWlmICgoZXZ0X2lkID09IEFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEcpIHx8IFwKLQkJCShldnRfaWQgPT0gQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEcpKSB7Ci0JCQlNTV9EQkcoIkFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEcgb3JcCi0JCQkJQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEdcbiIpOwotCQkJZ290byB2b2x1bWVfc3RybTsKLQkJfQotCi0JCU1NX0RCRygiZGV2X2luZm8tPnNlc3Npb25zID0gJTA4eFxuIiwgZGV2X2luZm8tPnNlc3Npb25zKTsKLQotCQlpZiAoKCFzZXNzaW9uX2lkICYmICEoZGV2X2luZm8tPnNlc3Npb25zICYgc2Vzc2lvbl9tYXNrKSkgfHwKLQkJCShzZXNzaW9uX2lkICYmICgoZGV2X2luZm8tPnNlc3Npb25zICYgc2Vzc2lvbl9tYXNrKSAhPQotCQkJCQkJc2Vzc2lvbl9pZCkpKSB7Ci0JCQlpZiAoY2FsbGJhY2stPmNiX25leHQgPT0gTlVMTCkKLQkJCQlicmVhazsKLQkJCWVsc2UgewotCQkJCWNhbGxiYWNrID0gY2FsbGJhY2stPmNiX25leHQ7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGV2dF9pZCA9PSBBVURERVZfRVZUX0RFVl9DSEdfVk9JQ0UpCi0JCQlnb3RvIHZvY19ldmVudHM7Ci0KLXZvbHVtZV9zdHJtOgotCQlpZiAoY2FsbGJhY2stPmNsbnRfdHlwZSA9PSBBVURERVZfQ0xOVF9ERUMpIHsKLQkJCU1NX0RCRygiQVVEREVWX0NMTlRfREVDXG4iKTsKLQkJCWlmIChldnRfaWQgPT0gQVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRykgewotCQkJCU1NX0RCRygiY2xudF9pZCA9ICVkLCBzZXNzaW9uX2lkID0gMHglOHhcbiIsCi0JCQkJCWNsbnRfaWQsIHNlc3Npb25faWQpOwotCQkJCWlmIChzZXNzaW9uX21hc2sgIT0gc2Vzc2lvbl9pZCkKLQkJCQkJZ290byBzZW50X2RlYzsKLQkJCQllbHNlCi0JCQkJCWV2dF9wYXlsb2FkLT5zZXNzaW9uX3ZvbCA9Ci0JCQkJCQltc21fdm9sX2N0bC52b2x1bWU7Ci0JCQl9IGVsc2UgaWYgKGV2dF9pZCA9PSBBVURERVZfRVZUX0ZSRVFfQ0hHKSB7Ci0JCQkJaWYgKHJvdXRpbmdfaW5mby5kZWNfZnJlcVtjbG50X2lkXS5ldnQpIHsKLQkJCQkJcm91dGluZ19pbmZvLmRlY19mcmVxW2NsbnRfaWRdLmV2dAotCQkJCQkJCT0gMDsKLQkJCQkJZ290byBzZW50X2RlYzsKLQkJCQl9IGVsc2UgaWYgKHJvdXRpbmdfaW5mby5kZWNfZnJlcVtjbG50X2lkXS5mcmVxCi0JCQkJCT09IGRldl9pbmZvLT5zZXRfc2FtcGxlX3JhdGUpCi0JCQkJCWdvdG8gc2VudF9kZWM7Ci0JCQkJZWxzZSB7Ci0JCQkJCWV2dF9wYXlsb2FkLT5mcmVxX2luZm8uc2FtcGxlX3JhdGUKLQkJCQkJCT0gZGV2X2luZm8tPnNldF9zYW1wbGVfcmF0ZTsKLQkJCQkJZXZ0X3BheWxvYWQtPmZyZXFfaW5mby5kZXZfdHlwZQotCQkJCQkJPSBkZXZfaW5mby0+Y2FwYWJpbGl0eTsKLQkJCQkJZXZ0X3BheWxvYWQtPmZyZXFfaW5mby5hY2RiX2Rldl9pZAotCQkJCQkJPSBkZXZfaW5mby0+YWNkYl9pZDsKLQkJCQl9Ci0JCQkvKiBQcm9wb2dhdGUgZGV2aWNlIGluZm9ybWF0aW9uIHRvIGNsaWVudCAqLwotCQkJfSBlbHNlIGlmIChldnRfaWQgPT0gQVVEREVWX0VWVF9ERVZJQ0VfSU5GTykgewotCQkJCWV2dF9wYXlsb2FkLT5kZXZpbmZvLmRldl9pZAotCQkJCQk9IGRldl9pbmZvLT5jb3BwX2lkOwotCQkJCWV2dF9wYXlsb2FkLT5kZXZpbmZvLmFjZGJfaWQKLQkJCQkJPSBkZXZfaW5mby0+YWNkYl9pZDsKLQkJCQlldnRfcGF5bG9hZC0+ZGV2aW5mby5kZXZfdHlwZSA9Ci0JCQkJCShkZXZfaW5mby0+Y2FwYWJpbGl0eSAmIFNORERFVl9DQVBfVFgpID8KLQkJCQkJU05EREVWX0NBUF9UWCA6IFNORERFVl9DQVBfUlg7Ci0JCQkJZXZ0X3BheWxvYWQtPmRldmluZm8uc2FtcGxlX3JhdGUKLQkJCQkJPSBkZXZfaW5mby0+c2FtcGxlX3JhdGU7Ci0JCQkJaWYgKHNlc3Npb25faWQgPT0gU0VTU0lPTl9JR05PUkUpCi0JCQkJCWV2dF9wYXlsb2FkLT5kZXZpbmZvLnNlc3Npb25zCi0JCQkJCT0gZGV2X2luZm8tPnNlc3Npb25zOwotCQkJCWVsc2UKLQkJCQkJZXZ0X3BheWxvYWQtPmRldmluZm8uc2Vzc2lvbnMKLQkJCQkJPSBzZXNzaW9uX2lkOwotCQkJCWV2dF9wYXlsb2FkLT5kZXZpbmZvLnNlc3Npb25zID0KLQkJCQkJKGV2dF9wYXlsb2FkLT5kZXZpbmZvLnNlc3Npb25zID4+Ci0JCQkJCQkoKEFVRERFVl9DTE5UX0RFQy0xKSAqIDgpKTsKLQkJCX0gZWxzZSBpZiAoZXZ0X2lkID09IEFVRERFVl9FVlRfVk9JQ0VfU1RBVEVfQ0hHKQotCQkJCWV2dF9wYXlsb2FkLT52b2ljZV9zdGF0ZSA9Ci0JCQkJCXJvdXRpbmdfaW5mby52b2ljZV9zdGF0ZTsKLQkJCWVsc2UKLQkJCQlldnRfcGF5bG9hZC0+cm91dGluZ19pZCA9IGRldl9pbmZvLT5jb3BwX2lkOwotCQkJY2FsbGJhY2stPmF1ZGRldl9ldnRfbGlzdGVuZXIoCi0JCQkJCWV2dF9pZCwKLQkJCQkJZXZ0X3BheWxvYWQsCi0JCQkJCWNhbGxiYWNrLT5wcml2YXRlX2RhdGEpOwotc2VudF9kZWM6Ci0JCQlpZiAoKGV2dF9pZCAhPSBBVURERVZfRVZUX1NUUkVBTV9WT0xfQ0hHKSAmJgotCQkJCShldnRfaWQgIT0gQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEcpKQotCQkJCXJvdXRpbmdfaW5mby5kZWNfZnJlcVtjbG50X2lkXS5mcmVxCi0JCQkJCQk9IGRldl9pbmZvLT5zZXRfc2FtcGxlX3JhdGU7Ci0KLQkJCWlmIChjYWxsYmFjay0+Y2JfbmV4dCA9PSBOVUxMKQotCQkJCWJyZWFrOwotCQkJZWxzZSB7Ci0JCQkJY2FsbGJhY2sgPSBjYWxsYmFjay0+Y2JfbmV4dDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlpZiAoY2FsbGJhY2stPmNsbnRfdHlwZSA9PSBBVURERVZfQ0xOVF9FTkMpIHsKLQotCQkJTU1fREJHKCJBVURERVZfQ0xOVF9FTkNcbiIpOwotCQkJaWYgKGV2dF9pZCA9PSBBVURERVZfRVZUX0ZSRVFfQ0hHKSB7Ci0JCQkJaWYgKHJvdXRpbmdfaW5mby5lbmNfZnJlcVtjbG50X2lkXS5ldnQpIHsKLQkJCQkJcm91dGluZ19pbmZvLmVuY19mcmVxW2NsbnRfaWRdLmV2dAotCQkJCQkJCT0gMDsKLQkJCQkJZ290byBzZW50X2VuYzsKLQkJCQkgfSBlbHNlIHsKLQkJCQkJZXZ0X3BheWxvYWQtPmZyZXFfaW5mby5zYW1wbGVfcmF0ZQotCQkJCQkJPSBkZXZfaW5mby0+c2V0X3NhbXBsZV9yYXRlOwotCQkJCQlldnRfcGF5bG9hZC0+ZnJlcV9pbmZvLmRldl90eXBlCi0JCQkJCQk9IGRldl9pbmZvLT5jYXBhYmlsaXR5OwotCQkJCQlldnRfcGF5bG9hZC0+ZnJlcV9pbmZvLmFjZGJfZGV2X2lkCi0JCQkJCQk9IGRldl9pbmZvLT5hY2RiX2lkOwotCQkJCX0KLQkJCS8qIFByb3BvZ2F0ZSBkZXZpY2UgaW5mb3JtYXRpb24gdG8gY2xpZW50ICovCi0JCQl9IGVsc2UgaWYgKGV2dF9pZCA9PSBBVURERVZfRVZUX0RFVklDRV9JTkZPKSB7Ci0JCQkJZXZ0X3BheWxvYWQtPmRldmluZm8uZGV2X2lkCi0JCQkJCT0gZGV2X2luZm8tPmNvcHBfaWQ7Ci0JCQkJZXZ0X3BheWxvYWQtPmRldmluZm8uYWNkYl9pZAotCQkJCQk9IGRldl9pbmZvLT5hY2RiX2lkOwotCQkJCWV2dF9wYXlsb2FkLT5kZXZpbmZvLmRldl90eXBlID0KLQkJCQkJKGRldl9pbmZvLT5jYXBhYmlsaXR5ICYgU05EREVWX0NBUF9UWCkgPwotCQkJCQlTTkRERVZfQ0FQX1RYIDogU05EREVWX0NBUF9SWDsKLQkJCQlldnRfcGF5bG9hZC0+ZGV2aW5mby5zYW1wbGVfcmF0ZQotCQkJCQk9IGRldl9pbmZvLT5zYW1wbGVfcmF0ZTsKLQkJCQlpZiAoc2Vzc2lvbl9pZCA9PSBTRVNTSU9OX0lHTk9SRSkKLQkJCQkJZXZ0X3BheWxvYWQtPmRldmluZm8uc2Vzc2lvbnMKLQkJCQkJPSBkZXZfaW5mby0+c2Vzc2lvbnM7Ci0JCQkJZWxzZQotCQkJCQlldnRfcGF5bG9hZC0+ZGV2aW5mby5zZXNzaW9ucwotCQkJCQk9IHNlc3Npb25faWQ7Ci0JCQkJZXZ0X3BheWxvYWQtPmRldmluZm8uc2Vzc2lvbnMgPQotCQkJCQkoZXZ0X3BheWxvYWQtPmRldmluZm8uc2Vzc2lvbnMgPj4KLQkJCQkJCSgoQVVEREVWX0NMTlRfRU5DLTEpICogOCkpOwotCQkJfSBlbHNlIGlmIChldnRfaWQgPT0gQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEcpCi0JCQkJZXZ0X3BheWxvYWQtPnZvaWNlX3N0YXRlID0KLQkJCQkJcm91dGluZ19pbmZvLnZvaWNlX3N0YXRlOwotCQkJZWxzZQotCQkJCWV2dF9wYXlsb2FkLT5yb3V0aW5nX2lkID0gZGV2X2luZm8tPmNvcHBfaWQ7Ci0JCQljYWxsYmFjay0+YXVkZGV2X2V2dF9saXN0ZW5lcigKLQkJCQkJZXZ0X2lkLAotCQkJCQlldnRfcGF5bG9hZCwKLQkJCQkJY2FsbGJhY2stPnByaXZhdGVfZGF0YSk7Ci1zZW50X2VuYzoKLQkJCWlmIChjYWxsYmFjay0+Y2JfbmV4dCA9PSBOVUxMKQotCQkJCQlicmVhazsKLQkJCWVsc2UgewotCQkJCWNhbGxiYWNrID0gY2FsbGJhY2stPmNiX25leHQ7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLWF1ZF9jYWw6Ci0JCWlmIChjYWxsYmFjay0+Y2xudF90eXBlID09IEFVRERFVl9DTE5UX0FVRElPQ0FMKSB7Ci0JCQlpbnQgdGVtcF9zZXNzaW9uczsKLQkJCU1NX0RCRygiQVVEREVWX0NMTlRfQVVESU9DQUxcbiIpOwotCQkJaWYgKGV2dF9pZCA9PSBBVURERVZfRVZUX1ZPSUNFX1NUQVRFX0NIRykKLQkJCQlldnRfcGF5bG9hZC0+dm9pY2Vfc3RhdGUgPQotCQkJCQlyb3V0aW5nX2luZm8udm9pY2Vfc3RhdGU7Ci0JCQllbHNlIGlmICghZGV2X2luZm8tPnNlc3Npb25zKQotCQkJCWdvdG8gc2VudF9hdWRfY2FsOwotCQkJZWxzZSB7Ci0JCQkJZXZ0X3BheWxvYWQtPmF1ZGNhbF9pbmZvLmRldl9pZCA9Ci0JCQkJCQlkZXZfaW5mby0+Y29wcF9pZDsKLQkJCQlldnRfcGF5bG9hZC0+YXVkY2FsX2luZm8uYWNkYl9pZCA9Ci0JCQkJCQlkZXZfaW5mby0+YWNkYl9pZDsKLQkJCQlldnRfcGF5bG9hZC0+YXVkY2FsX2luZm8uZGV2X3R5cGUgPQotCQkJCQkoZGV2X2luZm8tPmNhcGFiaWxpdHkgJiBTTkRERVZfQ0FQX1RYKSA/Ci0JCQkJCVNORERFVl9DQVBfVFggOiBTTkRERVZfQ0FQX1JYOwotCQkJCWV2dF9wYXlsb2FkLT5hdWRjYWxfaW5mby5zYW1wbGVfcmF0ZSA9Ci0JCQkJCWRldl9pbmZvLT5zZXRfc2FtcGxlX3JhdGUgPwotCQkJCQlkZXZfaW5mby0+c2V0X3NhbXBsZV9yYXRlIDoKLQkJCQkJZGV2X2luZm8tPnNhbXBsZV9yYXRlOwotCQkJfQotCQkJaWYgKGV2dF9wYXlsb2FkLT5hdWRjYWxfaW5mby5kZXZfdHlwZSA9PQotCQkJCQkJU05EREVWX0NBUF9UWCkgewotCQkJCWlmIChzZXNzaW9uX2lkID09IFNFU1NJT05fSUdOT1JFKQotCQkJCQl0ZW1wX3Nlc3Npb25zID0gZGV2X2luZm8tPnNlc3Npb25zOwotCQkJCWVsc2UKLQkJCQkJdGVtcF9zZXNzaW9ucyA9IHNlc3Npb25faWQ7Ci0JCQkJZXZ0X3BheWxvYWQtPmF1ZGNhbF9pbmZvLnNlc3Npb25zID0KLQkJCQkJKHRlbXBfc2Vzc2lvbnMgPj4KLQkJCQkJCSgoQVVEREVWX0NMTlRfRU5DLTEpICogOCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoc2Vzc2lvbl9pZCA9PSBTRVNTSU9OX0lHTk9SRSkKLQkJCQkJdGVtcF9zZXNzaW9ucyA9IGRldl9pbmZvLT5zZXNzaW9uczsKLQkJCQllbHNlCi0JCQkJCXRlbXBfc2Vzc2lvbnMgPSBzZXNzaW9uX2lkOwotCQkJCWV2dF9wYXlsb2FkLT5hdWRjYWxfaW5mby5zZXNzaW9ucyA9Ci0JCQkJCSh0ZW1wX3Nlc3Npb25zID4+Ci0JCQkJCQkoKEFVRERFVl9DTE5UX0RFQy0xKSAqIDgpKTsKLQkJCX0KLQkJCWNhbGxiYWNrLT5hdWRkZXZfZXZ0X2xpc3RlbmVyKAotCQkJCWV2dF9pZCwKLQkJCQlldnRfcGF5bG9hZCwKLQkJCQljYWxsYmFjay0+cHJpdmF0ZV9kYXRhKTsKLQotc2VudF9hdWRfY2FsOgotCQkJaWYgKGNhbGxiYWNrLT5jYl9uZXh0ID09IE5VTEwpCi0JCQkJYnJlYWs7Ci0JCQllbHNlIHsKLQkJCQljYWxsYmFjayA9IGNhbGxiYWNrLT5jYl9uZXh0OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci1za2lwX2NoZWNrOgotdm9jX2V2ZW50czoKLQkJaWYgKGNhbGxiYWNrLT5jbG50X3R5cGUgPT0gQVVEREVWX0NMTlRfVk9DKSB7Ci0JCQlNTV9EQkcoIkFVRERFVl9DTE5UX1ZPQ1xuIik7Ci0JCQlpZiAoZXZ0X2lkID09IEFVRERFVl9FVlRfREVWX1JMUykgewotCQkJCWlmICghcGVuZGluZ19zZW50KQotCQkJCQlnb3RvIHNlbnRfdm9jOwotCQkJCWVsc2UKLQkJCQkJcGVuZGluZ19zZW50ID0gMDsKLQkJCX0KLQkJCWlmIChldnRfaWQgPT0gQVVEREVWX0VWVF9SRUxfUEVORElORykKLQkJCQlwZW5kaW5nX3NlbnQgPSAxOwotCi0JCQlpZiAoZXZ0X2lkID09IEFVRERFVl9FVlRfREVWSUNFX1ZPTF9NVVRFX0NIRykgewotCQkJCWlmIChkZXZfaW5mby0+Y2FwYWJpbGl0eSAmIFNORERFVl9DQVBfVFgpIHsKLQkJCQkJZXZ0X3BheWxvYWQtPnZvY192bV9pbmZvLmRldl90eXBlID0KLQkJCQkJCVNORERFVl9DQVBfVFg7Ci0JCQkJCWV2dF9wYXlsb2FkLT52b2Nfdm1faW5mby5hY2RiX2Rldl9pZCA9Ci0JCQkJCQlkZXZfaW5mby0+YWNkYl9pZDsKLQkJCQkJZXZ0X3BheWxvYWQtPgotCQkJCQl2b2Nfdm1faW5mby5kZXZfdm1fdmFsLm11dGUgPQotCQkJCQkJcm91dGluZ19pbmZvLnR4X211dGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXZ0X3BheWxvYWQtPnZvY192bV9pbmZvLmRldl90eXBlID0KLQkJCQkJCVNORERFVl9DQVBfUlg7Ci0JCQkJCWV2dF9wYXlsb2FkLT52b2Nfdm1faW5mby5hY2RiX2Rldl9pZCA9Ci0JCQkJCQlkZXZfaW5mby0+YWNkYl9pZDsKLQkJCQkJZXZ0X3BheWxvYWQtPgotCQkJCQl2b2Nfdm1faW5mby5kZXZfdm1fdmFsLnZvbCA9Ci0JCQkJCQlyb3V0aW5nX2luZm8udm9pY2Vfcnhfdm9sOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoKGV2dF9pZCA9PSBBVURERVZfRVZUX1NUQVJUX1ZPSUNFKQotCQkJCQl8fCAoZXZ0X2lkID09IEFVRERFVl9FVlRfRU5EX1ZPSUNFKSkKLQkJCQltZW1zZXQoZXZ0X3BheWxvYWQsIDAsCi0JCQkJCXNpemVvZih1bmlvbiBhdWRkZXZfZXZ0X2RhdGEpKTsKLQkJCWVsc2UgaWYgKGV2dF9pZCA9PSBBVURERVZfRVZUX0ZSRVFfQ0hHKSB7Ci0JCQkJaWYgKHJvdXRpbmdfaW5mby52b2ljZV90eF9zYW1wbGVfcmF0ZQotCQkJCQkJIT0gZGV2X2luZm8tPnNldF9zYW1wbGVfcmF0ZSkgewotCQkJCQlyb3V0aW5nX2luZm8udm9pY2VfdHhfc2FtcGxlX3JhdGUKLQkJCQkJCT0gZGV2X2luZm8tPnNldF9zYW1wbGVfcmF0ZTsKLQkJCQkJZXZ0X3BheWxvYWQtPmZyZXFfaW5mby5zYW1wbGVfcmF0ZQotCQkJCQkJPSBkZXZfaW5mby0+c2V0X3NhbXBsZV9yYXRlOwotCQkJCQlldnRfcGF5bG9hZC0+ZnJlcV9pbmZvLmRldl90eXBlCi0JCQkJCQk9IGRldl9pbmZvLT5jYXBhYmlsaXR5OwotCQkJCQlldnRfcGF5bG9hZC0+ZnJlcV9pbmZvLmFjZGJfZGV2X2lkCi0JCQkJCQk9IGRldl9pbmZvLT5hY2RiX2lkOwotCQkJCX0gZWxzZQotCQkJCQlnb3RvIHNlbnRfdm9jOwotCQkJfSBlbHNlIGlmIChldnRfaWQgPT0gQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEcpCi0JCQkJZXZ0X3BheWxvYWQtPnZvaWNlX3N0YXRlID0KLQkJCQkJCXJvdXRpbmdfaW5mby52b2ljZV9zdGF0ZTsKLQkJCWVsc2UgewotCQkJCWV2dF9wYXlsb2FkLT52b2NfZGV2aW5mby5kZXZfdHlwZSA9Ci0JCQkJCShkZXZfaW5mby0+Y2FwYWJpbGl0eSAmIFNORERFVl9DQVBfVFgpID8KLQkJCQkJU05EREVWX0NBUF9UWCA6IFNORERFVl9DQVBfUlg7Ci0JCQkJZXZ0X3BheWxvYWQtPnZvY19kZXZpbmZvLmFjZGJfZGV2X2lkID0KLQkJCQkJZGV2X2luZm8tPmFjZGJfaWQ7Ci0JCQkJZXZ0X3BheWxvYWQtPnZvY19kZXZpbmZvLmRldl9zYW1wbGUgPQotCQkJCQlkZXZfaW5mby0+c2V0X3NhbXBsZV9yYXRlID8KLQkJCQkJZGV2X2luZm8tPnNldF9zYW1wbGVfcmF0ZSA6Ci0JCQkJCWRldl9pbmZvLT5zYW1wbGVfcmF0ZTsKLQkJCQlldnRfcGF5bG9hZC0+dm9jX2RldmluZm8uZGV2X2lkID0gZGV2X2lkOwotCQkJCWlmIChkZXZfaW5mby0+Y2FwYWJpbGl0eSAmIFNORERFVl9DQVBfUlgpIHsKLQkJCQkJZm9yIChpID0gMDsgaSA8IFZPQ19SWF9WT0xfQVJSQVlfTlVNOwotCQkJCQkJaSsrKSB7Ci0JCQkJCQlldnRfcGF5bG9hZC0+Ci0JCQkJCQl2b2NfZGV2aW5mby5tYXhfcnhfdm9sW2ldID0KLQkJCQkJCWRldl9pbmZvLT5tYXhfdm9jX3J4X3ZvbFtpXTsKLQkJCQkJCWV2dF9wYXlsb2FkCi0JCQkJCQktPnZvY19kZXZpbmZvLm1pbl9yeF92b2xbaV0gPQotCQkJCQkJZGV2X2luZm8tPm1pbl92b2Nfcnhfdm9sW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2FsbGJhY2stPmF1ZGRldl9ldnRfbGlzdGVuZXIoCi0JCQkJZXZ0X2lkLAotCQkJCWV2dF9wYXlsb2FkLAotCQkJCWNhbGxiYWNrLT5wcml2YXRlX2RhdGEpOwotCQkJaWYgKGV2dF9pZCA9PSBBVURERVZfRVZUX0RFVl9STFMpCi0JCQkJZGV2X2luZm8tPnNlc3Npb25zICY9IH4oMHhGRik7Ci1zZW50X3ZvYzoKLQkJCWlmIChjYWxsYmFjay0+Y2JfbmV4dCA9PSBOVUxMKQotCQkJCWJyZWFrOwotCQkJZWxzZSB7Ci0JCQkJY2FsbGJhY2sgPSBjYWxsYmFjay0+Y2JfbmV4dDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCX0KLQlrZnJlZShldnRfcGF5bG9hZCk7Ci0JbXV0ZXhfdW5sb2NrKCZzZXNzaW9uX2xvY2spOwotfQotRVhQT1JUX1NZTUJPTChicm9hZGNhc3RfZXZlbnQpOwotCi0KLXZvaWQgbWl4ZXJfcG9zdF9ldmVudCh1MzIgZXZ0X2lkLCB1MzIgaWQpCi17Ci0KLQlNTV9EQkcoImV2dF9pZCA9ICVkXG4iLCBldnRfaWQpOwotCXN3aXRjaCAoZXZ0X2lkKSB7Ci0JY2FzZSBBVURERVZfRVZUX0RFVl9DSEdfVk9JQ0U6IC8qIENhbGxlZCBmcm9tIFZvaWNlX3JvdXRlICovCi0JCWJyb2FkY2FzdF9ldmVudChBVURERVZfRVZUX0RFVl9DSEdfVk9JQ0UsIGlkLCBTRVNTSU9OX0lHTk9SRSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEREVWX0VWVF9ERVZfUkRZOgotCQlicm9hZGNhc3RfZXZlbnQoQVVEREVWX0VWVF9ERVZfUkRZLCBpZCwgU0VTU0lPTl9JR05PUkUpOwotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfREVWX1JMUzoKLQkJYnJvYWRjYXN0X2V2ZW50KEFVRERFVl9FVlRfREVWX1JMUywgaWQsIFNFU1NJT05fSUdOT1JFKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURERVZfRVZUX1JFTF9QRU5ESU5HOgotCQlicm9hZGNhc3RfZXZlbnQoQVVEREVWX0VWVF9SRUxfUEVORElORywgaWQsIFNFU1NJT05fSUdOT1JFKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURERVZfRVZUX0RFVklDRV9WT0xfTVVURV9DSEc6Ci0JCWJyb2FkY2FzdF9ldmVudChBVURERVZfRVZUX0RFVklDRV9WT0xfTVVURV9DSEcsIGlkLAotCQkJCQkJCVNFU1NJT05fSUdOT1JFKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURERVZfRVZUX1NUUkVBTV9WT0xfQ0hHOgotCQlicm9hZGNhc3RfZXZlbnQoQVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRywgaWQsCi0JCQkJCQkJU0VTU0lPTl9JR05PUkUpOwotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfU1RBUlRfVk9JQ0U6Ci0JCWJyb2FkY2FzdF9ldmVudChBVURERVZfRVZUX1NUQVJUX1ZPSUNFLAotCQkJCWlkLCBTRVNTSU9OX0lHTk9SRSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEREVWX0VWVF9FTkRfVk9JQ0U6Ci0JCWJyb2FkY2FzdF9ldmVudChBVURERVZfRVZUX0VORF9WT0lDRSwKLQkJCQlpZCwgU0VTU0lPTl9JR05PUkUpOwotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfRlJFUV9DSEc6Ci0JCWJyb2FkY2FzdF9ldmVudChBVURERVZfRVZUX0ZSRVFfQ0hHLCBpZCwgU0VTU0lPTl9JR05PUkUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKG1peGVyX3Bvc3RfZXZlbnQpOwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19kZXZfY3RybF9pbml0KHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JY2hhciBuYW1lW3NpemVvZiAicnRjX2dldF9kZXZpY2UiKzFdOwotI2VuZGlmCi0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpb19kZXZfY3RybC53YWl0KTsKLQotCWV2ZW50LmNiID0gTlVMTDsKLQotCWF0b21pY19zZXQoJmF1ZGlvX2Rldl9jdHJsLm9wZW5lZCwgMCk7Ci0JYXVkaW9fZGV2X2N0cmwubnVtX2RldiA9IDA7Ci0JYXVkaW9fZGV2X2N0cmwudm9pY2VfdHhfZGV2ID0gTlVMTDsKLQlhdWRpb19kZXZfY3RybC52b2ljZV9yeF9kZXYgPSBOVUxMOwotCXJvdXRpbmdfaW5mby52b2ljZV9zdGF0ZSA9IFZPSUNFX1NUQVRFX0lOVkFMSUQ7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mIG5hbWUsICJydGNfZ2V0X2RldmljZSIpOwotCWRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVUdPLAotCQkJTlVMTCwgTlVMTCwgJnJ0Y19hY2RiX2RlYnVnX2ZvcHMpOwotCWlmIChJU19FUlIoZGVudHJ5KSkKLQkJTU1fREJHKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7Ci0jZW5kaWYKLQotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19kZXZfY3RybF9taXNjKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGF1ZGlvX2Rldl9jdHJsX2V4aXQodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlpZiAoZGVudHJ5KQotCQlkZWJ1Z2ZzX3JlbW92ZShkZW50cnkpOwotI2VuZGlmCi0KLX0KLW1vZHVsZV9pbml0KGF1ZGlvX2Rldl9jdHJsX2luaXQpOwotbW9kdWxlX2V4aXQoYXVkaW9fZGV2X2N0cmxfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIDdLIEF1ZGlvIERldmljZSBDb250cm9sIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19ldnJjLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2V2cmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5NDZmOS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2V2cmMuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIGNvZGUgYWxzbyBib3Jyb3dzIGZyb20gYXVkaW9fYWFjLmMsIHdoaWNoIGlzCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGZpbmQgaXQgYXQgaHR0cDovL3d3dy5mc2Yub3JnLgotICovCi0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZWFybHlzdXNwZW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtb3J5X2FsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXUuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11X2RvbWFpbnMuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBwbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcGxheWNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRwbGF5bXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2Rldl9jdGwuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkcHAuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fbWVtdHlwZXMuaD4KLQotLyogSG9sZCAzMCBwYWNrZXRzIG9mIDI0IGJ5dGVzIGVhY2ggYW5kIDE0IGJ5dGVzIG9mIG1ldGEgaW4gKi8KLSNkZWZpbmUgQlVGU1ogCQkJNzM0Ci0jZGVmaW5lIERNQVNaIAkJCShCVUZTWiAqIDIpCi0KLSNkZWZpbmUgQVVEREVDX0RFQ19FVlJDIAkxMgotCi0jZGVmaW5lIFBDTV9CVUZTWl9NSU4gCQkxNjI0CS8qIDEwMG1zIHdvcnRoIG9mIGRhdGEgYW5kCi0JCQkJCSAgIGFuZCAyNCBieXRlcyBvZiBtZXRhIG91dCAqLwotI2RlZmluZSBQQ01fQlVGX01BWF9DT1VOVCAJNQotLyogRFNQIG9ubHkgYWNjZXB0cyA1IGJ1ZmZlcnMgYXQgbW9zdAotICogYnV0IHN1cHBvcnQgMiBidWZmZXJzIGN1cnJlbnRseQotICovCi0jZGVmaW5lIEVWUkNfREVDT0RFRF9GUlNaIAkzMjAJLyogRVZSQyAyMG1zIDhLSHogbW9ubyBQQ00gc2l6ZSAqLwotCi0jZGVmaW5lIFJPVVRJTkdfTU9ERV9GVFJUIAkxCi0jZGVmaW5lIFJPVVRJTkdfTU9ERV9SVCAJMgotLyogRGVjb2RlciBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBBVURQUFRBU0sgKi8KLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfU0xFRVAJMAotI2RlZmluZQkgQVVEUFBfREVDX1NUQVRVU19JTklUICAxCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX0NGRyAgIDIKLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfUExBWSAgMwotCi0jZGVmaW5lIEFVREVWUkNfTUVUQUZJRUxEX01BU0sgMHhGRkZGMDAwMAotI2RlZmluZSBBVURFVlJDX0VPU19GTEdfT0ZGU0VUIDB4MEEgLyogT2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIGJ1ZmZlciAqLwotI2RlZmluZSBBVURFVlJDX0VPU19GTEdfTUFTSyAweDAxCi0jZGVmaW5lIEFVREVWUkNfRU9TX05PTkUgMHgwIC8qIE5vIEVPUyBkZXRlY3RlZCAqLwotI2RlZmluZSBBVURFVlJDX0VPU19TRVQgMHgxIC8qIEVPUyBzZXQgaW4gbWV0YSBmaWVsZCAqLwotCi0jZGVmaW5lIEFVREVWUkNfRVZFTlRfTlVNIDEwIC8qIERlZmF1bHQgbnVtYmVyIG9mIHByZS1hbGxvY2F0ZWQgZXZlbnQgcGFja2V0cyAqLwotCi1zdHJ1Y3QgYnVmZmVyIHsKLQl2b2lkICpkYXRhOwotCXVuc2lnbmVkIHNpemU7Ci0JdW5zaWduZWQgdXNlZDsJCS8qIElucHV0IHVzYWdlIGFjdHVhbCBEU1AgcHJvZHVjZWQgUENNIHNpemUgICovCi0JdW5zaWduZWQgYWRkcjsKLQl1bnNpZ25lZCBzaG9ydCBtZmllbGRfc3o7IC8qb25seSB1c2VmdWwgZm9yIGRhdGEgaGFzIG1ldGEgZmllbGQgKi8KLX07Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RydWN0IGF1ZGV2cmNfc3VzcGVuZF9jdGwgewotCXN0cnVjdCBlYXJseV9zdXNwZW5kIG5vZGU7Ci0Jc3RydWN0IGF1ZGlvICphdWRpbzsKLX07Ci0jZW5kaWYKLQotc3RydWN0IGF1ZGV2cmNfZXZlbnR7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCWludCBldmVudF90eXBlOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci19OwotCi1zdHJ1Y3QgYXVkaW8gewotCXN0cnVjdCBidWZmZXIgb3V0WzJdOwotCi0Jc3BpbmxvY2tfdCBkc3BfbG9jazsKLQotCXVpbnQ4X3Qgb3V0X2hlYWQ7Ci0JdWludDhfdCBvdXRfdGFpbDsKLQl1aW50OF90IG91dF9uZWVkZWQ7CS8qIG51bWJlciBvZiBidWZmZXJzIHRoZSBkc3AgaXMgd2FpdGluZyBmb3IgKi8KLQotCWF0b21pY190IG91dF9ieXRlczsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtdXRleCB3cml0ZV9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlX3dhaXQ7Ci0KLQkvKiBIb3N0IFBDTSBzZWN0aW9uICovCi0Jc3RydWN0IGJ1ZmZlciBpbltQQ01fQlVGX01BWF9DT1VOVF07Ci0Jc3RydWN0IG11dGV4IHJlYWRfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkX3dhaXQ7CS8qIFdhaXQgcXVldWUgZm9yIHJlYWQgKi8KLQljaGFyICpyZWFkX2RhdGE7CS8qIHBvaW50ZXIgdG8gcmVhZGVyIGJ1ZmZlciAqLwotCWludDMyX3QgcmVhZF9waHlzOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHJlYWRlciBidWZmZXIgKi8KLQl1aW50OF90IHJlYWRfbmV4dDsJLyogaW5kZXggdG8gaW5wdXQgYnVmZmVycyB0byBiZSByZWFkIG5leHQgKi8KLQl1aW50OF90IGZpbGxfbmV4dDsJLyogaW5kZXggdG8gYnVmZmVyIHRoYXQgRFNQIHNob3VsZCBiZSBmaWxsaW5nICovCi0JdWludDhfdCBwY21fYnVmX2NvdW50OwkvKiBudW1iZXIgb2YgcGNtIGJ1ZmZlciBhbGxvY2F0ZWQgKi8KLQkvKiAtLS0tIEVuZCBvZiBIb3N0IFBDTSBzZWN0aW9uICovCi0KLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICphdWRwbGF5OwotCi0JLyogZGF0YSBhbGxvY2F0ZWQgZm9yIHZhcmlvdXMgYnVmZmVycyAqLwotCWNoYXIgKmRhdGE7Ci0JaW50MzJfdCBwaHlzOyAgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB3cml0ZSBidWZmZXIgKi8KLQl2b2lkICptYXBfdl9yZWFkOwotCXZvaWQgKm1hcF92X3dyaXRlOwotCi0JaW50IG1maWVsZDsgLyogbWV0YSBmaWVsZCBlbWJlZGRlZCBpbiBkYXRhICovCi0JaW50IHJmbHVzaDsgLyogUmVhZCAgZmx1c2ggKi8KLQlpbnQgd2ZsdXNoOyAvKiBXcml0ZSBmbHVzaCAqLwotCXVpbnQ4X3Qgb3BlbmVkOjE7Ci0JdWludDhfdCBlbmFibGVkOjE7Ci0JdWludDhfdCBydW5uaW5nOjE7Ci0JdWludDhfdCBzdG9wcGVkOjE7CS8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQl1aW50OF90IHBjbV9mZWVkYmFjazoxOwotCXVpbnQ4X3QgYnVmX3JlZnJlc2g6MTsKLQlpbnQgdGVvczsgLyogdmFsaWQgb25seSBpZiB0dW5uZWwgbW9kZSAmIG5vIGRhdGEgbGVmdCBmb3IgZGVjb2RlciAqLwotCWVudW0gbXNtX2F1ZF9kZWNvZGVyX3N0YXRlIGRlY19zdGF0ZTsJLyogUmVwcmVzZW50cyBkZWNvZGVyIHN0YXRlICovCi0KLQljb25zdCBjaGFyICptb2R1bGVfbmFtZTsKLQl1bnNpZ25lZCBxdWV1ZV9pZDsKLQl1aW50MTZfdCBkZWNfaWQ7Ci0JdWludDMyX3QgcmVhZF9wdHJfb2Zmc2V0OwotCWludDE2X3Qgc291cmNlOwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQlzdHJ1Y3QgYXVkZXZyY19zdXNwZW5kX2N0bCBzdXNwZW5kX2N0bDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotI2VuZGlmCi0KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9ldmVudF9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50X3F1ZXVlOwotCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3dhaXQ7Ci0Jc3BpbmxvY2tfdCBldmVudF9xdWV1ZV9sb2NrOwotCXN0cnVjdCBtdXRleCBnZXRfZXZlbnRfbG9jazsKLQlpbnQgZXZlbnRfYWJvcnQ7Ci0JLyogQVYgc3luYyBJbmZvICovCi0JaW50IGF2c3luY19mbGFnOyAgICAgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSBmZWVkYmFjayBmcm9tIERTUCAqLwotCXdhaXRfcXVldWVfaGVhZF90IGF2c3luY193YWl0Oy8qIFdhaXQgcXVldWUgZm9yIEFWIFN5bmMgTWVzc2FnZSAgICAgKi8KLQkvKiBmbGFncywgNDggYml0cyBzYW1wbGUvYnl0ZXMgY291bnRlciBwZXIgY2hhbm5lbCAqLwotCXVpbnQxNl90IGF2c3luY1tBVURQUF9BVlNZTkNfQ0hfQ09VTlQgKiBBVURQUF9BVlNZTkNfTlVNX1dPUkRTICsgMV07Ci0KLQl1aW50MzJfdCBkZXZpY2VfZXZlbnRzOwotCi0JaW50IGVxX2VuYWJsZTsKLQlpbnQgZXFfbmVlZHNfY29tbWl0OwotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfZXFhbGl6ZXIgZXE7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUgdm9sX3BhbjsKLX07Ci0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRldnJjX3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpOwotc3RhdGljIHZvaWQgYXVkZXZyY19kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpOwotc3RhdGljIHZvaWQgYXVkZXZyY19jb25maWdfaG9zdHBjbShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZGV2cmNfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbyk7Ci0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0YXRpYyB2b2lkIGF1ZGV2cmNfcG9zdF9ldmVudChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCk7Ci0jZW5kaWYKLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGV2cmNfZW5hYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JaWYgKGF1ZGlvLT5lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWF1ZGlvLT5kZWNfc3RhdGUgPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORTsKLQlhdWRpby0+b3V0X3RhaWwgPSAwOwotCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQotCWlmIChtc21fYWRzcF9lbmFibGUoYXVkaW8tPmF1ZHBsYXkpKSB7Ci0JCU1NX0VSUigibXNtX2Fkc3BfZW5hYmxlKGF1ZHBsYXkpIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChhdWRwcF9lbmFibGUoYXVkaW8tPmRlY19pZCwgYXVkZXZyY19kc3BfZXZlbnQsIGF1ZGlvKSkgewotCQlNTV9FUlIoImF1ZHBwX2VuYWJsZSgpIGZhaWxlZFxuIik7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JYXVkaW8tPmVuYWJsZWQgPSAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBldnJjX2xpc3RuZXIodTMyIGV2dF9pZCwgdW5pb24gYXVkZGV2X2V2dF9kYXRhICpldnRfcGF5bG9hZCwKLQkJCXZvaWQgKnByaXZhdGVfZGF0YSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gKHN0cnVjdCBhdWRpbyAqKSBwcml2YXRlX2RhdGE7Ci0Jc3dpdGNoIChldnRfaWQpIHsKLQljYXNlIEFVRERFVl9FVlRfREVWX1JEWToKLQkJTU1fREJHKCI6QVVEREVWX0VWVF9ERVZfUkRZXG4iKTsKLQkJYXVkaW8tPnNvdXJjZSB8PSAoMHgxIDw8IGV2dF9wYXlsb2FkLT5yb3V0aW5nX2lkKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nID09IDEgJiYgYXVkaW8tPmVuYWJsZWQgPT0gMSkKLQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLCBhdWRpby0+c291cmNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURERVZfRVZUX0RFVl9STFM6Ci0JCU1NX0RCRygiOkFVRERFVl9FVlRfREVWX1JMU1xuIik7Ci0JCWF1ZGlvLT5zb3VyY2UgJj0gfigweDEgPDwgZXZ0X3BheWxvYWQtPnJvdXRpbmdfaWQpOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcgPT0gMSAmJiBhdWRpby0+ZW5hYmxlZCA9PSAxKQotCQkJYXVkcHBfcm91dGVfc3RyZWFtKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvLT5zb3VyY2UpOwotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEc6Ci0JCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IGV2dF9wYXlsb2FkLT5zZXNzaW9uX3ZvbDsKLQkJTU1fREJHKCI6QVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRywgc3RyZWFtIHZvbCAlZFxuIiwKLQkJCQlhdWRpby0+dm9sX3Bhbi52b2x1bWUpOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuLAotCQkJCQlQT1BQKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCI6RVJST1I6d3JvbmcgZXZlbnRcbiIpOwotCQlicmVhazsKLQl9Ci19Ci0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkZXZyY19kaXNhYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JaW50IHJjID0gMDsKLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQlhdWRpby0+ZGVjX3N0YXRlID0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkU7Ci0JCWF1ZGRlY19kc3BfY29uZmlnKGF1ZGlvLCAwKTsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdCwKLQkJCQlhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoTVNNX0FVRF9ERUNPREVSX1dBSVRfTVMpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWVsc2UgaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX0NMT1NFKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlhdWRwcF9kaXNhYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvKTsKLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZHNwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdm9pZCBhdWRldnJjX3VwZGF0ZV9wY21fYnVmX2VudHJ5KHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCQkJCSB1aW50MzJfdCAqcGF5bG9hZCkKLXsKLQl1aW50OF90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoYXVkaW8tPnJmbHVzaCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBheWxvYWRbMV07IGluZGV4KyspIHsKLQkJaWYgKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyCi0JCQkJPT0gcGF5bG9hZFsyICsgaW5kZXggKiAyXSkgewotCQkJTU1fREJHKCJpblslZF0gcmVhZHlcbiIsIGF1ZGlvLT5maWxsX25leHQpOwotCQkJYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnVzZWQgPQotCQkJCXBheWxvYWRbMyArIGluZGV4ICogMl07Ci0JCQlpZiAoKCsrYXVkaW8tPmZpbGxfbmV4dCkgPT0gYXVkaW8tPnBjbV9idWZfY291bnQpCi0JCQkJYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0KLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiZXhwZWN0ZWQ9JXggcmV0PSV4XG4iLAotCQkJCWF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyLAotCQkJCXBheWxvYWRbMSArIGluZGV4ICogMl0pOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS51c2VkID09IDApIHsKLQkJYXVkZXZyY19idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JfSBlbHNlIHsKLQkJTU1fREJHKCJyZWFkIGNhbm5vdCBrZWVwIHVwXG4iKTsKLQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMTsKLQl9Ci0Jd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfZHNwX2V2ZW50KHZvaWQgKmRhdGEsIHVuc2lnbmVkIGlkLCBzaXplX3QgbGVuLAotCQkJICAgICAgdm9pZCAoKmdldGV2ZW50KSAodm9pZCAqcHRyLCBzaXplX3QgbGVuKSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZGF0YTsKLQl1aW50MzJfdCBtc2dbMjhdOwotCWdldGV2ZW50KG1zZywgc2l6ZW9mKG1zZykpOwotCi0JTU1fREJHKCJtc2dfaWQ9JXhcbiIsIGlkKTsKLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQTEFZX01TR19ERUNfTkVFRFNfREFUQToKLQkJYXVkZXZyY19zZW5kX2RhdGEoYXVkaW8sIDEpOwotCQlicmVhazsKLQljYXNlIEFVRFBMQVlfTVNHX0JVRkZFUl9VUERBVEU6Ci0JCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JCWF1ZGV2cmNfdXBkYXRlX3BjbV9idWZfZW50cnkoYXVkaW8sIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgQURTUF9NRVNTQUdFX0lEOgotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6IG1vZHVsZSBlbmFibGUoYXVkcGxheXRhc2spXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJ1bmV4cGVjdGVkIG1lc3NhZ2UgZnJvbSBkZWNvZGVyIFxuIik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhdWRldnJjX2RzcF9ldmVudCh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gcHJpdmF0ZTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBQX01TR19TVEFUVVNfTVNHOnsKLQkJCXVuc2lnbmVkIHN0YXR1cyA9IG1zZ1sxXTsKLQotCQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19TTEVFUDogewotCQkJCXVpbnQxNl90IHJlYXNvbiA9IG1zZ1syXTsKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOnNsZWVwIHJlYXNvbiA9IFwKLQkJCQkJCTB4JTA0eFxuIiwgcmVhc29uKTsKLQkJCQlpZiAoKHJlYXNvbiA9PSBBVURQUF9NU0dfUkVBU09OX01FTSkKLQkJCQkJfHwgKHJlYXNvbiA9PQotCQkJCQlBVURQUF9NU0dfUkVBU09OX05PREVDT0RFUikpIHsKLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfRkFJTFVSRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0gZWxzZSBpZiAocmVhc29uID09IEFVRFBQX01TR19SRUFTT05fTk9ORSkgewotCQkJCQkvKiBkZWNvZGVyIGlzIGluIGRpc2FibGUgc3RhdGUgKi8KLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfQ0xPU0U7Ci0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfSU5JVDoKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBpbml0IFxuIik7Ci0JCQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCQkJCWF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKGF1ZGlvKTsKLQkJCQllbHNlCi0JCQkJCWF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoYXVkaW8pOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfQ0ZHOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IGNmZyBcbiIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX1BMQVk6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogcGxheSBcbiIpOwotCQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLAotCQkJCQkJYXVkaW8tPnNvdXJjZSk7Ci0JCQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJCQkJYXVkZXZyY19jb25maWdfaG9zdHBjbShhdWRpbyk7Ci0JCQkJCWF1ZGV2cmNfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCQkJCX0KLQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1M7Ci0JCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlNTV9FUlIoInVua25vd24gZGVjb2RlciBzdGF0dXMgXG4iKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURQUF9NU0dfQ0ZHX01TRzoKLQkJaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0VOQSkgewotCQkJTU1fREJHKCJDRkdfTVNHIEVOQUJMRVxuIik7Ci0JCQlhdWRkZWNfZHNwX2NvbmZpZyhhdWRpbywgMSk7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCQlhdWRpby0+cnVubmluZyA9IDE7Ci0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuLAotCQkJCQlQT1BQKTsKLQkJCWF1ZHBwX2RzcF9zZXRfZXEoYXVkaW8tPmRlY19pZCwJYXVkaW8tPmVxX2VuYWJsZSwKLQkJCQkJJmF1ZGlvLT5lcSwgUE9QUCk7Ci0JCX0gZWxzZSBpZiAobXNnWzBdID09IEFVRFBQX01TR19FTkFfRElTKSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgRElTQUJMRVxuIik7Ci0JCQlhdWRpby0+cnVubmluZyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgJWQ/XG4iLCBtc2dbMF0pOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX1JPVVRJTkdfQUNLOgotCQlNTV9EQkcoIlJPVVRJTkdfQUNLXG4iKTsKLQkJYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhhdWRpbyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX0ZMVVNIX0FDSzoKLQkJTU1fREJHKCJGTFVTSF9BQ0tcbiIpOwotCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCQlhdWRldnJjX2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfUENNRE1BTUlTU0VEOgotCQlNTV9EQkcoIlBDTURNQU1JU1NFRFxuIik7Ci0JCWF1ZGlvLT50ZW9zID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlicmVhazsKLQotCWNhc2UgQVVEUFBfTVNHX0FWU1lOQ19NU0c6Ci0JCU1NX0RCRygiQVVEUFBfTVNHX0FWU1lOQ19NU0dcbiIpOwotCQltZW1jcHkoJmF1ZGlvLT5hdnN5bmNbMF0sIG1zZywgc2l6ZW9mKGF1ZGlvLT5hdnN5bmMpKTsKLQkJYXVkaW8tPmF2c3luY19mbGFnID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPmF2c3luY193YWl0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlNTV9FUlIoIlVOS05PV04gKCVkKVxuIiwgaWQpOwotCX0KLQotfQotCi1zdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHBsYXlfYWRzcF9vcHNfZXZyYyA9IHsKLQkuZXZlbnQgPSBhdWRwbGF5X2RzcF9ldmVudCwKLX07Ci0KLSNkZWZpbmUgYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcGxheSwgYXVkaW8tPnF1ZXVlX2lkLCBcCi0JCQljbWQsIGxlbikKLQotc3RhdGljIGludCBhdWRkZWNfZHNwX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2RlY190eXBlIGNmZ19kZWNfY21kOwotCi0JbWVtc2V0KCZjZmdfZGVjX2NtZCwgMCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci0KLQljZmdfZGVjX2NtZC5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX0RFQ19UWVBFOwotCWlmIChlbmFibGUpCi0JCWNmZ19kZWNfY21kLmRlY19jZmcgPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCQlBVURQUF9DTURfRU5BX0RFQ19WIHwgQVVEREVDX0RFQ19FVlJDOwotCWVsc2UKLQkJY2ZnX2RlY19jbWQuZGVjX2NmZyA9IEFVRFBQX0NNRF9VUERBVERFX0NGR19ERUMgfAotCQkJCUFVRFBQX0NNRF9ESVNfREVDX1Y7Ci0JY2ZnX2RlY19jbWQuZG1fbW9kZSA9IDB4MDsKLQljZmdfZGVjX2NtZC5zdHJlYW1faWQgPSBhdWRpby0+ZGVjX2lkOwotCi0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUxKCZjZmdfZGVjX2NtZCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19ldnJjIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNvbW1vbi5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TOwotCWNtZC5jb21tb24ubGVuZ3RoID0gc2l6ZW9mKGNtZCk7Ci0JY21kLmNvbW1vbi5kZWNfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5jb21tb24uaW5wdXRfc2FtcGxpbmdfZnJlcXVlbmN5ID0gODAwMDsKLQljbWQuc3RlcmVvX2NmZyA9IEFVRFBQX0NNRF9QQ01fSU5URl9NT05PX1Y7Ci0KLQlhdWRwcF9zZW5kX3F1ZXVlMigmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9yb3V0aW5nX21vZGUgY21kOwotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUFBfQ01EX1JPVVRJTkdfTU9ERTsKLQljbWQub2JqZWN0X251bWJlciA9IGF1ZGlvLT5kZWNfaWQ7Ci0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfRlRSVDsKLQllbHNlCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfUlQ7Ci0KLQlhdWRwcF9zZW5kX3F1ZXVlMSgmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcGxheV9kc3Bfc2VuZF9kYXRhX2F2YWlsKHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCQkJICAgICAgIHVuc2lnbmVkIGlkeCwgdW5zaWduZWQgbGVuKQotewotCXN0cnVjdCBhdWRwbGF5X2NtZF9iaXRzdHJlYW1fZGF0YV9hdmFpbF9udDIgY21kOwotCi0JY21kLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0JJVFNUUkVBTV9EQVRBX0FWQUlMX05UMjsKLQlpZiAoYXVkaW8tPm1maWVsZCkKLQkJY21kLmRlY29kZXJfaWQgPSBBVURFVlJDX01FVEFGSUVMRF9NQVNLIHwKLQkJCShhdWRpby0+b3V0W2lkeF0ubWZpZWxkX3N6ID4+IDEpOwotCWVsc2UKLQkJY21kLmRlY29kZXJfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5idWZfcHRyID0gYXVkaW8tPm91dFtpZHhdLmFkZHI7Ci0JY21kLmJ1Zl9zaXplID0gbGVuIC8gMjsKLQljbWQucGFydGl0aW9uX251bWJlciA9IDA7Ci0JcmV0dXJuIGF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkZXZyY19idWZmZXJfcmVmcmVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwbGF5X2NtZF9idWZmZXJfcmVmcmVzaCByZWZyZXNoX2NtZDsKLQotCXJlZnJlc2hfY21kLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0JVRkZFUl9SRUZSRVNIOwotCXJlZnJlc2hfY21kLm51bV9idWZmZXJzID0gMTsKLQlyZWZyZXNoX2NtZC5idWYwX2FkZHJlc3MgPSBhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uYWRkcjsKLQlyZWZyZXNoX2NtZC5idWYwX2xlbmd0aCA9IGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5zaXplOwotCi0JcmVmcmVzaF9jbWQuYnVmX3JlYWRfY291bnQgPSAwOwotCU1NX0RCRygiYnVmMF9hZGRyPSV4IGJ1ZjBfbGVuPSVkXG4iLCByZWZyZXNoX2NtZC5idWYwX2FkZHJlc3MsCi0JCQlyZWZyZXNoX2NtZC5idWYwX2xlbmd0aCk7Ci0JYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJnJlZnJlc2hfY21kLCBzaXplb2YocmVmcmVzaF9jbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkZXZyY19jb25maWdfaG9zdHBjbShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwbGF5X2NtZF9ocGNtX2J1Zl9jZmcgY2ZnX2NtZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JY2ZnX2NtZC5jbWRfaWQgPSBBVURQTEFZX0NNRF9IUENNX0JVRl9DRkc7Ci0JY2ZnX2NtZC5tYXhfYnVmZmVycyA9IDE7Ci0JY2ZnX2NtZC5ieXRlX3N3YXAgPSAwOwotCWNmZ19jbWQuaG9zdHBjbV9jb25maWcgPSAoMHg4MDAwKSB8ICgweDQwMDApOwotCWNmZ19jbWQuZmVlZGJhY2tfZnJlcXVlbmN5ID0gMTsKLQljZmdfY21kLnBhcnRpdGlvbl9udW1iZXIgPSAwOwotCWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZjZmdfY21kLCBzaXplb2YoY2ZnX2NtZCkpOwotCi19Ci0KLXN0YXRpYyB2b2lkIGF1ZGV2cmNfc2VuZF9kYXRhKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVuc2lnbmVkIG5lZWRlZCkKLXsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWlmICghYXVkaW8tPnJ1bm5pbmcpCi0JCWdvdG8gZG9uZTsKLQotCWlmIChuZWVkZWQgJiYgIWF1ZGlvLT53Zmx1c2gpIHsKLQkJLyogV2Ugd2VyZSBjYWxsZWQgZnJvbSB0aGUgY2FsbGJhY2sgYmVjYXVzZSB0aGUgRFNQCi0JCSAqIHJlcXVlc3RlZCBtb3JlIGRhdGEuICBOb3RlIHRoYXQgdGhlIERTUCBkb2VzIHdhbnQKLQkJICogbW9yZSBkYXRhLCBhbmQgaWYgYSBidWZmZXIgd2FzIGluLWZsaWdodCwgbWFyayBpdAotCQkgKiBhcyBhdmFpbGFibGUgKHNpbmNlIHRoZSBEU1AgbXVzdCBub3cgYmUgZG9uZSB3aXRoCi0JCSAqIGl0KS4KLQkJICovCi0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZikgewotCQkJTU1fREJHKCJmcmFtZSAlZCBmcmVlXG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCQkJZnJhbWUtPnVzZWQgPSAwOwotCQkJYXVkaW8tPm91dF90YWlsIF49IDE7Ci0JCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCX0KLQl9Ci0KLQlpZiAoYXVkaW8tPm91dF9uZWVkZWQpIHsKLQkJLyogSWYgdGhlIERTUCBjdXJyZW50bHkgd2FudHMgZGF0YSBhbmQgd2UgaGF2ZSBhCi0JCSAqIGJ1ZmZlciBhdmFpbGFibGUsIHdlIHdpbGwgc2VuZCBpdCBhbmQgcmVzZXQKLQkJICogdGhlIG5lZWRlZCBmbGFnLiAgV2UnbGwgbWFyayB0aGUgYnVmZmVyIGFzIGluLWZsaWdodAotCQkgKiBzbyB0aGF0IGl0IHdvbid0IGJlIHJlY3ljbGVkIHVudGlsIHRoZSBuZXh0IGJ1ZmZlcgotCQkgKiBpcyByZXF1ZXN0ZWQKLQkJICovCi0KLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQpIHsKLQkJCUJVR19PTihmcmFtZS0+dXNlZCA9PSAweGZmZmZmZmZmKTsKLQkJCU1NX0RCRygiZnJhbWUgJWQgYnVzeVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJCWF1ZHBsYXlfZHNwX3NlbmRfZGF0YV9hdmFpbChhdWRpbywgYXVkaW8tPm91dF90YWlsLAotCQkJCQkJICAgIGZyYW1lLT51c2VkKTsKLQkJCWZyYW1lLT51c2VkID0gMHhmZmZmZmZmZjsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJfQotCX0KLWRvbmU6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZGV2aWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdm9pZCBhdWRldnJjX2ZsdXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JYXVkaW8tPm91dFswXS51c2VkID0gMDsKLQlhdWRpby0+b3V0WzFdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRfaGVhZCA9IDA7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9ieXRlcywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGV2cmNfZmx1c2hfcGNtX2J1ZihzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVpbnQ4X3QgaW5kZXg7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBQQ01fQlVGX01BWF9DT1VOVDsgaW5kZXgrKykKLQkJYXVkaW8tPmluW2luZGV4XS51c2VkID0gMDsKLQotCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDA7Ci0JYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGV2cmNfaW9wb3J0X3Jlc2V0KHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JLyogTWFrZSBzdXJlIHJlYWQvd3JpdGUgdGhyZWFkIGFyZSBmcmVlIGZyb20KLQkgKiBzbGVlcCBhbmQga25vd2luZyB0aGF0IHN5c3RlbSBpcyBub3QgYWJsZQotCSAqIHRvIHByb2Nlc3MgaW8gcmVxdWVzdCBhdCB0aGUgbW9tZW50Ci0JICovCi0Jd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlhdWRldnJjX2ZsdXNoKGF1ZGlvKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlhdWRldnJjX2ZsdXNoX3BjbV9idWYoYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JYXVkaW8tPmF2c3luY19mbGFnID0gMTsKLQl3YWtlX3VwKCZhdWRpby0+YXZzeW5jX3dhaXQpOwotfQotCi1zdGF0aWMgaW50IGF1ZGV2cmNfZXZlbnRzX3BlbmRpbmcoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlbXB0eTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWVtcHR5ID0gIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gZW1wdHkgfHwgYXVkaW8tPmV2ZW50X2Fib3J0OwotfQotCi1zdGF0aWMgdm9pZCBhdWRldnJjX3Jlc2V0X2V2ZW50X3F1ZXVlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYXVkZXZyY19ldmVudCAqZHJ2X2V2dDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmV2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWRldnJjX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCXN0cnVjdCBhdWRldnJjX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKLX0KLQotCi1zdGF0aWMgbG9uZyBhdWRldnJjX3Byb2Nlc3NfZXZlbnRfcmVxKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHZvaWQgX191c2VyICphcmcpCi17Ci0JbG9uZyByYzsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50IHVzcl9ldnQ7Ci0Jc3RydWN0IGF1ZGV2cmNfZXZlbnQgKmRydl9ldnQgPSBOVUxMOwotCWludCB0aW1lb3V0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnVzcl9ldnQsIGFyZywgc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fZXZlbnQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQl0aW1lb3V0ID0gKGludCkgdXNyX2V2dC50aW1lb3V0X21zOwotCi0JaWYgKHRpbWVvdXQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCi0JCQlhdWRpby0+ZXZlbnRfd2FpdCwgYXVkZXZyY19ldmVudHNfcGVuZGluZyhhdWRpbyksCi0JCQltc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9IGVsc2UgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCWF1ZGlvLT5ldmVudF93YWl0LCBhdWRldnJjX2V2ZW50c19wZW5kaW5nKGF1ZGlvKSk7Ci0JfQotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGF1ZGlvLT5ldmVudF9hYm9ydCkgewotCQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAwOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyYyA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSkpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkZXZyY19ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQl9Ci0JaWYgKGRydl9ldnQpIHsKLQkJdXNyX2V2dC5ldmVudF90eXBlID0gZHJ2X2V2dC0+ZXZlbnRfdHlwZTsKLQkJdXNyX2V2dC5ldmVudF9wYXlsb2FkID0gZHJ2X2V2dC0+cGF5bG9hZDsKLQkJbGlzdF9hZGRfdGFpbCgmZHJ2X2V2dC0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQl9IGVsc2UKLQkJcmMgPSAtMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFyYyAmJiBjb3B5X3RvX3VzZXIoYXJnLCAmdXNyX2V2dCwgc2l6ZW9mKHVzcl9ldnQpKSkKLQkJcmMgPSAtRUZBVUxUOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2VuYWJsZV9lcShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCWlmIChhdWRpby0+ZXFfZW5hYmxlID09IGVuYWJsZSAmJiAhYXVkaW8tPmVxX25lZWRzX2NvbW1pdCkKLQkJcmV0dXJuIDA7Ci0KLQlhdWRpby0+ZXFfZW5hYmxlID0gZW5hYmxlOwotCi0JaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCWF1ZHBwX2RzcF9zZXRfZXEoYXVkaW8tPmRlY19pZCwgZW5hYmxlLCAmYXVkaW8tPmVxLCBQT1BQKTsKLQkJYXVkaW8tPmVxX25lZWRzX2NvbW1pdCA9IDA7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2dldF9hdnN5bmNfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQkJCQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyAqc3RhdHMpCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlmIChhdWRpby0+ZGVjX2lkID09IGF1ZGlvLT5hdnN5bmNbMF0gJiYgYXVkaW8tPmF2c3luY19mbGFnKSB7Ci0JCS8qIGF2X3N5bmMgc2FtcGxlIGNvdW50ICovCi0JCXN0YXRzLT5zYW1wbGVfY291bnQgPSAoYXVkaW8tPmF2c3luY1syXSA8PCAxNikgfAotCQkJCQkJKGF1ZGlvLT5hdnN5bmNbM10pOwotCi0JCS8qIGF2X3N5bmMgYnl0ZV9jb3VudCAqLwotCQlzdGF0cy0+Ynl0ZV9jb3VudCA9IChhdWRpby0+YXZzeW5jWzVdIDw8IDE2KSB8Ci0JCQkJCQkoYXVkaW8tPmF2c3luY1s2XSk7Ci0KLQkJYXVkaW8tPmF2c3luY19mbGFnID0gMDsKLQkJcmMgPSAwOwotCX0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIHJjOwotCi19Ci0KLXN0YXRpYyBsb25nIGF1ZGV2cmNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQl1aW50MTZfdCBlbmFibGVfbWFzazsKLQlpbnQgZW5hYmxlOwotCWludCBwcmV2X3N0YXRlOwotCi0JTU1fREJHKCJjbWQgPSAlZFxuIiwgY21kKTsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX1NUQVRTKSB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0KLQkJYXVkaW8tPmF2c3luY19mbGFnID0gMDsKLQkJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7Ci0JCWlmIChhdWRwcF9xdWVyeV9hdnN5bmMoYXVkaW8tPmRlY19pZCkgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPmF2c3luY193YWl0LAotCQkJCShhdWRpby0+YXZzeW5jX2ZsYWcgPT0gMSksCi0JCQkJbXNlY3NfdG9famlmZmllcyhBVURQUF9BVlNZTkNfRVZFTlRfVElNRU9VVCkpOwotCi0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JCWVsc2UgaWYgKChyYyA+IDApIHx8ICgocmMgPT0gMCkgJiYgKGF1ZGlvLT5hdnN5bmNfZmxhZyA9PSAxKSkpIHsKLQkJCWlmIChhdWRpb19nZXRfYXZzeW5jX2RhdGEoYXVkaW8sICZzdGF0cykgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UKLQkJCXJldHVybiAtRUFHQUlOOwotCX0KLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19FTkFCTEVfQVVEUFA6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZW5hYmxlX21hc2ssICh2b2lkICopIGFyZywKLQkJCQkJCXNpemVvZihlbmFibGVfbWFzaykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJZW5hYmxlID0gKGVuYWJsZV9tYXNrICYgRVFfRU5BQkxFKSA/IDEgOiAwOwotCQlhdWRpb19lbmFibGVfZXEoYXVkaW8sIGVuYWJsZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX1ZPTFVNRToKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+dm9sX3Bhbi52b2x1bWUgPSBhcmc7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihhdWRpby0+ZGVjX2lkLCAmYXVkaW8tPnZvbF9wYW4sCi0JCQkJCVBPUFApOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fU0VUX1BBTjoKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+dm9sX3Bhbi5wYW4gPSBhcmc7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihhdWRpby0+ZGVjX2lkLCAmYXVkaW8tPnZvbF9wYW4sCi0JCQkJCVBPUFApOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fU0VUX0VROgotCQlwcmV2X3N0YXRlID0gYXVkaW8tPmVxX2VuYWJsZTsKLQkJYXVkaW8tPmVxX2VuYWJsZSA9IDA7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYXVkaW8tPmVxLm51bV9iYW5kcywgKHZvaWQgKikgYXJnLAotCQkJCXNpemVvZihhdWRpby0+ZXEpIC0KLQkJCQkoQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TX0NPTU1PTl9MRU4gKyAyKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWF1ZGlvLT5lcV9lbmFibGUgPSBwcmV2X3N0YXRlOwotCQlhdWRpby0+ZXFfbmVlZHNfY29tbWl0ID0gMTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoLUVJTlZBTCAhPSByYykKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfRVZFTlQpIHsKLQkJTU1fREJHKCJBVURJT19HRVRfRVZFTlRcbiIpOwotCQlpZiAobXV0ZXhfdHJ5bG9jaygmYXVkaW8tPmdldF9ldmVudF9sb2NrKSkgewotCQkJcmMgPSBhdWRldnJjX3Byb2Nlc3NfZXZlbnRfcmVxKGF1ZGlvLAotCQkJCQkodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQkJfSBlbHNlCi0JCQlyYyA9IC1FQlVTWTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmIChjbWQgPT0gQVVESU9fQUJPUlRfR0VUX0VWRU5UKSB7Ci0JCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDoKLQkJTU1fREJHKCJBVURJT19TVEFSVFxuIik7Ci0JCXJjID0gYXVkZXZyY19lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUsCi0JCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0RFQ09ERVJfV0FJVF9NUykpOwotCQkJTU1fSU5GTygiZGVjX3N0YXRlICVkIHJjID0gJWRcbiIsIGF1ZGlvLT5kZWNfc3RhdGUsIHJjKTsKLQotCQkJaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1MpCi0JCQkJcmMgPSAtRU5PREVWOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NUT1A6Ci0JCU1NX0RCRygiQVVESU9fU1RPUFxuIik7Ci0JCXJjID0gYXVkZXZyY19kaXNhYmxlKGF1ZGlvKTsKLQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQlhdWRldnJjX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19GTFVTSDoKLQkJTU1fREJHKCJBVURJT19GTFVTSFxuIik7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAxOwotCQlhdWRpby0+d2ZsdXNoID0gMTsKLQkJYXVkZXZyY19pb3BvcnRfcmVzZXQoYXVkaW8pOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpIHsKLQkJCWF1ZHBwX2ZsdXNoKGF1ZGlvLT5kZWNfaWQpOwotCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJIWF1ZGlvLT53Zmx1c2gpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCU1NX0VSUigiQVVESU9fRkxVU0ggaW50ZXJydXB0ZWRcbiIpOwotCQkJCXJjID0gLUVJTlRSOwotCQkJfQotCQl9IGVsc2UgewotCQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkJKCZjb25maWcsICh2b2lkICopYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlhdWRpby0+bWZpZWxkID0gY29uZmlnLm1ldGFfZmllbGQ7Ci0JCQlyYyA9IDA7Ci0JCQlNTV9EQkcoIkFVRElPX1NFVF9DT05GSUcgYXBwbGljYWJsZSBvbmx5IFwKLQkJCQlmb3IgbWV0YSBmaWVsZCBjb25maWd1cmF0aW9uXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19HRVRfQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IEJVRlNaOwotCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IDI7Ci0JCQljb25maWcuc2FtcGxlX3JhdGUgPSA4MDAwOwotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSAxOwotCQkJY29uZmlnLm1ldGFfZmllbGQgPSAwOwotCQkJY29uZmlnLnVudXNlZFswXSA9IDA7Ci0JCQljb25maWcudW51c2VkWzFdID0gMDsKLQkJCWNvbmZpZy51bnVzZWRbMl0gPSAwOwotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fR0VUX1BDTV9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19wY21fY29uZmlnIGNvbmZpZzsKLQkJCWNvbmZpZy5wY21fZmVlZGJhY2sgPSBhdWRpby0+cGNtX2ZlZWRiYWNrOwotCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfTUFYX0NPVU5UOwotCQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjb25maWcsIHNpemVvZihjb25maWcpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX1NFVF9QQ01fQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fcGNtX2NvbmZpZyBjb25maWc7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIKLQkJCSAgICAoJmNvbmZpZywgKHZvaWQgKilhcmcsIHNpemVvZihjb25maWcpKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjb25maWcucGNtX2ZlZWRiYWNrICE9IGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJCQlNTV9FUlIoIk5vdCBzdWZmaWNpZW50IHBlcm1pc3Npb24gdG8iCi0JCQkJCSAiY2hhbmdlIHRoZSBwbGF5YmFjayBtb2RlXG4iKTsKLQkJCQlyYyA9IC1FQUNDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoKGNvbmZpZy5idWZmZXJfY291bnQgPiBQQ01fQlVGX01BWF9DT1VOVCkgfHwKLQkJCSAgICAoY29uZmlnLmJ1ZmZlcl9jb3VudCA9PSAxKSkKLQkJCQljb25maWcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9NQVhfQ09VTlQ7Ci0KLQkJCWlmIChjb25maWcuYnVmZmVyX3NpemUgPCBQQ01fQlVGU1pfTUlOKQotCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47Ci0KLQkJCS8qIENoZWNrIGlmIHBjbSBmZWVkYmFjayBpcyByZXF1aXJlZCAqLwotCQkJaWYgKChjb25maWcucGNtX2ZlZWRiYWNrKSAmJiAoIWF1ZGlvLT5yZWFkX2RhdGEpKSB7Ci0JCQkJTU1fREJHKCJhbGxvY2F0ZSBQQ00gYnVmICVkXG4iLAotCQkJCQljb25maWcuYnVmZmVyX2NvdW50ICoKLQkJCQkJY29uZmlnLmJ1ZmZlcl9zaXplKTsKLQkJCQlhdWRpby0+cmVhZF9waHlzID0KLQkJCQkJCSBhbGxvY2F0ZV9jb250aWd1b3VzX2ViaV9ub21hcCgKLQkJCQkJCQljb25maWcuYnVmZmVyX3NpemUgKgotCQkJCQkJCWNvbmZpZy5idWZmZXJfY291bnQsCi0JCQkJCQkJU1pfNEspOwotCQkJCWlmICghYXVkaW8tPnJlYWRfcGh5cykgewotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlhdWRpby0+bWFwX3ZfcmVhZCA9IGlvcmVtYXAoCi0JCQkJCQkJYXVkaW8tPnJlYWRfcGh5cywKLQkJCQkJCQljb25maWcuYnVmZmVyX3NpemUgKgotCQkJCQkJCWNvbmZpZy5idWZmZXJfY291bnQpOwotCQkJCWlmIChJU19FUlIoYXVkaW8tPm1hcF92X3JlYWQpKSB7Ci0JCQkJCU1NX0VSUigiZmFpbGVkIHRvIG1hcCByZWFkIgotCQkJCQkJCSIgcGh5IGFkZHJlc3NcbiIpOwotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoCi0JCQkJCQkJYXVkaW8tPnJlYWRfcGh5cyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdWludDhfdCBpbmRleDsKLQkJCQkJdWludDMyX3Qgb2Zmc2V0ID0gMDsKLQkJCQkJYXVkaW8tPnJlYWRfZGF0YSA9Ci0JCQkJCQlhdWRpby0+bWFwX3ZfcmVhZDsKLQkJCQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQkJCQkJYXVkaW8tPnBjbV9idWZfY291bnQgPQotCQkJCQkgICAgY29uZmlnLmJ1ZmZlcl9jb3VudDsKLQkJCQkJYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JCQkJCWF1ZGlvLT5maWxsX25leHQgPSAwOwotCi0JCQkJCWZvciAoaW5kZXggPSAwOwotCQkJCQkgICAgIGluZGV4IDwgY29uZmlnLmJ1ZmZlcl9jb3VudDsKLQkJCQkJICAgICBpbmRleCsrKSB7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLmRhdGEgPQotCQkJCQkJICAgIGF1ZGlvLT5yZWFkX2RhdGEgKyBvZmZzZXQ7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLmFkZHIgPQotCQkJCQkJICAgIGF1ZGlvLT5yZWFkX3BoeXMgKyBvZmZzZXQ7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLnNpemUgPQotCQkJCQkJICAgIGNvbmZpZy5idWZmZXJfc2l6ZTsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0udXNlZCA9IDA7Ci0JCQkJCQlvZmZzZXQgKz0gY29uZmlnLmJ1ZmZlcl9zaXplOwotCQkJCQl9Ci0JCQkJCU1NX0RCRygicmVhZCBidWY6IHBoeSBhZGRyIFwKLQkJCQkJCTB4JTA4eCBrZXJuZWwgYWRkciAweCUwOHhcbiIsCi0JCQkJCQlhdWRpby0+cmVhZF9waHlzLAotCQkJCQkJKGludClhdWRpby0+cmVhZF9kYXRhKTsKLQkJCQkJcmMgPSAwOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmMgPSAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX1BBVVNFOgotCQlNTV9EQkcoIkFVRElPX1BBVVNFICVsZFxuIiwgYXJnKTsKLQkJcmMgPSBhdWRwcF9wYXVzZShhdWRpby0+ZGVjX2lkLCAoaW50KSBhcmcpOwotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9TRVNTSU9OX0lEOgotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmF1ZGlvLT5kZWNfaWQsCi0JCQkJc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIE9ubHkgdXNlZnVsIGluIHR1bm5lbC1tb2RlICovCi1zdGF0aWMgaW50IGF1ZGV2cmNfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBwcG9zMSwgbG9mZl90IHBwb3MyLCBpbnQgZGF0YXN5bmMpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoIWF1ZGlvLT5ydW5uaW5nIHx8IGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmVfbm9sb2NrOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoIWF1ZGlvLT5vdXRbMF0udXNlZCAmJgotCQkhYXVkaW8tPm91dFsxXS51c2VkICYmCi0JCWF1ZGlvLT5vdXRfbmVlZGVkKSB8fCBhdWRpby0+d2ZsdXNoKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQllbHNlIGlmIChhdWRpby0+d2ZsdXNoKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogcGNtIGRtYW1pc3MgbWVzc2FnZSBpcyBzZW50IGNvbnRpbm91c2x5Ci0JICogd2hlbiBkZWNvZGVyIGlzIHN0YXJ2ZWQgc28gbm8gcmFjZQotCSAqIGNvbmRpdGlvbiBjb25jZXJuCi0JICovCi0JYXVkaW8tPnRlb3MgPSAwOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCWF1ZGlvLT50ZW9zIHx8IGF1ZGlvLT53Zmx1c2gpOwotCi0JaWYgKGF1ZGlvLT53Zmx1c2gpCi0JCXJjID0gLUVCVVNZOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotZG9uZV9ub2xvY2s6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRldnJjX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCSAgICBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlpbnQgcmMgPSAwOwotCWlmICghYXVkaW8tPnBjbV9mZWVkYmFjaykgewotCQlyZXR1cm4gMDsKLQkJLyogUENNIGZlZWRiYWNrIGlzIG5vdCBlbmFibGVkLiBOb3RoaW5nIHRvIHJlYWQgKi8KLQl9Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT5yZWFkX3dhaXQsCi0JCQkJKGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkID4gMCkgfHwKLQkJCQkoYXVkaW8tPnN0b3BwZWQpIHx8IChhdWRpby0+cmZsdXNoKSk7Ci0KLQkJTU1fREJHKCJ3YWl0IHRlcm1pbmF0ZWQgXG4iKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPnJmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY291bnQgPCBhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCkgewotCQkJLyogUmVhZCBtdXN0IGhhcHBlbiBpbiBmcmFtZSBib3VuZGFyeS4gU2luY2UgZHJpdmVyIGRvZXMKLQkJCSAqIG5vdCBrbm93IGZyYW1lIHNpemUsIHJlYWQgY291bnQgbXVzdCBiZSBncmVhdGVyIG9yCi0JCQkgKiBlcXVhbCB0byBzaXplIG9mIFBDTSBzYW1wbGVzCi0JCQkgKi8KLQkJCU1NX0RCRygicmVhZCBzdG9wIC0gcGFydGlhbCBmcmFtZVxuIik7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygicmVhZCBmcm9tIGluWyVkXVxuIiwgYXVkaW8tPnJlYWRfbmV4dCk7Ci0JCQlpZiAoY29weV90b191c2VyCi0JCQkgICAgKGJ1ZiwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLmRhdGEsCi0JCQkgICAgIGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkKSkgewotCQkJCU1NX0VSUigiaW52YWxpZCBhZGRyICV4IFxuIiwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGludClidWYpOwotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNvdW50IC09IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkOwotCQkJYnVmICs9IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkOwotCQkJYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQgPSAwOwotCQkJaWYgKCgrK2F1ZGlvLT5yZWFkX25leHQpID09IGF1ZGlvLT5wY21fYnVmX2NvdW50KQotCQkJCWF1ZGlvLT5yZWFkX25leHQgPSAwOwotCQkJYnJlYWs7Ci0JCQkJLyogRm9yY2UgdG8gZXhpdCB3aGlsZSBsb29wCi0JCQkJICogdG8gcHJldmVudCBvdXRwdXQgdGhyZWFkCi0JCQkJICogc2xlZXAgdG9vIGxvbmcgaWYgZGF0YSBpcwotCQkJCSAqIG5vdCByZWFkeSBhdCB0aGlzIG1vbWVudAotCQkJCSAqLwotCi0JCX0KLQl9Ci0JLyogZG9uJ3QgZmVlZCBvdXRwdXQgYnVmZmVyIHRvIEhXIGRlY29kZXIgZHVyaW5nIGZsdXNoaW5nCi0JICogYnVmZmVyIHJlZnJlc2ggY29tbWFuZCB3aWxsIGJlIHNlbnQgb25jZSBmbHVzaCBjb21wbGV0ZXMKLQkgKiBzZW5kIGJ1ZiByZWZyZXNoIGNvbW1hbmQgaGVyZSBjYW4gY29uZnVzZSBIVyBkZWNvZGVyCi0JICovCi0JaWYgKGF1ZGlvLT5idWZfcmVmcmVzaCAmJiAhYXVkaW8tPnJmbHVzaCkgewotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCQlNTV9EQkcoImtpY2sgc3RhcnQgcGNtIGZlZWRiYWNrIGFnYWluXG4iKTsKLQkJYXVkZXZyY19idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JaWYgKGJ1ZiA+IHN0YXJ0KQotCQlyYyA9IGJ1ZiAtIHN0YXJ0OwotCU1NX0RCRygicmVhZCAlZCBieXRlc1xuIiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRldnJjX3Byb2Nlc3NfZW9zKHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCWNvbnN0IGNoYXIgX191c2VyICpidWZfc3RhcnQsIHVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0KLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKGF1ZGlvLT5vdXRfbmVlZGVkICYmCi0JCWF1ZGlvLT5vdXRbMF0udXNlZCA9PSAwICYmCi0JCWF1ZGlvLT5vdXRbMV0udXNlZCA9PSAwKQotCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoZnJhbWUtPmRhdGEsIGJ1Zl9zdGFydCwgbWZpZWxkX3NpemUpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlmcmFtZS0+dXNlZCA9IG1maWVsZF9zaXplOwotCWF1ZGV2cmNfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGV2cmNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0Jc2l6ZV90IHhmZXI7Ci0JY2hhciAqY3B5X3B0cjsKLQl1bnNpZ25lZCBzaG9ydCBtZmllbGRfc2l6ZSA9IDA7Ci0JaW50IHJjID0gMCwgZW9zX2NvbmRpdGlvbiA9IEFVREVWUkNfRU9TX05PTkU7Ci0KLQlNTV9EQkcoImNudD0lZFxuIiwgY291bnQpOwotCi0JaWYgKGNvdW50ICYgMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0JCWNweV9wdHIgPSBmcmFtZS0+ZGF0YTsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJCSAgICAgIChmcmFtZS0+dXNlZCA9PSAwKQotCQkJCQkJfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQkJCQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChhdWRpby0+bWZpZWxkKSB7Ci0JCQlpZiAoYnVmID09IHN0YXJ0KSB7Ci0JCQkJLyogUHJvY2Vzc2luZyBiZWdpbm5pbmcgb2YgdXNlciBidWZmZXIgKi8KLQkJCQlpZiAoX19nZXRfdXNlcihtZmllbGRfc2l6ZSwKLQkJCQkJKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSBidWYpKSB7Ci0JCQkJCXJjID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIGlmIChtZmllbGRfc2l6ZSA+IGNvdW50KSB7Ci0JCQkJCXJjID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCU1NX0RCRygibWYgb2Zmc2V0X3ZhbCAleFxuIiwgbWZpZWxkX3NpemUpOwotCQkJCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsCi0JCQkJCQkJbWZpZWxkX3NpemUpKSB7Ci0JCQkJCXJjID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8qIENoZWNrIGlmIEVPUyBmbGFnIGlzIHNldCBhbmQgYnVmZmVyIGhhcwotCQkJCSAqIGNvbnRhaW5zIGp1c3QgbWV0YSBmaWVsZAotCQkJCSAqLwotCQkJCWlmIChjcHlfcHRyW0FVREVWUkNfRU9TX0ZMR19PRkZTRVRdICYKLQkJCQkJCUFVREVWUkNfRU9TX0ZMR19NQVNLKSB7Ci0JCQkJCU1NX0RCRygiZW9zIHNldFxuIik7Ci0JCQkJCWVvc19jb25kaXRpb24gPSBBVURFVlJDX0VPU19TRVQ7Ci0JCQkJCWlmIChtZmllbGRfc2l6ZSA9PSBjb3VudCkgewotCQkJCQkJYnVmICs9IG1maWVsZF9zaXplOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZQotCQkJCQljcHlfcHRyW0FVREVWUkNfRU9TX0ZMR19PRkZTRVRdICY9Ci0JCQkJCQl+QVVERVZSQ19FT1NfRkxHX01BU0s7Ci0JCQkJfQotCQkJCSAvKiBDaGVjayBFT1MgdG8gc2VlIGlmICovCi0JCQkJY3B5X3B0ciArPSBtZmllbGRfc2l6ZTsKLQkJCQljb3VudCAtPSBtZmllbGRfc2l6ZTsKLQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQkgfSBlbHNlIHsKLQkJCQkgbWZpZWxkX3NpemUgPSAwOwotCQkJCSBNTV9EQkcoImNvbnRpbnVvdXMgYnVmZmVyXG4iKTsKLQkJCSB9Ci0JCQkgZnJhbWUtPm1maWVsZF9zeiA9IG1maWVsZF9zaXplOwotCQl9Ci0KLQkJeGZlciA9IChjb3VudCA+IChmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSkgPwotCQkJKGZyYW1lLT5zaXplIC0gbWZpZWxkX3NpemUpIDogY291bnQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIHhmZXIpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWZyYW1lLT51c2VkID0geGZlciArIG1maWVsZF9zaXplOwotCQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQkJY291bnQgLT0geGZlcjsKLQkJYnVmICs9IHhmZXI7Ci0JCWF1ZGV2cmNfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQl9Ci0JaWYgKGVvc19jb25kaXRpb24gPT0gQVVERVZSQ19FT1NfU0VUKQotCQlyYyA9IGF1ZGV2cmNfcHJvY2Vzc19lb3MoYXVkaW8sIHN0YXJ0LCBtZmllbGRfc2l6ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JaWYgKCFyYykgewotCQlpZiAoYnVmID4gc3RhcnQpCi0JCQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRldnJjX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCU1NX0lORk8oImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBmcmVlaW5nXG4iLCAoaW50KWF1ZGlvKTsKLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkZGV2X3VucmVnaXN0ZXJfZXZ0X2xpc3RuZXIoQVVEREVWX0NMTlRfREVDLCBhdWRpby0+ZGVjX2lkKTsKLQlhdWRldnJjX2Rpc2FibGUoYXVkaW8pOwotCWF1ZGV2cmNfZmx1c2goYXVkaW8pOwotCWF1ZGV2cmNfZmx1c2hfcGNtX2J1ZihhdWRpbyk7Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRwbGF5KTsKLQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQl1bnJlZ2lzdGVyX2Vhcmx5X3N1c3BlbmQoJmF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlKTsKLSNlbmRpZgotCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDE7Ci0Jd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCWF1ZGV2cmNfcmVzZXRfZXZlbnRfcXVldWUoYXVkaW8pOwotCWlvdW5tYXAoYXVkaW8tPm1hcF92X3dyaXRlKTsKLQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKGF1ZGlvLT5waHlzKTsKLQlpZiAoYXVkaW8tPnJlYWRfZGF0YSkgewotCQlpb3VubWFwKGF1ZGlvLT5tYXBfdl9yZWFkKTsKLQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcihhdWRpby0+cmVhZF9waHlzKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JaWYgKGF1ZGlvLT5kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKGF1ZGlvLT5kZW50cnkpOwotI2VuZGlmCi0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0YXRpYyB2b2lkIGF1ZGV2cmNfcG9zdF9ldmVudChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCkKLXsKLQlzdHJ1Y3QgYXVkZXZyY19ldmVudCAqZV9ub2RlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSkgewotCQllX25vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkZXZyY19ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZlX25vZGUtPmxpc3QpOwotCX0gZWxzZSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRldnJjX2V2ZW50KSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghZV9ub2RlKSB7Ci0JCQlNTV9FUlIoIk5vIG1lbSB0byBwb3N0IGV2ZW50ICVkXG4iLCB0eXBlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWVfbm9kZS0+ZXZlbnRfdHlwZSA9IHR5cGU7Ci0JZV9ub2RlLT5wYXlsb2FkID0gcGF5bG9hZDsKLQotCWxpc3RfYWRkX3RhaWwoJmVfbm9kZS0+bGlzdCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGV2cmNfc3VzcGVuZChzdHJ1Y3QgZWFybHlfc3VzcGVuZCAqaCkKLXsKLQlzdHJ1Y3QgYXVkZXZyY19zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWRldnJjX3N1c3BlbmRfY3RsLCBub2RlKTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlhdWRldnJjX3Bvc3RfZXZlbnQoY3RsLT5hdWRpbywgQVVESU9fRVZFTlRfU1VTUEVORCwgcGF5bG9hZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGV2cmNfcmVzdW1lKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRldnJjX3N1c3BlbmRfY3RsICpjdGwgPQotCQljb250YWluZXJfb2YoaCwgc3RydWN0IGF1ZGV2cmNfc3VzcGVuZF9jdGwsIG5vZGUpOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWF1ZGV2cmNfcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9SRVNVTUUsIHBheWxvYWQpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBzc2l6ZV90IGF1ZGV2cmNfZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRldnJjX2RlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNvbnN0IGludCBkZWJ1Z19idWZtYXggPSAxMDI0OwotCXN0YXRpYyBjaGFyIGJ1ZmZlclsxMDI0XTsKLQlpbnQgbiA9IDAsIGk7Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQluID0gc2NucHJpbnRmKGJ1ZmZlciwgZGVidWdfYnVmbWF4LCAib3BlbmVkICVkXG4iLCBhdWRpby0+b3BlbmVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImVuYWJsZWQgJWRcbiIsIGF1ZGlvLT5lbmFibGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInN0b3BwZWQgJWRcbiIsIGF1ZGlvLT5zdG9wcGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInBjbV9mZWVkYmFjayAlZFxuIiwgYXVkaW8tPnBjbV9mZWVkYmFjayk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJvdXRfYnVmX3N6ICVkXG4iLCBhdWRpby0+b3V0WzBdLnNpemUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicGNtX2J1Zl9jb3VudCAlZCBcbiIsIGF1ZGlvLT5wY21fYnVmX2NvdW50KTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInBjbV9idWZfc3ogJWQgXG4iLCBhdWRpby0+aW5bMF0uc2l6ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJ2b2x1bWUgJXggXG4iLCBhdWRpby0+dm9sX3Bhbi52b2x1bWUpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCS8qIEZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIG9ubHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgd2hlbgotCSAqIHdoZW4gcGxheWJhY2sgaGFsdHMgdW5leHBlY3RlZGx5LiBUaHVzLCBubyBtdXR1YWwgZXhjbHVzaW9uCi0JICogZW5mb3JjZWQKLQkgKi8KLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIndmbHVzaCAlZFxuIiwgYXVkaW8tPndmbHVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJyZmx1c2ggJWRcbiIsIGF1ZGlvLT5yZmx1c2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicnVubmluZyAlZCBcbiIsIGF1ZGlvLT5ydW5uaW5nKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImRlYyBzdGF0ZSAlZCBcbiIsIGF1ZGlvLT5kZWNfc3RhdGUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X25lZWRlZCAlZCBcbiIsIGF1ZGlvLT5vdXRfbmVlZGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dF9oZWFkICVkIFxuIiwgYXVkaW8tPm91dF9oZWFkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dF90YWlsICVkIFxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dFswXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFswXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dFsxXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFsxXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImJ1ZmZlcl9yZWZyZXNoICVkIFxuIiwgYXVkaW8tPmJ1Zl9yZWZyZXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInJlYWRfbmV4dCAlZCBcbiIsIGF1ZGlvLT5yZWFkX25leHQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiZmlsbF9uZXh0ICVkIFxuIiwgYXVkaW8tPmZpbGxfbmV4dCk7Ci0JZm9yIChpID0gMDsgaSA8IGF1ZGlvLT5wY21fYnVmX2NvdW50OyBpKyspCi0JCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJImluWyVkXS5zaXplICVkIFxuIiwgaSwgYXVkaW8tPmluW2ldLnVzZWQpOwotCWJ1ZmZlcltuXSA9IDA7Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGJ1ZmZlciwgbik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGV2cmNfZGVidWdfZm9wcyA9IHsKLQkucmVhZCA9IGF1ZGV2cmNfZGVidWdfcmVhZCwKLQkub3BlbiA9IGF1ZGV2cmNfZGVidWdfb3BlbiwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBhdWRldnJjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IE5VTEw7Ci0JaW50IHJjLCBkZWNfYXR0cmIsIGRlY2lkLCBpOwotCXN0cnVjdCBhdWRldnJjX2V2ZW50ICplX25vZGUgPSBOVUxMOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCi0JY2hhciBuYW1lW3NpemVvZiAibXNtX2V2cmNfIiArIDVdOwotI2VuZGlmCi0KLQkvKiBBbGxvY2F0ZSBhdWRpbyBpbnN0YW5jZSwgc2V0IHRvIHplcm8gKi8KLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpbyksIEdGUF9LRVJORUwpOwotCWlmICghYXVkaW8pIHsKLQkJTU1fRVJSKCJubyBtZW1vcnkgdG8gYWxsb2NhdGUgYXVkaW8gaW5zdGFuY2VcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JTU1fSU5GTygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGNyZWF0ZWRcbiIsIChpbnQpYXVkaW8pOwotCi0JLyogQWxsb2NhdGUgdGhlIGRlY29kZXIgKi8KLQlkZWNfYXR0cmIgPSBBVURERUNfREVDX0VWUkM7Ci0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlkZWNfYXR0cmIgfD0gTVNNX0FVRF9NT0RFX05PTlRVTk5FTDsKLQkJYXVkaW8tPnBjbV9mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERV9QTEFZQkFDSzsKLQl9IGVsc2UgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCSEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9UVU5ORUw7Ci0JCWF1ZGlvLT5wY21fZmVlZGJhY2sgPSBUVU5ORUxfTU9ERV9QTEFZQkFDSzsKLQl9IGVsc2UgewotCQlrZnJlZShhdWRpbyk7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBkb25lOwotCX0KLQlkZWNpZCA9IGF1ZHBwX2FkZWNfYWxsb2MoZGVjX2F0dHJiLCAmYXVkaW8tPm1vZHVsZV9uYW1lLAotCQkJJmF1ZGlvLT5xdWV1ZV9pZCk7Ci0KLQlpZiAoZGVjaWQgPCAwKSB7Ci0JCU1NX0VSUigiTm8gZnJlZSBkZWNvZGVyIGF2YWlsYWJsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJKGludClhdWRpbyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJa2ZyZWUoYXVkaW8pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYXVkaW8tPmRlY19pZCA9IGRlY2lkICYgTVNNX0FVRF9ERUNPREVSX01BU0s7Ci0KLQlhdWRpby0+cGh5cyA9IGFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKERNQVNaLCBTWl80Syk7Ci0JaWYgKCFhdWRpby0+cGh5cykgewotCQlNTV9FUlIoImNvdWxkIG5vdCBhbGxvY2F0ZSB3cml0ZSBidWZmZXJzLCBmcmVlaW5nIGluc3RhbmNlIFwKLQkJCQkweCUwOHhcbiIsIChpbnQpYXVkaW8pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLQkJa2ZyZWUoYXVkaW8pOwotCQlnb3RvIGRvbmU7Ci0JfSBlbHNlIHsKLQkJYXVkaW8tPm1hcF92X3dyaXRlID0gaW9yZW1hcChhdWRpby0+cGh5cywgRE1BU1opOwotCQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl93cml0ZSkpIHsKLQkJCU1NX0VSUigiZmFpbGVkIHRvIG1hcCB3cml0ZSBwaHlzaWNhbCBhZGRyZXNzLCBmcmVlaW5nIFwKLQkJCQkJaW5zdGFuY2UgMHglMDh4XG4iLCAoaW50KWF1ZGlvKTsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPnBoeXMpOwotCQkJYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotCQkJa2ZyZWUoYXVkaW8pOwotCQkJZ290byBkb25lOwotCQl9Ci0JCWF1ZGlvLT5kYXRhID0gYXVkaW8tPm1hcF92X3dyaXRlOwotCQlNTV9EQkcoIndyaXRlIGJ1ZjogcGh5IGFkZHIgMHglMDh4IGtlcm5lbCBhZGRyIDB4JTA4eFxuIiwKLQkJCQlhdWRpby0+cGh5cywgKGludClhdWRpby0+ZGF0YSk7Ci0JfQotCi0JcmMgPSBtc21fYWRzcF9nZXQoYXVkaW8tPm1vZHVsZV9uYW1lLCAmYXVkaW8tPmF1ZHBsYXksCi0JCQkmYXVkcGxheV9hZHNwX29wc19ldnJjLCBhdWRpbyk7Ci0KLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJmYWlsZWQgdG8gZ2V0ICVzIG1vZHVsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJYXVkaW8tPm1vZHVsZV9uYW1lLCAoaW50KWF1ZGlvKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBhbGwgbG9ja3Mgb2YgYXVkaW8gaW5zdGFuY2UgKi8KLQltdXRleF9pbml0KCZhdWRpby0+bG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPndyaXRlX2xvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT5yZWFkX2xvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT5nZXRfZXZlbnRfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmF1ZGlvLT5kc3BfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5hdnN5bmNfd2FpdCk7Ci0KLQlhdWRpby0+b3V0WzBdLmRhdGEgPSBhdWRpby0+ZGF0YSArIDA7Ci0JYXVkaW8tPm91dFswXS5hZGRyID0gYXVkaW8tPnBoeXMgKyAwOwotCWF1ZGlvLT5vdXRbMF0uc2l6ZSA9IEJVRlNaOwotCi0JYXVkaW8tPm91dFsxXS5kYXRhID0gYXVkaW8tPmRhdGEgKyBCVUZTWjsKLQlhdWRpby0+b3V0WzFdLmFkZHIgPSBhdWRpby0+cGh5cyArIEJVRlNaOwotCWF1ZGlvLT5vdXRbMV0uc2l6ZSA9IEJVRlNaOwotCi0JYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gMHgzRkZGOwotCi0JYXVkZXZyY19mbHVzaChhdWRpbyk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQlhdWRpby0+b3BlbmVkID0gMTsKLQotCWF1ZGlvLT5kZXZpY2VfZXZlbnRzID0gQVVEREVWX0VWVF9ERVZfUkRZCi0JCQkJfEFVRERFVl9FVlRfREVWX1JMU3wKLQkJCQlBVURERVZfRVZUX1NUUkVBTV9WT0xfQ0hHOwotCi0JcmMgPSBhdWRkZXZfcmVnaXN0ZXJfZXZ0X2xpc3RuZXIoYXVkaW8tPmRldmljZV9ldmVudHMsCi0JCQkJCUFVRERFVl9DTE5UX0RFQywKLQkJCQkJYXVkaW8tPmRlY19pZCwKLQkJCQkJZXZyY19saXN0bmVyLAotCQkJCQkodm9pZCAqKWF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGxpc3RuZXJcbiIsIF9fZnVuY19fKTsKLQkJZ290byBldmVudF9lcnI7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mIG5hbWUsICJtc21fZXZyY18lMDR4IiwgYXVkaW8tPmRlY19pZCk7Ci0JYXVkaW8tPmRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQlOVUxMLCAodm9pZCAqKSBhdWRpbywgJmF1ZGV2cmNfZGVidWdfZm9wcyk7Ci0KLQlpZiAoSVNfRVJSKGF1ZGlvLT5kZW50cnkpKQotCQlNTV9EQkcoImRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUubGV2ZWwgPSBFQVJMWV9TVVNQRU5EX0xFVkVMX0RJU0FCTEVfRkI7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUucmVzdW1lID0gYXVkZXZyY19yZXN1bWU7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUuc3VzcGVuZCA9IGF1ZGV2cmNfc3VzcGVuZDsKLQlhdWRpby0+c3VzcGVuZF9jdGwuYXVkaW8gPSBhdWRpbzsKLQlyZWdpc3Rlcl9lYXJseV9zdXNwZW5kKCZhdWRpby0+c3VzcGVuZF9jdGwubm9kZSk7Ci0jZW5kaWYKLQlmb3IgKGkgPSAwOyBpIDwgQVVERVZSQ19FVkVOVF9OVU07IGkrKykgewotCQllX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkZXZyY19ldmVudCksIEdGUF9LRVJORUwpOwotCQlpZiAoZV9ub2RlKQotCQkJbGlzdF9hZGRfdGFpbCgmZV9ub2RlLT5saXN0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCQllbHNlIHsKLQkJCU1NX0VSUigiZXZlbnQgcGt0IGFsbG9jIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotZXZlbnRfZXJyOgotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci1lcnI6Ci0JaW91bm1hcChhdWRpby0+bWFwX3Zfd3JpdGUpOwotCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPnBoeXMpOwotCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19ldnJjX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSBhdWRldnJjX29wZW4sCi0JLnJlbGVhc2UgPSBhdWRldnJjX3JlbGVhc2UsCi0JLnJlYWQgPSBhdWRldnJjX3JlYWQsCi0JLndyaXRlID0gYXVkZXZyY193cml0ZSwKLQkudW5sb2NrZWRfaW9jdGwgPSBhdWRldnJjX2lvY3RsLAotCS5mc3luYyA9IGF1ZGV2cmNfZnN5bmMsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19ldnJjX21pc2MgPSB7Ci0JLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lID0gIm1zbV9ldnJjIiwKLQkuZm9wcyA9ICZhdWRpb19ldnJjX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRldnJjX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fZXZyY19taXNjKTsKLQotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXVkZXZyY19leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZhdWRpb19ldnJjX21pc2MpOwotfQotCi1tb2R1bGVfaW5pdChhdWRldnJjX2luaXQpOwotbW9kdWxlX2V4aXQoYXVkZXZyY19leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gRVZSQyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fZXZyY19pbi5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19ldnJjX2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOWIxZmEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19ldnJjX2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTg0ICswLDAgQEAKLS8qCi0gKiBldnJjIGF1ZGlvIGlucHV0IGRldmljZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19xY3AuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtb3J5X2FsbG9jLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdS5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXVfZG9tYWlucy5oPgotI2luY2x1ZGUgPG1hY2gvc29jaW5mby5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHJlY2NtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRyZWNtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkcHJlcHJvYy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19kZXZfY3RsLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX21lbXR5cGVzLmg+Ci0KLSNkZWZpbmUgTUVUQV9PVVRfU0laRQkyNAotLyogRlJBTUVfTlVNIG11c3QgYmUgYSBwb3dlciBvZiB0d28gKi8KLSNkZWZpbmUgRlJBTUVfTlVNCTgKLSNkZWZpbmUgRVZSQ19GUkFNRV9TSVpFCTM2IC8qIDM2IGJ5dGVzIGRhdGEgKi8KLSNkZWZpbmUgRlJBTUVfU0laRQkoMjIgKiAyKSAvKiAzNiBieXRlcyBkYXRhICovCi0gLyogMzYgYnl0ZXMgZGF0YSAgKyAyNCBtZXRhIGZpZWxkKi8KLSNkZWZpbmUgTlRfRlJBTUVfU0laRQkoRVZSQ19GUkFNRV9TSVpFICsgTUVUQV9PVVRfU0laRSkKLSNkZWZpbmUgRE1BU1oJCShOVF9GUkFNRV9TSVpFICogRlJBTUVfTlVNKQotI2RlZmluZSBPVVRfRlJBTUVfTlVNCTIKLSNkZWZpbmUgT1VUX0JVRkZFUl9TSVpFICg0ICogMTAyNCArIE1FVEFfT1VUX1NJWkUpCi0jZGVmaW5lIEJVRkZFUl9TSVpFCShPVVRfQlVGRkVSX1NJWkUgKiBPVVRfRlJBTUVfTlVNKQotCi0jZGVmaW5lIEFVRFBSRVBST0NfRVZSQ19FT1NfRkxHX09GRlNFVCAweDBBIC8qIE9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBidWZmZXIqLwotI2RlZmluZSBBVURQUkVQUk9DX0VWUkNfRU9TX0ZMR19NQVNLIDB4MDEKLSNkZWZpbmUgQVVEUFJFUFJPQ19FVlJDX0VPU19OT05FIDB4MCAvKiBObyBFT1MgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgQVVEUFJFUFJPQ19FVlJDX0VPU19TRVQgMHgxIC8qIEVPUyBzZXQgaW4gbWV0YSBmaWVsZCAqLwotCi1zdHJ1Y3QgYnVmZmVyIHsKLQl2b2lkICpkYXRhOwotCXVpbnQzMl90IHNpemU7Ci0JdWludDMyX3QgcmVhZDsKLQl1aW50MzJfdCBhZGRyOwotCXVpbnQzMl90IHVzZWQ7Ci0JdWludDMyX3QgbWZpZWxkX3N6OwotfTsKLQotc3RydWN0IGF1ZGlvX2luIHsKLQlzdHJ1Y3QgYnVmZmVyIGluW0ZSQU1FX05VTV07Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JYXRvbWljX3QgaW5fYnl0ZXM7Ci0JYXRvbWljX3QgaW5fc2FtcGxlczsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtdXRleCByZWFkX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X2VuYWJsZTsKLQkvKndyaXRlIHNlY3Rpb24qLwotCXN0cnVjdCBidWZmZXIgb3V0W09VVF9GUkFNRV9OVU1dOwotCi0JdWludDhfdCBvdXRfaGVhZDsKLQl1aW50OF90IG91dF90YWlsOwotCXVpbnQ4X3Qgb3V0X25lZWRlZDsJLyogbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGRzcCBpcyB3YWl0aW5nIGZvciAqLwotCXVpbnQzMl90IG91dF9jb3VudDsKLQotCXN0cnVjdCBtdXRleCB3cml0ZV9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlX3dhaXQ7Ci0JaW50MzJfdCBvdXRfcGh5czsgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB3cml0ZSBidWZmZXIgKi8KLQljaGFyICpvdXRfZGF0YTsKLQlpbnQgbWZpZWxkOyAvKiBtZXRhIGZpZWxkIGVtYmVkZGVkIGluIGRhdGEgKi8KLQlpbnQgd2ZsdXNoOyAvKndyaXRlIGZsdXNoICovCi0JaW50IHJmbHVzaDsgLypyZWFkIGZsdXNoKi8KLQlpbnQgb3V0X2ZyYW1lX2NudDsKLQotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKmF1ZHJlYzsKLQotCXN0cnVjdCBhdWRyZWNfc2Vzc2lvbl9pbmZvIHNlc3Npb25faW5mbzsgLyphdWRyZWMgc2Vzc2lvbiBpbmZvKi8KLQotCS8qIGNvbmZpZ3VyYXRpb24gdG8gdXNlIG9uIG5leHQgZW5hYmxlICovCi0JdWludDMyX3QgYnVmZmVyX3NpemU7IC8qIEZyYW1lIHNpemUgKDM2IGJ5dGVzKSAqLwotCXVpbnQzMl90IHNhbXBfcmF0ZTsKLQl1aW50MzJfdCBjaGFubmVsX21vZGU7Ci0JdWludDMyX3QgZW5jX3R5cGU7Ci0KLQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZyBjZmc7Ci0KLQl1aW50MzJfdCBkc3BfY250OwotCXVpbnQzMl90IGluX2hlYWQ7IC8qIG5leHQgYnVmZmVyIGRzcCB3aWxsIHdyaXRlICovCi0JdWludDMyX3QgaW5fdGFpbDsgLyogbmV4dCBidWZmZXIgcmVhZCgpIHdpbGwgcmVhZCAqLwotCXVpbnQzMl90IGluX2NvdW50OyAvKiBudW1iZXIgb2YgYnVmZmVycyBhdmFpbGFibGUgdG8gcmVhZCgpICovCi0JdWludDMyX3QgbW9kZTsKLQl1aW50MzJfdCBlb3NfYWNrOwotCXVpbnQzMl90IGZsdXNoX2FjazsKLQotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIHF1ZXVlX2lkczsKLQl1aW50MTZfdCBlbmNfaWQ7Ci0KLQl1aW50MTZfdCBzb3VyY2U7IC8qIEVuY29kaW5nIHNvdXJjZSBiaXQgbWFzayAqLwotCXVpbnQzMl90IGRldmljZV9ldmVudHM7Ci0JdWludDMyX3QgaW5fY2FsbDsKLQl1aW50MzJfdCBkZXZfY250OwotCWludCB2b2ljZV9zdGF0ZTsKLQlzcGlubG9ja190IGRldl9sb2NrOwotCi0JLyogZGF0YSBhbGxvY2F0ZWQgZm9yIHZhcmlvdXMgYnVmZmVycyAqLwotCWNoYXIgKmRhdGE7Ci0JZG1hX2FkZHJfdCBwaHlzOwotCXZvaWQgKm1hcF92X3JlYWQ7Ci0Jdm9pZCAqbWFwX3Zfd3JpdGU7Ci0JaW50IG9wZW5lZDsKLQlpbnQgZW5hYmxlZDsKLQlpbnQgcnVubmluZzsKLQlpbnQgc3RvcHBlZDsgLyogc2V0IHdoZW4gc3RvcHBlZCwgY2xlYXJlZCBvbiBmbHVzaCAqLwotCWNoYXIgKmJ1aWxkX2lkOwotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQ7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmlucHV0X2J1ZmZfaGFuZGxlOwotCXN0cnVjdCBpb25faGFuZGxlICpvdXRwdXRfYnVmZl9oYW5kbGU7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fZnJhbWUgewotCXVpbnQxNl90IGZyYW1lX2NvdW50X2xzdzsKLQl1aW50MTZfdCBmcmFtZV9jb3VudF9tc3c7Ci0JdWludDE2X3QgZnJhbWVfbGVuZ3RoOwotCXVpbnQxNl90IGVyYXNlZF9wY207Ci0JdW5zaWduZWQgY2hhciByYXdfYml0c3RyZWFtW107IC8qIHNhbXBsZXMgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBhdWRpb19mcmFtZV9udCB7Ci0JdWludDE2X3QgbWV0YWRhdGFfbGVuOwotCXVpbnQxNl90IGZyYW1lX2NvdW50X2xzdzsKLQl1aW50MTZfdCBmcmFtZV9jb3VudF9tc3c7Ci0JdWludDE2X3QgZnJhbWVfbGVuZ3RoOwotCXVpbnQxNl90IGVyYXNlZF9wY207Ci0JdWludDE2X3QgcmVzZXJ2ZWQ7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9kd29yZF9sc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9kd29yZF9tc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9sc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9tc3c7Ci0JdWludDE2X3QgbmZsYWdfbHN3OwotCXVpbnQxNl90IG5mbGFnX21zdzsKLQl1bnNpZ25lZCBjaGFyIHJhd19iaXRzdHJlYW1bXTsgLyogc2FtcGxlcyAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGV2cmNfZW5jb2RlZF9tZXRhX291dCB7Ci0JdWludDE2X3QgbWV0YWRhdGFfbGVuOwotCXVpbnQxNl90IHRpbWVfc3RhbXBfZHdvcmRfbHN3OwotCXVpbnQxNl90IHRpbWVfc3RhbXBfZHdvcmRfbXN3OwotCXVpbnQxNl90IHRpbWVfc3RhbXBfbHN3OwotCXVpbnQxNl90IHRpbWVfc3RhbXBfbXN3OwotCXVpbnQxNl90IG5mbGFnX2xzdzsKLQl1aW50MTZfdCBuZmxhZ19tc3c7Ci19OwotCi0vKiBBdWRyZWMgUXVldWUgY29tbWFuZCBzZW50IG1hY3JvJ3MgKi8KLSNkZWZpbmUgYXVkcmVjX3NlbmRfYml0c3RyZWFtcXVldWUoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHJlYywgKChhdWRpby0+cXVldWVfaWRzICYgMHhGRkZGMDAwMCkgPj4gMTYpLFwKLQkJCWNtZCwgbGVuKQotCi0jZGVmaW5lIGF1ZHJlY19zZW5kX2F1ZHJlY3F1ZXVlKGF1ZGlvLCBjbWQsIGxlbikgXAotCW1zbV9hZHNwX3dyaXRlKGF1ZGlvLT5hdWRyZWMsIChhdWRpby0+cXVldWVfaWRzICYgMHgwMDAwRkZGRiksXAotCQkJY21kLCBsZW4pCi0KLS8qIERTUCBjb21tYW5kIHNlbmQgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IGF1ZGV2cmNfaW5fZW5jX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLCBpbnQgZW5hYmxlKTsKLXN0YXRpYyBpbnQgYXVkZXZyY19pbl9wYXJhbV9jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbyk7Ci1zdGF0aWMgaW50IGF1ZGV2cmNfaW5fbWVtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLXN0YXRpYyBpbnQgYXVkZXZyY19pbl9yZWNvcmRfY29uZmlnKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sIGludCBlbmFibGUpOwotc3RhdGljIGludCBhdWRldnJjX2RzcF9yZWFkX2J1ZmZlcihzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLCB1aW50MzJfdCByZWFkX2NudCk7Ci0KLXN0YXRpYyB2b2lkIGF1ZGV2cmNfaW5fZ2V0X2RzcF9mcmFtZXMoc3RydWN0IGF1ZGlvX2luICphdWRpbyk7Ci1zdGF0aWMgaW50IGF1ZHBjbV9jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRldnJjX291dF9mbHVzaChzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLXN0YXRpYyBpbnQgYXVkcHJlcHJvY19jbWRfY2ZnX3JvdXRpbmdfbW9kZShzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZHByZXByb2NfcGNtX3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpOwotc3RhdGljIHZvaWQgYXVkZXZyY19udF9pbl9nZXRfZHNwX2ZyYW1lcyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLQotc3RhdGljIHZvaWQgYXVkZXZyY19pbl9mbHVzaChzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLQotc3RhdGljIHZvaWQgZXZyY19pbl9saXN0ZW5lcih1MzIgZXZ0X2lkLCB1bmlvbiBhdWRkZXZfZXZ0X2RhdGEgKmV2dF9wYXlsb2FkLAotCQkJCXZvaWQgKnByaXZhdGVfZGF0YSkKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gKHN0cnVjdCBhdWRpb19pbiAqKSBwcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCU1NX0RCRygiZXZ0X2lkID0gMHglOHhcbiIsIGV2dF9pZCk7Ci0Jc3dpdGNoIChldnRfaWQpIHsKLQljYXNlIEFVRERFVl9FVlRfREVWX1JEWTogewotCQlNTV9EQkcoIkFVRERFVl9FVlRfREVWX1JEWVxuIik7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZGV2X2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPmRldl9jbnQrKzsKLQkJaWYgKCFhdWRpby0+aW5fY2FsbCkKLQkJCWF1ZGlvLT5zb3VyY2UgfD0gKDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCi0JCWlmICgoYXVkaW8tPnJ1bm5pbmcgPT0gMSkgJiYgKGF1ZGlvLT5lbmFibGVkID09IDEpICYmCi0JCQkoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpKQotCQkJYXVkZXZyY19pbl9yZWNvcmRfY29uZmlnKGF1ZGlvLCAxKTsKLQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVEREVWX0VWVF9ERVZfUkxTOiB7Ci0JCU1NX0RCRygiQVVEREVWX0VWVF9ERVZfUkxTXG4iKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+ZGV2X2NudC0tOwotCQlpZiAoIWF1ZGlvLT5pbl9jYWxsKQotCQkJYXVkaW8tPnNvdXJjZSAmPSB+KDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCi0JCWlmICgoIWF1ZGlvLT5ydW5uaW5nKSB8fCAoIWF1ZGlvLT5lbmFibGVkKSkKLQkJCWJyZWFrOwotCi0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkgewotCQkJLyogVHVybiBvZiBhcyBwZXIgc291cmNlICovCi0JCQlpZiAoYXVkaW8tPnNvdXJjZSkKLQkJCQlhdWRldnJjX2luX3JlY29yZF9jb25maWcoYXVkaW8sIDEpOwotCQkJZWxzZQotCQkJCS8qIFR1cm4gb2ZmIGFsbCAqLwotCQkJCWF1ZGV2cmNfaW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMCk7Ci0JCX0KLQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEc6IHsKLQkJTU1fREJHKCJBVURERVZfRVZUX1ZPSUNFX1NUQVRFX0NIRywgc3RhdGUgPSAlZFxuIiwKLQkJCQlldnRfcGF5bG9hZC0+dm9pY2Vfc3RhdGUpOwotCQlhdWRpby0+dm9pY2Vfc3RhdGUgPSBldnRfcGF5bG9hZC0+dm9pY2Vfc3RhdGU7Ci0JCWlmIChhdWRpby0+aW5fY2FsbCAmJiBhdWRpby0+cnVubmluZyAmJgotCQkgICAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpKSB7Ci0JCQlpZiAoYXVkaW8tPnZvaWNlX3N0YXRlID09IFZPSUNFX1NUQVRFX0lOQ0FMTCkKLQkJCQlhdWRldnJjX2luX3JlY29yZF9jb25maWcoYXVkaW8sIDEpOwotCQkJZWxzZSBpZiAoYXVkaW8tPnZvaWNlX3N0YXRlID09IFZPSUNFX1NUQVRFX09GRkNBTEwpIHsKLQkJCQlhdWRldnJjX2luX3JlY29yZF9jb25maWcoYXVkaW8sIDApOwotCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCX0KLQkJfQotCi0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlNTV9FUlIoIndyb25nIGV2ZW50ICVkXG4iLCBldnRfaWQpOwotCQlicmVhazsKLQl9Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZHNwIHByZXByb2MgZXZlbnQgaGFuZGxlci0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgYXVkcHJlcHJvY19kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsICB2b2lkICptc2cpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IGRhdGE7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQUkVQUk9DX0VSUk9SX01TRzogewotCQlzdHJ1Y3QgYXVkcHJlcHJvY19lcnJfbXNnICplcnJfbXNnID0gbXNnOwotCi0JCU1NX0VSUigiRVJST1JfTVNHOiBzdHJlYW0gaWQgJWQgZXJyIGlkeCAlZFxuIiwKLQkJZXJyX21zZy0+c3RyZWFtX2lkLCBlcnJfbXNnLT5hdWRfcHJlcHJvY19lcnJfaWR4KTsKLQkJLyogRXJyb3IgY2FzZSAqLwotCQl3YWtlX3VwKCZhdWRpby0+d2FpdF9lbmFibGUpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURQUkVQUk9DX0NNRF9DRkdfRE9ORV9NU0c6IHsKLQkJTU1fREJHKCJDTURfQ0ZHX0RPTkVfTVNHIFxuIik7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFBSRVBST0NfQ01EX0VOQ19DRkdfRE9ORV9NU0c6IHsKLQkJc3RydWN0IGF1ZHByZXByb2NfY21kX2VuY19jZmdfZG9uZV9tc2cgKmVuY19jZmdfbXNnID0gbXNnOwotCi0JCU1NX0RCRygiQ01EX0VOQ19DRkdfRE9ORV9NU0c6IHN0cmVhbSBpZCAlZCBlbmMgdHlwZSBcCi0JCQkweCU4eFxuIiwgZW5jX2NmZ19tc2ctPnN0cmVhbV9pZCwKLQkJCWVuY19jZmdfbXNnLT5yZWNfZW5jX3R5cGUpOwotCQkvKiBFbmNvZGVyIGVuYWJsZSBzdWNjZXNzICovCi0JCWlmIChlbmNfY2ZnX21zZy0+cmVjX2VuY190eXBlICYgRU5DT0RFX0VOQUJMRSkgewotCQkJaWYoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUwpIHsKLQkJCQlNTV9EQkcoInJvdXRpbmcgY29tbWFuZFxuIik7Ci0JCQkJYXVkcHJlcHJvY19jbWRfY2ZnX3JvdXRpbmdfbW9kZShhdWRpbyk7Ci0JCQl9IGVsc2UgewotCQkJCWF1ZGV2cmNfaW5fcGFyYW1fY29uZmlnKGF1ZGlvKTsKLQkJCX0KLQkJfSBlbHNlIHsgLyogRW5jb2RlciBkaXNhYmxlIHN1Y2Nlc3MgKi8KLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkKLQkJCQlhdWRldnJjX2luX3JlY29yZF9jb25maWcoYXVkaW8sIDApOwotCQkJZWxzZQotCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0X2VuYWJsZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFJFUFJPQ19DTURfRU5DX1BBUkFNX0NGR19ET05FX01TRzogewotCQlNTV9EQkcoIkNNRF9FTkNfUEFSQU1fQ0ZHX0RPTkVfTVNHXG4iKTsKLQkJaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfVFVOTkVMKQotCQkJYXVkZXZyY19pbl9tZW1fY29uZmlnKGF1ZGlvKTsKLQkJZWxzZQotCQkJYXVkcGNtX2NvbmZpZyhhdWRpbyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFBSRVBST0NfQ01EX1JPVVRJTkdfTU9ERV9ET05FX01TRzogewotCQlzdHJ1Y3QgYXVkcHJlcHJvY19jbWRfcm91dGluZ19tb2RlX2RvbmVcCi0JCQkJKnJvdXRpbmdfY2ZnX2RvbmVfbXNnID0gbXNnOwotCQlpZiAocm91dGluZ19jZmdfZG9uZV9tc2ctPmNvbmZpZ3VyYXRpb24gPT0gMCkgewotCQkJTU1fSU5GTygicm91dGluZyBjb25maWd1cmF0aW9uIGZhaWxlZFxuIik7Ci0JCQlhdWRpby0+cnVubmluZyA9IDA7Ci0JCX0gZWxzZQotCQkJYXVkZXZyY19pbl9wYXJhbV9jb25maWcoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURQUkVQUk9DX0FGRV9DTURfQVVESU9fUkVDT1JEX0NGR19ET05FX01TRzogewotCQlNTV9EQkcoIkFGRV9DTURfQVVESU9fUkVDT1JEX0NGR19ET05FX01TRyBcbiIpOwotCQl3YWtlX3VwKCZhdWRpby0+d2FpdF9lbmFibGUpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJVbmtub3duIEV2ZW50IGlkICVkXG4iLCBpZCk7Ci0JfQotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCBhdWRyZWMgZXZlbnQgaGFuZGxlci0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgYXVkcmVjX2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgc2l6ZV90IGxlbiwKLQkJCSAgICB2b2lkICgqZ2V0ZXZlbnQpKHZvaWQgKnB0ciwgc2l6ZV90IGxlbikpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IGRhdGE7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURSRUNfQ01EX01FTV9DRkdfRE9ORV9NU0c6IHsKLQkJTU1fREJHKCJDTURfTUVNX0NGR19ET05FIE1TRyBET05FXG4iKTsKLQkJYXVkaW8tPnJ1bm5pbmcgPSAxOwotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJCWlmICgoIWF1ZGlvLT5pbl9jYWxsICYmIChhdWRpby0+ZGV2X2NudCA+IDApKSB8fAotCQkJCShhdWRpby0+aW5fY2FsbCAmJgotCQkJCQkoYXVkaW8tPnZvaWNlX3N0YXRlIFwKLQkJCQkJCT09IFZPSUNFX1NUQVRFX0lOQ0FMTCkpKQotCQkJCWF1ZGV2cmNfaW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMSk7Ci0JCX0gZWxzZSB7Ci0JCQlhdWRwcmVwcm9jX3BjbV9zZW5kX2RhdGEoYXVkaW8sIDEpOwotCQkJd2FrZV91cCgmYXVkaW8tPndhaXRfZW5hYmxlKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfRkFUQUxfRVJSX01TRzogewotCQlzdHJ1Y3QgYXVkcmVjX2ZhdGFsX2Vycl9tc2cgZmF0YWxfZXJyX21zZzsKLQotCQlnZXRldmVudCgmZmF0YWxfZXJyX21zZywgQVVEUkVDX0ZBVEFMX0VSUl9NU0dfTEVOKTsKLQkJTU1fRVJSKCJGQVRBTF9FUlJfTVNHOiBlcnIgaWQgJWRcbiIsCi0JCQkJZmF0YWxfZXJyX21zZy5hdWRyZWNfZXJyX2lkKTsKLQkJLyogRXJyb3Igc3RvcCB0aGUgZW5jb2RlciAqLwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJaWYgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfTk9OVFVOTkVMKQotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfVVBfUEFDS0VUX1JFQURZX01TRzogewotCQlzdHJ1Y3QgYXVkcmVjX3VwX3BrdF9yZWFkeV9tc2cgcGt0X3JlYWR5X21zZzsKLQotCQlnZXRldmVudCgmcGt0X3JlYWR5X21zZywgQVVEUkVDX1VQX1BBQ0tFVF9SRUFEWV9NU0dfTEVOKTsKLQkJTU1fREJHKCJVUF9QQUNLRVRfUkVBRFlfTVNHOiB3cml0ZSBjbnQgbHN3ICAlZCBcCi0JCXdyaXRlIGNudCBtc3cgJWQgcmVhZCBjbnQgbHN3ICVkICByZWFkIGNudCBtc3cgJWQgXG4iLFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfcGFja2V0X3dyaXRlX2NudF9sc3csIFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfcGFja2V0X3dyaXRlX2NudF9tc3csIFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfdXBfcHJldl9yZWFkX2NudF9sc3csIFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfdXBfcHJldl9yZWFkX2NudF9tc3cpOwotCi0JCWF1ZGV2cmNfaW5fZ2V0X2RzcF9mcmFtZXMoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfQ01EX1BDTV9CVUZGRVJfUFRSX1VQREFURV9BUk1fVE9fRU5DX01TRzogewotCQlNTV9EQkcoInB0cl91cGRhdGUgcmVjaWV2ZWQgZnJvbSBEU1BcbiIpOwotCQlhdWRwcmVwcm9jX3BjbV9zZW5kX2RhdGEoYXVkaW8sIDEpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfQ01EX1BDTV9DRkdfQVJNX1RPX0VOQ19ET05FX01TRzogewotCQlNTV9FUlIoIkFVRFJFQ19DTURfUENNX0NGR19BUk1fVE9fRU5DX0RPTkVfTVNHIik7Ci0JCWF1ZGV2cmNfaW5fbWVtX2NvbmZpZyhhdWRpbyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19VUF9OVF9QQUNLRVRfUkVBRFlfTVNHOiB7Ci0JCXN0cnVjdCBhdWRyZWNfdXBfbnRfcGFja2V0X3JlYWR5X21zZyBwa3RfcmVhZHlfbXNnOwotCi0JCWdldGV2ZW50KCZwa3RfcmVhZHlfbXNnLCBBVURSRUNfVVBfTlRfUEFDS0VUX1JFQURZX01TR19MRU4pOwotCQlNTV9EQkcoIlVQX05UX1BBQ0tFVF9SRUFEWV9NU0c6IHdyaXRlIGNudCBsc3cgICVkIFwKLQkJd3JpdGUgY250IG1zdyAlZCByZWFkIGNudCBsc3cgJWQgIHJlYWQgY250IG1zdyAlZCBcbiIsXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY19wYWNrZXR3cml0ZV9jbnRfbHN3LCBcCi0JCXBrdF9yZWFkeV9tc2cuYXVkcmVjX3BhY2tldHdyaXRlX2NudF9tc3csIFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfdXBwcmV2X3JlYWRjb3VudF9sc3csIFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfdXBwcmV2X3JlYWRjb3VudF9tc3cpOwotCi0JCWF1ZGV2cmNfbnRfaW5fZ2V0X2RzcF9mcmFtZXMoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfQ01EX0VPU19BQ0tfTVNHOiB7Ci0JCU1NX0RCRygiZW9zIGFjayByZWNpZXZlZFxuIik7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19DTURfRkxVU0hfRE9ORV9NU0c6IHsKLQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQlhdWRpby0+Zmx1c2hfYWNrID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlNTV9EQkcoImZsdXNoIGFjayByZWNpZXZlZFxuIik7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFEU1BfTUVTU0FHRV9JRDogewotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6bW9kdWxlIGF1ZHJlY3Rhc2tcbiIpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJVbmtub3duIEV2ZW50IGlkICVkXG4iLCBpZCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhdWRldnJjX2luX2dldF9kc3BfZnJhbWVzKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZGlvX2ZyYW1lICpmcmFtZTsKLQl1aW50MzJfdCBpbmRleDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaW5kZXggPSBhdWRpby0+aW5faGVhZDsKLQotCWZyYW1lID0gKHZvaWQgKikgKCgoY2hhciAqKWF1ZGlvLT5pbltpbmRleF0uZGF0YSkgLSBcCi0JCQkgc2l6ZW9mKCpmcmFtZSkpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9IGZyYW1lLT5mcmFtZV9sZW5ndGg7Ci0KLQkvKiBzdGF0aXN0aWNzIG9mIHJlYWQgKi8KLQlhdG9taWNfYWRkKGF1ZGlvLT5pbltpbmRleF0uc2l6ZSwgJmF1ZGlvLT5pbl9ieXRlcyk7Ci0JYXRvbWljX2FkZCgxLCAmYXVkaW8tPmluX3NhbXBsZXMpOwotCi0JYXVkaW8tPmluX2hlYWQgPSAoYXVkaW8tPmluX2hlYWQgKyAxKSAmIChGUkFNRV9OVU0gLSAxKTsKLQotCS8qIElmIG92ZXJmbG93LCBtb3ZlIHRoZSB0YWlsIGluZGV4IGZvd2FyZC4gKi8KLQlpZiAoYXVkaW8tPmluX2hlYWQgPT0gYXVkaW8tPmluX3RhaWwpIHsKLQkJTU1fRVJSKCJFcnJvciEgbm90IGFibGUgdG8ga2VlcCB1cCB0aGUgcmVhZFxuIik7Ci0JCWF1ZGlvLT5pbl90YWlsID0gKGF1ZGlvLT5pbl90YWlsICsgMSkgJiAoRlJBTUVfTlVNIC0gMSk7Ci0JCU1NX0VSUigiaW5fY291bnQgPSAlZFxuIiwgYXVkaW8tPmluX2NvdW50KTsKLQl9IGVsc2UKLQkJYXVkaW8tPmluX2NvdW50Kys7Ci0KLQlhdWRldnJjX2RzcF9yZWFkX2J1ZmZlcihhdWRpbywgYXVkaW8tPmRzcF9jbnQrKyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0KLQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGV2cmNfbnRfaW5fZ2V0X2RzcF9mcmFtZXMoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkaW9fZnJhbWVfbnQgKm50X2ZyYW1lOwotCXVpbnQzMl90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpbmRleCA9IGF1ZGlvLT5pbl9oZWFkOwotCW50X2ZyYW1lID0gKHZvaWQgKikgKCgoY2hhciAqKWF1ZGlvLT5pbltpbmRleF0uZGF0YSkgLSBcCi0JCQkJc2l6ZW9mKHN0cnVjdCBhdWRpb19mcmFtZV9udCkpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdWRpby0+aW5baW5kZXhdLnNpemUgPSBudF9mcmFtZS0+ZnJhbWVfbGVuZ3RoOwotCS8qIHN0YXRpc3RpY3Mgb2YgcmVhZCAqLwotCWF0b21pY19hZGQoYXVkaW8tPmluW2luZGV4XS5zaXplLCAmYXVkaW8tPmluX2J5dGVzKTsKLQlhdG9taWNfYWRkKDEsICZhdWRpby0+aW5fc2FtcGxlcyk7Ci0KLQlhdWRpby0+aW5faGVhZCA9IChhdWRpby0+aW5faGVhZCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCi0JLyogSWYgb3ZlcmZsb3csIG1vdmUgdGhlIHRhaWwgaW5kZXggZm93YXJkLiAqLwotCWlmIChhdWRpby0+aW5faGVhZCA9PSBhdWRpby0+aW5fdGFpbCkKLQkJTU1fREJHKCJFcnJvciEgbm90IGFibGUgdG8ga2VlcCB1cCB0aGUgcmVhZFxuIik7Ci0JZWxzZQotCQlhdWRpby0+aW5fY291bnQrKzsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLX0KLQotCi1zdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHJlY19ldnJjX2Fkc3Bfb3BzID0gewotCS5ldmVudCA9IGF1ZHJlY19kc3BfZXZlbnQsCi19OwotCi1zdGF0aWMgaW50IGF1ZHByZXByb2NfcGNtX2J1ZmZlcl9wdHJfcmVmcmVzaChzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLAotCQkJCSAgICAgICB1bnNpZ25lZCBpZHgsIHVuc2lnbmVkIGxlbikKLXsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9wY21fYnVmZmVyX3B0cl9yZWZyZXNoX2FybV9lbmMgY21kOwotCi0JaWYgKGxlbiA9PSAgTUVUQV9PVVRfU0laRSkKLQkJbGVuID0gbGVuIC8gMjsKLQllbHNlCi0JCWxlbiA9IChsZW4gKyBNRVRBX09VVF9TSVpFKSAvIDI7Ci0JTU1fREJHKCJsZW4gPSAlZFxuIiwgbGVuKTsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURSRUNfQ01EX1BDTV9CVUZGRVJfUFRSX1JFRlJFU0hfQVJNX1RPX0VOQzsKLQljbWQubnVtX2J1ZmZlcnMgPSAxOwotCWlmIChjbWQubnVtX2J1ZmZlcnMgPT0gMSkgewotCQljbWQuYnVmX2FkZHJlc3NfbGVuZ3RoWzBdID0gKGF1ZGlvLT5vdXRbaWR4XS5hZGRyICYKLQkJCQkJCQkweGZmZmYwMDAwKSA+PiAxNjsKLQkJY21kLmJ1Zl9hZGRyZXNzX2xlbmd0aFsxXSA9IChhdWRpby0+b3V0W2lkeF0uYWRkciAmCi0JCQkJCQkJMHgwMDAwZmZmZik7Ci0JCWNtZC5idWZfYWRkcmVzc19sZW5ndGhbMl0gPSAobGVuICYgMHhmZmZmMDAwMCkgPj4gMTY7Ci0JCWNtZC5idWZfYWRkcmVzc19sZW5ndGhbM10gPSAobGVuICYgMHgwMDAwZmZmZik7Ci0JfQotCWF1ZGlvLT5vdXRfZnJhbWVfY250Kys7Ci0JcmV0dXJuIGF1ZHJlY19zZW5kX2F1ZHJlY3F1ZXVlKGF1ZGlvLCAodm9pZCAqKSZjbWQsCi0JCQkJCSh1bnNpZ25lZCBpbnQpc2l6ZW9mKGNtZCkpOwotfQotCi0KLXN0YXRpYyBpbnQgYXVkcGNtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRyZWNfY21kX3BjbV9jZmdfYXJtX3RvX2VuYyBjbWQ7Ci0JTU1fREJHKCJcbiIpOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFJFQ19DTURfUENNX0NGR19BUk1fVE9fRU5DOwotCWNtZC5jb25maWdfdXBkYXRlX2ZsYWcgPSBBVURSRUNfUENNX0NPTkZJR19VUERBVEVfRkxBR19FTkFCTEU7Ci0JY21kLmVuYWJsZV9mbGFnID0gQVVEUkVDX0VOQUJMRV9GTEFHX1ZBTFVFOwotCWNtZC5zYW1wbGluZ19mcmVxID0gYXVkaW8tPnNhbXBfcmF0ZTsKLQlpZiAoIWF1ZGlvLT5jaGFubmVsX21vZGUpCi0JCWNtZC5jaGFubmVscyA9IDE7Ci0JZWxzZQotCQljbWQuY2hhbm5lbHMgPSAyOwotCWNtZC5mcmVxdWVuY3lfb2ZfaW50aW1hdGlvbiA9IDE7Ci0JY21kLm1heF9udW1iZXJfb2ZfYnVmZmVycyA9IE9VVF9GUkFNRV9OVU07Ci0JcmV0dXJuIGF1ZHJlY19zZW5kX2F1ZHJlY3F1ZXVlKGF1ZGlvLCAodm9pZCAqKSZjbWQsCi0JCQkJCSh1bnNpZ25lZCBpbnQpc2l6ZW9mKGNtZCkpOwotfQotCi0KLXN0YXRpYyBpbnQgYXVkcHJlcHJvY19jbWRfY2ZnX3JvdXRpbmdfbW9kZShzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcm91dGluZ19tb2RlIGNtZDsKLQotCU1NX0RCRygiXG4iKTsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURQUkVQUk9DX0FVRFJFQ19DTURfUk9VVElOR19NT0RFOwotCWNtZC5zdHJlYW1faWQgPSBhdWRpby0+ZW5jX2lkOwotCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQURTUF9FTkNfTU9ERV9OT05fVFVOTkVMKQotCQljbWQucm91dGluZ19tb2RlID0gMTsKLQlyZXR1cm4gYXVkcHJlcHJvY19zZW5kX2F1ZHJlY2NtZHF1ZXVlKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotCi0KLXN0YXRpYyBpbnQgYXVkZXZyY19pbl9lbmNfY29uZmlnKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0Jc3RydWN0IGF1ZHByZXByb2NfYXVkcmVjX2NtZF9lbmNfY2ZnIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JaWYgKGF1ZGlvLT5idWlsZF9pZFsxN10gPT0gJzEnKSB7Ci0JCWNtZC5jbWRfaWQgPSBBVURQUkVQUk9DX0FVRFJFQ19DTURfRU5DX0NGR18yOwotCQlNTV9FUlIoInNlbmRpbmcgQVVEUFJFUFJPQ19BVURSRUNfQ01EX0VOQ19DRkdfMiBjb21tYW5kIik7Ci0JfSBlbHNlIHsKLQkJY21kLmNtZF9pZCA9IEFVRFBSRVBST0NfQVVEUkVDX0NNRF9FTkNfQ0ZHOwotCQlNTV9FUlIoInNlbmRpbmcgQVVEUFJFUFJPQ19BVURSRUNfQ01EX0VOQ19DRkcgY29tbWFuZCIpOwotCX0KLQljbWQuc3RyZWFtX2lkID0gYXVkaW8tPmVuY19pZDsKLQotCWlmIChlbmFibGUpCi0JCWNtZC5hdWRyZWNfZW5jX3R5cGUgPSBhdWRpby0+ZW5jX3R5cGUgfCBFTkNPREVfRU5BQkxFOwotCWVsc2UKLQkJY21kLmF1ZHJlY19lbmNfdHlwZSAmPSB+KEVOQ09ERV9FTkFCTEUpOwotCi0JcmV0dXJuIGF1ZHByZXByb2Nfc2VuZF9hdWRyZWNjbWRxdWV1ZSgmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkZXZyY19pbl9wYXJhbV9jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19hdWRyZWNfY21kX3Bhcm1fY2ZnX2V2cmMgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY29tbW9uLmNtZF9pZCA9IEFVRFBSRVBST0NfQVVEUkVDX0NNRF9QQVJBTV9DRkc7Ci0JY21kLmNvbW1vbi5zdHJlYW1faWQgPSBhdWRpby0+ZW5jX2lkOwotCi0JY21kLmVuY19taW5fcmF0ZSA9IGF1ZGlvLT5jZmcubWluX2JpdF9yYXRlOwotCWNtZC5lbmNfbWF4X3JhdGUgPSBhdWRpby0+Y2ZnLm1heF9iaXRfcmF0ZTsKLQljbWQucmF0ZV9tb2R1bGF0aW9uX2NtZCA9IDA7ICAvKiBEZWZhdWx0IHNldCB0byAwICovCi0KLQlyZXR1cm4gYXVkcHJlcHJvY19zZW5kX2F1ZHJlY2NtZHF1ZXVlKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotLyogVG8gRG86IG1zbV9zbmRkZXZfcm91dGVfZW5jKGF1ZGlvLT5lbmNfaWQpOyAqLwotc3RhdGljIGludCBhdWRldnJjX2luX3JlY29yZF9jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19hZmVfY21kX2F1ZGlvX3JlY29yZF9jZmcgY21kOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IEFVRFBSRVBST0NfQUZFX0NNRF9BVURJT19SRUNPUkRfQ0ZHOwotCWNtZC5zdHJlYW1faWQgPSBhdWRpby0+ZW5jX2lkOwotCWlmIChlbmFibGUpCi0JCWNtZC5kZXN0aW5hdGlvbl9hY3Rpdml0eSA9IEFVRElPX1JFQ09SRElOR19UVVJOX09OOwotCWVsc2UKLQkJY21kLmRlc3RpbmF0aW9uX2FjdGl2aXR5ID0gQVVESU9fUkVDT1JESU5HX1RVUk5fT0ZGOwotCi0JY21kLnNvdXJjZV9taXhfbWFzayA9IGF1ZGlvLT5zb3VyY2U7Ci0JaWYgKGF1ZGlvLT5lbmNfaWQgPT0gMikgewotCQlpZiAoKGNtZC5zb3VyY2VfbWl4X21hc2sgJgotCQkJCUlOVEVSTkFMX0NPREVDX1RYX1NPVVJDRV9NSVhfTUFTSykgfHwKLQkJCShjbWQuc291cmNlX21peF9tYXNrICYgQVVYX0NPREVDX1RYX1NPVVJDRV9NSVhfTUFTSykgfHwKLQkJCShjbWQuc291cmNlX21peF9tYXNrICYgVk9JQ0VfVUxfU09VUkNFX01JWF9NQVNLKSB8fAotCQkJKGNtZC5zb3VyY2VfbWl4X21hc2sgJiBWT0lDRV9ETF9TT1VSQ0VfTUlYX01BU0spKSB7Ci0JCQljbWQucGlwZV9pZCA9IFNPVVJDRV9QSVBFXzE7Ci0JCX0KLQkJaWYgKGNtZC5zb3VyY2VfbWl4X21hc2sgJgotCQkJCUFVRFBQX0EyRFBfUElQRV9TT1VSQ0VfTUlYX01BU0spCi0JCQljbWQucGlwZV9pZCB8PSBTT1VSQ0VfUElQRV8wOwotCX0KLQlNTV9EQkcoInN0cmVhbV9pZCAleCBkZXN0aW5hdGlvbl9hY3Rpdml0eSAleCBcCi0Jc291cmNlX21peF9tYXNrICV4IHBpcGVfaWQgJXgiLFwKLQljbWQuc3RyZWFtX2lkLCBjbWQuZGVzdGluYXRpb25fYWN0aXZpdHksCi0JY21kLnNvdXJjZV9taXhfbWFzaywgY21kLnBpcGVfaWQpOwotCXJldHVybiBhdWRwcmVwcm9jX3NlbmRfYXVkcmVjY21kcXVldWUoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGF1ZGV2cmNfaW5fbWVtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRyZWNfY21kX2FyZWNtZW1fY2ZnIGNtZDsKLQl1aW50MTZfdCAqZGF0YSA9ICh2b2lkICopIGF1ZGlvLT5kYXRhOwotCWludCBuOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUkVDX0NNRF9NRU1fQ0ZHX0NNRDsKLQljbWQuYXVkcmVjX3VwX3BrdF9pbnRtX2NvdW50ID0gMTsKLQljbWQuYXVkcmVjX2V4dF9wa3Rfc3RhcnRfYWRkcl9tc3cgPSBhdWRpby0+cGh5cyA+PiAxNjsKLQljbWQuYXVkcmVjX2V4dF9wa3Rfc3RhcnRfYWRkcl9sc3cgPSBhdWRpby0+cGh5czsKLQljbWQuYXVkcmVjX2V4dF9wa3RfYnVmX251bWJlciA9IEZSQU1FX05VTTsKLQlNTV9EQkcoImF1ZGlvLT5waHlzID0gJXhcbiIsIGF1ZGlvLT5waHlzKTsKLQkvKiBwcmVwYXJlIGJ1ZmZlciBwb2ludGVyczoKLQkgKiBUOjM2IGJ5dGVzIGV2cmMgcGFja2V0ICsgNCBoYWxmd29yZCBoZWFkZXIKLQkgKiBOVDozNiBieXRlcyBldnJjIHBhY2tldCArIDEyIGhhbGZ3b3JkIGhlYWRlcgotCSAqLwotCWZvciAobiA9IDA7IG4gPCBGUkFNRV9OVU07IG4rKykgewotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJCWF1ZGlvLT5pbltuXS5kYXRhID0gZGF0YSArIDQ7Ci0JCQlkYXRhICs9IChGUkFNRV9TSVpFLzIpOwotCQkJTU1fREJHKCIweCU4eFxuIiwgKGludCkoYXVkaW8tPmluW25dLmRhdGEgLSA4KSk7Ci0JCX0gZWxzZSAgewotCQkJYXVkaW8tPmluW25dLmRhdGEgPSBkYXRhICsgMTI7Ci0JCQlkYXRhICs9ICgoRVZSQ19GUkFNRV9TSVpFKSAvIDIpICsgMTI7Ci0JCQlNTV9EQkcoIjB4JTh4XG4iLCAoaW50KShhdWRpby0+aW5bbl0uZGF0YSAtIDI0KSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGF1ZHJlY19zZW5kX2F1ZHJlY3F1ZXVlKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkZXZyY19kc3BfcmVhZF9idWZmZXIoc3RydWN0IGF1ZGlvX2luICphdWRpbywgdWludDMyX3QgcmVhZF9jbnQpCi17Ci0Jc3RydWN0IHVwX2F1ZHJlY19wYWNrZXRfZXh0X3B0ciBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBVUF9BVURSRUNfUEFDS0VUX0VYVF9QVFI7Ci0JY21kLmF1ZHJlY191cF9jdXJyX3JlYWRfY291bnRfbXN3ID0gcmVhZF9jbnQgPj4gMTY7Ci0JY21kLmF1ZHJlY191cF9jdXJyX3JlYWRfY291bnRfbHN3ID0gcmVhZF9jbnQ7Ci0KLQlyZXR1cm4gYXVkcmVjX3NlbmRfYml0c3RyZWFtcXVldWUoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLXN0YXRpYyBpbnQgYXVkZXZyY19mbHVzaF9jb21tYW5kKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHJlY19jbWRfZmx1c2ggY21kOwotCU1NX0RCRygiXG4iKTsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURSRUNfQ01EX0ZMVVNIOwotCXJldHVybiBhdWRyZWNfc2VuZF9hdWRyZWNxdWV1ZShhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkZXZyY19pbl9lbmFibGUoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JaWYgKGF1ZHByZXByb2NfZW5hYmxlKGF1ZGlvLT5lbmNfaWQsICZhdWRwcmVwcm9jX2RzcF9ldmVudCwgYXVkaW8pKSB7Ci0JCU1NX0VSUigibXNtX2Fkc3BfZW5hYmxlKGF1ZHByZXByb2MpIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChtc21fYWRzcF9lbmFibGUoYXVkaW8tPmF1ZHJlYykpIHsKLQkJTU1fRVJSKCJtc21fYWRzcF9lbmFibGUoYXVkcmVjKSBmYWlsZWRcbiIpOwotCQlhdWRwcmVwcm9jX2Rpc2FibGUoYXVkaW8tPmVuY19pZCwgYXVkaW8pOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JYXVkaW8tPmVuYWJsZWQgPSAxOwotCWF1ZGV2cmNfaW5fZW5jX2NvbmZpZyhhdWRpbywgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGV2cmNfaW5fZGlzYWJsZShzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCWlmIChhdWRpby0+ZW5hYmxlZCkgewotCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCWF1ZGV2cmNfaW5fZW5jX2NvbmZpZyhhdWRpbywgMCk7Ci0JCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXRfZW5hYmxlLAotCQkJCWF1ZGlvLT5ydW5uaW5nID09IDAsIDEqSFopOwotCQltc21fYWRzcF9kaXNhYmxlKGF1ZGlvLT5hdWRyZWMpOwotCQlhdWRwcmVwcm9jX2Rpc2FibGUoYXVkaW8tPmVuY19pZCwgYXVkaW8pOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXVkZXZyY19pb3BvcnRfcmVzZXQoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQkvKiBNYWtlIHN1cmUgcmVhZC93cml0ZSB0aHJlYWQgYXJlIGZyZWUgZnJvbQotCSAqIHNsZWVwIGFuZCBrbm93aW5nIHRoYXQgc3lzdGVtIGlzIG5vdCBhYmxlCi0JICogdG8gcHJvY2VzcyBpbyByZXF1ZXN0IGF0IHRoZSBtb21lbnQKLQkgKi8KLQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCWF1ZGV2cmNfaW5fZmx1c2goYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlhdWRldnJjX291dF9mbHVzaChhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkZXZyY19pbl9mbHVzaChzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCWludCBpOwotCi0JYXVkaW8tPmRzcF9jbnQgPSAwOwotCWF1ZGlvLT5pbl9oZWFkID0gMDsKLQlhdWRpby0+aW5fdGFpbCA9IDA7Ci0JYXVkaW8tPmluX2NvdW50ID0gMDsKLQlhdWRpby0+ZW9zX2FjayA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IEZSQU1FX05VTTsgaSsrKSB7Ci0JCWF1ZGlvLT5pbltpXS5zaXplID0gMDsKLQkJYXVkaW8tPmluW2ldLnJlYWQgPSAwOwotCX0KLQlNTV9EQkcoImluX2J5dGVzICVkXG4iLCBhdG9taWNfcmVhZCgmYXVkaW8tPmluX2J5dGVzKSk7Ci0JTU1fREJHKCJpbl9zYW1wbGVzICVkXG4iLCBhdG9taWNfcmVhZCgmYXVkaW8tPmluX3NhbXBsZXMpKTsKLQlhdG9taWNfc2V0KCZhdWRpby0+aW5fYnl0ZXMsIDApOwotCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9zYW1wbGVzLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkZXZyY19vdXRfZmx1c2goc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlpbnQgaTsKLQotCWF1ZGlvLT5vdXRfaGVhZCA9IDA7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+b3V0X2NvdW50ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgT1VUX0ZSQU1FX05VTTsgaSsrKSB7Ci0JCWF1ZGlvLT5vdXRbaV0uc2l6ZSA9IDA7Ci0JCWF1ZGlvLT5vdXRbaV0ucmVhZCA9IDA7Ci0JCWF1ZGlvLT5vdXRbaV0udXNlZCA9IDA7Ci0JfQotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBsb25nIGF1ZGV2cmNfaW5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JTU1fREJHKCJcbiIpOwotCWlmIChjbWQgPT0gQVVESU9fR0VUX1NUQVRTKSB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCXN0YXRzLmJ5dGVfY291bnQgPSBhdG9taWNfcmVhZCgmYXVkaW8tPmluX2J5dGVzKTsKLQkJc3RhdHMuc2FtcGxlX2NvdW50ID0gYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9zYW1wbGVzKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIHJjOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJdWludDMyX3QgZnJlcTsKLQkJZnJlcSA9IDQ4MDAwOwotCQlNTV9EQkcoIkFVRElPX1NUQVJUXG4iKTsKLQkJaWYgKGF1ZGlvLT5pbl9jYWxsICYmIChhdWRpby0+dm9pY2Vfc3RhdGUgIT0KLQkJCQlWT0lDRV9TVEFURV9JTkNBTEwpKSB7Ci0JCQlyYyA9IC1FUEVSTTsKLQkJCWJyZWFrOwotCQl9Ci0JCXJjID0gbXNtX3NuZGRldl9yZXF1ZXN0X2ZyZXEoJmZyZXEsIGF1ZGlvLT5lbmNfaWQsCi0JCQkJCVNORERFVl9DQVBfVFgsIEFVRERFVl9DTE5UX0VOQyk7Ci0JCU1NX0RCRygic2FtcGxlIHJhdGUgY29uZmlndXJlZCAlZFxuIiwgZnJlcSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCU1NX0RCRygiIFNhbXBsZSByYXRlIGNhbiBub3QgYmUgc2V0LCByZXR1cm4gY29kZSAlZFxuIiwKLQkJCQkJCQkJIHJjKTsKLQkJCW1zbV9zbmRkZXZfd2l0aGRyYXdfZnJlcShhdWRpby0+ZW5jX2lkLAotCQkJCQlTTkRERVZfQ0FQX1RYLCBBVURERVZfQ0xOVF9FTkMpOwotCQkJTU1fREJHKCJtc21fc25kZGV2X3dpdGhkcmF3X2ZyZXFcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyp1cGRhdGUgYXVyZWMgc2Vzc2lvbiBpbmZvIGluIGF1ZHByZXByb2MgbGF5ZXIqLwotCQlhdWRpby0+c2Vzc2lvbl9pbmZvLnNlc3Npb25faWQgPSBhdWRpby0+ZW5jX2lkOwotCQlhdWRpby0+c2Vzc2lvbl9pbmZvLnNhbXBsaW5nX2ZyZXEgPSBhdWRpby0+c2FtcF9yYXRlOwotCQlhdWRwcmVwcm9jX3VwZGF0ZV9hdWRyZWNfaW5mbygmYXVkaW8tPnNlc3Npb25faW5mbyk7Ci0JCXJjID0gYXVkZXZyY19pbl9lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9Ci0JCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdF9lbmFibGUsCi0JCQkJYXVkaW8tPnJ1bm5pbmcgIT0gMCwgMSpIWik7Ci0JCQlNTV9EQkcoInN0YXRlICVkIHJjID0gJWRcbiIsIGF1ZGlvLT5ydW5uaW5nLCByYyk7Ci0KLQkJCWlmIChhdWRpby0+cnVubmluZyA9PSAwKQotCQkJCXJjID0gLUVOT0RFVjsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCX0KLQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TVE9QOiB7Ci0JCS8qcmVzZXQgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSBpbmZvcm1hdGlvbiBhdCBhdWRwcmVwcm9jIGxheWVyKi8KLQkJYXVkaW8tPnNlc3Npb25faW5mby5zYW1wbGluZ19mcmVxID0gMDsKLQkJYXVkcHJlcHJvY191cGRhdGVfYXVkcmVjX2luZm8oJmF1ZGlvLT5zZXNzaW9uX2luZm8pOwotCQlyYyA9IGF1ZGV2cmNfaW5fZGlzYWJsZShhdWRpbyk7Ci0JCXJjID0gbXNtX3NuZGRldl93aXRoZHJhd19mcmVxKGF1ZGlvLT5lbmNfaWQsCi0JCQkJCVNORERFVl9DQVBfVFgsIEFVRERFVl9DTE5UX0VOQyk7Ci0JCU1NX0RCRygibXNtX3NuZGRldl93aXRoZHJhd19mcmVxXG4iKTsKLQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19GTFVTSDogewotCQlNTV9EQkcoIkFVRElPX0ZMVVNIXG4iKTsKLQkJYXVkaW8tPnJmbHVzaCA9IDE7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAxOwotCQlhdWRldnJjX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWlmIChhdWRpby0+cnVubmluZykgewotCQkJYXVkZXZyY19mbHVzaF9jb21tYW5kKGF1ZGlvKTsKLQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCSFhdWRpby0+d2ZsdXNoKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlNTV9FUlIoIkFVRElPX0ZMVVNIIGludGVycnVwdGVkXG4iKTsKLQkJCQlyYyA9IC1FSU5UUjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX1NUUkVBTV9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnIGNmZzsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsICh2b2lkICopIGFyZywgc2l6ZW9mKGNmZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBBbGxvdyBvbmx5IHNpbmdsZSBmcmFtZSAqLwotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJCWlmIChjZmcuYnVmZmVyX3NpemUgIT0gKEZSQU1FX1NJWkUgLSA4KSkgewotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChjZmcuYnVmZmVyX3NpemUgIT0gKEVWUkNfRlJBTUVfU0laRSArIDE0KSkgewotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlhdWRpby0+YnVmZmVyX3NpemUgPSBjZmcuYnVmZmVyX3NpemU7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9TVFJFQU1fQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBjZmc7Ci0JCW1lbXNldCgmY2ZnLCAwLCBzaXplb2YoY2ZnKSk7Ci0JCWNmZy5idWZmZXJfc2l6ZSA9IGF1ZGlvLT5idWZmZXJfc2l6ZTsKLQkJY2ZnLmJ1ZmZlcl9jb3VudCA9IEZSQU1FX05VTTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZjZmcsIHNpemVvZihjZmcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0VWUkNfRU5DX0NPTkZJRzogewotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmF1ZGlvLT5jZmcsIHNpemVvZihhdWRpby0+Y2ZnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9FVlJDX0VOQ19DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19ldnJjX2VuY19jb25maWcgY2ZnOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgKHZvaWQgKikgYXJnLCBzaXplb2YoY2ZnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCU1NX0RCRygiMFglOHgsIDB4JTh4LCAweCU4eFxuIiwgY2ZnLm1pbl9iaXRfcmF0ZSwKLQkJCQljZmcubWF4X2JpdF9yYXRlLCBjZmcuY2RtYV9yYXRlKTsKLQkJaWYgKGNmZy5taW5fYml0X3JhdGUgPiBDRE1BX1JBVEVfRlVMTCB8fCBcCi0JCQkJIGNmZy5taW5fYml0X3JhdGUgPCBDRE1BX1JBVEVfRUlHSFRIKSB7Ci0JCQlNTV9FUlIoImludmFsaWQgbWluIGJpdHJhdGVcbiIpOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNmZy5tYXhfYml0X3JhdGUgPiBDRE1BX1JBVEVfRlVMTCB8fCBcCi0JCQkJY2ZnLm1heF9iaXRfcmF0ZSA8IENETUFfUkFURV9FSUdIVEgpIHsKLQkJCU1NX0VSUigiaW52YWxpZCBtYXggYml0cmF0ZVxuIik7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBSZWNvcmRpbmcgRG9lcyBub3Qgc3VwcG9ydCBFcmFzZSBhbmQgQmxhbmsgKi8KLQkJaWYgKGNmZy5jZG1hX3JhdGUgPiBDRE1BX1JBVEVfRlVMTCB8fAotCQkJY2ZnLmNkbWFfcmF0ZSA8IENETUFfUkFURV9FSUdIVEgpIHsKLQkJCU1NX0VSUigiaW52YWxpZCBxY2VscCBjZG1hIHJhdGVcbiIpOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJbWVtY3B5KCZhdWRpby0+Y2ZnLCAmY2ZnLCBzaXplb2YoY2ZnKSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY2ZnOwotCQltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOwotCQljZmcuYnVmZmVyX3NpemUgPSBPVVRfQlVGRkVSX1NJWkU7Ci0JCWNmZy5idWZmZXJfY291bnQgPSBPVVRfRlJBTUVfTlVNOwotCQljZmcuc2FtcGxlX3JhdGUgPSBhdWRpby0+c2FtcF9yYXRlOwotCQljZmcuY2hhbm5lbF9jb3VudCA9IGF1ZGlvLT5jaGFubmVsX21vZGU7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjZmcsIHNpemVvZihjZmcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0lOQ0FMTDogewotCQlzdHJ1Y3QgbXNtX3ZvaWNlcmVjX21vZGUgY2ZnOwotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKSBhcmcsIHNpemVvZihjZmcpKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjZmcucmVjX21vZGUgIT0gVk9DX1JFQ19CT1RIICYmCi0JCQkJY2ZnLnJlY19tb2RlICE9IFZPQ19SRUNfVVBMSU5LICYmCi0JCQkJY2ZnLnJlY19tb2RlICE9IFZPQ19SRUNfRE9XTkxJTkspIHsKLQkJCQlNTV9FUlIoImludmFsaWQgcmVjX21vZGVcbiIpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCQkJCWlmIChjZmcucmVjX21vZGUgPT0gVk9DX1JFQ19VUExJTkspCi0JCQkJCWF1ZGlvLT5zb3VyY2UgPSBcCi0JCQkJCQlWT0lDRV9VTF9TT1VSQ0VfTUlYX01BU0s7Ci0JCQkJZWxzZSBpZiAoY2ZnLnJlY19tb2RlID09IFZPQ19SRUNfRE9XTkxJTkspCi0JCQkJCWF1ZGlvLT5zb3VyY2UgPSBcCi0JCQkJCQlWT0lDRV9ETF9TT1VSQ0VfTUlYX01BU0s7Ci0JCQkJZWxzZQotCQkJCQlhdWRpby0+c291cmNlID0gXAotCQkJCQkJVk9JQ0VfRExfU09VUkNFX01JWF9NQVNLIHwKLQkJCQkJCVZPSUNFX1VMX1NPVVJDRV9NSVhfTUFTSyA7Ci0JCQkJYXVkaW8tPmluX2NhbGwgPSAxOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9TRVNTSU9OX0lEOiB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmYXVkaW8tPmVuY19pZCwKLQkJCXNpemVvZih1bnNpZ25lZCBzaG9ydCkpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRldnJjX2luX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jdm9pZCAqZGF0YTsKLQl1aW50MzJfdCBpbmRleDsKLQl1aW50MzJfdCBzaXplOwotCWludCByYyA9IDA7Ci0Jc3RydWN0IGV2cmNfZW5jb2RlZF9tZXRhX291dCBtZXRhX2ZpZWxkOwotCXN0cnVjdCBhdWRpb19mcmFtZV9udCAqbnRfZnJhbWU7Ci0JTU1fREJHKCJjb3VudCA9ICVkXG4iLCBjb3VudCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCWF1ZGlvLT53YWl0LCAoYXVkaW8tPmluX2NvdW50ID4gMCkgfHwgYXVkaW8tPnN0b3BwZWQgfHwKLQkJCWF1ZGlvLT5yZmx1c2ggfHwKLQkJCSgoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpICYmCi0JCQkgYXVkaW8tPmluX2NhbGwgJiYgYXVkaW8tPnJ1bm5pbmcgJiYKLQkJCShhdWRpby0+dm9pY2Vfc3RhdGUgPT0gVk9JQ0VfU1RBVEVfT0ZGQ0FMTCkpKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCi0JCWlmIChhdWRpby0+cmZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChhdWRpby0+c3RvcHBlZCAmJiAhYXVkaW8tPmluX2NvdW50KSB7Ci0JCQlNTV9EQkcoIkRyaXZlciBpbiBzdG9wIHN0YXRlLCBObyBtb3JlIGJ1ZmZlciB0byByZWFkIik7Ci0JCQlyYyA9IDA7LyogRW5kIG9mIEZpbGUgKi8KLQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmICgoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpICYmCi0JCQkJCWF1ZGlvLT5pbl9jYWxsICYmIGF1ZGlvLT5ydW5uaW5nICYmCi0JCQkJCShhdWRpby0+dm9pY2Vfc3RhdGUgXAotCQkJCQkJPT0gVk9JQ0VfU1RBVEVfT0ZGQ0FMTCkpIHsKLQkJCQlNTV9EQkcoIk5vdCBQZXJtaXR0ZWQgVm9pY2UgVGVybWluYXRlZFxuIik7Ci0JCQkJcmMgPSAtRVBFUk07IC8qIFZvaWNlIENhbGwgc3RvcHBlZCAqLwotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaW5kZXggPSBhdWRpby0+aW5fdGFpbDsKLQkJZGF0YSA9ICh1aW50OF90ICopIGF1ZGlvLT5pbltpbmRleF0uZGF0YTsKLQkJc2l6ZSA9IGF1ZGlvLT5pbltpbmRleF0uc2l6ZTsKLQotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUwpIHsKLQkJCW50X2ZyYW1lID0gKHN0cnVjdCBhdWRpb19mcmFtZV9udCAqKShkYXRhIC0KLQkJCQkJc2l6ZW9mKHN0cnVjdCBhdWRpb19mcmFtZV9udCkpOwotCQkJbWVtY3B5KChjaGFyICopJm1ldGFfZmllbGQudGltZV9zdGFtcF9kd29yZF9sc3csCi0JCQkJKGNoYXIgKikmbnRfZnJhbWUtPnRpbWVfc3RhbXBfZHdvcmRfbHN3LAotCQkJCShzaXplb2Yoc3RydWN0IGV2cmNfZW5jb2RlZF9tZXRhX291dCkgLSBcCi0JCQkJc2l6ZW9mKHVpbnQxNl90KSkpOwotCQkJbWV0YV9maWVsZC5tZXRhZGF0YV9sZW4gPQotCQkJCQlzaXplb2Yoc3RydWN0IGV2cmNfZW5jb2RlZF9tZXRhX291dCk7Ci0JCQlpZiAoY29weV90b191c2VyKChjaGFyICopc3RhcnQsIChjaGFyICopJm1ldGFfZmllbGQsCi0JCQkJCXNpemVvZihzdHJ1Y3QgZXZyY19lbmNvZGVkX21ldGFfb3V0KSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAobnRfZnJhbWUtPm5mbGFnX2xzdyAmIDB4MDAwMSkgewotCQkJCU1NX0VSUigicmVjaWV2ZWQgRU9TIGluIHJlYWQgY2FsbFxuIik7Ci0JCQkJYXVkaW8tPmVvc19hY2sgPSAxOwotCQkJfQotCQkJYnVmICs9IHNpemVvZihzdHJ1Y3QgZXZyY19lbmNvZGVkX21ldGFfb3V0KTsKLQkJCWNvdW50IC09IHNpemVvZihzdHJ1Y3QgZXZyY19lbmNvZGVkX21ldGFfb3V0KTsKLQkJfQotCQlpZiAoY291bnQgPj0gc2l6ZSkgewotCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGRhdGEsIHNpemUpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJaWYgKGluZGV4ICE9IGF1ZGlvLT5pbl90YWlsKSB7Ci0JCQkJLyogb3ZlcnJ1biAtLSBkYXRhIGlzCi0JCQkJICogaW52YWxpZCBhbmQgd2UgbmVlZCB0byByZXRyeSAqLwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYXVkaW8tPmluW2luZGV4XS5zaXplID0gMDsKLQkJCWF1ZGlvLT5pbl90YWlsID0gKGF1ZGlvLT5pbl90YWlsICsgMSkgJiAoRlJBTUVfTlVNIC0gMSk7Ci0JCQlhdWRpby0+aW5fY291bnQtLTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJY291bnQgLT0gc2l6ZTsKLQkJCWJ1ZiArPSBzaXplOwotCQkJaWYgKChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkpIHsKLQkJCQlpZiAoIWF1ZGlvLT5lb3NfYWNrKSB7Ci0JCQkJCU1NX0RCRygic2VuZGluZyByZWFkIHB0ciBjb21tYW5kIFwKLQkJCQkJCQklZCAlZFxuIiwKLQkJCQkJCQlhdWRpby0+ZHNwX2NudCwKLQkJCQkJCQlhdWRpby0+aW5fdGFpbCk7Ci0JCQkJCWF1ZGV2cmNfZHNwX3JlYWRfYnVmZmVyKGF1ZGlvLAotCQkJCQkJCWF1ZGlvLT5kc3BfY250KyspOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigic2hvcnQgcmVhZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQotCWlmIChidWYgPiBzdGFydCkKLQkJcmV0dXJuIGJ1ZiAtIHN0YXJ0OwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwcmVwcm9jX3BjbV9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvX2luICphdWRpbywgdW5zaWduZWQgbmVlZGVkKQotewotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JTU1fREJHKCJcbiIpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWF1ZGlvLT5ydW5uaW5nKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAobmVlZGVkICYmICFhdWRpby0+d2ZsdXNoKSB7Ci0JCS8qIFdlIHdlcmUgY2FsbGVkIGZyb20gdGhlIGNhbGxiYWNrIGJlY2F1c2UgdGhlIERTUAotCQkgKiByZXF1ZXN0ZWQgbW9yZSBkYXRhLiAgTm90ZSB0aGF0IHRoZSBEU1AgZG9lcyB3YW50Ci0JCSAqIG1vcmUgZGF0YSwgYW5kIGlmIGEgYnVmZmVyIHdhcyBpbi1mbGlnaHQsIG1hcmsgaXQKLQkJICogYXMgYXZhaWxhYmxlIChzaW5jZSB0aGUgRFNQIG11c3Qgbm93IGJlIGRvbmUgd2l0aAotCQkgKiBpdCkuCi0JCSAqLwotCQlhdWRpby0+b3V0X25lZWRlZCA9IDE7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpIHsKLQkJCU1NX0RCRygiZnJhbWUgJWQgZnJlZVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJCWZyYW1lLT51c2VkID0gMDsKLQkJCWF1ZGlvLT5vdXRfdGFpbCBePSAxOwotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl9Ci0JfQotCi0JaWYgKGF1ZGlvLT5vdXRfbmVlZGVkKSB7Ci0JCS8qIElmIHRoZSBEU1AgY3VycmVudGx5IHdhbnRzIGRhdGEgYW5kIHdlIGhhdmUgYQotCQkgKiBidWZmZXIgYXZhaWxhYmxlLCB3ZSB3aWxsIHNlbmQgaXQgYW5kIHJlc2V0Ci0JCSAqIHRoZSBuZWVkZWQgZmxhZy4gIFdlJ2xsIG1hcmsgdGhlIGJ1ZmZlciBhcyBpbi1mbGlnaHQKLQkJICogc28gdGhhdCBpdCB3b24ndCBiZSByZWN5Y2xlZCB1bnRpbCB0aGUgbmV4dCBidWZmZXIKLQkJICogaXMgcmVxdWVzdGVkCi0JCSAqLwotCi0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkKSB7Ci0JCQlCVUdfT04oZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZik7Ci0JCQlhdWRwcmVwcm9jX3BjbV9idWZmZXJfcHRyX3JlZnJlc2goYXVkaW8sCi0JCQkJCQkgYXVkaW8tPm91dF90YWlsLAotCQkJCQkJICAgIGZyYW1lLT51c2VkKTsKLQkJCWZyYW1lLT51c2VkID0gMHhmZmZmZmZmZjsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJfQotCX0KLSBkb25lOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi0KLXN0YXRpYyBpbnQgYXVkZXZyY19pbl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHBwb3MxLCBsb2ZmX3QgcHBvczIsIGludCBkYXRhc3luYykKLQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JaWYgKCFhdWRpby0+cnVubmluZyB8fCAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lX25vbG9jazsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCWF1ZGlvLT53Zmx1c2gpOwotCU1NX0RCRygid2FrZWQgb24gYnkgc29tZSBldmVudCBhdWRpby0+d2ZsdXNoID0gJWRcbiIsIGF1ZGlvLT53Zmx1c2gpOwotCi0JaWYgKHJjIDwgMCkKLQkJZ290byBkb25lOwotCWVsc2UgaWYgKGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotZG9uZV9ub2xvY2s6Ci0JcmV0dXJuIHJjOwotCi19Ci0KLSBpbnQgYXVkcHJlcHJvY19ldnJjX3Byb2Nlc3NfZW9zKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sCi0JCWNvbnN0IGNoYXIgX191c2VyICpidWZfc3RhcnQsIHVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplKQotewotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWludCByYyA9IDA7Ci0KLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKGF1ZGlvLT5vdXRfbmVlZGVkICYmCi0JCWF1ZGlvLT5vdXRbMF0udXNlZCA9PSAwICYmCi0JCWF1ZGlvLT5vdXRbMV0udXNlZCA9PSAwKQotCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGZyYW1lLT5kYXRhLCBidWZfc3RhcnQsIG1maWVsZF9zaXplKSkgewotCQlyYyA9IC1FRkFVTFQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlmcmFtZS0+bWZpZWxkX3N6ID0gbWZpZWxkX3NpemU7Ci0JYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JZnJhbWUtPnVzZWQgPSBtZmllbGRfc2l6ZTsKLQlNTV9EQkcoImNvcHlpbmcgbWV0YV9vdXQgZnJhbWUtPnVzZWQgPSAlZFxuIiwgZnJhbWUtPnVzZWQpOwotCWF1ZHByZXByb2NfcGNtX3NlbmRfZGF0YShhdWRpbywgMCk7Ci1kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkZXZyY19pbl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JY2hhciAqY3B5X3B0cjsKLQlpbnQgcmMgPSAwLCBlb3NfY29uZGl0aW9uID0gQVVEUFJFUFJPQ19FVlJDX0VPU19OT05FOwotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplID0gMDsKLQlpbnQgd3JpdGVfY291bnQgPSAwOwotCU1NX0RCRygiY250PSVkXG4iLCBjb3VudCk7Ci0KLQlpZiAoY291bnQgJiAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChhdWRpby0+bW9kZSAhPSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF9oZWFkOwotCS8qIGlmIHN1cHBsaWVkIGNvdW50IGlzIG1vcmUgdGhhbiBkcml2ZXIgYnVmZmVyIHNpemUKLQkgKiB0aGVuIG9ubHkgY29weSBkcml2ZXIgYnVmZmVyIHNpemUKLQkgKi8KLQlpZiAoY291bnQgPiBmcmFtZS0+c2l6ZSkKLQkJY291bnQgPSBmcmFtZS0+c2l6ZTsKLQotCXdyaXRlX2NvdW50ID0gY291bnQ7Ci0JY3B5X3B0ciA9IGZyYW1lLT5kYXRhOwotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCSAgICAgIChmcmFtZS0+dXNlZCA9PSAwKQotCQkJCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCQkJCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBlcnJvcjsKLQotCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGVycm9yOwotCX0KLQlpZiAoYXVkaW8tPm1maWVsZCkgewotCQlpZiAoYnVmID09IHN0YXJ0KSB7Ci0JCQkvKiBQcm9jZXNzaW5nIGJlZ2lubmluZyBvZiB1c2VyIGJ1ZmZlciAqLwotCQkJaWYgKF9fZ2V0X3VzZXIobWZpZWxkX3NpemUsCi0JCQkJKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSBidWYpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9IGVsc2UgaWYgKG1maWVsZF9zaXplID4gY291bnQpIHsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCU1NX0RCRygibWYgb2Zmc2V0X3ZhbCAleFxuIiwgbWZpZWxkX3NpemUpOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGNweV9wdHIsIGJ1ZiwgbWZpZWxkX3NpemUpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQkvKiBDaGVjayBpZiBFT1MgZmxhZyBpcyBzZXQgYW5kIGJ1ZmZlciBoYXMKLQkJCSAqIGNvbnRhaW5zIGp1c3QgbWV0YSBmaWVsZAotCQkJICovCi0JCQlpZiAoY3B5X3B0cltBVURQUkVQUk9DX0VWUkNfRU9TX0ZMR19PRkZTRVRdICYKLQkJCQkJQVVEUFJFUFJPQ19FVlJDX0VPU19GTEdfTUFTSykgewotCQkJCWVvc19jb25kaXRpb24gPSBBVURQUkVQUk9DX0VWUkNfRU9TX1NFVDsKLQkJCQlNTV9EQkcoIkVPUyBTRVRcbiIpOwotCQkJCWlmIChtZmllbGRfc2l6ZSA9PSBjb3VudCkgewotCQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQkJCWVvc19jb25kaXRpb24gPSAwOwotCQkJCQlnb3RvIGV4aXQ7Ci0JCQkJfSBlbHNlCi0JCQkJY3B5X3B0cltBVURQUkVQUk9DX0VWUkNfRU9TX0ZMR19PRkZTRVRdICY9Ci0JCQkJCX5BVURQUkVQUk9DX0VWUkNfRU9TX0ZMR19NQVNLOwotCQkJfQotCQkJY3B5X3B0ciArPSBtZmllbGRfc2l6ZTsKLQkJCWNvdW50IC09IG1maWVsZF9zaXplOwotCQkJYnVmICs9IG1maWVsZF9zaXplOwotCQl9IGVsc2UgewotCQkJbWZpZWxkX3NpemUgPSAwOwotCQkJTU1fREJHKCJjb250aW51b3VzIGJ1ZmZlclxuIik7Ci0JCX0KLQkJZnJhbWUtPm1maWVsZF9zeiA9IG1maWVsZF9zaXplOwotCX0KLQlNTV9EQkcoImNvcHlpbmcgdGhlIHN0cmVhbSBjb3VudCA9ICVkXG4iLCBjb3VudCk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGNweV9wdHIsIGJ1ZiwgY291bnQpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBlcnJvcjsKLQl9Ci1leGl0OgotCWZyYW1lLT51c2VkID0gY291bnQ7Ci0JYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JaWYgKCFhdWRpby0+Zmx1c2hfYWNrKQotCQlhdWRwcmVwcm9jX3BjbV9zZW5kX2RhdGEoYXVkaW8sIDApOwotCWVsc2UgewotCQlhdWRwcmVwcm9jX3BjbV9zZW5kX2RhdGEoYXVkaW8sIDEpOwotCQlhdWRpby0+Zmx1c2hfYWNrID0gMDsKLQl9Ci0JaWYgKGVvc19jb25kaXRpb24gPT0gQVVEUFJFUFJPQ19FVlJDX0VPU19TRVQpCi0JCXJjID0gYXVkcHJlcHJvY19ldnJjX3Byb2Nlc3NfZW9zKGF1ZGlvLCBzdGFydCwgbWZpZWxkX3NpemUpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXJldHVybiB3cml0ZV9jb3VudDsKLWVycm9yOgotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRldnJjX2luX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRpby0+aW5fY2FsbCA9IDA7Ci0JLyogd2l0aCBkcmF3IGZyZXF1ZW5jeSBmb3Igc2Vzc2lvbgotCSAgIGluY2FzZSBub3Qgc3RvcHBlZCB0aGUgZHJpdmVyICovCi0JbXNtX3NuZGRldl93aXRoZHJhd19mcmVxKGF1ZGlvLT5lbmNfaWQsIFNORERFVl9DQVBfVFgsCi0JCQkJCUFVRERFVl9DTE5UX0VOQyk7Ci0JYXVkZGV2X3VucmVnaXN0ZXJfZXZ0X2xpc3RuZXIoQVVEREVWX0NMTlRfRU5DLCBhdWRpby0+ZW5jX2lkKTsKLQkvKnJlc2V0IHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgaW5mb3JtYXRpb24gYXQgYXVkcHJlcHJvYyBsYXllciovCi0JYXVkaW8tPnNlc3Npb25faW5mby5zYW1wbGluZ19mcmVxID0gMDsKLQlhdWRwcmVwcm9jX3VwZGF0ZV9hdWRyZWNfaW5mbygmYXVkaW8tPnNlc3Npb25faW5mbyk7Ci0JYXVkZXZyY19pbl9kaXNhYmxlKGF1ZGlvKTsKLQlhdWRldnJjX2luX2ZsdXNoKGF1ZGlvKTsKLQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHJlYyk7Ci0JYXVkcHJlcHJvY19hZW5jX2ZyZWUoYXVkaW8tPmVuY19pZCk7Ci0JYXVkaW8tPmF1ZHJlYyA9IE5VTEw7Ci0JYXVkaW8tPm9wZW5lZCA9IDA7Ci0JaWYgKGF1ZGlvLT5kYXRhKSB7Ci0JCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLQkJYXVkaW8tPmRhdGEgPSBOVUxMOwotCX0KLQlpZiAoYXVkaW8tPm91dF9kYXRhKSB7Ci0JCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci0JCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotCQlhdWRpby0+b3V0X2RhdGEgPSBOVUxMOwotCX0KLQlpb25fY2xpZW50X2Rlc3Ryb3koYXVkaW8tPmNsaWVudCk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBhdWRpb19pbiB0aGVfYXVkaW9fZXZyY19pbjsKLXN0YXRpYyBpbnQgYXVkZXZyY19pbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSAmdGhlX2F1ZGlvX2V2cmNfaW47Ci0JaW50IHJjOwotCWludCBlbmNpZDsKLQlpbnQgbGVuID0gMDsKLQl1bnNpZ25lZCBsb25nIGlvbmZsYWcgPSAwOwotCWlvbl9waHlzX2FkZHJfdCBhZGRyID0gMDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50ID0gTlVMTDsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlpZiAoYXVkaW8tPm9wZW5lZCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWNsaWVudCA9IG1zbV9pb25fY2xpZW50X2NyZWF0ZShVSU5UX01BWCwgIkF1ZGlvX0VWUkNfaW5fY2xpZW50Iik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGNsaWVudCkpIHsKLQkJTU1fRVJSKCJVbmFibGUgdG8gY3JlYXRlIElPTiBjbGllbnRcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gY2xpZW50X2NyZWF0ZV9lcnJvcjsKLQl9Ci0JYXVkaW8tPmNsaWVudCA9IGNsaWVudDsKLQotCU1NX0RCRygiYWxsb2NhdGluZyBtZW0gc3ogPSAlZFxuIiwgRE1BU1opOwotCWhhbmRsZSA9IGlvbl9hbGxvYyhjbGllbnQsIERNQVNaLCBTWl80SywKLQkJSU9OX0hFQVAoSU9OX0FVRElPX0hFQVBfSUQpLCAwKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoaGFuZGxlKSkgewotCQlNTV9FUlIoIlVuYWJsZSB0byBjcmVhdGUgYWxsb2NhdGUgTy9QIGJ1ZmZlcnNcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfYWxsb2NfZXJyb3I7Ci0JfQotCi0JYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSA9IGhhbmRsZTsKLQotCXJjID0gaW9uX3BoeXMoY2xpZW50ICwgaGFuZGxlLCAmYWRkciwgJmxlbik7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiTy9QIGJ1ZmZlcnM6SW52YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRwdXRfYnVmZl9nZXRfcGh5c19lcnJvcjsKLQl9IGVsc2UgewotCQlNTV9JTkZPKCJPL1AgYnVmZmVyczp2YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JfQotCWF1ZGlvLT5waHlzID0gKGludDMyX3QpYWRkcjsKLQotCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MoY2xpZW50LCBoYW5kbGUsICZpb25mbGFnKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgZ2V0IGZsYWdzIGZvciB0aGUgaGFuZGxlXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dHB1dF9idWZmX2dldF9mbGFnc19lcnJvcjsKLQl9Ci0KLQlhdWRpby0+bWFwX3ZfcmVhZCA9IGlvbl9tYXBfa2VybmVsKGNsaWVudCwgaGFuZGxlKTsKLQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl9yZWFkKSkgewotCQlNTV9FUlIoImNvdWxkIG5vdCBtYXAgcmVhZCBidWZmZXJzLGZyZWVpbmcgaW5zdGFuY2UgMHglMDh4XG4iLAotCQkJCShpbnQpYXVkaW8pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfbWFwX2Vycm9yOwotCX0KLQlhdWRpby0+ZGF0YSA9IGF1ZGlvLT5tYXBfdl9yZWFkOwotCi0JTU1fREJHKCJNZW1vcnkgYWRkciA9IDB4JTh4ICBwaHkgYWRkciA9IDB4JTh4XG4iLFwKLQkJKGludCkgYXVkaW8tPmRhdGEsIChpbnQpIGF1ZGlvLT5waHlzKTsKLQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJYXVkaW8tPm1vZGUgPSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTDsKLQkJTU1fREJHKCJPcGVuZWQgZm9yIG5vbiB0dW5uZWwgbW9kZSBlbmNvZGluZ1xuIik7Ci0JfSBlbHNlIGlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJYXVkaW8tPm1vZGUgPSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTDsKLQkJTU1fREJHKCJPcGVuZWQgZm9yIHR1bm5lbCBtb2RlIGVuY29kaW5nXG4iKTsKLQl9IGVsc2UgewotCQlNTV9FUlIoIkludmFsaWQgbW9kZVxuIik7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIFNldHRpbmdzIHdpbGwgYmUgcmUtY29uZmlnIGF0IEFVRElPX1NFVF9DT05GSUcsCi0JICogYnV0IGF0IGxlYXN0IHdlIG5lZWQgdG8gaGF2ZSBpbml0aWFsIGNvbmZpZwotCSAqLwotCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkKLQkJCWF1ZGlvLT5idWZmZXJfc2l6ZSA9IChFVlJDX0ZSQU1FX1NJWkUgKyAxNCk7Ci0JZWxzZQotCQkJYXVkaW8tPmJ1ZmZlcl9zaXplID0gKEZSQU1FX1NJWkUgLSA4KTsKLQlhdWRpby0+ZW5jX3R5cGUgPSBFTkNfVFlQRV9FVlJDIHwgYXVkaW8tPm1vZGU7Ci0JYXVkaW8tPnNhbXBfcmF0ZSA9IDgwMDA7Ci0JYXVkaW8tPmNoYW5uZWxfbW9kZSA9IEFVRFJFQ19DTURfTU9ERV9NT05POwotCWF1ZGlvLT5jZmcuY2RtYV9yYXRlID0gQ0RNQV9SQVRFX0ZVTEw7Ci0JYXVkaW8tPmNmZy5taW5fYml0X3JhdGUgPSBDRE1BX1JBVEVfRlVMTDsKLQlhdWRpby0+Y2ZnLm1heF9iaXRfcmF0ZSA9IENETUFfUkFURV9GVUxMOwotCi0JZW5jaWQgPSBhdWRwcmVwcm9jX2FlbmNfYWxsb2MoYXVkaW8tPmVuY190eXBlLCAmYXVkaW8tPm1vZHVsZV9uYW1lLAotCQkJJmF1ZGlvLT5xdWV1ZV9pZHMpOwotCWlmIChlbmNpZCA8IDApIHsKLQkJTU1fRVJSKCJObyBmcmVlIGVuY29kZXIgYXZhaWxhYmxlXG4iKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGRvbmU7Ci0JfQotCWF1ZGlvLT5lbmNfaWQgPSBlbmNpZDsKLQotCXJjID0gbXNtX2Fkc3BfZ2V0KGF1ZGlvLT5tb2R1bGVfbmFtZSwgJmF1ZGlvLT5hdWRyZWMsCi0JCQkgICAmYXVkcmVjX2V2cmNfYWRzcF9vcHMsIGF1ZGlvKTsKLQotCWlmIChyYykgewotCQlhdWRwcmVwcm9jX2FlbmNfZnJlZShhdWRpby0+ZW5jX2lkKTsKLQkJZ290byBkb25lOwotCX0KLQotCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQlhdWRpby0+c291cmNlID0gMDsKLQlhdWRpby0+d2ZsdXNoID0gMDsKLQlhdWRpby0+cmZsdXNoID0gMDsKLQlhdWRpby0+Zmx1c2hfYWNrID0gMDsKLQotCWF1ZGV2cmNfaW5fZmx1c2goYXVkaW8pOwotCWF1ZGV2cmNfb3V0X2ZsdXNoKGF1ZGlvKTsKLQotCU1NX0RCRygiYWxsb2NhdGluZyBCVUZGRVJfU0laRSAgJWRcbiIsIEJVRkZFUl9TSVpFKTsKLQloYW5kbGUgPSBpb25fYWxsb2MoY2xpZW50LCBCVUZGRVJfU0laRSwKLQkJCVNaXzRLLCBJT05fSEVBUChJT05fQVVESU9fSEVBUF9JRCksIDApOwotCWlmIChJU19FUlJfT1JfTlVMTChoYW5kbGUpKSB7Ci0JCU1NX0VSUigiVW5hYmxlIHRvIGNyZWF0ZSBhbGxvY2F0ZSBJL1AgYnVmZmVyc1xuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBpbnB1dF9idWZmX2FsbG9jX2Vycm9yOwotCX0KLQotCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IGhhbmRsZTsKLQotCXJjID0gaW9uX3BoeXMoY2xpZW50ICwgaGFuZGxlLCAmYWRkciwgJmxlbik7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiSS9QIGJ1ZmZlcnM6SW52YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBpbnB1dF9idWZmX2FsbG9jX2Vycm9yOwotCX0gZWxzZSB7Ci0JCU1NX0lORk8oIkdvdCB2YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsCi0JCQkodW5zaWduZWQgaW50KSBsZW4pOwotCX0KLQlhdWRpby0+b3V0X3BoeXMgPSAoaW50MzJfdClhZGRyOwotCi0JcmMgPSBpb25faGFuZGxlX2dldF9mbGFncyhjbGllbnQsCi0JCWhhbmRsZSwgJmlvbmZsYWcpOwotCWlmIChyYykgewotCQlNTV9FUlIoImNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gaW5wdXRfYnVmZl9hbGxvY19lcnJvcjsKLQl9Ci0KLQlhdWRpby0+bWFwX3Zfd3JpdGUgPSBpb25fbWFwX2tlcm5lbChjbGllbnQsIGhhbmRsZSk7Ci0JaWYgKElTX0VSUihhdWRpby0+bWFwX3Zfd3JpdGUpKSB7Ci0JCU1NX0VSUigiY291bGQgbm90IG1hcCB3cml0ZSBidWZmZXJzXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGlucHV0X2J1ZmZfbWFwX2Vycm9yOwotCX0KLQlhdWRpby0+b3V0X2RhdGEgPSBhdWRpby0+bWFwX3Zfd3JpdGU7Ci0JTU1fREJHKCJ3cml0ZSBidWY6IHBoeSBhZGRyIDB4JTA4eCBrZXJuZWwgYWRkciAweCUwOHhcbiIsCi0JCQkJKHVuc2lnbmVkIGludClhZGRyLAotCQkJCSh1bnNpZ25lZCBpbnQpYXVkaW8tPm91dF9kYXRhKTsKLQotCQkvKiBJbml0aWFsaXplIGJ1ZmZlciAqLwotCWF1ZGlvLT5vdXRbMF0uZGF0YSA9IGF1ZGlvLT5vdXRfZGF0YSArIDA7Ci0JYXVkaW8tPm91dFswXS5hZGRyID0gYXVkaW8tPm91dF9waHlzICsgMDsKLQlhdWRpby0+b3V0WzBdLnNpemUgPSBPVVRfQlVGRkVSX1NJWkU7Ci0KLQlhdWRpby0+b3V0WzFdLmRhdGEgPSBhdWRpby0+b3V0X2RhdGEgKyBPVVRfQlVGRkVSX1NJWkU7Ci0JYXVkaW8tPm91dFsxXS5hZGRyID0gYXVkaW8tPm91dF9waHlzICsgT1VUX0JVRkZFUl9TSVpFOwotCWF1ZGlvLT5vdXRbMV0uc2l6ZSA9IE9VVF9CVUZGRVJfU0laRTsKLQotCU1NX0RCRygiYXVkaW8tPm91dFswXS5kYXRhID0gJWQgIGF1ZGlvLT5vdXRbMV0uZGF0YSA9ICVkIiwKLQkJCQkJKHVuc2lnbmVkIGludClhdWRpby0+b3V0WzBdLmRhdGEsCi0JCQkJCSh1bnNpZ25lZCBpbnQpYXVkaW8tPm91dFsxXS5kYXRhKTsKLQlhdWRpby0+ZGV2aWNlX2V2ZW50cyA9IEFVRERFVl9FVlRfREVWX1JEWSB8IEFVRERFVl9FVlRfREVWX1JMUyB8Ci0JCQkJQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEc7Ci0KLQlhdWRpby0+dm9pY2Vfc3RhdGUgPSBtc21fZ2V0X3ZvaWNlX3N0YXRlKCk7Ci0JcmMgPSBhdWRkZXZfcmVnaXN0ZXJfZXZ0X2xpc3RuZXIoYXVkaW8tPmRldmljZV9ldmVudHMsCi0JCQkJCUFVRERFVl9DTE5UX0VOQywgYXVkaW8tPmVuY19pZCwKLQkJCQkJZXZyY19pbl9saXN0ZW5lciwgKHZvaWQgKikgYXVkaW8pOwotCWlmIChyYykgewotCQlNTV9FUlIoImZhaWxlZCB0byByZWdpc3RlciBkZXZpY2UgZXZlbnQgbGlzdGVuZXJcbiIpOwotCQlpb3VubWFwKGF1ZGlvLT5tYXBfdl93cml0ZSk7Ci0JCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPm91dF9waHlzKTsKLQkJZ290byBldnRfZXJyb3I7Ci0JfQotCWF1ZGlvLT5tZmllbGQgPSBNRVRBX09VVF9TSVpFOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOwotCWF1ZGlvLT5vcGVuZWQgPSAxOwotCWF1ZGlvLT5vdXRfZnJhbWVfY250Kys7Ci0JYXVkaW8tPmJ1aWxkX2lkID0gc29jaW5mb19nZXRfYnVpbGRfaWQoKTsKLQlNTV9EQkcoIk1vZGVtIGJ1aWxkIGlkID0gJXNcbiIsIGF1ZGlvLT5idWlsZF9pZCk7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotZXZ0X2Vycm9yOgotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcmVjKTsKLQlhdWRwcmVwcm9jX2FlbmNfZnJlZShhdWRpby0+ZW5jX2lkKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLWlucHV0X2J1ZmZfbWFwX2Vycm9yOgotCWlvbl9mcmVlKGNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLWlucHV0X2J1ZmZfYWxsb2NfZXJyb3I6Ci0JaW9uX3VubWFwX2tlcm5lbChjbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotb3V0cHV0X2J1ZmZfbWFwX2Vycm9yOgotb3V0cHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I6Ci1vdXRwdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I6Ci0JaW9uX2ZyZWUoY2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLW91dHB1dF9idWZmX2FsbG9jX2Vycm9yOgotCWlvbl9jbGllbnRfZGVzdHJveShjbGllbnQpOwotY2xpZW50X2NyZWF0ZV9lcnJvcjoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2luX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGF1ZGV2cmNfaW5fb3BlbiwKLQkucmVsZWFzZQk9IGF1ZGV2cmNfaW5fcmVsZWFzZSwKLQkucmVhZAkJPSBhdWRldnJjX2luX3JlYWQsCi0JLndyaXRlCQk9IGF1ZGV2cmNfaW5fd3JpdGUsCi0JLmZzeW5jCQk9IGF1ZGV2cmNfaW5fZnN5bmMsCi0JLnVubG9ja2VkX2lvY3RsCT0gYXVkZXZyY19pbl9pb2N0bCwKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2V2cmNfaW5fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX2V2cmNfaW4iLAotCS5mb3BzCT0gJmF1ZGlvX2luX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRldnJjX2luX2luaXQodm9pZCkKLXsKLQltdXRleF9pbml0KCZ0aGVfYXVkaW9fZXZyY19pbi5sb2NrKTsKLQltdXRleF9pbml0KCZ0aGVfYXVkaW9fZXZyY19pbi5yZWFkX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZ0aGVfYXVkaW9fZXZyY19pbi5kc3BfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnRoZV9hdWRpb19ldnJjX2luLmRldl9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfYXVkaW9fZXZyY19pbi53YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfYXVkaW9fZXZyY19pbi53YWl0X2VuYWJsZSk7Ci0JbXV0ZXhfaW5pdCgmdGhlX2F1ZGlvX2V2cmNfaW4ud3JpdGVfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdGhlX2F1ZGlvX2V2cmNfaW4ud3JpdGVfd2FpdCk7Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2V2cmNfaW5fbWlzYyk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhdWRldnJjX2luX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19mbS5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19mbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzU0OGFjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fZm0uYworKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogQmFzZWQgb24gdGhlIG1wMyBuYXRpdmUgZHJpdmVyIGluIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fbXAzLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKgotICogQWxsIHNvdXJjZSBjb2RlIGluIHRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgZXhjZXB0Ci0gKiB3aGVyZSBpbmRpY2F0ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAotICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gZmluZCBpdCBhdCBodHRwOi8vd3d3LmZzZi5vcmcKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hZmUuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYWNkYl9jb21tYW5kcy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19hY2RiaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19hY2RiX2RlZi5oPgotCi0jZGVmaW5lIFNFU1NJT05fSURfRk0gNgotI2RlZmluZSBGTV9FTkFCTEUJMHhGRkZGCi0jZGVmaW5lIEZNX0RJU0FCTEUJMHgwCi0jZGVmaW5lIEZNX0NPUFAJCTB4MgotLyogTWFjcm8gc3BlY2lmaWVzIG1heGltdW0gRk0gcm91dGluZwotCXBvc3NpYmxlICovCi0jZGVmaW5lIEZNX01BWF9SWF9ST1VURQkweDIKLQotc3RydWN0IGZtX3J4X2NhbGliX2dhaW4gewotCXVpbnQxNl90IGRldmljZV9pZDsKLQlzdHJ1Y3QgYXVkZGV2X2V2dF9kZXZpbmZvIGRldl9kZXRhaWxzOwotCXN0cnVjdCAgYWNkYl9jYWxpYl9nYWluX3J4ICBjYWxpYl9yeDsKLX07Ci0KLXN0cnVjdCBhdWRpbyB7Ci0Jc3RydWN0IG11dGV4IGxvY2s7Ci0KLQlpbnQgb3BlbmVkOwotCWludCBlbmFibGVkOwotCWludCBydW5uaW5nOwotCi0JdWludDE2X3QgZGVjX2lkOwotCXVpbnQxNl90IHNvdXJjZTsKLQl1aW50MTZfdCBmbV9zb3VyY2U7Ci0JdWludDE2X3QgZm1fbWFzazsKLQl1aW50MzJfdCBkZXZpY2VfZXZlbnRzOwotCXVpbnQxNl90IHZvbHVtZTsKLQlzdHJ1Y3QgZm1fcnhfY2FsaWJfZ2FpbiBmbV9jYWxpYnJhdGlvbl9yeFtGTV9NQVhfUlhfUk9VVEVdOwotfTsKLQotc3RhdGljIHN0cnVjdCBhdWRpbyBmbV9hdWRpbzsKLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGlvX2VuYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWludCByYyA9IDA7Ci0JaWYgKGF1ZGlvLT5lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCU1NX0RCRygiZm0gbWFzaz0gJTA4eCBmbV9zb3VyY2UgPSAlMDh4XG4iLAotCQkJYXVkaW8tPmZtX21hc2ssIGF1ZGlvLT5mbV9zb3VyY2UpOwotCWlmIChhdWRpby0+Zm1fbWFzayAmJiBhdWRpby0+Zm1fc291cmNlKSB7Ci0JCXJjID0gYWZlX2NvbmZpZ19mbV9jb2RlYyhGTV9FTkFCTEUsIGF1ZGlvLT5mbV9tYXNrKTsKLQkJaWYgKCFyYykKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMTsKLQkJLyogUm91dGVkIHRvIGljb2RlYyByeCBwYXRoICovCi0JCWlmICgoYXVkaW8tPmZtX21hc2sgJiBBRkVfSFdfUEFUSF9DT0RFQ19SWCkgPT0KLQkJCQlBRkVfSFdfUEFUSF9DT0RFQ19SWCkgewotCQkJYWZlX2NvbmZpZ19mbV9jYWxpYnJhdGlvbl9nYWluKAotCQkJYXVkaW8tPmZtX2NhbGlicmF0aW9uX3J4WzBdLmRldmljZV9pZCwKLQkJCWF1ZGlvLT5mbV9jYWxpYnJhdGlvbl9yeFswXS5jYWxpYl9yeC5hdWRwcGNhbGdhaW4pOwotCQl9Ci0JCS8qIFJvdXRlZCB0byBhdXggY29kZWMgcnggcGF0aCAqLwotCQlpZiAoKGF1ZGlvLT5mbV9tYXNrICYgQUZFX0hXX1BBVEhfQVVYUENNX1JYKSA9PQotCQkJCUFGRV9IV19QQVRIX0FVWFBDTV9SWCl7Ci0JCQlhZmVfY29uZmlnX2ZtX2NhbGlicmF0aW9uX2dhaW4oCi0JCQlhdWRpby0+Zm1fY2FsaWJyYXRpb25fcnhbMV0uZGV2aWNlX2lkLAotCQkJYXVkaW8tPmZtX2NhbGlicmF0aW9uX3J4WzFdLmNhbGliX3J4LmF1ZHBwY2FsZ2Fpbik7Ci0JCX0KLQl9Ci0KLQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBmbV9saXN0bmVyKHUzMiBldnRfaWQsIHVuaW9uIGF1ZGRldl9ldnRfZGF0YSAqZXZ0X3BheWxvYWQsCi0JCQl2b2lkICpwcml2YXRlX2RhdGEpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IChzdHJ1Y3QgYXVkaW8gKikgcHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhdWRkZXZfZXZ0X2RldmluZm8gKmRldmluZm8gPQotCQkJKHN0cnVjdCBhdWRkZXZfZXZ0X2RldmluZm8gKilldnRfcGF5bG9hZDsKLQlzd2l0Y2ggKGV2dF9pZCkgewotCWNhc2UgQVVEREVWX0VWVF9ERVZfUkRZOgotCQlNTV9EQkcoIjpBVURERVZfRVZUX0RFVl9SRFlcbiIpOwotCQlpZiAoZXZ0X3BheWxvYWQtPnJvdXRpbmdfaWQgPT0gRk1fQ09QUCkKLQkJCWF1ZGlvLT5mbV9zb3VyY2UgPSAxOwotCQllbHNlCi0JCQlhdWRpby0+c291cmNlID0gKDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0KLQkJaWYgKGF1ZGlvLT5zb3VyY2UgJiAweDEpCi0JCQlhdWRpby0+Zm1fbWFzayA9IDB4MTsKLQkJZWxzZSBpZiAoYXVkaW8tPnNvdXJjZSAmIDB4MikKLQkJCWF1ZGlvLT5mbV9tYXNrID0gMHgzOwotCQllbHNlCi0JCQlhdWRpby0+Zm1fbWFzayA9IDB4MDsKLQotCQlpZiAoIWF1ZGlvLT5lbmFibGVkCi0JCQl8fCAhYXVkaW8tPmZtX21hc2sKLQkJCXx8ICFhdWRpby0+Zm1fc291cmNlKQotCQkJYnJlYWs7Ci0JCWVsc2UgewotCQkJYWZlX2NvbmZpZ19mbV9jb2RlYyhGTV9FTkFCTEUsIGF1ZGlvLT5mbV9tYXNrKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMTsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfREVWX1JMUzoKLQkJTU1fREJHKCI6QVVEREVWX0VWVF9ERVZfUkxTXG4iKTsKLQkJaWYgKGV2dF9wYXlsb2FkLT5yb3V0aW5nX2lkID09IEZNX0NPUFApCi0JCQlhdWRpby0+Zm1fc291cmNlID0gMDsKLQkJZWxzZQotCQkJYXVkaW8tPnNvdXJjZSAmPSB+KDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0KLQkJaWYgKGF1ZGlvLT5zb3VyY2UgJiAweDEpCi0JCQlhdWRpby0+Zm1fbWFzayA9IDB4MTsKLQkJZWxzZSBpZiAoYXVkaW8tPnNvdXJjZSAmIDB4MikKLQkJCWF1ZGlvLT5mbV9tYXNrID0gMHgzOwotCQllbHNlCi0JCQlhdWRpby0+Zm1fbWFzayA9IDB4MDsKLQotCQlpZiAoYXVkaW8tPnJ1bm5pbmcKLQkJCSYmICghYXVkaW8tPmZtX21hc2sgfHwgIWF1ZGlvLT5mbV9zb3VyY2UpKSB7Ci0JCQlhZmVfY29uZmlnX2ZtX2NvZGVjKEZNX0RJU0FCTEUsIGF1ZGlvLT5mbV9tYXNrKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEc6Ci0JCU1NX0RCRygiOkFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEcsIHN0cmVhbSB2b2wgXG4iKTsKLQkJYXVkaW8tPnZvbHVtZSA9IGV2dF9wYXlsb2FkLT5zZXNzaW9uX3ZvbDsKLQkJYWZlX2NvbmZpZ19mbV92b2x1bWUoYXVkaW8tPnZvbHVtZSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEREVWX0VWVF9ERVZJQ0VfSU5GTzp7Ci0JCXN0cnVjdCBhY2RiX2dldF9ibG9jayBnZXRfYmxvY2s7Ci0JCWludCByYyA9IDA7Ci0JCU1NX0RCRygiOkFVRERFVl9FVlRfREVWSUNFX0lORk9cbiIpOwotCQlNTV9EQkcoInNhbXBsZV9yYXRlID0gJWRcbiIsIGRldmluZm8tPnNhbXBsZV9yYXRlKTsKLQkJTU1fREJHKCJhY2RiX2lkID0gJWRcbiIsIGRldmluZm8tPmFjZGJfaWQpOwotCQkvKiBBcHBsdWNhYmxlIG9ubHkgZm9yIGljb2RlYyByeCBhbmQgYXV4IGNvZGVjIHJ4IHBhdGgKLQkJCWFuZCBmbSBzdHJlYW0gcm91dGVkIHRvIGl0ICovCi0JCWlmICgoKGRldmluZm8tPmRldl9pZCA9PSAweDAwKSB8fCAoZGV2aW5mby0+ZGV2X2lkID09IDB4MDEpKSAmJgotCQkJKGRldmluZm8tPnNlc3Npb25zICYmICgxIDw8IGF1ZGlvLT5kZWNfaWQpKSkgewotCQkJLyogUXVlcnkgQUNEQiBkcml2ZXIgZm9yIGNhbGliIGdhaW4sIG9ubHkgaWYgZGlmZmVyZW5jZQotCQkJCWluIGRldmljZSAqLwotCQkJaWYgKChhdWRpby0+Zm1fY2FsaWJyYXRpb25fcnhbZGV2aW5mby0+ZGV2X2lkXS4KLQkJCQlkZXZfZGV0YWlscy5hY2RiX2lkICE9IGRldmluZm8tPmFjZGJfaWQpIHx8Ci0JCQkJKGF1ZGlvLT5mbV9jYWxpYnJhdGlvbl9yeFtkZXZpbmZvLT5kZXZfaWRdLgotCQkJCWRldl9kZXRhaWxzLnNhbXBsZV9yYXRlICE9Ci0JCQkJCWRldmluZm8tPnNhbXBsZV9yYXRlKSkgewotCQkJCWF1ZGlvLT5mbV9jYWxpYnJhdGlvbl9yeFtkZXZpbmZvLT5kZXZfaWRdLgotCQkJCQlkZXZfZGV0YWlscy5kZXZfaWQgPSBkZXZpbmZvLT5kZXZfaWQ7Ci0JCQkJYXVkaW8tPmZtX2NhbGlicmF0aW9uX3J4W2RldmluZm8tPmRldl9pZF0uCi0JCQkJCWRldl9kZXRhaWxzLnNhbXBsZV9yYXRlID0KLQkJCQkJCWRldmluZm8tPnNhbXBsZV9yYXRlOwotCQkJCWF1ZGlvLT5mbV9jYWxpYnJhdGlvbl9yeFtkZXZpbmZvLT5kZXZfaWRdLgotCQkJCQlkZXZfZGV0YWlscy5kZXZfdHlwZSA9Ci0JCQkJCQlkZXZpbmZvLT5kZXZfdHlwZTsKLQkJCQlhdWRpby0+Zm1fY2FsaWJyYXRpb25fcnhbZGV2aW5mby0+ZGV2X2lkXS4KLQkJCQkJZGV2X2RldGFpbHMuc2Vzc2lvbnMgPQotCQkJCQkJZGV2aW5mby0+c2Vzc2lvbnM7Ci0JCQkJLyogUXVlcnkgQUNEQiBkcml2ZXIgZm9yIGNhbGlicmF0aW9uIGdhaW4gKi8KLQkJCQlnZXRfYmxvY2suYWNkYl9pZCA9IGRldmluZm8tPmFjZGJfaWQ7Ci0JCQkJZ2V0X2Jsb2NrLnNhbXBsZV9yYXRlX2lkID0gZGV2aW5mby0+c2FtcGxlX3JhdGU7Ci0JCQkJZ2V0X2Jsb2NrLmludGVyZmFjZV9pZCA9Ci0JCQkJCUlJRF9BVURJT19DQUxJQlJBVElPTl9HQUlOX1JYOwotCQkJCWdldF9ibG9jay5hbGdvcml0aG1fYmxvY2tfaWQgPQotCQkJCQlBQklEX0FVRElPX0NBTElCUkFUSU9OX0dBSU5fUlg7Ci0JCQkJZ2V0X2Jsb2NrLnRvdGFsX2J5dGVzID0KLQkJCQkJc2l6ZW9mKHN0cnVjdCAgYWNkYl9jYWxpYl9nYWluX3J4KTsKLQkJCQlnZXRfYmxvY2suYnVmX3B0ciA9ICh1MzIgKikKLQkJCQkmYXVkaW8tPmZtX2NhbGlicmF0aW9uX3J4W2RldmluZm8tPmRldl9pZF0uCi0JCQkJY2FsaWJfcng7Ci0KLQkJCQlyYyA9IGFjZGJfZ2V0X2NhbGlicmF0aW9uX2RhdGEoJmdldF9ibG9jayk7Ci0JCQkJaWYgKHJjIDwgMCkgewotCQkJCQlNTV9FUlIoIlVuYWJsZSB0byBnZXQgY2FsaWJyYXRpb24iXAotCQkJCQkJImdhaW5cbiIpOwotCQkJCQkvKiBTZXQgdG8gdW5pdHkgaW5jYXNlIG9mIGVycm9yICovCi0JCQkJCWF1ZGlvLT5cCi0JCQkJCWZtX2NhbGlicmF0aW9uX3J4W2RldmluZm8tPmRldl9pZF0uCi0JCQkJCWNhbGliX3J4LmF1ZHBwY2FsZ2FpbiA9IDB4MjAwMDsKLQkJCQl9IGVsc2UKLQkJCQkJTU1fREJHKCJjYWxpYnJhdGlvbiBnYWluID0gMHglOHhcbiIsCi0JCQkJCQkqKGdldF9ibG9jay5idWZfcHRyKSk7Ci0JCQl9Ci0JCQlpZiAoYXVkaW8tPnJ1bm5pbmcpIHsKLQkJCQlhZmVfY29uZmlnX2ZtX2NhbGlicmF0aW9uX2dhaW4oCi0JCQkJYXVkaW8tPmZtX2NhbGlicmF0aW9uX3J4W2RldmluZm8tPmRldl9pZF0uCi0JCQkJCWRldmljZV9pZCwKLQkJCQlhdWRpby0+Zm1fY2FsaWJyYXRpb25fcnhbZGV2aW5mby0+ZGV2X2lkXS4KLQkJCQkJY2FsaWJfcnguYXVkcHBjYWxnYWluKTsKLQkJCQl9Ci0JCQl9Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlNTV9EQkcoIjpFUlJPUjp3cm9uZyBldmVudFxuIik7Ci0JCWJyZWFrOwotCX0KLX0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRpb19kaXNhYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlyZXR1cm4gYWZlX2NvbmZpZ19mbV9jb2RlYyhGTV9ESVNBQkxFLCBhdWRpby0+c291cmNlKTsKLX0KLQotc3RhdGljIGxvbmcgYXVkaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gLUVJTlZBTDsKLQotCU1NX0RCRygiY21kID0gJWRcbiIsIGNtZCk7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCQlNTV9EQkcoIkFVRElPX1NUQVJUXG4iKTsKLQkJcmMgPSBhdWRpb19lbmFibGUoYXVkaW8pOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NUT1A6Ci0JCU1NX0RCRygiQVVESU9fU1RPUFxuIik7Ci0JCXJjID0gYXVkaW9fZGlzYWJsZShhdWRpbyk7Ci0JCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9TRVNTSU9OX0lEOgotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmF1ZGlvLT5kZWNfaWQsCi0JCQkJCXNpemVvZih1bnNpZ25lZCBzaG9ydCkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCU1NX0RCRygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGZyZWVpbmdcbiIsIChpbnQpYXVkaW8pOwotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRkZXZfdW5yZWdpc3Rlcl9ldnRfbGlzdG5lcihBVURERVZfQ0xOVF9ERUMsIGF1ZGlvLT5kZWNfaWQpOwotCWF1ZGlvX2Rpc2FibGUoYXVkaW8pOwotCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JYXVkaW8tPm9wZW5lZCA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gJmZtX2F1ZGlvOwotCWludCByYyA9IDA7Ci0KLQotCWlmIChhdWRpby0+b3BlbmVkKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JLyogQWxsb2NhdGUgdGhlIGRlY29kZXIgKi8KLQlhdWRpby0+ZGVjX2lkID0gU0VTU0lPTl9JRF9GTTsKLQotCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQlhdWRpby0+Zm1fc291cmNlID0gMDsKLQlhdWRpby0+Zm1fbWFzayA9IDA7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBjYWxpYnJhdGlvbiBnYWluIHN0cnVjdHVyZSAqLwotCWF1ZGlvLT5mbV9jYWxpYnJhdGlvbl9yeFswXS5kZXZpY2VfaWQgPSBBRkVfSFdfUEFUSF9DT0RFQ19SWDsKLQlhdWRpby0+Zm1fY2FsaWJyYXRpb25fcnhbMV0uZGV2aWNlX2lkID0gQUZFX0hXX1BBVEhfQVVYUENNX1JYOwotCWF1ZGlvLT5mbV9jYWxpYnJhdGlvbl9yeFswXS5jYWxpYl9yeC5hdWRwcGNhbGdhaW4gPSAweDIwMDA7Ci0JYXVkaW8tPmZtX2NhbGlicmF0aW9uX3J4WzFdLmNhbGliX3J4LmF1ZHBwY2FsZ2FpbiA9IDB4MjAwMDsKLQlhdWRpby0+Zm1fY2FsaWJyYXRpb25fcnhbMF0uZGV2X2RldGFpbHMuYWNkYl9pZCA9IFBTRVVET19BQ0RCX0lEOwotCWF1ZGlvLT5mbV9jYWxpYnJhdGlvbl9yeFsxXS5kZXZfZGV0YWlscy5hY2RiX2lkID0gUFNFVURPX0FDREJfSUQ7Ci0KLQlhdWRpby0+ZGV2aWNlX2V2ZW50cyA9IEFVRERFVl9FVlRfREVWX1JEWQotCQkJCXxBVURERVZfRVZUX0RFVl9STFN8Ci0JCQkJQVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIR3wKLQkJCQlBVURERVZfRVZUX0RFVklDRV9JTkZPOwotCi0JcmMgPSBhdWRkZXZfcmVnaXN0ZXJfZXZ0X2xpc3RuZXIoYXVkaW8tPmRldmljZV9ldmVudHMsCi0JCQkJCUFVRERFVl9DTE5UX0RFQywKLQkJCQkJYXVkaW8tPmRlY19pZCwKLQkJCQkJZm1fbGlzdG5lciwKLQkJCQkJKHZvaWQgKilhdWRpbyk7Ci0KLQlpZiAocmMpIHsKLQkJTU1fRVJSKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGxpc3RuZXRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBldmVudF9lcnI7Ci0JfQotCi0JYXVkaW8tPm9wZW5lZCA9IDE7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0KLWV2ZW50X2VycjoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2ZtX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGF1ZGlvX29wZW4sCi0JLnJlbGVhc2UJPSBhdWRpb19yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bAk9IGF1ZGlvX2lvY3RsLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fZm1fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX2ZtIiwKLQkuZm9wcwk9ICZhdWRpb19mbV9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9faW5pdCh2b2lkKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSAmZm1fYXVkaW87Ci0KLQltdXRleF9pbml0KCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2ZtX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoYXVkaW9faW5pdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIEZNIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19pbnRlcmN0LmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2ludGVyY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0YzVkNi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2ludGVyY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9faW50ZXJjdC5oPgotCi0jZGVmaW5lIEFVRElPX0lOVEVSQ1RfQURTUExQQV9XQlJYX1NFTF9CTVNLIDB4NAotI2RlZmluZSBBVURJT19JTlRFUkNUX0FEU1BMUEFfV0JSWF9TRUxfU0hGVCAweDIKLSNkZWZpbmUgQVVESU9fSU5URVJDVF9BRFNQQVZfUlBDTUkyU1JYX1NFTF9CTVNLIDB4MTAKLSNkZWZpbmUgQVVESU9fSU5URVJDVF9BRFNQQVZfUlBDTUkyU1JYX1NFTF9TSEZUIDB4NAotI2RlZmluZSBBVURJT19JTlRFUkNUX0FEU1BBVl9UUENNSTJTVFhfU0VMX0JNU0sgMHg0MAotI2RlZmluZSBBVURJT19JTlRFUkNUX0FEU1BBVl9UUENNSTJTVFhfU0VMX1NIRlQgMHg2Ci0jZGVmaW5lIEFVRElPX0lOVEVSQ1RfQURTUEFWX0FVWF9SRUdTRUxfQk1TSyAweDEwMAotI2RlZmluZSBBVURJT19JTlRFUkNUX0FEU1BBVl9BVVhfUkVHU0VMX1NIRlQgMHg4Ci0KLS8qIFNob3VsZCBsb29rIHRvIHByb3RlY3QgdGhpcyByZWdpc3RlciAqLwotdm9pZCBfX2lvbWVtICphaWN0bF9yZWc7Ci0KLXZvaWQgYXVkaW9faW50ZXJjdF9jb2RlYyh1MzIgc291cmNlKQotewotCXUzMiByZWdfdmFsOwotCi0JcmVnX3ZhbCA9IHJlYWRsKGFpY3RsX3JlZyk7Ci0JcmVnX3ZhbCA9IChyZWdfdmFsICYgfkFVRElPX0lOVEVSQ1RfQURTUExQQV9XQlJYX1NFTF9CTVNLKSB8Ci0JCShzb3VyY2UgPDwgQVVESU9fSU5URVJDVF9BRFNQTFBBX1dCUlhfU0VMX1NIRlQpOwotCXdyaXRlbChyZWdfdmFsLCBhaWN0bF9yZWcpOwotCW1iKCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZGlvX2ludGVyY3RfY29kZWMpOwotCi12b2lkIGF1ZGlvX2ludGVyY3RfYXV4X3JlZ3NlbCh1MzIgc291cmNlKQotewotCXUzMiByZWdfdmFsOwotCi0JcmVnX3ZhbCA9IHJlYWRsKGFpY3RsX3JlZyk7Ci0JcmVnX3ZhbCA9IChyZWdfdmFsICYgfkFVRElPX0lOVEVSQ1RfQURTUEFWX0FVWF9SRUdTRUxfQk1TSykgfAotCQkoc291cmNlIDw8IEFVRElPX0lOVEVSQ1RfQURTUEFWX0FVWF9SRUdTRUxfU0hGVCk7Ci0Jd3JpdGVsKHJlZ192YWwsIGFpY3RsX3JlZyk7Ci0JbWIoKTsKLX0KLUVYUE9SVF9TWU1CT0woYXVkaW9faW50ZXJjdF9hdXhfcmVnc2VsKTsKLQotdm9pZCBhdWRpb19pbnRlcmN0X3RwY21fc291cmNlKHUzMiBzb3VyY2UpCi17Ci0JdTMyIHJlZ192YWw7Ci0KLQlyZWdfdmFsID0gcmVhZGwoYWljdGxfcmVnKTsKLQlyZWdfdmFsID0gKHJlZ192YWwgJiB+QVVESU9fSU5URVJDVF9BRFNQQVZfVFBDTUkyU1RYX1NFTF9CTVNLKSB8Ci0JCShzb3VyY2UgPDwgQVVESU9fSU5URVJDVF9BRFNQQVZfVFBDTUkyU1RYX1NFTF9TSEZUKTsKLQl3cml0ZWwocmVnX3ZhbCwgYWljdGxfcmVnKTsKLQltYigpOwotfQotRVhQT1JUX1NZTUJPTChhdWRpb19pbnRlcmN0X3RwY21fc291cmNlKTsKLQotdm9pZCBhdWRpb19pbnRlcmN0X3JwY21fc291cmNlKHUzMiBzb3VyY2UpCi17Ci0JdTMyIHJlZ192YWw7Ci0KLQlyZWdfdmFsID0gcmVhZGwoYWljdGxfcmVnKTsKLQlyZWdfdmFsID0gKHJlZ192YWwgJiB+QVVESU9fSU5URVJDVF9BRFNQQVZfUlBDTUkyU1JYX1NFTF9CTVNLKSB8Ci0JCShzb3VyY2UgPDwgQVVESU9fSU5URVJDVF9BRFNQQVZfUlBDTUkyU1JYX1NFTF9TSEZUKTsKLQl3cml0ZWwocmVnX3ZhbCwgYWljdGxfcmVnKTsKLQltYigpOwotfQotRVhQT1JUX1NZTUJPTChhdWRpb19pbnRlcmN0X3JwY21fc291cmNlKTsKLQotc3RhdGljIGludCBhdWRpb19pbnRlcmN0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmFpY3RsX21lbTsKLQotCWFpY3RsX21lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFhaWN0bF9tZW0pIHsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGVycm9yOwotCX0KLQlhaWN0bF9yZWcgPSBpb3JlbWFwKGFpY3RsX21lbS0+c3RhcnQsCi0JCQkoYWljdGxfbWVtLT5lbmQgLSBhaWN0bF9tZW0tPnN0YXJ0KSArIDEpOwotZXJyb3I6Ci0JcmV0dXJuIHJjOwotfQotCi0KLXN0YXRpYyBpbnQgYXVkaW9faW50ZXJjdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpb3VubWFwKGFpY3RsX3JlZyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF1ZGlvX2ludGVyY3RfZHJpdmVyID0gewotCS5wcm9iZSA9IGF1ZGlvX2ludGVyY3RfcHJvYmUsCi0JLnJlbW92ZSA9IGF1ZGlvX2ludGVyY3RfcmVtb3ZlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImF1ZGlvX2ludGVyY3QiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9faW50ZXJjdF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXVkaW9faW50ZXJjdF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXVkaW9faW50ZXJjdF9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF1ZGlvX2ludGVyY3RfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoYXVkaW9faW50ZXJjdF9pbml0KTsKLW1vZHVsZV9leGl0KGF1ZGlvX2ludGVyY3RfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIEF1ZGlvIEludGVyY29ubmVjdCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fbHBhLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX2xwYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWMwNjE3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fbHBhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzgwICswLDAgQEAKLS8qIGxvdyBwb3dlciBhdWRpbyBvdXRwdXQgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9lYXJseXN1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9hbGxvYy5oPgotCi0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHBtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRwbGF5Y21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBsYXltc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkcHAuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvY29kZWNfdXRpbHMuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvbXAzX2Z1bmNzLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3BjbV9mdW5jcy5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLQotI2RlZmluZSBBRFJWX1NUQVRVU19BSU9fSU5URiAweDAwMDAwMDAxCi0jZGVmaW5lIEFEUlZfU1RBVFVTX09CVUZfR0lWRU4gMHgwMDAwMDAwMgotI2RlZmluZSBBRFJWX1NUQVRVU19JQlVGX0dJVkVOIDB4MDAwMDAwMDQKLSNkZWZpbmUgQURSVl9TVEFUVVNfRlNZTkMgMHgwMDAwMDAwOAotI2RlZmluZSBBRFJWX1NUQVRVU19QQVVTRSAweDAwMDAwMDEwCi0KLSNkZWZpbmUgREVWSUNFX1NXSVRDSF9TVEFURV9OT05FICAgICAwCi0jZGVmaW5lIERFVklDRV9TV0lUQ0hfU1RBVEVfUEVORElORyAgMQotI2RlZmluZSBERVZJQ0VfU1dJVENIX1NUQVRFX1JFQURZICAgIDIKLSNkZWZpbmUgREVWSUNFX1NXSVRDSF9TVEFURV9DT01QTEVURSAzCi0KLSNkZWZpbmUgQVVEREVDX0RFQ19QQ00gMAotI2RlZmluZSBBVURERUNfREVDX01QMyAyCi0KLSNkZWZpbmUgUENNX0JVRlNaX01JTiA0ODAwCS8qIEhvbGQgb25lIHN0ZXJlbyBNUDMgZnJhbWUgKi8KLQotLyogRGVjb2RlciBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBBVURQUFRBU0sgKi8KLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfU0xFRVAJMAotI2RlZmluZQkgQVVEUFBfREVDX1NUQVRVU19JTklUICAxCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX0NGRyAgIDIKLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfUExBWSAgMwotCi0jZGVmaW5lIEFVRE1QM19NRVRBRklFTERfTUFTSyAweEZGRkYwMDAwCi0jZGVmaW5lIEFVRE1QM19FT1NfRkxHX09GRlNFVCAweDBBIC8qIE9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBidWZmZXIgKi8KLSNkZWZpbmUgQVVETVAzX0VPU19GTEdfTUFTSyAweDAxCi0jZGVmaW5lIEFVRE1QM19FT1NfTk9ORSAweDAgLyogTm8gRU9TIGRldGVjdGVkICovCi0jZGVmaW5lIEFVRE1QM19FT1NfU0VUIDB4MSAvKiBFT1Mgc2V0IGluIG1ldGEgZmllbGQgKi8KLQotI2RlZmluZSBBVURMUEFfRVZFTlRfTlVNIDEwIC8qIERlZmF1bHQgbnVtYmVyIG9mIHByZS1hbGxvY2F0ZWQgZXZlbnQgcGFja2V0cyAqLwotCi0jZGVmaW5lIE1BU0tfMzJCSVRTICAgICAweEZGRkZGRkZGCi0KLSNkZWZpbmUgTUFYX0JVRiA0Ci0jZGVmaW5lIEJVRlNaICg1MjQyODgpCi0KLSNkZWZpbmUgX19DT05UQUlOUyhyLCB2LCBsKSAoewkJCQkJXAotCXR5cGVvZihyKSBfX3IgPSByOwkJCQkJXAotCXR5cGVvZih2KSBfX3YgPSB2OwkJCQkJXAotCXR5cGVvZih2KSBfX2UgPSBfX3YgKyBsOwkJCQlcCi0JaW50IHJlcyA9ICgoX192ID49IF9fci0+dmFkZHIpICYmIAkJCVwKLQkJKF9fZSA8PSBfX3ItPnZhZGRyICsgX19yLT5sZW4pKTsJCVwKLQlyZXM7CQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgQ09OVEFJTlMocjEsIHIyKSAoewkJCQkJXAotCXR5cGVvZihyMikgX19yMiA9IHIyOwkJCQkJXAotCV9fQ09OVEFJTlMocjEsIF9fcjItPnZhZGRyLCBfX3IyLT5sZW4pOwkJCVwKLX0pCi0KLSNkZWZpbmUgSU5fUkFOR0UociwgdikgKHsJCQkJCVwKLQl0eXBlb2YocikgX19yID0gcjsJCQkJCVwKLQl0eXBlb2YodikgX192diA9IHY7CQkJCQlcCi0JaW50IHJlcyA9ICgoX192diA+PSBfX3ItPnZhZGRyKSAmJgkJCVwKLQkJKF9fdnYgPCAoX19yLT52YWRkciArIF9fci0+bGVuKSkpOwkJXAotCXJlczsJCQkJCQkJXAotfSkKLQotI2RlZmluZSBPVkVSTEFQUyhyMSwgcjIpICh7CQkJCQlcCi0JdHlwZW9mKHIxKSBfX3IxID0gcjE7CQkJCQlcCi0JdHlwZW9mKHIyKSBfX3IyID0gcjI7CQkJCQlcCi0JdHlwZW9mKF9fcjItPnZhZGRyKSBfX3YgPSBfX3IyLT52YWRkcjsJCQlcCi0JdHlwZW9mKF9fdikgX19lID0gX192ICsgX19yMi0+bGVuIC0gMTsJCQlcCi0JaW50IHJlcyA9IChJTl9SQU5HRShfX3IxLCBfX3YpIHx8IElOX1JBTkdFKF9fcjEsIF9fZSkpOwlcCi0JcmVzOwkJCQkJCQlcCi19KQotCi0vKiBwYXlsb2FkWzddOyAtMSBpbmRpY2F0ZXMgZXJyb3IsIDAgaW5kaWNhdGVzIG5vIGVycm9yICovCi0jZGVmaW5lIENIRUNLX0VSUk9SKHYpICghdls3XSkKLQotLyogY2FsY3VsYXRlcyBhdnN5bmNfaW5mbyBmcm9tIHBheWxvYWQgKi8KLSNkZWZpbmUgQ0FMQ1VMQVRFX0FWU1lOQ19GUk9NX1BBWUxPQUQodikgKCh1aW50NjRfdCkoKCgodWludDY0X3QpdlsxMF0pIFwKLQkJCQkJPDwgMzIpIHwgKHZbMTFdICYgTUFTS18zMkJJVFMpKSkKLQotLyogY2FsY3VsYXRlcyBhdnN5bmNfaW5mbyBmcm9tIGF2c3luY19pbmZvIHN0b3JlZCBpbiBhdWRpbyAqLwotI2RlZmluZSBDQUxDVUxBVEVfQVZTWU5DKHYpCQkJCQkgICBcCi0JCQkoKHVpbnQ2NF90KSgoKCh1aW50NjRfdCl2WzRdKSA8PCAzMikgfCAJICAgXAotCQkJICh2WzVdIDw8IDE2KSB8ICh2WzZdKSkpCi0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RydWN0IGF1ZGxwYV9zdXNwZW5kX2N0bCB7Ci0Jc3RydWN0IGVhcmx5X3N1c3BlbmQgbm9kZTsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvOwotfTsKLSNlbmRpZgotCi1zdHJ1Y3QgYXVkbHBhX2V2ZW50IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JaW50IGV2ZW50X3R5cGU7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLX07Ci0KLXN0cnVjdCBhdWRscGFfaW9uX3JlZ2lvbiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGU7Ci0JaW50IGZkOwotCXZvaWQgKnZhZGRyOwotCXVuc2lnbmVkIGxvbmcgcGFkZHI7Ci0JdW5zaWduZWQgbG9uZyBrdmFkZHI7Ci0JdW5zaWduZWQgbG9uZyBsZW47Ci0JdW5zaWduZWQgcmVmX2NudDsKLX07Ci0KLXN0cnVjdCBhdWRscGFfYnVmZmVyX25vZGUgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2Fpb19idWYgYnVmOwotCXVuc2lnbmVkIGxvbmcgcGFkZHI7Ci19OwotCi1zdHJ1Y3QgYXVkbHBhX2RlYyB7Ci0JY2hhciAqbmFtZTsKLQlpbnQgZGVjX2F0dHJiOwotCWxvbmcgKCppb2N0bCkoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKLQl2b2lkICgqYWRlY19wYXJhbXMpKHN0cnVjdCBhdWRpbyAqKTsKLX07Ci0KLXN0cnVjdCBhdWRscGFfZGVjIGF1ZGxwYV9kZWNzW10gPSB7Ci0JeyJtc21fbXAzX2xwIiwgQVVEREVDX0RFQ19NUDMsICZtcDNfaW9jdGwsICZhdWRwcF9jbWRfY2ZnX21wM19wYXJhbXN9LAotCXsibXNtX3BjbV9scF9kZWMiLCBBVURERUNfREVDX1BDTSwgJnBjbV9pb2N0bCwKLQkJJmF1ZHBwX2NtZF9jZmdfcGNtX3BhcmFtc30sCi19OwotCi1zdGF0aWMgaW50IGF1ZGRlY19kc3BfY29uZmlnKHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCBlbmFibGUpOwotc3RhdGljIHZvaWQgYXVkaW9fZHNwX2V2ZW50KHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGlkLCB1aW50MTZfdCAqbXNnKTsKLXN0YXRpYyB2b2lkIGF1ZGxwYV9wb3N0X2V2ZW50KHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCB0eXBlLAotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgYXVkbHBhX2lvbl9maXh1cChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB2b2lkICphZGRyLAotCQkJCXVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgcmVmX3VwKTsKLXN0YXRpYyB2b2lkIGF1ZGxwYV9hc3luY19zZW5kX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgbmVlZGVkLAotCQkJCXVpbnQzMl90ICpwYXlsb2FkKTsKLQotc3RhdGljIHZvaWQgbHBhX2xpc3RuZXIodTMyIGV2dF9pZCwgdW5pb24gYXVkZGV2X2V2dF9kYXRhICpldnRfcGF5bG9hZCwKLQkJCXZvaWQgKnByaXZhdGVfZGF0YSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gKHN0cnVjdCBhdWRpbyAqKSBwcml2YXRlX2RhdGE7Ci0Jc3dpdGNoIChldnRfaWQpIHsKLQljYXNlIEFVRERFVl9FVlRfREVWX1JEWToKLQkJTU1fREJHKCI6QVVEREVWX0VWVF9ERVZfUkRZIHJvdXRpbmcgaWQgPSAlZFxuIiwKLQkJZXZ0X3BheWxvYWQtPnJvdXRpbmdfaWQpOwotCQkvKiBEbyBub3Qgc2VsZWN0IEhMQiBwYXRoIGZvciBpY29kZWMsIGlmIHRoZXJlIGlzIGFscmVhZHkgQ09QUDMKLQkJICogcm91dGluZyBleGlzdHMuIERTUCBjYW4gbm90IHN1cHBvcnQgY29uY3VycmVuY3kgb2YgSExCIHBhdGgKLQkJICogYW5kIENPUFAzIHJvdXRpbmcgYXMgaXQgaW52b2x2ZXMgZGlmZmVyZW50IGJ1ZmZlciBQYXRoICovCi0JCWlmICgoKDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCkgPT0gQVVEUFBfTUlYRVJfSUNPREVDKSAmJgotCQkJIShhdWRpby0+c291cmNlICYgQVVEUFBfTUlYRVJfMykpIHsKLQkJCWF1ZGlvLT5zb3VyY2UgfD0gQVVEUFBfTUlYRVJfSExCOwotCQkJTU1fREJHKCJtaXhlcl9tYXNrIG1vZGlmaWVkIGZvciBsb3ctcG93ZXIgYXVkaW9cbiIpOwotCQl9IGVsc2UKLQkJCWF1ZGlvLT5zb3VyY2UgfD0gKDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0KLQkJTU1fREJHKCJydW5uaW5nID0gJWQsIGVuYWJsZWQgPSAlZCwgc291cmNlID0gMHgleFxuIiwKLQkJCWF1ZGlvLT5ydW5uaW5nLCBhdWRpby0+ZW5hYmxlZCwgYXVkaW8tPnNvdXJjZSk7Ci0JCWlmIChhdWRpby0+cnVubmluZyA9PSAxICYmIGF1ZGlvLT5lbmFibGVkID09IDEpIHsKLQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLCBhdWRpby0+c291cmNlKTsKLQkJCWlmIChhdWRpby0+c291cmNlICYgQVVEUFBfTUlYRVJfSExCKSB7Ci0JCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKAotCQkJCQlBVURQUF9DTURfQ0ZHX0RFVl9NSVhFUl9JRF80LAotCQkJCQkmYXVkaW8tPnZvbF9wYW4sCi0JCQkJCUNPUFApOwotCQkJCQkvKnJlc3RvcmUgdGhlIFBPUFAgZ2FpbiB0byAweDIwMDAKLQkJCQkJdGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdXNlIGNhc2VzCi0JCQkJCXdoZXJlIFBPUFAgdm9sdW1lIGlzIGxvd2VyZWQgZHVyaW5nCi0JCQkJCU5PTiBITEIgcGxheWJhY2ssIHdoZW4gZGV2aWNlIG1vdmVkCi0JCQkJCWZyb20gTk9OIEhMQiB0byBITEIgUE9QUCBpcyBub3QKLQkJCQkJZGlzYWJsZWQgYnV0IFBPUFAgZ2FpbiB3aWxsIGJlIHJldGFpbmVkCi0JCQkJCWFzIHRoZSBvbGQgb25lIHdoaWNoIHJlc3VsdAotCQkJCQlpbiBsb3dlciB2b2x1bWUqLwotCQkJCQlhdWRpby0+dm9sX3Bhbi52b2x1bWUgPSAweDIwMDA7Ci0JCQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbigKLQkJCQkJCWF1ZGlvLT5kZWNfaWQsCi0JCQkJCQkmYXVkaW8tPnZvbF9wYW4sIFBPUFApOwotCQkJfSBlbHNlIGlmIChhdWRpby0+c291cmNlICYgQVVEUFBfTUlYRVJfTk9OSExCKQotCQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbigKLQkJCQkJYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuLCBQT1BQKTsKLQkJCWlmIChhdWRpby0+ZGV2aWNlX3N3aXRjaCA9PSBERVZJQ0VfU1dJVENIX1NUQVRFX1JFQURZKSB7Ci0JCQkJYXVkaW8tPndmbHVzaCA9IDE7Ci0JCQkJYXVkaW8tPmRldmljZV9zd2l0Y2ggPQotCQkJCQlERVZJQ0VfU1dJVENIX1NUQVRFX0NPTVBMRVRFOwotCQkJCWF1ZHBwX2ZsdXNoKGF1ZGlvLT5kZWNfaWQpOwotCQkJCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJCQkJICFhdWRpby0+d2ZsdXNoKSA8IDApCi0JCQkJCU1NX0RCRygiQVVESU9fRkxVU0ggaW50ZXJydXB0ZWRcbiIpOwotCi0JCQkJaWYgKGF1ZGlvLT53Zmx1c2ggPT0gMCkgewotCQkJCQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJgotCQkJCQkJQURSVl9TVEFUVVNfUEFVU0UpIHsKLQkJCQkJCWlmIChhdWRwcF9wYXVzZShhdWRpby0+ZGVjX2lkLAotCQkJCQkJCTEpKQotCQkJCQkJCU1NX0RCRygiYXVkcHBfcGF1c2UiCi0JCQkJCQkJCSJmYWlsZWRcbiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVEREVWX0VWVF9SRUxfUEVORElORzoKLQkJTU1fREJHKCI6QVVEREVWX0VWVF9SRUxfUEVORElOR1xuIik7Ci0JCS8qIElmIHJvdXRlIHRvIG11bHRpcGxlIGRldmljZXMgbGlrZSBDT1BQMywgbm90IG5lZWQgdG8KLQkJICogaGFuZGxlIGRldmljZSBzd2l0Y2ggKi8KLQkJaWYgKChhdWRpby0+cnVubmluZyA9PSAxKSAmJiAoYXVkaW8tPmVuYWJsZWQgPT0gMSkgJiYKLQkJCSEoYXVkaW8tPnNvdXJjZSAmIEFVRFBQX01JWEVSXzMpKSB7Ci0JCQlpZiAoYXVkaW8tPmRldmljZV9zd2l0Y2ggPT0gREVWSUNFX1NXSVRDSF9TVEFURV9OT05FKSB7Ci0JCQkJaWYgKCEoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19QQVVTRSkpIHsKLQkJCQkJaWYgKGF1ZHBwX3BhdXNlKGF1ZGlvLT5kZWNfaWQsIDEpKQotCQkJCQkJTU1fREJHKCJhdWRwcCBwYXVzZSBmYWlsZWRcbiIpOwotCQkJCX0KLQkJCQlhdWRpby0+ZGV2aWNlX3N3aXRjaCA9Ci0JCQkJCURFVklDRV9TV0lUQ0hfU1RBVEVfUEVORElORzsKLQkJCQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAwOwotCQkJCWlmIChhdWRwcF9xdWVyeV9hdnN5bmMoYXVkaW8tPmRlY19pZCkgPCAwKQotCQkJCQlNTV9EQkcoInF1ZXJ5IGF2c3luYyBmYWlsZWRcbiIpOwotCi0JCQkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0Ci0JCQkJCShhdWRpby0+YXZzeW5jX3dhaXQsIGF1ZGlvLT5hdnN5bmNfZmxhZywKLQkJCQkgbXNlY3NfdG9famlmZmllcyhBVlNZTkNfRVZFTlRfVElNRU9VVCkpIDwgMCkKLQkJCQkJTU1fREJHKCJBViBzeW5jIHRpbWVvdXQgZmFpbGVkXG4iKTsKLQkJCQlpZiAoYXVkaW8tPmF2c3luY19mbGFnID09IDEpIHsKLQkJCQkJaWYgKGF1ZGlvLT5kZXZpY2Vfc3dpdGNoID09Ci0JCQkJCQlERVZJQ0VfU1dJVENIX1NUQVRFX1BFTkRJTkcpCi0JCQkJCQlhdWRpby0+ZGV2aWNlX3N3aXRjaCA9Ci0JCQkJCQlERVZJQ0VfU1dJVENIX1NUQVRFX1JFQURZOwotCQkJCX0KLQkJCX0KLQkJfQotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfREVWX1JMUzoKLQkJLyogSWYgdGhlcmUgaXMgYWxyZWFkeSBDT1BQMyByb3V0aW5nIGV4aXN0cy4gaWNvZGVjIHJvdXRlCi0JCSAqIHdhcyBub3QgaGF2aW5nIEhMQiBwYXRoLiAqLwotCQlNTV9EQkcoIjpBVURERVZfRVZUX0RFVl9STFMgcm91dGluZyBpZCA9ICVkXG4iLAotCQkJZXZ0X3BheWxvYWQtPnJvdXRpbmdfaWQpOwotCQlpZiAoKCgweDEgPDwgZXZ0X3BheWxvYWQtPnJvdXRpbmdfaWQpID09IEFVRFBQX01JWEVSX0lDT0RFQykgJiYKLQkJCSEoYXVkaW8tPnNvdXJjZSAmIEFVRFBQX01JWEVSXzMpKQotCQkJYXVkaW8tPnNvdXJjZSAmPSB+QVVEUFBfTUlYRVJfSExCOwotCQllbHNlCi0JCQlhdWRpby0+c291cmNlICY9IH4oMHgxIDw8IGV2dF9wYXlsb2FkLT5yb3V0aW5nX2lkKTsKLQkJTU1fREJHKCJydW5uaW5nID0gJWQsIGVuYWJsZWQgPSAlZCwgc291cmNlID0gMHgleFxuIiwKLQkJCWF1ZGlvLT5ydW5uaW5nLCBhdWRpby0+ZW5hYmxlZCwgYXVkaW8tPnNvdXJjZSk7Ci0KLQkJaWYgKGF1ZGlvLT5ydW5uaW5nID09IDEgJiYgYXVkaW8tPmVuYWJsZWQgPT0gMSkKLQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLCBhdWRpby0+c291cmNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURERVZfRVZUX1NUUkVBTV9WT0xfQ0hHOgotCQlhdWRpby0+dm9sX3Bhbi52b2x1bWUgPSBldnRfcGF5bG9hZC0+c2Vzc2lvbl92b2w7Ci0JCU1NX0RCRygiXG46QVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRywgc3RyZWFtIHZvbCAlZFxuIgotCQkJInJ1bm5pbmcgPSAlZCwgZW5hYmxlZCA9ICVkLCBzb3VyY2UgPSAweCV4IiwKLQkJCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSwgYXVkaW8tPnJ1bm5pbmcsCi0JCQlhdWRpby0+ZW5hYmxlZCwgYXVkaW8tPnNvdXJjZSk7Ci0JCWlmIChhdWRpby0+cnVubmluZyA9PSAxICYmIGF1ZGlvLT5lbmFibGVkID09IDEpIHsKLQkJCWlmIChhdWRpby0+c291cmNlICYgQVVEUFBfTUlYRVJfSExCKQotCQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbigKLQkJCQkJQVVEUFBfQ01EX0NGR19ERVZfTUlYRVJfSURfNCwKLQkJCQkJJmF1ZGlvLT52b2xfcGFuLCBDT1BQKTsKLQkJCWVsc2UgaWYgKGF1ZGlvLT5zb3VyY2UgJiBBVURQUF9NSVhFUl9OT05ITEIpCi0JCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKAotCQkJCQlhdWRpby0+ZGVjX2lkLCAmYXVkaW8tPnZvbF9wYW4sIFBPUFApOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiOkVSUk9SOndyb25nIGV2ZW50XG4iKTsKLQkJYnJlYWs7Ci0JfQotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkaW9fZW5hYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQotCWlmIChhdWRpby0+ZW5hYmxlZCkKLQkJcmV0dXJuIDA7Ci0KLQlhdWRpby0+ZGVjX3N0YXRlID0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkU7Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCi0JaWYgKG1zbV9hZHNwX2VuYWJsZShhdWRpby0+YXVkcGxheSkpIHsKLQkJTU1fRVJSKCJtc21fYWRzcF9lbmFibGUoYXVkcGxheSkgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKGF1ZHBwX2VuYWJsZShhdWRpby0+ZGVjX2lkLCBhdWRpb19kc3BfZXZlbnQsIGF1ZGlvKSkgewotCQlNTV9FUlIoImF1ZHBwX2VuYWJsZSgpIGZhaWxlZFxuIik7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRpb19kaXNhYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JaW50IHJjID0gMDsKLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWlmIChhdWRpby0+ZW5hYmxlZCkgewotCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCWF1ZGlvLT5kZWNfc3RhdGUgPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORTsKLQkJYXVkZGVjX2RzcF9jb25maWcoYXVkaW8sIDApOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUsCi0JCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0RFQ09ERVJfV0FJVF9NUykpOwotCQlpZiAocmMgPT0gMCkKLQkJCXJjID0gLUVUSU1FRE9VVDsKLQkJZWxzZSBpZiAoYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfQ0xPU0UpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQltc21fYWRzcF9kaXNhYmxlKGF1ZGlvLT5hdWRwbGF5KTsKLQkJYXVkcHBfZGlzYWJsZShhdWRpby0+ZGVjX2lkLCBhdWRpbyk7Ci0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfZHNwX2V2ZW50KHZvaWQgKmRhdGEsIHVuc2lnbmVkIGlkLCBzaXplX3QgbGVuLAotCQkJICAgICAgdm9pZCAoKmdldGV2ZW50KSAodm9pZCAqcHRyLCBzaXplX3QgbGVuKSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZGF0YTsKLQl1aW50MzJfdCBtc2dbMjhdOwotCWdldGV2ZW50KG1zZywgc2l6ZW9mKG1zZykpOwotCi0JTU1fREJHKCJtc2dfaWQ9JXhcbiIsIGlkKTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBMQVlfTVNHX0RFQ19ORUVEU19EQVRBOgotCQlhdWRscGFfYXN5bmNfc2VuZF9kYXRhKGF1ZGlvLCAxLCBtc2cpOwotCQlicmVhazsKLQljYXNlIEFEU1BfTUVTU0FHRV9JRDoKLQkJTU1fREJHKCJSZWNlaXZlZCBBRFNQIGV2ZW50OiBtb2R1bGUgZW5hYmxlKGF1ZHBsYXl0YXNrKVxuIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1NX0VSUigidW5leHBlY3RlZCBtZXNzYWdlIGZyb20gZGVjb2RlclxuIik7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fZHNwX2V2ZW50KHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGlkLCB1aW50MTZfdCAqbXNnKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBwcml2YXRlOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUFBfTVNHX1NUQVRVU19NU0c6ewotCQkJdW5zaWduZWQgc3RhdHVzID0gbXNnWzFdOwotCi0JCQlzd2l0Y2ggKHN0YXR1cykgewotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX1NMRUVQOiB7Ci0JCQkJdWludDE2X3QgcmVhc29uID0gbXNnWzJdOwotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IHNsZWVwIHJlYXNvbj0weCUwNHhcbiIsCi0JCQkJCQlyZWFzb24pOwotCQkJCWlmICgocmVhc29uID09IEFVRFBQX01TR19SRUFTT05fTUVNKQotCQkJCQl8fCAocmVhc29uID09Ci0JCQkJCUFVRFBQX01TR19SRUFTT05fTk9ERUNPREVSKSkgewotCQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9GQUlMVVJFOwotCQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJfSBlbHNlIGlmIChyZWFzb24gPT0gQVVEUFBfTVNHX1JFQVNPTl9OT05FKSB7Ci0JCQkJCS8qIGRlY29kZXIgaXMgaW4gZGlzYWJsZSBzdGF0ZSAqLwotCQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19JTklUOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IGluaXRcbiIpOwotCQkJCWF1ZGlvLT5jb2RlY19vcHMuYWRlY19wYXJhbXMoYXVkaW8pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX0NGRzoKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBjZmdcbiIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX1BMQVk6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogcGxheVxuIik7Ci0JCQkJLyogc2VuZCAgbWl4ZXIgY29tbWFuZCAqLwotCQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLAotCQkJCQkJYXVkaW8tPnNvdXJjZSk7Ci0JCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9TVUNDRVNTOwotCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19FT1M6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogRU9TXG4iKTsKLQkJCQlhdWRpby0+dGVvcyA9IDE7Ci0JCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlNTV9FUlIoInVua25vd24gZGVjb2RlciBzdGF0dXNcbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRFBQX01TR19DRkdfTVNHOgotCQlpZiAobXNnWzBdID09IEFVRFBQX01TR19FTkFfRU5BKSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgRU5BQkxFXG4iKTsKLQkJCWF1ZGRlY19kc3BfY29uZmlnKGF1ZGlvLCAxKTsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMTsKLQkJCU1NX0RCRygic291cmNlID0gMHgleFxuIiwgYXVkaW8tPnNvdXJjZSk7Ci0JCQlpZiAoYXVkaW8tPnNvdXJjZSAmIEFVRFBQX01JWEVSX0hMQikKLQkJCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oCi0JCQkJCUFVRFBQX0NNRF9DRkdfREVWX01JWEVSX0lEXzQsCi0JCQkJCSZhdWRpby0+dm9sX3BhbiwKLQkJCQkJQ09QUCk7Ci0JCQllbHNlIGlmIChhdWRpby0+c291cmNlICYgQVVEUFBfTUlYRVJfTk9OSExCKQotCQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbigKLQkJCQkJYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuLAotCQkJCQlQT1BQKTsKLQkJCWF1ZHBwX2RzcF9zZXRfZXEoYXVkaW8tPmRlY19pZCwgYXVkaW8tPmVxX2VuYWJsZSwKLQkJCQkJJmF1ZGlvLT5lcSwgUE9QUCk7Ci0JCX0gZWxzZSBpZiAobXNnWzBdID09IEFVRFBQX01TR19FTkFfRElTKSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgRElTQUJMRVxuIik7Ci0JCQlhdWRpby0+cnVubmluZyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgJWQ/XG4iLCBtc2dbMF0pOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX1JPVVRJTkdfQUNLOgotCQlNTV9EQkcoIlJPVVRJTkdfQUNLIG1vZGU9JWRcbiIsCW1zZ1sxXSk7Ci0JCWF1ZGlvLT5jb2RlY19vcHMuYWRlY19wYXJhbXMoYXVkaW8pOwotCQlicmVhazsKLQotCWNhc2UgQVVEUFBfTVNHX0ZMVVNIX0FDSzoKLQkJTU1fREJHKCJGTFVTSF9BQ0tcbiIpOwotCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlicmVhazsKLQotCWNhc2UgQVVEUFBfTVNHX1BDTURNQU1JU1NFRDoKLQkJTU1fREJHKCJQQ01ETUFNSVNTRURcbiIpOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURQUF9NU0dfQVZTWU5DX01TRzoKLQkJTU1fREJHKCJBVlNZTkNfTVNHXG4iKTsKLQkJbWVtY3B5KCZhdWRpby0+YXZzeW5jWzBdLCBtc2csIHNpemVvZihhdWRpby0+YXZzeW5jKSk7Ci0JCWF1ZGlvLT5hdnN5bmNfZmxhZyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT5hdnN5bmNfd2FpdCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJTU1fRVJSKCJVTktOT1dOICglZClcbiIsIGlkKTsKLQl9Ci0KLX0KLQotc3RydWN0IG1zbV9hZHNwX29wcyBhdWRwbGF5X2Fkc3Bfb3BzX2xwYSA9IHsKLQkuZXZlbnQgPSBhdWRwbGF5X2RzcF9ldmVudCwKLX07Ci0KLSNkZWZpbmUgYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcGxheSwgYXVkaW8tPnF1ZXVlX2lkLCBcCi0JCQljbWQsIGxlbikKLQotc3RhdGljIGludCBhdWRkZWNfZHNwX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2RlY190eXBlIGNmZ19kZWNfY21kOwotCi0JbWVtc2V0KCZjZmdfZGVjX2NtZCwgMCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci0KLQljZmdfZGVjX2NtZC5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX0RFQ19UWVBFOwotCWlmIChlbmFibGUpCi0JCWNmZ19kZWNfY21kLmRlY19jZmcgPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCUFVRFBQX0NNRF9FTkFfREVDX1YgfAotCQkJYXVkbHBhX2RlY3NbYXVkaW8tPm1pbm9yX25vXS5kZWNfYXR0cmI7Ci0JZWxzZQotCQljZmdfZGVjX2NtZC5kZWNfY2ZnID0gQVVEUFBfQ01EX1VQREFUREVfQ0ZHX0RFQyB8Ci0JCQkJQVVEUFBfQ01EX0RJU19ERUNfVjsKLQljZmdfZGVjX2NtZC5kbV9tb2RlID0gMHgwOwotCWNmZ19kZWNfY21kLnN0cmVhbV9pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUxKCZjZmdfZGVjX2NtZCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGxwYV9hc3luY19zZW5kX2J1ZmZlcihzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWludAlmb3VuZCA9IDA7Ci0JdWludDY0X3QgdGVtcCA9IDA7Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2JpdHN0cmVhbV9kYXRhX2F2YWlsIGNtZDsKLQlzdHJ1Y3QgYXVkbHBhX2J1ZmZlcl9ub2RlICpuZXh0X2J1ZiA9IE5VTEw7Ci0KLQl0ZW1wID0gYXVkaW8tPmJ5dGVjb3VudF9oZWFkOwotCWlmIChhdWRpby0+ZGV2aWNlX3N3aXRjaCA9PSBERVZJQ0VfU1dJVENIX1NUQVRFX05PTkUpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShuZXh0X2J1ZiwgJmF1ZGlvLT5vdXRfcXVldWUsIGxpc3QpIHsKLQkJCWlmICh0ZW1wID09IGF1ZGlvLT5ieXRlY291bnRfZ2l2ZW4pIHsKLQkJCQlmb3VuZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UKLQkJCQl0ZW1wICs9IG5leHRfYnVmLT5idWYuZGF0YV9sZW47Ci0JCX0KLQkJaWYgKG5leHRfYnVmICYmIGZvdW5kKSB7Ci0JCQljbWQuY21kX2lkID0gQVVEUExBWV9DTURfQklUU1RSRUFNX0RBVEFfQVZBSUw7Ci0JCQljbWQuZGVjb2Rlcl9pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JCQljbWQuYnVmX3B0cgk9ICh1bnNpZ25lZCkgbmV4dF9idWYtPnBhZGRyOwotCQkJY21kLmJ1Zl9zaXplID0gbmV4dF9idWYtPmJ1Zi5kYXRhX2xlbiA+PiAxOwotCQkJY21kLnBhcnRpdGlvbl9udW1iZXIJPSAwOwotCQkJYXVkaW8tPmJ5dGVjb3VudF9naXZlbiArPSBuZXh0X2J1Zi0+YnVmLmRhdGFfbGVuOwotCQkJd21iKCk7Ci0JCQlhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCQlhdWRpby0+ZHJ2X3N0YXR1cyB8PSBBRFJWX1NUQVRVU19PQlVGX0dJVkVOOwotCQl9Ci0JfSBlbHNlIGlmIChhdWRpby0+ZGV2aWNlX3N3aXRjaCA9PSBERVZJQ0VfU1dJVENIX1NUQVRFX0NPTVBMRVRFKSB7Ci0JCWF1ZGlvLT5kZXZpY2Vfc3dpdGNoID0gREVWSUNFX1NXSVRDSF9TVEFURV9OT05FOwotCQluZXh0X2J1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5vdXRfcXVldWUsCi0JCQkJCXN0cnVjdCBhdWRscGFfYnVmZmVyX25vZGUsIGxpc3QpOwotCQlpZiAobmV4dF9idWYpIHsKLQkJCWNtZC5jbWRfaWQgPSBBVURQTEFZX0NNRF9CSVRTVFJFQU1fREFUQV9BVkFJTDsKLQkJCWNtZC5kZWNvZGVyX2lkID0gYXVkaW8tPmRlY19pZDsKLQkJCXRlbXAgPSBhdWRpby0+Ynl0ZWNvdW50X2hlYWQgKwotCQkJCW5leHRfYnVmLT5idWYuZGF0YV9sZW4gLQotCQkJCWF1ZGlvLT5ieXRlY291bnRfY29uc3VtZWQ7Ci0JCQlpZiAoYXVkcHBfcmVzdG9yZV9hdnN5bmMoYXVkaW8tPmRlY19pZCwKLQkJCQkJCSZhdWRpby0+YXZzeW5jWzBdKSkKLQkJCQlNTV9EQkcoImF1ZHBwX3Jlc3RvcmVfYXZzeW5jIGZhaWxlZFxuIik7Ci0KLQkJCWlmICgoc2lnbmVkKSh0ZW1wID49IDApICYmCi0JCQkoKHNpZ25lZCkobmV4dF9idWYtPmJ1Zi5kYXRhX2xlbiAtIHRlbXApID49IDApKSB7Ci0JCQkJTU1fREJHKCJhdWRscGFfYXN5bmNfc2VuZF9idWZmZXIgLSBzZW5kaW5nIHRoZSIKLQkJCQkJInJlc3Qgb2YgdGhlIGJ1ZmZlciBiYXNzZWRvbiBBViBzeW5jIik7Ci0JCQkJY21kLmJ1Zl9wdHIJPSAodW5zaWduZWQpIChuZXh0X2J1Zi0+cGFkZHIgKwotCQkJCQkJICAobmV4dF9idWYtPmJ1Zi5kYXRhX2xlbiAtCi0JCQkJCQkgICB0ZW1wKSk7Ci0JCQkJY21kLmJ1Zl9zaXplID0gdGVtcCA+PiAxOwotCQkJCWNtZC5wYXJ0aXRpb25fbnVtYmVyCT0gMDsKLQkJCQlhdWRpby0+Ynl0ZWNvdW50X2dpdmVuID0KLQkJCQkJYXVkaW8tPmJ5dGVjb3VudF9jb25zdW1lZCArIHRlbXA7Ci0JCQkJd21iKCk7Ci0JCQkJYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotCQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJCQlhdWRpby0+ZHJ2X3N0YXR1cyB8PSBBRFJWX1NUQVRVU19PQlVGX0dJVkVOOwotCQkJfSBlbHNlIGlmICgoc2lnbmVkKSh0ZW1wID49IDApICYmCi0JCQkJKChzaWduZWQpKG5leHRfYnVmLT5idWYuZGF0YV9sZW4gLQotCQkJCQkJCXRlbXApIDwgMCkpIHsKLQkJCQlNTV9EQkcoImF1ZGxwYV9hc3luY19zZW5kX2J1ZmZlciAtIGVsc2UgY2FzZToiCi0JCQkJCSJzZW5kaW5nIHRoZSByZXN0IG9mIHRoZSBidWZmZXIgYmFzc2Vkb24iCi0JCQkJCSJBViBzeW5jIik7Ci0JCQkJY21kLmJ1Zl9wdHIJPSAodW5zaWduZWQpIG5leHRfYnVmLT5wYWRkcjsKLQkJCQljbWQuYnVmX3NpemUgPSBuZXh0X2J1Zi0+YnVmLmRhdGFfbGVuID4+IDE7Ci0JCQkJY21kLnBhcnRpdGlvbl9udW1iZXIJPSAwOwotCQkJCWF1ZGlvLT5ieXRlY291bnRfZ2l2ZW4gPSBhdWRpby0+Ynl0ZWNvdW50X2hlYWQgKwotCQkJCQluZXh0X2J1Zi0+YnVmLmRhdGFfbGVuOwotCQkJCXdtYigpOwotCQkJCWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLQkJCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCQkJYXVkaW8tPmRydl9zdGF0dXMgfD0gQURSVl9TVEFUVVNfT0JVRl9HSVZFTjsKLQkJCX0KLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYXVkbHBhX2FzeW5jX3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQsCi0JCQkJdWludDMyX3QgKnBheWxvYWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50NjRfdCB0ZW1wID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWF1ZGlvLT5ydW5uaW5nKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAobmVlZGVkICYmICFhdWRpby0+d2ZsdXNoKSB7Ci0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMTsKLQkJaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfT0JVRl9HSVZFTikgewotCQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgZXZ0X3BheWxvYWQ7Ci0JCQlzdHJ1Y3QgYXVkbHBhX2J1ZmZlcl9ub2RlICp1c2VkX2J1ZiA9IE5VTEw7Ci0KLQkJCWlmIChDSEVDS19FUlJPUihwYXlsb2FkKSkKLQkJCQlhdWRpby0+Ynl0ZWNvdW50X2NvbnN1bWVkID0KLQkJCQkJQ0FMQ1VMQVRFX0FWU1lOQ19GUk9NX1BBWUxPQUQocGF5bG9hZCk7Ci0KLQkJCWlmICgoYXVkaW8tPmRldmljZV9zd2l0Y2ggPT0KLQkJCQlERVZJQ0VfU1dJVENIX1NUQVRFX0NPTVBMRVRFKSAmJgotCQkJCShhdWRpby0+YXZzeW5jX2ZsYWcgPT0gMSkpIHsKLQkJCQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAwOwotCQkJCWF1ZGlvLT5ieXRlY291bnRfY29uc3VtZWQgPQotCQkJCQlDQUxDVUxBVEVfQVZTWU5DKGF1ZGlvLT5hdnN5bmMpOwotCQkJfQotCQkJQlVHX09OKGxpc3RfZW1wdHkoJmF1ZGlvLT5vdXRfcXVldWUpKTsKLQkJCXRlbXAgPSBhdWRpby0+Ynl0ZWNvdW50X2hlYWQ7Ci0JCQl1c2VkX2J1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5vdXRfcXVldWUsCi0JCQkJCXN0cnVjdCBhdWRscGFfYnVmZmVyX25vZGUsIGxpc3QpOwotCQkJaWYgKGF1ZGlvLT5kZXZpY2Vfc3dpdGNoICE9Ci0JCQkJREVWSUNFX1NXSVRDSF9TVEFURV9DT01QTEVURSkgewotCQkJCWF1ZGlvLT5ieXRlY291bnRfaGVhZCArPQotCQkJCQkJdXNlZF9idWYtPmJ1Zi5kYXRhX2xlbjsKLQkJCQl0ZW1wID0gYXVkaW8tPmJ5dGVjb3VudF9oZWFkOwotCQkJCWxpc3RfZGVsKCZ1c2VkX2J1Zi0+bGlzdCk7Ci0JCQkJZXZ0X3BheWxvYWQuYWlvX2J1ZiA9IHVzZWRfYnVmLT5idWY7Ci0JCQkJYXVkbHBhX3Bvc3RfZXZlbnQoYXVkaW8sCi0JCQkJCQlBVURJT19FVkVOVF9XUklURV9ET05FLAotCQkJCQkJICBldnRfcGF5bG9hZCk7Ci0JCQkJa2ZyZWUodXNlZF9idWYpOwotCQkJCWF1ZGlvLT5kcnZfc3RhdHVzICY9IH5BRFJWX1NUQVRVU19PQlVGX0dJVkVOOwotCQkJfQotCQl9Ci0JfQotCWlmIChhdWRpby0+b3V0X25lZWRlZCkgewotCQlpZiAoIWxpc3RfZW1wdHkoJmF1ZGlvLT5vdXRfcXVldWUpKQotCQkJYXVkbHBhX2FzeW5jX3NlbmRfYnVmZmVyKGF1ZGlvKTsKLQl9Ci1kb25lOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZGxwYV9hc3luY19mbHVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRscGFfYnVmZmVyX25vZGUgKmJ1Zl9ub2RlOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5vdXRfcXVldWUpIHsKLQkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGF1ZGxwYV9idWZmZXJfbm9kZSwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0JCXBheWxvYWQuYWlvX2J1ZiA9IGJ1Zl9ub2RlLT5idWY7Ci0JCWlmICgoYnVmX25vZGUtPnBhZGRyICE9IDB4RkZGRkZGRkYpICYmCi0JCQkoYnVmX25vZGUtPmJ1Zi5kYXRhX2xlbiAhPSAwKSkKLQkJCWF1ZGxwYV9wb3N0X2V2ZW50KGF1ZGlvLCBBVURJT19FVkVOVF9XUklURV9ET05FLAotCQkJCQkJCSAgcGF5bG9hZCk7Ci0JCWtmcmVlKGJ1Zl9ub2RlKTsKLQl9Ci0JYXVkaW8tPmRydl9zdGF0dXMgJj0gfkFEUlZfU1RBVFVTX09CVUZfR0lWRU47Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCWF1ZGlvLT5ieXRlY291bnRfY29uc3VtZWQgPSAwOwotCWF1ZGlvLT5ieXRlY291bnRfaGVhZCA9IDA7Ci0JYXVkaW8tPmJ5dGVjb3VudF9naXZlbiA9IDA7Ci0JYXVkaW8tPmRldmljZV9zd2l0Y2ggPSBERVZJQ0VfU1dJVENIX1NUQVRFX05PTkU7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9ieXRlcywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2lvcG9ydF9yZXNldChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCS8qIElmIGZzeW5jIGlzIGluIHByb2dyZXNzLCBtYWtlIHN1cmUKLQkgKiByZXR1cm4gdmFsdWUgb2YgZnN5bmMgaW5kaWNhdGVzCi0JICogYWJvcnQgZHVlIHRvIGZsdXNoCi0JICovCi0JaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfRlNZTkMpIHsKLQkJTU1fREJHKCJmc3luYyBpbiBwcm9ncmVzc1xuIik7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCQlhdWRscGFfYXN5bmNfZmx1c2goYXVkaW8pOwotCQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQkJYXVkaW8tPmF2c3luY19mbGFnID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPmF2c3luY193YWl0KTsKLQl9IGVsc2UKLQkJYXVkbHBhX2FzeW5jX2ZsdXNoKGF1ZGlvKTsKLX0KLQotc3RhdGljIGludCBhdWRscGFfZXZlbnRzX3BlbmRpbmcoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlbXB0eTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWVtcHR5ID0gIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gZW1wdHkgfHwgYXVkaW8tPmV2ZW50X2Fib3J0OwotfQotCi1zdGF0aWMgdm9pZCBhdWRscGFfcmVzZXRfZXZlbnRfcXVldWUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBhdWRscGFfZXZlbnQgKmRydl9ldnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhdWRpby0+ZXZlbnRfcXVldWUpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5ldmVudF9xdWV1ZSwKLQkJCXN0cnVjdCBhdWRscGFfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJc3RydWN0IGF1ZGxwYV9ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQkJa2ZyZWUoZHJ2X2V2dCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBsb25nIGF1ZGxwYV9wcm9jZXNzX2V2ZW50X3JlcShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB2b2lkIF9fdXNlciAqYXJnKQotewotCWxvbmcgcmM7Ci0Jc3RydWN0IG1zbV9hdWRpb19ldmVudCB1c3JfZXZ0OwotCXN0cnVjdCBhdWRscGFfZXZlbnQgKmRydl9ldnQgPSBOVUxMOwotCWludCB0aW1lb3V0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnVzcl9ldnQsIGFyZywgc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fZXZlbnQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQl0aW1lb3V0ID0gKGludCkgdXNyX2V2dC50aW1lb3V0X21zOwotCi0JaWYgKHRpbWVvdXQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCi0JCQlhdWRpby0+ZXZlbnRfd2FpdCwgYXVkbHBhX2V2ZW50c19wZW5kaW5nKGF1ZGlvKSwKLQkJCW1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOwotCQlpZiAocmMgPT0gMCkKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCX0gZWxzZSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAotCQkJYXVkaW8tPmV2ZW50X3dhaXQsIGF1ZGxwYV9ldmVudHNfcGVuZGluZyhhdWRpbykpOwotCX0KLQotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCWlmIChhdWRpby0+ZXZlbnRfYWJvcnQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMDsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcmMgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+ZXZlbnRfcXVldWUpKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQlzdHJ1Y3QgYXVkbHBhX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCX0KLQlpZiAoZHJ2X2V2dCkgewotCQl1c3JfZXZ0LmV2ZW50X3R5cGUgPSBkcnZfZXZ0LT5ldmVudF90eXBlOwotCQl1c3JfZXZ0LmV2ZW50X3BheWxvYWQgPSBkcnZfZXZ0LT5wYXlsb2FkOwotCQlsaXN0X2FkZF90YWlsKCZkcnZfZXZ0LT5saXN0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCX0gZWxzZQotCQlyYyA9IC0xOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoZHJ2X2V2dC0+ZXZlbnRfdHlwZSA9PSBBVURJT19FVkVOVF9XUklURV9ET05FIHx8Ci0JICAgIGRydl9ldnQtPmV2ZW50X3R5cGUgPT0gQVVESU9fRVZFTlRfUkVBRF9ET05FKSB7Ci0JCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQkJYXVkbHBhX2lvbl9maXh1cChhdWRpbywgZHJ2X2V2dC0+cGF5bG9hZC5haW9fYnVmLmJ1Zl9hZGRyLAotCQkJCSAgZHJ2X2V2dC0+cGF5bG9hZC5haW9fYnVmLmJ1Zl9sZW4sIDApOwotCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQl9Ci0JaWYgKCFyYyAmJiBjb3B5X3RvX3VzZXIoYXJnLCAmdXNyX2V2dCwgc2l6ZW9mKHVzcl9ldnQpKSkKLQkJcmMgPSAtRUZBVUxUOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGxwYV9pb25fY2hlY2soc3RydWN0IGF1ZGlvICphdWRpbywKLQkJdm9pZCAqdmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQotewotCXN0cnVjdCBhdWRscGFfaW9uX3JlZ2lvbiAqcmVnaW9uX2VsdDsKLQlzdHJ1Y3QgYXVkbHBhX2lvbl9yZWdpb24gdCA9IHsudmFkZHIgPSB2YWRkciwgLmxlbiA9IGxlbiB9OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZWdpb25fZWx0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUsIGxpc3QpIHsKLQkJaWYgKENPTlRBSU5TKHJlZ2lvbl9lbHQsICZ0KSB8fCBDT05UQUlOUygmdCwgcmVnaW9uX2VsdCkgfHwKLQkJICAgIE9WRVJMQVBTKHJlZ2lvbl9lbHQsICZ0KSkgewotCQkJTU1fRVJSKCJbJXBdOnJlZ2lvbiAodmFkZHIgJXAgbGVuICVsZCkiCi0JCQkJIiBjbGFzaGVzIHdpdGggcmVnaXN0ZXJlZCByZWdpb24iCi0JCQkJIiAodmFkZHIgJXAgcGFkZHIgJXAgbGVuICVsZClcbiIsCi0JCQkJYXVkaW8sIHZhZGRyLCBsZW4sCi0JCQkJcmVnaW9uX2VsdC0+dmFkZHIsCi0JCQkJKHZvaWQgKilyZWdpb25fZWx0LT5wYWRkciwgcmVnaW9uX2VsdC0+bGVuKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50IGF1ZGxwYV9pb25fYWRkKHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX2lvbl9pbmZvICppbmZvKQotewotCWlvbl9waHlzX2FkZHJfdCBwYWRkcjsKLQlzaXplX3QgbGVuOwotCXVuc2lnbmVkIGxvbmcga3ZhZGRyOwotCXN0cnVjdCBhdWRscGFfaW9uX3JlZ2lvbiAqcmVnaW9uOwotCWludCByYyA9IC1FSU5WQUw7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZTsKLQl1bnNpZ25lZCBsb25nIGlvbmZsYWc7Ci0KLQlNTV9FUlIoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCXJlZ2lvbiA9IGttYWxsb2Moc2l6ZW9mKCpyZWdpb24pLCBHRlBfS0VSTkVMKTsKLQotCWlmICghcmVnaW9uKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlbmQ7Ci0JfQotCWhhbmRsZSA9IGlvbl9pbXBvcnRfZG1hX2J1ZihhdWRpby0+Y2xpZW50LCBpbmZvLT5mZCk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGhhbmRsZSkpIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBoYW5kbGUgb2YgdGhlIGdpdmVuIGZkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gaW1wb3J0X2Vycm9yOwotCX0KLQlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSwgJmlvbmZsYWcpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGZsYWdzIGZvciB0aGUgaGFuZGxlXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmxhZ19lcnJvcjsKLQl9Ci0Ja3ZhZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9uX21hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgaGFuZGxlKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoKHZvaWQgKilrdmFkZHIpKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgdmlydHVhbCBhZGRyZXNzXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gbWFwX2Vycm9yOwotCX0KLQlyYyA9IGlvbl9waHlzKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSwgJnBhZGRyLCAmbGVuKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBwaHlzaWNhbCBhZGRyZXNzXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gaW9uX2Vycm9yOwotCX0KLQlyYyA9IGF1ZGxwYV9pb25fY2hlY2soYXVkaW8sIGluZm8tPnZhZGRyLCBsZW4pOwotCWlmIChyYyA8IDApIHsKLQkJTU1fRVJSKCJhdWRwY21faW9uX2NoZWNrIGZhaWxlZFxuIik7Ci0JCWdvdG8gaW9uX2Vycm9yOwotCX0KLQlyZWdpb24tPmhhbmRsZSA9IGhhbmRsZTsKLQlyZWdpb24tPnZhZGRyID0gaW5mby0+dmFkZHI7Ci0JcmVnaW9uLT5mZCA9IGluZm8tPmZkOwotCXJlZ2lvbi0+cGFkZHIgPSBwYWRkcjsKLQlyZWdpb24tPmt2YWRkciA9IGt2YWRkcjsKLQlyZWdpb24tPmxlbiA9IGxlbjsKLQlyZWdpb24tPnJlZl9jbnQgPSAwOwotCU1NX0RCRygiWyVwXTphZGQgcmVnaW9uIHBhZGRyICVseCB2YWRkciAlcCwgbGVuICVsdSBrdmFkZHIgJWx4XG4iLAotCQlhdWRpbywgcmVnaW9uLT5wYWRkciwgcmVnaW9uLT52YWRkciwKLQkJcmVnaW9uLT5sZW4sIHJlZ2lvbi0+a3ZhZGRyKTsKLQlsaXN0X2FkZF90YWlsKCZyZWdpb24tPmxpc3QsICZhdWRpby0+aW9uX3JlZ2lvbl9xdWV1ZSk7Ci0KLQlyZXR1cm4gcmM7Ci0KLWlvbl9lcnJvcjoKLQlpb25fdW5tYXBfa2VybmVsKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci1tYXBfZXJyb3I6Ci1mbGFnX2Vycm9yOgotCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci1pbXBvcnRfZXJyb3I6Ci0Ja2ZyZWUocmVnaW9uKTsKLWVuZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkbHBhX2lvbl9yZW1vdmUoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJCXN0cnVjdCBtc21fYXVkaW9faW9uX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IGF1ZGxwYV9pb25fcmVnaW9uICpyZWdpb247Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5pb25fcmVnaW9uX3F1ZXVlKSB7Ci0JCXJlZ2lvbiA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXVkbHBhX2lvbl9yZWdpb24sIGxpc3QpOwotCi0JCWlmIChyZWdpb24gIT0gTlVMTCAmJiAocmVnaW9uLT5mZCA9PSBpbmZvLT5mZCkgJiYKLQkJICAgIChyZWdpb24tPnZhZGRyID09IGluZm8tPnZhZGRyKSkgewotCQkJaWYgKHJlZ2lvbi0+cmVmX2NudCkgewotCQkJCU1NX0RCRygiJXNbJXBdOnJlZ2lvbiAlcCBpbiB1c2UgcmVmX2NudCAlZFxuIiwKLQkJCQkJX19mdW5jX18sIGF1ZGlvLCByZWdpb24sCi0JCQkJCXJlZ2lvbi0+cmVmX2NudCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlNTV9EQkcoInJlbW92ZSByZWdpb24gZmQgJWQgdmFkZHIgJXBcbiIsCi0JCQkJaW5mby0+ZmQsIGluZm8tPnZhZGRyKTsKLQkJCWxpc3RfZGVsKCZyZWdpb24tPmxpc3QpOwotCQkJaW9uX3VubWFwX2tlcm5lbChhdWRpby0+Y2xpZW50LCByZWdpb24tPmhhbmRsZSk7Ci0JCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCByZWdpb24tPmhhbmRsZSk7Ci0JCQlrZnJlZShyZWdpb24pOwotCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkbHBhX2lvbl9sb29rdXBfdmFkZHIoc3RydWN0IGF1ZGlvICphdWRpbywgdm9pZCAqYWRkciwKLQkJCXVuc2lnbmVkIGxvbmcgbGVuLCBzdHJ1Y3QgYXVkbHBhX2lvbl9yZWdpb24gKipyZWdpb24pCi17Ci0Jc3RydWN0IGF1ZGxwYV9pb25fcmVnaW9uICpyZWdpb25fZWx0OwotCWludCBtYXRjaF9jb3VudCA9IDA7Ci0JKnJlZ2lvbiA9IE5VTEw7Ci0KLQkvKiByZXR1cm5zIHBoeXNpY2FsIGFkZHJlc3Mgb3IgemVybyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkocmVnaW9uX2VsdCwgJmF1ZGlvLT5pb25fcmVnaW9uX3F1ZXVlLCBsaXN0KSB7Ci0JCWlmIChhZGRyID49IHJlZ2lvbl9lbHQtPnZhZGRyICYmCi0JCSAgICBhZGRyIDwgcmVnaW9uX2VsdC0+dmFkZHIgKyByZWdpb25fZWx0LT5sZW4gJiYKLQkJICAgIGFkZHIgKyBsZW4gPD0gcmVnaW9uX2VsdC0+dmFkZHIgKyByZWdpb25fZWx0LT5sZW4pIHsKLQkJCS8qIG9mZnNldCBzaW5jZSB3ZSBjb3VsZCBwYXNzIHZhZGRyIGluc2lkZSBhIHJlZ2lzdGVyZAotCQkJICogaW9uIGJ1ZmZlcgotCQkJICovCi0KLQkJCW1hdGNoX2NvdW50Kys7Ci0JCQlpZiAoISpyZWdpb24pCi0JCQkJKnJlZ2lvbiA9IHJlZ2lvbl9lbHQ7Ci0JCX0KLQl9Ci0KLQlpZiAobWF0Y2hfY291bnQgPiAxKSB7Ci0JCU1NX0VSUigiJXNbJXBdOm11bHRpcGxlIGhpdHMgZm9yIHZhZGRyICVwLCBsZW4gJWxkXG4iLAotCQkJIF9fZnVuY19fLCBhdWRpbywgYWRkciwgbGVuKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZWdpb25fZWx0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUsCi0JCQkJCWxpc3QpIHsKLQkJCWlmIChhZGRyID49IHJlZ2lvbl9lbHQtPnZhZGRyICYmCi0JCQkgICAgYWRkciA8IHJlZ2lvbl9lbHQtPnZhZGRyICsgcmVnaW9uX2VsdC0+bGVuICYmCi0JCQkgICAgYWRkciArIGxlbiA8PSByZWdpb25fZWx0LT52YWRkciArIHJlZ2lvbl9lbHQtPmxlbikKLQkJCQkJTU1fRVJSKCJcdCVzWyVwXTolcCwgJWxkIC0tPiAlcFxuIiwKLQkJCQkJCV9fZnVuY19fLCBhdWRpbywKLQkJCQkJCXJlZ2lvbl9lbHQtPnZhZGRyLAotCQkJCQkJcmVnaW9uX2VsdC0+bGVuLAotCQkJCQkJKHZvaWQgKilyZWdpb25fZWx0LT5wYWRkcik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKnJlZ2lvbiA/IDAgOiAtMTsKLX0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGF1ZGxwYV9pb25fZml4dXAoc3RydWN0IGF1ZGlvICphdWRpbywgdm9pZCAqYWRkciwKLQkJICAgIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgcmVmX3VwKQotewotCXN0cnVjdCBhdWRscGFfaW9uX3JlZ2lvbiAqcmVnaW9uOwotCXVuc2lnbmVkIGxvbmcgcGFkZHI7Ci0JaW50IHJldDsKLQotCXJldCA9IGF1ZGxwYV9pb25fbG9va3VwX3ZhZGRyKGF1ZGlvLCBhZGRyLCBsZW4sICZyZWdpb24pOwotCWlmIChyZXQpIHsKLQkJTU1fRVJSKCIlc1slcF06bG9va3VwICglcCwgJWxkKSBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXywgYXVkaW8sIGFkZHIsIGxlbik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAocmVmX3VwKQotCQlyZWdpb24tPnJlZl9jbnQrKzsKLQllbHNlCi0JCXJlZ2lvbi0+cmVmX2NudC0tOwotCU1NX0RCRygiZm91bmQgcmVnaW9uICVwIHJlZl9jbnQgJWRcbiIsIHJlZ2lvbiwgcmVnaW9uLT5yZWZfY250KTsKLQlwYWRkciA9IHJlZ2lvbi0+cGFkZHIgKyAoYWRkciAtIHJlZ2lvbi0+dmFkZHIpOwotCXJldHVybiBwYWRkcjsKLX0KLQotLyogYXVkaW8gLT4gbG9jayBtdXN0IGJlIGhlbGQgYXQgdGhpcyBwb2ludCAqLwotc3RhdGljIGludCBhdWRscGFfYWlvX2J1Zl9hZGQoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgZGlyLAotCXZvaWQgX191c2VyICphcmcpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYXVkbHBhX2J1ZmZlcl9ub2RlICpidWZfbm9kZTsKLQotCWJ1Zl9ub2RlID0ga21hbGxvYyhzaXplb2YoKmJ1Zl9ub2RlKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWJ1Zl9ub2RlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmX25vZGUtPmJ1ZiwgYXJnLCBzaXplb2YoYnVmX25vZGUtPmJ1ZikpKSB7Ci0JCWtmcmVlKGJ1Zl9ub2RlKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JTU1fREJHKCJub2RlICVwIGRpciAleCBidWZfYWRkciAlcCBidWZfbGVuICVkIGRhdGFfbGVuIgotCQkJIiVkXG4iLCBidWZfbm9kZSwgZGlyLAotCQkJYnVmX25vZGUtPmJ1Zi5idWZfYWRkciwgYnVmX25vZGUtPmJ1Zi5idWZfbGVuLAotCQkJYnVmX25vZGUtPmJ1Zi5kYXRhX2xlbik7Ci0KLQlidWZfbm9kZS0+cGFkZHIgPSBhdWRscGFfaW9uX2ZpeHVwKAotCQlhdWRpbywgYnVmX25vZGUtPmJ1Zi5idWZfYWRkciwKLQkJYnVmX25vZGUtPmJ1Zi5idWZfbGVuLCAxKTsKLQotCWlmIChkaXIpIHsKLQkJLyogd3JpdGUgKi8KLQkJaWYgKCFidWZfbm9kZS0+cGFkZHIgfHwKLQkJICAgIChidWZfbm9kZS0+cGFkZHIgJiAweDEpIHx8Ci0JCSAgICAoYnVmX25vZGUtPmJ1Zi5kYXRhX2xlbiAmIDB4MSkpIHsKLQkJCWtmcmVlKGJ1Zl9ub2RlKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsICZhdWRpby0+b3V0X3F1ZXVlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGxwYV9hc3luY19zZW5kX2RhdGEoYXVkaW8sIDAsIDApOwotCX0gZWxzZSB7Ci0JCS8qIHJlYWQgKi8KLQl9Ci0KLQlNTV9EQkcoIkFkZCBidWZfbm9kZSAlcCBwYWRkciAlbHhcbiIsIGJ1Zl9ub2RlLCBidWZfbm9kZS0+cGFkZHIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZW5hYmxlX2VxKHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0JaWYgKGF1ZGlvLT5lcV9lbmFibGUgPT0gZW5hYmxlICYmICFhdWRpby0+ZXFfbmVlZHNfY29tbWl0KQotCQlyZXR1cm4gMDsKLQotCWF1ZGlvLT5lcV9lbmFibGUgPSBlbmFibGU7Ci0KLQlpZiAoYXVkaW8tPnJ1bm5pbmcpIHsKLQkJYXVkcHBfZHNwX3NldF9lcShhdWRpby0+ZGVjX2lkLCBlbmFibGUsICZhdWRpby0+ZXEsIFBPUFApOwotCQlhdWRpby0+ZXFfbmVlZHNfY29tbWl0ID0gMDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZ2V0X2F2c3luY19kYXRhKHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JCQkJCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzICpzdGF0cykKLXsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaWYgKGF1ZGlvLT5kZWNfaWQgPT0gYXVkaW8tPmF2c3luY1swXSAmJiBhdWRpby0+YXZzeW5jX2ZsYWcpIHsKLQkJLyogYXZfc3luYyBzYW1wbGUgY291bnQgKi8KLQkJc3RhdHMtPnNhbXBsZV9jb3VudCA9IChhdWRpby0+YXZzeW5jWzJdIDw8IDE2KSB8Ci0JCQkJCQkoYXVkaW8tPmF2c3luY1szXSk7Ci0KLQkJLyogYXZfc3luYyBieXRlX2NvdW50ICovCi0JCXN0YXRzLT5ieXRlX2NvdW50ID0gKGF1ZGlvLT5hdnN5bmNbNV0gPDwgMTYpIHwKLQkJCQkJCShhdWRpby0+YXZzeW5jWzZdKTsKLQotCQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAwOwotCQlyYyA9IDA7Ci0JfQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm4gcmM7Ci0KLX0KLQotc3RhdGljIGxvbmcgYXVkaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQl1aW50MTZfdCBlbmFibGVfbWFzazsKLQlpbnQgZW5hYmxlOwotCWludCBwcmV2X3N0YXRlOwotCi0JTU1fREJHKCJhdWRpb19pb2N0bCgpIGNtZCA9ICVkXG4iLCBjbWQpOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfU1RBVFMpIHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyBzdGF0czsKLQotCQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAwOwotCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKLQkJaWYgKGF1ZHBwX3F1ZXJ5X2F2c3luYyhhdWRpby0+ZGVjX2lkKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+YXZzeW5jX3dhaXQsCi0JCQkJKGF1ZGlvLT5hdnN5bmNfZmxhZyA9PSAxKSwKLQkJCQltc2Vjc190b19qaWZmaWVzKEFWU1lOQ19FVkVOVF9USU1FT1VUKSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJZWxzZSBpZiAoKHJjID4gMCkgfHwgKChyYyA9PSAwKSAmJiAoYXVkaW8tPmF2c3luY19mbGFnID09IDEpKSkgewotCQkJaWYgKGF1ZGlvX2dldF9hdnN5bmNfZGF0YShhdWRpbywgJnN0YXRzKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UKLQkJCXJldHVybiAtRUFHQUlOOwotCX0KLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19FTkFCTEVfQVVEUFA6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZW5hYmxlX21hc2ssICh2b2lkICopIGFyZywKLQkJCQkJCXNpemVvZihlbmFibGVfbWFzaykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJZW5hYmxlID0gKGVuYWJsZV9tYXNrICYgRVFfRU5BQkxFKSA/IDEgOiAwOwotCQlhdWRpb19lbmFibGVfZXEoYXVkaW8sIGVuYWJsZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKEFVRFBQX0NNRF9DRkdfREVWX01JWEVSX0lEXzQsCi0JCQkJCQkmYXVkaW8tPnZvbF9wYW4sCi0JCQkJCQlDT1BQKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX1NFVF9QQU46Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPnZvbF9wYW4ucGFuID0gYXJnOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oQVVEUFBfQ01EX0NGR19ERVZfTUlYRVJfSURfNCwKLQkJCQkJCSZhdWRpby0+dm9sX3BhbiwKLQkJCQkJCUNPUFApOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fU0VUX0VROgotCQlwcmV2X3N0YXRlID0gYXVkaW8tPmVxX2VuYWJsZTsKLQkJYXVkaW8tPmVxX2VuYWJsZSA9IDA7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYXVkaW8tPmVxLm51bV9iYW5kcywgKHZvaWQgKikgYXJnLAotCQkJCXNpemVvZihhdWRpby0+ZXEpIC0KLQkJCQkoQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TX0NPTU1PTl9MRU4gKyAyKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWF1ZGlvLT5lcV9lbmFibGUgPSBwcmV2X3N0YXRlOwotCQlhdWRpby0+ZXFfbmVlZHNfY29tbWl0ID0gMTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoLUVJTlZBTCAhPSByYykKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfRVZFTlQpIHsKLQkJTU1fREJHKCIgQVVESU9fR0VUX0VWRU5UXG4iKTsKLQkJaWYgKG11dGV4X3RyeWxvY2soJmF1ZGlvLT5nZXRfZXZlbnRfbG9jaykpIHsKLQkJCXJjID0gYXVkbHBhX3Byb2Nlc3NfZXZlbnRfcmVxKGF1ZGlvLAotCQkJCSh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCQl9IGVsc2UKLQkJCXJjID0gLUVCVVNZOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKGNtZCA9PSBBVURJT19BQk9SVF9HRVRfRVZFTlQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCQlNTV9EQkcoIkFVRElPX1NUQVJUXG4iKTsKLQkJcmMgPSBhdWRpb19lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUsCi0JCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0RFQ09ERVJfV0FJVF9NUykpOwotCQkJTU1fREJHKCJkZWNfc3RhdGUgJWQgcmMgPSAlZFxuIiwgYXVkaW8tPmRlY19zdGF0ZSwgcmMpOwotCi0JCQlpZiAoYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfU1VDQ0VTUykKLQkJCQlyYyA9IC1FTk9ERVY7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TVE9QOgotCQlNTV9EQkcoIkFVRElPX1NUT1BcbiIpOwotCQlyYyA9IGF1ZGlvX2Rpc2FibGUoYXVkaW8pOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCWF1ZGlvX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYXVkaW8tPmRydl9zdGF0dXMgJj0gfkFEUlZfU1RBVFVTX1BBVVNFOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fRkxVU0g6Ci0JCU1NX0RCRygiQVVESU9fRkxVU0hcbiIpOwotCQlhdWRpby0+d2ZsdXNoID0gMTsKLQkJYXVkaW9faW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCQlpZiAoIShhdWRpby0+ZHJ2X3N0YXR1cyAmIEFEUlZfU1RBVFVTX1BBVVNFKSkgewotCQkJCXJjID0gYXVkcHBfcGF1c2UoYXVkaW8tPmRlY19pZCwgKGludCkgYXJnKTsKLQkJCQlpZiAocmMgPCAwKSB7Ci0JCQkJCU1NX0VSUigiJXM6IHBhdXNlIGNtZCBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJCQlyYyA9IC1FSU5UUjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYXVkcHBfZmx1c2goYXVkaW8tPmRlY19pZCk7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkhYXVkaW8tPndmbHVzaCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJTU1fRVJSKCJBVURJT19GTFVTSCBpbnRlcnJ1cHRlZFxuIik7Ci0JCQkJcmMgPSAtRUlOVFI7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQVVESU9fU0VUX0NPTkZJRzp7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJTU1fSU5GTygiQVVESU9fU0VUX0NPTkZJR1xuIik7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY29uZmlnLCAodm9pZCAqKSBhcmcsIHNpemVvZihjb25maWcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJTU1fSU5GTygiRVJST1I6IGNvcHkgZnJvbSB1c2VyXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjb25maWcuY2hhbm5lbF9jb3VudCA9PSAxKSB7Ci0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IEFVRFBQX0NNRF9QQ01fSU5URl9NT05PX1Y7Ci0JCX0gZWxzZSBpZiAoY29uZmlnLmNoYW5uZWxfY291bnQgPT0gMikgewotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSBBVURQUF9DTURfUENNX0lOVEZfU1RFUkVPX1Y7Ci0JCX0gZWxzZSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlNTV9JTkZPKCJFUlJPUjogY29uZmlnLmNoYW5uZWxfY291bnQgPT0gJWRcbiIsCi0JCQkJCWNvbmZpZy5jaGFubmVsX2NvdW50KTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvbmZpZy5iaXRzID09IDgpCi0JCQljb25maWcuYml0cyA9IEFVRFBQX0NNRF9XQVZfUENNX1dJRFRIXzg7Ci0JCWVsc2UgaWYgKGNvbmZpZy5iaXRzID09IDE2KQotCQkJY29uZmlnLmJpdHMgPSBBVURQUF9DTURfV0FWX1BDTV9XSURUSF8xNjsKLQkJZWxzZSBpZiAoY29uZmlnLmJpdHMgPT0gMjQpCi0JCQljb25maWcuYml0cyA9IEFVRFBQX0NNRF9XQVZfUENNX1dJRFRIXzI0OwotCQllbHNlIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCU1NX0lORk8oIkVSUk9SOiBjb25maWcuYml0cyA9PSAlZFxuIiwgY29uZmlnLmJpdHMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLQkJYXVkaW8tPm91dF9jaGFubmVsX21vZGUgPSBjb25maWcuY2hhbm5lbF9jb3VudDsKLQkJYXVkaW8tPm91dF9iaXRzID0gY29uZmlnLmJpdHM7Ci0JCWF1ZGlvLT5idWZmZXJfY291bnQgPSBjb25maWcuYnVmZmVyX2NvdW50OwotCQlhdWRpby0+YnVmZmVyX3NpemUgPSBjb25maWcuYnVmZmVyX3NpemU7Ci0JCU1NX0RCRygiQVVESU9fU0VUX0NPTkZJRzogY29uZmlnLmJpdHMgPSAlZFxuIiwgY29uZmlnLmJpdHMpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgQVVESU9fR0VUX0NPTkZJRzp7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IGF1ZGlvLT5idWZmZXJfY291bnQ7Ci0JCWNvbmZpZy5idWZmZXJfc2l6ZSA9IGF1ZGlvLT5idWZmZXJfc2l6ZTsKLQkJY29uZmlnLnNhbXBsZV9yYXRlID0gYXVkaW8tPm91dF9zYW1wbGVfcmF0ZTsKLQkJaWYgKGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID09IEFVRFBQX0NNRF9QQ01fSU5URl9NT05PX1YpCi0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JCWVsc2UKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gMjsKLQkJaWYgKGF1ZGlvLT5vdXRfYml0cyA9PSBBVURQUF9DTURfV0FWX1BDTV9XSURUSF84KQotCQkJY29uZmlnLmJpdHMgPSA4OwotCQllbHNlIGlmIChhdWRpby0+b3V0X2JpdHMgPT0gQVVEUFBfQ01EX1dBVl9QQ01fV0lEVEhfMjQpCi0JCQljb25maWcuYml0cyA9IDI0OwotCQllbHNlCi0JCQljb25maWcuYml0cyA9IDE2OwotCQljb25maWcubWV0YV9maWVsZCA9IDA7Ci0JCWNvbmZpZy51bnVzZWRbMF0gPSAwOwotCQljb25maWcudW51c2VkWzFdID0gMDsKLQkJY29uZmlnLnVudXNlZFsyXSA9IDA7Ci0JCU1NX0RCRygiQVVESU9fR0VUX0NPTkZJRzogY29uZmlnLmJpdHMgPSAlZFxuIiwgY29uZmlnLmJpdHMpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgQVVESU9fUEFVU0U6Ci0JCU1NX0RCRygiQVVESU9fUEFVU0UgJWxkXG4iLCBhcmcpOwotCQlyYyA9IGF1ZHBwX3BhdXNlKGF1ZGlvLT5kZWNfaWQsIChpbnQpIGFyZyk7Ci0JCWlmIChhcmcgPT0gMSkKLQkJCWF1ZGlvLT5kcnZfc3RhdHVzIHw9IEFEUlZfU1RBVFVTX1BBVVNFOwotCQllbHNlIGlmIChhcmcgPT0gMCkKLQkJCWF1ZGlvLT5kcnZfc3RhdHVzICY9IH5BRFJWX1NUQVRVU19QQVVTRTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX1JFR0lTVEVSX0lPTjogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2lvbl9pbmZvIGluZm87Ci0JCU1NX0RCRygiQVVESU9fUkVHSVNURVJfSU9OXG4iKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCAodm9pZCAqKSBhcmcsIHNpemVvZihpbmZvKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJZWxzZQotCQkJCXJjID0gYXVkbHBhX2lvbl9hZGQoYXVkaW8sICZpbmZvKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQljYXNlIEFVRElPX0RFUkVHSVNURVJfSU9OOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9faW9uX2luZm8gaW5mbzsKLQkJTU1fREJHKCJBVURJT19ERVJFR0lTVEVSX0lPTlxuIik7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgKHZvaWQgKikgYXJnLCBzaXplb2YoaW5mbykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IGF1ZGxwYV9pb25fcmVtb3ZlKGF1ZGlvLCAmaW5mbyk7Ci0JCQlicmVhazsKLQkJfQotCi0JY2FzZSBBVURJT19BU1lOQ19XUklURToKLQkJaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfRlNZTkMpCi0JCQlyYyA9IC1FQlVTWTsKLQkJZWxzZQotCQkJcmMgPSBhdWRscGFfYWlvX2J1Zl9hZGQoYXVkaW8sIDEsICh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fR0VUX1NFU1NJT05fSUQ6Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmYXVkaW8tPmRlY19pZCwKLQkJCQkJc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSBhdWRpby0+Y29kZWNfb3BzLmlvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKiBPbmx5IHVzZWZ1bCBpbiB0dW5uZWwtbW9kZSAqLwotaW50IGF1ZGxwYV9hc3luY19mc3luYyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWludCByYyA9IDAsIGVtcHR5ID0gMDsKLQlzdHJ1Y3QgYXVkbHBhX2J1ZmZlcl9ub2RlICpidWZfbm9kZTsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQkvKiBCbG9ja2luZyBjbGllbnQgc2VuZHMgbW9yZSBkYXRhICovCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGlvLT5kcnZfc3RhdHVzIHw9IEFEUlZfU1RBVFVTX0ZTWU5DOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCWF1ZGlvLT50ZW9zID0gMDsKLQllbXB0eSA9IGxpc3RfZW1wdHkoJmF1ZGlvLT5vdXRfcXVldWUpOwotCWJ1Zl9ub2RlID0ga21hbGxvYyhzaXplb2YoKmJ1Zl9ub2RlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZfbm9kZSkKLQkJZ290byBkb25lOwotCi0JYnVmX25vZGUtPnBhZGRyID0gMHhGRkZGRkZGRjsKLQlidWZfbm9kZS0+YnVmLmRhdGFfbGVuID0gMDsKLQlidWZfbm9kZS0+YnVmLmJ1Zl9hZGRyID0gTlVMTDsKLQlidWZfbm9kZS0+YnVmLmJ1Zl9sZW4gPSAwOwotCWJ1Zl9ub2RlLT5idWYucHJpdmF0ZV9kYXRhID0gTlVMTDsKLQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwgJmF1ZGlvLT5vdXRfcXVldWUpOwotCWlmICgoZW1wdHkgIT0gMCkgJiYgKGF1ZGlvLT5vdXRfbmVlZGVkID09IDEpKQotCQlhdWRscGFfYXN5bmNfc2VuZF9kYXRhKGF1ZGlvLCAwLCAwKTsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCSAgYXVkaW8tPnRlb3MgfHwgYXVkaW8tPndmbHVzaCB8fAotCQkJCSAgYXVkaW8tPnN0b3BwZWQpOwotCi0JaWYgKHJjIDwgMCkKLQkJZ290byBkb25lOwotCi0JaWYgKGF1ZGlvLT50ZW9zID09IDEpIHsKLQkJLyogUmVsZWFzaW5nIGFsbCB0aGUgcGVuZGluZyBidWZmZXJzIHRvIHVzZXIgKi8KLQkJYXVkaW8tPnRlb3MgPSAwOwotCQlhdWRscGFfYXN5bmNfZmx1c2goYXVkaW8pOwotCX0KLQotCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKQotCQlyYyA9IC1FQlVTWTsKLQotZG9uZToKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkaW8tPmRydl9zdGF0dXMgJj0gfkFEUlZfU1RBVFVTX0ZTWU5DOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgYXVkbHBhX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgcHBvczEsIGxvZmZfdCBwcG9zMiwgaW50IGRhdGFzeW5jKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoIWF1ZGlvLT5ydW5uaW5nKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiBhdWRscGFfYXN5bmNfZnN5bmMoYXVkaW8pOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwY21fcmVzZXRfaW9uX3JlZ2lvbihzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRscGFfaW9uX3JlZ2lvbiAqcmVnaW9uOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUpIHsKLQkJcmVnaW9uID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhdWRscGFfaW9uX3JlZ2lvbiwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZyZWdpb24tPmxpc3QpOwotCQlpb25fdW5tYXBfa2VybmVsKGF1ZGlvLT5jbGllbnQsIHJlZ2lvbi0+aGFuZGxlKTsKLQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgcmVnaW9uLT5oYW5kbGUpOwotCQlrZnJlZShyZWdpb24pOwotCX0KLQotCXJldHVybjsKLX0KLQotc3RhdGljIGludCBhdWRpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCi0JTU1fSU5GTygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGZyZWVpbmdcbiIsIChpbnQpYXVkaW8pOwotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRkZXZfdW5yZWdpc3Rlcl9ldnRfbGlzdG5lcihBVURERVZfQ0xOVF9ERUMsIGF1ZGlvLT5kZWNfaWQpOwotCWF1ZGlvX2Rpc2FibGUoYXVkaW8pOwotCWF1ZGxwYV9hc3luY19mbHVzaChhdWRpbyk7Ci0JYXVkcGNtX3Jlc2V0X2lvbl9yZWdpb24oYXVkaW8pOwotCi0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRwbGF5KTsKLQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQl1bnJlZ2lzdGVyX2Vhcmx5X3N1c3BlbmQoJmF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlKTsKLSNlbmRpZgotCWF1ZGlvLT5vcGVuZWQgPSAwOwotCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDE7Ci0Jd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCWF1ZGxwYV9yZXNldF9ldmVudF9xdWV1ZShhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JaWYgKGF1ZGlvLT5kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKGF1ZGlvLT5kZW50cnkpOwotI2VuZGlmCi0JaW9uX2NsaWVudF9kZXN0cm95KGF1ZGlvLT5jbGllbnQpOwotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXVkbHBhX3Bvc3RfZXZlbnQoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHR5cGUsCi0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCkKLXsKLQlzdHJ1Y3QgYXVkbHBhX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpKSB7Ci0JCWVfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJc3RydWN0IGF1ZGxwYV9ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZlX25vZGUtPmxpc3QpOwotCX0gZWxzZSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRscGFfZXZlbnQpLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFlX25vZGUpIHsKLQkJCU1NX0VSUigiTm8gbWVtIHRvIHBvc3QgZXZlbnQgJWRcbiIsIHR5cGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JZV9ub2RlLT5ldmVudF90eXBlID0gdHlwZTsKLQllX25vZGUtPnBheWxvYWQgPSBwYXlsb2FkOwotCi0JbGlzdF9hZGRfdGFpbCgmZV9ub2RlLT5saXN0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLX0KLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdGF0aWMgdm9pZCBhdWRscGFfc3VzcGVuZChzdHJ1Y3QgZWFybHlfc3VzcGVuZCAqaCkKLXsKLQlzdHJ1Y3QgYXVkbHBhX3N1c3BlbmRfY3RsICpjdGwgPQotCQljb250YWluZXJfb2YoaCwgc3RydWN0IGF1ZGxwYV9zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkbHBhX3Bvc3RfZXZlbnQoY3RsLT5hdWRpbywgQVVESU9fRVZFTlRfU1VTUEVORCwgcGF5bG9hZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGxwYV9yZXN1bWUoc3RydWN0IGVhcmx5X3N1c3BlbmQgKmgpCi17Ci0Jc3RydWN0IGF1ZGxwYV9zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWRscGFfc3VzcGVuZF9jdGwsIG5vZGUpOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWF1ZGxwYV9wb3N0X2V2ZW50KGN0bC0+YXVkaW8sIEFVRElPX0VWRU5UX1JFU1VNRSwgcGF5bG9hZCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIHNzaXplX3QgYXVkbHBhX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkbHBhX2RlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNvbnN0IGludCBkZWJ1Z19idWZtYXggPSA0MDk2OwotCXN0YXRpYyBjaGFyIGJ1ZmZlcls0MDk2XTsKLQlpbnQgbiA9IDA7Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQluID0gc2NucHJpbnRmKGJ1ZmZlciwgZGVidWdfYnVmbWF4LCAib3BlbmVkICVkXG4iLCBhdWRpby0+b3BlbmVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCQkiZW5hYmxlZCAlZFxuIiwgYXVkaW8tPmVuYWJsZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJCSJzdG9wcGVkICVkXG4iLCBhdWRpby0+c3RvcHBlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkJInZvbHVtZSAleFxuIiwgYXVkaW8tPnZvbF9wYW4udm9sdW1lKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCQkic2FtcGxlIHJhdGUgJWRcbiIsCi0JCQkJCWF1ZGlvLT5vdXRfc2FtcGxlX3JhdGUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJCSJjaGFubmVsIG1vZGUgJWRcbiIsCi0JCQkJCWF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkvKiBGb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBvbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHdoZW4KLQkgKiB3aGVuIHBsYXliYWNrIGhhbHRzIHVuZXhwZWN0ZWRseS4gVGh1cywgbm8gbXV0dWFsIGV4Y2x1c2lvbgotCSAqIGVuZm9yY2VkCi0JICovCi0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkJIndmbHVzaCAlZFxuIiwgYXVkaW8tPndmbHVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkJInJ1bm5pbmcgJWRcbiIsIGF1ZGlvLT5ydW5uaW5nKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCQkiZGVjIHN0YXRlICVkXG4iLCBhdWRpby0+ZGVjX3N0YXRlKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCQkib3V0X25lZWRlZCAlZFxuIiwgYXVkaW8tPm91dF9uZWVkZWQpOwotCWJ1ZmZlcltuXSA9IDA7Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGJ1ZmZlciwgbik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGxwYV9kZWJ1Z19mb3BzID0gewotCS5yZWFkID0gYXVkbHBhX2RlYnVnX3JlYWQsCi0JLm9wZW4gPSBhdWRscGFfZGVidWdfb3BlbiwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBhdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBOVUxMOwotCWludCByYywgaSwgZGVjX2F0dHJiID0gMCwgZGVjaWQ7Ci0Jc3RydWN0IGF1ZGxwYV9ldmVudCAqZV9ub2RlID0gTlVMTDsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9scGFfIiArIDVdOwotI2VuZGlmCi0KLQkvKiBBbGxvY2F0ZSBhdWRpbyBpbnN0YW5jZSwgc2V0IHRvIHplcm8gKi8KLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpbyksIEdGUF9LRVJORUwpOwotCWlmICghYXVkaW8pIHsKLQkJTU1fRVJSKCJubyBtZW1vcnkgdG8gYWxsb2NhdGUgYXVkaW8gaW5zdGFuY2VcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JTU1fSU5GTygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGNyZWF0ZWRcbiIsIChpbnQpYXVkaW8pOwotCi0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlkZWNfYXR0cmIgfD0gTVNNX0FVRF9NT0RFX1RVTk5FTDsKLQl9IGVsc2UgewotCQlrZnJlZShhdWRpbyk7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIEFsbG9jYXRlIHRoZSBkZWNvZGVyIGJhc2VkIG9uIGlub2RlIG1pbm9yIG51bWJlciovCi0JYXVkaW8tPm1pbm9yX25vID0gaW1pbm9yKGlub2RlKTsKLQlkZWNfYXR0cmIgfD0gYXVkbHBhX2RlY3NbYXVkaW8tPm1pbm9yX25vXS5kZWNfYXR0cmI7Ci0JYXVkaW8tPmNvZGVjX29wcy5pb2N0bCA9IGF1ZGxwYV9kZWNzW2F1ZGlvLT5taW5vcl9ub10uaW9jdGw7Ci0JYXVkaW8tPmNvZGVjX29wcy5hZGVjX3BhcmFtcyA9IGF1ZGxwYV9kZWNzW2F1ZGlvLT5taW5vcl9ub10uYWRlY19wYXJhbXM7Ci0JYXVkaW8tPmJ1ZmZlcl9zaXplID0gQlVGU1o7Ci0JYXVkaW8tPmJ1ZmZlcl9jb3VudCA9IE1BWF9CVUY7Ci0KLQlkZWNfYXR0cmIgfD0gTVNNX0FVRF9NT0RFX0xQOwotCi0JZGVjaWQgPSBhdWRwcF9hZGVjX2FsbG9jKGRlY19hdHRyYiwgJmF1ZGlvLT5tb2R1bGVfbmFtZSwKLQkJCSZhdWRpby0+cXVldWVfaWQpOwotCWlmIChkZWNpZCA8IDApIHsKLQkJTU1fRVJSKCJObyBmcmVlIGRlY29kZXIgYXZhaWxhYmxlXG4iKTsKLQkJcmMgPSAtRU5PREVWOwotCQlNTV9JTkZPKCJhdWRpbyBpbnN0YW5jZSAweCUwOHggZnJlZWluZ1xuIiwgKGludClhdWRpbyk7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJZ290byBkb25lOwotCX0KLQlhdWRpby0+ZGVjX2lkID0gZGVjaWQgJiBNU01fQVVEX0RFQ09ERVJfTUFTSzsKLQotCU1NX0RCRygic2V0IHRvIGFpbyBpbnRlcmZhY2VcbiIpOwotCWF1ZGlvLT5kcnZfc3RhdHVzIHw9IEFEUlZfU1RBVFVTX0FJT19JTlRGOwotCi0JcmMgPSBtc21fYWRzcF9nZXQoYXVkaW8tPm1vZHVsZV9uYW1lLCAmYXVkaW8tPmF1ZHBsYXksCi0JCSZhdWRwbGF5X2Fkc3Bfb3BzX2xwYSwgYXVkaW8pOwotCi0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiZmFpbGVkIHRvIGdldCAlcyBtb2R1bGVcbiIsIGF1ZGlvLT5tb2R1bGVfbmFtZSk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIEluaXRpYWxpemUgYWxsIGxvY2tzIG9mIGF1ZGlvIGluc3RhbmNlICovCi0JbXV0ZXhfaW5pdCgmYXVkaW8tPmxvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZHNwX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPm91dF9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5pb25fcmVnaW9uX3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+ZXZlbnRfcXVldWUpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+YXZzeW5jX3dhaXQpOwotCi0JYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSA9IDQ0MTAwOwotCWF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID0gQVVEUFBfQ01EX1BDTV9JTlRGX1NURVJFT19WOwotCWF1ZGlvLT5vdXRfYml0cyA9IEFVRFBQX0NNRF9XQVZfUENNX1dJRFRIXzE2OwotCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IDB4MjAwMDsKLQotCWF1ZGxwYV9hc3luY19mbHVzaChhdWRpbyk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQlhdWRpby0+b3BlbmVkID0gMTsKLQotCWF1ZGlvLT5kZXZpY2VfZXZlbnRzID0gQVVEREVWX0VWVF9ERVZfUkRZCi0JCQkJfEFVRERFVl9FVlRfREVWX1JMUyB8IEFVRERFVl9FVlRfUkVMX1BFTkRJTkcKLQkJCQl8QVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRzsKLQlhdWRpby0+ZGV2aWNlX3N3aXRjaCA9IERFVklDRV9TV0lUQ0hfU1RBVEVfTk9ORTsKLQlhdWRpby0+ZHJ2X3N0YXR1cyAmPSB+QURSVl9TVEFUVVNfUEFVU0U7Ci0JYXVkaW8tPmJ5dGVjb3VudF9jb25zdW1lZCA9IDA7Ci0JYXVkaW8tPmJ5dGVjb3VudF9oZWFkID0gMDsKLQlhdWRpby0+Ynl0ZWNvdW50X2dpdmVuID0gMDsKLQotCXJjID0gYXVkZGV2X3JlZ2lzdGVyX2V2dF9saXN0bmVyKGF1ZGlvLT5kZXZpY2VfZXZlbnRzLAotCQkJCQlBVURERVZfQ0xOVF9ERUMsCi0JCQkJCWF1ZGlvLT5kZWNfaWQsCi0JCQkJCWxwYV9saXN0bmVyLAotCQkJCQkodm9pZCAqKWF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGxpc3RuZXRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBldmVudF9lcnI7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mIG5hbWUsICJtc21fbHBhXyUwNHgiLCBhdWRpby0+ZGVjX2lkKTsKLQlhdWRpby0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCU5VTEwsICh2b2lkICopIGF1ZGlvLCAmYXVkbHBhX2RlYnVnX2ZvcHMpOwotCi0JaWYgKElTX0VSUihhdWRpby0+ZGVudHJ5KSkKLQkJTU1fREJHKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLmxldmVsID0gRUFSTFlfU1VTUEVORF9MRVZFTF9ESVNBQkxFX0ZCOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLnJlc3VtZSA9IGF1ZGxwYV9yZXN1bWU7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUuc3VzcGVuZCA9IGF1ZGxwYV9zdXNwZW5kOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5hdWRpbyA9IGF1ZGlvOwotCXJlZ2lzdGVyX2Vhcmx5X3N1c3BlbmQoJmF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlKTsKLSNlbmRpZgotCWZvciAoaSA9IDA7IGkgPCBBVURMUEFfRVZFTlRfTlVNOyBpKyspIHsKLQkJZV9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGxwYV9ldmVudCksIEdGUF9LRVJORUwpOwotCQlpZiAoZV9ub2RlKQotCQkJbGlzdF9hZGRfdGFpbCgmZV9ub2RlLT5saXN0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCQllbHNlIHsKLQkJCU1NX0VSUigiZXZlbnQgcGt0IGFsbG9jIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWF1ZGlvLT5jbGllbnQgPSBtc21faW9uX2NsaWVudF9jcmVhdGUoVUlOVF9NQVgsICJBdWRpb19MUEFfQ2xpZW50Iik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGF1ZGlvLT5jbGllbnQpKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGNyZWF0ZSBJT04gY2xpZW50XG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCU1NX0RCRygiSW9uIGNsaWVudCBjcmVhdGVkXG4iKTsKLQotZG9uZToKLQlyZXR1cm4gcmM7Ci1ldmVudF9lcnI6Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRwbGF5KTsKLWVycjoKLQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0JTU1fSU5GTygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGZyZWVpbmdcbiIsIChpbnQpYXVkaW8pOwotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2xwYV9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBhdWRpb19vcGVuLAotCS5yZWxlYXNlCT0gYXVkaW9fcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBhdWRpb19pb2N0bCwKLQkuZnN5bmMJCT0gYXVkbHBhX2ZzeW5jLAotfTsKLQotc3RhdGljIGRldl90IGF1ZGxwYV9kZXZubzsKLXN0YXRpYyBzdHJ1Y3QgY2xhc3MgKmF1ZGxwYV9jbGFzczsKLXN0cnVjdCBhdWRscGFfZGV2aWNlIHsKLQljb25zdCBjaGFyICpuYW1lOwotCXN0cnVjdCBkZXZpY2UgKmRldmljZTsKLQlzdHJ1Y3QgY2RldiBjZGV2OwotfTsKLQotc3RhdGljIHN0cnVjdCBhdWRscGFfZGV2aWNlICphdWRscGFfZGV2aWNlczsKLQotc3RhdGljIHZvaWQgYXVkbHBhX2NyZWF0ZShzdHJ1Y3QgYXVkbHBhX2RldmljZSAqYWRldiwgY29uc3QgY2hhciAqbmFtZSwKLQkJCXN0cnVjdCBkZXZpY2UgKnBhcmVudCwgZGV2X3QgZGV2dCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JaW50IHJjOwotCi0JZGV2ID0gZGV2aWNlX2NyZWF0ZShhdWRscGFfY2xhc3MsIHBhcmVudCwgZGV2dCwgIiVzIiwgbmFtZSk7Ci0JaWYgKElTX0VSUihkZXYpKQotCQlyZXR1cm47Ci0KLQljZGV2X2luaXQoJmFkZXYtPmNkZXYsICZhdWRpb19scGFfZm9wcyk7Ci0JYWRldi0+Y2Rldi5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JcmMgPSBjZGV2X2FkZCgmYWRldi0+Y2RldiwgZGV2dCwgMSk7Ci0JaWYgKHJjIDwgMCkgewotCQlkZXZpY2VfZGVzdHJveShhdWRscGFfY2xhc3MsIGRldnQpOwotCX0gZWxzZSB7Ci0JCWFkZXYtPmRldmljZSA9IGRldjsKLQkJYWRldi0+bmFtZSA9IG5hbWU7Ci0JfQotfQotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19pbml0KHZvaWQpCi17Ci0JaW50IHJjOwotCWludCBuID0gQVJSQVlfU0laRShhdWRscGFfZGVjcyk7Ci0KLQlhdWRscGFfZGV2aWNlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRscGFfZGV2aWNlKSAqIG4sIEdGUF9LRVJORUwpOwotCWlmICghYXVkbHBhX2RldmljZXMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYXVkbHBhX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiYXVkbHBhIik7Ci0JaWYgKElTX0VSUihhdWRscGFfY2xhc3MpKQotCQlnb3RvIGZhaWxfY3JlYXRlX2NsYXNzOwotCi0JcmMgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZhdWRscGFfZGV2bm8sIDAsIG4sICJtc21fYXVkaW9fbHBhIik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBmYWlsX2FsbG9jX3JlZ2lvbjsKLQotCWZvciAobiA9IDA7IG4gPCBBUlJBWV9TSVpFKGF1ZGxwYV9kZWNzKTsgbisrKSB7Ci0JCWF1ZGxwYV9jcmVhdGUoYXVkbHBhX2RldmljZXMgKyBuLAotCQkJCWF1ZGxwYV9kZWNzW25dLm5hbWUsIE5VTEwsCi0JCQkJTUtERVYoTUFKT1IoYXVkbHBhX2Rldm5vKSwgbikpOwotCX0KLQotCXJldHVybiAwOwotCi1mYWlsX2FsbG9jX3JlZ2lvbjoKLQljbGFzc191bnJlZ2lzdGVyKGF1ZGxwYV9jbGFzcyk7Ci0JcmV0dXJuIHJjOwotZmFpbF9jcmVhdGVfY2xhc3M6Ci0Ja2ZyZWUoYXVkbHBhX2RldmljZXMpOwotCXJldHVybiAtRU5PTUVNOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXVkaW9fZXhpdCh2b2lkKQotewotCWNsYXNzX3VucmVnaXN0ZXIoYXVkbHBhX2NsYXNzKTsKLQlrZnJlZShhdWRscGFfZGV2aWNlcyk7Ci19Ci0KLW1vZHVsZV9pbml0KGF1ZGlvX2luaXQpOwotbW9kdWxlX2V4aXQoYXVkaW9fZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIExQQSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fbXAzLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX21wMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGEyZTRkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fbXAzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzg4ICswLDAgQEAKLS8qIG1wMyBhdWRpbyBvdXRwdXQgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9lYXJseXN1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLQotI2luY2x1ZGUgPG1hY2gvaW9tbXUuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11X2RvbWFpbnMuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBwbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcGxheWNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRwbGF5bXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2Rldl9jdGwuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkcHAuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fbWVtdHlwZXMuaD4KLQotI2RlZmluZSBBRFJWX1NUQVRVU19BSU9fSU5URiAweDAwMDAwMDAxCi0jZGVmaW5lIEFEUlZfU1RBVFVTX09CVUZfR0lWRU4gMHgwMDAwMDAwMgotI2RlZmluZSBBRFJWX1NUQVRVU19JQlVGX0dJVkVOIDB4MDAwMDAwMDQKLSNkZWZpbmUgQURSVl9TVEFUVVNfRlNZTkMgMHgwMDAwMDAwOAotCi0vKiBTaXplIG11c3QgYmUgcG93ZXIgb2YgMiAqLwotI2RlZmluZSBCVUZTWl9NQVggMzI3NjgKLSNkZWZpbmUgQlVGU1pfTUlOIDQwOTYKLSNkZWZpbmUgRE1BU1pfTUFYIChCVUZTWl9NQVggKiAyKQotI2RlZmluZSBETUFTWl9NSU4gKEJVRlNaX01JTiAqIDIpCi0KLSNkZWZpbmUgQVVEUExBWV9JTlZBTElEX1JFQURfUFRSX09GRlNFVAkweEZGRkYKLSNkZWZpbmUgQVVEREVDX0RFQ19NUDMgMgotCi0jZGVmaW5lIFBDTV9CVUZTWl9NSU4gNDgwMAkvKiBIb2xkIG9uZSBzdGVyZW8gTVAzIGZyYW1lICovCi0jZGVmaW5lIFBDTV9CVUZfTUFYX0NPVU5UIDUJLyogRFNQIG9ubHkgYWNjZXB0cyA1IGJ1ZmZlcnMgYXQgbW9zdAotCQkJCSAgIGJ1dCBzdXBwb3J0IDIgYnVmZmVycyBjdXJyZW50bHkgKi8KLSNkZWZpbmUgUk9VVElOR19NT0RFX0ZUUlQgMQotI2RlZmluZSBST1VUSU5HX01PREVfUlQgMgotLyogRGVjb2RlciBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBBVURQUFRBU0sgKi8KLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfU0xFRVAJMAotI2RlZmluZQkgQVVEUFBfREVDX1NUQVRVU19JTklUICAxCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX0NGRyAgIDIKLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfUExBWSAgMwotCi0jZGVmaW5lIEFVRE1QM19NRVRBRklFTERfTUFTSyAweEZGRkYwMDAwCi0jZGVmaW5lIEFVRE1QM19FT1NfRkxHX09GRlNFVCAweDBBIC8qIE9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBidWZmZXIgKi8KLSNkZWZpbmUgQVVETVAzX0VPU19GTEdfTUFTSyAweDAxCi0jZGVmaW5lIEFVRE1QM19FT1NfTk9ORSAweDAgLyogTm8gRU9TIGRldGVjdGVkICovCi0jZGVmaW5lIEFVRE1QM19FT1NfU0VUIDB4MSAvKiBFT1Mgc2V0IGluIG1ldGEgZmllbGQgKi8KLQotI2RlZmluZSBBVURNUDNfRVZFTlRfTlVNIDEwIC8qIERlZmF1bHQgbnVtYmVyIG9mIHByZS1hbGxvY2F0ZWQgZXZlbnQgcGFja2V0cyAqLwotCi0jZGVmaW5lIEJJVFNUUkVBTV9FUlJPUl9USFJFU0hPTERfVkFMVUUgMHgxIC8qIERFRkFVTFQgVEhSRVNIT0xEIFZBTFVFICovCi0KLSNkZWZpbmUgX19DT05UQUlOUyhyLCB2LCBsKSAoewkJCQkJXAotCXR5cGVvZihyKSBfX3IgPSByOwkJCQkJXAotCXR5cGVvZih2KSBfX3YgPSB2OwkJCQkJXAotCXR5cGVvZih2KSBfX2UgPSBfX3YgKyBsOwkJCQlcCi0JaW50IHJlcyA9ICgoX192ID49IF9fci0+dmFkZHIpICYmIAkJCVwKLQkJKF9fZSA8PSBfX3ItPnZhZGRyICsgX19yLT5sZW4pKTsJCVwKLQlyZXM7CQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgQ09OVEFJTlMocjEsIHIyKSAoewkJCQkJXAotCXR5cGVvZihyMikgX19yMiA9IHIyOwkJCQkJXAotCV9fQ09OVEFJTlMocjEsIF9fcjItPnZhZGRyLCBfX3IyLT5sZW4pOwkJCVwKLX0pCi0KLSNkZWZpbmUgSU5fUkFOR0UociwgdikgKHsJCQkJCVwKLQl0eXBlb2YocikgX19yID0gcjsJCQkJCVwKLQl0eXBlb2YodikgX192diA9IHY7CQkJCQlcCi0JaW50IHJlcyA9ICgoX192diA+PSBfX3ItPnZhZGRyKSAmJgkJCVwKLQkJKF9fdnYgPCAoX19yLT52YWRkciArIF9fci0+bGVuKSkpOwkJXAotCXJlczsJCQkJCQkJXAotfSkKLQotI2RlZmluZSBPVkVSTEFQUyhyMSwgcjIpICh7CQkJCQlcCi0JdHlwZW9mKHIxKSBfX3IxID0gcjE7CQkJCQlcCi0JdHlwZW9mKHIyKSBfX3IyID0gcjI7CQkJCQlcCi0JdHlwZW9mKF9fcjItPnZhZGRyKSBfX3YgPSBfX3IyLT52YWRkcjsJCQlcCi0JdHlwZW9mKF9fdikgX19lID0gX192ICsgX19yMi0+bGVuIC0gMTsJCQlcCi0JaW50IHJlcyA9IChJTl9SQU5HRShfX3IxLCBfX3YpIHx8IElOX1JBTkdFKF9fcjEsIF9fZSkpOwlcCi0JcmVzOwkJCQkJCQlcCi19KQotc3RydWN0IGF1ZGlvOwotCi1zdHJ1Y3QgYnVmZmVyIHsKLQl2b2lkICpkYXRhOwotCXVuc2lnbmVkIHNpemU7Ci0JdW5zaWduZWQgdXNlZDsJCS8qIElucHV0IHVzYWdlIGFjdHVhbCBEU1AgcHJvZHVjZWQgUENNIHNpemUgICovCi0JdW5zaWduZWQgYWRkcjsKLQl1bnNpZ25lZCBzaG9ydCBtZmllbGRfc3o7IC8qb25seSB1c2VmdWwgZm9yIGRhdGEgaGFzIG1ldGEgZmllbGQgKi8KLX07Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RydWN0IGF1ZG1wM19zdXNwZW5kX2N0bCB7Ci0gIHN0cnVjdCBlYXJseV9zdXNwZW5kIG5vZGU7Ci0gIHN0cnVjdCBhdWRpbyAqYXVkaW87Ci19OwotI2VuZGlmCi0KLXN0cnVjdCBhdWRtcDNfZXZlbnQgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlpbnQgZXZlbnRfdHlwZTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotfTsKLQotc3RydWN0IGF1ZG1wM19wbWVtX3JlZ2lvbiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBmaWxlICpmaWxlOwotCWludCBmZDsKLQl2b2lkICp2YWRkcjsKLQl1bnNpZ25lZCBsb25nIHBhZGRyOwotCXVuc2lnbmVkIGxvbmcga3ZhZGRyOwotCXVuc2lnbmVkIGxvbmcgbGVuOwotCXVuc2lnbmVkIHJlZl9jbnQ7Ci19OwotCi1zdHJ1Y3QgYXVkbXAzX2J1ZmZlcl9ub2RlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IG1zbV9hdWRpb19haW9fYnVmIGJ1ZjsKLQl1bnNpZ25lZCBsb25nIHBhZGRyOwotfTsKLQotc3RydWN0IGF1ZG1wM19kcnZfb3BlcmF0aW9ucyB7Ci0Jdm9pZCAoKnBjbV9idWZfdXBkYXRlKShzdHJ1Y3QgYXVkaW8gKiwgdWludDMyX3QgKik7Ci0Jdm9pZCAoKmJ1ZmZlcl9yZWZyZXNoKShzdHJ1Y3QgYXVkaW8gKik7Ci0Jdm9pZCAoKnNlbmRfZGF0YSkoc3RydWN0IGF1ZGlvICosIHVuc2lnbmVkKTsKLQl2b2lkICgqb3V0X2ZsdXNoKShzdHJ1Y3QgYXVkaW8gKik7Ci0Jdm9pZCAoKmluX2ZsdXNoKShzdHJ1Y3QgYXVkaW8gKik7Ci0JaW50ICgqZnN5bmMpKHN0cnVjdCBhdWRpbyAqKTsKLX07Ci0KLXN0cnVjdCBhdWRpbyB7Ci0Jc3RydWN0IGJ1ZmZlciBvdXRbMl07Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JdWludDhfdCBvdXRfaGVhZDsKLQl1aW50OF90IG91dF90YWlsOwotCXVpbnQ4X3Qgb3V0X25lZWRlZDsgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGRzcCBpcyB3YWl0aW5nIGZvciAqLwotCXVuc2lnbmVkIG91dF9kbWFfc3o7Ci0Jc3RydWN0IGxpc3RfaGVhZCBvdXRfcXVldWU7IC8qIHF1ZXVlIHRvIHJldGFpbiBvdXRwdXQgYnVmZmVycyAqLwotCWF0b21pY190IG91dF9ieXRlczsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtdXRleCB3cml0ZV9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlX3dhaXQ7Ci0KLQkvKiBIb3N0IFBDTSBzZWN0aW9uICovCi0Jc3RydWN0IGJ1ZmZlciBpbltQQ01fQlVGX01BWF9DT1VOVF07Ci0Jc3RydWN0IG11dGV4IHJlYWRfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkX3dhaXQ7CS8qIFdhaXQgcXVldWUgZm9yIHJlYWQgKi8KLQljaGFyICpyZWFkX2RhdGE7CS8qIHBvaW50ZXIgdG8gcmVhZGVyIGJ1ZmZlciAqLwotCWludDMyX3QgcmVhZF9waHlzOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHJlYWRlciBidWZmZXIgKi8KLQl1aW50OF90IHJlYWRfbmV4dDsJLyogaW5kZXggdG8gaW5wdXQgYnVmZmVycyB0byBiZSByZWFkIG5leHQgKi8KLQl1aW50OF90IGZpbGxfbmV4dDsJLyogaW5kZXggdG8gYnVmZmVyIHRoYXQgRFNQIHNob3VsZCBiZSBmaWxsaW5nICovCi0JdWludDhfdCBwY21fYnVmX2NvdW50OwkvKiBudW1iZXIgb2YgcGNtIGJ1ZmZlciBhbGxvY2F0ZWQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGluX3F1ZXVlOyAvKiBxdWV1ZSB0byByZXRhaW4gaW5wdXQgYnVmZmVycyAqLwotCS8qIC0tLS0gRW5kIG9mIEhvc3QgUENNIHNlY3Rpb24gKi8KLQotCXN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKmF1ZHBsYXk7Ci0KLQkvKiBjb25maWd1cmF0aW9uIHRvIHVzZSBvbiBuZXh0IGVuYWJsZSAqLwotCXVpbnQzMl90IG91dF9zYW1wbGVfcmF0ZTsKLQl1aW50MzJfdCBvdXRfY2hhbm5lbF9tb2RlOwotCi0JLyogZGF0YSBhbGxvY2F0ZWQgZm9yIHZhcmlvdXMgYnVmZmVycyAqLwotCWNoYXIgKmRhdGE7Ci0JaW50MzJfdCBwaHlzOyAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHdyaXRlIGJ1ZmZlciAqLwotCXZvaWQgKm1hcF92X3JlYWQ7Ci0Jdm9pZCAqbWFwX3Zfd3JpdGU7Ci0KLQl1aW50MzJfdCBkcnZfc3RhdHVzOwotCWludCBtZmllbGQ7IC8qIG1ldGEgZmllbGQgZW1iZWRkZWQgaW4gZGF0YSAqLwotCWludCByZmx1c2g7IC8qIFJlYWQgIGZsdXNoICovCi0JaW50IHdmbHVzaDsgLyogV3JpdGUgZmx1c2ggKi8KLQlpbnQgb3BlbmVkOwotCWludCBlbmFibGVkOwotCWludCBydW5uaW5nOwotCWludCBzdG9wcGVkOyAvKiBzZXQgd2hlbiBzdG9wcGVkLCBjbGVhcmVkIG9uIGZsdXNoICovCi0JaW50IHBjbV9mZWVkYmFjazsKLQlpbnQgYnVmX3JlZnJlc2g7Ci0JaW50IHRlb3M7IC8qIHZhbGlkIG9ubHkgaWYgdHVubmVsIG1vZGUgJiBubyBkYXRhIGxlZnQgZm9yIGRlY29kZXIgKi8KLQllbnVtIG1zbV9hdWRfZGVjb2Rlcl9zdGF0ZSBkZWNfc3RhdGU7CS8qIFJlcHJlc2VudHMgZGVjb2RlciBzdGF0ZSAqLwotCWludCByZXNlcnZlZDsgLyogQSBieXRlIGlzIGJlaW5nIHJlc2VydmVkICovCi0JY2hhciByc3ZfYnl0ZTsgLyogSGFuZGxlIG9kZCBsZW5ndGggdXNlciBkYXRhICovCi0KLQljb25zdCBjaGFyICptb2R1bGVfbmFtZTsKLQl1bnNpZ25lZCBxdWV1ZV9pZDsKLQl1aW50MTZfdCBkZWNfaWQ7Ci0JdWludDMyX3QgcmVhZF9wdHJfb2Zmc2V0OwotCWludDE2X3Qgc291cmNlOwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLQlzdHJ1Y3QgYXVkbXAzX3N1c3BlbmRfY3RsIHN1c3BlbmRfY3RsOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7Ci0jZW5kaWYKLQotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmcmVlX2V2ZW50X3F1ZXVlOwotCXN0cnVjdCBsaXN0X2hlYWQgZXZlbnRfcXVldWU7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgZXZlbnRfd2FpdDsKLQlzcGlubG9ja190IGV2ZW50X3F1ZXVlX2xvY2s7Ci0Jc3RydWN0IG11dGV4IGdldF9ldmVudF9sb2NrOwotCWludCBldmVudF9hYm9ydDsKLQkvKiBBViBzeW5jIEluZm8gKi8KLQlpbnQgYXZzeW5jX2ZsYWc7ICAgICAgICAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIGZlZWRiYWNrIGZyb20gRFNQICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgYXZzeW5jX3dhaXQ7LyogV2FpdCBxdWV1ZSBmb3IgQVYgU3luYyBNZXNzYWdlICAgICAqLwotCS8qIGZsYWdzLCA0OCBiaXRzIHNhbXBsZS9ieXRlcyBjb3VudGVyIHBlciBjaGFubmVsICovCi0JdWludDE2X3QgYXZzeW5jW0FVRFBQX0FWU1lOQ19DSF9DT1VOVCAqIEFVRFBQX0FWU1lOQ19OVU1fV09SRFMgKyAxXTsKLQotCXVpbnQzMl90IGRldmljZV9ldmVudHM7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkIHBtZW1fcmVnaW9uX3F1ZXVlOyAvKiBwcm90ZWN0ZWQgYnkgbG9jayAqLwotCXN0cnVjdCBhdWRtcDNfZHJ2X29wZXJhdGlvbnMgZHJ2X29wczsKLQotCXN0cnVjdCBtc21fYXVkaW9fYml0c3RyZWFtX2luZm8gc3RyZWFtX2luZm87Ci0Jc3RydWN0IG1zbV9hdWRpb19iaXRzdHJlYW1fZXJyb3JfaW5mbyBiaXRzdHJlYW1fZXJyb3JfaW5mbzsKLQl1aW50MzJfdCBiaXRzdHJlYW1fZXJyb3JfdGhyZXNob2xkX3ZhbHVlOwotCi0JaW50IGVxX2VuYWJsZTsKLQlpbnQgZXFfbmVlZHNfY29tbWl0OwotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfZXFhbGl6ZXIgZXE7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUgdm9sX3BhbjsKLX07Ci0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRwbGF5X3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpOwotc3RhdGljIHZvaWQgYXVkcGxheV9lcnJvcl90aHJlc2hvbGRfY29uZmlnKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcGxheV9jb25maWdfaG9zdHBjbShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZHBsYXlfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRpb19kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpOwotc3RhdGljIHZvaWQgYXVkbXAzX3Bvc3RfZXZlbnQoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHR5cGUsCi0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBhdWRtcDNfcG1lbV9maXh1cChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB2b2lkICphZGRyLAotCQkJCXVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgcmVmX3VwKTsKLQotc3RhdGljIHZvaWQgbXAzX2xpc3RuZXIodTMyIGV2dF9pZCwgdW5pb24gYXVkZGV2X2V2dF9kYXRhICpldnRfcGF5bG9hZCwKLQkJCXZvaWQgKnByaXZhdGVfZGF0YSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gKHN0cnVjdCBhdWRpbyAqKSBwcml2YXRlX2RhdGE7Ci0Jc3dpdGNoIChldnRfaWQpIHsKLQljYXNlIEFVRERFVl9FVlRfREVWX1JEWToKLQkJTU1fREJHKCI6QVVEREVWX0VWVF9ERVZfUkRZXG4iKTsKLQkJYXVkaW8tPnNvdXJjZSB8PSAoMHgxIDw8IGV2dF9wYXlsb2FkLT5yb3V0aW5nX2lkKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nID09IDEgJiYgYXVkaW8tPmVuYWJsZWQgPT0gMSkKLQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLCBhdWRpby0+c291cmNlKTsKLQotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfREVWX1JMUzoKLQkJTU1fREJHKCI6QVVEREVWX0VWVF9ERVZfUkxTXG4iKTsKLQkJYXVkaW8tPnNvdXJjZSAmPSB+KDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0JCWlmIChhdWRpby0+cnVubmluZyA9PSAxICYmIGF1ZGlvLT5lbmFibGVkID09IDEpCi0JCQlhdWRwcF9yb3V0ZV9zdHJlYW0oYXVkaW8tPmRlY19pZCwgYXVkaW8tPnNvdXJjZSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRzoKLQkJYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gZXZ0X3BheWxvYWQtPnNlc3Npb25fdm9sOwotCQlNTV9EQkcoIjpBVURERVZfRVZUX1NUUkVBTV9WT0xfQ0hHLCBzdHJlYW0gdm9sICVkXG4iLAotCQkJCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSk7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihhdWRpby0+ZGVjX2lkLCAmYXVkaW8tPnZvbF9wYW4sCi0JCQkJCVBPUFApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlNTV9FUlIoIjpFUlJPUjp3cm9uZyBldmVudFxuIik7Ci0JCWJyZWFrOwotCX0KLX0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRpb19lbmFibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCi0JaWYgKGF1ZGlvLT5lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWF1ZGlvLT5kZWNfc3RhdGUgPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORTsKLQlhdWRpby0+b3V0X3RhaWwgPSAwOwotCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQotCWlmIChtc21fYWRzcF9lbmFibGUoYXVkaW8tPmF1ZHBsYXkpKSB7Ci0JCU1NX0VSUigibXNtX2Fkc3BfZW5hYmxlKGF1ZHBsYXkpIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmIChhdWRwcF9lbmFibGUoYXVkaW8tPmRlY19pZCwgYXVkaW9fZHNwX2V2ZW50LCBhdWRpbykpIHsKLQkJTU1fRVJSKCJhdWRwcF9lbmFibGUoKSBmYWlsZWRcbiIpOwotCQltc21fYWRzcF9kaXNhYmxlKGF1ZGlvLT5hdWRwbGF5KTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JYXVkaW8tPmVuYWJsZWQgPSAxOwotCXJldHVybiAwOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkaW9fZGlzYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWludCByYyA9IDA7Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQlhdWRpby0+ZGVjX3N0YXRlID0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkU7Ci0JCWF1ZGRlY19kc3BfY29uZmlnKGF1ZGlvLCAwKTsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdCwKLQkJCQlhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoTVNNX0FVRF9ERUNPREVSX1dBSVRfTVMpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWVsc2UgaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX0NMT1NFKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlhdWRwcF9kaXNhYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvKTsKLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZHNwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgYXVkbXAzX2FzeW5jX3BjbV9idWZfdXBkYXRlKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVpbnQzMl90ICpwYXlsb2FkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgZXZlbnRfcGF5bG9hZDsKLQlzdHJ1Y3QgYXVkbXAzX2J1ZmZlcl9ub2RlICpmaWxsZWRfYnVmOwotCXVpbnQ4X3QgaW5kZXg7Ci0KLQlpZiAoYXVkaW8tPnJmbHVzaCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBheWxvYWRbMV07IGluZGV4KyspIHsKLQkJQlVHX09OKGxpc3RfZW1wdHkoJmF1ZGlvLT5pbl9xdWV1ZSkpOwotCQlmaWxsZWRfYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmluX3F1ZXVlLAotCQkJCQlzdHJ1Y3QgYXVkbXAzX2J1ZmZlcl9ub2RlLCBsaXN0KTsKLQkJaWYgKGZpbGxlZF9idWYtPnBhZGRyID09IHBheWxvYWRbMiArIGluZGV4ICogMl0pIHsKLQkJCWxpc3RfZGVsKCZmaWxsZWRfYnVmLT5saXN0KTsKLQkJCWV2ZW50X3BheWxvYWQuYWlvX2J1ZiA9IGZpbGxlZF9idWYtPmJ1ZjsKLQkJCWV2ZW50X3BheWxvYWQuYWlvX2J1Zi5kYXRhX2xlbiA9Ci0JCQkJcGF5bG9hZFszICsgaW5kZXggKiAyXTsKLQkJCU1NX0RCRygicGNtIGJ1ZiAlcCBkYXRhX2xlbiAlZFxuIiwgZmlsbGVkX2J1ZiwKLQkJCQkJZXZlbnRfcGF5bG9hZC5haW9fYnVmLmRhdGFfbGVuKTsKLQkJCWF1ZG1wM19wb3N0X2V2ZW50KGF1ZGlvLCBBVURJT19FVkVOVF9SRUFEX0RPTkUsCi0JCQkJCQlldmVudF9wYXlsb2FkKTsKLQkJCWtmcmVlKGZpbGxlZF9idWYpOwotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJleHBlY3RlZD0lbHggcmV0PSV4XG4iLCBmaWxsZWRfYnVmLT5wYWRkciwKLQkJCQkJcGF5bG9hZFsyICsgaW5kZXggKiAyXSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWF1ZGlvLT5kcnZfc3RhdHVzICY9IH5BRFJWX1NUQVRVU19JQlVGX0dJVkVOOwotCWF1ZGlvLT5kcnZfb3BzLmJ1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQotfQotCi1zdGF0aWMgdm9pZCBhdWRpb191cGRhdGVfcGNtX2J1Zl9lbnRyeShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1aW50MzJfdCAqcGF5bG9hZCkKLXsKLQl1aW50OF90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoYXVkaW8tPnJmbHVzaCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBheWxvYWRbMV07IGluZGV4KyspIHsKLQkJaWYgKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyID09Ci0JCSAgICBwYXlsb2FkWzIgKyBpbmRleCAqIDJdKSB7Ci0JCQlNTV9EQkcoImluWyVkXSByZWFkeVxuIiwgYXVkaW8tPmZpbGxfbmV4dCk7Ci0JCQlhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0udXNlZCA9Ci0JCQkgIHBheWxvYWRbMyArIGluZGV4ICogMl07Ci0JCQlpZiAoKCsrYXVkaW8tPmZpbGxfbmV4dCkgPT0gYXVkaW8tPnBjbV9idWZfY291bnQpCi0JCQkJYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0KLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiZXhwZWN0ZWQ9JXggcmV0PSV4XG4iLAotCQkJCQlhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uYWRkciwKLQkJCQkJcGF5bG9hZFsyICsgaW5kZXggKiAyXSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnVzZWQgPT0gMCkgewotCQlhdWRpby0+ZHJ2X29wcy5idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JfSBlbHNlIHsKLQkJTU1fREJHKCJyZWFkIGNhbm5vdCBrZWVwIHVwXG4iKTsKLQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMTsKLQl9Ci0Jd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0KLX0KLQotc3RhdGljIHZvaWQgYXVkbXAzX2JpdHN0cmVhbV9lcnJvcl9pbmZvKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVpbnQzMl90ICpwYXlsb2FkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgZV9wYXlsb2FkOwotCi0JaWYgKHBheWxvYWRbMF0gIT0gQVVEREVDX0RFQ19NUDMpIHsKLQkJTU1fRVJSKCJVbmV4cGVjdGVkIGJpdHN0cmVhbSBlcnJvciBpbmZvIGZyb20gRFNQOlwKLQkJCQlJbnZhbGlkIGRlY29kZXJcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZ2V0IHN0cmVhbSBpbmZvIGZyb20gRFNQIG1zZyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQotCWF1ZGlvLT5iaXRzdHJlYW1fZXJyb3JfaW5mby5kZWNfaWQgPSBwYXlsb2FkWzBdOwotCWF1ZGlvLT5iaXRzdHJlYW1fZXJyb3JfaW5mby5lcnJfbXNnX2luZGljYXRvciA9IHBheWxvYWRbMV07Ci0JYXVkaW8tPmJpdHN0cmVhbV9lcnJvcl9pbmZvLmVycl90eXBlID0gcGF5bG9hZFsyXTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCU1NX0VSUigiYml0X3N0cmVhbV9lcnJvcl90eXBlPSVkIGVycm9yX2NvdW50PSVkXG4iLAotCQkJYXVkaW8tPmJpdHN0cmVhbV9lcnJvcl9pbmZvLmVycl90eXBlLCAoMHgwMDAwRkZGRiAmCi0JCQlhdWRpby0+Yml0c3RyZWFtX2Vycm9yX2luZm8uZXJyX21zZ19pbmRpY2F0b3IpKTsKLQotCS8qIHNlbmQgZXZlbnQgdG8gQVJNIHRvIG5vdGlmeSBlcnJvciBpbmZvIGNvbWluZyAqLwotCWVfcGF5bG9hZC5lcnJvcl9pbmZvID0gYXVkaW8tPmJpdHN0cmVhbV9lcnJvcl9pbmZvOwotCWF1ZG1wM19wb3N0X2V2ZW50KGF1ZGlvLCBBVURJT19FVkVOVF9CSVRTVFJFQU1fRVJST1JfSU5GTywgZV9wYXlsb2FkKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkbXAzX3VwZGF0ZV9zdHJlYW1faW5mbyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1aW50MzJfdCAqcGF5bG9hZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIGVfcGF5bG9hZDsKLQotCS8qIGdldCBzdHJlYW0gaW5mbyBmcm9tIERTUCBtc2cgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0KLQlhdWRpby0+c3RyZWFtX2luZm8uY29kZWNfdHlwZSA9IEFVRElPX0NPREVDX1RZUEVfTVAzOwotCWF1ZGlvLT5zdHJlYW1faW5mby5jaGFuX2luZm8gPSAoMHgwMDAwRkZGRiAmIHBheWxvYWRbMV0pOwotCWF1ZGlvLT5zdHJlYW1faW5mby5zYW1wbGVfcmF0ZSA9ICgweDAwMDBGRkZGICYgcGF5bG9hZFsyXSk7Ci0JYXVkaW8tPnN0cmVhbV9pbmZvLmJpdF9zdHJlYW1faW5mbyA9ICgweDAwMDBGRkZGICYgcGF5bG9hZFszXSk7Ci0JYXVkaW8tPnN0cmVhbV9pbmZvLmJpdF9yYXRlID0gcGF5bG9hZFs0XTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCU1NX0RCRygiY2hhbl9pbmZvPSVkLCBzYW1wbGVfcmF0ZT0lZCwgYml0X3N0cmVhbV9pbmZvPSVkXG4iLAotCQkJYXVkaW8tPnN0cmVhbV9pbmZvLmNoYW5faW5mbywKLQkJCWF1ZGlvLT5zdHJlYW1faW5mby5zYW1wbGVfcmF0ZSwKLQkJCWF1ZGlvLT5zdHJlYW1faW5mby5iaXRfc3RyZWFtX2luZm8pOwotCi0JLyogc2VuZCBldmVudCB0byBBUk0gdG8gbm90aWZ5IHN0ZWFtIGluZm8gY29taW5nICovCi0JZV9wYXlsb2FkLnN0cmVhbV9pbmZvID0gYXVkaW8tPnN0cmVhbV9pbmZvOwotCWF1ZG1wM19wb3N0X2V2ZW50KGF1ZGlvLCBBVURJT19FVkVOVF9TVFJFQU1fSU5GTywgZV9wYXlsb2FkKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGxheV9kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgICB2b2lkICgqZ2V0ZXZlbnQpICh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBkYXRhOwotCXVpbnQzMl90IG1zZ1syOF07Ci0JZ2V0ZXZlbnQobXNnLCBzaXplb2YobXNnKSk7Ci0KLQlNTV9EQkcoIm1zZ19pZD0leFxuIiwgaWQpOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUExBWV9NU0dfREVDX05FRURTX0RBVEE6Ci0JCWF1ZGlvLT5kcnZfb3BzLnNlbmRfZGF0YShhdWRpbywgMSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURQTEFZX01TR19CVUZGRVJfVVBEQVRFOgotCQlhdWRpby0+ZHJ2X29wcy5wY21fYnVmX3VwZGF0ZShhdWRpbywgbXNnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBMQVlfVVBfU1RSRUFNX0lORk86Ci0JCWlmICgobXNnWzFdICYgQVVEUExBWV9TVFJFQU1fSU5GT19NU0dfTUFTSykgPT0KLQkJCQlBVURQTEFZX1NUUkVBTV9JTkZPX01TR19NQVNLKSB7Ci0JCQlhdWRtcDNfYml0c3RyZWFtX2Vycm9yX2luZm8oYXVkaW8sIG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlhdWRtcDNfdXBkYXRlX3N0cmVhbV9pbmZvKGF1ZGlvLCBtc2cpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURQTEFZX1VQX09VVFBPUlRfRkxVU0hfQUNLOgotCQlNTV9EQkcoIk9VVFBPUlRfRkxVU0hfQUNLXG4iKTsKLQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJCWF1ZGlvLT5kcnZfb3BzLmJ1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFEU1BfTUVTU0FHRV9JRDoKLQkJTU1fREJHKCJSZWNlaXZlZCBBRFNQIGV2ZW50OiBtb2R1bGUgZW5hYmxlKGF1ZHBsYXl0YXNrKVxuIik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJTU1fRVJSKCJ1bmV4cGVjdGVkIG1lc3NhZ2UgZnJvbSBkZWNvZGVyIFxuIik7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fZHNwX2V2ZW50KHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGlkLCB1aW50MTZfdCAqbXNnKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBwcml2YXRlOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUFBfTVNHX1NUQVRVU19NU0c6ewotCQkJdW5zaWduZWQgc3RhdHVzID0gbXNnWzFdOwotCi0JCQlzd2l0Y2ggKHN0YXR1cykgewotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX1NMRUVQOiB7Ci0JCQkJdWludDE2X3QgcmVhc29uID0gbXNnWzJdOwotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IHNsZWVwIHJlYXNvbj0weCUwNHhcbiIsCi0JCQkJCQlyZWFzb24pOwotCQkJCWlmICgocmVhc29uID09IEFVRFBQX01TR19SRUFTT05fTUVNKQotCQkJCQl8fCAocmVhc29uID09Ci0JCQkJCUFVRFBQX01TR19SRUFTT05fTk9ERUNPREVSKSkgewotCQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9GQUlMVVJFOwotCQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJfSBlbHNlIGlmIChyZWFzb24gPT0gQVVEUFBfTVNHX1JFQVNPTl9OT05FKSB7Ci0JCQkJCS8qIGRlY29kZXIgaXMgaW4gZGlzYWJsZSBzdGF0ZSAqLwotCQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19JTklUOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IGluaXQgXG4iKTsKLQkJCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJCQkJYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoYXVkaW8pOwotCQkJCWVsc2UKLQkJCQkJYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhhdWRpbyk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19DRkc6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogY2ZnIFxuIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfUExBWToKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBwbGF5IFxuIik7Ci0JCQkJLyogc2VuZCAgbWl4ZXIgY29tbWFuZCAqLwotCQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLAotCQkJCQkJYXVkaW8tPnNvdXJjZSk7Ci0JCQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJCQkJYXVkcGxheV9lcnJvcl90aHJlc2hvbGRfY29uZmlnKGF1ZGlvKTsKLQkJCQkJYXVkcGxheV9jb25maWdfaG9zdHBjbShhdWRpbyk7Ci0JCQkJCWF1ZGlvLT5kcnZfb3BzLmJ1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQkJCQl9Ci0JCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9TVUNDRVNTOwotCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJTU1fRVJSKCJ1bmtub3duIGRlY29kZXIgc3RhdHVzIFxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVEUFBfTVNHX0NGR19NU0c6Ci0JCWlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9FTkEpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBFTkFCTEVcbiIpOwotCQkJYXVkZGVjX2RzcF9jb25maWcoYXVkaW8sIDEpOwotCQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAxOwotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvLT5lcV9lbmFibGUsCi0JCQkJCSZhdWRpby0+ZXEsIFBPUFApOwotCQl9IGVsc2UgaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0RJUykgewotCQkJTU1fREJHKCJDRkdfTVNHIERJU0FCTEVcbiIpOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAwOwotCQl9IGVsc2UgewotCQkJTU1fREJHKCJDRkdfTVNHICVkP1xuIiwgbXNnWzBdKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRFBQX01TR19ST1VUSU5HX0FDSzoKLQkJTU1fREJHKCJST1VUSU5HX0FDSyBtb2RlPSVkXG4iLAltc2dbMV0pOwotCQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKGF1ZGlvKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBQX01TR19GTFVTSF9BQ0s6Ci0JCU1NX0RCRygiRkxVU0hfQUNLXG4iKTsKLQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQkJYXVkaW8tPmRydl9vcHMuYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCQlicmVhazsKLQotCWNhc2UgQVVEUFBfTVNHX1BDTURNQU1JU1NFRDoKLQkJTU1fREJHKCJQQ01ETUFNSVNTRURcbiIpOwotCQlhdWRpby0+dGVvcyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBQX01TR19BVlNZTkNfTVNHOgotCQlNTV9EQkcoIkFVRFBQX01TR19BVlNZTkNfTVNHXG4iKTsKLQkJbWVtY3B5KCZhdWRpby0+YXZzeW5jWzBdLCBtc2csIHNpemVvZihhdWRpby0+YXZzeW5jKSk7Ci0JCWF1ZGlvLT5hdnN5bmNfZmxhZyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT5hdnN5bmNfd2FpdCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJTU1fRVJSKCJVTktOT1dOICglZClcbiIsIGlkKTsKLQl9Ci0KLX0KLQotCi1zdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHBsYXlfYWRzcF9vcHMgPSB7Ci0JLmV2ZW50ID0gYXVkcGxheV9kc3BfZXZlbnQsCi19OwotCi0KLSNkZWZpbmUgYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcGxheSwgYXVkaW8tPnF1ZXVlX2lkLCBcCi0JCQljbWQsIGxlbikKLQotc3RhdGljIGludCBhdWRkZWNfZHNwX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2RlY190eXBlIGNmZ19kZWNfY21kOwotCi0JbWVtc2V0KCZjZmdfZGVjX2NtZCwgMCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci0KLQljZmdfZGVjX2NtZC5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX0RFQ19UWVBFOwotCWlmIChlbmFibGUpCi0JCWNmZ19kZWNfY21kLmRlY19jZmcgPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCQlBVURQUF9DTURfRU5BX0RFQ19WIHwgQVVEREVDX0RFQ19NUDM7Ci0JZWxzZQotCQljZmdfZGVjX2NtZC5kZWNfY2ZnID0gQVVEUFBfQ01EX1VQREFUREVfQ0ZHX0RFQyB8Ci0JCQkJQVVEUFBfQ01EX0RJU19ERUNfVjsKLQljZmdfZGVjX2NtZC5kbV9tb2RlID0gMHgwOwotCWNmZ19kZWNfY21kLnN0cmVhbV9pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUxKCZjZmdfZGVjX2NtZCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc19tcDMgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY29tbW9uLmNtZF9pZCA9IEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVM7Ci0JY21kLmNvbW1vbi5sZW5ndGggPSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TX01QM19MRU47Ci0JY21kLmNvbW1vbi5kZWNfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5jb21tb24uaW5wdXRfc2FtcGxpbmdfZnJlcXVlbmN5ID0gYXVkaW8tPm91dF9zYW1wbGVfcmF0ZTsKLQotCWF1ZHBwX3NlbmRfcXVldWUyKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX3JvdXRpbmdfbW9kZSBjbWQ7Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURQUF9DTURfUk9VVElOR19NT0RFOwotCWNtZC5vYmplY3RfbnVtYmVyID0gYXVkaW8tPmRlY19pZDsKLQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJY21kLnJvdXRpbmdfbW9kZSA9IFJPVVRJTkdfTU9ERV9GVFJUOwotCWVsc2UKLQkJY21kLnJvdXRpbmdfbW9kZSA9IFJPVVRJTkdfTU9ERV9SVDsKLQotCWF1ZHBwX3NlbmRfcXVldWUxKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJCQkJdW5zaWduZWQgaWR4LCB1bnNpZ25lZCBsZW4pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2JpdHN0cmVhbV9kYXRhX2F2YWlsX250MiBjbWQ7Ci0KLQljbWQuY21kX2lkCQk9IEFVRFBMQVlfQ01EX0JJVFNUUkVBTV9EQVRBX0FWQUlMX05UMjsKLQlpZiAoYXVkaW8tPm1maWVsZCkKLQkJY21kLmRlY29kZXJfaWQgPSBBVURNUDNfTUVUQUZJRUxEX01BU0sgfAotCQkJKGF1ZGlvLT5vdXRbaWR4XS5tZmllbGRfc3ogPj4gMSk7Ci0JZWxzZQotCQljbWQuZGVjb2Rlcl9pZAkJPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5idWZfcHRyCQk9IGF1ZGlvLT5vdXRbaWR4XS5hZGRyOwotCWNtZC5idWZfc2l6ZQkJPSBsZW4vMjsKLQljbWQucGFydGl0aW9uX251bWJlcgk9IDA7Ci0JcmV0dXJuIGF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLS8qIENhbGxlciBob2xkcyBpcnFfbG9jayAqLwotc3RhdGljIHZvaWQgYXVkbXAzX2FzeW5jX2J1ZmZlcl9yZWZyZXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2J1ZmZlcl9yZWZyZXNoIHJlZnJlc2hfY21kOwotCXN0cnVjdCBhdWRtcDNfYnVmZmVyX25vZGUgKm5leHRfYnVmOwotCi0JaWYgKCFhdWRpby0+cnVubmluZyB8fAotCSAgICBhdWRpby0+ZHJ2X3N0YXR1cyAmIEFEUlZfU1RBVFVTX0lCVUZfR0lWRU4pCi0JCXJldHVybjsKLQotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmluX3F1ZXVlKSkgewotCQluZXh0X2J1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5pbl9xdWV1ZSwKLQkJICAgIHN0cnVjdCBhdWRtcDNfYnVmZmVyX25vZGUsIGxpc3QpOwotCQlpZiAoIW5leHRfYnVmKQotCQkJcmV0dXJuOwotCQlNTV9EQkcoIm5leHQgYnVmICVwIHBoeSAlbHggbGVuICVkXG4iLCBuZXh0X2J1ZiwKLQkJCQluZXh0X2J1Zi0+cGFkZHIsIG5leHRfYnVmLT5idWYuYnVmX2xlbik7Ci0JCXJlZnJlc2hfY21kLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0JVRkZFUl9SRUZSRVNIOwotCQlyZWZyZXNoX2NtZC5udW1fYnVmZmVycyA9IDE7Ci0JCXJlZnJlc2hfY21kLmJ1ZjBfYWRkcmVzcyA9IG5leHRfYnVmLT5wYWRkcjsKLQkJcmVmcmVzaF9jbWQuYnVmMF9sZW5ndGggPSBuZXh0X2J1Zi0+YnVmLmJ1Zl9sZW4gLQotCQkJKG5leHRfYnVmLT5idWYuYnVmX2xlbiAlIDU3NikgKwotCQkJKGF1ZGlvLT5tZmllbGQgPyAyNCA6IDApOyAvKiBNcDMgZnJhbWUgc2l6ZSAqLwotCQlyZWZyZXNoX2NtZC5idWZfcmVhZF9jb3VudCA9IDA7Ci0JCWF1ZGlvLT5kcnZfc3RhdHVzIHw9IEFEUlZfU1RBVFVTX0lCVUZfR0lWRU47Ci0JCSh2b2lkKSBhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmcmVmcmVzaF9jbWQsCi0JCQlzaXplb2YocmVmcmVzaF9jbWQpKTsKLQl9Ci0KLX0KLQotc3RhdGljIHZvaWQgYXVkcGxheV9idWZmZXJfcmVmcmVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwbGF5X2NtZF9idWZmZXJfcmVmcmVzaCByZWZyZXNoX2NtZDsKLQotCXJlZnJlc2hfY21kLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0JVRkZFUl9SRUZSRVNIOwotCXJlZnJlc2hfY21kLm51bV9idWZmZXJzID0gMTsKLQlyZWZyZXNoX2NtZC5idWYwX2FkZHJlc3MgPSBhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uYWRkcjsKLQlyZWZyZXNoX2NtZC5idWYwX2xlbmd0aCA9IGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5zaXplIC0KLQkJKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5zaXplICUgNTc2KSArCi0JCShhdWRpby0+bWZpZWxkID8gMjQgOiAwKTsgLyogTXAzIGZyYW1lIHNpemUgKi8KLQlyZWZyZXNoX2NtZC5idWZfcmVhZF9jb3VudCA9IDA7Ci0JTU1fREJHKCJidWYwX2FkZHI9JXggYnVmMF9sZW49JWRcbiIsIHJlZnJlc2hfY21kLmJ1ZjBfYWRkcmVzcywKLQkJCXJlZnJlc2hfY21kLmJ1ZjBfbGVuZ3RoKTsKLQkodm9pZClhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmcmVmcmVzaF9jbWQsIHNpemVvZihyZWZyZXNoX2NtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwbGF5X2Vycm9yX3RocmVzaG9sZF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bmlvbiBhdWRwbGF5X2NtZF9jaGFubmVsX2luZm8gY2hfY2ZnX2NtZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JY2hfY2ZnX2NtZC50aHJfdXBkYXRlLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0NIQU5ORUxfSU5GTzsKLQljaF9jZmdfY21kLnRocl91cGRhdGUudGhyZXNob2xkX3VwZGF0ZSA9IEFVRFBMQVlfRVJST1JfVEhSRVNIT0xEX0VOQUJMRTsKLQljaF9jZmdfY21kLnRocl91cGRhdGUudGhyZXNob2xkX3ZhbHVlID0KLQkJYXVkaW8tPmJpdHN0cmVhbV9lcnJvcl90aHJlc2hvbGRfdmFsdWU7Ci0JKHZvaWQpYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJmNoX2NmZ19jbWQsIHNpemVvZihjaF9jZmdfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfY29uZmlnX2hvc3RwY20oc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfaHBjbV9idWZfY2ZnIGNmZ19jbWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWNmZ19jbWQuY21kX2lkID0gQVVEUExBWV9DTURfSFBDTV9CVUZfQ0ZHOwotCWNmZ19jbWQubWF4X2J1ZmZlcnMgPSAxOwotCWNmZ19jbWQuYnl0ZV9zd2FwID0gMDsKLQljZmdfY21kLmhvc3RwY21fY29uZmlnID0gKDB4ODAwMCkgfCAoMHg0MDAwKTsKLQljZmdfY21kLmZlZWRiYWNrX2ZyZXF1ZW5jeSA9IDE7Ci0JY2ZnX2NtZC5wYXJ0aXRpb25fbnVtYmVyID0gMDsKLQkodm9pZClhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY2ZnX2NtZCwgc2l6ZW9mKGNmZ19jbWQpKTsKLQotfQotCi1zdGF0aWMgdm9pZCBhdWRwbGF5X291dHBvcnRfZmx1c2goc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfb3V0cG9ydF9mbHVzaCBvcF9mbHVzaF9jbWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCW9wX2ZsdXNoX2NtZC5jbWRfaWQgPSBBVURQTEFZX0NNRF9PVVRQT1JUX0ZMVVNIOwotCSh2b2lkKWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZvcF9mbHVzaF9jbWQsIHNpemVvZihvcF9mbHVzaF9jbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkbXAzX2FzeW5jX3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWF1ZGlvLT5ydW5uaW5nKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAobmVlZGVkICYmICFhdWRpby0+d2ZsdXNoKSB7Ci0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMTsKLQkJaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfT0JVRl9HSVZFTikgewotCQkJLyogcG9wIG9uZSBub2RlIG91dCBvZiBxdWV1ZSAqLwotCQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQkJCXN0cnVjdCBhdWRtcDNfYnVmZmVyX25vZGUgKnVzZWRfYnVmOwotCi0JCQlNTV9EQkcoImNvbnN1bWVkXG4iKTsKLQkJCUJVR19PTihsaXN0X2VtcHR5KCZhdWRpby0+b3V0X3F1ZXVlKSk7Ci0JCQl1c2VkX2J1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5vdXRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZG1wM19idWZmZXJfbm9kZSwgbGlzdCk7Ci0JCQlsaXN0X2RlbCgmdXNlZF9idWYtPmxpc3QpOwotCQkJcGF5bG9hZC5haW9fYnVmID0gdXNlZF9idWYtPmJ1ZjsKLQkJCWF1ZG1wM19wb3N0X2V2ZW50KGF1ZGlvLCBBVURJT19FVkVOVF9XUklURV9ET05FLAotCQkJCXBheWxvYWQpOwotCQkJa2ZyZWUodXNlZF9idWYpOwotCQkJYXVkaW8tPmRydl9zdGF0dXMgJj0gfkFEUlZfU1RBVFVTX09CVUZfR0lWRU47Ci0JCX0KLQotCX0KLQotCWlmIChhdWRpby0+b3V0X25lZWRlZCkgewotCQlzdHJ1Y3QgYXVkbXAzX2J1ZmZlcl9ub2RlICpuZXh0X2J1ZjsKLQkJc3RydWN0IGF1ZHBsYXlfY21kX2JpdHN0cmVhbV9kYXRhX2F2YWlsX250MiBjbWQ7Ci0JCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPm91dF9xdWV1ZSkpIHsKLQkJCW5leHRfYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPm91dF9xdWV1ZSwKLQkJCQkJc3RydWN0IGF1ZG1wM19idWZmZXJfbm9kZSwgbGlzdCk7Ci0JCQlNTV9EQkcoIm5leHRfYnVmICVwXG4iLCBuZXh0X2J1Zik7Ci0JCQlpZiAobmV4dF9idWYpIHsKLQkJCQlNTV9EQkcoIm5leHQgYnVmIHBoeSAlbHggbGVuICVkXG4iLAotCQkJCQkJbmV4dF9idWYtPnBhZGRyLAotCQkJCQkJbmV4dF9idWYtPmJ1Zi5kYXRhX2xlbik7Ci0KLQkJCQljbWQuY21kX2lkID0KLQkJCQkJQVVEUExBWV9DTURfQklUU1RSRUFNX0RBVEFfQVZBSUxfTlQyOwotCQkJCWlmIChhdWRpby0+bWZpZWxkKQotCQkJCQljbWQuZGVjb2Rlcl9pZCA9IEFVRE1QM19NRVRBRklFTERfTUFTSyB8Ci0JCQkJCQkobmV4dF9idWYtPmJ1Zi5tZmllbGRfc3ogPj4gMSk7Ci0JCQkJZWxzZQotCQkJCQljbWQuZGVjb2Rlcl9pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JCQkJY21kLmJ1Zl9wdHIJPSAodW5zaWduZWQpIG5leHRfYnVmLT5wYWRkcjsKLQkJCQljbWQuYnVmX3NpemUgPSBuZXh0X2J1Zi0+YnVmLmRhdGFfbGVuID4+IDE7Ci0JCQkJY21kLnBhcnRpdGlvbl9udW1iZXIJPSAwOwotCQkJCWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLQkJCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCQkJYXVkaW8tPmRydl9zdGF0dXMgfD0gQURSVl9TVEFUVVNfT0JVRl9HSVZFTjsKLQkJCX0KLQkJfQotCX0KLQotZG9uZToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGxheV9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgbmVlZGVkKQotewotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhdWRpby0+cnVubmluZykKLQkJZ290byBkb25lOwotCi0JaWYgKG5lZWRlZCAmJiAhYXVkaW8tPndmbHVzaCkgewotCQkvKiBXZSB3ZXJlIGNhbGxlZCBmcm9tIHRoZSBjYWxsYmFjayBiZWNhdXNlIHRoZSBEU1AKLQkJICogcmVxdWVzdGVkIG1vcmUgZGF0YS4gIE5vdGUgdGhhdCB0aGUgRFNQIGRvZXMgd2FudAotCQkgKiBtb3JlIGRhdGEsIGFuZCBpZiBhIGJ1ZmZlciB3YXMgaW4tZmxpZ2h0LCBtYXJrIGl0Ci0JCSAqIGFzIGF2YWlsYWJsZSAoc2luY2UgdGhlIERTUCBtdXN0IG5vdyBiZSBkb25lIHdpdGgKLQkJICogaXQpLgotCQkgKi8KLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAxOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCWlmIChmcmFtZS0+dXNlZCA9PSAweGZmZmZmZmZmKSB7Ci0JCQlNTV9EQkcoImZyYW1lICVkIGZyZWVcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDA7Ci0JCQlhdWRpby0+b3V0X3RhaWwgXj0gMTsKLQkJCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJfQotCX0KLQotCWlmIChhdWRpby0+b3V0X25lZWRlZCkgewotCQkvKiBJZiB0aGUgRFNQIGN1cnJlbnRseSB3YW50cyBkYXRhIGFuZCB3ZSBoYXZlIGEKLQkJICogYnVmZmVyIGF2YWlsYWJsZSwgd2Ugd2lsbCBzZW5kIGl0IGFuZCByZXNldAotCQkgKiB0aGUgbmVlZGVkIGZsYWcuICBXZSdsbCBtYXJrIHRoZSBidWZmZXIgYXMgaW4tZmxpZ2h0Ci0JCSAqIHNvIHRoYXQgaXQgd29uJ3QgYmUgcmVjeWNsZWQgdW50aWwgdGhlIG5leHQgYnVmZmVyCi0JCSAqIGlzIHJlcXVlc3RlZAotCQkgKi8KLQotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCWlmIChmcmFtZS0+dXNlZCkgewotCQkJQlVHX09OKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpOwotCQkJTU1fREJHKCJmcmFtZSAlZCBidXN5XG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCQkJYXVkcGxheV9kc3Bfc2VuZF9kYXRhX2F2YWlsKGF1ZGlvLCBhdWRpby0+b3V0X3RhaWwsCi0JCQkJCWZyYW1lLT51c2VkKTsKLQkJCWZyYW1lLT51c2VkID0gMHhmZmZmZmZmZjsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJfQotCX0KLWRvbmU6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZGV2aWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgYXVkbXAzX2FzeW5jX2ZsdXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZG1wM19idWZmZXJfbm9kZSAqYnVmX25vZGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPm91dF9xdWV1ZSkgewotCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXVkbXAzX2J1ZmZlcl9ub2RlLCBsaXN0KTsKLQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKLQkJcGF5bG9hZC5haW9fYnVmID0gYnVmX25vZGUtPmJ1ZjsKLQkJYXVkbXAzX3Bvc3RfZXZlbnQoYXVkaW8sIEFVRElPX0VWRU5UX1dSSVRFX0RPTkUsCi0JCQkJcGF5bG9hZCk7Ci0JCWtmcmVlKGJ1Zl9ub2RlKTsKLQl9Ci0JYXVkaW8tPmRydl9zdGF0dXMgJj0gfkFEUlZfU1RBVFVTX09CVUZfR0lWRU47Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCWF0b21pY19zZXQoJmF1ZGlvLT5vdXRfYnl0ZXMsIDApOwotfQotCi1zdGF0aWMgdm9pZCBhdWRpb19mbHVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWF1ZGlvLT5vdXRbMF0udXNlZCA9IDA7Ci0JYXVkaW8tPm91dFsxXS51c2VkID0gMDsKLQlhdWRpby0+b3V0X2hlYWQgPSAwOwotCWF1ZGlvLT5vdXRfdGFpbCA9IDA7Ci0JYXVkaW8tPnJlc2VydmVkID0gMDsKLQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9ieXRlcywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZG1wM19hc3luY19mbHVzaF9wY21fYnVmKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZG1wM19idWZmZXJfbm9kZSAqYnVmX25vZGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmluX3F1ZXVlKSB7Ci0JCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhdWRtcDNfYnVmZmVyX25vZGUsIGxpc3QpOwotCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCQlwYXlsb2FkLmFpb19idWYgPSBidWZfbm9kZS0+YnVmOwotCQlwYXlsb2FkLmFpb19idWYuZGF0YV9sZW4gPSAwOwotCQlhdWRtcDNfcG9zdF9ldmVudChhdWRpbywgQVVESU9fRVZFTlRfUkVBRF9ET05FLAotCQkJCXBheWxvYWQpOwotCQlrZnJlZShidWZfbm9kZSk7Ci0JfQotCWF1ZGlvLT5kcnZfc3RhdHVzICY9IH5BRFJWX1NUQVRVU19JQlVGX0dJVkVOOwotCi19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2ZsdXNoX3BjbV9idWYoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1aW50OF90IGluZGV4OwotCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUENNX0JVRl9NQVhfQ09VTlQ7IGluZGV4KyspCi0JCWF1ZGlvLT5pbltpbmRleF0udXNlZCA9IDA7Ci0KLQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCWF1ZGlvLT5yZWFkX25leHQgPSAwOwotCWF1ZGlvLT5maWxsX25leHQgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBhdWRpb19pb3BvcnRfcmVzZXQoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19BSU9fSU5URikgewotCQkvKiBJZiBmc3luYyBpcyBpbiBwcm9ncmVzcywgbWFrZSBzdXJlCi0JCSAqIHJldHVybiB2YWx1ZSBvZiBmc3luYyBpbmRpY2F0ZXMKLQkJICogYWJvcnQgZHVlIHRvIGZsdXNoCi0JCSAqLwotCQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19GU1lOQykgewotCQkJTU1fREJHKCJmc3luYyBpbiBwcm9ncmVzc1xuIik7Ci0JCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JCQlhdWRpby0+ZHJ2X29wcy5vdXRfZmx1c2goYXVkaW8pOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JCX0gZWxzZQotCQkJYXVkaW8tPmRydl9vcHMub3V0X2ZsdXNoKGF1ZGlvKTsKLQkJYXVkaW8tPmRydl9vcHMuaW5fZmx1c2goYXVkaW8pOwotCX0gZWxzZSB7Ci0JCS8qIE1ha2Ugc3VyZSByZWFkL3dyaXRlIHRocmVhZCBhcmUgZnJlZSBmcm9tCi0JCSAqIHNsZWVwIGFuZCBrbm93aW5nIHRoYXQgc3lzdGVtIGlzIG5vdCBhYmxlCi0JCSAqIHRvIHByb2Nlc3MgaW8gcmVxdWVzdCBhdCB0aGUgbW9tZW50Ci0JCSAqLwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQkJYXVkaW8tPmRydl9vcHMub3V0X2ZsdXNoKGF1ZGlvKTsKLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQkJYXVkaW8tPmRydl9vcHMuaW5fZmx1c2goYXVkaW8pOwotCQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCX0KLQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAxOwotCXdha2VfdXAoJmF1ZGlvLT5hdnN5bmNfd2FpdCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkbXAzX2V2ZW50c19wZW5kaW5nKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZW1wdHk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQllbXB0eSA9ICFsaXN0X2VtcHR5KCZhdWRpby0+ZXZlbnRfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGVtcHR5IHx8IGF1ZGlvLT5ldmVudF9hYm9ydDsKLX0KLQotc3RhdGljIHZvaWQgYXVkbXAzX3Jlc2V0X2V2ZW50X3F1ZXVlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYXVkbXAzX2V2ZW50ICpkcnZfZXZ0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQlzdHJ1Y3QgYXVkbXAzX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCXN0cnVjdCBhdWRtcDNfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgbG9uZyBhdWRtcDNfcHJvY2Vzc19ldmVudF9yZXEoc3RydWN0IGF1ZGlvICphdWRpbywgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlsb25nIHJjOwotCXN0cnVjdCBtc21fYXVkaW9fZXZlbnQgdXNyX2V2dDsKLQlzdHJ1Y3QgYXVkbXAzX2V2ZW50ICpkcnZfZXZ0ID0gTlVMTDsKLQlpbnQgdGltZW91dDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ1c3JfZXZ0LCBhcmcsIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JdGltZW91dCA9IChpbnQpIHVzcl9ldnQudGltZW91dF9tczsKLQotCWlmICh0aW1lb3V0ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAotCQkJYXVkaW8tPmV2ZW50X3dhaXQsIGF1ZG1wM19ldmVudHNfcGVuZGluZyhhdWRpbyksCi0JCQltc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9IGVsc2UgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCWF1ZGlvLT5ldmVudF93YWl0LCBhdWRtcDNfZXZlbnRzX3BlbmRpbmcoYXVkaW8pKTsKLQl9Ci0KLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoYXVkaW8tPmV2ZW50X2Fib3J0KSB7Ci0JCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDA7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJjID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmV2ZW50X3F1ZXVlKSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmV2ZW50X3F1ZXVlLAotCQkJc3RydWN0IGF1ZG1wM19ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQl9Ci0JaWYgKGRydl9ldnQpIHsKLQkJdXNyX2V2dC5ldmVudF90eXBlID0gZHJ2X2V2dC0+ZXZlbnRfdHlwZTsKLQkJdXNyX2V2dC5ldmVudF9wYXlsb2FkID0gZHJ2X2V2dC0+cGF5bG9hZDsKLQkJbGlzdF9hZGRfdGFpbCgmZHJ2X2V2dC0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQl9IGVsc2UKLQkJcmMgPSAtMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGRydl9ldnQtPmV2ZW50X3R5cGUgPT0gQVVESU9fRVZFTlRfV1JJVEVfRE9ORSB8fAotCSAgICBkcnZfZXZ0LT5ldmVudF90eXBlID09IEFVRElPX0VWRU5UX1JFQURfRE9ORSkgewotCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JCWF1ZG1wM19wbWVtX2ZpeHVwKGF1ZGlvLCBkcnZfZXZ0LT5wYXlsb2FkLmFpb19idWYuYnVmX2FkZHIsCi0JCQkJICBkcnZfZXZ0LT5wYXlsb2FkLmFpb19idWYuYnVmX2xlbiwgMCk7Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCX0KLQlpZiAoIXJjICYmIGNvcHlfdG9fdXNlcihhcmcsICZ1c3JfZXZ0LCBzaXplb2YodXNyX2V2dCkpKQotCQlyYyA9IC1FRkFVTFQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkbXAzX3BtZW1fbG9va3VwX3ZhZGRyKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHZvaWQgKmFkZHIsCi0JCSAgICAgdW5zaWduZWQgbG9uZyBsZW4sIHN0cnVjdCBhdWRtcDNfcG1lbV9yZWdpb24gKipyZWdpb24pCi17Ci0Jc3RydWN0IGF1ZG1wM19wbWVtX3JlZ2lvbiAqcmVnaW9uX2VsdDsKLQotCWludCBtYXRjaF9jb3VudCA9IDA7Ci0KLQkqcmVnaW9uID0gTlVMTDsKLQotCS8qIHJldHVybnMgcGh5c2ljYWwgYWRkcmVzcyBvciB6ZXJvICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZWdpb25fZWx0LCAmYXVkaW8tPnBtZW1fcmVnaW9uX3F1ZXVlLAotCQlsaXN0KSB7Ci0JCWlmIChhZGRyID49IHJlZ2lvbl9lbHQtPnZhZGRyICYmCi0JCSAgICBhZGRyIDwgcmVnaW9uX2VsdC0+dmFkZHIgKyByZWdpb25fZWx0LT5sZW4gJiYKLQkJICAgIGFkZHIgKyBsZW4gPD0gcmVnaW9uX2VsdC0+dmFkZHIgKyByZWdpb25fZWx0LT5sZW4pIHsKLQkJCS8qIG9mZnNldCBzaW5jZSB3ZSBjb3VsZCBwYXNzIHZhZGRyIGluc2lkZSBhIHJlZ2lzdGVyZAotCQkJICogcG1lbSBidWZmZXIKLQkJCSAqLwotCi0JCQltYXRjaF9jb3VudCsrOwotCQkJaWYgKCEqcmVnaW9uKQotCQkJCSpyZWdpb24gPSByZWdpb25fZWx0OwotCQl9Ci0JfQotCi0JaWYgKG1hdGNoX2NvdW50ID4gMSkgewotCQlNTV9FUlIoIm11bHRpcGxlIGhpdHMgZm9yIHZhZGRyICVwLCBsZW4gJWxkXG4iLCBhZGRyLCBsZW4pOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZ2lvbl9lbHQsCi0JCSAgJmF1ZGlvLT5wbWVtX3JlZ2lvbl9xdWV1ZSwgbGlzdCkgewotCQkJaWYgKGFkZHIgPj0gcmVnaW9uX2VsdC0+dmFkZHIgJiYKLQkJCSAgICBhZGRyIDwgcmVnaW9uX2VsdC0+dmFkZHIgKyByZWdpb25fZWx0LT5sZW4gJiYKLQkJCSAgICBhZGRyICsgbGVuIDw9IHJlZ2lvbl9lbHQtPnZhZGRyICsgcmVnaW9uX2VsdC0+bGVuKQotCQkJCU1NX0VSUigiXHQlcCwgJWxkIC0tPiAlcFxuIiwgcmVnaW9uX2VsdC0+dmFkZHIsCi0JCQkJCQlyZWdpb25fZWx0LT5sZW4sCi0JCQkJCQkodm9pZCAqKXJlZ2lvbl9lbHQtPnBhZGRyKTsKLQkJfQotCX0KLQotCXJldHVybiAqcmVnaW9uID8gMCA6IC0xOwotfQotCi11bnNpZ25lZCBsb25nIGF1ZG1wM19wbWVtX2ZpeHVwKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHZvaWQgKmFkZHIsCi0JCSAgICB1bnNpZ25lZCBsb25nIGxlbiwgaW50IHJlZl91cCkKLXsKLQlzdHJ1Y3QgYXVkbXAzX3BtZW1fcmVnaW9uICpyZWdpb247Ci0JdW5zaWduZWQgbG9uZyBwYWRkcjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYXVkbXAzX3BtZW1fbG9va3VwX3ZhZGRyKGF1ZGlvLCBhZGRyLCBsZW4sICZyZWdpb24pOwotCWlmIChyZXQpIHsKLQkJTU1fRVJSKCJsb29rdXAgKCVwLCAlbGQpIGZhaWxlZFxuIiwgYWRkciwgbGVuKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChyZWZfdXApCi0JCXJlZ2lvbi0+cmVmX2NudCsrOwotCWVsc2UKLQkJcmVnaW9uLT5yZWZfY250LS07Ci0JTU1fREJHKCJmb3VuZCByZWdpb24gJXAgcmVmX2NudCAlZFxuIiwgcmVnaW9uLCByZWdpb24tPnJlZl9jbnQpOwotCXBhZGRyID0gcmVnaW9uLT5wYWRkciArIChhZGRyIC0gcmVnaW9uLT52YWRkcik7Ci0JcmV0dXJuIHBhZGRyOwotfQotCi0vKiBhdWRpbyAtPiBsb2NrIG11c3QgYmUgaGVsZCBhdCB0aGlzIHBvaW50ICovCi1zdGF0aWMgaW50IGF1ZG1wM19haW9fYnVmX2FkZChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBkaXIsCi0Jdm9pZCBfX3VzZXIgKmFyZykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBhdWRtcDNfYnVmZmVyX25vZGUgKmJ1Zl9ub2RlOwotCi0JYnVmX25vZGUgPSBrbWFsbG9jKHNpemVvZigqYnVmX25vZGUpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghYnVmX25vZGUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZidWZfbm9kZS0+YnVmLCBhcmcsIHNpemVvZihidWZfbm9kZS0+YnVmKSkpIHsKLQkJa2ZyZWUoYnVmX25vZGUpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlNTV9EQkcoIm5vZGUgJXAgZGlyICV4IGJ1Zl9hZGRyICVwIGJ1Zl9sZW4gJWQgZGF0YV9sZW4gXAotCQkJJWRcbiIsIGJ1Zl9ub2RlLCBkaXIsCi0JCQlidWZfbm9kZS0+YnVmLmJ1Zl9hZGRyLCBidWZfbm9kZS0+YnVmLmJ1Zl9sZW4sCi0JCQlidWZfbm9kZS0+YnVmLmRhdGFfbGVuKTsKLQotCWJ1Zl9ub2RlLT5wYWRkciA9IGF1ZG1wM19wbWVtX2ZpeHVwKAotCQlhdWRpbywgYnVmX25vZGUtPmJ1Zi5idWZfYWRkciwKLQkJYnVmX25vZGUtPmJ1Zi5idWZfbGVuLCAxKTsKLQotCWlmIChkaXIpIHsKLQkJLyogd3JpdGUgKi8KLQkJaWYgKCFidWZfbm9kZS0+cGFkZHIgfHwKLQkJICAgIChidWZfbm9kZS0+cGFkZHIgJiAweDEpIHx8Ci0JCSAgICAoYnVmX25vZGUtPmJ1Zi5kYXRhX2xlbiAmIDB4MSkgfHwKLQkJICAgICghYXVkaW8tPnBjbV9mZWVkYmFjayAmJgotCQkgICAgIWJ1Zl9ub2RlLT5idWYuZGF0YV9sZW4pKSB7Ci0JCQlrZnJlZShidWZfbm9kZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmYXVkaW8tPm91dF9xdWV1ZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+ZHJ2X29wcy5zZW5kX2RhdGEoYXVkaW8sIDApOwotCX0gZWxzZSB7Ci0JCS8qIHJlYWQgKi8KLQkJaWYgKCFidWZfbm9kZS0+cGFkZHIgfHwKLQkJICAgIChidWZfbm9kZS0+cGFkZHIgJiAweDEpIHx8Ci0JCSAgICAoYnVmX25vZGUtPmJ1Zi5idWZfbGVuIDwgUENNX0JVRlNaX01JTikpIHsKLQkJCWtmcmVlKGJ1Zl9ub2RlKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsICZhdWRpby0+aW5fcXVldWUpOwotCQlhdWRpby0+ZHJ2X29wcy5idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCX0KLQotCU1NX0RCRygiQWRkIGJ1Zl9ub2RlICVwIHBhZGRyICVseFxuIiwgYnVmX25vZGUsIGJ1Zl9ub2RlLT5wYWRkcik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19lbmFibGVfZXEoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlpZiAoYXVkaW8tPmVxX2VuYWJsZSA9PSBlbmFibGUgJiYgIWF1ZGlvLT5lcV9uZWVkc19jb21taXQpCi0JCXJldHVybiAwOwotCi0JYXVkaW8tPmVxX2VuYWJsZSA9IGVuYWJsZTsKLQotCWlmIChhdWRpby0+cnVubmluZykgewotCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsIGVuYWJsZSwgJmF1ZGlvLT5lcSwgUE9QUCk7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19nZXRfYXZzeW5jX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJCQkJCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgKnN0YXRzKQotewotCWludCByYyA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAoYXVkaW8tPmRlY19pZCA9PSBhdWRpby0+YXZzeW5jWzBdICYmIGF1ZGlvLT5hdnN5bmNfZmxhZykgewotCQkvKiBhdl9zeW5jIHNhbXBsZSBjb3VudCAqLwotCQlzdGF0cy0+c2FtcGxlX2NvdW50ID0gKGF1ZGlvLT5hdnN5bmNbMl0gPDwgMTYpIHwKLQkJCQkJCShhdWRpby0+YXZzeW5jWzNdKTsKLQotCQkvKiBhdl9zeW5jIGJ5dGVfY291bnQgKi8KLQkJc3RhdHMtPmJ5dGVfY291bnQgPSAoYXVkaW8tPmF2c3luY1s1XSA8PCAxNikgfAotCQkJCQkJKGF1ZGlvLT5hdnN5bmNbNl0pOwotCi0JCWF1ZGlvLT5hdnN5bmNfZmxhZyA9IDA7Ci0JCXJjID0gMDsKLQl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiByYzsKLQotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXVpbnQxNl90IGVuYWJsZV9tYXNrOwotCWludCBlbmFibGU7Ci0JaW50IHByZXZfc3RhdGU7Ci0KLQlNTV9EQkcoImNtZCA9ICVkXG4iLCBjbWQpOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfU1RBVFMpIHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyBzdGF0czsKLQotCQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAwOwotCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKLQkJaWYgKGF1ZHBwX3F1ZXJ5X2F2c3luYyhhdWRpby0+ZGVjX2lkKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+YXZzeW5jX3dhaXQsCi0JCQkJKGF1ZGlvLT5hdnN5bmNfZmxhZyA9PSAxKSwKLQkJCQltc2Vjc190b19qaWZmaWVzKEFVRFBQX0FWU1lOQ19FVkVOVF9USU1FT1VUKSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJZWxzZSBpZiAoKHJjID4gMCkgfHwgKChyYyA9PSAwKSAmJiAoYXVkaW8tPmF2c3luY19mbGFnID09IDEpKSkgewotCQkJaWYgKGF1ZGlvX2dldF9hdnN5bmNfZGF0YShhdWRpbywgJnN0YXRzKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0VOQUJMRV9BVURQUDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZlbmFibGVfbWFzaywgKHZvaWQgKikgYXJnLAotCQkJCQkJc2l6ZW9mKGVuYWJsZV9tYXNrKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQllbmFibGUgPSAoZW5hYmxlX21hc2sgJiBFUV9FTkFCTEUpID8gMSA6IDA7Ci0JCWF1ZGlvX2VuYWJsZV9lcShhdWRpbywgZW5hYmxlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfUEFOOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnBhbiA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfRVE6Ci0JCXByZXZfc3RhdGUgPSBhdWRpby0+ZXFfZW5hYmxlOwotCQlhdWRpby0+ZXFfZW5hYmxlID0gMDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhdWRpby0+ZXEubnVtX2JhbmRzLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGF1ZGlvLT5lcSkgLQotCQkJCShBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfQ09NTU9OX0xFTiArIDIpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPmVxX2VuYWJsZSA9IHByZXZfc3RhdGU7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAxOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCWlmICgtRUlOVkFMICE9IHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9FVkVOVCkgewotCQlNTV9EQkcoIiBBVURJT19HRVRfRVZFTlRcbiIpOwotCQlpZiAobXV0ZXhfdHJ5bG9jaygmYXVkaW8tPmdldF9ldmVudF9sb2NrKSkgewotCQkJcmMgPSBhdWRtcDNfcHJvY2Vzc19ldmVudF9yZXEoYXVkaW8sCi0JCQkJKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCQltdXRleF91bmxvY2soJmF1ZGlvLT5nZXRfZXZlbnRfbG9jayk7Ci0JCX0gZWxzZQotCQkJcmMgPSAtRUJVU1k7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlpZiAoY21kID09IEFVRElPX0FCT1JUX0dFVF9FVkVOVCkgewotCQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0JCXJldHVybiAwOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6Ci0JCU1NX0RCRygiQVVESU9fU1RBUlRcbiIpOwotCQlyYyA9IGF1ZGlvX2VuYWJsZShhdWRpbyk7Ci0JCWlmICghcmMpIHsKLQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXQsCi0JCQkJYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORSwKLQkJCQltc2Vjc190b19qaWZmaWVzKE1TTV9BVURfREVDT0RFUl9XQUlUX01TKSk7Ci0JCQlNTV9JTkZPKCJkZWNfc3RhdGUgJWQgcmMgPSAlZFxuIiwgYXVkaW8tPmRlY19zdGF0ZSwgcmMpOwotCi0JCQlpZiAoYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfU1VDQ0VTUykKLQkJCQlyYyA9IC1FTk9ERVY7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU1RPUDoKLQkJTU1fREJHKCJBVURJT19TVE9QXG4iKTsKLQkJcmMgPSBhdWRpb19kaXNhYmxlKGF1ZGlvKTsKLQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQlhdWRpb19pb3BvcnRfcmVzZXQoYXVkaW8pOwotCQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fRkxVU0g6Ci0JCU1NX0RCRygiQVVESU9fRkxVU0hcbiIpOwotCQlhdWRpby0+cmZsdXNoID0gMTsKLQkJYXVkaW8tPndmbHVzaCA9IDE7Ci0JCWF1ZGlvX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWlmIChhdWRpby0+cnVubmluZykgewotCQkJYXVkcHBfZmx1c2goYXVkaW8tPmRlY19pZCk7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkhYXVkaW8tPndmbHVzaCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJTU1fRVJSKCJBVURJT19GTFVTSCBpbnRlcnJ1cHRlZFxuIik7Ci0JCQkJcmMgPSAtRUlOVFI7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fT1VUUE9SVF9GTFVTSDoKLQkJTU1fREJHKCJBVURJT19PVVRQT1JUX0ZMVVNIXG4iKTsKLQkJYXVkaW8tPnJmbHVzaCA9IDE7Ci0JCWlmIChhdWRpby0+ZHJ2X3N0YXR1cyAmIEFEUlZfU1RBVFVTX0FJT19JTlRGKSB7Ci0JCQlhdWRpby0+ZHJ2X29wcy5pbl9mbHVzaChhdWRpbyk7Ci0JCX0gZWxzZSB7Ci0JCQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQkJCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCQkJYXVkaW8tPmRydl9vcHMuaW5fZmx1c2goYXVkaW8pOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQkJfQotCQlhdWRwbGF5X291dHBvcnRfZmx1c2goYXVkaW8pOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+cmVhZF93YWl0LAotCQkJCSFhdWRpby0+cmZsdXNoKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJTU1fRVJSKCJBVURQTEFZX09VVFBPUlRfRkxVU0ggaW50ZXJydXB0ZWRcbiIpOwotCQkJcmMgPSAtRUlOVFI7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb25maWcsICh2b2lkICopIGFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29uZmlnLmNoYW5uZWxfY291bnQgPT0gMSkgewotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSBBVURQUF9DTURfUENNX0lOVEZfTU9OT19WOwotCQl9IGVsc2UgaWYgKGNvbmZpZy5jaGFubmVsX2NvdW50ID09IDIpIHsKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gQVVEUFBfQ01EX1BDTV9JTlRGX1NURVJFT19WOwotCQl9IGVsc2UgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPm1maWVsZCA9IGNvbmZpZy5tZXRhX2ZpZWxkOwotCQlhdWRpby0+b3V0X3NhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotCQlhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9IGNvbmZpZy5jaGFubmVsX2NvdW50OwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQljb25maWcuYnVmZmVyX3NpemUgPSAoYXVkaW8tPm91dF9kbWFfc3ogPj4gMSk7Ci0JCWNvbmZpZy5idWZmZXJfY291bnQgPSAyOwotCQljb25maWcuc2FtcGxlX3JhdGUgPSBhdWRpby0+b3V0X3NhbXBsZV9yYXRlOwotCQlpZiAoYXVkaW8tPm91dF9jaGFubmVsX21vZGUgPT0gQVVEUFBfQ01EX1BDTV9JTlRGX01PTk9fVikKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gMTsKLQkJZWxzZQotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSAyOwotCQljb25maWcubWV0YV9maWVsZCA9IDA7Ci0JCWNvbmZpZy51bnVzZWRbMF0gPSAwOwotCQljb25maWcudW51c2VkWzFdID0gMDsKLQkJY29uZmlnLnVudXNlZFsyXSA9IDA7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmY29uZmlnLCBzaXplb2YoY29uZmlnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX1BDTV9DT05GSUc6ewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3BjbV9jb25maWcgY29uZmlnOwotCQljb25maWcucGNtX2ZlZWRiYWNrID0gYXVkaW8tPnBjbV9mZWVkYmFjazsKLQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfTUFYX0NPVU5UOwotCQljb25maWcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY29uZmlnLAotCQkJIHNpemVvZihjb25maWcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfUENNX0NPTkZJRzp7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX3BjbV9jb25maWcgY29uZmlnOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkgICAgKCZjb25maWcsICh2b2lkICopYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChjb25maWcucGNtX2ZlZWRiYWNrICE9IGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJCQlNTV9FUlIoIk5vdCBzdWZmaWNpZW50IHBlcm1pc3Npb24gdG8iCi0JCQkJCSAiY2hhbmdlIHRoZSBwbGF5YmFjayBtb2RlXG4iKTsKLQkJCQlyYyA9IC1FQUNDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19BSU9fSU5URikgewotCQkJCXJjID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKChjb25maWcuYnVmZmVyX2NvdW50ID4gUENNX0JVRl9NQVhfQ09VTlQpIHx8Ci0JCQkgICAgKGNvbmZpZy5idWZmZXJfY291bnQgPT0gMSkpCi0JCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfTUFYX0NPVU5UOwotCi0JCQlpZiAoY29uZmlnLmJ1ZmZlcl9zaXplIDwgUENNX0JVRlNaX01JTikKLQkJCQljb25maWcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCi0JCQkvKiBDaGVjayBpZiBwY20gZmVlZGJhY2sgaXMgcmVxdWlyZWQgKi8KLQkJCWlmICgoY29uZmlnLnBjbV9mZWVkYmFjaykgJiYgKCFhdWRpby0+cmVhZF9kYXRhKSkgewotCQkJCU1NX0RCRygiYWxsb2NhdGUgUENNIGJ1ZmZlciAlZFxuIiwKLQkJCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCAqCi0JCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSk7Ci0JCQkJYXVkaW8tPnJlYWRfcGh5cyA9Ci0JCQkJCWFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKAotCQkJCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSAqCi0JCQkJCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCwKLQkJCQkJCQlTWl80Syk7Ci0JCQkJaWYgKCFhdWRpby0+cmVhZF9waHlzKSB7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWF1ZGlvLT5tYXBfdl9yZWFkID0gaW9yZW1hcCgKLQkJCQkJCQlhdWRpby0+cmVhZF9waHlzLAotCQkJCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSAqCi0JCQkJCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCk7Ci0JCQkJaWYgKElTX0VSUihhdWRpby0+bWFwX3ZfcmVhZCkpIHsKLQkJCQkJTU1fRVJSKCJmYWlsZWQgdG8gbWFwIHJlYWQgYnVmZmVyIgotCQkJCQkJCSIgcGh5c2ljYWwgYWRkcmVzc1xuIik7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcigKLQkJCQkJCQlhdWRpby0+cmVhZF9waHlzKTsKLQkJCQl9IGVsc2UgewotCQkJCQl1aW50OF90IGluZGV4OwotCQkJCQl1aW50MzJfdCBvZmZzZXQgPSAwOwotCQkJCQlhdWRpby0+cmVhZF9kYXRhID0KLQkJCQkJCWF1ZGlvLT5tYXBfdl9yZWFkOwotCQkJCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCQkJCQlhdWRpby0+cGNtX2J1Zl9jb3VudCA9Ci0JCQkJCSAgICBjb25maWcuYnVmZmVyX2NvdW50OwotCQkJCQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQkJCQkJYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0KLQkJCQkJZm9yIChpbmRleCA9IDA7Ci0JCQkJCSAgICAgaW5kZXggPCBjb25maWcuYnVmZmVyX2NvdW50OwotCQkJCQkgICAgIGluZGV4KyspIHsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0uZGF0YSA9Ci0JCQkJCQkgICAgYXVkaW8tPnJlYWRfZGF0YSArIG9mZnNldDsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0uYWRkciA9Ci0JCQkJCQkgICAgYXVkaW8tPnJlYWRfcGh5cyArIG9mZnNldDsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0uc2l6ZSA9Ci0JCQkJCQkgICAgY29uZmlnLmJ1ZmZlcl9zaXplOwotCQkJCQkJYXVkaW8tPmluW2luZGV4XS51c2VkID0gMDsKLQkJCQkJCW9mZnNldCArPSBjb25maWcuYnVmZmVyX3NpemU7Ci0JCQkJCX0KLQkJCQkJcmMgPSAwOwotCQkJCQlNTV9EQkcoInJlYWQgYnVmOiBwaHkgYWRkciBcCi0JCQkJCQkweCUwOHgga2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQkJCQkJYXVkaW8tPnJlYWRfcGh5cywKLQkJCQkJCShpbnQpYXVkaW8tPnJlYWRfZGF0YSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyYyA9IDA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fUEFVU0U6Ci0JCU1NX0RCRygiQVVESU9fUEFVU0UgJWxkXG4iLCBhcmcpOwotCQlyYyA9IGF1ZHBwX3BhdXNlKGF1ZGlvLT5kZWNfaWQsIChpbnQpIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19HRVRfU1RSRUFNX0lORk86ewotCQlpZiAoYXVkaW8tPnN0cmVhbV9pbmZvLnNhbXBsZV9yYXRlID09IDApIHsKLQkJCS8qIGhhdmVuJ3QgcmVjZWl2ZWQgRFNQIHN0cmVhbSBldmVudCwKLQkJCXRoZSBzdHJlYW0gaW5mbyBpcyBub3QgdXBkYXRlZCAqLwotCQkJcmMgPSAtRVBFUk07Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYXVkaW8tPnN0cmVhbV9pbmZvLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYml0c3RyZWFtX2luZm8pKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQklUU1RSRUFNX0VSUk9SX0lORk86ewotCQlpZiAoKGF1ZGlvLT5iaXRzdHJlYW1fZXJyb3JfaW5mby5lcnJfbXNnX2luZGljYXRvciAmCi0JCQkJQVVEUExBWV9TVFJFQU1fSU5GT19NU0dfTUFTSykgPT0KLQkJCQlBVURQTEFZX1NUUkVBTV9JTkZPX01TR19NQVNLKSB7Ci0JCQkvKiBoYXZlbid0IHJlY2VpdmVkIGJpdHN0cmVhbSBlcnJvciBpbmZvIGV2ZW50LAotCQkJdGhlIGJpdHN0cmVhbSBlcnJvciBpbmZvIGlzIG5vdCB1cGRhdGVkICovCi0JCQlyYyA9IC1FUEVSTTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZhdWRpby0+Yml0c3RyZWFtX2Vycm9yX2luZm8sCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19iaXRzdHJlYW1fZXJyb3JfaW5mbykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgQVVESU9fQVNZTkNfV1JJVEU6Ci0JCWlmIChhdWRpby0+ZHJ2X3N0YXR1cyAmIEFEUlZfU1RBVFVTX0ZTWU5DKQotCQkJcmMgPSAtRUJVU1k7Ci0JCWVsc2UKLQkJCXJjID0gYXVkbXAzX2Fpb19idWZfYWRkKGF1ZGlvLCAxLCAodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX0FTWU5DX1JFQUQ6Ci0JCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQkJcmMgPSBhdWRtcDNfYWlvX2J1Zl9hZGQoYXVkaW8sIDAsICh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQllbHNlCi0JCQlyYyA9IC1FUEVSTTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19HRVRfU0VTU0lPTl9JRDoKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZhdWRpby0+ZGVjX2lkLAotCQkJCQlzaXplb2YodW5zaWduZWQgc2hvcnQpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9FUlJfVEhSRVNIT0xEX1ZBTFVFOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmF1ZGlvLT5iaXRzdHJlYW1fZXJyb3JfdGhyZXNob2xkX3ZhbHVlLAotCQkJCQkodm9pZCAqKWFyZywgc2l6ZW9mKHVpbnQzMl90KSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIE9ubHkgdXNlZnVsIGluIHR1bm5lbC1tb2RlICovCi1pbnQgYXVkbXAzX2FzeW5jX2ZzeW5jKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQkvKiBCbG9ja2luZyBjbGllbnQgc2VuZHMgbW9yZSBkYXRhICovCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGlvLT5kcnZfc3RhdHVzIHw9IEFEUlZfU1RBVFVTX0ZTWU5DOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCS8qIHBjbSBkbWFtaXNzIG1lc3NhZ2UgaXMgc2VudCBjb250aW5vdXNseQotCSAqIHdoZW4gZGVjb2RlciBpcyBzdGFydmVkIHNvIG5vIHJhY2UKLQkgKiBjb25kaXRpb24gY29uY2VybgotCSAqLwotCWF1ZGlvLT50ZW9zID0gMDsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoYXVkaW8tPnRlb3MgJiYgYXVkaW8tPm91dF9uZWVkZWQgJiYKLQkJbGlzdF9lbXB0eSgmYXVkaW8tPm91dF9xdWV1ZSkpCi0JCXx8IGF1ZGlvLT53Zmx1c2ggfHwgYXVkaW8tPnN0b3BwZWQpOwotCi0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpCi0JCXJjID0gLUVCVVNZOwotCi0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGlvLT5kcnZfc3RhdHVzICY9IH5BRFJWX1NUQVRVU19GU1lOQzsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQotCXJldHVybiByYzsKLX0KLQotaW50IGF1ZG1wM19zeW5jX2ZzeW5jKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKCFhdWRpby0+b3V0WzBdLnVzZWQgJiYKLQkJIWF1ZGlvLT5vdXRbMV0udXNlZCAmJgotCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChhdWRpby0+cmVzZXJ2ZWQpIHsKLQkJTU1fREJHKCJzZW5kIHJlc2VydmVkIGJ5dGVcbiIpOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMF0gPSBhdWRpby0+cnN2X2J5dGU7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMV0gPSAwOwotCQlmcmFtZS0+dXNlZCA9IDI7Ci0JCWF1ZGlvLT5kcnZfb3BzLnNlbmRfZGF0YShhdWRpbywgMCk7Ci0KLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkoIWF1ZGlvLT5vdXRbMF0udXNlZCAmJgotCQkJIWF1ZGlvLT5vdXRbMV0udXNlZCAmJgotCQkJYXVkaW8tPm91dF9uZWVkZWQpIHx8IGF1ZGlvLT53Zmx1c2gpOwotCi0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGRvbmU7Ci0JCWVsc2UgaWYgKGF1ZGlvLT53Zmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCi0JLyogcGNtIGRtYW1pc3MgbWVzc2FnZSBpcyBzZW50IGNvbnRpbm91c2x5Ci0JICogd2hlbiBkZWNvZGVyIGlzIHN0YXJ2ZWQgc28gbm8gcmFjZQotCSAqIGNvbmRpdGlvbiBjb25jZXJuCi0JICovCi0JYXVkaW8tPnRlb3MgPSAwOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCWF1ZGlvLT50ZW9zIHx8IGF1ZGlvLT53Zmx1c2gpOwotCi0JaWYgKGF1ZGlvLT53Zmx1c2gpCi0JCXJjID0gLUVCVVNZOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXJldHVybiByYzsKLX0KLQotaW50IGF1ZG1wM19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHBwb3MxLCBsb2ZmX3QgcHBvczIsIGludCBkYXRhc3luYykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKCFhdWRpby0+cnVubmluZyB8fCBhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiBhdWRpby0+ZHJ2X29wcy5mc3luYyhhdWRpbyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCSAgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0JaW50IHJjID0gMDsKLQotCWlmIChhdWRpby0+ZHJ2X3N0YXR1cyAmIEFEUlZfU1RBVFVTX0FJT19JTlRGKQotCQlyZXR1cm4gLUVQRVJNOwotCWVsc2UgaWYgKCFhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQlyZXR1cm4gMDsgLyogUENNIGZlZWRiYWNrIGRpc2FibGVkLiBOb3RoaW5nIHRvIHJlYWQgKi8KLQotCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCU1NX0RCRygiJWQgXG4iLAljb3VudCk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAotCQkJYXVkaW8tPnJlYWRfd2FpdCwKLQkJCShhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0uCi0JCQl1c2VkID4gMCkgfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQkJfHwgKGF1ZGlvLT5yZmx1c2gpLAotCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0JVRkZFUl9VUERBVEVfV0FJVF9NUykpOwotCi0JCWlmIChyYyA9PSAwKSB7Ci0JCQlyYyA9IC1FVElNRURPVVQ7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChyYyA8IDApCi0JCQlicmVhazsKLQotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPnJmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChjb3VudCA8IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkKSB7Ci0JCQkvKiBSZWFkIG11c3QgaGFwcGVuIGluIGZyYW1lIGJvdW5kYXJ5LiBTaW5jZQotCQkJICogZHJpdmVyIGRvZXMgbm90IGtub3cgZnJhbWUgc2l6ZSwgcmVhZCBjb3VudAotCQkJICogbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsCi0JCQkgKiB0byBzaXplIG9mIFBDTSBzYW1wbGVzCi0JCQkgKi8KLQkJCU1NX0RCRygibm8gcGFydGlhbCBmcmFtZSBkb25lIHJlYWRpbmdcbiIpOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9EQkcoInJlYWQgZnJvbSBpblslZF1cbiIsIGF1ZGlvLT5yZWFkX25leHQpOwotCi0JCQlpZiAoY29weV90b191c2VyCi0JCQkgICAgKGJ1ZiwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLmRhdGEsCi0JCQkgICAgIGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkKSkgewotCQkJCU1NX0VSUigiaW52YWxpZCBhZGRyICV4IFxuIiwgKHVuc2lnbmVkIGludClidWYpOwotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNvdW50IC09IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkOwotCQkJYnVmICs9IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkOwotCQkJYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQgPSAwOwotCQkJaWYgKCgrK2F1ZGlvLT5yZWFkX25leHQpID09IGF1ZGlvLT5wY21fYnVmX2NvdW50KQotCQkJCWF1ZGlvLT5yZWFkX25leHQgPSAwOwotCQkJYnJlYWs7CS8qIEZvcmNlIHRvIGV4aXQgd2hpbGUgbG9vcAotCQkJCSAqIHRvIHByZXZlbnQgb3V0cHV0IHRocmVhZAotCQkJCSAqIHNsZWVwIHRvbyBsb25nIGlmIGRhdGEgaXMKLQkJCQkgKiBub3QgcmVhZHkgYXQgdGhpcyBtb21lbnQuCi0JCQkJICovCi0JCX0KLQl9Ci0KLQkvKiBkb24ndCBmZWVkIG91dHB1dCBidWZmZXIgdG8gSFcgZGVjb2RlciBkdXJpbmcgZmx1c2hpbmcKLQkgKiBidWZmZXIgcmVmcmVzaCBjb21tYW5kIHdpbGwgYmUgc2VudCBvbmNlIGZsdXNoIGNvbXBsZXRlcwotCSAqIHNlbmQgYnVmIHJlZnJlc2ggY29tbWFuZCBoZXJlIGNhbiBjb25mdXNlIEhXIGRlY29kZXIKLQkgKi8KLQlpZiAoYXVkaW8tPmJ1Zl9yZWZyZXNoICYmICFhdWRpby0+cmZsdXNoKSB7Ci0JCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDA7Ci0JCU1NX0RCRygia2ljayBzdGFydCBwY20gZmVlZGJhY2sgYWdhaW5cbiIpOwotCQlhdWRpby0+ZHJ2X29wcy5idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQotCWlmIChidWYgPiBzdGFydCkKLQkJcmMgPSBidWYgLSBzdGFydDsKLQotCU1NX0RCRygicmVhZCAlZCBieXRlc1xuIiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRtcDNfcHJvY2Vzc19lb3Moc3RydWN0IGF1ZGlvICphdWRpbywKLQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1Zl9zdGFydCwgdW5zaWduZWQgc2hvcnQgbWZpZWxkX3NpemUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQljaGFyICpidWZfcHRyOwotCi0JaWYgKGF1ZGlvLT5yZXNlcnZlZCkgewotCQlNTV9EQkcoImZsdXNoIHJlc2VydmUgYnl0ZVxuIik7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQkJYnVmX3B0ciA9IGZyYW1lLT5kYXRhOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCShmcmFtZS0+dXNlZCA9PSAwKQotCQkJfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gZG9uZTsKLQkJaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJYnVmX3B0clswXSA9IGF1ZGlvLT5yc3ZfYnl0ZTsKLQkJYnVmX3B0clsxXSA9IDA7Ci0JCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCQlmcmFtZS0+bWZpZWxkX3N6ID0gMDsKLQkJZnJhbWUtPnVzZWQgPSAyOwotCQlhdWRpby0+cmVzZXJ2ZWQgPSAwOwotCQlhdWRpby0+ZHJ2X29wcy5zZW5kX2RhdGEoYXVkaW8sIDApOwotCX0KLQotCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoYXVkaW8tPm91dF9uZWVkZWQgJiYKLQkJYXVkaW8tPm91dFswXS51c2VkID09IDAgJiYKLQkJYXVkaW8tPm91dFsxXS51c2VkID09IDApCi0JCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcihmcmFtZS0+ZGF0YSwgYnVmX3N0YXJ0LCBtZmllbGRfc2l6ZSkpIHsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZnJhbWUtPm1maWVsZF9zeiA9IG1maWVsZF9zaXplOwotCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCWZyYW1lLT51c2VkID0gbWZpZWxkX3NpemU7Ci0JYXVkaW8tPmRydl9vcHMuc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRpb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0Jc2l6ZV90IHhmZXI7Ci0JY2hhciAqY3B5X3B0cjsKLQlpbnQgcmMgPSAwLCBlb3NfY29uZGl0aW9uID0gQVVETVAzX0VPU19OT05FOwotCXVuc2lnbmVkIGRzaXplOwotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplID0gMDsKLQotCWlmIChhdWRpby0+ZHJ2X3N0YXR1cyAmIEFEUlZfU1RBVFVTX0FJT19JTlRGKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JTU1fREJHKCJjbnQ9JWRcbiIsIGNvdW50KTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQkJY3B5X3B0ciA9IGZyYW1lLT5kYXRhOwotCQlkc2l6ZSA9IDA7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCQkgICAgICAoZnJhbWUtPnVzZWQgPT0gMCkKLQkJCQkJICAgICAgfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQkJCQkJICB8fCAoYXVkaW8tPndmbHVzaCkpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChhdWRpby0+bWZpZWxkKSB7Ci0JCQlpZiAoYnVmID09IHN0YXJ0KSB7Ci0JCQkJLyogUHJvY2Vzc2luZyBiZWdpbm5pbmcgb2YgdXNlciBidWZmZXIgKi8KLQkJCQlpZiAoX19nZXRfdXNlcihtZmllbGRfc2l6ZSwKLQkJCQkJKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSBidWYpKSB7Ci0JCQkJCXJjID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlICBpZiAobWZpZWxkX3NpemUgPiBjb3VudCkgewotCQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlNTV9EQkcoIm1mIG9mZnNldF92YWwgJXhcbiIsIG1maWVsZF9zaXplKTsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCBtZmllbGRfc2l6ZSkpIHsKLQkJCQkJcmMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyogQ2hlY2sgaWYgRU9TIGZsYWcgaXMgc2V0IGFuZCBidWZmZXIgaGFzCi0JCQkJICogY29udGFpbnMganVzdCBtZXRhIGZpZWxkCi0JCQkJICovCi0JCQkJaWYgKGNweV9wdHJbQVVETVAzX0VPU19GTEdfT0ZGU0VUXSAmCi0JCQkJCQkgQVVETVAzX0VPU19GTEdfTUFTSykgewotCQkJCQlNTV9EQkcoIkVPUyBTRVRcbiIpOwotCQkJCQllb3NfY29uZGl0aW9uID0gQVVETVAzX0VPU19TRVQ7Ci0JCQkJCWlmIChtZmllbGRfc2l6ZSA9PSBjb3VudCkgewotCQkJCQkJYnVmICs9IG1maWVsZF9zaXplOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZQotCQkJCQkJY3B5X3B0cltBVURNUDNfRU9TX0ZMR19PRkZTRVRdCi0JCQkJCQkJJj0gfkFVRE1QM19FT1NfRkxHX01BU0s7Ci0JCQkJfQotCQkJCWNweV9wdHIgKz0gbWZpZWxkX3NpemU7Ci0JCQkJY291bnQgLT0gbWZpZWxkX3NpemU7Ci0JCQkJZHNpemUgKz0gbWZpZWxkX3NpemU7Ci0JCQkJYnVmICs9IG1maWVsZF9zaXplOwotCQkJfSBlbHNlIHsKLQkJCQltZmllbGRfc2l6ZSA9IDA7Ci0JCQkJTU1fREJHKCJjb250aW51b3VzIGJ1ZmZlclxuIik7Ci0JCQl9Ci0JCQlmcmFtZS0+bWZpZWxkX3N6ID0gbWZpZWxkX3NpemU7Ci0JCX0KLQotCQlpZiAoYXVkaW8tPnJlc2VydmVkKSB7Ci0JCQlNTV9EQkcoImFwcGVuZCByZXNlcnZlZCBieXRlICV4XG4iLCBhdWRpby0+cnN2X2J5dGUpOwotCQkJKmNweV9wdHIgPSBhdWRpby0+cnN2X2J5dGU7Ci0JCQl4ZmVyID0gKGNvdW50ID4gKChmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSAtIDEpKSA/Ci0JCQkJKGZyYW1lLT5zaXplIC0gbWZpZWxkX3NpemUpIC0gMSA6IGNvdW50OwotCQkJY3B5X3B0cisrOwotCQkJZHNpemUgKz0gMTsKLQkJCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JCX0gZWxzZQotCQkJeGZlciA9IChjb3VudCA+IChmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSkgPwotCQkJCShmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSA6IGNvdW50OwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIHhmZXIpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWRzaXplICs9IHhmZXI7Ci0JCWlmIChkc2l6ZSAmIDEpIHsKLQkJCWF1ZGlvLT5yc3ZfYnl0ZSA9ICgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbZHNpemUgLSAxXTsKLQkJCU1NX0RCRygib2RkIGxlbmd0aCBidWYgcmVzZXJ2ZSBsYXN0IGJ5dGUgJXhcbiIsCi0JCQkJCWF1ZGlvLT5yc3ZfYnl0ZSk7Ci0JCQlhdWRpby0+cmVzZXJ2ZWQgPSAxOwotCQkJZHNpemUtLTsKLQkJfQotCQljb3VudCAtPSB4ZmVyOwotCQlidWYgKz0geGZlcjsKLQotCQlpZiAoZHNpemUgPiAwKSB7Ci0JCQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQkJCWZyYW1lLT51c2VkID0gZHNpemU7Ci0JCQlhdWRpby0+ZHJ2X29wcy5zZW5kX2RhdGEoYXVkaW8sIDApOwotCQl9Ci0JfQotCWlmIChlb3NfY29uZGl0aW9uID09IEFVRE1QM19FT1NfU0VUKQotCQlyYyA9IGF1ZG1wM19wcm9jZXNzX2VvcyhhdWRpbywgc3RhcnQsIG1maWVsZF9zaXplKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlpZiAoIXJjKSB7Ci0JCWlmIChidWYgPiBzdGFydCkKLQkJCXJldHVybiBidWYgLSBzdGFydDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCU1NX0lORk8oImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBmcmVlaW5nXG4iLCAoaW50KWF1ZGlvKTsKLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkZGV2X3VucmVnaXN0ZXJfZXZ0X2xpc3RuZXIoQVVEREVWX0NMTlRfREVDLCBhdWRpby0+ZGVjX2lkKTsKLQlhdWRpb19kaXNhYmxlKGF1ZGlvKTsKLQlhdWRpby0+ZHJ2X29wcy5vdXRfZmx1c2goYXVkaW8pOwotCWF1ZGlvLT5kcnZfb3BzLmluX2ZsdXNoKGF1ZGlvKTsKLQotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci0JYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0JdW5yZWdpc3Rlcl9lYXJseV9zdXNwZW5kKCZhdWRpby0+c3VzcGVuZF9jdGwubm9kZSk7Ci0jZW5kaWYKLQlhdWRpby0+b3BlbmVkID0gMDsKLQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAxOwotCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQlhdWRtcDNfcmVzZXRfZXZlbnRfcXVldWUoYXVkaW8pOwotCWlmIChhdWRpby0+ZGF0YSkgewotCQlpb3VubWFwKGF1ZGlvLT5tYXBfdl93cml0ZSk7Ci0JCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPnBoeXMpOwotCX0KLQlpZiAoYXVkaW8tPnJlYWRfZGF0YSkgewotCQlpb3VubWFwKGF1ZGlvLT5tYXBfdl9yZWFkKTsKLQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcihhdWRpby0+cmVhZF9waHlzKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JaWYgKGF1ZGlvLT5kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKGF1ZGlvLT5kZW50cnkpOwotI2VuZGlmCi0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhdWRtcDNfcG9zdF9ldmVudChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkKQotewotCXN0cnVjdCBhdWRtcDNfZXZlbnQgKmVfbm9kZSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSkpIHsKLQkJZV9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUsCi0JCQlzdHJ1Y3QgYXVkbXAzX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmVfbm9kZS0+bGlzdCk7Ci0JfSBlbHNlIHsKLQkJZV9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZG1wM19ldmVudCksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWVfbm9kZSkgewotCQkJTU1fRVJSKCJObyBtZW0gdG8gcG9zdCBldmVudCAlZFxuIiwgdHlwZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQllX25vZGUtPmV2ZW50X3R5cGUgPSB0eXBlOwotCWVfbm9kZS0+cGF5bG9hZCA9IHBheWxvYWQ7Ci0KLQlsaXN0X2FkZF90YWlsKCZlX25vZGUtPmxpc3QsICZhdWRpby0+ZXZlbnRfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotfQotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0YXRpYyB2b2lkIGF1ZG1wM19zdXNwZW5kKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRtcDNfc3VzcGVuZF9jdGwgKmN0bCA9Ci0JCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgYXVkbXAzX3N1c3BlbmRfY3RsLCBub2RlKTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlhdWRtcDNfcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9TVVNQRU5ELCBwYXlsb2FkKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkbXAzX3Jlc3VtZShzdHJ1Y3QgZWFybHlfc3VzcGVuZCAqaCkKLXsKLQlzdHJ1Y3QgYXVkbXAzX3N1c3BlbmRfY3RsICpjdGwgPQotCQljb250YWluZXJfb2YoaCwgc3RydWN0IGF1ZG1wM19zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkbXAzX3Bvc3RfZXZlbnQoY3RsLT5hdWRpbywgQVVESU9fRVZFTlRfUkVTVU1FLCBwYXlsb2FkKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgc3NpemVfdCBhdWRtcDNfZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRtcDNfZGVidWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY29uc3QgaW50IGRlYnVnX2J1Zm1heCA9IDQwOTY7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyWzQwOTZdOwotCWludCBuID0gMCwgaTsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCW4gPSBzY25wcmludGYoYnVmZmVyLCBkZWJ1Z19idWZtYXgsICJvcGVuZWQgJWRcbiIsIGF1ZGlvLT5vcGVuZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgImVuYWJsZWQgJWRcbiIsIGF1ZGlvLT5lbmFibGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJzdG9wcGVkICVkXG4iLCBhdWRpby0+c3RvcHBlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicGNtX2ZlZWRiYWNrICVkXG4iLCBhdWRpby0+cGNtX2ZlZWRiYWNrKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfYnVmX3N6ICVkXG4iLCBhdWRpby0+b3V0WzBdLnNpemUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInBjbV9idWZfY291bnQgJWQgXG4iLCBhdWRpby0+cGNtX2J1Zl9jb3VudCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicGNtX2J1Zl9zeiAlZCBcbiIsIGF1ZGlvLT5pblswXS5zaXplKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJ2b2x1bWUgJXggXG4iLCBhdWRpby0+dm9sX3Bhbi52b2x1bWUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInNhbXBsZSByYXRlICVkIFxuIiwgYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJImNoYW5uZWwgbW9kZSAlZCBcbiIsIGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkvKiBGb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBvbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHdoZW4KLQkgKiB3aGVuIHBsYXliYWNrIGhhbHRzIHVuZXhwZWN0ZWRseS4gVGh1cywgbm8gbXV0dWFsIGV4Y2x1c2lvbgotCSAqIGVuZm9yY2VkCi0JICovCi0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAid2ZsdXNoICVkXG4iLCBhdWRpby0+d2ZsdXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJyZmx1c2ggJWRcbiIsIGF1ZGlvLT5yZmx1c2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInJ1bm5pbmcgJWQgXG4iLCBhdWRpby0+cnVubmluZyk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkiZGVjIHN0YXRlICVkIFxuIiwgYXVkaW8tPmRlY19zdGF0ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0X25lZWRlZCAlZCBcbiIsIGF1ZGlvLT5vdXRfbmVlZGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfaGVhZCAlZCBcbiIsIGF1ZGlvLT5vdXRfaGVhZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0X3RhaWwgJWQgXG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dFswXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFswXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRbMV0udXNlZCAlZCBcbiIsIGF1ZGlvLT5vdXRbMV0udXNlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAiYnVmZmVyX3JlZnJlc2ggJWQgXG4iLCBhdWRpby0+YnVmX3JlZnJlc2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInJlYWRfbmV4dCAlZCBcbiIsIGF1ZGlvLT5yZWFkX25leHQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgImZpbGxfbmV4dCAlZCBcbiIsIGF1ZGlvLT5maWxsX25leHQpOwotCWZvciAoaSA9IDA7IGkgPCBhdWRpby0+cGNtX2J1Zl9jb3VudDsgaSsrKQotCQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJImluWyVkXS5zaXplICVkIFxuIiwgaSwgYXVkaW8tPmluW2ldLnVzZWQpOwotCWJ1ZmZlcltuXSA9IDA7Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGJ1ZmZlciwgbik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZG1wM19kZWJ1Z19mb3BzID0gewotCS5yZWFkID0gYXVkbXAzX2RlYnVnX3JlYWQsCi0JLm9wZW4gPSBhdWRtcDNfZGVidWdfb3BlbiwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBhdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCi0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IE5VTEw7Ci0JaW50IHJjLCBpLCBkZWNfYXR0cmIsIGRlY2lkOwotCXN0cnVjdCBhdWRtcDNfZXZlbnQgKmVfbm9kZSA9IE5VTEw7Ci0JdW5zaWduZWQgcG1lbV9zeiA9IERNQVNaX01BWDsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9tcDNfIiArIDVdOwotI2VuZGlmCi0KLQkvKiBBbGxvY2F0ZSBhdWRpbyBpbnN0YW5jZSwgc2V0IHRvIHplcm8gKi8KLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpbyksIEdGUF9LRVJORUwpOwotCWlmICghYXVkaW8pIHsKLQkJTU1fRVJSKCJubyBtZW1vcnkgdG8gYWxsb2NhdGUgYXVkaW8gaW5zdGFuY2UgXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCU1NX0lORk8oImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBjcmVhdGVkXG4iLCAoaW50KWF1ZGlvKTsKLQotCS8qIEFsbG9jYXRlIHRoZSBkZWNvZGVyICovCi0JZGVjX2F0dHJiID0gQVVEREVDX0RFQ19NUDM7Ci0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlkZWNfYXR0cmIgfD0gTVNNX0FVRF9NT0RFX05PTlRVTk5FTDsKLQkJYXVkaW8tPnBjbV9mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERV9QTEFZQkFDSzsKLQl9IGVsc2UgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCSEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9UVU5ORUw7Ci0JCWF1ZGlvLT5wY21fZmVlZGJhY2sgPSBUVU5ORUxfTU9ERV9QTEFZQkFDSzsKLQl9IGVsc2UgewotCQlrZnJlZShhdWRpbyk7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBkb25lOwotCX0KLQotCWRlY2lkID0gYXVkcHBfYWRlY19hbGxvYyhkZWNfYXR0cmIsICZhdWRpby0+bW9kdWxlX25hbWUsCi0JCQkmYXVkaW8tPnF1ZXVlX2lkKTsKLQlpZiAoZGVjaWQgPCAwKSB7Ci0JCU1NX0VSUigiTm8gZnJlZSBkZWNvZGVyIGF2YWlsYWJsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJKGludClhdWRpbyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJa2ZyZWUoYXVkaW8pOwotCQlnb3RvIGRvbmU7Ci0JfQotCWF1ZGlvLT5kZWNfaWQgPSBkZWNpZCAmIE1TTV9BVURfREVDT0RFUl9NQVNLOwotCi0JLyogQUlPIGludGVyZmFjZSAqLwotCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQlNTV9EQkcoInNldCB0byBhaW8gaW50ZXJmYWNlXG4iKTsKLQkJYXVkaW8tPmRydl9zdGF0dXMgfD0gQURSVl9TVEFUVVNfQUlPX0lOVEY7Ci0JCWF1ZGlvLT5kcnZfb3BzLnBjbV9idWZfdXBkYXRlID0gYXVkbXAzX2FzeW5jX3BjbV9idWZfdXBkYXRlOwotCQlhdWRpby0+ZHJ2X29wcy5idWZmZXJfcmVmcmVzaCA9IGF1ZG1wM19hc3luY19idWZmZXJfcmVmcmVzaDsKLQkJYXVkaW8tPmRydl9vcHMuc2VuZF9kYXRhID0gYXVkbXAzX2FzeW5jX3NlbmRfZGF0YTsKLQkJYXVkaW8tPmRydl9vcHMub3V0X2ZsdXNoID0gYXVkbXAzX2FzeW5jX2ZsdXNoOwotCQlhdWRpby0+ZHJ2X29wcy5pbl9mbHVzaCA9IGF1ZG1wM19hc3luY19mbHVzaF9wY21fYnVmOwotCQlhdWRpby0+ZHJ2X29wcy5mc3luYyA9IGF1ZG1wM19hc3luY19mc3luYzsKLQl9IGVsc2UgewotCQlNTV9EQkcoInNldCB0byBzdGQgaW8gaW50ZXJmYWNlXG4iKTsKLQkJd2hpbGUgKHBtZW1fc3ogPj0gRE1BU1pfTUlOKSB7Ci0JCQlNTV9EQkcoInBtZW1zeiA9ICVkXG4iLCBwbWVtX3N6KTsKLQkJCWF1ZGlvLT5waHlzID0gYWxsb2NhdGVfY29udGlndW91c19lYmlfbm9tYXAocG1lbV9zeiwKLQkJCQkJCQkJCVNaXzRLKTsKLQkJCWlmIChhdWRpby0+cGh5cykgewotCQkJCWF1ZGlvLT5tYXBfdl93cml0ZSA9IGlvcmVtYXAoCi0JCQkJCQkJYXVkaW8tPnBoeXMsIHBtZW1fc3opOwotCQkJCWlmIChJU19FUlIoYXVkaW8tPm1hcF92X3dyaXRlKSkgewotCQkJCQlNTV9FUlIoImZhaWxlZCB0byBtYXAgd3JpdGUgcGh5c2ljYWwiCi0JCQkJCQkiIGFkZHJlc3MgLCBmcmVlaW5nIGluc3RhbmNlIgotCQkJCQkJIjB4JTA4eFxuIiwgKGludClhdWRpbyk7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcigKLQkJCQkJCQkJYXVkaW8tPnBoeXMpOwotCQkJCQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0JCQkJCWtmcmVlKGF1ZGlvKTsKLQkJCQkJZ290byBkb25lOwotCQkJCX0KLQkJCQlhdWRpby0+ZGF0YSA9IGF1ZGlvLT5tYXBfdl93cml0ZTsKLQkJCQlNTV9EQkcoIndyaXRlIGJ1ZjogcGh5IGFkZHIgMHglMDh4IGtlcm5lbCBhZGRyXAotCQkJCQkweCUwOHhcbiIsIGF1ZGlvLT5waHlzLFwKLQkJCQkJKGludClhdWRpby0+ZGF0YSk7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHBtZW1fc3ogPT0gRE1BU1pfTUlOKSB7Ci0JCQkJTU1fRVJSKCJjb3VsZCBub3QgYWxsb2NhdGUgd3JpdGUgYnVmZmVycywgXAotCQkJCQkJZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJCQkoaW50KWF1ZGlvKTsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotCQkJCWtmcmVlKGF1ZGlvKTsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9IGVsc2UKLQkJCQlwbWVtX3N6ID4+PSAxOwotCQl9Ci0JCWF1ZGlvLT5vdXRfZG1hX3N6ID0gcG1lbV9zejsKLQkJYXVkaW8tPmRydl9vcHMucGNtX2J1Zl91cGRhdGUgPSBhdWRpb191cGRhdGVfcGNtX2J1Zl9lbnRyeTsKLQkJYXVkaW8tPmRydl9vcHMuYnVmZmVyX3JlZnJlc2ggPSBhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoOwotCQlhdWRpby0+ZHJ2X29wcy5zZW5kX2RhdGEgPSBhdWRwbGF5X3NlbmRfZGF0YTsKLQkJYXVkaW8tPmRydl9vcHMub3V0X2ZsdXNoID0gYXVkaW9fZmx1c2g7Ci0JCWF1ZGlvLT5kcnZfb3BzLmluX2ZsdXNoID0gYXVkaW9fZmx1c2hfcGNtX2J1ZjsKLQkJYXVkaW8tPmRydl9vcHMuZnN5bmMgPSBhdWRtcDNfc3luY19mc3luYzsKLQkJYXVkaW8tPm91dFswXS5kYXRhID0gYXVkaW8tPmRhdGEgKyAwOwotCQlhdWRpby0+b3V0WzBdLmFkZHIgPSBhdWRpby0+cGh5cyArIDA7Ci0JCWF1ZGlvLT5vdXRbMF0uc2l6ZSA9IChhdWRpby0+b3V0X2RtYV9zeiA+PiAxKTsKLQotCQlhdWRpby0+b3V0WzFdLmRhdGEgPSBhdWRpby0+ZGF0YSArIGF1ZGlvLT5vdXRbMF0uc2l6ZTsKLQkJYXVkaW8tPm91dFsxXS5hZGRyID0gYXVkaW8tPnBoeXMgKyBhdWRpby0+b3V0WzBdLnNpemU7Ci0JCWF1ZGlvLT5vdXRbMV0uc2l6ZSA9IGF1ZGlvLT5vdXRbMF0uc2l6ZTsKLQl9Ci0KLQlyYyA9IG1zbV9hZHNwX2dldChhdWRpby0+bW9kdWxlX25hbWUsICZhdWRpby0+YXVkcGxheSwKLQkJJmF1ZHBsYXlfYWRzcF9vcHMsIGF1ZGlvKTsKLQotCWlmIChyYykgewotCQlNTV9FUlIoImZhaWxlZCB0byBnZXQgJXMgbW9kdWxlIGZyZWVpbmcgaW5zdGFuY2UgMHglMDh4XG4iLAotCQkJCWF1ZGlvLT5tb2R1bGVfbmFtZSwgKGludClhdWRpbyk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIEluaXRpYWxpemUgYWxsIGxvY2tzIG9mIGF1ZGlvIGluc3RhbmNlICovCi0JbXV0ZXhfaW5pdCgmYXVkaW8tPmxvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+cmVhZF9sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZHNwX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+cmVhZF93YWl0KTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPm91dF9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5pbl9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5wbWVtX3JlZ2lvbl9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPmF2c3luY193YWl0KTsKLQotCWF1ZGlvLT5vdXRfc2FtcGxlX3JhdGUgPSA0NDEwMDsKLQlhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9IEFVRFBQX0NNRF9QQ01fSU5URl9TVEVSRU9fVjsKLQlhdWRpby0+dm9sX3Bhbi52b2x1bWUgPSAweDIwMDA7Ci0JYXVkaW8tPmJpdHN0cmVhbV9lcnJvcl90aHJlc2hvbGRfdmFsdWUgPQotCQlCSVRTVFJFQU1fRVJST1JfVEhSRVNIT0xEX1ZBTFVFOwotCi0JYXVkaW8tPmRydl9vcHMub3V0X2ZsdXNoKGF1ZGlvKTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOwotCWF1ZGlvLT5vcGVuZWQgPSAxOwotCi0JYXVkaW8tPmRldmljZV9ldmVudHMgPSBBVURERVZfRVZUX0RFVl9SRFkKLQkJCQl8QVVEREVWX0VWVF9ERVZfUkxTIHwKLQkJCQlBVURERVZfRVZUX1NUUkVBTV9WT0xfQ0hHOwotCi0JcmMgPSBhdWRkZXZfcmVnaXN0ZXJfZXZ0X2xpc3RuZXIoYXVkaW8tPmRldmljZV9ldmVudHMsCi0JCQkJCUFVRERFVl9DTE5UX0RFQywKLQkJCQkJYXVkaW8tPmRlY19pZCwKLQkJCQkJbXAzX2xpc3RuZXIsCi0JCQkJCSh2b2lkICopYXVkaW8pOwotCWlmIChyYykgewotCQlNTV9FUlIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgbGlzdG5lclxuIiwgX19mdW5jX18pOwotCQlnb3RvIGV2ZW50X2VycjsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlzbnByaW50ZihuYW1lLCBzaXplb2YgbmFtZSwgIm1zbV9tcDNfJTA0eCIsIGF1ZGlvLT5kZWNfaWQpOwotCWF1ZGlvLT5kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJTlVMTCwgKHZvaWQgKikgYXVkaW8sICZhdWRtcDNfZGVidWdfZm9wcyk7Ci0KLQlpZiAoSVNfRVJSKGF1ZGlvLT5kZW50cnkpKQotCQlNTV9EQkcoImRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUubGV2ZWwgPSBFQVJMWV9TVVNQRU5EX0xFVkVMX0RJU0FCTEVfRkI7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUucmVzdW1lID0gYXVkbXAzX3Jlc3VtZTsKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5zdXNwZW5kID0gYXVkbXAzX3N1c3BlbmQ7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLmF1ZGlvID0gYXVkaW87Ci0JcmVnaXN0ZXJfZWFybHlfc3VzcGVuZCgmYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUpOwotI2VuZGlmCi0JZm9yIChpID0gMDsgaSA8IEFVRE1QM19FVkVOVF9OVU07IGkrKykgewotCQllX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkbXAzX2V2ZW50KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChlX25vZGUpCi0JCQlsaXN0X2FkZF90YWlsKCZlX25vZGUtPmxpc3QsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JCWVsc2UgewotCQkJTU1fRVJSKCJldmVudCBwa3QgYWxsb2MgZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCW1lbXNldCgmYXVkaW8tPnN0cmVhbV9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19iaXRzdHJlYW1faW5mbykpOwotCW1lbXNldCgmYXVkaW8tPmJpdHN0cmVhbV9lcnJvcl9pbmZvLCAwLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYml0c3RyZWFtX2luZm8pKTsKLWRvbmU6Ci0JcmV0dXJuIHJjOwotZXZlbnRfZXJyOgotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci1lcnI6Ci0JaWYgKGF1ZGlvLT5kYXRhKSB7Ci0JCWlvdW5tYXAoYXVkaW8tPm1hcF92X3dyaXRlKTsKLQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcihhdWRpby0+cGh5cyk7Ci0JfQotCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19tcDNfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gYXVkaW9fb3BlbiwKLQkucmVsZWFzZQk9IGF1ZGlvX3JlbGVhc2UsCi0JLnJlYWQJCT0gYXVkaW9fcmVhZCwKLQkud3JpdGUJCT0gYXVkaW9fd3JpdGUsCi0JLnVubG9ja2VkX2lvY3RsCT0gYXVkaW9faW9jdGwsCi0JLmZzeW5jID0gYXVkbXAzX2ZzeW5jLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fbXAzX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gIm1zbV9tcDMiLAotCS5mb3BzCT0gJmF1ZGlvX21wM19mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9faW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19tcDNfbWlzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdWRpb19leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZhdWRpb19tcDNfbWlzYyk7Ci19Ci0KLW1vZHVsZV9pbml0KGF1ZGlvX2luaXQpOwotbW9kdWxlX2V4aXQoYXVkaW9fZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIE1QMyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fbXZzLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX212cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjExZmEwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fbXZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzY2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMC0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fbXZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgotCi0jaW5jbHVkZSA8bWFjaC9tc21fcnBjcm91dGVyLmg+Ci0jaW5jbHVkZSA8bWFjaC9jcHVpZGxlLmg+Ci0KLSNkZWZpbmUgTVZTX1BST0cgMHgzMDAwMDAxNAotI2RlZmluZSBNVlNfVkVSUyAweDAwMDMwMDAxCi0jZGVmaW5lIE1WU19WRVJTX0NPTVBfVkVSNCAweDAwMDQwMDAxCi0jZGVmaW5lIE1WU19WRVJTX0NPTVBfVkVSNSAweDAwMDUwMDAxCi0KLSNkZWZpbmUgTVZTX0NMSUVOVF9JRF9WT0lQIDB4MDAwMDAwMDMKLQotI2RlZmluZSBNVlNfQUNRVUlSRV9QUk9DIDQKLSNkZWZpbmUgTVZTX0VOQUJMRV9QUk9DIDUKLSNkZWZpbmUgTVZTX1JFTEVBU0VfUFJPQyA2Ci0jZGVmaW5lIE1WU19BTVJfU0VUX0FNUl9NT0RFX1BST0MgNwotI2RlZmluZSBNVlNfQU1SX1NFVF9BV0JfTU9ERV9QUk9DIDgKLSNkZWZpbmUgTVZTX1ZPQ19TRVRfRlJBTUVfUkFURV9QUk9DIDEwCi0jZGVmaW5lIE1WU19HU01fU0VUX0RUWF9NT0RFX1BST0MgMTEKLSNkZWZpbmUgTVZTX0c3MjlBX1NFVF9NT0RFX1BST0MgMTIKLSNkZWZpbmUgTVZTX0c3MTFfR0VUX01PREVfUFJPQyAxNAotI2RlZmluZSBNVlNfRzcxMV9TRVRfTU9ERV9QUk9DIDE1Ci0jZGVmaW5lIE1WU19HNzExQV9HRVRfTU9ERV9QUk9DIDE2Ci0jZGVmaW5lIE1WU19HNzExQV9TRVRfTU9ERV9QUk9DIDE3Ci0jZGVmaW5lIE1WU19HNzIyX1NFVF9NT0RFX1BST0MgMjAKLSNkZWZpbmUgTVZTX0c3MjJfR0VUX01PREVfUFJPQyAyMQotI2RlZmluZSBNVlNfU0VUX0RUWF9NT0RFX1BST0MgMjIKLQotI2RlZmluZSBNVlNfRVZFTlRfQ0JfVFlQRV9QUk9DIDEKLSNkZWZpbmUgTVZTX1BBQ0tFVF9VTF9GTl9UWVBFX1BST0MgMgotI2RlZmluZSBNVlNfUEFDS0VUX0RMX0ZOX1RZUEVfUFJPQyAzCi0KLSNkZWZpbmUgTVZTX0NCX0ZVTkNfSUQgMHhBQUFBQkJCQgotI2RlZmluZSBNVlNfVUxfQ0JfRlVOQ19JRCAweEJCQkJDQ0NDCi0jZGVmaW5lIE1WU19ETF9DQl9GVU5DX0lEIDB4Q0NDQ0REREQKLQotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9WT0NfVFggMQotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9WT0NfUlggMgotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9BTVJfVUwgMwotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9BTVJfREwgNAotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9HU01fVUwgNQotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9HU01fREwgNgotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9IUl9VTCA3Ci0jZGVmaW5lIE1WU19GUkFNRV9NT0RFX0hSX0RMIDgKLSNkZWZpbmUgTVZTX0ZSQU1FX01PREVfRzcxMV9VTCA5Ci0jZGVmaW5lIE1WU19GUkFNRV9NT0RFX0c3MTFfREwgMTAKLSNkZWZpbmUgTVZTX0ZSQU1FX01PREVfUENNX1VMIDEzCi0jZGVmaW5lIE1WU19GUkFNRV9NT0RFX1BDTV9ETCAxNAotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9HNzI5QV9VTCAxNwotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9HNzI5QV9ETCAxOAotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9HNzExQV9VTCAxOQotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9HNzExQV9ETCAyMAotI2RlZmluZSBNVlNfRlJBTUVfTU9ERV9HNzIyX1VMIDIxCi0jZGVmaW5lIE1WU19GUkFNRV9NT0RFX0c3MjJfREwgMjIKLQotCi0KLSNkZWZpbmUgTVZTX1BLVF9DT05URVhUX0lTUiAweDAwMDAwMDAxCi0KLSNkZWZpbmUgUlBDX1RZUEVfUkVRVUVTVCAwCi0jZGVmaW5lIFJQQ19UWVBFX1JFUExZIDEKLQotI2RlZmluZSBSUENfU1RBVFVTX0ZBSUxVUkUgMAotI2RlZmluZSBSUENfU1RBVFVTX1NVQ0NFU1MgMQotI2RlZmluZSBSUENfU1RBVFVTX1JFSkVDVCAxCi0KLSNkZWZpbmUgUlBDX0NPTU1PTl9IRFJfU1ogIChzaXplb2YodWludDMyX3QpICogMikKLSNkZWZpbmUgUlBDX1JFUVVFU1RfSERSX1NaIChzaXplb2Yoc3RydWN0IHJwY19yZXF1ZXN0X2hkcikpCi0jZGVmaW5lIFJQQ19SRVBMWV9IRFJfU1ogICAoc2l6ZW9mKHVpbnQzMl90KSAqIDMpCi0KLWVudW0gYXVkaW9fbXZzX3N0YXRlX3R5cGUgewotCUFVRElPX01WU19DTE9TRUQsCi0JQVVESU9fTVZTX09QRU5FRCwKLQlBVURJT19NVlNfU1RBUlRFRCwKLQlBVURJT19NVlNfU1RPUFBFRAotfTsKLQotZW51bSBhdWRpb19tdnNfZXZlbnRfdHlwZSB7Ci0JQVVESU9fTVZTX0NPTU1BTkQsCi0JQVVESU9fTVZTX01PREUsCi0JQVVESU9fTVZTX05PVElGWQotfTsKLQotZW51bSBhdWRpb19tdnNfY21kX3N0YXR1c190eXBlIHsKLQlBVURJT19NVlNfQ01EX0ZBSUxVUkUsCi0JQVVESU9fTVZTX0NNRF9CVVNZLAotCUFVRElPX01WU19DTURfU1VDQ0VTUwotfTsKLQotZW51bSBhdWRpb19tdnNfbW9kZV9zdGF0dXNfdHlwZSB7Ci0JQVVESU9fTVZTX01PREVfTk9UX0FWQUlMLAotCUFVRElPX01WU19NT0RFX0lOSVQsCi0JQVVESU9fTVZTX01PREVfUkVBRFkKLX07Ci0KLWVudW0gYXVkaW9fbXZzX3BrdF9zdGF0dXNfdHlwZSB7Ci0JQVVESU9fTVZTX1BLVF9OT1JNQUwsCi0JQVVESU9fTVZTX1BLVF9GQVNULAotCUFVRElPX01WU19QS1RfU0xPVwotfTsKLQotLyogUGFyYW1ldGVycyByZXF1aXJlZCBmb3IgTVZTIGFjcXVpcmUuICovCi1zdHJ1Y3QgcnBjX2F1ZGlvX212c19hY3F1aXJlX2FyZ3MgewotCXVpbnQzMl90IGNsaWVudF9pZDsKLQl1aW50MzJfdCBjYl9mdW5jX2lkOwotfTsKLQotc3RydWN0IGF1ZGlvX212c19hY3F1aXJlX21zZyB7Ci0Jc3RydWN0IHJwY19yZXF1ZXN0X2hkciBycGNfaGRyOwotCXN0cnVjdCBycGNfYXVkaW9fbXZzX2FjcXVpcmVfYXJncyBhY3F1aXJlX2FyZ3M7Ci19OwotCi0vKiBQYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBNVlMgZW5hYmxlLiAqLwotc3RydWN0IHJwY19hdWRpb19tdnNfZW5hYmxlX2FyZ3MgewotCXVpbnQzMl90IGNsaWVudF9pZDsKLQl1aW50MzJfdCBtb2RlOwotCXVpbnQzMl90IHVsX2NiX2Z1bmNfaWQ7Ci0JdWludDMyX3QgZGxfY2JfZnVuY19pZDsKLQl1aW50MzJfdCBjb250ZXh0OwotfTsKLQotc3RydWN0IGF1ZGlvX212c19lbmFibGVfbXNnIHsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIHJwY19oZHI7Ci0Jc3RydWN0IHJwY19hdWRpb19tdnNfZW5hYmxlX2FyZ3MgZW5hYmxlX2FyZ3M7Ci19OwotCi0vKiBQYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBNVlMgcmVsZWFzZS4gKi8KLXN0cnVjdCBhdWRpb19tdnNfcmVsZWFzZV9tc2cgewotCXN0cnVjdCBycGNfcmVxdWVzdF9oZHIgcnBjX2hkcjsKLQl1aW50MzJfdCBjbGllbnRfaWQ7Ci19OwotCi0vKiBQYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBzZXR0aW5nIEFNUiBtb2RlLiAqLwotc3RydWN0IGF1ZGlvX212c19zZXRfYW1yX21vZGVfbXNnIHsKLQlzdHJ1Y3QgcnBjX3JlcXVlc3RfaGRyIHJwY19oZHI7Ci0JdWludDMyX3QgYW1yX21vZGU7Ci19OwotCi0vKiBQYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBzZXR0aW5nIERUWC4gKi8KLXN0cnVjdCBhdWRpb19tdnNfc2V0X2R0eF9tb2RlX21zZyB7Ci0Jc3RydWN0IHJwY19yZXF1ZXN0X2hkciBycGNfaGRyOwotCXVpbnQzMl90IGR0eF9tb2RlOwotfTsKLQotLyogUGFyYW1ldGVycyByZXF1aXJlZCBmb3Igc2V0dGluZyBFVlJDIG1vZGUuICovCi1zdHJ1Y3QgYXVkaW9fbXZzX3NldF92b2NfbW9kZV9tc2cgewotCXN0cnVjdCBycGNfcmVxdWVzdF9oZHIgcnBjX2hkcjsKLQl1aW50MzJfdCBtYXhfcmF0ZTsKLQl1aW50MzJfdCBtaW5fcmF0ZTsKLX07Ci0KLS8qIFBhcmFtZXRlcnMgZm9yIEc3MTEgbW9kZSAqLwotc3RydWN0IGF1ZGlvX212c19zZXRfZzcxMV9tb2RlX21zZyB7Ci0Jc3RydWN0IHJwY19yZXF1ZXN0X2hkciBycGNfaGRyOwotCXVpbnQzMl90IGc3MTFfbW9kZTsKLX07Ci0KLS8qIFBhcmFtZXRlcnMgZm9yIEc3MjkgbW9kZSAqLwotc3RydWN0IGF1ZGlvX212c19zZXRfZzcyOV9tb2RlX21zZyB7Ci0Jc3RydWN0IHJwY19yZXF1ZXN0X2hkciBycGNfaGRyOwotCXVpbnQzMl90IGc3MjlfbW9kZTsKLX07Ci0KLS8qIFBhcmFtZXRlcnMgZm9yIEc3MjIgbW9kZSAqLwotc3RydWN0IGF1ZGlvX212c19zZXRfZzcyMl9tb2RlX21zZyB7Ci0Jc3RydWN0IHJwY19yZXF1ZXN0X2hkciBycGNfaGRyOwotCXVpbnQzMl90IGc3MjJfbW9kZTsKLX07Ci0KLQotLyogUGFyYW1ldGVycyBmb3IgRzcxMUEgbW9kZSAqLwotc3RydWN0IGF1ZGlvX212c19zZXRfZzcxMUFfbW9kZV9tc2cgewotCXN0cnVjdCBycGNfcmVxdWVzdF9oZHIgcnBjX2hkcjsKLQl1aW50MzJfdCBnNzExQV9tb2RlOwotfTsKLQotLyogUGFyYW1ldGVycyBmb3IgRUZSIEZSIGFuZCBIUiBtb2RlICovCi1zdHJ1Y3QgYXVkaW9fbXZzX3NldF9lZnJfbW9kZV9tc2cgewotCXN0cnVjdCBycGNfcmVxdWVzdF9oZHIgcnBjX2hkcjsKLQl1aW50MzJfdCBlZnJfbW9kZTsKLX07Ci0KLXVuaW9uIGF1ZGlvX212c19ldmVudF9kYXRhIHsKLQlzdHJ1Y3QgbXZzX2V2X2NvbW1hbmRfdHlwZSB7Ci0JCXVpbnQzMl90IGV2ZW50OwotCQl1aW50MzJfdCBjbGllbnRfaWQ7Ci0JCXVpbnQzMl90IGNtZF9zdGF0dXM7Ci0JfSBtdnNfZXZfY29tbWFuZF90eXBlOwotCi0Jc3RydWN0IG12c19ldl9tb2RlX3R5cGUgewotCQl1aW50MzJfdCBldmVudDsKLQkJdWludDMyX3QgY2xpZW50X2lkOwotCQl1aW50MzJfdCBtb2RlX3N0YXR1czsKLQkJdWludDMyX3QgbW9kZTsKLQl9IG12c19ldl9tb2RlX3R5cGU7Ci0KLQlzdHJ1Y3QgbXZzX2V2X25vdGlmeV90eXBlIHsKLQkJdWludDMyX3QgZXZlbnQ7Ci0JCXVpbnQzMl90IGNsaWVudF9pZDsKLQkJdWludDMyX3QgYnVmX2RpcjsKLQkJdWludDMyX3QgbWF4X2ZyYW1lczsKLQl9IG12c19ldl9ub3RpZnlfdHlwZTsKLX07Ci0KLXN0cnVjdCBhdWRpb19tdnNfY2JfZnVuY19hcmdzIHsKLQl1aW50MzJfdCBjYl9mdW5jX2lkOwotCXVpbnQzMl90IHZhbGlkX3B0cjsKLQl1aW50MzJfdCBldmVudDsKLQl1bmlvbiBhdWRpb19tdnNfZXZlbnRfZGF0YSBldmVudF9kYXRhOwotfTsKLQotc3RydWN0IGF1ZGlvX212c19mcmFtZV9pbmZvX2hkciB7Ci0JdWludDMyX3QgZnJhbWVfbW9kZTsKLQl1aW50MzJfdCBtdnNfbW9kZTsKLQl1aW50MTZfdCBidWZfZnJlZV9jbnQ7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fbXZzX3VsX3JlcGx5IHsKLQlzdHJ1Y3QgcnBjX3JlcGx5X2hkciByZXBseV9oZHI7Ci0JdWludDMyX3QgdmFsaWRfcGt0X3N0YXR1c19wdHI7Ci0JdWludDMyX3QgcGt0X3N0YXR1czsKLX07Ci0KLXN0cnVjdCBhdWRpb19tdnNfZGxfY2JfZnVuY19hcmdzIHsKLQl1aW50MzJfdCBjYl9mdW5jX2lkOwotCi0JdWludDMyX3QgdmFsaWRfcHRyOwotCXVpbnQzMl90IGZyYW1lX21vZGU7Ci0JdWludDMyX3QgZnJhbWVfbW9kZV9pZ25vcmU7Ci0KLQlzdHJ1Y3QgYXVkaW9fbXZzX2ZyYW1lX2luZm9faGRyIGZyYW1lX2luZm9faGRyOwotCi0JdWludDMyX3QgYW1yX2ZyYW1lOwotCXVpbnQzMl90IGFtcl9tb2RlOwotfTsKLS8qZ2VuZXJhbCBjb2RlYyBwYXJhbWV0ZXJzIGluY2x1ZGVzIEFNUiwgRzcxMUEsIFBDTQotRzcyOSwgVk9DIGFuZCBIUiB2b2NvZGVycwotKi8KLXN0cnVjdCBnbnJfY2RjX3BhcmFtIHsKLQl1aW50MzJfdCBwYXJhbTE7Ci0JdWludDMyX3QgcGFyYW0yOwotCXVpbnQzMl90IHZhbGlkX3BrdF9zdGF0dXNfcHRyOwotCXVpbnQzMl90IHBrdF9zdGF0dXM7Ci19OwotLypHNzExIGNvZGVjIHBhcmFtZXRlciovCi1zdHJ1Y3QgZzcxMV9wYXJhbSB7Ci0JdWludDMyX3QgcGFyYW0xOwotCXVpbnQzMl90IHZhbGlkX3BrdF9zdGF0dXNfcHRyOwotCXVpbnQzMl90IHBrdF9zdGF0dXM7Ci19OwotCi11bmlvbiBjb2RlY19wYXJhbSB7Ci0Jc3RydWN0IGducl9jZGNfcGFyYW0gZ25yX2FyZzsKLQlzdHJ1Y3QgZzcxMV9wYXJhbSBnNzExX2FyZzsKLX07Ci0KLXN0cnVjdCBhdWRpb19tdnNfZGxfcmVwbHkgewotCXN0cnVjdCBycGNfcmVwbHlfaGRyIHJlcGx5X2hkcjsKLQotCXVpbnQzMl90IHZvY19wa3RbUTVWMl9NVlNfTUFYX1ZPQ19QS1RfU0laRS80XTsKLQotCXVpbnQzMl90IHZhbGlkX2ZyYW1lX2luZm9fcHRyOwotCXVpbnQzMl90IGZyYW1lX21vZGU7Ci0JdWludDMyX3QgZnJhbWVfbW9kZV9hZ2FpbjsKLQotCXN0cnVjdCBhdWRpb19tdnNfZnJhbWVfaW5mb19oZHIgZnJhbWVfaW5mb19oZHI7Ci0JdW5pb24gY29kZWNfcGFyYW0gY2RjX3BhcmFtOwotfTsKLQotc3RydWN0IGF1ZGlvX212c19idWZfbm9kZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBxNXYyX21zbV9hdWRpb19tdnNfZnJhbWUgZnJhbWU7Ci19OwotCi0vKiBFYWNoIGJ1ZmZlciBpcyAyMCBtcywgcXVldWUgaG9sZHMgMjAwIG1zIG9mIGRhdGEuICovCi0jZGVmaW5lIE1WU19NQVhfUV9MRU4gMTAKLQotc3RydWN0IGF1ZGlvX212c19pbmZvX3R5cGUgewotCWVudW0gYXVkaW9fbXZzX3N0YXRlX3R5cGUgc3RhdGU7Ci0JdWludDMyX3QgZnJhbWVfbW9kZTsKLQl1aW50MzJfdCBtdnNfbW9kZTsKLQl1aW50MzJfdCBidWZfZnJlZV9jbnQ7Ci0JdWludDMyX3QgcmF0ZV90eXBlOwotCXVpbnQzMl90IGR0eF9tb2RlOwotCXN0cnVjdCBtaW5fbWF4X3JhdGUgbWluX21heF9yYXRlOwotCi0Jc3RydWN0IG1zbV9ycGNfZW5kcG9pbnQgKnJwY19lbmRwdDsKLQl1aW50MzJfdCBycGNfcHJvZzsKLQl1aW50MzJfdCBycGNfdmVyOwotCXVpbnQzMl90IHJwY19zdGF0dXM7Ci0KLQl1aW50OF90ICptZW1fY2h1bms7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkIGluX3F1ZXVlOwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9pbl9xdWV1ZTsKLQotCXN0cnVjdCBsaXN0X2hlYWQgb3V0X3F1ZXVlOwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9vdXRfcXVldWU7Ci0KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7Ci0KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXdhaXRfcXVldWVfaGVhZF90IG1vZGVfd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBvdXRfd2FpdDsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtdXRleCBpbl9sb2NrOwotCXN0cnVjdCBtdXRleCBvdXRfbG9jazsKLQotCXN0cnVjdCB3YWtlX2xvY2sgc3VzcGVuZF9sb2NrOwotCXN0cnVjdCBwbV9xb3NfcmVxdWVzdCBwbV9xb3NfcmVxOwotfTsKLQotc3RhdGljIHN0cnVjdCBhdWRpb19tdnNfaW5mb190eXBlIGF1ZGlvX212c19pbmZvOwotCi1zdGF0aWMgaW50IGF1ZGlvX212c19zZXR1cF9tb2RlKHN0cnVjdCBhdWRpb19tdnNfaW5mb190eXBlICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0Jc3dpdGNoIChhdWRpby0+bXZzX21vZGUpIHsKLQljYXNlIE1WU19NT0RFX0FNUjoKLQljYXNlIE1WU19NT0RFX0FNUl9XQjogewotCQlzdHJ1Y3QgYXVkaW9fbXZzX3NldF9hbXJfbW9kZV9tc2cgc2V0X2Ftcl9tb2RlX21zZzsKLQkJc3RydWN0IGF1ZGlvX212c19zZXRfZHR4X21vZGVfbXNnIHNldF9kdHhfbW9kZV9tc2c7Ci0KLQkJLyogU2V0IEFNUiBtb2RlLiAqLwotCQltZW1zZXQoJnNldF9hbXJfbW9kZV9tc2csIDAsIHNpemVvZihzZXRfYW1yX21vZGVfbXNnKSk7Ci0JCXNldF9hbXJfbW9kZV9tc2cuYW1yX21vZGUgPSBjcHVfdG9fYmUzMihhdWRpby0+cmF0ZV90eXBlKTsKLQotCQlpZiAoYXVkaW8tPm12c19tb2RlID09IE1WU19NT0RFX0FNUikgewotCQkJbXNtX3JwY19zZXR1cF9yZXEoJnNldF9hbXJfbW9kZV9tc2cucnBjX2hkciwKLQkJCQkJICBhdWRpby0+cnBjX3Byb2csCi0JCQkJCSAgYXVkaW8tPnJwY192ZXIsCi0JCQkJCSAgTVZTX0FNUl9TRVRfQU1SX01PREVfUFJPQyk7Ci0JCX0gZWxzZSB7Ci0JCQltc21fcnBjX3NldHVwX3JlcSgmc2V0X2Ftcl9tb2RlX21zZy5ycGNfaGRyLAotCQkJCQkgIGF1ZGlvLT5ycGNfcHJvZywKLQkJCQkJICBhdWRpby0+cnBjX3ZlciwKLQkJCQkJICBNVlNfQU1SX1NFVF9BV0JfTU9ERV9QUk9DKTsKLQkJfQotCi0JCWF1ZGlvLT5ycGNfc3RhdHVzID0gUlBDX1NUQVRVU19GQUlMVVJFOwotCQlyYyA9IG1zbV9ycGNfd3JpdGUoYXVkaW8tPnJwY19lbmRwdCwKLQkJCQkgICAmc2V0X2Ftcl9tb2RlX21zZywKLQkJCQkgICBzaXplb2Yoc2V0X2Ftcl9tb2RlX21zZykpOwotCi0JCWlmIChyYyA+PSAwKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IFJQQyB3cml0ZSBmb3Igc2V0IGFtciBtb2RlIGRvbmVcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQotCQkJLyogU2F2ZSB0aGUgTVZTIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICovCi0JCQlhdWRpby0+ZnJhbWVfbW9kZSA9IE1WU19GUkFNRV9NT0RFX0FNUl9ETDsKLQotCQkJLyogRGlzYWJsZSBEVFguICovCi0JCQltZW1zZXQoJnNldF9kdHhfbW9kZV9tc2csIDAsIHNpemVvZihzZXRfZHR4X21vZGVfbXNnKSk7Ci0JCQlzZXRfZHR4X21vZGVfbXNnLmR0eF9tb2RlID0gY3B1X3RvX2JlMzIoMCk7Ci0KLQkJCW1zbV9ycGNfc2V0dXBfcmVxKCZzZXRfZHR4X21vZGVfbXNnLnJwY19oZHIsCi0JCQkJCSAgYXVkaW8tPnJwY19wcm9nLAotCQkJCQkgIGF1ZGlvLT5ycGNfdmVyLAotCQkJCQkgIE1WU19TRVRfRFRYX01PREVfUFJPQyk7Ci0KLQkJCWF1ZGlvLT5ycGNfc3RhdHVzID0gUlBDX1NUQVRVU19GQUlMVVJFOwotCQkJcmMgPSBtc21fcnBjX3dyaXRlKGF1ZGlvLT5ycGNfZW5kcHQsCi0JCQkJCSAgICZzZXRfZHR4X21vZGVfbXNnLAotCQkJCQkgICBzaXplb2Yoc2V0X2R0eF9tb2RlX21zZykpOwotCi0JCQlpZiAocmMgPj0gMCkgewotCQkJCXByX2RlYnVnKCIlczogUlBDIHdyaXRlIGZvciBzZXQgZHR4IGRvbmVcbiIsCi0JCQkJCQkgX19mdW5jX18pOwotCi0JCQkJcmMgPSAwOwotCQkJfQotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlczogUlBDIHdyaXRlIGZvciBzZXQgYW1yIG1vZGUgZmFpbGVkICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCByYyk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgTVZTX01PREVfUENNOgotCWNhc2UgTVZTX01PREVfTElORUFSX1BDTTogewotCQkvKiBQQ00gZG9lcyBub3QgaGF2ZSBhbnkgcGFyYW1zIHRvIGJlIHNldC4KLQkJU2F2ZSB0aGUgTVZTIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICovCi0JCWF1ZGlvLT5yYXRlX3R5cGUgPSBNVlNfQU1SX01PREVfVU5ERUY7Ci0JCWF1ZGlvLT5mcmFtZV9tb2RlID0gTVZTX0ZSQU1FX01PREVfUENNX0RMOwotCQlicmVhazsKLQl9Ci0JY2FzZSBNVlNfTU9ERV9JUzEyNzoKLQljYXNlIE1WU19NT0RFX0lTNzMzOgotCWNhc2UgTVZTX01PREVfNEdWX05COgotCWNhc2UgTVZTX01PREVfNEdWX1dCOiB7Ci0JCXN0cnVjdCBhdWRpb19tdnNfc2V0X3ZvY19tb2RlX21zZyBzZXRfdm9jX21vZGVfbXNnOwotCi0JCS8qIFNldCBFVlJDIG1vZGUuICovCi0JCW1lbXNldCgmc2V0X3ZvY19tb2RlX21zZywgMCwgc2l6ZW9mKHNldF92b2NfbW9kZV9tc2cpKTsKLQkJc2V0X3ZvY19tb2RlX21zZy5taW5fcmF0ZSA9Ci0JCQkJY3B1X3RvX2JlMzIoYXVkaW8tPm1pbl9tYXhfcmF0ZS5taW5fcmF0ZSk7Ci0JCXNldF92b2NfbW9kZV9tc2cubWF4X3JhdGUgPQotCQkJCWNwdV90b19iZTMyKGF1ZGlvLT5taW5fbWF4X3JhdGUubWF4X3JhdGUpOwotCi0JCW1zbV9ycGNfc2V0dXBfcmVxKCZzZXRfdm9jX21vZGVfbXNnLnJwY19oZHIsCi0JCQkJICBhdWRpby0+cnBjX3Byb2csCi0JCQkJICBhdWRpby0+cnBjX3ZlciwKLQkJCQkgIE1WU19WT0NfU0VUX0ZSQU1FX1JBVEVfUFJPQyk7Ci0KLQkJYXVkaW8tPnJwY19zdGF0dXMgPSBSUENfU1RBVFVTX0ZBSUxVUkU7Ci0JCXJjID0gbXNtX3JwY193cml0ZShhdWRpby0+cnBjX2VuZHB0LAotCQkJCSAgICZzZXRfdm9jX21vZGVfbXNnLAotCQkJCSAgIHNpemVvZihzZXRfdm9jX21vZGVfbXNnKSk7Ci0KLQkJaWYgKHJjID49IDApIHsKLQkJCXByX2RlYnVnKCIlczogUlBDIHdyaXRlIGZvciBzZXQgdm9jIG1vZGUgZG9uZVxuIiwKLQkJCQkJX19mdW5jX18pOwotCi0JCQkvKiBTYXZlIHRoZSBNVlMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gKi8KLQkJCWF1ZGlvLT5mcmFtZV9tb2RlID0gTVZTX0ZSQU1FX01PREVfVk9DX1JYOwotCi0JCQlyYyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBSUEMgd3JpdGUgZm9yIHNldCB2b2MgbW9kZSBmYWlsZWQgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJjKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBNVlNfTU9ERV9HNzExOiB7Ci0JCXN0cnVjdCBhdWRpb19tdnNfc2V0X2c3MTFfbW9kZV9tc2cgc2V0X2c3MTFfbW9kZV9tc2c7Ci0KLQkJLyogU2V0IEc3MTEgbW9kZS4gKi8KLQkJbWVtc2V0KCZzZXRfZzcxMV9tb2RlX21zZywgMCwgc2l6ZW9mKHNldF9nNzExX21vZGVfbXNnKSk7Ci0JCXNldF9nNzExX21vZGVfbXNnLmc3MTFfbW9kZSA9IGNwdV90b19iZTMyKGF1ZGlvLT5yYXRlX3R5cGUpOwotCi0JCXByX2RlYnVnKCIlczogbW9kZSBvZiBnNzExOiVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBzZXRfZzcxMV9tb2RlX21zZy5nNzExX21vZGUpOwotCi0JCW1zbV9ycGNfc2V0dXBfcmVxKCZzZXRfZzcxMV9tb2RlX21zZy5ycGNfaGRyLAotCQkJCSBhdWRpby0+cnBjX3Byb2csCi0JCQkJIGF1ZGlvLT5ycGNfdmVyLAotCQkJCSBNVlNfRzcxMV9TRVRfTU9ERV9QUk9DKTsKLQotCQlhdWRpby0+cnBjX3N0YXR1cyA9IFJQQ19TVEFUVVNfRkFJTFVSRTsKLQkJcmMgPSBtc21fcnBjX3dyaXRlKGF1ZGlvLT5ycGNfZW5kcHQsCi0JCQkJICAmc2V0X2c3MTFfbW9kZV9tc2csCi0JCQkJICBzaXplb2Yoc2V0X2c3MTFfbW9kZV9tc2cpKTsKLQotCQlpZiAocmMgPj0gMCkgewotCQkJcHJfZGVidWcoIiVzOiBSUEMgd3JpdGUgZm9yIHNldCBnNzExIG1vZGUgZG9uZVxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJLyogU2F2ZSB0aGUgTVZTIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICovCi0JCQlhdWRpby0+ZnJhbWVfbW9kZSA9IE1WU19GUkFNRV9NT0RFX0c3MTFfREw7Ci0KLQkJCXJjID0gMDsKLQkJfSBlbHNlIHsKLQkJICAgICAgIHByX2VycigiJXM6IFJQQyB3cml0ZSBmb3Igc2V0IGc3MTEgbW9kZSBmYWlsZWQgJWRcbiIsCi0JCQkgICAgICBfX2Z1bmNfXywgcmMpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIE1WU19NT0RFX0c3MjlBOiB7Ci0JCXN0cnVjdCBhdWRpb19tdnNfc2V0X2c3MjlfbW9kZV9tc2cgc2V0X2c3MjlfbW9kZV9tc2c7Ci0KLQkJLyogU2V0IEc3MjkgbW9kZS4gKi8KLQkJbWVtc2V0KCZzZXRfZzcyOV9tb2RlX21zZywgMCwgc2l6ZW9mKHNldF9nNzI5X21vZGVfbXNnKSk7Ci0JCXNldF9nNzI5X21vZGVfbXNnLmc3MjlfbW9kZSA9IGNwdV90b19iZTMyKGF1ZGlvLT5kdHhfbW9kZSk7Ci0KLQkJcHJfZGVidWcoIiVzOiBtb2RlIG9mIGc3Mjk6JWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHNldF9nNzI5X21vZGVfbXNnLmc3MjlfbW9kZSk7Ci0KLQkJbXNtX3JwY19zZXR1cF9yZXEoJnNldF9nNzI5X21vZGVfbXNnLnJwY19oZHIsCi0JCQkJIGF1ZGlvLT5ycGNfcHJvZywKLQkJCQkgYXVkaW8tPnJwY192ZXIsCi0JCQkJIE1WU19HNzI5QV9TRVRfTU9ERV9QUk9DKTsKLQotCQlhdWRpby0+cnBjX3N0YXR1cyA9IFJQQ19TVEFUVVNfRkFJTFVSRTsKLQkJcmMgPSBtc21fcnBjX3dyaXRlKGF1ZGlvLT5ycGNfZW5kcHQsCi0JCQkJICAmc2V0X2c3MjlfbW9kZV9tc2csCi0JCQkJICBzaXplb2Yoc2V0X2c3MjlfbW9kZV9tc2cpKTsKLQotCQlpZiAocmMgPj0gMCkgewotCQkJcHJfZGVidWcoIiVzOiBSUEMgd3JpdGUgZm9yIHNldCBnNzI5IG1vZGUgZG9uZVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXyk7Ci0KLQkJCS8qIFNhdmUgdGhlIE1WUyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiAqLwotCQkJYXVkaW8tPmZyYW1lX21vZGUgPSBNVlNfRlJBTUVfTU9ERV9HNzI5QV9ETDsKLQotCQkJcmMgPSAwOwotCQl9IGVsc2UgewotCQkgICAgICAgcHJfZXJyKCIlczogUlBDIHdyaXRlIGZvciBzZXQgZzcyOSBtb2RlIGZhaWxlZCAlZFxuIiwKLQkJCSAgICAgIF9fZnVuY19fLCByYyk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgTVZTX01PREVfRzcyMjogewotCQlzdHJ1Y3QgYXVkaW9fbXZzX3NldF9nNzIyX21vZGVfbXNnIHNldF9nNzIyX21vZGVfbXNnOwotCi0JCS8qIFNldCBHNzIyIG1vZGUuICovCi0JCW1lbXNldCgmc2V0X2c3MjJfbW9kZV9tc2csIDAsIHNpemVvZihzZXRfZzcyMl9tb2RlX21zZykpOwotCQlzZXRfZzcyMl9tb2RlX21zZy5nNzIyX21vZGUgPSBjcHVfdG9fYmUzMihhdWRpby0+cmF0ZV90eXBlKTsKLQotCQlwcl9kZWJ1ZygiJXM6IG1vZGUgb2YgZzcyMjolZFxuIiwKLQkJICAgICAgX19mdW5jX18sIHNldF9nNzIyX21vZGVfbXNnLmc3MjJfbW9kZSk7Ci0KLQkJbXNtX3JwY19zZXR1cF9yZXEoJnNldF9nNzIyX21vZGVfbXNnLnJwY19oZHIsCi0JCQlhdWRpby0+cnBjX3Byb2csCi0JCQlhdWRpby0+cnBjX3ZlciwKLQkJCU1WU19HNzIyX1NFVF9NT0RFX1BST0MpOwotCi0JCWF1ZGlvLT5ycGNfc3RhdHVzID0gUlBDX1NUQVRVU19GQUlMVVJFOwotCQlyYyA9IG1zbV9ycGNfd3JpdGUoYXVkaW8tPnJwY19lbmRwdCwKLQkJCSAmc2V0X2c3MjJfbW9kZV9tc2csCi0JCQkgc2l6ZW9mKHNldF9nNzIyX21vZGVfbXNnKSk7Ci0KLQkJaWYgKHJjID49IDApIHsKLQkJCXByX2RlYnVnKCIlczogUlBDIHdyaXRlIGZvciBzZXQgZzcyMiBtb2RlIGRvbmVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0KLQkJCS8qIFNhdmUgdGhlIE1WUyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiAqLwotCQkJYXVkaW8tPmZyYW1lX21vZGUgPSBNVlNfRlJBTUVfTU9ERV9HNzIyX0RMOwotCi0JCQlyYyA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgTVZTX01PREVfRzcxMUE6IHsKLQkJc3RydWN0IGF1ZGlvX212c19zZXRfZzcxMUFfbW9kZV9tc2cgc2V0X2c3MTFBX21vZGVfbXNnOwotCQlzdHJ1Y3QgYXVkaW9fbXZzX3NldF9kdHhfbW9kZV9tc2cgc2V0X2R0eF9tb2RlX21zZzsKLQotCQkvKiBTZXQgRzcxMUEgbW9kZS4gKi8KLQkJbWVtc2V0KCZzZXRfZzcxMUFfbW9kZV9tc2csIDAsIHNpemVvZihzZXRfZzcxMUFfbW9kZV9tc2cpKTsKLQkJc2V0X2c3MTFBX21vZGVfbXNnLmc3MTFBX21vZGUgPSBjcHVfdG9fYmUzMihhdWRpby0+cmF0ZV90eXBlKTsKLQotCQlwcl9kZWJ1ZygiJXM6IG1vZGUgb2YgZzcxMUE6JWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgc2V0X2c3MTFBX21vZGVfbXNnLmc3MTFBX21vZGUpOwotCi0JCW1zbV9ycGNfc2V0dXBfcmVxKCZzZXRfZzcxMUFfbW9kZV9tc2cucnBjX2hkciwKLQkJCSBhdWRpby0+cnBjX3Byb2csCi0JCQkgYXVkaW8tPnJwY192ZXIsCi0JCQkgTVZTX0c3MTFBX1NFVF9NT0RFX1BST0MpOwotCi0JCWF1ZGlvLT5ycGNfc3RhdHVzID0gUlBDX1NUQVRVU19GQUlMVVJFOwotCQlyYyA9IG1zbV9ycGNfd3JpdGUoYXVkaW8tPnJwY19lbmRwdCwKLQkJCSAgJnNldF9nNzExQV9tb2RlX21zZywKLQkJCSAgc2l6ZW9mKHNldF9nNzExQV9tb2RlX21zZykpOwotCi0JCWlmIChyYyA+PSAwKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IFJQQyB3cml0ZSBmb3Igc2V0IGc3MTFBIG1vZGUgZG9uZVxuIiwKLQkJCQkgICAgICAgX19mdW5jX18pOwotCi0JCQkvKiBTYXZlIHRoZSBNVlMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gKi8KLQkJCWF1ZGlvLT5mcmFtZV9tb2RlID0gTVZTX0ZSQU1FX01PREVfRzcxMUFfREw7Ci0JCQkvKiBTZXQgRFRYIE1PREUuICovCi0JCQltZW1zZXQoJnNldF9kdHhfbW9kZV9tc2csIDAsIHNpemVvZihzZXRfZHR4X21vZGVfbXNnKSk7Ci0JCQlzZXRfZHR4X21vZGVfbXNnLmR0eF9tb2RlID0KLQkJCQljcHVfdG9fYmUzMigoYXVkaW8tPmR0eF9tb2RlKSk7Ci0KLQkJCW1zbV9ycGNfc2V0dXBfcmVxKCZzZXRfZHR4X21vZGVfbXNnLnJwY19oZHIsCi0JCQkJCSAgYXVkaW8tPnJwY19wcm9nLAotCQkJCQkgIGF1ZGlvLT5ycGNfdmVyLAotCQkJCQkgIE1WU19TRVRfRFRYX01PREVfUFJPQyk7Ci0KLQkJCWF1ZGlvLT5ycGNfc3RhdHVzID0gUlBDX1NUQVRVU19GQUlMVVJFOwotCQkJcmMgPSBtc21fcnBjX3dyaXRlKGF1ZGlvLT5ycGNfZW5kcHQsCi0JCQkJCSAgICZzZXRfZHR4X21vZGVfbXNnLAotCQkJCQkgICBzaXplb2Yoc2V0X2R0eF9tb2RlX21zZykpOwotCi0JCQlpZiAocmMgPj0gMCkgewotCQkJCXByX2RlYnVnKCIlczogUlBDIHdyaXRlIGZvciBzZXQgZHR4IGRvbmVcbiIsCi0JCQkJCQkgX19mdW5jX18pOwotCi0JCQkJcmMgPSAwOwotCQkJfQotCQkJcmMgPSAwOwotCQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBSUEMgd3JpdGUgZm9yIHNldCBnNzExQSBtb2RlIGZhaWxlZCAlZFxuIiwKLQkJICAgICAgX19mdW5jX18sIHJjKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBNVlNfTU9ERV9FRlI6Ci0JY2FzZSBNVlNfTU9ERV9GUjoKLQljYXNlIE1WU19NT0RFX0hSOiB7Ci0JCXN0cnVjdCBhdWRpb19tdnNfc2V0X2Vmcl9tb2RlX21zZyBzZXRfZWZyX21vZGVfbXNnOwotCi0JCS8qIFNldCBHNzI5IG1vZGUuICovCi0JCW1lbXNldCgmc2V0X2Vmcl9tb2RlX21zZywgMCwgc2l6ZW9mKHNldF9lZnJfbW9kZV9tc2cpKTsKLQkJc2V0X2Vmcl9tb2RlX21zZy5lZnJfbW9kZSA9IGNwdV90b19iZTMyKGF1ZGlvLT5kdHhfbW9kZSk7Ci0KLQkJcHJfZGVidWcoIiVzOiBtb2RlIG9mIEVGUiwgRlIgYW5kIEhSOiVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBzZXRfZWZyX21vZGVfbXNnLmVmcl9tb2RlKTsKLQotCQltc21fcnBjX3NldHVwX3JlcSgmc2V0X2Vmcl9tb2RlX21zZy5ycGNfaGRyLAotCQkJCSBhdWRpby0+cnBjX3Byb2csCi0JCQkJIGF1ZGlvLT5ycGNfdmVyLAotCQkJCSBNVlNfR1NNX1NFVF9EVFhfTU9ERV9QUk9DKTsKLQotCQlhdWRpby0+cnBjX3N0YXR1cyA9IFJQQ19TVEFUVVNfRkFJTFVSRTsKLQkJcmMgPSBtc21fcnBjX3dyaXRlKGF1ZGlvLT5ycGNfZW5kcHQsCi0JCQkJICAmc2V0X2Vmcl9tb2RlX21zZywKLQkJCQkgIHNpemVvZihzZXRfZWZyX21vZGVfbXNnKSk7Ci0KLQkJaWYgKHJjID49IDApIHsKLQkJCXByX2RlYnVnKCIlczogUlBDIHdyaXRlIGZvciBzZXQgRUZSLCBGUiBhbmQgSFIgbW9kZSBkb25lXG4iLAotCQkJICAgICAgIF9fZnVuY19fKTsKLQotCQkJLyogU2F2ZSB0aGUgTVZTIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICovCi0JCQlpZiAoKGF1ZGlvLT5tdnNfbW9kZSA9PSBNVlNfTU9ERV9FRlIpIHx8Ci0JCQkJKGF1ZGlvLT5tdnNfbW9kZSA9PSBNVlNfTU9ERV9GUikpCi0JCQkJYXVkaW8tPmZyYW1lX21vZGUgPSBNVlNfRlJBTUVfTU9ERV9HU01fREw7Ci0JCQlpZiAoYXVkaW8tPm12c19tb2RlID09IE1WU19NT0RFX0hSKQotCQkJCWF1ZGlvLT5mcmFtZV9tb2RlID0gTVZTX0ZSQU1FX01PREVfSFJfREw7Ci0KLQkJCXJjID0gMDsKLQkJfSBlbHNlIHsKLQkJICAgICAgIHByX2VycigiJXM6IFJQQyB3cml0ZSBmb3Igc2V0IEVGUiwgRlIgYW5kIEhSIG1vZGUgZmFpbGVkICVkXG4iLAotCQkJICAgICAgX19mdW5jX18sIHJjKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlwcl9lcnIoIkRlZmF1bHQgY2FzZVxuIik7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19tdnNfc2V0dXAoc3RydWN0IGF1ZGlvX212c19pbmZvX3R5cGUgKmF1ZGlvKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGF1ZGlvX212c19lbmFibGVfbXNnIGVuYWJsZV9tc2c7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiBFbmFibGUgTVZTLiAqLwotCW1lbXNldCgmZW5hYmxlX21zZywgMCwgc2l6ZW9mKGVuYWJsZV9tc2cpKTsKLQllbmFibGVfbXNnLmVuYWJsZV9hcmdzLmNsaWVudF9pZCA9IGNwdV90b19iZTMyKE1WU19DTElFTlRfSURfVk9JUCk7Ci0JZW5hYmxlX21zZy5lbmFibGVfYXJncy5tb2RlID0gY3B1X3RvX2JlMzIoYXVkaW8tPm12c19tb2RlKTsKLQllbmFibGVfbXNnLmVuYWJsZV9hcmdzLnVsX2NiX2Z1bmNfaWQgPSBjcHVfdG9fYmUzMihNVlNfVUxfQ0JfRlVOQ19JRCk7Ci0JZW5hYmxlX21zZy5lbmFibGVfYXJncy5kbF9jYl9mdW5jX2lkID0gY3B1X3RvX2JlMzIoTVZTX0RMX0NCX0ZVTkNfSUQpOwotCWVuYWJsZV9tc2cuZW5hYmxlX2FyZ3MuY29udGV4dCA9IGNwdV90b19iZTMyKE1WU19QS1RfQ09OVEVYVF9JU1IpOwotCi0JbXNtX3JwY19zZXR1cF9yZXEoJmVuYWJsZV9tc2cucnBjX2hkciwKLQkJCSAgYXVkaW8tPnJwY19wcm9nLAotCQkJICBhdWRpby0+cnBjX3ZlciwKLQkJCSAgTVZTX0VOQUJMRV9QUk9DKTsKLQotCWF1ZGlvLT5ycGNfc3RhdHVzID0gUlBDX1NUQVRVU19GQUlMVVJFOwotCXJjID0gbXNtX3JwY193cml0ZShhdWRpby0+cnBjX2VuZHB0LCAmZW5hYmxlX21zZywgc2l6ZW9mKGVuYWJsZV9tc2cpKTsKLQotCWlmIChyYyA+PSAwKSB7Ci0JCXByX2RlYnVnKCIlczogUlBDIHdyaXRlIGZvciBlbmFibGUgZG9uZVxuIiwgX19mdW5jX18pOwotCi0JCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGF1ZGlvLT5tb2RlX3dhaXQsCi0JCQkJKGF1ZGlvLT5ycGNfc3RhdHVzICE9IFJQQ19TVEFUVVNfRkFJTFVSRSksCi0JCQkJMTAgKiBIWik7Ci0KLQkJaWYgKHJjID4gMCkgewotCQkJcHJfZGVidWcoIiVzOiBXYWl0IGV2ZW50IGZvciBlbmFibGUgc3VjY2VlZGVkXG4iLAotCQkJCSBfX2Z1bmNfXyk7Ci0JCQlyYyA9IGF1ZGlvX212c19zZXR1cF9tb2RlKGF1ZGlvKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBVbmtub3duIE1WUyBtb2RlICVkXG4iLAotCQkJCSAgICAgICBfX2Z1bmNfXywgYXVkaW8tPm12c19tb2RlKTsKLQkJCX0KLQkJCXByX2VycigicmMgdmFsdWUgYWZ0ZXIgbW9kZSBzZXR1cDogJWRcbiIsIHJjKTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IFdhaXQgZXZlbnQgZm9yIGVuYWJsZSBmYWlsZWQgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJjKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IFJQQyB3cml0ZSBmb3IgZW5hYmxlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fbXZzX3N0YXJ0KHN0cnVjdCBhdWRpb19tdnNfaW5mb190eXBlICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBhdWRpb19tdnNfYWNxdWlyZV9tc2cgYWNxdWlyZV9tc2c7Ci0KLQlwcl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCS8qIFByZXZlbnQgc2xlZXAuICovCi0Jd2FrZV9sb2NrKCZhdWRpby0+c3VzcGVuZF9sb2NrKTsKLQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJmF1ZGlvLT5wbV9xb3NfcmVxLAotCQkJICAgICAgbXNtX2NwdWlkbGVfZ2V0X2RlZXBfaWRsZV9sYXRlbmN5KCkpOwotCi0JLyogQWNxdWlyZSBNVlMuICovCi0JbWVtc2V0KCZhY3F1aXJlX21zZywgMCwgc2l6ZW9mKGFjcXVpcmVfbXNnKSk7Ci0JYWNxdWlyZV9tc2cuYWNxdWlyZV9hcmdzLmNsaWVudF9pZCA9IGNwdV90b19iZTMyKE1WU19DTElFTlRfSURfVk9JUCk7Ci0JYWNxdWlyZV9tc2cuYWNxdWlyZV9hcmdzLmNiX2Z1bmNfaWQgPSBjcHVfdG9fYmUzMihNVlNfQ0JfRlVOQ19JRCk7Ci0KLQltc21fcnBjX3NldHVwX3JlcSgmYWNxdWlyZV9tc2cucnBjX2hkciwKLQkJCSAgYXVkaW8tPnJwY19wcm9nLAotCQkJICBhdWRpby0+cnBjX3ZlciwKLQkJCSAgTVZTX0FDUVVJUkVfUFJPQyk7Ci0KLQlhdWRpby0+cnBjX3N0YXR1cyA9IFJQQ19TVEFUVVNfRkFJTFVSRTsKLQlyYyA9IG1zbV9ycGNfd3JpdGUoYXVkaW8tPnJwY19lbmRwdCwKLQkJCSAgICZhY3F1aXJlX21zZywKLQkJCSAgIHNpemVvZihhY3F1aXJlX21zZykpOwotCi0JaWYgKHJjID49IDApIHsKLQkJcHJfZGVidWcoIiVzOiBSUEMgd3JpdGUgZm9yIGFjcXVpcmUgZG9uZVxuIiwgX19mdW5jX18pOwotCi0JCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJKGF1ZGlvLT5ycGNfc3RhdHVzICE9IFJQQ19TVEFUVVNfRkFJTFVSRSksCi0JCQkxICogSFopOwotCi0JCWlmIChyYyA+IDApIHsKLQotCQkJcmMgPSBhdWRpb19tdnNfc2V0dXAoYXVkaW8pOwotCi0JCQlpZiAocmMgPT0gMCkKLQkJCQlhdWRpby0+c3RhdGUgPSBBVURJT19NVlNfU1RBUlRFRDsKLQotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlczogV2FpdCBldmVudCBmb3IgYWNxdWlyZSBmYWlsZWQgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJjKTsKLQotCQkJcmMgPSAtRUJVU1k7Ci0JCX0KLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBSUEMgd3JpdGUgZm9yIGFjcXVpcmUgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCi0JCXJjID0gLUVCVVNZOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19tdnNfc3RvcChzdHJ1Y3QgYXVkaW9fbXZzX2luZm9fdHlwZSAqYXVkaW8pCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYXVkaW9fbXZzX3JlbGVhc2VfbXNnIHJlbGVhc2VfbXNnOwotCi0JcHJfaW5mbygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiBSZWxlYXNlIE1WUy4gKi8KLQltZW1zZXQoJnJlbGVhc2VfbXNnLCAwLCBzaXplb2YocmVsZWFzZV9tc2cpKTsKLQlyZWxlYXNlX21zZy5jbGllbnRfaWQgPSBjcHVfdG9fYmUzMihNVlNfQ0xJRU5UX0lEX1ZPSVApOwotCi0JbXNtX3JwY19zZXR1cF9yZXEoJnJlbGVhc2VfbXNnLnJwY19oZHIsCi0JCQkgIGF1ZGlvLT5ycGNfcHJvZywKLQkJCSAgYXVkaW8tPnJwY192ZXIsCi0JCQkgIE1WU19SRUxFQVNFX1BST0MpOwotCi0JYXVkaW8tPnJwY19zdGF0dXMgPSBSUENfU1RBVFVTX0ZBSUxVUkU7Ci0JcmMgPSBtc21fcnBjX3dyaXRlKGF1ZGlvLT5ycGNfZW5kcHQsICZyZWxlYXNlX21zZywgc2l6ZW9mKHJlbGVhc2VfbXNnKSk7Ci0KLQlpZiAocmMgPj0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IFJQQyB3cml0ZSBmb3IgcmVsZWFzZSBkb25lXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYXVkaW8tPm1vZGVfd2FpdCwKLQkJCQkoYXVkaW8tPnJwY19zdGF0dXMgIT0gUlBDX1NUQVRVU19GQUlMVVJFKSwKLQkJCQkxICogSFopOwotCi0JCWlmIChyYyA+IDApIHsKLQkJCXByX2RlYnVnKCIlczogV2FpdCBldmVudCBmb3IgcmVsZWFzZSBzdWNjZWVkZWRcbiIsCi0JCQkJIF9fZnVuY19fKTsKLQotCQkJYXVkaW8tPnN0YXRlID0gQVVESU9fTVZTX1NUT1BQRUQ7Ci0KLQkJCS8qIFVuLWJsb2NrIHJlYWQgaW4gY2FzZSBpdCBpcyB3YWl0aW5nIGZvciBkYXRhLiAqLwotCQkJd2FrZV91cCgmYXVkaW8tPm91dF93YWl0KTsKLQkJCXJjID0gMDsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IFdhaXQgZXZlbnQgZm9yIHJlbGVhc2UgZmFpbGVkICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCByYyk7Ci0JCX0KLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBSUEMgd3JpdGUgZm9yIHJlbGVhc2UgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCX0KLQotCS8qIEFsbG93IHNsZWVwLiAqLwotCXBtX3Fvc191cGRhdGVfcmVxdWVzdCgmYXVkaW8tPnBtX3Fvc19yZXEsIFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQl3YWtlX3VubG9jaygmYXVkaW8tPnN1c3BlbmRfbG9jayk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX212c19wcm9jZXNzX3JwY19yZXF1ZXN0KHVpbnQzMl90IHByb2NlZHVyZSwKLQkJCQkJICB1aW50MzJfdCB4aWQsCi0JCQkJCSAgdm9pZCAqZGF0YSwKLQkJCQkJICB1aW50MzJfdCBsZW5ndGgsCi0JCQkJCSAgc3RydWN0IGF1ZGlvX212c19pbmZvX3R5cGUgKmF1ZGlvKQotewotCWludCByYyA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQlzd2l0Y2ggKHByb2NlZHVyZSkgewotCWNhc2UgTVZTX0VWRU5UX0NCX1RZUEVfUFJPQzogewotCQlzdHJ1Y3QgYXVkaW9fbXZzX2NiX2Z1bmNfYXJncyAqYXJncyA9IGRhdGE7Ci0JCXN0cnVjdCBycGNfcmVwbHlfaGRyIHJlcGx5X2hkcjsKLQotCQlwcl9kZWJ1ZygiJXM6IE1WUyBDQiBDQl9GVU5DX0lEIDB4JXhcbiIsCi0JCQkgX19mdW5jX18sIGJlMzJfdG9fY3B1KGFyZ3MtPmNiX2Z1bmNfaWQpKTsKLQotCQlpZiAoYmUzMl90b19jcHUoYXJncy0+dmFsaWRfcHRyKSkgewotCQkJdWludDMyX3QgZXZlbnRfdHlwZSA9IGJlMzJfdG9fY3B1KGFyZ3MtPmV2ZW50KTsKLQotCQkJcHJfZGVidWcoIiVzOiBNVlMgQ0IgZXZlbnQgdHlwZSAlZFxuIiwKLQkJCQkgX19mdW5jX18sIGJlMzJfdG9fY3B1KGFyZ3MtPmV2ZW50KSk7Ci0KLQkJCWlmIChldmVudF90eXBlID09IEFVRElPX01WU19DT01NQU5EKSB7Ci0JCQkJdWludDMyX3QgY21kX3N0YXR1cyA9IGJlMzJfdG9fY3B1KAotCQkJYXJncy0+ZXZlbnRfZGF0YS5tdnNfZXZfY29tbWFuZF90eXBlLmNtZF9zdGF0dXMpOwotCi0JCQkJcHJfZGVidWcoIiVzOiBNVlMgQ0IgY29tbWFuZCBzdGF0dXMgJWRcbiIsCi0JCQkJCSBfX2Z1bmNfXywgY21kX3N0YXR1cyk7Ci0KLQkJCQlpZiAoY21kX3N0YXR1cyA9PSBBVURJT19NVlNfQ01EX1NVQ0NFU1MpIHsKLQkJCQkJYXVkaW8tPnJwY19zdGF0dXMgPSBSUENfU1RBVFVTX1NVQ0NFU1M7Ci0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQl9Ci0KLQkJCX0gZWxzZSBpZiAoZXZlbnRfdHlwZSA9PSBBVURJT19NVlNfTU9ERSkgewotCQkJCXVpbnQzMl90IG1vZGVfc3RhdHVzID0gYmUzMl90b19jcHUoCi0JCQkJYXJncy0+ZXZlbnRfZGF0YS5tdnNfZXZfbW9kZV90eXBlLm1vZGVfc3RhdHVzKTsKLQotCQkJCXByX2RlYnVnKCIlczogTVZTIENCIG1vZGUgc3RhdHVzICVkXG4iLAotCQkJCQkgX19mdW5jX18sIG1vZGVfc3RhdHVzKTsKLQotCQkJCWlmIChtb2RlX3N0YXR1cyA9PSBBVURJT19NVlNfTU9ERV9SRUFEWSkgewotCQkJCQlhdWRpby0+cnBjX3N0YXR1cyA9IFJQQ19TVEFUVVNfU1VDQ0VTUzsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPm1vZGVfd2FpdCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlwcl9lcnIoIiVzOiBNVlMgQ0IgdW5rbm93biBldmVudCB0eXBlICVkXG4iLAotCQkJCSAgICAgICBfX2Z1bmNfXywgZXZlbnRfdHlwZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBNVlMgQ0IgZXZlbnQgcG9pbnRlciBub3QgdmFsaWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18pOwotCQl9Ci0KLQkJLyogU2VuZCBhY2sgdG8gbW9kZW0uICovCi0JCW1lbXNldCgmcmVwbHlfaGRyLCAwLCBzaXplb2YocmVwbHlfaGRyKSk7Ci0JCXJlcGx5X2hkci54aWQgPSBjcHVfdG9fYmUzMih4aWQpOwotCQlyZXBseV9oZHIudHlwZSA9IGNwdV90b19iZTMyKFJQQ19UWVBFX1JFUExZKTsKLQkJcmVwbHlfaGRyLnJlcGx5X3N0YXQgPSBjcHVfdG9fYmUzMihSUENNU0dfUkVQTFlTVEFUX0FDQ0VQVEVEKTsKLQotCQlyZXBseV9oZHIuZGF0YS5hY2NfaGRyLmFjY2VwdF9zdGF0ID0gY3B1X3RvX2JlMzIoCi0JCQlSUENfQUNDRVBUU1RBVF9TVUNDRVNTKTsKLQkJcmVwbHlfaGRyLmRhdGEuYWNjX2hkci52ZXJmX2ZsYXZvciA9IDA7Ci0JCXJlcGx5X2hkci5kYXRhLmFjY19oZHIudmVyZl9sZW5ndGggPSAwOwotCi0JCXJjID0gbXNtX3JwY193cml0ZShhdWRpby0+cnBjX2VuZHB0LAotCQkJCSAgICZyZXBseV9oZHIsCi0JCQkJICAgc2l6ZW9mKHJlcGx5X2hkcikpOwotCi0JCWlmIChyYyA8IDApCi0JCQlwcl9lcnIoIiVzOiBSUEMgd3JpdGUgZm9yIHJlc3BvbnNlIGZhaWxlZCAlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcmMpOwotCi0JCWJyZWFrOwotCX0KLQotCWNhc2UgTVZTX1BBQ0tFVF9VTF9GTl9UWVBFX1BST0M6IHsKLQkJdWludDMyX3QgKmFyZ3MgPSBkYXRhOwotCQl1aW50MzJfdCBwa3RfbGVuOwotCQl1aW50MzJfdCBmcmFtZV9tb2RlOwotCQlzdHJ1Y3QgYXVkaW9fbXZzX3VsX3JlcGx5IHVsX3JlcGx5OwotCQlzdHJ1Y3QgYXVkaW9fbXZzX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0KLQkJcHJfZGVidWcoIiVzOiBNVlMgVUwgQ0JfRlVOQ19JRCAweCV4XG4iLAotCQkJIF9fZnVuY19fLCBiZTMyX3RvX2NwdSgqYXJncykpOwotCQlhcmdzKys7Ci0KLQkJcGt0X2xlbiA9IGJlMzJfdG9fY3B1KCphcmdzKTsKLQkJcHJfZGVidWcoIiVzOiBVTCBwa3RfbGVuICVkXG4iLCBfX2Z1bmNfXywgcGt0X2xlbik7Ci0JCWFyZ3MrKzsKLQotCQkvKiBDb3B5IHRoZSB2b2NvZGVyIHBhY2tldHMuICovCi0JCW11dGV4X2xvY2soJmF1ZGlvLT5vdXRfbG9jayk7Ci0KLQkJaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+ZnJlZV9vdXRfcXVldWUpKSB7Ci0JCQlidWZfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX291dF9xdWV1ZSwKLQkJCQkJCSAgICBzdHJ1Y3QgYXVkaW9fbXZzX2J1Zl9ub2RlLAotCQkJCQkJICAgIGxpc3QpOwotCQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKLQotCQkJbWVtY3B5KCZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdFswXSwgYXJncywgcGt0X2xlbik7Ci0JCQlidWZfbm9kZS0+ZnJhbWUubGVuID0gcGt0X2xlbjsKLQkJCXBrdF9sZW4gPSBBTElHTihwa3RfbGVuLCA0KTsKLQkJCWFyZ3MgPSBhcmdzICsgcGt0X2xlbi80OwotCi0JCQlwcl9kZWJ1ZygiJXM6IFVMIHZhbGlkX3B0ciAweCV4XG4iLAotCQkJCSBfX2Z1bmNfXywgYmUzMl90b19jcHUoKmFyZ3MpKTsKLQkJCWFyZ3MrKzsKLQotCQkJZnJhbWVfbW9kZSA9IGJlMzJfdG9fY3B1KCphcmdzKTsKLQkJCXByX2RlYnVnKCIlczogVUwgZnJhbWVfbW9kZSAlZFxuIiwKLQkJCQkgX19mdW5jX18sIGZyYW1lX21vZGUpOwotCQkJYXJncysrOwotCi0JCQlwcl9kZWJ1ZygiJXM6IFVMIGZyYW1lX21vZGUgJWRcbiIsCi0JCQkJIF9fZnVuY19fLCBiZTMyX3RvX2NwdSgqYXJncykpOwotCQkJYXJncysrOwotCi0JCQlwcl9kZWJ1ZygiJXM6IFVMIGZyYW1lX21vZGUgJWRcbiIsCi0JCQkJIF9fZnVuY19fLCBiZTMyX3RvX2NwdSgqYXJncykpOwotCQkJYXJncysrOwotCi0JCQlwcl9kZWJ1ZygiJXM6IFVMIG12c19tb2RlICVkXG4iLAotCQkJCSBfX2Z1bmNfXywgYmUzMl90b19jcHUoKmFyZ3MpKTsKLQkJCWFyZ3MrKzsKLQotCQkJcHJfZGVidWcoIiVzOiBVTCBidWZfZnJlZV9jbnQgJWRcbiIsCi0JCQkJIF9fZnVuY19fLCBiZTMyX3RvX2NwdSgqYXJncykpOwotCQkJYXJncysrOwotCi0JCQlpZiAoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9BTVJfVUwpIHsKLQkJCQkvKiBFeHRyYWN0IEFNUiBmcmFtZSB0eXBlLiAqLwotCQkJCWJ1Zl9ub2RlLT5mcmFtZS5mcmFtZV90eXBlID0gYmUzMl90b19jcHUoKmFyZ3MpOwotCi0JCQkJcHJfZGVidWcoIiVzOiBVTCBBTVIgZnJhbWVfdHlwZSAlZFxuIiwKLQkJCQkJIF9fZnVuY19fLCBiZTMyX3RvX2NwdSgqYXJncykpOwotCQkJfSBlbHNlIGlmIChmcmFtZV9tb2RlID09IE1WU19GUkFNRV9NT0RFX1BDTV9VTCkgewotCQkJCS8qIFBDTSBkb24ndCBoYXZlIGZyYW1lX3R5cGUgKi8KLQkJCQlidWZfbm9kZS0+ZnJhbWUuZnJhbWVfdHlwZSA9IDA7Ci0JCQl9IGVsc2UgaWYgKGZyYW1lX21vZGUgPT0gTVZTX0ZSQU1FX01PREVfVk9DX1RYKSB7Ci0JCQkJLyogRXh0cmFjdGluZyBFVlJDIGN1cnJlbnQgYnVmZmVyIGZyYW1lIHJhdGUqLwotCQkJCWJ1Zl9ub2RlLT5mcmFtZS5mcmFtZV90eXBlID0gYmUzMl90b19jcHUoKmFyZ3MpOwotCi0JCQkJcHJfZGVidWcoIiVzOiBVTCBFVlJDIGZyYW1lX3R5cGUgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCBiZTMyX3RvX2NwdSgqYXJncykpOwotCQkJfSBlbHNlIGlmIChmcmFtZV9tb2RlID09IE1WU19GUkFNRV9NT0RFX0c3MTFfVUwpIHsKLQkJCQkvKiBFeHRyYWN0IEc3MTEgZnJhbWUgdHlwZS4gKi8KLQkJCQlidWZfbm9kZS0+ZnJhbWUuZnJhbWVfdHlwZSA9IGJlMzJfdG9fY3B1KCphcmdzKTsKLQotCQkJCXByX2RlYnVnKCIlczogVUwgRzcxMSBmcmFtZV90eXBlICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYmUzMl90b19jcHUoKmFyZ3MpKTsKLQkJCX0gZWxzZSBpZiAoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9HNzI5QV9VTCkgewotCQkJCS8qIEV4dHJhY3QgRzcyOSBmcmFtZSB0eXBlLiAqLwotCQkJCWJ1Zl9ub2RlLT5mcmFtZS5mcmFtZV90eXBlID0gYmUzMl90b19jcHUoKmFyZ3MpOwotCi0JCQkJcHJfZGVidWcoIiVzOiBVTCBHNzI5IGZyYW1lX3R5cGUgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCBiZTMyX3RvX2NwdSgqYXJncykpOwotCQkJfSBlbHNlIGlmIChmcmFtZV9tb2RlID09IE1WU19GUkFNRV9NT0RFX0c3MjJfVUwpIHsKLQkJCQkvKiBFeHRyYWN0IEc3MjIgZnJhbWUgdHlwZS4gKi8KLQkJCQlidWZfbm9kZS0+ZnJhbWUuZnJhbWVfdHlwZSA9IGJlMzJfdG9fY3B1KCphcmdzKTsKLQotCQkJCXByX2RlYnVnKCIlczogVUwgRzcyMiBmcmFtZV90eXBlICVkXG4iLAotCQkJCSAgICAgICBfX2Z1bmNfXywgYmUzMl90b19jcHUoKmFyZ3MpKTsKLQkJCX0gZWxzZSBpZiAoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9HNzExQV9VTCkgewotCQkJCS8qIEV4dHJhY3QgRzcxMUEgZnJhbWUgdHlwZS4gKi8KLQkJCQlidWZfbm9kZS0+ZnJhbWUuZnJhbWVfdHlwZSA9IGJlMzJfdG9fY3B1KCphcmdzKTsKLQotCQkJCXByX2RlYnVnKCIlczogVUwgRzcxMUEgZnJhbWVfdHlwZSAlZFxuIiwKLQkJCQkgICAgICAgX19mdW5jX18sIGJlMzJfdG9fY3B1KCphcmdzKSk7Ci0JCQl9IGVsc2UgaWYgKChmcmFtZV9tb2RlID09IE1WU19GUkFNRV9NT0RFX0dTTV9VTCkgfHwKLQkJCQkgICAoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9IUl9VTCkpIHsKLQkJCQkvKiBFeHRyYWN0IEVGUiwgRlIgYW5kIEhSIGZyYW1lIHR5cGUuICovCi0JCQkJYnVmX25vZGUtPmZyYW1lLmZyYW1lX3R5cGUgPSBiZTMyX3RvX2NwdSgqYXJncyk7Ci0KLQkJCQlwcl9kZWJ1ZygiJXM6IFVMIEVGUixGUixIUiBmcmFtZV90eXBlICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYmUzMl90b19jcHUoKmFyZ3MpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJfZGVidWcoIiVzOiBVTCBVbmtub3duIGZyYW1lIG1vZGUgJWRcbiIsCi0JCQkJICAgICAgIF9fZnVuY19fLCBmcmFtZV9tb2RlKTsKLQkJCX0KLQotCQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsICZhdWRpby0+b3V0X3F1ZXVlKTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IFVMIGRhdGEgZHJvcHBlZCwgcmVhZCBpcyBzbG93XG4iLCBfX2Z1bmNfXyk7Ci0JCX0KLQotCQltdXRleF91bmxvY2soJmF1ZGlvLT5vdXRfbG9jayk7Ci0KLQkJd2FrZV91cCgmYXVkaW8tPm91dF93YWl0KTsKLQotCQkvKiBTZW5kIFVMIG1lc3NhZ2UgYWNjZXB0IHRvIG1vZGVtLiAqLwotCQltZW1zZXQoJnVsX3JlcGx5LCAwLCBzaXplb2YodWxfcmVwbHkpKTsKLQkJdWxfcmVwbHkucmVwbHlfaGRyLnhpZCA9IGNwdV90b19iZTMyKHhpZCk7Ci0JCXVsX3JlcGx5LnJlcGx5X2hkci50eXBlID0gY3B1X3RvX2JlMzIoUlBDX1RZUEVfUkVQTFkpOwotCQl1bF9yZXBseS5yZXBseV9oZHIucmVwbHlfc3RhdCA9IGNwdV90b19iZTMyKAotCQkJUlBDTVNHX1JFUExZU1RBVF9BQ0NFUFRFRCk7Ci0KLQkJdWxfcmVwbHkucmVwbHlfaGRyLmRhdGEuYWNjX2hkci5hY2NlcHRfc3RhdCA9IGNwdV90b19iZTMyKAotCQkJUlBDX0FDQ0VQVFNUQVRfU1VDQ0VTUyk7Ci0JCXVsX3JlcGx5LnJlcGx5X2hkci5kYXRhLmFjY19oZHIudmVyZl9mbGF2b3IgPSAwOwotCQl1bF9yZXBseS5yZXBseV9oZHIuZGF0YS5hY2NfaGRyLnZlcmZfbGVuZ3RoID0gMDsKLQotCQl1bF9yZXBseS52YWxpZF9wa3Rfc3RhdHVzX3B0ciA9IGNwdV90b19iZTMyKDB4MDAwMDAwMDEpOwotCQl1bF9yZXBseS5wa3Rfc3RhdHVzID0gY3B1X3RvX2JlMzIoMHgwMDAwMDAwMCk7Ci0KLQkJcmMgPSBtc21fcnBjX3dyaXRlKGF1ZGlvLT5ycGNfZW5kcHQsCi0JCQkJICAgJnVsX3JlcGx5LAotCQkJCSAgIHNpemVvZih1bF9yZXBseSkpOwotCi0JCWlmIChyYyA8IDApCi0JCQlwcl9lcnIoIiVzOiBSUEMgd3JpdGUgZm9yIFVMIHJlc3BvbnNlIGZhaWxlZCAlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcmMpOwotCi0JCWJyZWFrOwotCX0KLQotCWNhc2UgTVZTX1BBQ0tFVF9ETF9GTl9UWVBFX1BST0M6IHsKLQkJc3RydWN0IGF1ZGlvX212c19kbF9jYl9mdW5jX2FyZ3MgKmFyZ3MgPSBkYXRhOwotCQlzdHJ1Y3QgYXVkaW9fbXZzX2RsX3JlcGx5IGRsX3JlcGx5OwotCQl1aW50MzJfdCBmcmFtZV9tb2RlOwotCQlzdHJ1Y3QgYXVkaW9fbXZzX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0KLQkJcHJfZGVidWcoIiVzOiBNVlMgREwgQ0IgQ0JfRlVOQ19JRCAweCV4XG4iLAotCQkJIF9fZnVuY19fLCBiZTMyX3RvX2NwdShhcmdzLT5jYl9mdW5jX2lkKSk7Ci0KLQkJZnJhbWVfbW9kZSA9IGJlMzJfdG9fY3B1KGFyZ3MtPmZyYW1lX21vZGUpOwotCQlwcl9kZWJ1ZygiJXM6IERMIGZyYW1lX21vZGUgJWRcbiIsIF9fZnVuY19fLCBmcmFtZV9tb2RlKTsKLQotCQkvKiBQcmVwYXJlIGFuZCBzZW5kIHRoZSBETCBwYWNrZXRzIHRvIG1vZGVtLiAqLwotCQltZW1zZXQoJmRsX3JlcGx5LCAwLCBzaXplb2YoZGxfcmVwbHkpKTsKLQkJZGxfcmVwbHkucmVwbHlfaGRyLnhpZCA9IGNwdV90b19iZTMyKHhpZCk7Ci0JCWRsX3JlcGx5LnJlcGx5X2hkci50eXBlID0gY3B1X3RvX2JlMzIoUlBDX1RZUEVfUkVQTFkpOwotCQlkbF9yZXBseS5yZXBseV9oZHIucmVwbHlfc3RhdCA9IGNwdV90b19iZTMyKAotCQkJUlBDTVNHX1JFUExZU1RBVF9BQ0NFUFRFRCk7Ci0KLQkJZGxfcmVwbHkucmVwbHlfaGRyLmRhdGEuYWNjX2hkci5hY2NlcHRfc3RhdCA9IGNwdV90b19iZTMyKAotCQkJUlBDX0FDQ0VQVFNUQVRfU1VDQ0VTUyk7Ci0JCWRsX3JlcGx5LnJlcGx5X2hkci5kYXRhLmFjY19oZHIudmVyZl9mbGF2b3IgPSAwOwotCQlkbF9yZXBseS5yZXBseV9oZHIuZGF0YS5hY2NfaGRyLnZlcmZfbGVuZ3RoID0gMDsKLQotCQltdXRleF9sb2NrKCZhdWRpby0+aW5fbG9jayk7Ci0KLQkJaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+aW5fcXVldWUpKSB7Ci0JCQlidWZfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5pbl9xdWV1ZSwKLQkJCQkJCSAgICBzdHJ1Y3QgYXVkaW9fbXZzX2J1Zl9ub2RlLAotCQkJCQkJICAgIGxpc3QpOwotCQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKLQotCQkJbWVtY3B5KCZkbF9yZXBseS52b2NfcGt0LAotCQkJICAgICAgICZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdFswXSwKLQkJCSAgICAgICBidWZfbm9kZS0+ZnJhbWUubGVuKTsKLQotCQkJcHJfZGVidWcoIiVzOmZyYW1lIG1vZGUgJWRcbiIsIF9fZnVuY19fLCBmcmFtZV9tb2RlKTsKLQkJCWlmIChmcmFtZV9tb2RlID09IE1WU19GUkFNRV9NT0RFX0FNUl9ETCkgewotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5nbnJfYXJnLnBhcmFtMSA9IGNwdV90b19iZTMyKAotCQkJCQlidWZfbm9kZS0+ZnJhbWUuZnJhbWVfdHlwZSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGFyYW0yID0KLQkJCQkJCWNwdV90b19iZTMyKGF1ZGlvLT5yYXRlX3R5cGUpOwotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5cCi0JCQkJCQlnbnJfYXJnLnZhbGlkX3BrdF9zdGF0dXNfcHRyID0KLQkJCQkJCQljcHVfdG9fYmUzMigweDAwMDAwMDAxKTsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZ25yX2FyZy5wa3Rfc3RhdHVzID0KLQkJCQkJY3B1X3RvX2JlMzIoQVVESU9fTVZTX1BLVF9OT1JNQUwpOwotCQkJfSBlbHNlIGlmIChmcmFtZV9tb2RlID09IE1WU19GUkFNRV9NT0RFX1BDTV9ETCkgewotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5nbnJfYXJnLnBhcmFtMSA9IDA7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGFyYW0yID0gMDsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uXAotCQkJCQkJZ25yX2FyZy52YWxpZF9wa3Rfc3RhdHVzX3B0ciA9Ci0JCQkJCQkJY3B1X3RvX2JlMzIoMHgwMDAwMDAwMSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGt0X3N0YXR1cyA9Ci0JCQkJCWNwdV90b19iZTMyKEFVRElPX01WU19QS1RfTk9STUFMKTsKLQkJCX0gZWxzZSBpZiAoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9WT0NfUlgpIHsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZ25yX2FyZy5wYXJhbTEgPQotCQkJCWNwdV90b19iZTMyKGJ1Zl9ub2RlLT5mcmFtZS5mcmFtZV90eXBlKTsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZ25yX2FyZy5wYXJhbTIgPSAwOwotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5cCi0JCQkJCQlnbnJfYXJnLnZhbGlkX3BrdF9zdGF0dXNfcHRyID0KLQkJCQkJCQljcHVfdG9fYmUzMigweDAwMDAwMDAxKTsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZ25yX2FyZy5wa3Rfc3RhdHVzID0KLQkJCQkJY3B1X3RvX2JlMzIoQVVESU9fTVZTX1BLVF9OT1JNQUwpOwotCQkJfSBlbHNlIGlmIChmcmFtZV9tb2RlID09IE1WU19GUkFNRV9NT0RFX0c3MTFfREwpIHsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZzcxMV9hcmcucGFyYW0xID0KLQkJCQljcHVfdG9fYmUzMihidWZfbm9kZS0+ZnJhbWUuZnJhbWVfdHlwZSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLlwKLQkJCQkJCWc3MTFfYXJnLnZhbGlkX3BrdF9zdGF0dXNfcHRyID0KLQkJCQkJCQljcHVfdG9fYmUzMigweDAwMDAwMDAxKTsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZzcxMV9hcmcucGt0X3N0YXR1cyA9Ci0JCQkJCWNwdV90b19iZTMyKEFVRElPX01WU19QS1RfTk9STUFMKTsKLQkJCX0gZWxzZSBpZiAoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9HNzI5QV9ETCkgewotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5nbnJfYXJnLnBhcmFtMSA9IGNwdV90b19iZTMyKAotCQkJCSAgICAgICBidWZfbm9kZS0+ZnJhbWUuZnJhbWVfdHlwZSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGFyYW0yID0KLQkJCQkJCWNwdV90b19iZTMyKGF1ZGlvLT5yYXRlX3R5cGUpOwotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5cCi0JCQkJCQlnbnJfYXJnLnZhbGlkX3BrdF9zdGF0dXNfcHRyID0KLQkJCQkJCQljcHVfdG9fYmUzMigweDAwMDAwMDAxKTsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZ25yX2FyZy5wa3Rfc3RhdHVzID0KLQkJCQkJY3B1X3RvX2JlMzIoQVVESU9fTVZTX1BLVF9OT1JNQUwpOwotCQkJfSBlbHNlIGlmIChmcmFtZV9tb2RlID09IE1WU19GUkFNRV9NT0RFX0c3MjJfREwpIHsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZ25yX2FyZy5wYXJhbTEgPSBjcHVfdG9fYmUzMigKLQkJCQkgICAgICBidWZfbm9kZS0+ZnJhbWUuZnJhbWVfdHlwZSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGFyYW0yID0KLQkJCQkJCWNwdV90b19iZTMyKGF1ZGlvLT5yYXRlX3R5cGUpOwotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5cCi0JCQkJCQlnbnJfYXJnLnZhbGlkX3BrdF9zdGF0dXNfcHRyID0KLQkJCQkJCQljcHVfdG9fYmUzMigweDAwMDAwMDAxKTsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZ25yX2FyZy5wa3Rfc3RhdHVzID0KLQkJCQkJY3B1X3RvX2JlMzIoQVVESU9fTVZTX1BLVF9OT1JNQUwpOwotCQkJfSBlbHNlIGlmIChmcmFtZV9tb2RlID09IE1WU19GUkFNRV9NT0RFX0c3MTFBX0RMKSB7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGFyYW0xID0gY3B1X3RvX2JlMzIoCi0JCQkJICAgICAgIGJ1Zl9ub2RlLT5mcmFtZS5mcmFtZV90eXBlKTsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZ25yX2FyZy5wYXJhbTIgPQotCQkJCQkJY3B1X3RvX2JlMzIoYXVkaW8tPnJhdGVfdHlwZSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLlwKLQkJCQkJCWducl9hcmcudmFsaWRfcGt0X3N0YXR1c19wdHIgPQotCQkJCQkJCWNwdV90b19iZTMyKDB4MDAwMDAwMDEpOwotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5nbnJfYXJnLnBrdF9zdGF0dXMgPQotCQkJCQljcHVfdG9fYmUzMihBVURJT19NVlNfUEtUX05PUk1BTCk7Ci0JCQl9IGVsc2UgaWYgKChmcmFtZV9tb2RlID09IE1WU19GUkFNRV9NT0RFX0dTTV9ETCkgfHwKLQkJCQkgICAoZnJhbWVfbW9kZSA9PSBNVlNfRlJBTUVfTU9ERV9IUl9ETCkpIHsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZ25yX2FyZy5wYXJhbTEgPSBjcHVfdG9fYmUzMigKLQkJCQkgICAgICAgYnVmX25vZGUtPmZyYW1lLmZyYW1lX3R5cGUpOwotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5nbnJfYXJnLnBhcmFtMiA9Ci0JCQkJCQljcHVfdG9fYmUzMihhdWRpby0+cmF0ZV90eXBlKTsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uXAotCQkJCQkJZ25yX2FyZy52YWxpZF9wa3Rfc3RhdHVzX3B0ciA9Ci0JCQkJCQkJY3B1X3RvX2JlMzIoMHgwMDAwMDAwMSk7Ci0JCQkJZGxfcmVwbHkuY2RjX3BhcmFtLmducl9hcmcucGt0X3N0YXR1cyA9Ci0JCQkJCWNwdV90b19iZTMyKEFVRElPX01WU19QS1RfTk9STUFMKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJfZXJyKCIlczogREwgVW5rbm93biBmcmFtZSBtb2RlICVkXG4iLAotCQkJCSAgICAgICBfX2Z1bmNfXywgZnJhbWVfbW9kZSk7Ci0JCQl9Ci0JCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwgJmF1ZGlvLT5mcmVlX2luX3F1ZXVlKTsKLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCIlczogTm8gREwgZGF0YSBhdmFpbGFibGUgdG8gc2VuZCB0byBNVlNcbiIsCi0JCQkJIF9fZnVuY19fKTsKLQkJCWlmIChmcmFtZV9tb2RlID09IE1WU19GUkFNRV9NT0RFX0c3MTFfREwpIHsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uXAotCQkJCQkJZzcxMV9hcmcudmFsaWRfcGt0X3N0YXR1c19wdHIgPQotCQkJCQkJCWNwdV90b19iZTMyKDB4MDAwMDAwMDEpOwotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5nNzExX2FyZy5wa3Rfc3RhdHVzID0KLQkJCQkJCWNwdV90b19iZTMyKEFVRElPX01WU19QS1RfU0xPVyk7Ci0JCQl9IGVsc2UgewotCQkJCWRsX3JlcGx5LmNkY19wYXJhbS5cCi0JCQkJCQlnbnJfYXJnLnZhbGlkX3BrdF9zdGF0dXNfcHRyID0KLQkJCQkJCQljcHVfdG9fYmUzMigweDAwMDAwMDAxKTsKLQkJCQlkbF9yZXBseS5jZGNfcGFyYW0uZ25yX2FyZy5wa3Rfc3RhdHVzID0KLQkJCQkJCWNwdV90b19iZTMyKEFVRElPX01WU19QS1RfU0xPVyk7Ci0JCQl9Ci0JCX0KLQotCQltdXRleF91bmxvY2soJmF1ZGlvLT5pbl9sb2NrKTsKLQotCQlkbF9yZXBseS52YWxpZF9mcmFtZV9pbmZvX3B0ciA9IGNwdV90b19iZTMyKDB4MDAwMDAwMDEpOwotCi0JCWRsX3JlcGx5LmZyYW1lX21vZGUgPSBjcHVfdG9fYmUzMihhdWRpby0+ZnJhbWVfbW9kZSk7Ci0JCWRsX3JlcGx5LmZyYW1lX21vZGVfYWdhaW4gPSBjcHVfdG9fYmUzMihhdWRpby0+ZnJhbWVfbW9kZSk7Ci0KLQkJZGxfcmVwbHkuZnJhbWVfaW5mb19oZHIuZnJhbWVfbW9kZSA9Ci0JCQljcHVfdG9fYmUzMihhdWRpby0+ZnJhbWVfbW9kZSk7Ci0JCWRsX3JlcGx5LmZyYW1lX2luZm9faGRyLm12c19tb2RlID0gY3B1X3RvX2JlMzIoYXVkaW8tPm12c19tb2RlKTsKLQkJZGxfcmVwbHkuZnJhbWVfaW5mb19oZHIuYnVmX2ZyZWVfY250ID0gMDsKLQotCQlyYyA9IG1zbV9ycGNfd3JpdGUoYXVkaW8tPnJwY19lbmRwdCwKLQkJCQkgICAmZGxfcmVwbHksCi0JCQkJICAgc2l6ZW9mKGRsX3JlcGx5KSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCXByX2VycigiJXM6IFJQQyB3cml0ZSBmb3IgREwgcmVzcG9uc2UgZmFpbGVkICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCByYyk7Ci0KLQkJYnJlYWs7Ci0JfQotCi0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogVW5rbm93biBDQiB0eXBlICVkXG4iLCBfX2Z1bmNfXywgcHJvY2VkdXJlKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fbXZzX3RocmVhZCh2b2lkICpkYXRhKQotewotCXN0cnVjdCBhdWRpb19tdnNfaW5mb190eXBlICphdWRpbyA9IGRhdGE7Ci0Jc3RydWN0IHJwY19yZXF1ZXN0X2hkciAqcnBjX2hkciA9IE5VTEw7Ci0KLQlwcl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0KLQkJaW50IHJwY19oZHJfbGVuID0gbXNtX3JwY19yZWFkKGF1ZGlvLT5ycGNfZW5kcHQsCi0JCQkJCSAgICAgICAodm9pZCAqKikgJnJwY19oZHIsCi0JCQkJCSAgICAgICAtMSwKLQkJCQkJICAgICAgIC0xKTsKLQotCQlpZiAocnBjX2hkcl9sZW4gPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBSUEMgcmVhZCBmYWlsZWQgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJwY19oZHJfbGVuKTsKLQotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAocnBjX2hkcl9sZW4gPCBSUENfQ09NTU9OX0hEUl9TWikgewotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQl1aW50MzJfdCBycGNfdHlwZSA9IGJlMzJfdG9fY3B1KHJwY19oZHItPnR5cGUpOwotCQkJaWYgKHJwY190eXBlID09IFJQQ19UWVBFX1JFUExZKSB7Ci0JCQkJc3RydWN0IHJwY19yZXBseV9oZHIgKnJwY19yZXBseSA9Ci0JCQkJCSh2b2lkICopIHJwY19oZHI7Ci0JCQkJdWludDMyX3QgcmVwbHlfc3RhdHVzOwotCi0JCQkJaWYgKHJwY19oZHJfbGVuIDwgUlBDX1JFUExZX0hEUl9TWikKLQkJCQkJY29udGludWU7Ci0KLQkJCQlyZXBseV9zdGF0dXMgPQotCQkJCQliZTMyX3RvX2NwdShycGNfcmVwbHktPnJlcGx5X3N0YXQpOwotCi0JCQkJaWYgKHJlcGx5X3N0YXR1cyAhPSBSUENNU0dfUkVQTFlTVEFUX0FDQ0VQVEVEKSB7Ci0JCQkJCS8qIElmIHRoZSBjb21tYW5kIGlzIG5vdCBhY2NlcHRlZCwgdGhlcmUKLQkJCQkJICogd2lsbCBiZSBubyByZXNwb25zZSBjYWxsYmFjay4gV2FrZQotCQkJCQkgKiB0aGUgY2FsbGVyIGFuZCByZXBvcnQgZXJyb3IuICovCi0JCQkJCWF1ZGlvLT5ycGNfc3RhdHVzID0gUlBDX1NUQVRVU19SRUpFQ1Q7Ci0KLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCi0JCQkJCXByX2VycigiJXM6IFJQQyByZXBseSBzdGF0dXMgZGVuaWVkXG4iLAotCQkJCQkgICAgICAgX19mdW5jX18pOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAocnBjX3R5cGUgPT0gUlBDX1RZUEVfUkVRVUVTVCkgewotCQkJCWlmIChycGNfaGRyX2xlbiA8IFJQQ19SRVFVRVNUX0hEUl9TWikKLQkJCQkJY29udGludWU7Ci0KLQkJCQlhdWRpb19tdnNfcHJvY2Vzc19ycGNfcmVxdWVzdCgKLQkJCQkJYmUzMl90b19jcHUocnBjX2hkci0+cHJvY2VkdXJlKSwKLQkJCQkJYmUzMl90b19jcHUocnBjX2hkci0+eGlkKSwKLQkJCQkJKHZvaWQgKikgKHJwY19oZHIgKyAxKSwKLQkJCQkJKHJwY19oZHJfbGVuIC0gc2l6ZW9mKCpycGNfaGRyKSksCi0JCQkJCWF1ZGlvKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJfZXJyKCIlczogVW5leHBlY3RlZCBSUEMgdHlwZSAlZFxuIiwKLQkJCQkgICAgICAgX19mdW5jX18sIHJwY190eXBlKTsKLQkJCX0KLQkJfQotCi0JCWtmcmVlKHJwY19oZHIpOwotCQlycGNfaGRyID0gTlVMTDsKLQl9Ci0KLQlwcl9pbmZvKCIlczogTVZTIHRocmVhZCBzdG9wcGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19tdnNfYWxsb2NfYnVmKHN0cnVjdCBhdWRpb19tdnNfaW5mb190eXBlICphdWRpbykKLXsKLQlpbnQgaSA9IDA7Ci0Jc3RydWN0IGF1ZGlvX212c19idWZfbm9kZSAqYnVmX25vZGUgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbmV4dCA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiBBbGxvY2F0ZSBpbnB1dCBidWZmZXJzLiAqLwotCWZvciAoaSA9IDA7IGkgPCBNVlNfTUFYX1FfTEVOOyBpKyspIHsKLQkJCWJ1Zl9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvX212c19idWZfbm9kZSksCi0JCQkJCSAgIEdGUF9LRVJORUwpOwotCi0JCQlpZiAoYnVmX25vZGUgIT0gTlVMTCkgewotCQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LAotCQkJCQkgICAgICAmYXVkaW8tPmZyZWVfaW5fcXVldWUpOwotCQkJfSBlbHNlIHsKLQkJCQlwcl9lcnIoIiVzOiBObyBtZW1vcnkgZm9yIElPIGJ1ZmZlcnNcbiIsCi0JCQkJICAgICAgIF9fZnVuY19fKTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJCWJ1Zl9ub2RlID0gTlVMTDsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVycy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgTVZTX01BWF9RX0xFTjsgaSsrKSB7Ci0JCQlidWZfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpb19tdnNfYnVmX25vZGUpLAotCQkJCQkgICBHRlBfS0VSTkVMKTsKLQotCQkJaWYgKGJ1Zl9ub2RlICE9IE5VTEwpIHsKLQkJCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwKLQkJCQkJICAgICAgJmF1ZGlvLT5mcmVlX291dF9xdWV1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXByX2VycigiJXM6IE5vIG1lbW9yeSBmb3IgSU8gYnVmZmVyc1xuIiwKLQkJCQkgICAgICAgX19mdW5jX18pOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQkJYnVmX25vZGUgPSBOVUxMOwotCX0KLQotCXJldHVybiAwOwotCi1lcnI6Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2luX3F1ZXVlKSB7Ci0JCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhdWRpb19tdnNfYnVmX25vZGUsIGxpc3QpOwotCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCQlrZnJlZShidWZfbm9kZSk7Ci0JCWJ1Zl9ub2RlID0gTlVMTDsKLQl9Ci0KLQlwdHIgPSBuZXh0ID0gTlVMTDsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmZyZWVfb3V0X3F1ZXVlKSB7Ci0JCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhdWRpb19tdnNfYnVmX25vZGUsIGxpc3QpOwotCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCQlrZnJlZShidWZfbm9kZSk7Ci0JCWJ1Zl9ub2RlID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fbXZzX2ZyZWVfYnVmKHN0cnVjdCBhdWRpb19tdnNfaW5mb190eXBlICphdWRpbykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBOVUxMOwotCXN0cnVjdCBhdWRpb19tdnNfYnVmX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKLQotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5pbl9sb2NrKTsKLQkvKiBGcmVlIGlucHV0IGJ1ZmZlcnMuICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5pbl9xdWV1ZSkgewotCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXVkaW9fbXZzX2J1Zl9ub2RlLCBsaXN0KTsKLQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKLQkJa2ZyZWUoYnVmX25vZGUpOwotCQlidWZfbm9kZSA9IE5VTEw7Ci0JfQotCi0JcHRyID0gbmV4dCA9IE5VTEw7Ci0JLyogRnJlZSBmcmVlX2lucHV0IGJ1ZmZlcnMuICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2luX3F1ZXVlKSB7Ci0JCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhdWRpb19tdnNfYnVmX25vZGUsIGxpc3QpOwotCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCQlrZnJlZShidWZfbm9kZSk7Ci0JCWJ1Zl9ub2RlID0gTlVMTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+aW5fbG9jayk7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+b3V0X2xvY2spOwotCXB0ciA9IG5leHQgPSBOVUxMOwotCS8qIEZyZWUgb3V0cHV0IGJ1ZmZlcnMuICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5vdXRfcXVldWUpIHsKLQkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGF1ZGlvX212c19idWZfbm9kZSwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0JCWtmcmVlKGJ1Zl9ub2RlKTsKLQkJYnVmX25vZGUgPSBOVUxMOwotCX0KLQotCS8qIEZyZWUgZnJlZV9pb3V0cHV0IGJ1ZmZlcnMuICovCi0JcHRyID0gbmV4dCA9IE5VTEw7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX291dF9xdWV1ZSkgewotCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXVkaW9fbXZzX2J1Zl9ub2RlLCBsaXN0KTsKLQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKLQkJa2ZyZWUoYnVmX25vZGUpOwotCQlidWZfbm9kZSA9IE5VTEw7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPm91dF9sb2NrKTsKLX0KLQotc3RhdGljIGludCBhdWRpb19tdnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgcmMgPSAwOwotCi0JcHJfaW5mbygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQltdXRleF9sb2NrKCZhdWRpb19tdnNfaW5mby5sb2NrKTsKLQotCWlmIChhdWRpb19tdnNfaW5mby5zdGF0ZSA9PSBBVURJT19NVlNfQ0xPU0VEKSB7Ci0KLQkJaWYgKGF1ZGlvX212c19pbmZvLnRhc2sgIT0gTlVMTCB8fAotCQkJYXVkaW9fbXZzX2luZm8ucnBjX2VuZHB0ICE9IE5VTEwpIHsKLQkJCXJjID0gYXVkaW9fbXZzX2FsbG9jX2J1ZigmYXVkaW9fbXZzX2luZm8pOwotCi0JCQlpZiAocmMgPT0gMCkgewotCQkJCWF1ZGlvX212c19pbmZvLnN0YXRlID0gQVVESU9fTVZTX09QRU5FRDsKLQkJCQlmaWxlLT5wcml2YXRlX2RhdGEgPSAmYXVkaW9fbXZzX2luZm87Ci0JCQl9Ci0JCX0gIGVsc2UgewotCQkJcHJfZXJyKCIlczogTVZTIHRocmVhZCBhbmQgUlBDIGVuZCBwb2ludCBkbyBub3QgZXhpc3RcbiIsCi0JCQkJICAgX19mdW5jX18pOwotCi0JCQlyYyA9IC1FTk9ERVY7Ci0JCX0KLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBNVlMgZHJpdmVyIGV4aXN0cywgc3RhdGUgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgYXVkaW9fbXZzX2luZm8uc3RhdGUpOwotCi0JCXJjID0gLUVCVVNZOwotCX0KLQotCW11dGV4X3VubG9jaygmYXVkaW9fbXZzX2luZm8ubG9jayk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fbXZzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0KLQlzdHJ1Y3QgYXVkaW9fbXZzX2luZm9fdHlwZSAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlwcl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlpZiAoYXVkaW8tPnN0YXRlID09IEFVRElPX01WU19TVEFSVEVEKQotCQlhdWRpb19tdnNfc3RvcChhdWRpbyk7Ci0JYXVkaW9fbXZzX2ZyZWVfYnVmKGF1ZGlvKTsKLQlhdWRpby0+c3RhdGUgPSBBVURJT19NVlNfQ0xPU0VEOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCi0JcHJfZGVidWcoIiVzOiBSZWxlYXNlIGRvbmVcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkaW9fbXZzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgICBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgICAgc2l6ZV90IGNvdW50LAotCQkJICAgICAgbG9mZl90ICpwb3MpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYXVkaW9fbXZzX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGF1ZGlvX212c19pbmZvX3R5cGUgKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+b3V0X3dhaXQsCi0JCQkoIWxpc3RfZW1wdHkoJmF1ZGlvLT5vdXRfcXVldWUpIHx8Ci0JCQkgYXVkaW8tPnN0YXRlID09IEFVRElPX01WU19TVE9QUEVEKSwKLQkJCTEgKiBIWik7Ci0KLQlpZiAocmMgPiAwKSB7Ci0JCW11dGV4X2xvY2soJmF1ZGlvLT5vdXRfbG9jayk7Ci0JCWlmICgoYXVkaW8tPnN0YXRlID09IEFVRElPX01WU19TVEFSVEVEKSAmJgotCQkgICAgKCFsaXN0X2VtcHR5KCZhdWRpby0+b3V0X3F1ZXVlKSkpIHsKLQotCQkJaWYgKGNvdW50ID49IHNpemVvZihzdHJ1Y3QgcTV2Ml9tc21fYXVkaW9fbXZzX2ZyYW1lKSkgewotCQkJCWJ1Zl9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPm91dF9xdWV1ZSwKLQkJCQkJCXN0cnVjdCBhdWRpb19tdnNfYnVmX25vZGUsCi0JCQkJCQlsaXN0KTsKLQkJCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCi0JCQkJcmMgPSBjb3B5X3RvX3VzZXIoYnVmLAotCQkJCQkmYnVmX25vZGUtPmZyYW1lLAotCQkJCQlzaXplb2Yoc3RydWN0IHE1djJfbXNtX2F1ZGlvX212c19mcmFtZSkKLQkJCQkJKTsKLQotCQkJCWlmIChyYyA9PSAwKSB7Ci0JCQkJCXJjID0gYnVmX25vZGUtPmZyYW1lLmxlbiArCi0JCQkJCSAgICBzaXplb2YoYnVmX25vZGUtPmZyYW1lLmZyYW1lX3R5cGUpICsKLQkJCQkJICAgIHNpemVvZihidWZfbm9kZS0+ZnJhbWUubGVuKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwcl9lcnIoIiVzOiBDb3B5IHRvIHVzZXIgcmV0dW5lZCAlZCIsCi0JCQkJCSAgICAgICBfX2Z1bmNfXywgcmMpOwotCi0JCQkJCXJjID0gLUVGQVVMVDsKLQkJCQl9Ci0KLQkJCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwKLQkJCQkJICAgICAgJmF1ZGlvLT5mcmVlX291dF9xdWV1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXByX2VycigiJXM6IFJlYWQgY291bnQgJWQgPCBzaXplb2YoZnJhbWUpICVkIiwKLQkJCQkgICAgICAgX19mdW5jX18sIGNvdW50LAotCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHE1djJfbXNtX2F1ZGlvX212c19mcmFtZSkpOwotCi0JCQkJcmMgPSAtRU5PTUVNOwotCQkJfQotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlczogUmVhZCBwZXJmb3JtZWQgaW4gc3RhdGUgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGF1ZGlvLT5zdGF0ZSk7Ci0KLQkJCXJjID0gLUVQRVJNOwotCQl9Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPm91dF9sb2NrKTsKLQotCX0gZWxzZSBpZiAocmMgPT0gMCkgewotCQlwcl9lcnIoIiVzOiBObyBVTCBkYXRhIGF2YWlsYWJsZVxuIiwgX19mdW5jX18pOwotCi0JCXJjID0gLUVUSU1FRE9VVDsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBSZWFkIHdhcyBpbnRlcnJ1cHRlZFxuIiwgX19mdW5jX18pOwotCi0JCXJjID0gLUVSRVNUQVJUU1lTOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkaW9fbXZzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkgICAgICAgc2l6ZV90IGNvdW50LAotCQkJICAgICAgIGxvZmZfdCAqcG9zKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGF1ZGlvX212c19idWZfbm9kZSAqYnVmX25vZGUgPSBOVUxMOwotCXN0cnVjdCBhdWRpb19tdnNfaW5mb190eXBlICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5pbl9sb2NrKTsKLQlpZiAoYXVkaW8tPnN0YXRlID09IEFVRElPX01WU19TVEFSVEVEKSB7Ci0JCWlmIChjb3VudCA8PSBzaXplb2Yoc3RydWN0IHE1djJfbXNtX2F1ZGlvX212c19mcmFtZSkpIHsKLQkJCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmZyZWVfaW5fcXVldWUpKSB7Ci0JCQkJYnVmX25vZGUgPQotCQkJCQlsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9pbl9xdWV1ZSwKLQkJCQkJCXN0cnVjdCBhdWRpb19tdnNfYnVmX25vZGUsCi0JCQkJCQlsaXN0KTsKLQkJCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCi0JCQkJcmMgPSBjb3B5X2Zyb21fdXNlcigmYnVmX25vZGUtPmZyYW1lLAotCQkJCQkJICAgIGJ1ZiwKLQkJCQkJCSAgICBjb3VudCk7Ci0KLQkJCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwKLQkJCQkJICAgICAgJmF1ZGlvLT5pbl9xdWV1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXByX2VycigiJXM6IE5vIGZyZWUgREwgYnVmZnNcbiIsIF9fZnVuY19fKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IFdyaXRlIGNvdW50ICVkIDwgc2l6ZW9mKGZyYW1lKSAlZCIsCi0JCQkgICAgICAgX19mdW5jX18sIGNvdW50LAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcTV2Ml9tc21fYXVkaW9fbXZzX2ZyYW1lKSk7Ci0KLQkJCXJjID0gLUVOT01FTTsKLQkJfQotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IFdyaXRlIHBlcmZvcm1lZCBpbiBpbnZhbGlkIHN0YXRlICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIGF1ZGlvLT5zdGF0ZSk7Ci0KLQkJcmMgPSAtRVBFUk07Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPmluX2xvY2spOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19tdnNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmMgPSAwOwotCi0Jc3RydWN0IGF1ZGlvX212c19pbmZvX3R5cGUgKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JcHJfaW5mbygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fR0VUX01WU19DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19tdnNfY29uZmlnIGNvbmZpZzsKLQotCQlwcl9kZWJ1ZygiJXM6IElPQ1RMIEdFVF9NVlNfQ09ORklHXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCQljb25maWcubXZzX21vZGUgPSBhdWRpby0+bXZzX21vZGU7Ci0JCWNvbmZpZy5yYXRlX3R5cGUgPSBhdWRpby0+cmF0ZV90eXBlOwotCQljb25maWcubWluX21heF9yYXRlLm1pbl9yYXRlID0gYXVkaW8tPm1pbl9tYXhfcmF0ZS5taW5fcmF0ZTsKLQkJY29uZmlnLm1pbl9tYXhfcmF0ZS5tYXhfcmF0ZSA9IGF1ZGlvLT5taW5fbWF4X3JhdGUubWF4X3JhdGU7Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCi0JCXJjID0gY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY29uZmlnLCBzaXplb2YoY29uZmlnKSk7Ci0JCWlmIChyYyA9PSAwKQotCQkJcmMgPSBzaXplb2YoY29uZmlnKTsKLQkJZWxzZQotCQkJcHJfZXJyKCIlczogQ29uZmlnIGNvcHkgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCi0JCWJyZWFrOwotCX0KLQotCWNhc2UgQVVESU9fU0VUX01WU19DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19tdnNfY29uZmlnIGNvbmZpZzsKLQotCQlwcl9kZWJ1ZygiJXM6IElPQ1RMIFNFVF9NVlNfQ09ORklHXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmMgPSBjb3B5X2Zyb21fdXNlcigmY29uZmlnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNvbmZpZykpOwotCQlpZiAocmMgPT0gMCkgewotCQkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCi0JCQlpZiAoYXVkaW8tPnN0YXRlID09IEFVRElPX01WU19PUEVORUQpIHsKLQkJCQlhdWRpby0+bXZzX21vZGUgPSBjb25maWcubXZzX21vZGU7Ci0JCQkJYXVkaW8tPnJhdGVfdHlwZSA9IGNvbmZpZy5yYXRlX3R5cGU7Ci0JCQkJYXVkaW8tPmR0eF9tb2RlID0gY29uZmlnLmR0eF9tb2RlOwotCQkJCWF1ZGlvLT5taW5fbWF4X3JhdGUubWluX3JhdGUgPQotCQkJCQkJY29uZmlnLm1pbl9tYXhfcmF0ZS5taW5fcmF0ZTsKLQkJCQlhdWRpby0+bWluX21heF9yYXRlLm1heF9yYXRlID0KLQkJCQkJCWNvbmZpZy5taW5fbWF4X3JhdGUubWF4X3JhdGU7Ci0JCQl9IGVsc2UgewotCQkJCXByX2VycigiJXM6IFNldCBjb25mZyBjYWxsZWQgaW4gc3RhdGUgJWRcbiIsCi0JCQkJICAgICAgIF9fZnVuY19fLCBhdWRpby0+c3RhdGUpOwotCi0JCQkJcmMgPSAtRVBFUk07Ci0JCQl9Ci0KLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlczogQ29uZmlnIGNvcHkgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQl9Ci0KLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBBVURJT19TVEFSVDogewotCQlwcl9kZWJ1ZygiJXM6IElPQ1RMIFNUQVJUXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCi0JCWlmIChhdWRpby0+c3RhdGUgPT0gQVVESU9fTVZTX09QRU5FRCB8fAotCQkgICAgYXVkaW8tPnN0YXRlID09IEFVRElPX01WU19TVE9QUEVEKSB7Ci0JCQlyYyA9IGF1ZGlvX212c19zdGFydChhdWRpbyk7Ci0KLQkJCWlmIChyYyAhPSAwKQotCQkJCWF1ZGlvX212c19zdG9wKGF1ZGlvKTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IFN0YXJ0IGNhbGxlZCBpbiBpbnZhbGlkIHN0YXRlICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBhdWRpby0+c3RhdGUpOwotCi0JCQlyYyA9IC1FUEVSTTsKLQkJfQotCi0JCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCi0JCWJyZWFrOwotCX0KLQotCWNhc2UgQVVESU9fU1RPUDogewotCQlwcl9kZWJ1ZygiJXM6IElPQ1RMIFNUT1BcbiIsIF9fZnVuY19fKTsKLQotCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0KLQkJaWYgKGF1ZGlvLT5zdGF0ZSA9PSBBVURJT19NVlNfU1RBUlRFRCkgewotCQkJcmMgPSBhdWRpb19tdnNfc3RvcChhdWRpbyk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBTdG9wIGNhbGxlZCBpbiBpbnZhbGlkIHN0YXRlICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBhdWRpby0+c3RhdGUpOwotCi0JCQlyYyA9IC1FUEVSTTsKLQkJfQotCi0JCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCQlicmVhazsKLQl9Ci0KLQlkZWZhdWx0OiB7Ci0JCXByX2VycigiJXM6IFVua25vd24gSU9DVEwgJWRcbiIsIF9fZnVuY19fLCBjbWQpOwotCX0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX212c19mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gYXVkaW9fbXZzX29wZW4sCi0JLnJlbGVhc2UgPSBhdWRpb19tdnNfcmVsZWFzZSwKLQkucmVhZCA9IGF1ZGlvX212c19yZWFkLAotCS53cml0ZSA9IGF1ZGlvX212c193cml0ZSwKLQkudW5sb2NrZWRfaW9jdGwgPSBhdWRpb19tdnNfaW9jdGwKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX212c19taXNjID0gewotCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZSA9ICJtc21fbXZzIiwKLQkuZm9wcyA9ICZhdWRpb19tdnNfZm9wcwotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9fbXZzX2luaXQodm9pZCkKLXsKLQlpbnQgcmM7Ci0KLQlwcl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCW1lbXNldCgmYXVkaW9fbXZzX2luZm8sIDAsIHNpemVvZihhdWRpb19tdnNfaW5mbykpOwotCW11dGV4X2luaXQoJmF1ZGlvX212c19pbmZvLmxvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvX212c19pbmZvLmluX2xvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvX212c19pbmZvLm91dF9sb2NrKTsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvX212c19pbmZvLndhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvX212c19pbmZvLm1vZGVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW9fbXZzX2luZm8ub3V0X3dhaXQpOwotCi0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvX212c19pbmZvLmluX3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW9fbXZzX2luZm8uZnJlZV9pbl9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvX212c19pbmZvLm91dF9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvX212c19pbmZvLmZyZWVfb3V0X3F1ZXVlKTsKLQotCXdha2VfbG9ja19pbml0KCZhdWRpb19tdnNfaW5mby5zdXNwZW5kX2xvY2ssCi0JCSAgICAgICBXQUtFX0xPQ0tfU1VTUEVORCwKLQkJICAgICAgICJhdWRpb19tdnNfc3VzcGVuZCIpOwotCXBtX3Fvc19hZGRfcmVxdWVzdCgmYXVkaW9fbXZzX2luZm8ucG1fcW9zX3JlcSwgUE1fUU9TX0NQVV9ETUFfTEFURU5DWSwKLQkJCQlQTV9RT1NfREVGQVVMVF9WQUxVRSk7Ci0KLQlhdWRpb19tdnNfaW5mby5ycGNfZW5kcHQgPSBtc21fcnBjX2Nvbm5lY3RfY29tcGF0aWJsZShNVlNfUFJPRywKLQkJCQkJTVZTX1ZFUlNfQ09NUF9WRVI1LAotCQkJCQlNU01fUlBDX1VOSU5URVJSVVBUSUJMRSk7Ci0KLQlpZiAoSVNfRVJSKGF1ZGlvX212c19pbmZvLnJwY19lbmRwdCkpIHsKLQkJcHJfZXJyKCIlczogTVZTIFJQQyBjb25uZWN0IGZhaWxlZCB2ZXIgMHgleFxuIiwgX19mdW5jX18sCi0JCQkJTVZTX1ZFUlNfQ09NUF9WRVI1KTsKLQkJYXVkaW9fbXZzX2luZm8ucnBjX2VuZHB0ID0gbXNtX3JwY19jb25uZWN0X2NvbXBhdGlibGUoTVZTX1BST0csCi0JCQkJCU1WU19WRVJTX0NPTVBfVkVSNCwKLQkJCQkJTVNNX1JQQ19VTklOVEVSUlVQVElCTEUpOwotCQlpZiAoSVNfRVJSKGF1ZGlvX212c19pbmZvLnJwY19lbmRwdCkpIHsKLQkJCXByX2VycigiJXM6IE1WUyBSUEMgY29ubmVjdCBmYWlsZWQgdmVyIDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIE1WU19WRVJTX0NPTVBfVkVSNCk7Ci0JCQlhdWRpb19tdnNfaW5mby5ycGNfZW5kcHQgPQotCQkJCW1zbV9ycGNfY29ubmVjdF9jb21wYXRpYmxlKE1WU19QUk9HLAotCQkJCU1WU19WRVJTLAotCQkJCU1TTV9SUENfVU5JTlRFUlJVUFRJQkxFKTsKLQkJCWlmIChJU19FUlIoYXVkaW9fbXZzX2luZm8ucnBjX2VuZHB0KSkgewotCQkJCXByX2VycigiJXM6IE1WUyBSUEMgY29ubmVjdCBmYWlsZWQgdmVyIDB4JXhcbiIsCi0JCQkJICAgX19mdW5jX18sIE1WU19WRVJTKTsKLQkJCQlyYyA9IFBUUl9FUlIoYXVkaW9fbXZzX2luZm8ucnBjX2VuZHB0KTsKLQkJCQlhdWRpb19tdnNfaW5mby5ycGNfZW5kcHQgPSBOVUxMOwotCQkJCWdvdG8gZG9uZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJfZGVidWcoIiVzOiBNVlMgUlBDIGNvbm5lY3Qgc3VjY2VlZGVkIHZlclwKLQkJCQkJMHgleFxuIiwgX19mdW5jX18sIE1WU19WRVJTKTsKLQkJCQlhdWRpb19tdnNfaW5mby5ycGNfcHJvZyA9IE1WU19QUk9HOwotCQkJCWF1ZGlvX212c19pbmZvLnJwY192ZXIgPSBNVlNfVkVSUzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCIlczogTVZTIFJQQyBjb25uZWN0IHN1Y2NlZWRlZCB2ZXIgMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgTVZTX1ZFUlNfQ09NUF9WRVI0KTsKLQkJCWF1ZGlvX212c19pbmZvLnJwY19wcm9nID0gTVZTX1BST0c7Ci0JCQlhdWRpb19tdnNfaW5mby5ycGNfdmVyID0gTVZTX1ZFUlNfQ09NUF9WRVI0OwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzOiBNVlMgUlBDIGNvbm5lY3Qgc3VjY2VlZGVkIHZlciAweCV4XG4iLCBfX2Z1bmNfXywKLQkJCU1WU19WRVJTX0NPTVBfVkVSNSk7Ci0JCWF1ZGlvX212c19pbmZvLnJwY19wcm9nID0gTVZTX1BST0c7Ci0JCWF1ZGlvX212c19pbmZvLnJwY192ZXIgPSBNVlNfVkVSU19DT01QX1ZFUjU7Ci0JfQotCWF1ZGlvX212c19pbmZvLnRhc2sgPSBrdGhyZWFkX3J1bihhdWRpb19tdnNfdGhyZWFkLAotCQkJCQkgICZhdWRpb19tdnNfaW5mbywKLQkJCQkJICAiYXVkaW9fbXZzIik7Ci0JaWYgKElTX0VSUihhdWRpb19tdnNfaW5mby50YXNrKSkgewotCQlwcl9lcnIoIiVzOiBNVlMgdGhyZWFkIGNyZWF0ZSBmYWlsZWRcbiIsICBfX2Z1bmNfXyk7Ci0JCXJjID0gUFRSX0VSUihhdWRpb19tdnNfaW5mby50YXNrKTsKLQkJYXVkaW9fbXZzX2luZm8udGFzayA9IE5VTEw7Ci0JCW1zbV9ycGNfY2xvc2UoYXVkaW9fbXZzX2luZm8ucnBjX2VuZHB0KTsKLQkJYXVkaW9fbXZzX2luZm8ucnBjX2VuZHB0ID0gTlVMTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJjID0gbWlzY19yZWdpc3RlcigmYXVkaW9fbXZzX21pc2MpOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdWRpb19tdnNfZXhpdCh2b2lkKQotewotCXByX2luZm8oIiVzOlxuIiwgX19mdW5jX18pOwotCi0JbWlzY19kZXJlZ2lzdGVyKCZhdWRpb19tdnNfbWlzYyk7Ci19Ci0KLW1vZHVsZV9pbml0KGF1ZGlvX212c19pbml0KTsKLW1vZHVsZV9leGl0KGF1ZGlvX212c19leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gTVZTIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX291dC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19vdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyYzlmMy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX291dC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzc0ICswLDAgQEAKLS8qCi0gKiBwY20gYXVkaW8gb3V0cHV0IGRldmljZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtb3J5X2FsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdS5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXVfZG9tYWlucy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBwY21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBwbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2Rldl9jdGwuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkcHAuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX21lbXR5cGVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9jcHVpZGxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgotI2luY2x1ZGUgPG1hY2gvaHRjX3B3cnNpbmsuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLSNkZWZpbmUgQlVGU1ogKDk2MCAqIDUpCi0jZGVmaW5lIERNQVNaIChCVUZTWiAqIDIpCi0KLSNkZWZpbmUgSE9TVFBDTV9TVFJFQU1fSUQgNQotCi1zdHJ1Y3QgYnVmZmVyIHsKLQl2b2lkICpkYXRhOwotCXVuc2lnbmVkIHNpemU7Ci0JdW5zaWduZWQgdXNlZDsKLQl1bnNpZ25lZCBhZGRyOwotfTsKLQotc3RydWN0IGF1ZGlvIHsKLQlzdHJ1Y3QgYnVmZmVyIG91dFsyXTsKLQotCXNwaW5sb2NrX3QgZHNwX2xvY2s7Ci0KLQl1aW50OF90IG91dF9oZWFkOwotCXVpbnQ4X3Qgb3V0X3RhaWw7Ci0JdWludDhfdCBvdXRfbmVlZGVkOyAvKiBudW1iZXIgb2YgYnVmZmVycyB0aGUgZHNwIGlzIHdhaXRpbmcgZm9yICovCi0KLQlhdG9taWNfdCBvdXRfYnl0ZXM7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggd3JpdGVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCi0JLyogY29uZmlndXJhdGlvbiB0byB1c2Ugb24gbmV4dCBlbmFibGUgKi8KLQl1aW50MzJfdCBvdXRfc2FtcGxlX3JhdGU7Ci0JdWludDMyX3Qgb3V0X2NoYW5uZWxfbW9kZTsKLQl1aW50MzJfdCBvdXRfd2VpZ2h0OwotCXVpbnQzMl90IG91dF9idWZmZXJfc2l6ZTsKLQl1aW50MzJfdCBkZXZpY2VfZXZlbnRzOwotCWludDE2X3Qgc291cmNlOwotCi0JLyogZGF0YSBhbGxvY2F0ZWQgZm9yIHZhcmlvdXMgYnVmZmVycyAqLwotCWNoYXIgKmRhdGE7Ci0JZG1hX2FkZHJfdCBwaHlzOwotCXZvaWQgKm1hcF92X3dyaXRlOwotCWludCB0ZW9zOyAvKiB2YWxpZCBvbmx5IGlmIHR1bm5lbCBtb2RlICYgbm8gZGF0YSBsZWZ0IGZvciBkZWNvZGVyICovCi0JaW50IG9wZW5lZDsKLQlpbnQgZW5hYmxlZDsKLQlpbnQgcnVubmluZzsKLQlpbnQgc3RvcHBlZDsgLyogc2V0IHdoZW4gc3RvcHBlZCwgY2xlYXJlZCBvbiBmbHVzaCAqLwotCXVpbnQxNl90IGRlY19pZDsKLQlpbnQgdm9pY2Vfc3RhdGU7Ci0KLQlzdHJ1Y3Qgd2FrZV9sb2NrIHdha2Vsb2NrOwotCXN0cnVjdCBwbV9xb3NfcmVxdWVzdCBwbV9xb3NfcmVxOwotCi0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUgdm9sX3BhbjsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBpb25faGFuZGxlICpidWZmX2hhbmRsZTsKLX07Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX291dF9saXN0ZW5lcih1MzIgZXZ0X2lkLCB1bmlvbiBhdWRkZXZfZXZ0X2RhdGEgKmV2dF9wYXlsb2FkLAotCQkJCXZvaWQgKnByaXZhdGVfZGF0YSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gcHJpdmF0ZV9kYXRhOwotCXN3aXRjaCAoZXZ0X2lkKSB7Ci0JY2FzZSBBVURERVZfRVZUX0RFVl9SRFk6Ci0JCU1NX0RCRygiOkFVRERFVl9FVlRfREVWX1JEWVxuIik7Ci0JCWF1ZGlvLT5zb3VyY2UgfD0gKDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0JCWlmIChhdWRpby0+cnVubmluZyA9PSAxICYmIGF1ZGlvLT5lbmFibGVkID09IDEpCi0JCQlhdWRwcF9yb3V0ZV9zdHJlYW0oYXVkaW8tPmRlY19pZCwgYXVkaW8tPnNvdXJjZSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEREVWX0VWVF9ERVZfUkxTOgotCQlNTV9EQkcoIjpBVURERVZfRVZUX0RFVl9STFNcbiIpOwotCQlhdWRpby0+c291cmNlICY9IH4oMHgxIDw8IGV2dF9wYXlsb2FkLT5yb3V0aW5nX2lkKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nID09IDEgJiYgYXVkaW8tPmVuYWJsZWQgPT0gMSkKLQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLCBhdWRpby0+c291cmNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURERVZfRVZUX1NUUkVBTV9WT0xfQ0hHOgotCQlhdWRpby0+dm9sX3Bhbi52b2x1bWUgPSBldnRfcGF5bG9hZC0+c2Vzc2lvbl92b2w7Ci0JCU1NX0RCRygiOkFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEcsIHN0cmVhbSB2b2wgJWRcbiIsCi0JCQkJYXVkaW8tPnZvbF9wYW4udm9sdW1lKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEc6Ci0JCU1NX0RCRygiQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEcsIHN0YXRlID0gJWRcbiIsCi0JCQkJCQlldnRfcGF5bG9hZC0+dm9pY2Vfc3RhdGUpOwotCQlhdWRpby0+dm9pY2Vfc3RhdGUgPSBldnRfcGF5bG9hZC0+dm9pY2Vfc3RhdGU7Ci0JCS8qIFZvaWNlIHVwbGluayBSeCBjYXNlICovCi0JCWlmIChhdWRpby0+cnVubmluZyAmJgotCQkJKGF1ZGlvLT5zb3VyY2UgJiBBVURQUF9NSVhFUl9VUExJTktfUlgpICYmCi0JCQkoYXVkaW8tPnZvaWNlX3N0YXRlID09IFZPSUNFX1NUQVRFX09GRkNBTEwpKSB7Ci0JCQlNTV9EQkcoIlZvaWNlIGlzIHRlcm1pbmF0ZWQsIFdha2UgdXAgd3JpdGU6ICV4ICV4XG4iLAotCQkJCQlhdWRpby0+dm9pY2Vfc3RhdGUsIGF1ZGlvLT5zb3VyY2UpOwotCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiRVJST1I6d3JvbmcgZXZlbnRcbiIpOwotCQlicmVhazsKLSAgICAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX3ByZXZlbnRfc2xlZXAoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCXdha2VfbG9jaygmYXVkaW8tPndha2Vsb2NrKTsKLQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJmF1ZGlvLT5wbV9xb3NfcmVxLAotCQkJICAgICAgbXNtX2NwdWlkbGVfZ2V0X2RlZXBfaWRsZV9sYXRlbmN5KCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRpb19hbGxvd19zbGVlcChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXBtX3Fvc191cGRhdGVfcmVxdWVzdCgmYXVkaW8tPnBtX3Fvc19yZXEsIFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQl3YWtlX3VubG9jaygmYXVkaW8tPndha2Vsb2NrKTsKLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2RzcF9vdXRfZW5hYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCB5ZXMpOwotc3RhdGljIGludCBhdWRpb19kc3Bfc2VuZF9idWZmZXIoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgaWQsCi0JdW5zaWduZWQgbGVuKTsKLQotc3RhdGljIHZvaWQgYXVkaW9fZHNwX2V2ZW50KHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGlkLCB1aW50MTZfdCAqbXNnKTsKLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGlvX2VuYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JLyogcmVmdXNlIHRvIHN0YXJ0IGlmIHdlJ3JlIG5vdCByZWFkeSAqLwotCWlmICghYXVkaW8tPm91dFswXS51c2VkIHx8ICFhdWRpby0+b3V0WzFdLnVzZWQpCi0JCXJldHVybiAtRUlPOwotCi0JLyogd2Ugc3RhcnQgYnVmZmVycyAwIGFuZCAxLCBzbyBidWZmZXIgMCB3aWxsIGJlIHRoZQotCSAqIG5leHQgb25lIHRoZSBkc3Agd2lsbCB3YW50Ci0JICovCi0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0KLQlhdWRpb19wcmV2ZW50X3NsZWVwKGF1ZGlvKTsKLQotCWlmIChhdWRwcF9lbmFibGUoLTEsIGF1ZGlvX2RzcF9ldmVudCwgYXVkaW8pKSB7Ci0JCU1NX0VSUigiYXVkcHBfZW5hYmxlKCkgZmFpbGVkXG4iKTsKLQkJYXVkaW9fYWxsb3dfc2xlZXAoYXVkaW8pOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JaHRjX3B3cnNpbmtfc2V0KFBXUlNJTktfQVVESU8sIDEwMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRpb19kaXNhYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQlhdWRpb19kc3Bfb3V0X2VuYWJsZShhdWRpbywgMCk7Ci0KLQkJYXVkcHBfZGlzYWJsZSgtMSwgYXVkaW8pOwotCi0JCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQlhdWRpb19hbGxvd19zbGVlcChhdWRpbyk7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZGlvX2RzcF9ldmVudCh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gcHJpdmF0ZTsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIHBjbWRtYW1zZF90aW1lOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUFBfTVNHX0hPU1RfUENNX0lOVEZfTVNHOiB7Ci0JCXVuc2lnbmVkIGlkID0gbXNnWzNdOwotCQl1bnNpZ25lZCBpZHggPSBtc2dbNF0gLSAxOwotCi0JCU1NX0RCRygiSE9TVF9QQ00gaWQgJWQgaWR4ICVkXG4iLCBpZCwgaWR4KTsKLQkJaWYgKGlkICE9IEFVRFBQX01TR19IT1NUUENNX0lEX0FSTV9SWCkgewotCQkJTU1fRVJSKCJib2d1cyBpZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoaWR4ID4gMSkgewotCQkJTU1fRVJSKCJib2d1cyBidWZmZXIgaWR4XG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCQlhdG9taWNfYWRkKGF1ZGlvLT5vdXRbaWR4XS51c2VkLCAmYXVkaW8tPm91dF9ieXRlcyk7Ci0JCQlhdWRpby0+b3V0W2lkeF0udXNlZCA9IDA7Ci0JCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCQlpZiAoZnJhbWUtPnVzZWQpIHsKLQkJCQkvKiBSZXNldCB0ZW9zIGZsYWcgdG8gYXZvaWQgc3RhbGUKLQkJCQkgKiBQQ01ETUFNSVNTIGJlZW4gY29uc2lkZXJlZAotCQkJCSAqLwotCQkJCWF1ZGlvLT50ZW9zID0gMDsKLQkJCQlhdWRpb19kc3Bfc2VuZF9idWZmZXIoCi0JCQkJCWF1ZGlvLCBhdWRpby0+b3V0X3RhaWwsIGZyYW1lLT51c2VkKTsKLQkJCQlhdWRpby0+b3V0X3RhaWwgXj0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXVkaW8tPm91dF9uZWVkZWQrKzsKLQkJCX0KLQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFBfTVNHX1BDTURNQU1JU1NFRDoKLQkJLyogcHJpbnRzIG9ubHkgaWYgMSBzZWNvbmQgaXMgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lCi0JCSAqIHRoaXMgbWVzc2FnZSBoYXMgYmVlbiBwcmludGVkICovCi0JCWlmIChwcmludGtfdGltZWRfcmF0ZWxpbWl0KCZwY21kbWFtc2RfdGltZSwgMTAwMCkpCi0JCQlwcmludGsoS0VSTl9JTkZPICJbJXM6JXNdIFBDTURNQU1JU1NFRCAlZFxuIiwKLQkJCQkJX19NTV9GSUxFX18sIF9fZnVuY19fLCBtc2dbMF0pOwotCQlhdWRpby0+dGVvcysrOwotCQlNTV9EQkcoIlBDTURNQU1JU1NFRCBDb3VudCBwZXIgQnVmZmVyICVkXG4iLCBhdWRpby0+dGVvcyk7Ci0JCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfQ0ZHX01TRzoKLQkJaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0VOQSkgewotCQkJTU1fREJHKCJDRkdfTVNHIEVOQUJMRVxuIik7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCQlhdWRpby0+cnVubmluZyA9IDE7Ci0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuLAotCQkJCQlQT1BQKTsKLQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLCBhdWRpby0+c291cmNlKTsKLQkJCWF1ZGlvX2RzcF9vdXRfZW5hYmxlKGF1ZGlvLCAxKTsKLQkJfSBlbHNlIGlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9ESVMpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBESVNBQkxFXG4iKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiQ0ZHX01TRyAlZD9cbiIsIG1zZ1swXSk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJVTktOT1dOICglZClcbiIsIGlkKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZHNwX291dF9lbmFibGUoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHllcykKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX3BjbV9pbnRmIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZAk9IEFVRFBQX0NNRF9QQ01fSU5URjsKLQljbWQuc3RyZWFtCT0gQVVEUFBfQ01EX1BPUFBfU1RSRUFNOwotCWNtZC5zdHJlYW1faWQJPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5jb25maWcJPSBBVURQUF9DTURfUENNX0lOVEZfQ09ORklHX0NNRF9WOwotCWNtZC5pbnRmX3R5cGUJPSBBVURQUF9DTURfUENNX0lOVEZfUlhfRU5BX0FSTVRPRFNQX1Y7Ci0KLQlpZiAoeWVzKSB7Ci0JCWNtZC53cml0ZV9idWYxTFNXCT0gYXVkaW8tPm91dFswXS5hZGRyOwotCQljbWQud3JpdGVfYnVmMU1TVwk9IGF1ZGlvLT5vdXRbMF0uYWRkciA+PiAxNjsKLQkJaWYgKGF1ZGlvLT5vdXRbMF0udXNlZCkKLQkJCWNtZC53cml0ZV9idWYxX2xlbgk9IGF1ZGlvLT5vdXRbMF0udXNlZDsKLQkJZWxzZQotCQkJY21kLndyaXRlX2J1ZjFfbGVuCT0gYXVkaW8tPm91dFswXS5zaXplOwotCQljbWQud3JpdGVfYnVmMkxTVwk9IGF1ZGlvLT5vdXRbMV0uYWRkcjsKLQkJY21kLndyaXRlX2J1ZjJNU1cJPSBhdWRpby0+b3V0WzFdLmFkZHIgPj4gMTY7Ci0JCWlmIChhdWRpby0+b3V0WzFdLnVzZWQpCi0JCQljbWQud3JpdGVfYnVmMl9sZW4JPSBhdWRpby0+b3V0WzFdLnVzZWQ7Ci0JCWVsc2UKLQkJCWNtZC53cml0ZV9idWYyX2xlbgk9IGF1ZGlvLT5vdXRbMV0uc2l6ZTsKLQkJY21kLmFybV90b19yeF9mbGFnCT0gQVVEUFBfQ01EX1BDTV9JTlRGX0VOQV9WOwotCQljbWQud2VpZ2h0X2RlY29kZXJfdG9fcnggPSBhdWRpby0+b3V0X3dlaWdodDsKLQkJY21kLndlaWdodF9hcm1fdG9fcngJPSAxOwotCQljbWQucGFydGl0aW9uX251bWJlcl9hcm1fdG9fZHNwID0gMDsKLQkJY21kLnNhbXBsZV9yYXRlCQk9IGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGU7Ci0JCWNtZC5jaGFubmVsX21vZGUJPSBhdWRpby0+b3V0X2NoYW5uZWxfbW9kZTsKLQl9Ci0KLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTIoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2RzcF9zZW5kX2J1ZmZlcihzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBpZHgsCi0JdW5zaWduZWQgbGVuKQotewotCXN0cnVjdCBhdWRwcF9jbWRfcGNtX2ludGZfc2VuZF9idWZmZXIgY21kOwotCi0JY21kLmNtZF9pZAk9IEFVRFBQX0NNRF9QQ01fSU5URjsKLQljbWQuc3RyZWFtCT0gQVVEUFBfQ01EX1BPUFBfU1RSRUFNOwotCWNtZC5zdHJlYW1faWQJPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5jb25maWcJPSBBVURQUF9DTURfUENNX0lOVEZfQlVGRkVSX0NNRF9WOwotCWNtZC5pbnRmX3R5cGUJPSBBVURQUF9DTURfUENNX0lOVEZfUlhfRU5BX0FSTVRPRFNQX1Y7Ci0JY21kLmRzcF90b19hcm1fYnVmX2lkCT0gMDsKLQljbWQuYXJtX3RvX2RzcF9idWZfaWQJPSBpZHggKyAxOwotCWNtZC5hcm1fdG9fZHNwX2J1Zl9sZW4JPSBsZW47Ci0KLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTIoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZGlvX2ZsdXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JYXVkaW8tPm91dFswXS51c2VkID0gMDsKLQlhdWRpby0+b3V0WzFdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRfaGVhZCA9IDA7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+c3RvcHBlZCA9IDA7Ci19Ci0KLXN0YXRpYyBsb25nIGF1ZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCQlzdGF0cy5ieXRlX2NvdW50ID0gYXRvbWljX3JlYWQoJmF1ZGlvLT5vdXRfYnl0ZXMpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU0VUX1ZPTFVNRToKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+dm9sX3Bhbi52b2x1bWUgPSBhcmc7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihhdWRpby0+ZGVjX2lkLCAmYXVkaW8tPnZvbF9wYW4sCi0JCQkJCVBPUFApOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIEFVRElPX1NFVF9QQU46Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPnZvbF9wYW4ucGFuID0gYXJnOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuLAotCQkJCQlQT1BQKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6Ci0JCWlmICgoYXVkaW8tPnZvaWNlX3N0YXRlICE9IFZPSUNFX1NUQVRFX0lOQ0FMTCkKLQkJCSYmIChhdWRpby0+c291cmNlICYgQVVEUFBfTUlYRVJfVVBMSU5LX1JYKSkgewotCQkJTU1fRVJSKCJVbmFibGUgdG8gU3RhcnQgOiBzdGF0ZSAlZCBzb3VyY2UgJWRcbiIsCi0JCQkJCWF1ZGlvLT52b2ljZV9zdGF0ZSwgYXVkaW8tPnNvdXJjZSk7Ci0JCQlyYyA9IC1FUEVSTTsKLQkJCWJyZWFrOwotCQl9Ci0JCXJjID0gYXVkaW9fZW5hYmxlKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TVE9QOgotCQlyYyA9IGF1ZGlvX2Rpc2FibGUoYXVkaW8pOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fRkxVU0g6Ci0JCWlmIChhdWRpby0+c3RvcHBlZCkgewotCQkJLyogTWFrZSBzdXJlIHdlJ3JlIHN0b3BwZWQgYW5kIHdlIHdha2UgYW55IHRocmVhZHMKLQkJCSAqIHRoYXQgbWlnaHQgYmUgYmxvY2tlZCBob2xkaW5nIHRoZSB3cml0ZV9sb2NrLgotCQkJICogV2hpbGUgYXVkaW8tPnN0b3BwZWQgd3JpdGUgdGhyZWFkcyB3aWxsIGFsd2F5cwotCQkJICogZXhpdCBpbW1lZGlhdGVseS4KLQkJCSAqLwotCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCQkJYXVkaW9fZmx1c2goYXVkaW8pOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JCX0KLQljYXNlIEFVRElPX1NFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbmZpZywgKHZvaWQgKikgYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjb25maWcuY2hhbm5lbF9jb3VudCA9PSAxKQotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSBBVURQUF9DTURfUENNX0lOVEZfTU9OT19WOwotCQllbHNlIGlmIChjb25maWcuY2hhbm5lbF9jb3VudCA9PSAyKQotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSBBVURQUF9DTURfUENNX0lOVEZfU1RFUkVPX1Y7Ci0JCWVsc2UgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLQkJYXVkaW8tPm91dF9jaGFubmVsX21vZGUgPSBjb25maWcuY2hhbm5lbF9jb3VudDsKLQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gQlVGU1o7Ci0JCWNvbmZpZy5idWZmZXJfY291bnQgPSAyOwotCQljb25maWcuc2FtcGxlX3JhdGUgPSBhdWRpby0+b3V0X3NhbXBsZV9yYXRlOwotCQlpZiAoYXVkaW8tPm91dF9jaGFubmVsX21vZGUgPT0gQVVEUFBfQ01EX1BDTV9JTlRGX01PTk9fVikKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gMTsKLQkJZWxzZQotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSAyOwotCi0JCWNvbmZpZy51bnVzZWRbMF0gPSAwOwotCQljb25maWcudW51c2VkWzFdID0gMDsKLQkJY29uZmlnLnVudXNlZFsyXSA9IDA7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmY29uZmlnLCBzaXplb2YoY29uZmlnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX1NFU1NJT05fSUQ6IHsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZhdWRpby0+ZGVjX2lkLAotCQkJCQlzaXplb2YodW5zaWduZWQgc2hvcnQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotLyogT25seSB1c2VmdWwgaW4gdHVubmVsLW1vZGUgKi8KLXN0YXRpYyBpbnQgYXVkaW9fZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBwcG9zMSwgbG9mZl90IHBwb3MyLCBpbnQgZGF0YXN5bmMpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFhdWRpby0+cnVubmluZykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0KLQkvKiBQQ00gRE1BTUlTUyBtZXNzYWdlIGlzIHNlbnQgb25seSBvbmNlIGluCi0JICogaHBjbSBpbnRlcmZhY2UuIFNvLCB3YWl0IGZvciBidWZmZXIgY29tcGxldGUKLQkgKiBhbmQgdGVvcyBmbGFnLgotCSAqLwotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53YWl0LAotCQkoIWF1ZGlvLT5vdXRbMF0udXNlZCAmJgotCQkhYXVkaW8tPm91dFsxXS51c2VkKSk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d2FpdCwKLQkJYXVkaW8tPnRlb3MpOwotZG9uZToKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHJ0X3BvbGljeShpbnQgcG9saWN5KQotewotCWlmICh1bmxpa2VseShwb2xpY3kgPT0gU0NIRURfRklGTykgfHwgdW5saWtlbHkocG9saWN5ID09IFNDSEVEX1JSKSkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHRhc2tfaGFzX3J0X3BvbGljeShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCi17Ci0JcmV0dXJuIHJ0X3BvbGljeShwLT5wb2xpY3kpOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRpb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IHNjaGVkX3BhcmFtIHMgPSB7IC5zY2hlZF9wcmlvcml0eSA9IDEgfTsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCXNpemVfdCB4ZmVyOwotCWludCBvbGRfcHJpbyA9IGN1cnJlbnQtPnJ0X3ByaW9yaXR5OwotCWludCBvbGRfcG9saWN5ID0gY3VycmVudC0+cG9saWN5OwotCWludCBjYXBfbmljZSA9IGNhcF9yYWlzZWQoY3VycmVudF9jYXAoKSwgQ0FQX1NZU19OSUNFKTsKLQlpbnQgcmMgPSAwOwotCi0KLQlpZiAoKGF1ZGlvLT52b2ljZV9zdGF0ZSA9PSBWT0lDRV9TVEFURV9PRkZDQUxMKQotCQkmJiAoYXVkaW8tPnNvdXJjZSAmIEFVRFBQX01JWEVSX1VQTElOS19SWCkgJiYKLQkJCQkJCQlhdWRpby0+cnVubmluZykgewotCQlNTV9FUlIoIk5vdCBQZXJtaXR0ZWQgVm9pY2UgVGVybWluYXRlZDogc3RhdGUgJWQgc291cmNlICV4IFwKLQkJCXJ1bm5pbmcgJWRcbiIsCi0JCQlhdWRpby0+dm9pY2Vfc3RhdGUsIGF1ZGlvLT5zb3VyY2UsIGF1ZGlvLT5ydW5uaW5nKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0JLyoganVzdCBmb3IgdGhpcyB3cml0ZSwgc2V0IHVzIHJlYWwtdGltZSAqLwotCWlmICghdGFza19oYXNfcnRfcG9saWN5KGN1cnJlbnQpKSB7Ci0JCXN0cnVjdCBjcmVkICpuZXcgPSBwcmVwYXJlX2NyZWRzKCk7Ci0JCWNhcF9yYWlzZShuZXctPmNhcF9lZmZlY3RpdmUsIENBUF9TWVNfTklDRSk7Ci0JCWNvbW1pdF9jcmVkcyhuZXcpOwotCQlpZiAoKHNjaGVkX3NldHNjaGVkdWxlcihjdXJyZW50LCBTQ0hFRF9SUiwgJnMpKSA8IDApCi0JCQlNTV9FUlIoInNjaGVkX3NldHNjaGVkdWxlciBmYWlsZWRcbiIpOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d2FpdCwKLQkJICAgICAgKGZyYW1lLT51c2VkID09IDApIHx8IChhdWRpby0+c3RvcHBlZCkgfHwKLQkJCSgoYXVkaW8tPnZvaWNlX3N0YXRlID09IFZPSUNFX1NUQVRFX09GRkNBTEwpICYmCi0JCQkoYXVkaW8tPnNvdXJjZSAmIEFVRFBQX01JWEVSX1VQTElOS19SWCkpKTsKLQotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmICgoYXVkaW8tPnZvaWNlX3N0YXRlID09IFZPSUNFX1NUQVRFX09GRkNBTEwpICYmCi0JCQkoYXVkaW8tPnNvdXJjZSAmIEFVRFBQX01JWEVSX1VQTElOS19SWCkpIHsKLQkJCU1NX0VSUigiTm90IFBlcm1pdHRlZCBWb2ljZSBUZXJtaW5hdGVkOiAlZFxuIiwKLQkJCQkJCQlhdWRpby0+dm9pY2Vfc3RhdGUpOwotCQkJcmMgPSAtRVBFUk07Ci0JCQlicmVhazsKLQkJfQotCi0JCXhmZXIgPSBjb3VudCA+IGZyYW1lLT5zaXplID8gZnJhbWUtPnNpemUgOiBjb3VudDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGZyYW1lLT5kYXRhLCBidWYsIHhmZXIpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlmcmFtZS0+dXNlZCA9IHhmZXI7Ci0JCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCQljb3VudCAtPSB4ZmVyOwotCQlidWYgKz0geGZlcjsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkICYmIGF1ZGlvLT5vdXRfbmVlZGVkKSB7Ci0JCQkvKiBSZXNldCB0ZW9zIGZsYWcgdG8gYXZvaWQgc3RhbGUKLQkJCSAqIFBDTURNQU1JU1MgYmVlbiBjb25zaWRlcmVkCi0JCQkgKi8KLQkJCWF1ZGlvLT50ZW9zID0gMDsKLQkJCWF1ZGlvX2RzcF9zZW5kX2J1ZmZlcihhdWRpbywgYXVkaW8tPm91dF90YWlsLAotCQkJCQlmcmFtZS0+dXNlZCk7Ci0JCQlhdWRpby0+b3V0X3RhaWwgXj0gMTsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkLS07Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0KLQkvKiByZXN0b3JlIHNjaGVkdWxpbmcgcG9saWN5IGFuZCBwcmlvcml0eSAqLwotCWlmICghcnRfcG9saWN5KG9sZF9wb2xpY3kpKSB7Ci0JCXN0cnVjdCBzY2hlZF9wYXJhbSB2ID0geyAuc2NoZWRfcHJpb3JpdHkgPSBvbGRfcHJpbyB9OwotCQlpZiAoKHNjaGVkX3NldHNjaGVkdWxlcihjdXJyZW50LCBvbGRfcG9saWN5LCAmdikpIDwgMCkKLQkJCU1NX0VSUigic2NoZWRfc2V0c2NoZWR1bGVyIGZhaWxlZFxuIik7Ci0JCWlmIChsaWtlbHkoIWNhcF9uaWNlKSkgewotCQkJc3RydWN0IGNyZWQgKm5ldyA9IHByZXBhcmVfY3JlZHMoKTsKLQkJCWNhcF9sb3dlcihuZXctPmNhcF9lZmZlY3RpdmUsIENBUF9TWVNfTklDRSk7Ci0JCQljb21taXRfY3JlZHMobmV3KTsKLQkJfQotCX0KLQotCWlmIChidWYgPiBzdGFydCkKLQkJcmV0dXJuIGJ1ZiAtIHN0YXJ0OwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JYXVkZGV2X3VucmVnaXN0ZXJfZXZ0X2xpc3RuZXIoQVVEREVWX0NMTlRfREVDLCBhdWRpby0+ZGVjX2lkKTsKLQlhdWRpb19kaXNhYmxlKGF1ZGlvKTsKLQlhdWRpb19mbHVzaChhdWRpbyk7Ci0JYXVkaW8tPm9wZW5lZCA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JaHRjX3B3cnNpbmtfc2V0KFBXUlNJTktfQVVESU8sIDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGF1ZGlvIHRoZV9hdWRpbzsKLQotc3RhdGljIGludCBhdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSAmdGhlX2F1ZGlvOwotCWludCByYzsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQotCWlmIChhdWRpby0+b3BlbmVkKSB7Ci0JCU1NX0VSUigiYnVzeVxuIik7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0KLQlhdWRpby0+ZGVjX2lkID0gSE9TVFBDTV9TVFJFQU1fSUQ7Ci0KLQlhdWRpby0+b3V0X2J1ZmZlcl9zaXplID0gQlVGU1o7Ci0JYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSA9IDQ0MTAwOwotCWF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID0gQVVEUFBfQ01EX1BDTV9JTlRGX1NURVJFT19WOwotCWF1ZGlvLT5vdXRfd2VpZ2h0ID0gMTAwOwotCi0JYXVkaW8tPm91dFswXS5kYXRhID0gYXVkaW8tPmRhdGEgKyAwOwotCWF1ZGlvLT5vdXRbMF0uYWRkciA9IGF1ZGlvLT5waHlzICsgMDsKLQlhdWRpby0+b3V0WzBdLnNpemUgPSBCVUZTWjsKLQotCWF1ZGlvLT5vdXRbMV0uZGF0YSA9IGF1ZGlvLT5kYXRhICsgQlVGU1o7Ci0JYXVkaW8tPm91dFsxXS5hZGRyID0gYXVkaW8tPnBoeXMgKyBCVUZTWjsKLQlhdWRpby0+b3V0WzFdLnNpemUgPSBCVUZTWjsKLQotCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IDB4MjAwMDsKLQlhdWRpby0+dm9sX3Bhbi5wYW4gPSAweDA7Ci0JYXVkaW8tPnNvdXJjZSA9IDB4MDsKLQotCWF1ZGlvX2ZsdXNoKGF1ZGlvKTsKLQlhdWRpby0+dm9pY2Vfc3RhdGUgPSBtc21fZ2V0X3ZvaWNlX3N0YXRlKCk7Ci0JTU1fREJHKCJ2b2ljZV9zdGF0ZSA9ICV4XG4iLCBhdWRpby0+dm9pY2Vfc3RhdGUpOwotCWF1ZGlvLT5kZXZpY2VfZXZlbnRzID0gQVVEREVWX0VWVF9ERVZfUkRZCi0JCQkJfEFVRERFVl9FVlRfREVWX1JMU3wKLQkJCQlBVURERVZfRVZUX1NUUkVBTV9WT0xfQ0hHfAotCQkJCUFVRERFVl9FVlRfVk9JQ0VfU1RBVEVfQ0hHOwotCi0JTU1fREJHKCJyZWdpc3RlciBmb3IgZXZlbnQgY2FsbGJhY2sgcGRhdGEgJXBcbiIsIGF1ZGlvKTsKLQlyYyA9IGF1ZGRldl9yZWdpc3Rlcl9ldnRfbGlzdG5lcihhdWRpby0+ZGV2aWNlX2V2ZW50cywKLQkJCQkJQVVEREVWX0NMTlRfREVDLAotCQkJCQlhdWRpby0+ZGVjX2lkLAotCQkJCQlhdWRpb19vdXRfbGlzdGVuZXIsCi0JCQkJCSh2b2lkICopYXVkaW8pOwotCWlmIChyYykgewotCQlNTV9FUlIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgbGlzdGVuZXJcbiIsIF9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOwotCWF1ZGlvLT5vcGVuZWQgPSAxOwotCXJjID0gMDsKLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBhdWRpb19vcGVuLAotCS5yZWxlYXNlCT0gYXVkaW9fcmVsZWFzZSwKLQkucmVhZAkJPSBhdWRpb19yZWFkLAotCS53cml0ZQkJPSBhdWRpb193cml0ZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBhdWRpb19pb2N0bCwKLQkuZnN5bmMJCT0gYXVkaW9fZnN5bmMsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fcGNtX291dCIsCi0JLmZvcHMJPSAmYXVkaW9fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGlvX2luaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGlvbmZsYWcgPSAwOwotCWlvbl9waHlzX2FkZHJfdCBhZGRyID0gMDsKLQlpbnQgcmM7Ci0JaW50IGxlbiA9IDA7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCA9IE5VTEw7Ci0KLQljbGllbnQgPSBtc21faW9uX2NsaWVudF9jcmVhdGUoVUlOVF9NQVgsICJIb3N0UENNIik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGNsaWVudCkpIHsKLQkJTU1fRVJSKCJVbmFibGUgdG8gY3JlYXRlIElPTiBjbGllbnRcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gY2xpZW50X2NyZWF0ZV9lcnJvcjsKLQl9Ci0JdGhlX2F1ZGlvLmNsaWVudCA9IGNsaWVudDsKLQotCWhhbmRsZSA9IGlvbl9hbGxvYyhjbGllbnQsIERNQVNaLCBTWl80SywKLQkJSU9OX0hFQVAoSU9OX0FVRElPX0hFQVBfSUQpLCAwKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoaGFuZGxlKSkgewotCQlNTV9FUlIoIlVuYWJsZSB0byBjcmVhdGUgYWxsb2NhdGUgTy9QIGJ1ZmZlcnNcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gYnVmZl9hbGxvY19lcnJvcjsKLQkJfQotCXRoZV9hdWRpby5idWZmX2hhbmRsZSA9IGhhbmRsZTsKLQotCXJjID0gaW9uX3BoeXMoY2xpZW50LCBoYW5kbGUsICZhZGRyLCAmbGVuKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJPL1AgYnVmZmVyczpJbnZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJKHVuc2lnbmVkIGludCkgYWRkciwgKHVuc2lnbmVkIGludCkgbGVuKTsKLQkJZ290byBidWZmX2dldF9waHlzX2Vycm9yOwotCX0gZWxzZQotCQlNTV9JTkZPKCJPL1AgYnVmZmVyczp2YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JdGhlX2F1ZGlvLnBoeXMgPSAoaW50MzJfdClhZGRyOwotCi0JcmMgPSBpb25faGFuZGxlX2dldF9mbGFncyhjbGllbnQsIGhhbmRsZSwgJmlvbmZsYWcpOwotCWlmIChyYykgewotCQlNTV9FUlIoImNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIpOwotCQlnb3RvIGJ1ZmZfZ2V0X2ZsYWdzX2Vycm9yOwotCX0KLQotCXRoZV9hdWRpby5tYXBfdl93cml0ZSA9IGlvbl9tYXBfa2VybmVsKGNsaWVudCwgaGFuZGxlKTsKLQlpZiAoSVNfRVJSKHRoZV9hdWRpby5tYXBfdl93cml0ZSkpIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgbWFwIHdyaXRlIGJ1ZmZlcnNcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gYnVmZl9tYXBfZXJyb3I7Ci0JfQotCXRoZV9hdWRpby5kYXRhID0gKGNoYXIgKil0aGVfYXVkaW8ubWFwX3Zfd3JpdGU7Ci0JTU1fREJHKCJNZW1vcnkgYWRkciA9IDB4JTh4ICBwaHkgYWRkciA9IDB4JTh4XG4iLFwKLQkJKGludCkgdGhlX2F1ZGlvLmRhdGEsIChpbnQpIHRoZV9hdWRpby5waHlzKTsKLQltdXRleF9pbml0KCZ0aGVfYXVkaW8ubG9jayk7Ci0JbXV0ZXhfaW5pdCgmdGhlX2F1ZGlvLndyaXRlX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZ0aGVfYXVkaW8uZHNwX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoZV9hdWRpby53YWl0KTsKLQl3YWtlX2xvY2tfaW5pdCgmdGhlX2F1ZGlvLndha2Vsb2NrLCBXQUtFX0xPQ0tfU1VTUEVORCwgImF1ZGlvX3BjbSIpOwotCXBtX3Fvc19hZGRfcmVxdWVzdCgmdGhlX2F1ZGlvLnBtX3Fvc19yZXEsIFBNX1FPU19DUFVfRE1BX0xBVEVOQ1ksCi0JCQkJUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19taXNjKTsKLWJ1ZmZfbWFwX2Vycm9yOgotYnVmZl9nZXRfcGh5c19lcnJvcjoKLWJ1ZmZfZ2V0X2ZsYWdzX2Vycm9yOgotCWlvbl9mcmVlKGNsaWVudCwgdGhlX2F1ZGlvLmJ1ZmZfaGFuZGxlKTsKLWJ1ZmZfYWxsb2NfZXJyb3I6Ci0JaW9uX2NsaWVudF9kZXN0cm95KGNsaWVudCk7Ci1jbGllbnRfY3JlYXRlX2Vycm9yOgotCXJldHVybiByYzsKLQotfQotCi1sYXRlX2luaXRjYWxsKGF1ZGlvX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19wY20uYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fcGNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZDI5MTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19wY20uYworKysgL2Rldi9udWxsCkBAIC0xLDE1NzcgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19wY20uYwotICoKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vhcmx5c3VzcGVuZC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1vcnlfYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotCi0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2Rldl9jdGwuaD4KLQotI2luY2x1ZGUgPG1hY2gvaW9tbXUuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11X2RvbWFpbnMuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRwcGNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRwcG1zZy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBsYXljbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcGxheW1zZy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRwcC5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9tZW10eXBlcy5oPgotCi0jZGVmaW5lIEFEUlZfU1RBVFVTX0FJT19JTlRGIDB4MDAwMDAwMDEKLSNkZWZpbmUgQURSVl9TVEFUVVNfT0JVRl9HSVZFTiAweDAwMDAwMDAyCi0jZGVmaW5lIEFEUlZfU1RBVFVTX0lCVUZfR0lWRU4gMHgwMDAwMDAwNAotI2RlZmluZSBBRFJWX1NUQVRVU19GU1lOQyAweDAwMDAwMDA4Ci0KLS8qIFNpemUgbXVzdCBiZSBwb3dlciBvZiAyICovCi0jZGVmaW5lIEJVRlNaX01BWCAzMjc2OAotI2RlZmluZSBCVUZTWl9NSU4gNDA5NgotI2RlZmluZSBETUFTWl9NQVggKEJVRlNaX01BWCAqIDIpCi0jZGVmaW5lIERNQVNaX01JTiAoQlVGU1pfTUlOICogMikKLQotI2RlZmluZSBBVURERUNfREVDX1BDTSAwCi0KLS8qIERlY29kZXIgc3RhdHVzIHJlY2VpdmVkIGZyb20gQVVEUFBUQVNLICovCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX1NMRUVQCTAKLSNkZWZpbmUgIEFVRFBQX0RFQ19TVEFUVVNfSU5JVCAgMQotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19DRkcgICAyCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX1BMQVkgIDMKLQotI2RlZmluZSBBVURQQ01fRVZFTlRfTlVNIDEwIC8qIERlZmF1bHQgbnVtYmVyIG9mIHByZS1hbGxvY2F0ZWQgZXZlbnQgcGFja2V0cyAqLwotCi0jZGVmaW5lIF9fQ09OVEFJTlMociwgdiwgbCkgKHsJCQkJCVwKLQl0eXBlb2YocikgX19yID0gcjsJCQkJCVwKLQl0eXBlb2YodikgX192ID0gdjsJCQkJCVwKLQl0eXBlb2YodikgX19lID0gX192ICsgbDsJCQkJXAotCWludCByZXMgPSAoKF9fdiA+PSBfX3ItPnZhZGRyKSAmJiAJCQlcCi0JCShfX2UgPD0gX19yLT52YWRkciArIF9fci0+bGVuKSk7CQlcCi0JcmVzOwkJCQkJCQlcCi19KQotCi0jZGVmaW5lIENPTlRBSU5TKHIxLCByMikgKHsJCQkJCVwKLQl0eXBlb2YocjIpIF9fcjIgPSByMjsJCQkJCVwKLQlfX0NPTlRBSU5TKHIxLCBfX3IyLT52YWRkciwgX19yMi0+bGVuKTsJCQlcCi19KQotCi0jZGVmaW5lIElOX1JBTkdFKHIsIHYpICh7CQkJCQlcCi0JdHlwZW9mKHIpIF9fciA9IHI7CQkJCQlcCi0JdHlwZW9mKHYpIF9fdnYgPSB2OwkJCQkJXAotCWludCByZXMgPSAoKF9fdnYgPj0gX19yLT52YWRkcikgJiYJCQlcCi0JCShfX3Z2IDwgKF9fci0+dmFkZHIgKyBfX3ItPmxlbikpKTsJCVwKLQlyZXM7CQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgT1ZFUkxBUFMocjEsIHIyKSAoewkJCQkJXAotCXR5cGVvZihyMSkgX19yMSA9IHIxOwkJCQkJXAotCXR5cGVvZihyMikgX19yMiA9IHIyOwkJCQkJXAotCXR5cGVvZihfX3IyLT52YWRkcikgX192ID0gX19yMi0+dmFkZHI7CQkJXAotCXR5cGVvZihfX3YpIF9fZSA9IF9fdiArIF9fcjItPmxlbiAtIDE7CQkJXAotCWludCByZXMgPSAoSU5fUkFOR0UoX19yMSwgX192KSB8fCBJTl9SQU5HRShfX3IxLCBfX2UpKTsJXAotCXJlczsJCQkJCQkJXAotfSkKLQotc3RydWN0IGF1ZGlvOwotCi1zdHJ1Y3QgYnVmZmVyIHsKLQl2b2lkICpkYXRhOwotCXVuc2lnbmVkIHNpemU7Ci0JdW5zaWduZWQgdXNlZDsJCS8qIElucHV0IHVzYWdlIGFjdHVhbCBEU1AgcHJvZHVjZWQgUENNIHNpemUgICovCi0JdW5zaWduZWQgYWRkcjsKLX07Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RydWN0IGF1ZHBjbV9zdXNwZW5kX2N0bCB7Ci0gIHN0cnVjdCBlYXJseV9zdXNwZW5kIG5vZGU7Ci0gIHN0cnVjdCBhdWRpbyAqYXVkaW87Ci19OwotI2VuZGlmCi0KLXN0cnVjdCBhdWRwY21fZXZlbnQgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlpbnQgZXZlbnRfdHlwZTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotfTsKLQotc3RydWN0IGF1ZHBjbV9wbWVtX3JlZ2lvbiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBmaWxlICpmaWxlOwotCWludCBmZDsKLQl2b2lkICp2YWRkcjsKLQl1bnNpZ25lZCBsb25nIHBhZGRyOwotCXVuc2lnbmVkIGxvbmcga3ZhZGRyOwotCXVuc2lnbmVkIGxvbmcgbGVuOwotCXVuc2lnbmVkIHJlZl9jbnQ7Ci19OwotCi1zdHJ1Y3QgYXVkcGNtX2J1ZmZlcl9ub2RlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IG1zbV9hdWRpb19haW9fYnVmIGJ1ZjsKLQl1bnNpZ25lZCBsb25nIHBhZGRyOwotfTsKLQotc3RydWN0IGF1ZHBjbV9kcnZfb3BlcmF0aW9ucyB7Ci0Jdm9pZCAoKnNlbmRfZGF0YSkoc3RydWN0IGF1ZGlvICosIHVuc2lnbmVkKTsKLQl2b2lkICgqb3V0X2ZsdXNoKShzdHJ1Y3QgYXVkaW8gKik7Ci0JaW50ICgqZnN5bmMpKHN0cnVjdCBhdWRpbyAqKTsKLX07Ci0KLXN0cnVjdCBhdWRpbyB7Ci0Jc3RydWN0IGJ1ZmZlciBvdXRbMl07Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JdWludDhfdCBvdXRfaGVhZDsKLQl1aW50OF90IG91dF90YWlsOwotCXVpbnQ4X3Qgb3V0X25lZWRlZDsgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGRzcCBpcyB3YWl0aW5nIGZvciAqLwotCXVuc2lnbmVkIG91dF9kbWFfc3o7Ci0Jc3RydWN0IGxpc3RfaGVhZCBvdXRfcXVldWU7IC8qIHF1ZXVlIHRvIHJldGFpbiBvdXRwdXQgYnVmZmVycyAqLwotCWF0b21pY190IG91dF9ieXRlczsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtdXRleCB3cml0ZV9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlX3dhaXQ7Ci0KLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICphdWRwbGF5OwotCi0JLyogY29uZmlndXJhdGlvbiB0byB1c2Ugb24gbmV4dCBlbmFibGUgKi8KLQl1aW50MzJfdCBvdXRfc2FtcGxlX3JhdGU7Ci0JdWludDMyX3Qgb3V0X2NoYW5uZWxfbW9kZTsKLQl1aW50MzJfdCBvdXRfYml0czsgLyogYml0cyBwZXIgc2FtcGxlICovCi0KLQkvKiBkYXRhIGFsbG9jYXRlZCBmb3IgdmFyaW91cyBidWZmZXJzICovCi0JY2hhciAqZGF0YTsKLQlpbnQzMl90IHBoeXM7Ci0Jdm9pZCAqbWFwX3Zfd3JpdGU7Ci0JdWludDMyX3QgZHJ2X3N0YXR1czsKLQlpbnQgd2ZsdXNoOyAvKiBXcml0ZSBmbHVzaCAqLwotCWludCBvcGVuZWQ7Ci0JaW50IGVuYWJsZWQ7Ci0JaW50IHJ1bm5pbmc7Ci0JaW50IHN0b3BwZWQ7IC8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQlpbnQgdGVvczsgLyogdmFsaWQgb25seSBpZiB0dW5uZWwgbW9kZSAmIG5vIGRhdGEgbGVmdCBmb3IgZGVjb2RlciAqLwotCWVudW0gbXNtX2F1ZF9kZWNvZGVyX3N0YXRlIGRlY19zdGF0ZTsgLyogUmVwcmVzZW50cyBkZWNvZGVyIHN0YXRlICovCi0JaW50IHJlc2VydmVkOyAvKiBBIGJ5dGUgaXMgYmVpbmcgcmVzZXJ2ZWQgKi8KLQljaGFyIHJzdl9ieXRlOyAvKiBIYW5kbGUgb2RkIGxlbmd0aCB1c2VyIGRhdGEgKi8KLQotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIHF1ZXVlX2lkOwotCXVpbnQzMl90IGRldmljZV9ldmVudHM7Ci0KLQl1bnNpZ25lZCB2b2x1bWU7Ci0KLQl1aW50MTZfdCBkZWNfaWQ7Ci0JaW50MTZfdCBzb3VyY2U7Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCXN0cnVjdCBhdWRwY21fc3VzcGVuZF9jdGwgc3VzcGVuZF9jdGw7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLSNlbmRpZgotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmcmVlX2V2ZW50X3F1ZXVlOwotCXN0cnVjdCBsaXN0X2hlYWQgZXZlbnRfcXVldWU7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgZXZlbnRfd2FpdDsKLQlzcGlubG9ja190IGV2ZW50X3F1ZXVlX2xvY2s7Ci0Jc3RydWN0IG11dGV4IGdldF9ldmVudF9sb2NrOwotCWludCBldmVudF9hYm9ydDsKLQkvKiBBViBzeW5jIEluZm8gKi8KLQlpbnQgYXZzeW5jX2ZsYWc7ICAgICAgICAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIGZlZWRiYWNrIGZyb20gRFNQICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgYXZzeW5jX3dhaXQ7LyogV2FpdCBxdWV1ZSBmb3IgQVYgU3luYyBNZXNzYWdlICAgICAqLwotCS8qIGZsYWdzLCA0OCBiaXRzIHNhbXBsZS9ieXRlcyBjb3VudGVyIHBlciBjaGFubmVsICovCi0JdWludDE2X3QgYXZzeW5jW0FVRFBQX0FWU1lOQ19DSF9DT1VOVCAqIEFVRFBQX0FWU1lOQ19OVU1fV09SRFMgKyAxXTsKLQotCXN0cnVjdCBsaXN0X2hlYWQgcG1lbV9yZWdpb25fcXVldWU7Ci0Jc3RydWN0IGF1ZHBjbV9kcnZfb3BlcmF0aW9ucyBkcnZfb3BzOwotfTsKLQotc3RhdGljIGludCBhdWRkZWNfZHNwX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKTsKLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRwbGF5X3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpOwotc3RhdGljIHZvaWQgYXVkaW9fZHNwX2V2ZW50KHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGlkLCB1aW50MTZfdCAqbXNnKTsKLXN0YXRpYyB2b2lkIGF1ZHBjbV9wb3N0X2V2ZW50KHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCB0eXBlLAotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgYXVkcGNtX3BtZW1fZml4dXAoc3RydWN0IGF1ZGlvICphdWRpbywgdm9pZCAqYWRkciwKLQl1bnNpZ25lZCBsb25nIGxlbiwgaW50IHJlZl91cCk7Ci0KLXN0YXRpYyB2b2lkIHBjbV9saXN0bmVyKHUzMiBldnRfaWQsIHVuaW9uIGF1ZGRldl9ldnRfZGF0YSAqZXZ0X3BheWxvYWQsCi0JCQl2b2lkICpwcml2YXRlX2RhdGEpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IChzdHJ1Y3QgYXVkaW8gKikgcHJpdmF0ZV9kYXRhOwotCXN3aXRjaCAoZXZ0X2lkKSB7Ci0JY2FzZSBBVURERVZfRVZUX0RFVl9SRFk6Ci0JCU1NX0RCRygiQVVEREVWX0VWVF9ERVZfUkRZXG4iKTsKLQkJYXVkaW8tPnNvdXJjZSB8PSAoMHgxIDw8IGV2dF9wYXlsb2FkLT5yb3V0aW5nX2lkKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nID09IDEgJiYgYXVkaW8tPmVuYWJsZWQgPT0gMSkKLQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLCBhdWRpby0+c291cmNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURERVZfRVZUX0RFVl9STFM6Ci0JCU1NX0RCRygiQVVEREVWX0VWVF9ERVZfUkxTXG4iKTsKLQkJYXVkaW8tPnNvdXJjZSAmPSB+KDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0JCWlmIChhdWRpby0+cnVubmluZyA9PSAxICYmIGF1ZGlvLT5lbmFibGVkID09IDEpCi0JCQlhdWRwcF9yb3V0ZV9zdHJlYW0oYXVkaW8tPmRlY19pZCwgYXVkaW8tPnNvdXJjZSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRzoKLQkJYXVkaW8tPnZvbHVtZSA9IGV2dF9wYXlsb2FkLT5zZXNzaW9uX3ZvbDsKLQkJTU1fREJHKCJBVURERVZfRVZUX1NUUkVBTV9WT0xfQ0hHLCBzdHJlYW0gdm9sICVkXG4iLAotCQkJCWF1ZGlvLT52b2x1bWUpOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9zZXRfdm9sdW1lX2FuZF9wYW4oYXVkaW8tPmRlY19pZCwgYXVkaW8tPnZvbHVtZSwKLQkJCQkJMCwgUE9QUCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiRVJST1I6d3JvbmcgZXZlbnRcbiIpOwotCQlicmVhazsKLQl9Ci19Ci0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkaW9fZW5hYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQotCWlmIChhdWRpby0+ZW5hYmxlZCkKLQkJcmV0dXJuIDA7Ci0KLQlhdWRpby0+ZGVjX3N0YXRlID0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkU7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0KLQlpZiAobXNtX2Fkc3BfZW5hYmxlKGF1ZGlvLT5hdWRwbGF5KSkgewotCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRwbGF5KSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAoYXVkcHBfZW5hYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvX2RzcF9ldmVudCwgYXVkaW8pKSB7Ci0JCU1NX0VSUigiYXVkcHBfZW5hYmxlKCkgZmFpbGVkXG4iKTsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRpby0+YXVkcGxheSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWF1ZGlvLT5lbmFibGVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZGlvX2Rpc2FibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JaWYgKGF1ZGlvLT5lbmFibGVkKSB7Ci0JCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCQlhdWRkZWNfZHNwX2NvbmZpZyhhdWRpbywgMCk7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXQsCi0JCQkJYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORSwKLQkJCQltc2Vjc190b19qaWZmaWVzKE1TTV9BVURfREVDT0RFUl9XQUlUX01TKSk7Ci0JCWlmIChyYyA9PSAwKQotCQkJcmMgPSAtRVRJTUVET1VUOwotCQllbHNlIGlmIChhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlhdWRwcF9kaXNhYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvKTsKLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZHNwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgYXVkcGxheV9kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgICB2b2lkICgqZ2V0ZXZlbnQpICh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBkYXRhOwotCXVpbnQzMl90IG1zZ1syOF07Ci0JZ2V0ZXZlbnQobXNnLCBzaXplb2YobXNnKSk7Ci0KLQlNTV9EQkcoIm1zZ19pZD0leFxuIiwgaWQpOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUExBWV9NU0dfREVDX05FRURTX0RBVEE6Ci0JCWF1ZGlvLT5kcnZfb3BzLnNlbmRfZGF0YShhdWRpbywgMSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBRFNQX01FU1NBR0VfSUQ6Ci0JCU1NX0RCRygiUmVjZWl2ZWQgQURTUCBldmVudDptb2R1bGUgYXVkcGxheXRhc2tcbiIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigidW5leHBlY3RlZCBtZXNzYWdlIGZyb20gZGVjb2RlclxuIik7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fZHNwX2V2ZW50KHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGlkLCB1aW50MTZfdCAqbXNnKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBwcml2YXRlOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUFBfTVNHX1NUQVRVU19NU0c6ewotCQkJdW5zaWduZWQgc3RhdHVzID0gbXNnWzFdOwotCi0JCQlzd2l0Y2ggKHN0YXR1cykgewotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX1NMRUVQOiB7Ci0JCQkJdWludDE2X3QgcmVhc29uID0gbXNnWzJdOwotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6c2xlZXAgcmVhc29uPTB4JTA0eFxuIiwKLQkJCQkJCXJlYXNvbik7Ci0JCQkJaWYgKChyZWFzb24gPT0gQVVEUFBfTVNHX1JFQVNPTl9NRU0pCi0JCQkJCQl8fCAocmVhc29uID09Ci0JCQkJCQlBVURQUF9NU0dfUkVBU09OX05PREVDT0RFUikpIHsKLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfRkFJTFVSRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0gZWxzZSBpZiAocmVhc29uID09IEFVRFBQX01TR19SRUFTT05fTk9ORSkgewotCQkJCQkvKiBkZWNvZGVyIGlzIGluIGRpc2FibGUgc3RhdGUgKi8KLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfQ0xPU0U7Ci0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfSU5JVDoKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBpbml0IFxuIik7Ci0JCQkJYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhhdWRpbyk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19DRkc6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogY2ZnIFxuIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfUExBWToKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBwbGF5IFxuIik7Ci0JCQkJYXVkcHBfcm91dGVfc3RyZWFtKGF1ZGlvLT5kZWNfaWQsCi0JCQkJCQlhdWRpby0+c291cmNlKTsKLQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1M7Ci0JCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlNTV9FUlIoInVua25vd24gZGVjb2RlciBzdGF0dXNcbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRFBQX01TR19DRkdfTVNHOgotCQlpZiAobXNnWzBdID09IEFVRFBQX01TR19FTkFfRU5BKSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgRU5BQkxFXG4iKTsKLQkJCWF1ZGRlY19kc3BfY29uZmlnKGF1ZGlvLCAxKTsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMTsKLQkJCWF1ZHBwX3NldF92b2x1bWVfYW5kX3BhbihhdWRpby0+ZGVjX2lkLCBhdWRpby0+dm9sdW1lLAotCQkJCQkwLCBQT1BQKTsKLQkJfSBlbHNlIGlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9ESVMpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBESVNBQkxFXG4iKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiYXVkaW9fZHNwX2V2ZW50OiBDRkdfTVNHICVkP1xuIiwgbXNnWzBdKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRFBQX01TR19GTFVTSF9BQ0s6Ci0JCU1NX0RCRygiRkxVU0hfQUNLXG4iKTsKLQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBQX01TR19QQ01ETUFNSVNTRUQ6Ci0JCU1NX0RCRygiUENNRE1BTUlTU0VEXG4iKTsKLQkJYXVkaW8tPnRlb3MgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURQUF9NU0dfQVZTWU5DX01TRzoKLQkJcHJfaW5mbygiJXM6IEFWU1lOQ19NU0dcbiIsIF9fZnVuY19fKTsKLQkJbWVtY3B5KCZhdWRpby0+YXZzeW5jWzBdLCBtc2csIHNpemVvZihhdWRpby0+YXZzeW5jKSk7Ci0JCWF1ZGlvLT5hdnN5bmNfZmxhZyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT5hdnN5bmNfd2FpdCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJTU1fREJHKCJhdWRpb19kc3BfZXZlbnQ6IFVOS05PV04gKCVkKVxuIiwgaWQpOwotCX0KLQotfQotCi0KLXN0cnVjdCBtc21fYWRzcF9vcHMgYXVkcGNtZGVjX2Fkc3Bfb3BzID0gewotCS5ldmVudCA9IGF1ZHBsYXlfZHNwX2V2ZW50LAotfTsKLQotCi0jZGVmaW5lIGF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHBsYXksIGF1ZGlvLT5xdWV1ZV9pZCwgXAotCQkJY21kLCBsZW4pCi0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19kZWNfdHlwZSBjZmdfZGVjX2NtZDsKLQotCW1lbXNldCgmY2ZnX2RlY19jbWQsIDAsIHNpemVvZihjZmdfZGVjX2NtZCkpOwotCi0JY2ZnX2RlY19jbWQuY21kX2lkID0gQVVEUFBfQ01EX0NGR19ERUNfVFlQRTsKLQlpZiAoZW5hYmxlKQotCQljZmdfZGVjX2NtZC5kZWNfY2ZnID0gQVVEUFBfQ01EX1VQREFUREVfQ0ZHX0RFQyB8Ci0JCQkJQVVEUFBfQ01EX0VOQV9ERUNfViB8IEFVRERFQ19ERUNfUENNOwotCWVsc2UKLQkJY2ZnX2RlY19jbWQuZGVjX2NmZyA9IEFVRFBQX0NNRF9VUERBVERFX0NGR19ERUMgfAotCQkJCUFVRFBQX0NNRF9ESVNfREVDX1Y7Ci0JY2ZnX2RlY19jbWQuZG1fbW9kZSA9IDB4MDsKLQljZmdfZGVjX2NtZC5zdHJlYW1faWQgPSBhdWRpby0+ZGVjX2lkOwotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMSgmY2ZnX2RlY19jbWQsIHNpemVvZihjZmdfZGVjX2NtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfd2F2IGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNvbW1vbi5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TOwotCWNtZC5jb21tb24ubGVuZ3RoID0gQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNU19XQVZfTEVOID4+IDE7Ci0JY21kLmNvbW1vbi5kZWNfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5jb21tb24uaW5wdXRfc2FtcGxpbmdfZnJlcXVlbmN5ID0gYXVkaW8tPm91dF9zYW1wbGVfcmF0ZTsKLQljbWQuc3RlcmVvX2NmZyA9IGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlOwotCWNtZC5wY21fd2lkdGggPSBhdWRpby0+b3V0X2JpdHM7Ci0JY21kLnNpZ24gPSAwOwotCWF1ZHBwX3NlbmRfcXVldWUyKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJCQkJdW5zaWduZWQgaWR4LCB1bnNpZ25lZCBsZW4pCi17Ci0Jc3RydWN0IGF1ZHBsYXlfY21kX2JpdHN0cmVhbV9kYXRhX2F2YWlsIGNtZDsKLQotCWNtZC5jbWRfaWQJCT0gQVVEUExBWV9DTURfQklUU1RSRUFNX0RBVEFfQVZBSUw7Ci0JY21kLmRlY29kZXJfaWQJCT0gYXVkaW8tPmRlY19pZDsKLQljbWQuYnVmX3B0cgkJPSBhdWRpby0+b3V0W2lkeF0uYWRkcjsKLQljbWQuYnVmX3NpemUJCT0gbGVuLzI7Ci0JY21kLnBhcnRpdGlvbl9udW1iZXIJPSAwOwotCS8qIGNvbXBsZXRlIHdyaXRlcyB0byB0aGUgaW5wdXQgYnVmZmVyICovCi0Jd21iKCk7Ci0JcmV0dXJuIGF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGNtX2FzeW5jX3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghYXVkaW8tPnJ1bm5pbmcpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQotCWlmIChuZWVkZWQgJiYgIWF1ZGlvLT53Zmx1c2gpIHsKLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAxOwotCQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19PQlVGX0dJVkVOKSB7Ci0JCQkvKiBwb3Agb25lIG5vZGUgb3V0IG9mIHF1ZXVlICovCi0JCQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCQkJc3RydWN0IGF1ZHBjbV9idWZmZXJfbm9kZSAqdXNlZF9idWY7Ci0KLQkJCU1NX0RCRygiY29uc3VtZWRcbiIpOwotCi0JCQlCVUdfT04obGlzdF9lbXB0eSgmYXVkaW8tPm91dF9xdWV1ZSkpOwotCQkJdXNlZF9idWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+b3V0X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWRwY21fYnVmZmVyX25vZGUsIGxpc3QpOwotCQkJbGlzdF9kZWwoJnVzZWRfYnVmLT5saXN0KTsKLQkJCXBheWxvYWQuYWlvX2J1ZiA9IHVzZWRfYnVmLT5idWY7Ci0JCQlhdWRwY21fcG9zdF9ldmVudChhdWRpbywgQVVESU9fRVZFTlRfV1JJVEVfRE9ORSwKLQkJCQlwYXlsb2FkKTsKLQkJCWtmcmVlKHVzZWRfYnVmKTsKLQkJCWF1ZGlvLT5kcnZfc3RhdHVzICY9IH5BRFJWX1NUQVRVU19PQlVGX0dJVkVOOwotCQl9Ci0JfQotCWlmIChhdWRpby0+b3V0X25lZWRlZCkgewotCQlzdHJ1Y3QgYXVkcGNtX2J1ZmZlcl9ub2RlICpuZXh0X2J1ZjsKLQkJc3RydWN0IGF1ZHBsYXlfY21kX2JpdHN0cmVhbV9kYXRhX2F2YWlsIGNtZDsKLQkJaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+b3V0X3F1ZXVlKSkgewotCQkJbmV4dF9idWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+b3V0X3F1ZXVlLAotCQkJCQlzdHJ1Y3QgYXVkcGNtX2J1ZmZlcl9ub2RlLCBsaXN0KTsKLQkJCU1NX0RCRygibmV4dF9idWYgJXBcbiIsIG5leHRfYnVmKTsKLQkJCWlmIChuZXh0X2J1ZikgewotCQkJCU1NX0RCRygibmV4dCBidWYgcGh5ICVseCBsZW4gJWRcbiIsCi0JCQkJbmV4dF9idWYtPnBhZGRyLCBuZXh0X2J1Zi0+YnVmLmRhdGFfbGVuKTsKLQotCQkJCWNtZC5jbWRfaWQgPSBBVURQTEFZX0NNRF9CSVRTVFJFQU1fREFUQV9BVkFJTDsKLQkJCQlpZiAobmV4dF9idWYtPmJ1Zi5kYXRhX2xlbikKLQkJCQkJY21kLmRlY29kZXJfaWQgPSBhdWRpby0+ZGVjX2lkOwotCQkJCWVsc2UgewotCQkJCQljbWQuZGVjb2Rlcl9pZCA9IC0xOwotCQkJCQlNTV9EQkcoImlucHV0IEVPUyBzaWduYWxlZFxuIik7Ci0JCQkJfQotCQkJCWNtZC5idWZfcHRyCT0gKHVuc2lnbmVkKSBuZXh0X2J1Zi0+cGFkZHI7Ci0JCQkJY21kLmJ1Zl9zaXplID0gbmV4dF9idWYtPmJ1Zi5kYXRhX2xlbiA+PiAxOwotCQkJCWNtZC5wYXJ0aXRpb25fbnVtYmVyCT0gMDsKLQkJCQkvKiBjb21wbGV0ZSB3cml0ZXMgdG8gdGhlIGlucHV0IGJ1ZmZlciAqLwotCQkJCXdtYigpOwotCQkJCWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLQkJCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCQkJYXVkaW8tPmRydl9zdGF0dXMgfD0gQURSVl9TVEFUVVNfT0JVRl9HSVZFTjsKLQkJCX0KLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGxheV9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgbmVlZGVkKQotewotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWF1ZGlvLT5ydW5uaW5nKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0KLQlpZiAobmVlZGVkICYmICFhdWRpby0+d2ZsdXNoKSB7Ci0JCS8qIFdlIHdlcmUgY2FsbGVkIGZyb20gdGhlIGNhbGxiYWNrIGJlY2F1c2UgdGhlIERTUAotCQkgKiByZXF1ZXN0ZWQgbW9yZSBkYXRhLiAgTm90ZSB0aGF0IHRoZSBEU1AgZG9lcyB3YW50Ci0JCSAqIG1vcmUgZGF0YSwgYW5kIGlmIGEgYnVmZmVyIHdhcyBpbi1mbGlnaHQsIG1hcmsgaXQKLQkJICogYXMgYXZhaWxhYmxlIChzaW5jZSB0aGUgRFNQIG11c3Qgbm93IGJlIGRvbmUgd2l0aAotCQkgKiBpdCkuCi0JCSAqLwotCQlhdWRpby0+b3V0X25lZWRlZCA9IDE7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpIHsKLQkJCU1NX0RCRygiZnJhbWUgJWQgZnJlZVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJCWZyYW1lLT51c2VkID0gMDsKLQkJCWF1ZGlvLT5vdXRfdGFpbCBePSAxOwotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl9Ci0JfQotCi0JaWYgKGF1ZGlvLT5vdXRfbmVlZGVkKSB7Ci0JCS8qIElmIHRoZSBEU1AgY3VycmVudGx5IHdhbnRzIGRhdGEgYW5kIHdlIGhhdmUgYQotCQkgKiBidWZmZXIgYXZhaWxhYmxlLCB3ZSB3aWxsIHNlbmQgaXQgYW5kIHJlc2V0Ci0JCSAqIHRoZSBuZWVkZWQgZmxhZy4gIFdlJ2xsIG1hcmsgdGhlIGJ1ZmZlciBhcyBpbi1mbGlnaHQKLQkJICogc28gdGhhdCBpdCB3b24ndCBiZSByZWN5Y2xlZCB1bnRpbCB0aGUgbmV4dCBidWZmZXIKLQkJICogaXMgcmVxdWVzdGVkCi0JCSAqLwotCi0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkKSB7Ci0JCQlCVUdfT04oZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZik7Ci0JCQlNTV9EQkcoImZyYW1lICVkIGJ1c3lcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JCQlhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoYXVkaW8sIGF1ZGlvLT5vdXRfdGFpbCwKLQkJCQkJZnJhbWUtPnVzZWQpOwotCQkJZnJhbWUtPnVzZWQgPSAweGZmZmZmZmZmOwotCQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZHBjbV9hc3luY19mbHVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwY21fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5vdXRfcXVldWUpIHsKLQkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGF1ZHBjbV9idWZmZXJfbm9kZSwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0JCXBheWxvYWQuYWlvX2J1ZiA9IGJ1Zl9ub2RlLT5idWY7Ci0JCWF1ZHBjbV9wb3N0X2V2ZW50KGF1ZGlvLCBBVURJT19FVkVOVF9XUklURV9ET05FLAotCQkJCXBheWxvYWQpOwotCQlrZnJlZShidWZfbm9kZSk7Ci0JfQotCWF1ZGlvLT5kcnZfc3RhdHVzICY9IH5BRFJWX1NUQVRVU19PQlVGX0dJVkVOOwotCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQlhdG9taWNfc2V0KCZhdWRpby0+b3V0X2J5dGVzLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fZmx1c2goc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlhdWRpby0+b3V0WzBdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRbMV0udXNlZCA9IDA7Ci0JYXVkaW8tPm91dF9oZWFkID0gMDsKLQlhdWRpby0+b3V0X3RhaWwgPSAwOwotCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCWF0b21pY19zZXQoJmF1ZGlvLT5vdXRfYnl0ZXMsIDApOwotfQotCi1zdGF0aWMgdm9pZCBhdWRpb19pb3BvcnRfcmVzZXQoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19BSU9fSU5URikgewotCQkvKiBJZiBmc3luYyBpcyBpbiBwcm9ncmVzcywgbWFrZSBzdXJlCi0JCSAqIHJldHVybiB2YWx1ZSBvZiBmc3luYyBpbmRpY2F0ZXMKLQkJICogYWJvcnQgZHVlIHRvIGZsdXNoCi0JCSAqLwotCQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19GU1lOQykgewotCQkJTU1fREJHKCJmc3luYyBpbiBwcm9ncmVzc1xuIik7Ci0JCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JCQlhdWRpby0+ZHJ2X29wcy5vdXRfZmx1c2goYXVkaW8pOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JCX0gZWxzZQotCQkJYXVkaW8tPmRydl9vcHMub3V0X2ZsdXNoKGF1ZGlvKTsKLQl9IGVsc2UgewotCQkvKiBNYWtlIHN1cmUgcmVhZC93cml0ZSB0aHJlYWQgYXJlIGZyZWUgZnJvbQotCQkgKiBzbGVlcCBhbmQga25vd2luZyB0aGF0IHN5c3RlbSBpcyBub3QgYWJsZQotCQkgKiB0byBwcm9jZXNzIGlvIHJlcXVlc3QgYXQgdGhlIG1vbWVudAotCQkgKi8KLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JCWF1ZGlvLT5kcnZfb3BzLm91dF9mbHVzaChhdWRpbyk7Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCX0KLQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAxOwotCXdha2VfdXAoJmF1ZGlvLT5hdnN5bmNfd2FpdCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcGNtX2V2ZW50c19wZW5kaW5nKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZW1wdHk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQllbXB0eSA9ICFsaXN0X2VtcHR5KCZhdWRpby0+ZXZlbnRfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGVtcHR5IHx8IGF1ZGlvLT5ldmVudF9hYm9ydDsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGNtX3Jlc2V0X2V2ZW50X3F1ZXVlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYXVkcGNtX2V2ZW50ICpkcnZfZXZ0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQlzdHJ1Y3QgYXVkcGNtX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCXN0cnVjdCBhdWRwY21fZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgbG9uZyBhdWRwY21fcHJvY2Vzc19ldmVudF9yZXEoc3RydWN0IGF1ZGlvICphdWRpbywgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlsb25nIHJjOwotCXN0cnVjdCBtc21fYXVkaW9fZXZlbnQgdXNyX2V2dDsKLQlzdHJ1Y3QgYXVkcGNtX2V2ZW50ICpkcnZfZXZ0ID0gTlVMTDsKLQlpbnQgdGltZW91dDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ1c3JfZXZ0LCBhcmcsIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JdGltZW91dCA9IChpbnQpIHVzcl9ldnQudGltZW91dF9tczsKLQotCWlmICh0aW1lb3V0ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAotCQkJYXVkaW8tPmV2ZW50X3dhaXQsIGF1ZHBjbV9ldmVudHNfcGVuZGluZyhhdWRpbyksCi0JCQltc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9IGVsc2UgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCWF1ZGlvLT5ldmVudF93YWl0LCBhdWRwY21fZXZlbnRzX3BlbmRpbmcoYXVkaW8pKTsKLQl9Ci0KLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoYXVkaW8tPmV2ZW50X2Fib3J0KSB7Ci0JCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDA7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmV2ZW50X3F1ZXVlKSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmV2ZW50X3F1ZXVlLAotCQkJc3RydWN0IGF1ZHBjbV9ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQl9Ci0JaWYgKGRydl9ldnQpIHsKLQkJdXNyX2V2dC5ldmVudF90eXBlID0gZHJ2X2V2dC0+ZXZlbnRfdHlwZTsKLQkJdXNyX2V2dC5ldmVudF9wYXlsb2FkID0gZHJ2X2V2dC0+cGF5bG9hZDsKLQkJbGlzdF9hZGRfdGFpbCgmZHJ2X2V2dC0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQl9IGVsc2UKLQkJcmMgPSAtMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGRydl9ldnQgJiYgZHJ2X2V2dC0+ZXZlbnRfdHlwZSA9PSBBVURJT19FVkVOVF9XUklURV9ET05FKSB7Ci0JCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQkJYXVkcGNtX3BtZW1fZml4dXAoYXVkaW8sIGRydl9ldnQtPnBheWxvYWQuYWlvX2J1Zi5idWZfYWRkciwKLQkJCQkgIGRydl9ldnQtPnBheWxvYWQuYWlvX2J1Zi5idWZfbGVuLCAwKTsKLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JfQotCWlmICghcmMgJiYgY29weV90b191c2VyKGFyZywgJnVzcl9ldnQsIHNpemVvZih1c3JfZXZ0KSkpCi0JCXJjID0gLUVGQVVMVDsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRwY21fcG1lbV9sb29rdXBfdmFkZHIoc3RydWN0IGF1ZGlvICphdWRpbywgdm9pZCAqYWRkciwKLQkJICAgICB1bnNpZ25lZCBsb25nIGxlbiwgc3RydWN0IGF1ZHBjbV9wbWVtX3JlZ2lvbiAqKnJlZ2lvbikKLXsKLQlzdHJ1Y3QgYXVkcGNtX3BtZW1fcmVnaW9uICpyZWdpb25fZWx0OwotCi0JaW50IG1hdGNoX2NvdW50ID0gMDsKLQotCSpyZWdpb24gPSBOVUxMOwotCi0JLyogcmV0dXJucyBwaHlzaWNhbCBhZGRyZXNzIG9yIHplcm8gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZ2lvbl9lbHQsICZhdWRpby0+cG1lbV9yZWdpb25fcXVldWUsCi0JCWxpc3QpIHsKLQkJaWYgKGFkZHIgPj0gcmVnaW9uX2VsdC0+dmFkZHIgJiYKLQkJICAgIGFkZHIgPCByZWdpb25fZWx0LT52YWRkciArIHJlZ2lvbl9lbHQtPmxlbiAmJgotCQkgICAgYWRkciArIGxlbiA8PSByZWdpb25fZWx0LT52YWRkciArIHJlZ2lvbl9lbHQtPmxlbikgewotCQkJLyogb2Zmc2V0IHNpbmNlIHdlIGNvdWxkIHBhc3MgdmFkZHIgaW5zaWRlIGEgcmVnaXN0ZXJkCi0JCQkgKiBwbWVtIGJ1ZmZlcgotCQkJICovCi0JCQltYXRjaF9jb3VudCsrOwotCQkJaWYgKCEqcmVnaW9uKQotCQkJCSpyZWdpb24gPSByZWdpb25fZWx0OwotCQl9Ci0JfQotCi0JaWYgKG1hdGNoX2NvdW50ID4gMSkgewotCQlNTV9FUlIoIm11bHRpcGxlIGhpdHMgZm9yIHZhZGRyICVwLCBsZW4gJWxkXG4iLCBhZGRyLCBsZW4pOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZ2lvbl9lbHQsCi0JCSAgJmF1ZGlvLT5wbWVtX3JlZ2lvbl9xdWV1ZSwgbGlzdCkgewotCQkJaWYgKGFkZHIgPj0gcmVnaW9uX2VsdC0+dmFkZHIgJiYKLQkJCSAgICBhZGRyIDwgcmVnaW9uX2VsdC0+dmFkZHIgKyByZWdpb25fZWx0LT5sZW4gJiYKLQkJCSAgICBhZGRyICsgbGVuIDw9IHJlZ2lvbl9lbHQtPnZhZGRyICsgcmVnaW9uX2VsdC0+bGVuKQotCQkJCU1NX0VSUigiXHQlcCwgJWxkIC0tPiAlcFxuIiwKLQkJCQkJcmVnaW9uX2VsdC0+dmFkZHIsCi0JCQkJCXJlZ2lvbl9lbHQtPmxlbiwKLQkJCQkJKHZvaWQgKilyZWdpb25fZWx0LT5wYWRkcik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKnJlZ2lvbiA/IDAgOiAtMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgYXVkcGNtX3BtZW1fZml4dXAoc3RydWN0IGF1ZGlvICphdWRpbywgdm9pZCAqYWRkciwKLQkJICAgIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgcmVmX3VwKQotewotCXN0cnVjdCBhdWRwY21fcG1lbV9yZWdpb24gKnJlZ2lvbjsKLQl1bnNpZ25lZCBsb25nIHBhZGRyOwotCWludCByZXQ7Ci0KLQlyZXQgPSBhdWRwY21fcG1lbV9sb29rdXBfdmFkZHIoYXVkaW8sIGFkZHIsIGxlbiwgJnJlZ2lvbik7Ci0JaWYgKHJldCkgewotCQlNTV9FUlIoImxvb2t1cCAoJXAsICVsZCkgZmFpbGVkXG4iLCBhZGRyLCBsZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHJlZl91cCkKLQkJcmVnaW9uLT5yZWZfY250Kys7Ci0JZWxzZQotCQlyZWdpb24tPnJlZl9jbnQtLTsKLQlNTV9EQkcoImZvdW5kIHJlZ2lvbiAlcCByZWZfY250ICVkXG4iLCByZWdpb24sIHJlZ2lvbi0+cmVmX2NudCk7Ci0JcGFkZHIgPSByZWdpb24tPnBhZGRyICsgKGFkZHIgLSByZWdpb24tPnZhZGRyKTsKLQlyZXR1cm4gcGFkZHI7Ci19Ci0KLS8qIGF1ZGlvIC0+IGxvY2sgbXVzdCBiZSBoZWxkIGF0IHRoaXMgcG9pbnQgKi8KLXN0YXRpYyBpbnQgYXVkcGNtX2Fpb19idWZfYWRkKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVuc2lnbmVkIGRpciwKLQl2b2lkIF9fdXNlciAqYXJnKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGF1ZHBjbV9idWZmZXJfbm9kZSAqYnVmX25vZGU7Ci0KLQlidWZfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKCpidWZfbm9kZSksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFidWZfbm9kZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1Zl9ub2RlLT5idWYsIGFyZywgc2l6ZW9mKGJ1Zl9ub2RlLT5idWYpKSkgewotCQlrZnJlZShidWZfbm9kZSk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCU1NX0RCRygibm9kZSAlcCBkaXIgJXggYnVmX2FkZHIgJXAgYnVmX2xlbiAlZCBkYXRhX2xlbiAlZFxuIiwKLQkJCWJ1Zl9ub2RlLCBkaXIsIGJ1Zl9ub2RlLT5idWYuYnVmX2FkZHIsCi0JCQlidWZfbm9kZS0+YnVmLmJ1Zl9sZW4sIGJ1Zl9ub2RlLT5idWYuZGF0YV9sZW4pOwotCi0JYnVmX25vZGUtPnBhZGRyID0gYXVkcGNtX3BtZW1fZml4dXAoCi0JCWF1ZGlvLCBidWZfbm9kZS0+YnVmLmJ1Zl9hZGRyLAotCQlidWZfbm9kZS0+YnVmLmJ1Zl9sZW4sIDEpOwotCWlmIChkaXIpIHsKLQkJLyogd3JpdGUgKi8KLQkJaWYgKCFidWZfbm9kZS0+cGFkZHIgfHwKLQkJICAgIChidWZfbm9kZS0+cGFkZHIgJiAweDEpIHx8Ci0JCSAgICAoYnVmX25vZGUtPmJ1Zi5kYXRhX2xlbiAmIDB4MSkgfHwKLQkJICAgICghYnVmX25vZGUtPmJ1Zi5kYXRhX2xlbikpIHsKLQkJCWtmcmVlKGJ1Zl9ub2RlKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsICZhdWRpby0+b3V0X3F1ZXVlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT5kcnZfb3BzLnNlbmRfZGF0YShhdWRpbywgMCk7Ci0JfQotCi0JTU1fREJHKCJBZGQgYnVmX25vZGUgJXAgcGFkZHIgJWx4XG4iLCBidWZfbm9kZSwgYnVmX25vZGUtPnBhZGRyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2dldF9hdnN5bmNfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQkJCQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyAqc3RhdHMpCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlmIChhdWRpby0+ZGVjX2lkID09IGF1ZGlvLT5hdnN5bmNbMF0gJiYgYXVkaW8tPmF2c3luY19mbGFnKSB7Ci0JCS8qIGF2X3N5bmMgc2FtcGxlIGNvdW50ICovCi0JCXN0YXRzLT5zYW1wbGVfY291bnQgPSAoYXVkaW8tPmF2c3luY1syXSA8PCAxNikgfAotCQkJCQkJKGF1ZGlvLT5hdnN5bmNbM10pOwotCi0JCS8qIGF2X3N5bmMgYnl0ZV9jb3VudCAqLwotCQlzdGF0cy0+Ynl0ZV9jb3VudCA9IChhdWRpby0+YXZzeW5jWzVdIDw8IDE2KSB8Ci0JCQkJCQkoYXVkaW8tPmF2c3luY1s2XSk7Ci0KLQkJYXVkaW8tPmF2c3luY19mbGFnID0gMDsKLQkJcmMgPSAwOwotCX0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIHJjOwotCi19Ci0KLXN0YXRpYyBsb25nIGF1ZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoImNtZCA9ICVkXG4iLCBjbWQpOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfU1RBVFMpIHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyBzdGF0czsKLQotCQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAwOwotCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKLQkJaWYgKGF1ZHBwX3F1ZXJ5X2F2c3luYyhhdWRpby0+ZGVjX2lkKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+YXZzeW5jX3dhaXQsCi0JCQkJKGF1ZGlvLT5hdnN5bmNfZmxhZyA9PSAxKSwKLQkJCQltc2Vjc190b19qaWZmaWVzKEFVRFBQX0FWU1lOQ19FVkVOVF9USU1FT1VUKSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJZWxzZSBpZiAoKHJjID4gMCkgfHwgKChyYyA9PSAwKSAmJiAoYXVkaW8tPmF2c3luY19mbGFnID09IDEpKSkgewotCQkJaWYgKGF1ZGlvX2dldF9hdnN5bmNfZGF0YShhdWRpbywgJnN0YXRzKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCWlmIChjbWQgPT0gQVVESU9fU0VUX1ZPTFVNRSkgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2x1bWUgPSBhcmc7Ci0JCWlmIChhdWRpby0+cnVubmluZykKLQkJCWF1ZHBwX3NldF92b2x1bWVfYW5kX3BhbihhdWRpby0+ZGVjX2lkLCBhcmcsIDAsCi0JCQkJCVBPUFApOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChjbWQgPT0gQVVESU9fR0VUX0VWRU5UKSB7Ci0JCU1NX0RCRygiQVVESU9fR0VUX0VWRU5UXG4iKTsKLQkJaWYgKG11dGV4X3RyeWxvY2soJmF1ZGlvLT5nZXRfZXZlbnRfbG9jaykpIHsKLQkJCXJjID0gYXVkcGNtX3Byb2Nlc3NfZXZlbnRfcmVxKGF1ZGlvLAotCQkJCSh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCQl9IGVsc2UKLQkJCXJjID0gLUVCVVNZOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKGNtZCA9PSBBVURJT19BQk9SVF9HRVRfRVZFTlQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCQlNTV9EQkcoIkFVRElPX1NUQVJUXG4iKTsKLQkJcmMgPSBhdWRpb19lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUsCi0JCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0RFQ09ERVJfV0FJVF9NUykpOwotCQkJTU1fSU5GTygiZGVjX3N0YXRlICVkIHJjID0gJWRcbiIsIGF1ZGlvLT5kZWNfc3RhdGUsIHJjKTsKLQotCQkJaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1MpCi0JCQkJcmMgPSAtRU5PREVWOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NUT1A6Ci0JCU1NX0RCRygiQVVESU9fU1RPUFxuIik7Ci0JCXJjID0gYXVkaW9fZGlzYWJsZShhdWRpbyk7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMTsKLQkJYXVkaW9faW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQljYXNlIEFVRElPX0ZMVVNIOgotCQlNTV9EQkcoIkFVRElPX0ZMVVNIXG4iKTsKLQkJYXVkaW8tPndmbHVzaCA9IDE7Ci0JCWF1ZGlvX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWlmIChhdWRpby0+cnVubmluZykgewotCQkJYXVkcHBfZmx1c2goYXVkaW8tPmRlY19pZCk7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkhYXVkaW8tPndmbHVzaCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJTU1fRVJSKCJBVURJT19GTFVTSCBpbnRlcnJ1cHRlZFxuIik7Ci0JCQkJcmMgPSAtRUlOVFI7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQVVESU9fU0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjb25maWc7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY29uZmlnLCAodm9pZCAqKSBhcmcsIHNpemVvZihjb25maWcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvbmZpZy5jaGFubmVsX2NvdW50ID09IDEpIHsKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gQVVEUFBfQ01EX1BDTV9JTlRGX01PTk9fVjsKLQkJfSBlbHNlIGlmIChjb25maWcuY2hhbm5lbF9jb3VudCA9PSAyKSB7Ci0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IEFVRFBQX0NNRF9QQ01fSU5URl9TVEVSRU9fVjsKLQkJfSBlbHNlIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjb25maWcuYml0cyA9PSA4KQotCQkJY29uZmlnLmJpdHMgPSBBVURQUF9DTURfV0FWX1BDTV9XSURUSF84OwotCQllbHNlIGlmIChjb25maWcuYml0cyA9PSAxNikKLQkJCWNvbmZpZy5iaXRzID0gQVVEUFBfQ01EX1dBVl9QQ01fV0lEVEhfMTY7Ci0JCWVsc2UgaWYgKGNvbmZpZy5iaXRzID09IDI0KQotCQkJY29uZmlnLmJpdHMgPSBBVURQUF9DTURfV0FWX1BDTV9XSURUSF8yNDsKLQkJZWxzZSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlhdWRpby0+b3V0X3NhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotCQlhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9IGNvbmZpZy5jaGFubmVsX2NvdW50OwotCQlhdWRpby0+b3V0X2JpdHMgPSBjb25maWcuYml0czsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjb25maWc7Ci0JCWNvbmZpZy5idWZmZXJfc2l6ZSA9IChhdWRpby0+b3V0X2RtYV9zeiA+PiAxKTsKLQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IDI7Ci0JCWNvbmZpZy5zYW1wbGVfcmF0ZSA9IGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGU7Ci0JCWlmIChhdWRpby0+b3V0X2NoYW5uZWxfbW9kZSA9PSBBVURQUF9DTURfUENNX0lOVEZfTU9OT19WKQotCQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSAxOwotCQllbHNlCi0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IDI7Ci0JCWlmIChhdWRpby0+b3V0X2JpdHMgPT0gQVVEUFBfQ01EX1dBVl9QQ01fV0lEVEhfOCkKLQkJCWNvbmZpZy5iaXRzID0gODsKLQkJZWxzZSBpZiAoYXVkaW8tPm91dF9iaXRzID09IEFVRFBQX0NNRF9XQVZfUENNX1dJRFRIXzI0KQotCQkJY29uZmlnLmJpdHMgPSAyNDsKLQkJZWxzZQotCQkJY29uZmlnLmJpdHMgPSAxNjsKLQkJY29uZmlnLnVudXNlZFswXSA9IDA7Ci0JCWNvbmZpZy51bnVzZWRbMV0gPSAwOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmY29uZmlnLCBzaXplb2YoY29uZmlnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBBVURJT19QQVVTRToKLQkJTU1fREJHKCJBVURJT19QQVVTRSAlbGRcbiIsIGFyZyk7Ci0JCXJjID0gYXVkcHBfcGF1c2UoYXVkaW8tPmRlY19pZCwgKGludCkgYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX0FTWU5DX1dSSVRFOgotCQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19GU1lOQykKLQkJCXJjID0gLUVCVVNZOwotCQllbHNlCi0JCQlyYyA9IGF1ZHBjbV9haW9fYnVmX2FkZChhdWRpbywgMSwgKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19BU1lOQ19SRUFEOgotCQlNTV9FUlIoIkFVRElPX0FTWU5DX1JFQUQgbm90IHN1cHBvcnRlZFxuIik7Ci0JCXJjID0gLUVQRVJNOwotCQlicmVhazsKLQotCWNhc2UgQVVESU9fR0VUX1NFU1NJT05fSUQ6Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmYXVkaW8tPmRlY19pZCwKLQkJCQkJc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIE9ubHkgdXNlZnVsIGluIHR1bm5lbC1tb2RlICovCi1pbnQgYXVkcGNtX2FzeW5jX2ZzeW5jKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQkvKiBCbG9ja2luZyBjbGllbnQgc2VuZHMgbW9yZSBkYXRhICovCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGlvLT5kcnZfc3RhdHVzIHw9IEFEUlZfU1RBVFVTX0ZTWU5DOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCS8qIHBjbSBkbWFtaXNzIG1lc3NhZ2UgaXMgc2VudCBjb250aW5vdXNseQotCSAqIHdoZW4gZGVjb2RlciBpcyBzdGFydmVkIHNvIG5vIHJhY2UKLQkgKiBjb25kaXRpb24gY29uY2VybgotCSAqLwotCWF1ZGlvLT50ZW9zID0gMDsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoYXVkaW8tPnRlb3MgJiYgYXVkaW8tPm91dF9uZWVkZWQgJiYKLQkJbGlzdF9lbXB0eSgmYXVkaW8tPm91dF9xdWV1ZSkpCi0JCXx8IGF1ZGlvLT53Zmx1c2ggfHwgYXVkaW8tPnN0b3BwZWQpOwotCi0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpCi0JCXJjID0gLUVCVVNZOwotCi0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGlvLT5kcnZfc3RhdHVzICY9IH5BRFJWX1NUQVRVU19GU1lOQzsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQotCXJldHVybiByYzsKLX0KLQotaW50IGF1ZHBjbV9zeW5jX2ZzeW5jKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKCFhdWRpby0+b3V0WzBdLnVzZWQgJiYKLQkJIWF1ZGlvLT5vdXRbMV0udXNlZCAmJgotCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChhdWRpby0+cmVzZXJ2ZWQpIHsKLQkJTU1fREJHKCJzZW5kIHJlc2VydmVkIGJ5dGVcbiIpOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMF0gPSBhdWRpby0+cnN2X2J5dGU7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMV0gPSAwOwotCQlmcmFtZS0+dXNlZCA9IDI7Ci0JCWF1ZGlvLT5kcnZfb3BzLnNlbmRfZGF0YShhdWRpbywgMCk7Ci0KLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkoIWF1ZGlvLT5vdXRbMF0udXNlZCAmJgotCQkJIWF1ZGlvLT5vdXRbMV0udXNlZCAmJgotCQkJYXVkaW8tPm91dF9uZWVkZWQpIHx8IGF1ZGlvLT53Zmx1c2gpOwotCi0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGRvbmU7Ci0JCWVsc2UgaWYgKGF1ZGlvLT53Zmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCi0JLyogcGNtIGRtYW1pc3MgbWVzc2FnZSBpcyBzZW50IGNvbnRpbm91c2x5Ci0JICogd2hlbiBkZWNvZGVyIGlzIHN0YXJ2ZWQgc28gbm8gcmFjZQotCSAqIGNvbmRpdGlvbiBjb25jZXJuCi0JICovCi0JYXVkaW8tPnRlb3MgPSAwOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCWF1ZGlvLT50ZW9zIHx8IGF1ZGlvLT53Zmx1c2gpOwotCi0JaWYgKGF1ZGlvLT53Zmx1c2gpCi0JCXJjID0gLUVCVVNZOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXJldHVybiByYzsKLX0KLQotaW50IGF1ZHBjbV9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHBwb3MxLCBsb2ZmX3QgcHBvczIsIGludCBkYXRhc3luYykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKCFhdWRpby0+cnVubmluZykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gYXVkaW8tPmRydl9vcHMuZnN5bmMoYXVkaW8pOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRpb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0Jc2l6ZV90IHhmZXI7Ci0JY2hhciAqY3B5X3B0cjsKLQlpbnQgcmMgPSAwOwotCXVuc2lnbmVkIGRzaXplOwotCi0JaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfQUlPX0lOVEYpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlNTV9EQkcoImNudD0lZFxuIiwgY291bnQpOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF9oZWFkOwotCQljcHlfcHRyID0gZnJhbWUtPmRhdGE7Ci0JCWRzaXplID0gMDsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJCSAgICAgIChmcmFtZS0+dXNlZCA9PSAwKQotCQkJCQkgICAgICB8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCQkJCQkgIHx8IChhdWRpby0+d2ZsdXNoKSk7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQkJaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoYXVkaW8tPnJlc2VydmVkKSB7Ci0JCQlNTV9EQkcoImFwcGVuZCByZXNlcnZlZCBieXRlICV4XG4iLCBhdWRpby0+cnN2X2J5dGUpOwotCQkJKmNweV9wdHIgPSBhdWRpby0+cnN2X2J5dGU7Ci0JCQl4ZmVyID0gKGNvdW50ID4gKGZyYW1lLT5zaXplIC0gMSkpID8KLQkJCQlmcmFtZS0+c2l6ZSAtIDEgOiBjb3VudDsKLQkJCWNweV9wdHIrKzsKLQkJCWRzaXplID0gMTsKLQkJCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JCX0gZWxzZQotCQkJeGZlciA9IChjb3VudCA+IGZyYW1lLT5zaXplKSA/IGZyYW1lLT5zaXplIDogY291bnQ7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNweV9wdHIsIGJ1ZiwgeGZlcikpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZHNpemUgKz0geGZlcjsKLQkJaWYgKGRzaXplICYgMSkgewotCQkJYXVkaW8tPnJzdl9ieXRlID0gKChjaGFyICopIGZyYW1lLT5kYXRhKVtkc2l6ZSAtIDFdOwotCQkJTU1fREJHKCJvZGQgbGVuZ3RoIGJ1ZiByZXNlcnZlIGxhc3QgYnl0ZSAleFxuIiwKLQkJCQkJYXVkaW8tPnJzdl9ieXRlKTsKLQkJCWF1ZGlvLT5yZXNlcnZlZCA9IDE7Ci0JCQlkc2l6ZS0tOwotCQl9Ci0JCWNvdW50IC09IHhmZXI7Ci0JCWJ1ZiArPSB4ZmVyOwotCi0JCWlmIChkc2l6ZSA+IDApIHsKLQkJCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCQkJZnJhbWUtPnVzZWQgPSBkc2l6ZTsKLQkJCWF1ZGlvLT5kcnZfb3BzLnNlbmRfZGF0YShhdWRpbywgMCk7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JaWYgKGJ1ZiA+IHN0YXJ0KQotCQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JTU1fSU5GTygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGZyZWVpbmdcbiIsIChpbnQpYXVkaW8pOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGRldl91bnJlZ2lzdGVyX2V2dF9saXN0bmVyKEFVRERFVl9DTE5UX0RFQywgYXVkaW8tPmRlY19pZCk7Ci0JYXVkaW9fZGlzYWJsZShhdWRpbyk7Ci0JYXVkaW8tPmRydl9vcHMub3V0X2ZsdXNoKGF1ZGlvKTsKLQotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci0JYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0JdW5yZWdpc3Rlcl9lYXJseV9zdXNwZW5kKCZhdWRpby0+c3VzcGVuZF9jdGwubm9kZSk7Ci0jZW5kaWYKLQlhdWRpby0+b3BlbmVkID0gMDsKLQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAxOwotCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQlhdWRwY21fcmVzZXRfZXZlbnRfcXVldWUoYXVkaW8pOwotCWlmIChhdWRpby0+ZGF0YSkgewotCQlpb3VubWFwKGF1ZGlvLT5tYXBfdl93cml0ZSk7Ci0JCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPnBoeXMpOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlpZiAoYXVkaW8tPmRlbnRyeSkKLQkJZGVidWdmc19yZW1vdmUoYXVkaW8tPmRlbnRyeSk7Ci0jZW5kaWYKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBjbV9wb3N0X2V2ZW50KHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCB0eXBlLAotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQpCi17Ci0Jc3RydWN0IGF1ZHBjbV9ldmVudCAqZV9ub2RlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSkgewotCQllX25vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCXN0cnVjdCBhdWRwY21fZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZV9ub2RlLT5saXN0KTsKLQl9IGVsc2UgewotCQllX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkcGNtX2V2ZW50KSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghZV9ub2RlKSB7Ci0JCQlNTV9FUlIoIk5vIG1lbSB0byBwb3N0IGV2ZW50ICVkXG4iLCB0eXBlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWVfbm9kZS0+ZXZlbnRfdHlwZSA9IHR5cGU7Ci0JZV9ub2RlLT5wYXlsb2FkID0gcGF5bG9hZDsKLQotCWxpc3RfYWRkX3RhaWwoJmVfbm9kZS0+bGlzdCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RhdGljIHZvaWQgYXVkcGNtX3N1c3BlbmQoc3RydWN0IGVhcmx5X3N1c3BlbmQgKmgpCi17Ci0Jc3RydWN0IGF1ZHBjbV9zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWRwY21fc3VzcGVuZF9jdGwsIG5vZGUpOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWF1ZHBjbV9wb3N0X2V2ZW50KGN0bC0+YXVkaW8sIEFVRElPX0VWRU5UX1NVU1BFTkQsIHBheWxvYWQpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwY21fcmVzdW1lKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRwY21fc3VzcGVuZF9jdGwgKmN0bCA9Ci0JCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgYXVkcGNtX3N1c3BlbmRfY3RsLCBub2RlKTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlhdWRwY21fcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9SRVNVTUUsIHBheWxvYWQpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBzc2l6ZV90IGF1ZHBjbV9kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZHBjbV9kZWJ1Z19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQljb25zdCBpbnQgZGVidWdfYnVmbWF4ID0gNDA5NjsKLQlzdGF0aWMgY2hhciBidWZmZXJbNDA5Nl07Ci0JaW50IG4gPSAwOwotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JbiA9IHNjbnByaW50ZihidWZmZXIsIGRlYnVnX2J1Zm1heCwgIm9wZW5lZCAlZFxuIiwgYXVkaW8tPm9wZW5lZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAiZW5hYmxlZCAlZFxuIiwgYXVkaW8tPmVuYWJsZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInN0b3BwZWQgJWRcbiIsIGF1ZGlvLT5zdG9wcGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfYnVmX3N6ICVkXG4iLCBhdWRpby0+b3V0WzBdLnNpemUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInZvbHVtZSAleCBcbiIsIGF1ZGlvLT52b2x1bWUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInNhbXBsZSByYXRlICVkIFxuIiwgYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJImNoYW5uZWwgbW9kZSAlZCBcbiIsIGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkvKiBGb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBvbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHdoZW4KLQkgKiB3aGVuIHBsYXliYWNrIGhhbHRzIHVuZXhwZWN0ZWRseS4gVGh1cywgbm8gbXV0dWFsIGV4Y2x1c2lvbgotCSAqIGVuZm9yY2VkCi0JICovCi0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAid2ZsdXNoICVkXG4iLCBhdWRpby0+d2ZsdXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJydW5uaW5nICVkIFxuIiwgYXVkaW8tPnJ1bm5pbmcpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJImRlYyBzdGF0ZSAlZCBcbiIsIGF1ZGlvLT5kZWNfc3RhdGUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dF9uZWVkZWQgJWQgXG4iLCBhdWRpby0+b3V0X25lZWRlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0X2hlYWQgJWQgXG4iLCBhdWRpby0+b3V0X2hlYWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dF90YWlsICVkIFxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRbMF0udXNlZCAlZCBcbiIsIGF1ZGlvLT5vdXRbMF0udXNlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0WzFdLnVzZWQgJWQgXG4iLCBhdWRpby0+b3V0WzFdLnVzZWQpOwotCWJ1ZmZlcltuXSA9IDA7Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGJ1ZmZlciwgbik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZHBjbV9kZWJ1Z19mb3BzID0gewotCS5yZWFkID0gYXVkcGNtX2RlYnVnX3JlYWQsCi0JLm9wZW4gPSBhdWRwY21fZGVidWdfb3BlbiwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBhdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBOVUxMOwotCWludCByYywgaSwgZGVjX2F0dHJiLCBkZWNpZDsKLQlzdHJ1Y3QgYXVkcGNtX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIHBtZW1fc3ogPSBETUFTWl9NQVg7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9wY21fZGVjXyIgKyA1XTsKLSNlbmRpZgotCi0JLyogQWxsb2NhdGUgYXVkaW8gaW5zdGFuY2UsIHNldCB0byB6ZXJvICovCi0JYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWF1ZGlvKSB7Ci0JCU1NX0VSUigibm8gbWVtb3J5IHRvIGFsbG9jYXRlIGF1ZGlvIGluc3RhbmNlIFxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQlNTV9JTkZPKCJhdWRpbyBpbnN0YW5jZSAweCUwOHggY3JlYXRlZFxuIiwgKGludClhdWRpbyk7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgZGVjb2RlciAqLwotCWRlY19hdHRyYiA9IEFVRERFQ19ERUNfUENNOwotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCU1NX0VSUigiTm9uLVR1bm5lbGVkIG1vZGUgbm90IHN1cHBvcnRlZFxuIik7Ci0JCXJjID0gLUVQRVJNOwotCQlrZnJlZShhdWRpbyk7Ci0JCWdvdG8gZG9uZTsKLQl9IGVsc2UKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9UVU5ORUw7Ci0KLQlkZWNpZCA9IGF1ZHBwX2FkZWNfYWxsb2MoZGVjX2F0dHJiLCAmYXVkaW8tPm1vZHVsZV9uYW1lLAotCQkJJmF1ZGlvLT5xdWV1ZV9pZCk7Ci0JaWYgKGRlY2lkIDwgMCkgewotCQlNTV9FUlIoIk5vIGZyZWUgZGVjb2RlciBhdmFpbGFibGUsIGZyZWVpbmcgaW5zdGFuY2UgMHglMDh4XG4iLAotCQkJCShpbnQpYXVkaW8pOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJZ290byBkb25lOwotCX0KLQlhdWRpby0+ZGVjX2lkID0gZGVjaWQgJiBNU01fQVVEX0RFQ09ERVJfTUFTSzsKLQotCS8qIEFJTyBpbnRlcmZhY2UgKi8KLQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJTU1fREJHKCJzZXQgdG8gYWlvIGludGVyZmFjZVxuIik7Ci0JCWF1ZGlvLT5kcnZfc3RhdHVzIHw9IEFEUlZfU1RBVFVTX0FJT19JTlRGOwotCQlhdWRpby0+ZHJ2X29wcy5zZW5kX2RhdGEgPSBhdWRwY21fYXN5bmNfc2VuZF9kYXRhOwotCQlhdWRpby0+ZHJ2X29wcy5vdXRfZmx1c2ggPSBhdWRwY21fYXN5bmNfZmx1c2g7Ci0JCWF1ZGlvLT5kcnZfb3BzLmZzeW5jID0gYXVkcGNtX2FzeW5jX2ZzeW5jOwotCX0gZWxzZSB7Ci0JCU1NX0RCRygic2V0IHRvIHN0ZCBpbyBpbnRlcmZhY2VcbiIpOwotCQl3aGlsZSAocG1lbV9zeiA+PSBETUFTWl9NSU4pIHsKLQkJCU1NX0RCRygicG1lbXN6ID0gJWRcbiIsIHBtZW1fc3opOwotCQkJYXVkaW8tPnBoeXMgPSBhbGxvY2F0ZV9jb250aWd1b3VzX2ViaV9ub21hcChwbWVtX3N6LAotCQkJCQkJCQlTWl80Syk7Ci0JCQlpZiAoYXVkaW8tPnBoeXMpIHsKLQkJCQlhdWRpby0+bWFwX3Zfd3JpdGUgPSBpb3JlbWFwKAotCQkJCQkJCWF1ZGlvLT5waHlzLCBwbWVtX3N6KTsKLQkJCQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl93cml0ZSkpIHsKLQkJCQkJTU1fRVJSKCJjb3VsZCBub3QgbWFwIHdyaXRlIHBoeXNcCi0JCQkJCQlhZGRyZXNzIGZyZWVpbmcgaW5zdGFuY2UgXAotCQkJCQkJMHglMDh4XG4iLCAoaW50KWF1ZGlvKTsKLQkJCQkJcmMgPSAtRU5PTUVNOwotCQkJCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKAotCQkJCQkJCQlhdWRpby0+cGh5cyk7Ci0JCQkJCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLQkJCQkJa2ZyZWUoYXVkaW8pOwotCQkJCQlnb3RvIGRvbmU7Ci0JCQkJfQotCQkJCWF1ZGlvLT5kYXRhID0gYXVkaW8tPm1hcF92X3dyaXRlOwotCQkJCU1NX0RCRygid3JpdGUgYnVmOiBwaHkgYWRkciAweCUwOHggXAotCQkJCQkJa2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQkJCQkJYXVkaW8tPnBoeXMsIChpbnQpYXVkaW8tPmRhdGEpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChwbWVtX3N6ID09IERNQVNaX01JTikgewotCQkJCU1NX0VSUigiY291bGQgbm90IGFsbG9jYXRlIHdyaXRlIGJ1ZmZlcnMgXAotCQkJCQlmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwgKGludClhdWRpbyk7Ci0JCQkJcmMgPSAtRU5PTUVNOwotCQkJCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLQkJCQlrZnJlZShhdWRpbyk7Ci0JCQkJZ290byBkb25lOwotCQkJfSBlbHNlCi0JCQkJcG1lbV9zeiA+Pj0gMTsKLQkJfQotCQlhdWRpby0+b3V0X2RtYV9zeiA9IHBtZW1fc3o7Ci0JCWF1ZGlvLT5kcnZfb3BzLnNlbmRfZGF0YSA9IGF1ZHBsYXlfc2VuZF9kYXRhOwotCQlhdWRpby0+ZHJ2X29wcy5vdXRfZmx1c2ggPSBhdWRpb19mbHVzaDsKLQkJYXVkaW8tPmRydl9vcHMuZnN5bmMgPSBhdWRwY21fc3luY19mc3luYzsKLQkJYXVkaW8tPm91dFswXS5kYXRhID0gYXVkaW8tPmRhdGEgKyAwOwotCQlhdWRpby0+b3V0WzBdLmFkZHIgPSBhdWRpby0+cGh5cyArIDA7Ci0JCWF1ZGlvLT5vdXRbMF0uc2l6ZSA9IChhdWRpby0+b3V0X2RtYV9zeiA+PiAxKTsKLQotCQlhdWRpby0+b3V0WzFdLmRhdGEgPSBhdWRpby0+ZGF0YSArIGF1ZGlvLT5vdXRbMF0uc2l6ZTsKLQkJYXVkaW8tPm91dFsxXS5hZGRyID0gYXVkaW8tPnBoeXMgKyBhdWRpby0+b3V0WzBdLnNpemU7Ci0JCWF1ZGlvLT5vdXRbMV0uc2l6ZSA9IGF1ZGlvLT5vdXRbMF0uc2l6ZTsKLQl9Ci0KLQlyYyA9IG1zbV9hZHNwX2dldChhdWRpby0+bW9kdWxlX25hbWUsICZhdWRpby0+YXVkcGxheSwKLQkJCSZhdWRwY21kZWNfYWRzcF9vcHMsIGF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJmYWlsZWQgdG8gZ2V0ICVzIG1vZHVsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJYXVkaW8tPm1vZHVsZV9uYW1lLCAoaW50KWF1ZGlvKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBhbGwgbG9ja3Mgb2YgYXVkaW8gaW5zdGFuY2UgKi8KLQltdXRleF9pbml0KCZhdWRpby0+bG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPndyaXRlX2xvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT5nZXRfZXZlbnRfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmF1ZGlvLT5kc3BfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+b3V0X3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPnBtZW1fcmVnaW9uX3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+ZXZlbnRfcXVldWUpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+YXZzeW5jX3dhaXQpOwotCi0JYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSA9IDQ0MTAwOwotCWF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID0gQVVEUFBfQ01EX1BDTV9JTlRGX1NURVJFT19WOwotCWF1ZGlvLT5vdXRfYml0cyA9IEFVRFBQX0NNRF9XQVZfUENNX1dJRFRIXzE2OwotCWF1ZGlvLT52b2x1bWUgPSAweDdGRkY7Ci0JYXVkaW8tPmRydl9vcHMub3V0X2ZsdXNoKGF1ZGlvKTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOwotCWF1ZGlvLT5vcGVuZWQgPSAxOwotCi0JYXVkaW8tPmRldmljZV9ldmVudHMgPSBBVURERVZfRVZUX0RFVl9SRFkKLQkJCQl8QVVEREVWX0VWVF9ERVZfUkxTfAotCQkJCUFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEc7Ci0KLQlyYyA9IGF1ZGRldl9yZWdpc3Rlcl9ldnRfbGlzdG5lcihhdWRpby0+ZGV2aWNlX2V2ZW50cywKLQkJCQkJQVVEREVWX0NMTlRfREVDLAotCQkJCQlhdWRpby0+ZGVjX2lkLAotCQkJCQlwY21fbGlzdG5lciwKLQkJCQkJKHZvaWQgKilhdWRpbyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiZmFpbGVkIHRvIHJlZ2lzdGVyIGxpc3RuZXRcbiIpOwotCQlnb3RvIGV2ZW50X2VycjsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlzbnByaW50ZihuYW1lLCBzaXplb2YgbmFtZSwgIm1zbV9wY21fZGVjXyUwNHgiLCBhdWRpby0+ZGVjX2lkKTsKLQlhdWRpby0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJTlVMTCwgKHZvaWQgKikgYXVkaW8sICZhdWRwY21fZGVidWdfZm9wcyk7Ci0KLQlpZiAoSVNfRVJSKGF1ZGlvLT5kZW50cnkpKQotCQlNTV9FUlIoImRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUubGV2ZWwgPSBFQVJMWV9TVVNQRU5EX0xFVkVMX0RJU0FCTEVfRkI7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUucmVzdW1lID0gYXVkcGNtX3Jlc3VtZTsKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5zdXNwZW5kID0gYXVkcGNtX3N1c3BlbmQ7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLmF1ZGlvID0gYXVkaW87Ci0JcmVnaXN0ZXJfZWFybHlfc3VzcGVuZCgmYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUpOwotI2VuZGlmCi0JZm9yIChpID0gMDsgaSA8IEFVRFBDTV9FVkVOVF9OVU07IGkrKykgewotCQllX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkcGNtX2V2ZW50KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChlX25vZGUpCi0JCQlsaXN0X2FkZF90YWlsKCZlX25vZGUtPmxpc3QsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JCWVsc2UgewotCQkJTU1fRVJSKCJldmVudCBwa3QgYWxsb2MgZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotZG9uZToKLQlyZXR1cm4gcmM7Ci1ldmVudF9lcnI6Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRwbGF5KTsKLWVycjoKLQlpZiAoYXVkaW8tPmRhdGEpIHsKLQkJaW91bm1hcChhdWRpby0+bWFwX3Zfd3JpdGUpOwotCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKGF1ZGlvLT5waHlzKTsKLQl9Ci0JYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX3BjbV9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBhdWRpb19vcGVuLAotCS5yZWxlYXNlCT0gYXVkaW9fcmVsZWFzZSwKLQkud3JpdGUJCT0gYXVkaW9fd3JpdGUsCi0JLnVubG9ja2VkX2lvY3RsCT0gYXVkaW9faW9jdGwsCi0JLmZzeW5jID0gYXVkcGNtX2ZzeW5jLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fcGNtX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gIm1zbV9wY21fZGVjIiwKLQkuZm9wcwk9ICZhdWRpb19wY21fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGlvX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fcGNtX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoYXVkaW9faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX3BjbV9pbi5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19wY21faW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzYTY5Ni4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX3BjbV9pbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyNyArMCwwIEBACi0vKgotICogcGNtIGF1ZGlvIGlucHV0IGRldmljZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1vcnlfYWxsb2MuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9tZW10eXBlcy5oPgotCi0jaW5jbHVkZSA8bWFjaC9pb21tdS5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXVfZG9tYWlucy5oPgotCi0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPG1hY2gvc29jaW5mby5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHJlY2NtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRyZWNtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkcHJlcHJvYy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19kZXZfY3RsLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19hY2RiaS5oPgotCi0vKiBGUkFNRV9OVU0gbXVzdCBiZSBhIHBvd2VyIG9mIHR3byAqLwotI2RlZmluZSBGUkFNRV9OVU0JCSg4KQotI2RlZmluZSBGUkFNRV9IRUFERVJfU0laRSAgICAgICAoOCkgLyo0IGhhbGYgd29yZHMqLwotLyogc2l6ZSBvZiBhIG1vbm8gZnJhbWUgd2l0aCAyNTYgc2FtcGxlcyAqLwotI2RlZmluZSBNT05PX0RBVEFfU0laRV8yNTYJKDUxMikgLyogaW4gYnl0ZXMqLwotLypzaXplIG9mIGEgbW9ubyBmcmFtZSB3aXRoIDUxMiBzYW1wbGVzICovCi0jZGVmaW5lIE1PTk9fREFUQV9TSVpFXzUxMgkoMTAyNCkgLyogaW4gYnl0ZXMqLwotLypzaXplIG9mIGEgbW9ubyBmcmFtZSB3aXRoIDEwMjQgc2FtcGxlcyAqLwotI2RlZmluZSBNT05PX0RBVEFfU0laRV8xMDI0CSgyMDQ4KSAvKiBpbiBieXRlcyAqLwotCi0vKnNpemUgb2YgYSBzdGVyZW8gZnJhbWUgd2l0aCAyNTYgc2FtcGxlcyBwZXIgY2hhbm5lbCAqLwotI2RlZmluZSBTVEVSRU9fREFUQV9TSVpFXzI1NgkoMTAyNCkgLyogaW4gYnl0ZXMqLwotLypzaXplIG9mIGEgc3RlcmVvIGZyYW1lIHdpdGggNTEyIHNhbXBsZXMgcGVyIGNoYW5uZWwgKi8KLSNkZWZpbmUgU1RFUkVPX0RBVEFfU0laRV81MTIJKDIwNDgpIC8qIGluIGJ5dGVzKi8KLS8qc2l6ZSBvZiBhIHN0ZXJlbyBmcmFtZSB3aXRoIDEwMjQgc2FtcGxlcyBwZXIgY2hhbm5lbCAqLwotI2RlZmluZSBTVEVSRU9fREFUQV9TSVpFXzEwMjQJKDQwOTYpIC8qIGluIGJ5dGVzICovCi0KLSNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUJCSgoU1RFUkVPX0RBVEFfU0laRV8xMDI0KSArIEZSQU1FX0hFQURFUl9TSVpFKQotI2RlZmluZSBETUFTWgkJCShNQVhfRlJBTUVfU0laRSAqIEZSQU1FX05VTSkKLQotc3RydWN0IGJ1ZmZlciB7Ci0Jdm9pZCAqZGF0YTsKLQl1aW50MzJfdCBzaXplOwotCXVpbnQzMl90IHJlYWQ7Ci0JdWludDMyX3QgYWRkcjsKLX07Ci0KLXN0cnVjdCBhdWRpb19pbiB7Ci0Jc3RydWN0IGJ1ZmZlciBpbltGUkFNRV9OVU1dOwotCi0Jc3BpbmxvY2tfdCBkc3BfbG9jazsKLQotCWF0b21pY190IGluX2J5dGVzOwotCWF0b21pY190IGluX3NhbXBsZXM7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggcmVhZF9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9lbmFibGU7Ci0KLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICphdWRyZWM7Ci0KLQkvKiBjb25maWd1cmF0aW9uIHRvIHVzZSBvbiBuZXh0IGVuYWJsZSAqLwotCXVpbnQzMl90IHNhbXBfcmF0ZTsKLQl1aW50MzJfdCBjaGFubmVsX21vZGU7Ci0JdWludDMyX3QgYnVmZmVyX3NpemU7IC8qIDIwNDggZm9yIG1vbm8sIDQwOTYgZm9yIHN0ZXJlbyAqLwotCXVpbnQzMl90IGVuY190eXBlOwotCi0JdWludDMyX3QgZHNwX2NudDsKLQl1aW50MzJfdCBpbl9oZWFkOyAvKiBuZXh0IGJ1ZmZlciBkc3Agd2lsbCB3cml0ZSAqLwotCXVpbnQzMl90IGluX3RhaWw7IC8qIG5leHQgYnVmZmVyIHJlYWQoKSB3aWxsIHJlYWQgKi8KLQl1aW50MzJfdCBpbl9jb3VudDsgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgYXZhaWxhYmxlIHRvIHJlYWQoKSAqLwotCXVpbnQzMl90IG1vZGU7Ci0KLQljb25zdCBjaGFyICptb2R1bGVfbmFtZTsKLQl1bnNpZ25lZCBxdWV1ZV9pZHM7Ci0JdWludDE2X3QgZW5jX2lkOyAvKiBTZXNzaW9uIElkICovCi0KLQl1aW50MTZfdCBzb3VyY2U7IC8qIEVuY29kaW5nIHNvdXJjZSBiaXQgbWFzayAqLwotCXVpbnQzMl90IGRldmljZV9ldmVudHM7IC8qIGRldmljZSBldmVudHMgaW50ZXJlc3RlZCBpbiAqLwotCXVpbnQzMl90IGluX2NhbGw7Ci0JdWludDMyX3QgZGV2X2NudDsKLQlpbnQgdm9pY2Vfc3RhdGU7Ci0Jc3BpbmxvY2tfdCBkZXZfbG9jazsKLQotCXN0cnVjdCBhdWRyZWNfc2Vzc2lvbl9pbmZvIHNlc3Npb25faW5mbzsgLyphdWRyZWMgc2Vzc2lvbiBpbmZvKi8KLQkvKiBkYXRhIGFsbG9jYXRlZCBmb3IgdmFyaW91cyBidWZmZXJzICovCi0JY2hhciAqZGF0YTsKLQlkbWFfYWRkcl90IHBoeXM7Ci0Jdm9pZCAqbWFwX3ZfcmVhZDsKLQotCWludCBvcGVuZWQ7Ci0JaW50IGVuYWJsZWQ7Ci0JaW50IHJ1bm5pbmc7Ci0JaW50IHN0b3BwZWQ7IC8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQlpbnQgYWJvcnQ7IC8qIHNldCB3aGVuIGVycm9yLCBsaWtlIHNhbXBsZSByYXRlIG1pc21hdGNoICovCi0JaW50IGR1YWxfbWljX2NvbmZpZzsKLQljaGFyICpidWlsZF9pZDsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBpb25faGFuZGxlICpvdXRwdXRfYnVmZl9oYW5kbGU7Ci19OwotCi1zdGF0aWMgc3RydWN0IGF1ZGlvX2luIHRoZV9hdWRpb19pbjsKLQotc3RydWN0IGF1ZGlvX2ZyYW1lIHsKLQl1aW50MTZfdCBmcmFtZV9jb3VudF9sc3c7Ci0JdWludDE2X3QgZnJhbWVfY291bnRfbXN3OwotCXVpbnQxNl90IGZyYW1lX2xlbmd0aDsKLQl1aW50MTZfdCBlcmFzZWRfcGNtOwotCXVuc2lnbmVkIGNoYXIgcmF3X2JpdHN0cmVhbVtdOyAvKiBzYW1wbGVzICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKiBBdWRyZWMgUXVldWUgY29tbWFuZCBzZW50IG1hY3JvJ3MgKi8KLSNkZWZpbmUgYXVkcmVjX3NlbmRfYml0c3RyZWFtcXVldWUoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHJlYywgKChhdWRpby0+cXVldWVfaWRzICYgMHhGRkZGMDAwMCkgPj4gMTYpLFwKLQkJCWNtZCwgbGVuKQotCi0jZGVmaW5lIGF1ZHJlY19zZW5kX2F1ZHJlY3F1ZXVlKGF1ZGlvLCBjbWQsIGxlbikgXAotCW1zbV9hZHNwX3dyaXRlKGF1ZGlvLT5hdWRyZWMsIChhdWRpby0+cXVldWVfaWRzICYgMHgwMDAwRkZGRiksXAotCQkJY21kLCBsZW4pCi0KLS8qIERTUCBjb21tYW5kIHNlbmQgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IGF1ZHBjbV9pbl9lbmNfY29uZmlnKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sIGludCBlbmFibGUpOwotc3RhdGljIGludCBhdWRwY21faW5fcGFyYW1fY29uZmlnKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pOwotc3RhdGljIGludCBhdWRwY21faW5fbWVtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLXN0YXRpYyBpbnQgYXVkcGNtX2luX3JlY29yZF9jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgaW50IGF1ZHBjbV9kc3BfcmVhZF9idWZmZXIoc3RydWN0IGF1ZGlvX2luICphdWRpbywgdWludDMyX3QgcmVhZF9jbnQpOwotCi1zdGF0aWMgdm9pZCBhdWRwY21faW5fZ2V0X2RzcF9mcmFtZXMoc3RydWN0IGF1ZGlvX2luICphdWRpbyk7Ci0KLXN0YXRpYyB2b2lkIGF1ZHBjbV9pbl9mbHVzaChzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLQotc3RhdGljIHZvaWQgcGNtX2luX2xpc3RlbmVyKHUzMiBldnRfaWQsIHVuaW9uIGF1ZGRldl9ldnRfZGF0YSAqZXZ0X3BheWxvYWQsCi0JCQkJdm9pZCAqcHJpdmF0ZV9kYXRhKQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSAoc3RydWN0IGF1ZGlvX2luICopIHByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JTU1fREJHKCJldnRfaWQgPSAweCU4eFxuIiwgZXZ0X2lkKTsKLQlzd2l0Y2ggKGV2dF9pZCkgewotCWNhc2UgQVVEREVWX0VWVF9ERVZfUkRZOiB7Ci0JCU1NX0RCRygiQVVEREVWX0VWVF9ERVZfUkRZXG4iKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+ZGV2X2NudCsrOwotCQlpZiAoIWF1ZGlvLT5pbl9jYWxsKQotCQkJYXVkaW8tPnNvdXJjZSB8PSAoMHgxIDw8IGV2dF9wYXlsb2FkLT5yb3V0aW5nX2lkKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRldl9sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKChhdWRpby0+cnVubmluZyA9PSAxKSAmJiAoYXVkaW8tPmVuYWJsZWQgPT0gMSkpCi0JCQlhdWRwY21faW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMSk7Ci0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEREVWX0VWVF9ERVZfUkxTOiB7Ci0JCU1NX0RCRygiQVVEREVWX0VWVF9ERVZfUkxTXG4iKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCQlhdWRpby0+ZGV2X2NudC0tOwotCQlpZiAoIWF1ZGlvLT5pbl9jYWxsKQotCQkJYXVkaW8tPnNvdXJjZSAmPSB+KDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCi0JCWlmICghYXVkaW8tPnJ1bm5pbmcgfHwgIWF1ZGlvLT5lbmFibGVkKQotCQkJYnJlYWs7Ci0KLQkJLyogVHVybiBvZiBhcyBwZXIgc291cmNlICovCi0JCWlmIChhdWRpby0+c291cmNlKQotCQkJYXVkcGNtX2luX3JlY29yZF9jb25maWcoYXVkaW8sIDEpOwotCQllbHNlCi0JCQkvKiBUdXJuIG9mZiBhbGwgKi8KLQkJCWF1ZHBjbV9pbl9yZWNvcmRfY29uZmlnKGF1ZGlvLCAwKTsKLQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURERVZfRVZUX1ZPSUNFX1NUQVRFX0NIRzogewotCQlNTV9EQkcoIkFVRERFVl9FVlRfVk9JQ0VfU1RBVEVfQ0hHLCBzdGF0ZSA9ICVkXG4iLAotCQkJCWV2dF9wYXlsb2FkLT52b2ljZV9zdGF0ZSk7Ci0JCWF1ZGlvLT52b2ljZV9zdGF0ZSA9IGV2dF9wYXlsb2FkLT52b2ljZV9zdGF0ZTsKLQkJaWYgKGF1ZGlvLT5pbl9jYWxsICYmIGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCQlpZiAoYXVkaW8tPnZvaWNlX3N0YXRlID09IFZPSUNFX1NUQVRFX0lOQ0FMTCkKLQkJCQlhdWRwY21faW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMSk7Ci0JCQllbHNlIGlmIChhdWRpby0+dm9pY2Vfc3RhdGUgPT0gVk9JQ0VfU1RBVEVfT0ZGQ0FMTCkgewotCQkJCWF1ZHBjbV9pbl9yZWNvcmRfY29uZmlnKGF1ZGlvLCAwKTsKLQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEREVWX0VWVF9GUkVRX0NIRzogewotCQlNTV9EQkcoIkVuY29kZXIgRHJpdmVyIGdvdCBzYW1wbGUgcmF0ZSBjaGFuZ2UgZXZlbnRcbiIpOwotCQlNTV9EQkcoInNhbXBsZSByYXRlICVkXG4iLCBldnRfcGF5bG9hZC0+ZnJlcV9pbmZvLnNhbXBsZV9yYXRlKTsKLQkJTU1fREJHKCJkZXZfdHlwZSAlZFxuIiwgZXZ0X3BheWxvYWQtPmZyZXFfaW5mby5kZXZfdHlwZSk7Ci0JCU1NX0RCRygiYWNkYl9kZXZfaWQgJWRcbiIsIGV2dF9wYXlsb2FkLT5mcmVxX2luZm8uYWNkYl9kZXZfaWQpOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcgPT0gMSkgewotCQkJLyogU3RvcCBSZWNvcmRpbmcgc2FtcGxlIHJhdGUgZG9lcyBub3QgbWF0Y2gKLQkJCSAgIHdpdGggZGV2aWNlIHNhbXBsZSByYXRlICovCi0JCQlpZiAoZXZ0X3BheWxvYWQtPmZyZXFfaW5mby5zYW1wbGVfcmF0ZSAhPQotCQkJCWF1ZGlvLT5zYW1wX3JhdGUpIHsKLQkJCQlhdWRwY21faW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMCk7Ci0JCQkJYXVkaW8tPmFib3J0ID0gMTsKLQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigid3JvbmcgZXZlbnQgJWRcbiIsIGV2dF9pZCk7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkc3AgcHJlcHJvYyBldmVudCBoYW5kbGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgdm9pZCBhdWRwcmVwcm9jX2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgIHZvaWQgKm1zZykKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gZGF0YTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBSRVBST0NfRVJST1JfTVNHOiB7Ci0JCXN0cnVjdCBhdWRwcmVwcm9jX2Vycl9tc2cgKmVycl9tc2cgPSBtc2c7Ci0KLQkJTU1fRVJSKCJFUlJPUl9NU0c6IHN0cmVhbSBpZCAlZCBlcnIgaWR4ICVkXG4iLAotCQllcnJfbXNnLT5zdHJlYW1faWQsIGVycl9tc2ctPmF1ZF9wcmVwcm9jX2Vycl9pZHgpOwotCQkvKiBFcnJvciBjYXNlICovCi0JCXdha2VfdXAoJmF1ZGlvLT53YWl0X2VuYWJsZSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFBSRVBST0NfQ01EX0NGR19ET05FX01TRzogewotCQlNTV9EQkcoIkNNRF9DRkdfRE9ORV9NU0cgXG4iKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFJFUFJPQ19DTURfRU5DX0NGR19ET05FX01TRzogewotCQlzdHJ1Y3QgYXVkcHJlcHJvY19jbWRfZW5jX2NmZ19kb25lX21zZyAqZW5jX2NmZ19tc2cgPSBtc2c7Ci0KLQkJTU1fREJHKCJDTURfRU5DX0NGR19ET05FX01TRzogc3RyZWFtIGlkICVkIGVuYyB0eXBlIFwKLQkJCTB4JTh4XG4iLCBlbmNfY2ZnX21zZy0+c3RyZWFtX2lkLAotCQkJZW5jX2NmZ19tc2ctPnJlY19lbmNfdHlwZSk7Ci0JCS8qIEVuY29kZXIgZW5hYmxlIHN1Y2Nlc3MgKi8KLQkJaWYgKGVuY19jZmdfbXNnLT5yZWNfZW5jX3R5cGUgJiBFTkNPREVfRU5BQkxFKQotCQkJYXVkcGNtX2luX3BhcmFtX2NvbmZpZyhhdWRpbyk7Ci0JCWVsc2UgeyAvKiBFbmNvZGVyIGRpc2FibGUgc3VjY2VzcyAqLwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAwOwotCQkJYXVkcGNtX2luX3JlY29yZF9jb25maWcoYXVkaW8sIDApOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFBSRVBST0NfQ01EX0VOQ19QQVJBTV9DRkdfRE9ORV9NU0c6IHsKLQkJTU1fREJHKCJDTURfRU5DX1BBUkFNX0NGR19ET05FX01TRyBcbiIpOwotCQlhdWRwY21faW5fbWVtX2NvbmZpZyhhdWRpbyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFBSRVBST0NfQUZFX0NNRF9BVURJT19SRUNPUkRfQ0ZHX0RPTkVfTVNHOiB7Ci0JCU1NX0RCRygiQUZFX0NNRF9BVURJT19SRUNPUkRfQ0ZHX0RPTkVfTVNHIFxuIik7Ci0JCXdha2VfdXAoJmF1ZGlvLT53YWl0X2VuYWJsZSk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlNTV9FUlIoIlVua25vd24gRXZlbnQgaWQgJWRcbiIsIGlkKTsKLQl9Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZHNwIGF1ZHJlYyBldmVudCBoYW5kbGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgdm9pZCBhdWRyZWNfZHNwX2V2ZW50KHZvaWQgKmRhdGEsIHVuc2lnbmVkIGlkLCBzaXplX3QgbGVuLAotCQkJICAgIHZvaWQgKCpnZXRldmVudCkodm9pZCAqcHRyLCBzaXplX3QgbGVuKSkKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gZGF0YTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFJFQ19DTURfTUVNX0NGR19ET05FX01TRzogewotCQlNTV9EQkcoIkNNRF9NRU1fQ0ZHX0RPTkUgTVNHIERPTkVcbiIpOwotCQlhdWRpby0+cnVubmluZyA9IDE7Ci0JCWlmICgoIWF1ZGlvLT5pbl9jYWxsICYmIChhdWRpby0+ZGV2X2NudCA+IDApKSB8fAotCQkJKGF1ZGlvLT5pbl9jYWxsICYmCi0JCQkJKGF1ZGlvLT52b2ljZV9zdGF0ZSA9PSBWT0lDRV9TVEFURV9JTkNBTEwpKSkKLQkJCWF1ZHBjbV9pbl9yZWNvcmRfY29uZmlnKGF1ZGlvLCAxKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX0ZBVEFMX0VSUl9NU0c6IHsKLQkJc3RydWN0IGF1ZHJlY19mYXRhbF9lcnJfbXNnIGZhdGFsX2Vycl9tc2c7Ci0KLQkJZ2V0ZXZlbnQoJmZhdGFsX2Vycl9tc2csIEFVRFJFQ19GQVRBTF9FUlJfTVNHX0xFTik7Ci0JCU1NX0VSUigiRkFUQUxfRVJSX01TRzogZXJyIGlkICVkXG4iLAotCQkJCWZhdGFsX2Vycl9tc2cuYXVkcmVjX2Vycl9pZCk7Ci0JCS8qIEVycm9yIHN0b3AgdGhlIGVuY29kZXIgKi8KLQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19VUF9QQUNLRVRfUkVBRFlfTVNHOiB7Ci0JCXN0cnVjdCBhdWRyZWNfdXBfcGt0X3JlYWR5X21zZyBwa3RfcmVhZHlfbXNnOwotCi0JCWdldGV2ZW50KCZwa3RfcmVhZHlfbXNnLCBBVURSRUNfVVBfUEFDS0VUX1JFQURZX01TR19MRU4pOwotCQlNTV9EQkcoIlVQX1BBQ0tFVF9SRUFEWV9NU0c6IHdyaXRlIGNudCBsc3cgICVkIFwKLQkJd3JpdGUgY250IG1zdyAlZCByZWFkIGNudCBsc3cgJWQgIHJlYWQgY250IG1zdyAlZCBcbiIsXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY19wYWNrZXRfd3JpdGVfY250X2xzdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY19wYWNrZXRfd3JpdGVfY250X21zdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY191cF9wcmV2X3JlYWRfY250X2xzdywgXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY191cF9wcmV2X3JlYWRfY250X21zdyk7Ci0KLQkJYXVkcGNtX2luX2dldF9kc3BfZnJhbWVzKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQURTUF9NRVNTQUdFX0lEOiB7Ci0JCU1NX0RCRygiUmVjZWl2ZWQgQURTUCBldmVudCA6bW9kdWxlIGF1ZHJlY3Rhc2tcbiIpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJVbmtub3duIEV2ZW50IGlkICVkXG4iLCBpZCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhdWRwY21faW5fZ2V0X2RzcF9mcmFtZXMoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkaW9fZnJhbWUgKmZyYW1lOwotCXVpbnQzMl90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpbmRleCA9IGF1ZGlvLT5pbl9oZWFkOwotCi0JZnJhbWUgPSAodm9pZCAqKSAoKChjaGFyICopYXVkaW8tPmluW2luZGV4XS5kYXRhKSAtIFwKLQkJCSBzaXplb2YoKmZyYW1lKSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JYXVkaW8tPmluW2luZGV4XS5zaXplID0gZnJhbWUtPmZyYW1lX2xlbmd0aDsKLQotCS8qIHN0YXRpc3RpY3Mgb2YgcmVhZCAqLwotCWF0b21pY19hZGQoYXVkaW8tPmluW2luZGV4XS5zaXplLCAmYXVkaW8tPmluX2J5dGVzKTsKLQlhdG9taWNfYWRkKDEsICZhdWRpby0+aW5fc2FtcGxlcyk7Ci0KLQlhdWRpby0+aW5faGVhZCA9IChhdWRpby0+aW5faGVhZCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCi0JLyogSWYgb3ZlcmZsb3csIG1vdmUgdGhlIHRhaWwgaW5kZXggZm93YXJkLiAqLwotCWlmIChhdWRpby0+aW5faGVhZCA9PSBhdWRpby0+aW5fdGFpbCkKLQkJYXVkaW8tPmluX3RhaWwgPSAoYXVkaW8tPmluX3RhaWwgKyAxKSAmIChGUkFNRV9OVU0gLSAxKTsKLQllbHNlCi0JCWF1ZGlvLT5pbl9jb3VudCsrOwotCi0JYXVkcGNtX2RzcF9yZWFkX2J1ZmZlcihhdWRpbywgYXVkaW8tPmRzcF9jbnQrKyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0KLQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci19Ci0KLXN0cnVjdCBtc21fYWRzcF9vcHMgYXVkcmVjX2Fkc3Bfb3BzID0gewotCS5ldmVudCA9IGF1ZHJlY19kc3BfZXZlbnQsCi19OwotCi1zdGF0aWMgaW50IGF1ZHBjbV9pbl9lbmNfY29uZmlnKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0Jc3RydWN0IGF1ZHByZXByb2NfYXVkcmVjX2NtZF9lbmNfY2ZnIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JaWYgKGF1ZGlvLT5idWlsZF9pZFsxN10gPT0gJzEnKSB7Ci0JCWNtZC5jbWRfaWQgPSBBVURQUkVQUk9DX0FVRFJFQ19DTURfRU5DX0NGR18yOwotCQlNTV9FUlIoInNlbmRpbmcgQVVEUFJFUFJPQ19BVURSRUNfQ01EX0VOQ19DRkdfMiBjb21tYW5kIik7Ci0JfSBlbHNlIHsKLQkJY21kLmNtZF9pZCA9IEFVRFBSRVBST0NfQVVEUkVDX0NNRF9FTkNfQ0ZHOwotCQlNTV9FUlIoInNlbmRpbmcgQVVEUFJFUFJPQ19BVURSRUNfQ01EX0VOQ19DRkcgY29tbWFuZCIpOwotCX0KLQljbWQuc3RyZWFtX2lkID0gYXVkaW8tPmVuY19pZDsKLQotCWlmIChlbmFibGUpCi0JCWNtZC5hdWRyZWNfZW5jX3R5cGUgPSBhdWRpby0+ZW5jX3R5cGUgfCBFTkNPREVfRU5BQkxFOwotCWVsc2UKLQkJY21kLmF1ZHJlY19lbmNfdHlwZSAmPSB+KEVOQ09ERV9FTkFCTEUpOwotCi0JcmV0dXJuIGF1ZHByZXByb2Nfc2VuZF9hdWRyZWNjbWRxdWV1ZSgmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcGNtX2luX3BhcmFtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwcmVwcm9jX2F1ZHJlY19jbWRfcGFybV9jZmdfd2F2IGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNvbW1vbi5jbWRfaWQgPSBBVURQUkVQUk9DX0FVRFJFQ19DTURfUEFSQU1fQ0ZHOwotCWNtZC5jb21tb24uc3RyZWFtX2lkID0gYXVkaW8tPmVuY19pZDsKLQotCWNtZC5hdWRfcmVjX3NhbXBsZXJhdGVfaWR4ID0gYXVkaW8tPnNhbXBfcmF0ZTsKLQlpZiAoYXVkaW8tPmR1YWxfbWljX2NvbmZpZykKLQkJY21kLmF1ZF9yZWNfc3RlcmVvX21vZGUgPSBEVUFMX01JQ19TVEVSRU9fUkVDT1JESU5HOwotCWVsc2UKLQkJY21kLmF1ZF9yZWNfc3RlcmVvX21vZGUgPSBhdWRpby0+Y2hhbm5lbF9tb2RlOwotCi0JaWYgKGF1ZGlvLT5jaGFubmVsX21vZGUgPT0gQVVEUkVDX0NNRF9NT0RFX01PTk8pCi0JCWNtZC5hdWRfcmVjX2ZyYW1lX3NpemUgPSBhdWRpby0+YnVmZmVyX3NpemUvMjsKLQllbHNlCi0JCWNtZC5hdWRfcmVjX2ZyYW1lX3NpemUgPSBhdWRpby0+YnVmZmVyX3NpemUvNDsKLQlyZXR1cm4gYXVkcHJlcHJvY19zZW5kX2F1ZHJlY2NtZHF1ZXVlKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotLyogVG8gRG86IG1zbV9zbmRkZXZfcm91dGVfZW5jKGF1ZGlvLT5lbmNfaWQpOyAqLwotc3RhdGljIGludCBhdWRwY21faW5fcmVjb3JkX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCXN0cnVjdCBhdWRwcmVwcm9jX2FmZV9jbWRfYXVkaW9fcmVjb3JkX2NmZyBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURQUkVQUk9DX0FGRV9DTURfQVVESU9fUkVDT1JEX0NGRzsKLQljbWQuc3RyZWFtX2lkID0gYXVkaW8tPmVuY19pZDsKLQlpZiAoZW5hYmxlKQotCQljbWQuZGVzdGluYXRpb25fYWN0aXZpdHkgPSBBVURJT19SRUNPUkRJTkdfVFVSTl9PTjsKLQllbHNlCi0JCWNtZC5kZXN0aW5hdGlvbl9hY3Rpdml0eSA9IEFVRElPX1JFQ09SRElOR19UVVJOX09GRjsKLQotCWNtZC5zb3VyY2VfbWl4X21hc2sgPSBhdWRpby0+c291cmNlOwotCWlmIChhdWRpby0+ZW5jX2lkID09IDIpIHsKLQkJaWYgKChjbWQuc291cmNlX21peF9tYXNrICYKLQkJCQlJTlRFUk5BTF9DT0RFQ19UWF9TT1VSQ0VfTUlYX01BU0spIHx8Ci0JCQkoY21kLnNvdXJjZV9taXhfbWFzayAmIEFVWF9DT0RFQ19UWF9TT1VSQ0VfTUlYX01BU0spIHx8Ci0JCQkoY21kLnNvdXJjZV9taXhfbWFzayAmIFZPSUNFX1VMX1NPVVJDRV9NSVhfTUFTSykgfHwKLQkJCShjbWQuc291cmNlX21peF9tYXNrICYgVk9JQ0VfRExfU09VUkNFX01JWF9NQVNLKSkgewotCQkJY21kLnBpcGVfaWQgPSBTT1VSQ0VfUElQRV8xOwotCQl9Ci0JCWlmIChjbWQuc291cmNlX21peF9tYXNrICYKLQkJCQlBVURQUF9BMkRQX1BJUEVfU09VUkNFX01JWF9NQVNLKQotCQkJY21kLnBpcGVfaWQgfD0gU09VUkNFX1BJUEVfMDsKLQl9Ci0KLQlyZXR1cm4gYXVkcHJlcHJvY19zZW5kX2F1ZHJlY2NtZHF1ZXVlKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRwY21faW5fbWVtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRyZWNfY21kX2FyZWNtZW1fY2ZnIGNtZDsKLQl1aW50MTZfdCAqZGF0YSA9ICh2b2lkICopIGF1ZGlvLT5kYXRhOwotCWludCBuOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUkVDX0NNRF9NRU1fQ0ZHX0NNRDsKLQljbWQuYXVkcmVjX3VwX3BrdF9pbnRtX2NvdW50ID0gMTsKLQljbWQuYXVkcmVjX2V4dF9wa3Rfc3RhcnRfYWRkcl9tc3cgPSBhdWRpby0+cGh5cyA+PiAxNjsKLQljbWQuYXVkcmVjX2V4dF9wa3Rfc3RhcnRfYWRkcl9sc3cgPSBhdWRpby0+cGh5czsKLQljbWQuYXVkcmVjX2V4dF9wa3RfYnVmX251bWJlciA9IEZSQU1FX05VTTsKLQotCS8qIHByZXBhcmUgYnVmZmVyIHBvaW50ZXJzOgotCSAqIE1vbm86IDEwMjQgc2FtcGxlcyArIDQgaGFsZndvcmQgaGVhZGVyCi0JICogU3RlcmVvOiAyMDQ4IHNhbXBsZXMgKyA0IGhhbGZ3b3JkIGhlYWRlcgotCSAqLwotCWZvciAobiA9IDA7IG4gPCBGUkFNRV9OVU07IG4rKykgewotCQkvKiB3b3JkIGluY3JlbWVudCovCi0JCWF1ZGlvLT5pbltuXS5kYXRhID0gZGF0YSArIChGUkFNRV9IRUFERVJfU0laRS8yKTsKLQkJZGF0YSArPSAoKEZSQU1FX0hFQURFUl9TSVpFLzIpICsgKGF1ZGlvLT5idWZmZXJfc2l6ZS8yKSk7Ci0JCU1NX0RCRygiMHglOHhcbiIsIChpbnQpKGF1ZGlvLT5pbltuXS5kYXRhIC0gRlJBTUVfSEVBREVSX1NJWkUpKTsKLQl9Ci0KLQlyZXR1cm4gYXVkcmVjX3NlbmRfYXVkcmVjcXVldWUoYXVkaW8sICZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRwY21fZHNwX3JlYWRfYnVmZmVyKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sIHVpbnQzMl90IHJlYWRfY250KQotewotCXN0cnVjdCB1cF9hdWRyZWNfcGFja2V0X2V4dF9wdHIgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gVVBfQVVEUkVDX1BBQ0tFVF9FWFRfUFRSOwotCWNtZC5hdWRyZWNfdXBfY3Vycl9yZWFkX2NvdW50X21zdyA9IHJlYWRfY250ID4+IDE2OwotCWNtZC5hdWRyZWNfdXBfY3Vycl9yZWFkX2NvdW50X2xzdyA9IHJlYWRfY250OwotCi0JcmV0dXJuIGF1ZHJlY19zZW5kX2JpdHN0cmVhbXF1ZXVlKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRwY21faW5fZW5hYmxlKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pCi17Ci0JaWYgKGF1ZGlvLT5lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWlmIChhdWRwcmVwcm9jX2VuYWJsZShhdWRpby0+ZW5jX2lkLCAmYXVkcHJlcHJvY19kc3BfZXZlbnQsIGF1ZGlvKSkgewotCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRwcmVwcm9jKSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAobXNtX2Fkc3BfZW5hYmxlKGF1ZGlvLT5hdWRyZWMpKSB7Ci0JCU1NX0VSUigibXNtX2Fkc3BfZW5hYmxlKGF1ZHJlYykgZmFpbGVkXG4iKTsKLQkJYXVkcHJlcHJvY19kaXNhYmxlKGF1ZGlvLT5lbmNfaWQsIGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWF1ZGlvLT5lbmFibGVkID0gMTsKLQlhdWRwY21faW5fZW5jX2NvbmZpZyhhdWRpbywgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZHBjbV9pbl9kaXNhYmxlKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pCi17Ci0JaWYgKGF1ZGlvLT5lbmFibGVkKSB7Ci0JCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJYXVkcGNtX2luX2VuY19jb25maWcoYXVkaW8sIDApOwotCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0X2VuYWJsZSwKLQkJCQlhdWRpby0+cnVubmluZyA9PSAwLCAxKkhaKTsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRpby0+YXVkcmVjKTsKLQkJYXVkcHJlcHJvY19kaXNhYmxlKGF1ZGlvLT5lbmNfaWQsIGF1ZGlvKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBjbV9pbl9mbHVzaChzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCWludCBpOwotCi0JYXVkaW8tPmRzcF9jbnQgPSAwOwotCWF1ZGlvLT5pbl9oZWFkID0gMDsKLQlhdWRpby0+aW5fdGFpbCA9IDA7Ci0JYXVkaW8tPmluX2NvdW50ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfTlVNOyBpKyspIHsKLQkJYXVkaW8tPmluW2ldLnNpemUgPSAwOwotCQlhdWRpby0+aW5baV0ucmVhZCA9IDA7Ci0JfQotCU1NX0RCRygiaW5fYnl0ZXMgJWRcbiIsIGF0b21pY19yZWFkKCZhdWRpby0+aW5fYnl0ZXMpKTsKLQlNTV9EQkcoImluX3NhbXBsZXMgJWRcbiIsIGF0b21pY19yZWFkKCZhdWRpby0+aW5fc2FtcGxlcykpOwotCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9ieXRlcywgMCk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPmluX3NhbXBsZXMsIDApOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBsb25nIGF1ZHBjbV9pbl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCQlzdGF0cy5ieXRlX2NvdW50ID0gYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9ieXRlcyk7Ci0JCXN0YXRzLnNhbXBsZV9jb3VudCA9IGF0b21pY19yZWFkKCZhdWRpby0+aW5fc2FtcGxlcyk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCXVpbnQzMl90IGZyZXE7Ci0JCS8qIFBvbGwgYXQgNDhLSHogYWx3YXlzICovCi0JCWZyZXEgPSA0ODAwMDsKLQkJTU1fREJHKCJBVURJT19TVEFSVFxuIik7Ci0JCWlmIChhdWRpby0+aW5fY2FsbCAmJiAoYXVkaW8tPnZvaWNlX3N0YXRlICE9Ci0JCQkJVk9JQ0VfU1RBVEVfSU5DQUxMKSkgewotCQkJcmMgPSAtRVBFUk07Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IG1zbV9zbmRkZXZfcmVxdWVzdF9mcmVxKCZmcmVxLCBhdWRpby0+ZW5jX2lkLAotCQkJCQlTTkRERVZfQ0FQX1RYLCBBVURERVZfQ0xOVF9FTkMpOwotCQlNTV9EQkcoInNhbXBsZSByYXRlIGNvbmZpZ3VyZWQgJWQgc2FtcGxlIHJhdGUgcmVxdWVzdGVkICVkXG4iLAotCQkJCWZyZXEsIGF1ZGlvLT5zYW1wX3JhdGUpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlNTV9EQkcoInNhbXBsZSByYXRlIGNhbiBub3QgYmUgc2V0LCByZXR1cm4gY29kZSAlZFxuIixcCi0JCQkJCQkJcmMpOwotCQkJbXNtX3NuZGRldl93aXRoZHJhd19mcmVxKGF1ZGlvLT5lbmNfaWQsCi0JCQkJCQlTTkRERVZfQ0FQX1RYLCBBVURERVZfQ0xOVF9FTkMpOwotCQkJTU1fREJHKCJtc21fc25kZGV2X3dpdGhkcmF3X2ZyZXFcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPmR1YWxfbWljX2NvbmZpZyA9IG1zbV9nZXRfZHVhbF9taWNfY29uZmlnKGF1ZGlvLT5lbmNfaWQpOwotCQkvKkRTUCBzdXBwb3J0cyBmbHVlbmNlIGJsb2NrIGFuZCBieSBkZWZhdWx0IEFDREIgbGF5ZXIgd2lsbAotCQlhcHBsaWVzIHRoZSBmbHVlbmNlIHByZS1wcm9jZXNzaW5nIGZlYXR1cmUsIGlmIGR1YWwgTUlDIGNvbmZpZwotCQlpcyBlbmFibGVkIGltcGxpZXMgY2xpZW50IHdhbnQgdG8gcmVjb3JkIHB1cmUgZHVhbCBNSUMgc2FtcGxlCi0JCWZvciB0aGlzIHdlIG5lZWQgdG8gb3ZlciByaWRlIHRoZSBmbHVlbmNlIHByZSBwcm9jZXNzaW5nCi0JCWZlYXR1cmUgYXQgQUNEQiBsYXllciB0byBub3QgdG8gYXBwbHkgaWYgZmx1ZW5jZSBwcmVwcm9jZXNzaW5nCi0JCWZlYXR1cmUgc3VwcG9ydGVkKi8KLQkJaWYgKGF1ZGlvLT5kdWFsX21pY19jb25maWcpIHsKLQkJCU1NX0lORk8oImR1YWwgTUlDIGNvbmZpZyA9ICVkLCBvdmVyIHJpZGUgdGhlIGZsdWVuY2UgIgotCQkJImZlYXR1cmVcbiIsIGF1ZGlvLT5kdWFsX21pY19jb25maWcpOwotCQkJZmx1ZW5jZV9mZWF0dXJlX3VwZGF0ZShhdWRpby0+ZHVhbF9taWNfY29uZmlnLAotCQkJCQkJCWF1ZGlvLT5lbmNfaWQpOwotCQl9Ci0JCS8qdXBkYXRlIGF1cmVjIHNlc3Npb24gaW5mbyBpbiBhdWRwcmVwcm9jIGxheWVyKi8KLQkJYXVkaW8tPnNlc3Npb25faW5mby5zZXNzaW9uX2lkID0gYXVkaW8tPmVuY19pZDsKLQkJYXVkaW8tPnNlc3Npb25faW5mby5zYW1wbGluZ19mcmVxID0gYXVkaW8tPnNhbXBfcmF0ZTsKLQkJYXVkcHJlcHJvY191cGRhdGVfYXVkcmVjX2luZm8oJmF1ZGlvLT5zZXNzaW9uX2luZm8pOwotCQlyYyA9IGF1ZHBjbV9pbl9lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9Ci0JCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdF9lbmFibGUsCi0JCQkJYXVkaW8tPnJ1bm5pbmcgIT0gMCwgMSpIWik7Ci0JCQlNTV9EQkcoInN0YXRlICVkIHJjID0gJWRcbiIsIGF1ZGlvLT5ydW5uaW5nLCByYyk7Ci0KLQkJCWlmIChhdWRpby0+cnVubmluZyA9PSAwKQotCQkJCXJjID0gLUVOT0RFVjsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCX0KLQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TVE9QOiB7Ci0JCS8qcmVzZXQgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSBpbmZvcm1hdGlvbiBhdCBhdWRwcmVwcm9jIGxheWVyKi8KLQkJYXVkaW8tPnNlc3Npb25faW5mby5zYW1wbGluZ19mcmVxID0gMDsKLQkJYXVkcHJlcHJvY191cGRhdGVfYXVkcmVjX2luZm8oJmF1ZGlvLT5zZXNzaW9uX2luZm8pOwotCQlyYyA9IGF1ZHBjbV9pbl9kaXNhYmxlKGF1ZGlvKTsKLQkJcmMgPSBtc21fc25kZGV2X3dpdGhkcmF3X2ZyZXEoYXVkaW8tPmVuY19pZCwKLQkJCQkJU05EREVWX0NBUF9UWCwgQVVEREVWX0NMTlRfRU5DKTsKLQkJTU1fREJHKCJtc21fc25kZGV2X3dpdGhkcmF3X2ZyZXFcbiIpOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCWF1ZGlvLT5hYm9ydCA9IDA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0ZMVVNIOiB7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCkgewotCQkJLyogTWFrZSBzdXJlIHdlJ3JlIHN0b3BwZWQgYW5kIHdlIHdha2UgYW55IHRocmVhZHMKLQkJCSAqIHRoYXQgbWlnaHQgYmUgYmxvY2tlZCBob2xkaW5nIHRoZSByZWFkX2xvY2suCi0JCQkgKiBXaGlsZSBhdWRpby0+c3RvcHBlZCByZWFkIHRocmVhZHMgd2lsbCBhbHdheXMKLQkJCSAqIGV4aXQgaW1tZWRpYXRlbHkuCi0JCQkgKi8KLQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCQkJYXVkcGNtX2luX2ZsdXNoKGF1ZGlvKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjZmc7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKSBhcmcsIHNpemVvZihjZmcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGF1ZGlvLT5idWlsZF9pZFsxN10gPT0gJzEnKSB7Ci0JCQlhdWRpby0+ZW5jX3R5cGUgPSBFTkNfVFlQRV9FWFRfV0FWIHwgYXVkaW8tPm1vZGU7Ci0JCQlpZiAoY2ZnLmNoYW5uZWxfY291bnQgPT0gMSkgewotCQkJCWNmZy5jaGFubmVsX2NvdW50ID0gQVVEUkVDX0NNRF9NT0RFX01PTk87Ci0JCQkJaWYgKChjZmcuYnVmZmVyX3NpemUgPT0gTU9OT19EQVRBX1NJWkVfMjU2KSB8fAotCQkJCQkoY2ZnLmJ1ZmZlcl9zaXplID09Ci0JCQkJCQlNT05PX0RBVEFfU0laRV81MTIpIHx8Ci0JCQkJCShjZmcuYnVmZmVyX3NpemUgPT0KLQkJCQkJCU1PTk9fREFUQV9TSVpFXzEwMjQpKSB7Ci0JCQkJCWF1ZGlvLT5idWZmZXJfc2l6ZSA9IGNmZy5idWZmZXJfc2l6ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY2ZnLmNoYW5uZWxfY291bnQgPT0gMikgewotCQkJCWNmZy5jaGFubmVsX2NvdW50ID0gQVVEUkVDX0NNRF9NT0RFX1NURVJFTzsKLQkJCQlpZiAoKGNmZy5idWZmZXJfc2l6ZSA9PQotCQkJCQkJU1RFUkVPX0RBVEFfU0laRV8yNTYpIHx8Ci0JCQkJCShjZmcuYnVmZmVyX3NpemUgPT0KLQkJCQkJCVNURVJFT19EQVRBX1NJWkVfNTEyKSB8fAotCQkJCQkoY2ZnLmJ1ZmZlcl9zaXplID09Ci0JCQkJCQlTVEVSRU9fREFUQV9TSVpFXzEwMjQpKSB7Ci0JCQkJCWF1ZGlvLT5idWZmZXJfc2l6ZSA9IGNmZy5idWZmZXJfc2l6ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgaWYgKGF1ZGlvLT5idWlsZF9pZFsxN10gPT0gJzAnKSB7Ci0JCQlhdWRpby0+ZW5jX3R5cGUgPSBFTkNfVFlQRV9XQVYgfCBhdWRpby0+bW9kZTsKLQkJCWlmIChjZmcuY2hhbm5lbF9jb3VudCA9PSAxKSB7Ci0JCQkJY2ZnLmNoYW5uZWxfY291bnQgPSBBVURSRUNfQ01EX01PREVfTU9OTzsKLQkJCQlhdWRpby0+YnVmZmVyX3NpemUgPSBNT05PX0RBVEFfU0laRV8xMDI0OwotCQkJfSBlbHNlIGlmIChjZmcuY2hhbm5lbF9jb3VudCA9PSAyKSB7Ci0JCQkJY2ZnLmNoYW5uZWxfY291bnQgPSBBVURSRUNfQ01EX01PREVfU1RFUkVPOwotCQkJCWF1ZGlvLT5idWZmZXJfc2l6ZSA9IFNURVJFT19EQVRBX1NJWkVfMTAyNDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigid3JvbmcgYnVpbGRfaWQgPSAlc1xuIiwgYXVkaW8tPmJ1aWxkX2lkKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JCWF1ZGlvLT5zYW1wX3JhdGUgPSBjZmcuc2FtcGxlX3JhdGU7Ci0JCWF1ZGlvLT5jaGFubmVsX21vZGUgPSBjZmcuY2hhbm5lbF9jb3VudDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjZmc7Ci0JCW1lbXNldCgmY2ZnLCAwLCBzaXplb2YoY2ZnKSk7Ci0JCWNmZy5idWZmZXJfc2l6ZSA9IGF1ZGlvLT5idWZmZXJfc2l6ZTsKLQkJY2ZnLmJ1ZmZlcl9jb3VudCA9IEZSQU1FX05VTTsKLQkJY2ZnLnNhbXBsZV9yYXRlID0gYXVkaW8tPnNhbXBfcmF0ZTsKLQkJaWYgKGF1ZGlvLT5jaGFubmVsX21vZGUgPT0gQVVEUkVDX0NNRF9NT0RFX01PTk8pCi0JCQljZmcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JCWVsc2UKLQkJCWNmZy5jaGFubmVsX2NvdW50ID0gMjsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZjZmcsIHNpemVvZihjZmcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0lOQ0FMTDogewotCQlzdHJ1Y3QgbXNtX3ZvaWNlcmVjX21vZGUgY2ZnOwotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgKHZvaWQgKikgYXJnLCBzaXplb2YoY2ZnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjZmcucmVjX21vZGUgIT0gVk9DX1JFQ19CT1RIICYmCi0JCQljZmcucmVjX21vZGUgIT0gVk9DX1JFQ19VUExJTksgJiYKLQkJCWNmZy5yZWNfbW9kZSAhPSBWT0NfUkVDX0RPV05MSU5LKSB7Ci0JCQlNTV9FUlIoImludmFsaWQgcmVjX21vZGVcbiIpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRldl9sb2NrLCBmbGFncyk7Ci0JCQlpZiAoY2ZnLnJlY19tb2RlID09IFZPQ19SRUNfVVBMSU5LKQotCQkJCWF1ZGlvLT5zb3VyY2UgPSBWT0lDRV9VTF9TT1VSQ0VfTUlYX01BU0s7Ci0JCQllbHNlIGlmIChjZmcucmVjX21vZGUgPT0gVk9DX1JFQ19ET1dOTElOSykKLQkJCQlhdWRpby0+c291cmNlID0gVk9JQ0VfRExfU09VUkNFX01JWF9NQVNLOwotCQkJZWxzZQotCQkJCWF1ZGlvLT5zb3VyY2UgPSBWT0lDRV9ETF9TT1VSQ0VfTUlYX01BU0sgfAotCQkJCQkJVk9JQ0VfVUxfU09VUkNFX01JWF9NQVNLIDsKLQkJCWF1ZGlvLT5pbl9jYWxsID0gMTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9TRVNTSU9OX0lEOiB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmYXVkaW8tPmVuY19pZCwKLQkJCXNpemVvZih1bnNpZ25lZCBzaG9ydCkpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRwY21faW5fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQljaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQl2b2lkICpkYXRhOwotCXVpbnQzMl90IGluZGV4OwotCXVpbnQzMl90IHNpemU7Ci0JaW50IHJjID0gMDsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCi0JCQlhdWRpby0+d2FpdCwgKGF1ZGlvLT5pbl9jb3VudCA+IDApIHx8IGF1ZGlvLT5zdG9wcGVkIHx8Ci0JCQlhdWRpby0+YWJvcnQgfHwgKGF1ZGlvLT5pbl9jYWxsICYmIGF1ZGlvLT5ydW5uaW5nICYmCi0JCQkJKGF1ZGlvLT52b2ljZV9zdGF0ZSA9PSBWT0lDRV9TVEFURV9PRkZDQUxMKSkpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKCFhdWRpby0+aW5fY291bnQpIHsKLQkJCWlmIChhdWRpby0+c3RvcHBlZCkgewotCQkJCU1NX0RCRygiRHJpdmVyIGluIHN0b3Agc3RhdGUsIE5vIG1vcmUgXAotCQkJCQkJYnVmZmVyIHRvIHJlYWQiKTsKLQkJCQlyYyA9IDA7LyogRW5kIG9mIEZpbGUgKi8KLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoYXVkaW8tPmluX2NhbGwgJiYgYXVkaW8tPnJ1bm5pbmcgJiYKLQkJCQkoYXVkaW8tPnZvaWNlX3N0YXRlID09IFZPSUNFX1NUQVRFX09GRkNBTEwpKSB7Ci0JCQkJTU1fREJHKCJOb3QgUGVybWl0dGVkIFZvaWNlIFRlcm1pbmF0ZWRcbiIpOwotCQkJCXJjID0gLUVQRVJNOyAvKiBWb2ljZSBDYWxsIHN0b3BwZWQgKi8KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChhdWRpby0+YWJvcnQpIHsKLQkJCXJjID0gLUVQRVJNOyAvKiBOb3QgcGVybWl0dGVkIGR1ZSB0byBhYm9ydCAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpbmRleCA9IGF1ZGlvLT5pbl90YWlsOwotCQlkYXRhID0gKHVpbnQ4X3QgKikgYXVkaW8tPmluW2luZGV4XS5kYXRhOwotCQlzaXplID0gYXVkaW8tPmluW2luZGV4XS5zaXplOwotCQlpZiAoY291bnQgPj0gc2l6ZSkgewotCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGRhdGEsIHNpemUpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJaWYgKGluZGV4ICE9IGF1ZGlvLT5pbl90YWlsKSB7Ci0JCQkJLyogb3ZlcnJ1biAtLSBkYXRhIGlzCi0JCQkJICogaW52YWxpZCBhbmQgd2UgbmVlZCB0byByZXRyeSAqLwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYXVkaW8tPmluW2luZGV4XS5zaXplID0gMDsKLQkJCWF1ZGlvLT5pbl90YWlsID0gKGF1ZGlvLT5pbl90YWlsICsgMSkgJiAoRlJBTUVfTlVNIC0gMSk7Ci0JCQlhdWRpby0+aW5fY291bnQtLTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJY291bnQgLT0gc2l6ZTsKLQkJCWJ1ZiArPSBzaXplOwotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJzaG9ydCByZWFkIGNvdW50ICVkXG4iLCBjb3VudCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCi0JaWYgKGJ1ZiA+IHN0YXJ0KQotCQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZHBjbV9pbl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcGNtX2luX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRpby0+aW5fY2FsbCA9IDA7Ci0JLyogd2l0aCBkcmF3IGZyZXF1ZW5jeSBmb3Igc2Vzc2lvbgotCSAgIGluY2FzZSBub3Qgc3RvcHBlZCB0aGUgZHJpdmVyICovCi0JbXNtX3NuZGRldl93aXRoZHJhd19mcmVxKGF1ZGlvLT5lbmNfaWQsIFNORERFVl9DQVBfVFgsCi0JCQkJCUFVRERFVl9DTE5UX0VOQyk7Ci0JYXVkZGV2X3VucmVnaXN0ZXJfZXZ0X2xpc3RuZXIoQVVEREVWX0NMTlRfRU5DLCBhdWRpby0+ZW5jX2lkKTsKLQkvKnJlc2V0IHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgaW5mb3JtYXRpb24gYXQgYXVkcHJlcHJvYyBsYXllciovCi0JYXVkaW8tPnNlc3Npb25faW5mby5zYW1wbGluZ19mcmVxID0gMDsKLQlhdWRwcmVwcm9jX3VwZGF0ZV9hdWRyZWNfaW5mbygmYXVkaW8tPnNlc3Npb25faW5mbyk7Ci0JYXVkcGNtX2luX2Rpc2FibGUoYXVkaW8pOwotCWF1ZHBjbV9pbl9mbHVzaChhdWRpbyk7Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRyZWMpOwotCWF1ZHByZXByb2NfYWVuY19mcmVlKGF1ZGlvLT5lbmNfaWQpOwotCWF1ZGlvLT5hdWRyZWMgPSBOVUxMOwotCWF1ZGlvLT5vcGVuZWQgPSAwOwotCWlmIChhdWRpby0+ZGF0YSkgewotCQlpb25fdW5tYXBfa2VybmVsKGF1ZGlvLT5jbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLQkJYXVkaW8tPmRhdGEgPSBOVUxMOwotCX0KLQlpb25fY2xpZW50X2Rlc3Ryb3koYXVkaW8tPmNsaWVudCk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcGNtX2luX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9ICZ0aGVfYXVkaW9faW47Ci0JaW50IHJjOwotCWludCBlbmNpZDsKLQlpbnQgbGVuID0gMDsKLQl1bnNpZ25lZCBsb25nIGlvbmZsYWcgPSAwOwotCWlvbl9waHlzX2FkZHJfdCBhZGRyID0gMDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50ID0gTlVMTDsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlpZiAoYXVkaW8tPm9wZW5lZCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWNsaWVudCA9IG1zbV9pb25fY2xpZW50X2NyZWF0ZShVSU5UX01BWCwgIkF1ZGlvX1BDTV9pbl9jbGllbnQiKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoY2xpZW50KSkgewotCQlNTV9FUlIoIlVuYWJsZSB0byBjcmVhdGUgSU9OIGNsaWVudFxuIik7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gY2xpZW50X2NyZWF0ZV9lcnJvcjsKLQl9Ci0JYXVkaW8tPmNsaWVudCA9IGNsaWVudDsKLQotCU1NX0RCRygiYWxsb2NhdGluZyBtZW0gc3ogPSAlZFxuIiwgRE1BU1opOwotCWhhbmRsZSA9IGlvbl9hbGxvYyhjbGllbnQsIERNQVNaLCBTWl80SywKLQkJSU9OX0hFQVAoSU9OX0FVRElPX0hFQVBfSUQpLCAwKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoaGFuZGxlKSkgewotCQlNTV9FUlIoIlVuYWJsZSB0byBjcmVhdGUgYWxsb2NhdGUgTy9QIGJ1ZmZlcnNcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfYWxsb2NfZXJyb3I7Ci0JfQotCi0JYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSA9IGhhbmRsZTsKLQotCXJjID0gaW9uX3BoeXMoY2xpZW50ICwgaGFuZGxlLCAmYWRkciwgJmxlbik7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiTy9QIGJ1ZmZlcnM6SW52YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRwdXRfYnVmZl9nZXRfcGh5c19lcnJvcjsKLQl9IGVsc2UgewotCQlNTV9JTkZPKCJPL1AgYnVmZmVyczp2YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JfQotCWF1ZGlvLT5waHlzID0gKGludDMyX3QpYWRkcjsKLQotCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MoY2xpZW50LCBoYW5kbGUsICZpb25mbGFnKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgZ2V0IGZsYWdzIGZvciB0aGUgaGFuZGxlXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dHB1dF9idWZmX2dldF9mbGFnc19lcnJvcjsKLQl9Ci0KLQlhdWRpby0+bWFwX3ZfcmVhZCA9IGlvbl9tYXBfa2VybmVsKGNsaWVudCwgaGFuZGxlKTsKLQlpZiAoSVNfRVJSKGF1ZGlvLT5kYXRhKSkgewotCQlNTV9FUlIoImNvdWxkIG5vdCBtYXAgcmVhZCBidWZmZXJzLGZyZWVpbmcgaW5zdGFuY2UgMHglMDh4XG4iLAotCQkJCShpbnQpYXVkaW8pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfbWFwX2Vycm9yOwotCX0KLQlNTV9EQkcoInJlYWQgYnVmOiBwaHkgYWRkciAweCUwOHgga2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQlhdWRpby0+cGh5cywgKGludClhdWRpby0+ZGF0YSk7Ci0KLQlhdWRpby0+ZGF0YSA9IChjaGFyICopYXVkaW8tPm1hcF92X3JlYWQ7Ci0KLQlNTV9EQkcoIk1lbW9yeSBhZGRyID0gMHglOHggIHBoeSBhZGRyID0gMHglOHhcbiIsXAotCQkoaW50KSBhdWRpby0+ZGF0YSwgKGludCkgYXVkaW8tPnBoeXMpOwotCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJcmMgPSAtRUFDQ0VTOwotCQlNTV9FUlIoIk5vbiB0dW5uZWwgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZFxuIik7Ci0JCWdvdG8gZG9uZTsKLQl9IGVsc2UgaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlhdWRpby0+bW9kZSA9IE1TTV9BVURfRU5DX01PREVfVFVOTkVMOwotCQlNTV9EQkcoIk9wZW5lZCBmb3IgdHVubmVsIG1vZGUgZW5jb2RpbmdcbiIpOwotCX0gZWxzZSB7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBkb25lOwotCX0KLQkvKiBTZXR0aW5ncyB3aWxsIGJlIHJlLWNvbmZpZyBhdCBBVURJT19TRVRfQ09ORklHLAotCSAqIGJ1dCBhdCBsZWFzdCB3ZSBuZWVkIHRvIGhhdmUgaW5pdGlhbCBjb25maWcKLQkgKi8KLQlhdWRpby0+Y2hhbm5lbF9tb2RlID0gQVVEUkVDX0NNRF9NT0RFX01PTk87Ci0JYXVkaW8tPmJ1ZmZlcl9zaXplID0gTU9OT19EQVRBX1NJWkVfMTAyNDsKLQlhdWRpby0+c2FtcF9yYXRlID0gODAwMDsKLQlhdWRpby0+ZW5jX3R5cGUgPSBFTkNfVFlQRV9FWFRfV0FWIHwgYXVkaW8tPm1vZGU7Ci0KLQllbmNpZCA9IGF1ZHByZXByb2NfYWVuY19hbGxvYyhhdWRpby0+ZW5jX3R5cGUsICZhdWRpby0+bW9kdWxlX25hbWUsCi0JCQkmYXVkaW8tPnF1ZXVlX2lkcyk7Ci0JaWYgKGVuY2lkIDwgMCkgewotCQlNTV9FUlIoIk5vIGZyZWUgZW5jb2RlciBhdmFpbGFibGVcbiIpOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYXVkaW8tPmVuY19pZCA9IGVuY2lkOwotCi0JcmMgPSBtc21fYWRzcF9nZXQoYXVkaW8tPm1vZHVsZV9uYW1lLCAmYXVkaW8tPmF1ZHJlYywKLQkJCSAgICZhdWRyZWNfYWRzcF9vcHMsIGF1ZGlvKTsKLQotCWlmIChyYykgewotCQlhdWRwcmVwcm9jX2FlbmNfZnJlZShhdWRpby0+ZW5jX2lkKTsKLQkJZ290byBkb25lOwotCX0KLQotCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQlhdWRpby0+c291cmNlID0gMDsKLQlhdWRpby0+YWJvcnQgPSAwOwotCWF1ZHBjbV9pbl9mbHVzaChhdWRpbyk7Ci0JYXVkaW8tPmRldmljZV9ldmVudHMgPSBBVURERVZfRVZUX0RFVl9SRFkgfCBBVURERVZfRVZUX0RFVl9STFMgfAotCQkJCUFVRERFVl9FVlRfRlJFUV9DSEcgfAotCQkJCUFVRERFVl9FVlRfVk9JQ0VfU1RBVEVfQ0hHOwotCi0JYXVkaW8tPnZvaWNlX3N0YXRlID0gbXNtX2dldF92b2ljZV9zdGF0ZSgpOwotCXJjID0gYXVkZGV2X3JlZ2lzdGVyX2V2dF9saXN0bmVyKGF1ZGlvLT5kZXZpY2VfZXZlbnRzLAotCQkJCQlBVURERVZfQ0xOVF9FTkMsIGF1ZGlvLT5lbmNfaWQsCi0JCQkJCXBjbV9pbl9saXN0ZW5lciwgKHZvaWQgKikgYXVkaW8pOwotCWlmIChyYykgewotCQlNTV9FUlIoImZhaWxlZCB0byByZWdpc3RlciBkZXZpY2UgZXZlbnQgbGlzdGVuZXJcbiIpOwotCQlnb3RvIGV2dF9lcnJvcjsKLQl9Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0JYXVkaW8tPm9wZW5lZCA9IDE7Ci0JcmMgPSAwOwotCWF1ZGlvLT5idWlsZF9pZCA9IHNvY2luZm9fZ2V0X2J1aWxkX2lkKCk7Ci0JTU1fREJHKCJNb2RlbSBidWlsZCBpZCA9ICVzXG4iLCBhdWRpby0+YnVpbGRfaWQpOwotZG9uZToKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci1ldnRfZXJyb3I6Ci1vdXRwdXRfYnVmZl9tYXBfZXJyb3I6Ci1vdXRwdXRfYnVmZl9nZXRfcGh5c19lcnJvcjoKLW91dHB1dF9idWZmX2dldF9mbGFnc19lcnJvcjoKLQlpb25fZnJlZShjbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotb3V0cHV0X2J1ZmZfYWxsb2NfZXJyb3I6Ci0JaW9uX2NsaWVudF9kZXN0cm95KGNsaWVudCk7Ci1jbGllbnRfY3JlYXRlX2Vycm9yOgotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcmVjKTsKLQlhdWRwcmVwcm9jX2FlbmNfZnJlZShhdWRpby0+ZW5jX2lkKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2luX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGF1ZHBjbV9pbl9vcGVuLAotCS5yZWxlYXNlCT0gYXVkcGNtX2luX3JlbGVhc2UsCi0JLnJlYWQJCT0gYXVkcGNtX2luX3JlYWQsCi0JLndyaXRlCQk9IGF1ZHBjbV9pbl93cml0ZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBhdWRwY21faW5faW9jdGwsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19pbl9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fcGNtX2luIiwKLQkuZm9wcwk9ICZhdWRpb19pbl9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkcGNtX2luX2luaXQodm9pZCkKLXsKLQltdXRleF9pbml0KCZ0aGVfYXVkaW9faW4ubG9jayk7Ci0JbXV0ZXhfaW5pdCgmdGhlX2F1ZGlvX2luLnJlYWRfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnRoZV9hdWRpb19pbi5kc3BfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnRoZV9hdWRpb19pbi5kZXZfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdGhlX2F1ZGlvX2luLndhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoZV9hdWRpb19pbi53YWl0X2VuYWJsZSk7Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2luX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoYXVkcGNtX2luX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19xY2VscC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19xY2VscC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2NhN2ExLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fcWNlbHAuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MzggKzAsMCBAQAotLyoKLSAqIHFjZWxwIDEzayBhdWRpbyBkZWNvZGVyIGRldmljZQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgYmFzZWQgaW4gcGFydCBvbiBhdWRpb19tcDMuYywgd2hpY2ggaXMKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHlvdSBjYW4gZmluZCBpdCBhdCBodHRwOi8vd3d3LmZzZi5vcmcuCi0gKgotICovCi0KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZWFybHlzdXNwZW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1vcnlfYWxsb2MuaD4KLQotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdV9kb21haW5zLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHBtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRwbGF5Y21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBsYXltc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkcHAuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19kZXZfY3RsLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX21lbXR5cGVzLmg+Ci0KLSNkZWZpbmUgQlVGU1ogMTA5NCAvKiBRQ0VMUCAxM0sgSG9sZCA2MDBtcyBwYWNrZXQgZGF0YSA9IDM2ICogMzAgYW5kCi0JCSAgICAgIDE0IGJ5dGVzIG9mIG1ldGEgaW4gKi8KLSNkZWZpbmUgQlVGX0NPVU5UIDIKLSNkZWZpbmUgRE1BU1ogKEJVRlNaICogQlVGX0NPVU5UKQotCi0jZGVmaW5lIFBDTV9CVUZTWl9NSU4gMTYyNCAvKiAxMDBtcyB3b3J0aCBvZiBkYXRhIGFuZAotCQkJICAgICAgMjQgYnl0ZXMgb2YgbWV0YSBvdXQgICovCi0jZGVmaW5lIFBDTV9CVUZfTUFYX0NPVU5UIDUKLQotI2RlZmluZSBBVURERUNfREVDX1FDRUxQIDkKLQotI2RlZmluZQlST1VUSU5HX01PREVfRlRSVAkxCi0jZGVmaW5lCVJPVVRJTkdfTU9ERV9SVAkJMgotLyogRGVjb2RlciBzdGF0dXMgcmVjZWl2ZWQgZnJvbSBBVURQUFRBU0sgKi8KLSNkZWZpbmUJQVVEUFBfREVDX1NUQVRVU19TTEVFUAkwCi0jZGVmaW5lCUFVRFBQX0RFQ19TVEFUVVNfSU5JVAkxCi0jZGVmaW5lCUFVRFBQX0RFQ19TVEFUVVNfQ0ZHCTIKLSNkZWZpbmUJQVVEUFBfREVDX1NUQVRVU19QTEFZCTMKLQotI2RlZmluZSBBVURRQ0VMUF9NRVRBRklFTERfTUFTSyAweEZGRkYwMDAwCi0jZGVmaW5lIEFVRFFDRUxQX0VPU19GTEdfT0ZGU0VUIDB4MEEgLyogT2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIGJ1ZmZlciAqLwotI2RlZmluZSBBVURRQ0VMUF9FT1NfRkxHX01BU0sgMHgwMQotI2RlZmluZSBBVURRQ0VMUF9FT1NfTk9ORSAweDAgLyogTm8gRU9TIGRldGVjdGVkICovCi0jZGVmaW5lIEFVRFFDRUxQX0VPU19TRVQgMHgxIC8qIEVPUyBzZXQgaW4gbWV0YSBmaWVsZCAqLwotCi0jZGVmaW5lIEFVRFFDRUxQX0VWRU5UX05VTSAxMCAvKiBEZWZhdWx0IG51bWJlciBvZiBwcmUtYWxsb2NhdGVkIGV2ZW50IHBrdHMgKi8KLQotc3RydWN0IGJ1ZmZlciB7Ci0Jdm9pZCAqZGF0YTsKLQl1bnNpZ25lZCBzaXplOwotCXVuc2lnbmVkIHVzZWQ7CQkvKiBJbnB1dCB1c2FnZSBhY3R1YWwgRFNQIHByb2R1Y2VkIFBDTSBzaXplICAqLwotCXVuc2lnbmVkIGFkZHI7Ci0JdW5zaWduZWQgc2hvcnQgbWZpZWxkX3N6OyAvKm9ubHkgdXNlZnVsIGZvciBkYXRhIGhhcyBtZXRhIGZpZWxkICovCi19OwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0cnVjdCBhdWRxY2VscF9zdXNwZW5kX2N0bCB7Ci0Jc3RydWN0IGVhcmx5X3N1c3BlbmQgbm9kZTsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvOwotfTsKLSNlbmRpZgotCi1zdHJ1Y3QgYXVkcWNlbHBfZXZlbnR7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCWludCBldmVudF90eXBlOwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci19OwotCi1zdHJ1Y3QgYXVkaW8gewotCXN0cnVjdCBidWZmZXIgb3V0W0JVRl9DT1VOVF07Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JdWludDhfdCBvdXRfaGVhZDsKLQl1aW50OF90IG91dF90YWlsOwotCXVpbnQ4X3Qgb3V0X25lZWRlZDsJLyogbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGRzcCBpcyB3YWl0aW5nIGZvciAqLwotCi0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IG11dGV4IHdyaXRlX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd3JpdGVfd2FpdDsKLQotCS8qIEhvc3QgUENNIHNlY3Rpb24gLSBTVEFSVCAqLwotCXN0cnVjdCBidWZmZXIgaW5bUENNX0JVRl9NQVhfQ09VTlRdOwotCXN0cnVjdCBtdXRleCByZWFkX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF93YWl0OyAgICAvKiBXYWl0IHF1ZXVlIGZvciByZWFkICovCi0JY2hhciAqcmVhZF9kYXRhOyAgICAgICAgLyogcG9pbnRlciB0byByZWFkZXIgYnVmZmVyICovCi0JaW50MzJfdCByZWFkX3BoeXM7ICAgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiByZWFkZXIgYnVmZmVyICovCi0JdWludDhfdCByZWFkX25leHQ7ICAgICAgLyogaW5kZXggdG8gaW5wdXQgYnVmZmVycyB0byBiZSByZWFkIG5leHQgKi8KLQl1aW50OF90IGZpbGxfbmV4dDsgICAgICAvKiBpbmRleCB0byBidWZmZXIgdGhhdCBEU1Agc2hvdWxkIGJlIGZpbGxpbmcgKi8KLQl1aW50OF90IHBjbV9idWZfY291bnQ7ICAvKiBudW1iZXIgb2YgcGNtIGJ1ZmZlciBhbGxvY2F0ZWQgKi8KLQkvKiBIb3N0IFBDTSBzZWN0aW9uIC0gRU5EICovCi0KLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICphdWRwbGF5OwotCi0JLyogZGF0YSBhbGxvY2F0ZWQgZm9yIHZhcmlvdXMgYnVmZmVycyAqLwotCWNoYXIgKmRhdGE7Ci0JaW50MzJfdCBwaHlzOyAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHdyaXRlIGJ1ZmZlciAqLwotCXZvaWQgKm1hcF92X3JlYWQ7Ci0Jdm9pZCAqbWFwX3Zfd3JpdGU7Ci0KLQlpbnQgbWZpZWxkOyAvKiBtZXRhIGZpZWxkIGVtYmVkZGVkIGluIGRhdGEgKi8KLQlpbnQgcmZsdXNoOyAvKiBSZWFkICBmbHVzaCAqLwotCWludCB3Zmx1c2g7IC8qIFdyaXRlIGZsdXNoICovCi0JdWludDhfdCBvcGVuZWQ6MTsKLQl1aW50OF90IGVuYWJsZWQ6MTsKLQl1aW50OF90IHJ1bm5pbmc6MTsKLQl1aW50OF90IHN0b3BwZWQ6MTsJLyogc2V0IHdoZW4gc3RvcHBlZCwgY2xlYXJlZCBvbiBmbHVzaCAqLwotCXVpbnQ4X3QgcGNtX2ZlZWRiYWNrOjE7IC8qIHNldCB3aGVuIG5vbi10dW5uZWwgbW9kZSAqLwotCXVpbnQ4X3QgYnVmX3JlZnJlc2g6MTsKLQlpbnQgdGVvczsgLyogdmFsaWQgb25seSBpZiB0dW5uZWwgbW9kZSAmIG5vIGRhdGEgbGVmdCBmb3IgZGVjb2RlciAqLwotCWVudW0gbXNtX2F1ZF9kZWNvZGVyX3N0YXRlIGRlY19zdGF0ZTsJLyogUmVwcmVzZW50cyBkZWNvZGVyIHN0YXRlICovCi0KLQljb25zdCBjaGFyICptb2R1bGVfbmFtZTsKLQl1bnNpZ25lZCBxdWV1ZV9pZDsKLQl1aW50MTZfdCBkZWNfaWQ7Ci0JaW50MTZfdCBzb3VyY2U7Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCXN0cnVjdCBhdWRxY2VscF9zdXNwZW5kX2N0bCBzdXNwZW5kX2N0bDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotI2VuZGlmCi0KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9ldmVudF9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50X3F1ZXVlOwotCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3dhaXQ7Ci0Jc3BpbmxvY2tfdCBldmVudF9xdWV1ZV9sb2NrOwotCXN0cnVjdCBtdXRleCBnZXRfZXZlbnRfbG9jazsKLQlpbnQgZXZlbnRfYWJvcnQ7Ci0JLyogQVYgc3luYyBJbmZvICovCi0JaW50IGF2c3luY19mbGFnOyAgICAgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSBmZWVkYmFjayBmcm9tIERTUCAqLwotCXdhaXRfcXVldWVfaGVhZF90IGF2c3luY193YWl0Oy8qIFdhaXQgcXVldWUgZm9yIEFWIFN5bmMgTWVzc2FnZSAgICAgKi8KLQkvKiBmbGFncywgNDggYml0cyBzYW1wbGUvYnl0ZXMgY291bnRlciBwZXIgY2hhbm5lbCAqLwotCXVpbnQxNl90IGF2c3luY1tBVURQUF9BVlNZTkNfQ0hfQ09VTlQgKiBBVURQUF9BVlNZTkNfTlVNX1dPUkRTICsgMV07Ci0KLQl1aW50MzJfdCBkZXZpY2VfZXZlbnRzOwotCi0JaW50IGVxX2VuYWJsZTsKLQlpbnQgZXFfbmVlZHNfY29tbWl0OwotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfZXFhbGl6ZXIgZXE7Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUgdm9sX3BhbjsKLX07Ci0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRxY2VscF9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgbmVlZGVkKTsKLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX2NvbmZpZ19ob3N0cGNtKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcWNlbHBfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRxY2VscF9kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpOwotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdGF0aWMgdm9pZCBhdWRxY2VscF9wb3N0X2V2ZW50KHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCB0eXBlLAotCQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkKTsKLSNlbmRpZgotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkcWNlbHBfZW5hYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCWF1ZGlvLT5vdXRfdGFpbCA9IDA7Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCi0JaWYgKG1zbV9hZHNwX2VuYWJsZShhdWRpby0+YXVkcGxheSkpIHsKLQkJTU1fRVJSKCJtc21fYWRzcF9lbmFibGUoYXVkcGxheSkgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKGF1ZHBwX2VuYWJsZShhdWRpby0+ZGVjX2lkLCBhdWRxY2VscF9kc3BfZXZlbnQsIGF1ZGlvKSkgewotCQlNTV9FUlIoImF1ZHBwX2VuYWJsZSgpIGZhaWxlZFxuIik7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JYXVkaW8tPmVuYWJsZWQgPSAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBxY2VscF9saXN0bmVyKHUzMiBldnRfaWQsIHVuaW9uIGF1ZGRldl9ldnRfZGF0YSAqZXZ0X3BheWxvYWQsCi0JCQl2b2lkICpwcml2YXRlX2RhdGEpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IChzdHJ1Y3QgYXVkaW8gKikgcHJpdmF0ZV9kYXRhOwotCXN3aXRjaCAoZXZ0X2lkKSB7Ci0JY2FzZSBBVURERVZfRVZUX0RFVl9SRFk6Ci0JCU1NX0RCRygiOkFVRERFVl9FVlRfREVWX1JEWVxuIik7Ci0JCWF1ZGlvLT5zb3VyY2UgfD0gKDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0JCWlmIChhdWRpby0+cnVubmluZyA9PSAxICYmIGF1ZGlvLT5lbmFibGVkID09IDEpCi0JCQlhdWRwcF9yb3V0ZV9zdHJlYW0oYXVkaW8tPmRlY19pZCwgYXVkaW8tPnNvdXJjZSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEREVWX0VWVF9ERVZfUkxTOgotCQlNTV9EQkcoIjpBVURERVZfRVZUX0RFVl9STFNcbiIpOwotCQlhdWRpby0+c291cmNlICY9IH4oMHgxIDw8IGV2dF9wYXlsb2FkLT5yb3V0aW5nX2lkKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nID09IDEgJiYgYXVkaW8tPmVuYWJsZWQgPT0gMSkKLQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLCBhdWRpby0+c291cmNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURERVZfRVZUX1NUUkVBTV9WT0xfQ0hHOgotCQlhdWRpby0+dm9sX3Bhbi52b2x1bWUgPSBldnRfcGF5bG9hZC0+c2Vzc2lvbl92b2w7Ci0JCU1NX0RCRygiOkFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEcsIHN0cmVhbSB2b2wgJWRcbiIsCi0JCQkJYXVkaW8tPnZvbF9wYW4udm9sdW1lKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiOkVSUk9SOndyb25nIGV2ZW50XG4iKTsKLQkJYnJlYWs7Ci0JfQotfQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhdWRpby0+bG9jayBoZWxkICovCi1zdGF0aWMgaW50IGF1ZHFjZWxwX2Rpc2FibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JaWYgKGF1ZGlvLT5lbmFibGVkKSB7Ci0JCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJYXVkaW8tPmRlY19zdGF0ZSA9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FOwotCQlhdWRkZWNfZHNwX2NvbmZpZyhhdWRpbywgMCk7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXQsCi0JCQkJYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORSwKLQkJCQltc2Vjc190b19qaWZmaWVzKE1TTV9BVURfREVDT0RFUl9XQUlUX01TKSk7Ci0JCWlmIChyYyA9PSAwKQotCQkJcmMgPSAtRVRJTUVET1VUOwotCQllbHNlIGlmIChhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCQltc21fYWRzcF9kaXNhYmxlKGF1ZGlvLT5hdWRwbGF5KTsKLQkJYXVkcHBfZGlzYWJsZShhdWRpby0+ZGVjX2lkLCBhdWRpbyk7Ci0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX3VwZGF0ZV9wY21fYnVmX2VudHJ5KHN0cnVjdCBhdWRpbyAqYXVkaW8sCi0JdWludDMyX3QgKnBheWxvYWQpCi17Ci0JdWludDhfdCBpbmRleDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGF1ZGlvLT5yZmx1c2gpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwYXlsb2FkWzFdOyBpbmRleCsrKSB7Ci0JCWlmIChhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uYWRkciA9PQotCQkJcGF5bG9hZFsyICsgaW5kZXggKiAyXSkgewotCQkJTU1fREJHKCJpblslZF0gcmVhZHlcbiIsIGF1ZGlvLT5maWxsX25leHQpOwotCQkJYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnVzZWQgPQotCQkJcGF5bG9hZFszICsgaW5kZXggKiAyXTsKLQkJCWlmICgoKythdWRpby0+ZmlsbF9uZXh0KSA9PSBhdWRpby0+cGNtX2J1Zl9jb3VudCkKLQkJCQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiZXhwZWN0ZWQ9JXggcmV0PSV4XG4iLAotCQkJCWF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyLAotCQkJCXBheWxvYWRbMSArIGluZGV4ICogMl0pOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS51c2VkID09IDApIHsKLQkJYXVkcWNlbHBfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCX0gZWxzZSB7Ci0JCU1NX0RCRygicmVhZCBjYW5ub3Qga2VlcCB1cFxuIik7Ci0JCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDE7Ci0JfQotCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwbGF5X2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgc2l6ZV90IGxlbiwKLQkJCSAgICAgIHZvaWQgKCpnZXRldmVudCkgKHZvaWQgKnB0ciwgc2l6ZV90IGxlbikpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGRhdGE7Ci0JdWludDMyX3QgbXNnWzI4XTsKLQlnZXRldmVudChtc2csIHNpemVvZihtc2cpKTsKLQotCU1NX0RCRygibXNnX2lkPSV4XG4iLCBpZCk7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQTEFZX01TR19ERUNfTkVFRFNfREFUQToKLQkJYXVkcWNlbHBfc2VuZF9kYXRhKGF1ZGlvLCAxKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBMQVlfTVNHX0JVRkZFUl9VUERBVEU6Ci0JCWF1ZHFjZWxwX3VwZGF0ZV9wY21fYnVmX2VudHJ5KGF1ZGlvLCBtc2cpOwotCQlicmVhazsKLQotCWNhc2UgQURTUF9NRVNTQUdFX0lEOgotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6IG1vZHVsZSBlbmFibGUoYXVkcGxheXRhc2spXG4iKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlNTV9FUlIoInVuZXhwZWN0ZWQgbWVzc2FnZSBmcm9tIGRlY29kZXIgXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX2RzcF9ldmVudCh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gcHJpdmF0ZTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBQX01TR19TVEFUVVNfTVNHOnsKLQkJCXVuc2lnbmVkIHN0YXR1cyA9IG1zZ1sxXTsKLQotCQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19TTEVFUDogewotCQkJCXVpbnQxNl90IHJlYXNvbiA9IG1zZ1syXTsKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOnNsZWVwIHJlYXNvbiA9IFwKLQkJCQkJCTB4JTA0eFxuIiwgcmVhc29uKTsKLQkJCQlpZiAoKHJlYXNvbiA9PSBBVURQUF9NU0dfUkVBU09OX01FTSkKLQkJCQkJfHwgKHJlYXNvbiA9PQotCQkJCQlBVURQUF9NU0dfUkVBU09OX05PREVDT0RFUikpIHsKLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9GQUlMVVJFOwotCQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJfSBlbHNlIGlmIChyZWFzb24gPT0gQVVEUFBfTVNHX1JFQVNPTl9OT05FKSB7Ci0JCQkJCS8qIGRlY29kZXIgaXMgaW4gZGlzYWJsZSBzdGF0ZSAqLwotCQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9DTE9TRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19JTklUOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IGluaXQgXG4iKTsKLQkJCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJCQkJYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoYXVkaW8pOwotCQkJCWVsc2UKLQkJCQkJYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhhdWRpbyk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19DRkc6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogY2ZnIFxuIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfUExBWToKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBwbGF5IFxuIik7Ci0JCQkJLyogc2VuZCAgbWl4ZXIgY29tbWFuZCAqLwotCQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLAotCQkJCQkJYXVkaW8tPnNvdXJjZSk7Ci0JCQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJCQkJYXVkcWNlbHBfY29uZmlnX2hvc3RwY20oYXVkaW8pOwotCQkJCQlhdWRxY2VscF9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JCQkJfQotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfU1VDQ0VTUzsKLQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCU1NX0VSUigidW5rbm93biBkZWNvZGVyIHN0YXR1c1xuIik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVEUFBfTVNHX0NGR19NU0c6Ci0JCWlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9FTkEpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBFTkFCTEVcbiIpOwotCQkJYXVkZGVjX2RzcF9jb25maWcoYXVkaW8sIDEpOwotCQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAxOwotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsCWF1ZGlvLT5lcV9lbmFibGUsCi0JCQkJCSZhdWRpby0+ZXEsIFBPUFApOwotCQl9IGVsc2UgaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0RJUykgewotCQkJTU1fREJHKCJDRkdfTVNHIERJU0FCTEVcbiIpOwotCQkJYXVkaW8tPnJ1bm5pbmcgPSAwOwotCQl9IGVsc2UgewotCQkJTU1fREJHKCJDRkdfTVNHICVkP1xuIiwgbXNnWzBdKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRFBQX01TR19ST1VUSU5HX0FDSzoKLQkJTU1fREJHKCJST1VUSU5HX0FDSyBtb2RlPSVkXG4iLCBtc2dbMV0pOwotCQlhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfRkxVU0hfQUNLOgotCQlNTV9EQkcoIkZMVVNIX0FDS1xuIik7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJCWF1ZHFjZWxwX2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfUENNRE1BTUlTU0VEOgotCQlNTV9EQkcoIlBDTURNQU1JU1NFRFxuIik7Ci0JCWF1ZGlvLT50ZW9zID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlicmVhazsKLQotCWNhc2UgQVVEUFBfTVNHX0FWU1lOQ19NU0c6Ci0JCU1NX0RCRygiQVVEUFBfTVNHX0FWU1lOQ19NU0dcbiIpOwotCQltZW1jcHkoJmF1ZGlvLT5hdnN5bmNbMF0sIG1zZywgc2l6ZW9mKGF1ZGlvLT5hdnN5bmMpKTsKLQkJYXVkaW8tPmF2c3luY19mbGFnID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPmF2c3luY193YWl0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlNTV9FUlIoIlVOS05PV04gKCVkKVxuIiwgaWQpOwotCX0KLQotfQotCi1zdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHBsYXlfYWRzcF9vcHNfcWNlbHAgPSB7Ci0JLmV2ZW50ID0gYXVkcGxheV9kc3BfZXZlbnQsCi19OwotCi0jZGVmaW5lIGF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHBsYXksIGF1ZGlvLT5xdWV1ZV9pZCwgXAotCQljbWQsIGxlbikKLQotc3RhdGljIGludCBhdWRkZWNfZHNwX2NvbmZpZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2RlY190eXBlIGNmZ19kZWNfY21kOwotCi0JbWVtc2V0KCZjZmdfZGVjX2NtZCwgMCwgc2l6ZW9mKGNmZ19kZWNfY21kKSk7Ci0KLQljZmdfZGVjX2NtZC5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX0RFQ19UWVBFOwotCWlmIChlbmFibGUpCi0JCWNmZ19kZWNfY21kLmRlY19jZmcgPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCQlBVURQUF9DTURfRU5BX0RFQ19WIHwgQVVEREVDX0RFQ19RQ0VMUDsKLQllbHNlCi0JCWNmZ19kZWNfY21kLmRlY19jZmcgPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCQlBVURQUF9DTURfRElTX0RFQ19WOwotCWNmZ19kZWNfY21kLmRtX21vZGUgPSAweDA7Ci0JY2ZnX2RlY19jbWQuc3RyZWFtX2lkID0gYXVkaW8tPmRlY19pZDsKLQotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMSgmY2ZnX2RlY19jbWQsIHNpemVvZihjZmdfZGVjX2NtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfdjEzayBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jb21tb24uY21kX2lkID0gQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNUzsKLQljbWQuY29tbW9uLmxlbmd0aCA9IEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVNfVjEzS19MRU47Ci0JY21kLmNvbW1vbi5kZWNfaWQgPSBhdWRpby0+ZGVjX2lkOwotCWNtZC5jb21tb24uaW5wdXRfc2FtcGxpbmdfZnJlcXVlbmN5ID0gODAwMDsKLQljbWQuc3RlcmVvX2NmZyA9IEFVRFBQX0NNRF9QQ01fSU5URl9NT05PX1Y7Ci0KLQlhdWRwcF9zZW5kX3F1ZXVlMigmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9yb3V0aW5nX21vZGUgY21kOwotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUFBfQ01EX1JPVVRJTkdfTU9ERTsKLQljbWQub2JqZWN0X251bWJlciA9IGF1ZGlvLT5kZWNfaWQ7Ci0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfRlRSVDsKLQllbHNlCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfUlQ7Ci0JYXVkcHBfc2VuZF9xdWV1ZTEoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGF1ZHBsYXlfZHNwX3NlbmRfZGF0YV9hdmFpbChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQkJCSAgICAgICB1bnNpZ25lZCBpZHgsIHVuc2lnbmVkIGxlbikKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfYml0c3RyZWFtX2RhdGFfYXZhaWxfbnQyIGNtZDsKLQotCWNtZC5jbWRfaWQgPSBBVURQTEFZX0NNRF9CSVRTVFJFQU1fREFUQV9BVkFJTF9OVDI7Ci0JaWYgKGF1ZGlvLT5tZmllbGQpCi0JCWNtZC5kZWNvZGVyX2lkID0gQVVEUUNFTFBfTUVUQUZJRUxEX01BU0sgfAotCQkJKGF1ZGlvLT5vdXRbaWR4XS5tZmllbGRfc3ogPj4gMSk7Ci0JZWxzZQotCQljbWQuZGVjb2Rlcl9pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmJ1Zl9wdHIgPSBhdWRpby0+b3V0W2lkeF0uYWRkcjsKLQljbWQuYnVmX3NpemUgPSBsZW4gLyAyOwotCWNtZC5wYXJ0aXRpb25fbnVtYmVyID0gMDsKLQlyZXR1cm4gYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRxY2VscF9idWZmZXJfcmVmcmVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwbGF5X2NtZF9idWZmZXJfcmVmcmVzaCByZWZyZXNoX2NtZDsKLQotCXJlZnJlc2hfY21kLmNtZF9pZCA9IEFVRFBMQVlfQ01EX0JVRkZFUl9SRUZSRVNIOwotCXJlZnJlc2hfY21kLm51bV9idWZmZXJzID0gMTsKLQlyZWZyZXNoX2NtZC5idWYwX2FkZHJlc3MgPSBhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uYWRkcjsKLQlyZWZyZXNoX2NtZC5idWYwX2xlbmd0aCA9IGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5zaXplOwotCXJlZnJlc2hfY21kLmJ1Zl9yZWFkX2NvdW50ID0gMDsKLQlNTV9EQkcoImJ1ZjBfYWRkcj0leCBidWYwX2xlbj0lZFxuIiwgcmVmcmVzaF9jbWQuYnVmMF9hZGRyZXNzLAotCQkJcmVmcmVzaF9jbWQuYnVmMF9sZW5ndGgpOwotCi0JKHZvaWQpYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJnJlZnJlc2hfY21kLCBzaXplb2YocmVmcmVzaF9jbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcWNlbHBfY29uZmlnX2hvc3RwY20oc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfaHBjbV9idWZfY2ZnIGNmZ19jbWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWNmZ19jbWQuY21kX2lkID0gQVVEUExBWV9DTURfSFBDTV9CVUZfQ0ZHOwotCWNmZ19jbWQubWF4X2J1ZmZlcnMgPSAxOwotCWNmZ19jbWQuYnl0ZV9zd2FwID0gMDsKLQljZmdfY21kLmhvc3RwY21fY29uZmlnID0gKDB4ODAwMCkgfCAoMHg0MDAwKTsKLQljZmdfY21kLmZlZWRiYWNrX2ZyZXF1ZW5jeSA9IDE7Ci0JY2ZnX2NtZC5wYXJ0aXRpb25fbnVtYmVyID0gMDsKLQotCSh2b2lkKWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZjZmdfY21kLCBzaXplb2YoY2ZnX2NtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRxY2VscF9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgbmVlZGVkKQotewotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhdWRpby0+cnVubmluZykKLQkJZ290byBkb25lOwotCi0JaWYgKG5lZWRlZCAmJiAhYXVkaW8tPndmbHVzaCkgewotCQkvKiBXZSB3ZXJlIGNhbGxlZCBmcm9tIHRoZSBjYWxsYmFjayBiZWNhdXNlIHRoZSBEU1AKLQkJICogcmVxdWVzdGVkIG1vcmUgZGF0YS4gIE5vdGUgdGhhdCB0aGUgRFNQIGRvZXMgd2FudAotCQkgKiBtb3JlIGRhdGEsIGFuZCBpZiBhIGJ1ZmZlciB3YXMgaW4tZmxpZ2h0LCBtYXJrIGl0Ci0JCSAqIGFzIGF2YWlsYWJsZSAoc2luY2UgdGhlIERTUCBtdXN0IG5vdyBiZSBkb25lIHdpdGgKLQkJICogaXQpLgotCQkgKi8KLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAxOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCWlmIChmcmFtZS0+dXNlZCA9PSAweGZmZmZmZmZmKSB7Ci0JCQlNTV9EQkcoImZyYW1lICVkIGZyZWVcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDA7Ci0JCQlhdWRpby0+b3V0X3RhaWwgXj0gMTsKLQkJCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJfQotCX0KLQotCWlmIChhdWRpby0+b3V0X25lZWRlZCkgewotCQkvKiBJZiB0aGUgRFNQIGN1cnJlbnRseSB3YW50cyBkYXRhIGFuZCB3ZSBoYXZlIGEKLQkJICogYnVmZmVyIGF2YWlsYWJsZSwgd2Ugd2lsbCBzZW5kIGl0IGFuZCByZXNldAotCQkgKiB0aGUgbmVlZGVkIGZsYWcuICBXZSdsbCBtYXJrIHRoZSBidWZmZXIgYXMgaW4tZmxpZ2h0Ci0JCSAqIHNvIHRoYXQgaXQgd29uJ3QgYmUgcmVjeWNsZWQgdW50aWwgdGhlIG5leHQgYnVmZmVyCi0JCSAqIGlzIHJlcXVlc3RlZAotCQkgKi8KLQotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCWlmIChmcmFtZS0+dXNlZCkgewotCQkJQlVHX09OKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpOwotCQkJTU1fREJHKCJmcmFtZSAlZCBidXN5XG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCQkJYXVkcGxheV9kc3Bfc2VuZF9kYXRhX2F2YWlsKGF1ZGlvLCBhdWRpby0+b3V0X3RhaWwsCi0JCQkJCQkgICAgZnJhbWUtPnVzZWQpOwotCQkJZnJhbWUtPnVzZWQgPSAweGZmZmZmZmZmOwotCQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQl9Ci0JfQotIGRvbmU6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZGV2aWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdm9pZCBhdWRxY2VscF9mbHVzaChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWF1ZGlvLT5vdXRbMF0udXNlZCA9IDA7Ci0JYXVkaW8tPm91dFsxXS51c2VkID0gMDsKLQlhdWRpby0+b3V0X2hlYWQgPSAwOwotCWF1ZGlvLT5vdXRfdGFpbCA9IDA7Ci0JYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBhdWRxY2VscF9mbHVzaF9wY21fYnVmKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdWludDhfdCBpbmRleDsKLQotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFBDTV9CVUZfTUFYX0NPVU5UOyBpbmRleCsrKQotCQlhdWRpby0+aW5baW5kZXhdLnVzZWQgPSAwOwotCi0JYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLX0KLQotc3RhdGljIHZvaWQgYXVkcWNlbHBfaW9wb3J0X3Jlc2V0KHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JLyogTWFrZSBzdXJlIHJlYWQvd3JpdGUgdGhyZWFkIGFyZSBmcmVlIGZyb20KLQkgKiBzbGVlcCBhbmQga25vd2luZyB0aGF0IHN5c3RlbSBpcyBub3QgYWJsZQotCSAqIHRvIHByb2Nlc3MgaW8gcmVxdWVzdCBhdCB0aGUgbW9tZW50Ci0JICovCi0Jd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlhdWRxY2VscF9mbHVzaChhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JYXVkcWNlbHBfZmx1c2hfcGNtX2J1ZihhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAxOwotCXdha2VfdXAoJmF1ZGlvLT5hdnN5bmNfd2FpdCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcWNlbHBfZXZlbnRzX3BlbmRpbmcoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlbXB0eTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWVtcHR5ID0gIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gZW1wdHkgfHwgYXVkaW8tPmV2ZW50X2Fib3J0OwotfQotCi1zdGF0aWMgdm9pZCBhdWRxY2VscF9yZXNldF9ldmVudF9xdWV1ZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGF1ZHFjZWxwX2V2ZW50ICpkcnZfZXZ0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZHFjZWxwX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCQlrZnJlZShkcnZfZXZ0KTsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkcWNlbHBfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi0KLXN0YXRpYyBsb25nIGF1ZHFjZWxwX3Byb2Nlc3NfZXZlbnRfcmVxKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHZvaWQgX191c2VyICphcmcpCi17Ci0JbG9uZyByYzsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50IHVzcl9ldnQ7Ci0Jc3RydWN0IGF1ZHFjZWxwX2V2ZW50ICpkcnZfZXZ0ID0gTlVMTDsKLQlpbnQgdGltZW91dDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ1c3JfZXZ0LCBhcmcsIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JdGltZW91dCA9IChpbnQpIHVzcl9ldnQudGltZW91dF9tczsKLQotCWlmICh0aW1lb3V0ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAotCQkJYXVkaW8tPmV2ZW50X3dhaXQsIGF1ZHFjZWxwX2V2ZW50c19wZW5kaW5nKGF1ZGlvKSwKLQkJCW1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOwotCQlpZiAocmMgPT0gMCkKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCX0gZWxzZSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAotCQkJYXVkaW8tPmV2ZW50X3dhaXQsIGF1ZHFjZWxwX2V2ZW50c19wZW5kaW5nKGF1ZGlvKSk7Ci0JfQotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGF1ZGlvLT5ldmVudF9hYm9ydCkgewotCQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAwOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyYyA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSkpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkcWNlbHBfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JfQotCi0JaWYgKGRydl9ldnQpIHsKLQkJdXNyX2V2dC5ldmVudF90eXBlID0gZHJ2X2V2dC0+ZXZlbnRfdHlwZTsKLQkJdXNyX2V2dC5ldmVudF9wYXlsb2FkID0gZHJ2X2V2dC0+cGF5bG9hZDsKLQkJbGlzdF9hZGRfdGFpbCgmZHJ2X2V2dC0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQl9IGVsc2UKLQkJcmMgPSAtMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFyYyAmJiBjb3B5X3RvX3VzZXIoYXJnLCAmdXNyX2V2dCwgc2l6ZW9mKHVzcl9ldnQpKSkKLQkJcmMgPSAtRUZBVUxUOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2VuYWJsZV9lcShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCWlmIChhdWRpby0+ZXFfZW5hYmxlID09IGVuYWJsZSAmJiAhYXVkaW8tPmVxX25lZWRzX2NvbW1pdCkKLQkJcmV0dXJuIDA7Ci0KLQlhdWRpby0+ZXFfZW5hYmxlID0gZW5hYmxlOwotCi0JaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCWF1ZHBwX2RzcF9zZXRfZXEoYXVkaW8tPmRlY19pZCwgZW5hYmxlLCAmYXVkaW8tPmVxLCBQT1BQKTsKLQkJYXVkaW8tPmVxX25lZWRzX2NvbW1pdCA9IDA7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2dldF9hdnN5bmNfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQkJCQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyAqc3RhdHMpCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlmIChhdWRpby0+ZGVjX2lkID09IGF1ZGlvLT5hdnN5bmNbMF0gJiYgYXVkaW8tPmF2c3luY19mbGFnKSB7Ci0JCS8qIGF2X3N5bmMgc2FtcGxlIGNvdW50ICovCi0JCXN0YXRzLT5zYW1wbGVfY291bnQgPSAoYXVkaW8tPmF2c3luY1syXSA8PCAxNikgfAotCQkJCQkJKGF1ZGlvLT5hdnN5bmNbM10pOwotCi0JCS8qIGF2X3N5bmMgYnl0ZV9jb3VudCAqLwotCQlzdGF0cy0+Ynl0ZV9jb3VudCA9IChhdWRpby0+YXZzeW5jWzVdIDw8IDE2KSB8Ci0JCQkJCQkoYXVkaW8tPmF2c3luY1s2XSk7Ci0KLQkJYXVkaW8tPmF2c3luY19mbGFnID0gMDsKLQkJcmMgPSAwOwotCX0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIHJjOwotCi19Ci0KLXN0YXRpYyBsb25nIGF1ZHFjZWxwX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0JdWludDE2X3QgZW5hYmxlX21hc2s7Ci0JaW50IGVuYWJsZTsKLQlpbnQgcHJldl9zdGF0ZTsKLQotCU1NX0RCRygiY21kID0gJWRcbiIsIGNtZCk7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCi0JCWF1ZGlvLT5hdnN5bmNfZmxhZyA9IDA7Ci0JCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdGF0cykpOwotCQlpZiAoYXVkcHBfcXVlcnlfYXZzeW5jKGF1ZGlvLT5kZWNfaWQpIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT5hdnN5bmNfd2FpdCwKLQkJCQkoYXVkaW8tPmF2c3luY19mbGFnID09IDEpLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoQVVEUFBfQVZTWU5DX0VWRU5UX1RJTUVPVVQpKTsKLQotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQllbHNlIGlmICgocmMgPiAwKSB8fCAoKHJjID09IDApICYmIChhdWRpby0+YXZzeW5jX2ZsYWcgPT0gMSkpKSB7Ci0JCQlpZiAoYXVkaW9fZ2V0X2F2c3luY19kYXRhKGF1ZGlvLCAmc3RhdHMpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fRU5BQkxFX0FVRFBQOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmVuYWJsZV9tYXNrLCAodm9pZCAqKSBhcmcsCi0JCQkJCQlzaXplb2YoZW5hYmxlX21hc2spKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWVuYWJsZSA9IChlbmFibGVfbWFzayAmIEVRX0VOQUJMRSkgPyAxIDogMDsKLQkJYXVkaW9fZW5hYmxlX2VxKGF1ZGlvLCBlbmFibGUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9WT0xVTUU6Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gYXJnOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuLAotCQkJCQlQT1BQKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX1NFVF9QQU46Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPnZvbF9wYW4ucGFuID0gYXJnOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuLAotCQkJCQlQT1BQKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRElPX1NFVF9FUToKLQkJcHJldl9zdGF0ZSA9IGF1ZGlvLT5lcV9lbmFibGU7Ci0JCWF1ZGlvLT5lcV9lbmFibGUgPSAwOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmF1ZGlvLT5lcS5udW1fYmFuZHMsICh2b2lkICopIGFyZywKLQkJCQlzaXplb2YoYXVkaW8tPmVxKSAtCi0JCQkJKEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNU19DT01NT05fTEVOICsgMikpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlhdWRpby0+ZXFfZW5hYmxlID0gcHJldl9zdGF0ZTsKLQkJYXVkaW8tPmVxX25lZWRzX2NvbW1pdCA9IDE7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKC1FSU5WQUwgIT0gcmMpCi0JCXJldHVybiByYzsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX0VWRU5UKSB7Ci0JCU1NX0RCRygiQVVESU9fR0VUX0VWRU5UXG4iKTsKLQkJaWYgKG11dGV4X3RyeWxvY2soJmF1ZGlvLT5nZXRfZXZlbnRfbG9jaykpIHsKLQkJCXJjID0gYXVkcWNlbHBfcHJvY2Vzc19ldmVudF9yZXEoYXVkaW8sCi0JCQkJCSh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCQl9IGVsc2UKLQkJCXJjID0gLUVCVVNZOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKGNtZCA9PSBBVURJT19BQk9SVF9HRVRfRVZFTlQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCQlNTV9EQkcoIkFVRElPX1NUQVJUXG4iKTsKLQkJcmMgPSBhdWRxY2VscF9lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUsCi0JCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0RFQ09ERVJfV0FJVF9NUykpOwotCQkJTU1fSU5GTygiZGVjX3N0YXRlICVkIHJjID0gJWRcbiIsIGF1ZGlvLT5kZWNfc3RhdGUsIHJjKTsKLQotCQkJaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1MpCi0JCQkJcmMgPSAtRU5PREVWOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NUT1A6Ci0JCU1NX0RCRygiQVVESU9fU1RPUFxuIik7Ci0JCXJjID0gYXVkcWNlbHBfZGlzYWJsZShhdWRpbyk7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMTsKLQkJYXVkcWNlbHBfaW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQljYXNlIEFVRElPX0ZMVVNIOgotCQlNTV9EQkcoIkFVRElPX0ZMVVNIXG4iKTsKLQkJYXVkaW8tPnJmbHVzaCA9IDE7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAxOwotCQlhdWRxY2VscF9pb3BvcnRfcmVzZXQoYXVkaW8pOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpIHsKLQkJCWF1ZHBwX2ZsdXNoKGF1ZGlvLT5kZWNfaWQpOwotCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJIWF1ZGlvLT53Zmx1c2gpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCU1NX0VSUigiQVVESU9fRkxVU0ggaW50ZXJydXB0ZWRcbiIpOwotCQkJCXJjID0gLUVJTlRSOwotCQkJfQotCQl9IGVsc2UgewotCQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb25maWcsICh2b2lkICopYXJnLAotCQkJCXNpemVvZihjb25maWcpKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWF1ZGlvLT5tZmllbGQgPSBjb25maWcubWV0YV9maWVsZDsKLQkJCU1NX0RCRygiQVVESU9fU0VUX0NPTkZJRyBhcHBsaWNhYmxlIFwKLQkJCQlmb3IgbWV0YWZpZWxkIGNvbmZpZ3VyYXRpb25cbiIpOwotCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gQlVGU1o7Ci0JCQljb25maWcuYnVmZmVyX2NvdW50ID0gQlVGX0NPVU5UOwotCQkJY29uZmlnLnNhbXBsZV9yYXRlID0gODAwMDsKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gMTsKLQkJCWNvbmZpZy5tZXRhX2ZpZWxkID0gMDsKLQkJCWNvbmZpZy51bnVzZWRbMF0gPSAwOwotCQkJY29uZmlnLnVudXNlZFsxXSA9IDA7Ci0JCQljb25maWcudW51c2VkWzJdID0gMDsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjb25maWcsCi0JCQkJCSBzaXplb2YoY29uZmlnKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX0dFVF9QQ01fQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fcGNtX2NvbmZpZyBjb25maWc7Ci0KLQkJCWNvbmZpZy5wY21fZmVlZGJhY2sgPSBhdWRpby0+cGNtX2ZlZWRiYWNrOwotCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfTUFYX0NPVU5UOwotCQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjb25maWcsCi0JCQkJc2l6ZW9mKGNvbmZpZykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fU0VUX1BDTV9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19wY21fY29uZmlnIGNvbmZpZzsKLQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb25maWcsICh2b2lkICopYXJnLAotCQkJCXNpemVvZihjb25maWcpKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjb25maWcucGNtX2ZlZWRiYWNrICE9IGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJCQlNTV9FUlIoIk5vdCBzdWZmaWNpZW50IHBlcm1pc3Npb24gdG8iCi0JCQkJCSAiY2hhbmdlIHRoZSBwbGF5YmFjayBtb2RlXG4iKTsKLQkJCQlyYyA9IC1FQUNDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoKGNvbmZpZy5idWZmZXJfY291bnQgPiBQQ01fQlVGX01BWF9DT1VOVCkgfHwKLQkJCQkoY29uZmlnLmJ1ZmZlcl9jb3VudCA9PSAxKSkKLQkJCQljb25maWcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9NQVhfQ09VTlQ7Ci0KLQkJCWlmIChjb25maWcuYnVmZmVyX3NpemUgPCBQQ01fQlVGU1pfTUlOKQotCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47Ci0KLQkJCS8qIENoZWNrIGlmIHBjbSBmZWVkYmFjayBpcyByZXF1aXJlZCAqLwotCQkJaWYgKChjb25maWcucGNtX2ZlZWRiYWNrKSAmJiAoIWF1ZGlvLT5yZWFkX2RhdGEpKSB7Ci0JCQkJTU1fREJHKCJhbGxvY2F0ZSBQQ00gYnVmICVkXG4iLAotCQkJCWNvbmZpZy5idWZmZXJfY291bnQgKiBjb25maWcuYnVmZmVyX3NpemUpOwotCQkJCWF1ZGlvLT5yZWFkX3BoeXMgPQotCQkJCQkJYWxsb2NhdGVfY29udGlndW91c19lYmlfbm9tYXAoCi0JCQkJCQkJY29uZmlnLmJ1ZmZlcl9zaXplICoKLQkJCQkJCQljb25maWcuYnVmZmVyX2NvdW50LAotCQkJCQkJCVNaXzRLKTsKLQkJCQlpZiAoIWF1ZGlvLT5yZWFkX3BoeXMpIHsKLQkJCQkJcmMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYXVkaW8tPm1hcF92X3JlYWQgPSBpb3JlbWFwKAotCQkJCQkJCWF1ZGlvLT5yZWFkX3BoeXMsCi0JCQkJCQkJY29uZmlnLmJ1ZmZlcl9zaXplICoKLQkJCQkJCQljb25maWcuYnVmZmVyX2NvdW50KTsKLQkJCQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl9yZWFkKSkgewotCQkJCQlNTV9FUlIoImZhaWxlZCB0byBtYXAgcmVhZCBidWZcbiIpOwotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoCi0JCQkJCQkJYXVkaW8tPnJlYWRfcGh5cyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdWludDhfdCBpbmRleDsKLQkJCQkJdWludDMyX3Qgb2Zmc2V0ID0gMDsKLQkJCQkJYXVkaW8tPnJlYWRfZGF0YSA9Ci0JCQkJCQlhdWRpby0+bWFwX3ZfcmVhZDsKLQkJCQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQkJCQkJYXVkaW8tPnBjbV9idWZfY291bnQgPQotCQkJCQkJY29uZmlnLmJ1ZmZlcl9jb3VudDsKLQkJCQkJYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JCQkJCWF1ZGlvLT5maWxsX25leHQgPSAwOwotCi0JCQkJCWZvciAoaW5kZXggPSAwOwotCQkJCQlpbmRleCA8IGNvbmZpZy5idWZmZXJfY291bnQ7IGluZGV4KyspIHsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0uZGF0YSA9Ci0JCQkJCQlhdWRpby0+cmVhZF9kYXRhICsgb2Zmc2V0OwotCQkJCQkJYXVkaW8tPmluW2luZGV4XS5hZGRyID0KLQkJCQkJCWF1ZGlvLT5yZWFkX3BoeXMgKyBvZmZzZXQ7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLnNpemUgPQotCQkJCQkJY29uZmlnLmJ1ZmZlcl9zaXplOwotCQkJCQkJYXVkaW8tPmluW2luZGV4XS51c2VkID0gMDsKLQkJCQkJCW9mZnNldCArPSBjb25maWcuYnVmZmVyX3NpemU7Ci0JCQkJCX0KLQkJCQkJTU1fREJHKCJyZWFkIGJ1ZjogcGh5IGFkZHIgMHglMDh4IFwKLQkJCQkJCWtlcm5lbCBhZGRyIDB4JTA4eFxuIiwKLQkJCQkJCWF1ZGlvLT5yZWFkX3BoeXMsCi0JCQkJCQkoaW50KWF1ZGlvLT5yZWFkX2RhdGEpOwotCQkJCQlyYyA9IDA7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyYyA9IDA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fUEFVU0U6Ci0JCU1NX0RCRygiQVVESU9fUEFVU0UgJWxkXG4iLCBhcmcpOwotCQlyYyA9IGF1ZHBwX3BhdXNlKGF1ZGlvLT5kZWNfaWQsIChpbnQpIGFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fR0VUX1NFU1NJT05fSUQ6Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmYXVkaW8tPmRlY19pZCwKLQkJCQlzaXplb2YodW5zaWduZWQgc2hvcnQpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJZWxzZQotCQkJcmMgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotLyogT25seSB1c2VmdWwgaW4gdHVubmVsLW1vZGUgKi8KLXN0YXRpYyBpbnQgYXVkcWNlbHBfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBwcG9zMSwgbG9mZl90IHBwb3MyLCBpbnQgZGF0YXN5bmMpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoIWF1ZGlvLT5ydW5uaW5nIHx8IGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmVfbm9sb2NrOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoIWF1ZGlvLT5vdXRbMF0udXNlZCAmJgotCQkhYXVkaW8tPm91dFsxXS51c2VkICYmCi0JCWF1ZGlvLT5vdXRfbmVlZGVkKSB8fCBhdWRpby0+d2ZsdXNoKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQllbHNlIGlmIChhdWRpby0+d2ZsdXNoKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogcGNtIGRtYW1pc3MgbWVzc2FnZSBpcyBzZW50IGNvbnRpbm91c2x5Ci0JICogd2hlbiBkZWNvZGVyIGlzIHN0YXJ2ZWQgc28gbm8gcmFjZQotCSAqIGNvbmRpdGlvbiBjb25jZXJuCi0JICovCi0JYXVkaW8tPnRlb3MgPSAwOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCWF1ZGlvLT50ZW9zIHx8IGF1ZGlvLT53Zmx1c2gpOwotCi0JaWYgKGF1ZGlvLT53Zmx1c2gpCi0JCXJjID0gLUVCVVNZOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotZG9uZV9ub2xvY2s6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRxY2VscF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCi0JCQlsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFhdWRpby0+cGNtX2ZlZWRiYWNrKQotCQlyZXR1cm4gMDsgLyogUENNIGZlZWRiYWNrIGlzIG5vdCBlbmFibGVkLiBOb3RoaW5nIHRvIHJlYWQgKi8KLQotCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCU1NX0RCRygiJWRcbiIsIGNvdW50KTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT5yZWFkX3dhaXQsCi0JCQkJKGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkID4gMCkgfHwKLQkJCQkoYXVkaW8tPnN0b3BwZWQpIHx8IChhdWRpby0+cmZsdXNoKSk7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPnJmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChjb3VudCA8IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkKSB7Ci0JCQkvKiBSZWFkIG11c3QgaGFwcGVuIGluIGZyYW1lIGJvdW5kYXJ5LiBTaW5jZSBkcml2ZXIgZG9lcwotCQkJbm90IGtub3cgZnJhbWUgc2l6ZSwgcmVhZCBjb3VudCBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwKLQkJCXRvIHNpemUgb2YgUENNIHNhbXBsZXMgKi8KLQkJCU1NX0RCRygicmVhZCBzdG9wIC0gcGFydGlhbCBmcmFtZVxuIik7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygicmVhZCBmcm9tIGluWyVkXVxuIiwgYXVkaW8tPnJlYWRfbmV4dCk7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLAotCQkJCWF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS5kYXRhLAotCQkJCWF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkKSkgewotCQkJCU1NX0VSUigiaW52YWxpZCBhZGRyICV4XG4iLCAodW5zaWduZWQgaW50KWJ1Zik7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY291bnQgLT0gYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQ7Ci0JCQlidWYgKz0gYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQ7Ci0JCQlhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCA9IDA7Ci0JCQlpZiAoKCsrYXVkaW8tPnJlYWRfbmV4dCkgPT0gYXVkaW8tPnBjbV9idWZfY291bnQpCi0JCQkJYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JCQlicmVhazsKLQkJCQkvKiBGb3JjZSB0byBleGl0IHdoaWxlIGxvb3AKLQkJCQkgKiB0byBwcmV2ZW50IG91dHB1dCB0aHJlYWQKLQkJCQkgKiBzbGVlcCB0b28gbG9uZyBpZiBkYXRhIGlzCi0JCQkJICogbm90IHJlYWR5IGF0IHRoaXMgbW9tZW50LgotCQkJCSAqLwotCQl9Ci0JfQotCi0JLyogZG9uJ3QgZmVlZCBvdXRwdXQgYnVmZmVyIHRvIEhXIGRlY29kZXIgZHVyaW5nIGZsdXNoaW5nCi0JICogYnVmZmVyIHJlZnJlc2ggY29tbWFuZCB3aWxsIGJlIHNlbnQgb25jZSBmbHVzaCBjb21wbGV0ZXMKLQkgKiBzZW5kIGJ1ZiByZWZyZXNoIGNvbW1hbmQgaGVyZSBjYW4gY29uZnVzZSBIVyBkZWNvZGVyCi0JICovCi0JaWYgKGF1ZGlvLT5idWZfcmVmcmVzaCAmJiAhYXVkaW8tPnJmbHVzaCkgewotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAwOwotCQlNTV9EQkcoImtpY2sgc3RhcnQgcGNtIGZlZWRiYWNrIGFnYWluXG4iKTsKLQkJYXVkcWNlbHBfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCX0KLQotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0KLQlpZiAoYnVmID4gc3RhcnQpCi0JCXJjID0gYnVmIC0gc3RhcnQ7Ci0KLQlNTV9EQkcoInJlYWQgJWQgYnl0ZXNcbiIsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcWNlbHBfcHJvY2Vzc19lb3Moc3RydWN0IGF1ZGlvICphdWRpbywKLQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1Zl9zdGFydCwgdW5zaWduZWQgc2hvcnQgbWZpZWxkX3NpemUpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JaW50IHJjID0gMDsKLQotCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoYXVkaW8tPm91dF9uZWVkZWQgJiYKLQkJYXVkaW8tPm91dFswXS51c2VkID09IDAgJiYKLQkJYXVkaW8tPm91dFsxXS51c2VkID09IDApCi0JCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcihmcmFtZS0+ZGF0YSwgYnVmX3N0YXJ0LCBtZmllbGRfc2l6ZSkpIHsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZnJhbWUtPm1maWVsZF9zeiA9IG1maWVsZF9zaXplOwotCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCWZyYW1lLT51c2VkID0gbWZpZWxkX3NpemU7Ci0JYXVkcWNlbHBfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZHFjZWxwX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQlzaXplX3QgeGZlcjsKLQljaGFyICpjcHlfcHRyOwotCWludCByYyA9IDAsIGVvc19jb25kaXRpb24gPSBBVURRQ0VMUF9FT1NfTk9ORTsKLQl1bnNpZ25lZCBzaG9ydCBtZmllbGRfc2l6ZSA9IDA7Ci0KLQlNTV9EQkcoImNudD0lZFxuIiwgY291bnQpOwotCi0JaWYgKGNvdW50ICYgMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0JCWNweV9wdHIgPSBmcmFtZS0+ZGF0YTsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQkJCSAgICAgIChmcmFtZS0+dXNlZCA9PSAwKQotCQkJCQkJfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQkJCQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQkJTU1fREJHKCJidWZmZXIgYXZhaWxhYmxlXG4iKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChhdWRpby0+bWZpZWxkKSB7Ci0JCQlpZiAoYnVmID09IHN0YXJ0KSB7Ci0JCQkJLyogUHJvY2Vzc2luZyBiZWdpbm5pbmcgb2YgdXNlciBidWZmZXIgKi8KLQkJCQlpZiAoX19nZXRfdXNlcihtZmllbGRfc2l6ZSwKLQkJCQkJKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSBidWYpKSB7Ci0JCQkJCXJjID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIAlpZiAobWZpZWxkX3NpemUgPiBjb3VudCkgewotCQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlNTV9EQkcoIm1mIG9mZnNldF92YWwgJXhcbiIsIG1maWVsZF9zaXplKTsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCBtZmllbGRfc2l6ZSkpIHsKLQkJCQkJcmMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyogQ2hlY2sgaWYgRU9TIGZsYWcgaXMgc2V0IGFuZCBidWZmZXIgaGFzCi0JCQkJICogY29udGFpbnMganVzdCBtZXRhIGZpZWxkCi0JCQkJICovCi0JCQkJaWYgKGNweV9wdHJbQVVEUUNFTFBfRU9TX0ZMR19PRkZTRVRdICYKLQkJCQkJCUFVRFFDRUxQX0VPU19GTEdfTUFTSykgewotCQkJCQlNTV9EQkcoIkVPUyBTRVRcbiIpOwotCQkJCQllb3NfY29uZGl0aW9uID0gQVVEUUNFTFBfRU9TX1NFVDsKLQkJCQkJaWYgKG1maWVsZF9zaXplID09IGNvdW50KSB7Ci0JCQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlCi0JCQkJCWNweV9wdHJbQVVEUUNFTFBfRU9TX0ZMR19PRkZTRVRdICY9Ci0JCQkJCQl+QVVEUUNFTFBfRU9TX0ZMR19NQVNLOwotCQkJCX0KLQkJCQljcHlfcHRyICs9IG1maWVsZF9zaXplOwotCQkJCWNvdW50IC09IG1maWVsZF9zaXplOwotCQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWZpZWxkX3NpemUgPSAwOwotCQkJCU1NX0RCRygiY29udGludW91cyBidWZmZXJcbiIpOwotCQkJfQotCQkJZnJhbWUtPm1maWVsZF9zeiA9IG1maWVsZF9zaXplOwotCQl9Ci0KLQkJeGZlciA9IChjb3VudCA+IChmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSkgPwotCQkJKGZyYW1lLT5zaXplIC0gbWZpZWxkX3NpemUpIDogY291bnQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIHhmZXIpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWZyYW1lLT51c2VkID0geGZlciArIG1maWVsZF9zaXplOwotCQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQkJY291bnQgLT0geGZlcjsKLQkJYnVmICs9IHhmZXI7Ci0JCWF1ZHFjZWxwX3NlbmRfZGF0YShhdWRpbywgMCk7Ci0JfQotCWlmIChlb3NfY29uZGl0aW9uID09IEFVRFFDRUxQX0VPU19TRVQpCi0JCXJjID0gYXVkcWNlbHBfcHJvY2Vzc19lb3MoYXVkaW8sIHN0YXJ0LCBtZmllbGRfc2l6ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JaWYgKCFyYykgewotCQlpZiAoYnVmID4gc3RhcnQpCi0JCQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRxY2VscF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlNTV9JTkZPKCJhdWRpbyBpbnN0YW5jZSAweCUwOHggZnJlZWluZ1xuIiwgKGludCkgYXVkaW8pOwotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRkZXZfdW5yZWdpc3Rlcl9ldnRfbGlzdG5lcihBVURERVZfQ0xOVF9ERUMsIGF1ZGlvLT5kZWNfaWQpOwotCWF1ZHFjZWxwX2Rpc2FibGUoYXVkaW8pOwotCWF1ZHFjZWxwX2ZsdXNoKGF1ZGlvKTsKLQlhdWRxY2VscF9mbHVzaF9wY21fYnVmKGF1ZGlvKTsKLQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHBsYXkpOwotCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCXVucmVnaXN0ZXJfZWFybHlfc3VzcGVuZCgmYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUpOwotI2VuZGlmCi0JYXVkaW8tPm9wZW5lZCA9IDA7Ci0JYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0JYXVkcWNlbHBfcmVzZXRfZXZlbnRfcXVldWUoYXVkaW8pOwotCWlvdW5tYXAoYXVkaW8tPm1hcF92X3dyaXRlKTsKLQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKGF1ZGlvLT5waHlzKTsKLQlpZiAoYXVkaW8tPnJlYWRfZGF0YSkgewotCQlpb3VubWFwKGF1ZGlvLT5tYXBfdl9yZWFkKTsKLQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcihhdWRpby0+cmVhZF9waHlzKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JaWYgKGF1ZGlvLT5kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKGF1ZGlvLT5kZW50cnkpOwotI2VuZGlmCi0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX3Bvc3RfZXZlbnQoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHR5cGUsCi0JCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQpCi17Ci0Jc3RydWN0IGF1ZHFjZWxwX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpKSB7Ci0JCWVfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWRxY2VscF9ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZlX25vZGUtPmxpc3QpOwotCX0gZWxzZSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRxY2VscF9ldmVudCksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWVfbm9kZSkgewotCQkJTU1fRVJSKCJObyBtZW0gdG8gcG9zdCBldmVudCAlZFxuIiwgdHlwZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQllX25vZGUtPmV2ZW50X3R5cGUgPSB0eXBlOwotCWVfbm9kZS0+cGF5bG9hZCA9IHBheWxvYWQ7Ci0KLQlsaXN0X2FkZF90YWlsKCZlX25vZGUtPmxpc3QsICZhdWRpby0+ZXZlbnRfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRxY2VscF9zdXNwZW5kKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRxY2VscF9zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWRxY2VscF9zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkcWNlbHBfcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9TVVNQRU5ELCBwYXlsb2FkKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcWNlbHBfcmVzdW1lKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWRxY2VscF9zdXNwZW5kX2N0bCAqY3RsID0KLQkJY29udGFpbmVyX29mKGgsIHN0cnVjdCBhdWRxY2VscF9zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkcWNlbHBfcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9SRVNVTUUsIHBheWxvYWQpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBzc2l6ZV90IGF1ZHFjZWxwX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgYXVkcWNlbHBfZGVidWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY29uc3QgaW50IGRlYnVnX2J1Zm1heCA9IDEwMjQ7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyWzEwMjRdOwotCWludCBuID0gMCwgaTsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCW4gPSBzY25wcmludGYoYnVmZmVyLCBkZWJ1Z19idWZtYXgsICJvcGVuZWQgJWRcbiIsIGF1ZGlvLT5vcGVuZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiZW5hYmxlZCAlZFxuIiwgYXVkaW8tPmVuYWJsZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkic3RvcHBlZCAlZFxuIiwgYXVkaW8tPnN0b3BwZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicGNtX2ZlZWRiYWNrICVkXG4iLCBhdWRpby0+cGNtX2ZlZWRiYWNrKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJIm91dF9idWZfc3ogJWRcbiIsIGF1ZGlvLT5vdXRbMF0uc2l6ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJwY21fYnVmX2NvdW50ICVkIFxuIiwgYXVkaW8tPnBjbV9idWZfY291bnQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicGNtX2J1Zl9zeiAlZCBcbiIsIGF1ZGlvLT5pblswXS5zaXplKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInZvbHVtZSAleCBcbiIsIGF1ZGlvLT52b2xfcGFuLnZvbHVtZSk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JLyogRm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgb25seSB1c2VmdWwgZm9yIGRlYnVnZ2luZyB3aGVuCi0JICogd2hlbiBwbGF5YmFjayBoYWx0cyB1bmV4cGVjdGVkbHkuIFRodXMsIG5vIG11dHVhbCBleGNsdXNpb24KLQkgKiBlbmZvcmNlZAotCSAqLwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkid2ZsdXNoICVkXG4iLCBhdWRpby0+d2ZsdXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJInJmbHVzaCAlZFxuIiwgYXVkaW8tPnJmbHVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJydW5uaW5nICVkIFxuIiwgYXVkaW8tPnJ1bm5pbmcpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiZGVjIHN0YXRlICVkIFxuIiwgYXVkaW8tPmRlY19zdGF0ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJvdXRfbmVlZGVkICVkIFxuIiwgYXVkaW8tPm91dF9uZWVkZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X2hlYWQgJWQgXG4iLCBhdWRpby0+b3V0X2hlYWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0X3RhaWwgJWQgXG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0WzBdLnVzZWQgJWQgXG4iLCBhdWRpby0+b3V0WzBdLnVzZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkib3V0WzFdLnVzZWQgJWQgXG4iLCBhdWRpby0+b3V0WzFdLnVzZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiYnVmZmVyX3JlZnJlc2ggJWQgXG4iLCBhdWRpby0+YnVmX3JlZnJlc2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkicmVhZF9uZXh0ICVkIFxuIiwgYXVkaW8tPnJlYWRfbmV4dCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJmaWxsX25leHQgJWQgXG4iLCBhdWRpby0+ZmlsbF9uZXh0KTsKLQlmb3IgKGkgPSAwOyBpIDwgYXVkaW8tPnBjbV9idWZfY291bnQ7IGkrKykKLQkJbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkiaW5bJWRdLnNpemUgJWQgXG4iLCBpLCBhdWRpby0+aW5baV0udXNlZCk7Ci0JYnVmZmVyW25dID0gMDsKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkcWNlbHBfZGVidWdfZm9wcyA9IHsKLQkucmVhZCA9IGF1ZHFjZWxwX2RlYnVnX3JlYWQsCi0JLm9wZW4gPSBhdWRxY2VscF9kZWJ1Z19vcGVuLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGF1ZHFjZWxwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IE5VTEw7Ci0JaW50IHJjLCBkZWNfYXR0cmIsIGRlY2lkLCBpOwotCXN0cnVjdCBhdWRxY2VscF9ldmVudCAqZV9ub2RlID0gTlVMTDsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9xY2VscF8iICsgNV07Ci0jZW5kaWYKLQotCS8qIENyZWF0ZSBhdWRpbyBpbnN0YW5jZSwgc2V0IHRvIHplcm8gKi8KLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpbyksIEdGUF9LRVJORUwpOwotCWlmICghYXVkaW8pIHsKLQkJTU1fRVJSKCJubyBtZW1vcnkgdG8gYWxsb2NhdGUgYXVkaW8gaW5zdGFuY2VcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JTU1fSU5GTygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGNyZWF0ZWRcbiIsIChpbnQpYXVkaW8pOwotCi0JLyogQWxsb2NhdGUgdGhlIGRlY29kZXIgKi8KLQlkZWNfYXR0cmIgPSBBVURERUNfREVDX1FDRUxQOwotCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9OT05UVU5ORUw7Ci0JCWF1ZGlvLT5wY21fZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREVfUExBWUJBQ0s7Ci0JfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWRlY19hdHRyYiB8PSBNU01fQVVEX01PREVfVFVOTkVMOwotCQlhdWRpby0+cGNtX2ZlZWRiYWNrID0gVFVOTkVMX01PREVfUExBWUJBQ0s7Ci0JfSBlbHNlIHsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JZGVjaWQgPSBhdWRwcF9hZGVjX2FsbG9jKGRlY19hdHRyYiwgJmF1ZGlvLT5tb2R1bGVfbmFtZSwKLQkJCSZhdWRpby0+cXVldWVfaWQpOwotCWlmIChkZWNpZCA8IDApIHsKLQkJTU1fRVJSKCJObyBmcmVlIGRlY29kZXIgYXZhaWxhYmxlLCBmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQkoaW50KWF1ZGlvKTsKLQkJcmMgPSAtRU5PREVWOwotCQlrZnJlZShhdWRpbyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYXVkaW8tPmRlY19pZCA9IGRlY2lkICYgTVNNX0FVRF9ERUNPREVSX01BU0s7Ci0KLQlhdWRpby0+cGh5cyA9IGFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKERNQVNaLCBTWl80Syk7Ci0JaWYgKCFhdWRpby0+cGh5cykgewotCQlNTV9FUlIoImNvdWxkIG5vdCBhbGxvY2F0ZSB3cml0ZSBidWZmZXJzLCBmcmVlaW5nIGluc3RhbmNlIFwKLQkJCQkweCUwOHhcbiIsIChpbnQpYXVkaW8pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLQkJa2ZyZWUoYXVkaW8pOwotCQlnb3RvIGRvbmU7Ci0JfSBlbHNlIHsKLQkJYXVkaW8tPm1hcF92X3dyaXRlID0gaW9yZW1hcChhdWRpby0+cGh5cywgRE1BU1opOwotCQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl93cml0ZSkpIHsKLQkJCU1NX0VSUigiY291bGQgbm90IG1hcCB3cml0ZSBwaHlzIGFkZHJlc3MsIGZyZWVpbmcgXAotCQkJCQlpbnN0YW5jZSAweCUwOHhcbiIsIChpbnQpYXVkaW8pOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcihhdWRpby0+cGh5cyk7Ci0JCQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0JCQlrZnJlZShhdWRpbyk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJYXVkaW8tPmRhdGEgPSBhdWRpby0+bWFwX3Zfd3JpdGU7Ci0JCU1NX0RCRygid3JpdGUgYnVmOiBwaHkgYWRkciAweCUwOHgga2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQkJCWF1ZGlvLT5waHlzLCAoaW50KWF1ZGlvLT5kYXRhKTsKLQl9Ci0KLQlyYyA9IG1zbV9hZHNwX2dldChhdWRpby0+bW9kdWxlX25hbWUsICZhdWRpby0+YXVkcGxheSwKLQkJJmF1ZHBsYXlfYWRzcF9vcHNfcWNlbHAsIGF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJmYWlsZWQgdG8gZ2V0ICVzIG1vZHVsZSwgZnJlZWluZyBpbnN0YW5jZSAgMHglMDh4XG4iLAotCQkJCWF1ZGlvLT5tb2R1bGVfbmFtZSwgKGludClhdWRpbyk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIEluaXRpYWxpemUgYWxsIGxvY2tzIG9mIGF1ZGlvIGluc3RhbmNlICovCi0JbXV0ZXhfaW5pdCgmYXVkaW8tPmxvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+cmVhZF9sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZHNwX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+cmVhZF93YWl0KTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+ZXZlbnRfcXVldWUpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+YXZzeW5jX3dhaXQpOwotCi0JLyogSW5pdGlhbGl6ZSBidWZmZXIgKi8KLQlhdWRpby0+b3V0WzBdLmRhdGEgPSBhdWRpby0+ZGF0YSArIDA7Ci0JYXVkaW8tPm91dFswXS5hZGRyID0gYXVkaW8tPnBoeXMgKyAwOwotCWF1ZGlvLT5vdXRbMF0uc2l6ZSA9IEJVRlNaOwotCi0JYXVkaW8tPm91dFsxXS5kYXRhID0gYXVkaW8tPmRhdGEgKyBCVUZTWjsKLQlhdWRpby0+b3V0WzFdLmFkZHIgPSBhdWRpby0+cGh5cyArIEJVRlNaOwotCWF1ZGlvLT5vdXRbMV0uc2l6ZSA9IEJVRlNaOwotCi0JYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gMHgyMDAwOwotCi0JYXVkcWNlbHBfZmx1c2goYXVkaW8pOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0JYXVkaW8tPm9wZW5lZCA9IDE7Ci0KLQlhdWRpby0+ZGV2aWNlX2V2ZW50cyA9IEFVRERFVl9FVlRfREVWX1JEWQotCQkJCXxBVURERVZfRVZUX0RFVl9STFN8Ci0JCQkJQVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRzsKLQotCXJjID0gYXVkZGV2X3JlZ2lzdGVyX2V2dF9saXN0bmVyKGF1ZGlvLT5kZXZpY2VfZXZlbnRzLAotCQkJCQlBVURERVZfQ0xOVF9ERUMsCi0JCQkJCWF1ZGlvLT5kZWNfaWQsCi0JCQkJCXFjZWxwX2xpc3RuZXIsCi0JCQkJCSh2b2lkICopYXVkaW8pOwotCWlmIChyYykgewotCQlNTV9FUlIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgbGlzdG5ldFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGV2ZW50X2VycjsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlzbnByaW50ZihuYW1lLCBzaXplb2YgbmFtZSwgIm1zbV9xY2VscF8lMDR4IiwgYXVkaW8tPmRlY19pZCk7Ci0JYXVkaW8tPmRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQlOVUxMLCAodm9pZCAqKSBhdWRpbywgJmF1ZHFjZWxwX2RlYnVnX2ZvcHMpOwotCi0JaWYgKElTX0VSUihhdWRpby0+ZGVudHJ5KSkKLQkJTU1fREJHKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLmxldmVsID0gRUFSTFlfU1VTUEVORF9MRVZFTF9ESVNBQkxFX0ZCOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLnJlc3VtZSA9IGF1ZHFjZWxwX3Jlc3VtZTsKLQlhdWRpby0+c3VzcGVuZF9jdGwubm9kZS5zdXNwZW5kID0gYXVkcWNlbHBfc3VzcGVuZDsKLQlhdWRpby0+c3VzcGVuZF9jdGwuYXVkaW8gPSBhdWRpbzsKLQlyZWdpc3Rlcl9lYXJseV9zdXNwZW5kKCZhdWRpby0+c3VzcGVuZF9jdGwubm9kZSk7Ci0jZW5kaWYKLQlmb3IgKGkgPSAwOyBpIDwgQVVEUUNFTFBfRVZFTlRfTlVNOyBpKyspIHsKLQkJZV9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZHFjZWxwX2V2ZW50KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChlX25vZGUpCi0JCQlsaXN0X2FkZF90YWlsKCZlX25vZGUtPmxpc3QsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JCWVsc2UgewotCQkJTU1fRVJSKCJldmVudCBwa3QgYWxsb2MgZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotZG9uZToKLQlyZXR1cm4gcmM7Ci1ldmVudF9lcnI6Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRwbGF5KTsKLWVycjoKLQlpb3VubWFwKGF1ZGlvLT5tYXBfdl93cml0ZSk7Ci0JZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcihhdWRpby0+cGh5cyk7Ci0JYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX3FjZWxwX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSBhdWRxY2VscF9vcGVuLAotCS5yZWxlYXNlID0gYXVkcWNlbHBfcmVsZWFzZSwKLQkucmVhZCA9IGF1ZHFjZWxwX3JlYWQsCi0JLndyaXRlID0gYXVkcWNlbHBfd3JpdGUsCi0JLnVubG9ja2VkX2lvY3RsID0gYXVkcWNlbHBfaW9jdGwsCi0JLmZzeW5jID0gYXVkcWNlbHBfZnN5bmMsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19xY2VscF9taXNjID0gewotCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZSA9ICJtc21fcWNlbHAiLAotCS5mb3BzID0gJmF1ZGlvX3FjZWxwX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRxY2VscF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX3FjZWxwX21pc2MpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXVkcWNlbHBfZXhpdCh2b2lkKQotewotCW1pc2NfZGVyZWdpc3RlcigmYXVkaW9fcWNlbHBfbWlzYyk7Ci19Ci0KLW1vZHVsZV9pbml0KGF1ZHFjZWxwX2luaXQpOwotbW9kdWxlX2V4aXQoYXVkcWNlbHBfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIFFDRUxQIDEzSyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fcWNlbHBfaW4uYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fcWNlbHBfaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhNjcyNi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX3FjZWxwX2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkxICswLDAgQEAKLS8qCi0gKiBxY2VscCBhdWRpbyBpbnB1dCBkZXZpY2UKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fcWNwLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9hbGxvYy5oPgotCi0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXUuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11X2RvbWFpbnMuaD4KLSNpbmNsdWRlIDxtYWNoL3NvY2luZm8uaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRyZWNjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcmVjbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZHByZXByb2MuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9tZW10eXBlcy5oPgotCi0jZGVmaW5lIE1FVEFfT1VUX1NJWkUJMjQKLS8qIEZSQU1FX05VTSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvICovCi0jZGVmaW5lIEZSQU1FX05VTQk4Ci0jZGVmaW5lIFFDRUxQX0ZSQU1FX1NJWkUJMzYgLyogMzYgYnl0ZXMgZGF0YSAqLwotI2RlZmluZSBGUkFNRV9TSVpFCSgyMiAqIDIpIC8qIDM2IGJ5dGVzIGRhdGEgKi8KLSAvKiAzNiBieXRlcyBkYXRhICArIDI0IG1ldGEgZmllbGQqLwotI2RlZmluZSBOVF9GUkFNRV9TSVpFCShRQ0VMUF9GUkFNRV9TSVpFICsgTUVUQV9PVVRfU0laRSkKLSNkZWZpbmUgRE1BU1oJCShOVF9GUkFNRV9TSVpFICogRlJBTUVfTlVNKQotI2RlZmluZSBPVVRfRlJBTUVfTlVNCSgyKQotI2RlZmluZSBPVVRfQlVGRkVSX1NJWkUgKDQgKiAxMDI0ICsgTUVUQV9PVVRfU0laRSkKLSNkZWZpbmUgQlVGRkVSX1NJWkUJKE9VVF9CVUZGRVJfU0laRSAqIE9VVF9GUkFNRV9OVU0pCi0KLQotI2RlZmluZSBBVURQUkVQUk9DX1FDRUxQX0VPU19GTEdfT0ZGU0VUIDB4MEEKLSNkZWZpbmUgQVVEUFJFUFJPQ19RQ0VMUF9FT1NfRkxHX01BU0sgMHgwMQotI2RlZmluZSBBVURQUkVQUk9DX1FDRUxQX0VPU19OT05FIDB4MCAvKiBObyBFT1MgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgQVVEUFJFUFJPQ19RQ0VMUF9FT1NfU0VUIDB4MSAvKiBFT1Mgc2V0IGluIG1ldGEgZmllbGQgKi8KLQotc3RydWN0IGJ1ZmZlciB7Ci0Jdm9pZCAqZGF0YTsKLQl1aW50MzJfdCBzaXplOwotCXVpbnQzMl90IHJlYWQ7Ci0JdWludDMyX3QgYWRkcjsKLQl1aW50MzJfdCB1c2VkOwotCXVpbnQzMl90IG1maWVsZF9zejsKLX07Ci0KLXN0cnVjdCBhdWRpb19pbiB7Ci0Jc3RydWN0IGJ1ZmZlciBpbltGUkFNRV9OVU1dOwotCi0Jc3BpbmxvY2tfdCBkc3BfbG9jazsKLQotCWF0b21pY190IGluX2J5dGVzOwotCWF0b21pY190IGluX3NhbXBsZXM7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggcmVhZF9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9lbmFibGU7Ci0JLyp3cml0ZSBzZWN0aW9uKi8KLQlzdHJ1Y3QgYnVmZmVyIG91dFtPVVRfRlJBTUVfTlVNXTsKLQotCXVpbnQ4X3Qgb3V0X2hlYWQ7Ci0JdWludDhfdCBvdXRfdGFpbDsKLQl1aW50OF90IG91dF9uZWVkZWQ7CS8qIG51bWJlciBvZiBidWZmZXJzIHRoZSBkc3AgaXMgd2FpdGluZyBmb3IgKi8KLQl1aW50MzJfdCBvdXRfY291bnQ7Ci0KLQlzdHJ1Y3QgbXV0ZXggd3JpdGVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3cml0ZV93YWl0OwotCWludDMyX3Qgb3V0X3BoeXM7IC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygd3JpdGUgYnVmZmVyICovCi0JY2hhciAqb3V0X2RhdGE7Ci0JaW50IG1maWVsZDsgLyogbWV0YSBmaWVsZCBlbWJlZGRlZCBpbiBkYXRhICovCi0JaW50IHdmbHVzaDsgLyp3cml0ZSBmbHVzaCAqLwotCWludCByZmx1c2g7IC8qcmVhZCBmbHVzaCovCi0JaW50IG91dF9mcmFtZV9jbnQ7Ci0KLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICphdWRyZWM7Ci0KLQlzdHJ1Y3QgYXVkcmVjX3Nlc3Npb25faW5mbyBzZXNzaW9uX2luZm87IC8qYXVkcmVjIHNlc3Npb24gaW5mbyovCi0KLQkvKiBjb25maWd1cmF0aW9uIHRvIHVzZSBvbiBuZXh0IGVuYWJsZSAqLwotCXVpbnQzMl90IGJ1ZmZlcl9zaXplOyAvKiBGcmFtZSBzaXplICgzNiBieXRlcykgKi8KLQl1aW50MzJfdCBzYW1wX3JhdGU7Ci0JdWludDMyX3QgY2hhbm5lbF9tb2RlOwotCXVpbnQzMl90IGVuY190eXBlOwotCi0Jc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnIGNmZzsKLQl1aW50MzJfdCByZWNfbW9kZTsKLQotCXVpbnQzMl90IGRzcF9jbnQ7Ci0JdWludDMyX3QgaW5faGVhZDsgLyogbmV4dCBidWZmZXIgZHNwIHdpbGwgd3JpdGUgKi8KLQl1aW50MzJfdCBpbl90YWlsOyAvKiBuZXh0IGJ1ZmZlciByZWFkKCkgd2lsbCByZWFkICovCi0JdWludDMyX3QgaW5fY291bnQ7IC8qIG51bWJlciBvZiBidWZmZXJzIGF2YWlsYWJsZSB0byByZWFkKCkgKi8KLQl1aW50MzJfdCBtb2RlOwotCXVpbnQzMl90IGVvc19hY2s7Ci0JdWludDMyX3QgZmx1c2hfYWNrOwotCi0JY29uc3QgY2hhciAqbW9kdWxlX25hbWU7Ci0JdW5zaWduZWQgcXVldWVfaWRzOwotCXVpbnQxNl90IGVuY19pZDsKLQotCXVpbnQxNl90IHNvdXJjZTsgLyogRW5jb2Rpbmcgc291cmNlIGJpdCBtYXNrICovCi0JdWludDMyX3QgZGV2aWNlX2V2ZW50czsKLQl1aW50MzJfdCBpbl9jYWxsOwotCXVpbnQzMl90IGRldl9jbnQ7Ci0JaW50IHZvaWNlX3N0YXRlOwotCXNwaW5sb2NrX3QgZGV2X2xvY2s7Ci0KLQkvKiBkYXRhIGFsbG9jYXRlZCBmb3IgdmFyaW91cyBidWZmZXJzICovCi0JY2hhciAqZGF0YTsKLQlkbWFfYWRkcl90IHBoeXM7Ci0Jdm9pZCAqbWFwX3ZfcmVhZDsKLQl2b2lkICptYXBfdl93cml0ZTsKLQotCWludCBvcGVuZWQ7Ci0JaW50IGVuYWJsZWQ7Ci0JaW50IHJ1bm5pbmc7Ci0JaW50IHN0b3BwZWQ7IC8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQljaGFyICpidWlsZF9pZDsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBpb25faGFuZGxlICppbnB1dF9idWZmX2hhbmRsZTsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqb3V0cHV0X2J1ZmZfaGFuZGxlOwotfTsKLQotc3RydWN0IGF1ZGlvX2ZyYW1lIHsKLQl1aW50MTZfdCBmcmFtZV9jb3VudF9sc3c7Ci0JdWludDE2X3QgZnJhbWVfY291bnRfbXN3OwotCXVpbnQxNl90IGZyYW1lX2xlbmd0aDsKLQl1aW50MTZfdCBlcmFzZWRfcGNtOwotCXVuc2lnbmVkIGNoYXIgcmF3X2JpdHN0cmVhbVtdOyAvKiBzYW1wbGVzICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgYXVkaW9fZnJhbWVfbnQgewotCXVpbnQxNl90IG1ldGFkYXRhX2xlbjsKLQl1aW50MTZfdCBmcmFtZV9jb3VudF9sc3c7Ci0JdWludDE2X3QgZnJhbWVfY291bnRfbXN3OwotCXVpbnQxNl90IGZyYW1lX2xlbmd0aDsKLQl1aW50MTZfdCBlcmFzZWRfcGNtOwotCXVpbnQxNl90IHJlc2VydmVkOwotCXVpbnQxNl90IHRpbWVfc3RhbXBfZHdvcmRfbHN3OwotCXVpbnQxNl90IHRpbWVfc3RhbXBfZHdvcmRfbXN3OwotCXVpbnQxNl90IHRpbWVfc3RhbXBfbHN3OwotCXVpbnQxNl90IHRpbWVfc3RhbXBfbXN3OwotCXVpbnQxNl90IG5mbGFnX2xzdzsKLQl1aW50MTZfdCBuZmxhZ19tc3c7Ci0JdW5zaWduZWQgY2hhciByYXdfYml0c3RyZWFtW107IC8qIHNhbXBsZXMgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBxY2VscF9lbmNvZGVkX21ldGFfb3V0IHsKLQl1aW50MTZfdCBtZXRhZGF0YV9sZW47Ci0JdWludDE2X3QgdGltZV9zdGFtcF9kd29yZF9sc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9kd29yZF9tc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9sc3c7Ci0JdWludDE2X3QgdGltZV9zdGFtcF9tc3c7Ci0JdWludDE2X3QgbmZsYWdfbHN3OwotCXVpbnQxNl90IG5mbGFnX21zdzsKLX07Ci0KLS8qIEF1ZHJlYyBRdWV1ZSBjb21tYW5kIHNlbnQgbWFjcm8ncyAqLwotI2RlZmluZSBhdWRyZWNfc2VuZF9iaXRzdHJlYW1xdWV1ZShhdWRpbywgY21kLCBsZW4pIFwKLQltc21fYWRzcF93cml0ZShhdWRpby0+YXVkcmVjLCAoKGF1ZGlvLT5xdWV1ZV9pZHMgJiAweEZGRkYwMDAwKSA+PiAxNiksXAotCQkJY21kLCBsZW4pCi0KLSNkZWZpbmUgYXVkcmVjX3NlbmRfYXVkcmVjcXVldWUoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHJlYywgKGF1ZGlvLT5xdWV1ZV9pZHMgJiAweDAwMDBGRkZGKSxcCi0JCQljbWQsIGxlbikKLQotLyogRFNQIGNvbW1hbmQgc2VuZCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgYXVkcWNlbHBfaW5fZW5jX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLCBpbnQgZW5hYmxlKTsKLXN0YXRpYyBpbnQgYXVkcWNlbHBfaW5fcGFyYW1fY29uZmlnKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pOwotc3RhdGljIGludCBhdWRxY2VscF9pbl9tZW1fY29uZmlnKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pOwotc3RhdGljIGludCBhdWRxY2VscF9pbl9yZWNvcmRfY29uZmlnKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8sIGludCBlbmFibGUpOwotc3RhdGljIGludCBhdWRxY2VscF9kc3BfcmVhZF9idWZmZXIoc3RydWN0IGF1ZGlvX2luICphdWRpbywgdWludDMyX3QgcmVhZF9jbnQpOwotCi1zdGF0aWMgdm9pZCBhdWRxY2VscF9pbl9nZXRfZHNwX2ZyYW1lcyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLXN0YXRpYyBpbnQgYXVkcGNtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX291dF9mbHVzaChzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLXN0YXRpYyBpbnQgYXVkcHJlcHJvY19jbWRfY2ZnX3JvdXRpbmdfbW9kZShzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZHByZXByb2NfcGNtX3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpOwotc3RhdGljIHZvaWQgYXVkcWNlbHBfbnRfaW5fZ2V0X2RzcF9mcmFtZXMoc3RydWN0IGF1ZGlvX2luICphdWRpbyk7Ci0KLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX2luX2ZsdXNoKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pOwotCi1zdGF0aWMgdm9pZCBxY2VscF9pbl9saXN0ZW5lcih1MzIgZXZ0X2lkLCB1bmlvbiBhdWRkZXZfZXZ0X2RhdGEgKmV2dF9wYXlsb2FkLAotCQkJCXZvaWQgKnByaXZhdGVfZGF0YSkKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gKHN0cnVjdCBhdWRpb19pbiAqKSBwcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCU1NX0RCRygiZXZ0X2lkID0gMHglOHhcbiIsIGV2dF9pZCk7Ci0Jc3dpdGNoIChldnRfaWQpIHsKLQljYXNlIEFVRERFVl9FVlRfREVWX1JEWTogewotCQlNTV9EQkcoIkFVRERFVl9FVlRfREVWX1JEWVxuIik7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZGV2X2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPmRldl9jbnQrKzsKLQkJaWYgKCFhdWRpby0+aW5fY2FsbCkKLQkJCWF1ZGlvLT5zb3VyY2UgfD0gKDB4MSA8PCBldnRfcGF5bG9hZC0+cm91dGluZ19pZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCi0JCWlmICgoYXVkaW8tPnJ1bm5pbmcgPT0gMSkgJiYgKGF1ZGlvLT5lbmFibGVkID09IDEpICYmCi0JCQkoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpKQotCQkJYXVkcWNlbHBfaW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMSk7Ci0JfQotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfREVWX1JMUzogewotCQlNTV9EQkcoIkFVRERFVl9FVlRfREVWX1JMU1xuIik7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZGV2X2xvY2ssIGZsYWdzKTsKLQkJYXVkaW8tPmRldl9jbnQtLTsKLQkJaWYgKCFhdWRpby0+aW5fY2FsbCkKLQkJCWF1ZGlvLT5zb3VyY2UgJj0gfigweDEgPDwgZXZ0X3BheWxvYWQtPnJvdXRpbmdfaWQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZGV2X2xvY2ssIGZsYWdzKTsKLQotCQlpZiAoKCFhdWRpby0+cnVubmluZykgfHwgKCFhdWRpby0+ZW5hYmxlZCkpCi0JCQlicmVhazsKLQotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJCS8qIFR1cm4gb2YgYXMgcGVyIHNvdXJjZSAqLwotCQkJaWYgKGF1ZGlvLT5zb3VyY2UpCi0JCQkJYXVkcWNlbHBfaW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMSk7Ci0JCQllbHNlCi0JCQkJLyogVHVybiBvZmYgYWxsICovCi0JCQkJYXVkcWNlbHBfaW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMCk7Ci0JCX0KLQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEc6IHsKLQkJTU1fREJHKCJBVURERVZfRVZUX1ZPSUNFX1NUQVRFX0NIRywgc3RhdGUgPSAlZFxuIiwKLQkJCQlldnRfcGF5bG9hZC0+dm9pY2Vfc3RhdGUpOwotCQlhdWRpby0+dm9pY2Vfc3RhdGUgPSBldnRfcGF5bG9hZC0+dm9pY2Vfc3RhdGU7Ci0JCWlmIChhdWRpby0+aW5fY2FsbCAmJiBhdWRpby0+cnVubmluZyAmJgotCQkgICAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpKSB7Ci0JCQlpZiAoYXVkaW8tPnZvaWNlX3N0YXRlID09IFZPSUNFX1NUQVRFX0lOQ0FMTCkKLQkJCQlhdWRxY2VscF9pbl9yZWNvcmRfY29uZmlnKGF1ZGlvLCAxKTsKLQkJCWVsc2UgaWYgKGF1ZGlvLT52b2ljZV9zdGF0ZSA9PSBWT0lDRV9TVEFURV9PRkZDQUxMKSB7Ci0JCQkJYXVkcWNlbHBfaW5fcmVjb3JkX2NvbmZpZyhhdWRpbywgMCk7Ci0JCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJfQotCQl9Ci0KLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigid3JvbmcgZXZlbnQgJWRcbiIsIGV2dF9pZCk7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkc3AgcHJlcHJvYyBldmVudCBoYW5kbGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgdm9pZCBhdWRwcmVwcm9jX2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgIHZvaWQgKm1zZykKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gZGF0YTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBSRVBST0NfRVJST1JfTVNHOiB7Ci0JCXN0cnVjdCBhdWRwcmVwcm9jX2Vycl9tc2cgKmVycl9tc2cgPSBtc2c7Ci0KLQkJTU1fRVJSKCJFUlJPUl9NU0c6IHN0cmVhbSBpZCAlZCBlcnIgaWR4ICVkXG4iLAotCQllcnJfbXNnLT5zdHJlYW1faWQsIGVycl9tc2ctPmF1ZF9wcmVwcm9jX2Vycl9pZHgpOwotCQkvKiBFcnJvciBjYXNlICovCi0JCXdha2VfdXAoJmF1ZGlvLT53YWl0X2VuYWJsZSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFBSRVBST0NfQ01EX0NGR19ET05FX01TRzogewotCQlNTV9EQkcoIkNNRF9DRkdfRE9ORV9NU0cgXG4iKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFJFUFJPQ19DTURfRU5DX0NGR19ET05FX01TRzogewotCQlzdHJ1Y3QgYXVkcHJlcHJvY19jbWRfZW5jX2NmZ19kb25lX21zZyAqZW5jX2NmZ19tc2cgPSBtc2c7Ci0KLQkJTU1fREJHKCJDTURfRU5DX0NGR19ET05FX01TRzogc3RyZWFtIGlkICVkIGVuYyB0eXBlIFwKLQkJCTB4JTh4XG4iLCBlbmNfY2ZnX21zZy0+c3RyZWFtX2lkLAotCQkJZW5jX2NmZ19tc2ctPnJlY19lbmNfdHlwZSk7Ci0JCS8qIEVuY29kZXIgZW5hYmxlIHN1Y2Nlc3MgKi8KLQkJaWYgKGVuY19jZmdfbXNnLT5yZWNfZW5jX3R5cGUgJiBFTkNPREVfRU5BQkxFKSB7Ci0JCQlpZihhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkgewotCQkJCU1NX0RCRygicm91dGluZyBjb21tYW5kXG4iKTsKLQkJCQlhdWRwcmVwcm9jX2NtZF9jZmdfcm91dGluZ19tb2RlKGF1ZGlvKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXVkcWNlbHBfaW5fcGFyYW1fY29uZmlnKGF1ZGlvKTsKLQkJCX0KLQkJfSBlbHNlIHsgLyogRW5jb2RlciBkaXNhYmxlIHN1Y2Nlc3MgKi8KLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkKLQkJCQlhdWRxY2VscF9pbl9yZWNvcmRfY29uZmlnKGF1ZGlvLCAwKTsKLQkJCWVsc2UKLQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdF9lbmFibGUpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFBSRVBST0NfQ01EX0VOQ19QQVJBTV9DRkdfRE9ORV9NU0c6IHsKLQkJTU1fREJHKCJDTURfRU5DX1BBUkFNX0NGR19ET05FX01TR1xuIik7Ci0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTCkKLQkJCWF1ZHFjZWxwX2luX21lbV9jb25maWcoYXVkaW8pOwotCQllbHNlCi0JCQlhdWRwY21fY29uZmlnKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFJFUFJPQ19DTURfUk9VVElOR19NT0RFX0RPTkVfTVNHOiB7Ci0JCXN0cnVjdCBhdWRwcmVwcm9jX2NtZF9yb3V0aW5nX21vZGVfZG9uZVwKLQkJCQkqcm91dGluZ19jZmdfZG9uZV9tc2cgPSBtc2c7Ci0JCWlmIChyb3V0aW5nX2NmZ19kb25lX21zZy0+Y29uZmlndXJhdGlvbiA9PSAwKSB7Ci0JCQlNTV9JTkZPKCJyb3V0aW5nIGNvbmZpZ3VyYXRpb24gZmFpbGVkXG4iKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJfSBlbHNlCi0JCQlhdWRxY2VscF9pbl9wYXJhbV9jb25maWcoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURQUkVQUk9DX0FGRV9DTURfQVVESU9fUkVDT1JEX0NGR19ET05FX01TRzogewotCQlNTV9EQkcoIkFGRV9DTURfQVVESU9fUkVDT1JEX0NGR19ET05FX01TRyBcbiIpOwotCQl3YWtlX3VwKCZhdWRpby0+d2FpdF9lbmFibGUpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJVbmtub3duIEV2ZW50IGlkICVkXG4iLCBpZCk7Ci0JfQotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRzcCBhdWRyZWMgZXZlbnQgaGFuZGxlci0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgYXVkcmVjX2RzcF9ldmVudCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpZCwgc2l6ZV90IGxlbiwKLQkJCSAgICB2b2lkICgqZ2V0ZXZlbnQpKHZvaWQgKnB0ciwgc2l6ZV90IGxlbikpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IGRhdGE7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURSRUNfQ01EX01FTV9DRkdfRE9ORV9NU0c6IHsKLQkJTU1fREJHKCJDTURfTUVNX0NGR19ET05FIE1TRyBET05FXG4iKTsKLQkJYXVkaW8tPnJ1bm5pbmcgPSAxOwotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJCWlmICgoIWF1ZGlvLT5pbl9jYWxsICYmIChhdWRpby0+ZGV2X2NudCA+IDApKSB8fAotCQkJCShhdWRpby0+aW5fY2FsbCAmJgotCQkJCQkoYXVkaW8tPnZvaWNlX3N0YXRlIFwKLQkJCQkJCT09IFZPSUNFX1NUQVRFX0lOQ0FMTCkpKQotCQkJCWF1ZHFjZWxwX2luX3JlY29yZF9jb25maWcoYXVkaW8sIDEpOwotCQl9IGVsc2UgewotCQkJYXVkcHJlcHJvY19wY21fc2VuZF9kYXRhKGF1ZGlvLCAxKTsKLQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0X2VuYWJsZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX0ZBVEFMX0VSUl9NU0c6IHsKLQkJc3RydWN0IGF1ZHJlY19mYXRhbF9lcnJfbXNnIGZhdGFsX2Vycl9tc2c7Ci0KLQkJZ2V0ZXZlbnQoJmZhdGFsX2Vycl9tc2csIEFVRFJFQ19GQVRBTF9FUlJfTVNHX0xFTik7Ci0JCU1NX0VSUigiRkFUQUxfRVJSX01TRzogZXJyIGlkICVkXG4iLAotCQkJCWZhdGFsX2Vycl9tc2cuYXVkcmVjX2Vycl9pZCk7Ci0JCS8qIEVycm9yIHN0b3AgdGhlIGVuY29kZXIgKi8KLQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkKLQkJCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX1VQX1BBQ0tFVF9SRUFEWV9NU0c6IHsKLQkJc3RydWN0IGF1ZHJlY191cF9wa3RfcmVhZHlfbXNnIHBrdF9yZWFkeV9tc2c7Ci0KLQkJZ2V0ZXZlbnQoJnBrdF9yZWFkeV9tc2csIEFVRFJFQ19VUF9QQUNLRVRfUkVBRFlfTVNHX0xFTik7Ci0JCU1NX0RCRygiVVBfUEFDS0VUX1JFQURZX01TRzogd3JpdGUgY250IGxzdyAgJWQgXAotCQl3cml0ZSBjbnQgbXN3ICVkIHJlYWQgY250IGxzdyAlZCAgcmVhZCBjbnQgbXN3ICVkIFxuIixcCi0JCXBrdF9yZWFkeV9tc2cuYXVkcmVjX3BhY2tldF93cml0ZV9jbnRfbHN3LCBcCi0JCXBrdF9yZWFkeV9tc2cuYXVkcmVjX3BhY2tldF93cml0ZV9jbnRfbXN3LCBcCi0JCXBrdF9yZWFkeV9tc2cuYXVkcmVjX3VwX3ByZXZfcmVhZF9jbnRfbHN3LCBcCi0JCXBrdF9yZWFkeV9tc2cuYXVkcmVjX3VwX3ByZXZfcmVhZF9jbnRfbXN3KTsKLQotCQlhdWRxY2VscF9pbl9nZXRfZHNwX2ZyYW1lcyhhdWRpbyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19DTURfUENNX0JVRkZFUl9QVFJfVVBEQVRFX0FSTV9UT19FTkNfTVNHOiB7Ci0JCU1NX0RCRygicHRyX3VwZGF0ZSByZWNpZXZlZCBmcm9tIERTUFxuIik7Ci0JCWF1ZHByZXByb2NfcGNtX3NlbmRfZGF0YShhdWRpbywgMSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19DTURfUENNX0NGR19BUk1fVE9fRU5DX0RPTkVfTVNHOiB7Ci0JCU1NX0VSUigiQVVEUkVDX0NNRF9QQ01fQ0ZHX0FSTV9UT19FTkNfRE9ORV9NU0ciKTsKLQkJYXVkcWNlbHBfaW5fbWVtX2NvbmZpZyhhdWRpbyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRFJFQ19VUF9OVF9QQUNLRVRfUkVBRFlfTVNHOiB7Ci0JCXN0cnVjdCBhdWRyZWNfdXBfbnRfcGFja2V0X3JlYWR5X21zZyBwa3RfcmVhZHlfbXNnOwotCi0JCWdldGV2ZW50KCZwa3RfcmVhZHlfbXNnLCBBVURSRUNfVVBfTlRfUEFDS0VUX1JFQURZX01TR19MRU4pOwotCQlNTV9EQkcoIlVQX05UX1BBQ0tFVF9SRUFEWV9NU0c6IHdyaXRlIGNudCBsc3cgICVkIFwKLQkJd3JpdGUgY250IG1zdyAlZCByZWFkIGNudCBsc3cgJWQgIHJlYWQgY250IG1zdyAlZCBcbiIsXAotCQlwa3RfcmVhZHlfbXNnLmF1ZHJlY19wYWNrZXR3cml0ZV9jbnRfbHN3LCBcCi0JCXBrdF9yZWFkeV9tc2cuYXVkcmVjX3BhY2tldHdyaXRlX2NudF9tc3csIFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfdXBwcmV2X3JlYWRjb3VudF9sc3csIFwKLQkJcGt0X3JlYWR5X21zZy5hdWRyZWNfdXBwcmV2X3JlYWRjb3VudF9tc3cpOwotCi0JCWF1ZHFjZWxwX250X2luX2dldF9kc3BfZnJhbWVzKGF1ZGlvKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUkVDX0NNRF9FT1NfQUNLX01TRzogewotCQlNTV9EQkcoImVvcyBhY2sgcmVjaWV2ZWRcbiIpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURSRUNfQ01EX0ZMVVNIX0RPTkVfTVNHOiB7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJYXVkaW8tPmZsdXNoX2FjayA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJTU1fREJHKCJmbHVzaCBhY2sgcmVjaWV2ZWRcbiIpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBRFNQX01FU1NBR0VfSUQ6IHsKLQkJTU1fREJHKCJSZWNlaXZlZCBBRFNQIGV2ZW50Om1vZHVsZSBhdWRyZWN0YXNrXG4iKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiVW5rbm93biBFdmVudCBpZCAlZFxuIiwgaWQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXVkcWNlbHBfaW5fZ2V0X2RzcF9mcmFtZXMoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkaW9fZnJhbWUgKmZyYW1lOwotCXVpbnQzMl90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlNTV9EQkcoImhlYWQgPSAlZFxuIiwgYXVkaW8tPmluX2hlYWQpOwotCWluZGV4ID0gYXVkaW8tPmluX2hlYWQ7Ci0KLQlmcmFtZSA9ICh2b2lkICopICgoKGNoYXIgKilhdWRpby0+aW5baW5kZXhdLmRhdGEpIC0gXAotCQkJIHNpemVvZigqZnJhbWUpKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdWRpby0+aW5baW5kZXhdLnNpemUgPSBmcmFtZS0+ZnJhbWVfbGVuZ3RoOwotCi0JLyogc3RhdGlzdGljcyBvZiByZWFkICovCi0JYXRvbWljX2FkZChhdWRpby0+aW5baW5kZXhdLnNpemUsICZhdWRpby0+aW5fYnl0ZXMpOwotCWF0b21pY19hZGQoMSwgJmF1ZGlvLT5pbl9zYW1wbGVzKTsKLQotCWF1ZGlvLT5pbl9oZWFkID0gKGF1ZGlvLT5pbl9oZWFkICsgMSkgJiAoRlJBTUVfTlVNIC0gMSk7Ci0KLQkvKiBJZiBvdmVyZmxvdywgbW92ZSB0aGUgdGFpbCBpbmRleCBmb3dhcmQuICovCi0JaWYgKGF1ZGlvLT5pbl9oZWFkID09IGF1ZGlvLT5pbl90YWlsKSB7Ci0JCU1NX0VSUigiRXJyb3IhIG5vdCBhYmxlIHRvIGtlZXAgdXAgdGhlIHJlYWRcbiIpOwotCQlhdWRpby0+aW5fdGFpbCA9IChhdWRpby0+aW5fdGFpbCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCQlNTV9FUlIoImluX2NvdW50ID0gJWRcbiIsIGF1ZGlvLT5pbl9jb3VudCk7Ci0JfSBlbHNlCi0JCWF1ZGlvLT5pbl9jb3VudCsrOwotCi0JYXVkcWNlbHBfZHNwX3JlYWRfYnVmZmVyKGF1ZGlvLCBhdWRpby0+ZHNwX2NudCsrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQotCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcWNlbHBfbnRfaW5fZ2V0X2RzcF9mcmFtZXMoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkaW9fZnJhbWVfbnQgKm50X2ZyYW1lOwotCXVpbnQzMl90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JTU1fREJHKCJoZWFkID0gJWRcbiIsIGF1ZGlvLT5pbl9oZWFkKTsKLQlpbmRleCA9IGF1ZGlvLT5pbl9oZWFkOwotCW50X2ZyYW1lID0gKHZvaWQgKikgKCgoY2hhciAqKWF1ZGlvLT5pbltpbmRleF0uZGF0YSkgLSBcCi0JCQkJc2l6ZW9mKHN0cnVjdCBhdWRpb19mcmFtZV9udCkpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlhdWRpby0+aW5baW5kZXhdLnNpemUgPSBudF9mcmFtZS0+ZnJhbWVfbGVuZ3RoOwotCS8qIHN0YXRpc3RpY3Mgb2YgcmVhZCAqLwotCWF0b21pY19hZGQoYXVkaW8tPmluW2luZGV4XS5zaXplLCAmYXVkaW8tPmluX2J5dGVzKTsKLQlhdG9taWNfYWRkKDEsICZhdWRpby0+aW5fc2FtcGxlcyk7Ci0KLQlhdWRpby0+aW5faGVhZCA9IChhdWRpby0+aW5faGVhZCArIDEpICYgKEZSQU1FX05VTSAtIDEpOwotCi0JLyogSWYgb3ZlcmZsb3csIG1vdmUgdGhlIHRhaWwgaW5kZXggZm93YXJkLiAqLwotCWlmIChhdWRpby0+aW5faGVhZCA9PSBhdWRpby0+aW5fdGFpbCkKLQkJTU1fREJHKCJFcnJvciEgbm90IGFibGUgdG8ga2VlcCB1cCB0aGUgcmVhZFxuIik7Ci0JZWxzZQotCQlhdWRpby0+aW5fY291bnQrKzsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLX0KLQotCi1zdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHJlY19xY2VscF9hZHNwX29wcyA9IHsKLQkuZXZlbnQgPSBhdWRyZWNfZHNwX2V2ZW50LAotfTsKLQotc3RhdGljIGludCBhdWRwcmVwcm9jX3BjbV9idWZmZXJfcHRyX3JlZnJlc2goc3RydWN0IGF1ZGlvX2luICphdWRpbywKLQkJCQkgICAgICAgdW5zaWduZWQgaWR4LCB1bnNpZ25lZCBsZW4pCi17Ci0Jc3RydWN0IGF1ZHJlY19jbWRfcGNtX2J1ZmZlcl9wdHJfcmVmcmVzaF9hcm1fZW5jIGNtZDsKLQotCWlmIChsZW4gPT0gIE1FVEFfT1VUX1NJWkUpCi0JCWxlbiA9IGxlbiAvIDI7Ci0JZWxzZQotCQlsZW4gPSAobGVuICsgTUVUQV9PVVRfU0laRSkgLyAyOwotCU1NX0RCRygibGVuID0gJWRcbiIsIGxlbik7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUkVDX0NNRF9QQ01fQlVGRkVSX1BUUl9SRUZSRVNIX0FSTV9UT19FTkM7Ci0JY21kLm51bV9idWZmZXJzID0gMTsKLQlpZiAoY21kLm51bV9idWZmZXJzID09IDEpIHsKLQkJY21kLmJ1Zl9hZGRyZXNzX2xlbmd0aFswXSA9IChhdWRpby0+b3V0W2lkeF0uYWRkciAmCi0JCQkJCQkJMHhmZmZmMDAwMCkgPj4gMTY7Ci0JCWNtZC5idWZfYWRkcmVzc19sZW5ndGhbMV0gPSAoYXVkaW8tPm91dFtpZHhdLmFkZHIgJgotCQkJCQkJCTB4MDAwMGZmZmYpOwotCQljbWQuYnVmX2FkZHJlc3NfbGVuZ3RoWzJdID0gKGxlbiAmIDB4ZmZmZjAwMDApID4+IDE2OwotCQljbWQuYnVmX2FkZHJlc3NfbGVuZ3RoWzNdID0gKGxlbiAmIDB4MDAwMGZmZmYpOwotCX0KLQlhdWRpby0+b3V0X2ZyYW1lX2NudCsrOwotCXJldHVybiBhdWRyZWNfc2VuZF9hdWRyZWNxdWV1ZShhdWRpbywgKHZvaWQgKikmY21kLAotCQkJCQkodW5zaWduZWQgaW50KXNpemVvZihjbWQpKTsKLX0KLQotCi1zdGF0aWMgaW50IGF1ZHBjbV9jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcmVjX2NtZF9wY21fY2ZnX2FybV90b19lbmMgY21kOwotCU1NX0RCRygiXG4iKTsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURSRUNfQ01EX1BDTV9DRkdfQVJNX1RPX0VOQzsKLQljbWQuY29uZmlnX3VwZGF0ZV9mbGFnID0gQVVEUkVDX1BDTV9DT05GSUdfVVBEQVRFX0ZMQUdfRU5BQkxFOwotCWNtZC5lbmFibGVfZmxhZyA9IEFVRFJFQ19FTkFCTEVfRkxBR19WQUxVRTsKLQljbWQuc2FtcGxpbmdfZnJlcSA9IGF1ZGlvLT5zYW1wX3JhdGU7Ci0JaWYgKCFhdWRpby0+Y2hhbm5lbF9tb2RlKQotCQljbWQuY2hhbm5lbHMgPSAxOwotCWVsc2UKLQkJY21kLmNoYW5uZWxzID0gMjsKLQljbWQuZnJlcXVlbmN5X29mX2ludGltYXRpb24gPSAxOwotCWNtZC5tYXhfbnVtYmVyX29mX2J1ZmZlcnMgPSBPVVRfRlJBTUVfTlVNOwotCXJldHVybiBhdWRyZWNfc2VuZF9hdWRyZWNxdWV1ZShhdWRpbywgKHZvaWQgKikmY21kLAotCQkJCQkodW5zaWduZWQgaW50KXNpemVvZihjbWQpKTsKLX0KLQotCi1zdGF0aWMgaW50IGF1ZHByZXByb2NfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19hdWRyZWNfY21kX3JvdXRpbmdfbW9kZSBjbWQ7Ci0KLQlNTV9EQkcoIlxuIik7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUFJFUFJPQ19BVURSRUNfQ01EX1JPVVRJTkdfTU9ERTsKLQljbWQuc3RyZWFtX2lkID0gYXVkaW8tPmVuY19pZDsKLQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FEU1BfRU5DX01PREVfTk9OX1RVTk5FTCkKLQkJY21kLnJvdXRpbmdfbW9kZSA9IDE7Ci0JcmV0dXJuIGF1ZHByZXByb2Nfc2VuZF9hdWRyZWNjbWRxdWV1ZSgmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLQotCi1zdGF0aWMgaW50IGF1ZHFjZWxwX2luX2VuY19jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19hdWRyZWNfY21kX2VuY19jZmcgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQlpZiAoYXVkaW8tPmJ1aWxkX2lkWzE3XSA9PSAnMScpIHsKLQkJY21kLmNtZF9pZCA9IEFVRFBSRVBST0NfQVVEUkVDX0NNRF9FTkNfQ0ZHXzI7Ci0JCU1NX0VSUigic2VuZGluZyBBVURQUkVQUk9DX0FVRFJFQ19DTURfRU5DX0NGR18yIGNvbW1hbmQiKTsKLQl9IGVsc2UgewotCQljbWQuY21kX2lkID0gQVVEUFJFUFJPQ19BVURSRUNfQ01EX0VOQ19DRkc7Ci0JCU1NX0VSUigic2VuZGluZyBBVURQUkVQUk9DX0FVRFJFQ19DTURfRU5DX0NGRyBjb21tYW5kIik7Ci0JfQotCWNtZC5zdHJlYW1faWQgPSBhdWRpby0+ZW5jX2lkOwotCi0JaWYgKGVuYWJsZSkKLQkJY21kLmF1ZHJlY19lbmNfdHlwZSA9IGF1ZGlvLT5lbmNfdHlwZSB8IEVOQ09ERV9FTkFCTEU7Ci0JZWxzZQotCQljbWQuYXVkcmVjX2VuY190eXBlICY9IH4oRU5DT0RFX0VOQUJMRSk7Ci0KLQlyZXR1cm4gYXVkcHJlcHJvY19zZW5kX2F1ZHJlY2NtZHF1ZXVlKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBhdWRxY2VscF9pbl9wYXJhbV9jb25maWcoc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19hdWRyZWNfY21kX3Bhcm1fY2ZnX3FjZWxwMTNrIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNvbW1vbi5jbWRfaWQgPSBBVURQUkVQUk9DX0FVRFJFQ19DTURfUEFSQU1fQ0ZHOwotCWNtZC5jb21tb24uc3RyZWFtX2lkID0gYXVkaW8tPmVuY19pZDsKLQotCWNtZC5lbmNfbWluX3JhdGUgPSBhdWRpby0+Y2ZnLm1pbl9iaXRfcmF0ZTsKLQljbWQuZW5jX21heF9yYXRlID0gYXVkaW8tPmNmZy5tYXhfYml0X3JhdGU7Ci0JY21kLnJhdGVfbW9kdWxhdGlvbl9jbWQgPSAwOyAgLyogRGVmYXVsdCBzZXQgdG8gMCAqLwotCWNtZC5yZWR1Y2VkX3JhdGVfbGV2ZWwgPSAwOyAgLyogRGVmYXVsdCBzZXQgdG8gMCAqLwotCi0JcmV0dXJuIGF1ZHByZXByb2Nfc2VuZF9hdWRyZWNjbWRxdWV1ZSgmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLS8qIFRvIERvOiBtc21fc25kZGV2X3JvdXRlX2VuYyhhdWRpby0+ZW5jX2lkKTsgKi8KLXN0YXRpYyBpbnQgYXVkcWNlbHBfaW5fcmVjb3JkX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLCBpbnQgZW5hYmxlKQotewotCXN0cnVjdCBhdWRwcmVwcm9jX2FmZV9jbWRfYXVkaW9fcmVjb3JkX2NmZyBjbWQ7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUFJFUFJPQ19BRkVfQ01EX0FVRElPX1JFQ09SRF9DRkc7Ci0JY21kLnN0cmVhbV9pZCA9IGF1ZGlvLT5lbmNfaWQ7Ci0JaWYgKGVuYWJsZSkKLQkJY21kLmRlc3RpbmF0aW9uX2FjdGl2aXR5ID0gQVVESU9fUkVDT1JESU5HX1RVUk5fT047Ci0JZWxzZQotCQljbWQuZGVzdGluYXRpb25fYWN0aXZpdHkgPSBBVURJT19SRUNPUkRJTkdfVFVSTl9PRkY7Ci0KLQljbWQuc291cmNlX21peF9tYXNrID0gYXVkaW8tPnNvdXJjZTsKLQlpZiAoYXVkaW8tPmVuY19pZCA9PSAyKSB7Ci0JCWlmICgoY21kLnNvdXJjZV9taXhfbWFzayAmCi0JCQkJSU5URVJOQUxfQ09ERUNfVFhfU09VUkNFX01JWF9NQVNLKSB8fAotCQkJKGNtZC5zb3VyY2VfbWl4X21hc2sgJiBBVVhfQ09ERUNfVFhfU09VUkNFX01JWF9NQVNLKSB8fAotCQkJKGNtZC5zb3VyY2VfbWl4X21hc2sgJiBWT0lDRV9VTF9TT1VSQ0VfTUlYX01BU0spIHx8Ci0JCQkoY21kLnNvdXJjZV9taXhfbWFzayAmIFZPSUNFX0RMX1NPVVJDRV9NSVhfTUFTSykpIHsKLQkJCWNtZC5waXBlX2lkID0gU09VUkNFX1BJUEVfMTsKLQkJfQotCQlpZiAoY21kLnNvdXJjZV9taXhfbWFzayAmCi0JCQkJQVVEUFBfQTJEUF9QSVBFX1NPVVJDRV9NSVhfTUFTSykKLQkJCWNtZC5waXBlX2lkIHw9IFNPVVJDRV9QSVBFXzA7Ci0JfQotCU1NX0RCRygic3RyZWFtX2lkICV4IGRlc3RpbmF0aW9uX2FjdGl2aXR5ICV4IFwKLQlzb3VyY2VfbWl4X21hc2sgJXggcGlwZV9pZCAleCIsXAotCWNtZC5zdHJlYW1faWQsIGNtZC5kZXN0aW5hdGlvbl9hY3Rpdml0eSwKLQljbWQuc291cmNlX21peF9tYXNrLCBjbWQucGlwZV9pZCk7Ci0JcmV0dXJuIGF1ZHByZXByb2Nfc2VuZF9hdWRyZWNjbWRxdWV1ZSgmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkcWNlbHBfaW5fbWVtX2NvbmZpZyhzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRyZWNfY21kX2FyZWNtZW1fY2ZnIGNtZDsKLQl1aW50MTZfdCAqZGF0YSA9ICh2b2lkICopIGF1ZGlvLT5kYXRhOwotCWludCBuOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUkVDX0NNRF9NRU1fQ0ZHX0NNRDsKLQljbWQuYXVkcmVjX3VwX3BrdF9pbnRtX2NvdW50ID0gMTsKLQljbWQuYXVkcmVjX2V4dF9wa3Rfc3RhcnRfYWRkcl9tc3cgPSBhdWRpby0+cGh5cyA+PiAxNjsKLQljbWQuYXVkcmVjX2V4dF9wa3Rfc3RhcnRfYWRkcl9sc3cgPSBhdWRpby0+cGh5czsKLQljbWQuYXVkcmVjX2V4dF9wa3RfYnVmX251bWJlciA9IEZSQU1FX05VTTsKLQlNTV9EQkcoImF1ZGlvLT5waHlzID0gJXhcbiIsIGF1ZGlvLT5waHlzKTsKLQkvKiBwcmVwYXJlIGJ1ZmZlciBwb2ludGVyczoKLQkgKiBUOjM2IGJ5dGVzIHFjZWxwIHBwYWNrZXQgKyA0IGhhbGZ3b3JkIGhlYWRlcgotCSAqIE5UOjM2IGJ5dGVzIHFjZWxwIHBhY2tldCArIDEyIGhhbGZ3b3JkIGhlYWRlcgotCSAqLwotCWZvciAobiA9IDA7IG4gPCBGUkFNRV9OVU07IG4rKykgewotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJCWF1ZGlvLT5pbltuXS5kYXRhID0gZGF0YSArIDQ7Ci0JCQlkYXRhICs9IChGUkFNRV9TSVpFLzIpOwotCQkJTU1fREJHKCIweCU4eFxuIiwgKGludCkoYXVkaW8tPmluW25dLmRhdGEgLSA4KSk7Ci0JCX0gZWxzZSAgewotCQkJYXVkaW8tPmluW25dLmRhdGEgPSBkYXRhICsgMTI7Ci0JCQlkYXRhICs9ICgoUUNFTFBfRlJBTUVfU0laRSkgLyAyKSArIDEyOwotCQkJTU1fREJHKCIweCU4eFxuIiwgKGludCkoYXVkaW8tPmluW25dLmRhdGEgLSAyNCkpOwotCQl9Ci0JfQotCXJldHVybiBhdWRyZWNfc2VuZF9hdWRyZWNxdWV1ZShhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgaW50IGF1ZHFjZWxwX2RzcF9yZWFkX2J1ZmZlcihzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvLCB1aW50MzJfdCByZWFkX2NudCkKLXsKLQlzdHJ1Y3QgdXBfYXVkcmVjX3BhY2tldF9leHRfcHRyIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNtZF9pZCA9IFVQX0FVRFJFQ19QQUNLRVRfRVhUX1BUUjsKLQljbWQuYXVkcmVjX3VwX2N1cnJfcmVhZF9jb3VudF9tc3cgPSByZWFkX2NudCA+PiAxNjsKLQljbWQuYXVkcmVjX3VwX2N1cnJfcmVhZF9jb3VudF9sc3cgPSByZWFkX2NudDsKLQotCXJldHVybiBhdWRyZWNfc2VuZF9iaXRzdHJlYW1xdWV1ZShhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotc3RhdGljIGludCBhdWRxY2VscF9mbHVzaF9jb21tYW5kKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHJlY19jbWRfZmx1c2ggY21kOwotCU1NX0RCRygiXG4iKTsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURSRUNfQ01EX0ZMVVNIOwotCXJldHVybiBhdWRyZWNfc2VuZF9hdWRyZWNxdWV1ZShhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkcWNlbHBfaW5fZW5hYmxlKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pCi17Ci0JaWYgKGF1ZGlvLT5lbmFibGVkKQotCQlyZXR1cm4gMDsKLQotCWlmIChhdWRwcmVwcm9jX2VuYWJsZShhdWRpby0+ZW5jX2lkLCAmYXVkcHJlcHJvY19kc3BfZXZlbnQsIGF1ZGlvKSkgewotCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRwcmVwcm9jKSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAobXNtX2Fkc3BfZW5hYmxlKGF1ZGlvLT5hdWRyZWMpKSB7Ci0JCU1NX0VSUigibXNtX2Fkc3BfZW5hYmxlKGF1ZHJlYykgZmFpbGVkXG4iKTsKLQkJYXVkcHJlcHJvY19kaXNhYmxlKGF1ZGlvLT5lbmNfaWQsIGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWF1ZGlvLT5lbmFibGVkID0gMTsKLQlhdWRxY2VscF9pbl9lbmNfY29uZmlnKGF1ZGlvLCAxKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkcWNlbHBfaW5fZGlzYWJsZShzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCWlmIChhdWRpby0+ZW5hYmxlZCkgewotCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCWF1ZHFjZWxwX2luX2VuY19jb25maWcoYXVkaW8sIDApOwotCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0X2VuYWJsZSwKLQkJCQlhdWRpby0+cnVubmluZyA9PSAwLCAxKkhaKTsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRpby0+YXVkcmVjKTsKLQkJYXVkcHJlcHJvY19kaXNhYmxlKGF1ZGlvLT5lbmNfaWQsIGF1ZGlvKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX2lvcG9ydF9yZXNldChzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvKQotewotCS8qIE1ha2Ugc3VyZSByZWFkL3dyaXRlIHRocmVhZCBhcmUgZnJlZSBmcm9tCi0JICogc2xlZXAgYW5kIGtub3dpbmcgdGhhdCBzeXN0ZW0gaXMgbm90IGFibGUKLQkgKiB0byBwcm9jZXNzIGlvIHJlcXVlc3QgYXQgdGhlIG1vbWVudAotCSAqLwotCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JYXVkcWNlbHBfaW5fZmx1c2goYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlhdWRxY2VscF9vdXRfZmx1c2goYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHFjZWxwX2luX2ZsdXNoKHN0cnVjdCBhdWRpb19pbiAqYXVkaW8pCi17Ci0JaW50IGk7Ci0KLQlhdWRpby0+ZHNwX2NudCA9IDA7Ci0JYXVkaW8tPmluX2hlYWQgPSAwOwotCWF1ZGlvLT5pbl90YWlsID0gMDsKLQlhdWRpby0+aW5fY291bnQgPSAwOwotCWF1ZGlvLT5lb3NfYWNrID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfTlVNOyBpKyspIHsKLQkJYXVkaW8tPmluW2ldLnNpemUgPSAwOwotCQlhdWRpby0+aW5baV0ucmVhZCA9IDA7Ci0JfQotCU1NX0RCRygiaW5fYnl0ZXMgJWRcbiIsIGF0b21pY19yZWFkKCZhdWRpby0+aW5fYnl0ZXMpKTsKLQlNTV9EQkcoImluX3NhbXBsZXMgJWRcbiIsIGF0b21pY19yZWFkKCZhdWRpby0+aW5fc2FtcGxlcykpOwotCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9ieXRlcywgMCk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPmluX3NhbXBsZXMsIDApOwotfQotCi1zdGF0aWMgdm9pZCBhdWRxY2VscF9vdXRfZmx1c2goc3RydWN0IGF1ZGlvX2luICphdWRpbykKLXsKLQlpbnQgaTsKLQotCWF1ZGlvLT5vdXRfaGVhZCA9IDA7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+b3V0X2NvdW50ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgT1VUX0ZSQU1FX05VTTsgaSsrKSB7Ci0JCWF1ZGlvLT5vdXRbaV0uc2l6ZSA9IDA7Ci0JCWF1ZGlvLT5vdXRbaV0ucmVhZCA9IDA7Ci0JCWF1ZGlvLT5vdXRbaV0udXNlZCA9IDA7Ci0JfQotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBsb25nIGF1ZHFjZWxwX2luX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhdWRpb19pbiAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiXG4iKTsKLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKLQkJc3RhdHMuYnl0ZV9jb3VudCA9IGF0b21pY19yZWFkKCZhdWRpby0+aW5fYnl0ZXMpOwotCQlzdGF0cy5zYW1wbGVfY291bnQgPSBhdG9taWNfcmVhZCgmYXVkaW8tPmluX3NhbXBsZXMpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQl1aW50MzJfdCBmcmVxOwotCQlmcmVxID0gNDgwMDA7Ci0JCU1NX0RCRygiQVVESU9fU1RBUlRcbiIpOwotCQlpZiAoYXVkaW8tPmluX2NhbGwgJiYgKGF1ZGlvLT52b2ljZV9zdGF0ZSAhPQotCQkJCVZPSUNFX1NUQVRFX0lOQ0FMTCkpIHsKLQkJCXJjID0gLUVQRVJNOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmMgPSBtc21fc25kZGV2X3JlcXVlc3RfZnJlcSgmZnJlcSwgYXVkaW8tPmVuY19pZCwKLQkJCQkJU05EREVWX0NBUF9UWCwgQVVEREVWX0NMTlRfRU5DKTsKLQkJTU1fREJHKCJzYW1wbGUgcmF0ZSBjb25maWd1cmVkICVkXG4iLCBmcmVxKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJTU1fREJHKCIgU2FtcGxlIHJhdGUgY2FuIG5vdCBiZSBzZXQsIHJldHVybiBjb2RlICVkXG4iLAotCQkJCQkJCQkgcmMpOwotCQkJbXNtX3NuZGRldl93aXRoZHJhd19mcmVxKGF1ZGlvLT5lbmNfaWQsCi0JCQkJCVNORERFVl9DQVBfVFgsIEFVRERFVl9DTE5UX0VOQyk7Ci0JCQlNTV9EQkcoIm1zbV9zbmRkZXZfd2l0aGRyYXdfZnJlcVxuIik7Ci0JCQlicmVhazsKLQkJfQotCQkvKnVwZGF0ZSBhdXJlYyBzZXNzaW9uIGluZm8gaW4gYXVkcHJlcHJvYyBsYXllciovCi0JCWF1ZGlvLT5zZXNzaW9uX2luZm8uc2Vzc2lvbl9pZCA9IGF1ZGlvLT5lbmNfaWQ7Ci0JCWF1ZGlvLT5zZXNzaW9uX2luZm8uc2FtcGxpbmdfZnJlcSA9IGF1ZGlvLT5zYW1wX3JhdGU7Ci0JCWF1ZHByZXByb2NfdXBkYXRlX2F1ZHJlY19pbmZvKCZhdWRpby0+c2Vzc2lvbl9pbmZvKTsKLQkJcmMgPSBhdWRxY2VscF9pbl9lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9Ci0JCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdF9lbmFibGUsCi0JCQkJYXVkaW8tPnJ1bm5pbmcgIT0gMCwgMSpIWik7Ci0JCQlNTV9EQkcoInN0YXRlICVkIHJjID0gJWRcbiIsIGF1ZGlvLT5ydW5uaW5nLCByYyk7Ci0KLQkJCWlmIChhdWRpby0+cnVubmluZyA9PSAwKQotCQkJCXJjID0gLUVOT0RFVjsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCX0KLQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TVE9QOiB7Ci0JCS8qcmVzZXQgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSBpbmZvcm1hdGlvbiBhdCBhdWRwcmVwcm9jIGxheWVyKi8KLQkJYXVkaW8tPnNlc3Npb25faW5mby5zYW1wbGluZ19mcmVxID0gMDsKLQkJYXVkcHJlcHJvY191cGRhdGVfYXVkcmVjX2luZm8oJmF1ZGlvLT5zZXNzaW9uX2luZm8pOwotCQlyYyA9IGF1ZHFjZWxwX2luX2Rpc2FibGUoYXVkaW8pOwotCQlyYyA9IG1zbV9zbmRkZXZfd2l0aGRyYXdfZnJlcShhdWRpby0+ZW5jX2lkLAotCQkJCQlTTkRERVZfQ0FQX1RYLCBBVURERVZfQ0xOVF9FTkMpOwotCQlNTV9EQkcoIm1zbV9zbmRkZXZfd2l0aGRyYXdfZnJlcVxuIik7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fRkxVU0g6IHsKLQkJTU1fREJHKCJBVURJT19GTFVTSFxuIik7Ci0JCWF1ZGlvLT5yZmx1c2ggPSAxOwotCQlhdWRpby0+d2ZsdXNoID0gMTsKLQkJYXVkcWNlbHBfaW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKSB7Ci0JCQlhdWRxY2VscF9mbHVzaF9jb21tYW5kKGF1ZGlvKTsKLQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCSFhdWRpby0+d2ZsdXNoKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlNTV9FUlIoIkFVRElPX0ZMVVNIIGludGVycnVwdGVkXG4iKTsKLQkJCQlyYyA9IC1FSU5UUjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX1NUUkVBTV9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnIGNmZzsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsICh2b2lkICopIGFyZywgc2l6ZW9mKGNmZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBBbGxvdyBvbmx5IHNpbmdsZSBmcmFtZSAqLwotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJCWlmIChjZmcuYnVmZmVyX3NpemUgIT0gKEZSQU1FX1NJWkUgLSA4KSkgewotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChjZmcuYnVmZmVyX3NpemUgIT0gKFFDRUxQX0ZSQU1FX1NJWkUgKyAxNCkpIHsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXVkaW8tPmJ1ZmZlcl9zaXplID0gY2ZnLmJ1ZmZlcl9zaXplOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfU1RSRUFNX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgY2ZnOwotCQltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOwotCQljZmcuYnVmZmVyX3NpemUgPSBhdWRpby0+YnVmZmVyX3NpemU7Ci0JCWNmZy5idWZmZXJfY291bnQgPSBGUkFNRV9OVU07Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmY2ZnLCBzaXplb2YoY2ZnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9RQ0VMUF9FTkNfQ09ORklHOiB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmYXVkaW8tPmNmZywgc2l6ZW9mKGF1ZGlvLT5jZmcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX1FDRUxQX0VOQ19DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnIGNmZzsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsICh2b2lkICopIGFyZywgc2l6ZW9mKGNmZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlNTV9EQkcoIjBYJTh4LCAweCU4eCwgMHglOHhcbiIsIGNmZy5taW5fYml0X3JhdGUsIFwKLQkJCQljZmcubWF4X2JpdF9yYXRlLCBjZmcuY2RtYV9yYXRlKTsKLQkJaWYgKGNmZy5taW5fYml0X3JhdGUgPiBDRE1BX1JBVEVfRlVMTCB8fCBcCi0JCQkJIGNmZy5taW5fYml0X3JhdGUgPCBDRE1BX1JBVEVfRUlHSFRIKSB7Ci0JCQlNTV9FUlIoImludmFsaWQgbWluIGJpdHJhdGVcbiIpOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNmZy5tYXhfYml0X3JhdGUgPiBDRE1BX1JBVEVfRlVMTCB8fCBcCi0JCQkJY2ZnLm1heF9iaXRfcmF0ZSA8IENETUFfUkFURV9FSUdIVEgpIHsKLQkJCU1NX0VSUigiaW52YWxpZCBtYXggYml0cmF0ZVxuIik7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBSZWNvcmRpbmcgRG9lcyBub3Qgc3VwcG9ydCBFcmFzZSBhbmQgQmxhbmsgKi8KLQkJaWYgKGNmZy5jZG1hX3JhdGUgPiBDRE1BX1JBVEVfRlVMTCB8fAotCQkJY2ZnLmNkbWFfcmF0ZSA8IENETUFfUkFURV9FSUdIVEgpIHsKLQkJCU1NX0VSUigiaW52YWxpZCBxY2VscCBjZG1hIHJhdGVcbiIpOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJbWVtY3B5KCZhdWRpby0+Y2ZnLCAmY2ZnLCBzaXplb2YoY2ZnKSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY2ZnOwotCQltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOwotCQljZmcuYnVmZmVyX3NpemUgPSBPVVRfQlVGRkVSX1NJWkU7Ci0JCWNmZy5idWZmZXJfY291bnQgPSBPVVRfRlJBTUVfTlVNOwotCQljZmcuc2FtcGxlX3JhdGUgPSBhdWRpby0+c2FtcF9yYXRlOwotCQljZmcuY2hhbm5lbF9jb3VudCA9IGF1ZGlvLT5jaGFubmVsX21vZGU7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjZmcsIHNpemVvZihjZmcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0lOQ0FMTDogewotCQlzdHJ1Y3QgbXNtX3ZvaWNlcmVjX21vZGUgY2ZnOwotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpIHsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKSBhcmcsIHNpemVvZihjZmcpKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjZmcucmVjX21vZGUgIT0gVk9DX1JFQ19CT1RIICYmCi0JCQkJY2ZnLnJlY19tb2RlICE9IFZPQ19SRUNfVVBMSU5LICYmCi0JCQkJY2ZnLnJlY19tb2RlICE9IFZPQ19SRUNfRE9XTkxJTkspIHsKLQkJCQlNTV9FUlIoImludmFsaWQgcmVjX21vZGVcbiIpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCQkJCWlmIChjZmcucmVjX21vZGUgPT0gVk9DX1JFQ19VUExJTkspCi0JCQkJCWF1ZGlvLT5zb3VyY2UgPSBcCi0JCQkJCQlWT0lDRV9VTF9TT1VSQ0VfTUlYX01BU0s7Ci0JCQkJZWxzZSBpZiAoY2ZnLnJlY19tb2RlID09IFZPQ19SRUNfRE9XTkxJTkspCi0JCQkJCWF1ZGlvLT5zb3VyY2UgPSBcCi0JCQkJCQlWT0lDRV9ETF9TT1VSQ0VfTUlYX01BU0s7Ci0JCQkJZWxzZQotCQkJCQlhdWRpby0+c291cmNlID0gXAotCQkJCQkJVk9JQ0VfRExfU09VUkNFX01JWF9NQVNLIHwKLQkJCQkJCVZPSUNFX1VMX1NPVVJDRV9NSVhfTUFTSyA7Ci0JCQkJYXVkaW8tPmluX2NhbGwgPSAxOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kZXZfbG9jaywgZmxhZ3MpOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9TRVNTSU9OX0lEOiB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmYXVkaW8tPmVuY19pZCwKLQkJCXNpemVvZih1bnNpZ25lZCBzaG9ydCkpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRxY2VscF9pbl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCWNoYXIgX191c2VyICpidWYsCi0JCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXZvaWQgKmRhdGE7Ci0JdWludDMyX3QgaW5kZXg7Ci0JdWludDMyX3Qgc2l6ZTsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBxY2VscF9lbmNvZGVkX21ldGFfb3V0IG1ldGFfZmllbGQ7Ci0Jc3RydWN0IGF1ZGlvX2ZyYW1lX250ICpudF9mcmFtZTsKLQlNTV9EQkcoIiBjb3VudCA9ICVkXG4iLCBjb3VudCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCWF1ZGlvLT53YWl0LCAoYXVkaW8tPmluX2NvdW50ID4gMCkgfHwgYXVkaW8tPnN0b3BwZWQgfHwKLQkJCWF1ZGlvLT5yZmx1c2ggfHwKLQkJCSgoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpICYmCi0JCQkgYXVkaW8tPmluX2NhbGwgJiYgYXVkaW8tPnJ1bm5pbmcgJiYKLQkJCShhdWRpby0+dm9pY2Vfc3RhdGUgPT0gVk9JQ0VfU1RBVEVfT0ZGQ0FMTCkpKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCi0JCWlmIChhdWRpby0+cmZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChhdWRpby0+c3RvcHBlZCAmJiAhYXVkaW8tPmluX2NvdW50KSB7Ci0JCQlNTV9EQkcoIkRyaXZlciBpbiBzdG9wIHN0YXRlLCBObyBtb3JlIGJ1ZmZlciB0byByZWFkIik7Ci0JCQlyYyA9IDA7LyogRW5kIG9mIEZpbGUgKi8KLQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmICgoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9UVU5ORUwpICYmCi0JCQkJCWF1ZGlvLT5pbl9jYWxsICYmIGF1ZGlvLT5ydW5uaW5nICYmCi0JCQkJCShhdWRpby0+dm9pY2Vfc3RhdGUgXAotCQkJCQkJPT0gVk9JQ0VfU1RBVEVfT0ZGQ0FMTCkpIHsKLQkJCQlNTV9EQkcoIk5vdCBQZXJtaXR0ZWQgVm9pY2UgVGVybWluYXRlZFxuIik7Ci0JCQkJcmMgPSAtRVBFUk07IC8qIFZvaWNlIENhbGwgc3RvcHBlZCAqLwotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaW5kZXggPSBhdWRpby0+aW5fdGFpbDsKLQkJZGF0YSA9ICh1aW50OF90ICopIGF1ZGlvLT5pbltpbmRleF0uZGF0YTsKLQkJc2l6ZSA9IGF1ZGlvLT5pbltpbmRleF0uc2l6ZTsKLQotCQlpZiAoYXVkaW8tPm1vZGUgPT0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUwpIHsKLQkJCW50X2ZyYW1lID0gKHN0cnVjdCBhdWRpb19mcmFtZV9udCAqKShkYXRhIC0KLQkJCQkJc2l6ZW9mKHN0cnVjdCBhdWRpb19mcmFtZV9udCkpOwotCQkJbWVtY3B5KChjaGFyICopJm1ldGFfZmllbGQudGltZV9zdGFtcF9kd29yZF9sc3csCi0JCQkJKGNoYXIgKikmbnRfZnJhbWUtPnRpbWVfc3RhbXBfZHdvcmRfbHN3LAotCQkJCShzaXplb2Yoc3RydWN0IHFjZWxwX2VuY29kZWRfbWV0YV9vdXQpIC0gXAotCQkJCXNpemVvZih1aW50MTZfdCkpKTsKLQkJCW1ldGFfZmllbGQubWV0YWRhdGFfbGVuID0KLQkJCQkJc2l6ZW9mKHN0cnVjdCBxY2VscF9lbmNvZGVkX21ldGFfb3V0KTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKGNoYXIgKilzdGFydCwKLQkJCQkoY2hhciAqKSZtZXRhX2ZpZWxkLAotCQkJCXNpemVvZihzdHJ1Y3QgcWNlbHBfZW5jb2RlZF9tZXRhX291dCkpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKG50X2ZyYW1lLT5uZmxhZ19sc3cgJiAweDAwMDEpIHsKLQkJCQlNTV9FUlIoInJlY2lldmVkIEVPUyBpbiByZWFkIGNhbGxcbiIpOwotCQkJCWF1ZGlvLT5lb3NfYWNrID0gMTsKLQkJCX0KLQkJCWJ1ZiArPSBzaXplb2Yoc3RydWN0IHFjZWxwX2VuY29kZWRfbWV0YV9vdXQpOwotCQkJY291bnQgLT0gc2l6ZW9mKHN0cnVjdCBxY2VscF9lbmNvZGVkX21ldGFfb3V0KTsKLQkJfQotCQlpZiAoY291bnQgPj0gc2l6ZSkgewotCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGRhdGEsIHNpemUpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJaWYgKGluZGV4ICE9IGF1ZGlvLT5pbl90YWlsKSB7Ci0JCQkJLyogb3ZlcnJ1biAtLSBkYXRhIGlzCi0JCQkJICogaW52YWxpZCBhbmQgd2UgbmVlZCB0byByZXRyeSAqLwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYXVkaW8tPmluW2luZGV4XS5zaXplID0gMDsKLQkJCWF1ZGlvLT5pbl90YWlsID0gKGF1ZGlvLT5pbl90YWlsICsgMSkgJiAoRlJBTUVfTlVNIC0gMSk7Ci0JCQlhdWRpby0+aW5fY291bnQtLTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJY291bnQgLT0gc2l6ZTsKLQkJCWJ1ZiArPSBzaXplOwotCQkJaWYgKChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkpIHsKLQkJCQlpZiAoIWF1ZGlvLT5lb3NfYWNrKSB7Ci0JCQkJCU1NX0RCRygic2VuZGluZyByZWFkIHB0ciBjb21tYW5kXAotCQkJCQkJCSVkICVkXG4iLAotCQkJCQkJCWF1ZGlvLT5kc3BfY250LAotCQkJCQkJCWF1ZGlvLT5pbl90YWlsKTsKLQkJCQkJYXVkcWNlbHBfZHNwX3JlYWRfYnVmZmVyKGF1ZGlvLAotCQkJCQkJCWF1ZGlvLT5kc3BfY250KyspOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigic2hvcnQgcmVhZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQotCWlmIChidWYgPiBzdGFydCkKLQkJcmV0dXJuIGJ1ZiAtIHN0YXJ0OwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwcmVwcm9jX3BjbV9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvX2luICphdWRpbywgdW5zaWduZWQgbmVlZGVkKQotewotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JTU1fREJHKCJcbiIpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWF1ZGlvLT5ydW5uaW5nKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAobmVlZGVkICYmICFhdWRpby0+d2ZsdXNoKSB7Ci0JCS8qIFdlIHdlcmUgY2FsbGVkIGZyb20gdGhlIGNhbGxiYWNrIGJlY2F1c2UgdGhlIERTUAotCQkgKiByZXF1ZXN0ZWQgbW9yZSBkYXRhLiAgTm90ZSB0aGF0IHRoZSBEU1AgZG9lcyB3YW50Ci0JCSAqIG1vcmUgZGF0YSwgYW5kIGlmIGEgYnVmZmVyIHdhcyBpbi1mbGlnaHQsIG1hcmsgaXQKLQkJICogYXMgYXZhaWxhYmxlIChzaW5jZSB0aGUgRFNQIG11c3Qgbm93IGJlIGRvbmUgd2l0aAotCQkgKiBpdCkuCi0JCSAqLwotCQlhdWRpby0+b3V0X25lZWRlZCA9IDE7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpIHsKLQkJCU1NX0RCRygiZnJhbWUgJWQgZnJlZVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJCWZyYW1lLT51c2VkID0gMDsKLQkJCWF1ZGlvLT5vdXRfdGFpbCBePSAxOwotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl9Ci0JfQotCi0JaWYgKGF1ZGlvLT5vdXRfbmVlZGVkKSB7Ci0JCS8qIElmIHRoZSBEU1AgY3VycmVudGx5IHdhbnRzIGRhdGEgYW5kIHdlIGhhdmUgYQotCQkgKiBidWZmZXIgYXZhaWxhYmxlLCB3ZSB3aWxsIHNlbmQgaXQgYW5kIHJlc2V0Ci0JCSAqIHRoZSBuZWVkZWQgZmxhZy4gIFdlJ2xsIG1hcmsgdGhlIGJ1ZmZlciBhcyBpbi1mbGlnaHQKLQkJICogc28gdGhhdCBpdCB3b24ndCBiZSByZWN5Y2xlZCB1bnRpbCB0aGUgbmV4dCBidWZmZXIKLQkJICogaXMgcmVxdWVzdGVkCi0JCSAqLwotCi0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkKSB7Ci0JCQlCVUdfT04oZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZik7Ci0JCQlhdWRwcmVwcm9jX3BjbV9idWZmZXJfcHRyX3JlZnJlc2goYXVkaW8sCi0JCQkJCQkgYXVkaW8tPm91dF90YWlsLAotCQkJCQkJICAgIGZyYW1lLT51c2VkKTsKLQkJCWZyYW1lLT51c2VkID0gMHhmZmZmZmZmZjsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJfQotCX0KLSBkb25lOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi0KLXN0YXRpYyBpbnQgYXVkcWNlbHBfaW5fZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBwcG9zMSwgbG9mZl90IHBwb3MyLCBpbnQgZGF0YXN5bmMpCi0KLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWlmICghYXVkaW8tPnJ1bm5pbmcgfHwgKGF1ZGlvLT5tb2RlID09IE1TTV9BVURfRU5DX01PREVfVFVOTkVMKSkgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZV9ub2xvY2s7Ci0JfQotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPndyaXRlX3dhaXQsCi0JCQlhdWRpby0+d2ZsdXNoKTsKLQlNTV9EQkcoIndha2VkIG9uIGJ5IHNvbWUgZXZlbnQgYXVkaW8tPndmbHVzaCA9ICVkXG4iLCBhdWRpby0+d2ZsdXNoKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQllbHNlIGlmIChhdWRpby0+d2ZsdXNoKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotZG9uZToKLQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLWRvbmVfbm9sb2NrOgotCXJldHVybiByYzsKLQotfQotCi0gaW50IGF1ZHByZXByb2NfcWNlbHBfcHJvY2Vzc19lb3Moc3RydWN0IGF1ZGlvX2luICphdWRpbywKLQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1Zl9zdGFydCwgdW5zaWduZWQgc2hvcnQgbWZpZWxkX3NpemUpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JaW50IHJjID0gMDsKLQotCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkoYXVkaW8tPm91dF9uZWVkZWQgJiYKLQkJYXVkaW8tPm91dFswXS51c2VkID09IDAgJiYKLQkJYXVkaW8tPm91dFsxXS51c2VkID09IDApCi0JCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gZG9uZTsKLQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoY29weV9mcm9tX3VzZXIoZnJhbWUtPmRhdGEsIGJ1Zl9zdGFydCwgbWZpZWxkX3NpemUpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlmcmFtZS0+dXNlZCA9IG1maWVsZF9zaXplOwotCU1NX0RCRygiY29weWluZyBtZXRhX291dCBmcmFtZS0+dXNlZCA9ICVkXG4iLCBmcmFtZS0+dXNlZCk7Ci0JYXVkcHJlcHJvY19wY21fc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRxY2VscF9pbl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JY2hhciAqY3B5X3B0cjsKLQlpbnQgcmMgPSAwLCBlb3NfY29uZGl0aW9uID0gQVVEUFJFUFJPQ19RQ0VMUF9FT1NfTk9ORTsKLQl1bnNpZ25lZCBzaG9ydCBtZmllbGRfc2l6ZSA9IDA7Ci0JaW50IHdyaXRlX2NvdW50ID0gMDsKLQotCU1NX0RCRygiY250PSVkXG4iLCBjb3VudCk7Ci0JaWYgKGNvdW50ICYgMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoYXVkaW8tPm1vZGUgIT0gTVNNX0FVRF9FTkNfTU9ERV9OT05UVU5ORUwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfaGVhZDsKLQkvKiBpZiBzdXBwbGllZCBjb3VudCBpcyBtb3JlIHRoYW4gZHJpdmVyIGJ1ZmZlciBzaXplCi0JICogdGhlbiBvbmx5IGNvcHkgZHJpdmVyIGJ1ZmZlciBzaXplCi0JICovCi0JaWYgKGNvdW50ID4gZnJhbWUtPnNpemUpCi0JCWNvdW50ID0gZnJhbWUtPnNpemU7Ci0KLQl3cml0ZV9jb3VudCA9IGNvdW50OwotCWNweV9wdHIgPSBmcmFtZS0+ZGF0YTsKLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkgICAgICAoZnJhbWUtPnVzZWQgPT0gMCkKLQkJCQkJfHwgKGF1ZGlvLT5zdG9wcGVkKQotCQkJCQl8fCAoYXVkaW8tPndmbHVzaCkpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JaWYgKGF1ZGlvLT5tZmllbGQpIHsKLQkJaWYgKGJ1ZiA9PSBzdGFydCkgewotCQkJLyogUHJvY2Vzc2luZyBiZWdpbm5pbmcgb2YgdXNlciBidWZmZXIgKi8KLQkJCWlmIChfX2dldF91c2VyKG1maWVsZF9zaXplLAotCQkJCSh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgYnVmKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlnb3RvIGVycm9yOwotCQkJfSBlbHNlIGlmIChtZmllbGRfc2l6ZSA+IGNvdW50KSB7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlNTV9EQkcoIm1mIG9mZnNldF92YWwgJXhcbiIsIG1maWVsZF9zaXplKTsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIG1maWVsZF9zaXplKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJLyogQ2hlY2sgaWYgRU9TIGZsYWcgaXMgc2V0IGFuZCBidWZmZXIgaGFzCi0JCQkgKiBjb250YWlucyBqdXN0IG1ldGEgZmllbGQKLQkJCSAqLwotCQkJaWYgKGNweV9wdHJbQVVEUFJFUFJPQ19RQ0VMUF9FT1NfRkxHX09GRlNFVF0gJgotCQkJCQlBVURQUkVQUk9DX1FDRUxQX0VPU19GTEdfTUFTSykgewotCQkJCWVvc19jb25kaXRpb24gPSBBVURQUkVQUk9DX1FDRUxQX0VPU19TRVQ7Ci0JCQkJTU1fREJHKCJFT1MgU0VUXG4iKTsKLQkJCQlpZiAobWZpZWxkX3NpemUgPT0gY291bnQpIHsKLQkJCQkJYnVmICs9IG1maWVsZF9zaXplOwotCQkJCQllb3NfY29uZGl0aW9uID0gMDsKLQkJCQkJZ290byBleGl0OwotCQkJCX0gZWxzZQotCQkJCWNweV9wdHJbQVVEUFJFUFJPQ19RQ0VMUF9FT1NfRkxHX09GRlNFVF0gJj0KLQkJCQkJfkFVRFBSRVBST0NfUUNFTFBfRU9TX0ZMR19NQVNLOwotCQkJfQotCQkJY3B5X3B0ciArPSBtZmllbGRfc2l6ZTsKLQkJCWNvdW50IC09IG1maWVsZF9zaXplOwotCQkJYnVmICs9IG1maWVsZF9zaXplOwotCQl9IGVsc2UgewotCQkJbWZpZWxkX3NpemUgPSAwOwotCQkJTU1fREJHKCJjb250aW51b3VzIGJ1ZmZlclxuIik7Ci0JCX0KLQkJZnJhbWUtPm1maWVsZF9zeiA9IG1maWVsZF9zaXplOwotCX0KLQlNTV9EQkcoImNvcHlpbmcgdGhlIHN0cmVhbSBjb3VudCA9ICVkXG4iLCBjb3VudCk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGNweV9wdHIsIGJ1ZiwgY291bnQpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBlcnJvcjsKLQl9Ci1leGl0OgotCWZyYW1lLT51c2VkID0gY291bnQ7Ci0JYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JaWYgKCFhdWRpby0+Zmx1c2hfYWNrKQotCQlhdWRwcmVwcm9jX3BjbV9zZW5kX2RhdGEoYXVkaW8sIDApOwotCWVsc2UgewotCQlhdWRwcmVwcm9jX3BjbV9zZW5kX2RhdGEoYXVkaW8sIDEpOwotCQlhdWRpby0+Zmx1c2hfYWNrID0gMDsKLQl9Ci0JaWYgKGVvc19jb25kaXRpb24gPT0gQVVEUFJFUFJPQ19RQ0VMUF9FT1NfU0VUKQotCQlyYyA9IGF1ZHByZXByb2NfcWNlbHBfcHJvY2Vzc19lb3MoYXVkaW8sIHN0YXJ0LCBtZmllbGRfc2l6ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JcmV0dXJuIHdyaXRlX2NvdW50OwotZXJyb3I6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZHFjZWxwX2luX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvX2luICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRpby0+aW5fY2FsbCA9IDA7Ci0JLyogd2l0aCBkcmF3IGZyZXF1ZW5jeSBmb3Igc2Vzc2lvbgotCSAgIGluY2FzZSBub3Qgc3RvcHBlZCB0aGUgZHJpdmVyICovCi0JbXNtX3NuZGRldl93aXRoZHJhd19mcmVxKGF1ZGlvLT5lbmNfaWQsIFNORERFVl9DQVBfVFgsCi0JCQkJCUFVRERFVl9DTE5UX0VOQyk7Ci0JYXVkZGV2X3VucmVnaXN0ZXJfZXZ0X2xpc3RuZXIoQVVEREVWX0NMTlRfRU5DLCBhdWRpby0+ZW5jX2lkKTsKLQkvKnJlc2V0IHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgaW5mb3JtYXRpb24gYXQgYXVkcHJlcHJvYyBsYXllciovCi0JYXVkaW8tPnNlc3Npb25faW5mby5zYW1wbGluZ19mcmVxID0gMDsKLQlhdWRwcmVwcm9jX3VwZGF0ZV9hdWRyZWNfaW5mbygmYXVkaW8tPnNlc3Npb25faW5mbyk7Ci0JYXVkcWNlbHBfaW5fZGlzYWJsZShhdWRpbyk7Ci0JYXVkcWNlbHBfaW5fZmx1c2goYXVkaW8pOwotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcmVjKTsKLQlhdWRwcmVwcm9jX2FlbmNfZnJlZShhdWRpby0+ZW5jX2lkKTsKLQlhdWRpby0+YXVkcmVjID0gTlVMTDsKLQlhdWRpby0+b3BlbmVkID0gMDsKLQlpZiAoYXVkaW8tPmRhdGEpIHsKLQkJaW9uX3VubWFwX2tlcm5lbChhdWRpby0+Y2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotCQlhdWRpby0+ZGF0YSA9IE5VTEw7Ci0JfQotCWlmIChhdWRpby0+b3V0X2RhdGEpIHsKLQkJaW9uX3VubWFwX2tlcm5lbChhdWRpby0+Y2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci0JCWF1ZGlvLT5vdXRfZGF0YSA9IE5VTEw7Ci0JfQotCWlvbl9jbGllbnRfZGVzdHJveShhdWRpby0+Y2xpZW50KTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IGF1ZGlvX2luIHRoZV9hdWRpb19xY2VscF9pbjsKLXN0YXRpYyBpbnQgYXVkcWNlbHBfaW5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW9faW4gKmF1ZGlvID0gJnRoZV9hdWRpb19xY2VscF9pbjsKLQlpbnQgcmM7Ci0JaW50IGVuY2lkOwotCWludCBsZW4gPSAwOwotCXVuc2lnbmVkIGxvbmcgaW9uZmxhZyA9IDA7Ci0JaW9uX3BoeXNfYWRkcl90IGFkZHIgPSAwOwotCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUgPSBOVUxMOwotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQgPSBOVUxMOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWlmIChhdWRpby0+b3BlbmVkKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGRvbmU7Ci0JfQotCWNsaWVudCA9IG1zbV9pb25fY2xpZW50X2NyZWF0ZShVSU5UX01BWCwgIkF1ZGlvX0VWUkNfaW5fY2xpZW50Iik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGNsaWVudCkpIHsKLQkJTU1fRVJSKCJVbmFibGUgdG8gY3JlYXRlIElPTiBjbGllbnRcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gY2xpZW50X2NyZWF0ZV9lcnJvcjsKLQl9Ci0JYXVkaW8tPmNsaWVudCA9IGNsaWVudDsKLQotCU1NX0RCRygiYWxsb2NhdGluZyBtZW0gc3ogPSAlZFxuIiwgRE1BU1opOwotCWhhbmRsZSA9IGlvbl9hbGxvYyhjbGllbnQsIERNQVNaLCBTWl80SywKLQkJSU9OX0hFQVAoSU9OX0FVRElPX0hFQVBfSUQpLCAwKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoaGFuZGxlKSkgewotCQlNTV9FUlIoIlVuYWJsZSB0byBjcmVhdGUgYWxsb2NhdGUgTy9QIGJ1ZmZlcnNcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfYWxsb2NfZXJyb3I7Ci0JfQotCi0JYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSA9IGhhbmRsZTsKLQotCXJjID0gaW9uX3BoeXMoY2xpZW50ICwgaGFuZGxlLCAmYWRkciwgJmxlbik7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiTy9QIGJ1ZmZlcnM6SW52YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRwdXRfYnVmZl9nZXRfcGh5c19lcnJvcjsKLQl9IGVsc2UgewotCQlNTV9JTkZPKCJPL1AgYnVmZmVyczp2YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JfQotCWF1ZGlvLT5waHlzID0gKGludDMyX3QpYWRkcjsKLQotCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MoY2xpZW50LCBoYW5kbGUsICZpb25mbGFnKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgZ2V0IGZsYWdzIGZvciB0aGUgaGFuZGxlXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dHB1dF9idWZmX2dldF9mbGFnc19lcnJvcjsKLQl9Ci0KLQlhdWRpby0+bWFwX3ZfcmVhZCA9IGlvbl9tYXBfa2VybmVsKGNsaWVudCwgaGFuZGxlKTsKLQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl9yZWFkKSkgewotCQlNTV9FUlIoImNvdWxkIG5vdCBtYXAgcmVhZCBidWZmZXJzLGZyZWVpbmcgaW5zdGFuY2UgMHglMDh4XG4iLAotCQkJCShpbnQpYXVkaW8pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfbWFwX2Vycm9yOwotCX0KLQlhdWRpby0+ZGF0YSA9IGF1ZGlvLT5tYXBfdl9yZWFkOwotCi0JTU1fREJHKCJNZW1vcnkgYWRkciA9IDB4JTh4ICBwaHkgYWRkciA9IDB4JTh4XG4iLFwKLQkJKGludCkgYXVkaW8tPmRhdGEsIChpbnQpIGF1ZGlvLT5waHlzKTsKLQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJYXVkaW8tPm1vZGUgPSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTDsKLQkJTU1fREJHKCJPcGVuZWQgZm9yIG5vbiB0dW5uZWwgbW9kZSBlbmNvZGluZ1xuIik7Ci0JfSBlbHNlIGlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJYXVkaW8tPm1vZGUgPSBNU01fQVVEX0VOQ19NT0RFX1RVTk5FTDsKLQkJTU1fREJHKCJPcGVuZWQgZm9yIHR1bm5lbCBtb2RlIGVuY29kaW5nXG4iKTsKLQl9IGVsc2UgewotCQlNTV9FUlIoIkludmFsaWQgbW9kZVxuIik7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIFNldHRpbmdzIHdpbGwgYmUgcmUtY29uZmlnIGF0IEFVRElPX1NFVF9DT05GSUcsCi0JICogYnV0IGF0IGxlYXN0IHdlIG5lZWQgdG8gaGF2ZSBpbml0aWFsIGNvbmZpZwotCSAqLwotCWlmIChhdWRpby0+bW9kZSA9PSBNU01fQVVEX0VOQ19NT0RFX05PTlRVTk5FTCkKLQkJCWF1ZGlvLT5idWZmZXJfc2l6ZSA9IChRQ0VMUF9GUkFNRV9TSVpFICsgMTQpOwotCWVsc2UKLQkJCWF1ZGlvLT5idWZmZXJfc2l6ZSA9IChGUkFNRV9TSVpFIC0gOCk7Ci0JYXVkaW8tPmVuY190eXBlID0gRU5DX1RZUEVfVjEzSyB8IGF1ZGlvLT5tb2RlOwotCWF1ZGlvLT5zYW1wX3JhdGUgPSA4MDAwOwotCWF1ZGlvLT5jaGFubmVsX21vZGUgPSBBVURSRUNfQ01EX01PREVfTU9OTzsKLQlhdWRpby0+Y2ZnLmNkbWFfcmF0ZSA9IENETUFfUkFURV9GVUxMOwotCWF1ZGlvLT5jZmcubWluX2JpdF9yYXRlID0gQ0RNQV9SQVRFX0ZVTEw7Ci0JYXVkaW8tPmNmZy5tYXhfYml0X3JhdGUgPSBDRE1BX1JBVEVfRlVMTDsKLQlhdWRpby0+c291cmNlID0gSU5URVJOQUxfQ09ERUNfVFhfU09VUkNFX01JWF9NQVNLOwotCWF1ZGlvLT5yZWNfbW9kZSA9IFZPQ19SRUNfVVBMSU5LOwotCi0JZW5jaWQgPSBhdWRwcmVwcm9jX2FlbmNfYWxsb2MoYXVkaW8tPmVuY190eXBlLCAmYXVkaW8tPm1vZHVsZV9uYW1lLAotCQkJJmF1ZGlvLT5xdWV1ZV9pZHMpOwotCWlmIChlbmNpZCA8IDApIHsKLQkJTU1fRVJSKCJObyBmcmVlIGVuY29kZXIgYXZhaWxhYmxlXG4iKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGRvbmU7Ci0JfQotCWF1ZGlvLT5lbmNfaWQgPSBlbmNpZDsKLQotCXJjID0gbXNtX2Fkc3BfZ2V0KGF1ZGlvLT5tb2R1bGVfbmFtZSwgJmF1ZGlvLT5hdWRyZWMsCi0JCQkgICAmYXVkcmVjX3FjZWxwX2Fkc3Bfb3BzLCBhdWRpbyk7Ci0KLQlpZiAocmMpIHsKLQkJYXVkcHJlcHJvY19hZW5jX2ZyZWUoYXVkaW8tPmVuY19pZCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JYXVkaW8tPnNvdXJjZSA9IDA7Ci0JYXVkaW8tPndmbHVzaCA9IDA7Ci0JYXVkaW8tPnJmbHVzaCA9IDA7Ci0JYXVkaW8tPmZsdXNoX2FjayA9IDA7Ci0KLQlhdWRxY2VscF9pbl9mbHVzaChhdWRpbyk7Ci0JYXVkcWNlbHBfb3V0X2ZsdXNoKGF1ZGlvKTsKLQotCU1NX0RCRygiYWxsb2NhdGluZyBCVUZGRVJfU0laRSAgJWRcbiIsIEJVRkZFUl9TSVpFKTsKLQloYW5kbGUgPSBpb25fYWxsb2MoY2xpZW50LCBCVUZGRVJfU0laRSwKLQkJCVNaXzRLLCBJT05fSEVBUChJT05fQVVESU9fSEVBUF9JRCksIDApOwotCWlmIChJU19FUlJfT1JfTlVMTChoYW5kbGUpKSB7Ci0JCU1NX0VSUigiVW5hYmxlIHRvIGNyZWF0ZSBhbGxvY2F0ZSBJL1AgYnVmZmVyc1xuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBpbnB1dF9idWZmX2FsbG9jX2Vycm9yOwotCX0KLQotCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IGhhbmRsZTsKLQotCXJjID0gaW9uX3BoeXMoY2xpZW50ICwgaGFuZGxlLCAmYWRkciwgJmxlbik7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiSS9QIGJ1ZmZlcnM6SW52YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsICh1bnNpZ25lZCBpbnQpIGxlbik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBpbnB1dF9idWZmX2FsbG9jX2Vycm9yOwotCX0gZWxzZSB7Ci0JCU1NX0lORk8oIkdvdCB2YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsCi0JCQkodW5zaWduZWQgaW50KSBsZW4pOwotCX0KLQlhdWRpby0+b3V0X3BoeXMgPSAoaW50MzJfdClhZGRyOwotCi0JcmMgPSBpb25faGFuZGxlX2dldF9mbGFncyhjbGllbnQsCi0JCWhhbmRsZSwgJmlvbmZsYWcpOwotCWlmIChyYykgewotCQlNTV9FUlIoImNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gaW5wdXRfYnVmZl9hbGxvY19lcnJvcjsKLQl9Ci0KLQlhdWRpby0+bWFwX3Zfd3JpdGUgPSBpb25fbWFwX2tlcm5lbChjbGllbnQsIGhhbmRsZSk7Ci0JaWYgKElTX0VSUihhdWRpby0+bWFwX3Zfd3JpdGUpKSB7Ci0JCU1NX0VSUigiY291bGQgbm90IG1hcCB3cml0ZSBidWZmZXJzXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGlucHV0X2J1ZmZfbWFwX2Vycm9yOwotCX0KLQlhdWRpby0+b3V0X2RhdGEgPSBhdWRpby0+bWFwX3Zfd3JpdGU7Ci0JTU1fREJHKCJ3cml0ZSBidWY6IHBoeSBhZGRyIDB4JTA4eCBrZXJuZWwgYWRkciAweCUwOHhcbiIsCi0JCQkJKHVuc2lnbmVkIGludClhZGRyLAotCQkJCSh1bnNpZ25lZCBpbnQpYXVkaW8tPm91dF9kYXRhKTsKLQotCQkvKiBJbml0aWFsaXplIGJ1ZmZlciAqLwotCWF1ZGlvLT5vdXRbMF0uZGF0YSA9IGF1ZGlvLT5vdXRfZGF0YSArIDA7Ci0JYXVkaW8tPm91dFswXS5hZGRyID0gYXVkaW8tPm91dF9waHlzICsgMDsKLQlhdWRpby0+b3V0WzBdLnNpemUgPSBPVVRfQlVGRkVSX1NJWkU7Ci0KLQlhdWRpby0+b3V0WzFdLmRhdGEgPSBhdWRpby0+b3V0X2RhdGEgKyBPVVRfQlVGRkVSX1NJWkU7Ci0JYXVkaW8tPm91dFsxXS5hZGRyID0gYXVkaW8tPm91dF9waHlzICsgT1VUX0JVRkZFUl9TSVpFOwotCWF1ZGlvLT5vdXRbMV0uc2l6ZSA9IE9VVF9CVUZGRVJfU0laRTsKLQotCU1NX0RCRygiYXVkaW8tPm91dFswXS5kYXRhID0gJWQgIGF1ZGlvLT5vdXRbMV0uZGF0YSA9ICVkIiwKLQkJCQkJKHVuc2lnbmVkIGludClhdWRpby0+b3V0WzBdLmRhdGEsCi0JCQkJCSh1bnNpZ25lZCBpbnQpYXVkaW8tPm91dFsxXS5kYXRhKTsKLQlhdWRpby0+ZGV2aWNlX2V2ZW50cyA9IEFVRERFVl9FVlRfREVWX1JEWSB8IEFVRERFVl9FVlRfREVWX1JMUyB8Ci0JCQkJQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEc7Ci0KLQlhdWRpby0+dm9pY2Vfc3RhdGUgPSBtc21fZ2V0X3ZvaWNlX3N0YXRlKCk7Ci0JcmMgPSBhdWRkZXZfcmVnaXN0ZXJfZXZ0X2xpc3RuZXIoYXVkaW8tPmRldmljZV9ldmVudHMsCi0JCQkJCUFVRERFVl9DTE5UX0VOQywgYXVkaW8tPmVuY19pZCwKLQkJCQkJcWNlbHBfaW5fbGlzdGVuZXIsICh2b2lkICopIGF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJmYWlsZWQgdG8gcmVnaXN0ZXIgZGV2aWNlIGV2ZW50IGxpc3RlbmVyXG4iKTsKLQkJaW91bm1hcChhdWRpby0+bWFwX3Zfd3JpdGUpOwotCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKGF1ZGlvLT5vdXRfcGh5cyk7Ci0JCWdvdG8gZXZ0X2Vycm9yOwotCX0KLQlhdWRpby0+bWZpZWxkID0gTUVUQV9PVVRfU0laRTsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQlhdWRpby0+b3BlbmVkID0gMTsKLQlhdWRpby0+b3V0X2ZyYW1lX2NudCsrOwotCWF1ZGlvLT5idWlsZF9pZCA9IHNvY2luZm9fZ2V0X2J1aWxkX2lkKCk7Ci0JTU1fREJHKCJNb2RlbSBidWlsZCBpZCA9ICVzXG4iLCBhdWRpby0+YnVpbGRfaWQpOwotZG9uZToKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci1ldnRfZXJyb3I6Ci0JbXNtX2Fkc3BfcHV0KGF1ZGlvLT5hdWRyZWMpOwotCWF1ZHByZXByb2NfYWVuY19mcmVlKGF1ZGlvLT5lbmNfaWQpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotaW5wdXRfYnVmZl9tYXBfZXJyb3I6Ci0JaW9uX2ZyZWUoY2xpZW50LCBhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUpOwotaW5wdXRfYnVmZl9hbGxvY19lcnJvcjoKLQlpb25fdW5tYXBfa2VybmVsKGNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci1vdXRwdXRfYnVmZl9tYXBfZXJyb3I6Ci1vdXRwdXRfYnVmZl9nZXRfcGh5c19lcnJvcjoKLW91dHB1dF9idWZmX2dldF9mbGFnc19lcnJvcjoKLQlpb25fZnJlZShjbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotb3V0cHV0X2J1ZmZfYWxsb2NfZXJyb3I6Ci0JaW9uX2NsaWVudF9kZXN0cm95KGNsaWVudCk7Ci1jbGllbnRfY3JlYXRlX2Vycm9yOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9faW5fZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gYXVkcWNlbHBfaW5fb3BlbiwKLQkucmVsZWFzZQk9IGF1ZHFjZWxwX2luX3JlbGVhc2UsCi0JLnJlYWQJCT0gYXVkcWNlbHBfaW5fcmVhZCwKLQkud3JpdGUJCT0gYXVkcWNlbHBfaW5fd3JpdGUsCi0JLmZzeW5jCQk9IGF1ZHFjZWxwX2luX2ZzeW5jLAotCS51bmxvY2tlZF9pb2N0bAk9IGF1ZHFjZWxwX2luX2lvY3RsLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fcWNlbHBfaW5fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX3FjZWxwX2luIiwKLQkuZm9wcwk9ICZhdWRpb19pbl9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkcWNlbHBfaW5faW5pdCh2b2lkKQotewotCW11dGV4X2luaXQoJnRoZV9hdWRpb19xY2VscF9pbi5sb2NrKTsKLQltdXRleF9pbml0KCZ0aGVfYXVkaW9fcWNlbHBfaW4ucmVhZF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmdGhlX2F1ZGlvX3FjZWxwX2luLmRzcF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmdGhlX2F1ZGlvX3FjZWxwX2luLmRldl9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfYXVkaW9fcWNlbHBfaW4ud2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdGhlX2F1ZGlvX3FjZWxwX2luLndhaXRfZW5hYmxlKTsKLQltdXRleF9pbml0KCZ0aGVfYXVkaW9fcWNlbHBfaW4ud3JpdGVfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdGhlX2F1ZGlvX3FjZWxwX2luLndyaXRlX3dhaXQpOwotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19xY2VscF9pbl9taXNjKTsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGF1ZHFjZWxwX2luX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb193bWEuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fd21hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNWRjZDMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb193bWEuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NjAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIEJhc2VkIG9uIHRoZSBtcDMgbmF0aXZlIGRyaXZlciBpbiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX21wMy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICoKLSAqIEFsbCBzb3VyY2UgY29kZSBpbiB0aGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGV4Y2VwdAotICogd2hlcmUgaW5kaWNhdGVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKLSAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGZpbmQgaXQgYXQgaHR0cDovL3d3dy5mc2Yub3JnCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9lYXJseXN1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX3dtYS5oPgotI2luY2x1ZGUgPGxpbnV4L21lbW9yeV9hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KLQotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdV9kb21haW5zLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHBtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRwbGF5Y21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBsYXltc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRwcC5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9tZW10eXBlcy5oPgotCi0vKiBTaXplIG11c3QgYmUgcG93ZXIgb2YgMiAqLwotI2RlZmluZSBCVUZTWl9NQVggCTQxMTAJLyogSW5jbHVkZXMgbWV0YSBpbiBzaXplICovCi0jZGVmaW5lIEJVRlNaX01JTiAJMTAzOAkvKiBJbmNsdWRlcyBtZXRhIGluIHNpemUgKi8KLSNkZWZpbmUgRE1BU1pfTUFYIAkoQlVGU1pfTUFYICogMikKLSNkZWZpbmUgRE1BU1pfTUlOIAkoQlVGU1pfTUlOICogMikKLQotI2RlZmluZSBBVURQTEFZX0lOVkFMSURfUkVBRF9QVFJfT0ZGU0VUCTB4RkZGRgotI2RlZmluZSBBVURERUNfREVDX1dNQSA0Ci0KLSNkZWZpbmUgUENNX0JVRlNaX01JTiAJODIxNiAJLyogSG9sZCBvbmUgc3RlcmVvIFdNQSBmcmFtZSBhbmQgbWV0YSBvdXQqLwotI2RlZmluZSBQQ01fQlVGX01BWF9DT1VOVCA1CS8qIERTUCBvbmx5IGFjY2VwdHMgNSBidWZmZXJzIGF0IG1vc3QKLQkJCQkgICBidXQgc3VwcG9ydCAyIGJ1ZmZlcnMgY3VycmVudGx5ICovCi0jZGVmaW5lIFJPVVRJTkdfTU9ERV9GVFJUIDEKLSNkZWZpbmUgUk9VVElOR19NT0RFX1JUIDIKLS8qIERlY29kZXIgc3RhdHVzIHJlY2VpdmVkIGZyb20gQVVEUFBUQVNLICovCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX1NMRUVQCTAKLSNkZWZpbmUJIEFVRFBQX0RFQ19TVEFUVVNfSU5JVCAgMQotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19DRkcgICAyCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX1BMQVkgIDMKLQotI2RlZmluZSBBVURXTUFfTUVUQUZJRUxEX01BU0sgMHhGRkZGMDAwMAotI2RlZmluZSBBVURXTUFfRU9TX0ZMR19PRkZTRVQgMHgwQSAvKiBPZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgYnVmZmVyICovCi0jZGVmaW5lIEFVRFdNQV9FT1NfRkxHX01BU0sgMHgwMQotI2RlZmluZSBBVURXTUFfRU9TX05PTkUgMHgwIC8qIE5vIEVPUyBkZXRlY3RlZCAqLwotI2RlZmluZSBBVURXTUFfRU9TX1NFVCAweDEgLyogRU9TIHNldCBpbiBtZXRhIGZpZWxkICovCi0KLSNkZWZpbmUgQVVEV01BX0VWRU5UX05VTSAxMCAvKiBEZWZhdWx0IG51bWJlciBvZiBwcmUtYWxsb2NhdGVkIGV2ZW50IHBhY2tldHMgKi8KLQotc3RydWN0IGJ1ZmZlciB7Ci0Jdm9pZCAqZGF0YTsKLQl1bnNpZ25lZCBzaXplOwotCXVuc2lnbmVkIHVzZWQ7CQkvKiBJbnB1dCB1c2FnZSBhY3R1YWwgRFNQIHByb2R1Y2VkIFBDTSBzaXplICAqLwotCXVuc2lnbmVkIGFkZHI7Ci0JdW5zaWduZWQgc2hvcnQgbWZpZWxkX3N6OyAvKm9ubHkgdXNlZnVsIGZvciBkYXRhIGhhcyBtZXRhIGZpZWxkICovCi19OwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0cnVjdCBhdWR3bWFfc3VzcGVuZF9jdGwgewotCXN0cnVjdCBlYXJseV9zdXNwZW5kIG5vZGU7Ci0Jc3RydWN0IGF1ZGlvICphdWRpbzsKLX07Ci0jZW5kaWYKLQotc3RydWN0IGF1ZHdtYV9ldmVudHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JaW50IGV2ZW50X3R5cGU7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLX07Ci0KLXN0cnVjdCBhdWRpbyB7Ci0Jc3RydWN0IGJ1ZmZlciBvdXRbMl07Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JdWludDhfdCBvdXRfaGVhZDsKLQl1aW50OF90IG91dF90YWlsOwotCXVpbnQ4X3Qgb3V0X25lZWRlZDsgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGRzcCBpcyB3YWl0aW5nIGZvciAqLwotCXVuc2lnbmVkIG91dF9kbWFfc3o7Ci0KLQlhdG9taWNfdCBvdXRfYnl0ZXM7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggd3JpdGVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3cml0ZV93YWl0OwotCi0JLyogSG9zdCBQQ00gc2VjdGlvbiAqLwotCXN0cnVjdCBidWZmZXIgaW5bUENNX0JVRl9NQVhfQ09VTlRdOwotCXN0cnVjdCBtdXRleCByZWFkX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF93YWl0OwkvKiBXYWl0IHF1ZXVlIGZvciByZWFkICovCi0JY2hhciAqcmVhZF9kYXRhOwkvKiBwb2ludGVyIHRvIHJlYWRlciBidWZmZXIgKi8KLQlpbnQzMl90IHJlYWRfcGh5czsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiByZWFkZXIgYnVmZmVyICovCi0JdWludDhfdCByZWFkX25leHQ7CS8qIGluZGV4IHRvIGlucHV0IGJ1ZmZlcnMgdG8gYmUgcmVhZCBuZXh0ICovCi0JdWludDhfdCBmaWxsX25leHQ7CS8qIGluZGV4IHRvIGJ1ZmZlciB0aGF0IERTUCBzaG91bGQgYmUgZmlsbGluZyAqLwotCXVpbnQ4X3QgcGNtX2J1Zl9jb3VudDsJLyogbnVtYmVyIG9mIHBjbSBidWZmZXIgYWxsb2NhdGVkICovCi0JLyogLS0tLSBFbmQgb2YgSG9zdCBQQ00gc2VjdGlvbiAqLwotCi0Jc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqYXVkcGxheTsKLQotCS8qIGNvbmZpZ3VyYXRpb24gdG8gdXNlIG9uIG5leHQgZW5hYmxlICovCi0JdWludDMyX3Qgb3V0X3NhbXBsZV9yYXRlOwotCXVpbnQzMl90IG91dF9jaGFubmVsX21vZGU7Ci0KLQlzdHJ1Y3QgbXNtX2F1ZGlvX3dtYV9jb25maWcgd21hX2NvbmZpZzsKLQotCS8qIGRhdGEgYWxsb2NhdGVkIGZvciB2YXJpb3VzIGJ1ZmZlcnMgKi8KLQljaGFyICpkYXRhOwotCWludDMyX3QgcGh5czsgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB3cml0ZSBidWZmZXIgKi8KLQl2b2lkICptYXBfdl9yZWFkOwotCXZvaWQgKm1hcF92X3dyaXRlOwotCi0JaW50IG1maWVsZDsgLyogbWV0YSBmaWVsZCBlbWJlZGRlZCBpbiBkYXRhICovCi0JaW50IHJmbHVzaDsgLyogUmVhZCAgZmx1c2ggKi8KLQlpbnQgd2ZsdXNoOyAvKiBXcml0ZSBmbHVzaCAqLwotCWludCBvcGVuZWQ7Ci0JaW50IGVuYWJsZWQ7Ci0JaW50IHJ1bm5pbmc7Ci0JaW50IHN0b3BwZWQ7IC8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQlpbnQgcGNtX2ZlZWRiYWNrOwotCWludCBidWZfcmVmcmVzaDsKLQlpbnQgdGVvczsgLyogdmFsaWQgb25seSBpZiB0dW5uZWwgbW9kZSAmIG5vIGRhdGEgbGVmdCBmb3IgZGVjb2RlciAqLwotCWVudW0gbXNtX2F1ZF9kZWNvZGVyX3N0YXRlIGRlY19zdGF0ZTsJLyogUmVwcmVzZW50cyBkZWNvZGVyIHN0YXRlICovCi0JaW50IHJlc2VydmVkOyAvKiBBIGJ5dGUgaXMgYmVpbmcgcmVzZXJ2ZWQgKi8KLQljaGFyIHJzdl9ieXRlOyAvKiBIYW5kbGUgb2RkIGxlbmd0aCB1c2VyIGRhdGEgKi8KLQotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIHF1ZXVlX2lkOwotCXVpbnQxNl90IGRlY19pZDsKLQl1aW50MzJfdCByZWFkX3B0cl9vZmZzZXQ7Ci0JaW50MTZfdCBzb3VyY2U7Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCXN0cnVjdCBhdWR3bWFfc3VzcGVuZF9jdGwgc3VzcGVuZF9jdGw7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLSNlbmRpZgotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfZXZlbnRfcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBldmVudF9xdWV1ZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF93YWl0OwotCXNwaW5sb2NrX3QgZXZlbnRfcXVldWVfbG9jazsKLQlzdHJ1Y3QgbXV0ZXggZ2V0X2V2ZW50X2xvY2s7Ci0JaW50IGV2ZW50X2Fib3J0OwotCS8qIEFWIHN5bmMgSW5mbyAqLwotCWludCBhdnN5bmNfZmxhZzsgICAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgZmVlZGJhY2sgZnJvbSBEU1AgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBhdnN5bmNfd2FpdDsvKiBXYWl0IHF1ZXVlIGZvciBBViBTeW5jIE1lc3NhZ2UgICAgICovCi0JLyogZmxhZ3MsIDQ4IGJpdHMgc2FtcGxlL2J5dGVzIGNvdW50ZXIgcGVyIGNoYW5uZWwgKi8KLQl1aW50MTZfdCBhdnN5bmNbQVVEUFBfQVZTWU5DX0NIX0NPVU5UICogQVVEUFBfQVZTWU5DX05VTV9XT1JEUyArIDFdOwotCi0JdWludDMyX3QgZGV2aWNlX2V2ZW50czsKLQotCWludCBlcV9lbmFibGU7Ci0JaW50IGVxX25lZWRzX2NvbW1pdDsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyIGVxOwotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfdm9sdW1lIHZvbF9wYW47Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaW5wdXRfYnVmZl9oYW5kbGU7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKm91dHB1dF9idWZmX2hhbmRsZTsKLX07Ci0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSk7Ci1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRwbGF5X3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpOwotc3RhdGljIHZvaWQgYXVkcGxheV9jb25maWdfaG9zdHBjbShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZHBsYXlfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRpb19kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpOwotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdGF0aWMgdm9pZCBhdWR3bWFfcG9zdF9ldmVudChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCk7Ci0jZW5kaWYKLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRpb19lbmFibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWlmIChhdWRpby0+ZW5hYmxlZCkKLQkJcmV0dXJuIDA7Ci0KLQlhdWRpby0+ZGVjX3N0YXRlID0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkU7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0KLQlpZiAobXNtX2Fkc3BfZW5hYmxlKGF1ZGlvLT5hdWRwbGF5KSkgewotCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRwbGF5KSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAoYXVkcHBfZW5hYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvX2RzcF9ldmVudCwgYXVkaW8pKSB7Ci0JCU1NX0VSUigiYXVkcHBfZW5hYmxlKCkgZmFpbGVkXG4iKTsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRpby0+YXVkcGxheSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWF1ZGlvLT5lbmFibGVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgd21hX2xpc3RuZXIodTMyIGV2dF9pZCwgdW5pb24gYXVkZGV2X2V2dF9kYXRhICpldnRfcGF5bG9hZCwKLQkJCXZvaWQgKnByaXZhdGVfZGF0YSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gKHN0cnVjdCBhdWRpbyAqKSBwcml2YXRlX2RhdGE7Ci0Jc3dpdGNoIChldnRfaWQpIHsKLQljYXNlIEFVRERFVl9FVlRfREVWX1JEWToKLQkJTU1fREJHKCI6QVVEREVWX0VWVF9ERVZfUkRZXG4iKTsKLQkJYXVkaW8tPnNvdXJjZSB8PSAoMHgxIDw8IGV2dF9wYXlsb2FkLT5yb3V0aW5nX2lkKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nID09IDEgJiYgYXVkaW8tPmVuYWJsZWQgPT0gMSkKLQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLCBhdWRpby0+c291cmNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURERVZfRVZUX0RFVl9STFM6Ci0JCU1NX0RCRygiOkFVRERFVl9FVlRfREVWX1JMU1xuIik7Ci0JCWF1ZGlvLT5zb3VyY2UgJj0gfigweDEgPDwgZXZ0X3BheWxvYWQtPnJvdXRpbmdfaWQpOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcgPT0gMSAmJiBhdWRpby0+ZW5hYmxlZCA9PSAxKQotCQkJYXVkcHBfcm91dGVfc3RyZWFtKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvLT5zb3VyY2UpOwotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEc6Ci0JCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IGV2dF9wYXlsb2FkLT5zZXNzaW9uX3ZvbDsKLQkJTU1fREJHKCI6QVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRywgc3RyZWFtIHZvbCAlZFxuIiwKLQkJCQlhdWRpby0+dm9sX3Bhbi52b2x1bWUpOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuLAotCQkJCQlQT1BQKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCI6RVJST1I6d3JvbmcgZXZlbnRcbiIpOwotCQlicmVhazsKLQl9Ci19Ci0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIGF1ZGlvLT5sb2NrIGhlbGQgKi8KLXN0YXRpYyBpbnQgYXVkaW9fZGlzYWJsZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCWludCByYyA9IDA7Ci0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQlhdWRpby0+ZGVjX3N0YXRlID0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkU7Ci0JCWF1ZGRlY19kc3BfY29uZmlnKGF1ZGlvLCAwKTsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+d2FpdCwKLQkJCQlhdWRpby0+ZGVjX3N0YXRlICE9IE1TTV9BVURfREVDT0RFUl9TVEFURV9OT05FLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoTVNNX0FVRF9ERUNPREVSX1dBSVRfTVMpKTsKLQkJaWYgKHJjID09IDApCi0JCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWVsc2UgaWYgKGF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX0NMT1NFKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkaW8tPmF1ZHBsYXkpOwotCQlhdWRwcF9kaXNhYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvKTsKLQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZHNwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHZvaWQgYXVkaW9fdXBkYXRlX3BjbV9idWZfZW50cnkoc3RydWN0IGF1ZGlvICphdWRpbywKLQl1aW50MzJfdCAqcGF5bG9hZCkKLXsKLQl1aW50OF90IGluZGV4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoYXVkaW8tPnJmbHVzaCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBheWxvYWRbMV07IGluZGV4KyspIHsKLQkJaWYgKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyID09Ci0JCQlwYXlsb2FkWzIgKyBpbmRleCAqIDJdKSB7Ci0JCQlNTV9EQkcoImF1ZGlvX3VwZGF0ZV9wY21fYnVmX2VudHJ5OiBcCi0JCQkJaW5bJWRdIHJlYWR5XG4iLCBhdWRpby0+ZmlsbF9uZXh0KTsKLQkJCWF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS51c2VkID0KLQkJCXBheWxvYWRbMyArIGluZGV4ICogMl07Ci0JCQlpZiAoKCsrYXVkaW8tPmZpbGxfbmV4dCkgPT0gYXVkaW8tPnBjbV9idWZfY291bnQpCi0JCQkJYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9FUlIoImF1ZGlvX3VwZGF0ZV9wY21fYnVmX2VudHJ5OiBcCi0JCQkJZXhwZWN0ZWQ9JXggcmV0PSV4XG4iLAotCQkJCWF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS5hZGRyLAotCQkJCXBheWxvYWRbMSArIGluZGV4ICogMl0pOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGF1ZGlvLT5pblthdWRpby0+ZmlsbF9uZXh0XS51c2VkID09IDApIHsKLQkJYXVkcGxheV9idWZmZXJfcmVmcmVzaChhdWRpbyk7Ci0JfSBlbHNlIHsKLQkJTU1fREJHKCJyZWFkIGNhbm5vdCBrZWVwIHVwXG4iKTsKLQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMTsKLQl9Ci0Jd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfZHNwX2V2ZW50KHZvaWQgKmRhdGEsIHVuc2lnbmVkIGlkLCBzaXplX3QgbGVuLAotCQkJICAgICAgdm9pZCAoKmdldGV2ZW50KSAodm9pZCAqcHRyLCBzaXplX3QgbGVuKSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZGF0YTsKLQl1aW50MzJfdCBtc2dbMjhdOwotCi0JZ2V0ZXZlbnQobXNnLCBzaXplb2YobXNnKSk7Ci0KLQlNTV9EQkcoIm1zZ19pZD0leFxuIiwgaWQpOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgQVVEUExBWV9NU0dfREVDX05FRURTX0RBVEE6Ci0JCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAxKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBMQVlfTVNHX0JVRkZFUl9VUERBVEU6Ci0JCWF1ZGlvX3VwZGF0ZV9wY21fYnVmX2VudHJ5KGF1ZGlvLCBtc2cpOwotCQlicmVhazsKLQotCWNhc2UgQURTUF9NRVNTQUdFX0lEOgotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6IG1vZHVsZSBlbmFibGUoYXVkcGxheXRhc2spXG4iKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlNTV9FUlIoInVuZXhwZWN0ZWQgbWVzc2FnZSBmcm9tIGRlY29kZXIgXG4iKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhdWRpb19kc3BfZXZlbnQodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgaWQsIHVpbnQxNl90ICptc2cpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IHByaXZhdGU7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQUF9NU0dfU1RBVFVTX01TRzp7Ci0JCQl1bnNpZ25lZCBzdGF0dXMgPSBtc2dbMV07Ci0KLQkJCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfU0xFRVA6IHsKLQkJCQl1aW50MTZfdCByZWFzb24gPSBtc2dbMl07Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czpzbGVlcCByZWFzb24gPSBcCi0JCQkJCQkweCUwNHhcbiIsIHJlYXNvbik7Ci0JCQkJaWYgKChyZWFzb24gPT0gQVVEUFBfTVNHX1JFQVNPTl9NRU0pCi0JCQkJCXx8IChyZWFzb24gPT0KLQkJCQkJQVVEUFBfTVNHX1JFQVNPTl9OT0RFQ09ERVIpKSB7Ci0JCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX0ZBSUxVUkU7Ci0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQl9IGVsc2UgaWYgKHJlYXNvbiA9PSBBVURQUF9NU0dfUkVBU09OX05PTkUpIHsKLQkJCQkJLyogZGVjb2RlciBpcyBpbiBkaXNhYmxlIHN0YXRlICovCi0JCQkJCWF1ZGlvLT5kZWNfc3RhdGUgPQotCQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX0NMT1NFOwotCQkJCQl3YWtlX3VwKCZhdWRpby0+d2FpdCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBBVURQUF9ERUNfU1RBVFVTX0lOSVQ6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogaW5pdFxuIik7Ci0JCQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCQkJCWF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKGF1ZGlvKTsKLQkJCQllbHNlCi0JCQkJCWF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoYXVkaW8pOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfQ0ZHOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IGNmZ1xuIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfUExBWToKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBwbGF5IFxuIik7Ci0JCQkJLyogc2VuZCAgbWl4ZXIgY29tbWFuZCAqLwotCQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLAotCQkJCQkJYXVkaW8tPnNvdXJjZSk7Ci0JCQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJCQkJYXVkcGxheV9jb25maWdfaG9zdHBjbShhdWRpbyk7Ci0JCQkJCWF1ZHBsYXlfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCQkJCX0KLQkJCQlhdWRpby0+ZGVjX3N0YXRlID0KLQkJCQkJTVNNX0FVRF9ERUNPREVSX1NUQVRFX1NVQ0NFU1M7Ci0JCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlNTV9FUlIoInVua25vd24gZGVjb2RlciBzdGF0dXNcbiIpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRFBQX01TR19DRkdfTVNHOgotCQlpZiAobXNnWzBdID09IEFVRFBQX01TR19FTkFfRU5BKSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgRU5BQkxFXG4iKTsKLQkJCWF1ZGRlY19kc3BfY29uZmlnKGF1ZGlvLCAxKTsKLQkJCWF1ZGlvLT5vdXRfbmVlZGVkID0gMDsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMTsKLQkJCWF1ZHBwX2RzcF9zZXRfdm9sX3BhbihhdWRpby0+ZGVjX2lkLCAmYXVkaW8tPnZvbF9wYW4sCi0JCQkJCVBPUFApOwotCQkJYXVkcHBfZHNwX3NldF9lcShhdWRpby0+ZGVjX2lkLCBhdWRpby0+ZXFfZW5hYmxlLAotCQkJCQkmYXVkaW8tPmVxLCBQT1BQKTsKLQkJfSBlbHNlIGlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9ESVMpIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyBESVNBQkxFXG4iKTsKLQkJCWF1ZGlvLT5ydW5uaW5nID0gMDsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygiQ0ZHX01TRyAlZD9cbiIsIG1zZ1swXSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfUk9VVElOR19BQ0s6Ci0JCU1NX0RCRygiUk9VVElOR19BQ0sgbW9kZT0lZFxuIiwgbXNnWzFdKTsKLQkJYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhhdWRpbyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURQUF9NU0dfRkxVU0hfQUNLOgotCQlNTV9EQkcoIkZMVVNIX0FDS1xuIik7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJCWF1ZHBsYXlfYnVmZmVyX3JlZnJlc2goYXVkaW8pOwotCQlicmVhazsKLQotCWNhc2UgQVVEUFBfTVNHX1BDTURNQU1JU1NFRDoKLQkJTU1fREJHKCJQQ01ETUFNSVNTRURcbiIpOwotCQlhdWRpby0+dGVvcyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBQX01TR19BVlNZTkNfTVNHOgotCQlNTV9EQkcoIkFVRFBQX01TR19BVlNZTkNfTVNHXG4iKTsKLQkJbWVtY3B5KCZhdWRpby0+YXZzeW5jWzBdLCBtc2csIHNpemVvZihhdWRpby0+YXZzeW5jKSk7Ci0JCWF1ZGlvLT5hdnN5bmNfZmxhZyA9IDE7Ci0JCXdha2VfdXAoJmF1ZGlvLT5hdnN5bmNfd2FpdCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJTU1fRVJSKCJVTktOT1dOICglZClcbiIsIGlkKTsKLQl9Ci0KLX0KLQotc3RhdGljIHN0cnVjdCBtc21fYWRzcF9vcHMgYXVkcGxheV9hZHNwX29wc193bWEgPSB7Ci0JLmV2ZW50ID0gYXVkcGxheV9kc3BfZXZlbnQsCi19OwotCi0jZGVmaW5lIGF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sIGNtZCwgbGVuKSBcCi0JbXNtX2Fkc3Bfd3JpdGUoYXVkaW8tPmF1ZHBsYXksIGF1ZGlvLT5xdWV1ZV9pZCwgXAotCQkJY21kLCBsZW4pCi0KLXN0YXRpYyBpbnQgYXVkZGVjX2RzcF9jb25maWcoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19kZWNfdHlwZSBjZmdfZGVjX2NtZDsKLQotCW1lbXNldCgmY2ZnX2RlY19jbWQsIDAsIHNpemVvZihjZmdfZGVjX2NtZCkpOwotCi0JY2ZnX2RlY19jbWQuY21kX2lkID0gQVVEUFBfQ01EX0NGR19ERUNfVFlQRTsKLQlpZiAoZW5hYmxlKQotCQljZmdfZGVjX2NtZC5kZWNfY2ZnID0gQVVEUFBfQ01EX1VQREFUREVfQ0ZHX0RFQyB8Ci0JCQkJQVVEUFBfQ01EX0VOQV9ERUNfViB8IEFVRERFQ19ERUNfV01BOwotCWVsc2UKLQkJY2ZnX2RlY19jbWQuZGVjX2NmZyA9IEFVRFBQX0NNRF9VUERBVERFX0NGR19ERUMgfAotCQkJCUFVRFBQX0NNRF9ESVNfREVDX1Y7Ci0JY2ZnX2RlY19jbWQuZG1fbW9kZSA9IDB4MDsKLQljZmdfZGVjX2NtZC5zdHJlYW1faWQgPSBhdWRpby0+ZGVjX2lkOwotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMSgmY2ZnX2RlY19jbWQsIHNpemVvZihjZmdfZGVjX2NtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfd21hIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNvbW1vbi5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TOwotCWNtZC5jb21tb24ubGVuZ3RoID0gQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNU19XTUFfTEVOOwotCWNtZC5jb21tb24uZGVjX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuY29tbW9uLmlucHV0X3NhbXBsaW5nX2ZyZXF1ZW5jeSA9IGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGU7Ci0KLQkvKgotCSAqIFRlc3QgZG9uZSBmb3Igc2FtcGxlIHdpdGggdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uCi0JICogYXJtZGF0YXJlcXRociAJPSAxMjYyCi0JICogY2hhbm5lbHNkZWNvZGVkIAk9IDEoTU9OTykvMihTVEVSRU8pCi0JICogd21hYnl0ZXNwZXJzZWMgCT0gVGVzdGVkIHdpdGggNjAwMyBCeXRlcyBwZXIgc2VjCi0JICogd21hc2FtcGxpbmdmcmVxCT0gNDQxMDAKLQkgKiB3bWFlbmNvZGVyb3B0cwk9IDMxCi0JICovCi0KLQljbWQuYXJtZGF0YXJlcXRociA9IGF1ZGlvLT53bWFfY29uZmlnLmFybWRhdGFyZXF0aHI7Ci0JY21kLmNoYW5uZWxzZGVjb2RlZCA9IGF1ZGlvLT53bWFfY29uZmlnLmNoYW5uZWxzZGVjb2RlZDsKLQljbWQud21hYnl0ZXNwZXJzZWMgPSBhdWRpby0+d21hX2NvbmZpZy53bWFieXRlc3BlcnNlYzsKLQljbWQud21hc2FtcGxpbmdmcmVxID0gYXVkaW8tPndtYV9jb25maWcud21hc2FtcGxpbmdmcmVxOwotCWNtZC53bWFlbmNvZGVyb3B0cyA9IGF1ZGlvLT53bWFfY29uZmlnLndtYWVuY29kZXJvcHRzOwotCi0JYXVkcHBfc2VuZF9xdWV1ZTIoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX3JvdXRpbmdfbW9kZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwcF9jbWRfcm91dGluZ19tb2RlIGNtZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUFBfQ01EX1JPVVRJTkdfTU9ERTsKLQljbWQub2JqZWN0X251bWJlciA9IGF1ZGlvLT5kZWNfaWQ7Ci0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfRlRSVDsKLQllbHNlCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfUlQ7Ci0KLQlhdWRwcF9zZW5kX3F1ZXVlMSgmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfYnVmZmVyX3JlZnJlc2ggcmVmcmVzaF9jbWQ7Ci0KLQlyZWZyZXNoX2NtZC5jbWRfaWQgPSBBVURQTEFZX0NNRF9CVUZGRVJfUkVGUkVTSDsKLQlyZWZyZXNoX2NtZC5udW1fYnVmZmVycyA9IDE7Ci0JcmVmcmVzaF9jbWQuYnVmMF9hZGRyZXNzID0gYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHI7Ci0JcmVmcmVzaF9jbWQuYnVmMF9sZW5ndGggPSBhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uc2l6ZTsKLQlyZWZyZXNoX2NtZC5idWZfcmVhZF9jb3VudCA9IDA7Ci0KLQlNTV9EQkcoImJ1ZjBfYWRkcj0leCBidWYwX2xlbj0lZFxuIiwKLQkJCXJlZnJlc2hfY21kLmJ1ZjBfYWRkcmVzcywKLQkJCXJlZnJlc2hfY21kLmJ1ZjBfbGVuZ3RoKTsKLQotCSh2b2lkKWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZyZWZyZXNoX2NtZCwgc2l6ZW9mKHJlZnJlc2hfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfY29uZmlnX2hvc3RwY20oc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfaHBjbV9idWZfY2ZnIGNmZ19jbWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWNmZ19jbWQuY21kX2lkID0gQVVEUExBWV9DTURfSFBDTV9CVUZfQ0ZHOwotCWNmZ19jbWQubWF4X2J1ZmZlcnMgPSBhdWRpby0+cGNtX2J1Zl9jb3VudDsKLQljZmdfY21kLmJ5dGVfc3dhcCA9IDA7Ci0JY2ZnX2NtZC5ob3N0cGNtX2NvbmZpZyA9ICgweDgwMDApIHwgKDB4NDAwMCk7Ci0JY2ZnX2NtZC5mZWVkYmFja19mcmVxdWVuY3kgPSAxOwotCWNmZ19jbWQucGFydGl0aW9uX251bWJlciA9IDA7Ci0KLQkodm9pZClhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY2ZnX2NtZCwgc2l6ZW9mKGNmZ19jbWQpKTsKLX0KLQotCi1zdGF0aWMgaW50IGF1ZHBsYXlfZHNwX3NlbmRfZGF0YV9hdmFpbChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQkJCQl1bnNpZ25lZCBpZHgsIHVuc2lnbmVkIGxlbikKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfYml0c3RyZWFtX2RhdGFfYXZhaWxfbnQyIGNtZDsKLQotCWNtZC5jbWRfaWQJCT0gQVVEUExBWV9DTURfQklUU1RSRUFNX0RBVEFfQVZBSUxfTlQyOwotCWlmICghYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJY21kLmRlY29kZXJfaWQgPSAwOwotCWVsc2UgewotCQlpZiAoYXVkaW8tPm1maWVsZCkKLQkJCWNtZC5kZWNvZGVyX2lkID0gQVVEV01BX01FVEFGSUVMRF9NQVNLIHwKLQkJCShhdWRpby0+b3V0W2lkeF0ubWZpZWxkX3N6ID4+IDEpOwotCQllbHNlCi0JCQljbWQuZGVjb2Rlcl9pZAkJPSBhdWRpby0+ZGVjX2lkOwotCX0KLQljbWQuYnVmX3B0cgkJPSBhdWRpby0+b3V0W2lkeF0uYWRkcjsKLQljbWQuYnVmX3NpemUJCT0gbGVuLzI7Ci0JY21kLnBhcnRpdGlvbl9udW1iZXIJPSAwOwotCXJldHVybiBhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfc2VuZF9kYXRhKHN0cnVjdCBhdWRpbyAqYXVkaW8sIHVuc2lnbmVkIG5lZWRlZCkKLXsKLQlzdHJ1Y3QgYnVmZmVyICpmcmFtZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCWlmICghYXVkaW8tPnJ1bm5pbmcpCi0JCWdvdG8gZG9uZTsKLQotCWlmIChhdWRpby0+d2ZsdXNoKSB7Ci0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChuZWVkZWQgJiYgIWF1ZGlvLT53Zmx1c2gpIHsKLQkJLyogV2Ugd2VyZSBjYWxsZWQgZnJvbSB0aGUgY2FsbGJhY2sgYmVjYXVzZSB0aGUgRFNQCi0JCSAqIHJlcXVlc3RlZCBtb3JlIGRhdGEuICBOb3RlIHRoYXQgdGhlIERTUCBkb2VzIHdhbnQKLQkJICogbW9yZSBkYXRhLCBhbmQgaWYgYSBidWZmZXIgd2FzIGluLWZsaWdodCwgbWFyayBpdAotCQkgKiBhcyBhdmFpbGFibGUgKHNpbmNlIHRoZSBEU1AgbXVzdCBub3cgYmUgZG9uZSB3aXRoCi0JCSAqIGl0KS4KLQkJICovCi0JCWF1ZGlvLT5vdXRfbmVlZGVkID0gMTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZikgewotCQkJTU1fREJHKCJmcmFtZSAlZCBmcmVlXG4iLCBhdWRpby0+b3V0X3RhaWwpOwotCQkJZnJhbWUtPnVzZWQgPSAwOwotCQkJYXVkaW8tPm91dF90YWlsIF49IDE7Ci0JCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCX0KLQl9Ci0KLQlpZiAoYXVkaW8tPm91dF9uZWVkZWQpIHsKLQkJLyogSWYgdGhlIERTUCBjdXJyZW50bHkgd2FudHMgZGF0YSBhbmQgd2UgaGF2ZSBhCi0JCSAqIGJ1ZmZlciBhdmFpbGFibGUsIHdlIHdpbGwgc2VuZCBpdCBhbmQgcmVzZXQKLQkJICogdGhlIG5lZWRlZCBmbGFnLiAgV2UnbGwgbWFyayB0aGUgYnVmZmVyIGFzIGluLWZsaWdodAotCQkgKiBzbyB0aGF0IGl0IHdvbid0IGJlIHJlY3ljbGVkIHVudGlsIHRoZSBuZXh0IGJ1ZmZlcgotCQkgKiBpcyByZXF1ZXN0ZWQKLQkJICovCi0KLQkJTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF90YWlsOwotCQlpZiAoZnJhbWUtPnVzZWQpIHsKLQkJCUJVR19PTihmcmFtZS0+dXNlZCA9PSAweGZmZmZmZmZmKTsKLQkJCU1NX0RCRygiZnJhbWUgJWQgYnVzeVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJCWF1ZHBsYXlfZHNwX3NlbmRfZGF0YV9hdmFpbChhdWRpbywgYXVkaW8tPm91dF90YWlsLAotCQkJCQkJCQlmcmFtZS0+dXNlZCk7Ci0JCQlmcmFtZS0+dXNlZCA9IDB4ZmZmZmZmZmY7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCX0KLQl9Ci1kb25lOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIGRldmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHZvaWQgYXVkaW9fZmx1c2goc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlhdWRpby0+b3V0WzBdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRbMV0udXNlZCA9IDA7Ci0JYXVkaW8tPm91dF9oZWFkID0gMDsKLQlhdWRpby0+b3V0X3RhaWwgPSAwOwotCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9ieXRlcywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2ZsdXNoX3BjbV9idWYoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQl1aW50OF90IGluZGV4OwotCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUENNX0JVRl9NQVhfQ09VTlQ7IGluZGV4KyspCi0JCWF1ZGlvLT5pbltpbmRleF0udXNlZCA9IDA7Ci0JYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQlhdWRpby0+cmVhZF9uZXh0ID0gMDsKLQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLX0KLQotc3RhdGljIHZvaWQgYXVkaW9faW9wb3J0X3Jlc2V0KHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JLyogTWFrZSBzdXJlIHJlYWQvd3JpdGUgdGhyZWFkIGFyZSBmcmVlIGZyb20KLQkgKiBzbGVlcCBhbmQga25vd2luZyB0aGF0IHN5c3RlbSBpcyBub3QgYWJsZQotCSAqIHRvIHByb2Nlc3MgaW8gcmVxdWVzdCBhdCB0aGUgbW9tZW50Ci0JICovCi0Jd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlhdWRpb19mbHVzaChhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JYXVkaW9fZmx1c2hfcGNtX2J1ZihhdWRpbyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAxOwotCXdha2VfdXAoJmF1ZGlvLT5hdnN5bmNfd2FpdCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkd21hX2V2ZW50c19wZW5kaW5nKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZW1wdHk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQllbXB0eSA9ICFsaXN0X2VtcHR5KCZhdWRpby0+ZXZlbnRfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGVtcHR5IHx8IGF1ZGlvLT5ldmVudF9hYm9ydDsKLX0KLQotc3RhdGljIHZvaWQgYXVkd21hX3Jlc2V0X2V2ZW50X3F1ZXVlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYXVkd21hX2V2ZW50ICpkcnZfZXZ0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmV2ZW50X3F1ZXVlKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZHdtYV9ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQkJa2ZyZWUoZHJ2X2V2dCk7Ci0JfQotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUsCi0JCQkJc3RydWN0IGF1ZHdtYV9ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZkcnZfZXZ0LT5saXN0KTsKLQkJa2ZyZWUoZHJ2X2V2dCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBsb25nIGF1ZHdtYV9wcm9jZXNzX2V2ZW50X3JlcShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB2b2lkIF9fdXNlciAqYXJnKQotewotCWxvbmcgcmM7Ci0Jc3RydWN0IG1zbV9hdWRpb19ldmVudCB1c3JfZXZ0OwotCXN0cnVjdCBhdWR3bWFfZXZlbnQgKmRydl9ldnQgPSBOVUxMOwotCWludCB0aW1lb3V0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnVzcl9ldnQsIGFyZywgc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fZXZlbnQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQl0aW1lb3V0ID0gKGludCkgdXNyX2V2dC50aW1lb3V0X21zOwotCi0JaWYgKHRpbWVvdXQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCi0JCQkJYXVkaW8tPmV2ZW50X3dhaXQsIGF1ZHdtYV9ldmVudHNfcGVuZGluZyhhdWRpbyksCi0JCQkJbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7Ci0JCWlmIChyYyA9PSAwKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JfSBlbHNlIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCi0JCQlhdWRpby0+ZXZlbnRfd2FpdCwgYXVkd21hX2V2ZW50c19wZW5kaW5nKGF1ZGlvKSk7Ci0JfQotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGF1ZGlvLT5ldmVudF9hYm9ydCkgewotCQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAwOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyYyA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSkpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkd21hX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCX0KLQotCWlmIChkcnZfZXZ0KSB7Ci0JCXVzcl9ldnQuZXZlbnRfdHlwZSA9IGRydl9ldnQtPmV2ZW50X3R5cGU7Ci0JCXVzcl9ldnQuZXZlbnRfcGF5bG9hZCA9IGRydl9ldnQtPnBheWxvYWQ7Ci0JCWxpc3RfYWRkX3RhaWwoJmRydl9ldnQtPmxpc3QsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JfSBlbHNlCi0JCXJjID0gLTE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghcmMgJiYgY29weV90b191c2VyKGFyZywgJnVzcl9ldnQsIHNpemVvZih1c3JfZXZ0KSkpCi0JCXJjID0gLUVGQVVMVDsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19lbmFibGVfZXEoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlpZiAoYXVkaW8tPmVxX2VuYWJsZSA9PSBlbmFibGUgJiYgIWF1ZGlvLT5lcV9uZWVkc19jb21taXQpCi0JCXJldHVybiAwOwotCi0JYXVkaW8tPmVxX2VuYWJsZSA9IGVuYWJsZTsKLQotCWlmIChhdWRpby0+cnVubmluZykgewotCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsIGVuYWJsZSwgJmF1ZGlvLT5lcSwgUE9QUCk7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19nZXRfYXZzeW5jX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJCQkJCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgKnN0YXRzKQotewotCWludCByYyA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAoYXVkaW8tPmRlY19pZCA9PSBhdWRpby0+YXZzeW5jWzBdICYmIGF1ZGlvLT5hdnN5bmNfZmxhZykgewotCQkvKiBhdl9zeW5jIHNhbXBsZSBjb3VudCAqLwotCQlzdGF0cy0+c2FtcGxlX2NvdW50ID0gKGF1ZGlvLT5hdnN5bmNbMl0gPDwgMTYpIHwKLQkJCQkJCShhdWRpby0+YXZzeW5jWzNdKTsKLQotCQkvKiBhdl9zeW5jIGJ5dGVfY291bnQgKi8KLQkJc3RhdHMtPmJ5dGVfY291bnQgPSAoYXVkaW8tPmF2c3luY1s1XSA8PCAxNikgfAotCQkJCQkJKGF1ZGlvLT5hdnN5bmNbNl0pOwotCi0JCWF1ZGlvLT5hdnN5bmNfZmxhZyA9IDA7Ci0JCXJjID0gMDsKLQl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiByYzsKLQotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXVpbnQxNl90IGVuYWJsZV9tYXNrOwotCWludCBlbmFibGU7Ci0JaW50IHByZXZfc3RhdGU7Ci0JdW5zaWduZWQgbG9uZyBpb25mbGFnID0gMDsKLQlpb25fcGh5c19hZGRyX3QgYWRkciA9IDA7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSA9IE5VTEw7Ci0JaW50IGxlbiA9IDA7Ci0KLQlNTV9EQkcoImNtZCA9ICVkXG4iLCBjbWQpOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfU1RBVFMpIHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyBzdGF0czsKLQotCQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAwOwotCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKLQkJaWYgKGF1ZHBwX3F1ZXJ5X2F2c3luYyhhdWRpby0+ZGVjX2lkKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+YXZzeW5jX3dhaXQsCi0JCQkJKGF1ZGlvLT5hdnN5bmNfZmxhZyA9PSAxKSwKLQkJCQltc2Vjc190b19qaWZmaWVzKEFVRFBQX0FWU1lOQ19FVkVOVF9USU1FT1VUKSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJZWxzZSBpZiAoKHJjID4gMCkgfHwgKChyYyA9PSAwKSAmJiAoYXVkaW8tPmF2c3luY19mbGFnID09IDEpKSkgewotCQkJaWYgKGF1ZGlvX2dldF9hdnN5bmNfZGF0YShhdWRpbywgJnN0YXRzKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0VOQUJMRV9BVURQUDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZlbmFibGVfbWFzaywgKHZvaWQgKikgYXJnLAotCQkJCQkJc2l6ZW9mKGVuYWJsZV9tYXNrKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQllbmFibGUgPSAoZW5hYmxlX21hc2sgJiBFUV9FTkFCTEUpID8gMSA6IDA7Ci0JCWF1ZGlvX2VuYWJsZV9lcShhdWRpbywgZW5hYmxlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfUEFOOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnBhbiA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfRVE6Ci0JCXByZXZfc3RhdGUgPSBhdWRpby0+ZXFfZW5hYmxlOwotCQlhdWRpby0+ZXFfZW5hYmxlID0gMDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhdWRpby0+ZXEubnVtX2JhbmRzLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGF1ZGlvLT5lcSkgLQotCQkJCShBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfQ09NTU9OX0xFTiArIDIpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPmVxX2VuYWJsZSA9IHByZXZfc3RhdGU7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAxOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCWlmICgtRUlOVkFMICE9IHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9FVkVOVCkgewotCQlNTV9EQkcoIkFVRElPX0dFVF9FVkVOVFxuIik7Ci0JCWlmIChtdXRleF90cnlsb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spKSB7Ci0JCQlyYyA9IGF1ZHdtYV9wcm9jZXNzX2V2ZW50X3JlcShhdWRpbywKLQkJCQkJKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCQltdXRleF91bmxvY2soJmF1ZGlvLT5nZXRfZXZlbnRfbG9jayk7Ci0JCX0gZWxzZQotCQkJcmMgPSAtRUJVU1k7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlpZiAoY21kID09IEFVRElPX0FCT1JUX0dFVF9FVkVOVCkgewotCQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0JCXJldHVybiAwOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6Ci0JCU1NX0RCRygiQVVESU9fU1RBUlRcbiIpOwotCQlyYyA9IGF1ZGlvX2VuYWJsZShhdWRpbyk7Ci0JCWlmICghcmMpIHsKLQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXQsCi0JCQkJYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORSwKLQkJCQltc2Vjc190b19qaWZmaWVzKE1TTV9BVURfREVDT0RFUl9XQUlUX01TKSk7Ci0JCQlNTV9JTkZPKCJkZWNfc3RhdGUgJWQgcmMgPSAlZFxuIiwgYXVkaW8tPmRlY19zdGF0ZSwgcmMpOwotCi0JCQlpZiAoYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfU1VDQ0VTUykKLQkJCQlyYyA9IC1FTk9ERVY7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU1RPUDoKLQkJTU1fREJHKCJBVURJT19TVE9QXG4iKTsKLQkJcmMgPSBhdWRpb19kaXNhYmxlKGF1ZGlvKTsKLQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQlhdWRpb19pb3BvcnRfcmVzZXQoYXVkaW8pOwotCQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fRkxVU0g6Ci0JCU1NX0RCRygiQVVESU9fRkxVU0hcbiIpOwotCQlhdWRpby0+cmZsdXNoID0gMTsKLQkJYXVkaW8tPndmbHVzaCA9IDE7Ci0JCWF1ZGlvX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWlmIChhdWRpby0+cnVubmluZykgewotCQkJYXVkcHBfZmx1c2goYXVkaW8tPmRlY19pZCk7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkhYXVkaW8tPndmbHVzaCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJTU1fRVJSKCJBVURJT19GTFVTSCBpbnRlcnJ1cHRlZFxuIik7Ci0JCQkJcmMgPSAtRUlOVFI7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjb25maWc7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY29uZmlnLCAodm9pZCAqKSBhcmcsIHNpemVvZihjb25maWcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvbmZpZy5jaGFubmVsX2NvdW50ID09IDEpIHsKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gQVVEUFBfQ01EX1BDTV9JTlRGX01PTk9fVjsKLQkJfSBlbHNlIGlmIChjb25maWcuY2hhbm5lbF9jb3VudCA9PSAyKSB7Ci0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IEFVRFBQX0NNRF9QQ01fSU5URl9TVEVSRU9fVjsKLQkJfSBlbHNlIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWF1ZGlvLT5tZmllbGQgPSBjb25maWcubWV0YV9maWVsZDsKLQkJYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLQkJYXVkaW8tPm91dF9jaGFubmVsX21vZGUgPSBjb25maWcuY2hhbm5lbF9jb3VudDsKLQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gKGF1ZGlvLT5vdXRfZG1hX3N6ID4+IDEpOwotCQljb25maWcuYnVmZmVyX2NvdW50ID0gMjsKLQkJY29uZmlnLnNhbXBsZV9yYXRlID0gYXVkaW8tPm91dF9zYW1wbGVfcmF0ZTsKLQkJaWYgKGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID09IEFVRFBQX0NNRF9QQ01fSU5URl9NT05PX1YpCi0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JCWVsc2UKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gMjsKLQkJY29uZmlnLm1ldGFfZmllbGQgPSAwOwotCQljb25maWcudW51c2VkWzBdID0gMDsKLQkJY29uZmlnLnVudXNlZFsxXSA9IDA7Ci0JCWNvbmZpZy51bnVzZWRbMl0gPSAwOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX1dNQV9DT05GSUc6ewotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmF1ZGlvLT53bWFfY29uZmlnLAotCQkJCXNpemVvZihhdWRpby0+d21hX2NvbmZpZykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fU0VUX1dNQV9DT05GSUc6ewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3dtYV9jb25maWcgdXNyX2NvbmZpZzsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIKLQkJCSgmdXNyX2NvbmZpZywgKHZvaWQgKilhcmcsCi0JCQlzaXplb2YodXNyX2NvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWF1ZGlvLT53bWFfY29uZmlnID0gdXNyX2NvbmZpZzsKLQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfUENNX0NPTkZJRzp7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX3BjbV9jb25maWcgY29uZmlnOwotCQkJY29uZmlnLnBjbV9mZWVkYmFjayA9IGF1ZGlvLT5wY21fZmVlZGJhY2s7Ci0JCQljb25maWcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9NQVhfQ09VTlQ7Ci0JCQljb25maWcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNvbmZpZywKLQkJCQkJIHNpemVvZihjb25maWcpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX1NFVF9QQ01fQ09ORklHOnsKLQkJCXN0cnVjdCBtc21fYXVkaW9fcGNtX2NvbmZpZyBjb25maWc7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIKLQkJCSAgICAoJmNvbmZpZywgKHZvaWQgKilhcmcsIHNpemVvZihjb25maWcpKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjb25maWcucGNtX2ZlZWRiYWNrICE9IGF1ZGlvLT5wY21fZmVlZGJhY2spIHsKLQkJCQlNTV9FUlIoIk5vdCBzdWZmaWNpZW50IHBlcm1pc3Npb24gdG8iCi0JCQkJCSAiY2hhbmdlIHRoZSBwbGF5YmFjayBtb2RlXG4iKTsKLQkJCQlyYyA9IC1FQUNDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoKGNvbmZpZy5idWZmZXJfY291bnQgPiBQQ01fQlVGX01BWF9DT1VOVCkgfHwKLQkJCSAgICAoY29uZmlnLmJ1ZmZlcl9jb3VudCA9PSAxKSkKLQkJCQljb25maWcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9NQVhfQ09VTlQ7Ci0KLQkJCWlmIChjb25maWcuYnVmZmVyX3NpemUgPCBQQ01fQlVGU1pfTUlOKQotCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47Ci0KLQkJCS8qIENoZWNrIGlmIHBjbSBmZWVkYmFjayBpcyByZXF1aXJlZCAqLwotCQkJaWYgKChjb25maWcucGNtX2ZlZWRiYWNrKSAmJiAoIWF1ZGlvLT5yZWFkX2RhdGEpKSB7Ci0JCQkJTU1fREJHKCJhbGxvY2F0ZSBQQ00gYnVmZmVyICVkXG4iLAotCQkJCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCAqCi0JCQkJCQljb25maWcuYnVmZmVyX3NpemUpOwotCQkJCWhhbmRsZSA9IGlvbl9hbGxvYyhhdWRpby0+Y2xpZW50LAotCQkJCQkoY29uZmlnLmJ1ZmZlcl9zaXplICoKLQkJCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCksCi0JCQkJCVNaXzRLLCBJT05fSEVBUChJT05fQVVESU9fSEVBUF9JRCksIDApOwotCQkJCWlmIChJU19FUlJfT1JfTlVMTChoYW5kbGUpKSB7Ci0JCQkJCU1NX0VSUigiVW5hYmxlIHRvIGFsbG9jIEkvUCBidWZmc1xuIik7Ci0JCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlID0gaGFuZGxlOwotCi0JCQkJcmMgPSBpb25fcGh5cyhhdWRpby0+Y2xpZW50ICwKLQkJCQkJaGFuZGxlLCAmYWRkciwgJmxlbik7Ci0JCQkJaWYgKHJjKSB7Ci0JCQkJCU1NX0VSUigiSW52YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCQkJCSh1bnNpZ25lZCBpbnQpIGFkZHIsCi0JCQkJCQkodW5zaWduZWQgaW50KSBsZW4pOwotCQkJCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBoYW5kbGUpOwotCQkJCQlhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgPSBOVUxMOwotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU1NX0lORk8oIkdvdCB2YWxpZCBwaHk6ICV4IHN6OiAleFxuIiwKLQkJCQkJCSh1bnNpZ25lZCBpbnQpIGF1ZGlvLT5yZWFkX3BoeXMsCi0JCQkJCQkodW5zaWduZWQgaW50KSBsZW4pOwotCQkJCX0KLQkJCQlhdWRpby0+cmVhZF9waHlzID0gKGludDMyX3QpYWRkcjsKLQotCQkJCXJjID0gaW9uX2hhbmRsZV9nZXRfZmxhZ3MoYXVkaW8tPmNsaWVudCwKLQkJCQkJaGFuZGxlLCAmaW9uZmxhZyk7Ci0JCQkJaWYgKHJjKSB7Ci0JCQkJCU1NX0VSUigiY291bGQgbm90IGdldCBmbGFnc1xuIik7Ci0JCQkJCWlvbl9mcmVlKGF1ZGlvLT5jbGllbnQsIGhhbmRsZSk7Ci0JCQkJCWF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSA9IE5VTEw7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJYXVkaW8tPm1hcF92X3JlYWQgPSBpb25fbWFwX2tlcm5lbCgKLQkJCQkJYXVkaW8tPmNsaWVudCwgaGFuZGxlKTsKLQkJCQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl9yZWFkKSkgewotCQkJCQlNTV9FUlIoIm1hcCBvZiByZWFkIGJ1ZiBmYWlsZWRcbiIpOwotCQkJCQlpb25fZnJlZShhdWRpby0+Y2xpZW50LCBoYW5kbGUpOwotCQkJCQlhdWRpby0+aW5wdXRfYnVmZl9oYW5kbGUgPSBOVUxMOwotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdWludDhfdCBpbmRleDsKLQkJCQkJdWludDMyX3Qgb2Zmc2V0ID0gMDsKLQkJCQkJYXVkaW8tPnJlYWRfZGF0YSA9Ci0JCQkJCQlhdWRpby0+bWFwX3ZfcmVhZDsKLQkJCQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQkJCQkJYXVkaW8tPnBjbV9idWZfY291bnQgPQotCQkJCQkgICAgY29uZmlnLmJ1ZmZlcl9jb3VudDsKLQkJCQkJYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JCQkJCWF1ZGlvLT5maWxsX25leHQgPSAwOwotCi0JCQkJCWZvciAoaW5kZXggPSAwOwotCQkJCQkgICAgIGluZGV4IDwgY29uZmlnLmJ1ZmZlcl9jb3VudDsKLQkJCQkJICAgICBpbmRleCsrKSB7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLmRhdGEgPQotCQkJCQkJICAgIGF1ZGlvLT5yZWFkX2RhdGEgKyBvZmZzZXQ7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLmFkZHIgPQotCQkJCQkJICAgIGF1ZGlvLT5yZWFkX3BoeXMgKyBvZmZzZXQ7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLnNpemUgPQotCQkJCQkJICAgIGNvbmZpZy5idWZmZXJfc2l6ZTsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0udXNlZCA9IDA7Ci0JCQkJCQlvZmZzZXQgKz0gY29uZmlnLmJ1ZmZlcl9zaXplOwotCQkJCQl9Ci0JCQkJCU1NX0RCRygicmVhZCBidWY6IHBoeSBhZGRyIFwKLQkJCQkJCTB4JTA4eCBrZXJuZWwgYWRkciAweCUwOHhcbiIsCi0JCQkJCQlhdWRpby0+cmVhZF9waHlzLAotCQkJCQkJKGludClhdWRpby0+cmVhZF9kYXRhKTsKLQkJCQkJcmMgPSAwOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmMgPSAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX1BBVVNFOgotCQlNTV9EQkcoIkFVRElPX1BBVVNFICVsZFxuIiwgYXJnKTsKLQkJcmMgPSBhdWRwcF9wYXVzZShhdWRpby0+ZGVjX2lkLCAoaW50KSBhcmcpOwotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9TRVNTSU9OX0lEOgotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmF1ZGlvLT5kZWNfaWQsCi0JCQkJCXNpemVvZih1bnNpZ25lZCBzaG9ydCkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKiBPbmx5IHVzZWZ1bCBpbiB0dW5uZWwtbW9kZSAqLwotc3RhdGljIGludCBhdWRpb19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHBwb3MxLCBsb2ZmX3QgcHBvczIsIGludCBkYXRhc3luYykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCi0JaWYgKCFhdWRpby0+cnVubmluZyB8fCBhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lX25vbG9jazsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKCFhdWRpby0+b3V0WzBdLnVzZWQgJiYKLQkJIWF1ZGlvLT5vdXRbMV0udXNlZCAmJgotCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChhdWRpby0+cmVzZXJ2ZWQpIHsKLQkJTU1fREJHKCJzZW5kIHJlc2VydmVkIGJ5dGVcbiIpOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMF0gPSBhdWRpby0+cnN2X2J5dGU7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMV0gPSAwOwotCQlmcmFtZS0+dXNlZCA9IDI7Ci0JCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCSghYXVkaW8tPm91dFswXS51c2VkICYmCi0JCQkhYXVkaW8tPm91dFsxXS51c2VkICYmCi0JCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gZG9uZTsKLQkJZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQkvKiBwY20gZG1hbWlzcyBtZXNzYWdlIGlzIHNlbnQgY29udGlub3VzbHkKLQkgKiB3aGVuIGRlY29kZXIgaXMgc3RhcnZlZCBzbyBubyByYWNlCi0JICogY29uZGl0aW9uIGNvbmNlcm4KLQkgKi8KLQlhdWRpby0+dGVvcyA9IDA7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJYXVkaW8tPnRlb3MgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAoYXVkaW8tPndmbHVzaCkKLQkJcmMgPSAtRUJVU1k7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci1kb25lX25vbG9jazoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCSAgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0JaW50IHJjID0gMDsKLQotCWlmICghYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJcmV0dXJuIDA7IC8qIFBDTSBmZWVkYmFjayBpcyBub3QgZW5hYmxlZC4gTm90aGluZyB0byByZWFkICovCi0KLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlNTV9EQkcoIiVkIFxuIiwgY291bnQpOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPnJlYWRfd2FpdCwKLQkJCShhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCA+IDApIHx8Ci0JCQkoYXVkaW8tPnN0b3BwZWQpIHx8IChhdWRpby0+cmZsdXNoKSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCi0JCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+cmZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvdW50IDwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQpIHsKLQkJCS8qIFJlYWQgbXVzdCBoYXBwZW4gaW4gZnJhbWUgYm91bmRhcnkuIFNpbmNlIGRyaXZlcgotCQkJICAgZG9lcyBub3Qga25vdyBmcmFtZSBzaXplLCByZWFkIGNvdW50IG11c3QgYmUgZ3JlYXRlcgotCQkJICAgb3IgZXF1YWwgdG8gc2l6ZSBvZiBQQ00gc2FtcGxlcyAqLwotCQkJTU1fREJHKCJhdWRpb19yZWFkOiBubyBwYXJ0aWFsIGZyYW1lIGRvbmUgcmVhZGluZ1xuIik7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygiYXVkaW9fcmVhZDogcmVhZCBmcm9tIGluWyVkXVxuIiwKLQkJCQkJYXVkaW8tPnJlYWRfbmV4dCk7Ci0JCQlpZiAoY29weV90b191c2VyCi0JCQkgICAgKGJ1ZiwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLmRhdGEsCi0JCQkgICAgIGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkKSkgewotCQkJCU1NX0VSUigiaW52YWxpZCBhZGRyICV4IFxuIiwgKHVuc2lnbmVkIGludClidWYpOwotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNvdW50IC09IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkOwotCQkJYnVmICs9IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkOwotCQkJYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQgPSAwOwotCQkJaWYgKCgrK2F1ZGlvLT5yZWFkX25leHQpID09IGF1ZGlvLT5wY21fYnVmX2NvdW50KQotCQkJCWF1ZGlvLT5yZWFkX25leHQgPSAwOwotCQkJYnJlYWs7CS8qIEZvcmNlIHRvIGV4aXQgd2hpbGUgbG9vcAotCQkJCSAqIHRvIHByZXZlbnQgb3V0cHV0IHRocmVhZAotCQkJCSAqIHNsZWVwIHRvbyBsb25nIGlmIGRhdGEgaXMKLQkJCQkgKiBub3QgcmVhZHkgYXQgdGhpcyBtb21lbnQuCi0JCQkJICovCi0JCX0KLQl9Ci0KLQkvKiBkb24ndCBmZWVkIG91dHB1dCBidWZmZXIgdG8gSFcgZGVjb2RlciBkdXJpbmcgZmx1c2hpbmcKLQkgKiBidWZmZXIgcmVmcmVzaCBjb21tYW5kIHdpbGwgYmUgc2VudCBvbmNlIGZsdXNoIGNvbXBsZXRlcwotCSAqIHNlbmQgYnVmIHJlZnJlc2ggY29tbWFuZCBoZXJlIGNhbiBjb25mdXNlIEhXIGRlY29kZXIKLQkgKi8KLQlpZiAoYXVkaW8tPmJ1Zl9yZWZyZXNoICYmICFhdWRpby0+cmZsdXNoKSB7Ci0JCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDA7Ci0JCU1NX0RCRygia2ljayBzdGFydCBwY20gZmVlZGJhY2sgYWdhaW5cbiIpOwotCQlhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCi0JaWYgKGJ1ZiA+IHN0YXJ0KQotCQlyYyA9IGJ1ZiAtIHN0YXJ0OwotCi0JTU1fREJHKCJyZWFkICVkIGJ5dGVzXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZHdtYV9wcm9jZXNzX2VvcyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQljb25zdCBjaGFyIF9fdXNlciAqYnVmX3N0YXJ0LCB1bnNpZ25lZCBzaG9ydCBtZmllbGRfc2l6ZSkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWNoYXIgKmJ1Zl9wdHI7Ci0KLQlpZiAoYXVkaW8tPnJlc2VydmVkKSB7Ci0JCU1NX0RCRygiZmx1c2ggcmVzZXJ2ZSBieXRlXG4iKTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF9oZWFkOwotCQlidWZfcHRyID0gZnJhbWUtPmRhdGE7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCShmcmFtZS0+dXNlZCA9PSAwKQotCQkJCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQl8fCAoYXVkaW8tPndmbHVzaCkpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBkb25lOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlidWZfcHRyWzBdID0gYXVkaW8tPnJzdl9ieXRlOwotCQlidWZfcHRyWzFdID0gMDsKLQkJYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JCWZyYW1lLT5tZmllbGRfc3ogPSAwOwotCQlmcmFtZS0+dXNlZCA9IDI7Ci0JCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQl9Ci0KLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKGF1ZGlvLT5vdXRfbmVlZGVkICYmCi0JCWF1ZGlvLT5vdXRbMF0udXNlZCA9PSAwICYmCi0JCWF1ZGlvLT5vdXRbMV0udXNlZCA9PSAwKQotCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoZnJhbWUtPmRhdGEsIGJ1Zl9zdGFydCwgbWZpZWxkX3NpemUpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlmcmFtZS0+dXNlZCA9IG1maWVsZF9zaXplOwotCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRpb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0Jc2l6ZV90IHhmZXI7Ci0JY2hhciAqY3B5X3B0cjsKLQlpbnQgcmMgPSAwLCBlb3NfY29uZGl0aW9uID0gQVVEV01BX0VPU19OT05FOwotCXVuc2lnbmVkIGRzaXplOwotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplID0gMDsKLQotCU1NX0RCRygiY250PSVkXG4iLCBjb3VudCk7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0JCWNweV9wdHIgPSBmcmFtZS0+ZGF0YTsKLQkJZHNpemUgPSAwOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkJICAgICAgKGZyYW1lLT51c2VkID09IDApCi0JCQkJCSAgICAgIHx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQkJCSAgfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYXVkaW8tPm1maWVsZCkgewotCQkJaWYgKGJ1ZiA9PSBzdGFydCkgewotCQkJCS8qIFByb2Nlc3NpbmcgYmVnaW5uaW5nIG9mIHVzZXIgYnVmZmVyICovCi0JCQkJaWYgKF9fZ2V0X3VzZXIobWZpZWxkX3NpemUsCi0JCQkJCSh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgYnVmKSkgewotCQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSAgaWYgKG1maWVsZF9zaXplID4gY291bnQpIHsKLQkJCQkJcmMgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJTU1fREJHKCJhdWRpb193cml0ZTogbWYgb2Zmc2V0X3ZhbCAleFxuIiwKLQkJCQkJCW1maWVsZF9zaXplKTsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCBtZmllbGRfc2l6ZSkpIHsKLQkJCQkJcmMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyogQ2hlY2sgaWYgRU9TIGZsYWcgaXMgc2V0IGFuZCBidWZmZXIgaGFzCi0JCQkJICogY29udGFpbnMganVzdCBtZXRhIGZpZWxkCi0JCQkJICovCi0JCQkJaWYgKGNweV9wdHJbQVVEV01BX0VPU19GTEdfT0ZGU0VUXSAmCi0JCQkJCQkgQVVEV01BX0VPU19GTEdfTUFTSykgewotCQkJCQlNTV9EQkcoImF1ZGlvX3dyaXRlOiBFT1MgU0VUXG4iKTsKLQkJCQkJZW9zX2NvbmRpdGlvbiA9IEFVRFdNQV9FT1NfU0VUOwotCQkJCQlpZiAobWZpZWxkX3NpemUgPT0gY291bnQpIHsKLQkJCQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UKLQkJCQkJCWNweV9wdHJbQVVEV01BX0VPU19GTEdfT0ZGU0VUXQotCQkJCQkJCSY9IH5BVURXTUFfRU9TX0ZMR19NQVNLOwotCQkJCX0KLQkJCQljcHlfcHRyICs9IG1maWVsZF9zaXplOwotCQkJCWNvdW50IC09IG1maWVsZF9zaXplOwotCQkJCWRzaXplICs9IG1maWVsZF9zaXplOwotCQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWZpZWxkX3NpemUgPSAwOwotCQkJCU1NX0RCRygiYXVkaW9fd3JpdGU6IGNvbnRpbnVvdXMgYnVmZmVyXG4iKTsKLQkJCX0KLQkJCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQkJfQotCi0JCWlmIChhdWRpby0+cmVzZXJ2ZWQpIHsKLQkJCU1NX0RCRygiYXBwZW5kIHJlc2VydmVkIGJ5dGUgJXhcbiIsIGF1ZGlvLT5yc3ZfYnl0ZSk7Ci0JCQkqY3B5X3B0ciA9IGF1ZGlvLT5yc3ZfYnl0ZTsKLQkJCXhmZXIgPSAoY291bnQgPiAoKGZyYW1lLT5zaXplIC0gbWZpZWxkX3NpemUpIC0gMSkpID8KLQkJCQkoZnJhbWUtPnNpemUgLSBtZmllbGRfc2l6ZSkgLSAxIDogY291bnQ7Ci0JCQljcHlfcHRyKys7Ci0JCQlkc2l6ZSArPSAxOwotCQkJYXVkaW8tPnJlc2VydmVkID0gMDsKLQkJfSBlbHNlCi0JCQl4ZmVyID0gKGNvdW50ID4gKGZyYW1lLT5zaXplIC0gbWZpZWxkX3NpemUpKSA/Ci0JCQkJKGZyYW1lLT5zaXplIC0gbWZpZWxkX3NpemUpIDogY291bnQ7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNweV9wdHIsIGJ1ZiwgeGZlcikpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZHNpemUgKz0geGZlcjsKLQkJaWYgKGRzaXplICYgMSkgewotCQkJYXVkaW8tPnJzdl9ieXRlID0gKChjaGFyICopIGZyYW1lLT5kYXRhKVtkc2l6ZSAtIDFdOwotCQkJTU1fREJHKCJvZGQgbGVuZ3RoIGJ1ZiByZXNlcnZlIGxhc3QgYnl0ZSAleFxuIiwKLQkJCQkJYXVkaW8tPnJzdl9ieXRlKTsKLQkJCWF1ZGlvLT5yZXNlcnZlZCA9IDE7Ci0JCQlkc2l6ZS0tOwotCQl9Ci0JCWNvdW50IC09IHhmZXI7Ci0JCWJ1ZiArPSB4ZmVyOwotCi0JCWlmIChkc2l6ZSA+IDApIHsKLQkJCWF1ZGlvLT5vdXRfaGVhZCBePSAxOwotCQkJZnJhbWUtPnVzZWQgPSBkc2l6ZTsKLQkJCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQkJfQotCX0KLQlpZiAoZW9zX2NvbmRpdGlvbiA9PSBBVURXTUFfRU9TX1NFVCkKLQkJcmMgPSBhdWR3bWFfcHJvY2Vzc19lb3MoYXVkaW8sIHN0YXJ0LCBtZmllbGRfc2l6ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JaWYgKCFyYykgewotCQlpZiAoYnVmID4gc3RhcnQpCi0JCQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlNTV9JTkZPKCJhdWRpbyBpbnN0YW5jZSAweCUwOHggZnJlZWluZ1xuIiwgKGludClhdWRpbyk7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGRldl91bnJlZ2lzdGVyX2V2dF9saXN0bmVyKEFVRERFVl9DTE5UX0RFQywgYXVkaW8tPmRlY19pZCk7Ci0JYXVkaW9fZGlzYWJsZShhdWRpbyk7Ci0JYXVkaW9fZmx1c2goYXVkaW8pOwotCWF1ZGlvX2ZsdXNoX3BjbV9idWYoYXVkaW8pOwotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci0JYXVkcHBfYWRlY19mcmVlKGF1ZGlvLT5kZWNfaWQpOwotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi0JdW5yZWdpc3Rlcl9lYXJseV9zdXNwZW5kKCZhdWRpby0+c3VzcGVuZF9jdGwubm9kZSk7Ci0jZW5kaWYKLQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAxOwotCXdha2VfdXAoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQlhdWR3bWFfcmVzZXRfZXZlbnRfcXVldWUoYXVkaW8pOwotCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci0JaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgYXVkaW8tPm91dHB1dF9idWZmX2hhbmRsZSk7Ci0JaWYgKGF1ZGlvLT5pbnB1dF9idWZmX2hhbmRsZSAhPSBOVUxMKSB7Ci0JCWlvbl91bm1hcF9rZXJuZWwoYXVkaW8tPmNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLQkJaW9uX2ZyZWUoYXVkaW8tPmNsaWVudCwgYXVkaW8tPmlucHV0X2J1ZmZfaGFuZGxlKTsKLQl9Ci0JaW9uX2NsaWVudF9kZXN0cm95KGF1ZGlvLT5jbGllbnQpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCWlmIChhdWRpby0+ZGVudHJ5KQotCQlkZWJ1Z2ZzX3JlbW92ZShhdWRpby0+ZGVudHJ5KTsKLSNlbmRpZgotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdGF0aWMgdm9pZCBhdWR3bWFfcG9zdF9ldmVudChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCkKLXsKLQlzdHJ1Y3QgYXVkd21hX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpKSB7Ci0JCWVfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWR3bWFfZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZV9ub2RlLT5saXN0KTsKLQl9IGVsc2UgewotCQllX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkd21hX2V2ZW50KSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghZV9ub2RlKSB7Ci0JCQlNTV9FUlIoIk5vIG1lbSB0byBwb3N0IGV2ZW50ICVkXG4iLCB0eXBlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWVfbm9kZS0+ZXZlbnRfdHlwZSA9IHR5cGU7Ci0JZV9ub2RlLT5wYXlsb2FkID0gcGF5bG9hZDsKLQotCWxpc3RfYWRkX3RhaWwoJmVfbm9kZS0+bGlzdCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHdtYV9zdXNwZW5kKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWR3bWFfc3VzcGVuZF9jdGwgKmN0bCA9Ci0JCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgYXVkd21hX3N1c3BlbmRfY3RsLCBub2RlKTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlhdWR3bWFfcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9TVVNQRU5ELCBwYXlsb2FkKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkd21hX3Jlc3VtZShzdHJ1Y3QgZWFybHlfc3VzcGVuZCAqaCkKLXsKLQlzdHJ1Y3QgYXVkd21hX3N1c3BlbmRfY3RsICpjdGwgPQotCQljb250YWluZXJfb2YoaCwgc3RydWN0IGF1ZHdtYV9zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkd21hX3Bvc3RfZXZlbnQoY3RsLT5hdWRpbywgQVVESU9fRVZFTlRfUkVTVU1FLCBwYXlsb2FkKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgc3NpemVfdCBhdWR3bWFfZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWR3bWFfZGVidWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY29uc3QgaW50IGRlYnVnX2J1Zm1heCA9IDQwOTY7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyWzQwOTZdOwotCWludCBuID0gMCwgaTsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCW4gPSBzY25wcmludGYoYnVmZmVyLCBkZWJ1Z19idWZtYXgsICJvcGVuZWQgJWRcbiIsIGF1ZGlvLT5vcGVuZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgImVuYWJsZWQgJWRcbiIsIGF1ZGlvLT5lbmFibGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJzdG9wcGVkICVkXG4iLCBhdWRpby0+c3RvcHBlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicGNtX2ZlZWRiYWNrICVkXG4iLCBhdWRpby0+cGNtX2ZlZWRiYWNrKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfYnVmX3N6ICVkXG4iLCBhdWRpby0+b3V0WzBdLnNpemUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInBjbV9idWZfY291bnQgJWQgXG4iLCBhdWRpby0+cGNtX2J1Zl9jb3VudCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicGNtX2J1Zl9zeiAlZCBcbiIsIGF1ZGlvLT5pblswXS5zaXplKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJ2b2x1bWUgJXggXG4iLCBhdWRpby0+dm9sX3Bhbi52b2x1bWUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInNhbXBsZSByYXRlICVkIFxuIiwgYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJImNoYW5uZWwgbW9kZSAlZCBcbiIsIGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkvKiBGb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBvbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHdoZW4KLQkgKiB3aGVuIHBsYXliYWNrIGhhbHRzIHVuZXhwZWN0ZWRseS4gVGh1cywgbm8gbXV0dWFsIGV4Y2x1c2lvbgotCSAqIGVuZm9yY2VkCi0JICovCi0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAid2ZsdXNoICVkXG4iLCBhdWRpby0+d2ZsdXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJyZmx1c2ggJWRcbiIsIGF1ZGlvLT5yZmx1c2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInJ1bm5pbmcgJWQgXG4iLCBhdWRpby0+cnVubmluZyk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJkZWMgc3RhdGUgJWQgXG4iLCBhdWRpby0+ZGVjX3N0YXRlKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfbmVlZGVkICVkIFxuIiwgYXVkaW8tPm91dF9uZWVkZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dF9oZWFkICVkIFxuIiwgYXVkaW8tPm91dF9oZWFkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfdGFpbCAlZCBcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0WzBdLnVzZWQgJWQgXG4iLCBhdWRpby0+b3V0WzBdLnVzZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dFsxXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFsxXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJidWZmZXJfcmVmcmVzaCAlZCBcbiIsIGF1ZGlvLT5idWZfcmVmcmVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicmVhZF9uZXh0ICVkIFxuIiwgYXVkaW8tPnJlYWRfbmV4dCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAiZmlsbF9uZXh0ICVkIFxuIiwgYXVkaW8tPmZpbGxfbmV4dCk7Ci0JZm9yIChpID0gMDsgaSA8IGF1ZGlvLT5wY21fYnVmX2NvdW50OyBpKyspCi0JCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiaW5bJWRdLnNpemUgJWQgXG4iLCBpLCBhdWRpby0+aW5baV0udXNlZCk7Ci0JYnVmZmVyW25dID0gMDsKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkd21hX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWR3bWFfZGVidWdfcmVhZCwKLQkub3BlbiA9IGF1ZHdtYV9kZWJ1Z19vcGVuLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IE5VTEw7Ci0JaW50IHJjLCBkZWNfYXR0cmIsIGRlY2lkLCBpOwotCXVuc2lnbmVkIG1lbV9zeiA9IERNQVNaX01BWDsKLQlzdHJ1Y3QgYXVkd21hX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgaW9uZmxhZyA9IDA7Ci0JaW9uX3BoeXNfYWRkcl90IGFkZHIgPSAwOwotCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUgPSBOVUxMOwotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQgPSBOVUxMOwotCWludCBsZW4gPSAwOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCi0JY2hhciBuYW1lW3NpemVvZiAibXNtX3dtYV8iICsgNV07Ci0jZW5kaWYKLQotCS8qIEFsbG9jYXRlIE1lbSBmb3IgYXVkaW8gaW5zdGFuY2UgKi8KLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpbyksIEdGUF9LRVJORUwpOwotCWlmICghYXVkaW8pIHsKLQkJTU1fRVJSKCJubyBtZW1vcnkgdG8gYWxsb2NhdGUgYXVkaW8gaW5zdGFuY2UgXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCU1NX0lORk8oImF1ZGlvIGluc3RhbmNlIDB4JTA4eCBjcmVhdGVkXG4iLCAoaW50KWF1ZGlvKTsKLQotCS8qIEFsbG9jYXRlIHRoZSBkZWNvZGVyICovCi0JZGVjX2F0dHJiID0gQVVEREVDX0RFQ19XTUE7Ci0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlkZWNfYXR0cmIgfD0gTVNNX0FVRF9NT0RFX05PTlRVTk5FTDsKLQkJYXVkaW8tPnBjbV9mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERV9QTEFZQkFDSzsKLQl9IGVsc2UgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCSEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9UVU5ORUw7Ci0JCWF1ZGlvLT5wY21fZmVlZGJhY2sgPSBUVU5ORUxfTU9ERV9QTEFZQkFDSzsKLQl9IGVsc2UgewotCQlrZnJlZShhdWRpbyk7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBkb25lOwotCX0KLQotCWRlY2lkID0gYXVkcHBfYWRlY19hbGxvYyhkZWNfYXR0cmIsICZhdWRpby0+bW9kdWxlX25hbWUsCi0JCQkmYXVkaW8tPnF1ZXVlX2lkKTsKLQotCWlmIChkZWNpZCA8IDApIHsKLQkJTU1fRVJSKCJObyBmcmVlIGRlY29kZXIgYXZhaWxhYmxlLCBmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQkoaW50KWF1ZGlvKTsKLQkJcmMgPSAtRU5PREVWOwotCQlrZnJlZShhdWRpbyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYXVkaW8tPmRlY19pZCA9IGRlY2lkICYgTVNNX0FVRF9ERUNPREVSX01BU0s7Ci0KLQljbGllbnQgPSBtc21faW9uX2NsaWVudF9jcmVhdGUoVUlOVF9NQVgsICJBdWRpb19XTUFfQ2xpZW50Iik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGNsaWVudCkpIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gY3JlYXRlIElPTiBjbGllbnRcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gY2xpZW50X2NyZWF0ZV9lcnJvcjsKLQl9Ci0JYXVkaW8tPmNsaWVudCA9IGNsaWVudDsKLQotCWhhbmRsZSA9IGlvbl9hbGxvYyhjbGllbnQsIG1lbV9zeiwgU1pfNEssCi0JCUlPTl9IRUFQKElPTl9BVURJT19IRUFQX0lEKSwgMCk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGhhbmRsZSkpIHsKLQkJTU1fRVJSKCJVbmFibGUgdG8gY3JlYXRlIGFsbG9jYXRlIE8vUCBidWZmZXJzXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dHB1dF9idWZmX2FsbG9jX2Vycm9yOwotCX0KLQlhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlID0gaGFuZGxlOwotCi0JcmMgPSBpb25fcGh5cyhjbGllbnQsIGhhbmRsZSwgJmFkZHIsICZsZW4pOwotCWlmIChyYykgewotCQlNTV9FUlIoIk8vUCBidWZmZXJzOkludmFsaWQgcGh5OiAleCBzejogJXhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBhZGRyLCAodW5zaWduZWQgaW50KSBsZW4pOwotCQlnb3RvIG91dHB1dF9idWZmX2dldF9waHlzX2Vycm9yOwotCX0gZWxzZSB7Ci0JCU1NX0lORk8oIk8vUCBidWZmZXJzOnZhbGlkIHBoeTogJXggc3o6ICV4XG4iLAotCQkJKHVuc2lnbmVkIGludCkgYWRkciwgKHVuc2lnbmVkIGludCkgbGVuKTsKLQl9Ci0JYXVkaW8tPnBoeXMgPSAoaW50MzJfdClhZGRyOwotCi0KLQlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKGNsaWVudCwgaGFuZGxlLCAmaW9uZmxhZyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiY291bGQgbm90IGdldCBmbGFncyBmb3IgdGhlIGhhbmRsZVxuIik7Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfZ2V0X2ZsYWdzX2Vycm9yOwotCX0KLQotCWF1ZGlvLT5tYXBfdl93cml0ZSA9IGlvbl9tYXBfa2VybmVsKGNsaWVudCwgaGFuZGxlKTsKLQlpZiAoSVNfRVJSKGF1ZGlvLT5tYXBfdl93cml0ZSkpIHsKLQkJTU1fRVJSKCJjb3VsZCBub3QgbWFwIHdyaXRlIGJ1ZmZlcnNcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0cHV0X2J1ZmZfbWFwX2Vycm9yOwotCX0KLQkJCWF1ZGlvLT5kYXRhID0gYXVkaW8tPm1hcF92X3dyaXRlOwotCU1NX0RCRygid3JpdGUgYnVmOiBwaHkgYWRkciAweCUwOHgga2VybmVsIGFkZHIgMHglMDh4XG4iLAotCQlhdWRpby0+cGh5cywgKGludClhdWRpby0+ZGF0YSk7Ci0KLQlhdWRpby0+b3V0X2RtYV9zeiA9IG1lbV9zejsKLQotCXJjID0gbXNtX2Fkc3BfZ2V0KGF1ZGlvLT5tb2R1bGVfbmFtZSwgJmF1ZGlvLT5hdWRwbGF5LAotCQkJJmF1ZHBsYXlfYWRzcF9vcHNfd21hLCBhdWRpbyk7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiZmFpbGVkIHRvIGdldCAlcyBtb2R1bGUsIGZyZWVpbmcgaW5zdGFuY2UgMHglMDh4XG4iLAotCQkJCWF1ZGlvLT5tb2R1bGVfbmFtZSwgKGludClhdWRpbyk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCW11dGV4X2luaXQoJmF1ZGlvLT5sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPnJlYWRfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmRzcF9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPmF2c3luY193YWl0KTsKLQotCWF1ZGlvLT5vdXRbMF0uZGF0YSA9IGF1ZGlvLT5kYXRhICsgMDsKLQlhdWRpby0+b3V0WzBdLmFkZHIgPSBhdWRpby0+cGh5cyArIDA7Ci0JYXVkaW8tPm91dFswXS5zaXplID0gYXVkaW8tPm91dF9kbWFfc3ogPj4gMTsKLQotCWF1ZGlvLT5vdXRbMV0uZGF0YSA9IGF1ZGlvLT5kYXRhICsgYXVkaW8tPm91dFswXS5zaXplOwotCWF1ZGlvLT5vdXRbMV0uYWRkciA9IGF1ZGlvLT5waHlzICsgYXVkaW8tPm91dFswXS5zaXplOwotCWF1ZGlvLT5vdXRbMV0uc2l6ZSA9IGF1ZGlvLT5vdXRbMF0uc2l6ZTsKLQotCWF1ZGlvLT53bWFfY29uZmlnLmFybWRhdGFyZXF0aHIgPSAgMTI2MjsKLQlhdWRpby0+d21hX2NvbmZpZy5jaGFubmVsc2RlY29kZWQgPSAyOwotCWF1ZGlvLT53bWFfY29uZmlnLndtYWJ5dGVzcGVyc2VjID0gNjAwMzsKLQlhdWRpby0+d21hX2NvbmZpZy53bWFzYW1wbGluZ2ZyZXEgPSA0NDEwMDsKLQlhdWRpby0+d21hX2NvbmZpZy53bWFlbmNvZGVyb3B0cyA9IDMxOwotCi0JYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSA9IDQ0MTAwOwotCWF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID0gQVVEUFBfQ01EX1BDTV9JTlRGX1NURVJFT19WOwotCi0JYXVkaW8tPnZvbF9wYW4udm9sdW1lID0gMHgyMDAwOwotCi0JYXVkaW9fZmx1c2goYXVkaW8pOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0JYXVkaW8tPm9wZW5lZCA9IDE7Ci0KLQlhdWRpby0+ZGV2aWNlX2V2ZW50cyA9IEFVRERFVl9FVlRfREVWX1JEWQotCQkJCXxBVURERVZfRVZUX0RFVl9STFN8Ci0JCQkJQVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRzsKLQotCXJjID0gYXVkZGV2X3JlZ2lzdGVyX2V2dF9saXN0bmVyKGF1ZGlvLT5kZXZpY2VfZXZlbnRzLAotCQkJCQlBVURERVZfQ0xOVF9ERUMsCi0JCQkJCWF1ZGlvLT5kZWNfaWQsCi0JCQkJCXdtYV9saXN0bmVyLAotCQkJCQkodm9pZCAqKWF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGxpc3RuZXJcbiIsIF9fZnVuY19fKTsKLQkJZ290byBldmVudF9lcnI7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mIG5hbWUsICJtc21fd21hXyUwNHgiLCBhdWRpby0+ZGVjX2lkKTsKLQlhdWRpby0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQlOVUxMLCAodm9pZCAqKSBhdWRpbywKLQkJCQkmYXVkd21hX2RlYnVnX2ZvcHMpOwotCi0JaWYgKElTX0VSUihhdWRpby0+ZGVudHJ5KSkKLQkJTU1fREJHKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLmxldmVsID0gRUFSTFlfU1VTUEVORF9MRVZFTF9ESVNBQkxFX0ZCOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLnJlc3VtZSA9IGF1ZHdtYV9yZXN1bWU7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUuc3VzcGVuZCA9IGF1ZHdtYV9zdXNwZW5kOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5hdWRpbyA9IGF1ZGlvOwotCXJlZ2lzdGVyX2Vhcmx5X3N1c3BlbmQoJmF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlKTsKLSNlbmRpZgotCWZvciAoaSA9IDA7IGkgPCBBVURXTUFfRVZFTlRfTlVNOyBpKyspIHsKLQkJZV9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZHdtYV9ldmVudCksIEdGUF9LRVJORUwpOwotCQlpZiAoZV9ub2RlKQotCQkJbGlzdF9hZGRfdGFpbCgmZV9ub2RlLT5saXN0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCQllbHNlIHsKLQkJCU1NX0VSUigiZXZlbnQgcGt0IGFsbG9jIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotZXZlbnRfZXJyOgotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci1lcnI6Ci0JaW9uX3VubWFwX2tlcm5lbChjbGllbnQsIGF1ZGlvLT5vdXRwdXRfYnVmZl9oYW5kbGUpOwotb3V0cHV0X2J1ZmZfbWFwX2Vycm9yOgotb3V0cHV0X2J1ZmZfZ2V0X3BoeXNfZXJyb3I6Ci1vdXRwdXRfYnVmZl9nZXRfZmxhZ3NfZXJyb3I6Ci0JaW9uX2ZyZWUoY2xpZW50LCBhdWRpby0+b3V0cHV0X2J1ZmZfaGFuZGxlKTsKLW91dHB1dF9idWZmX2FsbG9jX2Vycm9yOgotCWlvbl9jbGllbnRfZGVzdHJveShjbGllbnQpOwotY2xpZW50X2NyZWF0ZV9lcnJvcjoKLQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fd21hX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGF1ZGlvX29wZW4sCi0JLnJlbGVhc2UJPSBhdWRpb19yZWxlYXNlLAotCS5yZWFkIAkJPSBhdWRpb19yZWFkLAotCS53cml0ZQkJPSBhdWRpb193cml0ZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBhdWRpb19pb2N0bCwKLQkuZnN5bmMgCQk9IGF1ZGlvX2ZzeW5jLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fd21hX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gIm1zbV93bWEiLAotCS5mb3BzCT0gJmF1ZGlvX3dtYV9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9faW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb193bWFfbWlzYyk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhdWRpb19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fd21hcHJvLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZGlvX3dtYXByby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGZjMTBmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkaW9fd21hcHJvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODE0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBCYXNlZCBvbiB0aGUgbXAzIG5hdGl2ZSBkcml2ZXIgaW4gYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRpb19tcDMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqCi0gKiBBbGwgc291cmNlIGNvZGUgaW4gdGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBleGNlcHQKLSAqIHdoZXJlIGluZGljYXRlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCi0gKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgeW91IGNhbiBmaW5kIGl0IGF0IGh0dHA6Ly93d3cuZnNmLm9yZwotICovCi0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZWFybHlzdXNwZW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb193bWFwcm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1vcnlfYWxsb2MuaD4KLQotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pb21tdV9kb21haW5zLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHBtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRwbGF5Y21kaS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBsYXltc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRwcC5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9tZW10eXBlcy5oPgotCi0KLS8qIFNpemUgbXVzdCBiZSBwb3dlciBvZiAyICovCi0jZGVmaW5lIEJVRlNaX01BWCAJNDExMAkvKiBJbmNsdWRlcyBtZXRhIGluIHNpemUgKi8KLSNkZWZpbmUgQlVGU1pfTUlOIAkyMDYyCS8qIEluY2x1ZGVzIG1ldGEgaW4gc2l6ZSAqLwotI2RlZmluZSBETUFTWl9NQVggCShCVUZTWl9NQVggKiAyKQotI2RlZmluZSBETUFTWl9NSU4gCShCVUZTWl9NSU4gKiAyKQotCi0jZGVmaW5lIEFVRFBMQVlfSU5WQUxJRF9SRUFEX1BUUl9PRkZTRVQJMHhGRkZGCi0jZGVmaW5lIEFVRERFQ19ERUNfV01BUFJPIDEzCi0KLSNkZWZpbmUgUENNX0JVRlNaX01JTiAJODIxNiAJLyogSG9sZCBvbmUgc3RlcmVvIFdNQVBSTyBmcmFtZSBhbmQgbWV0YSBvdXQqLwotI2RlZmluZSBQQ01fQlVGX01BWF9DT1VOVCA1CS8qIERTUCBvbmx5IGFjY2VwdHMgNSBidWZmZXJzIGF0IG1vc3QKLQkJCQkgICBidXQgc3VwcG9ydCAyIGJ1ZmZlcnMgY3VycmVudGx5ICovCi0jZGVmaW5lIFJPVVRJTkdfTU9ERV9GVFJUIDEKLSNkZWZpbmUgUk9VVElOR19NT0RFX1JUIDIKLS8qIERlY29kZXIgc3RhdHVzIHJlY2VpdmVkIGZyb20gQVVEUFBUQVNLICovCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX1NMRUVQCTAKLSNkZWZpbmUJIEFVRFBQX0RFQ19TVEFUVVNfSU5JVCAgMQotI2RlZmluZSAgQVVEUFBfREVDX1NUQVRVU19DRkcgICAyCi0jZGVmaW5lICBBVURQUF9ERUNfU1RBVFVTX1BMQVkgIDMKLQotI2RlZmluZSBBVURXTUFQUk9fTUVUQUZJRUxEX01BU0sgMHhGRkZGMDAwMAotI2RlZmluZSBBVURXTUFQUk9fRU9TX0ZMR19PRkZTRVQgMHgwQSAvKiBPZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgYnVmZmVyICovCi0jZGVmaW5lIEFVRFdNQVBST19FT1NfRkxHX01BU0sgMHgwMQotI2RlZmluZSBBVURXTUFQUk9fRU9TX05PTkUgMHgwIC8qIE5vIEVPUyBkZXRlY3RlZCAqLwotI2RlZmluZSBBVURXTUFQUk9fRU9TX1NFVCAweDEgLyogRU9TIHNldCBpbiBtZXRhIGZpZWxkICovCi0KLSNkZWZpbmUgQVVEV01BUFJPX0VWRU5UX05VTSAxMCAvKiBEZWZhdWx0IG5vLiBvZiBwcmUtYWxsb2NhdGVkIGV2ZW50IHBhY2tldHMgKi8KLQotc3RydWN0IGJ1ZmZlciB7Ci0Jdm9pZCAqZGF0YTsKLQl1bnNpZ25lZCBzaXplOwotCXVuc2lnbmVkIHVzZWQ7CQkvKiBJbnB1dCB1c2FnZSBhY3R1YWwgRFNQIHByb2R1Y2VkIFBDTSBzaXplICAqLwotCXVuc2lnbmVkIGFkZHI7Ci0JdW5zaWduZWQgc2hvcnQgbWZpZWxkX3N6OyAvKm9ubHkgdXNlZnVsIGZvciBkYXRhIGhhcyBtZXRhIGZpZWxkICovCi19OwotCi0jaWZkZWYgQ09ORklHX0hBU19FQVJMWVNVU1BFTkQKLXN0cnVjdCBhdWR3bWFwcm9fc3VzcGVuZF9jdGwgewotCXN0cnVjdCBlYXJseV9zdXNwZW5kIG5vZGU7Ci0Jc3RydWN0IGF1ZGlvICphdWRpbzsKLX07Ci0jZW5kaWYKLQotc3RydWN0IGF1ZHdtYXByb19ldmVudHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JaW50IGV2ZW50X3R5cGU7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLX07Ci0KLXN0cnVjdCBhdWRpbyB7Ci0Jc3RydWN0IGJ1ZmZlciBvdXRbMl07Ci0KLQlzcGlubG9ja190IGRzcF9sb2NrOwotCi0JdWludDhfdCBvdXRfaGVhZDsKLQl1aW50OF90IG91dF90YWlsOwotCXVpbnQ4X3Qgb3V0X25lZWRlZDsgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGRzcCBpcyB3YWl0aW5nIGZvciAqLwotCXVuc2lnbmVkIG91dF9kbWFfc3o7Ci0KLQlhdG9taWNfdCBvdXRfYnl0ZXM7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXV0ZXggd3JpdGVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3cml0ZV93YWl0OwotCi0JLyogSG9zdCBQQ00gc2VjdGlvbiAqLwotCXN0cnVjdCBidWZmZXIgaW5bUENNX0JVRl9NQVhfQ09VTlRdOwotCXN0cnVjdCBtdXRleCByZWFkX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF93YWl0OwkvKiBXYWl0IHF1ZXVlIGZvciByZWFkICovCi0JY2hhciAqcmVhZF9kYXRhOwkvKiBwb2ludGVyIHRvIHJlYWRlciBidWZmZXIgKi8KLQlpbnQzMl90IHJlYWRfcGh5czsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiByZWFkZXIgYnVmZmVyICovCi0JdWludDhfdCByZWFkX25leHQ7CS8qIGluZGV4IHRvIGlucHV0IGJ1ZmZlcnMgdG8gYmUgcmVhZCBuZXh0ICovCi0JdWludDhfdCBmaWxsX25leHQ7CS8qIGluZGV4IHRvIGJ1ZmZlciB0aGF0IERTUCBzaG91bGQgYmUgZmlsbGluZyAqLwotCXVpbnQ4X3QgcGNtX2J1Zl9jb3VudDsJLyogbnVtYmVyIG9mIHBjbSBidWZmZXIgYWxsb2NhdGVkICovCi0JLyogLS0tLSBFbmQgb2YgSG9zdCBQQ00gc2VjdGlvbiAqLwotCi0Jc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqYXVkcGxheTsKLQotCS8qIGNvbmZpZ3VyYXRpb24gdG8gdXNlIG9uIG5leHQgZW5hYmxlICovCi0JdWludDMyX3Qgb3V0X3NhbXBsZV9yYXRlOwotCXVpbnQzMl90IG91dF9jaGFubmVsX21vZGU7Ci0KLQlzdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWcgd21hcHJvX2NvbmZpZzsKLQotCS8qIGRhdGEgYWxsb2NhdGVkIGZvciB2YXJpb3VzIGJ1ZmZlcnMgKi8KLQljaGFyICpkYXRhOwotCWludDMyX3QgcGh5czsgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB3cml0ZSBidWZmZXIgKi8KLQl2b2lkICptYXBfdl9yZWFkOwotCXZvaWQgKm1hcF92X3dyaXRlOwotCi0JaW50IG1maWVsZDsgLyogbWV0YSBmaWVsZCBlbWJlZGRlZCBpbiBkYXRhICovCi0JaW50IHJmbHVzaDsgLyogUmVhZCAgZmx1c2ggKi8KLQlpbnQgd2ZsdXNoOyAvKiBXcml0ZSBmbHVzaCAqLwotCWludCBvcGVuZWQ7Ci0JaW50IGVuYWJsZWQ7Ci0JaW50IHJ1bm5pbmc7Ci0JaW50IHN0b3BwZWQ7IC8qIHNldCB3aGVuIHN0b3BwZWQsIGNsZWFyZWQgb24gZmx1c2ggKi8KLQlpbnQgcGNtX2ZlZWRiYWNrOwotCWludCBidWZfcmVmcmVzaDsKLQlpbnQgdGVvczsgLyogdmFsaWQgb25seSBpZiB0dW5uZWwgbW9kZSAmIG5vIGRhdGEgbGVmdCBmb3IgZGVjb2RlciAqLwotCWVudW0gbXNtX2F1ZF9kZWNvZGVyX3N0YXRlIGRlY19zdGF0ZTsJLyogUmVwcmVzZW50cyBkZWNvZGVyIHN0YXRlICovCi0JaW50IHJlc2VydmVkOyAvKiBBIGJ5dGUgaXMgYmVpbmcgcmVzZXJ2ZWQgKi8KLQljaGFyIHJzdl9ieXRlOyAvKiBIYW5kbGUgb2RkIGxlbmd0aCB1c2VyIGRhdGEgKi8KLQotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIHF1ZXVlX2lkOwotCXVpbnQxNl90IGRlY19pZDsKLQl1aW50MzJfdCByZWFkX3B0cl9vZmZzZXQ7Ci0JaW50MTZfdCBzb3VyY2U7Ci0KLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCXN0cnVjdCBhdWR3bWFwcm9fc3VzcGVuZF9jdGwgc3VzcGVuZF9jdGw7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLSNlbmRpZgotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfZXZlbnRfcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBldmVudF9xdWV1ZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF93YWl0OwotCXNwaW5sb2NrX3QgZXZlbnRfcXVldWVfbG9jazsKLQlzdHJ1Y3QgbXV0ZXggZ2V0X2V2ZW50X2xvY2s7Ci0JaW50IGV2ZW50X2Fib3J0OwotCS8qIEFWIHN5bmMgSW5mbyAqLwotCWludCBhdnN5bmNfZmxhZzsgICAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgZmVlZGJhY2sgZnJvbSBEU1AgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBhdnN5bmNfd2FpdDsvKiBXYWl0IHF1ZXVlIGZvciBBViBTeW5jIE1lc3NhZ2UgICAgICovCi0JLyogZmxhZ3MsIDQ4IGJpdHMgc2FtcGxlL2J5dGVzIGNvdW50ZXIgcGVyIGNoYW5uZWwgKi8KLQl1aW50MTZfdCBhdnN5bmNbQVVEUFBfQVZTWU5DX0NIX0NPVU5UICogQVVEUFBfQVZTWU5DX05VTV9XT1JEUyArIDFdOwotCi0JdWludDMyX3QgZGV2aWNlX2V2ZW50czsKLQotCWludCBlcV9lbmFibGU7Ci0JaW50IGVxX25lZWRzX2NvbW1pdDsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyIGVxOwotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfdm9sdW1lIHZvbF9wYW47Ci19OwotCi1zdGF0aWMgaW50IGF1ZGRlY19kc3BfY29uZmlnKHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCBlbmFibGUpOwotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKTsKLXN0YXRpYyB2b2lkIGF1ZHBwX2NtZF9jZmdfcm91dGluZ19tb2RlKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkcGxheV9zZW5kX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywgdW5zaWduZWQgbmVlZGVkKTsKLXN0YXRpYyB2b2lkIGF1ZHBsYXlfY29uZmlnX2hvc3RwY20oc3RydWN0IGF1ZGlvICphdWRpbyk7Ci1zdGF0aWMgdm9pZCBhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pOwotc3RhdGljIHZvaWQgYXVkaW9fZHNwX2V2ZW50KHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGlkLCB1aW50MTZfdCAqbXNnKTsKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotc3RhdGljIHZvaWQgYXVkd21hcHJvX3Bvc3RfZXZlbnQoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IHR5cGUsCi0JCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQpOwotI2VuZGlmCi0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRpb19lbmFibGUoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWlmIChhdWRpby0+ZW5hYmxlZCkKLQkJcmV0dXJuIDA7Ci0KLQlhdWRpby0+ZGVjX3N0YXRlID0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkU7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0KLQlpZiAobXNtX2Fkc3BfZW5hYmxlKGF1ZGlvLT5hdWRwbGF5KSkgewotCQlNTV9FUlIoIm1zbV9hZHNwX2VuYWJsZShhdWRwbGF5KSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAoYXVkcHBfZW5hYmxlKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvX2RzcF9ldmVudCwgYXVkaW8pKSB7Ci0JCU1NX0VSUigiYXVkcHBfZW5hYmxlKCkgZmFpbGVkXG4iKTsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRpby0+YXVkcGxheSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWF1ZGlvLT5lbmFibGVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgd21hcHJvX2xpc3RuZXIodTMyIGV2dF9pZCwgdW5pb24gYXVkZGV2X2V2dF9kYXRhICpldnRfcGF5bG9hZCwKLQkJCXZvaWQgKnByaXZhdGVfZGF0YSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gKHN0cnVjdCBhdWRpbyAqKSBwcml2YXRlX2RhdGE7Ci0Jc3dpdGNoIChldnRfaWQpIHsKLQljYXNlIEFVRERFVl9FVlRfREVWX1JEWToKLQkJTU1fREJHKCI6QVVEREVWX0VWVF9ERVZfUkRZXG4iKTsKLQkJYXVkaW8tPnNvdXJjZSB8PSAoMHgxIDw8IGV2dF9wYXlsb2FkLT5yb3V0aW5nX2lkKTsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nID09IDEgJiYgYXVkaW8tPmVuYWJsZWQgPT0gMSkKLQkJCWF1ZHBwX3JvdXRlX3N0cmVhbShhdWRpby0+ZGVjX2lkLCBhdWRpby0+c291cmNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURERVZfRVZUX0RFVl9STFM6Ci0JCU1NX0RCRygiOkFVRERFVl9FVlRfREVWX1JMU1xuIik7Ci0JCWF1ZGlvLT5zb3VyY2UgJj0gfigweDEgPDwgZXZ0X3BheWxvYWQtPnJvdXRpbmdfaWQpOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcgPT0gMSAmJiBhdWRpby0+ZW5hYmxlZCA9PSAxKQotCQkJYXVkcHBfcm91dGVfc3RyZWFtKGF1ZGlvLT5kZWNfaWQsIGF1ZGlvLT5zb3VyY2UpOwotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEc6Ci0JCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IGV2dF9wYXlsb2FkLT5zZXNzaW9uX3ZvbDsKLQkJTU1fREJHKCI6QVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRywgc3RyZWFtIHZvbCAlZFxuIiwKLQkJCQlhdWRpby0+dm9sX3Bhbi52b2x1bWUpOwotCQlpZiAoYXVkaW8tPnJ1bm5pbmcpCi0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuLAotCQkJCQlQT1BQKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCI6RVJST1I6d3JvbmcgZXZlbnRcbiIpOwotCQlicmVhazsKLQl9Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotc3RhdGljIGludCBhdWRpb19kaXNhYmxlKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JaW50IHJjID0gMDsKLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWlmIChhdWRpby0+ZW5hYmxlZCkgewotCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCWF1ZGlvLT5kZWNfc3RhdGUgPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORTsKLQkJYXVkZGVjX2RzcF9jb25maWcoYXVkaW8sIDApOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT53YWl0LAotCQkJCWF1ZGlvLT5kZWNfc3RhdGUgIT0gTVNNX0FVRF9ERUNPREVSX1NUQVRFX05PTkUsCi0JCQkJbXNlY3NfdG9famlmZmllcyhNU01fQVVEX0RFQ09ERVJfV0FJVF9NUykpOwotCQlpZiAocmMgPT0gMCkKLQkJCXJjID0gLUVUSU1FRE9VVDsKLQkJZWxzZSBpZiAoYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfQ0xPU0UpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRpby0+YXVkcGxheSk7Ci0JCWF1ZHBwX2Rpc2FibGUoYXVkaW8tPmRlY19pZCwgYXVkaW8pOwotCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JfQotCXJldHVybiByYzsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkc3AgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgdm9pZCBhdWRpb191cGRhdGVfcGNtX2J1Zl9lbnRyeShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCXVpbnQzMl90ICpwYXlsb2FkKQotewotCXVpbnQ4X3QgaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChhdWRpby0+cmZsdXNoKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGF5bG9hZFsxXTsgaW5kZXgrKykgewotCQlpZiAoYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHIgPT0KLQkJCXBheWxvYWRbMiArIGluZGV4ICogMl0pIHsKLQkJCU1NX0RCRygiYXVkaW9fdXBkYXRlX3BjbV9idWZfZW50cnk6IFwKLQkJCQlpblslZF0gcmVhZHlcbiIsIGF1ZGlvLT5maWxsX25leHQpOwotCQkJYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnVzZWQgPQotCQkJcGF5bG9hZFszICsgaW5kZXggKiAyXTsKLQkJCWlmICgoKythdWRpby0+ZmlsbF9uZXh0KSA9PSBhdWRpby0+cGNtX2J1Zl9jb3VudCkKLQkJCQlhdWRpby0+ZmlsbF9uZXh0ID0gMDsKLQkJfSBlbHNlIHsKLQkJCU1NX0VSUigiYXVkaW9fdXBkYXRlX3BjbV9idWZfZW50cnk6IFwKLQkJCQlleHBlY3RlZD0leCByZXQ9JXhcbiIsCi0JCQkJYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHIsCi0JCQkJcGF5bG9hZFsxICsgaW5kZXggKiAyXSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLnVzZWQgPT0gMCkgewotCQlhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQl9IGVsc2UgewotCQlNTV9EQkcoInJlYWQgY2Fubm90IGtlZXAgdXBcbiIpOwotCQlhdWRpby0+YnVmX3JlZnJlc2ggPSAxOwotCX0KLQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcGxheV9kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgICB2b2lkICgqZ2V0ZXZlbnQpICh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRpbyAqYXVkaW8gPSBkYXRhOwotCXVpbnQzMl90IG1zZ1syOF07Ci0KLQlnZXRldmVudChtc2csIHNpemVvZihtc2cpKTsKLQotCU1NX0RCRygibXNnX2lkPSV4XG4iLCBpZCk7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQTEFZX01TR19ERUNfTkVFRFNfREFUQToKLQkJYXVkcGxheV9zZW5kX2RhdGEoYXVkaW8sIDEpOwotCQlicmVhazsKLQotCWNhc2UgQVVEUExBWV9NU0dfQlVGRkVSX1VQREFURToKLQkJYXVkaW9fdXBkYXRlX3BjbV9idWZfZW50cnkoYXVkaW8sIG1zZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBRFNQX01FU1NBR0VfSUQ6Ci0JCU1NX0RCRygiUmVjZWl2ZWQgQURTUCBldmVudDogbW9kdWxlIGVuYWJsZShhdWRwbGF5dGFzaylcbiIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigidW5leHBlY3RlZCBtZXNzYWdlIGZyb20gZGVjb2RlciBcbiIpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2RzcF9ldmVudCh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gcHJpdmF0ZTsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFVRFBQX01TR19TVEFUVVNfTVNHOnsKLQkJCXVuc2lnbmVkIHN0YXR1cyA9IG1zZ1sxXTsKLQotCQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19TTEVFUDogewotCQkJCXVpbnQxNl90IHJlYXNvbiA9IG1zZ1syXTsKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOnNsZWVwIHJlYXNvbiA9IFwKLQkJCQkJCTB4JTA0eFxuIiwgcmVhc29uKTsKLQkJCQlpZiAoKHJlYXNvbiA9PSBBVURQUF9NU0dfUkVBU09OX01FTSkKLQkJCQkJfHwgKHJlYXNvbiA9PQotCQkJCQlBVURQUF9NU0dfUkVBU09OX05PREVDT0RFUikpIHsKLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfRkFJTFVSRTsKLQkJCQkJd2FrZV91cCgmYXVkaW8tPndhaXQpOwotCQkJCX0gZWxzZSBpZiAocmVhc29uID09IEFVRFBQX01TR19SRUFTT05fTk9ORSkgewotCQkJCQkvKiBkZWNvZGVyIGlzIGluIGRpc2FibGUgc3RhdGUgKi8KLQkJCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCQlNU01fQVVEX0RFQ09ERVJfU1RBVEVfQ0xPU0U7Ci0JCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEFVRFBQX0RFQ19TVEFUVVNfSU5JVDoKLQkJCQlNTV9EQkcoImRlY29kZXIgc3RhdHVzOiBpbml0XG4iKTsKLQkJCQlpZiAoYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJCQkJYXVkcHBfY21kX2NmZ19yb3V0aW5nX21vZGUoYXVkaW8pOwotCQkJCWVsc2UKLQkJCQkJYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhhdWRpbyk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19DRkc6Ci0JCQkJTU1fREJHKCJkZWNvZGVyIHN0YXR1czogY2ZnXG4iKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVEUFBfREVDX1NUQVRVU19QTEFZOgotCQkJCU1NX0RCRygiZGVjb2RlciBzdGF0dXM6IHBsYXkgXG4iKTsKLQkJCQlhdWRwcF9yb3V0ZV9zdHJlYW0oYXVkaW8tPmRlY19pZCwKLQkJCQkJCWF1ZGlvLT5zb3VyY2UpOwotCQkJCWlmIChhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCQkJCWF1ZHBsYXlfY29uZmlnX2hvc3RwY20oYXVkaW8pOwotCQkJCQlhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQkJCQl9Ci0JCQkJYXVkaW8tPmRlY19zdGF0ZSA9Ci0JCQkJCU1TTV9BVURfREVDT0RFUl9TVEFURV9TVUNDRVNTOwotCQkJCXdha2VfdXAoJmF1ZGlvLT53YWl0KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJTU1fRVJSKCJ1bmtub3duIGRlY29kZXIgc3RhdHVzXG4iKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURQUF9NU0dfQ0ZHX01TRzoKLQkJaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0VOQSkgewotCQkJTU1fREJHKCJDRkdfTVNHIEVOQUJMRVxuIik7Ci0JCQlhdWRkZWNfZHNwX2NvbmZpZyhhdWRpbywgMSk7Ci0JCQlhdWRpby0+b3V0X25lZWRlZCA9IDA7Ci0JCQlhdWRpby0+cnVubmluZyA9IDE7Ci0JCQlhdWRwcF9kc3Bfc2V0X3ZvbF9wYW4oYXVkaW8tPmRlY19pZCwgJmF1ZGlvLT52b2xfcGFuLAotCQkJCQlQT1BQKTsKLQkJCWF1ZHBwX2RzcF9zZXRfZXEoYXVkaW8tPmRlY19pZCwgYXVkaW8tPmVxX2VuYWJsZSwKLQkJCQkJJmF1ZGlvLT5lcSwgUE9QUCk7Ci0JCX0gZWxzZSBpZiAobXNnWzBdID09IEFVRFBQX01TR19FTkFfRElTKSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgRElTQUJMRVxuIik7Ci0JCQlhdWRpby0+cnVubmluZyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlNTV9EQkcoIkNGR19NU0cgJWQ/XG4iLCBtc2dbMF0pOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX1JPVVRJTkdfQUNLOgotCQlNTV9EQkcoIlJPVVRJTkdfQUNLIG1vZGU9JWRcbiIsIG1zZ1sxXSk7Ci0JCWF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXMoYXVkaW8pOwotCQlicmVhazsKLQotCWNhc2UgQVVEUFBfTVNHX0ZMVVNIX0FDSzoKLQkJTU1fREJHKCJGTFVTSF9BQ0tcbiIpOwotCQlhdWRpby0+d2ZsdXNoID0gMDsKLQkJYXVkaW8tPnJmbHVzaCA9IDA7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCQlhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVRFBQX01TR19QQ01ETUFNSVNTRUQ6Ci0JCU1NX0RCRygiUENNRE1BTUlTU0VEXG4iKTsKLQkJYXVkaW8tPnRlb3MgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURQUF9NU0dfQVZTWU5DX01TRzoKLQkJTU1fREJHKCJBVURQUF9NU0dfQVZTWU5DX01TR1xuIik7Ci0JCW1lbWNweSgmYXVkaW8tPmF2c3luY1swXSwgbXNnLCBzaXplb2YoYXVkaW8tPmF2c3luYykpOwotCQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+YXZzeW5jX3dhaXQpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiVU5LTk9XTiAoJWQpXG4iLCBpZCk7Ci0JfQotCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGF1ZHBsYXlfYWRzcF9vcHNfd21hcHJvID0gewotCS5ldmVudCA9IGF1ZHBsYXlfZHNwX2V2ZW50LAotfTsKLQotI2RlZmluZSBhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCBjbWQsIGxlbikgXAotCW1zbV9hZHNwX3dyaXRlKGF1ZGlvLT5hdWRwbGF5LCBhdWRpby0+cXVldWVfaWQsIFwKLQkJCWNtZCwgbGVuKQotCi1zdGF0aWMgaW50IGF1ZGRlY19kc3BfY29uZmlnKHN0cnVjdCBhdWRpbyAqYXVkaW8sIGludCBlbmFibGUpCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfZGVjX3R5cGUgY2ZnX2RlY19jbWQ7Ci0KLQltZW1zZXQoJmNmZ19kZWNfY21kLCAwLCBzaXplb2YoY2ZnX2RlY19jbWQpKTsKLQotCWNmZ19kZWNfY21kLmNtZF9pZCA9IEFVRFBQX0NNRF9DRkdfREVDX1RZUEU7Ci0JaWYgKGVuYWJsZSkKLQkJY2ZnX2RlY19jbWQuZGVjX2NmZyA9IEFVRFBQX0NNRF9VUERBVERFX0NGR19ERUMgfAotCQkJCUFVRFBQX0NNRF9FTkFfREVDX1YgfCBBVURERUNfREVDX1dNQVBSTzsKLQllbHNlCi0JCWNmZ19kZWNfY21kLmRlY19jZmcgPSBBVURQUF9DTURfVVBEQVRERV9DRkdfREVDIHwKLQkJCQlBVURQUF9DTURfRElTX0RFQ19WOwotCWNmZ19kZWNfY21kLmRtX21vZGUgPSAweDA7Ci0JY2ZnX2RlY19jbWQuc3RyZWFtX2lkID0gYXVkaW8tPmRlY19pZDsKLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTEoJmNmZ19kZWNfY21kLCBzaXplb2YoY2ZnX2RlY19jbWQpKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtcyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnX2FkZWNfcGFyYW1zX3dtYXBybyBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jb21tb24uY21kX2lkID0gQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNUzsKLQljbWQuY29tbW9uLmxlbmd0aCA9IEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVNfV01BUFJPX0xFTjsKLQljbWQuY29tbW9uLmRlY19pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmNvbW1vbi5pbnB1dF9zYW1wbGluZ19mcmVxdWVuY3kgPSBhdWRpby0+b3V0X3NhbXBsZV9yYXRlOwotCi0JLyoKLQkgKiBUZXN0IGRvbmUgZm9yIHNhbXBsZSB3aXRoIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbgotCSAqIGFybWRhdGFyZXF0aHIgCT0gMTI2MgotCSAqIGNoYW5uZWxzZGVjb2RlZCAJPSAxKE1PTk8pLzIoU1RFUkVPKQotCSAqIHdtYXByb2J5dGVzcGVyc2VjIAk9IFRlc3RlZCB3aXRoIDYwMDMgQnl0ZXMgcGVyIHNlYwotCSAqIHdtYXByb3NhbXBsaW5nZnJlcQk9IDQ0MTAwCi0JICogd21hcHJvZW5jb2Rlcm9wdHMJPSAzMQotCSAqLwotCi0JY21kLmFybWRhdGFyZXF0aHIgPSBhdWRpby0+d21hcHJvX2NvbmZpZy5hcm1kYXRhcmVxdGhyOwotCWNtZC5udW1jaGFubmVscyA9IGF1ZGlvLT53bWFwcm9fY29uZmlnLm51bWNoYW5uZWxzOwotCWNtZC52YWxpZGJpdHNwZXJzYW1wbGUgPSBhdWRpby0+d21hcHJvX2NvbmZpZy52YWxpZGJpdHNwZXJzYW1wbGU7Ci0JY21kLmZvcm1hdHRhZyA9IGF1ZGlvLT53bWFwcm9fY29uZmlnLmZvcm1hdHRhZzsKLQljbWQuc2FtcGxpbmdyYXRlID0gYXVkaW8tPndtYXByb19jb25maWcuc2FtcGxpbmdyYXRlOwotCWNtZC5hdmdieXRlc3BlcnNlY29uZCA9IGF1ZGlvLT53bWFwcm9fY29uZmlnLmF2Z2J5dGVzcGVyc2Vjb25kOwotCWNtZC5hc2ZwYWNrZXRsZW5ndGggPSBhdWRpby0+d21hcHJvX2NvbmZpZy5hc2ZwYWNrZXRsZW5ndGg7Ci0JY21kLmNoYW5uZWxtYXNrID0gYXVkaW8tPndtYXByb19jb25maWcuY2hhbm5lbG1hc2s7Ci0JY21kLmVuY29kZW9wdCA9IGF1ZGlvLT53bWFwcm9fY29uZmlnLmVuY29kZW9wdDsKLQljbWQuYWR2YW5jZWRlbmNvZGVvcHQgPSBhdWRpby0+d21hcHJvX2NvbmZpZy5hZHZhbmNlZGVuY29kZW9wdDsKLQljbWQuYWR2YW5jZWRlbmNvZGVvcHQyID0gYXVkaW8tPndtYXByb19jb25maWcuYWR2YW5jZWRlbmNvZGVvcHQyOwotCi0JYXVkcHBfc2VuZF9xdWV1ZTIoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwcF9jbWRfY2ZnX3JvdXRpbmdfbW9kZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRwcF9jbWRfcm91dGluZ19tb2RlIGNtZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUFBfQ01EX1JPVVRJTkdfTU9ERTsKLQljbWQub2JqZWN0X251bWJlciA9IGF1ZGlvLT5kZWNfaWQ7Ci0JaWYgKGF1ZGlvLT5wY21fZmVlZGJhY2spCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfRlRSVDsKLQllbHNlCi0JCWNtZC5yb3V0aW5nX21vZGUgPSBST1VUSU5HX01PREVfUlQ7Ci0KLQlhdWRwcF9zZW5kX3F1ZXVlMSgmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfYnVmZmVyX3JlZnJlc2goc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfYnVmZmVyX3JlZnJlc2ggcmVmcmVzaF9jbWQ7Ci0KLQlyZWZyZXNoX2NtZC5jbWRfaWQgPSBBVURQTEFZX0NNRF9CVUZGRVJfUkVGUkVTSDsKLQlyZWZyZXNoX2NtZC5udW1fYnVmZmVycyA9IDE7Ci0JcmVmcmVzaF9jbWQuYnVmMF9hZGRyZXNzID0gYXVkaW8tPmluW2F1ZGlvLT5maWxsX25leHRdLmFkZHI7Ci0JcmVmcmVzaF9jbWQuYnVmMF9sZW5ndGggPSBhdWRpby0+aW5bYXVkaW8tPmZpbGxfbmV4dF0uc2l6ZTsKLQlyZWZyZXNoX2NtZC5idWZfcmVhZF9jb3VudCA9IDA7Ci0KLQlNTV9EQkcoImJ1ZjBfYWRkcj0leCBidWYwX2xlbj0lZFxuIiwKLQkJCXJlZnJlc2hfY21kLmJ1ZjBfYWRkcmVzcywKLQkJCXJlZnJlc2hfY21kLmJ1ZjBfbGVuZ3RoKTsKLQotCSh2b2lkKWF1ZHBsYXlfc2VuZF9xdWV1ZTAoYXVkaW8sICZyZWZyZXNoX2NtZCwgc2l6ZW9mKHJlZnJlc2hfY21kKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBsYXlfY29uZmlnX2hvc3RwY20oc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfaHBjbV9idWZfY2ZnIGNmZ19jbWQ7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCWNmZ19jbWQuY21kX2lkID0gQVVEUExBWV9DTURfSFBDTV9CVUZfQ0ZHOwotCWNmZ19jbWQubWF4X2J1ZmZlcnMgPSBhdWRpby0+cGNtX2J1Zl9jb3VudDsKLQljZmdfY21kLmJ5dGVfc3dhcCA9IDA7Ci0JY2ZnX2NtZC5ob3N0cGNtX2NvbmZpZyA9ICgweDgwMDApIHwgKDB4NDAwMCk7Ci0JY2ZnX2NtZC5mZWVkYmFja19mcmVxdWVuY3kgPSAxOwotCWNmZ19jbWQucGFydGl0aW9uX251bWJlciA9IDA7Ci0KLQkodm9pZClhdWRwbGF5X3NlbmRfcXVldWUwKGF1ZGlvLCAmY2ZnX2NtZCwgc2l6ZW9mKGNmZ19jbWQpKTsKLX0KLQotCi1zdGF0aWMgaW50IGF1ZHBsYXlfZHNwX3NlbmRfZGF0YV9hdmFpbChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQkJCQl1bnNpZ25lZCBpZHgsIHVuc2lnbmVkIGxlbikKLXsKLQlzdHJ1Y3QgYXVkcGxheV9jbWRfYml0c3RyZWFtX2RhdGFfYXZhaWxfbnQyIGNtZDsKLQotCWNtZC5jbWRfaWQJCT0gQVVEUExBWV9DTURfQklUU1RSRUFNX0RBVEFfQVZBSUxfTlQyOwotCWlmIChhdWRpby0+bWZpZWxkKQotCQljbWQuZGVjb2Rlcl9pZCA9IEFVRFdNQVBST19NRVRBRklFTERfTUFTSyB8Ci0JCQkoYXVkaW8tPm91dFtpZHhdLm1maWVsZF9zeiA+PiAxKTsKLQllbHNlCi0JCWNtZC5kZWNvZGVyX2lkCQk9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmJ1Zl9wdHIJCT0gYXVkaW8tPm91dFtpZHhdLmFkZHI7Ci0JY21kLmJ1Zl9zaXplCQk9IGxlbi8yOwotCWNtZC5wYXJ0aXRpb25fbnVtYmVyCT0gMDsKLQlyZXR1cm4gYXVkcGxheV9zZW5kX3F1ZXVlMChhdWRpbywgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwbGF5X3NlbmRfZGF0YShzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCB1bnNpZ25lZCBuZWVkZWQpCi17Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWF1ZGlvLT5ydW5uaW5nKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAoYXVkaW8tPndmbHVzaCkgewotCQlhdWRpby0+b3V0X25lZWRlZCA9IDE7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAobmVlZGVkICYmICFhdWRpby0+d2ZsdXNoKSB7Ci0JCS8qIFdlIHdlcmUgY2FsbGVkIGZyb20gdGhlIGNhbGxiYWNrIGJlY2F1c2UgdGhlIERTUAotCQkgKiByZXF1ZXN0ZWQgbW9yZSBkYXRhLiAgTm90ZSB0aGF0IHRoZSBEU1AgZG9lcyB3YW50Ci0JCSAqIG1vcmUgZGF0YSwgYW5kIGlmIGEgYnVmZmVyIHdhcyBpbi1mbGlnaHQsIG1hcmsgaXQKLQkJICogYXMgYXZhaWxhYmxlIChzaW5jZSB0aGUgRFNQIG11c3Qgbm93IGJlIGRvbmUgd2l0aAotCQkgKiBpdCkuCi0JCSAqLwotCQlhdWRpby0+b3V0X25lZWRlZCA9IDE7Ci0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkID09IDB4ZmZmZmZmZmYpIHsKLQkJCU1NX0RCRygiZnJhbWUgJWQgZnJlZVxuIiwgYXVkaW8tPm91dF90YWlsKTsKLQkJCWZyYW1lLT51c2VkID0gMDsKLQkJCWF1ZGlvLT5vdXRfdGFpbCBePSAxOwotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl9Ci0JfQotCi0JaWYgKGF1ZGlvLT5vdXRfbmVlZGVkKSB7Ci0JCS8qIElmIHRoZSBEU1AgY3VycmVudGx5IHdhbnRzIGRhdGEgYW5kIHdlIGhhdmUgYQotCQkgKiBidWZmZXIgYXZhaWxhYmxlLCB3ZSB3aWxsIHNlbmQgaXQgYW5kIHJlc2V0Ci0JCSAqIHRoZSBuZWVkZWQgZmxhZy4gIFdlJ2xsIG1hcmsgdGhlIGJ1ZmZlciBhcyBpbi1mbGlnaHQKLQkJICogc28gdGhhdCBpdCB3b24ndCBiZSByZWN5Y2xlZCB1bnRpbCB0aGUgbmV4dCBidWZmZXIKLQkJICogaXMgcmVxdWVzdGVkCi0JCSAqLwotCi0JCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JCWZyYW1lID0gYXVkaW8tPm91dCArIGF1ZGlvLT5vdXRfdGFpbDsKLQkJaWYgKGZyYW1lLT51c2VkKSB7Ci0JCQlCVUdfT04oZnJhbWUtPnVzZWQgPT0gMHhmZmZmZmZmZik7Ci0JCQlNTV9EQkcoImZyYW1lICVkIGJ1c3lcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JCQlhdWRwbGF5X2RzcF9zZW5kX2RhdGFfYXZhaWwoYXVkaW8sIGF1ZGlvLT5vdXRfdGFpbCwKLQkJCQkJCQkJZnJhbWUtPnVzZWQpOwotCQkJZnJhbWUtPnVzZWQgPSAweGZmZmZmZmZmOwotCQkJYXVkaW8tPm91dF9uZWVkZWQgPSAwOwotCQl9Ci0JfQotZG9uZToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkZXZpY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyB2b2lkIGF1ZGlvX2ZsdXNoKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JYXVkaW8tPm91dFswXS51c2VkID0gMDsKLQlhdWRpby0+b3V0WzFdLnVzZWQgPSAwOwotCWF1ZGlvLT5vdXRfaGVhZCA9IDA7Ci0JYXVkaW8tPm91dF90YWlsID0gMDsKLQlhdWRpby0+cmVzZXJ2ZWQgPSAwOwotCWF0b21pY19zZXQoJmF1ZGlvLT5vdXRfYnl0ZXMsIDApOwotfQotCi1zdGF0aWMgdm9pZCBhdWRpb19mbHVzaF9wY21fYnVmKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0JdWludDhfdCBpbmRleDsKLQotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFBDTV9CVUZfTUFYX0NPVU5UOyBpbmRleCsrKQotCQlhdWRpby0+aW5baW5kZXhdLnVzZWQgPSAwOwotCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDA7Ci0JYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JYXVkaW8tPmZpbGxfbmV4dCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2lvcG9ydF9yZXNldChzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCS8qIE1ha2Ugc3VyZSByZWFkL3dyaXRlIHRocmVhZCBhcmUgZnJlZSBmcm9tCi0JICogc2xlZXAgYW5kIGtub3dpbmcgdGhhdCBzeXN0ZW0gaXMgbm90IGFibGUKLQkgKiB0byBwcm9jZXNzIGlvIHJlcXVlc3QgYXQgdGhlIG1vbWVudAotCSAqLwotCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JYXVkaW9fZmx1c2goYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCWF1ZGlvX2ZsdXNoX3BjbV9idWYoYXVkaW8pOwotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JYXVkaW8tPmF2c3luY19mbGFnID0gMTsKLQl3YWtlX3VwKCZhdWRpby0+YXZzeW5jX3dhaXQpOwotfQotCi1zdGF0aWMgaW50IGF1ZHdtYXByb19ldmVudHNfcGVuZGluZyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGVtcHR5OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JZW1wdHkgPSAhbGlzdF9lbXB0eSgmYXVkaW8tPmV2ZW50X3F1ZXVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCXJldHVybiBlbXB0eSB8fCBhdWRpby0+ZXZlbnRfYWJvcnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHdtYXByb19yZXNldF9ldmVudF9xdWV1ZShzdHJ1Y3QgYXVkaW8gKmF1ZGlvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGF1ZHdtYXByb19ldmVudCAqZHJ2X2V2dDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmV2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWR3bWFwcm9fZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWR3bWFwcm9fZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgbG9uZyBhdWR3bWFwcm9fcHJvY2Vzc19ldmVudF9yZXEoc3RydWN0IGF1ZGlvICphdWRpbywgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlsb25nIHJjOwotCXN0cnVjdCBtc21fYXVkaW9fZXZlbnQgdXNyX2V2dDsKLQlzdHJ1Y3QgYXVkd21hcHJvX2V2ZW50ICpkcnZfZXZ0ID0gTlVMTDsKLQlpbnQgdGltZW91dDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ1c3JfZXZ0LCBhcmcsIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JdGltZW91dCA9IChpbnQpIHVzcl9ldnQudGltZW91dF9tczsKLQotCWlmICh0aW1lb3V0ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF1ZGlvLT5ldmVudF93YWl0LAotCQkJCWF1ZHdtYXByb19ldmVudHNfcGVuZGluZyhhdWRpbyksCi0JCQkJbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7Ci0JCWlmIChyYyA9PSAwKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JfSBlbHNlIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCi0JCQlhdWRpby0+ZXZlbnRfd2FpdCwgYXVkd21hcHJvX2V2ZW50c19wZW5kaW5nKGF1ZGlvKSk7Ci0JfQotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGF1ZGlvLT5ldmVudF9hYm9ydCkgewotCQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAwOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyYyA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSkpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgYXVkd21hcHJvX2V2ZW50LCBsaXN0KTsKLQkJbGlzdF9kZWwoJmRydl9ldnQtPmxpc3QpOwotCX0KLQotCWlmIChkcnZfZXZ0KSB7Ci0JCXVzcl9ldnQuZXZlbnRfdHlwZSA9IGRydl9ldnQtPmV2ZW50X3R5cGU7Ci0JCXVzcl9ldnQuZXZlbnRfcGF5bG9hZCA9IGRydl9ldnQtPnBheWxvYWQ7Ci0JCWxpc3RfYWRkX3RhaWwoJmRydl9ldnQtPmxpc3QsICZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JfSBlbHNlCi0JCXJjID0gLTE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghcmMgJiYgY29weV90b191c2VyKGFyZywgJnVzcl9ldnQsIHNpemVvZih1c3JfZXZ0KSkpCi0JCXJjID0gLUVGQVVMVDsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19lbmFibGVfZXEoc3RydWN0IGF1ZGlvICphdWRpbywgaW50IGVuYWJsZSkKLXsKLQlpZiAoYXVkaW8tPmVxX2VuYWJsZSA9PSBlbmFibGUgJiYgIWF1ZGlvLT5lcV9uZWVkc19jb21taXQpCi0JCXJldHVybiAwOwotCi0JYXVkaW8tPmVxX2VuYWJsZSA9IGVuYWJsZTsKLQotCWlmIChhdWRpby0+cnVubmluZykgewotCQlhdWRwcF9kc3Bfc2V0X2VxKGF1ZGlvLT5kZWNfaWQsIGVuYWJsZSwgJmF1ZGlvLT5lcSwgUE9QUCk7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19nZXRfYXZzeW5jX2RhdGEoc3RydWN0IGF1ZGlvICphdWRpbywKLQkJCQkJCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgKnN0YXRzKQotewotCWludCByYyA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAoYXVkaW8tPmRlY19pZCA9PSBhdWRpby0+YXZzeW5jWzBdICYmIGF1ZGlvLT5hdnN5bmNfZmxhZykgewotCQkvKiBhdl9zeW5jIHNhbXBsZSBjb3VudCAqLwotCQlzdGF0cy0+c2FtcGxlX2NvdW50ID0gKGF1ZGlvLT5hdnN5bmNbMl0gPDwgMTYpIHwKLQkJCQkJCShhdWRpby0+YXZzeW5jWzNdKTsKLQotCQkvKiBhdl9zeW5jIGJ5dGVfY291bnQgKi8KLQkJc3RhdHMtPmJ5dGVfY291bnQgPSAoYXVkaW8tPmF2c3luY1s1XSA8PCAxNikgfAotCQkJCQkJKGF1ZGlvLT5hdnN5bmNbNl0pOwotCi0JCWF1ZGlvLT5hdnN5bmNfZmxhZyA9IDA7Ci0JCXJjID0gMDsKLQl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiByYzsKLQotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXVpbnQxNl90IGVuYWJsZV9tYXNrOwotCWludCBlbmFibGU7Ci0JaW50IHByZXZfc3RhdGU7Ci0KLQlNTV9EQkcoImNtZCA9ICVkXG4iLCBjbWQpOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfU1RBVFMpIHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyBzdGF0czsKLQotCQlhdWRpby0+YXZzeW5jX2ZsYWcgPSAwOwotCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKLQkJaWYgKGF1ZHBwX3F1ZXJ5X2F2c3luYyhhdWRpby0+ZGVjX2lkKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdWRpby0+YXZzeW5jX3dhaXQsCi0JCQkJKGF1ZGlvLT5hdnN5bmNfZmxhZyA9PSAxKSwKLQkJCQltc2Vjc190b19qaWZmaWVzKEFVRFBQX0FWU1lOQ19FVkVOVF9USU1FT1VUKSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJZWxzZSBpZiAoKHJjID4gMCkgfHwgKChyYyA9PSAwKSAmJiAoYXVkaW8tPmF2c3luY19mbGFnID09IDEpKSkgewotCQkJaWYgKGF1ZGlvX2dldF9hdnN5bmNfZGF0YShhdWRpbywgJnN0YXRzKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0VOQUJMRV9BVURQUDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZlbmFibGVfbWFzaywgKHZvaWQgKikgYXJnLAotCQkJCQkJc2l6ZW9mKGVuYWJsZV9tYXNrKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQllbmFibGUgPSAoZW5hYmxlX21hc2sgJiBFUV9FTkFCTEUpID8gMSA6IDA7Ci0JCWF1ZGlvX2VuYWJsZV9lcShhdWRpbywgZW5hYmxlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnZvbHVtZSA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfUEFOOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCWF1ZGlvLT52b2xfcGFuLnBhbiA9IGFyZzsKLQkJaWYgKGF1ZGlvLT5ydW5uaW5nKQotCQkJYXVkcHBfZHNwX3NldF92b2xfcGFuKGF1ZGlvLT5kZWNfaWQsICZhdWRpby0+dm9sX3BhbiwKLQkJCQkJUE9QUCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVURJT19TRVRfRVE6Ci0JCXByZXZfc3RhdGUgPSBhdWRpby0+ZXFfZW5hYmxlOwotCQlhdWRpby0+ZXFfZW5hYmxlID0gMDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhdWRpby0+ZXEubnVtX2JhbmRzLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGF1ZGlvLT5lcSkgLQotCQkJCShBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVNfQ09NTU9OX0xFTiArIDIpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPmVxX2VuYWJsZSA9IHByZXZfc3RhdGU7Ci0JCWF1ZGlvLT5lcV9uZWVkc19jb21taXQgPSAxOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCWlmICgtRUlOVkFMICE9IHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9FVkVOVCkgewotCQlNTV9EQkcoIkFVRElPX0dFVF9FVkVOVFxuIik7Ci0JCWlmIChtdXRleF90cnlsb2NrKCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spKSB7Ci0JCQlyYyA9IGF1ZHdtYXByb19wcm9jZXNzX2V2ZW50X3JlcShhdWRpbywKLQkJCQkJKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCQltdXRleF91bmxvY2soJmF1ZGlvLT5nZXRfZXZlbnRfbG9jayk7Ci0JCX0gZWxzZQotCQkJcmMgPSAtRUJVU1k7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlpZiAoY21kID09IEFVRElPX0FCT1JUX0dFVF9FVkVOVCkgewotCQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0JCXJldHVybiAwOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6Ci0JCU1NX0RCRygiQVVESU9fU1RBUlRcbiIpOwotCQlyYyA9IGF1ZGlvX2VuYWJsZShhdWRpbyk7Ci0JCWlmICghcmMpIHsKLQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPndhaXQsCi0JCQkJYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfTk9ORSwKLQkJCQltc2Vjc190b19qaWZmaWVzKE1TTV9BVURfREVDT0RFUl9XQUlUX01TKSk7Ci0JCQlNTV9JTkZPKCJkZWNfc3RhdGUgJWQgcmMgPSAlZFxuIiwgYXVkaW8tPmRlY19zdGF0ZSwgcmMpOwotCi0JCQlpZiAoYXVkaW8tPmRlY19zdGF0ZSAhPSBNU01fQVVEX0RFQ09ERVJfU1RBVEVfU1VDQ0VTUykKLQkJCQlyYyA9IC1FTk9ERVY7Ci0JCQllbHNlCi0JCQkJcmMgPSAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU1RPUDoKLQkJTU1fREJHKCJBVURJT19TVE9QXG4iKTsKLQkJcmMgPSBhdWRpb19kaXNhYmxlKGF1ZGlvKTsKLQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQlhdWRpb19pb3BvcnRfcmVzZXQoYXVkaW8pOwotCQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fRkxVU0g6Ci0JCU1NX0RCRygiQVVESU9fRkxVU0hcbiIpOwotCQlhdWRpby0+cmZsdXNoID0gMTsKLQkJYXVkaW8tPndmbHVzaCA9IDE7Ci0JCWF1ZGlvX2lvcG9ydF9yZXNldChhdWRpbyk7Ci0JCWlmIChhdWRpby0+cnVubmluZykgewotCQkJYXVkcHBfZmx1c2goYXVkaW8tPmRlY19pZCk7Ci0JCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkhYXVkaW8tPndmbHVzaCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJTU1fRVJSKCJBVURJT19GTFVTSCBpbnRlcnJ1cHRlZFxuIik7Ci0JCQkJcmMgPSAtRUlOVFI7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+cmZsdXNoID0gMDsKLQkJCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjb25maWc7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY29uZmlnLCAodm9pZCAqKSBhcmcsIHNpemVvZihjb25maWcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvbmZpZy5jaGFubmVsX2NvdW50ID09IDEpIHsKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gQVVEUFBfQ01EX1BDTV9JTlRGX01PTk9fVjsKLQkJfSBlbHNlIGlmIChjb25maWcuY2hhbm5lbF9jb3VudCA9PSAyKSB7Ci0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IEFVRFBQX0NNRF9QQ01fSU5URl9TVEVSRU9fVjsKLQkJfSBlbHNlIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWF1ZGlvLT5tZmllbGQgPSBjb25maWcubWV0YV9maWVsZDsKLQkJYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLQkJYXVkaW8tPm91dF9jaGFubmVsX21vZGUgPSBjb25maWcuY2hhbm5lbF9jb3VudDsKLQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gKGF1ZGlvLT5vdXRfZG1hX3N6ID4+IDEpOwotCQljb25maWcuYnVmZmVyX2NvdW50ID0gMjsKLQkJY29uZmlnLnNhbXBsZV9yYXRlID0gYXVkaW8tPm91dF9zYW1wbGVfcmF0ZTsKLQkJaWYgKGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlID09IEFVRFBQX0NNRF9QQ01fSU5URl9NT05PX1YpCi0JCQljb25maWcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JCWVsc2UKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gMjsKLQkJY29uZmlnLm1ldGFfZmllbGQgPSAwOwotCQljb25maWcudW51c2VkWzBdID0gMDsKLQkJY29uZmlnLnVudXNlZFsxXSA9IDA7Ci0JCWNvbmZpZy51bnVzZWRbMl0gPSAwOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX1dNQVBST19DT05GSUc6ewotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmF1ZGlvLT53bWFwcm9fY29uZmlnLAotCQkJCXNpemVvZihhdWRpby0+d21hcHJvX2NvbmZpZykpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWVsc2UKLQkJCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgQVVESU9fU0VUX1dNQVBST19DT05GSUc6ewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWcgdXNyX2NvbmZpZzsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIKLQkJCSgmdXNyX2NvbmZpZywgKHZvaWQgKilhcmcsCi0JCQlzaXplb2YodXNyX2NvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWF1ZGlvLT53bWFwcm9fY29uZmlnID0gdXNyX2NvbmZpZzsKLQotCQkvKiBOZWVkIHRvIHN3YXAgdGhlIGZpcnN0IGFuZCBsYXN0IHdvcmRzIG9mIGFkdmFuY2VkZW5jb2Rlb3B0MgotCQkgKiBhcyBEU1AgY2Fubm90IHJlYWQgMzItYml0IHZhcmlhYmxlIGF0IGEgdGltZS4gTmVlZCB0byBiZQotCQkgKiBzcGxpdCBpbnRvIHR3byAxNi1iaXQgYW5kIHN3YXAgdGhlbSBhcyByZXF1aXJlZCBieSBEU1AgKi8KLQotCQlhdWRpby0+d21hcHJvX2NvbmZpZy5hZHZhbmNlZGVuY29kZW9wdDIgPQotCQkJKChhdWRpby0+d21hcHJvX2NvbmZpZy5hZHZhbmNlZGVuY29kZW9wdDIgJiAweEZGRkYwMDAwKQotCQkJID4+IDE2KSB8ICgoYXVkaW8tPndtYXByb19jb25maWcuYWR2YW5jZWRlbmNvZGVvcHQyCi0JCQkgPDwgMTYpICYgMHhGRkZGMDAwMCk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX1BDTV9DT05GSUc6ewotCQkJc3RydWN0IG1zbV9hdWRpb19wY21fY29uZmlnIGNvbmZpZzsKLQkJCWNvbmZpZy5wY21fZmVlZGJhY2sgPSBhdWRpby0+cGNtX2ZlZWRiYWNrOwotCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfTUFYX0NPVU5UOwotCQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjb25maWcsCi0JCQkJCSBzaXplb2YoY29uZmlnKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJZWxzZQotCQkJCXJjID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURJT19TRVRfUENNX0NPTkZJRzp7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX3BjbV9jb25maWcgY29uZmlnOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkgICAgKCZjb25maWcsICh2b2lkICopYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY29uZmlnLnBjbV9mZWVkYmFjayAhPSBhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCQkJTU1fRVJSKCJOb3Qgc3VmZmljaWVudCBwZXJtaXNzaW9uIHRvIgotCQkJCQkJImNoYW5nZSB0aGUgcGxheWJhY2sgbW9kZVxuIik7Ci0JCQkJcmMgPSAtRUFDQ0VTOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKChjb25maWcuYnVmZmVyX2NvdW50ID4gUENNX0JVRl9NQVhfQ09VTlQpIHx8Ci0JCQkgICAgKGNvbmZpZy5idWZmZXJfY291bnQgPT0gMSkpCi0JCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfTUFYX0NPVU5UOwotCi0JCQlpZiAoY29uZmlnLmJ1ZmZlcl9zaXplIDwgUENNX0JVRlNaX01JTikKLQkJCQljb25maWcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCi0JCQkvKiBDaGVjayBpZiBwY20gZmVlZGJhY2sgaXMgcmVxdWlyZWQgKi8KLQkJCWlmICgoY29uZmlnLnBjbV9mZWVkYmFjaykgJiYgKCFhdWRpby0+cmVhZF9kYXRhKSkgewotCQkJCU1NX0RCRygiYWxsb2NhdGUgUENNIGJ1ZmZlciAlZFxuIiwKLQkJCQkJCWNvbmZpZy5idWZmZXJfY291bnQgKgotCQkJCQkJY29uZmlnLmJ1ZmZlcl9zaXplKTsKLQkJCQlhdWRpby0+cmVhZF9waHlzID0KLQkJCQkJCWFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKAotCQkJCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSAqCi0JCQkJCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCwKLQkJCQkJCQlTWl80Syk7Ci0JCQkJaWYgKCFhdWRpby0+cmVhZF9waHlzKSB7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWF1ZGlvLT5tYXBfdl9yZWFkID0gaW9yZW1hcCgKLQkJCQkJCQlhdWRpby0+cmVhZF9waHlzLAotCQkJCQkJCWNvbmZpZy5idWZmZXJfc2l6ZSAqCi0JCQkJCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCk7Ci0JCQkJaWYgKElTX0VSUihhdWRpby0+bWFwX3ZfcmVhZCkpIHsKLQkJCQkJTU1fRVJSKCJyZWFkIGJ1ZiBtYXAgZmFpbFxuIik7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcigKLQkJCQkJCQlhdWRpby0+cmVhZF9waHlzKTsKLQkJCQl9IGVsc2UgewotCQkJCQl1aW50OF90IGluZGV4OwotCQkJCQl1aW50MzJfdCBvZmZzZXQgPSAwOwotCQkJCQlhdWRpby0+cmVhZF9kYXRhID0KLQkJCQkJCWF1ZGlvLT5tYXBfdl9yZWFkOwotCQkJCQlhdWRpby0+cGNtX2ZlZWRiYWNrID0gMTsKLQkJCQkJYXVkaW8tPmJ1Zl9yZWZyZXNoID0gMDsKLQkJCQkJYXVkaW8tPnBjbV9idWZfY291bnQgPQotCQkJCQkgICAgY29uZmlnLmJ1ZmZlcl9jb3VudDsKLQkJCQkJYXVkaW8tPnJlYWRfbmV4dCA9IDA7Ci0JCQkJCWF1ZGlvLT5maWxsX25leHQgPSAwOwotCi0JCQkJCWZvciAoaW5kZXggPSAwOwotCQkJCQkgICAgIGluZGV4IDwgY29uZmlnLmJ1ZmZlcl9jb3VudDsKLQkJCQkJICAgICBpbmRleCsrKSB7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLmRhdGEgPQotCQkJCQkJICAgIGF1ZGlvLT5yZWFkX2RhdGEgKyBvZmZzZXQ7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLmFkZHIgPQotCQkJCQkJICAgIGF1ZGlvLT5yZWFkX3BoeXMgKyBvZmZzZXQ7Ci0JCQkJCQlhdWRpby0+aW5baW5kZXhdLnNpemUgPQotCQkJCQkJICAgIGNvbmZpZy5idWZmZXJfc2l6ZTsKLQkJCQkJCWF1ZGlvLT5pbltpbmRleF0udXNlZCA9IDA7Ci0JCQkJCQlvZmZzZXQgKz0gY29uZmlnLmJ1ZmZlcl9zaXplOwotCQkJCQl9Ci0JCQkJCU1NX0RCRygicmVhZCBidWY6IHBoeSBhZGRyIFwKLQkJCQkJCTB4JTA4eCBrZXJuZWwgYWRkciAweCUwOHhcbiIsCi0JCQkJCQlhdWRpby0+cmVhZF9waHlzLAotCQkJCQkJKGludClhdWRpby0+cmVhZF9kYXRhKTsKLQkJCQkJcmMgPSAwOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmMgPSAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEFVRElPX1BBVVNFOgotCQlNTV9EQkcoIkFVRElPX1BBVVNFICVsZFxuIiwgYXJnKTsKLQkJcmMgPSBhdWRwcF9wYXVzZShhdWRpby0+ZGVjX2lkLCAoaW50KSBhcmcpOwotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9TRVNTSU9OX0lEOgotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmF1ZGlvLT5kZWNfaWQsCi0JCQkJCXNpemVvZih1bnNpZ25lZCBzaG9ydCkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKiBPbmx5IHVzZWZ1bCBpbiB0dW5uZWwtbW9kZSAqLwotc3RhdGljIGludCBhdWRpb19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHBwb3MxLCBsb2ZmX3QgcHBvczIsIGludCBkYXRhc3luYykKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoIlxuIik7IC8qIE1hY3JvIHByaW50cyB0aGUgZmlsZSBuYW1lIGFuZCBmdW5jdGlvbiAqLwotCi0JaWYgKCFhdWRpby0+cnVubmluZyB8fCBhdWRpby0+cGNtX2ZlZWRiYWNrKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lX25vbG9jazsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKCFhdWRpby0+b3V0WzBdLnVzZWQgJiYKLQkJIWF1ZGlvLT5vdXRbMV0udXNlZCAmJgotCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChhdWRpby0+cmVzZXJ2ZWQpIHsKLQkJTU1fREJHKCJzZW5kIHJlc2VydmVkIGJ5dGVcbiIpOwotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X3RhaWw7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMF0gPSBhdWRpby0+cnN2X2J5dGU7Ci0JCSgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbMV0gPSAwOwotCQlmcmFtZS0+dXNlZCA9IDI7Ci0JCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCSghYXVkaW8tPm91dFswXS51c2VkICYmCi0JCQkhYXVkaW8tPm91dFsxXS51c2VkICYmCi0JCQlhdWRpby0+b3V0X25lZWRlZCkgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gZG9uZTsKLQkJZWxzZSBpZiAoYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQkvKiBwY20gZG1hbWlzcyBtZXNzYWdlIGlzIHNlbnQgY29udGlub3VzbHkKLQkgKiB3aGVuIGRlY29kZXIgaXMgc3RhcnZlZCBzbyBubyByYWNlCi0JICogY29uZGl0aW9uIGNvbmNlcm4KLQkgKi8KLQlhdWRpby0+dGVvcyA9IDA7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJYXVkaW8tPnRlb3MgfHwgYXVkaW8tPndmbHVzaCk7Ci0KLQlpZiAoYXVkaW8tPndmbHVzaCkKLQkJcmMgPSAtRUJVU1k7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci1kb25lX25vbG9jazoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF1ZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCSAgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0JaW50IHJjID0gMDsKLQotCWlmICghYXVkaW8tPnBjbV9mZWVkYmFjaykKLQkJcmV0dXJuIDA7IC8qIFBDTSBmZWVkYmFjayBpcyBub3QgZW5hYmxlZC4gTm90aGluZyB0byByZWFkICovCi0KLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQlNTV9EQkcoIiVkIFxuIiwgY291bnQpOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXVkaW8tPnJlYWRfd2FpdCwKLQkJCShhdWRpby0+aW5bYXVkaW8tPnJlYWRfbmV4dF0udXNlZCA+IDApIHx8Ci0JCQkoYXVkaW8tPnN0b3BwZWQpIHx8IChhdWRpby0+cmZsdXNoKSk7Ci0KLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCi0JCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+cmZsdXNoKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvdW50IDwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQpIHsKLQkJCS8qIFJlYWQgbXVzdCBoYXBwZW4gaW4gZnJhbWUgYm91bmRhcnkuIFNpbmNlIGRyaXZlcgotCQkJICAgZG9lcyBub3Qga25vdyBmcmFtZSBzaXplLCByZWFkIGNvdW50IG11c3QgYmUgZ3JlYXRlcgotCQkJICAgb3IgZXF1YWwgdG8gc2l6ZSBvZiBQQ00gc2FtcGxlcyAqLwotCQkJTU1fREJHKCJhdWRpb19yZWFkOiBubyBwYXJ0aWFsIGZyYW1lIGRvbmUgcmVhZGluZ1xuIik7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCU1NX0RCRygiYXVkaW9fcmVhZDogcmVhZCBmcm9tIGluWyVkXVxuIiwKLQkJCQkJYXVkaW8tPnJlYWRfbmV4dCk7Ci0JCQlpZiAoY29weV90b191c2VyCi0JCQkgICAgKGJ1ZiwgYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLmRhdGEsCi0JCQkgICAgIGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkKSkgewotCQkJCU1NX0VSUigiaW52YWxpZCBhZGRyICV4IFxuIiwgKHVuc2lnbmVkIGludClidWYpOwotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNvdW50IC09IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkOwotCQkJYnVmICs9IGF1ZGlvLT5pblthdWRpby0+cmVhZF9uZXh0XS51c2VkOwotCQkJYXVkaW8tPmluW2F1ZGlvLT5yZWFkX25leHRdLnVzZWQgPSAwOwotCQkJaWYgKCgrK2F1ZGlvLT5yZWFkX25leHQpID09IGF1ZGlvLT5wY21fYnVmX2NvdW50KQotCQkJCWF1ZGlvLT5yZWFkX25leHQgPSAwOwotCQkJYnJlYWs7CS8qIEZvcmNlIHRvIGV4aXQgd2hpbGUgbG9vcAotCQkJCSAqIHRvIHByZXZlbnQgb3V0cHV0IHRocmVhZAotCQkJCSAqIHNsZWVwIHRvbyBsb25nIGlmIGRhdGEgaXMKLQkJCQkgKiBub3QgcmVhZHkgYXQgdGhpcyBtb21lbnQuCi0JCQkJICovCi0JCX0KLQl9Ci0KLQkvKiBkb24ndCBmZWVkIG91dHB1dCBidWZmZXIgdG8gSFcgZGVjb2RlciBkdXJpbmcgZmx1c2hpbmcKLQkgKiBidWZmZXIgcmVmcmVzaCBjb21tYW5kIHdpbGwgYmUgc2VudCBvbmNlIGZsdXNoIGNvbXBsZXRlcwotCSAqIHNlbmQgYnVmIHJlZnJlc2ggY29tbWFuZCBoZXJlIGNhbiBjb25mdXNlIEhXIGRlY29kZXIKLQkgKi8KLQlpZiAoYXVkaW8tPmJ1Zl9yZWZyZXNoICYmICFhdWRpby0+cmZsdXNoKSB7Ci0JCWF1ZGlvLT5idWZfcmVmcmVzaCA9IDA7Ci0JCU1NX0RCRygia2ljayBzdGFydCBwY20gZmVlZGJhY2sgYWdhaW5cbiIpOwotCQlhdWRwbGF5X2J1ZmZlcl9yZWZyZXNoKGF1ZGlvKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCi0JaWYgKGJ1ZiA+IHN0YXJ0KQotCQlyYyA9IGJ1ZiAtIHN0YXJ0OwotCi0JTU1fREJHKCJyZWFkICVkIGJ5dGVzXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZHdtYXByb19wcm9jZXNzX2VvcyhzdHJ1Y3QgYXVkaW8gKmF1ZGlvLAotCQljb25zdCBjaGFyIF9fdXNlciAqYnVmX3N0YXJ0LCB1bnNpZ25lZCBzaG9ydCBtZmllbGRfc2l6ZSkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBidWZmZXIgKmZyYW1lOwotCWNoYXIgKmJ1Zl9wdHI7Ci0KLQlpZiAoYXVkaW8tPnJlc2VydmVkKSB7Ci0JCU1NX0RCRygiZmx1c2ggcmVzZXJ2ZSBieXRlXG4iKTsKLQkJZnJhbWUgPSBhdWRpby0+b3V0ICsgYXVkaW8tPm91dF9oZWFkOwotCQlidWZfcHRyID0gZnJhbWUtPmRhdGE7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT53cml0ZV93YWl0LAotCQkJCShmcmFtZS0+dXNlZCA9PSAwKQotCQkJCXx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQl8fCAoYXVkaW8tPndmbHVzaCkpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBkb25lOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlidWZfcHRyWzBdID0gYXVkaW8tPnJzdl9ieXRlOwotCQlidWZfcHRyWzFdID0gMDsKLQkJYXVkaW8tPm91dF9oZWFkIF49IDE7Ci0JCWZyYW1lLT5tZmllbGRfc3ogPSAwOwotCQlmcmFtZS0+dXNlZCA9IDI7Ci0JCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLQl9Ci0KLQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0KLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJKGF1ZGlvLT5vdXRfbmVlZGVkICYmCi0JCWF1ZGlvLT5vdXRbMF0udXNlZCA9PSAwICYmCi0JCWF1ZGlvLT5vdXRbMV0udXNlZCA9PSAwKQotCQl8fCAoYXVkaW8tPnN0b3BwZWQpCi0JCXx8IChhdWRpby0+d2ZsdXNoKSk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGRvbmU7Ci0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoZnJhbWUtPmRhdGEsIGJ1Zl9zdGFydCwgbWZpZWxkX3NpemUpKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCWZyYW1lLT5tZmllbGRfc3ogPSBtZmllbGRfc2l6ZTsKLQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQlmcmFtZS0+dXNlZCA9IG1maWVsZF9zaXplOwotCWF1ZHBsYXlfc2VuZF9kYXRhKGF1ZGlvLCAwKTsKLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWRpb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jc3RydWN0IGJ1ZmZlciAqZnJhbWU7Ci0Jc2l6ZV90IHhmZXI7Ci0JY2hhciAqY3B5X3B0cjsKLQlpbnQgcmMgPSAwLCBlb3NfY29uZGl0aW9uID0gQVVEV01BUFJPX0VPU19OT05FOwotCXVuc2lnbmVkIGRzaXplOwotCXVuc2lnbmVkIHNob3J0IG1maWVsZF9zaXplID0gMDsKLQotCU1NX0RCRygiY250PSVkXG4iLCBjb3VudCk7Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlmcmFtZSA9IGF1ZGlvLT5vdXQgKyBhdWRpby0+b3V0X2hlYWQ7Ci0JCWNweV9wdHIgPSBmcmFtZS0+ZGF0YTsKLQkJZHNpemUgPSAwOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkJICAgICAgKGZyYW1lLT51c2VkID09IDApCi0JCQkJCSAgICAgIHx8IChhdWRpby0+c3RvcHBlZCkKLQkJCQkJCSAgfHwgKGF1ZGlvLT53Zmx1c2gpKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgfHwgYXVkaW8tPndmbHVzaCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYXVkaW8tPm1maWVsZCkgewotCQkJaWYgKGJ1ZiA9PSBzdGFydCkgewotCQkJCS8qIFByb2Nlc3NpbmcgYmVnaW5uaW5nIG9mIHVzZXIgYnVmZmVyICovCi0JCQkJaWYgKF9fZ2V0X3VzZXIobWZpZWxkX3NpemUsCi0JCQkJCSh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgYnVmKSkgewotCQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSAgaWYgKG1maWVsZF9zaXplID4gY291bnQpIHsKLQkJCQkJcmMgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJTU1fREJHKCJhdWRpb193cml0ZTogbWYgb2Zmc2V0X3ZhbCAleFxuIiwKLQkJCQkJCW1maWVsZF9zaXplKTsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoY3B5X3B0ciwgYnVmLCBtZmllbGRfc2l6ZSkpIHsKLQkJCQkJcmMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLyogQ2hlY2sgaWYgRU9TIGZsYWcgaXMgc2V0IGFuZCBidWZmZXIgaGFzCi0JCQkJICogY29udGFpbnMganVzdCBtZXRhIGZpZWxkCi0JCQkJICovCi0JCQkJaWYgKGNweV9wdHJbQVVEV01BUFJPX0VPU19GTEdfT0ZGU0VUXSAmCi0JCQkJCQkgQVVEV01BUFJPX0VPU19GTEdfTUFTSykgewotCQkJCQlNTV9EQkcoImF1ZGlvX3dyaXRlOiBFT1MgU0VUXG4iKTsKLQkJCQkJZW9zX2NvbmRpdGlvbiA9IEFVRFdNQVBST19FT1NfU0VUOwotCQkJCQlpZiAobWZpZWxkX3NpemUgPT0gY291bnQpIHsKLQkJCQkJCWJ1ZiArPSBtZmllbGRfc2l6ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UKLQkJCQkJY3B5X3B0cltBVURXTUFQUk9fRU9TX0ZMR19PRkZTRVRdCi0JCQkJCQkmPSB+QVVEV01BUFJPX0VPU19GTEdfTUFTSzsKLQkJCQl9Ci0JCQkJY3B5X3B0ciArPSBtZmllbGRfc2l6ZTsKLQkJCQljb3VudCAtPSBtZmllbGRfc2l6ZTsKLQkJCQlkc2l6ZSArPSBtZmllbGRfc2l6ZTsKLQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQl9IGVsc2UgewotCQkJCW1maWVsZF9zaXplID0gMDsKLQkJCQlNTV9EQkcoImF1ZGlvX3dyaXRlOiBjb250aW51b3VzIGJ1ZmZlclxuIik7Ci0JCQl9Ci0JCQlmcmFtZS0+bWZpZWxkX3N6ID0gbWZpZWxkX3NpemU7Ci0JCX0KLQotCQlpZiAoYXVkaW8tPnJlc2VydmVkKSB7Ci0JCQlNTV9EQkcoImFwcGVuZCByZXNlcnZlZCBieXRlICV4XG4iLCBhdWRpby0+cnN2X2J5dGUpOwotCQkJKmNweV9wdHIgPSBhdWRpby0+cnN2X2J5dGU7Ci0JCQl4ZmVyID0gKGNvdW50ID4gKChmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSAtIDEpKSA/Ci0JCQkJKGZyYW1lLT5zaXplIC0gbWZpZWxkX3NpemUpIC0gMSA6IGNvdW50OwotCQkJY3B5X3B0cisrOwotCQkJZHNpemUgKz0gMTsKLQkJCWF1ZGlvLT5yZXNlcnZlZCA9IDA7Ci0JCX0gZWxzZQotCQkJeGZlciA9IChjb3VudCA+IChmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSkgPwotCQkJCShmcmFtZS0+c2l6ZSAtIG1maWVsZF9zaXplKSA6IGNvdW50OwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIHhmZXIpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWRzaXplICs9IHhmZXI7Ci0JCWlmIChkc2l6ZSAmIDEpIHsKLQkJCWF1ZGlvLT5yc3ZfYnl0ZSA9ICgoY2hhciAqKSBmcmFtZS0+ZGF0YSlbZHNpemUgLSAxXTsKLQkJCU1NX0RCRygib2RkIGxlbmd0aCBidWYgcmVzZXJ2ZSBsYXN0IGJ5dGUgJXhcbiIsCi0JCQkJCWF1ZGlvLT5yc3ZfYnl0ZSk7Ci0JCQlhdWRpby0+cmVzZXJ2ZWQgPSAxOwotCQkJZHNpemUtLTsKLQkJfQotCQljb3VudCAtPSB4ZmVyOwotCQlidWYgKz0geGZlcjsKLQotCQlpZiAoZHNpemUgPiAwKSB7Ci0JCQlhdWRpby0+b3V0X2hlYWQgXj0gMTsKLQkJCWZyYW1lLT51c2VkID0gZHNpemU7Ci0JCQlhdWRwbGF5X3NlbmRfZGF0YShhdWRpbywgMCk7Ci0JCX0KLQl9Ci0JaWYgKGVvc19jb25kaXRpb24gPT0gQVVEV01BUFJPX0VPU19TRVQpCi0JCXJjID0gYXVkd21hcHJvX3Byb2Nlc3NfZW9zKGF1ZGlvLCBzdGFydCwgbWZpZWxkX3NpemUpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCWlmICghcmMpIHsKLQkJaWYgKGJ1ZiA+IHN0YXJ0KQotCQkJcmV0dXJuIGJ1ZiAtIHN0YXJ0OwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JTU1fSU5GTygiYXVkaW8gaW5zdGFuY2UgMHglMDh4IGZyZWVpbmdcbiIsIChpbnQpYXVkaW8pOwotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRkZXZfdW5yZWdpc3Rlcl9ldnRfbGlzdG5lcihBVURERVZfQ0xOVF9ERUMsIGF1ZGlvLT5kZWNfaWQpOwotCWF1ZGlvX2Rpc2FibGUoYXVkaW8pOwotCWF1ZGlvX2ZsdXNoKGF1ZGlvKTsKLQlhdWRpb19mbHVzaF9wY21fYnVmKGF1ZGlvKTsKLQltc21fYWRzcF9wdXQoYXVkaW8tPmF1ZHBsYXkpOwotCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCXVucmVnaXN0ZXJfZWFybHlfc3VzcGVuZCgmYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUpOwotI2VuZGlmCi0JYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0JYXVkd21hcHJvX3Jlc2V0X2V2ZW50X3F1ZXVlKGF1ZGlvKTsKLQlpb3VubWFwKGF1ZGlvLT5tYXBfdl93cml0ZSk7Ci0JZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcihhdWRpby0+cGh5cyk7Ci0JaWYgKGF1ZGlvLT5yZWFkX2RhdGEpIHsKLQkJaW91bm1hcChhdWRpby0+bWFwX3ZfcmVhZCk7Ci0JCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPnJlYWRfcGh5cyk7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCWlmIChhdWRpby0+ZGVudHJ5KQotCQlkZWJ1Z2ZzX3JlbW92ZShhdWRpby0+ZGVudHJ5KTsKLSNlbmRpZgotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECi1zdGF0aWMgdm9pZCBhdWR3bWFwcm9fcG9zdF9ldmVudChzdHJ1Y3QgYXVkaW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCkKLXsKLQlzdHJ1Y3QgYXVkd21hcHJvX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghbGlzdF9lbXB0eSgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpKSB7Ci0JCWVfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJCXN0cnVjdCBhdWR3bWFwcm9fZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZV9ub2RlLT5saXN0KTsKLQl9IGVsc2UgewotCQllX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkd21hcHJvX2V2ZW50KSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghZV9ub2RlKSB7Ci0JCQlNTV9FUlIoIk5vIG1lbSB0byBwb3N0IGV2ZW50ICVkXG4iLCB0eXBlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWVfbm9kZS0+ZXZlbnRfdHlwZSA9IHR5cGU7Ci0JZV9ub2RlLT5wYXlsb2FkID0gcGF5bG9hZDsKLQotCWxpc3RfYWRkX3RhaWwoJmVfbm9kZS0+bGlzdCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHdtYXByb19zdXNwZW5kKHN0cnVjdCBlYXJseV9zdXNwZW5kICpoKQotewotCXN0cnVjdCBhdWR3bWFwcm9fc3VzcGVuZF9jdGwgKmN0bCA9Ci0JCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgYXVkd21hcHJvX3N1c3BlbmRfY3RsLCBub2RlKTsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBwYXlsb2FkOwotCi0JTU1fREJHKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQlhdWR3bWFwcm9fcG9zdF9ldmVudChjdGwtPmF1ZGlvLCBBVURJT19FVkVOVF9TVVNQRU5ELCBwYXlsb2FkKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkd21hcHJvX3Jlc3VtZShzdHJ1Y3QgZWFybHlfc3VzcGVuZCAqaCkKLXsKLQlzdHJ1Y3QgYXVkd21hcHJvX3N1c3BlbmRfY3RsICpjdGwgPQotCQljb250YWluZXJfb2YoaCwgc3RydWN0IGF1ZHdtYXByb19zdXNwZW5kX2N0bCwgbm9kZSk7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0JYXVkd21hcHJvX3Bvc3RfZXZlbnQoY3RsLT5hdWRpbywgQVVESU9fRVZFTlRfUkVTVU1FLCBwYXlsb2FkKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgc3NpemVfdCBhdWR3bWFwcm9fZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBhdWR3bWFwcm9fZGVidWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY29uc3QgaW50IGRlYnVnX2J1Zm1heCA9IDQwOTY7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyWzQwOTZdOwotCWludCBuID0gMCwgaTsKLQlzdHJ1Y3QgYXVkaW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCW4gPSBzY25wcmludGYoYnVmZmVyLCBkZWJ1Z19idWZtYXgsICJvcGVuZWQgJWRcbiIsIGF1ZGlvLT5vcGVuZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgImVuYWJsZWQgJWRcbiIsIGF1ZGlvLT5lbmFibGVkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJzdG9wcGVkICVkXG4iLCBhdWRpby0+c3RvcHBlZCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicGNtX2ZlZWRiYWNrICVkXG4iLCBhdWRpby0+cGNtX2ZlZWRiYWNrKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfYnVmX3N6ICVkXG4iLCBhdWRpby0+b3V0WzBdLnNpemUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInBjbV9idWZfY291bnQgJWQgXG4iLCBhdWRpby0+cGNtX2J1Zl9jb3VudCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicGNtX2J1Zl9zeiAlZCBcbiIsIGF1ZGlvLT5pblswXS5zaXplKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJ2b2x1bWUgJXggXG4iLCBhdWRpby0+dm9sX3Bhbi52b2x1bWUpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInNhbXBsZSByYXRlICVkIFxuIiwgYXVkaW8tPm91dF9zYW1wbGVfcmF0ZSk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJImNoYW5uZWwgbW9kZSAlZCBcbiIsIGF1ZGlvLT5vdXRfY2hhbm5lbF9tb2RlKTsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkvKiBGb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBvbmx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nIHdoZW4KLQkgKiB3aGVuIHBsYXliYWNrIGhhbHRzIHVuZXhwZWN0ZWRseS4gVGh1cywgbm8gbXV0dWFsIGV4Y2x1c2lvbgotCSAqIGVuZm9yY2VkCi0JICovCi0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAid2ZsdXNoICVkXG4iLCBhdWRpby0+d2ZsdXNoKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJyZmx1c2ggJWRcbiIsIGF1ZGlvLT5yZmx1c2gpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgInJ1bm5pbmcgJWQgXG4iLCBhdWRpby0+cnVubmluZyk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCSJkZWMgc3RhdGUgJWQgXG4iLCBhdWRpby0+ZGVjX3N0YXRlKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfbmVlZGVkICVkIFxuIiwgYXVkaW8tPm91dF9uZWVkZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dF9oZWFkICVkIFxuIiwgYXVkaW8tPm91dF9oZWFkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJvdXRfdGFpbCAlZCBcbiIsIGF1ZGlvLT5vdXRfdGFpbCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAib3V0WzBdLnVzZWQgJWQgXG4iLCBhdWRpby0+b3V0WzBdLnVzZWQpOwotCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJICAgIm91dFsxXS51c2VkICVkIFxuIiwgYXVkaW8tPm91dFsxXS51c2VkKTsKLQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSAgICJidWZmZXJfcmVmcmVzaCAlZCBcbiIsIGF1ZGlvLT5idWZfcmVmcmVzaCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAicmVhZF9uZXh0ICVkIFxuIiwgYXVkaW8tPnJlYWRfbmV4dCk7Ci0JbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkgICAiZmlsbF9uZXh0ICVkIFxuIiwgYXVkaW8tPmZpbGxfbmV4dCk7Ci0JZm9yIChpID0gMDsgaSA8IGF1ZGlvLT5wY21fYnVmX2NvdW50OyBpKyspCi0JCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkiaW5bJWRdLnNpemUgJWQgXG4iLCBpLCBhdWRpby0+aW5baV0udXNlZCk7Ci0JYnVmZmVyW25dID0gMDsKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkd21hcHJvX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWR3bWFwcm9fZGVidWdfcmVhZCwKLQkub3BlbiA9IGF1ZHdtYXByb19kZWJ1Z19vcGVuLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGF1ZGlvICphdWRpbyA9IE5VTEw7Ci0JaW50IHJjLCBkZWNfYXR0cmIsIGRlY2lkLCBpOwotCXVuc2lnbmVkIHBtZW1fc3ogPSBETUFTWl9NQVg7Ci0Jc3RydWN0IGF1ZHdtYXByb19ldmVudCAqZV9ub2RlID0gTlVMTDsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV93bWFwcm9fIiArIDVdOwotI2VuZGlmCi0KLQkvKiBBbGxvY2F0ZSBNZW0gZm9yIGF1ZGlvIGluc3RhbmNlICovCi0JYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWF1ZGlvKSB7Ci0JCU1NX0VSUigibm8gbWVtb3J5IHRvIGFsbG9jYXRlIGF1ZGlvIGluc3RhbmNlIFxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQlNTV9JTkZPKCJhdWRpbyBpbnN0YW5jZSAweCUwOHggY3JlYXRlZFxuIiwgKGludClhdWRpbyk7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgZGVjb2RlciAqLwotCWRlY19hdHRyYiA9IEFVRERFQ19ERUNfV01BUFJPOwotCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJZGVjX2F0dHJiIHw9IE1TTV9BVURfTU9ERV9OT05UVU5ORUw7Ci0JCWF1ZGlvLT5wY21fZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREVfUExBWUJBQ0s7Ci0JfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWRlY19hdHRyYiB8PSBNU01fQVVEX01PREVfVFVOTkVMOwotCQlhdWRpby0+cGNtX2ZlZWRiYWNrID0gVFVOTkVMX01PREVfUExBWUJBQ0s7Ci0JfSBlbHNlIHsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlkZWNpZCA9IGF1ZHBwX2FkZWNfYWxsb2MoZGVjX2F0dHJiLCAmYXVkaW8tPm1vZHVsZV9uYW1lLAotCQkJJmF1ZGlvLT5xdWV1ZV9pZCk7Ci0KLQlpZiAoZGVjaWQgPCAwKSB7Ci0JCU1NX0VSUigiTm8gZnJlZSBkZWNvZGVyIGF2YWlsYWJsZSwgZnJlZWluZyBpbnN0YW5jZSAweCUwOHhcbiIsCi0JCQkJKGludClhdWRpbyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJa2ZyZWUoYXVkaW8pOwotCQlnb3RvIGRvbmU7Ci0JfQotCWF1ZGlvLT5kZWNfaWQgPSBkZWNpZCAmIE1TTV9BVURfREVDT0RFUl9NQVNLOwotCi0Jd2hpbGUgKHBtZW1fc3ogPj0gRE1BU1pfTUlOKSB7Ci0JCU1NX0RCRygicG1lbXN6ID0gJWRcbiIsIHBtZW1fc3opOwotCQlhdWRpby0+cGh5cyA9IGFsbG9jYXRlX2NvbnRpZ3VvdXNfZWJpX25vbWFwKHBtZW1fc3osIFNaXzRLKTsKLQkJaWYgKGF1ZGlvLT5waHlzKSB7Ci0JCQlhdWRpby0+bWFwX3Zfd3JpdGUgPSBpb3JlbWFwKGF1ZGlvLT5waHlzLCBwbWVtX3N6KTsKLQkJCWlmIChJU19FUlIoYXVkaW8tPm1hcF92X3dyaXRlKSkgewotCQkJCU1NX0VSUigiY291bGQgbm90IG1hcCB3cml0ZSBidWZmZXJzLCBcCi0JCQkJCQlmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQkJCShpbnQpYXVkaW8pOwotCQkJCXJjID0gLUVOT01FTTsKLQkJCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKGF1ZGlvLT5waHlzKTsKLQkJCQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0JCQkJa2ZyZWUoYXVkaW8pOwotCQkJCWdvdG8gZG9uZTsKLQkJCX0KLQkJCWF1ZGlvLT5kYXRhID0gYXVkaW8tPm1hcF92X3dyaXRlOwotCQkJTU1fREJHKCJ3cml0ZSBidWY6IHBoeSBhZGRyIDB4JTA4eCBrZXJuZWwgYWRkciBcCi0JCQkJMHglMDh4XG4iLCBhdWRpby0+cGh5cywgKGludClhdWRpby0+ZGF0YSk7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChwbWVtX3N6ID09IERNQVNaX01JTikgewotCQkJTU1fRVJSKCJjb3VsZCBub3QgYWxsb2NhdGUgd3JpdGUgYnVmZmVycywgZnJlZWluZyBcCi0JCQkJCWluc3RhbmNlIDB4JTA4eFxuIiwgKGludClhdWRpbyk7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlhdWRwcF9hZGVjX2ZyZWUoYXVkaW8tPmRlY19pZCk7Ci0JCQlrZnJlZShhdWRpbyk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0gZWxzZQotCQlwbWVtX3N6ID4+PSAxOwotCX0KLQlhdWRpby0+b3V0X2RtYV9zeiA9IHBtZW1fc3o7Ci0KLQlyYyA9IG1zbV9hZHNwX2dldChhdWRpby0+bW9kdWxlX25hbWUsICZhdWRpby0+YXVkcGxheSwKLQkJCSZhdWRwbGF5X2Fkc3Bfb3BzX3dtYXBybywgYXVkaW8pOwotCWlmIChyYykgewotCQlNTV9FUlIoImZhaWxlZCB0byBnZXQgJXMgbW9kdWxlLCBmcmVlaW5nIGluc3RhbmNlIDB4JTA4eFxuIiwKLQkJCQlhdWRpby0+bW9kdWxlX25hbWUsIChpbnQpYXVkaW8pOwotCQlnb3RvIGVycjsKLQl9Ci0KLQltdXRleF9pbml0KCZhdWRpby0+bG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPndyaXRlX2xvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT5yZWFkX2xvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT5nZXRfZXZlbnRfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmF1ZGlvLT5kc3BfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5hdnN5bmNfd2FpdCk7Ci0KLQlhdWRpby0+b3V0WzBdLmRhdGEgPSBhdWRpby0+ZGF0YSArIDA7Ci0JYXVkaW8tPm91dFswXS5hZGRyID0gYXVkaW8tPnBoeXMgKyAwOwotCWF1ZGlvLT5vdXRbMF0uc2l6ZSA9IGF1ZGlvLT5vdXRfZG1hX3N6ID4+IDE7Ci0KLQlhdWRpby0+b3V0WzFdLmRhdGEgPSBhdWRpby0+ZGF0YSArIGF1ZGlvLT5vdXRbMF0uc2l6ZTsKLQlhdWRpby0+b3V0WzFdLmFkZHIgPSBhdWRpby0+cGh5cyArIGF1ZGlvLT5vdXRbMF0uc2l6ZTsKLQlhdWRpby0+b3V0WzFdLnNpemUgPSBhdWRpby0+b3V0WzBdLnNpemU7Ci0KLQkvKmF1ZGlvLT53bWFwcm9fY29uZmlnLmFybWRhdGFyZXF0aHIgPSAgMTI2ODsKLQlhdWRpby0+d21hcHJvX2NvbmZpZy5udW1jaGFubmVscyA9IDI7Ci0JYXVkaW8tPndtYXByb19jb25maWcuYXZnYnl0ZXNwZXJzZWNvbmQgPSA2MDAzOwotCWF1ZGlvLT53bWFwcm9fY29uZmlnLnNhbXBsaW5ncmF0ZSA9IDQ0MTAwOwotCWF1ZGlvLT53bWFwcm9fY29uZmlnLmVuY29kZW9wdCA9IDIyNDsKLQlhdWRpby0+d21hcHJvX2NvbmZpZy52YWxpZGJpdHNwZXJzYW1wbGUgPSAxNjsKLQlhdWRpby0+d21hcHJvX2NvbmZpZy5mb3JtYXR0YWcgPSAzNTQ7Ci0JYXVkaW8tPndtYXByb19jb25maWcuYXNmcGFja2V0bGVuZ3RoID0gMjIzMDsKLQlhdWRpby0+d21hcHJvX2NvbmZpZy5jaGFubmVsbWFzayA9IDM7Ci0JYXVkaW8tPndtYXByb19jb25maWcuYWR2YW5jZWRlbmNvZGVvcHQgPSAzMjgzNDsKLQlhdWRpby0+d21hcHJvX2NvbmZpZy5hZHZhbmNlZGVuY29kZW9wdDIgPSAwOyovCi0KLQlhdWRpby0+b3V0X3NhbXBsZV9yYXRlID0gNDQxMDA7Ci0JYXVkaW8tPm91dF9jaGFubmVsX21vZGUgPSBBVURQUF9DTURfUENNX0lOVEZfU1RFUkVPX1Y7Ci0KLQlhdWRpby0+dm9sX3Bhbi52b2x1bWUgPSAweDIwMDA7Ci0KLQlhdWRpb19mbHVzaChhdWRpbyk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQlhdWRpby0+b3BlbmVkID0gMTsKLQlhdWRpby0+ZGV2aWNlX2V2ZW50cyA9IEFVRERFVl9FVlRfREVWX1JEWQotCQkJCXxBVURERVZfRVZUX0RFVl9STFN8Ci0JCQkJQVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRzsKLQotCXJjID0gYXVkZGV2X3JlZ2lzdGVyX2V2dF9saXN0bmVyKGF1ZGlvLT5kZXZpY2VfZXZlbnRzLAotCQkJCQlBVURERVZfQ0xOVF9ERUMsCi0JCQkJCWF1ZGlvLT5kZWNfaWQsCi0JCQkJCXdtYXByb19saXN0bmVyLAotCQkJCQkodm9pZCAqKWF1ZGlvKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGxpc3RuZXJcbiIsIF9fZnVuY19fKTsKLQkJZ290byBldmVudF9lcnI7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mIG5hbWUsICJtc21fd21hcHJvXyUwNHgiLCBhdWRpby0+ZGVjX2lkKTsKLQlhdWRpby0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQlOVUxMLCAodm9pZCAqKSBhdWRpbywKLQkJCQkmYXVkd21hcHJvX2RlYnVnX2ZvcHMpOwotCi0JaWYgKElTX0VSUihhdWRpby0+ZGVudHJ5KSkKLQkJTU1fREJHKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLmxldmVsID0gRUFSTFlfU1VTUEVORF9MRVZFTF9ESVNBQkxFX0ZCOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlLnJlc3VtZSA9IGF1ZHdtYXByb19yZXN1bWU7Ci0JYXVkaW8tPnN1c3BlbmRfY3RsLm5vZGUuc3VzcGVuZCA9IGF1ZHdtYXByb19zdXNwZW5kOwotCWF1ZGlvLT5zdXNwZW5kX2N0bC5hdWRpbyA9IGF1ZGlvOwotCXJlZ2lzdGVyX2Vhcmx5X3N1c3BlbmQoJmF1ZGlvLT5zdXNwZW5kX2N0bC5ub2RlKTsKLSNlbmRpZgotCWZvciAoaSA9IDA7IGkgPCBBVURXTUFQUk9fRVZFTlRfTlVNOyBpKyspIHsKLQkJZV9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZHdtYXByb19ldmVudCksIEdGUF9LRVJORUwpOwotCQlpZiAoZV9ub2RlKQotCQkJbGlzdF9hZGRfdGFpbCgmZV9ub2RlLT5saXN0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCQllbHNlIHsKLQkJCU1NX0VSUigiZXZlbnQgcGt0IGFsbG9jIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotZXZlbnRfZXJyOgotCW1zbV9hZHNwX3B1dChhdWRpby0+YXVkcGxheSk7Ci1lcnI6Ci0JaW91bm1hcChhdWRpby0+bWFwX3Zfd3JpdGUpOwotCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW8tPnBoeXMpOwotCWF1ZHBwX2FkZWNfZnJlZShhdWRpby0+ZGVjX2lkKTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb193bWFwcm9fZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gYXVkaW9fb3BlbiwKLQkucmVsZWFzZQk9IGF1ZGlvX3JlbGVhc2UsCi0JLnJlYWQgCQk9IGF1ZGlvX3JlYWQsCi0JLndyaXRlCQk9IGF1ZGlvX3dyaXRlLAotCS51bmxvY2tlZF9pb2N0bAk9IGF1ZGlvX2lvY3RsLAotCS5mc3luYyAJCT0gYXVkaW9fZnN5bmMsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb193bWFwcm9fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX3dtYXBybyIsCi0JLmZvcHMJPSAmYXVkaW9fd21hcHJvX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX3dtYXByb19taXNjKTsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGF1ZGlvX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRwcC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdWRwcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTQwMTU2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkcHAuYworKysgL2Rldi9udWxsCkBAIC0xLDExNDAgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1tc20vcWRzcDUvYXVkcHAuYwotICoKLSAqIGNvbW1vbiBjb2RlIHRvIGRlYWwgd2l0aCB0aGUgQVVEUFAgZHNwIHRhc2sgKGF1ZGlvIHBvc3Rwcm9jKQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgotCi0KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2FjZGJpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHBjbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHBtc2cuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkcHAuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotCi0jaW5jbHVkZSAiLi4vcWRzcDUvZXZsb2cuaCIKLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLWVudW0gewotCUVWX05VTEwsCi0JRVZfRU5BQkxFLAotCUVWX0RJU0FCTEUsCi0JRVZfRVZFTlQsCi0JRVZfREFUQSwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpkc3BfbG9nX3N0cmluZ3NbXSA9IHsKLQkiTlVMTCIsCi0JIkVOQUJMRSIsCi0JIkRJU0FCTEUiLAotCSJFVkVOVCIsCi0JIkRBVEEiLAotfTsKLQotREVDTEFSRV9MT0coZHNwX2xvZywgNjQsIGRzcF9sb2dfc3RyaW5ncyk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IF9kc3BfbG9nX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gZXZfbG9nX2luaXQoJmRzcF9sb2cpOwotfQotCi1tb2R1bGVfaW5pdChfZHNwX2xvZ19pbml0KTsKLSNkZWZpbmUgTE9HKGlkLCBhcmcpIGV2X2xvZ193cml0ZSgmZHNwX2xvZywgaWQsIGFyZykKLQotc3RhdGljIERFRklORV9NVVRFWChhdWRwcF9sb2NrKTsKLXN0YXRpYyBERUZJTkVfTVVURVgoYXVkcHBfZGVjX2xvY2spOwotc3RhdGljIHN0cnVjdCB3YWtlX2xvY2sgYXVkcHBfd2FrZV9sb2NrOwotCi0jZGVmaW5lIENIX0NPVU5UIDUKLSNkZWZpbmUgQVVEUFBfQ0xOVF9NQVhfQ09VTlQgNgotCi0jZGVmaW5lIEFVRFBQX0NNRF9DRkdfT0JKX1VQREFURSAweDgwMDAKLSNkZWZpbmUgQVVEUFBfQ01EX0VRX0ZMQUdfRElTCTB4MDAwMAotI2RlZmluZSBBVURQUF9DTURfRVFfRkxBR19FTkEJLTEKLSNkZWZpbmUgQVVEUFBfQ01EX0lJUl9GTEFHX0RJUwkgIDB4MDAwMAotI2RlZmluZSBBVURQUF9DTURfSUlSX0ZMQUdfRU5BCSAgLTEKLSNkZWZpbmUgQVVEUFBfQ01EX1NURl9GTEFHX0VOQSAtMQotI2RlZmluZSBBVURQUF9DTURfU1RGX0ZMQUdfRElTIDB4MDAwMAotCi0jZGVmaW5lIE1BWF9FVkVOVF9DQUxMQkFDS19DTElFTlRTIAkxCi0KLSNkZWZpbmUgQVVEUFBfQ09OQ1VSUkVOQ1lfREVGQVVMVCAwCS8qIFNldCBkZWZhdWx0IHRvIExQQSBtb2RlICovCi0jZGVmaW5lIEFVRFBQX01BWF9ERUNPREVSX0NOVCA1Ci0jZGVmaW5lIEFVRFBQX0NPREVDX01BU0sgMHgwMDAwMDBGRgotI2RlZmluZSBBVURQUF9NT0RFX01BU0sgMHgwMDAwMEYwMAotI2RlZmluZSBBVURQUF9PUF9NQVNLIDB4RjAwMDAwMDAKLQotc3RydWN0IGF1ZHBwX2RlY29kZXJfaW5mbyB7Ci0JdW5zaWduZWQgaW50IGNvZGVjOwotCXBpZF90IHBpZDsKLX07Ci0KLXN0cnVjdCBhdWRwcF9zdGF0ZSB7Ci0Jc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqbW9kOwotCWF1ZHBwX2V2ZW50X2Z1bmMgZnVuY1tBVURQUF9DTE5UX01BWF9DT1VOVF07Ci0Jdm9pZCAqcHJpdmF0ZVtBVURQUF9DTE5UX01BWF9DT1VOVF07Ci0Jc3RydWN0IG11dGV4ICpsb2NrOwotCXVuc2lnbmVkIG9wZW5fY291bnQ7Ci0JdW5zaWduZWQgZW5hYmxlZDsKLQotCS8qIFJlbGF0ZWQgdG8gZGVjb2RlciBhbGxvY2F0aW9uICovCi0Jc3RydWN0IG11dGV4ICpsb2NrX2RlYzsKLQlzdHJ1Y3QgbXNtX2Fkc3BkZWNfZGF0YWJhc2UgKmRlY19kYXRhYmFzZTsKLQlzdHJ1Y3QgYXVkcHBfZGVjb2Rlcl9pbmZvIGRlY19pbmZvX3RhYmxlW0FVRFBQX01BWF9ERUNPREVSX0NOVF07Ci0JdW5zaWduZWQgZGVjX2ludXNlOwotCXVuc2lnbmVkIGxvbmcgY29uY3VycmVuY3k7Ci0KLQlzdHJ1Y3QgYXVkcHBfZXZlbnRfY2FsbGJhY2sgKmNiX3RibFtNQVhfRVZFTlRfQ0FMTEJBQ0tfQ0xJRU5UU107Ci0KLQkvKiBSZWxhdGVkIHRvIGRlY29kZXIgaW5zdGFuY2VzICovCi0JdWludDhfdCBvcF9tb2RlOyAvKiBTcGVjaWZpZXMgVHVyYm8vTm9uIFR1cmJvIG1vZGUgKi8KLQl1aW50OF90IGRlY29kZXJfY291bnQ7IC8qIE5vLiBvZiBkZWNvZGVycyBhY3RpdmUgcnVubmluZyAqLwotCXVpbnQ4X3QgY29kZWNfbWF4X2luc3RhbmNlczsgLyogTWF4IGNvZGVjcyBhbGxvd2VkIGN1cnJlbnRseSAqLwotCXVpbnQ4X3QgY29kZWNfY250W01TTV9NQVhfREVDX0NOVF07IC8qIE5yIG9mIGVhY2ggY29kZWMKLQkJCQkJCSB0eXBlIGVuYWJsZWQgKi8KLQotCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3dhaXQ7Ci19OwotCi1zdHJ1Y3QgYXVkcHBfc3RhdGUgdGhlX2F1ZHBwX3N0YXRlID0gewotCS5sb2NrID0gJmF1ZHBwX2xvY2ssCi0JLmxvY2tfZGVjID0gJmF1ZHBwX2RlY19sb2NrLAotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIHByZXZlbnRfc3VzcGVuZCh2b2lkKQotewotCXdha2VfbG9jaygmYXVkcHBfd2FrZV9sb2NrKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhbGxvd19zdXNwZW5kKHZvaWQpCi17Ci0Jd2FrZV91bmxvY2soJmF1ZHBwX3dha2VfbG9jayk7Ci19Ci0KLWludCBhdWRwcF9zZW5kX3F1ZXVlMSh2b2lkICpjbWQsIHVuc2lnbmVkIGxlbikKLXsKLQlyZXR1cm4gbXNtX2Fkc3Bfd3JpdGUodGhlX2F1ZHBwX3N0YXRlLm1vZCwKLQkJCSAgICAgIFFEU1BfdVBBdWRQUENtZDFRdWV1ZSwgY21kLCBsZW4pOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9zZW5kX3F1ZXVlMSk7Ci0KLWludCBhdWRwcF9zZW5kX3F1ZXVlMih2b2lkICpjbWQsIHVuc2lnbmVkIGxlbikKLXsKLQlyZXR1cm4gbXNtX2Fkc3Bfd3JpdGUodGhlX2F1ZHBwX3N0YXRlLm1vZCwKLQkJCSAgICAgIFFEU1BfdVBBdWRQUENtZDJRdWV1ZSwgY21kLCBsZW4pOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9zZW5kX3F1ZXVlMik7Ci0KLWludCBhdWRwcF9zZW5kX3F1ZXVlMyh2b2lkICpjbWQsIHVuc2lnbmVkIGxlbikKLXsKLQlyZXR1cm4gbXNtX2Fkc3Bfd3JpdGUodGhlX2F1ZHBwX3N0YXRlLm1vZCwKLQkJCSAgICAgIFFEU1BfdVBBdWRQUENtZDNRdWV1ZSwgY21kLCBsZW4pOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9zZW5kX3F1ZXVlMyk7Ci0KLXN0YXRpYyBpbnQgYXVkcHBfZHNwX2NvbmZpZyhpbnQgZW5hYmxlKQotewotCXN0cnVjdCBhdWRwcF9jbWRfY2ZnIGNtZDsKLQotCWNtZC5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHOwotCWNtZC5jZmcgPSBlbmFibGUgPyBBVURQUF9DTURfQ0ZHX0VOQUJMRSA6IEFVRFBQX0NNRF9DRkdfU0xFRVA7Ci0KLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTEoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi12b2lkIGF1ZHBwX3JvdXRlX3N0cmVhbSh1bnNpZ25lZCBzaG9ydCBkZWNfaWQsIHVuc2lnbmVkIHNob3J0IG1peGVyX21hc2spCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfZGV2X21peGVyX3BhcmFtcyBtaXhlcl9wYXJhbXNfY21kOwotCi0JbWVtc2V0KCZtaXhlcl9wYXJhbXNfY21kLCAwLCBzaXplb2YobWl4ZXJfcGFyYW1zX2NtZCkpOwotCi0JbWl4ZXJfcGFyYW1zX2NtZC5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX0RFVl9NSVhFUjsKLQltaXhlcl9wYXJhbXNfY21kLnN0cmVhbV9pZCA9IGRlY19pZDsKLQltaXhlcl9wYXJhbXNfY21kLm1peGVyX2NtZCA9IG1peGVyX21hc2s7Ci0JYXVkcHBfc2VuZF9xdWV1ZTEoJm1peGVyX3BhcmFtc19jbWQsIHNpemVvZihtaXhlcl9wYXJhbXNfY21kKSk7Ci0KLX0KLUVYUE9SVF9TWU1CT0woYXVkcHBfcm91dGVfc3RyZWFtKTsKLQotaW50IGlzX2F1ZHBwX2VuYWJsZSh2b2lkKQotewotCXN0cnVjdCBhdWRwcF9zdGF0ZSAqYXVkcHAgPSAmdGhlX2F1ZHBwX3N0YXRlOwotCi0JcmV0dXJuIGF1ZHBwLT5lbmFibGVkOwotfQotRVhQT1JUX1NZTUJPTChpc19hdWRwcF9lbmFibGUpOwotCi1pbnQgYXVkcHBfcmVnaXN0ZXJfZXZlbnRfY2FsbGJhY2soc3RydWN0IGF1ZHBwX2V2ZW50X2NhbGxiYWNrICplY2IpCi17Ci0Jc3RydWN0IGF1ZHBwX3N0YXRlICphdWRwcCA9ICZ0aGVfYXVkcHBfc3RhdGU7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0VWRU5UX0NBTExCQUNLX0NMSUVOVFM7ICsraSkgewotCQlpZiAoTlVMTCA9PSBhdWRwcC0+Y2JfdGJsW2ldKSB7Ci0JCQlhdWRwcC0+Y2JfdGJsW2ldID0gZWNiOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIC0xOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9yZWdpc3Rlcl9ldmVudF9jYWxsYmFjayk7Ci0KLQotaW50IGF1ZHBwX3VucmVnaXN0ZXJfZXZlbnRfY2FsbGJhY2soc3RydWN0IGF1ZHBwX2V2ZW50X2NhbGxiYWNrICplY2IpCi17Ci0Jc3RydWN0IGF1ZHBwX3N0YXRlICphdWRwcCA9ICZ0aGVfYXVkcHBfc3RhdGU7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0VWRU5UX0NBTExCQUNLX0NMSUVOVFM7ICsraSkgewotCQlpZiAoZWNiID09IGF1ZHBwLT5jYl90YmxbaV0pIHsKLQkJCWF1ZHBwLT5jYl90YmxbaV0gPSBOVUxMOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIC0xOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF91bnJlZ2lzdGVyX2V2ZW50X2NhbGxiYWNrKTsKLQotc3RhdGljIHZvaWQgYXVkcHBfYnJvYWRjYXN0KHN0cnVjdCBhdWRwcF9zdGF0ZSAqYXVkcHAsIHVuc2lnbmVkIGlkLAotCQkJICAgIHVpbnQxNl90ICptc2cpCi17Ci0JdW5zaWduZWQgbjsKLQlmb3IgKG4gPSAwOyBuIDwgQVVEUFBfQ0xOVF9NQVhfQ09VTlQ7IG4rKykgewotCQlpZiAoYXVkcHAtPmZ1bmNbbl0pCi0JCQlhdWRwcC0+ZnVuY1tuXSAoYXVkcHAtPnByaXZhdGVbbl0sIGlkLCBtc2cpOwotCX0KLQotCWZvciAobiA9IDA7IG4gPCBNQVhfRVZFTlRfQ0FMTEJBQ0tfQ0xJRU5UUzsgKytuKQotCQlpZiAoYXVkcHAtPmNiX3RibFtuXSAmJiBhdWRwcC0+Y2JfdGJsW25dLT5mbikKLQkJCWF1ZHBwLT5jYl90Ymxbbl0tPmZuKGF1ZHBwLT5jYl90Ymxbbl0tPnByaXZhdGUsIGlkLAotCQkJCQkgICAgIG1zZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZHBwX25vdGlmeV9jbG50KHN0cnVjdCBhdWRwcF9zdGF0ZSAqYXVkcHAsIHVuc2lnbmVkIGNsbnRfaWQsCi0JCQkgICAgICB1bnNpZ25lZCBpZCwgdWludDE2X3QgKm1zZykKLXsKLQlpZiAoY2xudF9pZCA8IEFVRFBQX0NMTlRfTUFYX0NPVU5UICYmIGF1ZHBwLT5mdW5jW2NsbnRfaWRdKQotCQlhdWRwcC0+ZnVuY1tjbG50X2lkXSAoYXVkcHAtPnByaXZhdGVbY2xudF9pZF0sIGlkLCBtc2cpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRwcF9oYW5kbGVfcGNtZG1hbWlzcyhzdHJ1Y3QgYXVkcHBfc3RhdGUgKmF1ZHBwLAotCQkJCSAgICB1aW50MTZfdCBiaXRfbWFzaykKLXsKLQl1aW50OF90IGJfaW5kZXg7Ci0KLQlmb3IgKGJfaW5kZXggPSAwOyBiX2luZGV4IDwgQVVEUFBfQ0xOVF9NQVhfQ09VTlQ7IGJfaW5kZXgrKykgewotCQlpZiAoYml0X21hc2sgJiAoMHgxIDw8IGJfaW5kZXgpKQotCQkJaWYgKGF1ZHBwLT5mdW5jW2JfaW5kZXhdKQotCQkJCWF1ZHBwLT5mdW5jW2JfaW5kZXhdIChhdWRwcC0+cHJpdmF0ZVtiX2luZGV4XSwKLQkJCQkJCSAgICAgIEFVRFBQX01TR19QQ01ETUFNSVNTRUQsCi0JCQkJCQkgICAgICAmYml0X21hc2spOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXVkcHBfZHNwX2V2ZW50KHZvaWQgKmRhdGEsIHVuc2lnbmVkIGlkLCBzaXplX3QgbGVuLAotCQkJICAgIHZvaWQgKCpnZXRldmVudCkgKHZvaWQgKnB0ciwgc2l6ZV90IGxlbikpCi17Ci0Jc3RydWN0IGF1ZHBwX3N0YXRlICphdWRwcCA9IGRhdGE7Ci0JdWludDE2X3QgbXNnWzhdOwotCi0JZ2V0ZXZlbnQobXNnLCBzaXplb2YobXNnKSk7Ci0KLQlMT0coRVZfRVZFTlQsIChpZCA8PCAxNikgfCBtc2dbMF0pOwotCUxPRyhFVl9EQVRBLCAobXNnWzFdIDw8IDE2KSB8IG1zZ1syXSk7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQUF9NU0dfU1RBVFVTX01TRzp7Ci0JCQl1bnNpZ25lZCBjaWQgPSBtc2dbMF07Ci0JCQlNTV9EQkcoInN0YXR1cyAlZCAlZCAlZFxuIiwgY2lkLCBtc2dbMV0sIG1zZ1syXSk7Ci0KLQkJCWlmICgoY2lkIDwgNSkgJiYgYXVkcHAtPmZ1bmNbY2lkXSkKLQkJCQlhdWRwcC0+ZnVuY1tjaWRdIChhdWRwcC0+cHJpdmF0ZVtjaWRdLCBpZCwgbXNnKTsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBBVURQUF9NU0dfSE9TVF9QQ01fSU5URl9NU0c6Ci0JCWlmIChhdWRwcC0+ZnVuY1s1XSkKLQkJCWF1ZHBwLT5mdW5jWzVdIChhdWRwcC0+cHJpdmF0ZVs1XSwgaWQsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX1BDTURNQU1JU1NFRDoKLQkJYXVkcHBfaGFuZGxlX3BjbWRtYW1pc3MoYXVkcHAsIG1zZ1swXSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX0NGR19NU0c6Ci0JCWlmIChtc2dbMF0gPT0gQVVEUFBfTVNHX0VOQV9FTkEpIHsKLQkJCU1NX0lORk8oIkVOQUJMRVxuIik7Ci0JCQlhdWRwcC0+ZW5hYmxlZCA9IDE7Ci0JCQlhdWRwcF9icm9hZGNhc3QoYXVkcHAsIGlkLCBtc2cpOwotCQl9IGVsc2UgaWYgKG1zZ1swXSA9PSBBVURQUF9NU0dfRU5BX0RJUykgewotCQkJTU1fSU5GTygiRElTQUJMRVxuIik7Ci0JCQlhdWRwcC0+ZW5hYmxlZCA9IDA7Ci0JCQl3YWtlX3VwKCZhdWRwcC0+ZXZlbnRfd2FpdCk7Ci0JCQlhdWRwcF9icm9hZGNhc3QoYXVkcHAsIGlkLCBtc2cpOwotCQl9IGVsc2UgewotCQkJTU1fRVJSKCJpbnZhbGlkIGNvbmZpZyBtc2cgJWRcbiIsIG1zZ1swXSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURQUF9NU0dfUk9VVElOR19BQ0s6Ci0JCWF1ZHBwX25vdGlmeV9jbG50KGF1ZHBwLCBtc2dbMF0sIGlkLCBtc2cpOwotCQlicmVhazsKLQljYXNlIEFVRFBQX01TR19GTFVTSF9BQ0s6Ci0JCWF1ZHBwX25vdGlmeV9jbG50KGF1ZHBwLCBtc2dbMF0sIGlkLCBtc2cpOwotCQlicmVhazsKLQljYXNlIEFEU1BfTUVTU0FHRV9JRDoKLQkJTU1fREJHKCJSZWNlaXZlZCBBRFNQIGV2ZW50OiBtb2R1bGUgZW5hYmxlL2Rpc2FibGUgXAotCQkJCShhdWRwcHRhc2spIik7Ci0JCWJyZWFrOwotCWNhc2UgQVVEUFBfTVNHX0FWU1lOQ19NU0c6Ci0JCWF1ZHBwX25vdGlmeV9jbG50KGF1ZHBwLCBtc2dbMF0sIGlkLCBtc2cpOwotCQlicmVhazsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQljYXNlIEFVRFBQX01TR19GRUFUX1FVRVJZX0RNX0RPTkU6Ci0JCU1NX0lORk8oIiBSVEMgQUNLIC0tPiAleCAleCAleCAleCAleCAleCAleCAleFxuIiwgbXNnWzBdLFwKLQkJCW1zZ1sxXSwgbXNnWzJdLCBtc2dbM10sIG1zZ1s0XSwgXAotCQkJbXNnWzVdLCBtc2dbNl0sIG1zZ1s3XSk7Ci0JCWFjZGJfcnRjX3NldF9lcnIobXNnWzNdKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCQlNTV9JTkZPKCJ1bmhhbmRsZWQgbXNnIGlkICV4XG4iLCBpZCk7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9hZHNwX29wcyBhZHNwX29wcyA9IHsKLQkuZXZlbnQgPSBhdWRwcF9kc3BfZXZlbnQsCi19OwotCi1zdGF0aWMgdm9pZCBhdWRwcF9mYWtlX2V2ZW50KHN0cnVjdCBhdWRwcF9zdGF0ZSAqYXVkcHAsIGludCBpZCwKLQkJCSAgICAgdW5zaWduZWQgZXZlbnQsIHVuc2lnbmVkIGFyZykKLXsKLQl1aW50MTZfdCBtc2dbMV07Ci0JdWludDE2X3QgbiA9IDA7Ci0JbXNnWzBdID0gYXJnOwotCWF1ZHBwLT5mdW5jW2lkXSAoYXVkcHAtPnByaXZhdGVbaWRdLCBldmVudCwgbXNnKTsKLQlpZiAoYXVkcHAtPmVuYWJsZWQgPT0gMSkgewotCQlmb3IgKG4gPSAwOyBuIDwgTUFYX0VWRU5UX0NBTExCQUNLX0NMSUVOVFM7ICsrbikKLQkJCWlmIChhdWRwcC0+Y2JfdGJsW25dICYmIGF1ZHBwLT5jYl90Ymxbbl0tPmZuKQotCQkJCWF1ZHBwLT5jYl90Ymxbbl0tPmZuKGF1ZHBwLT5jYl90Ymxbbl0tPnByaXZhdGUsCi0JCQkJCSBBVURQUF9NU0dfQ0ZHX01TRywgbXNnKTsKLQl9Ci19Ci0KLWludCBhdWRwcF9lbmFibGUoaW50IGlkLCBhdWRwcF9ldmVudF9mdW5jIGZ1bmMsIHZvaWQgKnByaXZhdGUpCi17Ci0Jc3RydWN0IGF1ZHBwX3N0YXRlICphdWRwcCA9ICZ0aGVfYXVkcHBfc3RhdGU7Ci0JaW50IHJlcyA9IDA7Ci0KLQlpZiAoaWQgPCAtMSB8fCBpZCA+IDQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGlkID09IC0xKQotCQlpZCA9IDU7Ci0KLQltdXRleF9sb2NrKGF1ZHBwLT5sb2NrKTsKLQlpZiAoYXVkcHAtPmZ1bmNbaWRdKSB7Ci0JCXJlcyA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JYXVkcHAtPmZ1bmNbaWRdID0gZnVuYzsKLQlhdWRwcC0+cHJpdmF0ZVtpZF0gPSBwcml2YXRlOwotCi0JTE9HKEVWX0VOQUJMRSwgMSk7Ci0JaWYgKGF1ZHBwLT5vcGVuX2NvdW50KysgPT0gMCkgewotCQlNTV9EQkcoImVuYWJsZVxuIik7Ci0JCXJlcyA9IG1zbV9hZHNwX2dldCgiQVVEUFBUQVNLIiwgJmF1ZHBwLT5tb2QsICZhZHNwX29wcywgYXVkcHApOwotCQlpZiAocmVzIDwgMCkgewotCQkJTU1fRVJSKCJhdWRwcDogY2Fubm90IG9wZW4gQVVEUFBUQVNLXG4iKTsKLQkJCWF1ZHBwLT5vcGVuX2NvdW50ID0gMDsKLQkJCWF1ZHBwLT5mdW5jW2lkXSA9IE5VTEw7Ci0JCQlhdWRwcC0+cHJpdmF0ZVtpZF0gPSBOVUxMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJTE9HKEVWX0VOQUJMRSwgMik7Ci0JCXByZXZlbnRfc3VzcGVuZCgpOwotCQltc21fYWRzcF9lbmFibGUoYXVkcHAtPm1vZCk7Ci0JCWF1ZHBwX2RzcF9jb25maWcoMSk7Ci0JfSBlbHNlIHsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQlpZiAoYXVkcHAtPmVuYWJsZWQpCi0JCQlhdWRwcF9mYWtlX2V2ZW50KGF1ZHBwLCBpZCwKLQkJCQkJIEFVRFBQX01TR19DRkdfTVNHLCBBVURQUF9NU0dfRU5BX0VOQSk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQl9Ci0KLQlyZXMgPSAwOwotb3V0OgotCW11dGV4X3VubG9jayhhdWRwcC0+bG9jayk7Ci0JcmV0dXJuIHJlczsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcHBfZW5hYmxlKTsKLQotdm9pZCBhdWRwcF9kaXNhYmxlKGludCBpZCwgdm9pZCAqcHJpdmF0ZSkKLXsKLQlzdHJ1Y3QgYXVkcHBfc3RhdGUgKmF1ZHBwID0gJnRoZV9hdWRwcF9zdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByYzsKLQotCWlmIChpZCA8IC0xIHx8IGlkID4gNCkKLQkJcmV0dXJuOwotCi0JaWYgKGlkID09IC0xKQotCQlpZCA9IDU7Ci0KLQltdXRleF9sb2NrKGF1ZHBwLT5sb2NrKTsKLQlMT0coRVZfRElTQUJMRSwgMSk7Ci0JaWYgKCFhdWRwcC0+ZnVuY1tpZF0pCi0JCWdvdG8gb3V0OwotCWlmIChhdWRwcC0+cHJpdmF0ZVtpZF0gIT0gcHJpdmF0ZSkKLQkJZ290byBvdXQ7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JYXVkcHBfZmFrZV9ldmVudChhdWRwcCwgaWQsIEFVRFBQX01TR19DRkdfTVNHLCBBVURQUF9NU0dfRU5BX0RJUyk7Ci0JYXVkcHAtPmZ1bmNbaWRdID0gTlVMTDsKLQlhdWRwcC0+cHJpdmF0ZVtpZF0gPSBOVUxMOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCWlmICgtLWF1ZHBwLT5vcGVuX2NvdW50ID09IDApIHsKLQkJTU1fREJHKCJkaXNhYmxlXG4iKTsKLQkJTE9HKEVWX0RJU0FCTEUsIDIpOwotCQlhdWRwcF9kc3BfY29uZmlnKDApOwotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRwcC0+ZXZlbnRfd2FpdCwKLQkJCQkoYXVkcHAtPmVuYWJsZWQgPT0gMCkpOwotCQlpZiAoYXVkcHAtPmVuYWJsZWQgPT0gMCkKLQkJCU1NX0lORk8oIlJlY2VpdmVkIENGR19NU0dfRElTQUJMRSBmcm9tIEFEU1BcbiIpOwotCQllbHNlCi0JCQlNTV9FUlIoIkRpZG4ndCByZWNlaXZlIENGR19NU0cgRElTQUJMRSBcCi0JCQkJCW1lc3NhZ2UgZnJvbSBBRFNQXG4iKTsKLQkJbXNtX2Fkc3BfZGlzYWJsZShhdWRwcC0+bW9kKTsKLQkJbXNtX2Fkc3BfcHV0KGF1ZHBwLT5tb2QpOwotCQlhdWRwcC0+bW9kID0gTlVMTDsKLQkJYWxsb3dfc3VzcGVuZCgpOwotCX0KLW91dDoKLQltdXRleF91bmxvY2soYXVkcHAtPmxvY2spOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9kaXNhYmxlKTsKLQotI2RlZmluZSBCQURfSUQoaWQpICgoaWQgPCAwKSB8fCAoaWQgPj0gQ0hfQ09VTlQpKQotCi1pbnQgYXVkcHBfcmVzdG9yZV9hdnN5bmMoaW50IGlkLCB1aW50MTZfdCAqYXZzeW5jKQotewotCXN0cnVjdCBhdWRwcF9jbWRfYXZzeW5jIGNtZDsKLQotCWlmIChCQURfSUQoaWQpKQotCQlyZXR1cm4gLTE7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCWNtZC5jbWRfaWQgPSBBVURQUF9DTURfQVZTWU5DOwotCWNtZC5zdHJlYW1faWQgPSBpZDsKLQljbWQuaW50ZXJydXB0X2ludGVydmFsID0gMDsgLyogU2V0dGluZyBpdCB0byBaZXJvIGFzIHRoZXJlIHdvbid0IGJlCi0JCQkJCXBlcmlvZGljIHVwZGF0ZSAqLwotCWNtZC5zYW1wbGVfY291bnRlcl9kbHN3ID0gYXZzeW5jWzNdOwotCWNtZC5zYW1wbGVfY291bnRlcl9kbXN3ID0gYXZzeW5jWzJdOwotCWNtZC5zYW1wbGVfY291bnRlcl9tc3cgPSBhdnN5bmNbMV07Ci0JY21kLmJ5dGVfY291bnRlcl9kbHN3ID0gYXZzeW5jWzZdOwotCWNtZC5ieXRlX2NvdW50ZXJfZG1zdyA9IGF2c3luY1s1XTsKLQljbWQuYnl0ZV9jb3VudGVyX21zdyA9IGF2c3luY1s0XTsKLQotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMSgmY21kLCBzaXplb2YoY21kKSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHBwX3Jlc3RvcmVfYXZzeW5jKTsKLQotaW50IGF1ZHBwX3F1ZXJ5X2F2c3luYyhpbnQgaWQpCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9xdWVyeV9hdnN5bmMgY21kOwotCi0JaWYgKEJBRF9JRChpZCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY21kX2lkID0gQVVEUFBfQ01EX1FVRVJZX0FWU1lOQzsKLQljbWQuc3RyZWFtX2lkID0gaWQ7Ci0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUxKCZjbWQsIHNpemVvZihjbWQpKTsKLQotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9xdWVyeV9hdnN5bmMpOwotCi1pbnQgYXVkcHBfc2V0X3ZvbHVtZV9hbmRfcGFuKHVuc2lnbmVkIGlkLCB1bnNpZ25lZCB2b2x1bWUsIGludCBwYW4sCi0JCQllbnVtIG9ial90eXBlIG9ianR5cGUpCi17Ci0JLyogY21kLCBvYmpfY2ZnWzddLCBjbWRfdHlwZSwgdm9sdW1lLCBwYW4gKi8KLQl1aW50MTZfdCBjbWRbN107Ci0KLQlpZiAob2JqdHlwZSkgewotCQlpZiAoaWQgPiA1KSB7Ci0JCQlNTV9FUlIoIldyb25nIFBPUFAgZGVjb2RlciBpZDogJWRcbiIsIGlkKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGlkID4gMykgewotCQkJTU1fRVJSKCJXcm9uZyBDT1BQIGRlY29kZXIgaWQ6ICVkXG4iLCBpZCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCW1lbXNldChjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWRbMF0gPSBBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVM7Ci0JaWYgKG9ianR5cGUpCi0JCWNtZFsxXSA9IEFVRFBQX0NNRF9QT1BQX1NUUkVBTTsKLQllbHNlCi0JCWNtZFsxXSA9IEFVRFBQX0NNRF9DT1BQX1NUUkVBTTsKLQljbWRbMl0gPSBpZDsKLQljbWRbM10gPSBBVURQUF9DTURfQ0ZHX09CSl9VUERBVEU7Ci0JY21kWzRdID0gQVVEUFBfQ01EX1ZPTFVNRV9QQU47Ci0JY21kWzVdID0gdm9sdW1lOwotCWNtZFs2XSA9IHBhbjsKLQotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMyhjbWQsIHNpemVvZihjbWQpKTsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcHBfc2V0X3ZvbHVtZV9hbmRfcGFuKTsKLQotLyogSW1wbGVtZW50YXRpb24gb2YgQ09QUCBmZWF0dXJlcyAqLwotaW50IGF1ZHBwX2RzcF9zZXRfbWJhZHJjKHVuc2lnbmVkIGlkLCB1bnNpZ25lZCBlbmFibGUsCi0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19tYmFkcmMgKm1iYWRyYywKLQllbnVtIG9ial90eXBlIG9ianR5cGUpCi17Ci0JaWYgKG9ianR5cGUpIHsKLQkJaWYgKGlkID4gNSkgewotCQkJTU1fRVJSKCJXcm9uZyBQT1BQIGRlY29kZXIgaWQ6ICVkXG4iLCBpZCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChpZCA+IDMpIHsKLQkJCU1NX0VSUigiV3JvbmcgQ09QUCBkZWNvZGVyIGlkOiAlZFxuIiwgaWQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQltYmFkcmMtPmNvbW1vbi5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVM7Ci0JaWYgKG9ianR5cGUpCi0JCW1iYWRyYy0+Y29tbW9uLnN0cmVhbSA9IEFVRFBQX0NNRF9QT1BQX1NUUkVBTTsKLQllbHNlCi0JCW1iYWRyYy0+Y29tbW9uLnN0cmVhbSA9IEFVRFBQX0NNRF9DT1BQX1NUUkVBTTsKLQotCW1iYWRyYy0+Y29tbW9uLnN0cmVhbV9pZCA9IGlkOwotCW1iYWRyYy0+Y29tbW9uLm9ial9jZmcgPSBBVURQUF9DTURfQ0ZHX09CSl9VUERBVEU7Ci0JbWJhZHJjLT5jb21tb24uY29tbWFuZF90eXBlID0gQVVEUFBfQ01EX01CQURSQzsKLQotCWlmIChlbmFibGUpCi0JCW1iYWRyYy0+ZW5hYmxlID0gQVVEUFBfQ01EX0FEUkNfRkxBR19FTkE7Ci0JZWxzZQotCQltYmFkcmMtPmVuYWJsZSA9IEFVRFBQX0NNRF9BRFJDX0ZMQUdfRElTOwotCi0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUzKG1iYWRyYywKLQkJCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX21iYWRyYykpOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9kc3Bfc2V0X21iYWRyYyk7Ci0KLWludCBhdWRwcF9kc3Bfc2V0X3Fjb25jZXJ0X3BsdXModW5zaWduZWQgaWQsIHVuc2lnbmVkIGVuYWJsZSwKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3Fjb25jZXJ0ICpxY29uY2VydF9wbHVzLAotCWVudW0gb2JqX3R5cGUgb2JqdHlwZSkKLXsKLQlpZiAob2JqdHlwZSkgewotCQlpZiAoaWQgPiA1KSB7Ci0JCQlNTV9FUlIoIldyb25nIFBPUFAgZGVjb2RlciBpZDogJWRcbiIsIGlkKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGlkID4gMykgewotCQkJTU1fRVJSKCJXcm9uZyBDT1BQIGRlY29kZXIgaWQ6ICVkXG4iLCBpZCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCXFjb25jZXJ0X3BsdXMtPmNvbW1vbi5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVM7Ci0JaWYgKG9ianR5cGUpCi0JCXFjb25jZXJ0X3BsdXMtPmNvbW1vbi5zdHJlYW0gPSBBVURQUF9DTURfUE9QUF9TVFJFQU07Ci0JZWxzZQotCQlxY29uY2VydF9wbHVzLT5jb21tb24uc3RyZWFtID0gQVVEUFBfQ01EX0NPUFBfU1RSRUFNOwotCi0JcWNvbmNlcnRfcGx1cy0+Y29tbW9uLnN0cmVhbV9pZCA9IGlkOwotCXFjb25jZXJ0X3BsdXMtPmNvbW1vbi5vYmpfY2ZnID0gQVVEUFBfQ01EX0NGR19PQkpfVVBEQVRFOwotCXFjb25jZXJ0X3BsdXMtPmNvbW1vbi5jb21tYW5kX3R5cGUgPSBBVURQUF9DTURfUUNPTkNFUlQ7Ci0KLQlpZiAoZW5hYmxlKQotCQlxY29uY2VydF9wbHVzLT5lbmFibGVfZmxhZyA9IEFVRFBQX0NNRF9BRFJDX0ZMQUdfRU5BOwotCWVsc2UKLQkJcWNvbmNlcnRfcGx1cy0+ZW5hYmxlX2ZsYWcgPSBBVURQUF9DTURfQURSQ19GTEFHX0RJUzsKLQotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMyhxY29uY2VydF9wbHVzLAotCQlzaXplb2Yoc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19xY29uY2VydCkpOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9kc3Bfc2V0X3Fjb25jZXJ0X3BsdXMpOwotCi1pbnQgYXVkcHBfZHNwX3NldF9yeF9paXIodW5zaWduZWQgaWQsIHVuc2lnbmVkIGVuYWJsZSwKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3BjbSAqaWlyLAotCWVudW0gb2JqX3R5cGUgb2JqdHlwZSkKLXsKLQotCWlmIChvYmp0eXBlKSB7Ci0JCWlmIChpZCA+IDUpIHsKLQkJCU1NX0VSUigiV3JvbmcgUE9QUCBkZWNvZGVyIGlkOiAlZFxuIiwgaWQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoaWQgPiAzKSB7Ci0JCQlNTV9FUlIoIldyb25nIENPUFAgZGVjb2RlciBpZDogJWRcbiIsIGlkKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JaWlyLT5jb21tb24uY21kX2lkID0gQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TOwotCWlmIChvYmp0eXBlKQotCQlpaXItPmNvbW1vbi5zdHJlYW0gPSBBVURQUF9DTURfUE9QUF9TVFJFQU07Ci0JZWxzZQotCQlpaXItPmNvbW1vbi5zdHJlYW0gPSBBVURQUF9DTURfQ09QUF9TVFJFQU07Ci0KLQlpaXItPmNvbW1vbi5zdHJlYW1faWQgPSBpZDsKLQlpaXItPmNvbW1vbi5vYmpfY2ZnID0gQVVEUFBfQ01EX0NGR19PQkpfVVBEQVRFOwotCWlpci0+Y29tbW9uLmNvbW1hbmRfdHlwZSA9IEFVRFBQX0NNRF9JSVJfVFVOSU5HX0ZJTFRFUjsKLQotCWlmIChlbmFibGUpCi0JCWlpci0+YWN0aXZlX2ZsYWcgPSBBVURQUF9DTURfSUlSX0ZMQUdfRU5BOwotCWVsc2UKLQkJaWlyLT5hY3RpdmVfZmxhZyA9IEFVRFBQX0NNRF9JSVJfRkxBR19ESVM7Ci0KLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTMoaWlyLAotCQlzaXplb2Yoc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19wY20pKTsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcHBfZHNwX3NldF9yeF9paXIpOwotCi1pbnQgYXVkcHBfZHNwX3NldF9nYWluX3J4KHVuc2lnbmVkIGlkLAotCQkJc3RydWN0IGF1ZHBwX2NtZF9jZmdfY2FsX2dhaW4gKmNhbGliX2dhaW5fcngsCi0JCQllbnVtIG9ial90eXBlIG9ianR5cGUpCi17Ci0JaWYgKG9ianR5cGUpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJaWYgKGlkID4gMykgewotCQkJTU1fRVJSKCJXcm9uZyBDT1BQIGRlY29kZXIgaWQ6ICVkXG4iLCBpZCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQljYWxpYl9nYWluX3J4LT5jb21tb24uY21kX2lkID0gQVVEUFBfQ01EX0NGR19PQkpFQ1RfUEFSQU1TOwotCWNhbGliX2dhaW5fcngtPmNvbW1vbi5zdHJlYW0gPSBBVURQUF9DTURfQ09QUF9TVFJFQU07Ci0KLQljYWxpYl9nYWluX3J4LT5jb21tb24uc3RyZWFtX2lkID0gaWQ7Ci0JY2FsaWJfZ2Fpbl9yeC0+Y29tbW9uLm9ial9jZmcgPSBBVURQUF9DTURfQ0ZHX09CSl9VUERBVEU7Ci0JY2FsaWJfZ2Fpbl9yeC0+Y29tbW9uLmNvbW1hbmRfdHlwZSA9IEFVRFBQX0NNRF9DQUxJQl9HQUlOX1JYOwotCi0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUzKGNhbGliX2dhaW5fcngsCi0JCQlzaXplb2Yoc3RydWN0IGF1ZHBwX2NtZF9jZmdfY2FsX2dhaW4pKTsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcHBfZHNwX3NldF9nYWluX3J4KTsKLQotaW50IGF1ZHBwX2RzcF9zZXRfcGJlKHVuc2lnbmVkIGlkLCB1bnNpZ25lZCBlbmFibGUsCi0JCQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19wYmUgKnBiZV9ibG9jaywKLQkJCWVudW0gb2JqX3R5cGUgb2JqdHlwZSkKLXsKLQlpZiAob2JqdHlwZSkgewotCQlpZiAoaWQgPiA1KSB7Ci0JCQlNTV9FUlIoIldyb25nIFBPUFAgZGVjb2RlciBpZDogJWRcbiIsIGlkKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGlkID4gMykgewotCQkJTU1fRVJSKCJXcm9uZyBDT1BQIGRlY29kZXIgaWQ6ICVkXG4iLCBpZCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCXBiZV9ibG9jay0+Y29tbW9uLmNtZF9pZCA9IEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNUzsKLQlpZiAob2JqdHlwZSkKLQkJcGJlX2Jsb2NrLT5jb21tb24uc3RyZWFtID0gQVVEUFBfQ01EX1BPUFBfU1RSRUFNOwotCWVsc2UKLQkJcGJlX2Jsb2NrLT5jb21tb24uc3RyZWFtID0gQVVEUFBfQ01EX0NPUFBfU1RSRUFNOwotCi0JcGJlX2Jsb2NrLT5jb21tb24uc3RyZWFtX2lkID0gaWQ7Ci0JcGJlX2Jsb2NrLT5jb21tb24ub2JqX2NmZyA9IEFVRFBQX0NNRF9DRkdfT0JKX1VQREFURTsKLQlwYmVfYmxvY2stPmNvbW1vbi5jb21tYW5kX3R5cGUgPSBBVURQUF9DTURfUEJFOwotCi0JaWYgKGVuYWJsZSkKLQkJcGJlX2Jsb2NrLT5wYmVfZW5hYmxlID0gQVVEUFBfQ01EX1BCRV9GTEFHX0VOQTsKLQllbHNlCi0JCXBiZV9ibG9jay0+cGJlX2VuYWJsZSA9IEFVRFBQX0NNRF9QQkVfRkxBR19ESVM7Ci0KLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTMocGJlX2Jsb2NrLAotCQkJc2l6ZW9mKHN0cnVjdCBhdWRwcF9jbWRfY2ZnX3BiZSkpOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9kc3Bfc2V0X3BiZSk7Ci0KLWludCBhdWRwcF9kc3Bfc2V0X3NwYSh1bnNpZ25lZCBpZCwKLSAgICAgc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc19zcGVjdHJhbSAqc3BhLAotCQkJZW51bSBvYmpfdHlwZSBvYmp0eXBlKXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3NwZWN0cmFtIGNtZDsKLQotCWlmIChvYmp0eXBlKSB7Ci0JCWlmIChpZCA+IDUpIHsKLQkJCU1NX0VSUigiV3JvbmcgUE9QUCBkZWNvZGVyIGlkOiAlZFxuIiwgaWQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoaWQgPiAzKSB7Ci0JCQlNTV9FUlIoIldyb25nIENPUFAgZGVjb2RlciBpZDogJWRcbiIsIGlkKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQlpZiAob2JqdHlwZSkKLQkJY21kLmNvbW1vbi5zdHJlYW0gPSBBVURQUF9DTURfUE9QUF9TVFJFQU07Ci0JZWxzZQotCQljbWQuY29tbW9uLnN0cmVhbSA9IEFVRFBQX0NNRF9DT1BQX1NUUkVBTTsKLQotCWNtZC5jb21tb24uc3RyZWFtX2lkID0gaWQ7Ci0JY21kLmNvbW1vbi5vYmpfY2ZnID0gQVVEUFBfQ01EX0NGR19PQkpfVVBEQVRFOwotCWNtZC5jb21tb24uY29tbWFuZF90eXBlID0gQVVEUFBfQ01EX1NQRUNUUk9HUkFNOwotICAgICAgIGNtZC5zYW1wbGVfaW50ZXJ2YWwgPSBzcGEtPnNhbXBsZV9pbnRlcnZhbDsKLQljbWQubnVtX2NvZWZmID0gc3BhLT5udW1fY29lZmY7Ci0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUzKCZjbWQsIHNpemVvZihjbWQpKTsKLQotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9kc3Bfc2V0X3NwYSk7Ci0KLWludCBhdWRwcF9kc3Bfc2V0X3N0Zih1bnNpZ25lZCBpZCwgdW5zaWduZWQgZW5hYmxlLAotICAgICBzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3NpZGVjaGFpbiAqc3RmLAotCQkJZW51bSBvYmpfdHlwZSBvYmp0eXBlKXsKLQlpZiAob2JqdHlwZSkgewotCQlpZiAoaWQgPiA1KSB7Ci0JCQlNTV9FUlIoIldyb25nIFBPUFAgZGVjb2RlciBpZDogJWRcbiIsIGlkKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGlkID4gMykgewotCQkJTU1fRVJSKCJXcm9uZyBDT1BQIGRlY29kZXIgaWQ6ICVkXG4iLCBpZCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCXN0Zi0+Y29tbW9uLmNtZF9pZCA9IEFVRFBQX0NNRF9DRkdfT0JKRUNUX1BBUkFNUzsKLQlpZiAob2JqdHlwZSkKLQkJc3RmLT5jb21tb24uc3RyZWFtID0gQVVEUFBfQ01EX1BPUFBfU1RSRUFNOwotCWVsc2UKLQkJc3RmLT5jb21tb24uc3RyZWFtID0gQVVEUFBfQ01EX0NPUFBfU1RSRUFNOwotCi0Jc3RmLT5jb21tb24uc3RyZWFtX2lkID0gaWQ7Ci0Jc3RmLT5jb21tb24ub2JqX2NmZyA9IEFVRFBQX0NNRF9DRkdfT0JKX1VQREFURTsKLQlzdGYtPmNvbW1vbi5jb21tYW5kX3R5cGUgPSBBVURQUF9DTURfU0lERUNIQUlOX1RVTklOR19GSUxURVI7Ci0KLQlpZiAoZW5hYmxlKQotCQlzdGYtPmFjdGl2ZV9mbGFnID0gQVVEUFBfQ01EX1NURl9GTEFHX0VOQTsKLQllbHNlCi0JCXN0Zi0+YWN0aXZlX2ZsYWcgPSBBVURQUF9DTURfU1RGX0ZMQUdfRElTOwotCXJldHVybiBhdWRwcF9zZW5kX3F1ZXVlMyhzdGYsCi0JCXNpemVvZihzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3NpZGVjaGFpbikpOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9kc3Bfc2V0X3N0Zik7Ci0KLS8qIEltcGxlbWVudGF0aW9uIE9mIENPUFAgKyBQT1BQICovCi1pbnQgYXVkcHBfZHNwX3NldF9lcSh1bnNpZ25lZCBpZCwgdW5zaWduZWQgZW5hYmxlLAotCQkgICAgIHN0cnVjdCBhdWRwcF9jbWRfY2ZnX29iamVjdF9wYXJhbXNfZXFhbGl6ZXIgKmVxLAotCQkJCWVudW0gb2JqX3R5cGUgb2JqdHlwZSkKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX2VxYWxpemVyIGNtZDsKLQotCWlmIChvYmp0eXBlKSB7Ci0JCWlmIChpZCA+IDUpIHsKLQkJCU1NX0VSUigiV3JvbmcgUE9QUCBkZWNvZGVyIGlkOiAlZFxuIiwgaWQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoaWQgPiAzKSB7Ci0JCQlNTV9FUlIoIldyb25nIENPUFAgZGVjb2RlciBpZDogJWRcbiIsIGlkKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQlpZiAob2JqdHlwZSkKLQkJY21kLmNvbW1vbi5zdHJlYW0gPSBBVURQUF9DTURfUE9QUF9TVFJFQU07Ci0JZWxzZQotCQljbWQuY29tbW9uLnN0cmVhbSA9IEFVRFBQX0NNRF9DT1BQX1NUUkVBTTsKLQotCWNtZC5jb21tb24uc3RyZWFtX2lkID0gaWQ7Ci0JY21kLmNvbW1vbi5vYmpfY2ZnID0gQVVEUFBfQ01EX0NGR19PQkpfVVBEQVRFOwotCWNtZC5jb21tb24uY29tbWFuZF90eXBlID0gQVVEUFBfQ01EX0VRVUFMSVpFUjsKLQlpZiAoZW5hYmxlKSB7Ci0JCWNtZC5lcV9mbGFnID0gQVVEUFBfQ01EX0VRX0ZMQUdfRU5BOwotCQljbWQubnVtX2JhbmRzID0gZXEtPm51bV9iYW5kczsKLQkJbWVtY3B5KCZjbWQuZXFfY29lZmYsICZlcS0+ZXFfY29lZmYsIHNpemVvZihlcS0+ZXFfY29lZmYpKTsKLQl9IGVsc2UKLQkJY21kLmVxX2ZsYWcgPSBBVURQUF9DTURfRVFfRkxBR19ESVM7Ci0KLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTMoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9kc3Bfc2V0X2VxKTsKLQotaW50IGF1ZHBwX2RzcF9zZXRfdm9sX3Bhbih1bnNpZ25lZCBpZCwKLQkJCSAgc3RydWN0IGF1ZHBwX2NtZF9jZmdfb2JqZWN0X3BhcmFtc192b2x1bWUgKnZvbF9wYW4sCi0JCQkJCWVudW0gb2JqX3R5cGUgb2JqdHlwZSkKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19vYmplY3RfcGFyYW1zX3ZvbHVtZSBjbWQ7Ci0KLQlpZiAob2JqdHlwZSkgewotCQlpZiAoaWQgPiA1KSB7Ci0JCQlNTV9FUlIoIldyb25nIFBPUFAgZGVjb2RlciBpZDogJWRcbiIsIGlkKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGlkID4gQVVEUFBfTUFYX0NPUFBfREVWSUNFUykgewotCQkJTU1fRVJSKCJXcm9uZyBDT1BQIGRlY29kZXIgaWQ6ICVkXG4iLCBpZCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNvbW1vbi5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX09CSkVDVF9QQVJBTVM7Ci0JaWYgKG9ianR5cGUpCi0JCWNtZC5jb21tb24uc3RyZWFtID0gQVVEUFBfQ01EX1BPUFBfU1RSRUFNOwotCWVsc2UKLQkJY21kLmNvbW1vbi5zdHJlYW0gPSBBVURQUF9DTURfQ09QUF9TVFJFQU07Ci0KLQljbWQuY29tbW9uLnN0cmVhbV9pZCA9IGlkOwotCWNtZC5jb21tb24ub2JqX2NmZyA9IEFVRFBQX0NNRF9DRkdfT0JKX1VQREFURTsKLQljbWQuY29tbW9uLmNvbW1hbmRfdHlwZSA9IEFVRFBQX0NNRF9WT0xVTUVfUEFOOwotCi0JY21kLnZvbHVtZSA9IHZvbF9wYW4tPnZvbHVtZTsKLQljbWQucGFuID0gdm9sX3Bhbi0+cGFuOwotCi0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUzKCZjbWQsIHNpemVvZihjbWQpKTsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcHBfZHNwX3NldF92b2xfcGFuKTsKLQotaW50IGF1ZHBwX3BhdXNlKHVuc2lnbmVkIGlkLCBpbnQgcGF1c2UpCi17Ci0JLyogcGF1c2UgMSA9IHBhdXNlIDAgPSByZXN1bWUgKi8KLQl1MTYgcGF1c2VfY21kW0FVRFBQX0NNRF9ERUNfQ1RSTF9MRU4gLyBzaXplb2YodW5zaWduZWQgc2hvcnQpXTsKLQotCWlmIChpZCA+PSBDSF9DT1VOVCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1zZXQocGF1c2VfY21kLCAwLCBzaXplb2YocGF1c2VfY21kKSk7Ci0KLQlwYXVzZV9jbWRbMF0gPSBBVURQUF9DTURfREVDX0NUUkw7Ci0JcGF1c2VfY21kWzFdID0gaWQ7Ci0JaWYgKHBhdXNlID09IDEpCi0JCXBhdXNlX2NtZFsyXSA9IEFVRFBQX0NNRF9VUERBVEVfViB8IEFVRFBQX0NNRF9QQVVTRV9WOwotCWVsc2UgaWYgKHBhdXNlID09IDApCi0JCXBhdXNlX2NtZFsyXSA9IEFVRFBQX0NNRF9VUERBVEVfViB8IEFVRFBQX0NNRF9SRVNVTUVfVjsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIGF1ZHBwX3NlbmRfcXVldWUxKHBhdXNlX2NtZCwgc2l6ZW9mKHBhdXNlX2NtZCkpOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcF9wYXVzZSk7Ci0KLWludCBhdWRwcF9mbHVzaCh1bnNpZ25lZCBpZCkKLXsKLQl1MTYgZmx1c2hfY21kW0FVRFBQX0NNRF9ERUNfQ1RSTF9MRU4gLyBzaXplb2YodW5zaWduZWQgc2hvcnQpXTsKLQotCWlmIChpZCA+PSBDSF9DT1VOVCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1zZXQoZmx1c2hfY21kLCAwLCBzaXplb2YoZmx1c2hfY21kKSk7Ci0KLQlmbHVzaF9jbWRbMF0gPSBBVURQUF9DTURfREVDX0NUUkw7Ci0JZmx1c2hfY21kWzFdID0gaWQ7Ci0JZmx1c2hfY21kWzJdID0gQVVEUFBfQ01EX1VQREFURV9WIHwgQVVEUFBfQ01EX0ZMVVNIX1Y7Ci0KLQlyZXR1cm4gYXVkcHBfc2VuZF9xdWV1ZTEoZmx1c2hfY21kLCBzaXplb2YoZmx1c2hfY21kKSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHBwX2ZsdXNoKTsKLQotLyogZGVjX2F0dHJiID0gNzowLCAwIC0gTm8gRGVjb2RlciwgZWxzZSBzdXBwb3J0ZWQgZGVjb2RlciAqCi0gKiBsaWtlIG1wMywgYWFjLCB3bWEgZXRjIC4uLiAqCi0gKiAgICAgICAgICAgPSAgMTU6OCwgYml0WzhdID0gMSAtIFR1bm5lbCwgYml0WzldID0gMSAtIE5vblR1bm5lbCAqCi0gKiAgICAgICAgICAgPSAgMzE6MTYsIHJlc2VydmVkICovCi1pbnQgYXVkcHBfYWRlY19hbGxvYyh1bnNpZ25lZCBkZWNfYXR0cmIsIGNvbnN0IGNoYXIgKiptb2R1bGVfbmFtZSwKLQkJICAgICB1bnNpZ25lZCAqcXVldWVpZCkKLXsKLQlzdHJ1Y3QgYXVkcHBfc3RhdGUgKmF1ZHBwID0gJnRoZV9hdWRwcF9zdGF0ZTsKLQlpbnQgZGVjaWQgPSAtMSwgaWR4LCBsaWR4LCBtb2RlLCBjb2RlYzsKLQlpbnQgY29kZWNzX3N1cHBvcnRlZCwgbWluX2NvZGVjc19zdXBwb3J0ZWQ7Ci0JdW5zaWduZWQgaW50ICpjb25jdXJyZW5jeV9lbnRyeTsKLQl1OCBtYXhfaW5zdGFuY2UsIGNvZGVjX3R5cGU7Ci0KLQlzdHJ1Y3QgZGVjX2luc3RhbmNlX3RhYmxlICpkZWNfaW5zdGFuY2VfbGlzdDsKLQlkZWNfaW5zdGFuY2VfbGlzdCA9IChzdHJ1Y3QgZGVjX2luc3RhbmNlX3RhYmxlICopCi0JCQkJKGF1ZHBwLT5kZWNfZGF0YWJhc2UtPmRlY19pbnN0YW5jZV9saXN0KTsKLQotCW11dGV4X2xvY2soYXVkcHAtPmxvY2tfZGVjKTsKLQkvKiBSZXByZXNlbnRzIGluIGJpdCBtYXNrICovCi0JbW9kZSA9ICgoZGVjX2F0dHJiICYgQVVEUFBfTU9ERV9NQVNLKSA8PCAxNik7Ci0JY29kZWMgPSAoMSA8PCAoZGVjX2F0dHJiICYgQVVEUFBfQ09ERUNfTUFTSykpOwotCWNvZGVjX3R5cGUgPSAoZGVjX2F0dHJiICYgQVVEUFBfQ09ERUNfTUFTSyk7Ci0KLQkvKiBGaW5kICB3aGV0aGVyIHNhbWUvZGlmZmVyZW50IGNvZGVjIGluc3RhbmNlcyBhcmUgcnVubmluZyAqLwotCWF1ZHBwLT5kZWNvZGVyX2NvdW50Kys7Ci0JYXVkcHAtPmNvZGVjX2NudFtjb2RlY190eXBlXSsrOwotCW1heF9pbnN0YW5jZSA9IDA7Ci0KLQkvKmlmIGRpZmZlcmVudCBpbnN0YW5jZSBvZiBjb2RlYyovCi0JaWYgKGF1ZHBwLT5jb2RlY19jbnRbY29kZWNfdHlwZV0gPCBhdWRwcC0+ZGVjb2Rlcl9jb3VudCkgewotCQltYXhfaW5zdGFuY2UgPSBhdWRwcC0+Y29kZWNfbWF4X2luc3RhbmNlczsKLQkJLyogR2V0IHRoZSBtYXhpbXVtIG5vLiBvZiBpbnN0YW5jZXMgdGhhdCBjYW4gYmUgc3VwcG9ydGVkICovCi0JCWZvciAoaWR4ID0gMDsgaWR4IDwgTVNNX01BWF9ERUNfQ05UOyBpZHgrKykgewotCQkJaWYgKGF1ZHBwLT5jb2RlY19jbnRbaWR4XSkgewotCQkJCWlmICgoZGVjX2luc3RhbmNlX2xpc3QgKwotCQkJCQlhdWRwcC0+b3BfbW9kZSAqIE1TTV9NQVhfREVDX0NOVCArCi0JCQkJCQlpZHgpLT4KLQkJCQkJCW1heF9pbnN0YW5jZXNfZGlmZl9kZWMgPAotCQkJCQkJbWF4X2luc3RhbmNlKSB7Ci0JCQkJCQltYXhfaW5zdGFuY2UgPQotCQkJCQkJKGRlY19pbnN0YW5jZV9saXN0ICsKLQkJCQkJCQkgYXVkcHAtPm9wX21vZGUgKgotCQkJCQkJCQlNU01fTUFYX0RFQ19DTlQKLQkJCQkJCQkJKyBpZHgpLT4KLQkJCQkJCQltYXhfaW5zdGFuY2VzX2RpZmZfZGVjOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvKiBpZiBkaWZmZXJlbnQgY29kZWMgdHlwZSwgc2hvdWxkIG5vdCBjcm9zcyBtYXhpbXVtIG90aGVyCi0JCSAgIHN1cHBvcnRlZCAqLwotCQlpZiAoYXVkcHAtPmRlY29kZXJfY291bnQgPiAobWF4X2luc3RhbmNlICsgMSkpIHsKLQkJCU1NX0VSUigiQ2FuIG5vdCBzdXBwb3J0LCBhbHJlYWR5IHJlYWNoZWQgbWF4XG4iKTsKLQkJCWF1ZHBwLT5kZWNvZGVyX2NvdW50LS07Ci0JCQlhdWRwcC0+Y29kZWNfY250W2NvZGVjX3R5cGVdLS07Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJYXVkcHAtPmNvZGVjX21heF9pbnN0YW5jZXMgPSBtYXhfaW5zdGFuY2U7Ci0JCU1NX0RCRygiZGlmZmVyZW50IGNvZGVjIHJ1bm5pbmdcbiIpOwotCX0gZWxzZSB7Ci0JCW1heF9pbnN0YW5jZSA9IChkZWNfaW5zdGFuY2VfbGlzdCArIGF1ZHBwLT5vcF9tb2RlICoKLQkJCQkJCU1TTV9NQVhfREVDX0NOVCArCi0JCQkJCQkgY29kZWNfdHlwZSktPgotCQkJCQkJCW1heF9pbnN0YW5jZXNfc2FtZV9kZWM7Ci0JCS8qIGlmIHNhbWUgY29kZWMgdHlwZSwgc2hvdWxkIG5vdCBjcm9zcyBtYXhpbXVtIHN1cHBvcnRlZCAqLwotCQlpZiAoYXVkcHAtPmRlY29kZXJfY291bnQgPiBtYXhfaW5zdGFuY2UpIHsKLQkJCU1NX0VSUigiQ2FuIG5vdCBzdXBwb3J0LCBhbHJlYWR5IHJlYWNoZWQgbWF4XG4iKTsKLQkJCWF1ZHBwLT5kZWNvZGVyX2NvdW50LS07Ci0JCQlhdWRwcC0+Y29kZWNfY250W2NvZGVjX3R5cGVdLS07Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJYXVkcHAtPmNvZGVjX21heF9pbnN0YW5jZXMgPSBtYXhfaW5zdGFuY2U7Ci0JCU1NX0RCRygic2FtZSBjb2RlYyBydW5uaW5nXG4iKTsKLQl9Ci0KLQkvKiBQb2ludCB0byBMYXN0IGVudHJ5IG9mIHRoZSByb3cgKi8KLQljb25jdXJyZW5jeV9lbnRyeSA9ICgoYXVkcHAtPmRlY19kYXRhYmFzZS0+ZGVjX2NvbmN1cnJlbmN5X3RhYmxlICsKLQkJCSAgICAgICgoYXVkcHAtPmNvbmN1cnJlbmN5ICsgMSkgKgotCQkJICAgICAgIChhdWRwcC0+ZGVjX2RhdGFiYXNlLT5udW1fZGVjKSkpIC0gMSk7Ci0KLQlsaWR4ID0gYXVkcHAtPmRlY19kYXRhYmFzZS0+bnVtX2RlYzsKLQltaW5fY29kZWNzX3N1cHBvcnRlZCA9IHNpemVvZih1bnNpZ25lZCBpbnQpICogODsKLQotCU1NX0RCRygibW9kZSA9IDB4JTA4eCBjb2RlYyA9IDB4JTA4eFxuIiwgbW9kZSwgY29kZWMpOwotCi0JZm9yIChpZHggPSBsaWR4OyBpZHggPiAwOyBpZHgtLSwgY29uY3VycmVuY3lfZW50cnktLSkgewotCQlpZiAoIShhdWRwcC0+ZGVjX2ludXNlICYgKDEgPDwgKGlkeCAtIDEpKSkpIHsKLQkJCWlmICgoKG1vZGUgJiAqY29uY3VycmVuY3lfZW50cnkpID09IG1vZGUpICYmCi0JCQkgICAgKGNvZGVjICYgKmNvbmN1cnJlbmN5X2VudHJ5KSkgewotCQkJCS8qIENoZWNrIHN1cHBvcnRzIG1pbmltdW0gbnVtYmVyIGNvZGVjcyAqLwotCQkJCWNvZGVjc19zdXBwb3J0ZWQgPQotCQkJCSAgICBhdWRwcC0+ZGVjX2RhdGFiYXNlLT5kZWNfaW5mb19saXN0W2lkeCAtCi0JCQkJCQkJCSAgICAgICAxXS4KLQkJCQkgICAgbnJfY29kZWNfc3VwcG9ydDsKLQkJCQlpZiAoY29kZWNzX3N1cHBvcnRlZCA8IG1pbl9jb2RlY3Nfc3VwcG9ydGVkKSB7Ci0JCQkJCWxpZHggPSBpZHggLSAxOwotCQkJCQltaW5fY29kZWNzX3N1cHBvcnRlZCA9IGNvZGVjc19zdXBwb3J0ZWQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JaWYgKGxpZHggPCBhdWRwcC0+ZGVjX2RhdGFiYXNlLT5udW1fZGVjKSB7Ci0JCWF1ZHBwLT5kZWNfaW51c2UgfD0gKDEgPDwgbGlkeCk7Ci0JCSptb2R1bGVfbmFtZSA9Ci0JCSAgICBhdWRwcC0+ZGVjX2RhdGFiYXNlLT5kZWNfaW5mb19saXN0W2xpZHhdLm1vZHVsZV9uYW1lOwotCQkqcXVldWVpZCA9Ci0JCSAgICBhdWRwcC0+ZGVjX2RhdGFiYXNlLT5kZWNfaW5mb19saXN0W2xpZHhdLm1vZHVsZV9xdWV1ZWlkOwotCQlkZWNpZCA9IGF1ZHBwLT5kZWNfZGF0YWJhc2UtPmRlY19pbmZvX2xpc3RbbGlkeF0ubW9kdWxlX2RlY2lkOwotCQlhdWRwcC0+ZGVjX2luZm9fdGFibGVbbGlkeF0uY29kZWMgPQotCQkgICAgKGRlY19hdHRyYiAmIEFVRFBQX0NPREVDX01BU0spOwotCQlhdWRwcC0+ZGVjX2luZm9fdGFibGVbbGlkeF0ucGlkID0gY3VycmVudC0+cGlkOwotCQkvKiBwb2ludCB0byByb3cgdG8gZ2V0IHN1cHBvcnRlZCBvcGVyYXRpb24gKi8KLQkJY29uY3VycmVuY3lfZW50cnkgPQotCQkgICAgKChhdWRwcC0+ZGVjX2RhdGFiYXNlLT5kZWNfY29uY3VycmVuY3lfdGFibGUgKwotCQkgICAgICAoKGF1ZHBwLT5jb25jdXJyZW5jeSkgKiAoYXVkcHAtPmRlY19kYXRhYmFzZS0+bnVtX2RlYykpKSArCi0JCSAgICAgbGlkeCk7Ci0JCWRlY2lkIHw9ICgoKmNvbmN1cnJlbmN5X2VudHJ5ICYgQVVEUFBfT1BfTUFTSykgPj4gMTIpOwotCQlNTV9JTkZPKCJkZWNpZCA9MHglMDh4IG1vZHVsZV9uYW1lPSVzLCBxdWV1ZWlkPSVkIFxuIiwgZGVjaWQsCi0JCQkJKm1vZHVsZV9uYW1lLCAqcXVldWVpZCk7Ci0JfQotZG9uZToKLQltdXRleF91bmxvY2soYXVkcHAtPmxvY2tfZGVjKTsKLQlyZXR1cm4gZGVjaWQ7Ci0KLX0KLUVYUE9SVF9TWU1CT0woYXVkcHBfYWRlY19hbGxvYyk7Ci0KLXZvaWQgYXVkcHBfYWRlY19mcmVlKGludCBkZWNpZCkKLXsKLQlzdHJ1Y3QgYXVkcHBfc3RhdGUgKmF1ZHBwID0gJnRoZV9hdWRwcF9zdGF0ZTsKLQlpbnQgaWR4OwotCW11dGV4X2xvY2soYXVkcHAtPmxvY2tfZGVjKTsKLQlmb3IgKGlkeCA9IGF1ZHBwLT5kZWNfZGF0YWJhc2UtPm51bV9kZWM7IGlkeCA+IDA7IGlkeC0tKSB7Ci0JCWlmIChhdWRwcC0+ZGVjX2RhdGFiYXNlLT5kZWNfaW5mb19saXN0W2lkeCAtIDFdLm1vZHVsZV9kZWNpZCA9PQotCQkgICAgZGVjaWQpIHsKLQkJCWF1ZHBwLT5kZWNvZGVyX2NvdW50LS07Ci0JCQlhdWRwcC0+XAotCQkJY29kZWNfY250W2F1ZHBwLT5kZWNfaW5mb190YWJsZVtpZHggLSAxXS5jb2RlY10tLTsKLQkJCWF1ZHBwLT5kZWNfaW51c2UgJj0gfigxIDw8IChpZHggLSAxKSk7Ci0JCQlhdWRwcC0+ZGVjX2luZm9fdGFibGVbaWR4IC0gMV0uY29kZWMgPSAtMTsKLQkJCWF1ZHBwLT5kZWNfaW5mb190YWJsZVtpZHggLSAxXS5waWQgPSAwOwotCQkJTU1fSU5GTygiZnJlZSBkZWNpZCA9JWQgXG4iLCBkZWNpZCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQltdXRleF91bmxvY2soYXVkcHAtPmxvY2tfZGVjKTsKLQlyZXR1cm47Ci0KLX0KLUVYUE9SVF9TWU1CT0woYXVkcHBfYWRlY19mcmVlKTsKLQotc3RhdGljIHNzaXplX3QgY29uY3VycmVuY3lfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYXVkcHBfc3RhdGUgKmF1ZHBwID0gJnRoZV9hdWRwcF9zdGF0ZTsKLQlpbnQgcmM7Ci0JbXV0ZXhfbG9jayhhdWRwcC0+bG9ja19kZWMpOwotCXJjID0gc3ByaW50ZihidWYsICIlbGRcbiIsIGF1ZHBwLT5jb25jdXJyZW5jeSk7Ci0JbXV0ZXhfdW5sb2NrKGF1ZHBwLT5sb2NrX2RlYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBjb25jdXJyZW5jeV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgYXVkcHBfc3RhdGUgKmF1ZHBwID0gJnRoZV9hdWRwcF9zdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGNvbmN1cnJlbmN5OwotCWludCByYyA9IC0xOwotCW11dGV4X2xvY2soYXVkcHAtPmxvY2tfZGVjKTsKLQlpZiAoYXVkcHAtPmRlY19pbnVzZSkgewotCQlNTV9FUlIoIkNhbiBub3QgY2hhbmdlIHByb2ZpbGUsIHdoaWxlIHBsYXliYWNrIGluIHByb2dyZXNzXG4iKTsKLQkJZ290byBkb25lOwotCX0KLQlyYyA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZjb25jdXJyZW5jeSk7Ci0JaWYgKCFyYyAmJgotCQkoY29uY3VycmVuY3kgPCBhdWRwcC0+ZGVjX2RhdGFiYXNlLT5udW1fY29uY3VycmVuY3lfc3VwcG9ydCkpIHsKLQkJYXVkcHAtPmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3k7Ci0JCU1NX0RCRygiQ29uY3VycmVuY3kgY2FzZSAlbGRcbiIsIGF1ZHBwLT5jb25jdXJyZW5jeSk7Ci0JCXJjID0gY291bnQ7Ci0JfSBlbHNlIHsKLQkJTU1fRVJSKCJOb3QgYSB2YWxpZCBDb25jdXJyZW5jeSBjYXNlXG4iKTsKLQkJcmMgPSAtRUlOVkFMOwotCX0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKGF1ZHBwLT5sb2NrX2RlYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBkZWNvZGVyX2luZm9fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOwotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2RlY29kZXJbQVVEUFBfTUFYX0RFQ09ERVJfQ05UXSA9IHsKLQlfX0FUVFIoZGVjb2RlcjAsIFNfSVJVR08sIGRlY29kZXJfaW5mb19zaG93LCBOVUxMKSwKLQlfX0FUVFIoZGVjb2RlcjEsIFNfSVJVR08sIGRlY29kZXJfaW5mb19zaG93LCBOVUxMKSwKLQlfX0FUVFIoZGVjb2RlcjIsIFNfSVJVR08sIGRlY29kZXJfaW5mb19zaG93LCBOVUxMKSwKLQlfX0FUVFIoZGVjb2RlcjMsIFNfSVJVR08sIGRlY29kZXJfaW5mb19zaG93LCBOVUxMKSwKLQlfX0FUVFIoZGVjb2RlcjQsIFNfSVJVR08sIGRlY29kZXJfaW5mb19zaG93LCBOVUxMKSwKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IGRlY29kZXJfaW5mb19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlpbnQgY3B5X3N6ID0gMDsKLQlzdHJ1Y3QgYXVkcHBfc3RhdGUgKmF1ZHBwID0gJnRoZV9hdWRwcF9zdGF0ZTsKLQljb25zdCBwdHJkaWZmX3Qgb2ZmID0gYXR0ciAtIGRldl9hdHRyX2RlY29kZXI7CS8qIGRlY29kZXIgbnVtYmVyICovCi0JbXV0ZXhfbG9jayhhdWRwcC0+bG9ja19kZWMpOwotCWNweV9zeiArPSBzY25wcmludGYoYnVmICsgY3B5X3N6LCBQQUdFX1NJWkUgLSBjcHlfc3osICIlZDoiLAotCQkJICAgIGF1ZHBwLT5kZWNfaW5mb190YWJsZVtvZmZdLmNvZGVjKTsKLQljcHlfc3ogKz0gc2NucHJpbnRmKGJ1ZiArIGNweV9zeiwgUEFHRV9TSVpFIC0gY3B5X3N6LCAiJWRcbiIsCi0JCQkgICAgYXVkcHAtPmRlY19pbmZvX3RhYmxlW29mZl0ucGlkKTsKLQltdXRleF91bmxvY2soYXVkcHAtPmxvY2tfZGVjKTsKLQlyZXR1cm4gY3B5X3N6OwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoY29uY3VycmVuY3ksIFNfSVdVU1IgfCBTX0lSVUdPLCBjb25jdXJyZW5jeV9zaG93LAotCSAgICBjb25jdXJyZW5jeV9zdG9yZSk7Ci1zdGF0aWMgaW50IGF1ZHBwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjLCBpZHg7Ci0Jc3RydWN0IGF1ZHBwX3N0YXRlICphdWRwcCA9ICZ0aGVfYXVkcHBfc3RhdGU7Ci0JYXVkcHAtPmNvbmN1cnJlbmN5ID0gQVVEUFBfQ09OQ1VSUkVOQ1lfREVGQVVMVDsKLQlhdWRwcC0+ZGVjX2RhdGFiYXNlID0KLQkgICAgKHN0cnVjdCBtc21fYWRzcGRlY19kYXRhYmFzZSAqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCi0JTU1fSU5GTygiTnVtYmVyIG9mIGRlY29kZXIgc3VwcG9ydGVkICAlZFxuIiwKLQkJYXVkcHAtPmRlY19kYXRhYmFzZS0+bnVtX2RlYyk7Ci0JTU1fSU5GTygiTnVtYmVyIG9mIGNvbmN1cnJlbmN5IHN1cHBvcnRlZCAgJWRcbiIsCi0JCWF1ZHBwLT5kZWNfZGF0YWJhc2UtPm51bV9jb25jdXJyZW5jeV9zdXBwb3J0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRwcC0+ZXZlbnRfd2FpdCk7Ci0JZm9yIChpZHggPSAwOyBpZHggPCBhdWRwcC0+ZGVjX2RhdGFiYXNlLT5udW1fZGVjOyBpZHgrKykgewotCQlhdWRwcC0+ZGVjX2luZm9fdGFibGVbaWR4XS5jb2RlYyA9IC0xOwotCQlhdWRwcC0+ZGVjX2luZm9fdGFibGVbaWR4XS5waWQgPSAwOwotCQlNTV9JTkZPKCJtb2R1bGVfbmFtZTolc1xuIiwKLQkJCWF1ZHBwLT5kZWNfZGF0YWJhc2UtPmRlY19pbmZvX2xpc3RbaWR4XS5tb2R1bGVfbmFtZSk7Ci0JCU1NX0lORk8oInF1ZXVlaWQ6JWRcbiIsCi0JCQlhdWRwcC0+ZGVjX2RhdGFiYXNlLT5kZWNfaW5mb19saXN0W2lkeF0ubW9kdWxlX3F1ZXVlaWQpOwotCQlNTV9JTkZPKCJkZWNpZDolZFxuIiwKLQkJCWF1ZHBwLT5kZWNfZGF0YWJhc2UtPmRlY19pbmZvX2xpc3RbaWR4XS5tb2R1bGVfZGVjaWQpOwotCQlNTV9JTkZPKCJucl9jb2RlY19zdXBwb3J0OiVkXG4iLAotCQkJYXVkcHAtPmRlY19kYXRhYmFzZS0+ZGVjX2luZm9fbGlzdFtpZHhdLgotCQkJbnJfY29kZWNfc3VwcG9ydCk7Ci0JfQotCi0Jd2FrZV9sb2NrX2luaXQoJmF1ZHBwX3dha2VfbG9jaywgV0FLRV9MT0NLX1NVU1BFTkQsICJhdWRwcCIpOwotCWZvciAoaWR4ID0gMDsgaWR4IDwgYXVkcHAtPmRlY19kYXRhYmFzZS0+bnVtX2RlYzsgaWR4KyspIHsKLQkJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2RlY29kZXJbaWR4XSk7Ci0JCWlmIChyYykKLQkJCWdvdG8gZXJyOwotCX0KLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfY29uY3VycmVuY3kpOwotCWF1ZHBwLT5vcF9tb2RlID0gMDsgLyogQ29uc2lkZXIgYXMgbm9uIHR1cmJvIG1vZGUgKi8KLQlpZiAocmMpCi0JCWdvdG8gZXJyOwotCWVsc2UKLQkJZ290byBkb25lOwotZXJyOgotCXdoaWxlIChpZHgtLSkKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9kZWNvZGVyW2lkeF0pOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF1ZHBwX3BsYXRfZHJpdmVyID0gewotCS5wcm9iZSA9IGF1ZHBwX3Byb2JlLAotCS5kcml2ZXIgPSB7Ci0JCSAgIC5uYW1lID0gIm1zbV9hZHNwZGVjIiwKLQkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCSAgIH0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRwcF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXVkcHBfcGxhdF9kcml2ZXIpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoYXVkcHBfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2F1ZHByZXByb2MuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkcHJlcHJvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGVlYWQwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXVkcHJlcHJvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLS8qCi0gKiBDb21tb24gY29kZSB0byBkZWFsIHdpdGggdGhlIEFVRFBSRVBST0MgZHNwIHRhc2sgKGF1ZGlvIHByZXByb2Nlc3NpbmcpCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIEJhc2VkIG9uIHRoZSBhdWRwcCBsYXllciBpbiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNS9hdWRwcC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2FjZGJpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZHByZXByb2MuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcHJlcHJvY21zZy5oPgotI2luY2x1ZGUgPG1hY2gvY3B1aWRsZS5oPgotCi1zdGF0aWMgREVGSU5FX01VVEVYKGF1ZHByZXByb2NfbG9jayk7Ci1zdGF0aWMgc3RydWN0IHdha2VfbG9jayBhdWRwcmVfd2FrZV9sb2NrOwotc3RhdGljIHN0cnVjdCBwbV9xb3NfcmVxdWVzdCBhdWRwcmVfcG1fcW9zX3JlcTsKLQotc3RydWN0IG1zbV9hZHNwZW5jX2luZm8gewotCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCXVuc2lnbmVkIG1vZHVsZV9xdWV1ZWlkczsKLQlpbnQgbW9kdWxlX2VuY2lkOyAvKiBzdHJlYW1pZCAqLwotCWludCBlbmNfZm9ybWF0czsgLyogc3VwcG9ydGVkIGZvcm1hdHMgKi8KLQlpbnQgbnJfY29kZWNfc3VwcG9ydDsgLyogbnVtYmVyIG9mIGNvZGVjIHN1cG9ydGVkICovCi19OwotCi0jZGVmaW5lIEVOQ19NT0RVTEVfSU5GTyhuYW1lLCBxdWV1ZWlkcywgZW5jaWQsIGZvcm1hdHMsIG5yX2NvZGVjKSBcCi0Jey5tb2R1bGVfbmFtZSA9IG5hbWUsIC5tb2R1bGVfcXVldWVpZHMgPSBxdWV1ZWlkcywgXAotCSAubW9kdWxlX2VuY2lkID0gZW5jaWQsIC5lbmNfZm9ybWF0cyA9IGZvcm1hdHMsIFwKLQkgLm5yX2NvZGVjX3N1cHBvcnQgPSBucl9jb2RlYyB9Ci0KLSNkZWZpbmUgTUFYX0VWRU5UX0NBTExCQUNLX0NMSUVOVFMgMQotCi0jZGVmaW5lIEVOQzBfRk9STUFUICgoMTw8TVNNX0FEU1BfRU5DX0NPREVDX1dBVil8IFwKLQkoMTw8TVNNX0FEU1BfRU5DX0NPREVDX1NCQykgfCAoMTw8TVNNX0FEU1BfRU5DX0NPREVDX0VYVF9XQVYpKQotCi0jZGVmaW5lIEVOQzFfRk9STUFUICgoMTw8TVNNX0FEU1BfRU5DX0NPREVDX1dBVil8IFwKLQkoMTw8TVNNX0FEU1BfRU5DX0NPREVDX0FBQykgfCAoMTw8TVNNX0FEU1BfRU5DX0NPREVDX0FNUk5CKSB8IFwKLQkoMTw8TVNNX0FEU1BfRU5DX0NPREVDX0VWUkMpIHwgKDE8PE1TTV9BRFNQX0VOQ19DT0RFQ19RQ0VMUCkgfCBcCi0JKDE8PE1TTV9BRFNQX0VOQ19DT0RFQ19FWFRfV0FWKSkKLQotI2RlZmluZSBFTkMyX0ZPUk1BVCAoKDE8PE1TTV9BRFNQX0VOQ19DT0RFQ19XQVYpIHwgXAotCSgxPDxNU01fQURTUF9FTkNfQ09ERUNfRVhUX1dBVikpCi0KLXN0cnVjdCBtc21fYWRzcGVuY19kYXRhYmFzZSB7Ci0JdW5zaWduZWQgbnVtX2VuYzsKLQlzdHJ1Y3QgbXNtX2Fkc3BlbmNfaW5mbyAqZW5jX2luZm9fbGlzdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2Fkc3BlbmNfaW5mbyBlbmNfaW5mb19saXN0W10gPSB7Ci0JRU5DX01PRFVMRV9JTkZPKCJBVURSRUMwVEFTSyIsIFwKLQkJCSgoUURTUF91UEF1ZFJlYzBCaXRTdHJlYW1RdWV1ZSA8PCAxNil8IFwKLQkJCSAgIFFEU1BfdVBBdWRSZWMwQ21kUXVldWUpLCAwLCBcCi0JCQkgKEVOQzBfRk9STUFUICB8ICgxIDw8IE1TTV9BRFNQX0VOQ19NT0RFX1RVTk5FTCkpLCAzKSwKLQotCUVOQ19NT0RVTEVfSU5GTygiQVVEUkVDMVRBU0siLCBcCi0JCQkgKChRRFNQX3VQQXVkUmVjMUJpdFN0cmVhbVF1ZXVlIDw8IDE2KXwgXAotCQkJICAgUURTUF91UEF1ZFJlYzFDbWRRdWV1ZSksIDEsIFwKLQkJCSAoRU5DMV9GT1JNQVQgfCAoMSA8PCBNU01fQURTUF9FTkNfTU9ERV9UVU5ORUwpIHwgXAotCQkJICAoMSA8PCBNU01fQURTUF9FTkNfTU9ERV9OT05fVFVOTkVMKSksIDYpLAotCi0JRU5DX01PRFVMRV9JTkZPKCJBVURSRUMyVEFTSyIsIFwKLQkJCSAoKFFEU1BfdVBBdWRSZWMyQml0U3RyZWFtUXVldWUgPDwgMTYpfCBcCi0JCQkgICBRRFNQX3VQQXVkUmVjMkNtZFF1ZXVlKSwgMiwgXAotCQkJIChFTkMyX0ZPUk1BVCAgfCAoMSA8PCBNU01fQURTUF9FTkNfTU9ERV9UVU5ORUwpKSwgMiksCi0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2Fkc3BlbmNfZGF0YWJhc2UgbXNtX2VuY19kYXRhYmFzZSA9IHsKLQkubnVtX2VuYyA9IEFSUkFZX1NJWkUoZW5jX2luZm9fbGlzdCksCi0JLmVuY19pbmZvX2xpc3QgPSBlbmNfaW5mb19saXN0LAotfTsKLQotCi1zdGF0aWMgc3RydWN0IGF1ZHJlY19zZXNzaW9uX2luZm8KLQkJc2Vzc2lvbl9pbmZvW01BWF9FTkNfQ09VTlRdID0geyB7MCwgMH0sIHswLCAwfSwgezAsIDB9IH07Ci0KLXN0cnVjdCBhdWRwcmVwcm9jX3N0YXRlIHsKLQlzdHJ1Y3QgbXNtX2Fkc3BfbW9kdWxlICptb2Q7Ci0JYXVkcHJlcHJvY19ldmVudF9mdW5jIGZ1bmNbTUFYX0VOQ19DT1VOVF07Ci0Jdm9pZCAqcHJpdmF0ZVtNQVhfRU5DX0NPVU5UXTsKLQlzdHJ1Y3QgbXV0ZXggKmxvY2s7Ci0JdW5zaWduZWQgb3Blbl9jb3VudDsKLQl1bnNpZ25lZCBlbmNfaW51c2U7Ci0Jc3RydWN0IGF1ZHByZXByb2NfZXZlbnRfY2FsbGJhY2sgKmNiX3RibFtNQVhfRVZFTlRfQ0FMTEJBQ0tfQ0xJRU5UU107Ci19OwotCi1zdGF0aWMgc3RydWN0IGF1ZHByZXByb2Nfc3RhdGUgdGhlX2F1ZHByZXByb2Nfc3RhdGUgPSB7Ci0JLmxvY2sgPSAmYXVkcHJlcHJvY19sb2NrLAotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIHByZXZlbnRfc3VzcGVuZCh2b2lkKQotewotCXdha2VfbG9jaygmYXVkcHJlX3dha2VfbG9jayk7Ci0JcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KCZhdWRwcmVfcG1fcW9zX3JlcSwKLQkJCSAgICAgIG1zbV9jcHVpZGxlX2dldF9kZWVwX2lkbGVfbGF0ZW5jeSgpKTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhbGxvd19zdXNwZW5kKHZvaWQpCi17Ci0JcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KCZhdWRwcmVfcG1fcW9zX3JlcSwgUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotCXdha2VfdW5sb2NrKCZhdWRwcmVfd2FrZV9sb2NrKTsKLX0KLQotLyogRFNQIHByZXByb2MgZXZlbnQgaGFuZGxlciAqLwotc3RhdGljIHZvaWQgYXVkcHJlcHJvY19kc3BfZXZlbnQodm9pZCAqZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCQkgICAgdm9pZCAoKmdldGV2ZW50KSh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXN0cnVjdCBhdWRwcmVwcm9jX3N0YXRlICphdWRwcmVwcm9jID0gZGF0YTsKLQlpbnQgbiA9IDA7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBVURQUkVQUk9DX0NNRF9DRkdfRE9ORV9NU0c6IHsKLQkJc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19kb25lX21zZyBjZmdfZG9uZV9tc2c7Ci0KLQkJZ2V0ZXZlbnQoJmNmZ19kb25lX21zZywgQVVEUFJFUFJPQ19DTURfQ0ZHX0RPTkVfTVNHX0xFTik7Ci0JCU1NX0RCRygiQVVEUFJFUFJPQ19DTURfQ0ZHX0RPTkVfTVNHOiBzdHJlYW0gaWQgJWQgcHJlcHJvYyBcCi0JCQl0eXBlICV4XG4iLCBjZmdfZG9uZV9tc2cuc3RyZWFtX2lkLCBcCi0JCQljZmdfZG9uZV9tc2cuYXVkX3ByZXByb2NfdHlwZSk7Ci0JCWlmICgoY2ZnX2RvbmVfbXNnLnN0cmVhbV9pZCA8IE1BWF9FTkNfQ09VTlQpICYmCi0JCQkJYXVkcHJlcHJvYy0+ZnVuY1tjZmdfZG9uZV9tc2cuc3RyZWFtX2lkXSkKLQkJCWF1ZHByZXByb2MtPmZ1bmNbY2ZnX2RvbmVfbXNnLnN0cmVhbV9pZF0oCi0JCQlhdWRwcmVwcm9jLT5wcml2YXRlW2NmZ19kb25lX21zZy5zdHJlYW1faWRdLCBpZCwKLQkJCSZjZmdfZG9uZV9tc2cpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURQUkVQUk9DX0VSUk9SX01TRzogewotCQlzdHJ1Y3QgYXVkcHJlcHJvY19lcnJfbXNnIGVycl9tc2c7Ci0KLQkJZ2V0ZXZlbnQoJmVycl9tc2csIEFVRFBSRVBST0NfRVJST1JfTVNHX0xFTik7Ci0JCU1NX0RCRygiQVVEUFJFUFJPQ19FUlJPUl9NU0c6IHN0cmVhbSBpZCAlZCBlcnIgaWR4ICVkXG4iLAotCQllcnJfbXNnLnN0cmVhbV9pZCwgZXJyX21zZy5hdWRfcHJlcHJvY19lcnJfaWR4KTsKLQkJaWYgKChlcnJfbXNnLnN0cmVhbV9pZCA8IE1BWF9FTkNfQ09VTlQpICYmCi0JCQkJYXVkcHJlcHJvYy0+ZnVuY1tlcnJfbXNnLnN0cmVhbV9pZF0pCi0JCQlhdWRwcmVwcm9jLT5mdW5jW2Vycl9tc2cuc3RyZWFtX2lkXSgKLQkJCWF1ZHByZXByb2MtPnByaXZhdGVbZXJyX21zZy5zdHJlYW1faWRdLCBpZCwKLQkJCSZlcnJfbXNnKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFJFUFJPQ19DTURfRU5DX0NGR19ET05FX01TRzogewotCQlzdHJ1Y3QgYXVkcHJlcHJvY19jbWRfZW5jX2NmZ19kb25lX21zZyBlbmNfY2ZnX21zZzsKLQotCQlnZXRldmVudCgmZW5jX2NmZ19tc2csIEFVRFBSRVBST0NfQ01EX0VOQ19DRkdfRE9ORV9NU0dfTEVOKTsKLQkJTU1fREJHKCJBVURQUkVQUk9DX0NNRF9FTkNfQ0ZHX0RPTkVfTVNHOiBzdHJlYW0gaWQgJWQgZW5jIHR5cGUgXAotCQkJJWRcbiIsIGVuY19jZmdfbXNnLnN0cmVhbV9pZCwgZW5jX2NmZ19tc2cucmVjX2VuY190eXBlKTsKLQkJaWYgKChlbmNfY2ZnX21zZy5zdHJlYW1faWQgPCBNQVhfRU5DX0NPVU5UKSAmJgotCQkJCWF1ZHByZXByb2MtPmZ1bmNbZW5jX2NmZ19tc2cuc3RyZWFtX2lkXSkKLQkJCWF1ZHByZXByb2MtPmZ1bmNbZW5jX2NmZ19tc2cuc3RyZWFtX2lkXSgKLQkJCWF1ZHByZXByb2MtPnByaXZhdGVbZW5jX2NmZ19tc2cuc3RyZWFtX2lkXSwgaWQsCi0JCQkmZW5jX2NmZ19tc2cpOwotCQlmb3IgKG4gPSAwOyBuIDwgTUFYX0VWRU5UX0NBTExCQUNLX0NMSUVOVFM7ICsrbikgewotCQkJaWYgKGF1ZHByZXByb2MtPmNiX3RibFtuXSAmJgotCQkJCQlhdWRwcmVwcm9jLT5jYl90Ymxbbl0tPmZuKSB7Ci0JCQkJYXVkcHJlcHJvYy0+Y2JfdGJsW25dLT5mbiggXAotCQkJCQlhdWRwcmVwcm9jLT5jYl90Ymxbbl0tPnByaXZhdGUsIFwKLQkJCQkJaWQsICh2b2lkICopICZlbmNfY2ZnX21zZyk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFJFUFJPQ19DTURfRU5DX1BBUkFNX0NGR19ET05FX01TRzogewotCQlzdHJ1Y3QgYXVkcHJlcHJvY19jbWRfZW5jX3BhcmFtX2NmZ19kb25lX21zZyBlbmNfcGFyYW1fbXNnOwotCi0JCWdldGV2ZW50KCZlbmNfcGFyYW1fbXNnLAotCQkJCUFVRFBSRVBST0NfQ01EX0VOQ19QQVJBTV9DRkdfRE9ORV9NU0dfTEVOKTsKLQkJTU1fREJHKCJBVURQUkVQUk9DX0NNRF9FTkNfUEFSQU1fQ0ZHX0RPTkVfTVNHOiBzdHJlYW0gaWQgJWRcbiIsCi0JCQkJIGVuY19wYXJhbV9tc2cuc3RyZWFtX2lkKTsKLQkJaWYgKChlbmNfcGFyYW1fbXNnLnN0cmVhbV9pZCA8IE1BWF9FTkNfQ09VTlQpICYmCi0JCQkJYXVkcHJlcHJvYy0+ZnVuY1tlbmNfcGFyYW1fbXNnLnN0cmVhbV9pZF0pCi0JCQlhdWRwcmVwcm9jLT5mdW5jW2VuY19wYXJhbV9tc2cuc3RyZWFtX2lkXSgKLQkJCWF1ZHByZXByb2MtPnByaXZhdGVbZW5jX3BhcmFtX21zZy5zdHJlYW1faWRdLCBpZCwKLQkJCSZlbmNfcGFyYW1fbXNnKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVEUFJFUFJPQ19BRkVfQ01EX0FVRElPX1JFQ09SRF9DRkdfRE9ORV9NU0c6IHsKLQkJc3RydWN0IGF1ZHByZXByb2NfYWZlX2NtZF9hdWRpb19yZWNvcmRfY2ZnX2RvbmUKLQkJCQkJCXJlY29yZF9jZmdfZG9uZTsKLQkJZ2V0ZXZlbnQoJnJlY29yZF9jZmdfZG9uZSwKLQkJCUFVRFBSRVBST0NfQUZFX0NNRF9BVURJT19SRUNPUkRfQ0ZHX0RPTkVfTVNHX0xFTik7Ci0JCU1NX0RCRygiQVVEUFJFUFJPQ19BRkVfQ01EX0FVRElPX1JFQ09SRF9DRkdfRE9ORV9NU0c6IFwKLQkJCXN0cmVhbSBpZCAlZFxuIiwgcmVjb3JkX2NmZ19kb25lLnN0cmVhbV9pZCk7Ci0JCWlmICgocmVjb3JkX2NmZ19kb25lLnN0cmVhbV9pZCA8IE1BWF9FTkNfQ09VTlQpICYmCi0JCQkJYXVkcHJlcHJvYy0+ZnVuY1tyZWNvcmRfY2ZnX2RvbmUuc3RyZWFtX2lkXSkKLQkJCWF1ZHByZXByb2MtPmZ1bmNbcmVjb3JkX2NmZ19kb25lLnN0cmVhbV9pZF0oCi0JCQlhdWRwcmVwcm9jLT5wcml2YXRlW3JlY29yZF9jZmdfZG9uZS5zdHJlYW1faWRdLCBpZCwKLQkJCSZyZWNvcmRfY2ZnX2RvbmUpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURQUkVQUk9DX0NNRF9ST1VUSU5HX01PREVfRE9ORV9NU0c6IHsKLQkJc3RydWN0IGF1ZHByZXByb2NfY21kX3JvdXRpbmdfbW9kZV9kb25lICByb3V0aW5nX21vZGVfZG9uZTsKLQotCQlnZXRldmVudCgmcm91dGluZ19tb2RlX2RvbmUsCi0JCQlBVURQUkVQUk9DX0NNRF9ST1VUSU5HX01PREVfRE9ORV9NU0dfTEVOKTsKLQkJTU1fREJHKCJBVURQUkVQUk9DX0NNRF9ST1VUSU5HX01PREVfRE9ORV9NU0c6IFwKLQkJCXN0cmVhbSBpZCAlZFxuIiwgcm91dGluZ19tb2RlX2RvbmUuc3RyZWFtX2lkKTsKLQkJaWYgKChyb3V0aW5nX21vZGVfZG9uZS5zdHJlYW1faWQgPCBNQVhfRU5DX0NPVU5UKSAmJgotCQkJCWF1ZHByZXByb2MtPmZ1bmNbcm91dGluZ19tb2RlX2RvbmUuc3RyZWFtX2lkXSkKLQkJCWF1ZHByZXByb2MtPmZ1bmNbcm91dGluZ19tb2RlX2RvbmUuc3RyZWFtX2lkXSgKLQkJCWF1ZHByZXByb2MtPnByaXZhdGVbcm91dGluZ19tb2RlX2RvbmUuc3RyZWFtX2lkXSwgaWQsCi0JCQkmcm91dGluZ19tb2RlX2RvbmUpOwotCQlicmVhazsKLQl9Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JY2FzZSBBVURQUkVQUk9DX01TR19GRUFUX1FVRVJZX0RNX0RPTkU6Ci0JICAgewotCSAgICB1aW50MTZfdCBtc2dbM107Ci0JICAgIGdldGV2ZW50KG1zZywgc2l6ZW9mKG1zZykpOwotCSAgICBNTV9JTkZPKCJSVEMgQUNLIC0tPiAleCAleCAleFxuIiwgbXNnWzBdLCBtc2dbMV0sIG1zZ1syXSk7Ci0JICAgIGFjZGJfcnRjX3NldF9lcnIobXNnWzJdKTsKLQkgICB9Ci0JYnJlYWs7Ci0jZW5kaWYKLQljYXNlIEFEU1BfTUVTU0FHRV9JRDogewotCQlNTV9EQkcoIlJlY2VpdmVkIEFEU1AgZXZlbnQ6bW9kdWxlIGF1ZHByZXByb2N0YXNrXG4iKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiVW5rbm93biBFdmVudCAlZFxuIiwgaWQpOwotCX0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2Fkc3Bfb3BzIGFkc3Bfb3BzID0gewotCS5ldmVudCA9IGF1ZHByZXByb2NfZHNwX2V2ZW50LAotfTsKLQotLyogRVhQT1JURUQgQVBJJ3MgKi8KLWludCBhdWRwcmVwcm9jX2VuYWJsZShpbnQgZW5jX2lkLCBhdWRwcmVwcm9jX2V2ZW50X2Z1bmMgZnVuYywgdm9pZCAqcHJpdmF0ZSkKLXsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19zdGF0ZSAqYXVkcHJlcHJvYyA9ICZ0aGVfYXVkcHJlcHJvY19zdGF0ZTsKLQlpbnQgcmVzID0gMDsKLQotCWlmIChlbmNfaWQgPCAwIHx8IGVuY19pZCA+IChNQVhfRU5DX0NPVU5UIC0gMSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jayhhdWRwcmVwcm9jLT5sb2NrKTsKLQlpZiAoYXVkcHJlcHJvYy0+ZnVuY1tlbmNfaWRdKSB7Ci0JCXJlcyA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JYXVkcHJlcHJvYy0+ZnVuY1tlbmNfaWRdID0gZnVuYzsKLQlhdWRwcmVwcm9jLT5wcml2YXRlW2VuY19pZF0gPSBwcml2YXRlOwotCi0JLyogRmlyc3QgY2xpZW50IHRvIGVuYWJsZSBwcmVwcm9jIHRhc2sgKi8KLQlpZiAoYXVkcHJlcHJvYy0+b3Blbl9jb3VudCsrID09IDApIHsKLQkJTU1fREJHKCJHZXQgQVVEUFJFUFJPQ1RBU0tcbiIpOwotCQlyZXMgPSBtc21fYWRzcF9nZXQoIkFVRFBSRVBST0NUQVNLIiwgJmF1ZHByZXByb2MtPm1vZCwKLQkJCQkmYWRzcF9vcHMsIGF1ZHByZXByb2MpOwotCQlpZiAocmVzIDwgMCkgewotCQkJTU1fRVJSKCJDYW4gbm90IGdldCBBVURQUkVQUk9DVEFTS1xuIik7Ci0JCQlhdWRwcmVwcm9jLT5vcGVuX2NvdW50ID0gMDsKLQkJCWF1ZHByZXByb2MtPmZ1bmNbZW5jX2lkXSA9IE5VTEw7Ci0JCQlhdWRwcmVwcm9jLT5wcml2YXRlW2VuY19pZF0gPSBOVUxMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJcHJldmVudF9zdXNwZW5kKCk7Ci0JCWlmIChtc21fYWRzcF9lbmFibGUoYXVkcHJlcHJvYy0+bW9kKSkgewotCQkJTU1fRVJSKCJDYW4gbm90IGVuYWJsZSBBVURQUkVQUk9DVEFTS1xuIik7Ci0JCQlhdWRwcmVwcm9jLT5vcGVuX2NvdW50ID0gMDsKLQkJCWF1ZHByZXByb2MtPmZ1bmNbZW5jX2lkXSA9IE5VTEw7Ci0JCQlhdWRwcmVwcm9jLT5wcml2YXRlW2VuY19pZF0gPSBOVUxMOwotCQkJbXNtX2Fkc3BfcHV0KGF1ZHByZXByb2MtPm1vZCk7Ci0JCQlhdWRwcmVwcm9jLT5tb2QgPSBOVUxMOwotCQkJcmVzID0gLUVOT0RFVjsKLQkJCWFsbG93X3N1c3BlbmQoKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCXJlcyA9IDA7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKGF1ZHByZXByb2MtPmxvY2spOwotCXJldHVybiByZXM7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHByZXByb2NfZW5hYmxlKTsKLQotaW50IGF1ZHByZXByb2NfdXBkYXRlX2F1ZHJlY19pbmZvKAotCQkJc3RydWN0IGF1ZHJlY19zZXNzaW9uX2luZm8gKmF1ZHJlY19zZXNzaW9uX2luZm8pCi17Ci0JaWYgKCFhdWRyZWNfc2Vzc2lvbl9pbmZvKSB7Ci0JCU1NX0VSUigiZXJyb3IgaW4gYXVkcmVjIHNlc3Npb24gaW5mbyBhZGRyZXNzXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChhdWRyZWNfc2Vzc2lvbl9pbmZvLT5zZXNzaW9uX2lkIDwgTUFYX0VOQ19DT1VOVCkgewotCQltZW1jcHkoJnNlc3Npb25faW5mb1thdWRyZWNfc2Vzc2lvbl9pbmZvLT5zZXNzaW9uX2lkXSwKLQkJCQlhdWRyZWNfc2Vzc2lvbl9pbmZvLAotCQkJCXNpemVvZihzdHJ1Y3QgYXVkcmVjX3Nlc3Npb25faW5mbykpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHByZXByb2NfdXBkYXRlX2F1ZHJlY19pbmZvKTsKLQotdm9pZCBhdWRwcmVwcm9jX2Rpc2FibGUoaW50IGVuY19pZCwgdm9pZCAqcHJpdmF0ZSkKLXsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19zdGF0ZSAqYXVkcHJlcHJvYyA9ICZ0aGVfYXVkcHJlcHJvY19zdGF0ZTsKLQotCWlmIChlbmNfaWQgPCAwIHx8IGVuY19pZCA+IChNQVhfRU5DX0NPVU5UIC0gMSkpCi0JCXJldHVybjsKLQotCW11dGV4X2xvY2soYXVkcHJlcHJvYy0+bG9jayk7Ci0JaWYgKCFhdWRwcmVwcm9jLT5mdW5jW2VuY19pZF0pCi0JCWdvdG8gb3V0OwotCWlmIChhdWRwcmVwcm9jLT5wcml2YXRlW2VuY19pZF0gIT0gcHJpdmF0ZSkKLQkJZ290byBvdXQ7Ci0KLQlhdWRwcmVwcm9jLT5mdW5jW2VuY19pZF0gPSBOVUxMOwotCWF1ZHByZXByb2MtPnByaXZhdGVbZW5jX2lkXSA9IE5VTEw7Ci0KLQkvKiBMYXN0IGNsaWVudCB0aGVuIGRpc2FibGUgcHJlcHJvYyB0YXNrICovCi0JaWYgKC0tYXVkcHJlcHJvYy0+b3Blbl9jb3VudCA9PSAwKSB7Ci0JCW1zbV9hZHNwX2Rpc2FibGUoYXVkcHJlcHJvYy0+bW9kKTsKLQkJTU1fREJHKCJQdXQgQVVEUFJFUFJPQ1RBU0tcbiIpOwotCQltc21fYWRzcF9wdXQoYXVkcHJlcHJvYy0+bW9kKTsKLQkJYXVkcHJlcHJvYy0+bW9kID0gTlVMTDsKLQkJYWxsb3dfc3VzcGVuZCgpOwotCX0KLW91dDoKLQltdXRleF91bmxvY2soYXVkcHJlcHJvYy0+bG9jayk7Ci0JcmV0dXJuOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcmVwcm9jX2Rpc2FibGUpOwotCi0KLWludCBhdWRwcmVwcm9jX3JlZ2lzdGVyX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBhdWRwcmVwcm9jX2V2ZW50X2NhbGxiYWNrICplY2IpCi17Ci0Jc3RydWN0IGF1ZHByZXByb2Nfc3RhdGUgKmF1ZHByZXByb2MgPSAmdGhlX2F1ZHByZXByb2Nfc3RhdGU7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0VWRU5UX0NBTExCQUNLX0NMSUVOVFM7ICsraSkgewotCQlpZiAoTlVMTCA9PSBhdWRwcmVwcm9jLT5jYl90YmxbaV0pIHsKLQkJCWF1ZHByZXByb2MtPmNiX3RibFtpXSA9IGVjYjsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCXJldHVybiAtMTsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcHJlcHJvY19yZWdpc3Rlcl9ldmVudF9jYWxsYmFjayk7Ci0KLWludCBhdWRwcmVwcm9jX3VucmVnaXN0ZXJfZXZlbnRfY2FsbGJhY2soc3RydWN0IGF1ZHByZXByb2NfZXZlbnRfY2FsbGJhY2sgKmVjYikKLXsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19zdGF0ZSAqYXVkcHJlcHJvYyA9ICZ0aGVfYXVkcHJlcHJvY19zdGF0ZTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfRVZFTlRfQ0FMTEJBQ0tfQ0xJRU5UUzsgKytpKSB7Ci0JCWlmIChlY2IgPT0gYXVkcHJlcHJvYy0+Y2JfdGJsW2ldKSB7Ci0JCQlhdWRwcmVwcm9jLT5jYl90YmxbaV0gPSBOVUxMOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIC0xOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcmVwcm9jX3VucmVnaXN0ZXJfZXZlbnRfY2FsbGJhY2spOwotCi0KLS8qIGVuY190eXBlID0gc3VwcG9ydGVkIGVuY29kZSBmb3JtYXQgKgotICogbGlrZSBwY20sIGFhYywgc2JjLCBldnJjLCBxY2VscCwgYW1ybmIgZXRjIC4uLiAqCi0gKi8KLWludCBhdWRwcmVwcm9jX2FlbmNfYWxsb2ModW5zaWduZWQgZW5jX3R5cGUsIGNvbnN0IGNoYXIgKiptb2R1bGVfbmFtZSwKLQkJICAgICB1bnNpZ25lZCAqcXVldWVfaWRzKQotewotCXN0cnVjdCBhdWRwcmVwcm9jX3N0YXRlICphdWRwcmVwcm9jID0gJnRoZV9hdWRwcmVwcm9jX3N0YXRlOwotCWludCBlbmNpZCA9IC0xLCBpZHgsIGxpZHgsIG1vZGUsIGNvZGVjOwotCWludCBjb2RlY3Nfc3VwcG9ydGVkLCBtaW5fY29kZWNzX3N1cHBvcnRlZDsKLQlzdGF0aWMgaW50IHdha2Vsb2NrX2luaXQ7Ci0KLQltdXRleF9sb2NrKGF1ZHByZXByb2MtPmxvY2spOwotCS8qIFJlcHJlc2VudHMgaW4gYml0IG1hc2sgKi8KLQltb2RlID0gKChlbmNfdHlwZSAmIEFVRFBSRVBST0NfTU9ERV9NQVNLKSA8PCAxNik7Ci0JY29kZWMgPSAoMSA8PCAoZW5jX3R5cGUgJiBBVURQUkVQUk9DX0NPREVDX01BU0spKTsKLQotCWxpZHggPSBtc21fZW5jX2RhdGFiYXNlLm51bV9lbmM7Ci0JbWluX2NvZGVjc19zdXBwb3J0ZWQgPSBzaXplb2YodW5zaWduZWQgaW50KSAqIDg7Ci0JTU1fREJHKCJtb2RlID0gMHglMDh4IGNvZGVjID0gMHglMDh4XG4iLCBtb2RlLCBjb2RlYyk7Ci0KLQlmb3IgKGlkeCA9IGxpZHgtMTsgaWR4ID49IDA7IGlkeC0tKSB7Ci0JCS8qIGVuY29kZXIgZnJlZSBhbmQgc3VwcG9ydHMgdGhlIGZvcm1hdCAqLwotCQlpZiAoIShhdWRwcmVwcm9jLT5lbmNfaW51c2UgJiAoMSA8PCAoaWR4KSkpICYmCi0JCSgobW9kZSAmIG1zbV9lbmNfZGF0YWJhc2UuZW5jX2luZm9fbGlzdFtpZHhdLmVuY19mb3JtYXRzKQotCQk9PSBtb2RlKSAmJiAoKGNvZGVjICYKLQkJbXNtX2VuY19kYXRhYmFzZS5lbmNfaW5mb19saXN0W2lkeF0uZW5jX2Zvcm1hdHMpCi0JCT09IGNvZGVjKSl7Ci0JCQkvKiBDaGVjayBzdXBwb3J0cyBtaW5pbXVtIG51bWJlciBjb2RlY3MgKi8KLQkJCWNvZGVjc19zdXBwb3J0ZWQgPQotCQkJbXNtX2VuY19kYXRhYmFzZS5lbmNfaW5mb19saXN0W2lkeF0ubnJfY29kZWNfc3VwcG9ydDsKLQkJCWlmIChjb2RlY3Nfc3VwcG9ydGVkIDwgbWluX2NvZGVjc19zdXBwb3J0ZWQpIHsKLQkJCQlsaWR4ID0gaWR4OwotCQkJCW1pbl9jb2RlY3Nfc3VwcG9ydGVkID0gY29kZWNzX3N1cHBvcnRlZDsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChsaWR4IDwgbXNtX2VuY19kYXRhYmFzZS5udW1fZW5jKSB7Ci0JCWF1ZHByZXByb2MtPmVuY19pbnVzZSB8PSAoMSA8PCBsaWR4KTsKLQkJKm1vZHVsZV9uYW1lID0KLQkJICAgIG1zbV9lbmNfZGF0YWJhc2UuZW5jX2luZm9fbGlzdFtsaWR4XS5tb2R1bGVfbmFtZTsKLQkJKnF1ZXVlX2lkcyA9Ci0JCSAgICBtc21fZW5jX2RhdGFiYXNlLmVuY19pbmZvX2xpc3RbbGlkeF0ubW9kdWxlX3F1ZXVlaWRzOwotCQllbmNpZCA9IG1zbV9lbmNfZGF0YWJhc2UuZW5jX2luZm9fbGlzdFtsaWR4XS5tb2R1bGVfZW5jaWQ7Ci0JfQotCi0JaWYgKCF3YWtlbG9ja19pbml0KSB7Ci0JCXdha2VfbG9ja19pbml0KCZhdWRwcmVfd2FrZV9sb2NrLCBXQUtFX0xPQ0tfU1VTUEVORCwgImF1ZHByZSIpOwotCQlwbV9xb3NfYWRkX3JlcXVlc3QoJmF1ZHByZV9wbV9xb3NfcmVxLCBQTV9RT1NfQ1BVX0RNQV9MQVRFTkNZLAotCQkJCQlQTV9RT1NfREVGQVVMVF9WQUxVRSk7Ci0JCXdha2Vsb2NrX2luaXQgPSAxOwotCX0KLQotCW11dGV4X3VubG9jayhhdWRwcmVwcm9jLT5sb2NrKTsKLQlyZXR1cm4gZW5jaWQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHByZXByb2NfYWVuY19hbGxvYyk7Ci0KLXZvaWQgYXVkcHJlcHJvY19hZW5jX2ZyZWUoaW50IGVuY19pZCkKLXsKLQlzdHJ1Y3QgYXVkcHJlcHJvY19zdGF0ZSAqYXVkcHJlcHJvYyA9ICZ0aGVfYXVkcHJlcHJvY19zdGF0ZTsKLQlpbnQgaWR4OwotCi0JbXV0ZXhfbG9jayhhdWRwcmVwcm9jLT5sb2NrKTsKLQlmb3IgKGlkeCA9IDA7IGlkeCA8IG1zbV9lbmNfZGF0YWJhc2UubnVtX2VuYzsgaWR4KyspIHsKLQkJaWYgKG1zbV9lbmNfZGF0YWJhc2UuZW5jX2luZm9fbGlzdFtpZHhdLm1vZHVsZV9lbmNpZCA9PQotCQkgICAgZW5jX2lkKSB7Ci0JCQlhdWRwcmVwcm9jLT5lbmNfaW51c2UgJj0gfigxIDw8IGlkeCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQltdXRleF91bmxvY2soYXVkcHJlcHJvYy0+bG9jayk7Ci0JcmV0dXJuOwotCi19Ci1FWFBPUlRfU1lNQk9MKGF1ZHByZXByb2NfYWVuY19mcmVlKTsKLQotaW50IGF1ZHByZXByb2Nfc2VuZF9wcmVwcm9jY21kcXVldWUodm9pZCAqY21kLCB1bnNpZ25lZCBsZW4pCi17Ci0JcmV0dXJuIG1zbV9hZHNwX3dyaXRlKHRoZV9hdWRwcmVwcm9jX3N0YXRlLm1vZCwKLQkJCQlRRFNQX3VQQXVkUHJlUHJvY0NtZFF1ZXVlLCBjbWQsIGxlbik7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHByZXByb2Nfc2VuZF9wcmVwcm9jY21kcXVldWUpOwotCi1pbnQgYXVkcHJlcHJvY19zZW5kX2F1ZHJlY2NtZHF1ZXVlKHZvaWQgKmNtZCwgdW5zaWduZWQgbGVuKQotewotCXJldHVybiBtc21fYWRzcF93cml0ZSh0aGVfYXVkcHJlcHJvY19zdGF0ZS5tb2QsCi0JCQkgICAgICBRRFNQX3VQQXVkUHJlUHJvY0F1ZFJlY0NtZFF1ZXVlLCBjbWQsIGxlbik7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHByZXByb2Nfc2VuZF9hdWRyZWNjbWRxdWV1ZSk7Ci0KLWludCBhdWRwcmVwcm9jX3NlbmRfYXVkcmVjMmNtZHF1ZXVlKHZvaWQgKmNtZCwgdW5zaWduZWQgbGVuKQotewotCXJldHVybiBtc21fYWRzcF93cml0ZSh0aGVfYXVkcHJlcHJvY19zdGF0ZS5tb2QsCi0JCQkgICAgICBRRFNQX3VQQXVkUmVjMkNtZFF1ZXVlLCBjbWQsIGxlbik7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHByZXByb2Nfc2VuZF9hdWRyZWMyY21kcXVldWUpOwotCi1pbnQgYXVkcHJlcHJvY19kc3Bfc2V0X2FnYyhzdHJ1Y3QgYXVkcHJlcHJvY19jbWRfY2ZnX2FnY19wYXJhbXMgKmFnYywKLQkJCQl1bnNpZ25lZCBsZW4pCi17Ci0JcmV0dXJuIG1zbV9hZHNwX3dyaXRlKHRoZV9hdWRwcmVwcm9jX3N0YXRlLm1vZCwKLQkJCQlRRFNQX3VQQXVkUHJlUHJvY0NtZFF1ZXVlLCBhZ2MsIGxlbik7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHByZXByb2NfZHNwX3NldF9hZ2MpOwotCi1pbnQgYXVkcHJlcHJvY19kc3Bfc2V0X2FnYzIoc3RydWN0IGF1ZHByZXByb2NfY21kX2NmZ19hZ2NfcGFyYW1zXzIgKmFnYzIsCi0JCQkJdW5zaWduZWQgbGVuKQotewotCXJldHVybiBtc21fYWRzcF93cml0ZSh0aGVfYXVkcHJlcHJvY19zdGF0ZS5tb2QsCi0JCQkJUURTUF91UEF1ZFByZVByb2NDbWRRdWV1ZSwgYWdjMiwgbGVuKTsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcHJlcHJvY19kc3Bfc2V0X2FnYzIpOwotCi1pbnQgYXVkcHJlcHJvY19kc3Bfc2V0X25zKHN0cnVjdCBhdWRwcmVwcm9jX2NtZF9jZmdfbnNfcGFyYW1zICpucywKLQkJCQl1bnNpZ25lZCBsZW4pCi17Ci0JcmV0dXJuIG1zbV9hZHNwX3dyaXRlKHRoZV9hdWRwcmVwcm9jX3N0YXRlLm1vZCwKLQkJCQlRRFNQX3VQQXVkUHJlUHJvY0NtZFF1ZXVlLCBucywgbGVuKTsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcHJlcHJvY19kc3Bfc2V0X25zKTsKLQotaW50IGF1ZHByZXByb2NfZHNwX3NldF9paXIoCi1zdHJ1Y3QgYXVkcHJlcHJvY19jbWRfY2ZnX2lpcl90dW5pbmdfZmlsdGVyX3BhcmFtcyAqaWlyLCB1bnNpZ25lZCBsZW4pCi17Ci0JcmV0dXJuIG1zbV9hZHNwX3dyaXRlKHRoZV9hdWRwcmVwcm9jX3N0YXRlLm1vZCwKLQkJCQlRRFNQX3VQQXVkUHJlUHJvY0NtZFF1ZXVlLCBpaXIsIGxlbik7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZHByZXByb2NfZHNwX3NldF9paXIpOwotCi1pbnQgYXVkcHJlcHJvY19kc3Bfc2V0X2dhaW5fdHgoCi0JCXN0cnVjdCBhdWRwcmVwcm9jX2NtZF9jZmdfY2FsX2dhaW4gKmNhbGliX2dhaW5fdHgsIHVuc2lnbmVkIGxlbikKLXsKLQlyZXR1cm4gbXNtX2Fkc3Bfd3JpdGUodGhlX2F1ZHByZXByb2Nfc3RhdGUubW9kLAotCQkJUURTUF91UEF1ZFByZVByb2NDbWRRdWV1ZSwgY2FsaWJfZ2Fpbl90eCwgbGVuKTsKLX0KLUVYUE9SVF9TWU1CT0woYXVkcHJlcHJvY19kc3Bfc2V0X2dhaW5fdHgpOwotCi12b2lkIGdldF9hdWRyZWNfc2Vzc2lvbl9pbmZvKGludCBpZCwgc3RydWN0IGF1ZHJlY19zZXNzaW9uX2luZm8gKmluZm8pCi17Ci0JaWYgKGlkID49IE1BWF9FTkNfQ09VTlQpIHsKLQkJTU1fRVJSKCJpbnZhbGlkIHNlc3Npb24gaWQgPSAlZFxuIiwgaWQpOwotCQlyZXR1cm47Ci0JfQotCW1lbWNweShpbmZvLCAmc2Vzc2lvbl9pbmZvW2lkXSwgc2l6ZW9mKHN0cnVjdCBhdWRyZWNfc2Vzc2lvbl9pbmZvKSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGdldF9hdWRyZWNfc2Vzc2lvbl9pbmZvKTsKLQotaW50IGF1ZHByZXByb2NfZHNwX3NldF9sdm52KAotCXN0cnVjdCBhdWRwcmVwcm9jX2NtZF9jZmdfbHZudl9wYXJhbSAqcHJlcHJvY19sdm52LCB1bnNpZ25lZCBsZW4pCi17Ci0JcmV0dXJuIG1zbV9hZHNwX3dyaXRlKHRoZV9hdWRwcmVwcm9jX3N0YXRlLm1vZCwKLQkJUURTUF91UEF1ZFByZVByb2NDbWRRdWV1ZSwgcHJlcHJvY19sdm52LCBsZW4pOwotfQotRVhQT1JUX1NZTUJPTChhdWRwcmVwcm9jX2RzcF9zZXRfbHZudik7Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvYXV4X3BjbS5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdXhfcGNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MzE4YmMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9hdXhfcGNtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXV4X3BjbS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogZGVmaW5lIG9mZnNldCBvZiByZWdpc3RlcnMgaGVyZSwgbWF5IHB1dCB0aGVtIGludG8gcGxhdGZvcm0gZGF0YSAqLwotI2RlZmluZSBBVVhfQ09ERUNfQ1RMX09GRlNFVCAweDAwCi0jZGVmaW5lIFBDTV9QQVRIX0NUTF9PRkZTRVQgMHgwNAotI2RlZmluZSBBVVhfQ09ERUNfQ1RMX09VVF9PRkZTRVQgMHgwOAotCi0vKiBkZWZpbmUgc29tZSBiaXQgdmFsdWVzIGluIFBDTV9QQVRIX0NUTCByZWdpc3RlciAqLwotI2RlZmluZSBQQ01fUEFUSF9DVExfX0FEU1BfQ1RMX0VOX0JNU0sgMHg4Ci0KLS8qIG1hc2sgYW5kIHNoaWZ0ICovCi0jZGVmaW5lIEFVWF9DT0RFQ19DVExfQURTUF9DT0RFQ19DVExfRU5fQk1TSyAweDgwMAotI2RlZmluZSBBVVhfQ09ERUNfQ1RMX1BDTV9TWU5DX0xPTkdfQk1TSyAweDQwMAotI2RlZmluZSBBVVhfQ09ERUNfQ1RMX1BDTV9TWU5DX1NIT1JUX0JNU0sgMHgyMDAKLSNkZWZpbmUgQVVYX0NPREVDX0NUTF9JMlNfU0FNUExFX0NMS19TUkNfQk1TSyAweDgwCi0jZGVmaW5lIEFVWF9DT0RFQ19DVExfSTJTX1NBTVBMRV9DTEtfTU9ERV9CTVNLIDB4NDAKLSNkZWZpbmUgQVVYX0NPREVDX0NUTF9JMlNfUlhfTU9ERV9CTVNLIDB4MjAKLSNkZWZpbmUgQVVYX0NPREVDX0NUTF9JMlNfQ0xLX01PREVfQk1TSyAweDEwCi0jZGVmaW5lIEFVWF9DT0RFQ19DVExfQVVYX1BDTV9NT0RFX0JNU0sgMHgwYgotI2RlZmluZSBBVVhfQ09ERUNfQ1RMX0FVWF9DT0RFQ19NT0RFX0JNU0sgMHgwMgotCi0vKiBBVVggUENNIE1PREUgKi8KLSNkZWZpbmUgTUFTVEVSX1BSSU1fUENNX1NIT1JUIDAKLSNkZWZpbmUgTUFTVEVSX0FVWF9QQ01fTE9ORyAxCi0jZGVmaW5lIFNMQVZFX1BSSU1fUENNX1NIT1JUIDIKLQotc3RydWN0IGF1eF9wY21fc3RhdGUgewotCXZvaWQgX19pb21lbSAqYXV4X3BjbV9iYXNlOyAgLyogY29uZmlndXJlIGF1eCBwY20gdGhyb3VnaCBTY29ycGlvbiAqLwotCWludCAgICAgZG91dDsKLQlpbnQgICAgIGRpbjsKLQlpbnQgICAgIHN5bmNvdXQ7Ci0JaW50ICAgICBjbGtpbl9hOwotfTsKLQotc3RhdGljIHN0cnVjdCBhdXhfcGNtX3N0YXRlIHRoZV9hdXhfcGNtX3N0YXRlOwotCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpnZXRfYmFzZV9hZGRyKHN0cnVjdCBhdXhfcGNtX3N0YXRlICphdXhfcGNtKQotewotCXJldHVybiBhdXhfcGNtLT5hdXhfcGNtX2Jhc2U7Ci19Ci0KLS8qIFNldCB3aG8gY29udHJvbCBhdXggcGNtIDogYWRzcCBvciBNU00gKi8KLXZvaWQgYXV4X2NvZGVjX2Fkc3BfY29kZWNfY3RsX2VuKGJvb2wgbXNtX2Fkc3BfZW4pCi17Ci0Jdm9pZCBfX2lvbWVtICpiYWRkciA9IGdldF9iYXNlX2FkZHIoJnRoZV9hdXhfcGNtX3N0YXRlKTsKLQl1aW50MzJfdCB2YWw7Ci0KLQlpZiAoIUlTX0VSUihiYWRkcikpIHsKLQkJdmFsID0gcmVhZGwoYmFkZHIgKyBBVVhfQ09ERUNfQ1RMX09GRlNFVCk7Ci0JCWlmIChtc21fYWRzcF9lbikgeyAvKiBhZHNwICovCi0JCQl3cml0ZWwoCi0JCQkoKHZhbCAmIH5BVVhfQ09ERUNfQ1RMX0FEU1BfQ09ERUNfQ1RMX0VOX0JNU0spIHwKLQkJCUFVWF9DT0RFQ19DVExfX0FEU1BfQ09ERUNfQ1RMX0VOX19BRFNQX1YpLAotCQkJYmFkZHIgKyBBVVhfQ09ERUNfQ1RMX09GRlNFVCk7Ci0JCX0gZWxzZSB7IC8qIE1TTSAqLwotCQkJd3JpdGVsKAotCQkJKCh2YWwgJiB+QVVYX0NPREVDX0NUTF9BRFNQX0NPREVDX0NUTF9FTl9CTVNLKSB8Ci0JCQlBVVhfQ09ERUNfQ1RMX19BRFNQX0NPREVDX0NUTF9FTl9fTVNNX1YpLAotCQkJYmFkZHIgKyBBVVhfQ09ERUNfQ1RMX09GRlNFVCk7Ci0JCX0KLQl9Ci0JbWIoKTsKLX0KLQotLyogU2V0IHdobyBjb250cm9sIGF1eCBwY20gcGF0aDogYWRzcCBvciBNU00gKi8KLXZvaWQgYXV4X2NvZGVjX3BjbV9wYXRoX2N0bF9lbihib29sIG1zbV9hZHNwX2VuKQotewotCXZvaWQgX19pb21lbSAqYmFkZHIgPSBnZXRfYmFzZV9hZGRyKCZ0aGVfYXV4X3BjbV9zdGF0ZSk7Ci0JdWludDMyX3QgdmFsOwotCi0JIGlmICghSVNfRVJSKGJhZGRyKSkgewotCQl2YWwgPSByZWFkbChiYWRkciArIFBDTV9QQVRIX0NUTF9PRkZTRVQpOwotCQlpZiAobXNtX2Fkc3BfZW4pIHsgLyogYWRzcCAqLwotCQkJd3JpdGVsKAotCQkJKCh2YWwgJiB+UENNX1BBVEhfQ1RMX19BRFNQX0NUTF9FTl9CTVNLKSB8Ci0JCQlQQ01fUEFUSF9DVExfX0FEU1BfQ1RMX0VOX19BRFNQX1YpLAotCQkJYmFkZHIgKyBQQ01fUEFUSF9DVExfT0ZGU0VUKTsKLQkJfSBlbHNlIHsgLyogTVNNICovCi0JCQl3cml0ZWwoCi0JCQkoKHZhbCAmIH5QQ01fUEFUSF9DVExfX0FEU1BfQ1RMX0VOX0JNU0spIHwKLQkJCVBDTV9QQVRIX0NUTF9fQURTUF9DVExfRU5fX01TTV9WKSwKLQkJCWJhZGRyICsgUENNX1BBVEhfQ1RMX09GRlNFVCk7Ci0JCX0KLQl9Ci0JbWIoKTsKLQlyZXR1cm47Ci19Ci1FWFBPUlRfU1lNQk9MKGF1eF9jb2RlY19wY21fcGF0aF9jdGxfZW4pOwotCi1pbnQgYXV4X3BjbV9ncGlvc19yZXF1ZXN0KHZvaWQpCi17Ci0JaW50IHJjID0gMDsKLQotCU1NX0RCRygiYXV4X3BjbV9ncGlvc19yZXF1ZXN0XG4iKTsKLQlyYyA9IGdwaW9fcmVxdWVzdCh0aGVfYXV4X3BjbV9zdGF0ZS5kb3V0LCAiQVVYIFBDTSBET1VUIik7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiR1BJTyByZXF1ZXN0IGZvciBBVVggUENNIERPVVQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXJjID0gZ3Bpb19yZXF1ZXN0KHRoZV9hdXhfcGNtX3N0YXRlLmRpbiwgIkFVWCBQQ00gRElOIik7Ci0JaWYgKHJjKSB7Ci0JCU1NX0VSUigiR1BJTyByZXF1ZXN0IGZvciBBVVggUENNIERJTiBmYWlsZWRcbiIpOwotCQlncGlvX2ZyZWUodGhlX2F1eF9wY21fc3RhdGUuZG91dCk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IGdwaW9fcmVxdWVzdCh0aGVfYXV4X3BjbV9zdGF0ZS5zeW5jb3V0LCAiQVVYIFBDTSBTWU5DIE9VVCIpOwotCWlmIChyYykgewotCQlNTV9FUlIoIkdQSU8gcmVxdWVzdCBmb3IgQVVYIFBDTSBTWU5DIE9VVCBmYWlsZWRcbiIpOwotCQlncGlvX2ZyZWUodGhlX2F1eF9wY21fc3RhdGUuZG91dCk7Ci0JCWdwaW9fZnJlZSh0aGVfYXV4X3BjbV9zdGF0ZS5kaW4pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBncGlvX3JlcXVlc3QodGhlX2F1eF9wY21fc3RhdGUuY2xraW5fYSwgIkFVWCBQQ00gQ0xLSU4gQSIpOwotCWlmIChyYykgewotCQlNTV9FUlIoIkdQSU8gcmVxdWVzdCBmb3IgQVVYIFBDTSBDTEtJTiBBIGZhaWxlZFxuIik7Ci0JCWdwaW9fZnJlZSh0aGVfYXV4X3BjbV9zdGF0ZS5kb3V0KTsKLQkJZ3Bpb19mcmVlKHRoZV9hdXhfcGNtX3N0YXRlLmRpbik7Ci0JCWdwaW9fZnJlZSh0aGVfYXV4X3BjbV9zdGF0ZS5zeW5jb3V0KTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0woYXV4X3BjbV9ncGlvc19yZXF1ZXN0KTsKLQotCi12b2lkIGF1eF9wY21fZ3Bpb3NfZnJlZSh2b2lkKQotewotCU1NX0RCRygiIGF1eF9wY21fZ3Bpb3NfZnJlZSBcbiIpOwotCi0JLyoKLQkgKiBGZWVkIHNpbGVuY2UgZnJhbWVzIGJlZm9yZSBjbG9zZSB0byBwcmV2ZW50IGJ1enppbmcgc291bmQgaW4gQlQgYXQKLQkgKiBjYWxsIGVuZC4gVGhpcyBmaXggaXMgYXBwbGljYWJsZSBvbmx5IHRvIE1hcmltYmEgQlQuCi0JICovCi0JZ3Bpb190bG1tX2NvbmZpZyhHUElPX0NGRyh0aGVfYXV4X3BjbV9zdGF0ZS5kb3V0LCAwLCBHUElPX0NGR19PVVRQVVQsCi0JCUdQSU9fQ0ZHX05PX1BVTEwsIEdQSU9fQ0ZHXzJNQSksIEdQSU9fQ0ZHX0VOQUJMRSk7Ci0JZ3Bpb19zZXRfdmFsdWUodGhlX2F1eF9wY21fc3RhdGUuZG91dCwgMCk7Ci0JbXNsZWVwKDIwKTsKLQlncGlvX3RsbW1fY29uZmlnKEdQSU9fQ0ZHKHRoZV9hdXhfcGNtX3N0YXRlLmRvdXQsIDEsIEdQSU9fQ0ZHX09VVFBVVCwKLQkJR1BJT19DRkdfTk9fUFVMTCwgR1BJT19DRkdfMk1BKSwgR1BJT19DRkdfRU5BQkxFKTsKLQotCWdwaW9fZnJlZSh0aGVfYXV4X3BjbV9zdGF0ZS5kb3V0KTsKLQlncGlvX2ZyZWUodGhlX2F1eF9wY21fc3RhdGUuZGluKTsKLQlncGlvX2ZyZWUodGhlX2F1eF9wY21fc3RhdGUuc3luY291dCk7Ci0JZ3Bpb19mcmVlKHRoZV9hdXhfcGNtX3N0YXRlLmNsa2luX2EpOwotfQotRVhQT1JUX1NZTUJPTChhdXhfcGNtX2dwaW9zX2ZyZWUpOwotCi0KLXN0YXRpYyBpbnQgZ2V0X2F1eF9wY21fZ3Bpb3Moc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCByZXNvdXJjZSAgICAgICAgICpyZXM7Ci0KLQkvKiBDbGFpbSBhbGwgb2YgdGhlIEdQSU9zLiAqLwotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9JTywKLQkJCQkJImF1eF9wY21fZG91dCIpOwotCWlmICAoIXJlcykgewotCQlNTV9FUlIoIiVzOiBmYWlsZWQgdG8gZ2V0IGdwaW8gQVVYIFBDTSBET1VUXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXRoZV9hdXhfcGNtX3N0YXRlLmRvdXQgPSByZXMtPnN0YXJ0OwotCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX0lPLAotCQkJCQkiYXV4X3BjbV9kaW4iKTsKLQlpZiAgKCFyZXMpIHsKLQkJTU1fRVJSKCIlczogZmFpbGVkIHRvIGdldCBncGlvIEFVWCBQQ00gRElOXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXRoZV9hdXhfcGNtX3N0YXRlLmRpbiA9IHJlcy0+c3RhcnQ7Ci0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfSU8sCi0JCQkJCSJhdXhfcGNtX3N5bmNvdXQiKTsKLQlpZiAgKCFyZXMpIHsKLQkJTU1fRVJSKCIlczogZmFpbGVkIHRvIGdldCBncGlvIEFVWCBQQ00gU1lOQyBPVVRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JdGhlX2F1eF9wY21fc3RhdGUuc3luY291dCA9IHJlcy0+c3RhcnQ7Ci0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfSU8sCi0JCQkJCSJhdXhfcGNtX2Nsa2luX2EiKTsKLQlpZiAgKCFyZXMpIHsKLQkJTU1fRVJSKCIlczogZmFpbGVkIHRvIGdldCBncGlvIEFVWCBQQ00gQ0xLSU4gQVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQl0aGVfYXV4X3BjbV9zdGF0ZS5jbGtpbl9hID0gcmVzLT5zdGFydDsKLQotCXJldHVybiByYzsKLX0KLXN0YXRpYyBpbnQgYXV4X3BjbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHJlc291cmNlICptZW1fc3JjOwotCi0JTU1fREJHKCJhdXhfcGNtX3Byb2JlIFxuIik7Ci0JbWVtX3NyYyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQkJCQkiYXV4X2NvZGVjX3JlZ19hZGRyIik7Ci0JaWYgKCFtZW1fc3JjKSB7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQotCXRoZV9hdXhfcGNtX3N0YXRlLmF1eF9wY21fYmFzZSA9IGlvcmVtYXAobWVtX3NyYy0+c3RhcnQsCi0JCShtZW1fc3JjLT5lbmQgLSBtZW1fc3JjLT5zdGFydCkgKyAxKTsKLQlpZiAoIXRoZV9hdXhfcGNtX3N0YXRlLmF1eF9wY21fYmFzZSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcmMgPSBnZXRfYXV4X3BjbV9ncGlvcyhwZGV2KTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJHUElPIGNvbmZpZ3VyYXRpb24gZmFpbGVkXG4iKTsKLQkJcmMgPSAtRU5PREVWOwotCX0KLQotZG9uZToJcmV0dXJuIHJjOwotCi19Ci0KLXN0YXRpYyBpbnQgYXV4X3BjbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpb3VubWFwKHRoZV9hdXhfcGNtX3N0YXRlLmF1eF9wY21fYmFzZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF1eF9wY21fZHJpdmVyID0gewotCS5wcm9iZSA9IGF1eF9wY21fcHJvYmUsCi0JLnJlbW92ZSA9IGF1eF9wY21fcmVtb3ZlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm1zbV9hdXhfcGNtIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1eF9wY21faW5pdCh2b2lkKQotewotCi0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXV4X3BjbV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXV4X3BjbV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF1eF9wY21fZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoYXV4X3BjbV9pbml0KTsKLW1vZHVsZV9leGl0KGF1eF9wY21fZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIEFVWCBQQ00gZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2xwYS5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9scGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmZGE4YS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL2xwYS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOS0yMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9scGEuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvbHBhX2h3Lmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL21zbV9scGEuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLSNkZWZpbmUgTFBBX1JFR19XUklURUwoZHJ2LCB2YWwsIHJlZykgIHdyaXRlbCh2YWwsIGRydi0+YmFzZWFkZHIgKyByZWcpCi0jZGVmaW5lIExQQV9SRUdfUkVBREwoZHJ2LCByZWcpICByZWFkbChkcnYtPmJhc2VhZGRyICsgcmVnKQotCi0vKiBiaXQgMjowIGlzIHJlc2VydmVkIGJlY2F1c2Ugd2F0ZXJtYXJrcyBoYXZlIHRvIGJlIDY0LWJpdCBhbGlnbmVkICovCi0jZGVmaW5lIExMQl9XQVRFUk1BUktfVkFMX01BU0sgMHgwMDAwMDAwMwotCi0jZGVmaW5lIExQQV9TVEFUVVNfU0JVRl9FTiAweDAxCi0KLXN0cnVjdCBscGFfZHJ2IHsKLQl2b2lkIF9faW9tZW0gKmJhc2VhZGRyOwotCXUzMiBvYnVmX2hsYl9zaXplOwotCXUzMiBkc3BfcHJvY19pZDsKLQl1MzIgYXBwX3Byb2NfaWQ7Ci0Jc3RydWN0IGxwYV9tZW1fY29uZmlnIG5vc2JfY29uZmlnOwotCXN0cnVjdCBscGFfbWVtX2NvbmZpZyBzYl9jb25maWc7Ci0JdTMyIHN0YXR1czsKLQl1MzIgd2F0ZXJtYXJrX2J5dGVzOwotCXUzMiB3YXRlcm1hcmtfYWhlYWR0aW1lOwotCXUzMiBzYW1wbGVfYm91bmRhcnk7Ci19OwotCi1zdHJ1Y3QgbHBhX3N0YXRlIHsKLQlzdHJ1Y3QgbHBhX2RydiBscGFfZHJ2OyAvKiBPbmUgaW5zdGFuY2UgZm9yIG5vdyAqLwotCXUzMiBhc3NpZ25lZDsKLQlzdHJ1Y3QgbXV0ZXggbHBhX2xvY2s7Ci19OwotCi1zdHJ1Y3QgbHBhX3N0YXRlIHRoZV9scGFfc3RhdGU7Ci0KLXN0YXRpYyB2b2lkIGxwYV9lbmFibGVfY29kZWMoc3RydWN0IGxwYV9kcnYgKmxwYSwgYm9vbCBlbmFibGUpCi17Ci0JdTMyIHZhbDsKLQotCXZhbCA9IExQQV9SRUdfUkVBREwobHBhLCBMUEFfT0JVRl9DT0RFQyk7Ci0JdmFsID0gZW5hYmxlID8gKHZhbCB8IExQQV9PQlVGX0NPREVDX0NPREVDX0lOVEZfRU5fQk1TSykgOgotCQkodmFsICYgfkxQQV9PQlVGX0NPREVDX0NPREVDX0lOVEZfRU5fQk1TSyk7Ci0JdmFsIHw9IExQQV9PQlVGX0NPREVDX0xPQURfQk1TSzsKLQlMUEFfUkVHX1dSSVRFTChscGEsIHZhbCwgTFBBX09CVUZfQ09ERUMpOwotCW1iKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxwYV9yZXNldChzdHJ1Y3QgbHBhX2RydiAqbHBhKQotewotCXUzMiBzdGF0dXM7Ci0Jc3RydWN0IGNsayAqYWRzcF9jbGs7Ci0JLyogTmVlZCB0byBtYWtlIHN1cmUgbm90IGRpc2FibGUgY2xvY2sgd2hpbGUgb3RoZXIgZGV2aWNlIGlzIGVuYWJsZWQgKi8KLQlhZHNwX2NsayA9IGNsa19nZXQoTlVMTCwgImFkc3BfY2xrIik7Ci0JaWYgKCFhZHNwX2NsaykgewotCQlNTV9FUlIoImZhaWxlZCB0byBnZXQgYWRzcCBjbGtcbiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQljbGtfcHJlcGFyZV9lbmFibGUoYWRzcF9jbGspOwotCWxwYV9lbmFibGVfY29kZWMobHBhLCAwKTsKLQlMUEFfUkVHX1dSSVRFTChscGEsIChMUEFfT0JVRl9SRVNFVFNfTUlTUl9SRVNFVCB8Ci0JCUxQQV9PQlVGX1JFU0VUU19PVkVSQUxMX1JFU0VUKSwgTFBBX09CVUZfUkVTRVRTKTsKLQlkbyB7Ci0JCXN0YXR1cyA9IExQQV9SRUdfUkVBREwobHBhLCBMUEFfT0JVRl9TVEFUVVMpOwotCX0gd2hpbGUgKCEoc3RhdHVzICYgTFBBX09CVUZfU1RBVFVTX1JFU0VUX0RPTkUpKTsKLQotCUxQQV9SRUdfV1JJVEVMKGxwYSwgTFBBX09CVUZfQUNLX1JFU0VUX0RPTkVfQk1TSywgTFBBX09CVUZfQUNLKTsKLQltYigpOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShhZHNwX2Nsayk7Ci0JY2xrX3B1dChhZHNwX2Nsayk7Ci1lcnJvcjoKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGxwYV9jb25maWdfaGxiX2FkZHIoc3RydWN0IGxwYV9kcnYgKmxwYSkKLXsKLQl1MzIgdmFsLCBtaW5fYWRkciA9IDAsIG1heF9hZGRyID0gbWluX2FkZHIgKyBscGEtPm9idWZfaGxiX3NpemU7Ci0KLQl2YWwgPSAobWluX2FkZHIgJiBMUEFfT0JVRl9ITEJfTUlOX0FERFJfU0VHX0JNU0spIHwKLQlMUEFfT0JVRl9ITEJfTUlOX0FERFJfTE9BRF9CTVNLOwotCUxQQV9SRUdfV1JJVEVMKGxwYSwgdmFsLCBMUEFfT0JVRl9ITEJfTUlOX0FERFIpOwotCXZhbCA9IG1heF9hZGRyICYgTFBBX09CVUZfSExCX01BWF9BRERSX1NFR19CTVNLOwotCUxQQV9SRUdfV1JJVEVMKGxwYSwgdmFsLCBMUEFfT0JVRl9ITEJfTUFYX0FERFIpOwotfQotCi1zdGF0aWMgdm9pZCBscGFfcG93ZXJ1cF9tZW1fYmFuayhzdHJ1Y3QgbHBhX2RydiAqbHBhLAotCXN0cnVjdCBscGFfbWVtX2Jhbmtfc2VsZWN0ICpiYW5rKQotewotCXUzMiBzdGF0dXMsIHZhbDsKLQotCXN0YXR1cyA9IExQQV9SRUdfUkVBREwobHBhLCBMUEFfT0JVRl9NRU1PUllfQ09OVFJPTCk7Ci0JdmFsID0gKCgqKCh1MzIgKikgYmFuaykpIDw8IExQQV9PQlVGX01FTV9DVExfUFdSVVBfU0hGVCkgJgotCUxQQV9PQlVGX01FTV9DVExfUFdSVVBfQk1TSzsKLQl2YWwgfD0gc3RhdHVzOwotCUxQQV9SRUdfV1JJVEVMKGxwYSwgdmFsLCBMUEFfT0JVRl9NRU1PUllfQ09OVFJPTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxwYV9lbmFibGVfaW50ZXJydXB0KHN0cnVjdCBscGFfZHJ2ICpscGEsIHUzMiBwcm9jX2lkKQotewotCXUzMiB2YWw7Ci0KLQlwcm9jX2lkICY9IExQQV9PQlVGX0lOVFJfRU5fQk1TSzsKLQl2YWwgPSAweDEgPDwgcHJvY19pZDsKLQlMUEFfUkVHX1dSSVRFTChscGEsIHZhbCwgTFBBX09CVUZfSU5UUl9FTkFCTEUpOwotfQotCi1zdGF0aWMgdm9pZCBscGFfY29uZmlnX2xsYl9hZGRyKHN0cnVjdCBscGFfZHJ2ICpscGEsIHUzMiBtaW5fYWRkciwgdTMyIG1heF9hZGRyKQotewotCXUzMiB2YWw7Ci0KLQl2YWwgPSAobWluX2FkZHIgJiBMUEFfT0JVRl9MTEJfTUlOX0FERFJfU0VHX0JNU0spIHwKLQlMUEFfT0JVRl9MTEJfTUlOX0FERFJfTE9BRF9CTVNLOwotCUxQQV9SRUdfV1JJVEVMKGxwYSwgdmFsLCBMUEFfT0JVRl9MTEJfTUlOX0FERFIpOwotCXZhbCA9IG1heF9hZGRyICYgTFBBX09CVUZfTExCX01BWF9BRERSX1NFR19CTVNLOwotCUxQQV9SRUdfV1JJVEVMKGxwYSwgdmFsLCBMUEFfT0JVRl9MTEJfTUFYX0FERFIpOwotfQotCi1zdGF0aWMgdm9pZCBscGFfY29uZmlnX3NiX2FkZHIoc3RydWN0IGxwYV9kcnYgKmxwYSwgdTMyIG1pbl9hZGRyLCB1MzIgbWF4X2FkZHIpCi17Ci0JdTMyIHZhbDsKLQotCXZhbCA9IChtaW5fYWRkciAmIExQQV9PQlVGX1NCX01JTl9BRERSX1NFR19CTVNLKSB8Ci0JTFBBX09CVUZfU0JfTUlOX0FERFJfTE9BRF9CTVNLOwotCUxQQV9SRUdfV1JJVEVMKGxwYSwgdmFsLCBMUEFfT0JVRl9TQl9NSU5fQUREUik7Ci0JdmFsID0gbWF4X2FkZHIgJiBMUEFfT0JVRl9TQl9NQVhfQUREUl9TRUdfQk1TSzsKLQlMUEFfUkVHX1dSSVRFTChscGEsIHZhbCwgTFBBX09CVUZfU0JfTUFYX0FERFIpOwotfQotCi1zdGF0aWMgdm9pZCBscGFfc3dpdGNoX3NiKHN0cnVjdCBscGFfZHJ2ICpscGEpCi17Ci0JaWYgKGxwYS0+c3RhdHVzICYgTFBBX1NUQVRVU19TQlVGX0VOKSB7Ci0JCWxwYV9jb25maWdfbGxiX2FkZHIobHBhLCBscGEtPnNiX2NvbmZpZy5sbGJfbWluX2FkZHIsCi0JCWxwYS0+c2JfY29uZmlnLmxsYl9tYXhfYWRkcik7Ci0JCWxwYV9jb25maWdfc2JfYWRkcihscGEsIGxwYS0+c2JfY29uZmlnLnNiX21pbl9hZGRyLAotCQlscGEtPnNiX2NvbmZpZy5zYl9tYXhfYWRkcik7Ci0JfSBlbHNlIHsKLQkJbHBhX2NvbmZpZ19sbGJfYWRkcihscGEsIGxwYS0+bm9zYl9jb25maWcubGxiX21pbl9hZGRyLAotCQlscGEtPm5vc2JfY29uZmlnLmxsYl9tYXhfYWRkcik7Ci0JCWxwYV9jb25maWdfc2JfYWRkcihscGEsIGxwYS0+bm9zYl9jb25maWcuc2JfbWluX2FkZHIsCi0JCWxwYS0+bm9zYl9jb25maWcuc2JfbWF4X2FkZHIpOwotCX0KLX0KLQotc3RhdGljIHU4IGxwYV9yZXFfd21hcmtfaWQoc3RydWN0IGxwYV9kcnYgKmxwYSkKLXsKLSAgcmV0dXJuICh1OCkgKExQQV9SRUdfUkVBREwobHBhLCBMUEFfT0JVRl9XTUFSS19BU1NJR04pICYKLQlMUEFfT0JVRl9XTUFSS19BU1NJR05fQk1TSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxwYV9lbmFibGVfbGxiX3dtYXJrKHN0cnVjdCBscGFfZHJ2ICpscGEsIHUzMiB3bWFya19jdHJsLAotCXUzMiB3bWFya19pZCwgdTMyIGNwdV9pZCkKLXsKLQl1MzIgdmFsOwotCi0Jd21hcmtfaWQgPSAod21hcmtfaWQgPiAzKSA/IDAgOiB3bWFya19pZDsKLQl2YWwgPSBMUEFfUkVHX1JFQURMKGxwYSwgTFBBX09CVUZfV01BUktfbl9MTEJfQUREUih3bWFya19pZCkpOwotCXZhbCAmPSB+TFBBX09CVUZfTExCX1dNQVJLX0NUUkxfQk1TSzsKLQl2YWwgJj0gfkxQQV9PQlVGX0xMQl9XTUFSS19NQVBfQk1TSzsKLQl2YWwgfD0gKHdtYXJrX2N0cmwgPDwgTFBBX09CVUZfTExCX1dNQVJLX0NUUkxfU0hGVCkgJgotCUxQQV9PQlVGX0xMQl9XTUFSS19DVFJMX0JNU0s7Ci0JdmFsIHw9IChjcHVfaWQgPDwgTFBBX09CVUZfTExCX1dNQVJLX01BUF9TSEZUKSAmCi0JTFBBX09CVUZfTExCX1dNQVJLX01BUF9CTVNLOwotCUxQQV9SRUdfV1JJVEVMKGxwYSwgdmFsLCBMUEFfT0JVRl9XTUFSS19uX0xMQl9BRERSKHdtYXJrX2lkKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxwYV9lbmFibGVfc2Jfd21hcmsoc3RydWN0IGxwYV9kcnYgKmxwYSwgdTMyIHdtYXJrX2N0cmwsCi0JdTMyIGNwdV9pZCkKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gTFBBX1JFR19SRUFETChscGEsIExQQV9PQlVGX1dNQVJLX1NCKTsKLQl2YWwgJj0gfkxQQV9PQlVGX1NCX1dNQVJLX0NUUkxfQk1TSzsKLQl2YWwgJj0gfkxQQV9PQlVGX1NCX1dNQVJLX01BUF9CTVNLOwotCXZhbCB8PSAod21hcmtfY3RybCA8PCBMUEFfT0JVRl9TQl9XTUFSS19DVFJMX1NIRlQpICYKLQlMUEFfT0JVRl9TQl9XTUFSS19DVFJMX0JNU0s7Ci0JdmFsIHw9IChjcHVfaWQgPDwgTFBBX09CVUZfU0JfV01BUktfTUFQX1NIRlQpICYKLQlMUEFfT0JVRl9TQl9XTUFSS19NQVBfQk1TSzsKLQlMUEFfUkVHX1dSSVRFTChscGEsIHZhbCwgTFBBX09CVUZfV01BUktfU0IpOwotfQotc3RhdGljIHZvaWQgbHBhX2VuYWJsZV9obGJfd21hcmsoc3RydWN0IGxwYV9kcnYgKmxwYSwgdTMyIHdtYXJrX2N0cmwsCi0JdTMyIGNwdV9pZCkKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gTFBBX1JFR19SRUFETChscGEsIExQQV9PQlVGX1dNQVJLX0hMQik7Ci0JdmFsICY9IH5MUEFfT0JVRl9ITEJfV01BUktfQ1RSTF9CTVNLOwotCXZhbCAmPSB+TFBBX09CVUZfSExCX1dNQVJLX01BUF9CTVNLOwotCXZhbCB8PSAod21hcmtfY3RybCA8PCBMUEFfT0JVRl9ITEJfV01BUktfQ1RSTF9TSEZUKSAmCi0JTFBBX09CVUZfSExCX1dNQVJLX0NUUkxfQk1TSzsKLQl2YWwgfD0gKGNwdV9pZCA8PCBMUEFfT0JVRl9ITEJfV01BUktfTUFQX1NIRlQpICYKLQlMUEFfT0JVRl9ITEJfV01BUktfTUFQX0JNU0s7Ci0JTFBBX1JFR19XUklURUwobHBhLCB2YWwsIExQQV9PQlVGX1dNQVJLX0hMQik7Ci19Ci0KLXN0YXRpYyB2b2lkIGxwYV9lbmFibGVfdXRjKHN0cnVjdCBscGFfZHJ2ICpscGEsIGJvb2wgZW5hYmxlLCB1MzIgY3B1X2lkKQotewotCXUzMiB2YWw7Ci0KLQl2YWwgPSAoY3B1X2lkIDw8IExQQV9PQlVGX1VUQ19DT05GSUdfTUFQX1NIRlQpICYKLQlMUEFfT0JVRl9VVENfQ09ORklHX01BUF9CTVNLOwotCWVuYWJsZSA9IChlbmFibGUgPyAxIDogMCk7Ci0JdmFsID0gKGVuYWJsZSA8PCBMUEFfT0JVRl9VVENfQ09ORklHX0VOX1NIRlQpICYKLQlMUEFfT0JVRl9VVENfQ09ORklHX0VOX0JNU0s7Ci0JTFBBX1JFR19XUklURUwobHBhLCB2YWwsIExQQV9PQlVGX1VUQ19DT05GSUcpOwotfQotCi1zdGF0aWMgdm9pZCBscGFfZW5hYmxlX21peGluZyhzdHJ1Y3QgbHBhX2RydiAqbHBhLCBib29sIGVuYWJsZSkKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gTFBBX1JFR19SRUFETChscGEsIExQQV9PQlVGX0NPTlRST0wpOwotCXZhbCA9IChlbmFibGUgPyB2YWwgfCBMUEFfT0JVRl9DT05UUk9MX0xMQl9FTl9CTVNLIDoKLQkJdmFsICYgfkxQQV9PQlVGX0NPTlRST0xfTExCX0VOX0JNU0spOwotCUxQQV9SRUdfV1JJVEVMKGxwYSwgdmFsLCBMUEFfT0JVRl9DT05UUk9MKTsKLX0KLQotc3RhdGljIHZvaWQgbHBhX2VuYWJsZV9taXhlcl9zYXR1cmF0aW9uKHN0cnVjdCBscGFfZHJ2ICpscGEsIHUzMiBidWZfaWQsCi0JYm9vbCBlbmFibGUpCi17Ci0JdTMyIHZhbDsKLQotCXZhbCA9IExQQV9SRUdfUkVBREwobHBhLCBMUEFfT0JVRl9DT05UUk9MKTsKLQotCXN3aXRjaCAoYnVmX2lkKSB7Ci0JY2FzZSBMUEFfQlVGX0lEX0xMQjoKLQkJdmFsID0gZW5hYmxlID8gKHZhbCB8IExQQV9PQlVGX0NPTlRST0xfTExCX1NBVF9FTl9CTVNLKSA6Ci0JCSh2YWwgJiB+TFBBX09CVUZfQ09OVFJPTF9MTEJfU0FUX0VOX0JNU0spOwotCQlicmVhazsKLQotCWNhc2UgTFBBX0JVRl9JRF9TQjoKLQkJdmFsID0gZW5hYmxlID8gKHZhbCB8IExQQV9PQlVGX0NPTlRST0xfU0JfU0FUX0VOX0JNU0spIDoKLQkJKHZhbCAmIH5MUEFfT0JVRl9DT05UUk9MX1NCX1NBVF9FTl9CTVNLKTsKLQkJYnJlYWs7Ci0JfQotCi0JTFBBX1JFR19XUklURUwobHBhLCB2YWwsIExQQV9PQlVGX0NPTlRST0wpOwotfQotCi1zdGF0aWMgdm9pZCBscGFfZW5hYmxlX29idWYoc3RydWN0IGxwYV9kcnYgKmxwYSwgdTMyIGJ1Zl9pZCwgYm9vbCBlbmFibGUpCi17Ci0JdTMyIHZhbDsKLQotCXZhbCA9IExQQV9SRUdfUkVBREwobHBhLCBMUEFfT0JVRl9DT05UUk9MKTsKLQotCXN3aXRjaCAoYnVmX2lkKSB7Ci0JY2FzZSBMUEFfQlVGX0lEX0hMQjoKLQkJdmFsID0gZW5hYmxlID8gKHZhbCB8IExQQV9PQlVGX0NPTlRST0xfSExCX0VOX0JNU0spIDoKLQkJCSh2YWwgJiB+TFBBX09CVUZfQ09OVFJPTF9ITEJfRU5fQk1TSyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBMUEFfQlVGX0lEX0xMQjoKLQkJdmFsID0gZW5hYmxlID8gKHZhbCB8IExQQV9PQlVGX0NPTlRST0xfTExCX0VOX0JNU0spIDoKLQkJKHZhbCAmIH5MUEFfT0JVRl9DT05UUk9MX0xMQl9FTl9CTVNLKTsKLQkJYnJlYWs7Ci0KLQljYXNlIExQQV9CVUZfSURfU0I6Ci0JCXZhbCA9IGVuYWJsZSA/ICh2YWwgfCBMUEFfT0JVRl9DT05UUk9MX1NCX0VOX0JNU0spIDoKLQkJCSh2YWwgJiB+TFBBX09CVUZfQ09OVFJPTF9TQl9FTl9CTVNLKTsKLQkJYnJlYWs7Ci0JfQotCUxQQV9SRUdfV1JJVEVMKGxwYSwgdmFsLCBMUEFfT0JVRl9DT05UUk9MKTsKLX0KLQotc3RydWN0IGxwYV9kcnYgKmxwYV9nZXQodm9pZCkKLXsKLQlzdHJ1Y3QgbHBhX21lbV9iYW5rX3NlbGVjdCBtZW1fYmFuazsKLQlzdHJ1Y3QgbHBhX2RydiAqcmV0X2xwYSA9ICZ0aGVfbHBhX3N0YXRlLmxwYV9kcnY7Ci0KLQltdXRleF9sb2NrKCZ0aGVfbHBhX3N0YXRlLmxwYV9sb2NrKTsKLQlpZiAodGhlX2xwYV9zdGF0ZS5hc3NpZ25lZCkgewotCQlNTV9FUlIoIkxQQSBIVyBhY2N1cGllZFxuIik7Ci0JCXJldF9scGEgPSBFUlJfUFRSKC1FQlVTWSk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCS8qIHBlcmZvcm0gaW5pdGlhbGl6YXRpb24gKi8KLQlscGFfcmVzZXQocmV0X2xwYSk7Ci0JLyogQ29uZmlnIGFkZWMgcGFyYW0gKi8KLQkvKiBJbml0aWFsaXplIExMQi9TQiBtaW4vbWF4IGFkZHJlc3MgKi8KLQlscGFfc3dpdGNoX3NiKHJldF9scGEpOwotCS8qIENvbmZpZyBITEIgbWlueC9tYXggYWRkcmVzcyAqLwotCWxwYV9jb25maWdfaGxiX2FkZHIocmV0X2xwYSk7Ci0KLQkvKiBQb3dlciB1cCBhbGwgbWVtb3J5IGJhbmsgZm9yIG5vdyAqLwotCW1lbV9iYW5rLmIwID0gMTsKLQltZW1fYmFuay5iMSA9IDE7Ci0JbWVtX2JhbmsuYjIgPSAxOwotCW1lbV9iYW5rLmIzID0gMTsKLQltZW1fYmFuay5iNCA9IDE7Ci0JbWVtX2JhbmsuYjUgPSAxOwotCW1lbV9iYW5rLmI2ID0gMTsKLQltZW1fYmFuay5iNyA9IDE7Ci0JbWVtX2JhbmsuYjggPSAxOwotCW1lbV9iYW5rLmI5ID0gMTsKLQltZW1fYmFuay5iMTAgPSAxOwotCW1lbV9iYW5rLmxsYiA9IDE7Ci0JbHBhX3Bvd2VydXBfbWVtX2JhbmsocmV0X2xwYSwgJm1lbV9iYW5rKTsKLQotCXdoaWxlCi0JKGxwYV9yZXFfd21hcmtfaWQocmV0X2xwYSkgIT0gTFBBX09CVUZfV01BUktfQVNTSUdOX0RPTkUpOwotCi0JbHBhX2VuYWJsZV9sbGJfd21hcmsocmV0X2xwYSwgTFBBX1dNQVJLX0NUTF9ESVNBQkxFRCwgMCwKLQlyZXRfbHBhLT5kc3BfcHJvY19pZCk7Ci0JbHBhX2VuYWJsZV9sbGJfd21hcmsocmV0X2xwYSwgTFBBX1dNQVJLX0NUTF9ESVNBQkxFRCwgMSwKLQlyZXRfbHBhLT5kc3BfcHJvY19pZCk7Ci0JbHBhX2VuYWJsZV9sbGJfd21hcmsocmV0X2xwYSwgTFBBX1dNQVJLX0NUTF9ESVNBQkxFRCwgMiwKLQlyZXRfbHBhLT5hcHBfcHJvY19pZCk7Ci0JbHBhX2VuYWJsZV9sbGJfd21hcmsocmV0X2xwYSwgTFBBX1dNQVJLX0NUTF9ESVNBQkxFRCwgMywKLQlyZXRfbHBhLT5hcHBfcHJvY19pZCk7Ci0JbHBhX2VuYWJsZV9obGJfd21hcmsocmV0X2xwYSwgTFBBX1dNQVJLX0NUTF9ESVNBQkxFRCwKLQlyZXRfbHBhLT5kc3BfcHJvY19pZCk7Ci0JbHBhX2VuYWJsZV9zYl93bWFyayhyZXRfbHBhLCBMUEFfV01BUktfQ1RMX0RJU0FCTEVELAotCXJldF9scGEtPmRzcF9wcm9jX2lkKTsKLQlscGFfZW5hYmxlX3V0YyhyZXRfbHBhLCAwLCBMUEFfT0JVRl9VVENfQ09ORklHX05PX0lOVFIpOwotCi0JbHBhX2VuYWJsZV9taXhpbmcocmV0X2xwYSwgMSk7Ci0JbHBhX2VuYWJsZV9taXhlcl9zYXR1cmF0aW9uKHJldF9scGEsIExQQV9CVUZfSURfTExCLCAxKTsKLQotCWxwYV9lbmFibGVfb2J1ZihyZXRfbHBhLCBMUEFfQlVGX0lEX0hMQiwgMCk7Ci0JbHBhX2VuYWJsZV9vYnVmKHJldF9scGEsIExQQV9CVUZfSURfTExCLCAxKTsKLQlpZiAocmV0X2xwYS0+c3RhdHVzICYgTFBBX1NUQVRVU19TQlVGX0VOKSB7Ci0JCWxwYV9lbmFibGVfbWl4ZXJfc2F0dXJhdGlvbihyZXRfbHBhLCBMUEFfQlVGX0lEX1NCLCAxKTsKLQkJbHBhX2VuYWJsZV9vYnVmKHJldF9scGEsIExQQV9CVUZfSURfU0IsIDEpOwotCX0KLQotCWxwYV9lbmFibGVfaW50ZXJydXB0KHJldF9scGEsIHJldF9scGEtPmRzcF9wcm9jX2lkKTsKLQltYigpOwotCXRoZV9scGFfc3RhdGUuYXNzaWduZWQrKzsKLWVycm9yOgotCW11dGV4X3VubG9jaygmdGhlX2xwYV9zdGF0ZS5scGFfbG9jayk7Ci0JcmV0dXJuIHJldF9scGE7Ci19Ci1FWFBPUlRfU1lNQk9MKGxwYV9nZXQpOwotCi12b2lkIGxwYV9wdXQoc3RydWN0IGxwYV9kcnYgKmxwYSkKLXsKLQotCW11dGV4X2xvY2soJnRoZV9scGFfc3RhdGUubHBhX2xvY2spOwotCWlmICghbHBhIHx8ICZ0aGVfbHBhX3N0YXRlLmxwYV9kcnYgIT0gbHBhKSB7Ci0JCU1NX0VSUigiaW52YWxpZCBhcmdcbiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQkvKiBEZWluaXRpYWxpemUgKi8KLQl0aGVfbHBhX3N0YXRlLmFzc2lnbmVkLS07Ci1lcnJvcjoKLQltdXRleF91bmxvY2soJnRoZV9scGFfc3RhdGUubHBhX2xvY2spOwotfQotRVhQT1JUX1NZTUJPTChscGFfcHV0KTsKLQotaW50IGxwYV9jbWRfY29kZWNfY29uZmlnKHN0cnVjdCBscGFfZHJ2ICpscGEsCi0Jc3RydWN0IGxwYV9jb2RlY19jb25maWcgKmNvbmZpZ19wdHIpCi17Ci0JdTMyIHNhbXBsZV9yYXRlOwotCXUzMiBudW1fY2hhbm5lbHM7Ci0JdTMyIHdpZHRoOwotCXUzMiB2YWwgPSAwOwotCi0JaWYgKCFscGEgfHwgIWNvbmZpZ19wdHIpIHsKLQkJTU1fRVJSKCJpbnZhbGlkIHBhcmFtZXRlcnNcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzd2l0Y2ggKGNvbmZpZ19wdHItPm51bV9jaGFubmVscykgewotCWNhc2UgODoKLQkJbnVtX2NoYW5uZWxzID0gTFBBX05VTV9DSEFOXzdQMTsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCQludW1fY2hhbm5lbHMgPSBMUEFfTlVNX0NIQU5fNVAxOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCW51bV9jaGFubmVscyA9IExQQV9OVU1fQ0hBTl80X0NIQU5ORUw7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJbnVtX2NoYW5uZWxzID0gTFBBX05VTV9DSEFOX1NURVJFTzsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQludW1fY2hhbm5lbHMgPSBMUEFfTlVNX0NIQU5fTU9OTzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJ1bnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbFxuIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXZhbCB8PSAobnVtX2NoYW5uZWxzIDw8IExQQV9PQlVGX0NPREVDX05VTV9DSEFOX1NIRlQpICYKLQlMUEFfT0JVRl9DT0RFQ19OVU1fQ0hBTl9CTVNLOwotCi0Jc3dpdGNoIChjb25maWdfcHRyLT5zYW1wbGVfcmF0ZSkgewotCWNhc2UgOTYwMDA6Ci0JCXNhbXBsZV9yYXRlID0gTFBBX1NBTVBMRV9SQVRFXzk2S0haOwotCQlicmVhazsKLQljYXNlIDY0MDAwOgotCQlzYW1wbGVfcmF0ZSA9IExQQV9TQU1QTEVfUkFURV82NEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA0ODAwMDoKLQkJc2FtcGxlX3JhdGUgPSBMUEFfU0FNUExFX1JBVEVfNDhLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNDQxMDA6Ci0JCXNhbXBsZV9yYXRlID0gTFBBX1NBTVBMRV9SQVRFXzQ0UDFLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMzIwMDA6Ci0JCXNhbXBsZV9yYXRlID0gTFBBX1NBTVBMRV9SQVRFXzMyS0haOwotCQlicmVhazsKLQljYXNlIDIyMDUwOgotCQlzYW1wbGVfcmF0ZSA9IExQQV9TQU1QTEVfUkFURV8yMlAwNUtIWjsKLQkJYnJlYWs7Ci0JY2FzZSAxNjAwMDoKLQkJc2FtcGxlX3JhdGUgPSBMUEFfU0FNUExFX1JBVEVfMTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMTEwMjU6Ci0JCXNhbXBsZV9yYXRlID0gTFBBX1NBTVBMRV9SQVRFXzExUDAyNUtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA4MDAwOgotCQlzYW1wbGVfcmF0ZSA9IExQQV9TQU1QTEVfUkFURV84S0haOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlNTV9FUlIoInVuc3VwcG9ydGVkIHNhbXBsZSByYXRlIFxuIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXZhbCB8PSAoc2FtcGxlX3JhdGUgPDwgTFBBX09CVUZfQ09ERUNfU0FNUF9TSEZUKSAmCi0JCUxQQV9PQlVGX0NPREVDX1NBTVBfQk1TSzsKLQlzd2l0Y2ggKGNvbmZpZ19wdHItPnNhbXBsZV93aWR0aCkgewotCWNhc2UgMzI6Ci0JCXdpZHRoID0gTFBBX0JJVFNfUEVSX0NIQU5fMzJCSVRTOwotCQlicmVhazsKLQljYXNlIDI0OgotCQl3aWR0aCA9IExQQV9CSVRTX1BFUl9DSEFOXzI0QklUUzsKLQkJYnJlYWs7Ci0JY2FzZSAxNjoKLQkJd2lkdGggPSBMUEFfQklUU19QRVJfQ0hBTl8xNkJJVFM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1NX0VSUigidW5zdXBwb3J0ZWQgc2FtcGxlIHdpZHRoIFxuIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXZhbCB8PSAod2lkdGggPDwgTFBBX09CVUZfQ09ERUNfQklUU19QRVJfQ0hBTl9TSEZUKSAmCi0JCUxQQV9PQlVGX0NPREVDX0JJVFNfUEVSX0NIQU5fQk1TSzsKLQotCXZhbCB8PSBMUEFfT0JVRl9DT0RFQ19MT0FEX0JNU0s7Ci0JdmFsIHw9IChjb25maWdfcHRyLT5vdXRwdXRfaW50ZXJmYWNlIDw8IExQQV9PQlVGX0NPREVDX0lOVEZfU0hGVCkgJgotCUxQQV9PQlVGX0NPREVDX0lOVEZfQk1TSzsKLQotCUxQQV9SRUdfV1JJVEVMKGxwYSwgdmFsLCBMUEFfT0JVRl9DT0RFQyk7Ci0JbWIoKTsKLQotCXJldHVybiAwOwotZXJyb3I6Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci1FWFBPUlRfU1lNQk9MKGxwYV9jbWRfY29kZWNfY29uZmlnKTsKLQotc3RhdGljIGludCBscGFfY2hlY2tfbGxiX2NsZWFyKHN0cnVjdCBscGFfZHJ2ICpscGEpCi17Ci0JdTMyIHZhbDsKLQl2YWwgPSBMUEFfUkVHX1JFQURMKGxwYSwgTFBBX09CVUZfU1RBVFVTKTsKLQotCXJldHVybiAhKHZhbCAmIExQQV9PQlVGX1NUQVRVU19MTEJfQ0xSX0JNU0spOwotfQotCi1zdGF0aWMgdm9pZCBscGFfY2xlYXJfbGxiKHN0cnVjdCBscGFfZHJ2ICpscGEpCi17Ci0JdTMyIHZhbDsKLQotCXZhbCA9IExQQV9SRUdfUkVBREwobHBhLCBMUEFfT0JVRl9DT05UUk9MKTsKLQlMUEFfUkVHX1dSSVRFTChscGEsICh2YWwgfCBMUEFfT0JVRl9DT05UUk9MX0xMQl9DTFJfQ01EX0JNU0spLAotCUxQQV9PQlVGX0NPTlRST0wpOwotCWxwYV9lbmFibGVfb2J1ZihscGEsIExQQV9CVUZfSURfTExCLCAwKTsKLQotCXdoaWxlICghbHBhX2NoZWNrX2xsYl9jbGVhcihscGEpKQotCQl1ZGVsYXkoMTAwKTsKLQlMUEFfUkVHX1dSSVRFTChscGEsIHZhbCwgTFBBX09CVUZfQ09OVFJPTCk7Ci19Ci0KLWludCBscGFfY21kX2VuYWJsZV9jb2RlYyhzdHJ1Y3QgbHBhX2RydiAqbHBhLCBib29sIGVuYWJsZSkKLXsKLQl1MzIgdmFsOwotCXN0cnVjdCBscGFfbWVtX2Jhbmtfc2VsZWN0IG1lbV9iYW5rOwotCi0JTU1fREJHKCIgJXNcbiIsIChlbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIikpOwotCi0JaWYgKCFscGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdmFsID0gTFBBX1JFR19SRUFETChscGEsIExQQV9PQlVGX0NPREVDKTsKLQotCWlmIChlbmFibGUpIHsKLQkJaWYgKHZhbCAmIExQQV9PQlVGX0NPREVDX0NPREVDX0lOVEZfRU5fQk1TSykKLQkJCXJldHVybiAtRUJVU1k7Ci0JCS8qIFBvd2VyIHVwIGFsbCBtZW1vcnkgYmFuayBmb3Igbm93ICovCi0JCW1lbV9iYW5rLmIwID0gMTsKLQkJbWVtX2JhbmsuYjEgPSAxOwotCQltZW1fYmFuay5iMiA9IDE7Ci0JCW1lbV9iYW5rLmIzID0gMTsKLQkJbWVtX2JhbmsuYjQgPSAxOwotCQltZW1fYmFuay5iNSA9IDE7Ci0JCW1lbV9iYW5rLmI2ID0gMTsKLQkJbWVtX2JhbmsuYjcgPSAxOwotCQltZW1fYmFuay5iOCA9IDE7Ci0JCW1lbV9iYW5rLmI5ID0gMTsKLQkJbWVtX2JhbmsuYjEwID0gMTsKLQkJbWVtX2JhbmsubGxiID0gMTsKLQkJbHBhX3Bvd2VydXBfbWVtX2JhbmsobHBhLCAmbWVtX2JhbmspOwotCi0JCS8qY2xlYXIgTExCKi8KLQkJbHBhX2NsZWFyX2xsYihscGEpOwotCi0JCWxwYV9lbmFibGVfY29kZWMobHBhLCAxKTsKLQkJTU1fREJHKCJMUEEgY29kZWMgaXMgZW5hYmxlZFxuIik7Ci0JfSBlbHNlIHsKLQkJaWYgKHZhbCAmIExQQV9PQlVGX0NPREVDX0NPREVDX0lOVEZfRU5fQk1TSykgewotCQkJbHBhX2VuYWJsZV9jb2RlYyhscGEsIDApOwotCQkJTU1fREJHKCJMUEEgY29kZWMgaXMgZGlzYWJsZWRcbiIpOwotCQl9IGVsc2UKLQkJCU1NX0VSUigiTFBBIGNvZGVjIGlzIGFscmVhZHkgZGlzYWJsZVxuIik7Ci0JfQotCW1iKCk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGxwYV9jbWRfZW5hYmxlX2NvZGVjKTsKLQotc3RhdGljIGludCBscGFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCByZXNvdXJjZSAqbWVtX3NyYzsKLQlzdHJ1Y3QgbXNtX2xwYV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKLQotCU1NX0lORk8oImxwYSBwcm9iZVxuIik7Ci0KLQlpZiAoIXBkZXYgfHwgIXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKSB7Ci0JCU1NX0VSUigibm8gcGxhZm9ybSBkYXRhXG4iKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGVycm9yOwotCX0KLQotCW1lbV9zcmMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAibHBhIik7Ci0JaWYgKCFtZW1fc3JjKSB7Ci0JCU1NX0VSUigiTFBBIGJhc2UgYWRkcmVzcyB1bmRlZmluZWRcbiIpOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQl0aGVfbHBhX3N0YXRlLmxwYV9kcnYuYmFzZWFkZHIgPSBpb3JlbWFwKG1lbV9zcmMtPnN0YXJ0LAotCShtZW1fc3JjLT5lbmQgLSBtZW1fc3JjLT5zdGFydCkgKyAxKTsKLQlpZiAoIXRoZV9scGFfc3RhdGUubHBhX2Rydi5iYXNlYWRkcikgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JdGhlX2xwYV9zdGF0ZS5scGFfZHJ2Lm9idWZfaGxiX3NpemUgPSBwZGF0YS0+b2J1Zl9obGJfc2l6ZTsKLQl0aGVfbHBhX3N0YXRlLmxwYV9kcnYuZHNwX3Byb2NfaWQgPSBwZGF0YS0+ZHNwX3Byb2NfaWQ7Ci0JdGhlX2xwYV9zdGF0ZS5scGFfZHJ2LmFwcF9wcm9jX2lkID0gcGRhdGEtPmFwcF9wcm9jX2lkOwotCXRoZV9scGFfc3RhdGUubHBhX2Rydi5ub3NiX2NvbmZpZyA9IHBkYXRhLT5ub3NiX2NvbmZpZzsKLQl0aGVfbHBhX3N0YXRlLmxwYV9kcnYuc2JfY29uZmlnID0gcGRhdGEtPnNiX2NvbmZpZzsKLQkvKiBkZWZhdWx0IHRvIGVuYWJsZSBzdW1taW5nIGJ1ZmZlciAqLwotCXRoZV9scGFfc3RhdGUubHBhX2Rydi5zdGF0dXMgPSBMUEFfU1RBVFVTX1NCVUZfRU47Ci0KLWVycm9yOgotCXJldHVybiByYzsKLQotfQotCi1zdGF0aWMgaW50IGxwYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpb3VubWFwKHRoZV9scGFfc3RhdGUubHBhX2Rydi5iYXNlYWRkcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGxwYV9kcml2ZXIgPSB7Ci0JLnByb2JlID0gbHBhX3Byb2JlLAotCS5yZW1vdmUgPSBscGFfcmVtb3ZlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImxwYSIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBscGFfaW5pdCh2b2lkKQotewotCXRoZV9scGFfc3RhdGUuYXNzaWduZWQgPSAwOwotCW11dGV4X2luaXQoJnRoZV9scGFfc3RhdGUubHBhX2xvY2spOwotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmxwYV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbHBhX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbHBhX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGxwYV9pbml0KTsKLW1vZHVsZV9leGl0KGxwYV9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gTFBBIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9taTJzLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL21pMnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0OWVjMS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL21pMnMuYworKysgL2Rldi9udWxsCkBAIC0xLDg4NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksMjAxMSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotCi0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL21pMnMuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotCi0jZGVmaW5lIERFQlVHCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgZHByaW50ayhmb3JtYXQsIGFyZy4uLikgXAotcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0LCAjIyBhcmcpCi0jZWxzZQotI2RlZmluZSBkcHJpbnRrKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRGV2aWNlIFR5cGVzICovCi0jZGVmaW5lIEhETUkgMAotI2RlZmluZSBDT0RFQ19SWCAxCi0jZGVmaW5lIENPREVDX1RYIDIKLQotLyogU3RhdGljIG9mZnNldCBmb3Igbm93LiBJZiBkaWZmZXJlbnQgdGFyZ2V0IGhhdmUgZGlmZmVyZW50Ci0gKiBvZmZzZXQsIHVwZGF0ZSB0byBwbGF0Zm9ybSBkYXRhIG1vZGVsCi0gKi8KLSNkZWZpbmUgTUkyU19SRVNFVF9PRkZTRVQgICAweDAKLSNkZWZpbmUgTUkyU19NT0RFX09GRlNFVCAgICAweDQKLSNkZWZpbmUgTUkyU19UWF9NT0RFX09GRlNFVCAweDgKLSNkZWZpbmUgTUkyU19SWF9NT0RFX09GRlNFVCAweGMKLQotI2RlZmluZSBNSTJTX1NEX05fRU5fTUFTSyAweEYwCi0jZGVmaW5lIE1JMlNfVFhfUlhfTl9NQVNLIDB4MEYKLQotI2RlZmluZSBNSTJTX1JFU0VUX19NSTJTX1JFU0VUX19SRVNFVCAgMHgxCi0jZGVmaW5lIE1JMlNfUkVTRVRfX01JMlNfUkVTRVRfX0FDVElWRSAweDAKLSNkZWZpbmUgTUkyU19NT0RFX19NSTJTX01BU1RFUl9fTUFTVEVSIDB4MQotI2RlZmluZSBNSTJTX01PREVfX01JMlNfTUFTVEVSX19TTEFWRSAgMHgwCi0jZGVmaW5lIE1JMlNfTU9ERV9fTUkyU19UWF9SWF9XT1JEX1RZUEVfXzE2X0JJVCAweDEKLSNkZWZpbmUgTUkyU19NT0RFX19NSTJTX1RYX1JYX1dPUkRfVFlQRV9fMjRfQklUIDB4MgotI2RlZmluZSBNSTJTX01PREVfX01JMlNfVFhfUlhfV09SRF9UWVBFX18zMl9CSVQgMHgzCi0jZGVmaW5lIE1JMlNfVFhfTU9ERV9fTUkyU19UWF9DT0RFQ18xNl9NT05PX01PREVfX1JBVyAweDAKLSNkZWZpbmUgTUkyU19UWF9NT0RFX19NSTJTX1RYX0NPREVDXzE2X01PTk9fTU9ERV9fUEFDS0VEIDB4MQotI2RlZmluZSBNSTJTX1RYX01PREVfX01JMlNfVFhfU1RFUkVPX01PREVfX01PTk9fU0FNUExFICAgMHgwCi0jZGVmaW5lIE1JMlNfVFhfTU9ERV9fTUkyU19UWF9TVEVSRU9fTU9ERV9fU1RFUkVPX1NBTVBMRSAweDEKLSNkZWZpbmUgTUkyU19UWF9NT0RFX19NSTJTX1RYX0NIX1RZUEVfXzJfQ0hBTk5FTCAweDAKLSNkZWZpbmUgTUkyU19UWF9NT0RFX19NSTJTX1RYX0NIX1RZUEVfXzRfQ0hBTk5FTCAweDEKLSNkZWZpbmUgTUkyU19UWF9NT0RFX19NSTJTX1RYX0NIX1RZUEVfXzZfQ0hBTk5FTCAweDIKLSNkZWZpbmUgTUkyU19UWF9NT0RFX19NSTJTX1RYX0NIX1RZUEVfXzhfQ0hBTk5FTCAweDMKLSNkZWZpbmUgTUkyU19UWF9NT0RFX19NSTJTX1RYX0RNQV9BQ0tfU1lOQ0hfRU5fX1NZTkNfRU5BQkxFIDB4MQotI2RlZmluZSBNSTJTX1JYX01PREVfX01JMlNfUlhfQ09ERUNfMTZfTU9OT19NT0RFX19SQVcgMHgwCi0jZGVmaW5lIE1JMlNfUlhfTU9ERV9fTUkyU19SWF9DT0RFQ18xNl9NT05PX01PREVfX1BBQ0tFRCAweDEKLSNkZWZpbmUgTUkyU19SWF9NT0RFX19NSTJTX1JYX1NURVJFT19NT0RFX19NT05PX1NBTVBMRSAgIDB4MAotI2RlZmluZSBNSTJTX1JYX01PREVfX01JMlNfUlhfU1RFUkVPX01PREVfX1NURVJFT19TQU1QTEUgMHgxCi0jZGVmaW5lIE1JMlNfUlhfTU9ERV9fTUkyU19SWF9DSF9UWVBFX18yX0NIIDB4MAotI2RlZmluZSBNSTJTX1JYX01PREVfX01JMlNfUlhfRE1BX0FDS19TWU5DSF9FTl9fU1lOQ19FTkFCTEUgMHgxCi0KLSNkZWZpbmUgSFdJT19BVURJTzFfTUkyU19NT0RFX01JMlNfTUFTVEVSX0JNU0sJCQkJMHgxMDAwCi0jZGVmaW5lIEhXSU9fQVVESU8xX01JMlNfTU9ERV9NSTJTX01BU1RFUl9TSEZUCQkJCTB4QwotI2RlZmluZSBIV0lPX0FVRElPMV9NSTJTX01PREVfTUkyU19UWF9SWF9XT1JEX1RZUEVfQk1TSyAgCQkweDMwMAotI2RlZmluZSBIV0lPX0FVRElPMV9NSTJTX01PREVfTUkyU19UWF9SWF9XT1JEX1RZUEVfU0hGVCAgCQkweDgKLSNkZWZpbmUgSFdJT19BVURJTzFfTUkyU19UWF9NT0RFX01JMlNfVFhfU1RFUkVPX01PREVfQk1TSwkJMHg0Ci0jZGVmaW5lIEhXSU9fQVVESU8xX01JMlNfVFhfTU9ERV9NSTJTX1RYX1NURVJFT19NT0RFX1NIRlQJCTB4MgotI2RlZmluZSBIV0lPX0FVRElPMV9NSTJTX1RYX01PREVfTUkyU19UWF9QX01PTk9fQk1TSyAgICAgICAgICAgICAgICAgICAgMHgyCi0jZGVmaW5lIEhXSU9fQVVESU8xX01JMlNfVFhfTU9ERV9NSTJTX1RYX1BfTU9OT19TSEZUICAgICAgICAgICAgICAgICAgICAweDEKLSNkZWZpbmUgSFdJT19BVURJTzFfTUkyU19UWF9NT0RFX01JMlNfVFhfQ0hfVFlQRV9CTVNLCQkJMHgxOAotI2RlZmluZSBIV0lPX0FVRElPMV9NSTJTX1RYX01PREVfTUkyU19UWF9DSF9UWVBFX1NIRlQJCQkweDMKLSNkZWZpbmUgSFdJT19BVURJTzFfTUkyU19UWF9NT0RFX01JMlNfNF8wX0NIX01BUF9CTVNLCQkJMHg4MAotI2RlZmluZSBIV0lPX0FVRElPMV9NSTJTX1RYX01PREVfTUkyU180XzBfQ0hfTUFQX1NIRlQJCQkweDcKLSNkZWZpbmUgSFdJT19BVURJTzFfTUkyU19UWF9NT0RFX01JMlNfMl8wX0NIX01BUF9CTVNLCQkJMHg2MAotI2RlZmluZSBIV0lPX0FVRElPMV9NSTJTX1RYX01PREVfTUkyU18yXzBfQ0hfTUFQX1NIRlQJCQkweDUKLSNkZWZpbmUgSFdJT19BVURJTzFfTUkyU19UWF9NT0RFX01JMlNfVFhfRE1BX0FDS19TWU5DSF9FTl9CTVNLCQkweDEKLSNkZWZpbmUgSFdJT19BVURJTzFfTUkyU19SWF9NT0RFX01JMlNfUlhfSTJTX0xJTkVfQk1TSwkJCTB4NjAKLSNkZWZpbmUgSFdJT19BVURJTzFfTUkyU19SWF9NT0RFX01JMlNfUlhfSTJTX0xJTkVfU0hGVAkJCTB4NQotI2RlZmluZSBIV0lPX0FVRElPMV9NSTJTX1JYX01PREVfTUkyU19SWF9TVEVSRU9fTU9ERV9CTVNLCQkweDQKLSNkZWZpbmUgSFdJT19BVURJTzFfTUkyU19SWF9NT0RFX01JMlNfUlhfU1RFUkVPX01PREVfU0hGVAkJMHgyCi0jZGVmaW5lIEhXSU9fQVVESU8xX01JMlNfUlhfTU9ERV9NSTJTX1JYX0NPREVDX1BfTU9OT19CTVNLICAgICAgICAgICAgICAweDIKLSNkZWZpbmUgSFdJT19BVURJTzFfTUkyU19SWF9NT0RFX01JMlNfUlhfQ09ERUNfUF9NT05PX1NIRlQgICAgICAgICAgICAgIDB4MQotI2RlZmluZSBIV0lPX0FVRElPMV9NSTJTX1JYX01PREVfTUkyU19SWF9DSF9UWVBFX0JNU0sJCQkweDE4Ci0jZGVmaW5lIEhXSU9fQVVESU8xX01JMlNfUlhfTU9ERV9NSTJTX1JYX0NIX1RZUEVfU0hGVAkJCTB4MwotI2RlZmluZSBIV0lPX0FVRElPMV9NSTJTX1JYX01PREVfTUkyU19SWF9ETUFfQUNLX1NZTkNIX0VOX0JNU0sJCTB4MQotCi0vKiBNYXggbnVtYmVyIG9mIGNoYW5uZWxzICovCi0jZGVmaW5lIE1BWF9OVU1fQ0hBTk5FTFNfT1VUIDgKLSNkZWZpbmUgTUFYX05VTV9DSEFOTkVMU19JTiAgMgotCi0vKiBOdW0gb2YgU0QgTGluZXMgKi8KLSNkZWZpbmUgTUFYX1NEX0xJTkVTIDQKLQotI2RlZmluZSBNSTJTX1NEXzBfRU5fTUFQICAweDEwCi0jZGVmaW5lIE1JMlNfU0RfMV9FTl9NQVAgIDB4MjAKLSNkZWZpbmUgTUkyU19TRF8yX0VOX01BUCAgMHg0MAotI2RlZmluZSBNSTJTX1NEXzNfRU5fTUFQICAweDgwCi0jZGVmaW5lIE1JMlNfU0RfMF9UWF9NQVAgIDB4MDEKLSNkZWZpbmUgTUkyU19TRF8xX1RYX01BUCAgMHgwMgotI2RlZmluZSBNSTJTX1NEXzJfVFhfTUFQICAweDA0Ci0jZGVmaW5lIE1JMlNfU0RfM19UWF9NQVAgIDB4MDgKLQotc3RydWN0IG1pMnNfc3RhdGUgewotCXZvaWQgX19pb21lbSAqbWkyc19oZG1pX2Jhc2U7Ci0Jdm9pZCBfX2lvbWVtICptaTJzX3J4X2Jhc2U7Ci0Jdm9pZCBfX2lvbWVtICptaTJzX3R4X2Jhc2U7Ci0Jc3RydWN0IG11dGV4IG11dGV4X2xvY2s7Ci0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWkyc19zdGF0ZSB0aGVfbWkyc19zdGF0ZTsKLQotc3RhdGljIHZvaWQgX19pb21lbSAqZ2V0X2Jhc2VfYWRkcihzdHJ1Y3QgbWkyc19zdGF0ZSAqbWkycywgdWludDhfdCBkZXZfaWQpCi17Ci0Jc3dpdGNoIChkZXZfaWQpIHsKLQljYXNlIEhETUk6Ci0JCXJldHVybiBtaTJzLT5taTJzX2hkbWlfYmFzZTsKLQljYXNlIENPREVDX1JYOgotCQlyZXR1cm4gbWkycy0+bWkyc19yeF9iYXNlOwotCWNhc2UgQ09ERUNfVFg6Ci0JCXJldHVybiBtaTJzLT5taTJzX3R4X2Jhc2U7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwotfQotCi1zdGF0aWMgdm9pZCBtaTJzX3Jlc2V0KHN0cnVjdCBtaTJzX3N0YXRlICptaTJzLCB1aW50OF90IGRldl9pZCkKLXsKLQl2b2lkIF9faW9tZW0gKmJhZGRyID0gZ2V0X2Jhc2VfYWRkcihtaTJzLCBkZXZfaWQpOwotCWlmICghSVNfRVJSKGJhZGRyKSkKLQkJd3JpdGVsKE1JMlNfUkVTRVRfX01JMlNfUkVTRVRfX1JFU0VULAotCQliYWRkciArIE1JMlNfUkVTRVRfT0ZGU0VUKTsKLX0KLQotc3RhdGljIHZvaWQgbWkyc19yZWxlYXNlKHN0cnVjdCBtaTJzX3N0YXRlICptaTJzLCB1aW50OF90IGRldl9pZCkKLXsKLQl2b2lkIF9faW9tZW0gKmJhZGRyID0gZ2V0X2Jhc2VfYWRkcihtaTJzLCBkZXZfaWQpOwotCWlmICghSVNfRVJSKGJhZGRyKSkKLQkJd3JpdGVsKE1JMlNfUkVTRVRfX01JMlNfUkVTRVRfX0FDVElWRSwKLQkJYmFkZHIgKyBNSTJTX1JFU0VUX09GRlNFVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1pMnNfbWFzdGVyKHN0cnVjdCBtaTJzX3N0YXRlICptaTJzLCB1aW50OF90IGRldl9pZCwgYm9vbCBtYXN0ZXIpCi17Ci0Jdm9pZCBfX2lvbWVtICpiYWRkciA9IGdldF9iYXNlX2FkZHIobWkycywgZGV2X2lkKTsKLQl1aW50MzJfdCB2YWw7Ci0JaWYgKCFJU19FUlIoYmFkZHIpKSB7Ci0JCXZhbCA9IHJlYWRsKGJhZGRyICsgTUkyU19NT0RFX09GRlNFVCk7Ci0JCWlmIChtYXN0ZXIpIHsKLQkJCXdyaXRlbCgKLQkJCSgodmFsICYgfkhXSU9fQVVESU8xX01JMlNfTU9ERV9NSTJTX01BU1RFUl9CTVNLKSB8Ci0JCQkgKE1JMlNfTU9ERV9fTUkyU19NQVNURVJfX01BU1RFUiA8PAotCQkJICBIV0lPX0FVRElPMV9NSTJTX01PREVfTUkyU19NQVNURVJfU0hGVCkpLAotCQkJYmFkZHIgKyBNSTJTX01PREVfT0ZGU0VUKTsKLQkJfSBlbHNlIHsKLQkJCXdyaXRlbCgKLQkJCSgodmFsICYgfkhXSU9fQVVESU8xX01JMlNfTU9ERV9NSTJTX01BU1RFUl9CTVNLKSB8Ci0JCQkgKE1JMlNfTU9ERV9fTUkyU19NQVNURVJfX1NMQVZFIDw8Ci0JCQkgIEhXSU9fQVVESU8xX01JMlNfTU9ERV9NSTJTX01BU1RFUl9TSEZUKSksCi0JCQliYWRkciArIE1JMlNfTU9ERV9PRkZTRVQpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBtaTJzX3NldF93b3JkX3R5cGUoc3RydWN0IG1pMnNfc3RhdGUgKm1pMnMsIHVpbnQ4X3QgZGV2X2lkLAotCXVpbnQ4X3Qgc2l6ZSkKLXsKLQl2b2lkIF9faW9tZW0gKmJhZGRyID0gZ2V0X2Jhc2VfYWRkcihtaTJzLCBkZXZfaWQpOwotCXVpbnQzMl90IHZhbDsKLQlpZiAoIUlTX0VSUihiYWRkcikpIHsKLQkJdmFsID0gcmVhZGwoYmFkZHIgKyBNSTJTX01PREVfT0ZGU0VUKTsKLQkJc3dpdGNoIChzaXplKSB7Ci0JCWNhc2UgV1RfMTZfQklUOgotCQkJd3JpdGVsKAotCQkJKCh2YWwgJgotCQkJfkhXSU9fQVVESU8xX01JMlNfTU9ERV9NSTJTX1RYX1JYX1dPUkRfVFlQRV9CTVNLKSB8Ci0JCQkoTUkyU19NT0RFX19NSTJTX1RYX1JYX1dPUkRfVFlQRV9fMTZfQklUIDw8Ci0JCQlIV0lPX0FVRElPMV9NSTJTX01PREVfTUkyU19UWF9SWF9XT1JEX1RZUEVfU0hGVCkpLAotCQkJYmFkZHIgKyBNSTJTX01PREVfT0ZGU0VUKTsKLQkJCWJyZWFrOwotCQljYXNlIFdUXzI0X0JJVDoKLQkJCXdyaXRlbCgKLQkJCSgodmFsICYKLQkJCX5IV0lPX0FVRElPMV9NSTJTX01PREVfTUkyU19UWF9SWF9XT1JEX1RZUEVfQk1TSykgfAotCQkJKE1JMlNfTU9ERV9fTUkyU19UWF9SWF9XT1JEX1RZUEVfXzI0X0JJVCA8PAotCQkJSFdJT19BVURJTzFfTUkyU19NT0RFX01JMlNfVFhfUlhfV09SRF9UWVBFX1NIRlQpKSwKLQkJCWJhZGRyICsgTUkyU19NT0RFX09GRlNFVCk7Ci0JCQlicmVhazsKLQkJY2FzZSBXVF8zMl9CSVQ6Ci0JCQl3cml0ZWwoCi0JCQkoKHZhbCAmCi0JCQl+SFdJT19BVURJTzFfTUkyU19NT0RFX01JMlNfVFhfUlhfV09SRF9UWVBFX0JNU0spIHwKLQkJCShNSTJTX01PREVfX01JMlNfVFhfUlhfV09SRF9UWVBFX18zMl9CSVQgPDwKLQkJCUhXSU9fQVVESU8xX01JMlNfTU9ERV9NSTJTX1RYX1JYX1dPUkRfVFlQRV9TSEZUKSksCi0JCQliYWRkciArIE1JMlNfTU9ERV9PRkZTRVQpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgbWkyc19zZXRfc2Qoc3RydWN0IG1pMnNfc3RhdGUgKm1pMnMsIHVpbnQ4X3QgZGV2X2lkLCB1aW50OF90IHNkX21hcCkKLXsKLQl2b2lkIF9faW9tZW0gKmJhZGRyID0gZ2V0X2Jhc2VfYWRkcihtaTJzLCBkZXZfaWQpOwotCXVpbnQzMl90IHZhbDsKLQlpZiAoIUlTX0VSUihiYWRkcikpIHsKLQkJdmFsID0gcmVhZGwoYmFkZHIgKyBNSTJTX01PREVfT0ZGU0VUKSAmCi0JCQl+KE1JMlNfU0RfTl9FTl9NQVNLIHwgTUkyU19UWF9SWF9OX01BU0spOwotCQl3cml0ZWwodmFsIHwgc2RfbWFwLCBiYWRkciArIE1JMlNfTU9ERV9PRkZTRVQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbWkyc19zZXRfb3V0cHV0X251bV9jaGFubmVscyhzdHJ1Y3QgbWkyc19zdGF0ZSAqbWkycywKLQl1aW50OF90IGRldl9pZCwgdWludDhfdCBjaGFubmVscykKLXsKLQl2b2lkIF9faW9tZW0gKmJhZGRyID0gZ2V0X2Jhc2VfYWRkcihtaTJzLCBkZXZfaWQpOwotCXVpbnQzMl90IHZhbDsKLQlpZiAoIUlTX0VSUihiYWRkcikpIHsKLQkJdmFsID0gcmVhZGwoYmFkZHIgKyBNSTJTX1RYX01PREVfT0ZGU0VUKTsKLQkJaWYgKGNoYW5uZWxzID09IE1JMlNfQ0hBTl9NT05PX1JBVykgewotCQkJdmFsID0gKHZhbCAmCi0JCQl+KEhXSU9fQVVESU8xX01JMlNfVFhfTU9ERV9NSTJTX1RYX1NURVJFT19NT0RFX0JNU0sgfAotCQkJSFdJT19BVURJTzFfTUkyU19UWF9NT0RFX01JMlNfVFhfUF9NT05PX0JNU0spKSB8Ci0JCQkoKE1JMlNfVFhfTU9ERV9fTUkyU19UWF9TVEVSRU9fTU9ERV9fTU9OT19TQU1QTEUgPDwKLQkJCUhXSU9fQVVESU8xX01JMlNfVFhfTU9ERV9NSTJTX1RYX1NURVJFT19NT0RFX1NIRlQpIHwKLQkJCShNSTJTX1RYX01PREVfX01JMlNfVFhfQ09ERUNfMTZfTU9OT19NT0RFX19SQVcgPDwKLQkJCUhXSU9fQVVESU8xX01JMlNfVFhfTU9ERV9NSTJTX1RYX1BfTU9OT19TSEZUKSk7Ci0JCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gTUkyU19DSEFOX01PTk9fUEFDS0VEKSB7Ci0JCQl2YWwgPSAodmFsICYKLQkJCX4oSFdJT19BVURJTzFfTUkyU19UWF9NT0RFX01JMlNfVFhfU1RFUkVPX01PREVfQk1TSyB8Ci0JCQlIV0lPX0FVRElPMV9NSTJTX1RYX01PREVfTUkyU19UWF9QX01PTk9fQk1TSykpIHwKLQkJCSgoTUkyU19UWF9NT0RFX19NSTJTX1RYX1NURVJFT19NT0RFX19NT05PX1NBTVBMRSA8PAotCQkJSFdJT19BVURJTzFfTUkyU19UWF9NT0RFX01JMlNfVFhfU1RFUkVPX01PREVfU0hGVCkgfAotCQkJKE1JMlNfVFhfTU9ERV9fTUkyU19UWF9DT0RFQ18xNl9NT05PX01PREVfX1BBQ0tFRCA8PAotCQkJSFdJT19BVURJTzFfTUkyU19UWF9NT0RFX01JMlNfVFhfUF9NT05PX1NIRlQpKTsKLQkJfSBlbHNlIGlmIChjaGFubmVscyA9PSBNSTJTX0NIQU5fU1RFUkVPKSB7Ci0JCQl2YWwgPSAodmFsICYKLQkJCX4oSFdJT19BVURJTzFfTUkyU19UWF9NT0RFX01JMlNfVFhfU1RFUkVPX01PREVfQk1TSyB8Ci0JCQlIV0lPX0FVRElPMV9NSTJTX1RYX01PREVfTUkyU19UWF9DSF9UWVBFX0JNU0spKSB8Ci0JCQkoKE1JMlNfVFhfTU9ERV9fTUkyU19UWF9TVEVSRU9fTU9ERV9fU1RFUkVPX1NBTVBMRSA8PAotCQkJSFdJT19BVURJTzFfTUkyU19UWF9NT0RFX01JMlNfVFhfU1RFUkVPX01PREVfU0hGVCkgfAotCQkJKE1JMlNfVFhfTU9ERV9fTUkyU19UWF9DSF9UWVBFX18yX0NIQU5ORUwgPDwKLQkJCUhXSU9fQVVESU8xX01JMlNfVFhfTU9ERV9NSTJTX1RYX0NIX1RZUEVfU0hGVCkpOwotCQl9IGVsc2UgaWYgKGNoYW5uZWxzID09IE1JMlNfQ0hBTl80Q0hBTk5FTFMpIHsKLQkJCXZhbCA9ICh2YWwgJgotCQkJfihIV0lPX0FVRElPMV9NSTJTX1RYX01PREVfTUkyU19UWF9TVEVSRU9fTU9ERV9CTVNLIHwKLQkJCUhXSU9fQVVESU8xX01JMlNfVFhfTU9ERV9NSTJTX1RYX0NIX1RZUEVfQk1TSykpIHwKLQkJCSgoTUkyU19UWF9NT0RFX19NSTJTX1RYX1NURVJFT19NT0RFX19TVEVSRU9fU0FNUExFIDw8Ci0JCQlIV0lPX0FVRElPMV9NSTJTX1RYX01PREVfTUkyU19UWF9TVEVSRU9fTU9ERV9TSEZUKSB8Ci0JCQkoTUkyU19UWF9NT0RFX19NSTJTX1RYX0NIX1RZUEVfXzRfQ0hBTk5FTCA8PAotCQkJSFdJT19BVURJTzFfTUkyU19UWF9NT0RFX01JMlNfVFhfQ0hfVFlQRV9TSEZUKSk7Ci0JCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gTUkyU19DSEFOXzZDSEFOTkVMUykgewotCQkJdmFsID0gKHZhbCAmCi0JCQl+KEhXSU9fQVVESU8xX01JMlNfVFhfTU9ERV9NSTJTX1RYX1NURVJFT19NT0RFX0JNU0sgfAotCQkJSFdJT19BVURJTzFfTUkyU19UWF9NT0RFX01JMlNfVFhfQ0hfVFlQRV9CTVNLKSkgfAotCQkJKChNSTJTX1RYX01PREVfX01JMlNfVFhfU1RFUkVPX01PREVfX1NURVJFT19TQU1QTEUgPDwKLQkJCUhXSU9fQVVESU8xX01JMlNfVFhfTU9ERV9NSTJTX1RYX1NURVJFT19NT0RFX1NIRlQpIHwKLQkJCShNSTJTX1RYX01PREVfX01JMlNfVFhfQ0hfVFlQRV9fNl9DSEFOTkVMIDw8Ci0JCQlIV0lPX0FVRElPMV9NSTJTX1RYX01PREVfTUkyU19UWF9DSF9UWVBFX1NIRlQpKTsKLQkJfSBlbHNlIGlmIChjaGFubmVscyA9PSBNSTJTX0NIQU5fOENIQU5ORUxTKSB7Ci0JCQl2YWwgPSAodmFsICYKLQkJCX4oSFdJT19BVURJTzFfTUkyU19UWF9NT0RFX01JMlNfVFhfU1RFUkVPX01PREVfQk1TSyB8Ci0JCQlIV0lPX0FVRElPMV9NSTJTX1RYX01PREVfTUkyU19UWF9DSF9UWVBFX0JNU0spKSB8Ci0JCQkoKE1JMlNfVFhfTU9ERV9fTUkyU19UWF9TVEVSRU9fTU9ERV9fU1RFUkVPX1NBTVBMRSA8PAotCQkJSFdJT19BVURJTzFfTUkyU19UWF9NT0RFX01JMlNfVFhfU1RFUkVPX01PREVfU0hGVCkgfAotCQkJKE1JMlNfVFhfTU9ERV9fTUkyU19UWF9DSF9UWVBFX184X0NIQU5ORUwgPDwKLQkJCUhXSU9fQVVESU8xX01JMlNfVFhfTU9ERV9NSTJTX1RYX0NIX1RZUEVfU0hGVCkpOwotCQl9Ci0JCXdyaXRlbCh2YWwsIGJhZGRyICsgTUkyU19UWF9NT0RFX09GRlNFVCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBtaTJzX3NldF9vdXRwdXRfNGNoX21hcChzdHJ1Y3QgbWkyc19zdGF0ZSAqbWkycywgdWludDhfdCBkZXZfaWQsCi0JYm9vbCBoaWdoX2xvdykKLXsKLQl2b2lkIF9faW9tZW0gKmJhZGRyID0gZ2V0X2Jhc2VfYWRkcihtaTJzLCBkZXZfaWQpOwotCXVpbnQzMl90IHZhbDsKLQlpZiAoIUlTX0VSUihiYWRkcikpIHsKLQkJdmFsID0gcmVhZGwoYmFkZHIgKyBNSTJTX1RYX01PREVfT0ZGU0VUKTsKLQkJdmFsID0gKHZhbCAmIH5IV0lPX0FVRElPMV9NSTJTX1RYX01PREVfTUkyU180XzBfQ0hfTUFQX0JNU0spIHwKLQkJCShoaWdoX2xvdyA8PAotCQkJSFdJT19BVURJTzFfTUkyU19UWF9NT0RFX01JMlNfNF8wX0NIX01BUF9TSEZUKTsKLQkJd3JpdGVsKHZhbCwgYmFkZHIgKyBNSTJTX1RYX01PREVfT0ZGU0VUKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1pMnNfc2V0X291dHB1dF8yY2hfbWFwKHN0cnVjdCBtaTJzX3N0YXRlICptaTJzLCB1aW50OF90IGRldl9pZCwKLQl1aW50OF90IHNkX2xpbmUpCi17Ci0Jdm9pZCBfX2lvbWVtICpiYWRkciA9IGdldF9iYXNlX2FkZHIobWkycywgZGV2X2lkKTsKLQl1aW50MzJfdCB2YWw7Ci0KLQlpZiAoIUlTX0VSUihiYWRkcikpIHsKLQkJdmFsID0gcmVhZGwoYmFkZHIgKyBNSTJTX1RYX01PREVfT0ZGU0VUKTsKLQkJaWYgKHNkX2xpbmUgPCA0KSB7Ci0JCQl2YWwgPSAodmFsICYKLQkJCX5IV0lPX0FVRElPMV9NSTJTX1RYX01PREVfTUkyU18yXzBfQ0hfTUFQX0JNU0spIHwKLQkJCShzZF9saW5lIDw8Ci0JCQlIV0lPX0FVRElPMV9NSTJTX1RYX01PREVfTUkyU18yXzBfQ0hfTUFQX1NIRlQpOwotCQkJd3JpdGVsKHZhbCwgYmFkZHIgKyBNSTJTX1RYX01PREVfT0ZGU0VUKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgbWkyc19zZXRfb3V0cHV0X2Nsa19zeW5jaChzdHJ1Y3QgbWkyc19zdGF0ZSAqbWkycywgdWludDhfdCBkZXZfaWQpCi17Ci0Jdm9pZCBfX2lvbWVtICpiYWRkciA9IGdldF9iYXNlX2FkZHIobWkycywgZGV2X2lkKTsKLQl1aW50MzJfdCB2YWw7Ci0KLQlpZiAoIUlTX0VSUihiYWRkcikpIHsKLQkJdmFsID0gcmVhZGwoYmFkZHIgKyBNSTJTX1RYX01PREVfT0ZGU0VUKTsKLQkJd3JpdGVsKCgodmFsICYKLQkJfkhXSU9fQVVESU8xX01JMlNfVFhfTU9ERV9NSTJTX1RYX0RNQV9BQ0tfU1lOQ0hfRU5fQk1TSykgfAotCQlNSTJTX1RYX01PREVfX01JMlNfVFhfRE1BX0FDS19TWU5DSF9FTl9fU1lOQ19FTkFCTEUpLAotCQliYWRkciArIE1JMlNfVFhfTU9ERV9PRkZTRVQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbWkyc19zZXRfaW5wdXRfc2RfbGluZShzdHJ1Y3QgbWkyc19zdGF0ZSAqbWkycywgdWludDhfdCBkZXZfaWQsCi0JdWludDhfdCBzZF9saW5lKQotewotCXZvaWQgX19pb21lbSAqYmFkZHIgPSBnZXRfYmFzZV9hZGRyKG1pMnMsIGRldl9pZCk7Ci0JdWludDMyX3QgdmFsOwotCi0JaWYgKCFJU19FUlIoYmFkZHIpKSB7Ci0JCXZhbCA9IHJlYWRsKGJhZGRyICsgTUkyU19SWF9NT0RFX09GRlNFVCk7Ci0JCWlmIChzZF9saW5lIDwgNCkgewotCQkJdmFsID0gKHZhbCAmCi0JCQl+SFdJT19BVURJTzFfTUkyU19SWF9NT0RFX01JMlNfUlhfSTJTX0xJTkVfQk1TSykgfAotCQkJKHNkX2xpbmUgPDwKLQkJCUhXSU9fQVVESU8xX01JMlNfUlhfTU9ERV9NSTJTX1JYX0kyU19MSU5FX1NIRlQpOwotCQkJd3JpdGVsKHZhbCwgYmFkZHIgKyBNSTJTX1JYX01PREVfT0ZGU0VUKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgbWkyc19zZXRfaW5wdXRfbnVtX2NoYW5uZWxzKHN0cnVjdCBtaTJzX3N0YXRlICptaTJzLCB1aW50OF90IGRldl9pZCwKLQl1aW50OF90IGNoYW5uZWxzKQotewotCXZvaWQgX19pb21lbSAqYmFkZHIgPSBnZXRfYmFzZV9hZGRyKG1pMnMsIGRldl9pZCk7Ci0JdWludDMyX3QgdmFsOwotCi0JaWYgKCFJU19FUlIoYmFkZHIpKSB7Ci0JCXZhbCA9IHJlYWRsKGJhZGRyICsgTUkyU19SWF9NT0RFX09GRlNFVCk7Ci0JCWlmIChjaGFubmVscyA9PSBNSTJTX0NIQU5fTU9OT19SQVcpIHsKLQkJCXZhbCA9ICh2YWwgJgotCQkJfihIV0lPX0FVRElPMV9NSTJTX1JYX01PREVfTUkyU19SWF9TVEVSRU9fTU9ERV9CTVNLIHwKLQkJCUhXSU9fQVVESU8xX01JMlNfUlhfTU9ERV9NSTJTX1JYX0NPREVDX1BfTU9OT19CTVNLKSkgfAotCQkJKChNSTJTX1JYX01PREVfX01JMlNfUlhfU1RFUkVPX01PREVfX01PTk9fU0FNUExFIDw8Ci0JCQlIV0lPX0FVRElPMV9NSTJTX1JYX01PREVfTUkyU19SWF9TVEVSRU9fTU9ERV9TSEZUKSB8Ci0JCQkoTUkyU19SWF9NT0RFX19NSTJTX1JYX0NPREVDXzE2X01PTk9fTU9ERV9fUkFXIDw8Ci0JCQlIV0lPX0FVRElPMV9NSTJTX1JYX01PREVfTUkyU19SWF9DT0RFQ19QX01PTk9fU0hGVCkpOwotCQl9IGVsc2UgaWYgKGNoYW5uZWxzID09IE1JMlNfQ0hBTl9NT05PX1BBQ0tFRCkgewotCQkJdmFsID0gKHZhbCAmCi0JCQl+KEhXSU9fQVVESU8xX01JMlNfUlhfTU9ERV9NSTJTX1JYX1NURVJFT19NT0RFX0JNU0sgfAotCQkJSFdJT19BVURJTzFfTUkyU19SWF9NT0RFX01JMlNfUlhfQ09ERUNfUF9NT05PX0JNU0spKSB8Ci0JCQkoKE1JMlNfUlhfTU9ERV9fTUkyU19SWF9TVEVSRU9fTU9ERV9fTU9OT19TQU1QTEUgPDwKLQkJCUhXSU9fQVVESU8xX01JMlNfUlhfTU9ERV9NSTJTX1JYX1NURVJFT19NT0RFX1NIRlQpIHwKLQkJCShNSTJTX1JYX01PREVfX01JMlNfUlhfQ09ERUNfMTZfTU9OT19NT0RFX19QQUNLRUQgPDwKLQkJCUhXSU9fQVVESU8xX01JMlNfUlhfTU9ERV9NSTJTX1JYX0NPREVDX1BfTU9OT19TSEZUKSk7Ci0JCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gTUkyU19DSEFOX1NURVJFTykgewotCi0JCQlpZiAoZGV2X2lkID09IEhETUkpCi0JCQkJdmFsID0gKHZhbCAmCi0JCQl+KEhXSU9fQVVESU8xX01JMlNfUlhfTU9ERV9NSTJTX1JYX1NURVJFT19NT0RFX0JNU0sgfAotCQkJSFdJT19BVURJTzFfTUkyU19SWF9NT0RFX01JMlNfUlhfQ0hfVFlQRV9CTVNLKSkgfAotCQkJKChNSTJTX1JYX01PREVfX01JMlNfUlhfU1RFUkVPX01PREVfX1NURVJFT19TQU1QTEUgPDwKLQkJCUhXSU9fQVVESU8xX01JMlNfUlhfTU9ERV9NSTJTX1JYX1NURVJFT19NT0RFX1NIRlQpIHwKLQkJCShNSTJTX1JYX01PREVfX01JMlNfUlhfQ0hfVFlQRV9fMl9DSCA8PAotCQkJSFdJT19BVURJTzFfTUkyU19SWF9NT0RFX01JMlNfUlhfQ0hfVFlQRV9TSEZUKSk7Ci0KLQkJCWVsc2UKLQkJCQl2YWwgPSAodmFsICYKLQkJCX4oSFdJT19BVURJTzFfTUkyU19SWF9NT0RFX01JMlNfUlhfU1RFUkVPX01PREVfQk1TSyB8Ci0JCQlIV0lPX0FVRElPMV9NSTJTX1JYX01PREVfTUkyU19SWF9DSF9UWVBFX0JNU0spKSB8Ci0JCQkoKE1JMlNfUlhfTU9ERV9fTUkyU19SWF9TVEVSRU9fTU9ERV9fU1RFUkVPX1NBTVBMRSA8PAotCQkJSFdJT19BVURJTzFfTUkyU19SWF9NT0RFX01JMlNfUlhfU1RFUkVPX01PREVfU0hGVCkgfAotCQkJKE1JMlNfUlhfTU9ERV9fTUkyU19SWF9DT0RFQ18xNl9NT05PX01PREVfX1BBQ0tFRCA8PAotCQkJSFdJT19BVURJTzFfTUkyU19SWF9NT0RFX01JMlNfUlhfQ09ERUNfUF9NT05PX1NIRlQpIHwKLQkJCShNSTJTX1JYX01PREVfX01JMlNfUlhfQ0hfVFlQRV9fMl9DSCA8PAotCQkJSFdJT19BVURJTzFfTUkyU19SWF9NT0RFX01JMlNfUlhfQ0hfVFlQRV9TSEZUKSk7Ci0KLQotCQl9Ci0JCXdyaXRlbCh2YWwsIGJhZGRyICsgTUkyU19SWF9NT0RFX09GRlNFVCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBtaTJzX3NldF9pbnB1dF9jbGtfc3luY2goc3RydWN0IG1pMnNfc3RhdGUgKm1pMnMsIHVpbnQ4X3QgZGV2X2lkKQotewotCXZvaWQgX19pb21lbSAqYmFkZHIgPSBnZXRfYmFzZV9hZGRyKG1pMnMsIGRldl9pZCk7Ci0JdWludDMyX3QgdmFsOwotCi0JaWYgKCFJU19FUlIoYmFkZHIpKSB7Ci0JCXZhbCA9IHJlYWRsKGJhZGRyICsgTUkyU19SWF9NT0RFX09GRlNFVCk7Ci0JCXdyaXRlbCgKLQkJKCh2YWwgJgotCQl+SFdJT19BVURJTzFfTUkyU19SWF9NT0RFX01JMlNfUlhfRE1BX0FDS19TWU5DSF9FTl9CTVNLKSB8Ci0JCU1JMlNfUlhfTU9ERV9fTUkyU19SWF9ETUFfQUNLX1NZTkNIX0VOX19TWU5DX0VOQUJMRSksCi0JCWJhZGRyICsgTUkyU19SWF9NT0RFX09GRlNFVCk7Ci0JfQotfQotCi0KLXN0YXRpYyB1OCBudW1fb2ZfYml0c19zZXQodTggc2RfbGluZV9tYXNrKQotewotCXU4IG51bV9iaXRzX3NldCA9IDA7Ci0KLQl3aGlsZSAoc2RfbGluZV9tYXNrKSB7Ci0KLQkJaWYgKHNkX2xpbmVfbWFzayAmIDEpCi0JCQludW1fYml0c19zZXQrKzsKLQkJc2RfbGluZV9tYXNrID0gc2RfbGluZV9tYXNrID4+IDE7Ci0JfQotCXJldHVybiBudW1fYml0c19zZXQ7Ci19Ci0KLQotYm9vbCBtaTJzX3NldF9oZG1pX291dHB1dF9wYXRoKHVpbnQ4X3QgY2hhbm5lbHMsIHVpbnQ4X3Qgc2l6ZSwKLQkJdWludDhfdCBzZF9saW5lX21hc2spCi17Ci0JYm9vbCByZXRfdmFsID0gTUkyU19UUlVFOwotCXN0cnVjdCBtaTJzX3N0YXRlICptaTJzID0gJnRoZV9taTJzX3N0YXRlOwotCXU4IHNkX2xpbmUsIG51bV9vZl9zZF9saW5lcyA9IDA7Ci0Jdm9pZCBfX2lvbWVtICpiYWRkcjsKLQl1aW50MzJfdCB2YWw7Ci0KLQlwcl9kZWJ1ZygiJXM6IGNoYW5uZWxzID0gJXUgc2l6ZSA9ICV1IHNkX2xpbmVfbWFzayA9IDB4JXhcbiIsIF9fZnVuY19fLAotCQljaGFubmVscywgc2l6ZSwgc2RfbGluZV9tYXNrKTsKLQotCWlmICgoY2hhbm5lbHMgPT0gMCkgfHwgIChjaGFubmVscyA+IE1BWF9OVU1fQ0hBTk5FTFNfT1VUKSB8fAotCQkoKGNoYW5uZWxzICE9IDEpICYmIChjaGFubmVscyAlIDIgIT0gMCkpKSB7Ci0KLQkJcHJfZXJyKCIlczogaW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHMuIGNoYW5uZWxzID0gJXVcbiIsCi0JCQkJX19mdW5jX18sIGNoYW5uZWxzKTsKLQkJcmV0dXJuICBNSTJTX0ZBTFNFOwotCX0KLQotCXNkX2xpbmVfbWFzayAmPSAgTUkyU19TRF9MSU5FX01BU0s7Ci0KLQlpZiAoIXNkX2xpbmVfbWFzaykgewotCQlwcl9lcnIoIiVzOiBEaWQgbm90IHNldCBhbnkgZGF0YSBsaW5lcyB0byB1c2UgIgotCQkJIiBzZF9saW5lX21hc2sgPTB4JXhcbiIsIF9fZnVuY19fLCBzZF9saW5lX21hc2spOwotCQlyZXR1cm4gIE1JMlNfRkFMU0U7Ci0JfQotCi0JbXV0ZXhfbG9jaygmbWkycy0+bXV0ZXhfbG9jayk7Ci0JLyogUHV0IGRldmljZSBpbiByZXNldCAqLwotCW1pMnNfcmVzZXQobWkycywgSERNSSk7Ci0KLQltaTJzX21hc3RlcihtaTJzLCBIRE1JLCAxKTsKLQotCS8qIFNldCB3b3JkIHR5cGUgKi8KLQlpZiAoc2l6ZSA8PSBXVF9NQVgpCi0JCW1pMnNfc2V0X3dvcmRfdHlwZShtaTJzLCBIRE1JLCBzaXplKTsKLQllbHNlCi0JCXJldF92YWwgPSBNSTJTX0ZBTFNFOwotCi0JLyogRW5hYmxlIGNsb2NrIGNyb3NzaW5nIHN5bmNocm9uaXphdGlvbiBvZiBSRCBETUEgQUNLICovCi0JbWkyc19zZXRfb3V0cHV0X2Nsa19zeW5jaChtaTJzLCBIRE1JKTsKLQotCW1pMnNfc2V0X291dHB1dF9udW1fY2hhbm5lbHMobWkycywgSERNSSwgY2hhbm5lbHMpOwotCi0JbnVtX29mX3NkX2xpbmVzID0gbnVtX29mX2JpdHNfc2V0KHNkX2xpbmVfbWFzayk7Ci0JLypTZWNvbmQgYXJndW1lbnQgdG8gZmluZF9maXJzdF9iaXQgc2hvdWxkIGJlIG1heGltdW0gbnVtYmVyIG9mCi0JYml0Ki8KLQotCXNkX2xpbmUgPSBmaW5kX2ZpcnN0X2JpdCgodW5zaWduZWQgbG9uZyAqKSZzZF9saW5lX21hc2ssCi0JCQlzaXplb2Yoc2RfbGluZV9tYXNrKSAqIDgpOwotCXByX2RlYnVnKCJzZF9saW5lID0gJWRcbiIsIHNkX2xpbmUpOwotCi0JaWYgKGNoYW5uZWxzID09IDEpIHsKLQotCQlpZiAobnVtX29mX3NkX2xpbmVzICE9IDEpIHsKLQkJCXByX2VycigiJXM6IGZvciBvbmUgY2hhbm5lbCBvbmx5IG9uZSBTRCBsaW5lcyBpcyIKLQkJCQkiIG5lZWRlZC4gbnVtX29mX3NkX2xpbmVzID0gJXVcbiIsCi0JCQkJX19mdW5jX18sIG51bV9vZl9zZF9saW5lcyk7Ci0KLQkJCXJldF92YWwgPSBNSTJTX0ZBTFNFOwotCQkJZ290byBlcnJvcjsKLQkJfQotCi0JCWlmIChzZF9saW5lICE9IDApIHsKLQkJCXByX2VycigiJXM6IGZvciBvbmUgY2hhbm5lbCB0eCwgbmVlZCB0byB1c2UgU0RfMCAiCi0JCQkJCSJzZF9saW5lID0gJXVcbiIsIF9fZnVuY19fLCBzZF9saW5lKTsKLQotCQkJcmV0X3ZhbCA9IE1JMlNfRkFMU0U7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0KLQkJLyogRW5hYmxlIFNEIGxpbmUgMCBmb3IgVHggKG9ubHkgb3B0aW9uIGZvcgotCQkJICogbW9ubyBhdWRpbykKLQkJICovCi0JCW1pMnNfc2V0X3NkKG1pMnMsIEhETUksIE1JMlNfU0RfMF9FTl9NQVAgfCBNSTJTX1NEXzBfVFhfTUFQKTsKLQotCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gMikgewotCi0JCWlmIChudW1fb2Zfc2RfbGluZXMgIT0gMSkgewotCQkJcHJfZXJyKCIlczogZm9yIHR3byBjaGFubmVsIG9ubHkgb25lIFNEIGxpbmVzIGlzIgotCQkJCSIgbmVlZGVkLiBudW1fb2Zfc2RfbGluZXMgPSAldVxuIiwKLQkJCQlfX2Z1bmNfXywgbnVtX29mX3NkX2xpbmVzKTsKLQkJCXJldF92YWwgPSBNSTJTX0ZBTFNFOwotCQkJZ290byBlcnJvcjsKLQkJfQotCi0JCS8qIEVuYWJsZSBzaW5nbGUgU0QgbGluZSBmb3IgVHggKi8KLQkJbWkyc19zZXRfc2QobWkycywgSERNSSwgKE1JMlNfU0RfMF9FTl9NQVAgPDwgc2RfbGluZSkgfAotCQkJCShNSTJTX1NEXzBfVFhfTUFQIDw8IHNkX2xpbmUpKTsKLQotCQkvKiBTZXQgMi1jaGFubmVsIG1hcHBpbmcgKi8KLQkJbWkyc19zZXRfb3V0cHV0XzJjaF9tYXAobWkycywgSERNSSwgc2RfbGluZSk7Ci0KLQl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDQpIHsKLQotCQlpZiAobnVtX29mX3NkX2xpbmVzICE9IDIpIHsKLQkJCXByX2VycigiJXM6IGZvciA0IGNoYW5uZWxzIHR3byBTRCBsaW5lcyBhcmUiCi0JCQkJIiBuZWVkZWQuIG51bV9vZl9zZF9saW5lcyA9ICV1XFxuIiwKLQkJCQlfX2Z1bmNfXywgbnVtX29mX3NkX2xpbmVzKTsKLQkJCXJldF92YWwgPSBNSTJTX0ZBTFNFOwotCQkJZ290byBlcnJvcjsKLQkJfQotCi0JCWlmICgoc2RfbGluZV9tYXNrICYmIE1JMlNfU0RfMCkgJiYKLQkJCQkoc2RfbGluZV9tYXNrICYmIE1JMlNfU0RfMSkpIHsKLQotCQkJbWkyc19zZXRfc2QobWkycywgSERNSSwgKE1JMlNfU0RfMF9FTl9NQVAgfAotCQkJCU1JMlNfU0RfMV9FTl9NQVApIHwgKE1JMlNfU0RfMF9UWF9NQVAgfAotCQkJCU1JMlNfU0RfMV9UWF9NQVApKTsKLQkJCW1pMnNfc2V0X291dHB1dF80Y2hfbWFwKG1pMnMsIEhETUksIE1JMlNfRkFMU0UpOwotCi0JCX0gZWxzZSBpZiAoKHNkX2xpbmVfbWFzayAmJiBNSTJTX1NEXzIpICYmCi0JCQkJKHNkX2xpbmVfbWFzayAmJiBNSTJTX1NEXzMpKSB7Ci0KLQkJCW1pMnNfc2V0X3NkKG1pMnMsIEhETUksIChNSTJTX1NEXzJfRU5fTUFQIHwKLQkJCQlNSTJTX1NEXzNfRU5fTUFQKSB8IChNSTJTX1NEXzJfVFhfTUFQIHwKLQkJCQlNSTJTX1NEXzNfVFhfTUFQKSk7Ci0KLQkJCW1pMnNfc2V0X291dHB1dF80Y2hfbWFwKG1pMnMsIEhETUksIE1JMlNfVFJVRSk7Ci0JCX0gZWxzZSB7Ci0KLQkJCXByX2VycigiJXM6IGZvciA0IGNoYW5uZWxzIGludmFsaWQgU0QgbGluZXMgdXNhZ2UiCi0JCQkJIiBzZF9saW5lX21hc2sgPSAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBzZF9saW5lX21hc2spOwotCQkJcmV0X3ZhbCA9IE1JMlNfRkFMU0U7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JfSBlbHNlIGlmIChjaGFubmVscyA9PSA2KSB7Ci0KLQkJaWYgKG51bV9vZl9zZF9saW5lcyAhPSAzKSB7Ci0JCQlwcl9lcnIoIiVzOiBmb3IgNiBjaGFubmVscyB0aHJlZSBTRCBsaW5lcyBhcmUiCi0JCQkJIiBuZWVkZWQuIG51bV9vZl9zZF9saW5lcyA9ICV1XG4iLAotCQkJCV9fZnVuY19fLCBudW1fb2Zfc2RfbGluZXMpOwotCQkJcmV0X3ZhbCA9IE1JMlNfRkFMU0U7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0KLQkJaWYgKChzZF9saW5lX21hc2sgJiYgTUkyU19TRF8wKSAmJgotCQkJKHNkX2xpbmVfbWFzayAmJiBNSTJTX1NEXzEpICYmCi0JCQkoc2RfbGluZV9tYXNrICYmIE1JMlNfU0RfMikpIHsKLQotCQkJbWkyc19zZXRfc2QobWkycywgSERNSSwgKE1JMlNfU0RfMF9FTl9NQVAgfAotCQkJCU1JMlNfU0RfMV9FTl9NQVAgfCBNSTJTX1NEXzJfRU5fTUFQKSB8Ci0JCQkJKE1JMlNfU0RfMF9UWF9NQVAgfCBNSTJTX1NEXzFfVFhfTUFQIHwKLQkJCQlNSTJTX1NEXzJfVFhfTUFQKSk7Ci0KLQkJfSBlbHNlIGlmICgoc2RfbGluZV9tYXNrICYmIE1JMlNfU0RfMSkgJiYKLQkJCQkoc2RfbGluZV9tYXNrICYmIE1JMlNfU0RfMikgJiYKLQkJCQkoc2RfbGluZV9tYXNrICYmIE1JMlNfU0RfMykpIHsKLQotCQkJbWkyc19zZXRfc2QobWkycywgSERNSSwgKE1JMlNfU0RfMV9FTl9NQVAgfAotCQkJCU1JMlNfU0RfMl9FTl9NQVAgfCBNSTJTX1NEXzNfRU5fTUFQKSB8Ci0JCQkJKE1JMlNfU0RfMV9UWF9NQVAgfCBNSTJTX1NEXzJfVFhfTUFQIHwKLQkJCQlNSTJTX1NEXzNfVFhfTUFQKSk7Ci0KLQkJfSBlbHNlIHsKLQotCQkJcHJfZXJyKCIlczogZm9yIDYgY2hhbm5lbHMgaW52YWxpZCBTRCBsaW5lcyB1c2FnZSIKLQkJCQkiIHNkX2xpbmVfbWFzayA9IDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIHNkX2xpbmVfbWFzayk7Ci0JCQlyZXRfdmFsID0gTUkyU19GQUxTRTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDgpIHsKLQotCQlpZiAobnVtX29mX3NkX2xpbmVzICE9IDQpIHsKLQkJCXByX2VycigiJXM6IGZvciA4IGNoYW5uZWxzIGZvdXIgU0QgbGluZXMgYXJlIgotCQkJCSIgbmVlZGVkLiBudW1fb2Zfc2RfbGluZXMgPSAldVxuIiwKLQkJCQlfX2Z1bmNfXywgbnVtX29mX3NkX2xpbmVzKTsKLQkJCXJldF92YWwgPSBNSTJTX0ZBTFNFOwotCQkJZ290byBlcnJvcjsKLQkJfQotCi0JCW1pMnNfc2V0X3NkKG1pMnMsIEhETUksIChNSTJTX1NEXzBfRU5fTUFQIHwKLQkJCU1JMlNfU0RfMV9FTl9NQVAgfCBNSTJTX1NEXzJfRU5fTUFQIHwKLQkJCU1JMlNfU0RfM19FTl9NQVApIHwgKE1JMlNfU0RfMF9UWF9NQVAgfAotCQkJTUkyU19TRF8xX1RYX01BUCB8IE1JMlNfU0RfMl9UWF9NQVAgfAotCQkJTUkyU19TRF8zX1RYX01BUCkpOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgbnVtYmVyIGNoYW5uZWxzID0gJXVcbiIsCi0JCQkJX19mdW5jX18sIGNoYW5uZWxzKTsKLQkJCXJldF92YWwgPSBNSTJTX0ZBTFNFOwotCQkJZ290byBlcnJvcjsKLQl9Ci0KLQliYWRkciA9IGdldF9iYXNlX2FkZHIobWkycywgSERNSSk7Ci0KLQl2YWwgPSByZWFkbChiYWRkciArIE1JMlNfTU9ERV9PRkZTRVQpOwotCXByX2RlYnVnKCIlcygpOiBNSTJTX01PREUgPSAweCV4XG4iLCBfX2Z1bmNfXywgdmFsKTsKLQotCXZhbCA9IHJlYWRsKGJhZGRyICsgTUkyU19UWF9NT0RFX09GRlNFVCk7Ci0JcHJfZGVidWcoIiVzKCk6IE1JMlNfVFhfTU9ERSA9IDB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOwotCi0KLWVycm9yOgotCS8qIFJlbGVhc2UgZGV2aWNlIGZyb20gcmVzZXQgKi8KLQltaTJzX3JlbGVhc2UobWkycywgSERNSSk7Ci0KLQltdXRleF91bmxvY2soJm1pMnMtPm11dGV4X2xvY2spOwotCW1iKCk7Ci0JcmV0dXJuIHJldF92YWw7Ci19Ci1FWFBPUlRfU1lNQk9MKG1pMnNfc2V0X2hkbWlfb3V0cHV0X3BhdGgpOwotCi1ib29sIG1pMnNfc2V0X2hkbWlfaW5wdXRfcGF0aCh1aW50OF90IGNoYW5uZWxzLCB1aW50OF90IHNpemUsCi0JCXVpbnQ4X3Qgc2RfbGluZV9tYXNrKQotewotCWJvb2wgcmV0X3ZhbCA9IE1JMlNfVFJVRTsKLQlzdHJ1Y3QgbWkyc19zdGF0ZSAqbWkycyA9ICZ0aGVfbWkyc19zdGF0ZTsKLQl1OCBzZF9saW5lLCBudW1fb2Zfc2RfbGluZXMgPSAwOwotCXZvaWQgX19pb21lbSAqYmFkZHI7Ci0JdWludDMyX3QgdmFsOwotCi0JcHJfZGVidWcoIiVzOiBjaGFubmVscyA9ICV1IHNpemUgPSAldSBzZF9saW5lX21hc2sgPSAweCV4XG4iLCBfX2Z1bmNfXywKLQkJY2hhbm5lbHMsIHNpemUsIHNkX2xpbmVfbWFzayk7Ci0KLQlpZiAoKGNoYW5uZWxzICE9IDEpICYmIChjaGFubmVscyAhPSBNQVhfTlVNX0NIQU5ORUxTX0lOKSkgewotCi0JCXByX2VycigiJXM6IGludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzLiBjaGFubmVscyA9ICV1XG4iLAotCQkJCV9fZnVuY19fLCBjaGFubmVscyk7Ci0JCXJldHVybiAgTUkyU19GQUxTRTsKLQl9Ci0KLQlpZiAoc2l6ZSA+IFdUX01BWCkgewotCi0JCXByX2VycigiJXM6IG1pMnMgd29yZCBzaXplIGNhbiBub3QgYmUgZ3JlYXRlciB0aGFuIDMyIGJpdHNcbiIsCi0JCQkJX19mdW5jX18pOwotCQlyZXR1cm4gTUkyU19GQUxTRTsKLQl9Ci0KLQlzZF9saW5lX21hc2sgJj0gIE1JMlNfU0RfTElORV9NQVNLOwotCi0JaWYgKCFzZF9saW5lX21hc2spIHsKLQkJcHJfZXJyKCIlczogRGlkIG5vdCBzZXQgYW55IGRhdGEgbGluZXMgdG8gdXNlICIKLQkJCSIgc2RfbGluZV9tYXNrID0weCV4XG4iLCBfX2Z1bmNfXywgc2RfbGluZV9tYXNrKTsKLQkJcmV0dXJuICBNSTJTX0ZBTFNFOwotCX0KLQotCW51bV9vZl9zZF9saW5lcyA9IG51bV9vZl9iaXRzX3NldChzZF9saW5lX21hc2spOwotCi0JaWYgKG51bV9vZl9zZF9saW5lcyAhPSAxKSB7Ci0JCXByX2VycigiJXM6IGZvciB0d28gY2hhbm5lbCBpbnB1dCBvbmx5IG9uZSBTRCBsaW5lcyBpcyIKLQkJCSIgbmVlZGVkLiBudW1fb2Zfc2RfbGluZXMgPSAldSBzZF9saW5lX21hc2sgPSAweCV4XG4iLAotCQkJX19mdW5jX18sIG51bV9vZl9zZF9saW5lcywgc2RfbGluZV9tYXNrKTsKLQkJcmV0dXJuIE1JMlNfRkFMU0U7Ci0JfQotCi0JLypTZWNvbmQgYXJndW1lbnQgdG8gZmluZF9maXJzdF9iaXQgc2hvdWxkIGJlIG1heGltdW0gbnVtYmVyIG9mCi0JYml0cyBpbnRlcmVzdGVkKi8KLQlzZF9saW5lID0gZmluZF9maXJzdF9iaXQoKHVuc2lnbmVkIGxvbmcgKikmc2RfbGluZV9tYXNrLAotCQkJc2l6ZW9mKHNkX2xpbmVfbWFzaykgKiA4KTsKLQlwcl9kZWJ1Zygic2RfbGluZSA9ICVkXG4iLCBzZF9saW5lKTsKLQotCS8qIEVuc3VyZSBzZF9saW5lIHBhcmFtZXRlciBpcyB2YWxpZCAoMC1tYXgpICovCi0JaWYgKHNkX2xpbmUgPiBNQVhfU0RfTElORVMpIHsKLQkJcHJfZXJyKCIlczogTGluZSBudW1iZXIgY2FuIG5vdCBiZSBncmVhdGVyIHRoYW4gPSAldVxuIiwKLQkJCV9fZnVuY19fLCBNQVhfU0RfTElORVMpOwotCQlyZXR1cm4gTUkyU19GQUxTRTsKLQl9Ci0KLQltdXRleF9sb2NrKCZtaTJzLT5tdXRleF9sb2NrKTsKLQkvKiBQdXQgZGV2aWNlIGluIHJlc2V0ICovCi0JbWkyc19yZXNldChtaTJzLCBIRE1JKTsKLQotCW1pMnNfbWFzdGVyKG1pMnMsIEhETUksIDEpOwotCi0JLyogU2V0IHdvcmQgdHlwZSAqLwotCW1pMnNfc2V0X3dvcmRfdHlwZShtaTJzLCBIRE1JLCBzaXplKTsKLQotCS8qIEVuYWJsZSBjbG9jayBjcm9zc2luZyBzeW5jaHJvbml6YXRpb24gb2YgV1IgRE1BIEFDSyAqLwotCW1pMnNfc2V0X2lucHV0X2Nsa19zeW5jaChtaTJzLCBIRE1JKTsKLQotCS8qIEVuc3VyZSBjaGFubmVscyBwYXJhbWV0ZXIgaXMgdmFsaWQgKG5vbi16ZXJvLCBsZXNzIHRoYW4gbWF4LAotCSAqIGFuZCBldmVuIG9yIG1vbm8pCi0JICovCi0JbWkyc19zZXRfaW5wdXRfbnVtX2NoYW5uZWxzKG1pMnMsIEhETUksIGNoYW5uZWxzKTsKLQotCW1pMnNfc2V0X2lucHV0X3NkX2xpbmUobWkycywgSERNSSwgc2RfbGluZSk7Ci0KLQltaTJzX3NldF9zZChtaTJzLCBIRE1JLCAoTUkyU19TRF8wX0VOX01BUCA8PCBzZF9saW5lKSk7Ci0KLQliYWRkciA9IGdldF9iYXNlX2FkZHIobWkycywgSERNSSk7Ci0KLQl2YWwgPSByZWFkbChiYWRkciArIE1JMlNfTU9ERV9PRkZTRVQpOwotCXByX2RlYnVnKCIlcygpOiBNSTJTX01PREUgPSAweCV4XG4iLCBfX2Z1bmNfXywgdmFsKTsKLQotCXZhbCA9IHJlYWRsKGJhZGRyICsgTUkyU19SWF9NT0RFX09GRlNFVCk7Ci0JcHJfZGVidWcoIiVzKCk6IE1JMlNfUlhfTU9ERSA9IDB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOwotCi0JLyogUmVsZWFzZSBkZXZpY2UgZnJvbSByZXNldCAqLwotCW1pMnNfcmVsZWFzZShtaTJzLCBIRE1JKTsKLQotCW11dGV4X3VubG9jaygmbWkycy0+bXV0ZXhfbG9jayk7Ci0JbWIoKTsKLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLUVYUE9SVF9TWU1CT0wobWkyc19zZXRfaGRtaV9pbnB1dF9wYXRoKTsKLQotYm9vbCBtaTJzX3NldF9jb2RlY19vdXRwdXRfcGF0aCh1aW50OF90IGNoYW5uZWxzLCB1aW50OF90IHNpemUpCi17Ci0JYm9vbCByZXRfdmFsID0gTUkyU19UUlVFOwotCXN0cnVjdCBtaTJzX3N0YXRlICptaTJzID0gJnRoZV9taTJzX3N0YXRlOwotCi0JbXV0ZXhfbG9jaygmbWkycy0+bXV0ZXhfbG9jayk7Ci0JLyogUHV0IGRldmljZSBpbiByZXNldCAqLwotCW1pMnNfcmVzZXQobWkycywgQ09ERUNfVFgpOwotCi0JbWkyc19tYXN0ZXIobWkycywgQ09ERUNfVFgsIDEpOwotCi0JLyogRW5hYmxlIGNsb2NrIGNyb3NzaW5nIHN5bmNocm9uaXphdGlvbiBvZiBSRCBETUEgQUNLICovCi0JbWkyc19zZXRfb3V0cHV0X2Nsa19zeW5jaChtaTJzLCBDT0RFQ19UWCk7Ci0KLQkvKiBTZXQgd29yZCB0eXBlICovCi0JaWYgKHNpemUgPD0gV1RfTUFYKQotCQltaTJzX3NldF93b3JkX3R5cGUobWkycywgQ09ERUNfVFgsIHNpemUpOwotCWVsc2UKLQkJcmV0X3ZhbCA9IE1JMlNfRkFMU0U7Ci0KLQltaTJzX3NldF9vdXRwdXRfbnVtX2NoYW5uZWxzKG1pMnMsIENPREVDX1RYLCBjaGFubmVscyk7Ci0KLQkvKiBFbmFibGUgU0QgbGluZSAqLwotCW1pMnNfc2V0X3NkKG1pMnMsIENPREVDX1RYLCBNSTJTX1NEXzBfRU5fTUFQIHwgTUkyU19TRF8wX1RYX01BUCk7Ci0KLQkvKiBSZWxlYXNlIGRldmljZSBmcm9tIHJlc2V0ICovCi0JbWkyc19yZWxlYXNlKG1pMnMsIENPREVDX1RYKTsKLQotCW11dGV4X3VubG9jaygmbWkycy0+bXV0ZXhfbG9jayk7Ci0JbWIoKTsKLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLUVYUE9SVF9TWU1CT0wobWkyc19zZXRfY29kZWNfb3V0cHV0X3BhdGgpOwotCi1ib29sIG1pMnNfc2V0X2NvZGVjX2lucHV0X3BhdGgodWludDhfdCBjaGFubmVscywgdWludDhfdCBzaXplKQotewotCWJvb2wgcmV0X3ZhbCA9IE1JMlNfVFJVRTsKLQlzdHJ1Y3QgbWkyc19zdGF0ZSAqbWkycyA9ICZ0aGVfbWkyc19zdGF0ZTsKLQotCW11dGV4X2xvY2soJnRoZV9taTJzX3N0YXRlLm11dGV4X2xvY2spOwotCS8qIFB1dCBkZXZpY2UgaW4gcmVzZXQgKi8KLQltaTJzX3Jlc2V0KG1pMnMsIENPREVDX1JYKTsKLQotCW1pMnNfbWFzdGVyKG1pMnMsIENPREVDX1JYLCAxKTsKLQotCS8qIEVuYWJsZSBjbG9jayBjcm9zc2luZyBzeW5jaHJvbml6YXRpb24gb2YgV1IgRE1BIEFDSyAqLwotCW1pMnNfc2V0X2lucHV0X2Nsa19zeW5jaChtaTJzLCBDT0RFQ19SWCk7Ci0KLQkvKiBTZXQgd29yZCB0eXBlICovCi0JaWYgKHNpemUgPD0gV1RfTUFYKQotCQltaTJzX3NldF93b3JkX3R5cGUobWkycywgQ09ERUNfUlgsIHNpemUpOwotCWVsc2UKLQkJcmV0X3ZhbCA9IE1JMlNfRkFMU0U7Ci0KLQltaTJzX3NldF9pbnB1dF9udW1fY2hhbm5lbHMobWkycywgQ09ERUNfUlgsIGNoYW5uZWxzKTsKLQotCS8qIEVuYWJsZSBTRCBsaW5lICovCi0JbWkyc19zZXRfc2QobWkycywgQ09ERUNfUlgsIE1JMlNfU0RfMF9FTl9NQVApOwotCi0JLyogUmVsZWFzZSBkZXZpY2UgZnJvbSByZXNldCAqLwotCW1pMnNfcmVsZWFzZShtaTJzLCBDT0RFQ19SWCk7Ci0KLQltdXRleF91bmxvY2soJm1pMnMtPm11dGV4X2xvY2spOwotCW1iKCk7Ci0JcmV0dXJuIHJldF92YWw7Ci19Ci1FWFBPUlRfU1lNQk9MKG1pMnNfc2V0X2NvZGVjX2lucHV0X3BhdGgpOwotCi0KLXN0YXRpYyBpbnQgbWkyc19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHJlc291cmNlICptZW1fc3JjOwotCi0JbWVtX3NyYyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJoZG1pIik7Ci0JaWYgKCFtZW1fc3JjKSB7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBlcnJvcl9oZG1pOwotCX0KLQl0aGVfbWkyc19zdGF0ZS5taTJzX2hkbWlfYmFzZSA9IGlvcmVtYXAobWVtX3NyYy0+c3RhcnQsCi0JCShtZW1fc3JjLT5lbmQgLSBtZW1fc3JjLT5zdGFydCkgKyAxKTsKLQlpZiAoIXRoZV9taTJzX3N0YXRlLm1pMnNfaGRtaV9iYXNlKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9oZG1pOwotCX0KLQltZW1fc3JjID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LAotCQlJT1JFU09VUkNFX01FTSwgImNvZGVjX3J4Iik7Ci0JaWYgKCFtZW1fc3JjKSB7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBlcnJvcl9jb2RlY19yeDsKLQl9Ci0JdGhlX21pMnNfc3RhdGUubWkyc19yeF9iYXNlID0gaW9yZW1hcChtZW1fc3JjLT5zdGFydCwKLQkJKG1lbV9zcmMtPmVuZCAtIG1lbV9zcmMtPnN0YXJ0KSArIDEpOwotCWlmICghdGhlX21pMnNfc3RhdGUubWkyc19yeF9iYXNlKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9jb2RlY19yeDsKLQl9Ci0JbWVtX3NyYyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKLQkJSU9SRVNPVVJDRV9NRU0sICJjb2RlY190eCIpOwotCWlmICghbWVtX3NyYykgewotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyb3JfY29kZWNfdHg7Ci0JfQotCXRoZV9taTJzX3N0YXRlLm1pMnNfdHhfYmFzZSA9IGlvcmVtYXAobWVtX3NyYy0+c3RhcnQsCi0JCShtZW1fc3JjLT5lbmQgLSBtZW1fc3JjLT5zdGFydCkgKyAxKTsKLQlpZiAoIXRoZV9taTJzX3N0YXRlLm1pMnNfdHhfYmFzZSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfY29kZWNfdHg7Ci0JfQotCW11dGV4X2luaXQoJnRoZV9taTJzX3N0YXRlLm11dGV4X2xvY2spOwotCi0JcmV0dXJuIHJjOwotCi1lcnJvcl9jb2RlY190eDoKLQlpb3VubWFwKHRoZV9taTJzX3N0YXRlLm1pMnNfcnhfYmFzZSk7Ci1lcnJvcl9jb2RlY19yeDoKLQlpb3VubWFwKHRoZV9taTJzX3N0YXRlLm1pMnNfaGRtaV9iYXNlKTsKLWVycm9yX2hkbWk6Ci0JcmV0dXJuIHJjOwotCi19Ci0KLXN0YXRpYyBpbnQgbWkyc19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpb3VubWFwKHRoZV9taTJzX3N0YXRlLm1pMnNfdHhfYmFzZSk7Ci0JaW91bm1hcCh0aGVfbWkyc19zdGF0ZS5taTJzX3J4X2Jhc2UpOwotCWlvdW5tYXAodGhlX21pMnNfc3RhdGUubWkyc19oZG1pX2Jhc2UpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtaTJzX2RyaXZlciA9IHsKLQkucHJvYmUgPSBtaTJzX3Byb2JlLAotCS5yZW1vdmUgPSBtaTJzX3JlbW92ZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtaTJzIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1pMnNfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1pMnNfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG1pMnNfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtaTJzX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KG1pMnNfaW5pdCk7Ci1tb2R1bGVfZXhpdChtaTJzX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1TTSBNSTJTIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9tcDNfZnVuY3MuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvbXAzX2Z1bmNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NTdlNWMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9tcDNfZnVuY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotCi0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRwcG1zZy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBsYXljbWRpLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcGxheW1zZy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRwcC5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9jb2RlY191dGlscy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9tcDNfZnVuY3MuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLWxvbmcgbXAzX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlNTV9EQkcoIm1wM19pb2N0bCgpIGNtZCA9ICVkXGIiLCBjbWQpOwotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXZvaWQgYXVkcHBfY21kX2NmZ19tcDNfcGFyYW1zKHN0cnVjdCBhdWRpbyAqYXVkaW8pCi17Ci0Jc3RydWN0IGF1ZHBwX2NtZF9jZmdfYWRlY19wYXJhbXNfbXAzIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JY21kLmNvbW1vbi5jbWRfaWQgPSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TOwotCWNtZC5jb21tb24ubGVuZ3RoID0gQVVEUFBfQ01EX0NGR19BREVDX1BBUkFNU19NUDNfTEVOOwotCWNtZC5jb21tb24uZGVjX2lkID0gYXVkaW8tPmRlY19pZDsKLQljbWQuY29tbW9uLmlucHV0X3NhbXBsaW5nX2ZyZXF1ZW5jeSA9IGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGU7Ci0KLQlhdWRwcF9zZW5kX3F1ZXVlMigmY21kLCBzaXplb2YoY21kKSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL3BjbV9mdW5jcy5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9wY21fZnVuY3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2YjcxZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL3BjbV9mdW5jcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLQotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9xZHNwNWF1ZHBwbXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3Fkc3A1YXVkcGxheWNtZGkuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvcWRzcDVhdWRwbGF5bXNnLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZHBwLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2NvZGVjX3V0aWxzLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3BjbV9mdW5jcy5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLQotbG9uZyBwY21faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCU1NX0RCRygicGNtX2lvY3RsKCkgY21kID0gJWRcbiIsIGNtZCk7Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotdm9pZCBhdWRwcF9jbWRfY2ZnX3BjbV9wYXJhbXMoc3RydWN0IGF1ZGlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkcHBfY21kX2NmZ19hZGVjX3BhcmFtc193YXYgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuY29tbW9uLmNtZF9pZCA9IEFVRFBQX0NNRF9DRkdfQURFQ19QQVJBTVM7Ci0JY21kLmNvbW1vbi5sZW5ndGggPSBBVURQUF9DTURfQ0ZHX0FERUNfUEFSQU1TX1dBVl9MRU4gPj4gMTsKLQljbWQuY29tbW9uLmRlY19pZCA9IGF1ZGlvLT5kZWNfaWQ7Ci0JY21kLmNvbW1vbi5pbnB1dF9zYW1wbGluZ19mcmVxdWVuY3kgPSBhdWRpby0+b3V0X3NhbXBsZV9yYXRlOwotCWNtZC5zdGVyZW9fY2ZnID0gYXVkaW8tPm91dF9jaGFubmVsX21vZGU7Ci0JY21kLnBjbV93aWR0aCA9IGF1ZGlvLT5vdXRfYml0czsKLQljbWQuc2lnbiA9IDA7Ci0JYXVkcHBfc2VuZF9xdWV1ZTIoJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9zbmRkZXZfZGF0YV9tYXJpbWJhLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL3NuZGRldl9kYXRhX21hcmltYmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExY2RiMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL3NuZGRldl9kYXRhX21hcmltYmEuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MzcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9tc20tYWRpZS1jb2RlYy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvc25kZGV2X2ljb2RlYy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9tYXJpbWJhX3Byb2ZpbGUuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXV4X3BjbS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9zbmRkZXZfZWNvZGVjLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2Rldl9jdGwuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvc25kZGV2X3ZpcnR1YWwuaD4KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvc25kZGV2X21pMnMuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvbWkycy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19hY2RiX2RlZi5oPgotCi0vKiBkZWZpbmUgdGhlIHZhbHVlIGZvciBCVF9TQ08gKi8KLSNkZWZpbmUgQlRfU0NPX1BDTV9DVExfVkFMIChQQ01fQ1RMX19SUENNX1dJRFRIX19MSU5FQVJfViB8XAotCQkJCVBDTV9DVExfX1RQQ01fV0lEVEhfX0xJTkVBUl9WKQotI2RlZmluZSBCVF9TQ09fREFUQV9GT1JNQVRfUEFERElORyAoREFUQV9GT1JNQVRfUEFERElOR19JTkZPX19SUENNX0ZPUk1BVF9WIHxcCi0JCQkJREFUQV9GT1JNQVRfUEFERElOR19JTkZPX19UUENNX0ZPUk1BVF9WKQotI2RlZmluZSBCVF9TQ09fQVVYX0NPREVDX0lOVEYgICBBVVhfQ09ERUNfSU5URl9DVExfX1BDTUlOVEZfREFUQV9FTl9WCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2hzZWRfY29uZmlnOwotc3RhdGljIHZvaWQgc25kZGV2X2hzZWRfY29uZmlnX21vZGlmeV9zZXR0aW5nKGludCB0eXBlKTsKLXN0YXRpYyB2b2lkIHNuZGRldl9oc2VkX2NvbmZpZ19yZXN0b3JlX3NldHRpbmcodm9pZCk7Ci0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IGllYXJwaWVjZV80OEtIel9vc3IyNTZfYWN0aW9uc1tdID0KLQlIQU5EU0VUX1JYXzQ4MDAwX09TUl8yNTY7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaWVhcnBpZWNlX3NldHRpbmdzW10gPSB7Ci0JewotCQkuZnJlcV9wbGFuID0gNDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaWVhcnBpZWNlXzQ4S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpZWFycGllY2VfNDhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpZWFycGllY2VfcHJvZmlsZSA9IHsKLQkucGF0aF90eXBlID0gQURJRV9DT0RFQ19SWCwKLQkuc2V0dGluZ3MgPSBpZWFycGllY2Vfc2V0dGluZ3MsCi0JLnNldHRpbmdfc3ogPSBBUlJBWV9TSVpFKGllYXJwaWVjZV9zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSBzbmRkZXZfaWVhcnBpZWNlX2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9SWCB8IFNORERFVl9DQVBfVk9JQ0UpLAotCS5uYW1lID0gImhhbmRzZXRfcngiLAotCS5jb3BwX2lkID0gMCwKLQkuYWNkYl9pZCA9IEFDREJfSURfSEFORFNFVF9TUEtSLAotCS5wcm9maWxlID0gJmllYXJwaWVjZV9wcm9maWxlLAotCS5jaGFubmVsX21vZGUgPSAxLAotCS5wbWN0bF9pZCA9IE5VTEwsCi0JLnBtY3RsX2lkX3N6ID0gMCwKLQkuZGVmYXVsdF9zYW1wbGVfcmF0ZSA9IDQ4MDAwLAotCS5wYW1wX29uID0gTlVMTCwKLQkucGFtcF9vZmYgPSBOVUxMLAotCS5wcm9wZXJ0eSA9IFNJREVfVE9ORV9NQVNLLAotCS5tYXhfdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAtMjAwLAotCS5taW5fdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAtMTcwMCwKLQkubWF4X3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gLTIwMCwKLQkubWluX3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gLTE3MDAKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zbV9pZWFycGllY2VfZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl9pY29kZWMiLAotCS5pZCA9IDAsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2llYXJwaWVjZV9kYXRhIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgaW1pY184S0h6X29zcjI1Nl9hY3Rpb25zW10gPQotCUhBTkRTRVRfVFhfODAwMF9PU1JfMjU2OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgaW1pY18xNktIel9vc3IyNTZfYWN0aW9uc1tdID0KLQlIQU5EU0VUX1RYXzE2MDAwX09TUl8yNTY7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdCBpbWljXzQ4S0h6X29zcjI1Nl9hY3Rpb25zW10gPQotCUhBTkRTRVRfVFhfNDgwMDBfT1NSXzI1NjsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2h3c2V0dGluZ19lbnRyeSBpbWljX3NldHRpbmdzW10gPSB7Ci0JewotCQkuZnJlcV9wbGFuID0gODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpbWljXzhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGltaWNfOEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfSwKLQl7Ci0JCS5mcmVxX3BsYW4gPSAxNjAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpbWljXzE2S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpbWljXzE2S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9LAotCXsKLQkJLmZyZXFfcGxhbiA9IDQ4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGltaWNfNDhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGltaWNfNDhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpbWljX3Byb2ZpbGUgPSB7Ci0JLnBhdGhfdHlwZSA9IEFESUVfQ09ERUNfVFgsCi0JLnNldHRpbmdzID0gaW1pY19zZXR0aW5ncywKLQkuc2V0dGluZ19zeiA9IEFSUkFZX1NJWkUoaW1pY19zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgZW51bSBoc2VkX2NvbnRyb2xsZXIgaW1pY19wbWN0bF9pZFtdID0ge1BNX0hTRURfQ09OVFJPTExFUl8wfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgc25kZGV2X2ltaWNfZGF0YSA9IHsKLQkuY2FwYWJpbGl0eSA9IChTTkRERVZfQ0FQX1RYIHwgU05EREVWX0NBUF9WT0lDRSksCi0JLm5hbWUgPSAiaGFuZHNldF90eCIsCi0JLmNvcHBfaWQgPSAwLAotCS5hY2RiX2lkID0gQUNEQl9JRF9IQU5EU0VUX01JQywKLQkucHJvZmlsZSA9ICZpbWljX3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IDEsCi0JLnBtY3RsX2lkID0gaW1pY19wbWN0bF9pZCwKLQkucG1jdGxfaWRfc3ogPSBBUlJBWV9TSVpFKGltaWNfcG1jdGxfaWQpLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gNDgwMDAsCi0JLnBhbXBfb24gPSBOVUxMLAotCS5wYW1wX29mZiA9IE5VTEwsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21faW1pY19kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X2ljb2RlYyIsCi0JLmlkID0gMSwKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfaW1pY19kYXRhIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgaWhzX3N0ZXJlb19yeF80OEtIel9vc3IyNTZfYWN0aW9uc1tdID0KLQlIRUFEU0VUX1NURVJFT19SWF9MRUdBQ1lfNDgwMDBfT1NSXzI1NjsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2h3c2V0dGluZ19lbnRyeSBpaHNfc3RlcmVvX3J4X3NldHRpbmdzW10gPSB7Ci0JewotCQkuZnJlcV9wbGFuID0gNDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaWhzX3N0ZXJlb19yeF80OEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaWhzX3N0ZXJlb19yeF80OEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2Rldl9wcm9maWxlIGloc19zdGVyZW9fcnhfcHJvZmlsZSA9IHsKLQkucGF0aF90eXBlID0gQURJRV9DT0RFQ19SWCwKLQkuc2V0dGluZ3MgPSBpaHNfc3RlcmVvX3J4X3NldHRpbmdzLAotCS5zZXR0aW5nX3N6ID0gQVJSQVlfU0laRShpaHNfc3RlcmVvX3J4X3NldHRpbmdzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhIHNuZGRldl9paHNfc3RlcmVvX3J4X2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9SWCB8IFNORERFVl9DQVBfVk9JQ0UpLAotCS5uYW1lID0gImhlYWRzZXRfc3RlcmVvX3J4IiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX0hFQURTRVRfU1BLUl9TVEVSRU8sCi0JLnByb2ZpbGUgPSAmaWhzX3N0ZXJlb19yeF9wcm9maWxlLAotCS5jaGFubmVsX21vZGUgPSAyLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gNDgwMDAsCi0JLnBhbXBfb24gPSBOVUxMLAotCS5wYW1wX29mZiA9IE5VTEwsCi0JLnByb3BlcnR5ID0gU0lERV9UT05FX01BU0ssCi0JLm1heF92b2ljZV9yeF92b2xbVk9DX05CX0lOREVYXSA9IC03MDAsCi0JLm1pbl92b2ljZV9yeF92b2xbVk9DX05CX0lOREVYXSA9IC0yMjAwLAotCS5tYXhfdm9pY2Vfcnhfdm9sW1ZPQ19XQl9JTkRFWF0gPSAtOTAwLAotCS5taW5fdm9pY2Vfcnhfdm9sW1ZPQ19XQl9JTkRFWF0gPSAtMjQwMAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXNtX2loc19zdGVyZW9fcnhfZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl9pY29kZWMiLAotCS5pZCA9IDIsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2loc19zdGVyZW9fcnhfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IGloc19tb25vX3J4XzQ4S0h6X29zcjI1Nl9hY3Rpb25zW10gPQotCUhFQURTRVRfUlhfTEVHQUNZXzQ4MDAwX09TUl8yNTY7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaWhzX21vbm9fcnhfc2V0dGluZ3NbXSA9IHsKLQl7Ci0JCS5mcmVxX3BsYW4gPSA0ODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpaHNfbW9ub19yeF80OEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaWhzX21vbm9fcnhfNDhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpaHNfbW9ub19yeF9wcm9maWxlID0gewotCS5wYXRoX3R5cGUgPSBBRElFX0NPREVDX1JYLAotCS5zZXR0aW5ncyA9IGloc19tb25vX3J4X3NldHRpbmdzLAotCS5zZXR0aW5nX3N6ID0gQVJSQVlfU0laRShpaHNfbW9ub19yeF9zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSBzbmRkZXZfaWhzX21vbm9fcnhfZGF0YSA9IHsKLQkuY2FwYWJpbGl0eSA9IChTTkRERVZfQ0FQX1JYIHwgU05EREVWX0NBUF9WT0lDRSksCi0JLm5hbWUgPSAiaGVhZHNldF9tb25vX3J4IiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX0hFQURTRVRfU1BLUl9NT05PLAotCS5wcm9maWxlID0gJmloc19tb25vX3J4X3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IDEsCi0JLmRlZmF1bHRfc2FtcGxlX3JhdGUgPSA0ODAwMCwKLQkucGFtcF9vbiA9IE5VTEwsCi0JLnBhbXBfb2ZmID0gTlVMTCwKLQkucHJvcGVydHkgPSBTSURFX1RPTkVfTUFTSywKLQkubWF4X3ZvaWNlX3J4X3ZvbFtWT0NfTkJfSU5ERVhdID0gLTcwMCwKLQkubWluX3ZvaWNlX3J4X3ZvbFtWT0NfTkJfSU5ERVhdID0gLTIyMDAsCi0JLm1heF92b2ljZV9yeF92b2xbVk9DX1dCX0lOREVYXSA9IC05MDAsCi0JLm1pbl92b2ljZV9yeF92b2xbVk9DX1dCX0lOREVYXSA9IC0yNDAwLAotCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21faWhzX21vbm9fcnhfZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl9pY29kZWMiLAotCS5pZCA9IDMsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2loc19tb25vX3J4X2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdCBpaHNfZmZhX3N0ZXJlb19yeF80OEtIel9vc3IyNTZfYWN0aW9uc1tdID0KLQlIRUFEU0VUX1NURVJFT19SWF9DQVBMRVNTXzQ4MDAwX09TUl8yNTY7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaWhzX2ZmYV9zdGVyZW9fcnhfc2V0dGluZ3NbXSA9IHsKLQl7Ci0JCS5mcmVxX3BsYW4gPSA0ODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpaHNfZmZhX3N0ZXJlb19yeF80OEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaWhzX2ZmYV9zdGVyZW9fcnhfNDhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0KLX07Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdAotCWloc19mZmFfc3RlcmVvX3J4X2NsYXNzX2RfbGVnYWN5XzQ4S0h6X29zcjI1Nl9hY3Rpb25zW10gPQotCUhFQURTRVRfU1RFUkVPX1JYX0NMQVNTX0RfTEVHQUNZXzQ4MDAwX09TUl8yNTY7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkKLQlpaHNfZmZhX3N0ZXJlb19yeF9jbGFzc19kX2xlZ2FjeV9zZXR0aW5nc1tdID0gewotCXsKLQkJLmZyZXFfcGxhbiA9IDQ4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9Ci0JCWloc19mZmFfc3RlcmVvX3J4X2NsYXNzX2RfbGVnYWN5XzQ4S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRQotCQkoaWhzX2ZmYV9zdGVyZW9fcnhfY2xhc3NfZF9sZWdhY3lfNDhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdAotCWloc19mZmFfc3RlcmVvX3J4X2NsYXNzX2FiX2xlZ2FjeV80OEtIel9vc3IyNTZfYWN0aW9uc1tdID0KLQlIRUFEU0VUX1NURVJFT19SWF9MRUdBQ1lfNDgwMDBfT1NSXzI1NjsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2h3c2V0dGluZ19lbnRyeQotCWloc19mZmFfc3RlcmVvX3J4X2NsYXNzX2FiX2xlZ2FjeV9zZXR0aW5nc1tdID0gewotCXsKLQkJLmZyZXFfcGxhbiA9IDQ4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9Ci0JCWloc19mZmFfc3RlcmVvX3J4X2NsYXNzX2FiX2xlZ2FjeV80OEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUKLQkJKGloc19mZmFfc3RlcmVvX3J4X2NsYXNzX2FiX2xlZ2FjeV80OEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfQotfTsKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfZGV2X3Byb2ZpbGUgaWhzX2ZmYV9zdGVyZW9fcnhfcHJvZmlsZSA9IHsKLQkucGF0aF90eXBlID0gQURJRV9DT0RFQ19SWCwKLQkuc2V0dGluZ3MgPSBpaHNfZmZhX3N0ZXJlb19yeF9zZXR0aW5ncywKLQkuc2V0dGluZ19zeiA9IEFSUkFZX1NJWkUoaWhzX2ZmYV9zdGVyZW9fcnhfc2V0dGluZ3MpLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgc25kZGV2X2loc19mZmFfc3RlcmVvX3J4X2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9SWCB8IFNORERFVl9DQVBfVk9JQ0UpLAotCS5uYW1lID0gImhlYWRzZXRfc3RlcmVvX3J4IiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX0hFQURTRVRfU1BLUl9TVEVSRU8sCi0JLnByb2ZpbGUgPSAmaWhzX2ZmYV9zdGVyZW9fcnhfcHJvZmlsZSwKLQkuY2hhbm5lbF9tb2RlID0gMiwKLQkuZGVmYXVsdF9zYW1wbGVfcmF0ZSA9IDQ4MDAwLAotCS52b2x0YWdlX29uID0gbXNtX3NuZGRldl9oc2VkX3ZvbHRhZ2Vfb24sCi0JLnZvbHRhZ2Vfb2ZmID0gbXNtX3NuZGRldl9oc2VkX3ZvbHRhZ2Vfb2ZmLAotCS5tYXhfdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAtNzAwLAotCS5taW5fdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAtMjIwMCwKLQkubWF4X3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gLTkwMCwKLQkubWluX3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gLTI0MDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21faWhzX2ZmYV9zdGVyZW9fcnhfZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl9pY29kZWMiLAotCS5pZCA9IDQsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2loc19mZmFfc3RlcmVvX3J4X2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdCBpaHNfZmZhX21vbm9fcnhfNDhLSHpfb3NyMjU2X2FjdGlvbnNbXSA9Ci0JSEVBRFNFVF9SWF9DQVBMRVNTXzQ4MDAwX09TUl8yNTY7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaWhzX2ZmYV9tb25vX3J4X3NldHRpbmdzW10gPSB7Ci0JewotCQkuZnJlcV9wbGFuID0gNDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaWhzX2ZmYV9tb25vX3J4XzQ4S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpaHNfZmZhX21vbm9fcnhfNDhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpaHNfZmZhX21vbm9fcnhfcHJvZmlsZSA9IHsKLQkucGF0aF90eXBlID0gQURJRV9DT0RFQ19SWCwKLQkuc2V0dGluZ3MgPSBpaHNfZmZhX21vbm9fcnhfc2V0dGluZ3MsCi0JLnNldHRpbmdfc3ogPSBBUlJBWV9TSVpFKGloc19mZmFfbW9ub19yeF9zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSBzbmRkZXZfaWhzX2ZmYV9tb25vX3J4X2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9SWCB8IFNORERFVl9DQVBfVk9JQ0UpLAotCS5uYW1lID0gImhlYWRzZXRfbW9ub19yeCIsCi0JLmNvcHBfaWQgPSAwLAotCS5hY2RiX2lkID0gQUNEQl9JRF9IRUFEU0VUX1NQS1JfTU9OTywKLQkucHJvZmlsZSA9ICZpaHNfZmZhX21vbm9fcnhfcHJvZmlsZSwKLQkuY2hhbm5lbF9tb2RlID0gMSwKLQkuZGVmYXVsdF9zYW1wbGVfcmF0ZSA9IDQ4MDAwLAotCS5wYW1wX29uID0gbXNtX3NuZGRldl9oc2VkX3ZvbHRhZ2Vfb24sCi0JLnBhbXBfb2ZmID0gbXNtX3NuZGRldl9oc2VkX3ZvbHRhZ2Vfb2ZmLAotCS5tYXhfdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAtNzAwLAotCS5taW5fdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAtMjIwMCwKLQkubWF4X3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gLTkwMCwKLQkubWluX3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gLTI0MDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21faWhzX2ZmYV9tb25vX3J4X2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfaWNvZGVjIiwKLQkuaWQgPSA1LAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl9paHNfZmZhX21vbm9fcnhfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IGloc19tb25vX3R4XzhLSHpfb3NyMjU2X2FjdGlvbnNbXSA9Ci0JSEVBRFNFVF9NT05PX1RYXzgwMDBfT1NSXzI1NjsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IGloc19tb25vX3R4XzE2S0h6X29zcjI1Nl9hY3Rpb25zW10gPQotCUhFQURTRVRfTU9OT19UWF8xNjAwMF9PU1JfMjU2OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgaWhzX21vbm9fdHhfNDhLSHpfb3NyMjU2X2FjdGlvbnNbXSA9Ci0JSEVBRFNFVF9NT05PX1RYXzQ4MDAwX09TUl8yNTY7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaWhzX21vbm9fdHhfc2V0dGluZ3NbXSA9IHsKLQl7Ci0JCS5mcmVxX3BsYW4gPSA4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGloc19tb25vX3R4XzhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGloc19tb25vX3R4XzhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0sCi0JewotCQkuZnJlcV9wbGFuID0gMTYwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaWhzX21vbm9fdHhfMTZLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGloc19tb25vX3R4XzE2S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9LAotCXsKLQkJLmZyZXFfcGxhbiA9IDQ4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGloc19tb25vX3R4XzQ4S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpaHNfbW9ub190eF80OEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2Rldl9wcm9maWxlIGloc19tb25vX3R4X3Byb2ZpbGUgPSB7Ci0JLnBhdGhfdHlwZSA9IEFESUVfQ09ERUNfVFgsCi0JLnNldHRpbmdzID0gaWhzX21vbm9fdHhfc2V0dGluZ3MsCi0JLnNldHRpbmdfc3ogPSBBUlJBWV9TSVpFKGloc19tb25vX3R4X3NldHRpbmdzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhIHNuZGRldl9paHNfbW9ub190eF9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfVFggfCBTTkRERVZfQ0FQX1ZPSUNFKSwKLQkubmFtZSA9ICJoZWFkc2V0X21vbm9fdHgiLAotCS5jb3BwX2lkID0gMCwKLQkuYWNkYl9pZCA9IEFDREJfSURfSEVBRFNFVF9NSUMsCi0JLnByb2ZpbGUgPSAmaWhzX21vbm9fdHhfcHJvZmlsZSwKLQkuY2hhbm5lbF9tb2RlID0gMSwKLQkucG1jdGxfaWQgPSBOVUxMLAotCS5wbWN0bF9pZF9zeiA9IDAsCi0JLmRlZmF1bHRfc2FtcGxlX3JhdGUgPSA0ODAwMCwKLQkucGFtcF9vbiA9IG1zbV9zbmRkZXZfdHhfcm91dGVfY29uZmlnLAotCS5wYW1wX29mZiA9IG1zbV9zbmRkZXZfdHhfcm91dGVfZGVjb25maWcsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21faWhzX21vbm9fdHhfZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl9pY29kZWMiLAotCS5pZCA9IDYsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2loc19tb25vX3R4X2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdCBpZm1yYWRpb19oYW5kc2V0X29zcjY0X2FjdGlvbnNbXSA9Ci0JRk1fSEFORFNFVF9PU1JfNjQ7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaWZtcmFkaW9faGFuZHNldF9zZXR0aW5nc1tdID0gewotCXsKLQkJLmZyZXFfcGxhbiA9IDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaWZtcmFkaW9faGFuZHNldF9vc3I2NF9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpZm1yYWRpb19oYW5kc2V0X29zcjY0X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpZm1yYWRpb19oYW5kc2V0X3Byb2ZpbGUgPSB7Ci0JLnBhdGhfdHlwZSA9IEFESUVfQ09ERUNfUlgsCi0JLnNldHRpbmdzID0gaWZtcmFkaW9faGFuZHNldF9zZXR0aW5ncywKLQkuc2V0dGluZ19zeiA9IEFSUkFZX1NJWkUoaWZtcmFkaW9faGFuZHNldF9zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSBzbmRkZXZfaWZtcmFkaW9faGFuZHNldF9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfUlggfCBTTkRERVZfQ0FQX0ZNKSwKLQkubmFtZSA9ICJmbXJhZGlvX2hhbmRzZXRfcngiLAotCS5jb3BwX2lkID0gMCwKLQkuYWNkYl9pZCA9IEFDREJfSURfTFBfRk1fU1BLUl9QSE9ORV9TVEVSRU9fUlgsCi0JLnByb2ZpbGUgPSAmaWZtcmFkaW9faGFuZHNldF9wcm9maWxlLAotCS5jaGFubmVsX21vZGUgPSAxLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gODAwMCwKLQkucGFtcF9vbiA9IE5VTEwsCi0JLnBhbXBfb2ZmID0gTlVMTCwKLQkuZGV2X3ZvbF90eXBlID0gU05EREVWX0RFVl9WT0xfRElHSVRBTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zbV9pZm1yYWRpb19oYW5kc2V0X2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfaWNvZGVjIiwKLQkuaWQgPSA3LAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl9pZm1yYWRpb19oYW5kc2V0X2RhdGEgfSwKLX07Ci0KLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IGlzcGVha2VyX3J4XzQ4S0h6X29zcjI1Nl9hY3Rpb25zW10gPQotICAgU1BFQUtFUl9TVEVSRU9fUlhfNDgwMDBfT1NSXzI1NjsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2h3c2V0dGluZ19lbnRyeSBpc3BlYWtlcl9yeF9zZXR0aW5nc1tdID0gewotCXsKLQkJLmZyZXFfcGxhbiA9IDQ4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGlzcGVha2VyX3J4XzQ4S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpc3BlYWtlcl9yeF80OEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2Rldl9wcm9maWxlIGlzcGVha2VyX3J4X3Byb2ZpbGUgPSB7Ci0JLnBhdGhfdHlwZSA9IEFESUVfQ09ERUNfUlgsCi0JLnNldHRpbmdzID0gaXNwZWFrZXJfcnhfc2V0dGluZ3MsCi0JLnNldHRpbmdfc3ogPSBBUlJBWV9TSVpFKGlzcGVha2VyX3J4X3NldHRpbmdzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhIHNuZGRldl9pc3BlYWtlcl9yeF9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfUlggfCBTTkRERVZfQ0FQX1ZPSUNFKSwKLQkubmFtZSA9ICJzcGVha2VyX3N0ZXJlb19yeCIsCi0JLmNvcHBfaWQgPSAwLAotCS5hY2RiX2lkID0gQUNEQl9JRF9TUEtSX1BIT05FX1NURVJFTywKLQkucHJvZmlsZSA9ICZpc3BlYWtlcl9yeF9wcm9maWxlLAotCS5jaGFubmVsX21vZGUgPSAyLAotCS5wbWN0bF9pZCA9IE5VTEwsCi0JLnBtY3RsX2lkX3N6ID0gMCwKLQkuZGVmYXVsdF9zYW1wbGVfcmF0ZSA9IDQ4MDAwLAotCS5wYW1wX29uID0gJm1zbV9zbmRkZXZfcG93ZXJhbXBfb24sCi0JLnBhbXBfb2ZmID0gJm1zbV9zbmRkZXZfcG93ZXJhbXBfb2ZmLAotCS5tYXhfdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAxMDAwLAotCS5taW5fdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAtNTAwLAotCS5tYXhfdm9pY2Vfcnhfdm9sW1ZPQ19XQl9JTkRFWF0gPSAxMDAwLAotCS5taW5fdm9pY2Vfcnhfdm9sW1ZPQ19XQl9JTkRFWF0gPSAtNTAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXNtX2lzcGVha2VyX3J4X2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfaWNvZGVjIiwKLQkuaWQgPSA4LAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl9pc3BlYWtlcl9yeF9kYXRhIH0sCi0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdCBpZm1yYWRpb19zcGVha2VyX29zcjY0X2FjdGlvbnNbXSA9Ci0JRk1fU1BFQUtFUl9PU1JfNjQ7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaWZtcmFkaW9fc3BlYWtlcl9zZXR0aW5nc1tdID0gewotCXsKLQkJLmZyZXFfcGxhbiA9IDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaWZtcmFkaW9fc3BlYWtlcl9vc3I2NF9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpZm1yYWRpb19zcGVha2VyX29zcjY0X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpZm1yYWRpb19zcGVha2VyX3Byb2ZpbGUgPSB7Ci0JLnBhdGhfdHlwZSA9IEFESUVfQ09ERUNfUlgsCi0JLnNldHRpbmdzID0gaWZtcmFkaW9fc3BlYWtlcl9zZXR0aW5ncywKLQkuc2V0dGluZ19zeiA9IEFSUkFZX1NJWkUoaWZtcmFkaW9fc3BlYWtlcl9zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSBzbmRkZXZfaWZtcmFkaW9fc3BlYWtlcl9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfUlggfCBTTkRERVZfQ0FQX0ZNKSwKLQkubmFtZSA9ICJmbXJhZGlvX3NwZWFrZXJfcngiLAotCS5jb3BwX2lkID0gMCwKLQkuYWNkYl9pZCA9IEFDREJfSURfTFBfRk1fU1BLUl9QSE9ORV9TVEVSRU9fUlgsCi0JLnByb2ZpbGUgPSAmaWZtcmFkaW9fc3BlYWtlcl9wcm9maWxlLAotCS5jaGFubmVsX21vZGUgPSAxLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gODAwMCwKLQkucGFtcF9vbiA9ICZtc21fc25kZGV2X3Bvd2VyYW1wX29uLAotCS5wYW1wX29mZiA9ICZtc21fc25kZGV2X3Bvd2VyYW1wX29mZiwKLQkuZGV2X3ZvbF90eXBlID0gU05EREVWX0RFVl9WT0xfRElHSVRBTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zbV9pZm1yYWRpb19zcGVha2VyX2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfaWNvZGVjIiwKLQkuaWQgPSA5LAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl9pZm1yYWRpb19zcGVha2VyX2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdCBpZm1yYWRpb19oZWFkc2V0X29zcjY0X2FjdGlvbnNbXSA9Ci0JRk1fSEVBRFNFVF9TVEVSRU9fQ0xBU1NfRF9MRUdBQ1lfT1NSXzY0OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfaHdzZXR0aW5nX2VudHJ5IGlmbXJhZGlvX2hlYWRzZXRfc2V0dGluZ3NbXSA9IHsKLQl7Ci0JCS5mcmVxX3BsYW4gPSA4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGlmbXJhZGlvX2hlYWRzZXRfb3NyNjRfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaWZtcmFkaW9faGVhZHNldF9vc3I2NF9hY3Rpb25zKSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfZGV2X3Byb2ZpbGUgaWZtcmFkaW9faGVhZHNldF9wcm9maWxlID0gewotCS5wYXRoX3R5cGUgPSBBRElFX0NPREVDX1JYLAotCS5zZXR0aW5ncyA9IGlmbXJhZGlvX2hlYWRzZXRfc2V0dGluZ3MsCi0JLnNldHRpbmdfc3ogPSBBUlJBWV9TSVpFKGlmbXJhZGlvX2hlYWRzZXRfc2V0dGluZ3MpLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgc25kZGV2X2lmbXJhZGlvX2hlYWRzZXRfZGF0YSA9IHsKLQkuY2FwYWJpbGl0eSA9IChTTkRERVZfQ0FQX1JYIHwgU05EREVWX0NBUF9GTSksCi0JLm5hbWUgPSAiZm1yYWRpb19oZWFkc2V0X3J4IiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX0xQX0ZNX0hFQURTRVRfU1BLUl9TVEVSRU9fUlgsCi0JLnByb2ZpbGUgPSAmaWZtcmFkaW9faGVhZHNldF9wcm9maWxlLAotCS5jaGFubmVsX21vZGUgPSAxLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gODAwMCwKLQkucGFtcF9vbiA9IE5VTEwsCi0JLnBhbXBfb2ZmID0gTlVMTCwKLQkuZGV2X3ZvbF90eXBlID0gU05EREVWX0RFVl9WT0xfRElHSVRBTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zbV9pZm1yYWRpb19oZWFkc2V0X2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfaWNvZGVjIiwKLQkuaWQgPSAxMCwKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfaWZtcmFkaW9faGVhZHNldF9kYXRhIH0sCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdCBpZm1yYWRpb19mZmFfaGVhZHNldF9vc3I2NF9hY3Rpb25zW10gPQotCUZNX0hFQURTRVRfQ0xBU1NfQUJfU1RFUkVPX0NBUExFU1NfT1NSXzY0OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfaHdzZXR0aW5nX2VudHJ5IGlmbXJhZGlvX2ZmYV9oZWFkc2V0X3NldHRpbmdzW10gPSB7Ci0JewotCQkuZnJlcV9wbGFuID0gODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpZm1yYWRpb19mZmFfaGVhZHNldF9vc3I2NF9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpZm1yYWRpb19mZmFfaGVhZHNldF9vc3I2NF9hY3Rpb25zKSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfZGV2X3Byb2ZpbGUgaWZtcmFkaW9fZmZhX2hlYWRzZXRfcHJvZmlsZSA9IHsKLQkucGF0aF90eXBlID0gQURJRV9DT0RFQ19SWCwKLQkuc2V0dGluZ3MgPSBpZm1yYWRpb19mZmFfaGVhZHNldF9zZXR0aW5ncywKLQkuc2V0dGluZ19zeiA9IEFSUkFZX1NJWkUoaWZtcmFkaW9fZmZhX2hlYWRzZXRfc2V0dGluZ3MpLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgc25kZGV2X2lmbXJhZGlvX2ZmYV9oZWFkc2V0X2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9SWCB8IFNORERFVl9DQVBfRk0pLAotCS5uYW1lID0gImZtcmFkaW9faGVhZHNldF9yeCIsCi0JLmNvcHBfaWQgPSAwLAotCS5hY2RiX2lkID0gQUNEQl9JRF9MUF9GTV9IRUFEU0VUX1NQS1JfU1RFUkVPX1JYLAotCS5wcm9maWxlID0gJmlmbXJhZGlvX2ZmYV9oZWFkc2V0X3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IDEsCi0JLmRlZmF1bHRfc2FtcGxlX3JhdGUgPSA4MDAwLAotCS5wYW1wX29uID0gbXNtX3NuZGRldl9oc2VkX3ZvbHRhZ2Vfb24sCi0JLnBhbXBfb2ZmID0gbXNtX3NuZGRldl9oc2VkX3ZvbHRhZ2Vfb2ZmLAotCS5kZXZfdm9sX3R5cGUgPSBTTkRERVZfREVWX1ZPTF9ESUdJVEFMLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXNtX2lmbXJhZGlvX2ZmYV9oZWFkc2V0X2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfaWNvZGVjIiwKLQkuaWQgPSAxMSwKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfaWZtcmFkaW9fZmZhX2hlYWRzZXRfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfZWNvZGVjX2RhdGEgc25kZGV2X2J0X3Njb19lYXJwaWVjZV9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfUlggfCBTTkRERVZfQ0FQX1ZPSUNFKSwKLQkubmFtZSA9ICJidF9zY29fcngiLAotCS5jb3BwX2lkID0gMSwKLQkuYWNkYl9pZCA9IEFDREJfSURfQlRfU0NPX1NQS1IsCi0JLmNoYW5uZWxfbW9kZSA9IDEsCi0JLmNvbmZfcGNtX2N0bF92YWwgPSBCVF9TQ09fUENNX0NUTF9WQUwsCi0JLmNvbmZfYXV4X2NvZGVjX2ludGYgPSBCVF9TQ09fQVVYX0NPREVDX0lOVEYsCi0JLmNvbmZfZGF0YV9mb3JtYXRfcGFkZGluZ192YWwgPSBCVF9TQ09fREFUQV9GT1JNQVRfUEFERElORywKLQkubWF4X3ZvaWNlX3J4X3ZvbFtWT0NfTkJfSU5ERVhdID0gNDAwLAotCS5taW5fdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAtMTEwMCwKLQkubWF4X3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gNDAwLAotCS5taW5fdm9pY2Vfcnhfdm9sW1ZPQ19XQl9JTkRFWF0gPSAtMTEwMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2Vjb2RlY19kYXRhIHNuZGRldl9idF9zY29fbWljX2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9UWCB8IFNORERFVl9DQVBfVk9JQ0UpLAotCS5uYW1lID0gImJ0X3Njb190eCIsCi0JLmNvcHBfaWQgPSAxLAotCS5hY2RiX2lkID0gQUNEQl9JRF9CVF9TQ09fTUlDLAotCS5jaGFubmVsX21vZGUgPSAxLAotCS5jb25mX3BjbV9jdGxfdmFsID0gQlRfU0NPX1BDTV9DVExfVkFMLAotCS5jb25mX2F1eF9jb2RlY19pbnRmID0gQlRfU0NPX0FVWF9DT0RFQ19JTlRGLAotCS5jb25mX2RhdGFfZm9ybWF0X3BhZGRpbmdfdmFsID0gQlRfU0NPX0RBVEFfRk9STUFUX1BBRERJTkcsCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zbV9idF9zY29fZWFycGllY2VfZGV2aWNlID0gewotCS5uYW1lID0gIm1zbV9zbmRkZXZfZWNvZGVjIiwKLQkuaWQgPSAwLAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl9idF9zY29fZWFycGllY2VfZGF0YSB9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21fYnRfc2NvX21pY19kZXZpY2UgPSB7Ci0JLm5hbWUgPSAibXNtX3NuZGRldl9lY29kZWMiLAotCS5pZCA9IDEsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2J0X3Njb19taWNfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IGlkdWFsX21pY19lbmRmaXJlXzhLSHpfb3NyMjU2X2FjdGlvbnNbXSA9Ci0JTUlDMV9MRUZUX0xJTkVfSU5fUklHSFRfODAwMF9PU1JfMjU2OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfaHdzZXR0aW5nX2VudHJ5IGlkdWFsX21pY19lbmRmaXJlX3NldHRpbmdzW10gPSB7Ci0JewotCQkuZnJlcV9wbGFuID0gODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpZHVhbF9taWNfZW5kZmlyZV84S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpZHVhbF9taWNfZW5kZmlyZV84S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9LCAvKiA4S0h6IHByb2ZpbGUgY2FuIGJlIHVzZWQgZm9yIDE2S0h6ICovCi0JewotCQkuZnJlcV9wbGFuID0gMTYwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaWR1YWxfbWljX2VuZGZpcmVfOEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaWR1YWxfbWljX2VuZGZpcmVfOEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfSwgLyogOEtIeiBwcm9maWxlIGNhbiBiZSB1c2VkIGZvciA0OEtIeiAqLwotCXsKLQkJLmZyZXFfcGxhbiA9IDQ4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGlkdWFsX21pY19lbmRmaXJlXzhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGlkdWFsX21pY19lbmRmaXJlXzhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpZHVhbF9taWNfZW5kZmlyZV9wcm9maWxlID0gewotCS5wYXRoX3R5cGUgPSBBRElFX0NPREVDX1RYLAotCS5zZXR0aW5ncyA9IGlkdWFsX21pY19lbmRmaXJlX3NldHRpbmdzLAotCS5zZXR0aW5nX3N6ID0gQVJSQVlfU0laRShpZHVhbF9taWNfZW5kZmlyZV9zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgZW51bSBoc2VkX2NvbnRyb2xsZXIgaWR1YWxfbWljX2VuZGZpcmVfcG1jdGxfaWRbXSA9IHsKLQlQTV9IU0VEX0NPTlRST0xMRVJfMCwgUE1fSFNFRF9DT05UUk9MTEVSXzIKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhIHNuZGRldl9pZHVhbF9taWNfZW5kZmlyZV9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfVFggfCBTTkRERVZfQ0FQX1ZPSUNFKSwKLQkubmFtZSA9ICJoYW5kc2V0X2R1YWxfbWljX2VuZGZpcmVfdHgiLAotCS5jb3BwX2lkID0gMCwKLQkuYWNkYl9pZCA9IEFDREJfSURfSEFORFNFVF9NSUNfRU5ERklSRSwKLQkucHJvZmlsZSA9ICZpZHVhbF9taWNfZW5kZmlyZV9wcm9maWxlLAotCS5jaGFubmVsX21vZGUgPSAyLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gNDgwMDAsCi0JLnBtY3RsX2lkID0gaWR1YWxfbWljX2VuZGZpcmVfcG1jdGxfaWQsCi0JLnBtY3RsX2lkX3N6ID0gQVJSQVlfU0laRShpZHVhbF9taWNfZW5kZmlyZV9wbWN0bF9pZCksCi0JLnBhbXBfb24gPSBOVUxMLAotCS5wYW1wX29mZiA9IE5VTEwsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21faWR1YWxfbWljX2VuZGZpcmVfZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl9pY29kZWMiLAotCS5pZCA9IDEyLAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl9pZHVhbF9taWNfZW5kZmlyZV9kYXRhIH0sCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhXAotCQlzbmRkZXZfaWR1YWxfbWljX2VuZGZpcmVfcmVhbF9zdGVyZW9fZGF0YSA9IHsKLQkuY2FwYWJpbGl0eSA9IChTTkRERVZfQ0FQX1RYIHwgU05EREVWX0NBUF9WT0lDRSksCi0JLm5hbWUgPSAiaGFuZHNldF9kdWFsX21pY19lbmRmaXJlX3R4X3JlYWxfc3RlcmVvIiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBQU0VVRE9fQUNEQl9JRCwKLQkucHJvZmlsZSA9ICZpZHVhbF9taWNfZW5kZmlyZV9wcm9maWxlLAotCS5jaGFubmVsX21vZGUgPSBSRUFMX1NURVJFT19DSEFOTkVMX01PREUsCi0JLmRlZmF1bHRfc2FtcGxlX3JhdGUgPSA0ODAwMCwKLQkucG1jdGxfaWQgPSBpZHVhbF9taWNfZW5kZmlyZV9wbWN0bF9pZCwKLQkucG1jdGxfaWRfc3ogPSBBUlJBWV9TSVpFKGlkdWFsX21pY19lbmRmaXJlX3BtY3RsX2lkKSwKLQkucGFtcF9vbiA9IE5VTEwsCi0JLnBhbXBfb2ZmID0gTlVMTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zbV9yZWFsX3N0ZXJlb190eF9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X2ljb2RlYyIsCi0JLmlkID0gMjYsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPQotCQkJJnNuZGRldl9pZHVhbF9taWNfZW5kZmlyZV9yZWFsX3N0ZXJlb19kYXRhIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgaWR1YWxfbWljX2JzXzhLSHpfb3NyMjU2X2FjdGlvbnNbXSA9Ci0JTUlDMV9MRUZUX0FVWF9JTl9SSUdIVF84MDAwX09TUl8yNTY7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaWR1YWxfbWljX2Jyb2Fkc2lkZV9zZXR0aW5nc1tdID0gewotCXsKLQkJLmZyZXFfcGxhbiA9IDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaWR1YWxfbWljX2JzXzhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGlkdWFsX21pY19ic184S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9LCAvKiA4S0h6IHByb2ZpbGUgY2FuIGJlIHVzZWQgZm9yIDE2S0h6ICovCi0JewotCQkuZnJlcV9wbGFuID0gMTYwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaWR1YWxfbWljX2JzXzhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGlkdWFsX21pY19ic184S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9LCAvKiA4S0h6IHByb2ZpbGUgY2FuIGJlIHVzZWQgZm9yIDE2S0h6ICovCi0JewotCQkuZnJlcV9wbGFuID0gNDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaWR1YWxfbWljX2JzXzhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGlkdWFsX21pY19ic184S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfZGV2X3Byb2ZpbGUgaWR1YWxfbWljX2Jyb2Fkc2lkZV9wcm9maWxlID0gewotCS5wYXRoX3R5cGUgPSBBRElFX0NPREVDX1RYLAotCS5zZXR0aW5ncyA9IGlkdWFsX21pY19icm9hZHNpZGVfc2V0dGluZ3MsCi0JLnNldHRpbmdfc3ogPSBBUlJBWV9TSVpFKGlkdWFsX21pY19icm9hZHNpZGVfc2V0dGluZ3MpLAotfTsKLQotc3RhdGljIGVudW0gaHNlZF9jb250cm9sbGVyIGlkdWFsX21pY19icm9hZHNpZGVfcG1jdGxfaWRbXSA9IHsKLQlQTV9IU0VEX0NPTlRST0xMRVJfMCwgUE1fSFNFRF9DT05UUk9MTEVSXzIKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhIHNuZGRldl9pZHVhbF9taWNfYnJvYWRzaWRlX2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9UWCB8IFNORERFVl9DQVBfVk9JQ0UpLAotCS5uYW1lID0gImhhbmRzZXRfZHVhbF9taWNfYnJvYWRzaWRlX3R4IiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX0hBTkRTRVRfTUlDX0JST0FEU0lERSwKLQkucHJvZmlsZSA9ICZpZHVhbF9taWNfYnJvYWRzaWRlX3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IDIsCi0JLmRlZmF1bHRfc2FtcGxlX3JhdGUgPSA0ODAwMCwKLQkucG1jdGxfaWQgPSBpZHVhbF9taWNfYnJvYWRzaWRlX3BtY3RsX2lkLAotCS5wbWN0bF9pZF9zeiA9IEFSUkFZX1NJWkUoaWR1YWxfbWljX2Jyb2Fkc2lkZV9wbWN0bF9pZCksCi0JLnBhbXBfb24gPSBOVUxMLAotCS5wYW1wX29mZiA9IE5VTEwsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21faWR1YWxfbWljX2Jyb2Fkc2lkZV9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X2ljb2RlYyIsCi0JLmlkID0gMTMsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2lkdWFsX21pY19icm9hZHNpZGVfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IGlzcGtfZHVhbF9taWNfZWZfOEtIel9vc3IyNTZfYWN0aW9uc1tdID0KLQlTUEVBS0VSX01JQzFfTEVGVF9MSU5FX0lOX1JJR0hUXzgwMDBfT1NSXzI1NjsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2h3c2V0dGluZ19lbnRyeSBpc3BrX2R1YWxfbWljX2VmX3NldHRpbmdzW10gPSB7Ci0JewotCQkuZnJlcV9wbGFuID0gODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpc3BrX2R1YWxfbWljX2VmXzhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGlzcGtfZHVhbF9taWNfZWZfOEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfSwgLyogOEtIeiBwcm9maWxlIGNhbiBiZSB1c2VkIGZvciAxNktoeiAqLwotCXsKLQkJLmZyZXFfcGxhbiA9IDE2MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGlzcGtfZHVhbF9taWNfZWZfOEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaXNwa19kdWFsX21pY19lZl84S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9LCAvKiA4S0h6IHByb2ZpbGUgY2FuIGJlIHVzZWQgZm9yIDQ4S0h6ICovCi0JewotCQkuZnJlcV9wbGFuID0gNDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaXNwa19kdWFsX21pY19lZl84S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpc3BrX2R1YWxfbWljX2VmXzhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfZGV2X3Byb2ZpbGUgaXNwa19kdWFsX21pY19lZl9wcm9maWxlID0gewotCS5wYXRoX3R5cGUgPSBBRElFX0NPREVDX1RYLAotCS5zZXR0aW5ncyA9IGlzcGtfZHVhbF9taWNfZWZfc2V0dGluZ3MsCi0JLnNldHRpbmdfc3ogPSBBUlJBWV9TSVpFKGlzcGtfZHVhbF9taWNfZWZfc2V0dGluZ3MpLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgc25kZGV2X3Nwa19pZHVhbF9taWNfZW5kZmlyZV9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfVFggfCBTTkRERVZfQ0FQX1ZPSUNFKSwKLQkubmFtZSA9ICJzcGVha2VyX2R1YWxfbWljX2VuZGZpcmVfdHgiLAotCS5jb3BwX2lkID0gMCwKLQkuYWNkYl9pZCA9IEFDREJfSURfU1BLUl9QSE9ORV9NSUNfRU5ERklSRSwKLQkucHJvZmlsZSA9ICZpc3BrX2R1YWxfbWljX2VmX3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IDIsCi0JLmRlZmF1bHRfc2FtcGxlX3JhdGUgPSA0ODAwMCwKLQkucG1jdGxfaWQgPSBpZHVhbF9taWNfZW5kZmlyZV9wbWN0bF9pZCwKLQkucG1jdGxfaWRfc3ogPSBBUlJBWV9TSVpFKGlkdWFsX21pY19lbmRmaXJlX3BtY3RsX2lkKSwKLQkucGFtcF9vbiA9IE5VTEwsCi0JLnBhbXBfb2ZmID0gTlVMTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zbV9zcGtfaWR1YWxfbWljX2VuZGZpcmVfZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl9pY29kZWMiLAotCS5pZCA9IDE0LAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl9zcGtfaWR1YWxfbWljX2VuZGZpcmVfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IGlzcGtfZHVhbF9taWNfYnNfOEtIel9vc3IyNTZfYWN0aW9uc1tdID0KLQlTUEVBS0VSX01JQzFfTEVGVF9BVVhfSU5fUklHSFRfODAwMF9PU1JfMjU2OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfaHdzZXR0aW5nX2VudHJ5IGlzcGtfZHVhbF9taWNfYnNfc2V0dGluZ3NbXSA9IHsKLQl7Ci0JCS5mcmVxX3BsYW4gPSA4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGlzcGtfZHVhbF9taWNfYnNfOEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaXNwa19kdWFsX21pY19ic184S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9LCAvKiA4S0h6IHByb2ZpbGUgY2FuIGJlIHVzZWQgZm9yIDE2S2h6ICovCi0JewotCQkuZnJlcV9wbGFuID0gMTYwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaXNwa19kdWFsX21pY19ic184S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpc3BrX2R1YWxfbWljX2JzXzhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0sIC8qIDhLSHogcHJvZmlsZSBjYW4gYmUgdXNlZCBmb3IgNDhLSHogKi8KLQl7Ci0JCS5mcmVxX3BsYW4gPSA0ODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpc3BrX2R1YWxfbWljX2JzXzhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGlzcGtfZHVhbF9taWNfYnNfOEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpc3BrX2R1YWxfbWljX2JzX3Byb2ZpbGUgPSB7Ci0JLnBhdGhfdHlwZSA9IEFESUVfQ09ERUNfVFgsCi0JLnNldHRpbmdzID0gaXNwa19kdWFsX21pY19ic19zZXR0aW5ncywKLQkuc2V0dGluZ19zeiA9IEFSUkFZX1NJWkUoaXNwa19kdWFsX21pY19ic19zZXR0aW5ncyksCi19Owotc3RhdGljIHN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgc25kZGV2X3Nwa19pZHVhbF9taWNfYnJvYWRzaWRlX2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9UWCB8IFNORERFVl9DQVBfVk9JQ0UpLAotCS5uYW1lID0gInNwZWFrZXJfZHVhbF9taWNfYnJvYWRzaWRlX3R4IiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX1NQS1JfUEhPTkVfTUlDX0JST0FEU0lERSwKLQkucHJvZmlsZSA9ICZpc3BrX2R1YWxfbWljX2JzX3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IDIsCi0JLmRlZmF1bHRfc2FtcGxlX3JhdGUgPSA0ODAwMCwKLQkucG1jdGxfaWQgPSBpZHVhbF9taWNfYnJvYWRzaWRlX3BtY3RsX2lkLAotCS5wbWN0bF9pZF9zeiA9IEFSUkFZX1NJWkUoaWR1YWxfbWljX2Jyb2Fkc2lkZV9wbWN0bF9pZCksCi0JLnBhbXBfb24gPSBOVUxMLAotCS5wYW1wX29mZiA9IE5VTEwsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21fc3BrX2lkdWFsX21pY19icm9hZHNpZGVfZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl9pY29kZWMiLAotCS5pZCA9IDE1LAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl9zcGtfaWR1YWxfbWljX2Jyb2Fkc2lkZV9kYXRhIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgaXR0eV9oc19tb25vX3R4XzhLSHpfb3NyMjU2X2FjdGlvbnNbXSA9Ci0JVFRZX0hFQURTRVRfTU9OT19UWF84MDAwX09TUl8yNTY7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaXR0eV9oc19tb25vX3R4X3NldHRpbmdzW10gPSB7Ci0JLyogOEtIeiwgMTZLSHosIDQ4S0h6IFRUWSBUeCBkZXZpY2VzIGNhbiBzaGFyZWQgc2FtZSBzZXQgb2YgYWN0aW9ucyAqLwotCXsKLQkJLmZyZXFfcGxhbiA9IDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaXR0eV9oc19tb25vX3R4XzhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGl0dHlfaHNfbW9ub190eF84S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9LAotCXsKLQkJLmZyZXFfcGxhbiA9IDE2MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGl0dHlfaHNfbW9ub190eF84S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpdHR5X2hzX21vbm9fdHhfOEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfSwKLQl7Ci0JCS5mcmVxX3BsYW4gPSA0ODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpdHR5X2hzX21vbm9fdHhfOEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaXR0eV9oc19tb25vX3R4XzhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpdHR5X2hzX21vbm9fdHhfcHJvZmlsZSA9IHsKLQkucGF0aF90eXBlID0gQURJRV9DT0RFQ19UWCwKLQkuc2V0dGluZ3MgPSBpdHR5X2hzX21vbm9fdHhfc2V0dGluZ3MsCi0JLnNldHRpbmdfc3ogPSBBUlJBWV9TSVpFKGl0dHlfaHNfbW9ub190eF9zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSBzbmRkZXZfaXR0eV9oc19tb25vX3R4X2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9UWCB8IFNORERFVl9DQVBfVk9JQ0UgfCBTTkRERVZfQ0FQX1RUWSksCi0JLm5hbWUgPSAidHR5X2hlYWRzZXRfbW9ub190eCIsCi0JLmNvcHBfaWQgPSAwLAotCS5hY2RiX2lkID0gQUNEQl9JRF9UVFlfSEVBRFNFVF9NSUMsCi0JLnByb2ZpbGUgPSAmaXR0eV9oc19tb25vX3R4X3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IDEsCi0JLmRlZmF1bHRfc2FtcGxlX3JhdGUgPSA0ODAwMCwKLQkucG1jdGxfaWQgPSBOVUxMLAotCS5wbWN0bF9pZF9zeiA9IDAsCi0JLnBhbXBfb24gPSBOVUxMLAotCS5wYW1wX29mZiA9IE5VTEwsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21faXR0eV9oc19tb25vX3R4X2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfaWNvZGVjIiwKLQkuaWQgPSAxNiwKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfaXR0eV9oc19tb25vX3R4X2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdCBpdHR5X2hzX21vbm9fcnhfOEtIel9vc3IyNTZfYWN0aW9uc1tdID0KLQlUVFlfSEVBRFNFVF9NT05PX1JYX0NMQVNTX0RfODAwMF9PU1JfMjU2OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgaXR0eV9oc19tb25vX3J4XzE2S0h6X29zcjI1Nl9hY3Rpb25zW10gPQotCVRUWV9IRUFEU0VUX01PTk9fUlhfQ0xBU1NfRF8xNjAwMF9PU1JfMjU2OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgaXR0eV9oc19tb25vX3J4XzQ4S0h6X29zcjI1Nl9hY3Rpb25zW10gPQotCVRUWV9IRUFEU0VUX01PTk9fUlhfQ0xBU1NfRF80ODAwMF9PU1JfMjU2OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfaHdzZXR0aW5nX2VudHJ5IGl0dHlfaHNfbW9ub19yeF9zZXR0aW5nc1tdID0gewotCXsKLQkJLmZyZXFfcGxhbiA9IDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaXR0eV9oc19tb25vX3J4XzhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGl0dHlfaHNfbW9ub19yeF84S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9LAotCXsKLQkJLmZyZXFfcGxhbiA9IDE2MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGl0dHlfaHNfbW9ub19yeF8xNktIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaXR0eV9oc19tb25vX3J4XzE2S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9LAotCXsKLQkJLmZyZXFfcGxhbiA9IDQ4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGl0dHlfaHNfbW9ub19yeF80OEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaXR0eV9oc19tb25vX3J4XzQ4S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfZGV2X3Byb2ZpbGUgaXR0eV9oc19tb25vX3J4X3Byb2ZpbGUgPSB7Ci0JLnBhdGhfdHlwZSA9IEFESUVfQ09ERUNfUlgsCi0JLnNldHRpbmdzID0gaXR0eV9oc19tb25vX3J4X3NldHRpbmdzLAotCS5zZXR0aW5nX3N6ID0gQVJSQVlfU0laRShpdHR5X2hzX21vbm9fcnhfc2V0dGluZ3MpLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgc25kZGV2X2l0dHlfaHNfbW9ub19yeF9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfUlggfCBTTkRERVZfQ0FQX1ZPSUNFIHwgU05EREVWX0NBUF9UVFkpLAotCS5uYW1lID0gInR0eV9oZWFkc2V0X21vbm9fcngiLAotCS5jb3BwX2lkID0gMCwKLQkuYWNkYl9pZCA9IEFDREJfSURfVFRZX0hFQURTRVRfU1BLUiwKLQkucHJvZmlsZSA9ICZpdHR5X2hzX21vbm9fcnhfcHJvZmlsZSwKLQkuY2hhbm5lbF9tb2RlID0gMSwKLQkuZGVmYXVsdF9zYW1wbGVfcmF0ZSA9IDQ4MDAwLAotCS5wYW1wX29uID0gTlVMTCwKLQkucGFtcF9vZmYgPSBOVUxMLAotCS5tYXhfdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAwLAotCS5taW5fdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAwLAotCS5tYXhfdm9pY2Vfcnhfdm9sW1ZPQ19XQl9JTkRFWF0gPSAwLAotCS5taW5fdm9pY2Vfcnhfdm9sW1ZPQ19XQl9JTkRFWF0gPSAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXNtX2l0dHlfaHNfbW9ub19yeF9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X2ljb2RlYyIsCi0JLmlkID0gMTcsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2l0dHlfaHNfbW9ub19yeF9kYXRhIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgaXNwZWFrZXJfdHhfOEtIel9vc3IyNTZfYWN0aW9uc1tdID0KLQlTUEVBS0VSX1RYXzgwMDBfT1NSXzI1NjsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IGlzcGVha2VyX3R4XzQ4S0h6X29zcjI1Nl9hY3Rpb25zW10gPQotCVNQRUFLRVJfVFhfNDgwMDBfT1NSXzI1NjsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2h3c2V0dGluZ19lbnRyeSBpc3BlYWtlcl90eF9zZXR0aW5nc1tdID0gewotCXsKLQkJLmZyZXFfcGxhbiA9IDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaXNwZWFrZXJfdHhfOEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaXNwZWFrZXJfdHhfOEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfSwKLQl7IC8qIDhLSHogcHJvZmlsZSBpcyBnb29kIGZvciAxNktIeiAqLwotCQkuZnJlcV9wbGFuID0gMTYwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaXNwZWFrZXJfdHhfOEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaXNwZWFrZXJfdHhfOEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfSwKLQl7Ci0JCS5mcmVxX3BsYW4gPSA0ODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpc3BlYWtlcl90eF80OEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaXNwZWFrZXJfdHhfNDhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpc3BlYWtlcl90eF9wcm9maWxlID0gewotCS5wYXRoX3R5cGUgPSBBRElFX0NPREVDX1RYLAotCS5zZXR0aW5ncyA9IGlzcGVha2VyX3R4X3NldHRpbmdzLAotCS5zZXR0aW5nX3N6ID0gQVJSQVlfU0laRShpc3BlYWtlcl90eF9zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgZW51bSBoc2VkX2NvbnRyb2xsZXIgaXNwa19wbWN0bF9pZFtdID0ge1BNX0hTRURfQ09OVFJPTExFUl8wfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgc25kZGV2X2lzcGVha2VyX3R4X2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9UWCB8IFNORERFVl9DQVBfVk9JQ0UpLAotCS5uYW1lID0gInNwZWFrZXJfbW9ub190eCIsCi0JLmNvcHBfaWQgPSAwLAotCS5hY2RiX2lkID0gQUNEQl9JRF9TUEtSX1BIT05FX01JQywKLQkucHJvZmlsZSA9ICZpc3BlYWtlcl90eF9wcm9maWxlLAotCS5jaGFubmVsX21vZGUgPSAxLAotCS5wbWN0bF9pZCA9IGlzcGtfcG1jdGxfaWQsCi0JLnBtY3RsX2lkX3N6ID0gQVJSQVlfU0laRShpc3BrX3BtY3RsX2lkKSwKLQkuZGVmYXVsdF9zYW1wbGVfcmF0ZSA9IDQ4MDAwLAotCS5wYW1wX29uID0gbXNtX3NuZGRldl90eF9yb3V0ZV9jb25maWcsCi0JLnBhbXBfb2ZmID0gbXNtX3NuZGRldl90eF9yb3V0ZV9kZWNvbmZpZywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zbV9pc3BlYWtlcl90eF9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X2ljb2RlYyIsCi0JLmlkID0gMTgsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2lzcGVha2VyX3R4X2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdCBpZWFycGllY2VfZmZhXzQ4S0h6X29zcjI1Nl9hY3Rpb25zW10gPQotCUhBTkRTRVRfUlhfNDgwMDBfT1NSXzI1Nl9GRkE7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaWVhcnBpZWNlX2ZmYV9zZXR0aW5nc1tdID0gewotCXsKLQkJLmZyZXFfcGxhbiA9IDQ4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGllYXJwaWVjZV9mZmFfNDhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGllYXJwaWVjZV9mZmFfNDhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpZWFycGllY2VfZmZhX3Byb2ZpbGUgPSB7Ci0JLnBhdGhfdHlwZSA9IEFESUVfQ09ERUNfUlgsCi0JLnNldHRpbmdzID0gaWVhcnBpZWNlX2ZmYV9zZXR0aW5ncywKLQkuc2V0dGluZ19zeiA9IEFSUkFZX1NJWkUoaWVhcnBpZWNlX2ZmYV9zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSBzbmRkZXZfaWVhcnBpZWNlX2ZmYV9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfUlggfCBTTkRERVZfQ0FQX1ZPSUNFKSwKLQkubmFtZSA9ICJoYW5kc2V0X3J4IiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX0hBTkRTRVRfU1BLUiwKLQkucHJvZmlsZSA9ICZpZWFycGllY2VfZmZhX3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IDEsCi0JLnBtY3RsX2lkID0gTlVMTCwKLQkucG1jdGxfaWRfc3ogPSAwLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gNDgwMDAsCi0JLnBhbXBfb24gPSBOVUxMLAotCS5wYW1wX29mZiA9IE5VTEwsCi0JLm1heF92b2ljZV9yeF92b2xbVk9DX05CX0lOREVYXSA9IC03MDAsCi0JLm1pbl92b2ljZV9yeF92b2xbVk9DX05CX0lOREVYXSA9IC0yMjAwLAotCS5tYXhfdm9pY2Vfcnhfdm9sW1ZPQ19XQl9JTkRFWF0gPSAtMTQwMCwKLQkubWluX3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gLTI5MDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21faWVhcnBpZWNlX2ZmYV9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X2ljb2RlYyIsCi0JLmlkID0gMTksCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2llYXJwaWVjZV9mZmFfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IGltaWNfZmZhXzhLSHpfb3NyMjU2X2FjdGlvbnNbXSA9Ci0JSEFORFNFVF9UWF84MDAwX09TUl8yNTZfRkZBOwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgaW1pY19mZmFfMTZLSHpfb3NyMjU2X2FjdGlvbnNbXSA9Ci0JSEFORFNFVF9UWF8xNjAwMF9PU1JfMjU2X0ZGQTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IGltaWNfZmZhXzQ4S0h6X29zcjI1Nl9hY3Rpb25zW10gPQotCUhBTkRTRVRfVFhfNDgwMDBfT1NSXzI1Nl9GRkE7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaW1pY19mZmFfc2V0dGluZ3NbXSA9IHsKLQl7Ci0JCS5mcmVxX3BsYW4gPSA4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGltaWNfZmZhXzhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGltaWNfZmZhXzhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0sCi0JewotCQkuZnJlcV9wbGFuID0gMTYwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaW1pY19mZmFfMTZLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGltaWNfZmZhXzE2S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9LAotCXsKLQkJLmZyZXFfcGxhbiA9IDQ4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGltaWNfZmZhXzQ4S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpbWljX2ZmYV80OEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2Rldl9wcm9maWxlIGltaWNfZmZhX3Byb2ZpbGUgPSB7Ci0JLnBhdGhfdHlwZSA9IEFESUVfQ09ERUNfVFgsCi0JLnNldHRpbmdzID0gaW1pY19mZmFfc2V0dGluZ3MsCi0JLnNldHRpbmdfc3ogPSBBUlJBWV9TSVpFKGltaWNfZmZhX3NldHRpbmdzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhIHNuZGRldl9pbWljX2ZmYV9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfVFggfCBTTkRERVZfQ0FQX1ZPSUNFKSwKLQkubmFtZSA9ICJoYW5kc2V0X3R4IiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX0hBTkRTRVRfTUlDLAotCS5wcm9maWxlID0gJmltaWNfZmZhX3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IDEsCi0JLnBtY3RsX2lkID0gaW1pY19wbWN0bF9pZCwKLQkucG1jdGxfaWRfc3ogPSBBUlJBWV9TSVpFKGltaWNfcG1jdGxfaWQpLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gNDgwMDAsCi0JLnBhbXBfb24gPSBOVUxMLAotCS5wYW1wX29mZiA9IE5VTEwsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21faW1pY19mZmFfZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl9pY29kZWMiLAotCS5pZCA9IDIwLAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl9pbWljX2ZmYV9kYXRhIH0sCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdAotCWloc19zdGVyZW9fc3BlYWtlcl9zdGVyZW9fcnhfNDhLSHpfb3NyMjU2X2FjdGlvbnNbXSA9Ci0JSEVBRFNFVF9TVEVSRU9fU1BFQUtFUl9TVEVSRU9fUlhfQ0FQTEVTU180ODAwMF9PU1JfMjU2OwotCi0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkKLQlpaHNfc3RlcmVvX3NwZWFrZXJfc3RlcmVvX3J4X3NldHRpbmdzW10gPSB7Ci0JewotCQkuZnJlcV9wbGFuID0gNDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaWhzX3N0ZXJlb19zcGVha2VyX3N0ZXJlb19yeF80OEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9Ci0JCUFSUkFZX1NJWkUoaWhzX3N0ZXJlb19zcGVha2VyX3N0ZXJlb19yeF80OEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2Rldl9wcm9maWxlIGloc19zdGVyZW9fc3BlYWtlcl9zdGVyZW9fcnhfcHJvZmlsZSA9IHsKLQkucGF0aF90eXBlID0gQURJRV9DT0RFQ19SWCwKLQkuc2V0dGluZ3MgPSBpaHNfc3RlcmVvX3NwZWFrZXJfc3RlcmVvX3J4X3NldHRpbmdzLAotCS5zZXR0aW5nX3N6ID0gQVJSQVlfU0laRShpaHNfc3RlcmVvX3NwZWFrZXJfc3RlcmVvX3J4X3NldHRpbmdzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhIHNuZGRldl9paHNfc3RlcmVvX3NwZWFrZXJfc3RlcmVvX3J4X2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9SWCB8IFNORERFVl9DQVBfVk9JQ0UpLAotCS5uYW1lID0gImhlYWRzZXRfc3RlcmVvX3NwZWFrZXJfc3RlcmVvX3J4IiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX0hFQURTRVRfU1RFUkVPX1BMVVNfU1BLUl9TVEVSRU9fUlgsCi0JLnByb2ZpbGUgPSAmaWhzX3N0ZXJlb19zcGVha2VyX3N0ZXJlb19yeF9wcm9maWxlLAotCS5jaGFubmVsX21vZGUgPSAyLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gNDgwMDAsCi0JLnBhbXBfb24gPSBtc21fc25kZGV2X3Bvd2VyYW1wX29uLAotCS5wYW1wX29mZiA9IG1zbV9zbmRkZXZfcG93ZXJhbXBfb2ZmLAotCS52b2x0YWdlX29uID0gbXNtX3NuZGRldl9oc2VkX3ZvbHRhZ2Vfb24sCi0JLnZvbHRhZ2Vfb2ZmID0gbXNtX3NuZGRldl9oc2VkX3ZvbHRhZ2Vfb2ZmLAotCS5tYXhfdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAtNTAwLAotCS5taW5fdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAtMjAwMCwKLQkubWF4X3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gLTUwMCwKLQkubWluX3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gLTIwMDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21faWhzX3N0ZXJlb19zcGVha2VyX3N0ZXJlb19yeF9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X2ljb2RlYyIsCi0JLmlkID0gMjEsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2loc19zdGVyZW9fc3BlYWtlcl9zdGVyZW9fcnhfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfbWkyc19kYXRhIHNuZGRldl9taTJzX3N0ZXJlb19yeF9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gU05EREVWX0NBUF9SWCAsCi0JLm5hbWUgPSAiaGRtaV9zdGVyZW9fcngiLAotCS5jb3BwX2lkID0gMywKLQkuYWNkYl9pZCA9IEFDREJfSURfSERNSSwKLQkuY2hhbm5lbF9tb2RlID0gMiwKLQkuc2RfbGluZXMgPSBNSTJTX1NEXzAsCi0JLnJvdXRlID0gbXNtX3NuZGRldl90eF9yb3V0ZV9jb25maWcsCi0JLmRlcm91dGUgPSBtc21fc25kZGV2X3R4X3JvdXRlX2RlY29uZmlnLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gNDgwMDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21fc25kZGV2X21pMnNfc3RlcmVvX3J4X2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfbWkycyIsCi0JLmlkID0gMCwKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfbWkyc19zdGVyZW9fcnhfZGF0YSB9LAotfTsKLQotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9taTJzX2RhdGEgc25kZGV2X21pMnNfZm1fdHhfZGF0YSA9IHsKLQkuY2FwYWJpbGl0eSA9IFNORERFVl9DQVBfVFggLAotCS5uYW1lID0gImZtcmFkaW9fc3RlcmVvX3R4IiwKLQkuY29wcF9pZCA9IDIsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX0ZNX1RYLAotCS5jaGFubmVsX21vZGUgPSAyLAotCS5zZF9saW5lcyA9IE1JMlNfU0RfMywKLQkucm91dGUgPSBOVUxMLAotCS5kZXJvdXRlID0gTlVMTCwKLQkuZGVmYXVsdF9zYW1wbGVfcmF0ZSA9IDQ4MDAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgIG1zbV9zbmRkZXZfbWkyc19mbV90eF9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X21pMnMiLAotCS5pZCA9IDEsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X21pMnNfZm1fdHhfZGF0YX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSBzbmRkZXZfZmx1aWRfaW1pY190eF9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfVFggfCBTTkRERVZfQ0FQX1ZPSUNFKSwKLQkubmFtZSA9ICJoYW5kc2V0X3R4IiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX1NQS1JfUEhPTkVfTUlDLAotCS5wcm9maWxlID0gJmlzcGVha2VyX3R4X3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IDEsCi0JLnBtY3RsX2lkID0gaXNwa19wbWN0bF9pZCwKLQkucG1jdGxfaWRfc3ogPSBBUlJBWV9TSVpFKGlzcGtfcG1jdGxfaWQpLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gNDgwMDAsCi0JLnBhbXBfb24gPSBtc21fc25kZGV2X3R4X3JvdXRlX2NvbmZpZywKLQkucGFtcF9vZmYgPSBtc21fc25kZGV2X3R4X3JvdXRlX2RlY29uZmlnLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXNtX2ZsdWlkX2ltaWNfdHhfZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl9pY29kZWMiLAotCS5pZCA9IDIyLAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl9mbHVpZF9pbWljX3R4X2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhIHNuZGRldl9mbHVpZF9pZWFycGllY2VfcnhfZGF0YSA9IHsKLQkuY2FwYWJpbGl0eSA9IChTTkRERVZfQ0FQX1JYIHwgU05EREVWX0NBUF9WT0lDRSksCi0JLm5hbWUgPSAiaGFuZHNldF9yeCIsCi0JLmNvcHBfaWQgPSAwLAotCS5hY2RiX2lkID0gQUNEQl9JRF9TUEtSX1BIT05FX1NURVJFTywKLQkucHJvZmlsZSA9ICZpc3BlYWtlcl9yeF9wcm9maWxlLAotCS5jaGFubmVsX21vZGUgPSAyLAotCS5wbWN0bF9pZCA9IE5VTEwsCi0JLnBtY3RsX2lkX3N6ID0gMCwKLQkuZGVmYXVsdF9zYW1wbGVfcmF0ZSA9IDQ4MDAwLAotCS5wYW1wX29uID0gJm1zbV9zbmRkZXZfcG93ZXJhbXBfb24sCi0JLnBhbXBfb2ZmID0gJm1zbV9zbmRkZXZfcG93ZXJhbXBfb2ZmLAotCS5tYXhfdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAtNTAwLAotCS5taW5fdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAtMTAwMCwKLQkubWF4X3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gLTUwMCwKLQkubWluX3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gLTEwMDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21fZmx1aWRfaWVhcnBlaWNlX3J4X2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfaWNvZGVjIiwKLQkuaWQgPSAyMywKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfZmx1aWRfaWVhcnBpZWNlX3J4X2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdCBmbHVpZF9pZHVhbF9taWNfZWZfOEtIel9vc3IyNTZfYWN0aW9uc1tdID0KLQlNSUMxX0xFRlRfQVVYX0lOX1JJR0hUXzgwMDBfT1NSXzI1NjsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2h3c2V0dGluZ19lbnRyeSBmbHVpZF9pZHVhbF9taWNfZW5kZmlyZV9zZXR0aW5nc1tdID0gewotCXsKLQkJLmZyZXFfcGxhbiA9IDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gZmx1aWRfaWR1YWxfbWljX2VmXzhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGZsdWlkX2lkdWFsX21pY19lZl84S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9LCAvKiA4S0h6IHByb2ZpbGUgY2FuIGJlIHVzZWQgZm9yIDE2S0h6ICovCi0JewotCQkuZnJlcV9wbGFuID0gMTYwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gZmx1aWRfaWR1YWxfbWljX2VmXzhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGZsdWlkX2lkdWFsX21pY19lZl84S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9LCAvKiA4S0h6IHByb2ZpbGUgY2FuIGFsc28gYmUgdXNlZCBmb3IgNDhLSHogKi8KLQl7Ci0JCS5mcmVxX3BsYW4gPSA0ODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBmbHVpZF9pZHVhbF9taWNfZWZfOEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoZmx1aWRfaWR1YWxfbWljX2VmXzhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBmbHVpZF9pZHVhbF9taWNfZW5kZmlyZV9wcm9maWxlID0gewotCS5wYXRoX3R5cGUgPSBBRElFX0NPREVDX1RYLAotCS5zZXR0aW5ncyA9IGZsdWlkX2lkdWFsX21pY19lbmRmaXJlX3NldHRpbmdzLAotCS5zZXR0aW5nX3N6ID0gQVJSQVlfU0laRShmbHVpZF9pZHVhbF9taWNfZW5kZmlyZV9zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgZW51bSBoc2VkX2NvbnRyb2xsZXIgZmx1aWRfaWR1YWxfbWljX2VuZGZpcmVfcG1jdGxfaWRbXSA9IHsKLQlQTV9IU0VEX0NPTlRST0xMRVJfMCwgUE1fSFNFRF9DT05UUk9MTEVSXzIKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhIHNuZGRldl9mbHVpZF9pZHVhbF9taWNfZW5kZmlyZV9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfVFggfCBTTkRERVZfQ0FQX1ZPSUNFKSwKLQkubmFtZSA9ICJoYW5kc2V0X2R1YWxfbWljX2VuZGZpcmVfdHgiLAotCS5jb3BwX2lkID0gMCwKLQkuYWNkYl9pZCA9IEFDREJfSURfU1BLUl9QSE9ORV9NSUNfRU5ERklSRSwKLQkucHJvZmlsZSA9ICZmbHVpZF9pZHVhbF9taWNfZW5kZmlyZV9wcm9maWxlLAotCS5jaGFubmVsX21vZGUgPSAyLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gNDgwMDAsCi0JLnBtY3RsX2lkID0gZmx1aWRfaWR1YWxfbWljX2VuZGZpcmVfcG1jdGxfaWQsCi0JLnBtY3RsX2lkX3N6ID0gQVJSQVlfU0laRShmbHVpZF9pZHVhbF9taWNfZW5kZmlyZV9wbWN0bF9pZCksCi0JLnBhbXBfb24gPSBtc21fc25kZGV2X3R4X3JvdXRlX2NvbmZpZywKLQkucGFtcF9vZmYgPSBtc21fc25kZGV2X3R4X3JvdXRlX2RlY29uZmlnLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXNtX2ZsdWlkX2lkdWFsX21pY19lbmRmaXJlX2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfaWNvZGVjIiwKLQkuaWQgPSAyNCwKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfZmx1aWRfaWR1YWxfbWljX2VuZGZpcmVfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgc25kZGV2X2ZsdWlkX3Nwa19pZHVhbF9taWNfZW5kZmlyZV9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfVFggfCBTTkRERVZfQ0FQX1ZPSUNFKSwKLQkubmFtZSA9ICJzcGVha2VyX2R1YWxfbWljX2VuZGZpcmVfdHgiLAotCS5jb3BwX2lkID0gMCwKLQkuYWNkYl9pZCA9IEFDREJfSURfU1BLUl9QSE9ORV9NSUNfRU5ERklSRSwKLQkucHJvZmlsZSA9ICZmbHVpZF9pZHVhbF9taWNfZW5kZmlyZV9wcm9maWxlLAotCS5jaGFubmVsX21vZGUgPSAyLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gNDgwMDAsCi0JLnBtY3RsX2lkID0gZmx1aWRfaWR1YWxfbWljX2VuZGZpcmVfcG1jdGxfaWQsCi0JLnBtY3RsX2lkX3N6ID0gQVJSQVlfU0laRShmbHVpZF9pZHVhbF9taWNfZW5kZmlyZV9wbWN0bF9pZCksCi0JLnBhbXBfb24gPSBtc21fc25kZGV2X3R4X3JvdXRlX2NvbmZpZywKLQkucGFtcF9vZmYgPSBtc21fc25kZGV2X3R4X3JvdXRlX2RlY29uZmlnLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXNtX2ZsdWlkX3Nwa19pZHVhbF9taWNfZW5kZmlyZV9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X2ljb2RlYyIsCi0JLmlkID0gMjUsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2ZsdWlkX3Nwa19pZHVhbF9taWNfZW5kZmlyZV9kYXRhIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl92aXJ0dWFsX2RhdGEgc25kZGV2X2EyZHBfdHhfZGF0YSA9IHsKLQkuY2FwYWJpbGl0eSA9IFNORERFVl9DQVBfVFgsCi0JLm5hbWUgPSAiYTJkcF90eCIsCi0JLmNvcHBfaWQgPSA1LAotCS5hY2RiX2lkID0gUFNFVURPX0FDREJfSUQsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl92aXJ0dWFsX2RhdGEgc25kZGV2X2EyZHBfcnhfZGF0YSA9IHsKLQkuY2FwYWJpbGl0eSA9IFNORERFVl9DQVBfUlgsCi0JLm5hbWUgPSAiYTJkcF9yeCIsCi0JLmNvcHBfaWQgPSAyLAotCS5hY2RiX2lkID0gUFNFVURPX0FDREJfSUQsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21fYTJkcF9yeF9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X3ZpcnR1YWwiLAotCS5pZCA9IDAsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2EyZHBfcnhfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXNtX2EyZHBfdHhfZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl92aXJ0dWFsIiwKLQkuaWQgPSAxLAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl9hMmRwX3R4X2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X3ZpcnR1YWxfZGF0YSBzbmRkZXZfdXBsaW5rX3J4X2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSBTTkRERVZfQ0FQX1JYLAotCS5uYW1lID0gInVwbGlua19yeCIsCi0JLmNvcHBfaWQgPSA1LAotCS5hY2RiX2lkID0gUFNFVURPX0FDREJfSUQsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21fdXBsaW5rX3J4X2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfdmlydHVhbCIsCi0JLmlkID0gMiwKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfdXBsaW5rX3J4X2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzbmRfZGV2aWNlc19mZmFbXSBfX2luaXRkYXRhID0gewotCSZtc21faWVhcnBpZWNlX2ZmYV9kZXZpY2UsCi0JJm1zbV9pbWljX2ZmYV9kZXZpY2UsCi0JJm1zbV9pZm1yYWRpb19oYW5kc2V0X2RldmljZSwKLQkmbXNtX2loc19mZmFfc3RlcmVvX3J4X2RldmljZSwKLQkmbXNtX2loc19mZmFfbW9ub19yeF9kZXZpY2UsCi0JJm1zbV9paHNfbW9ub190eF9kZXZpY2UsCi0JJm1zbV9idF9zY29fZWFycGllY2VfZGV2aWNlLAotCSZtc21fYnRfc2NvX21pY19kZXZpY2UsCi0JJm1zbV9pc3BlYWtlcl9yeF9kZXZpY2UsCi0JJm1zbV9pZm1yYWRpb19zcGVha2VyX2RldmljZSwKLQkmbXNtX2lmbXJhZGlvX2ZmYV9oZWFkc2V0X2RldmljZSwKLQkmbXNtX2lkdWFsX21pY19lbmRmaXJlX2RldmljZSwKLQkmbXNtX2lkdWFsX21pY19icm9hZHNpZGVfZGV2aWNlLAotCSZtc21fc3BrX2lkdWFsX21pY19lbmRmaXJlX2RldmljZSwKLQkmbXNtX3Nwa19pZHVhbF9taWNfYnJvYWRzaWRlX2RldmljZSwKLQkmbXNtX2l0dHlfaHNfbW9ub190eF9kZXZpY2UsCi0JJm1zbV9pdHR5X2hzX21vbm9fcnhfZGV2aWNlLAotCSZtc21faXNwZWFrZXJfdHhfZGV2aWNlLAotCSZtc21faWhzX3N0ZXJlb19zcGVha2VyX3N0ZXJlb19yeF9kZXZpY2UsCi0JJm1zbV9hMmRwX3J4X2RldmljZSwKLQkmbXNtX2EyZHBfdHhfZGV2aWNlLAotCSZtc21fc25kZGV2X21pMnNfc3RlcmVvX3J4X2RldmljZSwKLQkmbXNtX3NuZGRldl9taTJzX2ZtX3R4X2RldmljZSwKLQkmbXNtX3VwbGlua19yeF9kZXZpY2UsCi0JJm1zbV9yZWFsX3N0ZXJlb190eF9kZXZpY2UsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc25kX2RldmljZXNfc3VyZltdIF9faW5pdGRhdGEgPSB7Ci0JJm1zbV9pZWFycGllY2VfZGV2aWNlLAotCSZtc21faW1pY19kZXZpY2UsCi0JJm1zbV9paHNfc3RlcmVvX3J4X2RldmljZSwKLQkmbXNtX2loc19tb25vX3J4X2RldmljZSwKLQkmbXNtX2loc19tb25vX3R4X2RldmljZSwKLQkmbXNtX2J0X3Njb19lYXJwaWVjZV9kZXZpY2UsCi0JJm1zbV9idF9zY29fbWljX2RldmljZSwKLQkmbXNtX2lmbXJhZGlvX2hhbmRzZXRfZGV2aWNlLAotCSZtc21faXNwZWFrZXJfcnhfZGV2aWNlLAotCSZtc21faWZtcmFkaW9fc3BlYWtlcl9kZXZpY2UsCi0JJm1zbV9pZm1yYWRpb19oZWFkc2V0X2RldmljZSwKLQkmbXNtX2l0dHlfaHNfbW9ub190eF9kZXZpY2UsCi0JJm1zbV9pdHR5X2hzX21vbm9fcnhfZGV2aWNlLAotCSZtc21faXNwZWFrZXJfdHhfZGV2aWNlLAotCSZtc21faWhzX3N0ZXJlb19zcGVha2VyX3N0ZXJlb19yeF9kZXZpY2UsCi0JJm1zbV9hMmRwX3J4X2RldmljZSwKLQkmbXNtX2EyZHBfdHhfZGV2aWNlLAotCSZtc21fc25kZGV2X21pMnNfc3RlcmVvX3J4X2RldmljZSwKLQkmbXNtX3NuZGRldl9taTJzX2ZtX3R4X2RldmljZSwKLQkmbXNtX3VwbGlua19yeF9kZXZpY2UsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc25kX2RldmljZXNfZmx1aWRbXSBfX2luaXRkYXRhID0gewotCSZtc21faWhzX3N0ZXJlb19yeF9kZXZpY2UsCi0JJm1zbV9paHNfbW9ub19yeF9kZXZpY2UsCi0JJm1zbV9paHNfbW9ub190eF9kZXZpY2UsCi0JJm1zbV9pc3BlYWtlcl9yeF9kZXZpY2UsCi0JJm1zbV9pc3BlYWtlcl90eF9kZXZpY2UsCi0JJm1zbV9mbHVpZF9pbWljX3R4X2RldmljZSwKLQkmbXNtX2ZsdWlkX2llYXJwZWljZV9yeF9kZXZpY2UsCi0JJm1zbV9mbHVpZF9pZHVhbF9taWNfZW5kZmlyZV9kZXZpY2UsCi0JJm1zbV9mbHVpZF9zcGtfaWR1YWxfbWljX2VuZGZpcmVfZGV2aWNlLAotCSZtc21fYTJkcF9yeF9kZXZpY2UsCi0JJm1zbV9hMmRwX3R4X2RldmljZSwKLQkmbXNtX3NuZGRldl9taTJzX3N0ZXJlb19yeF9kZXZpY2UsCi0JJm1zbV91cGxpbmtfcnhfZGV2aWNlLAotCSZtc21faWZtcmFkaW9fc3BlYWtlcl9kZXZpY2UsCi0JJm1zbV9pZm1yYWRpb19oZWFkc2V0X2RldmljZSwKLX07Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyB2b2lkIHNuZGRldl9oc2VkX2NvbmZpZ19tb2RpZnlfc2V0dGluZyhpbnQgdHlwZSkKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2U7Ci0Jc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSAqaWNvZGVjX2RhdGE7Ci0KLQlkZXZpY2UgPSAmbXNtX2loc19mZmFfc3RlcmVvX3J4X2RldmljZTsKLQlpY29kZWNfZGF0YSA9IChzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhICopZGV2aWNlLT5kZXYucGxhdGZvcm1fZGF0YTsKLQotCWlmIChpY29kZWNfZGF0YSkgewotCQlpZiAodHlwZSA9PSAxKSB7Ci0JCQlpY29kZWNfZGF0YS0+dm9sdGFnZV9vbiA9IE5VTEw7Ci0JCQlpY29kZWNfZGF0YS0+dm9sdGFnZV9vZmYgPSBOVUxMOwotCQkJaWNvZGVjX2RhdGEtPnByb2ZpbGUtPnNldHRpbmdzID0KLQkJCQlpaHNfZmZhX3N0ZXJlb19yeF9jbGFzc19kX2xlZ2FjeV9zZXR0aW5nczsKLQkJCWljb2RlY19kYXRhLT5wcm9maWxlLT5zZXR0aW5nX3N6ID0KLQkJCUFSUkFZX1NJWkUoaWhzX2ZmYV9zdGVyZW9fcnhfY2xhc3NfZF9sZWdhY3lfc2V0dGluZ3MpOwotCQl9IGVsc2UgaWYgKHR5cGUgPT0gMikgewotCQkJaWNvZGVjX2RhdGEtPnZvbHRhZ2Vfb24gPSBOVUxMOwotCQkJaWNvZGVjX2RhdGEtPnZvbHRhZ2Vfb2ZmID0gTlVMTDsKLQkJCWljb2RlY19kYXRhLT5wcm9maWxlLT5zZXR0aW5ncyA9Ci0JCQkJaWhzX2ZmYV9zdGVyZW9fcnhfY2xhc3NfYWJfbGVnYWN5X3NldHRpbmdzOwotCQkJaWNvZGVjX2RhdGEtPnByb2ZpbGUtPnNldHRpbmdfc3ogPQotCQkJQVJSQVlfU0laRShpaHNfZmZhX3N0ZXJlb19yeF9jbGFzc19hYl9sZWdhY3lfc2V0dGluZ3MpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzbmRkZXZfaHNlZF9jb25maWdfcmVzdG9yZV9zZXR0aW5nKHZvaWQpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlOwotCXN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgKmljb2RlY19kYXRhOwotCi0JZGV2aWNlID0gJm1zbV9paHNfZmZhX3N0ZXJlb19yeF9kZXZpY2U7Ci0JaWNvZGVjX2RhdGEgPSAoc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSAqKWRldmljZS0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQlpZiAoaWNvZGVjX2RhdGEpIHsKLQkJaWNvZGVjX2RhdGEtPnZvbHRhZ2Vfb24gPSBtc21fc25kZGV2X2hzZWRfdm9sdGFnZV9vbjsKLQkJaWNvZGVjX2RhdGEtPnZvbHRhZ2Vfb2ZmID0gbXNtX3NuZGRldl9oc2VkX3ZvbHRhZ2Vfb2ZmOwotCQlpY29kZWNfZGF0YS0+cHJvZmlsZS0+c2V0dGluZ3MgPSBpaHNfZmZhX3N0ZXJlb19yeF9zZXR0aW5nczsKLQkJaWNvZGVjX2RhdGEtPnByb2ZpbGUtPnNldHRpbmdfc3ogPQotCQkJQVJSQVlfU0laRShpaHNfZmZhX3N0ZXJlb19yeF9zZXR0aW5ncyk7Ci0JfQotfQotCi1zdGF0aWMgc3NpemVfdCBzbmRkZXZfaHNlZF9jb25maWdfZGVidWdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsCi0JY29uc3QgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKLXsKLQljaGFyICpsYl9zdHIgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBjbWQ7Ci0KLQlpZiAoZ2V0X3VzZXIoY21kLCB1YnVmKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoIXN0cmNtcChsYl9zdHIsICJtc21faHNlZF9jb25maWciKSkgewotCQlzd2l0Y2ggKGNtZCkgewotCQljYXNlICcwJzoKLQkJCXNuZGRldl9oc2VkX2NvbmZpZ19yZXN0b3JlX3NldHRpbmcoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJzEnOgotCQkJc25kZGV2X2hzZWRfY29uZmlnX21vZGlmeV9zZXR0aW5nKDEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnMic6Ci0JCQlzbmRkZXZfaHNlZF9jb25maWdfbW9kaWZ5X3NldHRpbmcoMik7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIGNudDsKLX0KLQotc3RhdGljIGludCBzbmRkZXZfaHNlZF9jb25maWdfZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbmRkZXZfaHNlZF9jb25maWdfZGVidWdfZm9wcyA9IHsKLQkub3BlbiA9IHNuZGRldl9oc2VkX2NvbmZpZ19kZWJ1Z19vcGVuLAotCS53cml0ZSA9IHNuZGRldl9oc2VkX2NvbmZpZ19kZWJ1Z193cml0ZQotfTsKLSNlbmRpZgotCi12b2lkIF9fcmVmIG1zbV9zbmRkZXZfaW5pdCh2b2lkKQotewotCWlmIChtYWNoaW5lX2lzX21zbTd4MzBfZmZhKCkgfHwgbWFjaGluZV9pc19tc204eDU1X2ZmYSgpIHx8Ci0JCW1hY2hpbmVfaXNfbXNtOHg1NV9zdmx0ZV9mZmEoKSkgewotCQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzbmRfZGV2aWNlc19mZmEsCi0JCUFSUkFZX1NJWkUoc25kX2RldmljZXNfZmZhKSk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JCWRlYnVnZnNfaHNlZF9jb25maWcgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJtc21faHNlZF9jb25maWciLAotCQkJCQlTX0lGUkVHIHwgU19JUlVHTywgTlVMTCwKLQkJKHZvaWQgKikgIm1zbV9oc2VkX2NvbmZpZyIsICZzbmRkZXZfaHNlZF9jb25maWdfZGVidWdfZm9wcyk7Ci0jZW5kaWYKLQl9IGVsc2UgaWYgKG1hY2hpbmVfaXNfbXNtN3gzMF9zdXJmKCkgfHwgbWFjaGluZV9pc19tc204eDU1X3N1cmYoKSB8fAotCQltYWNoaW5lX2lzX21zbTh4NTVfc3ZsdGVfc3VyZigpKQotCQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzbmRfZGV2aWNlc19zdXJmLAotCQlBUlJBWV9TSVpFKHNuZF9kZXZpY2VzX3N1cmYpKTsKLQllbHNlIGlmIChtYWNoaW5lX2lzX21zbTd4MzBfZmx1aWQoKSkKLQkJcGxhdGZvcm1fYWRkX2RldmljZXMoc25kX2RldmljZXNfZmx1aWQsCi0JCUFSUkFZX1NJWkUoc25kX2RldmljZXNfZmx1aWQpKTsKLQllbHNlCi0JCXByX2VycigiJXM6IFVua25vd24gbWFjaGluZSB0eXBlXG4iLCBfX2Z1bmNfXyk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL3NuZGRldl9kYXRhX3RpbXBhbmkuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvc25kZGV2X2RhdGFfdGltcGFuaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGU0ZGFkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvc25kZGV2X2RhdGFfdGltcGFuaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAwNiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL21zbS1hZGllLWNvZGVjLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1eF9wY20uaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvc25kZGV2X2Vjb2RlYy5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvc25kZGV2X2ljb2RlYy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9zbmRkZXZfbWkycy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9taTJzLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2FjZGJfZGVmLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3NuZGRldl92aXJ0dWFsLmg+Ci0jaW5jbHVkZSAidGltcGFuaV9wcm9maWxlXzd4MzAuaCIKLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotCi0vKiBkZWZpbmUgdGhlIHZhbHVlIGZvciBCVF9TQ08gKi8KLSNkZWZpbmUgQlRfU0NPX1BDTV9DVExfVkFMIChQQ01fQ1RMX19SUENNX1dJRFRIX19MSU5FQVJfViB8XAotCQlQQ01fQ1RMX19UUENNX1dJRFRIX19MSU5FQVJfVikKLSNkZWZpbmUgQlRfU0NPX0RBVEFfRk9STUFUX1BBRERJTkcgKERBVEFfRk9STUFUX1BBRERJTkdfSU5GT19fUlBDTV9GT1JNQVRfViB8XAotCQlEQVRBX0ZPUk1BVF9QQURESU5HX0lORk9fX1RQQ01fRk9STUFUX1YpCi0jZGVmaW5lIEJUX1NDT19BVVhfQ09ERUNfSU5URiAgIEFVWF9DT0RFQ19JTlRGX0NUTF9fUENNSU5URl9EQVRBX0VOX1YKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfaHNlZF9jb25maWc7Ci1zdGF0aWMgdm9pZCBzbmRkZXZfaHNlZF9jb25maWdfbW9kaWZ5X3NldHRpbmcoaW50IHR5cGUpOwotc3RhdGljIHZvaWQgc25kZGV2X2hzZWRfY29uZmlnX3Jlc3RvcmVfc2V0dGluZyh2b2lkKTsKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgaWVhcnBpZWNlX2ZmYV80OEtIel9vc3IyNTZfYWN0aW9uc1tdID0KLQlFQVJfUFJJX01PTk9fODAwMF9PU1JfMjU2OyAvKiA4MDAwIHByb2ZpbGUgYWxzbyB3b3JrcyBmb3IgNDhrICovCi0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaWVhcnBpZWNlX2ZmYV9zZXR0aW5nc1tdID0gewotCXsKLQkJLmZyZXFfcGxhbiA9IDQ4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGllYXJwaWVjZV9mZmFfNDhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGllYXJwaWVjZV9mZmFfNDhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpZWFycGllY2VfZmZhX3Byb2ZpbGUgPSB7Ci0JLnBhdGhfdHlwZSA9IEFESUVfQ09ERUNfUlgsCi0JLnNldHRpbmdzID0gaWVhcnBpZWNlX2ZmYV9zZXR0aW5ncywKLQkuc2V0dGluZ19zeiA9IEFSUkFZX1NJWkUoaWVhcnBpZWNlX2ZmYV9zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSBzbmRkZXZfaWVhcnBpZWNlX2ZmYV9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfUlggfCBTTkRERVZfQ0FQX1ZPSUNFKSwKLQkubmFtZSA9ICJoYW5kc2V0X3J4IiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX0hBTkRTRVRfU1BLUiwKLQkucHJvZmlsZSA9ICZpZWFycGllY2VfZmZhX3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IDEsCi0JLnBtY3RsX2lkID0gTlVMTCwKLQkucG1jdGxfaWRfc3ogPSAwLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gNDgwMDAsCi0JLnBhbXBfb24gPSBOVUxMLAotCS5wYW1wX29mZiA9IE5VTEwsCi0JLnByb3BlcnR5ID0gU0lERV9UT05FX01BU0ssCi0JLm1heF92b2ljZV9yeF92b2xbVk9DX05CX0lOREVYXSA9IC03MDAsCi0JLm1pbl92b2ljZV9yeF92b2xbVk9DX05CX0lOREVYXSA9IC0yMjAwLAotCS5tYXhfdm9pY2Vfcnhfdm9sW1ZPQ19XQl9JTkRFWF0gPSAtMTQwMCwKLQkubWluX3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gLTI5MDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21faWVhcnBpZWNlX2ZmYV9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X2ljb2RlYyIsCi0JLmlkID0gMTksCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2llYXJwaWVjZV9mZmFfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IGltaWNfZmZhXzQ4S0h6X29zcjI1Nl9hY3Rpb25zW10gPQotCUFNSUNfUFJJX01PTk9fODAwMF9PU1JfMjU2OyAvKiA4MDAwIHByb2ZpbGUgYWxzbyB3b3JrcyBmb3IgNDhrICovCi0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaW1pY19mZmFfc2V0dGluZ3NbXSA9IHsKLQl7Ci0JCS5mcmVxX3BsYW4gPSA0ODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpbWljX2ZmYV80OEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaW1pY19mZmFfNDhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBlbnVtIGhzZWRfY29udHJvbGxlciBpbWljX3BtY3RsX2lkW10gPSB7UE1fSFNFRF9DT05UUk9MTEVSXzB9OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfZGV2X3Byb2ZpbGUgaW1pY19mZmFfcHJvZmlsZSA9IHsKLQkucGF0aF90eXBlID0gQURJRV9DT0RFQ19UWCwKLQkuc2V0dGluZ3MgPSBpbWljX2ZmYV9zZXR0aW5ncywKLQkuc2V0dGluZ19zeiA9IEFSUkFZX1NJWkUoaW1pY19mZmFfc2V0dGluZ3MpLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgc25kZGV2X2ltaWNfZmZhX2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9UWCB8IFNORERFVl9DQVBfVk9JQ0UpLAotCS5uYW1lID0gImhhbmRzZXRfdHgiLAotCS5jb3BwX2lkID0gMCwKLQkuYWNkYl9pZCA9IEFDREJfSURfSEFORFNFVF9NSUMsCi0JLnByb2ZpbGUgPSAmaW1pY19mZmFfcHJvZmlsZSwKLQkuY2hhbm5lbF9tb2RlID0gMSwKLQkucG1jdGxfaWQgPSBpbWljX3BtY3RsX2lkLAotCS5wbWN0bF9pZF9zeiA9IEFSUkFZX1NJWkUoaW1pY19wbWN0bF9pZCksCi0JLmRlZmF1bHRfc2FtcGxlX3JhdGUgPSA0ODAwMCwKLQkucGFtcF9vbiA9IE5VTEwsCi0JLnBhbXBfb2ZmID0gTlVMTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zbV9pbWljX2ZmYV9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X2ljb2RlYyIsCi0JLmlkID0gMjAsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2ltaWNfZmZhX2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdCBpc3Brcl9zdGVyZW9fNDhLSHpfb3NyMjU2X2FjdGlvbnNbXSA9Ci0JU1BFQUtFUl9QUklfU1RFUkVPXzQ4MDAwX09TUl8yNTY7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaXNwa3Jfc3RlcmVvX3NldHRpbmdzW10gPSB7Ci0JewotCQkuZnJlcV9wbGFuID0gNDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaXNwa3Jfc3RlcmVvXzQ4S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpc3Brcl9zdGVyZW9fNDhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpc3Brcl9zdGVyZW9fcHJvZmlsZSA9IHsKLQkucGF0aF90eXBlID0gQURJRV9DT0RFQ19SWCwKLQkuc2V0dGluZ3MgPSBpc3Brcl9zdGVyZW9fc2V0dGluZ3MsCi0JLnNldHRpbmdfc3ogPSBBUlJBWV9TSVpFKGlzcGtyX3N0ZXJlb19zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSBzbmRkZXZfaXNwa3Jfc3RlcmVvX2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9SWCB8IFNORERFVl9DQVBfVk9JQ0UpLAotCS5uYW1lID0gInNwZWFrZXJfc3RlcmVvX3J4IiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX1NQS1JfUEhPTkVfU1RFUkVPLAotCS5wcm9maWxlID0gJmlzcGtyX3N0ZXJlb19wcm9maWxlLAotCS5jaGFubmVsX21vZGUgPSAyLAotCS5wbWN0bF9pZCA9IE5VTEwsCi0JLnBtY3RsX2lkX3N6ID0gMCwKLQkuZGVmYXVsdF9zYW1wbGVfcmF0ZSA9IDQ4MDAwLAotCS5wYW1wX29uID0gbXNtX3NuZGRldl9wb3dlcmFtcF9vbiwKLQkucGFtcF9vZmYgPSBtc21fc25kZGV2X3Bvd2VyYW1wX29mZiwKLQkubWF4X3ZvaWNlX3J4X3ZvbFtWT0NfTkJfSU5ERVhdID0gMTAwMCwKLQkubWluX3ZvaWNlX3J4X3ZvbFtWT0NfTkJfSU5ERVhdID0gLTUwMCwKLQkubWF4X3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gMTAwMCwKLQkubWluX3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gLTUwMAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXNtX2lzcGtyX3N0ZXJlb19kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X2ljb2RlYyIsCi0JLmlkID0gOCwKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfaXNwa3Jfc3RlcmVvX2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdCBpaGVhZHNldF9taWNfdHhfb3NyMjU2X2FjdGlvbnNbXSA9Ci0JQU1JQzFfSEVBRFNFVF9UWF9NT05PX1BSSU1BUllfT1NSMjU2OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfaHdzZXR0aW5nX2VudHJ5IGloZWFkc2V0X21pY190eF9zZXR0aW5nc1tdID0gewotCXsKLQkJLmZyZXFfcGxhbiA9IDQ4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGloZWFkc2V0X21pY190eF9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaWhlYWRzZXRfbWljX3R4X29zcjI1Nl9hY3Rpb25zKSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfZGV2X3Byb2ZpbGUgaWhlYWRzZXRfbWljX3Byb2ZpbGUgPSB7Ci0JLnBhdGhfdHlwZSA9IEFESUVfQ09ERUNfVFgsCi0JLnNldHRpbmdzID0gaWhlYWRzZXRfbWljX3R4X3NldHRpbmdzLAotCS5zZXR0aW5nX3N6ID0gQVJSQVlfU0laRShpaGVhZHNldF9taWNfdHhfc2V0dGluZ3MpLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgc25kZGV2X2hlYWRzZXRfbWljX2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9UWCB8IFNORERFVl9DQVBfVk9JQ0UpLAotCS5uYW1lID0gImhlYWRzZXRfbW9ub190eCIsCi0JLmNvcHBfaWQgPSAwLAotCS5hY2RiX2lkID0gQUNEQl9JRF9IRUFEU0VUX01JQywKLQkucHJvZmlsZSA9ICZpaGVhZHNldF9taWNfcHJvZmlsZSwKLQkuY2hhbm5lbF9tb2RlID0gMSwKLQkucG1jdGxfaWQgPSBOVUxMLAotCS5wbWN0bF9pZF9zeiA9IDAsCi0JLmRlZmF1bHRfc2FtcGxlX3JhdGUgPSA0ODAwMCwKLQkucGFtcF9vbiA9IG1zbV9zbmRkZXZfdHhfcm91dGVfY29uZmlnLAotCS5wYW1wX29mZiA9IG1zbV9zbmRkZXZfdHhfcm91dGVfZGVjb25maWcsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21faGVhZHNldF9taWNfZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl9pY29kZWMiLAotCS5pZCA9IDYsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2hlYWRzZXRfbWljX2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X21pMnNfZGF0YSBzbmRkZXZfbWkyc19mbV90eF9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gU05EREVWX0NBUF9UWCAsCi0JLm5hbWUgPSAiZm1yYWRpb19zdGVyZW9fdHgiLAotCS5jb3BwX2lkID0gMiwKLQkuYWNkYl9pZCA9IEFDREJfSURfRk1fVFgsCi0JLmNoYW5uZWxfbW9kZSA9IDIsCi0JLnNkX2xpbmVzID0gTUkyU19TRF8zLAotCS5yb3V0ZSA9IE5VTEwsCi0JLmRlcm91dGUgPSBOVUxMLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gNDgwMDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAgbXNtX3NuZGRldl9taTJzX2ZtX3R4X2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfbWkycyIsCi0JLmlkID0gMSwKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfbWkyc19mbV90eF9kYXRhfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X21pMnNfZGF0YSBzbmRkZXZfbWkyc19mbV9yeF9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gU05EREVWX0NBUF9SWCAsCi0JLm5hbWUgPSAiZm1yYWRpb19zdGVyZW9fcngiLAotCS5jb3BwX2lkID0gMywKLQkuYWNkYl9pZCA9IEFDREJfSURfRk1fUlgsCi0JLmNoYW5uZWxfbW9kZSA9IDIsCi0JLnNkX2xpbmVzID0gTUkyU19TRF8zLAotCS5yb3V0ZSA9IE5VTEwsCi0JLmRlcm91dGUgPSBOVUxMLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gNDgwMDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAgbXNtX3NuZGRldl9taTJzX2ZtX3J4X2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfbWkycyIsCi0JLmlkID0gMiwKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfbWkyc19mbV9yeF9kYXRhfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2Vjb2RlY19kYXRhIHNuZGRldl9idF9zY29fZWFycGllY2VfZGF0YSA9IHsKLQkuY2FwYWJpbGl0eSA9IChTTkRERVZfQ0FQX1JYIHwgU05EREVWX0NBUF9WT0lDRSksCi0JLm5hbWUgPSAiYnRfc2NvX3J4IiwKLQkuY29wcF9pZCA9IDEsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX0JUX1NDT19TUEtSLAotCS5jaGFubmVsX21vZGUgPSAxLAotCS5jb25mX3BjbV9jdGxfdmFsID0gQlRfU0NPX1BDTV9DVExfVkFMLAotCS5jb25mX2F1eF9jb2RlY19pbnRmID0gQlRfU0NPX0FVWF9DT0RFQ19JTlRGLAotCS5jb25mX2RhdGFfZm9ybWF0X3BhZGRpbmdfdmFsID0gQlRfU0NPX0RBVEFfRk9STUFUX1BBRERJTkcsCi0JLm1heF92b2ljZV9yeF92b2xbVk9DX05CX0lOREVYXSA9IDQwMCwKLQkubWluX3ZvaWNlX3J4X3ZvbFtWT0NfTkJfSU5ERVhdID0gLTExMDAsCi0JLm1heF92b2ljZV9yeF92b2xbVk9DX1dCX0lOREVYXSA9IDQwMCwKLQkubWluX3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gLTExMDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9lY29kZWNfZGF0YSBzbmRkZXZfYnRfc2NvX21pY19kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfVFggfCBTTkRERVZfQ0FQX1ZPSUNFKSwKLQkubmFtZSA9ICJidF9zY29fdHgiLAotCS5jb3BwX2lkID0gMSwKLQkuYWNkYl9pZCA9IEFDREJfSURfQlRfU0NPX01JQywKLQkuY2hhbm5lbF9tb2RlID0gMSwKLQkuY29uZl9wY21fY3RsX3ZhbCA9IEJUX1NDT19QQ01fQ1RMX1ZBTCwKLQkuY29uZl9hdXhfY29kZWNfaW50ZiA9IEJUX1NDT19BVVhfQ09ERUNfSU5URiwKLQkuY29uZl9kYXRhX2Zvcm1hdF9wYWRkaW5nX3ZhbCA9IEJUX1NDT19EQVRBX0ZPUk1BVF9QQURESU5HLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXNtX2J0X3Njb19lYXJwaWVjZV9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAibXNtX3NuZGRldl9lY29kZWMiLAotCS5pZCA9IDAsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2J0X3Njb19lYXJwaWVjZV9kYXRhIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21fYnRfc2NvX21pY19kZXZpY2UgPSB7Ci0JLm5hbWUgPSAibXNtX3NuZGRldl9lY29kZWMiLAotCS5pZCA9IDEsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2J0X3Njb19taWNfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IGhlYWRzZXRfYWJfY3Bsc180OEtIel9vc3IyNTZfYWN0aW9uc1tdID0KLQlIRUFEU0VUX0FCX0NQTFNfNDgwMDBfT1NSXzI1NjsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2h3c2V0dGluZ19lbnRyeSBoZWFkc2V0X2FiX2NwbHNfc2V0dGluZ3NbXSA9IHsKLQl7Ci0JCS5mcmVxX3BsYW4gPSA0ODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBoZWFkc2V0X2FiX2NwbHNfNDhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGhlYWRzZXRfYWJfY3Bsc180OEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2Rldl9wcm9maWxlIGhlYWRzZXRfYWJfY3Bsc19wcm9maWxlID0gewotCS5wYXRoX3R5cGUgPSBBRElFX0NPREVDX1JYLAotCS5zZXR0aW5ncyA9IGhlYWRzZXRfYWJfY3Bsc19zZXR0aW5ncywKLQkuc2V0dGluZ19zeiA9IEFSUkFZX1NJWkUoaGVhZHNldF9hYl9jcGxzX3NldHRpbmdzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhIHNuZGRldl9paHNfc3RlcmVvX3J4X2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9SWCB8IFNORERFVl9DQVBfVk9JQ0UpLAotCS5uYW1lID0gImhlYWRzZXRfc3RlcmVvX3J4IiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX0hFQURTRVRfU1BLUl9TVEVSRU8sCi0JLnByb2ZpbGUgPSAmaGVhZHNldF9hYl9jcGxzX3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IDIsCi0JLnBtY3RsX2lkID0gTlVMTCwKLQkucG1jdGxfaWRfc3ogPSAwLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gNDgwMDAsCi0JLnBhbXBfb24gPSBOVUxMLAotCS5wYW1wX29mZiA9IE5VTEwsCi0JLnByb3BlcnR5ID0gU0lERV9UT05FX01BU0ssCi0JLnZvbHRhZ2Vfb24gPSBtc21fc25kZGV2X2hzZWRfdm9sdGFnZV9vbiwKLQkudm9sdGFnZV9vZmYgPSBtc21fc25kZGV2X2hzZWRfdm9sdGFnZV9vZmYsCi0JLm1heF92b2ljZV9yeF92b2xbVk9DX05CX0lOREVYXSA9IC03MDAsCi0JLm1pbl92b2ljZV9yeF92b2xbVk9DX05CX0lOREVYXSA9IC0yMjAwLAotCS5tYXhfdm9pY2Vfcnhfdm9sW1ZPQ19XQl9JTkRFWF0gPSAtOTAwLAotCS5taW5fdm9pY2Vfcnhfdm9sW1ZPQ19XQl9JTkRFWF0gPSAtMjQwMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zbV9oZWFkc2V0X3N0ZXJlb19kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X2ljb2RlYyIsCi0JLmlkID0gMiwKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfaWhzX3N0ZXJlb19yeF9kYXRhIH0sCi19OwotCi0vKmRlYnVnIEZTIGludGVyZmFjZSBpcyBleHBvc2VkIHRvIHRlc3QgQ2xhc3MgRCBhbmQgY2xhc3MgQUIgbW9kZQotICogYW1wbGlmZXJzIGZvciBoZWFkc2V0IGRldmljZSBmb2xsb293aW5nIG9wdGlvbnMgYXJlIHN1cHBvcnRlZAotICogMCAtPiBzZXR0aW5ncyB3aWxsIGJlIHJlc3RvcmVkCi0gKiAxIC0+IENsYWRkIEQgbW9kZSBpcyBzZWxlY3RlZAotICogMiAtPiBDbGFzcyBBQiBtb2RlIGlzIHNlbGVjdGVkCi0qLwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0Ci0JaWhzX3N0ZXJlb19yeF9jbGFzc19kX2xlZ2FjeV80OEtIel9vc3IyNTZfYWN0aW9uc1tdID0KLQlIUEhfUFJJX0RfTEVHX1NURVJFTzsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2h3c2V0dGluZ19lbnRyeQotCWloc19zdGVyZW9fcnhfY2xhc3NfZF9sZWdhY3lfc2V0dGluZ3NbXSA9IHsKLQl7Ci0JCS5mcmVxX3BsYW4gPSA0ODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPQotCQlpaHNfc3RlcmVvX3J4X2NsYXNzX2RfbGVnYWN5XzQ4S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRQotCQkoaWhzX3N0ZXJlb19yeF9jbGFzc19kX2xlZ2FjeV80OEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0Ci0JaWhzX3N0ZXJlb19yeF9jbGFzc19hYl9sZWdhY3lfNDhLSHpfb3NyMjU2X2FjdGlvbnNbXSA9Ci0JSFBIX1BSSV9BQl9MRUdfU1RFUkVPOwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfaHdzZXR0aW5nX2VudHJ5Ci0JaWhzX3N0ZXJlb19yeF9jbGFzc19hYl9sZWdhY3lfc2V0dGluZ3NbXSA9IHsKLQl7Ci0JCS5mcmVxX3BsYW4gPSA0ODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPQotCQlpaHNfc3RlcmVvX3J4X2NsYXNzX2FiX2xlZ2FjeV80OEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUKLQkJKGloc19zdGVyZW9fcnhfY2xhc3NfYWJfbGVnYWN5XzQ4S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9Ci19OwotCi1zdGF0aWMgdm9pZCBzbmRkZXZfaHNlZF9jb25maWdfbW9kaWZ5X3NldHRpbmcoaW50IHR5cGUpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlOwotCXN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgKmljb2RlY19kYXRhOwotCi0JZGV2aWNlID0gJm1zbV9oZWFkc2V0X3N0ZXJlb19kZXZpY2U7Ci0JaWNvZGVjX2RhdGEgPSAoc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSAqKWRldmljZS0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQlpZiAoaWNvZGVjX2RhdGEpIHsKLQkJaWYgKHR5cGUgPT0gMSkgewotCQkJaWNvZGVjX2RhdGEtPnZvbHRhZ2Vfb24gPSBOVUxMOwotCQkJaWNvZGVjX2RhdGEtPnZvbHRhZ2Vfb2ZmID0gTlVMTDsKLQkJCWljb2RlY19kYXRhLT5wcm9maWxlLT5zZXR0aW5ncyA9Ci0JCQkJaWhzX3N0ZXJlb19yeF9jbGFzc19kX2xlZ2FjeV9zZXR0aW5nczsKLQkJCWljb2RlY19kYXRhLT5wcm9maWxlLT5zZXR0aW5nX3N6ID0KLQkJCUFSUkFZX1NJWkUoaWhzX3N0ZXJlb19yeF9jbGFzc19kX2xlZ2FjeV9zZXR0aW5ncyk7Ci0JCX0gZWxzZSBpZiAodHlwZSA9PSAyKSB7Ci0JCQlpY29kZWNfZGF0YS0+dm9sdGFnZV9vbiA9IE5VTEw7Ci0JCQlpY29kZWNfZGF0YS0+dm9sdGFnZV9vZmYgPSBOVUxMOwotCQkJaWNvZGVjX2RhdGEtPnByb2ZpbGUtPnNldHRpbmdzID0KLQkJCQlpaHNfc3RlcmVvX3J4X2NsYXNzX2FiX2xlZ2FjeV9zZXR0aW5nczsKLQkJCWljb2RlY19kYXRhLT5wcm9maWxlLT5zZXR0aW5nX3N6ID0KLQkJCUFSUkFZX1NJWkUoaWhzX3N0ZXJlb19yeF9jbGFzc19hYl9sZWdhY3lfc2V0dGluZ3MpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzbmRkZXZfaHNlZF9jb25maWdfcmVzdG9yZV9zZXR0aW5nKHZvaWQpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlOwotCXN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgKmljb2RlY19kYXRhOwotCi0JZGV2aWNlID0gJm1zbV9oZWFkc2V0X3N0ZXJlb19kZXZpY2U7Ci0JaWNvZGVjX2RhdGEgPSBkZXZpY2UtPmRldi5wbGF0Zm9ybV9kYXRhOwotCi0JaWYgKGljb2RlY19kYXRhKSB7Ci0JCWljb2RlY19kYXRhLT52b2x0YWdlX29uID0gbXNtX3NuZGRldl9oc2VkX3ZvbHRhZ2Vfb247Ci0JCWljb2RlY19kYXRhLT52b2x0YWdlX29mZiA9IG1zbV9zbmRkZXZfaHNlZF92b2x0YWdlX29mZjsKLQkJaWNvZGVjX2RhdGEtPnByb2ZpbGUtPnNldHRpbmdzID0gaGVhZHNldF9hYl9jcGxzX3NldHRpbmdzOwotCQlpY29kZWNfZGF0YS0+cHJvZmlsZS0+c2V0dGluZ19zeiA9Ci0JCQlBUlJBWV9TSVpFKGhlYWRzZXRfYWJfY3Bsc19zZXR0aW5ncyk7Ci0JfQotfQotCi1zdGF0aWMgc3NpemVfdCBzbmRkZXZfaHNlZF9jb25maWdfZGVidWdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsCi0JY29uc3QgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKLXsKLQljaGFyICpsYl9zdHIgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBjbWQ7Ci0KLQlpZiAoZ2V0X3VzZXIoY21kLCB1YnVmKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoIXN0cmNtcChsYl9zdHIsICJtc21faHNlZF9jb25maWciKSkgewotCQlzd2l0Y2ggKGNtZCkgewotCQljYXNlICcwJzoKLQkJCXNuZGRldl9oc2VkX2NvbmZpZ19yZXN0b3JlX3NldHRpbmcoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJzEnOgotCQkJc25kZGV2X2hzZWRfY29uZmlnX21vZGlmeV9zZXR0aW5nKDEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnMic6Ci0JCQlzbmRkZXZfaHNlZF9jb25maWdfbW9kaWZ5X3NldHRpbmcoMik7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIGNudDsKLX0KLQotc3RhdGljIGludCBzbmRkZXZfaHNlZF9jb25maWdfZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbmRkZXZfaHNlZF9jb25maWdfZGVidWdfZm9wcyA9IHsKLQkub3BlbiA9IHNuZGRldl9oc2VkX2NvbmZpZ19kZWJ1Z19vcGVuLAotCS53cml0ZSA9IHNuZGRldl9oc2VkX2NvbmZpZ19kZWJ1Z193cml0ZQotfTsKLSNlbmRpZgotCi1zdGF0aWMgZW51bSBoc2VkX2NvbnRyb2xsZXIgaXNwa19wbWN0bF9pZFtdID0ge1BNX0hTRURfQ09OVFJPTExFUl8wfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgc25kZGV2X2lzcGtyX21pY19kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfVFggfCBTTkRERVZfQ0FQX1ZPSUNFKSwKLQkubmFtZSA9ICJzcGVha2VyX21vbm9fdHgiLAotCS5jb3BwX2lkID0gMCwKLQkuYWNkYl9pZCA9IEFDREJfSURfU1BLUl9QSE9ORV9NSUMsCi0JLnByb2ZpbGUgPSAmaW1pY19mZmFfcHJvZmlsZSwKLQkuY2hhbm5lbF9tb2RlID0gMSwKLQkucG1jdGxfaWQgPSBpc3BrX3BtY3RsX2lkLAotCS5wbWN0bF9pZF9zeiA9IEFSUkFZX1NJWkUoaXNwa19wbWN0bF9pZCksCi0JLmRlZmF1bHRfc2FtcGxlX3JhdGUgPSA0ODAwMCwKLQkucGFtcF9vbiA9IG1zbV9zbmRkZXZfdHhfcm91dGVfY29uZmlnLAotCS5wYW1wX29mZiA9IG1zbV9zbmRkZXZfdHhfcm91dGVfZGVjb25maWcsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21faXNwa3JfbWljX2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfaWNvZGVjIiwKLQkuaWQgPSAxOCwKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfaXNwa3JfbWljX2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdCBpZHVhbF9taWNfZW5kZmlyZV84S0h6X29zcjI1Nl9hY3Rpb25zW10gPQotCUFNSUNfRFVBTF84MDAwX09TUl8yNTY7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaWR1YWxfbWljX2VuZGZpcmVfc2V0dGluZ3NbXSA9IHsKLQl7Ci0JCS5mcmVxX3BsYW4gPSA4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGlkdWFsX21pY19lbmRmaXJlXzhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGlkdWFsX21pY19lbmRmaXJlXzhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0sIC8qIDhLSHogcHJvZmlsZSBjYW4gYmUgdXNlZCBmb3IgMTZLSHogKi8KLQl7Ci0JCS5mcmVxX3BsYW4gPSAxNjAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpZHVhbF9taWNfZW5kZmlyZV84S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpZHVhbF9taWNfZW5kZmlyZV84S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9LCAvKiA4S0h6IHByb2ZpbGUgY2FuIGJlIHVzZWQgZm9yIDQ4S0h6ICovCi0JewotCQkuZnJlcV9wbGFuID0gNDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaWR1YWxfbWljX2VuZGZpcmVfOEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaWR1YWxfbWljX2VuZGZpcmVfOEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2Rldl9wcm9maWxlIGlkdWFsX21pY19lbmRmaXJlX3Byb2ZpbGUgPSB7Ci0JLnBhdGhfdHlwZSA9IEFESUVfQ09ERUNfVFgsCi0JLnNldHRpbmdzID0gaWR1YWxfbWljX2VuZGZpcmVfc2V0dGluZ3MsCi0JLnNldHRpbmdfc3ogPSBBUlJBWV9TSVpFKGlkdWFsX21pY19lbmRmaXJlX3NldHRpbmdzKSwKLX07Ci0KLXN0YXRpYyBlbnVtIGhzZWRfY29udHJvbGxlciBpZHVhbF9taWNfZW5kZmlyZV9wbWN0bF9pZFtdID0gewotCVBNX0hTRURfQ09OVFJPTExFUl8wLCBQTV9IU0VEX0NPTlRST0xMRVJfMgotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgc25kZGV2X2lkdWFsX21pY19lbmRmaXJlX2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9UWCB8IFNORERFVl9DQVBfVk9JQ0UpLAotCS5uYW1lID0gImhhbmRzZXRfZHVhbF9taWNfZW5kZmlyZV90eCIsCi0JLmNvcHBfaWQgPSAwLAotCS5hY2RiX2lkID0gQUNEQl9JRF9IQU5EU0VUX01JQ19FTkRGSVJFLAotCS5wcm9maWxlID0gJmlkdWFsX21pY19lbmRmaXJlX3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IDIsCi0JLmRlZmF1bHRfc2FtcGxlX3JhdGUgPSA0ODAwMCwKLQkucG1jdGxfaWQgPSBpZHVhbF9taWNfZW5kZmlyZV9wbWN0bF9pZCwKLQkucG1jdGxfaWRfc3ogPSBBUlJBWV9TSVpFKGlkdWFsX21pY19lbmRmaXJlX3BtY3RsX2lkKSwKLQkucGFtcF9vbiA9IE5VTEwsCi0JLnBhbXBfb2ZmID0gTlVMTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zbV9pZHVhbF9taWNfZW5kZmlyZV9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X2ljb2RlYyIsCi0JLmlkID0gMTIsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2lkdWFsX21pY19lbmRmaXJlX2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhIHNuZGRldl9zcGtfaWR1YWxfbWljX2VuZGZpcmVfZGF0YSA9IHsKLQkuY2FwYWJpbGl0eSA9IChTTkRERVZfQ0FQX1RYIHwgU05EREVWX0NBUF9WT0lDRSksCi0JLm5hbWUgPSAic3BlYWtlcl9kdWFsX21pY19lbmRmaXJlX3R4IiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX1NQS1JfUEhPTkVfTUlDX0VOREZJUkUsCi0JLnByb2ZpbGUgPSAmaWR1YWxfbWljX2VuZGZpcmVfcHJvZmlsZSwKLQkuY2hhbm5lbF9tb2RlID0gMiwKLQkuZGVmYXVsdF9zYW1wbGVfcmF0ZSA9IDQ4MDAwLAotCS5wbWN0bF9pZCA9IGlkdWFsX21pY19lbmRmaXJlX3BtY3RsX2lkLAotCS5wbWN0bF9pZF9zeiA9IEFSUkFZX1NJWkUoaWR1YWxfbWljX2VuZGZpcmVfcG1jdGxfaWQpLAotCS5wYW1wX29uID0gTlVMTCwKLQkucGFtcF9vZmYgPSBOVUxMLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXNtX3Nwa19pZHVhbF9taWNfZW5kZmlyZV9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X2ljb2RlYyIsCi0JLmlkID0gMTQsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X3Nwa19pZHVhbF9taWNfZW5kZmlyZV9kYXRhIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgaXR0eV9tb25vX3R4X2FjdGlvbnNbXSA9Ci0JVFRZX0hFQURTRVRfTU9OT19UWF84MDAwX09TUl8yNTY7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaXR0eV9tb25vX3R4X3NldHRpbmdzW10gPSB7Ci0JewotCQkuZnJlcV9wbGFuID0gNDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaXR0eV9tb25vX3R4X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGl0dHlfbW9ub190eF9hY3Rpb25zKSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2Rldl9wcm9maWxlIGl0dHlfbW9ub190eF9wcm9maWxlID0gewotCS5wYXRoX3R5cGUgPSBBRElFX0NPREVDX1RYLAotCS5zZXR0aW5ncyA9IGl0dHlfbW9ub190eF9zZXR0aW5ncywKLQkuc2V0dGluZ19zeiA9IEFSUkFZX1NJWkUoaXR0eV9tb25vX3R4X3NldHRpbmdzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhIHNuZGRldl9pdHR5X21vbm9fdHhfZGF0YSA9IHsKLQkuY2FwYWJpbGl0eSA9IChTTkRERVZfQ0FQX1RYIHwgU05EREVWX0NBUF9WT0lDRSB8IFNORERFVl9DQVBfVFRZKSwKLQkubmFtZSA9ICJ0dHlfaGVhZHNldF9tb25vX3R4IiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX1RUWV9IRUFEU0VUX01JQywKLQkucHJvZmlsZSA9ICZpdHR5X21vbm9fdHhfcHJvZmlsZSwKLQkuY2hhbm5lbF9tb2RlID0gMSwKLQkuZGVmYXVsdF9zYW1wbGVfcmF0ZSA9IDQ4MDAwLAotCS5wbWN0bF9pZCA9IE5VTEwsCi0JLnBtY3RsX2lkX3N6ID0gMCwKLQkucGFtcF9vbiA9IE5VTEwsCi0JLnBhbXBfb2ZmID0gTlVMTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zbV9pdHR5X21vbm9fdHhfZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl9pY29kZWMiLAotCS5pZCA9IDE2LAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl9pdHR5X21vbm9fdHhfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IGl0dHlfbW9ub19yeF9hY3Rpb25zW10gPQotCVRUWV9IRUFEU0VUX01PTk9fUlhfODAwMF9PU1JfMjU2OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfaHdzZXR0aW5nX2VudHJ5IGl0dHlfbW9ub19yeF9zZXR0aW5nc1tdID0gewotCXsKLQkJLmZyZXFfcGxhbiA9IDQ4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGl0dHlfbW9ub19yeF9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpdHR5X21vbm9fcnhfYWN0aW9ucyksCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpdHR5X21vbm9fcnhfcHJvZmlsZSA9IHsKLQkucGF0aF90eXBlID0gQURJRV9DT0RFQ19SWCwKLQkuc2V0dGluZ3MgPSBpdHR5X21vbm9fcnhfc2V0dGluZ3MsCi0JLnNldHRpbmdfc3ogPSBBUlJBWV9TSVpFKGl0dHlfbW9ub19yeF9zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSBzbmRkZXZfaXR0eV9tb25vX3J4X2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9SWCB8IFNORERFVl9DQVBfVk9JQ0UgfCBTTkRERVZfQ0FQX1RUWSksCi0JLm5hbWUgPSAidHR5X2hlYWRzZXRfbW9ub19yeCIsCi0JLmNvcHBfaWQgPSAwLAotCS5hY2RiX2lkID0gQUNEQl9JRF9UVFlfSEVBRFNFVF9TUEtSLAotCS5wcm9maWxlID0gJml0dHlfbW9ub19yeF9wcm9maWxlLAotCS5jaGFubmVsX21vZGUgPSAxLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gNDgwMDAsCi0JLnBhbXBfb24gPSBOVUxMLAotCS5wYW1wX29mZiA9IE5VTEwsCi0JLm1heF92b2ljZV9yeF92b2xbVk9DX05CX0lOREVYXSA9IDAsCi0JLm1pbl92b2ljZV9yeF92b2xbVk9DX05CX0lOREVYXSA9IDAsCi0JLm1heF92b2ljZV9yeF92b2xbVk9DX1dCX0lOREVYXSA9IDAsCi0JLm1pbl92b2ljZV9yeF92b2xbVk9DX1dCX0lOREVYXSA9IDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21faXR0eV9tb25vX3J4X2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfaWNvZGVjIiwKLQkuaWQgPSAxNywKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfaXR0eV9tb25vX3J4X2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X3ZpcnR1YWxfZGF0YSBzbmRkZXZfYTJkcF90eF9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gU05EREVWX0NBUF9UWCwKLQkubmFtZSA9ICJhMmRwX3R4IiwKLQkuY29wcF9pZCA9IDUsCi0JLmFjZGJfaWQgPSBQU0VVRE9fQUNEQl9JRCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X3ZpcnR1YWxfZGF0YSBzbmRkZXZfYTJkcF9yeF9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gU05EREVWX0NBUF9SWCwKLQkubmFtZSA9ICJhMmRwX3J4IiwKLQkuY29wcF9pZCA9IDIsCi0JLmFjZGJfaWQgPSBQU0VVRE9fQUNEQl9JRCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zbV9hMmRwX3J4X2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfdmlydHVhbCIsCi0JLmlkID0gMCwKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfYTJkcF9yeF9kYXRhIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21fYTJkcF90eF9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X3ZpcnR1YWwiLAotCS5pZCA9IDEsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X2EyZHBfdHhfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfdmlydHVhbF9kYXRhIHNuZGRldl91cGxpbmtfcnhfZGF0YSA9IHsKLQkuY2FwYWJpbGl0eSA9IFNORERFVl9DQVBfUlgsCi0JLm5hbWUgPSAidXBsaW5rX3J4IiwKLQkuY29wcF9pZCA9IDUsCi0JLmFjZGJfaWQgPSBQU0VVRE9fQUNEQl9JRCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zbV91cGxpbmtfcnhfZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl92aXJ0dWFsIiwKLQkuaWQgPSAyLAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl91cGxpbmtfcnhfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGFcCi0JCXNuZGRldl9pZHVhbF9taWNfZW5kZmlyZV9yZWFsX3N0ZXJlb19kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfVFggfCBTTkRERVZfQ0FQX1ZPSUNFKSwKLQkubmFtZSA9ICJoYW5kc2V0X2R1YWxfbWljX2VuZGZpcmVfdHhfcmVhbF9zdGVyZW8iLAotCS5jb3BwX2lkID0gMCwKLQkuYWNkYl9pZCA9IFBTRVVET19BQ0RCX0lELAotCS5wcm9maWxlID0gJmlkdWFsX21pY19lbmRmaXJlX3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IFJFQUxfU1RFUkVPX0NIQU5ORUxfTU9ERSwKLQkuZGVmYXVsdF9zYW1wbGVfcmF0ZSA9IDQ4MDAwLAotCS5wbWN0bF9pZCA9IGlkdWFsX21pY19lbmRmaXJlX3BtY3RsX2lkLAotCS5wbWN0bF9pZF9zeiA9IEFSUkFZX1NJWkUoaWR1YWxfbWljX2VuZGZpcmVfcG1jdGxfaWQpLAotCS5wYW1wX29uID0gTlVMTCwKLQkucGFtcF9vZmYgPSBOVUxMLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXNtX3JlYWxfc3RlcmVvX3R4X2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfaWNvZGVjIiwKLQkuaWQgPSAyNiwKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9Ci0JCQkmc25kZGV2X2lkdWFsX21pY19lbmRmaXJlX3JlYWxfc3RlcmVvX2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdCBpaHNfZmZhX21vbm9fcnhfNDhLSHpfb3NyMjU2X2FjdGlvbnNbXSA9Ci0JSEVBRFNFVF9SWF9DQVBMRVNTXzQ4MDAwX09TUl8yNTY7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaWhzX2ZmYV9tb25vX3J4X3NldHRpbmdzW10gPSB7Ci0JewotCQkuZnJlcV9wbGFuID0gNDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaWhzX2ZmYV9tb25vX3J4XzQ4S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpaHNfZmZhX21vbm9fcnhfNDhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpaHNfZmZhX21vbm9fcnhfcHJvZmlsZSA9IHsKLQkucGF0aF90eXBlID0gQURJRV9DT0RFQ19SWCwKLQkuc2V0dGluZ3MgPSBpaHNfZmZhX21vbm9fcnhfc2V0dGluZ3MsCi0JLnNldHRpbmdfc3ogPSBBUlJBWV9TSVpFKGloc19mZmFfbW9ub19yeF9zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSBzbmRkZXZfaWhzX2ZmYV9tb25vX3J4X2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9SWCB8IFNORERFVl9DQVBfVk9JQ0UpLAotCS5uYW1lID0gImhlYWRzZXRfbW9ub19yeCIsCi0JLmNvcHBfaWQgPSAwLAotCS5hY2RiX2lkID0gQUNEQl9JRF9IRUFEU0VUX1NQS1JfTU9OTywKLQkucHJvZmlsZSA9ICZpaHNfZmZhX21vbm9fcnhfcHJvZmlsZSwKLQkuY2hhbm5lbF9tb2RlID0gMSwKLQkuZGVmYXVsdF9zYW1wbGVfcmF0ZSA9IDQ4MDAwLAotCS5wYW1wX29uID0gbXNtX3NuZGRldl9oc2VkX3ZvbHRhZ2Vfb24sCi0JLnBhbXBfb2ZmID0gbXNtX3NuZGRldl9oc2VkX3ZvbHRhZ2Vfb2ZmLAotCS5tYXhfdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAtNzAwLAotCS5taW5fdm9pY2Vfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gPSAtMjIwMCwKLQkubWF4X3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gLTkwMCwKLQkubWluX3ZvaWNlX3J4X3ZvbFtWT0NfV0JfSU5ERVhdID0gLTI0MDAsCi0JLnByb3BlcnR5ID0gU0lERV9UT05FX01BU0ssCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21faWhzX2ZmYV9tb25vX3J4X2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfaWNvZGVjIiwKLQkuaWQgPSA1LAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl9paHNfZmZhX21vbm9fcnhfZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0Ci0JaWhzX3N0ZXJlb19zcGVha2VyX3N0ZXJlb19yeF80OEtIel9vc3IyNTZfYWN0aW9uc1tdID0KLQlIRUFEU0VUX1NURVJFT19TUEVBS0VSX1NURVJFT19SWF9DQVBMRVNTXzQ4MDAwX09TUl8yNTY7Ci0KLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2h3c2V0dGluZ19lbnRyeQotCWloc19zdGVyZW9fc3BlYWtlcl9zdGVyZW9fcnhfc2V0dGluZ3NbXSA9IHsKLQl7Ci0JCS5mcmVxX3BsYW4gPSA0ODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpaHNfc3RlcmVvX3NwZWFrZXJfc3RlcmVvX3J4XzQ4S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0KLQkJQVJSQVlfU0laRShpaHNfc3RlcmVvX3NwZWFrZXJfc3RlcmVvX3J4XzQ4S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfZGV2X3Byb2ZpbGUgaWhzX3N0ZXJlb19zcGVha2VyX3N0ZXJlb19yeF9wcm9maWxlID0gewotCS5wYXRoX3R5cGUgPSBBRElFX0NPREVDX1JYLAotCS5zZXR0aW5ncyA9IGloc19zdGVyZW9fc3BlYWtlcl9zdGVyZW9fcnhfc2V0dGluZ3MsCi0JLnNldHRpbmdfc3ogPSBBUlJBWV9TSVpFKGloc19zdGVyZW9fc3BlYWtlcl9zdGVyZW9fcnhfc2V0dGluZ3MpLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgc25kZGV2X2loc19zdGVyZW9fc3BlYWtlcl9zdGVyZW9fcnhfZGF0YSA9IHsKLQkuY2FwYWJpbGl0eSA9IChTTkRERVZfQ0FQX1JYIHwgU05EREVWX0NBUF9WT0lDRSksCi0JLm5hbWUgPSAiaGVhZHNldF9zdGVyZW9fc3BlYWtlcl9zdGVyZW9fcngiLAotCS5jb3BwX2lkID0gMCwKLQkuYWNkYl9pZCA9IEFDREJfSURfSEVBRFNFVF9TVEVSRU9fUExVU19TUEtSX1NURVJFT19SWCwKLQkucHJvZmlsZSA9ICZpaHNfc3RlcmVvX3NwZWFrZXJfc3RlcmVvX3J4X3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IDIsCi0JLmRlZmF1bHRfc2FtcGxlX3JhdGUgPSA0ODAwMCwKLQkucGFtcF9vbiA9IG1zbV9zbmRkZXZfcG93ZXJhbXBfb24sCi0JLnBhbXBfb2ZmID0gbXNtX3NuZGRldl9wb3dlcmFtcF9vZmYsCi0JLnZvbHRhZ2Vfb24gPSBtc21fc25kZGV2X2hzZWRfdm9sdGFnZV9vbiwKLQkudm9sdGFnZV9vZmYgPSBtc21fc25kZGV2X2hzZWRfdm9sdGFnZV9vZmYsCi0JLm1heF92b2ljZV9yeF92b2xbVk9DX05CX0lOREVYXSA9IC01MDAsCi0JLm1pbl92b2ljZV9yeF92b2xbVk9DX05CX0lOREVYXSA9IC0yMDAwLAotCS5tYXhfdm9pY2Vfcnhfdm9sW1ZPQ19XQl9JTkRFWF0gPSAtOTAwLAotCS5taW5fdm9pY2Vfcnhfdm9sW1ZPQ19XQl9JTkRFWF0gPSAtMjQwMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zbV9paHNfc3RlcmVvX3NwZWFrZXJfc3RlcmVvX3J4X2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfaWNvZGVjIiwKLQkuaWQgPSAyMSwKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfaWhzX3N0ZXJlb19zcGVha2VyX3N0ZXJlb19yeF9kYXRhIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgaXNwa19kdWFsX21pY19ic184S0h6X29zcjI1Nl9hY3Rpb25zW10gPQotCUhTX0RNSUMyX1NURVJFT184MDAwX09TUl8yNTY7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgaXNwa19kdWFsX21pY19ic19zZXR0aW5nc1tdID0gewotCXsKLQkJLmZyZXFfcGxhbiA9IDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gaXNwa19kdWFsX21pY19ic184S0h6X29zcjI1Nl9hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShpc3BrX2R1YWxfbWljX2JzXzhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0sIC8qIDhLSHogcHJvZmlsZSBjYW4gYmUgdXNlZCBmb3IgMTZLaHogKi8KLQl7Ci0JCS5mcmVxX3BsYW4gPSAxNjAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpc3BrX2R1YWxfbWljX2JzXzhLSHpfb3NyMjU2X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGlzcGtfZHVhbF9taWNfYnNfOEtIel9vc3IyNTZfYWN0aW9ucyksCi0JfSwgLyogOEtIeiBwcm9maWxlIGNhbiBiZSB1c2VkIGZvciA0OEtIeiAqLwotCXsKLQkJLmZyZXFfcGxhbiA9IDQ4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGlzcGtfZHVhbF9taWNfYnNfOEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaXNwa19kdWFsX21pY19ic184S0h6X29zcjI1Nl9hY3Rpb25zKSwKLQl9LAotfTsKLQotc3RhdGljIGVudW0gaHNlZF9jb250cm9sbGVyIGlkdWFsX21pY19icm9hZHNpZGVfcG1jdGxfaWRbXSA9IHsKLQlQTV9IU0VEX0NPTlRST0xMRVJfMCwgUE1fSFNFRF9DT05UUk9MTEVSXzIKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpc3BrX2R1YWxfbWljX2JzX3Byb2ZpbGUgPSB7Ci0JLnBhdGhfdHlwZSA9IEFESUVfQ09ERUNfVFgsCi0JLnNldHRpbmdzID0gaXNwa19kdWFsX21pY19ic19zZXR0aW5ncywKLQkuc2V0dGluZ19zeiA9IEFSUkFZX1NJWkUoaXNwa19kdWFsX21pY19ic19zZXR0aW5ncyksCi19Owotc3RhdGljIHN0cnVjdCBzbmRkZXZfaWNvZGVjX2RhdGEgc25kZGV2X3Nwa19pZHVhbF9taWNfYnJvYWRzaWRlX2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSAoU05EREVWX0NBUF9UWCB8IFNORERFVl9DQVBfVk9JQ0UpLAotCS5uYW1lID0gInNwZWFrZXJfZHVhbF9taWNfYnJvYWRzaWRlX3R4IiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX1NQS1JfUEhPTkVfTUlDX0JST0FEU0lERSwKLQkucHJvZmlsZSA9ICZpc3BrX2R1YWxfbWljX2JzX3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IDIsCi0JLmRlZmF1bHRfc2FtcGxlX3JhdGUgPSA0ODAwMCwKLQkucG1jdGxfaWQgPSBpZHVhbF9taWNfYnJvYWRzaWRlX3BtY3RsX2lkLAotCS5wbWN0bF9pZF9zeiA9IEFSUkFZX1NJWkUoaWR1YWxfbWljX2Jyb2Fkc2lkZV9wbWN0bF9pZCksCi0JLnBhbXBfb24gPSBOVUxMLAotCS5wYW1wX29mZiA9IE5VTEwsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21fc3BrX2lkdWFsX21pY19icm9hZHNpZGVfZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl9pY29kZWMiLAotCS5pZCA9IDE1LAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl9zcGtfaWR1YWxfbWljX2Jyb2Fkc2lkZV9kYXRhIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgaWR1YWxfbWljX2JzXzhLSHpfb3NyMjU2X2FjdGlvbnNbXSA9Ci0JSFNfRE1JQzJfU1RFUkVPXzgwMDBfT1NSXzI1NjsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2h3c2V0dGluZ19lbnRyeSBpZHVhbF9taWNfYnJvYWRzaWRlX3NldHRpbmdzW10gPSB7Ci0JewotCQkuZnJlcV9wbGFuID0gODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpZHVhbF9taWNfYnNfOEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaWR1YWxfbWljX2JzXzhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0sIC8qIDhLSHogcHJvZmlsZSBjYW4gYmUgdXNlZCBmb3IgMTZLSHogKi8KLQl7Ci0JCS5mcmVxX3BsYW4gPSAxNjAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpZHVhbF9taWNfYnNfOEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaWR1YWxfbWljX2JzXzhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0sIC8qIDhLSHogcHJvZmlsZSBjYW4gYmUgdXNlZCBmb3IgMTZLSHogKi8KLQl7Ci0JCS5mcmVxX3BsYW4gPSA0ODAwMCwKLQkJLm9zciA9IDI1NiwKLQkJLmFjdGlvbnMgPSBpZHVhbF9taWNfYnNfOEtIel9vc3IyNTZfYWN0aW9ucywKLQkJLmFjdGlvbl9zeiA9IEFSUkFZX1NJWkUoaWR1YWxfbWljX2JzXzhLSHpfb3NyMjU2X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBpZHVhbF9taWNfYnJvYWRzaWRlX3Byb2ZpbGUgPSB7Ci0JLnBhdGhfdHlwZSA9IEFESUVfQ09ERUNfVFgsCi0JLnNldHRpbmdzID0gaWR1YWxfbWljX2Jyb2Fkc2lkZV9zZXR0aW5ncywKLQkuc2V0dGluZ19zeiA9IEFSUkFZX1NJWkUoaWR1YWxfbWljX2Jyb2Fkc2lkZV9zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSBzbmRkZXZfaWR1YWxfbWljX2Jyb2Fkc2lkZV9kYXRhID0gewotCS5jYXBhYmlsaXR5ID0gKFNORERFVl9DQVBfVFggfCBTTkRERVZfQ0FQX1ZPSUNFKSwKLQkubmFtZSA9ICJoYW5kc2V0X2R1YWxfbWljX2Jyb2Fkc2lkZV90eCIsCi0JLmNvcHBfaWQgPSAwLAotCS5hY2RiX2lkID0gQUNEQl9JRF9IQU5EU0VUX01JQ19CUk9BRFNJREUsCi0JLnByb2ZpbGUgPSAmaWR1YWxfbWljX2Jyb2Fkc2lkZV9wcm9maWxlLAotCS5jaGFubmVsX21vZGUgPSAyLAotCS5kZWZhdWx0X3NhbXBsZV9yYXRlID0gNDgwMDAsCi0JLnBtY3RsX2lkID0gaWR1YWxfbWljX2Jyb2Fkc2lkZV9wbWN0bF9pZCwKLQkucG1jdGxfaWRfc3ogPSBBUlJBWV9TSVpFKGlkdWFsX21pY19icm9hZHNpZGVfcG1jdGxfaWQpLAotCS5wYW1wX29uID0gTlVMTCwKLQkucGFtcF9vZmYgPSBOVUxMLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXNtX2lkdWFsX21pY19icm9hZHNpZGVfZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl9pY29kZWMiLAotCS5pZCA9IDEzLAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl9pZHVhbF9taWNfYnJvYWRzaWRlX2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X21pMnNfZGF0YSBzbmRkZXZfbWkyc19zdGVyZW9fcnhfZGF0YSA9IHsKLQkuY2FwYWJpbGl0eSA9IFNORERFVl9DQVBfUlggLAotCS5uYW1lID0gImhkbWlfc3RlcmVvX3J4IiwKLQkuY29wcF9pZCA9IDMsCi0JLmFjZGJfaWQgPSBBQ0RCX0lEX0hETUksCi0JLmNoYW5uZWxfbW9kZSA9IDIsCi0JLnNkX2xpbmVzID0gTUkyU19TRF8wLAotCS5yb3V0ZSA9IG1zbV9zbmRkZXZfdHhfcm91dGVfY29uZmlnLAotCS5kZXJvdXRlID0gbXNtX3NuZGRldl90eF9yb3V0ZV9kZWNvbmZpZywKLQkuZGVmYXVsdF9zYW1wbGVfcmF0ZSA9IDQ4MDAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXNtX3NuZGRldl9taTJzX3N0ZXJlb19yeF9kZXZpY2UgPSB7Ci0JLm5hbWUgPSAic25kZGV2X21pMnMiLAotCS5pZCA9IDAsCi0JLmRldiA9IHsgLnBsYXRmb3JtX2RhdGEgPSAmc25kZGV2X21pMnNfc3RlcmVvX3J4X2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19hY3Rpb25fdW5pdCBhdXhwZ2FfbGJfbG9fYWN0aW9uc1tdID0KLQlMQl9BVVhQR0FfTE9fU1RFUkVPOwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfaHdzZXR0aW5nX2VudHJ5IGF1eHBnYV9sYl9sb19zZXR0aW5nc1tdID0gewotCXsKLQkJLmZyZXFfcGxhbiA9IDQ4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGF1eHBnYV9sYl9sb19hY3Rpb25zLAotCQkuYWN0aW9uX3N6ID0gQVJSQVlfU0laRShhdXhwZ2FfbGJfbG9fYWN0aW9ucyksCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBhdXhwZ2FfbGJfbG9fcHJvZmlsZSA9IHsKLQkucGF0aF90eXBlID0gQURJRV9DT0RFQ19MQiwKLQkuc2V0dGluZ3MgPSBhdXhwZ2FfbGJfbG9fc2V0dGluZ3MsCi0JLnNldHRpbmdfc3ogPSBBUlJBWV9TSVpFKGF1eHBnYV9sYl9sb19zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSBzbmRkZXZfYXV4cGdhX2xiX2xvX2RhdGEgPSB7Ci0JLmNhcGFiaWxpdHkgPSBTTkRERVZfQ0FQX0xCLAotCS5uYW1lID0gImF1eHBnYV9sb29wYmFja19sbyIsCi0JLmNvcHBfaWQgPSAwLAotCS5hY2RiX2lkID0gUFNFVURPX0FDREJfSUQsCi0JLnByb2ZpbGUgPSAmYXV4cGdhX2xiX2xvX3Byb2ZpbGUsCi0JLmNoYW5uZWxfbW9kZSA9IDIsCi0JLmRlZmF1bHRfc2FtcGxlX3JhdGUgPSA0ODAwMCwKLQkucGFtcF9vbiA9IG1zbV9zbmRkZXZfcG93ZXJhbXBfb24sCi0JLnBhbXBfb2ZmID0gbXNtX3NuZGRldl9wb3dlcmFtcF9vZmYsCi0JLmRldl92b2xfdHlwZSA9IFNORERFVl9ERVZfVk9MX0FOQUxPRywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG1zbV9hdXhwZ2FfbGJfbG9fZGV2aWNlID0gewotCS5uYW1lID0gInNuZGRldl9pY29kZWMiLAotCS5pZCA9IDI3LAotCS5kZXYgPSB7IC5wbGF0Zm9ybV9kYXRhID0gJnNuZGRldl9hdXhwZ2FfbGJfbG9fZGF0YSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IGF1eHBnYV9sYl9oc19hY3Rpb25zW10gPQotCUxCX0FVWFBHQV9IUEhfQUJfQ1BMU19TVEVSRU87Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgYXV4cGdhX2xiX2hzX3NldHRpbmdzW10gPSB7Ci0JewotCQkuZnJlcV9wbGFuID0gNDgwMDAsCi0JCS5vc3IgPSAyNTYsCi0JCS5hY3Rpb25zID0gYXV4cGdhX2xiX2hzX2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGF1eHBnYV9sYl9oc19hY3Rpb25zKSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2Rldl9wcm9maWxlIGF1eHBnYV9sYl9oc19wcm9maWxlID0gewotCS5wYXRoX3R5cGUgPSBBRElFX0NPREVDX0xCLAotCS5zZXR0aW5ncyA9IGF1eHBnYV9sYl9oc19zZXR0aW5ncywKLQkuc2V0dGluZ19zeiA9IEFSUkFZX1NJWkUoYXV4cGdhX2xiX2hzX3NldHRpbmdzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhIHNuZGRldl9hdXhwZ2FfbGJfaHNfZGF0YSA9IHsKLQkuY2FwYWJpbGl0eSA9IFNORERFVl9DQVBfTEIsCi0JLm5hbWUgPSAiYXV4cGdhX2xvb3BiYWNrX2hzIiwKLQkuY29wcF9pZCA9IDAsCi0JLmFjZGJfaWQgPSBQU0VVRE9fQUNEQl9JRCwKLQkucHJvZmlsZSA9ICZhdXhwZ2FfbGJfaHNfcHJvZmlsZSwKLQkuY2hhbm5lbF9tb2RlID0gMiwKLQkuZGVmYXVsdF9zYW1wbGVfcmF0ZSA9IDQ4MDAwLAotCS52b2x0YWdlX29uID0gbXNtX3NuZGRldl9oc2VkX3ZvbHRhZ2Vfb24sCi0JLnZvbHRhZ2Vfb2ZmID0gbXNtX3NuZGRldl9oc2VkX3ZvbHRhZ2Vfb2ZmLAotCS5kZXZfdm9sX3R5cGUgPSBTTkRERVZfREVWX1ZPTF9BTkFMT0csCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtc21fYXV4cGdhX2xiX2hzX2RldmljZSA9IHsKLQkubmFtZSA9ICJzbmRkZXZfaWNvZGVjIiwKLQkuaWQgPSAyNSwKLQkuZGV2ID0geyAucGxhdGZvcm1fZGF0YSA9ICZzbmRkZXZfYXV4cGdhX2xiX2hzX2RhdGEgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzbmRfZGV2aWNlc19mZmFbXSBfX2luaXRkYXRhID0gewotCSZtc21faWVhcnBpZWNlX2ZmYV9kZXZpY2UsCi0JJm1zbV9pbWljX2ZmYV9kZXZpY2UsCi0JJm1zbV9pc3Brcl9zdGVyZW9fZGV2aWNlLAotCSZtc21faGVhZHNldF9taWNfZGV2aWNlLAotCSZtc21faWhzX2ZmYV9tb25vX3J4X2RldmljZSwKLQkmbXNtX3NuZGRldl9taTJzX2ZtX3J4X2RldmljZSwKLQkmbXNtX3NuZGRldl9taTJzX2ZtX3R4X2RldmljZSwKLQkmbXNtX2J0X3Njb19lYXJwaWVjZV9kZXZpY2UsCi0JJm1zbV9idF9zY29fbWljX2RldmljZSwKLQkmbXNtX2lzcGtyX21pY19kZXZpY2UsCi0JJm1zbV9oZWFkc2V0X3N0ZXJlb19kZXZpY2UsCi0JJm1zbV9pZHVhbF9taWNfZW5kZmlyZV9kZXZpY2UsCi0JJm1zbV9zcGtfaWR1YWxfbWljX2VuZGZpcmVfZGV2aWNlLAotCSZtc21faXR0eV9tb25vX3R4X2RldmljZSwKLQkmbXNtX2l0dHlfbW9ub19yeF9kZXZpY2UsCi0JJm1zbV9hMmRwX3J4X2RldmljZSwKLQkmbXNtX2EyZHBfdHhfZGV2aWNlLAotCSZtc21fdXBsaW5rX3J4X2RldmljZSwKLQkmbXNtX3JlYWxfc3RlcmVvX3R4X2RldmljZSwKLQkmbXNtX2loc19zdGVyZW9fc3BlYWtlcl9zdGVyZW9fcnhfZGV2aWNlLAotCSZtc21fc3BrX2lkdWFsX21pY19icm9hZHNpZGVfZGV2aWNlLAotCSZtc21faWR1YWxfbWljX2Jyb2Fkc2lkZV9kZXZpY2UsCi0JJm1zbV9zbmRkZXZfbWkyc19zdGVyZW9fcnhfZGV2aWNlLAotCSZtc21fYXV4cGdhX2xiX2hzX2RldmljZSwKLQkmbXNtX2F1eHBnYV9sYl9sb19kZXZpY2UsCi19OwotCi12b2lkIF9fcmVmIG1zbV9zbmRkZXZfaW5pdF90aW1wYW5pKHZvaWQpCi17Ci0JcGxhdGZvcm1fYWRkX2RldmljZXMoc25kX2RldmljZXNfZmZhLAotCQkJQVJSQVlfU0laRShzbmRfZGV2aWNlc19mZmEpKTsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlkZWJ1Z2ZzX2hzZWRfY29uZmlnID0gZGVidWdmc19jcmVhdGVfZmlsZSgibXNtX2hzZWRfY29uZmlnIiwKLQkJCQlTX0lGUkVHIHwgU19JV1VHTywgTlVMTCwKLQkJKHZvaWQgKikgIm1zbV9oc2VkX2NvbmZpZyIsICZzbmRkZXZfaHNlZF9jb25maWdfZGVidWdfZm9wcyk7Ci0JaWYgKCFkZWJ1Z2ZzX2hzZWRfY29uZmlnKQotCQlwcl9lcnIoImZhaWxlZCB0byBjcmVhdGUgbXNtX2hlYWRfY29uZmlnIGRlYnVnIGZzIGVudHJ5XG4iKTsKLSNlbmRpZgotCi19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL3NuZGRldl9lY29kZWMuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvc25kZGV2X2Vjb2RlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODAwOWFhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvc25kZGV2X2Vjb2RlYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDg0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOSwyMDExIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvc25kZGV2X2Vjb2RlYy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19kZXZfY3RsLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2ludGVyY3QuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXV4X3BjbS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hZmUuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0vKiBDb250ZXh0IGZvciBlYWNoIGV4dGVybmFsIGNvZGVjIGRldmljZSAqLwotc3RydWN0IHNuZGRldl9lY29kZWNfc3RhdGUgewotCXN0cnVjdCBzbmRkZXZfZWNvZGVjX2RhdGEgKmRhdGE7Ci0JdTMyIHNhbXBsZV9yYXRlOwotCWJvb2wgZW5hYmxlZDsKLX07Ci0KLS8qIEdsb2JhbCBzdGF0ZSBmb3IgdGhlIGRyaXZlciAqLwotc3RydWN0IHNuZGRldl9lY29kZWNfZHJ2X3N0YXRlIHsKLQlzdHJ1Y3QgbXV0ZXggZGV2X2xvY2s7Ci0JdTMyIHJ4X2FjdGl2ZTsgLyogZW5zdXJlIG9uZSByeCBkZXZpY2UgYXQgYSB0aW1lICovCi0JdTMyIHR4X2FjdGl2ZTsgLyogZW5zdXJlIG9uZSB0eCBkZXZpY2UgYXQgYSB0aW1lICovCi0Jc3RydWN0IGNsayAqbHBhX2NvcmVfY2xrOwotCXN0cnVjdCBjbGsgKmVjb2RlY19jbGs7Ci19OwotCi0jZGVmaW5lIEFEU1BfQ1RMIDEKLQotc3RhdGljIHN0cnVjdCBzbmRkZXZfZWNvZGVjX2Rydl9zdGF0ZSBzbmRkZXZfZWNvZGVjX2RydjsKLQotc3RhdGljIGludCBzbmRkZXZfZWNvZGVjX29wZW5fcngoc3RydWN0IHNuZGRldl9lY29kZWNfc3RhdGUgKmVjb2RlYykKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBzbmRkZXZfZWNvZGVjX2Rydl9zdGF0ZSAqZHJ2ID0gJnNuZGRldl9lY29kZWNfZHJ2OwotCXN0cnVjdCBtc21fYWZlX2NvbmZpZyBhZmVfY29uZmlnOwotCWludCByZXQgPSAwOwotCi0JTU1fREJHKCJzbmRkZXZfZWNvZGVjX29wZW5fcnhcbiIpOwotCi0JaWYgKCFkcnYtPnR4X2FjdGl2ZSkgewotCQkvKiByZXF1ZXN0IEdQSU8gKi8KLQkJcmMgPSBhdXhfcGNtX2dwaW9zX3JlcXVlc3QoKTsKLQkJaWYgKHJjKSB7Ci0JCQlNTV9FUlIoIkdQSU8gZW5hYmxlIGZhaWxlZFxuIik7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJLyogY29uZmlnIGNsb2NrcyAqLwotCQljbGtfcHJlcGFyZV9lbmFibGUoZHJ2LT5scGFfY29yZV9jbGspOwotCi0JCS8qaWYgbG9uZyBzeW5jIGlzIHNlbGVjdGVkIGluIGF1eCBQQ00gaW50ZXJmYWNlCi0JCWVjb2RlYyBjbG9jayBpcyB1cGRhdGVkIHRvIHdvcmsgd2l0aCAxMjhLSHosCi0JCWlmIHNob3J0IHN5bmMgaXMgc2VsZWN0ZWQgZWNvZGVjIGNsb2NrIGlzIHVwZGF0ZWQgdG8KLQkJd29yayB3aXRoIDIuMDQ4TUh6IGZyZXF1ZW5jeSwgYWN0dWFsIGNsb2NrIG91dHB1dCBpcwotCQlkaWZmZXJlbnQgdGhhbiB0aGUgU1cgY29uZmlndXJhdGlvbiBieSBmYWN0b3Igb2YgdHdvKi8KLQkJaWYgKCEoZWNvZGVjLT5kYXRhLT5jb25mX2F1eF9jb2RlY19pbnRmICYKLQkJCUFVWF9DT0RFQ19DVExfX0FVWF9DT0RFQ19NT0RFX19JMlNfVikpIHsKLQkJCWlmIChlY29kZWMtPmRhdGEtPmNvbmZfYXV4X2NvZGVjX2ludGYgJgotCQkJCUFVWF9DT0RFQ19DVExfX0FVWF9QQ01fTU9ERV9fQVVYX01BU1RFUl9WKSB7Ci0JCQkJTU1fREJHKCJVcGRhdGUgZWNvZGVjIGNsb2NrIHRvIDEyOCBLSHosIGxvbmcgIgotCQkJCQkic3luYyBpbiBtYXN0ZXIgbW9kZSBpcyBzZWxlY3RlZFxuIik7Ci0JCQkJcmV0ID0gY2xrX3NldF9yYXRlKGRydi0+ZWNvZGVjX2NsaywgMjU2MDAwKTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJTU1fRVJSKCJFcnJvciB1cGRhdGluZyBlY29kZWMgY2xvY2siCi0JCQkJCQkJIiB0byAxMjhLSHpcbiIpOwotCQkJfSBlbHNlIGlmIChlY29kZWMtPmRhdGEtPmNvbmZfYXV4X2NvZGVjX2ludGYgJgotCQkJCUFVWF9DT0RFQ19DVExfX0FVWF9QQ01fTU9ERV9fUFJJTV9TTEFWRV9WKSB7Ci0JCQkJTU1fREJHKCJVcGRhdGUgZWNvZGVjIGNsb2NrIHRvIDIgTUh6LCBzaG9ydCIKLQkJCQkJIiBzeW5jIGluIHNsYXZlIG1vZGUgaXMgc2VsZWN0ZWRcbiIpOwotCQkJCXJldCA9IGNsa19zZXRfcmF0ZShkcnYtPmVjb2RlY19jbGssIDQwOTYwMDApOwotCQkJCWlmIChyZXQgPCAwKQotCQkJCQlNTV9FUlIoIkVycm9yIHVwZGF0aW5nIGVjb2RlYyBjbG9jayIKLQkJCQkJCQkiIHRvIDIuMDQ4TUh6XG4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTU1fREJHKCJVcGRhdGUgZWNvZGVjIGNsb2NrIHRvIDIgTUh6LCBzaG9ydCIKLQkJCQkJIiBzeW5jIGluIG1hc3RlciBtb2RlIGlzIHNlbGVjdGVkXG4iKTsKLQkJCQlyZXQgPSBjbGtfc2V0X3JhdGUoZHJ2LT5lY29kZWNfY2xrLCA0MDk2MDAwKTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJTU1fRVJSKCJFcnJvciB1cGRhdGluZyBlY29kZWMgY2xvY2siCi0JCQkJCQkJIiB0byAyLjA0OE1IelxuIik7Ci0JCQl9Ci0JCX0KLQotCQkvKiBlbmFibGUgZWNvZGVjIGNsayAqLwotCQljbGtfcHJlcGFyZV9lbmFibGUoZHJ2LT5lY29kZWNfY2xrKTsKLQotCQkvKiBsZXQgQURTUCBjb25maXVyZSBBVVggUENNIHJlZ3MgKi8KLQkJYXV4X2NvZGVjX2Fkc3BfY29kZWNfY3RsX2VuKEFEU1BfQ1RMKTsKLQotCQkvKiBsZXQgYWRzcCBjb25maWd1cmUgcGNtIHBhdGggKi8KLQkJYXV4X2NvZGVjX3BjbV9wYXRoX2N0bF9lbihBRFNQX0NUTCk7Ci0KLQkJLyogY2hvb3NlIEFEU1BfQSAqLwotCQlhdWRpb19pbnRlcmN0X2F1eF9yZWdzZWwoQVVESU9fQURTUF9BKTsKLQkJYXVkaW9faW50ZXJjdF90cGNtX3NvdXJjZShBVURJT19BRFNQX0EpOwotCQlhdWRpb19pbnRlcmN0X3JwY21fc291cmNlKEFVRElPX0FEU1BfQSk7Ci0KLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+bHBhX2NvcmVfY2xrKTsKLQotCQkvKiBzZW5kIEFVWF9DT0RFQ19DT05GSUcgdG8gQUZFICovCi0JCXJjID0gYWZlX2NvbmZpZ19hdXhfY29kZWMoZWNvZGVjLT5kYXRhLT5jb25mX3BjbV9jdGxfdmFsLAotCQkJCWVjb2RlYy0+ZGF0YS0+Y29uZl9hdXhfY29kZWNfaW50ZiwKLQkJCQllY29kZWMtPmRhdGEtPmNvbmZfZGF0YV9mb3JtYXRfcGFkZGluZ192YWwpOwotCQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkKLQkJCWdvdG8gZXJyb3I7Ci0JfQotCS8qIHNlbmQgQ09ERUMgQ09ORklHIHRvIEFGRSAqLwotCWFmZV9jb25maWcuc2FtcGxlX3JhdGUgPSBlY29kZWMtPnNhbXBsZV9yYXRlIC8gMTAwMDsKLQlhZmVfY29uZmlnLmNoYW5uZWxfbW9kZSA9IGVjb2RlYy0+ZGF0YS0+Y2hhbm5lbF9tb2RlOwotCWFmZV9jb25maWcudm9sdW1lID0gQUZFX1ZPTFVNRV9VTklUWTsKLQlyYyA9IGFmZV9lbmFibGUoQUZFX0hXX1BBVEhfQVVYUENNX1JYLCAmYWZlX2NvbmZpZyk7Ci0JaWYgKElTX0VSUl9WQUxVRShyYykpIHsKLQkJaWYgKCFkcnYtPnR4X2FjdGl2ZSkgewotCQkJYXV4X3BjbV9ncGlvc19mcmVlKCk7Ci0JCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZHJ2LT5lY29kZWNfY2xrKTsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZWNvZGVjLT5lbmFibGVkID0gMTsKLQlyZXR1cm4gMDsKLQotZXJyb3I6Ci0JYXV4X3BjbV9ncGlvc19mcmVlKCk7Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+ZWNvZGVjX2Nsayk7Ci1kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzbmRkZXZfZWNvZGVjX2Nsb3NlX3J4KHN0cnVjdCBzbmRkZXZfZWNvZGVjX3N0YXRlICplY29kZWMpCi17Ci0Jc3RydWN0IHNuZGRldl9lY29kZWNfZHJ2X3N0YXRlICpkcnYgPSAmc25kZGV2X2Vjb2RlY19kcnY7Ci0KLQkvKiBmcmVlIEdQSU8gKi8KLQlpZiAoIWRydi0+dHhfYWN0aXZlKSB7Ci0JCWF1eF9wY21fZ3Bpb3NfZnJlZSgpOwotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZHJ2LT5lY29kZWNfY2xrKTsKLQl9Ci0KLQkvKiBkaXNhYmxlIEFGRSAqLwotCWFmZV9kaXNhYmxlKEFGRV9IV19QQVRIX0FVWFBDTV9SWCk7Ci0KLQllY29kZWMtPmVuYWJsZWQgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kZGV2X2Vjb2RlY19vcGVuX3R4KHN0cnVjdCBzbmRkZXZfZWNvZGVjX3N0YXRlICplY29kZWMpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3Qgc25kZGV2X2Vjb2RlY19kcnZfc3RhdGUgKmRydiA9ICZzbmRkZXZfZWNvZGVjX2RydjsKLQlzdHJ1Y3QgbXNtX2FmZV9jb25maWcgYWZlX2NvbmZpZzsKLQlpbnQgcmV0ID0gMDsKLQotCU1NX0RCRygic25kZGV2X2Vjb2RlY19vcGVuX3R4XG4iKTsKLQotCS8qIHJlcXVlc3QgR1BJTyAqLwotCWlmICghZHJ2LT5yeF9hY3RpdmUpIHsKLQkJcmMgPSBhdXhfcGNtX2dwaW9zX3JlcXVlc3QoKTsKLQkJaWYgKHJjKSB7Ci0JCQlNTV9FUlIoIkdQSU8gZW5hYmxlIGZhaWxlZFxuIik7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJLyogY29uZmlnIGNsb2NrcyAqLwotCQljbGtfcHJlcGFyZV9lbmFibGUoZHJ2LT5scGFfY29yZV9jbGspOwotCi0JCS8qaWYgbG9uZyBzeW5jIGlzIHNlbGVjdGVkIGluIGF1eCBQQ00gaW50ZXJmYWNlCi0JCWVjb2RlYyBjbG9jayBpcyB1cGRhdGVkIHRvIHdvcmsgd2l0aCAxMjhLSHosCi0JCWlmIHNob3J0IHN5bmMgaXMgc2VsZWN0ZWQgZWNvZGVjIGNsb2NrIGlzIHVwZGF0ZWQgdG8KLQkJd29yayB3aXRoIDIuMDQ4TUh6IGZyZXF1ZW5jeSwgYWN0dWFsIGNsb2NrIG91dHB1dCBpcwotCQlkaWZmZXJlbnQgdGhhbiB0aGUgU1cgY29uZmlndXJhdGlvbiBieSBmYWN0b3Igb2YgdHdvKi8KLQkJaWYgKCEoZWNvZGVjLT5kYXRhLT5jb25mX2F1eF9jb2RlY19pbnRmICYKLQkJCUFVWF9DT0RFQ19DVExfX0FVWF9DT0RFQ19NT0RFX19JMlNfVikpIHsKLQkJCWlmIChlY29kZWMtPmRhdGEtPmNvbmZfYXV4X2NvZGVjX2ludGYgJgotCQkJCUFVWF9DT0RFQ19DVExfX0FVWF9QQ01fTU9ERV9fQVVYX01BU1RFUl9WKSB7Ci0JCQkJTU1fREJHKCJVcGRhdGUgZWNvZGVjIGNsb2NrIHRvIDEyOCBLSHosIGxvbmcgIgotCQkJCQkic3luYyBpbiBtYXN0ZXIgbW9kZSBpcyBzZWxlY3RlZFxuIik7Ci0JCQkJcmV0ID0gY2xrX3NldF9yYXRlKGRydi0+ZWNvZGVjX2NsaywgMjU2MDAwKTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJTU1fRVJSKCJFcnJvciB1cGRhdGluZyBlY29kZWMgY2xvY2siCi0JCQkJCQkJIiB0byAxMjhLSHpcbiIpOwotCQkJfSBlbHNlIGlmIChlY29kZWMtPmRhdGEtPmNvbmZfYXV4X2NvZGVjX2ludGYgJgotCQkJCUFVWF9DT0RFQ19DVExfX0FVWF9QQ01fTU9ERV9fUFJJTV9TTEFWRV9WKSB7Ci0JCQkJTU1fREJHKCJVcGRhdGUgZWNvZGVjIGNsb2NrIHRvIDIgTUh6LCBzaG9ydCIKLQkJCQkJIiBzeW5jIGluIHNsYXZlIG1vZGUgaXMgc2VsZWN0ZWRcbiIpOwotCQkJCXJldCA9IGNsa19zZXRfcmF0ZShkcnYtPmVjb2RlY19jbGssIDQwOTYwMDApOwotCQkJCWlmIChyZXQgPCAwKQotCQkJCQlNTV9FUlIoIkVycm9yIHVwZGF0aW5nIGVjb2RlYyBjbG9jayIKLQkJCQkJCQkiIHRvIDIuMDQ4TUh6XG4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTU1fREJHKCJVcGRhdGUgZWNvZGVjIGNsb2NrIHRvIDIgTUh6LCBzaG9ydCIKLQkJCQkJIiBzeW5jIGluIG1hc3RlciBtb2RlIGlzIHNlbGVjdGVkXG4iKTsKLQkJCQlyZXQgPSBjbGtfc2V0X3JhdGUoZHJ2LT5lY29kZWNfY2xrLCA0MDk2MDAwKTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJTU1fRVJSKCJFcnJvciB1cGRhdGluZyBlY29kZWMgY2xvY2siCi0JCQkJCQkJIiB0byAyLjA0OE1IelxuIik7Ci0JCQl9Ci0JCX0KLQotCQkvKiBlbmFibGUgZWNvZGVjIGNsayAqLwotCQljbGtfcHJlcGFyZV9lbmFibGUoZHJ2LT5lY29kZWNfY2xrKTsKLQotCQkvKiBsZXQgQURTUCBjb25maXVyZSBBVVggUENNIHJlZ3MgKi8KLQkJYXV4X2NvZGVjX2Fkc3BfY29kZWNfY3RsX2VuKEFEU1BfQ1RMKTsKLQotCQkvKiBsZXQgYWRzcCBjb25maWd1cmUgcGNtIHBhdGggKi8KLQkJYXV4X2NvZGVjX3BjbV9wYXRoX2N0bF9lbihBRFNQX0NUTCk7Ci0KLQkJLyogY2hvb3NlIEFEU1BfQSAqLwotCQlhdWRpb19pbnRlcmN0X2F1eF9yZWdzZWwoQVVESU9fQURTUF9BKTsKLQkJYXVkaW9faW50ZXJjdF90cGNtX3NvdXJjZShBVURJT19BRFNQX0EpOwotCQlhdWRpb19pbnRlcmN0X3JwY21fc291cmNlKEFVRElPX0FEU1BfQSk7Ci0KLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+bHBhX2NvcmVfY2xrKTsKLQotCQkvKiBzZW5kIEFVWF9DT0RFQ19DT05GSUcgdG8gQUZFICovCi0JCXJjID0gYWZlX2NvbmZpZ19hdXhfY29kZWMoZWNvZGVjLT5kYXRhLT5jb25mX3BjbV9jdGxfdmFsLAotCQkJZWNvZGVjLT5kYXRhLT5jb25mX2F1eF9jb2RlY19pbnRmLAotCQkJZWNvZGVjLT5kYXRhLT5jb25mX2RhdGFfZm9ybWF0X3BhZGRpbmdfdmFsKTsKLQkJaWYgKElTX0VSUl9WQUxVRShyYykpCi0JCQlnb3RvIGVycm9yOwotCX0KLQkvKiBzZW5kIENPREVDIENPTkZJRyB0byBBRkUgKi8KLQlhZmVfY29uZmlnLnNhbXBsZV9yYXRlID0gZWNvZGVjLT5zYW1wbGVfcmF0ZSAvIDEwMDA7Ci0JYWZlX2NvbmZpZy5jaGFubmVsX21vZGUgPSBlY29kZWMtPmRhdGEtPmNoYW5uZWxfbW9kZTsKLQlhZmVfY29uZmlnLnZvbHVtZSA9IEFGRV9WT0xVTUVfVU5JVFk7Ci0JcmMgPSBhZmVfZW5hYmxlKEFGRV9IV19QQVRIX0FVWFBDTV9UWCwgJmFmZV9jb25maWcpOwotCWlmIChJU19FUlJfVkFMVUUocmMpKSB7Ci0JCWlmICghZHJ2LT5yeF9hY3RpdmUpIHsKLQkJCWF1eF9wY21fZ3Bpb3NfZnJlZSgpOwotCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+ZWNvZGVjX2Nsayk7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQotCWVjb2RlYy0+ZW5hYmxlZCA9IDE7Ci0JcmV0dXJuIDA7Ci0KLWVycm9yOgotCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnYtPmVjb2RlY19jbGspOwotCWF1eF9wY21fZ3Bpb3NfZnJlZSgpOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgc25kZGV2X2Vjb2RlY19jbG9zZV90eChzdHJ1Y3Qgc25kZGV2X2Vjb2RlY19zdGF0ZSAqZWNvZGVjKQotewotCXN0cnVjdCBzbmRkZXZfZWNvZGVjX2Rydl9zdGF0ZSAqZHJ2ID0gJnNuZGRldl9lY29kZWNfZHJ2OwotCi0JLyogZnJlZSBHUElPICovCi0JaWYgKCFkcnYtPnJ4X2FjdGl2ZSkgewotCQlhdXhfcGNtX2dwaW9zX2ZyZWUoKTsKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+ZWNvZGVjX2Nsayk7Ci0JfQotCi0JLyogZGlzYWJsZSBBRkUgKi8KLQlhZmVfZGlzYWJsZShBRkVfSFdfUEFUSF9BVVhQQ01fVFgpOwotCi0JZWNvZGVjLT5lbmFibGVkID0gMDsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgc25kZGV2X2Vjb2RlY19vcGVuKHN0cnVjdCBtc21fc25kZGV2X2luZm8gKmRldl9pbmZvKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHNuZGRldl9lY29kZWNfc3RhdGUgKmVjb2RlYzsKLQlzdHJ1Y3Qgc25kZGV2X2Vjb2RlY19kcnZfc3RhdGUgKmRydiA9ICZzbmRkZXZfZWNvZGVjX2RydjsKLQotCWlmICghZGV2X2luZm8pIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWVjb2RlYyA9IGRldl9pbmZvLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoZWNvZGVjLT5kYXRhLT5jYXBhYmlsaXR5ICYgU05EREVWX0NBUF9SWCkgewotCQltdXRleF9sb2NrKCZkcnYtPmRldl9sb2NrKTsKLQkJaWYgKGRydi0+cnhfYWN0aXZlKSB7Ci0JCQltdXRleF91bmxvY2soJmRydi0+ZGV2X2xvY2spOwotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCXJjID0gc25kZGV2X2Vjb2RlY19vcGVuX3J4KGVjb2RlYyk7Ci0JCWlmICghSVNfRVJSX1ZBTFVFKHJjKSkKLQkJCWRydi0+cnhfYWN0aXZlID0gMTsKLQkJbXV0ZXhfdW5sb2NrKCZkcnYtPmRldl9sb2NrKTsKLQl9IGVsc2UgewotCQltdXRleF9sb2NrKCZkcnYtPmRldl9sb2NrKTsKLQkJaWYgKGRydi0+dHhfYWN0aXZlKSB7Ci0JCQltdXRleF91bmxvY2soJmRydi0+ZGV2X2xvY2spOwotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCXJjID0gc25kZGV2X2Vjb2RlY19vcGVuX3R4KGVjb2RlYyk7Ci0JCWlmICghSVNfRVJSX1ZBTFVFKHJjKSkKLQkJCWRydi0+dHhfYWN0aXZlID0gMTsKLQkJbXV0ZXhfdW5sb2NrKCZkcnYtPmRldl9sb2NrKTsKLQl9Ci1lcnJvcjoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgc25kZGV2X2Vjb2RlY19jbG9zZShzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICpkZXZfaW5mbykKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBzbmRkZXZfZWNvZGVjX3N0YXRlICplY29kZWM7Ci0Jc3RydWN0IHNuZGRldl9lY29kZWNfZHJ2X3N0YXRlICpkcnYgPSAmc25kZGV2X2Vjb2RlY19kcnY7Ci0JaWYgKCFkZXZfaW5mbykgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JZWNvZGVjID0gZGV2X2luZm8tPnByaXZhdGVfZGF0YTsKLQotCWlmIChlY29kZWMtPmRhdGEtPmNhcGFiaWxpdHkgJiBTTkRERVZfQ0FQX1JYKSB7Ci0JCW11dGV4X2xvY2soJmRydi0+ZGV2X2xvY2spOwotCQlpZiAoIWRydi0+cnhfYWN0aXZlKSB7Ci0JCQltdXRleF91bmxvY2soJmRydi0+ZGV2X2xvY2spOwotCQkJcmMgPSAtRVBFUk07Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCXJjID0gc25kZGV2X2Vjb2RlY19jbG9zZV9yeChlY29kZWMpOwotCQlpZiAoIUlTX0VSUl9WQUxVRShyYykpCi0JCQlkcnYtPnJ4X2FjdGl2ZSA9IDA7Ci0JCW11dGV4X3VubG9jaygmZHJ2LT5kZXZfbG9jayk7Ci0JfSBlbHNlIHsKLQkJbXV0ZXhfbG9jaygmZHJ2LT5kZXZfbG9jayk7Ci0JCWlmICghZHJ2LT50eF9hY3RpdmUpIHsKLQkJCW11dGV4X3VubG9jaygmZHJ2LT5kZXZfbG9jayk7Ci0JCQlyYyA9IC1FUEVSTTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJcmMgPSBzbmRkZXZfZWNvZGVjX2Nsb3NlX3R4KGVjb2RlYyk7Ci0JCWlmICghSVNfRVJSX1ZBTFVFKHJjKSkKLQkJCWRydi0+dHhfYWN0aXZlID0gMDsKLQkJbXV0ZXhfdW5sb2NrKCZkcnYtPmRldl9sb2NrKTsKLQl9Ci0KLWVycm9yOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzbmRkZXZfZWNvZGVjX3NldF9mcmVxKHN0cnVjdCBtc21fc25kZGV2X2luZm8gKmRldl9pbmZvLCB1MzIgcmF0ZSkKLXsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFkZXZfaW5mbykgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXJldHVybiA4MDAwOwotCi1lcnJvcjoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgc25kZGV2X2Vjb2RlY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByYyA9IDAsIGk7Ci0Jc3RydWN0IHNuZGRldl9lY29kZWNfZGF0YSAqcGRhdGE7Ci0Jc3RydWN0IG1zbV9zbmRkZXZfaW5mbyAqZGV2X2luZm87Ci0Jc3RydWN0IHNuZGRldl9lY29kZWNfc3RhdGUgKmVjb2RlYzsKLQotCWlmICghcGRldiB8fCAhcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgIkludmFsaWQgY2FsbGVyIFxuIik7Ci0JCXJjID0gLTE7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQllY29kZWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25kZGV2X2Vjb2RlY19zdGF0ZSksIEdGUF9LRVJORUwpOwotCWlmICghZWNvZGVjKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlkZXZfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fc25kZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldl9pbmZvKSB7Ci0JCWtmcmVlKGVjb2RlYyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlkZXZfaW5mby0+bmFtZSA9IHBkYXRhLT5uYW1lOwotCWRldl9pbmZvLT5jb3BwX2lkID0gcGRhdGEtPmNvcHBfaWQ7Ci0JZGV2X2luZm8tPmFjZGJfaWQgPSBwZGF0YS0+YWNkYl9pZDsKLQlkZXZfaW5mby0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKikgZWNvZGVjOwotCWRldl9pbmZvLT5kZXZfb3BzLm9wZW4gPSBzbmRkZXZfZWNvZGVjX29wZW47Ci0JZGV2X2luZm8tPmRldl9vcHMuY2xvc2UgPSBzbmRkZXZfZWNvZGVjX2Nsb3NlOwotCWRldl9pbmZvLT5kZXZfb3BzLnNldF9mcmVxID0gc25kZGV2X2Vjb2RlY19zZXRfZnJlcTsKLQlkZXZfaW5mby0+ZGV2X29wcy5lbmFibGVfc2lkZXRvbmUgPSBOVUxMOwotCWRldl9pbmZvLT5jYXBhYmlsaXR5ID0gcGRhdGEtPmNhcGFiaWxpdHk7Ci0JZGV2X2luZm8tPm9wZW5lZCA9IDA7Ci0KLQltc21fc25kZGV2X3JlZ2lzdGVyKGRldl9pbmZvKTsKLQllY29kZWMtPmRhdGEgPSBwZGF0YTsKLQllY29kZWMtPnNhbXBsZV9yYXRlID0gODAwMDsgLyogRGVmYXVsdCB0byA4S0h6ICovCi0JIGlmIChwZGF0YS0+Y2FwYWJpbGl0eSAmIFNORERFVl9DQVBfUlgpIHsKLQkJZm9yIChpID0gMDsgaSA8IFZPQ19SWF9WT0xfQVJSQVlfTlVNOyBpKyspIHsKLQkJCWRldl9pbmZvLT5tYXhfdm9jX3J4X3ZvbFtpXSA9Ci0JCQkJcGRhdGEtPm1heF92b2ljZV9yeF92b2xbaV07Ci0JCQlkZXZfaW5mby0+bWluX3ZvY19yeF92b2xbaV0gPQotCQkJCXBkYXRhLT5taW5fdm9pY2Vfcnhfdm9sW2ldOwotCQl9Ci0JfQotZXJyb3I6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHNuZGRldl9lY29kZWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNuZGRldl9lY29kZWNfZHJpdmVyID0gewotCS5wcm9iZSA9IHNuZGRldl9lY29kZWNfcHJvYmUsCi0JLnJlbW92ZSA9IHNuZGRldl9lY29kZWNfcmVtb3ZlLAotCS5kcml2ZXIgPSB7IC5uYW1lID0gIm1zbV9zbmRkZXZfZWNvZGVjIiB9Ci19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzbmRkZXZfZWNvZGVjX2luaXQodm9pZCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBzbmRkZXZfZWNvZGVjX2Rydl9zdGF0ZSAqZWNvZGVjX2RydiA9ICZzbmRkZXZfZWNvZGVjX2RydjsKLQotCU1NX0lORk8oInNuZGRldl9lY29kZWNfaW5pdFxuIik7Ci0JcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuZGRldl9lY29kZWNfZHJpdmVyKTsKLQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkKLQkJZ290byBlcnJvcl9wbGF0Zm9ybV9kcml2ZXI7Ci0JZWNvZGVjX2Rydi0+ZWNvZGVjX2NsayA9IGNsa19nZXQoTlVMTCwgImVjb2RlY19jbGsiKTsKLQlpZiAoSVNfRVJSKGVjb2RlY19kcnYtPmVjb2RlY19jbGspKQotCQlnb3RvIGVycm9yX2Vjb2RlY19jbGs7Ci0JZWNvZGVjX2Rydi0+bHBhX2NvcmVfY2xrID0gY2xrX2dldChOVUxMLCAibHBhX2NvcmVfY2xrIik7Ci0JaWYgKElTX0VSUihlY29kZWNfZHJ2LT5scGFfY29yZV9jbGspKQotCQlnb3RvIGVycm9yX2xwYV9jb3JlX2NsazsKLQotCi0JbXV0ZXhfaW5pdCgmZWNvZGVjX2Rydi0+ZGV2X2xvY2spOwotCWVjb2RlY19kcnYtPnJ4X2FjdGl2ZSA9IDA7Ci0JZWNvZGVjX2Rydi0+dHhfYWN0aXZlID0gMDsKLQlyZXR1cm4gMDsKLQotZXJyb3JfbHBhX2NvcmVfY2xrOgotCWNsa19wdXQoZWNvZGVjX2Rydi0+ZWNvZGVjX2Nsayk7Ci1lcnJvcl9lY29kZWNfY2xrOgotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRkZXZfZWNvZGVjX2RyaXZlcik7Ci1lcnJvcl9wbGF0Zm9ybV9kcml2ZXI6Ci0KLQlNTV9FUlIoImVuY291bnRlciBlcnJvclxuIik7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzbmRkZXZfZWNvZGVjX2V4aXQodm9pZCkKLXsKLQlzdHJ1Y3Qgc25kZGV2X2Vjb2RlY19kcnZfc3RhdGUgKmVjb2RlY19kcnYgPSAmc25kZGV2X2Vjb2RlY19kcnY7Ci0KLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc25kZGV2X2Vjb2RlY19kcml2ZXIpOwotCWNsa19wdXQoZWNvZGVjX2Rydi0+ZWNvZGVjX2Nsayk7Ci0KLQlyZXR1cm47Ci19Ci0KLW1vZHVsZV9pbml0KHNuZGRldl9lY29kZWNfaW5pdCk7Ci1tb2R1bGVfZXhpdChzbmRkZXZfZWNvZGVjX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIkVDb2RlYyBTb3VuZCBEZXZpY2UgZHJpdmVyIik7Ci1NT0RVTEVfVkVSU0lPTigiMS4wIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL3NuZGRldl9pY29kZWMuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvc25kZGV2X2ljb2RlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmIwNTg3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvc25kZGV2X2ljb2RlYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxOCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvbXNtLWFkaWUtY29kZWMuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Ci0KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9zbmRkZXZfaWNvZGVjLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2Rldl9jdGwuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9faW50ZXJjdC5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9taTJzLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2FmZS5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9scGEuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvbWFyaW1iYV9wcm9maWxlLmg+Ci0jaW5jbHVkZSA8bWFjaC92cmVnLmg+Ci0jaW5jbHVkZSA8bWFjaC9wbWljLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSA8bWFjaC9ycGNfcG1hcHAuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fYWNkYl9kZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bWFjaC9jcHVpZGxlLmg+Ci0KLSNkZWZpbmUgU01QU19BVURJT19QTEFZQkFDS19JRAkiQVVQQiIKLSNkZWZpbmUgU01QU19BVURJT19SRUNPUkRfSUQJIkFVUkMiCi0KLSNkZWZpbmUgU05EREVWX0lDT0RFQ19QQ01fU1ogMzIgLyogMTYgYml0IC8gc2FtcGxlIHN0ZXJlbyBtb2RlICovCi0jZGVmaW5lIFNORERFVl9JQ09ERUNfTVVMX0ZBQ1RPUiAzIC8qIE11bHRpIGJ5IDggU2hpZnQgYnkgMyAgKi8KLSNkZWZpbmUgU05EREVWX0lDT0RFQ19DTEtfUkFURShmcmVxKSBcCi0JKCgoZnJlcSkgKiAoU05EREVWX0lDT0RFQ19QQ01fU1opKSA8PCAoU05EREVWX0lDT0RFQ19NVUxfRkFDVE9SKSkKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2FjdGlvbl91bml0IGRlYnVnX3J4X2FjdGlvbnNbXSA9Ci0JCUhBTkRTRVRfUlhfODAwMF9PU1JfMjU2OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgZGVidWdfdHhfbGJfYWN0aW9uc1tdID0gewotCXsgQURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRiB9LAotCXsgQURJRV9DT0RFQ19BQ1RJT05fRU5UUlksCi0JQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDEsIDB4MDEpfSwKLQl7IEFESUVfQ09ERUNfQUNUSU9OX0VOVFJZLAotCUFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAxLCAweDAwKSB9LAotCXsgQURJRV9DT0RFQ19BQ1RJT05fRU5UUlksCi0JQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MzAsIDB4MzApfSwKLQl7IEFESUVfQ09ERUNfQUNUSU9OX0VOVFJZLAotCUFESUVfQ09ERUNfUEFDS19FTlRSWSgweDExLCAweGZjLCAweGZjKX0sCi0JeyBBRElFX0NPREVDX0FDVElPTl9FTlRSWSwKLQlBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMywgMHhmYywgMHg1OCl9LAotCXsgQURJRV9DT0RFQ19BQ1RJT05fRU5UUlksCi0JQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTQsIDB4ZmYsIDB4NjUpfSwKLQl7IEFESUVfQ09ERUNfQUNUSU9OX0VOVFJZLAotCUFESUVfQ09ERUNfUEFDS19FTlRSWSgweDE1LCAweGZmLCAweDY0KX0sCi0JeyBBRElFX0NPREVDX0FDVElPTl9FTlRSWSwKLQlBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MiwgMHhmZiwgMHg1Qyl9LAotCXsgQURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZIH0sCi0JeyBBRElFX0NPREVDX0FDVElPTl9FTlRSWSwKLQlBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGMCwgMHhkMCl9LAotCXsgQURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHhiYjh9LAotCXsgQURJRV9DT0RFQ19BQ1RJT05fRU5UUlksCi0JQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MTQsIDB4MTQpfSwKLQl7IEFESUVfQ09ERUNfQUNUSU9OX0VOVFJZLAotCUFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg2LCAweGZmLCAweDAwKX0sCi0JeyBBRElFX0NPREVDX0FDVElPTl9FTlRSWSwKLQlBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHg1MCwgMHg0MCl9LAotCXsgQURJRV9DT0RFQ19BQ1RJT05fRU5UUlksCi0JQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OTEsIDB4RkYsIDB4MDEpfSwgLyogU3RhcnQgbG9vcCBiYWNrICovCi0JeyBBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwKLQl7IEFESUVfQ09ERUNfQUNUSU9OX0VOVFJZLAotCUFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDEwLCAweDMwKX0sCi0JeyBBRElFX0NPREVDX0FDVElPTl9FTlRSWSwKLQlBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGRiwgMHgwMCl9LAotCXsgQURJRV9DT0RFQ19BQ1RJT05fRU5UUlksCi0JQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MTQsIDB4MDApfSwKLQl7IEFESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sCi0JeyBBRElFX0NPREVDX0FDVElPTl9FTlRSWSwKLQlBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhmZiwgMHgwMCl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfYWN0aW9uX3VuaXQgZGVidWdfdHhfYWN0aW9uc1tdID0KLQkJSEFORFNFVF9UWF84MDAwX09TUl8yNTY7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgZGVidWdfcnhfc2V0dGluZ3NbXSA9IHsKLQl7Ci0JCS5mcmVxX3BsYW4gPSA4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGRlYnVnX3J4X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGRlYnVnX3J4X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgZGVidWdfdHhfc2V0dGluZ3NbXSA9IHsKLQl7Ci0JCS5mcmVxX3BsYW4gPSA4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGRlYnVnX3R4X2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGRlYnVnX3R4X2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19od3NldHRpbmdfZW50cnkgZGVidWdfdHhfbGJfc2V0dGluZ3NbXSA9IHsKLQl7Ci0JCS5mcmVxX3BsYW4gPSA4MDAwLAotCQkub3NyID0gMjU2LAotCQkuYWN0aW9ucyA9IGRlYnVnX3R4X2xiX2FjdGlvbnMsCi0JCS5hY3Rpb25fc3ogPSBBUlJBWV9TSVpFKGRlYnVnX3R4X2xiX2FjdGlvbnMpLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWRpZV9jb2RlY19kZXZfcHJvZmlsZSBkZWJ1Z19yeF9wcm9maWxlID0gewotCS5wYXRoX3R5cGUgPSBBRElFX0NPREVDX1JYLAotCS5zZXR0aW5ncyA9IGRlYnVnX3J4X3NldHRpbmdzLAotCS5zZXR0aW5nX3N6ID0gQVJSQVlfU0laRShkZWJ1Z19yeF9zZXR0aW5ncyksCi19OwotCi1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfZGV2X3Byb2ZpbGUgZGVidWdfdHhfcHJvZmlsZSA9IHsKLQkucGF0aF90eXBlID0gQURJRV9DT0RFQ19UWCwKLQkuc2V0dGluZ3MgPSBkZWJ1Z190eF9zZXR0aW5ncywKLQkuc2V0dGluZ19zeiA9IEFSUkFZX1NJWkUoZGVidWdfdHhfc2V0dGluZ3MpLAotfTsKLQotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX2Rldl9wcm9maWxlIGRlYnVnX3R4X2xiX3Byb2ZpbGUgPSB7Ci0JLnBhdGhfdHlwZSA9IEFESUVfQ09ERUNfVFgsCi0JLnNldHRpbmdzID0gZGVidWdfdHhfbGJfc2V0dGluZ3MsCi0JLnNldHRpbmdfc3ogPSBBUlJBWV9TSVpFKGRlYnVnX3R4X2xiX3NldHRpbmdzKSwKLX07Ci0jZW5kaWYgLyogQ09ORklHX0RFQlVHX0ZTICovCi0KLS8qIENvbnRleHQgZm9yIGVhY2ggaW50ZXJuYWwgY29kZWMgc291bmQgZGV2aWNlICovCi1zdHJ1Y3Qgc25kZGV2X2ljb2RlY19zdGF0ZSB7Ci0Jc3RydWN0IHNuZGRldl9pY29kZWNfZGF0YSAqZGF0YTsKLQlzdHJ1Y3QgYWRpZV9jb2RlY19wYXRoICphZGllX3BhdGg7Ci0JdTMyIHNhbXBsZV9yYXRlOwotCXUzMiBlbmFibGVkOwotfTsKLQotLyogR2xvYmFsIHN0YXRlIGZvciB0aGUgZHJpdmVyICovCi1zdHJ1Y3Qgc25kZGV2X2ljb2RlY19kcnZfc3RhdGUgewotCXN0cnVjdCBtdXRleCByeF9sb2NrOwotCXN0cnVjdCBtdXRleCBsYl9sb2NrOwotCXN0cnVjdCBtdXRleCB0eF9sb2NrOwotCXUzMiByeF9hY3RpdmU7IC8qIGVuc3VyZSBvbmUgcnggZGV2aWNlIGF0IGEgdGltZSAqLwotCXUzMiB0eF9hY3RpdmU7IC8qIGVuc3VyZSBvbmUgdHggZGV2aWNlIGF0IGEgdGltZSAqLwotCXN0cnVjdCBjbGsgKnJ4X21jbGs7Ci0Jc3RydWN0IGNsayAqcnhfc2NsazsKLQlzdHJ1Y3QgY2xrICp0eF9tY2xrOwotCXN0cnVjdCBjbGsgKnR4X3NjbGs7Ci0Jc3RydWN0IGNsayAqbHBhX2NvZGVjX2NsazsKLQlzdHJ1Y3QgY2xrICpscGFfY29yZV9jbGs7Ci0Jc3RydWN0IGNsayAqbHBhX3BfY2xrOwotCXN0cnVjdCBscGFfZHJ2ICpscGE7Ci0KLQlzdHJ1Y3QgcG1fcW9zX3JlcXVlc3QgcnhfcG1fcW9zX3JlcTsKLQlzdHJ1Y3QgcG1fcW9zX3JlcXVlc3QgdHhfcG1fcW9zX3JlcTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kcnZfc3RhdGUgc25kZGV2X2ljb2RlY19kcnY7Ci0KLXN0YXRpYyBpbnQgc25kZGV2X2ljb2RlY19vcGVuX3J4KHN0cnVjdCBzbmRkZXZfaWNvZGVjX3N0YXRlICppY29kZWMpCi17Ci0JaW50IHRyYywgZXJyOwotCWludCBzbXBzX21vZGUgPSBQTUFQUF9TTVBTX01PREVfVk9URV9QV007Ci0Jc3RydWN0IG1zbV9hZmVfY29uZmlnIGFmZV9jb25maWc7Ci0Jc3RydWN0IHNuZGRldl9pY29kZWNfZHJ2X3N0YXRlICpkcnYgPSAmc25kZGV2X2ljb2RlY19kcnY7Ci0Jc3RydWN0IGxwYV9jb2RlY19jb25maWcgbHBhX2NvbmZpZzsKLQotCXBtX3Fvc191cGRhdGVfcmVxdWVzdCgmZHJ2LT5yeF9wbV9xb3NfcmVxLAotCQkJICAgICAgbXNtX2NwdWlkbGVfZ2V0X2RlZXBfaWRsZV9sYXRlbmN5KCkpOwotCi0JaWYgKChpY29kZWMtPmRhdGEtPmFjZGJfaWQgPT0gQUNEQl9JRF9IRUFEU0VUX1NQS1JfTU9OTykgfHwKLQkJKGljb2RlYy0+ZGF0YS0+YWNkYl9pZCA9PSBBQ0RCX0lEX0hFQURTRVRfU1BLUl9TVEVSRU8pKSB7Ci0JCS8qIFZvdGUgUE1BUFBfU01QU19NT0RFX1ZPVEVfUEZNIGZvciBoZWFkc2V0ICovCi0JCXNtcHNfbW9kZSA9IFBNQVBQX1NNUFNfTU9ERV9WT1RFX1BGTTsKLQkJTU1fREJHKCJzbmRkZXZfaWNvZGVjX29wZW5fcng6IFBNQVBQX1NNUFNfTU9ERV9WT1RFX1BGTSBcbiIpOwotCX0gZWxzZQotCQlNTV9EQkcoInNuZGRldl9pY29kZWNfb3Blbl9yeDogUE1BUFBfU01QU19NT0RFX1ZPVEVfUFdNIFxuIik7Ci0KLQkvKiBWb3RlIGZvciBTTVBTIG1vZGUqLwotCWVyciA9IHBtYXBwX3NtcHNfbW9kZV92b3RlKFNNUFNfQVVESU9fUExBWUJBQ0tfSUQsCi0JCQkJUE1BUFBfVlJFR19TNCwgc21wc19tb2RlKTsKLQlpZiAoZXJyICE9IDApCi0JCU1NX0VSUigicG1hcHBfc21wc19tb2RlX3ZvdGUgZXJyb3IgJWRcbiIsIGVycik7Ci0KLQkvKiBlbmFibGUgTUkyUyBSWCBtYXN0ZXIgYmxvY2sgKi8KLQkvKiBlbmFibGUgTUkyUyBSWCBiaXQgY2xvY2sgKi8KLQl0cmMgPSBjbGtfc2V0X3JhdGUoZHJ2LT5yeF9tY2xrLAotCQlTTkRERVZfSUNPREVDX0NMS19SQVRFKGljb2RlYy0+c2FtcGxlX3JhdGUpKTsKLQlpZiAoSVNfRVJSX1ZBTFVFKHRyYykpCi0JCWdvdG8gZXJyb3JfaW52YWxpZF9mcmVxOwotCWNsa19wcmVwYXJlX2VuYWJsZShkcnYtPnJ4X21jbGspOwotCWNsa19wcmVwYXJlX2VuYWJsZShkcnYtPnJ4X3NjbGspOwotCS8qIGNsa19zZXRfcmF0ZShkcnYtPmxwYV9jb2RlY19jbGssIDEpOyAqLyAvKiBSZW1vdmUgaWYgdXNlIHBjb20gKi8KLQljbGtfcHJlcGFyZV9lbmFibGUoZHJ2LT5scGFfcF9jbGspOwotCWNsa19wcmVwYXJlX2VuYWJsZShkcnYtPmxwYV9jb2RlY19jbGspOwotCWNsa19wcmVwYXJlX2VuYWJsZShkcnYtPmxwYV9jb3JlX2Nsayk7Ci0KLQkvKiBFbmFibGUgTFBBIHN1YiBzeXN0ZW0KLQkgKi8KLQlkcnYtPmxwYSA9IGxwYV9nZXQoKTsKLQlpZiAoIWRydi0+bHBhKQotCQlnb3RvIGVycm9yX2xwYTsKLQlscGFfY29uZmlnLnNhbXBsZV9yYXRlID0gaWNvZGVjLT5zYW1wbGVfcmF0ZTsKLQlscGFfY29uZmlnLnNhbXBsZV93aWR0aCA9IDE2OwotCWxwYV9jb25maWcub3V0cHV0X2ludGVyZmFjZSA9IExQQV9PVVRQVVRfSU5URl9XQl9DT0RFQzsKLQlscGFfY29uZmlnLm51bV9jaGFubmVscyA9IGljb2RlYy0+ZGF0YS0+Y2hhbm5lbF9tb2RlOwotCWxwYV9jbWRfY29kZWNfY29uZmlnKGRydi0+bHBhLCAmbHBhX2NvbmZpZyk7Ci0KLQkvKiBTZXQgYXVkaW8gaW50ZXJjb25uZWN0IHJlZyB0byBMUEEgKi8KLQlhdWRpb19pbnRlcmN0X2NvZGVjKEFVRElPX0lOVEVSQ1RfTFBBKTsKLQotCS8qIFNldCBNSTJTICovCi0JbWkyc19zZXRfY29kZWNfb3V0cHV0X3BhdGgoKGljb2RlYy0+ZGF0YS0+Y2hhbm5lbF9tb2RlID09IDIgPwotCU1JMlNfQ0hBTl9TVEVSRU8gOiBNSTJTX0NIQU5fTU9OT19QQUNLRUQpLCBXVF8xNl9CSVQpOwotCi0JaWYgKGljb2RlYy0+ZGF0YS0+dm9sdGFnZV9vbikKLQkJaWNvZGVjLT5kYXRhLT52b2x0YWdlX29uKCk7Ci0KLQkvKiBDb25maWd1cmUgQURJRSAqLwotCXRyYyA9IGFkaWVfY29kZWNfb3BlbihpY29kZWMtPmRhdGEtPnByb2ZpbGUsICZpY29kZWMtPmFkaWVfcGF0aCk7Ci0JaWYgKElTX0VSUl9WQUxVRSh0cmMpKQotCQlnb3RvIGVycm9yX2FkaWU7Ci0JLyogT1NSIGRlZmF1bHQgdG8gMjU2LCBjYW4gYmUgY2hhbmdlZCBmb3IgcG93ZXIgb3B0aW1pemF0aW9uCi0JICogSWYgT1NSIGlzIHRvIGJlIGNoYW5nZWQsIG5lZWQgY2xvY2sgQVBJIGZvciBzZXR0aW5nIHRoZSBkaXZpZGVyCi0JICovCi0JYWRpZV9jb2RlY19zZXRwYXRoKGljb2RlYy0+YWRpZV9wYXRoLCBpY29kZWMtPnNhbXBsZV9yYXRlLCAyNTYpOwotCS8qIFN0YXJ0IEFGRSAqLwotCWFmZV9jb25maWcuc2FtcGxlX3JhdGUgPSBpY29kZWMtPnNhbXBsZV9yYXRlIC8gMTAwMDsKLQlhZmVfY29uZmlnLmNoYW5uZWxfbW9kZSA9IGljb2RlYy0+ZGF0YS0+Y2hhbm5lbF9tb2RlOwotCWFmZV9jb25maWcudm9sdW1lID0gQUZFX1ZPTFVNRV9VTklUWTsKLQl0cmMgPSBhZmVfZW5hYmxlKEFGRV9IV19QQVRIX0NPREVDX1JYLCAmYWZlX2NvbmZpZyk7Ci0JaWYgKElTX0VSUl9WQUxVRSh0cmMpKQotCQlnb3RvIGVycm9yX2FmZTsKLQlscGFfY21kX2VuYWJsZV9jb2RlYyhkcnYtPmxwYSwgMSk7Ci0JLyogRW5hYmxlIEFESUUgKi8KLQlhZGllX2NvZGVjX3Byb2NlZWRfc3RhZ2UoaWNvZGVjLT5hZGllX3BhdGgsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWSk7Ci0JYWRpZV9jb2RlY19wcm9jZWVkX3N0YWdlKGljb2RlYy0+YWRpZV9wYXRoLAotCQkJCQlBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZKTsKLQotCS8qIEVuYWJsZSBwb3dlciBhbXBsaWZpZXIgKi8KLQlpZiAoaWNvZGVjLT5kYXRhLT5wYW1wX29uKQotCQlpY29kZWMtPmRhdGEtPnBhbXBfb24oKTsKLQotCWljb2RlYy0+ZW5hYmxlZCA9IDE7Ci0KLQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJmRydi0+cnhfcG1fcW9zX3JlcSwgUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotCXJldHVybiAwOwotCi1lcnJvcl9hZmU6Ci0JYWRpZV9jb2RlY19jbG9zZShpY29kZWMtPmFkaWVfcGF0aCk7Ci0JaWNvZGVjLT5hZGllX3BhdGggPSBOVUxMOwotZXJyb3JfYWRpZToKLQlscGFfcHV0KGRydi0+bHBhKTsKLWVycm9yX2xwYToKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoZHJ2LT5scGFfcF9jbGspOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnYtPmxwYV9jb2RlY19jbGspOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnYtPmxwYV9jb3JlX2Nsayk7Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+cnhfc2Nsayk7Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+cnhfbWNsayk7Ci1lcnJvcl9pbnZhbGlkX2ZyZXE6Ci0KLQlNTV9FUlIoImVuY291bnRlciBlcnJvclxuIik7Ci0KLQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJmRydi0+cnhfcG1fcW9zX3JlcSwgUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgaW50IHNuZGRldl9pY29kZWNfb3Blbl90eChzdHJ1Y3Qgc25kZGV2X2ljb2RlY19zdGF0ZSAqaWNvZGVjKQotewotCWludCB0cmM7Ci0JaW50IGksIGVycjsKLQlzdHJ1Y3QgbXNtX2FmZV9jb25maWcgYWZlX2NvbmZpZzsKLQlzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kcnZfc3RhdGUgKmRydiA9ICZzbmRkZXZfaWNvZGVjX2Rydjs7Ci0KLQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJmRydi0+dHhfcG1fcW9zX3JlcSwKLQkJCSAgICAgIG1zbV9jcHVpZGxlX2dldF9kZWVwX2lkbGVfbGF0ZW5jeSgpKTsKLQotCS8qIFZvdGUgZm9yIFBXTSBtb2RlKi8KLQllcnIgPSBwbWFwcF9zbXBzX21vZGVfdm90ZShTTVBTX0FVRElPX1JFQ09SRF9JRCwKLQkJCVBNQVBQX1ZSRUdfUzQsIFBNQVBQX1NNUFNfTU9ERV9WT1RFX1BXTSk7Ci0JaWYgKGVyciAhPSAwKQotCQlNTV9FUlIoInBtYXBwX3NtcHNfbW9kZV92b3RlIGVycm9yICVkXG4iLCBlcnIpOwotCi0JLyogUmV1c2UgcGFtcF9vbiBmb3IgVFggcGxhdGZvcm0tc3BlY2lmaWMgc2V0dXAgICovCi0JaWYgKGljb2RlYy0+ZGF0YS0+cGFtcF9vbikKLQkJaWNvZGVjLT5kYXRhLT5wYW1wX29uKCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaWNvZGVjLT5kYXRhLT5wbWN0bF9pZF9zejsgaSsrKSB7Ci0JCXBtaWNfaHNlZF9lbmFibGUoaWNvZGVjLT5kYXRhLT5wbWN0bF9pZFtpXSwKLQkJCSBQTV9IU0VEX0VOQUJMRV9QV01fVENYTyk7Ci0JfQotCi0JLyogZW5hYmxlIE1JMlMgVFggbWFzdGVyIGJsb2NrICovCi0JLyogZW5hYmxlIE1JMlMgVFggYml0IGNsb2NrICovCi0JdHJjID0gY2xrX3NldF9yYXRlKGRydi0+dHhfbWNsaywKLQkJU05EREVWX0lDT0RFQ19DTEtfUkFURShpY29kZWMtPnNhbXBsZV9yYXRlKSk7Ci0JaWYgKElTX0VSUl9WQUxVRSh0cmMpKQotCQlnb3RvIGVycm9yX2ludmFsaWRfZnJlcTsKLQljbGtfcHJlcGFyZV9lbmFibGUoZHJ2LT50eF9tY2xrKTsKLQljbGtfcHJlcGFyZV9lbmFibGUoZHJ2LT50eF9zY2xrKTsKLQotCS8qIFNldCBNSTJTICovCi0JbWkyc19zZXRfY29kZWNfaW5wdXRfcGF0aCgoaWNvZGVjLT5kYXRhLT5jaGFubmVsX21vZGUgPT0KLQkJCQlSRUFMX1NURVJFT19DSEFOTkVMX01PREUgPyBNSTJTX0NIQU5fU1RFUkVPIDoKLQkJCQkoaWNvZGVjLT5kYXRhLT5jaGFubmVsX21vZGUgPT0gMiA/Ci0JCQkJIE1JMlNfQ0hBTl9TVEVSRU8gOiBNSTJTX0NIQU5fTU9OT19SQVcpKSwKLQkJCQlXVF8xNl9CSVQpOwotCS8qIENvbmZpZ3VyZSBBRElFICovCi0JdHJjID0gYWRpZV9jb2RlY19vcGVuKGljb2RlYy0+ZGF0YS0+cHJvZmlsZSwgJmljb2RlYy0+YWRpZV9wYXRoKTsKLQlpZiAoSVNfRVJSX1ZBTFVFKHRyYykpCi0JCWdvdG8gZXJyb3JfYWRpZTsKLQkvKiBFbmFibGUgQURJRSAqLwotCWFkaWVfY29kZWNfc2V0cGF0aChpY29kZWMtPmFkaWVfcGF0aCwgaWNvZGVjLT5zYW1wbGVfcmF0ZSwgMjU2KTsKLQlhZGllX2NvZGVjX3Byb2NlZWRfc3RhZ2UoaWNvZGVjLT5hZGllX3BhdGgsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWSk7Ci0JYWRpZV9jb2RlY19wcm9jZWVkX3N0YWdlKGljb2RlYy0+YWRpZV9wYXRoLAotCUFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFkpOwotCi0JLyogU3RhcnQgQUZFICovCi0JYWZlX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IGljb2RlYy0+c2FtcGxlX3JhdGUgLyAxMDAwOwotCWFmZV9jb25maWcuY2hhbm5lbF9tb2RlID0gaWNvZGVjLT5kYXRhLT5jaGFubmVsX21vZGU7Ci0JYWZlX2NvbmZpZy52b2x1bWUgPSBBRkVfVk9MVU1FX1VOSVRZOwotCXRyYyA9IGFmZV9lbmFibGUoQUZFX0hXX1BBVEhfQ09ERUNfVFgsICZhZmVfY29uZmlnKTsKLQlpZiAoSVNfRVJSX1ZBTFVFKHRyYykpCi0JCWdvdG8gZXJyb3JfYWZlOwotCi0KLQlpY29kZWMtPmVuYWJsZWQgPSAxOwotCi0JcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KCZkcnYtPnR4X3BtX3Fvc19yZXEsIFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQlyZXR1cm4gMDsKLQotZXJyb3JfYWZlOgotCWFkaWVfY29kZWNfY2xvc2UoaWNvZGVjLT5hZGllX3BhdGgpOwotCWljb2RlYy0+YWRpZV9wYXRoID0gTlVMTDsKLWVycm9yX2FkaWU6Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+dHhfc2Nsayk7Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+dHhfbWNsayk7Ci1lcnJvcl9pbnZhbGlkX2ZyZXE6Ci0KLQkvKiBEaXNhYmxlIG1pYyBiaWFzICovCi0JZm9yIChpID0gMDsgaSA8IGljb2RlYy0+ZGF0YS0+cG1jdGxfaWRfc3o7IGkrKykgewotCQlwbWljX2hzZWRfZW5hYmxlKGljb2RlYy0+ZGF0YS0+cG1jdGxfaWRbaV0sCi0JCQkgUE1fSFNFRF9FTkFCTEVfT0ZGKTsKLQl9Ci0KLQlpZiAoaWNvZGVjLT5kYXRhLT5wYW1wX29mZikKLQkJaWNvZGVjLT5kYXRhLT5wYW1wX29mZigpOwotCi0JTU1fRVJSKCJlbmNvdW50ZXIgZXJyb3JcbiIpOwotCi0JcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KCZkcnYtPnR4X3BtX3Fvc19yZXEsIFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIGludCBzbmRkZXZfaWNvZGVjX2Nsb3NlX2xiKHN0cnVjdCBzbmRkZXZfaWNvZGVjX3N0YXRlICppY29kZWMpCi17Ci0JLyogRGlzYWJsZSBwb3dlciBhbXBsaWZpZXIgKi8KLQlpZiAoaWNvZGVjLT5kYXRhLT5wYW1wX29mZikKLQkJaWNvZGVjLT5kYXRhLT5wYW1wX29mZigpOwotCi0JaWYgKGljb2RlYy0+YWRpZV9wYXRoKSB7Ci0JCWFkaWVfY29kZWNfcHJvY2VlZF9zdGFnZShpY29kZWMtPmFkaWVfcGF0aCwKLQkJCQkJCUFESUVfQ09ERUNfRElHSVRBTF9PRkYpOwotCQlhZGllX2NvZGVjX2Nsb3NlKGljb2RlYy0+YWRpZV9wYXRoKTsKLQkJaWNvZGVjLT5hZGllX3BhdGggPSBOVUxMOwotCX0KLQlpZiAoaWNvZGVjLT5kYXRhLT52b2x0YWdlX29mZikKLQkJaWNvZGVjLT5kYXRhLT52b2x0YWdlX29mZigpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kZGV2X2ljb2RlY19jbG9zZV9yeChzdHJ1Y3Qgc25kZGV2X2ljb2RlY19zdGF0ZSAqaWNvZGVjKQotewotCWludCBlcnI7Ci0Jc3RydWN0IHNuZGRldl9pY29kZWNfZHJ2X3N0YXRlICpkcnYgPSAmc25kZGV2X2ljb2RlY19kcnY7Ci0KLQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJmRydi0+cnhfcG1fcW9zX3JlcSwKLQkJCSAgICAgIG1zbV9jcHVpZGxlX2dldF9kZWVwX2lkbGVfbGF0ZW5jeSgpKTsKLQotCS8qIFJlbW92ZSB0aGUgdm90ZSBmb3IgU01QUyBtb2RlKi8KLQllcnIgPSBwbWFwcF9zbXBzX21vZGVfdm90ZShTTVBTX0FVRElPX1BMQVlCQUNLX0lELAotCQkJUE1BUFBfVlJFR19TNCwgUE1BUFBfU01QU19NT0RFX1ZPVEVfRE9OVENBUkUpOwotCWlmIChlcnIgIT0gMCkKLQkJTU1fRVJSKCJwbWFwcF9zbXBzX21vZGVfdm90ZSBlcnJvciAlZFxuIiwgZXJyKTsKLQotCS8qIERpc2FibGUgcG93ZXIgYW1wbGlmaWVyICovCi0JaWYgKGljb2RlYy0+ZGF0YS0+cGFtcF9vZmYpCi0JCWljb2RlYy0+ZGF0YS0+cGFtcF9vZmYoKTsKLQotCS8qIERpc2FibGUgQURJRSAqLwotCWFkaWVfY29kZWNfcHJvY2VlZF9zdGFnZShpY29kZWMtPmFkaWVfcGF0aCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRik7Ci0JYWRpZV9jb2RlY19jbG9zZShpY29kZWMtPmFkaWVfcGF0aCk7Ci0JaWNvZGVjLT5hZGllX3BhdGggPSBOVUxMOwotCi0JYWZlX2Rpc2FibGUoQUZFX0hXX1BBVEhfQ09ERUNfUlgpOwotCi0JaWYgKGljb2RlYy0+ZGF0YS0+dm9sdGFnZV9vZmYpCi0JCWljb2RlYy0+ZGF0YS0+dm9sdGFnZV9vZmYoKTsKLQotCS8qIERpc2FibGUgTFBBIFN1YiBzeXN0ZW0gKi8KLQlscGFfY21kX2VuYWJsZV9jb2RlYyhkcnYtPmxwYSwgMCk7Ci0JbHBhX3B1dChkcnYtPmxwYSk7Ci0KLQkvKiBEaXNhYmxlIExQQSBjbG9ja3MgKi8KLQljbGtfZGlzYWJsZV91bnByZXBhcmUoZHJ2LT5scGFfcF9jbGspOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnYtPmxwYV9jb2RlY19jbGspOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnYtPmxwYV9jb3JlX2Nsayk7Ci0KLQkvKiBEaXNhYmxlIE1JMlMgUlggbWFzdGVyIGJsb2NrICovCi0JLyogRGlzYWJsZSBNSTJTIFJYIGJpdCBjbG9jayAqLwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnYtPnJ4X3NjbGspOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnYtPnJ4X21jbGspOwotCi0JaWNvZGVjLT5lbmFibGVkID0gMDsKLQotCXBtX3Fvc191cGRhdGVfcmVxdWVzdCgmZHJ2LT5yeF9wbV9xb3NfcmVxLCBQTV9RT1NfREVGQVVMVF9WQUxVRSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kZGV2X2ljb2RlY19jbG9zZV90eChzdHJ1Y3Qgc25kZGV2X2ljb2RlY19zdGF0ZSAqaWNvZGVjKQotewotCXN0cnVjdCBzbmRkZXZfaWNvZGVjX2Rydl9zdGF0ZSAqZHJ2ID0gJnNuZGRldl9pY29kZWNfZHJ2OwotCWludCBpLCBlcnI7Ci0KLQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJmRydi0+dHhfcG1fcW9zX3JlcSwKLQkJCSAgICAgIG1zbV9jcHVpZGxlX2dldF9kZWVwX2lkbGVfbGF0ZW5jeSgpKTsKLQotCS8qIFJlbW92ZSB0aGUgdm90ZSBmb3IgU01QUyBtb2RlKi8KLQllcnIgPSBwbWFwcF9zbXBzX21vZGVfdm90ZShTTVBTX0FVRElPX1JFQ09SRF9JRCwKLQkJCVBNQVBQX1ZSRUdfUzQsIFBNQVBQX1NNUFNfTU9ERV9WT1RFX0RPTlRDQVJFKTsKLQlpZiAoZXJyICE9IDApCi0JCU1NX0VSUigicG1hcHBfc21wc19tb2RlX3ZvdGUgZXJyb3IgJWRcbiIsIGVycik7Ci0KLQlhZmVfZGlzYWJsZShBRkVfSFdfUEFUSF9DT0RFQ19UWCk7Ci0KLQkvKiBEaXNhYmxlIEFESUUgKi8KLQlhZGllX2NvZGVjX3Byb2NlZWRfc3RhZ2UoaWNvZGVjLT5hZGllX3BhdGgsIEFESUVfQ09ERUNfRElHSVRBTF9PRkYpOwotCWFkaWVfY29kZWNfY2xvc2UoaWNvZGVjLT5hZGllX3BhdGgpOwotCWljb2RlYy0+YWRpZV9wYXRoID0gTlVMTDsKLQotCS8qIERpc2FibGUgTUkyUyBUWCBtYXN0ZXIgYmxvY2sgKi8KLQkvKiBEaXNhYmxlIE1JMlMgVFggYml0IGNsb2NrICovCi0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+dHhfc2Nsayk7Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+dHhfbWNsayk7Ci0KLQkvKiBEaXNhYmxlIG1pYyBiaWFzICovCi0JZm9yIChpID0gMDsgaSA8IGljb2RlYy0+ZGF0YS0+cG1jdGxfaWRfc3o7IGkrKykgewotCQlwbWljX2hzZWRfZW5hYmxlKGljb2RlYy0+ZGF0YS0+cG1jdGxfaWRbaV0sCi0JCQkgUE1fSFNFRF9FTkFCTEVfT0ZGKTsKLQl9Ci0KLQkvKiBSZXVzZSBwYW1wX29mZiBmb3IgVFggcGxhdGZvcm0tc3BlY2lmaWMgc2V0dXAgICovCi0JaWYgKGljb2RlYy0+ZGF0YS0+cGFtcF9vZmYpCi0JCWljb2RlYy0+ZGF0YS0+cGFtcF9vZmYoKTsKLQotCWljb2RlYy0+ZW5hYmxlZCA9IDA7Ci0KLQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJmRydi0+dHhfcG1fcW9zX3JlcSwgUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZGRldl9pY29kZWNfb3Blbl9sYihzdHJ1Y3Qgc25kZGV2X2ljb2RlY19zdGF0ZSAqaWNvZGVjKQotewotCWludCB0cmM7Ci0JdHJjID0gYWRpZV9jb2RlY19vcGVuKGljb2RlYy0+ZGF0YS0+cHJvZmlsZSwgJmljb2RlYy0+YWRpZV9wYXRoKTsKLQlpZiAoSVNfRVJSX1ZBTFVFKHRyYykpCi0JCXByX2VycigiJXM6IGFkaWUgY29kZWMgb3BlbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQllbHNlCi0JCWFkaWVfY29kZWNfc2V0cGF0aChpY29kZWMtPmFkaWVfcGF0aCwKLQkJCQkJCWljb2RlYy0+c2FtcGxlX3JhdGUsIDI1Nik7Ci0KLQlpZiAoaWNvZGVjLT5hZGllX3BhdGgpCi0JCWFkaWVfY29kZWNfcHJvY2VlZF9zdGFnZShpY29kZWMtPmFkaWVfcGF0aCwKLQkJCQkJQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWSk7Ci0JaWYgKGljb2RlYy0+ZGF0YS0+cGFtcF9vbikKLQkJaWNvZGVjLT5kYXRhLT5wYW1wX29uKCk7Ci0KLQlpY29kZWMtPmVuYWJsZWQgPSAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZGRldl9pY29kZWNfc2V0X2RldmljZV92b2x1bWVfaW1wbCgKLQkJc3RydWN0IG1zbV9zbmRkZXZfaW5mbyAqZGV2X2luZm8sIHUzMiB2b2x1bWUpCi17Ci0Jc3RydWN0IHNuZGRldl9pY29kZWNfc3RhdGUgKmljb2RlYzsKLQl1OCBhZmVfcGF0aF9pZDsKLQotCWludCByYyA9IDA7Ci0KLQlpY29kZWMgPSBkZXZfaW5mby0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKGljb2RlYy0+ZGF0YS0+Y2FwYWJpbGl0eSAmIFNORERFVl9DQVBfUlgpCi0JCWFmZV9wYXRoX2lkID0gQUZFX0hXX1BBVEhfQ09ERUNfUlg7Ci0JZWxzZQotCQlhZmVfcGF0aF9pZCA9IEFGRV9IV19QQVRIX0NPREVDX1RYOwotCi0JaWYgKGljb2RlYy0+ZGF0YS0+ZGV2X3ZvbF90eXBlICYgU05EREVWX0RFVl9WT0xfRElHSVRBTCkgewotCi0JCXJjID0gYWRpZV9jb2RlY19zZXRfZGV2aWNlX2RpZ2l0YWxfdm9sdW1lKGljb2RlYy0+YWRpZV9wYXRoLAotCQkJCWljb2RlYy0+ZGF0YS0+Y2hhbm5lbF9tb2RlID09Ci0JCQkJCQlSRUFMX1NURVJFT19DSEFOTkVMX01PREUgPwotCQkJCQkyIDogaWNvZGVjLT5kYXRhLT5jaGFubmVsX21vZGUsIHZvbHVtZSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCU1NX0VSUigidW5hYmxlIHRvIHNldF9kZXZpY2VfZGlnaXRhbF92b2x1bWUgZm9yIgotCQkJCSIlcyB2b2x1bWUgaW4gcGVyY2VudGFnZSA9ICV1XG4iLAotCQkJCWRldl9pbmZvLT5uYW1lLCB2b2x1bWUpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0KLQl9IGVsc2UgaWYgKGljb2RlYy0+ZGF0YS0+ZGV2X3ZvbF90eXBlICYgU05EREVWX0RFVl9WT0xfQU5BTE9HKSB7Ci0JCXJjID0gYWRpZV9jb2RlY19zZXRfZGV2aWNlX2FuYWxvZ192b2x1bWUoaWNvZGVjLT5hZGllX3BhdGgsCi0JCQkJaWNvZGVjLT5kYXRhLT5jaGFubmVsX21vZGUgPT0KLQkJCQkJCVJFQUxfU1RFUkVPX0NIQU5ORUxfTU9ERSA/Ci0JCQkJCTIgOiBpY29kZWMtPmRhdGEtPmNoYW5uZWxfbW9kZSwgdm9sdW1lKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJTU1fRVJSKCJ1bmFibGUgdG8gc2V0X2RldmljZV9hbmFsb2dfdm9sdW1lIGZvciIKLQkJCQkiJXMgdm9sdW1lIGluIHBlcmNlbnRhZ2UgPSAldVxuIiwKLQkJCQlkZXZfaW5mby0+bmFtZSwgdm9sdW1lKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQllbHNlIHsKLQkJTU1fRVJSKCJJbnZhbGlkIGRldmljZSB2b2x1bWUgY29udHJvbFxuIik7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzbmRkZXZfaWNvZGVjX2Nsb3NlKHN0cnVjdCBtc21fc25kZGV2X2luZm8gKmRldl9pbmZvKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHNuZGRldl9pY29kZWNfc3RhdGUgKmljb2RlYzsKLQlzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kcnZfc3RhdGUgKmRydiA9ICZzbmRkZXZfaWNvZGVjX2RydjsKLQlpZiAoIWRldl9pbmZvKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlpY29kZWMgPSBkZXZfaW5mby0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKGljb2RlYy0+ZGF0YS0+Y2FwYWJpbGl0eSAmIFNORERFVl9DQVBfUlgpIHsKLQkJbXV0ZXhfbG9jaygmZHJ2LT5yeF9sb2NrKTsKLQkJaWYgKCFkcnYtPnJ4X2FjdGl2ZSkgewotCQkJbXV0ZXhfdW5sb2NrKCZkcnYtPnJ4X2xvY2spOwotCQkJcmMgPSAtRVBFUk07Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCXJjID0gc25kZGV2X2ljb2RlY19jbG9zZV9yeChpY29kZWMpOwotCQlpZiAoIUlTX0VSUl9WQUxVRShyYykpCi0JCQlkcnYtPnJ4X2FjdGl2ZSA9IDA7Ci0JCW11dGV4X3VubG9jaygmZHJ2LT5yeF9sb2NrKTsKLQl9IGVsc2UgaWYgKGljb2RlYy0+ZGF0YS0+Y2FwYWJpbGl0eSAmIFNORERFVl9DQVBfTEIpIHsKLQkJbXV0ZXhfbG9jaygmZHJ2LT5sYl9sb2NrKTsKLQkJcmMgPSBzbmRkZXZfaWNvZGVjX2Nsb3NlX2xiKGljb2RlYyk7Ci0JCW11dGV4X3VubG9jaygmZHJ2LT5sYl9sb2NrKTsKLQl9IGVsc2UgewotCQltdXRleF9sb2NrKCZkcnYtPnR4X2xvY2spOwotCQlpZiAoIWRydi0+dHhfYWN0aXZlKSB7Ci0JCQltdXRleF91bmxvY2soJmRydi0+dHhfbG9jayk7Ci0JCQlyYyA9IC1FUEVSTTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJcmMgPSBzbmRkZXZfaWNvZGVjX2Nsb3NlX3R4KGljb2RlYyk7Ci0JCWlmICghSVNfRVJSX1ZBTFVFKHJjKSkKLQkJCWRydi0+dHhfYWN0aXZlID0gMDsKLQkJbXV0ZXhfdW5sb2NrKCZkcnYtPnR4X2xvY2spOwotCX0KLQotZXJyb3I6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHNuZGRldl9pY29kZWNfb3BlbihzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICpkZXZfaW5mbykKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBzbmRkZXZfaWNvZGVjX3N0YXRlICppY29kZWM7Ci0Jc3RydWN0IHNuZGRldl9pY29kZWNfZHJ2X3N0YXRlICpkcnYgPSAmc25kZGV2X2ljb2RlY19kcnY7Ci0KLQlpZiAoIWRldl9pbmZvKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlpY29kZWMgPSBkZXZfaW5mby0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKGljb2RlYy0+ZGF0YS0+Y2FwYWJpbGl0eSAmIFNORERFVl9DQVBfUlgpIHsKLQkJbXV0ZXhfbG9jaygmZHJ2LT5yeF9sb2NrKTsKLQkJaWYgKGRydi0+cnhfYWN0aXZlKSB7Ci0JCQltdXRleF91bmxvY2soJmRydi0+cnhfbG9jayk7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJcmMgPSBzbmRkZXZfaWNvZGVjX29wZW5fcngoaWNvZGVjKTsKLQotCQlpZiAoIUlTX0VSUl9WQUxVRShyYykpIHsKLQkJCWRydi0+cnhfYWN0aXZlID0gMTsKLQkJCWlmICgoaWNvZGVjLT5kYXRhLT5kZXZfdm9sX3R5cGUgJiAoCi0JCQkJU05EREVWX0RFVl9WT0xfRElHSVRBTCB8Ci0JCQkJU05EREVWX0RFVl9WT0xfQU5BTE9HKSkpCi0JCQkJcmMgPSBzbmRkZXZfaWNvZGVjX3NldF9kZXZpY2Vfdm9sdW1lX2ltcGwoCi0JCQkJCQlkZXZfaW5mbywgZGV2X2luZm8tPmRldl92b2x1bWUpOwotCQkJCWlmIChJU19FUlJfVkFMVUUocmMpKSB7Ci0JCQkJCU1NX0VSUigiRmFpbGVkIHRvIHNldCBkZXZpY2Ugdm9sdW1lIgotCQkJCQkJIiBpbXBsIGZvciByeCBkZXZpY2VcbiIpOwotCQkJCQlzbmRkZXZfaWNvZGVjX2Nsb3NlKGRldl9pbmZvKTsKLQkJCQkJbXV0ZXhfdW5sb2NrKCZkcnYtPnJ4X2xvY2spOwotCQkJCQlnb3RvIGVycm9yOwotCQkJCX0KLQkJfQotCQltdXRleF91bmxvY2soJmRydi0+cnhfbG9jayk7Ci0JfSBlbHNlIGlmIChpY29kZWMtPmRhdGEtPmNhcGFiaWxpdHkgJiBTTkRERVZfQ0FQX0xCKSB7Ci0JCW11dGV4X2xvY2soJmRydi0+bGJfbG9jayk7Ci0JCXJjID0gc25kZGV2X2ljb2RlY19vcGVuX2xiKGljb2RlYyk7Ci0JCWlmICghSVNfRVJSX1ZBTFVFKHJjKSkgewotCQkJaWYgKChpY29kZWMtPmRhdGEtPmRldl92b2xfdHlwZSAmICgKLQkJCQkJCQlTTkRERVZfREVWX1ZPTF9ESUdJVEFMIHwKLQkJCQkJCQlTTkRERVZfREVWX1ZPTF9BTkFMT0cpKSkKLQkJCQlyYyA9IHNuZGRldl9pY29kZWNfc2V0X2RldmljZV92b2x1bWVfaW1wbCgKLQkJCQkJCQlkZXZfaW5mbywKLQkJCQkJCQkgZGV2X2luZm8tPmRldl92b2x1bWUpOwotCQkJCWlmIChyYyA8IDApCi0JCQkJCU1NX0VSUigiZmFpbGVkIHRvIHNldCBkZXZpY2Ugdm9sdW1lXG4iKTsKLQkJfQotCQltdXRleF91bmxvY2soJmRydi0+bGJfbG9jayk7Ci0JfSBlbHNlIHsKLQkJbXV0ZXhfbG9jaygmZHJ2LT50eF9sb2NrKTsKLQkJaWYgKGRydi0+dHhfYWN0aXZlKSB7Ci0JCQltdXRleF91bmxvY2soJmRydi0+dHhfbG9jayk7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJcmMgPSBzbmRkZXZfaWNvZGVjX29wZW5fdHgoaWNvZGVjKTsKLQotCQlpZiAoIUlTX0VSUl9WQUxVRShyYykpIHsKLQkJCWRydi0+dHhfYWN0aXZlID0gMTsKLQkJCWlmICgoaWNvZGVjLT5kYXRhLT5kZXZfdm9sX3R5cGUgJiAoCi0JCQkJU05EREVWX0RFVl9WT0xfRElHSVRBTCB8Ci0JCQkJU05EREVWX0RFVl9WT0xfQU5BTE9HKSkpCi0JCQkJcmMgPSBzbmRkZXZfaWNvZGVjX3NldF9kZXZpY2Vfdm9sdW1lX2ltcGwoCi0JCQkJCQlkZXZfaW5mbywgZGV2X2luZm8tPmRldl92b2x1bWUpOwotCQkJCWlmIChJU19FUlJfVkFMVUUocmMpKSB7Ci0JCQkJCU1NX0VSUigiRmFpbGVkIHRvIHNldCBkZXZpY2Ugdm9sdW1lIgotCQkJCQkJIiBpbXBsIGZvciB0eCBkZXZpY2VcbiIpOwotCQkJCQlzbmRkZXZfaWNvZGVjX2Nsb3NlKGRldl9pbmZvKTsKLQkJCQkJbXV0ZXhfdW5sb2NrKCZkcnYtPnR4X2xvY2spOwotCQkJCQlnb3RvIGVycm9yOwotCQkJCX0KLQkJfQotCQltdXRleF91bmxvY2soJmRydi0+dHhfbG9jayk7Ci0JfQotZXJyb3I6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHNuZGRldl9pY29kZWNfY2hlY2tfZnJlcSh1MzIgcmVxX2ZyZXEpCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQotCWlmICgocmVxX2ZyZXEgIT0gMCkgJiYgKHJlcV9mcmVxID49IDgwMDApICYmIChyZXFfZnJlcSA8PSA0ODAwMCkpIHsKLQkJaWYgKChyZXFfZnJlcSA9PSA4MDAwKSB8fCAocmVxX2ZyZXEgPT0gMTEwMjUpIHx8Ci0JCQkocmVxX2ZyZXEgPT0gMTIwMDApIHx8IChyZXFfZnJlcSA9PSAxNjAwMCkgfHwKLQkJCShyZXFfZnJlcSA9PSAyMjA1MCkgfHwgKHJlcV9mcmVxID09IDI0MDAwKSB8fAotCQkJKHJlcV9mcmVxID09IDMyMDAwKSB8fCAocmVxX2ZyZXEgPT0gNDQxMDApIHx8Ci0JCQkocmVxX2ZyZXEgPT0gNDgwMDApKSB7Ci0JCQkJcmMgPSAwOwotCQl9IGVsc2UKLQkJCU1NX0lORk8oIlVuc3VwcG9ydGVkIEZyZXF1ZW5jeTolZFxuIiwgcmVxX2ZyZXEpOwotCQl9Ci0JCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzbmRkZXZfaWNvZGVjX3NldF9mcmVxKHN0cnVjdCBtc21fc25kZGV2X2luZm8gKmRldl9pbmZvLCB1MzIgcmF0ZSkKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IHNuZGRldl9pY29kZWNfc3RhdGUgKmljb2RlYzsKLQotCWlmICghZGV2X2luZm8pIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWljb2RlYyA9IGRldl9pbmZvLT5wcml2YXRlX2RhdGE7Ci0JaWYgKGFkaWVfY29kZWNfZnJlcV9zdXBwb3J0ZWQoaWNvZGVjLT5kYXRhLT5wcm9maWxlLCByYXRlKSAhPSAwKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlcnJvcjsKLQl9IGVsc2UgewotCQlpZiAoc25kZGV2X2ljb2RlY19jaGVja19mcmVxKHJhdGUpICE9IDApIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0gZWxzZQotCQkJaWNvZGVjLT5zYW1wbGVfcmF0ZSA9IHJhdGU7Ci0JfQotCi0JaWYgKGljb2RlYy0+ZW5hYmxlZCkgewotCQlzbmRkZXZfaWNvZGVjX2Nsb3NlKGRldl9pbmZvKTsKLQkJc25kZGV2X2ljb2RlY19vcGVuKGRldl9pbmZvKTsKLQl9Ci0KLQlyZXR1cm4gaWNvZGVjLT5zYW1wbGVfcmF0ZTsKLQotZXJyb3I6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHNuZGRldl9pY29kZWNfZW5hYmxlX3NpZGV0b25lKHN0cnVjdCBtc21fc25kZGV2X2luZm8gKmRldl9pbmZvLAotCXUzMiBlbmFibGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3Qgc25kZGV2X2ljb2RlY19zdGF0ZSAqaWNvZGVjOwotCXN0cnVjdCBzbmRkZXZfaWNvZGVjX2Rydl9zdGF0ZSAqZHJ2ID0gJnNuZGRldl9pY29kZWNfZHJ2OwotCi0JaWYgKCFkZXZfaW5mbykgewotCQlNTV9FUlIoImludmFsaWQgZGV2X2luZm9cbiIpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JaWNvZGVjID0gZGV2X2luZm8tPnByaXZhdGVfZGF0YTsKLQotCWlmIChpY29kZWMtPmRhdGEtPmNhcGFiaWxpdHkgJiBTTkRERVZfQ0FQX1JYKSB7Ci0JCW11dGV4X2xvY2soJmRydi0+cnhfbG9jayk7Ci0JCWlmICghZHJ2LT5yeF9hY3RpdmUgfHwgIWRldl9pbmZvLT5vcGVuZWQpIHsKLQkJCU1NX0VSUigiZGV2IG5vdCBhY3RpdmVcbiIpOwotCQkJcmMgPSAtRVBFUk07Ci0JCQltdXRleF91bmxvY2soJmRydi0+cnhfbG9jayk7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCXJjID0gYWRpZV9jb2RlY19lbmFibGVfc2lkZXRvbmUoaWNvZGVjLT5hZGllX3BhdGgsIGVuYWJsZSk7Ci0JCW11dGV4X3VubG9jaygmZHJ2LT5yeF9sb2NrKTsKLQl9IGVsc2UgewotCQlyYyA9IC1FSU5WQUw7Ci0JCU1NX0VSUigicnggZGV2aWNlIG9ubHlcbiIpOwotCX0KLQotZXJyb3I6Ci0JcmV0dXJuIHJjOwotCi19Ci0KLWludCBzbmRkZXZfaWNvZGVjX3NldF9kZXZpY2Vfdm9sdW1lKHN0cnVjdCBtc21fc25kZGV2X2luZm8gKmRldl9pbmZvLAotCQl1MzIgdm9sdW1lKQotewotCXN0cnVjdCBzbmRkZXZfaWNvZGVjX3N0YXRlICppY29kZWM7Ci0Jc3RydWN0IG11dGV4ICpsb2NrOwotCXN0cnVjdCBzbmRkZXZfaWNvZGVjX2Rydl9zdGF0ZSAqZHJ2ID0gJnNuZGRldl9pY29kZWNfZHJ2OwotCWludCByYyA9IC1FUEVSTTsKLQotCWlmICghZGV2X2luZm8pIHsKLQkJTU1fSU5GTygiZGV2aWNlIG5vdCBpbnRpbGl6ZWQuXG4iKTsKLQkJcmV0dXJuICAtRUlOVkFMOwotCX0KLQotCWljb2RlYyA9IGRldl9pbmZvLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoIShpY29kZWMtPmRhdGEtPmRldl92b2xfdHlwZSAmIChTTkRERVZfREVWX1ZPTF9ESUdJVEFMCi0JCQkJfCBTTkRERVZfREVWX1ZPTF9BTkFMT0cpKSkgewotCi0JCU1NX0lORk8oImRldmljZSAlcyBkb2VzIG5vdCBzdXBwb3J0IGRldmljZSB2b2x1bWUgIgotCQkJCSJjb250cm9sLiIsIGRldl9pbmZvLT5uYW1lKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0JZGV2X2luZm8tPmRldl92b2x1bWUgPSAgdm9sdW1lOwotCi0JaWYgKGljb2RlYy0+ZGF0YS0+Y2FwYWJpbGl0eSAmIFNORERFVl9DQVBfUlgpCi0JCWxvY2sgPSAmZHJ2LT5yeF9sb2NrOwotCWVsc2UgaWYgKGljb2RlYy0+ZGF0YS0+Y2FwYWJpbGl0eSAmIFNORERFVl9DQVBfTEIpCi0JCWxvY2sgPSAmZHJ2LT5sYl9sb2NrOwotCWVsc2UKLQkJbG9jayA9ICZkcnYtPnR4X2xvY2s7Ci0KLQltdXRleF9sb2NrKGxvY2spOwotCi0JcmMgPSBzbmRkZXZfaWNvZGVjX3NldF9kZXZpY2Vfdm9sdW1lX2ltcGwoZGV2X2luZm8sCi0JCQlkZXZfaW5mby0+ZGV2X3ZvbHVtZSk7Ci0JbXV0ZXhfdW5sb2NrKGxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzbmRkZXZfaWNvZGVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjID0gMCwgaTsKLQlzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kYXRhICpwZGF0YTsKLQlzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICpkZXZfaW5mbzsKLQlzdHJ1Y3Qgc25kZGV2X2ljb2RlY19zdGF0ZSAqaWNvZGVjOwotCi0JaWYgKCFwZGV2IHx8ICFwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSkgewotCQlwcmludGsoS0VSTl9BTEVSVCAiSW52YWxpZCBjYWxsZXIgXG4iKTsKLQkJcmMgPSAtMTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpZiAoKHBkYXRhLT5jYXBhYmlsaXR5ICYgU05EREVWX0NBUF9SWCkgJiYKLQkgICAocGRhdGEtPmNhcGFiaWxpdHkgJiBTTkRERVZfQ0FQX1RYKSkgewotCQlNTV9FUlIoImludmFsaWQgZGV2aWNlIGRhdGEgZWl0aGVyIFJYIG9yIFRYXG4iKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JaWNvZGVjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZGRldl9pY29kZWNfc3RhdGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWljb2RlYykgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWRldl9pbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9zbmRkZXZfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghZGV2X2luZm8pIHsKLQkJa2ZyZWUoaWNvZGVjKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWRldl9pbmZvLT5uYW1lID0gcGRhdGEtPm5hbWU7Ci0JZGV2X2luZm8tPmNvcHBfaWQgPSBwZGF0YS0+Y29wcF9pZDsKLQlkZXZfaW5mby0+YWNkYl9pZCA9IHBkYXRhLT5hY2RiX2lkOwotCWRldl9pbmZvLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKSBpY29kZWM7Ci0JZGV2X2luZm8tPmRldl9vcHMub3BlbiA9IHNuZGRldl9pY29kZWNfb3BlbjsKLQlkZXZfaW5mby0+ZGV2X29wcy5jbG9zZSA9IHNuZGRldl9pY29kZWNfY2xvc2U7Ci0JZGV2X2luZm8tPmRldl9vcHMuc2V0X2ZyZXEgPSBzbmRkZXZfaWNvZGVjX3NldF9mcmVxOwotCWRldl9pbmZvLT5kZXZfb3BzLnNldF9kZXZpY2Vfdm9sdW1lID0gc25kZGV2X2ljb2RlY19zZXRfZGV2aWNlX3ZvbHVtZTsKLQlkZXZfaW5mby0+Y2FwYWJpbGl0eSA9IHBkYXRhLT5jYXBhYmlsaXR5OwotCWRldl9pbmZvLT5vcGVuZWQgPSAwOwotCW1zbV9zbmRkZXZfcmVnaXN0ZXIoZGV2X2luZm8pOwotCWljb2RlYy0+ZGF0YSA9IHBkYXRhOwotCWljb2RlYy0+c2FtcGxlX3JhdGUgPSBwZGF0YS0+ZGVmYXVsdF9zYW1wbGVfcmF0ZTsKLQlkZXZfaW5mby0+c2FtcGxlX3JhdGUgPSBwZGF0YS0+ZGVmYXVsdF9zYW1wbGVfcmF0ZTsKLQlpZiAocGRhdGEtPmNhcGFiaWxpdHkgJiBTTkRERVZfQ0FQX1JYKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBWT0NfUlhfVk9MX0FSUkFZX05VTTsgaSsrKSB7Ci0JCQlkZXZfaW5mby0+bWF4X3ZvY19yeF92b2xbaV0gPQotCQkJCXBkYXRhLT5tYXhfdm9pY2Vfcnhfdm9sW2ldOwotCQkJZGV2X2luZm8tPm1pbl92b2Nfcnhfdm9sW2ldID0KLQkJCQlwZGF0YS0+bWluX3ZvaWNlX3J4X3ZvbFtpXTsKLQkJfQotCQkvKnNpZGV0b25lIGlzIGVuYWJsZWQgb25seSBmb3IgIHRoZSBkZXZpY2Ugd2hpY2gKLQkJcHJvcGVydHkgc2V0IGZvciBzaWRlIHRvbmUqLwotCQlpZiAocGRhdGEtPnByb3BlcnR5ICYgU0lERV9UT05FX01BU0spCi0JCQlkZXZfaW5mby0+ZGV2X29wcy5lbmFibGVfc2lkZXRvbmUgPQotCQkJCXNuZGRldl9pY29kZWNfZW5hYmxlX3NpZGV0b25lOwotCQllbHNlCi0JCQlkZXZfaW5mby0+ZGV2X29wcy5lbmFibGVfc2lkZXRvbmUgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCWRldl9pbmZvLT5kZXZfb3BzLmVuYWJsZV9zaWRldG9uZSA9IE5VTEw7Ci0JfQotCi1lcnJvcjoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgc25kZGV2X2ljb2RlY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc25kZGV2X2ljb2RlY19kcml2ZXIgPSB7Ci0gIC5wcm9iZSA9IHNuZGRldl9pY29kZWNfcHJvYmUsCi0gIC5yZW1vdmUgPSBzbmRkZXZfaWNvZGVjX3JlbW92ZSwKLSAgLmRyaXZlciA9IHsgLm5hbWUgPSAic25kZGV2X2ljb2RlYyIgfQotfTsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfc2Rldl9kZW50Owotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfYWZlbGI7Ci1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVidWdmc19hZGllbGI7Ci1zdGF0aWMgc3RydWN0IGFkaWVfY29kZWNfcGF0aCAqZGVidWdmc19yeF9hZGllOwotc3RhdGljIHN0cnVjdCBhZGllX2NvZGVjX3BhdGggKmRlYnVnZnNfdHhfYWRpZTsKLQotc3RhdGljIGludCBzbmRkZXZfaWNvZGVjX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlNTV9JTkZPKCJzbmRkZXZfaWNvZGVjOiBkZWJ1ZyBpbnRmICVzXG4iLCAoY2hhciAqKSBmaWxlLT5wcml2YXRlX2RhdGEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkZWJ1Z2ZzX2FkaWVfbG9vcGJhY2sodTMyIGxvb3ApCi17Ci0Jc3RydWN0IHNuZGRldl9pY29kZWNfZHJ2X3N0YXRlICpkcnYgPSAmc25kZGV2X2ljb2RlY19kcnY7Ci0KLQlpZiAobG9vcCkgewotCi0JCS8qIGVuYWJsZSBNSTJTIFJYIG1hc3RlciBibG9jayAqLwotCQkvKiBlbmFibGUgTUkyUyBSWCBiaXQgY2xvY2sgKi8KLQkJY2xrX3NldF9yYXRlKGRydi0+cnhfbWNsaywKLQkJCVNORERFVl9JQ09ERUNfQ0xLX1JBVEUoODAwMCkpOwotCQljbGtfcHJlcGFyZV9lbmFibGUoZHJ2LT5yeF9tY2xrKTsKLQkJY2xrX3ByZXBhcmVfZW5hYmxlKGRydi0+cnhfc2Nsayk7Ci0KLQkJTU1fSU5GTygiY29uZmlndXJlIEFESUUgUlggcGF0aFxuIik7Ci0JCS8qIENvbmZpZ3VyZSBBRElFICovCi0JCWFkaWVfY29kZWNfb3BlbigmZGVidWdfcnhfcHJvZmlsZSwgJmRlYnVnZnNfcnhfYWRpZSk7Ci0JCWFkaWVfY29kZWNfc2V0cGF0aChkZWJ1Z2ZzX3J4X2FkaWUsIDgwMDAsIDI1Nik7Ci0JCWFkaWVfY29kZWNfcHJvY2VlZF9zdGFnZShkZWJ1Z2ZzX3J4X2FkaWUsCi0JCUFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFkpOwotCi0JCU1NX0lORk8oIkVuYWJsZSBIYW5kc2V0IE1pYyBiaWFzXG4iKTsKLQkJcG1pY19oc2VkX2VuYWJsZShQTV9IU0VEX0NPTlRST0xMRVJfMCwgUE1fSFNFRF9FTkFCTEVfUFdNX1RDWE8pOwotCQkvKiBlbmFibGUgTUkyUyBUWCBtYXN0ZXIgYmxvY2sgKi8KLQkJLyogZW5hYmxlIE1JMlMgVFggYml0IGNsb2NrICovCi0JCWNsa19zZXRfcmF0ZShkcnYtPnR4X21jbGssCi0JCQlTTkRERVZfSUNPREVDX0NMS19SQVRFKDgwMDApKTsKLQkJY2xrX3ByZXBhcmVfZW5hYmxlKGRydi0+dHhfbWNsayk7Ci0JCWNsa19wcmVwYXJlX2VuYWJsZShkcnYtPnR4X3NjbGspOwotCi0JCU1NX0lORk8oImNvbmZpZ3VyZSBBRElFIFRYIHBhdGhcbiIpOwotCQkvKiBDb25maWd1cmUgQURJRSAqLwotCQlhZGllX2NvZGVjX29wZW4oJmRlYnVnX3R4X2xiX3Byb2ZpbGUsICZkZWJ1Z2ZzX3R4X2FkaWUpOwotCQlhZGllX2NvZGVjX3NldHBhdGgoZGVidWdmc190eF9hZGllLCA4MDAwLCAyNTYpOwotCQlhZGllX2NvZGVjX3Byb2NlZWRfc3RhZ2UoZGVidWdmc190eF9hZGllLAotCQlBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZKTsKLQl9IGVsc2UgewotCQkvKiBEaXNhYmxlIEFESUUgKi8KLQkJYWRpZV9jb2RlY19wcm9jZWVkX3N0YWdlKGRlYnVnZnNfcnhfYWRpZSwKLQkJQURJRV9DT0RFQ19ESUdJVEFMX09GRik7Ci0JCWFkaWVfY29kZWNfY2xvc2UoZGVidWdmc19yeF9hZGllKTsKLQkJYWRpZV9jb2RlY19wcm9jZWVkX3N0YWdlKGRlYnVnZnNfdHhfYWRpZSwKLQkJQURJRV9DT0RFQ19ESUdJVEFMX09GRik7Ci0JCWFkaWVfY29kZWNfY2xvc2UoZGVidWdmc190eF9hZGllKTsKLQotCQlwbWljX2hzZWRfZW5hYmxlKFBNX0hTRURfQ09OVFJPTExFUl8wLCBQTV9IU0VEX0VOQUJMRV9PRkYpOwotCi0JCS8qIERpc2FibGUgTUkyUyBSWCBtYXN0ZXIgYmxvY2sgKi8KLQkJLyogRGlzYWJsZSBNSTJTIFJYIGJpdCBjbG9jayAqLwotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZHJ2LT5yeF9zY2xrKTsKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+cnhfbWNsayk7Ci0KLQkJLyogRGlzYWJsZSBNSTJTIFRYIG1hc3RlciBibG9jayAqLwotCQkvKiBEaXNhYmxlIE1JMlMgVFggYml0IGNsb2NrICovCi0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnYtPnR4X3NjbGspOwotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZHJ2LT50eF9tY2xrKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGRlYnVnZnNfYWZlX2xvb3BiYWNrKHUzMiBsb29wKQotewotCWludCB0cmM7Ci0Jc3RydWN0IG1zbV9hZmVfY29uZmlnIGFmZV9jb25maWc7Ci0Jc3RydWN0IHNuZGRldl9pY29kZWNfZHJ2X3N0YXRlICpkcnYgPSAmc25kZGV2X2ljb2RlY19kcnY7Ci0Jc3RydWN0IGxwYV9jb2RlY19jb25maWcgbHBhX2NvbmZpZzsKLQotCWlmIChsb29wKSB7Ci0JCS8qIFZvdGUgZm9yIFNNUFMgbW9kZSovCi0JCXBtYXBwX3NtcHNfbW9kZV92b3RlKFNNUFNfQVVESU9fUExBWUJBQ0tfSUQsCi0JCQkJUE1BUFBfVlJFR19TNCwgUE1BUFBfU01QU19NT0RFX1ZPVEVfUFdNKTsKLQotCQkvKiBlbmFibGUgTUkyUyBSWCBtYXN0ZXIgYmxvY2sgKi8KLQkJLyogZW5hYmxlIE1JMlMgUlggYml0IGNsb2NrICovCi0JCXRyYyA9IGNsa19zZXRfcmF0ZShkcnYtPnJ4X21jbGssCi0JCVNORERFVl9JQ09ERUNfQ0xLX1JBVEUoODAwMCkpOwotCQlpZiAoSVNfRVJSX1ZBTFVFKHRyYykpCi0JCQlNTV9FUlIoImZhaWxlZCB0byBzZXQgY2xrIHJhdGVcbiIpOwotCQljbGtfcHJlcGFyZV9lbmFibGUoZHJ2LT5yeF9tY2xrKTsKLQkJY2xrX3ByZXBhcmVfZW5hYmxlKGRydi0+cnhfc2Nsayk7Ci0JCWNsa19wcmVwYXJlX2VuYWJsZShkcnYtPmxwYV9wX2Nsayk7Ci0JCWNsa19wcmVwYXJlX2VuYWJsZShkcnYtPmxwYV9jb2RlY19jbGspOwotCQljbGtfcHJlcGFyZV9lbmFibGUoZHJ2LT5scGFfY29yZV9jbGspOwotCQkvKiBFbmFibGUgTFBBIHN1YiBzeXN0ZW0KLQkJICovCi0JCWRydi0+bHBhID0gbHBhX2dldCgpOwotCQlpZiAoIWRydi0+bHBhKQotCQkJTU1fRVJSKCJmYWlsZWQgdG8gZW5hYmxlIGxwYVxuIik7Ci0JCWxwYV9jb25maWcuc2FtcGxlX3JhdGUgPSA4MDAwOwotCQlscGFfY29uZmlnLnNhbXBsZV93aWR0aCA9IDE2OwotCQlscGFfY29uZmlnLm91dHB1dF9pbnRlcmZhY2UgPSBMUEFfT1VUUFVUX0lOVEZfV0JfQ09ERUM7Ci0JCWxwYV9jb25maWcubnVtX2NoYW5uZWxzID0gMTsKLQkJbHBhX2NtZF9jb2RlY19jb25maWcoZHJ2LT5scGEsICZscGFfY29uZmlnKTsKLQkJLyogU2V0IGF1ZGlvIGludGVyY29ubmVjdCByZWcgdG8gTFBBICovCi0JCWF1ZGlvX2ludGVyY3RfY29kZWMoQVVESU9fSU5URVJDVF9MUEEpOwotCQltaTJzX3NldF9jb2RlY19vdXRwdXRfcGF0aChNSTJTX0NIQU5fTU9OT19QQUNLRUQsIFdUXzE2X0JJVCk7Ci0JCU1NX0lORk8oImNvbmZpZ3VyZSBBRElFIFJYIHBhdGhcbiIpOwotCQkvKiBDb25maWd1cmUgQURJRSAqLwotCQlhZGllX2NvZGVjX29wZW4oJmRlYnVnX3J4X3Byb2ZpbGUsICZkZWJ1Z2ZzX3J4X2FkaWUpOwotCQlhZGllX2NvZGVjX3NldHBhdGgoZGVidWdmc19yeF9hZGllLCA4MDAwLCAyNTYpOwotCQlscGFfY21kX2VuYWJsZV9jb2RlYyhkcnYtPmxwYSwgMSk7Ci0KLQkJLyogU3RhcnQgQUZFIGZvciBSWCAqLwotCQlhZmVfY29uZmlnLnNhbXBsZV9yYXRlID0gMHg4OwotCQlhZmVfY29uZmlnLmNoYW5uZWxfbW9kZSA9IDE7Ci0JCWFmZV9jb25maWcudm9sdW1lID0gQUZFX1ZPTFVNRV9VTklUWTsKLQkJTU1fSU5GTygiZW5hYmxlIGFmZVxuIik7Ci0JCXRyYyA9IGFmZV9lbmFibGUoQUZFX0hXX1BBVEhfQ09ERUNfUlgsICZhZmVfY29uZmlnKTsKLQkJaWYgKElTX0VSUl9WQUxVRSh0cmMpKQotCQkJTU1fRVJSKCJmYWlsIHRvIGVuYWJsZSBhZmUgUlhcbiIpOwotCQlhZGllX2NvZGVjX3Byb2NlZWRfc3RhZ2UoZGVidWdmc19yeF9hZGllLAotCQlBRElFX0NPREVDX0RJR0lUQUxfUkVBRFkpOwotCQlhZGllX2NvZGVjX3Byb2NlZWRfc3RhZ2UoZGVidWdmc19yeF9hZGllLAotCQlBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZKTsKLQotCQkvKiBWb3RlIGZvciBQV00gbW9kZSovCi0JCXBtYXBwX3NtcHNfbW9kZV92b3RlKFNNUFNfQVVESU9fUkVDT1JEX0lELAotCQkJUE1BUFBfVlJFR19TNCwgUE1BUFBfU01QU19NT0RFX1ZPVEVfUFdNKTsKLQotCQlNTV9JTkZPKCJFbmFibGUgSGFuZHNldCBNaWMgYmlhc1xuIik7Ci0JCXBtaWNfaHNlZF9lbmFibGUoUE1fSFNFRF9DT05UUk9MTEVSXzAsIFBNX0hTRURfRU5BQkxFX1BXTV9UQ1hPKTsKLQotCQkvKiBlbmFibGUgTUkyUyBUWCBtYXN0ZXIgYmxvY2sgKi8KLQkJLyogZW5hYmxlIE1JMlMgVFggYml0IGNsb2NrICovCi0JCWNsa19zZXRfcmF0ZShkcnYtPnR4X21jbGssCi0JCQlTTkRERVZfSUNPREVDX0NMS19SQVRFKDgwMDApKTsKLQkJY2xrX3ByZXBhcmVfZW5hYmxlKGRydi0+dHhfbWNsayk7Ci0JCWNsa19wcmVwYXJlX2VuYWJsZShkcnYtPnR4X3NjbGspOwotCQkvKiBTZXQgTUkyUyAqLwotCQltaTJzX3NldF9jb2RlY19pbnB1dF9wYXRoKE1JMlNfQ0hBTl9NT05PX1BBQ0tFRCwgV1RfMTZfQklUKTsKLQkJTU1fSU5GTygiY29uZmlndXJlIEFESUUgVFggcGF0aFxuIik7Ci0JCS8qIENvbmZpZ3VyZSBBRElFICovCi0JCWFkaWVfY29kZWNfb3BlbigmZGVidWdfdHhfcHJvZmlsZSwgJmRlYnVnZnNfdHhfYWRpZSk7Ci0JCWFkaWVfY29kZWNfc2V0cGF0aChkZWJ1Z2ZzX3R4X2FkaWUsIDgwMDAsIDI1Nik7Ci0JCWFkaWVfY29kZWNfcHJvY2VlZF9zdGFnZShkZWJ1Z2ZzX3R4X2FkaWUsCi0JCUFESUVfQ09ERUNfRElHSVRBTF9SRUFEWSk7Ci0JCWFkaWVfY29kZWNfcHJvY2VlZF9zdGFnZShkZWJ1Z2ZzX3R4X2FkaWUsCi0JCUFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFkpOwotCQkvKiBTdGFydCBBRkUgZm9yIFRYICovCi0JCWFmZV9jb25maWcuc2FtcGxlX3JhdGUgPSAweDg7Ci0JCWFmZV9jb25maWcuY2hhbm5lbF9tb2RlID0gMTsKLQkJYWZlX2NvbmZpZy52b2x1bWUgPSBBRkVfVk9MVU1FX1VOSVRZOwotCQl0cmMgPSBhZmVfZW5hYmxlKEFGRV9IV19QQVRIX0NPREVDX1RYLCAmYWZlX2NvbmZpZyk7Ci0JCWlmIChJU19FUlJfVkFMVUUodHJjKSkKLQkJCU1NX0VSUigiZmFpbGVkIHRvIGVuYWJsZSBBRkUgVFhcbiIpOwotCQkvKiBTZXQgdGhlIHZvbHVtZSBsZXZlbCB0byBub24gdW5pdHksIHRvIGF2b2lkCi0JCSAgIGxvb3BiYWNrIGVmZmVjdCAqLwotCQlhZmVfZGV2aWNlX3ZvbHVtZV9jdHJsKEFGRV9IV19QQVRIX0NPREVDX1JYLCAweDA1MDApOwotCi0JCS8qIGVuYWJsZSBhZmUgbG9vcGJhY2sgKi8KLQkJYWZlX2xvb3BiYWNrKDEpOwotCQlNTV9JTkZPKCJBRkUgbG9vcGJhY2sgZW5hYmxlZFxuIik7Ci0JfSBlbHNlIHsKLQkJLyogZGlzYWJsZSBhZmUgbG9vcGJhY2sgKi8KLQkJYWZlX2xvb3BiYWNrKDApOwotCQkvKiBSZW1vdmUgdGhlIHZvdGUgZm9yIFNNUFMgbW9kZSovCi0JCXBtYXBwX3NtcHNfbW9kZV92b3RlKFNNUFNfQVVESU9fUExBWUJBQ0tfSUQsCi0JCQlQTUFQUF9WUkVHX1M0LCBQTUFQUF9TTVBTX01PREVfVk9URV9ET05UQ0FSRSk7Ci0KLQkJLyogRGlzYWJsZSBBRElFICovCi0JCWFkaWVfY29kZWNfcHJvY2VlZF9zdGFnZShkZWJ1Z2ZzX3J4X2FkaWUsCi0JCUFESUVfQ09ERUNfRElHSVRBTF9PRkYpOwotCQlhZGllX2NvZGVjX2Nsb3NlKGRlYnVnZnNfcnhfYWRpZSk7Ci0JCS8qIERpc2FibGUgQUZFIGZvciBSWCAqLwotCQlhZmVfZGlzYWJsZShBRkVfSFdfUEFUSF9DT0RFQ19SWCk7Ci0KLQkJLyogRGlzYWJsZSBMUEEgU3ViIHN5c3RlbSAqLwotCQlscGFfY21kX2VuYWJsZV9jb2RlYyhkcnYtPmxwYSwgMCk7Ci0JCWxwYV9wdXQoZHJ2LT5scGEpOwotCi0JCS8qIERpc2FibGUgTFBBIGNsb2NrcyAqLwotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZHJ2LT5scGFfcF9jbGspOwotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZHJ2LT5scGFfY29kZWNfY2xrKTsKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+bHBhX2NvcmVfY2xrKTsKLQotCQkvKiBEaXNhYmxlIE1JMlMgUlggbWFzdGVyIGJsb2NrICovCi0JCS8qIERpc2FibGUgTUkyUyBSWCBiaXQgY2xvY2sgKi8KLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+cnhfc2Nsayk7Ci0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnYtPnJ4X21jbGspOwotCi0JCXBtYXBwX3NtcHNfbW9kZV92b3RlKFNNUFNfQVVESU9fUkVDT1JEX0lELAotCQkJUE1BUFBfVlJFR19TNCwgUE1BUFBfU01QU19NT0RFX1ZPVEVfRE9OVENBUkUpOwotCi0JCS8qIERpc2FibGUgQUZFIGZvciBUWCAqLwotCQlhZmVfZGlzYWJsZShBRkVfSFdfUEFUSF9DT0RFQ19UWCk7Ci0KLQkJLyogRGlzYWJsZSBBRElFICovCi0JCWFkaWVfY29kZWNfcHJvY2VlZF9zdGFnZShkZWJ1Z2ZzX3R4X2FkaWUsCi0JCUFESUVfQ09ERUNfRElHSVRBTF9PRkYpOwotCQlhZGllX2NvZGVjX2Nsb3NlKGRlYnVnZnNfdHhfYWRpZSk7Ci0JCS8qIERpc2FibGUgTUkyUyBUWCBtYXN0ZXIgYmxvY2sgKi8KLQkJLyogRGlzYWJsZSBNSTJTIFRYIGJpdCBjbG9jayAqLwotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZHJ2LT50eF9zY2xrKTsKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+dHhfbWNsayk7Ci0JCXBtaWNfaHNlZF9lbmFibGUoUE1fSFNFRF9DT05UUk9MTEVSXzAsIFBNX0hTRURfRU5BQkxFX09GRik7Ci0JCU1NX0lORk8oIkFGRSBsb29wYmFjayBkaXNhYmxlZFxuIik7Ci0JfQotfQotCi1zdGF0aWMgc3NpemVfdCBzbmRkZXZfaWNvZGVjX2RlYnVnX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLAotCWNvbnN0IGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY2hhciAqbGJfc3RyID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgY21kOwotCi0JaWYgKGdldF91c2VyKGNtZCwgdWJ1ZikpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JTU1fSU5GTygiJXMgJWNcbiIsIGxiX3N0ciwgY21kKTsKLQotCWlmICghc3RyY21wKGxiX3N0ciwgImFkaWVfbG9vcGJhY2siKSkgewotCQlzd2l0Y2ggKGNtZCkgewotCQljYXNlICcxJzoKLQkJCWRlYnVnZnNfYWRpZV9sb29wYmFjaygxKTsKLQkJCWJyZWFrOwotCQljYXNlICcwJzoKLQkJCWRlYnVnZnNfYWRpZV9sb29wYmFjaygwKTsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIGlmICghc3RyY21wKGxiX3N0ciwgImFmZV9sb29wYmFjayIpKSB7Ci0JCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgJzEnOgotCQkJZGVidWdmc19hZmVfbG9vcGJhY2soMSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnMCc6Ci0JCQlkZWJ1Z2ZzX2FmZV9sb29wYmFjaygwKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIGNudDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc25kZGV2X2ljb2RlY19kZWJ1Z19mb3BzID0gewotCS5vcGVuID0gc25kZGV2X2ljb2RlY19kZWJ1Z19vcGVuLAotCS53cml0ZSA9IHNuZGRldl9pY29kZWNfZGVidWdfd3JpdGUKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBfX2luaXQgc25kZGV2X2ljb2RlY19pbml0KHZvaWQpCi17Ci0JczMyIHJjOwotCXN0cnVjdCBzbmRkZXZfaWNvZGVjX2Rydl9zdGF0ZSAqaWNvZGVjX2RydiA9ICZzbmRkZXZfaWNvZGVjX2RydjsKLQotCXJjID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzbmRkZXZfaWNvZGVjX2RyaXZlcik7Ci0JaWYgKElTX0VSUl9WQUxVRShyYykpCi0JCWdvdG8gZXJyb3JfcGxhdGZvcm1fZHJpdmVyOwotCWljb2RlY19kcnYtPnJ4X21jbGsgPSBjbGtfZ2V0KE5VTEwsICJtaTJzX2NvZGVjX3J4X21fY2xrIik7Ci0JaWYgKElTX0VSUihpY29kZWNfZHJ2LT5yeF9tY2xrKSkKLQkJZ290byBlcnJvcl9yeF9tY2xrOwotCWljb2RlY19kcnYtPnJ4X3NjbGsgPSBjbGtfZ2V0KE5VTEwsICJtaTJzX2NvZGVjX3J4X3NfY2xrIik7Ci0JaWYgKElTX0VSUihpY29kZWNfZHJ2LT5yeF9zY2xrKSkKLQkJZ290byBlcnJvcl9yeF9zY2xrOwotCWljb2RlY19kcnYtPnR4X21jbGsgPSBjbGtfZ2V0KE5VTEwsICJtaTJzX2NvZGVjX3R4X21fY2xrIik7Ci0JaWYgKElTX0VSUihpY29kZWNfZHJ2LT50eF9tY2xrKSkKLQkJZ290byBlcnJvcl90eF9tY2xrOwotCWljb2RlY19kcnYtPnR4X3NjbGsgPSBjbGtfZ2V0KE5VTEwsICJtaTJzX2NvZGVjX3R4X3NfY2xrIik7Ci0JaWYgKElTX0VSUihpY29kZWNfZHJ2LT50eF9zY2xrKSkKLQkJZ290byBlcnJvcl90eF9zY2xrOwotCWljb2RlY19kcnYtPmxwYV9jb2RlY19jbGsgPSBjbGtfZ2V0KE5VTEwsICJscGFfY29kZWNfY2xrIik7Ci0JaWYgKElTX0VSUihpY29kZWNfZHJ2LT5scGFfY29kZWNfY2xrKSkKLQkJZ290byBlcnJvcl9scGFfY29kZWNfY2xrOwotCWljb2RlY19kcnYtPmxwYV9jb3JlX2NsayA9IGNsa19nZXQoTlVMTCwgImxwYV9jb3JlX2NsayIpOwotCWlmIChJU19FUlIoaWNvZGVjX2Rydi0+bHBhX2NvcmVfY2xrKSkKLQkJZ290byBlcnJvcl9scGFfY29yZV9jbGs7Ci0JaWNvZGVjX2Rydi0+bHBhX3BfY2xrID0gY2xrX2dldChOVUxMLCAibHBhX3BjbGsiKTsKLQlpZiAoSVNfRVJSKGljb2RlY19kcnYtPmxwYV9wX2NsaykpCi0JCWdvdG8gZXJyb3JfbHBhX3BfY2xrOwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JZGVidWdmc19zZGV2X2RlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInNuZGRldl9pY29kZWMiLCAwKTsKLQlpZiAoZGVidWdmc19zZGV2X2RlbnQpIHsKLQkJZGVidWdmc19hZmVsYiA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImFmZV9sb29wYmFjayIsCi0JCVNfSUZSRUcgfCBTX0lXVUdPLCBkZWJ1Z2ZzX3NkZXZfZGVudCwKLQkJKHZvaWQgKikgImFmZV9sb29wYmFjayIsICZzbmRkZXZfaWNvZGVjX2RlYnVnX2ZvcHMpOwotCQlkZWJ1Z2ZzX2FkaWVsYiA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImFkaWVfbG9vcGJhY2siLAotCQlTX0lGUkVHIHwgU19JV1VHTywgZGVidWdmc19zZGV2X2RlbnQsCi0JCSh2b2lkICopICJhZGllX2xvb3BiYWNrIiwgJnNuZGRldl9pY29kZWNfZGVidWdfZm9wcyk7Ci0JfQotI2VuZGlmCi0JbXV0ZXhfaW5pdCgmaWNvZGVjX2Rydi0+cnhfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmaWNvZGVjX2Rydi0+bGJfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmaWNvZGVjX2Rydi0+dHhfbG9jayk7Ci0JaWNvZGVjX2Rydi0+cnhfYWN0aXZlID0gMDsKLQlpY29kZWNfZHJ2LT50eF9hY3RpdmUgPSAwOwotCWljb2RlY19kcnYtPmxwYSA9IE5VTEw7Ci0JcG1fcW9zX2FkZF9yZXF1ZXN0KCZpY29kZWNfZHJ2LT50eF9wbV9xb3NfcmVxLCBQTV9RT1NfQ1BVX0RNQV9MQVRFTkNZLAotCQkJCVBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQlwbV9xb3NfYWRkX3JlcXVlc3QoJmljb2RlY19kcnYtPnJ4X3BtX3Fvc19yZXEsIFBNX1FPU19DUFVfRE1BX0xBVEVOQ1ksCi0JCQkJUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotCXJldHVybiAwOwotCi1lcnJvcl9scGFfcF9jbGs6Ci0JY2xrX3B1dChpY29kZWNfZHJ2LT5scGFfY29yZV9jbGspOwotZXJyb3JfbHBhX2NvcmVfY2xrOgotCWNsa19wdXQoaWNvZGVjX2Rydi0+bHBhX2NvZGVjX2Nsayk7Ci1lcnJvcl9scGFfY29kZWNfY2xrOgotCWNsa19wdXQoaWNvZGVjX2Rydi0+dHhfc2Nsayk7Ci1lcnJvcl90eF9zY2xrOgotCWNsa19wdXQoaWNvZGVjX2Rydi0+dHhfbWNsayk7Ci1lcnJvcl90eF9tY2xrOgotCWNsa19wdXQoaWNvZGVjX2Rydi0+cnhfc2Nsayk7Ci1lcnJvcl9yeF9zY2xrOgotCWNsa19wdXQoaWNvZGVjX2Rydi0+cnhfbWNsayk7Ci1lcnJvcl9yeF9tY2xrOgotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRkZXZfaWNvZGVjX2RyaXZlcik7Ci1lcnJvcl9wbGF0Zm9ybV9kcml2ZXI6Ci0KLQlNTV9FUlIoImVuY291bnRlciBlcnJvclxuIik7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzbmRkZXZfaWNvZGVjX2V4aXQodm9pZCkKLXsKLQlzdHJ1Y3Qgc25kZGV2X2ljb2RlY19kcnZfc3RhdGUgKmljb2RlY19kcnYgPSAmc25kZGV2X2ljb2RlY19kcnY7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlpZiAoZGVidWdmc19hZmVsYikKLQkJZGVidWdmc19yZW1vdmUoZGVidWdmc19hZmVsYik7Ci0JaWYgKGRlYnVnZnNfYWRpZWxiKQotCQlkZWJ1Z2ZzX3JlbW92ZShkZWJ1Z2ZzX2FkaWVsYik7Ci0JaWYgKGRlYnVnZnNfc2Rldl9kZW50KQotCQlkZWJ1Z2ZzX3JlbW92ZShkZWJ1Z2ZzX3NkZXZfZGVudCk7Ci0jZW5kaWYKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc25kZGV2X2ljb2RlY19kcml2ZXIpOwotCi0JY2xrX3B1dChpY29kZWNfZHJ2LT5yeF9zY2xrKTsKLQljbGtfcHV0KGljb2RlY19kcnYtPnJ4X21jbGspOwotCWNsa19wdXQoaWNvZGVjX2Rydi0+dHhfc2Nsayk7Ci0JY2xrX3B1dChpY29kZWNfZHJ2LT50eF9tY2xrKTsKLQlyZXR1cm47Ci19Ci0KLW1vZHVsZV9pbml0KHNuZGRldl9pY29kZWNfaW5pdCk7Ci1tb2R1bGVfZXhpdChzbmRkZXZfaWNvZGVjX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIklDb2RlYyBTb3VuZCBEZXZpY2UgZHJpdmVyIik7Ci1NT0RVTEVfVkVSU0lPTigiMS4wIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL3NuZGRldl9taTJzLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL3NuZGRldl9taTJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNGVlMjYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi9zbmRkZXZfbWkycy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hdWRpb19kZXZfY3RsLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL2F1ZGlvX2ludGVyY3QuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvbWkycy5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9hZmUuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3NuZGRldl9taTJzLmg+Ci0KLS8qIEdsb2JhbCBzdGF0ZSBmb3IgdGhlIGRyaXZlciAqLwotc3RydWN0IHNuZGRldl9taTJzX2Rydl9zdGF0ZSB7Ci0Jc3RydWN0IGNsayAqbWNsazsKLQlzdHJ1Y3QgY2xrICpzY2xrOwotCXN0cnVjdCBtdXRleCBsb2NrOwotCXU4IHNkX2xpbmVzX3VzZWQ7Ci0JdTggY2xvY2tzX2VuYWJsZWQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IHNuZGRldl9taTJzX2Rydl9zdGF0ZSBzbmRkZXZfbWkyc19kcnY7Ci0KLXN0YXRpYyBpbnQgc25kZGV2X21pMnNfb3Blbl90eChzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICpkZXZfaW5mbykKLXsKLQl1OCBjaGFubmVsczsKLQlzdHJ1Y3QgbXNtX2FmZV9jb25maWcgYWZlX2NvbmZpZzsKLQlpbnQgcmM7Ci0Jc3RydWN0IHNuZGRldl9taTJzX2RhdGEgKnNuZGRldl9taTJzX2RhdGEgPSBkZXZfaW5mby0+cHJpdmF0ZV9kYXRhOwotCi0JTU1fREJHKCIlczogY2hhbm5lbF9tb2RlID0gJXUgc2RfbGluZV9tYXNrID0gMHgleCAiCi0JCSJkZWZhdWx0X3NhbXBsZV9yYXRlID0gJXVcbiIsIF9fZnVuY19fLAotCQlzbmRkZXZfbWkyc19kYXRhLT5jaGFubmVsX21vZGUsIHNuZGRldl9taTJzX2RhdGEtPnNkX2xpbmVzLAotCQlzbmRkZXZfbWkyc19kYXRhLT5kZWZhdWx0X3NhbXBsZV9yYXRlKTsKLQotCWlmIChzbmRkZXZfbWkyc19kYXRhLT5jaGFubmVsX21vZGUgPT0gMikgewotCQljaGFubmVscyA9IE1JMlNfQ0hBTl9TVEVSRU87Ci0JfSBlbHNlIHsKLQkJTU1fRVJSKCIlczogSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHMgPSAldVxuIiwgX19mdW5jX18sCi0JCQlzbmRkZXZfbWkyc19kYXRhLT5jaGFubmVsX21vZGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBTZXQgTUkyUyAqLwotCW1pMnNfc2V0X2hkbWlfaW5wdXRfcGF0aChjaGFubmVscywgV1RfMTZfQklULAotCQkJCSBzbmRkZXZfbWkyc19kYXRhLT5zZF9saW5lcyk7Ci0KLQlhZmVfY29uZmlnLnNhbXBsZV9yYXRlID0gc25kZGV2X21pMnNfZGF0YS0+ZGVmYXVsdF9zYW1wbGVfcmF0ZSAvIDEwMDA7Ci0JYWZlX2NvbmZpZy5jaGFubmVsX21vZGUgPSBzbmRkZXZfbWkyc19kYXRhLT5jaGFubmVsX21vZGU7Ci0JYWZlX2NvbmZpZy52b2x1bWUgPSBBRkVfVk9MVU1FX1VOSVRZOwotCXJjID0gYWZlX2VuYWJsZShBRkVfSFdfUEFUSF9NSTJTX1RYLCAmYWZlX2NvbmZpZyk7Ci0KLQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgewotCQlNTV9FUlIoIiVzOiBhZmVfZW5hYmxlIGZhaWxlZCBmb3IgQUZFX0hXX1BBVEhfTUkyU19UWCAiCi0JCSAgICAgICAicmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLyogRW5hYmxlIGF1ZGlvIHBhdGggKi8KLQlpZiAoc25kZGV2X21pMnNfZGF0YS0+cm91dGUpCi0JCXNuZGRldl9taTJzX2RhdGEtPnJvdXRlKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbmRkZXZfbWkyc19vcGVuX3J4KHN0cnVjdCBtc21fc25kZGV2X2luZm8gKmRldl9pbmZvKQotewotCWludCByYzsKLQlzdHJ1Y3QgbXNtX2FmZV9jb25maWcgYWZlX2NvbmZpZzsKLQl1OCBjaGFubmVsczsKLQlzdHJ1Y3Qgc25kZGV2X21pMnNfZGF0YSAqc25kZGV2X21pMnNfZGF0YSA9IGRldl9pbmZvLT5wcml2YXRlX2RhdGE7Ci0KLQlNTV9EQkcoIiVzOiBjaGFubmVsX21vZGUgPSAldSBzZF9saW5lX21hc2sgPSAweCV4ICIKLQkJImRlZmF1bHRfc2FtcGxlX3JhdGUgPSAldVxuIiwgX19mdW5jX18sCi0JCXNuZGRldl9taTJzX2RhdGEtPmNoYW5uZWxfbW9kZSwgc25kZGV2X21pMnNfZGF0YS0+c2RfbGluZXMsCi0JCXNuZGRldl9taTJzX2RhdGEtPmRlZmF1bHRfc2FtcGxlX3JhdGUpOwotCi0JaWYgKHNuZGRldl9taTJzX2RhdGEtPmNoYW5uZWxfbW9kZSA9PSAyKQotCQljaGFubmVscyA9IE1JMlNfQ0hBTl9TVEVSRU87Ci0JZWxzZSBpZiAoc25kZGV2X21pMnNfZGF0YS0+Y2hhbm5lbF9tb2RlID09IDQpCi0JCWNoYW5uZWxzID0gTUkyU19DSEFOXzRDSEFOTkVMUzsKLQllbHNlIGlmIChzbmRkZXZfbWkyc19kYXRhLT5jaGFubmVsX21vZGUgPT0gNikKLQkJY2hhbm5lbHMgPSBNSTJTX0NIQU5fNkNIQU5ORUxTOwotCWVsc2UgaWYgKHNuZGRldl9taTJzX2RhdGEtPmNoYW5uZWxfbW9kZSA9PSA4KQotCQljaGFubmVscyA9IE1JMlNfQ0hBTl84Q0hBTk5FTFM7Ci0JZWxzZQotCQljaGFubmVscyA9IE1JMlNfQ0hBTl9NT05PX1JBVzsKLQotCS8qIFNldCBNSTJTICovCi0JbWkyc19zZXRfaGRtaV9vdXRwdXRfcGF0aChjaGFubmVscywgV1RfMTZfQklULAotCQkJCSAgc25kZGV2X21pMnNfZGF0YS0+c2RfbGluZXMpOwotCi0JLyogU3RhcnQgQUZFICovCi0JYWZlX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IHNuZGRldl9taTJzX2RhdGEtPmRlZmF1bHRfc2FtcGxlX3JhdGUgLyAxMDAwOwotCWFmZV9jb25maWcuY2hhbm5lbF9tb2RlID0gc25kZGV2X21pMnNfZGF0YS0+Y2hhbm5lbF9tb2RlOwotCWFmZV9jb25maWcudm9sdW1lID0gQUZFX1ZPTFVNRV9VTklUWTsKLQlyYyA9IGFmZV9lbmFibGUoQUZFX0hXX1BBVEhfTUkyU19SWCwgJmFmZV9jb25maWcpOwotCi0JaWYgKElTX0VSUl9WQUxVRShyYykpIHsKLQkJTU1fRVJSKCIlczogZW5jb3VudGVyIGVycm9yXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qIEVuYWJsZSBhdWRpbyBwYXRoICovCi0JaWYgKHNuZGRldl9taTJzX2RhdGEtPnJvdXRlKQotCQlzbmRkZXZfbWkyc19kYXRhLT5yb3V0ZSgpOwotCi0JTU1fREJHKCIlczogZW5hYmxlZCAlcyBcbiIsIF9fZnVuY19fLCBzbmRkZXZfbWkyc19kYXRhLT5uYW1lKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNuZGRldl9taTJzX29wZW4oc3RydWN0IG1zbV9zbmRkZXZfaW5mbyAqZGV2X2luZm8pCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3Qgc25kZGV2X21pMnNfZHJ2X3N0YXRlICpkcnYgPSAmc25kZGV2X21pMnNfZHJ2OwotCXUzMiBkaXI7Ci0Jc3RydWN0IHNuZGRldl9taTJzX2RhdGEgKnNuZGRldl9taTJzX2RhdGEgPSBkZXZfaW5mby0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKCFkZXZfaW5mbykgewotCQlNTV9FUlIoIiVzOiAgbXNtX3NuZGRldl9pbmZvIGlzIG51bGwgXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW11dGV4X2xvY2soJmRydi0+bG9jayk7Ci0KLQlpZiAoZHJ2LT5zZF9saW5lc191c2VkICYgc25kZGV2X21pMnNfZGF0YS0+c2RfbGluZXMpIHsKLQkJTU1fRVJSKCIlczogY29uZmxpY3QgaW4gU0QgZGF0YSBsaW5lLiBjYW4gbm90IHVzZSB0aGUgZGV2aWNlXG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCQltdXRleF91bmxvY2soJmRydi0+bG9jayk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JaWYgKCFkcnYtPmNsb2Nrc19lbmFibGVkKSB7Ci0KLQkJcmMgPSBtaTJzX2NvbmZpZ19jbGtfZ3BpbygpOwotCQlpZiAocmMpIHsKLQkJCU1NX0VSUigiJXM6IG1pMnMgR1BJTyBjb25maWcgZmFpbGVkIGZvciAlc1xuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgc25kZGV2X21pMnNfZGF0YS0+bmFtZSk7Ci0JCQltdXRleF91bmxvY2soJmRydi0+bG9jayk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCQljbGtfcHJlcGFyZV9lbmFibGUoZHJ2LT5tY2xrKTsKLQkJY2xrX3ByZXBhcmVfZW5hYmxlKGRydi0+c2Nsayk7Ci0JCWRydi0+Y2xvY2tzX2VuYWJsZWQgPSAxOwotCQlNTV9EQkcoIiVzOiBjbGtzIGVuYWJsZWRcbiIsIF9fZnVuY19fKTsKLQl9IGVsc2UKLQkJTU1fREJHKCIlczogY2xrcyBhbHJlYWR5IGVuYWJsZWRcbiIsIF9fZnVuY19fKTsKLQotCWlmIChzbmRkZXZfbWkyc19kYXRhLT5jYXBhYmlsaXR5ICYgU05EREVWX0NBUF9SWCkgewotCi0JCWRpciA9IERJUl9SWDsKLQkJcmMgPSBtaTJzX2NvbmZpZ19kYXRhX2dwaW8oZGlyLCBzbmRkZXZfbWkyc19kYXRhLT5zZF9saW5lcyk7Ci0KLQkJaWYgKHJjKSB7Ci0JCQlyYyA9IC1FSU87Ci0JCQlNTV9FUlIoIiVzOiBtaTJzIEdQSU8gY29uZmlnIGZhaWxlZCBmb3IgJXNcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHNuZGRldl9taTJzX2RhdGEtPm5hbWUpOwotCQkJZ290byBtaTJzX2RhdGFfZ3Bpb19mYWlsdXJlOwotCQl9Ci0KLQkJTU1fREJHKCIlczogZG9uZSBncGlvIGNvbmZpZyByeCBTRCBsaW5lc1xuIiwgX19mdW5jX18pOwotCi0JCXJjID0gc25kZGV2X21pMnNfb3Blbl9yeChkZXZfaW5mbyk7Ci0KLQkJaWYgKElTX0VSUl9WQUxVRShyYykpIHsKLQkJCU1NX0VSUigiIHNuZGRldl9taTJzX29wZW5fcnggZmFpbGVkIFxuIik7Ci0JCQlnb3RvIG1pMnNfY2xlYW51cF9vcGVuOwotCQl9Ci0KLQkJZHJ2LT5zZF9saW5lc191c2VkIHw9IHNuZGRldl9taTJzX2RhdGEtPnNkX2xpbmVzOwotCi0JCU1NX0RCRygiJXM6IHNkX2xpbmVzX3VzZWQgPSAweCV4XG4iLCBfX2Z1bmNfXywKLQkJCWRydi0+c2RfbGluZXNfdXNlZCk7Ci0JCW11dGV4X3VubG9jaygmZHJ2LT5sb2NrKTsKLQotCX0gZWxzZSB7Ci0JCWRpciA9IERJUl9UWDsKLQkJcmMgPSBtaTJzX2NvbmZpZ19kYXRhX2dwaW8oZGlyLCBzbmRkZXZfbWkyc19kYXRhLT5zZF9saW5lcyk7Ci0KLQkJaWYgKHJjKSB7Ci0JCQlyYyA9IC1FSU87Ci0JCQlNTV9FUlIoIiVzOiBtaTJzIEdQSU8gY29uZmlnIGZhaWxlZCBmb3IgJXNcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHNuZGRldl9taTJzX2RhdGEtPm5hbWUpOwotCQkJZ290byBtaTJzX2RhdGFfZ3Bpb19mYWlsdXJlOwotCQl9Ci0JCU1NX0RCRygiJXM6IGRvbmUgZGF0YSBsaW5lIGdwaW8gY29uZmlnIGZvciAlc1xuIiwKLQkJCV9fZnVuY19fLCBzbmRkZXZfbWkyc19kYXRhLT5uYW1lKTsKLQotCQlyYyA9IHNuZGRldl9taTJzX29wZW5fdHgoZGV2X2luZm8pOwotCi0JCWlmIChJU19FUlJfVkFMVUUocmMpKSB7Ci0JCQlNTV9FUlIoIiBzbmRkZXZfbWkyc19vcGVuX3R4IGZhaWxlZCBcbiIpOwotCQkJZ290byBtaTJzX2NsZWFudXBfb3BlbjsKLQkJfQotCi0JCWRydi0+c2RfbGluZXNfdXNlZCB8PSBzbmRkZXZfbWkyc19kYXRhLT5zZF9saW5lczsKLQkJTU1fREJHKCIlczogc2RfbGluZXNfdXNlZCA9IDB4JXhcbiIsIF9fZnVuY19fLAotCQkJZHJ2LT5zZF9saW5lc191c2VkKTsKLQkJbXV0ZXhfdW5sb2NrKCZkcnYtPmxvY2spOwotCX0KLQotCXJldHVybiAwOwotCi1taTJzX2NsZWFudXBfb3BlbjoKLQltaTJzX3VuY29uZmlnX2RhdGFfZ3BpbyhkaXIsIHNuZGRldl9taTJzX2RhdGEtPnNkX2xpbmVzKTsKLQotCS8qIERpc2FibGUgYXVkaW8gcGF0aCAqLwotCWlmIChzbmRkZXZfbWkyc19kYXRhLT5kZXJvdXRlKQotCQlzbmRkZXZfbWkyc19kYXRhLT5kZXJvdXRlKCk7Ci0KLW1pMnNfZGF0YV9ncGlvX2ZhaWx1cmU6Ci0JaWYgKCFkcnYtPnNkX2xpbmVzX3VzZWQpIHsKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+c2Nsayk7Ci0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnYtPm1jbGspOwotCQlkcnYtPmNsb2Nrc19lbmFibGVkID0gMDsKLQkJbWkyc191bmNvbmZpZ19jbGtfZ3BpbygpOwotCX0KLQltdXRleF91bmxvY2soJmRydi0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHNuZGRldl9taTJzX2Nsb3NlKHN0cnVjdCBtc21fc25kZGV2X2luZm8gKmRldl9pbmZvKQotewotCXN0cnVjdCBzbmRkZXZfbWkyc19kcnZfc3RhdGUgKmRydiA9ICZzbmRkZXZfbWkyc19kcnY7Ci0JaW50IGRpcjsKLQlzdHJ1Y3Qgc25kZGV2X21pMnNfZGF0YSAqc25kZGV2X21pMnNfZGF0YSA9IGRldl9pbmZvLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoIWRldl9pbmZvKSB7Ci0JCU1NX0VSUigiJXM6ICBtc21fc25kZGV2X2luZm8gaXMgbnVsbCBcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFkZXZfaW5mby0+b3BlbmVkKSB7Ci0JCU1NX0VSUigiICVzOiBjYWxsaW5nIGNsb3NlIGRldmljZSB3aXRoIG91dCBvcGVuaW5nIHRoZSIKLQkJICAgICAgICIgZGV2aWNlIFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQltdXRleF9sb2NrKCZkcnYtPmxvY2spOwotCi0JZHJ2LT5zZF9saW5lc191c2VkICY9IH5zbmRkZXZfbWkyc19kYXRhLT5zZF9saW5lczsKLQotCU1NX0RCRygiJXM6IHNkX2xpbmVzIGluIHVzZSA9IDB4JXhcbiIsIF9fZnVuY19fLCBkcnYtPnNkX2xpbmVzX3VzZWQpOwotCi0JaWYgKHNuZGRldl9taTJzX2RhdGEtPmNhcGFiaWxpdHkgJiBTTkRERVZfQ0FQX1JYKSB7Ci0JCWRpciA9IERJUl9SWDsKLQkJYWZlX2Rpc2FibGUoQUZFX0hXX1BBVEhfTUkyU19SWCk7Ci0JfSBlbHNlIHsKLQkJZGlyID0gRElSX1RYOwotCQlhZmVfZGlzYWJsZShBRkVfSFdfUEFUSF9NSTJTX1RYKTsKLQl9Ci0KLQltaTJzX3VuY29uZmlnX2RhdGFfZ3BpbyhkaXIsIHNuZGRldl9taTJzX2RhdGEtPnNkX2xpbmVzKTsKLQotCWlmICghZHJ2LT5zZF9saW5lc191c2VkKSB7Ci0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnYtPnNjbGspOwotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZHJ2LT5tY2xrKTsKLQkJZHJ2LT5jbG9ja3NfZW5hYmxlZCA9IDA7Ci0JCW1pMnNfdW5jb25maWdfY2xrX2dwaW8oKTsKLQl9Ci0KLQkvKiBEaXNhYmxlIGF1ZGlvIHBhdGggKi8KLQlpZiAoc25kZGV2X21pMnNfZGF0YS0+ZGVyb3V0ZSkKLQkJc25kZGV2X21pMnNfZGF0YS0+ZGVyb3V0ZSgpOwotCi0JbXV0ZXhfdW5sb2NrKCZkcnYtPmxvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kZGV2X21pMnNfc2V0X2ZyZXEoc3RydWN0IG1zbV9zbmRkZXZfaW5mbyAqZGV2X2luZm8sIHUzMiByZXFfZnJlcSkKLXsKLQlpZiAocmVxX2ZyZXEgIT0gNDgwMDApIHsKLQkJTU1fREJHKCIlczogVW5zdXBwb3J0ZWQgRnJlcXVlbmN5OiVkXG4iLCBfX2Z1bmNfXywgcmVxX2ZyZXEpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDQ4MDAwOwotfQotCi1zdGF0aWMgaW50IHNuZGRldl9taTJzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3Qgc25kZGV2X21pMnNfZGF0YSAqcGRhdGE7Ci0Jc3RydWN0IG1zbV9zbmRkZXZfaW5mbyAqZGV2X2luZm87Ci0KLQlpZiAoIXBkZXYgfHwgIXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUICJJbnZhbGlkIGNhbGxlciBcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmICgocGRhdGEtPmNhcGFiaWxpdHkgJiBTTkRERVZfQ0FQX1JYKSAmJgotCSAgICAocGRhdGEtPmNhcGFiaWxpdHkgJiBTTkRERVZfQ0FQX1RYKSkgewotCQlNTV9FUlIoIiVzOiBpbnZhbGlkIGRldmljZSBkYXRhIGVpdGhlciBSWCBvciBUWFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlkZXZfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fc25kZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldl9pbmZvKSB7Ci0JCU1NX0VSUigiJXM6IHVuZWFibGUgdG8gYWxsb2NhdGUgbWVtZW9yeSBmb3IgbXNtX3NuZGRldl9pbmZvIFxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlkZXZfaW5mby0+bmFtZSA9IHBkYXRhLT5uYW1lOwotCWRldl9pbmZvLT5jb3BwX2lkID0gcGRhdGEtPmNvcHBfaWQ7Ci0JZGV2X2luZm8tPmFjZGJfaWQgPSBwZGF0YS0+YWNkYl9pZDsKLQlkZXZfaW5mby0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKilwZGF0YTsKLQlkZXZfaW5mby0+ZGV2X29wcy5vcGVuID0gc25kZGV2X21pMnNfb3BlbjsKLQlkZXZfaW5mby0+ZGV2X29wcy5jbG9zZSA9IHNuZGRldl9taTJzX2Nsb3NlOwotCWRldl9pbmZvLT5kZXZfb3BzLnNldF9mcmVxID0gc25kZGV2X21pMnNfc2V0X2ZyZXE7Ci0JZGV2X2luZm8tPmNhcGFiaWxpdHkgPSBwZGF0YS0+Y2FwYWJpbGl0eTsKLQlkZXZfaW5mby0+b3BlbmVkID0gMDsKLQltc21fc25kZGV2X3JlZ2lzdGVyKGRldl9pbmZvKTsKLQlkZXZfaW5mby0+c2FtcGxlX3JhdGUgPSBwZGF0YS0+ZGVmYXVsdF9zYW1wbGVfcmF0ZTsKLQotCU1NX0RCRygiJXM6IHByb2JlIGRvbmUgZm9yICVzXG4iLCBfX2Z1bmNfXywgcGRhdGEtPm5hbWUpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzbmRkZXZfbWkyc19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc25kZGV2X21pMnNfZHJpdmVyID0gewotCS5wcm9iZSA9IHNuZGRldl9taTJzX3Byb2JlLAotCS5yZW1vdmUgPSBzbmRkZXZfbWkyc19yZW1vdmUsCi0JLmRyaXZlciA9IHsubmFtZSA9ICJzbmRkZXZfbWkycyJ9Ci19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzbmRkZXZfbWkyc19pbml0KHZvaWQpCi17Ci0JczMyIHJjOwotCXN0cnVjdCBzbmRkZXZfbWkyc19kcnZfc3RhdGUgKmRydiA9ICZzbmRkZXZfbWkyc19kcnY7Ci0KLQlyYyA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc25kZGV2X21pMnNfZHJpdmVyKTsKLQlpZiAoSVNfRVJSX1ZBTFVFKHJjKSkgewotCi0JCU1NX0VSUigiJXM6IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlciBmYWlsZWQgIFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycm9yX3BsYXRmb3JtX2RyaXZlcjsKLQl9Ci0KLQlkcnYtPm1jbGsgPSBjbGtfZ2V0KE5VTEwsICJtaTJzX21fY2xrIik7Ci0JaWYgKElTX0VSUihkcnYtPm1jbGspKSB7Ci0JCU1NX0VSUigiJXM6ICBjbGtfZ2V0IG1pMnNfbWNsayBmYWlsZWQgIFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycm9yX21jbGs7Ci0JfQotCi0JZHJ2LT5zY2xrID0gY2xrX2dldChOVUxMLCAibWkyc19zX2NsayIpOwotCWlmIChJU19FUlIoZHJ2LT5zY2xrKSkgewotCQlNTV9FUlIoIiVzOiAgY2xrX2dldCBtaTJzX3NjbGsgZmFpbGVkICBcbiIsIF9fZnVuY19fKTsKLQotCQlnb3RvIGVycm9yX3NjbGs7Ci0JfQotCi0JbXV0ZXhfaW5pdCgmZHJ2LT5sb2NrKTsKLQotCU1NX0RCRygic25kZGV2X21pMnNfaW5pdCA6IGRvbmUgXG4iKTsKLQotCXJldHVybiAwOwotCi1lcnJvcl9zY2xrOgotCWNsa19wdXQoZHJ2LT5tY2xrKTsKLWVycm9yX21jbGs6Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNuZGRldl9taTJzX2RyaXZlcik7Ci1lcnJvcl9wbGF0Zm9ybV9kcml2ZXI6Ci0KLQlNTV9FUlIoIiVzOiBlbmNvdW50ZXIgZXJyb3JcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHNuZGRldl9taTJzX2V4aXQodm9pZCkKLXsKLQlzdHJ1Y3Qgc25kZGV2X21pMnNfZHJ2X3N0YXRlICpkcnYgPSAmc25kZGV2X21pMnNfZHJ2OwotCi0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNuZGRldl9taTJzX2RyaXZlcik7Ci0KLQljbGtfcHV0KGRydi0+c2Nsayk7Ci0JY2xrX3B1dChkcnYtPm1jbGspOwotCXJldHVybjsKLX0KLQotbW9kdWxlX2luaXQoc25kZGV2X21pMnNfaW5pdCk7Ci1tb2R1bGVfZXhpdChzbmRkZXZfbWkyc19leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJtaTJzIFNvdW5kIERldmljZSBkcml2ZXIiKTsKLU1PRFVMRV9WRVJTSU9OKCIxLjAiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvc25kZGV2X3ZpcnR1YWwuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvc25kZGV2X3ZpcnR1YWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWExZDU1Ny4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL3NuZGRldl92aXJ0dWFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotI2luY2x1ZGUgPG1hY2gvcWRzcDV2Mi9zbmRkZXZfdmlydHVhbC5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLXN0YXRpYyBpbnQgc25kZGV2X3ZpcnR1YWxfb3BlbihzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICpkZXZfaW5mbykKLXsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFkZXZfaW5mbykKLQkJcmMgPSAtRUlOVkFMOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzbmRkZXZfdmlydHVhbF9jbG9zZShzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICpkZXZfaW5mbykKLXsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFkZXZfaW5mbykKLQkJcmMgPSAtRUlOVkFMOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzbmRkZXZfdmlydHVhbF9zZXRfZnJlcShzdHJ1Y3QgbXNtX3NuZGRldl9pbmZvICpkZXZfaW5mbywgdTMyIHJhdGUpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmICghZGV2X2luZm8pCi0JCXJjID0gLUVJTlZBTDsKLQlyZXR1cm4gcmF0ZTsKLX0KLQotc3RhdGljIGludCBzbmRkZXZfdmlydHVhbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHNuZGRldl92aXJ0dWFsX2RhdGEgKnBkYXRhOwotCXN0cnVjdCBtc21fc25kZGV2X2luZm8gKmRldl9pbmZvOwotCi0JaWYgKCFwZGV2IHx8ICFwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSkgewotCQlNTV9FUlIoIkludmFsaWQgY2FsbGVyXG4iKTsKLQkJcmMgPSAtRVBFUk07Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQlkZXZfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fc25kZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldl9pbmZvKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlkZXZfaW5mby0+bmFtZSA9IHBkYXRhLT5uYW1lOwotCWRldl9pbmZvLT5jb3BwX2lkID0gcGRhdGEtPmNvcHBfaWQ7Ci0JZGV2X2luZm8tPmFjZGJfaWQgPSBwZGF0YS0+YWNkYl9pZDsKLQlkZXZfaW5mby0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKikgTlVMTDsKLQlkZXZfaW5mby0+ZGV2X29wcy5vcGVuID0gc25kZGV2X3ZpcnR1YWxfb3BlbjsKLQlkZXZfaW5mby0+ZGV2X29wcy5jbG9zZSA9IHNuZGRldl92aXJ0dWFsX2Nsb3NlOwotCWRldl9pbmZvLT5kZXZfb3BzLnNldF9mcmVxID0gc25kZGV2X3ZpcnR1YWxfc2V0X2ZyZXE7Ci0JZGV2X2luZm8tPmNhcGFiaWxpdHkgPSBwZGF0YS0+Y2FwYWJpbGl0eTsKLQlkZXZfaW5mby0+c2FtcGxlX3JhdGUgPSA4MDAwOwotCWRldl9pbmZvLT5vcGVuZWQgPSAwOwotCWRldl9pbmZvLT5zZXNzaW9ucyA9IDA7Ci0KLQltc21fc25kZGV2X3JlZ2lzdGVyKGRldl9pbmZvKTsKLQotZXJyb3I6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHNuZGRldl92aXJ0dWFsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmRkZXZfdmlydHVhbF9kcml2ZXIgPSB7Ci0JLnByb2JlID0gc25kZGV2X3ZpcnR1YWxfcHJvYmUsCi0JLnJlbW92ZSA9IHNuZGRldl92aXJ0dWFsX3JlbW92ZSwKLQkuZHJpdmVyID0geyAubmFtZSA9ICJzbmRkZXZfdmlydHVhbCIgfQotfTsKLQotc3RhdGljIGludCBfX2luaXQgc25kZGV2X3ZpcnR1YWxfaW5pdCh2b2lkKQotewotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoIiBzbmRkZXZfdmlydHVhbF9pbml0IFxuIik7Ci0JcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuZGRldl92aXJ0dWFsX2RyaXZlcik7Ci0JaWYgKElTX0VSUl9WQUxVRShyYykpIHsKLQkJTU1fRVJSKCJwbGF0Zm9ybSBkcml2ZXIgcmVnaXN0ZXIgZmFpbHVyZVxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHNuZGRldl92aXJ0dWFsX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc25kZGV2X3ZpcnR1YWxfZHJpdmVyKTsKLQotCXJldHVybjsKLX0KLQotbW9kdWxlX2luaXQoc25kZGV2X3ZpcnR1YWxfaW5pdCk7Ci1tb2R1bGVfZXhpdChzbmRkZXZfdmlydHVhbF9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJWaXJ0dWFsIFNvdW5kIERldmljZSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvdGltcGFuaV9wcm9maWxlXzd4MzAuaCBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A1djIvdGltcGFuaV9wcm9maWxlXzd4MzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjZjEzMS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL3RpbXBhbmlfcHJvZmlsZV83eDMwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MjMgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX19NQUNIX1FEU1A1X1YyX1RJTVBBTklfUFJPRklMRV9IX18KLSNkZWZpbmUgX19NQUNIX1FEU1A1X1YyX01USU1QQU5JX1BST0ZJTEVfSF9fCi0KLS8qCi0gKiBUWCBEZXZpY2UgUHJvZmlsZXMKLSAqLwotCi0vKiBBbmFsb2cgTUlDICovCi0vKiBBTUlDIFByaW1hcnkgbW9ubyAqLwotI2RlZmluZSBBTUlDX1BSSV9NT05PXzgwMDBfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDUsIDB4MDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDUsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MEMsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4RjAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODYsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODcsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4RjAsIDB4RjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGRiwgMHhEMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhGRiwgMHhCQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMiwgMHhGRiwgMHhCQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxNCwgMHhGRiwgMHg2NSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4YmI4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODIsIDB4RkYsIDB4MUUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4QTMsIDB4MDEsIDB4MDEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OTMsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OTQsIDB4RkYsIDB4MUIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OTksIDB4MEYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OUYsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MDQsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGIsIDB4ZmYsIDB4RTYpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGMsIDB4MDMsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODYsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODcsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4RjAsIDB4QzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4RjAsIDB4RjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MEMsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxNCwgMHhGRiwgMHg2NCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMiwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhBQiwgMHgwOSwgMHgwOSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotLyogSGVhZHNldCBNSUMgKi8KLSNkZWZpbmUgQU1JQzFfSEVBRFNFVF9UWF9NT05PX1BSSU1BUllfT1NSMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwNSwgMHgwNSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwNSwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgwQywgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHhGMCwgMHgzMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NiwgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NywgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHhGMCwgMHhGMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MiwgMHhGRiwgMHgxRSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhBMywgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg5MywgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg5NCwgMHhGRiwgMHgxQil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg5OSwgMHgwRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg5RiwgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBELCAweEZGLCAweEM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDExLCAweEZGLCAweEJDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEyLCAweEZGLCAweEJDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDE0LCAweEZGLCAweDY1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHhiYjggfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MDQsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGIsIDB4ZmYsIDB4RTcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OGMsIDB4MDMsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODYsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODcsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4RjAsIDB4QzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4RjAsIDB4RjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MEMsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxNCwgMHhGRiwgMHg2NCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMiwgMHhGRiwgMHgwMCl9IH0KLQotLyoKLSAqIFJYIERldmljZSBQcm9maWxlcwotICovCi0KLS8qIFJYIEVBUiAqLwotI2RlZmluZSBFQVJfUFJJX01PTk9fODAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgwMywgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwRiwgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwRiwgMHgwRil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHgwRSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhBMywgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg5NywgMHhGRiwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI0LCAweEZGLCAweDRDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMxLCAweDAxLCAweDAxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDM5LCAweDAxLCAweDAxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMxLCAweDAzLCAweDAzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHhiYjh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwRiwgMHgwRSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwRiwgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMSwgMHgwMywgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOSwgMHgwMSwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0vKiBSWCBTUEVBS0VSICovCi0jZGVmaW5lIFNQRUFLRVJfUFJJX1NURVJFT180ODAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MCwgMHgwMiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgwMywgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwRiwgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhBMywgMHgwMiwgMHgwMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwRiwgMHgwQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHgwRSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDI0LCAweDZGLCAweDZDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEI3LCAweDAxLCAweDAxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMxLCAweDAxLCAweDAxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMyLCAweEY4LCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgxMzg4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzIsIDB4RjgsIDB4NDgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDEzODh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMiwgMHhGOCwgMHhGOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhFMCwgMHhGRSwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhFMSwgMHhGRSwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQSwgMHgyNCwgMHgyNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhFMCwgMHhGRSwgMHgzQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhFMSwgMHhGRSwgMHgzQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhFMCwgMHhGRSwgMHgxQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhFMSwgMHhGRSwgMHgxQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhFMCwgMHhGRSwgMHgxMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhFMSwgMHhGRSwgMHgxMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwRiwgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhFMCwgMHhGRSwgMHgxQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhFMSwgMHhGRSwgMHgxQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhFMCwgMHhGRSwgMHgzQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhFMSwgMHhGRSwgMHgzQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhFMCwgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhFMSwgMHhGQywgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMiwgMHhGOCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMSwgMHgwNSwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQSwgMHgyNCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sICAgICAgIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfTsKLQotLyoKLSAqIFJYIEhQSCBQUklNQVJZCi0gKi8KLQotLyogUlggSFBIIENMQVNTIEFCIENBUExFU1MgKi8KLQotI2RlZmluZSBIRUFEU0VUX0FCX0NQTFNfNDgwMDBfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MDMsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MEYsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4QTMsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MEYsIDB4MEMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4MEUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNCwgMHg2RiwgMHg2Qyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhCNywgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMSwgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMSwgMHhGRiwgMHg1NSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0QywgMHhGRiwgMHgyOSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4QkI4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzEsIDB4RkYsIDB4RjUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NEMsIDB4RkUsIDB4QzgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4MjcsIDB4MjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MEYsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzEsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotLyogQU1JQyBkdWFsICovCi0jZGVmaW5lIEFNSUNfRFVBTF84MDAwX09TUl8yNTYgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDA1LCAweDA1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDA1LCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDBDLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweEYwLCAweDMwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg2LCAweEZGLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg3LCAweEZGLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweEYwLCAweEYwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgyLCAweEZGLCAweDFFKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEEzLCAweDAxLCAweDAxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDkzLCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDk0LCAweEZGLCAweDFCKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDk5LCAweDBGLCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDlGLCAweDAzLCAweDAzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEQsIDB4RkYsIDB4RDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MEUsIDB4RkYsIDB4QzIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTEsIDB4RkYsIDB4QkMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTIsIDB4RkYsIDB4QkMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MTQsIDB4RkYsIDB4NjUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweGJiOCB9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgwQywgMHgwQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YiwgMHhmZiwgMHhDRSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhCNCwgMHhGRiwgMHhDRSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YywgMHhGRiwgMHg1QSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NiwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NywgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHhGMCwgMHhDMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHhGMCwgMHhGMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgwQywgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBELCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDBFLCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDE0LCAweEZGLCAweDY0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDExLCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDEyLCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0vKiBUVFkgUlggKi8KLSNkZWZpbmUgVFRZX0hFQURTRVRfTU9OT19SWF84MDAwX09TUl8yNTYgXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDAzLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDBGLCAweDAzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgxLCAweEZGLCAweDBFKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEEzLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDk3LCAweEZGLCAweDAxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg0LCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDBGLCAweDA2KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgxLCAweEZGLCAweDBFKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDAzLCAweDAxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjQsIDB4NkYsIDB4NEMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4QjcsIDB4MDEsIDB4MDEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzEsIDB4RkYsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzEsIDB4RkYsIDB4NDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NEMsIDB4RkYsIDB4MjkpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweEJCOH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMxLCAweEZGLCAweEM1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDRDLCAweEZFLCAweEM4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweDI3LCAweDIwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweDNDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweDFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweDEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDBGLCAweDAzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweDFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweDNDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZDLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNDLCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMxLCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLS8qIFRUWSBUWCAqLwotI2RlZmluZSBUVFlfSEVBRFNFVF9NT05PX1RYXzgwMDBfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDUsIDB4MDUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDUsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MEMsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4RjAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODYsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODcsIDB4RkYsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4RjAsIDB4RjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODIsIDB4RkYsIDB4MUUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4QTMsIDB4MDEsIDB4MDEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OTMsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OTQsIDB4RkYsIDB4MUIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OTksIDB4MEYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OUYsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGRiwgMHhBOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhGRiwgMHhCQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMiwgMHhGRiwgMHhCQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxNCwgMHhGRiwgMHg2NSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4QkI4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MDQsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODYsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODcsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4RjAsIDB4QzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4RjAsIDB4RjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MEMsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwRCwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxNCwgMHhGRiwgMHg2NCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMSwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgxMiwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBIRUFEU0VUX1JYX0NBUExFU1NfNDgwMDBfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MSwgMHhGRiwgMHg0ZSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgwNCwgMHhmZiwgMHhCQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNCwgMHg2RiwgMHg2NCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNSwgMHgwRiwgMHgwQil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNiwgMHhmYywgMHhmYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOCwgMHhmZiwgMHhhMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQSwgMHhGRiwgMHhhYil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHg4MCwgMHg4MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHhmMCwgMHhmMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMywgMHhmZiwgMHgyMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzQiwgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NCwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4NSwgMHhmZiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4QSwgMHgwZiwgMHgwYyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9BTkFMT0dfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4YSwgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYiwgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzYywgMHhGRiwgMHhBQyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzNCwgMHhmMCwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfQU5BTE9HX09GRn0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDgwLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX09GRn0gfQotCi0jZGVmaW5lIEhFQURTRVRfU1RFUkVPX1NQRUFLRVJfU1RFUkVPX1JYX0NBUExFU1NfNDgwMDBfT1NSXzI1NiBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MDMsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MEYsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4QTMsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MEYsIDB4MEMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4MEUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNCwgMHg2RiwgMHg2Qyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhCNywgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMSwgMHhGRiwgMHgwNCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMSwgMHhGRiwgMHg1NSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMiwgMHhGOCwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0QywgMHhGRiwgMHgyOSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4MTM4OH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMxLCAweEZGLCAweEY1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMyLCAweEY4LCAweDQ4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHgxMzg4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzIsIDB4RjgsIDB4RjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTAsIDB4RkUsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTEsIDB4RkUsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4MjQsIDB4MjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTAsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTEsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTAsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTEsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTAsIDB4RkUsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTEsIDB4RkUsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4MjcsIDB4MjQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTAsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTEsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTAsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTEsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTAsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTEsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzIsIDB4RjgsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzEsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4MjQsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LAlcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBIU19ETUlDMl9TVEVSRU9fODAwMF9PU1JfMjU2IFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4YmI4IH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDA1LCAweDA1KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDA1LCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDBDLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweEYwLCAweDMwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg2LCAweEZGLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg3LCAweEZGLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweEYwLCAweEYwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgyLCAweDFGLCAweDFFKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDBDLCAweDBDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDkyLCAweDNGLCAweDE5KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDk0LCAweDNGLCAweDI0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEEzLCAweDM5LCAweDAxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEE4LCAweDBGLCAweDBFKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEFCLCAweDNGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODYsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODcsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4RjAsIDB4QzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4RjAsIDB4RjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4QzAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg5MiwgMHhGRiwgMHgwMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg5NCwgMHhGRiwgMHgxQil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBIUEhfUFJJX0FCX0xFR19TVEVSRU8gXAotCXt7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgwLCAweDAyLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgzLCAweDAzLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDBGLCAweDAzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEEzLCAweDAyLCAweDAyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg0LCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDg1LCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDBGLCAweDBDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDgxLCAweEZGLCAweDBFKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MDMsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MjQsIDB4NkYsIDB4NkMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4QjcsIDB4MDEsIDB4MDEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzEsIDB4RkYsIDB4MDkpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzEsIDB4RkYsIDB4NTkpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9ERUxBWV9XQUlULCAweDE4NkEwfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzEsIDB4RkYsIDB4RjkpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4MjcsIDB4MjcpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MEYsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzEsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBIUEhfUFJJX0RfTEVHX1NURVJFTyBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODAsIDB4MDIsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODMsIDB4MDMsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MEYsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4QTMsIDB4MDIsIDB4MDIpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODQsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODUsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MEYsIDB4MEMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4ODEsIDB4RkYsIDB4MEUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg4MywgMHgwMywgMHgwMyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMSwgMHhGRiwgMHg2MCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyMiwgMHhGRiwgMHhFMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNCwgMHg2RiwgMHg2Qyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyNiwgMHhGRiwgMHhEMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyRCwgMHhGRiwgMHg2Ril9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyRSwgMHhGRiwgMHg1NSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHhCNywgMHgwMSwgMHgwMSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRiwgMHhGRiwgMHgwRil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MCwgMHhGRiwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MSwgMHgwOCwgMHgwOCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MiwgMHhGRiwgMHhCQil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0MywgMHhGRiwgMHhGMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NCwgMHhGNywgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NSwgMHhGRiwgMHhGRil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NiwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0NywgMHhGRiwgMHhGMil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OCwgMHhGNywgMHgzNyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0OSwgMHhGRiwgMHhGRil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHg0QSwgMHhGRiwgMHg3Nyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMSwgMHhGRiwgMHgwNSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzRSwgMHhGRiwgMHg4Qyl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHgwRiwgMHgwQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDMwMDAwMH0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDBGLCAweDBGKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUzLCAweEZFLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweDNDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUzLCAweEZFLCAweDNDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweDFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUzLCAweEZFLCAweDFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweDEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUzLCAweEZFLCAweDEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUzLCAweEZFLCAweDA0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19ESUdJVEFMX0FOQUxPR19SRUFEWX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDhBLCAweDBGLCAweDAzKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweDEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUzLCAweEZFLCAweDEwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweDFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUzLCAweEZFLCAweDFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweDNDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUzLCAweEZFLCAweDNDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUyLCAweEZFLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweEUzLCAweEZFLCAweEFDKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDNFLCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMzLCAweDBGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMxLCAweEZGLCAweDAwKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fU1RBR0VfUkVBQ0hFRCwgQURJRV9DT0RFQ19BTkFMT0dfT0ZGfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfT0ZGfSB9Ci0KLSNkZWZpbmUgTEJfQVVYUEdBX0hQSF9BQl9DUExTX1NURVJFTyBcCi0Je3tBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfUkVBRFl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgyRiwgMHhGRiwgMHg0NCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMCwgMHhGRiwgMHg5Mil9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMSwgMHhGRCwgMHgwNSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMSwgMHhGRCwgMHg1NSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMywgMHgzMCwgMHgzMCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzOCwgMHhGRiwgMHhBQSl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4QkI4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzEsIDB4RkQsIDB4RjUpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4QjcsIDB4MDEsIDB4MDEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4NEMsIDB4RkYsIDB4MjkpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4OTAsIDB4OTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4MDQpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTIsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTMsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4MzAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0MsIDB4RkYsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzEsIDB4RkQsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2RlZmluZSBMQl9BVVhQR0FfTE9fU1RFUkVPIFwKLQl7e0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9SRUFEWX0sCVwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDJGLCAweEZGLCAweDQ0KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMwLCAweEZGLCAweDkyKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMxLCAweDAxLCAweDAxKX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fRU5UUlksIEFESUVfQ09ERUNfUEFDS19FTlRSWSgweDMyLCAweEY4LCAweDA4KX0sIFwKLQl7QURJRV9DT0RFQ19BQ1RJT05fREVMQVlfV0FJVCwgMHhCQjh9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0VOVFJZLCBBRElFX0NPREVDX1BBQ0tfRU5UUlkoMHgzMiwgMHhGOCwgMHg1OCl9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX0RFTEFZX1dBSVQsIDB4QkI4fSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzIsIDB4RjgsIDB4RjgpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4RjAsIDB4RjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzgsIDB4RkYsIDB4QUEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4OTAsIDB4OTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4RjAsIDB4MzApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4QjcsIDB4MDEsIDB4MDEpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTAsIDB4RkUsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTEsIDB4RkUsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTAsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTEsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTAsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTEsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTAsIDB4RkUsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTEsIDB4RkUsIDB4MTApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0RJR0lUQUxfQU5BTE9HX1JFQURZfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4RjAsIDB4RjApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4OEEsIDB4MEYsIDB4MDMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTAsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTEsIDB4RkUsIDB4MUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTAsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTEsIDB4RkUsIDB4M0MpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTAsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4RTEsIDB4RkMsIDB4QUMpfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzMsIDB4RjAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzIsIDB4RjgsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4MzEsIDB4MDEsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9FTlRSWSwgQURJRV9DT0RFQ19QQUNLX0VOVFJZKDB4M0EsIDB4OTAsIDB4MDApfSwgXAotCXtBRElFX0NPREVDX0FDVElPTl9TVEFHRV9SRUFDSEVELCBBRElFX0NPREVDX0FOQUxPR19PRkZ9LCBcCi0Je0FESUVfQ09ERUNfQUNUSU9OX1NUQUdFX1JFQUNIRUQsIEFESUVfQ09ERUNfRElHSVRBTF9PRkZ9IH0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL3ZvaWNlLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNXYyL3ZvaWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzc5ZDQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDV2Mi92b2ljZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUyICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOS0yMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLSNpbmNsdWRlIDxtYWNoL3Fkc3A1djIvYXVkaW9fZGV2X2N0bC5oPgotI2luY2x1ZGUgPG1hY2gvZGFsLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bWFjaC9xZHNwNXYyL3ZvaWNlLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi1zdHJ1Y3Qgdm9pY2VfZGF0YSB7Ci0Jdm9pZCAqaGFuZGxlOyAvKiBEQUxSUEMgaGFuZGxlICovCi0Jdm9pZCAqY2JfaGFuZGxlOyAvKiBEQUxSUEMgY2FsbGJhY2sgaGFuZGxlICovCi0JaW50IG5ldHdvcms7IC8qIE5ldHdvcmsgaW5mb3JtYXRpb24gKi8KLQlpbnQgZGV2X3N0YXRlOy8qUkVBRFksIENIQU5HRSwgUkVMX0RPTkUsSU5JVCovCi0JaW50IHZvY19zdGF0ZTsvKklOSVQsIENIQU5HRSwgUkVMRUFTRSwgQUNRVUlSRSAqLwotCXN0cnVjdCBtdXRleCB2b2NfbG9jazsKLQlzdHJ1Y3QgbXV0ZXggdm9sX2xvY2s7Ci0JaW50IHZvY19ldmVudDsKLQlpbnQgZGV2X2V2ZW50OwotCWF0b21pY190IHJlbF9zdGFydF9mbGFnOwotCWF0b21pY190IGFjcV9zdGFydF9mbGFnOwotCWF0b21pY190IGNoZ19zdGFydF9mbGFnOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0ZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBkZXZfd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB2b2Nfd2FpdDsKLQl1aW50MzJfdCBkZXZpY2VfZXZlbnRzOwotCS8qIGNhY2hlIHRoZSB2YWx1ZXMgcmVsYXRlZCB0byBSeCBhbmQgVHggKi8KLQlzdHJ1Y3QgZGV2aWNlX2RhdGEgZGV2X3J4OwotCXN0cnVjdCBkZXZpY2VfZGF0YSBkZXZfdHg7Ci0JLyogdGhlc2UgZGVmYXVsdCB2YWx1ZXMgYXJlIGZvciBhbGwgZGV2aWNlcyAqLwotCXVpbnQzMl90IGRlZmF1bHRfbXV0ZV92YWw7Ci0JdWludDMyX3QgZGVmYXVsdF92b2xfdmFsOwotCXVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX3ZhbDsKLQkvKiBjYWxsIHN0YXR1cyAqLwotCWludCB2X2NhbGxfc3RhdHVzOyAvKiBTdGFydCBvciBFbmQgKi8KLQlzMzIgbWF4X3J4X3ZvbFtWT0NfUlhfVk9MX0FSUkFZX05VTV07IC8qIFswXSBpcyBmb3IgTkIsIFsxXSBmb3IgV0IgKi8KLQlzMzIgbWluX3J4X3ZvbFtWT0NfUlhfVk9MX0FSUkFZX05VTV07Ci19OwotCi1zdGF0aWMgc3RydWN0IHZvaWNlX2RhdGEgdm9pY2U7Ci0KLXN0YXRpYyBpbnQgdm9pY2VfY21kX2RldmljZV9pbmZvKHN0cnVjdCB2b2ljZV9kYXRhICopOwotc3RhdGljIGludCB2b2ljZV9jbWRfYWNxdWlyZV9kb25lKHN0cnVjdCB2b2ljZV9kYXRhICopOwotc3RhdGljIHZvaWQgdm9pY2VfYXVkZGV2X2NiX2Z1bmN0aW9uKHUzMiBldnRfaWQsCi0JCQl1bmlvbiBhdWRkZXZfZXZ0X2RhdGEgKmV2dF9wYXlsb2FkLAotCQkJdm9pZCAqcHJpdmF0ZV9kYXRhKTsKLQotc3RhdGljIGludCB2b2ljZV9jbWRfY2hhbmdlKHZvaWQpCi17Ci0KLQlzdHJ1Y3Qgdm9pY2VfaGVhZGVyIGhkcjsKLQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9ICZ2b2ljZTsKLQlpbnQgZXJyOwotCi0JaGRyLmlkID0gQ01EX0RFVklDRV9DSEFOR0U7Ci0JaGRyLmRhdGFfbGVuID0gMDsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQllcnIgPSBkYWxycGNfZmNuXzUoVk9JQ0VfREFMUlBDX0NNRCwgdi0+aGFuZGxlLCAmaGRyLAotCQkJc2l6ZW9mKHN0cnVjdCB2b2ljZV9oZWFkZXIpKTsKLQotCWlmIChlcnIpCi0JCU1NX0VSUigiVm9pY2UgY2hhbmdlIGNvbW1hbmQgZmFpbGVkXG4iKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCB2b2ljZV9hdWRkZXZfY2JfZnVuY3Rpb24odTMyIGV2dF9pZCwKLQkJCXVuaW9uIGF1ZGRldl9ldnRfZGF0YSAqZXZ0X3BheWxvYWQsCi0JCQl2b2lkICpwcml2YXRlX2RhdGEpCi17Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSAmdm9pY2U7Ci0JaW50IHJjID0gMCwgaTsKLQotCU1NX0lORk8oImF1ZGRldl9jYl9mdW5jdGlvbiwgZXZ0X2lkPSVkLCBkZXZfc3RhdGU9JWQsIHZvY19zdGF0ZT0lZFxuIiwKLQkJZXZ0X2lkLCB2LT5kZXZfc3RhdGUsIHYtPnZvY19zdGF0ZSk7Ci0JaWYgKChldnRfaWQgIT0gQVVEREVWX0VWVF9TVEFSVF9WT0lDRSkgfHwKLQkJCShldnRfaWQgIT0gQVVEREVWX0VWVF9FTkRfVk9JQ0UpKSB7Ci0JCWlmIChldnRfcGF5bG9hZCA9PSBOVUxMKSB7Ci0JCQlNTV9FUlIoIiBldnRfcGF5bG9hZCBpcyBOVUxMIHBvaW50ZXJcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCXN3aXRjaCAoZXZ0X2lkKSB7Ci0JY2FzZSBBVURERVZfRVZUX1NUQVJUX1ZPSUNFOgotCQlpZiAoKHYtPmRldl9zdGF0ZSA9PSBERVZfSU5JVCkgfHwKLQkJCQkodi0+ZGV2X3N0YXRlID09IERFVl9SRUxfRE9ORSkpIHsKLQkJCXYtPnZfY2FsbF9zdGF0dXMgPSBWT0lDRV9DQUxMX1NUQVJUOwotCQkJaWYgKCh2LT5kZXZfcnguZW5hYmxlZCA9PSBWT0lDRV9ERVZfRU5BQkxFRCkKLQkJCQkmJiAodi0+ZGV2X3R4LmVuYWJsZWQgPT0gVk9JQ0VfREVWX0VOQUJMRUQpKSB7Ci0JCQkJdi0+ZGV2X3N0YXRlID0gREVWX1JFQURZOwotCQkJCU1NX0RCRygiZGV2X3N0YXRlIGludG8gcmVhZHlcbiIpOwotCQkJCXdha2VfdXAoJnYtPmRldl93YWl0KTsKLQkJCX0KLQkJCWlmICh2LT52b2Nfc3RhdGUgPT0gVk9JQ0VfQ0hBTkdFKSB7Ci0JCQkJTU1fREJHKCJ2b2Nfc3RhdGUgaXMgaW4gVk9JQ0VfQ0hBTkdFXG4iKTsKLQkJCQl2LT52b2Nfc3RhdGUgPSBWT0lDRV9BQ1FVSVJFOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVEREVWX0VWVF9ERVZfQ0hHX1ZPSUNFOgotCQlpZiAodi0+ZGV2X3N0YXRlID09IERFVl9SRUFEWSkgewotCQkJdi0+ZGV2X3J4LmVuYWJsZWQgPSBWT0lDRV9ERVZfRElTQUJMRUQ7Ci0JCQl2LT5kZXZfdHguZW5hYmxlZCA9IFZPSUNFX0RFVl9ESVNBQkxFRDsKLQkJCXYtPmRldl9zdGF0ZSA9IERFVl9DSEFOR0U7Ci0JCQltdXRleF9sb2NrKCZ2b2ljZS52b2NfbG9jayk7Ci0JCQlpZiAodi0+dm9jX3N0YXRlID09IFZPSUNFX0FDUVVJUkUpIHsKLQkJCQkvKiBzZW5kIGRldmljZSBjaGFuZ2UgdG8gbW9kZW0gKi8KLQkJCQl2b2ljZV9jbWRfY2hhbmdlKCk7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZ2b2ljZS52b2NfbG9jayk7Ci0JCQkJbXNtX3NuZGRldl9lbmFibGVfc2lkZXRvbmUodi0+ZGV2X3J4LmRldl9pZCwKLQkJCQkwKTsKLQkJCQkvKiBibG9jayB0byB3YWl0IGZvciBDSEFOR0VfU1RBUlQgKi8KLQkJCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCQl2LT52b2Nfd2FpdCwgKHYtPnZvY19zdGF0ZSA9PSBWT0lDRV9DSEFOR0UpCi0JCQkJfHwgKGF0b21pY19yZWFkKCZ2LT5jaGdfc3RhcnRfZmxhZykgPT0gMSkKLQkJCQl8fCAoYXRvbWljX3JlYWQoJnYtPnJlbF9zdGFydF9mbGFnKSA9PSAxKSk7Ci0JCQl9IGVsc2UgewotCQkJCW11dGV4X3VubG9jaygmdm9pY2Uudm9jX2xvY2spOwotCQkJCU1NX0VSUigiIFZvaWNlIGlzIG5vdCBhdCBBQ1FVSVJFIHN0YXRlXG4iKTsKLQkJCX0KLQkJfSBlbHNlIGlmICgodi0+ZGV2X3N0YXRlID09IERFVl9JTklUKSB8fAotCQkJCSh2LT5kZXZfc3RhdGUgPT0gREVWX1JFTF9ET05FKSkgewotCQkJCXYtPmRldl9yeC5lbmFibGVkID0gVk9JQ0VfREVWX0RJU0FCTEVEOwotCQkJCXYtPmRldl90eC5lbmFibGVkID0gVk9JQ0VfREVWX0RJU0FCTEVEOwotCQl9IGVsc2UKLQkJCU1NX0VSUigiIGRldmljZSBpcyBub3QgYXQgcHJvcGVyIHN0YXRlXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURERVZfRVZUX0RFVl9SRFk6Ci0JCS8qIHVwZGF0ZSB0aGUgZGV2IGluZm8gKi8KLQkJaWYgKGV2dF9wYXlsb2FkLT52b2NfZGV2aW5mby5kZXZfdHlwZSA9PSBESVJfUlgpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBWT0NfUlhfVk9MX0FSUkFZX05VTTsgaSsrKSB7Ci0JCQkJdi0+bWF4X3J4X3ZvbFtpXSA9Ci0JCQkJCWV2dF9wYXlsb2FkLT52b2NfZGV2aW5mby5tYXhfcnhfdm9sW2ldOwotCQkJCXYtPm1pbl9yeF92b2xbaV0gPQotCQkJCQlldnRfcGF5bG9hZC0+dm9jX2RldmluZm8ubWluX3J4X3ZvbFtpXTsKLQkJCX0KLQkJfQotCQlpZiAodi0+ZGV2X3N0YXRlID09IERFVl9DSEFOR0UpIHsKLQkJCWlmIChldnRfcGF5bG9hZC0+dm9jX2RldmluZm8uZGV2X3R5cGUgPT0gRElSX1JYKSB7Ci0JCQkJdi0+ZGV2X3J4LmRldl9hY2RiX2lkID0KLQkJCQkJZXZ0X3BheWxvYWQtPnZvY19kZXZpbmZvLmFjZGJfZGV2X2lkOwotCQkJCXYtPmRldl9yeC5zYW1wbGUgPQotCQkJCQlldnRfcGF5bG9hZC0+dm9jX2RldmluZm8uZGV2X3NhbXBsZTsKLQkJCQl2LT5kZXZfcnguZGV2X2lkID0KLQkJCQlldnRfcGF5bG9hZC0+dm9jX2RldmluZm8uZGV2X2lkOwotCQkJCXYtPmRldl9yeC5lbmFibGVkID0gVk9JQ0VfREVWX0VOQUJMRUQ7Ci0JCQl9IGVsc2UgewotCQkJCXYtPmRldl90eC5kZXZfYWNkYl9pZCA9Ci0JCQkJCWV2dF9wYXlsb2FkLT52b2NfZGV2aW5mby5hY2RiX2Rldl9pZDsKLQkJCQl2LT5kZXZfdHguc2FtcGxlID0KLQkJCQkJZXZ0X3BheWxvYWQtPnZvY19kZXZpbmZvLmRldl9zYW1wbGU7Ci0JCQkJdi0+ZGV2X3R4LmVuYWJsZWQgPSBWT0lDRV9ERVZfRU5BQkxFRDsKLQkJCQl2LT5kZXZfdHguZGV2X2lkID0KLQkJCQlldnRfcGF5bG9hZC0+dm9jX2RldmluZm8uZGV2X2lkOwotCQkJfQotCQkJaWYgKCh2LT5kZXZfcnguZW5hYmxlZCA9PSBWT0lDRV9ERVZfRU5BQkxFRCkgJiYKLQkJCQkodi0+ZGV2X3R4LmVuYWJsZWQgPT0gVk9JQ0VfREVWX0VOQUJMRUQpKSB7Ci0JCQkJdi0+ZGV2X3N0YXRlID0gREVWX1JFQURZOwotCQkJCU1NX0RCRygiZGV2IHN0YXRlIGludG8gcmVhZHlcbiIpOwotCQkJCXZvaWNlX2NtZF9kZXZpY2VfaW5mbyh2KTsKLQkJCQl3YWtlX3VwKCZ2LT5kZXZfd2FpdCk7Ci0JCQkJbXV0ZXhfbG9jaygmdm9pY2Uudm9jX2xvY2spOwotCQkJCWlmICh2LT52b2Nfc3RhdGUgPT0gVk9JQ0VfQ0hBTkdFKSB7Ci0JCQkJCXYtPmRldl9ldmVudCA9IERFVl9DSEFOR0VfUkVBRFk7Ci0JCQkJCWNvbXBsZXRlKCZ2LT5jb21wbGV0ZSk7Ci0JCQkJfQotCQkJCW11dGV4X3VubG9jaygmdm9pY2Uudm9jX2xvY2spOwotCQkJfQotCQl9IGVsc2UgaWYgKCh2LT5kZXZfc3RhdGUgPT0gREVWX0lOSVQpIHx8Ci0JCQkodi0+ZGV2X3N0YXRlID09IERFVl9SRUxfRE9ORSkpIHsKLQkJCWlmIChldnRfcGF5bG9hZC0+dm9jX2RldmluZm8uZGV2X3R5cGUgPT0gRElSX1JYKSB7Ci0JCQkJdi0+ZGV2X3J4LmRldl9hY2RiX2lkID0KLQkJCQkJZXZ0X3BheWxvYWQtPnZvY19kZXZpbmZvLmFjZGJfZGV2X2lkOwotCQkJCXYtPmRldl9yeC5zYW1wbGUgPQotCQkJCQlldnRfcGF5bG9hZC0+dm9jX2RldmluZm8uZGV2X3NhbXBsZTsKLQkJCQl2LT5kZXZfcnguZGV2X2lkID0KLQkJCQlldnRfcGF5bG9hZC0+dm9jX2RldmluZm8uZGV2X2lkOwotCQkJCXYtPmRldl9yeC5lbmFibGVkID0gVk9JQ0VfREVWX0VOQUJMRUQ7Ci0JCQl9IGVsc2UgewotCQkJCXYtPmRldl90eC5kZXZfYWNkYl9pZCA9Ci0JCQkJCWV2dF9wYXlsb2FkLT52b2NfZGV2aW5mby5hY2RiX2Rldl9pZDsKLQkJCQl2LT5kZXZfdHguc2FtcGxlID0KLQkJCQkJZXZ0X3BheWxvYWQtPnZvY19kZXZpbmZvLmRldl9zYW1wbGU7Ci0JCQkJdi0+ZGV2X3R4LmRldl9pZCA9Ci0JCQkJZXZ0X3BheWxvYWQtPnZvY19kZXZpbmZvLmRldl9pZDsKLQkJCQl2LT5kZXZfdHguZW5hYmxlZCA9IFZPSUNFX0RFVl9FTkFCTEVEOwotCQkJfQotCQkJaWYgKCh2LT5kZXZfcnguZW5hYmxlZCA9PSBWT0lDRV9ERVZfRU5BQkxFRCkgJiYKLQkJCQkodi0+ZGV2X3R4LmVuYWJsZWQgPT0gVk9JQ0VfREVWX0VOQUJMRUQpICYmCi0JCQkJKHYtPnZfY2FsbF9zdGF0dXMgPT0gVk9JQ0VfQ0FMTF9TVEFSVCkpIHsKLQkJCQl2LT5kZXZfc3RhdGUgPSBERVZfUkVBRFk7Ci0JCQkJTU1fREJHKCJkZXYgc3RhdGUgaW50byByZWFkeVxuIik7Ci0JCQkJdm9pY2VfY21kX2RldmljZV9pbmZvKHYpOwotCQkJCXdha2VfdXAoJnYtPmRldl93YWl0KTsKLQkJCQltdXRleF9sb2NrKCZ2b2ljZS52b2NfbG9jayk7Ci0JCQkJaWYgKHYtPnZvY19zdGF0ZSA9PSBWT0lDRV9DSEFOR0UpIHsKLQkJCQkJdi0+ZGV2X2V2ZW50ID0gREVWX0NIQU5HRV9SRUFEWTsKLQkJCQkJY29tcGxldGUoJnYtPmNvbXBsZXRlKTsKLQkJCQl9Ci0JCQkJbXV0ZXhfdW5sb2NrKCZ2b2ljZS52b2NfbG9jayk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJTU1fRVJSKCJSZWNlaXZlIFJFQURZIG5vdCBhdCB0aGUgcHJvcGVyIHN0YXRlID0lZFxuIiwKLQkJCQl2LT5kZXZfc3RhdGUpOwotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfREVWSUNFX1ZPTF9NVVRFX0NIRzoKLQkJaWYgKGV2dF9wYXlsb2FkLT52b2NfZGV2aW5mby5kZXZfdHlwZSA9PSBESVJfVFgpCi0JCQl2LT5kZXZfdHgubXV0ZSA9Ci0JCQkJZXZ0X3BheWxvYWQtPnZvY192bV9pbmZvLmRldl92bV92YWwubXV0ZTsKLQkJZWxzZQotCQkJdi0+ZGV2X3J4LnZvbHVtZSA9IGV2dF9wYXlsb2FkLT4KLQkJCQkJCXZvY192bV9pbmZvLmRldl92bV92YWwudm9sOwotCQkvKiBzZW5kIGRldmljZSBpbmZvICovCi0JCXZvaWNlX2NtZF9kZXZpY2VfaW5mbyh2KTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURERVZfRVZUX1JFTF9QRU5ESU5HOgotCQkvKiByZWNvdmVyIHRoZSB0eCBtdXRlIGFuZCByeCB2b2x1bWUgdG8gdGhlIGRlZmF1bHQgdmFsdWVzICovCi0JCWlmICh2LT5kZXZfc3RhdGUgPT0gREVWX1JFQURZKSB7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJnYtPnJlbF9zdGFydF9mbGFnKSkgewotCQkJCWF0b21pY19kZWMoJnYtPnJlbF9zdGFydF9mbGFnKTsKLQkJCQlpZiAoZXZ0X3BheWxvYWQtPnZvY19kZXZpbmZvLmRldl90eXBlID09IERJUl9SWCkKLQkJCQkJdi0+ZGV2X3J4LmVuYWJsZWQgPSBWT0lDRV9ERVZfRElTQUJMRUQ7Ci0JCQkJZWxzZQotCQkJCQl2LT5kZXZfdHguZW5hYmxlZCA9IFZPSUNFX0RFVl9ESVNBQkxFRDsKLQkJCQl2LT5kZXZfc3RhdGUgPSBERVZfUkVMX0RPTkU7Ci0JCQkJd2FrZV91cCgmdi0+ZGV2X3dhaXQpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbXV0ZXhfbG9jaygmdm9pY2Uudm9jX2xvY2spOwotCQkJaWYgKCh2LT52b2Nfc3RhdGUgPT0gVk9JQ0VfUkVMRUFTRSkgfHwKLQkJCQkJKHYtPnZvY19zdGF0ZSA9PSBWT0lDRV9JTklUKSkgewotCQkJCWlmIChldnRfcGF5bG9hZC0+dm9jX2RldmluZm8uZGV2X3R5cGUKLQkJCQkJCQk9PSBESVJfUlgpIHsKLQkJCQkJdi0+ZGV2X3J4LmVuYWJsZWQgPSBWT0lDRV9ERVZfRElTQUJMRUQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdi0+ZGV2X3R4LmVuYWJsZWQgPSBWT0lDRV9ERVZfRElTQUJMRUQ7Ci0JCQkJfQotCQkJCXYtPmRldl9zdGF0ZSA9IERFVl9SRUxfRE9ORTsKLQkJCQltdXRleF91bmxvY2soJnZvaWNlLnZvY19sb2NrKTsKLQkJCQl3YWtlX3VwKCZ2LT5kZXZfd2FpdCk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIHNlbmQgZGV2aWNlIGNoYW5nZSB0byBtb2RlbSAqLwotCQkJCXZvaWNlX2NtZF9jaGFuZ2UoKTsKLQkJCQltdXRleF91bmxvY2soJnZvaWNlLnZvY19sb2NrKTsKLQkJCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCQl2LT52b2Nfd2FpdCwgKHYtPnZvY19zdGF0ZSA9PSBWT0lDRV9DSEFOR0UpCi0JCQkJfHwgKGF0b21pY19yZWFkKCZ2LT5jaGdfc3RhcnRfZmxhZykgPT0gMSkKLQkJCQl8fCAoYXRvbWljX3JlYWQoJnYtPnJlbF9zdGFydF9mbGFnKSA9PSAxKSk7Ci0JCQkJaWYgKGF0b21pY19yZWFkKCZ2LT5yZWxfc3RhcnRfZmxhZykgPT0gMSkKLQkJCQkJYXRvbWljX2RlYygmdi0+cmVsX3N0YXJ0X2ZsYWcpOwotCQkJCS8qIGNsZWFyIFJ4L1R4IHRvIERpc2FibGUgKi8KLQkJCQlpZiAoZXZ0X3BheWxvYWQtPnZvY19kZXZpbmZvLmRldl90eXBlID09IERJUl9SWCkKLQkJCQkJdi0+ZGV2X3J4LmVuYWJsZWQgPSBWT0lDRV9ERVZfRElTQUJMRUQ7Ci0JCQkJZWxzZQotCQkJCQl2LT5kZXZfdHguZW5hYmxlZCA9IFZPSUNFX0RFVl9ESVNBQkxFRDsKLQkJCQl2LT5kZXZfc3RhdGUgPSBERVZfUkVMX0RPTkU7Ci0JCQkJd2FrZV91cCgmdi0+ZGV2X3dhaXQpOwotCQkJfQotCQl9IGVsc2UgaWYgKCh2LT5kZXZfc3RhdGUgPT0gREVWX0lOSVQpIHx8Ci0JCQkJKHYtPmRldl9zdGF0ZSA9PSBERVZfUkVMX0RPTkUpKSB7Ci0JCQlpZiAoZXZ0X3BheWxvYWQtPnZvY19kZXZpbmZvLmRldl90eXBlID09IERJUl9SWCkKLQkJCQl2LT5kZXZfcnguZW5hYmxlZCA9IFZPSUNFX0RFVl9ESVNBQkxFRDsKLQkJCWVsc2UKLQkJCQl2LT5kZXZfdHguZW5hYmxlZCA9IFZPSUNFX0RFVl9ESVNBQkxFRDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRERFVl9FVlRfRU5EX1ZPSUNFOgotCQkvKiByZWNvdmVyIHRoZSB0eCBtdXRlIGFuZCByeCB2b2x1bWUgdG8gdGhlIGRlZmF1bHQgdmFsdWVzICovCi0JCXYtPmRldl90eC5tdXRlID0gdi0+ZGVmYXVsdF9tdXRlX3ZhbDsKLQkJdi0+ZGV2X3J4LnZvbHVtZSA9IHYtPmRlZmF1bHRfdm9sX3ZhbDsKLQotCQlpZiAodi0+ZGV2X3J4LmVuYWJsZWQgPT0gVk9JQ0VfREVWX0VOQUJMRUQpCi0JCQltc21fc25kZGV2X2VuYWJsZV9zaWRldG9uZSh2LT5kZXZfcnguZGV2X2lkLCAwKTsKLQotCQlpZiAoKHYtPmRldl9zdGF0ZSA9PSBERVZfUkVBRFkpIHx8Ci0JCQkodi0+ZGV2X3N0YXRlID09IERFVl9DSEFOR0UpKSB7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJnYtPnJlbF9zdGFydF9mbGFnKSkgewotCQkJCWF0b21pY19kZWMoJnYtPnJlbF9zdGFydF9mbGFnKTsKLQkJCQl2LT52X2NhbGxfc3RhdHVzID0gVk9JQ0VfQ0FMTF9FTkQ7Ci0JCQkJdi0+ZGV2X3N0YXRlID0gREVWX1JFTF9ET05FOwotCQkJCXdha2VfdXAoJnYtPmRldl93YWl0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW11dGV4X2xvY2soJnZvaWNlLnZvY19sb2NrKTsKLQkJCWlmICgodi0+dm9jX3N0YXRlID09IFZPSUNFX1JFTEVBU0UpIHx8Ci0JCQkJCSh2LT52b2Nfc3RhdGUgPT0gVk9JQ0VfSU5JVCkpIHsKLQkJCQl2LT52X2NhbGxfc3RhdHVzID0gVk9JQ0VfQ0FMTF9FTkQ7Ci0JCQkJdi0+ZGV2X3N0YXRlID0gREVWX1JFTF9ET05FOwotCQkJCW11dGV4X3VubG9jaygmdm9pY2Uudm9jX2xvY2spOwotCQkJCXdha2VfdXAoJnYtPmRldl93YWl0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogc2VuZCBtdXRlIGFuZCBkZWZhdWx0IHZvbHVtZSB2YWx1ZSB0byBNQ0FEICovCi0JCQkJdm9pY2VfY21kX2RldmljZV9pbmZvKHYpOwotCQkJCS8qIHNlbmQgZGV2aWNlIGNoYW5nZSB0byBtb2RlbSAqLwotCQkJCXZvaWNlX2NtZF9jaGFuZ2UoKTsKLQkJCQltdXRleF91bmxvY2soJnZvaWNlLnZvY19sb2NrKTsKLQkJCQkvKiBibG9jayB0byB3YWl0IGZvciBSRUxFQVNFX1NUQVJUCi0JCQkJCQlvciBDSEFOR0VfU1RBUlQgKi8KLQkJCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKLQkJCQl2LT52b2Nfd2FpdCwgKHYtPnZvY19zdGF0ZSA9PSBWT0lDRV9DSEFOR0UpCi0JCQkJfHwgKGF0b21pY19yZWFkKCZ2LT5jaGdfc3RhcnRfZmxhZykgPT0gMSkKLQkJCQl8fCAoYXRvbWljX3JlYWQoJnYtPnJlbF9zdGFydF9mbGFnKSA9PSAxKSk7Ci0JCQkJaWYgKGF0b21pY19yZWFkKCZ2LT5yZWxfc3RhcnRfZmxhZykgPT0gMSkKLQkJCQkJYXRvbWljX2RlYygmdi0+cmVsX3N0YXJ0X2ZsYWcpOwotCQkJCS8qIHNldCB2b2ljZSBjYWxsIHRvIEVORCBzdGF0ZSAqLwotCQkJCXYtPnZfY2FsbF9zdGF0dXMgPSBWT0lDRV9DQUxMX0VORDsKLQkJCQl2LT5kZXZfc3RhdGUgPSBERVZfUkVMX0RPTkU7Ci0JCQkJd2FrZV91cCgmdi0+ZGV2X3dhaXQpOwotCQkJfQotCQl9IGVsc2UKLQkJCXYtPnZfY2FsbF9zdGF0dXMgPSBWT0lDRV9DQUxMX0VORDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURERVZfRVZUX0ZSRVFfQ0hHOgotCQlNTV9EQkcoIlZvaWNlIERyaXZlciBnb3Qgc2FtcGxlIHJhdGUgY2hhbmdlIEV2ZW50XG4iKTsKLQkJTU1fREJHKCJzYW1wbGUgcmF0ZSAlZFxuIiwgZXZ0X3BheWxvYWQtPmZyZXFfaW5mby5zYW1wbGVfcmF0ZSk7Ci0JCU1NX0RCRygiZGV2X3R5cGUgJWRcbiIsIGV2dF9wYXlsb2FkLT5mcmVxX2luZm8uZGV2X3R5cGUpOwotCQlNTV9EQkcoImFjZGJfZGV2X2lkICVkXG4iLCBldnRfcGF5bG9hZC0+ZnJlcV9pbmZvLmFjZGJfZGV2X2lkKTsKLQkJaWYgKHYtPmRldl9zdGF0ZSA9PSBERVZfUkVBRFkpIHsKLQkJCXYtPmRldl90eC5lbmFibGVkID0gVk9JQ0VfREVWX0RJU0FCTEVEOwotCQkJdi0+ZGV2X3N0YXRlID0gREVWX0NIQU5HRTsKLQkJCW11dGV4X2xvY2soJnZvaWNlLnZvY19sb2NrKTsKLQkJCWlmICh2LT52b2Nfc3RhdGUgPT0gVk9JQ0VfQUNRVUlSRSkgewotCQkJCW1zbV9zbmRkZXZfZW5hYmxlX3NpZGV0b25lKHYtPmRldl9yeC5kZXZfaWQsCi0JCQkJMCk7Ci0JCQkJLyogc2VuZCBkZXZpY2UgY2hhbmdlIHRvIG1vZGVtICovCi0JCQkJdm9pY2VfY21kX2NoYW5nZSgpOwotCQkJCW11dGV4X3VubG9jaygmdm9pY2Uudm9jX2xvY2spOwotCQkJCS8qIGJsb2NrIHRvIHdhaXQgZm9yIENIQU5HRV9TVEFSVCAqLwotCQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAotCQkJCXYtPnZvY193YWl0LCAodi0+dm9jX3N0YXRlID09IFZPSUNFX0NIQU5HRSkKLQkJCQl8fCAoYXRvbWljX3JlYWQoJnYtPmNoZ19zdGFydF9mbGFnKSA9PSAxKQotCQkJCXx8IChhdG9taWNfcmVhZCgmdi0+cmVsX3N0YXJ0X2ZsYWcpID09IDEpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZ2b2ljZS52b2NfbG9jayk7Ci0JCQkJTU1fRVJSKCIgVm9pY2UgaXMgbm90IGF0IEFDUVVJUkUgc3RhdGVcbiIpOwotCQkJfQotCQl9IGVsc2UgaWYgKCh2LT5kZXZfc3RhdGUgPT0gREVWX0lOSVQpIHx8Ci0JCQkJKHYtPmRldl9zdGF0ZSA9PSBERVZfUkVMX0RPTkUpKSB7Ci0JCQkJdi0+ZGV2X3R4LmVuYWJsZWQgPSBWT0lDRV9ERVZfRElTQUJMRUQ7Ci0JCX0gZWxzZQotCQkJTU1fRVJSKCJFdmVudCBub3QgYXQgdGhlIHByb3BlciBzdGF0ZSA9JWRcbiIsCi0JCQkJdi0+ZGV2X3N0YXRlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTU1fRVJSKCJVTktOT1dOIEVWRU5UXG4iKTsKLQl9Ci0JcmV0dXJuOwotfQotRVhQT1JUX1NZTUJPTCh2b2ljZV9hdWRkZXZfY2JfZnVuY3Rpb24pOwotCi1zdGF0aWMgdm9pZCByZW1vdGVfY2JfZnVuY3Rpb24odm9pZCAqY29udGV4dCwgdTMyIHBhcmFtLAotCQkJCXZvaWQgKmV2dF9idWYsIHUzMiBsZW4pCi17Ci0Jc3RydWN0IHZvaWNlX2hlYWRlciAqaGRyOwotCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gY29udGV4dDsKLQotCWhkciA9IChzdHJ1Y3Qgdm9pY2VfaGVhZGVyICopZXZ0X2J1ZjsKLQotCU1NX0lORk8oImxlbj0lZCBpZD0lZFxuIiwgbGVuLCBoZHItPmlkKTsKLQotCWlmIChsZW4gPD0gMCkgewotCQlNTV9FUlIoInVuZXhwZWN0ZWQgZXZlbnQgd2l0aCBsZW5ndGggJWQgXG4iLCBsZW4pOwotCQlyZXR1cm47Ci0JfQotCi0Jc3dpdGNoIChoZHItPmlkKSB7Ci0JY2FzZSBFVkVOVF9BQ1FVSVJFX1NUQVJUOgotCQlhdG9taWNfaW5jKCZ2LT5hY3Ffc3RhcnRfZmxhZyk7Ci0JCXdha2VfdXAoJnYtPmRldl93YWl0KTsKLQkJdi0+dm9jX2V2ZW50ID0gVk9JQ0VfQUNRVUlSRV9TVEFSVDsKLQkJdi0+bmV0d29yayA9ICgoc3RydWN0IHZvaWNlX25ldHdvcmsgKilldnRfYnVmKS0+bmV0d29ya19pbmZvOwotCQljb21wbGV0ZSgmdi0+Y29tcGxldGUpOwotCQlicmVhazsKLQljYXNlIEVWRU5UX1JFTEVBU0VfU1RBUlQ6Ci0JCS8qIElmIEFDUVVJUkVEIGNvbWUgaW4gYmVmb3JlIHRoZSBSRUxFQVNFLAotCQkqIHdpbGwgb25seSBzZXJ2aWNlcyB0aGUgUkVMRUFTRSAqLwotCQlhdG9taWNfaW5jKCZ2LT5yZWxfc3RhcnRfZmxhZyk7Ci0JCXdha2VfdXAoJnYtPnZvY193YWl0KTsKLQkJd2FrZV91cCgmdi0+ZGV2X3dhaXQpOwotCQl2LT52b2NfZXZlbnQgPSBWT0lDRV9SRUxFQVNFX1NUQVJUOwotCQljb21wbGV0ZSgmdi0+Y29tcGxldGUpOwotCQlicmVhazsKLQljYXNlIEVWRU5UX0NIQU5HRV9TVEFSVDoKLQkJYXRvbWljX2luYygmdi0+Y2hnX3N0YXJ0X2ZsYWcpOwotCQl3YWtlX3VwKCZ2LT52b2Nfd2FpdCk7Ci0JCXYtPnZvY19ldmVudCA9IFZPSUNFX0NIQU5HRV9TVEFSVDsKLQkJY29tcGxldGUoJnYtPmNvbXBsZXRlKTsKLQkJYnJlYWs7Ci0JY2FzZSBFVkVOVF9ORVRXT1JLX1JFQ09ORklHOgotCQkvKiBzZW5kIG5ldHdvcmsgY2hhbmdlIHRvIGF1ZGlvX2RldiwKLQkJaWYgc2FtcGxlIHJhdGUgaXMgbGVzcyB0aGFuIDE2aywKLQkJb3RoZXJ3aXNlLCBzZW5kIGFjcXVpcmUgZG9uZSAqLwotCQl2LT52b2NfZXZlbnQgPSBWT0lDRV9ORVRXT1JLX1JFQ09ORklHOwotCQl2LT5uZXR3b3JrID0gKChzdHJ1Y3Qgdm9pY2VfbmV0d29yayAqKWV2dF9idWYpLT5uZXR3b3JrX2luZm87Ci0JCWNvbXBsZXRlKCZ2LT5jb21wbGV0ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1NX0VSUigiVW5kZWZpbmVkIGV2ZW50ICVkIFxuIiwgaGRyLT5pZCk7Ci0JfQotCi19Ci0KLXN0YXRpYyBpbnQgdm9pY2VfY21kX2luaXQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCi17Ci0KLQlzdHJ1Y3Qgdm9pY2VfaW5pdCBjbWQ7Ci0JaW50IGVycjsKLQotCU1NX0RCRygiXG4iKTsgLyogTWFjcm8gcHJpbnRzIHRoZSBmaWxlIG5hbWUgYW5kIGZ1bmN0aW9uICovCi0KLQljbWQuaGRyLmlkID0gQ01EX1ZPSUNFX0lOSVQ7Ci0JY21kLmhkci5kYXRhX2xlbiA9IHNpemVvZihzdHJ1Y3Qgdm9pY2VfaW5pdCkgLQotCQkJCXNpemVvZihzdHJ1Y3Qgdm9pY2VfaGVhZGVyKTsKLQljbWQuY2JfaGFuZGxlID0gdi0+Y2JfaGFuZGxlOwotCi0JZXJyID0gZGFscnBjX2Zjbl81KFZPSUNFX0RBTFJQQ19DTUQsIHYtPmhhbmRsZSwgJmNtZCwKLQkJCSBzaXplb2Yoc3RydWN0IHZvaWNlX2luaXQpKTsKLQotCWlmIChlcnIpCi0JCU1NX0VSUigiVm9pY2UgaW5pdCBjb21tYW5kIGZhaWxlZFxuIik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCB2b2ljZV9jbWRfYWNxdWlyZV9kb25lKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCXN0cnVjdCB2b2ljZV9oZWFkZXIgaGRyOwotCWludCBlcnI7Ci0KLQloZHIuaWQgPSBDTURfQUNRVUlSRV9ET05FOwotCWhkci5kYXRhX2xlbiA9IDA7Ci0KLQlNTV9JTkZPKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQotCS8qIEVuYWJsZSBIVyBzaWRldG9uZSBpZiBkZXZpY2Ugc3VwcG9ydHMgaXQgICovCi0JbXNtX3NuZGRldl9lbmFibGVfc2lkZXRvbmUodi0+ZGV2X3J4LmRldl9pZCwgMSk7Ci0KLQllcnIgPSBkYWxycGNfZmNuXzUoVk9JQ0VfREFMUlBDX0NNRCwgdi0+aGFuZGxlLCAmaGRyLAotCQkJIHNpemVvZihzdHJ1Y3Qgdm9pY2VfaGVhZGVyKSk7Ci0KLQlpZiAoZXJyKQotCQlNTV9FUlIoIlZvaWNlIGFjcXVpcmUgZG9uZSBjb21tYW5kIGZhaWxlZFxuIik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCB2b2ljZV9jbWRfZGV2aWNlX2luZm8oc3RydWN0IHZvaWNlX2RhdGEgKnYpCi17Ci0Jc3RydWN0IHZvaWNlX2RldmljZSBjbWQ7Ci0JaW50IGVyciwgdm9sOwotCi0JTU1fSU5GTygidHhfZGV2PSVkLCByeF9kZXY9JWQsIHR4X3NhbXBsZT0lZCwgdHhfbXV0ZT0lZFxuIiwKLQkJCXYtPmRldl90eC5kZXZfYWNkYl9pZCwgdi0+ZGV2X3J4LmRldl9hY2RiX2lkLAotCQkJdi0+ZGV2X3R4LnNhbXBsZSwgdi0+ZGV2X3R4Lm11dGUpOwotCi0JbXV0ZXhfbG9jaygmdm9pY2Uudm9sX2xvY2spOwotCi0JY21kLmhkci5pZCA9IENNRF9ERVZJQ0VfSU5GTzsKLQljbWQuaGRyLmRhdGFfbGVuID0gc2l6ZW9mKHN0cnVjdCB2b2ljZV9kZXZpY2UpIC0KLQkJCXNpemVvZihzdHJ1Y3Qgdm9pY2VfaGVhZGVyKTsKLQljbWQudHhfZGV2aWNlID0gdi0+ZGV2X3R4LmRldl9hY2RiX2lkOwotCWNtZC5yeF9kZXZpY2UgPSB2LT5kZXZfcnguZGV2X2FjZGJfaWQ7Ci0JaWYgKHYtPm5ldHdvcmsgPT0gTkVUV09SS19XQ0RNQV9XQikKLQkJdm9sID0gdi0+bWluX3J4X3ZvbFtWT0NfV0JfSU5ERVhdICsKLQkJCSgodi0+bWF4X3J4X3ZvbFtWT0NfV0JfSU5ERVhdIC0KLQkJCXYtPm1pbl9yeF92b2xbVk9DX1dCX0lOREVYXSkgKiB2LT5kZXZfcngudm9sdW1lKS8xMDA7Ci0JZWxzZQotCQl2b2wgPSB2LT5taW5fcnhfdm9sW1ZPQ19OQl9JTkRFWF0gKwotCQkJKCh2LT5tYXhfcnhfdm9sW1ZPQ19OQl9JTkRFWF0gLQotCQkJdi0+bWluX3J4X3ZvbFtWT0NfTkJfSU5ERVhdKSAqIHYtPmRldl9yeC52b2x1bWUpLzEwMDsKLQljbWQucnhfdm9sdW1lID0gKHUzMil2b2w7IC8qIGluIG1iICovCi0JY21kLnJ4X211dGUgPSAwOwotCWNtZC50eF9tdXRlID0gdi0+ZGV2X3R4Lm11dGU7Ci0JY21kLnJ4X3NhbXBsZSA9IHYtPmRldl9yeC5zYW1wbGUvMTAwMDsKLQljbWQudHhfc2FtcGxlID0gdi0+ZGV2X3R4LnNhbXBsZS8xMDAwOwotCi0JTU1fREJHKCJyeF92b2w9JWQsIHJ4X3NhbXBsZT0lZFxuIiwgY21kLnJ4X3ZvbHVtZSwgdi0+ZGV2X3J4LnNhbXBsZSk7Ci0KLQllcnIgPSBkYWxycGNfZmNuXzUoVk9JQ0VfREFMUlBDX0NNRCwgdi0+aGFuZGxlLCAmY21kLAotCQkJIHNpemVvZihzdHJ1Y3Qgdm9pY2VfZGV2aWNlKSk7Ci0KLQltdXRleF91bmxvY2soJnZvaWNlLnZvbF9sb2NrKTsKLQotCWlmIChlcnIpCi0JCU1NX0VSUigiVm9pY2UgZGV2aWNlIGNvbW1hbmQgZmFpbGVkXG4iKTsKLQlyZXR1cm4gZXJyOwotfQotRVhQT1JUX1NZTUJPTCh2b2ljZV9jbWRfZGV2aWNlX2luZm8pOwotCi12b2lkIHZvaWNlX2NoYW5nZV9zYW1wbGVfcmF0ZShzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlpbnQgZnJlcSA9IDQ4MDAwOwotCWludCByYyA9IDA7Ci0KLQlNTV9EQkcoIm5ldHdvcmsgPSVkLCB2b3RlIGZyZXE9JWRcbiIsIHYtPm5ldHdvcmssIGZyZXEpOwotCWlmIChmcmVxICE9IHYtPmRldl90eC5zYW1wbGUpIHsKLQkJcmMgPSBtc21fc25kZGV2X3JlcXVlc3RfZnJlcSgmZnJlcSwgMCwKLQkJCQlTTkRERVZfQ0FQX1RYLCBBVURERVZfQ0xOVF9WT0MpOwotCQlpZiAocmMgPj0gMCkgewotCQkJdi0+ZGV2X3R4LnNhbXBsZSA9IGZyZXE7Ci0JCQlNTV9EQkcoIiB2b3RlIGZvciBmcmVxPSVkIHN1Y2Nlc3NmdWxseSBcbiIsIGZyZXEpOwotCQl9IGVsc2UKLQkJCU1NX0VSUigiIHZvdGluZyBmb3IgZnJlcT0lZCBmYWlsZWQuXG4iLCBmcmVxKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2VfdGhyZWFkKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSAoc3RydWN0IHZvaWNlX2RhdGEgKilkYXRhOwotCWludCByYyA9IDA7Ci0KLQlNTV9JTkZPKCJ2b2ljZV90aHJlYWQoKSBzdGFydFxuIik7Ci0KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ2LT5jb21wbGV0ZSk7Ci0JCWluaXRfY29tcGxldGlvbigmdi0+Y29tcGxldGUpOwotCi0JCU1NX0RCRygiIHZvY19ldmVudD0lZCwgdm9pY2Ugc3RhdGUgPSVkLCBkZXZfZXZlbnQ9JWRcbiIsCi0JCQkJdi0+dm9jX2V2ZW50LCB2LT52b2Nfc3RhdGUsIHYtPmRldl9ldmVudCk7Ci0JCXN3aXRjaCAodi0+dm9jX2V2ZW50KSB7Ci0JCWNhc2UgVk9JQ0VfQUNRVUlSRV9TVEFSVDoKLQkJCS8qIGNoZWNrIGlmIGRldl9zdGF0ZSA9IFJFQURZICovCi0JCQkvKiBpZiByZWFkeSwgc2VuZCBkZXZpY2VfaW5mbyBhbmQgYWNxdWlyZV9kb25lICovCi0JCQkvKiBpZiBub3QgcmVhZHksIGJsb2NrIHRvIHdhaXQgdGhlIGRldl9zdGF0ZSA9IFJFQURZICovCi0JCQlpZiAoKHYtPnZvY19zdGF0ZSA9PSBWT0lDRV9JTklUKSB8fAotCQkJCSh2LT52b2Nfc3RhdGUgPT0gVk9JQ0VfUkVMRUFTRSkpIHsKLQkJCQlpZiAodi0+ZGV2X3N0YXRlID09IERFVl9SRUFEWSkgewotCQkJCQltdXRleF9sb2NrKCZ2b2ljZS52b2NfbG9jayk7Ci0JCQkJCXZvaWNlX2NoYW5nZV9zYW1wbGVfcmF0ZSh2KTsKLQkJCQkJcmMgPSB2b2ljZV9jbWRfZGV2aWNlX2luZm8odik7Ci0JCQkJCXJjID0gdm9pY2VfY21kX2FjcXVpcmVfZG9uZSh2KTsKLQkJCQkJdi0+dm9jX3N0YXRlID0gVk9JQ0VfQUNRVUlSRTsKLQkJCQkJbXV0ZXhfdW5sb2NrKCZ2b2ljZS52b2NfbG9jayk7Ci0JCQkJCWJyb2FkY2FzdF9ldmVudCgKLQkJCQkJQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEcsCi0JCQkJCVZPSUNFX1NUQVRFX0lOQ0FMTCwgU0VTU0lPTl9JR05PUkUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAotCQkJCQl2LT5kZXZfd2FpdCwKLQkJCQkJKHYtPmRldl9zdGF0ZSA9PSBERVZfUkVBRFkpCi0JCQkJCXx8IChhdG9taWNfcmVhZCgmdi0+cmVsX3N0YXJ0X2ZsYWcpCi0JCQkJCQk9PSAxKSk7Ci0JCQkJCWlmIChhdG9taWNfcmVhZCgmdi0+cmVsX3N0YXJ0X2ZsYWcpCi0JCQkJCQk9PSAxKSB7Ci0JCQkJCQl2LT52b2Nfc3RhdGUgPSBWT0lDRV9SRUxFQVNFOwotCQkJCQkJYXRvbWljX2RlYygmdi0+cmVsX3N0YXJ0X2ZsYWcpOwotCQkJCQkJbXNtX3NuZGRldl93aXRoZHJhd19mcmVxKDAsCi0JCQkJCQlTTkRERVZfQ0FQX1RYLCBBVURERVZfQ0xOVF9WT0MpOwotCQkJCQkJYnJvYWRjYXN0X2V2ZW50KAotCQkJCQkJQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEcsCi0JCQkJCQlWT0lDRV9TVEFURV9PRkZDQUxMLAotCQkJCQkJU0VTU0lPTl9JR05PUkUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbXV0ZXhfbG9jaygmdm9pY2Uudm9jX2xvY2spOwotCQkJCQkJdm9pY2VfY2hhbmdlX3NhbXBsZV9yYXRlKHYpOwotCQkJCQkJcmMgPSB2b2ljZV9jbWRfZGV2aWNlX2luZm8odik7Ci0JCQkJCQlyYyA9IHZvaWNlX2NtZF9hY3F1aXJlX2RvbmUodik7Ci0JCQkJCQl2LT52b2Nfc3RhdGUgPSBWT0lDRV9BQ1FVSVJFOwotCQkJCQkJbXV0ZXhfdW5sb2NrKCZ2b2ljZS52b2NfbG9jayk7Ci0JCQkJCQlicm9hZGNhc3RfZXZlbnQoCi0JCQkJCQlBVURERVZfRVZUX1ZPSUNFX1NUQVRFX0NIRywKLQkJCQkJCVZPSUNFX1NUQVRFX0lOQ0FMTCwKLQkJCQkJCVNFU1NJT05fSUdOT1JFKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZQotCQkJCU1NX0VSUigiR2V0IHRoaXMgZXZlbnQgYXQgdGhlIHdyb25nIHN0YXRlXG4iKTsKLQkJCWlmIChhdG9taWNfcmVhZCgmdi0+YWNxX3N0YXJ0X2ZsYWcpKQotCQkJCWF0b21pY19kZWMoJnYtPmFjcV9zdGFydF9mbGFnKTsKLQkJCWJyZWFrOwotCQljYXNlIFZPSUNFX1JFTEVBU0VfU1RBUlQ6Ci0JCQlNTV9EQkcoImJyb2FkY2FzdCB2b2ljZSBjYWxsIGVuZFxuIik7Ci0JCQlicm9hZGNhc3RfZXZlbnQoQVVEREVWX0VWVF9WT0lDRV9TVEFURV9DSEcsCi0JCQkJCVZPSUNFX1NUQVRFX09GRkNBTEwsIFNFU1NJT05fSUdOT1JFKTsKLQkJCWlmICgodi0+ZGV2X3N0YXRlID09IERFVl9SRUxfRE9ORSkgfHwKLQkJCQkJKHYtPmRldl9zdGF0ZSA9PSBERVZfSU5JVCkpIHsKLQkJCQl2LT52b2Nfc3RhdGUgPSBWT0lDRV9SRUxFQVNFOwotCQkJCW1zbV9zbmRkZXZfd2l0aGRyYXdfZnJlcSgwLCBTTkRERVZfQ0FQX1RYLAotCQkJCQlBVURERVZfQ0xOVF9WT0MpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiB3YWl0IGZvciB0aGUgZGV2X3N0YXRlID0gUkVMRUFTRSAqLwotCQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHYtPmRldl93YWl0LAotCQkJCQkodi0+ZGV2X3N0YXRlID09IERFVl9SRUxfRE9ORSkKLQkJCQl8fCAoYXRvbWljX3JlYWQoJnYtPmFjcV9zdGFydF9mbGFnKSA9PSAxKSk7Ci0JCQkJaWYgKGF0b21pY19yZWFkKCZ2LT5hY3Ffc3RhcnRfZmxhZykgPT0gMSkKLQkJCQkJYXRvbWljX2RlYygmdi0+YWNxX3N0YXJ0X2ZsYWcpOwotCQkJCXYtPnZvY19zdGF0ZSA9IFZPSUNFX1JFTEVBU0U7Ci0JCQkJbXNtX3NuZGRldl93aXRoZHJhd19mcmVxKDAsIFNORERFVl9DQVBfVFgsCi0JCQkJCUFVRERFVl9DTE5UX1ZPQyk7Ci0JCQl9Ci0JCQlpZiAoYXRvbWljX3JlYWQoJnYtPnJlbF9zdGFydF9mbGFnKSkKLQkJCQlhdG9taWNfZGVjKCZ2LT5yZWxfc3RhcnRfZmxhZyk7Ci0JCQlicmVhazsKLQkJY2FzZSBWT0lDRV9DSEFOR0VfU1RBUlQ6Ci0JCQlpZiAodi0+dm9jX3N0YXRlID09IFZPSUNFX0FDUVVJUkUpCi0JCQkJdi0+dm9jX3N0YXRlID0gVk9JQ0VfQ0hBTkdFOwotCQkJZWxzZQotCQkJCU1NX0VSUigiR2V0IHRoaXMgZXZlbnQgYXQgdGhlIHdyb25nIHN0YXRlXG4iKTsKLQkJCXdha2VfdXAoJnYtPnZvY193YWl0KTsKLQkJCWlmIChhdG9taWNfcmVhZCgmdi0+Y2hnX3N0YXJ0X2ZsYWcpKQotCQkJCWF0b21pY19kZWMoJnYtPmNoZ19zdGFydF9mbGFnKTsKLQkJCWJyZWFrOwotCQljYXNlIFZPSUNFX05FVFdPUktfUkVDT05GSUc6Ci0JCQlpZiAoKHYtPnZvY19zdGF0ZSA9PSBWT0lDRV9BQ1FVSVJFKQotCQkJCXx8ICh2LT52b2Nfc3RhdGUgPT0gVk9JQ0VfQ0hBTkdFKSkgewotCQkJCXZvaWNlX2NoYW5nZV9zYW1wbGVfcmF0ZSh2KTsKLQkJCQlyYyA9IHZvaWNlX2NtZF9kZXZpY2VfaW5mbyh2KTsKLQkJCQlyYyA9IHZvaWNlX2NtZF9hY3F1aXJlX2RvbmUodik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3dpdGNoICh2LT5kZXZfZXZlbnQpIHsKLQkJY2FzZSBERVZfQ0hBTkdFX1JFQURZOgotCQkJaWYgKHYtPnZvY19zdGF0ZSA9PSBWT0lDRV9DSEFOR0UpIHsKLQkJCQltdXRleF9sb2NrKCZ2b2ljZS52b2NfbG9jayk7Ci0JCQkJbXNtX3NuZGRldl9lbmFibGVfc2lkZXRvbmUodi0+ZGV2X3J4LmRldl9pZCwKLQkJCQkxKTsKLQkJCQkvKiB1cGRhdGUgdm9pY2Ugc3RhdGUgKi8KLQkJCQl2LT52b2Nfc3RhdGUgPSBWT0lDRV9BQ1FVSVJFOwotCQkJCXYtPmRldl9ldmVudCA9IDA7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZ2b2ljZS52b2NfbG9jayk7Ci0JCQkJYnJvYWRjYXN0X2V2ZW50KEFVRERFVl9FVlRfVk9JQ0VfU1RBVEVfQ0hHLAotCQkJCQlWT0lDRV9TVEFURV9JTkNBTEwsIFNFU1NJT05fSUdOT1JFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbXV0ZXhfbG9jaygmdm9pY2Uudm9jX2xvY2spOwotCQkJCXYtPmRldl9ldmVudCA9IDA7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZ2b2ljZS52b2NfbG9jayk7Ci0JCQkJTU1fRVJSKCJHZXQgdGhpcyBldmVudCBhdCB0aGUgd3Jvbmcgc3RhdGVcbiIpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQltdXRleF9sb2NrKCZ2b2ljZS52b2NfbG9jayk7Ci0JCQl2LT5kZXZfZXZlbnQgPSAwOwotCQkJbXV0ZXhfdW5sb2NrKCZ2b2ljZS52b2NfbG9jayk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgdm9pY2VfaW5pdCh2b2lkKQotewotCWludCByYywgaTsKLQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9ICZ2b2ljZTsKLQlNTV9JTkZPKCJcbiIpOyAvKiBNYWNybyBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgZnVuY3Rpb24gKi8KLQotCW11dGV4X2luaXQoJnZvaWNlLnZvY19sb2NrKTsKLQltdXRleF9pbml0KCZ2b2ljZS52b2xfbG9jayk7Ci0Jdi0+aGFuZGxlID0gTlVMTDsKLQl2LT5jYl9oYW5kbGUgPSBOVUxMOwotCi0JLyogc2V0IGRlZmF1bHQgdmFsdWUgKi8KLQl2LT5kZWZhdWx0X211dGVfdmFsID0gMTsgIC8qIGRlZmF1bHQgaXMgbXV0ZSAqLwotCXYtPmRlZmF1bHRfdm9sX3ZhbCA9IDA7Ci0Jdi0+ZGVmYXVsdF9zYW1wbGVfdmFsID0gODAwMDsKLQlmb3IgKGkgPSAwOyBpIDwgVk9DX1JYX1ZPTF9BUlJBWV9OVU07IGkrKykgewotCQl2LT5tYXhfcnhfdm9sW2ldID0gMDsKLQkJdi0+bWluX3J4X3ZvbFtpXSA9IDA7Ci0JfQotCXYtPm5ldHdvcmsgPSBORVRXT1JLX0dTTTsKLQotCS8qIGluaXRpYWxpemUgZGV2X3J4IGFuZCBkZXZfdHggKi8KLQltZW1zZXQoJnYtPmRldl90eCwgMCwgc2l6ZW9mKHN0cnVjdCBkZXZpY2VfZGF0YSkpOwotCW1lbXNldCgmdi0+ZGV2X3J4LCAwLCBzaXplb2Yoc3RydWN0IGRldmljZV9kYXRhKSk7Ci0Jdi0+ZGV2X3J4LnZvbHVtZSA9IHYtPmRlZmF1bHRfdm9sX3ZhbDsKLQl2LT5kZXZfdHgubXV0ZSA9IHYtPmRlZmF1bHRfbXV0ZV92YWw7Ci0KLQl2LT5kZXZfc3RhdGUgPSBERVZfSU5JVDsKLQl2LT52b2Nfc3RhdGUgPSBWT0lDRV9JTklUOwotCWF0b21pY19zZXQoJnYtPnJlbF9zdGFydF9mbGFnLCAwKTsKLQlhdG9taWNfc2V0KCZ2LT5hY3Ffc3RhcnRfZmxhZywgMCk7Ci0Jdi0+ZGV2X2V2ZW50ID0gMDsKLQl2LT52b2NfZXZlbnQgPSAwOwotCWluaXRfY29tcGxldGlvbigmdm9pY2UuY29tcGxldGUpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnYtPmRldl93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2LT52b2Nfd2FpdCk7Ci0KLQkgLyogZ2V0IGRldmljZSBoYW5kbGUgKi8KLQlyYyA9IGRhbGRldmljZV9hdHRhY2goVk9JQ0VfREFMUlBDX0RFVklDRUlELAotCQkJCVZPSUNFX0RBTFJQQ19QT1JUX05BTUUsCi0JCQkJVk9JQ0VfREFMUlBDX0NQVSwKLQkJCQkmdi0+aGFuZGxlKTsKLQlpZiAocmMpIHsKLQkJTU1fRVJSKCJWb2MgREFMUlBDIGNhbGwgdG8gTW9kZW0gYXR0YWNoIGZhaWxlZFxuIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgY2FsbGJhY2sgaGFuZGxlICovCi0Jdi0+Y2JfaGFuZGxlID0gZGFscnBjX2FsbG9jX2NiKHYtPmhhbmRsZSwgcmVtb3RlX2NiX2Z1bmN0aW9uLCB2KTsKLQlpZiAodi0+Y2JfaGFuZGxlID09IE5VTEwpIHsKLQkJTU1fRVJSKCJBbGxvY2F0ZSBDYWxsYmFjayBmYWlsdXJlXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JLyogc2V0dXAgdGhlIGNhbGxiYWNrICovCi0JcmMgPSB2b2ljZV9jbWRfaW5pdCh2KTsKLQlpZiAocmMpCi0JCWdvdG8gZXJyMTsKLQotCXYtPmRldmljZV9ldmVudHMgPSBBVURERVZfRVZUX0RFVl9DSEdfVk9JQ0UgfAotCQkJQVVEREVWX0VWVF9ERVZfUkRZIHwKLQkJCUFVRERFVl9FVlRfUkVMX1BFTkRJTkcgfAotCQkJQVVEREVWX0VWVF9TVEFSVF9WT0lDRSB8Ci0JCQlBVURERVZfRVZUX0VORF9WT0lDRSB8Ci0JCQlBVURERVZfRVZUX0RFVklDRV9WT0xfTVVURV9DSEcgfAotCQkJQVVEREVWX0VWVF9GUkVRX0NIRzsKLQotCU1NX0RCRygiIHRvIHJlZ2lzdGVyIGNhbGwgYmFjayBcbiIpOwotCS8qIHJlZ2lzdGVyIGNhbGxiYWNrIHRvIGF1ZGRldiAqLwotCWF1ZGRldl9yZWdpc3Rlcl9ldnRfbGlzdG5lcih2LT5kZXZpY2VfZXZlbnRzLCBBVURERVZfQ0xOVF9WT0MsCi0JCQkJMCwgdm9pY2VfYXVkZGV2X2NiX2Z1bmN0aW9uLCB2KTsKLQotCS8qIGNyZWF0ZSBhbmQgc3RhcnQgdGhyZWFkICovCi0Jdi0+dGFzayA9IGt0aHJlYWRfcnVuKHZvaWNlX3RocmVhZCwgdiwgInZvaWNlIik7Ci0JaWYgKElTX0VSUih2LT50YXNrKSkgewotCQlyYyA9IFBUUl9FUlIodi0+dGFzayk7Ci0JCXYtPnRhc2sgPSBOVUxMOwotCX0gZWxzZQotCQlnb3RvIGRvbmU7Ci0KLWVycjE6ICAgZGFscnBjX2RlYWxsb2NfY2Iodi0+aGFuZGxlLCB2LT5jYl9oYW5kbGUpOwotZXJyOgotCWRhbGRldmljZV9kZXRhY2godi0+aGFuZGxlKTsKLQl2LT5oYW5kbGUgPSBOVUxMOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLWxhdGVfaW5pdGNhbGwodm9pY2VfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTU1NjEyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotb2JqLXkgKz0gZGFsLm8KLW9iai15ICs9IHE2YXVkaW8ubwotb2JqLXkgKz0gYW5hbG9nX2F1ZGlvLm8KLW9iai15ICs9IHBjbV9vdXQubwotb2JqLXkgKz0gcGNtX2luLm8KLW9iai15ICs9IGF1eHBjbV9sYl9vdXQubwotb2JqLXkgKz0gYXV4cGNtX2xiX2luLm8KLW9iai15ICs9IGFhY19pbi5vCi1vYmoteSArPSBxY2VscF9pbi5vCi1vYmoteSArPSBldnJjX2luLm8KLW9iai15ICs9IGFtcm5iX2luLm8KLW9iai15ICs9IG1wMy5vCi1vYmoteSArPSBkdG1mLm8KLW9iai15ICs9IHJvdXRpbmcubwotb2JqLXkgKz0gYXVkaW9fY3RsLm8KLW9iai15ICs9IG1zbV9xNnZkZWMubwotb2JqLXkgKz0gbXNtX3E2dmVuYy5vCi1vYmoteSArPSBkc3BfZGVidWcubwotb2JqLSQoQ09ORklHX1FTRF9BVURJTykgKz0gYXVkaW92Mi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2FhY19pbi5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYWFjX2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlM2JmOTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYWFjX2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOSBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19hYWMuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9xZHNwNl9hdWRpby5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLQotI2RlZmluZSBBQUNfRkNfQlVGRl9DTlQgMTAKLSNkZWZpbmUgQUFDX1JFQURfVElNRU9VVCAyMDAwCi1zdHJ1Y3QgYWFjX2ZjX2J1ZmYgewotCXN0cnVjdCBtdXRleCBsb2NrOwotCWludCBlbXB0eTsKLQl2b2lkICpkYXRhOwotCWludCBzaXplOwotCWludCBhY3R1YWxfc2l6ZTsKLX07Ci0KLXN0cnVjdCBhYWNfZmMgewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBmY193cTsKLQlzdHJ1Y3QgYWFjX2ZjX2J1ZmYgZmNfYnVmZltBQUNfRkNfQlVGRl9DTlRdOwotCWludCBidWZmX2luZGV4OwotfTsKLXN0cnVjdCBhYWMgewotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcgY2ZnOwotCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBzdHJfY2ZnOwotCXN0cnVjdCBhdWRpb19jbGllbnQgKmF1ZGlvX2NsaWVudDsKLQlzdHJ1Y3QgbXNtX3ZvaWNlcmVjX21vZGUgdm9pY2VyZWNfbW9kZTsKLQlzdHJ1Y3QgYWFjX2ZjICphYWNfZmM7Ci19OwotCi1zdGF0aWMgaW50IHE2X2FhY19mbG93Y29udHJvbCh2b2lkICpkYXRhKQotewotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCXN0cnVjdCBhdWRpb19idWZmZXIgKmFiOwotCXN0cnVjdCBhYWMgKmFhYyA9IGRhdGE7Ci0JaW50IGJ1ZmZfaW5kZXggPSAwOwotCWludCB4ZmVyID0gMDsKLQlzdHJ1Y3QgYWFjX2ZjICpmYzsKLQotCi0JYWMgPSBhYWMtPmF1ZGlvX2NsaWVudDsKLQlmYyA9IGFhYy0+YWFjX2ZjOwotCWlmICghYWMpIHsKLQkJcHJfZXJyKCJbJXM6JXNdIGF1ZGlvX2NsaWVudCBpcyBOVUxMXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQlhYiA9IGFjLT5idWYgKyBhYy0+Y3B1X2J1ZjsKLQkJaWYgKGFiLT51c2VkKQotCQkJd2FpdF9ldmVudChhYy0+d2FpdCwgKGFiLT51c2VkID09IDApKTsKLQkJcHJfZGVidWcoIlslczolc10gYWItPmRhdGEgPSAlcCwgY3B1X2J1ZiA9ICVkXG4iLCBfX01NX0ZJTEVfXywKLQkJCSBfX2Z1bmNfXywgYWItPmRhdGEsIGFjLT5jcHVfYnVmKTsKLQkJeGZlciA9IGFiLT5hY3R1YWxfc2l6ZTsKLQotCQltdXRleF9sb2NrKCYoZmMtPmZjX2J1ZmZbYnVmZl9pbmRleF0ubG9jaykpOwotCQlpZiAoIWZjLT5mY19idWZmW2J1ZmZfaW5kZXhdLmVtcHR5KSB7Ci0JCQlwcl9lcnIoIlslczolc10gZmxvdyBjb250cm9sIGJ1ZmZlclslZF0gbm90IHJlYWQhXG4iLAotCQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18sIGJ1ZmZfaW5kZXgpOwotCQl9Ci0KLQkJaWYgKGZjLT5mY19idWZmW2J1ZmZfaW5kZXhdLnNpemUgPCB4ZmVyKSB7Ci0JCQlwcl9lcnIoIlslczolc10gYnVmZmVyICVkIHRvbyBzbWFsbFxuIiwgX19NTV9GSUxFX18sCi0JCQkJCV9fZnVuY19fLCBidWZmX2luZGV4KTsKLQkJCW1lbWNweShmYy0+ZmNfYnVmZltidWZmX2luZGV4XS5kYXRhLAotCQkJCWFiLT5kYXRhLCBmYy0+ZmNfYnVmZltidWZmX2luZGV4XS5zaXplKTsKLQkJCWZjLT5mY19idWZmW2J1ZmZfaW5kZXhdLmVtcHR5ID0gMDsKLQkJCWZjLT5mY19idWZmW2J1ZmZfaW5kZXhdLmFjdHVhbF9zaXplID0KLQkJCQlmYy0+ZmNfYnVmZltidWZmX2luZGV4XS5zaXplOwotCQl9IGVsc2UgewotCQkJbWVtY3B5KGZjLT5mY19idWZmW2J1ZmZfaW5kZXhdLmRhdGEsIGFiLT5kYXRhLCB4ZmVyKTsKLQkJCWZjLT5mY19idWZmW2J1ZmZfaW5kZXhdLmVtcHR5ID0gMDsKLQkJCWZjLT5mY19idWZmW2J1ZmZfaW5kZXhdLmFjdHVhbF9zaXplID0geGZlcjsKLQkJfQotCQltdXRleF91bmxvY2soJihmYy0+ZmNfYnVmZltidWZmX2luZGV4XS5sb2NrKSk7Ci0JCS8qd2FrZSB1cCBjbGllbnQsIGlmIGFueSovCi0JCXdha2VfdXAoJmZjLT5mY193cSk7Ci0KLQkJYnVmZl9pbmRleCsrOwotCQlpZiAoYnVmZl9pbmRleCA+PSBBQUNfRkNfQlVGRl9DTlQpCi0JCQlidWZmX2luZGV4ID0gMDsKLQotCQlhYi0+dXNlZCA9IDE7Ci0KLQkJcTZhdWRpb19yZWFkKGFjLCBhYik7Ci0JCWFjLT5jcHVfYnVmIF49IDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgbG9uZyBxNl9hYWNfaW5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhYWMgKmFhYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCWludCBpID0gMDsKLQlzdHJ1Y3QgYWFjX2ZjICpmYzsKLQlpbnQgc2l6ZSA9IDA7Ci0KLQltdXRleF9sb2NrKCZhYWMtPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9TVEFUUzoKLQl7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCXByX2RlYnVnKCJbJXM6JXNdIEdFVF9TVEFUU1xuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIEFVRElPX1NUQVJUOgotCXsKLQkJdWludDMyX3QgYWNkYl9pZDsKLQkJcHJfZGVidWcoIlslczolc10gQVVESU9fU1RBUlRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCWlmIChhcmcgPT0gMCkgewotCQkJYWNkYl9pZCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmFjZGJfaWQsICh2b2lkICopIGFyZywKLQkJCQkJc2l6ZW9mKGFjZGJfaWQpKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoYWFjLT5hdWRpb19jbGllbnQpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJcHJfZXJyKCJbJXM6JXNdIGFjdGl2ZSBzZXNzaW9uIGFscmVhZHkgZXhpc3RpbmdcbiIsCi0JCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJYWFjLT5hdWRpb19jbGllbnQgPSBxNmF1ZGlvX29wZW5fYWFjKAotCQkJCQlhYWMtPnN0cl9jZmcuYnVmZmVyX3NpemUsCi0JCQkJCWFhYy0+Y2ZnLnNhbXBsZV9yYXRlLAotCQkJCQlhYWMtPmNmZy5jaGFubmVscywKLQkJCQkJYWFjLT5jZmcuYml0X3JhdGUsCi0JCQkJCWFhYy0+Y2ZnLnN0cmVhbV9mb3JtYXQsCi0JCQkJCWFhYy0+dm9pY2VyZWNfbW9kZS5yZWNfbW9kZSwgYWNkYl9pZCk7Ci0KLQkJCWlmIChhYWMtPmF1ZGlvX2NsaWVudCA8IDApIHsKLQkJCQlwcl9lcnIoIlslczolc10gYWFjIG9wZW4gc2Vzc2lvbiBmYWlsZWRcbiIsCi0JCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCQkJcmMgPSAtRU5PTUVNOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLyphbGxvY2F0ZSBmbG93IGNvbnRyb2wgYnVmZmVycyovCi0JCWZjID0gYWFjLT5hYWNfZmM7Ci0JCXNpemUgPSAoKGFhYy0+c3RyX2NmZy5idWZmZXJfc2l6ZSA8IDE1NDMpID8gMTU0MyA6Ci0JCQkJYWFjLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplKTsKLQkJZm9yIChpID0gMDsgaSA8IEFBQ19GQ19CVUZGX0NOVDsgKytpKSB7Ci0JCQltdXRleF9pbml0KCYoZmMtPmZjX2J1ZmZbaV0ubG9jaykpOwotCQkJZmMtPmZjX2J1ZmZbaV0uZW1wdHkgPSAxOwotCQkJZmMtPmZjX2J1ZmZbaV0uZGF0YSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoZmMtPmZjX2J1ZmZbaV0uZGF0YSA9PSBOVUxMKSB7Ci0JCQkJcHJfZXJyKCJbJXM6JXNdIE5vIG1lbW9yeSBmb3IgRkMgYnVmZmVyc1xuIiwKLQkJCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCQkJcmMgPSAtRU5PTUVNOwotCQkJCWdvdG8gZmNfZmFpbDsKLQkJCX0KLQkJCWZjLT5mY19idWZmW2ldLnNpemUgPSBzaXplOwotCQkJZmMtPmZjX2J1ZmZbaV0uYWN0dWFsX3NpemUgPSAwOwotCQl9Ci0KLQkJLypjcmVhdGUgZmxvdyBjb250cm9sIHRocmVhZCovCi0JCWZjLT50YXNrID0ga3RocmVhZF9ydW4ocTZfYWFjX2Zsb3djb250cm9sLAotCQkJCWFhYywgImFhY19mbG93Y29udHJvbCIpOwotCQlpZiAoSVNfRVJSKGZjLT50YXNrKSkgewotCQkJcmMgPSBQVFJfRVJSKGZjLT50YXNrKTsKLQkJCXByX2VycigiWyVzOiVzXSBlcnJvciBjcmVhdGluZyBmbG93IGNvbnRyb2wgdGhyZWFkXG4iLAotCQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQkJZ290byBmY19mYWlsOwotCQl9Ci0JCWJyZWFrOwotZmNfZmFpbDoKLQkJLypmcmVlIGZsb3cgY29udHJvbCBidWZmZXJzKi8KLQkJLS1pOwotCQlmb3IgKDsgaSA+PSAgMDsgaS0tKSB7Ci0JCQlrZnJlZShmYy0+ZmNfYnVmZltpXS5kYXRhKTsKLQkJCWZjLT5mY19idWZmW2ldLmRhdGEgPSBOVUxMOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NUT1A6Ci0JCXByX2RlYnVnKCJbJXM6JXNdIEFVRElPX1NUT1BcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fRkxVU0g6Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX0lOQ0FMTDogewotCQlwcl9kZWJ1ZygiWyVzOiVzXSBTRVRfSU5DQUxMXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmFhYy0+dm9pY2VyZWNfbW9kZSwKLQkJCSh2b2lkICopYXJnLCBzaXplb2Yoc3RydWN0IG1zbV92b2ljZXJlY19tb2RlKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0KLQkJaWYgKGFhYy0+dm9pY2VyZWNfbW9kZS5yZWNfbW9kZSAhPSBBVURJT19GTEFHX1JFQUQKLQkJCSYmIGFhYy0+dm9pY2VyZWNfbW9kZS5yZWNfbW9kZSAhPQotCQkJQVVESU9fRkxBR19JTkNBTExfTUlYRUQpIHsKLQkJCWFhYy0+dm9pY2VyZWNfbW9kZS5yZWNfbW9kZSA9IEFVRElPX0ZMQUdfUkVBRDsKLQkJCXByX2VycigiWyVzOiVzXSBJbnZhbGlkIHJlY19tb2RlXG4iLCBfX01NX0ZJTEVfXywKLQkJCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9TVFJFQU1fQ09ORklHOgotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYWFjLT5zdHJfY2ZnLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlwcl9kZWJ1ZygiWyVzOiVzXSBHRVRfU1RSRUFNX0NPTkZJRzogYnVmZnN6PSVkLCBidWZmY250PSVkXG4iLAotCQkJIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywgYWFjLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplLAotCQkJYWFjLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX1NUUkVBTV9DT05GSUc6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYWFjLT5zdHJfY2ZnLCAodm9pZCAqKWFyZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJcHJfZGVidWcoIlslczolc10gU0VUX1NUUkVBTV9DT05GSUc6IGJ1ZmZzej0lZCwgYnVmZmNudD0lZFxuIiwKLQkJCSBfX01NX0ZJTEVfXywgX19mdW5jX18sIGFhYy0+c3RyX2NmZy5idWZmZXJfc2l6ZSwKLQkJCWFhYy0+c3RyX2NmZy5idWZmZXJfY291bnQpOwotCQlpZiAoYWFjLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplIDwgMTU0MykgewotCQkJcHJfZXJyKCJbJXM6JXNdIEJ1ZmZlciBzaXplIHRvbyBzbWFsbFxuIiwgX19NTV9GSUxFX18sCi0JCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChhYWMtPnN0cl9jZmcuYnVmZmVyX2NvdW50ICE9IDIpCi0JCQlwcl9pbmZvKCJbJXM6JXNdIEJ1ZmZlciBjb3VudCBzZXQgdG8gMlxuIiwgX19NTV9GSUxFX18sCi0JCQkJCV9fZnVuY19fKTsKLQotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9BQUNfRU5DX0NPTkZJRzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhYWMtPmNmZywgKHZvaWQgKikgYXJnLAotCQkJCSBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19hYWNfZW5jX2NvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJcHJfZGVidWcoIlslczolc10gU0VUX0FBQ19FTkNfQ09ORklHOiBjaGFubmVscz0lZCwgcmF0ZT0lZFxuIiwKLQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXywgYWFjLT5jZmcuY2hhbm5lbHMsCi0JCQlhYWMtPmNmZy5zYW1wbGVfcmF0ZSk7Ci0JCWlmIChhYWMtPmNmZy5jaGFubmVscyA8IDEgfHwgYWFjLT5jZmcuY2hhbm5lbHMgPiAyKSB7Ci0JCQlwcl9lcnIoIlslczolc11pbnZhbGlkIG51bWJlciBvZiBjaGFubmVsc1xuIiwKLQkJCQkgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJfQotCQlpZiAoYWFjLT5jZmcuc2FtcGxlX3JhdGUgIT0gNDgwMDApIHsKLQkJCXByX2VycigiWyVzOiVzXSBvbmx5IDQ4S0h6IGlzIHN1cHBvcnRlZFxuIiwKLQkJCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJfQotCQlpZiAoYWFjLT5jZmcuc3RyZWFtX2Zvcm1hdCAhPSBBVURJT19BQUNfRk9STUFUX1JBVyAmJgotCQkJYWFjLT5jZmcuc3RyZWFtX2Zvcm1hdCAhPSBBVURJT19BQUNfRk9STUFUX0FEVFMpIHsKLQkJCXByX2VycigiWyVzOiVzXSB1bnN1cHBvcnRlZCBBQUMgZm9ybWF0XG4iLCBfX01NX0ZJTEVfXywKLQkJCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fR0VUX0FBQ19FTkNfQ09ORklHOgotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmFhYy0+Y2ZnLAotCQkJCSBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19hYWNfZW5jX2NvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJcHJfZGVidWcoIlslczolc10gR0VUX0FBQ19FTkNfQ09ORklHOiBjaGFubmVscz0lZCwgcmF0ZT0lZFxuIiwKLQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXywgYWFjLT5jZmcuY2hhbm5lbHMsCi0JCQlhYWMtPmNmZy5zYW1wbGVfcmF0ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF91bmxvY2soJmFhYy0+bG9jayk7Ci0JcHJfZGVidWcoIlslczolc10gcmMgPSAlZFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHE2X2FhY19pbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCi0Jc3RydWN0IGFhYyAqYWFjOwotCXN0cnVjdCBhYWNfZmMgKmZjOwotCWludCBpOwotCXByX2luZm8oIlslczolc10gb3BlblxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQlhYWMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWFjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGFhYyA9PSBOVUxMKSB7Ci0JCXByX2VycigiWyVzOiVzXSBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhYWMgZHJpdmVyXG4iLAotCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW11dGV4X2luaXQoJmFhYy0+bG9jayk7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYWFjOwotCWFhYy0+YXVkaW9fY2xpZW50ID0gTlVMTDsKLQlhYWMtPnN0cl9jZmcuYnVmZmVyX3NpemUgPSAxNTQzOwotCWFhYy0+c3RyX2NmZy5idWZmZXJfY291bnQgPSAyOwotCWFhYy0+Y2ZnLmNoYW5uZWxzID0gMTsKLQlhYWMtPmNmZy5iaXRfcmF0ZSA9IDE5MjAwMDsKLQlhYWMtPmNmZy5zdHJlYW1fZm9ybWF0ID0gQVVESU9fQUFDX0ZPUk1BVF9BRFRTOwotCWFhYy0+Y2ZnLnNhbXBsZV9yYXRlID0gNDgwMDA7Ci0JYWFjLT52b2ljZXJlY19tb2RlLnJlY19tb2RlID0gQVVESU9fRkxBR19SRUFEOwotCi0JYWFjLT5hYWNfZmMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWFjX2ZjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGFhYy0+YWFjX2ZjID09IE5VTEwpIHsKLQkJcHJfZXJyKCJbJXM6JXNdIENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFhY19mY1xuIiwKLQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlrZnJlZShhYWMpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JZmMgPSBhYWMtPmFhY19mYzsKLQlmYy0+dGFzayA9IE5VTEw7Ci0JZmMtPmJ1ZmZfaW5kZXggPSAwOwotCWZvciAoaSA9IDA7IGkgPCBBQUNfRkNfQlVGRl9DTlQ7ICsraSkgewotCQlmYy0+ZmNfYnVmZltpXS5kYXRhID0gTlVMTDsKLQkJZmMtPmZjX2J1ZmZbaV0uc2l6ZSA9IDA7Ci0JCWZjLT5mY19idWZmW2ldLmFjdHVhbF9zaXplID0gMDsKLQl9Ci0JLyppbml0aWFsaXplIHdhaXQgcXVldWUgaGVhZCovCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmZmMtPmZjX3dxKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgcTZfYWFjX2luX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXN0cnVjdCBhYWMgKmFhYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYWFjX2ZjICpmYzsKLQlpbnQgeGZlciA9IDA7Ci0JaW50IHJlcyA9IDA7Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXSBjb3VudCA9ICVkXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIGNvdW50KTsKLQltdXRleF9sb2NrKCZhYWMtPmxvY2spOwotCWFjID0gYWFjLT5hdWRpb19jbGllbnQ7Ci0KLQlpZiAoIWFjKSB7Ci0JCXJlcyA9IC1FTk9ERVY7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JZmMgPSBhYWMtPmFhY19mYzsKLQotCS8qd2FpdCBmb3IgYnVmZmVyIHRvIGZ1bGwqLwotCWlmIChmYy0+ZmNfYnVmZltmYy0+YnVmZl9pbmRleF0uZW1wdHkgIT0gMCkgewotCQlyZXMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChmYy0+ZmNfd3EsCi0JCQkoZmMtPmZjX2J1ZmZbZmMtPmJ1ZmZfaW5kZXhdLmVtcHR5ID09IDApLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoQUFDX1JFQURfVElNRU9VVCkpOwotCi0JCXByX2RlYnVnKCJbJXM6JXNdIGJ1ZmZfaW5kZXggPSAlZFxuIiwgX19NTV9GSUxFX18sCi0JCQlfX2Z1bmNfXywgZmMtPmJ1ZmZfaW5kZXgpOwotCQlpZiAocmVzID09IDApIHsKLQkJCXByX2VycigiWyVzOiVzXSBUaW1lb3V0IVxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCXJlcyA9IC1FVElNRURPVVQ7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0gZWxzZSBpZiAocmVzIDwgMCkgewotCQkJcHJfZXJyKCJbJXM6JXNdIFJldHVybmluZyBvbiBJbnRlcnJ1cHRcbiIsIF9fTU1fRklMRV9fLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCX0KLQkvKmxvY2sgdGhlIGJ1ZmZlciovCi0JbXV0ZXhfbG9jaygmKGZjLT5mY19idWZmW2ZjLT5idWZmX2luZGV4XS5sb2NrKSk7Ci0JeGZlciA9IGZjLT5mY19idWZmW2ZjLT5idWZmX2luZGV4XS5hY3R1YWxfc2l6ZTsKLQotCWlmICh4ZmVyID4gY291bnQpIHsKLQkJbXV0ZXhfdW5sb2NrKCYoZmMtPmZjX2J1ZmZbZmMtPmJ1ZmZfaW5kZXhdLmxvY2spKTsKLQkJcHJfZXJyKCJbJXM6JXNdIHJlYWQgZmFpbGVkISBieXRlIGNvdW50IHRvbyBzbWFsbFxuIiwKLQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlyZXMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaWYgKGNvcHlfdG9fdXNlcihidWYsIGZjLT5mY19idWZmW2ZjLT5idWZmX2luZGV4XS5kYXRhLAl4ZmVyKSkgewotCQltdXRleF91bmxvY2soJihmYy0+ZmNfYnVmZltmYy0+YnVmZl9pbmRleF0ubG9jaykpOwotCQlwcl9lcnIoIlslczolc10gY29weV90b191c2VyIGZhaWxlZCBhdCBpbmRleCAlZFxuIiwKLQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18sIGZjLT5idWZmX2luZGV4KTsKLQkJcmVzID0gLUVGQVVMVDsKLQkJZ290byBmYWlsOwotCX0KLQotCWJ1ZiArPSB4ZmVyOwotCi0JZmMtPmZjX2J1ZmZbZmMtPmJ1ZmZfaW5kZXhdLmVtcHR5ID0gMTsKLQlmYy0+ZmNfYnVmZltmYy0+YnVmZl9pbmRleF0uYWN0dWFsX3NpemUgPSAwOwotCi0JbXV0ZXhfdW5sb2NrKCYoZmMtPmZjX2J1ZmZbZmMtPmJ1ZmZfaW5kZXhdLmxvY2spKTsKLQkrKyhmYy0+YnVmZl9pbmRleCk7Ci0JaWYgKGZjLT5idWZmX2luZGV4ID49IEFBQ19GQ19CVUZGX0NOVCkKLQkJZmMtPmJ1ZmZfaW5kZXggPSAwOwotCi0JcmVzID0gYnVmIC0gc3RhcnQ7Ci1mYWlsOgotCW11dGV4X3VubG9jaygmYWFjLT5sb2NrKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgcTZfYWFjX2luX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYWFjICphYWMgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IGkgPSAwOwotCXN0cnVjdCBhYWNfZmMgKmZjOwotCi0JbXV0ZXhfbG9jaygmYWFjLT5sb2NrKTsKLQlmYyA9IGFhYy0+YWFjX2ZjOwotCWt0aHJlYWRfc3RvcChmYy0+dGFzayk7Ci0JZmMtPnRhc2sgPSBOVUxMOwotCi0JLypmcmVlIGZsb3cgY29udHJvbCBidWZmZXJzKi8KLQlmb3IgKGkgPSAwOyBpIDwgQUFDX0ZDX0JVRkZfQ05UOyArK2kpIHsKLQkJa2ZyZWUoZmMtPmZjX2J1ZmZbaV0uZGF0YSk7Ci0JCWZjLT5mY19idWZmW2ldLmRhdGEgPSBOVUxMOwotCX0KLQlrZnJlZShmYyk7Ci0JaWYgKGFhYy0+YXVkaW9fY2xpZW50KQotCQlyYyA9IHE2YXVkaW9fY2xvc2UoYWFjLT5hdWRpb19jbGllbnQpOwotCW11dGV4X3VubG9jaygmYWFjLT5sb2NrKTsKLQlrZnJlZShhYWMpOwotCXByX2luZm8oIlslczolc10gcmVsZWFzZVxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHE2X2FhY19pbl9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBxNl9hYWNfaW5fb3BlbiwKLQkucmVhZAkJPSBxNl9hYWNfaW5fcmVhZCwKLQkucmVsZWFzZQk9IHE2X2FhY19pbl9yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bAk9IHE2X2FhY19pbl9pb2N0bCwKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIHE2X2FhY19pbl9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fYWFjX2luIiwKLQkuZm9wcwk9ICZxNl9hYWNfaW5fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHE2X2FhY19pbl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJnE2X2FhY19pbl9taXNjKTsKLX0KLQotZGV2aWNlX2luaXRjYWxsKHE2X2FhY19pbl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2Ftcm5iX2luLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hbXJuYl9pbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjBiZjViLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2Ftcm5iX2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOSBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19hbXJuYi5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX3Fkc3A2X2F1ZGlvLmg+Ci0jaW5jbHVkZSAiZGFsX2F1ZGlvX2Zvcm1hdC5oIgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLQotc3RydWN0IGFtcm5iIHsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjIgY2ZnOwotCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBzdHJfY2ZnOwotCXN0cnVjdCBhdWRpb19jbGllbnQgKmF1ZGlvX2NsaWVudDsKLQlzdHJ1Y3QgbXNtX3ZvaWNlcmVjX21vZGUgdm9pY2VyZWNfbW9kZTsKLX07Ci0KLQotc3RhdGljIGxvbmcgcTZfYW1ybmJfaW5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGFtcm5iICphbXJuYiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JbXV0ZXhfbG9jaygmYW1ybmItPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlwcl9kZWJ1ZygiWyVzOiVzXSBTRVRfVk9MVU1FXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9TVEFUUzoKLQl7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCXByX2RlYnVnKCJbJXM6JXNdIEdFVF9TVEFUU1xuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIEFVRElPX1NUQVJUOgotCXsKLQkJdWludDMyX3QgYWNkYl9pZDsKLQkJcHJfZGVidWcoIlslczolc10gQVVESU9fU1RBUlRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCWlmIChhcmcgPT0gMCkgewotCQkJYWNkYl9pZCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmFjZGJfaWQsICh2b2lkICopIGFyZywKLQkJCQkJCXNpemVvZihhY2RiX2lkKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFtcm5iLT5hdWRpb19jbGllbnQpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJcHJfZXJyKCJbJXM6JXNdIGFjdGl2ZSBzZXNzaW9uIGFscmVhZHkgZXhpc3RpbmdcbiIsCi0JCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJYW1ybmItPmF1ZGlvX2NsaWVudCA9IHE2YXVkaW9fb3Blbl9hbXJuYigKLQkJCQkJYW1ybmItPnN0cl9jZmcuYnVmZmVyX3NpemUsCi0JCQkJCWFtcm5iLT5jZmcuYmFuZF9tb2RlLAotCQkJCQlhbXJuYi0+Y2ZnLmR0eF9lbmFibGUsCi0JCQkJCWFtcm5iLT52b2ljZXJlY19tb2RlLnJlY19tb2RlLAotCQkJCQlhY2RiX2lkKTsKLQkJCWlmICghYW1ybmItPmF1ZGlvX2NsaWVudCkgewotCQkJCXByX2VycigiWyVzOiVzXSBhbXJuYiBvcGVuIHNlc3Npb24gZmFpbGVkXG4iLAotCQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQkJCWtmcmVlKGFtcm5iKTsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU1RPUDoKLQkJcHJfZGVidWcoIlslczolc10gQVVESU9fU1RPUFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19GTFVTSDoKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfSU5DQUxMOiB7Ci0JCXByX2RlYnVnKCJbJXM6JXNdIFNFVF9JTkNBTExcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYW1ybmItPnZvaWNlcmVjX21vZGUsCi0JCQkodm9pZCAqKWFyZywgc2l6ZW9mKHN0cnVjdCBtc21fdm9pY2VyZWNfbW9kZSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCi0JCWlmIChhbXJuYi0+dm9pY2VyZWNfbW9kZS5yZWNfbW9kZSAhPSBBVURJT19GTEFHX1JFQUQKLQkJCQkmJiBhbXJuYi0+dm9pY2VyZWNfbW9kZS5yZWNfbW9kZSAhPQotCQkJCUFVRElPX0ZMQUdfSU5DQUxMX01JWEVEKSB7Ci0JCQlhbXJuYi0+dm9pY2VyZWNfbW9kZS5yZWNfbW9kZSA9IEFVRElPX0ZMQUdfUkVBRDsKLQkJCXByX2VycigiWyVzOiVzXSBJbnZhbGlkIHJlY19tb2RlXG4iLCBfX01NX0ZJTEVfXywKLQkJCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9TVFJFQU1fQ09ORklHOgotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYW1ybmItPnN0cl9jZmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCXByX2RlYnVnKCJbJXM6JXNdIEdFVF9TVFJFQU1fQ09ORklHOiBidWZmc3o9JWQsIGJ1ZmZjbnQgPSAlZFxuIiwKLQkJCSBfX01NX0ZJTEVfXywgX19mdW5jX18sIGFtcm5iLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplLAotCQkJYW1ybmItPnN0cl9jZmcuYnVmZmVyX2NvdW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfU1RSRUFNX0NPTkZJRzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhbXJuYi0+c3RyX2NmZywgKHZvaWQgKilhcmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXByX2RlYnVnKCJbJXM6JXNdIFNFVF9TVFJFQU1fQ09ORklHOiBidWZmc3o9JWQsIGJ1ZmZjbnQgPSAlZFxuIiwKLQkJCSBfX01NX0ZJTEVfXywgX19mdW5jX18sIGFtcm5iLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplLAotCQkJYW1ybmItPnN0cl9jZmcuYnVmZmVyX2NvdW50KTsKLQotCQlpZiAoYW1ybmItPnN0cl9jZmcuYnVmZmVyX3NpemUgPCA3NjgpIHsKLQkJCXByX2VycigiWyVzOiVzXSBCdWZmZXIgc2l6ZSB0b28gc21hbGxcbiIsIF9fTU1fRklMRV9fLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChhbXJuYi0+c3RyX2NmZy5idWZmZXJfY291bnQgIT0gMikKLQkJCXByX2luZm8oIlslczolc10gQnVmZmVyIGNvdW50IHNldCB0byAyXG4iLCBfX01NX0ZJTEVfXywKLQkJCQkJX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9BTVJOQl9FTkNfQ09ORklHOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmFtcm5iLT5jZmcsICh2b2lkICopIGFyZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjIpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJcHJfZGVidWcoIlslczolc10gU0VUX0FNUk5CX0VOQ19DT05GSUdcbiIsIF9fTU1fRklMRV9fLAotCQkJX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9BTVJOQl9FTkNfQ09ORklHOgotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmFtcm5iLT5jZmcsCi0JCQkJIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjIpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJcHJfZGVidWcoIlslczolc10gR0VUX0FNUk5CX0VOQ19DT05GSUdcbiIsIF9fTU1fRklMRV9fLAotCQkJX19mdW5jX18pOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF91bmxvY2soJmFtcm5iLT5sb2NrKTsKLQlwcl9kZWJ1ZygiWyVzOiVzXSByYz0gJWRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBxNl9hbXJuYl9pbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhbXJuYiAqYW1ybmI7Ci0KLQlwcl9pbmZvKCJbJXM6JXNdIG9wZW5cbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JYW1ybmIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYW1ybmIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoYW1ybmIgPT0gTlVMTCkgewotCQlwcl9lcnIoIlslczolc10gQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYW1ybmIgZHJpdmVyXG4iLAotCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW11dGV4X2luaXQoJmFtcm5iLT5sb2NrKTsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhbXJuYjsKLQlhbXJuYi0+YXVkaW9fY2xpZW50ID0gTlVMTDsKLQlhbXJuYi0+c3RyX2NmZy5idWZmZXJfc2l6ZSA9IDc2ODsKLQlhbXJuYi0+c3RyX2NmZy5idWZmZXJfY291bnQgPSAyOwotCWFtcm5iLT5jZmcuYmFuZF9tb2RlID0gNzsKLQlhbXJuYi0+Y2ZnLmR0eF9lbmFibGUgID0gMzsKLQlhbXJuYi0+Y2ZnLmZyYW1lX2Zvcm1hdCA9IEFEU1BfQVVESU9fRk9STUFUX0FNUk5CX0ZTOwotCWFtcm5iLT52b2ljZXJlY19tb2RlLnJlY19tb2RlID0gQVVESU9fRkxBR19SRUFEOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHE2X2Ftcm5iX2luX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCXN0cnVjdCBhdWRpb19idWZmZXIgKmFiOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlzdHJ1Y3QgYW1ybmIgKmFtcm5iID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCB4ZmVyID0gMDsKLQlpbnQgcmVzOwotCi0JcHJfZGVidWcoIlslczolc10gY291bnQgPSAlZFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBjb3VudCk7Ci0JbXV0ZXhfbG9jaygmYW1ybmItPmxvY2spOwotCWFjID0gYW1ybmItPmF1ZGlvX2NsaWVudDsKLQlpZiAoIWFjKSB7Ci0JCXJlcyA9IC1FTk9ERVY7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0Jd2hpbGUgKGNvdW50ID4geGZlcikgewotCQlhYiA9IGFjLT5idWYgKyBhYy0+Y3B1X2J1ZjsKLQotCQlpZiAoYWItPnVzZWQpCi0JCQl3YWl0X2V2ZW50KGFjLT53YWl0LCAoYWItPnVzZWQgPT0gMCkpOwotCi0JCXByX2RlYnVnKCJbJXM6JXNdIGFiLT5kYXRhID0gJXAsIGNwdV9idWYgPSAlZFxuIiwgX19NTV9GSUxFX18sCi0JCQlfX2Z1bmNfXywgYWItPmRhdGEsIGFjLT5jcHVfYnVmKTsKLQkJeGZlciA9IGFiLT5hY3R1YWxfc2l6ZTsKLQotCQlpZiAoY29weV90b191c2VyKGJ1ZiwgYWItPmRhdGEsIHhmZXIpKSB7Ci0JCQlwcl9lcnIoIlslczolc10gY29weV90b191c2VyIGZhaWxlZFxuIiwKLQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQkJcmVzID0gLUVGQVVMVDsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCWJ1ZiArPSB4ZmVyOwotCQljb3VudCAtPSB4ZmVyOwotCi0JCWFiLT51c2VkID0gMTsKLQkJcTZhdWRpb19yZWFkKGFjLCBhYik7Ci0JCWFjLT5jcHVfYnVmIF49IDE7Ci0JfQotCi0JcmVzID0gYnVmIC0gc3RhcnQ7Ci1mYWlsOgotCW11dGV4X3VubG9jaygmYW1ybmItPmxvY2spOwotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCBxNl9hbXJuYl9pbl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGFtcm5iICphbXJuYiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJmFtcm5iLT5sb2NrKTsKLQlpZiAoYW1ybmItPmF1ZGlvX2NsaWVudCkKLQkJcmMgPSBxNmF1ZGlvX2Nsb3NlKGFtcm5iLT5hdWRpb19jbGllbnQpOwotCW11dGV4X3VubG9jaygmYW1ybmItPmxvY2spOwotCWtmcmVlKGFtcm5iKTsKLQlwcl9pbmZvKCJbJXM6JXNdIHJlbGVhc2VcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBxNl9hbXJuYl9pbl9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBxNl9hbXJuYl9pbl9vcGVuLAotCS5yZWFkCQk9IHE2X2Ftcm5iX2luX3JlYWQsCi0JLnJlbGVhc2UJPSBxNl9hbXJuYl9pbl9yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bAk9IHE2X2Ftcm5iX2luX2lvY3RsLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgcTZfYW1ybmJfaW5fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX2Ftcl9pbiIsCi0JLmZvcHMJPSAmcTZfYW1ybmJfaW5fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHE2X2Ftcm5iX2luX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmcTZfYW1ybmJfaW5fbWlzYyk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChxNl9hbXJuYl9pbl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2FuYWxvZ19hdWRpby5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYW5hbG9nX2F1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYTZiYWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYW5hbG9nX2F1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvcG1pYy5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX3Fkc3A2X2F1ZGlvLmg+Ci0jaW5jbHVkZSA8YXNtL3N0cmluZy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi0jZGVmaW5lIEdQSU9fSEVBRFNFVF9BTVAgMTU3Ci0jZGVmaW5lIEdQSU9fU1BFQUtFUl9BTVAgMzkKLSNkZWZpbmUgR1BJT19IRUFEU0VUX1NIRE5fTiA0OAotCi12b2lkIGFuYWxvZ19pbml0KHZvaWQpCi17Ci0JLyogc3RlcmVvIHBtaWMgaW5pdCAqLwotCXBtaWNfc3Brcl9zZXRfZ2FpbihMRUZUX1NQS1IsIFNQS1JfR0FJTl9QTFVTMTJEQik7Ci0JcG1pY19zcGtyX3NldF9nYWluKFJJR0hUX1NQS1IsIFNQS1JfR0FJTl9QTFVTMTJEQik7Ci0JcG1pY19taWNfc2V0X3ZvbHQoTUlDX1ZPTFRfMV84MFYpOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX0hFQURTRVRfQU1QLCAxKTsKLQlncGlvX3NldF92YWx1ZShHUElPX0hFQURTRVRfQU1QLCAwKTsKLX0KLQotdm9pZCBhbmFsb2dfaGVhZHNldF9lbmFibGUoaW50IGVuKQotewotCXByX2RlYnVnKCJbJXM6JXNdIGVuID0gJWRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywgZW4pOwotCS8qIGVuYWJsZSBhdWRpbyBhbXAgKi8KLQlncGlvX3NldF92YWx1ZShHUElPX0hFQURTRVRfQU1QLCAhIWVuKTsKLX0KLQotdm9pZCBhbmFsb2dfc3BlYWtlcl9lbmFibGUoaW50IGVuKQotewotCXN0cnVjdCBzcGtyX2NvbmZpZ19tb2RlIHNjbTsKLQltZW1zZXQoJnNjbSwgMCwgc2l6ZW9mKHNjbSkpOwotCi0JcHJfZGVidWcoIlslczolc10gZW4gPSAlZFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBlbik7Ci0JaWYgKGVuKSB7Ci0JCXNjbS5pc19yaWdodF9jaGFuX2VuID0gMTsKLQkJc2NtLmlzX2xlZnRfY2hhbl9lbiA9IDE7Ci0JCXNjbS5pc19zdGVyZW9fZW4gPSAxOwotCQlzY20uaXNfaHBmX2VuID0gMTsKLQkJcG1pY19zcGtyX2VuX211dGUoTEVGVF9TUEtSLCAwKTsKLQkJcG1pY19zcGtyX2VuX211dGUoUklHSFRfU1BLUiwgMCk7Ci0JCXBtaWNfc2V0X3Nwa3JfY29uZmlndXJhdGlvbigmc2NtKTsKLQkJcG1pY19zcGtyX2VuKExFRlRfU1BLUiwgMSk7Ci0JCXBtaWNfc3Brcl9lbihSSUdIVF9TUEtSLCAxKTsKLQkJCi0JCS8qIHVubXV0ZSAqLwotCQlwbWljX3Nwa3JfZW5fbXV0ZShMRUZUX1NQS1IsIDEpOwotCQlwbWljX3Nwa3JfZW5fbXV0ZShSSUdIVF9TUEtSLCAxKTsKLQl9IGVsc2UgewotCQlwbWljX3Nwa3JfZW5fbXV0ZShMRUZUX1NQS1IsIDApOwotCQlwbWljX3Nwa3JfZW5fbXV0ZShSSUdIVF9TUEtSLCAwKTsKLQotCQlwbWljX3Nwa3JfZW4oTEVGVF9TUEtSLCAwKTsKLQkJcG1pY19zcGtyX2VuKFJJR0hUX1NQS1IsIDApOwotCi0JCXBtaWNfc2V0X3Nwa3JfY29uZmlndXJhdGlvbigmc2NtKTsKLQl9Ci19Ci0KLXZvaWQgYW5hbG9nX21pY19lbmFibGUoaW50IGVuKQotewotCXByX2RlYnVnKCJbJXM6JXNdIGVuID0gJWRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywgZW4pOwotCXBtaWNfbWljX2VuKGVuKTsKLX0KLQotc3RhdGljIHN0cnVjdCBxNmF1ZGlvX2FuYWxvZ19vcHMgb3BzID0gewotCS5pbml0ID0gYW5hbG9nX2luaXQsCi0JLnNwZWFrZXJfZW5hYmxlID0gYW5hbG9nX3NwZWFrZXJfZW5hYmxlLAotCS5oZWFkc2V0X2VuYWJsZSA9IGFuYWxvZ19oZWFkc2V0X2VuYWJsZSwKLQkuaW50X21pY19lbmFibGUgPSBhbmFsb2dfbWljX2VuYWJsZSwKLQkuZXh0X21pY19lbmFibGUgPSBhbmFsb2dfbWljX2VuYWJsZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlxNmF1ZGlvX3JlZ2lzdGVyX2FuYWxvZ19vcHMoJm9wcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChpbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvX2N0bC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW9fY3RsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMWRmMzkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW9fY3RsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOSBIVEMgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotCi0jaW5jbHVkZSA8bWFjaC9tc21fcWRzcDZfYXVkaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLSNkZWZpbmUgQlVGU1ogKDApCi0KLXN0YXRpYyBERUZJTkVfTVVURVgodm9pY2VfbG9jayk7Ci1zdGF0aWMgaW50IHZvaWNlX3N0YXJ0ZWQ7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXVkaW9fY2xpZW50ICp2b2NfdHhfY2xudDsKLXN0YXRpYyBzdHJ1Y3QgYXVkaW9fY2xpZW50ICp2b2NfcnhfY2xudDsKLQotc3RhdGljIGludCBxNl92b2ljZV9zdGFydCh2b2lkKQotewotCWludCByYyA9IDA7Ci0KLQltdXRleF9sb2NrKCZ2b2ljZV9sb2NrKTsKLQotCWlmICh2b2ljZV9zdGFydGVkKSB7Ci0JCXByX2VycigiWyVzOiVzXSBidXN5XG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBkb25lOwotCX0KLQotCXZvY190eF9jbG50ID0gcTZ2b2ljZV9vcGVuKEFVRElPX0ZMQUdfV1JJVEUpOwotCWlmICghdm9jX3R4X2NsbnQpIHsKLQkJcHJfZXJyKCJbJXM6JXNdIG9wZW4gdm9pY2UgdHggZmFpbGVkLlxuIiwgX19NTV9GSUxFX18sCi0JCQkJX19mdW5jX18pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQl2b2NfcnhfY2xudCA9IHE2dm9pY2Vfb3BlbihBVURJT19GTEFHX1JFQUQpOwotCWlmICghdm9jX3J4X2NsbnQpIHsKLQkJcHJfZXJyKCJbJXM6JXNdIG9wZW4gdm9pY2UgcnggZmFpbGVkLlxuIiwgX19NTV9GSUxFX18sCi0JCQkJX19mdW5jX18pOwotCQlxNnZvaWNlX2Nsb3NlKHZvY190eF9jbG50KTsKLQkJcmMgPSAtRU5PTUVNOwotCX0KLQotCXZvaWNlX3N0YXJ0ZWQgPSAxOwotZG9uZToKLQltdXRleF91bmxvY2soJnZvaWNlX2xvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBxNl92b2ljZV9zdG9wKHZvaWQpCi17Ci0JbXV0ZXhfbG9jaygmdm9pY2VfbG9jayk7Ci0JaWYgKHZvaWNlX3N0YXJ0ZWQpIHsKLQkJcTZ2b2ljZV9jbG9zZSh2b2NfdHhfY2xudCk7Ci0JCXE2dm9pY2VfY2xvc2Uodm9jX3J4X2NsbnQpOwotCQl2b2ljZV9zdGFydGVkID0gMDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZ2b2ljZV9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBxNl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXByX2RlYnVnKCJbJXM6JXNdXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyBxNl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByYzsKLQl1aW50MzJfdCBuOwotCXVpbnQzMl90IGlkWzJdOwotCXVpbnQzMl90IG11dGVfc3RhdHVzOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NXSVRDSF9ERVZJQ0U6Ci0JCXJjID0gY29weV9mcm9tX3VzZXIoJmlkLCAodm9pZCAqKWFyZywgc2l6ZW9mKGlkKSk7Ci0JCXByX2luZm8oIlslczolc10gU1dJVENIX0RFVjogaWRbMF0gPSAweCV4LCBpZFsxXSA9IDB4JXgiLAotCQkJX19NTV9GSUxFX18sIF9fZnVuY19fLCBpZFswXSwgaWRbMV0pOwotCQlpZiAoIXJjKQotCQkJcmMgPSBxNmF1ZGlvX2RvX3JvdXRpbmcoaWRbMF0sIGlkWzFdKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlyYyA9IGNvcHlfZnJvbV91c2VyKCZuLCAodm9pZCAqKWFyZywgc2l6ZW9mKG4pKTsKLQkJcHJfZGVidWcoIlslczolc10gU0VUX1ZPTFVNRTogdm9sID0gJWRcbiIsIF9fTU1fRklMRV9fLAotCQkJCV9fZnVuY19fLCBuKTsKLQkJaWYgKCFyYykKLQkJCXJjID0gcTZhdWRpb19zZXRfcnhfdm9sdW1lKG4pOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9NVVRFOgotCQlyYyA9IGNvcHlfZnJvbV91c2VyKCZuLCAodm9pZCAqKWFyZywgc2l6ZW9mKG4pKTsKLQkJaWYgKCFyYykgewotCQkJaWYgKHZvaWNlX3N0YXJ0ZWQpIHsKLQkJCQlpZiAobiA9PSAxKQotCQkJCQltdXRlX3N0YXR1cyA9IFNUUkVBTV9NVVRFOwotCQkJCWVsc2UKLQkJCQkJbXV0ZV9zdGF0dXMgPSBTVFJFQU1fVU5NVVRFOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobiA9PSAxKQotCQkJCQltdXRlX3N0YXR1cyA9IERFVklDRV9NVVRFOwotCQkJCWVsc2UKLQkJCQkJbXV0ZV9zdGF0dXMgPSBERVZJQ0VfVU5NVVRFOwotCQkJfQotCi0JCQlwcl9kZWJ1ZygiWyVzOiVzXSBTRVRfTVVURTogbXV0ZV9zdGF0dXMgPSAlZFxuIiwKLQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18sIG11dGVfc3RhdHVzKTsKLQkJCXJjID0gcTZhdWRpb19zZXRfdHhfbXV0ZShtdXRlX3N0YXR1cyk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19VUERBVEVfQUNEQjoKLQkJcmMgPSBjb3B5X2Zyb21fdXNlcigmaWQsICh2b2lkICopYXJnLCBzaXplb2YoaWQpKTsKLQkJcHJfZGVidWcoIlslczolc10gVVBEQVRFX0FDREI6IGlkWzBdID0gMHgleCwgaWRbMV0gPSAweCV4XG4iLAotCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXywgaWRbMF0sIGlkWzFdKTsKLQkJaWYgKCFyYykKLQkJCXJjID0gcTZhdWRpb191cGRhdGVfYWNkYihpZFswXSwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU1RBUlRfVk9JQ0U6Ci0JCXByX2RlYnVnKCJbJXM6JXNdIFNUQVJUX1ZPSUNFXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlyYyA9IHE2X3ZvaWNlX3N0YXJ0KCk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU1RPUF9WT0lDRToKLQkJcHJfZGVidWcoIlslczolc10gU1RPUF9WT0lDRVxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJcmMgPSBxNl92b2ljZV9zdG9wKCk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fUkVJTklUX0FDREI6Ci0JCXByX2RlYnVnKCJbJXM6JXNdIFJFSU5JVF9BQ0RCXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIGludCBxNl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXByX2RlYnVnKCJbJXM6JXNdXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBxNl9kZXZfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gcTZfb3BlbiwKLQkudW5sb2NrZWRfaW9jdGwJPSBxNl9pb2N0bCwKLQkucmVsZWFzZQk9IHE2X3JlbGVhc2UsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBxNl9jb250cm9sX2RldmljZSA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX2F1ZGlvX2N0bCIsCi0JLmZvcHMJPSAmcTZfZGV2X2ZvcHMsCi19OwotCi0KLXN0YXRpYyBpbnQgX19pbml0IHE2X2F1ZGlvX2N0bF9pbml0KHZvaWQpIHsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmcTZfY29udHJvbF9kZXZpY2UpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwocTZfYXVkaW9fY3RsX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YWI5YWUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLW9iai15ICs9IHE2YXVkaW8ubwotb2JqLXkgKz0gYWFjX2luLm8KLW9iai15ICs9IHZvaWNlLm8KLW9iai15ICs9IHBjbV9vdXQubwotb2JqLXkgKz0gcGNtX2luLm8KLW9iai15ICs9IG1wMy5vCi1vYmoteSArPSBhdWRpb19jdGwubwotb2JqLXkgKz0gYW5hbG9nX2F1ZGlvLm8KLW9iai15ICs9IHJvdXRpbmcubwotb2JqLXkgKz0gZXZyY19pbi5vCi1vYmoteSArPSBxY2VscF9pbi5vCi1vYmoteSArPSBhbXJuYl9pbi5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL2FhY19pbi5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9hYWNfaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1NjZjOS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL2FhY19pbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgSFRDIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19hYWMuaD4KLQotI2luY2x1ZGUgPG1hY2gvbXNtX3Fkc3A2X2F1ZGlvdjIuaD4KLSNpbmNsdWRlICJkYWxfYXVkaW8uaCIKLSNpbmNsdWRlICJkYWxfYXVkaW9fZm9ybWF0LmgiCi0KLXN0cnVjdCBhYWMgewotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcgY2ZnOwotCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBzdHJfY2ZnOwotCXN0cnVjdCBhdWRpb19jbGllbnQgKmF1ZGlvX2NsaWVudDsKLX07Ci0KLXN0YXRpYyBsb25nIHE2X2FhY19pbl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGFhYyAqYWFjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhZHNwX29wZW5fY29tbWFuZCBycGM7Ci0KLQlpbnQgc2FtcGxlX3JhdGU7Ci0JaW50IGF1ZGlvX29iamVjdF90eXBlOwotCWludCBpbmRleCA9IHNpemVvZih1MzIpOwotCWludCByYyA9IDA7Ci0JdTMyICphYWNfdHlwZSA9IE5VTEw7Ci0KLQotCW11dGV4X2xvY2soJmFhYy0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQotCWNhc2UgQVVESU9fU1RBUlQ6Ci0JCWlmIChhYWMtPmF1ZGlvX2NsaWVudCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCXR4X2Nsa19mcmVxID0gNDgwMDA7Ci0JCQlhYWMtPmF1ZGlvX2NsaWVudCA9IHE2YXVkaW9fb3BlbihBVURJT19GTEFHX1JFQUQsCi0JCQkJCQlhYWMtPnN0cl9jZmcuYnVmZmVyX3NpemUpOwotCi0JCQlpZiAoYWFjLT5hdWRpb19jbGllbnQgPCAwKSB7Ci0KLQkJCQl0eF9jbGtfZnJlcSA9IDgwMDA7Ci0JCQkJcmMgPSAtRU5PTUVNOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0KLQkJcnBjLmZvcm1hdF9ibG9jay5iaW5hcnkuZm9ybWF0ID0gQURTUF9BVURJT19GT1JNQVRfTVBFRzRfQUFDOwotCQkvKiBvbmx5IDQ4ayBzYW1wbGUgcmF0ZSBpcyBzdXBwb3J0ZWQgKi8KLQkJc2FtcGxlX3JhdGUgPSAzOwotCi0JCS8qIEFBQyBPQkpFQ1QgTEMgKi8KLQkJYXVkaW9fb2JqZWN0X3R5cGUgPSAyOwotCi0JCWFhY190eXBlID0gKHUzMiAqKXJwYy5mb3JtYXRfYmxvY2suYmluYXJ5LmRhdGE7Ci0JCXN3aXRjaCAoYWFjLT5jZmcuc3RyZWFtX2Zvcm1hdCkgewotCi0JCWNhc2UgQVVESU9fQUFDX0ZPUk1BVF9BRFRTOgotCQkJLyogQUFDIEVuY29kZXIgZXhwZWN0IE1QRUc0X0FEVFMgbWVkaWEgdHlwZSAqLwotCQkJKmFhY190eXBlID0gQURTUF9BVURJT19BQUNfTVBFRzRfQURUUzsKLQkJCWJyZWFrOwotCQljYXNlIEFVRElPX0FBQ19GT1JNQVRfUkFXOgotCQkJLyogZm9yIEFESUYgcmVjb3JkaW5nICovCi0JCQkqYWFjX3R5cGUgPSBBRFNQX0FVRElPX0FBQ19SQVc7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJwYy5mb3JtYXRfYmxvY2suYmluYXJ5LmRhdGFbaW5kZXgrK10gPSAodTgpKAotCQkJKChhdWRpb19vYmplY3RfdHlwZSAmIDB4MUYpIDw8IDMpIHwKLQkJCSgoc2FtcGxlX3JhdGUgPj4gMSkgJiAweDcpKTsKLQkJcnBjLmZvcm1hdF9ibG9jay5iaW5hcnkuZGF0YVtpbmRleF0gPSAodTgpKAotCQkJKChzYW1wbGVfcmF0ZSAmIDB4MSkgPDwgNykgfAotCQkJKChhYWMtPmNmZy5jaGFubmVscyAmIDB4NykgPDwgMykpOwotCi0JCXJwYy5mb3JtYXRfYmxvY2suYmluYXJ5Lm51bV9ieXRlcyA9IGluZGV4ICsgMTsKLQkJcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9PUEVOX1JFQUQ7Ci0JCXJwYy5kZXZpY2UgPSBBRFNQX0FVRElPX0RFVklDRV9JRF9ERUZBVUxUOwotCQlycGMuc3RyZWFtX2NvbnRleHQgPSBBRFNQX0FVRElPX0RFVklDRV9DT05URVhUX1JFQ09SRDsKLQkJcnBjLmJ1Zl9tYXhfc2l6ZSA9IGFhYy0+c3RyX2NmZy5idWZmZXJfc2l6ZTsKLQkJcnBjLmNvbmZpZy5hYWMuYml0X3JhdGUgPSBhYWMtPmNmZy5iaXRfcmF0ZTsKLQkJcnBjLmNvbmZpZy5hYWMuZW5jb2Rlcl9tb2RlID0gQURTUF9BVURJT19FTkNfQUFDX0xDX09OTFlfTU9ERTsKLQkJcTZhdWRpb19zdGFydChhYWMtPmF1ZGlvX2NsaWVudCwgJnJwYywgc2l6ZW9mKHJwYykpOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NUT1A6Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fRkxVU0g6Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX1ZPTFVNRToKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19HRVRfU1RSRUFNX0NPTkZJRzoKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmFhYy0+c3RyX2NmZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfU1RSRUFNX0NPTkZJRzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhYWMtPnN0cl9jZmcsICh2b2lkICopYXJnLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYWFjLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplIDwgNTE5KSB7Ci0JCQlwcl9lcnIoIkJ1ZmZlciBzaXplIHRvbyBzbWFsbFxuIik7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYWFjLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCAhPSAyKQotCQkJcHJfaW5mbygiQnVmZmVyIGNvdW50IHNldCB0byAyXG4iKTsKLQotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9BQUNfRU5DX0NPTkZJRzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhYWMtPmNmZywgKHZvaWQgKikgYXJnLAotCQkJCSBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19hYWNfZW5jX2NvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJaWYgKGFhYy0+Y2ZnLmNoYW5uZWxzICE9IDEpIHsKLQkJCXByX2Vycigib25seSBtb25vIGlzIHN1cHBvcnRlZFxuIik7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCX0KLQkJaWYgKGFhYy0+Y2ZnLnNhbXBsZV9yYXRlICE9IDQ4MDAwKSB7Ci0JCQlwcl9lcnIoIm9ubHkgNDhLSHogaXMgc3VwcG9ydGVkXG4iKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJfQotCQlpZiAoYWFjLT5jZmcuc3RyZWFtX2Zvcm1hdCAhPSBBVURJT19BQUNfRk9STUFUX1JBVyAmJgotCQkJYWFjLT5jZmcuc3RyZWFtX2Zvcm1hdCAhPSBBVURJT19BQUNfRk9STUFUX0FEVFMpIHsKLQkJCXByX2VycigidW5zdXBwb3J0ZWQgQUFDIGZvcm1hdFxuIik7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19HRVRfQUFDX0VOQ19DT05GSUc6Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmYWFjLT5jZmcsCi0JCQkJIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZhYWMtPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBxNl9hYWNfaW5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQotCXN0cnVjdCBhYWMgKmFhYzsKLQlhYWMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWFjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGFhYyA9PSBOVUxMKSB7Ci0JCXByX2VycigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYWFjIGRyaXZlclxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW11dGV4X2luaXQoJmFhYy0+bG9jayk7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYWFjOwotCWFhYy0+YXVkaW9fY2xpZW50ID0gTlVMTDsKLQlhYWMtPnN0cl9jZmcuYnVmZmVyX3NpemUgPSA1MTk7Ci0JYWFjLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCA9IDI7Ci0JYWFjLT5jZmcuY2hhbm5lbHMgPSAxOwotCWFhYy0+Y2ZnLmJpdF9yYXRlID0gMTkyMDAwOwotCWFhYy0+Y2ZnLnN0cmVhbV9mb3JtYXQgPSBBVURJT19BQUNfRk9STUFUX0FEVFM7Ci0JYWFjLT5jZmcuc2FtcGxlX3JhdGUgPSA0ODAwMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBxNl9hYWNfaW5fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYzsKLQlzdHJ1Y3QgYXVkaW9fYnVmZmVyICphYjsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jc3RydWN0IGFhYyAqYWFjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCB4ZmVyID0gMDsKLQlpbnQgcmVzOwotCi0JbXV0ZXhfbG9jaygmYWFjLT5sb2NrKTsKLQlhYyA9IGFhYy0+YXVkaW9fY2xpZW50OwotCWlmICghYWMpIHsKLQkJcmVzID0gLUVOT0RFVjsKLQkJZ290byBmYWlsOwotCX0KLQl3aGlsZSAoY291bnQgPiB4ZmVyKSB7Ci0JCWFiID0gYWMtPmJ1ZiArIGFjLT5jcHVfYnVmOwotCi0JCWlmIChhYi0+dXNlZCkKLQkJCXdhaXRfZXZlbnQoYWMtPndhaXQsIChhYi0+dXNlZCA9PSAwKSk7Ci0KLQkJeGZlciA9IGFiLT5hY3R1YWxfc2l6ZTsKLQotCQlpZiAoY29weV90b191c2VyKGJ1ZiwgYWItPmRhdGEsIHhmZXIpKSB7Ci0JCQlyZXMgPSAtRUZBVUxUOwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJYnVmICs9IHhmZXI7Ci0JCWNvdW50IC09IHhmZXI7Ci0KLQkJYWItPnVzZWQgPSAxOwotCQlxNmF1ZGlvX3JlYWQoYWMsIGFiKTsKLQkJYWMtPmNwdV9idWYgXj0gMTsKLQl9Ci0JcmVzID0gYnVmIC0gc3RhcnQ7Ci1mYWlsOgotCW11dGV4X3VubG9jaygmYWFjLT5sb2NrKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgcTZfYWFjX2luX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYWFjICphYWMgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZhYWMtPmxvY2spOwotCWlmIChhYWMtPmF1ZGlvX2NsaWVudCkKLQkJcmMgPSBxNmF1ZGlvX2Nsb3NlKGFhYy0+YXVkaW9fY2xpZW50KTsKLQltdXRleF91bmxvY2soJmFhYy0+bG9jayk7Ci0Ja2ZyZWUoYWFjKTsKLQl0eF9jbGtfZnJlcSA9IDgwMDA7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBxNl9hYWNfaW5fZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gcTZfYWFjX2luX29wZW4sCi0JLnJlYWQJCT0gcTZfYWFjX2luX3JlYWQsCi0JLnJlbGVhc2UJPSBxNl9hYWNfaW5fcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBxNl9hYWNfaW5faW9jdGwsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBxNl9hYWNfaW5fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX2FhY19pbiIsCi0JLmZvcHMJPSAmcTZfYWFjX2luX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBxNl9hYWNfaW5faW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZxNl9hYWNfaW5fbWlzYyk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChxNl9hYWNfaW5faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL2Ftcm5iX2luLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL2Ftcm5iX2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NTJhZGEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9hbXJuYl9pbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgSFRDIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19hbXJuYi5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX3Fkc3A2X2F1ZGlvdjIuaD4KLSNpbmNsdWRlICJkYWxfYXVkaW8uaCIKLSNpbmNsdWRlICJkYWxfYXVkaW9fZm9ybWF0LmgiCi0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi0KLXN0cnVjdCBhbXJuYiB7Ci0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IG1zbV9hdWRpb19hbXJuYl9lbmNfY29uZmlnX3YyIGNmZzsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgc3RyX2NmZzsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphdWRpb19jbGllbnQ7Ci19OwotCi0KLXN0YXRpYyBsb25nIHE2X2Ftcm5iX2luX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhbXJuYiAqYW1ybmIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGFkc3Bfb3Blbl9jb21tYW5kIHJwYzsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfU1RBVFMpIHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyBzdGF0czsKLQkJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCX0KLQotCW11dGV4X2xvY2soJmFtcm5iLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6Ci0JCWlmIChhbXJuYi0+YXVkaW9fY2xpZW50KSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJYW1ybmItPmF1ZGlvX2NsaWVudCA9IHE2YXVkaW9fb3BlbihBVURJT19GTEFHX1JFQUQsCi0JCQkJCQlhbXJuYi0+c3RyX2NmZy5idWZmZXJfc2l6ZSk7Ci0KLQkJCWlmICghYW1ybmItPmF1ZGlvX2NsaWVudCkgewotCQkJCWtmcmVlKGFtcm5iKTsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQl0eF9jbGtfZnJlcSA9IDgwMDA7Ci0KLQkJbWVtc2V0KCZycGMsIDAsIHNpemVvZihycGMpKTsKLQotCQlycGMuZm9ybWF0X2Jsb2NrLnN0YW5kYXJkLmZvcm1hdCA9IEFEU1BfQVVESU9fRk9STUFUX0FNUk5CX0ZTOwotCQlycGMuZm9ybWF0X2Jsb2NrLnN0YW5kYXJkLmNoYW5uZWxzID0gMTsKLQkJcnBjLmZvcm1hdF9ibG9jay5zdGFuZGFyZC5iaXRzX3Blcl9zYW1wbGUgPSAxNjsKLQkJcnBjLmZvcm1hdF9ibG9jay5zdGFuZGFyZC5zYW1wbGluZ19yYXRlID0gODAwMDsKLQkJcnBjLmZvcm1hdF9ibG9jay5zdGFuZGFyZC5pc19zaWduZWQgPSAxOwotCQlycGMuZm9ybWF0X2Jsb2NrLnN0YW5kYXJkLmlzX2ludGVybGVhdmVkID0gMDsKLQotCQlycGMuaGRyLm9wY29kZSA9IEFEU1BfQVVESU9fSU9DVExfQ01EX09QRU5fUkVBRDsKLQkJcnBjLmRldmljZSA9IEFEU1BfQVVESU9fREVWSUNFX0lEX0RFRkFVTFQ7Ci0JCXJwYy5zdHJlYW1fY29udGV4dCA9IEFEU1BfQVVESU9fREVWSUNFX0NPTlRFWFRfUkVDT1JEOwotCQlycGMuYnVmX21heF9zaXplID0gYW1ybmItPnN0cl9jZmcuYnVmZmVyX3NpemU7Ci0JCXJwYy5jb25maWcuYW1yLm1vZGUgPSBhbXJuYi0+Y2ZnLmJhbmRfbW9kZTsKLQkJcnBjLmNvbmZpZy5hbXIuZHR4X21vZGUgPSBhbXJuYi0+Y2ZnLmR0eF9lbmFibGU7Ci0JCXJwYy5jb25maWcuYW1yLmVuYWJsZSA9IDE7Ci0JCXE2YXVkaW9fc3RhcnQoYW1ybmItPmF1ZGlvX2NsaWVudCwgJnJwYywgc2l6ZW9mKHJwYykpOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NUT1A6Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fRkxVU0g6Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX1ZPTFVNRToKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19HRVRfU1RSRUFNX0NPTkZJRzoKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmFtcm5iLT5zdHJfY2ZnLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9TVFJFQU1fQ09ORklHOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmFtcm5iLT5zdHJfY2ZnLCAodm9pZCAqKWFyZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoYW1ybmItPnN0cl9jZmcuYnVmZmVyX3NpemUgPCA3NjgpIHsKLQkJCXByX2VycigiWyVzOiVzXSBCdWZmZXIgc2l6ZSB0b28gc21hbGxcbiIsIF9fTU1fRklMRV9fLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChhbXJuYi0+c3RyX2NmZy5idWZmZXJfY291bnQgIT0gMikKLQkJCXByX2luZm8oIlslczolc10gQnVmZmVyIGNvdW50IHNldCB0byAyXG4iLCBfX01NX0ZJTEVfXywKLQkJCQkJX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9BTVJOQl9FTkNfQ09ORklHOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmFtcm5iLT5jZmcsICh2b2lkICopIGFyZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjIpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19HRVRfQU1STkJfRU5DX0NPTkZJRzoKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZhbXJuYi0+Y2ZnLAotCQkJCSBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19hbXJuYl9lbmNfY29uZmlnX3YyKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQotCW11dGV4X3VubG9jaygmYW1ybmItPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBxNl9hbXJuYl9pbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhbXJuYiAqYW1ybmI7Ci0JYW1ybmIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYW1ybmIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoYW1ybmIgPT0gTlVMTCkgewotCQlwcl9lcnIoIlslczolc10gQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYW1ybmIgZHJpdmVyXG4iLAotCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW11dGV4X2luaXQoJmFtcm5iLT5sb2NrKTsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhbXJuYjsKLQlhbXJuYi0+YXVkaW9fY2xpZW50ID0gTlVMTDsKLQlhbXJuYi0+c3RyX2NmZy5idWZmZXJfc2l6ZSA9IDc2ODsKLQlhbXJuYi0+c3RyX2NmZy5idWZmZXJfY291bnQgPSAyOwotCWFtcm5iLT5jZmcuYmFuZF9tb2RlID0gQURTUF9BVURJT19BTVJfTVI0NzU7Ci0JYW1ybmItPmNmZy5kdHhfZW5hYmxlICA9IEFEU1BfQVVESU9fQU1SX0RUWF9NT0RFX09OX0FVVE87Ci0JYW1ybmItPmNmZy5mcmFtZV9mb3JtYXQgID0gQURTUF9BVURJT19GT1JNQVRfQU1STkJfRlM7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHE2X2Ftcm5iX2luX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCXN0cnVjdCBhdWRpb19idWZmZXIgKmFiOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlzdHJ1Y3QgYW1ybmIgKmFtcm5iID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCB4ZmVyID0gMDsKLQlpbnQgcmVzOwotCi0JbXV0ZXhfbG9jaygmYW1ybmItPmxvY2spOwotCWFjID0gYW1ybmItPmF1ZGlvX2NsaWVudDsKLQlpZiAoIWFjKSB7Ci0JCXJlcyA9IC1FTk9ERVY7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0Jd2hpbGUgKGNvdW50ID4geGZlcikgewotCQlhYiA9IGFjLT5idWYgKyBhYy0+Y3B1X2J1ZjsKLQotCQlpZiAoYWItPnVzZWQpCi0JCQl3YWl0X2V2ZW50KGFjLT53YWl0LCAoYWItPnVzZWQgPT0gMCkpOwotCi0JCXhmZXIgPSBhYi0+YWN0dWFsX3NpemU7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGFiLT5kYXRhLCB4ZmVyKSkgewotCQkJcmVzID0gLUVGQVVMVDsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCWJ1ZiArPSB4ZmVyOwotCQljb3VudCAtPSB4ZmVyOwotCi0JCWFiLT51c2VkID0gMTsKLQkJcTZhdWRpb19yZWFkKGFjLCBhYik7Ci0JCWFjLT5jcHVfYnVmIF49IDE7Ci0JfQotCi0JcmVzID0gYnVmIC0gc3RhcnQ7Ci1mYWlsOgotCW11dGV4X3VubG9jaygmYW1ybmItPmxvY2spOwotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCBxNl9hbXJuYl9pbl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGFtcm5iICphbXJuYiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJmFtcm5iLT5sb2NrKTsKLQlpZiAoYW1ybmItPmF1ZGlvX2NsaWVudCkKLQkJcmMgPSBxNmF1ZGlvX2Nsb3NlKGFtcm5iLT5hdWRpb19jbGllbnQpOwotCW11dGV4X3VubG9jaygmYW1ybmItPmxvY2spOwotCWtmcmVlKGFtcm5iKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHE2X2Ftcm5iX2luX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IHE2X2Ftcm5iX2luX29wZW4sCi0JLnJlYWQJCT0gcTZfYW1ybmJfaW5fcmVhZCwKLQkucmVsZWFzZQk9IHE2X2Ftcm5iX2luX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0gcTZfYW1ybmJfaW5faW9jdGwsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBxNl9hbXJuYl9pbl9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fYW1yX2luIiwKLQkuZm9wcwk9ICZxNl9hbXJuYl9pbl9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgcTZfYW1ybmJfaW5faW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZxNl9hbXJuYl9pbl9taXNjKTsKLX0KLQotZGV2aWNlX2luaXRjYWxsKHE2X2Ftcm5iX2luX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9hbmFsb2dfYXVkaW8uYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvYW5hbG9nX2F1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZjJjZWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9hbmFsb2dfYXVkaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL3BtaWMuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9xZHNwNl9hdWRpb3YyLmg+Ci0KLSNkZWZpbmUgR1BJT19IRUFEU0VUX0FNUCAxNTcKLQotdm9pZCBhbmFsb2dfaW5pdCh2b2lkKQotewotCS8qIHN0ZXJlbyBwbWljIGluaXQgKi8KLQlwbWljX3Nwa3Jfc2V0X2dhaW4oTEVGVF9TUEtSLCBTUEtSX0dBSU5fUExVUzEyREIpOwotCXBtaWNfc3Brcl9zZXRfZ2FpbihSSUdIVF9TUEtSLCBTUEtSX0dBSU5fUExVUzEyREIpOwotCXBtaWNfbWljX3NldF92b2x0KE1JQ19WT0xUXzFfODBWKTsKLQotCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX0hFQURTRVRfQU1QLCAxKTsKLQlncGlvX3NldF92YWx1ZShHUElPX0hFQURTRVRfQU1QLCAwKTsKLX0KLQotdm9pZCBhbmFsb2dfaGVhZHNldF9lbmFibGUoaW50IGVuKQotewotCS8qIGVuYWJsZSBhdWRpbyBhbXAgKi8KLQlncGlvX3NldF92YWx1ZShHUElPX0hFQURTRVRfQU1QLCAhIWVuKTsKLX0KLQotdm9pZCBhbmFsb2dfc3BlYWtlcl9lbmFibGUoaW50IGVuKQotewotCXN0cnVjdCBzcGtyX2NvbmZpZ19tb2RlIHNjbTsKLQltZW1zZXQoJnNjbSwgMCwgc2l6ZW9mKHNjbSkpOwotCi0JaWYgKGVuKSB7Ci0JCXNjbS5pc19yaWdodF9jaGFuX2VuID0gMTsKLQkJc2NtLmlzX2xlZnRfY2hhbl9lbiA9IDE7Ci0JCXNjbS5pc19zdGVyZW9fZW4gPSAxOwotCQlzY20uaXNfaHBmX2VuID0gMTsKLQkJcG1pY19zcGtyX2VuX211dGUoTEVGVF9TUEtSLCAwKTsKLQkJcG1pY19zcGtyX2VuX211dGUoUklHSFRfU1BLUiwgMCk7Ci0JCXBtaWNfc2V0X3Nwa3JfY29uZmlndXJhdGlvbigmc2NtKTsKLQkJcG1pY19zcGtyX2VuKExFRlRfU1BLUiwgMSk7Ci0JCXBtaWNfc3Brcl9lbihSSUdIVF9TUEtSLCAxKTsKLQotCQkvKiB1bm11dGUgKi8KLQkJcG1pY19zcGtyX2VuX211dGUoTEVGVF9TUEtSLCAxKTsKLQkJcG1pY19zcGtyX2VuX211dGUoUklHSFRfU1BLUiwgMSk7Ci0JfSBlbHNlIHsKLQkJcG1pY19zcGtyX2VuX211dGUoTEVGVF9TUEtSLCAwKTsKLQkJcG1pY19zcGtyX2VuX211dGUoUklHSFRfU1BLUiwgMCk7Ci0KLQkJcG1pY19zcGtyX2VuKExFRlRfU1BLUiwgMCk7Ci0JCXBtaWNfc3Brcl9lbihSSUdIVF9TUEtSLCAwKTsKLQotCQlwbWljX3NldF9zcGtyX2NvbmZpZ3VyYXRpb24oJnNjbSk7Ci0JfQotfQotCi12b2lkIGFuYWxvZ19taWNfZW5hYmxlKGludCBlbikKLXsKLQlwbWljX21pY19lbihlbik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcTZhdWRpb19hbmFsb2dfb3BzIG9wcyA9IHsKLQkuaW5pdCA9IGFuYWxvZ19pbml0LAotCS5zcGVha2VyX2VuYWJsZSA9IGFuYWxvZ19zcGVha2VyX2VuYWJsZSwKLQkuaGVhZHNldF9lbmFibGUgPSBhbmFsb2dfaGVhZHNldF9lbmFibGUsCi0JLmludF9taWNfZW5hYmxlID0gYW5hbG9nX21pY19lbmFibGUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcTZhdWRpb19yZWdpc3Rlcl9hbmFsb2dfb3BzKCZvcHMpOwotCXJldHVybiAwOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL2F1ZGlvX2N0bC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9hdWRpb19jdGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGViZmMwMi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL2F1ZGlvX2N0bC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvYXVkaW9fY3RybC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA5IEhUQyBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotCi0jaW5jbHVkZSA8bWFjaC9tc21fcWRzcDZfYXVkaW92Mi5oPgotCi0jZGVmaW5lIEJVRlNaICgwKQotCi1zdGF0aWMgREVGSU5FX01VVEVYKHZvaWNlX2xvY2spOwotc3RhdGljIGludCB2b2ljZV9zdGFydGVkOwotCi1zdGF0aWMgc3RydWN0IGF1ZGlvX2NsaWVudCAqdm9jX2NsbnQ7Ci0KLXN0YXRpYyBpbnQgcTZfdm9pY2Vfc3RhcnQodm9pZCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JbXV0ZXhfbG9jaygmdm9pY2VfbG9jayk7Ci0KLQlpZiAodm9pY2Vfc3RhcnRlZCkgewotCQlwcl9lcnIoInZvaWNlOiBidXN5XG4iKTsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQl2b2NfY2xudCA9IHE2dm9pY2Vfb3BlbigpOwotCWlmICghdm9jX2NsbnQpIHsKLQkJcHJfZXJyKCJ2b2ljZTogb3BlbiB2b2ljZSBmYWlsZWQuXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jdm9pY2Vfc3RhcnRlZCA9IDE7Ci1kb25lOgotCW11dGV4X3VubG9jaygmdm9pY2VfbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHE2X3ZvaWNlX3N0b3Aodm9pZCkKLXsKLQltdXRleF9sb2NrKCZ2b2ljZV9sb2NrKTsKLQlpZiAodm9pY2Vfc3RhcnRlZCkgewotCQlxNnZvaWNlX2Nsb3NlKHZvY19jbG50KTsKLQkJdm9pY2Vfc3RhcnRlZCA9IDA7Ci0JfQotCW11dGV4X3VubG9jaygmdm9pY2VfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcTZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBxNl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByYzsKLQl1aW50MzJfdCBuOwotCXVpbnQzMl90IGlkWzJdOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NXSVRDSF9ERVZJQ0U6Ci0JCXJjID0gY29weV9mcm9tX3VzZXIoJm4sICh2b2lkICopYXJnLCBzaXplb2YobikpOwotCQlpZiAoIXJjKQotCQkJcmMgPSBxNmF1ZGlvX2RvX3JvdXRpbmcobik7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX1ZPTFVNRToKLQkJcmMgPSBjb3B5X2Zyb21fdXNlcigmbiwgKHZvaWQgKilhcmcsIHNpemVvZihuKSk7Ci0JCWlmICghcmMpCi0JCQlyYyA9IHE2YXVkaW9fc2V0X3J4X3ZvbHVtZShuKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfTVVURToKLQkJcmMgPSBjb3B5X2Zyb21fdXNlcigmbiwgKHZvaWQgKilhcmcsIHNpemVvZihuKSk7Ci0JCWlmICghcmMpCi0JCQlyYyA9IHE2YXVkaW9fc2V0X3R4X211dGUobik7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fVVBEQVRFX0FDREI6Ci0JCXJjID0gY29weV9mcm9tX3VzZXIoJmlkLCAodm9pZCAqKWFyZywgc2l6ZW9mKGlkKSk7Ci0JCWlmICghcmMpCi0JCQlyYyA9IHE2YXVkaW9fdXBkYXRlX2FjZGIoaWRbMF0sIGlkWzFdKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TVEFSVF9WT0lDRToKLQkJcmMgPSBxNl92b2ljZV9zdGFydCgpOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NUT1BfVk9JQ0U6Ci0JCXJjID0gcTZfdm9pY2Vfc3RvcCgpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi0KLXN0YXRpYyBpbnQgcTZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcTZfZGV2X2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IHE2X29wZW4sCi0JLmlvY3RsCQk9IHE2X2lvY3RsLAotCS5yZWxlYXNlCT0gcTZfcmVsZWFzZSwKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIHE2X2NvbnRyb2xfZGV2aWNlID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fYXVkaW9fY3RsIiwKLQkuZm9wcwk9ICZxNl9kZXZfZm9wcywKLX07Ci0KLQotc3RhdGljIGludCBfX2luaXQgcTZfYXVkaW9fY3RsX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmcTZfY29udHJvbF9kZXZpY2UpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwocTZfYXVkaW9fY3RsX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9kYWxfYWNkYi5oIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9kYWxfYWNkYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDk0OWY5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvZGFsX2FjZGIuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2RlZmluZSBBQ0RCX0RBTF9ERVZJQ0UJCTB4MDIwMDAwNjkKLSNkZWZpbmUgQUNEQl9EQUxfUE9SVAkJIkRBTF9BTV9BVUQiCi0jZGVmaW5lIEFDREJfREFMX1ZFUlNJT04JMHgwMDAxMDAwMAotCi0jZGVmaW5lIEFDREJfT1BfSU9DVEwJCURBTF9PUF9GSVJTVF9ERVZJQ0VfQVBJCi0KLS8qIGlvY3RscyAqLwotI2RlZmluZSBBQ0RCX0dFVF9ERVZJQ0UJCTB4MDEwOGJiOTIKLSNkZWZpbmUgQUNEQl9TRVRfREVWSUNFCQkweDAxMDhiYjkzCi0jZGVmaW5lIEFDREJfR0VUX1NUUkVBTQkJMHgwMTA4YmI5NQotI2RlZmluZSBBQ0RCX1NFVF9TVFJFQU0JCTB4MDEwOGJiOTYKLSNkZWZpbmUgQUNEQl9HRVRfREVWSUNFX1RBQkxFCTB4MDEwOGJiOTcKLSNkZWZpbmUgQUNEQl9HRVRfU1RSRUFNX1RBQkxFCTB4MDEwOGJiOTgKLQotI2RlZmluZSBBQ0RCX1JFU19TVUNDRVNTCTAKLSNkZWZpbmUgQUNEQl9SRVNfRkFJTFVSRQktMQotI2RlZmluZSBBQ0RCX1JFU19CQURQQVJNCS0yCi0jZGVmaW5lIEFDREJfUkVTX0JBRFNUQVRFCS0zCi0KLXN0cnVjdCBhY2RiX2NtZF9kZXZpY2UgewotCXVpbnQzMl90IHNpemU7Ci0KLQl1aW50MzJfdCBjb21tYW5kX2lkOwotCXVpbnQzMl90IGRldmljZV9pZDsKLQl1aW50MzJfdCBuZXR3b3JrX2lkOwotCXVpbnQzMl90IHNhbXBsZV9yYXRlX2lkOwotCXVpbnQzMl90IGludGVyZmFjZV9pZDsKLQl1aW50MzJfdCBhbGdvcml0aG1fYmxvY2tfaWQ7Ci0KLQkvKiBwaHlzaWNhbCBwYWdlIGFsaWduZWQgYnVmZmVyICovCi0JdWludDMyX3QgdG90YWxfYnl0ZXM7Ci0JdWludDMyX3QgdW5tYXBwZWRfYnVmOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGFjZGJfY21kX2RldmljZV90YWJsZSB7Ci0JdWludDMyX3Qgc2l6ZTsKLQotCXVpbnQzMl90IGNvbW1hbmRfaWQ7Ci0JdWludDMyX3QgZGV2aWNlX2lkOwotCXVpbnQzMl90IG5ldHdvcmtfaWQ7Ci0JdWludDMyX3Qgc2FtcGxlX3JhdGVfaWQ7Ci0KLQkvKiBwaHlzaWNhbCBwYWdlIGFsaWduZWQgYnVmZmVyICovCi0JdWludDMyX3QgdG90YWxfYnl0ZXM7Ci0JdWludDMyX3QgdW5tYXBwZWRfYnVmOwotCi0JdWludDMyX3QgcmVzX3NpemU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgYWNkYl9yZXN1bHQgewotCXVpbnQzMl90IGRhbF9zdGF0dXM7Ci0JdWludDMyX3Qgc2l6ZTsKLQotCXVpbnQzMl90IHRvdGFsX2RldmljZXM7Ci0JdWludDMyX3QgdW5tYXBwZWRfYnVmOwotCXVpbnQzMl90IHVzZWRfYnl0ZXM7Ci0JdWludDMyX3QgcmVzdWx0OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvZGFsX2FkaWUuaCBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvZGFsX2FkaWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFjNDg0Yy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL2RhbF9hZGllLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX01BQ0hfTVNNX1FEU1A2X0FESUVfCi0jZGVmaW5lIF9NQUNIX01TTV9RRFNQNl9BRElFXwotCi0jaW5jbHVkZSAiLi4vZGFsLmgiCi0KLSNkZWZpbmUgQURJRV9EQUxfREVWSUNFCQkweDAyMDAwMDI5Ci0jZGVmaW5lIEFESUVfREFMX1BPUlQJCSJEQUxfQU1fQVVEIgotI2RlZmluZSBBRElFX0RBTF9WRVJTSU9OCTB4MDAwMTAwMDAKLQotZW51bSB7Ci0JQURJRV9PUF9TRVRfUEFUSCA9ICBEQUxfT1BfRklSU1RfREVWSUNFX0FQSSwKLQlBRElFX09QX1BST0NFRURfVE9fU1RBR0UsCi0JQURJRV9PUF9JT0NUTAotfTsKLQotLyogUGF0aCBJRHMgZm9yIG5vcm1hbCBvcGVyYXRpb24uICovCi0jZGVmaW5lIEFESUVfUEFUSF9IQU5EU0VUX1RYCQkJMHgwMTA3NDBmNgotI2RlZmluZSBBRElFX1BBVEhfSEFORFNFVF9SWAkJCTB4MDEwNzQwZjcKLSNkZWZpbmUgQURJRV9QQVRIX0hFQURTRVRfTU9OT19UWAkJMHgwMTA3NDBmOAotI2RlZmluZSBBRElFX1BBVEhfSEVBRFNFVF9TVEVSRU9fVFgJCTB4MDEwNzQwZjkKLSNkZWZpbmUgQURJRV9QQVRIX0hFQURTRVRfTU9OT19SWAkJMHgwMTA3NDBmYQotI2RlZmluZSBBRElFX1BBVEhfSEVBRFNFVF9TVEVSRU9fUlgJCTB4MDEwNzQwZmIKLSNkZWZpbmUgQURJRV9QQVRIX1NQRUFLRVJfVFgJCQkweDAxMDc0MGZjCi0jZGVmaW5lIEFESUVfUEFUSF9TUEVBS0VSX1JYCQkJMHgwMTA3NDBmZAotI2RlZmluZSBBRElFX1BBVEhfU1BFQUtFUl9TVEVSRU9fUlgJCTB4MDEwNzQxMDEKLQotLyogUGF0aCBJRHMgdXNlZCBmb3IgVFRZICovCi0jZGVmaW5lIEFESUVfUEFUSF9UVFlfSEVBRFNFVF9UWAkJMHgwMTA3NDBmZQotI2RlZmluZSBBRElFX1BBVEhfVFRZX0hFQURTRVRfUlgJCTB4MDEwNzQwZmYKLQotLyogUGF0aCBJRHMgdXNlZCBieSBGYWN0b3J5IFRlc3QgTW9kZS4gKi8KLSNkZWZpbmUgQURJRV9QQVRIX0ZUTV9NSUMxX1RYCQkJMHgwMTA3NDEwOAotI2RlZmluZSBBRElFX1BBVEhfRlRNX01JQzJfVFgJCQkweDAxMDc0MTA3Ci0jZGVmaW5lIEFESUVfUEFUSF9GVE1fSFBIX0xfUlgJCQkweDAxMDc0MTA2Ci0jZGVmaW5lIEFESUVfUEFUSF9GVE1fSFBIX1JfUlgJCQkweDAxMDc0MTA0Ci0jZGVmaW5lIEFESUVfUEFUSF9GVE1fRUFSX1JYCQkJMHgwMTA3NDEwMwotI2RlZmluZSBBRElFX1BBVEhfRlRNX1NQS1JfUlgJCQkweDAxMDc0MTAyCi0KLS8qIFBhdGggSURzIGZvciBMb29wYmFjayAqLwotLyogUGF0aCBJRHMgdXNlZCBmb3IgTGluZSBpbiAtPiBBdXhQR0EgLT4gTGluZSBPdXQgU3RlcmVvIE1vZGUqLwotI2RlZmluZSBBRElFX1BBVEhfQVVYUEdBX0xJTkVPVVRfU1RFUkVPX0xCCTB4MDEwNzQxMDAKLS8qIExpbmUgaW4gLT4gQXV4UEdBIC0+IExpbmVPdXQgTW9ubyAqLwotI2RlZmluZSBBRElFX1BBVEhfQVVYUEdBX0xJTkVPVVRfTU9OT19MQgkweDAxMDczZDgyCi0vKiBMaW5lIGluIC0+IEF1eFBHQSAtPiBTdGVyZW8gSGVhZHBob25lICovCi0jZGVmaW5lIEFESUVfUEFUSF9BVVhQR0FfSERQSF9TVEVSRU9fTEIJCTB4MDEwNzQxMDkKLS8qIExpbmUgaW4gLT4gQXV4UEdBIC0+IE1vbm8gSGVhZHBob25lICovCi0jZGVmaW5lIEFESUVfUEFUSF9BVVhQR0FfSERQSF9NT05PX0xCCQkweDAxMDczZDg1Ci0vKiBMaW5lIGluIC0+IEF1eFBHQSAtPiBFYXJwaWVjZSAqLwotI2RlZmluZSBBRElFX1BBVEhfQVVYUEdBX0VBUF9MQgkJCTB4MDEwNzNkODEKLS8qIExpbmUgaW4gLT4gQXV4UEdBIC0+IEF1eE91dCAqLwotI2RlZmluZSBBRElFX1BBVEhfQVVYUEdBX0FVWE9VVF9MQgkJMHgwMTA3M2Q4NgotCi0vKiBDb25jdXJyZW5jeSBQcm9maWxlcyAqLwotI2RlZmluZSBBRElFX1BBVEhfU1BLUl9TVEVSRU9fSERQSF9NT05PX1JYCTB4MDEwNzNkODMKLSNkZWZpbmUgQURJRV9QQVRIX1NQS1JfTU9OT19IRFBIX01PTk9fUlgJMHgwMTA3M2Q4NAotI2RlZmluZSBBRElFX1BBVEhfU1BLUl9NT05PX0hEUEhfU1RFUkVPX1JYCTB4MDEwNzNkODgKLSNkZWZpbmUgQURJRV9QQVRIX1NQS1JfU1RFUkVPX0hEUEhfU1RFUkVPX1JYCTB4MDEwNzNkODkKLQotLyogc3RhZ2VzICovCi0jZGVmaW5lIEFESUVfU1RBR0VfUEFUSF9PRkYJCQkweDAwNTAKLSNkZWZpbmUgQURJRV9TVEFHRV9ESUdJVEFMX1JFQURZCQkweDAxMDAKLSNkZWZpbmUgQURJRV9TVEFHRV9ESUdJVEFMX0FOQUxPR19SRUFEWQkJMHgxMDAwCi0jZGVmaW5lIEFESUVfU1RBR0VfQU5BTE9HX09GRgkJCTB4MDc1MAotI2RlZmluZSBBRElFX1NUQUdFX0RJR0lUQUxfT0ZGCQkJMHgwNjAwCi0KLS8qIHBhdGggdHlwZXMgKi8KLSNkZWZpbmUgQURJRV9QQVRIX1JYCQkwCi0jZGVmaW5lIEFESUVfUEFUSF9UWAkJMQotI2RlZmluZSBBRElFX1BBVEhfTE9PUEJBQ0sJMgotCi0vKiBtdXRlIHN0YXRlcyAqLwotI2RlZmluZSBBRElFX01VVEVfT0ZGCQkwCi0jZGVmaW5lIEFESUVfTVVURV9PTgkJMQotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9kYWxfYXVkaW8uaCBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvZGFsX2F1ZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmOTUxMGIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9kYWxfYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX19EQUxfQVVESU9fSF9fCi0jZGVmaW5lIF9fREFMX0FVRElPX0hfXwotCi0jaW5jbHVkZSAiLi4vZGFsLmgiCi0jaW5jbHVkZSAiZGFsX2F1ZGlvX2Zvcm1hdC5oIgotCi0jZGVmaW5lIEFVRElPX0RBTF9ERVZJQ0UgMHgwMjAwMDAyOAotI2RlZmluZSBBVURJT19EQUxfUE9SVCAiREFMX0FRX0FVRCIKLSNkZWZpbmUgQVVESU9fREFMX1ZFUlNJT04JMHgwMDAzMDAwMQotCi1lbnVtIHsKLQlBVURJT19PUF9DT05UUk9MID0gREFMX09QX0ZJUlNUX0RFVklDRV9BUEksCi0JQVVESU9fT1BfREFUQSwKLQlBVURJT19PUF9JTklULAotfTsKLQotLyogLS0tLSBjb21tb24gYXVkaW8gc3RydWN0dXJlcyAtLS0tICovCi0KLS8qIFRoaXMgZmxhZywgaWYgc2V0LCBpbmRpY2F0ZXMgdGhhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhIGluIHRoZSovCi0vKiBidWZmZXIgaXMgYSBzeW5jaHJvbml6YXRpb24gcG9pbnQgb3Iga2V5IGZyYW1lLCBtZWFuaW5nIG5vIGRhdGEgKi8KLS8qIGJlZm9yZSBpdCBpbiB0aGUgc3RyZWFtIGlzIHJlcXVpcmVkIGluIG9yZGVyIHRvIHJlbmRlciB0aGUgc3RyZWFtICovCi0vKiBmcm9tIHRoaXMgcG9pbnQgb253YXJkLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0JVRkZFUl9GTEFHX1NZTkNfUE9JTlQgICAgICAgIDB4MDEKLQotLyogVGhpcyBmbGFnLCBpZiBzZXQsIGluZGljYXRlcyB0aGF0IHRoZSBidWZmZXIgb2JqZWN0IGlzIHVzaW5nIHZhbGlkICovCi0vKiBwaHlzaWNhbCBhZGRyZXNzIHVzZWQgdG8gc3RvcmUgdGhlIG1lZGlhIGRhdGEgKi8KLSNkZWZpbmUgQURTUF9BVURJT19CVUZGRVJfRkxBR19QSFlTX0FERFIgICAgICAgICAweDA0Ci0KLS8qIFRoaXMgZmxhZywgaWYgc2V0LCBpbmRpY2F0ZXMgdGhhdCBhIG1lZGlhIHN0YXJ0IHRpbWVzdGFtcCBoYXMgYmVlbiAqLwotLyogc2V0IGZvciBhIGJ1ZmZlci4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19CVUZGRVJfRkxBR19TVEFSVF9TRVQgICAgICAgICAweDA4Ci0KLS8qIFRoaXMgZmxhZywgaWYgc2V0LCBpbmRpY2F0ZXMgdGhhdCBhIG1lZGlhIHN0b3AgdGltZXN0YW1wIGhhcyBiZWVuIHNldCAqLwotLyogZm9yIGEgYnVmZmVyLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0JVRkZFUl9GTEFHX1NUT1BfU0VUICAgICAgICAgIDB4MTAKLQotLyogVGhpcyBmbGFnLCBpZiBzZXQsIGluZGljYXRlcyB0aGF0IGEgcHJlcm9sbCB0aW1lc3RhbXAgaGFzIGJlZW4gc2V0ICovCi0vKiBmb3IgYSBidWZmZXIuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fQlVGRkVSX0ZMQUdfUFJFUk9MTF9TRVQgICAgICAgMHgyMAotCi0vKiBUaGlzIGZsYWcsIGlmIHNldCwgaW5kaWNhdGVzIHRoYXQgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlciBpcyBhIGZyYWdtZW50IG9mICovCi0vKiBhIGxhcmdlciBibG9jayBvZiBkYXRhLCBhbmQgd2lsbCBiZSBjb250aW51ZWQgYnkgdGhlIGRhdGEgaW4gdGhlIG5leHQgKi8KLS8qIGJ1ZmZlciB0byBiZSBkZWxpdmVyZWQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fQlVGRkVSX0ZMQUdfQ09OVElOVUFUSU9OICAgICAgMHg0MAotCi1zdHJ1Y3QgYWRzcF9hdWRpb19idWZmZXIgewotCXUzMiBhZGRyOwkJLyogUGh5c2ljYWwgQWRkcmVzcyBvZiBidWZmZXIgKi8KLQl1MzIgbWF4X3NpemU7CQkvKiBNYXhpbXVtIHNpemUgb2YgYnVmZmVyICovCi0JdTMyIGFjdHVhbF9zaXplOwkvKiBBY3R1YWwgc2l6ZSBvZiB2YWxpZCBkYXRhIGluIHRoZSBidWZmZXIgKi8KLQl1MzIgb2Zmc2V0OwkJLyogT2Zmc2V0IHRvIHRoZSBmaXJzdCB2YWxpZCBieXRlICovCi0JdTMyIGZsYWdzOwkJLyogQURTUF9BVURJT19CVUZGRVJfRkxBR3MgdGhhdCBoYXMgYmVlbiBzZXQgKi8KLQlzNjQgc3RhcnQ7CQkvKiBTdGFydCB0aW1lc3RhbXAsIGlmIGFueSAqLwotCXM2NCBzdG9wOwkJLyogU3RvcCB0aW1lc3RhbXAsIGlmIGFueSAqLwotCXM2NCBwcmVyb2xsOwkJLyogUHJlcm9sbCB0aW1lc3RhbXAsIGlmIGFueSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotCi0vKiAtLS0tIGF1ZGlvIGNvbW1hbmRzIC0tLS0gKi8KLQotLyogQ29tbWFuZC9ldmVudCByZXNwb25zZSB0eXBlcyAqLwotI2RlZmluZSBBRFNQX0FVRElPX1JFU1BPTlNFX0NPTU1BTkQgICAwCi0jZGVmaW5lIEFEU1BfQVVESU9fUkVTUE9OU0VfQVNZTkMgICAgIDEKLQotc3RydWN0IGFkc3BfY29tbWFuZF9oZHIgewotCXUzMiBzaXplOwkJLyogc2l6ZW9mKGNtZCkgLSBzaXplb2YodTMyKSAqLwotCi0JdTMyIGRlc3Q7Ci0JdTMyIHNyYzsKLQl1MzIgb3Bjb2RlOwotCXUzMiByZXNwb25zZV90eXBlOwotCXUzMiBzZXFfbnVtYmVyOwotCi0JdTMyIGNvbnRleHQ7CQkvKiBvcGFxdWUgdG8gRFNQICovCi0JdTMyIGRhdGE7Ci0JdTMyIHBhZGRpbmc7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotCi0jZGVmaW5lIERPTUFJTl9BUFAJMAotI2RlZmluZSBET01BSU5fTU9ERU0JMQotI2RlZmluZSBET01BSU5fRFNQCTIKLQotCi0vKiBhZHNwIGF1ZGlvIGFkZHJlc3NlcyBhcmUgKGJ5dGUgb3JkZXIpIG1ham9yLCBtaW5vciwgZG9tYWluICovCi0jZGVmaW5lIEFVRElPX0FERFIoZG1uLCBtYWosIG1pbikgKCgobWFqICYgMHhmZikgPDwgMTYpIFwKLQkJfCAoKG1pbiAmIDB4ZmYpIDw8IDI0KSB8IChkbW4gJiAweGZmKSkKLQotLyogQUFDIEVuY29kZXIgbW9kZXMgKi8KLSNkZWZpbmUgQURTUF9BVURJT19FTkNfQUFDX0xDX09OTFlfTU9ERQkJMAotI2RlZmluZSBBRFNQX0FVRElPX0VOQ19BQUNfUExVU19NT0RFCQkxCi0jZGVmaW5lIEFEU1BfQVVESU9fRU5DX0VOSEFOQ0VEX0FBQ19QTFVTX01PREUJMgotCi1zdHJ1Y3QgYWRzcF9hdWRpb19hYWNfZW5jX2NmZyB7Ci0JdTMyIGJpdF9yYXRlOwkJLyogYml0cyBwZXIgc2Vjb25kICovCi0JdTMyIGVuY29kZXJfbW9kZTsJLyogQURTUF9BVURJT19FTkNfKiAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLSNkZWZpbmUgQURTUF9BVURJT19FTkNfU0JDX0FMTE9DQVRJT05fTUVUSE9EX0xPVU5ETkVTUyAgICAgMAotI2RlZmluZSBBRFNQX0FVRElPX0VOQ19TQkNfQUxMT0NBVElPTl9NRVRIT0RfU05SICAgICAgICAgICAxCi0KLSNkZWZpbmUgQURTUF9BVURJT19FTkNfU0JDX0NIQU5ORUxfTU9ERV9NT05PICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQURTUF9BVURJT19FTkNfU0JDX0NIQU5ORUxfTU9ERV9TVEVSRU8gICAgICAgICAgICAgIDIKLSNkZWZpbmUgQURTUF9BVURJT19FTkNfU0JDX0NIQU5ORUxfTU9ERV9EVUFMICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgQURTUF9BVURJT19FTkNfU0JDX0NIQU5ORUxfTU9ERV9KT0lOVF9TVEVSRU8gICAgICAgIDkKLQotc3RydWN0IGFkc3BfYXVkaW9fc2JjX2VuY29kZXJfY2ZnIHsKLQl1MzIgbnVtX3N1YmJhbmRzOwotCXUzMiBibG9ja19sZW47Ci0JdTMyIGNoYW5uZWxfbW9kZTsKLQl1MzIgYWxsb2NhdGlvbl9tZXRob2Q7Ci0JdTMyIGJpdF9yYXRlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIEFNUiBOQiBlbmNvZGVyIG1vZGVzICovCi0jZGVmaW5lIEFEU1BfQVVESU9fQU1SX01SNDc1CTAKLSNkZWZpbmUgQURTUF9BVURJT19BTVJfTVI1MTUJMQotI2RlZmluZSBBRFNQX0FVRElPX0FNUl9NTVI1OQkyCi0jZGVmaW5lIEFEU1BfQVVESU9fQU1SX01NUjY3CTMKLSNkZWZpbmUgQURTUF9BVURJT19BTVJfTU1SNzQJNAotI2RlZmluZSBBRFNQX0FVRElPX0FNUl9NTVI3OTUJNQotI2RlZmluZSBBRFNQX0FVRElPX0FNUl9NTVIxMDIJNgotI2RlZmluZSBBRFNQX0FVRElPX0FNUl9NTVIxMjIJNwotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSB2YWxpZCBBTVIgTkIgRFRYIG1vZGVzICovCi0jZGVmaW5lIEFEU1BfQVVESU9fQU1SX0RUWF9NT0RFX09GRgkJMAotI2RlZmluZSBBRFNQX0FVRElPX0FNUl9EVFhfTU9ERV9PTl9WQUQxCQkxCi0jZGVmaW5lIEFEU1BfQVVESU9fQU1SX0RUWF9NT0RFX09OX1ZBRDIJCTIKLSNkZWZpbmUgQURTUF9BVURJT19BTVJfRFRYX01PREVfT05fQVVUTwkJMwotCi0vKiBBTVIgRW5jb2RlciBjb25maWd1cmF0aW9uICovCi1zdHJ1Y3QgYWRzcF9hdWRpb19hbXJfZW5jX2NmZyB7Ci0JdTMyCW1vZGU7CQkvKiBBRFNQX0FVRElPX0FNUl9NUiogKi8KLQl1MzIJZHR4X21vZGU7CS8qIEFEU1BfQVVESU9fQU1SX0RUWF9NT0RFKiAqLwotCXUzMgllbmFibGU7CQkvKiAxID0gZW5hYmxlLCAwID0gZGlzYWJsZSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBhZHNwX2F1ZGlvX3FjZWxwMTNrX2VuY19jZmcgewotCXUxNgltaW5fcmF0ZTsKLQl1MTYJbWF4X3JhdGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGFkc3BfYXVkaW9fZXZyY19lbmNfY2ZnIHsKLQl1MTYJbWluX3JhdGU7Ci0JdTE2CW1heF9yYXRlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXVuaW9uIGFkc3BfYXVkaW9fY29kZWNfY29uZmlnIHsKLQlzdHJ1Y3QgYWRzcF9hdWRpb19hbXJfZW5jX2NmZyBhbXI7Ci0Jc3RydWN0IGFkc3BfYXVkaW9fYWFjX2VuY19jZmcgYWFjOwotCXN0cnVjdCBhZHNwX2F1ZGlvX3FjZWxwMTNrX2VuY19jZmcgcWNlbHAxM2s7Ci0Jc3RydWN0IGFkc3BfYXVkaW9fZXZyY19lbmNfY2ZnIGV2cmM7Ci0Jc3RydWN0IGFkc3BfYXVkaW9fc2JjX2VuY29kZXJfY2ZnIHNiYzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0KLS8qIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fT1BFTl9TVFJFQU1fTU9ERV9OT05FCQkweDAwMDAKLQotLyogVGhpcyBiaXQsIGlmIHNldCwgaW5kaWNhdGVzIHRoYXQgdGhlIEFWU3luYyBtb2RlIGlzIGFjdGl2YXRlZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19PUEVOX1NUUkVBTV9NT0RFX0FWU1lOQwkJMHgwMDAxCi0KLS8qIFRoaXMgYml0LCBpZiBzZXQsIGluZGljYXRlcyB0aGF0IHRoZSBTYW1wbGUgUmF0ZS9DaGFubmVsIE1vZGUgKi8KLS8qIENoYW5nZSBOb3RpZmljYXRpb24gbW9kZSBpcyBhY3RpdmF0ZWQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fT1BFTl9TVFJFQU1fTU9ERV9TUl9DTV9OT1RJRlkJMHgwMDAyCi0KLSNkZWZpbmUgIEFEU1BfQVVESU9fT1BFTl9TVFJFQU1fTU9ERV9FTkFCTEVfU1lOQ19DTE9DSwkweDAwMDQKLQotI2RlZmluZSBBRFNQX0FVRElPX01BWF9ERVZJQ0VTIDEKLQotc3RydWN0IGFkc3Bfb3Blbl9jb21tYW5kIHsKLQlzdHJ1Y3QgYWRzcF9jb21tYW5kX2hkciBoZHI7Ci0JdTMyIGRldmljZTsKLQl1MzIgZW5kX3BvaW50OwotCXUzMiBzdHJlYW1fY29udGV4dDsKLQl1MzIgbW9kZTsKLQl1MzIgYnVmX21heF9zaXplOwotCXVuaW9uIGFkc3BfYXVkaW9fZm9ybWF0IGZvcm1hdF9ibG9jazsKLQl1bmlvbiBhZHNwX2F1ZGlvX2NvZGVjX2NvbmZpZyBjb25maWc7Ci0KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0KLS8qIC0tLSBhdWRpbyBjb250cm9sIGFuZCBzdHJlYW0gc2Vzc2lvbiBpb2N0bHMgLS0tLSAqLwotCi0vKiBPcGNvZGUgdG8gb3BlbiBhIGRldmljZSBzdHJlYW0gc2Vzc2lvbiB0byBjYXB0dXJlIGF1ZGlvICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX09QRU5fUkVBRAkJCTB4MDEwOGRkNzkKLQotLyogT3Bjb2RlIHRvIG9wZW4gYSBkZXZpY2Ugc3RyZWFtIHNlc3Npb24gdG8gcmVuZGVyIGF1ZGlvICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX09QRU5fV1JJVEUJCQkweDAxMDhkZDdhCi0KLS8qIE9wY29kZSB0byBvcGVuIGEgZGV2aWNlIHNlc3Npb24sIG11c3Qgb3BlbiBhIGRldmljZSAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9PUEVOX0RFVklDRQkJMHgwMTA4ZGQ3YgotCi0vKiBDbG9zZSBhbiBleGlzdGluZyBzdHJlYW0gb3IgZGV2aWNlICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX0NMT1NFCQkJMHgwMTA4ZDhiYwotCi0KLQotLyogQSBkZXZpY2Ugc3dpdGNoIHJlcXVpcmVzIHRocmVlIElPQ1RMICovCi0vKiBjb21tYW5kcyBpbiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlOiBQUkVQQVJFLCBTVEFOREJZLCBDT01NSVQgKi8KLQotLyogYWRzcF9hdWRpb19kZXZpY2Vfc3dpdGNoX2NvbW1hbmQgc3RydWN0dXJlIGlzIG5lZWRlZCBmb3IgKi8KLS8qIERFVklDRV9TV0lUQ0hfUFJFUEFSRSAqLwotCi0vKiBEZXZpY2Ugc3dpdGNoIHByb3RvY29sIHN0ZXAgIzEuIFBhdXNlIG9sZCBkZXZpY2UgYW5kICovCi0vKiBnZW5lcmF0ZSBzaWxlbmNlIGZvciB0aGUgb2xkIGRldmljZS4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9DTURfREVWSUNFX1NXSVRDSF9QUkVQQVJFCTB4MDEwODE1YzQKLQotLyogRGV2aWNlIHN3aXRjaCBwcm90b2NvbCBzdGVwICMyLiBSZWxlYXNlIG9sZCBkZXZpY2UsICovCi0vKiBjcmVhdGUgbmV3IGRldmljZSBhbmQgZ2VuZXJhdGUgc2lsZW5jZSBmb3IgdGhlIG5ldyBkZXZpY2UuICovCi0KLS8qIFdoZW4gY2xpZW50IHJlY2VpdmVzIGFjayBmb3IgdGhpcyBJT0NUTCwgdGhlIGNsaWVudCBjYW4gKi8KLS8qIHN0YXJ0IHNlbmRpbmcgSU9DVEwgY29tbWFuZHMgdG8gY29uZmlndXJlLCBjYWxpYnJhdGUgYW5kICovCi0vKiBjaGFuZ2UgZmlsdGVyIHNldHRpbmdzIG9uIHRoZSBuZXcgZGV2aWNlLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9ERVZJQ0VfU1dJVENIX1NUQU5EQlkJMHgwMTA4MTVjNQotCi0vKiBEZXZpY2Ugc3dpdGNoIHByb3RvY29sIHN0ZXAgIzMuIFN0YXJ0IG5vcm1hbCBvcGVyYXRpb25zIG9uIG5ldyBkZXZpY2UgKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9DTURfREVWSUNFX1NXSVRDSF9DT01NSVQJMHgwMTA3NWVlNwotCi1zdHJ1Y3QgYWRzcF9kZXZpY2Vfc3dpdGNoX2NvbW1hbmQgewotCXN0cnVjdCBhZHNwX2NvbW1hbmRfaGRyIGhkcjsKLQl1MzIgb2xkX2RldmljZTsKLQl1MzIgbmV3X2RldmljZTsKLQl1OCBkZXZpY2VfY2xhc3M7IC8qIDAgPSBpLnJ4LCAxID0gaS50eCwgMiA9IGUucngsIDMgPSBlLnR4ICovCi0JdTggZGV2aWNlX3R5cGU7IC8qIDAgPSByeCwgMSA9IHR4LCAyID0gYm90aCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotCi0vKiAtLS0gYXVkaW8gY29udHJvbCBzZXNzaW9uIGlvY3RscyAtLS0tICovCi0KLSNkZWZpbmUgQURTUF9QQVRIX1JYCTAKLSNkZWZpbmUgQURTUF9QQVRIX1RYCTEKLSNkZWZpbmUgQURTUF9QQVRIX0JPVEgJMgotCi0vKiBUaGVzZSBjb21tYW5kcyB3aWxsIGFmZmVjdCBhIGxvZ2ljYWwgZGV2aWNlIGFuZCBhbGwgaXRzIGFzc29jaWF0ZWQgKi8KLS8qIHN0cmVhbXMuICovCi0KLQotLyogU2V0IGRldmljZSB2b2x1bWUuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX1NFVF9ERVZJQ0VfVk9MCQkweDAxMDc2MDVjCi0KLXN0cnVjdCBhZHNwX3NldF9kZXZfdm9sdW1lX2NvbW1hbmQgewotCXN0cnVjdCBhZHNwX2NvbW1hbmRfaGRyIGhkcjsKLQl1MzIgZGV2aWNlX2lkOwotCXUzMiBwYXRoOyAvKiAwID0gcngsIDEgPSB0eCwgMiA9IGJvdGggKi8KLQlzMzIgdm9sdW1lOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIFNldCBEZXZpY2Ugc3RlcmVvIHZvbHVtZS4gVGhpcyBjb21tYW5kIGhhcyBkYXRhIHBheWxvYWQsICovCi0vKiBzdHJ1Y3QgYWRzcF9hdWRpb19zZXRfZGV2X3N0ZXJlb192b2x1bWVfY29tbWFuZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9TRVRfREVWSUNFX1NURVJFT19WT0wJCTB4MDEwOGRmM2UKLQotLyogU2V0IEwsIFIgY3Jvc3MgY2hhbm5lbCBnYWluIGZvciBhIERldmljZS4gVGhpcyBjb21tYW5kIGhhcyAqLwotLyogZGF0YSBwYXlsb2FkLCBzdHJ1Y3QgYWRzcF9hdWRpb19zZXRfZGV2X3hfY2hhbl9nYWluX2NvbW1hbmQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfU0VUX0RFVklDRV9YQ0hBTl9HQUlOCQkweDAxMDhkZjQwCi0KLS8qIFNldCBkZXZpY2UgbXV0ZSBzdGF0ZS4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9DTURfU0VUX0RFVklDRV9NVVRFCQkweDAxMDc2MDVmCi0KLXN0cnVjdCBhZHNwX3NldF9kZXZfbXV0ZV9jb21tYW5kIHsKLQlzdHJ1Y3QgYWRzcF9jb21tYW5kX2hkciBoZHI7Ci0JdTMyIGRldmljZV9pZDsKLQl1MzIgcGF0aDsgLyogMCA9IHJ4LCAxID0gdHgsIDIgPSBib3RoICovCi0JdTMyIG11dGU7IC8qIDEgPSBtdXRlICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogQ29uZmlndXJlIEVxdWFsaXplciBmb3IgYSBkZXZpY2UuICovCi0vKiBUaGlzIGNvbW1hbmQgaGFzIHBheWxvYWQgc3RydWN0IGFkc3BfYXVkaW9fc2V0X2Rldl9lcXVhbGl6ZXJfY29tbWFuZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9DTURfU0VUX0RFVklDRV9FUV9DT05GSUcJMHgwMTA4YjEwZQotCi0vKiBTZXQgY29uZmlndXJhdGlvbiBkYXRhIGZvciBhbiBhbGdvcml0aG0gYXNwZWN0IG9mIGEgZGV2aWNlLiAqLwotLyogVGhpcyBjb21tYW5kIGhhcyBwYXlsb2FkIHN0cnVjdCBhZHNwX2F1ZGlvX3NldF9kZXZfY2ZnX2NvbW1hbmQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfU0VUX0RFVklDRV9DT05GSUcJCTB4MDEwOGI2Y2IKLQotc3RydWN0IGFkc3Bfc2V0X2Rldl9jZmdfY29tbWFuZCB7Ci0Jc3RydWN0IGFkc3BfY29tbWFuZF9oZHIgaGRyOwotCXUzMiBkZXZpY2VfaWQ7Ci0JdTMyIGJsb2NrX2lkOwotCXUzMiBpbnRlcmZhY2VfaWQ7Ci0JdTMyIHBoeXNfYWRkcjsKLQl1MzIgcGh5c19zaXplOwotCXUzMiBwaHlzX3VzZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogU2V0IGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgYWxsIGludGVyZmFjZXMgb2YgYSBkZXZpY2UuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfU0VUX0RFVklDRV9DT05GSUdfVEFCTEUJMHgwMTA4YjZiZgotCi1zdHJ1Y3QgYWRzcF9zZXRfZGV2X2NmZ190YWJsZV9jb21tYW5kIHsKLQlzdHJ1Y3QgYWRzcF9jb21tYW5kX2hkciBoZHI7Ci0JdTMyIGRldmljZV9pZDsKLQl1MzIgcGh5c19hZGRyOwotCXUzMiBwaHlzX3NpemU7Ci0JdTMyIHBoeXNfdXNlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiAtLS0tIGF1ZGlvIHN0cmVhbSBkYXRhIGNvbW1hbmRzIC0tLS0gKi8KLQotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9EQVRBX1RYCQkJMHgwMTA4ZGQ3ZgotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9EQVRBX1JYCQkJMHgwMTA4ZGQ4MAotCi1zdHJ1Y3QgYWRzcF9idWZmZXJfY29tbWFuZCB7Ci0Jc3RydWN0IGFkc3BfY29tbWFuZF9oZHIgaGRyOwotCXN0cnVjdCBhZHNwX2F1ZGlvX2J1ZmZlciBidWZmZXI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotCi0KLS8qIC0tLS0gYXVkaW8gc3RyZWFtIGlvY3RscyAob25seSBhZmZlY3QgYSBzaW5nbGUgc3RyZWFtIGluIGEgc2Vzc2lvbikgLS0tLSAqLwotCi0vKiBTdG9wIHN0cmVhbSBmb3IgYXVkaW8gZGV2aWNlLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TVFJFQU1fU1RPUAkJMHgwMTA3NWM1NAotCi0vKiBFbmQgb2Ygc3RyZWFtIHJlYWNoZWQuIENsaWVudCB3aWxsIG5vdCBzZW5kIGFueSBtb3JlIGRhdGEuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX1NUUkVBTV9FT1MJCQkweDAxMDhiMTUwCi0KLS8qIERvIHNhbXBsZSBzbGlwcGluZy9zdHVmZmluZyBvbiBBQUMgb3V0cHV0cy4gVGhlIHBheWxvYWQgb2YgKi8KLS8qIHRoaXMgY29tbWFuZCBpcyBzdHJ1Y3QgYWRzcF9hdWRpb19zbGlwX3NhbXBsZV9jb21tYW5kLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TVFJFQU1fU0xJUFNBTVBMRQkJMHgwMTA4ZDQwZQotCi0vKiBTZXQgc3RyZWFtIHZvbHVtZS4gKi8KLS8qIFRoaXMgY29tbWFuZCBoYXMgZGF0YSBwYXlsb2FkLCBzdHJ1Y3QgYWRzcF9hdWRpb19zZXRfdm9sdW1lX2NvbW1hbmQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX1NFVF9TVFJFQU1fVk9MCQkweDAxMDhjMGRlCi0KLS8qIFNldCBzdHJlYW0gc3RlcmVvIHZvbHVtZS4gVGhpcyBjb21tYW5kIGhhcyBkYXRhIHBheWxvYWQsICovCi0vKiBzdHJ1Y3QgYWRzcF9hdWRpb19zZXRfc3RlcmVvX3ZvbHVtZV9jb21tYW5kLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX1NFVF9TVFJFQU1fU1RFUkVPX1ZPTAkJMHgwMTA4ZGQ3YwotCi0vKiBTZXQgTCwgUiBjcm9zcyBjaGFubmVsIGdhaW4gZm9yIGEgU3RyZWFtLiBUaGlzIGNvbW1hbmQgaGFzICovCi0vKiBkYXRhIHBheWxvYWQsIHN0cnVjdCBhZHNwX2F1ZGlvX3NldF94X2NoYW5fZ2Fpbl9jb21tYW5kLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX1NFVF9TVFJFQU1fWENIQU5fR0FJTgkJMHgwMTA4ZGQ3ZAotCi0vKiBTZXQgc3RyZWFtIG11dGUgc3RhdGUuICovCi0vKiBUaGlzIGNvbW1hbmQgaGFzIGRhdGEgcGF5bG9hZCwgc3RydWN0IGFkc3BfYXVkaW9fc2V0X3N0cmVhbV9tdXRlLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVRfU1RSRUFNX01VVEUJCTB4MDEwOGMwZGYKLQotLyogUmVjb25maWd1cmUgYml0IHJhdGUgaW5mb3JtYXRpb24uIFRoaXMgY29tbWFuZCBoYXMgZGF0YSAqLwotLyogcGF5bG9hZCwgc3RydWN0IGFkc3BfYXVkaW9fc2V0X2JpdF9yYXRlX2NvbW1hbmQgKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9TRVRfU1RSRUFNX0JJVFJBVEUJCTB4MDEwOGNjZjEKLQotLyogU2V0IENoYW5uZWwgTWFwcGluZy4gVGhpcyBjb21tYW5kIGhhcyBkYXRhIHBheWxvYWQsIHN0cnVjdCAqLwotLyogVGhpcyBjb21tYW5kIGhhcyBkYXRhIHBheWxvYWQgc3RydWN0IGFkc3BfYXVkaW9fc2V0X2NoYW5uZWxfbWFwX2NvbW1hbmQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfU0VUX1NUUkVBTV9DSEFOTkVMTUFQCQkweDAxMDhkMzJhCi0KLS8qIEVuYWJsZS9kaXNhYmxlIEFBQ1BsdXMgU0JSLiAqLwotLyogVGhpcyBjb21tYW5kIGhhcyBkYXRhIHBheWxvYWQgc3RydWN0IGFkc3BfYXVkaW9fc2V0X3Nicl9jb21tYW5kICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfU0VUX1NUUkVBTV9TQlIJCQkweDAxMDhkNDE2Ci0KLS8qIEVuYWJsZS9kaXNhYmxlIFdNQSBQcm8gQ2hleCBhbmQgRmV4LiBUaGlzIGNvbW1hbmQgaGFzIGRhdGEgcGF5bG9hZCAqLwotLyogc3RydWN0IGFkc3BfYXVkaW9fc3RyZWFtX3NldF93bWFfY29tbWFuZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9TRVRfU1RSRUFNX1dNQVBSTwkJMHgwMTA4ZDQxNwotCi0KLS8qIC0tLS0gYXVkaW8gc2Vzc2lvbiBpb2N0bHMgKGFmZmVjdCBhbGwgc3RyZWFtcyBpbiBhIHNlc3Npb24pIC0tLSAqLwotCi0vKiBTdGFydCBzdHJlYW0gZm9yIGF1ZGlvIGRldmljZS4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9DTURfU0VTU0lPTl9TVEFSVAkJMHgwMTA4MTVjNgotCi0vKiBTdG9wIGFsbCBzdHJlYW0ocykgZm9yIGF1ZGlvIHNlc3Npb24gYXMgaW5kaWNhdGVkIGJ5IG1ham9yIGlkLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVNTSU9OX1NUT1AJCTB4MDEwOGRkN2UKLQotLyogUGF1c2UgdGhlIGRhdGEgZmxvdyBmb3IgYSBzZXNzaW9uIGFzIGluZGljYXRlZCBieSBtYWpvciBpZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9DTURfU0VTU0lPTl9QQVVTRQkJMHgwMTA3NWVlOAotCi0vKiBSZXN1bWUgdGhlIGRhdGEgZmxvdyBmb3IgYSBzZXNzaW9uIGFzIGluZGljYXRlZCBieSBtYWpvciBpZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9DTURfU0VTU0lPTl9SRVNVTUUJCTB4MDEwNzVlZTkKLQotLyogRHJvcCBhbnkgdW5wcm9jZXNzZWQgZGF0YSBidWZmZXJzIGZvciBhIHNlc3Npb24gYXMgaW5kaWNhdGVkIGJ5IG1ham9yIGlkLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVNTSU9OX0ZMVVNICQkweDAxMDc1ZWVhCi0KLS8qIFN0YXJ0IFN0cmVhbSBEVE1GIHRvbmUgKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9DTURfU0VTU0lPTl9EVE1GX1NUQVJUCQkweDAxMDhjMGRkCi0KLS8qIFN0b3AgU3RyZWFtIERUTUYgdG9uZSAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVNTSU9OX0RUTUZfU1RPUAkJMHgwMTA4NzU1NAotCi0vKiBTZXQgU2Vzc2lvbiB2b2x1bWUuICovCi0vKiBUaGlzIGNvbW1hbmQgaGFzIGRhdGEgcGF5bG9hZCwgc3RydWN0IGFkc3BfYXVkaW9fc2V0X3ZvbHVtZV9jb21tYW5kLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX1NFVF9TRVNTSU9OX1ZPTAkJMHgwMTA4ZDhiZAotCi0vKiBTZXQgc2Vzc2lvbiBzdGVyZW8gdm9sdW1lLiBUaGlzIGNvbW1hbmQgaGFzIGRhdGEgcGF5bG9hZCwgKi8KLS8qIHN0cnVjdCBhZHNwX2F1ZGlvX3NldF9zdGVyZW9fdm9sdW1lX2NvbW1hbmQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfU0VUX1NFU1NJT05fU1RFUkVPX1ZPTAkJMHgwMTA4ZGYzZAotCi0vKiBTZXQgTCwgUiBjcm9zcyBjaGFubmVsIGdhaW4gZm9yIGEgc2Vzc2lvbi4gVGhpcyBjb21tYW5kIGhhcyAqLwotLyogZGF0YSBwYXlsb2FkLCBzdHJ1Y3QgYWRzcF9hdWRpb19zZXRfeF9jaGFuX2dhaW5fY29tbWFuZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9TRVRfU0VTU0lPTl9YQ0hBTl9HQUlOCQkweDAxMDhkZjNmCi0KLS8qIFNldCBTZXNzaW9uIG11dGUgc3RhdGUuICovCi0vKiBUaGlzIGNvbW1hbmQgaGFzIGRhdGEgcGF5bG9hZCwgc3RydWN0IGFkc3BfYXVkaW9fc2V0X211dGVfY29tbWFuZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9TRVRfU0VTU0lPTl9NVVRFCQkweDAxMDhkOGJlCi0KLS8qIENvbmZpZ3VyZSBFcXVhbGl6ZXIgZm9yIGEgc3RyZWFtLiAqLwotLyogVGhpcyBjb21tYW5kIGhhcyBwYXlsb2FkIHN0cnVjdCBhZHNwX2F1ZGlvX3NldF9lcXVhbGl6ZXJfY29tbWFuZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9TRVRfU0VTU0lPTl9FUV9DT05GSUcJCTB4MDEwOGMwZTAKLQotLyogU2V0IEF1ZGlvIFZpZGVvIHN5bmMgaW5mb3JtYXRpb24uICovCi0vKiBUaGlzIGNvbW1hbmQgaGFzIGRhdGEgcGF5bG9hZCwgc3RydWN0IGFkc3BfYXVkaW9fc2V0X2F2X3N5bmNfY29tbWFuZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9TRVRfU0VTU0lPTl9BVlNZTkMJCTB4MDEwOGQxZTIKLQotLyogR2V0IEF1ZGlvIE1lZGlhIFNlc3Npb24gdGltZS4gKi8KLS8qIFRoaXMgY29tbWFuZCByZXR1cm5zIHRoZSBhdWRpb1RpbWUgaW4gYWRzcF9hdWRpb191bnNpZ25lZDY0X2V2ZW50ICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX0dFVF9BVURJT19USU1FCQkweDAxMDhjMjZjCi0KLQotLyogdGhlc2UgY29tbWFuZCBzdHJ1Y3R1cmVzIGFyZSB1c2VkIGZvciBib3RoIFNUUkVBTSBhbmQgU0VTU0lPTiBpb2N0bHMgKi8KLQotc3RydWN0IGFkc3Bfc2V0X3ZvbHVtZV9jb21tYW5kIHsKLQlzdHJ1Y3QgYWRzcF9jb21tYW5kX2hkciBoZHI7Ci0JczMyIHZvbHVtZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgYWRzcF9zZXRfbXV0ZV9jb21tYW5kIHsKLQlzdHJ1Y3QgYWRzcF9jb21tYW5kX2hkciBoZHI7Ci0JdTMyIG11dGU7IC8qIDEgPT0gbXV0ZSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotCi0vKiAtLS0tIGF1ZGlvIGV2ZW50cyAtLS0tICovCi0KLS8qIEFsbCBJT0NUTCBjb21tYW5kcyBnZW5lcmF0ZSBhbiBldmVudCB3aXRoIHRoZSBJT0NUTCBvcGNvZGUgYXMgdGhlICovCi0vKiBldmVudCBpZCBhZnRlciB0aGUgSU9DVEwgY29tbWFuZCBoYXMgYmVlbiBleGVjdXRlZC4gKi8KLQotLyogVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgYWZ0ZXIgYSBtZWRpYSBzdHJlYW0gc2Vzc2lvbiBpcyBvcGVuZWQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRVZUX1NUQVRVU19PUEVOCQkJCTB4MDEwOGMwZDYKLQotLyogVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgYWZ0ZXIgYSBtZWRpYSBzdHJlYW0gIHNlc3Npb24gaXMgY2xvc2VkLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0VWVF9TVEFUVVNfQ0xPU0UJCQkJMHgwMTA4YzBkNwotCi0vKiBBc3luY3Jvbm91cyBidWZmZXIgY29uc3VtcHRpb24uIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIGFmdGVyIGEgKi8KLS8qIHJlY2l2ZWQgIGJ1ZmZlciBpcyBjb25zdW1lZCBkdXJpbmcgcmVuZGVyaW5nIG9yIGZpbGxlZCBkdXJpbmcgKi8KLS8qIGNhcHR1cmUgb3BlYXJ0aW9uLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0VWVF9TVEFUVVNfQlVGX0RPTkUJCQkJMHgwMTA4YzBkOAotCi0vKiBUaGlzIGV2ZW50IGlzIGdlbmVyYXRlZCB3aGVuIHJlbmRlcmluZyBvcGVyYXRpb24gaXMgc3RhcnZpbmcgZm9yICovCi0vKiBkYXRhLiBJbiBvcmRlciB0byBhdm9pZCBhdWRpbyBsb3NzIGF0IHRoZSBlbmQgb2YgYSBwbGF1YmFjaywgdGhlICovCi0vKiBjbGllbnQgc2hvdWxkIHdhaXQgZm9yIHRoaXMgZXZlbnQgYmVmb3JlIGlzc3VpbmcgdGhlIGNsb3NlIGNvbW1hbmQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRVZUX1NUQVRVU19CVUZfVU5ERVJSVU4JCQkweDAxMDhjMGQ5Ci0KLS8qIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIGR1cmluZyBjYXB0dXJlIG9wZXJhdGlvbiB3aGVuIHRoZXJlIGFyZSBubyAqLwotLyogYnVmZmVycyBhdmFpbGFibGUgdG8gY29weSB0aGUgY2FwdHVyZWQgYXVkaW8gZGF0YSAqLwotI2RlZmluZSBBRFNQX0FVRElPX0VWVF9TVEFUVVNfQlVGX09WRVJGTE9XCQkJMHgwMTA4YzBkYQotCi0vKiBUaGlzIGFzeW5jaHJvbm91cyBldmVudCBpcyBnZW5lcmF0ZWQgYXMgYSByZXN1bHQgb2YgYW4gaW5wdXQgKi8KLS8qIHNhbXBsZSByYXRlIGNoYW5nZSBhbmQvb3IgY2hhbm5lbCBtb2RlIGNoYW5nZSBkZXRlY3RlZCBieSB0aGUgKi8KLS8qIGRlY29kZXIuIFRoZSBldmVudCBwYXlsb2FkIGRhdGEgaXMgYW4gYXJyYXkgb2YgMiB1aW50MzIgKi8KLS8qIHZhbHVlcyBjb250YWluaW5nIHRoZSBzYW1wbGUgcmF0ZSBpbiBIeiBhbmQgY2hhbm5lbCBtb2RlLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0VWVF9TUl9DTV9DSEFOR0UJCQkJMHgwMTA4ZDMyOQotCi1zdHJ1Y3QgYWRzcF9ldmVudF9oZHIgewotCXUzMiBldnRfaGFuZGxlOwkJLyogREFMIGNvbW1vbiBoZWFkZXIgKi8KLQl1MzIgZXZ0X2Nvb2tpZTsKLQl1MzIgZXZ0X2xlbmd0aDsKLQotCXUzMiBkZXN0OwotCXUzMiBzcmM7Ci0KLQl1MzIgZXZlbnRfaWQ7Ci0JdTMyIHJlc3BvbnNlX3R5cGU7Ci0JdTMyIHNlcV9udW1iZXI7Ci0KLQl1MzIgY29udGV4dDsJCS8qIG9wYXF1ZSB0byBEU1AgKi8KLQl1MzIgZGF0YTsKLQotCXUzMiBzdGF0dXM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGFkc3BfYnVmZmVyX2V2ZW50IHsKLQlzdHJ1Y3QgYWRzcF9ldmVudF9oZHIgaGRyOwotCXN0cnVjdCBhZHNwX2F1ZGlvX2J1ZmZlciBidWZmZXI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotCi0vKiAtLS0tIGF1ZGlvIGRldmljZSBJRHMgLS0tLSAqLwotCi0vKiBEZXZpY2UgZGlyZWN0aW9uIFJ4L1R4IGZsYWcgKi8KLSNkZWZpbmUgQURTUF9BVURJT19SWF9ERVZJQ0UJCTB4MDAKLSNkZWZpbmUgQURTUF9BVURJT19UWF9ERVZJQ0UJCTB4MDEKLQotI2RlZmluZSBBRFNQX0FVRElPX0RFVklDRV9JRF9ERUZBVUxUCQkweDEwODE2NzkKLQotLyogRGVmYXVsdCBSWCBvciBUWCBkZXZpY2UgKi8KLQotI2RlZmluZSBBRFNQX0FVRElPX0RFVklDRV9JRF9IQU5EU0VUX01JQwkweDEwN2FjOGQKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfSEFORFNFVF9EVUFMX01JQwkJMHgxMDhmOWMzCi0jZGVmaW5lIEFEU1BfQVVESU9fREVWSUNFX0lEX0hFQURTRVRfTUlDCTB4MTA4MTUxMAotI2RlZmluZSBBRFNQX0FVRElPX0RFVklDRV9JRF9TUEtSX1BIT05FX01JQwkweDEwODE1MTIKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9EVUFMX01JQwkweDEwOGY5YzUKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfQlRfU0NPX01JQwkJMHgxMDgxNTE4Ci0jZGVmaW5lIEFEU1BfQVVESU9fREVWSUNFX0lEX1RUWV9IRUFEU0VUX01JQwkweDEwODE1MWIKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfSTJTX01JQwkJMHgxMDg5YmYzCi0KLS8qIFNwZWNpYWwgbG9vcGJhY2sgcHNldWRvIGRldmljZSB0byBiZSBwYWlyZWQgd2l0aCBhbiBSWCBkZXZpY2UgKi8KLS8qIHdpdGggdXNhZ2UgQURTUF9BVURJT19ERVZJQ0VfVVNBR0VfTUlYRURfUENNX0xPT1BCQUNLICovCi0jZGVmaW5lIEFEU1BfQVVESU9fREVWSUNFX0lEX01JWEVEX1BDTV9MT09QQkFDS19UWAkweDEwODliZjIKLQotLyogU2luayAoUlgpIGRldmljZXMgKi8KLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfSEFORFNFVF9TUEtSCQkJMHgxMDdhYzg4Ci0jZGVmaW5lIEFEU1BfQVVESU9fREVWSUNFX0lEX0hFQURTRVRfU1BLUl9NT05PCQkJMHgxMDgxNTExCi0jZGVmaW5lIEFEU1BfQVVESU9fREVWSUNFX0lEX0hFQURTRVRfU1BLUl9TVEVSRU8JCTB4MTA3YWM4YQotI2RlZmluZSBBRFNQX0FVRElPX0RFVklDRV9JRF9TUEtSX1BIT05FX01PTk8JCQkweDEwODE1MTMKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9NT05PX1dfTU9OT19IRUFEU0VUICAgICAweDEwOGM1MDgKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9NT05PX1dfU1RFUkVPX0hFQURTRVQgICAweDEwOGM4OTQKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9TVEVSRU8JCQkweDEwODE1MTQKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9TVEVSRU9fV19NT05PX0hFQURTRVQgICAweDEwOGM4OTUKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9TVEVSRU9fV19TVEVSRU9fSEVBRFNFVAkweDEwOGM1MDkKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfQlRfU0NPX1NQS1IJCQkweDEwODE1MTkKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfVFRZX0hFQURTRVRfU1BLUgkJCTB4MTA4MTUxYwotI2RlZmluZSBBRFNQX0FVRElPX0RFVklDRV9JRF9JMlNfU1BLUgkJCQkweDEwODliZjQKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfTlVMTF9TSU5LCQkJCTB4MTA4ZTUxMgotCi0vKiBCVCBBMkRQIHBsYXliYWNrIGRldmljZS4gKi8KLS8qIFRoaXMgZGV2aWNlIG11c3QgYmUgcGFpcmVkIHdpdGggKi8KLS8qIEFEU1BfQVVESU9fREVWSUNFX0lEX01JWEVEX1BDTV9MT09QQkFDS19UWCB1c2luZyAgKi8KLS8qIEFEU1BfQVVESU9fREVWSUNFX1VTQUdFX01JWEVEX1BDTV9MT09QQkFDSyBtb2RlICovCi0jZGVmaW5lIEFEU1BfQVVESU9fREVWSUNFX0lEX0JUX0EyRFBfU1BLUgkweDEwODE1MWEKLQotLyogVm9pY2UgRGVzdGluYXRpb24gaWRlbnRpZmllciAtIHNwZWNpZmljYWxseSB1c2VkIGZvciAqLwotLyogY29udHJvbGxpbmcgVm9pY2UgbW9kdWxlIGZyb20gdGhlIERldmljZSBDb250cm9sIFNlc3Npb24gKi8KLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfVk9JQ0UJCTB4MDEwOGRmM2MKLQotLyogIEF1ZGlvIGRldmljZSB1c2FnZSB0eXBlcy4gKi8KLS8qICBUaGlzIGlzIGEgYml0IG1hc2sgdG8gZGV0ZXJtaW5lIHdoaWNoIHRvcG9sb2d5IHRvIHVzZSBpbiB0aGUgKi8KLS8qIGRldmljZSBzZXNzaW9uICovCi0jZGVmaW5lIEFEU1BfQVVESU9fREVWSUNFX0NPTlRFWFRfVk9JQ0UJCQkweDAxCi0jZGVmaW5lIEFEU1BfQVVESU9fREVWSUNFX0NPTlRFWFRfUExBWUJBQ0sJCTB4MDIKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfQ09OVEVYVF9NSVhFRF9SRUNPUkQJCTB4MTAKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfQ09OVEVYVF9SRUNPUkQJCTB4MjAKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfQ09OVEVYVF9QQ01fTE9PUEJBQ0sJCTB4NDAKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL2RhbF9hdWRpb19mb3JtYXQuaCBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvZGFsX2F1ZGlvX2Zvcm1hdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMThmYTUzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvZGFsX2F1ZGlvX2Zvcm1hdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0FEU1BfQVVESU9fTUVESUFfRk9STUFUX0gKLSNkZWZpbmUgX19BRFNQX0FVRElPX01FRElBX0ZPUk1BVF9ICi0KLS8qIFN1cHBvcnRlZCBhdWRpbyBtZWRpYSBmb3JtYXRzICovCi0KLS8qIGZvcm1hdCBibG9jayBpbiBzaG1lbSAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9TSEFSRURNRU1PUlkJMHgwMTA5MWE3OAotCi0vKiBhZHNwX2F1ZGlvX2Zvcm1hdF9yYXdfcGNtIHR5cGUgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfUENNCQkweDAxMDNkMmZkCi0KLS8qIGFkc3BfYXVkaW9fZm9ybWF0X3Jhd19wY20gdHlwZSAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9EVE1GCQkweDAxMDg3NzI1Ci0KLS8qIGFkc3BfYXVkaW9fZm9ybWF0X2FkcGNtIHR5cGUgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfQURQQ00JCTB4MDEwM2QyZmYKLQotLyogWWFtYWhhIFBDTSBmb3JtYXQgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfWUFEUENNCTB4MDEwOGRjMDcKLQotLyogSVNPL0lFQyAxMTE3MiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9NUDMJCTB4MDEwM2QzMDgKLQotLyogSVNPL0lFQyAxNDQ5NiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9NUEVHNF9BQUMJMHgwMTA0MjJmMQotCi0vKiBBTVItTkIgYXVkaW8gaW4gRlMgZm9ybWF0ICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX0FNUk5CX0ZTCTB4MDEwNWMxNmMKLQotLyogQU1SLVdCIGF1ZGlvIGluIEZTIGZvcm1hdCAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9BTVJXQl9GUwkweDAxMDVjMTZlCi0KLS8qIFFDRUxQIDEzaywgSVM3MzMgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfVjEzS19GUwkweDAxMDgwYjhhCi0KLS8qIEVWUkMgICA4aywgSVMxMjcgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfRVZSQ19GUwkweDAxMDgwYjg5Ci0KLS8qIEVWUkMtQiAgIDhrLCA0R1YgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfRVZSQ0JfRlMJMHgwMTA4ZjJhMwotCi0vKiBNSURJIGNvbW1hbmQgc3RyZWFtICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX01JREkJCTB4MDEwM2QzMDAKLQotLyogQTJEUCBTQkMgc3RyZWFtICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX1NCQwkJMHgwMTA4YzRkOAotCi0vKiBWZXJzaW9uIDEwIFByb2Zlc3Npb25hbCAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9XTUFfVjEwUFJPCTB4MDEwOGFhOTIKLQotLyogVmVyc2lvbiA5IFN0YXJuZGFyZCAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9XTUFfVjkJMHgwMTA4ZDQzMAotCi0vKiBBTVIgV2lkZUJhbmQgUGx1cyAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9BTVJfV0JfUExVUyAgIDB4MDEwOGYzZGEKLQotLyogQUMzIERlY29kZXIgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfQUMzX0RFQ09ERVIgICAweDAxMDhkNWY5Ci0KLS8qIE5vdCB5ZXQgc3VwcG9ydGVkIGF1ZGlvIG1lZGlhIGZvcm1hdHMgKi8KLQotLyogSVNPL0lFQyAxMzgxOCAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9NUEVHMl9BQUMJMHgwMTAzZDMwOQotCi0vKiAzR1BQIFRTIDI2LjEwMSBTZWMgNC4wICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX0FNUk5CX0lGMQkweDAxMDNkMzA1Ci0KLS8qIDNHUFAgVFMgMjYuMTAxIEFubmV4IEEgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfQU1STkJfSUYyCTB4MDEwNTdiMzEKLQotLyogM0dQUCBUUyAyNi4yMDEgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfQU1SV0JfSUYxCTB4MDEwM2QzMDYKLQotLyogM0dQUCBUUyAyNi4yMDEgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfQU1SV0JfSUYyCTB4MDEwNWMxNmQKLQotLyogRy43MTEgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfRzcxMQkJMHgwMTA2MjAxZAotCi0vKiBRQ0VMUCAgOGssIElTOTZBICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX1Y4S19GUwkweDAxMDgxZDI5Ci0KLS8qIFZlcnNpb24gMSBjb2RlYyAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9XTUFfVjEJMHgwMTA1NWIyYgotCi0vKiBWZXJzaW9uIDIsIDcgJiA4IGNvZGVjICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX1dNQV9WOAkweDAxMDU1YjJjCi0KLS8qIFZlcnNpb24gOSBQcm9mZXNzaW9uYWwgY29kZWMgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfV01BX1Y5UFJPCTB4MDEwNTViMmQKLQotLyogVmVyc2lvbiA5IFZvaWNlIGNvZGVjICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX1dNQV9TUDEJMHgwMTA1NWIyZQotCi0vKiBWZXJzaW9uIDkgTG9zc2xlc3MgY29kZWMgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfV01BX0xPU1NMRVNTCTB4MDEwNTViMmYKLQotLyogUmVhbCBNZWRpYSBjb250ZW50LCBsb3ctYml0cmF0ZSAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9SQV9TSVBSCTB4MDEwNDJhMGYKLQotLyogUmVhbCBNZWRpYSBjb250ZW50ICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX1JBX0NPT0sJMHgwMTA0MmEwZQotCi0KLS8qIEZvciBhbGwgb2YgdGhlIGF1ZGlvIGZvcm1hdHMsIHVubGVzcyBzcGVjaWZpZWQgb3RoZXJ3aXNlLCAqLwotLyogdGhlIGZvbGxvd2luZyBhcHBseTogKi8KLS8qIEZvcm1hdCBibG9jayBiaXRzIGFyZSBhcnJhbmdlZCBpbiBieXRlcyBhbmQgd29yZHMgaW4gbGl0dGxlLWVuZGlhbiAqLwotLyogb3JkZXIsIGkuZS4sIGxlYXN0LXNpZ25pZmljYW50IGJpdCBmaXJzdCBhbmQgbGVhc3Qtc2lnbmlmaWNhbnQgKi8KLS8qIGJ5dGUgZmlyc3QuICovCi0KLQotLyogQUFDIEZvcm1hdCBCbG9jay4gKi8KLQotLyogQUFDIGZvcm1hdCBibG9jayBjb25zaXN0IG9mIGEgZm9ybWF0IGlkZW50aWZpZXIgZm9sbG93ZWQgYnkgKi8KLS8qIEF1ZGlvU3BlY2lmaWNDb25maWcgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08vSUVDIDE0NDk2LTMgKi8KLQotLyogVGhlIGZvbGxvd2luZyBBQUMgZm9ybWF0IGlkZW50aWZpZXJzIGFyZSBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgQURTUF9BVURJT19BQUNfQURUUwkJMHgwMTA2MTljZgotI2RlZmluZSBBRFNQX0FVRElPX0FBQ19NUEVHNF9BRFRTCTB4MDEwNjE5ZDAKLSNkZWZpbmUgQURTUF9BVURJT19BQUNfTE9BUwkJMHgwMTA2MTlkMQotI2RlZmluZSBBRFNQX0FVRElPX0FBQ19BRElGCQkweDAxMDYxOWQyCi0jZGVmaW5lIEFEU1BfQVVESU9fQUFDX1JBVwkJMHgwMTA2MTlkMwotI2RlZmluZSBBRFNQX0FVRElPX0FBQ19GUkFNRURfUkFXCTB4MDEwOGMxZmIKLQotc3RydWN0IGFkc3BfYXVkaW9fbm9fcGF5bG9hZF9mb3JtYXQgewotCS8qIE1lZGlhIEZvcm1hdCBDb2RlIChtdXN0IGFsd2F5cyBiZSBmaXJzdCBlbGVtZW50KSAqLwotCXUzMiBmb3JtYXQ7Ci0JLyogbm8gcGF5bG9hZCBmb3IgdGhpcyBmb3JtYXQgdHlwZSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIE1heG11bSBudW1iZXIgb2YgYnl0ZXMgYWxsb3dlZCBpbiBhIGZvcm1hdCBibG9jayAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9EQVRBX01BWCAxNgotCi0vKiBGb3IgY29udmVuaWVuY2UsIHRvIGJlIHVzZWQgYXMgYSBzdGFuZGFyZCBmb3JtYXQgYmxvY2sgKi8KLS8qIGZvciB2YXJpb3VzIG1lZGlhIHR5cGVzIHRoYXQgZG9uJ3QgbmVlZCBhIHVuaXF1ZSBmb3JtYXQgYmxvY2sgKi8KLS8qIGllLiBQQ00sIERUTUYsIGV0Yy4gKi8KLXN0cnVjdCBhZHNwX2F1ZGlvX3N0YW5kYXJkX2Zvcm1hdCB7Ci0JLyogTWVkaWEgRm9ybWF0IENvZGUgKG11c3QgYWx3YXlzIGJlIGZpcnN0IGVsZW1lbnQpICovCi0JdTMyIGZvcm1hdDsKLQotCS8qIHBheWxvYWQgKi8KLQl1MTYgY2hhbm5lbHM7Ci0JdTE2IGJpdHNfcGVyX3NhbXBsZTsKLQl1MzIgc2FtcGxpbmdfcmF0ZTsKLQl1OCBpc19zaWduZWQ7Ci0JdTggaXNfaW50ZXJsZWF2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogQURQQ00gZm9ybWF0IGJsb2NrICovCi1zdHJ1Y3QgYWRzcF9hdWRpb19hZHBjbV9mb3JtYXQgewotCS8qIE1lZGlhIEZvcm1hdCBDb2RlIChtdXN0IGFsd2F5cyBiZSBmaXJzdCBlbGVtZW50KSAqLwotCXUzMiBmb3JtYXQ7Ci0KLQkvKiBwYXlsb2FkICovCi0JdTE2IGNoYW5uZWxzOwotCXUxNiBiaXRzX3Blcl9zYW1wbGU7Ci0JdTMyIHNhbXBsaW5nX3JhdGU7Ci0JdTggaXNfc2lnbmVkOwotCXU4IGlzX2ludGVybGVhdmVkOwotCXUzMiBibG9ja19zaXplOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIE1JREkgZm9ybWF0IGJsb2NrICovCi1zdHJ1Y3QgYWRzcF9hdWRpb19taWRpX2Zvcm1hdCB7Ci0JLyogTWVkaWEgRm9ybWF0IENvZGUgKG11c3QgYWx3YXlzIGJlIGZpcnN0IGVsZW1lbnQpICovCi0JdTMyIGZvcm1hdDsKLQotCS8qIHBheWxvYWQgKi8KLQl1MzIgc2FtcGxpbmdfcmF0ZTsKLQl1MTYgY2hhbm5lbHM7Ci0JdTE2IG1vZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotI2RlZmluZSBBRFNQX0FVRElPX0NPTVBBTkRJTkdfQUxBVwkweDEwNjE5Y2QKLSNkZWZpbmUgQURTUF9BVURJT19DT01QQU5ESU5HX01MQVcJMHgxMDYxOWNlCi0KLS8qIEc3MTEgZm9ybWF0IGJsb2NrICovCi1zdHJ1Y3QgYWRzcF9hdWRpb19nNzExX2Zvcm1hdCB7Ci0JLyogTWVkaWEgRm9ybWF0IENvZGUgKG11c3QgYWx3YXlzIGJlIGZpcnN0IGVsZW1lbnQpICovCi0JdTMyIGZvcm1hdDsKLQotCS8qIHBheWxvYWQgKi8KLQl1MzIgY29tcGFuZGluZzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0KLXN0cnVjdCBhZHNwX2F1ZGlvX3dtYV9wcm9fZm9ybWF0IHsKLQkvKiBNZWRpYSBGb3JtYXQgQ29kZSAobXVzdCBhbHdheXMgYmUgZmlyc3QgZWxlbWVudCkgKi8KLQl1MzIgZm9ybWF0OwotCi0JLyogcGF5bG9hZCAqLwotCXUxNiBmb3JtYXRfdGFnOwotCXUxNiBjaGFubmVsczsKLQl1MzIgc2FtcGxlc19wZXJfc2VjOwotCXUzMiBhdmdfYnl0ZXNfcGVyX3NlYzsKLQl1MTYgYmxvY2tfYWxpZ247Ci0JdTE2IHZhbGlkX2JpdHNfcGVyX3NhbXBsZTsKLQl1MzIgY2hhbm5lbF9tYXNrOwotCXUxNiBlbmNvZGVfb3B0OwotCXUxNiBhZHZhbmNlZF9lbmNvZGVfb3B0OwotCXUzMiBhZHZhbmNlZF9lbmNvZGVfb3B0MjsKLQl1MzIgZHJjX3BlYWtfcmVmZXJlbmNlOwotCXUzMiBkcmNfcGVha190YXJnZXQ7Ci0JdTMyIGRyY19hdmVyYWdlX3JlZmVyZW5jZTsKLQl1MzIgZHJjX2F2ZXJhZ2VfdGFyZ2V0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBhZHNwX2F1ZGlvX2FtcndiX3BsdXNfZm9ybWF0IHsKLQkvKiBNZWRpYSBGb3JtYXQgQ29kZSAobXVzdCBhbHdheXMgYmUgZmlyc3QgZWxlbWVudCkgKi8KLQl1MzIJCWZvcm1hdDsKLQotCS8qIHBheWxvYWQgKi8KLQl1MzIJCXNpemU7Ci0JdTMyCQl2ZXJzaW9uOwotCXUzMgkJY2hhbm5lbHM7Ci0JdTMyCQlhbXJfYmFuZF9tb2RlOwotCXUzMgkJYW1yX2R0eF9tb2RlOwotCXUzMgkJYW1yX2ZyYW1lX2Zvcm1hdDsKLQl1MzIJCWFtcl9pc2ZfaW5kZXg7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogQmluYXJ5IEJ5dGUgU3RyZWFtIEZvcm1hdCAqLwotLyogQmluYXJ5IGZvcm1hdCB0eXBlIHRoYXQgZGVmaW5lcyBhIGJ5dGUgc3RyZWFtLCAqLwotLyogY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbnkgZm9ybWF0IChpZS4gQUFDKSAqLwotc3RydWN0IGFkc3BfYXVkaW9fYmluYXJ5X2Zvcm1hdCB7Ci0JLyogTWVkaWEgRm9ybWF0IENvZGUgKG11c3QgYWx3YXlzIGJlIGZpcnN0IGVsZW1lbnQpICovCi0JdTMyIGZvcm1hdDsKLQotCS8qIHBheWxvYWQgKi8KLQkvKiBudW1iZXIgb2YgYnl0ZXMgc2V0IGluIGJ5dGUgc3RyZWFtICovCi0JdTMyIG51bV9ieXRlczsKLQkvKiBCeXRlIHN0cmVhbSBiaW5hcnkgZGF0YSAqLwotCXU4IGRhdGFbQURTUF9BVURJT19GT1JNQVRfREFUQV9NQVhdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBhZHNwX2F1ZGlvX3NoYXJlZF9tZW1vcnlfZm9ybWF0IHsKLQkvKiBNZWRpYSBGb3JtYXQgQ29kZSAobXVzdCBhbHdheXMgYmUgZmlyc3QgZWxlbWVudCkgKi8KLQl1MzIJCWZvcm1hdDsKLQotCS8qIE51bWJlciBvZiBieXRlcyBpbiBzaGFyZWQgbWVtb3J5ICovCi0JdTMyCQlsZW47Ci0JLyogUGh5aXNpY2FsIGFkZHJlc3MgdG8gZGF0YSBpbiBzaGFyZWQgbWVtb3J5ICovCi0JdTMyCQlhZGRyZXNzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotLyogVW5pb24gb2YgYWxsIGZvcm1hdCB0eXBlcyAqLwotdW5pb24gYWRzcF9hdWRpb19mb3JtYXQgewotCS8qIEJhc2ljIGZvcm1hdCBibG9jayB3aXRoIG5vIHBheWxvYWQgKi8KLQlzdHJ1Y3QgYWRzcF9hdWRpb19ub19wYXlsb2FkX2Zvcm1hdAlub19wYXlsb2FkOwotCS8qIEdlbmVyaWMgZm9ybWF0IGJsb2NrIFBDTSwgRFRNRiAqLwotCXN0cnVjdCBhZHNwX2F1ZGlvX3N0YW5kYXJkX2Zvcm1hdAlzdGFuZGFyZDsKLQkvKiBBRFBDTSBmb3JtYXQgYmxvY2sgKi8KLQlzdHJ1Y3QgYWRzcF9hdWRpb19hZHBjbV9mb3JtYXQJCWFkcGNtOwotCS8qIE1JREkgZm9ybWF0IGJsb2NrICovCi0Jc3RydWN0IGFkc3BfYXVkaW9fbWlkaV9mb3JtYXQJCW1pZGk7Ci0JLyogRzcxMSBmb3JtYXQgYmxvY2sgKi8KLQlzdHJ1Y3QgYWRzcF9hdWRpb19nNzExX2Zvcm1hdAkJZzcxMTsKLQkvKiBXbWFQcm8gZm9ybWF0IGJsb2NrICovCi0Jc3RydWN0IGFkc3BfYXVkaW9fd21hX3Byb19mb3JtYXQJd21hX3BybzsKLQkvKiBXbWFQcm8gZm9ybWF0IGJsb2NrICovCi0Jc3RydWN0IGFkc3BfYXVkaW9fYW1yd2JfcGx1c19mb3JtYXQJYW1yd2JfcGx1czsKLQkvKiBiaW5hcnkgKGJ5dGUgc3RyZWFtKSBmb3JtYXQgYmxvY2ssIHVzZWQgZm9yIEFBQyAqLwotCXN0cnVjdCBhZHNwX2F1ZGlvX2JpbmFyeV9mb3JtYXQJCWJpbmFyeTsKLQkvKiBmb3JtYXQgYmxvY2sgaW4gc2hhcmVkIG1lbW9yeSAqLwotCXN0cnVjdCBhZHNwX2F1ZGlvX3NoYXJlZF9tZW1vcnlfZm9ybWF0CXNoYXJlZF9tZW07Ci19OwotCi0jZW5kaWYKLQotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL2RhbF92b2ljZS5oIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9kYWxfdm9pY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzNmRlNC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL2RhbF92b2ljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9fREFMX1ZPSUNFX0hfXwotI2RlZmluZSBfX0RBTF9WT0lDRV9IX18KLQotI2RlZmluZSBWT0lDRV9EQUxfREVWSUNFIDB4MDIwMDAwNzUKLSNkZWZpbmUgVk9JQ0VfREFMX1BPUlQgIkRBTF9BTV9BVUQiCi0jZGVmaW5lIFZPSUNFX0RBTF9WRVJTSU9OIDB4MDAwMTAwMDAKLQotI2RlZmluZSBBUFJfUEtUVjFfVFlQRV9FVkVOVF9WIDAKLSNkZWZpbmUgQVBSX1VOREVGSU5FRCAtMQotI2RlZmluZSBBUFJfUEtUVjFfVFlQRV9NQVNLIDB4MDAwMDAwMTAKLSNkZWZpbmUgQVBSX1BLVFYxX1RZUEVfU0hGVCA0Ci0KLSNkZWZpbmUgQVBSX1NFVF9CSVRNQVNLKG1hc2ssIHNoaWZ0LCB2YWx1ZSkgXAotCSgoKHZhbHVlKSA8PCAoc2hpZnQpKSAmIChtYXNrKSkKLQotI2RlZmluZSBBUFJfU0VUX0ZJRUxEKGZpZWxkLCB2YWx1ZSkgXAotCUFQUl9TRVRfQklUTUFTSygoZmllbGQjI19NQVNLKSwgKGZpZWxkIyNfU0hGVCksICh2YWx1ZSkpCi0KLQotZW51bSB7Ci0JVk9JQ0VfT1BfSU5JVCA9IERBTF9PUF9GSVJTVF9ERVZJQ0VfQVBJLAotCVZPSUNFX09QX0NPTlRST0wsCi19OwotCi1zdHJ1Y3QgYXByX2NvbW1hbmRfcGt0IHsKLQl1aW50MzJfdCBzaXplOwotCXVpbnQzMl90IGhlYWRlcjsKLQl1aW50MTZfdCByZXNlcnZlZDE7Ci0JdWludDE2X3Qgc3JjX2FkZHI7Ci0JdWludDE2X3QgZHN0X2FkZHI7Ci0JdWludDE2X3QgcmV0X2FkZHI7Ci0JdWludDMyX3Qgc3JjX3Rva2VuOwotCXVpbnQzMl90IGRzdF90b2tlbjsKLQl1aW50MzJfdCByZXRfdG9rZW47Ci0JdWludDMyX3QgY29udGV4dDsKLQl1aW50MzJfdCBvcGNvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotCi0jZGVmaW5lIEFQUl9JQkFTSUNfUlNQX1JFU1VMVCAweDAwMDEwMDAwCi0KLSNkZWZpbmUgQVBSX09QX0NNRF9DUkVBVEUgMHgwMDAxMDAxQgotCi0jZGVmaW5lIEFQUl9PUF9DTURfREVTVFJPWSAweDAwMDEwMDFDCi0KLSNkZWZpbmUgVk9JQ0VfT1BfQ01EX0JSSU5HVVAgMHgwMDAxMDAxRQotCi0jZGVmaW5lIFZPSUNFX09QX0NNRF9URUFSRE9XTiAweDAwMDEwMDFGCi0KLSNkZWZpbmUgVk9JQ0VfT1BfQ01EX1NFVF9ORVRXT1JLIDB4MDAwMTAwMUQKLQotI2RlZmluZSBWT0lDRV9PUF9DTURfU1RSRUFNX1NFVFVQIDB4MDAwMTAwMjcKLQotI2RlZmluZSBWT0lDRV9PUF9DTURfU1RSRUFNX1RFQVJET1dOIDB4MDAwMTAwMjgKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL2V2cmNfaW4uYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvZXZyY19pbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzU0NDU1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvZXZyY19pbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgSFRDIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19xY3AuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9xZHNwNl9hdWRpb3YyLmg+Ci0jaW5jbHVkZSAiZGFsX2F1ZGlvLmgiCi0jaW5jbHVkZSAiZGFsX2F1ZGlvX2Zvcm1hdC5oIgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLQotCi1zdHJ1Y3QgZXZyYyB7Ci0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IG1zbV9hdWRpb19ldnJjX2VuY19jb25maWcgY2ZnOwotCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBzdHJfY2ZnOwotCXN0cnVjdCBhdWRpb19jbGllbnQgKmF1ZGlvX2NsaWVudDsKLX07Ci0KLQotc3RhdGljIGxvbmcgcTZfZXZyY19pbl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgZXZyYyAqZXZyYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYWRzcF9vcGVuX2NvbW1hbmQgcnBjOwotCWludCByYyA9IDA7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmZXZyYy0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCQlpZiAoZXZyYy0+YXVkaW9fY2xpZW50KSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJZXZyYy0+YXVkaW9fY2xpZW50ID0gcTZhdWRpb19vcGVuKEFVRElPX0ZMQUdfUkVBRCwKLQkJCQkJCWV2cmMtPnN0cl9jZmcuYnVmZmVyX3NpemUpOwotCi0JCQlpZiAoIWV2cmMtPmF1ZGlvX2NsaWVudCkgewotCQkJCWtmcmVlKGV2cmMpOwotCQkJCXJjID0gLUVOT01FTTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXR4X2Nsa19mcmVxID0gODAwMDsKLQotCQltZW1zZXQoJnJwYywgMCwgc2l6ZW9mKHJwYykpOwotCi0JCXJwYy5mb3JtYXRfYmxvY2suc3RhbmRhcmQuZm9ybWF0ID0gQURTUF9BVURJT19GT1JNQVRfRVZSQ19GUzsKLQkJcnBjLmZvcm1hdF9ibG9jay5zdGFuZGFyZC5jaGFubmVscyA9IDE7Ci0JCXJwYy5mb3JtYXRfYmxvY2suc3RhbmRhcmQuYml0c19wZXJfc2FtcGxlID0gMTY7Ci0JCXJwYy5mb3JtYXRfYmxvY2suc3RhbmRhcmQuc2FtcGxpbmdfcmF0ZSA9IDgwMDA7Ci0JCXJwYy5mb3JtYXRfYmxvY2suc3RhbmRhcmQuaXNfc2lnbmVkID0gMTsKLQkJcnBjLmZvcm1hdF9ibG9jay5zdGFuZGFyZC5pc19pbnRlcmxlYXZlZCA9IDA7Ci0KLQkJcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9PUEVOX1JFQUQ7Ci0JCXJwYy5kZXZpY2UgPSBBRFNQX0FVRElPX0RFVklDRV9JRF9ERUZBVUxUOwotCQlycGMuc3RyZWFtX2NvbnRleHQgPSBBRFNQX0FVRElPX0RFVklDRV9DT05URVhUX1JFQ09SRDsKLQkJcnBjLmJ1Zl9tYXhfc2l6ZSA9IGV2cmMtPnN0cl9jZmcuYnVmZmVyX3NpemU7Ci0JCXJwYy5jb25maWcuZXZyYy5taW5fcmF0ZSA9IGV2cmMtPmNmZy5taW5fYml0X3JhdGU7Ci0JCXJwYy5jb25maWcuZXZyYy5tYXhfcmF0ZSA9IGV2cmMtPmNmZy5tYXhfYml0X3JhdGU7Ci0KLQkJcTZhdWRpb19zdGFydChldnJjLT5hdWRpb19jbGllbnQsICZycGMsIHNpemVvZihycGMpKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TVE9QOgotCQlicmVhazsKLQljYXNlIEFVRElPX0ZMVVNIOgotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9WT0xVTUU6Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fR0VUX1NUUkVBTV9DT05GSUc6Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZldnJjLT5zdHJfY2ZnLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfU1RSRUFNX0NPTkZJRzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZldnJjLT5zdHJfY2ZnLCAodm9pZCAqKWFyZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoZXZyYy0+c3RyX2NmZy5idWZmZXJfc2l6ZSA8IDIzKSB7Ci0JCQlwcl9lcnIoIlslczolc10gQnVmZmVyIHNpemUgdG9vIHNtYWxsXG4iLCBfX01NX0ZJTEVfXywKLQkJCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoZXZyYy0+c3RyX2NmZy5idWZmZXJfY291bnQgIT0gMikKLQkJCXByX2luZm8oIlslczolc10gQnVmZmVyIGNvdW50IHNldCB0byAyXG4iLCBfX01NX0ZJTEVfXywKLQkJCQkJX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9FVlJDX0VOQ19DT05GSUc6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZXZyYy0+Y2ZnLCAodm9pZCAqKSBhcmcsCi0JCQkJIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCi0JCWlmIChldnJjLT5jZmcubWluX2JpdF9yYXRlID4gNCB8fCBldnJjLT5jZmcubWluX2JpdF9yYXRlIDwgMSkgewotCQkJcHJfZXJyKCJbJXM6JXNdIGludmFsaWQgbWluIGJpdHJhdGVcbiIsIF9fTU1fRklMRV9fLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCX0KLQkJaWYgKGV2cmMtPmNmZy5tYXhfYml0X3JhdGUgPiA0IHx8IGV2cmMtPmNmZy5tYXhfYml0X3JhdGUgPCAxKSB7Ci0JCQlwcl9lcnIoIlslczolc10gaW52YWxpZCBtYXggYml0cmF0ZVxuIiwgX19NTV9GSUxFX18sCi0JCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9FVlJDX0VOQ19DT05GSUc6Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmZXZyYy0+Y2ZnLAotCQkJCSBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19ldnJjX2VuY19jb25maWcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZldnJjLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcTZfZXZyY19pbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBldnJjICpldnJjOwotCWV2cmMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXZyYyksIEdGUF9LRVJORUwpOwotCWlmIChldnJjID09IE5VTEwpIHsKLQkJcHJfZXJyKCJbJXM6JXNdIENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGV2cmMgZHJpdmVyXG4iLAotCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW11dGV4X2luaXQoJmV2cmMtPmxvY2spOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGV2cmM7Ci0JZXZyYy0+YXVkaW9fY2xpZW50ID0gTlVMTDsKLQlldnJjLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplID0gMjM7Ci0JZXZyYy0+c3RyX2NmZy5idWZmZXJfY291bnQgPSAyOwotCWV2cmMtPmNmZy5jZG1hX3JhdGUgPSBDRE1BX1JBVEVfRlVMTDsKLQlldnJjLT5jZmcubWluX2JpdF9yYXRlID0gMTsKLQlldnJjLT5jZmcubWF4X2JpdF9yYXRlID0gNDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBxNl9ldnJjX2luX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCXN0cnVjdCBhdWRpb19idWZmZXIgKmFiOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlzdHJ1Y3QgZXZyYyAqZXZyYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgeGZlciA9IDA7Ci0JaW50IHJlczsKLQotCW11dGV4X2xvY2soJmV2cmMtPmxvY2spOwotCWFjID0gZXZyYy0+YXVkaW9fY2xpZW50OwotCWlmICghYWMpIHsKLQkJcmVzID0gLUVOT0RFVjsKLQkJZ290byBmYWlsOwotCX0KLQl3aGlsZSAoY291bnQgPiB4ZmVyKSB7Ci0JCWFiID0gYWMtPmJ1ZiArIGFjLT5jcHVfYnVmOwotCi0JCWlmIChhYi0+dXNlZCkKLQkJCXdhaXRfZXZlbnQoYWMtPndhaXQsIChhYi0+dXNlZCA9PSAwKSk7Ci0KLQkJeGZlciA9IGFiLT5hY3R1YWxfc2l6ZTsKLQotCQlpZiAoY29weV90b191c2VyKGJ1ZiwgYWItPmRhdGEsIHhmZXIpKSB7Ci0JCQlyZXMgPSAtRUZBVUxUOwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJYnVmICs9IHhmZXI7Ci0JCWNvdW50IC09IHhmZXI7Ci0KLQkJYWItPnVzZWQgPSAxOwotCQlxNmF1ZGlvX3JlYWQoYWMsIGFiKTsKLQkJYWMtPmNwdV9idWYgXj0gMTsKLQl9Ci0KLQlyZXMgPSBidWYgLSBzdGFydDsKLQotZmFpbDoKLQltdXRleF91bmxvY2soJmV2cmMtPmxvY2spOwotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCBxNl9ldnJjX2luX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgZXZyYyAqZXZyYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJmV2cmMtPmxvY2spOwotCWlmIChldnJjLT5hdWRpb19jbGllbnQpCi0JCXJjID0gcTZhdWRpb19jbG9zZShldnJjLT5hdWRpb19jbGllbnQpOwotCW11dGV4X3VubG9jaygmZXZyYy0+bG9jayk7Ci0Ja2ZyZWUoZXZyYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBxNl9ldnJjX2luX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IHE2X2V2cmNfaW5fb3BlbiwKLQkucmVhZAkJPSBxNl9ldnJjX2luX3JlYWQsCi0JLnJlbGVhc2UJPSBxNl9ldnJjX2luX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0gcTZfZXZyY19pbl9pb2N0bCwKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIHE2X2V2cmNfaW5fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX2V2cmNfaW4iLAotCS5mb3BzCT0gJnE2X2V2cmNfaW5fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHE2X2V2cmNfaW5faW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZxNl9ldnJjX2luX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwocTZfZXZyY19pbl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvbXAzLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL21wMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDljZmEyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvbXAzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9tcDMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOSBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoYykgMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21zbV9xZHNwNl9hdWRpb3YyLmg+Ci0jaW5jbHVkZSAiZGFsX2F1ZGlvLmgiCi0jaW5jbHVkZSAiZGFsX2F1ZGlvX2Zvcm1hdC5oIgotCi0jZGVmaW5lIEJVRlNaICg4MTkyKQotI2RlZmluZSBETUFTWiAoQlVGU1ogKiAyKQotCi1zdHJ1Y3QgbXAzIHsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYzsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjZmc7Ci19OwotCi1zdGF0aWMgbG9uZyBtcDNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBtcDMgKm1wMyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYWRzcF9vcGVuX2NvbW1hbmQgcnBjOwotCWludCByYyA9IDA7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmbXAzLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU0VUX1ZPTFVNRToKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TVEFSVDoKLQkJbWVtc2V0KCZycGMsIDAsIHNpemVvZihycGMpKTsKLQkJcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9PUEVOX1dSSVRFOwotCQlycGMuc3RyZWFtX2NvbnRleHQgPSBBRFNQX0FVRElPX0RFVklDRV9DT05URVhUX1BMQVlCQUNLOwotCQlycGMuZGV2aWNlID0gQURTUF9BVURJT19ERVZJQ0VfSURfREVGQVVMVDsKLQkJcnBjLmZvcm1hdF9ibG9jay5zdGFuZGFyZC5mb3JtYXQgPSBBRFNQX0FVRElPX0ZPUk1BVF9NUDM7Ci0JCXJwYy5mb3JtYXRfYmxvY2suc3RhbmRhcmQuY2hhbm5lbHMgPSBtcDMtPmNmZy5jaGFubmVsX2NvdW50OwotCQlycGMuZm9ybWF0X2Jsb2NrLnN0YW5kYXJkLmJpdHNfcGVyX3NhbXBsZSA9IDE2OwotCQlycGMuZm9ybWF0X2Jsb2NrLnN0YW5kYXJkLnNhbXBsaW5nX3JhdGUgPSBtcDMtPmNmZy5zYW1wbGVfcmF0ZTsKLQkJcnBjLmZvcm1hdF9ibG9jay5zdGFuZGFyZC5pc19zaWduZWQgPSAxOwotCQlycGMuZm9ybWF0X2Jsb2NrLnN0YW5kYXJkLmlzX2ludGVybGVhdmVkID0gMDsKLQkJcnBjLmJ1Zl9tYXhfc2l6ZSA9IEJVRlNaOwotCQlxNmF1ZGlvX3N0YXJ0KG1wMy0+YWMsICh2b2lkICopICZycGMsIHNpemVvZihycGMpKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TVE9QOgotCQlicmVhazsKLQljYXNlIEFVRElPX0ZMVVNIOgotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9DT05GSUc6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmbXAzLT5jZmcsICh2b2lkICopIGFyZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAobXAzLT5jZmcuY2hhbm5lbF9jb3VudCA8IDEgfHwgbXAzLT5jZmcuY2hhbm5lbF9jb3VudCA+IDIpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fR0VUX0NPTkZJRzoKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZtcDMtPmNmZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJm1wMy0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1wM19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCi0Jc3RydWN0IG1wMyAqbXAzOwotCW1wMyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtcDMpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghbXAzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW11dGV4X2luaXQoJm1wMy0+bG9jayk7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gbXAzOwotCW1wMy0+YWMgPSBxNmF1ZGlvX29wZW4oQVVESU9fRkxBR19XUklURSwgQlVGU1opOwotCWlmICghbXAzLT5hYykgewotCQlrZnJlZShtcDMpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXAzLT5jZmcuY2hhbm5lbF9jb3VudCA9IDI7Ci0JbXAzLT5jZmcuYnVmZmVyX2NvdW50ID0gMjsKLQltcDMtPmNmZy5idWZmZXJfc2l6ZSA9IEJVRlNaOwotCW1wMy0+Y2ZnLnVudXNlZFswXSA9IDA7Ci0JbXAzLT5jZmcudW51c2VkWzFdID0gMDsKLQltcDMtPmNmZy51bnVzZWRbMl0gPSAwOwotCW1wMy0+Y2ZnLnNhbXBsZV9yYXRlID0gNDgwMDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgbXAzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgbXAzICptcDMgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0Jc3RydWN0IGF1ZGlvX2J1ZmZlciAqYWI7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCWludCB4ZmVyOwotCi0JaWYgKCFtcDMtPmFjKQotCQltcDNfaW9jdGwoZmlsZSwgQVVESU9fU1RBUlQsIDApOwotCi0JYWMgPSBtcDMtPmFjOwotCWlmICghYWMpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlhYiA9IGFjLT5idWYgKyBhYy0+Y3B1X2J1ZjsKLQotCQlpZiAoYWItPnVzZWQpCi0JCQl3YWl0X2V2ZW50KGFjLT53YWl0LCAoYWItPnVzZWQgPT0gMCkpOwotCi0JCXhmZXIgPSBjb3VudDsKLQkJaWYgKHhmZXIgPiBhYi0+c2l6ZSkKLQkJCXhmZXIgPSBhYi0+c2l6ZTsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoYWItPmRhdGEsIGJ1ZiwgeGZlcikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlidWYgKz0geGZlcjsKLQkJY291bnQgLT0geGZlcjsKLQotCQlhYi0+dXNlZCA9IHhmZXI7Ci0JCXE2YXVkaW9fd3JpdGUoYWMsIGFiKTsKLQkJYWMtPmNwdV9idWYgXj0gMTsKLQl9Ci0KLQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXAzX2ZzeW5jKHN0cnVjdCBmaWxlICpmLCBpbnQgZGF0YXN5bmMpCi17Ci0Jc3RydWN0IG1wMyAqbXAzID0gZi0+cHJpdmF0ZV9kYXRhOwotCWlmIChtcDMtPmFjKQotCQlyZXR1cm4gcTZhdWRpb19hc3luYyhtcDMtPmFjKTsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIGludCBtcDNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgbXAzICptcDMgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaWYgKG1wMy0+YWMpCi0JCXE2YXVkaW9fY2xvc2UobXAzLT5hYyk7Ci0Ja2ZyZWUobXAzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbXAzX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IG1wM19vcGVuLAotCS53cml0ZQkJPSBtcDNfd3JpdGUsCi0JLmZzeW5jCQk9IG1wM19mc3luYywKLQkucmVsZWFzZQk9IG1wM19yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bAk9IG1wM19pb2N0bCwKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIG1wM19taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fbXAzIiwKLQkuZm9wcwk9ICZtcDNfZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1wM19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJm1wM19taXNjKTsKLX0KLQotZGV2aWNlX2luaXRjYWxsKG1wM19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvcGNtX2luLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL3BjbV9pbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGUyMTk5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvcGNtX2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9wY21faW4uYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOSBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoYykgMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21zbV9xZHNwNl9hdWRpb3YyLmg+Ci0jaW5jbHVkZSAiZGFsX2F1ZGlvLmgiCi0jaW5jbHVkZSAiZGFsX2F1ZGlvX2Zvcm1hdC5oIgotCi0jZGVmaW5lIEJVRlNaICg0MDk2KQotI2RlZmluZSBETUFTWiAoQlVGU1ogKiAyKQotCi0KLXN0cnVjdCBwY20gewotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNmZzsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphdWRpb19jbGllbnQ7Ci19OwotCi1zdGF0aWMgbG9uZyBxNl9pbl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHBjbSAqcGNtID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhZHNwX29wZW5fY29tbWFuZCBycGM7Ci0JaW50IHJjID0gMDsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX1NUQVRTKSB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdGF0cykpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZwY20tPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0KLQljYXNlIEFVRElPX1NUQVJUOgotCQl0eF9jbGtfZnJlcSA9IHBjbS0+Y2ZnLnNhbXBsZV9yYXRlOwotCi0JCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0KLQkJcnBjLmZvcm1hdF9ibG9jay5zdGFuZGFyZC5mb3JtYXQgPSBBRFNQX0FVRElPX0ZPUk1BVF9QQ007Ci0JCXJwYy5mb3JtYXRfYmxvY2suc3RhbmRhcmQuY2hhbm5lbHMgPSBwY20tPmNmZy5jaGFubmVsX2NvdW50OwotCQlycGMuZm9ybWF0X2Jsb2NrLnN0YW5kYXJkLmJpdHNfcGVyX3NhbXBsZSA9IDE2OwotCQlycGMuZm9ybWF0X2Jsb2NrLnN0YW5kYXJkLnNhbXBsaW5nX3JhdGUgPSBwY20tPmNmZy5zYW1wbGVfcmF0ZTsKLQkJcnBjLmZvcm1hdF9ibG9jay5zdGFuZGFyZC5pc19zaWduZWQgPSAxOwotCQlycGMuZm9ybWF0X2Jsb2NrLnN0YW5kYXJkLmlzX2ludGVybGVhdmVkID0gMTsKLQotCQlycGMuaGRyLm9wY29kZSA9IEFEU1BfQVVESU9fSU9DVExfQ01EX09QRU5fUkVBRDsKLQkJcnBjLmRldmljZSA9IEFEU1BfQVVESU9fREVWSUNFX0lEX0RFRkFVTFQ7Ci0JCXJwYy5zdHJlYW1fY29udGV4dCA9IEFEU1BfQVVESU9fREVWSUNFX0NPTlRFWFRfUkVDT1JEOwotCQlycGMuYnVmX21heF9zaXplID0gQlVGU1o7Ci0JCXE2YXVkaW9fc3RhcnQocGNtLT5hdWRpb19jbGllbnQsICZycGMsIHNpemVvZihycGMpKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TVE9QOgotCQlicmVhazsKLQljYXNlIEFVRElPX0ZMVVNIOgotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9WT0xVTUU6Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX0NPTkZJRzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwY20tPmNmZywgKHZvaWQgKikgYXJnLAotCQkJCSBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19jb25maWcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19HRVRfQ09ORklHOgotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJnBjbS0+Y2ZnLAotCQkJCSBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19jb25maWcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF91bmxvY2soJnBjbS0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHE2X2luX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0KLQlzdHJ1Y3QgcGNtICpwY207Ci0JcGNtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjbSksIEdGUF9LRVJORUwpOwotCWlmIChwY20gPT0gTlVMTCkgewotCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBjbSBkcml2ZXJcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXV0ZXhfaW5pdCgmcGNtLT5sb2NrKTsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBwY207Ci0JcGNtLT5hdWRpb19jbGllbnQgPSBxNmF1ZGlvX29wZW4oQVVESU9fRkxBR19SRUFELCBCVUZTWik7Ci0JaWYgKCFwY20tPmF1ZGlvX2NsaWVudCkgewotCQlrZnJlZShwY20pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcGNtLT5jZmcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JcGNtLT5jZmcuYnVmZmVyX2NvdW50ID0gMjsKLQlwY20tPmNmZy5idWZmZXJfc2l6ZSA9IEJVRlNaOwotCXBjbS0+Y2ZnLnVudXNlZFswXSA9IDA7Ci0JcGNtLT5jZmcudW51c2VkWzFdID0gMDsKLQlwY20tPmNmZy51bnVzZWRbMl0gPSAwOwotCXBjbS0+Y2ZnLnNhbXBsZV9yYXRlID0gODAwMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBxNl9pbl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCXN0cnVjdCBhdWRpb19idWZmZXIgKmFiOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlzdHJ1Y3QgcGNtICpwY20gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHhmZXI7Ci0JaW50IHJlczsKLQotCW11dGV4X2xvY2soJnBjbS0+bG9jayk7Ci0JYWMgPSBwY20tPmF1ZGlvX2NsaWVudDsKLQlpZiAoIWFjKSB7Ci0JCXJlcyA9IC1FTk9ERVY7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlhYiA9IGFjLT5idWYgKyBhYy0+Y3B1X2J1ZjsKLQotCQlpZiAoYWItPnVzZWQpCi0JCQl3YWl0X2V2ZW50KGFjLT53YWl0LCAoYWItPnVzZWQgPT0gMCkpOwotCi0JCXhmZXIgPSBjb3VudDsKLQkJaWYgKHhmZXIgPiBhYi0+c2l6ZSkKLQkJCXhmZXIgPSBhYi0+c2l6ZTsKLQotCQlpZiAoY29weV90b191c2VyKGJ1ZiwgYWItPmRhdGEsIHhmZXIpKSB7Ci0JCQlyZXMgPSAtRUZBVUxUOwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJYnVmICs9IHhmZXI7Ci0JCWNvdW50IC09IHhmZXI7Ci0KLQkJYWItPnVzZWQgPSAxOwotCQlxNmF1ZGlvX3JlYWQoYWMsIGFiKTsKLQkJYWMtPmNwdV9idWYgXj0gMTsKLQl9Ci1mYWlsOgotCXJlcyA9IGJ1ZiAtIHN0YXJ0OwotCW11dGV4X3VubG9jaygmcGNtLT5sb2NrKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgcTZfaW5fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBwY20gKnBjbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJnBjbS0+bG9jayk7Ci0JaWYgKHBjbS0+YXVkaW9fY2xpZW50KQotCQlyYyA9IHE2YXVkaW9fY2xvc2UocGNtLT5hdWRpb19jbGllbnQpOwotCW11dGV4X3VubG9jaygmcGNtLT5sb2NrKTsKLQlrZnJlZShwY20pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcTZfaW5fZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gcTZfaW5fb3BlbiwKLQkucmVhZAkJPSBxNl9pbl9yZWFkLAotCS5yZWxlYXNlCT0gcTZfaW5fcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBxNl9pbl9pb2N0bCwKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIHE2X2luX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gIm1zbV9wY21faW4iLAotCS5mb3BzCT0gJnE2X2luX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBxNl9pbl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJnE2X2luX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwocTZfaW5faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL3BjbV9vdXQuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvcGNtX291dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmZkMTE5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvcGNtX291dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvcGNtX291dC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChjKSAyMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBBdXRob3I6IEJyaWFuIFN3ZXRsYW5kIDxzd2V0bGFuZEBnb29nbGUuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotCi0jaW5jbHVkZSA8bWFjaC9tc21fcWRzcDZfYXVkaW92Mi5oPgotI2luY2x1ZGUgImRhbF9hdWRpby5oIgotI2luY2x1ZGUgImRhbF9hdWRpb19mb3JtYXQuaCIKLQotI2RlZmluZSBCVUZTWiAoODE5MikKLSNkZWZpbmUgRE1BU1ogKEJVRlNaICogMikKLQotc3RydWN0IHBjbSB7Ci0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0Jc3RydWN0IG1zbV9hdWRpb19jb25maWcgY2ZnOwotCi19OwotCi1zdGF0aWMgbG9uZyBwY21faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBwY20gKnBjbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYWRzcF9vcGVuX2NvbW1hbmQgcnBjOwotCWludCByYyA9IDA7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmcGNtLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6Ci0JCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0JCXJwYy5oZHIub3Bjb2RlID0gQURTUF9BVURJT19JT0NUTF9DTURfT1BFTl9XUklURTsKLQkJcnBjLnN0cmVhbV9jb250ZXh0ID0gQURTUF9BVURJT19ERVZJQ0VfQ09OVEVYVF9QTEFZQkFDSzsKLQkJcnBjLmRldmljZSA9IEFEU1BfQVVESU9fREVWSUNFX0lEX0RFRkFVTFQ7Ci0JCXJwYy5mb3JtYXRfYmxvY2suc3RhbmRhcmQuZm9ybWF0ID0gQURTUF9BVURJT19GT1JNQVRfUENNOwotCQlycGMuZm9ybWF0X2Jsb2NrLnN0YW5kYXJkLmNoYW5uZWxzID0gcGNtLT5jZmcuY2hhbm5lbF9jb3VudDsKLQkJcnBjLmZvcm1hdF9ibG9jay5zdGFuZGFyZC5iaXRzX3Blcl9zYW1wbGUgPSAxNjsKLQkJcnBjLmZvcm1hdF9ibG9jay5zdGFuZGFyZC5zYW1wbGluZ19yYXRlID0gcGNtLT5jZmcuc2FtcGxlX3JhdGU7Ci0JCXJwYy5mb3JtYXRfYmxvY2suc3RhbmRhcmQuaXNfc2lnbmVkID0gMTsKLQkJcnBjLmZvcm1hdF9ibG9jay5zdGFuZGFyZC5pc19pbnRlcmxlYXZlZCA9IDE7Ci0JCXJwYy5idWZfbWF4X3NpemUgPSBCVUZTWjsKLQkJcTZhdWRpb19zdGFydChwY20tPmFjLCAodm9pZCAqKSAmcnBjLCBzaXplb2YocnBjKSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU1RPUDoKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19GTFVTSDoKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfQ09ORklHOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJnBjbS0+Y2ZnLCAodm9pZCAqKSBhcmcsCi0JCQkJIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAocGNtLT5jZmcuY2hhbm5lbF9jb3VudCA8IDEgfHwgcGNtLT5jZmcuY2hhbm5lbF9jb3VudCA+IDIpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19HRVRfQ09ORklHOgotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJnBjbS0+Y2ZnLAotCQkJCSBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19jb25maWcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQotCW11dGV4X3VubG9jaygmcGNtLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcGNtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHBjbSAqcGNtOwotCXBjbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY20pLCBHRlBfS0VSTkVMKTsKLQotCWlmICghcGNtKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW11dGV4X2luaXQoJnBjbS0+bG9jayk7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gcGNtOwotCXBjbS0+YWMgPSBxNmF1ZGlvX29wZW4oQVVESU9fRkxBR19XUklURSwgQlVGU1opOwotCWlmICghcGNtLT5hYykgewotCQlrZnJlZShwY20pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcGNtLT5jZmcuY2hhbm5lbF9jb3VudCA9IDI7Ci0JcGNtLT5jZmcuYnVmZmVyX2NvdW50ID0gMjsKLQlwY20tPmNmZy5idWZmZXJfc2l6ZSA9IEJVRlNaOwotCXBjbS0+Y2ZnLnVudXNlZFswXSA9IDA7Ci0JcGNtLT5jZmcudW51c2VkWzFdID0gMDsKLQlwY20tPmNmZy51bnVzZWRbMl0gPSAwOwotCXBjbS0+Y2ZnLnNhbXBsZV9yYXRlID0gNDgwMDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgcGNtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgcGNtICpwY20gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0Jc3RydWN0IGF1ZGlvX2J1ZmZlciAqYWI7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCWludCB4ZmVyOwotCi0JYWMgPSBwY20tPmFjOwotCWlmICghYWMpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlhYiA9IGFjLT5idWYgKyBhYy0+Y3B1X2J1ZjsKLQotCQlpZiAoYWItPnVzZWQpCi0JCQl3YWl0X2V2ZW50KGFjLT53YWl0LCAoYWItPnVzZWQgPT0gMCkpOwotCi0JCXhmZXIgPSBjb3VudDsKLQkJaWYgKHhmZXIgPiBhYi0+c2l6ZSkKLQkJCXhmZXIgPSBhYi0+c2l6ZTsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoYWItPmRhdGEsIGJ1ZiwgeGZlcikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlidWYgKz0geGZlcjsKLQkJY291bnQgLT0geGZlcjsKLQotCQlhYi0+dXNlZCA9IDE7Ci0JCWFiLT5hY3R1YWxfc2l6ZSA9IHhmZXI7Ci0JCXE2YXVkaW9fd3JpdGUoYWMsIGFiKTsKLQkJYWMtPmNwdV9idWYgXj0gMTsKLQl9Ci0KLQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci19Ci0KLXN0YXRpYyBpbnQgcGNtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHBjbSAqcGNtID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWlmIChwY20tPmFjKQotCQlxNmF1ZGlvX2Nsb3NlKHBjbS0+YWMpOwotCWtmcmVlKHBjbSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBjbV9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBwY21fb3BlbiwKLQkud3JpdGUJCT0gcGNtX3dyaXRlLAotCS5yZWxlYXNlCT0gcGNtX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0gcGNtX2lvY3RsLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgcGNtX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gIm1zbV9wY21fb3V0IiwKLQkuZm9wcwk9ICZwY21fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBjbV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJnBjbV9taXNjKTsKLX0KLQotZGV2aWNlX2luaXRjYWxsKHBjbV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvcTZhdWRpby5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9xNmF1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNDNiNWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9xNmF1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzE1ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvcTZhdWRpby5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChjKSAyMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBBdXRob3I6IEJyaWFuIFN3ZXRsYW5kIDxzd2V0bGFuZEBnb29nbGUuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9xb3MuaD4KLQotI2luY2x1ZGUgPG1hY2gvbXNtX3Fkc3A2X2F1ZGlvdjIuaD4KLSNpbmNsdWRlIDxtYWNoL2NwdWlkbGUuaD4KLQotI2luY2x1ZGUgIi4uL2RhbC5oIgotI2luY2x1ZGUgImRhbF9hdWRpby5oIgotI2luY2x1ZGUgImRhbF9hdWRpb19mb3JtYXQuaCIKLSNpbmNsdWRlICJkYWxfYWNkYi5oIgotI2luY2x1ZGUgImRhbF9hZGllLmgiCi0jaW5jbHVkZSAicTZhdWRpb19kZXZpY2VzLmgiCi0KLXN0cnVjdCBxNl9od19pbmZvIHsKLQlpbnQgbWluX2dhaW47Ci0JaW50IG1heF9nYWluOwotfTsKLQotLyogVE9ETzogcHJvdmlkZSBtZWNoYW5pc20gdG8gY29uZmlndXJlIGZyb20gYm9hcmQgZmlsZSAqLwotCi1zdGF0aWMgc3RydWN0IHE2X2h3X2luZm8gcTZfYXVkaW9faHdbUTZfSFdfQ09VTlRdID0gewotCVtRNl9IV19IQU5EU0VUXSA9IHsKLQkJLm1pbl9nYWluID0gLTIwMDAsCi0JCS5tYXhfZ2FpbiA9IDAsCi0JfSwKLQlbUTZfSFdfSEVBRFNFVF0gPSB7Ci0JCS5taW5fZ2FpbiA9IC0yMDAwLAotCQkubWF4X2dhaW4gPSAwLAotCX0sCi0JW1E2X0hXX1NQRUFLRVJdID0gewotCQkubWluX2dhaW4gPSAtMTUwMCwKLQkJLm1heF9nYWluID0gMCwKLQl9LAotCVtRNl9IV19UVFldID0gewotCQkubWluX2dhaW4gPSAtMjAwMCwKLQkJLm1heF9nYWluID0gMCwKLQl9LAotCVtRNl9IV19CVF9TQ09dID0gewotCQkubWluX2dhaW4gPSAtMjAwMCwKLQkJLm1heF9nYWluID0gMCwKLQl9LAotCVtRNl9IV19CVF9BMkRQXSA9IHsKLQkJLm1pbl9nYWluID0gLTIwMDAsCi0JCS5tYXhfZ2FpbiA9IDAsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcG1fcW9zX3JlcXVlc3QgcG1fcW9zX3JlcTsKLXN0YXRpYyBpbnQgaWRsZWNvdW50Owotc3RhdGljIERFRklORV9NVVRFWChpZGxlY291bnRfbG9jayk7Ci0KLXZvaWQgYXVkaW9fcHJldmVudF9zbGVlcCh2b2lkKQotewotCW11dGV4X2xvY2soJmlkbGVjb3VudF9sb2NrKTsKLQlpZiAoKytpZGxlY291bnQgPT0gMSkKLQkJcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KCZwbV9xb3NfcmVxLAotCQkJCSAgICAgIG1zbV9jcHVpZGxlX2dldF9kZWVwX2lkbGVfbGF0ZW5jeSgpKTsKLQltdXRleF91bmxvY2soJmlkbGVjb3VudF9sb2NrKTsKLX0KLQotdm9pZCBhdWRpb19hbGxvd19zbGVlcCh2b2lkKQotewotCW11dGV4X2xvY2soJmlkbGVjb3VudF9sb2NrKTsKLQlpZiAoLS1pZGxlY291bnQgPT0gMCkKLQkJcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KCZwbV9xb3NfcmVxLCBQTV9RT1NfREVGQVVMVF9WQUxVRSk7Ci0JbXV0ZXhfdW5sb2NrKCZpZGxlY291bnRfbG9jayk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICppY29kZWNfcnhfY2xrOwotc3RhdGljIHN0cnVjdCBjbGsgKmljb2RlY190eF9jbGs7Ci1zdGF0aWMgc3RydWN0IGNsayAqZWNvZGVjX2NsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpzZGFjX2NsazsKLQotc3RhdGljIHN0cnVjdCBxNmF1ZGlvX2FuYWxvZ19vcHMgZGVmYXVsdF9hbmFsb2dfb3BzOwotc3RhdGljIHN0cnVjdCBxNmF1ZGlvX2FuYWxvZ19vcHMgKmFuYWxvZ19vcHMgPSAmZGVmYXVsdF9hbmFsb2dfb3BzOwotdWludDMyX3QgdHhfY2xrX2ZyZXEgPSA4MDAwOwotc3RhdGljIGludCB0eF9tdXRlX3N0YXR1czsKLQotdm9pZCBxNmF1ZGlvX3JlZ2lzdGVyX2FuYWxvZ19vcHMoc3RydWN0IHE2YXVkaW9fYW5hbG9nX29wcyAqb3BzKQotewotCWFuYWxvZ19vcHMgPSBvcHM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcTZfZGV2aWNlX2luZm8gKnE2X2xvb2t1cF9kZXZpY2UodWludDMyX3QgZGV2aWNlX2lkKQotewotCXN0cnVjdCBxNl9kZXZpY2VfaW5mbyAqZGkgPSBxNl9hdWRpb19kZXZpY2VzOwotCWZvciAoOzspIHsKLQkJaWYgKGRpLT5pZCA9PSBkZXZpY2VfaWQpCi0JCQlyZXR1cm4gZGk7Ci0JCWlmIChkaS0+aWQgPT0gMCkgewotCQkJcHJfZXJyKCJxNl9sb29rdXBfZGV2aWNlOiBib2d1cyBpZCAweCUwOHhcbiIsCi0JCQkgICAgICAgZGV2aWNlX2lkKTsKLQkJCXJldHVybiBkaTsKLQkJfQotCQlkaSsrOwotCX0KLX0KLQotc3RhdGljIHVpbnQzMl90IHE2X2RldmljZV90b19jb2RlYyh1aW50MzJfdCBkZXZpY2VfaWQpCi17Ci0Jc3RydWN0IHE2X2RldmljZV9pbmZvICpkaSA9IHE2X2xvb2t1cF9kZXZpY2UoZGV2aWNlX2lkKTsKLQlyZXR1cm4gZGktPmNvZGVjOwotfQotCi1zdGF0aWMgdWludDMyX3QgcTZfZGV2aWNlX3RvX2Rpcih1aW50MzJfdCBkZXZpY2VfaWQpCi17Ci0Jc3RydWN0IHE2X2RldmljZV9pbmZvICpkaSA9IHE2X2xvb2t1cF9kZXZpY2UoZGV2aWNlX2lkKTsKLQlyZXR1cm4gZGktPmRpcjsKLX0KLQotc3RhdGljIHVpbnQzMl90IHE2X2RldmljZV90b19jYWRfaWQodWludDMyX3QgZGV2aWNlX2lkKQotewotCXN0cnVjdCBxNl9kZXZpY2VfaW5mbyAqZGkgPSBxNl9sb29rdXBfZGV2aWNlKGRldmljZV9pZCk7Ci0JcmV0dXJuIGRpLT5jYWRfaWQ7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBxNl9kZXZpY2VfdG9fcGF0aCh1aW50MzJfdCBkZXZpY2VfaWQpCi17Ci0Jc3RydWN0IHE2X2RldmljZV9pbmZvICpkaSA9IHE2X2xvb2t1cF9kZXZpY2UoZGV2aWNlX2lkKTsKLQlyZXR1cm4gZGktPnBhdGg7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBxNl9kZXZpY2VfdG9fcmF0ZSh1aW50MzJfdCBkZXZpY2VfaWQpCi17Ci0Jc3RydWN0IHE2X2RldmljZV9pbmZvICpkaSA9IHE2X2xvb2t1cF9kZXZpY2UoZGV2aWNlX2lkKTsKLQlyZXR1cm4gZGktPnJhdGU7Ci19Ci0KLWludCBxNl9kZXZpY2Vfdm9sdW1lKHVpbnQzMl90IGRldmljZV9pZCwgaW50IGxldmVsKQotewotCXN0cnVjdCBxNl9kZXZpY2VfaW5mbyAqZGkgPSBxNl9sb29rdXBfZGV2aWNlKGRldmljZV9pZCk7Ci0Jc3RydWN0IHE2X2h3X2luZm8gKmh3OwotCi0JaHcgPSAmcTZfYXVkaW9faHdbZGktPmh3XTsKLQotCXJldHVybiBody0+bWluX2dhaW4gKyAoKGh3LT5tYXhfZ2FpbiAtIGh3LT5taW5fZ2FpbikgKiBsZXZlbCkgLyAxMDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGFkaWVfb3BlbihzdHJ1Y3QgZGFsX2NsaWVudCAqY2xpZW50KQotewotCXJldHVybiBkYWxfY2FsbF9mMChjbGllbnQsIERBTF9PUF9PUEVOLCAwKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYWRpZV9jbG9zZShzdHJ1Y3QgZGFsX2NsaWVudCAqY2xpZW50KQotewotCXJldHVybiBkYWxfY2FsbF9mMChjbGllbnQsIERBTF9PUF9DTE9TRSwgMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGFkaWVfc2V0X3BhdGgoc3RydWN0IGRhbF9jbGllbnQgKmNsaWVudCwKLQkJCQl1aW50MzJfdCAqYWRpZV9wYXJhbXMsIHVpbnQzMl90IHNpemUpCi17Ci0JdWludDMyX3QgdG1wOwotCXJldHVybiBkYWxfY2FsbChjbGllbnQsIEFESUVfT1BfU0VUX1BBVEgsIDUsIGFkaWVfcGFyYW1zLCBzaXplLAotCQkodm9pZCAqKSZ0bXAsIHNpemVvZih1aW50MzJfdCkpOwotCi19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGFkaWVfcHJvY2VlZF90b19zdGFnZShzdHJ1Y3QgZGFsX2NsaWVudCAqY2xpZW50LAotCQkJCQl1aW50MzJfdCBwYXRoX3R5cGUsIHVpbnQzMl90IHN0YWdlKQotewotCXJldHVybiBkYWxfY2FsbF9mMShjbGllbnQsIEFESUVfT1BfUFJPQ0VFRF9UT19TVEFHRSwKLQkJCSAgIHBhdGhfdHlwZSwgc3RhZ2UpOwotfQotCi1zdGF0aWMgaW50IGFkaWVfcmVmY291bnQ7Ci0KLXN0YXRpYyBzdHJ1Y3QgZGFsX2NsaWVudCAqYWRpZTsKLXN0YXRpYyBzdHJ1Y3QgZGFsX2NsaWVudCAqYWRzcDsKLXN0YXRpYyBzdHJ1Y3QgZGFsX2NsaWVudCAqYWNkYjsKLQotc3RhdGljIGludCBhZGllX2VuYWJsZSh2b2lkKQotewotCWFkaWVfcmVmY291bnQrKzsKLQlpZiAoYWRpZV9yZWZjb3VudCA9PSAxKQotCQlhZGllX29wZW4oYWRpZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWRpZV9kaXNhYmxlKHZvaWQpCi17Ci0JYWRpZV9yZWZjb3VudC0tOwotCWlmIChhZGllX3JlZmNvdW50ID09IDApCi0JCWFkaWVfY2xvc2UoYWRpZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIDRrIERNQSBzY3JhdGNoIHBhZ2UgdXNlZCBmb3IgZXhjaGFuZ2luZyBhY2RiIGRldmljZSBjb25maWcgdGFibGVzCi0gKiBhbmQgc3RyZWFtIGZvcm1hdCBkZXNjcmlwdGlvbnMgd2l0aCB0aGUgRFNQLgotICovCi1jaGFyICphdWRpb19kYXRhOwotaW50MzJfdCBhdWRpb19waHlzOwotCi0jZGVmaW5lIFNFU1NJT05fTUlOIDAKLSNkZWZpbmUgU0VTU0lPTl9NQVggNjQKLQotc3RhdGljIERFRklORV9NVVRFWChzZXNzaW9uX2xvY2spOwotc3RhdGljIERFRklORV9NVVRFWChhdWRpb19sb2NrKTsKLQotc3RhdGljIHN0cnVjdCBhdWRpb19jbGllbnQgKnNlc3Npb25bU0VTU0lPTl9NQVhdOwotCi1zdGF0aWMgaW50IHNlc3Npb25fYWxsb2Moc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCi17Ci0JaW50IG47Ci0KLQltdXRleF9sb2NrKCZzZXNzaW9uX2xvY2spOwotCWZvciAobiA9IFNFU1NJT05fTUlOOyBuIDwgU0VTU0lPTl9NQVg7IG4rKykgewotCQlpZiAoIXNlc3Npb25bbl0pIHsKLQkJCXNlc3Npb25bbl0gPSBhYzsKLQkJCW11dGV4X3VubG9jaygmc2Vzc2lvbl9sb2NrKTsKLQkJCXJldHVybiBuOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmc2Vzc2lvbl9sb2NrKTsKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIHZvaWQgc2Vzc2lvbl9mcmVlKGludCBuLCBzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYykKLXsKLQltdXRleF9sb2NrKCZzZXNzaW9uX2xvY2spOwotCWlmIChzZXNzaW9uW25dID09IGFjKQotCQlzZXNzaW9uW25dID0gMDsKLQltdXRleF91bmxvY2soJnNlc3Npb25fbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2NsaWVudF9mcmVlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCXNlc3Npb25fZnJlZShhYy0+c2Vzc2lvbiwgYWMpOwotCi0JaWYgKGFjLT5idWZbMF0uZGF0YSkKLQkJcG1lbV9rZnJlZShhYy0+YnVmWzBdLnBoeXMpOwotCWlmIChhYy0+YnVmWzFdLmRhdGEpCi0JCXBtZW1fa2ZyZWUoYWMtPmJ1ZlsxXS5waHlzKTsKLQlrZnJlZShhYyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYXVkaW9fY2xpZW50ICphdWRpb19jbGllbnRfYWxsb2ModW5zaWduZWQgYnVmc3opCi17Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0JaW50IG47Ci0KLQlhYyA9IGt6YWxsb2Moc2l6ZW9mKCphYyksIEdGUF9LRVJORUwpOwotCWlmICghYWMpCi0JCXJldHVybiAwOwotCi0JbiA9IHNlc3Npb25fYWxsb2MoYWMpOwotCWlmIChuIDwgMCkKLQkJZ290byBmYWlsX3Nlc3Npb247Ci0JYWMtPnNlc3Npb24gPSBuOwotCi0JaWYgKGJ1ZnN6ID4gMCkgewotCQlhYy0+YnVmWzBdLnBoeXMgPSBwbWVtX2thbGxvYyhidWZzeiwKLQkJCQkJUE1FTV9NRU1UWVBFX0VCSTF8UE1FTV9BTElHTk1FTlRfNEspOwotCQlhYy0+YnVmWzBdLmRhdGEgPSBpb3JlbWFwKGFjLT5idWZbMF0ucGh5cywgYnVmc3opOwotCQlpZiAoIWFjLT5idWZbMF0uZGF0YSkKLQkJCWdvdG8gZmFpbDsKLQotCQlhYy0+YnVmWzFdLnBoeXMgPSBwbWVtX2thbGxvYyhidWZzeiwKLQkJCQkJUE1FTV9NRU1UWVBFX0VCSTF8UE1FTV9BTElHTk1FTlRfNEspOwotCQlhYy0+YnVmWzFdLmRhdGEgPSBpb3JlbWFwKGFjLT5idWZbMV0ucGh5cywgYnVmc3opOwotCQlpZiAoIWFjLT5idWZbMV0uZGF0YSkKLQkJCWdvdG8gZmFpbDsKLQotCQlhYy0+YnVmWzBdLnNpemUgPSBidWZzejsKLQkJYWMtPmJ1ZlsxXS5zaXplID0gYnVmc3o7Ci0JfQotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmYWMtPndhaXQpOwotCWFjLT5jbGllbnQgPSBhZHNwOwotCi0JcmV0dXJuIGFjOwotCi1mYWlsOgotCXByX2VycigicG1lbV9rYWxsb2MgZmFpbGVkXG4iKTsKLQlzZXNzaW9uX2ZyZWUobiwgYWMpOwotZmFpbF9zZXNzaW9uOgotCWF1ZGlvX2NsaWVudF9mcmVlKGFjKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19pb2N0bChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdm9pZCAqcHRyLCB1aW50MzJfdCBsZW4pCi17Ci0Jc3RydWN0IGFkc3BfY29tbWFuZF9oZHIgKmhkciA9IHB0cjsKLQl1aW50MzJfdCB0bXA7Ci0JaW50IHI7Ci0KLQloZHItPnNpemUgPSBsZW4gLSBzaXplb2YodTMyKTsKLQloZHItPmRlc3QgPSBBVURJT19BRERSKERPTUFJTl9EU1AsIGFjLT5zZXNzaW9uLCAwKTsKLQloZHItPnNyYyA9IEFVRElPX0FERFIoRE9NQUlOX0FQUCwgYWMtPnNlc3Npb24sIDApOwotCWhkci0+Y29udGV4dCA9IGFjLT5zZXNzaW9uOwotCWFjLT5jYl9zdGF0dXMgPSAtRUJVU1k7Ci0JciA9IGRhbF9jYWxsKGFjLT5jbGllbnQsIEFVRElPX09QX0NPTlRST0wsIDUsIHB0ciwgbGVuLAotCQkJCQkJJnRtcCwgc2l6ZW9mKHRtcCkpOwotCWlmIChyICE9IDQpCi0JCXJldHVybiAtRUlPOwotCXdhaXRfZXZlbnQoYWMtPndhaXQsIChhYy0+Y2Jfc3RhdHVzICE9IC1FQlVTWSkpOwotCXJldHVybiB0bXA7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fY29tbWFuZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgY21kKQotewotCXN0cnVjdCBhZHNwX2NvbW1hbmRfaGRyIHJwYzsKLQltZW1zZXQoJnJwYywgMCwgc2l6ZW9mKHJwYykpOwotCXJwYy5vcGNvZGUgPSBjbWQ7Ci0JcmV0dXJuIGF1ZGlvX2lvY3RsKGFjLCAmcnBjLCBzaXplb2YocnBjKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fb3Blbl9jb250cm9sKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCXN0cnVjdCBhZHNwX29wZW5fY29tbWFuZCBycGM7Ci0KLQltZW1zZXQoJnJwYywgMCwgc2l6ZW9mKHJwYykpOwotCXJwYy5oZHIub3Bjb2RlID0gQURTUF9BVURJT19JT0NUTF9DTURfT1BFTl9ERVZJQ0U7Ci0JcnBjLmhkci5kZXN0ID0gQVVESU9fQUREUihET01BSU5fRFNQLCBhYy0+c2Vzc2lvbiwgMCk7Ci0JcnBjLmhkci5zcmMgPSBBVURJT19BRERSKERPTUFJTl9BUFAsIGFjLT5zZXNzaW9uLCAwKTsKLQlyZXR1cm4gYXVkaW9faW9jdGwoYWMsICZycGMsIHNpemVvZihycGMpKTsKLX0KLQotCi1zdGF0aWMgaW50IGF1ZGlvX2Nsb3NlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCWF1ZGlvX2NvbW1hbmQoYWMsIEFEU1BfQVVESU9fSU9DVExfQ01EX1NUUkVBTV9TVE9QKTsKLQlhdWRpb19jb21tYW5kKGFjLCBBRFNQX0FVRElPX0lPQ1RMX0NNRF9DTE9TRSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fc2V0X3RhYmxlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJICAgdWludDMyX3QgZGV2aWNlX2lkLCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgYWRzcF9zZXRfZGV2X2NmZ190YWJsZV9jb21tYW5kIHJwYzsKLQotCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0JcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX1NFVF9ERVZJQ0VfQ09ORklHX1RBQkxFOwotCXJwYy5oZHIuZGVzdCA9IEFVRElPX0FERFIoRE9NQUlOX0RTUCwgYWMtPnNlc3Npb24sIDApOwotCXJwYy5oZHIuc3JjID0gQVVESU9fQUREUihET01BSU5fQVBQLCBhYy0+c2Vzc2lvbiwgMCk7Ci0JcnBjLmRldmljZV9pZCA9IGRldmljZV9pZDsKLQlycGMucGh5c19hZGRyID0gYXVkaW9fcGh5czsKLQlycGMucGh5c19zaXplID0gc2l6ZTsKLQlycGMucGh5c191c2VkID0gc2l6ZTsKLQotCWlmIChxNl9kZXZpY2VfdG9fZGlyKGRldmljZV9pZCkgPT0gUTZfVFgpCi0JCXJwYy5oZHIuZGF0YSA9IHR4X2Nsa19mcmVxOwotCXJldHVybiBhdWRpb19pb2N0bChhYywgJnJwYywgc2l6ZW9mKHJwYykpOwotfQotCi1pbnQgcTZhdWRpb19yZWFkKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBzdHJ1Y3QgYXVkaW9fYnVmZmVyICphYikKLXsKLQlzdHJ1Y3QgYWRzcF9idWZmZXJfY29tbWFuZCBycGM7Ci0JdWludDMyX3QgcmVzOwotCWludCByOwotCi0JbWVtc2V0KCZycGMsIDAsIHNpemVvZihycGMpKTsKLQlycGMuaGRyLnNpemUgPSBzaXplb2YocnBjKSAtIHNpemVvZih1MzIpOwotCXJwYy5oZHIuZGVzdCA9IEFVRElPX0FERFIoRE9NQUlOX0RTUCwgYWMtPnNlc3Npb24sIDApOwotCXJwYy5oZHIuc3JjID0gQVVESU9fQUREUihET01BSU5fQVBQLCBhYy0+c2Vzc2lvbiwgMCk7Ci0JcnBjLmhkci5jb250ZXh0ID0gYWMtPnNlc3Npb247Ci0JcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9EQVRBX1RYOwotCXJwYy5idWZmZXIuYWRkciA9IGFiLT5waHlzOwotCXJwYy5idWZmZXIubWF4X3NpemUgPSBhYi0+c2l6ZTsKLQlycGMuYnVmZmVyLmFjdHVhbF9zaXplID0gYWItPmFjdHVhbF9zaXplOwotCi0JciA9IGRhbF9jYWxsKGFjLT5jbGllbnQsIEFVRElPX09QX0RBVEEsIDUsICZycGMsIHNpemVvZihycGMpLAotCQkgICAgICZyZXMsIHNpemVvZihyZXMpKTsKLQotCWlmICgociA9PSBzaXplb2YocmVzKSkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIC1FSU87Ci0KLX0KLQotaW50IHE2YXVkaW9fd3JpdGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHN0cnVjdCBhdWRpb19idWZmZXIgKmFiKQotewotCXN0cnVjdCBhZHNwX2J1ZmZlcl9jb21tYW5kIHJwYzsKLQl1aW50MzJfdCByZXM7Ci0JaW50IHI7Ci0KLQltZW1zZXQoJnJwYywgMCwgc2l6ZW9mKHJwYykpOwotCXJwYy5oZHIuc2l6ZSA9IHNpemVvZihycGMpIC0gc2l6ZW9mKHUzMik7Ci0JcnBjLmhkci5zcmMgPSBBVURJT19BRERSKERPTUFJTl9BUFAsIGFjLT5zZXNzaW9uLCAwKTsKLQlycGMuaGRyLmRlc3QgPSBBVURJT19BRERSKERPTUFJTl9EU1AsIGFjLT5zZXNzaW9uLCAwKTsKLQlycGMuaGRyLmNvbnRleHQgPSBhYy0+c2Vzc2lvbjsKLQlycGMuaGRyLm9wY29kZSA9IEFEU1BfQVVESU9fSU9DVExfQ01EX0RBVEFfUlg7Ci0JcnBjLmJ1ZmZlci5hZGRyID0gYWItPnBoeXM7Ci0JcnBjLmJ1ZmZlci5tYXhfc2l6ZSA9IGFiLT5zaXplOwotCXJwYy5idWZmZXIuYWN0dWFsX3NpemUgPSBhYi0+YWN0dWFsX3NpemU7Ci0KLQlyID0gZGFsX2NhbGwoYWMtPmNsaWVudCwgQVVESU9fT1BfREFUQSwgNSwgJnJwYywgc2l6ZW9mKHJwYyksCi0JCSAgICAgJnJlcywgc2l6ZW9mKHJlcykpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX3J4X3ZvbHVtZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZGV2X2lkLAotCQkJCSBpbnQzMl90IHZvbHVtZSkKLXsKLQlzdHJ1Y3QgYWRzcF9zZXRfZGV2X3ZvbHVtZV9jb21tYW5kIHJwYzsKLQotCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0JcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVRfREVWSUNFX1ZPTDsKLQlycGMuaGRyLmRlc3QgPSBBVURJT19BRERSKERPTUFJTl9EU1AsIGFjLT5zZXNzaW9uLCAwKTsKLQlycGMuaGRyLnNyYyA9IEFVRElPX0FERFIoRE9NQUlOX0FQUCwgYWMtPnNlc3Npb24sIDApOwotCXJwYy5kZXZpY2VfaWQgPSBkZXZfaWQ7Ci0JcnBjLnBhdGggPSBBRFNQX1BBVEhfUlg7Ci0JcnBjLnZvbHVtZSA9IHZvbHVtZTsKLQlyZXR1cm4gYXVkaW9faW9jdGwoYWMsICZycGMsIHNpemVvZihycGMpKTsKLX0KLQotc3RhdGljIGludCBhdWRpb19yeF9tdXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBkZXZfaWQsIGludCBtdXRlKQotewotCXN0cnVjdCBhZHNwX3NldF9kZXZfbXV0ZV9jb21tYW5kIHJwYzsKLQotCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0JcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVRfREVWSUNFX01VVEU7Ci0JcnBjLmhkci5kZXN0ID0gQVVESU9fQUREUihET01BSU5fRFNQLCBhYy0+c2Vzc2lvbiwgMCk7Ci0JcnBjLmhkci5zcmMgPSBBVURJT19BRERSKERPTUFJTl9BUFAsIGFjLT5zZXNzaW9uLCAwKTsKLQlycGMuZGV2aWNlX2lkID0gZGV2X2lkOwotCXJwYy5wYXRoID0gQURTUF9QQVRIX1JYOwotCXJwYy5tdXRlID0gISFtdXRlOwotCXJldHVybiBhdWRpb19pb2N0bChhYywgJnJwYywgc2l6ZW9mKHJwYykpOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX3R4X3ZvbHVtZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZGV2X2lkLAotCQkJCSBpbnQzMl90IHZvbHVtZSkKLXsKLQlzdHJ1Y3QgYWRzcF9zZXRfZGV2X3ZvbHVtZV9jb21tYW5kIHJwYzsKLQotCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0JcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVRfREVWSUNFX1ZPTDsKLQlycGMuaGRyLmRlc3QgPSBBVURJT19BRERSKERPTUFJTl9EU1AsIGFjLT5zZXNzaW9uLCAwKTsKLQlycGMuaGRyLnNyYyA9IEFVRElPX0FERFIoRE9NQUlOX0FQUCwgYWMtPnNlc3Npb24sIDApOwotCXJwYy5kZXZpY2VfaWQgPSBkZXZfaWQ7Ci0JcnBjLnBhdGggPSBBRFNQX1BBVEhfVFg7Ci0JcnBjLnZvbHVtZSA9IHZvbHVtZTsKLQlyZXR1cm4gYXVkaW9faW9jdGwoYWMsICZycGMsIHNpemVvZihycGMpKTsKLX0KLQotc3RhdGljIGludCBhdWRpb190eF9tdXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBkZXZfaWQsIGludCBtdXRlKQotewotCXN0cnVjdCBhZHNwX3NldF9kZXZfbXV0ZV9jb21tYW5kIHJwYzsKLQotCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0JcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVRfREVWSUNFX01VVEU7Ci0JcnBjLmhkci5kZXN0ID0gQVVESU9fQUREUihET01BSU5fRFNQLCBhYy0+c2Vzc2lvbiwgMCk7Ci0JcnBjLmhkci5zcmMgPSBBVURJT19BRERSKERPTUFJTl9BUFAsIGFjLT5zZXNzaW9uLCAwKTsKLQlycGMuZGV2aWNlX2lkID0gZGV2X2lkOwotCXJwYy5wYXRoID0gQURTUF9QQVRIX1RYOwotCXJwYy5tdXRlID0gISFtdXRlOwotCXJldHVybiBhdWRpb19pb2N0bChhYywgJnJwYywgc2l6ZW9mKHJwYykpOwotfQotCi1zdGF0aWMgdm9pZCBjYWxsYmFjayh2b2lkICpkYXRhLCBpbnQgbGVuLCB2b2lkICpjb29raWUpCi17Ci0Jc3RydWN0IGFkc3BfZXZlbnRfaGRyICplID0gZGF0YTsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYzsKLQlzdHJ1Y3QgYWRzcF9idWZmZXJfZXZlbnQgKmFiZSA9IGRhdGE7Ci0KLQlpZiAoZS0+Y29udGV4dCA+PSBTRVNTSU9OX01BWCkgewotCQlwcl9lcnIoImF1ZGlvIGNhbGxiYWNrOiBib2d1cyBzZXNzaW9uICVkXG4iLAotCQkgICAgICAgZS0+Y29udGV4dCk7Ci0JCXJldHVybjsKLQl9Ci0JYWMgPSBzZXNzaW9uW2UtPmNvbnRleHRdOwotCWlmICghYWMpIHsKLQkJcHJfZXJyKCJhdWRpbyBjYWxsYmFjazogdW5rbm93biBzZXNzaW9uICVkXG4iLAotCQkgICAgICAgZS0+Y29udGV4dCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoZS0+ZXZlbnRfaWQgPT0gQURTUF9BVURJT19JT0NUTF9DTURfU1RSRUFNX0VPUykgewotCQlwcl9pbmZvKCJwbGF5YmFjayBkb25lXG4iKTsKLQkJaWYgKGUtPnN0YXR1cykKLQkJCXByX2VycigicGxheWJhY2sgc3RhdHVzICVkXG4iLCBlLT5zdGF0dXMpOwotCQlpZiAoYWMtPmNiX3N0YXR1cyA9PSAtRUJVU1kpIHsKLQkJCWFjLT5jYl9zdGF0dXMgPSBlLT5zdGF0dXM7Ci0JCQl3YWtlX3VwKCZhYy0+d2FpdCk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCWlmIChlLT5ldmVudF9pZCA9PSBBRFNQX0FVRElPX0VWVF9TVEFUVVNfQlVGX0RPTkUpIHsKLQkJaWYgKGUtPnN0YXR1cykKLQkJCXByX2VycigiYnVmZmVyIHN0YXR1cyAlZFxuIiwgZS0+c3RhdHVzKTsKLQotCQlhYy0+YnVmW2FjLT5kc3BfYnVmXS5hY3R1YWxfc2l6ZSA9IGFiZS0+YnVmZmVyLmFjdHVhbF9zaXplOwotCQlhYy0+YnVmW2FjLT5kc3BfYnVmXS51c2VkID0gMDsKLQkJYWMtPmRzcF9idWYgXj0gMTsKLQkJd2FrZV91cCgmYWMtPndhaXQpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGUtPnN0YXR1cykKLQkJcHJfd2FybmluZygiYXVkaW9fY2I6IHM9JWQgZT0lMDh4IHN0YXR1cz0lZFxuIiwKLQkJCSAgIGUtPmNvbnRleHQsIGUtPmV2ZW50X2lkLCBlLT5zdGF0dXMpOwotCi0JaWYgKGFjLT5jYl9zdGF0dXMgPT0gLUVCVVNZKSB7Ci0JCWFjLT5jYl9zdGF0dXMgPSBlLT5zdGF0dXM7Ci0JCXdha2VfdXAoJmFjLT53YWl0KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2luaXQoc3RydWN0IGRhbF9jbGllbnQgKmNsaWVudCkKLXsKLQl1MzIgdG1wWzNdOwotCi0JdG1wWzBdID0gMiAqIHNpemVvZih1MzIpOwotCXRtcFsxXSA9IDA7Ci0JdG1wWzJdID0gMDsKLQlkYWxfY2FsbChjbGllbnQsIEFVRElPX09QX0lOSVQsIDUsIHRtcCwgc2l6ZW9mKHRtcCksCi0JCSB0bXAsIHNpemVvZih1MzIpKTsKLX0KLQotc3RhdGljIHN0cnVjdCBhdWRpb19jbGllbnQgKmFjX2NvbnRyb2w7Ci0KLXN0YXRpYyBpbnQgcTZhdWRpb19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMgPSAwOwotCWludCByZXMgPSAtRU5PREVWOwotCi0JbXV0ZXhfbG9jaygmYXVkaW9fbG9jayk7Ci0JaWYgKGFjX2NvbnRyb2wpIHsKLQkJcmVzID0gMDsKLQkJZ290byBkb25lOwotCX0KLQotCWljb2RlY19yeF9jbGsgPSBjbGtfZ2V0KDAsICJpY29kZWNfcnhfY2xrIik7Ci0JaWNvZGVjX3R4X2NsayA9IGNsa19nZXQoMCwgImljb2RlY190eF9jbGsiKTsKLQllY29kZWNfY2xrID0gY2xrX2dldCgwLCAiZWNvZGVjX2NsayIpOwotCXNkYWNfY2xrID0gY2xrX2dldCgwLCAic2RhY19jbGsiKTsKLQotCXR4X211dGVfc3RhdHVzID0gMDsKLQlhdWRpb19waHlzID0gcG1lbV9rYWxsb2MoNDA5NiwgUE1FTV9NRU1UWVBFX0VCSTF8UE1FTV9BTElHTk1FTlRfNEspOwotCWF1ZGlvX2RhdGEgPSBpb3JlbWFwKGF1ZGlvX3BoeXMsIDQwOTYpOwotCWlmICghYXVkaW9fZGF0YSkgewotCQlwcl9lcnIoInBtZW0ga2FsbG9jIGZhaWxlZFxuIik7Ci0JCXJlcyA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhZHNwID0gZGFsX2F0dGFjaChBVURJT19EQUxfREVWSUNFLCBBVURJT19EQUxfUE9SVCwgMSwKLQkJCSAgY2FsbGJhY2ssIDApOwotCWlmICghYWRzcCkgewotCQlwcl9lcnIoImF1ZGlvX2luaXQ6IGNhbm5vdCBhdHRhY2ggdG8gYWRzcFxuIik7Ci0JCXJlcyA9IC1FTk9ERVY7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKGNoZWNrX3ZlcnNpb24oYWRzcCwgQVVESU9fREFMX1ZFUlNJT04pICE9IDApIHsKLQkJcHJfZXJyKCJJbmNvbXBhdGlibGUgYWRzcCB2ZXJzaW9uXG4iKTsKLQkJcmVzID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQotCWF1ZGlvX2luaXQoYWRzcCk7Ci0KLQlhYyA9IGF1ZGlvX2NsaWVudF9hbGxvYygwKTsKLQlpZiAoIWFjKSB7Ci0JCXByX2VycigiYXVkaW9faW5pdDogY2Fubm90IGFsbG9jYXRlIGNsaWVudFxuIik7Ci0JCXJlcyA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoYXVkaW9fb3Blbl9jb250cm9sKGFjKSkgewotCQlwcl9lcnIoImF1ZGlvX2luaXQ6IGNhbm5vdCBvcGVuIGNvbnRyb2wgY2hhbm5lbFxuIik7Ci0JCXJlcyA9IC1FTk9ERVY7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhY2RiID0gZGFsX2F0dGFjaChBQ0RCX0RBTF9ERVZJQ0UsIEFDREJfREFMX1BPUlQsIDAsIDAsIDApOwotCWlmICghYWNkYikgewotCQlwcl9lcnIoImF1ZGlvX2luaXQ6IGNhbm5vdCBhdHRhY2ggdG8gYWNkYiBjaGFubmVsXG4iKTsKLQkJcmVzID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoY2hlY2tfdmVyc2lvbihhY2RiLCBBQ0RCX0RBTF9WRVJTSU9OKSAhPSAwKSB7Ci0JCXByX2VycigiSW5jb21wYXRhYmxpZSBhY2RiIHZlcnNpb25cbiIpOwotCQlyZXMgPSAtRU5PREVWOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0KLQlhZGllID0gZGFsX2F0dGFjaChBRElFX0RBTF9ERVZJQ0UsIEFESUVfREFMX1BPUlQsIDAsIDAsIDApOwotCWlmICghYWRpZSkgewotCQlwcl9lcnIoImF1ZGlvX2luaXQ6IGNhbm5vdCBhdHRhY2ggdG8gYWRpZVxuIik7Ci0JCXJlcyA9IC1FTk9ERVY7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKGNoZWNrX3ZlcnNpb24oYWRpZSwgQURJRV9EQUxfVkVSU0lPTikgIT0gMCkgewotCQlwcl9lcnIoIkluY29tcGF0YWJsaWUgYWRpZSB2ZXJzaW9uXG4iKTsKLQkJcmVzID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoYW5hbG9nX29wcy0+aW5pdCkKLQkJYW5hbG9nX29wcy0+aW5pdCgpOwotCi0JcmVzID0gMDsKLQlhY19jb250cm9sID0gYWM7Ci0KLQlwbV9xb3NfYWRkX3JlcXVlc3QoJnBtX3Fvc19yZXEsIFBNX1FPU19DUFVfRE1BX0xBVEVOQ1ksCi0JCQkJUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotZG9uZToKLQlpZiAoKHJlcyA8IDApICYmIGFjKQotCQlhdWRpb19jbGllbnRfZnJlZShhYyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpb19sb2NrKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgYWNkYl9nZXRfY29uZmlnX3RhYmxlKHVpbnQzMl90IGRldmljZV9pZCwgdWludDMyX3Qgc2FtcGxlX3JhdGUpCi17Ci0Jc3RydWN0IGFjZGJfY21kX2RldmljZV90YWJsZSBycGM7Ci0Jc3RydWN0IGFjZGJfcmVzdWx0IHJlczsKLQlpbnQgcjsKLQotCWlmIChxNmF1ZGlvX2luaXQoKSkKLQkJcmV0dXJuIDA7Ci0KLQltZW1zZXQoYXVkaW9fZGF0YSwgMCwgNDA5Nik7Ci0JbWVtc2V0KCZycGMsIDAsIHNpemVvZihycGMpKTsKLQotCXJwYy5zaXplID0gc2l6ZW9mKHJwYykgLSAoMiAqIHNpemVvZih1aW50MzJfdCkpOwotCXJwYy5jb21tYW5kX2lkID0gQUNEQl9HRVRfREVWSUNFX1RBQkxFOwotCXJwYy5kZXZpY2VfaWQgPSBxNl9kZXZpY2VfdG9fY2FkX2lkKGRldmljZV9pZCk7Ci0JcnBjLm5ldHdvcmtfaWQgPSAweDAwMDEwMDIzOwotCXJwYy5zYW1wbGVfcmF0ZV9pZCA9IHNhbXBsZV9yYXRlOwotCXJwYy50b3RhbF9ieXRlcyA9IDQwOTY7Ci0JcnBjLnVubWFwcGVkX2J1ZiA9IGF1ZGlvX3BoeXM7Ci0JcnBjLnJlc19zaXplID0gc2l6ZW9mKHJlcykgLSAoMiAqIHNpemVvZih1aW50MzJfdCkpOwotCi0JciA9IGRhbF9jYWxsKGFjZGIsIEFDREJfT1BfSU9DVEwsIDgsICZycGMsIHNpemVvZihycGMpLAotCQkgICAgICZyZXMsIHNpemVvZihyZXMpKTsKLQotCWlmICgociA9PSBzaXplb2YocmVzKSkgJiYgKHJlcy5kYWxfc3RhdHVzID09IDApKQotCQlyZXR1cm4gcmVzLnVzZWRfYnl0ZXM7Ci0KLQlyZXR1cm4gLUVJTzsKLX0KLQotc3RhdGljIHVpbnQzMl90IGF1ZGlvX3J4X3BhdGhfaWQgPSBBRElFX1BBVEhfSEFORFNFVF9SWDsKLXN0YXRpYyB1aW50MzJfdCBhdWRpb19yeF9kZXZpY2VfaWQgPSBBRFNQX0FVRElPX0RFVklDRV9JRF9IQU5EU0VUX1NQS1I7Ci1zdGF0aWMgdWludDMyX3QgYXVkaW9fcnhfZGV2aWNlX2dyb3VwID0gLTE7Ci1zdGF0aWMgdWludDMyX3QgYXVkaW9fdHhfcGF0aF9pZCA9IEFESUVfUEFUSF9IQU5EU0VUX1RYOwotc3RhdGljIHVpbnQzMl90IGF1ZGlvX3R4X2RldmljZV9pZCA9IEFEU1BfQVVESU9fREVWSUNFX0lEX0hBTkRTRVRfTUlDOwotc3RhdGljIHVpbnQzMl90IGF1ZGlvX3R4X2RldmljZV9ncm91cCA9IC0xOwotCi1zdGF0aWMgaW50IHFkc3A2X2RldmNoZ19ub3RpZnkoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkgICAgICAgdWludDMyX3QgZGV2X3R5cGUsIHVpbnQzMl90IGRldl9pZCkKLXsKLQlzdHJ1Y3QgYWRzcF9kZXZpY2Vfc3dpdGNoX2NvbW1hbmQgcnBjOwotCi0JaWYgKGRldl90eXBlICE9IEFEU1BfQVVESU9fUlhfREVWSUNFICYmCi0JICAgIGRldl90eXBlICE9IEFEU1BfQVVESU9fVFhfREVWSUNFKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0JcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9ERVZJQ0VfU1dJVENIX1BSRVBBUkU7Ci0JcnBjLmhkci5kZXN0ID0gQVVESU9fQUREUihET01BSU5fRFNQLCBhYy0+c2Vzc2lvbiwgMCk7Ci0JcnBjLmhkci5zcmMgPSBBVURJT19BRERSKERPTUFJTl9BUFAsIGFjLT5zZXNzaW9uLCAwKTsKLQotCWlmIChkZXZfdHlwZSA9PSBBRFNQX0FVRElPX1JYX0RFVklDRSkgewotCQlycGMub2xkX2RldmljZSA9IGF1ZGlvX3J4X2RldmljZV9pZDsKLQkJcnBjLm5ld19kZXZpY2UgPSBkZXZfaWQ7Ci0JfSBlbHNlIHsKLQkJcnBjLm9sZF9kZXZpY2UgPSBhdWRpb190eF9kZXZpY2VfaWQ7Ci0JCXJwYy5uZXdfZGV2aWNlID0gZGV2X2lkOwotCX0KLQlycGMuZGV2aWNlX2NsYXNzID0gMDsKLQlycGMuZGV2aWNlX3R5cGUgPSBkZXZfdHlwZTsKLQlyZXR1cm4gYXVkaW9faW9jdGwoYWMsICZycGMsIHNpemVvZihycGMpKTsKLX0KLQotc3RhdGljIGludCBxZHNwNl9zdGFuZGJ5KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCXJldHVybiBhdWRpb19jb21tYW5kKGFjLCBBRFNQX0FVRElPX0lPQ1RMX0NNRF9ERVZJQ0VfU1dJVENIX1NUQU5EQlkpOwotfQotCi1zdGF0aWMgaW50IHFkc3A2X3N0YXJ0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCXJldHVybiBhdWRpb19jb21tYW5kKGFjLCBBRFNQX0FVRElPX0lPQ1RMX0NNRF9ERVZJQ0VfU1dJVENIX0NPTU1JVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX3J4X2FuYWxvZ19lbmFibGUoaW50IGVuKQotewotCXN3aXRjaCAoYXVkaW9fcnhfZGV2aWNlX2lkKSB7Ci0JY2FzZSBBRFNQX0FVRElPX0RFVklDRV9JRF9IRUFEU0VUX1NQS1JfTU9OTzoKLQljYXNlIEFEU1BfQVVESU9fREVWSUNFX0lEX0hFQURTRVRfU1BLUl9TVEVSRU86Ci0JY2FzZSBBRFNQX0FVRElPX0RFVklDRV9JRF9UVFlfSEVBRFNFVF9TUEtSOgotCQlpZiAoYW5hbG9nX29wcy0+aGVhZHNldF9lbmFibGUpCi0JCQlhbmFsb2dfb3BzLT5oZWFkc2V0X2VuYWJsZShlbik7Ci0JCWJyZWFrOwotCWNhc2UgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9NT05PX1dfTU9OT19IRUFEU0VUOgotCWNhc2UgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9NT05PX1dfU1RFUkVPX0hFQURTRVQ6Ci0JY2FzZSBBRFNQX0FVRElPX0RFVklDRV9JRF9TUEtSX1BIT05FX1NURVJFT19XX01PTk9fSEVBRFNFVDoKLQljYXNlIEFEU1BfQVVESU9fREVWSUNFX0lEX1NQS1JfUEhPTkVfU1RFUkVPX1dfU1RFUkVPX0hFQURTRVQ6Ci0JCWlmIChhbmFsb2dfb3BzLT5oZWFkc2V0X2VuYWJsZSkKLQkJCWFuYWxvZ19vcHMtPmhlYWRzZXRfZW5hYmxlKGVuKTsKLQkJaWYgKGFuYWxvZ19vcHMtPnNwZWFrZXJfZW5hYmxlKQotCQkJYW5hbG9nX29wcy0+c3BlYWtlcl9lbmFibGUoZW4pOwotCQlicmVhazsKLQljYXNlIEFEU1BfQVVESU9fREVWSUNFX0lEX1NQS1JfUEhPTkVfTU9OTzoKLQljYXNlIEFEU1BfQVVESU9fREVWSUNFX0lEX1NQS1JfUEhPTkVfU1RFUkVPOgotCQlpZiAoYW5hbG9nX29wcy0+c3BlYWtlcl9lbmFibGUpCi0JCQlhbmFsb2dfb3BzLT5zcGVha2VyX2VuYWJsZShlbik7Ci0JCWJyZWFrOwotCWNhc2UgQURTUF9BVURJT19ERVZJQ0VfSURfQlRfU0NPX1NQS1I6Ci0JCWlmIChhbmFsb2dfb3BzLT5idF9zY29fZW5hYmxlKQotCQkJYW5hbG9nX29wcy0+YnRfc2NvX2VuYWJsZShlbik7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fdHhfYW5hbG9nX2VuYWJsZShpbnQgZW4pCi17Ci0Jc3dpdGNoIChhdWRpb190eF9kZXZpY2VfaWQpIHsKLQljYXNlIEFEU1BfQVVESU9fREVWSUNFX0lEX0hBTkRTRVRfTUlDOgotCWNhc2UgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9NSUM6Ci0JCWlmIChhbmFsb2dfb3BzLT5pbnRfbWljX2VuYWJsZSkKLQkJCWFuYWxvZ19vcHMtPmludF9taWNfZW5hYmxlKGVuKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRFNQX0FVRElPX0RFVklDRV9JRF9IRUFEU0VUX01JQzoKLQljYXNlIEFEU1BfQVVESU9fREVWSUNFX0lEX1RUWV9IRUFEU0VUX01JQzoKLQkJaWYgKGFuYWxvZ19vcHMtPmV4dF9taWNfZW5hYmxlKQotCQkJYW5hbG9nX29wcy0+ZXh0X21pY19lbmFibGUoZW4pOwotCQlicmVhazsKLQljYXNlIEFEU1BfQVVESU9fREVWSUNFX0lEX0JUX1NDT19NSUM6Ci0JCWlmIChhbmFsb2dfb3BzLT5idF9zY29fZW5hYmxlKQotCQkJYW5hbG9nX29wcy0+YnRfc2NvX2VuYWJsZShlbik7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX2F1ZGlvX3J4X3BhdGhfZW5hYmxlKHZvaWQpCi17Ci0JdWludDMyX3QgYWRldiwgc2FtcGxlX3JhdGU7Ci0JaW50IHN6OwotCXVpbnQzMl90IGFkaWVfcGFyYW1zWzVdOwotCi0JYWRldiA9IGF1ZGlvX3J4X2RldmljZV9pZDsKLQlzYW1wbGVfcmF0ZSA9IHE2X2RldmljZV90b19yYXRlKGFkZXYpOwotCi0Jc3ogPSBhY2RiX2dldF9jb25maWdfdGFibGUoYWRldiwgc2FtcGxlX3JhdGUpOwotCWF1ZGlvX3NldF90YWJsZShhY19jb250cm9sLCBhZGV2LCBzeik7Ci0KLQlhZGllX3BhcmFtc1swXSA9IDQqc2l6ZW9mKHVpbnQzMl90KTsKLQlhZGllX3BhcmFtc1sxXSA9IGF1ZGlvX3J4X3BhdGhfaWQ7Ci0JYWRpZV9wYXJhbXNbMl0gPSBBRElFX1BBVEhfUlg7Ci0JYWRpZV9wYXJhbXNbM10gPSA0ODAwMDsKLQlhZGllX3BhcmFtc1s0XSA9IDI1NjsKLQkvKmNoZWNrIGZvciBlcnJvcnMgaGVyZSovCi0JaWYgKCFhZGllX3NldF9wYXRoKGFkaWUsIGFkaWVfcGFyYW1zLCBzaXplb2YoYWRpZV9wYXJhbXMpKSkKLQkJcHJfZXJyKCJhZGllIHNldCByeCBwYXRoIGZhaWxlZFxuIik7Ci0KLQlhZGllX3Byb2NlZWRfdG9fc3RhZ2UoYWRpZSwgQURJRV9QQVRIX1JYLAotCQkJCUFESUVfU1RBR0VfRElHSVRBTF9SRUFEWSk7Ci0JYWRpZV9wcm9jZWVkX3RvX3N0YWdlKGFkaWUsIEFESUVfUEFUSF9SWCwKLQkJCQlBRElFX1NUQUdFX0RJR0lUQUxfQU5BTE9HX1JFQURZKTsKLQotCWF1ZGlvX3J4X2FuYWxvZ19lbmFibGUoMSk7Ci0KLQlhdWRpb19yeF9tdXRlKGFjX2NvbnRyb2wsIGFkZXYsIDApOwotCi0JYXVkaW9fcnhfdm9sdW1lKGFjX2NvbnRyb2wsIGFkZXYsIHE2X2RldmljZV92b2x1bWUoYWRldiwgMTAwKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9hdWRpb190eF9wYXRoX2VuYWJsZSh2b2lkKQotewotCXVpbnQzMl90IGFkZXY7Ci0JaW50IHN6OwotCXVpbnQzMl90IGFkaWVfcGFyYW1zWzVdOwotCi0JYWRldiA9IGF1ZGlvX3R4X2RldmljZV9pZDsKLQotCXByX2luZm8oImF1ZGlvbGliOiBsb2FkICUwOHggY2ZnIHRhYmxlXG4iLCBhZGV2KTsKLQotCWlmICh0eF9jbGtfZnJlcSA+IDE2MDAwKSB7Ci0JCWFkaWVfcGFyYW1zWzNdID0gNDgwMDA7Ci0JCXN6ID0gYWNkYl9nZXRfY29uZmlnX3RhYmxlKGFkZXYsIDQ4MDAwKTsKLQotCX0gZWxzZSBpZiAodHhfY2xrX2ZyZXEgPiA4MDAwKSB7Ci0JCWFkaWVfcGFyYW1zWzNdID0gMTYwMDA7Ci0JCXN6ID0gYWNkYl9nZXRfY29uZmlnX3RhYmxlKGFkZXYsIDE2MDAwKTsKLQl9IGVsc2UgewotCi0JCWFkaWVfcGFyYW1zWzNdID0gODAwMDsKLQkJc3ogPSBhY2RiX2dldF9jb25maWdfdGFibGUoYWRldiwgODAwMCk7Ci0JfQotCi0JcHJfaW5mbygiY2ZnIHRhYmxlIGlzICVkIGJ5dGVzXG4iLCBzeik7Ci0JYXVkaW9fc2V0X3RhYmxlKGFjX2NvbnRyb2wsIGFkZXYsIHN6KTsKLQotCXByX2luZm8oImF1ZGlvbGliOiBzZXQgYWRpZSB0eCBwYXRoXG4iKTsKLQotCWFkaWVfcGFyYW1zWzBdID0gNCpzaXplb2YodWludDMyX3QpOwotCWFkaWVfcGFyYW1zWzFdID0gYXVkaW9fdHhfcGF0aF9pZDsKLQlhZGllX3BhcmFtc1syXSA9IEFESUVfUEFUSF9UWDsKLQlhZGllX3BhcmFtc1s0XSA9IDI1NjsKLQotCWlmICghYWRpZV9zZXRfcGF0aChhZGllLCBhZGllX3BhcmFtcywgc2l6ZW9mKGFkaWVfcGFyYW1zKSkpCi0JCXByX2VycigiYWRpZSBzZXQgdHggcGF0aCBmYWlsZWRcbiIpOwotCi0JYWRpZV9wcm9jZWVkX3RvX3N0YWdlKGFkaWUsIEFESUVfUEFUSF9UWCwKLQkJCQkJIEFESUVfU1RBR0VfRElHSVRBTF9SRUFEWSk7Ci0JYWRpZV9wcm9jZWVkX3RvX3N0YWdlKGFkaWUsIEFESUVfUEFUSF9UWCwKLQkJCQkJIEFESUVfU1RBR0VfRElHSVRBTF9BTkFMT0dfUkVBRFkpOwotCi0JYXVkaW9fdHhfYW5hbG9nX2VuYWJsZSgxKTsKLQlhdWRpb190eF9tdXRlKGFjX2NvbnRyb2wsIGFkZXYsIHR4X211dGVfc3RhdHVzKTsKLQotCWlmICghdHhfbXV0ZV9zdGF0dXMpCi0JCWF1ZGlvX3R4X3ZvbHVtZShhY19jb250cm9sLCBhZGV2LCBxNl9kZXZpY2Vfdm9sdW1lKGFkZXYsIDEwMCkpOwotfQotCi1zdGF0aWMgdm9pZCBfYXVkaW9fcnhfcGF0aF9kaXNhYmxlKHZvaWQpCi17Ci0JYXVkaW9fcnhfYW5hbG9nX2VuYWJsZSgwKTsKLQotCWFkaWVfcHJvY2VlZF90b19zdGFnZShhZGllLCBBRElFX1BBVEhfUlgsIEFESUVfU1RBR0VfQU5BTE9HX09GRik7Ci0JYWRpZV9wcm9jZWVkX3RvX3N0YWdlKGFkaWUsIEFESUVfUEFUSF9SWCwgQURJRV9TVEFHRV9ESUdJVEFMX09GRik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9hdWRpb190eF9wYXRoX2Rpc2FibGUodm9pZCkKLXsKLQlhdWRpb190eF9hbmFsb2dfZW5hYmxlKDApOwotCi0JYWRpZV9wcm9jZWVkX3RvX3N0YWdlKGFkaWUsIEFESUVfUEFUSF9UWCwgQURJRV9TVEFHRV9BTkFMT0dfT0ZGKTsKLQlhZGllX3Byb2NlZWRfdG9fc3RhZ2UoYWRpZSwgQURJRV9QQVRIX1RYLCBBRElFX1NUQUdFX0RJR0lUQUxfT0ZGKTsKLX0KLQotc3RhdGljIGludCBpY29kZWNfcnhfY2xrX3JlZmNvdW50Owotc3RhdGljIGludCBpY29kZWNfdHhfY2xrX3JlZmNvdW50Owotc3RhdGljIGludCBlY29kZWNfY2xrX3JlZmNvdW50Owotc3RhdGljIGludCBzZGFjX2Nsa19yZWZjb3VudDsKLQotc3RhdGljIHZvaWQgX2F1ZGlvX3J4X2Nsa19lbmFibGUodm9pZCkKLXsKLQl1aW50MzJfdCBkZXZpY2VfZ3JvdXAgPSBxNl9kZXZpY2VfdG9fY29kZWMoYXVkaW9fcnhfZGV2aWNlX2lkKTsKLQotCXN3aXRjaCAoZGV2aWNlX2dyb3VwKSB7Ci0JY2FzZSBRNl9JQ09ERUNfUlg6Ci0JCWljb2RlY19yeF9jbGtfcmVmY291bnQrKzsKLQkJaWYgKGljb2RlY19yeF9jbGtfcmVmY291bnQgPT0gMSkgewotCQkJY2xrX3NldF9yYXRlKGljb2RlY19yeF9jbGssIDEyMjg4MDAwKTsKLQkJCWNsa19lbmFibGUoaWNvZGVjX3J4X2Nsayk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBRNl9FQ09ERUNfUlg6Ci0JCWVjb2RlY19jbGtfcmVmY291bnQrKzsKLQkJaWYgKGVjb2RlY19jbGtfcmVmY291bnQgPT0gMSkgewotCQkJY2xrX3NldF9yYXRlKGVjb2RlY19jbGssIDIwNDgwMDApOwotCQkJY2xrX2VuYWJsZShlY29kZWNfY2xrKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFE2X1NEQUNfUlg6Ci0JCXNkYWNfY2xrX3JlZmNvdW50Kys7Ci0JCWlmIChzZGFjX2Nsa19yZWZjb3VudCA9PSAxKSB7Ci0JCQljbGtfc2V0X3JhdGUoc2RhY19jbGssIDEyMjg4MDAwKTsKLQkJCWNsa19lbmFibGUoc2RhY19jbGspOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybjsKLQl9Ci0JYXVkaW9fcnhfZGV2aWNlX2dyb3VwID0gZGV2aWNlX2dyb3VwOwotfQotCi1zdGF0aWMgdm9pZCBfYXVkaW9fdHhfY2xrX2VuYWJsZSh2b2lkKQotewotCXVpbnQzMl90IGRldmljZV9ncm91cCA9IHE2X2RldmljZV90b19jb2RlYyhhdWRpb190eF9kZXZpY2VfaWQpOwotCi0Jc3dpdGNoIChkZXZpY2VfZ3JvdXApIHsKLQljYXNlIFE2X0lDT0RFQ19UWDoKLQkJaWNvZGVjX3R4X2Nsa19yZWZjb3VudCsrOwotCQlpZiAoaWNvZGVjX3R4X2Nsa19yZWZjb3VudCA9PSAxKSB7Ci0JCQljbGtfc2V0X3JhdGUoaWNvZGVjX3R4X2NsaywgdHhfY2xrX2ZyZXEgKiAyNTYpOwotCQkJY2xrX2VuYWJsZShpY29kZWNfdHhfY2xrKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFE2X0VDT0RFQ19UWDoKLQkJZWNvZGVjX2Nsa19yZWZjb3VudCsrOwotCQlpZiAoZWNvZGVjX2Nsa19yZWZjb3VudCA9PSAxKSB7Ci0JCQljbGtfc2V0X3JhdGUoZWNvZGVjX2NsaywgMjA0ODAwMCk7Ci0JCQljbGtfZW5hYmxlKGVjb2RlY19jbGspOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgUTZfU0RBQ19UWDoKLQkJLyogVE9ETzogSW4gUUNUIEJTUCwgY2xrIHJhdGUgd2FzIHNldCB0byAyMDQ4MDAwMCAqLwotCQlzZGFjX2Nsa19yZWZjb3VudCsrOwotCQlpZiAoc2RhY19jbGtfcmVmY291bnQgPT0gMSkgewotCQkJY2xrX3NldF9yYXRlKHNkYWNfY2xrLCAxMjI4ODAwMCk7Ci0JCQljbGtfZW5hYmxlKHNkYWNfY2xrKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm47Ci0JfQotCWF1ZGlvX3R4X2RldmljZV9ncm91cCA9IGRldmljZV9ncm91cDsKLX0KLQotc3RhdGljIHZvaWQgX2F1ZGlvX3J4X2Nsa19kaXNhYmxlKHZvaWQpCi17Ci0Jc3dpdGNoIChhdWRpb19yeF9kZXZpY2VfZ3JvdXApIHsKLQljYXNlIFE2X0lDT0RFQ19SWDoKLQkJaWNvZGVjX3J4X2Nsa19yZWZjb3VudC0tOwotCQlpZiAoaWNvZGVjX3J4X2Nsa19yZWZjb3VudCA9PSAwKSB7Ci0JCQljbGtfZGlzYWJsZShpY29kZWNfcnhfY2xrKTsKLQkJCWF1ZGlvX3J4X2RldmljZV9ncm91cCA9IC0xOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgUTZfRUNPREVDX1JYOgotCQllY29kZWNfY2xrX3JlZmNvdW50LS07Ci0JCWlmIChlY29kZWNfY2xrX3JlZmNvdW50ID09IDApIHsKLQkJCWNsa19kaXNhYmxlKGVjb2RlY19jbGspOwotCQkJYXVkaW9fcnhfZGV2aWNlX2dyb3VwID0gLTE7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBRNl9TREFDX1JYOgotCQlzZGFjX2Nsa19yZWZjb3VudC0tOwotCQlpZiAoc2RhY19jbGtfcmVmY291bnQgPT0gMCkgewotCQkJY2xrX2Rpc2FibGUoc2RhY19jbGspOwotCQkJYXVkaW9fcnhfZGV2aWNlX2dyb3VwID0gLTE7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCJhdWRpb2xpYjogaW52YWxpZCByeCBkZXZpY2UgZ3JvdXAgJWRcbiIsCi0JCQlhdWRpb19yeF9kZXZpY2VfZ3JvdXApOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9hdWRpb190eF9jbGtfZGlzYWJsZSh2b2lkKQotewotCXN3aXRjaCAoYXVkaW9fdHhfZGV2aWNlX2dyb3VwKSB7Ci0JY2FzZSBRNl9JQ09ERUNfVFg6Ci0JCWljb2RlY190eF9jbGtfcmVmY291bnQtLTsKLQkJaWYgKGljb2RlY190eF9jbGtfcmVmY291bnQgPT0gMCkgewotCQkJY2xrX2Rpc2FibGUoaWNvZGVjX3R4X2Nsayk7Ci0JCQlhdWRpb190eF9kZXZpY2VfZ3JvdXAgPSAtMTsKLQkJfQotCQlicmVhazsKLQljYXNlIFE2X0VDT0RFQ19UWDoKLQkJZWNvZGVjX2Nsa19yZWZjb3VudC0tOwotCQlpZiAoZWNvZGVjX2Nsa19yZWZjb3VudCA9PSAwKSB7Ci0JCQljbGtfZGlzYWJsZShlY29kZWNfY2xrKTsKLQkJCWF1ZGlvX3R4X2RldmljZV9ncm91cCA9IC0xOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgUTZfU0RBQ19UWDoKLQkJc2RhY19jbGtfcmVmY291bnQtLTsKLQkJaWYgKHNkYWNfY2xrX3JlZmNvdW50ID09IDApIHsKLQkJCWNsa19kaXNhYmxlKHNkYWNfY2xrKTsKLQkJCWF1ZGlvX3R4X2RldmljZV9ncm91cCA9IC0xOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiYXVkaW9saWI6IGludmFsaWQgdHggZGV2aWNlIGdyb3VwICVkXG4iLAotCQkJYXVkaW9fdHhfZGV2aWNlX2dyb3VwKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfYXVkaW9fcnhfY2xrX3JlaW5pdCh1aW50MzJfdCByeF9kZXZpY2UpCi17Ci0JdWludDMyX3QgZGV2aWNlX2dyb3VwID0gcTZfZGV2aWNlX3RvX2NvZGVjKHJ4X2RldmljZSk7Ci0KLQlpZiAoZGV2aWNlX2dyb3VwICE9IGF1ZGlvX3J4X2RldmljZV9ncm91cCkKLQkJX2F1ZGlvX3J4X2Nsa19kaXNhYmxlKCk7Ci0KLQlhdWRpb19yeF9kZXZpY2VfaWQgPSByeF9kZXZpY2U7Ci0JYXVkaW9fcnhfcGF0aF9pZCA9IHE2X2RldmljZV90b19wYXRoKHJ4X2RldmljZSk7Ci0KLQlpZiAoZGV2aWNlX2dyb3VwICE9IGF1ZGlvX3J4X2RldmljZV9ncm91cCkKLQkJX2F1ZGlvX3J4X2Nsa19lbmFibGUoKTsKLQotfQotCi1zdGF0aWMgdm9pZCBfYXVkaW9fdHhfY2xrX3JlaW5pdCh1aW50MzJfdCB0eF9kZXZpY2UpCi17Ci0JdWludDMyX3QgZGV2aWNlX2dyb3VwID0gcTZfZGV2aWNlX3RvX2NvZGVjKHR4X2RldmljZSk7Ci0KLQlpZiAoZGV2aWNlX2dyb3VwICE9IGF1ZGlvX3R4X2RldmljZV9ncm91cCkKLQkJX2F1ZGlvX3R4X2Nsa19kaXNhYmxlKCk7Ci0KLQlhdWRpb190eF9kZXZpY2VfaWQgPSB0eF9kZXZpY2U7Ci0JYXVkaW9fdHhfcGF0aF9pZCA9IHE2X2RldmljZV90b19wYXRoKHR4X2RldmljZSk7Ci0KLQlpZiAoZGV2aWNlX2dyb3VwICE9IGF1ZGlvX3R4X2RldmljZV9ncm91cCkKLQkJX2F1ZGlvX3R4X2Nsa19lbmFibGUoKTsKLX0KLQotc3RhdGljIERFRklORV9NVVRFWChhdWRpb19wYXRoX2xvY2spOwotc3RhdGljIGludCBhdWRpb19yeF9wYXRoX3JlZmNvdW50Owotc3RhdGljIGludCBhdWRpb190eF9wYXRoX3JlZmNvdW50OwotCi1zdGF0aWMgaW50IGF1ZGlvX3J4X3BhdGhfZW5hYmxlKGludCBlbikKLXsKLQltdXRleF9sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCWlmIChlbikgewotCQlhdWRpb19yeF9wYXRoX3JlZmNvdW50Kys7Ci0JCWlmIChhdWRpb19yeF9wYXRoX3JlZmNvdW50ID09IDEpIHsKLQkJCWFkaWVfZW5hYmxlKCk7Ci0JCQlfYXVkaW9fcnhfY2xrX2VuYWJsZSgpOwotCQkJX2F1ZGlvX3J4X3BhdGhfZW5hYmxlKCk7Ci0JCX0KLQl9IGVsc2UgewotCQlhdWRpb19yeF9wYXRoX3JlZmNvdW50LS07Ci0JCWlmIChhdWRpb19yeF9wYXRoX3JlZmNvdW50ID09IDApIHsKLQkJCV9hdWRpb19yeF9wYXRoX2Rpc2FibGUoKTsKLQkJCV9hdWRpb19yeF9jbGtfZGlzYWJsZSgpOwotCQkJYWRpZV9kaXNhYmxlKCk7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX3R4X3BhdGhfZW5hYmxlKGludCBlbikKLXsKLQltdXRleF9sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCWlmIChlbikgewotCQlhdWRpb190eF9wYXRoX3JlZmNvdW50Kys7Ci0JCWlmIChhdWRpb190eF9wYXRoX3JlZmNvdW50ID09IDEpIHsKLQkJCWFkaWVfZW5hYmxlKCk7Ci0JCQlfYXVkaW9fdHhfY2xrX2VuYWJsZSgpOwotCQkJX2F1ZGlvX3R4X3BhdGhfZW5hYmxlKCk7Ci0JCX0KLQl9IGVsc2UgewotCQlhdWRpb190eF9wYXRoX3JlZmNvdW50LS07Ci0JCWlmIChhdWRpb190eF9wYXRoX3JlZmNvdW50ID09IDApIHsKLQkJCV9hdWRpb190eF9wYXRoX2Rpc2FibGUoKTsKLQkJCV9hdWRpb190eF9jbGtfZGlzYWJsZSgpOwotCQkJYWRpZV9kaXNhYmxlKCk7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCXJldHVybiAwOwotfQotCi1pbnQgcTZhdWRpb191cGRhdGVfYWNkYih1aW50MzJfdCBpZF9zcmMsIHVpbnQzMl90IGlkX2RzdCkKLXsKLQltdXRleF9sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCW11dGV4X3VubG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHE2YXVkaW9fc2V0X3R4X211dGUoaW50IG11dGUpCi17Ci0JdWludDMyX3QgYWRldjsKLQlpbnQgcmM7Ci0KLQlpZiAocTZhdWRpb19pbml0KCkpCi0JCXJldHVybiAwOwotCi0JbXV0ZXhfbG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQotCWlmIChtdXRlID09IHR4X211dGVfc3RhdHVzKSB7Ci0JCW11dGV4X3VubG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYWRldiA9IGF1ZGlvX3R4X2RldmljZV9pZDsKLQlyYyA9IGF1ZGlvX3R4X211dGUoYWNfY29udHJvbCwgYWRldiwgbXV0ZSk7Ci0JaWYgKCFyYykKLQkJdHhfbXV0ZV9zdGF0dXMgPSBtdXRlOwotCW11dGV4X3VubG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHE2YXVkaW9fc2V0X3J4X3ZvbHVtZShpbnQgbGV2ZWwpCi17Ci0JdWludDMyX3QgYWRldjsKLQlpbnQgdm9sOwotCi0JaWYgKHE2YXVkaW9faW5pdCgpKQotCQlyZXR1cm4gMDsKLQotCWlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiAxMDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQlhZGV2ID0gYXVkaW9fcnhfZGV2aWNlX2lkOwotCXZvbCA9IHE2X2RldmljZV92b2x1bWUoYWRldiwgbGV2ZWwpOwotCWF1ZGlvX3J4X211dGUoYWNfY29udHJvbCwgYWRldiwgMCk7Ci0JYXVkaW9fcnhfdm9sdW1lKGFjX2NvbnRyb2wsIGFkZXYsIHZvbCk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkb19yeF9yb3V0aW5nKHVpbnQzMl90IGRldmljZV9pZCkKLXsKLQlpbnQgc3o7Ci0JdWludDMyX3Qgc2FtcGxlX3JhdGU7Ci0KLQlpZiAoZGV2aWNlX2lkID09IGF1ZGlvX3J4X2RldmljZV9pZCkKLQkJcmV0dXJuOwotCi0JaWYgKGF1ZGlvX3J4X3BhdGhfcmVmY291bnQgPiAwKSB7Ci0JCXFkc3A2X2RldmNoZ19ub3RpZnkoYWNfY29udHJvbCwgQURTUF9BVURJT19SWF9ERVZJQ0UsCi0JCQkJCSBkZXZpY2VfaWQpOwotCQlfYXVkaW9fcnhfcGF0aF9kaXNhYmxlKCk7Ci0JCV9hdWRpb19yeF9jbGtfcmVpbml0KGRldmljZV9pZCk7Ci0JCV9hdWRpb19yeF9wYXRoX2VuYWJsZSgpOwotCX0gZWxzZSB7Ci0JCXNhbXBsZV9yYXRlID0gcTZfZGV2aWNlX3RvX3JhdGUoZGV2aWNlX2lkKTsKLQkJc3ogPSBhY2RiX2dldF9jb25maWdfdGFibGUoZGV2aWNlX2lkLCBzYW1wbGVfcmF0ZSk7Ci0JCWlmIChzeiA8IDApCi0JCQlwcl9lcnIoImNvdWxkIG5vdCBnZXQgQUNEQiBjb25maWcgdGFibGVcbiIpOwotCi0JCWF1ZGlvX3NldF90YWJsZShhY19jb250cm9sLCBkZXZpY2VfaWQsIHN6KTsKLQkJcWRzcDZfZGV2Y2hnX25vdGlmeShhY19jb250cm9sLCBBRFNQX0FVRElPX1JYX0RFVklDRSwKLQkJCQkJIGRldmljZV9pZCk7Ci0JCXFkc3A2X3N0YW5kYnkoYWNfY29udHJvbCk7Ci0JCXFkc3A2X3N0YXJ0KGFjX2NvbnRyb2wpOwotCQlhdWRpb19yeF9kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7Ci0JCWF1ZGlvX3J4X3BhdGhfaWQgPSBxNl9kZXZpY2VfdG9fcGF0aChkZXZpY2VfaWQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZG9fdHhfcm91dGluZyh1aW50MzJfdCBkZXZpY2VfaWQpCi17Ci0JaW50IHN6OwotCXVpbnQzMl90IHNhbXBsZV9yYXRlOwotCi0JaWYgKGRldmljZV9pZCA9PSBhdWRpb190eF9kZXZpY2VfaWQpCi0JCXJldHVybjsKLQotCWlmIChhdWRpb190eF9wYXRoX3JlZmNvdW50ID4gMCkgewotCQlxZHNwNl9kZXZjaGdfbm90aWZ5KGFjX2NvbnRyb2wsIEFEU1BfQVVESU9fVFhfREVWSUNFLAotCQkJCQkgZGV2aWNlX2lkKTsKLQkJX2F1ZGlvX3R4X3BhdGhfZGlzYWJsZSgpOwotCQlfYXVkaW9fdHhfY2xrX3JlaW5pdChkZXZpY2VfaWQpOwotCQlfYXVkaW9fdHhfcGF0aF9lbmFibGUoKTsKLQl9IGVsc2UgewotCQlzYW1wbGVfcmF0ZSA9IHE2X2RldmljZV90b19yYXRlKGRldmljZV9pZCk7Ci0JCXN6ID0gYWNkYl9nZXRfY29uZmlnX3RhYmxlKGRldmljZV9pZCwgc2FtcGxlX3JhdGUpOwotCQlhdWRpb19zZXRfdGFibGUoYWNfY29udHJvbCwgZGV2aWNlX2lkLCBzeik7Ci0JCXFkc3A2X2RldmNoZ19ub3RpZnkoYWNfY29udHJvbCwgQURTUF9BVURJT19UWF9ERVZJQ0UsCi0JCQkJCSBkZXZpY2VfaWQpOwotCQlxZHNwNl9zdGFuZGJ5KGFjX2NvbnRyb2wpOwotCQlxZHNwNl9zdGFydChhY19jb250cm9sKTsKLQkJYXVkaW9fdHhfZGV2aWNlX2lkID0gZGV2aWNlX2lkOwotCQlhdWRpb190eF9wYXRoX2lkID0gcTZfZGV2aWNlX3RvX3BhdGgoZGV2aWNlX2lkKTsKLQl9Ci19Ci0KLWludCBxNmF1ZGlvX2RvX3JvdXRpbmcodWludDMyX3QgZGV2aWNlX2lkKQotewotCWlmIChxNmF1ZGlvX2luaXQoKSkKLQkJcmV0dXJuIDA7Ci0KLQltdXRleF9sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCi0Jc3dpdGNoIChxNl9kZXZpY2VfdG9fZGlyKGRldmljZV9pZCkpIHsKLQljYXNlIFE2X1JYOgotCQlkb19yeF9yb3V0aW5nKGRldmljZV9pZCk7Ci0JCWJyZWFrOwotCWNhc2UgUTZfVFg6Ci0JCWRvX3R4X3JvdXRpbmcoZGV2aWNlX2lkKTsKLQkJYnJlYWs7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCXJldHVybiAwOwotfQotCi1pbnQgcTZhdWRpb19zZXRfcm91dGUoY29uc3QgY2hhciAqbmFtZSkKLXsKLQl1aW50MzJfdCByb3V0ZTsKLQlpZiAoIXN0cmNtcChuYW1lLCAic3BlYWtlciIpKQotCQlyb3V0ZSA9IEFESUVfUEFUSF9TUEVBS0VSX1NURVJFT19SWDsKLQllbHNlIGlmICghc3RyY21wKG5hbWUsICJoZWFkcGhvbmVzIikpCi0JCXJvdXRlID0gQURJRV9QQVRIX0hFQURTRVRfU1RFUkVPX1JYOwotCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImhhbmRzZXQiKSkKLQkJcm91dGUgPSBBRElFX1BBVEhfSEFORFNFVF9SWDsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQlpZiAocm91dGUgPT0gYXVkaW9fcnhfcGF0aF9pZCkKLQkJZ290byBkb25lOwotCi0JYXVkaW9fcnhfcGF0aF9pZCA9IHJvdXRlOwotCi0JaWYgKGF1ZGlvX3J4X3BhdGhfcmVmY291bnQgPiAwKSB7Ci0JCV9hdWRpb19yeF9wYXRoX2Rpc2FibGUoKTsKLQkJX2F1ZGlvX3J4X3BhdGhfZW5hYmxlKCk7Ci0JfQotCWlmIChhdWRpb190eF9wYXRoX3JlZmNvdW50ID4gMCkgewotCQlfYXVkaW9fdHhfcGF0aF9kaXNhYmxlKCk7Ci0JCV9hdWRpb190eF9wYXRoX2VuYWJsZSgpOwotCX0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgYXVkaW9fY2xpZW50ICpxNmF1ZGlvX29wZW4odWludDMyX3QgZmxhZ3MsIHVpbnQzMl90IGJ1ZnN6KQotewotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCi0JaWYgKHE2YXVkaW9faW5pdCgpKQotCQlyZXR1cm4gMDsKLQotCWFjID0gYXVkaW9fY2xpZW50X2FsbG9jKGJ1ZnN6KTsKLQlpZiAoIWFjKQotCQlyZXR1cm4gMDsKLQotCWFjLT5mbGFncyA9IGZsYWdzOwotCWlmIChhYy0+ZmxhZ3MgJiBBVURJT19GTEFHX1dSSVRFKQotCQlhdWRpb19yeF9wYXRoX2VuYWJsZSgxKTsKLQllbHNlCi0JCWF1ZGlvX3R4X3BhdGhfZW5hYmxlKDEpOwotCi0JcmV0dXJuIGFjOwotfQotCi1pbnQgcTZhdWRpb19zdGFydChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdm9pZCAqcnBjLAotCQkJCQkJdWludDMyX3QgbGVuKQotewotCi0JYXVkaW9faW9jdGwoYWMsIHJwYywgbGVuKTsKLQotCWF1ZGlvX2NvbW1hbmQoYWMsIEFEU1BfQVVESU9fSU9DVExfQ01EX1NFU1NJT05fU1RBUlQpOwotCi0JaWYgKCEoYWMtPmZsYWdzICYgQVVESU9fRkxBR19XUklURSkpIHsKLQkJYWMtPmJ1ZlswXS51c2VkID0gMTsKLQkJYWMtPmJ1ZlsxXS51c2VkID0gMTsKLQkJcTZhdWRpb19yZWFkKGFjLCAmYWMtPmJ1ZlswXSk7Ci0JCXE2YXVkaW9fcmVhZChhYywgJmFjLT5idWZbMV0pOwotCX0KLQotCWF1ZGlvX3ByZXZlbnRfc2xlZXAoKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHE2YXVkaW9fY2xvc2Uoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCi17Ci0JYXVkaW9fY2xvc2UoYWMpOwotCi0JaWYgKGFjLT5mbGFncyAmIEFVRElPX0ZMQUdfV1JJVEUpCi0JCWF1ZGlvX3J4X3BhdGhfZW5hYmxlKDApOwotCWVsc2UKLQkJYXVkaW9fdHhfcGF0aF9lbmFibGUoMCk7Ci0KLQlhdWRpb19jbGllbnRfZnJlZShhYyk7Ci0JYXVkaW9fYWxsb3dfc2xlZXAoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IGF1ZGlvX2NsaWVudCAqcTZ2b2ljZV9vcGVuKHZvaWQpCi17Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0KLQlpZiAocTZhdWRpb19pbml0KCkpCi0JCXJldHVybiAwOwotCi0JYWMgPSBhdWRpb19jbGllbnRfYWxsb2MoMCk7Ci0JaWYgKCFhYykKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gYWM7Ci19Ci0KLWludCBxNnZvaWNlX3NldHVwKHZvaWQpCi17Ci0JYXVkaW9fcnhfcGF0aF9lbmFibGUoMSk7Ci0JdHhfY2xrX2ZyZXEgPSA4MDAwOwotCWF1ZGlvX3R4X3BhdGhfZW5hYmxlKDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBxNnZvaWNlX3RlYXJkb3duKHZvaWQpCi17Ci0JYXVkaW9fcnhfcGF0aF9lbmFibGUoMCk7Ci0JYXVkaW9fdHhfcGF0aF9lbmFibGUoMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotaW50IHE2dm9pY2VfY2xvc2Uoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCi17Ci0JYXVkaW9fY2xpZW50X2ZyZWUoYWMpOwotCXJldHVybiAwOwotfQotCi1pbnQgcTZhdWRpb19hc3luYyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYykKLXsKLQlzdHJ1Y3QgYWRzcF9jb21tYW5kX2hkciBycGM7Ci0JbWVtc2V0KCZycGMsIDAsIHNpemVvZihycGMpKTsKLQlycGMub3Bjb2RlID0gQURTUF9BVURJT19JT0NUTF9DTURfU1RSRUFNX0VPUzsKLQlycGMucmVzcG9uc2VfdHlwZSA9IEFEU1BfQVVESU9fUkVTUE9OU0VfQVNZTkM7Ci0JcmV0dXJuIGF1ZGlvX2lvY3RsKGFjLCAmcnBjLCBzaXplb2YocnBjKSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL3E2YXVkaW9fZGV2aWNlcy5oIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9xNmF1ZGlvX2RldmljZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4NmNjYS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL3E2YXVkaW9fZGV2aWNlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvcTZhdWRpb19kZXZpY2VzLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIEF1dGhvcjogQnJpYW4gU3dldGxhbmQgPHN3ZXRsYW5kQGdvb2dsZS5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotc3RydWN0IHE2X2RldmljZV9pbmZvIHsKLQl1aW50MzJfdCBpZDsKLQl1aW50MzJfdCBjYWRfaWQ7Ci0JdWludDMyX3QgcGF0aDsKLQl1aW50MzJfdCByYXRlOwotCXVpbnQ4X3QgZGlyOwotCXVpbnQ4X3QgY29kZWM7Ci0JdWludDhfdCBodzsKLX07Ci0KLSNkZWZpbmUgUTZfSUNPREVDX1JYCQkwCi0jZGVmaW5lIFE2X0lDT0RFQ19UWAkJMQotI2RlZmluZSBRNl9FQ09ERUNfUlgJCTIKLSNkZWZpbmUgUTZfRUNPREVDX1RYCQkzCi0jZGVmaW5lIFE2X1NEQUNfUlgJCTYKLSNkZWZpbmUgUTZfU0RBQ19UWAkJNwotI2RlZmluZSBRNl9DT0RFQ19OT05FCQkyNTUKLQotI2RlZmluZSBRNl9UWAkJMQotI2RlZmluZSBRNl9SWAkJMgotI2RlZmluZSBRNl9UWF9SWAkzCi0KLSNkZWZpbmUgUTZfSFdfSEFORFNFVAkwCi0jZGVmaW5lIFE2X0hXX0hFQURTRVQJMQotI2RlZmluZSBRNl9IV19TUEVBS0VSCTIKLSNkZWZpbmUgUTZfSFdfVFRZCTMKLSNkZWZpbmUgUTZfSFdfQlRfU0NPCTQKLSNkZWZpbmUgUTZfSFdfQlRfQTJEUAk1Ci0KLSNkZWZpbmUgUTZfSFdfQ09VTlQJNgotCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfSEFORFNFVF9NSUMJCTB4MDEKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9IQU5EU0VUX1NQS1IJCTB4MDIKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9IRUFEU0VUX01JQwkJMHgwMwotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX0hFQURTRVRfU1BLUl9NT05PCTB4MDQKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9IRUFEU0VUX1NQS1JfU1RFUkVPCTB4MDUKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9TUEtSX1BIT05FX01JQwkJMHgwNgotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX1NQS1JfUEhPTkVfTU9OTwkweDA3Ci0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfU1BLUl9QSE9ORV9TVEVSRU8JMHgwOAotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX0JUX1NDT19NSUMJCTB4MDkKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9CVF9TQ09fU1BLUgkJMHgwQQotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX0JUX0EyRFBfU1BLUgkJMHgwQgotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX1RUWV9IRUFEU0VUX01JQwkweDBDCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfVFRZX0hFQURTRVRfU1BLUgkweDBECi0KLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9ERUZBVUxUX1RYCQkweDBFCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfREVGQVVMVF9SWAkJMHgwRgotCi0vKiBMb2dpY2FsIERldmljZSB0byBpbmRpY2F0ZSBBMkRQIHJvdXRpbmcgKi8KLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9CVF9BMkRQX1RYICAgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9IRUFEU0VUX01PTk9fUExVU19TUEtSX01PTk9fUlgJCTB4MTEKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9IRUFEU0VUX01PTk9fUExVU19TUEtSX1NURVJFT19SWAkweDEyCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfSEVBRFNFVF9TVEVSRU9fUExVU19TUEtSX01PTk9fUlgJMHgxMwotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX0hFQURTRVRfU1RFUkVPX1BMVVNfU1BLUl9TVEVSRU9fUlgJMHgxNAotCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfVk9JQ0UJCQkweDE1Ci0KLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9JMlNfUlggICAgICAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9JMlNfVFggICAgICAgICAgICAgICAgIDB4MjEKLQotLyogQVVYUEdBICovCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfSEVBRFNFVF9TUEtSX1NURVJFT19MQiAweDIyCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfSEVBRFNFVF9TUEtSX01PTk9fTEIgICAweDIzCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfU1BFQUtFUl9TUEtSX1NURVJFT19MQiAweDI0Ci0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfU1BFQUtFUl9TUEtSX01PTk9fTEIgICAweDI1Ci0KLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9OVUxMX1JYCQkweDJBCi0KLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9NQVhfTlVNICAgICAgICAgICAgICAgIDB4MkYKLQotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX0lOVkFMSUQgICAgICAgICAgICAgICAgMHhGRgotCi0jZGVmaW5lIENBRF9SWF9ERVZJQ0UgIDB4MDAKLSNkZWZpbmUgQ0FEX1RYX0RFVklDRSAgMHgwMQotCi1zdGF0aWMgc3RydWN0IHE2X2RldmljZV9pbmZvIHE2X2F1ZGlvX2RldmljZXNbXSA9IHsKLQl7Ci0JCS5pZAk9IEFEU1BfQVVESU9fREVWSUNFX0lEX0hBTkRTRVRfU1BLUiwKLQkJLmNhZF9pZAk9IENBRF9IV19ERVZJQ0VfSURfSEFORFNFVF9TUEtSLAotCQkucGF0aAk9IEFESUVfUEFUSF9IQU5EU0VUX1JYLAotCQkucmF0ZSAgID0gNDgwMDAsCi0JCS5kaXIJPSBRNl9SWCwKLQkJLmNvZGVjCT0gUTZfSUNPREVDX1JYLAotCQkuaHcJPSBRNl9IV19IQU5EU0VULAotCX0sCi0JewotCQkuaWQJPSBBRFNQX0FVRElPX0RFVklDRV9JRF9IRUFEU0VUX1NQS1JfTU9OTywKLQkJLmNhZF9pZAk9IENBRF9IV19ERVZJQ0VfSURfSEVBRFNFVF9TUEtSX01PTk8sCi0JCS5wYXRoCT0gQURJRV9QQVRIX0hFQURTRVRfTU9OT19SWCwKLQkJLnJhdGUgICA9IDQ4MDAwLAotCQkuZGlyCT0gUTZfUlgsCi0JCS5jb2RlYwk9IFE2X0lDT0RFQ19SWCwKLQkJLmh3CT0gUTZfSFdfSEVBRFNFVCwKLQl9LAotCXsKLQkJLmlkCT0gQURTUF9BVURJT19ERVZJQ0VfSURfSEVBRFNFVF9TUEtSX1NURVJFTywKLQkJLmNhZF9pZAk9IENBRF9IV19ERVZJQ0VfSURfSEVBRFNFVF9TUEtSX1NURVJFTywKLQkJLnBhdGgJPSBBRElFX1BBVEhfSEVBRFNFVF9TVEVSRU9fUlgsCi0JCS5yYXRlICAgPSA0ODAwMCwKLQkJLmRpcgk9IFE2X1JYLAotCQkuY29kZWMJPSBRNl9JQ09ERUNfUlgsCi0JCS5odwk9IFE2X0hXX0hFQURTRVQsCi0JfSwKLQl7Ci0JCS5pZAk9IEFEU1BfQVVESU9fREVWSUNFX0lEX1NQS1JfUEhPTkVfTU9OTywKLQkJLmNhZF9pZAk9IENBRF9IV19ERVZJQ0VfSURfU1BLUl9QSE9ORV9NT05PLAotCQkucGF0aAk9IEFESUVfUEFUSF9TUEVBS0VSX1JYLAotCQkucmF0ZSAgID0gNDgwMDAsCi0JCS5kaXIJPSBRNl9SWCwKLQkJLmNvZGVjCT0gUTZfSUNPREVDX1JYLAotCQkuaHcJPSBRNl9IV19IRUFEU0VULAotCX0sCi0JewotCQkuaWQJPSBBRFNQX0FVRElPX0RFVklDRV9JRF9TUEtSX1BIT05FX1NURVJFTywKLQkJLmNhZF9pZAk9IENBRF9IV19ERVZJQ0VfSURfU1BLUl9QSE9ORV9TVEVSRU8sCi0JCS5wYXRoCT0gQURJRV9QQVRIX1NQRUFLRVJfU1RFUkVPX1JYLAotCQkucmF0ZSAgID0gNDgwMDAsCi0JCS5kaXIJPSBRNl9SWCwKLQkJLmNvZGVjCT0gUTZfSUNPREVDX1JYLAotCQkuaHcJPSBRNl9IV19TUEVBS0VSLAotCX0sCi0JewotCQkuaWQJPSBBRFNQX0FVRElPX0RFVklDRV9JRF9TUEtSX1BIT05FX01PTk9fV19NT05PX0hFQURTRVQsCi0JCS5jYWRfaWQJPSBDQURfSFdfREVWSUNFX0lEX0hFQURTRVRfTU9OT19QTFVTX1NQS1JfTU9OT19SWCwKLQkJLnBhdGgJPSBBRElFX1BBVEhfU1BLUl9NT05PX0hEUEhfTU9OT19SWCwKLQkJLnJhdGUgICA9IDQ4MDAwLAotCQkuZGlyCT0gUTZfUlgsCi0JCS5jb2RlYwk9IFE2X0lDT0RFQ19SWCwKLQkJLmh3CT0gUTZfSFdfU1BFQUtFUiwKLQl9LAotCXsKLQkJLmlkCT0gQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9NT05PX1dfU1RFUkVPX0hFQURTRVQsCi0JCS5jYWRfaWQJPSBDQURfSFdfREVWSUNFX0lEX0hFQURTRVRfTU9OT19QTFVTX1NQS1JfU1RFUkVPX1JYLAotCQkucGF0aAk9IEFESUVfUEFUSF9TUEtSX01PTk9fSERQSF9TVEVSRU9fUlgsCi0JCS5yYXRlICAgPSA0ODAwMCwKLQkJLmRpcgk9IFE2X1JYLAotCQkuY29kZWMJPSBRNl9JQ09ERUNfUlgsCi0JCS5odwk9IFE2X0hXX1NQRUFLRVIsCi0JfSwKLQl7Ci0JCS5pZAk9IEFEU1BfQVVESU9fREVWSUNFX0lEX1NQS1JfUEhPTkVfU1RFUkVPX1dfTU9OT19IRUFEU0VULAotCQkuY2FkX2lkCT0gQ0FEX0hXX0RFVklDRV9JRF9IRUFEU0VUX1NURVJFT19QTFVTX1NQS1JfTU9OT19SWCwKLQkJLnBhdGgJPSBBRElFX1BBVEhfU1BLUl9TVEVSRU9fSERQSF9NT05PX1JYLAotCQkucmF0ZSAgID0gNDgwMDAsCi0JCS5kaXIJPSBRNl9SWCwKLQkJLmNvZGVjCT0gUTZfSUNPREVDX1JYLAotCQkuaHcJPSBRNl9IV19TUEVBS0VSLAotCX0sCi0JewotCQkuaWQgPSBBRFNQX0FVRElPX0RFVklDRV9JRF9TUEtSX1BIT05FX1NURVJFT19XX1NURVJFT19IRUFEU0VULAotCQkuY2FkX2lkCT0gQ0FEX0hXX0RFVklDRV9JRF9IRUFEU0VUX1NURVJFT19QTFVTX1NQS1JfU1RFUkVPX1JYLAotCQkucGF0aAk9IEFESUVfUEFUSF9TUEtSX1NURVJFT19IRFBIX1NURVJFT19SWCwKLQkJLnJhdGUgICA9IDQ4MDAwLAotCQkuZGlyCT0gUTZfUlgsCi0JCS5jb2RlYwk9IFE2X0lDT0RFQ19SWCwKLQkJLmh3CT0gUTZfSFdfU1BFQUtFUiwKLQl9LAotCXsKLQkJLmlkCT0gQURTUF9BVURJT19ERVZJQ0VfSURfVFRZX0hFQURTRVRfU1BLUiwKLQkJLmNhZF9pZAk9IENBRF9IV19ERVZJQ0VfSURfVFRZX0hFQURTRVRfU1BLUiwKLQkJLnBhdGgJPSBBRElFX1BBVEhfVFRZX0hFQURTRVRfUlgsCi0JCS5yYXRlICAgPSA0ODAwMCwKLQkJLmRpcgk9IFE2X1JYLAotCQkuY29kZWMJPSBRNl9JQ09ERUNfUlgsCi0JCS5odwk9IFE2X0hXX1RUWSwKLQl9LAotCXsKLQkJLmlkCT0gQURTUF9BVURJT19ERVZJQ0VfSURfSEFORFNFVF9NSUMsCi0JCS5jYWRfaWQJPSBDQURfSFdfREVWSUNFX0lEX0hBTkRTRVRfTUlDLAotCQkucGF0aAk9IEFESUVfUEFUSF9IQU5EU0VUX1RYLAotCQkucmF0ZSAgID0gODAwMCwKLQkJLmRpcgk9IFE2X1RYLAotCQkuY29kZWMJPSBRNl9JQ09ERUNfVFgsCi0JCS5odwk9IFE2X0hXX0hBTkRTRVQsCi0JfSwKLQl7Ci0JCS5pZAk9IEFEU1BfQVVESU9fREVWSUNFX0lEX0hFQURTRVRfTUlDLAotCQkuY2FkX2lkCT0gQ0FEX0hXX0RFVklDRV9JRF9IRUFEU0VUX01JQywKLQkJLnBhdGgJPSBBRElFX1BBVEhfSEVBRFNFVF9NT05PX1RYLAotCQkucmF0ZSAgID0gODAwMCwKLQkJLmRpcgk9IFE2X1RYLAotCQkuY29kZWMJPSBRNl9JQ09ERUNfVFgsCi0JCS5odwk9IFE2X0hXX0hFQURTRVQsCi0JfSwKLQl7Ci0JCS5pZAk9IEFEU1BfQVVESU9fREVWSUNFX0lEX1NQS1JfUEhPTkVfTUlDLAotCQkuY2FkX2lkCT0gQ0FEX0hXX0RFVklDRV9JRF9TUEtSX1BIT05FX01JQywKLQkJLnBhdGgJPSBBRElFX1BBVEhfU1BFQUtFUl9UWCwKLQkJLnJhdGUgICA9IDgwMDAsCi0JCS5kaXIJPSBRNl9UWCwKLQkJLmNvZGVjCT0gUTZfSUNPREVDX1RYLAotCQkuaHcJPSBRNl9IV19TUEVBS0VSLAotCX0sCi0JewotCQkuaWQJPSBBRFNQX0FVRElPX0RFVklDRV9JRF9UVFlfSEVBRFNFVF9NSUMsCi0JCS5jYWRfaWQJPSBDQURfSFdfREVWSUNFX0lEX1RUWV9IRUFEU0VUX01JQywKLQkJLnBhdGgJPSBBRElFX1BBVEhfVFRZX0hFQURTRVRfVFgsCi0JCS5yYXRlICAgPSA4MDAwLAotCQkuZGlyCT0gUTZfVFgsCi0JCS5jb2RlYwk9IFE2X0lDT0RFQ19UWCwKLQkJLmh3CT0gUTZfSFdfSEVBRFNFVCwKLQl9LAotCXsKLQkJLmlkCT0gQURTUF9BVURJT19ERVZJQ0VfSURfQlRfU0NPX1NQS1IsCi0JCS5jYWRfaWQJPSBDQURfSFdfREVWSUNFX0lEX0JUX1NDT19TUEtSLAotCQkucGF0aAk9IDAsIC8qIFhYWCAqLwotCQkucmF0ZSAgID0gODAwMCwKLQkJLmRpcgk9IFE2X1JYLAotCQkuY29kZWMJPSBRNl9FQ09ERUNfUlgsCi0JCS5odwk9IFE2X0hXX0JUX1NDTywKLQl9LAotCXsKLQkJLmlkCT0gQURTUF9BVURJT19ERVZJQ0VfSURfQlRfQTJEUF9TUEtSLAotCQkuY2FkX2lkCT0gQ0FEX0hXX0RFVklDRV9JRF9CVF9BMkRQX1NQS1IsCi0JCS5wYXRoCT0gMCwgLyogWFhYICovCi0JCS5yYXRlICAgPSA0ODAwMCwKLQkJLmRpcgk9IFE2X1JYLAotCQkuY29kZWMJPSBRNl9FQ09ERUNfUlgsCi0JCS5odwk9IFE2X0hXX0JUX0EyRFAsCi0JfSwKLQl7Ci0JCS5pZAk9IEFEU1BfQVVESU9fREVWSUNFX0lEX0JUX1NDT19NSUMsCi0JCS5jYWRfaWQJPSBDQURfSFdfREVWSUNFX0lEX0JUX1NDT19NSUMsCi0JCS5wYXRoCT0gMCwgLyogWFhYICovCi0JCS5yYXRlICAgPSA4MDAwLAotCQkuZGlyCT0gUTZfVFgsCi0JCS5jb2RlYwk9IFE2X0VDT0RFQ19UWCwKLQkJLmh3CT0gUTZfSFdfQlRfU0NPLAotCX0sCi0JewotCQkuaWQJPSBBRFNQX0FVRElPX0RFVklDRV9JRF9JMlNfU1BLUiwKLQkJLmNhZF9pZAk9IENBRF9IV19ERVZJQ0VfSURfSTJTX1JYLAotCQkucGF0aAk9IDAsIC8qIFhYWCAqLwotCQkucmF0ZSAgID0gNDgwMDAsCi0JCS5kaXIJPSBRNl9SWCwKLQkJLmNvZGVjCT0gUTZfU0RBQ19SWCwKLQkJLmh3CT0gUTZfSFdfU1BFQUtFUiwKLQl9LAotCXsKLQkJLmlkCT0gQURTUF9BVURJT19ERVZJQ0VfSURfSTJTX01JQywKLQkJLmNhZF9pZAk9IENBRF9IV19ERVZJQ0VfSURfSTJTX1RYLAotCQkucGF0aAk9IDAsIC8qIFhYWCAqLwotCQkucmF0ZSAgID0gMTYwMDAsCi0JCS5kaXIJPSBRNl9UWCwKLQkJLmNvZGVjCT0gUTZfU0RBQ19UWCwKLQkJLmh3CT0gUTZfSFdfU1BFQUtFUiwKLQl9LAotCXsKLQkJLmlkCT0gMCwKLQkJLmNhZF9pZAk9IDAsCi0JCS5wYXRoCT0gMCwKLQkJLnJhdGUgICA9IDgwMDAsCi0JCS5kaXIJPSAwLAotCQkuY29kZWMJPSBRNl9DT0RFQ19OT05FLAotCQkuaHcJPSAwLAotCX0sCi19OwotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL3FjZWxwX2luLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL3FjZWxwX2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYWUzN2QuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9xY2VscF9pbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgSFRDIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIEF1dGhvcjogQnJpYW4gU3dldGxhbmQgPHN3ZXRsYW5kQGdvb2dsZS5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX3FjcC5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX3Fkc3A2X2F1ZGlvdjIuaD4KLSNpbmNsdWRlICJkYWxfYXVkaW8uaCIKLSNpbmNsdWRlICJkYWxfYXVkaW9fZm9ybWF0LmgiCi0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi0KLXN0cnVjdCBxY2VscCB7Ci0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnIGNmZzsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgc3RyX2NmZzsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphdWRpb19jbGllbnQ7Ci19OwotCi0KLXN0YXRpYyBsb25nIHE2X3FjZWxwX2luX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCSB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcWNlbHAgKnFjZWxwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhZHNwX29wZW5fY29tbWFuZCBycGM7Ci0JaW50IHJjID0gMDsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX1NUQVRTKSB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdGF0cykpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZxY2VscC0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCQlpZiAocWNlbHAtPmF1ZGlvX2NsaWVudCkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCXFjZWxwLT5hdWRpb19jbGllbnQgPSBxNmF1ZGlvX29wZW4oQVVESU9fRkxBR19SRUFELAotCQkJCQkJcWNlbHAtPnN0cl9jZmcuYnVmZmVyX3NpemUpOwotCi0JCQlpZiAoIXFjZWxwLT5hdWRpb19jbGllbnQpIHsKLQkJCQlrZnJlZShxY2VscCk7Ci0JCQkJcmMgPSAtRU5PTUVNOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJdHhfY2xrX2ZyZXEgPSA4MDAwOwotCi0JCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0KLQkJcnBjLmZvcm1hdF9ibG9jay5zdGFuZGFyZC5mb3JtYXQgPSBBRFNQX0FVRElPX0ZPUk1BVF9WMTNLX0ZTOwotCQlycGMuZm9ybWF0X2Jsb2NrLnN0YW5kYXJkLmNoYW5uZWxzID0gMTsKLQkJcnBjLmZvcm1hdF9ibG9jay5zdGFuZGFyZC5iaXRzX3Blcl9zYW1wbGUgPSAxNjsKLQkJcnBjLmZvcm1hdF9ibG9jay5zdGFuZGFyZC5zYW1wbGluZ19yYXRlID0gODAwMDsKLQkJcnBjLmZvcm1hdF9ibG9jay5zdGFuZGFyZC5pc19zaWduZWQgPSAxOwotCQlycGMuZm9ybWF0X2Jsb2NrLnN0YW5kYXJkLmlzX2ludGVybGVhdmVkID0gMDsKLQkJcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9PUEVOX1JFQUQ7Ci0JCXJwYy5kZXZpY2UgPSBBRFNQX0FVRElPX0RFVklDRV9JRF9ERUZBVUxUOwotCQlycGMuc3RyZWFtX2NvbnRleHQgPSBBRFNQX0FVRElPX0RFVklDRV9DT05URVhUX1JFQ09SRDsKLQkJcnBjLmJ1Zl9tYXhfc2l6ZSA9IHFjZWxwLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplOwotCQlycGMuY29uZmlnLnFjZWxwMTNrLm1pbl9yYXRlID0gcWNlbHAtPmNmZy5taW5fYml0X3JhdGU7Ci0JCXJwYy5jb25maWcucWNlbHAxM2subWF4X3JhdGUgPSBxY2VscC0+Y2ZnLm1heF9iaXRfcmF0ZTsKLQotCQlxNmF1ZGlvX3N0YXJ0KHFjZWxwLT5hdWRpb19jbGllbnQsICZycGMsIHNpemVvZihycGMpKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TVE9QOgotCQlicmVhazsKLQljYXNlIEFVRElPX0ZMVVNIOgotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9WT0xVTUU6Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fR0VUX1NUUkVBTV9DT05GSUc6Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZxY2VscC0+c3RyX2NmZywKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX1NUUkVBTV9DT05GSUc6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmcWNlbHAtPnN0cl9jZmcsICh2b2lkICopYXJnLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChxY2VscC0+c3RyX2NmZy5idWZmZXJfc2l6ZSA8IDM1KSB7Ci0JCQlwcl9lcnIoIlslczolc10gQnVmZmVyIHNpemUgdG9vIHNtYWxsXG4iLCBfX01NX0ZJTEVfXywKLQkJCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAocWNlbHAtPnN0cl9jZmcuYnVmZmVyX2NvdW50ICE9IDIpCi0JCQlwcl9pbmZvKCJbJXM6JXNdIEJ1ZmZlciBjb3VudCBzZXQgdG8gMlxuIiwgX19NTV9GSUxFX18sCi0JCQkJCV9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfUUNFTFBfRU5DX0NPTkZJRzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZxY2VscC0+Y2ZnLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fcWNlbHBfZW5jX2NvbmZpZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCi0JCWlmIChxY2VscC0+Y2ZnLm1pbl9iaXRfcmF0ZSA+IDQgfHwKLQkJCSBxY2VscC0+Y2ZnLm1pbl9iaXRfcmF0ZSA8IDEpIHsKLQotCQkJcHJfZXJyKCJbJXM6JXNdIGludmFsaWQgbWluIGJpdHJhdGVcbiIsIF9fTU1fRklMRV9fLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCX0KLQkJaWYgKHFjZWxwLT5jZmcubWF4X2JpdF9yYXRlID4gNCB8fAotCQkJIHFjZWxwLT5jZmcubWF4X2JpdF9yYXRlIDwgMSkgewotCi0JCQlwcl9lcnIoIlslczolc10gaW52YWxpZCBtYXggYml0cmF0ZVxuIiwgX19NTV9GSUxFX18sCi0JCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJfQotCi0JCWJyZWFrOwotCWNhc2UgQVVESU9fR0VUX1FDRUxQX0VOQ19DT05GSUc6Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmcWNlbHAtPmNmZywKLQkJCSBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQotCW11dGV4X3VubG9jaygmcWNlbHAtPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBxNl9xY2VscF9pbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBxY2VscCAqcWNlbHA7Ci0JcWNlbHAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcWNlbHApLCBHRlBfS0VSTkVMKTsKLQlpZiAocWNlbHAgPT0gTlVMTCkgewotCQlwcl9lcnIoIlslczolc10gQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcWNlbHAgZHJpdmVyXG4iLAotCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW11dGV4X2luaXQoJnFjZWxwLT5sb2NrKTsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBxY2VscDsKLQlxY2VscC0+YXVkaW9fY2xpZW50ID0gTlVMTDsKLQlxY2VscC0+c3RyX2NmZy5idWZmZXJfc2l6ZSA9IDM1OwotCXFjZWxwLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCA9IDI7Ci0JcWNlbHAtPmNmZy5jZG1hX3JhdGUgPSBDRE1BX1JBVEVfRlVMTDsKLQlxY2VscC0+Y2ZnLm1pbl9iaXRfcmF0ZSA9IDE7Ci0JcWNlbHAtPmNmZy5tYXhfYml0X3JhdGUgPSA0OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBxNl9xY2VscF9pbl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYzsKLQlzdHJ1Y3QgYXVkaW9fYnVmZmVyICphYjsKLQljb25zdCBjaGFyIF9fdXNlciAqc3RhcnQgPSBidWY7Ci0Jc3RydWN0IHFjZWxwICpxY2VscCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgeGZlciA9IDA7Ci0JaW50IHJlczsKLQotCW11dGV4X2xvY2soJnFjZWxwLT5sb2NrKTsKLQlhYyA9IHFjZWxwLT5hdWRpb19jbGllbnQ7Ci0JaWYgKCFhYykgewotCQlyZXMgPSAtRU5PREVWOwotCQlnb3RvIGZhaWw7Ci0JfQotCXdoaWxlIChjb3VudCA+IHhmZXIpIHsKLQkJYWIgPSBhYy0+YnVmICsgYWMtPmNwdV9idWY7Ci0KLQkJaWYgKGFiLT51c2VkKQotCQkJd2FpdF9ldmVudChhYy0+d2FpdCwgKGFiLT51c2VkID09IDApKTsKLQotCQl4ZmVyID0gYWItPmFjdHVhbF9zaXplOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBhYi0+ZGF0YSwgeGZlcikpIHsKLQkJCXJlcyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQlidWYgKz0geGZlcjsKLQkJY291bnQgLT0geGZlcjsKLQotCQlhYi0+dXNlZCA9IDE7Ci0JCXE2YXVkaW9fcmVhZChhYywgYWIpOwotCQlhYy0+Y3B1X2J1ZiBePSAxOwotCX0KLQotCXJlcyA9IGJ1ZiAtIHN0YXJ0OwotCi1mYWlsOgotCW11dGV4X3VubG9jaygmcWNlbHAtPmxvY2spOwotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCBxNl9xY2VscF9pbl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHFjZWxwICpxY2VscCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJnFjZWxwLT5sb2NrKTsKLQlpZiAocWNlbHAtPmF1ZGlvX2NsaWVudCkKLQkJcmMgPSBxNmF1ZGlvX2Nsb3NlKHFjZWxwLT5hdWRpb19jbGllbnQpOwotCW11dGV4X3VubG9jaygmcWNlbHAtPmxvY2spOwotCWtmcmVlKHFjZWxwKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHE2X3FjZWxwX2luX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IHE2X3FjZWxwX2luX29wZW4sCi0JLnJlYWQJCT0gcTZfcWNlbHBfaW5fcmVhZCwKLQkucmVsZWFzZQk9IHE2X3FjZWxwX2luX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0gcTZfcWNlbHBfaW5faW9jdGwsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBxNl9xY2VscF9pbl9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fcWNlbHBfaW4iLAotCS5mb3BzCT0gJnE2X3FjZWxwX2luX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBxNl9xY2VscF9pbl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJnE2X3FjZWxwX2luX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwocTZfcWNlbHBfaW5faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL3JvdXRpbmcuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvcm91dGluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmExMjhjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvcm91dGluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyogYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXVkaW92Mi9yb3V0aW5nLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIEF1dGhvcjogQnJpYW4gU3dldGxhbmQgPHN3ZXRsYW5kQGdvb2dsZS5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9xZHNwNl9hdWRpb3YyLmg+Ci0KLXN0YXRpYyBpbnQgcTZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgcTZfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCWNoYXIgY21kWzMyXTsKLQotCWlmIChjb3VudCA+PSBzaXplb2YoY21kKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGNtZCwgYnVmLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCWNtZFtjb3VudF0gPSAwOwotCi0JaWYgKChjb3VudCA+IDEpICYmIChjbWRbY291bnQtMV0gPT0gJ1xuJykpCi0JCWNtZFtjb3VudC0xXSA9IDA7Ci0KLQlxNmF1ZGlvX3NldF9yb3V0ZShjbWQpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50IHE2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHE2X2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IHE2X29wZW4sCi0JLndyaXRlCQk9IHE2X3dyaXRlLAotCS5yZWxlYXNlCT0gcTZfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBxNl9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fYXVkaW9fcm91dGUiLAotCS5mb3BzCT0gJnE2X2ZvcHMsCi19OwotCi0KLXN0YXRpYyBpbnQgX19pbml0IHE2X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmcTZfbWlzYyk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChxNl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvdm9pY2UuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1ZGlvdjIvdm9pY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiMmJhZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdWRpb3YyL3ZvaWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9xZHNwNl9hdWRpb3YyLmg+Ci0jaW5jbHVkZSAiLi4vZGFsLmgiCi0jaW5jbHVkZSAiZGFsX3ZvaWNlLmgiCi0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi1zdHJ1Y3Qgdm9pY2Vfc3RydWN0IHsKLQlzdHJ1Y3QgZGFsX2NsaWVudCAqY3ZkOwotCXN0cnVjdCBhcHJfY29tbWFuZF9wa3QgYXByX3BrdDsKLQlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgdm9pY2Vfc3RydWN0IHZvaWNlOwotCi1zdGF0aWMgaW50IGN2ZF9zZW5kX3Jlc3BvbnNlKHZvaWQpCi17Ci0Jc3RydWN0IGFwcl9jb21tYW5kX3BrdCAqcGt0OwotCXVpbnQxNl90IHNyY19hZGRyOwotCXVpbnQxNl90IHNyY190b2tlbjsKLQl1aW50MTZfdCBkc3RfdG9rZW47Ci0JdWludDE2X3QgZHN0X2FkZHI7Ci0KLQlwa3QgPSAmdm9pY2UuYXByX3BrdDsKLQlzcmNfYWRkciA9IHBrdC0+ZHN0X2FkZHI7Ci0JZHN0X2FkZHIgPSBwa3QtPnNyY19hZGRyOwotCXNyY190b2tlbiA9IHBrdC0+ZHN0X3Rva2VuOwotCWRzdF90b2tlbiA9IHBrdC0+c3JjX3Rva2VuOwotCi0JcGt0LT5oZWFkZXIgJj0gfkFQUl9QS1RWMV9UWVBFX01BU0s7Ci0JcGt0LT5oZWFkZXIgfD0gQVBSX1NFVF9GSUVMRChBUFJfUEtUVjFfVFlQRSwgQVBSX1BLVFYxX1RZUEVfRVZFTlRfVik7Ci0JcGt0LT5zcmNfYWRkciA9IHNyY19hZGRyOwotCXBrdC0+ZHN0X2FkZHIgPSBkc3RfYWRkcjsKLQlwa3QtPnNyY190b2tlbiA9IHNyY190b2tlbjsKLQlwa3QtPmRzdF90b2tlbiA9IGRzdF90b2tlbjsKLQlwa3QtPm9wY29kZSA9IEFQUl9JQkFTSUNfUlNQX1JFU1VMVDsKLQotCWRhbF9jYWxsKHZvaWNlLmN2ZCwgVk9JQ0VfT1BfQ09OVFJPTCwgNSwgcGt0LAotCQkJc2l6ZW9mKHN0cnVjdCBhcHJfY29tbWFuZF9wa3QpLAotCQkJcGt0LCBzaXplb2YodTMyKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY3ZkX3Byb2Nlc3Nfdm9pY2Vfc2V0dXAodm9pZCkKLXsKLQlxNnZvaWNlX3NldHVwKCk7Ci0JY3ZkX3NlbmRfcmVzcG9uc2UoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjdmRfcHJvY2Vzc192b2ljZV90ZWFyZG93bih2b2lkKQotewotCXE2dm9pY2VfdGVhcmRvd24oKTsKLQljdmRfc2VuZF9yZXNwb25zZSgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGN2ZF9wcm9jZXNzX3NldF9uZXR3b3JrKHZvaWQpCi17Ci0JY3ZkX3NlbmRfcmVzcG9uc2UoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2b2ljZV90aHJlYWQodm9pZCAqZGF0YSkKLXsKLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ2b2ljZS5jb21wbCk7Ci0JCWluaXRfY29tcGxldGlvbigmdm9pY2UuY29tcGwpOwotCi0JCXN3aXRjaCAodm9pY2UuYXByX3BrdC5vcGNvZGUpIHsKLQotCQljYXNlIEFQUl9PUF9DTURfQ1JFQVRFOgotCQkJY3ZkX3NlbmRfcmVzcG9uc2UoKTsKLQkJCWJyZWFrOwotCQljYXNlIFZPSUNFX09QX0NNRF9CUklOR1VQOgotCQkJY3ZkX3Byb2Nlc3Nfdm9pY2Vfc2V0dXAoKTsKLQkJCWJyZWFrOwotCQljYXNlIEFQUl9PUF9DTURfREVTVFJPWToKLQkJCWN2ZF9zZW5kX3Jlc3BvbnNlKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBWT0lDRV9PUF9DTURfVEVBUkRPV046Ci0JCQljdmRfcHJvY2Vzc192b2ljZV90ZWFyZG93bigpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVk9JQ0VfT1BfQ01EX1NFVF9ORVRXT1JLOgotCQkJY3ZkX3Byb2Nlc3Nfc2V0X25ldHdvcmsoKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCJbJXM6JXNdIFVuZGVmaW5lZCBldmVudFxuIiwgX19NTV9GSUxFX18sCi0JCQkJCV9fZnVuY19fKTsKLQotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCByZW1vdGVfY2JfZnVuY3Rpb24odm9pZCAqZGF0YSwgaW50IGxlbiwgdm9pZCAqY29va2llKQotewotCXN0cnVjdCBhcHJfY29tbWFuZF9wa3QgKmFwciA9IGRhdGEgKyAyKnNpemVvZih1aW50MzJfdCk7Ci0KLQltZW1jcHkoJnZvaWNlLmFwcl9wa3QsIGFwciwgc2l6ZW9mKHN0cnVjdCBhcHJfY29tbWFuZF9wa3QpKTsKLQotCWlmIChsZW4gPD0gMCkgewotCQlwcl9lcnIoIlslczolc10gdW5leHBlY3RlZCBldmVudCB3aXRoIGxlbmd0aCAlZFxuIiwKLQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18sIGxlbik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXSBBUFIgPSAleCwleCwleCwleCwleCwleCwleCwleCwleCwleFxuIiwgX19NTV9GSUxFX18sCi0JCQlfX2Z1bmNfXywKLQlhcHItPmhlYWRlciwKLQlhcHItPnJlc2VydmVkMSwKLQlhcHItPnNyY19hZGRyLAotCWFwci0+ZHN0X2FkZHIsCi0JYXByLT5yZXRfYWRkciwKLQlhcHItPnNyY190b2tlbiwKLQlhcHItPmRzdF90b2tlbiwKLQlhcHItPnJldF90b2tlbiwKLQlhcHItPmNvbnRleHQsCi0JYXByLT5vcGNvZGUpOwotCi0JY29tcGxldGUoJnZvaWNlLmNvbXBsKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgdm9pY2VfaW5pdCh2b2lkKQotewotCWludCByZXMgPSAwOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQl1MzIgdG1wWzJdOwotCi0JdG1wWzBdID0gc2l6ZW9mKHUzMik7Ci0JdG1wWzFdID0gMDsKLQotCXZvaWNlLmN2ZCA9IGRhbF9hdHRhY2goVk9JQ0VfREFMX0RFVklDRSwgVk9JQ0VfREFMX1BPUlQsIDAsCi0JCQlyZW1vdGVfY2JfZnVuY3Rpb24sIDApOwotCi0JaWYgKCF2b2ljZS5jdmQpIHsKLQkJcHJfZXJyKCJbJXM6JXNdIGF1ZGlvX2luaXQ6IGNhbm5vdCBhdHRhY2ggdG8gY3ZkXG4iLAotCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCXJlcyA9IC1FTk9ERVY7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY2hlY2tfdmVyc2lvbih2b2ljZS5jdmQsIFZPSUNFX0RBTF9WRVJTSU9OKSAhPSAwKSB7Ci0JCXByX2VycigiWyVzOiVzXSBJbmNvbXBhdGlibGUgY3ZkIHZlcnNpb25cbiIsCi0JCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJcmVzID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQlkYWxfY2FsbCh2b2ljZS5jdmQsIFZPSUNFX09QX0lOSVQsIDUsIHRtcCwgc2l6ZW9mKHRtcCksCi0JCXRtcCwgc2l6ZW9mKHUzMikpOwotCi0JaW5pdF9jb21wbGV0aW9uKCZ2b2ljZS5jb21wbCk7Ci0JdGFzayA9IGt0aHJlYWRfcnVuKHZvaWNlX3RocmVhZCwgJnZvaWNlLCAidm9pY2VfdGhyZWFkIik7Ci0KLQlpZiAoSVNfRVJSKHRhc2spKSB7Ci0JCXByX2VycigiWyVzOiVzXSBDYW5ub3Qgc3RhcnQgdGhlIHZvaWNlIHRocmVhZFxuIiwgX19NTV9GSUxFX18sCi0JCQkJX19mdW5jX18pOwotCQlyZXMgPSBQVFJfRVJSKHRhc2spOwotCQl0YXNrID0gTlVMTDsKLQl9IGVsc2UKLQkJZ290byBkb25lOwotCi1kb25lOgotCXJldHVybiByZXM7Ci19Ci0KLWxhdGVfaW5pdGNhbGwodm9pY2VfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdXhwY21fbGJfaW4uYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1eHBjbV9sYl9pbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjI1NGE2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1eHBjbV9sYl9pbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1eHBjbV9sYl9pbi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA5IEhUQyBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21zbV9xZHNwNl9hdWRpby5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLQotc3RydWN0IGF1eHBjbSB7Ci0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0JdWludDMyX3Qgc2FtcGxlX3JhdGU7Ci0JdWludDMyX3QgY2hhbm5lbF9jb3VudDsKLQlpbnQgb3BlbmVkOzsKLX07Ci0KLXN0YXRpYyBsb25nIGF1eHBjbWluX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYXV4cGNtICphdXhwY21pbiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JbXV0ZXhfbG9jaygmYXV4cGNtaW4tPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQl1aW50MzJfdCBhY2RiX2lkOwotCQlwcl9kZWJ1ZygiWyVzOiVzXSBBVURJT19TVEFSVFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJaWYgKGFyZyA9PSAwKSB7Ci0JCQlhY2RiX2lkID0gMDsKLQkJfSBlbHNlIGlmIChjb3B5X2Zyb21fdXNlcigmYWNkYl9pZCwgKHZvaWQgKikgYXJnLAotCQkJCQlzaXplb2YoYWNkYl9pZCkpKSB7Ci0JCQlwcl9pbmZvKCJbJXM6JXNdIGNvcHkgYWNkYl9pZCBmcm9tIHVzZXIgZmFpbGVkXG4iLAotCQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGF1eHBjbWluLT5hYykgewotCQkJcHJfZXJyKCJbJXM6JXNdIGFjdGl2ZSBzZXNzaW9uIGFscmVhZHkgZXhpc3RpbmdcbiIsCi0JCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCXJjID0gLUVCVVNZOwotCQl9IGVsc2UgewotCQkJYXV4cGNtaW4tPmFjID0KLQkJCQlxNmF1ZGlvX29wZW5fYXV4cGNtKGF1eHBjbWluLT5zYW1wbGVfcmF0ZSwKLQkJCQkJCWF1eHBjbWluLT5jaGFubmVsX2NvdW50LAotCQkJCQkJQVVESU9fRkxBR19SRUFELCBhY2RiX2lkKTsKLQkJCWlmICghYXV4cGNtaW4tPmFjKSB7Ci0JCQkJcHJfZXJyKCJbJXM6JXNdIGF1eHBjbSBvcGVuIHNlc3Npb24gZmFpbGVkXG4iLAotCQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQkJCXJjID0gLUVOT01FTTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TVE9QOgotCQlwcl9kZWJ1ZygiWyVzOiVzXSBBVURJT19TVE9QXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIEFVRElPX0ZMVVNIOgotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQlpZiAoYXV4cGNtaW4tPmFjKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCXByX2VycigiWyVzOiVzXSBhY3RpdmUgc2Vzc2lvbiBhbHJlYWR5IGV4aXN0aW5nXG4iLAotCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbmZpZywgKHZvaWQgKikgYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXByX2RlYnVnKCJbJXM6JXNdIFNFVF9DT05GSUc6IHNhbXBsZXJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZFxuIiwKLQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXywgY29uZmlnLnNhbXBsZV9yYXRlLAotCQkJY29uZmlnLmNoYW5uZWxfY291bnQpOwotCQlpZiAoY29uZmlnLmNoYW5uZWxfY291bnQgIT0gMSkgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJcHJfZXJyKCJbJXM6JXNdIGludmFsaWQgY2hhbm5lbGNvdW50ICVkXG4iLAotCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXywgY29uZmlnLmNoYW5uZWxfY291bnQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvbmZpZy5zYW1wbGVfcmF0ZSAhPSA4MDAwKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlwcl9lcnIoIlslczolc10gaW52YWxpZCBzYW1wbGVyYXRlICVkXG4iLCBfX01NX0ZJTEVfXywKLQkJCQlfX2Z1bmNfXywgY29uZmlnLnNhbXBsZV9yYXRlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWF1eHBjbWluLT5zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLQkJYXV4cGNtaW4tPmNoYW5uZWxfY291bnQgPSBjb25maWcuY2hhbm5lbF9jb3VudDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjb25maWc7Ci0JCWNvbmZpZy5idWZmZXJfc2l6ZSA9IDA7Ci0JCWNvbmZpZy5idWZmZXJfY291bnQgPSAwOwotCQljb25maWcuc2FtcGxlX3JhdGUgPSBhdXhwY21pbi0+c2FtcGxlX3JhdGU7Ci0JCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gYXV4cGNtaW4tPmNoYW5uZWxfY291bnQ7Ci0JCWNvbmZpZy51bnVzZWRbMF0gPSAwOwotCQljb25maWcudW51c2VkWzFdID0gMDsKLQkJY29uZmlnLnVudXNlZFsyXSA9IDA7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmY29uZmlnLCBzaXplb2YoY29uZmlnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCXByX2RlYnVnKCJbJXM6JXNdIEdFVF9DT05GSUc6IHNhbXBsZXJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZFxuIiwKLQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXywgY29uZmlnLnNhbXBsZV9yYXRlLAotCQkJY29uZmlnLmNoYW5uZWxfY291bnQpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJmF1eHBjbWluLT5sb2NrKTsKLQlwcl9kZWJ1ZygiWyVzOiVzXSByYyA9ICVkXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYXV4cGNtIHRoZV9hdXhwY21pbjsKLQotc3RhdGljIGludCBhdXhwY21pbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdXhwY20gKmF1eHBjbWluID0gJnRoZV9hdXhwY21pbjsKLQotCXByX2luZm8oIlslczolc10gb3BlblxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQltdXRleF9sb2NrKCZhdXhwY21pbi0+bG9jayk7Ci0JaWYgKGF1eHBjbWluLT5vcGVuZWQpIHsKLQkJcHJfZXJyKCJhdXggcGNtIGxvb3BiYWNrIHR4IGFscmVhZHkgb3BlbiFcbiIpOwotCQltdXRleF91bmxvY2soJmF1eHBjbWluLT5sb2NrKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JYXV4cGNtaW4tPmNoYW5uZWxfY291bnQgPSAxOwotCWF1eHBjbWluLT5zYW1wbGVfcmF0ZSA9IDgwMDA7Ci0JYXV4cGNtaW4tPm9wZW5lZCA9IDE7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXV4cGNtaW47Ci0JbXV0ZXhfdW5sb2NrKCZhdXhwY21pbi0+bG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXV4cGNtaW5fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXV4cGNtICphdXhwY21pbiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQltdXRleF9sb2NrKCZhdXhwY21pbi0+bG9jayk7Ci0JaWYgKGF1eHBjbWluLT5hYykKLQkJcTZhdWRpb19hdXhwY21fY2xvc2UoYXV4cGNtaW4tPmFjKTsKLQlhdXhwY21pbi0+YWMgPSBOVUxMOwotCWF1eHBjbWluLT5vcGVuZWQgPSAwOwotCW11dGV4X3VubG9jaygmYXV4cGNtaW4tPmxvY2spOwotCXByX2luZm8oIlslczolc10gcmVsZWFzZVxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXV4cGNtaW5fZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gYXV4cGNtaW5fb3BlbiwKLQkucmVsZWFzZQk9IGF1eHBjbWluX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0gYXV4cGNtaW5faW9jdGwsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdXhwY21pbl9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fYXV4X3BjbV9sYl9pbiIsCi0JLmZvcHMJPSAmYXV4cGNtaW5fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1eHBjbWluX2luaXQodm9pZCkKLXsKLQltdXRleF9pbml0KCZ0aGVfYXV4cGNtaW4ubG9jayk7Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1eHBjbWluX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoYXV4cGNtaW5faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdXhwY21fbGJfb3V0LmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9hdXhwY21fbGJfb3V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYTZiOTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvYXV4cGNtX2xiX291dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2F1eHBjbV9sYl9vdXQuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUsIEluYy4KLSAqIEF1dGhvcjogQnJpYW4gU3dldGxhbmQgPHN3ZXRsYW5kQGdvb2dsZS5jb20+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotCi0jaW5jbHVkZSA8bWFjaC9tc21fcWRzcDZfYXVkaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLXN0cnVjdCBhdXhwY20gewotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCXVpbnQzMl90IHNhbXBsZV9yYXRlOwotCXVpbnQzMl90IGNoYW5uZWxfY291bnQ7Ci0JaW50IG9wZW5lZDs7Ci19OwotCi1zdGF0aWMgbG9uZyBhdXhwY21vdXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGF1eHBjbSAqYXV4cGNtb3V0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQltdXRleF9sb2NrKCZhdXhwY21vdXQtPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQl1aW50MzJfdCBhY2RiX2lkOwotCQlwcl9kZWJ1ZygiWyVzOiVzXSBBVURJT19TVEFSVFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJaWYgKGFyZyA9PSAwKSB7Ci0JCQlhY2RiX2lkID0gMDsKLQkJfSBlbHNlIGlmIChjb3B5X2Zyb21fdXNlcigmYWNkYl9pZCwgKHZvaWQgKikgYXJnLAotCQkJCQlzaXplb2YoYWNkYl9pZCkpKSB7Ci0JCQlwcl9pbmZvKCJbJXM6JXNdIGNvcHkgYWNkYl9pZCBmcm9tIHVzZXIgZmFpbGVkXG4iLAotCQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGF1eHBjbW91dC0+YWMpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJcHJfZXJyKCJbJXM6JXNdIGFjdGl2ZSBzZXNzaW9uIGFscmVhZHkgZXhpc3RpbmdcbiIsCi0JCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJfSBlbHNlIHsKLQkJCWF1eHBjbW91dC0+YWMgPQotCQkJCXE2YXVkaW9fb3Blbl9hdXhwY20oYXV4cGNtb3V0LT5zYW1wbGVfcmF0ZSwKLQkJCQkJCWF1eHBjbW91dC0+Y2hhbm5lbF9jb3VudCwKLQkJCQkJCUFVRElPX0ZMQUdfV1JJVEUsIGFjZGJfaWQpOwotCQkJaWYgKCFhdXhwY21vdXQtPmFjKSB7Ci0JCQkJcHJfZXJyKCJbJXM6JXNdIGF1eHBjbSBvcGVuIHNlc3Npb24gZmFpbGVkXG4iLAotCQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQkJCXJjID0gLUVOT01FTTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TVE9QOgotCQlwcl9kZWJ1ZygiWyVzOiVzXSBBVURJT19TVE9QXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIEFVRElPX0ZMVVNIOgotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQlpZiAoYXV4cGNtb3V0LT5hYykgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlwcl9lcnIoIlslczolc10gYWN0aXZlIHNlc3Npb24gYWxyZWFkeSBleGlzdGluZ1xuIiwKLQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb25maWcsICh2b2lkICopIGFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlwcl9kZWJ1ZygiWyVzOiVzXSBTRVRfQ09ORklHOiBzYW1wbGVyYXRlID0gJWQsIGNoYW5uZWxzID0gJWRcbiIsCi0JCQlfX01NX0ZJTEVfXywgX19mdW5jX18sIGNvbmZpZy5zYW1wbGVfcmF0ZSwKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50KTsKLQkJaWYgKGNvbmZpZy5jaGFubmVsX2NvdW50ICE9IDEpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCXByX2VycigiWyVzOiVzXSBpbnZhbGlkIGNoYW5uZWxjb3VudCAlZFxuIiwKLQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXywgY29uZmlnLmNoYW5uZWxfY291bnQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvbmZpZy5zYW1wbGVfcmF0ZSAhPSA4MDAwKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlwcl9lcnIoIlslczolc10gaW52YWxpZCBzYW1wbGVyYXRlICVkXG4iLCBfX01NX0ZJTEVfXywKLQkJCQlfX2Z1bmNfXywgY29uZmlnLnNhbXBsZV9yYXRlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWF1eHBjbW91dC0+c2FtcGxlX3JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0JCWF1eHBjbW91dC0+Y2hhbm5lbF9jb3VudCA9IGNvbmZpZy5jaGFubmVsX2NvdW50OwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gMDsKLQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IDA7Ci0JCWNvbmZpZy5zYW1wbGVfcmF0ZSA9IGF1eHBjbW91dC0+c2FtcGxlX3JhdGU7Ci0JCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gYXV4cGNtb3V0LT5jaGFubmVsX2NvdW50OwotCQljb25maWcudW51c2VkWzBdID0gMDsKLQkJY29uZmlnLnVudXNlZFsxXSA9IDA7Ci0JCWNvbmZpZy51bnVzZWRbMl0gPSAwOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlwcl9kZWJ1ZygiWyVzOiVzXSBHRVRfQ09ORklHOiBzYW1wbGVyYXRlID0gJWQsIGNoYW5uZWxzPSAlZFxuIiwKLQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXywgY29uZmlnLnNhbXBsZV9yYXRlLAotCQkJY29uZmlnLmNoYW5uZWxfY291bnQpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJmF1eHBjbW91dC0+bG9jayk7Ci0JcHJfZGVidWcoIlslczolc10gcmMgPSAlZFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3RydWN0IGF1eHBjbSB0aGVfYXV4cGNtb3V0OwotCi1zdGF0aWMgaW50IGF1eHBjbW91dF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBhdXhwY20gKmF1eHBjbW91dCA9ICZ0aGVfYXV4cGNtb3V0OwotCi0JcHJfaW5mbygiWyVzOiVzXSBvcGVuXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCi0JbXV0ZXhfbG9jaygmYXV4cGNtb3V0LT5sb2NrKTsKLQotCWlmIChhdXhwY21vdXQtPm9wZW5lZCkgewotCQlwcl9lcnIoImF1eCBwY20gbG9vcGJhY2sgcnggYWxyZWFkeSBvcGVuIVxuIik7Ci0JCW11dGV4X3VubG9jaygmYXV4cGNtb3V0LT5sb2NrKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JYXV4cGNtb3V0LT5jaGFubmVsX2NvdW50ID0gMTsKLQlhdXhwY21vdXQtPnNhbXBsZV9yYXRlID0gODAwMDsKLQlhdXhwY21vdXQtPm9wZW5lZCA9IDE7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXV4cGNtb3V0OwotCW11dGV4X3VubG9jaygmYXV4cGNtb3V0LT5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdXhwY21vdXRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgYXV4cGNtICphdXhwY21vdXQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JbXV0ZXhfbG9jaygmYXV4cGNtb3V0LT5sb2NrKTsKLQlpZiAoYXV4cGNtb3V0LT5hYykKLQkJcTZhdWRpb19hdXhwY21fY2xvc2UoYXV4cGNtb3V0LT5hYyk7Ci0JYXV4cGNtb3V0LT5hYyA9IE5VTEw7Ci0JYXV4cGNtb3V0LT5vcGVuZWQgPSAwOwotCW11dGV4X3VubG9jaygmYXV4cGNtb3V0LT5sb2NrKTsKLQlwcl9pbmZvKCJbJXM6JXNdIHJlbGVhc2VcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1eHBjbW91dF9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBhdXhwY21vdXRfb3BlbiwKLQkucmVsZWFzZQk9IGF1eHBjbW91dF9yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bAk9IGF1eHBjbW91dF9pb2N0bCwKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIGF1eHBjbW91dF9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fYXV4X3BjbV9sYl9vdXQiLAotCS5mb3BzCT0gJmF1eHBjbW91dF9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXV4cGNtb3V0X2luaXQodm9pZCkKLXsKLQltdXRleF9pbml0KCZ0aGVfYXV4cGNtb3V0LmxvY2spOwotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdXhwY21vdXRfbWlzYyk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhdXhwY21vdXRfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9kYWwuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2RhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzg0MzJiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2RhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzI3ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2RhbC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSwgSW5jLgotICogQXV0aG9yOiBCcmlhbiBTd2V0bGFuZCA8c3dldGxhbmRAZ29vZ2xlLmNvbT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21zbV9zbWQuaD4KLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fcWRzcDZfYXVkaW8uaD4KLQotI2luY2x1ZGUgImRhbC5oIgotCi0jZGVmaW5lIERBTF9UUkFDRSAwCi0KLXN0cnVjdCBkYWxfaGRyIHsKLQl1aW50MzJfdCBsZW5ndGg6MTY7CS8qIG1lc3NhZ2UgbGVuZ3RoIChoZWFkZXIgaW5jbHVzaXZlKSAqLwotCXVpbnQzMl90IHZlcnNpb246ODsJLyogREFMIHByb3RvY29sIHZlcnNpb24gKi8KLQl1aW50MzJfdCBwcmlvcml0eTo3OwotCXVpbnQzMl90IGFzeW5jOjE7Ci0JdWludDMyX3QgZGRpOjE2OwkvKiBEREkgbWV0aG9kIG51bWJlciAqLwotCXVpbnQzMl90IHByb3RvdHlwZTo4OwkvKiBEREkgc2VyaWFsaXphdGlvbiBmb3JtYXQgKi8KLQl1aW50MzJfdCBtc2dpZDo4OwkvKiBtZXNzYWdlIGlkIChEREksIEFUVEFDSCwgREVUQUNILCAuLi4pICovCi0Jdm9pZCAqZnJvbTsKLQl2b2lkICp0bzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgVFJBQ0VfREFUQV9NQVgJMTI4Ci0jZGVmaW5lIFRSQUNFX0xPR19NQVgJMzIKLSNkZWZpbmUgVFJBQ0VfTE9HX01BU0sJKFRSQUNFX0xPR19NQVggLSAxKQotCi1zdHJ1Y3QgZGFsX3RyYWNlIHsKLQl1bnNpZ25lZCB0aW1lc3RhbXA7Ci0Jc3RydWN0IGRhbF9oZHIgaGRyOwotCXVpbnQzMl90IGRhdGFbVFJBQ0VfREFUQV9NQVhdOwotfTsKLQotI2RlZmluZSBEQUxfSERSX1NJWkUJCShzaXplb2Yoc3RydWN0IGRhbF9oZHIpKQotI2RlZmluZSBEQUxfREFUQV9NQVgJCTUxMgotI2RlZmluZSBEQUxfTVNHX01BWAkJKERBTF9IRFJfU0laRSArIERBTF9EQVRBX01BWCkKLQotI2RlZmluZSBEQUxfVkVSU0lPTgkJMHgxMQotCi0jZGVmaW5lIERBTF9NU0dJRF9EREkJCTB4MDAKLSNkZWZpbmUgREFMX01TR0lEX0FUVEFDSAkweDAxCi0jZGVmaW5lIERBTF9NU0dJRF9ERVRBQ0gJMHgwMgotI2RlZmluZSBEQUxfTVNHSURfQVNZTkNICTB4QzAKLSNkZWZpbmUgREFMX01TR0lEX1JFUExZCQkweDgwCi0KLXN0cnVjdCBkYWxfY2hhbm5lbCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgY2xpZW50czsKLQotCS8qIHN5bmNocm9uaXphdGlvbiBmb3IgY2hhbmdpbmcgY2hhbm5lbCBzdGF0ZSwKLQkgKiBhZGRpbmcvcmVtb3ZpbmcgY2xpZW50cywgc21kIGNhbGxiYWNrcywgZXRjCi0JICovCi0Jc3BpbmxvY2tfdCBsb2NrOwotCi0Jc3RydWN0IHNtZF9jaGFubmVsICpzY2g7Ci0JY2hhciAqbmFtZTsKLQotCS8qIGV2ZW50cyBhcmUgZGVsaXZlcmVkIGF0IElSUSBjb250ZXh0IGltbWVkaWF0ZWx5LCBzbwotCSAqIHdlIG9ubHkgbmVlZCBvbmUgYXNzZW1ibHkgYnVmZmVyIGZvciB0aGUgZW50aXJlIGNoYW5uZWwKLQkgKi8KLQlzdHJ1Y3QgZGFsX2hkciBoZHI7Ci0JdW5zaWduZWQgY2hhciBkYXRhW0RBTF9EQVRBX01BWF07Ci0KLQl1bnNpZ25lZCBjb3VudDsKLQl2b2lkICpwdHI7Ci0KLQkvKiBjbGllbnQgd2hpY2ggdGhlIGN1cnJlbnQgaW5ib3VuZCBtZXNzYWdlIGlzIGZvciAqLwotCXN0cnVjdCBkYWxfY2xpZW50ICphY3RpdmU7Ci19OwotCi1zdHJ1Y3QgZGFsX2NsaWVudCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBkYWxfY2hhbm5lbCAqZGNoOwotCXZvaWQgKmNvb2tpZTsKLQlkYWxfZXZlbnRfZnVuY190IGV2ZW50OwotCi0JLyogb3BhcXVlIGhhbmRsZSBmb3IgdGhlIGZhciBzaWRlICovCi0Jdm9pZCAqcmVtb3RlOwotCi0JLyogZGFsIHJwYyBjYWxscyBhcmUgZnVsbHkgc3luY2hyb25vdXMgLS0gb25seSBvbmUgY2FsbCBtYXkgYmUKLQkgKiBhY3RpdmUgcGVyIGNsaWVudCBhdCBhIHRpbWUKLQkgKi8KLQlzdHJ1Y3QgbXV0ZXggd3JpdGVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCi0JdW5zaWduZWQgY2hhciBkYXRhW0RBTF9EQVRBX01BWF07Ci0KLQl2b2lkICpyZXBseTsKLQlpbnQgcmVwbHlfbWF4OwotCWludCBzdGF0dXM7Ci0JdW5zaWduZWQgbXNnaWQ7IC8qIG1zZ2lkIG9mIGV4cGVjdGVkIHJlcGx5ICovCi0KLQlzcGlubG9ja190IHRyX2xvY2s7Ci0JdW5zaWduZWQgdHJfaGVhZDsKLQl1bnNpZ25lZCB0cl90YWlsOwotCXN0cnVjdCBkYWxfdHJhY2UgKnRyX2xvZzsKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBub3codm9pZCkKLXsKLQlzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0Ja3RpbWVfZ2V0X3RzKCZ0cyk7Ci0JcmV0dXJuICh0cy50dl9uc2VjIC8gMTAwMDAwMCkgKyAodHMudHZfc2VjICogMTAwMCk7Ci19Ci0KLXZvaWQgZGFsX3RyYWNlKHN0cnVjdCBkYWxfY2xpZW50ICpjKQotewotCWlmIChjLT50cl9sb2cpCi0JCXJldHVybjsKLQljLT50cl9sb2cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGFsX3RyYWNlKSAqIFRSQUNFX0xPR19NQVgsCi0JCQkgICAgR0ZQX0tFUk5FTCk7Ci19Ci0KLXZvaWQgZGFsX3RyYWNlX3ByaW50KHN0cnVjdCBkYWxfaGRyICpoZHIsIHVuc2lnbmVkICpkYXRhLCBpbnQgbGVuLCB1bnNpZ25lZCB3aGVuKQotewotCWludCBpOwotCXByaW50aygiREFMICUwOHggLT4gJTA4eCBMPSUwM3ggQT0lZCBEPSUwNHggUD0lMDJ4IE09JTAyeCBUPSVkIiwKLQkgICAgICAgKHVuc2lnbmVkKSBoZHItPmZyb20sICh1bnNpZ25lZCkgaGRyLT50bywKLQkgICAgICAgaGRyLT5sZW5ndGgsIGhkci0+YXN5bmMsCi0JICAgICAgIGhkci0+ZGRpLCBoZHItPnByb3RvdHlwZSwgaGRyLT5tc2dpZCwKLQkgICAgICAgd2hlbik7Ci0JbGVuIC89IDQ7Ci0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWlmICghKGkgJiA3KSkKLQkJCXByaW50aygiXG4lMDN4IiwgaSAqIDQpOwotCQlwcmludGsoIiAlMDh4IiwgZGF0YVtpXSk7Ci0JfQotCXByaW50aygiXG4iKTsKLX0KLQotdm9pZCBkYWxfdHJhY2VfZHVtcChzdHJ1Y3QgZGFsX2NsaWVudCAqYykKLXsKLQlzdHJ1Y3QgZGFsX3RyYWNlICpkdDsKLQl1bnNpZ25lZCBuLCBsZW47Ci0KLQlpZiAoIWMtPnRyX2xvZykKLQkJcmV0dXJuOwotCi0JZm9yIChuID0gYy0+dHJfdGFpbDsgbiAhPSBjLT50cl9oZWFkOyBuID0gKG4gKyAxKSAmIFRSQUNFX0xPR19NQVNLKSB7Ci0JCWR0ID0gYy0+dHJfbG9nICsgbjsKLQkJbGVuID0gZHQtPmhkci5sZW5ndGggLSBzaXplb2YoZHQtPmhkcik7Ci0JCWlmIChsZW4gPiBUUkFDRV9EQVRBX01BWCkKLQkJCWxlbiA9IFRSQUNFX0RBVEFfTUFYOwotCQlkYWxfdHJhY2VfcHJpbnQoJmR0LT5oZHIsIGR0LT5kYXRhLCBsZW4sIGR0LT50aW1lc3RhbXApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZGFsX3RyYWNlX2xvZyhzdHJ1Y3QgZGFsX2NsaWVudCAqYywKLQkJCSAgc3RydWN0IGRhbF9oZHIgKmhkciwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbGVuKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgdCwgbjsKLQlzdHJ1Y3QgZGFsX3RyYWNlICpkdDsKLQotCXQgPSBub3coKTsKLQlpZiAobGVuID4gVFJBQ0VfREFUQV9NQVgpCi0JCWxlbiA9IFRSQUNFX0RBVEFfTUFYOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmMtPnRyX2xvY2ssIGZsYWdzKTsKLQluID0gKGMtPnRyX2hlYWQgKyAxKSAmIFRSQUNFX0xPR19NQVNLOwotCWlmIChjLT50cl90YWlsID09IG4pCi0JCWMtPnRyX3RhaWwgPSAoYy0+dHJfdGFpbCArIDEpICYgVFJBQ0VfTE9HX01BU0s7Ci0JZHQgPSBjLT50cl9sb2cgKyBuOwotCWR0LT50aW1lc3RhbXAgPSB0OwotCW1lbWNweSgmZHQtPmhkciwgaGRyLCBzaXplb2Yoc3RydWN0IGRhbF9oZHIpKTsKLQltZW1jcHkoZHQtPmRhdGEsIGRhdGEsIGxlbik7Ci0JYy0+dHJfaGVhZCA9IG47Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT50cl9sb2NrLCBmbGFncyk7Ci19Ci0KLQotc3RhdGljIHZvaWQgZGFsX2NoYW5uZWxfbm90aWZ5KHZvaWQgKnByaXYsIHVuc2lnbmVkIGV2ZW50KQotewotCXN0cnVjdCBkYWxfY2hhbm5lbCAqZGNoID0gcHJpdjsKLQlzdHJ1Y3QgZGFsX2hkciAqaGRyID0gJmRjaC0+aGRyOwotCXN0cnVjdCBkYWxfY2xpZW50ICpjbGllbnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgbGVuOwotCWludCByOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRjaC0+bG9jaywgZmxhZ3MpOwotCi1hZ2FpbjoKLQlpZiAoZGNoLT5jb3VudCA9PSAwKSB7Ci0JCWlmIChzbWRfcmVhZF9hdmFpbChkY2gtPnNjaCkgPCBEQUxfSERSX1NJWkUpCi0JCQlnb3RvIGRvbmU7Ci0KLQkJc21kX3JlYWQoZGNoLT5zY2gsIGhkciwgREFMX0hEUl9TSVpFKTsKLQotCQlpZiAoaGRyLT5sZW5ndGggPCBEQUxfSERSX1NJWkUpCi0JCQlnb3RvIGRvbmU7Ci0KLQkJaWYgKGhkci0+bGVuZ3RoID4gREFMX01TR19NQVgpCi0JCQlwYW5pYygib3ZlcnNpemUgbWVzc2FnZSIpOwotCi0JCWRjaC0+Y291bnQgPSBoZHItPmxlbmd0aCAtIERBTF9IRFJfU0laRTsKLQotCQkvKiBsb2NhdGUgdGhlIGNsaWVudCB0aGlzIG1lc3NhZ2UgaXMgdGFyZ2V0ZWQgdG8gKi8KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGllbnQsICZkY2gtPmNsaWVudHMsIGxpc3QpIHsKLQkJCWlmIChkY2gtPmhkci50byA9PSBjbGllbnQpIHsKLQkJCQlkY2gtPmFjdGl2ZSA9IGNsaWVudDsKLQkJCQlkY2gtPnB0ciA9IGNsaWVudC0+ZGF0YTsKLQkJCQlnb3RvIGNoZWNrX2RhdGE7Ci0JCQl9Ci0JCX0KLQkJcHJfZXJyKCJbJXM6JXNdICQkJCByZWNlaXZpbmcgdW5rbm93biBtZXNzYWdlIGxlbiA9ICVkICQkJFxuIiwKLQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18sIGRjaC0+Y291bnQpOwotCQlkY2gtPmFjdGl2ZSA9IDA7Ci0JCWRjaC0+cHRyID0gZGNoLT5kYXRhOwotCX0KLQotY2hlY2tfZGF0YToKLQlsZW4gPSBkY2gtPmNvdW50OwotCWlmIChsZW4gPiAwKSB7Ci0JCWlmIChzbWRfcmVhZF9hdmFpbChkY2gtPnNjaCkgPCBsZW4pCi0JCQlnb3RvIGRvbmU7Ci0KLQkJciA9IHNtZF9yZWFkKGRjaC0+c2NoLCBkY2gtPnB0ciwgbGVuKTsKLQkJaWYgKHIgIT0gbGVuKQotCQkJcGFuaWMoImludmFsaWQgcmVhZCIpOwotCi0jaWYgREFMX1RSQUNFCi0JCXByX2luZm8oIlslczolc10gZGFsIHJlY3YgJXAgPC0gJXAgJTAyeDolMDR4OiUwMnggJWRcbiIsCi0JCQlfX01NX0ZJTEVfXywgX19mdW5jX18sIGhkci0+dG8sIGhkci0+ZnJvbSwgaGRyLT5tc2dpZCwKLQkJCWhkci0+ZGRpLCBoZHItPnByb3RvdHlwZSwgaGRyLT5sZW5ndGggLSBzaXplb2YoKmhkcikpOwotCQlwcmludF9oZXhfZHVtcF9ieXRlcygiIiwgRFVNUF9QUkVGSVhfT0ZGU0VULCBkY2gtPnB0ciwgbGVuKTsKLSNlbmRpZgotCQlkY2gtPmNvdW50ID0gMDsKLQotCQljbGllbnQgPSBkY2gtPmFjdGl2ZTsKLQkJaWYgKCFjbGllbnQpIHsKLQkJCXByX2VycigiWyVzOiVzXSBtZXNzYWdlIHRvICVwIGRpc2NhcmRlZFxuIiwKLQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18sIGRjaC0+aGRyLnRvKTsKLQkJCWdvdG8gYWdhaW47Ci0JCX0KLQotCQlpZiAoY2xpZW50LT50cl9sb2cpCi0JCQlkYWxfdHJhY2VfbG9nKGNsaWVudCwgaGRyLCBkY2gtPnB0ciwgbGVuKTsKLQotCQlpZiAoaGRyLT5tc2dpZCA9PSBEQUxfTVNHSURfQVNZTkNIKSB7Ci0JCQlpZiAoY2xpZW50LT5ldmVudCkKLQkJCQljbGllbnQtPmV2ZW50KGRjaC0+cHRyLCBsZW4sIGNsaWVudC0+Y29va2llKTsKLQkJCWVsc2UKLQkJCQlwcl9lcnIoIlslczolc10gY2xpZW50ICVwIGhhcyBubyBldmVudCBcCi0JCQkJCWhhbmRsZXJcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywKLQkJCQkJY2xpZW50KTsKLQkJCWdvdG8gYWdhaW47Ci0JCX0KLQotCQlpZiAoaGRyLT5tc2dpZCA9PSBjbGllbnQtPm1zZ2lkKSB7Ci0JCQlpZiAoIWNsaWVudC0+cmVtb3RlKQotCQkJCWNsaWVudC0+cmVtb3RlID0gaGRyLT5mcm9tOwotCQkJaWYgKGxlbiA+IGNsaWVudC0+cmVwbHlfbWF4KQotCQkJCWxlbiA9IGNsaWVudC0+cmVwbHlfbWF4OwotCQkJbWVtY3B5KGNsaWVudC0+cmVwbHksIGNsaWVudC0+ZGF0YSwgbGVuKTsKLQkJCWNsaWVudC0+c3RhdHVzID0gbGVuOwotCQkJd2FrZV91cCgmY2xpZW50LT53YWl0KTsKLQkJCWdvdG8gYWdhaW47Ci0JCX0KLQotCQlwcl9lcnIoIlslczolc10gY2Fubm90IGZpbmQgY2xpZW50ICVwXG4iLCBfX01NX0ZJTEVfXywKLQkJCQlfX2Z1bmNfXywgZGNoLT5oZHIudG8pOwotCQlnb3RvIGFnYWluOwotCX0KLQotZG9uZToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkY2gtPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIExJU1RfSEVBRChkYWxfY2hhbm5lbF9saXN0KTsKLXN0YXRpYyBERUZJTkVfTVVURVgoZGFsX2NoYW5uZWxfbGlzdF9sb2NrKTsKLQotc3RhdGljIHN0cnVjdCBkYWxfY2hhbm5lbCAqZGFsX29wZW5fY2hhbm5lbChjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBjcHUpCi17Ci0Jc3RydWN0IGRhbF9jaGFubmVsICpkY2g7Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXVxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQltdXRleF9sb2NrKCZkYWxfY2hhbm5lbF9saXN0X2xvY2spOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkY2gsICZkYWxfY2hhbm5lbF9saXN0LCBsaXN0KSB7Ci0JCWlmICghc3RyY21wKGRjaC0+bmFtZSwgbmFtZSkpCi0JCQlnb3RvIGZvdW5kX2l0OwotCX0KLQotCWRjaCA9IGt6YWxsb2Moc2l6ZW9mKCpkY2gpICsgc3RybGVuKG5hbWUpICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkY2gpCi0JCWdvdG8gZmFpbDsKLQotCWRjaC0+bmFtZSA9IChjaGFyICopIChkY2ggKyAxKTsKLQlzdHJjcHkoZGNoLT5uYW1lLCBuYW1lKTsKLQlzcGluX2xvY2tfaW5pdCgmZGNoLT5sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmZGNoLT5jbGllbnRzKTsKLQotCWxpc3RfYWRkKCZkY2gtPmxpc3QsICZkYWxfY2hhbm5lbF9saXN0KTsKLQotZm91bmRfaXQ6Ci0JaWYgKCFkY2gtPnNjaCkgewotCQlpZiAoc21kX25hbWVkX29wZW5fb25fZWRnZShuYW1lLCBjcHUsICZkY2gtPnNjaCwKLQkJCQkJZGNoLCBkYWxfY2hhbm5lbF9ub3RpZnkpKSB7Ci0JCQlwcl9lcnIoIlslczolc10gc21kIG9wZW4gZmFpbGVkXG4iLCBfX01NX0ZJTEVfXywKLQkJCQkJX19mdW5jX18pOwotCQkJZGNoID0gTlVMTDsKLQkJfQotCQkvKiBGSVhNRTogd2FpdCBmb3IgY2hhbm5lbCB0byBvcGVuIGJlZm9yZSByZXR1cm5pbmcgKi8KLQkJbXNsZWVwKDEwMCk7Ci0JfQotCi1mYWlsOgotCW11dGV4X3VubG9jaygmZGFsX2NoYW5uZWxfbGlzdF9sb2NrKTsKLQotCXJldHVybiBkY2g7Ci19Ci0KLWludCBkYWxfY2FsbF9yYXcoc3RydWN0IGRhbF9jbGllbnQgKmNsaWVudCwKLQkJIHN0cnVjdCBkYWxfaGRyICpoZHIsCi0JCSB2b2lkICpkYXRhLCBpbnQgZGF0YV9sZW4sCi0JCSB2b2lkICpyZXBseSwgaW50IHJlcGx5X21heCkKLXsKLQlzdHJ1Y3QgZGFsX2NoYW5uZWwgKmRjaCA9IGNsaWVudC0+ZGNoOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQljbGllbnQtPnJlcGx5ID0gcmVwbHk7Ci0JY2xpZW50LT5yZXBseV9tYXggPSByZXBseV9tYXg7Ci0JY2xpZW50LT5tc2dpZCA9IGhkci0+bXNnaWQgfCBEQUxfTVNHSURfUkVQTFk7Ci0JY2xpZW50LT5zdGF0dXMgPSAtRUJVU1k7Ci0KLSNpZiBEQUxfVFJBQ0UKLQlwcl9pbmZvKCJbJXM6JXM6JXhdIGRhbCBzZW5kICVwIC0+ICVwICUwMng6JTA0eDolMDJ4ICVkXG4iLAotCQlfX01NX0ZJTEVfXywgX19mdW5jX18sICh1bnNpZ25lZCBpbnQpY2xpZW50LCBoZHItPmZyb20sIGhkci0+dG8sCi0JCWhkci0+bXNnaWQsIGhkci0+ZGRpLCBoZHItPnByb3RvdHlwZSwKLQkJaGRyLT5sZW5ndGggLSBzaXplb2YoKmhkcikpOwotCXByaW50X2hleF9kdW1wX2J5dGVzKCIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsIGRhdGEsIGRhdGFfbGVuKTsKLSNlbmRpZgotCi0JaWYgKGNsaWVudC0+dHJfbG9nKQotCQlkYWxfdHJhY2VfbG9nKGNsaWVudCwgaGRyLCBkYXRhLCBkYXRhX2xlbik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGNoLT5sb2NrLCBmbGFncyk7Ci0JLyogRklYTUU6IGVuc3VyZSBlbnRpcmUgbWVzc2FnZSBpcyB3cml0dGVuIG9yIG5vbmUuICovCi0Jc21kX3dyaXRlKGRjaC0+c2NoLCBoZHIsIHNpemVvZigqaGRyKSk7Ci0Jc21kX3dyaXRlKGRjaC0+c2NoLCBkYXRhLCBkYXRhX2xlbik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGNoLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIXdhaXRfZXZlbnRfdGltZW91dChjbGllbnQtPndhaXQsIChjbGllbnQtPnN0YXR1cyAhPSAtRUJVU1kpLCA1KkhaKSkgewotCQlkYWxfdHJhY2VfZHVtcChjbGllbnQpOwotCQlwcl9lcnIoIlslczolc10gY2FsbCB0aW1lZCBvdXQuIGRzcCBpcyBwcm9iYWJseSBkZWFkLlxuIiwKLQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlkYWxfdHJhY2VfcHJpbnQoaGRyLCBkYXRhLCBkYXRhX2xlbiwgMCk7Ci0JCXE2YXVkaW9fZHNwX25vdF9yZXNwb25kaW5nKCk7Ci0JfQotCi0JcmV0dXJuIGNsaWVudC0+c3RhdHVzOwotfQotCi1pbnQgZGFsX2NhbGwoc3RydWN0IGRhbF9jbGllbnQgKmNsaWVudCwKLQkgICAgIHVuc2lnbmVkIGRkaSwgdW5zaWduZWQgcHJvdG90eXBlLAotCSAgICAgdm9pZCAqZGF0YSwgaW50IGRhdGFfbGVuLAotCSAgICAgdm9pZCAqcmVwbHksIGludCByZXBseV9tYXgpCi17Ci0Jc3RydWN0IGRhbF9oZHIgaGRyOwotCWludCByOwotCi0JbWVtc2V0KCZoZHIsIDAsIHNpemVvZihoZHIpKTsKLQotCWhkci5sZW5ndGggPSBkYXRhX2xlbiArIHNpemVvZihoZHIpOwotCWhkci52ZXJzaW9uID0gREFMX1ZFUlNJT047Ci0JaGRyLm1zZ2lkID0gREFMX01TR0lEX0RESTsKLQloZHIuZGRpID0gZGRpOwotCWhkci5wcm90b3R5cGUgPSBwcm90b3R5cGU7Ci0JaGRyLmZyb20gPSBjbGllbnQ7Ci0JaGRyLnRvID0gY2xpZW50LT5yZW1vdGU7Ci0KLQlpZiAoaGRyLmxlbmd0aCA+IERBTF9NU0dfTUFYKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmNsaWVudC0+d3JpdGVfbG9jayk7Ci0JciA9IGRhbF9jYWxsX3JhdyhjbGllbnQsICZoZHIsIGRhdGEsIGRhdGFfbGVuLCByZXBseSwgcmVwbHlfbWF4KTsKLQltdXRleF91bmxvY2soJmNsaWVudC0+d3JpdGVfbG9jayk7Ci0KLQlyZXR1cm4gcjsKLX0KLQotc3RydWN0IGRhbF9tc2dfYXR0YWNoIHsKLQl1aW50MzJfdCBkZXZpY2VfaWQ7Ci0JY2hhciBhdHRhY2hbNjRdOwotCWNoYXIgc2VydmljZV9uYW1lWzMyXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBkYWxfcmVwbHlfYXR0YWNoIHsKLQl1aW50MzJfdCBzdGF0dXM7Ci0JY2hhciBuYW1lWzY0XTsKLX07Ci0KLXN0cnVjdCBkYWxfY2xpZW50ICpkYWxfYXR0YWNoKHVpbnQzMl90IGRldmljZV9pZCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgICAgIHVpbnQzMl90IGNwdSwgZGFsX2V2ZW50X2Z1bmNfdCBmdW5jLCB2b2lkICpjb29raWUpCi17Ci0Jc3RydWN0IGRhbF9oZHIgaGRyOwotCXN0cnVjdCBkYWxfbXNnX2F0dGFjaCBtc2c7Ci0Jc3RydWN0IGRhbF9yZXBseV9hdHRhY2ggcmVwbHk7Ci0Jc3RydWN0IGRhbF9jaGFubmVsICpkY2g7Ci0Jc3RydWN0IGRhbF9jbGllbnQgKmNsaWVudDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByOwotCi0JcHJfZGVidWcoIlslczolc11cbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JZGNoID0gZGFsX29wZW5fY2hhbm5lbChuYW1lLCBjcHUpOwotCWlmICghZGNoKQotCQlyZXR1cm4gMDsKLQotCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKCpjbGllbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNsaWVudCkKLQkJcmV0dXJuIDA7Ci0KLQljbGllbnQtPmRjaCA9IGRjaDsKLQljbGllbnQtPmV2ZW50ID0gZnVuYzsKLQljbGllbnQtPmNvb2tpZSA9IGNvb2tpZTsKLQltdXRleF9pbml0KCZjbGllbnQtPndyaXRlX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZjbGllbnQtPnRyX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNsaWVudC0+d2FpdCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGNoLT5sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGQoJmNsaWVudC0+bGlzdCwgJmRjaC0+Y2xpZW50cyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGNoLT5sb2NrLCBmbGFncyk7Ci0KLQltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOwotCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7Ci0KLQloZHIubGVuZ3RoID0gc2l6ZW9mKGhkcikgKyBzaXplb2YobXNnKTsKLQloZHIudmVyc2lvbiA9IERBTF9WRVJTSU9OOwotCWhkci5tc2dpZCA9IERBTF9NU0dJRF9BVFRBQ0g7Ci0JaGRyLmZyb20gPSBjbGllbnQ7Ci0JbXNnLmRldmljZV9pZCA9IGRldmljZV9pZDsKLQotCXIgPSBkYWxfY2FsbF9yYXcoY2xpZW50LCAmaGRyLCAmbXNnLCBzaXplb2YobXNnKSwKLQkJCSAmcmVwbHksIHNpemVvZihyZXBseSkpOwotCi0JaWYgKChyID09IHNpemVvZihyZXBseSkpICYmIChyZXBseS5zdGF0dXMgPT0gMCkpIHsKLQkJcmVwbHkubmFtZVs2M10gPSAwOwotCQlwcl9pbmZvKCJbJXM6JXNdIHN0YXR1cyA9ICVkLCBuYW1lID0gJyVzJyBkYWxfY2xpZW50ICV4XG4iLAotCQkJX19NTV9GSUxFX18sIF9fZnVuY19fLCByZXBseS5zdGF0dXMsCi0JCQlyZXBseS5uYW1lLCAodW5zaWduZWQgaW50KWNsaWVudCk7Ci0JCXJldHVybiBjbGllbnQ7Ci0JfQotCi0JcHJfZXJyKCJbJXM6JXNdIGZhaWx1cmVcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0KLQlkYWxfZGV0YWNoKGNsaWVudCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBkYWxfZGV0YWNoKHN0cnVjdCBkYWxfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IGRhbF9jaGFubmVsICpkY2g7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXByX2RlYnVnKCJbJXM6JXNdXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCW11dGV4X2xvY2soJmNsaWVudC0+d3JpdGVfbG9jayk7Ci0JaWYgKGNsaWVudC0+cmVtb3RlKSB7Ci0JCXN0cnVjdCBkYWxfaGRyIGhkcjsKLQkJdWludDMyX3QgZGF0YTsKLQotCQltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOwotCQloZHIubGVuZ3RoID0gc2l6ZW9mKGhkcikgKyBzaXplb2YoZGF0YSk7Ci0JCWhkci52ZXJzaW9uID0gREFMX1ZFUlNJT047Ci0JCWhkci5tc2dpZCA9IERBTF9NU0dJRF9ERVRBQ0g7Ci0JCWhkci5mcm9tID0gY2xpZW50OwotCQloZHIudG8gPSBjbGllbnQtPnJlbW90ZTsKLQkJZGF0YSA9ICh1aW50MzJfdCkgY2xpZW50OwotCi0JCWRhbF9jYWxsX3JhdyhjbGllbnQsICZoZHIsICZkYXRhLCBzaXplb2YoZGF0YSksCi0JCQkgICAgICZkYXRhLCBzaXplb2YoZGF0YSkpOwotCX0KLQotCWRjaCA9IGNsaWVudC0+ZGNoOwotCXNwaW5fbG9ja19pcnFzYXZlKCZkY2gtPmxvY2ssIGZsYWdzKTsKLQlpZiAoZGNoLT5hY3RpdmUgPT0gY2xpZW50KSB7Ci0JCS8qIFdlIGhhdmUgcmVjZWl2ZWQgYSBtZXNzYWdlIGhlYWRlciBmb3IgdGhpcyBjbGllbnQKLQkJICogYnV0IG5vdCB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS4gIEVuc3VyZSB0aGF0IHdoZW4KLQkJICogdGhlIGJvZHkgYXJyaXZlcyB3ZSBkb24ndCB3cml0ZSBpdCBpbnRvIHRoZSBub3ctY2xvc2VkCi0JCSAqIGNsaWVudC4gIEluICp0aGVvcnkqIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4KLQkJICovCi0JCWRjaC0+YWN0aXZlID0gMDsKLQkJZGNoLT5wdHIgPSBkY2gtPmRhdGE7Ci0JfQotCWxpc3RfZGVsKCZjbGllbnQtPmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRjaC0+bG9jaywgZmxhZ3MpOwotCi0JbXV0ZXhfdW5sb2NrKCZjbGllbnQtPndyaXRlX2xvY2spOwotCi0Ja2ZyZWUoY2xpZW50KTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCAqZGFsX2dldF9yZW1vdGVfaGFuZGxlKHN0cnVjdCBkYWxfY2xpZW50ICpjbGllbnQpCi17Ci0JcmV0dXJuIGNsaWVudC0+cmVtb3RlOwotfQotCi0vKiBjb252ZW5pZW5jZSB3cmFwcGVycyAqLwotCi1pbnQgZGFsX2NhbGxfZjAoc3RydWN0IGRhbF9jbGllbnQgKmNsaWVudCwgdWludDMyX3QgZGRpLCB1aW50MzJfdCBhcmcxKQotewotCXVpbnQzMl90IHRtcCA9IGFyZzE7Ci0JaW50IHJlczsKLQlyZXMgPSBkYWxfY2FsbChjbGllbnQsIGRkaSwgMCwgJnRtcCwgc2l6ZW9mKHRtcCksICZ0bXAsIHNpemVvZih0bXApKTsKLQlpZiAocmVzID49IDQpCi0JCXJldHVybiAoaW50KSB0bXA7Ci0JcmV0dXJuIHJlczsKLX0KLQotaW50IGRhbF9jYWxsX2YxKHN0cnVjdCBkYWxfY2xpZW50ICpjbGllbnQsIHVpbnQzMl90IGRkaSwgdWludDMyX3QgYXJnMSwKLQkJdWludDMyX3QgYXJnMikKLXsKLQl1aW50MzJfdCB0bXBbMl07Ci0JaW50IHJlczsKLQl0bXBbMF0gPSBhcmcxOwotCXRtcFsxXSA9IGFyZzI7Ci0JcmVzID0gZGFsX2NhbGwoY2xpZW50LCBkZGksIDEsIHRtcCwgc2l6ZW9mKHRtcCksIHRtcCwgc2l6ZW9mKHVpbnQzMl90KSk7Ci0JaWYgKHJlcyA+PSA0KQotCQlyZXR1cm4gKGludCkgdG1wWzBdOwotCXJldHVybiByZXM7Ci19Ci0KLWludCBkYWxfY2FsbF9mNShzdHJ1Y3QgZGFsX2NsaWVudCAqY2xpZW50LCB1aW50MzJfdCBkZGksIHZvaWQgKmlidWYsIHVpbnQzMl90IGlsZW4pCi17Ci0JdWludDMyX3QgdG1wWzEyOF07Ci0JaW50IHJlczsKLQlpbnQgcGFyYW1faWR4ID0gMDsKLQotCWlmIChpbGVuICsgNCA+IERBTF9EQVRBX01BWCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl0bXBbcGFyYW1faWR4XSA9IGlsZW47Ci0JcGFyYW1faWR4Kys7Ci0KLQltZW1jcHkoJnRtcFtwYXJhbV9pZHhdLCBpYnVmLCBpbGVuKTsKLQlwYXJhbV9pZHggKz0gRElWX1JPVU5EX1VQKGlsZW4sIDQpOwotCi0JcmVzID0gZGFsX2NhbGwoY2xpZW50LCBkZGksIDUsIHRtcCwgcGFyYW1faWR4ICogNCwgdG1wLCBzaXplb2YodG1wKSk7Ci0KLQlpZiAocmVzID49IDQpCi0JCXJldHVybiAoaW50KSB0bXBbMF07Ci0JcmV0dXJuIHJlczsKLX0KLQotaW50IGRhbF9jYWxsX2Y2KHN0cnVjdCBkYWxfY2xpZW50ICpjbGllbnQsIHVpbnQzMl90IGRkaSwgdWludDMyX3QgczEsCi0JCXZvaWQgKmlidWYsIHVpbnQzMl90IGlsZW4pCi17Ci0JdWludDMyX3QgdG1wWzEyOF07Ci0JaW50IHJlczsKLQlpbnQgcGFyYW1faWR4ID0gMDsKLQotCWlmIChpbGVuICsgOCA+IERBTF9EQVRBX01BWCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl0bXBbcGFyYW1faWR4XSA9IHMxOwotCXBhcmFtX2lkeCsrOwotCXRtcFtwYXJhbV9pZHhdID0gaWxlbjsKLQlwYXJhbV9pZHgrKzsKLQltZW1jcHkoJnRtcFtwYXJhbV9pZHhdLCBpYnVmLCBpbGVuKTsKLQlwYXJhbV9pZHggKz0gRElWX1JPVU5EX1VQKGlsZW4sIDQpOwotCi0JcmVzID0gZGFsX2NhbGwoY2xpZW50LCBkZGksIDYsIHRtcCwgcGFyYW1faWR4ICogNCwgdG1wLCBzaXplb2YodG1wKSk7Ci0KLQlpZiAocmVzID49IDQpCi0JCXJldHVybiAoaW50KSB0bXBbMF07Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1pbnQgZGFsX2NhbGxfZjkoc3RydWN0IGRhbF9jbGllbnQgKmNsaWVudCwgdWludDMyX3QgZGRpLCB2b2lkICpvYnVmLAotCQl1aW50MzJfdCBvbGVuKQotewotCXVpbnQzMl90IHRtcFsxMjhdOwotCWludCByZXM7Ci0KLQlpZiAob2xlbiA+IHNpemVvZih0bXApIC0gOCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JdG1wWzBdID0gb2xlbjsKLQotCXJlcyA9IGRhbF9jYWxsKGNsaWVudCwgZGRpLCA5LCB0bXAsIHNpemVvZih1aW50MzJfdCksIHRtcCwKLQkJc2l6ZW9mKHRtcCkpOwotCi0JaWYgKHJlcyA+PSA0KQotCQlyZXMgPSAoaW50KXRtcFswXTsKLQotCWlmICghcmVzKSB7Ci0JCWlmICh0bXBbMV0gPiBvbGVuKQotCQkJcmV0dXJuIC1FSU87Ci0JCW1lbWNweShvYnVmLCAmdG1wWzJdLCB0bXBbMV0pOwotCX0KLQlyZXR1cm4gcmVzOwotfQotCi1pbnQgZGFsX2NhbGxfZjExKHN0cnVjdCBkYWxfY2xpZW50ICpjbGllbnQsIHVpbnQzMl90IGRkaSwgdWludDMyX3QgczEsCi0JCXZvaWQgKm9idWYsIHVpbnQzMl90IG9sZW4pCi17Ci0JdWludDMyX3QgdG1wW0RBTF9EQVRBX01BWC80XSA9IHswfTsKLQlpbnQgcmVzOwotCWludCBwYXJhbV9pZHggPSAwOwotCWludCBudW1fYnl0ZXMgPSA0OwotCi0JbnVtX2J5dGVzICs9IChESVZfUk9VTkRfVVAob2xlbiwgNCkpICogNDsKLQotCWlmICgobnVtX2J5dGVzID4gREFMX0RBVEFfTUFYIC0gMTIpIHx8IChvbGVuID4gREFMX0RBVEFfTUFYIC0gOCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdG1wW3BhcmFtX2lkeF0gPSBzMTsKLQlwYXJhbV9pZHgrKzsKLQl0bXBbcGFyYW1faWR4XSA9IG9sZW47Ci0JcGFyYW1faWR4ICs9IERJVl9ST1VORF9VUChvbGVuLCA0KTsKLQotCXJlcyA9IGRhbF9jYWxsKGNsaWVudCwgZGRpLCAxMSwgdG1wLCBwYXJhbV9pZHggKiA0LCB0bXAsIHNpemVvZih0bXApKTsKLQotCWlmIChyZXMgPj0gNCkKLQkJcmVzID0gKGludCkgdG1wWzBdOwotCWlmICghcmVzKSB7Ci0JCWlmICh0bXBbMV0gPiBvbGVuKQotCQkJcmV0dXJuIC1FSU87Ci0JCW1lbWNweShvYnVmLCAmdG1wWzJdLCB0bXBbMV0pOwotCX0KLQlyZXR1cm4gcmVzOwotfQotCi1pbnQgZGFsX2NhbGxfZjEzKHN0cnVjdCBkYWxfY2xpZW50ICpjbGllbnQsIHVpbnQzMl90IGRkaSwgdm9pZCAqaWJ1ZjEsCi0JCSB1aW50MzJfdCBpbGVuMSwgdm9pZCAqaWJ1ZjIsIHVpbnQzMl90IGlsZW4yLCB2b2lkICpvYnVmLAotCQkgdWludDMyX3Qgb2xlbikKLXsKLQl1aW50MzJfdCB0bXBbREFMX0RBVEFfTUFYLzRdOwotCWludCByZXM7Ci0JaW50IHBhcmFtX2lkeCA9IDA7Ci0JaW50IG51bV9ieXRlcyA9IDA7Ci0KLQludW1fYnl0ZXMgPSAoRElWX1JPVU5EX1VQKGlsZW4xLCA0KSkgKiA0OwotCW51bV9ieXRlcyArPSAoRElWX1JPVU5EX1VQKGlsZW4yLCA0KSkgKiA0OwotCi0JaWYgKChudW1fYnl0ZXMgPiBEQUxfREFUQV9NQVggLSAxMikgfHwgKG9sZW4gPiBEQUxfREFUQV9NQVggLSA4KSB8fAotCQkJKGlsZW4xID4gREFMX0RBVEFfTUFYKSB8fCAoaWxlbjIgPiBEQUxfREFUQV9NQVgpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXRtcFtwYXJhbV9pZHhdID0gaWxlbjE7Ci0JcGFyYW1faWR4Kys7Ci0KLQltZW1jcHkoJnRtcFtwYXJhbV9pZHhdLCBpYnVmMSwgaWxlbjEpOwotCXBhcmFtX2lkeCArPSBESVZfUk9VTkRfVVAoaWxlbjEsIDQpOwotCi0JdG1wW3BhcmFtX2lkeCsrXSA9IGlsZW4yOwotCW1lbWNweSgmdG1wW3BhcmFtX2lkeF0sIGlidWYyLCBpbGVuMik7Ci0JcGFyYW1faWR4ICs9IERJVl9ST1VORF9VUChpbGVuMiwgNCk7Ci0KLQl0bXBbcGFyYW1faWR4KytdID0gb2xlbjsKLQlyZXMgPSBkYWxfY2FsbChjbGllbnQsIGRkaSwgMTMsIHRtcCwgcGFyYW1faWR4ICogNCwgdG1wLAotCQkJc2l6ZW9mKHRtcCkpOwotCi0JaWYgKHJlcyA+PSA0KQotCQlyZXMgPSAoaW50KXRtcFswXTsKLQotCWlmICghcmVzKSB7Ci0JCWlmICh0bXBbMV0gPiBvbGVuKQotCQkJcmV0dXJuIC1FSU87Ci0JCW1lbWNweShvYnVmLCAmdG1wWzJdLCB0bXBbMV0pOwotCX0KLQlyZXR1cm4gcmVzOwotfQotaW50IGRhbF9jYWxsX2YxNChzdHJ1Y3QgZGFsX2NsaWVudCAqY2xpZW50LCB1aW50MzJfdCBkZGksIHZvaWQgKmlidWYsCi0JCSB1aW50MzJfdCBpbGVuLCB2b2lkICpvYnVmMSwgdWludDMyX3Qgb2xlbjEsIHZvaWQgKm9idWYyLAotCQkgdWludDMyX3Qgb2xlbjIsIHVpbnQzMl90ICpvYWxlbjIpCi17Ci0JdWludDMyX3QgdG1wWzEyOF07Ci0JaW50IHJlczsKLQlpbnQgcGFyYW1faWR4ID0gMDsKLQotCWlmIChvbGVuMSArIG9sZW4yICsgOCA+IERBTF9EQVRBX01BWCB8fAotCQlpbGVuICsgMTIgPiBEQUxfREFUQV9NQVgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdG1wW3BhcmFtX2lkeF0gPSBpbGVuOwotCXBhcmFtX2lkeCsrOwotCi0JbWVtY3B5KCZ0bXBbcGFyYW1faWR4XSwgaWJ1ZiwgaWxlbik7Ci0JcGFyYW1faWR4ICs9IERJVl9ST1VORF9VUChpbGVuLCA0KTsKLQotCXRtcFtwYXJhbV9pZHgrK10gPSBvbGVuMTsKLQl0bXBbcGFyYW1faWR4KytdID0gb2xlbjI7Ci0JcmVzID0gZGFsX2NhbGwoY2xpZW50LCBkZGksIDE0LCB0bXAsIHBhcmFtX2lkeCAqIDQsIHRtcCwgc2l6ZW9mKHRtcCkpOwotCi0JaWYgKHJlcyA+PSA0KQotCQlyZXMgPSAoaW50KXRtcFswXTsKLQotCWlmICghcmVzKSB7Ci0JCWlmICh0bXBbMV0gPiBvbGVuMSkKLQkJCXJldHVybiAtRUlPOwotCQlwYXJhbV9pZHggPSBESVZfUk9VTkRfVVAodG1wWzFdLCA0KSArIDI7Ci0JCWlmICh0bXBbcGFyYW1faWR4XSA+IG9sZW4yKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJbWVtY3B5KG9idWYxLCAmdG1wWzJdLCB0bXBbMV0pOwotCQltZW1jcHkob2J1ZjIsICZ0bXBbcGFyYW1faWR4KzFdLCB0bXBbcGFyYW1faWR4XSk7Ci0JCSpvYWxlbjIgPSB0bXBbcGFyYW1faWR4XTsKLQl9Ci0JcmV0dXJuIHJlczsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2RhbC5oIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvZGFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNzZlYjkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvZGFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9kYWwuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUsIEluYy4KLSAqIEF1dGhvcjogQnJpYW4gU3dldGxhbmQgPHN3ZXRsYW5kQGdvb2dsZS5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfTUFDSF9NU01fREFMXwotI2RlZmluZSBfTUFDSF9NU01fREFMXwotCi1zdHJ1Y3QgZGFsX2NsaWVudDsKLQotc3RydWN0IGRhbF9pbmZvIHsKLQl1aW50MzJfdCBzaXplOwotCXVpbnQzMl90IHZlcnNpb247Ci0JY2hhciBuYW1lWzMyXTsKLX07Ci0KLXR5cGVkZWYgdm9pZCAoKmRhbF9ldmVudF9mdW5jX3QpKHZvaWQgKmRhdGEsIGludCBsZW4sIHZvaWQgKmNvb2tpZSk7Ci0KLXN0cnVjdCBkYWxfY2xpZW50ICpkYWxfYXR0YWNoKHVpbnQzMl90IGRldmljZV9pZCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCXVpbnQzMl90IGNwdSwgZGFsX2V2ZW50X2Z1bmNfdCBmdW5jLCB2b2lkICpjb29raWUpOwotCi1pbnQgZGFsX2RldGFjaChzdHJ1Y3QgZGFsX2NsaWVudCAqY2xpZW50KTsKLQotaW50IGRhbF9jYWxsKHN0cnVjdCBkYWxfY2xpZW50ICpjbGllbnQsCi0JICAgICB1bnNpZ25lZCBkZGksIHVuc2lnbmVkIHByb3RvdHlwZSwKLQkgICAgIHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbiwKLQkgICAgIHZvaWQgKnJlcGx5LCBpbnQgcmVwbHlfbWF4KTsKLQotdm9pZCBkYWxfdHJhY2Uoc3RydWN0IGRhbF9jbGllbnQgKmNsaWVudCk7Ci12b2lkIGRhbF90cmFjZV9kdW1wKHN0cnVjdCBkYWxfY2xpZW50ICpjbGllbnQpOwotCi0vKiBmdW5jdGlvbiB0byBjYWxsIGJlZm9yZSBwYW5pYyBvbiBzdGFsbGVkIGRhbCBjYWxscyAqLwotdm9pZCBkYWxfc2V0X29vcHMoc3RydWN0IGRhbF9jbGllbnQgKmNsaWVudCwgdm9pZCAoKm9vcHMpKHZvaWQpKTsKLQotLyogY29udmVuaWVuY2Ugd3JhcHBlcnMgKi8KLWludCBkYWxfY2FsbF9mMChzdHJ1Y3QgZGFsX2NsaWVudCAqY2xpZW50LCB1aW50MzJfdCBkZGksCi0JCXVpbnQzMl90IGFyZzEpOwotaW50IGRhbF9jYWxsX2YxKHN0cnVjdCBkYWxfY2xpZW50ICpjbGllbnQsIHVpbnQzMl90IGRkaSwKLQkJdWludDMyX3QgYXJnMSwgdWludDMyX3QgYXJnMik7Ci1pbnQgZGFsX2NhbGxfZjUoc3RydWN0IGRhbF9jbGllbnQgKmNsaWVudCwgdWludDMyX3QgZGRpLAotCQl2b2lkICppYnVmLCB1aW50MzJfdCBpbGVuKTsKLWludCBkYWxfY2FsbF9mNihzdHJ1Y3QgZGFsX2NsaWVudCAqY2xpZW50LCB1aW50MzJfdCBkZGksCi0JCXVpbnQzMl90IHMxLCB2b2lkICppYnVmLCB1aW50MzJfdCBpbGVuKTsKLWludCBkYWxfY2FsbF9mOShzdHJ1Y3QgZGFsX2NsaWVudCAqY2xpZW50LCB1aW50MzJfdCBkZGksCi0JCXZvaWQgKm9idWYsIHVpbnQzMl90IG9sZW4pOwotaW50IGRhbF9jYWxsX2YxMShzdHJ1Y3QgZGFsX2NsaWVudCAqY2xpZW50LCB1aW50MzJfdCBkZGksCi0JCXVpbnQzMl90IHMxLCB2b2lkICpvYnVmLCB1aW50MzJfdCBvbGVuKTsKLWludCBkYWxfY2FsbF9mMTMoc3RydWN0IGRhbF9jbGllbnQgKmNsaWVudCwgdWludDMyX3QgZGRpLCB2b2lkICppYnVmMSwKLQkJIHVpbnQzMl90IGlsZW4xLCB2b2lkICppYnVmMiwgdWludDMyX3QgaWxlbjIsIHZvaWQgKm9idWYsCi0JCSB1aW50MzJfdCBvbGVuKTsKLWludCBkYWxfY2FsbF9mMTQoc3RydWN0IGRhbF9jbGllbnQgKmNsaWVudCwgdWludDMyX3QgZGRpLCB2b2lkICppYnVmLAotCQkgdWludDMyX3QgaWxlbiwgdm9pZCAqb2J1ZjEsIHVpbnQzMl90IG9sZW4xLCB2b2lkICpvYnVmMiwKLQkJIHVpbnQzMl90IG9sZW4yLCB1aW50MzJfdCAqb2FsZW4yKTsKLQotLyogY29tbW9uIERBTCBvcGVyYXRpb25zICovCi1lbnVtIHsKLQlEQUxfT1BfQVRUQUNIID0gMCwKLQlEQUxfT1BfREVUQUNILAotCURBTF9PUF9JTklULAotCURBTF9PUF9ERUlOSVQsCi0JREFMX09QX09QRU4sCi0JREFMX09QX0NMT1NFLAotCURBTF9PUF9JTkZPLAotCURBTF9PUF9QT1dFUkVWRU5ULAotCURBTF9PUF9TWVNSRVFVRVNULAotCURBTF9PUF9GSVJTVF9ERVZJQ0VfQVBJLAotfTsKLQotc3RhdGljIGlubGluZSBpbnQgY2hlY2tfdmVyc2lvbihzdHJ1Y3QgZGFsX2NsaWVudCAqY2xpZW50LCB1aW50MzJfdCB2ZXJzaW9uKQotewotCXN0cnVjdCBkYWxfaW5mbyBpbmZvOwotCWludCByZXM7Ci0KLQlyZXMgPSBkYWxfY2FsbF9mOShjbGllbnQsIERBTF9PUF9JTkZPLCAmaW5mbywgc2l6ZW9mKHN0cnVjdCBkYWxfaW5mbykpOwotCWlmICghcmVzKSB7Ci0JCWlmICgoKGluZm8udmVyc2lvbiAmIDB4RkZGRjAwMDApICE9ICh2ZXJzaW9uICYgMHhGRkZGMDAwMCkpIHx8Ci0JCSgoaW5mby52ZXJzaW9uICYgMHgwMDAwRkZGRikgPAotCQkodmVyc2lvbiAmIDB4MDAwMEZGRkYpKSkgewotCQkJcmVzID0gLUVJTlZBTDsKLQkJfQotCX0KLQlyZXR1cm4gcmVzOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2RhbF9hY2RiLmggYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9kYWxfYWNkYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTE4NzljLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2RhbF9hY2RiLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNkZWZpbmUgQUNEQl9EQUxfREVWSUNFCQkweDAyMDAwMDY5Ci0jZGVmaW5lIEFDREJfREFMX1BPUlQJCSJEQUxfQU1fQVVEIgotCi0jZGVmaW5lIEFDREJfT1BfSU9DVEwJCURBTF9PUF9GSVJTVF9ERVZJQ0VfQVBJCi0KLS8qIGlvY3RscyAqLwotI2RlZmluZSBBQ0RCX0dFVF9ERVZJQ0UJCTB4MDEwOGJiOTIKLSNkZWZpbmUgQUNEQl9TRVRfREVWSUNFCQkweDAxMDhiYjkzCi0jZGVmaW5lIEFDREJfR0VUX1NUUkVBTQkJMHgwMTA4YmI5NQotI2RlZmluZSBBQ0RCX1NFVF9TVFJFQU0JCTB4MDEwOGJiOTYKLSNkZWZpbmUgQUNEQl9HRVRfREVWSUNFX1RBQkxFCTB4MDEwOGJiOTcKLSNkZWZpbmUgQUNEQl9HRVRfU1RSRUFNX1RBQkxFCTB4MDEwOGJiOTgKLQotI2RlZmluZSBBQ0RCX1JFU19TVUNDRVNTCTAKLSNkZWZpbmUgQUNEQl9SRVNfRkFJTFVSRQktMQotI2RlZmluZSBBQ0RCX1JFU19CQURQQVJNCS0yCi0jZGVmaW5lIEFDREJfUkVTX0JBRFNUQVRFCS0zCi0KLXN0cnVjdCBhY2RiX2NtZF9kZXZpY2UgewotCXVpbnQzMl90IHNpemU7Ci0KLQl1aW50MzJfdCBjb21tYW5kX2lkOwotCXVpbnQzMl90IGRldmljZV9pZDsKLQl1aW50MzJfdCBuZXR3b3JrX2lkOwotCXVpbnQzMl90IHNhbXBsZV9yYXRlX2lkOwotCXVpbnQzMl90IGludGVyZmFjZV9pZDsKLQl1aW50MzJfdCBhbGdvcml0aG1fYmxvY2tfaWQ7Ci0KLQkvKiBwaHlzaWNhbCBwYWdlIGFsaWduZWQgYnVmZmVyICovCi0JdWludDMyX3QgdG90YWxfYnl0ZXM7Ci0JdWludDMyX3QgdW5tYXBwZWRfYnVmOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGFjZGJfY21kX2RldmljZV90YWJsZSB7Ci0JdWludDMyX3Qgc2l6ZTsKLQotCXVpbnQzMl90IGNvbW1hbmRfaWQ7Ci0JdWludDMyX3QgZGV2aWNlX2lkOwotCXVpbnQzMl90IG5ldHdvcmtfaWQ7Ci0JdWludDMyX3Qgc2FtcGxlX3JhdGVfaWQ7Ci0KLQkvKiBwaHlzaWNhbCBwYWdlIGFsaWduZWQgYnVmZmVyICovCi0JdWludDMyX3QgdG90YWxfYnl0ZXM7Ci0JdWludDMyX3QgdW5tYXBwZWRfYnVmOwotCi0JdWludDMyX3QgcmVzX3NpemU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgYWNkYl9yZXN1bHQgewotCXVpbnQzMl90IGRhbF9zdGF0dXM7Ci0JdWludDMyX3Qgc2l6ZTsKLQotCXVpbnQzMl90IHVubWFwcGVkX2J1ZjsKLQl1aW50MzJfdCB1c2VkX2J5dGVzOwotCXVpbnQzMl90IHJlc3VsdDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9kYWxfYWRpZS5oIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvZGFsX2FkaWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkYjA1Zi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9kYWxfYWRpZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfTUFDSF9NU01fUURTUDZfQURJRV8KLSNkZWZpbmUgX01BQ0hfTVNNX1FEU1A2X0FESUVfCi0KLSNpbmNsdWRlICJkYWwuaCIKLQotI2RlZmluZSBBRElFX0RBTF9ERVZJQ0UJCTB4MDIwMDAwMjkKLSNkZWZpbmUgQURJRV9EQUxfUE9SVAkJIkRBTF9BTV9BVUQiCi0KLWVudW0gewotCUFESUVfT1BfR0VUX05VTV9QQVRIUyA9IERBTF9PUF9GSVJTVF9ERVZJQ0VfQVBJLAotCUFESUVfT1BfR0VUX0FMTF9QQVRIX0lEUywKLQlBRElFX09QX1NFVF9QQVRILAotCUFESUVfT1BfR0VUX05VTV9QQVRIX0ZSRVFVRU5DWV9QTEFOUywKLQlBRElFX09QX0dFVF9QQVRIX0ZSRVFVRU5DWV9QTEFOUywKLQlBRElFX09QX1NFVF9QQVRIX0ZSRVFVRU5DWV9QTEFOLAotCUFESUVfT1BfUFJPQ0VFRF9UT19TVEFHRSwKLQlBRElFX09QX01VVEVfUEFUSAotfTsKLQotLyogUGF0aCBJRHMgZm9yIG5vcm1hbCBvcGVyYXRpb24uICovCi0jZGVmaW5lIEFESUVfUEFUSF9IQU5EU0VUX1RYCQkJMHgwMTA3NDBmNgotI2RlZmluZSBBRElFX1BBVEhfSEFORFNFVF9SWAkJCTB4MDEwNzQwZjcKLSNkZWZpbmUgQURJRV9QQVRIX0hFQURTRVRfTU9OT19UWAkJMHgwMTA3NDBmOAotI2RlZmluZSBBRElFX1BBVEhfSEVBRFNFVF9TVEVSRU9fVFgJCTB4MDEwNzQwZjkKLSNkZWZpbmUgQURJRV9QQVRIX0hFQURTRVRfTU9OT19SWAkJMHgwMTA3NDBmYQotI2RlZmluZSBBRElFX1BBVEhfSEVBRFNFVF9TVEVSRU9fUlgJCTB4MDEwNzQwZmIKLSNkZWZpbmUgQURJRV9QQVRIX1NQRUFLRVJfVFgJCQkweDAxMDc0MGZjCi0jZGVmaW5lIEFESUVfUEFUSF9TUEVBS0VSX1JYCQkJMHgwMTA3NDBmZAotI2RlZmluZSBBRElFX1BBVEhfU1BFQUtFUl9TVEVSRU9fUlgJCTB4MDEwNzQxMDEKLQotLyogUGF0aCBJRHMgdXNlZCBmb3IgVFRZICovCi0jZGVmaW5lIEFESUVfUEFUSF9UVFlfSEVBRFNFVF9UWAkJMHgwMTA3NDBmZQotI2RlZmluZSBBRElFX1BBVEhfVFRZX0hFQURTRVRfUlgJCTB4MDEwNzQwZmYKLQotLyogUGF0aCBJRHMgdXNlZCBieSBGYWN0b3J5IFRlc3QgTW9kZS4gKi8KLSNkZWZpbmUgQURJRV9QQVRIX0ZUTV9NSUMxX1RYCQkJMHgwMTA3NDEwOAotI2RlZmluZSBBRElFX1BBVEhfRlRNX01JQzJfVFgJCQkweDAxMDc0MTA3Ci0jZGVmaW5lIEFESUVfUEFUSF9GVE1fSFBIX0xfUlgJCQkweDAxMDc0MTA2Ci0jZGVmaW5lIEFESUVfUEFUSF9GVE1fSFBIX1JfUlgJCQkweDAxMDc0MTA0Ci0jZGVmaW5lIEFESUVfUEFUSF9GVE1fRUFSX1JYCQkJMHgwMTA3NDEwMwotI2RlZmluZSBBRElFX1BBVEhfRlRNX1NQS1JfUlgJCQkweDAxMDc0MTAyCi0KLS8qIFBhdGggSURzIGZvciBMb29wYmFjayAqLwotLyogUGF0aCBJRHMgdXNlZCBmb3IgTGluZSBpbiAtPiBBdXhQR0EgLT4gTGluZSBPdXQgU3RlcmVvIE1vZGUqLwotI2RlZmluZSBBRElFX1BBVEhfQVVYUEdBX0xJTkVPVVRfU1RFUkVPX0xCCTB4MDEwNzQxMDAKLS8qIExpbmUgaW4gLT4gQXV4UEdBIC0+IExpbmVPdXQgTW9ubyAqLwotI2RlZmluZSBBRElFX1BBVEhfQVVYUEdBX0xJTkVPVVRfTU9OT19MQgkweDAxMDczZDgyCi0vKiBMaW5lIGluIC0+IEF1eFBHQSAtPiBTdGVyZW8gSGVhZHBob25lICovCi0jZGVmaW5lIEFESUVfUEFUSF9BVVhQR0FfSERQSF9TVEVSRU9fTEIJCTB4MDEwNzQxMDkKLS8qIExpbmUgaW4gLT4gQXV4UEdBIC0+IE1vbm8gSGVhZHBob25lICovCi0jZGVmaW5lIEFESUVfUEFUSF9BVVhQR0FfSERQSF9NT05PX0xCCQkweDAxMDczZDg1Ci0vKiBMaW5lIGluIC0+IEF1eFBHQSAtPiBFYXJwaWVjZSAqLwotI2RlZmluZSBBRElFX1BBVEhfQVVYUEdBX0VBUF9MQgkJCTB4MDEwNzNkODEKLS8qIExpbmUgaW4gLT4gQXV4UEdBIC0+IEF1eE91dCAqLwotI2RlZmluZSBBRElFX1BBVEhfQVVYUEdBX0FVWE9VVF9MQgkJMHgwMTA3M2Q4NgotCi0vKiBDb25jdXJyZW5jeSBQcm9maWxlcyAqLwotI2RlZmluZSBBRElFX1BBVEhfU1BLUl9TVEVSRU9fSERQSF9NT05PX1JYCTB4MDEwNzNkODMKLSNkZWZpbmUgQURJRV9QQVRIX1NQS1JfTU9OT19IRFBIX01PTk9fUlgJMHgwMTA3M2Q4NAotI2RlZmluZSBBRElFX1BBVEhfU1BLUl9NT05PX0hEUEhfU1RFUkVPX1JYCTB4MDEwNzNkODgKLSNkZWZpbmUgQURJRV9QQVRIX1NQS1JfU1RFUkVPX0hEUEhfU1RFUkVPX1JYCTB4MDEwNzNkODkKLQotCi0vKiogRmx1ZW5jZSBQcm9maWxlcyAqKi8KLQotLyogQnJvYWRzaWRlL0Jvd3NldGFsayBwcm9maWxlLAotICogRm9yIEhhbmRzZXQgYW5kIFNwZWFrZXIgcGhvbmUgVHgqLwotI2RlZmluZSBBRElFX0NPREVDX0hBTkRTRVRfU1BLUl9CU19UWCAgICAgICAgICAweDAxMDhmYWZhCi0vKiBFbmRGaXJlIHByb2ZpbGUsCi0gKiBGb3IgSGFuZHNldCBhbmQgU3BlYWtlciBwaG9uZSBUeCovCi0jZGVmaW5lIEFESUVfQ09ERUNfSEFORFNFVF9TUEtSX0VGX1RYICAgICAgICAgIDB4MDEwOGZhZmIKLQotCi0vKiBzdGFnZXMgKi8KLSNkZWZpbmUgQURJRV9TVEFHRV9QQVRIX09GRgkJCTB4MDA1MAotI2RlZmluZSBBRElFX1NUQUdFX0RJR0lUQUxfUkVBRFkJCTB4MDEwMAotI2RlZmluZSBBRElFX1NUQUdFX0RJR0lUQUxfQU5BTE9HX1JFQURZCQkweDEwMDAKLSNkZWZpbmUgQURJRV9TVEFHRV9BTkFMT0dfT0ZGCQkJMHgwNzUwCi0jZGVmaW5lIEFESUVfU1RBR0VfRElHSVRBTF9PRkYJCQkweDA2MDAKLQotLyogcGF0aCB0eXBlcyAqLwotI2RlZmluZSBBRElFX1BBVEhfUlgJCTAKLSNkZWZpbmUgQURJRV9QQVRIX1RYCQkxCi0jZGVmaW5lIEFESUVfUEFUSF9MT09QQkFDSwkyCi0KLS8qIG11dGUgc3RhdGVzICovCi0jZGVmaW5lIEFESUVfTVVURV9PRkYJCTAKLSNkZWZpbmUgQURJRV9NVVRFX09OCQkxCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9kYWxfYXVkaW8uaCBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2RhbF9hdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzM1M2RiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2RhbF9hdWRpby5oCisrKyAvZGV2L251bGwKQEAgLTEsNjA0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9fREFMX0FVRElPX0hfXwotI2RlZmluZSBfX0RBTF9BVURJT19IX18KLQotI2luY2x1ZGUgImRhbF9hdWRpb19mb3JtYXQuaCIKLQotI2RlZmluZSBBVURJT19EQUxfREVWSUNFIDB4MDIwMDAwMjgKLSNkZWZpbmUgQVVESU9fREFMX1BPUlQgIkRBTF9BUV9BVUQiCi0KLWVudW0gewotCUFVRElPX09QX0NPTlRST0wgPSBEQUxfT1BfRklSU1RfREVWSUNFX0FQSSwKLQlBVURJT19PUF9EQVRBLAotCUFVRElPX09QX0lOSVQsCi19OwkKLQotLyogLS0tLSBjb21tb24gYXVkaW8gc3RydWN0dXJlcyAtLS0tICovCi0KLS8qIFRoaXMgZmxhZywgaWYgc2V0LCBpbmRpY2F0ZXMgdGhhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhIGluIHRoZSovCi0vKiBidWZmZXIgaXMgYSBzeW5jaHJvbml6YXRpb24gcG9pbnQgb3Iga2V5IGZyYW1lLCBtZWFuaW5nIG5vIGRhdGEgKi8KLS8qIGJlZm9yZSBpdCBpbiB0aGUgc3RyZWFtIGlzIHJlcXVpcmVkIGluIG9yZGVyIHRvIHJlbmRlciB0aGUgc3RyZWFtICovCi0vKiBmcm9tIHRoaXMgcG9pbnQgb253YXJkLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0JVRkZFUl9GTEFHX1NZTkNfUE9JTlQgICAgICAgIDB4MDEKLQotLyogVGhpcyBmbGFnLCBpZiBzZXQsIGluZGljYXRlcyB0aGF0IHRoZSBidWZmZXIgb2JqZWN0IGlzIHVzaW5nIHZhbGlkICovCi0vKiBwaHlzaWNhbCBhZGRyZXNzIHVzZWQgdG8gc3RvcmUgdGhlIG1lZGlhIGRhdGEgKi8KLSNkZWZpbmUgQURTUF9BVURJT19CVUZGRVJfRkxBR19QSFlTX0FERFIgICAgICAgICAweDA0Ci0KLS8qIFRoaXMgZmxhZywgaWYgc2V0LCBpbmRpY2F0ZXMgdGhhdCBhIG1lZGlhIHN0YXJ0IHRpbWVzdGFtcCBoYXMgYmVlbiAqLwotLyogc2V0IGZvciBhIGJ1ZmZlci4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19CVUZGRVJfRkxBR19TVEFSVF9TRVQgICAgICAgICAweDA4Ci0KLS8qIFRoaXMgZmxhZywgaWYgc2V0LCBpbmRpY2F0ZXMgdGhhdCBhIG1lZGlhIHN0b3AgdGltZXN0YW1wIGhhcyBiZWVuIHNldCAqLwotLyogZm9yIGEgYnVmZmVyLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0JVRkZFUl9GTEFHX1NUT1BfU0VUICAgICAgICAgIDB4MTAKLQotLyogVGhpcyBmbGFnLCBpZiBzZXQsIGluZGljYXRlcyB0aGF0IGEgcHJlcm9sbCB0aW1lc3RhbXAgaGFzIGJlZW4gc2V0ICovCi0vKiBmb3IgYSBidWZmZXIuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fQlVGRkVSX0ZMQUdfUFJFUk9MTF9TRVQgICAgICAgMHgyMAotCi0vKiBUaGlzIGZsYWcsIGlmIHNldCwgaW5kaWNhdGVzIHRoYXQgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlciBpcyBhIGZyYWdtZW50IG9mICovCi0vKiBhIGxhcmdlciBibG9jayBvZiBkYXRhLCBhbmQgd2lsbCBiZSBjb250aW51ZWQgYnkgdGhlIGRhdGEgaW4gdGhlIG5leHQgKi8KLS8qIGJ1ZmZlciB0byBiZSBkZWxpdmVyZWQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fQlVGRkVSX0ZMQUdfQ09OVElOVUFUSU9OICAgICAgMHg0MAotCi1zdHJ1Y3QgYWRzcF9hdWRpb19idWZmZXIgewotCXUzMiBhZGRyOwkJLyogUGh5c2ljYWwgQWRkcmVzcyBvZiBidWZmZXIgKi8KLQl1MzIgbWF4X3NpemU7CQkvKiBNYXhpbXVtIHNpemUgb2YgYnVmZmVyICovCi0JdTMyIGFjdHVhbF9zaXplOwkvKiBBY3R1YWwgc2l6ZSBvZiB2YWxpZCBkYXRhIGluIHRoZSBidWZmZXIgKi8KLQl1MzIgb2Zmc2V0OwkJLyogT2Zmc2V0IHRvIHRoZSBmaXJzdCB2YWxpZCBieXRlICovCi0JdTMyIGZsYWdzOwkJLyogQURTUF9BVURJT19CVUZGRVJfRkxBR3MgdGhhdCBoYXMgYmVlbiBzZXQgKi8KLQlzNjQgc3RhcnQ7CQkvKiBTdGFydCB0aW1lc3RhbXAsIGlmIGFueSAqLwotCXM2NCBzdG9wOwkJLyogU3RvcCB0aW1lc3RhbXAsIGlmIGFueSAqLwotCXM2NCBwcmVyb2xsOwkJLyogUHJlcm9sbCB0aW1lc3RhbXAsIGlmIGFueSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotCi0vKiAtLS0tIGF1ZGlvIGNvbW1hbmRzIC0tLS0gKi8KLQotLyogQ29tbWFuZC9ldmVudCByZXNwb25zZSB0eXBlcyAqLwotI2RlZmluZSBBRFNQX0FVRElPX1JFU1BPTlNFX0NPTU1BTkQgICAwCi0jZGVmaW5lIEFEU1BfQVVESU9fUkVTUE9OU0VfQVNZTkMgICAgIDEKLQotc3RydWN0IGFkc3BfY29tbWFuZF9oZHIgewotCXUzMiBzaXplOwkJLyogc2l6ZW9mKGNtZCkgLSBzaXplb2YodTMyKSAqLwotCi0JdTMyIGRzdDsKLQl1MzIgc3JjOwotCi0JdTMyIG9wY29kZTsKLQl1MzIgcmVzcG9uc2VfdHlwZTsKLQl1MzIgc2VxX251bWJlcjsKLQotCXUzMiBjb250ZXh0OwkJLyogb3BhcXVlIHRvIERTUCAqLwotCXUzMiBkYXRhOwotCi0JdTMyIHBhZGRpbmc7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotCi0jZGVmaW5lIEFVRElPX0RPTUFJTl9BUFAJMAotI2RlZmluZSBBVURJT19ET01BSU5fTU9ERU0JMQotI2RlZmluZSBBVURJT19ET01BSU5fRFNQCTIKLQotI2RlZmluZSBBVURJT19TRVJWSUNFX0FVRElPCTAKLSNkZWZpbmUgQVVESU9fU0VSVklDRV9WSURFTwkxIC8qIHJlYWxseT8gKi8KLQotLyogYWRzcCBhdWRpbyBhZGRyZXNzZXMgYXJlIChieXRlIG9yZGVyKSBkb21haW4sIHNlcnZpY2UsIG1ham9yLCBtaW5vciAqLwotLy8jZGVmaW5lIEFVRElPX0FERFIobWFqLG1pbikgKCAoKChtYWopICYgMHhmZikgPDwgMTYpIHwgKCgobWluKSAmIDB4ZmYpIDw8IDI0KSB8ICgxKSApCi0KLSNkZWZpbmUgQVVESU9fQUREUihtYWosbWluLGRvbSkgKCAoKChtaW4pICYgMHhmZikgPDwgMjQpIHwgKCgobWFqKSAmIDB4ZmYpIDw8IDE2KSB8ICgoQVVESU9fU0VSVklDRV9BVURJTykgPDwgOCkgfCAoZG9tKSApCi0KLQotLyogQUFDIEVuY29kZXIgbW9kZXMgKi8KLSNkZWZpbmUgQURTUF9BVURJT19FTkNfQUFDX0xDX09OTFlfTU9ERQkJMAotI2RlZmluZSBBRFNQX0FVRElPX0VOQ19BQUNfUExVU19NT0RFCQkxCi0jZGVmaW5lIEFEU1BfQVVESU9fRU5DX0VOSEFOQ0VEX0FBQ19QTFVTX01PREUJMgotCi1zdHJ1Y3QgYWRzcF9hdWRpb19hYWNfZW5jX2NmZyB7Ci0JdTMyIGJpdF9yYXRlOwkJLyogYml0cyBwZXIgc2Vjb25kICovCi0JdTMyIGVuY29kZXJfbW9kZTsJLyogQURTUF9BVURJT19FTkNfKiAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLSNkZWZpbmUgQURTUF9BVURJT19FTkNfU0JDX0FMTE9DQVRJT05fTUVUSE9EX0xPVU5ETkVTUyAgICAgMAotI2RlZmluZSBBRFNQX0FVRElPX0VOQ19TQkNfQUxMT0NBVElPTl9NRVRIT0RfU05SICAgICAgICAgICAxCi0KLSNkZWZpbmUgQURTUF9BVURJT19FTkNfU0JDX0NIQU5ORUxfTU9ERV9NT05PICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQURTUF9BVURJT19FTkNfU0JDX0NIQU5ORUxfTU9ERV9TVEVSRU8gICAgICAgICAgICAgIDIKLSNkZWZpbmUgQURTUF9BVURJT19FTkNfU0JDX0NIQU5ORUxfTU9ERV9EVUFMICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgQURTUF9BVURJT19FTkNfU0JDX0NIQU5ORUxfTU9ERV9KT0lOVF9TVEVSRU8gICAgICAgIDkKLQotc3RydWN0IGFkc3BfYXVkaW9fc2JjX2VuY29kZXJfY2ZnIHsKLQl1MzIgbnVtX3N1YmJhbmRzOwotCXUzMiBibG9ja19sZW47Ci0JdTMyIGNoYW5uZWxfbW9kZTsKLQl1MzIgYWxsb2NhdGlvbl9tZXRob2Q7Ci0JdTMyIGJpdF9yYXRlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIEFNUiBOQiBlbmNvZGVyIG1vZGVzICovCi0jZGVmaW5lIEFEU1BfQVVESU9fQU1SX01SNDc1CTAKLSNkZWZpbmUgQURTUF9BVURJT19BTVJfTVI1MTUJMQotI2RlZmluZSBBRFNQX0FVRElPX0FNUl9NTVI1OQkyCi0jZGVmaW5lIEFEU1BfQVVESU9fQU1SX01NUjY3CTMKLSNkZWZpbmUgQURTUF9BVURJT19BTVJfTU1SNzQJNAotI2RlZmluZSBBRFNQX0FVRElPX0FNUl9NTVI3OTUJNQotI2RlZmluZSBBRFNQX0FVRElPX0FNUl9NTVIxMDIJNgotI2RlZmluZSBBRFNQX0FVRElPX0FNUl9NTVIxMjIJNwotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSB2YWxpZCBBTVIgTkIgRFRYIG1vZGVzICovCi0jZGVmaW5lIEFEU1BfQVVESU9fQU1SX0RUWF9NT0RFX09GRgkJMAotI2RlZmluZSBBRFNQX0FVRElPX0FNUl9EVFhfTU9ERV9PTl9WQUQxCQkxCi0jZGVmaW5lIEFEU1BfQVVESU9fQU1SX0RUWF9NT0RFX09OX1ZBRDIJCTIKLSNkZWZpbmUgQURTUF9BVURJT19BTVJfRFRYX01PREVfT05fQVVUTwkJMwotCi0vKiBBTVIgRW5jb2RlciBjb25maWd1cmF0aW9uICovCi1zdHJ1Y3QgYWRzcF9hdWRpb19hbXJfZW5jX2NmZyB7Ci0JdTMyCW1vZGU7CQkvKiBBRFNQX0FVRElPX0FNUl9NUiogKi8KLQl1MzIJZHR4X21vZGU7CS8qIEFEU1BfQVVESU9fQU1SX0RUWF9NT0RFKiAqLwotCXUzMgllbmFibGU7CQkvKiAxID0gZW5hYmxlLCAwID0gZGlzYWJsZSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBhZHNwX2F1ZGlvX3FjZWxwMTNrX2VuY19jZmcgewotCXUxNgltaW5fcmF0ZTsKLQl1MTYJbWF4X3JhdGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGFkc3BfYXVkaW9fZXZyY19lbmNfY2ZnIHsKLQl1MTYJbWluX3JhdGU7Ci0JdTE2CW1heF9yYXRlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXVuaW9uIGFkc3BfYXVkaW9fY29kZWNfY29uZmlnIHsKLQlzdHJ1Y3QgYWRzcF9hdWRpb19hbXJfZW5jX2NmZyBhbXI7Ci0Jc3RydWN0IGFkc3BfYXVkaW9fYWFjX2VuY19jZmcgYWFjOwotCXN0cnVjdCBhZHNwX2F1ZGlvX3FjZWxwMTNrX2VuY19jZmcgcWNlbHAxM2s7Ci0Jc3RydWN0IGFkc3BfYXVkaW9fZXZyY19lbmNfY2ZnIGV2cmM7Ci0Jc3RydWN0IGFkc3BfYXVkaW9fc2JjX2VuY29kZXJfY2ZnIHNiYzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0KLS8qIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fT1BFTl9TVFJFQU1fTU9ERV9OT05FCQkweDAwMDAKLQotLyogVGhpcyBiaXQsIGlmIHNldCwgaW5kaWNhdGVzIHRoYXQgdGhlIEFWU3luYyBtb2RlIGlzIGFjdGl2YXRlZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19PUEVOX1NUUkVBTV9NT0RFX0FWU1lOQwkJMHgwMDAxCi0KLS8qIFRoaXMgYml0LCBpZiBzZXQsIGluZGljYXRlcyB0aGF0IHRoZSBTYW1wbGUgUmF0ZS9DaGFubmVsIE1vZGUgKi8KLS8qIENoYW5nZSBOb3RpZmljYXRpb24gbW9kZSBpcyBhY3RpdmF0ZWQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fT1BFTl9TVFJFQU1fTU9ERV9TUl9DTV9OT1RJRlkJMHgwMDAyCi0KLS8qIFRoaXMgYml0LCBpZiBzZXQsIGluZGljYXRlcyB0aGF0IHRoZSBzeW5jIGNsb2NrIGlzIGVuYWJsZWQgKi8KLSNkZWZpbmUgIEFEU1BfQVVESU9fT1BFTl9TVFJFQU1fTU9ERV9FTkFCTEVfU1lOQ19DTE9DSwkweDAwMDQKLQotLyogVGhpcyBiaXQsIGlmIHNldCwgaW5kaWNhdGVzIHRoYXQgdGhlIEFVWCBQQ00gbG9vcGJhY2sgaXMgZW5hYmxlZCAqLwotI2RlZmluZSAgQURTUF9BVURJT19PUEVOX1NUUkVBTV9NT0RFX0FVWF9QQ00JCTB4MDA0MAotCi1zdHJ1Y3QgYWRzcF9vcGVuX2NvbW1hbmQgewotCXN0cnVjdCBhZHNwX2NvbW1hbmRfaGRyIGhkcjsKLQotCXUzMiBkZXZpY2U7Ci0JdTMyIGVuZHBvaW50OyAvKiBhZGRyZXNzICovCi0KLQl1MzIgc3RyZWFtX2NvbnRleHQ7Ci0JdTMyIG1vZGU7Ci0KLQl1MzIgYnVmX21heF9zaXplOwotCi0JdW5pb24gYWRzcF9hdWRpb19mb3JtYXQgZm9ybWF0OwotCXVuaW9uIGFkc3BfYXVkaW9fY29kZWNfY29uZmlnIGNvbmZpZzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0KLS8qIC0tLSBhdWRpbyBjb250cm9sIGFuZCBzdHJlYW0gc2Vzc2lvbiBpb2N0bHMgLS0tLSAqLwotCi0vKiBPcGNvZGUgdG8gb3BlbiBhIGRldmljZSBzdHJlYW0gc2Vzc2lvbiB0byBjYXB0dXJlIGF1ZGlvICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX09QRU5fUkVBRAkJCTB4MDEwOGRkNzkKLQotLyogT3Bjb2RlIHRvIG9wZW4gYSBkZXZpY2Ugc3RyZWFtIHNlc3Npb24gdG8gcmVuZGVyIGF1ZGlvICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX09QRU5fV1JJVEUJCQkweDAxMDhkZDdhCi0KLS8qIE9wY29kZSB0byBvcGVuIGEgZGV2aWNlIHNlc3Npb24sIG11c3Qgb3BlbiBhIGRldmljZSAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9PUEVOX0RFVklDRQkJMHgwMTA4ZGQ3YgotCi0vKiBDbG9zZSBhbiBleGlzdGluZyBzdHJlYW0gb3IgZGV2aWNlICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX0NMT1NFCQkJMHgwMTA4ZDhiYwotCi0KLQotLyogQSBkZXZpY2Ugc3dpdGNoIHJlcXVpcmVzIHRocmVlIElPQ1RMICovCi0vKiBjb21tYW5kcyBpbiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlOiBQUkVQQVJFLCBTVEFOREJZLCBDT01NSVQgKi8KLQotLyogYWRzcF9hdWRpb19kZXZpY2Vfc3dpdGNoX2NvbW1hbmQgc3RydWN0dXJlIGlzIG5lZWRlZCBmb3IgKi8KLS8qIERFVklDRV9TV0lUQ0hfUFJFUEFSRSAqLwotCi0vKiBEZXZpY2Ugc3dpdGNoIHByb3RvY29sIHN0ZXAgIzEuIFBhdXNlIG9sZCBkZXZpY2UgYW5kICovCi0vKiBnZW5lcmF0ZSBzaWxlbmNlIGZvciB0aGUgb2xkIGRldmljZS4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9DTURfREVWSUNFX1NXSVRDSF9QUkVQQVJFCTB4MDEwODE1YzQKLQotLyogRGV2aWNlIHN3aXRjaCBwcm90b2NvbCBzdGVwICMyLiBSZWxlYXNlIG9sZCBkZXZpY2UsICovCi0vKiBjcmVhdGUgbmV3IGRldmljZSBhbmQgZ2VuZXJhdGUgc2lsZW5jZSBmb3IgdGhlIG5ldyBkZXZpY2UuICovCi0KLS8qIFdoZW4gY2xpZW50IHJlY2VpdmVzIGFjayBmb3IgdGhpcyBJT0NUTCwgdGhlIGNsaWVudCBjYW4gKi8KLS8qIHN0YXJ0IHNlbmRpbmcgSU9DVEwgY29tbWFuZHMgdG8gY29uZmlndXJlLCBjYWxpYnJhdGUgYW5kICovCi0vKiBjaGFuZ2UgZmlsdGVyIHNldHRpbmdzIG9uIHRoZSBuZXcgZGV2aWNlLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9ERVZJQ0VfU1dJVENIX1NUQU5EQlkJMHgwMTA4MTVjNQotCi0vKiBEZXZpY2Ugc3dpdGNoIHByb3RvY29sIHN0ZXAgIzMuIFN0YXJ0IG5vcm1hbCBvcGVyYXRpb25zIG9uIG5ldyBkZXZpY2UgKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9DTURfREVWSUNFX1NXSVRDSF9DT01NSVQJMHgwMTA3NWVlNwotCi1zdHJ1Y3QgYWRzcF9kZXZpY2Vfc3dpdGNoX2NvbW1hbmQgewotCXN0cnVjdCBhZHNwX2NvbW1hbmRfaGRyIGhkcjsKLQl1MzIgb2xkX2RldmljZTsKLQl1MzIgbmV3X2RldmljZTsKLQl1OCBkZXZpY2VfY2xhc3M7IC8qIDAgPSBpLnJ4LCAxID0gaS50eCwgMiA9IGUucngsIDMgPSBlLnR4ICovCi0JdTggZGV2aWNlX3R5cGU7IC8qIDAgPSByeCwgMSA9IHR4LCAyID0gYm90aCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotCi0vKiAtLS0gYXVkaW8gY29udHJvbCBzZXNzaW9uIGlvY3RscyAtLS0tICovCi0KLSNkZWZpbmUgQURTUF9QQVRIX1JYCTAKLSNkZWZpbmUgQURTUF9QQVRIX1RYCTEKLSNkZWZpbmUgQURTUF9QQVRIX0JPVEgJMgotI2RlZmluZSBBRFNQX1BBVEhfVFhfQ05HX0RJUyAzCi0KLXN0cnVjdCBhZHNwX2F1ZGlvX2R0bWZfc3RhcnRfY29tbWFuZCB7Ci0Jc3RydWN0IGFkc3BfY29tbWFuZF9oZHIgaGRyOwotCXUzMiB0b25lMV9oejsKLQl1MzIgdG9uZTJfaHo7Ci0JdTMyIGR1cmF0aW9uX3VzZWM7Ci0JczMyIGdhaW5fbWI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogVGhlc2UgY29tbWFuZHMgd2lsbCBhZmZlY3QgYSBsb2dpY2FsIGRldmljZSBhbmQgYWxsIGl0cyBhc3NvY2lhdGVkICovCi0vKiBzdHJlYW1zLiAqLwotCi0jZGVmaW5lIEFEU1BfQVVESU9fTUFYX0VRX0JBTkRTIDEyCi0KLXN0cnVjdCBhZHNwX2F1ZGlvX2VxX2JhbmQgewotCXUxNiAgICAgYmFuZF9pZHg7IC8qIFRoZSBiYW5kIGluZGV4LCAwIC4uIDExICovCi0JdTMyICAgICBmaWx0ZXJfdHlwZTsgLyogRmlsdGVyIGJhbmQgdHlwZSAqLwotCXUzMiAgICAgY2VudGVyX2ZyZXFfaHo7IC8qIEZpbHRlciBiYW5kIGNlbnRlciBmcmVxdWVuY3kgKi8KLQlzMzIgICAgIGZpbHRlcl9nYWluOyAvKiBGaWx0ZXIgYmFuZCBpbml0aWFsIGdhaW4gKGRCKSAqLwotCQkJLyogUmFuZ2UgaXMgKzEyIGRCIHRvIC0xMiBkQiB3aXRoIDFkQiBpbmNyZW1lbnRzLiAqLwotCXMzMiAgICAgcV9mYWN0b3I7Ci0JCS8qIEZpbHRlciBiYW5kIHF1YWxpdHkgZmFjdG9yIGV4cHJlc3NlZCBhcyBxLTggbnVtYmVyLCAqLwotCQkvKiBlLmcuIDMwMDAvKDJeOCkgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgYWRzcF9hdWRpb19lcV9zdHJlYW1fY29uZmlnIHsKLQl1aW50MzJfdCAgZW5hYmxlOyAvKiBOdW1iZXIgb2YgY29uc2VxdXRpdmUgYmFuZHMgc3BlY2lmaWVkICovCi0JdWludDMyX3QgIG51bV9iYW5kczsKLQlzdHJ1Y3QgYWRzcF9hdWRpb19lcV9iYW5kICBlcV9iYW5kc1tBRFNQX0FVRElPX01BWF9FUV9CQU5EU107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogc2V0IGRldmljZSBlcXVhbGl6ZXIgKi8KLXN0cnVjdCBhZHNwX3NldF9kZXZfZXF1YWxpemVyX2NvbW1hbmQgewotCXN0cnVjdCBhZHNwX2NvbW1hbmRfaGRyIGhkcjsKLQl1MzIgICAgZGV2aWNlX2lkOwotCXUzMiAgICBlbmFibGU7Ci0JdTMyICAgIG51bV9iYW5kczsKLQlzdHJ1Y3QgYWRzcF9hdWRpb19lcV9iYW5kIGVxX2JhbmRzW0FEU1BfQVVESU9fTUFYX0VRX0JBTkRTXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBTZXQgZGV2aWNlIHZvbHVtZS4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9DTURfU0VUX0RFVklDRV9WT0wJCTB4MDEwNzYwNWMKLQotc3RydWN0IGFkc3Bfc2V0X2Rldl92b2x1bWVfY29tbWFuZCB7Ci0Jc3RydWN0IGFkc3BfY29tbWFuZF9oZHIgaGRyOwotCXUzMiBkZXZpY2VfaWQ7Ci0JdTMyIHBhdGg7IC8qIDAgPSByeCwgMSA9IHR4LCAyID0gYm90aCAqLwotCXMzMiB2b2x1bWU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogU2V0IERldmljZSBzdGVyZW8gdm9sdW1lLiBUaGlzIGNvbW1hbmQgaGFzIGRhdGEgcGF5bG9hZCwgKi8KLS8qIHN0cnVjdCBhZHNwX2F1ZGlvX3NldF9kZXZfc3RlcmVvX3ZvbHVtZV9jb21tYW5kLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX1NFVF9ERVZJQ0VfU1RFUkVPX1ZPTAkJMHgwMTA4ZGYzZQotCi0vKiBTZXQgTCwgUiBjcm9zcyBjaGFubmVsIGdhaW4gZm9yIGEgRGV2aWNlLiBUaGlzIGNvbW1hbmQgaGFzICovCi0vKiBkYXRhIHBheWxvYWQsIHN0cnVjdCBhZHNwX2F1ZGlvX3NldF9kZXZfeF9jaGFuX2dhaW5fY29tbWFuZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9TRVRfREVWSUNFX1hDSEFOX0dBSU4JCTB4MDEwOGRmNDAKLQotLyogU2V0IGRldmljZSBtdXRlIHN0YXRlLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVRfREVWSUNFX01VVEUJCTB4MDEwNzYwNWYKLQotc3RydWN0IGFkc3Bfc2V0X2Rldl9tdXRlX2NvbW1hbmQgewotCXN0cnVjdCBhZHNwX2NvbW1hbmRfaGRyIGhkcjsKLQl1MzIgZGV2aWNlX2lkOwotCXUzMiBwYXRoOyAvKiAwID0gcngsIDEgPSB0eCwgMiA9IGJvdGggKi8KLQl1MzIgbXV0ZTsgLyogMSA9IG11dGUgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBDb25maWd1cmUgRXF1YWxpemVyIGZvciBhIGRldmljZS4gKi8KLS8qIFRoaXMgY29tbWFuZCBoYXMgcGF5bG9hZCBzdHJ1Y3QgYWRzcF9hdWRpb19zZXRfZGV2X2VxdWFsaXplcl9jb21tYW5kLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVRfREVWSUNFX0VRX0NPTkZJRwkweDAxMDhiMTBlCi0KLS8qIFNldCBjb25maWd1cmF0aW9uIGRhdGEgZm9yIGFuIGFsZ29yaXRobSBhc3BlY3Qgb2YgYSBkZXZpY2UuICovCi0vKiBUaGlzIGNvbW1hbmQgaGFzIHBheWxvYWQgc3RydWN0IGFkc3BfYXVkaW9fc2V0X2Rldl9jZmdfY29tbWFuZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9TRVRfREVWSUNFX0NPTkZJRwkJMHgwMTA4YjZjYgotCi1zdHJ1Y3QgYWRzcF9zZXRfZGV2X2NmZ19jb21tYW5kIHsKLQlzdHJ1Y3QgYWRzcF9jb21tYW5kX2hkciBoZHI7Ci0JdTMyIGRldmljZV9pZDsKLQl1MzIgYmxvY2tfaWQ7Ci0JdTMyIGludGVyZmFjZV9pZDsKLQl1MzIgcGh5c19hZGRyOwotCXUzMiBwaHlzX3NpemU7Ci0JdTMyIHBoeXNfdXNlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBTZXQgY29uZmlndXJhdGlvbiBkYXRhIGZvciBhbGwgaW50ZXJmYWNlcyBvZiBhIGRldmljZS4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9TRVRfREVWSUNFX0NPTkZJR19UQUJMRQkweDAxMDhiNmJmCi0KLXN0cnVjdCBhZHNwX3NldF9kZXZfY2ZnX3RhYmxlX2NvbW1hbmQgewotCXN0cnVjdCBhZHNwX2NvbW1hbmRfaGRyIGhkcjsKLQl1MzIgZGV2aWNlX2lkOwotCXUzMiBwaHlzX2FkZHI7Ci0JdTMyIHBoeXNfc2l6ZTsKLQl1MzIgcGh5c191c2VkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIC0tLS0gYXVkaW8gc3RyZWFtIGRhdGEgY29tbWFuZHMgLS0tLSAqLwotCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX0RBVEFfVFgJCQkweDAxMDhkZDdmCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX0RBVEFfUlgJCQkweDAxMDhkZDgwCi0KLXN0cnVjdCBhZHNwX2J1ZmZlcl9jb21tYW5kIHsKLQlzdHJ1Y3QgYWRzcF9jb21tYW5kX2hkciBoZHI7Ci0Jc3RydWN0IGFkc3BfYXVkaW9fYnVmZmVyIGJ1ZmZlcjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0KLQotLyogLS0tLSBhdWRpbyBzdHJlYW0gaW9jdGxzIChvbmx5IGFmZmVjdCBhIHNpbmdsZSBzdHJlYW0gaW4gYSBzZXNzaW9uKSAtLS0tICovCi0KLS8qIFN0b3Agc3RyZWFtIGZvciBhdWRpbyBkZXZpY2UuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX1NUUkVBTV9TVE9QCQkweDAxMDc1YzU0Ci0KLS8qIEVuZCBvZiBzdHJlYW0gcmVhY2hlZC4gQ2xpZW50IHdpbGwgbm90IHNlbmQgYW55IG1vcmUgZGF0YS4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9DTURfU1RSRUFNX0VPUwkJCTB4MDEwOGIxNTAKLQotLyogRG8gc2FtcGxlIHNsaXBwaW5nL3N0dWZmaW5nIG9uIEFBQyBvdXRwdXRzLiBUaGUgcGF5bG9hZCBvZiAqLwotLyogdGhpcyBjb21tYW5kIGlzIHN0cnVjdCBhZHNwX2F1ZGlvX3NsaXBfc2FtcGxlX2NvbW1hbmQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX1NUUkVBTV9TTElQU0FNUExFCQkweDAxMDhkNDBlCi0KLS8qIFNldCBzdHJlYW0gdm9sdW1lLiAqLwotLyogVGhpcyBjb21tYW5kIGhhcyBkYXRhIHBheWxvYWQsIHN0cnVjdCBhZHNwX2F1ZGlvX3NldF92b2x1bWVfY29tbWFuZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9DTURfU0VUX1NUUkVBTV9WT0wJCTB4MDEwOGMwZGUKLQotLyogU2V0IHN0cmVhbSBzdGVyZW8gdm9sdW1lLiBUaGlzIGNvbW1hbmQgaGFzIGRhdGEgcGF5bG9hZCwgKi8KLS8qIHN0cnVjdCBhZHNwX2F1ZGlvX3NldF9zdGVyZW9fdm9sdW1lX2NvbW1hbmQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfU0VUX1NUUkVBTV9TVEVSRU9fVk9MCQkweDAxMDhkZDdjCi0KLS8qIFNldCBMLCBSIGNyb3NzIGNoYW5uZWwgZ2FpbiBmb3IgYSBTdHJlYW0uIFRoaXMgY29tbWFuZCBoYXMgKi8KLS8qIGRhdGEgcGF5bG9hZCwgc3RydWN0IGFkc3BfYXVkaW9fc2V0X3hfY2hhbl9nYWluX2NvbW1hbmQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfU0VUX1NUUkVBTV9YQ0hBTl9HQUlOCQkweDAxMDhkZDdkCi0KLS8qIFNldCBzdHJlYW0gbXV0ZSBzdGF0ZS4gKi8KLS8qIFRoaXMgY29tbWFuZCBoYXMgZGF0YSBwYXlsb2FkLCBzdHJ1Y3QgYWRzcF9hdWRpb19zZXRfc3RyZWFtX211dGUuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX1NFVF9TVFJFQU1fTVVURQkJMHgwMTA4YzBkZgotCi0vKiBSZWNvbmZpZ3VyZSBiaXQgcmF0ZSBpbmZvcm1hdGlvbi4gVGhpcyBjb21tYW5kIGhhcyBkYXRhICovCi0vKiBwYXlsb2FkLCBzdHJ1Y3QgYWRzcF9hdWRpb19zZXRfYml0X3JhdGVfY29tbWFuZCAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX1NFVF9TVFJFQU1fQklUUkFURQkJMHgwMTA4Y2NmMQotCi0vKiBTZXQgQ2hhbm5lbCBNYXBwaW5nLiBUaGlzIGNvbW1hbmQgaGFzIGRhdGEgcGF5bG9hZCwgc3RydWN0ICovCi0vKiBUaGlzIGNvbW1hbmQgaGFzIGRhdGEgcGF5bG9hZCBzdHJ1Y3QgYWRzcF9hdWRpb19zZXRfY2hhbm5lbF9tYXBfY29tbWFuZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9TRVRfU1RSRUFNX0NIQU5ORUxNQVAJCTB4MDEwOGQzMmEKLQotLyogRW5hYmxlL2Rpc2FibGUgQUFDUGx1cyBTQlIuICovCi0vKiBUaGlzIGNvbW1hbmQgaGFzIGRhdGEgcGF5bG9hZCBzdHJ1Y3QgYWRzcF9hdWRpb19zZXRfc2JyX2NvbW1hbmQgKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9TRVRfU1RSRUFNX1NCUgkJCTB4MDEwOGQ0MTYKLQotLyogRW5hYmxlL2Rpc2FibGUgV01BIFBybyBDaGV4IGFuZCBGZXguIFRoaXMgY29tbWFuZCBoYXMgZGF0YSBwYXlsb2FkICovCi0vKiBzdHJ1Y3QgYWRzcF9hdWRpb19zdHJlYW1fc2V0X3dtYV9jb21tYW5kLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX1NFVF9TVFJFQU1fV01BUFJPCQkweDAxMDhkNDE3Ci0KLQotLyogLS0tLSBhdWRpbyBzZXNzaW9uIGlvY3RscyAoYWZmZWN0IGFsbCBzdHJlYW1zIGluIGEgc2Vzc2lvbikgLS0tICovCi0KLS8qIFN0YXJ0IHN0cmVhbSBmb3IgYXVkaW8gZGV2aWNlLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVNTSU9OX1NUQVJUCQkweDAxMDgxNWM2Ci0KLS8qIFN0b3AgYWxsIHN0cmVhbShzKSBmb3IgYXVkaW8gc2Vzc2lvbiBhcyBpbmRpY2F0ZWQgYnkgbWFqb3IgaWQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX1NFU1NJT05fU1RPUAkJMHgwMTA4ZGQ3ZQotCi0vKiBQYXVzZSB0aGUgZGF0YSBmbG93IGZvciBhIHNlc3Npb24gYXMgaW5kaWNhdGVkIGJ5IG1ham9yIGlkLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVNTSU9OX1BBVVNFCQkweDAxMDc1ZWU4Ci0KLS8qIFJlc3VtZSB0aGUgZGF0YSBmbG93IGZvciBhIHNlc3Npb24gYXMgaW5kaWNhdGVkIGJ5IG1ham9yIGlkLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVNTSU9OX1JFU1VNRQkJMHgwMTA3NWVlOQotCi0vKiBEcm9wIGFueSB1bnByb2Nlc3NlZCBkYXRhIGJ1ZmZlcnMgZm9yIGEgc2Vzc2lvbiBhcyBpbmRpY2F0ZWQgYnkgbWFqb3IgaWQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX1NFU1NJT05fRkxVU0gJCTB4MDEwNzVlZWEKLQotLyogU3RhcnQgU3RyZWFtIERUTUYgdG9uZSAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVNTSU9OX0RUTUZfU1RBUlQJCTB4MDEwOGMwZGQKLQotLyogU3RvcCBTdHJlYW0gRFRNRiB0b25lICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfQ01EX1NFU1NJT05fRFRNRl9TVE9QCQkweDAxMDg3NTU0Ci0KLS8qIFNldCBTZXNzaW9uIHZvbHVtZS4gKi8KLS8qIFRoaXMgY29tbWFuZCBoYXMgZGF0YSBwYXlsb2FkLCBzdHJ1Y3QgYWRzcF9hdWRpb19zZXRfdm9sdW1lX2NvbW1hbmQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fSU9DVExfU0VUX1NFU1NJT05fVk9MCQkweDAxMDhkOGJkCi0KLS8qIFNldCBzZXNzaW9uIHN0ZXJlbyB2b2x1bWUuIFRoaXMgY29tbWFuZCBoYXMgZGF0YSBwYXlsb2FkLCAqLwotLyogc3RydWN0IGFkc3BfYXVkaW9fc2V0X3N0ZXJlb192b2x1bWVfY29tbWFuZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9TRVRfU0VTU0lPTl9TVEVSRU9fVk9MCQkweDAxMDhkZjNkCi0KLS8qIFNldCBMLCBSIGNyb3NzIGNoYW5uZWwgZ2FpbiBmb3IgYSBzZXNzaW9uLiBUaGlzIGNvbW1hbmQgaGFzICovCi0vKiBkYXRhIHBheWxvYWQsIHN0cnVjdCBhZHNwX2F1ZGlvX3NldF94X2NoYW5fZ2Fpbl9jb21tYW5kLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX1NFVF9TRVNTSU9OX1hDSEFOX0dBSU4JCTB4MDEwOGRmM2YKLQotLyogU2V0IFNlc3Npb24gbXV0ZSBzdGF0ZS4gKi8KLS8qIFRoaXMgY29tbWFuZCBoYXMgZGF0YSBwYXlsb2FkLCBzdHJ1Y3QgYWRzcF9hdWRpb19zZXRfbXV0ZV9jb21tYW5kLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX1NFVF9TRVNTSU9OX01VVEUJCTB4MDEwOGQ4YmUKLQotLyogQ29uZmlndXJlIEVxdWFsaXplciBmb3IgYSBzdHJlYW0uICovCi0vKiBUaGlzIGNvbW1hbmQgaGFzIHBheWxvYWQgc3RydWN0IGFkc3BfYXVkaW9fc2V0X2VxdWFsaXplcl9jb21tYW5kLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX1NFVF9TRVNTSU9OX0VRX0NPTkZJRwkJMHgwMTA4YzBlMAotCi0vKiBTZXQgQXVkaW8gVmlkZW8gc3luYyBpbmZvcm1hdGlvbi4gKi8KLS8qIFRoaXMgY29tbWFuZCBoYXMgZGF0YSBwYXlsb2FkLCBzdHJ1Y3QgYWRzcF9hdWRpb19zZXRfYXZfc3luY19jb21tYW5kLiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0lPQ1RMX1NFVF9TRVNTSU9OX0FWU1lOQwkJMHgwMTA4ZDFlMgotCi0vKiBHZXQgQXVkaW8gTWVkaWEgU2Vzc2lvbiB0aW1lLiAqLwotLyogVGhpcyBjb21tYW5kIHJldHVybnMgdGhlIGF1ZGlvVGltZSBpbiBhZHNwX2F1ZGlvX3Vuc2lnbmVkNjRfZXZlbnQgKi8KLSNkZWZpbmUgQURTUF9BVURJT19JT0NUTF9DTURfR0VUX0FVRElPX1RJTUUJCTB4MDEwOGMyNmMKLQotCi0vKiB0aGVzZSBjb21tYW5kIHN0cnVjdHVyZXMgYXJlIHVzZWQgZm9yIGJvdGggU1RSRUFNIGFuZCBTRVNTSU9OIGlvY3RscyAqLwotCi1zdHJ1Y3QgYWRzcF9zZXRfdm9sdW1lX2NvbW1hbmQgewotCXN0cnVjdCBhZHNwX2NvbW1hbmRfaGRyIGhkcjsKLQlzMzIgdm9sdW1lOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0JCi1zdHJ1Y3QgYWRzcF9zZXRfbXV0ZV9jb21tYW5kIHsKLQlzdHJ1Y3QgYWRzcF9jb21tYW5kX2hkciBoZHI7Ci0JdTMyIG11dGU7IC8qIDEgPT0gbXV0ZSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotc3RydWN0IGFkc3Bfc2V0X2VxdWFsaXplcl9jb21tYW5kIHsKLQlzdHJ1Y3QgYWRzcF9jb21tYW5kX2hkciBoZHI7Ci0JdTMyICAgIGVuYWJsZTsKLQl1MzIgICAgbnVtX2JhbmRzOwotCXN0cnVjdCBhZHNwX2F1ZGlvX2VxX2JhbmQgZXFfYmFuZHNbQURTUF9BVURJT19NQVhfRVFfQkFORFNdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIC0tLS0gYXVkaW8gZXZlbnRzIC0tLS0gKi8KLQotLyogQWxsIElPQ1RMIGNvbW1hbmRzIGdlbmVyYXRlIGFuIGV2ZW50IHdpdGggdGhlIElPQ1RMIG9wY29kZSBhcyB0aGUgKi8KLS8qIGV2ZW50IGlkIGFmdGVyIHRoZSBJT0NUTCBjb21tYW5kIGhhcyBiZWVuIGV4ZWN1dGVkLiAqLwotCi0vKiBUaGlzIGV2ZW50IGlzIGdlbmVyYXRlZCBhZnRlciBhIG1lZGlhIHN0cmVhbSBzZXNzaW9uIGlzIG9wZW5lZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19FVlRfU1RBVFVTX09QRU4JCQkJMHgwMTA4YzBkNgotCi0vKiBUaGlzIGV2ZW50IGlzIGdlbmVyYXRlZCBhZnRlciBhIG1lZGlhIHN0cmVhbSAgc2Vzc2lvbiBpcyBjbG9zZWQuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRVZUX1NUQVRVU19DTE9TRQkJCQkweDAxMDhjMGQ3Ci0KLS8qIEFzeW5jcm9ub3VzIGJ1ZmZlciBjb25zdW1wdGlvbi4gVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgYWZ0ZXIgYSAqLwotLyogcmVjaXZlZCAgYnVmZmVyIGlzIGNvbnN1bWVkIGR1cmluZyByZW5kZXJpbmcgb3IgZmlsbGVkIGR1cmluZyAqLwotLyogY2FwdHVyZSBvcGVhcnRpb24uICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRVZUX1NUQVRVU19CVUZfRE9ORQkJCQkweDAxMDhjMGQ4Ci0KLS8qIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gcmVuZGVyaW5nIG9wZXJhdGlvbiBpcyBzdGFydmluZyBmb3IgKi8KLS8qIGRhdGEuIEluIG9yZGVyIHRvIGF2b2lkIGF1ZGlvIGxvc3MgYXQgdGhlIGVuZCBvZiBhIHBsYXViYWNrLCB0aGUgKi8KLS8qIGNsaWVudCBzaG91bGQgd2FpdCBmb3IgdGhpcyBldmVudCBiZWZvcmUgaXNzdWluZyB0aGUgY2xvc2UgY29tbWFuZC4gKi8KLSNkZWZpbmUgQURTUF9BVURJT19FVlRfU1RBVFVTX0JVRl9VTkRFUlJVTgkJCTB4MDEwOGMwZDkKLQotLyogVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgZHVyaW5nIGNhcHR1cmUgb3BlcmF0aW9uIHdoZW4gdGhlcmUgYXJlIG5vICovCi0vKiBidWZmZXJzIGF2YWlsYWJsZSB0byBjb3B5IHRoZSBjYXB0dXJlZCBhdWRpbyBkYXRhICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRVZUX1NUQVRVU19CVUZfT1ZFUkZMT1cJCQkweDAxMDhjMGRhCi0KLS8qIFRoaXMgYXN5bmNocm9ub3VzIGV2ZW50IGlzIGdlbmVyYXRlZCBhcyBhIHJlc3VsdCBvZiBhbiBpbnB1dCAqLwotLyogc2FtcGxlIHJhdGUgY2hhbmdlIGFuZC9vciBjaGFubmVsIG1vZGUgY2hhbmdlIGRldGVjdGVkIGJ5IHRoZSAqLwotLyogZGVjb2Rlci4gVGhlIGV2ZW50IHBheWxvYWQgZGF0YSBpcyBhbiBhcnJheSBvZiAyIHVpbnQzMiAqLwotLyogdmFsdWVzIGNvbnRhaW5pbmcgdGhlIHNhbXBsZSByYXRlIGluIEh6IGFuZCBjaGFubmVsIG1vZGUuICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRVZUX1NSX0NNX0NIQU5HRQkJCQkweDAxMDhkMzI5Ci0KLXN0cnVjdCBhZHNwX2V2ZW50X2hkciB7Ci0JdTMyIGV2dF9oYW5kbGU7CQkvKiBEQUwgY29tbW9uIGhlYWRlciAqLwotCXUzMiBldnRfY29va2llOwotCXUzMiBldnRfbGVuZ3RoOwotCi0JdTMyIHNyYzsJCS8qICJzb3VyY2UiIGF1ZGlvIGFkZHJlc3MgKi8KLQl1MzIgZHN0OwkJLyogImRlc3RpbmF0aW9uIiBhdWRpbyBhZGRyZXNzICovCi0KLQl1MzIgZXZlbnRfaWQ7Ci0JdTMyIHJlc3BvbnNlX3R5cGU7Ci0JdTMyIHNlcV9udW1iZXI7Ci0KLQl1MzIgY29udGV4dDsJCS8qIG9wYXF1ZSB0byBEU1AgKi8KLQl1MzIgZGF0YTsKLQotCXUzMiBzdGF0dXM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGFkc3BfYnVmZmVyX2V2ZW50IHsKLQlzdHJ1Y3QgYWRzcF9ldmVudF9oZHIgaGRyOwotCXN0cnVjdCBhZHNwX2F1ZGlvX2J1ZmZlciBidWZmZXI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotCi0vKiAtLS0tIGF1ZGlvIGRldmljZSBJRHMgLS0tLSAqLwotCi0vKiBEZXZpY2UgZGlyZWN0aW9uIFJ4L1R4IGZsYWcgKi8KLSNkZWZpbmUgQURTUF9BVURJT19SWF9ERVZJQ0UJCTB4MDAKLSNkZWZpbmUgQURTUF9BVURJT19UWF9ERVZJQ0UJCTB4MDEKLQotLyogRGVmYXVsdCBSWCBvciBUWCBkZXZpY2UgKi8KLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfREVGQVVMVAkJMHgxMDgxNjc5Ci0KLS8qIFNvdXJjZSAoVFgpIGRldmljZXMgKi8KLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfSEFORFNFVF9NSUMJMHgxMDdhYzhkCi0jZGVmaW5lIEFEU1BfQVVESU9fREVWSUNFX0lEX0hFQURTRVRfTUlDCTB4MTA4MTUxMAotI2RlZmluZSBBRFNQX0FVRElPX0RFVklDRV9JRF9TUEtSX1BIT05FX01JQwkweDEwODE1MTIKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfQlRfU0NPX01JQwkJMHgxMDgxNTE4Ci0jZGVmaW5lIEFEU1BfQVVESU9fREVWSUNFX0lEX0FVWFBDTV9UWAkJMHgxMDgxNTE4Ci0jZGVmaW5lIEFEU1BfQVVESU9fREVWSUNFX0lEX1RUWV9IRUFEU0VUX01JQwkweDEwODE1MWIKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfSTJTX01JQwkJMHgxMDg5YmYzCi0KLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9EVUFMX01JQwkweDEwOGY5YzUKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfSEFORFNFVF9EVUFMX01JQwkJMHgxMDhmOWMzCi0KLS8qIFNwZWNpYWwgbG9vcGJhY2sgcHNldWRvIGRldmljZSB0byBiZSBwYWlyZWQgd2l0aCBhbiBSWCBkZXZpY2UgKi8KLS8qIHdpdGggdXNhZ2UgQURTUF9BVURJT19ERVZJQ0VfVVNBR0VfTUlYRURfUENNX0xPT1BCQUNLICovCi0jZGVmaW5lIEFEU1BfQVVESU9fREVWSUNFX0lEX01JWEVEX1BDTV9MT09QQkFDS19UWAkweDEwODliZjIKLQotLyogU2luayAoUlgpIGRldmljZXMgKi8KLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfSEFORFNFVF9TUEtSCQkJMHgxMDdhYzg4Ci0jZGVmaW5lIEFEU1BfQVVESU9fREVWSUNFX0lEX0hFQURTRVRfU1BLUl9NT05PCQkJMHgxMDgxNTExCi0jZGVmaW5lIEFEU1BfQVVESU9fREVWSUNFX0lEX0hFQURTRVRfU1BLUl9TVEVSRU8JCTB4MTA3YWM4YQotI2RlZmluZSBBRFNQX0FVRElPX0RFVklDRV9JRF9TUEtSX1BIT05FX01PTk8JCQkweDEwODE1MTMKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9NT05PX1dfTU9OT19IRUFEU0VUICAgICAweDEwOGM1MDgKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9NT05PX1dfU1RFUkVPX0hFQURTRVQgICAweDEwOGM4OTQKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9TVEVSRU8JCQkweDEwODE1MTQKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9TVEVSRU9fV19NT05PX0hFQURTRVQgICAweDEwOGM4OTUKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9TVEVSRU9fV19TVEVSRU9fSEVBRFNFVAkweDEwOGM1MDkKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfQlRfU0NPX1NQS1IJCQkweDEwODE1MTkKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfQVVYUENNX1JYCQkJCTB4MTA4MTUxOQotI2RlZmluZSBBRFNQX0FVRElPX0RFVklDRV9JRF9UVFlfSEVBRFNFVF9TUEtSCQkJMHgxMDgxNTFjCi0jZGVmaW5lIEFEU1BfQVVESU9fREVWSUNFX0lEX0kyU19TUEtSCQkJCTB4MTA4OWJmNAotI2RlZmluZSBBRFNQX0FVRElPX0RFVklDRV9JRF9OVUxMX1NJTksJCQkJMHgxMDhlNTEyCi0KLS8qIEJUIEEyRFAgcGxheWJhY2sgZGV2aWNlLiAqLwotLyogVGhpcyBkZXZpY2UgbXVzdCBiZSBwYWlyZWQgd2l0aCAqLwotLyogQURTUF9BVURJT19ERVZJQ0VfSURfTUlYRURfUENNX0xPT1BCQUNLX1RYIHVzaW5nICAqLwotLyogQURTUF9BVURJT19ERVZJQ0VfVVNBR0VfTUlYRURfUENNX0xPT1BCQUNLIG1vZGUgKi8KLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfSURfQlRfQTJEUF9TUEtSCTB4MTA4MTUxYQotCi0vKiBWb2ljZSBEZXN0aW5hdGlvbiBpZGVudGlmaWVyIC0gc3BlY2lmaWNhbGx5IHVzZWQgZm9yICovCi0vKiBjb250cm9sbGluZyBWb2ljZSBtb2R1bGUgZnJvbSB0aGUgRGV2aWNlIENvbnRyb2wgU2Vzc2lvbiAqLwotI2RlZmluZSBBRFNQX0FVRElPX0RFVklDRV9JRF9WT0lDRQkJMHgwMTA4ZGYzYwotCi0vKiAgQXVkaW8gZGV2aWNlIHVzYWdlIHR5cGVzLiAqLwotLyogIFRoaXMgaXMgYSBiaXQgbWFzayB0byBkZXRlcm1pbmUgd2hpY2ggdG9wb2xvZ3kgdG8gdXNlIGluIHRoZSAqLwotLyogZGV2aWNlIHNlc3Npb24gKi8KLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfQ09OVEVYVF9WT0lDRQkJCTB4MDEKLSNkZWZpbmUgQURTUF9BVURJT19ERVZJQ0VfQ09OVEVYVF9QTEFZQkFDSwkJMHgwMgotI2RlZmluZSBBRFNQX0FVRElPX0RFVklDRV9DT05URVhUX01JWEVEX1JFQ09SRAkJMHgxMAotI2RlZmluZSBBRFNQX0FVRElPX0RFVklDRV9DT05URVhUX1JFQ09SRAkJMHgyMAotI2RlZmluZSBBRFNQX0FVRElPX0RFVklDRV9DT05URVhUX1BDTV9MT09QQkFDSwkJMHg0MAotCi0vKiBBRFNQIGF1ZGlvIGRyaXZlciByZXR1cm4gY29kZXMgKi8KLSNkZWZpbmUgQURTUF9BVURJT19TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQURTUF9BVURJT19TVEFUVVNfRVVOU1VQUE9SVEVEICAgICAgICAgIDIwCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvZGFsX2F1ZGlvX2Zvcm1hdC5oIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvZGFsX2F1ZGlvX2Zvcm1hdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjIzOTc0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2RhbF9hdWRpb19mb3JtYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX19BRFNQX0FVRElPX01FRElBX0ZPUk1BVF9ICi0jZGVmaW5lIF9fQURTUF9BVURJT19NRURJQV9GT1JNQVRfSAotCi0KLQotLyogU3VwcG9ydGVkIGF1ZGlvIG1lZGlhIGZvcm1hdHMgKi8KLQotLyogZm9ybWF0IGJsb2NrIGluIHNobWVtICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX1NIQVJFRE1FTU9SWQkweDAxMDkxYTc4Ci0vKiBhZHNwX2F1ZGlvX2Zvcm1hdF9yYXdfcGNtIHR5cGUgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfUENNCQkweDAxMDNkMmZkCi0vKiBhZHNwX2F1ZGlvX2Zvcm1hdF9yYXdfcGNtIHR5cGUgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfRFRNRgkJMHgwMTA4NzcyNQotLyogYWRzcF9hdWRpb19mb3JtYXRfYWRwY20gdHlwZSAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9BRFBDTQkJMHgwMTAzZDJmZgotLyogWWFtYWhhIFBDTSBmb3JtYXQgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfWUFEUENNCTB4MDEwOGRjMDcKLS8qIElTTy9JRUMgMTExNzIgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfTVAzCQkweDAxMDNkMzA4Ci0vKiBJU08vSUVDIDE0NDk2ICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX01QRUc0X0FBQwkweDAxMDQyMmYxCi0vKiBBTVItTkIgYXVkaW8gaW4gRlMgZm9ybWF0ICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX0FNUk5CX0ZTCTB4MDEwNWMxNmMKLS8qIEFNUi1XQiBhdWRpbyBpbiBGUyBmb3JtYXQgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfQU1SV0JfRlMJMHgwMTA1YzE2ZQotLyogUUNFTFAgMTNrLCBJUzczMyAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9WMTNLX0ZTCTB4MDEwODBiOGEKLS8qIEVWUkMgICA4aywgSVMxMjcgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfRVZSQ19GUwkweDAxMDgwYjg5Ci0vKiBFVlJDLUIgICA4aywgNEdWICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX0VWUkNCX0ZTCTB4MDEwOGYyYTMKLS8qIE1JREkgY29tbWFuZCBzdHJlYW0gKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfTUlESQkJMHgwMTAzZDMwMAotLyogQTJEUCBTQkMgc3RyZWFtICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX1NCQwkJMHgwMTA4YzRkOAotLyogVmVyc2lvbiAxMCBQcm9mZXNzaW9uYWwgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfV01BX1YxMFBSTwkweDAxMDhhYTkyCi0vKiBWZXJzaW9uIDkgU3Rhcm5kYXJkICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX1dNQV9WOQkweDAxMDhkNDMwCi0vKiBBTVIgV2lkZUJhbmQgUGx1cyAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9BTVJfV0JfUExVUwkweDAxMDhmM2RhCi0vKiBBQzMgRGVjb2RlciAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9BQzNfREVDT0RFUgkweDAxMDhkNWY5Ci0KLQotLyogTm90IHlldCBzdXBwb3J0ZWQgYXVkaW8gbWVkaWEgZm9ybWF0cyAqLwotCi0KLQotLyogSVNPL0lFQyAxMzgxOCAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9NUEVHMl9BQUMJMHgwMTAzZDMwOQotLyogM0dQUCBUUyAyNi4xMDEgU2VjIDQuMCAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9BTVJOQl9JRjEJMHgwMTAzZDMwNQotLyogM0dQUCBUUyAyNi4xMDEgQW5uZXggQSAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9BTVJOQl9JRjIJMHgwMTA1N2IzMQotLyogM0dQUCBUUyAyNi4yMDEgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfQU1SV0JfSUYxCTB4MDEwM2QzMDYKLS8qIDNHUFAgVFMgMjYuMjAxICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX0FNUldCX0lGMgkweDAxMDVjMTZkCi0vKiBHLjcxMSAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9HNzExCQkweDAxMDYyMDFkCi0vKiBRQ0VMUCAgOGssIElTOTZBICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX1Y4S19GUwkweDAxMDgxZDI5Ci0vKiBWZXJzaW9uIDEgY29kZWMgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfV01BX1YxCTB4MDEwNTViMmIKLS8qIFZlcnNpb24gMiwgNyAmIDggY29kZWMgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfV01BX1Y4CTB4MDEwNTViMmMKLS8qIFZlcnNpb24gOSBQcm9mZXNzaW9uYWwgY29kZWMgKi8KLSNkZWZpbmUgQURTUF9BVURJT19GT1JNQVRfV01BX1Y5UFJPCTB4MDEwNTViMmQKLS8qIFZlcnNpb24gOSBWb2ljZSBjb2RlYyAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9XTUFfU1AxCTB4MDEwNTViMmUKLS8qIFZlcnNpb24gOSBMb3NzbGVzcyBjb2RlYyAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9XTUFfTE9TU0xFU1MJMHgwMTA1NWIyZgotLyogUmVhbCBNZWRpYSBjb250ZW50LCBsb3ctYml0cmF0ZSAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9SQV9TSVBSCTB4MDEwNDJhMGYKLS8qIFJlYWwgTWVkaWEgY29udGVudCAqLwotI2RlZmluZSBBRFNQX0FVRElPX0ZPUk1BVF9SQV9DT09LCTB4MDEwNDJhMGUKLQotCi0vKiBGb3IgYWxsIG9mIHRoZSBhdWRpbyBmb3JtYXRzLCB1bmxlc3Mgc3BlY2lmaWVkIG90aGVyd2lzZSwgKi8KLS8qIHRoZSBmb2xsb3dpbmcgYXBwbHk6ICovCi0vKiBGb3JtYXQgYmxvY2sgYml0cyBhcmUgYXJyYW5nZWQgaW4gYnl0ZXMgYW5kIHdvcmRzIGluIGxpdHRsZS1lbmRpYW4gKi8KLS8qIG9yZGVyLCBpLmUuLCBsZWFzdC1zaWduaWZpY2FudCBiaXQgZmlyc3QgYW5kIGxlYXN0LXNpZ25pZmljYW50ICovCi0vKiBieXRlIGZpcnN0LiAqLwotCi0KLQotLyogQUFDIEZvcm1hdCBCbG9jay4gKi8KLQotLyogQUFDIGZvcm1hdCBibG9jayBjb25zaXN0IG9mIGEgZm9ybWF0IGlkZW50aWZpZXIgZm9sbG93ZWQgYnkgKi8KLS8qIEF1ZGlvU3BlY2lmaWNDb25maWcgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08vSUVDIDE0NDk2LTMgKi8KLQotLyogVGhlIGZvbGxvd2luZyBBQUMgZm9ybWF0IGlkZW50aWZpZXJzIGFyZSBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgQURTUF9BVURJT19BQUNfQURUUwkJMHgwMTA2MTljZgotI2RlZmluZSBBRFNQX0FVRElPX0FBQ19NUEVHNF9BRFRTCTB4MDEwNjE5ZDAKLSNkZWZpbmUgQURTUF9BVURJT19BQUNfTE9BUwkJMHgwMTA2MTlkMQotI2RlZmluZSBBRFNQX0FVRElPX0FBQ19BRElGCQkweDAxMDYxOWQyCi0jZGVmaW5lIEFEU1BfQVVESU9fQUFDX1JBVwkJMHgwMTA2MTlkMwotI2RlZmluZSBBRFNQX0FVRElPX0FBQ19GUkFNRURfUkFXCTB4MDEwOGMxZmIKLQotCi0jZGVmaW5lIEFEU1BfQVVESU9fQ09NUEFORElOR19BTEFXCTB4MTA2MTljZAotI2RlZmluZSBBRFNQX0FVRElPX0NPTVBBTkRJTkdfTUxBVwkweDEwNjE5Y2UKLQotLyogTWF4bXVtIG51bWJlciBvZiBieXRlcyBhbGxvd2VkIGluIGEgZm9ybWF0IGJsb2NrICovCi0jZGVmaW5lIEFEU1BfQVVESU9fRk9STUFUX0RBVEFfTUFYIDE2Ci0KLQotc3RydWN0IGFkc3BfYXVkaW9fbm9fcGF5bG9hZF9mb3JtYXQgewotCS8qIE1lZGlhIEZvcm1hdCBDb2RlIChtdXN0IGFsd2F5cyBiZSBmaXJzdCBlbGVtZW50KSAqLwotCXUzMgkJZm9ybWF0OwotCi0JLyogbm8gcGF5bG9hZCBmb3IgdGhpcyBmb3JtYXQgdHlwZSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotLyogRm9yIGNvbnZlbmllbmNlLCB0byBiZSB1c2VkIGFzIGEgc3RhbmRhcmQgZm9ybWF0IGJsb2NrICovCi0vKiBmb3IgdmFyaW91cyBtZWRpYSB0eXBlcyB0aGF0IGRvbid0IG5lZWQgYSB1bmlxdWUgZm9ybWF0IGJsb2NrICovCi0vKiBpZS4gUENNLCBEVE1GLCBldGMuICovCi1zdHJ1Y3QgYWRzcF9hdWRpb19zdGFuZGFyZF9mb3JtYXQgewotCS8qIE1lZGlhIEZvcm1hdCBDb2RlIChtdXN0IGFsd2F5cyBiZSBmaXJzdCBlbGVtZW50KSAqLwotCXUzMgkJZm9ybWF0OwotCi0JLyogcGF5bG9hZCAqLwotCXUxNgkJY2hhbm5lbHM7Ci0JdTE2CQliaXRzX3Blcl9zYW1wbGU7Ci0JdTMyCQlzYW1wbGluZ19yYXRlOwotCXU4CQlpc19zaWduZWQ7Ci0JdTgJCWlzX2ludGVybGVhdmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotCi0vKiBBRFBDTSBmb3JtYXQgYmxvY2sgKi8KLXN0cnVjdCBhZHNwX2F1ZGlvX2FkcGNtX2Zvcm1hdCB7Ci0JLyogTWVkaWEgRm9ybWF0IENvZGUgKG11c3QgYWx3YXlzIGJlIGZpcnN0IGVsZW1lbnQpICovCi0JdTMyCQlmb3JtYXQ7Ci0KLQkvKiBwYXlsb2FkICovCi0JdTE2CQljaGFubmVsczsKLQl1MTYJCWJpdHNfcGVyX3NhbXBsZTsKLQl1MzIJCXNhbXBsaW5nX3JhdGU7Ci0JdTgJCWlzX3NpZ25lZDsKLQl1OAkJaXNfaW50ZXJsZWF2ZWQ7Ci0JdTMyCQlibG9ja19zaXplOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotLyogTUlESSBmb3JtYXQgYmxvY2sgKi8KLXN0cnVjdCBhZHNwX2F1ZGlvX21pZGlfZm9ybWF0IHsKLQkvKiBNZWRpYSBGb3JtYXQgQ29kZSAobXVzdCBhbHdheXMgYmUgZmlyc3QgZWxlbWVudCkgKi8KLQl1MzIJCWZvcm1hdDsKLQotCS8qIHBheWxvYWQgKi8KLQl1MzIJCXNhbXBsaW5nX3JhdGU7Ci0JdTE2CQljaGFubmVsczsKLQl1MTYJCW1vZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotCi0vKiBHNzExIGZvcm1hdCBibG9jayAqLwotc3RydWN0IGFkc3BfYXVkaW9fZzcxMV9mb3JtYXQgewotCS8qIE1lZGlhIEZvcm1hdCBDb2RlIChtdXN0IGFsd2F5cyBiZSBmaXJzdCBlbGVtZW50KSAqLwotCXUzMgkJZm9ybWF0OwotCi0JLyogcGF5bG9hZCAqLwotCXUzMgkJY29tcGFuZGluZzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0KLXN0cnVjdCBhZHNwX2F1ZGlvX3dtYV9wcm9fZm9ybWF0IHsKLQkvKiBNZWRpYSBGb3JtYXQgQ29kZSAobXVzdCBhbHdheXMgYmUgZmlyc3QgZWxlbWVudCkgKi8KLQl1MzIJCWZvcm1hdDsKLQotCS8qIHBheWxvYWQgKi8KLQl1MTYJCWZvcm1hdF90YWc7Ci0JdTE2CQljaGFubmVsczsKLQl1MzIJCXNhbXBsZXNfcGVyX3NlYzsKLQl1MzIJCWF2Z19ieXRlc19wZXJfc2VjOwotCXUxNgkJYmxvY2tfYWxpZ247Ci0JdTE2CQl2YWxpZF9iaXRzX3Blcl9zYW1wbGU7Ci0JdTMyCQljaGFubmVsX21hc2s7Ci0JdTE2CQllbmNvZGVfb3B0OwotCXUxNgkJYWR2YW5jZWRfZW5jb2RlX29wdDsKLQl1MzIJCWFkdmFuY2VkX2VuY29kZV9vcHQyOwotCXUzMgkJZHJjX3BlYWtfcmVmZXJlbmNlOwotCXUzMgkJZHJjX3BlYWtfdGFyZ2V0OwotCXUzMgkJZHJjX2F2ZXJhZ2VfcmVmZXJlbmNlOwotCXUzMgkJZHJjX2F2ZXJhZ2VfdGFyZ2V0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotc3RydWN0IGFkc3BfYXVkaW9fYW1yd2JfcGx1c19mb3JtYXQgewotCS8qIE1lZGlhIEZvcm1hdCBDb2RlIChtdXN0IGFsd2F5cyBiZSBmaXJzdCBlbGVtZW50KSAqLwotCXUzMgkJZm9ybWF0OwotCi0JLyogcGF5bG9hZCAqLwotCXUzMgkJc2l6ZTsKLQl1MzIJCXZlcnNpb247Ci0JdTMyCQljaGFubmVsczsKLQl1MzIJCWFtcl9iYW5kX21vZGU7Ci0JdTMyCQlhbXJfZHR4X21vZGU7Ci0JdTMyCQlhbXJfZnJhbWVfZm9ybWF0OwotCXUzMgkJYW1yX2lzZl9pbmRleDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0KLS8qIEJpbmFyeSBCeXRlIFN0cmVhbSBGb3JtYXQgKi8KLS8qIEJpbmFyeSBmb3JtYXQgdHlwZSB0aGF0IGRlZmluZXMgYSBieXRlIHN0cmVhbSwgKi8KLS8qIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW55IGZvcm1hdCAoaWUuIEFBQykgKi8KLXN0cnVjdCBhZHNwX2F1ZGlvX2JpbmFyeV9mb3JtYXQgewotCS8qIE1lZGlhIEZvcm1hdCBDb2RlIChtdXN0IGFsd2F5cyBiZSBmaXJzdCBlbGVtZW50KSAqLwotCXUzMgkJZm9ybWF0OwotCi0JLyogcGF5bG9hZCAqLwotCS8qIG51bWJlciBvZiBieXRlcyBzZXQgaW4gYnl0ZSBzdHJlYW0gKi8KLQl1MzIJCW51bV9ieXRlczsKLQkvKiBCeXRlIHN0cmVhbSBiaW5hcnkgZGF0YSAqLwotCXU4CQlkYXRhW0FEU1BfQVVESU9fRk9STUFUX0RBVEFfTUFYXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0KLXN0cnVjdCBhZHNwX2F1ZGlvX3NoYXJlZF9tZW1vcnlfZm9ybWF0IHsKLQkvKiBNZWRpYSBGb3JtYXQgQ29kZSAobXVzdCBhbHdheXMgYmUgZmlyc3QgZWxlbWVudCkgKi8KLQl1MzIJCWZvcm1hdDsKLQotCS8qIE51bWJlciBvZiBieXRlcyBpbiBzaGFyZWQgbWVtb3J5ICovCi0JdTMyCQlsZW47Ci0JLyogUGh5aXNpY2FsIGFkZHJlc3MgdG8gZGF0YSBpbiBzaGFyZWQgbWVtb3J5ICovCi0JdTMyCQlhZGRyZXNzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotLyogVW5pb24gb2YgYWxsIGZvcm1hdCB0eXBlcyAqLwotdW5pb24gYWRzcF9hdWRpb19mb3JtYXQgewotCS8qIEJhc2ljIGZvcm1hdCBibG9jayB3aXRoIG5vIHBheWxvYWQgKi8KLQlzdHJ1Y3QgYWRzcF9hdWRpb19ub19wYXlsb2FkX2Zvcm1hdAlub19wYXlsb2FkOwotCS8qIEdlbmVyaWMgZm9ybWF0IGJsb2NrIFBDTSwgRFRNRiAqLwotCXN0cnVjdCBhZHNwX2F1ZGlvX3N0YW5kYXJkX2Zvcm1hdAlzdGFuZGFyZDsKLQkvKiBBRFBDTSBmb3JtYXQgYmxvY2sgKi8KLQlzdHJ1Y3QgYWRzcF9hdWRpb19hZHBjbV9mb3JtYXQJCWFkcGNtOwotCS8qIE1JREkgZm9ybWF0IGJsb2NrICovCi0Jc3RydWN0IGFkc3BfYXVkaW9fbWlkaV9mb3JtYXQJCW1pZGk7Ci0JLyogRzcxMSBmb3JtYXQgYmxvY2sgKi8KLQlzdHJ1Y3QgYWRzcF9hdWRpb19nNzExX2Zvcm1hdAkJZzcxMTsKLQkvKiBXbWFQcm8gZm9ybWF0IGJsb2NrICovCi0Jc3RydWN0IGFkc3BfYXVkaW9fd21hX3Byb19mb3JtYXQJd21hX3BybzsKLQkvKiBXbWFQcm8gZm9ybWF0IGJsb2NrICovCi0Jc3RydWN0IGFkc3BfYXVkaW9fYW1yd2JfcGx1c19mb3JtYXQJYW1yd2JfcGx1czsKLQkvKiBiaW5hcnkgKGJ5dGUgc3RyZWFtKSBmb3JtYXQgYmxvY2ssIHVzZWQgZm9yIEFBQyAqLwotCXN0cnVjdCBhZHNwX2F1ZGlvX2JpbmFyeV9mb3JtYXQJCWJpbmFyeTsKLQkvKiBmb3JtYXQgYmxvY2sgaW4gc2hhcmVkIG1lbW9yeSAqLwotCXN0cnVjdCBhZHNwX2F1ZGlvX3NoYXJlZF9tZW1vcnlfZm9ybWF0CXNoYXJlZF9tZW07Ci19OwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvZHNwX2RlYnVnLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9kc3BfZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyZjhjZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9kc3BfZGVidWcuYworKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9kc3BfZHVtcC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSwgSW5jLgotICogQXV0aG9yOiBCcmlhbiBTd2V0bGFuZCA8c3dldGxhbmRAZ29vZ2xlLmNvbT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL3Byb2NfY29tbS5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLQotc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IGRzcF93YWl0Owotc3RhdGljIGludCBkc3BfaGFzX2NyYXNoZWQ7Ci1zdGF0aWMgaW50IGRzcF93YWl0X2NvdW50OwotCi1zdGF0aWMgYXRvbWljX3QgZHNwX2NyYXNoX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7Ci0KLXZvaWQgcTZhdWRpb19kc3Bfbm90X3Jlc3BvbmRpbmcodm9pZCkKLXsKLQotCWlmIChhdG9taWNfYWRkX3JldHVybigxLCAmZHNwX2NyYXNoX2NvdW50KSAhPSAxKSB7Ci0JCXByX2VycigicTZhdWRpb19kc3Bfbm90X3Jlc3BvbmRpbmcoKSAtIHBhcmtpbmcgYWRkaXRpb25hbCBjcmFzaGVyLi4uXG4iKTsKLQkJZm9yICg7OykKLQkJCW1zbGVlcCgxMDAwKTsKLQl9Ci0JaWYgKGRzcF93YWl0X2NvdW50KSB7Ci0JCWRzcF9oYXNfY3Jhc2hlZCA9IDE7Ci0JCXdha2VfdXAoJmRzcF93YWl0KTsKLQotCQl3aGlsZSAoZHNwX2hhc19jcmFzaGVkICE9IDIpCi0JCQl3YWl0X2V2ZW50KGRzcF93YWl0LCBkc3BfaGFzX2NyYXNoZWQgPT0gMik7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCJxNmF1ZGlvX2RzcF9ub3RfcmVzcG9uZGluZygpIC0gbm8gd2FpdGVyP1xuIik7Ci0JfQotCUJVRygpOwotfQotCi1zdGF0aWMgaW50IGRzcF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBkc3Bfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQljaGFyIGNtZFszMl07Ci0KLQlpZiAoY291bnQgPj0gc2l6ZW9mKGNtZCkpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChjb3B5X2Zyb21fdXNlcihjbWQsIGJ1ZiwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQljbWRbY291bnRdID0gMDsKLQotCWlmICgoY291bnQgPiAxKSAmJiAoY21kW2NvdW50LTFdID09ICdcbicpKQotCQljbWRbY291bnQtMV0gPSAwOwotCi0JaWYgKCFzdHJjbXAoY21kLCAid2FpdC1mb3ItY3Jhc2giKSkgewotCQl3aGlsZSAoIWRzcF9oYXNfY3Jhc2hlZCkgewotCQkJaW50IHJlczsKLQkJCWRzcF93YWl0X2NvdW50Kys7Ci0JCQlyZXMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZHNwX3dhaXQsIGRzcF9oYXNfY3Jhc2hlZCk7Ci0JCQlpZiAocmVzIDwgMCkgewotCQkJCWRzcF93YWl0X2NvdW50LS07Ci0JCQkJcmV0dXJuIHJlczsKLQkJCX0KLQkJfQotI2lmIGRlZmluZWQoQ09ORklHX01BQ0hfTUFISU1BSEkpCi0JCS8qIGFzc2VydCBEU1AgTk1JICovCi0JCW1zbV9wcm9jX2NvbW0oUENPTV9DVVNUT01FUl9DTUQxLCAwLCAwKTsKLQkJbXNsZWVwKDI1MCk7Ci0jZW5kaWYKLQl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiYm9vbSIpKSB7Ci0JCXE2YXVkaW9fZHNwX25vdF9yZXNwb25kaW5nKCk7Ci0JfSBlbHNlIGlmICghc3RyY21wKGNtZCwgImNvbnRpbnVlLWNyYXNoIikpIHsKLQkJZHNwX2hhc19jcmFzaGVkID0gMjsKLQkJd2FrZV91cCgmZHNwX3dhaXQpOwotCX0gZWxzZSB7Ci0JCXByX2VycigiWyVzOiVzXSB1bmtub3duIGRzcF9kZWJ1ZyBjb21tYW5kOiAlc1xuIiwgX19NTV9GSUxFX18sCi0JCQkJX19mdW5jX18sIGNtZCk7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi0jZGVmaW5lIERTUF9SQU1fQkFTRSAweDJFODAwMDAwCi0jZGVmaW5lIERTUF9SQU1fU0laRSAweDAxODAwMDAwCi0KLXN0YXRpYyB1bnNpZ25lZCBjb3B5X29rX2NvdW50OwotCi1zdGF0aWMgc3NpemVfdCBkc3BfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc2l6ZV90IGFjdHVhbCA9IDA7Ci0Jc2l6ZV90IG1hcHNpemUgPSBQQUdFX1NJWkU7Ci0JdW5zaWduZWQgYWRkcjsKLQl2b2lkIF9faW9tZW0gKnB0cjsKLQotCWlmICgqcG9zID49IERTUF9SQU1fU0laRSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoKnBvcyAmIChQQUdFX1NJWkUgLSAxKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlhZGRyID0gKCpwb3MgKyBEU1BfUkFNX0JBU0UpOwotCi0JLyogZG9uJ3QgYmxvdyB1cCBpZiB3ZSdyZSB1bmFsaWduZWQgKi8KLQlpZiAoYWRkciAmIChQQUdFX1NJWkUgLSAxKSkKLQkJbWFwc2l6ZSAqPSAyOwotCi0Jd2hpbGUgKGNvdW50ID49IFBBR0VfU0laRSkgewotCQlwdHIgPSBpb3JlbWFwKGFkZHIsIG1hcHNpemUpOwotCQlpZiAoIXB0cikgewotCQkJcHJfZXJyKCJbJXM6JXNdIG1hcCBlcnJvciBAICV4XG4iLCBfX01NX0ZJTEVfXywKLQkJCQkJX19mdW5jX18sIGFkZHIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHB0ciwgUEFHRV9TSVpFKSkgewotCQkJaW91bm1hcChwdHIpOwotCQkJcHJfZXJyKCJbJXM6JXNdIGNvcHkgZXJyb3IgQCAlcFxuIiwgX19NTV9GSUxFX18sCi0JCQkJCV9fZnVuY19fLCBidWYpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJY29weV9va19jb3VudCArPSBQQUdFX1NJWkU7Ci0JCWlvdW5tYXAocHRyKTsKLQkJYWRkciArPSBQQUdFX1NJWkU7Ci0JCWJ1ZiArPSBQQUdFX1NJWkU7Ci0JCWFjdHVhbCArPSBQQUdFX1NJWkU7Ci0JCWNvdW50IC09IFBBR0VfU0laRTsKLQl9Ci0KLQkqcG9zICs9IGFjdHVhbDsKLQlyZXR1cm4gYWN0dWFsOwotfQotCi1zdGF0aWMgaW50IGRzcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkc3BfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gZHNwX29wZW4sCi0JLnJlYWQJCT0gZHNwX3JlYWQsCi0JLndyaXRlCQk9IGRzcF93cml0ZSwKLQkucmVsZWFzZQk9IGRzcF9yZWxlYXNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGRzcF9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJkc3BfZGVidWciLAotCS5mb3BzCT0gJmRzcF9mb3BzLAotfTsKLQotCi1zdGF0aWMgaW50IF9faW5pdCBkc3BfaW5pdCh2b2lkKQotewotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRzcF93YWl0KTsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmZHNwX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoZHNwX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvZHRtZi5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvZHRtZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDk3OGRmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2R0bWYuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLQotI2luY2x1ZGUgPG1hY2gvbXNtX3Fkc3A2X2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi1zdHJ1Y3QgZHRtZiB7Ci0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0Jc3RydWN0IG1zbV9kdG1mX2NvbmZpZyBjZmc7Ci19OwotCi1zdGF0aWMgbG9uZyBkdG1mX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgZHRtZiAqZHRtZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JbXV0ZXhfbG9jaygmZHRtZi0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJcHJfZGVidWcoIlslczolc10gQVVESU9fU1RBUlRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCWlmIChkdG1mLT5hYykgewotCQkJcHJfZXJyKCJbJXM6JXNdIGFjdGl2ZSBzZXNzaW9uIGFscmVhZHkgZXhpc3RpbmdcbiIsCi0JCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCXJjID0gLUVCVVNZOwotCQl9IGVsc2UgewotCQkJZHRtZi0+YWMgPSBxNmF1ZGlvX29wZW5fZHRtZig0ODAwMCwgMiwgMCk7Ci0JCQlpZiAoIWR0bWYtPmFjKQotCQkJCXJjID0gLUVOT01FTTsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19QTEFZX0RUTUY6IHsKLQkJcmMgPSBjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZkdG1mLT5jZmcsICh2b2lkICopYXJnLAotCQkJCQlzaXplb2Yoc3RydWN0IG1zbV9kdG1mX2NvbmZpZykpOwotCi0JCXByX2RlYnVnKCJbJXM6JXNdIFBMQVlfRFRNRjogaGlnaCA9ICVkLCBsb3cgPSAlZFxuIiwKLQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXywgZHRtZi0+Y2ZnLmR0bWZfaGksCi0JCQlkdG1mLT5jZmcuZHRtZl9sb3cpOwotCQlyYyA9IHE2YXVkaW9fcGxheV9kdG1mKGR0bWYtPmFjLCBkdG1mLT5jZmcuZHRtZl9oaSwKLQkJCQkJZHRtZi0+Y2ZnLmR0bWZfbG93LCBkdG1mLT5jZmcuZHVyYXRpb24sCi0JCQkJCWR0bWYtPmNmZy5yeF9nYWluKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcl9lcnIoIlslczolc10gRFRNRl9TVEFSVCBmYWlsZWRcbiIsIF9fTU1fRklMRV9fLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJmR0bWYtPmxvY2spOwotCi0JcHJfZGVidWcoIlslczolc10gcmMgPSAlZFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCByYykgOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBkdG1mX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaW50IHJjID0gMDsKLQotCXN0cnVjdCBkdG1mICpkdG1mOwotCXByX2luZm8oIlslczolc10gb3BlblxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQlkdG1mID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGR0bWYpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghZHRtZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltdXRleF9pbml0KCZkdG1mLT5sb2NrKTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGR0bWY7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGR0bWZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgZHRtZiAqZHRtZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpZiAoZHRtZi0+YWMpCi0JCXE2YXVkaW9fY2xvc2UoZHRtZi0+YWMpOwotCWtmcmVlKGR0bWYpOwotCXByX2luZm8oIlslczolc10gcmVsZWFzZVxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHRtZl9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBkdG1mX29wZW4sCi0JLnJlbGVhc2UJPSBkdG1mX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0gZHRtZl9pb2N0bCwKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIGR0bWZfbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX2R0bWYiLAotCS5mb3BzCT0gJmR0bWZfZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGR0bWZfaW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZkdG1mX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoZHRtZl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2V2cmNfaW4uYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L2V2cmNfaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1OWVmYS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9ldnJjX2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOSBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19xY3AuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9xZHNwNl9hdWRpby5oPgotI2luY2x1ZGUgImRhbF9hdWRpb19mb3JtYXQuaCIKLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLSNkZWZpbmUgRVZSQ19GQ19CVUZGX0NOVCAxMAotI2RlZmluZSBFVlJDX1JFQURfVElNRU9VVCAyMDAwCi1zdHJ1Y3QgZXZyY19mY19idWZmIHsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlpbnQgZW1wdHk7Ci0Jdm9pZCAqZGF0YTsKLQlpbnQgc2l6ZTsKLQlpbnQgYWN0dWFsX3NpemU7Ci19OwotCi1zdHJ1Y3QgZXZyY19mYyB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwotCXdhaXRfcXVldWVfaGVhZF90IGZjX3dxOwotCXN0cnVjdCBldnJjX2ZjX2J1ZmYgZmNfYnVmZltFVlJDX0ZDX0JVRkZfQ05UXTsKLQlpbnQgYnVmZl9pbmRleDsKLX07Ci0KLXN0cnVjdCBldnJjIHsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZyBjZmc7Ci0Jc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnIHN0cl9jZmc7Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYXVkaW9fY2xpZW50OwotCXN0cnVjdCBtc21fdm9pY2VyZWNfbW9kZSB2b2ljZXJlY19tb2RlOwotCXN0cnVjdCBldnJjX2ZjICpldnJjX2ZjOwotfTsKLQotCi1zdGF0aWMgaW50IHE2X2V2cmNfZmxvd2NvbnRyb2wodm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYzsKLQlzdHJ1Y3QgYXVkaW9fYnVmZmVyICphYjsKLQlzdHJ1Y3QgZXZyYyAqZXZyYyA9IGRhdGE7Ci0JaW50IGJ1ZmZfaW5kZXggPSAwOwotCWludCB4ZmVyID0gMDsKLQlzdHJ1Y3QgZXZyY19mYyAqZmM7Ci0KLQotCWFjID0gZXZyYy0+YXVkaW9fY2xpZW50OwotCWZjID0gZXZyYy0+ZXZyY19mYzsKLQlpZiAoIWFjKSB7Ci0JCXByX2VycigiWyVzOiVzXSBhdWRpb19jbGllbnQgaXMgTlVMTFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJYWIgPSBhYy0+YnVmICsgYWMtPmNwdV9idWY7Ci0JCWlmIChhYi0+dXNlZCkKLQkJCXdhaXRfZXZlbnQoYWMtPndhaXQsIChhYi0+dXNlZCA9PSAwKSk7Ci0JCXByX2RlYnVnKCJbJXM6JXNdIGFiLT5kYXRhID0gJXAsIGNwdV9idWYgPSAlZFxuIiwgX19NTV9GSUxFX18sCi0JCQlfX2Z1bmNfXywgYWItPmRhdGEsIGFjLT5jcHVfYnVmKTsKLQkJeGZlciA9IGFiLT5hY3R1YWxfc2l6ZTsKLQotCi0JCW11dGV4X2xvY2soJihmYy0+ZmNfYnVmZltidWZmX2luZGV4XS5sb2NrKSk7Ci0JCWlmICghZmMtPmZjX2J1ZmZbYnVmZl9pbmRleF0uZW1wdHkpIHsKLQkJCXByX2VycigiWyVzOiVzXSBmbG93IGNvbnRyb2wgYnVmZmVyWyVkXSBub3QgcmVhZCFcbiIsCi0JCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXywgYnVmZl9pbmRleCk7Ci0JCX0KLQotCQlpZiAoZmMtPmZjX2J1ZmZbYnVmZl9pbmRleF0uc2l6ZSA8IHhmZXIpIHsKLQkJCXByX2VycigiWyVzOiVzXSBidWZmZXIgJWQgdG9vIHNtYWxsXG4iLCBfX01NX0ZJTEVfXywKLQkJCQkJX19mdW5jX18sIGJ1ZmZfaW5kZXgpOwotCQkJbWVtY3B5KGZjLT5mY19idWZmW2J1ZmZfaW5kZXhdLmRhdGEsIGFiLT5kYXRhLAotCQkJCQlmYy0+ZmNfYnVmZltidWZmX2luZGV4XS5zaXplKTsKLQkJCWZjLT5mY19idWZmW2J1ZmZfaW5kZXhdLmVtcHR5ID0gMDsKLQkJCWZjLT5mY19idWZmW2J1ZmZfaW5kZXhdLmFjdHVhbF9zaXplID0KLQkJCQkJZmMtPmZjX2J1ZmZbYnVmZl9pbmRleF0uc2l6ZTsKLQkJfSBlbHNlIHsKLQkJCW1lbWNweShmYy0+ZmNfYnVmZltidWZmX2luZGV4XS5kYXRhLCBhYi0+ZGF0YSwgeGZlcik7Ci0JCQlmYy0+ZmNfYnVmZltidWZmX2luZGV4XS5lbXB0eSA9IDA7Ci0JCQlmYy0+ZmNfYnVmZltidWZmX2luZGV4XS5hY3R1YWxfc2l6ZSA9IHhmZXI7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCYoZmMtPmZjX2J1ZmZbYnVmZl9pbmRleF0ubG9jaykpOwotCQkvKndha2UgdXAgY2xpZW50LCBpZiBhbnkqLwotCQl3YWtlX3VwKCZmYy0+ZmNfd3EpOwotCi0JCWJ1ZmZfaW5kZXgrKzsKLQkJaWYgKGJ1ZmZfaW5kZXggPj0gRVZSQ19GQ19CVUZGX0NOVCkKLQkJCWJ1ZmZfaW5kZXggPSAwOwotCi0JCWFiLT51c2VkID0gMTsKLQotCQlxNmF1ZGlvX3JlYWQoYWMsIGFiKTsKLQkJYWMtPmNwdV9idWYgXj0gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBsb25nIHE2X2V2cmNfaW5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGV2cmMgKmV2cmMgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQlpbnQgaSA9IDA7Ci0Jc3RydWN0IGV2cmNfZmMgKmZjOwotCWludCBzaXplID0gMDsKLQotCW11dGV4X2xvY2soJmV2cmMtPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlwcl9kZWJ1ZygiWyVzOiVzXSBTRVRfVk9MVU1FXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9TVEFUUzoKLQl7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCXByX2RlYnVnKCJbJXM6JXNdIEdFVF9TVEFUU1xuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmc3RhdHMsIHNpemVvZihzdGF0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIEFVRElPX1NUQVJUOgotCXsKLQkJdWludDMyX3QgYWNkYl9pZDsKLQkJcHJfZGVidWcoIlslczolc10gQVVESU9fU1RBUlRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCWlmIChhcmcgPT0gMCkgewotCQkJYWNkYl9pZCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmFjZGJfaWQsICh2b2lkICopIGFyZywKLQkJCQlzaXplb2YoYWNkYl9pZCkpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChldnJjLT5hdWRpb19jbGllbnQpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJcHJfZXJyKCJbJXM6JXNdIGFjdGl2ZSBzZXNzaW9uIGFscmVhZHkgZXhpc3RpbmdcbiIsCi0JCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJZXZyYy0+YXVkaW9fY2xpZW50ID0gcTZhdWRpb19vcGVuX3FjcCgKLQkJCQkJZXZyYy0+c3RyX2NmZy5idWZmZXJfc2l6ZSwKLQkJCQkJZXZyYy0+Y2ZnLm1pbl9iaXRfcmF0ZSwKLQkJCQkJZXZyYy0+Y2ZnLm1heF9iaXRfcmF0ZSwKLQkJCQkJZXZyYy0+dm9pY2VyZWNfbW9kZS5yZWNfbW9kZSwKLQkJCQkJQURTUF9BVURJT19GT1JNQVRfRVZSQ19GUywKLQkJCQkJYWNkYl9pZCk7Ci0KLQkJCWlmICghZXZyYy0+YXVkaW9fY2xpZW50KSB7Ci0JCQkJcHJfZXJyKCJbJXM6JXNdIGV2cmMgb3BlbiBzZXNzaW9uIGZhaWxlZFxuIiwKLQkJCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCQlrZnJlZShldnJjKTsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKmFsbG9jYXRlIGZsb3cgY29udHJvbCBidWZmZXJzKi8KLQkJZmMgPSBldnJjLT5ldnJjX2ZjOwotCQlzaXplID0gZXZyYy0+c3RyX2NmZy5idWZmZXJfc2l6ZTsKLQkJZm9yIChpID0gMDsgaSA8IEVWUkNfRkNfQlVGRl9DTlQ7ICsraSkgewotCQkJbXV0ZXhfaW5pdCgmKGZjLT5mY19idWZmW2ldLmxvY2spKTsKLQkJCWZjLT5mY19idWZmW2ldLmVtcHR5ID0gMTsKLQkJCWZjLT5mY19idWZmW2ldLmRhdGEgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCQkJaWYgKGZjLT5mY19idWZmW2ldLmRhdGEgPT0gTlVMTCkgewotCQkJCXByX2VycigiWyVzOiVzXSBObyBtZW1vcnkgZm9yIEZDIGJ1ZmZlcnNcbiIsCi0JCQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQkJCXJjID0gLUVOT01FTTsKLQkJCQlnb3RvIGZjX2ZhaWw7Ci0JCQl9Ci0JCQlmYy0+ZmNfYnVmZltpXS5zaXplID0gc2l6ZTsKLQkJCWZjLT5mY19idWZmW2ldLmFjdHVhbF9zaXplID0gMDsKLQkJfQotCi0JCS8qY3JlYXRlIGZsb3cgY29udHJvbCB0aHJlYWQqLwotCQlmYy0+dGFzayA9IGt0aHJlYWRfcnVuKHE2X2V2cmNfZmxvd2NvbnRyb2wsCi0JCQkJZXZyYywgImV2cmNfZmxvd2NvbnRyb2wiKTsKLQkJaWYgKElTX0VSUihmYy0+dGFzaykpIHsKLQkJCXJjID0gUFRSX0VSUihmYy0+dGFzayk7Ci0JCQlwcl9lcnIoIlslczolc10gZXJyb3IgY3JlYXRpbmcgZmxvdyBjb250cm9sIHRocmVhZFxuIiwKLQkJCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCWdvdG8gZmNfZmFpbDsKLQkJfQotCQlicmVhazsKLWZjX2ZhaWw6Ci0JCS8qZnJlZSBmbG93IGNvbnRyb2wgYnVmZmVycyovCi0JCS0taTsKLQkJZm9yICg7IGkgPj0gIDA7IGktLSkgewotCQkJa2ZyZWUoZmMtPmZjX2J1ZmZbaV0uZGF0YSk7Ci0JCQlmYy0+ZmNfYnVmZltpXS5kYXRhID0gTlVMTDsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TVE9QOgotCQlwcl9kZWJ1ZygiWyVzOiVzXSBBVURJT19TVE9QXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIEFVRElPX0ZMVVNIOgotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9JTkNBTEw6IHsKLQkJcHJfZGVidWcoIlslczolc10gU0VUX0lOQ0FMTFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZldnJjLT52b2ljZXJlY19tb2RlLAotCQkJKHZvaWQgKilhcmcsIHNpemVvZihzdHJ1Y3QgbXNtX3ZvaWNlcmVjX21vZGUpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQotCQlpZiAoZXZyYy0+dm9pY2VyZWNfbW9kZS5yZWNfbW9kZSAhPSBBVURJT19GTEFHX1JFQUQKLQkJCQkmJiBldnJjLT52b2ljZXJlY19tb2RlLnJlY19tb2RlICE9Ci0JCQkJQVVESU9fRkxBR19JTkNBTExfTUlYRUQpIHsKLQkJCWV2cmMtPnZvaWNlcmVjX21vZGUucmVjX21vZGUgPSBBVURJT19GTEFHX1JFQUQ7Ci0JCQlwcl9lcnIoIlslczolc10gSW52YWxpZCByZWNfbW9kZVxuIiwgX19NTV9GSUxFX18sCi0JCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfU1RSRUFNX0NPTkZJRzoKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmV2cmMtPnN0cl9jZmcsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCi0JCXByX2RlYnVnKCJbJXM6JXNdIEdFVF9TVFJFQU1fQ09ORklHOiBidWZmc3o9JWQsIGJ1ZmZjbnQ9JWRcbiIsCi0JCQkgX19NTV9GSUxFX18sIF9fZnVuY19fLCBldnJjLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplLAotCQkJZXZyYy0+c3RyX2NmZy5idWZmZXJfY291bnQpOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9TVFJFQU1fQ09ORklHOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmV2cmMtPnN0cl9jZmcsICh2b2lkICopYXJnLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCXByX2RlYnVnKCJbJXM6JXNdIFNFVF9TVFJFQU1fQ09ORklHOiBidWZmc3o9JWQsIGJ1ZmZjbnQ9JWRcbiIsCi0JCQkgX19NTV9GSUxFX18sIF9fZnVuY19fLCBldnJjLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplLAotCQkJZXZyYy0+c3RyX2NmZy5idWZmZXJfY291bnQpOwotCi0JCWlmIChldnJjLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplIDwgMjMpIHsKLQkJCXByX2VycigiWyVzOiVzXSBCdWZmZXIgc2l6ZSB0b28gc21hbGxcbiIsIF9fTU1fRklMRV9fLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChldnJjLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCAhPSAyKQotCQkJcHJfaW5mbygiWyVzOiVzXSBCdWZmZXIgY291bnQgc2V0IHRvIDJcbiIsIF9fTU1fRklMRV9fLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX0VWUkNfRU5DX0NPTkZJRzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZldnJjLT5jZmcsICh2b2lkICopIGFyZywKLQkJCQkgc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fZXZyY19lbmNfY29uZmlnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCXByX2RlYnVnKCJbJXM6JXNdIFNFVF9FVlJDX0VOQ19DT05GSUdcbiIsIF9fTU1fRklMRV9fLAotCQkJCV9fZnVuY19fKTsKLQotCQlpZiAoZXZyYy0+Y2ZnLm1pbl9iaXRfcmF0ZSA+IDQgfHwgZXZyYy0+Y2ZnLm1pbl9iaXRfcmF0ZSA8IDEpIHsKLQkJCXByX2VycigiWyVzOiVzXSBpbnZhbGlkIG1pbiBiaXRyYXRlXG4iLCBfX01NX0ZJTEVfXywKLQkJCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQl9Ci0JCWlmIChldnJjLT5jZmcubWF4X2JpdF9yYXRlID4gNCB8fCBldnJjLT5jZmcubWF4X2JpdF9yYXRlIDwgMSkgewotCQkJcHJfZXJyKCJbJXM6JXNdIGludmFsaWQgbWF4IGJpdHJhdGVcbiIsIF9fTU1fRklMRV9fLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19HRVRfRVZSQ19FTkNfQ09ORklHOgotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmV2cmMtPmNmZywKLQkJCQkgc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fZXZyY19lbmNfY29uZmlnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCXByX2RlYnVnKCJbJXM6JXNdIEdFVF9FVlJDX0VOQ19DT05GSUdcbiIsIF9fTU1fRklMRV9fLAotCQkJX19mdW5jX18pOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF91bmxvY2soJmV2cmMtPmxvY2spOwotCXByX2RlYnVnKCJbJXM6JXNdIHJjID0gJWRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBxNl9ldnJjX2luX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGV2cmMgKmV2cmM7Ci0Jc3RydWN0IGV2cmNfZmMgKmZjOwotCWludCBpOwotCi0JcHJfaW5mbygiWyVzOiVzXSBvcGVuXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCWV2cmMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXZyYyksIEdGUF9LRVJORUwpOwotCWlmIChldnJjID09IE5VTEwpIHsKLQkJcHJfZXJyKCJbJXM6JXNdIENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGV2cmMgZHJpdmVyXG4iLAotCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW11dGV4X2luaXQoJmV2cmMtPmxvY2spOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGV2cmM7Ci0JZXZyYy0+YXVkaW9fY2xpZW50ID0gTlVMTDsKLQlldnJjLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplID0gMjM7Ci0JZXZyYy0+c3RyX2NmZy5idWZmZXJfY291bnQgPSAyOwotCWV2cmMtPmNmZy5jZG1hX3JhdGUgPSBDRE1BX1JBVEVfRlVMTDsKLQlldnJjLT5jZmcubWluX2JpdF9yYXRlID0gMTsKLQlldnJjLT5jZmcubWF4X2JpdF9yYXRlID0gNDsKLQlldnJjLT52b2ljZXJlY19tb2RlLnJlY19tb2RlID0gQVVESU9fRkxBR19SRUFEOwotCi0JZXZyYy0+ZXZyY19mYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBldnJjX2ZjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGV2cmMtPmV2cmNfZmMgPT0gTlVMTCkgewotCQlwcl9lcnIoIlslczolc10gQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZXZyY19mY1xuIiwKLQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlrZnJlZShldnJjKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWZjID0gZXZyYy0+ZXZyY19mYzsKLQlmYy0+dGFzayA9IE5VTEw7Ci0JZmMtPmJ1ZmZfaW5kZXggPSAwOwotCWZvciAoaSA9IDA7IGkgPCBFVlJDX0ZDX0JVRkZfQ05UOyArK2kpIHsKLQkJZmMtPmZjX2J1ZmZbaV0uZGF0YSA9IE5VTEw7Ci0JCWZjLT5mY19idWZmW2ldLnNpemUgPSAwOwotCQlmYy0+ZmNfYnVmZltpXS5hY3R1YWxfc2l6ZSA9IDA7Ci0JfQotCS8qaW5pdGlhbGl6ZSB3YWl0IHF1ZXVlIGhlYWQqLwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZjLT5mY193cSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHE2X2V2cmNfaW5fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXN0cnVjdCBldnJjICpldnJjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBldnJjX2ZjICpmYzsKLQlpbnQgeGZlciA9IDA7Ci0JaW50IHJlcyA9IDA7Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXSBjb3VudCA9ICVkXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIGNvdW50KTsKLQltdXRleF9sb2NrKCZldnJjLT5sb2NrKTsKLQlhYyA9IGV2cmMtPmF1ZGlvX2NsaWVudDsKLQlpZiAoIWFjKSB7Ci0JCXJlcyA9IC1FTk9ERVY7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JZmMgPSBldnJjLT5ldnJjX2ZjOwotCXdoaWxlIChjb3VudCA+IHhmZXIpIHsKLQkJLyp3YWl0IGZvciBidWZmZXIgdG8gZnVsbCovCi0JCWlmIChmYy0+ZmNfYnVmZltmYy0+YnVmZl9pbmRleF0uZW1wdHkgIT0gMCkgewotCQkJcmVzID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZmMtPmZjX3dxLAotCQkJCShmYy0+ZmNfYnVmZltmYy0+YnVmZl9pbmRleF0uZW1wdHkgPT0gMCksCi0JCQkJbXNlY3NfdG9famlmZmllcyhFVlJDX1JFQURfVElNRU9VVCkpOwotCi0JCQlwcl9kZWJ1ZygiWyVzOiVzXSBidWZmX2luZGV4ID0gJWRcbiIsIF9fTU1fRklMRV9fLAotCQkJCV9fZnVuY19fLCBmYy0+YnVmZl9pbmRleCk7Ci0JCQlpZiAocmVzID09IDApIHsKLQkJCQlwcl9lcnIoIlslczolc10gVGltZW91dCFcbiIsIF9fTU1fRklMRV9fLAotCQkJCQkJX19mdW5jX18pOwotCQkJCXJlcyA9IC1FVElNRURPVVQ7Ci0JCQkJZ290byBmYWlsOwotCQkJfSBlbHNlIGlmIChyZXMgPCAwKSB7Ci0JCQkJcHJfZXJyKCJbJXM6JXNdIFJldHVybmluZyBvbiBJbnRlcnJ1cHRcbiIsCi0JCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCQl9Ci0JCS8qbG9jayB0aGUgYnVmZmVyKi8KLQkJbXV0ZXhfbG9jaygmKGZjLT5mY19idWZmW2ZjLT5idWZmX2luZGV4XS5sb2NrKSk7Ci0JCXhmZXIgPSBmYy0+ZmNfYnVmZltmYy0+YnVmZl9pbmRleF0uYWN0dWFsX3NpemU7Ci0KLQkJaWYgKHhmZXIgPiBjb3VudCkgewotCQkJbXV0ZXhfdW5sb2NrKCYoZmMtPmZjX2J1ZmZbZmMtPmJ1ZmZfaW5kZXhdLmxvY2spKTsKLQkJCXByX2VycigiWyVzOiVzXSByZWFkIGZhaWxlZCEgYnl0ZSBjb3VudCB0b28gc21hbGxcbiIsCi0JCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCQlyZXMgPSAtRUlOVkFMOwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGZjLT5mY19idWZmW2ZjLT5idWZmX2luZGV4XS5kYXRhLAl4ZmVyKSkgewotCQkJbXV0ZXhfdW5sb2NrKCYoZmMtPmZjX2J1ZmZbZmMtPmJ1ZmZfaW5kZXhdLmxvY2spKTsKLQkJCXByX2VycigiWyVzOiVzXSBjb3B5X3RvX3VzZXIgZmFpbGVkIGF0IGluZGV4ICVkXG4iLAotCQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18sIGZjLT5idWZmX2luZGV4KTsKLQkJCXJlcyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJYnVmICs9IHhmZXI7Ci0JCWNvdW50IC09IHhmZXI7Ci0KLQkJZmMtPmZjX2J1ZmZbZmMtPmJ1ZmZfaW5kZXhdLmVtcHR5ID0gMTsKLQkJZmMtPmZjX2J1ZmZbZmMtPmJ1ZmZfaW5kZXhdLmFjdHVhbF9zaXplID0gMDsKLQotCQltdXRleF91bmxvY2soJihmYy0+ZmNfYnVmZltmYy0+YnVmZl9pbmRleF0ubG9jaykpOwotCQkrKyhmYy0+YnVmZl9pbmRleCk7Ci0JCWlmIChmYy0+YnVmZl9pbmRleCA+PSBFVlJDX0ZDX0JVRkZfQ05UKQotCQkJZmMtPmJ1ZmZfaW5kZXggPSAwOwotCX0KLQlyZXMgPSBidWYgLSBzdGFydDsKLQotZmFpbDoKLQltdXRleF91bmxvY2soJmV2cmMtPmxvY2spOwotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCBxNl9ldnJjX2luX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgZXZyYyAqZXZyYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgaSA9IDA7Ci0Jc3RydWN0IGV2cmNfZmMgKmZjOwotCi0JbXV0ZXhfbG9jaygmZXZyYy0+bG9jayk7Ci0JZmMgPSBldnJjLT5ldnJjX2ZjOwotCWt0aHJlYWRfc3RvcChmYy0+dGFzayk7Ci0JZmMtPnRhc2sgPSBOVUxMOwotCS8qZnJlZSBmbG93IGNvbnRyb2wgYnVmZmVycyovCi0JZm9yIChpID0gMDsgaSA8IEVWUkNfRkNfQlVGRl9DTlQ7ICsraSkgewotCQlrZnJlZShmYy0+ZmNfYnVmZltpXS5kYXRhKTsKLQkJZmMtPmZjX2J1ZmZbaV0uZGF0YSA9IE5VTEw7Ci0JfQotCWtmcmVlKGZjKTsKLQlpZiAoZXZyYy0+YXVkaW9fY2xpZW50KQotCQlyYyA9IHE2YXVkaW9fY2xvc2UoZXZyYy0+YXVkaW9fY2xpZW50KTsKLQltdXRleF91bmxvY2soJmV2cmMtPmxvY2spOwotCWtmcmVlKGV2cmMpOwotCXByX2luZm8oIlslczolc10gcmVsZWFzZVxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHE2X2V2cmNfaW5fZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gcTZfZXZyY19pbl9vcGVuLAotCS5yZWFkCQk9IHE2X2V2cmNfaW5fcmVhZCwKLQkucmVsZWFzZQk9IHE2X2V2cmNfaW5fcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBxNl9ldnJjX2luX2lvY3RsLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgcTZfZXZyY19pbl9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fZXZyY19pbiIsCi0JLmZvcHMJPSAmcTZfZXZyY19pbl9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgcTZfZXZyY19pbl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJnE2X2V2cmNfaW5fbWlzYyk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChxNl9ldnJjX2luX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvbXAzLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9tcDMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmNjIwNC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9tcDMuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9tcDMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOSBIVEMgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21zbV9xZHNwNl9hdWRpby5oPgotI2luY2x1ZGUgPG1hY2gvZGVidWdfbW0uaD4KLQotI2RlZmluZSBCVUZTWiAoODE5MikKLSNkZWZpbmUgRE1BU1ogKEJVRlNaICogMikKLQotc3RydWN0IG1wMyB7Ci0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0JdWludDMyX3Qgc2FtcGxlX3JhdGU7Ci0JdWludDMyX3QgY2hhbm5lbF9jb3VudDsKLX07Ci0KLXN0YXRpYyBsb25nIG1wM19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IG1wMyAqbXAzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9TVEFUUykgewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHN0YXRzOwotCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCopIGFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZtcDMtPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TRVRfVk9MVU1FOiB7Ci0JCWludCB2b2w7Ci0JCXByX2RlYnVnKCJbJXM6JXNdIFNFVF9WT0xVTUUgPSAlZFxuIiwgX19NTV9GSUxFX18sCi0JCQlfX2Z1bmNfXywgdm9sKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2b2wsICh2b2lkKikgYXJnLCBzaXplb2Yodm9sKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXJjID0gcTZhdWRpb19zZXRfc3RyZWFtX3ZvbHVtZShtcDMtPmFjLCB2b2wpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQl1aW50MzJfdCBhY2RiX2lkOwotCQlwcl9kZWJ1ZygiWyVzOiVzXSBBVURJT19TVEFSVFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJaWYgKGFyZyA9PSAwKSB7Ci0JCQlhY2RiX2lkID0gMDsKLQkJfSBlbHNlIGlmIChjb3B5X2Zyb21fdXNlcigmYWNkYl9pZCwgKHZvaWQqKSBhcmcsIHNpemVvZihhY2RiX2lkKSkpIHsKLQkJCXByX2luZm8oIlslczolc10gY29weSBhY2RiX2lkIGZyb20gdXNlciBmYWlsZWRcbiIsCi0JCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAobXAzLT5hYykgewotCQkJcHJfZXJyKCJbJXM6JXNdIGFjdGl2ZSBzZXNzaW9uIGFscmVhZHkgZXhpc3RpbmdcbiIsCi0JCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCXJjID0gLUVCVVNZOwotCQl9IGVsc2UgewotCQkJbXAzLT5hYyA9IHE2YXVkaW9fb3Blbl9tcDMoQlVGU1osCi0JCQkJbXAzLT5zYW1wbGVfcmF0ZSwgbXAzLT5jaGFubmVsX2NvdW50LCBhY2RiX2lkKTsKLQkJCWlmICghbXAzLT5hYykgewotCQkJCXByX2VycigiWyVzOiVzXSBtcDMgb3BlbiBzZXNzaW9uIGZhaWxlZFxuIiwKLQkJCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU1RPUDoKLQkJcHJfZGVidWcoIlslczolc10gQVVESU9fU1RPUFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19GTFVTSDoKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJaWYgKG1wMy0+YWMpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJcHJfZXJyKCJbJXM6JXNdIGFjdGl2ZSBzZXNzaW9uIGFscmVhZHkgZXhpc3RpbmdcbiIsCi0JCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY29uZmlnLCAodm9pZCopIGFyZywgc2l6ZW9mKGNvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlwcl9kZWJ1ZygiWyVzOiVzXSBTRVRfQ09ORklHOiBidWZmc2l6ZSA9ICVkLCBzYW1wbGVyYXRlID0gJWQsIFwKLQkJCWNoYW5uZWxjb3VudCA9ICVkXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sCi0JCQljb25maWcuYnVmZmVyX3NpemUsIGNvbmZpZy5zYW1wbGVfcmF0ZSwKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50KTsKLQkJaWYgKGNvbmZpZy5jaGFubmVsX2NvdW50IDwgMSB8fCBjb25maWcuY2hhbm5lbF9jb3VudCA+IDIpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCXByX2VycigiWyVzOiVzXSBpbnZhbGlkIGNoYW5uZWxjb3VudFxuIiwgX19NTV9GSUxFX18sCi0JCQkJX19mdW5jX18pOwotCQkJYnJlYWs7Ci0JCX0KLQkJbXAzLT5zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLQkJbXAzLT5jaGFubmVsX2NvdW50ID0gY29uZmlnLmNoYW5uZWxfY291bnQ7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQljb25maWcuYnVmZmVyX3NpemUgPSBCVUZTWjsKLQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IDI7Ci0JCWNvbmZpZy5zYW1wbGVfcmF0ZSA9IG1wMy0+c2FtcGxlX3JhdGU7Ci0JCWNvbmZpZy5jaGFubmVsX2NvdW50ID0gbXAzLT5jaGFubmVsX2NvdW50OwotCQljb25maWcudW51c2VkWzBdID0gMDsKLQkJY29uZmlnLnVudXNlZFsxXSA9IDA7Ci0JCWNvbmZpZy51bnVzZWRbMl0gPSAwOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkKikgYXJnLCAmY29uZmlnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCQlwcl9kZWJ1ZygiWyVzOiVzXSBHRVRfQ09ORklHOiBidWZmc2l6ZSA9ICVkLCBzYW1wbGVyYXRlID0gJWQsIFwKLQkJCWNoYW5uZWxjb3VudCA9ICVkXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sCi0JCQljb25maWcuYnVmZmVyX3NpemUsIGNvbmZpZy5zYW1wbGVfcmF0ZSwKLQkJCWNvbmZpZy5jaGFubmVsX2NvdW50KTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZtcDMtPmxvY2spOwotCXByX2RlYnVnKCJbJXM6JXNdIHJjID0gJWRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtcDNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgcmMgPSAwOwotCi0Jc3RydWN0IG1wMyAqbXAzOwotCXByX2luZm8oIlslczolc10gb3BlblxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQltcDMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXAzKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIW1wMykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltdXRleF9pbml0KCZtcDMtPmxvY2spOwotCW1wMy0+Y2hhbm5lbF9jb3VudCA9IDI7Ci0JbXAzLT5zYW1wbGVfcmF0ZSA9IDQ0MTAwOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gbXAzOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgbXAzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgbXAzICptcDMgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0Jc3RydWN0IGF1ZGlvX2J1ZmZlciAqYWI7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCWludCB4ZmVyOwotCi0JcHJfZGVidWcoIlslczolc10gY291bnQgPSAlZFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBjb3VudCk7Ci0JaWYgKCFtcDMtPmFjKQotCQltcDNfaW9jdGwoZmlsZSwgQVVESU9fU1RBUlQsIDApOwotCi0JYWMgPSBtcDMtPmFjOwotCWlmICghYWMpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlhYiA9IGFjLT5idWYgKyBhYy0+Y3B1X2J1ZjsKLQotCQlpZiAoYWItPnVzZWQpCi0JCQl3YWl0X2V2ZW50KGFjLT53YWl0LCAoYWItPnVzZWQgPT0gMCkpOwotCi0JCXByX2RlYnVnKCJbJXM6JXNdIGFiLT5kYXRhID0gJXAsIGFjLT5jcHVfYnVmID0gJWRcbiIsCi0JCQlfX01NX0ZJTEVfXywgX19mdW5jX18sIGFiLT5kYXRhLCBhYy0+Y3B1X2J1Zik7Ci0JCXhmZXIgPSBjb3VudDsKLQkJaWYgKHhmZXIgPiBhYi0+c2l6ZSkKLQkJCXhmZXIgPSBhYi0+c2l6ZTsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoYWItPmRhdGEsIGJ1ZiwgeGZlcikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlidWYgKz0geGZlcjsKLQkJY291bnQgLT0geGZlcjsKLQotCQlhYi0+dXNlZCA9IHhmZXI7Ci0JCXE2YXVkaW9fd3JpdGUoYWMsIGFiKTsKLQkJYWMtPmNwdV9idWYgXj0gMTsKLQl9Ci0KLQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXAzX2ZzeW5jKHN0cnVjdCBmaWxlICpmLCBpbnQgZGF0YXN5bmMpCi17Ci0Jc3RydWN0IG1wMyAqbXAzID0gZi0+cHJpdmF0ZV9kYXRhOwotCWlmIChtcDMtPmFjKQotCQlyZXR1cm4gcTZhdWRpb19hc3luYyhtcDMtPmFjKTsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIGludCBtcDNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgbXAzICptcDMgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaWYgKG1wMy0+YWMpCi0JCXE2YXVkaW9fbXAzX2Nsb3NlKG1wMy0+YWMpOwotCWtmcmVlKG1wMyk7Ci0JcHJfaW5mbygiWyVzOiVzXSByZWxlYXNlXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtcDNfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gbXAzX29wZW4sCi0JLndyaXRlCQk9IG1wM193cml0ZSwKLQkuZnN5bmMJCT0gbXAzX2ZzeW5jLAotCS5yZWxlYXNlCT0gbXAzX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0gbXAzX2lvY3RsLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgbXAzX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gIm1zbV9tcDMiLAotCS5mb3BzCT0gJm1wM19mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXAzX2luaXQodm9pZCkgewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZtcDNfbWlzYyk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChtcDNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9tc21fcTZ2ZGVjLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9tc21fcTZ2ZGVjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjk3NzUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvbXNtX3E2dmRlYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUwOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotLyoKLSNkZWZpbmUgREVCVUdfVFJBQ0VfVkRFQwotI2RlZmluZSBERUJVRwotKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgotCi0jaW5jbHVkZSA8bGludXgvbXNtX3E2dmRlYy5oPgotCi0jaW5jbHVkZSA8bWFjaC9jcHVpZGxlLmg+Ci0KLSNpbmNsdWRlICJkYWwuaCIKLQotI2RlZmluZSBEQUxERVZJQ0VJRF9WREVDX0RFVklDRQkJMHgwMjAwMDAyNgotI2RlZmluZSBEQUxERVZJQ0VJRF9WREVDX1BPUlROQU1FCSJEQUxfQVFfVklEIgotCi0jZGVmaW5lIFZERUNfSU5URVJGQUNFX1ZFUlNJT04JCTB4MDAwMjAwMDAKLQotI2RlZmluZSBNQUpPUl9NQVNLCQkJMHhGRkZGMDAwMAotI2RlZmluZSBNSU5PUl9NQVNLCQkJMHgwMDAwRkZGRgotCi0jZGVmaW5lIFZERUNfR0VUX01BSk9SX1ZFUlNJT04odmVyc2lvbikJKCgodmVyc2lvbikmTUFKT1JfTUFTSyk+PjE2KQotCi0jZGVmaW5lIFZERUNfR0VUX01JTk9SX1ZFUlNJT04odmVyc2lvbikJKCh2ZXJzaW9uKSZNSU5PUl9NQVNLKQotCi0jaWZkZWYgREVCVUdfVFJBQ0VfVkRFQwotI2RlZmluZSBUUkFDRShmbXQseC4uLikJCQlcCi0JZG8geyBwcl9kZWJ1ZygiJXM6JWQgIiBmbXQsIF9fZnVuY19fLCBfX0xJTkVfXywgIyN4KTsgfSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIFRSQUNFKGZtdCx4Li4uKQkJZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNkZWZpbmUgWUFNQVRPX0NPTE9SX0ZPUk1BVCAgMHgwMgotI2RlZmluZSBNQVhfUTZfTE9BRCAgICAgICAgKCg3MjAqMTI4MCkvMjU2KSAgLyogNzIwcCAqLwotI2RlZmluZSBNQVhfUTZfTE9BRF9ZQU1BVE8gKCg3MzYqMTI4MCkvMjU2KQotI2RlZmluZSBNQVhfUTZfTE9BRF9WUDYgICAgKCg4MDAqNDgwKS8yNTYpCi0KLSNkZWZpbmUgVkRFQ19NQVhfUE9SVFMgNAotCi0vKgotICp3aHkgbWFnaWMgbnVtYmVyIDMwMD8KLQotICp0aGUgTWF4aW11bSBzaXplIG9mIHRoZSBEQUwgcGF5bG9hZCBpcyA1MTIgYnl0ZXMgYWNjb3JkaW5nIHRvIERBTCBwcm90b2NvbAotICpJbml0aWFsaXplIGNhbGwgdG8gUURTUDYgZnJvbSBzY29ycGlvbiBuZWVkIHRvIHNlbmQgc2VxdWVuY2UgaGVhZGVyIGFzIHBhcnQgb2YKLSAqdGhlIERBTCBwYXlsb2FkLiBEQUwgcGF5bG9hZCB0byBpbml0aWFsaXplIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKLQotICoxKSBjb25maWd1cmF0aW9uIGRhdGEtIDUyIGJ5dGVzIDIpIGxlbmd0aCBmaWVsZCBvZiBjb25maWcgZGF0YSAtIDQgYnl0ZXMKLSAqMykgc2VxdWVuY2UgaGVhZGVyIGRhdGEgKCB0aGF0IGlzIGZyb20gdGhlIGJpdCBzdHJlYW0pCi0gKjQpIGxlbmd0aCBmaWVsZCBmb3Igc2VxdWVuY2UgaGVhZGVyIC0gNCBieXRlcwotICo1KSBsZW5ndGggZmllbGQgZm9yIG91dHB1dCBzdHJ1Y3R1cmUgLSA0IGJ5dGVzCi0KLSAqdGhhdCBsZWZ0IHdpdGggNTEyIC0gNjggPSA0NDggYnl0ZXMuIEl0IGlzIHVudXN1YWwgdGhhdCB3ZSBnZXQgYSBzZXF1ZW5jZQotICpoZWFkZXIgd2l0aCBzdWNoIGEgYmlnIGxlbmd0aCB1bmxlc3MgdGhlIGJpdCBzdHJlYW0gaGFzIG11bHRpcGxlIHNlcXVlbmNlCi0gKmhlYWRlcnMuV2UgZXN0aW1hdGVkIDMwMCBpcyBnb29kIGVub3VnaCB3aGljaCBnaXZlcyBlbm91Z2ggcm9vbSBmb3IgcmVzdAotICpvZiB0aGUgcGF5bG9hZCBhbmQgZXZlbiByZXNlcnZlcyBzb21lIHNwYWNlIGZvciBmdXR1cmUgcGF5bG9hZC4KLSAqLwotCi0jZGVmaW5lIFZERUNfTUFYX1NFUV9IRUFERVJfU0laRSAzMDAKLQotY2hhciAqUTZQb3J0bmFtZXNbXSA9IHsKLSJEQUxfQVFfVklEXzAiLAotIkRBTF9BUV9WSURfMSIsCi0iREFMX0FRX1ZJRF8yIiwKLSJEQUxfQVFfVklEXzMiCi19OwotCi0KLQotI2RlZmluZSBEQUxERVZJQ0VJRF9WREVDX0RFVklDRV8wICAgICAgICAweDAyMDAwMEQyCi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzEgICAgICAgIDB4MDIwMDAwRDMKLSNkZWZpbmUgREFMREVWSUNFSURfVkRFQ19ERVZJQ0VfMiAgICAgICAgMHgwMjAwMDBENAotI2RlZmluZSBEQUxERVZJQ0VJRF9WREVDX0RFVklDRV8zICAgICAgICAweDAyMDAwMEQ1Ci0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzQgICAgICAgIDB4MDIwMDAwRDYKLSNkZWZpbmUgREFMREVWSUNFSURfVkRFQ19ERVZJQ0VfNSAgICAgICAgMHgwMjAwMDBENwotI2RlZmluZSBEQUxERVZJQ0VJRF9WREVDX0RFVklDRV82ICAgICAgICAweDAyMDAwMEQ4Ci0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzcgICAgICAgIDB4MDIwMDAwRDkKLSNkZWZpbmUgREFMREVWSUNFSURfVkRFQ19ERVZJQ0VfOCAgICAgICAgMHgwMjAwMDBEQQotI2RlZmluZSBEQUxERVZJQ0VJRF9WREVDX0RFVklDRV85ICAgICAgICAweDAyMDAwMERCCi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzEwICAgICAgICAweDAyMDAwMERDCi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzExICAgICAgICAweDAyMDAwMERECi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzEyICAgICAgICAweDAyMDAwMERFCi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzEzICAgICAgICAweDAyMDAwMERGCi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzE0ICAgICAgICAweDAyMDAwMEUwCi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzE1ICAgICAgICAweDAyMDAwMEUxCi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzE2ICAgICAgICAweDAyMDAwMEUyCi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzE3ICAgICAgICAweDAyMDAwMEUzCi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzE4ICAgICAgICAweDAyMDAwMEU0Ci0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzE5ICAgICAgICAweDAyMDAwMEU1Ci0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzIwICAgICAgICAweDAyMDAwMEU2Ci0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzIxICAgICAgICAweDAyMDAwMEU3Ci0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzIyICAgICAgICAweDAyMDAwMEU4Ci0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzIzICAgICAgICAweDAyMDAwMEU5Ci0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzI0ICAgICAgICAweDAyMDAwMEVBCi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzI1ICAgICAgICAweDAyMDAwMEVCCi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzI2ICAgICAgICAweDAyMDAwMEVDCi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzI3ICAgICAgICAweDAyMDAwMEVECi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzI4ICAgICAgICAweDAyMDAwMEVFCi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzI5ICAgICAgICAweDAyMDAwMEVGCi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzMwICAgICAgICAweDAyMDAwMEYwCi0jZGVmaW5lIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzMxICAgICAgICAweDAyMDAwMEYxCi0KLSNkZWZpbmUgREFMVkRFQ19NQVhfREVWSUNFX0lEUyAgICAgICAgMzIKLQotCi1zdGF0aWMgaW50IG51bU9mUG9ydHM7Ci0KLQotc3RhdGljIGNoYXIgbG9hZE9uUG9ydHNbVkRFQ19NQVhfUE9SVFNdOwotCi1zdGF0aWMgY2hhciBkZXZpY2VJZFJlZ2lzdHJ5W0RBTFZERUNfTUFYX0RFVklDRV9JRFNdOwotCi0KLSNkZWZpbmUgVkRFQ19ERVZJRF9GUkVFIDAKLSNkZWZpbmUgVkRFQ19ERVZJRF9PQ0NVUElFRCAxCi0KLSNkZWZpbmUgTUFYX1NVUFBPUlRFRF9JTlNUQU5DRVMgNgotCi0jZGVmaW5lICBNQUtFRk9VUkNDKGNoMCwgY2gxLCBjaDIsIGNoMykgKCh1bnNpZ25lZCBpbnQpKHVuc2lnbmVkIGNoYXIpKGNoMCkgfCBcCi0JKCh1bnNpZ25lZCBpbnQpKHVuc2lnbmVkIGNoYXIpKGNoMSkgPDwgOCkgfCBcCi0JKCh1bnNpZ25lZCBpbnQpKHVuc2lnbmVkIGNoYXIpKGNoMikgPDwgMTYpIHwgXAotCSgodW5zaWduZWQgaW50KSh1bnNpZ25lZCBjaGFyKShjaDMpIDw8IDI0KSkKLQotI2RlZmluZSBGT1VSQ0NfTVBFRzQgTUFLRUZPVVJDQygnbScsICdwJywgJzQnLCAndicpCi0jZGVmaW5lIEZPVVJDQ19IMjYzIE1BS0VGT1VSQ0MoJ2gnLCAnMicsICc2JywgJzMnKQotI2RlZmluZSBGT1VSQ0NfSDI2NCBNQUtFRk9VUkNDKCdoJywgJzInLCAnNicsICc0JykKLSNkZWZpbmUgRk9VUkNDX1ZDMSBNQUtFRk9VUkNDKCd3JywgJ20nLCAndicsICczJykKLSNkZWZpbmUgRk9VUkNDX0RJVlggTUFLRUZPVVJDQygnRCcsICdJJywgJ1YnLCAnWCcpCi0jZGVmaW5lIEZPVVJDQ19TUEFSSyBNQUtFRk9VUkNDKCdGJywgJ0wnLCAnVicsICcxJykKLSNkZWZpbmUgRk9VUkNDX1ZQNiBNQUtFRk9VUkNDKCdWJywgJ1AnLCAnNicsICcwJykKLQotLyogc3RhdGljIHN0cnVjdCB2ZGVjX2RhdGEgKm11bHRpSW5zdGFuY2VzW01BWF9TVVBQT1JURURfSU5TVEFOQ0VTXTsqLwotCi1zdGF0aWMgaW50IHRvdGFsUGxheWJhY2tRNmxvYWQ7Ci1zdGF0aWMgaW50IHRvdGFsVG5haWxRNmxvYWQ7Ci0KLSNkZWZpbmUgRkxBR19USFVNQk5BSUxfTU9ERSAgMHg4Ci0jZGVmaW5lIE1BWF9UTkFJTFMgIDMKLQotI2RlZmluZSBUUlVFIDEKLSNkZWZpbmUgRkFMU0UgMAotCi1lbnVtIHsKLQlWREVDX0RBTFJQQ19JTklUSUFMSVpFID0gREFMX09QX0ZJUlNUX0RFVklDRV9BUEksCi0JVkRFQ19EQUxSUENfU0VUQlVGRkVSUywKLQlWREVDX0RBTFJQQ19GUkVFQlVGRkVSUywKLQlWREVDX0RBTFJQQ19RVUVVRSwKLQlWREVDX0RBTFJQQ19TSUdFT0ZTVFJFQU0sCi0JVkRFQ19EQUxSUENfRkxVU0gsCi0JVkRFQ19EQUxSUENfUkVVU0VGUkFNRUJVRkZFUiwKLQlWREVDX0RBTFJQQ19HRVRERUNBVFRSSUJVVEVTLAotCVZERUNfREFMUlBDX1NVU1BFTkQsCi0JVkRFQ19EQUxSUENfUkVTVU1FLAotCVZERUNfREFMUlBDX0lOSVRJQUxJWkVfMDAsCi0JVkRFQ19EQUxSUENfR0VUSU5URVJOQUxCVUZGRVJSRVEsCi0JVkRFQ19EQUxSUENfU0VUQlVGRkVSU18wMCwKLQlWREVDX0RBTFJQQ19GUkVFQlVGRkVSU18wMCwKLQlWREVDX0RBTFJQQ19HRVRQUk9QRVJUWSwKLQlWREVDX0RBTFJQQ19TRVRQUk9QRVJUWSwKLQlWREVDX0RBTFJQQ19HRVRERUNBVFRSSUJVVEVTXzAwLAotCVZERUNfREFMUlBDX1BFUkZPUk1BTkNFX0NIQU5HRV9SRVFVRVNUCi19OwotCi1lbnVtIHsKLQlWREVDX0FTWU5DTVNHX0RFQ09ERV9ET05FID0gMHhkZWMwZGUwMCwKLQlWREVDX0FTWU5DTVNHX1JFVVNFX0ZSQU1FLAotfTsKLQotc3RydWN0IHZkZWNfaW5pdF9jZmcgewotCXUzMgkJCWRlY29kZV9kb25lX2V2dDsKLQl1MzIJCQlyZXVzZV9mcmFtZV9ldnQ7Ci0Jc3RydWN0IHZkZWNfY29uZmlnCWNmZzsKLX07Ci0KLXN0cnVjdCB2ZGVjX2J1ZmZlcl9zdGF0dXMgewotCXUzMgkJCWRhdGE7Ci0JdTMyCQkJc3RhdHVzOwotfTsKLQotI2RlZmluZSBWREVDX01TR19NQVgJCTEyOAotCi1zdHJ1Y3QgdmRlY19tc2dfbGlzdCB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCXN0cnVjdCB2ZGVjX21zZwkJdmRlY19tc2c7Ci19OwotCi1zdHJ1Y3QgdmRlY19tZW1faW5mbyB7Ci0JdTMyCQkJYnVmX3R5cGU7Ci0JdTMyCQkJaWQ7Ci0JdW5zaWduZWQgbG9uZwkJcGh5c19hZGRyOwotCXVuc2lnbmVkIGxvbmcJCWxlbjsKLQlzdHJ1Y3QgZmlsZQkJKmZpbGU7Ci19OwotCi1zdHJ1Y3QgdmRlY19tZW1fbGlzdCB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCXN0cnVjdCB2ZGVjX21lbV9pbmZvCW1lbTsKLX07Ci0KLXN0cnVjdCB2aWRlb1N0cmVhbURldGFpbHN7Ci0JaW50IGhlaWdodDsKLQlpbnQgd2lkdGg7Ci0JdW5zaWduZWQgaW50IGZvdXJjYzsKLQlpbnQgUTZ1c2FnZTsKLQlib29sIGlzVGhpc1RuYWlsOwotCWJvb2wgaXNUbmFpbEdyYW50ZWQ7Ci19OwotCi1zdHJ1Y3QgdmRlY19kYXRhIHsKLQlzdHJ1Y3QgZGFsX2NsaWVudAkqdmRlY19oYW5kbGU7Ci0JdW5zaWduZWQgaW50IFE2ZGV2aWNlSWQ7Ci0Jc3RydWN0IHZpZGVvU3RyZWFtRGV0YWlscyBzdHJlYW1EZXRhaWxzOwotCXN0cnVjdCBsaXN0X2hlYWQJdmRlY19tc2dfbGlzdF9oZWFkOwotCXN0cnVjdCBsaXN0X2hlYWQJdmRlY19tc2dfbGlzdF9mcmVlOwotCXdhaXRfcXVldWVfaGVhZF90CXZkZWNfbXNnX2V2dDsKLQlzcGlubG9ja190CQl2ZGVjX2xpc3RfbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkCXZkZWNfbWVtX2xpc3RfaGVhZDsKLQlzcGlubG9ja190CQl2ZGVjX21lbV9saXN0X2xvY2s7Ci0JaW50CQkJbWVtX2luaXRpYWxpemVkOwotCWludAkJCXJ1bm5pbmc7Ci0JaW50CQkJY2xvc2VfZGVjb2RlOwotfTsKLQotc3RhdGljIHN0cnVjdCBjbGFzcyAqZHJpdmVyX2NsYXNzOwotc3RhdGljIGRldl90IHZkZWNfZGV2aWNlX25vOwotc3RhdGljIHN0cnVjdCBjZGV2IHZkZWNfY2RldjsKLXN0YXRpYyBpbnQgcmVmX2NudDsKLXN0YXRpYyBERUZJTkVfTVVURVgodmRlY19yZWZfbG9jayk7Ci0KLXN0YXRpYyBERUZJTkVfTVVURVgoaWRsZWNvdW50X2xvY2spOwotCi1zdGF0aWMgREVGSU5FX01VVEVYKHZkZWNfcm1fbG9jayk7Ci0KLXN0YXRpYyBpbnQgaWRsZWNvdW50Owotc3RhdGljIHN0cnVjdCB3YWtlX2xvY2sgd2FrZWxvY2s7Ci1zdGF0aWMgc3RydWN0IHBtX3Fvc19yZXF1ZXN0IHBtX3Fvc19yZXE7Ci0KLXN0YXRpYyB2b2lkIHByZXZlbnRfc2xlZXAodm9pZCkKLXsKLQltdXRleF9sb2NrKCZpZGxlY291bnRfbG9jayk7Ci0JaWYgKCsraWRsZWNvdW50ID09IDEpIHsKLQkJcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KCZwbV9xb3NfcmVxLAotCQkJCSAgICAgIG1zbV9jcHVpZGxlX2dldF9kZWVwX2lkbGVfbGF0ZW5jeSgpKTsKLQkJd2FrZV9sb2NrKCZ3YWtlbG9jayk7Ci0JfQotCW11dGV4X3VubG9jaygmaWRsZWNvdW50X2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBhbGxvd19zbGVlcCh2b2lkKQotewotCW11dGV4X2xvY2soJmlkbGVjb3VudF9sb2NrKTsKLQlpZiAoLS1pZGxlY291bnQgPT0gMCkgewotCQl3YWtlX3VubG9jaygmd2FrZWxvY2spOwotCQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJnBtX3Fvc19yZXEsIFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZpZGxlY291bnRfbG9jayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHZkZWNfY2hlY2tfdmVyc2lvbih1MzIgY2xpZW50LCB1MzIgc2VydmVyKQotewotCWludCByZXQgPSAtRUlOVkFMOwotCWlmICgoVkRFQ19HRVRfTUFKT1JfVkVSU0lPTihjbGllbnQpID09IFZERUNfR0VUX01BSk9SX1ZFUlNJT04oc2VydmVyKSkKLQkgICAgJiYgKFZERUNfR0VUX01JTk9SX1ZFUlNJT04oY2xpZW50KSA8PQotCQlWREVDX0dFVF9NSU5PUl9WRVJTSU9OKHNlcnZlcikpKQotCQlyZXQgPSAwOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmRlY19nZXRfbXNnKHN0cnVjdCB2ZGVjX2RhdGEgKnZkLCB2b2lkICptc2cpCi17Ci0Jc3RydWN0IHZkZWNfbXNnX2xpc3QgKmw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghdmQtPnJ1bm5pbmcpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmQtPnZkZWNfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGwsICZ2ZC0+dmRlY19tc2dfbGlzdF9oZWFkLCBsaXN0KSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIobXNnLCAmbC0+dmRlY19tc2csIHNpemVvZihzdHJ1Y3QgdmRlY19tc2cpKSkKLQkJCXByX2VycigidmRlY19nZXRfbXNnIGZhaWxlZCB0byBjb3B5X3RvX3VzZXIhXG4iKTsKLQkJaWYgKGwtPnZkZWNfbXNnLmlkID09IFZERUNfTVNHX1JFVVNFSU5QVVRCVUZGRVIpCi0JCQlUUkFDRSgicmV1c2VfaW5wdXRfYnVmZmVyICVkXG4iLCBsLT52ZGVjX21zZy5idWZfaWQpOwotCQllbHNlIGlmIChsLT52ZGVjX21zZy5pZCA9PSBWREVDX01TR19GUkFNRURPTkUpCi0JCQlUUkFDRSgiZnJhbWVfZG9uZSAoc3RhdD0lZClcbiIsCi0JCQkgICAgICBsLT52ZGVjX21zZy52ZnJfaW5mby5zdGF0dXMpOwotCQllbHNlCi0JCQlUUkFDRSgidW5rbm93biBtc2cgKG1zZ2lkPSVkKVxuIiwgbC0+dmRlY19tc2cuaWQpOwotCQlsaXN0X2RlbCgmbC0+bGlzdCk7Ci0JCWxpc3RfYWRkKCZsLT5saXN0LCAmdmQtPnZkZWNfbXNnX2xpc3RfZnJlZSk7Ci0JCXJldCA9IDE7Ci0JCWJyZWFrOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZC0+dmRlY19saXN0X2xvY2ssIGZsYWdzKTsKLQotCWlmICh2ZC0+Y2xvc2VfZGVjb2RlKQotCQlyZXQgPSAxOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgdmRlY19wdXRfbXNnKHN0cnVjdCB2ZGVjX2RhdGEgKnZkLCBzdHJ1Y3QgdmRlY19tc2cgKm1zZykKLXsKLQlzdHJ1Y3QgdmRlY19tc2dfbGlzdCAqbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBmb3VuZCA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmQtPnZkZWNfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShsLCAmdmQtPnZkZWNfbXNnX2xpc3RfZnJlZSwgbGlzdCkgewotCQltZW1jcHkoJmwtPnZkZWNfbXNnLCBtc2csIHNpemVvZihzdHJ1Y3QgdmRlY19tc2cpKTsKLQkJbGlzdF9kZWwoJmwtPmxpc3QpOwotCQlsaXN0X2FkZCgmbC0+bGlzdCwgJnZkLT52ZGVjX21zZ19saXN0X2hlYWQpOwotCQlmb3VuZCA9IDE7Ci0JCWJyZWFrOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZC0+dmRlY19saXN0X2xvY2ssIGZsYWdzKTsKLQotCWlmIChmb3VuZCkKLQkJd2FrZV91cCgmdmQtPnZkZWNfbXNnX2V2dCk7Ci0JZWxzZQotCQlwcl9lcnIoInZkZWNfcHV0X21zZyBjYW4ndCBmaW5kIGZyZWUgbGlzdCFcbiIpOwotfQotCi1zdGF0aWMgc3RydWN0IHZkZWNfbWVtX2xpc3QgKnZkZWNfZ2V0X21lbV9mcm9tX2xpc3Qoc3RydWN0IHZkZWNfZGF0YSAqdmQsCi0JCQkJCQkgICAgdTMyIHBtZW1faWQsIHUzMiBidWZfdHlwZSkKLXsKLQlzdHJ1Y3QgdmRlY19tZW1fbGlzdCAqbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBmb3VuZCA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmQtPnZkZWNfbWVtX2xpc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkobCwgJnZkLT52ZGVjX21lbV9saXN0X2hlYWQsIGxpc3QpIHsKLQkJaWYgKGwtPm1lbS5idWZfdHlwZSA9PSBidWZfdHlwZSAmJiBsLT5tZW0uaWQgPT0gcG1lbV9pZCkgewotCQkJZm91bmQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmQtPnZkZWNfbWVtX2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGZvdW5kKQotCQlyZXR1cm4gbDsKLQllbHNlCi0JCXJldHVybiBOVUxMOwotCi19Ci1zdGF0aWMgaW50IHZkZWNfc2V0cHJvcGVydHkoc3RydWN0IHZkZWNfZGF0YSAqdmQsIHZvaWQgKmFyZ3ApCi17Ci0Jc3RydWN0IHZkZWNfcHJvcGVydHlfaW5mbyBwcm9wZXJ0eTsKLQlpbnQgcmVzOwotCi0gICBpZiAoY29weV9mcm9tX3VzZXIoJnByb3BlcnR5LCBhcmdwLCBzaXplb2Yoc3RydWN0IHZkZWNfcHJvcGVydHlfaW5mbykpKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXMgPSBkYWxfY2FsbF9mNih2ZC0+dmRlY19oYW5kbGUsIFZERUNfREFMUlBDX1NFVFBST1BFUlRZLAotICAgICAgcHJvcGVydHkuaWQsICYocHJvcGVydHkucHJvcGVydHkpLCBzaXplb2YodW5pb24gdmRlY19wcm9wZXJ0eSkpOwotCWlmIChyZXMpCi0JCVRSQUNFKCJTZXQgUHJvcGVydHkgZmFpbGVkIik7Ci0JZWxzZQotCQlUUkFDRSgiU2V0IFByb3BlcnR5IHN1Y2NlZWRlZCIpOwotCXJldHVybiByZXM7Ci19Ci1zdGF0aWMgaW50IHZkZWNfZ2V0cHJvcGVydHkoc3RydWN0IHZkZWNfZGF0YSAqdmQsIHZvaWQgKmFyZ3ApCi17Ci0JaW50IHJlczsKLQl1bmlvbiB2ZGVjX3Byb3BlcnR5IHByb3BlcnR5ID0gezB9OwotCi0JcmVzID0gZGFsX2NhbGxfZjExKHZkLT52ZGVjX2hhbmRsZSwgVkRFQ19EQUxSUENfR0VUUFJPUEVSVFksCi0JCSgoc3RydWN0IHZkZWNfcHJvcGVydHlfaW5mbyAqKWFyZ3ApLT5pZCwgJnByb3BlcnR5LAotCQlzaXplb2YodW5pb24gdmRlY19wcm9wZXJ0eSkpOwotCi0JaWYgKHJlcykKLQkJVFJBQ0UoImdldCBQcm9wZXJ0eSBmYWlsZWQiKTsKLQllbHNlCi0JCVRSQUNFKCJnZXQgUHJvcGVydHkgc3VjY2VlZGVkIik7Ci0KLQlyZXMgPSBjb3B5X3RvX3VzZXIoCi0JCSgmKChzdHJ1Y3QgdmRlY19wcm9wZXJ0eV9pbmZvICopYXJncCktPnByb3BlcnR5KSwKLQkJJnByb3BlcnR5LCBzaXplb2YocHJvcGVydHkpKTsKLQotCXJldHVybiByZXM7Ci19Ci1zdGF0aWMgaW50IHZkZWNfcGVyZm9ybWFuY2VfY2hhbmdlX3JlcXVlc3Qoc3RydWN0IHZkZWNfZGF0YSAqdmQsIHZvaWQqIGFyZ3ApCi17Ci0JdTMyIHJlcXVlc3RfdHlwZTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gY29weV9mcm9tX3VzZXIoJnJlcXVlc3RfdHlwZSwgYXJncCwgc2l6ZW9mKHJlcXVlc3RfdHlwZSkpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldCA9IGRhbF9jYWxsX2YwKHZkLT52ZGVjX2hhbmRsZSwKLQkJCVZERUNfREFMUlBDX1BFUkZPUk1BTkNFX0NIQU5HRV9SRVFVRVNULAotCQkJcmVxdWVzdF90eXBlKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHJlbW90ZSBmdW5jdGlvbiBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLSNpZmRlZiBUUkFDRV9QT1JUUwotc3RhdGljIHZvaWQgcHJpbnRwb3J0c2FuZGRldmljZWlkcyh2b2lkKQotewotCWludCBpOwotCi0JcHJfZXJyKCJcblxuJXM6bG9hZE9uUG9ydHMiLCBfX2Z1bmNfXyk7Ci0JZm9yIChpID0gMDsgaSA8IG51bU9mUG9ydHM7IGkrKykKLQkJcHJfZXJyKCJcdCVkIiwgbG9hZE9uUG9ydHNbaV0pOwotCi0JcHJfZXJyKCJcblxuIik7Ci0KLQlwcl9lcnIoIlxuXG4lczpEZXZpZHMiLCBfX2Z1bmNfXyk7Ci0JZm9yIChpID0gMDsgaSA8IERBTFZERUNfTUFYX0RFVklDRV9JRFM7IGkrKykKLQkJcHJfZXJyKCJEZXZpZFslZF06JWRcbiIsIGksIGRldmljZUlkUmVnaXN0cnlbaV0pOwotCi0KLQlwcl9lcnIoIlxuXG4iKTsKLX0KLSNlbmRpZiAvKlRSQUNFX1BPUlRTKi8KLQotCi0vKgotICoKLSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBudW1iZXIgb2YgcG9ydHMgc3VwcG9ydGVkIG9uIHRoZSBRNgotICoKLSAqLwotc3RhdGljIGludCB2ZGVjX2dldF9udW1iZXJvZnE2cG9ydHModm9pZCkKLXsKLQlzdHJ1Y3QgZGFsX2NsaWVudCAqdmRlY19oYW5kbGUgPSBOVUxMOwotCWludCByZXR2YWwgPSAwOwotCXVuaW9uIHZkZWNfcHJvcGVydHkgcHJvcGVydHkgPSB7MH07Ci0KLQl2ZGVjX2hhbmRsZSA9IGRhbF9hdHRhY2goREFMREVWSUNFSURfVkRFQ19ERVZJQ0UsCi0JCQkgICAgIERBTERFVklDRUlEX1ZERUNfUE9SVE5BTUUsIDEsIE5VTEwsIE5VTEwpOwotCWlmICghdmRlY19oYW5kbGUpIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGF0dGFjaFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMTsvKiBkZWZhdWx0IHNldHRpbmcgKi8KLQl9Ci0KLQlyZXR2YWwgPSBkYWxfY2FsbF9mNih2ZGVjX2hhbmRsZSwgVkRFQ19EQUxSUENfR0VUUFJPUEVSVFksCi0gICAgICBWREVDX05VTV9EQUxfUE9SVFMsICh2b2lkICopJnByb3BlcnR5LCBzaXplb2YodW5pb24gdmRlY19wcm9wZXJ0eSkpOwotCWlmIChyZXR2YWwpIHsKLQkJcHJfZXJyKCIlczogUTZnZXQgcHJwZXJ0eSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDE7LyogZGVmYXVsdCBzZXR0aW5nICovCi0JfQotCi0JZGFsX2RldGFjaCh2ZGVjX2hhbmRsZSk7Ci0JcmV0dXJuIHByb3BlcnR5Lm51bV9kYWxfcG9ydHMgOwotfQotCi0KLS8qKgotICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBmaW5kIHRoZSBsZWFzdCBsb2FkZWQgcG9ydCBhbmQgYSBjb3JyZXNwb25kaW5nCi0gICogZnJlZSBkZXZpY2UgaWQgaW4gdGhhdCBwb3J0LgotICAqCi0gICogUHJlcmVxdWlzaXRlOiB2ZGVjX29wZW4gc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQuCi0gICoKLSAgKiAgQHBhcmFtW2luXSBkZXZpY2VpZAotICAqICAgICBkZXZpY2UgaWQgd2lsbCBiZSBwb3B1bGF0ZWQgaGVyZS4KLSAgKgotICAqICBAcGFyYW1baW5dIHBvcnRuYW1lCi0gICogICAgIHBvcnRuYW1lIHdpbGwgYmUgcG9wdWxhdGVkIGhlcmUuCi0gICovCi1zdGF0aWMgdm9pZCB2ZGVjX2dldF9uZXh0X3BvcnRhbmRkZXZpZChpbnQgKmRldmljZWlkLCBjaGFyICoqcG9ydG5hbWUpCi17Ci0KLQlpbnQgaSA9IDA7Ci0JaW50IGxlYXN0TG9hZCA9IDA7Ci0JaW50IGxlYXN0TG9hZGVkSW5kZXggPSAwOwotCi0JaWYgKDAgPT0gbnVtT2ZQb3J0cykgewotCQludW1PZlBvcnRzID0gdmRlY19nZXRfbnVtYmVyb2ZxNnBvcnRzKCk7Ci0JCXByX2VycigiJXM6IFE2Z2V0IG51bU9mUG9ydHMgJWRcbiIsIF9fZnVuY19fLCBudW1PZlBvcnRzKTsKLQkJbnVtT2ZQb3J0cyA9IDQ7Ci0JCS8qZml4OiBtZSBjdXJyZW50bHkgaGFyZCBjb2RlZCB0byA0IGFzCi0JCSAqdGhlIFE2IGdldHByb3BlcnR5IGlzIGZhaWxpbmcKLQkJICovCi0JfQotCi0JaWYgKChOVUxMID09IGRldmljZWlkKSB8fCAoTlVMTCA9PSBwb3J0bmFtZSkpCi0JCXJldHVybjsKLQllbHNlCi0JCSpkZXZpY2VpZCA9IDA7IC8qIGluaXQgdmFsdWUgKi8KLQotCWlmIChudW1PZlBvcnRzID4gMSkgewotCQkvKiBtdWx0aSBwb3J0cyBtb2RlKi8KLQotCQkvKiBmaW5kIHRoZSBsZWFzdCBsb2FkZWQgcG9ydCovCi0JCWZvciAoaSA9IDEsIGxlYXN0TG9hZCA9IGxvYWRPblBvcnRzWzBdLCBsZWFzdExvYWRlZEluZGV4ID0gMDsKLQkJCQkJaSA8IG51bU9mUG9ydHM7IGkrKykgewotCQkJaWYgKGxlYXN0TG9hZCA+IGxvYWRPblBvcnRzW2ldKSB7Ci0JCQkJbGVhc3RMb2FkZWRJbmRleCA9IGk7Ci0JCQkJbGVhc3RMb2FkID0gbG9hZE9uUG9ydHNbaV07Ci0JCQl9Ci0JCX0KLQotCQkvKiByZWdpc3RlciB0aGUgbG9hZCAqLwotCQlsb2FkT25Qb3J0c1tsZWFzdExvYWRlZEluZGV4XSsrOwotCQkqcG9ydG5hbWUgPSBRNlBvcnRuYW1lc1tsZWFzdExvYWRlZEluZGV4XTsKLQotCQkvKiBmaW5kIGEgZnJlZSBkZXZpY2UgaWQgY29ycmVzcG9uZGluZyB0byB0aGUgcG9ydCovCi0JCWZvciAoaSA9IGxlYXN0TG9hZGVkSW5kZXg7IGkgPCBEQUxWREVDX01BWF9ERVZJQ0VfSURTOwotCQkJCQlpICs9IG51bU9mUG9ydHMpIHsKLQkJCWlmIChWREVDX0RFVklEX0ZSRUUgPT0gZGV2aWNlSWRSZWdpc3RyeVtpXSkgewotCQkJCWRldmljZUlkUmVnaXN0cnlbaV0gPSBWREVDX0RFVklEX09DQ1VQSUVEOwotCQkJCSpkZXZpY2VpZCA9IERBTERFVklDRUlEX1ZERUNfREVWSUNFXzAgKyBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLSNpZmRlZiBUUkFDRV9QT1JUUwotCQlwcmludHBvcnRzYW5kZGV2aWNlaWRzKCk7Ci0jZW5kaWYgLypUUkFDRV9QT1JUUyovCi0JfSBlbHNlIGlmICgxID09IG51bU9mUG9ydHMpIHsKLQkJLyogc2luZ2xlIHBvcnQgbW9kZSAqLwotCQkqZGV2aWNlaWQgPSBEQUxERVZJQ0VJRF9WREVDX0RFVklDRTsKLQkJKnBvcnRuYW1lID0gREFMREVWSUNFSURfVkRFQ19QT1JUTkFNRTsKLQl9IGVsc2UgaWYgKG51bU9mUG9ydHMgPD0gMCkgewotCQlwcl9lcnIoIiVzOiBGQVRBTCBlcnJvciBudW1PZlBvcnRzIGNhbm5vdCBiZSBcCi0JCQlsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVyb1xuIiwgX19mdW5jX18pOwotCX0KLQotCi19Ci0KLQotLyoqCi0gICogVGhpcyBtZXRob2QgZnJlZXMgdXAgdGhlIHVzZWQgZGV2IGlkIGFuZCBkZWNyZW1lbnRzIHRoZSBwb3J0IGxvYWQuCi0gICoKLSAgKi8KLQotc3RhdGljIHZvaWQgdmRlY19mcmVldXBfcG9ydGFuZGRldmlkKGludCBkZXZpY2VpZCkKLXsKLQotCWlmIChudW1PZlBvcnRzID4gMSkgewotCQkvKiBtdWx0aSBwb3J0cyBtb2RlKi8KLQkJaWYgKFZERUNfREVWSURfRlJFRSA9PQotCQkJZGV2aWNlSWRSZWdpc3RyeVtkZXZpY2VpZCAtIERBTERFVklDRUlEX1ZERUNfREVWSUNFXzBdKQotCQkJcHJfZXJyKCJkZXZpY2UgaWQgY2Fubm90IGJlIGFscmVhZHkgZnJlZVxuIik7Ci0JCWRldmljZUlkUmVnaXN0cnlbZGV2aWNlaWQgLSBEQUxERVZJQ0VJRF9WREVDX0RFVklDRV8wXSA9Ci0JCQlWREVDX0RFVklEX0ZSRUU7Ci0KLQkJbG9hZE9uUG9ydHNbKGRldmljZWlkIC0gREFMREVWSUNFSURfVkRFQ19ERVZJQ0VfMCkKLQkJCSUgbnVtT2ZQb3J0c10tLTsKLQotCQlpZiAobG9hZE9uUG9ydHNbKGRldmljZWlkIC0gREFMREVWSUNFSURfVkRFQ19ERVZJQ0VfMCkKLQkJCSUgbnVtT2ZQb3J0c10gPCAwKQotCQkJcHJfZXJyKCJXYXJuaW5nOmxvYWQgY2Fubm90IGJlIG5lZ2F0aXZlXG4iKTsKLQotCQlwcl9lcnIoImRldHRhY2hpbmcgb24gZGV2aWNlaWQgJXggcG9ydG5hbWUgJXNcbiIsIGRldmljZWlkLAotCQkJUTZQb3J0bmFtZXNbKGRldmljZWlkIC0gREFMREVWSUNFSURfVkRFQ19ERVZJQ0VfMCkKLQkJCSUgbnVtT2ZQb3J0c10pOwotCi0jaWZkZWYgVFJBQ0VfUE9SVFMKLQkJcHJpbnRwb3J0c2FuZGRldmljZWlkcygpOwotI2VuZGlmIC8qVFJBQ0VfUE9SVFMqLwotCX0gZWxzZSB7Ci0JCS8qc2luZ2xlIHBvcnQgbW9kZSwgbm90aGluZyB0byBiZSBkb25lIGhlcmUqLwotCX0KLQotfQotCi0KLS8qKgotICAqIFRoaXMgbWV0aG9kIHZhbGlkYXRlcyB3aGV0aGVyIGEgbmV3IGluc3RhbmNlIGNhbiBiZSBob3VyZWQgb3Igbm90LgotICAqCi0gICovCi1zdGF0aWMgaW50IHZkZWNfcm1fY2hlY2tXaXRoUm0oc3RydWN0IHZkZWNfZGF0YSAqdmRlY0luc3RhbmNlLAotCQkJCXVuc2lnbmVkIGludCBjb2xvcl9mb3JtYXQpCi17Ci0KLQl1bnNpZ25lZCBpbnQgbWF4UTZsb2FkID0gMDsvKiBpbiB0aGUgdW5pdHMgb2YgbWFjcm8gYmxvY2tzIHBlciBzZWNvbmQgKi8KLQl1bnNpZ25lZCBpbnQgY3VycmVudHE2bG9hZCA9IDA7Ci0Jc3RydWN0IHZpZGVvU3RyZWFtRGV0YWlscyAqc3RyZWFtRGV0YWlscyA9ICZ2ZGVjSW5zdGFuY2UtPnN0cmVhbURldGFpbHM7Ci0KLQotCi0JaWYgKHN0cmVhbURldGFpbHMtPmlzVGhpc1RuYWlsKSB7Ci0JCWlmICh0b3RhbFRuYWlsUTZsb2FkIDwgTUFYX1ROQUlMUykgewotCi0JCQl0b3RhbFRuYWlsUTZsb2FkKys7Ci0JCQlzdHJlYW1EZXRhaWxzLT5pc1RuYWlsR3JhbnRlZCA9IFRSVUU7Ci0JCQlwcl9pbmZvKCIlczogdGh1bWJuYWlsIGdyYW50ZWQgJWRcbiIsIF9fZnVuY19fLAotCQkJCXRvdGFsVG5haWxRNmxvYWQpOwotCQkJcmV0dXJuIDA7Ci0KLQkJfSBlbHNlIHsKLQotCQkJcHJfZXJyKCIlczogdGh1bWJuYWlscyBsb2FkIG1heCB0aGlzIGluc3RhbmNlIGNhbm5vdCBcCi0JCQkJCWJlIHN1cHBvcnRlZFxuIiwgX19mdW5jX18pOwotCQkJc3RyZWFtRGV0YWlscy0+aXNUbmFpbEdyYW50ZWQgPSBGQUxTRTsKLQkJCXJldHVybiAtRU5PU1BDOwotCi0JCX0KLQl9Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIFE2IHBlcmNlbnRhZ2UgaW5zdGFuY2Ugd291bGQgbmVlZCAqLwotCWlmICgoc3RyZWFtRGV0YWlscy0+Zm91cmNjID09IEZPVVJDQ19NUEVHNCkgfHwKLQkJIChzdHJlYW1EZXRhaWxzLT5mb3VyY2MgID09IEZPVVJDQ19IMjY0KSB8fAotCQkgKHN0cmVhbURldGFpbHMtPmZvdXJjYyAgPT0gRk9VUkNDX0RJVlgpIHx8Ci0JCSAoc3RyZWFtRGV0YWlscy0+Zm91cmNjICA9PSBGT1VSQ0NfVkMxKSB8fAotCQkgKHN0cmVhbURldGFpbHMtPmZvdXJjYyAgPT0gRk9VUkNDX1NQQVJLKSB8fAotCQkgKHN0cmVhbURldGFpbHMtPmZvdXJjYyAgPT0gRk9VUkNDX0gyNjMpCi0JCSl7Ci0KLQkJLyogaXMgeWFtYXRvIGNvbG9yIGZvcm1hdCwKLQkJICBSb3VuZHMgdGhlIEggJiBXIC0tPiBtdXRpcGxlIG9mIDMyICovCi0JCWlmIChjb2xvcl9mb3JtYXQgPT0gWUFNQVRPX0NPTE9SX0ZPUk1BVCkKLQkJCW1heFE2bG9hZCA9IE1BWF9RNl9MT0FEX1lBTUFUTzsKLQkJZWxzZQotCQkJbWF4UTZsb2FkID0gTUFYX1E2X0xPQUQ7IC8qIDcyMHAgKi8KLQotCX0gZWxzZSBpZiAoc3RyZWFtRGV0YWlscy0+Zm91cmNjICA9PSBGT1VSQ0NfVlA2KSB7Ci0KLQkJbWF4UTZsb2FkID0gTUFYX1E2X0xPQURfVlA2OyAgICAvKiBGV1ZHQSAqLwotCi0JfSBlbHNlIHsKLQotCQlwcl9lcnIoIiVzOiB1bmtub3duIGZvdXJjYyAlZCAgbWF4UTZsb2FkICV1XG4iLCBfX2Z1bmNfXywKLQkJCXN0cmVhbURldGFpbHMtPmZvdXJjYywgbWF4UTZsb2FkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl9Ci0KLQljdXJyZW50cTZsb2FkID0gKChzdHJlYW1EZXRhaWxzLT5oZWlnaHQpKihzdHJlYW1EZXRhaWxzLT53aWR0aCkgLyAyNTYpOwotCWN1cnJlbnRxNmxvYWQgPSAoKGN1cnJlbnRxNmxvYWQgKiAxMDApL21heFE2bG9hZCk7Ci0JaWYgKChjdXJyZW50cTZsb2FkK3RvdGFsUGxheWJhY2tRNmxvYWQpID4gMTAwKSB7Ci0JCS8qIHJlamVjdCB0aGlzIGluc3RhbmNlICovCi0JCXByX2VycigiJXM6IHRvbyBtdWNoIFE2bG9hZCBbY3VyK3RvdF0gPSBbJWQgKyAlZF0gPSAlZCIsCi0JCV9fZnVuY19fLCBjdXJyZW50cTZsb2FkLCB0b3RhbFBsYXliYWNrUTZsb2FkLAotCQkoY3VycmVudHE2bG9hZCt0b3RhbFBsYXliYWNrUTZsb2FkKSk7Ci0JCXByX2VycigicmVqZWN0aW5nIHRoZSBpbnN0YW5jZSxbV3hIXSA9IFslZCB4ICVkXSxjb2xvcl9mbXQ9MHgleFxuIiwKLQkJc3RyZWFtRGV0YWlscy0+d2lkdGgsIHN0cmVhbURldGFpbHMtPmhlaWdodCwgY29sb3JfZm9ybWF0KTsKLQkJcHJfZXJyKCJWREVDX2ZtdD0lc1xuIiwgKGNoYXIgKikoJnN0cmVhbURldGFpbHMtPmZvdXJjYykpOwotCQlzdHJlYW1EZXRhaWxzLT5RNnVzYWdlID0gMDsKLQkJcmV0dXJuIC1FTk9TUEM7Ci0JfQotCi0JdG90YWxQbGF5YmFja1E2bG9hZCArPSBjdXJyZW50cTZsb2FkOwotCXN0cmVhbURldGFpbHMtPlE2dXNhZ2UgPSBjdXJyZW50cTZsb2FkOwotCi0JcHJfaW5mbygiJXM6IGFkZGluZyBhIGxvYWQgWyVkJSVdIGJyaW5naW5nIHRvdGFsIFE2bG9hZCB0byBbJWQlJV1cbiIsCi0JCV9fZnVuY19fLCBjdXJyZW50cTZsb2FkLCB0b3RhbFBsYXliYWNrUTZsb2FkKTsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgdmRlY19pbml0aWFsaXplKHN0cnVjdCB2ZGVjX2RhdGEgKnZkLCB2b2lkICphcmdwKQotewotCXN0cnVjdCB2ZGVjX2NvbmZpZ19zcHMgdmRlY19jZmdfc3BzOwotCXN0cnVjdCB2ZGVjX2luaXRfY2ZnIHZpX2NmZzsKLQlzdHJ1Y3QgdmRlY19idWZfcmVxIHZkZWNfYnVmX3JlcTsKLQlzdHJ1Y3QgdTggKmhlYWRlcjsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IGNvcHlfZnJvbV91c2VyKCZ2ZGVjX2NmZ19zcHMsCi0JCQkgICAgICYoKHN0cnVjdCB2ZGVjX2luaXQgKilhcmdwKS0+c3BzX2NmZywKLQkJCSAgICAgc2l6ZW9mKHZkZWNfY2ZnX3NwcykpOwotCi0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQl2aV9jZmcuZGVjb2RlX2RvbmVfZXZ0ID0gVkRFQ19BU1lOQ01TR19ERUNPREVfRE9ORTsKLQl2aV9jZmcucmV1c2VfZnJhbWVfZXZ0ID0gVkRFQ19BU1lOQ01TR19SRVVTRV9GUkFNRTsKLQltZW1jcHkoJnZpX2NmZy5jZmcsICZ2ZGVjX2NmZ19zcHMuY2ZnLCBzaXplb2Yoc3RydWN0IHZkZWNfY29uZmlnKSk7Ci0KLQkvKgotCSAqIHJlc3RyaWN0aW5nIHRoZSBtYXggdmFsdWUgb2YgdGhlIHNlcSBoZWFkZXIKLQkgKi8KLQlpZiAodmRlY19jZmdfc3BzLnNlcS5sZW4gPiBWREVDX01BWF9TRVFfSEVBREVSX1NJWkUpCi0JCXZkZWNfY2ZnX3Nwcy5zZXEubGVuID0gVkRFQ19NQVhfU0VRX0hFQURFUl9TSVpFOwotCi0JaGVhZGVyID0ga21hbGxvYyh2ZGVjX2NmZ19zcHMuc2VxLmxlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoZWFkZXIpIHsKLQkJcHJfZXJyKCIlczoga21hbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcmV0ID0gY29weV9mcm9tX3VzZXIoaGVhZGVyLAotCQkJICAgICAoKHN0cnVjdCB2ZGVjX2luaXQgKilhcmdwKS0+c3BzX2NmZy5zZXEuaGVhZGVyLAotCQkJICAgICB2ZGVjX2NmZ19zcHMuc2VxLmxlbik7Ci0KLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlrZnJlZShoZWFkZXIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCVRSQUNFKCJ2aV9jZmc6IGhhbmRsZT0lcCBmb3VyY2M9MHgleCB3PSVkIGg9JWQgb3JkZXI9JWQgbm90aWZ5X2VuPSVkICIKLQkgICAgICAidmMxX3JiPSVkIGgyNjRfc2Q9JWQgaDI2NF9ubHM9JWQgcHBfZmxhZz0lZCBmcnVjX2VuPSVkXG4iLAotCSAgICAgIHZkLT52ZGVjX2hhbmRsZSwgdmlfY2ZnLmNmZy5mb3VyY2MsIHZpX2NmZy5jZmcud2lkdGgsCi0JICAgICAgdmlfY2ZnLmNmZy5oZWlnaHQsIHZpX2NmZy5jZmcub3JkZXIsIHZpX2NmZy5jZmcubm90aWZ5X2VuYWJsZSwKLQkgICAgICB2aV9jZmcuY2ZnLnZjMV9yb3diYXNlLCB2aV9jZmcuY2ZnLmgyNjRfc3RhcnRjb2RlX2RldGVjdCwKLQkgICAgICB2aV9jZmcuY2ZnLmgyNjRfbmFsX2xlbl9zaXplLCB2aV9jZmcuY2ZnLnBvc3Rwcm9jX2ZsYWcsCi0JICAgICAgdmlfY2ZnLmNmZy5mcnVjX2VuYWJsZSk7Ci0KLQl2ZC0+c3RyZWFtRGV0YWlscy5oZWlnaHQgPSB2aV9jZmcuY2ZnLmhlaWdodDsKLQl2ZC0+c3RyZWFtRGV0YWlscy53aWR0aCA9IHZpX2NmZy5jZmcud2lkdGg7Ci0JdmQtPnN0cmVhbURldGFpbHMuZm91cmNjID0gdmlfY2ZnLmNmZy5mb3VyY2M7Ci0JaWYgKEZMQUdfVEhVTUJOQUlMX01PREUgPT0gdmlfY2ZnLmNmZy5wb3N0cHJvY19mbGFnKQotCQl2ZC0+c3RyZWFtRGV0YWlscy5pc1RoaXNUbmFpbCA9IFRSVUU7Ci0JZWxzZQotCQl2ZC0+c3RyZWFtRGV0YWlscy5pc1RoaXNUbmFpbCA9IEZBTFNFOwotCi0JbXV0ZXhfbG9jaygmdmRlY19ybV9sb2NrKTsKLQlyZXQgPSB2ZGVjX3JtX2NoZWNrV2l0aFJtKHZkLCB2aV9jZmcuY2ZnLmNvbG9yX2Zvcm1hdCk7Ci0JbXV0ZXhfdW5sb2NrKCZ2ZGVjX3JtX2xvY2spOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBkYWxfY2FsbF9mMTModmQtPnZkZWNfaGFuZGxlLCBWREVDX0RBTFJQQ19JTklUSUFMSVpFLAotCQkJICAgJnZpX2NmZywgc2l6ZW9mKHZpX2NmZyksCi0JCQkgICBoZWFkZXIsIHZkZWNfY2ZnX3Nwcy5zZXEubGVuLAotCQkJICAgJnZkZWNfYnVmX3JlcSwgc2l6ZW9mKHZkZWNfYnVmX3JlcSkpOwotCi0Ja2ZyZWUoaGVhZGVyKTsKLQotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IHJlbW90ZSBmdW5jdGlvbiBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7Ci0JZWxzZQotCQlyZXQgPSBjb3B5X3RvX3VzZXIoKChzdHJ1Y3QgdmRlY19pbml0ICopYXJncCktPmJ1Zl9yZXEsCi0JCQkJICAgJnZkZWNfYnVmX3JlcSwgc2l6ZW9mKHZkZWNfYnVmX3JlcSkpOwotCi0JdmQtPmNsb3NlX2RlY29kZSA9IDA7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgdmRlY19ybV9mcmVldXBSZXNvdXJjZXMoc3RydWN0IHZkZWNfZGF0YSAqdmRlY0luc3RhbmNlKQotewotCXN0cnVjdCB2aWRlb1N0cmVhbURldGFpbHMgKnN0cmVhbURldGFpbHMgPSAmdmRlY0luc3RhbmNlLT5zdHJlYW1EZXRhaWxzOwotCi0KLQotCWlmICgoc3RyZWFtRGV0YWlscy0+aXNUaGlzVG5haWwpICYmCi0JCSAoc3RyZWFtRGV0YWlscy0+aXNUbmFpbEdyYW50ZWQpKSB7Ci0KLQkJCXRvdGFsVG5haWxRNmxvYWQtLTsKLQkJCXByX2luZm8oIiVzOiBUaHVtYm5haWwgcmVsZWFzZWQgJWRcbiIsIF9fZnVuY19fLAotCQkJCXRvdGFsVG5haWxRNmxvYWQpOwotCi0JfSBlbHNlIGlmIChzdHJlYW1EZXRhaWxzLT5RNnVzYWdlID4gMCkgewotCi0JCXRvdGFsUGxheWJhY2tRNmxvYWQgLT0gc3RyZWFtRGV0YWlscy0+UTZ1c2FnZTsKLQkJaWYgKHRvdGFsUGxheWJhY2tRNmxvYWQgPCAwKQotCQkJcHJfZXJyKCJXYXJuaW5nOlE2bG9hZCBjYW5ub3QgYmUgbmVnYXRpdmVcbiIpOwotCi0JCXByX2luZm8oIiVzOlJlbGVhc2luZyBbJWQlJV0gb2YgUTZsb2FkIGZyb20gYSB0b3RhbCBvZiBbJWQlJV1cbiIKLQkJCSwgX19mdW5jX18sIHN0cmVhbURldGFpbHMtPlE2dXNhZ2UsCi0JCQkoc3RyZWFtRGV0YWlscy0+UTZ1c2FnZSt0b3RhbFBsYXliYWNrUTZsb2FkKSk7Ci0JfQotCi19Ci0KLXN0YXRpYyBpbnQgdmRlY19zZXRidWZmZXJzKHN0cnVjdCB2ZGVjX2RhdGEgKnZkLCB2b2lkICphcmdwKQotewotCXN0cnVjdCB2ZGVjX2J1ZmZlciB2bWVtOwotCXN0cnVjdCB2ZGVjX21lbV9saXN0ICpsOwotCXVuc2lnbmVkIGxvbmcgdnN0YXJ0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHsKLQkJdWludDMyX3Qgc2l6ZTsKLQkJc3RydWN0IHZkZWNfYnVmX2luZm8gYnVmOwotCX0gcnBjOwotCXVpbnQzMl90IHJlczsKLQotCWludCByZXQgPSAwOwotCi0JdmQtPm1lbV9pbml0aWFsaXplZCA9IDA7Ci0KLQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmdm1lbSwgYXJncCwgc2l6ZW9mKHZtZW0pKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmRlY19tZW1fbGlzdCksIEdGUF9LRVJORUwpOwotCWlmICghbCkgewotCQlwcl9lcnIoIiVzOiBremFsbG9jIGZhaWxlZCFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JbC0+bWVtLmlkID0gdm1lbS5wbWVtX2lkOwotCWwtPm1lbS5idWZfdHlwZSA9IHZtZW0uYnVmLmJ1Zl90eXBlOwotCi0JcmV0ID0gZ2V0X3BtZW1fZmlsZShsLT5tZW0uaWQsICZsLT5tZW0ucGh5c19hZGRyLCAmdnN0YXJ0LAotCQkJICAgICZsLT5tZW0ubGVuLCAmbC0+bWVtLmZpbGUpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogZ2V0X3BtZW1fZmQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX2dldF9wbWVtX2ZpbGU7Ci0JfQotCi0JVFJBQ0UoInBtZW1faWQ9JWQgKHBoeXM9MHglMDhseCBsZW49MHglbHgpIGJ1ZnR5cGU9JWQgbnVtX2J1Zj0lZCAiCi0JICAgICAgImlzbGFzdD0lZCBzcmNfaWQ9JWQgb2Zmc2V0PTB4JTA4eCBzaXplPTB4JXhcbiIsCi0JICAgICAgdm1lbS5wbWVtX2lkLCBsLT5tZW0ucGh5c19hZGRyLCBsLT5tZW0ubGVuLAotCSAgICAgIHZtZW0uYnVmLmJ1Zl90eXBlLCB2bWVtLmJ1Zi5udW1fYnVmLCB2bWVtLmJ1Zi5pc2xhc3QsCi0JICAgICAgdm1lbS5idWYucmVnaW9uLnNyY19pZCwgdm1lbS5idWYucmVnaW9uLm9mZnNldCwKLQkgICAgICB2bWVtLmJ1Zi5yZWdpb24uc2l6ZSk7Ci0KLQkvKiBpbnB1dCBidWZmZXJzICovCi0JaWYgKCh2bWVtLmJ1Zi5yZWdpb24ub2Zmc2V0ICsgdm1lbS5idWYucmVnaW9uLnNpemUpID4gbC0+bWVtLmxlbikgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGlucHV0IGJ1ZmZlciBvZmZzZXQhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX2JhZF9vZmZzZXQ7Ci0KLQl9Ci0Jdm1lbS5idWYucmVnaW9uLm9mZnNldCArPSBsLT5tZW0ucGh5c19hZGRyOwotCi0JcnBjLnNpemUgPSBzaXplb2Yodm1lbS5idWYpOwotCW1lbWNweSgmcnBjLmJ1ZiwgJnZtZW0uYnVmLCBzaXplb2Yoc3RydWN0IHZkZWNfYnVmX2luZm8pKTsKLQotCi0JcmV0ID0gZGFsX2NhbGwodmQtPnZkZWNfaGFuZGxlLCBWREVDX0RBTFJQQ19TRVRCVUZGRVJTLCA1LAotCQkgICAgICAgJnJwYywgc2l6ZW9mKHJwYyksICZyZXMsIHNpemVvZihyZXMpKTsKLQotCWlmIChyZXQgPCA0KSB7Ci0JCXByX2VycigiJXM6IHJlbW90ZSBmdW5jdGlvbiBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gZXJyX2RhbF9jYWxsOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZC0+dmRlY19tZW1fbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGQoJmwtPmxpc3QsICZ2ZC0+dmRlY19tZW1fbGlzdF9oZWFkKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZC0+dmRlY19tZW1fbGlzdF9sb2NrLCBmbGFncyk7Ci0KLQl2ZC0+bWVtX2luaXRpYWxpemVkID0gMTsKLQlyZXR1cm4gcmV0OwotCi1lcnJfZGFsX2NhbGw6Ci1lcnJfYmFkX29mZnNldDoKLQlwdXRfcG1lbV9maWxlKGwtPm1lbS5maWxlKTsKLWVycl9nZXRfcG1lbV9maWxlOgotCWtmcmVlKGwpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmRlY19xdWV1ZShzdHJ1Y3QgdmRlY19kYXRhICp2ZCwgdm9pZCAqYXJncCkKLXsKLQlzdHJ1Y3QgewotCQl1aW50MzJfdCBzaXplOwotCQlzdHJ1Y3QgdmRlY19pbnB1dF9idWZfaW5mbyBidWZfaW5mbzsKLQkJdWludDMyX3Qgb3NpemU7Ci0JfSBycGM7Ci0Jc3RydWN0IHZkZWNfbWVtX2xpc3QgKmw7Ci0Jc3RydWN0IHsKLQkJdWludDMyX3QgcmVzdWx0OwotCQl1aW50MzJfdCBzaXplOwotCQlzdHJ1Y3QgdmRlY19xdWV1ZV9zdGF0dXMgc3RhdHVzOwotCX0gcnBjX3JlczsKLQotCXUzMiBwbWVtX2lkOwotCWludCByZXQgPSAwOwotCi0JaWYgKCF2ZC0+bWVtX2luaXRpYWxpemVkKSB7Ci0JCXByX2VycigiJXM6IG1lbW9yeSBpcyBub3QgYmVpbmcgaW5pdGlhbGl6ZWQhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi0JcmV0ID0gY29weV9mcm9tX3VzZXIoJnJwYy5idWZfaW5mbywKLQkJCSAgICAgJigoc3RydWN0IHZkZWNfaW5wdXRfYnVmICopYXJncCktPmJ1ZmZlciwKLQkJCSAgICAgc2l6ZW9mKHJwYy5idWZfaW5mbykpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gY29weV9mcm9tX3VzZXIoJnBtZW1faWQsCi0JCQkgICAgICYoKHN0cnVjdCB2ZGVjX2lucHV0X2J1ZiAqKWFyZ3ApLT5wbWVtX2lkLAotCQkJICAgICBzaXplb2YodTMyKSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlsID0gdmRlY19nZXRfbWVtX2Zyb21fbGlzdCh2ZCwgcG1lbV9pZCwgVkRFQ19CVUZGRVJfVFlQRV9JTlBVVCk7Ci0KLQlpZiAoTlVMTCA9PSBsKSB7Ci0JCXByX2VycigiJXM6IG5vdCBhYmxlIHRvIGZpbmQgdGhlIGJ1ZmZlciBmcm9tIGxpc3RcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0KLQlpZiAoKHJwYy5idWZfaW5mby5zaXplICsgcnBjLmJ1Zl9pbmZvLm9mZnNldCkgPj0gbC0+bWVtLmxlbikgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHF1ZXVlIGJ1ZmZlciBvZmZzZXQhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJwYy5idWZfaW5mby5vZmZzZXQgKz0gbC0+bWVtLnBoeXNfYWRkcjsKLQlycGMuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdmRlY19pbnB1dF9idWZfaW5mbyk7Ci0JcnBjLm9zaXplID0gc2l6ZW9mKHN0cnVjdCB2ZGVjX3F1ZXVlX3N0YXR1cyk7Ci0KLQkvKiBjb21wbGV0ZSB0aGUgd3JpdGVzIHRvIHRoZSBidWZmZXIgKi8KLQl3bWIoKTsKLQlyZXQgPSBkYWxfY2FsbCh2ZC0+dmRlY19oYW5kbGUsIFZERUNfREFMUlBDX1FVRVVFLCA4LAotCQkgICAgICAgJnJwYywgc2l6ZW9mKHJwYyksICZycGNfcmVzLCBzaXplb2YocnBjX3JlcykpOwotCWlmIChyZXQgPCA0KSB7Ci0JCXByX2VycigiJXM6IHJlbW90ZSBmdW5jdGlvbiBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7Ci0JCXJldCA9IC1FSU87Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmRlY19yZXVzZV9mcmFtZWJ1ZmZlcihzdHJ1Y3QgdmRlY19kYXRhICp2ZCwgdm9pZCAqYXJncCkKLXsKLQl1MzIgYnVmX2lkOwotCWludCByZXQgPSAwOwotCi0JcmV0ID0gY29weV9mcm9tX3VzZXIoJmJ1Zl9pZCwgYXJncCwgc2l6ZW9mKGJ1Zl9pZCkpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gZGFsX2NhbGxfZjAodmQtPnZkZWNfaGFuZGxlLCBWREVDX0RBTFJQQ19SRVVTRUZSQU1FQlVGRkVSLAotCQkJICBidWZfaWQpOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IHJlbW90ZSBmdW5jdGlvbiBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZkZWNfZmx1c2goc3RydWN0IHZkZWNfZGF0YSAqdmQsIHZvaWQgKmFyZ3ApCi17Ci0JdTMyIGZsdXNoX3R5cGU7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIXZkLT5tZW1faW5pdGlhbGl6ZWQpIHsKLQkJcHJfZXJyKCIlczogbWVtb3J5IGlzIG5vdCBiZWluZyBpbml0aWFsaXplZCFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0KLQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmZmx1c2hfdHlwZSwgYXJncCwgc2l6ZW9mKGZsdXNoX3R5cGUpKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCVRSQUNFKCJmbHVzaF90eXBlPSVkXG4iLCBmbHVzaF90eXBlKTsKLQlyZXQgPSBkYWxfY2FsbF9mMCh2ZC0+dmRlY19oYW5kbGUsIFZERUNfREFMUlBDX0ZMVVNILCBmbHVzaF90eXBlKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHJlbW90ZSBmdW5jdGlvbiBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2ZGVjX2Nsb3NlKHN0cnVjdCB2ZGVjX2RhdGEgKnZkLCB2b2lkICphcmdwKQotewotCXN0cnVjdCB2ZGVjX21lbV9saXN0ICpsOwotCWludCByZXQgPSAwOwotCi0JcHJfaW5mbygicTZ2ZGVjX2Nsb3NlKClcbiIpOwotCXZkLT5jbG9zZV9kZWNvZGUgPSAxOwotCXdha2VfdXAoJnZkLT52ZGVjX21zZ19ldnQpOwotCi0JcmV0ID0gZGFsX2NhbGxfZjAodmQtPnZkZWNfaGFuZGxlLCBEQUxfT1BfQ0xPU0UsIDApOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IGZhaWxlZCB0byBjbG9zZSBkYWxkZXZpY2UgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlpZiAodmQtPm1lbV9pbml0aWFsaXplZCkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGwsICZ2ZC0+dmRlY19tZW1fbGlzdF9oZWFkLCBsaXN0KQotCQkJcHV0X3BtZW1fZmlsZShsLT5tZW0uZmlsZSk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLXN0YXRpYyBpbnQgdmRlY19nZXRkZWNhdHRyaWJ1dGVzKHN0cnVjdCB2ZGVjX2RhdGEgKnZkLCB2b2lkICphcmdwKQotewotCXN0cnVjdCB7Ci0JCXVpbnQzMl90IHN0YXR1czsKLQkJdWludDMyX3Qgc2l6ZTsKLQkJc3RydWN0IHZkZWNfZGVjX2F0dHJpYnV0ZXMgZGVjX2F0dHI7Ci0JfSBycGM7Ci0JdWludDMyX3QgaW5wOwotCWludCByZXQgPSAwOwotCWlucCA9IHNpemVvZihzdHJ1Y3QgdmRlY19kZWNfYXR0cmlidXRlcyk7Ci0KLQlyZXQgPSBkYWxfY2FsbCh2ZC0+dmRlY19oYW5kbGUsIFZERUNfREFMUlBDX0dFVERFQ0FUVFJJQlVURVMsIDksCi0JCSAgICAgICAmaW5wLCBzaXplb2YoaW5wKSwgJnJwYywgc2l6ZW9mKHJwYykpOwotCWlmIChyZXQgPCA0IHx8IHJwYy5zaXplICE9IHNpemVvZihzdHJ1Y3QgdmRlY19kZWNfYXR0cmlidXRlcykpIHsKLQkJcHJfZXJyKCIlczogcmVtb3RlIGZ1bmN0aW9uIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0ID0gLUVJTzsKLQl9IGVsc2UKLQkJcmV0ID0KLQkJICAgIGNvcHlfdG9fdXNlcigoKHN0cnVjdCB2ZGVjX2RlY19hdHRyaWJ1dGVzICopYXJncCksCi0JCQkJICZycGMuZGVjX2F0dHIsIHNpemVvZihycGMuZGVjX2F0dHIpKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZkZWNfZnJlZWJ1ZmZlcnMoc3RydWN0IHZkZWNfZGF0YSAqdmQsIHZvaWQgKmFyZ3ApCi17Ci0Jc3RydWN0IHZkZWNfYnVmZmVyIHZtZW07Ci0Jc3RydWN0IHZkZWNfbWVtX2xpc3QgKmw7Ci0Jc3RydWN0IHsKLQkJdWludDMyX3Qgc2l6ZTsKLQkJc3RydWN0IHZkZWNfYnVmX2luZm8gYnVmOwotCX0gcnBjOwotCXVpbnQzMl90IHJlczsKLQotCWludCByZXQgPSAwOwotCi0JaWYgKCF2ZC0+bWVtX2luaXRpYWxpemVkKSB7Ci0JCXByX2VycigiJXM6IG1lbW9yeSBpcyBub3QgYmVpbmcgaW5pdGlhbGl6ZWQhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi0JcmV0ID0gY29weV9mcm9tX3VzZXIoJnZtZW0sIGFyZ3AsIHNpemVvZih2bWVtKSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlsID0gdmRlY19nZXRfbWVtX2Zyb21fbGlzdCh2ZCwgdm1lbS5wbWVtX2lkLCB2bWVtLmJ1Zi5idWZfdHlwZSk7Ci0KLQlpZiAoTlVMTCA9PSBsKSB7Ci0JCXByX2VycigiJXM6IG5vdCBhYmxlIHRvIGZpbmQgdGhlIGJ1ZmZlciBmcm9tIGxpc3RcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0KLQkvKiBpbnB1dCBidWZmZXJzICovCi0JaWYgKCh2bWVtLmJ1Zi5yZWdpb24ub2Zmc2V0ICsgdm1lbS5idWYucmVnaW9uLnNpemUpID4gbC0+bWVtLmxlbikgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGlucHV0IGJ1ZmZlciBvZmZzZXQhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCi0JfQotCXZtZW0uYnVmLnJlZ2lvbi5vZmZzZXQgKz0gbC0+bWVtLnBoeXNfYWRkcjsKLQotCXJwYy5zaXplID0gc2l6ZW9mKHZtZW0uYnVmKTsKLQltZW1jcHkoJnJwYy5idWYsICZ2bWVtLmJ1Ziwgc2l6ZW9mKHN0cnVjdCB2ZGVjX2J1Zl9pbmZvKSk7Ci0KLQlyZXQgPSBkYWxfY2FsbCh2ZC0+dmRlY19oYW5kbGUsIFZERUNfREFMUlBDX0ZSRUVCVUZGRVJTLCA1LAotCQkgICAgICAgJnJwYywgc2l6ZW9mKHJwYyksICZyZXMsIHNpemVvZihyZXMpKTsKLQlpZiAocmV0IDwgNCkgewotCQlwcl9lcnIoIiVzOiByZW1vdGUgZnVuY3Rpb24gZmFpbGVkICglZClcbiIsIF9fZnVuY19fLCByZXQpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmRlY19nZXR2ZXJzaW9uKHN0cnVjdCB2ZGVjX2RhdGEgKnZkLCB2b2lkICphcmdwKQotewotCXN0cnVjdCB2ZGVjX3ZlcnNpb24gdmVyX2luZm87Ci0JaW50IHJldCA9IDA7Ci0KLQl2ZXJfaW5mby5tYWpvciA9IFZERUNfR0VUX01BSk9SX1ZFUlNJT04oVkRFQ19JTlRFUkZBQ0VfVkVSU0lPTik7Ci0JdmVyX2luZm8ubWlub3IgPSBWREVDX0dFVF9NSU5PUl9WRVJTSU9OKFZERUNfSU5URVJGQUNFX1ZFUlNJT04pOwotCi0JcmV0ID0gY29weV90b191c2VyKCgoc3RydWN0IHZkZWNfdmVyc2lvbiAqKWFyZ3ApLAotCQkJCSZ2ZXJfaW5mbywgc2l6ZW9mKHZlcl9pbmZvKSk7Ci0KLQlyZXR1cm4gcmV0OwotCi19Ci0KLXN0YXRpYyBsb25nIHZkZWNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCB2ZGVjX2RhdGEgKnZkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWludCByZXQgPSAwOwotCi0JaWYgKCF2ZC0+cnVubmluZykKLQkJcmV0dXJuIC1FUEVSTTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWREVDX0lPQ1RMX0lOSVRJQUxJWkU6Ci0JCXJldCA9IHZkZWNfaW5pdGlhbGl6ZSh2ZCwgYXJncCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWREVDX0lPQ1RMX1NFVEJVRkZFUlM6Ci0JCXJldCA9IHZkZWNfc2V0YnVmZmVycyh2ZCwgYXJncCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWREVDX0lPQ1RMX1FVRVVFOgotCQlUUkFDRSgiVkRFQ19JT0NUTF9RVUVVRSAocGlkPSVkIHRpZD0lZClcbiIsCi0JCSAgICAgIGN1cnJlbnQtPmdyb3VwX2xlYWRlci0+cGlkLCBjdXJyZW50LT5waWQpOwotCQlyZXQgPSB2ZGVjX3F1ZXVlKHZkLCBhcmdwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZERUNfSU9DVExfUkVVU0VGUkFNRUJVRkZFUjoKLQkJVFJBQ0UoIlZERUNfSU9DVExfUkVVU0VGUkFNRUJVRkZFUiAocGlkPSVkIHRpZD0lZClcbiIsCi0JCSAgICAgIGN1cnJlbnQtPmdyb3VwX2xlYWRlci0+cGlkLCBjdXJyZW50LT5waWQpOwotCQlyZXQgPSB2ZGVjX3JldXNlX2ZyYW1lYnVmZmVyKHZkLCBhcmdwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZERUNfSU9DVExfRkxVU0g6Ci0JCVRSQUNFKCJJT0NUTCBmbHVzaFxuIik7Ci0JCXJldCA9IHZkZWNfZmx1c2godmQsIGFyZ3ApOwotCQlicmVhazsKLQotCWNhc2UgVkRFQ19JT0NUTF9FT1M6Ci0JCVRSQUNFKCJWREVDX0lPQ1RMX0VPUyAocGlkPSVkIHRpZD0lZClcbiIsCi0JCSAgICAgIGN1cnJlbnQtPmdyb3VwX2xlYWRlci0+cGlkLCBjdXJyZW50LT5waWQpOwotCQlyZXQgPSBkYWxfY2FsbF9mMCh2ZC0+dmRlY19oYW5kbGUsIFZERUNfREFMUlBDX1NJR0VPRlNUUkVBTSwgMCk7Ci0JCWlmIChyZXQpCi0JCQlwcl9lcnIoIiVzOiByZW1vdGUgZnVuY3Rpb24gZmFpbGVkICglZClcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWREVDX0lPQ1RMX0dFVE1TRzoKLQkJVFJBQ0UoIlZERUNfSU9DVExfR0VUTVNHIChwaWQ9JWQgdGlkPSVkKVxuIiwKLQkJICAgICAgY3VycmVudC0+Z3JvdXBfbGVhZGVyLT5waWQsIGN1cnJlbnQtPnBpZCk7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh2ZC0+dmRlY19tc2dfZXZ0LAotCQkJCQkgdmRlY19nZXRfbXNnKHZkLCBhcmdwKSk7Ci0KLQkJaWYgKHZkLT5jbG9zZV9kZWNvZGUpCi0JCQlyZXQgPSAtRUlOVFI7Ci0JCWVsc2UKLQkJCS8qIG9yZGVyIHRoZSByZWFkcyBmcm9tIHRoZSBidWZmZXIgKi8KLQkJCXJtYigpOwotCQlicmVhazsKLQotCWNhc2UgVkRFQ19JT0NUTF9DTE9TRToKLQkJcmV0ID0gdmRlY19jbG9zZSh2ZCwgYXJncCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWREVDX0lPQ1RMX0dFVERFQ0FUVFJJQlVURVM6Ci0JCVRSQUNFKCJWREVDX0lPQ1RMX0dFVERFQ0FUVFJJQlVURVMgKHBpZD0lZCB0aWQ9JWQpXG4iLAotCQkgICAgICBjdXJyZW50LT5ncm91cF9sZWFkZXItPnBpZCwgY3VycmVudC0+cGlkKTsKLQkJcmV0ID0gdmRlY19nZXRkZWNhdHRyaWJ1dGVzKHZkLCBhcmdwKTsKLQotCQlpZiAocmV0KQotCQkJcHJfZXJyKCIlczogcmVtb3RlIGZ1bmN0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCQlicmVhazsKLQotCWNhc2UgVkRFQ19JT0NUTF9GUkVFQlVGRkVSUzoKLQkJVFJBQ0UoIlZERUNfSU9DVExfRlJFRUJVRkZFUlMgKHBpZD0lZCB0aWQ9JWQpXG4iLAotCQkgICAgICBjdXJyZW50LT5ncm91cF9sZWFkZXItPnBpZCwgY3VycmVudC0+cGlkKTsKLQkJcmV0ID0gdmRlY19mcmVlYnVmZmVycyh2ZCwgYXJncCk7Ci0KLQkJaWYgKHJldCkKLQkJCXByX2VycigiJXM6IHJlbW90ZSBmdW5jdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKLQkJYnJlYWs7Ci0JY2FzZSBWREVDX0lPQ1RMX0dFVFZFUlNJT046Ci0JCVRSQUNFKCJWREVDX0lPQ1RMX0dFVFZFUlNJT04gKHBpZD0lZCB0aWQ9JWQpXG4iLAotCQkJY3VycmVudC0+Z3JvdXBfbGVhZGVyLT5waWQsIGN1cnJlbnQtPnBpZCk7Ci0JCXJldCA9IHZkZWNfZ2V0dmVyc2lvbih2ZCwgYXJncCk7Ci0KLQkJaWYgKHJldCkKLQkJCXByX2VycigiJXM6IHJlbW90ZSBmdW5jdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJYnJlYWs7Ci0JY2FzZSBWREVDX0lPQ1RMX0dFVFBST1BFUlRZOgotCQlUUkFDRSgiVkRFQ19JT0NUTF9HRVRQUk9QRVJUWSAocGlkPSVkIHRpZD0lZClcbiIsCi0JCSAgICAgIGN1cnJlbnQtPmdyb3VwX2xlYWRlci0+cGlkLCBjdXJyZW50LT5waWQpOwotCQlyZXQgPSB2ZGVjX2dldHByb3BlcnR5KHZkLCBhcmdwKTsKLQkJYnJlYWs7Ci0JY2FzZSBWREVDX0lPQ1RMX1NFVFBST1BFUlRZOgotCQlUUkFDRSgiVkRFQ19JT0NUTF9TRVRQUk9QRVJUWSAocGlkPSVkIHRpZD0lZClcbiIsCi0JCSAgICAgIGN1cnJlbnQtPmdyb3VwX2xlYWRlci0+cGlkLCBjdXJyZW50LT5waWQpOwotCQlyZXQgPSB2ZGVjX3NldHByb3BlcnR5KHZkLCBhcmdwKTsKLQkJYnJlYWs7Ci0JY2FzZSBWREVDX0lPQ1RMX1BFUkZPUk1BTkNFX0NIQU5HRV9SRVE6Ci0JCXJldCA9IHZkZWNfcGVyZm9ybWFuY2VfY2hhbmdlX3JlcXVlc3QodmQsIGFyZ3ApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGlvY3RsIVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0KLQlUUkFDRSgiaW9jdGwgZG9uZSAocGlkPSVkIHRpZD0lZClcbiIsCi0JICAgICAgY3VycmVudC0+Z3JvdXBfbGVhZGVyLT5waWQsIGN1cnJlbnQtPnBpZCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB2ZGVjX2RjZG9uZV9oYW5kbGVyKHN0cnVjdCB2ZGVjX2RhdGEgKnZkLCB2b2lkICpmcmFtZSwKLQkJCQl1aW50MzJfdCBmcmFtZV9zaXplKQotewotCXN0cnVjdCB2ZGVjX21zZyBtc2c7Ci0Jc3RydWN0IHZkZWNfbWVtX2xpc3QgKmw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZm91bmQgPSAwOwotCi0JaWYgKGZyYW1lX3NpemUgPCBzaXplb2Yoc3RydWN0IHZkZWNfZnJhbWVfaW5mbykpIHsKLQkJcHJfd2FybmluZygiJXM6IG1zZyBzaXplIG1pc21hdGNoICVkICE9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSAgIGZyYW1lX3NpemUsIHNpemVvZihzdHJ1Y3QgdmRlY19mcmFtZV9pbmZvKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQltZW1jcHkoJm1zZy52ZnJfaW5mbywgKHN0cnVjdCB2ZGVjX2ZyYW1lX2luZm8gKilmcmFtZSwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2ZGVjX2ZyYW1lX2luZm8pKTsKLQotCWlmIChtc2cudmZyX2luZm8uc3RhdHVzID09IFZERUNfRlJBTUVfREVDT0RFX09LKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZC0+dmRlY19tZW1fbGlzdF9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkobCwgJnZkLT52ZGVjX21lbV9saXN0X2hlYWQsIGxpc3QpIHsKLQkJCWlmICgobC0+bWVtLmJ1Zl90eXBlID09IFZERUNfQlVGRkVSX1RZUEVfT1VUUFVUKSAmJgotCQkJICAgIChtc2cudmZyX2luZm8ub2Zmc2V0ID49IGwtPm1lbS5waHlzX2FkZHIpICYmCi0JCQkgICAgKG1zZy52ZnJfaW5mby5vZmZzZXQgPAotCQkJICAgICAobC0+bWVtLnBoeXNfYWRkciArIGwtPm1lbS5sZW4pKSkgewotCQkJCWZvdW5kID0gMTsKLQkJCQltc2cudmZyX2luZm8ub2Zmc2V0IC09IGwtPm1lbS5waHlzX2FkZHI7Ci0JCQkJbXNnLnZmcl9pbmZvLmRhdGEyID0gbC0+bWVtLmlkOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZkLT52ZGVjX21lbV9saXN0X2xvY2ssIGZsYWdzKTsKLQl9Ci0KLQlpZiAoZm91bmQgfHwgKG1zZy52ZnJfaW5mby5zdGF0dXMgIT0gVkRFQ19GUkFNRV9ERUNPREVfT0spKSB7Ci0JCW1zZy5pZCA9IFZERUNfTVNHX0ZSQU1FRE9ORTsKLQkJdmRlY19wdXRfbXNnKHZkLCAmbXNnKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBoeXMgYWRkciA9IDB4JXhcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgbXNnLnZmcl9pbmZvLm9mZnNldCk7Ci0JfQotCi19Ci0KLXN0YXRpYyB2b2lkIHZkZWNfcmV1c2VpYnVmX2hhbmRsZXIoc3RydWN0IHZkZWNfZGF0YSAqdmQsIHZvaWQgKmJ1ZnN0YXQsCi0JCQkJICAgdWludDMyX3QgYnVmc3RhdF9zaXplKQotewotCXN0cnVjdCB2ZGVjX2J1ZmZlcl9zdGF0dXMgKnZkZWNfYnVmc3RhdDsKLQlzdHJ1Y3QgdmRlY19tc2cgbXNnOwotCi0JLyogVE9ETzogaG93IGRvIHdlIHNpZ25hbCB0aGUgY2xpZW50PyBJZiB0aGV5IGFyZSB3YWl0aW5nIG9uIGEKLQkgKiBtZXNzYWdlIGluIGFuIGlvY3RsLCB0aGV5IG1heSBibG9jayBmb3JldmVyICovCi0JaWYgKGJ1ZnN0YXRfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IHZkZWNfYnVmZmVyX3N0YXR1cykpIHsKLQkJcHJfd2FybmluZygiJXM6IG1zZyBzaXplIG1pc21hdGNoICVkICE9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSAgIGJ1ZnN0YXRfc2l6ZSwgc2l6ZW9mKHN0cnVjdCB2ZGVjX2J1ZmZlcl9zdGF0dXMpKTsKLQkJcmV0dXJuOwotCX0KLQl2ZGVjX2J1ZnN0YXQgPSAoc3RydWN0IHZkZWNfYnVmZmVyX3N0YXR1cyAqKWJ1ZnN0YXQ7Ci0JbXNnLmlkID0gVkRFQ19NU0dfUkVVU0VJTlBVVEJVRkZFUjsKLQltc2cuYnVmX2lkID0gdmRlY19idWZzdGF0LT5kYXRhOwotCXZkZWNfcHV0X21zZyh2ZCwgJm1zZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNhbGxiYWNrKHZvaWQgKmRhdGEsIGludCBsZW4sIHZvaWQgKmNvb2tpZSkKLXsKLQlzdHJ1Y3QgdmRlY19kYXRhICp2ZCA9IChzdHJ1Y3QgdmRlY19kYXRhICopY29va2llOwotCXVpbnQzMl90ICp0bXAgPSAodWludDMyX3QgKikgZGF0YTsKLQotCWlmICghdmQtPm1lbV9pbml0aWFsaXplZCkgewotCQlwcl9lcnIoIiVzOm1lbW9yeSBub3QgaW5pdGlhbGl6ZSBidXQgY2FsbGJhY2sgY2FsbGVkIVxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCVRSQUNFKCJ2ZGVjX2FzeW5jOiB0bXA9MHglMDh4IDB4JTA4eCAweCUwOHhcbiIsIHRtcFswXSwgdG1wWzFdLCB0bXBbMl0pOwotCXN3aXRjaCAodG1wWzBdKSB7Ci0JY2FzZSBWREVDX0FTWU5DTVNHX0RFQ09ERV9ET05FOgotCQl2ZGVjX2RjZG9uZV9oYW5kbGVyKHZkLCAmdG1wWzNdLCB0bXBbMl0pOwotCQlicmVhazsKLQljYXNlIFZERUNfQVNZTkNNU0dfUkVVU0VfRlJBTUU6Ci0JCXZkZWNfcmV1c2VpYnVmX2hhbmRsZXIodmQsICZ0bXBbM10sIHRtcFsyXSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IFVua25vd24gYXN5bmMgbWVzc2FnZSBmcm9tIERTUCBpZD0weCUwOHggc3o9JXVcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgdG1wWzBdLCB0bXBbMl0pOwotCX0KLX0KLQotc3RhdGljIGludCB2ZGVjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaW50IHJldDsKLQlpbnQgaTsKLQlzdHJ1Y3QgdmRlY19tc2dfbGlzdCAqbDsKLQlzdHJ1Y3QgdmRlY19kYXRhICp2ZDsKLQlzdHJ1Y3QgZGFsX2luZm8gdmVyc2lvbl9pbmZvOwotCWNoYXIgKnBvcnRuYW1lID0gTlVMTDsKLQotCXByX2luZm8oInE2dmRlY19vcGVuKClcbiIpOwotCW11dGV4X2xvY2soJnZkZWNfcmVmX2xvY2spOwotCWlmIChyZWZfY250ID49IE1BWF9TVVBQT1JURURfSU5TVEFOQ0VTKSB7Ci0JCXByX2VycigiJXM6IE1heCBhbGxvd2VkIGluc3RhbmNlcyBleGNlZWRlZCBcbiIsIF9fZnVuY19fKTsKLQkJbXV0ZXhfdW5sb2NrKCZ2ZGVjX3JlZl9sb2NrKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JcmVmX2NudCsrOwotCW11dGV4X3VubG9jaygmdmRlY19yZWZfbG9jayk7Ci0KLQl2ZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZGVjX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZkKSB7Ci0JCXByX2VycigiJXM6IGttYWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gdmRlY19vcGVuX2Vycl9oYW5kbGVfdmQ7Ci0JfQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IHZkOwotCi0JdmQtPm1lbV9pbml0aWFsaXplZCA9IDA7Ci0JSU5JVF9MSVNUX0hFQUQoJnZkLT52ZGVjX21zZ19saXN0X2hlYWQpOwotCUlOSVRfTElTVF9IRUFEKCZ2ZC0+dmRlY19tc2dfbGlzdF9mcmVlKTsKLQlJTklUX0xJU1RfSEVBRCgmdmQtPnZkZWNfbWVtX2xpc3RfaGVhZCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdmQtPnZkZWNfbXNnX2V2dCk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmdmQtPnZkZWNfbGlzdF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmdmQtPnZkZWNfbWVtX2xpc3RfbG9jayk7Ci0JZm9yIChpID0gMDsgaSA8IFZERUNfTVNHX01BWDsgaSsrKSB7Ci0JCWwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmRlY19tc2dfbGlzdCksIEdGUF9LRVJORUwpOwotCQlpZiAoIWwpIHsKLQkJCXByX2VycigiJXM6IGt6YWxsb2MgZmFpbGVkIVxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gdmRlY19vcGVuX2Vycl9oYW5kbGVfbGlzdDsKLQkJfQotCQlsaXN0X2FkZCgmbC0+bGlzdCwgJnZkLT52ZGVjX21zZ19saXN0X2ZyZWUpOwotCX0KLQotCW1lbXNldCgmdmQtPnN0cmVhbURldGFpbHMsIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9TdHJlYW1EZXRhaWxzKSk7Ci0KLQltdXRleF9sb2NrKCZ2ZGVjX3JlZl9sb2NrKTsKLQl2ZGVjX2dldF9uZXh0X3BvcnRhbmRkZXZpZCgmdmQtPlE2ZGV2aWNlSWQsICZwb3J0bmFtZSk7Ci0JbXV0ZXhfdW5sb2NrKCZ2ZGVjX3JlZl9sb2NrKTsKLQotCWlmICgoMCA9PSB2ZC0+UTZkZXZpY2VJZCkgfHwgKE5VTEwgPT0gcG9ydG5hbWUpKSB7Ci0JCXByX2VycigiJXM6IEZBVEFMIGVycm9yIHBvcnRuYW1lICVzIG9yIGRldmljZUlkICVkIG5vdCBwaWNrZWQgcHJvcGVybHlcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydG5hbWUsIHZkLT5RNmRldmljZUlkKTsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byB2ZGVjX29wZW5fZXJyX2hhbmRsZV9saXN0OwotCX0gZWxzZSB7Ci0JCXByX2VycigiYXR0YWNoaW5nIG9uIGRldmljZWlkICV4IHBvcnRuYW1lICVzXG4iLAotCQkJdmQtPlE2ZGV2aWNlSWQsIHBvcnRuYW1lKTsKLQkJdmQtPnZkZWNfaGFuZGxlID0gZGFsX2F0dGFjaCh2ZC0+UTZkZXZpY2VJZCwKLQkJCQkJICAgICBwb3J0bmFtZSwgMSwgY2FsbGJhY2ssIHZkKTsKLQl9Ci0KLQlpZiAoIXZkLT52ZGVjX2hhbmRsZSkgewotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYXR0YWNoXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gdmRlY19vcGVuX2Vycl9oYW5kbGVfbGlzdDsKLQl9Ci0JcmV0ID0gZGFsX2NhbGxfZjkodmQtPnZkZWNfaGFuZGxlLCBEQUxfT1BfSU5GTywKLQkJCQkmdmVyc2lvbl9pbmZvLCBzaXplb2Yoc3RydWN0IGRhbF9pbmZvKSk7Ci0KLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQgdmVyc2lvbiBcbiIsIF9fZnVuY19fKTsKLQkJZ290byB2ZGVjX29wZW5fZXJyX2hhbmRsZV92ZXJzaW9uOwotCX0KLQotCVRSQUNFKCJxNnZkZWNfb3BlbigpIGludGVyZmFjZSB2ZXJzaW9uIDB4JXhcbiIsIHZlcnNpb25faW5mby52ZXJzaW9uKTsKLQlpZiAodmRlY19jaGVja192ZXJzaW9uKFZERUNfSU5URVJGQUNFX1ZFUlNJT04sCi0JCQl2ZXJzaW9uX2luZm8udmVyc2lvbikpIHsKLQkJcHJfZXJyKCIlczogZHJpdmVyIHZlcnNpb24gbWlzbWF0Y2ggIVxuIiwgX19mdW5jX18pOwotCQlnb3RvIHZkZWNfb3Blbl9lcnJfaGFuZGxlX3ZlcnNpb247Ci0JfQotCi0JdmQtPnJ1bm5pbmcgPSAxOwotCXByZXZlbnRfc2xlZXAoKTsKLQotCXJldHVybiAwOwotdmRlY19vcGVuX2Vycl9oYW5kbGVfdmVyc2lvbjoKLQlkYWxfZGV0YWNoKHZkLT52ZGVjX2hhbmRsZSk7Ci12ZGVjX29wZW5fZXJyX2hhbmRsZV9saXN0OgotCXsKLQkJc3RydWN0IHZkZWNfbXNnX2xpc3QgKmwsICpuOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgJnZkLT52ZGVjX21zZ19saXN0X2ZyZWUsIGxpc3QpIHsKLQkJCWxpc3RfZGVsKCZsLT5saXN0KTsKLQkJCWtmcmVlKGwpOwotCQl9Ci0JfQotdmRlY19vcGVuX2Vycl9oYW5kbGVfdmQ6Ci0JbXV0ZXhfbG9jaygmdmRlY19yZWZfbG9jayk7Ci0JdmRlY19mcmVldXBfcG9ydGFuZGRldmlkKHZkLT5RNmRldmljZUlkKTsKLQlyZWZfY250LS07Ci0JbXV0ZXhfdW5sb2NrKCZ2ZGVjX3JlZl9sb2NrKTsKLQlrZnJlZSh2ZCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2ZGVjX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgdmRlY19tc2dfbGlzdCAqbCwgKm47Ci0Jc3RydWN0IHZkZWNfbWVtX2xpc3QgKm0sICprOwotCXN0cnVjdCB2ZGVjX2RhdGEgKnZkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JdmQtPnJ1bm5pbmcgPSAwOwotCXdha2VfdXBfYWxsKCZ2ZC0+dmRlY19tc2dfZXZ0KTsKLQotCWlmICghdmQtPmNsb3NlX2RlY29kZSkKLQkJdmRlY19jbG9zZSh2ZCwgTlVMTCk7Ci0KLQlyZXQgPSBkYWxfZGV0YWNoKHZkLT52ZGVjX2hhbmRsZSk7Ci0JaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZhaWxlZCB0byBkZXRhY2ggKCVkKVxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgJnZkLT52ZGVjX21zZ19saXN0X2ZyZWUsIGxpc3QpIHsKLQkJbGlzdF9kZWwoJmwtPmxpc3QpOwotCQlrZnJlZShsKTsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgJnZkLT52ZGVjX21zZ19saXN0X2hlYWQsIGxpc3QpIHsKLQkJbGlzdF9kZWwoJmwtPmxpc3QpOwotCQlrZnJlZShsKTsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobSwgaywgJnZkLT52ZGVjX21lbV9saXN0X2hlYWQsIGxpc3QpIHsKLQkJbGlzdF9kZWwoJm0tPmxpc3QpOwotCQlrZnJlZShtKTsKLQl9Ci0JbXV0ZXhfbG9jaygmdmRlY19yZWZfbG9jayk7Ci0JQlVHX09OKHJlZl9jbnQgPD0gMCk7Ci0JcmVmX2NudC0tOwotCXZkZWNfZnJlZXVwX3BvcnRhbmRkZXZpZCh2ZC0+UTZkZXZpY2VJZCk7Ci0JbXV0ZXhfdW5sb2NrKCZ2ZGVjX3JlZl9sb2NrKTsKLQotCW11dGV4X2xvY2soJnZkZWNfcm1fbG9jayk7Ci0JdmRlY19ybV9mcmVldXBSZXNvdXJjZXModmQpOwotCW11dGV4X3VubG9jaygmdmRlY19ybV9sb2NrKTsKLQotCi0Ja2ZyZWUodmQpOwotCWFsbG93X3NsZWVwKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZkZWNfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IHZkZWNfb3BlbiwKLQkucmVsZWFzZSA9IHZkZWNfcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwgPSB2ZGVjX2lvY3RsLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgdmRlY19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZSAqY2xhc3NfZGV2OwotCWludCByYyA9IDA7Ci0KLQlwbV9xb3NfYWRkX3JlcXVlc3QoJnBtX3Fvc19yZXEsIFBNX1FPU19DUFVfRE1BX0xBVEVOQ1ksCi0JCQkJUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotCXdha2VfbG9ja19pbml0KCZ3YWtlbG9jaywgV0FLRV9MT0NLX1NVU1BFTkQsICJ2ZGVjX3N1c3BlbmQiKTsKLQotCXJjID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmdmRlY19kZXZpY2Vfbm8sIDAsIDEsICJ2ZGVjIik7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBhbGxvY19jaHJkZXZfcmVnaW9uIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWRyaXZlcl9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInZkZWMiKTsKLQlpZiAoSVNfRVJSKGRyaXZlcl9jbGFzcykpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlwcl9lcnIoIiVzOiBjbGFzc19jcmVhdGUgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlnb3RvIHZkZWNfaW5pdF9lcnJfdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uOwotCX0KLQljbGFzc19kZXYgPSBkZXZpY2VfY3JlYXRlKGRyaXZlcl9jbGFzcywgTlVMTCwKLQkJCQkgIHZkZWNfZGV2aWNlX25vLCBOVUxMLCAidmRlYyIpOwotCWlmICghY2xhc3NfZGV2KSB7Ci0JCXByX2VycigiJXM6IGNsYXNzX2RldmljZV9jcmVhdGUgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gdmRlY19pbml0X2Vycl9jbGFzc19kZXN0cm95OwotCX0KLQotCWNkZXZfaW5pdCgmdmRlY19jZGV2LCAmdmRlY19mb3BzKTsKLQl2ZGVjX2NkZXYub3duZXIgPSBUSElTX01PRFVMRTsKLQlyYyA9IGNkZXZfYWRkKCZ2ZGVjX2NkZXYsIE1LREVWKE1BSk9SKHZkZWNfZGV2aWNlX25vKSwgMCksIDEpOwotCi0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBjZGV2X2FkZCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCWdvdG8gdmRlY19pbml0X2Vycl9jbGFzc19kZXZpY2VfZGVzdHJveTsKLQl9Ci0KLQltZW1zZXQoJmRldmljZUlkUmVnaXN0cnksIDAsIHNpemVvZihkZXZpY2VJZFJlZ2lzdHJ5KSk7Ci0JbWVtc2V0KCZsb2FkT25Qb3J0cywgMCwgc2l6ZW9mKGxvYWRPblBvcnRzKSk7Ci0JbnVtT2ZQb3J0cyA9IDA7Ci0KLQlyZXR1cm4gMDsKLQotdmRlY19pbml0X2Vycl9jbGFzc19kZXZpY2VfZGVzdHJveToKLQlkZXZpY2VfZGVzdHJveShkcml2ZXJfY2xhc3MsIHZkZWNfZGV2aWNlX25vKTsKLXZkZWNfaW5pdF9lcnJfY2xhc3NfZGVzdHJveToKLQljbGFzc19kZXN0cm95KGRyaXZlcl9jbGFzcyk7Ci12ZGVjX2luaXRfZXJyX3VucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbjoKLQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24odmRlY19kZXZpY2Vfbm8sIDEpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHZkZWNfZXhpdCh2b2lkKQotewotCWRldmljZV9kZXN0cm95KGRyaXZlcl9jbGFzcywgdmRlY19kZXZpY2Vfbm8pOwotCWNsYXNzX2Rlc3Ryb3koZHJpdmVyX2NsYXNzKTsKLQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24odmRlY19kZXZpY2Vfbm8sIDEpOwotfQotCi1NT0RVTEVfREVTQ1JJUFRJT04oInZpZGVvIGRlY29kZXIgZHJpdmVyIGZvciBRU0QgcGxhdGZvcm0iKTsKLU1PRFVMRV9WRVJTSU9OKCIyLjAwIik7Ci0KLW1vZHVsZV9pbml0KHZkZWNfaW5pdCk7Ci1tb2R1bGVfZXhpdCh2ZGVjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvbXNtX3E2dmVuYy5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvbXNtX3E2dmVuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmI0YjZlLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L21zbV9xNnZlbmMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMDAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvY2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX3E2dmVuYy5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgotCi0jaW5jbHVkZSA8bWFjaC9jcHVpZGxlLmg+Ci0KLSNpbmNsdWRlICJkYWwuaCIKLQotI2RlZmluZSBEQUxERVZJQ0VJRF9WRU5DX0RFVklDRSAgICAgICAgIDB4MDIwMDAwMkQKLSNkZWZpbmUgREFMREVWSUNFSURfVkVOQ19QT1JUTkFNRSAgICAgICAiREFMX0FRX1ZJRCIKLQotI2RlZmluZSBWRU5DX05BTUUJCSAgICAgICAgInE2dmVuYyIKLSNkZWZpbmUgVkVOQ19NU0dfTUFYICAgICAgICAgICAgICAgICAgICAxMjgKLQotI2RlZmluZSBWRU5DX0lOVEVSRkFDRV9WRVJTSU9OCQkweDAwMDIwMDAwCi0jZGVmaW5lIE1BSk9SX01BU0sJCQkweEZGRkYwMDAwCi0jZGVmaW5lIE1JTk9SX01BU0sJCQkweDAwMDBGRkZGCi0jZGVmaW5lIFZFTkNfR0VUX01BSk9SX1ZFUlNJT04odmVyc2lvbikgKCh2ZXJzaW9uICYgTUFKT1JfTUFTSyk+PjE2KQotI2RlZmluZSBWRU5DX0dFVF9NSU5PUl9WRVJTSU9OKHZlcnNpb24pICh2ZXJzaW9uICYgTUlOT1JfTUFTSykKLQotZW51bSB7Ci0JVkVOQ19CVUZGRVJfVFlQRV9JTlBVVCwKLQlWRU5DX0JVRkZFUl9UWVBFX09VVFBVVCwKLQlWRU5DX0JVRkZFUl9UWVBFX1FEU1A2LAotCVZFTkNfQlVGRkVSX1RZUEVfSERSCi19OwotZW51bSB7Ci0JVkVOQ19EQUxSUENfR0VUX1NZTlRBWF9IRUFERVIgPSBEQUxfT1BfRklSU1RfREVWSUNFX0FQSSwKLQlWRU5DX0RBTFJQQ19VUERBVEVfSU5UUkFfUkVGUkVTSCwKLQlWRU5DX0RBTFJQQ19VUERBVEVfRlJBTUVfUkFURSwKLQlWRU5DX0RBTFJQQ19VUERBVEVfQklUUkFURSwKLQlWRU5DX0RBTFJQQ19VUERBVEVfUVBfUkFOR0UsCi0JVkVOQ19EQUxSUENfVVBEQVRFX0lOVFJBX1BFUklPRCwKLQlWRU5DX0RBTFJQQ19SRVFVRVNUX0lGUkFNRSwKLQlWRU5DX0RBTFJQQ19TVEFSVCwKLQlWRU5DX0RBTFJQQ19TVE9QLAotCVZFTkNfREFMUlBDX1NVU1BFTkQsCi0JVkVOQ19EQUxSUENfUkVTVU1FLAotCVZFTkNfREFMUlBDX0ZMVVNILAotCVZFTkNfREFMUlBDX1FVRVVFX0lOUFVULAotCVZFTkNfREFMUlBDX1FVRVVFX09VVFBVVAotfTsKLXN0cnVjdCB2ZW5jX2lucHV0X3BheWxvYWQgewotCXUzMiBkYXRhOwotfTsKLXN0cnVjdCB2ZW5jX291dHB1dF9wYXlsb2FkIHsKLQl1MzIgc2l6ZTsKLQlsb25nIGxvbmcgdGltZV9zdGFtcDsKLQl1MzIgZmxhZ3M7Ci0JdTMyIGRhdGE7Ci0JdTMyIGNsaWVudF9kYXRhX2Zyb21faW5wdXQ7Ci19OwotdW5pb24gdmVuY19wYXlsb2FkIHsKLQlzdHJ1Y3QgdmVuY19pbnB1dF9wYXlsb2FkIGlucHV0X3BheWxvYWQ7Ci0Jc3RydWN0IHZlbmNfb3V0cHV0X3BheWxvYWQgb3V0cHV0X3BheWxvYWQ7Ci19Owotc3RydWN0IHZlbmNfbXNnX3R5cGUgewotCXUzMiBldmVudDsKLQl1MzIgc3RhdHVzOwotCXVuaW9uIHZlbmNfcGF5bG9hZCBwYXlsb2FkOwotfTsKLXN0cnVjdCB2ZW5jX2lucHV0X2J1ZiB7Ci0Jc3RydWN0IHZlbmNfYnVmX3R5cGUgeXV2X2J1ZjsKLQl1MzIgZGF0YV9zaXplOwotCWxvbmcgbG9uZyB0aW1lX3N0YW1wOwotCXUzMiBmbGFnczsKLQl1MzIgZHZzX29mZnNldHg7Ci0JdTMyIGR2c19vZmZzZXR5OwotCXUzMiBjbGllbnRfZGF0YTsKLQl1MzIgb3BfY2xpZW50X2RhdGE7Ci19Owotc3RydWN0IHZlbmNfb3V0cHV0X2J1ZiB7Ci0Jc3RydWN0IHZlbmNfYnVmX3R5cGUgYml0X3N0cmVhbV9idWY7Ci0JdTMyIGNsaWVudF9kYXRhOwotfTsKLQotc3RydWN0IHZlbmNfbXNnX2xpc3QgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgdmVuY19tc2cgbXNnX2RhdGE7Ci19Owotc3RydWN0IHZlbmNfYnVmIHsKLQlpbnQgZmQ7Ci0JdTMyIHNyYzsKLQl1MzIgb2Zmc2V0OwotCXUzMiBzaXplOwotCXUzMiBidHlwZTsKLQl1bnNpZ25lZCBsb25nIHBhZGRyOwotCXN0cnVjdCBmaWxlICpmaWxlOwotfTsKLXN0cnVjdCB2ZW5jX3BtZW1fbGlzdCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCB2ZW5jX2J1ZiBidWY7Ci19Owotc3RydWN0IHZlbmNfZGV2IHsKLQlib29sIGlzX2FjdGl2ZTsKLQlib29sIHBtZW1fZnJlZWQ7Ci0JZW51bSB2ZW5jX3N0YXRlX3R5cGUgc3RhdGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCB2ZW5jX21zZ19saXN0X2hlYWQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCB2ZW5jX21zZ19saXN0X2ZyZWU7Ci0Jc3BpbmxvY2tfdCB2ZW5jX21zZ19saXN0X2xvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCB2ZW5jX3BtZW1fbGlzdF9oZWFkOwotCXNwaW5sb2NrX3QgdmVuY19wbWVtX2xpc3RfbG9jazsKLQlzdHJ1Y3QgZGFsX2NsaWVudCAqcTZfaGFuZGxlOwotCXdhaXRfcXVldWVfaGVhZF90IHZlbmNfbXNnX2V2dDsKLQlzdHJ1Y3QgZGV2aWNlICpjbGFzc19kZXZwOwotfTsKLQotI2RlZmluZSBERUJVR19WRU5DIDAKLSNpZiBERUJVR19WRU5DCi0jZGVmaW5lIFRSQUNFKGZtdCwgeC4uLikgICAgIFwKLQlkbyB7IHByX2RlYnVnKCIlczolZCAiIGZtdCwgX19mdW5jX18sIF9fTElORV9fLCAjI3gpOyB9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgVFJBQ0UoZm10LCB4Li4uKSAgICAgICAgIGRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IGNkZXYgY2RldjsKLXN0YXRpYyBkZXZfdCB2ZW5jX2Rldl9udW07Ci1zdGF0aWMgc3RydWN0IGNsYXNzICp2ZW5jX2NsYXNzOwotc3RhdGljIHN0cnVjdCB2ZW5jX2RldiAqdmVuY19kZXZpY2VfcDsKLXN0YXRpYyBpbnQgdmVuY19yZWY7Ci0KLXN0YXRpYyBERUZJTkVfTVVURVgoaWRsZWNvdW50X2xvY2spOwotc3RhdGljIGludCBpZGxlY291bnQ7Ci1zdGF0aWMgc3RydWN0IHdha2VfbG9jayB3YWtlbG9jazsKLXN0YXRpYyBzdHJ1Y3QgcG1fcW9zX3JlcXVlc3QgcG1fcW9zX3JlcTsKLQotc3RhdGljIHZvaWQgcHJldmVudF9zbGVlcCh2b2lkKQotewotCW11dGV4X2xvY2soJmlkbGVjb3VudF9sb2NrKTsKLQlpZiAoKytpZGxlY291bnQgPT0gMSkgewotCQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJnBtX3Fvc19yZXEsCi0JCQkJICAgICAgbXNtX2NwdWlkbGVfZ2V0X2RlZXBfaWRsZV9sYXRlbmN5KCkpOwotCQl3YWtlX2xvY2soJndha2Vsb2NrKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZpZGxlY291bnRfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFsbG93X3NsZWVwKHZvaWQpCi17Ci0JbXV0ZXhfbG9jaygmaWRsZWNvdW50X2xvY2spOwotCWlmICgtLWlkbGVjb3VudCA9PSAwKSB7Ci0JCXdha2VfdW5sb2NrKCZ3YWtlbG9jayk7Ci0JCXBtX3Fvc191cGRhdGVfcmVxdWVzdCgmcG1fcW9zX3JlcSwgUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotCX0KLQltdXRleF91bmxvY2soJmlkbGVjb3VudF9sb2NrKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgdmVuY19jaGVja192ZXJzaW9uKHUzMiBjbGllbnQsIHUzMiBzZXJ2ZXIpCi17Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQlpZiAoKFZFTkNfR0VUX01BSk9SX1ZFUlNJT04oY2xpZW50KSA9PSBWRU5DX0dFVF9NQUpPUl9WRVJTSU9OKHNlcnZlcikpCi0JICAgICAmJiAoVkVOQ19HRVRfTUlOT1JfVkVSU0lPTihjbGllbnQpIDw9Ci0JCSBWRU5DX0dFVF9NSU5PUl9WRVJTSU9OKHNlcnZlcikpKQotCQlyZXQgPSAwOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2ZW5jX2dldF9tc2coc3RydWN0IHZlbmNfZGV2ICpkdmVuYywgdm9pZCAqbXNnKQotewotCXN0cnVjdCB2ZW5jX21zZ19saXN0ICpsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHZlbmNfbXNnIHFkc3BfbXNnOwotCi0JaWYgKCFkdmVuYy0+aXNfYWN0aXZlKQotCQlyZXR1cm4gLUVQRVJNOwotCXNwaW5fbG9ja19pcnFzYXZlKCZkdmVuYy0+dmVuY19tc2dfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGwsICZkdmVuYy0+dmVuY19tc2dfbGlzdF9oZWFkLCBsaXN0KSB7Ci0JCW1lbWNweSgmcWRzcF9tc2csICZsLT5tc2dfZGF0YSwgc2l6ZW9mKHN0cnVjdCB2ZW5jX21zZykpOwotCQlsaXN0X2RlbCgmbC0+bGlzdCk7Ci0JCWxpc3RfYWRkKCZsLT5saXN0LCAmZHZlbmMtPnZlbmNfbXNnX2xpc3RfZnJlZSk7Ci0JCXJldCA9IDE7Ci0JCWJyZWFrOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmVuYy0+dmVuY19tc2dfbGlzdF9sb2NrLCBmbGFncyk7Ci0JaWYgKGNvcHlfdG9fdXNlcihtc2csICZxZHNwX21zZywgc2l6ZW9mKHN0cnVjdCB2ZW5jX21zZykpKQotCQlwcl9lcnIoIiVzIGZhaWxlZCB0byBjb3B5X3RvX3VzZXJcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB2ZW5jX3B1dF9tc2coc3RydWN0IHZlbmNfZGV2ICpkdmVuYywgc3RydWN0IHZlbmNfbXNnICptc2cpCi17Ci0Jc3RydWN0IHZlbmNfbXNnX2xpc3QgKmw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZm91bmQgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmR2ZW5jLT52ZW5jX21zZ19saXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGwsICZkdmVuYy0+dmVuY19tc2dfbGlzdF9mcmVlLCBsaXN0KSB7Ci0JCW1lbWNweSgmbC0+bXNnX2RhdGEsIG1zZywgc2l6ZW9mKHN0cnVjdCB2ZW5jX21zZykpOwotCQlsaXN0X2RlbCgmbC0+bGlzdCk7Ci0JCWxpc3RfYWRkKCZsLT5saXN0LCAmZHZlbmMtPnZlbmNfbXNnX2xpc3RfaGVhZCk7Ci0JCWZvdW5kID0gMTsKLQkJYnJlYWs7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2ZW5jLT52ZW5jX21zZ19saXN0X2xvY2ssIGZsYWdzKTsKLQlpZiAoZm91bmQpCi0JCXdha2VfdXAoJmR2ZW5jLT52ZW5jX21zZ19ldnQpOwotCWVsc2UKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGZpbmQgYSBmcmVlIG5vZGVcbiIsIF9fZnVuY19fKTsKLQotfQotCi1zdGF0aWMgc3RydWN0IHZlbmNfcG1lbV9saXN0ICp2ZW5jX2FkZF9wbWVtX3RvX2xpc3Qoc3RydWN0IHZlbmNfZGV2ICpkdmVuYywKLQkJCQkJCSAgICAgIHN0cnVjdCB2ZW5jX3BtZW0gKm1wdHIsCi0JCQkJCQkgICAgICB1MzIgYnR5cGUpCi17Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIGxlbjsKLQl1bnNpZ25lZCBsb25nIHZhZGRyOwotCXN0cnVjdCB2ZW5jX3BtZW1fbGlzdCAqcGxpc3QgPSBOVUxMOwotCi0JcGxpc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmVuY19wbWVtX2xpc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBsaXN0KSB7Ci0JCXByX2VycigiJXM6IGt6YWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJldCA9IGdldF9wbWVtX2ZpbGUobXB0ci0+ZmQsICYocGxpc3QtPmJ1Zi5wYWRkciksCi0JCSZ2YWRkciwgJmxlbiwgJihwbGlzdC0+YnVmLmZpbGUpKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGdldF9wbWVtX2ZpbGUgZmFpbGVkIGZvciBmZD0lZCBvZmZzZXQ9JWRcbiIsCi0JCQlfX2Z1bmNfXywgbXB0ci0+ZmQsIG1wdHItPm9mZnNldCk7Ci0JCWdvdG8gZXJyX3ZlbmNfYWRkX3BtZW07Ci0JfSBlbHNlIGlmIChtcHRyLT5vZmZzZXQgPj0gbGVuKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgb2Zmc2V0ICglZCA+ICVsZCkgZm9yIGZkPSVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIG1wdHItPm9mZnNldCwgbGVuLCBtcHRyLT5mZCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3ZlbmNfZ2V0X3BtZW07Ci0JfQotCi0JcGxpc3QtPmJ1Zi5mZCA9IG1wdHItPmZkOwotCXBsaXN0LT5idWYucGFkZHIgKz0gbXB0ci0+b2Zmc2V0OwotCXBsaXN0LT5idWYuc2l6ZSA9IG1wdHItPnNpemU7Ci0JcGxpc3QtPmJ1Zi5idHlwZSA9IGJ0eXBlOwotCXBsaXN0LT5idWYub2Zmc2V0ID0gbXB0ci0+b2Zmc2V0OwotCXBsaXN0LT5idWYuc3JjID0gbXB0ci0+c3JjOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmR2ZW5jLT52ZW5jX3BtZW1fbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGQoJnBsaXN0LT5saXN0LCAmZHZlbmMtPnZlbmNfcG1lbV9saXN0X2hlYWQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2ZW5jLT52ZW5jX3BtZW1fbGlzdF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHBsaXN0OwotCi1lcnJfdmVuY19nZXRfcG1lbToKLQlwdXRfcG1lbV9maWxlKHBsaXN0LT5idWYuZmlsZSk7Ci1lcnJfdmVuY19hZGRfcG1lbToKLQlrZnJlZShwbGlzdCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdmVuY19wbWVtX2xpc3QgKnZlbmNfZ2V0X3BtZW1fZnJvbV9saXN0KAotCQlzdHJ1Y3QgdmVuY19kZXYgKmR2ZW5jLCB1MzIgcG1lbV9mZCwKLQkJdTMyIG9mZnNldCwgdTMyIGJ0eXBlKQotewotCXN0cnVjdCB2ZW5jX3BtZW1fbGlzdCAqcGxpc3Q7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZmlsZSAqZmlsZTsKLQlpbnQgZm91bmQgPSAwOwotCi0JZmlsZSA9IGZnZXQocG1lbV9mZCk7Ci0JaWYgKCFmaWxlKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgZW5jb2RlciBidWZmZXIgZmQoJWQpXG4iLCBfX2Z1bmNfXywKLQkJCXBtZW1fZmQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmR2ZW5jLT52ZW5jX3BtZW1fbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwbGlzdCwgJmR2ZW5jLT52ZW5jX3BtZW1fbGlzdF9oZWFkLCBsaXN0KSB7Ci0JCWlmIChwbGlzdC0+YnVmLmJ0eXBlID09IGJ0eXBlICYmIHBsaXN0LT5idWYuZmlsZSA9PSBmaWxlICYmCi0JCQlwbGlzdC0+YnVmLm9mZnNldCA9PSBvZmZzZXQpIHsKLQkJCWZvdW5kID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2ZW5jLT52ZW5jX3BtZW1fbGlzdF9sb2NrLCBmbGFncyk7Ci0JZnB1dChmaWxlKTsKLQlpZiAoZm91bmQpCi0JCXJldHVybiBwbGlzdDsKLQotCWVsc2UKLQkJcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgdmVuY19zZXRfYnVmZmVyKHN0cnVjdCB2ZW5jX2RldiAqZHZlbmMsIHZvaWQgKmFyZ3AsCi0JCQkgICAgIHUzMiBidHlwZSkKLXsKLQlzdHJ1Y3QgdmVuY19wbWVtIHBtZW07Ci0Jc3RydWN0IHZlbmNfcG1lbV9saXN0ICpwbGlzdDsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IGNvcHlfZnJvbV91c2VyKCZwbWVtLCBhcmdwLCBzaXplb2YocG1lbSkpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXBsaXN0ID0gdmVuY19hZGRfcG1lbV90b19saXN0KGR2ZW5jLCAmcG1lbSwgYnR5cGUpOwotCWlmIChwbGlzdCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGJ1ZmZlciBhZGRfdG9fcG1lbV9saXN0IGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2ZW5jX2Fzc2lnbl9xNl9idWZmZXJzKHN0cnVjdCB2ZW5jX2RldiAqZHZlbmMsCi0JCQkJICAgIHN0cnVjdCB2ZW5jX2J1ZmZlcnMgKnBidWZzLAotCQkJCSAgICBzdHJ1Y3QgdmVuY19ub25pb19idWZfY29uZmlnICpwY2ZnKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCB2ZW5jX3BtZW1fbGlzdCAqcGxpc3Q7Ci0KLQlwbGlzdCA9IHZlbmNfYWRkX3BtZW1fdG9fbGlzdChkdmVuYywgJihwYnVmcy0+cmVjb25fYnVmWzBdKSwKLQkJCQkgIFZFTkNfQlVGRkVSX1RZUEVfUURTUDYpOwotCWlmIChwbGlzdCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHJlY29uX2J1ZjAgZmFpbGVkIHRvIGFkZF90b19wbWVtX2xpc3RcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCXBjZmctPnJlY29uX2J1ZjEucmVnaW9uID0gcGJ1ZnMtPnJlY29uX2J1ZlswXS5zcmM7Ci0JcGNmZy0+cmVjb25fYnVmMS5waHlzID0gcGxpc3QtPmJ1Zi5wYWRkcjsKLQlwY2ZnLT5yZWNvbl9idWYxLnNpemUgPSBwbGlzdC0+YnVmLnNpemU7Ci0JcGNmZy0+cmVjb25fYnVmMS5vZmZzZXQgPSAwOwotCi0JcGxpc3QgPSB2ZW5jX2FkZF9wbWVtX3RvX2xpc3QoZHZlbmMsICYocGJ1ZnMtPnJlY29uX2J1ZlsxXSksCi0JCQkJICBWRU5DX0JVRkZFUl9UWVBFX1FEU1A2KTsKLQlpZiAocGxpc3QgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiByZWNvbnNfYnVmMSBmYWlsZWQgdG8gYWRkX3RvX3BtZW1fbGlzdFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0JcGNmZy0+cmVjb25fYnVmMi5yZWdpb24gPSBwYnVmcy0+cmVjb25fYnVmWzFdLnNyYzsKLQlwY2ZnLT5yZWNvbl9idWYyLnBoeXMgPSBwbGlzdC0+YnVmLnBhZGRyOwotCXBjZmctPnJlY29uX2J1ZjIuc2l6ZSA9IHBsaXN0LT5idWYuc2l6ZTsKLQlwY2ZnLT5yZWNvbl9idWYyLm9mZnNldCA9IDA7Ci0KLQlwbGlzdCA9IHZlbmNfYWRkX3BtZW1fdG9fbGlzdChkdmVuYywgJihwYnVmcy0+d2JfYnVmKSwKLQkJCQkgIFZFTkNfQlVGRkVSX1RZUEVfUURTUDYpOwotCWlmIChwbGlzdCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHdiX2J1ZiBmYWlsZWQgdG8gYWRkX3RvX3BtZW1fbGlzdFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0JcGNmZy0+d2JfYnVmLnJlZ2lvbiA9IHBidWZzLT53Yl9idWYuc3JjOwotCXBjZmctPndiX2J1Zi5waHlzID0gcGxpc3QtPmJ1Zi5wYWRkcjsKLQlwY2ZnLT53Yl9idWYuc2l6ZSA9IHBsaXN0LT5idWYuc2l6ZTsKLQlwY2ZnLT53Yl9idWYub2Zmc2V0ID0gMDsKLQotCXBsaXN0ID0gdmVuY19hZGRfcG1lbV90b19saXN0KGR2ZW5jLCAmKHBidWZzLT5jbWRfYnVmKSwKLQkJCQkgIFZFTkNfQlVGRkVSX1RZUEVfUURTUDYpOwotCWlmIChwbGlzdCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGNtZF9idWYgZmFpbGVkIHRvIGFkZF90b19wbWVtX2xpc3RcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCXBjZmctPmNtZF9idWYucmVnaW9uID0gcGJ1ZnMtPmNtZF9idWYuc3JjOwotCXBjZmctPmNtZF9idWYucGh5cyA9IHBsaXN0LT5idWYucGFkZHI7Ci0JcGNmZy0+Y21kX2J1Zi5zaXplID0gcGxpc3QtPmJ1Zi5zaXplOwotCXBjZmctPmNtZF9idWYub2Zmc2V0ID0gMDsKLQotCXBsaXN0ID0gdmVuY19hZGRfcG1lbV90b19saXN0KGR2ZW5jLCAmKHBidWZzLT52bGNfYnVmKSwKLQkJCQkgIFZFTkNfQlVGRkVSX1RZUEVfUURTUDYpOwotCWlmIChwbGlzdCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHZsY19idWYgZmFpbGVkIHRvIGFkZF90b19wbWVtX2xpc3QiCi0JCSIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCXBjZmctPnZsY19idWYucmVnaW9uID0gcGJ1ZnMtPnZsY19idWYuc3JjOwotCXBjZmctPnZsY19idWYucGh5cyA9IHBsaXN0LT5idWYucGFkZHI7Ci0JcGNmZy0+dmxjX2J1Zi5zaXplID0gcGxpc3QtPmJ1Zi5zaXplOwotCXBjZmctPnZsY19idWYub2Zmc2V0ID0gMDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmVuY19zdGFydChzdHJ1Y3QgdmVuY19kZXYgKmR2ZW5jLCB2b2lkICphcmdwKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCB2ZW5jX3E2X2NvbmZpZyBxNl9jb25maWc7Ci0Jc3RydWN0IHZlbmNfaW5pdF9jb25maWcgdmNvbmZpZzsKLQotCWR2ZW5jLT5zdGF0ZSA9IFZFTkNfU1RBVEVfU1RBUlQ7Ci0JcmV0ID0gY29weV9mcm9tX3VzZXIoJnZjb25maWcsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgdmVuY19pbml0X2NvbmZpZykpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCW1lbWNweSgmcTZfY29uZmlnLCAmKHZjb25maWcucTZfY29uZmlnKSwgc2l6ZW9mKHE2X2NvbmZpZykpOwotCXJldCA9IHZlbmNfYXNzaWduX3E2X2J1ZmZlcnMoZHZlbmMsICYodmNvbmZpZy5xNl9idWZzKSwKLQkJJihxNl9jb25maWcuYnVmX3BhcmFtcykpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcl9lcnIoIiVzOiBhc3NpZ25fcTZfYnVmZmVycyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0KLQlxNl9jb25maWcuY2FsbGJhY2tfZXZlbnQgPSBkdmVuYy0+cTZfaGFuZGxlOwotCVRSQUNFKCIlczogcGFyYW1ldGVyczogaGFuZGxlOiVwLCBjb25maWc6JXAsIGNhbGxiYWNrOiVwIFxuIiwgX19mdW5jX18sCi0JCWR2ZW5jLT5xNl9oYW5kbGUsICZxNl9jb25maWcsIHE2X2NvbmZpZy5jYWxsYmFja19ldmVudCk7Ci0JVFJBQ0UoIiVzOiBwYXJhbWV0ZXJzOnJlY29uMToweCV4LCByZWNvbjI6MHgleCwiCi0JCSIgd2JfYnVmOjB4JXgsIGNtZDoweCV4LCB2bGM6MHgleFxuIiwgX19mdW5jX18sCi0JCXE2X2NvbmZpZy5idWZfcGFyYW1zLnJlY29uX2J1ZjEucGh5cywKLQkJcTZfY29uZmlnLmJ1Zl9wYXJhbXMucmVjb25fYnVmMi5waHlzLAotCQlxNl9jb25maWcuYnVmX3BhcmFtcy53Yl9idWYucGh5cywKLQkJcTZfY29uZmlnLmJ1Zl9wYXJhbXMuY21kX2J1Zi5waHlzLAotCQlxNl9jb25maWcuYnVmX3BhcmFtcy52bGNfYnVmLnBoeXMpOwotCVRSQUNFKCIlczogc2l6ZSBvZiBwYXJhbTolZCBcbiIsIF9fZnVuY19fLCBzaXplb2YocTZfY29uZmlnKSk7Ci0JcmV0ID0gZGFsX2NhbGxfZjUoZHZlbmMtPnE2X2hhbmRsZSwgVkVOQ19EQUxSUENfU1RBUlQsICZxNl9jb25maWcsCi0JCXNpemVvZihxNl9jb25maWcpKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJcHJfZXJyKCIlczogcmVtb3RlIGZ1bmN0aW9uIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2ZW5jX2VuY29kZV9mcmFtZShzdHJ1Y3QgdmVuY19kZXYgKmR2ZW5jLCB2b2lkICphcmdwKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCB2ZW5jX3BtZW0gYnVmOwotCXN0cnVjdCB2ZW5jX2lucHV0X2J1ZiBxNl9pbnB1dDsKLQlzdHJ1Y3QgdmVuY19wbWVtX2xpc3QgKnBsaXN0OwotCXN0cnVjdCB2ZW5jX2J1ZmZlciBpbnB1dDsKLQotCXJldCA9IGNvcHlfZnJvbV91c2VyKCZpbnB1dCwgYXJncCwgc2l6ZW9mKHN0cnVjdCB2ZW5jX2J1ZmZlcikpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldCA9IGNvcHlfZnJvbV91c2VyKCZidWYsCi0JCQkgICAgICAgKChzdHJ1Y3QgdmVuY19idWZmZXIgKilhcmdwKS0+cHRyX2J1ZmZlciwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZlbmNfcG1lbSkpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcGxpc3QgPSB2ZW5jX2dldF9wbWVtX2Zyb21fbGlzdChkdmVuYywgYnVmLmZkLCBidWYub2Zmc2V0LAotCQkJVkVOQ19CVUZGRVJfVFlQRV9JTlBVVCk7Ci0JaWYgKE5VTEwgPT0gcGxpc3QpIHsKLQkJcGxpc3QgPSB2ZW5jX2FkZF9wbWVtX3RvX2xpc3QoZHZlbmMsICZidWYsCi0JCQlWRU5DX0JVRkZFUl9UWVBFX0lOUFVUKTsKLQkJaWYgKHBsaXN0ID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IGJ1ZmZlciBhZGRfdG9fcG1lbV9saXN0IGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVQRVJNOwotCQl9Ci0JfQotCi0JcTZfaW5wdXQuZmxhZ3MgPSAwOwotCWlmIChpbnB1dC5mbGFncyAmIFZFTkNfRkxBR19FT1MpCi0JCXE2X2lucHV0LmZsYWdzIHw9IDB4MDAwMDAwMDE7Ci0JcTZfaW5wdXQueXV2X2J1Zi5yZWdpb24gPSBwbGlzdC0+YnVmLnNyYzsKLQlxNl9pbnB1dC55dXZfYnVmLnBoeXMgPSBwbGlzdC0+YnVmLnBhZGRyOwotCXE2X2lucHV0Lnl1dl9idWYuc2l6ZSA9IHBsaXN0LT5idWYuc2l6ZTsKLQlxNl9pbnB1dC55dXZfYnVmLm9mZnNldCA9IDA7Ci0JcTZfaW5wdXQuZGF0YV9zaXplID0gcGxpc3QtPmJ1Zi5zaXplOwotCXE2X2lucHV0LmNsaWVudF9kYXRhID0gKHUzMilpbnB1dC5jbGllbnRfZGF0YTsKLQlxNl9pbnB1dC50aW1lX3N0YW1wID0gaW5wdXQudGltZV9zdGFtcDsKLQlxNl9pbnB1dC5kdnNfb2Zmc2V0eCA9IDA7Ci0JcTZfaW5wdXQuZHZzX29mZnNldHkgPSAwOwotCi0JVFJBQ0UoIlB1c2hpbmcgZG93biBpbnB1dCBwaHlzPTB4JXggZmQ9ICVkLCBjbGllbnRfZGF0YTogMHgleCwiCi0JCSIgdGltZV9zdGFtcDolbGxkIFxuIiwgcTZfaW5wdXQueXV2X2J1Zi5waHlzLCBwbGlzdC0+YnVmLmZkLAotCQlpbnB1dC5jbGllbnRfZGF0YSwgaW5wdXQudGltZV9zdGFtcCk7Ci0JcmV0ID0gZGFsX2NhbGxfZjUoZHZlbmMtPnE2X2hhbmRsZSwgVkVOQ19EQUxSUENfUVVFVUVfSU5QVVQsCi0JCSZxNl9pbnB1dCwgc2l6ZW9mKHE2X2lucHV0KSk7Ci0KLQlpZiAocmV0ICE9IDApCi0JCXByX2VycigiJXM6IFE2IHF1ZXVlX2lucHV0IGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywKLQkJKGludClyZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmVuY19maWxsX291dHB1dChzdHJ1Y3QgdmVuY19kZXYgKmR2ZW5jLCB2b2lkICphcmdwKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCB2ZW5jX3BtZW0gYnVmOwotCXN0cnVjdCB2ZW5jX291dHB1dF9idWYgcTZfb3V0cHV0OwotCXN0cnVjdCB2ZW5jX3BtZW1fbGlzdCAqcGxpc3Q7Ci0Jc3RydWN0IHZlbmNfYnVmZmVyIG91dHB1dDsKLQotCXJldCA9IGNvcHlfZnJvbV91c2VyKCZvdXRwdXQsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgdmVuY19idWZmZXIpKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmYnVmLAotCQkJICAgICAgICgoc3RydWN0IHZlbmNfYnVmZmVyICopYXJncCktPnB0cl9idWZmZXIsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2ZW5jX3BtZW0pKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQlwbGlzdCA9CXZlbmNfZ2V0X3BtZW1fZnJvbV9saXN0KGR2ZW5jLCBidWYuZmQsIGJ1Zi5vZmZzZXQsCi0JCQlWRU5DX0JVRkZFUl9UWVBFX09VVFBVVCk7Ci0JaWYgKE5VTEwgPT0gcGxpc3QpIHsKLQkJcGxpc3QgPSB2ZW5jX2FkZF9wbWVtX3RvX2xpc3QoZHZlbmMsICZidWYsCi0JCQkJVkVOQ19CVUZGRVJfVFlQRV9PVVRQVVQpOwotCQlpZiAoTlVMTCA9PSBwbGlzdCkgewotCQkJcHJfZXJyKCIlczogb3V0cHV0IGJ1ZmZlciBmYWlsZWQgdG8gYWRkX3RvX3BtZW1fbGlzdCIKLQkJCQkiXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVQRVJNOwotCQl9Ci0JfQotCXE2X291dHB1dC5iaXRfc3RyZWFtX2J1Zi5yZWdpb24gPSBwbGlzdC0+YnVmLnNyYzsKLQlxNl9vdXRwdXQuYml0X3N0cmVhbV9idWYucGh5cyA9ICh1MzIpcGxpc3QtPmJ1Zi5wYWRkcjsKLQlxNl9vdXRwdXQuYml0X3N0cmVhbV9idWYuc2l6ZSA9IHBsaXN0LT5idWYuc2l6ZTsKLQlxNl9vdXRwdXQuYml0X3N0cmVhbV9idWYub2Zmc2V0ID0gMDsKLQlxNl9vdXRwdXQuY2xpZW50X2RhdGEgPSAodTMyKW91dHB1dC5jbGllbnRfZGF0YTsKLQlyZXQgPQotCSAgICBkYWxfY2FsbF9mNShkdmVuYy0+cTZfaGFuZGxlLCBWRU5DX0RBTFJQQ19RVUVVRV9PVVRQVVQsICZxNl9vdXRwdXQsCi0JCQlzaXplb2YocTZfb3V0cHV0KSk7Ci0JaWYgKHJldCAhPSAwKQotCQlwcl9lcnIoIiVzOiByZW1vdGUgZnVuY3Rpb24gZmFpbGVkICglZClcbiIsIF9fZnVuY19fLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmVuY19zdG9wKHN0cnVjdCB2ZW5jX2RldiAqZHZlbmMpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHZlbmNfbXNnIG1zZzsKLQotCXJldCA9IGRhbF9jYWxsX2YwKGR2ZW5jLT5xNl9oYW5kbGUsIFZFTkNfREFMUlBDX1NUT1AsIDEpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogcmVtb3RlIHJ1bmN0aW9uIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJbXNnLm1zZ19jb2RlID0gVkVOQ19NU0dfU1RPUDsKLQkJbXNnLm1zZ19kYXRhX3NpemUgPSAwOwotCQltc2cuc3RhdHVzX2NvZGUgPSBWRU5DX1NfRUZBSUw7Ci0JCXZlbmNfcHV0X21zZyhkdmVuYywgJm1zZyk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmVuY19wYXVzZShzdHJ1Y3QgdmVuY19kZXYgKmR2ZW5jKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCB2ZW5jX21zZyBtc2c7Ci0KLQlyZXQgPSBkYWxfY2FsbF9mMChkdmVuYy0+cTZfaGFuZGxlLCBWRU5DX0RBTFJQQ19TVVNQRU5ELCAxKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHJlbW90ZSBmdW5jdGlvbiBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7Ci0JCW1zZy5tc2dfY29kZSA9IFZFTkNfTVNHX1BBVVNFOwotCQltc2cuc3RhdHVzX2NvZGUgPSBWRU5DX1NfRUZBSUw7Ci0JCW1zZy5tc2dfZGF0YV9zaXplID0gMDsKLQkJdmVuY19wdXRfbXNnKGR2ZW5jLCAmbXNnKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2ZW5jX3Jlc3VtZShzdHJ1Y3QgdmVuY19kZXYgKmR2ZW5jKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCB2ZW5jX21zZyBtc2c7Ci0KLQlyZXQgPSBkYWxfY2FsbF9mMChkdmVuYy0+cTZfaGFuZGxlLCBWRU5DX0RBTFJQQ19SRVNVTUUsIDEpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogcmVtb3RlIGZ1bmN0aW9uIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJbXNnLm1zZ19jb2RlID0gVkVOQ19NU0dfUkVTVU1FOwotCQltc2cubXNnX2RhdGFfc2l6ZSA9IDA7Ci0JCW1zZy5zdGF0dXNfY29kZSA9IFZFTkNfU19FRkFJTDsKLQkJdmVuY19wdXRfbXNnKGR2ZW5jLCAmbXNnKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2ZW5jX2ZsdXNoKHN0cnVjdCB2ZW5jX2RldiAqZHZlbmMsIHZvaWQgKmFyZ3ApCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHZlbmNfbXNnIG1zZzsKLQl1bmlvbiB2ZW5jX21zZ19kYXRhIHNtc2c7Ci0JaW50IHN0YXR1cyA9IFZFTkNfU19TVUNDRVNTOwotCXN0cnVjdCB2ZW5jX2J1ZmZlcl9mbHVzaCBmbHVzaDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmZmx1c2gsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgdmVuY19idWZmZXJfZmx1c2gpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKGZsdXNoLmZsdXNoX21vZGUgPT0gVkVOQ19GTFVTSF9BTEwpIHsKLQkJcmV0ID0gZGFsX2NhbGxfZjAoZHZlbmMtPnE2X2hhbmRsZSwgVkVOQ19EQUxSUENfRkxVU0gsIDEpOwotCQlpZiAocmV0KQotCQkJc3RhdHVzID0gVkVOQ19TX0VGQUlMOwotCX0gZWxzZQotCQlzdGF0dXMgPSBWRU5DX1NfRU5PVFNVUFA7Ci0KLQlpZiAoc3RhdHVzICE9IFZFTkNfU19TVUNDRVNTKSB7Ci0JCWlmICgoZmx1c2guZmx1c2hfbW9kZSA9PSBWRU5DX0ZMVVNIX0lOUFVUKSB8fAotCQkgICAgIChmbHVzaC5mbHVzaF9tb2RlID09IFZFTkNfRkxVU0hfQUxMKSkgewotCQkJc21zZy5mbHVzaF9yZXQuZmx1c2hfbW9kZSA9IFZFTkNfRkxVU0hfSU5QVVQ7Ci0JCQltc2cubXNnX2RhdGEgPSBzbXNnOwotCQkJbXNnLnN0YXR1c19jb2RlID0gc3RhdHVzOwotCQkJbXNnLm1zZ19jb2RlID0gVkVOQ19NU0dfRkxVU0g7Ci0JCQltc2cubXNnX2RhdGFfc2l6ZSA9IHNpemVvZih1bmlvbiB2ZW5jX21zZ19kYXRhKTsKLQkJCXZlbmNfcHV0X21zZyhkdmVuYywgJm1zZyk7Ci0JCX0KLQkJaWYgKGZsdXNoLmZsdXNoX21vZGUgPT0gVkVOQ19GTFVTSF9PVVRQVVQgfHwKLQkJICAgICAoZmx1c2guZmx1c2hfbW9kZSA9PSBWRU5DX0ZMVVNIX0FMTCkpIHsKLQkJCXNtc2cuZmx1c2hfcmV0LmZsdXNoX21vZGUgPSBWRU5DX0ZMVVNIX09VVFBVVDsKLQkJCW1zZy5tc2dfZGF0YSA9IHNtc2c7Ci0JCQltc2cuc3RhdHVzX2NvZGUgPSBzdGF0dXM7Ci0JCQltc2cubXNnX2NvZGUgPSBWRU5DX01TR19GTFVTSDsKLQkJCW1zZy5tc2dfZGF0YV9zaXplID0gc2l6ZW9mKHVuaW9uIHZlbmNfbXNnX2RhdGEpOwotCQkJdmVuY19wdXRfbXNnKGR2ZW5jLCAmbXNnKTsKLQkJfQotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2ZW5jX2dldF9zZXF1ZW5jZV9oZHIoc3RydWN0IHZlbmNfZGV2ICpkdmVuYywgdm9pZCAqYXJncCkKLXsKLQlwcl9lcnIoIiVzIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gLUVJTzsKLX0KLQotc3RhdGljIGludCB2ZW5jX3NldF9xcF9yYW5nZShzdHJ1Y3QgdmVuY19kZXYgKmR2ZW5jLCB2b2lkICphcmdwKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCB2ZW5jX3FwX3JhbmdlIHFwOwotCi0JcmV0ID0gY29weV9mcm9tX3VzZXIoJnFwLCBhcmdwLCBzaXplb2Yoc3RydWN0IHZlbmNfcXBfcmFuZ2UpKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChkdmVuYy0+c3RhdGUgPT0gVkVOQ19TVEFURV9TVEFSVCB8fAotCQlkdmVuYy0+c3RhdGUgPT0gVkVOQ19TVEFURV9QQVVTRSkgewotCQlyZXQgPQotCQkgICAgZGFsX2NhbGxfZjUoZHZlbmMtPnE2X2hhbmRsZSwgVkVOQ19EQUxSUENfVVBEQVRFX1FQX1JBTkdFLAotCQkJCSZxcCwgc2l6ZW9mKHN0cnVjdCB2ZW5jX3FwX3JhbmdlKSk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IHJlbW90ZSBmdW5jdGlvbiBmYWlsZWQgKCVkKSBcbiIsIF9fZnVuY19fLAotCQkJCXJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmVuY19zZXRfaW50cmFfcGVyaW9kKHN0cnVjdCB2ZW5jX2RldiAqZHZlbmMsIHZvaWQgKmFyZ3ApCi17Ci0JaW50IHJldCA9IDA7Ci0JdTMyIHBudW0gPSAwOwotCi0JcmV0ID0gY29weV9mcm9tX3VzZXIoJnBudW0sIGFyZ3AsIHNpemVvZihpbnQpKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQlpZiAoZHZlbmMtPnN0YXRlID09IFZFTkNfU1RBVEVfU1RBUlQgfHwKLQkJZHZlbmMtPnN0YXRlID09IFZFTkNfU1RBVEVfUEFVU0UpIHsKLQkJcmV0ID0gZGFsX2NhbGxfZjAoZHZlbmMtPnE2X2hhbmRsZSwKLQkJCVZFTkNfREFMUlBDX1VQREFURV9JTlRSQV9QRVJJT0QsIHBudW0pOwotCQlpZiAocmV0KQotCQkJcHJfZXJyKCIlczogcmVtb3RlIGZ1bmN0aW9uIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywKLQkJCQlyZXQpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZlbmNfc2V0X2ludHJhX3JlZnJlc2goc3RydWN0IHZlbmNfZGV2ICpkdmVuYywgdm9pZCAqYXJncCkKLXsKLQlpbnQgcmV0ID0gMDsKLQl1MzIgbWJfbnVtID0gMDsKLQotCXJldCA9IGNvcHlfZnJvbV91c2VyKCZtYl9udW0sIGFyZ3AsIHNpemVvZihpbnQpKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQlpZiAoZHZlbmMtPnN0YXRlID09IFZFTkNfU1RBVEVfU1RBUlQgfHwKLQkJZHZlbmMtPnN0YXRlID09IFZFTkNfU1RBVEVfUEFVU0UpIHsKLQkJcmV0ID0gZGFsX2NhbGxfZjAoZHZlbmMtPnE2X2hhbmRsZSwKLQkJCVZFTkNfREFMUlBDX1VQREFURV9JTlRSQV9SRUZSRVNILCBtYl9udW0pOwotCQlpZiAocmV0KQotCQkJcHJfZXJyKCIlczogcmVtb3RlIGZ1bmN0aW9uIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywKLQkJCQlyZXQpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZlbmNfc2V0X2ZyYW1lX3JhdGUoc3RydWN0IHZlbmNfZGV2ICpkdmVuYywgdm9pZCAqYXJncCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgdmVuY19mcmFtZV9yYXRlIHBkYXRhOwotCXJldCA9IGNvcHlfZnJvbV91c2VyKCZwZGF0YSwgYXJncCwgc2l6ZW9mKHN0cnVjdCB2ZW5jX2ZyYW1lX3JhdGUpKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQlpZiAoZHZlbmMtPnN0YXRlID09IFZFTkNfU1RBVEVfU1RBUlQgfHwKLQkJZHZlbmMtPnN0YXRlID09IFZFTkNfU1RBVEVfUEFVU0UpIHsKLQkJcmV0ID0gZGFsX2NhbGxfZjUoZHZlbmMtPnE2X2hhbmRsZSwKLQkJCQlWRU5DX0RBTFJQQ19VUERBVEVfRlJBTUVfUkFURSwKLQkJCQkodm9pZCAqKSYocGRhdGEpLAotCQkJCXNpemVvZihzdHJ1Y3QgdmVuY19mcmFtZV9yYXRlKSk7Ci0JCWlmIChyZXQpCi0JCQlwcl9lcnIoIiVzOiByZW1vdGUgZnVuY3Rpb24gZmFpbGVkICglZClcbiIsIF9fZnVuY19fLAotCQkJCXJldCk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmVuY19zZXRfdGFyZ2V0X2JpdHJhdGUoc3RydWN0IHZlbmNfZGV2ICpkdmVuYywgdm9pZCAqYXJncCkKLXsKLQlpbnQgcmV0ID0gMDsKLQl1MzIgcGRhdGEgPSAwOwotCi0JcmV0ID0gY29weV9mcm9tX3VzZXIoJnBkYXRhLCBhcmdwLCBzaXplb2YoaW50KSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JaWYgKGR2ZW5jLT5zdGF0ZSA9PSBWRU5DX1NUQVRFX1NUQVJUIHx8Ci0JCWR2ZW5jLT5zdGF0ZSA9PSBWRU5DX1NUQVRFX1BBVVNFKSB7Ci0JCXJldCA9IGRhbF9jYWxsX2YwKGR2ZW5jLT5xNl9oYW5kbGUsCi0JCQlWRU5DX0RBTFJQQ19VUERBVEVfQklUUkFURSwgcGRhdGEpOwotCQlpZiAocmV0KQotCQkJcHJfZXJyKCIlczogcmVtb3RlIGZ1bmN0aW9uIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywKLQkJCQlyZXQpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZlbmNfcmVxdWVzdF9pZnJhbWUoc3RydWN0IHZlbmNfZGV2ICpkdmVuYykKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChkdmVuYy0+c3RhdGUgIT0gVkVOQ19TVEFURV9TVEFSVCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXQgPSBkYWxfY2FsbF9mMChkdmVuYy0+cTZfaGFuZGxlLCBWRU5DX0RBTFJQQ19SRVFVRVNUX0lGUkFNRSwgMSk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogcmVtb3RlIGZ1bmN0aW9uIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZlbmNfc3RvcF9yZWFkX21zZyhzdHJ1Y3QgdmVuY19kZXYgKmR2ZW5jKQotewotCXN0cnVjdCB2ZW5jX21zZyBtc2c7Ci0JaW50IHJldCA9IDA7Ci0KLQltc2cuc3RhdHVzX2NvZGUgPSAwOwotCW1zZy5tc2dfY29kZSA9IFZFTkNfTVNHX1NUT1BfUkVBRElOR19NU0c7Ci0JbXNnLm1zZ19kYXRhX3NpemUgPSAwOwotCXZlbmNfcHV0X21zZyhkdmVuYywgJm1zZyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2ZW5jX3E2X3N0b3Aoc3RydWN0IHZlbmNfZGV2ICpkdmVuYykKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgdmVuY19wbWVtX2xpc3QgKnBsaXN0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQl3YWtlX3VwKCZkdmVuYy0+dmVuY19tc2dfZXZ0KTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZHZlbmMtPnZlbmNfcG1lbV9saXN0X2xvY2ssIGZsYWdzKTsKLQlpZiAoIWR2ZW5jLT5wbWVtX2ZyZWVkKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkocGxpc3QsICZkdmVuYy0+dmVuY19wbWVtX2xpc3RfaGVhZCwgbGlzdCkKLQkJCXB1dF9wbWVtX2ZpbGUocGxpc3QtPmJ1Zi5maWxlKTsKLQkJZHZlbmMtPnBtZW1fZnJlZWQgPSAxOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdmVuYy0+dmVuY19wbWVtX2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JZHZlbmMtPnN0YXRlID0gVkVOQ19TVEFURV9TVE9QOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmVuY190cmFuc2xhdGVfZXJyb3IoZW51bSB2ZW5jX3N0YXR1c19jb2RlIHE2X3N0YXR1cykKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXN3aXRjaCAocTZfc3RhdHVzKSB7Ci0JY2FzZSBWRU5DX1NUQVRVU19TVUNDRVNTOgotCQlyZXQgPSBWRU5DX1NfU1VDQ0VTUzsKLQkJYnJlYWs7Ci0JY2FzZSBWRU5DX1NUQVRVU19FUlJPUjoKLQkJcmV0ID0gVkVOQ19TX0VGQUlMOwotCQlicmVhazsKLQljYXNlIFZFTkNfU1RBVFVTX0lOVkFMSURfU1RBVEU6Ci0JCXJldCA9IFZFTkNfU19FSU5WQUxTVEFURTsKLQkJYnJlYWs7Ci0JY2FzZSBWRU5DX1NUQVRVU19GTFVTSElORzoKLQkJcmV0ID0gVkVOQ19TX0VGTFVTSEVEOwotCQlicmVhazsKLQljYXNlIFZFTkNfU1RBVFVTX0lOVkFMSURfUEFSQU06Ci0JCXJldCA9IFZFTkNfU19FQkFEUEFSQU07Ci0JCWJyZWFrOwotCWNhc2UgVkVOQ19TVEFUVVNfQ01EX1FVRVVFX0ZVTEw6Ci0JCXJldCA9IFZFTkNfU19FQ01EUUZVTEw7Ci0JCWJyZWFrOwotCWNhc2UgVkVOQ19TVEFUVVNfQ1JJVElDQUw6Ci0JCXJldCA9IFZFTkNfU19FRkFUQUw7Ci0JCWJyZWFrOwotCWNhc2UgVkVOQ19TVEFUVVNfSU5TVUZGSUNJRU5UX1JFU09VUkNFUzoKLQkJcmV0ID0gVkVOQ19TX0VOT0hXUkVTOwotCQlicmVhazsKLQljYXNlIFZFTkNfU1RBVFVTX1RJTUVPVVQ6Ci0JCXJldCA9IFZFTkNfU19FVElNRU9VVDsKLQkJYnJlYWs7Ci0JfQotCWlmIChxNl9zdGF0dXMgIT0gVkVOQ19TVEFUVVNfU1VDQ0VTUykKLQkJcHJfZXJyKCIlczogUTYgZmFpbGVkICglZCkiLCBfX2Z1bmNfXywgKGludClxNl9zdGF0dXMpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHZlbmNfcTZfY2FsbGJhY2sodm9pZCAqZGF0YSwgaW50IGxlbiwgdm9pZCAqY29va2llKQotewotCWludCBzdGF0dXMgPSAwOwotCXN0cnVjdCB2ZW5jX2RldiAqZHZlbmMgPSAoc3RydWN0IHZlbmNfZGV2ICopY29va2llOwotCXN0cnVjdCB2ZW5jX21zZ190eXBlICpxNl9tc2cgPSBOVUxMOwotCXN0cnVjdCB2ZW5jX21zZyBtc2csIG1zZzE7Ci0JdW5pb24gdmVuY19tc2dfZGF0YSBzbXNnMSwgc21zZzI7Ci0JdW5zaWduZWQgbG9uZyBtc2dfY29kZSA9IDA7Ci0Jc3RydWN0IHZlbmNfaW5wdXRfcGF5bG9hZCAqcGxvYWQxOwotCXN0cnVjdCB2ZW5jX291dHB1dF9wYXlsb2FkICpwbG9hZDI7Ci0JdWludDMyX3QgKiB0bXAgPSAodWludDMyX3QgKikgZGF0YTsKLQotCWlmIChkdmVuYyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGVtcHR5IGRyaXZlciBwYXJhbWV0ZXJcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAodG1wWzJdID09IHNpemVvZihzdHJ1Y3QgdmVuY19tc2dfdHlwZSkpIHsKLQkJcTZfbXNnID0gKHN0cnVjdCB2ZW5jX21zZ190eXBlICopJnRtcFszXTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBjYWxsYmFjayB3aXRoIGVtcHR5IG1lc3NhZ2UgKCVkLCAlZClcbiIsCi0JCQlfX2Z1bmNfXywgdG1wWzJdLCBzaXplb2Yoc3RydWN0IHZlbmNfbXNnX3R5cGUpKTsKLQkJcmV0dXJuOwotCX0KLQltc2cubXNnX2RhdGFfc2l6ZSA9IDA7Ci0Jc3RhdHVzID0gdmVuY190cmFuc2xhdGVfZXJyb3IocTZfbXNnLT5zdGF0dXMpOwotCXN3aXRjaCAoKGVudW0gdmVuY19ldmVudF90eXBlX2VudW0pcTZfbXNnLT5ldmVudCkgewotCWNhc2UgVkVOQ19FVkVOVF9TVEFSVF9TVEFUVVM6Ci0JCWR2ZW5jLT5zdGF0ZSA9IFZFTkNfU1RBVEVfU1RBUlQ7Ci0JCW1zZ19jb2RlID0gVkVOQ19NU0dfU1RBUlQ7Ci0JCWJyZWFrOwotCWNhc2UgVkVOQ19FVkVOVF9TVE9QX1NUQVRVUzoKLQkJdmVuY19xNl9zdG9wKGR2ZW5jKTsKLQkJbXNnX2NvZGUgPSBWRU5DX01TR19TVE9QOwotCQlicmVhazsKLQljYXNlIFZFTkNfRVZFTlRfU1VTUEVORF9TVEFUVVM6Ci0JCWR2ZW5jLT5zdGF0ZSA9IFZFTkNfU1RBVEVfUEFVU0U7Ci0JCW1zZ19jb2RlID0gVkVOQ19NU0dfUEFVU0U7Ci0JCWJyZWFrOwotCWNhc2UgVkVOQ19FVkVOVF9SRVNVTUVfU1RBVFVTOgotCQlkdmVuYy0+c3RhdGUgPSBWRU5DX1NUQVRFX1NUQVJUOwotCQltc2dfY29kZSA9IFZFTkNfTVNHX1JFU1VNRTsKLQkJYnJlYWs7Ci0JY2FzZSBWRU5DX0VWRU5UX0ZMVVNIX1NUQVRVUzoKLQkJc21zZzEuZmx1c2hfcmV0LmZsdXNoX21vZGUgPSBWRU5DX0ZMVVNIX0lOUFVUOwotCQltc2cxLnN0YXR1c19jb2RlID0gc3RhdHVzOwotCQltc2cxLm1zZ19jb2RlID0gVkVOQ19NU0dfRkxVU0g7Ci0JCW1zZzEubXNnX2RhdGEgPSBzbXNnMTsKLQkJbXNnMS5tc2dfZGF0YV9zaXplID0gc2l6ZW9mKHVuaW9uIHZlbmNfbXNnX2RhdGEpOwotCQl2ZW5jX3B1dF9tc2coZHZlbmMsICZtc2cxKTsKLQkJc21zZzIuZmx1c2hfcmV0LmZsdXNoX21vZGUgPSBWRU5DX0ZMVVNIX09VVFBVVDsKLQkJbXNnX2NvZGUgPSBWRU5DX01TR19GTFVTSDsKLQkJbXNnLm1zZ19kYXRhID0gc21zZzI7Ci0JCW1zZy5tc2dfZGF0YV9zaXplID0gc2l6ZW9mKHVuaW9uIHZlbmNfbXNnX2RhdGEpOwotCQlicmVhazsKLQljYXNlIFZFTkNfRVZFTlRfUkVMRUFTRV9JTlBVVDoKLQkJcGxvYWQxID0gJigocTZfbXNnLT5wYXlsb2FkKS5pbnB1dF9wYXlsb2FkKTsKLQkJVFJBQ0UoIlJlbGVhc2VfaW5wdXQ6IGRhdGE6IDB4JXggXG4iLCBwbG9hZDEtPmRhdGEpOwotCQlpZiAocGxvYWQxICE9IE5VTEwpIHsKLQkJCW1zZy5tc2dfZGF0YS5idWYuY2xpZW50X2RhdGEgPSBwbG9hZDEtPmRhdGE7Ci0JCQltc2dfY29kZSA9IFZFTkNfTVNHX0lOUFVUX0JVRkZFUl9ET05FOwotCQkJbXNnLm1zZ19kYXRhX3NpemUgPSBzaXplb2YodW5pb24gdmVuY19tc2dfZGF0YSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRU5DX0VWRU5UX0RFTElWRVJfT1VUUFVUOgotCQlwbG9hZDIgPSAmKChxNl9tc2ctPnBheWxvYWQpLm91dHB1dF9wYXlsb2FkKTsKLQkJc21zZzEuYnVmLmZsYWdzID0gMDsKLQkJaWYgKHBsb2FkMi0+ZmxhZ3MgJiBWRU5DX0ZMQUdfU1lOQ19GUkFNRSkKLQkJCXNtc2cxLmJ1Zi5mbGFncyB8PSBWRU5DX0ZMQUdfU1lOQ19GUkFNRTsKLQkJaWYgKHBsb2FkMi0+ZmxhZ3MgJiBWRU5DX0ZMQUdfQ09ERUNfQ09ORklHKQotCQkJc21zZzEuYnVmLmZsYWdzIHw9IFZFTkNfRkxBR19DT0RFQ19DT05GSUc7Ci0JCWlmIChwbG9hZDItPmZsYWdzICYgVkVOQ19GTEFHX0VORF9PRl9GUkFNRSkKLQkJCXNtc2cxLmJ1Zi5mbGFncyB8PSBWRU5DX0ZMQUdfRU5EX09GX0ZSQU1FOwotCQlpZiAocGxvYWQyLT5mbGFncyAmIFZFTkNfRkxBR19FT1MpCi0JCQlzbXNnMS5idWYuZmxhZ3MgfD0gVkVOQ19GTEFHX0VPUzsKLQkJc21zZzEuYnVmLmxlbiA9IHBsb2FkMi0+c2l6ZTsKLQkJc21zZzEuYnVmLm9mZnNldCA9IDA7Ci0JCXNtc2cxLmJ1Zi50aW1lX3N0YW1wID0gcGxvYWQyLT50aW1lX3N0YW1wOwotCQlzbXNnMS5idWYuY2xpZW50X2RhdGEgPSBwbG9hZDItPmRhdGE7Ci0JCW1zZ19jb2RlID0gVkVOQ19NU0dfT1VUUFVUX0JVRkZFUl9ET05FOwotCQltc2cubXNnX2RhdGEgPSBzbXNnMTsKLQkJbXNnLm1zZ19kYXRhX3NpemUgPSBzaXplb2YodW5pb24gdmVuY19tc2dfZGF0YSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGludmFsaWQgcmVzcG9uc2UgZnJvbSBRNiAoJWQpXG4iLCBfX2Z1bmNfXywKLQkJCShpbnQpcTZfbXNnLT5ldmVudCk7Ci0JCXJldHVybjsKLQl9Ci0JbXNnLnN0YXR1c19jb2RlID0gc3RhdHVzOwotCW1zZy5tc2dfY29kZSA9IG1zZ19jb2RlOwotCXZlbmNfcHV0X21zZyhkdmVuYywgJm1zZyk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IHZlbmNfZ2V0X3ZlcnNpb24oc3RydWN0IHZlbmNfZGV2ICpkdmVuYywgdm9pZCAqYXJncCkKLXsKLQlzdHJ1Y3QgdmVuY192ZXJzaW9uIHZlcl9pbmZvOwotCWludCByZXQgPSAwOwotCi0JdmVyX2luZm8ubWFqb3IgPSBWRU5DX0dFVF9NQUpPUl9WRVJTSU9OKFZFTkNfSU5URVJGQUNFX1ZFUlNJT04pOwotCXZlcl9pbmZvLm1pbm9yID0gVkVOQ19HRVRfTUlOT1JfVkVSU0lPTihWRU5DX0lOVEVSRkFDRV9WRVJTSU9OKTsKLQotCXJldCA9IGNvcHlfdG9fdXNlcigoKHN0cnVjdCB2ZW5jX3ZlcnNpb24gKilhcmdwKSwKLQkJCQkmdmVyX2luZm8sIHNpemVvZih2ZXJfaW5mbykpOwotCWlmIChyZXQpCi0JCXByX2VycigiJXMgZmFpbGVkIHRvIGNvcHlfdG9fdXNlclxuIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIHJldDsKLQotfQotCi1zdGF0aWMgbG9uZyBxNnZlbmNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHUzMiBjbWQsCi0JCQkgICB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlsb25nIHJldCA9IDA7Ci0Jdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0Jc3RydWN0IHZlbmNfZGV2ICpkdmVuYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCWlmICghZHZlbmMgfHwgIWR2ZW5jLT5pc19hY3RpdmUpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVkVOQ19JT0NUTF9TRVRfSU5QVVRfQlVGRkVSOgotCQlyZXQgPSB2ZW5jX3NldF9idWZmZXIoZHZlbmMsIGFyZ3AsIFZFTkNfQlVGRkVSX1RZUEVfSU5QVVQpOwotCQlicmVhazsKLQljYXNlIFZFTkNfSU9DVExfU0VUX09VVFBVVF9CVUZGRVI6Ci0JCXJldCA9IHZlbmNfc2V0X2J1ZmZlcihkdmVuYywgYXJncCwgVkVOQ19CVUZGRVJfVFlQRV9PVVRQVVQpOwotCQlicmVhazsKLQljYXNlIFZFTkNfSU9DVExfR0VUX1NFUVVFTkNFX0hEUjoKLQkJcmV0ID0gdmVuY19nZXRfc2VxdWVuY2VfaGRyKGR2ZW5jLCBhcmdwKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRU5DX0lPQ1RMX1NFVF9RUF9SQU5HRToKLQkJcmV0ID0gdmVuY19zZXRfcXBfcmFuZ2UoZHZlbmMsIGFyZ3ApOwotCQlicmVhazsKLQljYXNlIFZFTkNfSU9DVExfU0VUX0lOVFJBX1BFUklPRDoKLQkJcmV0ID0gdmVuY19zZXRfaW50cmFfcGVyaW9kKGR2ZW5jLCBhcmdwKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRU5DX0lPQ1RMX1NFVF9JTlRSQV9SRUZSRVNIOgotCQlyZXQgPSB2ZW5jX3NldF9pbnRyYV9yZWZyZXNoKGR2ZW5jLCBhcmdwKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRU5DX0lPQ1RMX1NFVF9GUkFNRV9SQVRFOgotCQlyZXQgPSB2ZW5jX3NldF9mcmFtZV9yYXRlKGR2ZW5jLCBhcmdwKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRU5DX0lPQ1RMX1NFVF9UQVJHRVRfQklUUkFURToKLQkJcmV0ID0gdmVuY19zZXRfdGFyZ2V0X2JpdHJhdGUoZHZlbmMsIGFyZ3ApOwotCQlicmVhazsKLQljYXNlIFZFTkNfSU9DVExfQ01EX1JFUVVFU1RfSUZSQU1FOgotCQlpZiAoZHZlbmMtPnN0YXRlID09IFZFTkNfU1RBVEVfU1RBUlQpCi0JCQlyZXQgPSB2ZW5jX3JlcXVlc3RfaWZyYW1lKGR2ZW5jKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRU5DX0lPQ1RMX0NNRF9TVEFSVDoKLQkJcmV0ID0gdmVuY19zdGFydChkdmVuYywgYXJncCk7Ci0JCWJyZWFrOwotCWNhc2UgVkVOQ19JT0NUTF9DTURfU1RPUDoKLQkJcmV0ID0gdmVuY19zdG9wKGR2ZW5jKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRU5DX0lPQ1RMX0NNRF9QQVVTRToKLQkJcmV0ID0gdmVuY19wYXVzZShkdmVuYyk7Ci0JCWJyZWFrOwotCWNhc2UgVkVOQ19JT0NUTF9DTURfUkVTVU1FOgotCQlyZXQgPSB2ZW5jX3Jlc3VtZShkdmVuYyk7Ci0JCWJyZWFrOwotCWNhc2UgVkVOQ19JT0NUTF9DTURfRU5DT0RFX0ZSQU1FOgotCQlyZXQgPSB2ZW5jX2VuY29kZV9mcmFtZShkdmVuYywgYXJncCk7Ci0JCWJyZWFrOwotCWNhc2UgVkVOQ19JT0NUTF9DTURfRklMTF9PVVRQVVRfQlVGRkVSOgotCQlyZXQgPSB2ZW5jX2ZpbGxfb3V0cHV0KGR2ZW5jLCBhcmdwKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRU5DX0lPQ1RMX0NNRF9GTFVTSDoKLQkJcmV0ID0gdmVuY19mbHVzaChkdmVuYywgYXJncCk7Ci0JCWJyZWFrOwotCWNhc2UgVkVOQ19JT0NUTF9DTURfUkVBRF9ORVhUX01TRzoKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGR2ZW5jLT52ZW5jX21zZ19ldnQsCi0JCQkJCSAgdmVuY19nZXRfbXNnKGR2ZW5jLCBhcmdwKSk7Ci0JCWJyZWFrOwotCWNhc2UgVkVOQ19JT0NUTF9DTURfU1RPUF9SRUFEX01TRzoKLQkJcmV0ID0gdmVuY19zdG9wX3JlYWRfbXNnKGR2ZW5jKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRU5DX0lPQ1RMX0dFVF9WRVJTSU9OOgotCQlyZXQgPSB2ZW5jX2dldF92ZXJzaW9uKGR2ZW5jLCBhcmdwKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogaW52YWxpZCBpb2N0bCBjb2RlICglZClcbiIsIF9fZnVuY19fLCBjbWQpOwotCQlyZXQgPSAtRU5PVFRZOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBxNnZlbmNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgaTsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgdmVuY19kZXYgKmR2ZW5jOwotCXN0cnVjdCB2ZW5jX21zZ19saXN0ICpwbGlzdCwgKnRtcDsKLQlzdHJ1Y3QgZGFsX2luZm8gdmVyc2lvbl9pbmZvOwotCi0JZHZlbmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmVuY19kZXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWR2ZW5jKSB7Ci0JCXByX2VycigiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cnVjdCB2ZW5jX2RldlxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGR2ZW5jOwotCUlOSVRfTElTVF9IRUFEKCZkdmVuYy0+dmVuY19tc2dfbGlzdF9oZWFkKTsKLQlJTklUX0xJU1RfSEVBRCgmZHZlbmMtPnZlbmNfbXNnX2xpc3RfZnJlZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmR2ZW5jLT52ZW5jX3BtZW1fbGlzdF9oZWFkKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkdmVuYy0+dmVuY19tc2dfZXZ0KTsKLQlzcGluX2xvY2tfaW5pdCgmZHZlbmMtPnZlbmNfbXNnX2xpc3RfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmR2ZW5jLT52ZW5jX3BtZW1fbGlzdF9sb2NrKTsKLQl2ZW5jX3JlZisrOwotCWZvciAoaSA9IDA7IGkgPCBWRU5DX01TR19NQVg7IGkrKykgewotCQlwbGlzdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZW5jX21zZ19saXN0KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGxpc3QpIHsKLQkJCXByX2VycigiJXM6IGt6YWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBlcnJfdmVuY19jcmVhdGVfbXNnX2xpc3Q7Ci0JCX0KLQkJbGlzdF9hZGQoJnBsaXN0LT5saXN0LCAmZHZlbmMtPnZlbmNfbXNnX2xpc3RfZnJlZSk7Ci0JfQotCWR2ZW5jLT5xNl9oYW5kbGUgPQotCSAgICBkYWxfYXR0YWNoKERBTERFVklDRUlEX1ZFTkNfREVWSUNFLCBEQUxERVZJQ0VJRF9WRU5DX1BPUlROQU1FLCAxLAotCQkgICAgICAgdmVuY19xNl9jYWxsYmFjaywgKHZvaWQgKilkdmVuYyk7Ci0JaWYgKCEoZHZlbmMtPnE2X2hhbmRsZSkpIHsKLQkJcHJfZXJyKCIlczogZGFsZGV2aWNlX2F0dGFjaCBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyX3ZlbmNfZGFsX2F0dGFjaDsKLQl9Ci0JcmV0ID0gZGFsX2NhbGxfZjkoZHZlbmMtPnE2X2hhbmRsZSwgREFMX09QX0lORk8sICZ2ZXJzaW9uX2luZm8sCi0JCXNpemVvZihzdHJ1Y3QgZGFsX2luZm8pKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQgdmVyc2lvblxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycl92ZW5jX2RhbF9vcGVuOwotCX0KLQlpZiAodmVuY19jaGVja192ZXJzaW9uKFZFTkNfSU5URVJGQUNFX1ZFUlNJT04sIHZlcnNpb25faW5mby52ZXJzaW9uKSkgewotCQlwcl9lcnIoIiVzOiBkcml2ZXIgdmVyc2lvbiBtaXNtYXRjaFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycl92ZW5jX2RhbF9vcGVuOwotCX0KLQlyZXQgPSBkYWxfY2FsbF9mMChkdmVuYy0+cTZfaGFuZGxlLCBEQUxfT1BfT1BFTiwgMSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBkYWxfY2FsbF9vcGVuIGZhaWxlZCAoJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBlcnJfdmVuY19kYWxfb3BlbjsKLQl9Ci0JZHZlbmMtPnN0YXRlID0gVkVOQ19TVEFURV9TVE9QOwotCWR2ZW5jLT5pc19hY3RpdmUgPSAxOwotCXByZXZlbnRfc2xlZXAoKTsKLQlyZXR1cm4gcmV0OwotZXJyX3ZlbmNfZGFsX29wZW46Ci0JZGFsX2RldGFjaChkdmVuYy0+cTZfaGFuZGxlKTsKLWVycl92ZW5jX2RhbF9hdHRhY2g6Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBsaXN0LCB0bXAsICZkdmVuYy0+dmVuY19tc2dfbGlzdF9mcmVlLCBsaXN0KSB7Ci0JCWxpc3RfZGVsKCZwbGlzdC0+bGlzdCk7Ci0JCWtmcmVlKHBsaXN0KTsKLQl9Ci1lcnJfdmVuY19jcmVhdGVfbXNnX2xpc3Q6Ci0Ja2ZyZWUoZHZlbmMpOwotCXZlbmNfcmVmLS07Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBxNnZlbmNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgdmVuY19tc2dfbGlzdCAqbCwgKm47Ci0Jc3RydWN0IHZlbmNfcG1lbV9saXN0ICpwbGlzdCwgKm07Ci0Jc3RydWN0IHZlbmNfZGV2ICpkdmVuYzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JdmVuY19yZWYtLTsKLQlkdmVuYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlkdmVuYy0+aXNfYWN0aXZlID0gMDsKLQl3YWtlX3VwX2FsbCgmZHZlbmMtPnZlbmNfbXNnX2V2dCk7Ci0JZGFsX2NhbGxfZjAoZHZlbmMtPnE2X2hhbmRsZSwgVkVOQ19EQUxSUENfU1RPUCwgMSk7Ci0JZGFsX2NhbGxfZjAoZHZlbmMtPnE2X2hhbmRsZSwgREFMX09QX0NMT1NFLCAxKTsKLQlkYWxfZGV0YWNoKGR2ZW5jLT5xNl9oYW5kbGUpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsLCBuLCAmZHZlbmMtPnZlbmNfbXNnX2xpc3RfZnJlZSwgbGlzdCkgewotCQlsaXN0X2RlbCgmbC0+bGlzdCk7Ci0JCWtmcmVlKGwpOwotCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgJmR2ZW5jLT52ZW5jX21zZ19saXN0X2hlYWQsIGxpc3QpIHsKLQkJbGlzdF9kZWwoJmwtPmxpc3QpOwotCQlrZnJlZShsKTsKLQl9Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmR2ZW5jLT52ZW5jX3BtZW1fbGlzdF9sb2NrLCBmbGFncyk7Ci0JaWYgKCFkdmVuYy0+cG1lbV9mcmVlZCkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBsaXN0LCAmZHZlbmMtPnZlbmNfcG1lbV9saXN0X2hlYWQsIGxpc3QpCi0JCQlwdXRfcG1lbV9maWxlKHBsaXN0LT5idWYuZmlsZSk7Ci0JCWR2ZW5jLT5wbWVtX2ZyZWVkID0gMTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHZlbmMtPnZlbmNfcG1lbV9saXN0X2xvY2ssIGZsYWdzKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwbGlzdCwgbSwgJmR2ZW5jLT52ZW5jX3BtZW1fbGlzdF9oZWFkLCBsaXN0KSB7Ci0JCWxpc3RfZGVsKCZwbGlzdC0+bGlzdCk7Ci0JCWtmcmVlKHBsaXN0KTsKLQl9Ci0Ja2ZyZWUoZHZlbmMpOwotCWFsbG93X3NsZWVwKCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBxNnZlbmNfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IHE2dmVuY19vcGVuLAotCS5yZWxlYXNlID0gcTZ2ZW5jX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsID0gcTZ2ZW5jX2lvY3RsLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgcTZ2ZW5jX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXBtX3Fvc19hZGRfcmVxdWVzdCgmcG1fcW9zX3JlcSwgUE1fUU9TX0NQVV9ETUFfTEFURU5DWSwKLQkJCQlQTV9RT1NfREVGQVVMVF9WQUxVRSk7Ci0Jd2FrZV9sb2NrX2luaXQoJndha2Vsb2NrLCBXQUtFX0xPQ0tfU1VTUEVORCwgInZlbmNfc3VzcGVuZCIpOwotCi0JdmVuY19kZXZpY2VfcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZW5jX2RldiksIEdGUF9LRVJORUwpOwotCWlmICghdmVuY19kZXZpY2VfcCkgewotCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB2ZW5jX2RldmljZV9wXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcmV0ID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmdmVuY19kZXZfbnVtLCAwLCAxLCBWRU5DX05BTUUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGFsbG9jX2NocmRldl9yZWdpb24gZmFpbGVkICglZClcbiIsIF9fZnVuY19fLAotCQkJcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JdmVuY19jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgVkVOQ19OQU1FKTsKLQlpZiAoSVNfRVJSKHZlbmNfY2xhc3MpKSB7Ci0JCXJldCA9IFBUUl9FUlIodmVuY19jbGFzcyk7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byBjcmVhdGUgdmVuY19jbGFzcyAoJWQpXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyX3ZlbmNfY2xhc3NfY3JlYXRlOwotCX0KLQl2ZW5jX2RldmljZV9wLT5jbGFzc19kZXZwID0KLQkgICAgZGV2aWNlX2NyZWF0ZSh2ZW5jX2NsYXNzLCBOVUxMLCB2ZW5jX2Rldl9udW0sIE5VTEwsCi0JCQkgIFZFTkNfTkFNRSk7Ci0JaWYgKElTX0VSUih2ZW5jX2RldmljZV9wLT5jbGFzc19kZXZwKSkgewotCQlyZXQgPSBQVFJfRVJSKHZlbmNfZGV2aWNlX3AtPmNsYXNzX2RldnApOwotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gY3JlYXRlIGNsYXNzX2RldmljZSAoJWQpXG4iLCBfX2Z1bmNfXywKLQkJCXJldCk7Ci0JCWdvdG8gZXJyX3ZlbmNfY2xhc3NfZGV2aWNlX2NyZWF0ZTsKLQl9Ci0JY2Rldl9pbml0KCZjZGV2LCAmcTZ2ZW5jX2ZvcHMpOwotCWNkZXYub3duZXIgPSBUSElTX01PRFVMRTsKLQlyZXQgPSBjZGV2X2FkZCgmY2RldiwgdmVuY19kZXZfbnVtLCAxKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBjZGV2X2FkZCBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyX3ZlbmNfY2Rldl9hZGQ7Ci0JfQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZlbmNfZGV2aWNlX3AtPnZlbmNfbXNnX2V2dCk7Ci0JcmV0dXJuIHJldDsKLQotZXJyX3ZlbmNfY2Rldl9hZGQ6Ci0JZGV2aWNlX2Rlc3Ryb3kodmVuY19jbGFzcywgdmVuY19kZXZfbnVtKTsKLWVycl92ZW5jX2NsYXNzX2RldmljZV9jcmVhdGU6Ci0JY2xhc3NfZGVzdHJveSh2ZW5jX2NsYXNzKTsKLWVycl92ZW5jX2NsYXNzX2NyZWF0ZToKLQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24odmVuY19kZXZfbnVtLCAxKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcTZ2ZW5jX2V4aXQodm9pZCkKLXsKLQljZGV2X2RlbCgmKGNkZXYpKTsKLQlkZXZpY2VfZGVzdHJveSh2ZW5jX2NsYXNzLCB2ZW5jX2Rldl9udW0pOwotCWNsYXNzX2Rlc3Ryb3kodmVuY19jbGFzcyk7Ci0JdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKHZlbmNfZGV2X251bSwgMSk7Ci19Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiVmlkZW8gZW5jb2RlciBkcml2ZXIgZm9yIFFEU1A2Iik7Ci1NT0RVTEVfVkVSU0lPTigiMi4wIik7Ci1tb2R1bGVfaW5pdChxNnZlbmNfaW5pdCk7Ci1tb2R1bGVfZXhpdChxNnZlbmNfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9wY21faW4uYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L3BjbV9pbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODhlMWRjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L3BjbV9pbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L3BjbV9pbi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA5IEhUQyBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLQotI2luY2x1ZGUgPG1hY2gvbXNtX3Fkc3A2X2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi1zdHJ1Y3QgcGNtIHsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYzsKLQl1aW50MzJfdCBzYW1wbGVfcmF0ZTsKLQl1aW50MzJfdCBjaGFubmVsX2NvdW50OwotCXVpbnQzMl90IGJ1ZmZlcl9zaXplOwotCXVpbnQzMl90IHJlY19tb2RlOwotfTsKLQotI2RlZmluZSBCVUZTWiAoMjU2KQotCi12b2lkIGF1ZGlvX2NsaWVudF9kdW1wKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKTsKLQotc3RhdGljIGxvbmcgcTZfaW5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBwY20gKnBjbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NFVF9WT0xVTUU6Ci0JCXByX2RlYnVnKCJbJXM6JXNdIFNFVF9WT0xVTUVcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fR0VUX1NUQVRTOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCXByX2RlYnVnKCJbJXM6JXNdIEdFVF9TVEFUU1xuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQqKSBhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJdWludDMyX3QgYWNkYl9pZDsKLQkJcHJfZGVidWcoIlslczolc10gQVVESU9fU1RBUlRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCXJjID0gMDsKLQotCQlpZiAoYXJnID09IDApIHsKLQkJCWFjZGJfaWQgPSAwOwotCQl9IGVsc2UgaWYgKGNvcHlfZnJvbV91c2VyKCZhY2RiX2lkLCAodm9pZCopIGFyZywgc2l6ZW9mKGFjZGJfaWQpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAocGNtLT5hYykgewotCQkJcHJfZXJyKCJbJXM6JXNdIGFjdGl2ZSBzZXNzaW9uIGFscmVhZHkgZXhpc3RpbmdcbiIsCi0JCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCXJjID0gLUVCVVNZOwotCQl9IGVsc2UgewotCQkJcGNtLT5hYyA9IHE2YXVkaW9fb3Blbl9wY20ocGNtLT5idWZmZXJfc2l6ZSwKLQkJCQkJcGNtLT5zYW1wbGVfcmF0ZSwgcGNtLT5jaGFubmVsX2NvdW50LAotCQkJCQlwY20tPnJlY19tb2RlLCBhY2RiX2lkKTsKLQkJCWlmICghcGNtLT5hYykgewotCQkJCXByX2VycigiWyVzOiVzXSBwY20gb3BlbiBzZXNzaW9uIGZhaWxlZFxuIiwKLQkJCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU1RPUDoKLQkJcHJfZGVidWcoIlslczolc10gQVVESU9fU1RPUFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19GTFVTSDoKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb25maWcsICh2b2lkKikgYXJnLCBzaXplb2YoY29uZmlnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXByX2RlYnVnKCJbJXM6JXNdIFNFVF9DT05GSUc6IHNhbXBsZXJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZFxuIiwKLQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXywgY29uZmlnLnNhbXBsZV9yYXRlLAotCQkJY29uZmlnLmNoYW5uZWxfY291bnQpOwotCQlpZiAoIWNvbmZpZy5jaGFubmVsX2NvdW50IHx8IGNvbmZpZy5jaGFubmVsX2NvdW50ID4gMikgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJcHJfZXJyKCJbJXM6JXNdIGludmFsaWQgY2hhbm5lbGNvdW50ICVkXG4iLAotCQkJX19NTV9GSUxFX18sIF9fZnVuY19fLCBjb25maWcuY2hhbm5lbF9jb3VudCk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29uZmlnLnNhbXBsZV9yYXRlIDwgODAwMCB8fCBjb25maWcuc2FtcGxlX3JhdGUgPiA0ODAwMCkgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJcHJfZXJyKCJbJXM6JXNdIGludmFsaWQgc2FtcGxlcmF0ZSAlZFxuIiwgX19NTV9GSUxFX18sCi0JCQkJX19mdW5jX18sIGNvbmZpZy5zYW1wbGVfcmF0ZSk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29uZmlnLmJ1ZmZlcl9zaXplIDwgMTI4IHx8IGNvbmZpZy5idWZmZXJfc2l6ZSA+IDgxOTIpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCXByX2VycigiWyVzOiVzXSBpbnZhbGlkIGJ1ZmZzaXplICVkXG4iLCBfX01NX0ZJTEVfXywKLQkJCQlfX2Z1bmNfXywgY29uZmlnLmJ1ZmZlcl9zaXplKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcGNtLT5zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLQkJcGNtLT5jaGFubmVsX2NvdW50ID0gY29uZmlnLmNoYW5uZWxfY291bnQ7Ci0JCXBjbS0+YnVmZmVyX3NpemUgPSBjb25maWcuYnVmZmVyX3NpemU7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9JTkNBTEw6IHsKLQkJc3RydWN0IG1zbV92b2ljZXJlY19tb2RlIHZvaWNlcmVjX21vZGU7Ci0JCXByX2RlYnVnKCJbJXM6JXNdIFNFVF9JTkNBTExcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdm9pY2VyZWNfbW9kZSwgKHZvaWQgKilhcmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV92b2ljZXJlY19tb2RlKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKHZvaWNlcmVjX21vZGUucmVjX21vZGUgIT0gQVVESU9fRkxBR19SRUFEICYmCi0JCQl2b2ljZXJlY19tb2RlLnJlY19tb2RlICE9IEFVRElPX0ZMQUdfSU5DQUxMX01JWEVEKSB7Ci0JCQlwY20tPnJlY19tb2RlID0gQVVESU9fRkxBR19SRUFEOwotCQkJcHJfZXJyKCJbJXM6JXNdIGludmFsaWQgcmVjX21vZGVcbiIsIF9fTU1fRklMRV9fLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCX0gZWxzZQotCQkJcGNtLT5yZWNfbW9kZSA9IHZvaWNlcmVjX21vZGUucmVjX21vZGU7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQltZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOwotCQljb25maWcuYnVmZmVyX3NpemUgPSBwY20tPmJ1ZmZlcl9zaXplOwotCQljb25maWcuYnVmZmVyX2NvdW50ID0gMjsKLQkJY29uZmlnLnNhbXBsZV9yYXRlID0gcGNtLT5zYW1wbGVfcmF0ZTsKLQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSBwY20tPmNoYW5uZWxfY291bnQ7Ci0JCWNvbmZpZy51bnVzZWRbMF0gPSAwOwotCQljb25maWcudW51c2VkWzFdID0gMDsKLQkJY29uZmlnLnVudXNlZFsyXSA9IDA7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQqKSBhcmcsICZjb25maWcsIHNpemVvZihjb25maWcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCXByX2RlYnVnKCJbJXM6JXNdIEdFVF9DT05GSUc6IHNhbXBsZXJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZFxuIiwKLQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXywgY29uZmlnLnNhbXBsZV9yYXRlLAotCQkJY29uZmlnLmNoYW5uZWxfY291bnQpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQlwcl9kZWJ1ZygiWyVzOiVzXSByYyA9ICVkXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcTZfaW5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgcGNtICpwY207Ci0KLQlwcl9pbmZvKCJbJXM6JXNdIG9wZW5cbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JcGNtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjbSksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFwY20pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcGNtLT5jaGFubmVsX2NvdW50ID0gMTsKLQlwY20tPnNhbXBsZV9yYXRlID0gODAwMDsKLQlwY20tPmJ1ZmZlcl9zaXplID0gQlVGU1o7Ci0JcGNtLT5yZWNfbW9kZSA9IEFVRElPX0ZMQUdfUkVBRDsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBwY207Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHE2X2luX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IHBjbSAqcGNtID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCXN0cnVjdCBhdWRpb19idWZmZXIgKmFiOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlpbnQgeGZlcjsKLQlpbnQgcmVzOwotCi0JcHJfZGVidWcoIlslczolc10gY291bnQgPSAlZFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBjb3VudCk7Ci0JYWMgPSBwY20tPmFjOwotCWlmICghYWMpIHsKLQkJcmVzID0gLUVOT0RFVjsKLQkJZ290byBmYWlsOwotCX0KLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCWFiID0gYWMtPmJ1ZiArIGFjLT5jcHVfYnVmOwotCi0JCWlmIChhYi0+dXNlZCkKLQkJCWlmICghd2FpdF9ldmVudF90aW1lb3V0KGFjLT53YWl0LCAoYWItPnVzZWQgPT0gMCksIDUqSFopKSB7Ci0JCQkJYXVkaW9fY2xpZW50X2R1bXAoYWMpOwotCQkJCXByX2VycigiWyVzOiVzXSB0aW1lb3V0LiBkc3AgZGVhZD9cbiIsCi0JCQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQkJCXE2YXVkaW9fZHNwX25vdF9yZXNwb25kaW5nKCk7Ci0JCQl9Ci0JCXByX2RlYnVnKCJbJXM6JXNdIGFiLT5kYXRhID0gJXAsIGNwdV9idWYgPSAlZCIsIF9fTU1fRklMRV9fLAotCQkJX19mdW5jX18sIGFiLT5kYXRhLCBhYy0+Y3B1X2J1Zik7Ci0JCXhmZXIgPSBjb3VudDsKLQkJaWYgKHhmZXIgPiBhYi0+c2l6ZSkKLQkJCXhmZXIgPSBhYi0+c2l6ZTsKLQotCQlpZiAoY29weV90b191c2VyKGJ1ZiwgYWItPmRhdGEsIHhmZXIpKSB7Ci0JCQlyZXMgPSAtRUZBVUxUOwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJYnVmICs9IHhmZXI7Ci0JCWNvdW50IC09IHhmZXI7Ci0KLQkJYWItPnVzZWQgPSAxOwotCQlxNmF1ZGlvX3JlYWQoYWMsIGFiKTsKLQkJYWMtPmNwdV9idWYgXj0gMTsKLQl9Ci1mYWlsOgotCXJlcyA9IGJ1ZiAtIHN0YXJ0OwotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgcTZfaW5fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQotCWludCByYyA9IDA7Ci0Jc3RydWN0IHBjbSAqcGNtID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWlmIChwY20tPmFjKQotCQlyYyA9IHE2YXVkaW9fY2xvc2UocGNtLT5hYyk7Ci0Ja2ZyZWUocGNtKTsKLQlwcl9pbmZvKCJbJXM6JXNdIHJlbGVhc2VcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBxNl9pbl9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBxNl9pbl9vcGVuLAotCS5yZWFkCQk9IHE2X2luX3JlYWQsCi0JLnJlbGVhc2UJPSBxNl9pbl9yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bAk9IHE2X2luX2lvY3RsLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgcTZfaW5fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX3BjbV9pbiIsCi0JLmZvcHMJPSAmcTZfaW5fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHE2X2luX2luaXQodm9pZCkgewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZxNl9pbl9taXNjKTsKLX0KLQotZGV2aWNlX2luaXRjYWxsKHE2X2luX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvcGNtX291dC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvcGNtX291dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTkxY2IyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L3BjbV9vdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9wY21fb3V0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuCi0gKiBBdXRob3I6IEJyaWFuIFN3ZXRsYW5kIDxzd2V0bGFuZEBnb29nbGUuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLQotI2luY2x1ZGUgPG1hY2gvbXNtX3Fkc3A2X2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi12b2lkIGF1ZGlvX2NsaWVudF9kdW1wKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKTsKLQotI2RlZmluZSBCVUZTWiAoMzA3MikKLQotc3RydWN0IHBjbSB7Ci0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0JdWludDMyX3Qgc2FtcGxlX3JhdGU7Ci0JdWludDMyX3QgY2hhbm5lbF9jb3VudDsKLQlzaXplX3QgYnVmZmVyX3NpemU7Ci19OwotCi1zdGF0aWMgbG9uZyBwY21faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBwY20gKnBjbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGNtZCA9PSBBVURJT19HRVRfU1RBVFMpIHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyBzdGF0czsKLQkJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQqKSBhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmcGNtLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU0VUX1ZPTFVNRTogewotCQlpbnQgdm9sOwotCQlpZiAoIXBjbS0+YWMpIHsKLQkJCXByX2VycigiJXM6IGNhbm5vdCBzZXQgdm9sdW1lIGJlZm9yZSBBVURJT19TVEFSVCFcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2b2wsICh2b2lkKikgYXJnLCBzaXplb2Yodm9sKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXByX2RlYnVnKCJbJXM6JXNdIFNFVF9WT0xVTUU6IHZvbCA9ICVkXG4iLCBfX01NX0ZJTEVfXywKLQkJCV9fZnVuY19fLCB2b2wpOwotCQlyYyA9IHE2YXVkaW9fc2V0X3N0cmVhbV92b2x1bWUocGNtLT5hYywgdm9sKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJdWludDMyX3QgYWNkYl9pZDsKLQkJcHJfZGVidWcoIlslczolc10gQVVESU9fU1RBUlRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCWlmIChhcmcgPT0gMCkgewotCQkJYWNkYl9pZCA9IDA7Ci0JCX0gZWxzZSBpZiAoY29weV9mcm9tX3VzZXIoJmFjZGJfaWQsICh2b2lkKikgYXJnLCBzaXplb2YoYWNkYl9pZCkpKSB7Ci0JCQlwcl9pbmZvKCJbJXM6JXNdIGNvcHkgYWNkYl9pZCBmcm9tIHVzZXIgZmFpbGVkXG4iLAotCQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHBjbS0+YWMpIHsKLQkJCXByX2VycigiWyVzOiVzXSBhY3RpdmUgc2Vzc2lvbiBhbHJlYWR5IGV4aXN0aW5nXG4iLAotCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJfSBlbHNlIHsKLQkJCXBjbS0+YWMgPSBxNmF1ZGlvX29wZW5fcGNtKHBjbS0+YnVmZmVyX3NpemUsCi0JCQkJCQlwY20tPnNhbXBsZV9yYXRlLAotCQkJCQkJcGNtLT5jaGFubmVsX2NvdW50LAotCQkJCQkJQVVESU9fRkxBR19XUklURSwgYWNkYl9pZCk7Ci0JCQlpZiAoIXBjbS0+YWMpIHsKLQkJCQlwcl9lcnIoIlslczolc10gcGNtIG9wZW4gc2Vzc2lvbiBmYWlsZWRcbiIsCi0JCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCQkJcmMgPSAtRU5PTUVNOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NUT1A6Ci0JCXByX2RlYnVnKCJbJXM6JXNdIEFVRElPX1NUT1BcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fRkxVU0g6Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjb25maWc7Ci0JCWlmIChwY20tPmFjKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCXByX2VycigiWyVzOiVzXSBhY3RpdmUgc2Vzc2lvbiBhbHJlYWR5IGV4aXN0aW5nXG4iLAotCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbmZpZywgKHZvaWQqKSBhcmcsIHNpemVvZihjb25maWcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJcHJfZGVidWcoIlslczolc10gU0VUX0NPTkZJRzogc2FtcGxlcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkXG4iLAotCQkJX19NTV9GSUxFX18sIF9fZnVuY19fLCBjb25maWcuc2FtcGxlX3JhdGUsCi0JCQljb25maWcuY2hhbm5lbF9jb3VudCk7Ci0JCWlmIChjb25maWcuY2hhbm5lbF9jb3VudCA8IDEgfHwgY29uZmlnLmNoYW5uZWxfY291bnQgPiAyKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlwcl9lcnIoIlslczolc10gaW52YWxpZCBjaGFubmVsY291bnQgJWRcbiIsCi0JCQlfX01NX0ZJTEVfXywgX19mdW5jX18sIGNvbmZpZy5jaGFubmVsX2NvdW50KTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjb25maWcuc2FtcGxlX3JhdGUgPCA4MDAwIHx8IGNvbmZpZy5zYW1wbGVfcmF0ZSA+IDQ4MDAwKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlwcl9lcnIoIlslczolc10gaW52YWxpZCBzYW1wbGVyYXRlICVkXG4iLCBfX01NX0ZJTEVfXywKLQkJCQlfX2Z1bmNfXywgY29uZmlnLnNhbXBsZV9yYXRlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjb25maWcuYnVmZmVyX3NpemUgPCAxMjggfHwgY29uZmlnLmJ1ZmZlcl9zaXplID4gODE5MikgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJcHJfZXJyKCJbJXM6JXNdIGludmFsaWQgYnVmZnNpemUgJWRcbiIsIF9fTU1fRklMRV9fLAotCQkJCV9fZnVuY19fLCBjb25maWcuYnVmZmVyX3NpemUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcGNtLT5zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLQkJcGNtLT5jaGFubmVsX2NvdW50ID0gY29uZmlnLmNoYW5uZWxfY291bnQ7Ci0JCXBjbS0+YnVmZmVyX3NpemUgPSBjb25maWcuYnVmZmVyX3NpemU7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwotCQljb25maWcuYnVmZmVyX3NpemUgPSBwY20tPmJ1ZmZlcl9zaXplOwotCQljb25maWcuYnVmZmVyX2NvdW50ID0gMjsKLQkJY29uZmlnLnNhbXBsZV9yYXRlID0gcGNtLT5zYW1wbGVfcmF0ZTsKLQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSBwY20tPmNoYW5uZWxfY291bnQ7Ci0JCWNvbmZpZy51bnVzZWRbMF0gPSAwOwotCQljb25maWcudW51c2VkWzFdID0gMDsKLQkJY29uZmlnLnVudXNlZFsyXSA9IDA7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQqKSBhcmcsICZjb25maWcsIHNpemVvZihjb25maWcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCXByX2RlYnVnKCJbJXM6JXNdIEdFVF9DT05GSUc6IHNhbXBsZXJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZFxuIiwKLQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXywgY29uZmlnLnNhbXBsZV9yYXRlLAotCQkJY29uZmlnLmNoYW5uZWxfY291bnQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfRVE6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19lcV9zdHJlYW1fY29uZmlnIGVxX2NvbmZpZzsKLQkJcHJfZGVidWcoIlslczolc10gU0VUX0VRXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmVxX2NvbmZpZywgKHZvaWQgKikgYXJnLAotCQkJCQkJc2l6ZW9mKGVxX2NvbmZpZykpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IHE2YXVkaW9fc2V0X3N0cmVhbV9lcV9wY20ocGNtLT5hYywgKHZvaWQgKikgJmVxX2NvbmZpZyk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCW11dGV4X3VubG9jaygmcGNtLT5sb2NrKTsKLQlwcl9kZWJ1ZygiWyVzOiVzXSByYyA9ICVkXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcGNtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHBjbSAqcGNtOwotCi0JcHJfaW5mbygiWyVzOiVzXSBvcGVuXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCXBjbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY20pLCBHRlBfS0VSTkVMKTsKLQotCWlmICghcGNtKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW11dGV4X2luaXQoJnBjbS0+bG9jayk7Ci0JcGNtLT5jaGFubmVsX2NvdW50ID0gMjsKLQlwY20tPnNhbXBsZV9yYXRlID0gNDQxMDA7Ci0JcGNtLT5idWZmZXJfc2l6ZSA9IEJVRlNaOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IHBjbTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgcGNtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgcGNtICpwY20gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0Jc3RydWN0IGF1ZGlvX2J1ZmZlciAqYWI7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCWludCB4ZmVyOwotCi0JcHJfZGVidWcoIlslczolc10gY291bnQgPSAlZFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBjb3VudCk7Ci0JaWYgKCFwY20tPmFjKQotCQlwY21faW9jdGwoZmlsZSwgQVVESU9fU1RBUlQsIDApOwotCi0JYWMgPSBwY20tPmFjOwotCWlmICghYWMpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlhYiA9IGFjLT5idWYgKyBhYy0+Y3B1X2J1ZjsKLQotCQlpZiAoYWItPnVzZWQpCi0JCQlpZiAoIXdhaXRfZXZlbnRfdGltZW91dChhYy0+d2FpdCwgKGFiLT51c2VkID09IDApLCA1KkhaKSkgewotCQkJCWF1ZGlvX2NsaWVudF9kdW1wKGFjKTsKLQkJCQlwcl9lcnIoIlslczolc10gdGltZW91dC4gZHNwIGRlYWQ/XG4iLAotCQkJCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCQlxNmF1ZGlvX2RzcF9ub3RfcmVzcG9uZGluZygpOwotCQkJfQotCQlwcl9kZWJ1ZygiWyVzOiVzXSBhYi0+ZGF0YSA9ICVwLCBjcHVfYnVmID0gJWQiLCBfX01NX0ZJTEVfXywKLQkJCV9fZnVuY19fLCBhYi0+ZGF0YSwgYWMtPmNwdV9idWYpOwotCQl4ZmVyID0gY291bnQ7Ci0JCWlmICh4ZmVyID4gYWItPnNpemUpCi0JCQl4ZmVyID0gYWItPnNpemU7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGFiLT5kYXRhLCBidWYsIHhmZXIpKSAKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWJ1ZiArPSB4ZmVyOwotCQljb3VudCAtPSB4ZmVyOwotCi0JCWFiLT51c2VkID0gMTsKLQkJYWItPmFjdHVhbF9zaXplID0geGZlcjsKLQkJcTZhdWRpb193cml0ZShhYywgYWIpOwotCQlhYy0+Y3B1X2J1ZiBePSAxOwotCX0KLQotCXJldHVybiBidWYgLSBzdGFydDsKLX0KLQotc3RhdGljIGludCBwY21fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgcGNtICpwY20gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaWYgKHBjbS0+YWMpCi0JCXE2YXVkaW9fY2xvc2UocGNtLT5hYyk7Ci0Ja2ZyZWUocGNtKTsKLQlwcl9pbmZvKCJbJXM6JXNdIHJlbGVhc2VcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBjbV9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBwY21fb3BlbiwKLQkud3JpdGUJCT0gcGNtX3dyaXRlLAotCS5yZWxlYXNlCT0gcGNtX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0gcGNtX2lvY3RsLAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgcGNtX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gIm1zbV9wY21fb3V0IiwKLQkuZm9wcwk9ICZwY21fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBjbV9pbml0KHZvaWQpIHsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmcGNtX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwocGNtX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvcTZhdWRpby5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvcTZhdWRpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDA0YzNkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L3E2YXVkaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDIxNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEF1dGhvcjogQnJpYW4gU3dldGxhbmQgPHN3ZXRsYW5kQGdvb2dsZS5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgotCi0jaW5jbHVkZSAiZGFsLmgiCi0jaW5jbHVkZSAiZGFsX2F1ZGlvLmgiCi0jaW5jbHVkZSAiZGFsX2F1ZGlvX2Zvcm1hdC5oIgotI2luY2x1ZGUgImRhbF9hY2RiLmgiCi0jaW5jbHVkZSAiZGFsX2FkaWUuaCIKLSNpbmNsdWRlIDxtYWNoL21zbV9xZHNwNl9hdWRpby5oPgotI2luY2x1ZGUgPG1hY2gvY3B1aWRsZS5oPgotCi0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2FhYy5oPgotCi0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotCi0jaW5jbHVkZSAicTZhdWRpb19kZXZpY2VzLmgiCi0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi0KLXN0cnVjdCBxNl9od19pbmZvIHsKLQlpbnQgbWluX2dhaW47Ci0JaW50IG1heF9nYWluOwotfTsKLQotLyogVE9ETzogcHJvdmlkZSBtZWNoYW5pc20gdG8gY29uZmlndXJlIGZyb20gYm9hcmQgZmlsZSAqLwotCi1zdGF0aWMgc3RydWN0IHE2X2h3X2luZm8gcTZfYXVkaW9faHdbUTZfSFdfQ09VTlRdID0gewotCVtRNl9IV19IQU5EU0VUXSA9IHsKLQkJLm1pbl9nYWluID0gLTQwMCwKLQkJLm1heF9nYWluID0gMTEwMCwKLQl9LAotCVtRNl9IV19IRUFEU0VUXSA9IHsKLQkJLm1pbl9nYWluID0gLTExMDAsCi0JCS5tYXhfZ2FpbiA9IDQwMCwKLQl9LAotCVtRNl9IV19TUEVBS0VSXSA9IHsKLQkJLm1pbl9nYWluID0gLTEwMDAsCi0JCS5tYXhfZ2FpbiA9IDUwMCwKLQl9LAotCVtRNl9IV19UVFldID0gewotCQkubWluX2dhaW4gPSAwLAotCQkubWF4X2dhaW4gPSAwLAotCX0sCi0JW1E2X0hXX0JUX1NDT10gPSB7Ci0JCS5taW5fZ2FpbiA9IC0xMTAwLAotCQkubWF4X2dhaW4gPSA0MDAsCi0JfSwKLQlbUTZfSFdfQlRfQTJEUF0gPSB7Ci0JCS5taW5fZ2FpbiA9IC0xMTAwLAotCQkubWF4X2dhaW4gPSA0MDAsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgd2FrZV9sb2NrIHdha2Vsb2NrOwotc3RhdGljIHN0cnVjdCBwbV9xb3NfcmVxdWVzdCBwbV9xb3NfcmVxOwotc3RhdGljIGludCBpZGxlY291bnQ7Ci1zdGF0aWMgREVGSU5FX01VVEVYKGlkbGVjb3VudF9sb2NrKTsKLQotdm9pZCBhdWRpb19wcmV2ZW50X3NsZWVwKHZvaWQpCi17Ci0JbXV0ZXhfbG9jaygmaWRsZWNvdW50X2xvY2spOwotCWlmICgrK2lkbGVjb3VudCA9PSAxKSB7Ci0JCXdha2VfbG9jaygmd2FrZWxvY2spOwotCQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJnBtX3Fvc19yZXEsCi0JCQkJICAgICAgbXNtX2NwdWlkbGVfZ2V0X2RlZXBfaWRsZV9sYXRlbmN5KCkpOwotCX0KLQltdXRleF91bmxvY2soJmlkbGVjb3VudF9sb2NrKTsKLX0KLQotdm9pZCBhdWRpb19hbGxvd19zbGVlcCh2b2lkKQotewotCW11dGV4X2xvY2soJmlkbGVjb3VudF9sb2NrKTsKLQlpZiAoLS1pZGxlY291bnQgPT0gMCkgewotCQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJnBtX3Fvc19yZXEsIFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQkJd2FrZV91bmxvY2soJndha2Vsb2NrKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZpZGxlY291bnRfbG9jayk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICppY29kZWNfcnhfY2xrOwotc3RhdGljIHN0cnVjdCBjbGsgKmljb2RlY190eF9jbGs7Ci1zdGF0aWMgc3RydWN0IGNsayAqZWNvZGVjX2NsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpzZGFjX2NsazsKLQotc3RhdGljIHN0cnVjdCBxNmF1ZGlvX2FuYWxvZ19vcHMgZGVmYXVsdF9hbmFsb2dfb3BzOwotc3RhdGljIHN0cnVjdCBxNmF1ZGlvX2FuYWxvZ19vcHMgKmFuYWxvZ19vcHMgPSAmZGVmYXVsdF9hbmFsb2dfb3BzOwotc3RhdGljIHVpbnQzMl90IHR4X2Nsa19mcmVxID0gODAwMDsKLXN0YXRpYyBpbnQgdHhfbXV0ZV9zdGF0dXMgPSAwOwotc3RhdGljIGludCByeF92b2xfbGV2ZWwgPSAxMDA7Ci1zdGF0aWMgdWludDMyX3QgdHhfYWNkYiA9IDA7Ci1zdGF0aWMgdWludDMyX3QgcnhfYWNkYiA9IDA7Ci0KLXZvaWQgcTZhdWRpb19yZWdpc3Rlcl9hbmFsb2dfb3BzKHN0cnVjdCBxNmF1ZGlvX2FuYWxvZ19vcHMgKm9wcykKLXsKLQlhbmFsb2dfb3BzID0gb3BzOwotfQotCi1zdGF0aWMgc3RydWN0IHE2X2RldmljZV9pbmZvICpxNl9sb29rdXBfZGV2aWNlKHVpbnQzMl90IGRldmljZV9pZCwKLQkJCQkJCXVpbnQzMl90IGFjZGJfaWQpCi17Ci0Jc3RydWN0IHE2X2RldmljZV9pbmZvICpkaSA9IHE2X2F1ZGlvX2RldmljZXM7Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXSBkZXZpY2VfaWQgPSAweCV4LCBhY2RiX2lkID0gJWRcbiIsIF9fTU1fRklMRV9fLAotCQlfX2Z1bmNfXywgZGV2aWNlX2lkLCBhY2RiX2lkKTsKLQlpZiAoYWNkYl9pZCkgewotCQlmb3IgKDs7KSB7Ci0JCQlpZiAoZGktPmNhZF9pZCA9PSBhY2RiX2lkICYmIGRpLT5pZCA9PSBkZXZpY2VfaWQpCi0JCQkJcmV0dXJuIGRpOwotCQkJaWYgKGRpLT5pZCA9PSAwKSB7Ci0JCQkJcHJfZXJyKCJbJXM6JXNdIGJvZ3VzIGlkIDB4JTA4eFxuIiwKLQkJCQkJX19NTV9GSUxFX18sIF9fZnVuY19fLCBkZXZpY2VfaWQpOwotCQkJCXJldHVybiBkaTsKLQkJCX0KLQkJCWRpKys7Ci0JCX0KLQl9IGVsc2UgewotCQlmb3IgKDs7KSB7Ci0JCQlpZiAoZGktPmlkID09IGRldmljZV9pZCkKLQkJCQlyZXR1cm4gZGk7Ci0JCQlpZiAoZGktPmlkID09IDApIHsKLQkJCQlwcl9lcnIoIlslczolc10gYm9ndXMgaWQgMHglMDh4XG4iLAotCQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18sIGRldmljZV9pZCk7Ci0JCQkJcmV0dXJuIGRpOwotCQkJfQotCQkJZGkrKzsKLQkJfQotCX0KLX0KLQotc3RhdGljIHVpbnQzMl90IHE2X2RldmljZV90b19jb2RlYyh1aW50MzJfdCBkZXZpY2VfaWQpCi17Ci0Jc3RydWN0IHE2X2RldmljZV9pbmZvICpkaSA9IHE2X2xvb2t1cF9kZXZpY2UoZGV2aWNlX2lkLCAwKTsKLQlyZXR1cm4gZGktPmNvZGVjOwotfQotCi1zdGF0aWMgdWludDMyX3QgcTZfZGV2aWNlX3RvX2Rpcih1aW50MzJfdCBkZXZpY2VfaWQpCi17Ci0Jc3RydWN0IHE2X2RldmljZV9pbmZvICpkaSA9IHE2X2xvb2t1cF9kZXZpY2UoZGV2aWNlX2lkLCAwKTsKLQlyZXR1cm4gZGktPmRpcjsKLX0KLQotc3RhdGljIHVpbnQzMl90IHE2X2RldmljZV90b19jYWRfaWQodWludDMyX3QgZGV2aWNlX2lkKQotewotCXN0cnVjdCBxNl9kZXZpY2VfaW5mbyAqZGkgPSBxNl9sb29rdXBfZGV2aWNlKGRldmljZV9pZCwgMCk7Ci0JcmV0dXJuIGRpLT5jYWRfaWQ7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBxNl9kZXZpY2VfdG9fcGF0aCh1aW50MzJfdCBkZXZpY2VfaWQsIHVpbnQzMl90IGFjZGJfaWQpCi17Ci0Jc3RydWN0IHE2X2RldmljZV9pbmZvICpkaSA9IHE2X2xvb2t1cF9kZXZpY2UoZGV2aWNlX2lkLCBhY2RiX2lkKTsKLQlyZXR1cm4gZGktPnBhdGg7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBxNl9kZXZpY2VfdG9fcmF0ZSh1aW50MzJfdCBkZXZpY2VfaWQpCi17Ci0Jc3RydWN0IHE2X2RldmljZV9pbmZvICpkaSA9IHE2X2xvb2t1cF9kZXZpY2UoZGV2aWNlX2lkLCAwKTsKLQlyZXR1cm4gZGktPnJhdGU7Ci19Ci0KLWludCBxNl9kZXZpY2Vfdm9sdW1lKHVpbnQzMl90IGRldmljZV9pZCwgaW50IGxldmVsKQotewotCXN0cnVjdCBxNl9kZXZpY2VfaW5mbyAqZGkgPSBxNl9sb29rdXBfZGV2aWNlKGRldmljZV9pZCwgMCk7Ci0Jc3RydWN0IHE2X2h3X2luZm8gKmh3OwotCi0JaHcgPSAmcTZfYXVkaW9faHdbZGktPmh3XTsKLQotCXJldHVybiBody0+bWluX2dhaW4gKyAoKGh3LT5tYXhfZ2FpbiAtIGh3LT5taW5fZ2FpbikgKiBsZXZlbCkgLyAxMDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGFkaWVfb3BlbihzdHJ1Y3QgZGFsX2NsaWVudCAqY2xpZW50KSAKLXsKLQlwcl9kZWJ1ZygiWyVzOiVzXVxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQlyZXR1cm4gZGFsX2NhbGxfZjAoY2xpZW50LCBEQUxfT1BfT1BFTiwgMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGFkaWVfY2xvc2Uoc3RydWN0IGRhbF9jbGllbnQgKmNsaWVudCkgCi17Ci0JcHJfZGVidWcoIlslczolc11cbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIGRhbF9jYWxsX2YwKGNsaWVudCwgREFMX09QX0NMT1NFLCAwKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYWRpZV9zZXRfcGF0aChzdHJ1Y3QgZGFsX2NsaWVudCAqY2xpZW50LAotCQkJCXVpbnQzMl90IGlkLCB1aW50MzJfdCBwYXRoX3R5cGUpCi17Ci0JcHJfZGVidWcoIlslczolc10gaWQgPSAweCV4LCBwYXRoX3R5cGUgPSAlZFxuIiwgX19NTV9GSUxFX18sCi0JCV9fZnVuY19fLCBpZCwgcGF0aF90eXBlKTsKLQlyZXR1cm4gZGFsX2NhbGxfZjEoY2xpZW50LCBBRElFX09QX1NFVF9QQVRILCBpZCwgcGF0aF90eXBlKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYWRpZV9zZXRfcGF0aF9mcmVxX3BsYW4oc3RydWN0IGRhbF9jbGllbnQgKmNsaWVudCwKLQkJCQkJICB1aW50MzJfdCBwYXRoX3R5cGUsIHVpbnQzMl90IHBsYW4pIAotewotCXByX2RlYnVnKCJbJXM6JXNdIHBhdGhfdHlwZSA9ICVkLCBwbGFuID0gJWRcbiIsCV9fTU1fRklMRV9fLAotCQlfX2Z1bmNfXywgcGF0aF90eXBlLCBwbGFuKTsKLQlyZXR1cm4gZGFsX2NhbGxfZjEoY2xpZW50LCBBRElFX09QX1NFVF9QQVRIX0ZSRVFVRU5DWV9QTEFOLAotCQkJICAgcGF0aF90eXBlLCBwbGFuKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYWRpZV9wcm9jZWVkX3RvX3N0YWdlKHN0cnVjdCBkYWxfY2xpZW50ICpjbGllbnQsCi0JCQkJCXVpbnQzMl90IHBhdGhfdHlwZSwgdWludDMyX3Qgc3RhZ2UpCi17Ci0JcHJfZGVidWcoIlslczolc10gcGF0aF90eXBlID0gJWQsIHN0YWdlID0gMHgleFxuIiwgX19NTV9GSUxFX18sCi0JCV9fZnVuY19fLCBwYXRoX3R5cGUsIHN0YWdlKTsKLQlyZXR1cm4gZGFsX2NhbGxfZjEoY2xpZW50LCBBRElFX09QX1BST0NFRURfVE9fU1RBR0UsCi0JCQkgICBwYXRoX3R5cGUsIHN0YWdlKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYWRpZV9tdXRlX3BhdGgoc3RydWN0IGRhbF9jbGllbnQgKmNsaWVudCwKLQkJCQkgdWludDMyX3QgcGF0aF90eXBlLCB1aW50MzJfdCBtdXRlX3N0YXRlKQotewotCXByX2RlYnVnKCJbJXM6JXNdIHBhdGhfdHlwZSA9ICVkLCBtdXRlID0gJWRcbiIsCV9fTU1fRklMRV9fLCBfX2Z1bmNfXywKLQkJIHBhdGhfdHlwZSwgbXV0ZV9zdGF0ZSk7Ci0JcmV0dXJuIGRhbF9jYWxsX2YxKGNsaWVudCwgQURJRV9PUF9NVVRFX1BBVEgsIHBhdGhfdHlwZSwgbXV0ZV9zdGF0ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWRpZV9yZWZjb3VudDsKLQotc3RhdGljIHN0cnVjdCBkYWxfY2xpZW50ICphZGllOwotc3RhdGljIHN0cnVjdCBkYWxfY2xpZW50ICphZHNwOwotc3RhdGljIHN0cnVjdCBkYWxfY2xpZW50ICphY2RiOwotCi1zdGF0aWMgaW50IGFkaWVfZW5hYmxlKHZvaWQpCi17Ci0JYWRpZV9yZWZjb3VudCsrOwotCWlmIChhZGllX3JlZmNvdW50ID09IDEpCi0JCWFkaWVfb3BlbihhZGllKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZGllX2Rpc2FibGUodm9pZCkKLXsKLQlhZGllX3JlZmNvdW50LS07Ci0JaWYgKGFkaWVfcmVmY291bnQgPT0gMCkKLQkJYWRpZV9jbG9zZShhZGllKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogNGsgUE1FTSB1c2VkIGZvciBleGNoYW5naW5nIGFjZGIgZGV2aWNlIGNvbmZpZyB0YWJsZXMKLSAqIGFuZCBzdHJlYW0gZm9ybWF0IGRlc2NyaXB0aW9ucyB3aXRoIHRoZSBEU1AuCi0gKi8KLXN0YXRpYyBjaGFyICphdWRpb19kYXRhOwotc3RhdGljIGludDMyX3QgYXVkaW9fcGh5czsKLQotI2RlZmluZSBTRVNTSU9OX01JTiAwCi0jZGVmaW5lIFNFU1NJT05fTUFYIDY0Ci0KLXN0YXRpYyBERUZJTkVfTVVURVgoc2Vzc2lvbl9sb2NrKTsKLXN0YXRpYyBERUZJTkVfTVVURVgoYXVkaW9fbG9jayk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXVkaW9fY2xpZW50ICpzZXNzaW9uW1NFU1NJT05fTUFYXTsKLQotc3RhdGljIGludCBzZXNzaW9uX2FsbG9jKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCWludCBuOwotCi0JbXV0ZXhfbG9jaygmc2Vzc2lvbl9sb2NrKTsKLQlmb3IgKG4gPSBTRVNTSU9OX01JTjsgbiA8IFNFU1NJT05fTUFYOyBuKyspIHsKLQkJaWYgKCFzZXNzaW9uW25dKSB7Ci0JCQlzZXNzaW9uW25dID0gYWM7Ci0JCQltdXRleF91bmxvY2soJnNlc3Npb25fbG9jayk7Ci0JCQlwcl9kZWJ1ZygiWyVzOiVzXSBzZXNzaW9uID0gJWRcbiIsIF9fTU1fRklMRV9fLAotCQkJCV9fZnVuY19fLCBuKTsKLQkJCXJldHVybiBuOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmc2Vzc2lvbl9sb2NrKTsKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIHZvaWQgc2Vzc2lvbl9mcmVlKGludCBuLCBzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYykKLXsKLQltdXRleF9sb2NrKCZzZXNzaW9uX2xvY2spOwotCWlmIChzZXNzaW9uW25dID09IGFjKSB7Ci0JCXNlc3Npb25bbl0gPSAwOwotCQlwcl9kZWJ1ZygiWyVzOiVzXSBzZXNzaW9uID0gJWRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywgbik7Ci0JfQotCW11dGV4X3VubG9jaygmc2Vzc2lvbl9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fY2xpZW50X2ZyZWUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCi17Ci0JcHJfZGVidWcoIlslczolc10gYWMgPSAlcFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBhYyk7Ci0Jc2Vzc2lvbl9mcmVlKGFjLT5zZXNzaW9uLCBhYyk7Ci0KLQlpZiAoYWMtPmJ1ZlswXS5kYXRhKSB7Ci0JCWlvdW5tYXAoYWMtPmJ1ZlswXS5kYXRhKTsKLQkJcG1lbV9rZnJlZShhYy0+YnVmWzBdLnBoeXMpOwotCX0KLQlpZiAoYWMtPmJ1ZlsxXS5kYXRhKSB7Ci0JCWlvdW5tYXAoYWMtPmJ1ZlsxXS5kYXRhKTsKLQkJcG1lbV9rZnJlZShhYy0+YnVmWzFdLnBoeXMpOwotCX0KLQlrZnJlZShhYyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYXVkaW9fY2xpZW50ICphdWRpb19jbGllbnRfYWxsb2ModW5zaWduZWQgYnVmc3opCi17Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0JaW50IG47Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXSBidWZzeiA9ICVkXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIGJ1ZnN6KTsKLQlhYyA9IGt6YWxsb2Moc2l6ZW9mKCphYyksIEdGUF9LRVJORUwpOwotCWlmICghYWMpCi0JCXJldHVybiAwOwotCi0JbiA9IHNlc3Npb25fYWxsb2MoYWMpOwotCWlmIChuIDwgMCkKLQkJZ290byBmYWlsX3Nlc3Npb247Ci0JYWMtPnNlc3Npb24gPSBuOwotCi0JaWYgKGJ1ZnN6ID4gMCkgewotCQlhYy0+YnVmWzBdLnBoeXMgPSBwbWVtX2thbGxvYyhidWZzeiwKLQkJCQkJUE1FTV9NRU1UWVBFX0VCSTF8UE1FTV9BTElHTk1FTlRfNEspOwotCQlhYy0+YnVmWzBdLmRhdGEgPSBpb3JlbWFwKGFjLT5idWZbMF0ucGh5cywgYnVmc3opOwotCQlpZiAoIWFjLT5idWZbMF0uZGF0YSkKLQkJCWdvdG8gZmFpbDsKLQkJYWMtPmJ1ZlsxXS5waHlzID0gcG1lbV9rYWxsb2MoYnVmc3osCi0JCQkJCVBNRU1fTUVNVFlQRV9FQkkxfFBNRU1fQUxJR05NRU5UXzRLKTsKLQkJYWMtPmJ1ZlsxXS5kYXRhID0gaW9yZW1hcChhYy0+YnVmWzFdLnBoeXMsIGJ1ZnN6KTsKLQkJaWYgKCFhYy0+YnVmWzFdLmRhdGEpCi0JCQlnb3RvIGZhaWw7Ci0KLQkJYWMtPmJ1ZlswXS5zaXplID0gYnVmc3o7Ci0JCWFjLT5idWZbMV0uc2l6ZSA9IGJ1ZnN6OwotCX0KLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFjLT53YWl0KTsKLQlhYy0+Y2xpZW50ID0gYWRzcDsKLQotCXJldHVybiBhYzsKLQotZmFpbDoKLQlzZXNzaW9uX2ZyZWUobiwgYWMpOwotZmFpbF9zZXNzaW9uOgotCWF1ZGlvX2NsaWVudF9mcmVlKGFjKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBhdWRpb19jbGllbnRfZHVtcChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYykKLXsKLQlkYWxfdHJhY2VfZHVtcChhYy0+Y2xpZW50KTsKLX0KLQotc3RhdGljIGludCBhdWRpb19pb2N0bChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdm9pZCAqcHRyLCB1aW50MzJfdCBsZW4pCi17Ci0Jc3RydWN0IGFkc3BfY29tbWFuZF9oZHIgKmhkciA9IHB0cjsKLQl1aW50MzJfdCB0bXA7Ci0JaW50IHI7Ci0KLQloZHItPnNpemUgPSBsZW4gLSBzaXplb2YodTMyKTsKLQloZHItPmRzdCA9IEFVRElPX0FERFIoYWMtPnNlc3Npb24sIDAsIEFVRElPX0RPTUFJTl9EU1ApOwotCWhkci0+c3JjID0gQVVESU9fQUREUihhYy0+c2Vzc2lvbiwgMCwgQVVESU9fRE9NQUlOX0FQUCk7Ci0JaGRyLT5jb250ZXh0ID0gYWMtPnNlc3Npb247Ci0JYWMtPmNiX3N0YXR1cyA9IC1FQlVTWTsKLQlyID0gZGFsX2NhbGwoYWMtPmNsaWVudCwgQVVESU9fT1BfQ09OVFJPTCwgNSwgcHRyLCBsZW4sICZ0bXAsIHNpemVvZih0bXApKTsKLQlpZiAociAhPSA0KQotCQlyZXR1cm4gLUVJTzsKLQlpZiAoIXdhaXRfZXZlbnRfdGltZW91dChhYy0+d2FpdCwgKGFjLT5jYl9zdGF0dXMgIT0gLUVCVVNZKSwgNSpIWikpIHsKLQkJZGFsX3RyYWNlX2R1bXAoYWMtPmNsaWVudCk7Ci0JCXByX2VycigiWyVzOiVzXSB0aW1lb3V0LiBkc3AgZGVhZD9cbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCXE2YXVkaW9fZHNwX25vdF9yZXNwb25kaW5nKCk7Ci0JfQotCXJldHVybiBhYy0+Y2Jfc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2NvbW1hbmQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGNtZCkKLXsKLQlzdHJ1Y3QgYWRzcF9jb21tYW5kX2hkciBycGM7Ci0JbWVtc2V0KCZycGMsIDAsIHNpemVvZihycGMpKTsKLQlycGMub3Bjb2RlID0gY21kOwotCXJldHVybiBhdWRpb19pb2N0bChhYywgJnJwYywgc2l6ZW9mKHJwYykpOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX29wZW5fY29udHJvbChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYykKLXsKLQlzdHJ1Y3QgYWRzcF9vcGVuX2NvbW1hbmQgcnBjOwotCi0JcHJfZGVidWcoIlslczolc10gYWMgPSAlcFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBhYyk7Ci0JbWVtc2V0KCZycGMsIDAsIHNpemVvZihycGMpKTsKLQlycGMuaGRyLm9wY29kZSA9IEFEU1BfQVVESU9fSU9DVExfQ01EX09QRU5fREVWSUNFOwotCXJldHVybiBhdWRpb19pb2N0bChhYywgJnJwYywgc2l6ZW9mKHJwYykpOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX291dF9vcGVuKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBidWZzeiwKLQkJCSAgdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMpCi17Ci0Jc3RydWN0IGFkc3Bfb3Blbl9jb21tYW5kIHJwYzsKLQotCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0KLQlycGMuZm9ybWF0LnN0YW5kYXJkLmZvcm1hdCA9IEFEU1BfQVVESU9fRk9STUFUX1BDTTsKLQlycGMuZm9ybWF0LnN0YW5kYXJkLmNoYW5uZWxzID0gY2hhbm5lbHM7Ci0JcnBjLmZvcm1hdC5zdGFuZGFyZC5iaXRzX3Blcl9zYW1wbGUgPSAxNjsKLQlycGMuZm9ybWF0LnN0YW5kYXJkLnNhbXBsaW5nX3JhdGUgPSByYXRlOwotCXJwYy5mb3JtYXQuc3RhbmRhcmQuaXNfc2lnbmVkID0gMTsKLQlycGMuZm9ybWF0LnN0YW5kYXJkLmlzX2ludGVybGVhdmVkID0gMTsKLQotCXJwYy5oZHIub3Bjb2RlID0gQURTUF9BVURJT19JT0NUTF9DTURfT1BFTl9XUklURTsKLQlycGMuZGV2aWNlID0gQURTUF9BVURJT19ERVZJQ0VfSURfREVGQVVMVDsKLQlycGMuc3RyZWFtX2NvbnRleHQgPSBBRFNQX0FVRElPX0RFVklDRV9DT05URVhUX1BMQVlCQUNLOwotCXJwYy5idWZfbWF4X3NpemUgPSBidWZzejsKLQotCXByX2RlYnVnKCJbJXM6JXNdYWMgPSAlcFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBhYyk7Ci0JcmV0dXJuIGF1ZGlvX2lvY3RsKGFjLCAmcnBjLCBzaXplb2YocnBjKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9faW5fb3BlbihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgYnVmc3osCi0JCQkgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzKQotewotCXN0cnVjdCBhZHNwX29wZW5fY29tbWFuZCBycGM7Ci0KLQltZW1zZXQoJnJwYywgMCwgc2l6ZW9mKHJwYykpOwotCi0JcnBjLmZvcm1hdC5zdGFuZGFyZC5mb3JtYXQgPSBBRFNQX0FVRElPX0ZPUk1BVF9QQ007Ci0JcnBjLmZvcm1hdC5zdGFuZGFyZC5jaGFubmVscyA9IGNoYW5uZWxzOwotCXJwYy5mb3JtYXQuc3RhbmRhcmQuYml0c19wZXJfc2FtcGxlID0gMTY7Ci0JcnBjLmZvcm1hdC5zdGFuZGFyZC5zYW1wbGluZ19yYXRlID0gcmF0ZTsKLQlycGMuZm9ybWF0LnN0YW5kYXJkLmlzX3NpZ25lZCA9IDE7Ci0JcnBjLmZvcm1hdC5zdGFuZGFyZC5pc19pbnRlcmxlYXZlZCA9IDE7Ci0KLQlycGMuaGRyLm9wY29kZSA9IEFEU1BfQVVESU9fSU9DVExfQ01EX09QRU5fUkVBRDsKLQlycGMuZGV2aWNlID0gQURTUF9BVURJT19ERVZJQ0VfSURfREVGQVVMVDsKLQlpZiAoZmxhZ3MgPT0gQVVESU9fRkxBR19SRUFEKQotCQlycGMuc3RyZWFtX2NvbnRleHQgPSBBRFNQX0FVRElPX0RFVklDRV9DT05URVhUX1JFQ09SRDsKLQllbHNlCi0JCXJwYy5zdHJlYW1fY29udGV4dCA9IEFEU1BfQVVESU9fREVWSUNFX0NPTlRFWFRfTUlYRURfUkVDT1JEOwotCi0JcnBjLmJ1Zl9tYXhfc2l6ZSA9IGJ1ZnN6OwotCi0JcHJfZGVidWcoIlslczolc10gYWMgPSAlcFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBhYyk7Ci0JcmV0dXJuIGF1ZGlvX2lvY3RsKGFjLCAmcnBjLCBzaXplb2YocnBjKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fYXV4cGNtX291dF9vcGVuKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscykKLXsKLQlzdHJ1Y3QgYWRzcF9vcGVuX2NvbW1hbmQgcnBjOwotCi0JbWVtc2V0KCZycGMsIDAsIHNpemVvZihycGMpKTsKLQotCXJwYy5mb3JtYXQuc3RhbmRhcmQuZm9ybWF0ID0gQURTUF9BVURJT19GT1JNQVRfUENNOwotCXJwYy5mb3JtYXQuc3RhbmRhcmQuY2hhbm5lbHMgPSBjaGFubmVsczsKLQlycGMuZm9ybWF0LnN0YW5kYXJkLmJpdHNfcGVyX3NhbXBsZSA9IDE2OwotCXJwYy5mb3JtYXQuc3RhbmRhcmQuc2FtcGxpbmdfcmF0ZSA9IHJhdGU7Ci0JcnBjLmZvcm1hdC5zdGFuZGFyZC5pc19zaWduZWQgPSAxOwotCXJwYy5mb3JtYXQuc3RhbmRhcmQuaXNfaW50ZXJsZWF2ZWQgPSAxOwotCi0JcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9PUEVOX1JFQUQ7Ci0JcnBjLmRldmljZSA9IEFEU1BfQVVESU9fREVWSUNFX0lEX0RFRkFVTFQ7Ci0JcnBjLm1vZGUgPSAgQURTUF9BVURJT19PUEVOX1NUUkVBTV9NT0RFX0FVWF9QQ007Ci0JcnBjLnN0cmVhbV9jb250ZXh0ID0gQURTUF9BVURJT19ERVZJQ0VfQ09OVEVYVF9SRUNPUkQ7Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXSBhYyA9ICVwXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIGFjKTsKLQlyZXR1cm4gYXVkaW9faW9jdGwoYWMsICZycGMsIHNpemVvZihycGMpKTsKLX0KLQotc3RhdGljIGludCBhdWRpb19hdXhwY21faW5fb3BlbihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgcmF0ZSwKLQkJdWludDMyX3QgY2hhbm5lbHMpCi17Ci0Jc3RydWN0IGFkc3Bfb3Blbl9jb21tYW5kIHJwYzsKLQotCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0KLQlycGMuZm9ybWF0LnN0YW5kYXJkLmZvcm1hdCA9IEFEU1BfQVVESU9fRk9STUFUX1BDTTsKLQlycGMuZm9ybWF0LnN0YW5kYXJkLmNoYW5uZWxzID0gY2hhbm5lbHM7Ci0JcnBjLmZvcm1hdC5zdGFuZGFyZC5iaXRzX3Blcl9zYW1wbGUgPSAxNjsKLQlycGMuZm9ybWF0LnN0YW5kYXJkLnNhbXBsaW5nX3JhdGUgPSByYXRlOwotCXJwYy5mb3JtYXQuc3RhbmRhcmQuaXNfc2lnbmVkID0gMTsKLQlycGMuZm9ybWF0LnN0YW5kYXJkLmlzX2ludGVybGVhdmVkID0gMTsKLQotCXJwYy5oZHIub3Bjb2RlID0gQURTUF9BVURJT19JT0NUTF9DTURfT1BFTl9XUklURTsKLQlycGMuZGV2aWNlID0gQURTUF9BVURJT19ERVZJQ0VfSURfREVGQVVMVDsKLQlycGMubW9kZSA9ICBBRFNQX0FVRElPX09QRU5fU1RSRUFNX01PREVfQVVYX1BDTTsKLQlycGMuc3RyZWFtX2NvbnRleHQgPSBBRFNQX0FVRElPX0RFVklDRV9DT05URVhUX1BMQVlCQUNLOwotCi0JcHJfZGVidWcoIlslczolc10gYWMgPSAlcFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBhYyk7Ci0JcmV0dXJuIGF1ZGlvX2lvY3RsKGFjLCAmcnBjLCBzaXplb2YocnBjKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fbXAzX29wZW4oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGJ1ZnN6LAotCQkJICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscykKLXsKLQlzdHJ1Y3QgYWRzcF9vcGVuX2NvbW1hbmQgcnBjOwotCi0JbWVtc2V0KCZycGMsIDAsIHNpemVvZihycGMpKTsKLQotCXJwYy5mb3JtYXQuc3RhbmRhcmQuZm9ybWF0ID0gQURTUF9BVURJT19GT1JNQVRfTVAzOwotCXJwYy5mb3JtYXQuc3RhbmRhcmQuY2hhbm5lbHMgPSBjaGFubmVsczsKLQlycGMuZm9ybWF0LnN0YW5kYXJkLmJpdHNfcGVyX3NhbXBsZSA9IDE2OwotCXJwYy5mb3JtYXQuc3RhbmRhcmQuc2FtcGxpbmdfcmF0ZSA9IHJhdGU7Ci0JcnBjLmZvcm1hdC5zdGFuZGFyZC5pc19zaWduZWQgPSAxOwotCXJwYy5mb3JtYXQuc3RhbmRhcmQuaXNfaW50ZXJsZWF2ZWQgPSAwOwotCi0JcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9PUEVOX1dSSVRFOwotCXJwYy5kZXZpY2UgPSBBRFNQX0FVRElPX0RFVklDRV9JRF9ERUZBVUxUOwotCXJwYy5zdHJlYW1fY29udGV4dCA9IEFEU1BfQVVESU9fREVWSUNFX0NPTlRFWFRfUExBWUJBQ0s7Ci0JcnBjLmJ1Zl9tYXhfc2l6ZSA9IGJ1ZnN6OwotCi0JcHJfZGVidWcoIlslczolc10gYWMgPSAlcFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBhYyk7Ci0JcmV0dXJuIGF1ZGlvX2lvY3RsKGFjLCAmcnBjLCBzaXplb2YocnBjKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZHRtZl9vcGVuKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscykKLXsKLQlzdHJ1Y3QgYWRzcF9vcGVuX2NvbW1hbmQgcnBjOwotCi0JbWVtc2V0KCZycGMsIDAsIHNpemVvZihycGMpKTsKLQotCXJwYy5mb3JtYXQuc3RhbmRhcmQuZm9ybWF0ID0gQURTUF9BVURJT19GT1JNQVRfRFRNRjsKLQlycGMuZm9ybWF0LnN0YW5kYXJkLmNoYW5uZWxzID0gY2hhbm5lbHM7Ci0JcnBjLmZvcm1hdC5zdGFuZGFyZC5iaXRzX3Blcl9zYW1wbGUgPSAxNjsKLQlycGMuZm9ybWF0LnN0YW5kYXJkLnNhbXBsaW5nX3JhdGUgPSByYXRlOwotCXJwYy5mb3JtYXQuc3RhbmRhcmQuaXNfc2lnbmVkID0gMTsKLQlycGMuZm9ybWF0LnN0YW5kYXJkLmlzX2ludGVybGVhdmVkID0gMDsKLQotCXJwYy5oZHIub3Bjb2RlID0gQURTUF9BVURJT19JT0NUTF9DTURfT1BFTl9XUklURTsKLQlycGMuZGV2aWNlID0gQURTUF9BVURJT19ERVZJQ0VfSURfREVGQVVMVDsKLQlycGMuc3RyZWFtX2NvbnRleHQgPSBBRFNQX0FVRElPX0RFVklDRV9DT05URVhUX1BMQVlCQUNLOwotCi0JcHJfZGVidWcoIlslczolc10gYWMgPSAlcFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBhYyk7Ci0JcmV0dXJuIGF1ZGlvX2lvY3RsKGFjLCAmcnBjLCBzaXplb2YocnBjKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fYWFjX29wZW4oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGJ1ZnN6LAotCQkJICB1aW50MzJfdCBzYW1wbGVfcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCi0JCQkgIHVpbnQzMl90IGJpdF9yYXRlLCB1aW50MzJfdCBmbGFncywKLQkJCQkJdWludDMyX3Qgc3RyZWFtX2Zvcm1hdCkKLXsKLQlzdHJ1Y3QgYWRzcF9vcGVuX2NvbW1hbmQgcnBjOwotCWludCBhdWRpb19vYmplY3RfdHlwZTsKLQlpbnQgaW5kZXggPSBzaXplb2YodTMyKTsKLQl1MzIgKmFhY190eXBlID0gTlVMTDsKLQotCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0KLQlycGMuZm9ybWF0LmJpbmFyeS5mb3JtYXQgPSBBRFNQX0FVRElPX0ZPUk1BVF9NUEVHNF9BQUM7Ci0JLyogb25seSA0OGsgc2FtcGxlIHJhdGUgaXMgc3VwcG9ydGVkICovCi0Jc2FtcGxlX3JhdGUgPSAzOwotCS8qIEFBQyBPQkpFQ1QgTEMgKi8KLQlhdWRpb19vYmplY3RfdHlwZSA9IDI7Ci0KLQlhYWNfdHlwZSA9ICh1MzIgKilycGMuZm9ybWF0LmJpbmFyeS5kYXRhOwotCXN3aXRjaCAoc3RyZWFtX2Zvcm1hdCkgewotCWNhc2UgQVVESU9fQUFDX0ZPUk1BVF9BRFRTOgotCQkvKiBBQUMgRW5jb2RlciBleHBlY3QgTVBFRzRfQURUUyBtZWRpYSB0eXBlICovCi0JCSphYWNfdHlwZSA9IEFEU1BfQVVESU9fQUFDX01QRUc0X0FEVFM7Ci0JYnJlYWs7Ci0JY2FzZSBBVURJT19BQUNfRk9STUFUX1JBVzoKLQkJLyogZm9yIEFESUYgcmVjb3JkaW5nICovCi0JCSphYWNfdHlwZSA9IEFEU1BfQVVESU9fQUFDX1JBVzsKLQlicmVhazsKLQl9Ci0KLQlycGMuZm9ybWF0LmJpbmFyeS5kYXRhW2luZGV4KytdID0gKHU4KSgKLQkJCSgoYXVkaW9fb2JqZWN0X3R5cGUgJiAweDFGKSA8PCAzKSB8Ci0JCQkoKHNhbXBsZV9yYXRlID4+IDEpICYgMHg3KSk7Ci0JCQlycGMuZm9ybWF0LmJpbmFyeS5kYXRhW2luZGV4XSA9ICh1OCkoCi0JCQkoKHNhbXBsZV9yYXRlICYgMHgxKSA8PCA3KSB8Ci0JCQkoKGNoYW5uZWxzICYgMHg3KSA8PCAzKSk7Ci0JcnBjLmZvcm1hdC5iaW5hcnkubnVtX2J5dGVzID0gaW5kZXggKyAxOwotCXJwYy5oZHIub3Bjb2RlID0gQURTUF9BVURJT19JT0NUTF9DTURfT1BFTl9SRUFEOwotCXJwYy5kZXZpY2UgPSBBRFNQX0FVRElPX0RFVklDRV9JRF9ERUZBVUxUOwotCi0JaWYgKGZsYWdzID09IEFVRElPX0ZMQUdfUkVBRCkKLQkJcnBjLnN0cmVhbV9jb250ZXh0ID0gQURTUF9BVURJT19ERVZJQ0VfQ09OVEVYVF9SRUNPUkQ7Ci0JZWxzZQotCQlycGMuc3RyZWFtX2NvbnRleHQgPSBBRFNQX0FVRElPX0RFVklDRV9DT05URVhUX01JWEVEX1JFQ09SRDsKLQotCXJwYy5idWZfbWF4X3NpemUgPSBidWZzejsKLQlycGMuY29uZmlnLmFhYy5iaXRfcmF0ZSA9IGJpdF9yYXRlOwotCXJwYy5jb25maWcuYWFjLmVuY29kZXJfbW9kZSA9IEFEU1BfQVVESU9fRU5DX0FBQ19MQ19PTkxZX01PREU7Ci0JcHJfZGVidWcoIlslczolc10gYWMgPSAlcFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBhYyk7Ci0JcmV0dXJuIGF1ZGlvX2lvY3RsKGFjLCAmcnBjLCBzaXplb2YocnBjKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fcWNwX29wZW4oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGJ1ZnN6LAotCQkJCXVpbnQzMl90IG1pbl9yYXRlLCB1aW50MzJfdCBtYXhfcmF0ZSwKLQkJCQl1aW50MzJfdCBmbGFncywgdWludDMyX3QgZm9ybWF0KQotewotCXN0cnVjdCBhZHNwX29wZW5fY29tbWFuZCBycGM7Ci0KLQltZW1zZXQoJnJwYywgMCwgc2l6ZW9mKHJwYykpOwotCi0JcnBjLmZvcm1hdC5zdGFuZGFyZC5mb3JtYXQgPSBmb3JtYXQ7Ci0JcnBjLmZvcm1hdC5zdGFuZGFyZC5jaGFubmVscyA9IDE7Ci0JcnBjLmZvcm1hdC5zdGFuZGFyZC5iaXRzX3Blcl9zYW1wbGUgPSAxNjsKLQlycGMuZm9ybWF0LnN0YW5kYXJkLnNhbXBsaW5nX3JhdGUgPSA4MDAwOwotCXJwYy5mb3JtYXQuc3RhbmRhcmQuaXNfc2lnbmVkID0gMTsKLQlycGMuZm9ybWF0LnN0YW5kYXJkLmlzX2ludGVybGVhdmVkID0gMDsKLQotCXJwYy5oZHIub3Bjb2RlID0gQURTUF9BVURJT19JT0NUTF9DTURfT1BFTl9SRUFEOwotCXJwYy5kZXZpY2UgPSBBRFNQX0FVRElPX0RFVklDRV9JRF9ERUZBVUxUOwotCi0JaWYgKGZsYWdzID09IEFVRElPX0ZMQUdfUkVBRCkKLQkJcnBjLnN0cmVhbV9jb250ZXh0ID0gQURTUF9BVURJT19ERVZJQ0VfQ09OVEVYVF9SRUNPUkQ7Ci0JZWxzZQotCQlycGMuc3RyZWFtX2NvbnRleHQgPSBBRFNQX0FVRElPX0RFVklDRV9DT05URVhUX01JWEVEX1JFQ09SRDsKLQlycGMuYnVmX21heF9zaXplID0gYnVmc3o7Ci0JcnBjLmNvbmZpZy5ldnJjLm1pbl9yYXRlID0gbWluX3JhdGU7Ci0JcnBjLmNvbmZpZy5ldnJjLm1heF9yYXRlID0gbWF4X3JhdGU7Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXSBhYyA9ICVwXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIGFjKTsKLQlyZXR1cm4gYXVkaW9faW9jdGwoYWMsICZycGMsIHNpemVvZihycGMpKTsKLX0KLQotc3RhdGljIGludCBhdWRpb19hbXJuYl9vcGVuKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBidWZzeiwKLQkJCQkJdWludDMyX3QgZW5jX21vZGUsIHVpbnQzMl90IGZsYWdzLAotCQkJCQl1aW50MzJfdCBkdHhfZW5hYmxlKQotewotCXN0cnVjdCBhZHNwX29wZW5fY29tbWFuZCBycGM7Ci0KLQltZW1zZXQoJnJwYywgMCwgc2l6ZW9mKHJwYykpOwotCi0JcnBjLmZvcm1hdC5zdGFuZGFyZC5mb3JtYXQgPSBBRFNQX0FVRElPX0ZPUk1BVF9BTVJOQl9GUzsKLQlycGMuZm9ybWF0LnN0YW5kYXJkLmNoYW5uZWxzID0gMTsKLQlycGMuZm9ybWF0LnN0YW5kYXJkLmJpdHNfcGVyX3NhbXBsZSA9IDE2OwotCXJwYy5mb3JtYXQuc3RhbmRhcmQuc2FtcGxpbmdfcmF0ZSA9IDgwMDA7Ci0JcnBjLmZvcm1hdC5zdGFuZGFyZC5pc19zaWduZWQgPSAxOwotCXJwYy5mb3JtYXQuc3RhbmRhcmQuaXNfaW50ZXJsZWF2ZWQgPSAwOwotCi0JcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9PUEVOX1JFQUQ7Ci0JcnBjLmRldmljZSA9IEFEU1BfQVVESU9fREVWSUNFX0lEX0RFRkFVTFQ7Ci0KLQlpZiAoZmxhZ3MgPT0gQVVESU9fRkxBR19SRUFEKQotCQlycGMuc3RyZWFtX2NvbnRleHQgPSBBRFNQX0FVRElPX0RFVklDRV9DT05URVhUX1JFQ09SRDsKLQllbHNlCi0JCXJwYy5zdHJlYW1fY29udGV4dCA9IEFEU1BfQVVESU9fREVWSUNFX0NPTlRFWFRfTUlYRURfUkVDT1JEOwotCi0JcnBjLmJ1Zl9tYXhfc2l6ZSA9IGJ1ZnN6OwotCXJwYy5jb25maWcuYW1yLm1vZGUgPSBlbmNfbW9kZTsKLQlycGMuY29uZmlnLmFtci5kdHhfbW9kZSA9IGR0eF9lbmFibGU7Ci0JcnBjLmNvbmZpZy5hbXIuZW5hYmxlID0gMTsKLQotCXByX2RlYnVnKCJbJXM6JXNdIGFjID0gJXBcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywgYWMpOwotCXJldHVybiBhdWRpb19pb2N0bChhYywgJnJwYywgc2l6ZW9mKHJwYykpOwotfQotCi0KLQotc3RhdGljIGludCBhdWRpb19jbG9zZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYykKLXsKLQlwcl9kZWJ1ZygiWyVzOiVzXSBhYyA9ICVwXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIGFjKTsKLQlhdWRpb19jb21tYW5kKGFjLCBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TVFJFQU1fU1RPUCk7Ci0JYXVkaW9fY29tbWFuZChhYywgQURTUF9BVURJT19JT0NUTF9DTURfQ0xPU0UpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX3NldF90YWJsZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCSAgIHVpbnQzMl90IGRldmljZV9pZCwgaW50IHNpemUpCi17Ci0Jc3RydWN0IGFkc3Bfc2V0X2Rldl9jZmdfdGFibGVfY29tbWFuZCBycGM7Ci0KLQltZW1zZXQoJnJwYywgMCwgc2l6ZW9mKHJwYykpOwotCXJwYy5oZHIub3Bjb2RlID0gQURTUF9BVURJT19JT0NUTF9TRVRfREVWSUNFX0NPTkZJR19UQUJMRTsKLQlpZiAocTZfZGV2aWNlX3RvX2RpcihkZXZpY2VfaWQpID09IFE2X1RYKSB7Ci0JCWlmICh0eF9jbGtfZnJlcSA+IDE2MDAwKQotCQkJcnBjLmhkci5kYXRhID0gNDgwMDA7Ci0JCWVsc2UgaWYgKHR4X2Nsa19mcmVxID4gODAwMCkKLQkJCXJwYy5oZHIuZGF0YSA9IDE2MDAwOwotCQllbHNlCi0JCQlycGMuaGRyLmRhdGEgPSA4MDAwOwotCX0KLQlycGMuZGV2aWNlX2lkID0gZGV2aWNlX2lkOwotCXJwYy5waHlzX2FkZHIgPSBhdWRpb19waHlzOwotCXJwYy5waHlzX3NpemUgPSBzaXplOwotCXJwYy5waHlzX3VzZWQgPSBzaXplOwotCi0JcHJfZGVidWcoIlslczolc10gYWMgPSAlcCwgZGV2aWNlX2lkID0gMHgleCwgc2l6ZSA9ICVkXG4iLCBfX01NX0ZJTEVfXywKLQkJX19mdW5jX18sIGFjLCBkZXZpY2VfaWQsIHNpemUpOwotCXJldHVybiBhdWRpb19pb2N0bChhYywgJnJwYywgc2l6ZW9mKHJwYykpOwotfQotCi1pbnQgcTZhdWRpb19yZWFkKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBzdHJ1Y3QgYXVkaW9fYnVmZmVyICphYikKLXsKLQlzdHJ1Y3QgYWRzcF9idWZmZXJfY29tbWFuZCBycGM7Ci0JdWludDMyX3QgcmVzOwotCWludCByOwotCi0JbWVtc2V0KCZycGMsIDAsIHNpemVvZihycGMpKTsKLQlycGMuaGRyLnNpemUgPSBzaXplb2YocnBjKSAtIHNpemVvZih1MzIpOwotCXJwYy5oZHIuZHN0ID0gQVVESU9fQUREUihhYy0+c2Vzc2lvbiwgMCwgQVVESU9fRE9NQUlOX0RTUCk7Ci0JcnBjLmhkci5zcmMgPSBBVURJT19BRERSKGFjLT5zZXNzaW9uLCAwLCBBVURJT19ET01BSU5fQVBQKTsKLQlycGMuaGRyLmNvbnRleHQgPSBhYy0+c2Vzc2lvbjsKLQlycGMuaGRyLm9wY29kZSA9IEFEU1BfQVVESU9fSU9DVExfQ01EX0RBVEFfVFg7Ci0JcnBjLmJ1ZmZlci5hZGRyID0gYWItPnBoeXM7Ci0JcnBjLmJ1ZmZlci5tYXhfc2l6ZSA9IGFiLT5zaXplOwotCXJwYy5idWZmZXIuYWN0dWFsX3NpemUgPSBhYi0+YWN0dWFsX3NpemU7Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXSBhYyA9ICVwXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIGFjKTsKLQlyID0gZGFsX2NhbGwoYWMtPmNsaWVudCwgQVVESU9fT1BfREFUQSwgNSwgJnJwYywgc2l6ZW9mKHJwYyksCi0JCSAgICAgJnJlcywgc2l6ZW9mKHJlcykpOwotCXJldHVybiAwOwotfQotCi1pbnQgcTZhdWRpb193cml0ZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgc3RydWN0IGF1ZGlvX2J1ZmZlciAqYWIpCi17Ci0Jc3RydWN0IGFkc3BfYnVmZmVyX2NvbW1hbmQgcnBjOwotCXVpbnQzMl90IHJlczsKLQlpbnQgcjsKLQotCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0JcnBjLmhkci5zaXplID0gc2l6ZW9mKHJwYykgLSBzaXplb2YodTMyKTsKLQlycGMuaGRyLmRzdCA9IEFVRElPX0FERFIoYWMtPnNlc3Npb24sIDAsIEFVRElPX0RPTUFJTl9EU1ApOwotCXJwYy5oZHIuc3JjID0gQVVESU9fQUREUihhYy0+c2Vzc2lvbiwgMCwgQVVESU9fRE9NQUlOX0FQUCk7Ci0JcnBjLmhkci5jb250ZXh0ID0gYWMtPnNlc3Npb247Ci0JcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9EQVRBX1JYOwotCXJwYy5idWZmZXIuYWRkciA9IGFiLT5waHlzOwotCXJwYy5idWZmZXIubWF4X3NpemUgPSBhYi0+c2l6ZTsKLQlycGMuYnVmZmVyLmFjdHVhbF9zaXplID0gYWItPmFjdHVhbF9zaXplOwotCi0JcHJfZGVidWcoIlslczolc10gYWMgPSAlcFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBhYyk7Ci0JciA9IGRhbF9jYWxsKGFjLT5jbGllbnQsIEFVRElPX09QX0RBVEEsIDUsICZycGMsIHNpemVvZihycGMpLAotCQkgICAgICZyZXMsIHNpemVvZihyZXMpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19yeF92b2x1bWUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGRldl9pZCwgaW50MzJfdCB2b2x1bWUpCi17Ci0Jc3RydWN0IGFkc3Bfc2V0X2Rldl92b2x1bWVfY29tbWFuZCBycGM7Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXSB2b2x1bWUgPSAlZFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCB2b2x1bWUpOwotCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0JcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVRfREVWSUNFX1ZPTDsKLQlycGMuZGV2aWNlX2lkID0gZGV2X2lkOwotCXJwYy5wYXRoID0gQURTUF9QQVRIX1JYOwotCXJwYy52b2x1bWUgPSB2b2x1bWU7Ci0JcmV0dXJuIGF1ZGlvX2lvY3RsKGFjLCAmcnBjLCBzaXplb2YocnBjKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fcnhfbXV0ZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZGV2X2lkLCBpbnQgbXV0ZSkKLXsKLQlzdHJ1Y3QgYWRzcF9zZXRfZGV2X211dGVfY29tbWFuZCBycGM7Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXSBtdXRlID0gJWQsIGRldl9pZCA9IDB4JXhcbiIsIF9fTU1fRklMRV9fLAotCQkJX19mdW5jX18sIG11dGUsIGRldl9pZCk7Ci0JbWVtc2V0KCZycGMsIDAsIHNpemVvZihycGMpKTsKLQlycGMuaGRyLm9wY29kZSA9IEFEU1BfQVVESU9fSU9DVExfQ01EX1NFVF9ERVZJQ0VfTVVURTsKLQlycGMuZGV2aWNlX2lkID0gZGV2X2lkOwotCXJwYy5wYXRoID0gQURTUF9QQVRIX1JYOwotCXJwYy5tdXRlID0gISFtdXRlOwotCXJldHVybiBhdWRpb19pb2N0bChhYywgJnJwYywgc2l6ZW9mKHJwYykpOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX3R4X211dGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGRldl9pZCwgaW50IG11dGUpCi17Ci0Jc3RydWN0IGFkc3Bfc2V0X2Rldl9tdXRlX2NvbW1hbmQgcnBjOwotCi0JcHJfZGVidWcoIlslczolc10gbXV0ZSA9ICVkXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIG11dGUpOwotCWlmIChtdXRlIDwgMCAgfHwgIG11dGUgPiAzKSB7Ci0JCXByX2VycigiWyVzOiVzXSBpbnZhbGlkIG11dGUgc3RhdHVzICVkXG4iLCBfX01NX0ZJTEVfXywKLQkJCQlfX2Z1bmNfXywgbXV0ZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0JcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVRfREVWSUNFX01VVEU7Ci0JaWYgKChtdXRlID09IFNUUkVBTV9VTk1VVEUpIHx8IChtdXRlID09IFNUUkVBTV9NVVRFKSkgewotCQlycGMuZGV2aWNlX2lkID0gQURTUF9BVURJT19ERVZJQ0VfSURfVk9JQ0U7Ci0JCXJwYy5wYXRoID0gQURTUF9QQVRIX1RYX0NOR19ESVM7Ci0JfSBlbHNlIHsKLQkJcnBjLmRldmljZV9pZCA9IGRldl9pZDsKLQkJcnBjLnBhdGggPSBBRFNQX1BBVEhfVFg7Ci0JfQotCW11dGUgJj0gMHgwMTsKLQlycGMubXV0ZSA9ICEhbXV0ZTsKLQlyZXR1cm4gYXVkaW9faW9jdGwoYWMsICZycGMsIHNpemVvZihycGMpKTsKLX0KLQotc3RhdGljIGludCBhdWRpb19zdHJlYW1fdm9sdW1lKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgdm9sdW1lKQotewotCXN0cnVjdCBhZHNwX3NldF92b2x1bWVfY29tbWFuZCBycGM7Ci0JaW50IHJjOwotCi0JcHJfZGVidWcoIlslczolc10gdm9sdW1lID0gJWRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywgdm9sdW1lKTsKLQltZW1zZXQoJnJwYywgMCwgc2l6ZW9mKHJwYykpOwotCXJwYy5oZHIub3Bjb2RlID0gQURTUF9BVURJT19JT0NUTF9DTURfU0VUX1NUUkVBTV9WT0w7Ci0JcnBjLnZvbHVtZSA9IHZvbHVtZTsKLQlyYyA9IGF1ZGlvX2lvY3RsKGFjLCAmcnBjLCBzaXplb2YocnBjKSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX3N0cmVhbV9tdXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgbXV0ZSkKLXsKLQlzdHJ1Y3QgYWRzcF9zZXRfbXV0ZV9jb21tYW5kIHJwYzsKLQlpbnQgcmM7Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXSBtdXRlID0gJWRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywgbXV0ZSk7Ci0JbWVtc2V0KCZycGMsIDAsIHNpemVvZihycGMpKTsKLQlycGMuaGRyLm9wY29kZSA9IEFEU1BfQVVESU9fSU9DVExfQ01EX1NFVF9TVFJFQU1fTVVURTsKLQlycGMubXV0ZSA9IG11dGU7Ci0JcmMgPSBhdWRpb19pb2N0bChhYywgJnJwYywgc2l6ZW9mKHJwYykpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgY2FsbGJhY2sodm9pZCAqZGF0YSwgaW50IGxlbiwgdm9pZCAqY29va2llKQotewotCXN0cnVjdCBhZHNwX2V2ZW50X2hkciAqZSA9IGRhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0Jc3RydWN0IGFkc3BfYnVmZmVyX2V2ZW50ICphYmUgPSBkYXRhOwotCi0JaWYgKGUtPmNvbnRleHQgPj0gU0VTU0lPTl9NQVgpIHsKLQkJcHJfZXJyKCJbJXM6JXNdIGJvZ3VzIHNlc3Npb24gJWRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywKLQkJCQllLT5jb250ZXh0KTsKLQkJcmV0dXJuOwotCX0KLQlhYyA9IHNlc3Npb25bZS0+Y29udGV4dF07Ci0JaWYgKCFhYykgewotCQlwcl9lcnIoIlslczolc10gdW5rbm93biBzZXNzaW9uICVkXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sCi0JCQkJZS0+Y29udGV4dCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoZS0+ZXZlbnRfaWQgPT0gQURTUF9BVURJT19JT0NUTF9DTURfU1RSRUFNX0VPUykgewotCQlwcl9kZWJ1ZygiWyVzOiVzXSBDQiBTdHJlYW0gZW9zLCBhYyA9ICVwXG4iLAotCQkJX19NTV9GSUxFX18sIF9fZnVuY19fLCBhYyk7Ci0JCWlmIChlLT5zdGF0dXMpCi0JCQlwcl9lcnIoIlslczolc10gcGxheWJhY2sgc3RhdHVzICVkXG4iLCBfX01NX0ZJTEVfXywKLQkJCQkJX19mdW5jX18sIGUtPnN0YXR1cyk7Ci0JCWlmIChhYy0+Y2Jfc3RhdHVzID09IC1FQlVTWSkgewotCQkJYWMtPmNiX3N0YXR1cyA9IGUtPnN0YXR1czsKLQkJCXdha2VfdXAoJmFjLT53YWl0KTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGUtPmV2ZW50X2lkID09IEFEU1BfQVVESU9fRVZUX1NUQVRVU19CVUZfRE9ORSkgewotCQlwcl9kZWJ1ZygiWyVzOiVzXSBDQiBkb25lLCBhYyA9ICVwLCBzdGF0dXMgPSAlZFxuIiwKLQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18sIGFjLCBlLT5zdGF0dXMpOwotCQlpZiAoZS0+c3RhdHVzKQotCQkJcHJfZXJyKCJbJXM6JXNdIGJ1ZmZlciBzdGF0dXMgJWRcbiIsIF9fTU1fRklMRV9fLAotCQkJCQlfX2Z1bmNfXywgZS0+c3RhdHVzKTsKLQotCQlhYy0+YnVmW2FjLT5kc3BfYnVmXS5hY3R1YWxfc2l6ZSA9IGFiZS0+YnVmZmVyLmFjdHVhbF9zaXplOwotCQlhYy0+YnVmW2FjLT5kc3BfYnVmXS51c2VkID0gMDsKLQkJYWMtPmRzcF9idWYgXj0gMTsKLQkJd2FrZV91cCgmYWMtPndhaXQpOwotCQlyZXR1cm47Ci0JfQotCi0JcHJfZGVidWcoIlslczolc10gYWMgPSAlcCwgZXZlbnRfaWQgPSAweCV4LCBzdGF0dXMgPSAlZFxuIiwKLQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXywgYWMsIGUtPmV2ZW50X2lkLCBlLT5zdGF0dXMpOwotCWlmIChlLT5zdGF0dXMpCi0JCXByX3dhcm5pbmcoImF1ZGlvX2NiOiBzPSVkIGU9JTA4eCBzdGF0dXM9JWRcbiIsCi0JCQkgICBlLT5jb250ZXh0LCBlLT5ldmVudF9pZCwgZS0+c3RhdHVzKTsKLQlpZiAoYWMtPmNiX3N0YXR1cyA9PSAtRUJVU1kpIHsKLQkJYWMtPmNiX3N0YXR1cyA9IGUtPnN0YXR1czsKLQkJd2FrZV91cCgmYWMtPndhaXQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXVkaW9faW5pdChzdHJ1Y3QgZGFsX2NsaWVudCAqY2xpZW50KQotewotCXUzMiB0bXBbM107Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXVxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQl0bXBbMF0gPSAyICogc2l6ZW9mKHUzMik7Ci0JdG1wWzFdID0gMDsKLQl0bXBbMl0gPSAwOwotCWRhbF9jYWxsKGNsaWVudCwgQVVESU9fT1BfSU5JVCwgNSwgdG1wLCBzaXplb2YodG1wKSwKLQkJIHRtcCwgc2l6ZW9mKHUzMikpOwotfQotCi1zdGF0aWMgc3RydWN0IGF1ZGlvX2NsaWVudCAqYWNfY29udHJvbDsKLQotc3RhdGljIGludCBxNmF1ZGlvX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyA9IDA7Ci0JaW50IHJlczsKLQotCXByX2RlYnVnKCJbJXM6JXNdXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCW11dGV4X2xvY2soJmF1ZGlvX2xvY2spOwotCWlmIChhY19jb250cm9sKSB7Ci0JCXJlcyA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlwcl9pbmZvKCJbJXM6JXNdIGNvZGVjc1xuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQlpY29kZWNfcnhfY2xrID0gY2xrX2dldCgwLCAiaWNvZGVjX3J4X2NsayIpOwotCWljb2RlY190eF9jbGsgPSBjbGtfZ2V0KDAsICJpY29kZWNfdHhfY2xrIik7Ci0JZWNvZGVjX2NsayA9IGNsa19nZXQoMCwgImVjb2RlY19jbGsiKTsKLQlzZGFjX2NsayA9IGNsa19nZXQoMCwgInNkYWNfY2xrIik7Ci0JYXVkaW9fcGh5cyA9IHBtZW1fa2FsbG9jKDQwOTYsIFBNRU1fTUVNVFlQRV9FQkkxfFBNRU1fQUxJR05NRU5UXzRLKTsKLQlhdWRpb19kYXRhID0gaW9yZW1hcChhdWRpb19waHlzLCA0MDk2KTsKLQotCXByX2luZm8oIlslczolc10gYXR0YWNoIEFEU1BcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JYWRzcCA9IGRhbF9hdHRhY2goQVVESU9fREFMX0RFVklDRSwgQVVESU9fREFMX1BPUlQsIDEsCi0JCQkgIGNhbGxiYWNrLCAwKTsKLQlpZiAoIWFkc3ApIHsKLQkJcHJfZXJyKCJbJXM6JXNdIGNhbm5vdCBhdHRhY2ggdG8gYWRzcFxuIiwgX19NTV9GSUxFX18sCi0JCQkJX19mdW5jX18pOwotCQlyZXMgPSAtRU5PREVWOwotCQlnb3RvIGRvbmU7Ci0JfQotCXByX2luZm8oIlslczolc10gSU5JVFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQlhdWRpb19pbml0KGFkc3ApOwotCWRhbF90cmFjZShhZHNwKTsKLQotCWFjID0gYXVkaW9fY2xpZW50X2FsbG9jKDApOwotCWlmICghYWMpIHsKLQkJcHJfZXJyKCJbJXM6JXNdIGNhbm5vdCBhbGxvY2F0ZSBjbGllbnRcbiIsCi0JCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJcmVzID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCXByX2luZm8oIlslczolc10gT1BFTiBjb250cm9sXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCWlmIChhdWRpb19vcGVuX2NvbnRyb2woYWMpKSB7Ci0JCXByX2VycigiWyVzOiVzXSBjYW5ub3Qgb3BlbiBjb250cm9sIGNoYW5uZWxcbiIsCi0JCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJcmVzID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQotCXByX2luZm8oIlslczolc10gYXR0YWNoIEFDREJcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JYWNkYiA9IGRhbF9hdHRhY2goQUNEQl9EQUxfREVWSUNFLCBBQ0RCX0RBTF9QT1JULCAwLCAwLCAwKTsKLQlpZiAoIWFjZGIpIHsKLQkJcHJfZXJyKCJbJXM6JXNdIGNhbm5vdCBhdHRhY2ggdG8gYWNkYiBjaGFubmVsXG4iLAotCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCXJlcyA9IC1FTk9ERVY7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlwcl9pbmZvKCJbJXM6JXNdIGF0dGFjaCBBRElFXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCWFkaWUgPSBkYWxfYXR0YWNoKEFESUVfREFMX0RFVklDRSwgQURJRV9EQUxfUE9SVCwgMCwgMCwgMCk7Ci0JaWYgKCFhZGllKSB7Ci0JCXByX2VycigiWyVzOiVzXSBjYW5ub3QgYXR0YWNoIHRvIGFkaWVcbiIsCi0JCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJcmVzID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoYW5hbG9nX29wcy0+aW5pdCkKLQkJYW5hbG9nX29wcy0+aW5pdCgpOwotCi0JcmVzID0gMDsKLQlhY19jb250cm9sID0gYWM7Ci0KLQlwbV9xb3NfYWRkX3JlcXVlc3QoJnBtX3Fvc19yZXEsIFBNX1FPU19DUFVfRE1BX0xBVEVOQ1ksCi0JCQkJUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotCXdha2VfbG9ja19pbml0KCZ3YWtlbG9jaywgV0FLRV9MT0NLX1NVU1BFTkQsICJhdWRpb19wY21fc3VzcGVuZCIpOwotZG9uZToKLQlpZiAoKHJlcyA8IDApICYmIGFjKQotCQlhdWRpb19jbGllbnRfZnJlZShhYyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpb19sb2NrKTsKLQotCXByX2RlYnVnKCJbJXM6JXNdIHJlcyA9ICVkXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIHJlcyk7Ci0JcmV0dXJuIHJlczsKLX0KLQotc3RydWN0IGF1ZGlvX2NvbmZpZ19kYXRhIHsKLQl1aW50MzJfdCBkZXZpY2VfaWQ7Ci0JdWludDMyX3Qgc2FtcGxlX3JhdGU7Ci0JdWludDMyX3Qgb2Zmc2V0OwotCXVpbnQzMl90IGxlbmd0aDsKLX07Ci0KLXN0cnVjdCBhdWRpb19jb25maWdfZGF0YWJhc2UgewotCXVpbnQ4X3QgbWFnaWNbOF07Ci0JdWludDMyX3QgZW50cnlfY291bnQ7Ci0JdWludDMyX3QgdW51c2VkOwotCXN0cnVjdCBhdWRpb19jb25maWdfZGF0YSBlbnRyeVswXTsKLX07Ci0KLXZvaWQgKmFjZGJfZGF0YTsKLWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqYWNkYl9mdzsKLWV4dGVybiBzdHJ1Y3QgbWlzY2RldmljZSBxNl9jb250cm9sX2RldmljZTsKLQotc3RhdGljIGludCBhY2RiX2dldF9jb25maWdfdGFibGUodWludDMyX3QgZGV2aWNlX2lkLCB1aW50MzJfdCBzYW1wbGVfcmF0ZSkKLXsKLQlzdHJ1Y3QgYWNkYl9jbWRfZGV2aWNlX3RhYmxlIHJwYzsKLQlzdHJ1Y3QgYWNkYl9yZXN1bHQgcmVzOwotCWludCByOwotCi0JcHJfZGVidWcoIlslczolc10gZGV2aWNlX2lkID0gMHgleCwgc2FtcGxlcmF0ZSA9ICVkXG4iLCBfX01NX0ZJTEVfXywKLQkJX19mdW5jX18sIGRldmljZV9pZCwgc2FtcGxlX3JhdGUpOwotCWlmIChxNmF1ZGlvX2luaXQoKSkKLQkJcmV0dXJuIDA7Ci0KLQltZW1zZXQoYXVkaW9fZGF0YSwgMCwgNDA5Nik7Ci0JbWVtc2V0KCZycGMsIDAsIHNpemVvZihycGMpKTsKLQotCXJwYy5zaXplID0gc2l6ZW9mKHJwYykgLSAoMiAqIHNpemVvZih1aW50MzJfdCkpOwotCXJwYy5jb21tYW5kX2lkID0gQUNEQl9HRVRfREVWSUNFX1RBQkxFOwotCXJwYy5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7Ci0JcnBjLnNhbXBsZV9yYXRlX2lkID0gc2FtcGxlX3JhdGU7Ci0JcnBjLnRvdGFsX2J5dGVzID0gNDA5NjsKLQlycGMudW5tYXBwZWRfYnVmID0gYXVkaW9fcGh5czsKLQlycGMucmVzX3NpemUgPSBzaXplb2YocmVzKSAtICgyICogc2l6ZW9mKHVpbnQzMl90KSk7Ci0KLQlyID0gZGFsX2NhbGwoYWNkYiwgQUNEQl9PUF9JT0NUTCwgOCwgJnJwYywgc2l6ZW9mKHJwYyksCi0JCSZyZXMsIHNpemVvZihyZXMpKTsKLQotCWlmICgociA9PSBzaXplb2YocmVzKSkgJiYgKHJlcy5kYWxfc3RhdHVzID09IDApKQotCQlyZXR1cm4gcmVzLnVzZWRfYnl0ZXM7Ci0KLQlyZXR1cm4gLUVJTzsKLX0KLQotc3RhdGljIHVpbnQzMl90IGF1ZGlvX3J4X3BhdGhfaWQgPSBBRElFX1BBVEhfSEFORFNFVF9SWDsKLXN0YXRpYyB1aW50MzJfdCBhdWRpb19yeF9kZXZpY2VfaWQgPSBBRFNQX0FVRElPX0RFVklDRV9JRF9IQU5EU0VUX1NQS1I7Ci1zdGF0aWMgdWludDMyX3QgYXVkaW9fcnhfZGV2aWNlX2dyb3VwID0gLTE7Ci1zdGF0aWMgdWludDMyX3QgYXVkaW9fdHhfcGF0aF9pZCA9IEFESUVfUEFUSF9IQU5EU0VUX1RYOwotc3RhdGljIHVpbnQzMl90IGF1ZGlvX3R4X2RldmljZV9pZCA9IEFEU1BfQVVESU9fREVWSUNFX0lEX0hBTkRTRVRfTUlDOwotc3RhdGljIHVpbnQzMl90IGF1ZGlvX3R4X2RldmljZV9ncm91cCA9IC0xOwotCi1zdGF0aWMgaW50IHFkc3A2X2RldmNoZ19ub3RpZnkoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkgICAgICAgdWludDMyX3QgZGV2X3R5cGUsIHVpbnQzMl90IGRldl9pZCkKLXsKLQlzdHJ1Y3QgYWRzcF9kZXZpY2Vfc3dpdGNoX2NvbW1hbmQgcnBjOwotCi0JaWYgKGRldl90eXBlICE9IEFEU1BfQVVESU9fUlhfREVWSUNFICYmCi0JICAgIGRldl90eXBlICE9IEFEU1BfQVVESU9fVFhfREVWSUNFKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0JcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9ERVZJQ0VfU1dJVENIX1BSRVBBUkU7Ci0JaWYgKGRldl90eXBlID09IEFEU1BfQVVESU9fUlhfREVWSUNFKSB7Ci0JCXJwYy5vbGRfZGV2aWNlID0gYXVkaW9fcnhfZGV2aWNlX2lkOwotCQlycGMubmV3X2RldmljZSA9IGRldl9pZDsKLQl9IGVsc2UgewotCQlycGMub2xkX2RldmljZSA9IGF1ZGlvX3R4X2RldmljZV9pZDsKLQkJcnBjLm5ld19kZXZpY2UgPSBkZXZfaWQ7Ci0JfQotCXJwYy5kZXZpY2VfY2xhc3MgPSAwOwotCXJwYy5kZXZpY2VfdHlwZSA9IGRldl90eXBlOwotCXByX2RlYnVnKCJbJXM6JXNdIGRldl9pZCA9IDB4JXhcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywgZGV2X2lkKTsKLQlyZXR1cm4gYXVkaW9faW9jdGwoYWMsICZycGMsIHNpemVvZihycGMpKTsKLX0KLQotc3RhdGljIGludCBxZHNwNl9zdGFuZGJ5KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCXByX2RlYnVnKCJbJXM6JXNdXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCXJldHVybiBhdWRpb19jb21tYW5kKGFjLCBBRFNQX0FVRElPX0lPQ1RMX0NNRF9ERVZJQ0VfU1dJVENIX1NUQU5EQlkpOwotfQotCi1zdGF0aWMgaW50IHFkc3A2X3N0YXJ0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCXByX2RlYnVnKCJbJXM6JXNdXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCXJldHVybiBhdWRpb19jb21tYW5kKGFjLCBBRFNQX0FVRElPX0lPQ1RMX0NNRF9ERVZJQ0VfU1dJVENIX0NPTU1JVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX3J4X2FuYWxvZ19lbmFibGUoaW50IGVuKQotewotCXByX2RlYnVnKCJbJXM6JXNdIGF1ZGlvX3J4X2RldmljZV9pZCA9IDB4JXgsIGVuID0gJWRcbiIsIF9fTU1fRklMRV9fLAotCQlfX2Z1bmNfXywgYXVkaW9fcnhfZGV2aWNlX2lkLCBlbik7Ci0Jc3dpdGNoIChhdWRpb19yeF9kZXZpY2VfaWQpIHsKLQljYXNlIEFEU1BfQVVESU9fREVWSUNFX0lEX0hFQURTRVRfU1BLUl9NT05POgotCWNhc2UgQURTUF9BVURJT19ERVZJQ0VfSURfSEVBRFNFVF9TUEtSX1NURVJFTzoKLQljYXNlIEFEU1BfQVVESU9fREVWSUNFX0lEX1RUWV9IRUFEU0VUX1NQS1I6Ci0JCWlmIChhbmFsb2dfb3BzLT5oZWFkc2V0X2VuYWJsZSkKLQkJCWFuYWxvZ19vcHMtPmhlYWRzZXRfZW5hYmxlKGVuKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRFNQX0FVRElPX0RFVklDRV9JRF9TUEtSX1BIT05FX01PTk9fV19NT05PX0hFQURTRVQ6Ci0JY2FzZSBBRFNQX0FVRElPX0RFVklDRV9JRF9TUEtSX1BIT05FX01PTk9fV19TVEVSRU9fSEVBRFNFVDoKLQljYXNlIEFEU1BfQVVESU9fREVWSUNFX0lEX1NQS1JfUEhPTkVfU1RFUkVPX1dfTU9OT19IRUFEU0VUOgotCWNhc2UgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9TVEVSRU9fV19TVEVSRU9fSEVBRFNFVDoKLQkJaWYgKGFuYWxvZ19vcHMtPmhlYWRzZXRfZW5hYmxlKQotCQkJYW5hbG9nX29wcy0+aGVhZHNldF9lbmFibGUoZW4pOwotCQlpZiAoYW5hbG9nX29wcy0+c3BlYWtlcl9lbmFibGUpCi0JCQlhbmFsb2dfb3BzLT5zcGVha2VyX2VuYWJsZShlbik7Ci0JCWJyZWFrOwotCWNhc2UgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9NT05POgotCWNhc2UgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9TVEVSRU86Ci0JCWlmIChhbmFsb2dfb3BzLT5zcGVha2VyX2VuYWJsZSkKLQkJCWFuYWxvZ19vcHMtPnNwZWFrZXJfZW5hYmxlKGVuKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRFNQX0FVRElPX0RFVklDRV9JRF9CVF9TQ09fU1BLUjoKLQkJaWYgKGFuYWxvZ19vcHMtPmJ0X3Njb19lbmFibGUpCi0JCQlhbmFsb2dfb3BzLT5idF9zY29fZW5hYmxlKGVuKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRFNQX0FVRElPX0RFVklDRV9JRF9IQU5EU0VUX1NQS1I6Ci0JCWlmIChhbmFsb2dfb3BzLT5yZWNlaXZlcl9lbmFibGUpCi0JCQlhbmFsb2dfb3BzLT5yZWNlaXZlcl9lbmFibGUoZW4pOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX3R4X2FuYWxvZ19lbmFibGUoaW50IGVuKQotewotCXByX2RlYnVnKCJbJXM6JXNdIGF1ZGlvX3R4X2RldmljZV9pZCA9IDB4JXgsIGVuID0gJWRcbiIsIF9fTU1fRklMRV9fLAotCQlfX2Z1bmNfXywgYXVkaW9fdHhfZGV2aWNlX2lkLCBlbik7Ci0Jc3dpdGNoIChhdWRpb190eF9kZXZpY2VfaWQpIHsKLQljYXNlIEFEU1BfQVVESU9fREVWSUNFX0lEX0hBTkRTRVRfTUlDOgotCWNhc2UgQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9NSUM6Ci0JCWlmIChhbmFsb2dfb3BzLT5pbnRfbWljX2VuYWJsZSkKLQkJCWFuYWxvZ19vcHMtPmludF9taWNfZW5hYmxlKGVuKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRFNQX0FVRElPX0RFVklDRV9JRF9IRUFEU0VUX01JQzoKLQljYXNlIEFEU1BfQVVESU9fREVWSUNFX0lEX1RUWV9IRUFEU0VUX01JQzoKLQljYXNlIEFEU1BfQVVESU9fREVWSUNFX0lEX0hBTkRTRVRfRFVBTF9NSUM6Ci0JY2FzZSBBRFNQX0FVRElPX0RFVklDRV9JRF9TUEtSX1BIT05FX0RVQUxfTUlDOgotCQlpZiAoYW5hbG9nX29wcy0+ZXh0X21pY19lbmFibGUpCi0JCQlhbmFsb2dfb3BzLT5leHRfbWljX2VuYWJsZShlbik7Ci0JCWJyZWFrOwotCWNhc2UgQURTUF9BVURJT19ERVZJQ0VfSURfQlRfU0NPX01JQzoKLQkJaWYgKGFuYWxvZ19vcHMtPmJ0X3Njb19lbmFibGUpCi0JCQlhbmFsb2dfb3BzLT5idF9zY29fZW5hYmxlKGVuKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaW50IGF1ZGlvX3VwZGF0ZV9hY2RiKHVpbnQzMl90IGFkZXYsIHVpbnQzMl90IGFjZGJfaWQpCi17Ci0JdWludDMyX3Qgc2FtcGxlX3JhdGU7Ci0JaW50IHN6OwotCi0JcHJfZGVidWcoIlslczolc10gYWRldiA9IDB4JXgsIGFjZGJfaWQgPSAweCV4XG4iLCBfX01NX0ZJTEVfXywKLQkJX19mdW5jX18sIGFkZXYsIGFjZGJfaWQpOwotCWlmIChxNl9kZXZpY2VfdG9fZGlyKGFkZXYpID09IFE2X1JYKSB7Ci0JCXJ4X2FjZGIgPSBhY2RiX2lkOwotCQlzYW1wbGVfcmF0ZSA9IHE2X2RldmljZV90b19yYXRlKGFkZXYpOwotCX0gZWxzZSB7Ci0KLQkJdHhfYWNkYiA9IGFjZGJfaWQ7Ci0JCWlmICh0eF9jbGtfZnJlcSA+IDE2MDAwKQotCQkJc2FtcGxlX3JhdGUgPSA0ODAwMDsKLQkJZWxzZSBpZiAodHhfY2xrX2ZyZXEgPiA4MDAwKQotCQkJc2FtcGxlX3JhdGUgPSAxNjAwMDsKLQkJZWxzZQotCQkJc2FtcGxlX3JhdGUgPSA4MDAwOwotCX0KLQotCWlmIChhY2RiX2lkID09IDApCi0JCWFjZGJfaWQgPSBxNl9kZXZpY2VfdG9fY2FkX2lkKGFkZXYpOwotCi0Jc3ogPSBhY2RiX2dldF9jb25maWdfdGFibGUoYWNkYl9pZCwgc2FtcGxlX3JhdGUpOwotCWF1ZGlvX3NldF90YWJsZShhY19jb250cm9sLCBhZGV2LCBzeik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYWRpZV9yeF9wYXRoX2VuYWJsZSh1aW50MzJfdCBhY2RiX2lkKQotewotCXByX2RlYnVnKCJbJXM6JXNdXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCWlmIChhdWRpb19yeF9wYXRoX2lkKSB7Ci0JCWFkaWVfZW5hYmxlKCk7Ci0JCWFkaWVfc2V0X3BhdGgoYWRpZSwgYXVkaW9fcnhfcGF0aF9pZCwgQURJRV9QQVRIX1JYKTsKLQkJYWRpZV9zZXRfcGF0aF9mcmVxX3BsYW4oYWRpZSwgQURJRV9QQVRIX1JYLCA0ODAwMCk7Ci0KLQkJYWRpZV9wcm9jZWVkX3RvX3N0YWdlKGFkaWUsIEFESUVfUEFUSF9SWCwKLQkJCQlBRElFX1NUQUdFX0RJR0lUQUxfUkVBRFkpOwotCQlhZGllX3Byb2NlZWRfdG9fc3RhZ2UoYWRpZSwgQURJRV9QQVRIX1JYLAotCQkJCUFESUVfU1RBR0VfRElHSVRBTF9BTkFMT0dfUkVBRFkpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcTZfcnhfcGF0aF9lbmFibGUoaW50IHJlY29uZiwgdWludDMyX3QgYWNkYl9pZCkKLXsKLQlwcl9kZWJ1ZygiWyVzOiVzXVxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQlpZiAoIXJlY29uZikKLQkJcWRzcDZfZGV2Y2hnX25vdGlmeShhY19jb250cm9sLCBBRFNQX0FVRElPX1JYX0RFVklDRSwgYXVkaW9fcnhfZGV2aWNlX2lkKTsKLQlhdWRpb191cGRhdGVfYWNkYihhdWRpb19yeF9kZXZpY2VfaWQsIGFjZGJfaWQpOwotCXFkc3A2X3N0YW5kYnkoYWNfY29udHJvbCk7Ci0JcWRzcDZfc3RhcnQoYWNfY29udHJvbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9hdWRpb19yeF9wYXRoX2VuYWJsZShpbnQgcmVjb25mLCB1aW50MzJfdCBhY2RiX2lkKQotewotCXByX2RlYnVnKCJbJXM6JXNdIHJlY29uZiA9ICVkXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIHJlY29uZik7Ci0JcTZfcnhfcGF0aF9lbmFibGUocmVjb25mLCBhY2RiX2lkKTsKLQlpZiAoYXVkaW9fcnhfcGF0aF9pZCkKLQkJYWRpZV9yeF9wYXRoX2VuYWJsZShhY2RiX2lkKTsKLQlhdWRpb19yeF9hbmFsb2dfZW5hYmxlKDEpOwotfQotCi1zdGF0aWMgdm9pZCBfYXVkaW9fdHhfcGF0aF9lbmFibGUoaW50IHJlY29uZiwgdWludDMyX3QgYWNkYl9pZCkKLXsKLQlwcl9kZWJ1ZygiWyVzOiVzXSByZWNvbmYgPSAlZCwgdHhfY2xrX2ZyZXEgPSAlZFxuIiwgX19NTV9GSUxFX18sCi0JCQlfX2Z1bmNfXywgcmVjb25mLCB0eF9jbGtfZnJlcSk7Ci0JYXVkaW9fdHhfYW5hbG9nX2VuYWJsZSgxKTsKLQotCWlmIChhdWRpb190eF9wYXRoX2lkKSB7Ci0JCWFkaWVfZW5hYmxlKCk7Ci0JCWFkaWVfc2V0X3BhdGgoYWRpZSwgYXVkaW9fdHhfcGF0aF9pZCwgQURJRV9QQVRIX1RYKTsKLQotCQlpZiAodHhfY2xrX2ZyZXEgPiAxNjAwMCkKLQkJCWFkaWVfc2V0X3BhdGhfZnJlcV9wbGFuKGFkaWUsIEFESUVfUEFUSF9UWCwgNDgwMDApOwotCQllbHNlIGlmICh0eF9jbGtfZnJlcSA+IDgwMDApCi0JCQlhZGllX3NldF9wYXRoX2ZyZXFfcGxhbihhZGllLCBBRElFX1BBVEhfVFgsIDE2MDAwKTsKLQkJZWxzZQotCQkJYWRpZV9zZXRfcGF0aF9mcmVxX3BsYW4oYWRpZSwgQURJRV9QQVRIX1RYLCA4MDAwKTsKLQotCQlhZGllX3Byb2NlZWRfdG9fc3RhZ2UoYWRpZSwgQURJRV9QQVRIX1RYLAotCQkJCUFESUVfU1RBR0VfRElHSVRBTF9SRUFEWSk7Ci0JCWFkaWVfcHJvY2VlZF90b19zdGFnZShhZGllLCBBRElFX1BBVEhfVFgsCi0JCQkJQURJRV9TVEFHRV9ESUdJVEFMX0FOQUxPR19SRUFEWSk7Ci0JfQotCi0KLQlpZiAoIXJlY29uZikKLQkJcWRzcDZfZGV2Y2hnX25vdGlmeShhY19jb250cm9sLCBBRFNQX0FVRElPX1RYX0RFVklDRSwKLQkJCQlhdWRpb190eF9kZXZpY2VfaWQpOwotCWF1ZGlvX3VwZGF0ZV9hY2RiKGF1ZGlvX3R4X2RldmljZV9pZCwgYWNkYl9pZCk7Ci0JcWRzcDZfc3RhbmRieShhY19jb250cm9sKTsKLQlxZHNwNl9zdGFydChhY19jb250cm9sKTsKLQotCWF1ZGlvX3R4X211dGUoYWNfY29udHJvbCwgYXVkaW9fdHhfZGV2aWNlX2lkLCB0eF9tdXRlX3N0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9hdWRpb19yeF9wYXRoX2Rpc2FibGUodm9pZCkKLXsKLQlwcl9kZWJ1ZygiWyVzOiVzXVxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQlhdWRpb19yeF9hbmFsb2dfZW5hYmxlKDApOwotCi0JaWYgKGF1ZGlvX3J4X3BhdGhfaWQpIHsKLQkJYWRpZV9wcm9jZWVkX3RvX3N0YWdlKGFkaWUsIEFESUVfUEFUSF9SWCwKLQkJCQlBRElFX1NUQUdFX0FOQUxPR19PRkYpOwotCQlhZGllX3Byb2NlZWRfdG9fc3RhZ2UoYWRpZSwgQURJRV9QQVRIX1JYLAotCQkJCUFESUVfU1RBR0VfRElHSVRBTF9PRkYpOwotCQlhZGllX2Rpc2FibGUoKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9hdWRpb190eF9wYXRoX2Rpc2FibGUodm9pZCkKLXsKLQlwcl9kZWJ1ZygiWyVzOiVzXVxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQlhdWRpb190eF9hbmFsb2dfZW5hYmxlKDApOwotCi0JaWYgKGF1ZGlvX3R4X3BhdGhfaWQpIHsKLQkJYWRpZV9wcm9jZWVkX3RvX3N0YWdlKGFkaWUsIEFESUVfUEFUSF9UWCwKLQkJCQlBRElFX1NUQUdFX0FOQUxPR19PRkYpOwotCQlhZGllX3Byb2NlZWRfdG9fc3RhZ2UoYWRpZSwgQURJRV9QQVRIX1RYLAotCQkJCUFESUVfU1RBR0VfRElHSVRBTF9PRkYpOwotCQlhZGllX2Rpc2FibGUoKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgaWNvZGVjX3J4X2Nsa19yZWZjb3VudDsKLXN0YXRpYyBpbnQgaWNvZGVjX3R4X2Nsa19yZWZjb3VudDsKLXN0YXRpYyBpbnQgZWNvZGVjX2Nsa19yZWZjb3VudDsKLXN0YXRpYyBpbnQgc2RhY19jbGtfcmVmY291bnQ7Ci0KLXN0YXRpYyB2b2lkIGVjb2RlY19jbGtfZW5hYmxlKHZvaWQpCi17Ci0JZWNvZGVjX2Nsa19yZWZjb3VudCsrOwotCWlmIChlY29kZWNfY2xrX3JlZmNvdW50ID09IDEpIHsKLQkJY2xrX3NldF9yYXRlKGVjb2RlY19jbGssIDIwNDgwMDApOwotCQljbGtfZW5hYmxlKGVjb2RlY19jbGspOwotCX0KLX0KLXN0YXRpYyB2b2lkIGVjb2RlY19jbGtfZGlzYWJsZShpbnQgZ3JvdXBfcmVzZXQsIGludCBwYXRoKQotewotCWVjb2RlY19jbGtfcmVmY291bnQtLTsKLQlpZiAoZWNvZGVjX2Nsa19yZWZjb3VudCA9PSAwKSB7Ci0JCWNsa19kaXNhYmxlKGVjb2RlY19jbGspOwotCQlpZiAoZ3JvdXBfcmVzZXQpIHsKLQkJCWlmIChwYXRoID09IEFEU1BfUEFUSF9UWCkKLQkJCQlhdWRpb190eF9kZXZpY2VfZ3JvdXAgPSAtMTsKLQkJCWVsc2UKLQkJCQlhdWRpb19yeF9kZXZpY2VfZ3JvdXAgPSAtMTsKLQkJfQotCX0KLX0KLXN0YXRpYyB2b2lkIF9hdWRpb19yeF9jbGtfZW5hYmxlKHZvaWQpCi17Ci0JdWludDMyX3QgZGV2aWNlX2dyb3VwID0gcTZfZGV2aWNlX3RvX2NvZGVjKGF1ZGlvX3J4X2RldmljZV9pZCk7Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXSByeF9jbGtfcmVmY291bnQgPSAlZFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLAotCQlpY29kZWNfcnhfY2xrX3JlZmNvdW50KTsKLQlzd2l0Y2goZGV2aWNlX2dyb3VwKSB7Ci0JY2FzZSBRNl9JQ09ERUNfUlg6Ci0JCWljb2RlY19yeF9jbGtfcmVmY291bnQrKzsKLQkJaWYgKGljb2RlY19yeF9jbGtfcmVmY291bnQgPT0gMSkgewotCQkJY2xrX3NldF9yYXRlKGljb2RlY19yeF9jbGssIDEyMjg4MDAwKTsKLQkJCWNsa19lbmFibGUoaWNvZGVjX3J4X2Nsayk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBRNl9FQ09ERUNfUlg6Ci0JCWVjb2RlY19jbGtfZW5hYmxlKCk7Ci0JCWJyZWFrOwotCWNhc2UgUTZfU0RBQ19SWDoKLQkJc2RhY19jbGtfcmVmY291bnQrKzsKLQkJaWYgKHNkYWNfY2xrX3JlZmNvdW50ID09IDEpIHsKLQkJCWNsa19zZXRfcmF0ZShzZGFjX2NsaywgMTIyODgwMDApOwotCQkJY2xrX2VuYWJsZShzZGFjX2Nsayk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuOwotCX0KLQlhdWRpb19yeF9kZXZpY2VfZ3JvdXAgPSBkZXZpY2VfZ3JvdXA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9hdWRpb190eF9jbGtfZW5hYmxlKHZvaWQpCi17Ci0JdWludDMyX3QgZGV2aWNlX2dyb3VwID0gcTZfZGV2aWNlX3RvX2NvZGVjKGF1ZGlvX3R4X2RldmljZV9pZCk7Ci0JdWludDMyX3QgaWNvZGVjX3R4X2Nsa19yYXRlOwotCi0JcHJfZGVidWcoIlslczolc10gdHhfY2xrX3JlZmNvdW50ID0gJWRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywKLQkJaWNvZGVjX3R4X2Nsa19yZWZjb3VudCk7Ci0Jc3dpdGNoIChkZXZpY2VfZ3JvdXApIHsKLQljYXNlIFE2X0lDT0RFQ19UWDoKLQkJaWNvZGVjX3R4X2Nsa19yZWZjb3VudCsrOwotCQlpZiAoaWNvZGVjX3R4X2Nsa19yZWZjb3VudCA9PSAxKSB7Ci0JCQlpZiAodHhfY2xrX2ZyZXEgPiAxNjAwMCkKLQkJCQlpY29kZWNfdHhfY2xrX3JhdGUgPSA0ODAwMDsKLQkJCWVsc2UgaWYgKHR4X2Nsa19mcmVxID4gODAwMCkKLQkJCQlpY29kZWNfdHhfY2xrX3JhdGUgPSAxNjAwMDsKLQkJCWVsc2UKLQkJCQlpY29kZWNfdHhfY2xrX3JhdGUgPSA4MDAwOwotCi0JCQljbGtfc2V0X3JhdGUoaWNvZGVjX3R4X2NsaywgaWNvZGVjX3R4X2Nsa19yYXRlICogMjU2KTsKLQkJCWNsa19lbmFibGUoaWNvZGVjX3R4X2Nsayk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBRNl9FQ09ERUNfVFg6Ci0JCWVjb2RlY19jbGtfZW5hYmxlKCk7Ci0JCWJyZWFrOwotCWNhc2UgUTZfU0RBQ19UWDoKLQkJLyogVE9ETzogSW4gUUNUIEJTUCwgY2xrIHJhdGUgd2FzIHNldCB0byAyMDQ4MDAwMCAqLwotCQlzZGFjX2Nsa19yZWZjb3VudCsrOwotCQlpZiAoc2RhY19jbGtfcmVmY291bnQgPT0gMSkgewotCQkJY2xrX3NldF9yYXRlKHNkYWNfY2xrLCAxMjI4ODAwMCk7Ci0JCQljbGtfZW5hYmxlKHNkYWNfY2xrKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm47Ci0JfQotCWF1ZGlvX3R4X2RldmljZV9ncm91cCA9IGRldmljZV9ncm91cDsKLX0KLQotc3RhdGljIHZvaWQgX2F1ZGlvX3J4X2Nsa19kaXNhYmxlKHZvaWQpCi17Ci0JcHJfZGVidWcoIlslczolc10gcnhfY2xrX3JlZmNvdW50ID0gJWRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywKLQkJaWNvZGVjX3J4X2Nsa19yZWZjb3VudCk7Ci0Jc3dpdGNoIChhdWRpb19yeF9kZXZpY2VfZ3JvdXApIHsKLQljYXNlIFE2X0lDT0RFQ19SWDoKLQkJaWNvZGVjX3J4X2Nsa19yZWZjb3VudC0tOwotCQlpZiAoaWNvZGVjX3J4X2Nsa19yZWZjb3VudCA9PSAwKSB7Ci0JCQljbGtfZGlzYWJsZShpY29kZWNfcnhfY2xrKTsKLQkJCWF1ZGlvX3J4X2RldmljZV9ncm91cCA9IC0xOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgUTZfRUNPREVDX1JYOgotCQllY29kZWNfY2xrX2Rpc2FibGUoMSwgQURTUF9QQVRIX1JYKTsKLQkJYnJlYWs7Ci0JY2FzZSBRNl9TREFDX1JYOgotCQlzZGFjX2Nsa19yZWZjb3VudC0tOwotCQlpZiAoc2RhY19jbGtfcmVmY291bnQgPT0gMCkgewotCQkJY2xrX2Rpc2FibGUoc2RhY19jbGspOwotCQkJYXVkaW9fcnhfZGV2aWNlX2dyb3VwID0gLTE7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCJbJXM6JXNdIGludmFsaWQgcnggZGV2aWNlIGdyb3VwICVkXG4iLCBfX01NX0ZJTEVfXywKLQkJCQlfX2Z1bmNfXywgYXVkaW9fcnhfZGV2aWNlX2dyb3VwKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfYXVkaW9fdHhfY2xrX2Rpc2FibGUodm9pZCkKLXsKLQlwcl9kZWJ1ZygiWyVzOiVzXSB0eF9jbGtfcmVmY291bnQgPSAlZFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLAotCQlpY29kZWNfdHhfY2xrX3JlZmNvdW50KTsKLQlzd2l0Y2ggKGF1ZGlvX3R4X2RldmljZV9ncm91cCkgewotCWNhc2UgUTZfSUNPREVDX1RYOgotCQlpY29kZWNfdHhfY2xrX3JlZmNvdW50LS07Ci0JCWlmIChpY29kZWNfdHhfY2xrX3JlZmNvdW50ID09IDApIHsKLQkJCWNsa19kaXNhYmxlKGljb2RlY190eF9jbGspOwotCQkJYXVkaW9fdHhfZGV2aWNlX2dyb3VwID0gLTE7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBRNl9FQ09ERUNfVFg6Ci0JCWVjb2RlY19jbGtfZGlzYWJsZSgxLCBBRFNQX1BBVEhfVFgpOwotCQlicmVhazsKLQljYXNlIFE2X1NEQUNfVFg6Ci0JCXNkYWNfY2xrX3JlZmNvdW50LS07Ci0JCWlmIChzZGFjX2Nsa19yZWZjb3VudCA9PSAwKSB7Ci0JCQljbGtfZGlzYWJsZShzZGFjX2Nsayk7Ci0JCQlhdWRpb190eF9kZXZpY2VfZ3JvdXAgPSAtMTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIlslczolc10gaW52YWxpZCB0eCBkZXZpY2UgZ3JvdXAgJWRcbiIsCi0JCQlfX01NX0ZJTEVfXywgX19mdW5jX18sIGF1ZGlvX3R4X2RldmljZV9ncm91cCk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX2F1ZGlvX3J4X2Nsa19yZWluaXQodWludDMyX3QgcnhfZGV2aWNlLCB1aW50MzJfdCBhY2RiX2lkKQotewotCXVpbnQzMl90IGRldmljZV9ncm91cCA9IHE2X2RldmljZV90b19jb2RlYyhyeF9kZXZpY2UpOwotCi0JcHJfZGVidWcoIlslczolc10gcnhfZGV2aWNlID0gMHgleFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLAotCQlyeF9kZXZpY2UpOwotCWlmIChkZXZpY2VfZ3JvdXAgIT0gYXVkaW9fcnhfZGV2aWNlX2dyb3VwKQotCQlfYXVkaW9fcnhfY2xrX2Rpc2FibGUoKTsKLQotCWF1ZGlvX3J4X2RldmljZV9pZCA9IHJ4X2RldmljZTsKLQlhdWRpb19yeF9wYXRoX2lkID0gcTZfZGV2aWNlX3RvX3BhdGgocnhfZGV2aWNlLCBhY2RiX2lkKTsKLQotCWlmIChkZXZpY2VfZ3JvdXAgIT0gYXVkaW9fcnhfZGV2aWNlX2dyb3VwKQotCQlfYXVkaW9fcnhfY2xrX2VuYWJsZSgpOwotCi19Ci0KLXN0YXRpYyB2b2lkIF9hdWRpb190eF9jbGtfcmVpbml0KHVpbnQzMl90IHR4X2RldmljZSwgdWludDMyX3QgYWNkYl9pZCkKLXsKLQl1aW50MzJfdCBkZXZpY2VfZ3JvdXAgPSBxNl9kZXZpY2VfdG9fY29kZWModHhfZGV2aWNlKTsKLQotCXByX2RlYnVnKCJbJXM6JXNdIHR4X2RldmljZSA9IDB4JXhcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywKLQkJdHhfZGV2aWNlKTsKLQlpZiAoZGV2aWNlX2dyb3VwICE9IGF1ZGlvX3R4X2RldmljZV9ncm91cCkKLQkJX2F1ZGlvX3R4X2Nsa19kaXNhYmxlKCk7Ci0KLQlhdWRpb190eF9kZXZpY2VfaWQgPSB0eF9kZXZpY2U7Ci0JYXVkaW9fdHhfcGF0aF9pZCA9IHE2X2RldmljZV90b19wYXRoKHR4X2RldmljZSwgYWNkYl9pZCk7Ci0KLQlpZiAoZGV2aWNlX2dyb3VwICE9IGF1ZGlvX3R4X2RldmljZV9ncm91cCkKLQkJX2F1ZGlvX3R4X2Nsa19lbmFibGUoKTsKLX0KLQotc3RhdGljIERFRklORV9NVVRFWChhdWRpb19wYXRoX2xvY2spOwotc3RhdGljIGludCBhdWRpb19yeF9wYXRoX3JlZmNvdW50Owotc3RhdGljIGludCBhdWRpb190eF9wYXRoX3JlZmNvdW50OwotCi1zdGF0aWMgaW50IGF1ZGlvX3J4X3BhdGhfZW5hYmxlKGludCBlbiwgdWludDMyX3QgYWNkYl9pZCkKLXsKLQlwcl9kZWJ1ZygiWyVzOiVzXSBlbiA9ICVkXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIGVuKTsKLQltdXRleF9sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCWlmIChlbikgewotCQlhdWRpb19yeF9wYXRoX3JlZmNvdW50Kys7Ci0JCWlmIChhdWRpb19yeF9wYXRoX3JlZmNvdW50ID09IDEpIHsKLQkJCV9hdWRpb19yeF9jbGtfZW5hYmxlKCk7Ci0JCQlfYXVkaW9fcnhfcGF0aF9lbmFibGUoMCwgYWNkYl9pZCk7Ci0JCX0KLQl9IGVsc2UgewotCQlhdWRpb19yeF9wYXRoX3JlZmNvdW50LS07Ci0JCWlmIChhdWRpb19yeF9wYXRoX3JlZmNvdW50ID09IDApIHsKLQkJCV9hdWRpb19yeF9wYXRoX2Rpc2FibGUoKTsKLQkJCV9hdWRpb19yeF9jbGtfZGlzYWJsZSgpOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb190eF9wYXRoX2VuYWJsZShpbnQgZW4sIHVpbnQzMl90IGFjZGJfaWQpCi17Ci0JcHJfZGVidWcoIlslczolc10gZW4gPSAlZFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBlbik7Ci0JbXV0ZXhfbG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQlpZiAoZW4pIHsKLQkJYXVkaW9fdHhfcGF0aF9yZWZjb3VudCsrOwotCQlpZiAoYXVkaW9fdHhfcGF0aF9yZWZjb3VudCA9PSAxKSB7Ci0JCQlfYXVkaW9fdHhfY2xrX2VuYWJsZSgpOwotCQkJX2F1ZGlvX3R4X3BhdGhfZW5hYmxlKDAsIGFjZGJfaWQpOwotCQl9Ci0JfSBlbHNlIHsKLQkJYXVkaW9fdHhfcGF0aF9yZWZjb3VudC0tOwotCQlpZiAoYXVkaW9fdHhfcGF0aF9yZWZjb3VudCA9PSAwKSB7Ci0JCQlfYXVkaW9fdHhfcGF0aF9kaXNhYmxlKCk7Ci0JCQlfYXVkaW9fdHhfY2xrX2Rpc2FibGUoKTsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvX3BhdGhfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBxNmF1ZGlvX3VwZGF0ZV9hY2RiKHVpbnQzMl90IGlkX3NyYywgdWludDMyX3QgaWRfZHN0KQotewotCWludCByZXM7Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXSBpZF9zcmMgPSAweCV4XG4sIGlkX2RzdCA9IDB4JXhcbiIsIF9fTU1fRklMRV9fLAotCQlfX2Z1bmNfXywgaWRfc3JjLCBpZF9kc3QpOwotCWlmIChxNmF1ZGlvX2luaXQoKSkKLQkJcmV0dXJuIDA7Ci0KLQltdXRleF9sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCi0JaWYgKHE2X2RldmljZV90b19kaXIoaWRfZHN0KSA9PSBRNl9SWCkKLQkJcWRzcDZfZGV2Y2hnX25vdGlmeShhY19jb250cm9sLCBBRFNQX0FVRElPX1JYX0RFVklDRSwgaWRfZHN0KTsKLQllbHNlCi0JCXFkc3A2X2RldmNoZ19ub3RpZnkoYWNfY29udHJvbCwgQURTUF9BVURJT19UWF9ERVZJQ0UsIGlkX2RzdCk7Ci0JcmVzID0gYXVkaW9fdXBkYXRlX2FjZGIoaWRfZHN0LCBpZF9zcmMpOwotCWlmIChyZXMpCi0JCWdvdG8gZG9uZTsKLQotCXFkc3A2X3N0YW5kYnkoYWNfY29udHJvbCk7Ci0JcWRzcDZfc3RhcnQoYWNfY29udHJvbCk7Ci1kb25lOgotCW11dGV4X3VubG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQlyZXR1cm4gcmVzOwotfQotCi1pbnQgcTZhdWRpb19zZXRfdHhfbXV0ZShpbnQgbXV0ZSkKLXsKLQl1aW50MzJfdCBhZGV2OwotCWludCByYzsKLQotCWlmIChxNmF1ZGlvX2luaXQoKSkKLQkJcmV0dXJuIDA7Ci0KLQltdXRleF9sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCi0JaWYgKG11dGUgPT0gdHhfbXV0ZV9zdGF0dXMpIHsKLQkJbXV0ZXhfdW5sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlhZGV2ID0gYXVkaW9fdHhfZGV2aWNlX2lkOwotCXJjID0gYXVkaW9fdHhfbXV0ZShhY19jb250cm9sLCBhZGV2LCBtdXRlKTsKLQotCS8qIERTUCBjYWNoZXMgdGhlIHJlcXVlc3RlZCBNVVRFIHN0YXRlIHdoZW4gaXQgY2Fubm90IGFwcGx5IHRoZSBzdGF0ZQotCSAgaW1tZWRpYXRlbHkuIEluIHRoYXQgY2FzZSwgaXQgcmV0dXJucyBFVU5TVVBQT1JURUQgYW5kIGFwcGxpZXMgdGhlCi0JICBjYWNoZWQgc3RhdGUgbGF0ZXIgKi8KLQlpZiAoKHJjID09IEFEU1BfQVVESU9fU1RBVFVTX1NVQ0NFU1MpIHx8Ci0JCQkocmMgPT0gQURTUF9BVURJT19TVEFUVVNfRVVOU1VQUE9SVEVEKSkgewotCQlwcl9kZWJ1ZygiWyVzOiVzXSByZXR1cm4gc3RhdHVzID0gJWRcbiIsCi0JCQlfX01NX0ZJTEVfXywgX19mdW5jX18sIHJjKTsKLQkJdHhfbXV0ZV9zdGF0dXMgPSBtdXRlOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvX3BhdGhfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBxNmF1ZGlvX3NldF9zdHJlYW1fdm9sdW1lKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgdm9sKQotewotCWlmICh2b2wgPiAxMjAwIHx8IHZvbCA8IC00MDAwKSB7Ci0JCXByX2VycigiWyVzOiVzXSB1bnN1cHBvcnRlZCB2b2x1bWUgbGV2ZWwgJWRcbiIsIF9fTU1fRklMRV9fLAotCQkJCV9fZnVuY19fLCB2b2wpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfbG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQlhdWRpb19zdHJlYW1fbXV0ZShhYywgMCk7Ci0JYXVkaW9fc3RyZWFtX3ZvbHVtZShhYywgdm9sKTsKLQltdXRleF91bmxvY2soJmF1ZGlvX3BhdGhfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBxNmF1ZGlvX3NldF9yeF92b2x1bWUoaW50IGxldmVsKQotewotCXVpbnQzMl90IGFkZXY7Ci0JaW50IHZvbDsKLQotCXByX2RlYnVnKCJbJXM6JXNdIGxldmVsID0gJWRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywgbGV2ZWwpOwotCWlmIChxNmF1ZGlvX2luaXQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAobGV2ZWwgPCAwIHx8IGxldmVsID4gMTAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmF1ZGlvX3BhdGhfbG9jayk7Ci0JYWRldiA9IEFEU1BfQVVESU9fREVWSUNFX0lEX1ZPSUNFOwotCi0JaWYgKGxldmVsKSB7Ci0JCXZvbCA9IHE2X2RldmljZV92b2x1bWUoYXVkaW9fcnhfZGV2aWNlX2lkLCBsZXZlbCk7Ci0JCWF1ZGlvX3J4X211dGUoYWNfY29udHJvbCwgYWRldiwgMCk7Ci0JCWF1ZGlvX3J4X3ZvbHVtZShhY19jb250cm9sLCBhZGV2LCB2b2wpOwotCX0gZWxzZQotCQlhdWRpb19yeF9tdXRlKGFjX2NvbnRyb2wsIGFkZXYsIDEpOwotCi0Jcnhfdm9sX2xldmVsID0gbGV2ZWw7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkb19yeF9yb3V0aW5nKHVpbnQzMl90IGRldmljZV9pZCwgdWludDMyX3QgYWNkYl9pZCkKLXsKLQlwcl9kZWJ1ZygiWyVzOiVzXSBkZXZpY2VfaWQgPSAweCV4LCBhY2RiX2lkID0gMHgleFxuIiwgX19NTV9GSUxFX18sCi0JCV9fZnVuY19fLCBkZXZpY2VfaWQsIGFjZGJfaWQpOwotCWlmIChkZXZpY2VfaWQgPT0gYXVkaW9fcnhfZGV2aWNlX2lkICYmCi0JCWF1ZGlvX3J4X3BhdGhfaWQgPT0gcTZfZGV2aWNlX3RvX3BhdGgoZGV2aWNlX2lkLCBhY2RiX2lkKSkgewotCQlpZiAoYWNkYl9pZCAhPSByeF9hY2RiKSB7Ci0JCQlxZHNwNl9kZXZjaGdfbm90aWZ5KGFjX2NvbnRyb2wsIEFEU1BfQVVESU9fUlhfREVWSUNFLCBkZXZpY2VfaWQpOwotCQkJYXVkaW9fdXBkYXRlX2FjZGIoZGV2aWNlX2lkLCBhY2RiX2lkKTsKLQkJCXFkc3A2X3N0YW5kYnkoYWNfY29udHJvbCk7Ci0JCQlxZHNwNl9zdGFydChhY19jb250cm9sKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGF1ZGlvX3J4X3BhdGhfcmVmY291bnQgPiAwKSB7Ci0JCXFkc3A2X2RldmNoZ19ub3RpZnkoYWNfY29udHJvbCwgQURTUF9BVURJT19SWF9ERVZJQ0UsIGRldmljZV9pZCk7Ci0JCV9hdWRpb19yeF9wYXRoX2Rpc2FibGUoKTsKLQkJX2F1ZGlvX3J4X2Nsa19yZWluaXQoZGV2aWNlX2lkLCBhY2RiX2lkKTsKLQkJX2F1ZGlvX3J4X3BhdGhfZW5hYmxlKDEsIGFjZGJfaWQpOwotCX0gZWxzZSB7Ci0JCXFkc3A2X2RldmNoZ19ub3RpZnkoYWNfY29udHJvbCwgQURTUF9BVURJT19SWF9ERVZJQ0UsCi0JCQkJCSBkZXZpY2VfaWQpOwotCQlhdWRpb191cGRhdGVfYWNkYihkZXZpY2VfaWQsIGFjZGJfaWQpOwotCQlxZHNwNl9zdGFuZGJ5KGFjX2NvbnRyb2wpOwotCQlxZHNwNl9zdGFydChhY19jb250cm9sKTsKLQkJYXVkaW9fcnhfZGV2aWNlX2lkID0gZGV2aWNlX2lkOwotCQlhdWRpb19yeF9wYXRoX2lkID0gcTZfZGV2aWNlX3RvX3BhdGgoZGV2aWNlX2lkLCBhY2RiX2lkKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX3R4X3JvdXRpbmcodWludDMyX3QgZGV2aWNlX2lkLCB1aW50MzJfdCBhY2RiX2lkKQotewotCXByX2RlYnVnKCJbJXM6JXNdIGRldmljZV9pZCA9IDB4JXgsIGFjZGJfaWQgPSAweCV4XG4iLCBfX01NX0ZJTEVfXywKLQkJX19mdW5jX18sIGRldmljZV9pZCwgYWNkYl9pZCk7Ci0JaWYgKGRldmljZV9pZCA9PSBhdWRpb190eF9kZXZpY2VfaWQgJiYKLQkJYXVkaW9fdHhfcGF0aF9pZCA9PSBxNl9kZXZpY2VfdG9fcGF0aChkZXZpY2VfaWQsIGFjZGJfaWQpKSB7Ci0JCWlmIChhY2RiX2lkICE9IHR4X2FjZGIpIHsKLQkJCXFkc3A2X2RldmNoZ19ub3RpZnkoYWNfY29udHJvbCwgQURTUF9BVURJT19UWF9ERVZJQ0UsCi0JCQkJCQkgZGV2aWNlX2lkKTsKLQkJCWF1ZGlvX3VwZGF0ZV9hY2RiKGRldmljZV9pZCwgYWNkYl9pZCk7Ci0JCQlxZHNwNl9zdGFuZGJ5KGFjX2NvbnRyb2wpOwotCQkJcWRzcDZfc3RhcnQoYWNfY29udHJvbCk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCWlmIChhdWRpb190eF9wYXRoX3JlZmNvdW50ID4gMCkgewotCQlxZHNwNl9kZXZjaGdfbm90aWZ5KGFjX2NvbnRyb2wsIEFEU1BfQVVESU9fVFhfREVWSUNFLCBkZXZpY2VfaWQpOwotCQlfYXVkaW9fdHhfcGF0aF9kaXNhYmxlKCk7Ci0JCV9hdWRpb190eF9jbGtfcmVpbml0KGRldmljZV9pZCwgYWNkYl9pZCk7Ci0JCV9hdWRpb190eF9wYXRoX2VuYWJsZSgxLCBhY2RiX2lkKTsKLQl9IGVsc2UgewotCQlxZHNwNl9kZXZjaGdfbm90aWZ5KGFjX2NvbnRyb2wsIEFEU1BfQVVESU9fVFhfREVWSUNFLAotCQkJCQkgZGV2aWNlX2lkKTsKLQkJYXVkaW9fdXBkYXRlX2FjZGIoZGV2aWNlX2lkLCBhY2RiX2lkKTsKLQkJcWRzcDZfc3RhbmRieShhY19jb250cm9sKTsKLQkJcWRzcDZfc3RhcnQoYWNfY29udHJvbCk7Ci0JCWF1ZGlvX3R4X2RldmljZV9pZCA9IGRldmljZV9pZDsKLQkJYXVkaW9fdHhfcGF0aF9pZCA9IHE2X2RldmljZV90b19wYXRoKGRldmljZV9pZCwgYWNkYl9pZCk7Ci0JCXR4X2FjZGIgPSBhY2RiX2lkOwotCX0KLX0KLQotaW50IHE2YXVkaW9fZG9fcm91dGluZyh1aW50MzJfdCBkZXZpY2VfaWQsIHVpbnQzMl90IGFjZGJfaWQpCi17Ci0JaWYgKHE2YXVkaW9faW5pdCgpKQotCQlyZXR1cm4gMDsKLQotCW11dGV4X2xvY2soJmF1ZGlvX3BhdGhfbG9jayk7Ci0KLQlzd2l0Y2gocTZfZGV2aWNlX3RvX2RpcihkZXZpY2VfaWQpKSB7Ci0JY2FzZSBRNl9SWDoKLQkJZG9fcnhfcm91dGluZyhkZXZpY2VfaWQsIGFjZGJfaWQpOwotCQlicmVhazsKLQljYXNlIFE2X1RYOgotCQlkb190eF9yb3V0aW5nKGRldmljZV9pZCwgYWNkYl9pZCk7Ci0JCWJyZWFrOwotCX0KLQotCW11dGV4X3VubG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHE2YXVkaW9fc2V0X3JvdXRlKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JdWludDMyX3Qgcm91dGU7Ci0JaWYgKCFzdHJjbXAobmFtZSwgInNwZWFrZXIiKSkgewotCQlyb3V0ZSA9IEFESUVfUEFUSF9TUEVBS0VSX1NURVJFT19SWDsKLQl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImhlYWRwaG9uZXMiKSkgewotCQlyb3V0ZSA9IEFESUVfUEFUSF9IRUFEU0VUX1NURVJFT19SWDsKLQl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImhhbmRzZXQiKSkgewotCQlyb3V0ZSA9IEFESUVfUEFUSF9IQU5EU0VUX1JYOwotCX0gZWxzZSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvX3BhdGhfbG9jayk7Ci0JaWYgKHJvdXRlID09IGF1ZGlvX3J4X3BhdGhfaWQpCi0JCWdvdG8gZG9uZTsKLQotCWF1ZGlvX3J4X3BhdGhfaWQgPSByb3V0ZTsKLQotCWlmIChhdWRpb19yeF9wYXRoX3JlZmNvdW50ID4gMCkgewotCQlfYXVkaW9fcnhfcGF0aF9kaXNhYmxlKCk7Ci0JCV9hdWRpb19yeF9wYXRoX2VuYWJsZSgxLCAwKTsKLQl9Ci0JaWYgKGF1ZGlvX3R4X3BhdGhfcmVmY291bnQgPiAwKSB7Ci0JCV9hdWRpb190eF9wYXRoX2Rpc2FibGUoKTsKLQkJX2F1ZGlvX3R4X3BhdGhfZW5hYmxlKDEsIDApOwotCX0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX3N0cmVhbV9lcXVhbGl6ZXIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHZvaWQgKmVxX2NvbmZpZykKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgYWRzcF9zZXRfZXF1YWxpemVyX2NvbW1hbmQgcnBjOwotCXN0cnVjdCBhZHNwX2F1ZGlvX2VxX3N0cmVhbV9jb25maWcgKmVxX2NmZzsKLQllcV9jZmcgPSAoc3RydWN0IGFkc3BfYXVkaW9fZXFfc3RyZWFtX2NvbmZpZyAqKSBlcV9jb25maWc7Ci0KLQltZW1zZXQoJnJwYywgMCwgc2l6ZW9mKHJwYykpOwotCi0JcnBjLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX1NFVF9TRVNTSU9OX0VRX0NPTkZJRzsKLQlycGMuZW5hYmxlID0gZXFfY2ZnLT5lbmFibGU7Ci0JcnBjLm51bV9iYW5kcyA9IGVxX2NmZy0+bnVtX2JhbmRzOwotCWZvciAoaSA9IDA7IGkgPCBlcV9jZmctPm51bV9iYW5kczsgaSsrKSB7Ci0JCXJwYy5lcV9iYW5kc1tpXS5iYW5kX2lkeCA9IGVxX2NmZy0+ZXFfYmFuZHNbaV0uYmFuZF9pZHg7Ci0JCXJwYy5lcV9iYW5kc1tpXS5maWx0ZXJfdHlwZSA9IGVxX2NmZy0+ZXFfYmFuZHNbaV0uZmlsdGVyX3R5cGU7Ci0JCXJwYy5lcV9iYW5kc1tpXS5jZW50ZXJfZnJlcV9oeiA9Ci0JCQkJCWVxX2NmZy0+ZXFfYmFuZHNbaV0uY2VudGVyX2ZyZXFfaHo7Ci0JCXJwYy5lcV9iYW5kc1tpXS5maWx0ZXJfZ2FpbiA9IGVxX2NmZy0+ZXFfYmFuZHNbaV0uZmlsdGVyX2dhaW47Ci0JCXJwYy5lcV9iYW5kc1tpXS5xX2ZhY3RvciA9IGVxX2NmZy0+ZXFfYmFuZHNbaV0ucV9mYWN0b3I7Ci0JfQotCXJldHVybiBhdWRpb19pb2N0bChhYywgJnJwYywgc2l6ZW9mKHJwYykpOwotfQotCi1pbnQgcTZhdWRpb19zZXRfc3RyZWFtX2VxX3BjbShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdm9pZCAqZXFfY29uZmlnKQotewotCWludCByYyA9IDA7Ci0JbXV0ZXhfbG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQlyYyA9IGF1ZGlvX3N0cmVhbV9lcXVhbGl6ZXIoYWMsIGVxX2NvbmZpZyk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RydWN0IGF1ZGlvX2NsaWVudCAqcTZhdWRpb19vcGVuX2F1eHBjbSh1aW50MzJfdCByYXRlLAotCQkJCSAgICAgIHVpbnQzMl90IGNoYW5uZWxzLCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgYWNkYl9pZCkKLXsKLQlpbnQgcmMsIHJldHJ5ID0gNTsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYzsKLQotCXByX2RlYnVnKCJbJXM6JXNdIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLAotCQlyYXRlLCBjaGFubmVscyk7Ci0JaWYgKHE2YXVkaW9faW5pdCgpKQotCQlyZXR1cm4gTlVMTDsKLQlhYyA9IGF1ZGlvX2NsaWVudF9hbGxvYygwKTsKLQlpZiAoIWFjKQotCQlyZXR1cm4gTlVMTDsKLQotCWFjLT5mbGFncyA9IGZsYWdzOwotCi0JbXV0ZXhfbG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQotCWlmIChhYy0+ZmxhZ3MgJiBBVURJT19GTEFHX1dSSVRFKSB7Ci0JCWF1ZGlvX3R4X3BhdGhfcmVmY291bnQrKzsKLQkJaWYgKGF1ZGlvX3R4X3BhdGhfcmVmY291bnQgPT0gMSkgewotCQkJdHhfY2xrX2ZyZXEgPSByYXRlOwotCQkJX2F1ZGlvX3R4X2Nsa19lbmFibGUoKTsKLQkJCV9hdWRpb190eF9wYXRoX2VuYWJsZSgwLCBhY2RiX2lkKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWF1ZGlvX3J4X3BhdGhfcmVmY291bnQrKzsKLQkJaWYgKGF1ZGlvX3J4X3BhdGhfcmVmY291bnQgPT0gMSkgewotCQkJX2F1ZGlvX3J4X2Nsa19lbmFibGUoKTsKLQkJCV9hdWRpb19yeF9wYXRoX2VuYWJsZSgwLCBhY2RiX2lkKTsKLQkJfQotCX0KLQotCWVjb2RlY19jbGtfZW5hYmxlKCk7Ci0KLQlmb3IgKHJldHJ5ID0gNTs7IHJldHJ5LS0pIHsKLQkJaWYgKGFjLT5mbGFncyAmIEFVRElPX0ZMQUdfV1JJVEUpCi0JCQlyYyA9IGF1ZGlvX2F1eHBjbV9vdXRfb3BlbihhYywgcmF0ZSwgY2hhbm5lbHMpOwotCQllbHNlCi0JCQlyYyA9IGF1ZGlvX2F1eHBjbV9pbl9vcGVuKGFjLCByYXRlLCBjaGFubmVscyk7Ci0JCWlmIChyYyA9PSAwKQotCQkJYnJlYWs7Ci0JCWlmIChyZXRyeSA9PSAwKQotCQkJcTZhdWRpb19kc3Bfbm90X3Jlc3BvbmRpbmcoKTsKLQotCQlwcl9lcnIoIlslczolc10gb3BlbiBwY20gZXJyb3IgJWQsIHJldHJ5aW5nXG4iLAotCQkJX19NTV9GSUxFX18sIF9fZnVuY19fLCByYyk7Ci0JCW1zbGVlcCgxKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJmF1ZGlvX3BhdGhfbG9jayk7Ci0KLQlmb3IgKHJldHJ5ID0gNTs7IHJldHJ5LS0pIHsKLQkJcmMgPSBhdWRpb19jb21tYW5kKGFjLCBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVNTSU9OX1NUQVJUKTsKLQkJaWYgKHJjID09IDApCi0JCQlicmVhazsKLQkJaWYgKHJldHJ5ID09IDApCi0JCQlxNmF1ZGlvX2RzcF9ub3RfcmVzcG9uZGluZygpOwotCi0JCXByX2VycigiWyVzOiVzXSBzdHJlYW0gc3RhcnQgZXJyb3IgJWQsIHJldHJ5aW5nXG4iLAotCQkJX19NTV9GSUxFX18sIF9fZnVuY19fLCByYyk7Ci0JfQotCWF1ZGlvX3ByZXZlbnRfc2xlZXAoKTsKLQlyZXR1cm4gYWM7Ci0KLX0KLQotc3RydWN0IGF1ZGlvX2NsaWVudCAqcTZhdWRpb19vcGVuX3BjbSh1aW50MzJfdCBidWZzeiwgdWludDMyX3QgcmF0ZSwKLQkJICAgICAgdWludDMyX3QgY2hhbm5lbHMsIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCBhY2RiX2lkKQotewotCWludCByYywgcmV0cnkgPSA1OwotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCi0JcHJfZGVidWcoIlslczolc10gYnVmc3ogPSAlZCwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkXG4iLCBfX01NX0ZJTEVfXywKLQkJX19mdW5jX18sIGJ1ZnN6LCByYXRlLCBjaGFubmVscyk7Ci0JaWYgKHE2YXVkaW9faW5pdCgpKQotCQlyZXR1cm4gMDsKLQotCWFjID0gYXVkaW9fY2xpZW50X2FsbG9jKGJ1ZnN6KTsKLQlpZiAoIWFjKQotCQlyZXR1cm4gMDsKLQotCWFjLT5mbGFncyA9IGZsYWdzOwotCi0JbXV0ZXhfbG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQotCWlmIChhYy0+ZmxhZ3MgJiBBVURJT19GTEFHX1dSSVRFKSB7Ci0JCWF1ZGlvX3J4X3BhdGhfcmVmY291bnQrKzsKLQkJaWYgKGF1ZGlvX3J4X3BhdGhfcmVmY291bnQgPT0gMSkgewotCQkJX2F1ZGlvX3J4X2Nsa19lbmFibGUoKTsKLQkJCXE2X3J4X3BhdGhfZW5hYmxlKDAsIGFjZGJfaWQpOwotCQkJYWRpZV9yeF9wYXRoX2VuYWJsZShhY2RiX2lkKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIFRPRE86IGNvbnNpZGVyIGNvbmN1cnJlbmN5IHdpdGggdm9pY2UgY2FsbCAqLwotCQlhdWRpb190eF9wYXRoX3JlZmNvdW50Kys7Ci0JCWlmIChhdWRpb190eF9wYXRoX3JlZmNvdW50ID09IDEpIHsKLQkJCXR4X2Nsa19mcmVxID0gcmF0ZTsKLQkJCV9hdWRpb190eF9jbGtfZW5hYmxlKCk7Ci0JCQlfYXVkaW9fdHhfcGF0aF9lbmFibGUoMCwgYWNkYl9pZCk7Ci0JCX0KLQl9Ci0KLQlmb3IgKHJldHJ5ID0gNTs7cmV0cnktLSkgewotCQlpZiAoYWMtPmZsYWdzICYgQVVESU9fRkxBR19XUklURSkKLQkJCXJjID0gYXVkaW9fb3V0X29wZW4oYWMsIGJ1ZnN6LCByYXRlLCBjaGFubmVscyk7Ci0JCWVsc2UKLQkJCXJjID0gYXVkaW9faW5fb3BlbihhYywgYnVmc3osIGZsYWdzLCByYXRlLCBjaGFubmVscyk7Ci0JCWlmIChyYyA9PSAwKQotCQkJYnJlYWs7Ci0JCWlmIChyZXRyeSA9PSAwKQotCQkJcTZhdWRpb19kc3Bfbm90X3Jlc3BvbmRpbmcoKTsKLQotCQlwcl9lcnIoIlslczolc10gb3BlbiBwY20gZXJyb3IgJWQsIHJldHJ5aW5nXG4iLAotCQkJX19NTV9GSUxFX18sIF9fZnVuY19fLCByYyk7Ci0JCW1zbGVlcCgxKTsKLQl9Ci0KLQlpZiAoYWMtPmZsYWdzICYgQVVESU9fRkxBR19XUklURSkgewotCQlpZiAoYXVkaW9fcnhfcGF0aF9yZWZjb3VudCA9PSAxKQotCQkJYXVkaW9fcnhfYW5hbG9nX2VuYWJsZSgxKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpb19wYXRoX2xvY2spOwotCi0JZm9yIChyZXRyeSA9IDU7O3JldHJ5LS0pIHsKLQkJcmMgPSBhdWRpb19jb21tYW5kKGFjLCBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVNTSU9OX1NUQVJUKTsKLQkJaWYgKHJjID09IDApCi0JCQlicmVhazsKLQkJaWYgKHJldHJ5ID09IDApCi0JCQlxNmF1ZGlvX2RzcF9ub3RfcmVzcG9uZGluZygpOwotCi0JCXByX2VycigiWyVzOiVzXSBzdHJlYW0gc3RhcnQgZXJyb3IgJWQsIHJldHJ5aW5nXG4iLAotCQkJX19NTV9GSUxFX18sIF9fZnVuY19fLCByYyk7Ci0JfQotCi0JaWYgKCEoYWMtPmZsYWdzICYgQVVESU9fRkxBR19XUklURSkpIHsKLQkJYWMtPmJ1ZlswXS51c2VkID0gMTsKLQkJYWMtPmJ1ZlsxXS51c2VkID0gMTsKLQkJcTZhdWRpb19yZWFkKGFjLCAmYWMtPmJ1ZlswXSk7Ci0JCXE2YXVkaW9fcmVhZChhYywgJmFjLT5idWZbMV0pOwotCX0KLQotCWF1ZGlvX3ByZXZlbnRfc2xlZXAoKTsKLQlyZXR1cm4gYWM7Ci19Ci0KLWludCBxNmF1ZGlvX2Nsb3NlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCWF1ZGlvX2Nsb3NlKGFjKTsKLQlpZiAoYWMtPmZsYWdzICYgQVVESU9fRkxBR19XUklURSkKLQkJYXVkaW9fcnhfcGF0aF9lbmFibGUoMCwgMCk7Ci0JZWxzZQotCQlhdWRpb190eF9wYXRoX2VuYWJsZSgwLCAwKTsKLQlhdWRpb19jbGllbnRfZnJlZShhYyk7Ci0JYXVkaW9fYWxsb3dfc2xlZXAoKTsKLQlwcl9kZWJ1ZygiWyVzOiVzXSBhYyA9ICVwXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIGFjKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHE2YXVkaW9fYXV4cGNtX2Nsb3NlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCWF1ZGlvX2Nsb3NlKGFjKTsKLQlpZiAoYWMtPmZsYWdzICYgQVVESU9fRkxBR19XUklURSkgewotCQlhdWRpb190eF9wYXRoX2VuYWJsZSgwLCAwKTsKLQkJZWNvZGVjX2Nsa19kaXNhYmxlKDAsIEFEU1BfUEFUSF9SWCk7Ci0JfSBlbHNlIHsKLQkJYXVkaW9fcnhfcGF0aF9lbmFibGUoMCwgMCk7Ci0JCWVjb2RlY19jbGtfZGlzYWJsZSgwLCBBRFNQX1BBVEhfVFgpOwotCX0KLQotCWF1ZGlvX2NsaWVudF9mcmVlKGFjKTsKLQlhdWRpb19hbGxvd19zbGVlcCgpOwotCXByX2RlYnVnKCJbJXM6JXNdIGFjID0gJXBcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywgYWMpOwotCXJldHVybiAwOwotfQotc3RydWN0IGF1ZGlvX2NsaWVudCAqcTZ2b2ljZV9vcGVuKHVpbnQzMl90IGZsYWdzKQotewotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCi0JcHJfZGVidWcoIlslczolc10gZmxhZ3MgPSAlZFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBmbGFncyk7Ci0JaWYgKHE2YXVkaW9faW5pdCgpKQotCQlyZXR1cm4gMDsKLQotCWFjID0gYXVkaW9fY2xpZW50X2FsbG9jKDApOwotCWlmICghYWMpCi0JCXJldHVybiAwOwotCi0JYWMtPmZsYWdzID0gZmxhZ3M7Ci0JaWYgKGFjLT5mbGFncyAmIEFVRElPX0ZMQUdfV1JJVEUpCi0JCWF1ZGlvX3J4X3BhdGhfZW5hYmxlKDEsIHJ4X2FjZGIpOwotCWVsc2UgewotCQlpZiAoIWF1ZGlvX3R4X3BhdGhfcmVmY291bnQpCi0JCQl0eF9jbGtfZnJlcSA9IDgwMDA7Ci0JCWF1ZGlvX3R4X3BhdGhfZW5hYmxlKDEsIHR4X2FjZGIpOwotCX0KLQotCXJldHVybiBhYzsKLX0KLQotaW50IHE2dm9pY2VfY2xvc2Uoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCi17Ci0JaWYgKGFjLT5mbGFncyAmIEFVRElPX0ZMQUdfV1JJVEUpCi0JCWF1ZGlvX3J4X3BhdGhfZW5hYmxlKDAsIDApOwotCWVsc2UKLQkJYXVkaW9fdHhfcGF0aF9lbmFibGUoMCwgMCk7Ci0KLQl0eF9tdXRlX3N0YXR1cyA9IDA7Ci0JYXVkaW9fY2xpZW50X2ZyZWUoYWMpOwotCXByX2RlYnVnKCJbJXM6JXNdXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgYXVkaW9fY2xpZW50ICpxNmF1ZGlvX29wZW5fbXAzKHVpbnQzMl90IGJ1ZnN6LCB1aW50MzJfdCByYXRlLAotCQkJCSAgICAgIHVpbnQzMl90IGNoYW5uZWxzLCB1aW50MzJfdCBhY2RiX2lkKQotewotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCi0JcHJfZGVidWcoIlslczolc10gYnVmc3ogPSAlZCwgcmF0ZSA9ICVkXG4sIGNoYW5uZWxzID0gJWQiLAotCQlfX01NX0ZJTEVfXywgX19mdW5jX18sIGJ1ZnN6LCByYXRlLCBjaGFubmVscyk7Ci0KLQlpZiAocTZhdWRpb19pbml0KCkpCi0JCXJldHVybiAwOwotCi0JYWMgPSBhdWRpb19jbGllbnRfYWxsb2MoYnVmc3opOwotCWlmICghYWMpCi0JCXJldHVybiAwOwotCi0JYWMtPmZsYWdzID0gQVVESU9fRkxBR19XUklURTsKLQlhdWRpb19yeF9wYXRoX2VuYWJsZSgxLCBhY2RiX2lkKTsKLQotCWF1ZGlvX21wM19vcGVuKGFjLCBidWZzeiwgcmF0ZSwgY2hhbm5lbHMpOwotCWF1ZGlvX2NvbW1hbmQoYWMsIEFEU1BfQVVESU9fSU9DVExfQ01EX1NFU1NJT05fU1RBUlQpOwotCi0JbXV0ZXhfbG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQlhdWRpb19yeF9tdXRlKGFjX2NvbnRyb2wsIGF1ZGlvX3J4X2RldmljZV9pZCwgMCk7Ci0JYXVkaW9fcnhfdm9sdW1lKGFjX2NvbnRyb2wsIGF1ZGlvX3J4X2RldmljZV9pZCwKLQkJCXE2X2RldmljZV92b2x1bWUoYXVkaW9fcnhfZGV2aWNlX2lkLCByeF92b2xfbGV2ZWwpKTsKLQltdXRleF91bmxvY2soJmF1ZGlvX3BhdGhfbG9jayk7Ci0JcmV0dXJuIGFjOwotfQotCi1zdHJ1Y3QgYXVkaW9fY2xpZW50ICpxNmF1ZGlvX29wZW5fZHRtZih1aW50MzJfdCByYXRlLAotCQkJCSAgICAgIHVpbnQzMl90IGNoYW5uZWxzLCB1aW50MzJfdCBhY2RiX2lkKQotewotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCi0JcHJfZGVidWcoIlslczolc10gcmF0ZSA9ICVkXG4sIGNoYW5uZWxzID0gJWQiLCBfX01NX0ZJTEVfXywgX19mdW5jX18sCi0JCSByYXRlLCBjaGFubmVscyk7Ci0JaWYgKHE2YXVkaW9faW5pdCgpKQotCQlyZXR1cm4gMDsKLQotCWFjID0gYXVkaW9fY2xpZW50X2FsbG9jKDApOwotCWlmICghYWMpCi0JCXJldHVybiAwOwotCi0JYWMtPmZsYWdzID0gQVVESU9fRkxBR19XUklURTsKLQlhdWRpb19yeF9wYXRoX2VuYWJsZSgxLCBhY2RiX2lkKTsKLQotCWF1ZGlvX2R0bWZfb3BlbihhYywgcmF0ZSwgY2hhbm5lbHMpOwotCWF1ZGlvX2NvbW1hbmQoYWMsIEFEU1BfQVVESU9fSU9DVExfQ01EX1NFU1NJT05fU1RBUlQpOwotCi0JbXV0ZXhfbG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQlhdWRpb19yeF9tdXRlKGFjX2NvbnRyb2wsIGF1ZGlvX3J4X2RldmljZV9pZCwgMCk7Ci0JYXVkaW9fcnhfdm9sdW1lKGFjX2NvbnRyb2wsIGF1ZGlvX3J4X2RldmljZV9pZCwKLQkJcTZfZGV2aWNlX3ZvbHVtZShhdWRpb19yeF9kZXZpY2VfaWQsIHJ4X3ZvbF9sZXZlbCkpOwotCW11dGV4X3VubG9jaygmYXVkaW9fcGF0aF9sb2NrKTsKLQotCXJldHVybiBhYzsKLX0KLQotaW50IHE2YXVkaW9fcGxheV9kdG1mKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MTZfdCBkdG1mX2hpLAotCQkJIHVpbnQxNl90IGR0bWZfbG93LCB1aW50MTZfdCBkdXJhdGlvbiwgdWludDE2X3QgcnhfZ2FpbikKLXsKLQlzdHJ1Y3QgYWRzcF9hdWRpb19kdG1mX3N0YXJ0X2NvbW1hbmQgZHRtZl9jbWQ7Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXSBoaWdoID0gJWQsIGxvdyA9ICVkXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sCi0JCWR0bWZfaGksIGR0bWZfbG93KTsKLQotCWR0bWZfY21kLmhkci5vcGNvZGUgPSBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVNTSU9OX0RUTUZfU1RBUlQ7Ci0JZHRtZl9jbWQuaGRyLnJlc3BvbnNlX3R5cGUgPSBBRFNQX0FVRElPX1JFU1BPTlNFX0NPTU1BTkQ7Ci0JZHRtZl9jbWQudG9uZTFfaHogPSBkdG1mX2hpOwotCWR0bWZfY21kLnRvbmUyX2h6ID0gZHRtZl9sb3c7Ci0JZHRtZl9jbWQuZHVyYXRpb25fdXNlYyA9IGR1cmF0aW9uICogMTAwMDsKLQlkdG1mX2NtZC5nYWluX21iID0gcnhfZ2FpbjsKLQotCXJldHVybiBhdWRpb19pb2N0bChhYywgJmR0bWZfY21kLAotCQkgc2l6ZW9mKHN0cnVjdCBhZHNwX2F1ZGlvX2R0bWZfc3RhcnRfY29tbWFuZCkpOwotCi19Ci0KLWludCBxNmF1ZGlvX21wM19jbG9zZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYykKLXsKLQlwcl9kZWJ1ZygiWyVzOiVzXVxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQlhdWRpb19jbG9zZShhYyk7Ci0JYXVkaW9fcnhfcGF0aF9lbmFibGUoMCwgMCk7Ci0JYXVkaW9fY2xpZW50X2ZyZWUoYWMpOwotCXJldHVybiAwOwotfQotCi0KLXN0cnVjdCBhdWRpb19jbGllbnQgKnE2YXVkaW9fb3Blbl9hYWModWludDMyX3QgYnVmc3osIHVpbnQzMl90IHNhbXBsZXJhdGUsCi0JCQkJCXVpbnQzMl90IGNoYW5uZWxzLCB1aW50MzJfdCBiaXRyYXRlLAotCQkJCQl1aW50MzJfdCBzdHJlYW1fZm9ybWF0LCB1aW50MzJfdCBmbGFncywKLQkJCQkJdWludDMyX3QgYWNkYl9pZCkKLXsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYzsKLQotCXByX2RlYnVnKCJbJXM6JXNdIGJ1ZnN6ID0gJWQsIHNhbXBsZXJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZFxuIiwKLQkJX19NTV9GSUxFX18sIF9fZnVuY19fLCBidWZzeiwgc2FtcGxlcmF0ZSwgY2hhbm5lbHMpOwotCi0JaWYgKHE2YXVkaW9faW5pdCgpKQotCQlyZXR1cm4gMDsKLQotCWFjID0gYXVkaW9fY2xpZW50X2FsbG9jKGJ1ZnN6KTsKLQlpZiAoIWFjKQotCQlyZXR1cm4gMDsKLQotCWFjLT5mbGFncyA9IGZsYWdzOwotCi0JaWYgKGFjLT5mbGFncyAmIEFVRElPX0ZMQUdfV1JJVEUpCi0JCWF1ZGlvX3J4X3BhdGhfZW5hYmxlKDEsIGFjZGJfaWQpOwotCWVsc2V7Ci0JCWlmICghYXVkaW9fdHhfcGF0aF9yZWZjb3VudCkKLQkJCXR4X2Nsa19mcmVxID0gNDgwMDA7Ci0JCWF1ZGlvX3R4X3BhdGhfZW5hYmxlKDEsIGFjZGJfaWQpOwotCX0KLQotCWF1ZGlvX2FhY19vcGVuKGFjLCBidWZzeiwgc2FtcGxlcmF0ZSwgY2hhbm5lbHMsIGJpdHJhdGUsIGZsYWdzLAotCQkJCQkJCXN0cmVhbV9mb3JtYXQpOwotCWF1ZGlvX2NvbW1hbmQoYWMsIEFEU1BfQVVESU9fSU9DVExfQ01EX1NFU1NJT05fU1RBUlQpOwotCi0JaWYgKCEoYWMtPmZsYWdzICYgQVVESU9fRkxBR19XUklURSkpIHsKLQkJYWMtPmJ1ZlswXS51c2VkID0gMTsKLQkJYWMtPmJ1ZlsxXS51c2VkID0gMTsKLQkJcTZhdWRpb19yZWFkKGFjLCAmYWMtPmJ1ZlswXSk7Ci0JCXE2YXVkaW9fcmVhZChhYywgJmFjLT5idWZbMV0pOwotCX0KLQlhdWRpb19wcmV2ZW50X3NsZWVwKCk7Ci0JcmV0dXJuIGFjOwotfQotCi0KLXN0cnVjdCBhdWRpb19jbGllbnQgKnE2YXVkaW9fb3Blbl9xY3AodWludDMyX3QgYnVmc3osIHVpbnQzMl90IG1pbl9yYXRlLAotCQkJCQl1aW50MzJfdCBtYXhfcmF0ZSwgdWludDMyX3QgZmxhZ3MsCi0JCQkJCXVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgYWNkYl9pZCkKLXsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYzsKLQotCXByX2RlYnVnKCJbJXM6JXNdIGJ1ZnN6ID0gJWRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywgYnVmc3opOwotCi0JaWYgKHE2YXVkaW9faW5pdCgpKQotCQlyZXR1cm4gMDsKLQotCWFjID0gYXVkaW9fY2xpZW50X2FsbG9jKGJ1ZnN6KTsKLQlpZiAoIWFjKQotCQlyZXR1cm4gMDsKLQotCWFjLT5mbGFncyA9IGZsYWdzOwotCi0JaWYgKGFjLT5mbGFncyAmIEFVRElPX0ZMQUdfV1JJVEUpCi0JCWF1ZGlvX3J4X3BhdGhfZW5hYmxlKDEsIGFjZGJfaWQpOwotCWVsc2V7Ci0JCWlmICghYXVkaW9fdHhfcGF0aF9yZWZjb3VudCkKLQkJCXR4X2Nsa19mcmVxID0gODAwMDsKLQkJYXVkaW9fdHhfcGF0aF9lbmFibGUoMSwgYWNkYl9pZCk7Ci0JfQotCi0JYXVkaW9fcWNwX29wZW4oYWMsIGJ1ZnN6LCBtaW5fcmF0ZSwgbWF4X3JhdGUsIGZsYWdzLCBmb3JtYXQpOwotCWF1ZGlvX2NvbW1hbmQoYWMsIEFEU1BfQVVESU9fSU9DVExfQ01EX1NFU1NJT05fU1RBUlQpOwotCi0JaWYgKCEoYWMtPmZsYWdzICYgQVVESU9fRkxBR19XUklURSkpIHsKLQkJYWMtPmJ1ZlswXS51c2VkID0gMTsKLQkJYWMtPmJ1ZlsxXS51c2VkID0gMTsKLQkJcTZhdWRpb19yZWFkKGFjLCAmYWMtPmJ1ZlswXSk7Ci0JCXE2YXVkaW9fcmVhZChhYywgJmFjLT5idWZbMV0pOwotCX0KLQlhdWRpb19wcmV2ZW50X3NsZWVwKCk7Ci0JcmV0dXJuIGFjOwotfQotCi1zdHJ1Y3QgYXVkaW9fY2xpZW50ICpxNmF1ZGlvX29wZW5fYW1ybmIodWludDMyX3QgYnVmc3osIHVpbnQzMl90IGVuY19tb2RlLAotCQkJCQl1aW50MzJfdCBkdHhfbW9kZV9lbmFibGUsCi0JCQkJCXVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCBhY2RiX2lkKQotewotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCi0JcHJfZGVidWcoIlslczolc10gYnVmc3ogPSAlZCwgZHR4X21vZGUgPSAlZFxuIiwgX19NTV9GSUxFX18sCi0JCQlfX2Z1bmNfXywgYnVmc3osIGR0eF9tb2RlX2VuYWJsZSk7Ci0KLQlpZiAocTZhdWRpb19pbml0KCkpCi0JCXJldHVybiAwOwotCi0JYWMgPSBhdWRpb19jbGllbnRfYWxsb2MoYnVmc3opOwotCWlmICghYWMpCi0JCXJldHVybiAwOwotCi0JYWMtPmZsYWdzID0gZmxhZ3M7Ci0JaWYgKGFjLT5mbGFncyAmIEFVRElPX0ZMQUdfV1JJVEUpCi0JCWF1ZGlvX3J4X3BhdGhfZW5hYmxlKDEsIGFjZGJfaWQpOwotCWVsc2V7Ci0JCWlmICghYXVkaW9fdHhfcGF0aF9yZWZjb3VudCkKLQkJCXR4X2Nsa19mcmVxID0gODAwMDsKLQkJYXVkaW9fdHhfcGF0aF9lbmFibGUoMSwgYWNkYl9pZCk7Ci0JfQotCi0JYXVkaW9fYW1ybmJfb3BlbihhYywgYnVmc3osIGVuY19tb2RlLCBmbGFncywgZHR4X21vZGVfZW5hYmxlKTsKLQlhdWRpb19jb21tYW5kKGFjLCBBRFNQX0FVRElPX0lPQ1RMX0NNRF9TRVNTSU9OX1NUQVJUKTsKLQotCWlmICghKGFjLT5mbGFncyAmIEFVRElPX0ZMQUdfV1JJVEUpKSB7Ci0JCWFjLT5idWZbMF0udXNlZCA9IDE7Ci0JCWFjLT5idWZbMV0udXNlZCA9IDE7Ci0JCXE2YXVkaW9fcmVhZChhYywgJmFjLT5idWZbMF0pOwotCQlxNmF1ZGlvX3JlYWQoYWMsICZhYy0+YnVmWzFdKTsKLQl9Ci0JYXVkaW9fcHJldmVudF9zbGVlcCgpOwotCXJldHVybiBhYzsKLX0KLQotaW50IHE2YXVkaW9fYXN5bmMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCi17Ci0Jc3RydWN0IGFkc3BfY29tbWFuZF9oZHIgcnBjOwotCXByX2RlYnVnKCJbJXM6JXNdIGFjID0gJXBcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXywgYWMpOwotCW1lbXNldCgmcnBjLCAwLCBzaXplb2YocnBjKSk7Ci0JcnBjLm9wY29kZSA9IEFEU1BfQVVESU9fSU9DVExfQ01EX1NUUkVBTV9FT1M7Ci0JcnBjLnJlc3BvbnNlX3R5cGUgPSBBRFNQX0FVRElPX1JFU1BPTlNFX0FTWU5DOwotCXJldHVybiBhdWRpb19pb2N0bChhYywgJnJwYywgc2l6ZW9mKHJwYykpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvcTZhdWRpb19kZXZpY2VzLmggYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9xNmF1ZGlvX2RldmljZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxNmFiMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9xNmF1ZGlvX2RldmljZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9xNmF1ZGlvX2RldmljZXMuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUsIEluYy4KLSAqIEF1dGhvcjogQnJpYW4gU3dldGxhbmQgPHN3ZXRsYW5kQGdvb2dsZS5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotc3RydWN0IHE2X2RldmljZV9pbmZvIHsKLQl1aW50MzJfdCBpZDsKLQl1aW50MzJfdCBjYWRfaWQ7Ci0JdWludDMyX3QgcGF0aDsKLQl1aW50MzJfdCByYXRlOwotCXVpbnQ4X3QgZGlyOwotCXVpbnQ4X3QgY29kZWM7Ci0JdWludDhfdCBodzsKLX07Ci0KLSNkZWZpbmUgUTZfSUNPREVDX1JYCQkwCi0jZGVmaW5lIFE2X0lDT0RFQ19UWAkJMQotI2RlZmluZSBRNl9FQ09ERUNfUlgJCTIKLSNkZWZpbmUgUTZfRUNPREVDX1RYCQkzCi0jZGVmaW5lIFE2X1NEQUNfUlgJCTYKLSNkZWZpbmUgUTZfU0RBQ19UWAkJNwotI2RlZmluZSBRNl9DT0RFQ19OT05FCQkyNTUKLQotI2RlZmluZSBRNl9UWAkJMQotI2RlZmluZSBRNl9SWAkJMgotI2RlZmluZSBRNl9UWF9SWAkzCi0KLSNkZWZpbmUgUTZfSFdfSEFORFNFVAkwCi0jZGVmaW5lIFE2X0hXX0hFQURTRVQJMQotI2RlZmluZSBRNl9IV19TUEVBS0VSCTIKLSNkZWZpbmUgUTZfSFdfVFRZCTMKLSNkZWZpbmUgUTZfSFdfQlRfU0NPCTQKLSNkZWZpbmUgUTZfSFdfQlRfQTJEUAk1Ci0KLSNkZWZpbmUgUTZfSFdfQ09VTlQJNgotCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfSEFORFNFVF9NSUMJCTB4MDEKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9IQU5EU0VUX1NQS1IJCTB4MDIKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9IRUFEU0VUX01JQwkJMHgwMwotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX0hFQURTRVRfU1BLUl9NT05PCTB4MDQKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9IRUFEU0VUX1NQS1JfU1RFUkVPCTB4MDUKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9TUEtSX1BIT05FX01JQwkJMHgwNgotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX1NQS1JfUEhPTkVfTU9OTwkweDA3Ci0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfU1BLUl9QSE9ORV9TVEVSRU8JMHgwOAotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX0JUX1NDT19NSUMJCTB4MDkKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9CVF9TQ09fU1BLUgkJMHgwQQotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX0JUX0EyRFBfU1BLUgkJMHgwQgotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX1RUWV9IRUFEU0VUX01JQwkweDBDCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfVFRZX0hFQURTRVRfU1BLUgkweDBECi0KLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9ERUZBVUxUX1RYCQkweDBFCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfREVGQVVMVF9SWAkJMHgwRgotCi0KLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9TUEtSX1BIT05FX0RVQUxfTUlDX0JST0FEU0lERSAgICAgIDB4MkIKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9TUEtSX1BIT05FX0RVQUxfTUlDX0VOREZJUkUgICAgICAgIDB4MkQKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9IQU5EU0VUX0RVQUxfTUlDX0JST0FEU0lERSAgICAgICAgIDB4MkMKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9IQU5EU0VUX0RVQUxfTUlDX0VOREZJUkUgICAgICAgICAgIDB4MkUKLQotLyogTG9naWNhbCBEZXZpY2UgdG8gaW5kaWNhdGUgQTJEUCByb3V0aW5nICovCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfQlRfQTJEUF9UWCAgICAgICAgICAgICAweDEwCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfSEVBRFNFVF9NT05PX1BMVVNfU1BLUl9NT05PX1JYCQkweDExCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfSEVBRFNFVF9NT05PX1BMVVNfU1BLUl9TVEVSRU9fUlgJMHgxMgotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX0hFQURTRVRfU1RFUkVPX1BMVVNfU1BLUl9NT05PX1JYCTB4MTMKLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9IRUFEU0VUX1NURVJFT19QTFVTX1NQS1JfU1RFUkVPX1JYCTB4MTQKLQotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX1ZPSUNFCQkJMHgxNQotCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfSTJTX1JYICAgICAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfSTJTX1RYICAgICAgICAgICAgICAgICAweDIxCi0KLS8qIEFVWFBHQSAqLwotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX0hFQURTRVRfU1BLUl9TVEVSRU9fTEIgMHgyMgotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX0hFQURTRVRfU1BLUl9NT05PX0xCICAgMHgyMwotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX1NQRUFLRVJfU1BLUl9TVEVSRU9fTEIgMHgyNAotI2RlZmluZSBDQURfSFdfREVWSUNFX0lEX1NQRUFLRVJfU1BLUl9NT05PX0xCICAgMHgyNQotCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfTlVMTF9SWAkJMHgyQQotCi0jZGVmaW5lIENBRF9IV19ERVZJQ0VfSURfTUFYX05VTSAgICAgICAgICAgICAgICAweDJGCi0KLSNkZWZpbmUgQ0FEX0hXX0RFVklDRV9JRF9JTlZBTElEICAgICAgICAgICAgICAgIDB4RkYKLQotI2RlZmluZSBDQURfUlhfREVWSUNFICAweDAwCi0jZGVmaW5lIENBRF9UWF9ERVZJQ0UgIDB4MDEKLQotc3RhdGljIHN0cnVjdCBxNl9kZXZpY2VfaW5mbyBxNl9hdWRpb19kZXZpY2VzW10gPSB7Ci0JewotCQkuaWQJPSBBRFNQX0FVRElPX0RFVklDRV9JRF9IQU5EU0VUX1NQS1IsCi0JCS5jYWRfaWQJPSBDQURfSFdfREVWSUNFX0lEX0hBTkRTRVRfU1BLUiwKLQkJLnBhdGgJPSBBRElFX1BBVEhfSEFORFNFVF9SWCwKLQkJLnJhdGUgICA9IDQ4MDAwLAotCQkuZGlyCT0gUTZfUlgsCi0JCS5jb2RlYwk9IFE2X0lDT0RFQ19SWCwKLQkJLmh3CT0gUTZfSFdfSEFORFNFVCwKLQl9LAotCXsKLQkJLmlkCT0gQURTUF9BVURJT19ERVZJQ0VfSURfSEVBRFNFVF9TUEtSX01PTk8sCi0JCS5jYWRfaWQJPSBDQURfSFdfREVWSUNFX0lEX0hFQURTRVRfU1BLUl9NT05PLAotCQkucGF0aAk9IEFESUVfUEFUSF9IRUFEU0VUX01PTk9fUlgsCi0JCS5yYXRlICAgPSA0ODAwMCwKLQkJLmRpcgk9IFE2X1JYLAotCQkuY29kZWMJPSBRNl9JQ09ERUNfUlgsCi0JCS5odwk9IFE2X0hXX0hFQURTRVQsCi0JfSwKLQl7Ci0JCS5pZAk9IEFEU1BfQVVESU9fREVWSUNFX0lEX0hFQURTRVRfU1BLUl9TVEVSRU8sCi0JCS5jYWRfaWQJPSBDQURfSFdfREVWSUNFX0lEX0hFQURTRVRfU1BLUl9TVEVSRU8sCi0JCS5wYXRoCT0gQURJRV9QQVRIX0hFQURTRVRfU1RFUkVPX1JYLAotCQkucmF0ZSAgID0gNDgwMDAsCi0JCS5kaXIJPSBRNl9SWCwKLQkJLmNvZGVjCT0gUTZfSUNPREVDX1JYLAotCQkuaHcJPSBRNl9IV19IRUFEU0VULAotCX0sCi0JewotCQkuaWQJPSBBRFNQX0FVRElPX0RFVklDRV9JRF9TUEtSX1BIT05FX01PTk8sCi0JCS5jYWRfaWQJPSBDQURfSFdfREVWSUNFX0lEX1NQS1JfUEhPTkVfTU9OTywKLQkJLnBhdGgJPSBBRElFX1BBVEhfU1BFQUtFUl9SWCwKLQkJLnJhdGUgICA9IDQ4MDAwLAotCQkuZGlyCT0gUTZfUlgsCi0JCS5jb2RlYwk9IFE2X0lDT0RFQ19SWCwKLQkJLmh3CT0gUTZfSFdfU1BFQUtFUiwKLQl9LAotCXsKLQkJLmlkCT0gQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9TVEVSRU8sCi0JCS5jYWRfaWQJPSBDQURfSFdfREVWSUNFX0lEX1NQS1JfUEhPTkVfU1RFUkVPLAotCQkucGF0aAk9IEFESUVfUEFUSF9TUEVBS0VSX1NURVJFT19SWCwKLQkJLnJhdGUgICA9IDQ4MDAwLAotCQkuZGlyCT0gUTZfUlgsCi0JCS5jb2RlYwk9IFE2X0lDT0RFQ19SWCwKLQkJLmh3CT0gUTZfSFdfU1BFQUtFUiwKLQl9LAotCXsKLQkJLmlkCT0gQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9NT05PX1dfTU9OT19IRUFEU0VULAotCQkuY2FkX2lkCT0gQ0FEX0hXX0RFVklDRV9JRF9IRUFEU0VUX01PTk9fUExVU19TUEtSX01PTk9fUlgsCi0JCS5wYXRoCT0gQURJRV9QQVRIX1NQS1JfTU9OT19IRFBIX01PTk9fUlgsCi0JCS5yYXRlICAgPSA0ODAwMCwKLQkJLmRpcgk9IFE2X1JYLAotCQkuY29kZWMJPSBRNl9JQ09ERUNfUlgsCi0JCS5odwk9IFE2X0hXX1NQRUFLRVIsCi0JfSwKLQl7Ci0JCS5pZAk9IEFEU1BfQVVESU9fREVWSUNFX0lEX1NQS1JfUEhPTkVfTU9OT19XX1NURVJFT19IRUFEU0VULAotCQkuY2FkX2lkCT0gQ0FEX0hXX0RFVklDRV9JRF9IRUFEU0VUX1NURVJFT19QTFVTX1NQS1JfTU9OT19SWCwKLQkJLnBhdGgJPSBBRElFX1BBVEhfU1BLUl9NT05PX0hEUEhfU1RFUkVPX1JYLAotCQkucmF0ZSAgID0gNDgwMDAsCi0JCS5kaXIJPSBRNl9SWCwKLQkJLmNvZGVjCT0gUTZfSUNPREVDX1JYLAotCQkuaHcJPSBRNl9IV19TUEVBS0VSLAotCX0sCi0JewotCQkuaWQJPSBBRFNQX0FVRElPX0RFVklDRV9JRF9TUEtSX1BIT05FX1NURVJFT19XX01PTk9fSEVBRFNFVCwKLQkJLmNhZF9pZAk9IENBRF9IV19ERVZJQ0VfSURfSEVBRFNFVF9NT05PX1BMVVNfU1BLUl9TVEVSRU9fUlgsCi0JCS5wYXRoCT0gQURJRV9QQVRIX1NQS1JfU1RFUkVPX0hEUEhfTU9OT19SWCwKLQkJLnJhdGUgICA9IDQ4MDAwLAotCQkuZGlyCT0gUTZfUlgsCi0JCS5jb2RlYwk9IFE2X0lDT0RFQ19SWCwKLQkJLmh3CT0gUTZfSFdfU1BFQUtFUiwKLQl9LAotCXsKLQkJLmlkCT0gQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9TVEVSRU9fV19TVEVSRU9fSEVBRFNFVCwKLQkJLmNhZF9pZAk9IENBRF9IV19ERVZJQ0VfSURfSEVBRFNFVF9TVEVSRU9fUExVU19TUEtSX1NURVJFT19SWCwKLQkJLnBhdGgJPSBBRElFX1BBVEhfU1BLUl9TVEVSRU9fSERQSF9TVEVSRU9fUlgsCi0JCS5yYXRlICAgPSA0ODAwMCwKLQkJLmRpcgk9IFE2X1JYLAotCQkuY29kZWMJPSBRNl9JQ09ERUNfUlgsCi0JCS5odwk9IFE2X0hXX1NQRUFLRVIsCi0JfSwKLQl7Ci0JCS5pZAk9IEFEU1BfQVVESU9fREVWSUNFX0lEX1RUWV9IRUFEU0VUX1NQS1IsCi0JCS5jYWRfaWQJPSBDQURfSFdfREVWSUNFX0lEX1RUWV9IRUFEU0VUX1NQS1IsCi0JCS5wYXRoCT0gQURJRV9QQVRIX1RUWV9IRUFEU0VUX1JYLAotCQkucmF0ZSAgID0gNDgwMDAsCi0JCS5kaXIJPSBRNl9SWCwKLQkJLmNvZGVjCT0gUTZfSUNPREVDX1JYLAotCQkuaHcJPSBRNl9IV19UVFksCi0JfSwKLQl7Ci0JCS5pZAk9IEFEU1BfQVVESU9fREVWSUNFX0lEX0hBTkRTRVRfTUlDLAotCQkuY2FkX2lkCT0gQ0FEX0hXX0RFVklDRV9JRF9IQU5EU0VUX01JQywKLQkJLnBhdGgJPSBBRElFX1BBVEhfSEFORFNFVF9UWCwKLQkJLnJhdGUgICA9IDgwMDAsCi0JCS5kaXIJPSBRNl9UWCwKLQkJLmNvZGVjCT0gUTZfSUNPREVDX1RYLAotCQkuaHcJPSBRNl9IV19IQU5EU0VULAotCX0sCi0JewotCQkuaWQJPSBBRFNQX0FVRElPX0RFVklDRV9JRF9IRUFEU0VUX01JQywKLQkJLmNhZF9pZAk9IENBRF9IV19ERVZJQ0VfSURfSEVBRFNFVF9NSUMsCi0JCS5wYXRoCT0gQURJRV9QQVRIX0hFQURTRVRfTU9OT19UWCwKLQkJLnJhdGUgICA9IDgwMDAsCi0JCS5kaXIJPSBRNl9UWCwKLQkJLmNvZGVjCT0gUTZfSUNPREVDX1RYLAotCQkuaHcJPSBRNl9IV19IRUFEU0VULAotCX0sCi0JewotCQkuaWQJPSBBRFNQX0FVRElPX0RFVklDRV9JRF9TUEtSX1BIT05FX01JQywKLQkJLmNhZF9pZAk9IENBRF9IV19ERVZJQ0VfSURfU1BLUl9QSE9ORV9NSUMsCi0JCS5wYXRoCT0gQURJRV9QQVRIX1NQRUFLRVJfVFgsCi0JCS5yYXRlICAgPSA4MDAwLAotCQkuZGlyCT0gUTZfVFgsCi0JCS5jb2RlYwk9IFE2X0lDT0RFQ19UWCwKLQkJLmh3CT0gUTZfSFdfU1BFQUtFUiwKLQl9LAotCXsKLQkJLmlkCT0gQURTUF9BVURJT19ERVZJQ0VfSURfSEFORFNFVF9EVUFMX01JQywKLQkJLmNhZF9pZAk9IENBRF9IV19ERVZJQ0VfSURfSEFORFNFVF9EVUFMX01JQ19FTkRGSVJFLAotCQkucGF0aAk9IEFESUVfQ09ERUNfSEFORFNFVF9TUEtSX0VGX1RYLAotCQkucmF0ZQk9IDgwMDAsCi0JCS5kaXIJPSBRNl9UWCwKLQkJLmNvZGVjCT0gUTZfSUNPREVDX1RYLAotCQkuaHcJPSBRNl9IV19IQU5EU0VULAotCX0sCi0JewotCQkuaWQJPSBBRFNQX0FVRElPX0RFVklDRV9JRF9IQU5EU0VUX0RVQUxfTUlDLAotCQkuY2FkX2lkCT0gQ0FEX0hXX0RFVklDRV9JRF9IQU5EU0VUX0RVQUxfTUlDX0JST0FEU0lERSwKLQkJLnBhdGgJPSBBRElFX0NPREVDX0hBTkRTRVRfU1BLUl9CU19UWCwKLQkJLnJhdGUJPSA4MDAwLAotCQkuZGlyCT0gUTZfVFgsCi0JCS5jb2RlYwk9IFE2X0lDT0RFQ19UWCwKLQkJLmh3CT0gUTZfSFdfSEFORFNFVCwKLQl9LAotCXsKLQkJLmlkCT0gQURTUF9BVURJT19ERVZJQ0VfSURfU1BLUl9QSE9ORV9EVUFMX01JQywKLQkJLmNhZF9pZAk9IENBRF9IV19ERVZJQ0VfSURfU1BLUl9QSE9ORV9EVUFMX01JQ19FTkRGSVJFLAotCQkucGF0aAk9IEFESUVfQ09ERUNfSEFORFNFVF9TUEtSX0VGX1RYLAotCQkucmF0ZQk9IDgwMDAsCi0JCS5kaXIJPSBRNl9UWCwKLQkJLmNvZGVjCT0gUTZfSUNPREVDX1RYLAotCQkuaHcJPSBRNl9IV19TUEVBS0VSLAotCX0sCi0JewotCQkuaWQJPSBBRFNQX0FVRElPX0RFVklDRV9JRF9TUEtSX1BIT05FX0RVQUxfTUlDLAotCQkuY2FkX2lkCT0gQ0FEX0hXX0RFVklDRV9JRF9TUEtSX1BIT05FX0RVQUxfTUlDX0JST0FEU0lERSwKLQkJLnBhdGgJPSBBRElFX0NPREVDX0hBTkRTRVRfU1BLUl9CU19UWCwKLQkJLnJhdGUJPSA4MDAwLAotCQkuZGlyCT0gUTZfVFgsCi0JCS5jb2RlYwk9IFE2X0lDT0RFQ19UWCwKLQkJLmh3CT0gUTZfSFdfU1BFQUtFUiwKLQl9LAotCXsKLQkJLmlkCT0gQURTUF9BVURJT19ERVZJQ0VfSURfVFRZX0hFQURTRVRfTUlDLAotCQkuY2FkX2lkCT0gQ0FEX0hXX0RFVklDRV9JRF9UVFlfSEVBRFNFVF9NSUMsCi0JCS5wYXRoCT0gQURJRV9QQVRIX1RUWV9IRUFEU0VUX1RYLAotCQkucmF0ZSAgID0gODAwMCwKLQkJLmRpcgk9IFE2X1RYLAotCQkuY29kZWMJPSBRNl9JQ09ERUNfVFgsCi0JCS5odwk9IFE2X0hXX0hFQURTRVQsCi0JfSwKLQl7Ci0JCS5pZAk9IEFEU1BfQVVESU9fREVWSUNFX0lEX0JUX1NDT19TUEtSLAotCQkuY2FkX2lkCT0gQ0FEX0hXX0RFVklDRV9JRF9CVF9TQ09fU1BLUiwKLQkJLnBhdGgJPSAwLCAvKiBYWFggKi8KLQkJLnJhdGUgICA9IDQ4MDAwLAotCQkuZGlyCT0gUTZfUlgsCi0JCS5jb2RlYwk9IFE2X0VDT0RFQ19SWCwKLQkJLmh3CT0gUTZfSFdfQlRfU0NPLAotCX0sCi0JewotCQkuaWQJPSBBRFNQX0FVRElPX0RFVklDRV9JRF9CVF9BMkRQX1NQS1IsCi0JCS5jYWRfaWQJPSBDQURfSFdfREVWSUNFX0lEX0JUX0EyRFBfU1BLUiwKLQkJLnBhdGgJPSAwLCAvKiBYWFggKi8KLQkJLnJhdGUgICA9IDQ4MDAwLAotCQkuZGlyCT0gUTZfUlgsCi0JCS5jb2RlYwk9IFE2X0VDT0RFQ19SWCwKLQkJLmh3CT0gUTZfSFdfQlRfQTJEUCwKLQl9LAotCXsKLQkJLmlkCT0gQURTUF9BVURJT19ERVZJQ0VfSURfQlRfU0NPX01JQywKLQkJLmNhZF9pZAk9IENBRF9IV19ERVZJQ0VfSURfQlRfU0NPX01JQywKLQkJLnBhdGgJPSAwLCAvKiBYWFggKi8KLQkJLnJhdGUgICA9IDgwMDAsCi0JCS5kaXIJPSBRNl9UWCwKLQkJLmNvZGVjCT0gUTZfRUNPREVDX1RYLAotCQkuaHcJPSBRNl9IV19CVF9TQ08sCi0JfSwKLQl7Ci0JCS5pZAk9IEFEU1BfQVVESU9fREVWSUNFX0lEX0kyU19TUEtSLAotCQkuY2FkX2lkCT0gQ0FEX0hXX0RFVklDRV9JRF9JMlNfUlgsCi0JCS5wYXRoCT0gMCwgLyogWFhYICovCi0JCS5yYXRlICAgPSA0ODAwMCwKLQkJLmRpcgk9IFE2X1JYLAotCQkuY29kZWMJPSBRNl9TREFDX1JYLAotCQkuaHcJPSBRNl9IV19TUEVBS0VSLAotCX0sCi0JewotCQkuaWQJPSBBRFNQX0FVRElPX0RFVklDRV9JRF9JMlNfTUlDLAotCQkuY2FkX2lkCT0gQ0FEX0hXX0RFVklDRV9JRF9JMlNfVFgsCi0JCS5wYXRoCT0gMCwgLyogWFhYICovCi0JCS5yYXRlICAgPSAxNjAwMCwKLQkJLmRpcgk9IFE2X1RYLAotCQkuY29kZWMJPSBRNl9TREFDX1RYLAotCQkuaHcJPSBRNl9IV19TUEVBS0VSLAotCX0sCi0JewotCQkuaWQJPSBBRFNQX0FVRElPX0RFVklDRV9JRF9BVVhQQ01fUlgsCi0JCS5jYWRfaWQJPSBDQURfSFdfREVWSUNFX0lEX0JUX1NDT19TUEtSLAotCQkucGF0aAk9IDAsIC8qIFhYWCAqLwotCQkucmF0ZSAgID0gODAwMCwKLQkJLmRpcgk9IFE2X1JYLAotCQkuY29kZWMJPSBRNl9FQ09ERUNfUlgsCi0JCS5odwk9IFE2X0hXX0JUX1NDTywKLQl9LAotCXsKLQkJLmlkCT0gQURTUF9BVURJT19ERVZJQ0VfSURfQVVYUENNX1RYLAotCQkuY2FkX2lkCT0gQ0FEX0hXX0RFVklDRV9JRF9CVF9TQ09fTUlDLAotCQkucGF0aAk9IDAsIC8qIFhYWCAqLwotCQkucmF0ZSAgID0gODAwMCwKLQkJLmRpcgk9IFE2X1RYLAotCQkuY29kZWMJPSBRNl9FQ09ERUNfVFgsCi0JCS5odwk9IFE2X0hXX0JUX1NDTywKLQl9LAotCXsKLQkJLmlkCT0gMCwKLQkJLmNhZF9pZAk9IDAsCi0JCS5wYXRoCT0gMCwKLQkJLnJhdGUgICA9IDgwMDAsCi0JCS5kaXIJPSAwLAotCQkuY29kZWMJPSBRNl9DT0RFQ19OT05FLAotCQkuaHcJPSAwLAotCX0sCi19OwotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9xY2VscF9pbi5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDYvcWNlbHBfaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI4OTYxMi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9xY2VscF9pbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgSFRDIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIEF1dGhvcjogQnJpYW4gU3dldGxhbmQgPHN3ZXRsYW5kQGdvb2dsZS5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19xY3AuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9xZHNwNl9hdWRpby5oPgotI2luY2x1ZGUgImRhbF9hdWRpb19mb3JtYXQuaCIKLSNpbmNsdWRlIDxtYWNoL2RlYnVnX21tLmg+Ci0KLSNkZWZpbmUgUUNFTFBfRkNfQlVGRl9DTlQgMTAKLSNkZWZpbmUgUUNFTFBfUkVBRF9USU1FT1VUIDIwMDAKLXN0cnVjdCBxY2VscF9mY19idWZmIHsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlpbnQgZW1wdHk7Ci0Jdm9pZCAqZGF0YTsKLQlpbnQgc2l6ZTsKLQlpbnQgYWN0dWFsX3NpemU7Ci19OwotCi1zdHJ1Y3QgcWNlbHBfZmMgewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBmY193cTsKLQlzdHJ1Y3QgcWNlbHBfZmNfYnVmZiBmY19idWZmW1FDRUxQX0ZDX0JVRkZfQ05UXTsKLQlpbnQgYnVmZl9pbmRleDsKLX07Ci0KLXN0cnVjdCBxY2VscCB7Ci0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnIGNmZzsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgc3RyX2NmZzsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphdWRpb19jbGllbnQ7Ci0Jc3RydWN0IG1zbV92b2ljZXJlY19tb2RlIHZvaWNlcmVjX21vZGU7Ci0Jc3RydWN0IHFjZWxwX2ZjICpxY2VscF9mYzsKLX07Ci0KLQotc3RhdGljIGludCBxNl9xY2VscF9mbG93Y29udHJvbCh2b2lkICpkYXRhKQotewotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCXN0cnVjdCBhdWRpb19idWZmZXIgKmFiOwotCXN0cnVjdCBxY2VscCAqcWNlbHAgPSBkYXRhOwotCWludCBidWZmX2luZGV4ID0gMDsKLQlpbnQgeGZlciA9IDA7Ci0Jc3RydWN0IHFjZWxwX2ZjICpmYzsKLQotCi0JYWMgPSBxY2VscC0+YXVkaW9fY2xpZW50OwotCWZjID0gcWNlbHAtPnFjZWxwX2ZjOwotCWlmICghYWMpIHsKLQkJcHJfZXJyKCJbJXM6JXNdIGF1ZGlvX2NsaWVudCBpcyBOVUxMXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQlhYiA9IGFjLT5idWYgKyBhYy0+Y3B1X2J1ZjsKLQkJaWYgKGFiLT51c2VkKQotCQkJd2FpdF9ldmVudChhYy0+d2FpdCwgKGFiLT51c2VkID09IDApKTsKLQotCQlwcl9kZWJ1ZygiWyVzOiVzXSBhYi0+ZGF0YSA9ICVwLCBjcHVfYnVmID0gJWQiLCBfX01NX0ZJTEVfXywKLQkJCV9fZnVuY19fLCBhYi0+ZGF0YSwgYWMtPmNwdV9idWYpOwotCQl4ZmVyID0gYWItPmFjdHVhbF9zaXplOwotCi0KLQkJbXV0ZXhfbG9jaygmKGZjLT5mY19idWZmW2J1ZmZfaW5kZXhdLmxvY2spKTsKLQkJaWYgKCFmYy0+ZmNfYnVmZltidWZmX2luZGV4XS5lbXB0eSkgewotCQkJcHJfZXJyKCJbJXM6JXNdIGZsb3cgY29udHJvbCBidWZmZXJbJWRdIG5vdCByZWFkIVxuIiwKLQkJCQkJX19NTV9GSUxFX18sIF9fZnVuY19fLCBidWZmX2luZGV4KTsKLQkJfQotCi0JCWlmIChmYy0+ZmNfYnVmZltidWZmX2luZGV4XS5zaXplIDwgeGZlcikgewotCQkJcHJfZXJyKCJbJXM6JXNdIGJ1ZmZlciAlZCB0b28gc21hbGxcbiIsIF9fTU1fRklMRV9fLAotCQkJCQlfX2Z1bmNfXywgYnVmZl9pbmRleCk7Ci0JCQltZW1jcHkoZmMtPmZjX2J1ZmZbYnVmZl9pbmRleF0uZGF0YSwgYWItPmRhdGEsCi0JCQkJCWZjLT5mY19idWZmW2J1ZmZfaW5kZXhdLnNpemUpOwotCQkJZmMtPmZjX2J1ZmZbYnVmZl9pbmRleF0uZW1wdHkgPSAwOwotCQkJZmMtPmZjX2J1ZmZbYnVmZl9pbmRleF0uYWN0dWFsX3NpemUgPQotCQkJCQlmYy0+ZmNfYnVmZltidWZmX2luZGV4XS5zaXplOwotCQl9IGVsc2UgewotCQkJbWVtY3B5KGZjLT5mY19idWZmW2J1ZmZfaW5kZXhdLmRhdGEsIGFiLT5kYXRhLCB4ZmVyKTsKLQkJCWZjLT5mY19idWZmW2J1ZmZfaW5kZXhdLmVtcHR5ID0gMDsKLQkJCWZjLT5mY19idWZmW2J1ZmZfaW5kZXhdLmFjdHVhbF9zaXplID0geGZlcjsKLQkJfQotCQltdXRleF91bmxvY2soJihmYy0+ZmNfYnVmZltidWZmX2luZGV4XS5sb2NrKSk7Ci0JCS8qd2FrZSB1cCBjbGllbnQsIGlmIGFueSovCi0JCXdha2VfdXAoJmZjLT5mY193cSk7Ci0KLQkJYnVmZl9pbmRleCsrOwotCQlpZiAoYnVmZl9pbmRleCA+PSBRQ0VMUF9GQ19CVUZGX0NOVCkKLQkJCWJ1ZmZfaW5kZXggPSAwOwotCi0JCWFiLT51c2VkID0gMTsKLQotCQlxNmF1ZGlvX3JlYWQoYWMsIGFiKTsKLQkJYWMtPmNwdV9idWYgXj0gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBsb25nIHE2X3FjZWxwX2luX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCSB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcWNlbHAgKnFjZWxwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0JaW50IGkgPSAwOwotCXN0cnVjdCBxY2VscF9mYyAqZmM7Ci0JaW50IHNpemUgPSAwOwotCi0JbXV0ZXhfbG9jaygmcWNlbHAtPmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TRVRfVk9MVU1FOgotCQlwcl9kZWJ1ZygiWyVzOiVzXSBTRVRfVk9MVU1FXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9TVEFUUzoKLQl7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0JCXByX2RlYnVnKCJbJXM6JXNdIEdFVF9TVEFUU1xuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmc3RhdHMsCi0JCQkJCXNpemVvZihzdGF0cykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIEFVRElPX1NUQVJUOgotCXsKLQkJdWludDMyX3QgYWNkYl9pZDsKLQkJcHJfZGVidWcoIlslczolc10gQVVESU9fU1RBUlRcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCWlmIChhcmcgPT0gMCkgewotCQkJYWNkYl9pZCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmFjZGJfaWQsCi0JCQkJKHZvaWQgKikgYXJnLCBzaXplb2YoYWNkYl9pZCkpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChxY2VscC0+YXVkaW9fY2xpZW50KSB7Ci0JCQlwcl9lcnIoIlslczolc10gYWN0aXZlIHNlc3Npb24gYWxyZWFkeSBleGlzdGluZ1xuIiwKLQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQkJcmMgPSAtRUJVU1k7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCXFjZWxwLT5hdWRpb19jbGllbnQgPSBxNmF1ZGlvX29wZW5fcWNwKAotCQkJCXFjZWxwLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplLAotCQkJCXFjZWxwLT5jZmcubWluX2JpdF9yYXRlLAotCQkJCXFjZWxwLT5jZmcubWF4X2JpdF9yYXRlLAotCQkJCXFjZWxwLT52b2ljZXJlY19tb2RlLnJlY19tb2RlLAotCQkJCUFEU1BfQVVESU9fRk9STUFUX1YxM0tfRlMsCi0JCQkJYWNkYl9pZCk7Ci0KLQkJCWlmICghcWNlbHAtPmF1ZGlvX2NsaWVudCkgewotCQkJCXByX2VycigiWyVzOiVzXSBxY2VscCBvcGVuIHNlc3Npb24gZmFpbGVkXG4iLAotCQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQkJCWtmcmVlKHFjZWxwKTsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKmFsbG9jYXRlIGZsb3cgY29udHJvbCBidWZmZXJzKi8KLQkJZmMgPSBxY2VscC0+cWNlbHBfZmM7Ci0JCXNpemUgPSBxY2VscC0+c3RyX2NmZy5idWZmZXJfc2l6ZTsKLQkJZm9yIChpID0gMDsgaSA8IFFDRUxQX0ZDX0JVRkZfQ05UOyArK2kpIHsKLQkJCW11dGV4X2luaXQoJihmYy0+ZmNfYnVmZltpXS5sb2NrKSk7Ci0JCQlmYy0+ZmNfYnVmZltpXS5lbXB0eSA9IDE7Ci0JCQlmYy0+ZmNfYnVmZltpXS5kYXRhID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQkJCWlmIChmYy0+ZmNfYnVmZltpXS5kYXRhID09IE5VTEwpIHsKLQkJCQlwcl9lcnIoIlslczolc10gTm8gbWVtb3J5IGZvciBGQyBidWZmZXJzXG4iLAotCQkJCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJZ290byBmY19mYWlsOwotCQkJfQotCQkJZmMtPmZjX2J1ZmZbaV0uc2l6ZSA9IHNpemU7Ci0JCQlmYy0+ZmNfYnVmZltpXS5hY3R1YWxfc2l6ZSA9IDA7Ci0JCX0KLQotCQkvKmNyZWF0ZSBmbG93IGNvbnRyb2wgdGhyZWFkKi8KLQkJZmMtPnRhc2sgPSBrdGhyZWFkX3J1bihxNl9xY2VscF9mbG93Y29udHJvbCwKLQkJCQlxY2VscCwgInFjZWxwX2Zsb3djb250cm9sIik7Ci0JCWlmIChJU19FUlIoZmMtPnRhc2spKSB7Ci0JCQlyYyA9IFBUUl9FUlIoZmMtPnRhc2spOwotCQkJcHJfZXJyKCJbJXM6JXNdIGVycm9yIGNyZWF0aW5nIGZsb3cgY29udHJvbCB0aHJlYWRcbiIsCi0JCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGZjX2ZhaWw7Ci0JCX0KLQkJYnJlYWs7Ci1mY19mYWlsOgotCQkvKmZyZWUgZmxvdyBjb250cm9sIGJ1ZmZlcnMqLwotCQktLWk7Ci0JCWZvciAoOyBpID49ICAwOyBpLS0pIHsKLQkJCWtmcmVlKGZjLT5mY19idWZmW2ldLmRhdGEpOwotCQkJZmMtPmZjX2J1ZmZbaV0uZGF0YSA9IE5VTEw7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU1RPUDoKLQkJcHJfZGVidWcoIlslczolc10gQVVESU9fU1RPUFxuIiwgX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19GTFVTSDoKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfSU5DQUxMOiB7Ci0JCXByX2RlYnVnKCJbJXM6JXNdIFNFVF9JTkNBTExcbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmcWNlbHAtPnZvaWNlcmVjX21vZGUsCi0JCQkodm9pZCAqKWFyZywgc2l6ZW9mKHN0cnVjdCBtc21fdm9pY2VyZWNfbW9kZSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCi0JCWlmIChxY2VscC0+dm9pY2VyZWNfbW9kZS5yZWNfbW9kZSAhPSBBVURJT19GTEFHX1JFQUQKLQkJCSYmIHFjZWxwLT52b2ljZXJlY19tb2RlLnJlY19tb2RlICE9Ci0JCQlBVURJT19GTEFHX0lOQ0FMTF9NSVhFRCkgewotCQkJcWNlbHAtPnZvaWNlcmVjX21vZGUucmVjX21vZGUgPSBBVURJT19GTEFHX1JFQUQ7Ci0JCQlwcl9lcnIoIlslczolc10gSW52YWxpZCByZWNfbW9kZVxuIiwgX19NTV9GSUxFX18sCi0JCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfU1RSRUFNX0NPTkZJRzoKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnFjZWxwLT5zdHJfY2ZnLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJcHJfZGVidWcoIlslczolc10gR0VUX1NUUkVBTV9DT05GSUc6IGJ1ZmZzej0lZCwgYnVmZmNudD0lZFxuIiwKLQkJCSBfX01NX0ZJTEVfXywgX19mdW5jX18sIHFjZWxwLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplLAotCQkJcWNlbHAtPnN0cl9jZmcuYnVmZmVyX2NvdW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfU1RSRUFNX0NPTkZJRzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZxY2VscC0+c3RyX2NmZywgKHZvaWQgKilhcmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXByX2RlYnVnKCJbJXM6JXNdIFNFVF9TVFJFQU1fQ09ORklHOiBidWZmc3o9JWQsIGJ1ZmZjbnQ9JWRcbiIsCi0JCQkgX19NTV9GSUxFX18sIF9fZnVuY19fLCBxY2VscC0+c3RyX2NmZy5idWZmZXJfc2l6ZSwKLQkJCXFjZWxwLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCk7Ci0KLQkJaWYgKHFjZWxwLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplIDwgMzUpIHsKLQkJCXByX2VycigiWyVzOiVzXSBCdWZmZXIgc2l6ZSB0b28gc21hbGxcbiIsIF9fTU1fRklMRV9fLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChxY2VscC0+c3RyX2NmZy5idWZmZXJfY291bnQgIT0gMikKLQkJCXByX2luZm8oIlslczolc10gQnVmZmVyIGNvdW50IHNldCB0byAyXG4iLCBfX01NX0ZJTEVfXywKLQkJCQkJX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9RQ0VMUF9FTkNfQ09ORklHOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJnFjZWxwLT5jZmcsICh2b2lkICopIGFyZywKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCXByX2RlYnVnKCJbJXM6JXNdIFNFVF9RQ0VMUF9FTkNfQ09ORklHXG4iLCBfX01NX0ZJTEVfXywKLQkJCV9fZnVuY19fKTsKLQotCQlpZiAocWNlbHAtPmNmZy5taW5fYml0X3JhdGUgPiA0IHx8Ci0JCQkgcWNlbHAtPmNmZy5taW5fYml0X3JhdGUgPCAxKSB7Ci0KLQkJCXByX2VycigiWyVzOiVzXSBpbnZhbGlkIG1pbiBiaXRyYXRlXG4iLCBfX01NX0ZJTEVfXywKLQkJCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQl9Ci0JCWlmIChxY2VscC0+Y2ZnLm1heF9iaXRfcmF0ZSA+IDQgfHwKLQkJCSBxY2VscC0+Y2ZnLm1heF9iaXRfcmF0ZSA8IDEpIHsKLQotCQkJcHJfZXJyKCJbJXM6JXNdIGludmFsaWQgbWF4IGJpdHJhdGVcbiIsIF9fTU1fRklMRV9fLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCX0KLQotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9RQ0VMUF9FTkNfQ09ORklHOgotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJnFjZWxwLT5jZmcsCi0JCQkgc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fcWNlbHBfZW5jX2NvbmZpZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlwcl9kZWJ1ZygiWyVzOiVzXSBHRVRfUUNFTFBfRU5DX0NPTkZJR1xuIiwgX19NTV9GSUxFX18sCi0JCQlfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJnFjZWxwLT5sb2NrKTsKLQlwcl9kZWJ1ZygiWyVzOiVzXSByYyA9ICVkXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcTZfcWNlbHBfaW5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgcWNlbHAgKnFjZWxwOwotCXN0cnVjdCBxY2VscF9mYyAqZmM7Ci0JaW50IGk7Ci0JcHJfaW5mbygiWyVzOiVzXSBvcGVuXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCXFjZWxwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHFjZWxwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHFjZWxwID09IE5VTEwpIHsKLQkJcHJfZXJyKCJbJXM6JXNdIENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHFjZWxwIGRyaXZlclxuIiwKLQkJCQlfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQltdXRleF9pbml0KCZxY2VscC0+bG9jayk7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gcWNlbHA7Ci0JcWNlbHAtPmF1ZGlvX2NsaWVudCA9IE5VTEw7Ci0JcWNlbHAtPnN0cl9jZmcuYnVmZmVyX3NpemUgPSAzNTsKLQlxY2VscC0+c3RyX2NmZy5idWZmZXJfY291bnQgPSAyOwotCXFjZWxwLT5jZmcuY2RtYV9yYXRlID0gQ0RNQV9SQVRFX0ZVTEw7Ci0JcWNlbHAtPmNmZy5taW5fYml0X3JhdGUgPSAxOwotCXFjZWxwLT5jZmcubWF4X2JpdF9yYXRlID0gNDsKLQlxY2VscC0+dm9pY2VyZWNfbW9kZS5yZWNfbW9kZSA9IEFVRElPX0ZMQUdfUkVBRDsKLQotCXFjZWxwLT5xY2VscF9mYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBxY2VscF9mYyksIEdGUF9LRVJORUwpOwotCWlmIChxY2VscC0+cWNlbHBfZmMgPT0gTlVMTCkgewotCQlwcl9lcnIoIlslczolc10gQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcWNlbHBfZmNcbiIsCi0JCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJa2ZyZWUocWNlbHApOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JZmMgPSBxY2VscC0+cWNlbHBfZmM7Ci0JZmMtPnRhc2sgPSBOVUxMOwotCWZjLT5idWZmX2luZGV4ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgUUNFTFBfRkNfQlVGRl9DTlQ7ICsraSkgewotCQlmYy0+ZmNfYnVmZltpXS5kYXRhID0gTlVMTDsKLQkJZmMtPmZjX2J1ZmZbaV0uc2l6ZSA9IDA7Ci0JCWZjLT5mY19idWZmW2ldLmFjdHVhbF9zaXplID0gMDsKLQl9Ci0JLyppbml0aWFsaXplIHdhaXQgcXVldWUgaGVhZCovCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmZmMtPmZjX3dxKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgcTZfcWNlbHBfaW5fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXN0cnVjdCBxY2VscCAqcWNlbHAgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHFjZWxwX2ZjICpmYzsKLQlpbnQgeGZlciA9IDA7Ci0JaW50IHJlcyA9IDA7Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXSBjb3VudCA9ICVkXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18sIGNvdW50KTsKLQltdXRleF9sb2NrKCZxY2VscC0+bG9jayk7Ci0JYWMgPSBxY2VscC0+YXVkaW9fY2xpZW50OwotCWlmICghYWMpIHsKLQkJcmVzID0gLUVOT0RFVjsKLQkJZ290byBmYWlsOwotCX0KLQlmYyA9IHFjZWxwLT5xY2VscF9mYzsKLQl3aGlsZSAoY291bnQgPiB4ZmVyKSB7Ci0JCS8qd2FpdCBmb3IgYnVmZmVyIHRvIGZ1bGwqLwotCQlpZiAoZmMtPmZjX2J1ZmZbZmMtPmJ1ZmZfaW5kZXhdLmVtcHR5ICE9IDApIHsKLQkJCXJlcyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGZjLT5mY193cSwKLQkJCQkoZmMtPmZjX2J1ZmZbZmMtPmJ1ZmZfaW5kZXhdLmVtcHR5ID09IDApLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoUUNFTFBfUkVBRF9USU1FT1VUKSk7Ci0KLQkJCXByX2RlYnVnKCJbJXM6JXNdIGJ1ZmZfaW5kZXggPSAlZFxuIiwgX19NTV9GSUxFX18sCi0JCQkJX19mdW5jX18sIGZjLT5idWZmX2luZGV4KTsKLQkJCWlmIChyZXMgPT0gMCkgewotCQkJCXByX2VycigiWyVzOiVzXSBUaW1lb3V0IVxuIiwgX19NTV9GSUxFX18sCi0JCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJcmVzID0gLUVUSU1FRE9VVDsKLQkJCQlnb3RvIGZhaWw7Ci0JCQl9IGVsc2UgaWYgKHJlcyA8IDApIHsKLQkJCQlwcl9lcnIoIlslczolc10gUmV0dXJuaW5nIG9uIEludGVycnVwdFxuIiwKLQkJCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCQlnb3RvIGZhaWw7Ci0JCQl9Ci0JCX0KLQkJLypsb2NrIHRoZSBidWZmZXIqLwotCQltdXRleF9sb2NrKCYoZmMtPmZjX2J1ZmZbZmMtPmJ1ZmZfaW5kZXhdLmxvY2spKTsKLQkJeGZlciA9IGZjLT5mY19idWZmW2ZjLT5idWZmX2luZGV4XS5hY3R1YWxfc2l6ZTsKLQotCQlpZiAoeGZlciA+IGNvdW50KSB7Ci0JCQltdXRleF91bmxvY2soJihmYy0+ZmNfYnVmZltmYy0+YnVmZl9pbmRleF0ubG9jaykpOwotCQkJcHJfZXJyKCJbJXM6JXNdIHJlYWQgZmFpbGVkISBieXRlIGNvdW50IHRvbyBzbWFsbFxuIiwKLQkJCQkJX19NTV9GSUxFX18sIF9fZnVuY19fKTsKLQkJCXJlcyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQlpZiAoY29weV90b191c2VyKGJ1ZiwgZmMtPmZjX2J1ZmZbZmMtPmJ1ZmZfaW5kZXhdLmRhdGEsCXhmZXIpKSB7Ci0JCQltdXRleF91bmxvY2soJihmYy0+ZmNfYnVmZltmYy0+YnVmZl9pbmRleF0ubG9jaykpOwotCQkJcHJfZXJyKCJbJXM6JXNdIGNvcHlfdG9fdXNlciBmYWlsZWQgYXQgaW5kZXggJWRcbiIsCi0JCQkJCV9fTU1fRklMRV9fLCBfX2Z1bmNfXywgZmMtPmJ1ZmZfaW5kZXgpOwotCQkJcmVzID0gLUVGQVVMVDsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlidWYgKz0geGZlcjsKLQkJY291bnQgLT0geGZlcjsKLQotCQlmYy0+ZmNfYnVmZltmYy0+YnVmZl9pbmRleF0uZW1wdHkgPSAxOwotCQlmYy0+ZmNfYnVmZltmYy0+YnVmZl9pbmRleF0uYWN0dWFsX3NpemUgPSAwOwotCi0JCW11dGV4X3VubG9jaygmKGZjLT5mY19idWZmW2ZjLT5idWZmX2luZGV4XS5sb2NrKSk7Ci0JCSsrKGZjLT5idWZmX2luZGV4KTsKLQkJaWYgKGZjLT5idWZmX2luZGV4ID49IFFDRUxQX0ZDX0JVRkZfQ05UKQotCQkJZmMtPmJ1ZmZfaW5kZXggPSAwOwotCX0KLQlyZXMgPSBidWYgLSBzdGFydDsKLQotZmFpbDoKLQltdXRleF91bmxvY2soJnFjZWxwLT5sb2NrKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgcTZfcWNlbHBfaW5fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBxY2VscCAqcWNlbHAgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IGkgPSAwOwotCXN0cnVjdCBxY2VscF9mYyAqZmM7Ci0KLQltdXRleF9sb2NrKCZxY2VscC0+bG9jayk7Ci0JZmMgPSBxY2VscC0+cWNlbHBfZmM7Ci0Ja3RocmVhZF9zdG9wKGZjLT50YXNrKTsKLQlmYy0+dGFzayA9IE5VTEw7Ci0KLQkvKmZyZWUgZmxvdyBjb250cm9sIGJ1ZmZlcnMqLwotCWZvciAoaSA9IDA7IGkgPCBRQ0VMUF9GQ19CVUZGX0NOVDsgKytpKSB7Ci0JCWtmcmVlKGZjLT5mY19idWZmW2ldLmRhdGEpOwotCQlmYy0+ZmNfYnVmZltpXS5kYXRhID0gTlVMTDsKLQl9Ci0Ja2ZyZWUoZmMpOwotCi0JaWYgKHFjZWxwLT5hdWRpb19jbGllbnQpCi0JCXJjID0gcTZhdWRpb19jbG9zZShxY2VscC0+YXVkaW9fY2xpZW50KTsKLQltdXRleF91bmxvY2soJnFjZWxwLT5sb2NrKTsKLQlrZnJlZShxY2VscCk7Ci0JcHJfaW5mbygiWyVzOiVzXSByZWxlYXNlXG4iLCBfX01NX0ZJTEVfXywgX19mdW5jX18pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcTZfcWNlbHBfaW5fZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gcTZfcWNlbHBfaW5fb3BlbiwKLQkucmVhZAkJPSBxNl9xY2VscF9pbl9yZWFkLAotCS5yZWxlYXNlCT0gcTZfcWNlbHBfaW5fcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBxNl9xY2VscF9pbl9pb2N0bCwKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIHE2X3FjZWxwX2luX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gIm1zbV9xY2VscF9pbiIsCi0JLmZvcHMJPSAmcTZfcWNlbHBfaW5fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHE2X3FjZWxwX2luX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmcTZfcWNlbHBfaW5fbWlzYyk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChxNl9xY2VscF9pbl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L3JvdXRpbmcuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2L3JvdXRpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY1MzNhNC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9yb3V0aW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9xZHNwNi9yb3V0aW5nLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuCi0gKiBBdXRob3I6IEJyaWFuIFN3ZXRsYW5kIDxzd2V0bGFuZEBnb29nbGUuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bWFjaC9kZWJ1Z19tbS5oPgotCi1leHRlcm4gaW50IHE2YXVkaW9fc2V0X3JvdXRlKGNvbnN0IGNoYXIgKm5hbWUpOwotCi1zdGF0aWMgaW50IHE2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcHJfZGVidWcoIlslczolc11cbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHE2X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQljaGFyIGNtZFszMl07Ci0KLQlwcl9kZWJ1ZygiWyVzOiVzXSBjb3VudCA9ICVkIiwgX19NTV9GSUxFX18sIF9fZnVuY19fLCBjb3VudCk7Ci0JaWYgKGNvdW50ID49IHNpemVvZihjbWQpKSB7Ci0JCXByX2VycigiWyVzOiVzXSBpbnZhbGlkIGNvdW50ICVkXG4iLCBfX01NX0ZJTEVfXywKLQkJCV9fZnVuY19fLCBjb3VudCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGNtZCwgYnVmLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCWNtZFtjb3VudF0gPSAwOwotCi0JaWYgKChjb3VudCA+IDEpICYmIChjbWRbY291bnQtMV0gPT0gJ1xuJykpCi0JCWNtZFtjb3VudC0xXSA9IDA7Ci0KLQlxNmF1ZGlvX3NldF9yb3V0ZShjbWQpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50IHE2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcHJfZGVidWcoIlslczolc11cbiIsIF9fTU1fRklMRV9fLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHE2X2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IHE2X29wZW4sCi0JLndyaXRlCQk9IHE2X3dyaXRlLAotCS5yZWxlYXNlCT0gcTZfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBxNl9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fYXVkaW9fcm91dGUiLAotCS5mb3BzCT0gJnE2X2ZvcHMsCi19OwotCi0KLXN0YXRpYyBpbnQgX19pbml0IHE2X2luaXQodm9pZCkgewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZxNl9taXNjKTsKLX0KLQotZGV2aWNlX2luaXRjYWxsKHE2X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDZ2Mi9hYWNfaW4uYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2djIvYWFjX2luLmMKaW5kZXggMDc0MTUzOC4uODY1ZjZmMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDZ2Mi9hYWNfaW4uYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNnYyL2FhY19pbi5jCkBAIC01OCwxMSArNTgsMzMgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJcmMgPSBhdWRpb19pbl9idWZfYWxsb2MoYXVkaW8pOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJCWJyZWFrOworCQlpZiAoYXVkaW8tPm9wZW5lZCkgeworCQkJcmMgPSBhdWRpb19pbl9idWZfYWxsb2MoYXVkaW8pOworCQkJaWYgKHJjIDwgMCkgeworCQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iLAorCQkJCQkgX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZihhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKXsKKwkJCQlwcl9kZWJ1ZygiJXM6IHN0YXJ0aW5nIGluIG5vbl90dW5uZWwgbW9kZSIsX19mdW5jX18pOworCQkJCXJjID0gcTZhc21fb3Blbl9yZWFkX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX01QRUc0X0FBQywKKwkJCQkJCUZPUk1BVF9MSU5FQVJfUENNKTsKKwkJCQlpZiAocmMgPCAwKSB7CisJCQkJCXByX2VycigiJXM6b3BlbiByZWFkIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZihhdWRpby0+ZmVlZGJhY2sgPT0gVFVOTkVMX01PREUpeworCQkJCXByX2RlYnVnKCIlczogc3RhcnRpbmcgaW4gdHVubmVsIG1vZGUiLF9fZnVuY19fKTsKKwkJCQlyYyA9IHE2YXNtX29wZW5fcmVhZChhdWRpby0+YWMsRk9STUFUX01QRUc0X0FBQyk7CisKKwkJCQlpZiAocmMgPCAwKSB7CisJCQkJCXByX2VycigiJXM6b3BlbiByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCWF1ZGlvLT5zdG9wcGVkID0gMDsKIAkJfQogCiAJCXByX2RlYnVnKCIlczpzYnJfcHNfZmxhZyA9ICVkLCBzYnJfZmxhZyA9ICVkXG4iLCBfX2Z1bmNfXywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2djIvYXVkaW9fYW1yd2JwbHVzLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNnYyL2F1ZGlvX2FtcndicGx1cy5jCmluZGV4IDkwMmUwNmQuLjU0NGJmOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2djIvYXVkaW9fYW1yd2JwbHVzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDZ2Mi9hdWRpb19hbXJ3YnBsdXMuYwpAQCAtMzYsNyArMzYsNyBAQAogCX0KIH0KICNlbHNlCi1zdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnMoc3RydWN0IHE2YXVkaW9fYWlvICopCitzdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnMoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbykKIHsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDZ2Mi9hdWRpb19scGEuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2djIvYXVkaW9fbHBhLmMKaW5kZXggZjZkZDlmYWIuLmFmZGZkNmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2djIvYXVkaW9fbHBhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDZ2Mi9hdWRpb19scGEuYwpAQCAtOTIxLDYgKzkyMSw3IEBACiAKIAljYXNlIEFVRElPX0dFVF9DT05GSUc6ewogCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBjb25maWc7CisJCW1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoY29uZmlnKSk7CiAJCWNvbmZpZy5idWZmZXJfY291bnQgPSBhdWRpby0+YnVmZmVyX2NvdW50OwogCQljb25maWcuYnVmZmVyX3NpemUgPSBhdWRpby0+YnVmZmVyX3NpemU7CiAJCWNvbmZpZy5zYW1wbGVfcmF0ZSA9IGF1ZGlvLT5vdXRfc2FtcGxlX3JhdGU7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNnYyL2F1ZGlvX3V0aWxzLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9xZHNwNnYyL2F1ZGlvX3V0aWxzLmMKaW5kZXggNTM1NWRlMS4uODVhZjRhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDZ2Mi9hdWRpb191dGlscy5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2djIvYXVkaW9fdXRpbHMuYwpAQCAtMjYwLDE0ICsyNjAsMTYgQEAKIAkJfQogCQlhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSA9IGNmZy5idWZmZXJfc2l6ZTsKIAkJYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50ID0gY2ZnLmJ1ZmZlcl9jb3VudDsKLQkJcmMgPSBxNmFzbV9hdWRpb19jbGllbnRfYnVmX2FsbG9jKE9VVCwgYXVkaW8tPmFjLAorCQlpZihhdWRpby0+b3BlbmVkKXsKKwkJCXJjID0gcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9hbGxvYyhPVVQsYXVkaW8tPmFjLAogCQkJCUFMSUdOX0JVRl9TSVpFKGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplKSwKIAkJCQlhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQpOwotCQlpZiAocmMgPCAwKSB7CisJCQlpZiAocmMgPCAwKSB7CiAJCQlwcl9lcnIoIiVzOiBzZXNzaW9uIGlkICVkOiBCdWZmZXIgQWxsb2MgZmFpbGVkIHJjPSVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7CisJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOwogCQkJcmMgPSAtRU5PTUVNOwogCQkJYnJlYWs7CisJCQl9CiAJCX0KIAkJYXVkaW8tPmJ1Zl9hbGxvYyB8PSBCVUZfQUxMT0NfT1VUOwogCQlyYyA9IDA7CkBAIC0zNDksMTQgKzM1MSwxNiBAQAogCQlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSAgPSBjZmcuYnVmZmVyX3NpemU7CiAJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQgPSBjZmcuY2hhbm5lbF9jb3VudDsKIAkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUgPSBjZmcuc2FtcGxlX3JhdGU7Ci0JCXJjID0gcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9hbGxvYyhJTiwgYXVkaW8tPmFjLAotCQkJQUxJR05fQlVGX1NJWkUoYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUpLAotCQkJYXVkaW8tPnBjbV9jZmcuYnVmZmVyX2NvdW50KTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBCdWZmZXIgQWxsb2MgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJYnJlYWs7CisJCWlmKGF1ZGlvLT5vcGVuZWQgJiYgYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSl7CisJCQlyYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9idWZfYWxsb2MoSU4sIGF1ZGlvLT5hYywKKwkJCQlBTElHTl9CVUZfU0laRShhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSksCisJCQkJYXVkaW8tPnBjbV9jZmcuYnVmZmVyX2NvdW50KTsKKwkJCWlmKHJjIDwgMCl7CisJCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBCdWZmZXIgQWxsb2MgZmFpbGVkXG4iLAorCQkJCQkJX19mdW5jX18sYXVkaW8tPmFjLT5zZXNzaW9uKTsKKwkJCQlyYyA9IC1FTk9NRU07CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAkJYXVkaW8tPmJ1Zl9hbGxvYyB8PSBCVUZfQUxMT0NfSU47CiAJCXJjID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3Fkc3A2djIvcGNtX291dC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDZ2Mi9wY21fb3V0LmMKaW5kZXggNDA5N2I3Mi4uYzZhZTQyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDZ2Mi9wY21fb3V0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vcWRzcDZ2Mi9wY21fb3V0LmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQXV0aG9yOiBCcmlhbiBTd2V0bGFuZCA8c3dldGxhbmRAZ29vZ2xlLmNvbT4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCkBAIC0yNjAsNiArMjYwLDcgQEAKIAljYXNlIEFVRElPX0dFVF9DT05GSUc6IHsKIAkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY29uZmlnOwogCQlwcl9kZWJ1ZygiJXM6IEFVRElPX0dFVF9DT05GSUdcbiIsIF9fZnVuY19fKTsKKwkJbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKIAkJY29uZmlnLmJ1ZmZlcl9zaXplID0gcGNtLT5idWZmZXJfc2l6ZTsKIAkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IHBjbS0+YnVmZmVyX2NvdW50OwogCQljb25maWcuc2FtcGxlX3JhdGUgPSBwY20tPnNhbXBsZV9yYXRlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vc2NtLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9zY20uYwppbmRleCAyNjZiNzU5Li42MDFjNDJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9zY20uYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9zY20uYwpAQCAtMTE0LDYgKzExNCw3IEBACiAKIHN0YXRpYyBpbnQgc2NtX3JlbWFwX2Vycm9yKGludCBlcnIpCiB7CisJcHJfZXJyKCJzY21fY2FsbCBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkXG4iLCBlcnIpOwogCXN3aXRjaCAoZXJyKSB7CiAJY2FzZSBTQ01fRVJST1I6CiAJCXJldHVybiAtRUlPOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vc29jaW5mby5jIGIvYXJjaC9hcm0vbWFjaC1tc20vc29jaW5mby5jCmluZGV4IDI0OWM3NjguLjhhZjM4OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3NvY2luZm8uYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9zb2NpbmZvLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNkZWZpbmUgU01FTV9JTUFHRV9WRVJTSU9OX1ZBUklBTlRfT0ZGU0VUIDc1CiAjZGVmaW5lIFNNRU1fSU1BR0VfVkVSU0lPTl9PRU1fU0laRSAzMgogI2RlZmluZSBTTUVNX0lNQUdFX1ZFUlNJT05fT0VNX09GRlNFVCA5NgorI2RlZmluZSBTTUVNX0lNQUdFX1ZFUlNJT05fUEFSVElUSU9OX0FQUFMgMTAKIAogZW51bSB7CiAJSFdfUExBVEZPUk1fVU5LTk9XTiA9IDAsCkBAIC04NTksMjMgKzg2MCwyOCBAQAogCX0KIAlzdHJpbmdfYWRkcmVzcyArPSBjdXJyZW50X2ltYWdlICogU01FTV9JTUFHRV9WRVJTSU9OX1NJTkdMRV9CTE9DS19TSVpFOwogCXN0cmluZ19hZGRyZXNzICs9IFNNRU1fSU1BR0VfVkVSU0lPTl9OQU1FX09GRlNFVDsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBTTUVNX0lNQUdFX1ZFUlNJT05fTkFNRV9TSVpFLCAiJS0uNzVzIiwKKwlyZXR1cm4gc25wcmludGYoYnVmLCBTTUVNX0lNQUdFX1ZFUlNJT05fTkFNRV9TSVpFLCAiJS0uNzJzXG4iLAogCQkJc3RyaW5nX2FkZHJlc3MpOwogfQogCiBzdGF0aWMgc3NpemVfdAotbXNtX3N0b3JlX2ltYWdlX3R5cGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorbXNtX3NldF9pbWFnZV92ZXJzaW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLAorCQkJc2l6ZV90IGNvdW50KQogewotCWludCByZXQsIGRpZ2l0OworCWNoYXIgKnN0b3JlX2FkZHJlc3M7CiAKLQlyZXQgPSBrc3RydG9pbnQoYnVmLCAxMCwgJmRpZ2l0KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCWlmICgwIDw9IGRpZ2l0ICYmIGRpZ2l0IDwgU01FTV9JTUFHRV9WRVJTSU9OX0JMT0NLU19DT1VOVCkKLQkJY3VycmVudF9pbWFnZSA9IGRpZ2l0OwotCWVsc2UKLQkJY3VycmVudF9pbWFnZSA9IDA7CisJaWYgKGN1cnJlbnRfaW1hZ2UgIT0gU01FTV9JTUFHRV9WRVJTSU9OX1BBUlRJVElPTl9BUFBTKQorCQlyZXR1cm4gY291bnQ7CisJc3RvcmVfYWRkcmVzcyA9IHNvY2luZm9fZ2V0X2ltYWdlX3ZlcnNpb25fYmFzZV9hZGRyZXNzKCk7CisJaWYgKHN0b3JlX2FkZHJlc3MgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzIDogRmFpbGVkIHRvIGdldCBpbWFnZSB2ZXJzaW9uIGJhc2UgYWRkcmVzcyIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gY291bnQ7CisJfQorCXN0b3JlX2FkZHJlc3MgKz0gY3VycmVudF9pbWFnZSAqIFNNRU1fSU1BR0VfVkVSU0lPTl9TSU5HTEVfQkxPQ0tfU0laRTsKKwlzbnByaW50ZihzdG9yZV9hZGRyZXNzLCBTTUVNX0lNQUdFX1ZFUlNJT05fTkFNRV9TSVpFLCAiJS0uNzVzIiwgYnVmKTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTg5NSwxMSArOTAxLDMzIEBACiAJfQogCXN0cmluZ19hZGRyZXNzICs9IGN1cnJlbnRfaW1hZ2UgKiBTTUVNX0lNQUdFX1ZFUlNJT05fU0lOR0xFX0JMT0NLX1NJWkU7CiAJc3RyaW5nX2FkZHJlc3MgKz0gU01FTV9JTUFHRV9WRVJTSU9OX1ZBUklBTlRfT0ZGU0VUOwotCXJldHVybiBzbnByaW50ZihidWYsIFNNRU1fSU1BR0VfVkVSU0lPTl9WQVJJQU5UX1NJWkUsICIlLS4yMHMiLAorCXJldHVybiBzbnByaW50ZihidWYsIFNNRU1fSU1BR0VfVkVSU0lPTl9WQVJJQU5UX1NJWkUsICIlLS4yMHNcbiIsCiAJCQlzdHJpbmdfYWRkcmVzcyk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90Cittc21fc2V0X2ltYWdlX3ZhcmlhbnQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsCisJCQlzaXplX3QgY291bnQpCit7CisJY2hhciAqc3RvcmVfYWRkcmVzczsKKworCWlmIChjdXJyZW50X2ltYWdlICE9IFNNRU1fSU1BR0VfVkVSU0lPTl9QQVJUSVRJT05fQVBQUykKKwkJcmV0dXJuIGNvdW50OworCXN0b3JlX2FkZHJlc3MgPSBzb2NpbmZvX2dldF9pbWFnZV92ZXJzaW9uX2Jhc2VfYWRkcmVzcygpOworCWlmIChzdG9yZV9hZGRyZXNzID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlcyA6IEZhaWxlZCB0byBnZXQgaW1hZ2UgdmVyc2lvbiBiYXNlIGFkZHJlc3MiLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlzdG9yZV9hZGRyZXNzICs9IGN1cnJlbnRfaW1hZ2UgKiBTTUVNX0lNQUdFX1ZFUlNJT05fU0lOR0xFX0JMT0NLX1NJWkU7CisJc3RvcmVfYWRkcmVzcyArPSBTTUVNX0lNQUdFX1ZFUlNJT05fVkFSSUFOVF9PRkZTRVQ7CisJc25wcmludGYoc3RvcmVfYWRkcmVzcywgU01FTV9JTUFHRV9WRVJTSU9OX1ZBUklBTlRfU0laRSwgIiUtLjIwcyIsIGJ1Zik7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAogbXNtX2dldF9pbWFnZV9jcm1fdmVyc2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCWNoYXIgKmJ1ZikKQEAgLTk1NSw2ICs5ODMsNTQgQEAKIAkJCXNvY2luZm9fc2hvd19wbWljX2RpZV9yZXZpc2lvbiwgTlVMTCksCiB9OwogCitzdGF0aWMgc3NpemVfdAorbXNtX3NldF9pbWFnZV9jcm1fdmVyc2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCkKK3sKKwljaGFyICpzdG9yZV9hZGRyZXNzOworCisJaWYgKGN1cnJlbnRfaW1hZ2UgIT0gU01FTV9JTUFHRV9WRVJTSU9OX1BBUlRJVElPTl9BUFBTKQorCQlyZXR1cm4gY291bnQ7CisJc3RvcmVfYWRkcmVzcyA9IHNvY2luZm9fZ2V0X2ltYWdlX3ZlcnNpb25fYmFzZV9hZGRyZXNzKCk7CisJaWYgKHN0b3JlX2FkZHJlc3MgPT0gTlVMTCkgeworCQlwcl9lcnIoIiVzIDogRmFpbGVkIHRvIGdldCBpbWFnZSB2ZXJzaW9uIGJhc2UgYWRkcmVzcyIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gY291bnQ7CisJfQorCXN0b3JlX2FkZHJlc3MgKz0gY3VycmVudF9pbWFnZSAqIFNNRU1fSU1BR0VfVkVSU0lPTl9TSU5HTEVfQkxPQ0tfU0laRTsKKwlzdG9yZV9hZGRyZXNzICs9IFNNRU1fSU1BR0VfVkVSU0lPTl9PRU1fT0ZGU0VUOworCXNucHJpbnRmKHN0b3JlX2FkZHJlc3MsIFNNRU1fSU1BR0VfVkVSU0lPTl9PRU1fU0laRSwgIiUtLjMycyIsIGJ1Zik7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAorbXNtX2dldF9pbWFnZV9udW1iZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsCisJCQljdXJyZW50X2ltYWdlKTsKK30KKworc3RhdGljIHNzaXplX3QKK21zbV9zZWxlY3RfaW1hZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCByZXQsIGRpZ2l0OworCisJcmV0ID0ga3N0cnRvaW50KGJ1ZiwgMTAsICZkaWdpdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoMCA8PSBkaWdpdCAmJiBkaWdpdCA8IFNNRU1fSU1BR0VfVkVSU0lPTl9CTE9DS1NfQ09VTlQpCisJCWN1cnJlbnRfaW1hZ2UgPSBkaWdpdDsKKwllbHNlCisJCWN1cnJlbnRfaW1hZ2UgPSAwOworCXJldHVybiBjb3VudDsKK30KKworCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgbXNtX3NvY19hdHRyX3Jhd192ZXJzaW9uID0KIAlfX0FUVFIocmF3X3ZlcnNpb24sIFNfSVJVR08sIG1zbV9nZXRfcmF3X3ZlcnNpb24sICBOVUxMKTsKIApAQCAtOTkzLDE1ICsxMDY5LDE5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBpbWFnZV92ZXJzaW9uID0KIAlfX0FUVFIoaW1hZ2VfdmVyc2lvbiwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCQltc21fZ2V0X2ltYWdlX3ZlcnNpb24sIG1zbV9zdG9yZV9pbWFnZV90eXBlKTsKKwkJCW1zbV9nZXRfaW1hZ2VfdmVyc2lvbiwgbXNtX3NldF9pbWFnZV92ZXJzaW9uKTsKIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGltYWdlX3ZhcmlhbnQgPQotCV9fQVRUUihpbWFnZV92YXJpYW50LCBTX0lSVUdPLAotCQkJbXNtX2dldF9pbWFnZV92YXJpYW50LCBOVUxMKTsKKwlfX0FUVFIoaW1hZ2VfdmFyaWFudCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQltc21fZ2V0X2ltYWdlX3ZhcmlhbnQsIG1zbV9zZXRfaW1hZ2VfdmFyaWFudCk7CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBpbWFnZV9jcm1fdmVyc2lvbiA9Ci0JX19BVFRSKGltYWdlX2NybV92ZXJzaW9uLCBTX0lSVUdPLAotCQkJbXNtX2dldF9pbWFnZV9jcm1fdmVyc2lvbiwgTlVMTCk7CisJX19BVFRSKGltYWdlX2NybV92ZXJzaW9uLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCW1zbV9nZXRfaW1hZ2VfY3JtX3ZlcnNpb24sIG1zbV9zZXRfaW1hZ2VfY3JtX3ZlcnNpb24pOworCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgc2VsZWN0X2ltYWdlID0KKwlfX0FUVFIoc2VsZWN0X2ltYWdlLCBTX0lSVUdPIHwgU19JV1VHTywKKwkJCW1zbV9nZXRfaW1hZ2VfbnVtYmVyLCBtc21fc2VsZWN0X2ltYWdlKTsKIAogc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3Mgc29jX3N5c2Rldl9jbGFzcyA9IHsKIAkubmFtZSA9ICJzb2MiLApAQCAtMTA2MCw2ICsxMTQwLDcgQEAKIAlkZXZpY2VfY3JlYXRlX2ZpbGUobXNtX3NvY19kZXZpY2UsICZpbWFnZV92ZXJzaW9uKTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUobXNtX3NvY19kZXZpY2UsICZpbWFnZV92YXJpYW50KTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUobXNtX3NvY19kZXZpY2UsICZpbWFnZV9jcm1fdmVyc2lvbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKG1zbV9zb2NfZGV2aWNlLCAmc2VsZWN0X2ltYWdlKTsKIAogCXN3aXRjaCAobGVnYWN5X2Zvcm1hdCkgewogCWNhc2UgODoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdfZGVidWdmcy5jIGIvZHJpdmVycy9jaGFyL2RpYWcvZGlhZ19kZWJ1Z2ZzLmMKaW5kZXggYzRmNzYyZC4uYmVhZjc1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RpYWcvZGlhZ19kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9jaGFyL2RpYWcvZGlhZ19kZWJ1Z2ZzLmMKQEAgLTEwNSw2ICsxMDUsOSBAQAogCQkiUklWQSBDTlRMIGluX2J1Zl8xX3NpemU6ICVkXG4iCiAJCSJNb2RlbSBEQ0kgaW5fYnVmXzFfc2l6ZTogJWRcbiIKIAkJIk1vZGVtIERDSSBDTUQgaW5fYnVmXzFfc2l6ZTogJWRcbiIKKwkJIlJlY2VpdmVkIEZlYXR1cmUgbWFzayBmcm9tIE1vZGVtOiAlZFxuIgorCQkiUmVjZWl2ZWQgRmVhdHVyZSBtYXNrIGZyb20gTFBBU1M6ICVkXG4iCisJCSJSZWNlaXZlZCBGZWF0dXJlIG1hc2sgZnJvbSBXQ05TUzogJWRcbiIKIAkJImxvZ2dpbmdfbW9kZTogJWRcbiIKIAkJInJlYWxfdGltZV9tb2RlOiAlZFxuIiwKIAkJKHVuc2lnbmVkIGludClkcml2ZXItPnNtZF9kYXRhW01PREVNX0RBVEFdLmNoLApAQCAtMTcxLDYgKzE3NCw5IEBACiAJCSh1bnNpZ25lZCBpbnQpZHJpdmVyLT5zbWRfY250bFtXQ05TU19EQVRBXS5idWZfaW5fMV9zaXplLAogCQkodW5zaWduZWQgaW50KWRyaXZlci0+c21kX2RjaVtNT0RFTV9EQVRBXS5idWZfaW5fMV9zaXplLAogCQkodW5zaWduZWQgaW50KWRyaXZlci0+c21kX2RjaV9jbWRbTU9ERU1fREFUQV0uYnVmX2luXzFfc2l6ZSwKKwkJZHJpdmVyLT5yY3ZkX2ZlYXR1cmVfbWFza1tNT0RFTV9EQVRBXSwKKwkJZHJpdmVyLT5yY3ZkX2ZlYXR1cmVfbWFza1tMUEFTU19EQVRBXSwKKwkJZHJpdmVyLT5yY3ZkX2ZlYXR1cmVfbWFza1tXQ05TU19EQVRBXSwKIAkJZHJpdmVyLT5sb2dnaW5nX21vZGUsCiAJCWRyaXZlci0+cmVhbF90aW1lX21vZGUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZGlhZy9kaWFnY2hhci5oIGIvZHJpdmVycy9jaGFyL2RpYWcvZGlhZ2NoYXIuaAppbmRleCBlMGE0MjhkLi45ZDlkODliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZGlhZy9kaWFnY2hhci5oCisrKyBiL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdjaGFyLmgKQEAgLTM0MCw2ICszNDAsNyBAQAogCXN0cnVjdCBkaWFnX3NtZF9pbmZvIHNtZF9kY2lbTlVNX1NNRF9EQ0lfQ0hBTk5FTFNdOwogCXN0cnVjdCBkaWFnX3NtZF9pbmZvIHNtZF9jbWRbTlVNX1NNRF9DTURfQ0hBTk5FTFNdOwogCXN0cnVjdCBkaWFnX3NtZF9pbmZvIHNtZF9kY2lfY21kW05VTV9TTURfRENJX0NNRF9DSEFOTkVMU107CisJaW50IHJjdmRfZmVhdHVyZV9tYXNrW05VTV9TTURfQ09OVFJPTF9DSEFOTkVMU107CiAJaW50IHNlcGFyYXRlX2NtZHJzcFtOVU1fU01EX0NPTlRST0xfQ0hBTk5FTFNdOwogCXVuc2lnbmVkIGNoYXIgKnVzYl9idWZfb3V0OwogCXVuc2lnbmVkIGNoYXIgKmFwcHNfcnNwX2J1ZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdjaGFyX2hkbGMuYyBiL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdjaGFyX2hkbGMuYwppbmRleCA3YjI0NTkxLi4zZTM4YTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZGlhZy9kaWFnY2hhcl9oZGxjLmMKKysrIGIvZHJpdmVycy9jaGFyL2RpYWcvZGlhZ2NoYXJfaGRsYy5jCkBAIC0yMDcsMTUgKzIwNywxMSBAQAogCQkJCQkJCSAgXiBFU0NfTUFTSzsKIAkJCQl9CiAJCQl9IGVsc2UgaWYgKHNyY19ieXRlID09IENPTlRST0xfQ0hBUikgewotCQkJCWRlc3RfcHRyW2xlbisrXSA9IHNyY19ieXRlOwotCQkJCS8qCi0JCQkJICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgbWVzc2FnZSwKLQkJCQkgKiB0aGVuIGl0IGlzIHBhcnQgb2YgdGhlIGNvbW1hbmQuIE90aGVyd2lzZSwKLQkJCQkgKiBjb25zaWRlciBpdCBhcyB0aGUgbGFzdCBieXRlIG9mIHRoZQotCQkJCSAqIG1lc3NhZ2UuCi0JCQkJICovCiAJCQkJaWYgKG1zZ19zdGFydCAmJiBpID09IDAgJiYgc3JjX2xlbmd0aCA+IDEpCiAJCQkJCWNvbnRpbnVlOworCQkJCS8qIEJ5dGUgMHg3RSB3aWxsIGJlIGNvbnNpZGVyZWQKKwkJCQkJYXMgZW5kIG9mIHBhY2tldCAqLworCQkJCWRlc3RfcHRyW2xlbisrXSA9IHNyY19ieXRlOwogCQkJCWkrKzsKIAkJCQlwa3RfYm5kID0gMTsKIAkJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdmd2QuYyBiL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdmd2QuYwppbmRleCBjNzRhYjk5Li5jZGQzMTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZGlhZy9kaWFnZndkLmMKKysrIGIvZHJpdmVycy9jaGFyL2RpYWcvZGlhZ2Z3ZC5jCkBAIC0yMDMsMTEgKzIwMywxMiBAQAogCQkgKiBoYXMgcmVnaXN0ZXJlZCB0byByZXNwb25kIGZvciBwb2xsaW5nCiAJCSAqLwogCQlyZXR1cm4gMTsKLQllbHNlIGlmICghKGRyaXZlci0+c21kX2RhdGFbTU9ERU1fREFUQV0uY2gpICYmCi0JCQkJCSEoY2hrX2FwcHNfbWFzdGVyKCkpKQorCWVsc2UgaWYgKCEoKGRyaXZlci0+c21kX2RhdGFbTU9ERU1fREFUQV0uY2gpICYmCisJCSAoZHJpdmVyLT5yY3ZkX2ZlYXR1cmVfbWFza1tNT0RFTV9EQVRBXSkpICYmCisJCSAoY2hrX2FwcHNfbWFzdGVyKCkpKQogCQkvKgogCQkgKiBJZiB0aGUgYXBwcyBwcm9jZXNzb3IgaXMgbm90IHRoZSBtYXN0ZXIgYW5kIHRoZSBtb2RlbQotCQkgKiBpcyBub3QgdXAKKwkJICogaXMgbm90IHVwIG9yIHdlIGRpZCBub3QgcmVjZWl2ZSB0aGUgZmVhdHVyZSBtYXNrcyBmcm9tIE1vZGVtCiAJCSAqLwogCQlyZXR1cm4gMTsKIAllbHNlCkBAIC0zODksNyArMzkwLDcgQEAKIAkgKiBEbyBub3Qgd29yayB3aXRoIHJlZl9jb3VudCBoZXJlIGluIGNhc2UKIAkgKiBvZiBzcHVyaW91cyBpbnRlcnJ1cHQKIAkgKi8KLQlpZiAobG9jay0+ZW5hYmxlZCkKKwlpZiAobG9jay0+ZW5hYmxlZCAmJiAhd2FrZV9sb2NrX2FjdGl2ZSgmbG9jay0+cmVhZF9sb2NrKSkKIAkJd2FrZV9sb2NrKCZsb2NrLT5yZWFkX2xvY2spOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2stPnJlYWRfc3BpbmxvY2ssIHJlYWRfbG9ja19mbGFncyk7CiB9CkBAIC0xMTcwLDYgKzExNzEsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IGRpYWdfYXBwc19yZXNwb25kcygpCit7CisJaWYgKGNoa19hcHBzX29ubHkoKSkgeworCQlpZiAoZHJpdmVyLT5zbWRfZGF0YVtNT0RFTV9EQVRBXS5jaCAmJgorCQkJCWRyaXZlci0+cmN2ZF9mZWF0dXJlX21hc2tbTU9ERU1fREFUQV0pIHsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKwogaW50IGRpYWdfcHJvY2Vzc19hcHBzX3BrdCh1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCiB7CiAJdWludDE2X3Qgc3Vic3lzX2NtZF9jb2RlOwpAQCAtMTIwNCw3ICsxMjE3LDggQEAKIAlwcl9kZWJ1ZygiZGlhZzogJWQgJWQgJWQiLCBjbWRfY29kZSwgc3Vic3lzX2lkLCBzdWJzeXNfY21kX2NvZGUpOwogCWZvciAoaSA9IDA7IGkgPCBkaWFnX21heF9yZWc7IGkrKykgewogCQllbnRyeSA9IGRyaXZlci0+dGFibGVbaV07Ci0JCWlmIChlbnRyeS5wcm9jZXNzX2lkICE9IE5PX1BST0NFU1MpIHsKKwkJaWYgKGVudHJ5LnByb2Nlc3NfaWQgIT0gTk9fUFJPQ0VTUyAmJgorCQkJCWRyaXZlci0+cmN2ZF9mZWF0dXJlX21hc2tbZW50cnkuY2xpZW50X2lkXSkgewogCQkJaWYgKGVudHJ5LmNtZF9jb2RlID09IGNtZF9jb2RlICYmIGVudHJ5LnN1YnN5c19pZCA9PQogCQkJCSBzdWJzeXNfaWQgJiYgZW50cnkuY21kX2NvZGVfbG8gPD0KIAkJCQkJCQkgc3Vic3lzX2NtZF9jb2RlICYmCkBAIC0xMjUwLDggKzEyNjQsNyBAQAogCQlyZXR1cm4gZGlhZ19wcm9jZXNzX3N0bV9jbWQoYnVmKTsKIAl9CiAJLyogQ2hlY2sgZm9yIEFwcHMgT25seSAmIGdldCBldmVudCBtYXNrIHJlcXVlc3QgKi8KLQllbHNlIGlmICghKGRyaXZlci0+c21kX2RhdGFbTU9ERU1fREFUQV0uY2gpICYmIGNoa19hcHBzX29ubHkoKSAmJgotCQkJCQkJCQkqYnVmID09IDB4ODEpIHsKKwllbHNlIGlmIChkaWFnX2FwcHNfcmVzcG9uZHMoKSAmJiAqYnVmID09IDB4ODEpIHsKIAkJZHJpdmVyLT5hcHBzX3JzcF9idWZbMF0gPSAweDgxOwogCQlkcml2ZXItPmFwcHNfcnNwX2J1ZlsxXSA9IDB4MDsKIAkJKih1aW50MTZfdCAqKShkcml2ZXItPmFwcHNfcnNwX2J1ZiArIDIpID0gMHgwOwpAQCAtMTI2Miw4ICsxMjc1LDggQEAKIAkJcmV0dXJuIDA7CiAJfQogCS8qIEdldCBsb2cgSUQgcmFuZ2UgJiBDaGVjayBmb3IgQXBwcyBPbmx5ICovCi0JZWxzZSBpZiAoIShkcml2ZXItPnNtZF9kYXRhW01PREVNX0RBVEFdLmNoKSAmJiBjaGtfYXBwc19vbmx5KCkKLQkJCSAgJiYgKCpidWYgPT0gMHg3MykgJiYgKihpbnQgKikoYnVmKzQpID09IDEpIHsKKwllbHNlIGlmIChkaWFnX2FwcHNfcmVzcG9uZHMoKSAmJiAoKmJ1ZiA9PSAweDczKSAmJgorCQkJCQkJCSooaW50ICopKGJ1Zis0KSA9PSAxKSB7CiAJCWRyaXZlci0+YXBwc19yc3BfYnVmWzBdID0gMHg3MzsKIAkJKihpbnQgKikoZHJpdmVyLT5hcHBzX3JzcF9idWYgKyA0KSA9IDB4MTsgLyogb3BlcmF0aW9uIElEICovCiAJCSooaW50ICopKGRyaXZlci0+YXBwc19yc3BfYnVmICsgOCkgPSAweDA7IC8qIHN1Y2Nlc3MgY29kZSAqLwpAQCAtMTI4Nyw4ICsxMzAwLDggQEAKIAkJcmV0dXJuIDA7CiAJfQogCS8qIFJlc3BvbmQgdG8gR2V0IFNTSUQgUmFuZ2UgcmVxdWVzdCBtZXNzYWdlICovCi0JZWxzZSBpZiAoIShkcml2ZXItPnNtZF9kYXRhW01PREVNX0RBVEFdLmNoKSAmJiBjaGtfYXBwc19vbmx5KCkKLQkJCSAmJiAoKmJ1ZiA9PSAweDdkKSAmJiAoKihidWYrMSkgPT0gMHgxKSkgeworCWVsc2UgaWYgKGRpYWdfYXBwc19yZXNwb25kcygpICYmICgqYnVmID09IDB4N2QpICYmCisJCQkJCQkJKCooYnVmKzEpID09IDB4MSkpIHsKIAkJZHJpdmVyLT5hcHBzX3JzcF9idWZbMF0gPSAweDdkOwogCQlkcml2ZXItPmFwcHNfcnNwX2J1ZlsxXSA9IDB4MTsKIAkJZHJpdmVyLT5hcHBzX3JzcF9idWZbMl0gPSAweDE7CkBAIC0xMzQ1LDggKzEzNTgsOCBAQAogCQlyZXR1cm4gMDsKIAl9CiAJLyogQ2hlY2sgZm9yIEFwcHMgT25seSBSZXNwb25kIHRvIEdldCBTdWJzeXMgQnVpbGQgbWFzayAqLwotCWVsc2UgaWYgKCEoZHJpdmVyLT5zbWRfZGF0YVtNT0RFTV9EQVRBXS5jaCkgJiYgY2hrX2FwcHNfb25seSgpCi0JCQkgJiYgKCpidWYgPT0gMHg3ZCkgJiYgKCooYnVmKzEpID09IDB4MikpIHsKKwllbHNlIGlmIChkaWFnX2FwcHNfcmVzcG9uZHMoKSAmJiAoKmJ1ZiA9PSAweDdkKSAmJgorCQkJCQkJCSgqKGJ1ZisxKSA9PSAweDIpKSB7CiAJCXNzaWRfZmlyc3QgPSAqKHVpbnQxNl90ICopKGJ1ZiArIDIpOwogCQlzc2lkX2xhc3QgPSAqKHVpbnQxNl90ICopKGJ1ZiArIDQpOwogCQlzc2lkX3JhbmdlID0gNCAqIChzc2lkX2xhc3QgLSBzc2lkX2ZpcnN0ICsgMSk7CkBAIC0yNDQ0LDYgKzI0NTcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBOVU1fU01EX0NPTlRST0xfQ0hBTk5FTFM7IGkrKykgewogCQlkcml2ZXItPnNlcGFyYXRlX2NtZHJzcFtpXSA9IDA7CiAJCWRyaXZlci0+cGVyaXBoZXJhbF9zdXBwb3J0c19zdG1baV0gPSBESVNBQkxFX1NUTTsKKwkJZHJpdmVyLT5yY3ZkX2ZlYXR1cmVfbWFza1tpXSA9IDA7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IE5VTV9TVE1fUFJPQ0VTU09SUzsgaSsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZGlhZy9kaWFnZndkLmggYi9kcml2ZXJzL2NoYXIvZGlhZy9kaWFnZndkLmgKaW5kZXggYzZlMTI3My4uMWE0NjAxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RpYWcvZGlhZ2Z3ZC5oCisrKyBiL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdmd2QuaApAQCAtNTMsNiArNTMsNyBAQAogdm9pZCBkaWFnX2NtcF9sb2dnaW5nX21vZGVzX2RpYWdmd2RfYnJpZGdlKGludCBvbGRfbW9kZSwgaW50IG5ld19tb2RlKTsKIGludCBkaWFnX3Byb2Nlc3NfYXBwc19wa3QodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKTsKIHZvaWQgZGlhZ19yZXNldF9zbWRfZGF0YShpbnQgcXVldWUpOworaW50IGRpYWdfYXBwc19yZXNwb25kcyh2b2lkKTsKIC8qIFN0YXRlIGZvciBkaWFnIGZvcndhcmRpbmcgKi8KICNpZmRlZiBDT05GSUdfRElBR19PVkVSX1VTQgogaW50IGRpYWdmd2RfY29ubmVjdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdmd2RfY250bC5jIGIvZHJpdmVycy9jaGFyL2RpYWcvZGlhZ2Z3ZF9jbnRsLmMKaW5kZXggZTBkZWVmMy4uZDNjMzExZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RpYWcvZGlhZ2Z3ZF9jbnRsLmMKKysrIGIvZHJpdmVycy9jaGFyL2RpYWcvZGlhZ2Z3ZF9jbnRsLmMKQEAgLTM3LDYgKzM3LDkgQEAKIAlkaWFnX2NsZWFyX3JlZyhzbWRfaW5mby0+cGVyaXBoZXJhbCk7CiAJcmVnX2RpcnR5IF49IHNtZF9pbmZvLT5wZXJpcGhlcmFsX21hc2s7CiAKKwkvKiBSZXNldCB0aGUgZmVhdHVyZSBtYXNrIGZsYWcgKi8KKwlkcml2ZXItPnJjdmRfZmVhdHVyZV9tYXNrW3NtZF9pbmZvLT5wZXJpcGhlcmFsXSA9IDA7CisKIAlzbWRfaW5mby0+bm90aWZ5X2NvbnRleHQgPSAwOwogfQogCkBAIC0xNTgsMTQgKzE2MSwyMSBAQAogCQkJbXNnID0gYnVmK0hEUl9TSVo7CiAJCQlyYW5nZSA9IGJ1ZitIRFJfU0laKwogCQkJCQlzaXplb2Yoc3RydWN0IGRpYWdfY3RybF9tc2cpOworCQkJaWYgKG1zZy0+Y291bnRfZW50cmllcyA9PSAwKSB7CisJCQkJcHJfZGVidWcoImRpYWc6IEluICVzLCByZWNlaXZlZCByZWcgdGJsIHdpdGggbm8gZW50cmllc1xuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQkJCWJ1ZiA9IGJ1ZiArIEhEUl9TSVogKyBkYXRhX2xlbjsKKwkJCQljb250aW51ZTsKKwkJCX0KIAkJCXBrdF9wYXJhbXMtPmNvdW50ID0gbXNnLT5jb3VudF9lbnRyaWVzOwogCQkJcGt0X3BhcmFtcy0+cGFyYW1zID0ga3phbGxvYyhwa3RfcGFyYW1zLT5jb3VudCAqCiAJCQkJc2l6ZW9mKHN0cnVjdCBiaW5kcGt0X3BhcmFtcyksIEdGUF9LRVJORUwpOwotCQkJaWYgKFpFUk9fT1JfTlVMTF9QVFIocGt0X3BhcmFtcy0+cGFyYW1zKSkgewotCQkJCXByX2FsZXJ0KCJkaWFnOiBJbiAlcywgTWVtb3J5IGFsbG9jIGZhaWxcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQlrZnJlZShwa3RfcGFyYW1zKTsKLQkJCQlyZXR1cm4gZmxhZzsKKwkJCWlmICghcGt0X3BhcmFtcy0+cGFyYW1zKSB7CisJCQkJcHJfYWxlcnQoImRpYWc6IEluICVzLCBNZW1vcnkgYWxsb2MgZmFpbCBmb3IgY21kX2NvZGU6ICVkLCBzdWJzeXM6ICVkXG4iLAorCQkJCQkJX19mdW5jX18sIG1zZy0+Y21kX2NvZGUsCisJCQkJCQltc2ctPnN1YnN5c2lkKTsKKwkJCQlidWYgPSBidWYgKyBIRFJfU0laICsgZGF0YV9sZW47CisJCQkJY29udGludWU7CiAJCQl9CiAJCQl0ZW1wID0gcGt0X3BhcmFtcy0+cGFyYW1zOwogCQkJZm9yIChqID0gMDsgaiA8IHBrdF9wYXJhbXMtPmNvdW50OyBqKyspIHsKQEAgLTE5NSw2ICsyMDUsOCBAQAogCQkJaW50IGZlYXR1cmVfbWFza19sZW4gPSAqKGludCAqKShidWYrOCk7CiAJCQlpZiAoZmVhdHVyZV9tYXNrX2xlbiA+IDApIHsKIAkJCQlpbnQgcGVyaXBoID0gc21kX2luZm8tPnBlcmlwaGVyYWw7CisJCQkJZHJpdmVyLT5yY3ZkX2ZlYXR1cmVfbWFza1tzbWRfaW5mby0+cGVyaXBoZXJhbF0KKwkJCQkJCQkJCT0gMTsKIAkJCQlmZWF0dXJlX21hc2sgPSAqKHVpbnQ4X3QgKikoYnVmKzEyKTsKIAkJCQlpZiAocGVyaXBoID09IE1PREVNX0RBVEEpCiAJCQkJCWRyaXZlci0+bG9nX29uX2RlbWFuZF9zdXBwb3J0ID0KQEAgLTI2MiwzMSArMjc0LDM5IEBACiB7CiAJaW50IHRlbXBfcmVhbF90aW1lID0gTU9ERV9SRUFMVElNRSwgaTsKIAotCS8qIElmIGFueSBvZiB0aGUgcHJvY2VzcyBpcyB2b3RpbmcgZm9yIFJlYWwgdGltZSwgdGhlbiBEaWFnCi0JICAgc2hvdWxkIGJlIGluIHJlYWwgdGltZSBtb2RlIGlycmVzcGVjdGl2ZSBvZiBvdGhlciBjbGF1c2VzLiBJZgotCSAgIFVTQiBpcyBjb25uZWN0ZWQsIGNoZWNrIHdoYXQgdGhlIG1lbW9yeSBkZXZpY2UgcHJvY2VzcyBpcwotCSAgIHZvdGluZyBmb3IuIElmIGl0IGlzIHZvdGluZyBmb3IgTm9uIHJlYWwgdGltZSwgdGhlIGZpbmFsIG1vZGUKLQkgICBzaG91bGQgYmUgTm9uIHJlYWwgdGltZSwgcmVhbCB0aW1lIG90aGVyd2lzZS4gSWYgVVNCIGlzCi0JICAgZGlzY29ubmN0ZWQgYW5kIG5vIHByb2Nlc3MgaXMgdm90aW5nIGZvciByZWFsIHRpbWUsIHRoZQotCSAgIHJlc3VsdGFudCBtb2RlIHNob3VsZCBiZSBOb24gUmVhbCBUaW1lLgotCSovCi0JaWYgKChkcml2ZXItPnByb2NfcnRfdm90ZV9tYXNrICYgZHJpdmVyLT5wcm9jX2FjdGl2ZV9tYXNrKSAmJgotCQkJCQkoZHJpdmVyLT5wcm9jX2FjdGl2ZV9tYXNrICE9IDApKQotCQkJdGVtcF9yZWFsX3RpbWUgPSBNT0RFX1JFQUxUSU1FOwotCWVsc2UgaWYgKGRyaXZlci0+dXNiX2Nvbm5lY3RlZCkKKwlpZiAoZHJpdmVyLT5wcm9jX2FjdGl2ZV9tYXNrID09IDApIHsKKwkJLyogVGhlcmUgYXJlIG5vIERDSSBvciBNZW1vcnkgRGV2aWNlIHByb2Nlc3Nlcy4gRGlhZyBzaG91bGQKKwkJICogYmUgaW4gUmVhbCBUaW1lIG1vZGUgaXJyZXNwZWN0aXZlIG9mIFVTQiBjb25uZWN0aW9uCisJCSAqLworCQl0ZW1wX3JlYWxfdGltZSA9IE1PREVfUkVBTFRJTUU7CisJfSBlbHNlIGlmIChkcml2ZXItPnByb2NfcnRfdm90ZV9tYXNrICYgZHJpdmVyLT5wcm9jX2FjdGl2ZV9tYXNrKSB7CisJCS8qIEF0bGVhc3Qgb25lIHByb2Nlc3MgaXMgYWxpdmUgYW5kIGlzIHZvdGluZyBmb3IgUmVhbCBUaW1lCisJCSAqIGRhdGEgLSBEaWFnIHNob3VsZCBiZSBpbiByZWFsIHRpbWUgbW9kZSBpcnJlc3BlY3RpdmUgb2YgVVNCCisJCSAqIGNvbm5lY3Rpb24uCisJCSAqLworCQl0ZW1wX3JlYWxfdGltZSA9IE1PREVfUkVBTFRJTUU7CisJfSBlbHNlIGlmIChkcml2ZXItPnVzYl9jb25uZWN0ZWQpIHsKKwkJLyogSWYgVVNCIGlzIGNvbm5lY3RlZCwgY2hlY2sgaW5kaXZpZHVhbCBwcm9jZXNzLiBJZiBNZW1vcnkKKwkJICogRGV2aWNlIE1vZGUgaXMgYWN0aXZlLCBzZXQgdGhlIG1vZGUgcmVxdWVzdGVkIGJ5IE1lbW9yeQorCQkgKiBEZXZpY2UgcHJvY2Vzcy4gU2V0IHRvIHJlYWx0aW1lIG1vZGUgb3RoZXJ3aXNlLgorCQkgKi8KIAkJaWYgKChkcml2ZXItPnByb2NfcnRfdm90ZV9tYXNrICYgRElBR19QUk9DX01FTU9SWV9ERVZJQ0UpID09IDApCiAJCQl0ZW1wX3JlYWxfdGltZSA9IE1PREVfTk9OUkVBTFRJTUU7CiAJCWVsc2UKIAkJCXRlbXBfcmVhbF90aW1lID0gTU9ERV9SRUFMVElNRTsKLQllbHNlCisJfSBlbHNlIHsKKwkJLyogV2UgY29tZSBoZXJlIGlmIFVTQiBpcyBub3QgY29ubmVjdGVkIGFuZCB0aGUgYWN0aXZlCisJCSAqIHByb2Nlc3NlcyBhcmUgdm90aW5nIGZvciBOb24gcmVhbHRpbWUgbW9kZS4KKwkJICovCiAJCXRlbXBfcmVhbF90aW1lID0gTU9ERV9OT05SRUFMVElNRTsKKwl9CiAKIAlpZiAodGVtcF9yZWFsX3RpbWUgIT0gZHJpdmVyLT5yZWFsX3RpbWVfbW9kZSkgewogCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1NNRF9DT05UUk9MX0NIQU5ORUxTOyBpKyspCiAJCQlkaWFnX3NlbmRfZGlhZ19tb2RlX3VwZGF0ZV9ieV9zbWQoJmRyaXZlci0+c21kX2NudGxbaV0sCiAJCQkJCQkJdGVtcF9yZWFsX3RpbWUpOwogCX0gZWxzZSB7Ci0JCXByX2luZm8oImRpYWc6IGRpZCBub3QgdXBkYXRlIHJlYWwgdGltZSBtb2RlLCBhbHJlYWR5IGluIHRoZSByZXEgbW9kZSAlZCIsCisJCXByX2RlYnVnKCJkaWFnOiBkaWQgbm90IHVwZGF0ZSByZWFsIHRpbWUgbW9kZSwgYWxyZWFkeSBpbiB0aGUgcmVxIG1vZGUgJWQiLAogCQkJCQl0ZW1wX3JlYWxfdGltZSk7CiAJfQogCWlmIChkcml2ZXItPnJlYWxfdGltZV91cGRhdGVfYnVzeSA+IDApCkBAIC0yOTcsOSArMzE3LDE1IEBACiB7CiAJaW50IHRlbXBfcmVhbF90aW1lID0gTU9ERV9SRUFMVElNRSwgaTsKIAotCWlmICghKGRyaXZlci0+cHJvY19ydF92b3RlX21hc2sgJiBkcml2ZXItPnByb2NfYWN0aXZlX21hc2spICYmCi0JCQkJCShkcml2ZXItPnByb2NfYWN0aXZlX21hc2sgIT0gMCkpCisJaWYgKGRyaXZlci0+cHJvY19hY3RpdmVfbWFzayA9PSAwKSB7CisJCS8qIFRoZXJlIGFyZSBubyBEQ0kgb3IgTWVtb3J5IERldmljZSBwcm9jZXNzZXMuIERpYWcgc2hvdWxkCisJCSAqIGJlIGluIFJlYWwgVGltZSBtb2RlLgorCQkgKi8KKwkJdGVtcF9yZWFsX3RpbWUgPSBNT0RFX1JFQUxUSU1FOworCX0gZWxzZSBpZiAoIShkcml2ZXItPnByb2NfcnRfdm90ZV9tYXNrICYgZHJpdmVyLT5wcm9jX2FjdGl2ZV9tYXNrKSkgeworCQkvKiBObyBhY3RpdmUgcHJvY2VzcyBpcyB2b3RpbmcgZm9yIHJlYWwgdGltZSBtb2RlICovCiAJCXRlbXBfcmVhbF90aW1lID0gTU9ERV9OT05SRUFMVElNRTsKKwl9CiAKIAlpZiAodGVtcF9yZWFsX3RpbWUgIT0gZHJpdmVyLT5yZWFsX3RpbWVfbW9kZSkgewogCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1NNRF9DT05UUk9MX0NIQU5ORUxTOyBpKyspCkBAIC0zMjEsMTIgKzM0NywxNyBAQAogCWNoYXIgYnVmW3NpemVvZihzdHJ1Y3QgZGlhZ19jdHJsX21zZ19kaWFnbW9kZSldOwogCWludCBtc2dfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZGlhZ19jdHJsX21zZ19kaWFnbW9kZSk7CiAJaW50IHdyX3NpemUgPSAtRU5PTUVNLCByZXRyeV9jb3VudCA9IDAsIHRpbWVyOworCXN0cnVjdCBkaWFnX3NtZF9pbmZvICpkYXRhID0gTlVMTDsKIAogCS8qIEZvciBub3cgb25seSBhbGxvdyB0aGUgbW9kZW0gdG8gcmVjZWl2ZSB0aGUgbWVzc2FnZSAqLwogCWlmICghc21kX2luZm8gfHwgc21kX2luZm8tPnR5cGUgIT0gU01EX0NOVExfVFlQRSB8fAogCQkoc21kX2luZm8tPnBlcmlwaGVyYWwgIT0gTU9ERU1fREFUQSkpCiAJCXJldHVybjsKIAorCWRhdGEgPSAmZHJpdmVyLT5zbWRfZGF0YVtzbWRfaW5mby0+cGVyaXBoZXJhbF07CisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKIAltdXRleF9sb2NrKCZkcml2ZXItPmRpYWdfY250bF9tdXRleCk7CiAJZGlhZ21vZGUuY3RybF9wa3RfaWQgPSBESUFHX0NUUkxfTVNHX0RJQUdNT0RFOwogCWRpYWdtb2RlLmN0cmxfcGt0X2RhdGFfbGVuID0gMzY7CkBAIC0zNjIsMTEgKzM5Myw5IEBACiAJCQkJZm9yICh0aW1lciA9IDA7IHRpbWVyIDwgNTsgdGltZXIrKykKIAkJCQkJdWRlbGF5KDIwMDApOwogCQkJfSBlbHNlIHsKLQkJCQlzdHJ1Y3QgZGlhZ19zbWRfaW5mbyAqZGF0YSA9CisJCQkJZGF0YSA9CiAJCQkJJmRyaXZlci0+c21kX2RhdGFbc21kX2luZm8tPnBlcmlwaGVyYWxdOwogCQkJCWRyaXZlci0+cmVhbF90aW1lX21vZGUgPSByZWFsX3RpbWU7Ci0JCQkJcHJvY2Vzc19sb2NrX2VuYWJsaW5nKCZkYXRhLT5ucnRfbG9jaywKLQkJCQkJCQkJcmVhbF90aW1lKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMzc4LDYgKzQwNyw3IEBACiAJCXByX2VycigiZGlhZzogY2ggaW52YWxpZCwgZmVhdHVyZSB1cGRhdGUgb24gcHJvYyAlZFxuIiwKIAkJCQlzbWRfaW5mby0+cGVyaXBoZXJhbCk7CiAJfQorCXByb2Nlc3NfbG9ja19lbmFibGluZygmZGF0YS0+bnJ0X2xvY2ssIHJlYWxfdGltZSk7CiAKIAltdXRleF91bmxvY2soJmRyaXZlci0+ZGlhZ19jbnRsX211dGV4KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMuYyBiL2RyaXZlcnMvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMuYwppbmRleCA4MjY3MjkzLi5mMzViYTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLmMKKysrIGIvZHJpdmVycy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy5jCkBAIC0xNDA3LDMyICsxNDA3LDM5IEBACiAKIAlyZXQgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZkZXYsIDAsIDEsIGRydmRhdGEtPmJ5dGVfY250cl9ub2RlKTsKIAlpZiAocmV0KQotCQlnb3RvIGRldl9lcnIwOworCQlnb3RvIGVycjA7CisKIAljZGV2X2luaXQoJmRydmRhdGEtPmJ5dGVfY250cl9kZXYsICZieXRlX2NudHJfZm9wcyk7CisKIAlkcnZkYXRhLT5ieXRlX2NudHJfZGV2Lm93bmVyID0gVEhJU19NT0RVTEU7CiAJZHJ2ZGF0YS0+Ynl0ZV9jbnRyX2Rldi5vcHMgPSAmYnl0ZV9jbnRyX2ZvcHM7CiAJcmV0ID0gY2Rldl9hZGQoJmRydmRhdGEtPmJ5dGVfY250cl9kZXYsIGRldiwgMSk7CiAJaWYgKHJldCkKLQkJZ290byBkZXZfZXJyMTsKKwkJZ290byBlcnIxOworCiAJZHJ2ZGF0YS0+Ynl0ZV9jbnRyX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLAogCQkJCQkJZHJ2ZGF0YS0+Ynl0ZV9jbnRyX25vZGUpOwotCWlmICghZHJ2ZGF0YS0+Ynl0ZV9jbnRyX2NsYXNzKQotCQlnb3RvIGRldl9lcnIyOworCWlmIChJU19FUlIoZHJ2ZGF0YS0+Ynl0ZV9jbnRyX2NsYXNzKSkgeworCQlyZXQgPSBQVFJfRVJSKGRydmRhdGEtPmJ5dGVfY250cl9jbGFzcyk7CisJCWdvdG8gZXJyMjsKKwl9CisKIAlkZXZpY2UgPSBkZXZpY2VfY3JlYXRlKGRydmRhdGEtPmJ5dGVfY250cl9jbGFzcywgTlVMTCwKIAkJCSAgICAgICBkcnZkYXRhLT5ieXRlX2NudHJfZGV2LmRldiwgZHJ2ZGF0YSwKIAkJCSAgICAgICBkcnZkYXRhLT5ieXRlX2NudHJfbm9kZSk7CiAJaWYgKElTX0VSUihkZXZpY2UpKSB7CiAJCXJldCA9IFBUUl9FUlIoZGV2aWNlKTsKLQkJZ290byBkZXZfZXJyMzsKKwkJZ290byBlcnIzOwogCX0KKwogCXJldHVybiAwOwotZGV2X2VycjM6CitlcnIzOgogCWNsYXNzX2Rlc3Ryb3koZHJ2ZGF0YS0+Ynl0ZV9jbnRyX2NsYXNzKTsKLWRldl9lcnIyOgorZXJyMjoKIAljZGV2X2RlbCgmZHJ2ZGF0YS0+Ynl0ZV9jbnRyX2Rldik7Ci1kZXZfZXJyMToKK2VycjE6CiAJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRydmRhdGEtPmJ5dGVfY250cl9kZXYuZGV2LCAxKTsKLWRldl9lcnIwOgorZXJyMDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDY2LDYgKzE0NzMsNyBAQAogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJCeXRlLWNudHItaXJxIG5vdCBzcGVjaWZpZWRcbiIpOwogCQlnb3RvIGVycjsKIAl9CisKIAlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGRydmRhdGEtPmJ5dGVfY250cl9pcnEsCiAJCQl0bWNfZXRyX2J5dGVfY250cl9pcnEsCiAJCQlJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9TSEFSRUQsCkBAIC0xNDc0LDE3ICsxNDgyLDI3IEBACiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIlJlcXVlc3QgaXJxIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyOwogCX0KKwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRydmRhdGEtPndxKTsKIAlub2RlX3NpemUgKz0gc3RybGVuKG5vZGVfbmFtZSk7CisKIAlkcnZkYXRhLT5ieXRlX2NudHJfbm9kZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAotCQkJCW5vZGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQkJCSAgICAgICBub2RlX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghZHJ2ZGF0YS0+Ynl0ZV9jbnRyX25vZGUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQnl0ZSBjbnRyIG5vZGUgbmFtZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKwogCXN0cmxjcHkoZHJ2ZGF0YS0+Ynl0ZV9jbnRyX25vZGUsIG5vZGVfbmFtZSwgbm9kZV9zaXplKTsKIAlzdHJsY2F0KGRydmRhdGEtPmJ5dGVfY250cl9ub2RlLCAiLXN0cmVhbSIsIG5vZGVfc2l6ZSk7CisKIAlyZXQgPSB0bWNfZXRyX2J5dGVfY250cl9kZXZfcmVnaXN0ZXIoZHJ2ZGF0YSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJCeXRlIGNudHIgbm9kZSBub3QgcmVnaXN0ZXJlZFxuIik7CiAJCWdvdG8gZXJyOwogCX0KKwogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJCeXRlIENvdW50ZXIgZmVhdHVyZSBlbmFibGVkXG4iKTsKIAlyZXR1cm4gMDsKIGVycjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCmluZGV4IDM3NDE3MGQuLjk3NWE0MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwpAQCAtMTExNCwxMCArMTExNCwxMCBAQAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogCXN0cm5jcHkocGVyX2NwdShjcHVmcmVxX3BvbGljeV9zYXZlLCBjcHUpLmdvdiwgZGF0YS0+Z292ZXJub3ItPm5hbWUsCiAJCQlDUFVGUkVRX05BTUVfTEVOKTsKLQlwZXJfY3B1KGNwdWZyZXFfcG9saWN5X3NhdmUsIGNwdSkubWluID0gZGF0YS0+bWluOwotCXBlcl9jcHUoY3B1ZnJlcV9wb2xpY3lfc2F2ZSwgY3B1KS5tYXggPSBkYXRhLT5tYXg7Ci0JcHJfZGVidWcoIlNhdmluZyBDUFUlZCBwb2xpY3kgbWluICVkIGFuZCBtYXggJWRcbiIsCi0JCQljcHUsIGRhdGEtPm1pbiwgZGF0YS0+bWF4KTsKKwlwZXJfY3B1KGNwdWZyZXFfcG9saWN5X3NhdmUsIGNwdSkubWluID0gZGF0YS0+dXNlcl9wb2xpY3kubWluOworCXBlcl9jcHUoY3B1ZnJlcV9wb2xpY3lfc2F2ZSwgY3B1KS5tYXggPSBkYXRhLT51c2VyX3BvbGljeS5tYXg7CisJcHJfZGVidWcoIlNhdmluZyBDUFUlZCB1c2VyIHBvbGljeSBtaW4gJWQgYW5kIG1heCAlZFxuIiwKKwkJCWNwdSwgZGF0YS0+dXNlcl9wb2xpY3kubWluLCBkYXRhLT51c2VyX3BvbGljeS5tYXgpOwogI2VuZGlmCiAKIAkvKiBpZiB3ZSBoYXZlIG90aGVyIENQVXMgc3RpbGwgcmVnaXN0ZXJlZCwgd2UgbmVlZCB0byB1bmxpbmsgdGhlbSwKQEAgLTExNDMsOSArMTE0MywxMSBAQAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogCQkJc3RybmNweShwZXJfY3B1KGNwdWZyZXFfcG9saWN5X3NhdmUsIGopLmdvdiwKIAkJCQlkYXRhLT5nb3Zlcm5vci0+bmFtZSwgQ1BVRlJFUV9OQU1FX0xFTik7Ci0JCQlwZXJfY3B1KGNwdWZyZXFfcG9saWN5X3NhdmUsIGopLm1pbiA9IGRhdGEtPm1pbjsKLQkJCXBlcl9jcHUoY3B1ZnJlcV9wb2xpY3lfc2F2ZSwgaikubWF4ID0gZGF0YS0+bWF4OwotCQkJcHJfZGVidWcoIlNhdmluZyBDUFUlZCBwb2xpY3kgbWluICVkIGFuZCBtYXggJWRcbiIsCisJCQlwZXJfY3B1KGNwdWZyZXFfcG9saWN5X3NhdmUsIGopLm1pbgorCQkJCQkJPSBkYXRhLT51c2VyX3BvbGljeS5taW47CisJCQlwZXJfY3B1KGNwdWZyZXFfcG9saWN5X3NhdmUsIGopLm1heAorCQkJCQkJPSBkYXRhLT51c2VyX3BvbGljeS5tYXg7CisJCQlwcl9kZWJ1ZygiU2F2aW5nIENQVSVkIHVzZXIgcG9saWN5IG1pbiAlZCBhbmQgbWF4ICVkXG4iLAogCQkJCQlqLCBkYXRhLT5taW4sIGRhdGEtPm1heCk7CiAjZW5kaWYKIAkJCWNwdV9kZXYgPSBnZXRfY3B1X2RldmljZShqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX29uZGVtYW5kLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9vbmRlbWFuZC5jCmluZGV4IGU2YjJhM2MuLmFmNDk0YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX29uZGVtYW5kLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfb25kZW1hbmQuYwpAQCAtMTQ0LDYgKzE0NCw3IEBACiAJdW5zaWduZWQgaW50IHNhbXBsaW5nX2Rvd25fZmFjdG9yOwogCWludCAgICAgICAgICBwb3dlcnNhdmVfYmlhczsKIAl1bnNpZ25lZCBpbnQgaW9faXNfYnVzeTsKKwl1bnNpZ25lZCBpbnQgaW5wdXRfYm9vc3Q7CiB9IGRic190dW5lcnNfaW5zID0gewogCS51cF90aHJlc2hvbGRfbXVsdGlfY29yZSA9IERFRl9GUkVRVUVOQ1lfVVBfVEhSRVNIT0xELAogCS51cF90aHJlc2hvbGQgPSBERUZfRlJFUVVFTkNZX1VQX1RIUkVTSE9MRCwKQEAgLTE1NSw2ICsxNTYsNyBAQAogCS5wb3dlcnNhdmVfYmlhcyA9IDAsCiAJLnN5bmNfZnJlcSA9IDAsCiAJLm9wdGltYWxfZnJlcSA9IDAsCisJLmlucHV0X2Jvb3N0ID0gMCwKIH07CiAKIHN0YXRpYyBpbmxpbmUgdTY0IGdldF9jcHVfaWRsZV90aW1lX2ppZmZ5KHVuc2lnbmVkIGludCBjcHUsIHU2NCAqd2FsbCkKQEAgLTMxOSw2ICszMjEsNyBAQAogc2hvd19vbmUob3B0aW1hbF9mcmVxLCBvcHRpbWFsX2ZyZXEpOwogc2hvd19vbmUodXBfdGhyZXNob2xkX2FueV9jcHVfbG9hZCwgdXBfdGhyZXNob2xkX2FueV9jcHVfbG9hZCk7CiBzaG93X29uZShzeW5jX2ZyZXEsIHN5bmNfZnJlcSk7CitzaG93X29uZShpbnB1dF9ib29zdCwgaW5wdXRfYm9vc3QpOwogCiBzdGF0aWMgc3NpemVfdCBzaG93X3Bvd2Vyc2F2ZV9iaWFzCiAoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTM5Niw2ICszOTksMTggQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2lucHV0X2Jvb3N0KHN0cnVjdCBrb2JqZWN0ICphLCBzdHJ1Y3QgYXR0cmlidXRlICpiLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGludCBpbnB1dDsKKwlpbnQgcmV0OworCXJldCA9IHNzY2FuZihidWYsICIldSIsICZpbnB1dCk7CisJaWYgKHJldCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkYnNfdHVuZXJzX2lucy5pbnB1dF9ib29zdCA9IGlucHV0OworCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIHNzaXplX3Qgc3RvcmVfc3luY19mcmVxKHN0cnVjdCBrb2JqZWN0ICphLCBzdHJ1Y3QgYXR0cmlidXRlICpiLAogCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewpAQCAtNjgwLDYgKzY5NSw3IEBACiBkZWZpbmVfb25lX2dsb2JhbF9ydyhvcHRpbWFsX2ZyZXEpOwogZGVmaW5lX29uZV9nbG9iYWxfcncodXBfdGhyZXNob2xkX2FueV9jcHVfbG9hZCk7CiBkZWZpbmVfb25lX2dsb2JhbF9ydyhzeW5jX2ZyZXEpOworZGVmaW5lX29uZV9nbG9iYWxfcncoaW5wdXRfYm9vc3QpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGJzX2F0dHJpYnV0ZXNbXSA9IHsKIAkmc2FtcGxpbmdfcmF0ZV9taW4uYXR0ciwKQEAgLTY5NCw2ICs3MTAsNyBAQAogCSZvcHRpbWFsX2ZyZXEuYXR0ciwKIAkmdXBfdGhyZXNob2xkX2FueV9jcHVfbG9hZC5hdHRyLAogCSZzeW5jX2ZyZXEuYXR0ciwKKwkmaW5wdXRfYm9vc3QuYXR0ciwKIAlOVUxMCiB9OwogCkBAIC0xMDA2LDYgKzEwMjMsNyBAQAogCXN0cnVjdCBjcHVfZGJzX2luZm9fcyAqdGhpc19kYnNfaW5mbzsKIAlzdHJ1Y3QgZGJzX3dvcmtfc3RydWN0ICpkYnNfd29yazsKIAl1bnNpZ25lZCBpbnQgY3B1OworCXVuc2lnbmVkIGludCB0YXJnZXRfZnJlcTsKIAogCWRic193b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkYnNfd29ya19zdHJ1Y3QsIHdvcmspOwogCWNwdSA9IGRic193b3JrLT5jcHU7CkBAIC0xMDIyLDE0ICsxMDQwLDE5IEBACiAJCWdvdG8gYmFpbF9pbmNvcnJlY3RfZ292ZXJub3I7CiAJfQogCi0JaWYgKHBvbGljeS0+Y3VyIDwgcG9saWN5LT5tYXgpIHsKKwlpZiAoZGJzX3R1bmVyc19pbnMuaW5wdXRfYm9vc3QpCisJCXRhcmdldF9mcmVxID0gZGJzX3R1bmVyc19pbnMuaW5wdXRfYm9vc3Q7CisJZWxzZQorCQl0YXJnZXRfZnJlcSA9IHBvbGljeS0+bWF4OworCisJaWYgKHBvbGljeS0+Y3VyIDwgdGFyZ2V0X2ZyZXEpIHsKIAkJLyoKIAkJICogQXJjaCBzcGVjaWZpYyBjcHVmcmVxIGRyaXZlciBtYXkgZmFpbC4KIAkJICogRG9uJ3QgdXBkYXRlIGdvdmVybm9yIGZyZXF1ZW5jeSB1cG9uIGZhaWx1cmUuCiAJCSAqLwotCQlpZiAoX19jcHVmcmVxX2RyaXZlcl90YXJnZXQocG9saWN5LCBwb2xpY3ktPm1heCwKKwkJaWYgKF9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KHBvbGljeSwgdGFyZ2V0X2ZyZXEsCiAJCQkJCUNQVUZSRVFfUkVMQVRJT05fTCkgPj0gMCkKLQkJCXBvbGljeS0+Y3VyID0gcG9saWN5LT5tYXg7CisJCQlwb2xpY3ktPmN1ciA9IHRhcmdldF9mcmVxOwogCiAJCXRoaXNfZGJzX2luZm8tPnByZXZfY3B1X2lkbGUgPSBnZXRfY3B1X2lkbGVfdGltZShjcHUsCiAJCQkJJnRoaXNfZGJzX2luZm8tPnByZXZfY3B1X3dhbGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvaW9uL21zbS9pb25faW9tbXVfbWFwLmMgYi9kcml2ZXJzL2dwdS9pb24vbXNtL2lvbl9pb21tdV9tYXAuYwppbmRleCAzZTFhN2VlLi5jMmI2NWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9pb24vbXNtL2lvbl9pb21tdV9tYXAuYworKysgYi9kcml2ZXJzL2dwdS9pb24vbXNtL2lvbl9pb21tdV9tYXAuYwpAQCAtMjg1LDcgKzI4NSw3IEBACiBzdGF0aWMgc3RydWN0IGlvbl9pb21tdV9tYXAgKl9faW9uX2lvbW11X21hcChzdHJ1Y3QgaW9uX2lvbW11X21ldGEgKm1ldGEsCiAJCWludCBkb21haW5fbnVtLCBpbnQgcGFydGl0aW9uX251bSwgdW5zaWduZWQgbG9uZyBhbGlnbiwKIAkJdW5zaWduZWQgbG9uZyBpb3ZhX2xlbmd0aCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQkJdW5zaWduZWQgbG9uZyAqaW92YSkKKwkJaW9uX3BoeXNfYWRkcl90ICppb3ZhKQogewogCXN0cnVjdCBpb25faW9tbXVfbWFwICpkYXRhOwogCWludCByZXQ7CkBAIC0zNjcsNyArMzY3LDcgQEAKIAogaW50IGlvbl9tYXBfaW9tbXUoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSwKIAkJCWludCBkb21haW5fbnVtLCBpbnQgcGFydGl0aW9uX251bSwgdW5zaWduZWQgbG9uZyBhbGlnbiwKLQkJCXVuc2lnbmVkIGxvbmcgaW92YV9sZW5ndGgsIHVuc2lnbmVkIGxvbmcgKmlvdmEsCisJCQl1bnNpZ25lZCBsb25nIGlvdmFfbGVuZ3RoLCBpb25fcGh5c19hZGRyX3QgKmlvdmEsCiAJCQl1bnNpZ25lZCBsb25nICpidWZmZXJfc2l6ZSwKIAkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgaW9tbXVfZmxhZ3MpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9tc20vYWRyZW5vLmMgYi9kcml2ZXJzL2dwdS9tc20vYWRyZW5vLmMKaW5kZXggNzlmYmQyYy4uZjE2ZjllNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvbXNtL2FkcmVuby5jCisrKyBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm8uYwpAQCAtMjIwMSw4ICsyMjAxLDcgQEAKIAlzdHJ1Y3QgYWRyZW5vX2RldmljZSAqYWRyZW5vX2RldiA9IEFEUkVOT19ERVZJQ0UoZGV2aWNlKTsKIAlpbnQgcmV0OwogCi0JLyogSWYgdGhlIGp1bXAgdGFibGUgaW5kZXggaXMgMCBzb2Z0IHJlc2V0IGlzIG5vdCBzdXBwb3J0ZWQgKi8KLQlpZiAoKCFhZHJlbm9fZGV2LT5wbTRfanRfaWR4KSB8fCAoIWFkcmVub19kZXYtPmdwdWRldi0+c29mdF9yZXNldCkpIHsKKwlpZiAoIWFkcmVub19kZXYtPmdwdWRldi0+c29mdF9yZXNldCkgewogCQlkZXZfV0FSTl9PTkNFKGRldmljZS0+ZGV2LCAxLCAiU29mdCByZXNldCBub3Qgc3VwcG9ydGVkIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTIyMzIsMTAgKzIyMzEsMTQgQEAKIAlkZXZpY2UtPmZ0YmwtPmlycWN0cmwoZGV2aWNlLCAxKTsKIAogCS8qCi0JICogUmVzdGFydCB0aGUgcmluZ2J1ZmZlciAtIHdlIGNhbiBnbyBkb3duIHRoZSB3YXJtIHN0YXJ0IHBhdGggYmVjYXVzZQotCSAqIHBvd2VyIHdhcyBuZXZlciB5YW5rZWQKKwkgKiBJZiB3ZSBoYXZlIG9mZnNldHMgZm9yIHRoZSBqdW1wIHRhYmxlcyB3ZSBjYW4gdHJ5IHRvIGRvIGEgd2FybSBzdGFydCwKKwkgKiBvdGhlcndpc2UgZG8gYSBmdWxsIHJpbmdidWZmZXIgcmVzdGFydAogCSAqLwotCXJldCA9IGFkcmVub19yaW5nYnVmZmVyX3dhcm1fc3RhcnQoJmFkcmVub19kZXYtPnJpbmdidWZmZXIpOworCWlmIChhZHJlbm9fZGV2LT5wbTRfanRfaWR4KQorCQlyZXQgPSBhZHJlbm9fcmluZ2J1ZmZlcl93YXJtX3N0YXJ0KCZhZHJlbm9fZGV2LT5yaW5nYnVmZmVyKTsKKwllbHNlCisJCXJldCA9IGFkcmVub19yaW5nYnVmZmVyX3N0YXJ0KCZhZHJlbm9fZGV2LT5yaW5nYnVmZmVyKTsKKwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9zdGszeDF4LmMgYi9kcml2ZXJzL2lucHV0L21pc2Mvc3RrM3gxeC5jCmluZGV4IDkzN2JmNmMuLmI3NTNkNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9zdGszeDF4LmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3N0azN4MXguYwpAQCAtMTkwLDYgKzE5MCw3IEBACiAKIHN0cnVjdCBzdGszeDF4X2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IHN0azN4MXhfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAjaWYgKCFkZWZpbmVkKFNUS19QT0xMX1BTKSB8fCAhZGVmaW5lZChTVEtfUE9MTF9BTFMpKQogICAgIGludDMyX3QgaXJxOwogICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBzdGtfd29yazsKQEAgLTI1Nyw2ICsyNTgsNyBAQAogc3RhdGljIGludDMyX3Qgc3RrM3gxeF9zZXRfcHNfdGhkX2goc3RydWN0IHN0azN4MXhfZGF0YSAqcHNfZGF0YSwgdWludDE2X3QgdGhkX2gpOwogc3RhdGljIGludDMyX3Qgc3RrM3gxeF9zZXRfYWxzX3RoZF9sKHN0cnVjdCBzdGszeDF4X2RhdGEgKnBzX2RhdGEsIHVpbnQxNl90IHRoZF9sKTsKIHN0YXRpYyBpbnQzMl90IHN0azN4MXhfc2V0X2Fsc190aGRfaChzdHJ1Y3Qgc3RrM3gxeF9kYXRhICpwc19kYXRhLCB1aW50MTZfdCB0aGRfaCk7CitzdGF0aWMgaW50IHN0azN4MXhfZGV2aWNlX2N0bChzdHJ1Y3Qgc3RrM3gxeF9kYXRhICpwc19kYXRhLCBib29sIGVuYWJsZSk7CiAvL3N0YXRpYyBpbnQzMl90IHN0azN4MXhfc2V0X3BzX2FvZmZzZXQoc3RydWN0IHN0azN4MXhfZGF0YSAqcHNfZGF0YSwgdWludDE2X3Qgb2Zmc2V0KTsKIAogaW5saW5lIHVpbnQzMl90IHN0a19hbHNjb2RlMmx1eChzdHJ1Y3Qgc3RrM3gxeF9kYXRhICpwc19kYXRhLCB1aW50MzJfdCBhbHNjb2RlKQpAQCAtNjAwLDYgKzYwMiwxMiBAQAogCWlmKGN1cnJfcHNfZW5hYmxlID09IGVuYWJsZSkKIAkJcmV0dXJuIDA7CiAKKwlpZiAoZW5hYmxlKSB7CisJCXJldCA9IHN0azN4MXhfZGV2aWNlX2N0bChwc19kYXRhLCBlbmFibGUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKICAgICByZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEocHNfZGF0YS0+Y2xpZW50LCBTVEtfU1RBVEVfUkVHKTsKICAgICBpZiAocmV0IDwgMCkKICAgICB7CkBAIC02NjIsNiArNjcwLDEyIEBACiAjZW5kaWYKIAkJcHNfZGF0YS0+cHNfZW5hYmxlZCA9IGZhbHNlOwogCX0KKwlpZiAoIWVuYWJsZSkgeworCQlyZXQgPSBzdGszeDF4X2RldmljZV9jdGwocHNfZGF0YSwgZW5hYmxlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjc0LDYgKzY4OCwxMSBAQAogCWlmKGN1cnJfYWxzX2VuYWJsZSA9PSBlbmFibGUpCiAJCXJldHVybiAwOwogCisJaWYgKGVuYWJsZSkgeworCQlyZXQgPSBzdGszeDF4X2RldmljZV9jdGwocHNfZGF0YSwgZW5hYmxlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogI2lmbmRlZiBTVEtfUE9MTF9BTFMKICAgICBpZiAoZW5hYmxlKQogCXsKQEAgLTcyNCw2ICs3NDMsMTIgQEAKIAkJCWRpc2FibGVfaXJxKHBzX2RhdGEtPmlycSk7CiAjZW5kaWYKIAl9CisJaWYgKCFlbmFibGUpIHsKKwkJcmV0ID0gc3RrM3gxeF9kZXZpY2VfY3RsKHBzX2RhdGEsIGVuYWJsZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTE4MTcsMTEgKzE4NDIsNiBAQAogCWludDMyX3QgcmV0OwogCXN0cnVjdCBzdGszeDF4X2RhdGEgKnBzX2RhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAotCW11dGV4X2xvY2soJnBzX2RhdGEtPmlvX2xvY2spOwotCXBzX2RhdGEtPmFsc19lbmFibGVkID0gZmFsc2U7Ci0JcHNfZGF0YS0+cHNfZW5hYmxlZCA9IGZhbHNlOwotCW11dGV4X3VubG9jaygmcHNfZGF0YS0+aW9fbG9jayk7Ci0KIAlyZXQgPSBzdGszeDF4X3NvZnR3YXJlX3Jlc2V0KHBzX2RhdGEpOwogCWlmKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC0xOTQ2LDcgKzE5NjYsNyBAQAogfQogI2VuZGlmCS8vI2lmZGVmIENPTkZJR19IQVNfRUFSTFlTVVNQRU5ECiAKLXN0YXRpYyBpbnQgc3RrM3gxeF9wb3dlcl9vbihzdHJ1Y3Qgc3RrM3gxeF9kYXRhICpkYXRhLCBib29sIG9uKQorc3RhdGljIGludCBzdGszeDF4X3Bvd2VyX2N0bChzdHJ1Y3Qgc3RrM3gxeF9kYXRhICpkYXRhLCBib29sIG9uKQogewogCWludCByZXQgPSAwOwogCkBAIC0xOTYzLDcgKzE5ODMsMTEgQEAKIAkJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LAogCQkJCSJSZWd1bGF0b3IgdmlvIGRpc2FibGUgZmFpbGVkIHJldD0lZFxuIiwgcmV0KTsKIAkJCXJlZ3VsYXRvcl9lbmFibGUoZGF0YS0+dmRkKTsKKwkJCXJldHVybiByZXQ7CiAJCX0KKwkJZGF0YS0+cG93ZXJfZW5hYmxlZCA9IG9uOworCQlkZXZfZGJnKCZkYXRhLT5jbGllbnQtPmRldiwgInN0azN4MXhfcG93ZXJfY3RsIG9uPSVkXG4iLAorCQkJCW9uKTsKIAl9IGVsc2UgaWYgKG9uICYmICFkYXRhLT5wb3dlcl9lbmFibGVkKSB7CiAKIAkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShkYXRhLT52ZGQpOwpAQCAtMTk3OCw3ICsyMDAyLDExIEBACiAJCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwKIAkJCQkiUmVndWxhdG9yIHZpbyBlbmFibGUgZmFpbGVkIHJldD0lZFxuIiwgcmV0KTsKIAkJCXJlZ3VsYXRvcl9kaXNhYmxlKGRhdGEtPnZkZCk7CisJCQlyZXR1cm4gcmV0OwogCQl9CisJCWRhdGEtPnBvd2VyX2VuYWJsZWQgPSBvbjsKKwkJZGV2X2RiZygmZGF0YS0+Y2xpZW50LT5kZXYsICJzdGszeDF4X3Bvd2VyX2N0bCBvbj0lZFxuIiwKKwkJCQlvbik7CiAJfSBlbHNlIHsKIAkJZGV2X3dhcm4oJmRhdGEtPmNsaWVudC0+ZGV2LAogCQkJCSJQb3dlciBvbj0lZC4gZW5hYmxlZD0lZFxuIiwKQEAgLTIwNTcsNiArMjA4NSw0MyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgc3RrM3gxeF9kZXZpY2VfY3RsKHN0cnVjdCBzdGszeDF4X2RhdGEgKnBzX2RhdGEsIGJvb2wgZW5hYmxlKQoreworCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBzX2RhdGEtPmNsaWVudC0+ZGV2OworCisJaWYgKGVuYWJsZSAmJiAhcHNfZGF0YS0+cG93ZXJfZW5hYmxlZCkgeworCQlyZXQgPSBzdGszeDF4X3Bvd2VyX2N0bChwc19kYXRhLCB0cnVlKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIGRldmljZSBwb3dlclxuIik7CisJCQlnb3RvIGVycl9leGl0OworCQl9CisJCXJldCA9IHN0azN4MXhfaW5pdF9hbGxfc2V0dGluZyhwc19kYXRhLT5jbGllbnQsIHBzX2RhdGEtPnBkYXRhKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXN0azN4MXhfcG93ZXJfY3RsKHBzX2RhdGEsIGZhbHNlKTsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlLWluaXQgZGV2aWNlIHNldHRpbmdcbiIpOworCQkJZ290byBlcnJfZXhpdDsKKwkJfQorCX0gZWxzZSBpZiAoIWVuYWJsZSAmJiBwc19kYXRhLT5wb3dlcl9lbmFibGVkKSB7CisJCWlmICghcHNfZGF0YS0+YWxzX2VuYWJsZWQgJiYgIXBzX2RhdGEtPnBzX2VuYWJsZWQpIHsKKwkJCXJldCA9IHN0azN4MXhfcG93ZXJfY3RsKHBzX2RhdGEsIGZhbHNlKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBkaXNhYmxlIGRldmljZSBwb3dlclxuIik7CisJCQkJZ290byBlcnJfZXhpdDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoZGV2LCAiZGV2aWNlIGNvbnRyb2w6IGFsc19lbmFibGVkPSVkLCBwc19lbmFibGVkPSVkXG4iLAorCQkJCXBzX2RhdGEtPmFsc19lbmFibGVkLCBwc19kYXRhLT5wc19lbmFibGVkKTsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9kYmcoZGV2LCAiZGV2aWNlIGNvbnRyb2w6IGVuYWJsZT0lZCwgcG93ZXJfZW5hYmxlZD0lZFxuIiwKKwkJCWVuYWJsZSwgcHNfZGF0YS0+cG93ZXJfZW5hYmxlZCk7CisJfQorCXJldHVybiAwOworCitlcnJfZXhpdDoKKwlyZXR1cm4gcmV0OworfQogI2lmZGVmIENPTkZJR19PRgogc3RhdGljIGludCBzdGszeDF4X3BhcnNlX2R0KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBzdGszeDF4X3BsYXRmb3JtX2RhdGEgKnBkYXRhKQpAQCAtMjIwNSw2ICsyMjcwLDcgQEAKIAlwc19kYXRhLT5hbHNfdHJhbnNtaXR0YW5jZSA9IHBsYXRfZGF0YS0+dHJhbnNtaXR0YW5jZTsKIAlwc19kYXRhLT5pbnRfcGluID0gcGxhdF9kYXRhLT5pbnRfcGluOwogCXBzX2RhdGEtPnVzZV9maXIgPSBwbGF0X2RhdGEtPnVzZV9maXI7CisJcHNfZGF0YS0+cGRhdGEgPSBwbGF0X2RhdGE7CiAKIAlpZiAocHNfZGF0YS0+YWxzX3RyYW5zbWl0dGFuY2UgPT0gMCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKQEAgLTIyODUsMjQgKzIzNTEsMjggQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9wb3dlcl9pbml0OwogCi0JZXJyID0gc3RrM3gxeF9wb3dlcl9vbihwc19kYXRhLCB0cnVlKTsKKwllcnIgPSBzdGszeDF4X3Bvd2VyX2N0bChwc19kYXRhLCB0cnVlKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9wb3dlcl9vbjsKIAotCWVyciA9IHN0azN4MXhfaW5pdF9hbGxfc2V0dGluZyhjbGllbnQsIHBsYXRfZGF0YSk7Ci0JaWYoZXJyIDwgMCkKLQkJZ290byBlcnJfaW5pdF9hbGxfc2V0dGluZzsKKwlwc19kYXRhLT5hbHNfZW5hYmxlZCA9IGZhbHNlOworCXBzX2RhdGEtPnBzX2VuYWJsZWQgPSBmYWxzZTsKICNpZmRlZiBDT05GSUdfSEFTX0VBUkxZU1VTUEVORAogCXBzX2RhdGEtPnN0a19lYXJseV9zdXNwZW5kLmxldmVsID0gRUFSTFlfU1VTUEVORF9MRVZFTF9CTEFOS19TQ1JFRU4gKyAxOwogCXBzX2RhdGEtPnN0a19lYXJseV9zdXNwZW5kLnN1c3BlbmQgPSBzdGszeDF4X2Vhcmx5X3N1c3BlbmQ7CiAJcHNfZGF0YS0+c3RrX2Vhcmx5X3N1c3BlbmQucmVzdW1lID0gc3RrM3gxeF9sYXRlX3Jlc3VtZTsKIAlyZWdpc3Rlcl9lYXJseV9zdXNwZW5kKCZwc19kYXRhLT5zdGtfZWFybHlfc3VzcGVuZCk7CiAjZW5kaWYKLQlwcmludGsoS0VSTl9JTkZPICIlczogcHJvYmUgc3VjY2Vzc2Z1bGx5IiwgX19mdW5jX18pOworCS8qIGVuYWJsZSBkZXZpY2UgcG93ZXIgb25seSB3aGVuIGl0IGlzIGVuYWJsZWQgKi8KKwllcnIgPSBzdGszeDF4X3Bvd2VyX2N0bChwc19kYXRhLCBmYWxzZSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfaW5pdF9hbGxfc2V0dGluZzsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXM6IHByb2JlIHN1Y2Nlc3NmdWxseSIsIF9fZnVuY19fKTsKIAlyZXR1cm4gMDsKIAogZXJyX2luaXRfYWxsX3NldHRpbmc6Ci0Jc3RrM3gxeF9wb3dlcl9vbihwc19kYXRhLCBmYWxzZSk7CisJc3RrM3gxeF9wb3dlcl9jdGwocHNfZGF0YSwgZmFsc2UpOwogZXJyX3Bvd2VyX29uOgogCXN0azN4MXhfcG93ZXJfaW5pdChwc19kYXRhLCBmYWxzZSk7CiBlcnJfcG93ZXJfaW5pdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYXRtZWxfbXh0X3RzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2F0bWVsX214dF90cy5jCmluZGV4IDRkYmU1YzEuLjM3MzE1NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYXRtZWxfbXh0X3RzLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hdG1lbF9teHRfdHMuYwpAQCAtMTcyNyw3ICsxNzI3LDcgQEAKIAl9CiAKIAlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZm4sIGRldik7Ci0JaWYgKHJldCA8IDApIHsKKwlpZiAocmV0IDwgMCB8fCAhZncpIHsKIAkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gb3BlbiBmaXJtd2FyZSAlc1xuIiwgZm4pOwogCQlnb3RvIGZyZWVfZnJhbWU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9mdDV4MDZfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZnQ1eDA2X3RzLmMKaW5kZXggYWE1MGQ0NC4uZWY3NmU2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9mdDV4MDZfdHMuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Z0NXgwNl90cy5jCkBAIC0yODgsNyArMjg4LDcgQEAKIAlzdHJ1Y3QgZnQ1eDA2X3RzX2RhdGEgKmRhdGEgPSBkZXZfaWQ7CiAJc3RydWN0IGlucHV0X2RldiAqaXBfZGV2OwogCWludCByYywgaTsKLQl1MzIgaWQsIHgsIHksIHByZXNzdXJlLCBzdGF0dXMsIG51bV90b3VjaGVzOworCXUzMiBpZCwgeCwgeSwgc3RhdHVzLCBudW1fdG91Y2hlczsKIAl1OCByZWcgPSAweDAwLCAqYnVmOwogCWJvb2wgdXBkYXRlX2lucHV0ID0gZmFsc2U7CiAKQEAgLTMyOSwxMSArMzI5LDkgQEAKIAogCQlpbnB1dF9tdF9zbG90KGlwX2RldiwgaWQpOwogCQlpZiAoc3RhdHVzID09IEZUX1RPVUNIX0RPV04gfHwgc3RhdHVzID09IEZUX1RPVUNIX0NPTlRBQ1QpIHsKLQkJCXByZXNzdXJlID0gRlRfUFJFU1M7CiAJCQlpbnB1dF9tdF9yZXBvcnRfc2xvdF9zdGF0ZShpcF9kZXYsIE1UX1RPT0xfRklOR0VSLCAxKTsKIAkJCWlucHV0X3JlcG9ydF9hYnMoaXBfZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwgeCk7CiAJCQlpbnB1dF9yZXBvcnRfYWJzKGlwX2RldiwgQUJTX01UX1BPU0lUSU9OX1ksIHkpOwotCQkJaW5wdXRfcmVwb3J0X2FicyhpcF9kZXYsIEFCU19NVF9QUkVTU1VSRSwgcHJlc3N1cmUpOwogCQl9IGVsc2UgewogCQkJaW5wdXRfbXRfcmVwb3J0X3Nsb3Rfc3RhdGUoaXBfZGV2LCBNVF9UT09MX0ZJTkdFUiwgMCk7CiAJCX0KQEAgLTQ3OSw3ICs0NzcsNyBAQAogCQlpbnB1dF9tdF9zbG90KGRhdGEtPmlucHV0X2RldiwgaSk7CiAJCWlucHV0X210X3JlcG9ydF9zbG90X3N0YXRlKGRhdGEtPmlucHV0X2RldiwgTVRfVE9PTF9GSU5HRVIsIDApOwogCX0KLQlpbnB1dF9yZXBvcnRfa2V5KGRhdGEtPmlucHV0X2RldiwgQlROX1RPVUNILCAwKTsKKwlpbnB1dF9tdF9yZXBvcnRfcG9pbnRlcl9lbXVsYXRpb24oZGF0YS0+aW5wdXRfZGV2LCBmYWxzZSk7CiAJaW5wdXRfc3luYyhkYXRhLT5pbnB1dF9kZXYpOwogCiAJaWYgKGdwaW9faXNfdmFsaWQoZGF0YS0+cGRhdGEtPnJlc2V0X2dwaW8pKSB7CkBAIC0xMzY5LDcgKzEzNjcsNiBAQAogCQkJICAgICBwZGF0YS0+eF9tYXgsIDAsIDApOwogCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX01UX1BPU0lUSU9OX1ksIHBkYXRhLT55X21pbiwKIAkJCSAgICAgcGRhdGEtPnlfbWF4LCAwLCAwKTsKLQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19NVF9QUkVTU1VSRSwgMCwgRlRfUFJFU1MsIDAsIDApOwogCiAJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CiAJaWYgKGVycikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9zeW5hcHRpY3NfaTJjX3JtaTQuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vc3luYXB0aWNzX2kyY19ybWk0LmMKaW5kZXggY2Y0M2E5Yy4uZDIxYjZjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9zeW5hcHRpY3NfaTJjX3JtaTQuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3N5bmFwdGljc19pMmNfcm1pNC5jCkBAIC0yNjgxLDggKzI2ODEsMjIgQEAKIAkJaWYgKHJtaTRfZGF0YS0+Ym9hcmQtPmRpc2FibGVfZ3Bpb3MpIHsKIAkJCWlmIChncGlvX2lzX3ZhbGlkKHJtaTRfZGF0YS0+Ym9hcmQtPmlycV9ncGlvKSkKIAkJCQlncGlvX2ZyZWUocm1pNF9kYXRhLT5ib2FyZC0+aXJxX2dwaW8pOwotCQkJaWYgKGdwaW9faXNfdmFsaWQocm1pNF9kYXRhLT5ib2FyZC0+cmVzZXRfZ3BpbykpCisJCQlpZiAoZ3Bpb19pc192YWxpZChybWk0X2RhdGEtPmJvYXJkLT5yZXNldF9ncGlvKSkgeworCQkJCS8qCisJCQkJICogVGhpcyBpcyBpbnRlbmRlZCB0byBzYXZlIGxlYWthZ2UgY3VycmVudAorCQkJCSAqIG9ubHkuIEV2ZW4gaWYgdGhlIGNhbGwoZ3Bpb19kaXJlY3Rpb25faW5wdXQpCisJCQkJICogZmFpbHMsIG9ubHkgbGVha2FnZSBjdXJyZW50IHdpbGwgYmUgbW9yZSBidXQKKwkJCQkgKiBmdW5jdGlvbmFsaXR5IHdpbGwgbm90IGJlIGFmZmVjdGVkLgorCQkJCSAqLworCQkJCXJldHZhbCA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KHJtaTRfZGF0YS0+CisJCQkJCQkJYm9hcmQtPnJlc2V0X2dwaW8pOworCQkJCWlmIChyZXR2YWwpIHsKKwkJCQkJZGV2X2Vycigmcm1pNF9kYXRhLT5pMmNfY2xpZW50LT5kZXYsCisJCQkJCSJ1bmFibGUgdG8gc2V0IGRpcmVjdGlvbiBmb3IgZ3BpbyAiCisJCQkJCSJbJWRdXG4iLCBybWk0X2RhdGEtPmJvYXJkLT5pcnFfZ3Bpbyk7CisJCQkJfQogCQkJCWdwaW9fZnJlZShybWk0X2RhdGEtPmJvYXJkLT5yZXNldF9ncGlvKTsKKwkJCX0KIAkJfQogCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9tc21faW9tbXUtdjEuYyBiL2RyaXZlcnMvaW9tbXUvbXNtX2lvbW11LXYxLmMKaW5kZXggYzgxYWEwYWMuLjg0ZjgxYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvbXNtX2lvbW11LXYxLmMKKysrIGIvZHJpdmVycy9pb21tdS9tc21faW9tbXUtdjEuYwpAQCAtOTU2LDcgKzk1Niw4IEBACiAJCQlfX3ByaW50X2N0eF9yZWdzKGRydmRhdGEtPmJhc2UsIGN0eF9kcnZkYXRhLT5udW0sIGZzcik7CiAJCX0KIAotCQlTRVRfRlNSKGRydmRhdGEtPmJhc2UsIGN0eF9kcnZkYXRhLT5udW0sIGZzcik7CisJCWlmIChyZXQgIT0gLUVCVVNZKQorCQkJU0VUX0ZTUihkcnZkYXRhLT5iYXNlLCBjdHhfZHJ2ZGF0YS0+bnVtLCBmc3IpOwogCQlyZXQgPSBJUlFfSEFORExFRDsKIAl9IGVsc2UKIAkJcmV0ID0gSVJRX05PTkU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1xcG5wLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1xcG5wLmMKaW5kZXggYmY1OWQwMy4uOGFlNTY3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtcXBucC5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLXFwbnAuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2RlZmluZSBXTEVEX01PRF9FTl9SRUcoYmFzZSwgbikJKGJhc2UgKyAweDYwICsgbioweDEwKQogI2RlZmluZSBXTEVEX0lEQUNfRExZX1JFRyhiYXNlLCBuKQkoV0xFRF9NT0RfRU5fUkVHKGJhc2UsIG4pICsgMHgwMSkKQEAgLTEwMyw2ICsxMDQsNyBAQAogI2RlZmluZSBGTEFTSF9MRURfVE9SQ0goYmFzZSkJCShiYXNlICsgMHhFNCkKICNkZWZpbmUgRkxBU0hfRkFVTFRfREVURUNUKGJhc2UpCShiYXNlICsgMHg1MSkKICNkZWZpbmUgRkxBU0hfUEVSSVBIRVJBTF9TVUJUWVBFKGJhc2UpCShiYXNlICsgMHgwNSkKKyNkZWZpbmUgRkxBU0hfQ1VSUkVOVF9SQU1QKGJhc2UpCShiYXNlICsgMHg1NCkKIAogI2RlZmluZSBGTEFTSF9NQVhfTEVWRUwJCQkweDRGCiAjZGVmaW5lIFRPUkNIX01BWF9MRVZFTAkJCTB4MEYKQEAgLTEyMSw2ICsxMjMsNyBAQAogI2RlZmluZSBGTEFTSF9IV19WUkVHX09LCQkweDQwCiAjZGVmaW5lIEZMQVNIX1ZSRUdfTUFTSwkJCTB4QzAKICNkZWZpbmUgRkxBU0hfU1RBUlRVUF9ETFlfTUFTSwkJMHgwMgorI2RlZmluZSBGTEFTSF9DVVJSRU5UX1JBTVBfTUFTSwkJMHhCRgogCiAjZGVmaW5lIEZMQVNIX0VOQUJMRV9BTEwJCTB4RTAKICNkZWZpbmUgRkxBU0hfRU5BQkxFX01PRFVMRQkJMHg4MApAQCAtMTMxLDYgKzEzNCw3IEBACiAjZGVmaW5lIEZMQVNIX0VOQUJMRV9MRURfMQkJMHhBMAogI2RlZmluZSBGTEFTSF9JTklUX01BU0sJCQkweEUwCiAjZGVmaW5lCUZMQVNIX1NFTEZDSEVDS19FTkFCTEUJCTB4ODAKKyNkZWZpbmUgRkxBU0hfUkFNUF9TVEVQXzI3VVMJCTB4QkYKIAogI2RlZmluZSBGTEFTSF9TVFJPQkVfU1cJCQkweEMwCiAjZGVmaW5lIEZMQVNIX1NUUk9CRV9IVwkJCTB4MDQKQEAgLTE1NSw2ICsxNTksOSBAQAogI2RlZmluZSBGTEFTSF9TVUJUWVBFX0RVQUwJCTB4MDEKICNkZWZpbmUgRkxBU0hfU1VCVFlQRV9TSU5HTEUJCTB4MDIKIAorI2RlZmluZSBGTEFTSF9SQU1QX1VQX0RFTEFZX1VTCQkxMDAwCisjZGVmaW5lIEZMQVNIX1JBTVBfRE5fREVMQVlfVVMJCTIxNjAKKwogI2RlZmluZSBMRURfVFJJR0dFUl9ERUZBVUxUCQkibm9uZSIKIAogI2RlZmluZSBSR0JfTEVEX1NSQ19TRUwoYmFzZSkJCShiYXNlICsgMHg0NSkKQEAgLTkzMiwyMiArOTM5LDYgQEAKIAkJCQkJcmMpOwogCQkJCQlnb3RvIGVycm9yX2ZsYXNoX3NldDsKIAkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIFdyaXRlIDB4ODAgdG8gTU9EVUxFX0VOQUJMRSBiZWZvcmUgd3JpdGluZwotCQkJCSAqIDB4RTAgaW4gb3JkZXIgdG8gYXZvaWQgYSBoYXJkd2FyZSBidWcgY2F1c2VkCi0JCQkJICogYnkgcmVnaXN0ZXIgdmFsdWUgZ29pbmcgZnJvbSAweDAwIHRvIDB4RTAuCi0JCQkJICovCi0JCQkJcmMgPSBxcG5wX2xlZF9tYXNrZWRfd3JpdGUobGVkLAotCQkJCQlGTEFTSF9FTkFCTEVfQ09OVFJPTChsZWQtPmJhc2UpLAotCQkJCQlGTEFTSF9FTkFCTEVfTU9EVUxFX01BU0ssCi0JCQkJCUZMQVNIX0VOQUJMRV9NT0RVTEUpOwotCQkJCWlmIChyYykgewotCQkJCQlkZXZfZXJyKCZsZWQtPnNwbWlfZGV2LT5kZXYsCi0JCQkJCQkiRW5hYmxlIHJlZyB3cml0ZSBmYWlsZWQoJWQpXG4iLAotCQkJCQkJcmMpOwotCQkJCQlyZXR1cm4gcmM7Ci0JCQkJfQogCQkJfQogCiAJCQlyYyA9IHFwbnBfbGVkX21hc2tlZF93cml0ZShsZWQsCkBAIC0xMDY0LDIyICsxMDU1LDYgQEAKIAkJCQlnb3RvIGVycm9yX2ZsYXNoX3NldDsKIAkJCX0KIAotCQkJLyoKLQkJCSAqIFdyaXRlIDB4ODAgdG8gTU9EVUxFX0VOQUJMRSBiZWZvcmUgd3JpdGluZwotCQkJICogMHhFMCBpbiBvcmRlciB0byBhdm9pZCBhIGhhcmR3YXJlIGJ1ZyBjYXVzZWQKLQkJCSAqIGJ5IHJlZ2lzdGVyIHZhbHVlIGdvaW5nIGZyb20gMHgwMCB0byAweEUwLgotCQkJICovCi0JCQlyYyA9IHFwbnBfbGVkX21hc2tlZF93cml0ZShsZWQsCi0JCQkJRkxBU0hfRU5BQkxFX0NPTlRST0wobGVkLT5iYXNlKSwKLQkJCQlGTEFTSF9FTkFCTEVfTU9EVUxFX01BU0ssCi0JCQkJRkxBU0hfRU5BQkxFX01PRFVMRSk7Ci0JCQlpZiAocmMpIHsKLQkJCQlkZXZfZXJyKCZsZWQtPnNwbWlfZGV2LT5kZXYsCi0JCQkJCSJFbmFibGUgcmVnIHdyaXRlIGZhaWxlZCglZClcbiIsCi0JCQkJCXJjKTsKLQkJCQlnb3RvIGVycm9yX2ZsYXNoX3NldDsKLQkJCX0KLQogCQkJcmMgPSBxcG5wX2xlZF9tYXNrZWRfd3JpdGUobGVkLAogCQkJCWxlZC0+Zmxhc2hfY2ZnLT5jdXJyZW50X2FkZHIsCiAJCQkJRkxBU0hfQ1VSUkVOVF9NQVNLLApAQCAtMTEwMCw2ICsxMDc1LDExIEBACiAJCQkJZ290byBlcnJvcl9mbGFzaF9zZXQ7CiAJCQl9CiAKKwkJCS8qCisJCQkgKiBBZGQgMW1zIGRlbGF5IGZvciBiaGFyZ2VyIGVudGVyIHN0YWJsZSBzdGF0ZQorCQkJICovCisJCQl1c2xlZXAoRkxBU0hfUkFNUF9VUF9ERUxBWV9VUyk7CisKIAkJCWlmICghbGVkLT5mbGFzaF9jZmctPnN0cm9iZV90eXBlKSB7CiAJCQkJcmMgPSBxcG5wX2xlZF9tYXNrZWRfd3JpdGUobGVkLAogCQkJCQlGTEFTSF9MRURfU1RST0JFX0NUUkwobGVkLT5iYXNlKSwKQEAgLTExODAsNiArMTE2MCwxMiBAQAogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBEaXNhYmxlIG1vZHVsZSBhZnRlciByYW1wIGRvd24gY29tcGxldGUgZm9yIHN0YWJsZQorCQkJICogYmVoYXZpb3IKKwkJCSAqLworCQkJdXNsZWVwKEZMQVNIX1JBTVBfRE5fREVMQVlfVVMpOworCiAJCQlyYyA9IHFwbnBfbGVkX21hc2tlZF93cml0ZShsZWQsCiAJCQkJRkxBU0hfRU5BQkxFX0NPTlRST0wobGVkLT5iYXNlKSwKIAkJCQlsZWQtPmZsYXNoX2NmZy0+ZW5hYmxlX21vZHVsZSAmCkBAIC0yMjYwLDcgKzIyNDYsNyBAQAogCiAJLyogRGlzYWJsZSBmbGFzaCBMRUQgbW9kdWxlICovCiAJcmMgPSBxcG5wX2xlZF9tYXNrZWRfd3JpdGUobGVkLCBGTEFTSF9FTkFCTEVfQ09OVFJPTChsZWQtPmJhc2UpLAotCQlGTEFTSF9FTkFCTEVfTU9EVUxFX01BU0ssIEZMQVNIX0RJU0FCTEVfQUxMKTsKKwkJRkxBU0hfRU5BQkxFX01BU0ssIEZMQVNIX0RJU0FCTEVfQUxMKTsKIAlpZiAocmMpIHsKIAkJZGV2X2VycigmbGVkLT5zcG1pX2Rldi0+ZGV2LAogCQkJIkVuYWJsZSByZWcgd3JpdGUgZmFpbGVkKCVkKVxuIiwgcmMpOwpAQCAtMjMyOSw2ICsyMzE1LDE1IEBACiAJCXJldHVybiByYzsKIAl9CiAKKwkvKiBTZXQgY3VycmVudCByYW1wICovCisJcmMgPSBxcG5wX2xlZF9tYXNrZWRfd3JpdGUobGVkLCBGTEFTSF9DVVJSRU5UX1JBTVAobGVkLT5iYXNlKSwKKwkJRkxBU0hfQ1VSUkVOVF9SQU1QX01BU0ssIEZMQVNIX1JBTVBfU1RFUF8yN1VTKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmbGVkLT5zcG1pX2Rldi0+ZGV2LAorCQkJIkN1cnJlbnQgcmFtcCByZWcgd3JpdGUgZmFpbGVkKCVkKVxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCiAJbGVkLT5mbGFzaF9jZmctPnN0cm9iZV90eXBlID0gMDsKIAogCS8qIGR1bXAgZmxhc2ggcmVnaXN0ZXJzICovCkBAIC0zMzYwLDcgKzMzNTUsNiBAQAogCQlpZiAobGVkLT5kZWZhdWx0X29uKSB7CiAJCQlsZWQtPmNkZXYuYnJpZ2h0bmVzcyA9IGxlZC0+Y2Rldi5tYXhfYnJpZ2h0bmVzczsKIAkJCV9fcXBucF9sZWRfd29yayhsZWQsIGxlZC0+Y2Rldi5icmlnaHRuZXNzKTsKLQkJCXNjaGVkdWxlX3dvcmsoJmxlZC0+d29yayk7CiAJCQlpZiAobGVkLT50dXJuX29mZl9kZWxheV9tcyA+IDApCiAJCQkJcXBucF9sZWRfdHVybl9vZmYobGVkKTsKIAkJfSBlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZGVtdXguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5jCmluZGV4IDlkNjA2YTEuLjY1Mzg3YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5jCkBAIC0zMTE4LDcgKzMxMTgsNyBAQAogCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gKHN0cnVjdCBkdmJfZGVtdXggKilkZW11eDsKIAogCW11dGV4X2xvY2soJmR2YmRlbXV4LT5tdXRleCk7Ci0KKwlkdmJkZW11eC0+c3dfZmlsdGVyX2Fib3J0ID0gMDsKIAlkZW11eC0+ZnJvbnRlbmQgPSBOVUxMOwogCW11dGV4X3VubG9jaygmZHZiZGVtdXgtPm11dGV4KTsKIAlyZXR1cm4gMDsKQEAgLTMyMDMsNiArMzIwMyw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCWR2YmRlbXV4LT5zd19maWx0ZXJfYWJvcnQgPSAwOwogCWR2YmRlbXV4LT50b3RhbF9wcm9jZXNzX3RpbWUgPSAwOwogCWR2YmRlbXV4LT50b3RhbF9jcmNfdGltZSA9IDA7CiAJc25wcmludGYoZHZiZGVtdXgtPmFsaWFzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL0tjb25maWcKaW5kZXggZTM0NDcxOS4uYWRlZjJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9LY29uZmlnCkBAIC0xOSwxMCArMTksNiBAQAogCWhlbHAKIAkgIEVuYWJsZSBwcmludGsoKSBkZWJ1ZyBmb3IgbXNtIGNhbWVyYQogCi1pZiBNU01fQ0FNRVJBCi1zb3VyY2UgImRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9LY29uZmlnIgotZW5kaWYgIyBNU01fQ0FNRVJBCi0KIG1lbnVjb25maWcgTVNNQl9DQU1FUkEKIAlib29sICJRdWFsY29tbSBNU00gY2FtZXJhIGFuZCB2aWRlbyBjYXB0dXJlIDIuMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJDSF9NU00gJiYgVklERU9fVjRMMiAmJiBJMkMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vTWFrZWZpbGUKaW5kZXggYzFkODZkZi4uOGVhNmE0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vTWFrZWZpbGUKQEAgLTEsNiArMSw2IEBACiBvYmotJChDT05GSUdfTVNNX1ZJRENfVjRMMikgKz0gdmlkYy8KIG9iai0kKENPTkZJR19NU01fV0ZEKSArPSB3ZmQvCiBvYmotJChDT05GSUdfRFZCX01QUSkgKz0gZHZiLwotb2JqLSQoQ09ORklHX01TTV9DQU1FUkEpICs9IGNhbWVyYV92MS8KKwogb2JqLSQoQ09ORklHX01TTUJfQ0FNRVJBKSArPSBjYW1lcmFfdjIvCiBvYmoteSArPSB2Y2FwLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM0NDljYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDQwOSArMCwwIEBACi1jb25maWcgTVNNX0NBTUVSQV9WNEwyCi0gICAgICAgIGJvb2wgIk1TTSBDYW1lcmEgVjRMMiBJbnRlcmZhY2UiCi0gICAgICAgIGRlcGVuZHMgb24gTVNNX0NBTUVSQQotICAgICAgICBkZWZhdWx0IG4KLSAgICAgICAgLS0taGVscC0tLQotICAgICAgICAgIFRoaXMgZmxhZyBlbmFibGVzIFY0TDIgaW50ZXJmYWNlIG9mIE1TTQotICAgICAgICAgIGNhbWVyYSBkcml2ZXIuIElmIGVuYWJsZWQsIGFwcGxpY2F0aW9uIGludGVyYWN0cwotICAgICAgICAgIHdpdGggL2Rldi92aWRlbzAgdGhyb3VnaCBWNEwyIEFQSXMuIE90aGVyd2lzZSwKLSAgICAgICAgICBuYXRpdmUgQVBJcyBhcmUgdXNlZCB0aHJvdWdoIC9kZXYvY29uZmlnMCwgL2Rldi9mcmFtZTAsCi0gICAgICAgICAgYW5kIC9kZXYvY29udHJvbDAuCi0KLWNvbW1lbnQgIkNhbWVyYSBTZW5zb3IgU2VsZWN0aW9uIgotY29uZmlnIE1UOVQwMTMKLQlib29sICJTZW5zb3IgbXQ5dDAxMyAoQkFZRVIgM00pIgotCWRlcGVuZHMgb24gTVNNX0NBTUVSQSAmJiAhQVJDSF9NU004WDYwICYmICFBUkNIX01TTTg5NjAgJiYgIU1TTV9DQU1FUkFfVjRMMgotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQkgIE1JQ1JPTiAzTSBCYXllciBTZW5zb3Igd2l0aCBBdXRvRm9jdXMKLWNvbmZpZyBNVDlEMTEzCi0JYm9vbCAiU2Vuc29yIG10OWQxMTMgKFlVViAyTSkiCi0JZGVwZW5kcyBvbiBNU01fQ0FNRVJBICYmIEFSQ0hfTVNNOFg2MCAmJiAhTVNNX0NBTUVSQV9WNEwyCi0JZGVmYXVsdCB5Ci0JLS0taGVscC0tLQotCSAgTUlDUk9OIDJNIFlVViBTZW5zb3IKLQkgIFRoaXMgc2Vuc29yIGlzIHRoZSBmcm9udCBjYW1lcmEgb24gUVQ4NjYwLgotCSAgVGhpcyB1c2VzIGNzaSBtaXBpIGludGVyZmFjZS4KLQkgIFRoaXMgc2Vuc29yIGlzIHVzZWQgb25seSBvbiBRVCBkZXZpY2UuCi1jb25maWcgTVQ5RDExMgotCWJvb2wgIlNlbnNvciBtdDlkMTEyIChZVVYgMk0pIgotCWRlcGVuZHMgb24gTVNNX0NBTUVSQSAmJiAhQVJDSF9NU004WDYwICYmICFBUkNIX01TTTg5NjAgJiYgIU1TTV9DQU1FUkFfVjRMMgotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQkgIE1JQ1JPTiAyTSBZVVYgU2Vuc29yCi1jb25maWcgSU1YMDc0Ci0JYm9vbCAiU2Vuc29yIElNWDA3NCAoQkFZRVIgMTMuNU0pIgotCWRlcGVuZHMgb24gTVNNX0NBTUVSQQotCS0tLWhlbHAtLS0KLQlTT05ZIDEzLjUgTVAgQmF5ZXIgU2Vuc29yCi1jb25maWcgT1Y1NjQwCi0JYm9vbCAiU2Vuc29yIE9WNTY0MCAoWVVWIDVNKSIKLQlkZXBlbmRzIG9uIE1TTV9DQU1FUkEgJiYgIU1TTV9DQU1FUkFfVjRMMgotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQlPbW5pIDVNIFlVViBTZW5zb3IKLQotY29uZmlnIE9WNTY0NwotCWJvb2wgIlNlbnNvciBvdjU2NDcgKEJBWUVSIDVNKSIKLQlkZXBlbmRzIG9uIE1TTV9DQU1FUkEKLQktLS1oZWxwLS0tCi0JICBPViA1TSBCYXllciBTZW5zb3Igd2l0aCBBdXRvRm9jdXMKLQotY29uZmlnIEFENTA0Nl9BQ1QKLQlib29sICJMZW5zIGFjdHVhdG9yIGFkNTA0NiIKLQlkZXBlbmRzIG9uIE1TTV9DQU1FUkEgJiYgT1Y1NjQ3Ci0JLS0taGVscC0tLQotCSAgYWQ1MDQ2IGxlbnMgYWN0dWF0b3IgZHJpdmVyIGZvciBvdjU2NDcuCi0JICBTYXkgWSBoZXJlIGlmIHRoaXMgaXMgbXNtNzYyN0EgdmFyaWFudCBwbGF0Zm9ybS4KLWNvbmZpZyBXRUJDQU1fT1Y3NjkyX1FSRAotCWJvb2wgIlNlbnNvciBPVjc2OTIgUVJEKFZHQSBZVVYpIgotCWRlcGVuZHMgb24gTVNNX0NBTUVSQSAmJiAoQVJDSF9NU003WDI3QSB8fCBBUkNIX01TTThYNjApCi0JZGVmYXVsdCBuCi0JLS0taGVscC0tLQotCSAgT21uaSBWaXNpb24gVkdBIFlVViBTZW5zb3IgZm9yIFFSRCBEZXZpY2VzCi1jb25maWcgTVQ5TTExNAotICAgICAgICBib29sICJTZW5zb3IgTVQ5TTExNCAoWVVWIDEuMjZNKSIKLSAgICAgICAgZGVwZW5kcyBvbiBNU01fQ0FNRVJBCi0gICAgICAgIC0tLWhlbHAtLS0KLSAgICAgICAgQVBUSU5BIDEuMjYgTVAgeXV2IFNlbnNvcgotY29uZmlnIFdFQkNBTV9PVjc2OTIKLQlib29sICJTZW5zb3IgT1Y3NjkyIChWR0EgWVVWKSIKLQlkZXBlbmRzIG9uIE1TTV9DQU1FUkEgJiYgQVJDSF9NU004WDYwICYmICFNU01fQ0FNRVJBX1Y0TDIKLQlkZWZhdWx0IHkKLQktLS1oZWxwLS0tCi0JICBPbW5pIFZpc2lvbiBWR0EgWVVWIFNlbnNvci4KLWNvbmZpZyBXRUJDQU1fT1Y5NzI2Ci0JYm9vbCAiU2Vuc29yIE9WOTcyNiAoVkdBIEJheWVyKSIKLQlkZXBlbmRzIG9uIE1TTV9DQU1FUkEgJiYgKEFSQ0hfTVNNOFg2MCB8fCBBUkNIX01TTTdYMzAgfHwgQVJDSF9NU003WDI3QSkKLQlkZWZhdWx0IG4KLQktLS1oZWxwLS0tCi0JICBPbW5pIFZpc2lvbiBWR0EgQmF5ZXIgU2Vuc29yLgotIwlUaGlzIFNlbm9zciBpcyB1c2VkIGFzIGEgd2ViY2FtLgotIwlUaGlzIHVzZXMgdGhlIENTSSBpbnRlcmZhY2UuCi1jb25maWcgVlg2OTUzCi0JYm9vbCAiU2Vuc29yIFZYNjk1MyAoQkFZRVIgNU0pIgotCWRlcGVuZHMgb24gTVNNX0NBTUVSQSAmJiAoQVJDSF9NU003WDMwIHx8IEFSQ0hfTVNNOFg2MCkgJiYgIU1TTV9DQU1FUkFfVjRMMgotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQlTVE0gNU0gQmF5ZXIgU2Vuc29yIHdpdGggRURPRgotY29uZmlnIFNOMTJNMFBaCi0JYm9vbCAiU2Vuc29yIHNuMTJtMHB6IChCYXllciAxMiBNUCkiCi0JZGVwZW5kcyBvbiBNU01fQ0FNRVJBICYmIEFSQ0hfTVNNN1gzMCAmJiAhTVNNX0NBTUVSQV9WNEwyCi0JZGVmYXVsdCB5Ci0JLS0taGVscC0tLQotCSAgU29ueSAxMiBNUCBCYXllciBTZW5zb3IKLWNvbmZpZyBNVDlQMDEyCi0JYm9vbCAiU2Vuc29yIG10OXAwMTIgKEJBWUVSIDVNKSIKLQlkZXBlbmRzIG9uIE1TTV9DQU1FUkEgJiYgIUFSQ0hfTVNNOFg2MCAmJiAhTVNNX0NBTUVSQV9WNEwyCi0JZGVmYXVsdCB5Ci0JLS0taGVscC0tLQotCSAgTUlDUk9OIDVNIEJheWVyIFNlbnNvciB3aXRoIEF1dG9mb2N1cwotCi1jaG9pY2UKLQlwcm9tcHQgIkFGIG1vZHVsZSIKLQlkZXBlbmRzIG9uIE1UOVAwMTIgJiYgIUFSQ0hfTVNNOFg2MCAmJiAhTVNNX0NBTUVSQV9WNEwyCi0JZGVmYXVsdCBNU01fQ0FNRVJBX0FGX0ZPWENPTk4KLQotY29uZmlnIE1TTV9DQU1FUkFfQUZfRk9YQ09OTgotCWJvb2wgIkZPWENPTk4gTW9kdWxlIgotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIEZPWENPTk4gQUYgbW9kdWxlIGZvciA1TSBCYXllciBzZW5zb3IKLQotY29uZmlnIE1TTV9DQU1FUkFfQUZfQkFNCi0JYm9vbCAiQkFNIE1vZHVsZSIKLQloZWxwCi0JICBUaGlzIGRyaXZlciBzdXBwb3J0cyBCQU0gQUYgbW9kdWxlIGZvciA1TSBCYXllciBzZW5zb3IKLQotZW5kY2hvaWNlCi0KLWNvbmZpZyBNVDlQMDEyX0tNCi0JYm9vbCAiU2Vuc29yIG10OXAwMTIgS00gbW9kdWxlIChCQVlFUiA1TSkiCi0JZGVwZW5kcyBvbiBNU01fQ0FNRVJBICYmICFBUkNIX01TTThYNjAgJiYgIU1TTV9DQU1FUkFfVjRMMgotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQkgIE1JQ1JPTiA1TSBCYXllciBTZW5zb3IgS00gbW9kdWxlcyB3aXRoIEF1dG9mb2N1cwotCi1jb25maWcgTVQ5RTAxMwotCWJvb2wgIlNlbnNvciBtdDllMDEzIG1vZHVsZSAoQkFZRVIgOE0pIgotCWRlcGVuZHMgb24gTVNNX0NBTUVSQSAmJiAoQVJDSF9NU003WDMwIHx8IEFSQ0hfTVNNOFg2MCB8fCBBUkNIX01TTTdYMjdBKQotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQkgIEFwdGluYSA4TSBCYXllciBTZW5zb3IgbW9kdWxlcyB3aXRoIEF1dG9mb2N1cwotCi1jb25maWcgSU1YMDc0X0FDVAotCWJvb2wgIkFjdHVhdG9yIElNWDA3NCAoQkFZRVIgMTMuNU0pIgotCWRlcGVuZHMgb24gTVNNX0NBTUVSQQotCS0tLWhlbHAtLS0KLQlBY3R1YXRvciBmb3IgU09OWSAxMy41IE1QIEJheWVyIFNlbnNvcgotCi1jb25maWcgUzVLM0UyRlgKLQlib29sICJTZW5zb3IgczVrM2UyZnggKFNhbXN1bmcgNU0pIgotCWRlcGVuZHMgb24gTVNNX0NBTUVSQSAmJiAhQVJDSF9NU004WDYwICYmICFNU01fQ0FNRVJBX1Y0TDIKLQlkZWZhdWx0IHkKLQktLS1oZWxwLS0tCi0JICBTYW1zdW5nIDVNIHdpdGggQXV0b2ZvY3VzCi0KLWNvbmZpZyBRU19TNUs0RTEKLQlib29sICJTZW5zb3IgcXNfczVrNGUxIChTYW1zdW5nIDVNKSIKLQlkZXBlbmRzIG9uIE1TTV9DQU1FUkEgJiYgQVJDSF9NU004WDYwICYmICFNU01fQ0FNRVJBX1Y0TDIKLQlkZWZhdWx0IHkKLQktLS1oZWxwLS0tCi0JICBTYW1zdW5nIDVNIHdpdGggQXV0b2ZvY3VzCi0KLWNvbmZpZyBTNUs0RTEKLQlib29sICJTZW5zb3IgU2Vuc29yIHM1azRlMSAoU2Ftc3VuZyA1TSkiCi0JZGVwZW5kcyBvbiBNU01fQ0FNRVJBCi0JZGVmYXVsdCBuCi0JLS0taGVscC0tLQotCSAgU3VwcG9ydCBmb3IgUzVrNEUxIHNhbXN1bmcgc2Vuc29yIGRyaXZlci4KLQkgIEl0IGlzIGEgQmF5ZXIgNU1QIHNlbnNvciB3aXRoIGF1dG8gZm9jdXMgYW5kIGl0IHN1cHBvcnRzCi0JICB0d28gbWlwaSBsYW5lcywgcmVxdWlyZWQgZm9yIG1zbTd4MnhBIHBsYXRmb3JtLgotCSAgU2F5IFkgaGVyZSBpZiB0aGlzIGlzIG1zbTd4MnhBIHZhcmlhbnQgcGxhdGZvcm0uCi0KLWNvbmZpZyBEVzk3MTJfQUNUCi0JYm9vbCAiTGVucyBhY3R1YXRvciBkdzk3MjEiCi0JZGVwZW5kcyBvbiBNU01fQ0FNRVJBICYmIFM1SzRFMQotCS0tLWhlbHAtLS0KLQkgIGR3OTcyMSBsZW5zIGFjdHVhdG9yIGRyaXZlciBmb3IgUzVLNEUxLgotCSAgU2F5IFkgaGVyZSBpZiB0aGlzIGlzIG1zbTc2MjdBIHZhcmlhbnQgcGxhdGZvcm0uCi0KLWNvbmZpZyBNU01fQ0FNRVJBX0ZMQVNIX1NDNjI4QQotCWJvb2wgIlF1YWxjb21tIE1TTSBjYW1lcmEgc2M2MjhhIGZsYXNoIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNU01fQ0FNRVJBCi0JZGVmYXVsdCBuCi0JLS0taGVscC0tLQotCSAgRW5hYmxlIHN1cHBvcnQgZm9yIExFRCBmbGFzaCBmb3IgbXNtIGNhbWVyYS4KLQkgIEl0IGlzIGEgc2FtdGVjaCBjaGFyZ2UgcHVtcCBmbGFzaCBkcml2ZXIgYW5kIGl0Ci0JICBzdXBwb3J0cyBzcG90bGlnaHQgYW5kIGZsYXNoIGxpZ2h0IG1vZGVzIHdpdGgKLQkgIGRpZmZlcnJlbnQgY3VycmVudCBsZXZlbHMuCi0KLWNvbmZpZyBNU01fQ0FNRVJBX0ZMQVNIX1RQUzYxMzEwCi0JYm9vbCAiUXVhbGNvbW0gTVNNIGNhbWVyYSB0cHM2MTMxMCBmbGFzaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gTVNNX0NBTUVSQQotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQkgIEVuYWJsZSBzdXBwb3J0IGZvciBMRUQgZmxhc2ggZm9yIG1zbSBjYW1lcmEuCi0JICBJdCBpcyBhIFRleGFzIEluc3RydW1lbnRzIG11bHRpcGxlIExFRCBGbGFzaAotCSAgZm9yIGNhbWVyYSBmbGFzaCBhbmQgdmlkZW8gbGlnaHQgYXBwbGljYXRpb25zLgotCi1jb25maWcgTVNNX0NBTUVSQV9MRURfVFJJR0dFUl9GTEFTSAotCWJvb2wgIlF1YWxjb21tIE1TTSBMRUQgdHJpZ2dlciBmbGFzaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gTVNNX0NBTUVSQQotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQkgIEVuYWJsZSBzdXBwb3J0IGZvciBMRUQgZmxhc2ggZm9yIG1zbSBjYW1lcmEuCi0JICBJdCBjcmVhdGVzIExFRCB0cmlnZ2VyIGNsaWVudCwgcmVhZHMgTEVEIGZsYXNoCi0JICBoYXJkd2FyZSBwcm9wZXJ0aWVzIHByb3ZpZGVkIGluIGJvYXJkIGZpbGUgLwotCSAgZGV2aWNlIHRyZWUgYW5kIHVzZXMgdGhlc2UgaW5mb3JtYXRpb24gdG8gY29uZmlndXJlCi0JICBMRUQgZmxhc2ggdXNpbmcgTEVEIHRyaWdnZXIgZXZlbnQgZnVuY3Rpb24uCi0KLWNvbmZpZyBJTVgwNzIKLQlib29sICJTZW5zb3IgaW14MDcyIChTb255IDVNKSIKLQlkZWZhdWx0IG4KLQktLS1oZWxwLS0tCi0JICBTdXBwb3J0IGZvciBJTVgwNzIgc29ueSBzZW5zb3IgZHJpdmVyLgotCSAgSXQgaXMgYSBCYXllciA1TVAgc2Vuc29yIHdpdGggYXV0byBmb2N1cyBhbmQgaXQgc3VwcG9ydHMKLQkgIHR3byBtaXBpIGxhbmVzLCByZXF1aXJlZCBmb3IgbXNtN3gyeEEgcGxhdGZvcm0uCi0JICBTYXkgWSBoZXJlIGlmIHRoaXMgaXMgbXNtN3gyeEEgdmFyaWFudCBwbGF0Zm9ybS4KLQotY29uZmlnIE9WMjcyMAotCWJvb2wgIlNlbnNvciBvdjI3MjAgKE9tbml2aXNpb24gMk1QKSIKLQlkZXBlbmRzIG9uIE1TTV9DQU1FUkEKLQotY29uZmlnIE9WODgyNQotCWJvb2wgIlNlbnNvciBvdjg4MjUgKE9tbml2aXNpb24gOE0pIgotCWRlcGVuZHMgb24gTVNNX0NBTUVSQQotCS0tLWhlbHAtLS0KLQkgIFN1cHBvcnQgZm9yIE9WODgyNSBzZW5zb3IgZHJpdmVyLgotCSAgSXQgaXMgYSBCYXllciA4TVAgc2Vuc29yIHdpdGggYXV0byBmb2N1cyBhbmQgaXQgc3VwcG9ydHMKLQkgIHR3byBtaXBpIGxhbmVzLCByZXF1aXJlZCBmb3IgbXNtODYyNSBwbGF0Zm9ybS4KLQkgIFNheSBZIGhlcmUgaWYgdGhpcyBpcyBtc204NjI1IHZhcmlhbnQgcGxhdGZvcm0uCi0KLWNvbmZpZyBJTVgxMzUKLQlib29sICJTZW5zb3IgaW14MTM1IChTb255IDEzTVApIgotCWRlcGVuZHMgb24gTVNNX0NBTUVSQQotCS0tLWhlbHAtLS0KLQkgIFN1cHBvcnQgZm9yIElNWDEzNSBzZW5zb3IgZHJpdmVyLgotCSAgVGhpcyBpcyBhIFNvbnkgMTNNUCBCYXllciBTZW5zb3Igd2l0aCBhdXRvZm9jdXMgYW5kIHZpZGVvIEhEUgotCSAgc3VwcG9ydC4KLQkgIFNheSBZIGlmIHRoZSBwbGF0Zm9ybSB1c2VzIElNWDEzNSBzZW5zb3IuCi0KLWNvbmZpZyBWQjY4MDEKLQlib29sICJTZW5zb3IgdmI2ODAxIgotCWRlcGVuZHMgb24gTVNNX0NBTUVSQSAmJiAhQVJDSF9NU004WDYwICYmICFNU01fQ0FNRVJBX1Y0TDIKLQktLS1oZWxwLS0tCi0JICA1TSB3aXRoIGZsYXNoCi0KLWNvbmZpZyBNU01fQ0FNRVJBX0ZMQVNICi0JYm9vbCAiUXVhbGNvbW0gTVNNIGNhbWVyYSBmbGFzaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gTVNNX0NBTUVSQQotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQkgIEVuYWJsZSBzdXBwb3J0IGZvciBMRUQgZmxhc2ggZm9yIG1zbSBjYW1lcmEKLQotY29uZmlnIE1TTV9DQU1FUkFfU0VOU09SCi0JYm9vbCAiUXVhbGNvbW0gTVNNIGNhbWVyYSBzZW5zb3Igc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1TTV9DQU1FUkEKLQotY29uZmlnIE1TTV9BQ1RVQVRPUgotCWJvb2wgIlF1YWxjb21tIE1TTSBhY3R1YXRvciBzdXBwb3J0IgotCWRlcGVuZHMgb24gTVNNX0NBTUVSQQotCi1jb25maWcgTVNNX0VFUFJPTQotCWJvb2wgIlF1YWxjb21tIE1TTSBFRVBST00gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1TTV9DQU1FUkEKLQotY29uZmlnIElNWDA3NF9FRVBST00KLQlib29sICJJTVgwNzQgRUVQUk9NIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNU01fQ0FNRVJBCi0KLWNvbmZpZyBJTVgwOTFfRUVQUk9NCi0JYm9vbCAiSU1YMDkxIEVFUFJPTSBzdXBwb3J0IgotCWRlcGVuZHMgb24gTVNNX0NBTUVSQQotCi1jb25maWcgTVNNX0dFTUlOSQotCXRyaXN0YXRlICJRdWFsY29tbSBNU00gR2VtaW5pIEpwZWcgRW5naW5lIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNU01fQ0FNRVJBICYmIChBUkNIX01TTTdYMzAgfHwgQVJDSF9NU004WDYwIHx8IEFSQ0hfTVNNODk2MCkKLQlkZWZhdWx0IG4KLQktLS1oZWxwLS0tCi0JICBFbmFibGUgc3VwcG9ydCBmb3IgR2VtaW5pIEpwZWcgRW5naW5lCi0KLWNvbmZpZyBNU01fTUVSQ1VSWQotICAgICAgICB0cmlzdGF0ZSAiUXVhbGNvbW0gTVNNIE1lcmN1cnkgSnBlZyBEZWNvZGVyIEVuZ2luZSBzdXBwb3J0IgotICAgICAgICBkZXBlbmRzIG9uIE1TTV9DQU1FUkEgJiYgQVJDSF9NU004OTYwCi0gICAgICAgIC0tLWhlbHAtLS0KLSAgICAgICAgICBFbmFibGUgc3VwcG9ydCBmb3IgTWVyY3VyeSBKcGVnIEVuZ2luZQotCi1jb25maWcgTVNNX1ZQRQotCXRyaXN0YXRlICJRdWFsY29tbSBNU00gVmlkZW8gUHJlLXByb2Nlc3NpbmcgRW5naW5lIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNU01fQ0FNRVJBICYmIChBUkNIX01TTTdYMzAgfHwgQVJDSF9NU004WDYwKQotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQkgIEVuYWJsZSBzdXBwb3J0IGZvciBWaWRlbyBQcmUtcHJvY2Vzc2luZyBFbmdpbmUKLQotY29uZmlnIE1TTV9DQU1fSVJRX1JPVVRFUgotCWJvb2wgIkVuYWJsZSBNU00gQ0FNIElSUSBSb3V0ZXIiCi0JZGVwZW5kcyBvbiBNU01fQ0FNRVJBCi0JLS0taGVscC0tLQotCUVuYWJsZSBJUlEgUm91dGVyIGZvciBDYW1lcmEuIERlcGVuZGluZyBvbiB0aGUKLQljb25maWd1cmF0aW9uLCB0aGlzIG1vZHVsZSBjYW4gaGFuZGxlIHRoZQotCWludGVycnVwdHMgZnJvbSBtdWx0aXBsZSBjYW1lcmEgaGFyZHdhcmUKLQljb3JlcyBhbmQgY29tcG9zaXRlIHRoZW0gaW50byBhIHNpbmdsZQotCWludGVycnVwdCB0byB0aGUgTVNNLgotCi1jb25maWcgTVNNX0NQUAotICAgICAgICBib29sICJRdWFsY29tbSBNU00gQ2FtZXJhIFBvc3QgUHJvY2Vzc2luZyBFbmdpbmUgc3VwcG9ydCIKLSAgICAgICAgZGVwZW5kcyBvbiBNU01fQ0FNRVJBICYmIE1TTV9DQU1FUkFfVjRMMgotICAgICAgICAtLS1oZWxwLS0tCi0gICAgICAgICAgRW5hYmxlIHN1cHBvcnQgZm9yIENhbWVyYSBQb3N0LXByb2Nlc3NpbmcgRW5naW5lCi0gICAgICAgICAgVGhlIFBvc3QgcHJvY2Vzc2luZyBlbmdpbmUgaXMgY2FwYWJsZSBvZiBzY2FsaW5nCi0gICAgICAgICAgYW5kIGNyb3BwaW5nIGltYWdlLiBUaGUgZHJpdmVyIHN1cHBvcnQgVjRMMiBzdWJkZXYKLSAgICAgICAgICBBUElzLgotCi1jb25maWcgTVNNX0NDSQotICAgICAgICBib29sICJRdWFsY29tbSBNU00gQ2FtZXJhIENvbnRyb2wgSW50ZXJmYWNlIHN1cHBvcnQiCi0gICAgICAgIGRlcGVuZHMgb24gTVNNX0NBTUVSQQotICAgICAgICAtLS1oZWxwLS0tCi0gICAgICAgICAgRW5hYmxlIHN1cHBvcnQgZm9yIENhbWVyYSBDb250cm9sIEludGVyZmFjZSBkcml2ZXIgb25seQotICAgICAgICAgIGZvciB0aG9zZSBwbGF0Zm9ybXMgdGhhdCBoYXZlIGhhcmR3YXJlIHN1cHBvcnQuIFRoaXMgZHJpdmVyCi0gICAgICAgICAgaXMgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIEkyQyByZWFkIGFuZCB3cml0ZSBvbiB0aGUgSTJDCi0gICAgICAgICAgYnVzLiBJdCBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBzeW5jaHJvbml6YXRpb24gd2l0aAotICAgICAgICAgIEdQSU8gYW5kIGRhdGEgZnJhbWVzLgotCi1jb25maWcgUVVQX0VYQ0xVU0lWRV9UT19DQU1FUkEKLQlib29sICJRVVAgZXhjbHVzaXZlIHRvIGNhbWVyYSIKLQlkZXBlbmRzIG9uIE1TTV9DQU1FUkEKLQlkZWZhdWx0IHkKLQktLS1oZWxwLS0tCi0JICBUaGlzIGZsYWcgZW5hYmxlZCBzdGF0ZXMgdGhhdCBRVVAKLQkgIGlzIGV4Y2x1c2l2ZSB0byBjYW1lcmEuIEluIGNhc2UgdGhpcwotCSAgaXMgZGlzYWJsZWQsIHRoZSBsdnMxIHZvbHRhZ2UgaXMgZW5hYmxlZAotCSAgYnkgUVVQIGluIHRoZSBib2FyZCBmaWxlIGFzIFFVUCBpcyB1c2VkIGJ5Ci0JICBhcHBsaWNhdGlvbnMgb3RoZXIgdGhhbiBjYW1lcmEuCi0KLWNvbmZpZyBNU01fQ1NJMjBfSEVBREVSCi0gICAgICAgIGJvb2wgIlF1YWxjb21tIE1TTSBDU0kgMi4wIEhlYWRlciIKLSAgICAgICAgZGVwZW5kcyBvbiBNU01fQ0FNRVJBCi0gICAgICAgIC0tLWhlbHAtLS0KLSAgICAgICAgICBFbmFibGUgc3VwcG9ydCBmb3IgQ1NJIGRyaXZlcnMgdG8gaW5jbHVkZSAyLjAKLSAgICAgICAgICBoZWFkZXIuIFRoaXMgaGVhZGVyIGhhcyByZWdpc3RlciBtYWNyb3MgYW5kIGl0cwotICAgICAgICAgIHZhbHVlcyBhbmQgYml0IG1hc2sgZm9yIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gYml0cwotICAgICAgICAgIFRoaXMgY29uZmlnIG1hY3JvIGlzIHJlcXVpcmVkIHRhcmdldHMgYmFzZWQgb24gODk2MCwKLSAgICAgICAgICA4OTMwIGFuZCA4MDY0IHBsYXRmb3Jtcy4KLQotY29uZmlnIE1TTV9DU0kzMF9IRUFERVIKLSAgICAgICAgYm9vbCAiUXVhbGNvbW0gTVNNIENTSSAzLjAgSGVhZGVyIgotICAgICAgICBkZXBlbmRzIG9uIE1TTV9DQU1FUkEKLSAgICAgICAgLS0taGVscC0tLQotICAgICAgICAgIEVuYWJsZSBzdXBwb3J0IGZvciBDU0kgZHJpdmVycyB0byBpbmNsdWRlIDMuMAotICAgICAgICAgIGhlYWRlci4gVGhpcyBoZWFkZXIgaGFzIHJlZ2lzdGVyIG1hY3JvcyBhbmQgaXRzCi0gICAgICAgICAgdmFsdWVzIGFuZCBiaXQgbWFzayBmb3IgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiBiaXRzCi0gICAgICAgICAgVGhpcyBjb25maWcgbWFjcm8gaXMgcmVxdWlyZWQgZm9yIHRhcmdldHMgYmFzZWQgb24KLSAgICAgICAgICA4MDY0IHBsYXRmb3Jtcy4KLQotY29uZmlnIE1TTV9DU0lQSFkKLSAgICAgICAgYm9vbCAiUXVhbGNvbW0gTVNNIENhbWVyYSBTZXJpYWwgSW50ZXJmYWNlIFBoeXNpY2FsIHJlY2VpdmVyIHN1cHBvcnQiCi0gICAgICAgIGRlcGVuZHMgb24gTVNNX0NBTUVSQQotICAgICAgICAtLS1oZWxwLS0tCi0gICAgICAgICAgRW5hYmxlIHN1cHBvcnQgZm9yIENhbWVyYSBTZXJpYWwgSW50ZXJmYWNlCi0gICAgICAgICAgUGh5c2ljYWwgcmVjZWl2ZXIuIEl0IGRlc2VyaWFsaXplcyBwYWNrZXRzIGFuZAotICAgICAgICAgIHN1cHBvcnRzIGRldGVjdGlvbiBvZiBwYWNrZXQgc3RhcnQgYW5kIHN0b3AKLSAgICAgICAgICBzaWduYWxsaW5nLgotCi1jb25maWcgTVNNX0NTSUQKLSAgICAgICAgYm9vbCAiUXVhbGNvbW0gTVNNIENhbWVyYSBTZXJpYWwgSW50ZXJmYWNlIGRlY29kZXIgc3VwcG9ydCIKLSAgICAgICAgZGVwZW5kcyBvbiBNU01fQ0FNRVJBCi0gICAgICAgIC0tLWhlbHAtLS0KLSAgICAgICAgICBFbmFibGUgc3VwcG9ydCBmb3IgQ2FtZXJhIFNlcmlhbCBJbnRlcmZhY2UgZGVjb2Rlci4KLSAgICAgICAgICBJdCBzdXBwb3J0cyBsYW5lIG1lcmdpbmcgYW5kIGRlY29kaW5nIG9mIHBhY2tldHMKLSAgICAgICAgICBiYXNlZCBvbiBjaWQgd2hpY2ggaXMgbWFwcGVkIHRvIGEgdmlydHVhbCBjaGFubmVsCi0gICAgICAgICAgYW5kIGRhdGF0eXBlLgotCi1jb25maWcgTVNNX0NTSTJfUkVHSVNURVIKLSAgICAgICAgYm9vbCAiUXVhbGNvbW0gTVNNIENTSTIgUmVnaXN0ZXIiCi0gICAgICAgIGRlcGVuZHMgb24gTVNNX0NBTUVSQQotICAgICAgICAtLS1oZWxwLS0tCi0gICAgICAgICAgUmVnaXN0ZXIgQ1NJUEhZLCBDU0lEIGFuZCBJU1BJRiBzdWJkZXZpY2VzIGR1cmluZwotICAgICAgICAgIG1zbV9vcGVuLiBEaWZmZXJlbnQgQ1NJIGNvbXBvbmVudHMgYXJlIHJlZ2lzdGVyZWQKLSAgICAgICAgICBiYXNlZCBvbiBwbGF0Zm9ybS4gVGhpcyBtYWNybyBzcGVjaWZpZXMgcmVnaXN0ZXJpbmcKLSAgICAgICAgICBvZiBDU0lQSFksIENTSUQgYW5kIElTUElGIHN1YmRldmljZXMgdG8gcmVjZWl2ZSBkYXRhCi0gICAgICAgICAgZnJvbSBzZW5zb3IuCi0KLWNvbmZpZyBNU01fSVNQSUYKLSAgICAgICAgYm9vbCAiUXVhbGNvbW0gTVNNIEltYWdlIFNpZ25hbCBQcm9jZXNzaW5nIGludGVyZmFjZSBzdXBwb3J0IgotICAgICAgICBkZXBlbmRzIG9uIE1TTV9DQU1FUkEKLSAgICAgICAgLS0taGVscC0tLQotICAgICAgICAgIEVuYWJsZSBzdXBwb3J0IGZvciBJbWFnZSBTaWduYWwgUHJvY2Vzc2luZyBpbnRlcmZhY2UgbW9kdWxlLgotICAgICAgICAgIFRoaXMgbW9kdWxlIGFjdHMgYXMgYSBjcm9zc2JhciBiZXR3ZWVuIENTSUQgYW5kIFZGRS4gT3V0cHV0Ci0gICAgICAgICAgb2YgYW55IENJRCBvZiBDU0lEIGNhbiBiZSByb3V0ZWQgdG8gb2Ygb2YgcGl4ZWwgb3IgcmF3Ci0gICAgICAgICAgZGF0YSBpbnRlcmZhY2UgaW4gVkZFLgotCi1jb25maWcgUzVLM0wxWVgKLQlib29sICJTZW5zb3IgUzVLM0wxWVggKEJBWUVSIDEyTSkiCi0JZGVwZW5kcyBvbiBNU01fQ0FNRVJBCi0JLS0taGVscC0tLQotCQlTYW1zdW5nIDEyIE1QIEJheWVyIFNlbnNvciB3aXRoIGF1dG8gZm9jdXMsIHVzZXMKLQkJNCBtaXBpIGxhbmVzLCBwcmV2aWV3IGNvbmZpZyA9IDE5ODQgKiAxNTA4IGF0IDMwIGZwcywKLQkJc25hcHNob3QgY29uZmlnID0gNDAwMCAqIDMwMDAgYXQgMjAgZnBzLAotCQloZnIgdmlkZW8gYXQgNjAsIDkwIGFuZCAxMjAgZnBzLgotCi1jb25maWcgSU1YMDkxCi0gICAgICAgIGJvb2wgIlNlbnNvciBpbXgwOTEgKFNvbnkgMTNNUCkiCi0gICAgICAgIGRlcGVuZHMgb24gTVNNX0NBTUVSQQotCS0tLWhlbHAtLS0KLQkgIFNvbnkgMTNNUCBzZW5zb3IgYmFjayBjYW1lcmEgdGhhdCB1c2VzIDQgbWlwaSBsYW5lcywKLQkgIHJ1bnMgYXQgMzAgZnBzIHByZXZpZXcgYW5kIDE0IGZwcyBzbmFwc2hvdAotCi1jb25maWcgTVNNX1Y0TDJfVklERU9fT1ZFUkxBWV9ERVZJQ0UKLQl0cmlzdGF0ZSAiUXVhbGNvbW0gTVNNIFY0bDIgdmlkZW8gb3ZlcmxheSBkZXZpY2UiCi0JLS0taGVscC0tLQotCSAgRW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTVNNIFY0TDIgdmlkZW8KLQkgIG92ZXJsYXkgZHJpdmVyLiBUaGlzIGFsbG93cyB2aWRlbyByZW5kZXJpbmcKLQkgIGFwcHMgdG8gcmVuZGVyIG92ZXJsYWlkIHZpZGVvIHVzaW5nIFZpZGVvNExpbnV4MgotCSAgQVBJcywgYnkgdXNpbmcgL2Rldi92aWRlb1ggZGV2aWNlCi0KLWNvbmZpZyBPVjc2OTIKLQlib29sICJTZW5zb3IgT1Y3NjkyIChWR0EgWVVWKSIKLQlkZXBlbmRzIG9uIE1TTV9DQU1FUkEKLQktLS1oZWxwLS0tCi0JICBPbW5pIFZpc2lvbiBWR0EgWVVWIFNlbnNvcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjY2YjI5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLUdDQ19WRVJTSU9OICAgICAgOj0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChQV0QpL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2ggJChDUk9TU19DT01QSUxFKWdjYykKLQotY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvCi1jY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlCi1vYmotJChDT05GSUdfTVNNX0NBTUVSQSkgKz0gaW8vCi1pZmVxICgkKENPTkZJR19NU01fQ0FNRVJBX1Y0TDIpLHkpCi0gIEVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jY2kKLSAgRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaQotICBFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZWVwcm9tCi0gIEVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzCi0gIEVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9hY3R1YXRvcnMKLSAgRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlcnZlcgotICBFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZmxhc2gKLSAgb2JqLSQoQ09ORklHX01TTV9DQU1FUkEpICs9IG1zbV9pc3AubyBtc20ubyBtc21fbWVtLm8gbXNtX21jdGwubyBtc21fbWN0bF9idWYubyBtc21fbWN0bF9wcC5vCi0gIG9iai0kKENPTkZJR19NU01fQ0FNRVJBKSArPSBzZXJ2ZXIvCi0gIG9iai0kKENPTkZJR19NU01fQ0FNX0lSUV9ST1VURVIpICs9IG1zbV9jYW1pcnFfcm91dGVyLm8KLSAgb2JqLSQoQ09ORklHX01TTV9DQU1FUkEpICs9IGNjaS8gZWVwcm9tLyBzZW5zb3JzLyBhY3R1YXRvcnMvIGNzaS8KLSAgb2JqLSQoQ09ORklHX01TTV9DUFApICs9IGNwcC8KLSAgb2JqLSQoQ09ORklHX01TTV9DQU1FUkEpICs9IG1zbV9nZXN0dXJlLm8KLSAgb2JqLSQoQ09ORklHX01TTV9DQU1FUkEpICs9IGZsYXNoLwotZWxzZQotICBvYmotJChDT05GSUdfTVNNX0NBTUVSQSkgKz0gbXNtX2NhbWVyYS5vCi1lbmRpZgotb2JqLSQoQ09ORklHX01TTV9DQU1FUkEpICs9IHZmZS8KLW9iai0kKENPTkZJR19NU01fQ0FNRVJBKSArPSBtc21fYXhpX3Fvcy5vIGdlbWluaS8gbWVyY3VyeS8KLWlmZXEgKCQoQ09ORklHX01TTV9DQU1FUkFfVjRMMikseSkKLSAgb2JqLSQoQ09ORklHX0FSQ0hfTVNNOFg2MCkgKz0gbXNtX3ZwZS5vCi0gIG9iai0kKENPTkZJR19BUkNIX01TTTdYMzApICs9IG1zbV92cGUubyBtc21fYXhpX3Fvcy5vCi1lbHNlCi0gIG9iai0kKENPTkZJR19BUkNIX01TTThYNjApICs9IG1zbV92cGUxLm8KLSAgb2JqLSQoQ09ORklHX0FSQ0hfTVNNN1gzMCkgKz0gbXNtX3ZwZTEubwotZW5kaWYKLW9iai0kKENPTkZJR19BUkNIX01TTTg5NjApICs9IG1zbV92cGUubwotb2JqLSQoQ09ORklHX01UOVQwMTMpICs9IG10OXQwMTMubyBtdDl0MDEzX3JlZy5vCi1vYmotJChDT05GSUdfU04xMk0wUFopICs9IHNuMTJtMHB6Lm8gc24xMm0wcHpfcmVnLm8KLW9iai0kKENPTkZJR19NVDlQMDEyKSArPSBtdDlwMDEyX3JlZy5vCi1vYmotJChDT05GSUdfTVNNX0NBTUVSQV9BRl9GT1hDT05OKSArPSBtdDlwMDEyX2ZveC5vCi1vYmotJChDT05GSUdfTVNNX0NBTUVSQV9BRl9CQU0pICs9IG10OXAwMTJfYmFtLm8KLW9iai0kKENPTkZJR19NVDlQMDEyX0tNKSArPSBtdDlwMDEyX2ttLm8gbXQ5cDAxMl9rbV9yZWcubwotb2JqLSQoQ09ORklHX1M1SzNFMkZYKSArPSBzNWszZTJmeC5vCi0jRklYTUU6IE1lcmdlIHRoZSB0d28gaWZlcSBjYXVzZXMgVlg2OTUzIHByZXZpZXcgbm90IGNvbWluZyB1cC4KLWlmbmVxICgkKENPTkZJR19NU01fQ0FNRVJBX1Y0TDIpLHkpCi0gIG9iai0kKENPTkZJR19WWDY5NTMpICs9IHZ4Njk1My5vIHZ4Njk1M19yZWcubwotICBvYmotJChDT05GSUdfSU1YMDc0KSArPSBpbXgwNzQubyBpbXgwNzRfcmVnLm8KLSAgb2JqLSQoQ09ORklHX01UOUUwMTMpICs9IG10OWUwMTMubyBtdDllMDEzX3JlZy5vCi0gIG9iai0kKENPTkZJR19XRUJDQU1fT1Y5NzI2KSArPSBvdjk3MjYubyBvdjk3MjZfcmVnLm8KLSAgb2JqLSQoQ09ORklHX09WNTY0NykgKz0gb3Y1NjQ3Lm8gb3Y1NjQ3X3JlZy5vCi0gIG9iai0kKENPTkZJR19TNUs0RTEpICs9IHM1azRlMS5vIHM1azRlMV9yZWcubwotICBvYmotJChDT05GSUdfV0VCQ0FNX09WNzY5MikgKz0gb3Y3NjkyLm8KLSAgb2JqLSQoQ09ORklHX1dFQkNBTV9PVjc2OTJfUVJEKSArPSBvdjc2OTJfcXJkLm8KLWVuZGlmCi1vYmotJChDT05GSUdfUVNfUzVLNEUxKSArPSBxc19zNWs0ZTEubyBxc19zNWs0ZTFfcmVnLm8KLW9iai0kKENPTkZJR19WQjY4MDEpICs9IHZiNjgwMS5vCi1vYmotJChDT05GSUdfSU1YMDcyKSArPSBpbXgwNzIubyBpbXgwNzJfcmVnLm8KLW9iai0kKENPTkZJR19PVjU2NDApICs9IG92NTY0MC5vCi1vYmotJChDT05GSUdfTVQ5RDExMikgKz0gbXQ5ZDExMi5vIG10OWQxMTJfcmVnLm8KLQotb2JqLSQoQ09ORklHX01UOUQxMTMpICs9IG10OWQxMTMubyBtdDlkMTEzX3JlZy5vCi1vYmotJChDT05GSUdfTVNNX1Y0TDJfVklERU9fT1ZFUkxBWV9ERVZJQ0UpICs9IG1zbV92NGwyX3ZpZGVvLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9hY3R1YXRvcnMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvYWN0dWF0b3JzL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTcxM2ExLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9hY3R1YXRvcnMvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLUdDQ19WRVJTSU9OICAgICAgOj0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChQV0QpL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2ggJChDUk9TU19DT01QSUxFKWdjYykKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvCi1vYmotJChDT05GSUdfTVNNX0FDVFVBVE9SKSArPSBtc21fYWN0dWF0b3IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2FjdHVhdG9ycy9tc21fYWN0dWF0b3IuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9hY3R1YXRvcnMvbXNtX2FjdHVhdG9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YTQ4NjYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2FjdHVhdG9ycy9tc21fYWN0dWF0b3IuYworKysgL2Rldi9udWxsCkBAIC0xLDY5MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSAibXNtX2FjdHVhdG9yLmgiCi0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2FjdHVhdG9yX2N0cmxfdCBtc21fYWN0dWF0b3JfdDsKLXN0YXRpYyBzdHJ1Y3QgbXNtX2FjdHVhdG9yIG1zbV92Y21fYWN0dWF0b3JfdGFibGU7Ci1zdGF0aWMgc3RydWN0IG1zbV9hY3R1YXRvciBtc21fcGllem9fYWN0dWF0b3JfdGFibGU7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2FjdHVhdG9yICphY3R1YXRvcnNbXSA9IHsKLQkmbXNtX3ZjbV9hY3R1YXRvcl90YWJsZSwKLQkmbXNtX3BpZXpvX2FjdHVhdG9yX3RhYmxlLAotfTsKLQotc3RhdGljIGludDMyX3QgbXNtX2FjdHVhdG9yX3BpZXpvX3NldF9kZWZhdWx0X2ZvY3VzKAotCXN0cnVjdCBtc21fYWN0dWF0b3JfY3RybF90ICphX2N0cmwsCi0Jc3RydWN0IG1zbV9hY3R1YXRvcl9tb3ZlX3BhcmFtc190ICptb3ZlX3BhcmFtcykKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCWlmIChhX2N0cmwtPmN1cnJfc3RlcF9wb3MgIT0gMCkgewotCQlhX2N0cmwtPmkyY190YmxfaW5kZXggPSAwOwotCQlyYyA9IGFfY3RybC0+ZnVuY190YmwtPmFjdHVhdG9yX3BhcnNlX2kyY19wYXJhbXMoYV9jdHJsLAotCQkJYV9jdHJsLT5pbml0aWFsX2NvZGUsIDAsIDApOwotCQlyYyA9IGFfY3RybC0+ZnVuY190YmwtPmFjdHVhdG9yX3BhcnNlX2kyY19wYXJhbXMoYV9jdHJsLAotCQkJYV9jdHJsLT5pbml0aWFsX2NvZGUsIDAsIDApOwotCQlyYyA9IG1zbV9jYW1lcmFfaTJjX3dyaXRlX3RhYmxlX3dfbWljcm9kZWxheSgKLQkJCSZhX2N0cmwtPmkyY19jbGllbnQsIGFfY3RybC0+aTJjX3JlZ190YmwsCi0JCQlhX2N0cmwtPmkyY190YmxfaW5kZXgsIGFfY3RybC0+aTJjX2RhdGFfdHlwZSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGkyYyB3cml0ZSBlcnJvcjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCWFfY3RybC0+aTJjX3RibF9pbmRleCA9IDA7Ci0JCWFfY3RybC0+Y3Vycl9zdGVwX3BvcyA9IDA7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXNtX2FjdHVhdG9yX3BhcnNlX2kyY19wYXJhbXMoc3RydWN0IG1zbV9hY3R1YXRvcl9jdHJsX3QgKmFfY3RybCwKLQlpbnQxNl90IG5leHRfbGVuc19wb3NpdGlvbiwgdWludDMyX3QgaHdfcGFyYW1zLCB1aW50MTZfdCBkZWxheSkKLXsKLQlzdHJ1Y3QgbXNtX2FjdHVhdG9yX3JlZ19wYXJhbXNfdCAqd3JpdGVfYXJyID0gYV9jdHJsLT5yZWdfdGJsOwotCXVpbnQzMl90IGh3X2R3b3JkID0gaHdfcGFyYW1zOwotCXVpbnQxNl90IGkyY19ieXRlMSA9IDAsIGkyY19ieXRlMiA9IDA7Ci0JdWludDE2X3QgdmFsdWUgPSAwOwotCXVpbnQzMl90IHNpemUgPSBhX2N0cmwtPnJlZ190Ymxfc2l6ZSwgaSA9IDA7Ci0JaW50MzJfdCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ190YmwgKmkyY190YmwgPSBhX2N0cmwtPmkyY19yZWdfdGJsOwotCUNEQkcoIiVzOiBJTlxuIiwgX19mdW5jX18pOwotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJaWYgKHdyaXRlX2FycltpXS5yZWdfd3JpdGVfdHlwZSA9PSBNU01fQUNUVUFUT1JfV1JJVEVfREFDKSB7Ci0JCQl2YWx1ZSA9IChuZXh0X2xlbnNfcG9zaXRpb24gPDwKLQkJCQl3cml0ZV9hcnJbaV0uZGF0YV9zaGlmdCkgfAotCQkJCSgoaHdfZHdvcmQgJiB3cml0ZV9hcnJbaV0uaHdfbWFzaykgPj4KLQkJCQl3cml0ZV9hcnJbaV0uaHdfc2hpZnQpOwotCi0JCQlpZiAod3JpdGVfYXJyW2ldLnJlZ19hZGRyICE9IDB4RkZGRikgewotCQkJCWkyY19ieXRlMSA9IHdyaXRlX2FycltpXS5yZWdfYWRkcjsKLQkJCQlpMmNfYnl0ZTIgPSB2YWx1ZTsKLQkJCQlpZiAoc2l6ZSAhPSAoaSsxKSkgewotCQkJCQlpMmNfYnl0ZTIgPSB2YWx1ZSAmIDB4RkY7Ci0JCQkJCUNEQkcoIiVzOiBieXRlMToweCV4LCBieXRlMjoweCV4XG4iLAotCQkJCQlfX2Z1bmNfXywgaTJjX2J5dGUxLCBpMmNfYnl0ZTIpOwotCQkJCQlpMmNfdGJsW2FfY3RybC0+aTJjX3RibF9pbmRleF0uCi0JCQkJCQlyZWdfYWRkciA9IGkyY19ieXRlMTsKLQkJCQkJaTJjX3RibFthX2N0cmwtPmkyY190YmxfaW5kZXhdLgotCQkJCQkJcmVnX2RhdGEgPSBpMmNfYnl0ZTI7Ci0JCQkJCWkyY190YmxbYV9jdHJsLT5pMmNfdGJsX2luZGV4XS4KLQkJCQkJCWRlbGF5ID0gMDsKLQkJCQkJYV9jdHJsLT5pMmNfdGJsX2luZGV4Kys7Ci0JCQkJCWkrKzsKLQkJCQkJaTJjX2J5dGUxID0gd3JpdGVfYXJyW2ldLnJlZ19hZGRyOwotCQkJCQlpMmNfYnl0ZTIgPSAodmFsdWUgJiAweEZGMDApID4+IDg7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpMmNfYnl0ZTEgPSAodmFsdWUgJiAweEZGMDApID4+IDg7Ci0JCQkJaTJjX2J5dGUyID0gdmFsdWUgJiAweEZGOwotCQkJfQotCQl9IGVsc2UgewotCQkJaTJjX2J5dGUxID0gd3JpdGVfYXJyW2ldLnJlZ19hZGRyOwotCQkJaTJjX2J5dGUyID0gKGh3X2R3b3JkICYgd3JpdGVfYXJyW2ldLmh3X21hc2spID4+Ci0JCQkJd3JpdGVfYXJyW2ldLmh3X3NoaWZ0OwotCQl9Ci0JCUNEQkcoIiVzOiBpMmNfYnl0ZTE6MHgleCwgaTJjX2J5dGUyOjB4JXhcbiIsIF9fZnVuY19fLAotCQkJaTJjX2J5dGUxLCBpMmNfYnl0ZTIpOwotCQlpMmNfdGJsW2FfY3RybC0+aTJjX3RibF9pbmRleF0ucmVnX2FkZHIgPSBpMmNfYnl0ZTE7Ci0JCWkyY190YmxbYV9jdHJsLT5pMmNfdGJsX2luZGV4XS5yZWdfZGF0YSA9IGkyY19ieXRlMjsKLQkJaTJjX3RibFthX2N0cmwtPmkyY190YmxfaW5kZXhdLmRlbGF5ID0gZGVsYXk7Ci0JCWFfY3RybC0+aTJjX3RibF9pbmRleCsrOwotCX0KLQkJQ0RCRygiJXM6IE9VVFxuIiwgX19mdW5jX18pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXNtX2FjdHVhdG9yX2luaXRfZm9jdXMoc3RydWN0IG1zbV9hY3R1YXRvcl9jdHJsX3QgKmFfY3RybCwKLQl1aW50MTZfdCBzaXplLCBlbnVtIG1zbV9hY3R1YXRvcl9kYXRhX3R5cGUgdHlwZSwKLQlzdHJ1Y3QgcmVnX3NldHRpbmdzX3QgKnNldHRpbmdzKQotewotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCWludDMyX3QgaSA9IDA7Ci0JQ0RCRygiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIE1TTV9BQ1RVQVRPUl9CWVRFX0RBVEE6Ci0JCQlyYyA9IG1zbV9jYW1lcmFfaTJjX3dyaXRlKAotCQkJCSZhX2N0cmwtPmkyY19jbGllbnQsCi0JCQkJc2V0dGluZ3NbaV0ucmVnX2FkZHIsCi0JCQkJc2V0dGluZ3NbaV0ucmVnX2RhdGEsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JCQlicmVhazsKLQkJY2FzZSBNU01fQUNUVUFUT1JfV09SRF9EQVRBOgotCQkJcmMgPSBtc21fY2FtZXJhX2kyY193cml0ZSgKLQkJCQkmYV9jdHJsLT5pMmNfY2xpZW50LAotCQkJCXNldHRpbmdzW2ldLnJlZ19hZGRyLAotCQkJCXNldHRpbmdzW2ldLnJlZ19kYXRhLCBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEEpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoIiVzOiBVbnN1cHBvcnQgZGF0YSB0eXBlOiAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgdHlwZSk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0JfQotCi0JYV9jdHJsLT5jdXJyX3N0ZXBfcG9zID0gMDsKLQlDREJHKCIlcyBFeGl0OiVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXNtX2FjdHVhdG9yX3dyaXRlX2ZvY3VzKAotCXN0cnVjdCBtc21fYWN0dWF0b3JfY3RybF90ICphX2N0cmwsCi0JdWludDE2X3QgY3Vycl9sZW5zX3BvcywKLQlzdHJ1Y3QgZGFtcGluZ19wYXJhbXNfdCAqZGFtcGluZ19wYXJhbXMsCi0JaW50OF90IHNpZ25fZGlyZWN0aW9uLAotCWludDE2X3QgY29kZV9ib3VuZGFyeSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlpbnQxNl90IG5leHRfbGVuc19wb3MgPSAwOwotCXVpbnQxNl90IGRhbXBpbmdfY29kZV9zdGVwID0gMDsKLQl1aW50MTZfdCB3YWl0X3RpbWUgPSAwOwotCi0JZGFtcGluZ19jb2RlX3N0ZXAgPSBkYW1waW5nX3BhcmFtcy0+ZGFtcGluZ19zdGVwOwotCXdhaXRfdGltZSA9IGRhbXBpbmdfcGFyYW1zLT5kYW1waW5nX2RlbGF5OwotCi0JLyogV3JpdGUgY29kZSBiYXNlZCBvbiBkYW1waW5nX2NvZGVfc3RlcCBpbiBhIGxvb3AgKi8KLQlmb3IgKG5leHRfbGVuc19wb3MgPQotCQljdXJyX2xlbnNfcG9zICsgKHNpZ25fZGlyZWN0aW9uICogZGFtcGluZ19jb2RlX3N0ZXApOwotCQkoc2lnbl9kaXJlY3Rpb24gKiBuZXh0X2xlbnNfcG9zKSA8PQotCQkJKHNpZ25fZGlyZWN0aW9uICogY29kZV9ib3VuZGFyeSk7Ci0JCW5leHRfbGVuc19wb3MgPQotCQkJKG5leHRfbGVuc19wb3MgKwotCQkJCShzaWduX2RpcmVjdGlvbiAqIGRhbXBpbmdfY29kZV9zdGVwKSkpIHsKLQkJcmMgPSBhX2N0cmwtPmZ1bmNfdGJsLT4KLQkJCWFjdHVhdG9yX3BhcnNlX2kyY19wYXJhbXMoYV9jdHJsLCBuZXh0X2xlbnNfcG9zLAotCQkJCWRhbXBpbmdfcGFyYW1zLT5od19wYXJhbXMsIHdhaXRfdGltZSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGVycm9yOiVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQkJY3Vycl9sZW5zX3BvcyA9IG5leHRfbGVuc19wb3M7Ci0JfQotCi0JaWYgKGN1cnJfbGVuc19wb3MgIT0gY29kZV9ib3VuZGFyeSkgewotCQlyYyA9IGFfY3RybC0+ZnVuY190YmwtPgotCQkJYWN0dWF0b3JfcGFyc2VfaTJjX3BhcmFtcyhhX2N0cmwsIGNvZGVfYm91bmRhcnksCi0JCQkJZGFtcGluZ19wYXJhbXMtPmh3X3BhcmFtcywgd2FpdF90aW1lKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtc21fYWN0dWF0b3JfcGllem9fbW92ZV9mb2N1cygKLQlzdHJ1Y3QgbXNtX2FjdHVhdG9yX2N0cmxfdCAqYV9jdHJsLAotCXN0cnVjdCBtc21fYWN0dWF0b3JfbW92ZV9wYXJhbXNfdCAqbW92ZV9wYXJhbXMpCi17Ci0JaW50MzJfdCBkZXN0X3N0ZXBfcG9zaXRpb24gPSBtb3ZlX3BhcmFtcy0+ZGVzdF9zdGVwX3BvczsKLQlpbnQzMl90IHJjID0gMDsKLQlpbnQzMl90IG51bV9zdGVwcyA9IG1vdmVfcGFyYW1zLT5udW1fc3RlcHM7Ci0KLQlpZiAobnVtX3N0ZXBzID09IDApCi0JCXJldHVybiByYzsKLQotCWFfY3RybC0+aTJjX3RibF9pbmRleCA9IDA7Ci0JcmMgPSBhX2N0cmwtPmZ1bmNfdGJsLT4KLQkJYWN0dWF0b3JfcGFyc2VfaTJjX3BhcmFtcyhhX2N0cmwsCi0JCShudW1fc3RlcHMgKgotCQlhX2N0cmwtPnJlZ2lvbl9wYXJhbXNbMF0uY29kZV9wZXJfc3RlcCksCi0JCW1vdmVfcGFyYW1zLT5yaW5naW5nX3BhcmFtc1swXS5od19wYXJhbXMsIDApOwotCi0JcmMgPSBtc21fY2FtZXJhX2kyY193cml0ZV90YWJsZV93X21pY3JvZGVsYXkoJmFfY3RybC0+aTJjX2NsaWVudCwKLQkJYV9jdHJsLT5pMmNfcmVnX3RibCwgYV9jdHJsLT5pMmNfdGJsX2luZGV4LAotCQlhX2N0cmwtPmkyY19kYXRhX3R5cGUpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogaTJjIHdyaXRlIGVycm9yOiVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlhX2N0cmwtPmkyY190YmxfaW5kZXggPSAwOwotCWFfY3RybC0+Y3Vycl9zdGVwX3BvcyA9IGRlc3Rfc3RlcF9wb3NpdGlvbjsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG1zbV9hY3R1YXRvcl9tb3ZlX2ZvY3VzKAotCXN0cnVjdCBtc21fYWN0dWF0b3JfY3RybF90ICphX2N0cmwsCi0Jc3RydWN0IG1zbV9hY3R1YXRvcl9tb3ZlX3BhcmFtc190ICptb3ZlX3BhcmFtcykKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlpbnQ4X3Qgc2lnbl9kaXIgPSBtb3ZlX3BhcmFtcy0+c2lnbl9kaXI7Ci0JdWludDE2X3Qgc3RlcF9ib3VuZGFyeSA9IDA7Ci0JdWludDE2X3QgdGFyZ2V0X3N0ZXBfcG9zID0gMDsKLQl1aW50MTZfdCB0YXJnZXRfbGVuc19wb3MgPSAwOwotCWludDE2X3QgZGVzdF9zdGVwX3BvcyA9IG1vdmVfcGFyYW1zLT5kZXN0X3N0ZXBfcG9zOwotCXVpbnQxNl90IGN1cnJfbGVuc19wb3MgPSAwOwotCWludCBkaXIgPSBtb3ZlX3BhcmFtcy0+ZGlyOwotCWludDMyX3QgbnVtX3N0ZXBzID0gbW92ZV9wYXJhbXMtPm51bV9zdGVwczsKLQotCUNEQkcoIiVzIGNhbGxlZCwgZGlyICVkLCBudW1fc3RlcHMgJWRcbiIsCi0JCV9fZnVuY19fLAotCQlkaXIsCi0JCW51bV9zdGVwcyk7Ci0KLQlpZiAoZGVzdF9zdGVwX3BvcyA9PSBhX2N0cmwtPmN1cnJfc3RlcF9wb3MpCi0JCXJldHVybiByYzsKLQotCWN1cnJfbGVuc19wb3MgPSBhX2N0cmwtPnN0ZXBfcG9zaXRpb25fdGFibGVbYV9jdHJsLT5jdXJyX3N0ZXBfcG9zXTsKLQlhX2N0cmwtPmkyY190YmxfaW5kZXggPSAwOwotCUNEQkcoImN1cnJfc3RlcF9wb3MgPSVkIGRlc3Rfc3RlcF9wb3MgPSVkIGN1cnJfbGVuc19wb3M9JWRcbiIsCi0JCWFfY3RybC0+Y3Vycl9zdGVwX3BvcywgZGVzdF9zdGVwX3BvcywgY3Vycl9sZW5zX3Bvcyk7Ci0KLQl3aGlsZSAoYV9jdHJsLT5jdXJyX3N0ZXBfcG9zICE9IGRlc3Rfc3RlcF9wb3MpIHsKLQkJc3RlcF9ib3VuZGFyeSA9Ci0JCQlhX2N0cmwtPnJlZ2lvbl9wYXJhbXNbYV9jdHJsLT5jdXJyX3JlZ2lvbl9pbmRleF0uCi0JCQlzdGVwX2JvdW5kW2Rpcl07Ci0JCWlmICgoZGVzdF9zdGVwX3BvcyAqIHNpZ25fZGlyKSA8PQotCQkJKHN0ZXBfYm91bmRhcnkgKiBzaWduX2RpcikpIHsKLQotCQkJdGFyZ2V0X3N0ZXBfcG9zID0gZGVzdF9zdGVwX3BvczsKLQkJCXRhcmdldF9sZW5zX3BvcyA9Ci0JCQkJYV9jdHJsLT5zdGVwX3Bvc2l0aW9uX3RhYmxlW3RhcmdldF9zdGVwX3Bvc107Ci0JCQlyYyA9IGFfY3RybC0+ZnVuY190YmwtPgotCQkJCWFjdHVhdG9yX3dyaXRlX2ZvY3VzKAotCQkJCQlhX2N0cmwsCi0JCQkJCWN1cnJfbGVuc19wb3MsCi0JCQkJCSYobW92ZV9wYXJhbXMtPgotCQkJCQkJcmluZ2luZ19wYXJhbXNbYV9jdHJsLT4KLQkJCQkJCWN1cnJfcmVnaW9uX2luZGV4XSksCi0JCQkJCXNpZ25fZGlyLAotCQkJCQl0YXJnZXRfbGVuc19wb3MpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6IGVycm9yOiVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJCXJldHVybiByYzsKLQkJCX0KLQkJCWN1cnJfbGVuc19wb3MgPSB0YXJnZXRfbGVuc19wb3M7Ci0KLQkJfSBlbHNlIHsKLQkJCXRhcmdldF9zdGVwX3BvcyA9IHN0ZXBfYm91bmRhcnk7Ci0JCQl0YXJnZXRfbGVuc19wb3MgPQotCQkJCWFfY3RybC0+c3RlcF9wb3NpdGlvbl90YWJsZVt0YXJnZXRfc3RlcF9wb3NdOwotCQkJcmMgPSBhX2N0cmwtPmZ1bmNfdGJsLT4KLQkJCQlhY3R1YXRvcl93cml0ZV9mb2N1cygKLQkJCQkJYV9jdHJsLAotCQkJCQljdXJyX2xlbnNfcG9zLAotCQkJCQkmKG1vdmVfcGFyYW1zLT4KLQkJCQkJCXJpbmdpbmdfcGFyYW1zW2FfY3RybC0+Ci0JCQkJCQljdXJyX3JlZ2lvbl9pbmRleF0pLAotCQkJCQlzaWduX2RpciwKLQkJCQkJdGFyZ2V0X2xlbnNfcG9zKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBlcnJvcjolZFxuIiwKLQkJCQkJX19mdW5jX18sIHJjKTsKLQkJCQlyZXR1cm4gcmM7Ci0JCQl9Ci0JCQljdXJyX2xlbnNfcG9zID0gdGFyZ2V0X2xlbnNfcG9zOwotCi0JCQlhX2N0cmwtPmN1cnJfcmVnaW9uX2luZGV4ICs9IHNpZ25fZGlyOwotCQl9Ci0JCWFfY3RybC0+Y3Vycl9zdGVwX3BvcyA9IHRhcmdldF9zdGVwX3BvczsKLQl9Ci0KLQlyYyA9IG1zbV9jYW1lcmFfaTJjX3dyaXRlX3RhYmxlX3dfbWljcm9kZWxheSgmYV9jdHJsLT5pMmNfY2xpZW50LAotCQlhX2N0cmwtPmkyY19yZWdfdGJsLCBhX2N0cmwtPmkyY190YmxfaW5kZXgsCi0JCWFfY3RybC0+aTJjX2RhdGFfdHlwZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBpMmMgd3JpdGUgZXJyb3I6JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCWFfY3RybC0+aTJjX3RibF9pbmRleCA9IDA7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG1zbV9hY3R1YXRvcl9pbml0X3N0ZXBfdGFibGUoc3RydWN0IG1zbV9hY3R1YXRvcl9jdHJsX3QgKmFfY3RybCwKLQlzdHJ1Y3QgbXNtX2FjdHVhdG9yX3NldF9pbmZvX3QgKnNldF9pbmZvKQotewotCWludDE2X3QgY29kZV9wZXJfc3RlcCA9IDA7Ci0JaW50MzJfdCByYyA9IDA7Ci0JaW50MTZfdCBjdXJfY29kZSA9IDA7Ci0JaW50MTZfdCBzdGVwX2luZGV4ID0gMCwgcmVnaW9uX2luZGV4ID0gMDsKLQl1aW50MTZfdCBzdGVwX2JvdW5kYXJ5ID0gMDsKLQl1aW50MzJfdCBtYXhfY29kZV9zaXplID0gMTsKLQl1aW50MTZfdCBkYXRhX3NpemUgPSBzZXRfaW5mby0+YWN0dWF0b3JfcGFyYW1zLmRhdGFfc2l6ZTsKLQlDREJHKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKLQotCWZvciAoOyBkYXRhX3NpemUgPiAwOyBkYXRhX3NpemUtLSkKLQkJbWF4X2NvZGVfc2l6ZSAqPSAyOwotCi0Ja2ZyZWUoYV9jdHJsLT5zdGVwX3Bvc2l0aW9uX3RhYmxlKTsKLQlhX2N0cmwtPnN0ZXBfcG9zaXRpb25fdGFibGUgPSBOVUxMOwotCi0JLyogRmlsbCBzdGVwIHBvc2l0aW9uIHRhYmxlICovCi0JYV9jdHJsLT5zdGVwX3Bvc2l0aW9uX3RhYmxlID0KLQkJa21hbGxvYyhzaXplb2YodWludDE2X3QpICoKLQkJKHNldF9pbmZvLT5hZl90dW5pbmdfcGFyYW1zLnRvdGFsX3N0ZXBzICsgMSksIEdGUF9LRVJORUwpOwotCi0JaWYgKGFfY3RybC0+c3RlcF9wb3NpdGlvbl90YWJsZSA9PSBOVUxMKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWN1cl9jb2RlID0gc2V0X2luZm8tPmFmX3R1bmluZ19wYXJhbXMuaW5pdGlhbF9jb2RlOwotCWFfY3RybC0+c3RlcF9wb3NpdGlvbl90YWJsZVtzdGVwX2luZGV4KytdID0gY3VyX2NvZGU7Ci0JZm9yIChyZWdpb25faW5kZXggPSAwOwotCQlyZWdpb25faW5kZXggPCBhX2N0cmwtPnJlZ2lvbl9zaXplOwotCQlyZWdpb25faW5kZXgrKykgewotCQljb2RlX3Blcl9zdGVwID0KLQkJCWFfY3RybC0+cmVnaW9uX3BhcmFtc1tyZWdpb25faW5kZXhdLmNvZGVfcGVyX3N0ZXA7Ci0JCXN0ZXBfYm91bmRhcnkgPQotCQkJYV9jdHJsLT5yZWdpb25fcGFyYW1zW3JlZ2lvbl9pbmRleF0uCi0JCQlzdGVwX2JvdW5kW01PVkVfTkVBUl07Ci0JCWZvciAoOyBzdGVwX2luZGV4IDw9IHN0ZXBfYm91bmRhcnk7Ci0JCQlzdGVwX2luZGV4KyspIHsKLQkJCWN1cl9jb2RlICs9IGNvZGVfcGVyX3N0ZXA7Ci0JCQlpZiAoY3VyX2NvZGUgPCBtYXhfY29kZV9zaXplKQotCQkJCWFfY3RybC0+c3RlcF9wb3NpdGlvbl90YWJsZVtzdGVwX2luZGV4XSA9Ci0JCQkJCWN1cl9jb2RlOwotCQkJZWxzZSB7Ci0JCQkJZm9yICg7IHN0ZXBfaW5kZXggPAotCQkJCQlzZXRfaW5mby0+YWZfdHVuaW5nX3BhcmFtcy50b3RhbF9zdGVwczsKLQkJCQkJc3RlcF9pbmRleCsrKQotCQkJCQlhX2N0cmwtPgotCQkJCQkJc3RlcF9wb3NpdGlvbl90YWJsZVsKLQkJCQkJCXN0ZXBfaW5kZXhdID0KLQkJCQkJCW1heF9jb2RlX3NpemU7Ci0KLQkJCQlyZXR1cm4gcmM7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG1zbV9hY3R1YXRvcl9zZXRfZGVmYXVsdF9mb2N1cygKLQlzdHJ1Y3QgbXNtX2FjdHVhdG9yX2N0cmxfdCAqYV9jdHJsLAotCXN0cnVjdCBtc21fYWN0dWF0b3JfbW92ZV9wYXJhbXNfdCAqbW92ZV9wYXJhbXMpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JQ0RCRygiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoYV9jdHJsLT5jdXJyX3N0ZXBfcG9zICE9IDApCi0JCXJjID0gYV9jdHJsLT5mdW5jX3RibC0+YWN0dWF0b3JfbW92ZV9mb2N1cyhhX2N0cmwsIG1vdmVfcGFyYW1zKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG1zbV9hY3R1YXRvcl9wb3dlcl9kb3duKHN0cnVjdCBtc21fYWN0dWF0b3JfY3RybF90ICphX2N0cmwpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JaWYgKGFfY3RybC0+dmNtX2VuYWJsZSkgewotCQlyYyA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChhX2N0cmwtPnZjbV9wd2QsIDApOwotCQlpZiAoIXJjKQotCQkJZ3Bpb19mcmVlKGFfY3RybC0+dmNtX3B3ZCk7Ci0JfQotCi0Ja2ZyZWUoYV9jdHJsLT5zdGVwX3Bvc2l0aW9uX3RhYmxlKTsKLQlhX2N0cmwtPnN0ZXBfcG9zaXRpb25fdGFibGUgPSBOVUxMOwotCWtmcmVlKGFfY3RybC0+aTJjX3JlZ190YmwpOwotCWFfY3RybC0+aTJjX3JlZ190YmwgPSBOVUxMOwotCWFfY3RybC0+aTJjX3RibF9pbmRleCA9IDA7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtc21fYWN0dWF0b3JfaW5pdChzdHJ1Y3QgbXNtX2FjdHVhdG9yX2N0cmxfdCAqYV9jdHJsLAotCXN0cnVjdCBtc21fYWN0dWF0b3Jfc2V0X2luZm9fdCAqc2V0X2luZm8pIHsKLQlzdHJ1Y3QgcmVnX3NldHRpbmdzX3QgKmluaXRfc2V0dGluZ3MgPSBOVUxMOwotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCXVpbnQxNl90IGkgPSAwOwotCUNEQkcoIiVzOiBJTlxuIiwgX19mdW5jX18pOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWN0dWF0b3JzKTsgaSsrKSB7Ci0JCWlmIChzZXRfaW5mby0+YWN0dWF0b3JfcGFyYW1zLmFjdF90eXBlID09Ci0JCQlhY3R1YXRvcnNbaV0tPmFjdF90eXBlKSB7Ci0JCQlhX2N0cmwtPmZ1bmNfdGJsID0gJmFjdHVhdG9yc1tpXS0+ZnVuY190Ymw7Ci0JCQlyYyA9IDA7Ci0JCX0KLQl9Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IEFjdHVhdG9yIGZ1bmN0aW9uIHRhYmxlIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JYV9jdHJsLT5yZWdpb25fc2l6ZSA9IHNldF9pbmZvLT5hZl90dW5pbmdfcGFyYW1zLnJlZ2lvbl9zaXplOwotCWlmIChhX2N0cmwtPnJlZ2lvbl9zaXplID4gTUFYX0FDVFVBVE9SX1JFR0lPTikgewotCQlwcl9lcnIoIiVzOiBNQVhfQUNUVUFUT1JfUkVHSU9OIGlzIGV4Y2VlZGVkLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JYV9jdHJsLT5wd2Rfc3RlcCA9IHNldF9pbmZvLT5hZl90dW5pbmdfcGFyYW1zLnB3ZF9zdGVwOwotCWFfY3RybC0+dG90YWxfc3RlcHMgPSBzZXRfaW5mby0+YWZfdHVuaW5nX3BhcmFtcy50b3RhbF9zdGVwczsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYV9jdHJsLT5yZWdpb25fcGFyYW1zLAotCQkodm9pZCAqKXNldF9pbmZvLT5hZl90dW5pbmdfcGFyYW1zLnJlZ2lvbl9wYXJhbXMsCi0JCWFfY3RybC0+cmVnaW9uX3NpemUgKiBzaXplb2Yoc3RydWN0IHJlZ2lvbl9wYXJhbXNfdCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWFfY3RybC0+aTJjX2RhdGFfdHlwZSA9IHNldF9pbmZvLT5hY3R1YXRvcl9wYXJhbXMuaTJjX2RhdGFfdHlwZTsKLQlhX2N0cmwtPmkyY19jbGllbnQuY2xpZW50LT5hZGRyID0gc2V0X2luZm8tPmFjdHVhdG9yX3BhcmFtcy5pMmNfYWRkcjsKLQlhX2N0cmwtPmkyY19jbGllbnQuYWRkcl90eXBlID0gc2V0X2luZm8tPmFjdHVhdG9yX3BhcmFtcy5pMmNfYWRkcl90eXBlOwotCWFfY3RybC0+cmVnX3RibF9zaXplID0gc2V0X2luZm8tPmFjdHVhdG9yX3BhcmFtcy5yZWdfdGJsX3NpemU7Ci0JaWYgKGFfY3RybC0+cmVnX3RibF9zaXplID4gTUFYX0FDVFVBVE9SX1JFR19UQkxfU0laRSkgewotCQlwcl9lcnIoIiVzOiBNQVhfQUNUVUFUT1JfUkVHX1RCTF9TSVpFIGlzIGV4Y2VlZGVkLlxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JYV9jdHJsLT5pMmNfcmVnX3RibCA9Ci0JCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfdGJsKSAqCi0JCShzZXRfaW5mby0+YWZfdHVuaW5nX3BhcmFtcy50b3RhbF9zdGVwcyArIDEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFfY3RybC0+aTJjX3JlZ190YmwpIHsKLQkJcHJfZXJyKCIlcyBrbWFsbG9jIGZhaWxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZhX2N0cmwtPnJlZ190YmwsCi0JCSh2b2lkICopc2V0X2luZm8tPmFjdHVhdG9yX3BhcmFtcy5yZWdfdGJsX3BhcmFtcywKLQkJYV9jdHJsLT5yZWdfdGJsX3NpemUgKgotCQlzaXplb2Yoc3RydWN0IG1zbV9hY3R1YXRvcl9yZWdfcGFyYW1zX3QpKSkgewotCQlrZnJlZShhX2N0cmwtPmkyY19yZWdfdGJsKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaWYgKHNldF9pbmZvLT5hY3R1YXRvcl9wYXJhbXMuaW5pdF9zZXR0aW5nX3NpemUpIHsKLQkJaWYgKGFfY3RybC0+ZnVuY190YmwtPmFjdHVhdG9yX2luaXRfZm9jdXMpIHsKLQkJCWluaXRfc2V0dGluZ3MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVnX3NldHRpbmdzX3QpICoKLQkJCQkoc2V0X2luZm8tPmFjdHVhdG9yX3BhcmFtcy5pbml0X3NldHRpbmdfc2l6ZSksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoaW5pdF9zZXR0aW5ncyA9PSBOVUxMKSB7Ci0JCQkJa2ZyZWUoYV9jdHJsLT5pMmNfcmVnX3RibCk7Ci0JCQkJcHJfZXJyKCIlcyBFcnJvciBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgaW5pdF9zZXR0aW5nc1xuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGluaXRfc2V0dGluZ3MsCi0JCQkJKHZvaWQgKilzZXRfaW5mby0+YWN0dWF0b3JfcGFyYW1zLmluaXRfc2V0dGluZ3MsCi0JCQkJc2V0X2luZm8tPmFjdHVhdG9yX3BhcmFtcy5pbml0X3NldHRpbmdfc2l6ZSAqCi0JCQkJc2l6ZW9mKHN0cnVjdCByZWdfc2V0dGluZ3NfdCkpKSB7Ci0JCQkJa2ZyZWUoaW5pdF9zZXR0aW5ncyk7Ci0JCQkJa2ZyZWUoYV9jdHJsLT5pMmNfcmVnX3RibCk7Ci0JCQkJcHJfZXJyKCIlcyBFcnJvciBjb3B5aW5nIGluaXRfc2V0dGluZ3NcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCXJjID0gYV9jdHJsLT5mdW5jX3RibC0+YWN0dWF0b3JfaW5pdF9mb2N1cyhhX2N0cmwsCi0JCQkJc2V0X2luZm8tPmFjdHVhdG9yX3BhcmFtcy5pbml0X3NldHRpbmdfc2l6ZSwKLQkJCQlhX2N0cmwtPmkyY19kYXRhX3R5cGUsCi0JCQkJaW5pdF9zZXR0aW5ncyk7Ci0JCQlrZnJlZShpbml0X3NldHRpbmdzKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlrZnJlZShhX2N0cmwtPmkyY19yZWdfdGJsKTsKLQkJCQlwcl9lcnIoIiVzIEVycm9yIGFjdHVhdG9yX2luaXRfZm9jdXNcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJfQotCX0KLQotCWFfY3RybC0+aW5pdGlhbF9jb2RlID0gc2V0X2luZm8tPmFmX3R1bmluZ19wYXJhbXMuaW5pdGlhbF9jb2RlOwotCWlmIChhX2N0cmwtPmZ1bmNfdGJsLT5hY3R1YXRvcl9pbml0X3N0ZXBfdGFibGUpCi0JCXJjID0gYV9jdHJsLT5mdW5jX3RibC0+Ci0JCQlhY3R1YXRvcl9pbml0X3N0ZXBfdGFibGUoYV9jdHJsLCBzZXRfaW5mbyk7Ci0KLQlhX2N0cmwtPmN1cnJfc3RlcF9wb3MgPSAwOwotCWFfY3RybC0+Y3Vycl9yZWdpb25faW5kZXggPSAwOwotCi0JcmV0dXJuIHJjOwotfQotCi0KLXN0YXRpYyBpbnQzMl90IG1zbV9hY3R1YXRvcl9jb25maWcoc3RydWN0IG1zbV9hY3R1YXRvcl9jdHJsX3QgKmFfY3RybCwKLQkJCQkJCQl2b2lkIF9fdXNlciAqYXJncCkKLXsKLQlzdHJ1Y3QgbXNtX2FjdHVhdG9yX2NmZ19kYXRhIGNkYXRhOwotCWludDMyX3QgcmMgPSAwOwotCWlmIChjb3B5X2Zyb21fdXNlcigmY2RhdGEsCi0JCSh2b2lkICopYXJncCwKLQkJc2l6ZW9mKHN0cnVjdCBtc21fYWN0dWF0b3JfY2ZnX2RhdGEpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JbXV0ZXhfbG9jayhhX2N0cmwtPmFjdHVhdG9yX211dGV4KTsKLQlDREJHKCIlcyBjYWxsZWQsIHR5cGUgJWRcbiIsIF9fZnVuY19fLCBjZGF0YS5jZmd0eXBlKTsKLQlzd2l0Y2ggKGNkYXRhLmNmZ3R5cGUpIHsKLQljYXNlIENGR19TRVRfQUNUVUFUT1JfSU5GTzoKLQkJcmMgPSBtc21fYWN0dWF0b3JfaW5pdChhX2N0cmwsICZjZGF0YS5jZmcuc2V0X2luZm8pOwotCQlpZiAocmMgPCAwKQotCQkJcHJfZXJyKCIlcyBpbml0IHRhYmxlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfREVGQVVMVF9GT0NVUzoKLQkJcmMgPSBhX2N0cmwtPmZ1bmNfdGJsLT5hY3R1YXRvcl9zZXRfZGVmYXVsdF9mb2N1cyhhX2N0cmwsCi0JCQkmY2RhdGEuY2ZnLm1vdmUpOwotCQlpZiAocmMgPCAwKQotCQkJcHJfZXJyKCIlcyBtb3ZlIGZvY3VzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19NT1ZFX0ZPQ1VTOgotCQlyYyA9IGFfY3RybC0+ZnVuY190YmwtPmFjdHVhdG9yX21vdmVfZm9jdXMoYV9jdHJsLAotCQkJJmNkYXRhLmNmZy5tb3ZlKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXByX2VycigiJXMgbW92ZSBmb2N1cyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCW11dGV4X3VubG9jayhhX2N0cmwtPmFjdHVhdG9yX211dGV4KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG1zbV9hY3R1YXRvcl9pMmNfcHJvYmUoCi0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2FjdHVhdG9yX2N0cmxfdCAqYWN0X2N0cmxfdCA9IE5VTEw7Ci0JQ0RCRygiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgewotCQlwcl9lcnIoImkyY19jaGVja19mdW5jdGlvbmFsaXR5IGZhaWxlZFxuIik7Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0KLQlhY3RfY3RybF90ID0gKHN0cnVjdCBtc21fYWN0dWF0b3JfY3RybF90ICopKGlkLT5kcml2ZXJfZGF0YSk7Ci0JQ0RCRygiJXMgY2xpZW50ID0gJXhcbiIsCi0JCV9fZnVuY19fLCAodW5zaWduZWQgaW50KSBjbGllbnQpOwotCWFjdF9jdHJsX3QtPmkyY19jbGllbnQuY2xpZW50ID0gY2xpZW50OwotCi0JLyogQXNzaWduIG5hbWUgZm9yIHN1YiBkZXZpY2UgKi8KLQlzbnByaW50ZihhY3RfY3RybF90LT5zZGV2Lm5hbWUsIHNpemVvZihhY3RfY3RybF90LT5zZGV2Lm5hbWUpLAotCQkJICIlcyIsIGFjdF9jdHJsX3QtPmkyY19kcml2ZXItPmRyaXZlci5uYW1lKTsKLQotCS8qIEluaXRpYWxpemUgc3ViIGRldmljZSAqLwotCXY0bDJfaTJjX3N1YmRldl9pbml0KCZhY3RfY3RybF90LT5zZGV2LAotCQlhY3RfY3RybF90LT5pMmNfY2xpZW50LmNsaWVudCwKLQkJYWN0X2N0cmxfdC0+YWN0X3Y0bDJfc3ViZGV2X29wcyk7Ci0KLQlDREJHKCIlcyBzdWNjZWVkZWRcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmM7Ci0KLXByb2JlX2ZhaWx1cmU6Ci0JcHJfZXJyKCIlcyBmYWlsZWQhIHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtc21fYWN0dWF0b3JfcG93ZXJfdXAoc3RydWN0IG1zbV9hY3R1YXRvcl9jdHJsX3QgKmFfY3RybCkKLXsKLQlpbnQgcmMgPSAwOwotCUNEQkcoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwotCi0JQ0RCRygidmNtIGluZm86ICV4ICV4XG4iLCBhX2N0cmwtPnZjbV9wd2QsCi0JCWFfY3RybC0+dmNtX2VuYWJsZSk7Ci0JaWYgKGFfY3RybC0+dmNtX2VuYWJsZSkgewotCQlyYyA9IGdwaW9fcmVxdWVzdChhX2N0cmwtPnZjbV9wd2QsICJtc21fYWN0dWF0b3IiKTsKLQkJaWYgKCFyYykgewotCQkJQ0RCRygiRW5hYmxlIFZDTSBQV0RcbiIpOwotCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGFfY3RybC0+dmNtX3B3ZCwgMSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1ERUZJTkVfTVVURVgobXNtX2FjdHVhdG9yX211dGV4KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG1zbV9hY3R1YXRvcl9pMmNfaWRbXSA9IHsKLQl7Im1zbV9hY3R1YXRvciIsIChrZXJuZWxfdWxvbmdfdCkmbXNtX2FjdHVhdG9yX3R9LAotCXsgfQotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1zbV9hY3R1YXRvcl9pMmNfZHJpdmVyID0gewotCS5pZF90YWJsZSA9IG1zbV9hY3R1YXRvcl9pMmNfaWQsCi0JLnByb2JlICA9IG1zbV9hY3R1YXRvcl9pMmNfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZXhpdF9wKG1zbV9hY3R1YXRvcl9pMmNfcmVtb3ZlKSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc21fYWN0dWF0b3IiLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fYWN0dWF0b3JfaTJjX2FkZF9kcml2ZXIoCi0Jdm9pZCkKLXsKLQlDREJHKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIobXNtX2FjdHVhdG9yX3QuaTJjX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyBsb25nIG1zbV9hY3R1YXRvcl9zdWJkZXZfaW9jdGwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgbXNtX2FjdHVhdG9yX2N0cmxfdCAqYV9jdHJsID0gZ2V0X2FjdHJsKHNkKTsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVklESU9DX01TTV9BQ1RVQVRPUl9DRkc6Ci0JCXJldHVybiBtc21fYWN0dWF0b3JfY29uZmlnKGFfY3RybCwgYXJncCk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG1zbV9hY3R1YXRvcl9wb3dlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgb24pCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2FjdHVhdG9yX2N0cmxfdCAqYV9jdHJsID0gZ2V0X2FjdHJsKHNkKTsKLQltdXRleF9sb2NrKGFfY3RybC0+YWN0dWF0b3JfbXV0ZXgpOwotCWlmIChvbikKLQkJcmMgPSBtc21fYWN0dWF0b3JfcG93ZXJfdXAoYV9jdHJsKTsKLQllbHNlCi0JCXJjID0gbXNtX2FjdHVhdG9yX3Bvd2VyX2Rvd24oYV9jdHJsKTsKLQltdXRleF91bmxvY2soYV9jdHJsLT5hY3R1YXRvcl9tdXRleCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdHJ1Y3QgbXNtX2FjdHVhdG9yX2N0cmxfdCAqZ2V0X2FjdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG1zbV9hY3R1YXRvcl9jdHJsX3QsIHNkZXYpOwotfQotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIG1zbV9hY3R1YXRvcl9zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmlvY3RsID0gbXNtX2FjdHVhdG9yX3N1YmRldl9pb2N0bCwKLQkuc19wb3dlciA9IG1zbV9hY3R1YXRvcl9wb3dlciwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG1zbV9hY3R1YXRvcl9zdWJkZXZfb3BzID0gewotCS5jb3JlID0gJm1zbV9hY3R1YXRvcl9zdWJkZXZfY29yZV9vcHMsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9hY3R1YXRvcl9jdHJsX3QgbXNtX2FjdHVhdG9yX3QgPSB7Ci0JLmkyY19kcml2ZXIgPSAmbXNtX2FjdHVhdG9yX2kyY19kcml2ZXIsCi0JLmFjdF92NGwyX3N1YmRldl9vcHMgPSAmbXNtX2FjdHVhdG9yX3N1YmRldl9vcHMsCi0KLQkuY3Vycl9zdGVwX3BvcyA9IDAsCi0JLmN1cnJfcmVnaW9uX2luZGV4ID0gMCwKLQkuYWN0dWF0b3JfbXV0ZXggPSAmbXNtX2FjdHVhdG9yX211dGV4LAotCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9hY3R1YXRvciBtc21fdmNtX2FjdHVhdG9yX3RhYmxlID0gewotCS5hY3RfdHlwZSA9IEFDVFVBVE9SX1ZDTSwKLQkuZnVuY190YmwgPSB7Ci0JCS5hY3R1YXRvcl9pbml0X3N0ZXBfdGFibGUgPSBtc21fYWN0dWF0b3JfaW5pdF9zdGVwX3RhYmxlLAotCQkuYWN0dWF0b3JfbW92ZV9mb2N1cyA9IG1zbV9hY3R1YXRvcl9tb3ZlX2ZvY3VzLAotCQkuYWN0dWF0b3Jfd3JpdGVfZm9jdXMgPSBtc21fYWN0dWF0b3Jfd3JpdGVfZm9jdXMsCi0JCS5hY3R1YXRvcl9zZXRfZGVmYXVsdF9mb2N1cyA9IG1zbV9hY3R1YXRvcl9zZXRfZGVmYXVsdF9mb2N1cywKLQkJLmFjdHVhdG9yX2luaXRfZm9jdXMgPSBtc21fYWN0dWF0b3JfaW5pdF9mb2N1cywKLQkJLmFjdHVhdG9yX3BhcnNlX2kyY19wYXJhbXMgPSBtc21fYWN0dWF0b3JfcGFyc2VfaTJjX3BhcmFtcywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fYWN0dWF0b3IgbXNtX3BpZXpvX2FjdHVhdG9yX3RhYmxlID0gewotCS5hY3RfdHlwZSA9IEFDVFVBVE9SX1BJRVpPLAotCS5mdW5jX3RibCA9IHsKLQkJLmFjdHVhdG9yX2luaXRfc3RlcF90YWJsZSA9IE5VTEwsCi0JCS5hY3R1YXRvcl9tb3ZlX2ZvY3VzID0gbXNtX2FjdHVhdG9yX3BpZXpvX21vdmVfZm9jdXMsCi0JCS5hY3R1YXRvcl93cml0ZV9mb2N1cyA9IE5VTEwsCi0JCS5hY3R1YXRvcl9zZXRfZGVmYXVsdF9mb2N1cyA9Ci0JCQltc21fYWN0dWF0b3JfcGllem9fc2V0X2RlZmF1bHRfZm9jdXMsCi0JCS5hY3R1YXRvcl9pbml0X2ZvY3VzID0gbXNtX2FjdHVhdG9yX2luaXRfZm9jdXMsCi0JCS5hY3R1YXRvcl9wYXJzZV9pMmNfcGFyYW1zID0gbXNtX2FjdHVhdG9yX3BhcnNlX2kyY19wYXJhbXMsCi0JfSwKLX07Ci0KLXN1YnN5c19pbml0Y2FsbChtc21fYWN0dWF0b3JfaTJjX2FkZF9kcml2ZXIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gQUNUVUFUT1IiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9hY3R1YXRvcnMvbXNtX2FjdHVhdG9yLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvYWN0dWF0b3JzL21zbV9hY3R1YXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWI3MWE2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9hY3R1YXRvcnMvbXNtX2FjdHVhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBNU01fQUNUVUFUT1JfSAotI2RlZmluZSBNU01fQUNUVUFUT1JfSAotCi0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9jYW1lcmEuaD4KLSNpbmNsdWRlICJtc21fY2FtZXJhX2kyYy5oIgotCi0jaWZkZWYgTEVSUk9SCi0jdW5kZWYgTEVSUk9SCi0jZW5kaWYKLQotI2lmZGVmIExJTkZPCi0jdW5kZWYgTElORk8KLSNlbmRpZgotCi0jZGVmaW5lIExFUlJPUihmbXQsIGFyZ3MuLi4pIHByX2VycihmbXQsICMjYXJncykKLQotI2RlZmluZSBDT05GSUdfTVNNX0NBTUVSQV9BQ1RfREJHIDAKLQotI2lmIENPTkZJR19NU01fQ0FNRVJBX0FDVF9EQkcKLSNkZWZpbmUgTElORk8oZm10LCBhcmdzLi4uKSBwcmludGsoZm10LCAjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBMSU5GTyhmbXQsIGFyZ3MuLi4pIENEQkcoZm10LCAjI2FyZ3MpCi0jZW5kaWYKLQotc3RydWN0IG1zbV9hY3R1YXRvcl9jdHJsX3Q7Ci0KLXN0cnVjdCBtc21fYWN0dWF0b3JfZnVuY190YmwgewotCWludDMyX3QgKCphY3R1YXRvcl9pMmNfd3JpdGVfYl9hZikoc3RydWN0IG1zbV9hY3R1YXRvcl9jdHJsX3QgKiwKLQkJCXVpbnQ4X3QsCi0JCQl1aW50OF90KTsKLQlpbnQzMl90ICgqYWN0dWF0b3JfaW5pdF9zdGVwX3RhYmxlKShzdHJ1Y3QgbXNtX2FjdHVhdG9yX2N0cmxfdCAqLAotCQlzdHJ1Y3QgbXNtX2FjdHVhdG9yX3NldF9pbmZvX3QgKik7Ci0JaW50MzJfdCAoKmFjdHVhdG9yX2luaXRfZm9jdXMpKHN0cnVjdCBtc21fYWN0dWF0b3JfY3RybF90ICosCi0JCXVpbnQxNl90LCBlbnVtIG1zbV9hY3R1YXRvcl9kYXRhX3R5cGUsIHN0cnVjdCByZWdfc2V0dGluZ3NfdCAqKTsKLQlpbnQzMl90ICgqYWN0dWF0b3Jfc2V0X2RlZmF1bHRfZm9jdXMpIChzdHJ1Y3QgbXNtX2FjdHVhdG9yX2N0cmxfdCAqLAotCQkJc3RydWN0IG1zbV9hY3R1YXRvcl9tb3ZlX3BhcmFtc190ICopOwotCWludDMyX3QgKCphY3R1YXRvcl9tb3ZlX2ZvY3VzKSAoc3RydWN0IG1zbV9hY3R1YXRvcl9jdHJsX3QgKiwKLQkJCXN0cnVjdCBtc21fYWN0dWF0b3JfbW92ZV9wYXJhbXNfdCAqKTsKLQlpbnQzMl90ICgqYWN0dWF0b3JfcGFyc2VfaTJjX3BhcmFtcykoc3RydWN0IG1zbV9hY3R1YXRvcl9jdHJsX3QgKiwKLQkJCWludDE2X3QsIHVpbnQzMl90LCB1aW50MTZfdCk7Ci0JaW50MzJfdCAoKmFjdHVhdG9yX3dyaXRlX2ZvY3VzKShzdHJ1Y3QgbXNtX2FjdHVhdG9yX2N0cmxfdCAqLAotCQkJdWludDE2X3QsCi0JCQlzdHJ1Y3QgZGFtcGluZ19wYXJhbXNfdCAqLAotCQkJaW50OF90LAotCQkJaW50MTZfdCk7Ci19OwotCi1zdHJ1Y3QgbXNtX2FjdHVhdG9yIHsKLQllbnVtIGFjdHVhdG9yX3R5cGUgYWN0X3R5cGU7Ci0Jc3RydWN0IG1zbV9hY3R1YXRvcl9mdW5jX3RibCBmdW5jX3RibDsKLX07Ci0KLXN0cnVjdCBtc21fYWN0dWF0b3JfY3RybF90IHsKLQlzdHJ1Y3QgaTJjX2RyaXZlciAqaTJjX2RyaXZlcjsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50IGkyY19jbGllbnQ7Ci0Jc3RydWN0IG11dGV4ICphY3R1YXRvcl9tdXRleDsKLQlzdHJ1Y3QgbXNtX2FjdHVhdG9yX2Z1bmNfdGJsICpmdW5jX3RibDsKLQllbnVtIG1zbV9hY3R1YXRvcl9kYXRhX3R5cGUgaTJjX2RhdGFfdHlwZTsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgc2RldjsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzICphY3RfdjRsMl9zdWJkZXZfb3BzOwotCi0JaW50MTZfdCBjdXJyX3N0ZXBfcG9zOwotCXVpbnQxNl90IGN1cnJfcmVnaW9uX2luZGV4OwotCXVpbnQxNl90ICpzdGVwX3Bvc2l0aW9uX3RhYmxlOwotCXN0cnVjdCByZWdpb25fcGFyYW1zX3QgcmVnaW9uX3BhcmFtc1tNQVhfQUNUVUFUT1JfUkVHSU9OXTsKLQl1aW50MTZfdCByZWdfdGJsX3NpemU7Ci0Jc3RydWN0IG1zbV9hY3R1YXRvcl9yZWdfcGFyYW1zX3QgcmVnX3RibFtNQVhfQUNUVUFUT1JfUkVHX1RCTF9TSVpFXTsKLQl1aW50MTZfdCByZWdpb25fc2l6ZTsKLQl2b2lkICp1c2VyX2RhdGE7Ci0JdWludDMyX3QgdmNtX3B3ZDsKLQl1aW50MzJfdCB2Y21fZW5hYmxlOwotCXVpbnQzMl90IHRvdGFsX3N0ZXBzOwotCXVpbnQxNl90IHB3ZF9zdGVwOwotCXVpbnQxNl90IGluaXRpYWxfY29kZTsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX3RibCAqaTJjX3JlZ190Ymw7Ci0JdWludDE2X3QgaTJjX3RibF9pbmRleDsKLX07Ci0KLXN0cnVjdCBtc21fYWN0dWF0b3JfY3RybF90ICpnZXRfYWN0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCk7Ci0KLSNkZWZpbmUgVklESU9DX01TTV9BQ1RVQVRPUl9DRkcgXAotCV9JT1dSKCdWJywgQkFTRV9WSURJT0NfUFJJVkFURSArIDExLCB2b2lkIF9fdXNlciAqKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jY2kvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY2NpL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjIzZjZjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jY2kvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUdDQ19WRVJTSU9OICAgICAgOj0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChQV0QpL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2ggJChDUk9TU19DT01QSUxFKWdjYykKLWNjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZXJ2ZXIKLW9iai0kKENPTkZJR19NU01fQ0NJKSArPSBtc21fY2NpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jY2kvbXNtX2NhbV9jY2lfaHdyZWcuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jY2kvbXNtX2NhbV9jY2lfaHdyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI2MmViNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY2NpL21zbV9jYW1fY2NpX2h3cmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX01TTV9DQU1fQ0NJX0hXUkVHX18KLSNkZWZpbmUgX19NU01fQ0FNX0NDSV9IV1JFR19fCi0KLSNkZWZpbmUgQ0NJX0hXX1ZFUlNJT05fQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBDQ0lfUkVTRVRfQ01EX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIENDSV9SRVNFVF9DTURfUk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2Y3M2YzZjcKLSNkZWZpbmUgQ0NJX00wX1JFU0VUX1JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNGMQotI2RlZmluZSBDQ0lfTTFfUkVTRVRfUk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNGMDAxCi0jZGVmaW5lIENDSV9RVUVVRV9TVEFSVF9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgQ0NJX1NFVF9DSURfU1lOQ19USU1FUl8wX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBDQ0lfSTJDX00wX1NDTF9DVExfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIENDSV9JMkNfTTBfU0RBX0NUTF8wX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDQKLSNkZWZpbmUgQ0NJX0kyQ19NMF9TREFfQ1RMXzFfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwOAotI2RlZmluZSBDQ0lfSTJDX00wX1NEQV9DVExfMl9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTBjCi0jZGVmaW5lIENDSV9JMkNfTTBfUkVBRF9EQVRBX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTgKLSNkZWZpbmUgQ0NJX0kyQ19NMF9NSVNDX0NUTF9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMAotI2RlZmluZSBDQ0lfSTJDX00wX1JFQURfQlVGX0xFVkVMX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFDCi0jZGVmaW5lIENDSV9IQUxUX1JFUV9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzQKLSNkZWZpbmUgQ0NJX00wX0hBTFRfUkVRX1JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQotI2RlZmluZSBDQ0lfTTFfSEFMVF9SRVFfUk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIENDSV9IQUxUX1JFUV9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzQKLSNkZWZpbmUgQ0NJX0kyQ19NMV9TQ0xfQ1RMX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBDQ0lfSTJDX00xX1NEQV9DVExfMF9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjA0Ci0jZGVmaW5lIENDSV9JMkNfTTFfU0RBX0NUTF8xX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDgKLSNkZWZpbmUgQ0NJX0kyQ19NMV9TREFfQ1RMXzJfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwYwotI2RlZmluZSBDQ0lfSTJDX00xX01JU0NfQ1RMX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjEwCi0jZGVmaW5lIENDSV9JMkNfTTBfUTBfQ1VSX1dPUkRfQ05UX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDQKLSNkZWZpbmUgQ0NJX0kyQ19NMF9RMF9DVVJfQ01EX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwOAotI2RlZmluZSBDQ0lfSTJDX00wX1EwX0VYRUNfV09SRF9DTlRfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzAwCi0jZGVmaW5lIENDSV9JMkNfTTBfUTBfTE9BRF9EQVRBX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMTAKLSNkZWZpbmUgQ0NJX0lSUV9NQVNLXzBfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMGMwNAotI2RlZmluZSBDQ0lfSVJRX0NMRUFSXzBfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwYzA4Ci0jZGVmaW5lIENDSV9JUlFfU1RBVFVTXzBfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDBjMGMKLSNkZWZpbmUgQ0NJX0lSUV9TVEFUVVNfMF9JMkNfTTFfUTFfTkFDS19FUlJfQk1TSyAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBDQ0lfSVJRX1NUQVRVU18wX0kyQ19NMV9RMF9OQUNLX0VSUl9CTVNLICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIENDSV9JUlFfU1RBVFVTXzBfSTJDX00wX1ExX05BQ0tfRVJSX0JNU0sgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKLSNkZWZpbmUgQ0NJX0lSUV9TVEFUVVNfMF9JMkNfTTBfUTBfTkFDS19FUlJfQk1TSyAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMAotI2RlZmluZSBDQ0lfSVJRX1NUQVRVU18wX0kyQ19NMV9RMFExX0hBTFRfQUNLX0JNU0sgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwCi0jZGVmaW5lIENDSV9JUlFfU1RBVFVTXzBfSTJDX00wX1EwUTFfSEFMVF9BQ0tfQk1TSyAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAKLSNkZWZpbmUgQ0NJX0lSUV9TVEFUVVNfMF9SU1RfRE9ORV9BQ0tfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMAotI2RlZmluZSBDQ0lfSVJRX1NUQVRVU18wX0kyQ19NMV9RMV9SRVBPUlRfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwCi0jZGVmaW5lIENDSV9JUlFfU1RBVFVTXzBfSTJDX00xX1EwX1JFUE9SVF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAKLSNkZWZpbmUgQ0NJX0lSUV9TVEFUVVNfMF9JMkNfTTFfUkRfRE9ORV9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAotI2RlZmluZSBDQ0lfSVJRX1NUQVRVU18wX0kyQ19NMF9RMV9SRVBPUlRfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwCi0jZGVmaW5lIENDSV9JUlFfU1RBVFVTXzBfSTJDX00wX1EwX1JFUE9SVF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgQ0NJX0lSUV9TVEFUVVNfMF9JMkNfTTBfUkRfRE9ORV9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQotI2RlZmluZSBDQ0lfSVJRX0dMT0JBTF9DTEVBUl9DTURfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwYzAwCi0jZW5kaWYgLyogX19NU01fQ0FNX0NDSV9IV1JFR19fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY2NpL21zbV9jY2kuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jY2kvbXNtX2NjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGE1ODk3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jY2kvbXNtX2NjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzY5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2lzcC5oPgotI2luY2x1ZGUgIm1zbV9jY2kuaCIKLSNpbmNsdWRlICJtc20uaCIKLSNpbmNsdWRlICJtc21fY2FtX3NlcnZlci5oIgotI2luY2x1ZGUgIm1zbV9jYW1fY2NpX2h3cmVnLmgiCi0KLSNkZWZpbmUgVjRMMl9JREVOVF9DQ0kgNTAwMDUKLSNkZWZpbmUgQ0NJX0kyQ19RVUVVRV8wX1NJWkUgNjQKLSNkZWZpbmUgQ0NJX0kyQ19RVUVVRV8xX1NJWkUgMTYKLQotI2RlZmluZSBDQ0lfVElNRU9VVCBtc2Vjc190b19qaWZmaWVzKDEwMCkKLQotc3RhdGljIHZvaWQgbXNtX2NjaV9zZXRfY2xrX3BhcmFtKHN0cnVjdCBjY2lfZGV2aWNlICpjY2lfZGV2KQotewotCXVpbnQxNl90IFRISUdIID0gNzg7Ci0JdWludDE2X3QgVExPVyA9IDExNDsKLQl1aW50MTZfdCBUU1VTVE8gPSAyODsKLQl1aW50MTZfdCBUU1VTVEEgPSAyODsKLQl1aW50MTZfdCBUSEREQVQgPSAxMDsKLQl1aW50MTZfdCBUSERTVEEgPSA3NzsKLQl1aW50MTZfdCBUQlVGID0gMTE4OwotCXVpbnQ4X3QgSFdfU0NMX1NUUkVUQ0hfRU4gPSAwOyAvKmVuYWJsZSBvciBkaXNhYmxlIFNDTCBjbG9jawotCQkJCQkqIHN0cmV0Y2hpbmcgKi8KLQl1aW50OF90IEhXX1JESExEID0gNjsgLyogaW50ZXJuYWwgaG9sZCB0aW1lIDEtNiBjeWNsZXMgb2YgU0RBIHRvIGJyaWRnZQotCQkJICAgICAgICogdW5kZWZpbmVkIGZhbGxpbmcgU0NMIHJlZ2lvbiAqLwotCXVpbnQ4X3QgSFdfVFNQID0gMTsgLyogZ2xpdGNoIGZpbHRlciAxLTMgY3ljbGVzICovCi0KLQltc21fY2FtZXJhX2lvX3coVEhJR0ggPDwgMTYgfCBUTE9XLCBjY2lfZGV2LT5iYXNlICsKLQkJQ0NJX0kyQ19NMF9TQ0xfQ1RMX0FERFIpOwotCW1zbV9jYW1lcmFfaW9fdyhUU1VTVE8gPDwgMTYgfCBUU1VTVEEsIGNjaV9kZXYtPmJhc2UgKwotCQlDQ0lfSTJDX00wX1NEQV9DVExfMF9BRERSKTsKLQltc21fY2FtZXJhX2lvX3coVEhEREFUIDw8IDE2IHwgVEhEU1RBLCBjY2lfZGV2LT5iYXNlICsKLQkJQ0NJX0kyQ19NMF9TREFfQ1RMXzFfQUREUik7Ci0JbXNtX2NhbWVyYV9pb193KFRCVUYsIGNjaV9kZXYtPmJhc2UgKwotCQlDQ0lfSTJDX00wX1NEQV9DVExfMl9BRERSKTsKLQltc21fY2FtZXJhX2lvX3coSFdfU0NMX1NUUkVUQ0hfRU4gPDwgOCB8IEhXX1JESExEIDw8IDQgfCBIV19UU1AsCi0JCWNjaV9kZXYtPmJhc2UgKyBDQ0lfSTJDX00wX01JU0NfQ1RMX0FERFIpOwotCW1zbV9jYW1lcmFfaW9fdyhUSElHSCA8PCAxNiB8IFRMT1csIGNjaV9kZXYtPmJhc2UgKwotCQlDQ0lfSTJDX00xX1NDTF9DVExfQUREUik7Ci0JbXNtX2NhbWVyYV9pb193KFRTVVNUTyA8PCAxNiB8IFRTVVNUQSwgY2NpX2Rldi0+YmFzZSArCi0JCUNDSV9JMkNfTTFfU0RBX0NUTF8wX0FERFIpOwotCW1zbV9jYW1lcmFfaW9fdyhUSEREQVQgPDwgMTYgfCBUSERTVEEsIGNjaV9kZXYtPmJhc2UgKwotCQlDQ0lfSTJDX00xX1NEQV9DVExfMV9BRERSKTsKLQltc21fY2FtZXJhX2lvX3coVEJVRiwgY2NpX2Rldi0+YmFzZSArIENDSV9JMkNfTTFfU0RBX0NUTF8yX0FERFIpOwotCW1zbV9jYW1lcmFfaW9fdyhIV19TQ0xfU1RSRVRDSF9FTiA8PCA4IHwgSFdfUkRITEQgPDwgNCB8IEhXX1RTUCwKLQkJY2NpX2Rldi0+YmFzZSArIENDSV9JMkNfTTFfTUlTQ19DVExfQUREUik7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG1zbV9jY2lfaTJjX2NvbmZpZ19zeW5jX3RpbWVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0Jc3RydWN0IG1zbV9jYW1lcmFfY2NpX2N0cmwgKmNfY3RybCkKLXsKLQlzdHJ1Y3QgY2NpX2RldmljZSAqY2NpX2RldjsKLQljY2lfZGV2ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0JbXNtX2NhbWVyYV9pb193KGNfY3RybC0+Y2NpX2luZm8tPmNpZCwgY2NpX2Rldi0+YmFzZSArCi0JCUNDSV9TRVRfQ0lEX1NZTkNfVElNRVJfMF9BRERSICsgKGNfY3RybC0+Y2NpX2luZm8tPmNpZCAqIDB4NCkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCBtc21fY2NpX2kyY19zZXRfZnJlcShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXN0cnVjdCBtc21fY2FtZXJhX2NjaV9jdHJsICpjX2N0cmwpCi17Ci0Jc3RydWN0IGNjaV9kZXZpY2UgKmNjaV9kZXY7Ci0JdWludDMyX3QgdmFsOwotCWNjaV9kZXYgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQl2YWwgPSBjX2N0cmwtPmNjaV9pbmZvLT5mcmVxOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNjaV9kZXYtPmJhc2UgKyBDQ0lfSTJDX00wX1NDTF9DVExfQUREUiArCi0JCWNfY3RybC0+Y2NpX2luZm8tPmNjaV9pMmNfbWFzdGVyKjB4MTAwKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjY2lfZGV2LT5iYXNlICsgQ0NJX0kyQ19NMF9TREFfQ1RMXzBfQUREUiArCi0JCWNfY3RybC0+Y2NpX2luZm8tPmNjaV9pMmNfbWFzdGVyKjB4MTAwKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjY2lfZGV2LT5iYXNlICsgQ0NJX0kyQ19NMF9TREFfQ1RMXzFfQUREUiArCi0JCWNfY3RybC0+Y2NpX2luZm8tPmNjaV9pMmNfbWFzdGVyKjB4MTAwKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjY2lfZGV2LT5iYXNlICsgQ0NJX0kyQ19NMF9TREFfQ1RMXzJfQUREUiArCi0JCWNfY3RybC0+Y2NpX2luZm8tPmNjaV9pMmNfbWFzdGVyKjB4MTAwKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjY2lfZGV2LT5iYXNlICsgQ0NJX0kyQ19NMF9NSVNDX0NUTF9BRERSICsKLQkJY19jdHJsLT5jY2lfaW5mby0+Y2NpX2kyY19tYXN0ZXIqMHgxMDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCBtc21fY2NpX3ZhbGlkYXRlX3F1ZXVlKHN0cnVjdCBjY2lfZGV2aWNlICpjY2lfZGV2LAotCXVpbnQzMl90IGxlbiwKLQllbnVtIGNjaV9pMmNfbWFzdGVyX3QgbWFzdGVyLAotCWVudW0gY2NpX2kyY19xdWV1ZV90IHF1ZXVlKQotewotCWludDMyX3QgcmMgPSAwOwotCXVpbnQzMl90IHJlYWRfdmFsID0gMDsKLQl1aW50MzJfdCByZWdfb2Zmc2V0ID0gbWFzdGVyICogMHgyMDAgKyBxdWV1ZSAqIDB4MTAwOwotCXJlYWRfdmFsID0gbXNtX2NhbWVyYV9pb19yKGNjaV9kZXYtPmJhc2UgKwotCQlDQ0lfSTJDX00wX1EwX0NVUl9XT1JEX0NOVF9BRERSICsgcmVnX29mZnNldCk7Ci0JQ0RCRygiJXMgbGluZSAlZCBDQ0lfSTJDX00wX1EwX0NVUl9XT1JEX0NOVF9BRERSICVkIGxlbiAlZCBtYXggJWRcbiIsCi0JCV9fZnVuY19fLCBfX0xJTkVfXywgcmVhZF92YWwsIGxlbiwKLQkJY2NpX2Rldi0+Y2NpX2kyY19xdWV1ZV9pbmZvW21hc3Rlcl1bcXVldWVdLm1heF9xdWV1ZV9zaXplKTsKLQlpZiAoKHJlYWRfdmFsICsgbGVuICsgMSkgPiBjY2lfZGV2LT4KLQkJY2NpX2kyY19xdWV1ZV9pbmZvW21hc3Rlcl1bcXVldWVdLm1heF9xdWV1ZV9zaXplKSB7Ci0JCXVpbnQzMl90IHJlZ192YWwgPSAwOwotCQl1aW50MzJfdCByZXBvcnRfdmFsID0gQ0NJX0kyQ19SRVBPUlRfQ01EIHwgKDEgPDwgOCk7Ci0JCUNEQkcoIiVzOiVkIENDSV9JMkNfUkVQT1JUX0NNRFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJbXNtX2NhbWVyYV9pb193KHJlcG9ydF92YWwsCi0JCQljY2lfZGV2LT5iYXNlICsgQ0NJX0kyQ19NMF9RMF9MT0FEX0RBVEFfQUREUiArCi0JCQlyZWdfb2Zmc2V0KTsKLQkJcmVhZF92YWwrKzsKLQkJQ0RCRygiJXM6JWQgQ0NJX0kyQ19NMF9RMF9FWEVDX1dPUkRfQ05UX0FERFIgJWRcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlYWRfdmFsKTsKLQkJbXNtX2NhbWVyYV9pb193KHJlYWRfdmFsLCBjY2lfZGV2LT5iYXNlICsKLQkJCUNDSV9JMkNfTTBfUTBfRVhFQ19XT1JEX0NOVF9BRERSICsgcmVnX29mZnNldCk7Ci0JCXJlZ192YWwgPSAxIDw8ICgobWFzdGVyICogMikgKyBxdWV1ZSk7Ci0JCUNEQkcoIiVzOiVkIENDSV9RVUVVRV9TVEFSVF9BRERSXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQltc21fY2FtZXJhX2lvX3cocmVnX3ZhbCwgY2NpX2Rldi0+YmFzZSArIENDSV9RVUVVRV9TVEFSVF9BRERSKTsKLQkJQ0RCRygiJXMgbGluZSAlZCB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQl3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmY2NpX2Rldi0+Ci0JCQljY2lfbWFzdGVyX2luZm9bbWFzdGVyXS5yZXNldF9jb21wbGV0ZSwgQ0NJX1RJTUVPVVQpOwotCi0JCXJjID0gY2NpX2Rldi0+Y2NpX21hc3Rlcl9pbmZvW21hc3Rlcl0uc3RhdHVzOwotCQlpZiAocmMgPCAwKQotCQkJcHJfZXJyKCIlcyBmYWlsZWQgcmMgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXNtX2NjaV9kYXRhX3F1ZXVlKHN0cnVjdCBjY2lfZGV2aWNlICpjY2lfZGV2LAotCXN0cnVjdCBtc21fY2FtZXJhX2NjaV9jdHJsICpjX2N0cmwsIGVudW0gY2NpX2kyY19xdWV1ZV90IHF1ZXVlKQotewotCXVpbnQxNl90IGkgPSAwLCBqID0gMCwgayA9IDAsIGggPSAwLCBsZW4gPSAwOwotCXVpbnQzMl90IGNtZCA9IDA7Ci0JdWludDhfdCBkYXRhWzEwXTsKLQl1aW50MTZfdCByZWdfYWRkciA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfY2NpX2kyY193cml0ZV9jZmcgKmkyY19tc2cgPQotCQkmY19jdHJsLT5jZmcuY2NpX2kyY193cml0ZV9jZmc7Ci0JdWludDE2X3QgY21kX3NpemUgPSBpMmNfbXNnLT5zaXplOwotCXN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiAqaTJjX2NtZCA9IGkyY19tc2ctPnJlZ19jb25mX3RibDsKLQllbnVtIGNjaV9pMmNfbWFzdGVyX3QgbWFzdGVyID0gY19jdHJsLT5jY2lfaW5mby0+Y2NpX2kyY19tYXN0ZXI7Ci0JQ0RCRygiJXMgYWRkciB0eXBlICVkIGRhdGEgdHlwZSAlZFxuIiwgX19mdW5jX18sCi0JCWkyY19tc2ctPmFkZHJfdHlwZSwgaTJjX21zZy0+ZGF0YV90eXBlKTsKLQkvKiBhc3N1bWUgdG90YWwgc2l6ZSB3aXRoaW4gdGhlIG1heCBxdWV1ZSAqLwotCXdoaWxlIChjbWRfc2l6ZSkgewotCQlDREJHKCIlcyBjbWRfc2l6ZSAlZCBhZGRyIDB4JXggZGF0YSAweCV4IiwgX19mdW5jX18sCi0JCQljbWRfc2l6ZSwgaTJjX2NtZC0+cmVnX2FkZHIsIGkyY19jbWQtPnJlZ19kYXRhKTsKLQkJZGF0YVtpKytdID0gQ0NJX0kyQ19XUklURV9DTUQ7Ci0JCWlmIChpMmNfY21kLT5yZWdfYWRkcikKLQkJCXJlZ19hZGRyID0gaTJjX2NtZC0+cmVnX2FkZHI7Ci0JCS8qIGVpdGhlciBieXRlIG9yIHdvcmQgYWRkciAqLwotCQlpZiAoaTJjX21zZy0+YWRkcl90eXBlID09IE1TTV9DQU1FUkFfSTJDX0JZVEVfQUREUikKLQkJCWRhdGFbaSsrXSA9IHJlZ19hZGRyOwotCQllbHNlIHsKLQkJCWRhdGFbaSsrXSA9IChyZWdfYWRkciAmIDB4RkYwMCkgPj4gODsKLQkJCWRhdGFbaSsrXSA9IHJlZ19hZGRyICYgMHgwMEZGOwotCQl9Ci0JCS8qIG1heCBvZiAxMCBkYXRhIGJ5dGVzICovCi0JCWRvIHsKLQkJCWlmIChpMmNfbXNnLT5kYXRhX3R5cGUgPT0gTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKSB7Ci0JCQkJZGF0YVtpKytdID0gaTJjX2NtZC0+cmVnX2RhdGE7Ci0JCQkJcmVnX2FkZHIrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKChpICsgMSkgPD0gMTApIHsKLQkJCQkJZGF0YVtpKytdID0gKGkyY19jbWQtPnJlZ19kYXRhICYKLQkJCQkJCTB4RkYwMCkgPj4gODsgLyogTVNCICovCi0JCQkJCWRhdGFbaSsrXSA9IGkyY19jbWQtPnJlZ19kYXRhICYKLQkJCQkJCTB4MDBGRjsgLyogTFNCICovCi0JCQkJCXJlZ19hZGRyICs9IDI7Ci0JCQkJfSBlbHNlCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaTJjX2NtZCsrOwotCQl9IHdoaWxlICgtLWNtZF9zaXplICYmICFpMmNfY21kLT5yZWdfYWRkciAmJiAoaSA8PSAxMCkpOwotCQlkYXRhWzBdIHw9ICgoaS0xKSA8PCA0KTsKLQkJbGVuID0gKChpLTEpLzQpICsgMTsKLQkJbXNtX2NjaV92YWxpZGF0ZV9xdWV1ZShjY2lfZGV2LCBsZW4sIG1hc3RlciwgcXVldWUpOwotCQlmb3IgKGggPSAwLCBrID0gMDsgaCA8IGxlbjsgaCsrKSB7Ci0JCQljbWQgPSAwOwotCQkJZm9yIChqID0gMDsgKGogPCA0ICYmIGsgPCBpKTsgaisrKQotCQkJCWNtZCB8PSAoZGF0YVtrKytdIDw8IChqICogOCkpOwotCQkJQ0RCRygiJXMgQ0NJX0kyQ19NMF9RMF9MT0FEX0RBVEFfQUREUiAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBjbWQpOwotCQkJbXNtX2NhbWVyYV9pb193KGNtZCwgY2NpX2Rldi0+YmFzZSArCi0JCQkJQ0NJX0kyQ19NMF9RMF9MT0FEX0RBVEFfQUREUiArCi0JCQkJbWFzdGVyICogMHgyMDAgKyBxdWV1ZSAqIDB4MTAwKTsKLQkJfQotCQlpID0gMDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG1zbV9jY2lfd3JpdGVfaTJjX3F1ZXVlKHN0cnVjdCBjY2lfZGV2aWNlICpjY2lfZGV2LAotCXVpbnQzMl90IHZhbCwKLQllbnVtIGNjaV9pMmNfbWFzdGVyX3QgbWFzdGVyLAotCWVudW0gY2NpX2kyY19xdWV1ZV90IHF1ZXVlKQotewotCWludDMyX3QgcmMgPSAwOwotCXVpbnQzMl90IHJlZ19vZmZzZXQgPSBtYXN0ZXIgKiAweDIwMCArIHF1ZXVlICogMHgxMDA7Ci0JQ0RCRygiJXM6JWQgY2FsbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCW1zbV9jY2lfdmFsaWRhdGVfcXVldWUoY2NpX2RldiwgMSwgbWFzdGVyLCBxdWV1ZSk7Ci0JQ0RCRygiJXMgQ0NJX0kyQ19NMF9RMF9MT0FEX0RBVEFfQUREUjp2YWwgJXg6JXhcbiIsCi0JCV9fZnVuY19fLCBDQ0lfSTJDX00wX1EwX0xPQURfREFUQV9BRERSICsKLQkJcmVnX29mZnNldCwgdmFsKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjY2lfZGV2LT5iYXNlICsgQ0NJX0kyQ19NMF9RMF9MT0FEX0RBVEFfQUREUiArCi0JCXJlZ19vZmZzZXQpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXNtX2NjaV9pMmNfcmVhZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXN0cnVjdCBtc21fY2FtZXJhX2NjaV9jdHJsICpjX2N0cmwpCi17Ci0JdWludDMyX3QgcmMgPSAwOwotCXVpbnQzMl90IHZhbCA9IDA7Ci0JaW50MzJfdCByZWFkX3dvcmRzID0gMCwgZXhwX3dvcmRzID0gMDsKLQlpbnQzMl90IGluZGV4ID0gMCwgZmlyc3RfYnl0ZSA9IDA7Ci0JdWludDMyX3QgaSA9IDA7Ci0JZW51bSBjY2lfaTJjX21hc3Rlcl90IG1hc3RlcjsKLQllbnVtIGNjaV9pMmNfcXVldWVfdCBxdWV1ZSA9IFFVRVVFXzE7Ci0Jc3RydWN0IGNjaV9kZXZpY2UgKmNjaV9kZXYgPSBOVUxMOwotCXN0cnVjdCBtc21fY2FtZXJhX2NjaV9pMmNfcmVhZF9jZmcgKnJlYWRfY2ZnID0gTlVMTDsKLQlDREJHKCIlcyBsaW5lICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCWNjaV9kZXYgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQltYXN0ZXIgPSBjX2N0cmwtPmNjaV9pbmZvLT5jY2lfaTJjX21hc3RlcjsKLQlyZWFkX2NmZyA9ICZjX2N0cmwtPmNmZy5jY2lfaTJjX3JlYWRfY2ZnOwotCW11dGV4X2xvY2soJmNjaV9kZXYtPmNjaV9tYXN0ZXJfaW5mb1ttYXN0ZXJdLm11dGV4KTsKLQlDREJHKCIlcyBtYXN0ZXIgJWQsIHF1ZXVlICVkXG4iLCBfX2Z1bmNfXywgbWFzdGVyLCBxdWV1ZSk7Ci0JQ0RCRygiJXMgc2V0IHBhcmFtIHNpZCAweCV4IHJldHJpZXMgJWQgaWRfbWFwICVkXG4iLCBfX2Z1bmNfXywKLQkJY19jdHJsLT5jY2lfaW5mby0+c2lkLCBjX2N0cmwtPmNjaV9pbmZvLT5yZXRyaWVzLAotCQljX2N0cmwtPmNjaV9pbmZvLT5pZF9tYXApOwotCXZhbCA9IENDSV9JMkNfU0VUX1BBUkFNX0NNRCB8IGNfY3RybC0+Y2NpX2luZm8tPnNpZCA8PCA0IHwKLQkJY19jdHJsLT5jY2lfaW5mby0+cmV0cmllcyA8PCAxNiB8Ci0JCWNfY3RybC0+Y2NpX2luZm8tPmlkX21hcCA8PCAxODsKLQlyYyA9IG1zbV9jY2lfd3JpdGVfaTJjX3F1ZXVlKGNjaV9kZXYsIHZhbCwgbWFzdGVyLCBxdWV1ZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCIlcyBmYWlsZWQgbGluZSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJZ290byBFUlJPUjsKLQl9Ci0KLQl2YWwgPSBDQ0lfSTJDX0xPQ0tfQ01EOwotCXJjID0gbXNtX2NjaV93cml0ZV9pMmNfcXVldWUoY2NpX2RldiwgdmFsLCBtYXN0ZXIsIHF1ZXVlKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIiVzIGZhaWxlZCBsaW5lICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlnb3RvIEVSUk9SOwotCX0KLQotCWlmIChyZWFkX2NmZy0+YWRkcl90eXBlID09IE1TTV9DQU1FUkFfSTJDX0JZVEVfQUREUikKLQkJdmFsID0gQ0NJX0kyQ19XUklURV9DTUQgfCAocmVhZF9jZmctPmFkZHJfdHlwZSA8PCA0KSB8Ci0JCQkoKHJlYWRfY2ZnLT5hZGRyICYgMHhGRikgPDwgOCk7Ci0JaWYgKHJlYWRfY2ZnLT5hZGRyX3R5cGUgPT0gTVNNX0NBTUVSQV9JMkNfV09SRF9BRERSKQotCQl2YWwgPSBDQ0lfSTJDX1dSSVRFX0NNRCB8IChyZWFkX2NmZy0+YWRkcl90eXBlIDw8IDQpIHwKLQkJCSgoKHJlYWRfY2ZnLT5hZGRyICYgMHhGRjAwKSA+PiA4KSA8PCA4KSB8Ci0JCQkoKHJlYWRfY2ZnLT5hZGRyICYgMHhGRikgPDwgMTYpOwotCXJjID0gbXNtX2NjaV93cml0ZV9pMmNfcXVldWUoY2NpX2RldiwgdmFsLCBtYXN0ZXIsIHF1ZXVlKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIiVzIGZhaWxlZCBsaW5lICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlnb3RvIEVSUk9SOwotCX0KLQotCXZhbCA9IENDSV9JMkNfUkVBRF9DTUQgfCAocmVhZF9jZmctPm51bV9ieXRlIDw8IDQpOwotCXJjID0gbXNtX2NjaV93cml0ZV9pMmNfcXVldWUoY2NpX2RldiwgdmFsLCBtYXN0ZXIsIHF1ZXVlKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIiVzIGZhaWxlZCBsaW5lICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlnb3RvIEVSUk9SOwotCX0KLQotCXZhbCA9IENDSV9JMkNfVU5MT0NLX0NNRDsKLQlyYyA9IG1zbV9jY2lfd3JpdGVfaTJjX3F1ZXVlKGNjaV9kZXYsIHZhbCwgbWFzdGVyLCBxdWV1ZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCIlcyBmYWlsZWQgbGluZSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJZ290byBFUlJPUjsKLQl9Ci0KLQl2YWwgPSBtc21fY2FtZXJhX2lvX3IoY2NpX2Rldi0+YmFzZSArIENDSV9JMkNfTTBfUTBfQ1VSX1dPUkRfQ05UX0FERFIgKwotCQltYXN0ZXIgKiAweDIwMCArIHF1ZXVlICogMHgxMDApOwotCUNEQkcoIiVzIGN1ciB3b3JkIGNudCAleFxuIiwgX19mdW5jX18sIHZhbCk7Ci0JbXNtX2NhbWVyYV9pb193KHZhbCwgY2NpX2Rldi0+YmFzZSArIENDSV9JMkNfTTBfUTBfRVhFQ19XT1JEX0NOVF9BRERSICsKLQkJbWFzdGVyICogMHgyMDAgKyBxdWV1ZSAqIDB4MTAwKTsKLQotCXZhbCA9IDEgPDwgKChtYXN0ZXIgKiAyKSArIHF1ZXVlKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjY2lfZGV2LT5iYXNlICsgQ0NJX1FVRVVFX1NUQVJUX0FERFIpOwotCXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZjY2lfZGV2LT4KLQkJY2NpX21hc3Rlcl9pbmZvW21hc3Rlcl0ucmVzZXRfY29tcGxldGUsIENDSV9USU1FT1VUKTsKLQotCXJlYWRfd29yZHMgPSBtc21fY2FtZXJhX2lvX3IoY2NpX2Rldi0+YmFzZSArCi0JCUNDSV9JMkNfTTBfUkVBRF9CVUZfTEVWRUxfQUREUiArIG1hc3RlciAqIDB4MTAwKTsKLQlleHBfd29yZHMgPSAoKHJlYWRfY2ZnLT5udW1fYnl0ZSAvIDQpICsgMSk7Ci0JaWYgKHJlYWRfd29yZHMgIT0gZXhwX3dvcmRzKSB7Ci0JCXByX2VycigiJXM6JWQgcmVhZF93b3JkcyA9ICVkLCBleHAgd29yZHMgPSAlZFxuIiwgX19mdW5jX18sCi0JCQlfX0xJTkVfXywgcmVhZF93b3JkcywgZXhwX3dvcmRzKTsKLQkJbWVtc2V0KHJlYWRfY2ZnLT5kYXRhLCAwLCByZWFkX2NmZy0+bnVtX2J5dGUpOwotCQlnb3RvIEVSUk9SOwotCX0KLQlpbmRleCA9IDA7Ci0JQ0RCRygiJXMgaW5kZXggJWQgbnVtX3R5cGUgJWRcbiIsIF9fZnVuY19fLCBpbmRleCwKLQkJcmVhZF9jZmctPm51bV9ieXRlKTsKLQlmaXJzdF9ieXRlID0gMDsKLQlkbyB7Ci0JCXZhbCA9IG1zbV9jYW1lcmFfaW9fcihjY2lfZGV2LT5iYXNlICsKLQkJCUNDSV9JMkNfTTBfUkVBRF9EQVRBX0FERFIgKyBtYXN0ZXIgKiAweDEwMCk7Ci0JCUNEQkcoIiVzIHJlYWQgdmFsICV4XG4iLCBfX2Z1bmNfXywgdmFsKTsKLQkJZm9yIChpID0gMDsgKGkgPCA0KSAmJiAoaW5kZXggPCByZWFkX2NmZy0+bnVtX2J5dGUpOyBpKyspIHsKLQkJCUNEQkcoIiVzIGkgJWQgaW5kZXggJWRcbiIsIF9fZnVuY19fLCBpLCBpbmRleCk7Ci0JCQlpZiAoIWZpcnN0X2J5dGUpIHsKLQkJCQlDREJHKCIlcyBzaWQgJXhcbiIsIF9fZnVuY19fLCB2YWwgJiAweEZGKTsKLQkJCQlmaXJzdF9ieXRlKys7Ci0JCQl9IGVsc2UgewotCQkJCXJlYWRfY2ZnLT5kYXRhW2luZGV4XSA9Ci0JCQkJCSh2YWwgID4+IChpICogOCkpICYgMHhGRjsKLQkJCQlDREJHKCIlcyBkYXRhWyVkXSAleFxuIiwgX19mdW5jX18sIGluZGV4LAotCQkJCQlyZWFkX2NmZy0+ZGF0YVtpbmRleF0pOwotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQl9IHdoaWxlICgtLXJlYWRfd29yZHMgPiAwKTsKLUVSUk9SOgotCW11dGV4X3VubG9jaygmY2NpX2Rldi0+Y2NpX21hc3Rlcl9pbmZvW21hc3Rlcl0ubXV0ZXgpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXNtX2NjaV9pMmNfd3JpdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9jY2lfY3RybCAqY19jdHJsKQotewotCWludDMyX3QgcmMgPSAwOwotCXN0cnVjdCBjY2lfZGV2aWNlICpjY2lfZGV2OwotCXVpbnQzMl90IHZhbDsKLQllbnVtIGNjaV9pMmNfbWFzdGVyX3QgbWFzdGVyOwotCWVudW0gY2NpX2kyY19xdWV1ZV90IHF1ZXVlID0gUVVFVUVfMDsKLQljY2lfZGV2ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0JbWFzdGVyID0gY19jdHJsLT5jY2lfaW5mby0+Y2NpX2kyY19tYXN0ZXI7Ci0JQ0RCRygiJXMgbWFzdGVyICVkLCBxdWV1ZSAlZFxuIiwgX19mdW5jX18sIG1hc3RlciwgcXVldWUpOwotCUNEQkcoIiVzIHNldCBwYXJhbSBzaWQgMHgleCByZXRyaWVzICVkIGlkX21hcCAlZFxuIiwgX19mdW5jX18sCi0JCWNfY3RybC0+Y2NpX2luZm8tPnNpZCwgY19jdHJsLT5jY2lfaW5mby0+cmV0cmllcywKLQkJY19jdHJsLT5jY2lfaW5mby0+aWRfbWFwKTsKLQltdXRleF9sb2NrKCZjY2lfZGV2LT5jY2lfbWFzdGVyX2luZm9bbWFzdGVyXS5tdXRleCk7Ci0JdmFsID0gQ0NJX0kyQ19TRVRfUEFSQU1fQ01EIHwgY19jdHJsLT5jY2lfaW5mby0+c2lkIDw8IDQgfAotCQljX2N0cmwtPmNjaV9pbmZvLT5yZXRyaWVzIDw8IDE2IHwKLQkJY19jdHJsLT5jY2lfaW5mby0+aWRfbWFwIDw8IDE4OwotCUNEQkcoIiVzOiVkIENDSV9JMkNfU0VUX1BBUkFNX0NNRFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlyYyA9IG1zbV9jY2lfd3JpdGVfaTJjX3F1ZXVlKGNjaV9kZXYsIHZhbCwgbWFzdGVyLCBxdWV1ZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCIlcyBmYWlsZWQgbGluZSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJZ290byBFUlJPUjsKLQl9Ci0KLQl2YWwgPSBDQ0lfSTJDX0xPQ0tfQ01EOwotCUNEQkcoIiVzOiVkIENDSV9JMkNfTE9DS19DTURcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmMgPSBtc21fY2NpX3dyaXRlX2kyY19xdWV1ZShjY2lfZGV2LCB2YWwsIG1hc3RlciwgcXVldWUpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiJXMgZmFpbGVkIGxpbmUgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1I7Ci0JfQotCi0JbXNtX2NjaV9kYXRhX3F1ZXVlKGNjaV9kZXYsIGNfY3RybCwgcXVldWUpOwotCXZhbCA9IENDSV9JMkNfVU5MT0NLX0NNRDsKLQlDREJHKCIlczolZCBDQ0lfSTJDX1VOTE9DS19DTURcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmMgPSBtc21fY2NpX3dyaXRlX2kyY19xdWV1ZShjY2lfZGV2LCB2YWwsIG1hc3RlciwgcXVldWUpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiJXMgZmFpbGVkIGxpbmUgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1I7Ci0JfQotCi0JdmFsID0gQ0NJX0kyQ19SRVBPUlRfQ01EIHwgKDEgPDwgOCk7Ci0JQ0RCRygiJXM6JWQgQ0NJX0kyQ19SRVBPUlRfQ01EXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCXJjID0gbXNtX2NjaV93cml0ZV9pMmNfcXVldWUoY2NpX2RldiwgdmFsLCBtYXN0ZXIsIHF1ZXVlKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIiVzIGZhaWxlZCBsaW5lICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlnb3RvIEVSUk9SOwotCX0KLQotCXZhbCA9IG1zbV9jYW1lcmFfaW9fcihjY2lfZGV2LT5iYXNlICsgQ0NJX0kyQ19NMF9RMF9DVVJfV09SRF9DTlRfQUREUiArCi0JCW1hc3RlciAqIDB4MjAwICsgcXVldWUgKiAweDEwMCk7Ci0JQ0RCRygiJXM6JWQgY3VyIHdvcmQgY291bnQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgdmFsKTsKLQlDREJHKCIlczolZCBDQ0lfSTJDX00wX1EwX0VYRUNfV09SRF9DTlRfQUREUlxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjY2lfZGV2LT5iYXNlICsgQ0NJX0kyQ19NMF9RMF9FWEVDX1dPUkRfQ05UX0FERFIgKwotCQltYXN0ZXIgKiAweDIwMCArIHF1ZXVlICogMHgxMDApOwotCi0JdmFsID0gMSA8PCAoKG1hc3RlciAqIDIpICsgcXVldWUpOwotCUNEQkcoIiVzOiVkIENDSV9RVUVVRV9TVEFSVF9BRERSXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNjaV9kZXYtPmJhc2UgKyBDQ0lfUVVFVUVfU1RBUlRfQUREUiArCi0JCW1hc3RlcioweDIwMCArIHF1ZXVlICogMHgxMDApOwotCi0JQ0RCRygiJXMgbGluZSAlZCB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVcbiIsCi0JCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJmNjaV9kZXYtPgotCQljY2lfbWFzdGVyX2luZm9bbWFzdGVyXS5yZXNldF9jb21wbGV0ZSwgQ0NJX1RJTUVPVVQpOwotCi1FUlJPUjoKLQltdXRleF91bmxvY2soJmNjaV9kZXYtPmNjaV9tYXN0ZXJfaW5mb1ttYXN0ZXJdLm11dGV4KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NjaV9zdWJkZXZfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQlzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCAqY2hpcCkKLXsKLQlCVUdfT04oIWNoaXApOwotCWNoaXAtPmlkZW50ID0gVjRMMl9JREVOVF9DQ0k7Ci0JY2hpcC0+cmV2aXNpb24gPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1fY2xrX2luZm8gY2NpX2Nsa19pbmZvW10gPSB7Ci0JeyJjYW1zc190b3BfYWhiX2NsayIsIC0xfSwKLQl7ImNjaV9zcmNfY2xrIiwgMTkyMDAwMDB9LAotCXsiY2NpX2FoYl9jbGsiLCAtMX0sCi0JeyJjY2lfY2xrIiwgLTF9LAotfTsKLQotc3RhdGljIGludDMyX3QgbXNtX2NjaV9pbml0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgY2NpX2RldmljZSAqY2NpX2RldjsKLQljY2lfZGV2ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0JQ0RCRygiJXMgbGluZSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlpZiAoY2NpX2RldiA9PSBOVUxMKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJcmV0dXJuIHJjOwotCX0KLQlyYyA9IG1zbV9jYW1fY2xrX2VuYWJsZSgmY2NpX2Rldi0+cGRldi0+ZGV2LCBjY2lfY2xrX2luZm8sCi0JCWNjaV9kZXYtPmNjaV9jbGssIEFSUkFZX1NJWkUoY2NpX2Nsa19pbmZvKSwgMSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCIlczogY2xrIGVuYWJsZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBjbGtfZW5hYmxlX2ZhaWxlZDsKLQl9Ci0KLQllbmFibGVfaXJxKGNjaV9kZXYtPmlycS0+c3RhcnQpOwotCWNjaV9kZXYtPmh3X3ZlcnNpb24gPSBtc21fY2FtZXJhX2lvX3IoY2NpX2Rldi0+YmFzZSArCi0JCUNDSV9IV19WRVJTSU9OX0FERFIpOwotCWNjaV9kZXYtPmNjaV9tYXN0ZXJfaW5mb1tNQVNURVJfMF0ucmVzZXRfcGVuZGluZyA9IFRSVUU7Ci0JbXNtX2NhbWVyYV9pb193KDB4RkZGRkZGRkYsIGNjaV9kZXYtPmJhc2UgKyBDQ0lfUkVTRVRfQ01EX0FERFIpOwotCW1zbV9jYW1lcmFfaW9fdygweDEsIGNjaV9kZXYtPmJhc2UgKyBDQ0lfUkVTRVRfQ01EX0FERFIpOwotCXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAotCQkmY2NpX2Rldi0+Y2NpX21hc3Rlcl9pbmZvW01BU1RFUl8wXS5yZXNldF9jb21wbGV0ZSwKLQkJQ0NJX1RJTUVPVVQpOwotCW1zbV9jY2lfc2V0X2Nsa19wYXJhbShjY2lfZGV2KTsKLQltc21fY2FtZXJhX2lvX3coMHhGRkZGRkZGRiwgY2NpX2Rldi0+YmFzZSArIENDSV9JUlFfTUFTS18wX0FERFIpOwotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGRkZGLCBjY2lfZGV2LT5iYXNlICsgQ0NJX0lSUV9DTEVBUl8wX0FERFIpOwotCW1zbV9jYW1lcmFfaW9fdygweDEsIGNjaV9kZXYtPmJhc2UgKyBDQ0lfSVJRX0dMT0JBTF9DTEVBUl9DTURfQUREUik7Ci0JbXNtX2NhbWVyYV9pb193KDB4MCwgY2NpX2Rldi0+YmFzZSArIENDSV9JUlFfR0xPQkFMX0NMRUFSX0NNRF9BRERSKTsKLQltc21fY2FtZXJhX2lvX3coMHgwLCBjY2lfZGV2LT5iYXNlICsgQ0NJX0lSUV9DTEVBUl8wX0FERFIpOwotCXJldHVybiAwOwotCi1jbGtfZW5hYmxlX2ZhaWxlZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG1zbV9jY2lfcmVsZWFzZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQotewotCXN0cnVjdCBjY2lfZGV2aWNlICpjY2lfZGV2OwotCWNjaV9kZXYgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQotCWRpc2FibGVfaXJxKGNjaV9kZXYtPmlycS0+c3RhcnQpOwotCi0JbXNtX2NhbV9jbGtfZW5hYmxlKCZjY2lfZGV2LT5wZGV2LT5kZXYsIGNjaV9jbGtfaW5mbywKLQkJY2NpX2Rldi0+Y2NpX2NsaywgQVJSQVlfU0laRShjY2lfY2xrX2luZm8pLCAwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCBtc21fY2NpX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXN0cnVjdCBtc21fY2FtZXJhX2NjaV9jdHJsICpjY2lfY3RybCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlDREJHKCIlcyBsaW5lICVkIGNtZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQljY2lfY3RybC0+Y21kKTsKLQlzd2l0Y2ggKGNjaV9jdHJsLT5jbWQpIHsKLQljYXNlIE1TTV9DQ0lfSU5JVDoKLQkJcmMgPSBtc21fY2NpX2luaXQoc2QpOwotCQlicmVhazsKLQljYXNlIE1TTV9DQ0lfUkVMRUFTRToKLQkJcmMgPSBtc21fY2NpX3JlbGVhc2Uoc2QpOwotCQlicmVhazsKLQljYXNlIE1TTV9DQ0lfU0VUX1NJRDoKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQ0NJX1NFVF9GUkVROgotCQlyYyA9IG1zbV9jY2lfaTJjX3NldF9mcmVxKHNkLCBjY2lfY3RybCk7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0NDSV9TRVRfU1lOQ19DSUQ6Ci0JCXJjID0gbXNtX2NjaV9pMmNfY29uZmlnX3N5bmNfdGltZXIoc2QsIGNjaV9jdHJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQ0NJX0kyQ19SRUFEOgotCQlyYyA9IG1zbV9jY2lfaTJjX3JlYWQoc2QsIGNjaV9jdHJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQ0NJX0kyQ19XUklURToKLQkJcmMgPSBtc21fY2NpX2kyY193cml0ZShzZCwgY2NpX2N0cmwpOwotCQlicmVhazsKLQljYXNlIE1TTV9DQ0lfR1BJT19XUklURToKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRU5PSU9DVExDTUQ7Ci0JfQotCUNEQkcoIiVzIGxpbmUgJWQgcmMgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcmMpOwotCWNjaV9jdHJsLT5zdGF0dXMgPSByYzsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBtc21fY2NpX2lycShpbnQgaXJxX251bSwgdm9pZCAqZGF0YSkKLXsKLQl1aW50MzJfdCBpcnE7Ci0Jc3RydWN0IGNjaV9kZXZpY2UgKmNjaV9kZXYgPSBkYXRhOwotCWlycSA9IG1zbV9jYW1lcmFfaW9fcihjY2lfZGV2LT5iYXNlICsgQ0NJX0lSUV9TVEFUVVNfMF9BRERSKTsKLQltc21fY2FtZXJhX2lvX3coaXJxLCBjY2lfZGV2LT5iYXNlICsgQ0NJX0lSUV9DTEVBUl8wX0FERFIpOwotCW1zbV9jYW1lcmFfaW9fdygweDEsIGNjaV9kZXYtPmJhc2UgKyBDQ0lfSVJRX0dMT0JBTF9DTEVBUl9DTURfQUREUik7Ci0JbXNtX2NhbWVyYV9pb193KDB4MCwgY2NpX2Rldi0+YmFzZSArIENDSV9JUlFfR0xPQkFMX0NMRUFSX0NNRF9BRERSKTsKLQlDREJHKCIlcyBDQ0lfSTJDX00wX1NUQVRVU19BRERSID0gMHgleFxuIiwgX19mdW5jX18sIGlycSk7Ci0JaWYgKGlycSAmIENDSV9JUlFfU1RBVFVTXzBfUlNUX0RPTkVfQUNLX0JNU0spIHsKLQkJaWYgKGNjaV9kZXYtPmNjaV9tYXN0ZXJfaW5mb1tNQVNURVJfMF0ucmVzZXRfcGVuZGluZyA9PSBUUlVFKSB7Ci0JCQljY2lfZGV2LT5jY2lfbWFzdGVyX2luZm9bTUFTVEVSXzBdLnJlc2V0X3BlbmRpbmcgPQotCQkJCUZBTFNFOwotCQkJY29tcGxldGUoJmNjaV9kZXYtPmNjaV9tYXN0ZXJfaW5mb1tNQVNURVJfMF0uCi0JCQkJcmVzZXRfY29tcGxldGUpOwotCQl9Ci0JCWlmIChjY2lfZGV2LT5jY2lfbWFzdGVyX2luZm9bTUFTVEVSXzFdLnJlc2V0X3BlbmRpbmcgPT0gVFJVRSkgewotCQkJY2NpX2Rldi0+Y2NpX21hc3Rlcl9pbmZvW01BU1RFUl8xXS5yZXNldF9wZW5kaW5nID0KLQkJCQlGQUxTRTsKLQkJCWNvbXBsZXRlKCZjY2lfZGV2LT5jY2lfbWFzdGVyX2luZm9bTUFTVEVSXzFdLgotCQkJCXJlc2V0X2NvbXBsZXRlKTsKLQkJfQotCX0gZWxzZSBpZiAoKGlycSAmIENDSV9JUlFfU1RBVFVTXzBfSTJDX00wX1JEX0RPTkVfQk1TSykgfHwKLQkJKGlycSAmIENDSV9JUlFfU1RBVFVTXzBfSTJDX00wX1EwX1JFUE9SVF9CTVNLKSB8fAotCQkoaXJxICYgQ0NJX0lSUV9TVEFUVVNfMF9JMkNfTTBfUTFfUkVQT1JUX0JNU0spKSB7Ci0JCWNjaV9kZXYtPmNjaV9tYXN0ZXJfaW5mb1tNQVNURVJfMF0uc3RhdHVzID0gMDsKLQkJY29tcGxldGUoJmNjaV9kZXYtPmNjaV9tYXN0ZXJfaW5mb1tNQVNURVJfMF0ucmVzZXRfY29tcGxldGUpOwotCX0gZWxzZSBpZiAoKGlycSAmIENDSV9JUlFfU1RBVFVTXzBfSTJDX00xX1JEX0RPTkVfQk1TSykgfHwKLQkJKGlycSAmIENDSV9JUlFfU1RBVFVTXzBfSTJDX00xX1EwX1JFUE9SVF9CTVNLKSB8fAotCQkoaXJxICYgQ0NJX0lSUV9TVEFUVVNfMF9JMkNfTTFfUTFfUkVQT1JUX0JNU0spKSB7Ci0JCWNjaV9kZXYtPmNjaV9tYXN0ZXJfaW5mb1tNQVNURVJfMV0uc3RhdHVzID0gMDsKLQkJY29tcGxldGUoJmNjaV9kZXYtPmNjaV9tYXN0ZXJfaW5mb1tNQVNURVJfMV0ucmVzZXRfY29tcGxldGUpOwotCX0gZWxzZSBpZiAoKGlycSAmIENDSV9JUlFfU1RBVFVTXzBfSTJDX00wX1EwX05BQ0tfRVJSX0JNU0spIHx8Ci0JCShpcnEgJiBDQ0lfSVJRX1NUQVRVU18wX0kyQ19NMF9RMV9OQUNLX0VSUl9CTVNLKSkgewotCQljY2lfZGV2LT5jY2lfbWFzdGVyX2luZm9bTUFTVEVSXzBdLnN0YXR1cyA9IC1FSU5WQUw7Ci0JCW1zbV9jYW1lcmFfaW9fdyhDQ0lfTTBfSEFMVF9SRVFfUk1TSywKLQkJCWNjaV9kZXYtPmJhc2UgKyBDQ0lfSEFMVF9SRVFfQUREUik7Ci0JfSBlbHNlIGlmICgoaXJxICYgQ0NJX0lSUV9TVEFUVVNfMF9JMkNfTTFfUTBfTkFDS19FUlJfQk1TSykgfHwKLQkJKGlycSAmIENDSV9JUlFfU1RBVFVTXzBfSTJDX00xX1ExX05BQ0tfRVJSX0JNU0spKSB7Ci0JCWNjaV9kZXYtPmNjaV9tYXN0ZXJfaW5mb1tNQVNURVJfMV0uc3RhdHVzID0gLUVJTlZBTDsKLQkJbXNtX2NhbWVyYV9pb193KENDSV9NMV9IQUxUX1JFUV9STVNLLAotCQkJY2NpX2Rldi0+YmFzZSArIENDSV9IQUxUX1JFUV9BRERSKTsKLQl9IGVsc2UgaWYgKGlycSAmIENDSV9JUlFfU1RBVFVTXzBfSTJDX00wX1EwUTFfSEFMVF9BQ0tfQk1TSykgewotCQljY2lfZGV2LT5jY2lfbWFzdGVyX2luZm9bTUFTVEVSXzBdLnJlc2V0X3BlbmRpbmcgPSBUUlVFOwotCQltc21fY2FtZXJhX2lvX3coQ0NJX00wX1JFU0VUX1JNU0ssCi0JCQljY2lfZGV2LT5iYXNlICsgQ0NJX1JFU0VUX0NNRF9BRERSKTsKLQl9IGVsc2UgaWYgKGlycSAmIENDSV9JUlFfU1RBVFVTXzBfSTJDX00xX1EwUTFfSEFMVF9BQ0tfQk1TSykgewotCQljY2lfZGV2LT5jY2lfbWFzdGVyX2luZm9bTUFTVEVSXzFdLnJlc2V0X3BlbmRpbmcgPSBUUlVFOwotCQltc21fY2FtZXJhX2lvX3coQ0NJX00xX1JFU0VUX1JNU0ssCi0JCQljY2lfZGV2LT5iYXNlICsgQ0NJX1JFU0VUX0NNRF9BRERSKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzIHVuaGFuZGxlZCBpcnEgMHgleFxuIiwgX19mdW5jX18sIGlycSk7Ci0JCWNjaV9kZXYtPmNjaV9tYXN0ZXJfaW5mb1tNQVNURVJfMF0uc3RhdHVzID0gMDsKLQkJY29tcGxldGUoJmNjaV9kZXYtPmNjaV9tYXN0ZXJfaW5mb1tNQVNURVJfMF0ucmVzZXRfY29tcGxldGUpOwotCQljY2lfZGV2LT5jY2lfbWFzdGVyX2luZm9bTUFTVEVSXzFdLnN0YXR1cyA9IDA7Ci0JCWNvbXBsZXRlKCZjY2lfZGV2LT5jY2lfbWFzdGVyX2luZm9bTUFTVEVSXzFdLnJlc2V0X2NvbXBsZXRlKTsKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1pbnQgbXNtX2NjaV9pcnFfcm91dGluZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgc3RhdHVzLCBib29sICpoYW5kbGVkKQotewotCXN0cnVjdCBjY2lfZGV2aWNlICpjY2lfZGV2ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0JaXJxcmV0dXJuX3QgcmV0OwotCUNEQkcoIiVzIGxpbmUgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0ID0gbXNtX2NjaV9pcnEoY2NpX2Rldi0+aXJxLT5zdGFydCwgY2NpX2Rldik7Ci0JKmhhbmRsZWQgPSBUUlVFOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyBtc21fY2NpX3N1YmRldl9pb2N0bChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlDREJHKCIlcyBsaW5lICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfTVNNX0NDSV9DRkc6Ci0JCXJjID0gbXNtX2NjaV9jb25maWcoc2QsIGFyZyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVOT0lPQ1RMQ01EOwotCX0KLQlDREJHKCIlcyBsaW5lICVkIHJjICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbXNtX2NjaV9zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmdfY2hpcF9pZGVudCA9ICZtc21fY2NpX3N1YmRldl9nX2NoaXBfaWRlbnQsCi0JLmlvY3RsID0gJm1zbV9jY2lfc3ViZGV2X2lvY3RsLAotCS5pbnRlcnJ1cHRfc2VydmljZV9yb3V0aW5lID0gbXNtX2NjaV9pcnFfcm91dGluZSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG1zbV9jY2lfc3ViZGV2X29wcyA9IHsKLQkuY29yZSA9ICZtc21fY2NpX3N1YmRldl9jb3JlX29wcywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfaW50ZXJuYWxfb3BzIG1zbV9jY2lfaW50ZXJuYWxfb3BzOwotCi1zdGF0aWMgdm9pZCBtc21fY2NpX2luaXRpYWxpemVfY2NpX3BhcmFtcyhzdHJ1Y3QgY2NpX2RldmljZSAqbmV3X2NjaV9kZXYpCi17Ci0JdWludDhfdCBpID0gMCwgaiA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9NQVNURVJTOyBpKyspIHsKLQkJbmV3X2NjaV9kZXYtPmNjaV9tYXN0ZXJfaW5mb1tpXS5zdGF0dXMgPSAwOwotCQltdXRleF9pbml0KCZuZXdfY2NpX2Rldi0+Y2NpX21hc3Rlcl9pbmZvW2ldLm11dGV4KTsKLQkJaW5pdF9jb21wbGV0aW9uKCZuZXdfY2NpX2Rldi0+Ci0JCQljY2lfbWFzdGVyX2luZm9baV0ucmVzZXRfY29tcGxldGUpOwotCQlmb3IgKGogPSAwOyBqIDwgTlVNX1FVRVVFUzsgaisrKSB7Ci0JCQlpZiAoaiA9PSBRVUVVRV8wKQotCQkJCW5ld19jY2lfZGV2LT5jY2lfaTJjX3F1ZXVlX2luZm9baV1bal0uCi0JCQkJCW1heF9xdWV1ZV9zaXplID0gQ0NJX0kyQ19RVUVVRV8wX1NJWkU7Ci0JCQllbHNlCi0JCQkJbmV3X2NjaV9kZXYtPmNjaV9pMmNfcXVldWVfaW5mb1tpXVtqXS4KLQkJCQkJbWF4X3F1ZXVlX3NpemUgPSBDQ0lfSTJDX1FVRVVFXzFfU0laRTsKLQkJCX0KLQl9Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBtc21fY2NpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGNjaV9kZXZpY2UgKm5ld19jY2lfZGV2OwotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1fc3ViZGV2X2luZm8gc2RfaW5mbzsKLQlzdHJ1Y3QgaW50cl90YWJsZV9lbnRyeSBpcnFfcmVxOwotCUNEQkcoIiVzOiBwZGV2ICVwIGRldmljZSBpZCA9ICVkXG4iLCBfX2Z1bmNfXywgcGRldiwgcGRldi0+aWQpOwotCW5ld19jY2lfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNjaV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5ld19jY2lfZGV2KSB7Ci0JCUNEQkcoIiVzOiBubyBlbm91Z2ggbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQl2NGwyX3N1YmRldl9pbml0KCZuZXdfY2NpX2Rldi0+c3ViZGV2LCAmbXNtX2NjaV9zdWJkZXZfb3BzKTsKLQluZXdfY2NpX2Rldi0+c3ViZGV2LmludGVybmFsX29wcyA9ICZtc21fY2NpX2ludGVybmFsX29wczsKLQluZXdfY2NpX2Rldi0+c3ViZGV2LmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOwotCXNucHJpbnRmKG5ld19jY2lfZGV2LT5zdWJkZXYubmFtZSwKLQkJCUFSUkFZX1NJWkUobmV3X2NjaV9kZXYtPnN1YmRldi5uYW1lKSwgIm1zbV9jY2kiKTsKLQl2NGwyX3NldF9zdWJkZXZkYXRhKCZuZXdfY2NpX2Rldi0+c3ViZGV2LCBuZXdfY2NpX2Rldik7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJm5ld19jY2lfZGV2LT5zdWJkZXYpOwotCUNEQkcoIiVzIHNkICVwXG4iLCBfX2Z1bmNfXywgJm5ld19jY2lfZGV2LT5zdWJkZXYpOwotCWlmIChwZGV2LT5kZXYub2Zfbm9kZSkKLQkJb2ZfcHJvcGVydHlfcmVhZF91MzIoKCZwZGV2LT5kZXYpLT5vZl9ub2RlLAotCQkJImNlbGwtaW5kZXgiLCAmcGRldi0+aWQpOwotCi0JbmV3X2NjaV9kZXYtPm1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKLQkJCQkJSU9SRVNPVVJDRV9NRU0sICJjY2kiKTsKLQlpZiAoIW5ld19jY2lfZGV2LT5tZW0pIHsKLQkJQ0RCRygiJXM6IG5vIG1lbSByZXNvdXJjZT9cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGNjaV9ub19yZXNvdXJjZTsKLQl9Ci0JbmV3X2NjaV9kZXYtPmlycSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKLQkJCQkJSU9SRVNPVVJDRV9JUlEsICJjY2kiKTsKLQlDREJHKCIlcyBsaW5lICVkIGNjaSBpcnEgc3RhcnQgJWQgZW5kICVkXG4iLCBfX2Z1bmNfXywKLQkJX19MSU5FX18sCi0JCW5ld19jY2lfZGV2LT5pcnEtPnN0YXJ0LAotCQluZXdfY2NpX2Rldi0+aXJxLT5lbmQpOwotCWlmICghbmV3X2NjaV9kZXYtPmlycSkgewotCQlDREJHKCIlczogbm8gaXJxIHJlc291cmNlP1xuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gY2NpX25vX3Jlc291cmNlOwotCX0KLQluZXdfY2NpX2Rldi0+aW8gPSByZXF1ZXN0X21lbV9yZWdpb24obmV3X2NjaV9kZXYtPm1lbS0+c3RhcnQsCi0JCXJlc291cmNlX3NpemUobmV3X2NjaV9kZXYtPm1lbSksIHBkZXYtPm5hbWUpOwotCWlmICghbmV3X2NjaV9kZXYtPmlvKSB7Ci0JCUNEQkcoIiVzOiBubyB2YWxpZCBtZW0gcmVnaW9uXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGNjaV9ub19yZXNvdXJjZTsKLQl9Ci0KLQluZXdfY2NpX2Rldi0+YmFzZSA9IGlvcmVtYXAobmV3X2NjaV9kZXYtPm1lbS0+c3RhcnQsCi0JCXJlc291cmNlX3NpemUobmV3X2NjaV9kZXYtPm1lbSkpOwotCWlmICghbmV3X2NjaV9kZXYtPmJhc2UpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGNjaV9yZWxlYXNlX21lbTsKLQl9Ci0KLQlzZF9pbmZvLnNkZXZfdHlwZSA9IENDSV9ERVY7Ci0Jc2RfaW5mby5zZF9pbmRleCA9IHBkZXYtPmlkOwotCXNkX2luZm8uaXJxX251bSA9IG5ld19jY2lfZGV2LT5pcnEtPnN0YXJ0OwotCW1zbV9jYW1fcmVnaXN0ZXJfc3ViZGV2X25vZGUoJm5ld19jY2lfZGV2LT5zdWJkZXYsICZzZF9pbmZvKTsKLQotCWlycV9yZXEuY2FtX2h3X2lkeCAgICAgICA9IE1TTV9DQU1fSFdfQ0NJOwotCWlycV9yZXEuZGV2X25hbWUgICAgICAgICA9ICJtc21fY2NpIjsKLQlpcnFfcmVxLmlycV9pZHggICAgICAgICAgPSBDQU1FUkFfU1NfSVJRXzE7Ci0JaXJxX3JlcS5pcnFfbnVtICAgICAgICAgID0gbmV3X2NjaV9kZXYtPmlycS0+c3RhcnQ7Ci0JaXJxX3JlcS5pc19jb21wb3NpdGUgICAgID0gMDsKLQlpcnFfcmVxLmlycV90cmlnZ2VyX3R5cGUgPSBJUlFGX1RSSUdHRVJfUklTSU5HOwotCWlycV9yZXEubnVtX2h3Y29yZSAgICAgICA9IDE7Ci0JaXJxX3JlcS5zdWJkZXZfbGlzdFswXSAgID0gJm5ld19jY2lfZGV2LT5zdWJkZXY7Ci0JaXJxX3JlcS5kYXRhICAgICAgICAgICAgID0gKHZvaWQgKiluZXdfY2NpX2RldjsKLQlyYyA9IG1zbV9jYW1fc2VydmVyX3JlcXVlc3RfaXJxKCZpcnFfcmVxKTsKLQlpZiAocmMgPT0gLUVOWElPKSB7Ci0JCS8qIElSUSBSb3V0ZXIgaGFyZHdhcmUgaXMgbm90IHByZXNlbnQgb24gdGhpcyBoYXJkd2FyZS4KLQkJICogUmVxdWVzdCBmb3IgdGhlIElSUSBhbmQgcmVnaXN0ZXIgdGhlIGludGVycnVwdCBoYW5kbGVyLiAqLwotCQlyYyA9IHJlcXVlc3RfaXJxKG5ld19jY2lfZGV2LT5pcnEtPnN0YXJ0LCBtc21fY2NpX2lycSwKLQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcsICJjY2kiLCBuZXdfY2NpX2Rldik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCUNEQkcoIiVzOiBpcnEgcmVxdWVzdCBmYWlsXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWdvdG8gY2NpX3JlbGVhc2VfbWVtOwotCQl9Ci0JCWRpc2FibGVfaXJxKG5ld19jY2lfZGV2LT5pcnEtPnN0YXJ0KTsKLQl9IGVsc2UgaWYgKHJjIDwgMCkgewotCQlDREJHKCIlcyBFcnJvciByZWdpc3RlcmluZyBpcnEgIiwgX19mdW5jX18pOwotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBjY2lfcmVsZWFzZV9tZW07Ci0JfQotCi0JbmV3X2NjaV9kZXYtPnBkZXYgPSBwZGV2OwotCW1zbV9jY2lfaW5pdGlhbGl6ZV9jY2lfcGFyYW1zKG5ld19jY2lfZGV2KTsKLQlyYyA9IG9mX3BsYXRmb3JtX3BvcHVsYXRlKHBkZXYtPmRldi5vZl9ub2RlLCBOVUxMLCBOVUxMLCAmcGRldi0+ZGV2KTsKLQlpZiAocmMpCi0JCXByX2VycigiJXM6IGZhaWxlZCB0byBhZGQgY2hpbGQgbm9kZXMsIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCUNEQkcoIiVzIGxpbmUgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIDA7Ci0KLWNjaV9yZWxlYXNlX21lbToKLQlyZWxlYXNlX21lbV9yZWdpb24obmV3X2NjaV9kZXYtPm1lbS0+c3RhcnQsCi0JCXJlc291cmNlX3NpemUobmV3X2NjaV9kZXYtPm1lbSkpOwotY2NpX25vX3Jlc291cmNlOgotCWtmcmVlKG5ld19jY2lfZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2V4aXQgbXNtX2NjaV9leGl0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgY2NpX2RldmljZSAqY2NpX2RldiA9Ci0JCXY0bDJfZ2V0X3N1YmRldmRhdGEoc3ViZGV2KTsKLQlyZWxlYXNlX21lbV9yZWdpb24oY2NpX2Rldi0+bWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShjY2lfZGV2LT5tZW0pKTsKLQlrZnJlZShjY2lfZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2NjaV9kdF9tYXRjaFtdID0gewotCXsuY29tcGF0aWJsZSA9ICJxY29tLGNjaSJ9LAotCXt9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fY2NpX2R0X21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY2NpX2RyaXZlciA9IHsKLQkucHJvYmUgPSBtc21fY2NpX3Byb2JlLAotCS5yZW1vdmUgPSBtc21fY2NpX2V4aXQsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBNU01fQ0NJX0RSVl9OQU1FLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gbXNtX2NjaV9kdF9tYXRjaCwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX2NjaV9pbml0X21vZHVsZSh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmNjaV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXNtX2NjaV9leGl0X21vZHVsZSh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjY2lfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQobXNtX2NjaV9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChtc21fY2NpX2V4aXRfbW9kdWxlKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIENDSSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jY2kvbXNtX2NjaS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NjaS9tc21fY2NpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNzkxNmQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NjaS9tc21fY2NpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBNU01fQ0NJX0gKLSNkZWZpbmUgTVNNX0NDSV9ICi0KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLQotI2RlZmluZSBOVU1fTUFTVEVSUyAyCi0jZGVmaW5lIE5VTV9RVUVVRVMgMgotCi0jZGVmaW5lIFRSVUUgIDEKLSNkZWZpbmUgRkFMU0UgMAotCi1zdHJ1Y3QgbXNtX2NhbWVyYV9jY2lfbWFzdGVyX2luZm8gewotCXVpbnQzMl90IHN0YXR1czsKLQl1aW50OF90IHJlc2V0X3BlbmRpbmc7Ci0Jc3RydWN0IG11dGV4IG11dGV4OwotCXN0cnVjdCBjb21wbGV0aW9uIHJlc2V0X2NvbXBsZXRlOwotfTsKLQotc3RydWN0IGNjaV9kZXZpY2UgewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0Jc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmlycTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmlvOwotCXZvaWQgX19pb21lbSAqYmFzZTsKLQl1aW50MzJfdCBod192ZXJzaW9uOwotCXN0cnVjdCBjbGsgKmNjaV9jbGtbNV07Ci0Jc3RydWN0IG1zbV9jYW1lcmFfY2NpX2kyY19xdWV1ZV9pbmZvCi0JCWNjaV9pMmNfcXVldWVfaW5mb1tOVU1fTUFTVEVSU11bTlVNX1FVRVVFU107Ci0Jc3RydWN0IG1zbV9jYW1lcmFfY2NpX21hc3Rlcl9pbmZvIGNjaV9tYXN0ZXJfaW5mb1tOVU1fTUFTVEVSU107Ci19OwotCi1lbnVtIG1zbV9jY2lfaTJjX2NtZF90eXBlIHsKLQlDQ0lfSTJDX1NFVF9QQVJBTV9DTUQgPSAxLAotCUNDSV9JMkNfV0FJVF9DTUQsCi0JQ0NJX0kyQ19XQUlUX1NZTkNfQ01ELAotCUNDSV9JMkNfV0FJVF9HUElPX0VWRU5UX0NNRCwKLQlDQ0lfSTJDX1RSSUdfSTJDX0VWRU5UX0NNRCwKLQlDQ0lfSTJDX0xPQ0tfQ01ELAotCUNDSV9JMkNfVU5MT0NLX0NNRCwKLQlDQ0lfSTJDX1JFUE9SVF9DTUQsCi0JQ0NJX0kyQ19XUklURV9DTUQsCi0JQ0NJX0kyQ19SRUFEX0NNRCwKLQlDQ0lfSTJDX1dSSVRFX0RJU0FCTEVfUF9DTUQsCi0JQ0NJX0kyQ19SRUFEX0RJU0FCTEVfUF9DTUQsCi0JQ0NJX0kyQ19XUklURV9DTUQyLAotCUNDSV9JMkNfV1JJVEVfQ01EMywKLQlDQ0lfSTJDX1JFUEVBVF9DTUQsCi0JQ0NJX0kyQ19JTlZBTElEX0NNRCwKLX07Ci0KLWVudW0gbXNtX2NjaV9ncGlvX2NtZF90eXBlIHsKLQlDQ0lfR1BJT19TRVRfUEFSQU1fQ01EID0gMSwKLQlDQ0lfR1BJT19XQUlUX0NNRCwKLQlDQ0lfR1BJT19XQUlUX1NZTkNfQ01ELAotCUNDSV9HUElPX1dBSVRfR1BJT19JTl9FVkVOVF9DTUQsCi0JQ0NJX0dQSU9fV0FJVF9JMkNfUV9UUklHX0VWRU5UX0NNRCwKLQlDQ0lfR1BJT19PVVRfQ01ELAotCUNDSV9HUElPX1RSSUdfRVZFTlRfQ01ELAotCUNDSV9HUElPX1JFUE9SVF9DTUQsCi0JQ0NJX0dQSU9fUkVQRUFUX0NNRCwKLQlDQ0lfR1BJT19DT05USU5VRV9DTUQsCi0JQ0NJX0dQSU9fSU5WQUxJRF9DTUQsCi19OwotCi0jZGVmaW5lIFZJRElPQ19NU01fQ0NJX0NGRyBcCi0JX0lPV1IoJ1YnLCBCQVNFX1ZJRElPQ19QUklWQVRFICsgMjMsIHN0cnVjdCBtc21fY2FtZXJhX2NjaV9jdHJsICopCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3BwL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NwcC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0YzM2Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3BwL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1HQ0NfVkVSU0lPTiAgICAgIDo9ICQoc2hlbGwgJChDT05GSUdfU0hFTEwpICQoUFdEKS9zY3JpcHRzL2djYy12ZXJzaW9uLnNoICQoQ1JPU1NfQ09NUElMRSlnY2MpCi1jY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEKLWNjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pbwotb2JqLSQoQ09ORklHX01TTV9DUFApICs9IG1zbV9jcHAubwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3BwL21zbV9jcHAuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jcHAvbXNtX2NwcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDkzMmJkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jcHAvbXNtX2NwcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgPG1hY2gvdnJlZy5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9pc3AuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotCi0jaW5jbHVkZSAibXNtX2NwcC5oIgotI2luY2x1ZGUgIm1zbS5oIgotCi0jZGVmaW5lIENPTkZJR19NU01fQ1BQX0RCRyAwCi0KLSNpZiBDT05GSUdfTVNNX0NQUF9EQkcKLSNkZWZpbmUgQ1BQX0RCRyhmbXQsIGFyZ3MuLi4pIHByX2luZm8oZm10LCAjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBDUFBfREJHKGZtdCwgYXJncy4uLikgcHJfZGVidWcoZm10LCAjI2FyZ3MpCi0jZW5kaWYKLQotc3RhdGljIGludCBjcHBfb3Blbl9ub2RlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgpCi17Ci0JdWludDMyX3QgaTsKLQlzdHJ1Y3QgY3BwX2RldmljZSAqY3BwX2RldiA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCUNQUF9EQkcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQltdXRleF9sb2NrKCZjcHBfZGV2LT5tdXRleCk7Ci0JaWYgKGNwcF9kZXYtPmNwcF9vcGVuX2NudCA9PSBNQVhfQUNUSVZFX0NQUF9JTlNUQU5DRSkgewotCQlwcl9lcnIoIk5vIGZyZWUgQ1BQIGluc3RhbmNlXG4iKTsKLQkJbXV0ZXhfdW5sb2NrKCZjcHBfZGV2LT5tdXRleCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfQUNUSVZFX0NQUF9JTlNUQU5DRTsgaSsrKSB7Ci0JCWlmIChjcHBfZGV2LT5jcHBfc3Vic2NyaWJlX2xpc3RbaV0uYWN0aXZlID09IDApIHsKLQkJCWNwcF9kZXYtPmNwcF9zdWJzY3JpYmVfbGlzdFtpXS5hY3RpdmUgPSAxOwotCQkJY3BwX2Rldi0+Y3BwX3N1YnNjcmliZV9saXN0W2ldLnZmaCA9ICZmaC0+dmZoOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGkgPT0gTUFYX0FDVElWRV9DUFBfSU5TVEFOQ0UpIHsKLQkJcHJfZXJyKCJObyBmcmVlIGluc3RhbmNlXG4iKTsKLQkJbXV0ZXhfdW5sb2NrKCZjcHBfZGV2LT5tdXRleCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCUNQUF9EQkcoIm9wZW4gJWQgJXBcbiIsIGksICZmaC0+dmZoKTsKLQljcHBfZGV2LT5jcHBfb3Blbl9jbnQrKzsKLQltdXRleF91bmxvY2soJmNwcF9kZXYtPm11dGV4KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjcHBfY2xvc2Vfbm9kZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoKQotewotCXVpbnQzMl90IGk7Ci0Jc3RydWN0IGNwcF9kZXZpY2UgKmNwcF9kZXYgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQltdXRleF9sb2NrKCZjcHBfZGV2LT5tdXRleCk7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9BQ1RJVkVfQ1BQX0lOU1RBTkNFOyBpKyspIHsKLQkJaWYgKGNwcF9kZXYtPmNwcF9zdWJzY3JpYmVfbGlzdFtpXS52ZmggPT0gJmZoLT52ZmgpIHsKLQkJCWNwcF9kZXYtPmNwcF9zdWJzY3JpYmVfbGlzdFtpXS5hY3RpdmUgPSAwOwotCQkJY3BwX2Rldi0+Y3BwX3N1YnNjcmliZV9saXN0W2ldLnZmaCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoaSA9PSBNQVhfQUNUSVZFX0NQUF9JTlNUQU5DRSkgewotCQlwcl9lcnIoIkludmFsaWQgY2xvc2VcbiIpOwotCQltdXRleF91bmxvY2soJmNwcF9kZXYtPm11dGV4KTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JQ1BQX0RCRygiY2xvc2UgJWQgJXBcbiIsIGksICZmaC0+dmZoKTsKLQljcHBfZGV2LT5jcHBfb3Blbl9jbnQtLTsKLQltdXRleF91bmxvY2soJmNwcF9kZXYtPm11dGV4KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgbXNtX2NwcF9pbnRlcm5hbF9vcHMgPSB7Ci0JLm9wZW4gPSBjcHBfb3Blbl9ub2RlLAotCS5jbG9zZSA9IGNwcF9jbG9zZV9ub2RlLAotfTsKLQotc3RhdGljIGludCBtc21fY3BwX25vdGlmeV9mcmFtZV9kb25lKHN0cnVjdCBjcHBfZGV2aWNlICpjcHBfZGV2KQotewotCXN0cnVjdCB2NGwyX2V2ZW50IHY0bDJfZXZ0OwotCXN0cnVjdCBtc21fcXVldWVfY21kICpmcmFtZV9xY21kOwotCXN0cnVjdCBtc21fcXVldWVfY21kICpldmVudF9xY21kOwotCXN0cnVjdCBtc21fY3BwX2ZyYW1lX2luZm9fdCAqcHJvY2Vzc2VkX2ZyYW1lOwotCXN0cnVjdCBtc21fZGV2aWNlX3F1ZXVlICpxdWV1ZSA9ICZjcHBfZGV2LT5wcm9jZXNzaW5nX3E7Ci0KLQlpZiAocXVldWUtPmxlbiA+IDApIHsKLQkJZnJhbWVfcWNtZCA9IG1zbV9kZXF1ZXVlKHF1ZXVlLCBsaXN0X2ZyYW1lKTsKLQkJcHJvY2Vzc2VkX2ZyYW1lID0gZnJhbWVfcWNtZC0+Y29tbWFuZDsKLQotCQlldmVudF9xY21kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9xdWV1ZV9jbWQpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFldmVudF9xY21kKSB7Ci0JCQlwcl9lcnIoIiVzIEluc3VmZmljaWVudCBtZW1vcnkuIHJldHVybiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCWF0b21pY19zZXQoJmV2ZW50X3FjbWQtPm9uX2hlYXAsIDEpOwotCQlldmVudF9xY21kLT5jb21tYW5kID0gcHJvY2Vzc2VkX2ZyYW1lOwotCQlDUFBfREJHKCJmaWQgJWRcbiIsIHByb2Nlc3NlZF9mcmFtZS0+ZnJhbWVfaWQpOwotCQltc21fZW5xdWV1ZSgmY3BwX2Rldi0+ZXZlbnREYXRhX3EsICZldmVudF9xY21kLT5saXN0X2V2ZW50ZGF0YSk7Ci0KLQkJdjRsMl9ldnQuaWQgPSBwcm9jZXNzZWRfZnJhbWUtPmluc3RfaWQ7Ci0JCXY0bDJfZXZ0LnR5cGUgPSBWNEwyX0VWRU5UX0NQUF9GUkFNRV9ET05FOwotCQl2NGwyX2V2ZW50X3F1ZXVlKGNwcF9kZXYtPnN1YmRldi5kZXZub2RlLCAmdjRsMl9ldnQpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fY3BwX3NlbmRfZnJhbWVfdG9faGFyZHdhcmUoc3RydWN0IGNwcF9kZXZpY2UgKmNwcF9kZXYpCi17Ci0Jc3RydWN0IG1zbV9xdWV1ZV9jbWQgKmZyYW1lX3FjbWQ7Ci0Jc3RydWN0IG1zbV9jcHBfZnJhbWVfaW5mb190ICpwcm9jZXNzX2ZyYW1lOwotCXN0cnVjdCBtc21fZGV2aWNlX3F1ZXVlICpxdWV1ZTsKLQotCWlmIChjcHBfZGV2LT5wcm9jZXNzaW5nX3EubGVuIDwgTUFYX0NQUF9QUk9DRVNTSU5HX0ZSQU1FKSB7Ci0JCXdoaWxlIChjcHBfZGV2LT5wcm9jZXNzaW5nX3EubGVuIDwgTUFYX0NQUF9QUk9DRVNTSU5HX0ZSQU1FKSB7Ci0JCQlpZiAoY3BwX2Rldi0+cmVhbHRpbWVfcS5sZW4gIT0gMCkgewotCQkJCXF1ZXVlID0gJmNwcF9kZXYtPnJlYWx0aW1lX3E7Ci0JCQl9IGVsc2UgaWYgKGNwcF9kZXYtPm9mZmxpbmVfcS5sZW4gIT0gMCkgewotCQkJCXF1ZXVlID0gJmNwcF9kZXYtPm9mZmxpbmVfcTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJfZGVidWcoIiVzOiBBbGwgZnJhbWVzIHF1ZXVlZFxuIiwgX19mdW5jX18pOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZnJhbWVfcWNtZCA9IG1zbV9kZXF1ZXVlKHF1ZXVlLCBsaXN0X2ZyYW1lKTsKLQkJCS8qVEJEIENvZGUgdG8gYWN0dWFsbHkgc2VuZGluZyB0byBoYXJ3YXJlKi8KLQkJCXByb2Nlc3NfZnJhbWUgPSBmcmFtZV9xY21kLT5jb21tYW5kOwotCi0JCQltc21fZW5xdWV1ZSgmY3BwX2Rldi0+cHJvY2Vzc2luZ19xLAotCQkJCQkJJmZyYW1lX3FjbWQtPmxpc3RfZnJhbWUpOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1sb25nIG1zbV9jcHBfc3ViZGV2X2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IGNwcF9kZXZpY2UgKmNwcF9kZXYgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV92NGwyX2lvY3RsX3QgKmlvY3RsX3B0ciA9IGFyZzsKLQlpbnQgcmMgPSAwOwotCi0JQ1BQX0RCRygiJXM6ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCW11dGV4X2xvY2soJmNwcF9kZXYtPm11dGV4KTsKLQlDUFBfREJHKCIlcyBjbWQ6ICVkXG4iLCBfX2Z1bmNfXywgY21kKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVklESU9DX01TTV9DUFBfQ0ZHOiB7Ci0JCXN0cnVjdCBtc21fcXVldWVfY21kICpmcmFtZV9xY21kOwotCQlzdHJ1Y3QgbXNtX2NwcF9mcmFtZV9pbmZvX3QgKm5ld19mcmFtZSA9Ci0JCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2NwcF9mcmFtZV9pbmZvX3QpLAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCFuZXdfZnJhbWUpIHsKLQkJCXByX2VycigiJXMgSW5zdWZmaWNpZW50IG1lbW9yeS4gcmV0dXJuIiwgX19mdW5jX18pOwotCQkJbXV0ZXhfdW5sb2NrKCZjcHBfZGV2LT5tdXRleCk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCUNPUFlfRlJPTV9VU0VSKHJjLCBuZXdfZnJhbWUsCi0JCQkgICAgICAgKHZvaWQgX191c2VyICopaW9jdGxfcHRyLT5pb2N0bF9wdHIsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtc21fY3BwX2ZyYW1lX2luZm9fdCkpOwotCQlpZiAocmMpIHsKLQkJCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQkJa2ZyZWUobmV3X2ZyYW1lKTsKLQkJCW11dGV4X3VubG9jaygmY3BwX2Rldi0+bXV0ZXgpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlmcmFtZV9xY21kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9xdWV1ZV9jbWQpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFmcmFtZV9xY21kKSB7Ci0JCQlwcl9lcnIoIiVzIEluc3VmZmljaWVudCBtZW1vcnkuIHJldHVybiIsIF9fZnVuY19fKTsKLQkJCWtmcmVlKG5ld19mcmFtZSk7Ci0JCQltdXRleF91bmxvY2soJmNwcF9kZXYtPm11dGV4KTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJYXRvbWljX3NldCgmZnJhbWVfcWNtZC0+b25faGVhcCwgMSk7Ci0JCWZyYW1lX3FjbWQtPmNvbW1hbmQgPSBuZXdfZnJhbWU7Ci0JCWlmIChuZXdfZnJhbWUtPmZyYW1lX3R5cGUgPT0gTVNNX0NQUF9SRUFMVElNRV9GUkFNRSkgewotCQkJbXNtX2VucXVldWUoJmNwcF9kZXYtPnJlYWx0aW1lX3EsCi0JCQkJCQkmZnJhbWVfcWNtZC0+bGlzdF9mcmFtZSk7Ci0JCX0gZWxzZSBpZiAobmV3X2ZyYW1lLT5mcmFtZV90eXBlID09IE1TTV9DUFBfT0ZGTElORV9GUkFNRSkgewotCQkJbXNtX2VucXVldWUoJmNwcF9kZXYtPm9mZmxpbmVfcSwKLQkJCQkJCSZmcmFtZV9xY21kLT5saXN0X2ZyYW1lKTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IEludmFsaWQgZnJhbWUgdHlwZVxuIiwgX19mdW5jX18pOwotCQkJa2ZyZWUobmV3X2ZyYW1lKTsKLQkJCWtmcmVlKGZyYW1lX3FjbWQpOwotCQkJbXV0ZXhfdW5sb2NrKCZjcHBfZGV2LT5tdXRleCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfTVNNX0NQUF9HRVRfRVZFTlRQQVlMT0FEOiB7Ci0JCXN0cnVjdCBtc21fZGV2aWNlX3F1ZXVlICpxdWV1ZSA9ICZjcHBfZGV2LT5ldmVudERhdGFfcTsKLQkJc3RydWN0IG1zbV9xdWV1ZV9jbWQgKmV2ZW50X3FjbWQ7Ci0JCXN0cnVjdCBtc21fY3BwX2ZyYW1lX2luZm9fdCAqcHJvY2Vzc19mcmFtZTsKLQkJZXZlbnRfcWNtZCA9IG1zbV9kZXF1ZXVlKHF1ZXVlLCBsaXN0X2V2ZW50ZGF0YSk7Ci0JCXByb2Nlc3NfZnJhbWUgPSBldmVudF9xY21kLT5jb21tYW5kOwotCQlDUFBfREJHKCJmaWQgJWRcbiIsIHByb2Nlc3NfZnJhbWUtPmZyYW1lX2lkKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilpb2N0bF9wdHItPmlvY3RsX3B0ciwKLQkJCQlwcm9jZXNzX2ZyYW1lLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2NwcF9mcmFtZV9pbmZvX3QpKSkgewotCQkJCQltdXRleF91bmxvY2soJmNwcF9kZXYtPm11dGV4KTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJa2ZyZWUocHJvY2Vzc19mcmFtZSk7Ci0JCWtmcmVlKGV2ZW50X3FjbWQpOwotCQlicmVhazsKLQl9Ci0JfQotCW11dGV4X3VubG9jaygmY3BwX2Rldi0+bXV0ZXgpOwotCUNQUF9EQkcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IG1zbV9jcHBfc3Vic2NyaWJlX2V2ZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2ZoICpmaCwKLQlzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24gKnN1YikKLXsKLQlDUFBfREJHKCIlc1xuIiwgX19mdW5jX18pOwotCXJldHVybiB2NGwyX2V2ZW50X3N1YnNjcmliZShmaCwgc3ViLCBNQVhfQ1BQX1Y0bDJfRVZFTlRTKTsKLX0KLQotaW50IG1zbV9jcHBfdW5zdWJzY3JpYmVfZXZlbnQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfZmggKmZoLAotCXN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiAqc3ViKQotewotCUNQUF9EQkcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUoZmgsIHN1Yik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbXNtX2NwcF9zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmlvY3RsID0gbXNtX2NwcF9zdWJkZXZfaW9jdGwsCi0JLnN1YnNjcmliZV9ldmVudCA9IG1zbV9jcHBfc3Vic2NyaWJlX2V2ZW50LAotCS51bnN1YnNjcmliZV9ldmVudCA9IG1zbV9jcHBfdW5zdWJzY3JpYmVfZXZlbnQsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBtc21fY3BwX3N1YmRldl9vcHMgPSB7Ci0JLmNvcmUgPSAmbXNtX2NwcF9zdWJkZXZfY29yZV9vcHMsCi19OwotCi1zdGF0aWMgaW50IG1zbV9jcHBfZW5hYmxlX2RlYnVnZnMoc3RydWN0IGNwcF9kZXZpY2UgKmNwcF9kZXYpOwotCi1zdGF0aWMgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIG1zbV9jcHBfdjRsMl9zdWJkZXZfZm9wczsKLQotc3RhdGljIGxvbmcgbXNtX2NwcF9zdWJkZXZfZG9faW9jdGwoCi0Jc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gdmRldl90b192NGwyX3N1YmRldih2ZGV2KTsKLQlzdHJ1Y3QgdjRsMl9maCAqdmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFZJRElPQ19EUUVWRU5UOgotCQlpZiAoIShzZC0+ZmxhZ3MgJiBWNEwyX1NVQkRFVl9GTF9IQVNfRVZFTlRTKSkKLQkJCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0KLQkJcmV0dXJuIHY0bDJfZXZlbnRfZGVxdWV1ZSh2ZmgsIGFyZywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCi0JY2FzZSBWSURJT0NfU1VCU0NSSUJFX0VWRU5UOgotCQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChzZCwgY29yZSwgc3Vic2NyaWJlX2V2ZW50LCB2ZmgsIGFyZyk7Ci0KLQljYXNlIFZJRElPQ19VTlNVQlNDUklCRV9FVkVOVDoKLQkJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIHVuc3Vic2NyaWJlX2V2ZW50LCB2ZmgsIGFyZyk7Ci0KLQljYXNlIFZJRElPQ19NU01fQ1BQX0dFVF9JTlNUX0lORk86IHsKLQkJdWludDMyX3QgaTsKLQkJc3RydWN0IGNwcF9kZXZpY2UgKmNwcF9kZXYgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQkJc3RydWN0IG1zbV9jYW1lcmFfdjRsMl9pb2N0bF90ICppb2N0bF9wdHIgPSBhcmc7Ci0JCXN0cnVjdCBtc21fY3BwX2ZyYW1lX2luZm9fdCBpbnN0X2luZm87Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfQUNUSVZFX0NQUF9JTlNUQU5DRTsgaSsrKSB7Ci0JCQlpZiAoY3BwX2Rldi0+Y3BwX3N1YnNjcmliZV9saXN0W2ldLnZmaCA9PSB2ZmgpIHsKLQkJCQlpbnN0X2luZm8uaW5zdF9pZCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvcHlfdG9fdXNlcigKLQkJCQkodm9pZCBfX3VzZXIgKilpb2N0bF9wdHItPmlvY3RsX3B0ciwgJmluc3RfaW5mbywKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9jcHBfZnJhbWVfaW5mb190KSkpIHsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBpb2N0bCwgY21kLCBhcmcpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyBtc21fY3BwX3N1YmRldl9mb3BzX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCXJldHVybiB2aWRlb191c2VyY29weShmaWxlLCBjbWQsIGFyZywgbXNtX2NwcF9zdWJkZXZfZG9faW9jdGwpOwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBjcHBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgY3BwX2RldmljZSAqY3BwX2RldjsKLQlzdHJ1Y3QgbXNtX2NhbV9zdWJkZXZfaW5mbyBzZF9pbmZvOwotCWludCByYyA9IDA7Ci0JQ0RCRygiJXM6IGRldmljZSBpZCA9ICVkXG4iLCBfX2Z1bmNfXywgcGRldi0+aWQpOwotCWNwcF9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3BwX2RldmljZSksIEdGUF9LRVJORUwpOwotCWlmICghY3BwX2RldikgewotCQlwcl9lcnIoIiVzOiBubyBlbm91Z2ggbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQl2NGwyX3N1YmRldl9pbml0KCZjcHBfZGV2LT5zdWJkZXYsICZtc21fY3BwX3N1YmRldl9vcHMpOwotCWNwcF9kZXYtPnN1YmRldi5pbnRlcm5hbF9vcHMgPSAmbXNtX2NwcF9pbnRlcm5hbF9vcHM7Ci0Jc25wcmludGYoY3BwX2Rldi0+c3ViZGV2Lm5hbWUsIEFSUkFZX1NJWkUoY3BwX2Rldi0+c3ViZGV2Lm5hbWUpLAotCQkgImNwcCIpOwotCWNwcF9kZXYtPnN1YmRldi5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKLQljcHBfZGV2LT5zdWJkZXYuZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0VWRU5UUzsKLQl2NGwyX3NldF9zdWJkZXZkYXRhKCZjcHBfZGV2LT5zdWJkZXYsIGNwcF9kZXYpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsICZjcHBfZGV2LT5zdWJkZXYpOwotCW11dGV4X2luaXQoJmNwcF9kZXYtPm11dGV4KTsKLQotCWNwcF9kZXYtPnBkZXYgPSBwZGV2OwotCi0JbWVkaWFfZW50aXR5X2luaXQoJmNwcF9kZXYtPnN1YmRldi5lbnRpdHksIDAsIE5VTEwsIDApOwotCWNwcF9kZXYtPnN1YmRldi5lbnRpdHkudHlwZSA9IE1FRElBX0VOVF9UX0RFVk5PREVfVjRMOwotCWNwcF9kZXYtPnN1YmRldi5lbnRpdHkuZ3JvdXBfaWQgPSBDUFBfREVWOwotCWNwcF9kZXYtPnN1YmRldi5lbnRpdHkubmFtZSA9IHBkZXYtPm5hbWU7Ci0Jc2RfaW5mby5zZGV2X3R5cGUgPSBDUFBfREVWOwotCXNkX2luZm8uc2RfaW5kZXggPSBwZGV2LT5pZDsKLQltc21fY2FtX3JlZ2lzdGVyX3N1YmRldl9ub2RlKCZjcHBfZGV2LT5zdWJkZXYsICZzZF9pbmZvKTsKLQltc21fY3BwX3Y0bDJfc3ViZGV2X2ZvcHMub3duZXIgPSB2NGwyX3N1YmRldl9mb3BzLm93bmVyOwotCW1zbV9jcHBfdjRsMl9zdWJkZXZfZm9wcy5vcGVuID0gdjRsMl9zdWJkZXZfZm9wcy5vcGVuOwotCW1zbV9jcHBfdjRsMl9zdWJkZXZfZm9wcy51bmxvY2tlZF9pb2N0bCA9IG1zbV9jcHBfc3ViZGV2X2ZvcHNfaW9jdGw7Ci0JbXNtX2NwcF92NGwyX3N1YmRldl9mb3BzLnJlbGVhc2UgPSB2NGwyX3N1YmRldl9mb3BzLnJlbGVhc2U7Ci0JbXNtX2NwcF92NGwyX3N1YmRldl9mb3BzLnBvbGwgPSB2NGwyX3N1YmRldl9mb3BzLnBvbGw7Ci0KLQljcHBfZGV2LT5zdWJkZXYuZGV2bm9kZS0+Zm9wcyA9ICZtc21fY3BwX3Y0bDJfc3ViZGV2X2ZvcHM7Ci0JY3BwX2Rldi0+c3ViZGV2LmVudGl0eS5yZXZpc2lvbiA9IGNwcF9kZXYtPnN1YmRldi5kZXZub2RlLT5udW07Ci0JbXNtX2NwcF9lbmFibGVfZGVidWdmcyhjcHBfZGV2KTsKLQltc21fcXVldWVfaW5pdCgmY3BwX2Rldi0+ZXZlbnREYXRhX3EsICJldmVudGRhdGEiKTsKLQltc21fcXVldWVfaW5pdCgmY3BwX2Rldi0+b2ZmbGluZV9xLCAiZnJhbWUiKTsKLQltc21fcXVldWVfaW5pdCgmY3BwX2Rldi0+cmVhbHRpbWVfcSwgImZyYW1lIik7Ci0JbXNtX3F1ZXVlX2luaXQoJmNwcF9kZXYtPnByb2Nlc3NpbmdfcSwgImZyYW1lIik7Ci0JY3BwX2Rldi0+Y3BwX29wZW5fY250ID0gMDsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY3BwX2RyaXZlciA9IHsKLQkucHJvYmUgPSBjcHBfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBNU01fQ1BQX0RSVl9OQU1FLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX2NwcF9pbml0X21vZHVsZSh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmNwcF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXNtX2NwcF9leGl0X21vZHVsZSh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjcHBfZHJpdmVyKTsKLX0KLQotc3RhdGljIGludCBtc21fY3BwX2RlYnVnZnNfc3RyZWFtX3Modm9pZCAqZGF0YSwgdTY0IHZhbCkKLXsKLQlzdHJ1Y3QgY3BwX2RldmljZSAqY3BwX2RldiA9IGRhdGE7Ci0JQ1BQX0RCRygiQ1BQIHByb2Nlc3NpbmcgZnJhbWUgRVxuIik7Ci0Jd2hpbGUgKDEpIHsKLQkJbXV0ZXhfbG9jaygmY3BwX2Rldi0+bXV0ZXgpOwotCQltc21fY3BwX25vdGlmeV9mcmFtZV9kb25lKGNwcF9kZXYpOwotCQltc21fY3BwX3NlbmRfZnJhbWVfdG9faGFyZHdhcmUoY3BwX2Rldik7Ci0JCW11dGV4X3VubG9jaygmY3BwX2Rldi0+bXV0ZXgpOwotCQltc2xlZXAoMjApOwotCX0KLQlDUFBfREJHKCJDUFAgcHJvY2Vzc2luZyBmcmFtZSBYXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoY3BwX2RlYnVnZnNfc3RyZWFtLCBOVUxMLAotCQkJbXNtX2NwcF9kZWJ1Z2ZzX3N0cmVhbV9zLCAiJWxsdVxuIik7Ci0KLXN0YXRpYyBpbnQgbXNtX2NwcF9lbmFibGVfZGVidWdmcyhzdHJ1Y3QgY3BwX2RldmljZSAqY3BwX2RldikKLXsKLQlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2Jhc2U7Ci0JZGVidWdmc19iYXNlID0gZGVidWdmc19jcmVhdGVfZGlyKCJtc21fY2FtZXJhIiwgTlVMTCk7Ci0JaWYgKCFkZWJ1Z2ZzX2Jhc2UpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ0ZXN0IiwgU19JUlVHTyB8IFNfSVdVU1IsIGRlYnVnZnNfYmFzZSwKLQkJCSh2b2lkICopY3BwX2RldiwgJmNwcF9kZWJ1Z2ZzX3N0cmVhbSkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0dXJuIDA7Ci19Ci0KLW1vZHVsZV9pbml0KG1zbV9jcHBfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQobXNtX2NwcF9leGl0X21vZHVsZSk7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1TTSBDUFAgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3BwL21zbV9jcHAuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jcHAvbXNtX2NwcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTg1NTY5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jcHAvbXNtX2NwcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgotCi0jZGVmaW5lIE1BWF9BQ1RJVkVfQ1BQX0lOU1RBTkNFIDgKLSNkZWZpbmUgTUFYX0NQUF9QUk9DRVNTSU5HX0ZSQU1FIDIKLSNkZWZpbmUgTUFYX0NQUF9WNGwyX0VWRU5UUyAzMAotCi0jZGVmaW5lIE1TTV9DUFBfTUlDUk9fQkFTRSAgICAgICAgICAweDQwMDAKLSNkZWZpbmUgTVNNX0NQUF9NSUNST19IV19WRVJTSU9OICAgIDB4MDAwMAotI2RlZmluZSBNU01fQ1BQX01JQ1JPX0lSUUdFTl9TVEFUICAgMHgwMDA0Ci0jZGVmaW5lIE1TTV9DUFBfTUlDUk9fSVJRR0VOX0NMUiAgICAweDAwMDgKLSNkZWZpbmUgTVNNX0NQUF9NSUNST19JUlFHRU5fTUFTSyAgIDB4MDAwQwotI2RlZmluZSBNU01fQ1BQX01JQ1JPX0ZJRk9fVFhfREFUQSAgMHgwMDEwCi0jZGVmaW5lIE1TTV9DUFBfTUlDUk9fRklGT19UWF9TVEFUICAweDAwMTQKLSNkZWZpbmUgTVNNX0NQUF9NSUNST19GSUZPX1JYX0RBVEEgIDB4MDAxOAotI2RlZmluZSBNU01fQ1BQX01JQ1JPX0ZJRk9fUlhfU1RBVCAgMHgwMDFDCi0jZGVmaW5lIE1TTV9DUFBfTUlDUk9fQk9PVF9TVEFSVCAgICAweDAwMjAKLSNkZWZpbmUgTVNNX0NQUF9NSUNST19CT09UX0xET1JHICAgIDB4MDAyNAotI2RlZmluZSBNU01fQ1BQX01JQ1JPX0NMS0VOX0NUTCAgICAgMHgwMDMwCi0KLXN0cnVjdCBjcHBfc3Vic2NyaWJlX2luZm8gewotCXN0cnVjdCB2NGwyX2ZoICp2Zmg7Ci0JdWludDMyX3QgYWN0aXZlOwotfTsKLQotc3RydWN0IGNwcF9kZXZpY2UgewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0Jc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmlycTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmlvOwotCXZvaWQgX19pb21lbSAqYmFzZTsKLQlzdHJ1Y3QgY2xrICpjcHBfY2xrWzJdOwotCXN0cnVjdCBtdXRleCBtdXRleDsKLQotCXN0cnVjdCBjcHBfc3Vic2NyaWJlX2luZm8gY3BwX3N1YnNjcmliZV9saXN0W01BWF9BQ1RJVkVfQ1BQX0lOU1RBTkNFXTsKLQl1aW50MzJfdCBjcHBfb3Blbl9jbnQ7Ci0KLQlzdHJ1Y3QgbXNtX2RldmljZV9xdWV1ZSBldmVudERhdGFfcTsgLypWNEwyIEV2ZW50IFBheWxvYWQgUXVldWUqLwotCi0JLypPZmZsaW5lIEZyYW1lIFF1ZXVlCi0JICBwcm9jZXNzIHdoZW4gcmVhbHRpbWUgcXVldWUgaXMgZW1wdHkqLwotCXN0cnVjdCBtc21fZGV2aWNlX3F1ZXVlIG9mZmxpbmVfcTsKLQkvKlJlYWx0aW1lIEZyYW1lIFF1ZXVlCi0JICBwcm9jZXNzIHdpdGggaGlnaGVzdCBwcmlvcml0eSovCi0Jc3RydWN0IG1zbV9kZXZpY2VfcXVldWUgcmVhbHRpbWVfcTsKLQkvKlByb2Nlc3NpbmcgUXVldWUKLQkgIHN0b3JlIGZyYW1lIGluZm8gZm9yIGZyYW1lcyBzZW50IHRvIG1pY3JvY29udHJvbGxlciovCi0Jc3RydWN0IG1zbV9kZXZpY2VfcXVldWUgcHJvY2Vzc2luZ19xOwotfTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jc2kvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyODQ1MTEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUdDQ19WRVJTSU9OICAgICAgOj0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChQV0QpL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2ggJChDUk9TU19DT01QSUxFKWdjYykKLWNjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZXJ2ZXIKLWlmZXEgKCQoQ09ORklHX01TTV9DU0kyMF9IRUFERVIpLHkpCi0gIGNjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jc2kvaW5jbHVkZS9jc2kyLjAKLWVsc2UgaWZlcSAoJChDT05GSUdfTVNNX0NTSTMwX0hFQURFUikseSkKLSAgY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9pbmNsdWRlL2NzaTMuMAotZW5kaWYKLW9iai0kKENPTkZJR19NU01fQ1NJMl9SRUdJU1RFUikgKz0gbXNtX2NzaTJfcmVnaXN0ZXIubwotb2JqLSQoQ09ORklHX01TTV9DU0lQSFkpICs9IG1zbV9jc2lwaHkubwotb2JqLSQoQ09ORklHX01TTV9DU0lEKSArPSBtc21fY3NpZC5vCi1vYmotJChDT05GSUdfTVNNX0lTUElGKSArPSBtc21faXNwaWYubwotb2JqLSQoQ09ORklHX0FSQ0hfTVNNODk2MCkgKz0gbXNtX2NzaTJfcmVnaXN0ZXIubyBtc21fY3NpcGh5Lm8gbXNtX2NzaWQubyBtc21faXNwaWYubwotb2JqLSQoQ09ORklHX0FSQ0hfTVNNN1gyN0EpICs9IG1zbV9jc2ljX3JlZ2lzdGVyLm8gbXNtX2NzaWMubwotb2JqLSQoQ09ORklHX0FSQ0hfTVNNOFg2MCkgKz0gbXNtX2NzaWNfcmVnaXN0ZXIubyBtc21fY3NpYy5vCi1vYmotJChDT05GSUdfQVJDSF9NU003WDMwKSArPSBtc21fY3NpY19yZWdpc3Rlci5vIG1zbV9jc2ljLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jc2kvaW5jbHVkZS9jc2kyLjAvbXNtX2NzaWRfaHdyZWcuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jc2kvaW5jbHVkZS9jc2kyLjAvbXNtX2NzaWRfaHdyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M4YTljZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL2luY2x1ZGUvY3NpMi4wL21zbV9jc2lkX2h3cmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBNU01fQ1NJRF9IV1JFR19ICi0jZGVmaW5lIE1TTV9DU0lEX0hXUkVHX0gKLQotLyogTUlQSQlDU0lEIHJlZ2lzdGVycyAqLwotI2RlZmluZSBDU0lEX0hXX1ZFUlNJT05fQUREUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MAotI2RlZmluZSBDU0lEX0NPUkVfQ1RSTF8wX0FERFIgICAgICAgICAgICAgICAgICAgICAgIDB4NAotI2RlZmluZSBDU0lEX0NPUkVfQ1RSTF8xX0FERFIgICAgICAgICAgICAgICAgICAgICAgIDB4NAotI2RlZmluZSBDU0lEX1JTVF9DTURfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OAotI2RlZmluZSBDU0lEX0NJRF9MVVRfVkNfMF9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4YwotI2RlZmluZSBDU0lEX0NJRF9MVVRfVkNfMV9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgQ1NJRF9DSURfTFVUX1ZDXzJfQUREUiAgICAgICAgICAgICAgICAgICAgICAweDE0Ci0jZGVmaW5lIENTSURfQ0lEX0xVVF9WQ18zX0FERFIgICAgICAgICAgICAgICAgICAgICAgMHgxOAotI2RlZmluZSBDU0lEX0NJRF9uX0NGR19BRERSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMKLSNkZWZpbmUgQ1NJRF9JUlFfQ0xFQVJfQ01EX0FERFIgICAgICAgICAgICAgICAgICAgICAweDVjCi0jZGVmaW5lIENTSURfSVJRX01BU0tfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MAotI2RlZmluZSBDU0lEX0lSUV9TVEFUVVNfQUREUiAgICAgICAgICAgICAgICAgICAgICAgIDB4NjQKLSNkZWZpbmUgQ1NJRF9DQVBUVVJFRF9VTk1BUFBFRF9MT05HX1BLVF9IRFJfQUREUiAgICAweDY4Ci0jZGVmaW5lIENTSURfQ0FQVFVSRURfTU1BUFBFRF9MT05HX1BLVF9IRFJfQUREUiAgICAgMHg2YwotI2RlZmluZSBDU0lEX0NBUFRVUkVEX1NIT1JUX1BLVF9BRERSICAgICAgICAgICAgICAgIDB4NzAKLSNkZWZpbmUgQ1NJRF9DQVBUVVJFRF9MT05HX1BLVF9IRFJfQUREUiAgICAgICAgICAgICAweDc0Ci0jZGVmaW5lIENTSURfQ0FQVFVSRURfTE9OR19QS1RfRlRSX0FERFIgICAgICAgICAgICAgMHg3OAotI2RlZmluZSBDU0lEX1BJRl9NSVNSX0RMMF9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4N0MKLSNkZWZpbmUgQ1NJRF9QSUZfTUlTUl9ETDFfQUREUiAgICAgICAgICAgICAgICAgICAgICAweDgwCi0jZGVmaW5lIENTSURfUElGX01JU1JfREwyX0FERFIgICAgICAgICAgICAgICAgICAgICAgMHg4NAotI2RlZmluZSBDU0lEX1BJRl9NSVNSX0RMM19BRERSICAgICAgICAgICAgICAgICAgICAgIDB4ODgKLSNkZWZpbmUgQ1NJRF9TVEFUU19UT1RBTF9QS1RTX1JDVkRfQUREUiAgICAgICAgICAgICAweDhDCi0jZGVmaW5lIENTSURfU1RBVFNfRUNDX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MAotI2RlZmluZSBDU0lEX1NUQVRTX0NSQ19BRERSICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTQKLSNkZWZpbmUgQ1NJRF9UR19DVFJMX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDlDCi0jZGVmaW5lIENTSURfVEdfVkNfQ0ZHX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMAotI2RlZmluZSBDU0lEX1RHX0RUX25fQ0ZHXzBfQUREUiAgICAgICAgICAgICAgICAgICAgIDB4QTgKLSNkZWZpbmUgQ1NJRF9UR19EVF9uX0NGR18xX0FERFIgICAgICAgICAgICAgICAgICAgICAweEFDCi0jZGVmaW5lIENTSURfVEdfRFRfbl9DRkdfMl9BRERSICAgICAgICAgICAgICAgICAgICAgMHhCMAotI2RlZmluZSBDU0lEX1JTVF9ET05FX0lSUV9CSVRTSElGVCAgICAgICAgICAgICAgICAgIDExCi0jZGVmaW5lIENTSURfUlNUX1NUQl9BTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RkZGCi0jZGVmaW5lIENTSURfRExfSU5QVVRfU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgMHgyCi0jZGVmaW5lIENTSURfUEhZX1NFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTcKLSNkZWZpbmUgQ1NJRF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDExCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9pbmNsdWRlL2NzaTIuMC9tc21fY3NpcGh5X2h3cmVnLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL2luY2x1ZGUvY3NpMi4wL21zbV9jc2lwaHlfaHdyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI2MzQ4My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL2luY2x1ZGUvY3NpMi4wL21zbV9jc2lwaHlfaHdyZWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIE1TTV9DU0lQSFlfSFdSRUdfSAotI2RlZmluZSBNU01fQ1NJUEhZX0hXUkVHX0gKLQotLypNSVBJIENTSSBQSFkgcmVnaXN0ZXJzKi8KLSNkZWZpbmUgTUlQSV9DU0lQSFlfSFdfVkVSU0lPTl9BRERSICAgICAgICAgICAgICAweDE4MAotI2RlZmluZSBNSVBJX0NTSVBIWV9MTm5fQ0ZHMV9BRERSICAgICAgICAgICAgICAgIDB4MAotI2RlZmluZSBNSVBJX0NTSVBIWV9MTm5fQ0ZHMl9BRERSICAgICAgICAgICAgICAgIDB4NAotI2RlZmluZSBNSVBJX0NTSVBIWV9MTm5fQ0ZHM19BRERSICAgICAgICAgICAgICAgIDB4OAotI2RlZmluZSBNSVBJX0NTSVBIWV9MTm5fQ0ZHNF9BRERSICAgICAgICAgICAgICAgIDB4QwotI2RlZmluZSBNSVBJX0NTSVBIWV9MTm5fQ0ZHNV9BRERSICAgICAgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgTUlQSV9DU0lQSFlfTE5DS19DRkcxX0FERFIgICAgICAgICAgICAgICAweDEwMAotI2RlZmluZSBNSVBJX0NTSVBIWV9MTkNLX0NGRzJfQUREUiAgICAgICAgICAgICAgIDB4MTA0Ci0jZGVmaW5lIE1JUElfQ1NJUEhZX0xOQ0tfQ0ZHM19BRERSICAgICAgICAgICAgICAgMHgxMDgKLSNkZWZpbmUgTUlQSV9DU0lQSFlfTE5DS19DRkc0X0FERFIgICAgICAgICAgICAgICAweDEwQwotI2RlZmluZSBNSVBJX0NTSVBIWV9MTkNLX0NGRzVfQUREUiAgICAgICAgICAgICAgIDB4MTEwCi0jZGVmaW5lIE1JUElfQ1NJUEhZX0xOQ0tfTUlTQzFfQUREUiAgICAgICAgICAgICAgMHgxMjgKLSNkZWZpbmUgTUlQSV9DU0lQSFlfR0xCTF9SRVNFVF9BRERSICAgICAgICAgICAgICAweDE0MAotI2RlZmluZSBNSVBJX0NTSVBIWV9HTEJMX1BXUl9DRkdfQUREUiAgICAgICAgICAgIDB4MTQ0Ci0jZGVmaW5lIE1JUElfQ1NJUEhZX0dMQkxfSVJRX0NNRF9BRERSICAgICAgICAgICAgMHgxNjQKLSNkZWZpbmUgTUlQSV9DU0lQSFlfSU5URVJSVVBUX1NUQVRVUzBfQUREUiAgICAgICAweDE4MAotI2RlZmluZSBNSVBJX0NTSVBIWV9JTlRFUlJVUFRfTUFTSzBfQUREUiAgICAgICAgIDB4MUEwCi0jZGVmaW5lIE1JUElfQ1NJUEhZX0lOVEVSUlVQVF9NQVNLX1ZBTCAgICAgICAgICAgMHg2RgotI2RlZmluZSBNSVBJX0NTSVBIWV9JTlRFUlJVUFRfTUFTS19BRERSICAgICAgICAgIDB4MUE0Ci0jZGVmaW5lIE1JUElfQ1NJUEhZX0lOVEVSUlVQVF9DTEVBUjBfQUREUiAgICAgICAgMHgxQzAKLSNkZWZpbmUgTUlQSV9DU0lQSFlfSU5URVJSVVBUX0NMRUFSX0FERFIgICAgICAgICAweDFDNAotI2RlZmluZSBNSVBJX0NTSVBIWV9NT0RFX0NPTkZJR19TSElGVCAgICAgICAgICAgIDB4NAotI2RlZmluZSBNSVBJX0NTSVBIWV9HTEJMX1RfSU5JVF9DRkcwX0FERFIgICAgICAgIDB4MUUwCi0jZGVmaW5lIE1JUElfQ1NJUEhZX1RfV0FLRVVQX0NGRzBfQUREUiAgICAgICAgICAgMHgxRTgKLSNkZWZpbmUgQ1NJUEhZX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL2luY2x1ZGUvY3NpMi4wL21zbV9pc3BpZl9od3JlZy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9pbmNsdWRlL2NzaTIuMC9tc21faXNwaWZfaHdyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg2NGQ0MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL2luY2x1ZGUvY3NpMi4wL21zbV9pc3BpZl9od3JlZy5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgTVNNX0lTUElGX0hXUkVHX0gKLSNkZWZpbmUgTVNNX0lTUElGX0hXUkVHX0gKLQotCi0vKiBJU1BJRiByZWdpc3RlcnMgKi8KLQotI2RlZmluZSBJU1BJRl9SU1RfQ01EX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIElTUElGX1JTVF9DTURfMV9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4MDAKLSNkZWZpbmUgSVNQSUZfSU5URl9DTURfQUREUiAgICAgICAgICAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBJU1BJRl9JTlRGX0NNRF8xX0FERFIgICAgICAgICAgICAgICAgICAgICAweDMwCi0jZGVmaW5lIElTUElGX0NUUkxfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgSVNQSUZfSU5QVVRfU0VMX0FERFIgICAgICAgICAgICAgICAgICAgICAgMHgwQwotI2RlZmluZSBJU1BJRl9QSVhfMF9JTlRGX0NJRF9NQVNLX0FERFIgICAgICAgICAgICAweDEwCi0jZGVmaW5lIElTUElGX1JESV8wX0lOVEZfQ0lEX01BU0tfQUREUiAgICAgICAgICAgIDB4MTQKLSNkZWZpbmUgSVNQSUZfUElYXzFfSU5URl9DSURfTUFTS19BRERSICAgICAgICAgICAgMHgzOAotI2RlZmluZSBJU1BJRl9SRElfMV9JTlRGX0NJRF9NQVNLX0FERFIgICAgICAgICAgICAweDNDCi0jZGVmaW5lIElTUElGX1JESV8yX0lOVEZfQ0lEX01BU0tfQUREUiAgICAgICAgICAgIDB4NDQKLSNkZWZpbmUgSVNQSUZfUElYXzBfU1RBVFVTX0FERFIgICAgICAgICAgICAgICAgICAgMHgyNAotI2RlZmluZSBJU1BJRl9SRElfMF9TVEFUVVNfQUREUiAgICAgICAgICAgICAgICAgICAweDI4Ci0jZGVmaW5lIElTUElGX1BJWF8xX1NUQVRVU19BRERSICAgICAgICAgICAgICAgICAgIDB4NjAKLSNkZWZpbmUgSVNQSUZfUkRJXzFfU1RBVFVTX0FERFIgICAgICAgICAgICAgICAgICAgMHg2NAotI2RlZmluZSBJU1BJRl9SRElfMl9TVEFUVVNfQUREUiAgICAgICAgICAgICAgICAgICAweDZDCi0jZGVmaW5lIElTUElGX0lSUV9NQVNLX0FERFIgICAgICAgICAgICAgICAgICAgICAweDAxMDAKLSNkZWZpbmUgSVNQSUZfSVJRX0NMRUFSX0FERFIgICAgICAgICAgICAgICAgICAgIDB4MDEwNAotI2RlZmluZSBJU1BJRl9JUlFfU1RBVFVTX0FERFIgICAgICAgICAgICAgICAgICAgMHgwMTA4Ci0jZGVmaW5lIElTUElGX0lSUV9NQVNLXzFfQUREUiAgICAgICAgICAgICAgICAgICAweDAxMEMKLSNkZWZpbmUgSVNQSUZfSVJRX0NMRUFSXzFfQUREUiAgICAgICAgICAgICAgICAgIDB4MDExMAotI2RlZmluZSBJU1BJRl9JUlFfU1RBVFVTXzFfQUREUiAgICAgICAgICAgICAgICAgMHgwMTE0Ci0jZGVmaW5lIElTUElGX0lSUV9NQVNLXzJfQUREUiAgICAgICAgICAgICAgICAgICAweDAxMTgKLSNkZWZpbmUgSVNQSUZfSVJRX0NMRUFSXzJfQUREUiAgICAgICAgICAgICAgICAgIDB4MDExQwotI2RlZmluZSBJU1BJRl9JUlFfU1RBVFVTXzJfQUREUiAgICAgICAgICAgICAgICAgMHgwMTIwCi0jZGVmaW5lIElTUElGX0lSUV9HTE9CQUxfQ0xFQVJfQ01EX0FERFIgICAgICAgICAweDAxMjQKLQotLypJU1BJRiBSRVNFVCBCSVRTKi8KLQotI2RlZmluZSBWRkVfQ0xLX0RPTUFJTl9SU1QgICAgICAgICAgIDMxCi0jZGVmaW5lIFJESV9DTEtfRE9NQUlOX1JTVCAgICAgICAgICAgMzAKLSNkZWZpbmUgUElYX0NMS19ET01BSU5fUlNUICAgICAgICAgICAyOQotI2RlZmluZSBBSEJfQ0xLX0RPTUFJTl9SU1QgICAgICAgICAgIDI4Ci0jZGVmaW5lIFJESV8xX0NMS19ET01BSU5fUlNUICAgICAgICAgMjcKLSNkZWZpbmUgUkRJXzJfVkZFX1JTVF9TVEIgICAgICAgICAgICAxOQotI2RlZmluZSBSRElfMl9DU0lEX1JTVF9TVEIgICAgICAgICAgIDE4Ci0jZGVmaW5lIFJESV8xX1ZGRV9SU1RfU1RCICAgICAgICAgICAgMTMKLSNkZWZpbmUgUkRJXzFfQ1NJRF9SU1RfU1RCICAgICAgICAgICAxMgotI2RlZmluZSBSRElfMF9WRkVfUlNUX1NUQiAgICAgICAgICAgIDcKLSNkZWZpbmUgUkRJXzBfQ1NJRF9SU1RfU1RCICAgICAgICAgICA2Ci0jZGVmaW5lIFBJWF8xX1ZGRV9SU1RfU1RCICAgICAgICAgICAgMTAKLSNkZWZpbmUgUElYXzFfQ1NJRF9SU1RfU1RCICAgICAgICAgICA5Ci0jZGVmaW5lIFBJWF8wX1ZGRV9SU1RfU1RCICAgICAgICAgICAgNAotI2RlZmluZSBQSVhfMF9DU0lEX1JTVF9TVEIgICAgICAgICAgIDMKLSNkZWZpbmUgU1dfUkVHX1JTVF9TVEIgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE1JU0NfTE9HSUNfUlNUX1NUQiAgICAgICAgICAgMQotI2RlZmluZSBTVFJPQkVEX1JTVF9FTiAgICAgICAgICAgICAgIDAKLQotI2RlZmluZSBJU1BJRl9SU1RfQ01EX01BU0sgICAgICAgICAgIDB4RkUwRjFGRkYKLSNkZWZpbmUgSVNQSUZfUlNUX0NNRF8xX01BU0sgICAgICAgICAweEZDMEYxRkY5Ci0KLSNkZWZpbmUgUElYX0lOVEZfMF9PVkVSRkxPV19JUlEgICAgICAxMgotI2RlZmluZSBSQVdfSU5URl8wX09WRVJGTE9XX0lSUSAgICAgIDI1Ci0jZGVmaW5lIFJBV19JTlRGXzFfT1ZFUkZMT1dfSVJRICAgICAgMjUKLSNkZWZpbmUgUkFXX0lOVEZfMl9PVkVSRkxPV19JUlEgICAgICAxMgotI2RlZmluZSBSRVNFVF9ET05FX0lSUSAgICAgICAgICAgICAgIDI3Ci0KLSNkZWZpbmUgSVNQSUZfSVJRX1NUQVRVU19NQVNLICAgICAgICAweDBBNDkzMjQ5Ci0jZGVmaW5lIElTUElGX0lSUV9TVEFUVVNfMV9NQVNLICAgICAgMHgwMjQ5MzI0OQotI2RlZmluZSBJU1BJRl9JUlFfU1RBVFVTXzJfTUFTSyAgICAgIDB4MDAwMDEyNDkKLQotI2RlZmluZSBJU1BJRl9JUlFfU1RBVFVTX1BJWF9TT0ZfTUFTSwkweDI0OQotI2RlZmluZSBJU1BJRl9JUlFfU1RBVFVTX1JESTBfU09GX01BU0sJMHg0OTIwMDAKLSNkZWZpbmUgSVNQSUZfSVJRX1NUQVRVU19SREkxX1NPRl9NQVNLCTB4NDkyMDAwCi0jZGVmaW5lIElTUElGX0lSUV9TVEFUVVNfUkRJMl9TT0ZfTUFTSwkweDI0OQotCi0jZGVmaW5lIElTUElGX0lSUV9TVEFUVVNfU09GX01BU0sJMHg0OTIyNDkKLSNkZWZpbmUgSVNQSUZfSVJRX0dMT0JBTF9DTEVBUl9DTUQgICAgIDB4MQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jc2kvaW5jbHVkZS9jc2kzLjAvbXNtX2NzaWRfaHdyZWcuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jc2kvaW5jbHVkZS9jc2kzLjAvbXNtX2NzaWRfaHdyZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzNWMyYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL2luY2x1ZGUvY3NpMy4wL21zbV9jc2lkX2h3cmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBNU01fQ1NJRF9IV1JFR19ICi0jZGVmaW5lIE1TTV9DU0lEX0hXUkVHX0gKLQotLyogTUlQSQlDU0lEIHJlZ2lzdGVycyAqLwotI2RlZmluZSBDU0lEX0hXX1ZFUlNJT05fQUREUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MAotI2RlZmluZSBDU0lEX0NPUkVfQ1RSTF8wX0FERFIgICAgICAgICAgICAgICAgICAgICAgIDB4NAotI2RlZmluZSBDU0lEX0NPUkVfQ1RSTF8xX0FERFIgICAgICAgICAgICAgICAgICAgICAgIDB4OAotI2RlZmluZSBDU0lEX1JTVF9DTURfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QwotI2RlZmluZSBDU0lEX0NJRF9MVVRfVkNfMF9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgQ1NJRF9DSURfTFVUX1ZDXzFfQUREUiAgICAgICAgICAgICAgICAgICAgICAweDE0Ci0jZGVmaW5lIENTSURfQ0lEX0xVVF9WQ18yX0FERFIgICAgICAgICAgICAgICAgICAgICAgMHgxOAotI2RlZmluZSBDU0lEX0NJRF9MVVRfVkNfM19BRERSICAgICAgICAgICAgICAgICAgICAgIDB4MUMKLSNkZWZpbmUgQ1NJRF9DSURfbl9DRkdfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIENTSURfSVJRX0NMRUFSX0NNRF9BRERSICAgICAgICAgICAgICAgICAgICAgMHg2MAotI2RlZmluZSBDU0lEX0lSUV9NQVNLX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjQKLSNkZWZpbmUgQ1NJRF9JUlFfU1RBVFVTX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAweDY4Ci0jZGVmaW5lIENTSURfQ0FQVFVSRURfVU5NQVBQRURfTE9OR19QS1RfSERSX0FERFIgICAgMHg2QwotI2RlZmluZSBDU0lEX0NBUFRVUkVEX01NQVBQRURfTE9OR19QS1RfSERSX0FERFIgICAgIDB4NzAKLSNkZWZpbmUgQ1NJRF9DQVBUVVJFRF9TSE9SVF9QS1RfQUREUiAgICAgICAgICAgICAgICAweDc0Ci0jZGVmaW5lIENTSURfQ0FQVFVSRURfTE9OR19QS1RfSERSX0FERFIgICAgICAgICAgICAgMHg3OAotI2RlZmluZSBDU0lEX0NBUFRVUkVEX0xPTkdfUEtUX0ZUUl9BRERSICAgICAgICAgICAgIDB4N0MKLSNkZWZpbmUgQ1NJRF9QSUZfTUlTUl9ETDBfQUREUiAgICAgICAgICAgICAgICAgICAgICAweDgwCi0jZGVmaW5lIENTSURfUElGX01JU1JfREwxX0FERFIgICAgICAgICAgICAgICAgICAgICAgMHg4NAotI2RlZmluZSBDU0lEX1BJRl9NSVNSX0RMMl9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4ODgKLSNkZWZpbmUgQ1NJRF9QSUZfTUlTUl9ETDNfQUREUiAgICAgICAgICAgICAgICAgICAgICAweDhDCi0jZGVmaW5lIENTSURfU1RBVFNfVE9UQUxfUEtUU19SQ1ZEX0FERFIgICAgICAgICAgICAgMHg5MAotI2RlZmluZSBDU0lEX1NUQVRTX0VDQ19BRERSICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTQKLSNkZWZpbmUgQ1NJRF9TVEFUU19DUkNfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAweDk4Ci0jZGVmaW5lIENTSURfVEdfQ1RSTF9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMAotI2RlZmluZSBDU0lEX1RHX1ZDX0NGR19BRERSICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTQKLSNkZWZpbmUgQ1NJRF9UR19EVF9uX0NGR18wX0FERFIgICAgICAgICAgICAgICAgICAgICAweEFDCi0jZGVmaW5lIENTSURfVEdfRFRfbl9DRkdfMV9BRERSICAgICAgICAgICAgICAgICAgICAgMHhCMAotI2RlZmluZSBDU0lEX1RHX0RUX25fQ0ZHXzJfQUREUiAgICAgICAgICAgICAgICAgICAgIDB4QjQKLSNkZWZpbmUgQ1NJRF9SU1RfRE9ORV9JUlFfQklUU0hJRlQgICAgICAgICAgICAgICAgICAxMQotI2RlZmluZSBDU0lEX1JTVF9TVEJfQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0ZGRgotI2RlZmluZSBDU0lEX0RMX0lOUFVUX1NFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDB4NAotI2RlZmluZSBDU0lEX1BIWV9TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDE3Ci0jZGVmaW5lIENTSURfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwMDAwMAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jc2kvaW5jbHVkZS9jc2kzLjAvbXNtX2NzaXBoeV9od3JlZy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9pbmNsdWRlL2NzaTMuMC9tc21fY3NpcGh5X2h3cmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOTA3MzEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9pbmNsdWRlL2NzaTMuMC9tc21fY3NpcGh5X2h3cmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBNU01fQ1NJUEhZX0hXUkVHX0gKLSNkZWZpbmUgTVNNX0NTSVBIWV9IV1JFR19ICi0KLS8qTUlQSSBDU0kgUEhZIHJlZ2lzdGVycyovCi0jZGVmaW5lIE1JUElfQ1NJUEhZX0xObl9DRkcxX0FERFIgICAgICAgICAgICAgICAgMHgwCi0jZGVmaW5lIE1JUElfQ1NJUEhZX0xObl9DRkcyX0FERFIgICAgICAgICAgICAgICAgMHg0Ci0jZGVmaW5lIE1JUElfQ1NJUEhZX0xObl9DRkczX0FERFIgICAgICAgICAgICAgICAgMHg4Ci0jZGVmaW5lIE1JUElfQ1NJUEhZX0xObl9DRkc0X0FERFIgICAgICAgICAgICAgICAgMHhDCi0jZGVmaW5lIE1JUElfQ1NJUEhZX0xObl9DRkc1X0FERFIgICAgICAgICAgICAgICAgMHgxMAotI2RlZmluZSBNSVBJX0NTSVBIWV9MTkNLX0NGRzFfQUREUiAgICAgICAgICAgICAgIDB4MTAwCi0jZGVmaW5lIE1JUElfQ1NJUEhZX0xOQ0tfQ0ZHMl9BRERSICAgICAgICAgICAgICAgMHgxMDQKLSNkZWZpbmUgTUlQSV9DU0lQSFlfTE5DS19DRkczX0FERFIgICAgICAgICAgICAgICAweDEwOAotI2RlZmluZSBNSVBJX0NTSVBIWV9MTkNLX0NGRzRfQUREUiAgICAgICAgICAgICAgIDB4MTBDCi0jZGVmaW5lIE1JUElfQ1NJUEhZX0xOQ0tfQ0ZHNV9BRERSICAgICAgICAgICAgICAgMHgxMTAKLSNkZWZpbmUgTUlQSV9DU0lQSFlfTE5DS19NSVNDMV9BRERSICAgICAgICAgICAgICAweDEyOAotI2RlZmluZSBNSVBJX0NTSVBIWV9HTEJMX1JFU0VUX0FERFIgICAgICAgICAgICAgIDB4MTQwCi0jZGVmaW5lIE1JUElfQ1NJUEhZX0dMQkxfUFdSX0NGR19BRERSICAgICAgICAgICAgMHgxNDQKLSNkZWZpbmUgTUlQSV9DU0lQSFlfR0xCTF9JUlFfQ01EX0FERFIgICAgICAgICAgICAweDE2NAotI2RlZmluZSBNSVBJX0NTSVBIWV9IV19WRVJTSU9OX0FERFIgICAgICAgICAgICAgIDB4MTg4Ci0jZGVmaW5lIE1JUElfQ1NJUEhZX0lOVEVSUlVQVF9TVEFUVVMwX0FERFIgICAgICAgMHgxOEMKLSNkZWZpbmUgTUlQSV9DU0lQSFlfSU5URVJSVVBUX01BU0swX0FERFIgICAgICAgICAweDFBQwotI2RlZmluZSBNSVBJX0NTSVBIWV9JTlRFUlJVUFRfTUFTS19WQUwgICAgICAgICAgIDB4M0YKLSNkZWZpbmUgTUlQSV9DU0lQSFlfSU5URVJSVVBUX01BU0tfQUREUiAgICAgICAgICAweDFBQwotI2RlZmluZSBNSVBJX0NTSVBIWV9JTlRFUlJVUFRfQ0xFQVIwX0FERFIgICAgICAgIDB4MUNDCi0jZGVmaW5lIE1JUElfQ1NJUEhZX0lOVEVSUlVQVF9DTEVBUl9BRERSICAgICAgICAgMHgxQ0MKLSNkZWZpbmUgTUlQSV9DU0lQSFlfTU9ERV9DT05GSUdfU0hJRlQgICAgICAgICAgICAweDQKLSNkZWZpbmUgTUlQSV9DU0lQSFlfR0xCTF9UX0lOSVRfQ0ZHMF9BRERSICAgICAgICAweDFFQwotI2RlZmluZSBNSVBJX0NTSVBIWV9UX1dBS0VVUF9DRkcwX0FERFIgICAgICAgICAgIDB4MUY0Ci0jZGVmaW5lIENTSVBIWV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jc2kvaW5jbHVkZS9jc2kzLjAvbXNtX2lzcGlmX2h3cmVnLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL2luY2x1ZGUvY3NpMy4wL21zbV9pc3BpZl9od3JlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjY5ZGRhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jc2kvaW5jbHVkZS9jc2kzLjAvbXNtX2lzcGlmX2h3cmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgTVNNX0lTUElGX0hXUkVHX0gKLSNkZWZpbmUgTVNNX0lTUElGX0hXUkVHX0gKLQotCi0vKiBJU1BJRiByZWdpc3RlcnMgKi8KLQotI2RlZmluZSBJU1BJRl9SU1RfQ01EX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIElTUElGX1JTVF9DTURfMV9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4MEMKLSNkZWZpbmUgSVNQSUZfSU5URl9DTURfQUREUiAgICAgICAgICAgICAgICAgICAgICAweDI0OAotI2RlZmluZSBJU1BJRl9JTlRGX0NNRF8xX0FERFIgICAgICAgICAgICAgICAgICAgIDB4MjRDCi0jZGVmaW5lIElTUElGX0NUUkxfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgSVNQSUZfSU5QVVRfU0VMX0FERFIgICAgICAgICAgICAgICAgICAgICAweDI0NAotI2RlZmluZSBJU1BJRl9QSVhfMF9JTlRGX0NJRF9NQVNLX0FERFIgICAgICAgICAgIDB4MjU0Ci0jZGVmaW5lIElTUElGX1JESV8wX0lOVEZfQ0lEX01BU0tfQUREUiAgICAgICAgICAgMHgyNjQKLSNkZWZpbmUgSVNQSUZfUElYXzFfSU5URl9DSURfTUFTS19BRERSICAgICAgICAgICAweDI1OAotI2RlZmluZSBJU1BJRl9SRElfMV9JTlRGX0NJRF9NQVNLX0FERFIgICAgICAgICAgIDB4MjY4Ci0jZGVmaW5lIElTUElGX1JESV8yX0lOVEZfQ0lEX01BU0tfQUREUiAgICAgICAgICAgMHgyNkMKLSNkZWZpbmUgSVNQSUZfUElYXzBfU1RBVFVTX0FERFIgICAgICAgICAgICAgICAgICAweDJDMAotI2RlZmluZSBJU1BJRl9SRElfMF9TVEFUVVNfQUREUiAgICAgICAgICAgICAgICAgIDB4MkQwCi0jZGVmaW5lIElTUElGX1BJWF8xX1NUQVRVU19BRERSICAgICAgICAgICAgICAgICAgMHgyQzQKLSNkZWZpbmUgSVNQSUZfUkRJXzFfU1RBVFVTX0FERFIgICAgICAgICAgICAgICAgICAweDJENAotI2RlZmluZSBJU1BJRl9SRElfMl9TVEFUVVNfQUREUiAgICAgICAgICAgICAgICAgIDB4MkQ4Ci0jZGVmaW5lIElTUElGX0lSUV9NQVNLX0FERFIgICAgICAgICAgICAgICAgICAgICAgMHgyMDgKLSNkZWZpbmUgSVNQSUZfSVJRX0NMRUFSX0FERFIgICAgICAgICAgICAgICAgICAgICAweDIzMAotI2RlZmluZSBJU1BJRl9JUlFfU1RBVFVTX0FERFIgICAgICAgICAgICAgICAgICAgIDB4MjFDCi0jZGVmaW5lIElTUElGX0lSUV9NQVNLXzFfQUREUiAgICAgICAgICAgICAgICAgICAgMHgyMEMKLSNkZWZpbmUgSVNQSUZfSVJRX0NMRUFSXzFfQUREUiAgICAgICAgICAgICAgICAgICAweDIzNAotI2RlZmluZSBJU1BJRl9JUlFfU1RBVFVTXzFfQUREUiAgICAgICAgICAgICAgICAgIDB4MjIwCi0jZGVmaW5lIElTUElGX0lSUV9NQVNLXzJfQUREUiAgICAgICAgICAgICAgICAgICAgMHgyMTAKLSNkZWZpbmUgSVNQSUZfSVJRX0NMRUFSXzJfQUREUiAgICAgICAgICAgICAgICAgICAweDIzOAotI2RlZmluZSBJU1BJRl9JUlFfU1RBVFVTXzJfQUREUiAgICAgICAgICAgICAgICAgIDB4MjI0Ci0jZGVmaW5lIElTUElGX0lSUV9HTE9CQUxfQ0xFQVJfQ01EX0FERFIgICAgICAgICAgIDB4MUMKLQotLyogbmV3ICovCi0jZGVmaW5lIElTUElGX1ZGRV9tX0NUUkxfMF9BRERSICAgICAgICAgICAgICAgICAgMHgyMDAKLSNkZWZpbmUgSVNQSUZfVkZFX21fSVJRX01BU0tfMCAgICAgICAgICAgICAgICAgICAweDIwOAotI2RlZmluZSBJU1BJRl9WRkVfbV9JUlFfTUFTS18xICAgICAgICAgICAgICAgICAgIDB4MjBDCi0jZGVmaW5lIElTUElGX1ZGRV9tX0lSUV9NQVNLXzIgICAgICAgICAgICAgICAgICAgMHgyMTAKLSNkZWZpbmUgSVNQSUZfVkZFX21fSVJRX1NUQVRVU18wICAgICAgICAgICAgICAgICAweDIxQwotI2RlZmluZSBJU1BJRl9WRkVfbV9JUlFfU1RBVFVTXzEgICAgICAgICAgICAgICAgIDB4MjIwCi0jZGVmaW5lIElTUElGX1ZGRV9tX0lSUV9TVEFUVVNfMiAgICAgICAgICAgICAgICAgMHgyMjQKLSNkZWZpbmUgSVNQSUZfVkZFX21fSVJRX0NMRUFSXzAgICAgICAgICAgICAgICAgICAweDIzMAotI2RlZmluZSBJU1BJRl9WRkVfbV9JUlFfQ0xFQVJfMSAgICAgICAgICAgICAgICAgIDB4MjM0Ci0jZGVmaW5lIElTUElGX1ZGRV9tX0lSUV9DTEVBUl8yICAgICAgICAgICAgICAgICAgMHgyMzgKLQotLypJU1BJRiBSRVNFVCBCSVRTKi8KLQotI2RlZmluZSBWRkVfQ0xLX0RPTUFJTl9SU1QgICAgICAgICAgIDMxCi0jZGVmaW5lIFJESV9DTEtfRE9NQUlOX1JTVCAgICAgICAgICAgMjYKLSNkZWZpbmUgUkRJXzFfQ0xLX0RPTUFJTl9SU1QgICAgICAgICAyNwotI2RlZmluZSBSRElfMl9DTEtfRE9NQUlOX1JTVCAgICAgICAgIDI4Ci0jZGVmaW5lIFBJWF9DTEtfRE9NQUlOX1JTVCAgICAgICAgICAgMjkKLSNkZWZpbmUgUElYXzFfQ0xLX0RPTUFJTl9SU1QgICAgICAgICAzMAotI2RlZmluZSBBSEJfQ0xLX0RPTUFJTl9SU1QgICAgICAgICAgIDI1Ci0jZGVmaW5lIFJESV8yX1ZGRV9SU1RfU1RCICAgICAgICAgICAgMTIKLSNkZWZpbmUgUkRJXzJfQ1NJRF9SU1RfU1RCICAgICAgICAgICAxMQotI2RlZmluZSBSRElfMV9WRkVfUlNUX1NUQiAgICAgICAgICAgIDEwCi0jZGVmaW5lIFJESV8xX0NTSURfUlNUX1NUQiAgICAgICAgICAgOQotI2RlZmluZSBSRElfMF9WRkVfUlNUX1NUQiAgICAgICAgICAgIDgKLSNkZWZpbmUgUkRJXzBfQ1NJRF9SU1RfU1RCICAgICAgICAgICA3Ci0jZGVmaW5lIFBJWF8xX1ZGRV9SU1RfU1RCICAgICAgICAgICAgNgotI2RlZmluZSBQSVhfMV9DU0lEX1JTVF9TVEIgICAgICAgICAgIDUKLSNkZWZpbmUgUElYXzBfVkZFX1JTVF9TVEIgICAgICAgICAgICA0Ci0jZGVmaW5lIFBJWF8wX0NTSURfUlNUX1NUQiAgICAgICAgICAgMwotI2RlZmluZSBTV19SRUdfUlNUX1NUQiAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTUlTQ19MT0dJQ19SU1RfU1RCICAgICAgICAgICAxCi0jZGVmaW5lIFNUUk9CRURfUlNUX0VOICAgICAgICAgICAgICAgMAotCi0jZGVmaW5lIElTUElGX1JTVF9DTURfTUFTSyAgICAgICAgICAgMHhGRTBGMUZGRgotI2RlZmluZSBJU1BJRl9SU1RfQ01EXzFfTUFTSyAgICAgICAgIDB4RkMwRjFGRjkKLQotI2RlZmluZSBQSVhfSU5URl8wX09WRVJGTE9XX0lSUSAgICAgIDEyCi0jZGVmaW5lIFJBV19JTlRGXzBfT1ZFUkZMT1dfSVJRICAgICAgMjUKLSNkZWZpbmUgUkFXX0lOVEZfMV9PVkVSRkxPV19JUlEgICAgICAyNQotI2RlZmluZSBSQVdfSU5URl8yX09WRVJGTE9XX0lSUSAgICAgIDEyCi0jZGVmaW5lIFJFU0VUX0RPTkVfSVJRICAgICAgICAgICAgICAgMjcKLQotI2RlZmluZSBJU1BJRl9JUlFfU1RBVFVTX01BU0sgICAgICAgIDB4MEE0OTMyNDkKLSNkZWZpbmUgSVNQSUZfSVJRX1NUQVRVU18xX01BU0sgICAgICAweDAyNDkzMjQ5Ci0jZGVmaW5lIElTUElGX0lSUV9TVEFUVVNfMl9NQVNLICAgICAgMHgwMDAwMTI0OQotCi0jZGVmaW5lIElTUElGX0lSUV9TVEFUVVNfUElYX1NPRl9NQVNLCTB4MjQ5Ci0jZGVmaW5lIElTUElGX0lSUV9TVEFUVVNfUkRJMF9TT0ZfTUFTSwkweDQ5MjAwMAotI2RlZmluZSBJU1BJRl9JUlFfU1RBVFVTX1JESTFfU09GX01BU0sJMHg0OTIwMDAKLSNkZWZpbmUgSVNQSUZfSVJRX1NUQVRVU19SREkyX1NPRl9NQVNLCTB4MjQ5Ci0KLSNkZWZpbmUgSVNQSUZfSVJRX1NUQVRVU19TT0ZfTUFTSwkweDQ5MjI0OQotI2RlZmluZSBJU1BJRl9JUlFfR0xPQkFMX0NMRUFSX0NNRCAgICAgMHgxCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9tc21fY3NpMl9yZWdpc3Rlci5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9tc21fY3NpMl9yZWdpc3Rlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWJmYTdmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jc2kvbXNtX2NzaTJfcmVnaXN0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgIm1zbS5oIgotI2luY2x1ZGUgIm1zbV9jc2lfcmVnaXN0ZXIuaCIKLQotaW50IG1zbV9jc2lfcmVnaXN0ZXJfc3ViZGV2cyhzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwX21jdGwsCi0JdWludDhfdCBjc2lwaHlfY29kZV9pbmRleCwgdWludDhfdCBjc2lkX2NvcmVfaW5kZXgsCi0Jc3RydWN0IG1zbV9jYW1fc2VydmVyX2RldiAqc2VydmVyX2RldikKLXsKLQlpbnQgcmMgPSAtRU5PREVWOwotCi0JQ0RCRygiJXMgY3NpcGh5IHNlbCAlZCBjc2lkIHNlbCAlZFxuIiwgX19mdW5jX18sIGNzaXBoeV9jb2RlX2luZGV4LAotCQljc2lkX2NvcmVfaW5kZXgpOwotCS8qIHJlZ2lzdGVyIGNzaXBoeSBzdWJkZXYgKi8KLQlwX21jdGwtPmNzaXBoeV9zZGV2ID0gc2VydmVyX2Rldi0+Y3NpcGh5X2RldmljZVtjc2lwaHlfY29kZV9pbmRleF07Ci0JaWYgKCFwX21jdGwtPmNzaXBoeV9zZGV2KQotCQlnb3RvIG91dDsKLQl2NGwyX3NldF9zdWJkZXZfaG9zdGRhdGEocF9tY3RsLT5jc2lwaHlfc2RldiwgcF9tY3RsKTsKLQotCS8qIHJlZ2lzdGVyIGNzaWQgc3ViZGV2ICovCi0JcF9tY3RsLT5jc2lkX3NkZXYgPSBzZXJ2ZXJfZGV2LT5jc2lkX2RldmljZVtjc2lkX2NvcmVfaW5kZXhdOwotCWlmICghcF9tY3RsLT5jc2lkX3NkZXYpCi0JCWdvdG8gb3V0OwotCXY0bDJfc2V0X3N1YmRldl9ob3N0ZGF0YShwX21jdGwtPmNzaWRfc2RldiwgcF9tY3RsKTsKLQotCS8qIHJlZ2lzdGVyIGlzcGlmIHN1YmRldiAqLwotCXBfbWN0bC0+aXNwaWZfc2RldiA9IHNlcnZlcl9kZXYtPmlzcGlmX2RldmljZVswXTsKLQlpZiAoIXBfbWN0bC0+aXNwaWZfc2RldikKLQkJZ290byBvdXQ7Ci0JdjRsMl9zZXRfc3ViZGV2X2hvc3RkYXRhKHBfbWN0bC0+aXNwaWZfc2RldiwgcF9tY3RsKTsKLQotCXJjID0gMDsKLQlyZXR1cm4gcmM7Ci1vdXQ6Ci0JcF9tY3RsLT5pc3BpZl9zZGV2ID0gTlVMTDsKLQlyZXR1cm4gcmM7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jc2kvbXNtX2NzaV9yZWdpc3Rlci5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9tc21fY3NpX3JlZ2lzdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNzYyNjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9tc21fY3NpX3JlZ2lzdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLWludCBtc21fY3NpX3JlZ2lzdGVyX3N1YmRldnMoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcF9tY3RsLAotCXVpbnQ4X3QgY3NpcGh5X2NvZGVfaW5kZXgsIHVpbnQ4X3QgY3NpZF9jb3JlX2luZGV4LAotCXN0cnVjdCBtc21fY2FtX3NlcnZlcl9kZXYgKnNlcnZlcl9kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9tc21fY3NpYy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9tc21fY3NpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDQ4OWNiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jc2kvbXNtX2NzaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDUyMyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxtYWNoL2Nsay5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9pc3AuaD4KLSNpbmNsdWRlICJtc21fY3NpYy5oIgotI2luY2x1ZGUgIm1zbS5oIgotCi0jZGVmaW5lIERCR19DU0lDIDAKLQotI2RlZmluZSBWNEwyX0lERU5UX0NTSUMJCQk1MDAwNAotLyogTUlQSQlDU0kgY29udHJvbGxlciByZWdpc3RlcnMgKi8KLSNkZWZpbmUJTUlQSV9QSFlfQ09OVFJPTAkJMHgwMDAwMDAwMAotI2RlZmluZQlNSVBJX1BST1RPQ09MX0NPTlRST0wJCTB4MDAwMDAwMDQKLSNkZWZpbmUJTUlQSV9JTlRFUlJVUFRfU1RBVFVTCQkweDAwMDAwMDA4Ci0jZGVmaW5lCU1JUElfSU5URVJSVVBUX01BU0sJCTB4MDAwMDAwMEMKLSNkZWZpbmUJTUlQSV9DQU1FUkFfQ05UTAkJMHgwMDAwMDAyNAotI2RlZmluZQlNSVBJX0NBTElCUkFUSU9OX0NPTlRST0wJMHgwMDAwMDAxOAotI2RlZmluZQlNSVBJX1BIWV9EMF9DT05UUk9MMgkJMHgwMDAwMDAzOAotI2RlZmluZQlNSVBJX1BIWV9EMV9DT05UUk9MMgkJMHgwMDAwMDAzQwotI2RlZmluZQlNSVBJX1BIWV9EMl9DT05UUk9MMgkJMHgwMDAwMDA0MAotI2RlZmluZQlNSVBJX1BIWV9EM19DT05UUk9MMgkJMHgwMDAwMDA0NAotI2RlZmluZQlNSVBJX1BIWV9DTF9DT05UUk9MCQkweDAwMDAwMDQ4Ci0jZGVmaW5lCU1JUElfUEhZX0QwX0NPTlRST0wJCTB4MDAwMDAwMzQKLSNkZWZpbmUJTUlQSV9QSFlfRDFfQ09OVFJPTAkJMHgwMDAwMDAyMAotI2RlZmluZQlNSVBJX1BIWV9EMl9DT05UUk9MCQkweDAwMDAwMDJDCi0jZGVmaW5lCU1JUElfUEhZX0QzX0NPTlRST0wJCTB4MDAwMDAwMzAKLSNkZWZpbmUJTUlQSV9QV1JfQ05UTAkJCTB4MDAwMDAwNTQKLQotLyoKLSAqIE1JUElfUFJPVE9DT0xfQ09OVFJPTCByZWdpc3RlciBiaXRzIHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBmZWF0dXJlcyBvZgotICogQ1NJIFJ4IEJsb2NrCi0gKi8KLQotLyogRFBDTSBzY2hlbWUgKi8KLSNkZWZpbmUJTUlQSV9QUk9UT0NPTF9DT05UUk9MX0RQQ01fU0NIRU1FX1NIRlQJCQkweDFlCi0vKiBTV19SU1QgdG8gaXNzdWUgYSBTVyByZXNldCB0byB0aGUgQ1NJIGNvcmUgKi8KLSNkZWZpbmUJTUlQSV9QUk9UT0NPTF9DT05UUk9MX1NXX1JTVF9CTVNLCQkJMHg4MDAwMDAwCi0vKiBUbyBDYXB0dXJlIExvbmcgcGFja2V0IEhlYWRlciBJbmZvIGluIE1JUElfUFJPVE9DT0xfU1RBVFVTIHJlZ2lzdGVyICovCi0jZGVmaW5lCU1JUElfUFJPVE9DT0xfQ09OVFJPTF9MT05HX1BBQ0tFVF9IRUFERVJfQ0FQVFVSRV9CTVNLCTB4MjAwMDAwCi0vKiBEYXRhIGZvcm1hdCBmb3IgdW5wYWNraW5nIHB1cnBvc2UgKi8KLSNkZWZpbmUJTUlQSV9QUk9UT0NPTF9DT05UUk9MX0RBVEFfRk9STUFUX1NIRlQJCQkweDEzCi0vKiBFbmFibGUgZGVjb2Rpbmcgb2YgcGF5bG9hZCBiYXNlZCBvbiBkYXRhIHR5cGUgZmlsZWQgb2YgcGFja2V0IGhkciAqLwotI2RlZmluZQlNSVBJX1BST1RPQ09MX0NPTlRST0xfREVDT0RFX0lEX0JNU0sJCQkweDQwMDAwCi0vKiBFbmFibGUgZXJyb3IgY29ycmVjdGlvbiBvbiBwYWNrZXQgaGVhZGVycyAqLwotI2RlZmluZQlNSVBJX1BST1RPQ09MX0NPTlRST0xfRUNDX0VOX0JNU0sJCQkweDIwMDAwCi0KLS8qCi0gKiBNSVBJX0NBTElCUkFUSU9OX0NPTlRST0wgcmVnaXN0ZXIgY29udGFpbnMgY29udHJvbCBpbmZvIGZvcgotICogY2FsaWJyYXRpb24gaW1wbGVkZW5jZSBjb250cm9sbGVyCi0qLwotCi0vKiBFbmFibGUgYml0IGZvciBjYWxpYnJhdGlvbiBwYWQgKi8KLSNkZWZpbmUJTUlQSV9DQUxJQlJBVElPTl9DT05UUk9MX1NXQ0FMX0NBTF9FTl9TSEZUCQkweDE2Ci0vKiBXaXRoIFNXQ0FMX1NUUkVOR1RIX09WRVJSSURFX0VOLCBTV19DQUxfRU4gYW5kIE1BTlVBTF9PVkVSUklERV9FTgotICogdGhlIGhhcmR3YXJlIGNhbGlicmF0aW9uIGNpcmN1aXRyeSBhc3NvY2lhdGVkIHdpdGggQ0FMX1NXX0hXX01PREUKLSAqIGlzIGJ5cGFzc2VkCi0qLwotI2RlZmluZQlNSVBJX0NBTElCUkFUSU9OX0NPTlRST0xfU1dDQUxfU1RSRU5HVEhfT1ZFUlJJREVfRU5fU0hGVAkweDE1Ci0vKiBUbyBpbmRpY2F0ZSB0aGUgQ2FsaWJyYXRpb24gcHJvY2VzcyBpcyBpbiB0aGUgY29udHJvbCBvZiBIVy9TVyAqLwotI2RlZmluZQlNSVBJX0NBTElCUkFUSU9OX0NPTlRST0xfQ0FMX1NXX0hXX01PREVfU0hGVAkJMHgxNAotLyogV2hlbiB0aGlzIGlzIHNldCB0aGUgc3RyZW5ndGggdmFsdWUgb2YgdGhlIGRhdGEgYW5kIGNsayBsYW5lIGltcGVkZW5jZQotICogdGVybWluYXRpb24gaXMgdXBkYXRlZCB3aXRoIE1BTlVBTF9TVFJFTkdUSCBzZXR0aW5ncyBhbmQgY2FsaWJyYXRpb24KLSAqIHNlbnNpbmcgbG9naWMgaXMgaWRsZS4KLSovCi0jZGVmaW5lCU1JUElfQ0FMSUJSQVRJT05fQ09OVFJPTF9NQU5VQUxfT1ZFUlJJREVfRU5fU0hGVAkweDcKLQotLyogRGF0YSBsYW5lMCBjb250cm9sICovCi0vKiBULWhzIFNldHRsZSBjb3VudCB2YWx1ZSAgZm9yIFJ4ICovCi0jZGVmaW5lCU1JUElfUEhZX0QwX0NPTlRST0wyX1NFVFRMRV9DT1VOVF9TSEZUCQkJMHgxOAotLyogUnggdGVybWluYXRpb24gY29udHJvbCAqLwotI2RlZmluZQlNSVBJX1BIWV9EMF9DT05UUk9MMl9IU19URVJNX0lNUF9TSEZUCQkJMHgxMAotLyogTFAgUnggZW5hYmxlICovCi0jZGVmaW5lCU1JUElfUEhZX0QwX0NPTlRST0wyX0xQX1JFQ19FTl9TSEZUCQkJMHg0Ci0vKgotICogRW5hYmxlIGZvciBlcnJvciBpbiBzeW5jIHNlcXVlbmNlCi0gKiAxIC0gb25lIGJpdCBlcnJvciBpbiBzeW5jIHNlcQotICogMCAtIHJlcXVpcmVzIGFsbCA4IGJpdCBjb3JyZWN0IHNlcQotKi8KLSNkZWZpbmUJTUlQSV9QSFlfRDBfQ09OVFJPTDJfRVJSX1NPVF9IU19FTl9TSEZUCQkJMHgzCi0KLS8qIENvbW1lbnRzIGFyZSBzYW1lIGFzIEQwICovCi0jZGVmaW5lCU1JUElfUEhZX0QxX0NPTlRST0wyX1NFVFRMRV9DT1VOVF9TSEZUCQkJMHgxOAotI2RlZmluZQlNSVBJX1BIWV9EMV9DT05UUk9MMl9IU19URVJNX0lNUF9TSEZUCQkJMHgxMAotI2RlZmluZQlNSVBJX1BIWV9EMV9DT05UUk9MMl9MUF9SRUNfRU5fU0hGVAkJCTB4NAotI2RlZmluZQlNSVBJX1BIWV9EMV9DT05UUk9MMl9FUlJfU09UX0hTX0VOX1NIRlQJCQkweDMKLQotLyogQ29tbWVudHMgYXJlIHNhbWUgYXMgRDAgKi8KLSNkZWZpbmUJTUlQSV9QSFlfRDJfQ09OVFJPTDJfU0VUVExFX0NPVU5UX1NIRlQJCQkweDE4Ci0jZGVmaW5lCU1JUElfUEhZX0QyX0NPTlRST0wyX0hTX1RFUk1fSU1QX1NIRlQJCQkweDEwCi0jZGVmaW5lCU1JUElfUEhZX0QyX0NPTlRST0wyX0xQX1JFQ19FTl9TSEZUCQkJMHg0Ci0jZGVmaW5lCU1JUElfUEhZX0QyX0NPTlRST0wyX0VSUl9TT1RfSFNfRU5fU0hGVAkJCTB4MwotCi0vKiBDb21tZW50cyBhcmUgc2FtZSBhcyBEMCAqLwotI2RlZmluZQlNSVBJX1BIWV9EM19DT05UUk9MMl9TRVRUTEVfQ09VTlRfU0hGVAkJCTB4MTgKLSNkZWZpbmUJTUlQSV9QSFlfRDNfQ09OVFJPTDJfSFNfVEVSTV9JTVBfU0hGVAkJCTB4MTAKLSNkZWZpbmUJTUlQSV9QSFlfRDNfQ09OVFJPTDJfTFBfUkVDX0VOX1NIRlQJCQkweDQKLSNkZWZpbmUJTUlQSV9QSFlfRDNfQ09OVFJPTDJfRVJSX1NPVF9IU19FTl9TSEZUCQkJMHgzCi0KLS8qIFBIWV9DTF9DVFJMIHByb2dyYW1zIHRoZSBwYXJhbWV0ZXJzIG9mIGNsayBsYW5lIG9mIENTSVJYUEhZICovCi0vKiBIUyBSeCB0ZXJtaW5hdGlvbiBjb250cm9sICovCi0jZGVmaW5lCU1JUElfUEhZX0NMX0NPTlRST0xfSFNfVEVSTV9JTVBfU0hGVAkJCTB4MTgKLS8qIFN0YXJ0IHNpZ25hbCBmb3IgVC1ocyBkZWxheSAqLwotI2RlZmluZQlNSVBJX1BIWV9DTF9DT05UUk9MX0xQX1JFQ19FTl9TSEZUCQkJMHgyCi0KLS8qIFBIWSBEQVRBIGxhbmUgMCBjb250cm9sICovCi0vKgotICogSFMgUlggZXF1YWxpemVyIHN0cmVuZ3RoIGNvbnRyb2wKLSAqIDAwIC0gMGRiIDAxIC0gM2RiIDEwIC0gNWRiIDExIC0gN2RiCi0qLwotI2RlZmluZQlNSVBJX1BIWV9EMF9DT05UUk9MX0hTX1JFQ19FUV9TSEZUCQkJMHgxYwotLyogUEhZIERBVEEgbGFuZSAxIGNvbnRyb2wgKi8KLS8qIFNodXRkb3duIHNpZ25hbCBmb3IgTUlQSSBjbGsgcGh5IGxpbmUgKi8KLSNkZWZpbmUJTUlQSV9QSFlfRDFfQ09OVFJPTF9NSVBJX0NMS19QSFlfU0hVVERPV05CX1NIRlQJCTB4OQotLyogU2h1dGRvd24gc2lnbmFsIGZvciBNSVBJIGRhdGEgcGh5IGxpbmUgKi8KLSNkZWZpbmUJTUlQSV9QSFlfRDFfQ09OVFJPTF9NSVBJX0RBVEFfUEhZX1NIVVRET1dOQl9TSEZUCTB4OAotCi0jZGVmaW5lIE1TTV9BWElfUU9TX1BSRVZJRVcgMjAwMDAwCi0jZGVmaW5lIE1TTV9BWElfUU9TX1NOQVBTSE9UIDIwMDAwMAotI2RlZmluZSBNU01fQVhJX1FPU19SRUNPUkRJTkcgMjAwMDAwCi0KLSNkZWZpbmUgTUlQSV9QV1JfQ05UTF9FTgkweDA3Ci0jZGVmaW5lIE1JUElfUFdSX0NOVExfRElTCTB4MAotCi1zdGF0aWMgaW50IG1zbV9jc2ljX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXN0cnVjdCBtc21fY2FtZXJhX2NzaV9wYXJhbXMgKmNzaWNfcGFyYW1zKQotewotCWludCByYyA9IDA7Ci0JdWludDMyX3QgdmFsID0gMDsKLQlzdHJ1Y3QgY3NpY19kZXZpY2UgKmNzaWNfZGV2OwotCXZvaWQgX19pb21lbSAqY3NpY2Jhc2U7Ci0JaW50IGk7Ci0KLQljc2ljX2RldiA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCWNzaWNiYXNlID0gY3NpY19kZXYtPmJhc2U7Ci0KLQkvKiBFbmFibGUgZXJyb3IgY29ycmVjdGlvbiBmb3IgREFUQSBsYW5lLiBBcHBsaWVzIHRvIGFsbCBkYXRhIGxhbmVzICovCi0JbXNtX2NhbWVyYV9pb193KDB4NCwgY3NpY2Jhc2UgKyBNSVBJX1BIWV9DT05UUk9MKTsKLQotCW1zbV9jYW1lcmFfaW9fdyhNSVBJX1BST1RPQ09MX0NPTlRST0xfU1dfUlNUX0JNU0ssCi0JCWNzaWNiYXNlICsgTUlQSV9QUk9UT0NPTF9DT05UUk9MKTsKLQotCXZhbCA9IE1JUElfUFJPVE9DT0xfQ09OVFJPTF9MT05HX1BBQ0tFVF9IRUFERVJfQ0FQVFVSRV9CTVNLIHwKLQkJTUlQSV9QUk9UT0NPTF9DT05UUk9MX0RFQ09ERV9JRF9CTVNLIHwKLQkJTUlQSV9QUk9UT0NPTF9DT05UUk9MX0VDQ19FTl9CTVNLOwotCXZhbCB8PSAodWludDMyX3QpKGNzaWNfcGFyYW1zLT5kYXRhX2Zvcm1hdCkgPDwKLQkJTUlQSV9QUk9UT0NPTF9DT05UUk9MX0RBVEFfRk9STUFUX1NIRlQ7Ci0JdmFsIHw9IGNzaWNfcGFyYW1zLT5kcGNtX3NjaGVtZSA8PAotCQlNSVBJX1BST1RPQ09MX0NPTlRST0xfRFBDTV9TQ0hFTUVfU0hGVDsKLQlDREJHKCIlcyBNSVBJX1BST1RPQ09MX0NPTlRST0wgdmFsPTB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWNiYXNlICsgTUlQSV9QUk9UT0NPTF9DT05UUk9MKTsKLQotCXZhbCA9IChjc2ljX3BhcmFtcy0+c2V0dGxlX2NudCA8PAotCQlNSVBJX1BIWV9EMF9DT05UUk9MMl9TRVRUTEVfQ09VTlRfU0hGVCkgfAotCQkoMHgwRiA8PCBNSVBJX1BIWV9EMF9DT05UUk9MMl9IU19URVJNX0lNUF9TSEZUKSB8Ci0JCSgweDEgPDwgTUlQSV9QSFlfRDBfQ09OVFJPTDJfTFBfUkVDX0VOX1NIRlQpIHwKLQkJKDB4MSA8PCBNSVBJX1BIWV9EMF9DT05UUk9MMl9FUlJfU09UX0hTX0VOX1NIRlQpOwotCUNEQkcoIiVzIE1JUElfUEhZX0QwX0NPTlRST0wyIHZhbD0weCV4XG4iLCBfX2Z1bmNfXywgdmFsKTsKLQlmb3IgKGkgPSAwOyBpIDwgY3NpY19wYXJhbXMtPmxhbmVfY250OyBpKyspCi0JCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWNiYXNlICsgTUlQSV9QSFlfRDBfQ09OVFJPTDIgKyBpICogNCk7Ci0KLQotCXZhbCA9ICgweDBGIDw8IE1JUElfUEhZX0NMX0NPTlRST0xfSFNfVEVSTV9JTVBfU0hGVCkgfAotCQkoMHgxIDw8IE1JUElfUEhZX0NMX0NPTlRST0xfTFBfUkVDX0VOX1NIRlQpOwotCUNEQkcoIiVzIE1JUElfUEhZX0NMX0NPTlRST0wgdmFsPTB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWNiYXNlICsgTUlQSV9QSFlfQ0xfQ09OVFJPTCk7Ci0KLQl2YWwgPSAwIDw8IE1JUElfUEhZX0QwX0NPTlRST0xfSFNfUkVDX0VRX1NIRlQ7Ci0JbXNtX2NhbWVyYV9pb193KHZhbCwgY3NpY2Jhc2UgKyBNSVBJX1BIWV9EMF9DT05UUk9MKTsKLQotCXZhbCA9ICgweDEgPDwgTUlQSV9QSFlfRDFfQ09OVFJPTF9NSVBJX0NMS19QSFlfU0hVVERPV05CX1NIRlQpIHwKLQkJKDB4MSA8PCBNSVBJX1BIWV9EMV9DT05UUk9MX01JUElfREFUQV9QSFlfU0hVVERPV05CX1NIRlQpOwotCUNEQkcoIiVzIE1JUElfUEhZX0QxX0NPTlRST0wgdmFsPTB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWNiYXNlICsgTUlQSV9QSFlfRDFfQ09OVFJPTCk7Ci0KLQltc21fY2FtZXJhX2lvX3coMHgwMDAwMDAwMCwgY3NpY2Jhc2UgKyBNSVBJX1BIWV9EMl9DT05UUk9MKTsKLQltc21fY2FtZXJhX2lvX3coMHgwMDAwMDAwMCwgY3NpY2Jhc2UgKyBNSVBJX1BIWV9EM19DT05UUk9MKTsKLQotCS8qIHByb2dyYW0gbnVtYmVyIG9mIGxhbmVzIGFuZCBsYW5lIG1hcHBpbmcgKi8KLQlzd2l0Y2ggKGNzaWNfcGFyYW1zLT5sYW5lX2NudCkgewotCWNhc2UgMToKLQkJbXNtX2NhbWVyYV9pb193KGNzaWNfcGFyYW1zLT5sYW5lX2Fzc2lnbiA8PCA4IHwgMHg0LAotCQkJY3NpY2Jhc2UgKyBNSVBJX0NBTUVSQV9DTlRMKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQltc21fY2FtZXJhX2lvX3coY3NpY19wYXJhbXMtPmxhbmVfYXNzaWduIDw8IDggfCAweDUsCi0JCQljc2ljYmFzZSArIE1JUElfQ0FNRVJBX0NOVEwpOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCW1zbV9jYW1lcmFfaW9fdyhjc2ljX3BhcmFtcy0+bGFuZV9hc3NpZ24gPDwgOCB8IDB4NiwKLQkJCWNzaWNiYXNlICsgTUlQSV9DQU1FUkFfQ05UTCk7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJbXNtX2NhbWVyYV9pb193KGNzaWNfcGFyYW1zLT5sYW5lX2Fzc2lnbiA8PCA4IHwgMHg3LAotCQkJY3NpY2Jhc2UgKyBNSVBJX0NBTUVSQV9DTlRMKTsKLQkJYnJlYWs7Ci0JfQotCi0JbXNtX2NhbWVyYV9pb193KDB4RjA3N0YzQzAsIGNzaWNiYXNlICsgTUlQSV9JTlRFUlJVUFRfTUFTSyk7Ci0JLypjbGVhciBJUlEgYml0cyovCi0JbXNtX2NhbWVyYV9pb193KDB4RjA3N0YzQzAsIGNzaWNiYXNlICsgTUlQSV9JTlRFUlJVUFRfU1RBVFVTKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGlycXJldHVybl90IG1zbV9jc2ljX2lycShpbnQgaXJxX251bSwgdm9pZCAqZGF0YSkKLXsKLQl1aW50MzJfdCBpcnE7Ci0Jc3RydWN0IGNzaWNfZGV2aWNlICpjc2ljX2RldiA9IGRhdGE7Ci0KLQlwcl9pbmZvKCJtc21fY3NpY19pcnE6ICV4XG4iLCAodW5zaWduZWQgaW50KWNzaWNfZGV2LT5iYXNlKTsKLQlpcnEgPSBtc21fY2FtZXJhX2lvX3IoY3NpY19kZXYtPmJhc2UgKyBNSVBJX0lOVEVSUlVQVF9TVEFUVVMpOwotCXByX2luZm8oIiVzIE1JUElfSU5URVJSVVBUX1NUQVRVUyA9IDB4JXggMHgleFxuIiwKLQkJX19mdW5jX18sIGlycSwKLQkJbXNtX2NhbWVyYV9pb19yKGNzaWNfZGV2LT5iYXNlICsgTUlQSV9QUk9UT0NPTF9DT05UUk9MKSk7Ci0JbXNtX2NhbWVyYV9pb193KGlycSwgY3NpY19kZXYtPmJhc2UgKyBNSVBJX0lOVEVSUlVQVF9TVEFUVVMpOwotCi0JLyogVE9ETzogTmVlZHMgdG8gc2VuZCB0aGlzIGluZm8gdG8gdXBwZXIgbGF5ZXJzICovCi0JaWYgKChpcnEgPj4gMTkpICYgMHgxKQotCQlwcl9pbmZvKCJVbnN1cHBvcnRlZCBwYWNrZXQgZm9ybWF0IGlzIHJlY2VpdmVkXG4iKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NzaWNfc3ViZGV2X2dfY2hpcF9pZGVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCQkJc3RydWN0IHY0bDJfZGJnX2NoaXBfaWRlbnQgKmNoaXApCi17Ci0JQlVHX09OKCFjaGlwKTsKLQljaGlwLT5pZGVudCA9IFY0TDJfSURFTlRfQ1NJQzsKLQljaGlwLT5yZXZpc2lvbiA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbV9jbGtfaW5mbyBjc2ljXzh4X2Nsa19pbmZvW10gPSB7Ci0JeyJjc2lfc3JjX2NsayIsIDM4NDAwMDAwMH0sCi0JeyJjc2lfY2xrIiwgLTF9LAotCXsiY3NpX3ZmZV9jbGsiLCAtMX0sCi0JeyJjc2lfcGNsayIsIC0xfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbV9jbGtfaW5mbyBjc2ljXzd4X2Nsa19pbmZvW10gPSB7Ci0JeyJjc2lfY2xrIiwgNDAwMDAwMDAwfSwKLQl7ImNzaV92ZmVfY2xrIiwgLTF9LAotCXsiY3NpX3BjbGsiLCAtMX0sCi19OwotCi1zdGF0aWMgaW50IG1zbV9jc2ljX2luaXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBjc2ljX2RldmljZSAqY3NpY19kZXY7Ci0JY3NpY19kZXYgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlpZiAoY3NpY19kZXYgPT0gTlVMTCkgewotCQlyYyA9IC1FTk9NRU07Ci0JCXJldHVybiByYzsKLQl9Ci0KLQljc2ljX2Rldi0+YmFzZSA9IGlvcmVtYXAoY3NpY19kZXYtPm1lbS0+c3RhcnQsCi0JCXJlc291cmNlX3NpemUoY3NpY19kZXYtPm1lbSkpOwotCWlmICghY3NpY19kZXYtPmJhc2UpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JY3NpY19kZXYtPmh3X3ZlcnNpb24gPSBDU0lDXzhYOwotCXJjID0gbXNtX2NhbV9jbGtfZW5hYmxlKCZjc2ljX2Rldi0+cGRldi0+ZGV2LCBjc2ljXzh4X2Nsa19pbmZvLAotCQljc2ljX2Rldi0+Y3NpY19jbGssIEFSUkFZX1NJWkUoY3NpY184eF9jbGtfaW5mbyksIDEpOwotCWlmIChyYyA8IDApIHsKLQkJY3NpY19kZXYtPmh3X3ZlcnNpb24gPSBDU0lDXzdYOwotCQlyYyA9IG1zbV9jYW1fY2xrX2VuYWJsZSgmY3NpY19kZXYtPnBkZXYtPmRldiwgY3NpY183eF9jbGtfaW5mbywKLQkJCWNzaWNfZGV2LT5jc2ljX2NsaywgQVJSQVlfU0laRShjc2ljXzd4X2Nsa19pbmZvKSwgMSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCWNzaWNfZGV2LT5od192ZXJzaW9uID0gMDsKLQkJCWlvdW5tYXAoY3NpY19kZXYtPmJhc2UpOwotCQkJY3NpY19kZXYtPmJhc2UgPSBOVUxMOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCWlmIChjc2ljX2Rldi0+aHdfdmVyc2lvbiA9PSBDU0lDXzdYKQotCQltc21fY2FtaW9fdmZlX2Jsa19yZXNldF8zKCk7Ci0KLSNpZiBEQkdfQ1NJQwotCWVuYWJsZV9pcnEoY3NpY19kZXYtPmlycS0+c3RhcnQpOwotI2VuZGlmCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2NzaWNfZGlzYWJsZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQotewotCXVpbnQzMl90IHZhbDsKLQlzdHJ1Y3QgY3NpY19kZXZpY2UgKmNzaWNfZGV2OwotCWNzaWNfZGV2ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0KLQl2YWwgPSAweDA7Ci0JaWYgKGNzaWNfZGV2LT5iYXNlICE9IE5VTEwpIHsKLQkJQ0RCRygiJXMgTUlQSV9QSFlfRDBfQ09OVFJPTDIgdmFsPTB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOwotCQltc21fY2FtZXJhX2lvX3codmFsLCBjc2ljX2Rldi0+YmFzZSArIE1JUElfUEhZX0QwX0NPTlRST0wyKTsKLQkJbXNtX2NhbWVyYV9pb193KHZhbCwgY3NpY19kZXYtPmJhc2UgKyBNSVBJX1BIWV9EMV9DT05UUk9MMik7Ci0JCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWNfZGV2LT5iYXNlICsgTUlQSV9QSFlfRDJfQ09OVFJPTDIpOwotCQltc21fY2FtZXJhX2lvX3codmFsLCBjc2ljX2Rldi0+YmFzZSArIE1JUElfUEhZX0QzX0NPTlRST0wyKTsKLQkJQ0RCRygiJXMgTUlQSV9QSFlfQ0xfQ09OVFJPTCB2YWw9MHgleFxuIiwgX19mdW5jX18sIHZhbCk7Ci0JCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWNfZGV2LT5iYXNlICsgTUlQSV9QSFlfQ0xfQ09OVFJPTCk7Ci0JCW1zbGVlcCgyMCk7Ci0JCXZhbCA9IG1zbV9jYW1lcmFfaW9fcihjc2ljX2Rldi0+YmFzZSArIE1JUElfUEhZX0QxX0NPTlRST0wpOwotCQl2YWwgJj0KLQkJfigoMHgxIDw8IE1JUElfUEhZX0QxX0NPTlRST0xfTUlQSV9DTEtfUEhZX1NIVVRET1dOQl9TSEZUKQotCQl8KDB4MSA8PCBNSVBJX1BIWV9EMV9DT05UUk9MX01JUElfREFUQV9QSFlfU0hVVERPV05CX1NIRlQpKTsKLQkJQ0RCRygiJXMgTUlQSV9QSFlfRDFfQ09OVFJPTCB2YWw9MHgleFxuIiwgX19mdW5jX18sIHZhbCk7Ci0JCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWNfZGV2LT5iYXNlICsgTUlQSV9QSFlfRDFfQ09OVFJPTCk7Ci0JCXVzbGVlcF9yYW5nZSg1MDAwLCA2MDAwKTsKLQkJbXNtX2NhbWVyYV9pb193KDB4MCwgY3NpY19kZXYtPmJhc2UgKyBNSVBJX0lOVEVSUlVQVF9NQVNLKTsKLQkJbXNtX2NhbWVyYV9pb193KDB4MCwgY3NpY19kZXYtPmJhc2UgKyBNSVBJX0lOVEVSUlVQVF9TVEFUVVMpOwotCQltc21fY2FtZXJhX2lvX3coTUlQSV9QUk9UT0NPTF9DT05UUk9MX1NXX1JTVF9CTVNLLAotCQkJY3NpY19kZXYtPmJhc2UgKyBNSVBJX1BST1RPQ09MX0NPTlRST0wpOwotCi0JCW1zbV9jYW1lcmFfaW9fdygweEU0MDAsIGNzaWNfZGV2LT5iYXNlICsgTUlQSV9DQU1FUkFfQ05UTCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1zbV9jc2ljX3JlbGVhc2Uoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKLXsKLQlzdHJ1Y3QgY3NpY19kZXZpY2UgKmNzaWNfZGV2OwotCWNzaWNfZGV2ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0KLQltc21fY3NpY19kaXNhYmxlKHNkKTsKLSNpZiBEQkdfQ1NJQwotCWRpc2FibGVfaXJxKGNzaWNfZGV2LT5pcnEtPnN0YXJ0KTsKLSNlbmRpZgotCi0JaWYgKGNzaWNfZGV2LT5od192ZXJzaW9uID09IENTSUNfOFgpIHsKLQkJbXNtX2NhbV9jbGtfZW5hYmxlKCZjc2ljX2Rldi0+cGRldi0+ZGV2LCBjc2ljXzh4X2Nsa19pbmZvLAotCQkJY3NpY19kZXYtPmNzaWNfY2xrLCBBUlJBWV9TSVpFKGNzaWNfOHhfY2xrX2luZm8pLCAwKTsKLQl9IGVsc2UgaWYgKGNzaWNfZGV2LT5od192ZXJzaW9uID09IENTSUNfN1gpIHsKLQkJbXNtX2NhbV9jbGtfZW5hYmxlKCZjc2ljX2Rldi0+cGRldi0+ZGV2LCBjc2ljXzd4X2Nsa19pbmZvLAotCQkJY3NpY19kZXYtPmNzaWNfY2xrLCBBUlJBWV9TSVpFKGNzaWNfN3hfY2xrX2luZm8pLCAwKTsKLQl9Ci0KLQlpb3VubWFwKGNzaWNfZGV2LT5iYXNlKTsKLQljc2ljX2Rldi0+YmFzZSA9IE5VTEw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIG1zbV9jc2ljX2NtZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2b2lkICphcmcpCi17Ci0JbG9uZyByYyA9IDA7Ci0Jc3RydWN0IGNzaWNfY2ZnX2RhdGEgY2RhdGE7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfY3NpX3BhcmFtcyBjc2ljX3BhcmFtczsKLQlpZiAoY29weV9mcm9tX3VzZXIoJmNkYXRhLAotCQkodm9pZCAqKWFyZywKLQkJc2l6ZW9mKHN0cnVjdCBjc2ljX2NmZ19kYXRhKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCUNEQkcoIiVzIGNmZ3R5cGUgPSAlZFxuIiwgX19mdW5jX18sIGNkYXRhLmNmZ3R5cGUpOwotCXN3aXRjaCAoY2RhdGEuY2ZndHlwZSkgewotCWNhc2UgQ1NJQ19JTklUOgotCQlyYyA9IG1zbV9jc2ljX2luaXQoc2QpOwotCQlicmVhazsKLQljYXNlIENTSUNfQ0ZHOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNzaWNfcGFyYW1zLAotCQkJKHZvaWQgKiljZGF0YS5jc2ljX3BhcmFtcywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2NhbWVyYV9jc2lfcGFyYW1zKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmMgPSBtc21fY3NpY19jb25maWcoc2QsICZjc2ljX3BhcmFtcyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgbXNtX2NzaWNfc3ViZGV2X2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFZJRElPQ19NU01fQ1NJQ19DRkc6Ci0JCXJldHVybiBtc21fY3NpY19jbWQoc2QsIGFyZyk7Ci0JY2FzZSBWSURJT0NfTVNNX0NTSUNfUkVMRUFTRToKLQkJcmV0dXJuIG1zbV9jc2ljX3JlbGVhc2Uoc2QpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIG1zbV9jc2ljX3N1YmRldl9jb3JlX29wcyA9IHsKLQkuZ19jaGlwX2lkZW50ID0gJm1zbV9jc2ljX3N1YmRldl9nX2NoaXBfaWRlbnQsCi0JLmlvY3RsID0gJm1zbV9jc2ljX3N1YmRldl9pb2N0bCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG1zbV9jc2ljX3N1YmRldl9vcHMgPSB7Ci0JLmNvcmUgPSAmbXNtX2NzaWNfc3ViZGV2X2NvcmVfb3BzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgbXNtX2NzaWNfaW50ZXJuYWxfb3BzOwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBjc2ljX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGNzaWNfZGV2aWNlICpuZXdfY3NpY19kZXY7Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbV9zdWJkZXZfaW5mbyBzZF9pbmZvOwotCi0JQ0RCRygiJXM6IGRldmljZSBpZCA9ICVkXG4iLCBfX2Z1bmNfXywgcGRldi0+aWQpOwotCW5ld19jc2ljX2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjc2ljX2RldmljZSksIEdGUF9LRVJORUwpOwotCWlmICghbmV3X2NzaWNfZGV2KSB7Ci0JCXByX2VycigiJXM6IG5vIGVub3VnaCBtZW1vcnlcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JdjRsMl9zdWJkZXZfaW5pdCgmbmV3X2NzaWNfZGV2LT5zdWJkZXYsICZtc21fY3NpY19zdWJkZXZfb3BzKTsKLQluZXdfY3NpY19kZXYtPnN1YmRldi5pbnRlcm5hbF9vcHMgPSAmbXNtX2NzaWNfaW50ZXJuYWxfb3BzOwotCW5ld19jc2ljX2Rldi0+c3ViZGV2LmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOwotCXNucHJpbnRmKG5ld19jc2ljX2Rldi0+c3ViZGV2Lm5hbWUsCi0JCQlBUlJBWV9TSVpFKG5ld19jc2ljX2Rldi0+c3ViZGV2Lm5hbWUpLCAibXNtX2NzaWMiKTsKLQl2NGwyX3NldF9zdWJkZXZkYXRhKCZuZXdfY3NpY19kZXYtPnN1YmRldiwgbmV3X2NzaWNfZGV2KTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCAmbmV3X2NzaWNfZGV2LT5zdWJkZXYpOwotCW11dGV4X2luaXQoJm5ld19jc2ljX2Rldi0+bXV0ZXgpOwotCi0JbmV3X2NzaWNfZGV2LT5tZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsCi0JCQkJCUlPUkVTT1VSQ0VfTUVNLCAiY3NpYyIpOwotCWlmICghbmV3X2NzaWNfZGV2LT5tZW0pIHsKLQkJcHJfZXJyKCIlczogbm8gbWVtIHJlc291cmNlP1xuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gY3NpY19ub19yZXNvdXJjZTsKLQl9Ci0JbmV3X2NzaWNfZGV2LT5pcnEgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsCi0JCQkJCUlPUkVTT1VSQ0VfSVJRLCAiY3NpYyIpOwotCWlmICghbmV3X2NzaWNfZGV2LT5pcnEpIHsKLQkJcHJfZXJyKCIlczogbm8gaXJxIHJlc291cmNlP1xuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gY3NpY19ub19yZXNvdXJjZTsKLQl9Ci0JbmV3X2NzaWNfZGV2LT5pbyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihuZXdfY3NpY19kZXYtPm1lbS0+c3RhcnQsCi0JCXJlc291cmNlX3NpemUobmV3X2NzaWNfZGV2LT5tZW0pLCBwZGV2LT5uYW1lKTsKLQlpZiAoIW5ld19jc2ljX2Rldi0+aW8pIHsKLQkJcHJfZXJyKCIlczogbm8gdmFsaWQgbWVtIHJlZ2lvblxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBjc2ljX25vX3Jlc291cmNlOwotCX0KLQotCXJjID0gcmVxdWVzdF9pcnEobmV3X2NzaWNfZGV2LT5pcnEtPnN0YXJ0LCBtc21fY3NpY19pcnEsCi0JCUlSUUZfVFJJR0dFUl9ISUdILCAiY3NpYyIsIG5ld19jc2ljX2Rldik7Ci0JaWYgKHJjIDwgMCkgewotCQlyZWxlYXNlX21lbV9yZWdpb24obmV3X2NzaWNfZGV2LT5tZW0tPnN0YXJ0LAotCQkJcmVzb3VyY2Vfc2l6ZShuZXdfY3NpY19kZXYtPm1lbSkpOwotCQlwcl9lcnIoIiVzOiBpcnEgcmVxdWVzdCBmYWlsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGNzaWNfbm9fcmVzb3VyY2U7Ci0JfQotCWRpc2FibGVfaXJxKG5ld19jc2ljX2Rldi0+aXJxLT5zdGFydCk7Ci0KLQluZXdfY3NpY19kZXYtPnBkZXYgPSBwZGV2OwotCi0JcmMgPSBtc21fY2FtX2Nsa19lbmFibGUoJm5ld19jc2ljX2Rldi0+cGRldi0+ZGV2LCAmY3NpY183eF9jbGtfaW5mb1syXSwKLQkJCQluZXdfY3NpY19kZXYtPmNzaWNfY2xrLCAxLCAxKTsKLQluZXdfY3NpY19kZXYtPmJhc2UgPSBpb3JlbWFwKG5ld19jc2ljX2Rldi0+bWVtLT5zdGFydCwKLQkJcmVzb3VyY2Vfc2l6ZShuZXdfY3NpY19kZXYtPm1lbSkpOwotCWlmICghbmV3X2NzaWNfZGV2LT5iYXNlKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCW1zbV9jYW1lcmFfaW9fdyhNSVBJX1BXUl9DTlRMX0RJUywgbmV3X2NzaWNfZGV2LT5iYXNlICsgTUlQSV9QV1JfQ05UTCk7Ci0KLQlyYyA9IG1zbV9jYW1fY2xrX2VuYWJsZSgmbmV3X2NzaWNfZGV2LT5wZGV2LT5kZXYsICZjc2ljXzd4X2Nsa19pbmZvWzJdLAotCQkJCW5ld19jc2ljX2Rldi0+Y3NpY19jbGssIDEsIDApOwotCi0JaW91bm1hcChuZXdfY3NpY19kZXYtPmJhc2UpOwotCW5ld19jc2ljX2Rldi0+YmFzZSA9IE5VTEw7Ci0Jc2RfaW5mby5zZGV2X3R5cGUgPSBDU0lDX0RFVjsKLQlzZF9pbmZvLnNkX2luZGV4ID0gcGRldi0+aWQ7Ci0Jc2RfaW5mby5pcnFfbnVtID0gbmV3X2NzaWNfZGV2LT5pcnEtPnN0YXJ0OwotCW1zbV9jYW1fcmVnaXN0ZXJfc3ViZGV2X25vZGUoCi0JCSZuZXdfY3NpY19kZXYtPnN1YmRldiwgJnNkX2luZm8pOwotCi0JbWVkaWFfZW50aXR5X2luaXQoJm5ld19jc2ljX2Rldi0+c3ViZGV2LmVudGl0eSwgMCwgTlVMTCwgMCk7Ci0JbmV3X2NzaWNfZGV2LT5zdWJkZXYuZW50aXR5LnR5cGUgPSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFVjsKLQluZXdfY3NpY19kZXYtPnN1YmRldi5lbnRpdHkuZ3JvdXBfaWQgPSBDU0lDX0RFVjsKLQluZXdfY3NpY19kZXYtPnN1YmRldi5lbnRpdHkubmFtZSA9IHBkZXYtPm5hbWU7Ci0JbmV3X2NzaWNfZGV2LT5zdWJkZXYuZW50aXR5LnJldmlzaW9uID0KLQkJbmV3X2NzaWNfZGV2LT5zdWJkZXYuZGV2bm9kZS0+bnVtOwotCXJldHVybiAwOwotCi1jc2ljX25vX3Jlc291cmNlOgotCW11dGV4X2Rlc3Ryb3koJm5ld19jc2ljX2Rldi0+bXV0ZXgpOwotCWtmcmVlKG5ld19jc2ljX2Rldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNzaWNfZHJpdmVyID0gewotCS5wcm9iZSA9IGNzaWNfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBNU01fQ1NJQ19EUlZfTkFNRSwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9jc2ljX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmY3NpY19kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXNtX2NzaWNfZXhpdF9tb2R1bGUodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY3NpY19kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChtc21fY3NpY19pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChtc21fY3NpY19leGl0X21vZHVsZSk7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1TTSBjc2ljIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9tc21fY3NpYy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9tc21fY3NpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGFhOTJhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jc2kvbXNtX2NzaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIE1TTV9DU0lDX0gKLSNkZWZpbmUgTVNNX0NTSUNfSAotCi0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgotCi0jZGVmaW5lIENTSUNfN1ggMHgxCi0jZGVmaW5lIENTSUNfOFggKDB4MSA8PCAxKQotCi1zdHJ1Y3QgY3NpY19kZXZpY2UgewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0Jc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmlycTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmlvOwotCXZvaWQgX19pb21lbSAqYmFzZTsKLQlzdHJ1Y3QgbXV0ZXggbXV0ZXg7Ci0JdWludDMyX3QgaHdfdmVyc2lvbjsKLQotCXN0cnVjdCBjbGsgKmNzaWNfY2xrWzVdOwotfTsKLQotI2RlZmluZSBWSURJT0NfTVNNX0NTSUNfQ0ZHIFwKLQlfSU9XUignVicsIEJBU0VfVklESU9DX1BSSVZBVEUgKyA0LCBzdHJ1Y3QgY3NpY19jZmdfZGF0YSopCi0KLSNkZWZpbmUgVklESU9DX01TTV9DU0lDX1JFTEVBU0UgXAotCV9JT1dSKCdWJywgQkFTRV9WSURJT0NfUFJJVkFURSArIDUsIHN0cnVjdCB2NGwyX3N1YmRldiopCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9tc21fY3NpY19yZWdpc3Rlci5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9tc21fY3NpY19yZWdpc3Rlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjBmZGFmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jc2kvbXNtX2NzaWNfcmVnaXN0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgIm1zbS5oIgotI2luY2x1ZGUgIm1zbV9jc2lfcmVnaXN0ZXIuaCIKLQotaW50IG1zbV9jc2lfcmVnaXN0ZXJfc3ViZGV2cyhzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwX21jdGwsCi0JdWludDhfdCBjc2lwaHlfY29kZV9pbmRleCwgdWludDhfdCBjc2lkX2NvcmVfaW5kZXgsCi0Jc3RydWN0IG1zbV9jYW1fc2VydmVyX2RldiAqc2VydmVyX2RldikKLXsKLQlpbnQgcmMgPSAtRU5PREVWOwotCi0JcF9tY3RsLT5jc2ljX3NkZXYgPSBzZXJ2ZXJfZGV2LT5jc2ljX2RldmljZVtjc2lkX2NvcmVfaW5kZXhdOwotCWlmICghcF9tY3RsLT5jc2ljX3NkZXYpCi0JCWdvdG8gb3V0OwotCXY0bDJfc2V0X3N1YmRldl9ob3N0ZGF0YShwX21jdGwtPmNzaWNfc2RldiwgcF9tY3RsKTsKLQotCXJjID0gMDsKLQlwX21jdGwtPmlzcGlmX3NkZXYgPSBOVUxMOwotCXJldHVybiByYzsKLQotb3V0OgotCXBfbWN0bC0+aXNwaWZfc2RldiA9IE5VTEw7Ci0JcmV0dXJuIHJjOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL21zbV9jc2lkLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL21zbV9jc2lkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZmZhYzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9tc21fY3NpZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQ5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2lzcC5oPgotI2luY2x1ZGUgIm1zbV9jc2lkLmgiCi0jaW5jbHVkZSAibXNtX2NzaWRfaHdyZWcuaCIKLSNpbmNsdWRlICJtc20uaCIKLSNpbmNsdWRlICJtc21fY2FtX3NlcnZlci5oIgotCi0jZGVmaW5lIFY0TDJfSURFTlRfQ1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDAwMgotI2RlZmluZSBDU0lEX1ZFUlNJT05fVjIgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAxMQotI2RlZmluZSBDU0lEX1ZFUlNJT05fVjMgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwMDAwMAotCi0jZGVmaW5lIERCR19DU0lEIDAKLQotI2RlZmluZSBUUlVFICAgMQotI2RlZmluZSBGQUxTRSAgMAotCi1zdGF0aWMgaW50IG1zbV9jc2lkX2NpZF9sdXQoCi0Jc3RydWN0IG1zbV9jYW1lcmFfY3NpZF9sdXRfcGFyYW1zICpjc2lkX2x1dF9wYXJhbXMsCi0Jdm9pZCBfX2lvbWVtICpjc2lkYmFzZSkKLXsKLQlpbnQgcmMgPSAwLCBpID0gMDsKLQl1aW50MzJfdCB2YWwgPSAwOwotCi0JaWYgKCFjc2lkX2x1dF9wYXJhbXMpIHsKLQkJcHJfZXJyKCIlczolZCBjc2lkX2x1dF9wYXJhbXMgTlVMTFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBjc2lkX2x1dF9wYXJhbXMtPm51bV9jaWQgJiYgaSA8IDE2OyBpKyspIHsKLQkJQ0RCRygiJXMgbHV0IHBhcmFtcyBudW1fY2lkID0gJWQsIGNpZCA9ICVkLCBkdCA9ICV4LCBkZiA9ICVkXG4iLAotCQkJX19mdW5jX18sCi0JCQljc2lkX2x1dF9wYXJhbXMtPm51bV9jaWQsCi0JCQljc2lkX2x1dF9wYXJhbXMtPnZjX2NmZ1tpXS5jaWQsCi0JCQljc2lkX2x1dF9wYXJhbXMtPnZjX2NmZ1tpXS5kdCwKLQkJCWNzaWRfbHV0X3BhcmFtcy0+dmNfY2ZnW2ldLmRlY29kZV9mb3JtYXQpOwotCQlpZiAoY3NpZF9sdXRfcGFyYW1zLT52Y19jZmdbaV0uZHQgPCAweDEyIHx8Ci0JCQljc2lkX2x1dF9wYXJhbXMtPnZjX2NmZ1tpXS5kdCA+IDB4MzcpIHsKLQkJCUNEQkcoIiVzOiB1bnN1cHBvcnRlZCBkYXRhIHR5cGUgMHgleFxuIiwKLQkJCQkgX19mdW5jX18sIGNzaWRfbHV0X3BhcmFtcy0+dmNfY2ZnW2ldLmR0KTsKLQkJCXJldHVybiByYzsKLQkJfQotCQl2YWwgPSBtc21fY2FtZXJhX2lvX3IoY3NpZGJhc2UgKyBDU0lEX0NJRF9MVVRfVkNfMF9BRERSICsKLQkJCShjc2lkX2x1dF9wYXJhbXMtPnZjX2NmZ1tpXS5jaWQgPj4gMikgKiA0KQotCQkJJiB+KDB4RkYgPDwgKChjc2lkX2x1dF9wYXJhbXMtPnZjX2NmZ1tpXS5jaWQgJSA0KSAqIDgpKTsKLQkJdmFsIHw9IChjc2lkX2x1dF9wYXJhbXMtPnZjX2NmZ1tpXS5kdCA8PAotCQkJKChjc2lkX2x1dF9wYXJhbXMtPnZjX2NmZ1tpXS5jaWQgJSA0KSAqIDgpKTsKLQkJbXNtX2NhbWVyYV9pb193KHZhbCwgY3NpZGJhc2UgKyBDU0lEX0NJRF9MVVRfVkNfMF9BRERSICsKLQkJCShjc2lkX2x1dF9wYXJhbXMtPnZjX2NmZ1tpXS5jaWQgPj4gMikgKiA0KTsKLQotCQl2YWwgPSAoY3NpZF9sdXRfcGFyYW1zLT52Y19jZmdbaV0uZGVjb2RlX2Zvcm1hdCA8PCA0KSB8IDB4MzsKLQkJbXNtX2NhbWVyYV9pb193KHZhbCwgY3NpZGJhc2UgKyBDU0lEX0NJRF9uX0NGR19BRERSICsKLQkJCShjc2lkX2x1dF9wYXJhbXMtPnZjX2NmZ1tpXS5jaWQgKiA0KSk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotI2lmIERCR19DU0lECi1zdGF0aWMgdm9pZCBtc21fY3NpZF9zZXRfZGVidWdfcmVnKHZvaWQgX19pb21lbSAqY3NpZGJhc2UsCi0Jc3RydWN0IG1zbV9jYW1lcmFfY3NpZF9wYXJhbXMgKmNzaWRfcGFyYW1zKQotewotCXVpbnQzMl90IHZhbCA9IDA7Ci0JdmFsID0gKCgxIDw8IGNzaWRfcGFyYW1zLT5sYW5lX2NudCkgLSAxKSA8PCAyMDsKLQltc21fY2FtZXJhX2lvX3coMHg3ZjAxMDgwMCB8IHZhbCwgY3NpZGJhc2UgKyBDU0lEX0lSUV9NQVNLX0FERFIpOwotCW1zbV9jYW1lcmFfaW9fdygweDdmMDEwODAwIHwgdmFsLCBjc2lkYmFzZSArIENTSURfSVJRX0NMRUFSX0NNRF9BRERSKTsKLX0KLSNlbHNlCi1zdGF0aWMgdm9pZCBtc21fY3NpZF9zZXRfZGVidWdfcmVnKHZvaWQgX19pb21lbSAqY3NpZGJhc2UsCi0Jc3RydWN0IG1zbV9jYW1lcmFfY3NpZF9wYXJhbXMgKmNzaWRfcGFyYW1zKSB7fQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgbXNtX2NzaWRfY29uZmlnKHN0cnVjdCBjc2lkX2RldmljZSAqY3NpZF9kZXYsCi0Jc3RydWN0IG1zbV9jYW1lcmFfY3NpZF9wYXJhbXMgKmNzaWRfcGFyYW1zKQotewotCWludCByYyA9IDA7Ci0JdWludDMyX3QgdmFsID0gMDsKLQl2b2lkIF9faW9tZW0gKmNzaWRiYXNlOwotCWNzaWRiYXNlID0gY3NpZF9kZXYtPmJhc2U7Ci0JaWYgKCFjc2lkYmFzZSB8fCAhY3NpZF9wYXJhbXMpIHsKLQkJcHJfZXJyKCIlczolZCBjc2lkYmFzZSAlcCwgY3NpZCBwYXJhbXMgJXBcbiIsIF9fZnVuY19fLAotCQkJX19MSU5FX18sIGNzaWRiYXNlLCBjc2lkX3BhcmFtcyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCUNEQkcoIiVzIGNzaWRfcGFyYW1zLCBsYW5lX2NudCA9ICVkLCBsYW5lX2Fzc2lnbiA9ICV4LCBwaHkgc2VsID0gJWRcbiIsCi0JCV9fZnVuY19fLAotCQljc2lkX3BhcmFtcy0+bGFuZV9jbnQsCi0JCWNzaWRfcGFyYW1zLT5sYW5lX2Fzc2lnbiwKLQkJY3NpZF9wYXJhbXMtPnBoeV9zZWwpOwotCXZhbCA9IGNzaWRfcGFyYW1zLT5sYW5lX2NudCAtIDE7Ci0JdmFsIHw9IGNzaWRfcGFyYW1zLT5sYW5lX2Fzc2lnbiA8PCBDU0lEX0RMX0lOUFVUX1NFTF9TSElGVDsKLQlpZiAoY3NpZF9kZXYtPmh3X3ZlcnNpb24gPCAweDMwMDAwMDAwKSB7Ci0JCXZhbCB8PSAoMHhGIDw8IDEwKTsKLQkJbXNtX2NhbWVyYV9pb193KHZhbCwgY3NpZGJhc2UgKyBDU0lEX0NPUkVfQ1RSTF8wX0FERFIpOwotCX0gZWxzZSB7Ci0JCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWRiYXNlICsgQ1NJRF9DT1JFX0NUUkxfMF9BRERSKTsKLQkJdmFsID0gY3NpZF9wYXJhbXMtPnBoeV9zZWwgPDwgQ1NJRF9QSFlfU0VMX1NISUZUOwotCQl2YWwgfD0gMHhGOwotCQltc21fY2FtZXJhX2lvX3codmFsLCBjc2lkYmFzZSArIENTSURfQ09SRV9DVFJMXzFfQUREUik7Ci0JfQotCi0JcmMgPSBtc21fY3NpZF9jaWRfbHV0KCZjc2lkX3BhcmFtcy0+bHV0X3BhcmFtcywgY3NpZGJhc2UpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCW1zbV9jc2lkX3NldF9kZWJ1Z19yZWcoY3NpZGJhc2UsIGNzaWRfcGFyYW1zKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBtc21fY3NpZF9pcnEoaW50IGlycV9udW0sIHZvaWQgKmRhdGEpCi17Ci0JdWludDMyX3QgaXJxOwotCXN0cnVjdCBjc2lkX2RldmljZSAqY3NpZF9kZXYgPSBkYXRhOwotCWlmICghY3NpZF9kZXYpIHsKLQkJcHJfZXJyKCIlczolZCBjc2lkX2RldiBOVUxMXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCWlycSA9IG1zbV9jYW1lcmFfaW9fcihjc2lkX2Rldi0+YmFzZSArIENTSURfSVJRX1NUQVRVU19BRERSKTsKLQlDREJHKCIlcyBDU0lEJWRfSVJRX1NUQVRVU19BRERSID0gMHgleFxuIiwKLQkJIF9fZnVuY19fLCBjc2lkX2Rldi0+cGRldi0+aWQsIGlycSk7Ci0JaWYgKGlycSAmICgweDEgPDwgQ1NJRF9SU1RfRE9ORV9JUlFfQklUU0hJRlQpKQotCQkJY29tcGxldGUoJmNzaWRfZGV2LT5yZXNldF9jb21wbGV0ZSk7Ci0JbXNtX2NhbWVyYV9pb193KGlycSwgY3NpZF9kZXYtPmJhc2UgKyBDU0lEX0lSUV9DTEVBUl9DTURfQUREUik7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1pbnQgbXNtX2NzaWRfaXJxX3JvdXRpbmUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIHN0YXR1cywgYm9vbCAqaGFuZGxlZCkKLXsKLQlzdHJ1Y3QgY3NpZF9kZXZpY2UgKmNzaWRfZGV2ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0JaXJxcmV0dXJuX3QgcmV0OwotCUNEQkcoIiVzIEVcbiIsIF9fZnVuY19fKTsKLQlyZXQgPSBtc21fY3NpZF9pcnEoY3NpZF9kZXYtPmlycS0+c3RhcnQsIGNzaWRfZGV2KTsKLQkqaGFuZGxlZCA9IFRSVUU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9jc2lkX3Jlc2V0KHN0cnVjdCBjc2lkX2RldmljZSAqY3NpZF9kZXYpCi17Ci0JbXNtX2NhbWVyYV9pb193KENTSURfUlNUX1NUQl9BTEwsIGNzaWRfZGV2LT5iYXNlICsgQ1NJRF9SU1RfQ01EX0FERFIpOwotCXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmY3NpZF9kZXYtPnJlc2V0X2NvbXBsZXRlKTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NzaWRfc3ViZGV2X2dfY2hpcF9pZGVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCQkJc3RydWN0IHY0bDJfZGJnX2NoaXBfaWRlbnQgKmNoaXApCi17Ci0JQlVHX09OKCFjaGlwKTsKLQljaGlwLT5pZGVudCA9IFY0TDJfSURFTlRfQ1NJRDsKLQljaGlwLT5yZXZpc2lvbiA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbV9jbGtfaW5mbyBjc2lkXzg5NjBfY2xrX2luZm9bXSA9IHsKLQl7ImNzaV9zcmNfY2xrIiwgMTc3NzgwMDAwfSwKLQl7ImNzaV9jbGsiLCAtMX0sCi0JeyJjc2lfcGh5X2NsayIsIC0xfSwKLQl7ImNzaV9wY2xrIiwgLTF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtX2Nsa19pbmZvIGNzaWQwXzg5NzRfY2xrX2luZm9bXSA9IHsKLQl7ImNzaTBfYWhiX2NsayIsIC0xfSwKLQl7ImNzaTBfc3JjX2NsayIsIDIwMDAwMDAwMH0sCi0JeyJjc2kwX2NsayIsIC0xfSwKLQl7ImNzaTBfcGh5X2NsayIsIC0xfSwKLQl7ImNzaTBfcGl4X2NsayIsIC0xfSwKLQl7ImNzaTBfcmRpX2NsayIsIC0xfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbV9jbGtfaW5mbyBjc2lkMV84OTc0X2Nsa19pbmZvW10gPSB7Ci0JeyJjc2kxX2FoYl9jbGsiLCAtMX0sCi0JeyJjc2kxX3NyY19jbGsiLCAyMDAwMDAwMDB9LAotCXsiY3NpMV9jbGsiLCAtMX0sCi0JeyJjc2kxX3BoeV9jbGsiLCAtMX0sCi0JeyJjc2kxX3BpeF9jbGsiLCAtMX0sCi0JeyJjc2kxX3JkaV9jbGsiLCAtMX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1fY2xrX2luZm8gY3NpZDJfODk3NF9jbGtfaW5mb1tdID0gewotCXsiY3NpMl9haGJfY2xrIiwgLTF9LAotCXsiY3NpMl9zcmNfY2xrIiwgMjAwMDAwMDAwfSwKLQl7ImNzaTJfY2xrIiwgLTF9LAotCXsiY3NpMl9waHlfY2xrIiwgLTF9LAotCXsiY3NpMl9waXhfY2xrIiwgLTF9LAotCXsiY3NpMl9yZGlfY2xrIiwgLTF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtX2Nsa19pbmZvIGNzaWQzXzg5NzRfY2xrX2luZm9bXSA9IHsKLQl7ImNzaTNfYWhiX2NsayIsIC0xfSwKLQl7ImNzaTNfc3JjX2NsayIsIDIwMDAwMDAwMH0sCi0JeyJjc2kzX2NsayIsIC0xfSwKLQl7ImNzaTNfcGh5X2NsayIsIC0xfSwKLQl7ImNzaTNfcGl4X2NsayIsIC0xfSwKLQl7ImNzaTNfcmRpX2NsayIsIC0xfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbV9jbGtfc2V0dGluZyBjc2lkXzg5NzRfY2xrX2luZm9bXSA9IHsKLQl7JmNzaWQwXzg5NzRfY2xrX2luZm9bMF0sIEFSUkFZX1NJWkUoY3NpZDBfODk3NF9jbGtfaW5mbyl9LAotCXsmY3NpZDFfODk3NF9jbGtfaW5mb1swXSwgQVJSQVlfU0laRShjc2lkMV84OTc0X2Nsa19pbmZvKX0sCi0JeyZjc2lkMl84OTc0X2Nsa19pbmZvWzBdLCBBUlJBWV9TSVpFKGNzaWQyXzg5NzRfY2xrX2luZm8pfSwKLQl7JmNzaWQzXzg5NzRfY2xrX2luZm9bMF0sIEFSUkFZX1NJWkUoY3NpZDNfODk3NF9jbGtfaW5mbyl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjYW1lcmFfdnJlZ190IGNzaWRfODk2MF92cmVnX2luZm9bXSA9IHsKLQl7Im1pcGlfY3NpX3ZkZCIsIFJFR19MRE8sIDEyMDAwMDAsIDEyMDAwMDAsIDIwMDAwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2FtZXJhX3ZyZWdfdCBjc2lkXzg5NzRfdnJlZ19pbmZvW10gPSB7Ci0JeyJtaXBpX2NzaV92ZGQiLCBSRUdfTERPLCAxODAwMDAwLCAxODAwMDAwLCAxMjAwMH0sCi19OwotCi1zdGF0aWMgaW50IG1zbV9jc2lkX2luaXQoc3RydWN0IGNzaWRfZGV2aWNlICpjc2lkX2RldiwgdWludDMyX3QgKmNzaWRfdmVyc2lvbikKLXsKLQlpbnQgcmMgPSAwOwotCXVpbnQ4X3QgY29yZV9pZCA9IDA7Ci0KLQlpZiAoIWNzaWRfdmVyc2lvbikgewotCQlwcl9lcnIoIiVzOiVkIGNzaWRfdmVyc2lvbiBOVUxMXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlpZiAoY3NpZF9kZXYtPmNzaWRfc3RhdGUgPT0gQ1NJRF9QT1dFUl9VUCkgewotCQlwcl9lcnIoIiVzOiBjc2lkIGludmFsaWQgc3RhdGUgJWRcbiIsIF9fZnVuY19fLAotCQkJY3NpZF9kZXYtPmNzaWRfc3RhdGUpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQljc2lkX2Rldi0+YmFzZSA9IGlvcmVtYXAoY3NpZF9kZXYtPm1lbS0+c3RhcnQsCi0JCXJlc291cmNlX3NpemUoY3NpZF9kZXYtPm1lbSkpOwotCWlmICghY3NpZF9kZXYtPmJhc2UpIHsKLQkJcHJfZXJyKCIlcyBjc2lkX2Rldi0+YmFzZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmIChDU0lEX1ZFUlNJT04gPD0gQ1NJRF9WRVJTSU9OX1YyKSB7Ci0JCXJjID0gbXNtX2NhbWVyYV9jb25maWdfdnJlZygmY3NpZF9kZXYtPnBkZXYtPmRldiwKLQkJCWNzaWRfODk2MF92cmVnX2luZm8sIEFSUkFZX1NJWkUoY3NpZF84OTYwX3ZyZWdfaW5mbyksCi0JCQlOVUxMLCAwLCAmY3NpZF9kZXYtPmNzaV92ZGQsIDEpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiByZWd1bGF0b3Igb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIHZyZWdfY29uZmlnX2ZhaWxlZDsKLQkJfQotCi0JCXJjID0gbXNtX2NhbWVyYV9lbmFibGVfdnJlZygmY3NpZF9kZXYtPnBkZXYtPmRldiwKLQkJCWNzaWRfODk2MF92cmVnX2luZm8sIEFSUkFZX1NJWkUoY3NpZF84OTYwX3ZyZWdfaW5mbyksCi0JCQlOVUxMLCAwLCAmY3NpZF9kZXYtPmNzaV92ZGQsIDEpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiByZWd1bGF0b3IgZW5hYmxlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJZ290byB2cmVnX2VuYWJsZV9mYWlsZWQ7Ci0JCX0KLQotCQlyYyA9IG1zbV9jYW1fY2xrX2VuYWJsZSgmY3NpZF9kZXYtPnBkZXYtPmRldiwKLQkJCWNzaWRfODk2MF9jbGtfaW5mbywgY3NpZF9kZXYtPmNzaWRfY2xrLAotCQkJQVJSQVlfU0laRShjc2lkXzg5NjBfY2xrX2luZm8pLCAxKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogY2xvY2sgZW5hYmxlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJZ290byBjbGtfZW5hYmxlX2ZhaWxlZDsKLQkJfQotCX0gZWxzZSBpZiAoQ1NJRF9WRVJTSU9OID09IENTSURfVkVSU0lPTl9WMykgewotCQlyYyA9IG1zbV9jYW1lcmFfY29uZmlnX3ZyZWcoJmNzaWRfZGV2LT5wZGV2LT5kZXYsCi0JCQljc2lkXzg5NzRfdnJlZ19pbmZvLCBBUlJBWV9TSVpFKGNzaWRfODk3NF92cmVnX2luZm8pLAotCQkJTlVMTCwgMCwgJmNzaWRfZGV2LT5jc2lfdmRkLCAxKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogcmVndWxhdG9yIG9uIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJZ290byB2cmVnX2NvbmZpZ19mYWlsZWQ7Ci0JCX0KLQotCQlyYyA9IG1zbV9jYW1lcmFfZW5hYmxlX3ZyZWcoJmNzaWRfZGV2LT5wZGV2LT5kZXYsCi0JCQljc2lkXzg5NzRfdnJlZ19pbmZvLCBBUlJBWV9TSVpFKGNzaWRfODk3NF92cmVnX2luZm8pLAotCQkJTlVMTCwgMCwgJmNzaWRfZGV2LT5jc2lfdmRkLCAxKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogcmVndWxhdG9yIGVuYWJsZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gdnJlZ19lbmFibGVfZmFpbGVkOwotCQl9Ci0KLQkJcmMgPSBtc21fY2FtX2Nsa19lbmFibGUoJmNzaWRfZGV2LT5wZGV2LT5kZXYsCi0JCQljc2lkXzg5NzRfY2xrX2luZm9bMF0uY2xrX2luZm8sIGNzaWRfZGV2LT5jc2lkMF9jbGssCi0JCQljc2lkXzg5NzRfY2xrX2luZm9bMF0ubnVtX2Nsa19pbmZvLCAxKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogY2xvY2sgZW5hYmxlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJZ290byBjc2lkMF9jbGtfZW5hYmxlX2ZhaWxlZDsKLQkJfQotCQljb3JlX2lkID0gY3NpZF9kZXYtPnBkZXYtPmlkOwotCQlpZiAoY29yZV9pZCkgewotCQkJcmMgPSBtc21fY2FtX2Nsa19lbmFibGUoJmNzaWRfZGV2LT5wZGV2LT5kZXYsCi0JCQkJY3NpZF84OTc0X2Nsa19pbmZvW2NvcmVfaWRdLmNsa19pbmZvLAotCQkJCWNzaWRfZGV2LT5jc2lkX2NsaywKLQkJCQljc2lkXzg5NzRfY2xrX2luZm9bY29yZV9pZF0ubnVtX2Nsa19pbmZvLCAxKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBjbG9jayBlbmFibGUgZmFpbGVkXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJZ290byBjbGtfZW5hYmxlX2ZhaWxlZDsKLQkJCX0KLQkJfQotCX0KLQotCWNzaWRfZGV2LT5od192ZXJzaW9uID0KLQkJbXNtX2NhbWVyYV9pb19yKGNzaWRfZGV2LT5iYXNlICsgQ1NJRF9IV19WRVJTSU9OX0FERFIpOwotCSpjc2lkX3ZlcnNpb24gPSBjc2lkX2Rldi0+aHdfdmVyc2lvbjsKLQotCWluaXRfY29tcGxldGlvbigmY3NpZF9kZXYtPnJlc2V0X2NvbXBsZXRlKTsKLQotCWVuYWJsZV9pcnEoY3NpZF9kZXYtPmlycS0+c3RhcnQpOwotCi0JbXNtX2NzaWRfcmVzZXQoY3NpZF9kZXYpOwotCWNzaWRfZGV2LT5jc2lkX3N0YXRlID0gQ1NJRF9QT1dFUl9VUDsKLQlyZXR1cm4gcmM7Ci0KLWNsa19lbmFibGVfZmFpbGVkOgotCWlmIChDU0lEX1ZFUlNJT04gPT0gQ1NJRF9WRVJTSU9OX1YzKSB7Ci0JCW1zbV9jYW1fY2xrX2VuYWJsZSgmY3NpZF9kZXYtPnBkZXYtPmRldiwKLQkJCWNzaWRfODk3NF9jbGtfaW5mb1swXS5jbGtfaW5mbywgY3NpZF9kZXYtPmNzaWQwX2NsaywKLQkJCWNzaWRfODk3NF9jbGtfaW5mb1swXS5udW1fY2xrX2luZm8sIDApOwotCX0KLWNzaWQwX2Nsa19lbmFibGVfZmFpbGVkOgotCWlmIChDU0lEX1ZFUlNJT04gPD0gQ1NJRF9WRVJTSU9OX1YyKSB7Ci0JCW1zbV9jYW1lcmFfZW5hYmxlX3ZyZWcoJmNzaWRfZGV2LT5wZGV2LT5kZXYsCi0JCQljc2lkXzg5NjBfdnJlZ19pbmZvLCBBUlJBWV9TSVpFKGNzaWRfODk2MF92cmVnX2luZm8pLAotCQkJTlVMTCwgMCwgJmNzaWRfZGV2LT5jc2lfdmRkLCAwKTsKLQl9IGVsc2UgaWYgKENTSURfVkVSU0lPTiA9PSBDU0lEX1ZFUlNJT05fVjMpIHsKLQkJbXNtX2NhbWVyYV9lbmFibGVfdnJlZygmY3NpZF9kZXYtPnBkZXYtPmRldiwKLQkJCWNzaWRfODk3NF92cmVnX2luZm8sIEFSUkFZX1NJWkUoY3NpZF84OTc0X3ZyZWdfaW5mbyksCi0JCQlOVUxMLCAwLCAmY3NpZF9kZXYtPmNzaV92ZGQsIDApOwotCX0KLXZyZWdfZW5hYmxlX2ZhaWxlZDoKLQlpZiAoQ1NJRF9WRVJTSU9OIDw9IENTSURfVkVSU0lPTl9WMikgewotCQltc21fY2FtZXJhX2NvbmZpZ192cmVnKCZjc2lkX2Rldi0+cGRldi0+ZGV2LAotCQkJY3NpZF84OTYwX3ZyZWdfaW5mbywgQVJSQVlfU0laRShjc2lkXzg5NjBfdnJlZ19pbmZvKSwKLQkJCU5VTEwsIDAsICZjc2lkX2Rldi0+Y3NpX3ZkZCwgMCk7Ci0JfSBlbHNlIGlmIChDU0lEX1ZFUlNJT04gPT0gQ1NJRF9WRVJTSU9OX1YzKSB7Ci0JCW1zbV9jYW1lcmFfY29uZmlnX3ZyZWcoJmNzaWRfZGV2LT5wZGV2LT5kZXYsCi0JCQljc2lkXzg5NzRfdnJlZ19pbmZvLCBBUlJBWV9TSVpFKGNzaWRfODk3NF92cmVnX2luZm8pLAotCQkJTlVMTCwgMCwgJmNzaWRfZGV2LT5jc2lfdmRkLCAwKTsKLQl9Ci12cmVnX2NvbmZpZ19mYWlsZWQ6Ci0JaW91bm1hcChjc2lkX2Rldi0+YmFzZSk7Ci0JY3NpZF9kZXYtPmJhc2UgPSBOVUxMOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fY3NpZF9yZWxlYXNlKHN0cnVjdCBjc2lkX2RldmljZSAqY3NpZF9kZXYpCi17Ci0JdWludDMyX3QgaXJxOwotCXVpbnQ4X3QgY29yZV9pZCA9IDA7Ci0KLQlpZiAoY3NpZF9kZXYtPmNzaWRfc3RhdGUgIT0gQ1NJRF9QT1dFUl9VUCkgewotCQlwcl9lcnIoIiVzOiBjc2lkIGludmFsaWQgc3RhdGUgJWRcbiIsIF9fZnVuY19fLAotCQkJY3NpZF9kZXYtPmNzaWRfc3RhdGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpcnEgPSBtc21fY2FtZXJhX2lvX3IoY3NpZF9kZXYtPmJhc2UgKyBDU0lEX0lSUV9TVEFUVVNfQUREUik7Ci0JbXNtX2NhbWVyYV9pb193KGlycSwgY3NpZF9kZXYtPmJhc2UgKyBDU0lEX0lSUV9DTEVBUl9DTURfQUREUik7Ci0JbXNtX2NhbWVyYV9pb193KDAsIGNzaWRfZGV2LT5iYXNlICsgQ1NJRF9JUlFfTUFTS19BRERSKTsKLQotCWRpc2FibGVfaXJxKGNzaWRfZGV2LT5pcnEtPnN0YXJ0KTsKLQotCWlmIChjc2lkX2Rldi0+aHdfdmVyc2lvbiA8PSBDU0lEX1ZFUlNJT05fVjIpIHsKLQkJbXNtX2NhbV9jbGtfZW5hYmxlKCZjc2lkX2Rldi0+cGRldi0+ZGV2LCBjc2lkXzg5NjBfY2xrX2luZm8sCi0JCQljc2lkX2Rldi0+Y3NpZF9jbGssIEFSUkFZX1NJWkUoY3NpZF84OTYwX2Nsa19pbmZvKSwgMCk7Ci0KLQkJbXNtX2NhbWVyYV9lbmFibGVfdnJlZygmY3NpZF9kZXYtPnBkZXYtPmRldiwKLQkJCWNzaWRfODk2MF92cmVnX2luZm8sIEFSUkFZX1NJWkUoY3NpZF84OTYwX3ZyZWdfaW5mbyksCi0JCQlOVUxMLCAwLCAmY3NpZF9kZXYtPmNzaV92ZGQsIDApOwotCi0JCW1zbV9jYW1lcmFfY29uZmlnX3ZyZWcoJmNzaWRfZGV2LT5wZGV2LT5kZXYsCi0JCQljc2lkXzg5NjBfdnJlZ19pbmZvLCBBUlJBWV9TSVpFKGNzaWRfODk2MF92cmVnX2luZm8pLAotCQkJTlVMTCwgMCwgJmNzaWRfZGV2LT5jc2lfdmRkLCAwKTsKLQl9IGVsc2UgaWYgKGNzaWRfZGV2LT5od192ZXJzaW9uID09IENTSURfVkVSU0lPTl9WMykgewotCQljb3JlX2lkID0gY3NpZF9kZXYtPnBkZXYtPmlkOwotCQlpZiAoY29yZV9pZCkKLQkJCW1zbV9jYW1fY2xrX2VuYWJsZSgmY3NpZF9kZXYtPnBkZXYtPmRldiwKLQkJCQljc2lkXzg5NzRfY2xrX2luZm9bY29yZV9pZF0uY2xrX2luZm8sCi0JCQkJY3NpZF9kZXYtPmNzaWRfY2xrLAotCQkJCWNzaWRfODk3NF9jbGtfaW5mb1tjb3JlX2lkXS5udW1fY2xrX2luZm8sIDApOwotCi0JCW1zbV9jYW1fY2xrX2VuYWJsZSgmY3NpZF9kZXYtPnBkZXYtPmRldiwKLQkJCWNzaWRfODk3NF9jbGtfaW5mb1swXS5jbGtfaW5mbywgY3NpZF9kZXYtPmNzaWQwX2NsaywKLQkJCWNzaWRfODk3NF9jbGtfaW5mb1swXS5udW1fY2xrX2luZm8sIDApOwotCi0JCW1zbV9jYW1lcmFfZW5hYmxlX3ZyZWcoJmNzaWRfZGV2LT5wZGV2LT5kZXYsCi0JCQljc2lkXzg5NzRfdnJlZ19pbmZvLCBBUlJBWV9TSVpFKGNzaWRfODk3NF92cmVnX2luZm8pLAotCQkJTlVMTCwgMCwgJmNzaWRfZGV2LT5jc2lfdmRkLCAwKTsKLQotCQltc21fY2FtZXJhX2NvbmZpZ192cmVnKCZjc2lkX2Rldi0+cGRldi0+ZGV2LAotCQkJY3NpZF84OTc0X3ZyZWdfaW5mbywgQVJSQVlfU0laRShjc2lkXzg5NzRfdnJlZ19pbmZvKSwKLQkJCU5VTEwsIDAsICZjc2lkX2Rldi0+Y3NpX3ZkZCwgMCk7Ci0JfQotCi0JaW91bm1hcChjc2lkX2Rldi0+YmFzZSk7Ci0JY3NpZF9kZXYtPmJhc2UgPSBOVUxMOwotCWNzaWRfZGV2LT5jc2lkX3N0YXRlID0gQ1NJRF9QT1dFUl9ET1dOOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyBtc21fY3NpZF9jbWQoc3RydWN0IGNzaWRfZGV2aWNlICpjc2lkX2Rldiwgdm9pZCAqYXJnKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGNzaWRfY2ZnX2RhdGEgY2RhdGE7Ci0KLQlpZiAoIWNzaWRfZGV2KSB7Ci0JCXByX2VycigiJXM6JWQgY3NpZF9kZXYgTlVMTFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjZGF0YSwKLQkJKHZvaWQgKilhcmcsCi0JCXNpemVvZihzdHJ1Y3QgY3NpZF9jZmdfZGF0YSkpKSB7Ci0JCXByX2VycigiJXM6ICVkIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCUNEQkcoIiVzIGNmZ3R5cGUgPSAlZFxuIiwgX19mdW5jX18sIGNkYXRhLmNmZ3R5cGUpOwotCXN3aXRjaCAoY2RhdGEuY2ZndHlwZSkgewotCWNhc2UgQ1NJRF9JTklUOgotCQlyYyA9IG1zbV9jc2lkX2luaXQoY3NpZF9kZXYsICZjZGF0YS5jZmcuY3NpZF92ZXJzaW9uKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKLQkJCSZjZGF0YSwKLQkJCXNpemVvZihzdHJ1Y3QgY3NpZF9jZmdfZGF0YSkpKSB7Ci0JCQlwcl9lcnIoIiVzOiAlZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDU0lEX0NGRzogewotCQlzdHJ1Y3QgbXNtX2NhbWVyYV9jc2lkX3BhcmFtcyBjc2lkX3BhcmFtczsKLQkJc3RydWN0IG1zbV9jYW1lcmFfY3NpZF92Y19jZmcgKnZjX2NmZyA9IE5VTEw7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY3NpZF9wYXJhbXMsCi0JCQkodm9pZCAqKWNkYXRhLmNmZy5jc2lkX3BhcmFtcywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2NhbWVyYV9jc2lkX3BhcmFtcykpKSB7Ci0JCQlwcl9lcnIoIiVzOiAlZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQl2Y19jZmcgPSBremFsbG9jKGNzaWRfcGFyYW1zLmx1dF9wYXJhbXMubnVtX2NpZCAqCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9jYW1lcmFfY3NpZF92Y19jZmcpLAotCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmICghdmNfY2ZnKSB7Ci0JCQlwcl9lcnIoIiVzOiAlZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIodmNfY2ZnLAotCQkJKHZvaWQgKiljc2lkX3BhcmFtcy5sdXRfcGFyYW1zLnZjX2NmZywKLQkJCShjc2lkX3BhcmFtcy5sdXRfcGFyYW1zLm51bV9jaWQgKgotCQkJc2l6ZW9mKHN0cnVjdCBtc21fY2FtZXJhX2NzaWRfdmNfY2ZnKSkpKSB7Ci0JCQlwcl9lcnIoIiVzOiAlZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlrZnJlZSh2Y19jZmcpOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJY3NpZF9wYXJhbXMubHV0X3BhcmFtcy52Y19jZmcgPSB2Y19jZmc7Ci0JCXJjID0gbXNtX2NzaWRfY29uZmlnKGNzaWRfZGV2LCAmY3NpZF9wYXJhbXMpOwotCQlrZnJlZSh2Y19jZmcpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogJWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyYyA9IC1FTk9JT0NUTENNRDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgbXNtX2NzaWRfc3ViZGV2X2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0JaW50IHJjID0gLUVOT0lPQ1RMQ01EOwotCXN0cnVjdCBjc2lkX2RldmljZSAqY3NpZF9kZXYgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQltdXRleF9sb2NrKCZjc2lkX2Rldi0+bXV0ZXgpOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfTVNNX0NTSURfQ0ZHOgotCQlyYyA9IG1zbV9jc2lkX2NtZChjc2lkX2RldiwgYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBWSURJT0NfTVNNX0NTSURfUkVMRUFTRToKLQkJcmMgPSBtc21fY3NpZF9yZWxlYXNlKGNzaWRfZGV2KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogY29tbWFuZCBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjc2lkX2Rldi0+bXV0ZXgpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgbXNtX2NzaWRfaW50ZXJuYWxfb3BzOwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIG1zbV9jc2lkX3N1YmRldl9jb3JlX29wcyA9IHsKLQkuZ19jaGlwX2lkZW50ID0gJm1zbV9jc2lkX3N1YmRldl9nX2NoaXBfaWRlbnQsCi0JLmlvY3RsID0gJm1zbV9jc2lkX3N1YmRldl9pb2N0bCwKLQkuaW50ZXJydXB0X3NlcnZpY2Vfcm91dGluZSA9IG1zbV9jc2lkX2lycV9yb3V0aW5lLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgbXNtX2NzaWRfc3ViZGV2X29wcyA9IHsKLQkuY29yZSA9ICZtc21fY3NpZF9zdWJkZXZfY29yZV9vcHMsCi19OwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBjc2lkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGNzaWRfZGV2aWNlICpuZXdfY3NpZF9kZXY7Ci0Jc3RydWN0IG1zbV9jYW1fc3ViZGV2X2luZm8gc2RfaW5mbzsKLQlzdHJ1Y3QgaW50cl90YWJsZV9lbnRyeSBpcnFfcmVxOwotCi0JaW50IHJjID0gMDsKLQlDREJHKCIlczolZCBjYWxsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JbmV3X2NzaWRfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNzaWRfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXdfY3NpZF9kZXYpIHsKLQkJcHJfZXJyKCIlczogbm8gZW5vdWdoIG1lbW9yeVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQl2NGwyX3N1YmRldl9pbml0KCZuZXdfY3NpZF9kZXYtPnN1YmRldiwgJm1zbV9jc2lkX3N1YmRldl9vcHMpOwotCW5ld19jc2lkX2Rldi0+c3ViZGV2LmludGVybmFsX29wcyA9ICZtc21fY3NpZF9pbnRlcm5hbF9vcHM7Ci0JbmV3X2NzaWRfZGV2LT5zdWJkZXYuZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7Ci0Jc25wcmludGYobmV3X2NzaWRfZGV2LT5zdWJkZXYubmFtZSwKLQkJCUFSUkFZX1NJWkUobmV3X2NzaWRfZGV2LT5zdWJkZXYubmFtZSksICJtc21fY3NpZCIpOwotCXY0bDJfc2V0X3N1YmRldmRhdGEoJm5ld19jc2lkX2Rldi0+c3ViZGV2LCBuZXdfY3NpZF9kZXYpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsICZuZXdfY3NpZF9kZXYtPnN1YmRldik7Ci0JbXV0ZXhfaW5pdCgmbmV3X2NzaWRfZGV2LT5tdXRleCk7Ci0KLQlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCi0JCW9mX3Byb3BlcnR5X3JlYWRfdTMyKCgmcGRldi0+ZGV2KS0+b2Zfbm9kZSwKLQkJCSJjZWxsLWluZGV4IiwgJnBkZXYtPmlkKTsKLQotCUNEQkcoIiVzIGRldmljZSBpZCAlZFxuIiwgX19mdW5jX18sIHBkZXYtPmlkKTsKLQluZXdfY3NpZF9kZXYtPm1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKLQkJCQkJSU9SRVNPVVJDRV9NRU0sICJjc2lkIik7Ci0JaWYgKCFuZXdfY3NpZF9kZXYtPm1lbSkgewotCQlwcl9lcnIoIiVzOiBubyBtZW0gcmVzb3VyY2U/XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBjc2lkX25vX3Jlc291cmNlOwotCX0KLQluZXdfY3NpZF9kZXYtPmlycSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKLQkJCQkJSU9SRVNPVVJDRV9JUlEsICJjc2lkIik7Ci0JaWYgKCFuZXdfY3NpZF9kZXYtPmlycSkgewotCQlwcl9lcnIoIiVzOiBubyBpcnEgcmVzb3VyY2U/XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBjc2lkX25vX3Jlc291cmNlOwotCX0KLQluZXdfY3NpZF9kZXYtPmlvID0gcmVxdWVzdF9tZW1fcmVnaW9uKG5ld19jc2lkX2Rldi0+bWVtLT5zdGFydCwKLQkJcmVzb3VyY2Vfc2l6ZShuZXdfY3NpZF9kZXYtPm1lbSksIHBkZXYtPm5hbWUpOwotCWlmICghbmV3X2NzaWRfZGV2LT5pbykgewotCQlwcl9lcnIoIiVzOiBubyB2YWxpZCBtZW0gcmVnaW9uXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGNzaWRfbm9fcmVzb3VyY2U7Ci0JfQotCi0JbmV3X2NzaWRfZGV2LT5wZGV2ID0gcGRldjsKLQlzZF9pbmZvLnNkZXZfdHlwZSA9IENTSURfREVWOwotCXNkX2luZm8uc2RfaW5kZXggPSBwZGV2LT5pZDsKLQlzZF9pbmZvLmlycV9udW0gPSBuZXdfY3NpZF9kZXYtPmlycS0+c3RhcnQ7Ci0JbXNtX2NhbV9yZWdpc3Rlcl9zdWJkZXZfbm9kZSgmbmV3X2NzaWRfZGV2LT5zdWJkZXYsICZzZF9pbmZvKTsKLQotCW1lZGlhX2VudGl0eV9pbml0KCZuZXdfY3NpZF9kZXYtPnN1YmRldi5lbnRpdHksIDAsIE5VTEwsIDApOwotCW5ld19jc2lkX2Rldi0+c3ViZGV2LmVudGl0eS50eXBlID0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVY7Ci0JbmV3X2NzaWRfZGV2LT5zdWJkZXYuZW50aXR5Lmdyb3VwX2lkID0gQ1NJRF9ERVY7Ci0JbmV3X2NzaWRfZGV2LT5zdWJkZXYuZW50aXR5Lm5hbWUgPSBwZGV2LT5uYW1lOwotCW5ld19jc2lkX2Rldi0+c3ViZGV2LmVudGl0eS5yZXZpc2lvbiA9Ci0JCW5ld19jc2lkX2Rldi0+c3ViZGV2LmRldm5vZGUtPm51bTsKLQotCS8qIFJlcXVlc3QgZm9yIHRoaXMgZGV2aWNlIGlycSBmcm9tIHRoZSBjYW1lcmEgc2VydmVyLiBJZiB0aGUKLQkgKiBJUlEgUm91dGVyIGlzIHByZXNlbnQgb24gdGhpcyB0YXJnZXQsIHRoZSBpbnRlcnJ1cHQgd2lsbCBiZQotCSAqIGhhbmRsZWQgYnkgdGhlIGNhbWVyYSBzZXJ2ZXIgYW5kIHRoZSBpbnRlcnJ1cHQgc2VydmljZQotCSAqIHJvdXRpbmUgY2FsbGVkLiBJZiB0aGUgcmVxdWVzdF9pcnEgY2FsbCByZXR1cm5zIEVOWElPLCB0aGVuCi0JICogdGhlIElSUSBSb3V0ZXIgaGFyZHdhcmUgaXMgbm90IHByZXNlbnQgb24gdGhpcyB0YXJnZXQuIFdlCi0JICogaGF2ZSB0byByZXF1ZXN0IGZvciB0aGUgaXJxIG91cnNlbHZlcyBhbmQgcmVnaXN0ZXIgdGhlCi0JICogYXBwcm9wcmlhdGUgaW50ZXJydXB0IGhhbmRsZXIuICovCi0JaXJxX3JlcS5jYW1faHdfaWR4ICAgICAgID0gTVNNX0NBTV9IV19DU0kwICsgcGRldi0+aWQ7Ci0JaXJxX3JlcS5kZXZfbmFtZSAgICAgICAgID0gImNzaWQiOwotCWlycV9yZXEuaXJxX2lkeCAgICAgICAgICA9IENBTUVSQV9TU19JUlFfMiArIHBkZXYtPmlkOwotCWlycV9yZXEuaXJxX251bSAgICAgICAgICA9IG5ld19jc2lkX2Rldi0+aXJxLT5zdGFydDsKLQlpcnFfcmVxLmlzX2NvbXBvc2l0ZSAgICAgPSAwOwotCWlycV9yZXEuaXJxX3RyaWdnZXJfdHlwZSA9IElSUUZfVFJJR0dFUl9SSVNJTkc7Ci0JaXJxX3JlcS5udW1faHdjb3JlICAgICAgID0gMTsKLQlpcnFfcmVxLnN1YmRldl9saXN0WzBdICAgPSAmbmV3X2NzaWRfZGV2LT5zdWJkZXY7Ci0JaXJxX3JlcS5kYXRhICAgICAgICAgICAgID0gKHZvaWQgKiluZXdfY3NpZF9kZXY7Ci0JcmMgPSBtc21fY2FtX3NlcnZlcl9yZXF1ZXN0X2lycSgmaXJxX3JlcSk7Ci0JaWYgKHJjID09IC1FTlhJTykgewotCQkvKiBJUlEgUm91dGVyIGhhcmR3YXJlIGlzIG5vdCBwcmVzZW50IG9uIHRoaXMgaGFyZHdhcmUuCi0JCSAqIFJlcXVlc3QgZm9yIHRoZSBJUlEgYW5kIHJlZ2lzdGVyIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KLQkJcmMgPSByZXF1ZXN0X2lycShuZXdfY3NpZF9kZXYtPmlycS0+c3RhcnQsIG1zbV9jc2lkX2lycSwKLQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcsICJjc2lkIiwgbmV3X2NzaWRfZGV2KTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcmVsZWFzZV9tZW1fcmVnaW9uKG5ld19jc2lkX2Rldi0+bWVtLT5zdGFydCwKLQkJCQlyZXNvdXJjZV9zaXplKG5ld19jc2lkX2Rldi0+bWVtKSk7Ci0JCQlwcl9lcnIoIiVzOiBpcnEgcmVxdWVzdCBmYWlsXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWdvdG8gY3NpZF9ub19yZXNvdXJjZTsKLQkJfQotCQlkaXNhYmxlX2lycShuZXdfY3NpZF9kZXYtPmlycS0+c3RhcnQpOwotCX0gZWxzZSBpZiAocmMgPCAwKSB7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihuZXdfY3NpZF9kZXYtPm1lbS0+c3RhcnQsCi0JCQlyZXNvdXJjZV9zaXplKG5ld19jc2lkX2Rldi0+bWVtKSk7Ci0JCXByX2VycigiJXMgRXJyb3IgcmVnaXN0ZXJpbmcgaXJxICIsIF9fZnVuY19fKTsKLQkJZ290byBjc2lkX25vX3Jlc291cmNlOwotCX0KLQotCW5ld19jc2lkX2Rldi0+Y3NpZF9zdGF0ZSA9IENTSURfUE9XRVJfRE9XTjsKLQlyZXR1cm4gMDsKLQotY3NpZF9ub19yZXNvdXJjZToKLQltdXRleF9kZXN0cm95KCZuZXdfY3NpZF9kZXYtPm11dGV4KTsKLQlrZnJlZShuZXdfY3NpZF9kZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fY3NpZF9kdF9tYXRjaFtdID0gewotCXsuY29tcGF0aWJsZSA9ICJxY29tLGNzaWQifSwKLQl7fQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2NzaWRfZHRfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjc2lkX2RyaXZlciA9IHsKLQkucHJvYmUgPSBjc2lkX3Byb2JlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gTVNNX0NTSURfRFJWX05BTUUsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fY3NpZF9kdF9tYXRjaCwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX2NzaWRfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZjc2lkX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtc21fY3NpZF9leGl0X21vZHVsZSh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjc2lkX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KG1zbV9jc2lkX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KG1zbV9jc2lkX2V4aXRfbW9kdWxlKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIENTSUQgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL21zbV9jc2lkLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL21zbV9jc2lkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmY1ZmQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9tc21fY3NpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBNU01fQ1NJRF9ICi0jZGVmaW5lIE1TTV9DU0lEX0gKLQotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KLSNpbmNsdWRlIDxtZWRpYS9tc21fY2FtZXJhLmg+Ci0KLWVudW0gbXNtX2NzaWRfc3RhdGVfdCB7Ci0JQ1NJRF9QT1dFUl9VUCwKLQlDU0lEX1BPV0VSX0RPV04sCi19OwotCi1zdHJ1Y3QgY3NpZF9kZXZpY2UgewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0Jc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmlycTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmlvOwotCXN0cnVjdCByZWd1bGF0b3IgKmNzaV92ZGQ7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlOwotCXN0cnVjdCBtdXRleCBtdXRleDsKLQlzdHJ1Y3QgY29tcGxldGlvbiByZXNldF9jb21wbGV0ZTsKLQl1aW50MzJfdCBod192ZXJzaW9uOwotCWVudW0gbXNtX2NzaWRfc3RhdGVfdCBjc2lkX3N0YXRlOwotCi0Jc3RydWN0IGNsayAqY3NpZDBfY2xrWzZdOwotCXN0cnVjdCBjbGsgKmNzaWRfY2xrWzZdOwotfTsKLQotI2RlZmluZSBWSURJT0NfTVNNX0NTSURfQ0ZHIFwKLQlfSU9XUignVicsIEJBU0VfVklESU9DX1BSSVZBVEUgKyA0LCBzdHJ1Y3QgY3NpY19jZmdfZGF0YSopCi0KLSNkZWZpbmUgVklESU9DX01TTV9DU0lEX1JFTEVBU0UgXAotCV9JT1dSKCdWJywgQkFTRV9WSURJT0NfUFJJVkFURSArIDUsIHN0cnVjdCB2NGwyX3N1YmRldiopCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9tc21fY3NpcGh5LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL21zbV9jc2lwaHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM3NTRlOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL21zbV9jc2lwaHkuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvdnJlZy5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9pc3AuaD4KLSNpbmNsdWRlICJtc21fY3NpcGh5LmgiCi0jaW5jbHVkZSAibXNtLmgiCi0jaW5jbHVkZSAibXNtX2NzaXBoeV9od3JlZy5oIgotI2RlZmluZSBEQkdfQ1NJUEhZIDAKLQotI2RlZmluZSBWNEwyX0lERU5UX0NTSVBIWSAgICAgICAgICAgICAgICAgICAgICAgIDUwMDAzCi0jZGVmaW5lIENTSVBIWV9WRVJTSU9OX1YzICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAotCi1pbnQgbXNtX2NzaXBoeV9sYW5lX2NvbmZpZyhzdHJ1Y3QgY3NpcGh5X2RldmljZSAqY3NpcGh5X2RldiwKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9jc2lwaHlfcGFyYW1zICpjc2lwaHlfcGFyYW1zKQotewotCWludCByYyA9IDA7Ci0JaW50IGogPSAwOwotCXVpbnQzMl90IHZhbCA9IDA7Ci0JdWludDhfdCBsYW5lX2NudCA9IDA7Ci0JdWludDE2X3QgbGFuZV9tYXNrID0gMDsKLQl2b2lkIF9faW9tZW0gKmNzaXBoeWJhc2U7Ci0JY3NpcGh5YmFzZSA9IGNzaXBoeV9kZXYtPmJhc2U7Ci0JaWYgKCFjc2lwaHliYXNlKSB7Ci0JCXByX2VycigiJXM6IGNzaXBoeWJhc2UgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljc2lwaHlfZGV2LT5sYW5lX21hc2tbY3NpcGh5X2Rldi0+cGRldi0+aWRdIHw9IGNzaXBoeV9wYXJhbXMtPmxhbmVfbWFzazsKLQlsYW5lX21hc2sgPSBjc2lwaHlfZGV2LT5sYW5lX21hc2tbY3NpcGh5X2Rldi0+cGRldi0+aWRdOwotCWxhbmVfY250ID0gY3NpcGh5X3BhcmFtcy0+bGFuZV9jbnQ7Ci0JaWYgKGNzaXBoeV9wYXJhbXMtPmxhbmVfY250IDwgMSB8fCBjc2lwaHlfcGFyYW1zLT5sYW5lX2NudCA+IDQpIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgbGFuZSBjbnQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgY3NpcGh5X3BhcmFtcy0+bGFuZV9jbnQpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JQ0RCRygiJXMgY3NpcGh5X3BhcmFtcywgbWFzayA9ICV4LCBjbnQgPSAlZCwgc2V0dGxlIGNudCA9ICV4XG4iLAotCQlfX2Z1bmNfXywKLQkJY3NpcGh5X3BhcmFtcy0+bGFuZV9tYXNrLAotCQljc2lwaHlfcGFyYW1zLT5sYW5lX2NudCwKLQkJY3NpcGh5X3BhcmFtcy0+c2V0dGxlX2NudCk7Ci0JbXNtX2NhbWVyYV9pb193KDB4MSwgY3NpcGh5YmFzZSArIE1JUElfQ1NJUEhZX0dMQkxfVF9JTklUX0NGRzBfQUREUik7Ci0JbXNtX2NhbWVyYV9pb193KDB4MSwgY3NpcGh5YmFzZSArIE1JUElfQ1NJUEhZX1RfV0FLRVVQX0NGRzBfQUREUik7Ci0KLQlpZiAoY3NpcGh5X2Rldi0+aHdfdmVyc2lvbiAhPSBDU0lQSFlfVkVSU0lPTl9WMykgewotCQl2YWwgPSAweDM7Ci0JCW1zbV9jYW1lcmFfaW9fdygobGFuZV9tYXNrIDw8IDIpIHwgdmFsLAotCQkJCWNzaXBoeWJhc2UgKyBNSVBJX0NTSVBIWV9HTEJMX1BXUl9DRkdfQUREUik7Ci0JCW1zbV9jYW1lcmFfaW9fdygweDEwLCBjc2lwaHliYXNlICsgTUlQSV9DU0lQSFlfTE5DS19DRkcyX0FERFIpOwotCQltc21fY2FtZXJhX2lvX3coY3NpcGh5X3BhcmFtcy0+c2V0dGxlX2NudCwKLQkJCSBjc2lwaHliYXNlICsgTUlQSV9DU0lQSFlfTE5DS19DRkczX0FERFIpOwotCQltc21fY2FtZXJhX2lvX3coMHgyNCwKLQkJCWNzaXBoeWJhc2UgKyBNSVBJX0NTSVBIWV9JTlRFUlJVUFRfTUFTSzBfQUREUik7Ci0JCW1zbV9jYW1lcmFfaW9fdygweDI0LAotCQkJY3NpcGh5YmFzZSArIE1JUElfQ1NJUEhZX0lOVEVSUlVQVF9DTEVBUjBfQUREUik7Ci0JfSBlbHNlIHsKLQkJdmFsID0gMHgxOwotCQltc21fY2FtZXJhX2lvX3coKGxhbmVfbWFzayA8PCAxKSB8IHZhbCwKLQkJCQljc2lwaHliYXNlICsgTUlQSV9DU0lQSFlfR0xCTF9QV1JfQ0ZHX0FERFIpOwotCQltc21fY2FtZXJhX2lvX3coY3NpcGh5X3BhcmFtcy0+Y29tYm9fbW9kZSA8PAotCQkJTUlQSV9DU0lQSFlfTU9ERV9DT05GSUdfU0hJRlQsCi0JCQljc2lwaHliYXNlICsgTUlQSV9DU0lQSFlfR0xCTF9SRVNFVF9BRERSKTsKLQl9Ci0KLQlsYW5lX21hc2sgJj0gMHgxZjsKLQl3aGlsZSAobGFuZV9tYXNrICYgMHgxZikgewotCQlpZiAoIShsYW5lX21hc2sgJiAweDEpKSB7Ci0JCQlqKys7Ci0JCQlsYW5lX21hc2sgPj49IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQltc21fY2FtZXJhX2lvX3coMHgxMCwKLQkJCWNzaXBoeWJhc2UgKyBNSVBJX0NTSVBIWV9MTm5fQ0ZHMl9BRERSICsgMHg0MCpqKTsKLQkJbXNtX2NhbWVyYV9pb193KGNzaXBoeV9wYXJhbXMtPnNldHRsZV9jbnQsCi0JCQljc2lwaHliYXNlICsgTUlQSV9DU0lQSFlfTE5uX0NGRzNfQUREUiArIDB4NDAqaik7Ci0JCW1zbV9jYW1lcmFfaW9fdyhNSVBJX0NTSVBIWV9JTlRFUlJVUFRfTUFTS19WQUwsIGNzaXBoeWJhc2UgKwotCQkJTUlQSV9DU0lQSFlfSU5URVJSVVBUX01BU0tfQUREUiArIDB4NCpqKTsKLQkJbXNtX2NhbWVyYV9pb193KE1JUElfQ1NJUEhZX0lOVEVSUlVQVF9NQVNLX1ZBTCwgY3NpcGh5YmFzZSArCi0JCQlNSVBJX0NTSVBIWV9JTlRFUlJVUFRfQ0xFQVJfQUREUiArIDB4NCpqKTsKLQkJaisrOwotCQlsYW5lX21hc2sgPj49IDE7Ci0JfQotCW1zbGVlcCgyMCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgbXNtX2NzaXBoeV9pcnEoaW50IGlycV9udW0sIHZvaWQgKmRhdGEpCi17Ci0JdWludDMyX3QgaXJxOwotCWludCBpOwotCXN0cnVjdCBjc2lwaHlfZGV2aWNlICpjc2lwaHlfZGV2ID0gZGF0YTsKLQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJaXJxID0gbXNtX2NhbWVyYV9pb19yKAotCQkJY3NpcGh5X2Rldi0+YmFzZSArCi0JCQlNSVBJX0NTSVBIWV9JTlRFUlJVUFRfU1RBVFVTMF9BRERSICsgMHg0KmkpOwotCQltc21fY2FtZXJhX2lvX3coaXJxLAotCQkJY3NpcGh5X2Rldi0+YmFzZSArCi0JCQlNSVBJX0NTSVBIWV9JTlRFUlJVUFRfQ0xFQVIwX0FERFIgKyAweDQqaSk7Ci0JCXByX2VycigiJXMgTUlQSV9DU0lQSFklZF9JTlRFUlJVUFRfU1RBVFVTJWQgPSAweCV4XG4iLAotCQkJIF9fZnVuY19fLCBjc2lwaHlfZGV2LT5wZGV2LT5pZCwgaSwgaXJxKTsKLQkJbXNtX2NhbWVyYV9pb193KDB4MSwgY3NpcGh5X2Rldi0+YmFzZSArCi0JCQlNSVBJX0NTSVBIWV9HTEJMX0lSUV9DTURfQUREUik7Ci0JCW1zbV9jYW1lcmFfaW9fdygweDAsIGNzaXBoeV9kZXYtPmJhc2UgKwotCQkJTUlQSV9DU0lQSFlfR0xCTF9JUlFfQ01EX0FERFIpOwotCQltc21fY2FtZXJhX2lvX3coMHgwLAotCQkJY3NpcGh5X2Rldi0+YmFzZSArCi0JCQlNSVBJX0NTSVBIWV9JTlRFUlJVUFRfQ0xFQVIwX0FERFIgKyAweDQqaSk7Ci0JfQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2NzaXBoeV9yZXNldChzdHJ1Y3QgY3NpcGh5X2RldmljZSAqY3NpcGh5X2RldikKLXsKLQltc21fY2FtZXJhX2lvX3coMHgxLCBjc2lwaHlfZGV2LT5iYXNlICsgTUlQSV9DU0lQSFlfR0xCTF9SRVNFVF9BRERSKTsKLQl1c2xlZXBfcmFuZ2UoNTAwMCwgODAwMCk7Ci0JbXNtX2NhbWVyYV9pb193KDB4MCwgY3NpcGh5X2Rldi0+YmFzZSArIE1JUElfQ1NJUEhZX0dMQkxfUkVTRVRfQUREUik7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NzaXBoeV9zdWJkZXZfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQlzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCAqY2hpcCkKLXsKLQlCVUdfT04oIWNoaXApOwotCWNoaXAtPmlkZW50ID0gVjRMMl9JREVOVF9DU0lQSFk7Ci0JY2hpcC0+cmV2aXNpb24gPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1fY2xrX2luZm8gY3NpcGh5Xzg5NjBfY2xrX2luZm9bXSA9IHsKLQl7ImNzaXBoeV90aW1lcl9zcmNfY2xrIiwgMTc3NzgwMDAwfSwKLQl7ImNzaXBoeV90aW1lcl9jbGsiLCAtMX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1fY2xrX2luZm8gY3NpcGh5Xzg5NzRfY2xrX2luZm9bXSA9IHsKLQl7ImlzcGlmX2FoYl9jbGsiLCAtMX0sCi0JeyJjc2lwaHlfdGltZXJfc3JjX2NsayIsIDIwMDAwMDAwMH0sCi0JeyJjc2lwaHlfdGltZXJfY2xrIiwgLTF9LAotfTsKLQotc3RhdGljIGludCBtc21fY3NpcGh5X2luaXQoc3RydWN0IGNzaXBoeV9kZXZpY2UgKmNzaXBoeV9kZXYpCi17Ci0JaW50IHJjID0gMDsKLQlpZiAoY3NpcGh5X2RldiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGNzaXBoeV9kZXYgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FTk9NRU07Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlpZiAoY3NpcGh5X2Rldi0+Y3NpcGh5X3N0YXRlID09IENTSVBIWV9QT1dFUl9VUCkgewotCQlwcl9lcnIoIiVzOiBjc2lwaHkgaW52YWxpZCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sCi0JCQljc2lwaHlfZGV2LT5jc2lwaHlfc3RhdGUpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlpZiAoY3NpcGh5X2Rldi0+cmVmX2NvdW50KyspIHsKLQkJQ0RCRygiJXMgY3NpcGh5IHJlZmNvdW50ID0gJWRcbiIsIF9fZnVuY19fLAotCQkJY3NpcGh5X2Rldi0+cmVmX2NvdW50KTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWNzaXBoeV9kZXYtPmJhc2UgPSBpb3JlbWFwKGNzaXBoeV9kZXYtPm1lbS0+c3RhcnQsCi0JCXJlc291cmNlX3NpemUoY3NpcGh5X2Rldi0+bWVtKSk7Ci0JaWYgKCFjc2lwaHlfZGV2LT5iYXNlKSB7Ci0JCXByX2VycigiJXM6IGNzaXBoeV9kZXYtPmJhc2UgTlVMTFxuIiwgX19mdW5jX18pOwotCQljc2lwaHlfZGV2LT5yZWZfY291bnQtLTsKLQkJcmMgPSAtRU5PTUVNOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKENTSVBIWV9WRVJTSU9OICE9IENTSVBIWV9WRVJTSU9OX1YzKQotCQlyYyA9IG1zbV9jYW1fY2xrX2VuYWJsZSgmY3NpcGh5X2Rldi0+cGRldi0+ZGV2LAotCQkJY3NpcGh5Xzg5NjBfY2xrX2luZm8sIGNzaXBoeV9kZXYtPmNzaXBoeV9jbGssCi0JCQlBUlJBWV9TSVpFKGNzaXBoeV84OTYwX2Nsa19pbmZvKSwgMSk7Ci0JZWxzZQotCQlyYyA9IG1zbV9jYW1fY2xrX2VuYWJsZSgmY3NpcGh5X2Rldi0+cGRldi0+ZGV2LAotCQkJY3NpcGh5Xzg5NzRfY2xrX2luZm8sIGNzaXBoeV9kZXYtPmNzaXBoeV9jbGssCi0JCQlBUlJBWV9TSVpFKGNzaXBoeV84OTc0X2Nsa19pbmZvKSwgMSk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNzaXBoeSBjbGsgZW5hYmxlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQljc2lwaHlfZGV2LT5yZWZfY291bnQtLTsKLQkJaW91bm1hcChjc2lwaHlfZGV2LT5iYXNlKTsKLQkJY3NpcGh5X2Rldi0+YmFzZSA9IE5VTEw7Ci0JCXJldHVybiByYzsKLQl9Ci0KLSNpZiBEQkdfQ1NJUEhZCi0JZW5hYmxlX2lycShjc2lwaHlfZGV2LT5pcnEtPnN0YXJ0KTsKLSNlbmRpZgotCW1zbV9jc2lwaHlfcmVzZXQoY3NpcGh5X2Rldik7Ci0KLQljc2lwaHlfZGV2LT5od192ZXJzaW9uID0KLQkJbXNtX2NhbWVyYV9pb19yKGNzaXBoeV9kZXYtPmJhc2UgKyBNSVBJX0NTSVBIWV9IV19WRVJTSU9OX0FERFIpOwotCi0JY3NpcGh5X2Rldi0+Y3NpcGh5X3N0YXRlID0gQ1NJUEhZX1BPV0VSX1VQOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9jc2lwaHlfcmVsZWFzZShzdHJ1Y3QgY3NpcGh5X2RldmljZSAqY3NpcGh5X2Rldiwgdm9pZCAqYXJnKQotewotCWludCBpID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9jc2lfbGFuZV9wYXJhbXMgKmNzaV9sYW5lX3BhcmFtczsKLQl1aW50MTZfdCBjc2lfbGFuZV9tYXNrOwotCWNzaV9sYW5lX3BhcmFtcyA9IChzdHJ1Y3QgbXNtX2NhbWVyYV9jc2lfbGFuZV9wYXJhbXMgKilhcmc7Ci0JY3NpX2xhbmVfbWFzayA9IGNzaV9sYW5lX3BhcmFtcy0+Y3NpX2xhbmVfbWFzazsKLQotCWlmICghY3NpcGh5X2RldiB8fCAhY3NpcGh5X2Rldi0+cmVmX2NvdW50KSB7Ci0JCXByX2VycigiJXMgY3NpcGh5IGRldiBOVUxMIC8gcmVmX2NvdW50IFpFUk9cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGNzaXBoeV9kZXYtPmNzaXBoeV9zdGF0ZSAhPSBDU0lQSFlfUE9XRVJfVVApIHsKLQkJcHJfZXJyKCIlczogY3NpcGh5IGludmFsaWQgc3RhdGUgJWRcbiIsIF9fZnVuY19fLAotCQkJY3NpcGh5X2Rldi0+Y3NpcGh5X3N0YXRlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JQ0RCRygiJXMgY3NpcGh5X3BhcmFtcywgbGFuZSBhc3NpZ24gJXggbWFzayA9ICV4XG4iLAotCQlfX2Z1bmNfXywKLQkJY3NpX2xhbmVfcGFyYW1zLT5jc2lfbGFuZV9hc3NpZ24sCi0JCWNzaV9sYW5lX3BhcmFtcy0+Y3NpX2xhbmVfbWFzayk7Ci0KLQlpZiAoY3NpcGh5X2Rldi0+aHdfdmVyc2lvbiAhPSBDU0lQSFlfVkVSU0lPTl9WMykgewotCQljc2lwaHlfZGV2LT5sYW5lX21hc2tbY3NpcGh5X2Rldi0+cGRldi0+aWRdID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQkJCW1zbV9jYW1lcmFfaW9fdygweDAsIGNzaXBoeV9kZXYtPmJhc2UgKwotCQkJCU1JUElfQ1NJUEhZX0xObl9DRkcyX0FERFIgKyAweDQwKmkpOwotCX0gZWxzZSB7Ci0JCWNzaXBoeV9kZXYtPmxhbmVfbWFza1tjc2lwaHlfZGV2LT5wZGV2LT5pZF0gJj0KLQkJCX4oY3NpX2xhbmVfcGFyYW1zLT5jc2lfbGFuZV9tYXNrKTsKLQkJaSA9IDA7Ci0JCXdoaWxlIChjc2lfbGFuZV9tYXNrICYgMHgxRikgewotCQkJaWYgKGNzaV9sYW5lX21hc2sgJiAweDEpIHsKLQkJCQltc21fY2FtZXJhX2lvX3coMHgwLCBjc2lwaHlfZGV2LT5iYXNlICsKLQkJCQkJTUlQSV9DU0lQSFlfTE5uX0NGRzJfQUREUiArIDB4NDAqaSk7Ci0JCQl9Ci0JCQljc2lfbGFuZV9tYXNrID4+PSAxOwotCQkJaSsrOwotCQl9Ci0JfQotCi0JaWYgKC0tY3NpcGh5X2Rldi0+cmVmX2NvdW50KSB7Ci0JCUNEQkcoIiVzIGNzaXBoeSByZWZjb3VudCA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCWNzaXBoeV9kZXYtPnJlZl9jb3VudCk7Ci0JCXJldHVybiAwOwotCX0KLQotCW1zbV9jYW1lcmFfaW9fdygweDAsIGNzaXBoeV9kZXYtPmJhc2UgKyBNSVBJX0NTSVBIWV9MTkNLX0NGRzJfQUREUik7Ci0JbXNtX2NhbWVyYV9pb193KDB4MCwgY3NpcGh5X2Rldi0+YmFzZSArIE1JUElfQ1NJUEhZX0dMQkxfUFdSX0NGR19BRERSKTsKLQotI2lmIERCR19DU0lQSFkKLQlkaXNhYmxlX2lycShjc2lwaHlfZGV2LT5pcnEtPnN0YXJ0KTsKLSNlbmRpZgotCWlmIChDU0lQSFlfVkVSU0lPTiAhPSBDU0lQSFlfVkVSU0lPTl9WMykKLQkJbXNtX2NhbV9jbGtfZW5hYmxlKCZjc2lwaHlfZGV2LT5wZGV2LT5kZXYsCi0JCQljc2lwaHlfODk2MF9jbGtfaW5mbywgY3NpcGh5X2Rldi0+Y3NpcGh5X2NsaywKLQkJCUFSUkFZX1NJWkUoY3NpcGh5Xzg5NjBfY2xrX2luZm8pLCAwKTsKLQllbHNlCi0JCW1zbV9jYW1fY2xrX2VuYWJsZSgmY3NpcGh5X2Rldi0+cGRldi0+ZGV2LAotCQkJY3NpcGh5Xzg5NzRfY2xrX2luZm8sIGNzaXBoeV9kZXYtPmNzaXBoeV9jbGssCi0JCQlBUlJBWV9TSVpFKGNzaXBoeV84OTc0X2Nsa19pbmZvKSwgMCk7Ci0KLQlpb3VubWFwKGNzaXBoeV9kZXYtPmJhc2UpOwotCWNzaXBoeV9kZXYtPmJhc2UgPSBOVUxMOwotCWNzaXBoeV9kZXYtPmNzaXBoeV9zdGF0ZSA9IENTSVBIWV9QT1dFUl9ET1dOOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyBtc21fY3NpcGh5X2NtZChzdHJ1Y3QgY3NpcGh5X2RldmljZSAqY3NpcGh5X2Rldiwgdm9pZCAqYXJnKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGNzaXBoeV9jZmdfZGF0YSBjZGF0YTsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9jc2lwaHlfcGFyYW1zIGNzaXBoeV9wYXJhbXM7Ci0JaWYgKCFjc2lwaHlfZGV2KSB7Ci0JCXByX2VycigiJXM6IGNzaXBoeV9kZXYgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZjZGF0YSwKLQkJKHZvaWQgKilhcmcsCi0JCXNpemVvZihzdHJ1Y3QgY3NpcGh5X2NmZ19kYXRhKSkpIHsKLQkJcHJfZXJyKCIlczogJWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0Jc3dpdGNoIChjZGF0YS5jZmd0eXBlKSB7Ci0JY2FzZSBDU0lQSFlfSU5JVDoKLQkJcmMgPSBtc21fY3NpcGh5X2luaXQoY3NpcGh5X2Rldik7Ci0JCWJyZWFrOwotCWNhc2UgQ1NJUEhZX0NGRzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjc2lwaHlfcGFyYW1zLAotCQkJKHZvaWQgKiljZGF0YS5jc2lwaHlfcGFyYW1zLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fY2FtZXJhX2NzaXBoeV9wYXJhbXMpKSkgewotCQkJcHJfZXJyKCIlczogJWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmMgPSBtc21fY3NpcGh5X2xhbmVfY29uZmlnKGNzaXBoeV9kZXYsICZjc2lwaHlfcGFyYW1zKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogJWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyYyA9IC1FTk9JT0NUTENNRDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgbXNtX2NzaXBoeV9zdWJkZXZfaW9jdGwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlpbnQgcmMgPSAtRU5PSU9DVExDTUQ7Ci0Jc3RydWN0IGNzaXBoeV9kZXZpY2UgKmNzaXBoeV9kZXYgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQltdXRleF9sb2NrKCZjc2lwaHlfZGV2LT5tdXRleCk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFZJRElPQ19NU01fQ1NJUEhZX0NGRzoKLQkJcmMgPSBtc21fY3NpcGh5X2NtZChjc2lwaHlfZGV2LCBhcmcpOwotCQlicmVhazsKLQljYXNlIFZJRElPQ19NU01fQ1NJUEhZX1JFTEVBU0U6Ci0JCXJjID0gbXNtX2NzaXBoeV9yZWxlYXNlKGNzaXBoeV9kZXYsIGFyZyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGNvbW1hbmQgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCW11dGV4X3VubG9jaygmY3NpcGh5X2Rldi0+bXV0ZXgpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgbXNtX2NzaXBoeV9pbnRlcm5hbF9vcHM7Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbXNtX2NzaXBoeV9zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmdfY2hpcF9pZGVudCA9ICZtc21fY3NpcGh5X3N1YmRldl9nX2NoaXBfaWRlbnQsCi0JLmlvY3RsID0gJm1zbV9jc2lwaHlfc3ViZGV2X2lvY3RsLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgbXNtX2NzaXBoeV9zdWJkZXZfb3BzID0gewotCS5jb3JlID0gJm1zbV9jc2lwaHlfc3ViZGV2X2NvcmVfb3BzLAotfTsKLQotc3RhdGljIGludCBfX2RldmluaXQgY3NpcGh5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGNzaXBoeV9kZXZpY2UgKm5ld19jc2lwaHlfZGV2OwotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1fc3ViZGV2X2luZm8gc2RfaW5mbzsKLQotCW5ld19jc2lwaHlfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNzaXBoeV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5ld19jc2lwaHlfZGV2KSB7Ci0JCXByX2VycigiJXM6IG5vIGVub3VnaCBtZW1vcnlcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JdjRsMl9zdWJkZXZfaW5pdCgmbmV3X2NzaXBoeV9kZXYtPnN1YmRldiwgJm1zbV9jc2lwaHlfc3ViZGV2X29wcyk7Ci0JbmV3X2NzaXBoeV9kZXYtPnN1YmRldi5pbnRlcm5hbF9vcHMgPSAmbXNtX2NzaXBoeV9pbnRlcm5hbF9vcHM7Ci0JbmV3X2NzaXBoeV9kZXYtPnN1YmRldi5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKLQlzbnByaW50ZihuZXdfY3NpcGh5X2Rldi0+c3ViZGV2Lm5hbWUsCi0JCQlBUlJBWV9TSVpFKG5ld19jc2lwaHlfZGV2LT5zdWJkZXYubmFtZSksICJtc21fY3NpcGh5Iik7Ci0JdjRsMl9zZXRfc3ViZGV2ZGF0YSgmbmV3X2NzaXBoeV9kZXYtPnN1YmRldiwgbmV3X2NzaXBoeV9kZXYpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsICZuZXdfY3NpcGh5X2Rldi0+c3ViZGV2KTsKLQotCW11dGV4X2luaXQoJm5ld19jc2lwaHlfZGV2LT5tdXRleCk7Ci0KLQlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCi0JCW9mX3Byb3BlcnR5X3JlYWRfdTMyKCgmcGRldi0+ZGV2KS0+b2Zfbm9kZSwKLQkJCSJjZWxsLWluZGV4IiwgJnBkZXYtPmlkKTsKLQlDREJHKCIlczogZGV2aWNlIGlkID0gJWRcbiIsIF9fZnVuY19fLCBwZGV2LT5pZCk7Ci0KLQluZXdfY3NpcGh5X2Rldi0+bWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LAotCQkJCQlJT1JFU09VUkNFX01FTSwgImNzaXBoeSIpOwotCWlmICghbmV3X2NzaXBoeV9kZXYtPm1lbSkgewotCQlwcl9lcnIoIiVzOiBubyBtZW0gcmVzb3VyY2U/XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBjc2lwaHlfbm9fcmVzb3VyY2U7Ci0JfQotCW5ld19jc2lwaHlfZGV2LT5pcnEgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsCi0JCQkJCUlPUkVTT1VSQ0VfSVJRLCAiY3NpcGh5Iik7Ci0JaWYgKCFuZXdfY3NpcGh5X2Rldi0+aXJxKSB7Ci0JCXByX2VycigiJXM6IG5vIGlycSByZXNvdXJjZT9cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGNzaXBoeV9ub19yZXNvdXJjZTsKLQl9Ci0JbmV3X2NzaXBoeV9kZXYtPmlvID0gcmVxdWVzdF9tZW1fcmVnaW9uKG5ld19jc2lwaHlfZGV2LT5tZW0tPnN0YXJ0LAotCQlyZXNvdXJjZV9zaXplKG5ld19jc2lwaHlfZGV2LT5tZW0pLCBwZGV2LT5uYW1lKTsKLQlpZiAoIW5ld19jc2lwaHlfZGV2LT5pbykgewotCQlwcl9lcnIoIiVzOiBubyB2YWxpZCBtZW0gcmVnaW9uXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGNzaXBoeV9ub19yZXNvdXJjZTsKLQl9Ci0KLQlyYyA9IHJlcXVlc3RfaXJxKG5ld19jc2lwaHlfZGV2LT5pcnEtPnN0YXJ0LCBtc21fY3NpcGh5X2lycSwKLQkJSVJRRl9UUklHR0VSX1JJU0lORywgImNzaXBoeSIsIG5ld19jc2lwaHlfZGV2KTsKLQlpZiAocmMgPCAwKSB7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihuZXdfY3NpcGh5X2Rldi0+bWVtLT5zdGFydCwKLQkJCXJlc291cmNlX3NpemUobmV3X2NzaXBoeV9kZXYtPm1lbSkpOwotCQlwcl9lcnIoIiVzOiBpcnEgcmVxdWVzdCBmYWlsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGNzaXBoeV9ub19yZXNvdXJjZTsKLQl9Ci0JZGlzYWJsZV9pcnEobmV3X2NzaXBoeV9kZXYtPmlycS0+c3RhcnQpOwotCi0JbmV3X2NzaXBoeV9kZXYtPnBkZXYgPSBwZGV2OwotCXNkX2luZm8uc2Rldl90eXBlID0gQ1NJUEhZX0RFVjsKLQlzZF9pbmZvLnNkX2luZGV4ID0gcGRldi0+aWQ7Ci0Jc2RfaW5mby5pcnFfbnVtID0gbmV3X2NzaXBoeV9kZXYtPmlycS0+c3RhcnQ7Ci0JbXNtX2NhbV9yZWdpc3Rlcl9zdWJkZXZfbm9kZSgKLQkJJm5ld19jc2lwaHlfZGV2LT5zdWJkZXYsICZzZF9pbmZvKTsKLQotCW1lZGlhX2VudGl0eV9pbml0KCZuZXdfY3NpcGh5X2Rldi0+c3ViZGV2LmVudGl0eSwgMCwgTlVMTCwgMCk7Ci0JbmV3X2NzaXBoeV9kZXYtPnN1YmRldi5lbnRpdHkudHlwZSA9IE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWOwotCW5ld19jc2lwaHlfZGV2LT5zdWJkZXYuZW50aXR5Lmdyb3VwX2lkID0gQ1NJUEhZX0RFVjsKLQluZXdfY3NpcGh5X2Rldi0+c3ViZGV2LmVudGl0eS5uYW1lID0gcGRldi0+bmFtZTsKLQluZXdfY3NpcGh5X2Rldi0+c3ViZGV2LmVudGl0eS5yZXZpc2lvbiA9Ci0JCW5ld19jc2lwaHlfZGV2LT5zdWJkZXYuZGV2bm9kZS0+bnVtOwotCW5ld19jc2lwaHlfZGV2LT5jc2lwaHlfc3RhdGUgPSBDU0lQSFlfUE9XRVJfRE9XTjsKLQlyZXR1cm4gMDsKLQotY3NpcGh5X25vX3Jlc291cmNlOgotCW11dGV4X2Rlc3Ryb3koJm5ld19jc2lwaHlfZGV2LT5tdXRleCk7Ci0Ja2ZyZWUobmV3X2NzaXBoeV9kZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fY3NpcGh5X2R0X21hdGNoW10gPSB7Ci0Jey5jb21wYXRpYmxlID0gInFjb20sY3NpcGh5In0sCi0Je30KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV9jc2lwaHlfZHRfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjc2lwaHlfZHJpdmVyID0gewotCS5wcm9iZSA9IGNzaXBoeV9wcm9iZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9IE1TTV9DU0lQSFlfRFJWX05BTUUsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fY3NpcGh5X2R0X21hdGNoLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fY3NpcGh5X2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmY3NpcGh5X2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtc21fY3NpcGh5X2V4aXRfbW9kdWxlKHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmNzaXBoeV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChtc21fY3NpcGh5X2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KG1zbV9jc2lwaHlfZXhpdF9tb2R1bGUpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gQ1NJUEhZIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9tc21fY3NpcGh5LmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL21zbV9jc2lwaHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjOTc1OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL21zbV9jc2lwaHkuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgTVNNX0NTSVBIWV9ICi0jZGVmaW5lIE1TTV9DU0lQSFlfSAotCi0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9jYW1lcmEuaD4KLQotI2RlZmluZSBNQVhfQ1NJUEhZIDMKLQotZW51bSBtc21fY3NpcGh5X3N0YXRlX3QgewotCUNTSVBIWV9QT1dFUl9VUCwKLQlDU0lQSFlfUE9XRVJfRE9XTiwKLX07Ci0KLXN0cnVjdCBjc2lwaHlfZGV2aWNlIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXN0cnVjdCB2NGwyX3N1YmRldiBzdWJkZXY7Ci0Jc3RydWN0IHJlc291cmNlICptZW07Ci0Jc3RydWN0IHJlc291cmNlICppcnE7Ci0Jc3RydWN0IHJlc291cmNlICppbzsKLQl2b2lkIF9faW9tZW0gKmJhc2U7Ci0Jc3RydWN0IG11dGV4IG11dGV4OwotCXVpbnQzMl90IGh3X3ZlcnNpb247Ci0JZW51bSBtc21fY3NpcGh5X3N0YXRlX3QgY3NpcGh5X3N0YXRlOwotCi0Jc3RydWN0IGNsayAqY3NpcGh5X2Nsa1szXTsKLQl1aW50OF90IHJlZl9jb3VudDsKLQl1aW50MTZfdCBsYW5lX21hc2tbTUFYX0NTSVBIWV07Ci19OwotCi0jZGVmaW5lIFZJRElPQ19NU01fQ1NJUEhZX0NGRyBcCi0JX0lPV1IoJ1YnLCBCQVNFX1ZJRElPQ19QUklWQVRFICsgNywgc3RydWN0IGNzaXBoeV9jZmdfZGF0YSopCi0KLSNkZWZpbmUgVklESU9DX01TTV9DU0lQSFlfUkVMRUFTRSBcCi0JX0lPV1IoJ1YnLCBCQVNFX1ZJRElPQ19QUklWQVRFICsgOSwgdm9pZCAqKQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL21zbV9pc3BpZi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9tc21faXNwaWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA5YThkMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL21zbV9pc3BpZi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTI4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgIm1zbV9pc3BpZi5oIgotI2luY2x1ZGUgIm1zbS5oIgotI2luY2x1ZGUgIm1zbV9pc3BpZl9od3JlZy5oIgotCi0jZGVmaW5lIFY0TDJfSURFTlRfSVNQSUYgICAgICAgICAgICAgICAgICAgICA1MDAwMQotI2RlZmluZSBDU0lEX1ZFUlNJT05fVjIgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAxMQotI2RlZmluZSBDU0lEX1ZFUlNJT05fVjMgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwMDAwMAotCi0jZGVmaW5lIE1BWF9DSUQgMTUKLQotc3RhdGljIGF0b21pY190IGlzcGlmX2lycV9jbnQ7Ci1zdGF0aWMgc3BpbmxvY2tfdCBpc3BpZl90YXNrbGV0X2xvY2s7Ci1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBpc3BpZl90YXNrbGV0X3E7Ci0KLXN0YXRpYyBpbnQgbXNtX2lzcGlmX2ludGZfcmVzZXQoc3RydWN0IGlzcGlmX2RldmljZSAqaXNwaWYsCi0JdWludDE2X3QgaW50Zm1hc2ssIHVpbnQ4X3QgdmZlX2ludGYpCi17Ci0JaW50IHJjID0gMDsKLQl1aW50MzJfdCBkYXRhID0gKDB4MSA8PCBTVFJPQkVEX1JTVF9FTik7Ci0JdWludDE2X3QgaW50Zm51bSA9IDAsIG1hc2sgPSBpbnRmbWFzazsKLQotCXdoaWxlIChtYXNrICE9IDApIHsKLQkJaWYgKCEoaW50Zm1hc2sgJiAoMHgxIDw8IGludGZudW0pKSkgewotCQkJbWFzayA+Pj0gMTsKLQkJCWludGZudW0rKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXN3aXRjaCAoaW50Zm51bSkgewotCQljYXNlIFBJWDA6Ci0JCQlkYXRhIHw9ICgweDEgPDwgUElYXzBfVkZFX1JTVF9TVEIpIHwKLQkJCQkoMHgxIDw8IFBJWF8wX0NTSURfUlNUX1NUQik7Ci0JCQlpc3BpZi0+cGl4X3NvZl9jb3VudCA9IDA7Ci0JCQlicmVhazsKLQotCQljYXNlIFJESTA6Ci0JCQlkYXRhIHw9ICgweDEgPDwgUkRJXzBfVkZFX1JTVF9TVEIpIHwKLQkJCQkoMHgxIDw8IFJESV8wX0NTSURfUlNUX1NUQik7Ci0JCQlicmVhazsKLQotCQljYXNlIFBJWDE6Ci0JCQlkYXRhIHw9ICgweDEgPDwgUElYXzFfVkZFX1JTVF9TVEIpIHwKLQkJCQkoMHgxIDw8IFBJWF8xX0NTSURfUlNUX1NUQik7Ci0JCQlicmVhazsKLQotCQljYXNlIFJESTE6Ci0JCQlkYXRhIHw9ICgweDEgPDwgUkRJXzFfVkZFX1JTVF9TVEIpIHwKLQkJCQkoMHgxIDw8IFJESV8xX0NTSURfUlNUX1NUQik7Ci0JCQlicmVhazsKLQotCQljYXNlIFJESTI6Ci0JCQlkYXRhIHw9ICgweDEgPDwgUkRJXzJfVkZFX1JTVF9TVEIpIHwKLQkJCQkoMHgxIDw8IFJESV8yX0NTSURfUlNUX1NUQik7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJbWFzayA+Pj0gMTsKLQkJaW50Zm51bSsrOwotCX0JLyplbmQgd2hpbGUgKi8KLQlpZiAoZGF0YSA+IDB4MSkgewotCQlpZiAodmZlX2ludGYgPT0gVkZFMCkKLQkJCW1zbV9jYW1lcmFfaW9fdyhkYXRhLCBpc3BpZi0+YmFzZSArIElTUElGX1JTVF9DTURfQUREUik7Ci0JCWVsc2UKLQkJCW1zbV9jYW1lcmFfaW9fdyhkYXRhLCBpc3BpZi0+YmFzZSArCi0JCQkJSVNQSUZfUlNUX0NNRF8xX0FERFIpOwotCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmaXNwaWYtPnJlc2V0X2NvbXBsZXRlKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9pc3BpZl9yZXNldChzdHJ1Y3QgaXNwaWZfZGV2aWNlICppc3BpZikKLXsKLQlpbnQgcmMgPSAwOwotCWlzcGlmLT5waXhfc29mX2NvdW50ID0gMDsKLQltc21fY2FtZXJhX2lvX3coSVNQSUZfUlNUX0NNRF9NQVNLLCBpc3BpZi0+YmFzZSArIElTUElGX1JTVF9DTURfQUREUik7Ci0JaWYgKGlzcGlmLT5jc2lkX3ZlcnNpb24gPT0gQ1NJRF9WRVJTSU9OX1YzKQotCQltc21fY2FtZXJhX2lvX3coSVNQSUZfUlNUX0NNRF8xX01BU0ssIGlzcGlmLT5iYXNlICsKLQkJCQlJU1BJRl9SU1RfQ01EXzFfQUREUik7Ci0JcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmlzcGlmLT5yZXNldF9jb21wbGV0ZSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9pc3BpZl9zdWJkZXZfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQlzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCAqY2hpcCkKLXsKLQlCVUdfT04oIWNoaXApOwotCWNoaXAtPmlkZW50ID0gVjRMMl9JREVOVF9JU1BJRjsKLQljaGlwLT5yZXZpc2lvbiA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9pc3BpZl9zZWxfY3NpZF9jb3JlKHN0cnVjdCBpc3BpZl9kZXZpY2UgKmlzcGlmLAotCXVpbnQ4X3QgaW50ZnR5cGUsIHVpbnQ4X3QgY3NpZCwgdWludDhfdCB2ZmVfaW50ZikKLXsKLQlpbnQgcmMgPSAwOwotCXVpbnQzMl90IGRhdGEgPSAwOwotCi0JaWYgKGlzcGlmLT5jc2lkX3ZlcnNpb24gPD0gQ1NJRF9WRVJTSU9OX1YyKSB7Ci0JCWlmIChpc3BpZi0+aXNwaWZfY2xrW2ludGZ0eXBlXSA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIiVzOiBpc3BpZiBOVUxMIGNsa1xuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuOwotCQl9Ci0JCXJjID0gY2xrX3NldF9yYXRlKGlzcGlmLT5pc3BpZl9jbGtbaW50ZnR5cGVdLCBjc2lkKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXByX2VycigiJXM6IGNsa19zZXRfcmF0ZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JfQotCWRhdGEgPSBtc21fY2FtZXJhX2lvX3IoaXNwaWYtPmJhc2UgKyBJU1BJRl9JTlBVVF9TRUxfQUREUiArCi0JCSgweDIwMCAqIHZmZV9pbnRmKSk7Ci0Jc3dpdGNoIChpbnRmdHlwZSkgewotCWNhc2UgUElYMDoKLQkJZGF0YSAmPSB+KDB4Myk7Ci0JCWRhdGEgfD0gY3NpZDsKLQkJYnJlYWs7Ci0KLQljYXNlIFJESTA6Ci0JCWRhdGEgJj0gfigweDMgPDwgNCk7Ci0JCWRhdGEgfD0gKGNzaWQgPDwgNCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBQSVgxOgotCQlkYXRhICY9IH4oMHgzIDw8IDgpOwotCQlkYXRhIHw9IChjc2lkIDw8IDgpOwotCQlicmVhazsKLQotCWNhc2UgUkRJMToKLQkJZGF0YSAmPSB+KDB4MyA8PCAxMik7Ci0JCWRhdGEgfD0gKGNzaWQgPDwgMTIpOwotCQlicmVhazsKLQotCWNhc2UgUkRJMjoKLQkJZGF0YSAmPSB+KDB4MyA8PCAyMCk7Ci0JCWRhdGEgfD0gKGNzaWQgPDwgMjApOwotCQlicmVhazsKLQl9Ci0JaWYgKGRhdGEpIHsKLQkJbXNtX2NhbWVyYV9pb193KGRhdGEsIGlzcGlmLT5iYXNlICsgSVNQSUZfSU5QVVRfU0VMX0FERFIgKwotCQkJKDB4MjAwICogdmZlX2ludGYpKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9pc3BpZl9lbmFibGVfaW50Zl9jaWRzKHN0cnVjdCBpc3BpZl9kZXZpY2UgKmlzcGlmLAotCXVpbnQ4X3QgaW50ZnR5cGUsIHVpbnQxNl90IGNpZF9tYXNrLCB1aW50OF90IHZmZV9pbnRmKQotewotCXVpbnQzMl90IGRhdGEgPSAwOwotCW11dGV4X2xvY2soJmlzcGlmLT5tdXRleCk7Ci0Jc3dpdGNoIChpbnRmdHlwZSkgewotCWNhc2UgUElYMDoKLQkJZGF0YSA9IG1zbV9jYW1lcmFfaW9fcihpc3BpZi0+YmFzZSArCi0JCQlJU1BJRl9QSVhfMF9JTlRGX0NJRF9NQVNLX0FERFIgKyAoMHgyMDAgKiB2ZmVfaW50ZikpOwotCQlkYXRhIHw9IGNpZF9tYXNrOwotCQltc21fY2FtZXJhX2lvX3coZGF0YSwgaXNwaWYtPmJhc2UgKwotCQkJSVNQSUZfUElYXzBfSU5URl9DSURfTUFTS19BRERSICsgKDB4MjAwICogdmZlX2ludGYpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFJESTA6Ci0JCWRhdGEgPSBtc21fY2FtZXJhX2lvX3IoaXNwaWYtPmJhc2UgKwotCQkJSVNQSUZfUkRJXzBfSU5URl9DSURfTUFTS19BRERSICsgKDB4MjAwICogdmZlX2ludGYpKTsKLQkJZGF0YSB8PSBjaWRfbWFzazsKLQkJbXNtX2NhbWVyYV9pb193KGRhdGEsIGlzcGlmLT5iYXNlICsKLQkJCUlTUElGX1JESV8wX0lOVEZfQ0lEX01BU0tfQUREUiArICgweDIwMCAqIHZmZV9pbnRmKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBQSVgxOgotCQlkYXRhID0gbXNtX2NhbWVyYV9pb19yKGlzcGlmLT5iYXNlICsKLQkJCUlTUElGX1BJWF8xX0lOVEZfQ0lEX01BU0tfQUREUiArICgweDIwMCAqIHZmZV9pbnRmKSk7Ci0JCWRhdGEgfD0gY2lkX21hc2s7Ci0JCW1zbV9jYW1lcmFfaW9fdyhkYXRhLCBpc3BpZi0+YmFzZSArCi0JCQlJU1BJRl9QSVhfMV9JTlRGX0NJRF9NQVNLX0FERFIgKyAoMHgyMDAgKiB2ZmVfaW50ZikpOwotCQlicmVhazsKLQotCWNhc2UgUkRJMToKLQkJZGF0YSA9IG1zbV9jYW1lcmFfaW9fcihpc3BpZi0+YmFzZSArCi0JCQlJU1BJRl9SRElfMV9JTlRGX0NJRF9NQVNLX0FERFIgKyAoMHgyMDAgKiB2ZmVfaW50ZikpOwotCQlkYXRhIHw9IGNpZF9tYXNrOwotCQltc21fY2FtZXJhX2lvX3coZGF0YSwgaXNwaWYtPmJhc2UgKwotCQkJSVNQSUZfUkRJXzFfSU5URl9DSURfTUFTS19BRERSICsgKDB4MjAwICogdmZlX2ludGYpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFJESTI6Ci0JCWRhdGEgPSBtc21fY2FtZXJhX2lvX3IoaXNwaWYtPmJhc2UgKwotCQkJSVNQSUZfUkRJXzJfSU5URl9DSURfTUFTS19BRERSICsgKDB4MjAwICogdmZlX2ludGYpKTsKLQkJZGF0YSB8PSBjaWRfbWFzazsKLQkJbXNtX2NhbWVyYV9pb193KGRhdGEsIGlzcGlmLT5iYXNlICsKLQkJCUlTUElGX1JESV8yX0lOVEZfQ0lEX01BU0tfQUREUiArICgweDIwMCAqIHZmZV9pbnRmKSk7Ci0JCWJyZWFrOwotCX0KLQltdXRleF91bmxvY2soJmlzcGlmLT5tdXRleCk7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG1zbV9pc3BpZl92YWxpZGF0ZV9pbnRmX3N0YXR1cyhzdHJ1Y3QgaXNwaWZfZGV2aWNlICppc3BpZiwKLQl1aW50OF90IGludGZ0eXBlLCB1aW50OF90IHZmZV9pbnRmKQotewotCWludDMyX3QgcmMgPSAwOwotCXVpbnQzMl90IGRhdGEgPSAwOwotCW11dGV4X2xvY2soJmlzcGlmLT5tdXRleCk7Ci0Jc3dpdGNoIChpbnRmdHlwZSkgewotCWNhc2UgUElYMDoKLQkJZGF0YSA9IG1zbV9jYW1lcmFfaW9fcihpc3BpZi0+YmFzZSArCi0JCQkJSVNQSUZfUElYXzBfU1RBVFVTX0FERFIgKyAoMHgyMDAgKiB2ZmVfaW50ZikpOwotCQlicmVhazsKLQotCWNhc2UgUkRJMDoKLQkJZGF0YSA9IG1zbV9jYW1lcmFfaW9fcihpc3BpZi0+YmFzZSArCi0JCQkJSVNQSUZfUkRJXzBfU1RBVFVTX0FERFIgKyAoMHgyMDAgKiB2ZmVfaW50ZikpOwotCQlicmVhazsKLQotCWNhc2UgUElYMToKLQkJZGF0YSA9IG1zbV9jYW1lcmFfaW9fcihpc3BpZi0+YmFzZSArCi0JCQkJSVNQSUZfUElYXzFfU1RBVFVTX0FERFIgKyAoMHgyMDAgKiB2ZmVfaW50ZikpOwotCQlicmVhazsKLQotCWNhc2UgUkRJMToKLQkJZGF0YSA9IG1zbV9jYW1lcmFfaW9fcihpc3BpZi0+YmFzZSArCi0JCQkJSVNQSUZfUkRJXzFfU1RBVFVTX0FERFIgKyAoMHgyMDAgKiB2ZmVfaW50ZikpOwotCQlicmVhazsKLQotCWNhc2UgUkRJMjoKLQkJZGF0YSA9IG1zbV9jYW1lcmFfaW9fcihpc3BpZi0+YmFzZSArCi0JCQkJSVNQSUZfUkRJXzJfU1RBVFVTX0FERFIgKyAoMHgyMDAgKiB2ZmVfaW50ZikpOwotCQlicmVhazsKLQl9Ci0JaWYgKChkYXRhICYgMHhmKSAhPSAweGYpCi0JCXJjID0gLUVCVVNZOwotCW11dGV4X3VubG9jaygmaXNwaWYtPm11dGV4KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2lzcGlmX2NvbmZpZyhzdHJ1Y3QgaXNwaWZfZGV2aWNlICppc3BpZiwKLQlzdHJ1Y3QgbXNtX2lzcGlmX3BhcmFtc19saXN0ICpwYXJhbXNfbGlzdCkKLXsKLQl1aW50MzJfdCBwYXJhbXNfbGVuOwotCXN0cnVjdCBtc21faXNwaWZfcGFyYW1zICppc3BpZl9wYXJhbXM7Ci0JaW50IHJjID0gMCwgaSA9IDA7Ci0JdWludDhfdCBpbnRmdHlwZTsKLQl1aW50OF90IHZmZV9pbnRmOwotCXBhcmFtc19sZW4gPSBwYXJhbXNfbGlzdC0+bGVuOwotCWlzcGlmX3BhcmFtcyA9IHBhcmFtc19saXN0LT5wYXJhbXM7Ci0JQ0RCRygiRW5hYmxlIGludGVyZmFjZVxuIik7Ci0JbXNtX2NhbWVyYV9pb193KDB4MDAwMDAwMDAsIGlzcGlmLT5iYXNlICsgSVNQSUZfSVJRX01BU0tfQUREUik7Ci0JbXNtX2NhbWVyYV9pb193KDB4MDAwMDAwMDAsIGlzcGlmLT5iYXNlICsgSVNQSUZfSVJRX01BU0tfMV9BRERSKTsKLQltc21fY2FtZXJhX2lvX3coMHgwMDAwMDAwMCwgaXNwaWYtPmJhc2UgKyBJU1BJRl9JUlFfTUFTS18yX0FERFIpOwotCWZvciAoaSA9IDA7IGkgPCBwYXJhbXNfbGVuOyBpKyspIHsKLQkJaW50ZnR5cGUgPSBpc3BpZl9wYXJhbXNbaV0uaW50ZnR5cGU7Ci0JCXZmZV9pbnRmID0gaXNwaWZfcGFyYW1zW2ldLnZmZV9pbnRmOwotCQlDREJHKCIlcyBpbnRmdHlwZSAleCwgdmZlX2ludGYgJWQsIGNzaWQgJWRcbiIsIF9fZnVuY19fLAotCQkJaW50ZnR5cGUsIHZmZV9pbnRmLCBpc3BpZl9wYXJhbXNbaV0uY3NpZCk7Ci0JCWlmICgoaW50ZnR5cGUgPj0gSU5URl9NQVgpIHx8Ci0JCQkoaXNwaWYtPmNzaWRfdmVyc2lvbiA8PSBDU0lEX1ZFUlNJT05fVjIgJiYKLQkJCXZmZV9pbnRmID4gVkZFMCkgfHwKLQkJCShpc3BpZi0+Y3NpZF92ZXJzaW9uID09IENTSURfVkVSU0lPTl9WMyAmJgotCQkJdmZlX2ludGYgPj0gVkZFX01BWCkpIHsKLQkJCXByX2VycigiJXM6IGludGZ0eXBlIC8gdmZlIGludGYgbm90IHZhbGlkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJcmMgPSBtc21faXNwaWZfdmFsaWRhdGVfaW50Zl9zdGF0dXMoaXNwaWYsIGludGZ0eXBlLCB2ZmVfaW50Zik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6JWQgZmFpbGVkIHJjICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQotCQltc21faXNwaWZfc2VsX2NzaWRfY29yZShpc3BpZiwgaW50ZnR5cGUsIGlzcGlmX3BhcmFtc1tpXS5jc2lkLAotCQkJdmZlX2ludGYpOwotCQltc21faXNwaWZfZW5hYmxlX2ludGZfY2lkcyhpc3BpZiwgaW50ZnR5cGUsCi0JCQlpc3BpZl9wYXJhbXNbaV0uY2lkX21hc2ssIHZmZV9pbnRmKTsKLQl9Ci0KLQltc21fY2FtZXJhX2lvX3coSVNQSUZfSVJRX1NUQVRVU19NQVNLLCBpc3BpZi0+YmFzZSArCi0JCQkJCUlTUElGX0lSUV9NQVNLX0FERFIpOwotCW1zbV9jYW1lcmFfaW9fdyhJU1BJRl9JUlFfU1RBVFVTX01BU0ssIGlzcGlmLT5iYXNlICsKLQkJCQkJSVNQSUZfSVJRX0NMRUFSX0FERFIpOwotCW1zbV9jYW1lcmFfaW9fdyhJU1BJRl9JUlFfU1RBVFVTXzFfTUFTSywgaXNwaWYtPmJhc2UgKwotCQkJCQlJU1BJRl9JUlFfTUFTS18xX0FERFIpOwotCW1zbV9jYW1lcmFfaW9fdyhJU1BJRl9JUlFfU1RBVFVTXzFfTUFTSywgaXNwaWYtPmJhc2UgKwotCQkJCQlJU1BJRl9JUlFfQ0xFQVJfMV9BRERSKTsKLQltc21fY2FtZXJhX2lvX3coSVNQSUZfSVJRX1NUQVRVU18yX01BU0ssIGlzcGlmLT5iYXNlICsKLQkJCQkJSVNQSUZfSVJRX01BU0tfMl9BRERSKTsKLQltc21fY2FtZXJhX2lvX3coSVNQSUZfSVJRX1NUQVRVU18yX01BU0ssIGlzcGlmLT5iYXNlICsKLQkJCQkJSVNQSUZfSVJRX0NMRUFSXzJfQUREUik7Ci0JbXNtX2NhbWVyYV9pb193KElTUElGX0lSUV9HTE9CQUxfQ0xFQVJfQ01ELCBpc3BpZi0+YmFzZSArCi0JCSBJU1BJRl9JUlFfR0xPQkFMX0NMRUFSX0NNRF9BRERSKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBtc21faXNwaWZfZ2V0X2NpZF9tYXNrKHN0cnVjdCBpc3BpZl9kZXZpY2UgKmlzcGlmLAotCXVpbnQxNl90IGludGZ0eXBlLCB1aW50OF90IHZmZV9pbnRmKQotewotCXVpbnQzMl90IG1hc2sgPSAwOwotCXN3aXRjaCAoaW50ZnR5cGUpIHsKLQljYXNlIFBJWDA6Ci0JCW1hc2sgPSBtc21fY2FtZXJhX2lvX3IoaXNwaWYtPmJhc2UgKwotCQkJSVNQSUZfUElYXzBfSU5URl9DSURfTUFTS19BRERSICsgKDB4MjAwICogdmZlX2ludGYpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFJESTA6Ci0JCW1hc2sgPSBtc21fY2FtZXJhX2lvX3IoaXNwaWYtPmJhc2UgKwotCQkJSVNQSUZfUkRJXzBfSU5URl9DSURfTUFTS19BRERSICsgKDB4MjAwICogdmZlX2ludGYpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBJWDE6Ci0JCW1hc2sgPSBtc21fY2FtZXJhX2lvX3IoaXNwaWYtPmJhc2UgKwotCQkJSVNQSUZfUElYXzFfSU5URl9DSURfTUFTS19BRERSICsgKDB4MjAwICogdmZlX2ludGYpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFJESTE6Ci0JCW1hc2sgPSBtc21fY2FtZXJhX2lvX3IoaXNwaWYtPmJhc2UgKwotCQkJSVNQSUZfUkRJXzFfSU5URl9DSURfTUFTS19BRERSICsgKDB4MjAwICogdmZlX2ludGYpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFJESTI6Ci0JCW1hc2sgPSBtc21fY2FtZXJhX2lvX3IoaXNwaWYtPmJhc2UgKwotCQkJSVNQSUZfUkRJXzJfSU5URl9DSURfTUFTS19BRERSICsgKDB4MjAwICogdmZlX2ludGYpKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIG1hc2s7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9pc3BpZl9pbnRmX2NtZChzdHJ1Y3QgaXNwaWZfZGV2aWNlICppc3BpZiwgdWludDE2X3QgaW50Zm1hc2ssCi0JdWludDhfdCBpbnRmX2NtZF9tYXNrLCB1aW50OF90IHZmZV9pbnRmKQotewotCXVpbnQ4X3QgdmMgPSAwLCB2YWwgPSAwOwotCXVpbnQxNl90IG1hc2sgPSBpbnRmbWFzaywgaW50Zm51bSA9IDA7Ci0JdWludDMyX3QgY2lkX21hc2sgPSAwOwotCXVpbnQzMl90IGdsb2JhbF9pbnRmX2NtZF9tYXNrMSA9IDB4RkZGRkZGRkY7Ci0Jd2hpbGUgKG1hc2sgIT0gMCkgewotCQlpZiAoIShpbnRmbWFzayAmICgweDEgPDwgaW50Zm51bSkpKSB7Ci0JCQltYXNrID4+PSAxOwotCQkJaW50Zm51bSsrOwotCQkJY29udGludWU7Ci0JCX0KLQotCQljaWRfbWFzayA9IG1zbV9pc3BpZl9nZXRfY2lkX21hc2soaXNwaWYsIGludGZudW0sIHZmZV9pbnRmKTsKLQkJdmMgPSAwOwotCi0JCXdoaWxlIChjaWRfbWFzayAhPSAwKSB7Ci0JCQlpZiAoKGNpZF9tYXNrICYgMHhmKSAhPSAweDApIHsKLQkJCQlpZiAoaW50Zm51bSAhPSBSREkyKSB7Ci0JCQkJCXZhbCA9IChpbnRmX2NtZF9tYXNrPj4odmMqMikpICYgMHgzOwotCQkJCQlpc3BpZi0+Z2xvYmFsX2ludGZfY21kX21hc2sgfD0KLQkJCQkJCSgweDMgPDwgKCh2YyAqIDIpICsKLQkJCQkJCShpbnRmbnVtICogOCkpKTsKLQkJCQkJaXNwaWYtPmdsb2JhbF9pbnRmX2NtZF9tYXNrICY9Ci0JCQkJCQl+KCgweDMgJiB+dmFsKSA8PCAoKHZjICogMikgKwotCQkJCQkJKGludGZudW0gKiA4KSkpOwotCQkJCX0gZWxzZQotCQkJCQlnbG9iYWxfaW50Zl9jbWRfbWFzazEgJj0KLQkJCQkJCX4oKDB4MyAmIH5pbnRmX2NtZF9tYXNrKQotCQkJCQkJPDwgKCh2YyAqIDIpICsgOCkpOwotCQkJfQotCQkJdmMrKzsKLQkJCWNpZF9tYXNrID4+PSA0OwotCQl9Ci0JCW1hc2sgPj49IDE7Ci0JCWludGZudW0rKzsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGlzcGlmLT5nbG9iYWxfaW50Zl9jbWRfbWFzaywKLQkJaXNwaWYtPmJhc2UgKyBJU1BJRl9JTlRGX0NNRF9BRERSICsgKDB4MjAwICogdmZlX2ludGYpKTsKLQlpZiAoZ2xvYmFsX2ludGZfY21kX21hc2sxICE9IDB4RkZGRkZGRkYpCi0JCW1zbV9jYW1lcmFfaW9fdyhnbG9iYWxfaW50Zl9jbWRfbWFzazEsCi0JCQlpc3BpZi0+YmFzZSArIElTUElGX0lOVEZfQ01EXzFfQUREUiArCi0JCQkoMHgyMDAgKiB2ZmVfaW50ZikpOwotfQotCi1zdGF0aWMgaW50IG1zbV9pc3BpZl9hYm9ydF9pbnRmX3RyYW5zZmVyKHN0cnVjdCBpc3BpZl9kZXZpY2UgKmlzcGlmLAotCXVpbnQxNl90IGludGZtYXNrLCB1aW50OF90IHZmZV9pbnRmKQotewotCWludCByYyA9IDA7Ci0JdWludDhfdCBpbnRmX2NtZF9tYXNrID0gMHhBQTsKLQl1aW50MTZfdCBpbnRmbnVtID0gMCwgbWFzayA9IGludGZtYXNrOwotCW11dGV4X2xvY2soJmlzcGlmLT5tdXRleCk7Ci0JQ0RCRygiJXMgaW50Zm1hc2sgJXggaW50Zl9jbWRfbWFzayAleFxuIiwgX19mdW5jX18sIGludGZtYXNrLAotCQlpbnRmX2NtZF9tYXNrKTsKLQltc21faXNwaWZfaW50Zl9jbWQoaXNwaWYsIGludGZtYXNrLCBpbnRmX2NtZF9tYXNrLCB2ZmVfaW50Zik7Ci0Jd2hpbGUgKG1hc2sgIT0gMCkgewotCQlpZiAoaW50Zm1hc2sgJiAoMHgxIDw8IGludGZudW0pKQotCQkJaXNwaWYtPmdsb2JhbF9pbnRmX2NtZF9tYXNrIHw9ICgweEZGIDw8IChpbnRmbnVtICogOCkpOwotCQltYXNrID4+PSAxOwotCQlpbnRmbnVtKys7Ci0JCWlmIChpbnRmbnVtID09IFJESTIpCi0JCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZpc3BpZi0+bXV0ZXgpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21faXNwaWZfc3RhcnRfaW50Zl90cmFuc2ZlcihzdHJ1Y3QgaXNwaWZfZGV2aWNlICppc3BpZiwKLQl1aW50MTZfdCBpbnRmbWFzaywgdWludDhfdCB2ZmVfaW50ZikKLXsKLQl1aW50OF90IGludGZfY21kX21hc2sgPSAweDU1OwotCWludCByYyA9IDA7Ci0JbXV0ZXhfbG9jaygmaXNwaWYtPm11dGV4KTsKLQlyYyA9IG1zbV9pc3BpZl9pbnRmX3Jlc2V0KGlzcGlmLCBpbnRmbWFzaywgdmZlX2ludGYpOwotCUNEQkcoIiVzIGludGZtYXNrIHN0YXJ0IGFmdGVyJXggaW50Zl9jbWRfbWFzayAleFxuIiwgX19mdW5jX18sIGludGZtYXNrLAotCQlpbnRmX2NtZF9tYXNrKTsKLQltc21faXNwaWZfaW50Zl9jbWQoaXNwaWYsIGludGZtYXNrLCBpbnRmX2NtZF9tYXNrLCB2ZmVfaW50Zik7Ci0JbXV0ZXhfdW5sb2NrKCZpc3BpZi0+bXV0ZXgpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21faXNwaWZfc3RvcF9pbnRmX3RyYW5zZmVyKHN0cnVjdCBpc3BpZl9kZXZpY2UgKmlzcGlmLAotCXVpbnQxNl90IGludGZtYXNrLCB1aW50OF90IHZmZV9pbnRmKQotewotCWludCByYyA9IDA7Ci0JdWludDhfdCBpbnRmX2NtZF9tYXNrID0gMHgwMDsKLQl1aW50MTZfdCBpbnRmbnVtID0gMCwgbWFzayA9IGludGZtYXNrOwotCW11dGV4X2xvY2soJmlzcGlmLT5tdXRleCk7Ci0JQ0RCRygiJXMgaW50Zm1hc2sgJXggaW50Zl9jbWRfbWFzayAleFxuIiwgX19mdW5jX18sIGludGZtYXNrLAotCQlpbnRmX2NtZF9tYXNrKTsKLQltc21faXNwaWZfaW50Zl9jbWQoaXNwaWYsIGludGZtYXNrLCBpbnRmX2NtZF9tYXNrLCB2ZmVfaW50Zik7Ci0Jd2hpbGUgKG1hc2sgIT0gMCkgewotCQlpZiAoaW50Zm1hc2sgJiAoMHgxIDw8IGludGZudW0pKSB7Ci0JCQlzd2l0Y2ggKGludGZudW0pIHsKLQkJCWNhc2UgUElYMDoKLQkJCQl3aGlsZSAoKG1zbV9jYW1lcmFfaW9fcihpc3BpZi0+YmFzZSArCi0JCQkJCUlTUElGX1BJWF8wX1NUQVRVU19BRERSICsKLQkJCQkJKDB4MjAwICogdmZlX2ludGYpKQotCQkJCQkmIDB4ZikgIT0gMHhmKSB7Ci0JCQkJCUNEQkcoIldhaXQgZm9yIHBpeDAgSWRsZVxuIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFJESTA6Ci0JCQkJd2hpbGUgKChtc21fY2FtZXJhX2lvX3IoaXNwaWYtPmJhc2UgKwotCQkJCQlJU1BJRl9SRElfMF9TVEFUVVNfQUREUiArCi0JCQkJCSgweDIwMCAqIHZmZV9pbnRmKSkKLQkJCQkJJiAweGYpICE9IDB4ZikgewotCQkJCQlDREJHKCJXYWl0IGZvciByZGkwIElkbGVcbiIpOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBQSVgxOgotCQkJCXdoaWxlICgobXNtX2NhbWVyYV9pb19yKGlzcGlmLT5iYXNlICsKLQkJCQkJSVNQSUZfUElYXzFfU1RBVFVTX0FERFIgKwotCQkJCQkoMHgyMDAgKiB2ZmVfaW50ZikpCi0JCQkJCSYgMHhmKSAhPSAweGYpIHsKLQkJCQkJQ0RCRygiV2FpdCBmb3IgcGl4MSBJZGxlXG4iKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgUkRJMToKLQkJCQl3aGlsZSAoKG1zbV9jYW1lcmFfaW9fcihpc3BpZi0+YmFzZSArCi0JCQkJCUlTUElGX1JESV8xX1NUQVRVU19BRERSICsKLQkJCQkJKDB4MjAwICogdmZlX2ludGYpKQotCQkJCQkmIDB4ZikgIT0gMHhmKSB7Ci0JCQkJCUNEQkcoIldhaXQgZm9yIHJkaTEgSWRsZVxuIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFJESTI6Ci0JCQkJd2hpbGUgKChtc21fY2FtZXJhX2lvX3IoaXNwaWYtPmJhc2UgKwotCQkJCQlJU1BJRl9SRElfMl9TVEFUVVNfQUREUiArCi0JCQkJCSgweDIwMCAqIHZmZV9pbnRmKSkKLQkJCQkJJiAweGYpICE9IDB4ZikgewotCQkJCQlDREJHKCJXYWl0IGZvciByZGkyIElkbGVcbiIpOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChpbnRmbnVtICE9IFJESTIpCi0JCQkJaXNwaWYtPmdsb2JhbF9pbnRmX2NtZF9tYXNrIHw9ICgweEZGIDw8Ci0JCQkJCShpbnRmbnVtICogOCkpOwotCQl9Ci0JCW1hc2sgPj49IDE7Ci0JCWludGZudW0rKzsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZpc3BpZi0+bXV0ZXgpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21faXNwaWZfc3ViZGV2X3ZpZGVvX3Nfc3RyZWFtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3QgaXNwaWZfZGV2aWNlICppc3BpZiA9Ci0JCQkoc3RydWN0IGlzcGlmX2RldmljZSAqKXY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXVpbnQzMl90IGNtZCA9IGVuYWJsZSAmICgoMTw8SVNQSUZfU19TVFJFQU1fU0hJRlQpLTEpOwotCXVpbnQxNl90IGludGYgPSBlbmFibGUgPj4gSVNQSUZfU19TVFJFQU1fU0hJRlQ7Ci0JdWludDhfdCB2ZmVfaW50ZiA9IGVuYWJsZSA+PiBJU1BJRl9WRkVfSU5URl9TSElGVDsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCUNEQkcoIiVzIGVuYWJsZSAleCwgY21kICV4LCBpbnRmICV4XG4iLCBfX2Z1bmNfXywgZW5hYmxlLCBjbWQsIGludGYpOwotCUJVR19PTighaXNwaWYpOwotCWlmICgoaXNwaWYtPmNzaWRfdmVyc2lvbiA8PSBDU0lEX1ZFUlNJT05fVjIgJiYgdmZlX2ludGYgPiBWRkUwKSB8fAotCQkoaXNwaWYtPmNzaWRfdmVyc2lvbiA9PSBDU0lEX1ZFUlNJT05fVjMgJiYKLQkJdmZlX2ludGYgPj0gVkZFX01BWCkpIHsKLQkJcHJfZXJyKCIlcyBpbnZhbGlkIGNzaWQgdmVyc2lvbiAleCAmJiB2ZmUgaW50ZiAlZFxuIiwgX19mdW5jX18sCi0JCQlpc3BpZi0+Y3NpZF92ZXJzaW9uLCB2ZmVfaW50Zik7Ci0JCXJldHVybiByYzsKLQl9Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIElTUElGX09OX0ZSQU1FX0JPVU5EQVJZOgotCQlyYyA9IG1zbV9pc3BpZl9zdGFydF9pbnRmX3RyYW5zZmVyKGlzcGlmLCBpbnRmLCB2ZmVfaW50Zik7Ci0JCWJyZWFrOwotCWNhc2UgSVNQSUZfT0ZGX0ZSQU1FX0JPVU5EQVJZOgotCQlyYyA9IG1zbV9pc3BpZl9zdG9wX2ludGZfdHJhbnNmZXIoaXNwaWYsIGludGYsIHZmZV9pbnRmKTsKLQkJYnJlYWs7Ci0JY2FzZSBJU1BJRl9PRkZfSU1NRURJQVRFTFk6Ci0JCXJjID0gbXNtX2lzcGlmX2Fib3J0X2ludGZfdHJhbnNmZXIoaXNwaWYsIGludGYsIHZmZV9pbnRmKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgc2VuZF9yZGlfc29mKHN0cnVjdCBpc3BpZl9kZXZpY2UgKmlzcGlmLAotCWVudW0gbXNtX2lzcGlmX2ludGZ0eXBlIGludGVyZmFjZSwgaW50IGNvdW50KQotewotCXN0cnVjdCByZGlfY291bnRfbXNnIHNvZl9tc2c7Ci0Jc29mX21zZy5yZGlfaW50ZXJmYWNlID0gaW50ZXJmYWNlOwotCXNvZl9tc2cuY291bnQgPSBjb3VudDsKLQl2NGwyX3N1YmRldl9ub3RpZnkoJmlzcGlmLT5zdWJkZXYsIE5PVElGWV9BWElfUkRJX1NPRl9DT1VOVCwKLQkJCQkJICAgKHZvaWQgKikmc29mX21zZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlzcGlmX2RvX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzdHJ1Y3QgaXNwaWZfaXNyX3F1ZXVlX2NtZCAqcWNtZCA9IE5VTEw7Ci0Jc3RydWN0IGlzcGlmX2RldmljZSAqaXNwaWY7Ci0KLQlpc3BpZiA9IChzdHJ1Y3QgaXNwaWZfZGV2aWNlICopZGF0YTsKLQl3aGlsZSAoYXRvbWljX3JlYWQoJmlzcGlmX2lycV9jbnQpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpc3BpZl90YXNrbGV0X2xvY2ssIGZsYWdzKTsKLQkJcWNtZCA9IGxpc3RfZmlyc3RfZW50cnkoJmlzcGlmX3Rhc2tsZXRfcSwKLQkJCXN0cnVjdCBpc3BpZl9pc3JfcXVldWVfY21kLCBsaXN0KTsKLQkJYXRvbWljX3N1YigxLCAmaXNwaWZfaXJxX2NudCk7Ci0KLQkJaWYgKCFxY21kKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc3BpZl90YXNrbGV0X2xvY2ssCi0JCQkJZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWxpc3RfZGVsKCZxY21kLT5saXN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNwaWZfdGFza2xldF9sb2NrLAotCQkJZmxhZ3MpOwotCi0JCWtmcmVlKHFjbWQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgaXNwaWZfcHJvY2Vzc19pcnEoc3RydWN0IGlzcGlmX2RldmljZSAqaXNwaWYsCi0Jc3RydWN0IGlzcGlmX2lycV9zdGF0dXMgKm91dCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpc3BpZl9pc3JfcXVldWVfY21kICpxY21kOwotCi0JcWNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpc3BpZl9pc3JfcXVldWVfY21kKSwKLQkJR0ZQX0FUT01JQyk7Ci0JaWYgKCFxY21kKSB7Ci0JCXByX2VycigiaXNwaWZfcHJvY2Vzc19pcnE6IHFjbWQgbWFsbG9jIGZhaWxlZCFcbiIpOwotCQlyZXR1cm47Ci0JfQotCXFjbWQtPmlzcGlmSW50ZXJydXB0U3RhdHVzMCA9IG91dC0+aXNwaWZJcnFTdGF0dXMwOwotCXFjbWQtPmlzcGlmSW50ZXJydXB0U3RhdHVzMSA9IG91dC0+aXNwaWZJcnFTdGF0dXMxOwotCXFjbWQtPmlzcGlmSW50ZXJydXB0U3RhdHVzMiA9IG91dC0+aXNwaWZJcnFTdGF0dXMyOwotCi0JaWYgKHFjbWQtPmlzcGlmSW50ZXJydXB0U3RhdHVzMCAmCi0JCQlJU1BJRl9JUlFfU1RBVFVTX1BJWF9TT0ZfTUFTSykgewotCQkJQ0RCRygiJXM6IGlzcGlmIFBJWCBpcnEgc3RhdHVzIiwgX19mdW5jX18pOwotCQkJaXNwaWYtPnBpeF9zb2ZfY291bnQrKzsKLQkJCXY0bDJfc3ViZGV2X25vdGlmeSgmaXNwaWYtPnN1YmRldiwKLQkJCQlOT1RJRllfVkZFX1BJWF9TT0ZfQ09VTlQsCi0JCQkJKHZvaWQgKikmaXNwaWYtPnBpeF9zb2ZfY291bnQpOwotCX0KLQotCWlmIChxY21kLT5pc3BpZkludGVycnVwdFN0YXR1czAgJgotCQkJSVNQSUZfSVJRX1NUQVRVU19SREkwX1NPRl9NQVNLKSB7Ci0JCQlDREJHKCIlczogaXNwaWYgUkRJMCBpcnEgc3RhdHVzIiwgX19mdW5jX18pOwotCQkJaXNwaWYtPnJkaTBfc29mX2NvdW50Kys7Ci0JCQlzZW5kX3JkaV9zb2YoaXNwaWYsIFJESV8wLCBpc3BpZi0+cmRpMF9zb2ZfY291bnQpOwotCX0KLQlpZiAocWNtZC0+aXNwaWZJbnRlcnJ1cHRTdGF0dXMxICYKLQkJSVNQSUZfSVJRX1NUQVRVU19SREkxX1NPRl9NQVNLKSB7Ci0JCUNEQkcoIiVzOiBpc3BpZiBSREkxIGlycSBzdGF0dXMiLCBfX2Z1bmNfXyk7Ci0JCWlzcGlmLT5yZGkxX3NvZl9jb3VudCsrOwotCQlzZW5kX3JkaV9zb2YoaXNwaWYsIFJESV8xLCBpc3BpZi0+cmRpMV9zb2ZfY291bnQpOwotCX0KLQlpZiAocWNtZC0+aXNwaWZJbnRlcnJ1cHRTdGF0dXMyICYKLQkJSVNQSUZfSVJRX1NUQVRVU19SREkyX1NPRl9NQVNLKSB7Ci0JCUNEQkcoIiVzOiBpc3BpZiBSREkyIGlycSBzdGF0dXMiLCBfX2Z1bmNfXyk7Ci0JCWlzcGlmLT5yZGkyX3NvZl9jb3VudCsrOwotCQlzZW5kX3JkaV9zb2YoaXNwaWYsIFJESV8yLCBpc3BpZi0+cmRpMl9zb2ZfY291bnQpOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpc3BpZl90YXNrbGV0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZxY21kLT5saXN0LCAmaXNwaWZfdGFza2xldF9xKTsKLQotCWF0b21pY19hZGQoMSwgJmlzcGlmX2lycV9jbnQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzcGlmX3Rhc2tsZXRfbG9jaywgZmxhZ3MpOwotCXRhc2tsZXRfc2NoZWR1bGUoJmlzcGlmLT5pc3BpZl90YXNrbGV0KTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtc21faXNwaWZfcmVhZF9pcnFfc3RhdHVzKHN0cnVjdCBpc3BpZl9pcnFfc3RhdHVzICpvdXQsCi0Jdm9pZCAqZGF0YSkKLXsKLQl1aW50MzJfdCBzdGF0dXMwID0gMCwgc3RhdHVzMSA9IDAsIHN0YXR1czIgPSAwOwotCXN0cnVjdCBpc3BpZl9kZXZpY2UgKmlzcGlmID0gKHN0cnVjdCBpc3BpZl9kZXZpY2UgKilkYXRhOwotCW91dC0+aXNwaWZJcnFTdGF0dXMwID0gbXNtX2NhbWVyYV9pb19yKGlzcGlmLT5iYXNlICsKLQkJSVNQSUZfSVJRX1NUQVRVU19BRERSKTsKLQlvdXQtPmlzcGlmSXJxU3RhdHVzMSA9IG1zbV9jYW1lcmFfaW9fcihpc3BpZi0+YmFzZSArCi0JCUlTUElGX0lSUV9TVEFUVVNfMV9BRERSKTsKLQlvdXQtPmlzcGlmSXJxU3RhdHVzMiA9IG1zbV9jYW1lcmFfaW9fcihpc3BpZi0+YmFzZSArCi0JCUlTUElGX0lSUV9TVEFUVVNfMl9BRERSKTsKLQltc21fY2FtZXJhX2lvX3cob3V0LT5pc3BpZklycVN0YXR1czAsCi0JCWlzcGlmLT5iYXNlICsgSVNQSUZfSVJRX0NMRUFSX0FERFIpOwotCW1zbV9jYW1lcmFfaW9fdyhvdXQtPmlzcGlmSXJxU3RhdHVzMSwKLQkJaXNwaWYtPmJhc2UgKyBJU1BJRl9JUlFfQ0xFQVJfMV9BRERSKTsKLQltc21fY2FtZXJhX2lvX3cob3V0LT5pc3BpZklycVN0YXR1czIsCi0JCWlzcGlmLT5iYXNlICsgSVNQSUZfSVJRX0NMRUFSXzJfQUREUik7Ci0KLQlDREJHKCIlczogaXJxIHZmZTAgSXJxX3N0YXR1czAgPSAweCV4LCAxID0gMHgleCwgMiA9IDB4JXhcbiIsCi0JCV9fZnVuY19fLCBvdXQtPmlzcGlmSXJxU3RhdHVzMCwgb3V0LT5pc3BpZklycVN0YXR1czEsCi0JCW91dC0+aXNwaWZJcnFTdGF0dXMyKTsKLQlpZiAob3V0LT5pc3BpZklycVN0YXR1czAgJiBJU1BJRl9JUlFfU1RBVFVTX01BU0spIHsKLQkJaWYgKG91dC0+aXNwaWZJcnFTdGF0dXMwICYgKDB4MSA8PCBSRVNFVF9ET05FX0lSUSkpCi0JCQljb21wbGV0ZSgmaXNwaWYtPnJlc2V0X2NvbXBsZXRlKTsKLQkJaWYgKG91dC0+aXNwaWZJcnFTdGF0dXMwICYgKDB4MSA8PCBQSVhfSU5URl8wX09WRVJGTE9XX0lSUSkpCi0JCQlwcl9lcnIoIiVzOiBwaXggaW50ZiAwIG92ZXJmbG93LlxuIiwgX19mdW5jX18pOwotCQlpZiAob3V0LT5pc3BpZklycVN0YXR1czAgJiAoMHgxIDw8IFJBV19JTlRGXzBfT1ZFUkZMT1dfSVJRKSkKLQkJCXByX2VycigiJXM6IHJkaSBpbnRmIDAgb3ZlcmZsb3cuXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmIChvdXQtPmlzcGlmSXJxU3RhdHVzMSAmICgweDEgPDwgUkFXX0lOVEZfMV9PVkVSRkxPV19JUlEpKQotCQkJcHJfZXJyKCIlczogcmRpIGludGYgMSBvdmVyZmxvdy5cbiIsIF9fZnVuY19fKTsKLQkJaWYgKG91dC0+aXNwaWZJcnFTdGF0dXMyICYgKDB4MSA8PCBSQVdfSU5URl8yX09WRVJGTE9XX0lSUSkpCi0JCQlwcl9lcnIoIiVzOiByZGkgaW50ZiAyIG92ZXJmbG93LlxuIiwgX19mdW5jX18pOwotCQlpZiAoKG91dC0+aXNwaWZJcnFTdGF0dXMwICYgSVNQSUZfSVJRX1NUQVRVU19TT0ZfTUFTSykgfHwKLQkJCShvdXQtPmlzcGlmSXJxU3RhdHVzMSAmCUlTUElGX0lSUV9TVEFUVVNfU09GX01BU0spIHx8Ci0JCQkob3V0LT5pc3BpZklycVN0YXR1czIgJiBJU1BJRl9JUlFfU1RBVFVTX1JESTJfU09GX01BU0spKQotCQkJaXNwaWZfcHJvY2Vzc19pcnEoaXNwaWYsIG91dCk7Ci0JfQotCWlmIChpc3BpZi0+Y3NpZF92ZXJzaW9uID09IENTSURfVkVSU0lPTl9WMykgewotCQlzdGF0dXMwID0gbXNtX2NhbWVyYV9pb19yKGlzcGlmLT5iYXNlICsKLQkJCUlTUElGX0lSUV9TVEFUVVNfQUREUiArIDB4MjAwKTsKLQkJbXNtX2NhbWVyYV9pb193KHN0YXR1czAsCi0JCQlpc3BpZi0+YmFzZSArIElTUElGX0lSUV9DTEVBUl9BRERSICsgMHgyMDApOwotCQlzdGF0dXMxID0gbXNtX2NhbWVyYV9pb19yKGlzcGlmLT5iYXNlICsKLQkJCUlTUElGX0lSUV9TVEFUVVNfMV9BRERSICsgMHgyMDApOwotCQltc21fY2FtZXJhX2lvX3coc3RhdHVzMSwKLQkJCWlzcGlmLT5iYXNlICsgSVNQSUZfSVJRX0NMRUFSXzFfQUREUiArIDB4MjAwKTsKLQkJc3RhdHVzMiA9IG1zbV9jYW1lcmFfaW9fcihpc3BpZi0+YmFzZSArCi0JCQlJU1BJRl9JUlFfU1RBVFVTXzJfQUREUiArIDB4MjAwKTsKLQkJbXNtX2NhbWVyYV9pb193KHN0YXR1czIsCi0JCQlpc3BpZi0+YmFzZSArIElTUElGX0lSUV9DTEVBUl8yX0FERFIgKyAweDIwMCk7Ci0JCUNEQkcoIiVzOiBpcnEgdmZlMSBJcnFfc3RhdHVzMCA9IDB4JXgsIDEgPSAweCV4LCAyID0gMHgleFxuIiwKLQkJCV9fZnVuY19fLCBzdGF0dXMwLCBzdGF0dXMxLCBzdGF0dXMyKTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KElTUElGX0lSUV9HTE9CQUxfQ0xFQVJfQ01ELCBpc3BpZi0+YmFzZSArCi0JCUlTUElGX0lSUV9HTE9CQUxfQ0xFQVJfQ01EX0FERFIpOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgbXNtX2lvX2lzcGlmX2lycShpbnQgaXJxX251bSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXNwaWZfaXJxX3N0YXR1cyBpcnE7Ci0JbXNtX2lzcGlmX3JlYWRfaXJxX3N0YXR1cygmaXJxLCBkYXRhKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbV9jbGtfaW5mbyBpc3BpZl84OTYwX2Nsa19pbmZvW10gPSB7Ci0JeyJjc2lfcGl4X2NsayIsIDB9LAotCXsiY3NpX3JkaV9jbGsiLCAwfSwKLQl7ImNzaV9waXgxX2NsayIsIDB9LAotCXsiY3NpX3JkaTFfY2xrIiwgMH0sCi0JeyJjc2lfcmRpMl9jbGsiLCAwfSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2lzcGlmX2luaXQoc3RydWN0IGlzcGlmX2RldmljZSAqaXNwaWYsCi0JY29uc3QgdWludDMyX3QgKmNzaWRfdmVyc2lvbikKLXsKLQlpbnQgcmMgPSAwOwotCUNEQkcoIiVzIGNhbGxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCWlmIChpc3BpZi0+aXNwaWZfc3RhdGUgPT0gSVNQSUZfUE9XRVJfVVApIHsKLQkJcHJfZXJyKCIlczogaXNwaWYgaW52YWxpZCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sCi0JCQlpc3BpZi0+aXNwaWZfc3RhdGUpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlzcGluX2xvY2tfaW5pdCgmaXNwaWZfdGFza2xldF9sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmaXNwaWZfdGFza2xldF9xKTsKLQlyYyA9IHJlcXVlc3RfaXJxKGlzcGlmLT5pcnEtPnN0YXJ0LCBtc21faW9faXNwaWZfaXJxLAotCQlJUlFGX1RSSUdHRVJfUklTSU5HLCAiaXNwaWYiLCBpc3BpZik7Ci0JaXNwaWYtPmdsb2JhbF9pbnRmX2NtZF9tYXNrID0gMHhGRkZGRkZGRjsKLQlpbml0X2NvbXBsZXRpb24oJmlzcGlmLT5yZXNldF9jb21wbGV0ZSk7Ci0KLQl0YXNrbGV0X2luaXQoJmlzcGlmLT5pc3BpZl90YXNrbGV0LAotCQlpc3BpZl9kb190YXNrbGV0LCAodW5zaWduZWQgbG9uZylpc3BpZik7Ci0KLQlpc3BpZi0+Y3NpZF92ZXJzaW9uID0gKmNzaWRfdmVyc2lvbjsKLQlpZiAoaXNwaWYtPmNzaWRfdmVyc2lvbiA8IENTSURfVkVSU0lPTl9WMikgewotCQlyYyA9IG1zbV9jYW1fY2xrX2VuYWJsZSgmaXNwaWYtPnBkZXYtPmRldiwgaXNwaWZfODk2MF9jbGtfaW5mbywKLQkJCWlzcGlmLT5pc3BpZl9jbGssIDIsIDEpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCX0gZWxzZSBpZiAoaXNwaWYtPmNzaWRfdmVyc2lvbiA9PSBDU0lEX1ZFUlNJT05fVjIpIHsKLQkJcmMgPSBtc21fY2FtX2Nsa19lbmFibGUoJmlzcGlmLT5wZGV2LT5kZXYsIGlzcGlmXzg5NjBfY2xrX2luZm8sCi0JCQlpc3BpZi0+aXNwaWZfY2xrLCBBUlJBWV9TSVpFKGlzcGlmXzg5NjBfY2xrX2luZm8pLCAxKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQl9Ci0JcmMgPSBtc21faXNwaWZfcmVzZXQoaXNwaWYpOwotCWlzcGlmLT5pc3BpZl9zdGF0ZSA9IElTUElGX1BPV0VSX1VQOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2lzcGlmX3JlbGVhc2Uoc3RydWN0IGlzcGlmX2RldmljZSAqaXNwaWYpCi17Ci0JaWYgKGlzcGlmLT5pc3BpZl9zdGF0ZSAhPSBJU1BJRl9QT1dFUl9VUCkgewotCQlwcl9lcnIoIiVzOiBpc3BpZiBpbnZhbGlkIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywKLQkJCWlzcGlmLT5pc3BpZl9zdGF0ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlDREJHKCIlcywgZnJlZV9pcnFcbiIsIF9fZnVuY19fKTsKLQlmcmVlX2lycShpc3BpZi0+aXJxLT5zdGFydCwgaXNwaWYpOwotCXRhc2tsZXRfa2lsbCgmaXNwaWYtPmlzcGlmX3Rhc2tsZXQpOwotCi0JaWYgKGlzcGlmLT5jc2lkX3ZlcnNpb24gPCBDU0lEX1ZFUlNJT05fVjIpIHsKLQkJbXNtX2NhbV9jbGtfZW5hYmxlKCZpc3BpZi0+cGRldi0+ZGV2LCBpc3BpZl84OTYwX2Nsa19pbmZvLAotCQkJaXNwaWYtPmlzcGlmX2NsaywgMiwgMCk7Ci0JfSBlbHNlIGlmIChpc3BpZi0+Y3NpZF92ZXJzaW9uID09IENTSURfVkVSU0lPTl9WMikgewotCQltc21fY2FtX2Nsa19lbmFibGUoJmlzcGlmLT5wZGV2LT5kZXYsIGlzcGlmXzg5NjBfY2xrX2luZm8sCi0JCQlpc3BpZi0+aXNwaWZfY2xrLCBBUlJBWV9TSVpFKGlzcGlmXzg5NjBfY2xrX2luZm8pLCAwKTsKLQl9Ci0JaXNwaWYtPmlzcGlmX3N0YXRlID0gSVNQSUZfUE9XRVJfRE9XTjsKLX0KLQotc3RhdGljIGxvbmcgbXNtX2lzcGlmX2NtZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2b2lkICphcmcpCi17Ci0JbG9uZyByYyA9IDA7Ci0Jc3RydWN0IGlzcGlmX2NmZ19kYXRhIGNkYXRhOwotCXN0cnVjdCBpc3BpZl9kZXZpY2UgKmlzcGlmID0KLQkJKHN0cnVjdCBpc3BpZl9kZXZpY2UgKil2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoJmNkYXRhLCAodm9pZCAqKWFyZywgc2l6ZW9mKHN0cnVjdCBpc3BpZl9jZmdfZGF0YSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlDREJHKCIlcyBjZmd0eXBlID0gJWRcbiIsIF9fZnVuY19fLCBjZGF0YS5jZmd0eXBlKTsKLQlzd2l0Y2ggKGNkYXRhLmNmZ3R5cGUpIHsKLQljYXNlIElTUElGX0lOSVQ6Ci0JCUNEQkcoIiVzIGNzaWRfdmVyc2lvbiA9ICV4XG4iLCBfX2Z1bmNfXywKLQkJCWNkYXRhLmNmZy5jc2lkX3ZlcnNpb24pOwotCQlyYyA9IG1zbV9pc3BpZl9pbml0KGlzcGlmLCAmY2RhdGEuY2ZnLmNzaWRfdmVyc2lvbik7Ci0JCWJyZWFrOwotCWNhc2UgSVNQSUZfU0VUX0NGRzoKLQkJQ0RCRygiJXMgbGVuID0gJWQsIGludGZ0eXBlID0gJWQsLmNpZF9tYXNrID0gJWQsIGNzaWQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLAotCQkJY2RhdGEuY2ZnLmlzcGlmX3BhcmFtcy5sZW4sCi0JCQljZGF0YS5jZmcuaXNwaWZfcGFyYW1zLnBhcmFtc1swXS5pbnRmdHlwZSwKLQkJCWNkYXRhLmNmZy5pc3BpZl9wYXJhbXMucGFyYW1zWzBdLmNpZF9tYXNrLAotCQkJY2RhdGEuY2ZnLmlzcGlmX3BhcmFtcy5wYXJhbXNbMF0uY3NpZCk7Ci0JCXJjID0gbXNtX2lzcGlmX2NvbmZpZyhpc3BpZiwgJmNkYXRhLmNmZy5pc3BpZl9wYXJhbXMpOwotCQlicmVhazsKLQotCWNhc2UgSVNQSUZfU0VUX09OX0ZSQU1FX0JPVU5EQVJZOgotCWNhc2UgSVNQSUZfU0VUX09GRl9GUkFNRV9CT1VOREFSWToKLQljYXNlIElTUElGX1NFVF9PRkZfSU1NRURJQVRFTFk6Ci0JCXJjID0gbXNtX2lzcGlmX3N1YmRldl92aWRlb19zX3N0cmVhbShzZCwgY2RhdGEuY2ZnLmNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSVNQSUZfUkVMRUFTRToKLQkJbXNtX2lzcGlmX3JlbGVhc2UoaXNwaWYpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBsb25nIG1zbV9pc3BpZl9zdWJkZXZfaW9jdGwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQkJCQkJdm9pZCAqYXJnKQotewotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfTVNNX0lTUElGX0NGRzoKLQkJcmV0dXJuIG1zbV9pc3BpZl9jbWQoc2QsIGFyZyk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbXNtX2lzcGlmX3N1YmRldl9jb3JlX29wcyA9IHsKLQkuZ19jaGlwX2lkZW50ID0gJm1zbV9pc3BpZl9zdWJkZXZfZ19jaGlwX2lkZW50LAotCS5pb2N0bCA9ICZtc21faXNwaWZfc3ViZGV2X2lvY3RsLAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgbXNtX2lzcGlmX3N1YmRldl92aWRlb19vcHMgPSB7Ci0JLnNfc3RyZWFtID0gJm1zbV9pc3BpZl9zdWJkZXZfdmlkZW9fc19zdHJlYW0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBtc21faXNwaWZfc3ViZGV2X29wcyA9IHsKLQkuY29yZSA9ICZtc21faXNwaWZfc3ViZGV2X2NvcmVfb3BzLAotCS52aWRlbyA9ICZtc21faXNwaWZfc3ViZGV2X3ZpZGVvX29wcywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfaW50ZXJuYWxfb3BzIG1zbV9pc3BpZl9pbnRlcm5hbF9vcHM7Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGlzcGlmX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbV9zdWJkZXZfaW5mbyBzZF9pbmZvOwotCXN0cnVjdCBpc3BpZl9kZXZpY2UgKmlzcGlmOwotCi0JQ0RCRygiJXNcbiIsIF9fZnVuY19fKTsKLQlpc3BpZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpc3BpZl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlzcGlmKSB7Ci0JCXByX2VycigiJXM6IG5vIGVub3VnaCBtZW1vcnlcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JdjRsMl9zdWJkZXZfaW5pdCgmaXNwaWYtPnN1YmRldiwgJm1zbV9pc3BpZl9zdWJkZXZfb3BzKTsKLQlpc3BpZi0+c3ViZGV2LmludGVybmFsX29wcyA9ICZtc21faXNwaWZfaW50ZXJuYWxfb3BzOwotCWlzcGlmLT5zdWJkZXYuZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7Ci0Jc25wcmludGYoaXNwaWYtPnN1YmRldi5uYW1lLAotCQkJQVJSQVlfU0laRShpc3BpZi0+c3ViZGV2Lm5hbWUpLCAibXNtX2lzcGlmIik7Ci0JdjRsMl9zZXRfc3ViZGV2ZGF0YSgmaXNwaWYtPnN1YmRldiwgaXNwaWYpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsICZpc3BpZi0+c3ViZGV2KTsKLQlzbnByaW50Zihpc3BpZi0+c3ViZGV2Lm5hbWUsIHNpemVvZihpc3BpZi0+c3ViZGV2Lm5hbWUpLAotCQkJCQkJCQkiaXNwaWYiKTsKLQltdXRleF9pbml0KCZpc3BpZi0+bXV0ZXgpOwotCi0JaWYgKHBkZXYtPmRldi5vZl9ub2RlKQotCQlvZl9wcm9wZXJ0eV9yZWFkX3UzMigoJnBkZXYtPmRldiktPm9mX25vZGUsCi0JCQkiY2VsbC1pbmRleCIsICZwZGV2LT5pZCk7Ci0KLQlpc3BpZi0+bWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LAotCQkJCQlJT1JFU09VUkNFX01FTSwgImlzcGlmIik7Ci0JaWYgKCFpc3BpZi0+bWVtKSB7Ci0JCXByX2VycigiJXM6IG5vIG1lbSByZXNvdXJjZT9cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGlzcGlmX25vX3Jlc291cmNlOwotCX0KLQlpc3BpZi0+aXJxID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LAotCQkJCQlJT1JFU09VUkNFX0lSUSwgImlzcGlmIik7Ci0JaWYgKCFpc3BpZi0+aXJxKSB7Ci0JCXByX2VycigiJXM6IG5vIGlycSByZXNvdXJjZT9cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGlzcGlmX25vX3Jlc291cmNlOwotCX0KLQlpc3BpZi0+aW8gPSByZXF1ZXN0X21lbV9yZWdpb24oaXNwaWYtPm1lbS0+c3RhcnQsCi0JCXJlc291cmNlX3NpemUoaXNwaWYtPm1lbSksIHBkZXYtPm5hbWUpOwotCWlmICghaXNwaWYtPmlvKSB7Ci0JCXByX2VycigiJXM6IG5vIHZhbGlkIG1lbSByZWdpb25cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gaXNwaWZfbm9fcmVzb3VyY2U7Ci0JfQotCWlzcGlmLT5iYXNlID0gaW9yZW1hcChpc3BpZi0+bWVtLT5zdGFydCwKLQkJcmVzb3VyY2Vfc2l6ZShpc3BpZi0+bWVtKSk7Ci0JaWYgKCFpc3BpZi0+YmFzZSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gaXNwaWZfbm9fbWVtOwotCX0KLQotCWlzcGlmLT5wZGV2ID0gcGRldjsKLQlzZF9pbmZvLnNkZXZfdHlwZSA9IElTUElGX0RFVjsKLQlzZF9pbmZvLnNkX2luZGV4ID0gcGRldi0+aWQ7Ci0Jc2RfaW5mby5pcnFfbnVtID0gaXNwaWYtPmlycS0+c3RhcnQ7Ci0JbXNtX2NhbV9yZWdpc3Rlcl9zdWJkZXZfbm9kZSgmaXNwaWYtPnN1YmRldiwgJnNkX2luZm8pOwotCi0JbWVkaWFfZW50aXR5X2luaXQoJmlzcGlmLT5zdWJkZXYuZW50aXR5LCAwLCBOVUxMLCAwKTsKLQlpc3BpZi0+c3ViZGV2LmVudGl0eS50eXBlID0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVY7Ci0JaXNwaWYtPnN1YmRldi5lbnRpdHkuZ3JvdXBfaWQgPSBJU1BJRl9ERVY7Ci0JaXNwaWYtPnN1YmRldi5lbnRpdHkubmFtZSA9IHBkZXYtPm5hbWU7Ci0JaXNwaWYtPnN1YmRldi5lbnRpdHkucmV2aXNpb24gPSBpc3BpZi0+c3ViZGV2LmRldm5vZGUtPm51bTsKLQlpc3BpZi0+aXNwaWZfc3RhdGUgPSBJU1BJRl9QT1dFUl9ET1dOOwotCXJldHVybiAwOwotCi1pc3BpZl9ub19tZW06Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGlzcGlmLT5tZW0tPnN0YXJ0LAotCQlyZXNvdXJjZV9zaXplKGlzcGlmLT5tZW0pKTsKLWlzcGlmX25vX3Jlc291cmNlOgotCW11dGV4X2Rlc3Ryb3koJmlzcGlmLT5tdXRleCk7Ci0Ja2ZyZWUoaXNwaWYpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2lzcGlmX2R0X21hdGNoW10gPSB7Ci0Jey5jb21wYXRpYmxlID0gInFjb20saXNwaWYifSwKLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV9pc3BpZl9kdF9tYXRjaCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlzcGlmX2RyaXZlciA9IHsKLQkucHJvYmUgPSBpc3BpZl9wcm9iZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9IE1TTV9JU1BJRl9EUlZfTkFNRSwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9pc3BpZl9kdF9tYXRjaCwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX2lzcGlmX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaXNwaWZfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG1zbV9pc3BpZl9leGl0X21vZHVsZSh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZpc3BpZl9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChtc21faXNwaWZfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQobXNtX2lzcGlmX2V4aXRfbW9kdWxlKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIElTUCBJbnRlcmZhY2UgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL21zbV9pc3BpZi5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NzaS9tc21faXNwaWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3YmQ4MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpL21zbV9pc3BpZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBNU01fSVNQSUZfSAotI2RlZmluZSBNU01fSVNQSUZfSAotCi0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgotCi1zdHJ1Y3QgaXNwaWZfaXJxX3N0YXR1cyB7Ci0JdWludDMyX3QgaXNwaWZJcnFTdGF0dXMwOwotCXVpbnQzMl90IGlzcGlmSXJxU3RhdHVzMTsKLQl1aW50MzJfdCBpc3BpZklycVN0YXR1czI7Ci19OwotCi1lbnVtIG1zbV9pc3BpZl9zdGF0ZV90IHsKLQlJU1BJRl9QT1dFUl9VUCwKLQlJU1BJRl9QT1dFUl9ET1dOLAotfTsKLQotc3RydWN0IGlzcGlmX2RldmljZSB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgc3ViZGV2OwotCXN0cnVjdCByZXNvdXJjZSAqbWVtOwotCXN0cnVjdCByZXNvdXJjZSAqaXJxOwotCXN0cnVjdCByZXNvdXJjZSAqaW87Ci0Jdm9pZCBfX2lvbWVtICpiYXNlOwotCXN0cnVjdCBtdXRleCBtdXRleDsKLQl1aW50OF90IHN0YXJ0X2Fja19wZW5kaW5nOwotCXN0cnVjdCBjb21wbGV0aW9uIHJlc2V0X2NvbXBsZXRlOwotCXVpbnQzMl90IGNzaWRfdmVyc2lvbjsKLQlzdHJ1Y3QgY2xrICppc3BpZl9jbGtbNV07Ci0JdWludDMyX3QgcGl4X3NvZl9jb3VudDsKLQl1aW50MzJfdCByZGkwX3NvZl9jb3VudDsKLQl1aW50MzJfdCByZGkxX3NvZl9jb3VudDsKLQl1aW50MzJfdCByZGkyX3NvZl9jb3VudDsKLQl1aW50MzJfdCBnbG9iYWxfaW50Zl9jbWRfbWFzazsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaXNwaWZfdGFza2xldDsKLQllbnVtIG1zbV9pc3BpZl9zdGF0ZV90IGlzcGlmX3N0YXRlOwotfTsKLQotc3RydWN0IGlzcGlmX2lzcl9xdWV1ZV9jbWQgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQl1aW50MzJfdCAgICBpc3BpZkludGVycnVwdFN0YXR1czA7Ci0JdWludDMyX3QgICAgaXNwaWZJbnRlcnJ1cHRTdGF0dXMxOwotCXVpbnQzMl90ICAgIGlzcGlmSW50ZXJydXB0U3RhdHVzMjsKLX07Ci0KLSNkZWZpbmUgVklESU9DX01TTV9JU1BJRl9DRkcgXAotCV9JT1dSKCdWJywgQkFTRV9WSURJT0NfUFJJVkFURSArIDE4LCBzdHJ1Y3QgaXNwaWZfY2ZnX2RhdGEqKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9lZXByb20vTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZWVwcm9tL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDc0YWVlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9lZXByb20vTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUdDQ19WRVJTSU9OICAgICAgOj0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChQV0QpL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2ggJChDUk9TU19DT01QSUxFKWdjYykKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pbwotb2JqLSQoQ09ORklHX01TTV9FRVBST00pICs9IG1zbV9jYW1lcmFfZWVwcm9tLm8KLW9iai0kKENPTkZJR19JTVgwNzRfRUVQUk9NKSArPSBpbXgwNzRfZWVwcm9tLm8KLW9iai0kKENPTkZJR19JTVgwOTFfRUVQUk9NKSArPSBpbXgwOTFfZWVwcm9tLm8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZWVwcm9tL2lteDA3NF9lZXByb20uYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9lZXByb20vaW14MDc0X2VlcHJvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWZhOWE4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9lZXByb20vaW14MDc0X2VlcHJvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSAibXNtX2NhbWVyYV9lZXByb20uaCIKLSNpbmNsdWRlICJtc21fY2FtZXJhX2kyYy5oIgotCi1ERUZJTkVfTVVURVgoaW14MDc0X2VlcHJvbV9tdXRleCk7Ci1zdGF0aWMgc3RydWN0IG1zbV9lZXByb21fY3RybF90IGlteDA3NF9lZXByb21fdDsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGlteDA3NF9lZXByb21faTJjX2lkW10gPSB7Ci0JeyJpbXgwNzRfZWVwcm9tIiwgKGtlcm5lbF91bG9uZ190KSZpbXgwNzRfZWVwcm9tX3R9LAotCXsgfQotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGlteDA3NF9lZXByb21faTJjX2RyaXZlciA9IHsKLQkuaWRfdGFibGUgPSBpbXgwNzRfZWVwcm9tX2kyY19pZCwKLQkucHJvYmUgID0gbXNtX2VlcHJvbV9pMmNfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZXhpdF9wKGlteDA3NF9lZXByb21faTJjX3JlbW92ZSksCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiaW14MDc0X2VlcHJvbSIsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlteDA3NF9lZXByb21faTJjX2FkZF9kcml2ZXIodm9pZCkKLXsKLQlpbnQgcmMgPSAwOwotCXJjID0gaTJjX2FkZF9kcml2ZXIoaW14MDc0X2VlcHJvbV90LmkyY19kcml2ZXIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBpbXgwNzRfZWVwcm9tX3N1YmRldl9jb3JlX29wcyA9IHsKLQkuaW9jdGwgPSBtc21fZWVwcm9tX3N1YmRldl9pb2N0bCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIGlteDA3NF9lZXByb21fc3ViZGV2X29wcyA9IHsKLQkuY29yZSA9ICZpbXgwNzRfZWVwcm9tX3N1YmRldl9jb3JlX29wcywKLX07Ci0KLXN0YXRpYyB1aW50OF90IGlteDA3NF93YmNhbGliX2RhdGFbNl07Ci1zdGF0aWMgc3RydWN0IG1zbV9jYWxpYl93YiBpbXgwNzRfd2JfZGF0YTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2VlcHJvbV9pbmZvX3QgaW14MDc0X2NhbGliX3N1cHBfaW5mbyA9IHsKLQl7RkFMU0UsIDAsIDAsIDF9LAotCXtUUlVFLCA2LCAwLCAxMDI0fSwKLQl7RkFMU0UsIDAsIDAsIDF9LAotCXtGQUxTRSwgMCwgMCwgMX0sCi0Je0ZBTFNFLCAwLCAwLCAxfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9lZXByb21fcmVhZF90IGlteDA3NF9lZXByb21fcmVhZF90YmxbXSA9IHsKLQl7MHgxMCwgJmlteDA3NF93YmNhbGliX2RhdGFbMF0sIDYsIDB9LAotfTsKLQotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfZWVwcm9tX2RhdGFfdCBpbXgwNzRfZWVwcm9tX2RhdGFfdGJsW10gPSB7Ci0JeyZpbXgwNzRfd2JfZGF0YSwgc2l6ZW9mKHN0cnVjdCBtc21fY2FsaWJfd2IpfSwKLX07Ci0KLXN0YXRpYyB2b2lkIGlteDA3NF9mb3JtYXRfd2JkYXRhKHZvaWQpCi17Ci0JaW14MDc0X3diX2RhdGEucl9vdmVyX2cgPSAodWludDE2X3QpKGlteDA3NF93YmNhbGliX2RhdGFbMF0gPDwgOCkgfAotCQlpbXgwNzRfd2JjYWxpYl9kYXRhWzFdOwotCWlteDA3NF93Yl9kYXRhLmJfb3Zlcl9nID0gKHVpbnQxNl90KShpbXgwNzRfd2JjYWxpYl9kYXRhWzJdIDw8IDgpIHwKLQkJaW14MDc0X3diY2FsaWJfZGF0YVszXTsKLQlpbXgwNzRfd2JfZGF0YS5ncl9vdmVyX2diID0gKHVpbnQxNl90KShpbXgwNzRfd2JjYWxpYl9kYXRhWzRdIDw8IDgpIHwKLQkJaW14MDc0X3diY2FsaWJfZGF0YVs1XTsKLX0KLQotdm9pZCBpbXgwNzRfZm9ybWF0X2NhbGlicmF0aW9uZGF0YSh2b2lkKQotewotCWlteDA3NF9mb3JtYXRfd2JkYXRhKCk7Ci19Ci1zdGF0aWMgc3RydWN0IG1zbV9lZXByb21fY3RybF90IGlteDA3NF9lZXByb21fdCA9IHsKLQkuaTJjX2RyaXZlciA9ICZpbXgwNzRfZWVwcm9tX2kyY19kcml2ZXIsCi0JLmkyY19hZGRyID0gMHhBNCwKLQkuZWVwcm9tX3Y0bDJfc3ViZGV2X29wcyA9ICZpbXgwNzRfZWVwcm9tX3N1YmRldl9vcHMsCi0KLQkuaTJjX2NsaWVudCA9IHsKLQkJLmFkZHJfdHlwZSA9IE1TTV9DQU1FUkFfSTJDX0JZVEVfQUREUiwKLQl9LAotCi0JLmVlcHJvbV9tdXRleCA9ICZpbXgwNzRfZWVwcm9tX211dGV4LAotCi0JLmZ1bmNfdGJsID0gewotCQkuZWVwcm9tX2luaXQgPSBOVUxMLAotCQkuZWVwcm9tX3JlbGVhc2UgPSBOVUxMLAotCQkuZWVwcm9tX2dldF9pbmZvID0gbXNtX2NhbWVyYV9lZXByb21fZ2V0X2luZm8sCi0JCS5lZXByb21fZ2V0X2RhdGEgPSBtc21fY2FtZXJhX2VlcHJvbV9nZXRfZGF0YSwKLQkJLmVlcHJvbV9zZXRfZGV2X2FkZHIgPSBOVUxMLAotCQkuZWVwcm9tX2Zvcm1hdF9kYXRhID0gaW14MDc0X2Zvcm1hdF9jYWxpYnJhdGlvbmRhdGEsCi0JfSwKLQkuaW5mbyA9ICZpbXgwNzRfY2FsaWJfc3VwcF9pbmZvLAotCS5pbmZvX3NpemUgPSBzaXplb2Yoc3RydWN0IG1zbV9jYW1lcmFfZWVwcm9tX2luZm9fdCksCi0JLnJlYWRfdGJsID0gaW14MDc0X2VlcHJvbV9yZWFkX3RibCwKLQkucmVhZF90Ymxfc2l6ZSA9IEFSUkFZX1NJWkUoaW14MDc0X2VlcHJvbV9yZWFkX3RibCksCi0JLmRhdGFfdGJsID0gaW14MDc0X2VlcHJvbV9kYXRhX3RibCwKLQkuZGF0YV90Ymxfc2l6ZSA9IEFSUkFZX1NJWkUoaW14MDc0X2VlcHJvbV9kYXRhX3RibCksCi19OwotCi1zdWJzeXNfaW5pdGNhbGwoaW14MDc0X2VlcHJvbV9pMmNfYWRkX2RyaXZlcik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIklNWDA3NCBFRVBST00iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9lZXByb20vaW14MDkxX2VlcHJvbS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2VlcHJvbS9pbXgwOTFfZWVwcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNjI0YWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2VlcHJvbS9pbXgwOTFfZWVwcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSAibXNtX2NhbWVyYV9lZXByb20uaCIKLSNpbmNsdWRlICJtc21fY2FtZXJhX2kyYy5oIgotCi1ERUZJTkVfTVVURVgoaW14MDkxX2VlcHJvbV9tdXRleCk7Ci1zdGF0aWMgc3RydWN0IG1zbV9lZXByb21fY3RybF90IGlteDA5MV9lZXByb21fdDsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGlteDA5MV9lZXByb21faTJjX2lkW10gPSB7Ci0JeyJpbXgwOTFfZWVwcm9tIiwgKGtlcm5lbF91bG9uZ190KSZpbXgwOTFfZWVwcm9tX3R9LAotCXsgfQotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGlteDA5MV9lZXByb21faTJjX2RyaXZlciA9IHsKLQkuaWRfdGFibGUgPSBpbXgwOTFfZWVwcm9tX2kyY19pZCwKLQkucHJvYmUgID0gbXNtX2VlcHJvbV9pMmNfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZXhpdF9wKGlteDA5MV9lZXByb21faTJjX3JlbW92ZSksCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiaW14MDkxX2VlcHJvbSIsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlteDA5MV9lZXByb21faTJjX2FkZF9kcml2ZXIodm9pZCkKLXsKLQlpbnQgcmMgPSAwOwotCXJjID0gaTJjX2FkZF9kcml2ZXIoaW14MDkxX2VlcHJvbV90LmkyY19kcml2ZXIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBpbXgwOTFfZWVwcm9tX3N1YmRldl9jb3JlX29wcyA9IHsKLQkuaW9jdGwgPSBtc21fZWVwcm9tX3N1YmRldl9pb2N0bCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIGlteDA5MV9lZXByb21fc3ViZGV2X29wcyA9IHsKLQkuY29yZSA9ICZpbXgwOTFfZWVwcm9tX3N1YmRldl9jb3JlX29wcywKLX07Ci0KLXN0YXRpYyB1aW50OF90IGlteDA5MV93YmNhbGliX2RhdGFbNl07Ci1zdGF0aWMgdWludDhfdCBpbXgwOTFfYWZjYWxpYl9kYXRhWzZdOwotc3RhdGljIHN0cnVjdCBtc21fY2FsaWJfd2IgaW14MDkxX3diX2RhdGE7Ci1zdGF0aWMgc3RydWN0IG1zbV9jYWxpYl9hZiBpbXgwOTFfYWZfZGF0YTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2VlcHJvbV9pbmZvX3QgaW14MDkxX2NhbGliX3N1cHBfaW5mbyA9IHsKLQl7VFJVRSwgNiwgMSwgMX0sCi0Je1RSVUUsIDYsIDAsIDMyNzY4fSwKLQl7RkFMU0UsIDAsIDAsIDF9LAotCXtGQUxTRSwgMCwgMCwgMX0sCi0Je0ZBTFNFLCAwLCAwLCAxfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9lZXByb21fcmVhZF90IGlteDA5MV9lZXByb21fcmVhZF90YmxbXSA9IHsKLQl7MHgwNSwgJmlteDA5MV93YmNhbGliX2RhdGFbMF0sIDYsIDB9LAotCXsweDBCLCAmaW14MDkxX2FmY2FsaWJfZGF0YVswXSwgNiwgMH0sCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9lZXByb21fZGF0YV90IGlteDA5MV9lZXByb21fZGF0YV90YmxbXSA9IHsKLQl7JmlteDA5MV93Yl9kYXRhLCBzaXplb2Yoc3RydWN0IG1zbV9jYWxpYl93Yil9LAotCXsmaW14MDkxX2FmX2RhdGEsIHNpemVvZihzdHJ1Y3QgbXNtX2NhbGliX2FmKX0sCi19OwotCi1zdGF0aWMgdm9pZCBpbXgwOTFfZm9ybWF0X3diZGF0YSh2b2lkKQotewotCWlteDA5MV93Yl9kYXRhLnJfb3Zlcl9nID0gKHVpbnQxNl90KShpbXgwOTFfd2JjYWxpYl9kYXRhWzFdIDw8IDgpIHwKLQkJKGlteDA5MV93YmNhbGliX2RhdGFbMF0gLSAweDMyKTsKLQlpbXgwOTFfd2JfZGF0YS5iX292ZXJfZyA9ICh1aW50MTZfdCkoaW14MDkxX3diY2FsaWJfZGF0YVszXSA8PCA4KSB8Ci0JCShpbXgwOTFfd2JjYWxpYl9kYXRhWzJdIC0gMHgzMik7Ci0JaW14MDkxX3diX2RhdGEuZ3Jfb3Zlcl9nYiA9ICh1aW50MTZfdCkoaW14MDkxX3diY2FsaWJfZGF0YVs1XSA8PCA4KSB8Ci0JCShpbXgwOTFfd2JjYWxpYl9kYXRhWzRdIC0gMHgzMik7Ci19Ci0KLXN0YXRpYyB2b2lkIGlteDA5MV9mb3JtYXRfYWZkYXRhKHZvaWQpCi17Ci0JaW14MDkxX2FmX2RhdGEuaW5mX2RhYyA9ICh1aW50MTZfdCkoaW14MDkxX2FmY2FsaWJfZGF0YVsxXSA8PCA4KSB8Ci0JCWlteDA5MV9hZmNhbGliX2RhdGFbMF07Ci0JaW14MDkxX2FmX2RhdGEubWFjcm9fZGFjID0gKHVpbnQxNl90KShpbXgwOTFfYWZjYWxpYl9kYXRhWzNdIDw8IDgpIHwKLQkJaW14MDkxX2FmY2FsaWJfZGF0YVsyXTsKLQlpbXgwOTFfYWZfZGF0YS5zdGFydF9kYWMgPSAodWludDE2X3QpKGlteDA5MV9hZmNhbGliX2RhdGFbNV0gPDwgOCkgfAotCQlpbXgwOTFfYWZjYWxpYl9kYXRhWzRdOwotfQotCi12b2lkIGlteDA5MV9mb3JtYXRfY2FsaWJyYXRpb25kYXRhKHZvaWQpCi17Ci0JaW14MDkxX2Zvcm1hdF93YmRhdGEoKTsKLQlpbXgwOTFfZm9ybWF0X2FmZGF0YSgpOwotfQotc3RhdGljIHN0cnVjdCBtc21fZWVwcm9tX2N0cmxfdCBpbXgwOTFfZWVwcm9tX3QgPSB7Ci0JLmkyY19kcml2ZXIgPSAmaW14MDkxX2VlcHJvbV9pMmNfZHJpdmVyLAotCS5pMmNfYWRkciA9IDB4QTEsCi0JLmVlcHJvbV92NGwyX3N1YmRldl9vcHMgPSAmaW14MDkxX2VlcHJvbV9zdWJkZXZfb3BzLAotCi0JLmkyY19jbGllbnQgPSB7Ci0JCS5hZGRyX3R5cGUgPSBNU01fQ0FNRVJBX0kyQ19CWVRFX0FERFIsCi0JfSwKLQotCS5lZXByb21fbXV0ZXggPSAmaW14MDkxX2VlcHJvbV9tdXRleCwKLQotCS5mdW5jX3RibCA9IHsKLQkJLmVlcHJvbV9pbml0ID0gTlVMTCwKLQkJLmVlcHJvbV9yZWxlYXNlID0gTlVMTCwKLQkJLmVlcHJvbV9nZXRfaW5mbyA9IG1zbV9jYW1lcmFfZWVwcm9tX2dldF9pbmZvLAotCQkuZWVwcm9tX2dldF9kYXRhID0gbXNtX2NhbWVyYV9lZXByb21fZ2V0X2RhdGEsCi0JCS5lZXByb21fc2V0X2Rldl9hZGRyID0gTlVMTCwKLQkJLmVlcHJvbV9mb3JtYXRfZGF0YSA9IGlteDA5MV9mb3JtYXRfY2FsaWJyYXRpb25kYXRhLAotCX0sCi0JLmluZm8gPSAmaW14MDkxX2NhbGliX3N1cHBfaW5mbywKLQkuaW5mb19zaXplID0gc2l6ZW9mKHN0cnVjdCBtc21fY2FtZXJhX2VlcHJvbV9pbmZvX3QpLAotCS5yZWFkX3RibCA9IGlteDA5MV9lZXByb21fcmVhZF90YmwsCi0JLnJlYWRfdGJsX3NpemUgPSBBUlJBWV9TSVpFKGlteDA5MV9lZXByb21fcmVhZF90YmwpLAotCS5kYXRhX3RibCA9IGlteDA5MV9lZXByb21fZGF0YV90YmwsCi0JLmRhdGFfdGJsX3NpemUgPSBBUlJBWV9TSVpFKGlteDA5MV9lZXByb21fZGF0YV90YmwpLAotfTsKLQotc3Vic3lzX2luaXRjYWxsKGlteDA5MV9lZXByb21faTJjX2FkZF9kcml2ZXIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJpbXgwOTEgRUVQUk9NIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZWVwcm9tL21zbV9jYW1lcmFfZWVwcm9tLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZWVwcm9tL21zbV9jYW1lcmFfZWVwcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYjgwOWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2VlcHJvbS9tc21fY2FtZXJhX2VlcHJvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSAibXNtX2NhbWVyYV9lZXByb20uaCIKLQotaW50MzJfdCBtc21fY2FtZXJhX2VlcHJvbV9yZWFkKHN0cnVjdCBtc21fZWVwcm9tX2N0cmxfdCAqZWN0cmwsCi0JdWludDMyX3QgcmVnX2FkZHIsIHZvaWQgKmRhdGEsIHVpbnQzMl90IG51bV9ieXRlLAotCXVpbnQxNl90IGNvbnZlcnRfZW5kaWFuKQotewotCWludCByYyA9IDA7Ci0JaWYgKGVjdHJsLT5mdW5jX3RibC5lZXByb21fc2V0X2Rldl9hZGRyICE9IE5VTEwpCi0JCWVjdHJsLT5mdW5jX3RibC5lZXByb21fc2V0X2Rldl9hZGRyKGVjdHJsLCAmcmVnX2FkZHIpOwotCi0JaWYgKCFjb252ZXJ0X2VuZGlhbikgewotCQlyYyA9IG1zbV9jYW1lcmFfaTJjX3JlYWRfc2VxKAotCQkJJmVjdHJsLT5pMmNfY2xpZW50LCByZWdfYWRkciwgZGF0YSwgbnVtX2J5dGUpOwotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGNoYXIgYnVmW251bV9ieXRlXTsKLQkJdWludDhfdCAqZGF0YV9wdHIgPSAodWludDhfdCAqKSBkYXRhOwotCQlpbnQgaTsKLQkJcmMgPSBtc21fY2FtZXJhX2kyY19yZWFkX3NlcSgKLQkJCSZlY3RybC0+aTJjX2NsaWVudCwgcmVnX2FkZHIsIGJ1ZiwgbnVtX2J5dGUpOwotCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2J5dGU7IGkgKz0gMikgewotCQkJZGF0YV9wdHJbaV0gPSBidWZbaSsxXTsKLQkJCWRhdGFfcHRyW2krMV0gPSBidWZbaV07Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQzMl90IG1zbV9jYW1lcmFfZWVwcm9tX3JlYWRfdGJsKHN0cnVjdCBtc21fZWVwcm9tX2N0cmxfdCAqZWN0cmwsCi0Jc3RydWN0IG1zbV9jYW1lcmFfZWVwcm9tX3JlYWRfdCAqcmVhZF90YmwsIHVpbnQxNl90IHRibF9zaXplKQotewotCWludCBpLCByYyA9IDA7Ci0JQ0RCRygiJXM6IG9wZW5cbiIsIF9fZnVuY19fKTsKLQlpZiAocmVhZF90YmwgPT0gTlVMTCkKLQkJcmV0dXJuIHJjOwotCi0JZm9yIChpID0gMDsgaSA8IHRibF9zaXplOyBpKyspIHsKLQkJcmMgPSBtc21fY2FtZXJhX2VlcHJvbV9yZWFkCi0JCQkoZWN0cmwsIHJlYWRfdGJsW2ldLnJlZ19hZGRyLAotCQkJcmVhZF90YmxbaV0uZGVzdF9wdHIsIHJlYWRfdGJsW2ldLm51bV9ieXRlLAotCQkJcmVhZF90YmxbaV0uY29udmVydF9lbmRpYW4pOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCUNEQkcoIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQzMl90IG1zbV9jYW1lcmFfZWVwcm9tX2dldF9pbmZvKHN0cnVjdCBtc21fZWVwcm9tX2N0cmxfdCAqZWN0cmwsCi0Jc3RydWN0IG1zbV9jYW1lcmFfZWVwcm9tX2luZm9fdCAqZWluZm8pCi17Ci0JaW50IHJjID0gMDsKLQlDREJHKCIlczogb3BlblxuIiwgX19mdW5jX18pOwotCW1lbWNweShlaW5mbywgZWN0cmwtPmluZm8sIGVjdHJsLT5pbmZvX3NpemUpOwotCUNEQkcoIiVzOiBkb25lID0lZFxuIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludDMyX3QgbXNtX2NhbWVyYV9lZXByb21fZ2V0X2RhdGEoc3RydWN0IG1zbV9lZXByb21fY3RybF90ICplY3RybCwKLQlzdHJ1Y3QgbXNtX2VlcHJvbV9kYXRhX3QgKmVkYXRhKQotewotCWludCByYyA9IDA7Ci0JaWYgKGVkYXRhLT5pbmRleCA+PSBlY3RybC0+ZGF0YV90Ymxfc2l6ZSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKGNvcHlfdG9fdXNlcihlZGF0YS0+ZWVwcm9tX2RhdGEsCi0JCWVjdHJsLT5kYXRhX3RibFtlZGF0YS0+aW5kZXhdLmRhdGEsCi0JCWVjdHJsLT5kYXRhX3RibFtlZGF0YS0+aW5kZXhdLnNpemUpKQotCQlyYyA9IC1FRkFVTFQ7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQzMl90IG1zbV9lZXByb21fY29uZmlnKHN0cnVjdCBtc21fZWVwcm9tX2N0cmxfdCAqZV9jdHJsLAotCXZvaWQgX191c2VyICphcmdwKQotewotCXN0cnVjdCBtc21fZWVwcm9tX2NmZ19kYXRhIGNkYXRhOwotCWludDMyX3QgcmMgPSAwOwotCWlmIChjb3B5X2Zyb21fdXNlcigmY2RhdGEsCi0JCSh2b2lkICopYXJncCwKLQkJc2l6ZW9mKHN0cnVjdCBtc21fZWVwcm9tX2NmZ19kYXRhKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCW11dGV4X2xvY2soZV9jdHJsLT5lZXByb21fbXV0ZXgpOwotCi0Jc3dpdGNoIChjZGF0YS5jZmd0eXBlKSB7Ci0JY2FzZSBDRkdfR0VUX0VFUFJPTV9JTkZPOgotCQlpZiAoZV9jdHJsLT5mdW5jX3RibC5lZXByb21fZ2V0X2luZm8gPT0gTlVMTCkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmMgPSBlX2N0cmwtPmZ1bmNfdGJsLmVlcHJvbV9nZXRfaW5mbyhlX2N0cmwsCi0JCQkmY2RhdGEuY2ZnLmdldF9pbmZvKTsKLQkJY2RhdGEuaXNfZWVwcm9tX3N1cHBvcnRlZCA9IDE7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJJmNkYXRhLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fZWVwcm9tX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX0dFVF9FRVBST01fREFUQToKLQkJaWYgKGVfY3RybC0+ZnVuY190YmwuZWVwcm9tX2dldF9kYXRhID09IE5VTEwpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXJjID0gZV9jdHJsLT5mdW5jX3RibC5lZXByb21fZ2V0X2RhdGEoZV9jdHJsLAotCQkJJmNkYXRhLmNmZy5nZXRfZGF0YSk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkmY2RhdGEsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9lZXByb21fY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCW11dGV4X3VubG9jayhlX2N0cmwtPmVlcHJvbV9tdXRleCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdHJ1Y3QgbXNtX2VlcHJvbV9jdHJsX3QgKmdldF9lY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQotewotCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBtc21fZWVwcm9tX2N0cmxfdCwgc2Rldik7Ci19Ci0KLWxvbmcgbXNtX2VlcHJvbV9zdWJkZXZfaW9jdGwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IG1zbV9lZXByb21fY3RybF90ICplX2N0cmwgPSBnZXRfZWN0cmwoc2QpOwotCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfTVNNX0VFUFJPTV9DRkc6Ci0JCXJldHVybiBtc21fZWVwcm9tX2NvbmZpZyhlX2N0cmwsIGFyZ3ApOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JfQotfQotCi1pbnQzMl90IG1zbV9lZXByb21faTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9lZXByb21fY3RybF90ICplX2N0cmxfdCA9IE5VTEw7Ci0JQ0RCRygiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgewotCQlwcl9lcnIoImkyY19jaGVja19mdW5jdGlvbmFsaXR5IGZhaWxlZFxuIik7Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0KLQllX2N0cmxfdCA9IChzdHJ1Y3QgbXNtX2VlcHJvbV9jdHJsX3QgKikoaWQtPmRyaXZlcl9kYXRhKTsKLQllX2N0cmxfdC0+aTJjX2NsaWVudC5jbGllbnQgPSBjbGllbnQ7Ci0KLQlpZiAoZV9jdHJsX3QtPmkyY19hZGRyICE9IDApCi0JCWVfY3RybF90LT5pMmNfY2xpZW50LmNsaWVudC0+YWRkciA9IGVfY3RybF90LT5pMmNfYWRkcjsKLQotCUNEQkcoIiVzIGNsaWVudCA9ICV4XG4iLCBfX2Z1bmNfXywgKHVuc2lnbmVkIGludCkgY2xpZW50KTsKLQotCS8qIEFzc2lnbiBuYW1lIGZvciBzdWIgZGV2aWNlICovCi0Jc25wcmludGYoZV9jdHJsX3QtPnNkZXYubmFtZSwgc2l6ZW9mKGVfY3RybF90LT5zZGV2Lm5hbWUpLAotCQkiJXMiLCBlX2N0cmxfdC0+aTJjX2RyaXZlci0+ZHJpdmVyLm5hbWUpOwotCi0JaWYgKGVfY3RybF90LT5mdW5jX3RibC5lZXByb21faW5pdCAhPSBOVUxMKSB7Ci0JCXJjID0gZV9jdHJsX3QtPmZ1bmNfdGJsLmVlcHJvbV9pbml0KGVfY3RybF90LAotCQkJZV9jdHJsX3QtPmkyY19jbGllbnQuY2xpZW50LT5hZGFwdGVyKTsKLQl9Ci0JbXNtX2NhbWVyYV9lZXByb21fcmVhZF90YmwoZV9jdHJsX3QsCi0JCWVfY3RybF90LT5yZWFkX3RibCwKLQkJZV9jdHJsX3QtPnJlYWRfdGJsX3NpemUpOwotCi0JaWYgKGVfY3RybF90LT5mdW5jX3RibC5lZXByb21fZm9ybWF0X2RhdGEgIT0gTlVMTCkKLQkJZV9jdHJsX3QtPmZ1bmNfdGJsLmVlcHJvbV9mb3JtYXRfZGF0YSgpOwotCi0JaWYgKGVfY3RybF90LT5mdW5jX3RibC5lZXByb21fcmVsZWFzZSAhPSBOVUxMKQotCQlyYyA9IGVfY3RybF90LT5mdW5jX3RibC5lZXByb21fcmVsZWFzZShlX2N0cmxfdCk7Ci0KLQotCS8qIEluaXRpYWxpemUgc3ViIGRldmljZSAqLwotCXY0bDJfaTJjX3N1YmRldl9pbml0KCZlX2N0cmxfdC0+c2RldiwKLQkJZV9jdHJsX3QtPmkyY19jbGllbnQuY2xpZW50LAotCQllX2N0cmxfdC0+ZWVwcm9tX3Y0bDJfc3ViZGV2X29wcyk7Ci0JQ0RCRygiJXMgc3VjY2VzcyByZXN1dD0lZFxuIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci0KLXByb2JlX2ZhaWx1cmU6Ci0JcHJfZXJyKCIlcyBmYWlsZWQhIHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2VlcHJvbS9tc21fY2FtZXJhX2VlcHJvbS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2VlcHJvbS9tc21fY2FtZXJhX2VlcHJvbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWI0NTMzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9lZXByb20vbXNtX2NhbWVyYV9lZXByb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaWZuZGVmIE1TTV9DQU1FUkFfRUVQUk9NX0gKLSNkZWZpbmUgTVNNX0NBTUVSQV9FRVBST01fSAotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+Ci0jaW5jbHVkZSAibXNtX2NhbWVyYV9pMmMuaCIKLQotI2RlZmluZSBUUlVFICAxCi0jZGVmaW5lIEZBTFNFIDAKLQotc3RydWN0IG1zbV9lZXByb21fY3RybF90OwotCi1zdHJ1Y3QgbXNtX2NhbWVyYV9lZXByb21fZm5fdCB7Ci0JaW50MzJfdCAoKmVlcHJvbV9pbml0KQotCQkoc3RydWN0IG1zbV9lZXByb21fY3RybF90ICplY3RybCwKLQkJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKLQlpbnQzMl90ICgqZWVwcm9tX3JlbGVhc2UpCi0JCShzdHJ1Y3QgbXNtX2VlcHJvbV9jdHJsX3QgKmVjdHJsKTsKLQlpbnQzMl90ICgqZWVwcm9tX2dldF9pbmZvKQotCQkoc3RydWN0IG1zbV9lZXByb21fY3RybF90ICplY3RybCwKLQkJIHN0cnVjdCBtc21fY2FtZXJhX2VlcHJvbV9pbmZvX3QgKmVpbmZvKTsKLQlpbnQzMl90ICgqZWVwcm9tX2dldF9kYXRhKQotCQkoc3RydWN0IG1zbV9lZXByb21fY3RybF90ICplY3RybCwKLQkJIHN0cnVjdCBtc21fZWVwcm9tX2RhdGFfdCAqZWRhdGEpOwotCXZvaWQgKCplZXByb21fc2V0X2Rldl9hZGRyKQotCQkoc3RydWN0IG1zbV9lZXByb21fY3RybF90KiwgdWludDMyX3QqKTsKLQl2b2lkICgqZWVwcm9tX2Zvcm1hdF9kYXRhKQotCQkodm9pZCk7Ci19OwotCi1zdHJ1Y3QgbXNtX2NhbWVyYV9lZXByb21fcmVhZF90IHsKLQl1aW50MzJfdCByZWdfYWRkcjsKLQl2b2lkICpkZXN0X3B0cjsKLQl1aW50MzJfdCBudW1fYnl0ZTsKLQl1aW50MTZfdCBjb252ZXJ0X2VuZGlhbjsKLX07Ci0KLXN0cnVjdCBtc21fY2FtZXJhX2VlcHJvbV9kYXRhX3QgewotCXZvaWQgKmRhdGE7Ci0JdWludDE2X3Qgc2l6ZTsKLX07Ci0KLXN0cnVjdCBtc21fZWVwcm9tX2N0cmxfdCB7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCBpMmNfY2xpZW50OwotCXVpbnQxNl90IGkyY19hZGRyOwotCXN0cnVjdCBpMmNfZHJpdmVyICppMmNfZHJpdmVyOwotCXN0cnVjdCBtdXRleCAqZWVwcm9tX211dGV4OwotCXN0cnVjdCB2NGwyX3N1YmRldiBzZGV2OwotCXN0cnVjdCB2NGwyX3N1YmRldl9vcHMgKmVlcHJvbV92NGwyX3N1YmRldl9vcHM7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfZWVwcm9tX2ZuX3QgZnVuY190Ymw7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfZWVwcm9tX2luZm9fdCAqaW5mbzsKLQl1aW50MTZfdCBpbmZvX3NpemU7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfZWVwcm9tX3JlYWRfdCAqcmVhZF90Ymw7Ci0JdWludDE2X3QgcmVhZF90Ymxfc2l6ZTsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9lZXByb21fZGF0YV90ICpkYXRhX3RibDsKLQl1aW50MTZfdCBkYXRhX3RibF9zaXplOwotfTsKLQotaW50MzJfdCBtc21fY2FtZXJhX2VlcHJvbV9nZXRfZGF0YShzdHJ1Y3QgbXNtX2VlcHJvbV9jdHJsX3QgKmVjdHJsLAotCXN0cnVjdCBtc21fZWVwcm9tX2RhdGFfdCAqZWRhdGEpOwotaW50MzJfdCBtc21fY2FtZXJhX2VlcHJvbV9nZXRfaW5mbyhzdHJ1Y3QgbXNtX2VlcHJvbV9jdHJsX3QgKmVjdHJsLAotCXN0cnVjdCBtc21fY2FtZXJhX2VlcHJvbV9pbmZvX3QgKmVpbmZvKTsKLWludDMyX3QgbXNtX2VlcHJvbV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpOwotbG9uZyBtc21fZWVwcm9tX3N1YmRldl9pb2N0bChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7Ci0KLSNkZWZpbmUgVklESU9DX01TTV9FRVBST01fQ0ZHIFwKLQlfSU9XUignVicsIEJBU0VfVklESU9DX1BSSVZBVEUgKyAxMiwgdm9pZCBfX3VzZXIgKikKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2ZsYXNoL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2ZsYXNoL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDFkNDUyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9mbGFzaC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUdDQ19WRVJTSU9OICAgICAgOj0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChQV0QpL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2ggJChDUk9TU19DT01QSUxFKWdjYykKLWNjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MQotY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvCi1vYmotJChDT05GSUdfTVNNX0NBTUVSQV9GTEFTSCkgKz0gbXNtX2ZsYXNoLm8KLW9iai0kKENPTkZJR19NU01fQ0FNRVJBX0ZMQVNIX1NDNjI4QSkgKz0gc2M2MjhhLm8KLW9iai0kKENPTkZJR19NU01fQ0FNRVJBX0ZMQVNIX1RQUzYxMzEwKSArPSB0cHM2MTMxMC5vCi1vYmotJChDT05GSUdfTVNNX0NBTUVSQV9GTEFTSF9QTUlDX0ZMQVNIKSArPSBwbWljODA1OF9mbGFzaC5vCi1vYmotJChDT05GSUdfTVNNX0NBTUVSQV9GTEFTSF9TR00zMTQxKSArPSBzZ20zMTQxLm8KLW9iai0kKENPTkZJR19NU01fQ0FNRVJBX0ZMQVNIX1BNSUM4MDU4X1BXTSkgKz0gcG1pYzgwNThfcHdtLm8KLW9iai0kKENPTkZJR19NU01fQ0FNRVJBX0xFRF9UUklHR0VSX0ZMQVNIKSArPSBsZWRfdHJpZ2dlcl9mbGFzaC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZmxhc2gvbGVkX3RyaWdnZXJfZmxhc2guYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9mbGFzaC9sZWRfdHJpZ2dlcl9mbGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDM0Y2RlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9mbGFzaC9sZWRfdHJpZ2dlcl9mbGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KLSNpbmNsdWRlICJtc21fZmxhc2guaCIKLQotI2RlZmluZSBGTEFTSF9OQU1FICJjYW1lcmEtbGVkLWZsYXNoIgotc3RhdGljIHN0cnVjdCBtc21fZmxhc2hfY3RybF90IGZjdHJsOwotCi1zdGF0aWMgaW50IG1zbV9jYW1lcmFfbGVkX3RyaWdnZXJfZmxhc2goc3RydWN0IG1zbV9mbGFzaF9jdHJsX3QgKmZjdHJsLAotCXVpbnQ4X3QgbGVkX3N0YXRlKQotewotCWludCByYyA9IDA7Ci0JQ0RCRygiJXM6JWQgY2FsbGVkIGxlZF9zdGF0ZSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBsZWRfc3RhdGUpOwotCi0JaWYgKCFmY3RybC0+bGVkX3RyaWdnZXJbMF0pIHsKLQkJcHJfZXJyKCIlczolZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlzd2l0Y2ggKGxlZF9zdGF0ZSkgewotCWNhc2UgTVNNX0NBTUVSQV9MRURfT0ZGOgotCQlsZWRfdHJpZ2dlcl9ldmVudChmY3RybC0+bGVkX3RyaWdnZXJbMF0sIDApOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTUVSQV9MRURfTE9XOgotCQlsZWRfdHJpZ2dlcl9ldmVudChmY3RybC0+bGVkX3RyaWdnZXJbMF0sCi0JCQlmY3RybC0+bWF4X2N1cnJlbnRbMF0gLyAyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9DQU1FUkFfTEVEX0hJR0g6Ci0JCWxlZF90cmlnZ2VyX2V2ZW50KGZjdHJsLT5sZWRfdHJpZ2dlclswXSwgZmN0cmwtPm1heF9jdXJyZW50WzBdKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9DQU1FUkFfTEVEX0lOSVQ6Ci0JY2FzZSBNU01fQ0FNRVJBX0xFRF9SRUxFQVNFOgotCQlsZWRfdHJpZ2dlcl9ldmVudChmY3RybC0+bGVkX3RyaWdnZXJbMF0sIDApOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JfQotCUNEQkcoImZsYXNoX3NldF9sZWRfc3RhdGU6IHJldHVybiAlZFxuIiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2NhbWVyYV9mbGFzaF9kdF9tYXRjaFtdID0gewotCXsuY29tcGF0aWJsZSA9ICJxY29tLGNhbWVyYS1sZWQtZmxhc2gifSwKLQl7fQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2NhbWVyYV9mbGFzaF9kdF9tYXRjaCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9sZWRfdHJpZ2dlcl9mbGFzaF9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBGTEFTSF9OQU1FLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gbXNtX2NhbWVyYV9mbGFzaF9kdF9tYXRjaCwKLQl9LAotfTsKLQotc3RhdGljIGludDMyX3QgbXNtX2xlZF90cmlnZ2VyX2ZsYXNoX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50MzJfdCByYyA9IDAsIGkgPSAwOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZmxhc2hfc3JjX25vZGUgPSBOVUxMOwotCXVpbnQzMl90IGNvdW50ID0gMDsKLQotCUNEQkcoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwotCi0JaWYgKCFvZl9ub2RlKSB7Ci0JCXByX2VycigiJXMgb2Zfbm9kZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWZjdHJsLnBkZXYgPSBwZGV2OwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihvZl9ub2RlLCAiY2VsbC1pbmRleCIsICZwZGV2LT5pZCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiVkIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCUNEQkcoIiVzOiVkIHBkZXYgaWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcGRldi0+aWQpOwotCi0JaWYgKG9mX2dldF9wcm9wZXJ0eShvZl9ub2RlLCAicWNvbSxmbGFzaC1zb3VyY2UiLCAmY291bnQpKSB7Ci0JCWNvdW50IC89IHNpemVvZih1aW50MzJfdCk7Ci0JCUNEQkcoIiVzIGNvdW50ICVkXG4iLCBfX2Z1bmNfXywgY291bnQpOwotCQlpZiAoY291bnQgPiBNQVhfTEVEX1RSSUdHRVJTKSB7Ci0JCQlwcl9lcnIoIiVzOiVkIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlmbGFzaF9zcmNfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUob2Zfbm9kZSwKLQkJCQkicWNvbSxmbGFzaC1zb3VyY2UiLCBpKTsKLQkJCWlmICghZmxhc2hfc3JjX25vZGUpIHsKLQkJCQlwcl9lcnIoIiVzOiVkIGZsYXNoX3NyY19ub2RlIE5VTExcbiIsIF9fZnVuY19fLAotCQkJCQlfX0xJTkVfXyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXJjID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcoZmxhc2hfc3JjX25vZGUsCi0JCQkJImxpbnV4LGRlZmF1bHQtdHJpZ2dlciIsCi0JCQkJJmZjdHJsLmxlZF90cmlnZ2VyX25hbWVbaV0pOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6JWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJCW9mX25vZGVfcHV0KGZsYXNoX3NyY19ub2RlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJQ0RCRygiJXMgZGVmYXVsdCB0cmlnZ2VyICVzXG4iLCBfX2Z1bmNfXywKLQkJCQlmY3RybC5sZWRfdHJpZ2dlcl9uYW1lW2ldKTsKLQotCQkJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihmbGFzaF9zcmNfbm9kZSwKLQkJCQkicWNvbSxtYXgtY3VycmVudCIsICZmY3RybC5tYXhfY3VycmVudFtpXSk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczolZCBmYWlsZWQgcmMgJWRcbiIsIF9fZnVuY19fLAotCQkJCQlfX0xJTkVfXywgcmMpOwotCQkJCW9mX25vZGVfcHV0KGZsYXNoX3NyY19ub2RlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJb2Zfbm9kZV9wdXQoZmxhc2hfc3JjX25vZGUpOwotCi0JCQlDREJHKCIlcyBtYXhfY3VycmVudFslZF0gJWRcbiIsIF9fZnVuY19fLCBpLAotCQkJCWZjdHJsLm1heF9jdXJyZW50W2ldKTsKLQotCQkJbGVkX3RyaWdnZXJfcmVnaXN0ZXJfc2ltcGxlKGZjdHJsLmxlZF90cmlnZ2VyX25hbWVbaV0sCi0JCQkJJmZjdHJsLmxlZF90cmlnZ2VyW2ldKTsKLQkJfQotCX0KLQlyYyA9IG1zbV9mbGFzaF9wbGF0Zm9ybV9wcm9iZShwZGV2LCAmZmN0cmwpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX2luaXQgbXNtX2ZsYXNoX2FkZF9kcml2ZXIodm9pZCkKLXsKLQlDREJHKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZtc21fbGVkX3RyaWdnZXJfZmxhc2hfZHJpdmVyLAotCQltc21fbGVkX3RyaWdnZXJfZmxhc2hfcHJvYmUpOwotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9mbGFzaF9mbl90IG1zbV9sZWRfdHJpZ2dlcl9mbGFzaF9mdW5jX3RibCA9IHsKLQkuZmxhc2hfbGVkX2NvbmZpZyA9IG1zbV9jYW1lcmFfbGVkX3RyaWdnZXJfZmxhc2gsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9mbGFzaF9jdHJsX3QgZmN0cmwgPSB7Ci0JLmZ1bmNfdGJsID0gJm1zbV9sZWRfdHJpZ2dlcl9mbGFzaF9mdW5jX3RibCwKLX07Ci0KLW1vZHVsZV9pbml0KG1zbV9mbGFzaF9hZGRfZHJpdmVyKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTEVEIFRSSUdHRVIgRkxBU0giKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9mbGFzaC9tc21fZmxhc2guYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9mbGFzaC9tc21fZmxhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYzOWE0Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZmxhc2gvbXNtX2ZsYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxtYWNoL3BtaWMuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotI2luY2x1ZGUgIm1zbV9mbGFzaC5oIgotI2luY2x1ZGUgIm1zbS5oIgotCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdGltZXJfZmxhc2g7Ci0KLWVudW0gbXNtX2NhbV9mbGFzaF9zdGF0IHsKLQlNU01fQ0FNX0ZMQVNIX09GRiwKLQlNU01fQ0FNX0ZMQVNIX09OLAotfTsKLQotc3RhdGljIGludCBjb25maWdfZmxhc2hfZ3Bpb190YWJsZShlbnVtIG1zbV9jYW1fZmxhc2hfc3RhdCBzdGF0LAotCQkJc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX3N0cm9iZV9mbGFzaF9kYXRhICpzZmRhdGEpCi17Ci0JaW50IHJjID0gMCwgaSA9IDA7Ci0JaW50IG1zbV9jYW1fZmxhc2hfZ3Bpb190YmxbXVsyXSA9IHsKLQkJe3NmZGF0YS0+Zmxhc2hfdHJpZ2dlciwgMX0sCi0JCXtzZmRhdGEtPmZsYXNoX2NoYXJnZSwgMX0sCi0JCXtzZmRhdGEtPmZsYXNoX2NoYXJnZV9kb25lLCAwfQotCX07Ci0KLQlpZiAoc3RhdCA9PSBNU01fQ0FNX0ZMQVNIX09OKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1zbV9jYW1fZmxhc2hfZ3Bpb190YmwpOyBpKyspIHsKLQkJCXJjID0gZ3Bpb19yZXF1ZXN0KG1zbV9jYW1fZmxhc2hfZ3Bpb190YmxbaV1bMF0sCi0JCQkJCQkJICAiQ0FNX0ZMQVNIX0dQSU8iKTsKLQkJCWlmICh1bmxpa2VseShyYyA8IDApKSB7Ci0JCQkJcHJfZXJyKCIlcyBub3QgYWJsZSB0byBnZXQgZ3Bpb1xuIiwgX19mdW5jX18pOwotCQkJCWZvciAoaS0tOyBpID49IDA7IGktLSkKLQkJCQkJZ3Bpb19mcmVlKG1zbV9jYW1fZmxhc2hfZ3Bpb190YmxbaV1bMF0pOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKG1zbV9jYW1fZmxhc2hfZ3Bpb190YmxbaV1bMV0pCi0JCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KAotCQkJCQltc21fY2FtX2ZsYXNoX2dwaW9fdGJsW2ldWzBdLCAwKTsKLQkJCWVsc2UKLQkJCQlncGlvX2RpcmVjdGlvbl9pbnB1dCgKLQkJCQkJbXNtX2NhbV9mbGFzaF9ncGlvX3RibFtpXVswXSk7Ci0JCX0KLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc21fY2FtX2ZsYXNoX2dwaW9fdGJsKTsgaSsrKSB7Ci0JCQlncGlvX2RpcmVjdGlvbl9pbnB1dChtc21fY2FtX2ZsYXNoX2dwaW9fdGJsW2ldWzBdKTsKLQkJCWdwaW9fZnJlZShtc21fY2FtX2ZsYXNoX2dwaW9fdGJsW2ldWzBdKTsKLQkJfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3N0cm9iZV9mbGFzaF94ZW5vbl9jaGFyZ2UoaW50MzJfdCBmbGFzaF9jaGFyZ2UsCi0JCWludDMyX3QgY2hhcmdlX2VuYWJsZSwgdWludDMyX3QgZmxhc2hfcmVjaGFyZ2VfZHVyYXRpb24pCi17Ci0JZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoZmxhc2hfY2hhcmdlLCBjaGFyZ2VfZW5hYmxlKTsKLQlpZiAoY2hhcmdlX2VuYWJsZSkgewotCQl0aW1lcl9mbGFzaC5leHBpcmVzID0gamlmZmllcyArCi0JCQltc2Vjc190b19qaWZmaWVzKGZsYXNoX3JlY2hhcmdlX2R1cmF0aW9uKTsKLQkJLyogYWRkIHRpbWVyIGZvciB0aGUgcmVjaGFyZ2UgKi8KLQkJaWYgKCF0aW1lcl9wZW5kaW5nKCZ0aW1lcl9mbGFzaCkpCi0JCQlhZGRfdGltZXIoJnRpbWVyX2ZsYXNoKTsKLQl9IGVsc2UKLQkJZGVsX3RpbWVyX3N5bmMoJnRpbWVyX2ZsYXNoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc3Ryb2JlX2ZsYXNoX3hlbm9uX3JlY2hhcmdlX2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX3N0cm9iZV9mbGFzaF9kYXRhICpzZmRhdGEgPQotCQkoc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX3N0cm9iZV9mbGFzaF9kYXRhICopZGF0YTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzZmRhdGEtPnRpbWVyX2xvY2ssIGZsYWdzKTsKLQltc21fc3Ryb2JlX2ZsYXNoX3hlbm9uX2NoYXJnZShzZmRhdGEtPmZsYXNoX2NoYXJnZSwgMSwKLQkJc2ZkYXRhLT5mbGFzaF9yZWNoYXJnZV9kdXJhdGlvbik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2ZkYXRhLT50aW1lcl9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBzdHJvYmVfZmxhc2hfY2hhcmdlX3JlYWR5X2lycShpbnQgaXJxX251bSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3Jfc3Ryb2JlX2ZsYXNoX2RhdGEgKnNmZGF0YSA9Ci0JCShzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3Jfc3Ryb2JlX2ZsYXNoX2RhdGEgKilkYXRhOwotCi0JLyogcHV0IHRoZSBjaGFyZ2Ugc2lnbmFsIHRvIGxvdyAqLwotCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKHNmZGF0YS0+Zmxhc2hfY2hhcmdlLCAwKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGludCBtc21fc3Ryb2JlX2ZsYXNoX3hlbm9uX2luaXQoCi0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX3N0cm9iZV9mbGFzaF9kYXRhICpzZmRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmMgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNmZGF0YS0+c3Bpbl9sb2NrLCBmbGFncyk7Ci0JaWYgKCFzZmRhdGEtPnN0YXRlKSB7Ci0KLQkJcmMgPSBjb25maWdfZmxhc2hfZ3Bpb190YWJsZShNU01fQ0FNX0ZMQVNIX09OLCBzZmRhdGEpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBncGlvX3JlcXVlc3QgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGdvX291dDsKLQkJfQotCQlyYyA9IHJlcXVlc3RfaXJxKHNmZGF0YS0+aXJxLCBzdHJvYmVfZmxhc2hfY2hhcmdlX3JlYWR5X2lycSwKLQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcsICJjaGFyZ2VfcmVhZHkiLCBzZmRhdGEpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiByZXF1ZXN0X2lycSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCQlnb3RvIGdvX291dDsKLQkJfQotCi0JCXNwaW5fbG9ja19pbml0KCZzZmRhdGEtPnRpbWVyX2xvY2spOwotCQkvKiBzZXR1cCB0aW1lciAqLwotCQlpbml0X3RpbWVyKCZ0aW1lcl9mbGFzaCk7Ci0JCXRpbWVyX2ZsYXNoLmZ1bmN0aW9uID0gc3Ryb2JlX2ZsYXNoX3hlbm9uX3JlY2hhcmdlX2hhbmRsZXI7Ci0JCXRpbWVyX2ZsYXNoLmRhdGEgPSAodW5zaWduZWQgbG9uZylzZmRhdGE7Ci0JfQotCXNmZGF0YS0+c3RhdGUrKzsKLWdvX291dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZmRhdGEtPnNwaW5fbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9zdHJvYmVfZmxhc2hfeGVub25fcmVsZWFzZQotKHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9zdHJvYmVfZmxhc2hfZGF0YSAqc2ZkYXRhLCBpbnQzMl90IGZpbmFsX3JlbGVhc2UpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzZmRhdGEtPnNwaW5fbG9jaywgZmxhZ3MpOwotCWlmIChzZmRhdGEtPnN0YXRlID4gMCkgewotCQlpZiAoZmluYWxfcmVsZWFzZSkKLQkJCXNmZGF0YS0+c3RhdGUgPSAwOwotCQllbHNlCi0JCQlzZmRhdGEtPnN0YXRlLS07Ci0KLQkJaWYgKCFzZmRhdGEtPnN0YXRlKSB7Ci0JCQlmcmVlX2lycShzZmRhdGEtPmlycSwgc2ZkYXRhKTsKLQkJCWNvbmZpZ19mbGFzaF9ncGlvX3RhYmxlKE1TTV9DQU1fRkxBU0hfT0ZGLCBzZmRhdGEpOwotCQkJaWYgKHRpbWVyX3BlbmRpbmcoJnRpbWVyX2ZsYXNoKSkKLQkJCQlkZWxfdGltZXJfc3luYygmdGltZXJfZmxhc2gpOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNmZGF0YS0+c3Bpbl9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3N0cm9iZV9mbGFzaF9jdHJsKAotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9zdHJvYmVfZmxhc2hfZGF0YSAqc2ZkYXRhLAotCXN0cnVjdCBzdHJvYmVfZmxhc2hfY3RybF9kYXRhICpzdHJvYmVfY3RybCkKLXsKLQlpbnQgcmMgPSAwOwotCXN3aXRjaCAoc3Ryb2JlX2N0cmwtPnR5cGUpIHsKLQljYXNlIFNUUk9CRV9GTEFTSF9DVFJMX0lOSVQ6Ci0JCWlmICghc2ZkYXRhKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCXJjID0gbXNtX3N0cm9iZV9mbGFzaF94ZW5vbl9pbml0KHNmZGF0YSk7Ci0JCWJyZWFrOwotCWNhc2UgU1RST0JFX0ZMQVNIX0NUUkxfQ0hBUkdFOgotCQlyYyA9IG1zbV9zdHJvYmVfZmxhc2hfeGVub25fY2hhcmdlKHNmZGF0YS0+Zmxhc2hfY2hhcmdlLAotCQkJc3Ryb2JlX2N0cmwtPmNoYXJnZV9lbiwKLQkJCXNmZGF0YS0+Zmxhc2hfcmVjaGFyZ2VfZHVyYXRpb24pOwotCQlicmVhazsKLQljYXNlIFNUUk9CRV9GTEFTSF9DVFJMX1JFTEVBU0U6Ci0JCWlmIChzZmRhdGEpCi0JCQlyYyA9IG1zbV9zdHJvYmVfZmxhc2hfeGVub25fcmVsZWFzZShzZmRhdGEsIDApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIkludmFsaWQgU3Ryb2JlIEZsYXNoIFN0YXRlXG4iKTsKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fZmxhc2hfbGVkX2luaXQoc3RydWN0IG1zbV9mbGFzaF9jdHJsX3QgKmZjdHJsKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2ZsYXNoX2V4dGVybmFsICpleHRlcm5hbCA9IE5VTEw7Ci0JQ0RCRygiJXM6JWQgY2FsbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCWlmICghZmN0cmwpIHsKLQkJcHJfZXJyKCIlczolZCBmY3RybCBOVUxMXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZXh0ZXJuYWwgPSAmZmN0cmwtPmZsYXNoX2RhdGEtPmZsYXNoX3NyYy0+X2ZzcmMuZXh0X2RyaXZlcl9zcmM7Ci0JaWYgKGV4dGVybmFsLT5leHBhbmRlcl9pbmZvICYmICFmY3RybC0+ZXhwYW5kZXJfY2xpZW50KSB7Ci0JCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9Ci0JCWkyY19nZXRfYWRhcHRlcihleHRlcm5hbC0+ZXhwYW5kZXJfaW5mby0+YnVzX2lkKTsKLQkJaWYgKGFkYXB0ZXIpCi0JCQlmY3RybC0+ZXhwYW5kZXJfY2xpZW50ID0gaTJjX25ld19kZXZpY2UoYWRhcHRlciwKLQkJCQlleHRlcm5hbC0+ZXhwYW5kZXJfaW5mby0+Ym9hcmRfaW5mbyk7Ci0JCWlmICghZmN0cmwtPmV4cGFuZGVyX2NsaWVudCB8fCAhYWRhcHRlcikgewotCQkJcHJfZXJyKCJmY3RybC0+ZXhwYW5kZXJfY2xpZW50IGlzIG5vdCBhdmFpbGFibGVcbiIpOwotCQkJcmMgPSAtRU5PVFNVUFA7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQkJaTJjX3B1dF9hZGFwdGVyKGFkYXB0ZXIpOwotCX0KLQlyYyA9IG1zbV9jYW1lcmFfaW5pdF9ncGlvX3RhYmxlKAotCQlmY3RybC0+Zmxhc2hfZGF0YS0+Zmxhc2hfc3JjLT5pbml0X2dwaW9fdGJsLAotCQlmY3RybC0+Zmxhc2hfZGF0YS0+Zmxhc2hfc3JjLT5pbml0X2dwaW9fdGJsX3NpemUsIDEpOwotCWlmIChyYyA8IDApCi0JCXByX2VycigiJXM6JWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9mbGFzaF9sZWRfcmVsZWFzZShzdHJ1Y3QgbXNtX2ZsYXNoX2N0cmxfdCAqZmN0cmwpCi17Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2ZsYXNoX2V4dGVybmFsICpleHRlcm5hbCA9IE5VTEw7Ci0JQ0RCRygiJXM6JWQgY2FsbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCWlmICghZmN0cmwpIHsKLQkJcHJfZXJyKCIlczolZCBmY3RybCBOVUxMXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZXh0ZXJuYWwgPSAmZmN0cmwtPmZsYXNoX2RhdGEtPmZsYXNoX3NyYy0+X2ZzcmMuZXh0X2RyaXZlcl9zcmM7Ci0JbXNtX2NhbWVyYV9zZXRfZ3Bpb190YWJsZSgKLQkJZmN0cmwtPmZsYXNoX2RhdGEtPmZsYXNoX3NyYy0+c2V0X2dwaW9fdGJsLAotCQlmY3RybC0+Zmxhc2hfZGF0YS0+Zmxhc2hfc3JjLT5zZXRfZ3Bpb190Ymxfc2l6ZSwgMCk7Ci0JbXNtX2NhbWVyYV9pbml0X2dwaW9fdGFibGUoCi0JCWZjdHJsLT5mbGFzaF9kYXRhLT5mbGFzaF9zcmMtPmluaXRfZ3Bpb190YmwsCi0JCWZjdHJsLT5mbGFzaF9kYXRhLT5mbGFzaF9zcmMtPmluaXRfZ3Bpb190Ymxfc2l6ZSwgMCk7Ci0JaWYgKGV4dGVybmFsLT5leHBhbmRlcl9pbmZvICYmIGZjdHJsLT5leHBhbmRlcl9jbGllbnQpIHsKLQkJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGZjdHJsLT5leHBhbmRlcl9jbGllbnQpOwotCQlmY3RybC0+ZXhwYW5kZXJfY2xpZW50ID0gTlVMTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fZmxhc2hfbGVkX29mZihzdHJ1Y3QgbXNtX2ZsYXNoX2N0cmxfdCAqZmN0cmwpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfZmxhc2hfZXh0ZXJuYWwgKmV4dGVybmFsID0gTlVMTDsKLQlDREJHKCIlczolZCBjYWxsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JaWYgKCFmY3RybCkgewotCQlwcl9lcnIoIiVzOiVkIGZjdHJsIE5VTExcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlleHRlcm5hbCA9ICZmY3RybC0+Zmxhc2hfZGF0YS0+Zmxhc2hfc3JjLT5fZnNyYy5leHRfZHJpdmVyX3NyYzsKLQlpZiAoZmN0cmwtPmZsYXNoX2kyY19jbGllbnQgJiYgZmN0cmwtPnJlZ19zZXR0aW5nKSB7Ci0JCXJjID0gbXNtX2NhbWVyYV9pMmNfd3JpdGVfdGJsKAotCQkJZmN0cmwtPmZsYXNoX2kyY19jbGllbnQsCi0JCQlmY3RybC0+cmVnX3NldHRpbmctPm9mZl9zZXR0aW5nLAotCQkJZmN0cmwtPnJlZ19zZXR0aW5nLT5vZmZfc2V0dGluZ19zaXplLAotCQkJZmN0cmwtPnJlZ19zZXR0aW5nLT5kZWZhdWx0X2RhdGFfdHlwZSk7Ci0JCWlmIChyYyA8IDApCi0JCQlwcl9lcnIoIiVzOiVkIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQl9Ci0JbXNtX2NhbWVyYV9zZXRfZ3Bpb190YWJsZSgKLQkJZmN0cmwtPmZsYXNoX2RhdGEtPmZsYXNoX3NyYy0+c2V0X2dwaW9fdGJsLAotCQlmY3RybC0+Zmxhc2hfZGF0YS0+Zmxhc2hfc3JjLT5zZXRfZ3Bpb190Ymxfc2l6ZSwgMCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fZmxhc2hfbGVkX2xvdyhzdHJ1Y3QgbXNtX2ZsYXNoX2N0cmxfdCAqZmN0cmwpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfZmxhc2hfZXh0ZXJuYWwgKmV4dGVybmFsID0gTlVMTDsKLQlDREJHKCIlczolZCBjYWxsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JaWYgKCFmY3RybCkgewotCQlwcl9lcnIoIiVzOiVkIGZjdHJsIE5VTExcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlleHRlcm5hbCA9ICZmY3RybC0+Zmxhc2hfZGF0YS0+Zmxhc2hfc3JjLT5fZnNyYy5leHRfZHJpdmVyX3NyYzsKLQltc21fY2FtZXJhX3NldF9ncGlvX3RhYmxlKAotCQlmY3RybC0+Zmxhc2hfZGF0YS0+Zmxhc2hfc3JjLT5zZXRfZ3Bpb190YmwsCi0JCWZjdHJsLT5mbGFzaF9kYXRhLT5mbGFzaF9zcmMtPnNldF9ncGlvX3RibF9zaXplLCAxKTsKLQlpZiAoZmN0cmwtPmZsYXNoX2kyY19jbGllbnQgJiYgZmN0cmwtPnJlZ19zZXR0aW5nKSB7Ci0JCXJjID0gbXNtX2NhbWVyYV9pMmNfd3JpdGVfdGJsKAotCQkJZmN0cmwtPmZsYXNoX2kyY19jbGllbnQsCi0JCQlmY3RybC0+cmVnX3NldHRpbmctPmxvd19zZXR0aW5nLAotCQkJZmN0cmwtPnJlZ19zZXR0aW5nLT5sb3dfc2V0dGluZ19zaXplLAotCQkJZmN0cmwtPnJlZ19zZXR0aW5nLT5kZWZhdWx0X2RhdGFfdHlwZSk7Ci0JCWlmIChyYyA8IDApCi0JCQlwcl9lcnIoIiVzOiVkIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2ZsYXNoX2xlZF9oaWdoKHN0cnVjdCBtc21fZmxhc2hfY3RybF90ICpmY3RybCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9mbGFzaF9leHRlcm5hbCAqZXh0ZXJuYWwgPSBOVUxMOwotCUNEQkcoIiVzOiVkIGNhbGxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlpZiAoIWZjdHJsKSB7Ci0JCXByX2VycigiJXM6JWQgZmN0cmwgTlVMTFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWV4dGVybmFsID0gJmZjdHJsLT5mbGFzaF9kYXRhLT5mbGFzaF9zcmMtPl9mc3JjLmV4dF9kcml2ZXJfc3JjOwotCW1zbV9jYW1lcmFfc2V0X2dwaW9fdGFibGUoCi0JCWZjdHJsLT5mbGFzaF9kYXRhLT5mbGFzaF9zcmMtPnNldF9ncGlvX3RibCwKLQkJZmN0cmwtPmZsYXNoX2RhdGEtPmZsYXNoX3NyYy0+c2V0X2dwaW9fdGJsX3NpemUsIDEpOwotCWlmIChmY3RybC0+Zmxhc2hfaTJjX2NsaWVudCAmJiBmY3RybC0+cmVnX3NldHRpbmcpIHsKLQkJcmMgPSBtc21fY2FtZXJhX2kyY193cml0ZV90YmwoCi0JCQlmY3RybC0+Zmxhc2hfaTJjX2NsaWVudCwKLQkJCWZjdHJsLT5yZWdfc2V0dGluZy0+aGlnaF9zZXR0aW5nLAotCQkJZmN0cmwtPnJlZ19zZXR0aW5nLT5oaWdoX3NldHRpbmdfc2l6ZSwKLQkJCWZjdHJsLT5yZWdfc2V0dGluZy0+ZGVmYXVsdF9kYXRhX3R5cGUpOwotCQlpZiAocmMgPCAwKQotCQkJcHJfZXJyKCIlczolZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9jYW1lcmFfZmxhc2hfbGVkX2NvbmZpZyhzdHJ1Y3QgbXNtX2ZsYXNoX2N0cmxfdCAqZmN0cmwsCi0JdWludDhfdCBsZWRfc3RhdGUpCi17Ci0JaW50IHJjID0gMDsKLQotCUNEQkcoIiVzOiVkIGNhbGxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlpZiAoIWZjdHJsLT5mdW5jX3RibCkgewotCQlwcl9lcnIoIiVzIGZsYXNoIGZ1bmMgdGJsIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXN3aXRjaCAobGVkX3N0YXRlKSB7Ci0JY2FzZSBNU01fQ0FNRVJBX0xFRF9JTklUOgotCQlpZiAoZmN0cmwtPmZ1bmNfdGJsLT5mbGFzaF9sZWRfaW5pdCkKLQkJCXJjID0gZmN0cmwtPmZ1bmNfdGJsLT5mbGFzaF9sZWRfaW5pdChmY3RybCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNRVJBX0xFRF9SRUxFQVNFOgotCQlpZiAoZmN0cmwtPmZ1bmNfdGJsLT5mbGFzaF9sZWRfcmVsZWFzZSkKLQkJCXJjID0gZmN0cmwtPmZ1bmNfdGJsLT4KLQkJCQlmbGFzaF9sZWRfcmVsZWFzZShmY3RybCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNRVJBX0xFRF9PRkY6Ci0JCWlmIChmY3RybC0+ZnVuY190YmwtPmZsYXNoX2xlZF9vZmYpCi0JCQlyYyA9IGZjdHJsLT5mdW5jX3RibC0+Zmxhc2hfbGVkX29mZihmY3RybCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNRVJBX0xFRF9MT1c6Ci0JCWlmIChmY3RybC0+ZnVuY190YmwtPmZsYXNoX2xlZF9sb3cpCi0JCQlyYyA9IGZjdHJsLT5mdW5jX3RibC0+Zmxhc2hfbGVkX2xvdyhmY3RybCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNRVJBX0xFRF9ISUdIOgotCQlpZiAoZmN0cmwtPmZ1bmNfdGJsLT5mbGFzaF9sZWRfaGlnaCkKLQkJCXJjID0gZmN0cmwtPmZ1bmNfdGJsLT5mbGFzaF9sZWRfaGlnaChmY3RybCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9mbGFzaF9jdHJsX3QgKmdldF9mY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQotewotCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBtc21fZmxhc2hfY3RybF90LCB2NGwyX3NkZXYpOwotfQotCi1zdGF0aWMgbG9uZyBtc21fZmxhc2hfY29uZmlnKHN0cnVjdCBtc21fZmxhc2hfY3RybF90ICpmY3RybCwgdm9pZCBfX3VzZXIgKmFyZ3ApCi17Ci0JbG9uZyByYyA9IDA7Ci0Jc3RydWN0IGZsYXNoX2N0cmxfZGF0YSBmbGFzaF9pbmZvOwotCWlmICghYXJncCkgewotCQlwcl9lcnIoIiVzIGFyZ3AgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZmbGFzaF9pbmZvLCBhcmdwLCBzaXplb2YoZmxhc2hfaW5mbykpKSB7Ci0JCXByX2VycigiJXM6JWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0Jc3dpdGNoIChmbGFzaF9pbmZvLmZsYXNodHlwZSkgewotCWNhc2UgTEVEX0ZMQVNIOgotCQlpZiAoZmN0cmwtPmZ1bmNfdGJsLT5mbGFzaF9sZWRfY29uZmlnKQotCQkJcmMgPSBmY3RybC0+ZnVuY190YmwtPmZsYXNoX2xlZF9jb25maWcoZmN0cmwsCi0JCQkJZmxhc2hfaW5mby5jdHJsX2RhdGEubGVkX3N0YXRlKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXByX2VycigiJXM6JWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlicmVhazsKLQljYXNlIFNUUk9CRV9GTEFTSDoKLQkJcmMgPSBtc21fc3Ryb2JlX2ZsYXNoX2N0cmwoZmN0cmwtPnN0cm9iZV9mbGFzaF9kYXRhLAotCQkJJihmbGFzaF9pbmZvLmN0cmxfZGF0YS5zdHJvYmVfY3RybCkpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIkludmFsaWQgRmxhc2ggTU9ERVxuIik7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBtc21fZmxhc2hfc3ViZGV2X2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IG1zbV9mbGFzaF9jdHJsX3QgKmZjdHJsID0gTlVMTDsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlpZiAoIXNkKSB7Ci0JCXByX2VycigiJXM6JWQgc2QgTlVMTFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWZjdHJsID0gZ2V0X2ZjdHJsKHNkKTsKLQlpZiAoIWZjdHJsKSB7Ci0JCXByX2VycigiJXM6JWQgZmN0cmwgTlVMTFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfTVNNX0ZMQVNIX0xFRF9EQVRBX0NGRzoKLQkJZmN0cmwtPmZsYXNoX2RhdGEgPSAoc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2ZsYXNoX2RhdGEgKilhcmdwOwotCQlyZXR1cm4gMDsKLQljYXNlIFZJRElPQ19NU01fRkxBU0hfU1RST0JFX0RBVEFfQ0ZHOgotCQlmY3RybC0+c3Ryb2JlX2ZsYXNoX2RhdGEgPQotCQkJKHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9zdHJvYmVfZmxhc2hfZGF0YSAqKWFyZ3A7Ci0JCXJldHVybiAwOwotCWNhc2UgVklESU9DX01TTV9GTEFTSF9DRkc6Ci0JCXJldHVybiBtc21fZmxhc2hfY29uZmlnKGZjdHJsLCBhcmdwKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBtc21fZmxhc2hfc3ViZGV2X2NvcmVfb3BzID0gewotCS5pb2N0bCA9IG1zbV9mbGFzaF9zdWJkZXZfaW9jdGwsCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBtc21fZmxhc2hfc3ViZGV2X29wcyA9IHsKLQkuY29yZSA9ICZtc21fZmxhc2hfc3ViZGV2X2NvcmVfb3BzLAotfTsKLQotaW50IG1zbV9mbGFzaF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9mbGFzaF9jdHJsX3QgKmZjdHJsID0gTlVMTDsKLQlDREJHKCIlczolZCBjYWxsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0KLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgewotCQlwcl9lcnIoImkyY19jaGVja19mdW5jdGlvbmFsaXR5IGZhaWxlZFxuIik7Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0KLQlmY3RybCA9IChzdHJ1Y3QgbXNtX2ZsYXNoX2N0cmxfdCAqKShpZC0+ZHJpdmVyX2RhdGEpOwotCWlmIChmY3RybC0+Zmxhc2hfaTJjX2NsaWVudCkKLQkJZmN0cmwtPmZsYXNoX2kyY19jbGllbnQtPmNsaWVudCA9IGNsaWVudDsKLQotCS8qIEFzc2lnbiBuYW1lIGZvciBzdWIgZGV2aWNlICovCi0Jc25wcmludGYoZmN0cmwtPnY0bDJfc2Rldi5uYW1lLCBzaXplb2YoZmN0cmwtPnY0bDJfc2Rldi5uYW1lKSwKLQkJIiVzIiwgaWQtPm5hbWUpOwotCi0JLyogSW5pdGlhbGl6ZSBzdWIgZGV2aWNlICovCi0JdjRsMl9pMmNfc3ViZGV2X2luaXQoJmZjdHJsLT52NGwyX3NkZXYsIGNsaWVudCwgJm1zbV9mbGFzaF9zdWJkZXZfb3BzKTsKLQotCUNEQkcoIiVzOiVkIHByb2JlIHN1Y2Nlc3NcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIDA7Ci0KLXByb2JlX2ZhaWx1cmU6Ci0JQ0RCRygiJXM6JWQgcHJvYmUgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9mbGFzaF9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBtc21fZmxhc2hfY3RybF90ICpmY3RybCA9IChzdHJ1Y3QgbXNtX2ZsYXNoX2N0cmxfdCAqKWRhdGE7Ci0Jc3RydWN0IG1zbV9jYW1fc3ViZGV2X2luZm8gc2RfaW5mbzsKLQlDREJHKCIlczolZCBjYWxsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0KLQlpZiAoIWZjdHJsKSB7Ci0JCXByX2VycigiJXMgZmN0cmwgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHN1YiBkZXZpY2UgKi8KLQl2NGwyX3N1YmRldl9pbml0KCZmY3RybC0+djRsMl9zZGV2LCAmbXNtX2ZsYXNoX3N1YmRldl9vcHMpOwotCi0JLyogQXNzaWduIG5hbWUgZm9yIHN1YiBkZXZpY2UgKi8KLQlzbnByaW50ZihmY3RybC0+djRsMl9zZGV2Lm5hbWUsIHNpemVvZihmY3RybC0+djRsMl9zZGV2Lm5hbWUpLAotCQkiJXMiLCAibXNtX2ZsYXNoIik7Ci0KLQlmY3RybC0+cGRldiA9IHBkZXY7Ci0Jc2RfaW5mby5zZGV2X3R5cGUgPSBGTEFTSF9ERVY7Ci0Jc2RfaW5mby5zZF9pbmRleCA9IHBkZXYtPmlkOwotCW1zbV9jYW1fcmVnaXN0ZXJfc3ViZGV2X25vZGUoJmZjdHJsLT52NGwyX3NkZXYsICZzZF9pbmZvKTsKLQotCUNEQkcoIiVzOiVkIHByb2JlIHN1Y2Nlc3NcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fZmxhc2hfY3JlYXRlX3Y0bDJfc3ViZGV2KHZvaWQgKmRhdGEsIHVpbnQ4X3Qgc2RfaW5kZXgpCi17Ci0Jc3RydWN0IG1zbV9mbGFzaF9jdHJsX3QgKmZjdHJsID0gKHN0cnVjdCBtc21fZmxhc2hfY3RybF90ICopZGF0YTsKLQlzdHJ1Y3QgbXNtX2NhbV9zdWJkZXZfaW5mbyBzZF9pbmZvOwotCUNEQkcoIiVzOiVkIGNhbGxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCS8qIEluaXRpYWxpemUgc3ViIGRldmljZSAqLwotCXY0bDJfc3ViZGV2X2luaXQoJmZjdHJsLT52NGwyX3NkZXYsICZtc21fZmxhc2hfc3ViZGV2X29wcyk7Ci0KLQkvKiBBc3NpZ24gbmFtZSBmb3Igc3ViIGRldmljZSAqLwotCXNucHJpbnRmKGZjdHJsLT52NGwyX3NkZXYubmFtZSwgc2l6ZW9mKGZjdHJsLT52NGwyX3NkZXYubmFtZSksCi0JCSIlcyIsICJtc21fZmxhc2giKTsKLQotCXNkX2luZm8uc2Rldl90eXBlID0gRkxBU0hfREVWOwotCXNkX2luZm8uc2RfaW5kZXggPSBzZF9pbmRleDsKLQltc21fY2FtX3JlZ2lzdGVyX3N1YmRldl9ub2RlKCZmY3RybC0+djRsMl9zZGV2LCAmc2RfaW5mbyk7Ci0KLQlDREJHKCIlczolZCBwcm9iZSBzdWNjZXNzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2ZsYXNoL21zbV9mbGFzaC5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2ZsYXNoL21zbV9mbGFzaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTEzOTk1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9mbGFzaC9tc21fZmxhc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2lmbmRlZiBNU01fRkxBU0hfSAotI2RlZmluZSBNU01fRkxBU0hfSAotCi0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvbGVkcy5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgIm1zbV9jYW1lcmFfaTJjLmgiCi0KLSNkZWZpbmUgTUFYX0xFRF9UUklHR0VSUyAyCi0KLXN0cnVjdCBtc21fZmxhc2hfY3RybF90OwotCi1zdHJ1Y3QgbXNtX2ZsYXNoX3JlZ190IHsKLQllbnVtIG1zbV9jYW1lcmFfaTJjX2RhdGFfdHlwZSBkZWZhdWx0X2RhdGFfdHlwZTsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgKmluaXRfc2V0dGluZzsKLQl1aW50OF90IGluaXRfc2V0dGluZ19zaXplOwotCXN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiAqb2ZmX3NldHRpbmc7Ci0JdWludDhfdCBvZmZfc2V0dGluZ19zaXplOwotCXN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiAqbG93X3NldHRpbmc7Ci0JdWludDhfdCBsb3dfc2V0dGluZ19zaXplOwotCXN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiAqaGlnaF9zZXR0aW5nOwotCXVpbnQ4X3QgaGlnaF9zZXR0aW5nX3NpemU7Ci19OwotCi1zdHJ1Y3QgbXNtX2ZsYXNoX2ZuX3QgewotCWludCAoKmZsYXNoX2xlZF9jb25maWcpKHN0cnVjdCBtc21fZmxhc2hfY3RybF90ICosIHVpbnQ4X3QpOwotCWludCAoKmZsYXNoX2xlZF9pbml0KShzdHJ1Y3QgbXNtX2ZsYXNoX2N0cmxfdCAqKTsKLQlpbnQgKCpmbGFzaF9sZWRfcmVsZWFzZSkoc3RydWN0IG1zbV9mbGFzaF9jdHJsX3QgKik7Ci0JaW50ICgqZmxhc2hfbGVkX29mZikoc3RydWN0IG1zbV9mbGFzaF9jdHJsX3QgKik7Ci0JaW50ICgqZmxhc2hfbGVkX2xvdykoc3RydWN0IG1zbV9mbGFzaF9jdHJsX3QgKik7Ci0JaW50ICgqZmxhc2hfbGVkX2hpZ2gpKHN0cnVjdCBtc21fZmxhc2hfY3RybF90ICopOwotfTsKLQotc3RydWN0IG1zbV9mbGFzaF9jdHJsX3QgewotCXN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgKmZsYXNoX2kyY19jbGllbnQ7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqZXhwYW5kZXJfY2xpZW50OwotCXN0cnVjdCB2NGwyX3N1YmRldiB2NGwyX3NkZXY7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2ZsYXNoX2RhdGEgKmZsYXNoX2RhdGE7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX3N0cm9iZV9mbGFzaF9kYXRhICpzdHJvYmVfZmxhc2hfZGF0YTsKLQlzdHJ1Y3QgbXNtX2ZsYXNoX2ZuX3QgKmZ1bmNfdGJsOwotCXN0cnVjdCBtc21fZmxhc2hfcmVnX3QgKnJlZ19zZXR0aW5nOwotCWNvbnN0IGNoYXIgKmxlZF90cmlnZ2VyX25hbWVbTUFYX0xFRF9UUklHR0VSU107Ci0Jc3RydWN0IGxlZF90cmlnZ2VyICpsZWRfdHJpZ2dlcltNQVhfTEVEX1RSSUdHRVJTXTsKLQl1aW50MzJfdCBtYXhfY3VycmVudFtNQVhfTEVEX1RSSUdHRVJTXTsKLQl2b2lkICpkYXRhOwotfTsKLQotaW50IG1zbV9mbGFzaF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpOwotCi1pbnQgbXNtX2ZsYXNoX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHZvaWQgKmRhdGEpOwotCi1pbnQgbXNtX2ZsYXNoX2NyZWF0ZV92NGwyX3N1YmRldih2b2lkICpkYXRhLCB1aW50OF90IHNkX2luZGV4KTsKLQotaW50IG1zbV9jYW1lcmFfZmxhc2hfbGVkX2NvbmZpZyhzdHJ1Y3QgbXNtX2ZsYXNoX2N0cmxfdCAqZmN0cmwsCi0JdWludDhfdCBsZWRfc3RhdGUpOwotCi1pbnQgbXNtX2ZsYXNoX2xlZF9pbml0KHN0cnVjdCBtc21fZmxhc2hfY3RybF90ICpmY3RybCk7Ci0KLWludCBtc21fZmxhc2hfbGVkX3JlbGVhc2Uoc3RydWN0IG1zbV9mbGFzaF9jdHJsX3QgKmZjdHJsKTsKLQotaW50IG1zbV9mbGFzaF9sZWRfb2ZmKHN0cnVjdCBtc21fZmxhc2hfY3RybF90ICpmY3RybCk7Ci0KLWludCBtc21fZmxhc2hfbGVkX2xvdyhzdHJ1Y3QgbXNtX2ZsYXNoX2N0cmxfdCAqZmN0cmwpOwotCi1pbnQgbXNtX2ZsYXNoX2xlZF9oaWdoKHN0cnVjdCBtc21fZmxhc2hfY3RybF90ICpmY3RybCk7Ci0KLSNkZWZpbmUgVklESU9DX01TTV9GTEFTSF9MRURfREFUQV9DRkcgXAotCV9JT1dSKCdWJywgQkFTRV9WSURJT0NfUFJJVkFURSArIDIwLCB2b2lkIF9fdXNlciAqKQotCi0jZGVmaW5lIFZJRElPQ19NU01fRkxBU0hfU1RST0JFX0RBVEFfQ0ZHIFwKLQlfSU9XUignVicsIEJBU0VfVklESU9DX1BSSVZBVEUgKyAyMSwgdm9pZCBfX3VzZXIgKikKLQotI2RlZmluZSBWSURJT0NfTVNNX0ZMQVNIX0NGRyBcCi0JX0lPV1IoJ1YnLCBCQVNFX1ZJRElPQ19QUklWQVRFICsgMjIsIHZvaWQgX191c2VyICopCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2ZsYXNoL3BtaWM4MDU4X2ZsYXNoLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZmxhc2gvcG1pYzgwNThfZmxhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxN2JjYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZmxhc2gvcG1pYzgwNThfZmxhc2guYworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgotI2luY2x1ZGUgIm1zbV9mbGFzaC5oIgotCi0jZGVmaW5lIFNEX0lOREVYIDAKLQotc3RhdGljIHN0cnVjdCBtc21fZmxhc2hfY3RybF90IGZjdHJsOwotCi1zdGF0aWMgaW50IG1zbV9jYW1lcmFfcG1pY19mbGFzaChzdHJ1Y3QgbXNtX2ZsYXNoX2N0cmxfdCAqZmN0cmwsCi0JdWludDhfdCBsZWRfc3RhdGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfZmxhc2hfcG1pYyAqcG1pYyA9Ci0JCSZmY3RybC0+Zmxhc2hfZGF0YS0+Zmxhc2hfc3JjLT5fZnNyYy5wbWljX3NyYzsKLQotCXN3aXRjaCAobGVkX3N0YXRlKSB7Ci0JY2FzZSBNU01fQ0FNRVJBX0xFRF9PRkY6Ci0JCXJjID0gcG1pYy0+cG1pY19zZXRfY3VycmVudChwbWljLT5sZWRfc3JjXzEsIDApOwotCQlpZiAocG1pYy0+bnVtX29mX3NyYyA+IDEpCi0JCQlyYyA9IHBtaWMtPnBtaWNfc2V0X2N1cnJlbnQocG1pYy0+bGVkX3NyY18yLCAwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9DQU1FUkFfTEVEX0xPVzoKLQkJcmMgPSBwbWljLT5wbWljX3NldF9jdXJyZW50KHBtaWMtPmxlZF9zcmNfMSwKLQkJCQlwbWljLT5sb3dfY3VycmVudCk7Ci0JCWlmIChwbWljLT5udW1fb2Zfc3JjID4gMSkKLQkJCXJjID0gcG1pYy0+cG1pY19zZXRfY3VycmVudChwbWljLT5sZWRfc3JjXzIsIDApOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTUVSQV9MRURfSElHSDoKLQkJcmMgPSBwbWljLT5wbWljX3NldF9jdXJyZW50KHBtaWMtPmxlZF9zcmNfMSwKLQkJCXBtaWMtPmhpZ2hfY3VycmVudCk7Ci0JCWlmIChwbWljLT5udW1fb2Zfc3JjID4gMSkKLQkJCXJjID0gcG1pYy0+cG1pY19zZXRfY3VycmVudChwbWljLT5sZWRfc3JjXzIsCi0JCQkJcG1pYy0+aGlnaF9jdXJyZW50KTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9DQU1FUkFfTEVEX0lOSVQ6Ci0JY2FzZSBNU01fQ0FNRVJBX0xFRF9SRUxFQVNFOgotCQkgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCX0KLQlDREJHKCJmbGFzaF9zZXRfbGVkX3N0YXRlOiByZXR1cm4gJWRcbiIsIHJjKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX2luaXQgbXNtX2ZsYXNoX2kyY19hZGRfZHJpdmVyKHZvaWQpCi17Ci0JQ0RCRygiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIG1zbV9mbGFzaF9jcmVhdGVfdjRsMl9zdWJkZXYoJmZjdHJsLCBTRF9JTkRFWCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2ZsYXNoX2ZuX3QgcG1pY19mbGFzaF9mdW5jX3RibCA9IHsKLQkuZmxhc2hfbGVkX2NvbmZpZyA9IG1zbV9jYW1lcmFfcG1pY19mbGFzaCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2ZsYXNoX2N0cmxfdCBmY3RybCA9IHsKLQkuZnVuY190YmwgPSAmcG1pY19mbGFzaF9mdW5jX3RibCwKLX07Ci0KLW1vZHVsZV9pbml0KG1zbV9mbGFzaF9pMmNfYWRkX2RyaXZlcik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlBNSUMgRkxBU0giKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9mbGFzaC9wbWljODA1OF9wd20uYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9mbGFzaC9wbWljODA1OF9wd20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxNTM0MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZmxhc2gvcG1pYzgwNThfcHdtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9wd20uaD4KLQotI2luY2x1ZGUgIm1zbV9mbGFzaC5oIgotI2RlZmluZSBTRF9JTkRFWCAwCi0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2ZsYXNoX2N0cmxfdCBmY3RybDsKLQotc3RhdGljIGludCBtc21fY2FtZXJhX2ZsYXNoX3B3bShzdHJ1Y3QgbXNtX2ZsYXNoX2N0cmxfdCAqZmN0cmwsCi0JdWludDhfdCBsZWRfc3RhdGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfZmxhc2hfcHdtICpwd20gPQotCQkmZmN0cmwtPmZsYXNoX2RhdGEtPmZsYXNoX3NyYy0+X2ZzcmMucHdtX3NyYzsKLQlpbnQgUFdNX1BFUklPRCA9IFVTRUNfUEVSX1NFQyAvIHB3bS0+ZnJlcTsKLQotCXN0cnVjdCBwd21fZGV2aWNlICpmbGFzaF9wd20gPSAoc3RydWN0IHB3bV9kZXZpY2UgKilmY3RybC0+ZGF0YTsKLQotCWlmICghZmxhc2hfcHdtKSB7Ci0JCWZsYXNoX3B3bSA9IHB3bV9yZXF1ZXN0KHB3bS0+Y2hhbm5lbCwgImNhbWVyYS1mbGFzaCIpOwotCQlpZiAoZmxhc2hfcHdtID09IE5VTEwgfHwgSVNfRVJSKGZsYXNoX3B3bSkpIHsKLQkJCXByX2VycigiJXM6IEZBSUwgcHdtX3JlcXVlc3QoKTogZmxhc2hfcHdtPSVwXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBmbGFzaF9wd20pOwotCQkJZmxhc2hfcHdtID0gTlVMTDsKLQkJCXJldHVybiAtRU5YSU87Ci0JCX0KLQl9Ci0KLQlzd2l0Y2ggKGxlZF9zdGF0ZSkgewotCWNhc2UgTVNNX0NBTUVSQV9MRURfTE9XOgotCQlyYyA9IHB3bV9jb25maWcoZmxhc2hfcHdtLAotCQkJKFBXTV9QRVJJT0QvcHdtLT5tYXhfbG9hZCkqcHdtLT5sb3dfbG9hZCwKLQkJCVBXTV9QRVJJT0QpOwotCQlpZiAocmMgPj0gMCkKLQkJCXJjID0gcHdtX2VuYWJsZShmbGFzaF9wd20pOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTUVSQV9MRURfSElHSDoKLQkJcmMgPSBwd21fY29uZmlnKGZsYXNoX3B3bSwKLQkJCShQV01fUEVSSU9EL3B3bS0+bWF4X2xvYWQpKnB3bS0+aGlnaF9sb2FkLAotCQkJUFdNX1BFUklPRCk7Ci0JCWlmIChyYyA+PSAwKQotCQkJcmMgPSBwd21fZW5hYmxlKGZsYXNoX3B3bSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNRVJBX0xFRF9PRkY6Ci0JCXB3bV9kaXNhYmxlKGZsYXNoX3B3bSk7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0NBTUVSQV9MRURfSU5JVDoKLQljYXNlIE1TTV9DQU1FUkFfTEVEX1JFTEVBU0U6Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fZmxhc2hfaTJjX2FkZF9kcml2ZXIodm9pZCkKLXsKLQlDREJHKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gbXNtX2ZsYXNoX2NyZWF0ZV92NGwyX3N1YmRldigmZmN0cmwsIFNEX0lOREVYKTsKLX0KLQotc3RhdGljIHN0cnVjdCBtc21fZmxhc2hfZm5fdCBwbWljODA1OF9wd21fZnVuY190YmwgPSB7Ci0JLmZsYXNoX2xlZF9jb25maWcgPSBtc21fY2FtZXJhX2ZsYXNoX3B3bSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2ZsYXNoX2N0cmxfdCBmY3RybCA9IHsKLQkuZnVuY190YmwgPSAmcG1pYzgwNThfcHdtX2Z1bmNfdGJsLAotfTsKLQotbW9kdWxlX2luaXQobXNtX2ZsYXNoX2kyY19hZGRfZHJpdmVyKTsKLU1PRFVMRV9ERVNDUklQVElPTigiUE1JQyBGTEFTSCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2ZsYXNoL3NjNjI4YS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2ZsYXNoL3NjNjI4YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODgyNGUxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9mbGFzaC9zYzYyOGEuYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgotI2luY2x1ZGUgIm1zbV9mbGFzaC5oIgotCi0jZGVmaW5lIEZMQVNIX05BTUUgInNjNjI4YSIKLQotc3RhdGljIHN0cnVjdCBtc21fZmxhc2hfY3RybF90IGZjdHJsOwotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHNjNjI4YV9pMmNfZHJpdmVyOwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIHNjNjI4YV9vZmZfc2V0dGluZ1tdID0gewotCXsweDAyLCAweDAwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgc2M2MjhhX2xvd19zZXR0aW5nW10gPSB7Ci0JezB4MDIsIDB4MDZ9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBzYzYyOGFfaGlnaF9zZXR0aW5nW10gPSB7Ci0JezB4MDIsIDB4NDl9LAotfTsKLQotc3RhdGljIGludCBfX2V4aXQgbXNtX2ZsYXNoX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlpMmNfZGVsX2RyaXZlcigmc2M2MjhhX2kyY19kcml2ZXIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc2M2MjhhX2kyY19pZFtdID0gewotCXtGTEFTSF9OQU1FLCAoa2VybmVsX3Vsb25nX3QpJmZjdHJsfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzYzYyOGFfaTJjX2RyaXZlciA9IHsKLQkuaWRfdGFibGUgPSBzYzYyOGFfaTJjX2lkLAotCS5wcm9iZSAgPSBtc21fZmxhc2hfaTJjX3Byb2JlLAotCS5yZW1vdmUgPSBfX2V4aXRfcChtc21fZmxhc2hfaTJjX3JlbW92ZSksCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBGTEFTSF9OQU1FLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fZmxhc2hfaTJjX2FkZF9kcml2ZXIodm9pZCkKLXsKLQlDREJHKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnNjNjI4YV9pMmNfZHJpdmVyKTsKLX0KLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgc2M2MjhhX2kyY19jbGllbnQgPSB7Ci0JLmFkZHJfdHlwZSA9IE1TTV9DQU1FUkFfSTJDX0JZVEVfQUREUiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2ZsYXNoX3JlZ190IHNjNjI4YV9yZWdzID0gewotCS5kZWZhdWx0X2RhdGFfdHlwZSA9IE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSwKLQkub2ZmX3NldHRpbmcgPSBzYzYyOGFfb2ZmX3NldHRpbmcsCi0JLm9mZl9zZXR0aW5nX3NpemUgPSBBUlJBWV9TSVpFKHNjNjI4YV9vZmZfc2V0dGluZyksCi0JLmxvd19zZXR0aW5nID0gc2M2MjhhX2xvd19zZXR0aW5nLAotCS5sb3dfc2V0dGluZ19zaXplID0gQVJSQVlfU0laRShzYzYyOGFfbG93X3NldHRpbmcpLAotCS5oaWdoX3NldHRpbmcgPSBzYzYyOGFfaGlnaF9zZXR0aW5nLAotCS5oaWdoX3NldHRpbmdfc2l6ZSA9IEFSUkFZX1NJWkUoc2M2MjhhX2hpZ2hfc2V0dGluZyksCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9mbGFzaF9mbl90IHNjNjI4YV9mdW5jX3RibCA9IHsKLQkuZmxhc2hfbGVkX2NvbmZpZyA9IG1zbV9jYW1lcmFfZmxhc2hfbGVkX2NvbmZpZywKLQkuZmxhc2hfbGVkX2luaXQgPSBtc21fZmxhc2hfbGVkX2luaXQsCi0JLmZsYXNoX2xlZF9yZWxlYXNlID0gbXNtX2ZsYXNoX2xlZF9yZWxlYXNlLAotCS5mbGFzaF9sZWRfb2ZmID0gbXNtX2ZsYXNoX2xlZF9vZmYsCi0JLmZsYXNoX2xlZF9sb3cgPSBtc21fZmxhc2hfbGVkX2xvdywKLQkuZmxhc2hfbGVkX2hpZ2ggPSBtc21fZmxhc2hfbGVkX2hpZ2gsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9mbGFzaF9jdHJsX3QgZmN0cmwgPSB7Ci0JLmZsYXNoX2kyY19jbGllbnQgPSAmc2M2MjhhX2kyY19jbGllbnQsCi0JLnJlZ19zZXR0aW5nID0gJnNjNjI4YV9yZWdzLAotCS5mdW5jX3RibCA9ICZzYzYyOGFfZnVuY190YmwsCi19OwotCi1zdWJzeXNfaW5pdGNhbGwobXNtX2ZsYXNoX2kyY19hZGRfZHJpdmVyKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU0M2MjhBIEZMQVNIIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZmxhc2gvc2dtMzE0MS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2ZsYXNoL3NnbTMxNDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThmOGNhMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZmxhc2gvc2dtMzE0MS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSAibXNtX2ZsYXNoLmgiCi0KLSNkZWZpbmUgU0RfSU5ERVggMAotCi1zdGF0aWMgc3RydWN0IG1zbV9mbGFzaF9jdHJsX3QgZmN0cmw7Ci0KLXN0YXRpYyBpbnQgbXNtX2NhbWVyYV9mbGFzaF9sZWQoc3RydWN0IG1zbV9mbGFzaF9jdHJsX3QgKmZjdHJsLAotCXVpbnQ4X3QgbGVkX3N0YXRlKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2ZsYXNoX2V4dGVybmFsICpleHRlcm5hbCA9Ci0JCSZmY3RybC0+Zmxhc2hfZGF0YS0+Zmxhc2hfc3JjLT5fZnNyYy5leHRfZHJpdmVyX3NyYzsKLQotCUNEQkcoIm1zbV9jYW1lcmFfZmxhc2hfbGVkOiAlZFxuIiwgbGVkX3N0YXRlKTsKLQlzd2l0Y2ggKGxlZF9zdGF0ZSkgewotCWNhc2UgTVNNX0NBTUVSQV9MRURfSU5JVDoKLQkJcmMgPSBncGlvX3JlcXVlc3QoZXh0ZXJuYWwtPmxlZF9lbiwgInNnbTMxNDEiKTsKLQkJQ0RCRygiTVNNX0NBTUVSQV9MRURfSU5JVDogZ3Bpb19yZXE6ICVkICVkXG4iLAotCQkJCWV4dGVybmFsLT5sZWRfZW4sIHJjKTsKLQkJaWYgKCFyYykKLQkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChleHRlcm5hbC0+bGVkX2VuLCAwKTsKLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0KLQkJcmMgPSBncGlvX3JlcXVlc3QoZXh0ZXJuYWwtPmxlZF9mbGFzaF9lbiwgInNnbTMxNDEiKTsKLQkJQ0RCRygiTVNNX0NBTUVSQV9MRURfSU5JVDogZ3Bpb19yZXE6ICVkICVkXG4iLAotCQkJCWV4dGVybmFsLT5sZWRfZmxhc2hfZW4sIHJjKTsKLQkJaWYgKCFyYykKLQkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChleHRlcm5hbC0+bGVkX2ZsYXNoX2VuLCAwKTsKLQotCQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9DQU1FUkFfTEVEX1JFTEVBU0U6Ci0JCUNEQkcoIk1TTV9DQU1FUkFfTEVEX1JFTEVBU0VcbiIpOwotCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChleHRlcm5hbC0+bGVkX2VuLCAwKTsKLQkJZ3Bpb19mcmVlKGV4dGVybmFsLT5sZWRfZW4pOwotCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChleHRlcm5hbC0+bGVkX2ZsYXNoX2VuLCAwKTsKLQkJZ3Bpb19mcmVlKGV4dGVybmFsLT5sZWRfZmxhc2hfZW4pOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTUVSQV9MRURfT0ZGOgotCQlDREJHKCJNU01fQ0FNRVJBX0xFRF9PRkZcbiIpOwotCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChleHRlcm5hbC0+bGVkX2VuLCAwKTsKLQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoZXh0ZXJuYWwtPmxlZF9mbGFzaF9lbiwgMCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNRVJBX0xFRF9MT1c6Ci0JCUNEQkcoIk1TTV9DQU1FUkFfTEVEX0xPV1xuIik7Ci0JCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGV4dGVybmFsLT5sZWRfZW4sIDEpOwotCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChleHRlcm5hbC0+bGVkX2ZsYXNoX2VuLCAxKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9DQU1FUkFfTEVEX0hJR0g6Ci0JCUNEQkcoIk1TTV9DQU1FUkFfTEVEX0hJR0hcbiIpOwotCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChleHRlcm5hbC0+bGVkX2VuLCAxKTsKLQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoZXh0ZXJuYWwtPmxlZF9mbGFzaF9lbiwgMSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9mbGFzaF9pMmNfYWRkX2RyaXZlcih2b2lkKQotewotCUNEQkcoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwotCXJldHVybiBtc21fZmxhc2hfY3JlYXRlX3Y0bDJfc3ViZGV2KCZmY3RybCwgU0RfSU5ERVgpOwotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9mbGFzaF9mbl90IHNnbTMxNDFfZnVuY190YmwgPSB7Ci0JLmZsYXNoX2xlZF9jb25maWcgPSBtc21fY2FtZXJhX2ZsYXNoX2xlZCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2ZsYXNoX2N0cmxfdCBmY3RybCA9IHsKLQkuZnVuY190YmwgPSAmc2dtMzE0MV9mdW5jX3RibCwKLX07Ci0KLW1vZHVsZV9pbml0KG1zbV9mbGFzaF9pMmNfYWRkX2RyaXZlcik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlNHTTMxNDEgRkxBU0giKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9mbGFzaC90cHM2MTMxMC5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2ZsYXNoL3RwczYxMzEwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZTY5NTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2ZsYXNoL3RwczYxMzEwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KLSNpbmNsdWRlICJtc21fZmxhc2guaCIKLQotI2RlZmluZSBGTEFTSF9OQU1FICJ0cHM2MTMxMCIKLQotc3RhdGljIHN0cnVjdCBtc21fZmxhc2hfY3RybF90IGZjdHJsOwotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHRwczYxMzEwX2kyY19kcml2ZXI7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgdHBzNjEzMTBfaW5pdF9zZXR0aW5nW10gPSB7Ci0JezB4MDEsIDB4MDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiB0cHM2MTMxMF9vZmZfc2V0dGluZ1tdID0gewotCXsweDAxLCAweDAwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgdHBzNjEzMTBfbG93X3NldHRpbmdbXSA9IHsKLQl7MHgwMSwgMHg4Nn0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIHRwczYxMzEwX2hpZ2hfc2V0dGluZ1tdID0gewotCXsweDAxLCAweDhCfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19leGl0IG1zbV9mbGFzaF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJnRwczYxMzEwX2kyY19kcml2ZXIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdHBzNjEzMTBfaTJjX2lkW10gPSB7Ci0Je0ZMQVNIX05BTUUsIChrZXJuZWxfdWxvbmdfdCkmZmN0cmx9LAotCXsgfQotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHRwczYxMzEwX2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gdHBzNjEzMTBfaTJjX2lkLAotCS5wcm9iZSAgPSBtc21fZmxhc2hfaTJjX3Byb2JlLAotCS5yZW1vdmUgPSBfX2V4aXRfcChtc21fZmxhc2hfaTJjX3JlbW92ZSksCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBGTEFTSF9OQU1FLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fZmxhc2hfaTJjX2FkZF9kcml2ZXIodm9pZCkKLXsKLQlDREJHKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnRwczYxMzEwX2kyY19kcml2ZXIpOwotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCB0cHM2MTMxMF9pMmNfY2xpZW50ID0gewotCS5hZGRyX3R5cGUgPSBNU01fQ0FNRVJBX0kyQ19CWVRFX0FERFIsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9mbGFzaF9yZWdfdCB0cHM2MTMxMF9yZWdzID0gewotCS5kZWZhdWx0X2RhdGFfdHlwZSA9IE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSwKLQkuaW5pdF9zZXR0aW5nID0gdHBzNjEzMTBfaW5pdF9zZXR0aW5nLAotCS5pbml0X3NldHRpbmdfc2l6ZSA9IEFSUkFZX1NJWkUodHBzNjEzMTBfaW5pdF9zZXR0aW5nKSwKLQkub2ZmX3NldHRpbmcgPSB0cHM2MTMxMF9vZmZfc2V0dGluZywKLQkub2ZmX3NldHRpbmdfc2l6ZSA9IEFSUkFZX1NJWkUodHBzNjEzMTBfb2ZmX3NldHRpbmcpLAotCS5sb3dfc2V0dGluZyA9IHRwczYxMzEwX2xvd19zZXR0aW5nLAotCS5sb3dfc2V0dGluZ19zaXplID0gQVJSQVlfU0laRSh0cHM2MTMxMF9sb3dfc2V0dGluZyksCi0JLmhpZ2hfc2V0dGluZyA9IHRwczYxMzEwX2hpZ2hfc2V0dGluZywKLQkuaGlnaF9zZXR0aW5nX3NpemUgPSBBUlJBWV9TSVpFKHRwczYxMzEwX2hpZ2hfc2V0dGluZyksCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9mbGFzaF9mbl90IHRwczYxMzEwX2Z1bmNfdGJsID0gewotCS5mbGFzaF9sZWRfY29uZmlnID0gbXNtX2NhbWVyYV9mbGFzaF9sZWRfY29uZmlnLAotCS5mbGFzaF9sZWRfaW5pdCA9IG1zbV9mbGFzaF9sZWRfaW5pdCwKLQkuZmxhc2hfbGVkX3JlbGVhc2UgPSBtc21fZmxhc2hfbGVkX3JlbGVhc2UsCi0JLmZsYXNoX2xlZF9vZmYgPSBtc21fZmxhc2hfbGVkX29mZiwKLQkuZmxhc2hfbGVkX2xvdyA9IG1zbV9mbGFzaF9sZWRfbG93LAotCS5mbGFzaF9sZWRfaGlnaCA9IG1zbV9mbGFzaF9sZWRfaGlnaCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2ZsYXNoX2N0cmxfdCBmY3RybCA9IHsKLQkuZmxhc2hfaTJjX2NsaWVudCA9ICZ0cHM2MTMxMF9pMmNfY2xpZW50LAotCS5yZWdfc2V0dGluZyA9ICZ0cHM2MTMxMF9yZWdzLAotCS5mdW5jX3RibCA9ICZ0cHM2MTMxMF9mdW5jX3RibCwKLX07Ci0KLXN1YnN5c19pbml0Y2FsbChtc21fZmxhc2hfaTJjX2FkZF9kcml2ZXIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJUUFM2MTMxMCBGTEFTSCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2dlbWluaS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9nZW1pbmkvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNDE2NmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2dlbWluaS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotR0NDX1ZFUlNJT04gICAgICA6PSAkKHNoZWxsICQoQ09ORklHX1NIRUxMKSAkKFBXRCkvc2NyaXB0cy9nY2MtdmVyc2lvbi5zaCAkKENST1NTX0NPTVBJTEUpZ2NjKQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxCi1vYmotJChDT05GSUdfTVNNX0dFTUlOSSkgKz0gbXNtX2dlbWluaV9kZXYubyBtc21fZ2VtaW5pX3N5bmMubyBtc21fZ2VtaW5pX2NvcmUubyBtc21fZ2VtaW5pX2h3Lm8gbXNtX2dlbWluaV9wbGF0Zm9ybS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfY29tbW9uLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MjIzZDgwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9nZW1pbmkvbXNtX2dlbWluaV9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIE1TTV9HRU1JTklfQ09NTU9OX0gKLSNkZWZpbmUgTVNNX0dFTUlOSV9DT01NT05fSAotCi0jZGVmaW5lIE1TTV9HRU1JTklfREVCVUcKLSNpZmRlZiBNU01fR0VNSU5JX0RFQlVHCi0jZGVmaW5lIEdNTl9EQkcoZm10LCBhcmdzLi4uKSBwcl9kZWJ1ZyhmbXQsICMjYXJncykKLSNlbHNlCi0jZGVmaW5lIEdNTl9EQkcoZm10LCBhcmdzLi4uKSBkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQotI2RlZmluZSBHTU5fUFJfRVJSICAgcHJfZXJyCi0KLWVudW0gR0VNSU5JX01PREUgewotCUdFTUlOSV9NT0RFX0RJU0FCTEUsCi0JR0VNSU5JX01PREVfT0ZGTElORSwKLQlHRU1JTklfTU9ERV9SRUFMVElNRSwKLQlHRU1JTklfTU9ERV9SRUFMVElNRV9ST1RBVElPTgotfTsKLQotZW51bSBHRU1JTklfUk9UQVRJT04gewotCUdFTUlOSV9ST1RBVElPTl8wLAotCUdFTUlOSV9ST1RBVElPTl85MCwKLQlHRU1JTklfUk9UQVRJT05fMTgwLAotCUdFTUlOSV9ST1RBVElPTl8yNzAKLX07Ci0KLSNlbmRpZiAvKiBNU01fR0VNSU5JX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfY29yZS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2dlbWluaS9tc21fZ2VtaW5pX2NvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3MGZjOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMC0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgIm1zbV9nZW1pbmlfaHcuaCIKLSNpbmNsdWRlICJtc21fZ2VtaW5pX2NvcmUuaCIKLSNpbmNsdWRlICJtc21fZ2VtaW5pX3BsYXRmb3JtLmgiCi0jaW5jbHVkZSAibXNtX2dlbWluaV9jb21tb24uaCIKLQotc3RhdGljIHN0cnVjdCBtc21fZ2VtaW5pX2h3X3Bpbmdwb25nIGZlX3Bpbmdwb25nX2J1ZjsKLXN0YXRpYyBzdHJ1Y3QgbXNtX2dlbWluaV9od19waW5ncG9uZyB3ZV9waW5ncG9uZ19idWY7Ci1zdGF0aWMgaW50IHdlX3Bpbmdwb25nX2luZGV4Owotc3RhdGljIGludCByZXNldF9kb25lX2FjazsKLXN0YXRpYyBzcGlubG9ja190IHJlc2V0X2xvY2s7Ci1zdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgcmVzZXRfd2FpdDsKLQotaW50IG1zbV9nZW1pbmlfY29yZV9yZXNldCh1aW50OF90IG9wX21vZGUsIHZvaWQgKmJhc2UsIGludCBzaXplKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJjID0gMDsKLQlpbnQgdG0gPSA1MDA7IC8qNTAwbXMqLwotCW1lbXNldCgmZmVfcGluZ3BvbmdfYnVmLCAwLCBzaXplb2YoZmVfcGluZ3BvbmdfYnVmKSk7Ci0JZmVfcGluZ3BvbmdfYnVmLmlzX2ZlID0gMTsKLQl3ZV9waW5ncG9uZ19pbmRleCA9IDA7Ci0JbWVtc2V0KCZ3ZV9waW5ncG9uZ19idWYsIDAsIHNpemVvZih3ZV9waW5ncG9uZ19idWYpKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzZXRfbG9jaywgZmxhZ3MpOwotCXJlc2V0X2RvbmVfYWNrID0gMDsKLQltc21fZ2VtaW5pX2h3X3Jlc2V0KGJhc2UsIHNpemUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlc2V0X2xvY2ssIGZsYWdzKTsKLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAotCQkJcmVzZXRfd2FpdCwKLQkJCXJlc2V0X2RvbmVfYWNrLAotCQkJbXNlY3NfdG9famlmZmllcyh0bSkpOwotCi0JaWYgKCFyZXNldF9kb25lX2FjaykgewotCQlHTU5fREJHKCIlczogcmVzZXQgQUNLIGZhaWxlZCAlZCIsIF9fZnVuY19fLCByYyk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JR01OX0RCRygiJXM6IHJlc2V0X2RvbmVfYWNrIHJjICVkIiwgX19mdW5jX18sIHJjKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzZXRfbG9jaywgZmxhZ3MpOwotCXJlc2V0X2RvbmVfYWNrID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNldF9sb2NrLCBmbGFncyk7Ci0KLQlpZiAob3BfbW9kZSA9PSBNU01fR0VNSU5JX01PREVfUkVBTFRJTUVfRU5DT0RFKSB7Ci0JCS8qIE5vdGhpbmcgbmVlZGVkIGZvciBmZSBidWZmZXIgY2ZnLCBjb25maWcgd2Ugb25seSAqLwotCQltc21fZ2VtaW5pX2h3X3dlX2J1ZmZlcl9jZmcoMSk7Ci0JfSBlbHNlIHsKLQkJLyogTm90aGluZyBuZWVkZWQgZm9yIGZlIGJ1ZmZlciBjZmcsIGNvbmZpZyB3ZSBvbmx5ICovCi0JCW1zbV9nZW1pbmlfaHdfd2VfYnVmZmVyX2NmZygwKTsKLQl9Ci0KLQkvKiBAdG9kbyB3YWl0IGZvciByZXNldCBkb25lIGlycSAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgbXNtX2dlbWluaV9jb3JlX3JlbGVhc2UoaW50IHJlbGVhc2VfYnVmKQotewotCWludCBpID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCWlmICh3ZV9waW5ncG9uZ19idWYuYnVmX3N0YXR1c1tpXSAmJiByZWxlYXNlX2J1ZikKLQkJCW1zbV9nZW1pbmlfcGxhdGZvcm1fcDJ2KHdlX3Bpbmdwb25nX2J1Zi5idWZbaV0uZmlsZSwKLQkJCQkJJndlX3Bpbmdwb25nX2J1Zi5idWZbaV0uaGFuZGxlKTsKLQkJd2VfcGluZ3BvbmdfYnVmLmJ1Zl9zdGF0dXNbaV0gPSAwOwotCX0KLX0KLQotdm9pZCBtc21fZ2VtaW5pX2NvcmVfaW5pdCh2b2lkKQotewotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJlc2V0X3dhaXQpOwotCXNwaW5fbG9ja19pbml0KCZyZXNldF9sb2NrKTsKLX0KLQotaW50IG1zbV9nZW1pbmlfY29yZV9mZV9zdGFydCh2b2lkKQotewotCW1zbV9nZW1pbmlfaHdfZmVfc3RhcnQoKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogZmV0Y2ggZW5naW5lICovCi1pbnQgbXNtX2dlbWluaV9jb3JlX2ZlX2J1Zl91cGRhdGUoc3RydWN0IG1zbV9nZW1pbmlfY29yZV9idWYgKmJ1ZikKLXsKLQlHTU5fREJHKCIlczolZF0gMHglMDh4ICVkIDB4JTA4eCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkoaW50KSBidWYtPnlfYnVmZmVyX2FkZHIsIGJ1Zi0+eV9sZW4sCi0JCShpbnQpIGJ1Zi0+Y2Jjcl9idWZmZXJfYWRkciwgYnVmLT5jYmNyX2xlbik7Ci0JcmV0dXJuIG1zbV9nZW1pbmlfaHdfcGluZ3BvbmdfdXBkYXRlKCZmZV9waW5ncG9uZ19idWYsIGJ1Zik7Ci19Ci0KLXZvaWQgKm1zbV9nZW1pbmlfY29yZV9mZV9waW5ncG9uZ19pcnEoaW50IGdlbWluaV9pcnFfc3RhdHVzLCB2b2lkICpjb250ZXh0KQotewotCXJldHVybiBtc21fZ2VtaW5pX2h3X3Bpbmdwb25nX2lycSgmZmVfcGluZ3BvbmdfYnVmKTsKLX0KLQotLyogd3JpdGUgZW5naW5lICovCi1pbnQgbXNtX2dlbWluaV9jb3JlX3dlX2J1Zl91cGRhdGUoc3RydWN0IG1zbV9nZW1pbmlfY29yZV9idWYgKmJ1ZikKLXsKLQlpbnQgcmM7Ci0JR01OX0RCRygiJXM6JWRdIDB4JTA4eCAweCUwOHggJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJKGludCkgYnVmLT55X2J1ZmZlcl9hZGRyLCAoaW50KSBidWYtPmNiY3JfYnVmZmVyX2FkZHIsCi0JCWJ1Zi0+eV9sZW4pOwotCXdlX3Bpbmdwb25nX2J1Zi5idWZfc3RhdHVzW3dlX3Bpbmdwb25nX2luZGV4XSA9IDA7Ci0Jd2VfcGluZ3BvbmdfaW5kZXggPSAod2VfcGluZ3BvbmdfaW5kZXggKyAxKSUyOwotCXJjID0gbXNtX2dlbWluaV9od19waW5ncG9uZ191cGRhdGUoJndlX3Bpbmdwb25nX2J1ZiwgYnVmKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IG1zbV9nZW1pbmlfY29yZV93ZV9idWZfcmVzZXQoc3RydWN0IG1zbV9nZW1pbmlfaHdfYnVmICpidWYpCi17Ci0JaW50IGkgPSAwOwotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJaWYgKHdlX3Bpbmdwb25nX2J1Zi5idWZbaV0ueV9idWZmZXJfYWRkcgotCQkJCQk9PSBidWYtPnlfYnVmZmVyX2FkZHIpCi0JCQl3ZV9waW5ncG9uZ19idWYuYnVmX3N0YXR1c1tpXSA9IDA7Ci0JfQotCXJldHVybiAwOwotfQotCi12b2lkICptc21fZ2VtaW5pX2NvcmVfd2VfcGluZ3BvbmdfaXJxKGludCBnZW1pbmlfaXJxX3N0YXR1cywgdm9pZCAqY29udGV4dCkKLXsKLQlHTU5fREJHKCIlczolZF1cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0KLQlyZXR1cm4gbXNtX2dlbWluaV9od19waW5ncG9uZ19pcnEoJndlX3Bpbmdwb25nX2J1Zik7Ci19Ci0KLXZvaWQgKm1zbV9nZW1pbmlfY29yZV9mcmFtZWRvbmVfaXJxKGludCBnZW1pbmlfaXJxX3N0YXR1cywgdm9pZCAqY29udGV4dCkKLXsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9od19idWYgKmJ1Zl9wOwotCi0JR01OX0RCRygiJXM6JWRdXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCi0JYnVmX3AgPSBtc21fZ2VtaW5pX2h3X3Bpbmdwb25nX2FjdGl2ZV9idWZmZXIoJndlX3Bpbmdwb25nX2J1Zik7Ci0JaWYgKGJ1Zl9wKSB7Ci0JCWJ1Zl9wLT5mcmFtZWRvbmVfbGVuID0gbXNtX2dlbWluaV9od19lbmNvZGVfb3V0cHV0X3NpemUoKTsKLQkJcHJfZGVidWcoIiVzOiVkXSBmcmFtZWRvbmVfbGVuICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQlidWZfcC0+ZnJhbWVkb25lX2xlbik7Ci0JfQotCi0JcmV0dXJuIGJ1Zl9wOwotfQotCi12b2lkICptc21fZ2VtaW5pX2NvcmVfcmVzZXRfYWNrX2lycShpbnQgZ2VtaW5pX2lycV9zdGF0dXMsIHZvaWQgKmNvbnRleHQpCi17Ci0JLyogQHRvZG8gcmV0dXJuIHRoZSBzdGF0dXMgYmFjayB0byBtc21fZ2VtaW5pX2NvcmVfcmVzZXQgKi8KLQlHTU5fREJHKCIlczolZF1cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgKm1zbV9nZW1pbmlfY29yZV9lcnJfaXJxKGludCBnZW1pbmlfaXJxX3N0YXR1cywgdm9pZCAqY29udGV4dCkKLXsKLQlHTU5fUFJfRVJSKCIlczolZF1cbiIsIF9fZnVuY19fLCBnZW1pbmlfaXJxX3N0YXR1cyk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgKCptc21fZ2VtaW5pX2lycV9oYW5kbGVyKSAoaW50LCB2b2lkICosIHZvaWQgKik7Ci0KLWlycXJldHVybl90IG1zbV9nZW1pbmlfY29yZV9pcnEoaW50IGlycV9udW0sIHZvaWQgKmNvbnRleHQpCi17Ci0Jdm9pZCAqZGF0YSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZ2VtaW5pX2lycV9zdGF0dXM7Ci0KLQlHTU5fREJHKCIlczolZF0gaXJxX251bSA9ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGlycV9udW0pOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJlc2V0X2xvY2ssIGZsYWdzKTsKLQlyZXNldF9kb25lX2FjayA9IDE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVzZXRfbG9jaywgZmxhZ3MpOwotCWdlbWluaV9pcnFfc3RhdHVzID0gbXNtX2dlbWluaV9od19pcnFfZ2V0X3N0YXR1cygpOwotCi0JR01OX0RCRygiJXM6JWRdIGdlbWluaV9pcnFfc3RhdHVzID0gJTB4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWdlbWluaV9pcnFfc3RhdHVzKTsKLQotCS8qRm9yIHJlc2V0IGFuZCBmcmFtZWRvbmUgSVJRcywgY2xlYXIgYWxsIGJpdHMqLwotCWlmIChnZW1pbmlfaXJxX3N0YXR1cyAmIDB4NDAwKSB7Ci0JCXdha2VfdXAoJnJlc2V0X3dhaXQpOwotCQltc21fZ2VtaW5pX2h3X2lycV9jbGVhcihIV0lPX0pQRUdfSVJRX0NMRUFSX1JNU0ssCi0JCQlKUEVHX0lSUV9DTEVBUl9BTEwpOwotCX0gZWxzZSBpZiAoZ2VtaW5pX2lycV9zdGF0dXMgJiAweDEpIHsKLQkJbXNtX2dlbWluaV9od19pcnFfY2xlYXIoSFdJT19KUEVHX0lSUV9DTEVBUl9STVNLLAotCQkJSlBFR19JUlFfQ0xFQVJfQUxMKTsKLQl9IGVsc2UgewotCQltc21fZ2VtaW5pX2h3X2lycV9jbGVhcihIV0lPX0pQRUdfSVJRX0NMRUFSX1JNU0ssCi0JCQlnZW1pbmlfaXJxX3N0YXR1cyk7Ci0JfQotCi0JaWYgKG1zbV9nZW1pbmlfaHdfaXJxX2lzX2ZyYW1lX2RvbmUoZ2VtaW5pX2lycV9zdGF0dXMpKSB7Ci0JCWRhdGEgPSBtc21fZ2VtaW5pX2NvcmVfZnJhbWVkb25lX2lycShnZW1pbmlfaXJxX3N0YXR1cywKLQkJCWNvbnRleHQpOwotCQlpZiAobXNtX2dlbWluaV9pcnFfaGFuZGxlcikKLQkJCW1zbV9nZW1pbmlfaXJxX2hhbmRsZXIoCi0JCQkJTVNNX0dFTUlOSV9IV19NQVNLX0NPTVBfRlJBTUVET05FLAotCQkJCWNvbnRleHQsIGRhdGEpOwotCX0KLQotCWlmIChtc21fZ2VtaW5pX2h3X2lycV9pc19mZV9waW5ncG9uZyhnZW1pbmlfaXJxX3N0YXR1cykpIHsKLQkJZGF0YSA9IG1zbV9nZW1pbmlfY29yZV9mZV9waW5ncG9uZ19pcnEoZ2VtaW5pX2lycV9zdGF0dXMsCi0JCQljb250ZXh0KTsKLQkJaWYgKG1zbV9nZW1pbmlfaXJxX2hhbmRsZXIpCi0JCQltc21fZ2VtaW5pX2lycV9oYW5kbGVyKE1TTV9HRU1JTklfSFdfTUFTS19DT01QX0ZFLAotCQkJCWNvbnRleHQsIGRhdGEpOwotCX0KLQotCWlmIChtc21fZ2VtaW5pX2h3X2lycV9pc193ZV9waW5ncG9uZyhnZW1pbmlfaXJxX3N0YXR1cykgJiYKLQkgICAgIW1zbV9nZW1pbmlfaHdfaXJxX2lzX2ZyYW1lX2RvbmUoZ2VtaW5pX2lycV9zdGF0dXMpKSB7Ci0JCWRhdGEgPSBtc21fZ2VtaW5pX2NvcmVfd2VfcGluZ3BvbmdfaXJxKGdlbWluaV9pcnFfc3RhdHVzLAotCQkJY29udGV4dCk7Ci0JCWlmIChtc21fZ2VtaW5pX2lycV9oYW5kbGVyKQotCQkJbXNtX2dlbWluaV9pcnFfaGFuZGxlcihNU01fR0VNSU5JX0hXX01BU0tfQ09NUF9XRSwKLQkJCQljb250ZXh0LCBkYXRhKTsKLQl9Ci0KLQlpZiAobXNtX2dlbWluaV9od19pcnFfaXNfcmVzZXRfYWNrKGdlbWluaV9pcnFfc3RhdHVzKSkgewotCQlkYXRhID0gbXNtX2dlbWluaV9jb3JlX3Jlc2V0X2Fja19pcnEoZ2VtaW5pX2lycV9zdGF0dXMsCi0JCQljb250ZXh0KTsKLQkJaWYgKG1zbV9nZW1pbmlfaXJxX2hhbmRsZXIpCi0JCQltc21fZ2VtaW5pX2lycV9oYW5kbGVyKAotCQkJCU1TTV9HRU1JTklfSFdfTUFTS19DT01QX1JFU0VUX0FDSywKLQkJCQljb250ZXh0LCBkYXRhKTsKLQl9Ci0KLQkvKiBVbmV4cGVjdGVkL3VuaW50ZW5kZWQgSFcgaW50ZXJydXB0ICovCi0JaWYgKG1zbV9nZW1pbmlfaHdfaXJxX2lzX2VycihnZW1pbmlfaXJxX3N0YXR1cykpIHsKLQkJZGF0YSA9IG1zbV9nZW1pbmlfY29yZV9lcnJfaXJxKGdlbWluaV9pcnFfc3RhdHVzLCBjb250ZXh0KTsKLQkJaWYgKG1zbV9nZW1pbmlfaXJxX2hhbmRsZXIpCi0JCQltc21fZ2VtaW5pX2lycV9oYW5kbGVyKE1TTV9HRU1JTklfSFdfTUFTS19DT01QX0VSUiwKLQkJCQljb250ZXh0LCBkYXRhKTsKLQl9Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXZvaWQgbXNtX2dlbWluaV9jb3JlX2lycV9pbnN0YWxsKGludCAoKmlycV9oYW5kbGVyKSAoaW50LCB2b2lkICosIHZvaWQgKikpCi17Ci0JbXNtX2dlbWluaV9pcnFfaGFuZGxlciA9IGlycV9oYW5kbGVyOwotfQotCi12b2lkIG1zbV9nZW1pbmlfY29yZV9pcnFfcmVtb3ZlKHZvaWQpCi17Ci0JbXNtX2dlbWluaV9pcnFfaGFuZGxlciA9IE5VTEw7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfY29yZS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2dlbWluaS9tc21fZ2VtaW5pX2NvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkZDQ3My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgTVNNX0dFTUlOSV9DT1JFX0gKLSNkZWZpbmUgTVNNX0dFTUlOSV9DT1JFX0gKLQotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgIm1zbV9nZW1pbmlfaHcuaCIKLQotI2RlZmluZSBtc21fZ2VtaW5pX2NvcmVfYnVmIG1zbV9nZW1pbmlfaHdfYnVmCi0KLWlycXJldHVybl90IG1zbV9nZW1pbmlfY29yZV9pcnEoaW50IGlycV9udW0sIHZvaWQgKmNvbnRleHQpOwotCi12b2lkIG1zbV9nZW1pbmlfY29yZV9pcnFfaW5zdGFsbChpbnQgKCppcnFfaGFuZGxlcikgKGludCwgdm9pZCAqLCB2b2lkICopKTsKLXZvaWQgbXNtX2dlbWluaV9jb3JlX2lycV9yZW1vdmUodm9pZCk7Ci0KLWludCBtc21fZ2VtaW5pX2NvcmVfZmVfYnVmX3VwZGF0ZShzdHJ1Y3QgbXNtX2dlbWluaV9jb3JlX2J1ZiAqYnVmKTsKLWludCBtc21fZ2VtaW5pX2NvcmVfd2VfYnVmX3VwZGF0ZShzdHJ1Y3QgbXNtX2dlbWluaV9jb3JlX2J1ZiAqYnVmKTsKLWludCBtc21fZ2VtaW5pX2NvcmVfd2VfYnVmX3Jlc2V0KHN0cnVjdCBtc21fZ2VtaW5pX2h3X2J1ZiAqYnVmKTsKLQotaW50IG1zbV9nZW1pbmlfY29yZV9yZXNldCh1aW50OF90IG9wX21vZGUsIHZvaWQgKmJhc2UsIGludCBzaXplKTsKLWludCBtc21fZ2VtaW5pX2NvcmVfZmVfc3RhcnQodm9pZCk7Ci0KLXZvaWQgbXNtX2dlbWluaV9jb3JlX3JlbGVhc2UoaW50KTsKLXZvaWQgbXNtX2dlbWluaV9jb3JlX2luaXQodm9pZCk7Ci0jZW5kaWYgLyogTVNNX0dFTUlOSV9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9nZW1pbmkvbXNtX2dlbWluaV9kZXYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9nZW1pbmkvbXNtX2dlbWluaV9kZXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcwYTI4Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfZGV2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2dlbWluaS5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KLQotI2luY2x1ZGUgIm1zbS5oIgotI2luY2x1ZGUgIm1zbV9nZW1pbmlfc3luYy5oIgotI2luY2x1ZGUgIm1zbV9nZW1pbmlfY29tbW9uLmgiCi0KLSNkZWZpbmUgTVNNX0dFTUlOSV9OQU1FICJnZW1pbmkiCi0KLXN0YXRpYyBpbnQgbXNtX2dlbWluaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCWludCByYzsKLQotCXN0cnVjdCBtc21fZ2VtaW5pX2RldmljZSAqcGdtbl9kZXYgPSBjb250YWluZXJfb2YoaW5vZGUtPmlfY2RldiwKLQkJc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlLCBjZGV2KTsKLQlmaWxwLT5wcml2YXRlX2RhdGEgPSBwZ21uX2RldjsKLQotCUdNTl9EQkcoIiVzOiVkXVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCXJjID0gX19tc21fZ2VtaW5pX29wZW4ocGdtbl9kZXYpOwotCi0JR01OX0RCRyhLRVJOX0lORk8gIiVzOiVkXSAlcyBvcGVuX2NvdW50ID0gJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLm5hbWUsIHBnbW5fZGV2LT5vcGVuX2NvdW50KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fZ2VtaW5pX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCi17Ci0JaW50IHJjOwotCi0Jc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlICpwZ21uX2RldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQotCUdNTl9EQkcoS0VSTl9JTkZPICIlczolZF1cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0KLQlyYyA9IF9fbXNtX2dlbWluaV9yZWxlYXNlKHBnbW5fZGV2KTsKLQotCUdNTl9EQkcoS0VSTl9JTkZPICIlczolZF0gJXMgb3Blbl9jb3VudCA9ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLCBwZ21uX2Rldi0+b3Blbl9jb3VudCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBtc21fZ2VtaW5pX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAotCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByYzsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKnBnbW5fZGV2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCi0JR01OX0RCRygiJXM6JWRdIGNtZD0lZCBwZ21uX2Rldj0weCV4IGFyZz0weCV4XG4iLCBfX2Z1bmNfXywKLQkJX19MSU5FX18sIF9JT0NfTlIoY21kKSwgKHVpbnQzMl90KXBnbW5fZGV2LCAodWludDMyX3QpYXJnKTsKLQotCXJjID0gX19tc21fZ2VtaW5pX2lvY3RsKHBnbW5fZGV2LCBjbWQsIGFyZyk7Ci0KLQlHTU5fREJHKCIlczolZF1cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtc21fZ2VtaW5pX2ZvcHMgPSB7Ci0JLm93bmVyCSAgPSBUSElTX01PRFVMRSwKLQkub3BlbgkgICA9IG1zbV9nZW1pbmlfb3BlbiwKLQkucmVsZWFzZQk9IG1zbV9nZW1pbmlfcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwgPSBtc21fZ2VtaW5pX2lvY3RsLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGFzcyAqbXNtX2dlbWluaV9jbGFzczsKLXN0YXRpYyBkZXZfdCBtc21fZ2VtaW5pX2Rldm5vOwotc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlICptc21fZ2VtaW5pX2RldmljZV9wOwotCi1pbnQgbXNtX2dlbWluaV9zdWJkZXZfaW5pdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKmdlbWluaV9zZCkKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlICpwZ21uX2RldiA9Ci0JCShzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKilnZW1pbmlfc2QtPmhvc3RfcHJpdjsKLQotCUdNTl9EQkcoIiVzOiVkOiBnZW1pbmlfc2Q9MHgleCBwZ21uX2Rldj0weCV4XG4iLAotCQlfX2Z1bmNfXywgX19MSU5FX18sICh1aW50MzJfdClnZW1pbmlfc2QsICh1aW50MzJfdClwZ21uX2Rldik7Ci0JcmMgPSBfX21zbV9nZW1pbmlfb3BlbihwZ21uX2Rldik7Ci0JR01OX0RCRygiJXM6JWQ6IHJjPSVkXG4iLAotCQlfX2Z1bmNfXywgX19MSU5FX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBsb25nIG1zbV9nZW1pbmlfc3ViZGV2X2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCWxvbmcgcmM7Ci0Jc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlICpwZ21uX2RldiA9Ci0JCShzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKilzZC0+aG9zdF9wcml2OwotCi0JR01OX0RCRygiJXM6IGNtZD0lZFxuIiwgX19mdW5jX18sIGNtZCk7Ci0KLQlHTU5fREJHKCIlczogcGdtbl9kZXYgMHgleCIsIF9fZnVuY19fLCAodWludDMyX3QpcGdtbl9kZXYpOwotCi0JR01OX0RCRygiJXM6IENhbGxpbmcgX19tc21fZ2VtaW5pX2lvY3RsXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyYyA9IF9fbXNtX2dlbWluaV9pb2N0bChwZ21uX2RldiwgY21kLCAodW5zaWduZWQgbG9uZylhcmcpOwotCXByX2RlYnVnKCIlczogWFxuIiwgX19mdW5jX18pOwotCXJldHVybiByYzsKLX0KLQotdm9pZCBtc21fZ2VtaW5pX3N1YmRldl9yZWxlYXNlKHN0cnVjdCB2NGwyX3N1YmRldiAqZ2VtaW5pX3NkKQotewotCWludCByYzsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKnBnbW5fZGV2ID0KLQkJKHN0cnVjdCBtc21fZ2VtaW5pX2RldmljZSAqKWdlbWluaV9zZC0+aG9zdF9wcml2OwotCUdNTl9EQkcoIiVzOnBnbW5fZGV2PTB4JXgiLCBfX2Z1bmNfXywgKHVpbnQzMl90KXBnbW5fZGV2KTsKLQlyYyA9IF9fbXNtX2dlbWluaV9yZWxlYXNlKHBnbW5fZGV2KTsKLQlHTU5fREJHKCIlczpyYz0lZCIsIF9fZnVuY19fLCByYyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbXNtX2dlbWluaV9zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmlvY3RsID0gbXNtX2dlbWluaV9zdWJkZXZfaW9jdGwsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBtc21fZ2VtaW5pX3N1YmRldl9vcHMgPSB7Ci0JLmNvcmUgPSAmbXNtX2dlbWluaV9zdWJkZXZfY29yZV9vcHMsCi19OwotCi1zdGF0aWMgaW50IG1zbV9nZW1pbmlfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByYyA9IC0xOwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQotCUdNTl9EQkcoIiVzOlxuIiwgX19mdW5jX18pOwotCW1zbV9nZW1pbmlfZGV2aWNlX3AgPSBfX21zbV9nZW1pbmlfaW5pdChwZGV2KTsKLQlpZiAobXNtX2dlbWluaV9kZXZpY2VfcCA9PSBOVUxMKSB7Ci0JCUdNTl9QUl9FUlIoIiVzOiBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXY0bDJfc3ViZGV2X2luaXQoJm1zbV9nZW1pbmlfZGV2aWNlX3AtPnN1YmRldiwgJm1zbV9nZW1pbmlfc3ViZGV2X29wcyk7Ci0JdjRsMl9zZXRfc3ViZGV2X2hvc3RkYXRhKCZtc21fZ2VtaW5pX2RldmljZV9wLT5zdWJkZXYsCi0JCW1zbV9nZW1pbmlfZGV2aWNlX3ApOwotCXByX2RlYnVnKCIlczogbXNtX2dlbWluaV9kZXZpY2VfcCAweCV4IiwgX19mdW5jX18sCi0JCQkodWludDMyX3QpbXNtX2dlbWluaV9kZXZpY2VfcCk7Ci0JR01OX0RCRygiJXM6Z2VtaW5pOiBwbGF0Zm9ybV9zZXRfZHJ2ZGF0YVxuIiwgX19mdW5jX18pOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsICZtc21fZ2VtaW5pX2RldmljZV9wLT5zdWJkZXYpOwotCi0JcmMgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZtc21fZ2VtaW5pX2Rldm5vLCAwLCAxLCBNU01fR0VNSU5JX05BTUUpOwotCWlmIChyYyA8IDApIHsKLQkJR01OX1BSX0VSUigiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBjaHJkZXZcbiIsIF9fZnVuY19fKTsKLQkJZ290byBmYWlsXzE7Ci0JfQotCi0JaWYgKCFtc21fZ2VtaW5pX2NsYXNzKSB7Ci0JCW1zbV9nZW1pbmlfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsIE1TTV9HRU1JTklfTkFNRSk7Ci0JCWlmIChJU19FUlIobXNtX2dlbWluaV9jbGFzcykpIHsKLQkJCXJjID0gUFRSX0VSUihtc21fZ2VtaW5pX2NsYXNzKTsKLQkJCUdNTl9QUl9FUlIoIiVzOiBjcmVhdGUgZGV2aWNlIGNsYXNzIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGZhaWxfMjsKLQkJfQotCX0KLQotCWRldiA9IGRldmljZV9jcmVhdGUobXNtX2dlbWluaV9jbGFzcywgTlVMTCwKLQkJTUtERVYoTUFKT1IobXNtX2dlbWluaV9kZXZubyksIE1JTk9SKG1zbV9nZW1pbmlfZGV2bm8pKSwgTlVMTCwKLQkJIiVzJWQiLCBNU01fR0VNSU5JX05BTUUsIDApOwotCi0JaWYgKElTX0VSUihkZXYpKSB7Ci0JCUdNTl9QUl9FUlIoIiVzOiBlcnJvciBjcmVhdGluZyBkZXZpY2VcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGZhaWxfMzsKLQl9Ci0KLQljZGV2X2luaXQoJm1zbV9nZW1pbmlfZGV2aWNlX3AtPmNkZXYsICZtc21fZ2VtaW5pX2ZvcHMpOwotCW1zbV9nZW1pbmlfZGV2aWNlX3AtPmNkZXYub3duZXIgPSBUSElTX01PRFVMRTsKLQltc21fZ2VtaW5pX2RldmljZV9wLT5jZGV2Lm9wcyAgID0KLQkJKGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKikgJm1zbV9nZW1pbmlfZm9wczsKLQlyYyA9IGNkZXZfYWRkKCZtc21fZ2VtaW5pX2RldmljZV9wLT5jZGV2LCBtc21fZ2VtaW5pX2Rldm5vLCAxKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUdNTl9QUl9FUlIoIiVzOiBlcnJvciBhZGRpbmcgY2RldlxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gZmFpbF80OwotCX0KLQotCUdNTl9EQkcoIiVzICVzOiBzdWNjZXNzXG4iLCBfX2Z1bmNfXywgTVNNX0dFTUlOSV9OQU1FKTsKLQotCXJldHVybiByYzsKLQotZmFpbF80OgotCWRldmljZV9kZXN0cm95KG1zbV9nZW1pbmlfY2xhc3MsIG1zbV9nZW1pbmlfZGV2bm8pOwotCi1mYWlsXzM6Ci0JY2xhc3NfZGVzdHJveShtc21fZ2VtaW5pX2NsYXNzKTsKLQotZmFpbF8yOgotCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihtc21fZ2VtaW5pX2Rldm5vLCAxKTsKLQotZmFpbF8xOgotCV9fbXNtX2dlbWluaV9leGl0KG1zbV9nZW1pbmlfZGV2aWNlX3ApOwotCi1mYWlsOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2dlbWluaV9leGl0KHZvaWQpCi17Ci0JY2Rldl9kZWwoJm1zbV9nZW1pbmlfZGV2aWNlX3AtPmNkZXYpOwotCWRldmljZV9kZXN0cm95KG1zbV9nZW1pbmlfY2xhc3MsIG1zbV9nZW1pbmlfZGV2bm8pOwotCWNsYXNzX2Rlc3Ryb3kobXNtX2dlbWluaV9jbGFzcyk7Ci0JdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKG1zbV9nZW1pbmlfZGV2bm8sIDEpOwotCi0JX19tc21fZ2VtaW5pX2V4aXQobXNtX2dlbWluaV9kZXZpY2VfcCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19tc21fZ2VtaW5pX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIG1zbV9nZW1pbmlfaW5pdChwZGV2KTsKLX0KLQotc3RhdGljIGludCBfX21zbV9nZW1pbmlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JbXNtX2dlbWluaV9leGl0KCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9nZW1pbmlfZHJpdmVyID0gewotCS5wcm9iZSAgPSBfX21zbV9nZW1pbmlfcHJvYmUsCi0JLnJlbW92ZSA9IF9fbXNtX2dlbWluaV9yZW1vdmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBNU01fR0VNSU5JX0RSVl9OQU1FLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX2dlbWluaV9kcml2ZXJfaW5pdCh2b2lkKQotewotCWludCByYzsKLQlyYyA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX2dlbWluaV9kcml2ZXIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG1zbV9nZW1pbmlfZHJpdmVyX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX2dlbWluaV9kcml2ZXIpOwotfQotCi1NT0RVTEVfREVTQ1JJUFRJT04oIm1zbSBnZW1pbmkganBlZyBkcml2ZXIiKTsKLU1PRFVMRV9WRVJTSU9OKCJtc20gZ2VtaW5pIDAuMSIpOwotCi1tb2R1bGVfaW5pdChtc21fZ2VtaW5pX2RyaXZlcl9pbml0KTsKLW1vZHVsZV9leGl0KG1zbV9nZW1pbmlfZHJpdmVyX2V4aXQpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfaHcuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9nZW1pbmkvbXNtX2dlbWluaV9ody5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTBlZDk3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9nZW1pbmkvbXNtX2dlbWluaV9ody5jCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMCwyMDEzIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSAibXNtX2dlbWluaV9ody5oIgotI2luY2x1ZGUgIm1zbV9nZW1pbmlfY29tbW9uLmgiCi0KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi1zdGF0aWMgdm9pZCAqZ2VtaW5pX3JlZ2lvbl9iYXNlOwotc3RhdGljIHVpbnQzMl90IGdlbWluaV9yZWdpb25fc2l6ZTsKLQotaW50IG1zbV9nZW1pbmlfaHdfcGluZ3BvbmdfdXBkYXRlKHN0cnVjdCBtc21fZ2VtaW5pX2h3X3Bpbmdwb25nICpwaW5ncG9uZ19odywKLQlzdHJ1Y3QgbXNtX2dlbWluaV9od19idWYgKmJ1ZikKLXsKLQlpbnQgYnVmX2ZyZWVfaW5kZXggPSAtMTsKLQotCWlmICghcGluZ3BvbmdfaHctPmJ1Zl9zdGF0dXNbMF0pIHsKLQkJYnVmX2ZyZWVfaW5kZXggPSAwOwotCX0gZWxzZSBpZiAoIXBpbmdwb25nX2h3LT5idWZfc3RhdHVzWzFdKSB7Ci0JCWJ1Zl9mcmVlX2luZGV4ID0gMTsKLQl9IGVsc2UgewotCQlHTU5fUFJfRVJSKCIlczolZDogcGluZ3BvbmcgYnVmZmVyIGJ1c3lcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwaW5ncG9uZ19ody0+YnVmW2J1Zl9mcmVlX2luZGV4XSA9ICpidWY7Ci0JcGluZ3BvbmdfaHctPmJ1Zl9zdGF0dXNbYnVmX2ZyZWVfaW5kZXhdID0gMTsKLQotCWlmIChwaW5ncG9uZ19ody0+aXNfZmUpIHsKLQkJLyogaXQgaXMgZmUgKi8KLQkJbXNtX2dlbWluaV9od19mZV9idWZmZXJfdXBkYXRlKAotCQkJJnBpbmdwb25nX2h3LT5idWZbYnVmX2ZyZWVfaW5kZXhdLCBidWZfZnJlZV9pbmRleCk7Ci0JfSBlbHNlIHsKLQkJLyogaXQgaXMgd2UgKi8KLQkJbXNtX2dlbWluaV9od193ZV9idWZmZXJfdXBkYXRlKAotCQkJJnBpbmdwb25nX2h3LT5idWZbYnVmX2ZyZWVfaW5kZXhdLCBidWZfZnJlZV9pbmRleCk7Ci0JfQotCXJldHVybiAwOwotfQotCi12b2lkICptc21fZ2VtaW5pX2h3X3Bpbmdwb25nX2lycShzdHJ1Y3QgbXNtX2dlbWluaV9od19waW5ncG9uZyAqcGluZ3BvbmdfaHcpCi17Ci0Jc3RydWN0IG1zbV9nZW1pbmlfaHdfYnVmICpidWZfcCA9IE5VTEw7Ci0KLQlpZiAocGluZ3BvbmdfaHctPmJ1Zl9zdGF0dXNbcGluZ3BvbmdfaHctPmJ1Zl9hY3RpdmVfaW5kZXhdKSB7Ci0JCWJ1Zl9wID0gJnBpbmdwb25nX2h3LT5idWZbcGluZ3BvbmdfaHctPmJ1Zl9hY3RpdmVfaW5kZXhdOwotCQlwaW5ncG9uZ19ody0+YnVmX3N0YXR1c1twaW5ncG9uZ19ody0+YnVmX2FjdGl2ZV9pbmRleF0gPSAwOwotCX0KLQotCXBpbmdwb25nX2h3LT5idWZfYWN0aXZlX2luZGV4ID0gIXBpbmdwb25nX2h3LT5idWZfYWN0aXZlX2luZGV4OwotCi0JcmV0dXJuICh2b2lkICopIGJ1Zl9wOwotfQotCi12b2lkICptc21fZ2VtaW5pX2h3X3Bpbmdwb25nX2FjdGl2ZV9idWZmZXIoCi0Jc3RydWN0IG1zbV9nZW1pbmlfaHdfcGluZ3BvbmcgKnBpbmdwb25nX2h3KQotewotCXN0cnVjdCBtc21fZ2VtaW5pX2h3X2J1ZiAqYnVmX3AgPSBOVUxMOwotCi0JaWYgKHBpbmdwb25nX2h3LT5idWZfc3RhdHVzW3Bpbmdwb25nX2h3LT5idWZfYWN0aXZlX2luZGV4XSkKLQkJYnVmX3AgPSAmcGluZ3BvbmdfaHctPmJ1ZltwaW5ncG9uZ19ody0+YnVmX2FjdGl2ZV9pbmRleF07Ci0KLQlyZXR1cm4gKHZvaWQgKikgYnVmX3A7Ci19Ci0KLXN0cnVjdCBtc21fZ2VtaW5pX2h3X2NtZCBod19jbWRfaXJxX2dldF9zdGF0dXNbXSA9IHsKLQkvKiB0eXBlLCByZXBlYXQgbiB0aW1lcywgb2Zmc2V0LCBtYXNrLCBkYXRhIG9yIHBkYXRhICovCi0Je01TTV9HRU1JTklfSFdfQ01EX1RZUEVfUkVBRCwgMSwgSFdJT19KUEVHX0lSUV9TVEFUVVNfQUREUiwKLQkJSFdJT19KUEVHX0lSUV9TVEFUVVNfUk1TSywgezB9IH0sCi19OwotCi1pbnQgbXNtX2dlbWluaV9od19pcnFfZ2V0X3N0YXR1cyh2b2lkKQotewotCXVpbnQzMl90IG5faXJxX3N0YXR1cyA9IDA7Ci0Jcm1iKCk7Ci0Jbl9pcnFfc3RhdHVzID0gbXNtX2dlbWluaV9od19yZWFkKCZod19jbWRfaXJxX2dldF9zdGF0dXNbMF0pOwotCXJtYigpOwotCXJldHVybiBuX2lycV9zdGF0dXM7Ci19Ci0KLXN0cnVjdCBtc21fZ2VtaW5pX2h3X2NtZCBod19jbWRfZW5jb2RlX291dHB1dF9zaXplW10gPSB7Ci0JLyogdHlwZSwgcmVwZWF0IG4gdGltZXMsIG9mZnNldCwgbWFzaywgZGF0YSBvciBwZGF0YSAqLwotCXtNU01fR0VNSU5JX0hXX0NNRF9UWVBFX1JFQUQsIDEsCi0JCUhXSU9fSlBFR19TVEFUVVNfRU5DT0RFX09VVFBVVF9TSVpFX0FERFIsCi0JCUhXSU9fSlBFR19TVEFUVVNfRU5DT0RFX09VVFBVVF9TSVpFX1JNU0ssIHswfSB9LAotfTsKLQotbG9uZyBtc21fZ2VtaW5pX2h3X2VuY29kZV9vdXRwdXRfc2l6ZSh2b2lkKQotewotCXVpbnQzMl90IGVuY29kZV9vdXRwdXRfc2l6ZSA9IDA7Ci0KLQllbmNvZGVfb3V0cHV0X3NpemUgPSBtc21fZ2VtaW5pX2h3X3JlYWQoJmh3X2NtZF9lbmNvZGVfb3V0cHV0X3NpemVbMF0pOwotCi0JcmV0dXJuIGVuY29kZV9vdXRwdXRfc2l6ZTsKLX0KLQotc3RydWN0IG1zbV9nZW1pbmlfaHdfY21kIGh3X2NtZF9pcnFfY2xlYXJbXSA9IHsKLQkvKiB0eXBlLCByZXBlYXQgbiB0aW1lcywgb2Zmc2V0LCBtYXNrLCBkYXRhIG9yIHBkYXRhICovCi0Je01TTV9HRU1JTklfSFdfQ01EX1RZUEVfV1JJVEUsIDEsIEhXSU9fSlBFR19JUlFfQ0xFQVJfQUREUiwKLQkJSFdJT19KUEVHX0lSUV9DTEVBUl9STVNLLCB7SlBFR19JUlFfQ0xFQVJfQUxMfSB9LAotfTsKLQotdm9pZCBtc21fZ2VtaW5pX2h3X2lycV9jbGVhcih1aW50MzJfdCBtYXNrLCB1aW50MzJfdCBkYXRhKQotewotCUdNTl9EQkcoIiVzOiVkXSBtYXNrICUweCBkYXRhICUweCIsIF9fZnVuY19fLCBfX0xJTkVfXywgbWFzaywgZGF0YSk7Ci0JaHdfY21kX2lycV9jbGVhclswXS5tYXNrID0gbWFzazsKLQlod19jbWRfaXJxX2NsZWFyWzBdLmRhdGEgPSBkYXRhOwotCW1zbV9nZW1pbmlfaHdfd3JpdGUoJmh3X2NtZF9pcnFfY2xlYXJbMF0pOwotfQotCi1zdHJ1Y3QgbXNtX2dlbWluaV9od19jbWQgaHdfY21kX2ZlX3BpbmdfdXBkYXRlW10gPSB7Ci0JLyogdHlwZSwgcmVwZWF0IG4gdGltZXMsIG9mZnNldCwgbWFzaywgZGF0YSBvciBwZGF0YSAqLwotCXtNU01fR0VNSU5JX0hXX0NNRF9UWVBFX1dSSVRFLCAxLCBIV0lPX0pQRUdfRkVfQlVGRkVSX0NGR19BRERSLAotCQlIV0lPX0pQRUdfRkVfQlVGRkVSX0NGR19STVNLLCB7MH0gfSwKLQl7TVNNX0dFTUlOSV9IV19DTURfVFlQRV9XUklURSwgMSwgSFdJT19KUEVHX0ZFX1lfUElOR19BRERSX0FERFIsCi0JCUhXSU9fSlBFR19GRV9ZX1BJTkdfQUREUl9STVNLLCB7MH0gfSwKLQl7TVNNX0dFTUlOSV9IV19DTURfVFlQRV9XUklURSwgMSwgSFdJT19KUEVHX0ZFX0NCQ1JfUElOR19BRERSX0FERFIsCi0JCUhXSU9fSlBFR19GRV9DQkNSX1BJTkdfQUREUl9STVNLLCB7MH0gfSwKLQl7TVNNX0dFTUlOSV9IV19DTURfVFlQRV9XUklURSwgMSwgSFdJT19KUEVHX0ZFX0NNRF9BRERSLAotCQlIV0lPX0pQRUdfRkVfQ01EX1JNU0ssIHtKUEVHX0ZFX0NNRF9CVUZGRVJSRUxPQUR9IH0sCi19OwotCi1zdHJ1Y3QgbXNtX2dlbWluaV9od19jbWQgaHdfY21kX2ZlX3BvbmdfdXBkYXRlW10gPSB7Ci0JLyogdHlwZSwgcmVwZWF0IG4gdGltZXMsIG9mZnNldCwgbWFzaywgZGF0YSBvciBwZGF0YSAqLwotCXtNU01fR0VNSU5JX0hXX0NNRF9UWVBFX1dSSVRFLCAxLCBIV0lPX0pQRUdfRkVfQlVGRkVSX0NGR19BRERSLAotCQlIV0lPX0pQRUdfRkVfQlVGRkVSX0NGR19STVNLLCB7MH0gfSwKLQl7TVNNX0dFTUlOSV9IV19DTURfVFlQRV9XUklURSwgMSwgSFdJT19KUEVHX0ZFX1lfUE9OR19BRERSX0FERFIsCi0JCUhXSU9fSlBFR19GRV9ZX1BPTkdfQUREUl9STVNLLCB7MH0gfSwKLQl7TVNNX0dFTUlOSV9IV19DTURfVFlQRV9XUklURSwgMSwgSFdJT19KUEVHX0ZFX0NCQ1JfUE9OR19BRERSX0FERFIsCi0JCUhXSU9fSlBFR19GRV9DQkNSX1BPTkdfQUREUl9STVNLLCB7MH0gfSwKLQl7TVNNX0dFTUlOSV9IV19DTURfVFlQRV9XUklURSwgMSwgSFdJT19KUEVHX0ZFX0NNRF9BRERSLAotCQlIV0lPX0pQRUdfRkVfQ01EX1JNU0ssIHtKUEVHX0ZFX0NNRF9CVUZGRVJSRUxPQUR9IH0sCi19OwotCi12b2lkIG1zbV9nZW1pbmlfaHdfZmVfYnVmZmVyX3VwZGF0ZShzdHJ1Y3QgbXNtX2dlbWluaV9od19idWYgKnBfaW5wdXQsCi0JdWludDhfdCBwaW5ncG9uZ19pbmRleCkKLXsKLQl1aW50MzJfdCBuX3JlZ192YWwgPSAwOwotCi0Jc3RydWN0IG1zbV9nZW1pbmlfaHdfY21kICpod19jbWRfcDsKLQotCWlmIChwaW5ncG9uZ19pbmRleCA9PSAwKSB7Ci0JCWh3X2NtZF9wID0gJmh3X2NtZF9mZV9waW5nX3VwZGF0ZVswXTsKLQkJbl9yZWdfdmFsID0gKCgoKHBfaW5wdXQtPm51bV9vZl9tY3Vfcm93cyAtIDEpIDw8Ci0JCQlIV0lPX0pQRUdfRkVfQlVGRkVSX0NGR19DQkNSX01DVV9ST1dTX1NIRlQpICYKLQkJCUhXSU9fSlBFR19GRV9CVUZGRVJfQ0ZHX0NCQ1JfTUNVX1JPV1NfQk1TSykgfAotCQkJKCgocF9pbnB1dC0+bnVtX29mX21jdV9yb3dzIC0gMSkgPDwKLQkJCUhXSU9fSlBFR19GRV9CVUZGRVJfQ0ZHX1lfTUNVX1JPV1NfU0hGVCkgJgotCQkJSFdJT19KUEVHX0ZFX0JVRkZFUl9DRkdfWV9NQ1VfUk9XU19CTVNLKSk7Ci0JCWh3X2NtZF9wLT5kYXRhID0gbl9yZWdfdmFsOwotCQltc21fZ2VtaW5pX2h3X3dyaXRlKGh3X2NtZF9wKyspOwotCi0JCW5fcmVnX3ZhbCA9ICgocF9pbnB1dC0+eV9idWZmZXJfYWRkciA8PAotCQkJSFdJT19KUEVHX0ZFX1lfUElOR19BRERSX0ZFX1lfUElOR19TVEFSVF9BRERSX1NIRlQpICYKLQkJCUhXSU9fSlBFR19GRV9ZX1BJTkdfQUREUl9GRV9ZX1BJTkdfU1RBUlRfQUREUl9CTVNLKTsKLQkJaHdfY21kX3AtPmRhdGEgPSBuX3JlZ192YWw7Ci0JCW1zbV9nZW1pbmlfaHdfd3JpdGUoaHdfY21kX3ArKyk7Ci0KLQkJbl9yZWdfdmFsID0gKChwX2lucHV0LT5jYmNyX2J1ZmZlcl9hZGRyPDwKLQkJSFdJT19KUEVHX0ZFX0NCQ1JfUElOR19BRERSX0ZFX0NCQ1JfUElOR19TVEFSVF9BRERSX1NIRlQpICYKLQkJSFdJT19KUEVHX0ZFX0NCQ1JfUElOR19BRERSX0ZFX0NCQ1JfUElOR19TVEFSVF9BRERSX0JNU0spOwotCQlod19jbWRfcC0+ZGF0YSA9IG5fcmVnX3ZhbDsKLQkJbXNtX2dlbWluaV9od193cml0ZShod19jbWRfcCsrKTsKLQotCQltc21fZ2VtaW5pX2h3X3dyaXRlKGh3X2NtZF9wKTsKLQl9IGVsc2UgaWYgKHBpbmdwb25nX2luZGV4ID09IDEpIHsKLQkJaHdfY21kX3AgPSAmaHdfY21kX2ZlX3BvbmdfdXBkYXRlWzBdOwotCQluX3JlZ192YWwgPSAoKCgocF9pbnB1dC0+bnVtX29mX21jdV9yb3dzIC0gMSkgPDwKLQkJCUhXSU9fSlBFR19GRV9CVUZGRVJfQ0ZHX0NCQ1JfTUNVX1JPV1NfU0hGVCkgJgotCQkJSFdJT19KUEVHX0ZFX0JVRkZFUl9DRkdfQ0JDUl9NQ1VfUk9XU19CTVNLKSB8Ci0JCQkoKChwX2lucHV0LT5udW1fb2ZfbWN1X3Jvd3MgLSAxKSA8PAotCQkJSFdJT19KUEVHX0ZFX0JVRkZFUl9DRkdfWV9NQ1VfUk9XU19TSEZUKSAmCi0JCQlIV0lPX0pQRUdfRkVfQlVGRkVSX0NGR19ZX01DVV9ST1dTX0JNU0spKTsKLQkJaHdfY21kX3AtPmRhdGEgPSBuX3JlZ192YWw7Ci0JCW1zbV9nZW1pbmlfaHdfd3JpdGUoaHdfY21kX3ArKyk7Ci0KLQkJbl9yZWdfdmFsID0gKChwX2lucHV0LT55X2J1ZmZlcl9hZGRyIDw8Ci0JCQlIV0lPX0pQRUdfRkVfWV9QT05HX0FERFJfRkVfWV9QT05HX1NUQVJUX0FERFJfU0hGVCkgJgotCQkJSFdJT19KUEVHX0ZFX1lfUE9OR19BRERSX0ZFX1lfUE9OR19TVEFSVF9BRERSX0JNU0spOwotCQlod19jbWRfcC0+ZGF0YSA9IG5fcmVnX3ZhbDsKLQkJbXNtX2dlbWluaV9od193cml0ZShod19jbWRfcCsrKTsKLQotCQluX3JlZ192YWwgPSAoKHBfaW5wdXQtPmNiY3JfYnVmZmVyX2FkZHI8PAotCQlIV0lPX0pQRUdfRkVfQ0JDUl9QT05HX0FERFJfRkVfQ0JDUl9QT05HX1NUQVJUX0FERFJfU0hGVCkgJgotCQlIV0lPX0pQRUdfRkVfQ0JDUl9QT05HX0FERFJfRkVfQ0JDUl9QT05HX1NUQVJUX0FERFJfQk1TSyk7Ci0JCWh3X2NtZF9wLT5kYXRhID0gbl9yZWdfdmFsOwotCQltc21fZ2VtaW5pX2h3X3dyaXRlKGh3X2NtZF9wKyspOwotCi0JCW1zbV9nZW1pbmlfaHdfd3JpdGUoaHdfY21kX3ApOwotCX0gZWxzZSB7Ci0JCS8qIHNoYWxsIG5vdCBnZXQgdG8gaGVyZSAqLwotCX0KLQotCXJldHVybjsKLX0KLQotc3RydWN0IG1zbV9nZW1pbmlfaHdfY21kIGh3X2NtZF9mZV9zdGFydFtdID0gewotCS8qIHR5cGUsIHJlcGVhdCBuIHRpbWVzLCBvZmZzZXQsIG1hc2ssIGRhdGEgb3IgcGRhdGEgKi8KLQl7TVNNX0dFTUlOSV9IV19DTURfVFlQRV9XUklURSwgMSwgSFdJT19KUEVHX0ZFX0NNRF9BRERSLAotCQlIV0lPX0pQRUdfRkVfQ01EX1JNU0ssIHtKUEVHX09GRkxJTkVfQ01EX1NUQVJUfSB9LAotfTsKLQotdm9pZCBtc21fZ2VtaW5pX2h3X2ZlX3N0YXJ0KHZvaWQpCi17Ci0JbXNtX2dlbWluaV9od193cml0ZSgmaHdfY21kX2ZlX3N0YXJ0WzBdKTsKLQotCXJldHVybjsKLX0KLQotc3RydWN0IG1zbV9nZW1pbmlfaHdfY21kIGh3X2NtZF93ZV9idWZmZXJfY2ZnW10gPSB7Ci0JLyogdHlwZSwgcmVwZWF0IG4gdGltZXMsIG9mZnNldCwgbWFzaywgZGF0YSBvciBwZGF0YSAqLwotCXtNU01fR0VNSU5JX0hXX0NNRF9UWVBFX1dSSVRFLCAxLCBIV0lPX0pQRUdfV0VfWV9USFJFU0hPTERfQUREUiwKLQkJSFdJT19KUEVHX1dFX1lfVEhSRVNIT0xEX1JNU0ssIHswfSB9LAotCXtNU01fR0VNSU5JX0hXX0NNRF9UWVBFX1dSSVRFLCAxLCBIV0lPX0pQRUdfV0VfWV9VQl9DRkdfQUREUiwKLQkJSFdJT19KUEVHX1dFX1lfVUJfQ0ZHX1JNU0ssIHtKUEVHX1dFX1lVQl9FTkNPREV9IH0sCi0Je01TTV9HRU1JTklfSFdfQ01EX1RZUEVfV1JJVEUsIDEsIEhXSU9fSlBFR19XRV9DQkNSX1RIUkVTSE9MRF9BRERSLAotCQlIV0lPX0pQRUdfV0VfQ0JDUl9USFJFU0hPTERfUk1TSywgezB9IH0sCi19OwotCi0vKiBmaXJzdCBkaW1lbnNpb24gaXMgV0VfQVNTRVJUX1NUQUxMX1RIIGFuZCBXRV9ERUFTU0VSVF9TVEFMTF9USAotICAgc2Vjb25kIGRpbWVuc2lvbiBpcyBmb3Igb2ZmbGluZSBhbmQgcmVhbC10aW1lIHNldHRpbmdzCi0gKi8KLXN0YXRpYyBjb25zdCB1aW50MzJfdCBHRU1JTklfV0VfWV9USFJFU0hPTERbMl1bMl0gPSB7Ci0JeyAweDAwMDAwMTkwLCAweDAwMDAwMWZmIH0sCi0JeyAweDAwMDAwMTZhLCAweDAwMDAwMWZmIH0KLX07Ci0KLS8qIGZpcnN0IGRpbWVuc2lvbiBpcyBXRV9BU1NFUlRfU1RBTExfVEggYW5kIFdFX0RFQVNTRVJUX1NUQUxMX1RICi0gICBzZWNvbmQgZGltZW5zaW9uIGlzIGZvciBvZmZsaW5lIGFuZCByZWFsLXRpbWUgc2V0dGluZ3MKLSAqLwotc3RhdGljIGNvbnN0IHVpbnQzMl90IEdFTUlOSV9XRV9DQkNSX1RIUkVTSE9MRFsyXVsyXSA9IHsKLQl7IDB4MDAwMDAxOTAsIDB4MDAwMDAxZmYgfSwKLQl7IDB4MDAwMDAxNmEsIDB4MDAwMDAxZmYgfQotfTsKLQotdm9pZCBtc21fZ2VtaW5pX2h3X3dlX2J1ZmZlcl9jZmcodWludDhfdCBpc19yZWFsdGltZSkKLXsKLQl1aW50MzJfdCAgICAgICAgICAgICAgbl9yZWdfdmFsID0gMDsKLQotCXN0cnVjdCBtc21fZ2VtaW5pX2h3X2NtZCAqaHdfY21kX3AgPSAmaHdfY21kX3dlX2J1ZmZlcl9jZmdbMF07Ci0KLQluX3JlZ192YWwgPSAoKChHRU1JTklfV0VfWV9USFJFU0hPTERbMV1baXNfcmVhbHRpbWVdIDw8Ci0JCUhXSU9fSlBFR19XRV9ZX1RIUkVTSE9MRF9XRV9ERUFTU0VSVF9TVEFMTF9USF9TSEZUKSAmCi0JCUhXSU9fSlBFR19XRV9ZX1RIUkVTSE9MRF9XRV9ERUFTU0VSVF9TVEFMTF9USF9CTVNLKSB8Ci0JCSgoR0VNSU5JX1dFX1lfVEhSRVNIT0xEWzBdW2lzX3JlYWx0aW1lXSA8PAotCQlIV0lPX0pQRUdfV0VfWV9USFJFU0hPTERfV0VfQVNTRVJUX1NUQUxMX1RIX1NIRlQpICYKLQkJSFdJT19KUEVHX1dFX1lfVEhSRVNIT0xEX1dFX0FTU0VSVF9TVEFMTF9USF9CTVNLKSk7Ci0JaHdfY21kX3AtPmRhdGEgPSBuX3JlZ192YWw7Ci0JbXNtX2dlbWluaV9od193cml0ZShod19jbWRfcCsrKTsKLQotCW1zbV9nZW1pbmlfaHdfd3JpdGUoaHdfY21kX3ArKyk7Ci0KLQkvKiBAdG9kbyBtYXliZSBub3QgZm9yIHJlYWx0aW1lPyAqLwotCW5fcmVnX3ZhbCA9ICgoKEdFTUlOSV9XRV9DQkNSX1RIUkVTSE9MRFsxXVtpc19yZWFsdGltZV0gPDwKLQkJSFdJT19KUEVHX1dFX0NCQ1JfVEhSRVNIT0xEX1dFX0RFQVNTRVJUX1NUQUxMX1RIX1NIRlQpICYKLQkJSFdJT19KUEVHX1dFX0NCQ1JfVEhSRVNIT0xEX1dFX0RFQVNTRVJUX1NUQUxMX1RIX0JNU0spIHwKLQkJKChHRU1JTklfV0VfQ0JDUl9USFJFU0hPTERbMF1baXNfcmVhbHRpbWVdIDw8Ci0JCUhXSU9fSlBFR19XRV9DQkNSX1RIUkVTSE9MRF9XRV9BU1NFUlRfU1RBTExfVEhfU0hGVCkgJgotCQlIV0lPX0pQRUdfV0VfQ0JDUl9USFJFU0hPTERfV0VfQVNTRVJUX1NUQUxMX1RIX0JNU0spKTsKLQlod19jbWRfcC0+ZGF0YSA9IG5fcmVnX3ZhbDsKLQltc21fZ2VtaW5pX2h3X3dyaXRlKGh3X2NtZF9wKTsKLQotCXJldHVybjsKLX0KLQotc3RydWN0IG1zbV9nZW1pbmlfaHdfY21kIGh3X2NtZF93ZV9waW5nX3VwZGF0ZVtdID0gewotCS8qIHR5cGUsIHJlcGVhdCBuIHRpbWVzLCBvZmZzZXQsIG1hc2ssIGRhdGEgb3IgcGRhdGEgKi8KLQl7TVNNX0dFTUlOSV9IV19DTURfVFlQRV9XUklURSwgMSwgSFdJT19KUEVHX1dFX1lfUElOR19CVUZGRVJfQ0ZHX0FERFIsCi0JCUhXSU9fSlBFR19XRV9ZX1BJTkdfQlVGRkVSX0NGR19STVNLLCB7MH0gfSwKLQl7TVNNX0dFTUlOSV9IV19DTURfVFlQRV9XUklURSwgMSwgSFdJT19KUEVHX1dFX1lfUElOR19BRERSX0FERFIsCi0JCUhXSU9fSlBFR19XRV9ZX1BJTkdfQUREUl9STVNLLCB7MH0gfSwKLX07Ci0KLXN0cnVjdCBtc21fZ2VtaW5pX2h3X2NtZCBod19jbWRfd2VfcG9uZ191cGRhdGVbXSA9IHsKLQkvKiB0eXBlLCByZXBlYXQgbiB0aW1lcywgb2Zmc2V0LCBtYXNrLCBkYXRhIG9yIHBkYXRhICovCi0Je01TTV9HRU1JTklfSFdfQ01EX1RZUEVfV1JJVEUsIDEsIEhXSU9fSlBFR19XRV9ZX1BPTkdfQlVGRkVSX0NGR19BRERSLAotCQlIV0lPX0pQRUdfV0VfWV9QT05HX0JVRkZFUl9DRkdfUk1TSywgezB9IH0sCi0Je01TTV9HRU1JTklfSFdfQ01EX1RZUEVfV1JJVEUsIDEsIEhXSU9fSlBFR19XRV9ZX1BPTkdfQUREUl9BRERSLAotCQlIV0lPX0pQRUdfV0VfWV9QT05HX0FERFJfUk1TSywgezB9IH0sCi19OwotCi12b2lkIG1zbV9nZW1pbmlfaHdfd2VfYnVmZmVyX3VwZGF0ZShzdHJ1Y3QgbXNtX2dlbWluaV9od19idWYgKnBfaW5wdXQsCi0JdWludDhfdCBwaW5ncG9uZ19pbmRleCkKLXsKLQl1aW50MzJfdCBuX3JlZ192YWwgPSAwOwotCi0Jc3RydWN0IG1zbV9nZW1pbmlfaHdfY21kICpod19jbWRfcDsKLQotCXByX2RlYnVnKCIlczolZF0gcGluZ3BvbmcgaW5kZXggJWQiLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCXBpbmdwb25nX2luZGV4KTsKLQlpZiAocGluZ3BvbmdfaW5kZXggPT0gMCkgewotCQlod19jbWRfcCA9ICZod19jbWRfd2VfcGluZ191cGRhdGVbMF07Ci0KLQkJbl9yZWdfdmFsID0gKChwX2lucHV0LT55X2xlbiA8PAotCQkJSFdJT19KUEVHX1dFX1lfUElOR19CVUZGRVJfQ0ZHX1dFX0JVRkZFUl9MRU5HVEhfU0hGVCkgJgotCQkJSFdJT19KUEVHX1dFX1lfUElOR19CVUZGRVJfQ0ZHX1dFX0JVRkZFUl9MRU5HVEhfQk1TSyk7Ci0JCWh3X2NtZF9wLT5kYXRhID0gbl9yZWdfdmFsOwotCQltc21fZ2VtaW5pX2h3X3dyaXRlKGh3X2NtZF9wKyspOwotCi0JCW5fcmVnX3ZhbCA9IHBfaW5wdXQtPnlfYnVmZmVyX2FkZHI7Ci0JCWh3X2NtZF9wLT5kYXRhID0gbl9yZWdfdmFsOwotCQltc21fZ2VtaW5pX2h3X3dyaXRlKGh3X2NtZF9wKyspOwotCX0gZWxzZSBpZiAocGluZ3BvbmdfaW5kZXggPT0gMSkgewotCQlod19jbWRfcCA9ICZod19jbWRfd2VfcG9uZ191cGRhdGVbMF07Ci0KLQkJbl9yZWdfdmFsID0gKChwX2lucHV0LT55X2xlbiA8PAotCQkJSFdJT19KUEVHX1dFX1lfUE9OR19CVUZGRVJfQ0ZHX1dFX0JVRkZFUl9MRU5HVEhfU0hGVCkgJgotCQkJSFdJT19KUEVHX1dFX1lfUE9OR19CVUZGRVJfQ0ZHX1dFX0JVRkZFUl9MRU5HVEhfQk1TSyk7Ci0JCWh3X2NtZF9wLT5kYXRhID0gbl9yZWdfdmFsOwotCQltc21fZ2VtaW5pX2h3X3dyaXRlKGh3X2NtZF9wKyspOwotCi0JCW5fcmVnX3ZhbCA9IHBfaW5wdXQtPnlfYnVmZmVyX2FkZHI7Ci0JCWh3X2NtZF9wLT5kYXRhID0gbl9yZWdfdmFsOwotCQltc21fZ2VtaW5pX2h3X3dyaXRlKGh3X2NtZF9wKyspOwotCX0gZWxzZSB7Ci0JCS8qIHNoYWxsIG5vdCBnZXQgdG8gaGVyZSAqLwotCX0KLQotCXJldHVybjsKLX0KLQotc3RydWN0IG1zbV9nZW1pbmlfaHdfY21kIGh3X2NtZF9yZXNldFtdID0gewotCS8qIHR5cGUsIHJlcGVhdCBuIHRpbWVzLCBvZmZzZXQsIG1hc2ssIGRhdGEgb3IgcGRhdGEgKi8KLQl7TVNNX0dFTUlOSV9IV19DTURfVFlQRV9XUklURSwgMSwgSFdJT19KUEVHX0lSUV9NQVNLX0FERFIsCi0JCUhXSU9fSlBFR19JUlFfTUFTS19STVNLLCB7SlBFR19JUlFfRElTQUJMRV9BTEx9IH0sCi0Je01TTV9HRU1JTklfSFdfQ01EX1RZUEVfV1JJVEUsIDEsIEhXSU9fSlBFR19JUlFfQ0xFQVJfQUREUiwKLQkJSFdJT19KUEVHX0lSUV9NQVNLX1JNU0ssIHtKUEVHX0lSUV9DTEVBUl9BTEx9IH0sCi0Je01TTV9HRU1JTklfSFdfQ01EX1RZUEVfV1JJVEUsIDEsIEhXSU9fSlBFR19JUlFfTUFTS19BRERSLAotCQlIV0lPX0pQRUdfSVJRX01BU0tfUk1TSywge0pQRUdfSVJRX0FMTFNPVVJDRVNfRU5BQkxFfSB9LAotCXtNU01fR0VNSU5JX0hXX0NNRF9UWVBFX1dSSVRFLCAxLCBIV0lPX0pQRUdfUkVTRVRfQ01EX0FERFIsCi0JCUhXSU9fSlBFR19SRVNFVF9DTURfUk1TSywge0pQRUdfUkVTRVRfREVGQVVMVH0gfSwKLX07Ci0KLXZvaWQgbXNtX2dlbWluaV9od19pbml0KHZvaWQgKmJhc2UsIGludCBzaXplKQotewotCWdlbWluaV9yZWdpb25fYmFzZSA9IGJhc2U7Ci0JZ2VtaW5pX3JlZ2lvbl9zaXplID0gc2l6ZTsKLX0KLQotdm9pZCBtc21fZ2VtaW5pX2h3X3Jlc2V0KHZvaWQgKmJhc2UsIGludCBzaXplKQotewotCXN0cnVjdCBtc21fZ2VtaW5pX2h3X2NtZCAqaHdfY21kX3A7Ci0KLQlod19jbWRfcCA9ICZod19jbWRfcmVzZXRbMF07Ci0KLQl3bWIoKTsKLQltc21fZ2VtaW5pX2h3X3dyaXRlKGh3X2NtZF9wKyspOwotCW1zbV9nZW1pbmlfaHdfd3JpdGUoaHdfY21kX3ArKyk7Ci0JbXNtX2dlbWluaV9od193cml0ZShod19jbWRfcCsrKTsKLQltc21fZ2VtaW5pX2h3X3dyaXRlKGh3X2NtZF9wKTsKLQl3bWIoKTsKLQotCXJldHVybjsKLX0KLQotdWludDMyX3QgbXNtX2dlbWluaV9od19yZWFkKHN0cnVjdCBtc21fZ2VtaW5pX2h3X2NtZCAqaHdfY21kX3ApCi17Ci0JdWludDMyX3QgKnBhZGRyOwotCXVpbnQzMl90IGRhdGE7Ci0KLQlwYWRkciA9IGdlbWluaV9yZWdpb25fYmFzZSArIGh3X2NtZF9wLT5vZmZzZXQ7Ci0KLQlkYXRhID0gcmVhZGwocGFkZHIpOwotCWRhdGEgJj0gaHdfY21kX3AtPm1hc2s7Ci0KLQlHTU5fREJHKCIlczolZF0gdHlwZS0lZCBuLSVkIG9mZnNldC0weCU0eCBtYXNrLTB4JTh4IGRhdGEtMHglOHhcbiIsCi0JCV9fZnVuY19fLCBfX0xJTkVfXywgaHdfY21kX3AtPnR5cGUsIGh3X2NtZF9wLT5uLAotCQlod19jbWRfcC0+b2Zmc2V0LCBod19jbWRfcC0+bWFzaywgZGF0YSk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLXZvaWQgbXNtX2dlbWluaV9od193cml0ZShzdHJ1Y3QgbXNtX2dlbWluaV9od19jbWQgKmh3X2NtZF9wKQotewotCXVpbnQzMl90ICpwYWRkcjsKLQl1aW50MzJfdCBvbGRfZGF0YSwgbmV3X2RhdGE7Ci0KLQkvKiB0eXBlLCByZXBlYXQgbiB0aW1lcywgb2Zmc2V0LCBtYXNrLCBkYXRhIG9yIHBkYXRhICovCi0JR01OX0RCRygiJXM6JWRdIHR5cGUtJWQgbi0lZCBvZmZzZXQtMHglNHggbWFzay0weCU4eCBkYXRhLTB4JTh4XG4iLAotCQlfX2Z1bmNfXywgX19MSU5FX18sIGh3X2NtZF9wLT50eXBlLCBod19jbWRfcC0+biwKLQkJaHdfY21kX3AtPm9mZnNldCwgaHdfY21kX3AtPm1hc2ssIGh3X2NtZF9wLT5kYXRhKTsKLQotCXBhZGRyID0gZ2VtaW5pX3JlZ2lvbl9iYXNlICsgaHdfY21kX3AtPm9mZnNldDsKLQotCWlmIChod19jbWRfcC0+bWFzayA9PSAweGZmZmZmZmZmKSB7Ci0JCW9sZF9kYXRhID0gMDsKLQl9IGVsc2UgewotCQlvbGRfZGF0YSA9IHJlYWRsKHBhZGRyKTsKLQkJb2xkX2RhdGEgJj0gfmh3X2NtZF9wLT5tYXNrOwotCX0KLQotCW5ld19kYXRhID0gaHdfY21kX3AtPmRhdGEgJiBod19jbWRfcC0+bWFzazsKLQluZXdfZGF0YSB8PSBvbGRfZGF0YTsKLQl3cml0ZWwobmV3X2RhdGEsIHBhZGRyKTsKLX0KLQotaW50IG1zbV9nZW1pbmlfaHdfd2FpdChzdHJ1Y3QgbXNtX2dlbWluaV9od19jbWQgKmh3X2NtZF9wLCBpbnQgbV91cykKLXsKLQlpbnQgdG0gPSBod19jbWRfcC0+bjsKLQl1aW50MzJfdCBkYXRhOwotCXVpbnQzMl90IHdhaXRfZGF0YSA9IGh3X2NtZF9wLT5kYXRhICYgaHdfY21kX3AtPm1hc2s7Ci0KLQlkYXRhID0gbXNtX2dlbWluaV9od19yZWFkKGh3X2NtZF9wKTsKLQlpZiAoZGF0YSAhPSB3YWl0X2RhdGEpIHsKLQkJd2hpbGUgKHRtKSB7Ci0JCQl1ZGVsYXkobV91cyk7Ci0JCQlkYXRhID0gbXNtX2dlbWluaV9od19yZWFkKGh3X2NtZF9wKTsKLQkJCWlmIChkYXRhID09IHdhaXRfZGF0YSkKLQkJCQlicmVhazsKLQkJCXRtLS07Ci0JCX0KLQl9Ci0JaHdfY21kX3AtPmRhdGEgPSBkYXRhOwotCXJldHVybiB0bTsKLX0KLQotdm9pZCBtc21fZ2VtaW5pX2h3X2RlbGF5KHN0cnVjdCBtc21fZ2VtaW5pX2h3X2NtZCAqaHdfY21kX3AsIGludCBtX3VzKQotewotCWludCB0bSA9IGh3X2NtZF9wLT5uOwotCXdoaWxlICh0bSkgewotCQl1ZGVsYXkobV91cyk7Ci0JCXRtLS07Ci0JfQotfQotCi1pbnQgbXNtX2dlbWluaV9od19leGVjX2NtZHMoc3RydWN0IG1zbV9nZW1pbmlfaHdfY21kICpod19jbWRfcCwgdWludDMyX3QgbV9jbWRzKQotewotCWludCBpc19jb3B5X3RvX3VzZXIgPSAtMTsKLQl1aW50MzJfdCBkYXRhOwotCi0Jd2hpbGUgKG1fY21kcy0tKSB7Ci0JCWlmIChod19jbWRfcC0+b2Zmc2V0ID4gZ2VtaW5pX3JlZ2lvbl9zaXplKSB7Ci0JCQlHTU5fUFJfRVJSKCIlczolZF0gJWQgZXhjZWVkIGh3IHJlZ2lvbiAlZFxuIiwgX19mdW5jX18sCi0JCQkJX19MSU5FX18sIGh3X2NtZF9wLT5vZmZzZXQsIGdlbWluaV9yZWdpb25fc2l6ZSk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCXN3aXRjaCAoaHdfY21kX3AtPnR5cGUpIHsKLQkJY2FzZSBNU01fR0VNSU5JX0hXX0NNRF9UWVBFX1JFQUQ6Ci0JCQlod19jbWRfcC0+ZGF0YSA9IG1zbV9nZW1pbmlfaHdfcmVhZChod19jbWRfcCk7Ci0JCQlpc19jb3B5X3RvX3VzZXIgPSAxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNU01fR0VNSU5JX0hXX0NNRF9UWVBFX1dSSVRFOgotCQkJbXNtX2dlbWluaV9od193cml0ZShod19jbWRfcCk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1TTV9HRU1JTklfSFdfQ01EX1RZUEVfV1JJVEVfT1I6Ci0JCQlkYXRhID0gbXNtX2dlbWluaV9od19yZWFkKGh3X2NtZF9wKTsKLQkJCWh3X2NtZF9wLT5kYXRhID0gKGh3X2NtZF9wLT5kYXRhICYgaHdfY21kX3AtPm1hc2spIHwKLQkJCQlkYXRhOwotCQkJbXNtX2dlbWluaV9od193cml0ZShod19jbWRfcCk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1TTV9HRU1JTklfSFdfQ01EX1RZUEVfVVdBSVQ6Ci0JCQltc21fZ2VtaW5pX2h3X3dhaXQoaHdfY21kX3AsIDEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNU01fR0VNSU5JX0hXX0NNRF9UWVBFX01XQUlUOgotCQkJbXNtX2dlbWluaV9od193YWl0KGh3X2NtZF9wLCAxMDAwKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTVNNX0dFTUlOSV9IV19DTURfVFlQRV9VREVMQVk6Ci0JCQltc21fZ2VtaW5pX2h3X2RlbGF5KGh3X2NtZF9wLCAxKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTVNNX0dFTUlOSV9IV19DTURfVFlQRV9NREVMQVk6Ci0JCQltc21fZ2VtaW5pX2h3X2RlbGF5KGh3X2NtZF9wLCAxMDAwKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlHTU5fUFJfRVJSKCJ3cm9uZyBodyBjb21tYW5kIHR5cGVcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlod19jbWRfcCsrOwotCX0KLQlyZXR1cm4gaXNfY29weV90b191c2VyOwotfQotCi0jaWZkZWYgTVNNX0dNTl9EQkdfRFVNUAotdm9pZCBtc21fZ2VtaW5pX2lvX2R1bXAoaW50IHNpemUpCi17Ci0JY2hhciBsaW5lX3N0clsxMjhdLCAqcF9zdHI7Ci0Jdm9pZCBfX2lvbWVtICphZGRyID0gZ2VtaW5pX3JlZ2lvbl9iYXNlOwotCWludCBpOwotCXUzMiAqcCA9ICh1MzIgKikgYWRkcjsKLQl1MzIgZGF0YTsKLQlwcl9pbmZvKCIlczogJXAgJWQgcmVnX3NpemUgJWRcbiIsIF9fZnVuY19fLCBhZGRyLCBzaXplLAotCQkJCQkJCWdlbWluaV9yZWdpb25fc2l6ZSk7Ci0JbGluZV9zdHJbMF0gPSAnXDAnOwotCXBfc3RyID0gbGluZV9zdHI7Ci0JZm9yIChpID0gMDsgaSA8IHNpemUvNDsgaSsrKSB7Ci0JCWlmIChpICUgNCA9PSAwKSB7Ci0JCQlzbnByaW50ZihwX3N0ciwgMTIsICIlMDh4OiAiLCAodTMyKSBwKTsKLQkJCXBfc3RyICs9IDEwOwotCQl9Ci0JCWRhdGEgPSByZWFkbF9yZWxheGVkKHArKyk7Ci0JCXNucHJpbnRmKHBfc3RyLCAxMiwgIiUwOHggIiwgZGF0YSk7Ci0JCXBfc3RyICs9IDk7Ci0JCWlmICgoaSArIDEpICUgNCA9PSAwKSB7Ci0JCQlwcl9pbmZvKCIlc1xuIiwgbGluZV9zdHIpOwotCQkJbGluZV9zdHJbMF0gPSAnXDAnOwotCQkJcF9zdHIgPSBsaW5lX3N0cjsKLQkJfQotCX0KLQlpZiAobGluZV9zdHJbMF0gIT0gJ1wwJykKLQkJcHJfaW5mbygiJXNcbiIsIGxpbmVfc3RyKTsKLX0KLSNlbHNlCi12b2lkIG1zbV9nZW1pbmlfaW9fZHVtcChpbnQgc2l6ZSkKLXsKLQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfaHcuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9nZW1pbmkvbXNtX2dlbWluaV9ody5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDA4MjgyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9nZW1pbmkvbXNtX2dlbWluaV9ody5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMC0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgTVNNX0dFTUlOSV9IV19ICi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSAotCi0jaW5jbHVkZSA8bWVkaWEvbXNtX2dlbWluaS5oPgotI2luY2x1ZGUgIm1zbV9nZW1pbmlfaHdfcmVnLmgiCi0jaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgotI2luY2x1ZGUgPG1hY2gvaW9tbXVfZG9tYWlucy5oPgotCi1zdHJ1Y3QgbXNtX2dlbWluaV9od19idWYgewotCXN0cnVjdCBtc21fZ2VtaW5pX2J1ZiB2YnVmOwotCXN0cnVjdCBmaWxlICAqZmlsZTsKLQl1aW50MzJfdCBmcmFtZWRvbmVfbGVuOwotCXVpbnQzMl90IHlfYnVmZmVyX2FkZHI7Ci0JdWludDMyX3QgeV9sZW47Ci0JdWludDMyX3QgY2Jjcl9idWZmZXJfYWRkcjsKLQl1aW50MzJfdCBjYmNyX2xlbjsKLQl1aW50MzJfdCBudW1fb2ZfbWN1X3Jvd3M7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZTsKLX07Ci0KLXN0cnVjdCBtc21fZ2VtaW5pX2h3X3Bpbmdwb25nIHsKLQl1aW50OF90IGlzX2ZlOyAvKiAxOiBmZTsgMDogd2UgKi8KLQlzdHJ1Y3QgIG1zbV9nZW1pbmlfaHdfYnVmIGJ1ZlsyXTsKLQlpbnQgICAgIGJ1Zl9zdGF0dXNbMl07Ci0JaW50ICAgICBidWZfYWN0aXZlX2luZGV4OwotfTsKLQotaW50IG1zbV9nZW1pbmlfaHdfcGluZ3BvbmdfdXBkYXRlKHN0cnVjdCBtc21fZ2VtaW5pX2h3X3Bpbmdwb25nICpwaW5ncG9uZ19odywKLQlzdHJ1Y3QgbXNtX2dlbWluaV9od19idWYgKmJ1Zik7Ci12b2lkICptc21fZ2VtaW5pX2h3X3Bpbmdwb25nX2lycShzdHJ1Y3QgbXNtX2dlbWluaV9od19waW5ncG9uZyAqcGluZ3BvbmdfaHcpOwotdm9pZCAqbXNtX2dlbWluaV9od19waW5ncG9uZ19hY3RpdmVfYnVmZmVyKHN0cnVjdCBtc21fZ2VtaW5pX2h3X3Bpbmdwb25nCi0JKnBpbmdwb25nX2h3KTsKLQotdm9pZCBtc21fZ2VtaW5pX2h3X2lycV9jbGVhcih1aW50MzJfdCwgdWludDMyX3QpOwotaW50IG1zbV9nZW1pbmlfaHdfaXJxX2dldF9zdGF0dXModm9pZCk7Ci1sb25nIG1zbV9nZW1pbmlfaHdfZW5jb2RlX291dHB1dF9zaXplKHZvaWQpOwotI2RlZmluZSBNU01fR0VNSU5JX0hXX01BU0tfQ09NUF9GUkFNRURPTkUgXAotCQlNU01fR0VNSU5JX0hXX0lSUV9TVEFUVVNfRlJBTUVET05FX01BU0sKLSNkZWZpbmUgTVNNX0dFTUlOSV9IV19NQVNLX0NPTVBfRkUgXAotCQlNU01fR0VNSU5JX0hXX0lSUV9TVEFUVVNfRkVfUkRfRE9ORV9NQVNLCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfTUFTS19DT01QX1dFIFwKLQkJKE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19XRV9ZX1BJTkdQT05HX01BU0sgfCBcCi0JCSBNU01fR0VNSU5JX0hXX0lSUV9TVEFUVVNfV0VfQ0JDUl9QSU5HUE9OR19NQVNLKQotI2RlZmluZSBNU01fR0VNSU5JX0hXX01BU0tfQ09NUF9SRVNFVF9BQ0sgXAotCQlNU01fR0VNSU5JX0hXX0lSUV9TVEFUVVNfUkVTRVRfQUNLX01BU0sKLSNkZWZpbmUgTVNNX0dFTUlOSV9IV19NQVNLX0NPTVBfRVJSIFwKLQkJKE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19GRV9SVE9WRl9NQVNLIHwgXAotCQlNU01fR0VNSU5JX0hXX0lSUV9TVEFUVVNfRkVfVkZFX09WRVJGTE9XX01BU0sgfCBcCi0JCU1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19XRV9ZX0JVRkZFUl9PVkVSRkxPV19NQVNLIHwgXAotCQlNU01fR0VNSU5JX0hXX0lSUV9TVEFUVVNfV0VfQ0JDUl9CVUZGRVJfT1ZFUkZMT1dfTUFTSyB8IFwKLQkJTVNNX0dFTUlOSV9IV19JUlFfU1RBVFVTX1dFX0NIMF9EQVRBRklGT19PVkVSRkxPV19NQVNLIHwgXAotCQlNU01fR0VNSU5JX0hXX0lSUV9TVEFUVVNfV0VfQ0gxX0RBVEFGSUZPX09WRVJGTE9XX01BU0sgfCBcCi0JCU1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19CVVNfRVJST1JfTUFTSyB8IFwKLQkJTVNNX0dFTUlOSV9IV19JUlFfU1RBVFVTX1ZJT0xBVElPTl9NQVNLKQotCi0jZGVmaW5lIG1zbV9nZW1pbmlfaHdfaXJxX2lzX2ZyYW1lX2RvbmUoZ2VtaW5pX2lycV9zdGF0dXMpIFwKLQkoZ2VtaW5pX2lycV9zdGF0dXMgJiBNU01fR0VNSU5JX0hXX01BU0tfQ09NUF9GUkFNRURPTkUpCi0jZGVmaW5lIG1zbV9nZW1pbmlfaHdfaXJxX2lzX2ZlX3Bpbmdwb25nKGdlbWluaV9pcnFfc3RhdHVzKSBcCi0JKGdlbWluaV9pcnFfc3RhdHVzICYgTVNNX0dFTUlOSV9IV19NQVNLX0NPTVBfRkUpCi0jZGVmaW5lIG1zbV9nZW1pbmlfaHdfaXJxX2lzX3dlX3Bpbmdwb25nKGdlbWluaV9pcnFfc3RhdHVzKSBcCi0JKGdlbWluaV9pcnFfc3RhdHVzICYgTVNNX0dFTUlOSV9IV19NQVNLX0NPTVBfV0UpCi0jZGVmaW5lIG1zbV9nZW1pbmlfaHdfaXJxX2lzX3Jlc2V0X2FjayhnZW1pbmlfaXJxX3N0YXR1cykgXAotCShnZW1pbmlfaXJxX3N0YXR1cyAmIE1TTV9HRU1JTklfSFdfTUFTS19DT01QX1JFU0VUX0FDSykKLSNkZWZpbmUgbXNtX2dlbWluaV9od19pcnFfaXNfZXJyKGdlbWluaV9pcnFfc3RhdHVzKSBcCi0JKGdlbWluaV9pcnFfc3RhdHVzICYgTVNNX0dFTUlOSV9IV19NQVNLX0NPTVBfRVJSKQotCi12b2lkIG1zbV9nZW1pbmlfaHdfZmVfYnVmZmVyX3VwZGF0ZShzdHJ1Y3QgbXNtX2dlbWluaV9od19idWYgKnBfaW5wdXQsCi0JdWludDhfdCBwaW5ncG9uZ19pbmRleCk7Ci12b2lkIG1zbV9nZW1pbmlfaHdfd2VfYnVmZmVyX3VwZGF0ZShzdHJ1Y3QgbXNtX2dlbWluaV9od19idWYgKnBfaW5wdXQsCi0JdWludDhfdCBwaW5ncG9uZ19pbmRleCk7Ci0KLXZvaWQgbXNtX2dlbWluaV9od193ZV9idWZmZXJfY2ZnKHVpbnQ4X3QgaXNfcmVhbHRpbWUpOwotCi12b2lkIG1zbV9nZW1pbmlfaHdfZmVfc3RhcnQodm9pZCk7Ci12b2lkIG1zbV9nZW1pbmlfaHdfY2xrX2NmZyh2b2lkKTsKLQotdm9pZCBtc21fZ2VtaW5pX2h3X3Jlc2V0KHZvaWQgKmJhc2UsIGludCBzaXplKTsKLXZvaWQgbXNtX2dlbWluaV9od19pcnFfY2ZnKHZvaWQpOwotdm9pZCBtc21fZ2VtaW5pX2h3X2luaXQodm9pZCAqYmFzZSwgaW50IHNpemUpOwotCi11aW50MzJfdCBtc21fZ2VtaW5pX2h3X3JlYWQoc3RydWN0IG1zbV9nZW1pbmlfaHdfY21kICpod19jbWRfcCk7Ci12b2lkIG1zbV9nZW1pbmlfaHdfd3JpdGUoc3RydWN0IG1zbV9nZW1pbmlfaHdfY21kICpod19jbWRfcCk7Ci1pbnQgbXNtX2dlbWluaV9od193YWl0KHN0cnVjdCBtc21fZ2VtaW5pX2h3X2NtZCAqaHdfY21kX3AsIGludCBtX3VzKTsKLXZvaWQgbXNtX2dlbWluaV9od19kZWxheShzdHJ1Y3QgbXNtX2dlbWluaV9od19jbWQgKmh3X2NtZF9wLCBpbnQgbV91cyk7Ci1pbnQgbXNtX2dlbWluaV9od19leGVjX2NtZHMoc3RydWN0IG1zbV9nZW1pbmlfaHdfY21kICpod19jbWRfcCwKLQl1aW50MzJfdCBtX2NtZHMpOwotdm9pZCBtc21fZ2VtaW5pX2lvX2R1bXAoaW50IHNpemUpOwotCi0jZGVmaW5lIE1TTV9HRU1JTklfUElQRUxJTkVfQ0xLXzEyOE1IWiAxMjggLyogOE1QICAxMjhNSHogKi8KLSNkZWZpbmUgTVNNX0dFTUlOSV9QSVBFTElORV9DTEtfMTQwTUhaIDE0MCAvKiA5TVAgIDE0ME1IeiAqLwotI2RlZmluZSBNU01fR0VNSU5JX1BJUEVMSU5FX0NMS18yMDBNSFogMTUzIC8qIDEyTVAgMTUzTUh6ICovCi0KLSNlbmRpZiAvKiBNU01fR0VNSU5JX0hXX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9nZW1pbmkvbXNtX2dlbWluaV9od19yZWcuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9nZW1pbmkvbXNtX2dlbWluaV9od19yZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlNjAzOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfaHdfcmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgTVNNX0dFTUlOSV9IV19SRUdfSAotI2RlZmluZSBNU01fR0VNSU5JX0hXX1JFR19ICi0KLSNkZWZpbmUgR0VNSU5JX1JFR19CQVNFIDAKLQotI2RlZmluZSBNU01fR0VNSU5JX0hXX0lSUV9NQVNLX0FERFIgMHgwMDAwMDAxNAotI2RlZmluZSBNU01fR0VNSU5JX0hXX0lSUV9NQVNLX1JNU0sgMHhmZmZmZmZmZgotI2RlZmluZSBNU01fR0VNSU5JX0hXX0lSUV9NQVNLX1NIRlQgMAotI2RlZmluZSBNU01fR0VNSU5JX0hXX0lSUV9ESVNBQkxFIDAKLSNkZWZpbmUgTVNNX0dFTUlOSV9IV19JUlFfRU5BQkxFIDB4ZmZmZmZmZmYKLQotI2RlZmluZSBNU01fR0VNSU5JX0hXX0lSUV9DTEVBUl9BRERSIDB4MDAwMDAwMTgKLSNkZWZpbmUgTVNNX0dFTUlOSV9IV19JUlFfQ0xFQVJfUk1TSyAweGZmZmZmZmZmCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX0NMRUFSX1NIRlQgMAotI2RlZmluZSBNU01fR0VNSU5JX0hXX0lSUV9DTEVBUiAgMHhmZmZmZmZmZgotCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19GUkFNRURPTkVfTUFTSyAweDAwMDAwMDAxCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19GUkFNRURPTkVfU0hJRlQgMHgwMDAwMDAwMAotCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19GRV9SRF9ET05FX01BU0sgMHgwMDAwMDAwMgotI2RlZmluZSBNU01fR0VNSU5JX0hXX0lSUV9TVEFUVVNfRkVfUkRfRE9ORV9TSElGVCAweDAwMDAwMDAxCi0KLSNkZWZpbmUgTVNNX0dFTUlOSV9IV19JUlFfU1RBVFVTX0ZFX1JUT1ZGX01BU0sgMHgwMDAwMDAwNAotI2RlZmluZSBNU01fR0VNSU5JX0hXX0lSUV9TVEFUVVNfRkVfUlRPVkZfU0hJRlQgMHgwMDAwMDAwMgotCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19GRV9WRkVfT1ZFUkZMT1dfTUFTSyAweDAwMDAwMDA4Ci0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19GRV9WRkVfT1ZFUkZMT1dfU0hJRlQgMHgwMDAwMDAwMwotCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19XRV9ZX1BJTkdQT05HX01BU0sgMHgwMDAwMDAxMAotI2RlZmluZSBNU01fR0VNSU5JX0hXX0lSUV9TVEFUVVNfV0VfWV9QSU5HUE9OR19TSElGVCAweDAwMDAwMDA0Ci0KLSNkZWZpbmUgTVNNX0dFTUlOSV9IV19JUlFfU1RBVFVTX1dFX0NCQ1JfUElOR1BPTkdfTUFTSyAweDAwMDAwMDIwCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19XRV9DQkNSX1BJTkdQT05HX1NISUZUIDB4MDAwMDAwMDUKLQotI2RlZmluZSBNU01fR0VNSU5JX0hXX0lSUV9TVEFUVVNfV0VfWV9CVUZGRVJfT1ZFUkZMT1dfTUFTSyAweDAwMDAwMDQwCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19XRV9ZX0JVRkZFUl9PVkVSRkxPV19TSElGVCAweDAwMDAwMDA2Ci0KLSNkZWZpbmUgTVNNX0dFTUlOSV9IV19JUlFfU1RBVFVTX1dFX0NCQ1JfQlVGRkVSX09WRVJGTE9XX01BU0sgMHgwMDAwMDA4MAotI2RlZmluZSBNU01fR0VNSU5JX0hXX0lSUV9TVEFUVVNfV0VfQ0JDUl9CVUZGRVJfT1ZFUkZMT1dfU0hJRlQgMHgwMDAwMDAwNwotCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19XRV9DSDBfREFUQUZJRk9fT1ZFUkZMT1dfTUFTSyAweDAwMDAwMTAwCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19XRV9DSDBfREFUQUZJRk9fT1ZFUkZMT1dfU0hJRlQgMHgwMDAwMDAwOAotCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19XRV9DSDFfREFUQUZJRk9fT1ZFUkZMT1dfTUFTSyAweDAwMDAwMjAwCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19XRV9DSDFfREFUQUZJRk9fT1ZFUkZMT1dfU0hJRlQgMHgwMDAwMDAwOQotCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19SRVNFVF9BQ0tfTUFTSyAweDAwMDAwNDAwCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19SRVNFVF9BQ0tfU0hJRlQgMHgwMDAwMDAwYQotCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19CVVNfRVJST1JfTUFTSyAweDAwMDAwODAwCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19CVVNfRVJST1JfU0hJRlQgMHgwMDAwMDAwYgotCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19WSU9MQVRJT05fTUFTSyAweDAwMDAxMDAwCi0jZGVmaW5lIE1TTV9HRU1JTklfSFdfSVJRX1NUQVRVU19WSU9MQVRJT05fU0hJRlQgMHgwMDAwMDAwYwotCi0jZGVmaW5lIEpQRUdfQlVTX0NNRF9IQUxUX1JFUSAweDAwMDAwMDAxCi0KLSNkZWZpbmUgSlBFR19SRUFMVElNRV9DTURfU1RPUF9GQiAweDAwMDAwMDAwCi0jZGVmaW5lIEpQRUdfUkVBTFRJTUVfQ01EX1NUT1BfSU0gMHgwMDAwMDAwMwotI2RlZmluZSBKUEVHX1JFQUxUSU1FX0NNRF9TVEFSVCAweDAwMDAwMDAxCi0KLSNkZWZpbmUgSlBFR19PRkZMSU5FX0NNRF9TVEFSVCAweDAwMDAwMDAzCi0KLSNkZWZpbmUgSlBFR19ETUlfQ0ZHX0RJU0FCTEUgMHgwMDAwMDAwMAotI2RlZmluZSBKUEVHX0RNSV9BRERSX1NUQVJUIDB4MDAwMDAwMDAKLQotI2RlZmluZSBKUEVHX0ZFX0NNRF9CVUZGRVJSRUxPQUQgMHgwMDAwMDAwMQotCi0jZGVmaW5lIEpQRUdfV0VfWVVCX0VOQ09ERSAweDAxZmYwMDAwCi0KLSNkZWZpbmUgSlBFR19SRVNFVF9ERUZBVUxUIDB4MDAwNGZmZmYgLyogY2ZmZj8gKi8KLQotI2RlZmluZSBKUEVHX0lSUV9ESVNBQkxFX0FMTCAweDAwMDAwMDAwCi0jZGVmaW5lIEpQRUdfSVJRX0NMRUFSX0FMTCAweGZmZmZmZmZmCi0jZGVmaW5lIEpQRUdfSVJRX0FMTFNPVVJDRVNfRU5BQkxFIDB4ZmZmZmZmZmYKLQotI2RlZmluZSBIV0lPX0pQRUdfRkVfQlVGRkVSX0NGR19BRERSIChHRU1JTklfUkVHX0JBU0UgKyAweDAwMDAwMDgwKQotI2RlZmluZSBIV0lPX0pQRUdfRkVfQlVGRkVSX0NGR19STVNLIDB4MWZmZjFmZmYKLQotI2RlZmluZSBIV0lPX0pQRUdfRkVfWV9QSU5HX0FERFJfQUREUiAoR0VNSU5JX1JFR19CQVNFICsgMHgwMDAwMDA4NCkKLSNkZWZpbmUgSFdJT19KUEVHX0ZFX1lfUElOR19BRERSX1JNU0sgMHhmZmZmZmZmZgotCi0jZGVmaW5lIEhXSU9fSlBFR19GRV9ZX1BPTkdfQUREUl9BRERSIChHRU1JTklfUkVHX0JBU0UgKyAweDAwMDAwMDg4KQotI2RlZmluZSBIV0lPX0pQRUdfRkVfWV9QT05HX0FERFJfUk1TSyAweGZmZmZmZmZmCi0KLSNkZWZpbmUgSFdJT19KUEVHX0ZFX0NCQ1JfUElOR19BRERSX0FERFIgKEdFTUlOSV9SRUdfQkFTRSArIDB4MDAwMDAwOGMpCi0jZGVmaW5lIEhXSU9fSlBFR19GRV9DQkNSX1BJTkdfQUREUl9STVNLIDB4ZmZmZmZmZmYKLQotI2RlZmluZSBIV0lPX0pQRUdfRkVfQ0JDUl9QT05HX0FERFJfQUREUiAoR0VNSU5JX1JFR19CQVNFICsgMHgwMDAwMDA5MCkKLSNkZWZpbmUgSFdJT19KUEVHX0ZFX0NCQ1JfUE9OR19BRERSX1JNU0sgMHhmZmZmZmZmZgotCi0jZGVmaW5lIEhXSU9fSlBFR19GRV9DTURfQUREUiAoR0VNSU5JX1JFR19CQVNFICsgMHgwMDAwMDA5NCkKLSNkZWZpbmUgSFdJT19KUEVHX0ZFX0NNRF9STVNLIDB4MwotCi0jZGVmaW5lIEhXSU9fSlBFR19GRV9CVUZGRVJfQ0ZHX0NCQ1JfTUNVX1JPV1NfQk1TSyAweDFmZmYwMDAwCi0jZGVmaW5lIEhXSU9fSlBFR19GRV9CVUZGRVJfQ0ZHX0NCQ1JfTUNVX1JPV1NfU0hGVCAweDEwCi0jZGVmaW5lIEhXSU9fSlBFR19GRV9CVUZGRVJfQ0ZHX1lfTUNVX1JPV1NfQk1TSyAweDFmZmYKLSNkZWZpbmUgSFdJT19KUEVHX0ZFX0JVRkZFUl9DRkdfWV9NQ1VfUk9XU19TSEZUIDAKLQotI2RlZmluZSBIV0lPX0pQRUdfRkVfWV9QSU5HX0FERFJfRkVfWV9QSU5HX1NUQVJUX0FERFJfQk1TSyAweGZmZmZmZmZmCi0jZGVmaW5lIEhXSU9fSlBFR19GRV9ZX1BJTkdfQUREUl9GRV9ZX1BJTkdfU1RBUlRfQUREUl9TSEZUIDAKLQotI2RlZmluZSBIV0lPX0pQRUdfRkVfQ0JDUl9QSU5HX0FERFJfRkVfQ0JDUl9QSU5HX1NUQVJUX0FERFJfQk1TSyAweGZmZmZmZmZmCi0jZGVmaW5lIEhXSU9fSlBFR19GRV9DQkNSX1BJTkdfQUREUl9GRV9DQkNSX1BJTkdfU1RBUlRfQUREUl9TSEZUIDAKLQotI2RlZmluZSBIV0lPX0pQRUdfRkVfWV9QT05HX0FERFJfRkVfWV9QT05HX1NUQVJUX0FERFJfQk1TSyAweGZmZmZmZmZmCi0jZGVmaW5lIEhXSU9fSlBFR19GRV9ZX1BPTkdfQUREUl9GRV9ZX1BPTkdfU1RBUlRfQUREUl9TSEZUIDAKLQotI2RlZmluZSBIV0lPX0pQRUdfRkVfQ0JDUl9QT05HX0FERFJfRkVfQ0JDUl9QT05HX1NUQVJUX0FERFJfQk1TSyAweGZmZmZmZmZmCi0jZGVmaW5lIEhXSU9fSlBFR19GRV9DQkNSX1BPTkdfQUREUl9GRV9DQkNSX1BPTkdfU1RBUlRfQUREUl9TSEZUIDAKLQotI2RlZmluZSBIV0lPX0pQRUdfV0VfWV9USFJFU0hPTERfQUREUiAoR0VNSU5JX1JFR19CQVNFICsgMHgwMDAwMDBjMCkKLSNkZWZpbmUgSFdJT19KUEVHX1dFX1lfVEhSRVNIT0xEX1JNU0sgMHgxZmYwMWZmCi0KLSNkZWZpbmUgSFdJT19KUEVHX1dFX0NCQ1JfVEhSRVNIT0xEX0FERFIgKEdFTUlOSV9SRUdfQkFTRSAgICAgICsgMHgwMDAwMDBjNCkKLSNkZWZpbmUgSFdJT19KUEVHX1dFX0NCQ1JfVEhSRVNIT0xEX1JNU0sgMHgxZmYwMWZmCi0KLSNkZWZpbmUgSFdJT19KUEVHX1dFX1lfVUJfQ0ZHX0FERFIgKEdFTUlOSV9SRUdfQkFTRSArIDB4MDAwMDAwZTgpCi0jZGVmaW5lIEhXSU9fSlBFR19XRV9ZX1VCX0NGR19STVNLIDB4MWZmMDFmZgotCi0jZGVmaW5lIEhXSU9fSlBFR19XRV9ZX1RIUkVTSE9MRF9XRV9ERUFTU0VSVF9TVEFMTF9USF9CTVNLIDB4MWZmMDAwMAotI2RlZmluZSBIV0lPX0pQRUdfV0VfWV9USFJFU0hPTERfV0VfREVBU1NFUlRfU1RBTExfVEhfU0hGVCAweDEwCi0jZGVmaW5lIEhXSU9fSlBFR19XRV9ZX1RIUkVTSE9MRF9XRV9BU1NFUlRfU1RBTExfVEhfQk1TSyAweDFmZgotI2RlZmluZSBIV0lPX0pQRUdfV0VfWV9USFJFU0hPTERfV0VfQVNTRVJUX1NUQUxMX1RIX1NIRlQgMAotCi0jZGVmaW5lIEhXSU9fSlBFR19XRV9DQkNSX1RIUkVTSE9MRF9XRV9ERUFTU0VSVF9TVEFMTF9USF9CTVNLIDB4MWZmMDAwMAotI2RlZmluZSBIV0lPX0pQRUdfV0VfQ0JDUl9USFJFU0hPTERfV0VfREVBU1NFUlRfU1RBTExfVEhfU0hGVCAweDEwCi0jZGVmaW5lIEhXSU9fSlBFR19XRV9DQkNSX1RIUkVTSE9MRF9XRV9BU1NFUlRfU1RBTExfVEhfQk1TSyAweDFmZgotI2RlZmluZSBIV0lPX0pQRUdfV0VfQ0JDUl9USFJFU0hPTERfV0VfQVNTRVJUX1NUQUxMX1RIX1NIRlQgMAotCi0jZGVmaW5lIEhXSU9fSlBFR19XRV9ZX1BJTkdfQlVGRkVSX0NGR19BRERSIChHRU1JTklfUkVHX0JBU0UgKyAweDAwMDAwMGM4KQotI2RlZmluZSBIV0lPX0pQRUdfV0VfWV9QSU5HX0JVRkZFUl9DRkdfUk1TSyAweDdmZmZmZgotCi0jZGVmaW5lIEhXSU9fSlBFR19XRV9ZX1BJTkdfQUREUl9BRERSIChHRU1JTklfUkVHX0JBU0UgKyAweDAwMDAwMGQ4KQotI2RlZmluZSBIV0lPX0pQRUdfV0VfWV9QSU5HX0FERFJfUk1TSyAweGZmZmZmZmY4Ci0KLSNkZWZpbmUgSFdJT19KUEVHX1dFX1lfUE9OR19CVUZGRVJfQ0ZHX0FERFIgKEdFTUlOSV9SRUdfQkFTRSArIDB4MDAwMDAwY2MpCi0jZGVmaW5lIEhXSU9fSlBFR19XRV9ZX1BPTkdfQlVGRkVSX0NGR19STVNLIDB4N2ZmZmZmCi0KLSNkZWZpbmUgSFdJT19KUEVHX1dFX1lfUE9OR19BRERSX0FERFIgKEdFTUlOSV9SRUdfQkFTRSArIDB4MDAwMDAwZGMpCi0jZGVmaW5lIEhXSU9fSlBFR19XRV9ZX1BPTkdfQUREUl9STVNLIDB4ZmZmZmZmZjgKLQotI2RlZmluZSBIV0lPX0pQRUdfV0VfWV9QSU5HX0JVRkZFUl9DRkdfV0VfQlVGRkVSX0xFTkdUSF9CTVNLIDB4N2ZmZmZmCi0jZGVmaW5lIEhXSU9fSlBFR19XRV9ZX1BJTkdfQlVGRkVSX0NGR19XRV9CVUZGRVJfTEVOR1RIX1NIRlQgMAotCi0jZGVmaW5lIEhXSU9fSlBFR19XRV9ZX1BPTkdfQlVGRkVSX0NGR19XRV9CVUZGRVJfTEVOR1RIX0JNU0sgMHg3ZmZmZmYKLSNkZWZpbmUgSFdJT19KUEVHX1dFX1lfUE9OR19CVUZGRVJfQ0ZHX1dFX0JVRkZFUl9MRU5HVEhfU0hGVCAwCi0KLSNkZWZpbmUgSFdJT19KUEVHX0lSUV9NQVNLX0FERFIgKEdFTUlOSV9SRUdfQkFTRSArIDB4MDAwMDAwMTQpCi0jZGVmaW5lIEhXSU9fSlBFR19JUlFfTUFTS19STVNLIDB4ZmZmZmZmZmYKLQotI2RlZmluZSBIV0lPX0pQRUdfSVJRX0NMRUFSX0FERFIgKEdFTUlOSV9SRUdfQkFTRSArIDB4MDAwMDAwMTgpCi0jZGVmaW5lIEhXSU9fSlBFR19JUlFfQ0xFQVJfUk1TSyAweGZmZmZmZmZmCi0KLSNkZWZpbmUgSFdJT19KUEVHX1JFU0VUX0NNRF9BRERSIChHRU1JTklfUkVHX0JBU0UgKyAweDAwMDAwMDA0KQotI2RlZmluZSBIV0lPX0pQRUdfUkVTRVRfQ01EX1JNU0sgMHhlMDA0ZmZmZgotCi0jZGVmaW5lIEhXSU9fSlBFR19JUlFfU1RBVFVTX0FERFIgKEdFTUlOSV9SRUdfQkFTRSArIDB4MDAwMDAwMWMpCi0jZGVmaW5lIEhXSU9fSlBFR19JUlFfU1RBVFVTX1JNU0sgMHhmZmZmZmZmZgotCi0jZGVmaW5lIEhXSU9fSlBFR19TVEFUVVNfRU5DT0RFX09VVFBVVF9TSVpFX0FERFIgKEdFTUlOSV9SRUdfQkFTRSArIDB4MDAwMDAwMzQpCi0jZGVmaW5lIEhXSU9fSlBFR19TVEFUVVNfRU5DT0RFX09VVFBVVF9TSVpFX1JNU0sgMHhmZmZmZmZmZgotCi0jZW5kaWYgLyogTVNNX0dFTUlOSV9IV19SRUdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2dlbWluaS9tc21fZ2VtaW5pX3BsYXRmb3JtLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfcGxhdGZvcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA4ODJmNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfcGxhdGZvcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bWFjaC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11X2RvbWFpbnMuaD4KLQotI2luY2x1ZGUgIm1zbV9nZW1pbmlfcGxhdGZvcm0uaCIKLSNpbmNsdWRlICJtc21fZ2VtaW5pX3N5bmMuaCIKLSNpbmNsdWRlICJtc21fZ2VtaW5pX2NvbW1vbi5oIgotI2luY2x1ZGUgIm1zbV9nZW1pbmlfaHcuaCIKLQotLyogQVhJIHJhdGUgaW4gS0h6ICovCi0jZGVmaW5lIE1TTV9TWVNURU1fQlVTX1JBVEUJMTYwMDAwCi1zdHJ1Y3QgaW9uX2NsaWVudCAqZ2VtaW5pX2NsaWVudDsKLQotdm9pZCBtc21fZ2VtaW5pX3BsYXRmb3JtX3AydihzdHJ1Y3QgZmlsZSAgKmZpbGUsCi0JCQkJc3RydWN0IGlvbl9oYW5kbGUgKippb25oYW5kbGUpCi17Ci0jaWZkZWYgQ09ORklHX01TTV9NVUxUSU1FRElBX1VTRV9JT04KLQlpb25fdW5tYXBfaW9tbXUoZ2VtaW5pX2NsaWVudCwgKmlvbmhhbmRsZSwgQ0FNRVJBX0RPTUFJTiwgR0VOX1BPT0wpOwotCWlvbl9mcmVlKGdlbWluaV9jbGllbnQsICppb25oYW5kbGUpOwotCSppb25oYW5kbGUgPSBOVUxMOwotI2VuZGlmCi19Ci0KLXVpbnQzMl90IG1zbV9nZW1pbmlfcGxhdGZvcm1fdjJwKGludCBmZCwgdWludDMyX3QgbGVuLCBzdHJ1Y3QgZmlsZSAqKmZpbGVfcCwKLQkJCQlzdHJ1Y3QgaW9uX2hhbmRsZSAqKmlvbmhhbmRsZSkKLXsKLQl1bnNpZ25lZCBsb25nIHBhZGRyOwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQlpbnQgcmM7Ci0jaWZkZWYgQ09ORklHX01TTV9NVUxUSU1FRElBX1VTRV9JT04KLQkqaW9uaGFuZGxlID0gaW9uX2ltcG9ydF9kbWFfYnVmKGdlbWluaV9jbGllbnQsIGZkKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoKmlvbmhhbmRsZSkpCi0JCXJldHVybiAwOwotCi0JcmMgPSBpb25fbWFwX2lvbW11KGdlbWluaV9jbGllbnQsICppb25oYW5kbGUsIENBTUVSQV9ET01BSU4sIEdFTl9QT09MLAotCQkJU1pfNEssIDAsICZwYWRkciwgKHVuc2lnbmVkIGxvbmcgKikmc2l6ZSwgMCwgMCk7Ci0jZWxzZQotCXJjID0gMDsKLQlwYWRkciA9IDA7Ci0Jc2l6ZSA9IDA7Ci0jZW5kaWYKLQlpZiAocmMgPCAwKSB7Ci0JCUdNTl9QUl9FUlIoIiVzOiBnZXRfcG1lbV9maWxlIGZkICVkIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgZmQsCi0JCQlyYyk7Ci0JCWdvdG8gZXJyb3IxOwotCX0KLQotCS8qIHZhbGlkYXRlIHVzZXIgaW5wdXQgKi8KLQlpZiAobGVuID4gc2l6ZSkgewotCQlHTU5fUFJfRVJSKCIlczogaW52YWxpZCBvZmZzZXQgKyBsZW5cbiIsIF9fZnVuY19fKTsKLQkJZ290byBlcnJvcjE7Ci0JfQotCi0JcmV0dXJuIHBhZGRyOwotZXJyb3IxOgotI2lmZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0JaW9uX2ZyZWUoZ2VtaW5pX2NsaWVudCwgKmlvbmhhbmRsZSk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBtc21fY2FtX2Nsa19pbmZvIGdlbWluaV84eF9jbGtfaW5mb1tdID0gewotCXsiY29yZV9jbGsiLCAyMjg1NzEwMDB9LAotCXsiaWZhY2VfY2xrIiwgLTF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtX2Nsa19pbmZvIGdlbWluaV83eF9jbGtfaW5mb1tdID0gewotCXsiY29yZV9jbGsiLCAxNTM2MDAwMDB9LAotCXsiaWZhY2VfY2xrIiwgLTF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtX2Nsa19pbmZvIGdlbWluaV9pbWVtX2Nsa19pbmZvW10gPSB7Ci0JeyJtZW1fY2xrIiwgLTF9LAotfTsKLQotaW50IG1zbV9nZW1pbmlfcGxhdGZvcm1faW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCXN0cnVjdCByZXNvdXJjZSAqKm1lbSwKLQl2b2lkICoqYmFzZSwKLQlpbnQgKmlycSwKLQlpcnFyZXR1cm5fdCAoKmhhbmRsZXIpIChpbnQsIHZvaWQgKiksCi0Jdm9pZCAqY29udGV4dCkKLXsKLQlpbnQgcmMgPSAtMTsKLQlpbnQgZ2VtaW5pX2lycTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmdlbWluaV9tZW0sICpnZW1pbmlfaW8sICpnZW1pbmlfaXJxX3JlczsKLQl2b2lkICpnZW1pbmlfYmFzZTsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKnBnbW5fZGV2ID0KLQkJKHN0cnVjdCBtc21fZ2VtaW5pX2RldmljZSAqKSBjb250ZXh0OwotCi0JZ2VtaW5pX21lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFnZW1pbmlfbWVtKSB7Ci0JCUdNTl9QUl9FUlIoIiVzOiBubyBtZW0gcmVzb3VyY2U/XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWdlbWluaV9pcnFfcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKLQlpZiAoIWdlbWluaV9pcnFfcmVzKSB7Ci0JCUdNTl9QUl9FUlIoIm5vIGlycSByZXNvdXJjZT9cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JZ2VtaW5pX2lycSA9IGdlbWluaV9pcnFfcmVzLT5zdGFydDsKLQotCWdlbWluaV9pbyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihnZW1pbmlfbWVtLT5zdGFydCwKLQkJcmVzb3VyY2Vfc2l6ZShnZW1pbmlfbWVtKSwgcGRldi0+bmFtZSk7Ci0JaWYgKCFnZW1pbmlfaW8pIHsKLQkJR01OX1BSX0VSUigiJXM6IHJlZ2lvbiBhbHJlYWR5IGNsYWltZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlnZW1pbmlfYmFzZSA9IGlvcmVtYXAoZ2VtaW5pX21lbS0+c3RhcnQsIHJlc291cmNlX3NpemUoZ2VtaW5pX21lbSkpOwotCWlmICghZ2VtaW5pX2Jhc2UpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlHTU5fUFJfRVJSKCIlczogaW9yZW1hcCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBmYWlsMTsKLQl9Ci0KLQlwZ21uX2Rldi0+aHdfdmVyc2lvbiA9IEdFTUlOSV84WDYwOwotCXJjID0gbXNtX2NhbV9jbGtfZW5hYmxlKCZwZ21uX2Rldi0+cGRldi0+ZGV2LCBnZW1pbmlfOHhfY2xrX2luZm8sCi0JIHBnbW5fZGV2LT5nZW1pbmlfY2xrLCBBUlJBWV9TSVpFKGdlbWluaV84eF9jbGtfaW5mbyksIDEpOwotCWlmIChyYyA8IDApIHsKLQkJcGdtbl9kZXYtPmh3X3ZlcnNpb24gPSBHRU1JTklfN1g7Ci0JCXJjID0gbXNtX2NhbV9jbGtfZW5hYmxlKCZwZ21uX2Rldi0+cGRldi0+ZGV2LAotCQkJZ2VtaW5pXzd4X2Nsa19pbmZvLCBwZ21uX2Rldi0+Z2VtaW5pX2NsaywKLQkJCUFSUkFZX1NJWkUoZ2VtaW5pXzd4X2Nsa19pbmZvKSwgMSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCUdNTl9QUl9FUlIoIiVzOiBjbGsgZmFpbGVkIHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCQlnb3RvIGZhaWwyOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmMgPSBtc21fY2FtX2Nsa19lbmFibGUoJnBnbW5fZGV2LT5wZGV2LT5kZXYsCi0JCQkJZ2VtaW5pX2ltZW1fY2xrX2luZm8sICZwZ21uX2Rldi0+Z2VtaW5pX2Nsa1syXSwKLQkJCQlBUlJBWV9TSVpFKGdlbWluaV9pbWVtX2Nsa19pbmZvKSwgMSk7Ci0JCWlmICghcmMpCi0JCQlwZ21uX2Rldi0+aHdfdmVyc2lvbiA9IEdFTUlOSV84OTYwOwotCX0KLQotCWlmIChwZ21uX2Rldi0+aHdfdmVyc2lvbiAhPSBHRU1JTklfN1gpIHsKLQkJaWYgKHBnbW5fZGV2LT5nZW1pbmlfZnMgPT0gTlVMTCkgewotCQkJcGdtbl9kZXYtPmdlbWluaV9mcyA9Ci0JCQkJcmVndWxhdG9yX2dldCgmcGdtbl9kZXYtPnBkZXYtPmRldiwgInZkZCIpOwotCQkJaWYgKElTX0VSUihwZ21uX2Rldi0+Z2VtaW5pX2ZzKSkgewotCQkJCXByX2VycigiJXM6IFJlZ3VsYXRvciBGU19panBlZyBnZXQgZmFpbGVkICVsZFxuIiwKLQkJCQkJX19mdW5jX18sIFBUUl9FUlIocGdtbl9kZXYtPmdlbWluaV9mcykpOwotCQkJCXBnbW5fZGV2LT5nZW1pbmlfZnMgPSBOVUxMOwotCQkJCWdvdG8gZ2VtaW5pX2ZzX2ZhaWxlZDsKLQkJCX0gZWxzZSBpZiAocmVndWxhdG9yX2VuYWJsZShwZ21uX2Rldi0+Z2VtaW5pX2ZzKSkgewotCQkJCXByX2VycigiJXM6IFJlZ3VsYXRvciBGU19panBlZyBlbmFibGUgZmFpbGVkXG4iLAotCQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJcmVndWxhdG9yX3B1dChwZ21uX2Rldi0+Z2VtaW5pX2ZzKTsKLQkJCQlwZ21uX2Rldi0+Z2VtaW5pX2ZzID0gTlVMTDsKLQkJCQlnb3RvIGdlbWluaV9mc19mYWlsZWQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQltc21fZ2VtaW5pX2h3X2luaXQoZ2VtaW5pX2Jhc2UsIHJlc291cmNlX3NpemUoZ2VtaW5pX21lbSkpOwotCXJjID0gcmVxdWVzdF9pcnEoZ2VtaW5pX2lycSwgaGFuZGxlciwgSVJRRl9UUklHR0VSX1JJU0lORywgImdlbWluaSIsCi0JCWNvbnRleHQpOwotCWlmIChyYykgewotCQlHTU5fUFJfRVJSKCIlczogcmVxdWVzdF9pcnEgZmFpbGVkLCAlZFxuIiwgX19mdW5jX18sCi0JCQlnZW1pbmlfaXJxKTsKLQkJZ290byBmYWlsMzsKLQl9Ci0KLQkqbWVtICA9IGdlbWluaV9tZW07Ci0JKmJhc2UgPSBnZW1pbmlfYmFzZTsKLQkqaXJxICA9IGdlbWluaV9pcnE7Ci0KLSNpZmRlZiBDT05GSUdfTVNNX01VTFRJTUVESUFfVVNFX0lPTgotCWdlbWluaV9jbGllbnQgPSBtc21faW9uX2NsaWVudF9jcmVhdGUoLTEsICJjYW1lcmEvZ2VtaW5pIik7Ci0jZW5kaWYKLQlHTU5fREJHKCIlczolZF0gc3VjY2Vzc1xuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCXJldHVybiByYzsKLQotZmFpbDM6Ci0JaWYgKHBnbW5fZGV2LT5od192ZXJzaW9uICE9IEdFTUlOSV83WCkgewotCQlyZWd1bGF0b3JfZGlzYWJsZShwZ21uX2Rldi0+Z2VtaW5pX2ZzKTsKLQkJcmVndWxhdG9yX3B1dChwZ21uX2Rldi0+Z2VtaW5pX2ZzKTsKLQkJcGdtbl9kZXYtPmdlbWluaV9mcyA9IE5VTEw7Ci0JfQotZ2VtaW5pX2ZzX2ZhaWxlZDoKLQlpZiAocGdtbl9kZXYtPmh3X3ZlcnNpb24gPT0gR0VNSU5JXzg5NjApCi0JCW1zbV9jYW1fY2xrX2VuYWJsZSgmcGdtbl9kZXYtPnBkZXYtPmRldiwgZ2VtaW5pX2ltZW1fY2xrX2luZm8sCi0JCSAmcGdtbl9kZXYtPmdlbWluaV9jbGtbMl0sIEFSUkFZX1NJWkUoZ2VtaW5pX2ltZW1fY2xrX2luZm8pLCAwKTsKLQlpZiAocGdtbl9kZXYtPmh3X3ZlcnNpb24gIT0gR0VNSU5JXzdYKQotCQltc21fY2FtX2Nsa19lbmFibGUoJnBnbW5fZGV2LT5wZGV2LT5kZXYsIGdlbWluaV84eF9jbGtfaW5mbywKLQkJcGdtbl9kZXYtPmdlbWluaV9jbGssIEFSUkFZX1NJWkUoZ2VtaW5pXzh4X2Nsa19pbmZvKSwgMCk7Ci0JZWxzZQotCQltc21fY2FtX2Nsa19lbmFibGUoJnBnbW5fZGV2LT5wZGV2LT5kZXYsIGdlbWluaV83eF9jbGtfaW5mbywKLQkJcGdtbl9kZXYtPmdlbWluaV9jbGssIEFSUkFZX1NJWkUoZ2VtaW5pXzd4X2Nsa19pbmZvKSwgMCk7Ci1mYWlsMjoKLQlpb3VubWFwKGdlbWluaV9iYXNlKTsKLWZhaWwxOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihnZW1pbmlfbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShnZW1pbmlfbWVtKSk7Ci0JR01OX0RCRygiJXM6JWRdIGZhaWxcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2dlbWluaV9wbGF0Zm9ybV9yZWxlYXNlKHN0cnVjdCByZXNvdXJjZSAqbWVtLCB2b2lkICpiYXNlLCBpbnQgaXJxLAotCXZvaWQgKmNvbnRleHQpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0Jc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlICpwZ21uX2RldiA9Ci0JCShzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKikgY29udGV4dDsKLQotCWZyZWVfaXJxKGlycSwgY29udGV4dCk7Ci0KLQlpZiAocGdtbl9kZXYtPmh3X3ZlcnNpb24gIT0gR0VNSU5JXzdYKSB7Ci0JCXJlZ3VsYXRvcl9kaXNhYmxlKHBnbW5fZGV2LT5nZW1pbmlfZnMpOwotCQlyZWd1bGF0b3JfcHV0KHBnbW5fZGV2LT5nZW1pbmlfZnMpOwotCQlwZ21uX2Rldi0+Z2VtaW5pX2ZzID0gTlVMTDsKLQl9Ci0KLQlpZiAocGdtbl9kZXYtPmh3X3ZlcnNpb24gPT0gR0VNSU5JXzg5NjApCi0JCW1zbV9jYW1fY2xrX2VuYWJsZSgmcGdtbl9kZXYtPnBkZXYtPmRldiwgZ2VtaW5pX2ltZW1fY2xrX2luZm8sCi0JCSAmcGdtbl9kZXYtPmdlbWluaV9jbGtbMl0sIEFSUkFZX1NJWkUoZ2VtaW5pX2ltZW1fY2xrX2luZm8pLCAwKTsKLQlpZiAocGdtbl9kZXYtPmh3X3ZlcnNpb24gIT0gR0VNSU5JXzdYKQotCQltc21fY2FtX2Nsa19lbmFibGUoJnBnbW5fZGV2LT5wZGV2LT5kZXYsIGdlbWluaV84eF9jbGtfaW5mbywKLQkJcGdtbl9kZXYtPmdlbWluaV9jbGssIEFSUkFZX1NJWkUoZ2VtaW5pXzh4X2Nsa19pbmZvKSwgMCk7Ci0JZWxzZQotCQltc21fY2FtX2Nsa19lbmFibGUoJnBnbW5fZGV2LT5wZGV2LT5kZXYsIGdlbWluaV83eF9jbGtfaW5mbywKLQkJcGdtbl9kZXYtPmdlbWluaV9jbGssIEFSUkFZX1NJWkUoZ2VtaW5pXzd4X2Nsa19pbmZvKSwgMCk7Ci0KLQlpb3VubWFwKGJhc2UpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOwotI2lmZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0JaW9uX2NsaWVudF9kZXN0cm95KGdlbWluaV9jbGllbnQpOwotI2VuZGlmCi0JR01OX0RCRygiJXM6JWRdIHN1Y2Nlc3NcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2dlbWluaS9tc21fZ2VtaW5pX3BsYXRmb3JtLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfcGxhdGZvcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYyOTFkYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfcGxhdGZvcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMC0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgTVNNX0dFTUlOSV9QTEFURk9STV9ICi0jZGVmaW5lIE1TTV9HRU1JTklfUExBVEZPUk1fSAotCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvbW11Lmg+Ci12b2lkIG1zbV9nZW1pbmlfcGxhdGZvcm1fcDJ2KHN0cnVjdCBmaWxlICAqZmlsZSwKLQkJCQlzdHJ1Y3QgaW9uX2hhbmRsZSAqKmlvbmhhbmRsZSk7Ci11aW50MzJfdCBtc21fZ2VtaW5pX3BsYXRmb3JtX3YycChpbnQgZmQsIHVpbnQzMl90IGxlbiwgc3RydWN0IGZpbGUgKipmaWxlLAotCQkJCXN0cnVjdCBpb25faGFuZGxlICoqaW9uaGFuZGxlKTsKLQotaW50IG1zbV9nZW1pbmlfcGxhdGZvcm1fY2xrX2VuYWJsZSh2b2lkKTsKLWludCBtc21fZ2VtaW5pX3BsYXRmb3JtX2Nsa19kaXNhYmxlKHZvaWQpOwotCi1pbnQgbXNtX2dlbWluaV9wbGF0Zm9ybV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0Jc3RydWN0IHJlc291cmNlICoqbWVtLAotCXZvaWQgKipiYXNlLAotCWludCAqaXJxLAotCWlycXJldHVybl90ICgqaGFuZGxlcikgKGludCwgdm9pZCAqKSwKLQl2b2lkICpjb250ZXh0KTsKLWludCBtc21fZ2VtaW5pX3BsYXRmb3JtX3JlbGVhc2Uoc3RydWN0IHJlc291cmNlICptZW0sIHZvaWQgKmJhc2UsIGludCBpcnEsCi0Jdm9pZCAqY29udGV4dCk7Ci0KLSNlbmRpZiAvKiBNU01fR0VNSU5JX1BMQVRGT1JNX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9nZW1pbmkvbXNtX2dlbWluaV9zeW5jLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfc3luYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzk2YjhkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9nZW1pbmkvbXNtX2dlbWluaV9zeW5jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDg0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMC0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9nZW1pbmkuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9idXMuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9idXNfYm9hcmQuaD4KLSNpbmNsdWRlICJtc21fZ2VtaW5pX3N5bmMuaCIKLSNpbmNsdWRlICJtc21fZ2VtaW5pX2NvcmUuaCIKLSNpbmNsdWRlICJtc21fZ2VtaW5pX3BsYXRmb3JtLmgiCi0jaW5jbHVkZSAibXNtX2dlbWluaV9jb21tb24uaCIKLQotI2RlZmluZSBVSU5UMzJfTUFYICgweEZGRkZGRkZGVSkKLQotc3RhdGljIGludCByZWxlYXNlX2J1ZjsKLQotLyogc2l6ZSBpcyBiYXNlZCBvbiA0ayBwYWdlIHNpemUgKi8KLXN0YXRpYyBjb25zdCBpbnQgZ19tYXhfb3V0X3NpemUgPSAweDdmZjAwMDsKLQotLyoqKioqKioqKioqKioqKiBxdWV1ZSBoZWxwZXIgKioqKioqKioqKioqKioqKi8KLWlubGluZSB2b2lkIG1zbV9nZW1pbmlfcV9pbml0KGNoYXIgY29uc3QgKm5hbWUsIHN0cnVjdCBtc21fZ2VtaW5pX3EgKnFfcCkKLXsKLQlHTU5fREJHKCIlczolZF0gJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbmFtZSk7Ci0JcV9wLT5uYW1lID0gbmFtZTsKLQlzcGluX2xvY2tfaW5pdCgmcV9wLT5sY2spOwotCUlOSVRfTElTVF9IRUFEKCZxX3AtPnEpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnFfcC0+d2FpdCk7Ci0JcV9wLT51bmJsY2sgPSAwOwotfQotCi1pbmxpbmUgdm9pZCAqbXNtX2dlbWluaV9xX291dChzdHJ1Y3QgbXNtX2dlbWluaV9xICpxX3ApCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9xX2VudHJ5ICpxX2VudHJ5X3AgPSBOVUxMOwotCXZvaWQgKmRhdGEgPSBOVUxMOwotCi0JR01OX0RCRygiJXM6JWRdICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHFfcC0+bmFtZSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnFfcC0+bGNrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZxX3AtPnEpKSB7Ci0JCXFfZW50cnlfcCA9IGxpc3RfZmlyc3RfZW50cnkoJnFfcC0+cSwgc3RydWN0IG1zbV9nZW1pbmlfcV9lbnRyeSwKLQkJCWxpc3QpOwotCQlsaXN0X2RlbF9pbml0KCZxX2VudHJ5X3AtPmxpc3QpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxX3AtPmxjaywgZmxhZ3MpOwotCi0JaWYgKHFfZW50cnlfcCkgewotCQlkYXRhID0gcV9lbnRyeV9wLT5kYXRhOwotCQlrZnJlZShxX2VudHJ5X3ApOwotCX0gZWxzZSB7Ci0JCUdNTl9EQkcoIiVzOiVkXSAlcyBubyBlbnRyeVxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJcV9wLT5uYW1lKTsKLQl9Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQotaW5saW5lIGludCBtc21fZ2VtaW5pX3FfaW4oc3RydWN0IG1zbV9nZW1pbmlfcSAqcV9wLCB2b2lkICpkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzdHJ1Y3QgbXNtX2dlbWluaV9xX2VudHJ5ICpxX2VudHJ5X3A7Ci0KLQlHTU5fREJHKCIlczolZF0gJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcV9wLT5uYW1lKTsKLQotCXFfZW50cnlfcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fZ2VtaW5pX3FfZW50cnkpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXFfZW50cnlfcCkgewotCQlHTU5fUFJfRVJSKCIlczogbm8gbWVtXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcV9lbnRyeV9wLT5kYXRhID0gZGF0YTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZxX3AtPmxjaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJnFfZW50cnlfcC0+bGlzdCwgJnFfcC0+cSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcV9wLT5sY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1pbmxpbmUgaW50IG1zbV9nZW1pbmlfcV9pbl9idWYoc3RydWN0IG1zbV9nZW1pbmlfcSAqcV9wLAotCXN0cnVjdCBtc21fZ2VtaW5pX2NvcmVfYnVmICpidWYpCi17Ci0Jc3RydWN0IG1zbV9nZW1pbmlfY29yZV9idWYgKmJ1Zl9wOwotCi0JR01OX0RCRygiJXM6JWRdXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCWJ1Zl9wID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9nZW1pbmlfY29yZV9idWYpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWJ1Zl9wKSB7Ci0JCUdNTl9QUl9FUlIoIiVzOiBubyBtZW1cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCW1lbWNweShidWZfcCwgYnVmLCBzaXplb2Yoc3RydWN0IG1zbV9nZW1pbmlfY29yZV9idWYpKTsKLQotCW1zbV9nZW1pbmlfcV9pbihxX3AsIGJ1Zl9wKTsKLQlyZXR1cm4gMDsKLX0KLQotaW5saW5lIGludCBtc21fZ2VtaW5pX3Ffd2FpdChzdHJ1Y3QgbXNtX2dlbWluaV9xICpxX3ApCi17Ci0JaW50IHRtID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7IC8qIDUwMG1zICovCi0JaW50IHJjOwotCi0JR01OX0RCRygiJXM6JWRdICVzIHdhaXRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcV9wLT5uYW1lKTsKLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHFfcC0+d2FpdCwKLQkJKCFsaXN0X2VtcHR5X2NhcmVmdWwoJnFfcC0+cSkgfHwgcV9wLT51bmJsY2spLAotCQltc2Vjc190b19qaWZmaWVzKHRtKSk7Ci0JR01OX0RCRygiJXM6JWRdICVzIHdhaXQgZG9uZVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBxX3AtPm5hbWUpOwotCWlmIChsaXN0X2VtcHR5X2NhcmVmdWwoJnFfcC0+cSkpIHsKLQkJaWYgKHJjID09IDApIHsKLQkJCXJjID0gLUVUSU1FRE9VVDsKLQkJCUdNTl9QUl9FUlIoIiVzOiVkXSAlcyB0aW1lb3V0XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQkJcV9wLT5uYW1lKTsKLQkJfSBlbHNlIGlmIChxX3AtPnVuYmxjaykgewotCQkJR01OX0RCRygiJXM6JWRdICVzIHVuYmxvY2sgaXMgdHJ1ZVxuIiwgX19mdW5jX18sCi0JCQkJX19MSU5FX18sIHFfcC0+bmFtZSk7Ci0JCQlxX3AtPnVuYmxjayA9IDA7Ci0JCQlyYyA9IC1FQ0FOQ0VMRUQ7Ci0JCX0gZWxzZSBpZiAocmMgPCAwKSB7Ci0JCQlHTU5fUFJfRVJSKCIlczolZF0gJXMgcmMgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJCQlxX3AtPm5hbWUsIHJjKTsKLQkJfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLWlubGluZSBpbnQgbXNtX2dlbWluaV9xX3dha2V1cChzdHJ1Y3QgbXNtX2dlbWluaV9xICpxX3ApCi17Ci0JR01OX0RCRygiJXM6JWRdICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHFfcC0+bmFtZSk7Ci0Jd2FrZV91cCgmcV9wLT53YWl0KTsKLQlyZXR1cm4gMDsKLX0KLQotaW5saW5lIGludCBtc21fZ2VtaW5pX3FfdW5ibG9jayhzdHJ1Y3QgbXNtX2dlbWluaV9xICpxX3ApCi17Ci0JR01OX0RCRygiJXM6JWRdICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHFfcC0+bmFtZSk7Ci0JcV9wLT51bmJsY2sgPSAxOwotCXdha2VfdXAoJnFfcC0+d2FpdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWlubGluZSB2b2lkIG1zbV9nZW1pbmlfb3V0YnVmX3FfY2xlYW51cChzdHJ1Y3QgbXNtX2dlbWluaV9xICpxX3ApCi17Ci0Jc3RydWN0IG1zbV9nZW1pbmlfY29yZV9idWYgKmJ1Zl9wOwotCUdNTl9EQkcoIiVzOiVkXSAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBxX3AtPm5hbWUpOwotCWRvIHsKLQkJYnVmX3AgPSBtc21fZ2VtaW5pX3Ffb3V0KHFfcCk7Ci0JCWlmIChidWZfcCkgewotCQkJbXNtX2dlbWluaV9wbGF0Zm9ybV9wMnYoYnVmX3AtPmZpbGUsCi0JCQkJJmJ1Zl9wLT5oYW5kbGUpOwotCQkJR01OX0RCRygiJXM6JWRdICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHFfcC0+bmFtZSk7Ci0JCQlrZnJlZShidWZfcCk7Ci0JCX0KLQl9IHdoaWxlIChidWZfcCk7Ci0JcV9wLT51bmJsY2sgPSAwOwotfQotCi1pbmxpbmUgdm9pZCBtc21fZ2VtaW5pX3FfY2xlYW51cChzdHJ1Y3QgbXNtX2dlbWluaV9xICpxX3ApCi17Ci0Jdm9pZCAqZGF0YTsKLQlHTU5fREJHKCIlczolZF0gJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcV9wLT5uYW1lKTsKLQlkbyB7Ci0JCWRhdGEgPSBtc21fZ2VtaW5pX3Ffb3V0KHFfcCk7Ci0JCWlmIChkYXRhKSB7Ci0JCQlHTU5fREJHKCIlczolZF0gJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcV9wLT5uYW1lKTsKLQkJCWtmcmVlKGRhdGEpOwotCQl9Ci0JfSB3aGlsZSAoZGF0YSk7Ci0JcV9wLT51bmJsY2sgPSAwOwotfQotCi0vKioqKioqKioqKioqKioqIGV2ZW50IHF1ZXVlICoqKioqKioqKioqKioqKiovCi0KLWludCBtc21fZ2VtaW5pX2ZyYW1lZG9uZV9pcnEoc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlICpwZ21uX2RldiwKLQlzdHJ1Y3QgbXNtX2dlbWluaV9jb3JlX2J1ZiAqYnVmX2luKQotewotCWludCByYyA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6JWRdIGJ1Zl9pbiAlcCIsIF9fZnVuY19fLCBfX0xJTkVfXywgYnVmX2luKTsKLQotCWlmIChidWZfaW4pIHsKLQkJYnVmX2luLT52YnVmLmZyYW1lZG9uZV9sZW4gPSBidWZfaW4tPmZyYW1lZG9uZV9sZW47Ci0JCWJ1Zl9pbi0+dmJ1Zi50eXBlID0gTVNNX0dFTUlOSV9FVlRfRlJBTUVET05FOwotCQlHTU5fREJHKCIlczolZF0gMHglMDh4ICVkIGZyYW1lZG9uZV9sZW4gJWRcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18sCi0JCQkoaW50KSBidWZfaW4tPnlfYnVmZmVyX2FkZHIsIGJ1Zl9pbi0+eV9sZW4sCi0JCQlidWZfaW4tPnZidWYuZnJhbWVkb25lX2xlbik7Ci0JCXJjID0gbXNtX2dlbWluaV9xX2luX2J1ZigmcGdtbl9kZXYtPmV2dF9xLCBidWZfaW4pOwotCX0gZWxzZSB7Ci0JCUdNTl9QUl9FUlIoIiVzOiVkXSBubyBvdXRwdXQgcmV0dXJuIGJ1ZmZlclxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJjID0gLTE7Ci0JfQotCi0JaWYgKGJ1Zl9pbikKLQkJcmMgPSBtc21fZ2VtaW5pX3Ffd2FrZXVwKCZwZ21uX2Rldi0+ZXZ0X3EpOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2dlbWluaV9ldnRfZ2V0KHN0cnVjdCBtc21fZ2VtaW5pX2RldmljZSAqcGdtbl9kZXYsCi0Jdm9pZCBfX3VzZXIgKnRvKQotewotCXN0cnVjdCBtc21fZ2VtaW5pX2NvcmVfYnVmICpidWZfcDsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9jdHJsX2NtZCBjdHJsX2NtZDsKLQotCUdNTl9EQkcoIiVzOiVkXSBFbnRlclxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCW1zbV9nZW1pbmlfcV93YWl0KCZwZ21uX2Rldi0+ZXZ0X3EpOwotCWJ1Zl9wID0gbXNtX2dlbWluaV9xX291dCgmcGdtbl9kZXYtPmV2dF9xKTsKLQotCWlmICghYnVmX3ApIHsKLQkJR01OX0RCRygiJXM6JWRdIG5vIGJ1ZmZlclxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0JbWVtc2V0KCZjdHJsX2NtZCwgMCwgc2l6ZW9mKHN0cnVjdCBtc21fZ2VtaW5pX2N0cmxfY21kKSk7Ci0JY3RybF9jbWQudHlwZSA9IGJ1Zl9wLT52YnVmLnR5cGU7Ci0Ja2ZyZWUoYnVmX3ApOwotCi0JR01OX0RCRygiJXM6JWRdIDB4JTA4eCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkoaW50KSBjdHJsX2NtZC52YWx1ZSwgY3RybF9jbWQubGVuKTsKLQotCWlmIChjb3B5X3RvX3VzZXIodG8sICZjdHJsX2NtZCwgc2l6ZW9mKGN0cmxfY21kKSkpIHsKLQkJR01OX1BSX0VSUigiJXM6JWRdXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IG1zbV9nZW1pbmlfZXZ0X2dldF91bmJsb2NrKHN0cnVjdCBtc21fZ2VtaW5pX2RldmljZSAqcGdtbl9kZXYpCi17Ci0JR01OX0RCRygiJXM6JWRdIEVudGVyXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCW1zbV9nZW1pbmlfcV91bmJsb2NrKCZwZ21uX2Rldi0+ZXZ0X3EpOwotCXJldHVybiAwOwotfQotCi12b2lkIG1zbV9nZW1pbmlfcmVzZXRfYWNrX2lycShzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKnBnbW5fZGV2KQotewotCUdNTl9EQkcoIiVzOiVkXVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLX0KLQotdm9pZCBtc21fZ2VtaW5pX2Vycl9pcnEoc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlICpwZ21uX2RldiwKLQlpbnQgZXZlbnQpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9jb3JlX2J1ZiBidWY7Ci0KLQlHTU5fUFJfRVJSKCIlczolZF0gZXJyb3I6ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGV2ZW50KTsKLQotCWJ1Zi52YnVmLnR5cGUgPSBNU01fR0VNSU5JX0VWVF9FUlI7Ci0JcmMgPSBtc21fZ2VtaW5pX3FfaW5fYnVmKCZwZ21uX2Rldi0+ZXZ0X3EsICZidWYpOwotCWlmICghcmMpCi0JCXJjID0gbXNtX2dlbWluaV9xX3dha2V1cCgmcGdtbl9kZXYtPmV2dF9xKTsKLQotCWlmICghcmMpCi0JCUdNTl9QUl9FUlIoIiVzOiVkXSBlcnIgZXJyXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCi0JcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqIG91dHB1dCBxdWV1ZSAqKioqKioqKioqKioqKioqLwotCi1pbnQgbXNtX2dlbWluaV9nZXRfb3V0X2J1ZmZlcihzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKnBnbW5fZGV2LAotCXN0cnVjdCBtc21fZ2VtaW5pX2h3X2J1ZiAqcF9vdXRidWYpCi17Ci0JaW50IGJ1Zl9zaXplID0gMDsKLQlpbnQgYnl0ZXNfcmVtYWluaW5nID0gMDsKLQlpZiAocGdtbl9kZXYtPm91dF9vZmZzZXQgPj0gcGdtbl9kZXYtPm91dF9idWYueV9sZW4pIHsKLQkJR01OX1BSX0VSUigiJXM6JWRdIG5vIG1vcmUgYnVmZmVycyIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlieXRlc19yZW1haW5pbmcgPSBwZ21uX2Rldi0+b3V0X2J1Zi55X2xlbiAtIHBnbW5fZGV2LT5vdXRfb2Zmc2V0OwotCWJ1Zl9zaXplID0gbWluKGJ5dGVzX3JlbWFpbmluZywgcGdtbl9kZXYtPm1heF9vdXRfc2l6ZSk7Ci0KLQlwZ21uX2Rldi0+b3V0X2ZyYWdfY250Kys7Ci0JcHJfZGVidWcoIiVzOiVkXSBidWZfc2l6ZVslZF0gJWQiLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCXBnbW5fZGV2LT5vdXRfZnJhZ19jbnQsIGJ1Zl9zaXplKTsKLQlwX291dGJ1Zi0+eV9sZW4gPSBidWZfc2l6ZTsKLQlwX291dGJ1Zi0+eV9idWZmZXJfYWRkciA9IHBnbW5fZGV2LT5vdXRfYnVmLnlfYnVmZmVyX2FkZHIgKwotCQlwZ21uX2Rldi0+b3V0X29mZnNldDsKLQlwZ21uX2Rldi0+b3V0X29mZnNldCArPSBidWZfc2l6ZTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IG1zbV9nZW1pbmlfb3V0bW9kZV9zaW5nbGVfd2VfcGluZ3BvbmdfaXJxKAotCXN0cnVjdCBtc21fZ2VtaW5pX2RldmljZSAqcGdtbl9kZXYsCi0Jc3RydWN0IG1zbV9nZW1pbmlfY29yZV9idWYgKmJ1Zl9pbikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fZ2VtaW5pX2NvcmVfYnVmIG91dF9idWY7Ci0JaW50IGZyYW1lX2RvbmUgPSBidWZfaW4gJiYKLQkJYnVmX2luLT52YnVmLnR5cGUgPT0gTVNNX0dFTUlOSV9FVlRfRlJBTUVET05FOwotCXByX2RlYnVnKCIlczolZF0gZnJhbWVkb25lICVkIiwgX19mdW5jX18sIF9fTElORV9fLCBmcmFtZV9kb25lKTsKLQlpZiAoIXBnbW5fZGV2LT5vdXRfYnVmX3NldCkgewotCQlwcl9lcnIoIiVzOiVkXSBvdXRwdXQgYnVmZmVyIG5vdCBzZXQiLAotCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCWlmIChmcmFtZV9kb25lKSB7Ci0JCS8qIHNlbmQgdGhlIGJ1ZmZlciBiYWNrICovCi0JCXBnbW5fZGV2LT5vdXRfYnVmLnZidWYuZnJhbWVkb25lX2xlbiA9IGJ1Zl9pbi0+ZnJhbWVkb25lX2xlbjsKLQkJcGdtbl9kZXYtPm91dF9idWYudmJ1Zi50eXBlID0gTVNNX0dFTUlOSV9FVlRfRlJBTUVET05FOwotCQlyYyA9IG1zbV9nZW1pbmlfcV9pbl9idWYoJnBnbW5fZGV2LT5vdXRwdXRfcnRuX3EsCi0JCQkmcGdtbl9kZXYtPm91dF9idWYpOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXM6JWRdIGNhbm5vdCBxdWV1ZSB0aGUgb3V0cHV0IGJ1ZmZlciIsCi0JCQkJIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlyYyA9ICBtc21fZ2VtaW5pX3Ffd2FrZXVwKCZwZ21uX2Rldi0+b3V0cHV0X3J0bl9xKTsKLQkJLyogcmVzZXQgdGhlIG91dHB1dCBidWZmZXIgc2luY2UgdGhlIG93bmVyc2hpcCBpcwotCQkJdHJhbnNmZXJyZWQgdG8gdGhlIHJ0biBxdWV1ZSAqLwotCQlpZiAoIXJjKQotCQkJcGdtbl9kZXYtPm91dF9idWZfc2V0ID0gMDsKLQl9IGVsc2UgewotCQkvKiBjb25maWd1cmUgcGluZy9wb25nICovCi0JCXJjID0gbXNtX2dlbWluaV9nZXRfb3V0X2J1ZmZlcihwZ21uX2RldiwgJm91dF9idWYpOwotCQlpZiAocmMpCi0JCQltc21fZ2VtaW5pX2NvcmVfd2VfYnVmX3Jlc2V0KCZvdXRfYnVmKTsKLQkJZWxzZQotCQkJbXNtX2dlbWluaV9jb3JlX3dlX2J1Zl91cGRhdGUoJm91dF9idWYpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fZ2VtaW5pX3dlX3Bpbmdwb25nX2lycShzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKnBnbW5fZGV2LAotCXN0cnVjdCBtc21fZ2VtaW5pX2NvcmVfYnVmICpidWZfaW4pCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9jb3JlX2J1ZiAqYnVmX291dDsKLQotCXByX2RlYnVnKCIlczolZF0gRW50ZXIgbW9kZSAlZCIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJcGdtbl9kZXYtPm91dF9tb2RlKTsKLQotCWlmIChwZ21uX2Rldi0+b3V0X21vZGUgPT0gTVNNX0dNTl9PVVRNT0RFX1NJTkdMRSkKLQkJcmV0dXJuIG1zbV9nZW1pbmlfb3V0bW9kZV9zaW5nbGVfd2VfcGluZ3BvbmdfaXJxKHBnbW5fZGV2LAotCQkJYnVmX2luKTsKLQotCWlmIChidWZfaW4pIHsKLQkJcHJfZGVidWcoIiVzOiVkXSAweCUwOHggJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJCShpbnQpIGJ1Zl9pbi0+eV9idWZmZXJfYWRkciwgYnVmX2luLT55X2xlbik7Ci0JCXJjID0gbXNtX2dlbWluaV9xX2luX2J1ZigmcGdtbl9kZXYtPm91dHB1dF9ydG5fcSwgYnVmX2luKTsKLQl9IGVsc2UgewotCQlwcl9kZWJ1ZygiJXM6JWRdIG5vIG91dHB1dCByZXR1cm4gYnVmZmVyXG4iLCBfX2Z1bmNfXywKLQkJCV9fTElORV9fKTsKLQkJcmMgPSAtMTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWJ1Zl9vdXQgPSBtc21fZ2VtaW5pX3Ffb3V0KCZwZ21uX2Rldi0+b3V0cHV0X2J1Zl9xKTsKLQotCWlmIChidWZfb3V0KSB7Ci0JCXJjID0gbXNtX2dlbWluaV9jb3JlX3dlX2J1Zl91cGRhdGUoYnVmX291dCk7Ci0JCWtmcmVlKGJ1Zl9vdXQpOwotCX0gZWxzZSB7Ci0JCW1zbV9nZW1pbmlfY29yZV93ZV9idWZfcmVzZXQoYnVmX2luKTsKLQkJcHJfZGVidWcoIiVzOiVkXSBubyBvdXRwdXQgYnVmZmVyXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyYyA9IC0yOwotCX0KLQotCWlmIChidWZfaW4pCi0JCXJjID0gbXNtX2dlbWluaV9xX3dha2V1cCgmcGdtbl9kZXYtPm91dHB1dF9ydG5fcSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fZ2VtaW5pX291dHB1dF9nZXQoc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlICpwZ21uX2Rldiwgdm9pZCBfX3VzZXIgKnRvKQotewotCXN0cnVjdCBtc21fZ2VtaW5pX2NvcmVfYnVmICpidWZfcDsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9idWYgYnVmX2NtZDsKLQotCUdNTl9EQkcoIiVzOiVkXSBFbnRlclxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCW1zbV9nZW1pbmlfcV93YWl0KCZwZ21uX2Rldi0+b3V0cHV0X3J0bl9xKTsKLQlidWZfcCA9IG1zbV9nZW1pbmlfcV9vdXQoJnBnbW5fZGV2LT5vdXRwdXRfcnRuX3EpOwotCi0JaWYgKCFidWZfcCkgewotCQlHTU5fREJHKCIlczolZF0gbm8gb3V0cHV0IGJ1ZmZlciByZXR1cm5cbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0KLQlidWZfY21kID0gYnVmX3AtPnZidWY7Ci0JbXNtX2dlbWluaV9wbGF0Zm9ybV9wMnYoYnVmX3AtPmZpbGUsICZidWZfcC0+aGFuZGxlKTsKLQlrZnJlZShidWZfcCk7Ci0KLQlHTU5fREJHKCIlczolZF0gMHglMDh4ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCShpbnQpIGJ1Zl9jbWQudmFkZHIsIGJ1Zl9jbWQueV9sZW4pOwotCi0JaWYgKGNvcHlfdG9fdXNlcih0bywgJmJ1Zl9jbWQsIHNpemVvZihidWZfY21kKSkpIHsKLQkJR01OX1BSX0VSUigiJXM6JWRdIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fZ2VtaW5pX291dHB1dF9nZXRfdW5ibG9jayhzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKnBnbW5fZGV2KQotewotCUdNTl9EQkcoIiVzOiVkXSBFbnRlclxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQltc21fZ2VtaW5pX3FfdW5ibG9jaygmcGdtbl9kZXYtPm91dHB1dF9ydG5fcSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fZ2VtaW5pX3NldF9vdXRwdXRfYnVmKHN0cnVjdCBtc21fZ2VtaW5pX2RldmljZSAqcGdtbl9kZXYsCi0Jdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9idWYgYnVmX2NtZDsKLQotCWlmIChwZ21uX2Rldi0+b3V0X2J1Zl9zZXQpIHsKLQkJcHJfZXJyKCIlczolZF0gb3V0YnVmZmVyIGJ1ZmZlciBhbHJlYWR5IHByb3ZpZGVkIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmX2NtZCwgYXJnLCBzaXplb2Yoc3RydWN0IG1zbV9nZW1pbmlfYnVmKSkpIHsKLQkJcHJfZXJyKCIlczolZF0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlHTU5fREJHKCIlczolZF0gb3V0cHV0IGFkZHIgMHglMDh4IGxlbiAlZCIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJKGludCkgYnVmX2NtZC52YWRkciwKLQkJYnVmX2NtZC55X2xlbik7Ci0KLQlwZ21uX2Rldi0+b3V0X2J1Zi55X2J1ZmZlcl9hZGRyID0gbXNtX2dlbWluaV9wbGF0Zm9ybV92MnAoCi0JCWJ1Zl9jbWQuZmQsCi0JCWJ1Zl9jbWQueV9sZW4sCi0JCSZwZ21uX2Rldi0+b3V0X2J1Zi5maWxlLAotCQkmcGdtbl9kZXYtPm91dF9idWYuaGFuZGxlKTsKLQlpZiAoIXBnbW5fZGV2LT5vdXRfYnVmLnlfYnVmZmVyX2FkZHIpIHsKLQkJcHJfZXJyKCIlczolZF0gY2Fubm90IG1hcCB0aGUgb3V0cHV0IGFkZHJlc3MiLAotCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCXBnbW5fZGV2LT5vdXRfYnVmLnlfbGVuID0gYnVmX2NtZC55X2xlbjsKLQlwZ21uX2Rldi0+b3V0X2J1Zi52YnVmID0gYnVmX2NtZDsKLQlwZ21uX2Rldi0+b3V0X2J1Zl9zZXQgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fZ2VtaW5pX291dHB1dF9idWZfZW5xdWV1ZShzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKnBnbW5fZGV2LAotCXZvaWQgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IG1zbV9nZW1pbmlfYnVmIGJ1Zl9jbWQ7Ci0Jc3RydWN0IG1zbV9nZW1pbmlfY29yZV9idWYgKmJ1Zl9wOwotCi0JR01OX0RCRygiJXM6JWRdIEVudGVyXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmX2NtZCwgYXJnLCBzaXplb2Yoc3RydWN0IG1zbV9nZW1pbmlfYnVmKSkpIHsKLQkJR01OX1BSX0VSUigiJXM6JWRdIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JYnVmX3AgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2dlbWluaV9jb3JlX2J1ZiksIEdGUF9BVE9NSUMpOwotCWlmICghYnVmX3ApIHsKLQkJR01OX1BSX0VSUigiJXM6JWRdIG5vIG1lbVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCUdNTl9EQkcoIiVzOiVkXSAweCUwOHggJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgKGludCkgYnVmX2NtZC52YWRkciwKLQkJYnVmX2NtZC55X2xlbik7Ci0KLQlidWZfcC0+eV9idWZmZXJfYWRkciA9IG1zbV9nZW1pbmlfcGxhdGZvcm1fdjJwKGJ1Zl9jbWQuZmQsCi0JCWJ1Zl9jbWQueV9sZW4sICZidWZfcC0+ZmlsZSwgJmJ1Zl9wLT5oYW5kbGUpOwotCWlmICghYnVmX3AtPnlfYnVmZmVyX2FkZHIpIHsKLQkJR01OX1BSX0VSUigiJXM6JWRdIHYycCB3cm9uZ1xuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJa2ZyZWUoYnVmX3ApOwotCQlyZXR1cm4gLTE7Ci0JfQotCWJ1Zl9wLT55X2xlbiA9IGJ1Zl9jbWQueV9sZW47Ci0JYnVmX3AtPnZidWYgPSBidWZfY21kOwotCi0JbXNtX2dlbWluaV9xX2luKCZwZ21uX2Rldi0+b3V0cHV0X2J1Zl9xLCBidWZfcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKiogaW5wdXQgcXVldWUgKioqKioqKioqKioqKioqKi8KLQotaW50IG1zbV9nZW1pbmlfZmVfcGluZ3BvbmdfaXJxKHN0cnVjdCBtc21fZ2VtaW5pX2RldmljZSAqcGdtbl9kZXYsCi0Jc3RydWN0IG1zbV9nZW1pbmlfY29yZV9idWYgKmJ1Zl9pbikKLXsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9jb3JlX2J1ZiAqYnVmX291dDsKLQlpbnQgcmMgPSAwOwotCi0JR01OX0RCRygiJXM6JWRdIEVudGVyXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCWlmIChidWZfaW4pIHsKLQkJR01OX0RCRygiJXM6JWRdIDB4JTA4eCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJKGludCkgYnVmX2luLT55X2J1ZmZlcl9hZGRyLCBidWZfaW4tPnlfbGVuKTsKLQkJcmMgPSBtc21fZ2VtaW5pX3FfaW5fYnVmKCZwZ21uX2Rldi0+aW5wdXRfcnRuX3EsIGJ1Zl9pbik7Ci0JfSBlbHNlIHsKLQkJR01OX0RCRygiJXM6JWRdIG5vIGlucHV0IHJldHVybiBidWZmZXJcbiIsIF9fZnVuY19fLAotCQkJX19MSU5FX18pOwotCQlyYyA9IC0xOwotCX0KLQotCWJ1Zl9vdXQgPSBtc21fZ2VtaW5pX3Ffb3V0KCZwZ21uX2Rldi0+aW5wdXRfYnVmX3EpOwotCi0JaWYgKGJ1Zl9vdXQpIHsKLQkJcmMgPSBtc21fZ2VtaW5pX2NvcmVfZmVfYnVmX3VwZGF0ZShidWZfb3V0KTsKLQkJa2ZyZWUoYnVmX291dCk7Ci0JCW1zbV9nZW1pbmlfY29yZV9mZV9zdGFydCgpOwotCX0gZWxzZSB7Ci0JCUdNTl9EQkcoIiVzOiVkXSBubyBpbnB1dCBidWZmZXJcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJjID0gLTI7Ci0JfQotCi0JaWYgKGJ1Zl9pbikKLQkJcmMgPSBtc21fZ2VtaW5pX3Ffd2FrZXVwKCZwZ21uX2Rldi0+aW5wdXRfcnRuX3EpOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2dlbWluaV9pbnB1dF9nZXQoc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlICpwZ21uX2Rldiwgdm9pZCBfX3VzZXIgKiB0bykKLXsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9jb3JlX2J1ZiAqYnVmX3A7Ci0Jc3RydWN0IG1zbV9nZW1pbmlfYnVmIGJ1Zl9jbWQ7Ci0KLQlHTU5fREJHKCIlczolZF0gRW50ZXJcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JbXNtX2dlbWluaV9xX3dhaXQoJnBnbW5fZGV2LT5pbnB1dF9ydG5fcSk7Ci0JYnVmX3AgPSBtc21fZ2VtaW5pX3Ffb3V0KCZwZ21uX2Rldi0+aW5wdXRfcnRuX3EpOwotCi0JaWYgKCFidWZfcCkgewotCQlHTU5fREJHKCIlczolZF0gbm8gaW5wdXQgYnVmZmVyIHJldHVyblxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQotCWJ1Zl9jbWQgPSBidWZfcC0+dmJ1ZjsKLQlpZiAocGdtbl9kZXYtPm9wX21vZGUgPT0gTVNNX0dFTUlOSV9NT0RFX09GRkxJTkVfRU5DT0RFIHx8Ci0JCXBnbW5fZGV2LT5vcF9tb2RlID09IE1TTV9HRU1JTklfTU9ERV9PRkZMSU5FX1JPVEFUSU9OKSB7Ci0JCW1zbV9nZW1pbmlfcGxhdGZvcm1fcDJ2KGJ1Zl9wLT5maWxlLCAmYnVmX3AtPmhhbmRsZSk7Ci0JfQotCWtmcmVlKGJ1Zl9wKTsKLQotCUdNTl9EQkcoIiVzOiVkXSAweCUwOHggJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJKGludCkgYnVmX2NtZC52YWRkciwgYnVmX2NtZC55X2xlbik7Ci0KLQlpZiAoY29weV90b191c2VyKHRvLCAmYnVmX2NtZCwgc2l6ZW9mKGJ1Zl9jbWQpKSkgewotCQlHTU5fUFJfRVJSKCIlczolZF1cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgbXNtX2dlbWluaV9pbnB1dF9nZXRfdW5ibG9jayhzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKnBnbW5fZGV2KQotewotCUdNTl9EQkcoIiVzOiVkXSBFbnRlclxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQltc21fZ2VtaW5pX3FfdW5ibG9jaygmcGdtbl9kZXYtPmlucHV0X3J0bl9xKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IG1zbV9nZW1pbmlfaW5wdXRfYnVmX2VucXVldWUoc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlICpwZ21uX2RldiwKLQl2b2lkIF9fdXNlciAqYXJnKQotewotCXN0cnVjdCBtc21fZ2VtaW5pX2NvcmVfYnVmICpidWZfcDsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9idWYgYnVmX2NtZDsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fYnVzX3NjYWxlX3BkYXRhICpwX2J1c19zY2FsZV9kYXRhID0gTlVMTDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmX2NtZCwgYXJnLCBzaXplb2Yoc3RydWN0IG1zbV9nZW1pbmlfYnVmKSkpIHsKLQkJR01OX1BSX0VSUigiJXM6JWRdIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JYnVmX3AgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2dlbWluaV9jb3JlX2J1ZiksIEdGUF9BVE9NSUMpOwotCWlmICghYnVmX3ApIHsKLQkJR01OX1BSX0VSUigiJXM6JWRdIG5vIG1lbVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCUdNTl9EQkcoIiVzOiVkXSAweCUwOHggJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJKGludCkgYnVmX2NtZC52YWRkciwgYnVmX2NtZC55X2xlbik7Ci0KLQlpZiAocGdtbl9kZXYtPm9wX21vZGUgPT0gTVNNX0dFTUlOSV9NT0RFX1JFQUxUSU1FX0VOQ09ERSkgewotCQlyYyA9IG1zbV9pb21tdV9tYXBfY29udGlnX2J1ZmZlcigKLQkJCSh1bnNpZ25lZCBsb25nKWJ1Zl9jbWQueV9vZmYsIENBTUVSQV9ET01BSU4sIEdFTl9QT09MLAotCQkJKChidWZfY21kLnlfbGVuICsgYnVmX2NtZC5jYmNyX2xlbiArIDQwOTUpICYgKH40MDk1KSksCi0JCQlTWl80SywgSU9NTVVfV1JJVEUgfCBJT01NVV9SRUFELAotCQkJKHVuc2lnbmVkIGxvbmcgKikmYnVmX3AtPnlfYnVmZmVyX2FkZHIpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzIGlvbW11IG1hcHBpbmcgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsCi0JCQkJIF9fZnVuY19fLCByYyk7Ci0JCQlrZnJlZShidWZfcCk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9IGVsc2UgewotCQlidWZfcC0+eV9idWZmZXJfYWRkciAgICA9IG1zbV9nZW1pbmlfcGxhdGZvcm1fdjJwKGJ1Zl9jbWQuZmQsCi0JCQlidWZfY21kLnlfbGVuICsgYnVmX2NtZC5jYmNyX2xlbiwgJmJ1Zl9wLT5maWxlLAotCQkJJmJ1Zl9wLT5oYW5kbGUpCSsgYnVmX2NtZC5vZmZzZXQgKyBidWZfY21kLnlfb2ZmOwotCX0KLQlidWZfcC0+eV9sZW4gICAgICAgICAgPSBidWZfY21kLnlfbGVuOwotCi0JYnVmX3AtPmNiY3JfYnVmZmVyX2FkZHIgPSBidWZfcC0+eV9idWZmZXJfYWRkciArIGJ1Zl9jbWQueV9sZW4gKwotCQkJCQlidWZfY21kLmNiY3Jfb2ZmOwotCWJ1Zl9wLT5jYmNyX2xlbiAgICAgICA9IGJ1Zl9jbWQuY2Jjcl9sZW47Ci0JYnVmX3AtPm51bV9vZl9tY3Vfcm93cyA9IGJ1Zl9jbWQubnVtX29mX21jdV9yb3dzOwotCUdNTl9EQkcoIiVzOiB5X2FkZHI9JXgseV9sZW49JXgsY2Jjcl9hZGRyPSV4LGNiY3JfbGVuPSV4XG4iLCBfX2Z1bmNfXywKLQkJYnVmX3AtPnlfYnVmZmVyX2FkZHIsIGJ1Zl9wLT55X2xlbiwgYnVmX3AtPmNiY3JfYnVmZmVyX2FkZHIsCi0JCWJ1Zl9wLT5jYmNyX2xlbik7Ci0KLQlpZiAoIWJ1Zl9wLT55X2J1ZmZlcl9hZGRyIHx8ICFidWZfcC0+Y2Jjcl9idWZmZXJfYWRkcikgewotCQlHTU5fUFJfRVJSKCIlczolZF0gdjJwIHdyb25nXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlrZnJlZShidWZfcCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JYnVmX3AtPnZidWYgICAgICAgICAgID0gYnVmX2NtZDsKLQlidWZfcC0+dmJ1Zi50eXBlICAgICAgPSBNU01fR0VNSU5JX0VWVF9SRVNFVDsKLQotCS8qIFNldCBidXMgdmVjdG9ycyAqLwotCXBfYnVzX3NjYWxlX2RhdGEgPSAoc3RydWN0IG1zbV9idXNfc2NhbGVfcGRhdGEgKikKLQkJcGdtbl9kZXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmIChwZ21uX2Rldi0+YnVzX3BlcmZfY2xpZW50ICYmCi0JCShNU01fR01OX09VVE1PREVfU0lOR0xFID09IHBnbW5fZGV2LT5vdXRfbW9kZSkpIHsKLQkJaW50IHJjOwotCQlzdHJ1Y3QgbXNtX2J1c19wYXRocyAqcGF0aCA9ICYocF9idXNfc2NhbGVfZGF0YS0+dXNlY2FzZVsxXSk7Ci0JCUdNTl9EQkcoIiVzOiVkXSBVcGRhdGUgYnVzIGJhbmR3aWR0aCIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWlmIChwZ21uX2Rldi0+b3BfbW9kZSAmIE1TTV9HRU1JTklfTU9ERV9PRkZMSU5FX0VOQ09ERSkgewotCQkJcGF0aC0+dmVjdG9yc1swXS5hYiA9IChidWZfcC0+eV9sZW4gKyBidWZfcC0+Y2Jjcl9sZW4pICoKLQkJCQkxNSAqIDI7Ci0JCQlwYXRoLT52ZWN0b3JzWzBdLmliID0gcGF0aC0+dmVjdG9yc1swXS5hYjsKLQkJCXBhdGgtPnZlY3RvcnNbMV0uYWIgPSAwOwotCQkJcGF0aC0+dmVjdG9yc1sxXS5pYiA9IDA7Ci0JCX0KLQkJcmMgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdCgKLQkJCXBnbW5fZGV2LT5idXNfcGVyZl9jbGllbnQsIDEpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlHTU5fUFJfRVJSKCIlczolZF0gdXBkYXRlX3JlcXVlc3QgZmFpbHMgJWQiLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmMpOwotCQl9Ci0JfQotCi0JbXNtX2dlbWluaV9xX2luKCZwZ21uX2Rldi0+aW5wdXRfYnVmX3EsIGJ1Zl9wKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgbXNtX2dlbWluaV9pcnEoaW50IGV2ZW50LCB2b2lkICpjb250ZXh0LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBtc21fZ2VtaW5pX2RldmljZSAqcGdtbl9kZXYgPQotCQkoc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlICopIGNvbnRleHQ7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBNU01fR0VNSU5JX0hXX01BU0tfQ09NUF9GUkFNRURPTkU6Ci0JCW1zbV9nZW1pbmlfZnJhbWVkb25lX2lycShwZ21uX2RldiwgZGF0YSk7Ci0JCW1zbV9nZW1pbmlfd2VfcGluZ3BvbmdfaXJxKHBnbW5fZGV2LCBkYXRhKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9HRU1JTklfSFdfTUFTS19DT01QX0ZFOgotCQltc21fZ2VtaW5pX2ZlX3Bpbmdwb25nX2lycShwZ21uX2RldiwgZGF0YSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fR0VNSU5JX0hXX01BU0tfQ09NUF9XRToKLQkJbXNtX2dlbWluaV93ZV9waW5ncG9uZ19pcnEocGdtbl9kZXYsIGRhdGEpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0dFTUlOSV9IV19NQVNLX0NPTVBfUkVTRVRfQUNLOgotCQltc21fZ2VtaW5pX3Jlc2V0X2Fja19pcnEocGdtbl9kZXYpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0dFTUlOSV9IV19NQVNLX0NPTVBfRVJSOgotCWRlZmF1bHQ6Ci0JCW1zbV9nZW1pbmlfZXJyX2lycShwZ21uX2RldiwgZXZlbnQpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IF9fbXNtX2dlbWluaV9vcGVuKHN0cnVjdCBtc21fZ2VtaW5pX2RldmljZSAqcGdtbl9kZXYpCi17Ci0JaW50IHJjOwotCXN0cnVjdCBtc21fYnVzX3NjYWxlX3BkYXRhICpwX2J1c19zY2FsZV9kYXRhID0KLQkJKHN0cnVjdCBtc21fYnVzX3NjYWxlX3BkYXRhICopcGdtbl9kZXYtPnBkZXYtPmRldi4KLQkJCXBsYXRmb3JtX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZwZ21uX2Rldi0+bG9jayk7Ci0JaWYgKHBnbW5fZGV2LT5vcGVuX2NvdW50KSB7Ci0JCS8qIG9ubHkgb3BlbiBvbmNlICovCi0JCUdNTl9QUl9FUlIoIiVzOiVkXSBidXN5XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQltdXRleF91bmxvY2soJnBnbW5fZGV2LT5sb2NrKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JcGdtbl9kZXYtPm9wZW5fY291bnQrKzsKLQltdXRleF91bmxvY2soJnBnbW5fZGV2LT5sb2NrKTsKLQotCW1zbV9nZW1pbmlfY29yZV9pcnFfaW5zdGFsbChtc21fZ2VtaW5pX2lycSk7Ci0JcmMgPSBtc21fZ2VtaW5pX3BsYXRmb3JtX2luaXQocGdtbl9kZXYtPnBkZXYsCi0JCSZwZ21uX2Rldi0+bWVtLCAmcGdtbl9kZXYtPmJhc2UsCi0JCSZwZ21uX2Rldi0+aXJxLCBtc21fZ2VtaW5pX2NvcmVfaXJxLCBwZ21uX2Rldik7Ci0JaWYgKHJjKSB7Ci0JCUdNTl9QUl9FUlIoIiVzOiVkXSBwbGF0Zm9ybV9pbml0IGZhaWwgJWRcbiIsIF9fZnVuY19fLAotCQkJX19MSU5FX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCUdNTl9EQkcoIiVzOiVkXSBwbGF0Zm9ybSByZXNvdXJjZXMgLSBtZW0gJXAsIGJhc2UgJXAsIGlycSAlZFxuIiwKLQkJX19mdW5jX18sIF9fTElORV9fLAotCQlwZ21uX2Rldi0+bWVtLCBwZ21uX2Rldi0+YmFzZSwgcGdtbl9kZXYtPmlycSk7Ci0KLQltc21fZ2VtaW5pX3FfY2xlYW51cCgmcGdtbl9kZXYtPmV2dF9xKTsKLQltc21fZ2VtaW5pX3FfY2xlYW51cCgmcGdtbl9kZXYtPm91dHB1dF9ydG5fcSk7Ci0JbXNtX2dlbWluaV9vdXRidWZfcV9jbGVhbnVwKCZwZ21uX2Rldi0+b3V0cHV0X2J1Zl9xKTsKLQltc21fZ2VtaW5pX3FfY2xlYW51cCgmcGdtbl9kZXYtPmlucHV0X3J0bl9xKTsKLQltc21fZ2VtaW5pX3FfY2xlYW51cCgmcGdtbl9kZXYtPmlucHV0X2J1Zl9xKTsKLQltc21fZ2VtaW5pX2NvcmVfaW5pdCgpOwotCXBnbW5fZGV2LT5vdXRfbW9kZSA9IE1TTV9HTU5fT1VUTU9ERV9GUkFHTUVOVEVEOwotCXBnbW5fZGV2LT5vdXRfYnVmX3NldCA9IDA7Ci0JcGdtbl9kZXYtPm91dF9vZmZzZXQgPSAwOwotCXBnbW5fZGV2LT5tYXhfb3V0X3NpemUgPSBnX21heF9vdXRfc2l6ZTsKLQlwZ21uX2Rldi0+b3V0X2ZyYWdfY250ID0gMDsKLQlwZ21uX2Rldi0+YnVzX3BlcmZfY2xpZW50ID0gMDsKLQotCWlmIChwX2J1c19zY2FsZV9kYXRhKSB7Ci0JCUdNTl9EQkcoIiVzOiVkXSByZWdpc3RlciBidXMgY2xpZW50IiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcGdtbl9kZXYtPmJ1c19wZXJmX2NsaWVudCA9Ci0JCQltc21fYnVzX3NjYWxlX3JlZ2lzdGVyX2NsaWVudChwX2J1c19zY2FsZV9kYXRhKTsKLQkJaWYgKCFwZ21uX2Rldi0+YnVzX3BlcmZfY2xpZW50KSB7Ci0JCQlHTU5fUFJfRVJSKCIlczolZF0gYnVzIGNsaWVudCByZWdpc3RlciBmYWlsZWQiLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQlHTU5fREJHKCIlczolZF0gc3VjY2Vzc1xuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBfX21zbV9nZW1pbmlfcmVsZWFzZShzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKnBnbW5fZGV2KQotewotCUdNTl9EQkcoIiVzOiVkXSBFbnRlclxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQltdXRleF9sb2NrKCZwZ21uX2Rldi0+bG9jayk7Ci0JaWYgKCFwZ21uX2Rldi0+b3Blbl9jb3VudCkgewotCQlHTU5fUFJfRVJSKEtFUk5fRVJSICIlczogbm90IG9wZW5lZFxuIiwgX19mdW5jX18pOwotCQltdXRleF91bmxvY2soJnBnbW5fZGV2LT5sb2NrKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXBnbW5fZGV2LT5vcGVuX2NvdW50LS07Ci0JbXV0ZXhfdW5sb2NrKCZwZ21uX2Rldi0+bG9jayk7Ci0KLQlpZiAocGdtbl9kZXYtPm91dF9tb2RlID09IE1TTV9HTU5fT1VUTU9ERV9GUkFHTUVOVEVEKSB7Ci0JCW1zbV9nZW1pbmlfY29yZV9yZWxlYXNlKHJlbGVhc2VfYnVmKTsKLQl9IGVsc2UgaWYgKHBnbW5fZGV2LT5vdXRfYnVmX3NldCkgewotCQltc21fZ2VtaW5pX3BsYXRmb3JtX3AydihwZ21uX2Rldi0+b3V0X2J1Zi5maWxlLAotCQkJJnBnbW5fZGV2LT5vdXRfYnVmLmhhbmRsZSk7Ci0JfQotCW1zbV9nZW1pbmlfcV9jbGVhbnVwKCZwZ21uX2Rldi0+ZXZ0X3EpOwotCW1zbV9nZW1pbmlfcV9jbGVhbnVwKCZwZ21uX2Rldi0+b3V0cHV0X3J0bl9xKTsKLQltc21fZ2VtaW5pX291dGJ1Zl9xX2NsZWFudXAoJnBnbW5fZGV2LT5vdXRwdXRfYnVmX3EpOwotCW1zbV9nZW1pbmlfcV9jbGVhbnVwKCZwZ21uX2Rldi0+aW5wdXRfcnRuX3EpOwotCW1zbV9nZW1pbmlfb3V0YnVmX3FfY2xlYW51cCgmcGdtbl9kZXYtPmlucHV0X2J1Zl9xKTsKLQotCWlmIChwZ21uX2Rldi0+YnVzX3BlcmZfY2xpZW50KSB7Ci0JCW1zbV9idXNfc2NhbGVfdW5yZWdpc3Rlcl9jbGllbnQocGdtbl9kZXYtPmJ1c19wZXJmX2NsaWVudCk7Ci0JCXBnbW5fZGV2LT5idXNfcGVyZl9jbGllbnQgPSAwOwotCX0KLQotCWlmIChwZ21uX2Rldi0+b3Blbl9jb3VudCkKLQkJR01OX1BSX0VSUihLRVJOX0VSUiAiJXM6IG11bHRpcGxlIG9wZW5zXG4iLCBfX2Z1bmNfXyk7Ci0KLQltc21fZ2VtaW5pX3BsYXRmb3JtX3JlbGVhc2UocGdtbl9kZXYtPm1lbSwgcGdtbl9kZXYtPmJhc2UsCi0JCXBnbW5fZGV2LT5pcnEsIHBnbW5fZGV2KTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgbXNtX2dlbWluaV9pb2N0bF9od19jbWQoc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlICpwZ21uX2RldiwKLQl2b2lkICogX191c2VyIGFyZykKLXsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9od19jbWQgaHdfY21kOwotCWludCBpc19jb3B5X3RvX3VzZXI7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmh3X2NtZCwgYXJnLCBzaXplb2Yoc3RydWN0IG1zbV9nZW1pbmlfaHdfY21kKSkpIHsKLQkJR01OX1BSX0VSUigiJXM6JWRdIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaXNfY29weV90b191c2VyID0gbXNtX2dlbWluaV9od19leGVjX2NtZHMoJmh3X2NtZCwgMSk7Ci0JR01OX0RCRygiJXM6JWRdIHR5cGUgJWQsIG4gJWQsIG9mZnNldCAlZCwgbWFzayAleCwgZGF0YSAleCwgcGRhdGEgJXhcbiIsCi0JCV9fZnVuY19fLCBfX0xJTkVfXywgaHdfY21kLnR5cGUsIGh3X2NtZC5uLCBod19jbWQub2Zmc2V0LAotCQlod19jbWQubWFzaywgaHdfY21kLmRhdGEsIChpbnQpIGh3X2NtZC5wZGF0YSk7Ci0KLQlpZiAoaXNfY29weV90b191c2VyID49IDApIHsKLQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZod19jbWQsIHNpemVvZihod19jbWQpKSkgewotCQkJR01OX1BSX0VSUigiJXM6JWRdIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fZ2VtaW5pX2lvY3RsX2h3X2NtZHMoc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlICpwZ21uX2RldiwKLQl2b2lkICogX191c2VyIGFyZykKLXsKLQlpbnQgaXNfY29weV90b191c2VyOwotCXVpbnQzMl90IGxlbjsKLQl1aW50MzJfdCBtOwotCXN0cnVjdCBtc21fZ2VtaW5pX2h3X2NtZHMgKmh3X2NtZHNfcDsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9od19jbWQgKmh3X2NtZF9wOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZtLCBhcmcsIHNpemVvZihtKSkpIHsKLQkJR01OX1BSX0VSUigiJXM6JWRdIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaWYgKChtID09IDApIHx8IChtID4gKChVSU5UMzJfTUFYIC0gc2l6ZW9mKHN0cnVjdCBtc21fZ2VtaW5pX2h3X2NtZHMpKSAvCi0JCXNpemVvZihzdHJ1Y3QgbXNtX2dlbWluaV9od19jbWQpKSkpIHsKLQkJR01OX1BSX0VSUigiJXM6JWRdIG1fY21kcyBvdXQgb2YgcmFuZ2VcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCWxlbiA9IHNpemVvZihzdHJ1Y3QgbXNtX2dlbWluaV9od19jbWRzKSArCi0JCXNpemVvZihzdHJ1Y3QgbXNtX2dlbWluaV9od19jbWQpICogKG0gLSAxKTsKLQlod19jbWRzX3AgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFod19jbWRzX3ApIHsKLQkJR01OX1BSX0VSUigiJXM6JWRdIG5vIG1lbSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBsZW4pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoaHdfY21kc19wLCBhcmcsIGxlbikpIHsKLQkJR01OX1BSX0VSUigiJXM6JWRdIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJa2ZyZWUoaHdfY21kc19wKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaHdfY21kX3AgPSAoc3RydWN0IG1zbV9nZW1pbmlfaHdfY21kICopICYoaHdfY21kc19wLT5od19jbWQpOwotCi0JaXNfY29weV90b191c2VyID0gbXNtX2dlbWluaV9od19leGVjX2NtZHMoaHdfY21kX3AsIG0pOwotCi0JaWYgKGlzX2NvcHlfdG9fdXNlciA+PSAwKSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJnLCBod19jbWRzX3AsIGxlbikpIHsKLQkJCUdNTl9QUl9FUlIoIiVzOiVkXSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlrZnJlZShod19jbWRzX3ApOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0Ja2ZyZWUoaHdfY21kc19wKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IG1zbV9nZW1pbmlfc3RhcnQoc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlICpwZ21uX2Rldiwgdm9pZCAqIF9fdXNlciBhcmcpCi17Ci0Jc3RydWN0IG1zbV9nZW1pbmlfY29yZV9idWYgKmJ1Zl9vdXQ7Ci0Jc3RydWN0IG1zbV9nZW1pbmlfY29yZV9idWYgKmJ1Zl9vdXRfZnJlZVsyXSA9IHtOVUxMLCBOVUxMfTsKLQlpbnQgaSwgcmM7Ci0KLQlHTU5fREJHKCIlczolZF0gRW50ZXJcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0KLQlyZWxlYXNlX2J1ZiA9IDE7Ci0JZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQlidWZfb3V0ID0gbXNtX2dlbWluaV9xX291dCgmcGdtbl9kZXYtPmlucHV0X2J1Zl9xKTsKLQotCQlpZiAoYnVmX291dCkgewotCQkJbXNtX2dlbWluaV9jb3JlX2ZlX2J1Zl91cGRhdGUoYnVmX291dCk7Ci0JCQlrZnJlZShidWZfb3V0KTsKLQkJfSBlbHNlIHsKLQkJCUdNTl9EQkcoIiVzOiVkXSBubyBpbnB1dCBidWZmZXJcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChwZ21uX2Rldi0+b3V0X21vZGUgPT0gTVNNX0dNTl9PVVRNT0RFX0ZSQUdNRU5URUQpIHsKLQkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQkJYnVmX291dF9mcmVlW2ldID0KLQkJCQltc21fZ2VtaW5pX3Ffb3V0KCZwZ21uX2Rldi0+b3V0cHV0X2J1Zl9xKTsKLQotCQkJaWYgKGJ1Zl9vdXRfZnJlZVtpXSkgewotCQkJCW1zbV9nZW1pbmlfY29yZV93ZV9idWZfdXBkYXRlKGJ1Zl9vdXRfZnJlZVtpXSk7Ci0JCQl9IGVsc2UgaWYgKGkgPT0gMSkgewotCQkJCS8qIHNldCB0aGUgcG9uZyB0byBzYW1lIGFkZHJlc3MgYXMgcGluZyAqLwotCQkJCWJ1Zl9vdXRfZnJlZVswXS0+eV9sZW4gPj49IDE7Ci0JCQkJYnVmX291dF9mcmVlWzBdLT55X2J1ZmZlcl9hZGRyICs9Ci0JCQkJCWJ1Zl9vdXRfZnJlZVswXS0+eV9sZW47Ci0JCQkJbXNtX2dlbWluaV9jb3JlX3dlX2J1Zl91cGRhdGUoYnVmX291dF9mcmVlWzBdKTsKLQkJCQkvKgotCQkJCSAqIHNpbmNlIHBpbmcgYW5kIHBvbmcgYXJlIHNhbWUgYnVmCi0JCQkJICogcmVsZWFzZSBvbmx5IG9uY2UKLQkJCQkgKi8KLQkJCQlyZWxlYXNlX2J1ZiA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCUdNTl9EQkcoIiVzOiVkXSBubyBvdXRwdXQgYnVmZmVyXG4iLAotCQkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JCQlrZnJlZShidWZfb3V0X2ZyZWVbaV0pOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBtc21fZ2VtaW5pX2NvcmVfYnVmIG91dF9idWY7Ci0JCS8qCi0JCSAqIFNpbmNlIHRoZSBzYW1lIGJ1ZmZlciBpcyBmcmFnbWVudGVkLCBwMnYgbmVlZCBub3QgYmUKLQkJICogY2FsbGVkIGZvciBhbGwgdGhlIGJ1ZmZlcnMKLQkJICovCi0JCXJlbGVhc2VfYnVmID0gMDsKLQkJaWYgKCFwZ21uX2Rldi0+b3V0X2J1Zl9zZXQpIHsKLQkJCUdNTl9QUl9FUlIoIiVzOiVkXSBvdXRwdXQgYnVmZmVyIG5vdCBzZXQiLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQkvKiBjb25maWd1cmUgcGluZyAqLwotCQlyYyA9IG1zbV9nZW1pbmlfZ2V0X291dF9idWZmZXIocGdtbl9kZXYsICZvdXRfYnVmKTsKLQkJaWYgKHJjKSB7Ci0JCQlHTU5fUFJfRVJSKCIlczolZF0gbm8gb3V0cHV0IGJ1ZmZlciBmb3IgcGluZyIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJldHVybiByYzsKLQkJfQotCQltc21fZ2VtaW5pX2NvcmVfd2VfYnVmX3VwZGF0ZSgmb3V0X2J1Zik7Ci0JCS8qIGNvbmZpZ3VyZSBwb25nICovCi0JCXJjID0gbXNtX2dlbWluaV9nZXRfb3V0X2J1ZmZlcihwZ21uX2RldiwgJm91dF9idWYpOwotCQlpZiAocmMpIHsKLQkJCUdNTl9EQkcoIiVzOiVkXSBubyBvdXRwdXQgYnVmZmVyIGZvciBwb25nIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJLyogZmFsbCB0aHJvdWdoIHRvIGNvbmZpZ3VyZSBzYW1lIGJ1ZmZlciAqLwotCQl9Ci0JCW1zbV9nZW1pbmlfY29yZV93ZV9idWZfdXBkYXRlKCZvdXRfYnVmKTsKLQkJbXNtX2dlbWluaV9pb19kdW1wKDB4MTUwKTsKLQl9Ci0KLQlyYyA9IG1zbV9nZW1pbmlfaW9jdGxfaHdfY21kcyhwZ21uX2RldiwgYXJnKTsKLQlHTU5fREJHKCIlczolZF1cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2dlbWluaV9pb2N0bF9yZXNldChzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKnBnbW5fZGV2LAotCXZvaWQgKiBfX3VzZXIgYXJnKQotewotCWludCByYzsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9jdHJsX2NtZCBjdHJsX2NtZDsKLQotCUdNTl9EQkcoIiVzOiVkXSBFbnRlclxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoJmN0cmxfY21kLCBhcmcsIHNpemVvZihjdHJsX2NtZCkpKSB7Ci0JCUdNTl9QUl9FUlIoIiVzOiVkXSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXBnbW5fZGV2LT5vcF9tb2RlID0gY3RybF9jbWQudHlwZTsKLQotCXJjID0gbXNtX2dlbWluaV9jb3JlX3Jlc2V0KHBnbW5fZGV2LT5vcF9tb2RlLCBwZ21uX2Rldi0+YmFzZSwKLQkJcmVzb3VyY2Vfc2l6ZShwZ21uX2Rldi0+bWVtKSk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2dlbWluaV9pb2N0bF9zZXRfb3V0bW9kZShzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKnBnbW5fZGV2LAotCXZvaWQgKiBfX3VzZXIgYXJnKQotewotCWludCByYyA9IDA7Ci0JZW51bSBtc21fZ21uX291dF9tb2RlIG1vZGU7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJm1vZGUsIGFyZywgc2l6ZW9mKG1vZGUpKSkgewotCQlHTU5fUFJfRVJSKCIlczolZF0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JR01OX0RCRygiJXM6JWRdIG1vZGUgJWQiLCBfX2Z1bmNfXywgX19MSU5FX18sIG1vZGUpOwotCi0JaWYgKChtb2RlID09IE1TTV9HTU5fT1VUTU9ERV9GUkFHTUVOVEVEKQotCQl8fCAobW9kZSA9PSBNU01fR01OX09VVE1PREVfU0lOR0xFKSkKLQkJcGdtbl9kZXYtPm91dF9tb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWxvbmcgX19tc21fZ2VtaW5pX2lvY3RsKHN0cnVjdCBtc21fZ2VtaW5pX2RldmljZSAqcGdtbl9kZXYsCi0JdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50IHJjID0gMDsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgTVNNX0dNTl9JT0NUTF9HRVRfSFdfVkVSU0lPTjoKLQkJR01OX0RCRygiJXM6JWRdIFZFUlNJT04gMVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmMgPSBtc21fZ2VtaW5pX2lvY3RsX2h3X2NtZChwZ21uX2RldiwgKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fR01OX0lPQ1RMX1JFU0VUOgotCQlyYyA9IG1zbV9nZW1pbmlfaW9jdGxfcmVzZXQocGdtbl9kZXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0dNTl9JT0NUTF9TVE9QOgotCQlyYyA9IG1zbV9nZW1pbmlfaW9jdGxfaHdfY21kcyhwZ21uX2RldiwgKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fR01OX0lPQ1RMX1NUQVJUOgotCQlyYyA9IG1zbV9nZW1pbmlfc3RhcnQocGdtbl9kZXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0dNTl9JT0NUTF9JTlBVVF9CVUZfRU5RVUVVRToKLQkJcmMgPSBtc21fZ2VtaW5pX2lucHV0X2J1Zl9lbnF1ZXVlKHBnbW5fZGV2LAotCQkJKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fR01OX0lPQ1RMX0lOUFVUX0dFVDoKLQkJcmMgPSBtc21fZ2VtaW5pX2lucHV0X2dldChwZ21uX2RldiwgKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fR01OX0lPQ1RMX0lOUFVUX0dFVF9VTkJMT0NLOgotCQlyYyA9IG1zbV9nZW1pbmlfaW5wdXRfZ2V0X3VuYmxvY2socGdtbl9kZXYpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0dNTl9JT0NUTF9PVVRQVVRfQlVGX0VOUVVFVUU6Ci0JCWlmIChwZ21uX2Rldi0+b3V0X21vZGUgPT0gTVNNX0dNTl9PVVRNT0RFX0ZSQUdNRU5URUQpCi0JCQlyYyA9IG1zbV9nZW1pbmlfb3V0cHV0X2J1Zl9lbnF1ZXVlKHBnbW5fZGV2LAotCQkJCSh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQllbHNlCi0JCQlyYyA9IG1zbV9nZW1pbmlfc2V0X291dHB1dF9idWYocGdtbl9kZXYsCi0JCQkJKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fR01OX0lPQ1RMX09VVFBVVF9HRVQ6Ci0JCXJjID0gbXNtX2dlbWluaV9vdXRwdXRfZ2V0KHBnbW5fZGV2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9HTU5fSU9DVExfT1VUUFVUX0dFVF9VTkJMT0NLOgotCQlyYyA9IG1zbV9nZW1pbmlfb3V0cHV0X2dldF91bmJsb2NrKHBnbW5fZGV2KTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9HTU5fSU9DVExfRVZUX0dFVDoKLQkJcmMgPSBtc21fZ2VtaW5pX2V2dF9nZXQocGdtbl9kZXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0dNTl9JT0NUTF9FVlRfR0VUX1VOQkxPQ0s6Ci0JCXJjID0gbXNtX2dlbWluaV9ldnRfZ2V0X3VuYmxvY2socGdtbl9kZXYpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0dNTl9JT0NUTF9IV19DTUQ6Ci0JCXJjID0gbXNtX2dlbWluaV9pb2N0bF9od19jbWQocGdtbl9kZXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0dNTl9JT0NUTF9IV19DTURTOgotCQlyYyA9IG1zbV9nZW1pbmlfaW9jdGxfaHdfY21kcyhwZ21uX2RldiwgKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fR01OX0lPQ1RMX1NFVF9NT0RFOgotCQlyYyA9IG1zbV9nZW1pbmlfaW9jdGxfc2V0X291dG1vZGUocGdtbl9kZXYsICh2b2lkIF9fdXNlciAqKWFyZyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJR01OX1BSX0VSUihLRVJOX0lORk8gIiVzOiVkXSBjbWQgPSAlZCBub3Qgc3VwcG9ydGVkXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fLCBfSU9DX05SKGNtZCkpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0cnVjdCBtc21fZ2VtaW5pX2RldmljZSAqX19tc21fZ2VtaW5pX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKnBnbW5fZGV2OwotCi0JcGdtbl9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBnbW5fZGV2KSB7Ci0JCUdNTl9QUl9FUlIoIiVzOiVkXW5vIG1lbVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JbXV0ZXhfaW5pdCgmcGdtbl9kZXYtPmxvY2spOwotCi0JcGdtbl9kZXYtPnBkZXYgPSBwZGV2OwotCi0JbXNtX2dlbWluaV9xX2luaXQoImV2dF9xIiwgJnBnbW5fZGV2LT5ldnRfcSk7Ci0JbXNtX2dlbWluaV9xX2luaXQoIm91dHB1dF9ydG5fcSIsICZwZ21uX2Rldi0+b3V0cHV0X3J0bl9xKTsKLQltc21fZ2VtaW5pX3FfaW5pdCgib3V0cHV0X2J1Zl9xIiwgJnBnbW5fZGV2LT5vdXRwdXRfYnVmX3EpOwotCW1zbV9nZW1pbmlfcV9pbml0KCJpbnB1dF9ydG5fcSIsICZwZ21uX2Rldi0+aW5wdXRfcnRuX3EpOwotCW1zbV9nZW1pbmlfcV9pbml0KCJpbnB1dF9idWZfcSIsICZwZ21uX2Rldi0+aW5wdXRfYnVmX3EpOwotCi0JcmV0dXJuIHBnbW5fZGV2OwotfQotCi1pbnQgX19tc21fZ2VtaW5pX2V4aXQoc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlICpwZ21uX2RldikKLXsKLQltdXRleF9kZXN0cm95KCZwZ21uX2Rldi0+bG9jayk7Ci0Ja2ZyZWUocGdtbl9kZXYpOwotCXJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfc3luYy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2dlbWluaS9tc21fZ2VtaW5pX3N5bmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhlOTYxNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZ2VtaW5pL21zbV9nZW1pbmlfc3luYy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLDIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBNU01fR0VNSU5JX1NZTkNfSAotI2RlZmluZSBNU01fR0VNSU5JX1NZTkNfSAotCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KLSNpbmNsdWRlICJtc21fZ2VtaW5pX2NvcmUuaCIKLQotI2RlZmluZSBHRU1JTklfN1ggMHgxCi0jZGVmaW5lIEdFTUlOSV84WDYwICgweDEgPDwgMSkKLSNkZWZpbmUgR0VNSU5JXzg5NjAgKDB4MSA8PCAyKQotCi1zdHJ1Y3QgbXNtX2dlbWluaV9xIHsKLQljaGFyIGNvbnN0CSpuYW1lOwotCXN0cnVjdCBsaXN0X2hlYWQgIHE7Ci0Jc3BpbmxvY2tfdAlsY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlpbnQJICAgICAgIHVuYmxjazsKLX07Ci0KLXN0cnVjdCBtc21fZ2VtaW5pX3FfZW50cnkgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQl2b2lkICAgKmRhdGE7Ci19OwotCi1zdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0Jc3RydWN0IHJlc291cmNlICAgICAgICAqbWVtOwotCWludCAgICAgICAgICAgICAgICAgICAgIGlycTsKLQl2b2lkICAgICAgICAgICAgICAgICAgICpiYXNlOwotCXN0cnVjdCBjbGsgKmdlbWluaV9jbGtbM107Ci0Jc3RydWN0IHJlZ3VsYXRvciAqZ2VtaW5pX2ZzOwotCXVpbnQzMl90IGh3X3ZlcnNpb247Ci0KLQlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7Ci0Jc3RydWN0IGNkZXYgICBjZGV2OwotCXN0cnVjdCBtdXRleCAgbG9jazsKLQljaGFyCSAgb3Blbl9jb3VudDsKLQl1aW50OF90ICAgICAgIG9wX21vZGU7Ci0KLQkvKiBldmVudCBxdWV1ZSBpbmNsdWRpbmcgZnJhbWUgZG9uZSAmIGVyciBpbmRpY2F0aW9ucwotCSAqLwotCXN0cnVjdCBtc21fZ2VtaW5pX3EgZXZ0X3E7Ci0KLQkvKiBvdXRwdXQgcmV0dXJuIHF1ZXVlCi0JICovCi0Jc3RydWN0IG1zbV9nZW1pbmlfcSBvdXRwdXRfcnRuX3E7Ci0KLQkvKiBvdXRwdXQgYnVmIHF1ZXVlCi0JICovCi0Jc3RydWN0IG1zbV9nZW1pbmlfcSBvdXRwdXRfYnVmX3E7Ci0KLQkvKiBpbnB1dCByZXR1cm4gcXVldWUKLQkgKi8KLQlzdHJ1Y3QgbXNtX2dlbWluaV9xIGlucHV0X3J0bl9xOwotCi0JLyogaW5wdXQgYnVmIHF1ZXVlCi0JICovCi0Jc3RydWN0IG1zbV9nZW1pbmlfcSBpbnB1dF9idWZfcTsKLQotCXN0cnVjdCB2NGwyX3N1YmRldiBzdWJkZXY7Ci0JZW51bSBtc21fZ21uX291dF9tb2RlIG91dF9tb2RlOwotCi0JLyogc2luZ2xlIG91dCBtb2RlIHBhcmFtZXRlcnMgKi8KLQlzdHJ1Y3QgbXNtX2dlbWluaV9od19idWYgb3V0X2J1ZjsKLQlpbnQgb3V0X29mZnNldDsKLQlpbnQgb3V0X2J1Zl9zZXQ7Ci0JaW50IG1heF9vdXRfc2l6ZTsKLQlpbnQgb3V0X2ZyYWdfY250OwotCi0JdWludDMyX3QgYnVzX3BlcmZfY2xpZW50OwotfTsKLQotaW50IF9fbXNtX2dlbWluaV9vcGVuKHN0cnVjdCBtc21fZ2VtaW5pX2RldmljZSAqcGdtbl9kZXYpOwotaW50IF9fbXNtX2dlbWluaV9yZWxlYXNlKHN0cnVjdCBtc21fZ2VtaW5pX2RldmljZSAqcGdtbl9kZXYpOwotCi1sb25nIF9fbXNtX2dlbWluaV9pb2N0bChzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKnBnbW5fZGV2LAotCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLQotc3RydWN0IG1zbV9nZW1pbmlfZGV2aWNlICpfX21zbV9nZW1pbmlfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKLWludCBfX21zbV9nZW1pbmlfZXhpdChzdHJ1Y3QgbXNtX2dlbWluaV9kZXZpY2UgKnBnbW5fZGV2KTsKLQotI2VuZGlmIC8qIE1TTV9HRU1JTklfU1lOQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW14MDcyLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW14MDcyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZDIxMTguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lteDA3Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4NCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgImlteDA3Mi5oIgotCi0vKiBTRU5TT1IgUkVHSVNURVIgREVGSU5FUyAqLwotI2RlZmluZSBSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRAkJMHgwMTA0Ci0jZGVmaW5lIEdST1VQRURfUEFSQU1FVEVSX0hPTERfT0ZGCQkweDAwCi0jZGVmaW5lIEdST1VQRURfUEFSQU1FVEVSX0hPTEQJCQkweDAxCi0vKiBJbnRlZ3JhdGlvbiBUaW1lICovCi0jZGVmaW5lIFJFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRQkJMHgwMjAyCi0vKiBHYWluICovCi0jZGVmaW5lIFJFR19HTE9CQUxfR0FJTgkJCQkJMHgwMjA0Ci0KLS8qIFBMTCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUkVHX0ZSQU1FX0xFTkdUSF9MSU5FUwkJCTB4MDM0MAotI2RlZmluZSBSRUdfTElORV9MRU5HVEhfUENLCQkJCTB4MDM0MgotCi0vKiAxNmJpdCBhZGRyZXNzIC0gOCBiaXQgY29udGV4dCByZWdpc3RlciBzdHJ1Y3R1cmUgKi8KLSNkZWZpbmUgUTggIDB4MDAwMDAxMDAKLSNkZWZpbmUgUTEwIDB4MDAwMDA0MDAKLSNkZWZpbmUgSU1YMDcyX01BU1RFUl9DTEtfUkFURSAyNDAwMDAwMAotI2RlZmluZSBJTVgwNzJfT0ZGU0VUCQkzCi0KLS8qIEFGIFRvdGFsIHN0ZXBzIHBhcmFtZXRlcnMgKi8KLSNkZWZpbmUgSU1YMDcyX0FGX0kyQ19BRERSCTB4MTgKLSNkZWZpbmUgSU1YMDcyX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSICAgIDMwCi0KLXN0YXRpYyB1aW50MTZfdCBpbXgwNzJfc3RlcF9wb3NpdGlvbl90YWJsZVtJTVgwNzJfVE9UQUxfU1RFUFNfTkVBUl9UT19GQVIrMV07Ci1zdGF0aWMgdWludDE2X3QgaW14MDcyX25sX3JlZ2lvbl9ib3VuZGFyeTE7Ci1zdGF0aWMgdWludDE2X3QgaW14MDcyX25sX3JlZ2lvbl9jb2RlX3Blcl9zdGVwMTsKLXN0YXRpYyB1aW50MTZfdCBpbXgwNzJfbF9yZWdpb25fY29kZV9wZXJfc3RlcCA9IDEyOwotc3RhdGljIHVpbnQxNl90IGlteDA3Ml9zd19kYW1waW5nX3RpbWVfd2FpdCA9IDg7Ci1zdGF0aWMgdWludDE2X3QgaW14MDcyX2FmX2luaXRpYWxfY29kZSA9IDM1MDsKLXN0YXRpYyB1aW50MTZfdCBpbXgwNzJfZGFtcGluZ190aHJlc2hvbGQgPSAxMDsKLQotc3RydWN0IGlteDA3Ml93b3JrX3QgewotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotfTsKLQotc3RhdGljIHN0cnVjdCBpbXgwNzJfd29ya190ICppbXgwNzJfc2Vuc29ydzsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqaW14MDcyX2NsaWVudDsKLQotc3RydWN0IGlteDA3Ml9jdHJsX3QgewotCWNvbnN0IHN0cnVjdCAgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2Vuc29yZGF0YTsKLQotCXVpbnQzMl90IHNlbnNvcm1vZGU7Ci0JdWludDMyX3QgZnBzX2RpdmlkZXI7LyogaW5pdCB0byAxICogMHgwMDAwMDQwMCAqLwotCXVpbnQzMl90IHBpY3RfZnBzX2RpdmlkZXI7LyogaW5pdCB0byAxICogMHgwMDAwMDQwMCAqLwotCXVpbnQxNl90IGZwczsKLQotCXVpbnQxNl90IGN1cnJfbGVuc19wb3M7Ci0JdWludDE2X3QgY3Vycl9zdGVwX3BvczsKLQl1aW50MTZfdCBteV9yZWdfZ2FpbjsKLQl1aW50MzJfdCBteV9yZWdfbGluZV9jb3VudDsKLQl1aW50MTZfdCB0b3RhbF9saW5lc19wZXJfZnJhbWU7Ci0KLQllbnVtIGlteDA3Ml9yZXNvbHV0aW9uX3QgcHJldl9yZXM7Ci0JZW51bSBpbXgwNzJfcmVzb2x1dGlvbl90IHBpY3RfcmVzOwotCWVudW0gaW14MDcyX3Jlc29sdXRpb25fdCBjdXJyX3JlczsKLQllbnVtIGlteDA3Ml90ZXN0X21vZGVfdCAgc2V0X3Rlc3Q7Ci0JZW51bSBpbXgwNzJfY2FtX21vZGVfdCBjYW1fbW9kZTsKLX07Ci0KLXN0YXRpYyB1aW50MTZfdCBwcmV2X2xpbmVfbGVuZ3RoX3BjazsKLXN0YXRpYyB1aW50MTZfdCBwcmV2X2ZyYW1lX2xlbmd0aF9saW5lczsKLXN0YXRpYyB1aW50MTZfdCBzbmFwX2xpbmVfbGVuZ3RoX3BjazsKLXN0YXRpYyB1aW50MTZfdCBzbmFwX2ZyYW1lX2xlbmd0aF9saW5lczsKLQotc3RhdGljIGJvb2wgQ1NJX0NPTkZJRzsKLXN0YXRpYyBzdHJ1Y3QgaW14MDcyX2N0cmxfdCAqaW14MDcyX2N0cmw7Ci1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoaW14MDcyX3dhaXRfcXVldWUpOwotREVGSU5FX01VVEVYKGlteDA3Ml9tdXQpOwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgaW50IGNhbV9kZWJ1Z19pbml0KHZvaWQpOwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfYmFzZTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGlteDA3Ml9pMmNfcnhkYXRhKHVuc2lnbmVkIHNob3J0IHNhZGRyLAotCXVuc2lnbmVkIGNoYXIgKnJ4ZGF0YSwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7Ci0JCXsKLQkJCS5hZGRyICA9IHNhZGRyLAotCQkJLmZsYWdzID0gMCwKLQkJCS5sZW4gICA9IGxlbmd0aCwKLQkJCS5idWYgICA9IHJ4ZGF0YSwKLQkJfSwKLQkJewotCQkJLmFkZHIgID0gc2FkZHIsCi0JCQkuZmxhZ3MgPSBJMkNfTV9SRCwKLQkJCS5sZW4gICA9IGxlbmd0aCwKLQkJCS5idWYgICA9IHJ4ZGF0YSwKLQkJfSwKLQl9OwotCWlmIChpMmNfdHJhbnNmZXIoaW14MDcyX2NsaWVudC0+YWRhcHRlciwgbXNncywgMikgPCAwKSB7Ci0JCXByX2VycigiaW14MDcyX2kyY19yeGRhdGEgZmFpbGQgMHgleFxuIiwgc2FkZHIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IGlteDA3Ml9pMmNfdHhkYXRhKHVuc2lnbmVkIHNob3J0IHNhZGRyLAotCQkJCXVuc2lnbmVkIGNoYXIgKnR4ZGF0YSwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKLQkJewotCQkJLmFkZHIgPSBzYWRkciwKLQkJCS5mbGFncyA9IDAsCi0JCQkubGVuID0gbGVuZ3RoLAotCQkJLmJ1ZiA9IHR4ZGF0YSwKLQkJIH0sCi0JfTsKLQlpZiAoaTJjX3RyYW5zZmVyKGlteDA3Ml9jbGllbnQtPmFkYXB0ZXIsIG1zZywgMSkgPCAwKSB7Ci0JCXByX2VycigiaW14MDcyX2kyY190eGRhdGEgZmFpbGQgMHgleFxuIiwgc2FkZHIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgaW14MDcyX2kyY19yZWFkKHVuc2lnbmVkIHNob3J0IHJhZGRyLAotCXVuc2lnbmVkIHNob3J0ICpyZGF0YSwgaW50IHJsZW4pCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JdW5zaWduZWQgY2hhciBidWZbMl07Ci0JaWYgKCFyZGF0YSkKLQkJcmV0dXJuIC1FSU87Ci0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9IChyYWRkciAmIDB4RkYwMCkgPj4gODsKLQlidWZbMV0gPSAocmFkZHIgJiAweDAwRkYpOwotCXJjID0gaW14MDcyX2kyY19yeGRhdGEoaW14MDcyX2NsaWVudC0+YWRkcj4+MSwgYnVmLCBybGVuKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiaW14MDcyX2kyY19yZWFkIDB4JXggZmFpbGVkIVxuIiwgcmFkZHIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCSpyZGF0YSA9IChybGVuID09IDIgPyBidWZbMF0gPDwgOCB8IGJ1ZlsxXSA6IGJ1ZlswXSk7Ci0JQ0RCRygiaW14MDcyX2kyY19yZWFkIDB4JXggdmFsID0gMHgleCFcbiIsIHJhZGRyLCAqcmRhdGEpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgaW14MDcyX2kyY193cml0ZV93X3NlbnNvcih1bnNpZ25lZCBzaG9ydCB3YWRkciwKLQl1aW50MTZfdCB3ZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gLUVGQVVMVDsKLQl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gKHdhZGRyICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlsxXSA9ICh3YWRkciAmIDB4MDBGRik7Ci0JYnVmWzJdID0gKHdkYXRhICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlszXSA9ICh3ZGF0YSAmIDB4MDBGRik7Ci0JQ0RCRygiaTJjX3dyaXRlX2IgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIHdhZGRyLCB3ZGF0YSk7Ci0JcmMgPSBpbXgwNzJfaTJjX3R4ZGF0YShpbXgwNzJfY2xpZW50LT5hZGRyPj4xLCBidWYsIDQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCJpMmNfd3JpdGVfYiBmYWlsZWQsIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4IVxuIiwKLQkJCXdhZGRyLCB3ZGF0YSk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgaW14MDcyX2kyY193cml0ZV9iX3NlbnNvcih1bnNpZ25lZCBzaG9ydCB3YWRkciwKLQl1aW50OF90IGJkYXRhKQotewotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCXVuc2lnbmVkIGNoYXIgYnVmWzNdOwotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZbMF0gPSAod2FkZHIgJiAweEZGMDApID4+IDg7Ci0JYnVmWzFdID0gKHdhZGRyICYgMHgwMEZGKTsKLQlidWZbMl0gPSBiZGF0YTsKLQlDREJHKCJpMmNfd3JpdGVfYiBhZGRyID0gMHgleCwgdmFsID0gMHgleFxuIiwgd2FkZHIsIGJkYXRhKTsKLQlyYyA9IGlteDA3Ml9pMmNfdHhkYXRhKGlteDA3Ml9jbGllbnQtPmFkZHI+PjEsIGJ1ZiwgMyk7Ci0JaWYgKHJjIDwgMCkKLQkJcHJfZXJyKCJpMmNfd3JpdGVfYiBmYWlsZWQsIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4IVxuIiwKLQkJCXdhZGRyLCBiZGF0YSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBpbXgwNzJfaTJjX3dyaXRlX2JfYWYodWludDhfdCBtc2IsIHVpbnQ4X3QgbHNiKQotewotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCXVuc2lnbmVkIGNoYXIgYnVmWzJdOwotCi0JYnVmWzBdID0gbXNiOwotCWJ1ZlsxXSA9IGxzYjsKLQlyYyA9IGlteDA3Ml9pMmNfdHhkYXRhKElNWDA3Ml9BRl9JMkNfQUREUj4+MSwgYnVmLCAyKTsKLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoImFmX2kyY193cml0ZSBmYWllbGQgbXNiID0gMHgleCBsc2IgPSAweCV4IiwKLQkJCW1zYiwgbHNiKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IGlteDA3Ml9pMmNfd3JpdGVfd190YWJsZShzdHJ1Y3QgaW14MDcyX2kyY19yZWdfY29uZiBjb25zdAotCQkJCQkgKnJlZ19jb25mX3RibCwgaW50IG51bSkKLXsKLQlpbnQgaTsKLQlpbnQzMl90IHJjID0gLUVJTzsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJcmMgPSBpbXgwNzJfaTJjX3dyaXRlX2Jfc2Vuc29yKHJlZ19jb25mX3RibC0+d2FkZHIsCi0JCQlyZWdfY29uZl90YmwtPndkYXRhKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlyZWdfY29uZl90YmwrKzsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBpbXgwNzJfZ3JvdXBfaG9sZF9vbih2b2lkKQotewotCWlteDA3Ml9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJCQlHUk9VUEVEX1BBUkFNRVRFUl9IT0xEKTsKLX0KLQotc3RhdGljIHZvaWQgaW14MDcyX2dyb3VwX2hvbGRfb2ZmKHZvaWQpCi17Ci0JaW14MDcyX2kyY193cml0ZV9iX3NlbnNvcihSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQkJCUdST1VQRURfUEFSQU1FVEVSX0hPTERfT0ZGKTsKLX0KLQotc3RhdGljIHZvaWQgaW14MDcyX3N0YXJ0X3N0cmVhbSh2b2lkKQotewotCWlteDA3Ml9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwMTAwLCAweDAxKTsKLX0KLQotc3RhdGljIHZvaWQgaW14MDcyX3N0b3Bfc3RyZWFtKHZvaWQpCi17Ci0JaW14MDcyX2kyY193cml0ZV9iX3NlbnNvcigweDAxMDAsIDB4MDApOwotfQotCi1zdGF0aWMgdm9pZCBpbXgwNzJfZ2V0X3BpY3RfZnBzKHVpbnQxNl90IGZwcywgdWludDE2X3QgKnBmcHMpCi17Ci0JLyogaW5wdXQgZnBzIGlzIHByZXZpZXcgZnBzIGluIFE4IGZvcm1hdCAqLwotCXVpbnQzMl90IGRpdmlkZXIsIGQxLCBkMjsKLQotCWQxID0gcHJldl9mcmFtZV9sZW5ndGhfbGluZXMgKiAweDAwMDAwNDAwIC8gc25hcF9mcmFtZV9sZW5ndGhfbGluZXM7Ci0JZDIgPSBwcmV2X2xpbmVfbGVuZ3RoX3BjayAqIDB4MDAwMDA0MDAgLyBzbmFwX2xpbmVfbGVuZ3RoX3BjazsKLQlkaXZpZGVyID0gZDEgKiBkMiAvIDB4NDAwOwotCi0JLypWZXJpZnkgUENMSyBzZXR0aW5ncyBhbmQgZnJhbWUgc2l6ZXMuKi8KLQkqcGZwcyA9ICh1aW50MTZfdCkgKGZwcyAqIGRpdmlkZXIgLyAweDQwMCk7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBpbXgwNzJfZ2V0X3ByZXZfbGluZXNfcGYodm9pZCkKLXsKLQlyZXR1cm4gcHJldl9mcmFtZV9sZW5ndGhfbGluZXM7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBpbXgwNzJfZ2V0X3ByZXZfcGl4ZWxzX3BsKHZvaWQpCi17Ci0JcmV0dXJuIHByZXZfbGluZV9sZW5ndGhfcGNrOwotfQotCi1zdGF0aWMgdWludDE2X3QgaW14MDcyX2dldF9waWN0X2xpbmVzX3BmKHZvaWQpCi17Ci0JcmV0dXJuIHNuYXBfZnJhbWVfbGVuZ3RoX2xpbmVzOwotfQotCi1zdGF0aWMgdWludDE2X3QgaW14MDcyX2dldF9waWN0X3BpeGVsc19wbCh2b2lkKQotewotCXJldHVybiBzbmFwX2xpbmVfbGVuZ3RoX3BjazsKLX0KLQotc3RhdGljIHVpbnQzMl90IGlteDA3Ml9nZXRfcGljdF9tYXhfZXhwX2xjKHZvaWQpCi17Ci0JcmV0dXJuIHNuYXBfZnJhbWVfbGVuZ3RoX2xpbmVzICAqIDI0OwotfQotCi1zdGF0aWMgaW50MzJfdCBpbXgwNzJfc2V0X2ZwcyhzdHJ1Y3QgZnBzX2NmZyAgICpmcHMpCi17Ci0JdWludDE2X3QgdG90YWxfbGluZXNfcGVyX2ZyYW1lOwotCWludDMyX3QgcmMgPSAwOwotCXRvdGFsX2xpbmVzX3Blcl9mcmFtZSA9ICh1aW50MTZfdCkKLQkJKChwcmV2X2ZyYW1lX2xlbmd0aF9saW5lcyAqCi0JCWlteDA3Ml9jdHJsLT5mcHNfZGl2aWRlcikvMHg0MDApOwotCWlteDA3Ml9jdHJsLT5mcHNfZGl2aWRlciA9IGZwcy0+ZnBzX2RpdjsKLQlpbXgwNzJfY3RybC0+cGljdF9mcHNfZGl2aWRlciA9IGZwcy0+cGljdF9mcHNfZGl2OwotCi0JaW14MDcyX2dyb3VwX2hvbGRfb24oKTsKLQlyYyA9IGlteDA3Ml9pMmNfd3JpdGVfd19zZW5zb3IoUkVHX0ZSQU1FX0xFTkdUSF9MSU5FUywKLQkJCQkJCQl0b3RhbF9saW5lc19wZXJfZnJhbWUpOwotCWlteDA3Ml9ncm91cF9ob2xkX29mZigpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgaW14MDcyX3dyaXRlX2V4cF9nYWluKHVpbnQxNl90IGdhaW4sIHVpbnQzMl90IGxpbmUpCi17Ci0JdWludDMyX3QgZmxfbGluZXMgPSAwOwotCXVpbnQ4X3Qgb2Zmc2V0OwotCWludDMyX3QgcmMgPSAwOwotCWlmIChpbXgwNzJfY3RybC0+Y3Vycl9yZXMgPT0gaW14MDcyX2N0cmwtPnByZXZfcmVzKQotCQlmbF9saW5lcyA9IHByZXZfZnJhbWVfbGVuZ3RoX2xpbmVzOwotCWVsc2UgaWYgKGlteDA3Ml9jdHJsLT5jdXJyX3JlcyA9PSBpbXgwNzJfY3RybC0+cGljdF9yZXMpCi0JCWZsX2xpbmVzID0gc25hcF9mcmFtZV9sZW5ndGhfbGluZXM7Ci0JbGluZSA9IChsaW5lICogaW14MDcyX2N0cmwtPmZwc19kaXZpZGVyKSAvIFExMDsKLQlvZmZzZXQgPSBJTVgwNzJfT0ZGU0VUOwotCWlmIChsaW5lID4gKGZsX2xpbmVzIC0gb2Zmc2V0KSkKLQkJZmxfbGluZXMgPSBsaW5lICsgb2Zmc2V0OwotCi0JaW14MDcyX2dyb3VwX2hvbGRfb24oKTsKLQlyYyA9IGlteDA3Ml9pMmNfd3JpdGVfd19zZW5zb3IoUkVHX0ZSQU1FX0xFTkdUSF9MSU5FUywgZmxfbGluZXMpOwotCXJjID0gaW14MDcyX2kyY193cml0ZV93X3NlbnNvcihSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUUsIGxpbmUpOwotCXJjID0gaW14MDcyX2kyY193cml0ZV93X3NlbnNvcihSRUdfR0xPQkFMX0dBSU4sIGdhaW4pOwotCWlteDA3Ml9ncm91cF9ob2xkX29mZigpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgaW14MDcyX3NldF9waWN0X2V4cF9nYWluKHVpbnQxNl90IGdhaW4sIHVpbnQzMl90IGxpbmUpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JcmMgPSBpbXgwNzJfd3JpdGVfZXhwX2dhaW4oZ2FpbiwgbGluZSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBpbXgwNzJfc2Vuc29yX3NldHRpbmcoaW50IHVwZGF0ZV90eXBlLCBpbnQgcnQpCi17Ci0KLQlpbnQzMl90IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9jc2lfcGFyYW1zIGlteDA3Ml9jc2lfcGFyYW1zOwotCi0JaW14MDcyX3N0b3Bfc3RyZWFtKCk7Ci0JbXNsZWVwKDMwKTsKLQlpZiAodXBkYXRlX3R5cGUgPT0gUkVHX0lOSVQpIHsKLQkJbXNsZWVwKDIwKTsKLQkJQ1NJX0NPTkZJRyA9IDA7Ci0JCWlteDA3Ml9pMmNfd3JpdGVfd190YWJsZShpbXgwNzJfcmVncy5yZWNfc2V0dGluZ3MsCi0JCQlpbXgwNzJfcmVncy5yZWNfc2l6ZSk7Ci0JfSBlbHNlIGlmICh1cGRhdGVfdHlwZSA9PSBVUERBVEVfUEVSSU9ESUMpIHsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQkJY2FtX2RlYnVnX2luaXQoKTsKLSNlbmRpZgotCQltc2xlZXAoMjApOwotCQlpZiAoIUNTSV9DT05GSUcpIHsKLQkJCWlteDA3Ml9jc2lfcGFyYW1zLmxhbmVfY250ID0gMjsKLQkJCWlteDA3Ml9jc2lfcGFyYW1zLmRhdGFfZm9ybWF0ID0gQ1NJXzEwQklUOwotCQkJaW14MDcyX2NzaV9wYXJhbXMubGFuZV9hc3NpZ24gPSAweGU0OwotCQkJaW14MDcyX2NzaV9wYXJhbXMuZHBjbV9zY2hlbWUgPSAwOwotCQkJaW14MDcyX2NzaV9wYXJhbXMuc2V0dGxlX2NudCA9IDB4MTg7Ci0JCQltc21fY2FtaW9fdmZlX2Nsa19yYXRlX3NldCgxOTIwMDAwMDApOwotCQkJcmMgPSBtc21fY2FtaW9fY3NpX2NvbmZpZygmaW14MDcyX2NzaV9wYXJhbXMpOwotCQkJbXNsZWVwKDEwMCk7Ci0JCQlDU0lfQ09ORklHID0gMTsKLQkJfQotCQlpbXgwNzJfaTJjX3dyaXRlX3dfdGFibGUoCi0JCQlpbXgwNzJfcmVncy5jb25mX2FycmF5W3J0XS5jb25mLAotCQkJaW14MDcyX3JlZ3MuY29uZl9hcnJheVtydF0uc2l6ZSk7Ci0JCWlteDA3Ml9zdGFydF9zdHJlYW0oKTsKLQkJbXNsZWVwKDMwKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBpbXgwNzJfdmlkZW9fY29uZmlnKGludCBtb2RlKQotewotCi0JaW50MzJfdCByYyA9IDA7Ci0JLyogY2hhbmdlIHNlbnNvciByZXNvbHV0aW9uIGlmIG5lZWRlZCAqLwotCWlmIChpbXgwNzJfc2Vuc29yX3NldHRpbmcoVVBEQVRFX1BFUklPRElDLAotCQlpbXgwNzJfY3RybC0+cHJldl9yZXMpIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaW14MDcyX2N0cmwtPmN1cnJfcmVzID0gaW14MDcyX2N0cmwtPnByZXZfcmVzOwotCWlteDA3Ml9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IGlteDA3Ml9zbmFwc2hvdF9jb25maWcoaW50IG1vZGUpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JLypjaGFuZ2Ugc2Vuc29yIHJlc29sdXRpb24gaWYgbmVlZGVkICovCi0JaWYgKGlteDA3Ml9jdHJsLT5jdXJyX3JlcyAhPSBpbXgwNzJfY3RybC0+cGljdF9yZXMpIHsKLQkJaWYgKGlteDA3Ml9zZW5zb3Jfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsCi0JCQkJCWlteDA3Ml9jdHJsLT5waWN0X3JlcykgPCAwKQotCQkJcmV0dXJuIHJjOwotCX0KLQotCWlteDA3Ml9jdHJsLT5jdXJyX3JlcyA9IGlteDA3Ml9jdHJsLT5waWN0X3JlczsKLQlpbXgwNzJfY3RybC0+c2Vuc29ybW9kZSA9IG1vZGU7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBpbXgwNzJfcmF3X3NuYXBzaG90X2NvbmZpZyhpbnQgbW9kZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQkvKiBjaGFuZ2Ugc2Vuc29yIHJlc29sdXRpb24gaWYgbmVlZGVkICovCi0JaWYgKGlteDA3Ml9jdHJsLT5jdXJyX3JlcyAhPSBpbXgwNzJfY3RybC0+cGljdF9yZXMpIHsKLQkJaWYgKGlteDA3Ml9zZW5zb3Jfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsCi0JCQkJCWlteDA3Ml9jdHJsLT5waWN0X3JlcykgPCAwKQotCQkJcmV0dXJuIHJjOwotCX0KLQotCWlteDA3Ml9jdHJsLT5jdXJyX3JlcyA9IGlteDA3Ml9jdHJsLT5waWN0X3JlczsKLQlpbXgwNzJfY3RybC0+c2Vuc29ybW9kZSA9IG1vZGU7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBpbXgwNzJfbW9kZV9pbml0KGludCBtb2RlLCBzdHJ1Y3Qgc2Vuc29yX2luaXRfY2ZnIGluaXRfaW5mbykKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlDREJHKCIlczogJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JaWYgKG1vZGUgIT0gaW14MDcyX2N0cmwtPmNhbV9tb2RlKSB7Ci0JCWlteDA3Ml9jdHJsLT5wcmV2X3JlcyA9IGluaXRfaW5mby5wcmV2X3JlczsKLQkJaW14MDcyX2N0cmwtPnBpY3RfcmVzID0gaW5pdF9pbmZvLnBpY3RfcmVzOwotCQlpbXgwNzJfY3RybC0+Y2FtX21vZGUgPSBtb2RlOwotCi0JCXByZXZfZnJhbWVfbGVuZ3RoX2xpbmVzID0KLQkJCWlteDA3Ml9yZWdzLmNvbmZfYXJyYXlbaW14MDcyX2N0cmwtPnByZXZfcmVzXS4KLQkJCWNvbmZbSU1YMDcyX0ZSQU1FX0xFTkdUSF9MSU5FU19ISV0ud2RhdGEgPDwgOCB8Ci0JCQlpbXgwNzJfcmVncy5jb25mX2FycmF5W2lteDA3Ml9jdHJsLT5wcmV2X3Jlc10uCi0JCQljb25mW0lNWDA3Ml9GUkFNRV9MRU5HVEhfTElORVNfTE9dLndkYXRhOwotCQlwcmV2X2xpbmVfbGVuZ3RoX3BjayA9Ci0JCQlpbXgwNzJfcmVncy5jb25mX2FycmF5W2lteDA3Ml9jdHJsLT5wcmV2X3Jlc10uCi0JCQljb25mW0lNWDA3Ml9MSU5FX0xFTkdUSF9QQ0tfSEldLndkYXRhIDw8IDggfAotCQkJaW14MDcyX3JlZ3MuY29uZl9hcnJheVtpbXgwNzJfY3RybC0+cHJldl9yZXNdLgotCQkJY29uZltJTVgwNzJfTElORV9MRU5HVEhfUENLX0xPXS53ZGF0YTsKLQkJc25hcF9mcmFtZV9sZW5ndGhfbGluZXMgPQotCQkJaW14MDcyX3JlZ3MuY29uZl9hcnJheVtpbXgwNzJfY3RybC0+cGljdF9yZXNdLgotCQkJY29uZltJTVgwNzJfRlJBTUVfTEVOR1RIX0xJTkVTX0hJXS53ZGF0YSA8PCA4IHwKLQkJCWlteDA3Ml9yZWdzLmNvbmZfYXJyYXlbaW14MDcyX2N0cmwtPnBpY3RfcmVzXS4KLQkJCWNvbmZbSU1YMDcyX0ZSQU1FX0xFTkdUSF9MSU5FU19MT10ud2RhdGE7Ci0JCXNuYXBfbGluZV9sZW5ndGhfcGNrID0KLQkJCWlteDA3Ml9yZWdzLmNvbmZfYXJyYXlbaW14MDcyX2N0cmwtPnBpY3RfcmVzXS4KLQkJCWNvbmZbSU1YMDcyX0xJTkVfTEVOR1RIX1BDS19ISV0ud2RhdGEgPDwgOCB8Ci0JCQlpbXgwNzJfcmVncy5jb25mX2FycmF5W2lteDA3Ml9jdHJsLT5waWN0X3Jlc10uCi0JCQljb25mW0lNWDA3Ml9MSU5FX0xFTkdUSF9QQ0tfTE9dLndkYXRhOwotCi0JCXJjID0gaW14MDcyX3NlbnNvcl9zZXR0aW5nKFJFR19JTklULAotCQkJaW14MDcyX2N0cmwtPnByZXZfcmVzKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBpbXgwNzJfc2V0X3NlbnNvcl9tb2RlKGludCBtb2RlLAotCWludCByZXMpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFNFTlNPUl9QUkVWSUVXX01PREU6Ci0JCWlteDA3Ml9jdHJsLT5wcmV2X3JlcyA9IHJlczsKLQkJcmMgPSBpbXgwNzJfdmlkZW9fY29uZmlnKG1vZGUpOwotCQlicmVhazsKLQljYXNlIFNFTlNPUl9TTkFQU0hPVF9NT0RFOgotCQlpbXgwNzJfY3RybC0+cGljdF9yZXMgPSByZXM7Ci0JCXJjID0gaW14MDcyX3NuYXBzaG90X2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfUkFXX1NOQVBTSE9UX01PREU6Ci0JCWlteDA3Ml9jdHJsLT5waWN0X3JlcyA9IHJlczsKLQkJcmMgPSBpbXgwNzJfcmF3X3NuYXBzaG90X2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0jZGVmaW5lIERJVl9DRUlMKHgsIHkpICgoeC95ICsgKCh4JXkpID8gMSA6IDApKSkKLXN0YXRpYyBpbnQzMl90IGlteDA3Ml9tb3ZlX2ZvY3VzKGludCBkaXJlY3Rpb24sCi0JaW50MzJfdCBudW1fc3RlcHMpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JaW50MTZfdCBzdGVwX2RpcmVjdGlvbiwgZGVzdF9sZW5zX3Bvc2l0aW9uLCBkZXN0X3N0ZXBfcG9zaXRpb247Ci0JdWludDhfdCBjb2RlX3ZhbF9tc2IsIGNvZGVfdmFsX2xzYjsKLQlpbnQxNl90IG5leHRfbGVuc19wb3NpdGlvbiwgdGFyZ2V0X2Rpc3QsIHNtYWxsX3N0ZXA7Ci0KLQlpZiAoZGlyZWN0aW9uID09IE1PVkVfTkVBUikKLQkJc3RlcF9kaXJlY3Rpb24gPSAxOwotCWVsc2UgaWYgKGRpcmVjdGlvbiA9PSBNT1ZFX0ZBUikKLQkJc3RlcF9kaXJlY3Rpb24gPSAtMTsKLQllbHNlIHsKLQkJcHJfZXJyKCJJbGxlZ2FsIGZvY3VzIGRpcmVjdGlvblxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlkZXN0X3N0ZXBfcG9zaXRpb24gPSBpbXgwNzJfY3RybC0+Y3Vycl9zdGVwX3BvcyArCi0JCQkoc3RlcF9kaXJlY3Rpb24gKiBudW1fc3RlcHMpOwotCi0JaWYgKGRlc3Rfc3RlcF9wb3NpdGlvbiA8IDApCi0JCWRlc3Rfc3RlcF9wb3NpdGlvbiA9IDA7Ci0JZWxzZSBpZiAoZGVzdF9zdGVwX3Bvc2l0aW9uID4gSU1YMDcyX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSKQotCQlkZXN0X3N0ZXBfcG9zaXRpb24gPSBJTVgwNzJfVE9UQUxfU1RFUFNfTkVBUl9UT19GQVI7Ci0KLQlpZiAoZGVzdF9zdGVwX3Bvc2l0aW9uID09IGlteDA3Ml9jdHJsLT5jdXJyX3N0ZXBfcG9zKSB7Ci0JCUNEQkcoImlteDA3MiBzYW1lIHBvc2l0aW9uIE5vLU1vdmUgZXhpdFxuIik7Ci0JCXJldHVybiByYzsKLQl9Ci0JQ0RCRygiJXMgSW5kZXggPSBbJWRdXG4iLCBfX2Z1bmNfXywgZGVzdF9zdGVwX3Bvc2l0aW9uKTsKLQotCWRlc3RfbGVuc19wb3NpdGlvbiA9IGlteDA3Ml9zdGVwX3Bvc2l0aW9uX3RhYmxlW2Rlc3Rfc3RlcF9wb3NpdGlvbl07Ci0JQ0RCRygiJXMgbGVuc19wb3NpdGlvbiB2YWx1ZSA9ICVkXG4iLCBfX2Z1bmNfXywgZGVzdF9sZW5zX3Bvc2l0aW9uKTsKLQl0YXJnZXRfZGlzdCA9IHN0ZXBfZGlyZWN0aW9uICogKGRlc3RfbGVuc19wb3NpdGlvbiAtCi0JCWlteDA3Ml9jdHJsLT5jdXJyX2xlbnNfcG9zKTsKLQlpZiAoc3RlcF9kaXJlY3Rpb24gPCAwICYmICh0YXJnZXRfZGlzdCA+PQotCQkoaW14MDcyX3N0ZXBfcG9zaXRpb25fdGFibGVbaW14MDcyX2RhbXBpbmdfdGhyZXNob2xkXQotCQkJLSBpbXgwNzJfYWZfaW5pdGlhbF9jb2RlKSkpIHsKLQkJc21hbGxfc3RlcCA9IERJVl9DRUlMKHRhcmdldF9kaXN0LCAxMCk7Ci0JCWlteDA3Ml9zd19kYW1waW5nX3RpbWVfd2FpdCA9IDMwOwotCX0gZWxzZSB7Ci0JCXNtYWxsX3N0ZXAgPSBESVZfQ0VJTCh0YXJnZXRfZGlzdCwgNCk7Ci0JCWlteDA3Ml9zd19kYW1waW5nX3RpbWVfd2FpdCA9IDIwOwotCX0KLQotCUNEQkcoIiVzOiBzbWFsbF9zdGVwOiVkLCB3YWl0X3RpbWU6JWRcbiIsIF9fZnVuY19fLCBzbWFsbF9zdGVwLAotCQlpbXgwNzJfc3dfZGFtcGluZ190aW1lX3dhaXQpOwotCWZvciAobmV4dF9sZW5zX3Bvc2l0aW9uID0gaW14MDcyX2N0cmwtPmN1cnJfbGVuc19wb3MgKwotCQkoc3RlcF9kaXJlY3Rpb24gKiBzbWFsbF9zdGVwKTsKLQkJKHN0ZXBfZGlyZWN0aW9uICogbmV4dF9sZW5zX3Bvc2l0aW9uKSA8PQotCQkoc3RlcF9kaXJlY3Rpb24gKiBkZXN0X2xlbnNfcG9zaXRpb24pOwotCQluZXh0X2xlbnNfcG9zaXRpb24gKz0gKHN0ZXBfZGlyZWN0aW9uICogc21hbGxfc3RlcCkpIHsKLQotCQljb2RlX3ZhbF9tc2IgPSAoKG5leHRfbGVuc19wb3NpdGlvbiAmIDB4MDNGMCkgPj4gNCk7Ci0JCWNvZGVfdmFsX2xzYiA9ICgobmV4dF9sZW5zX3Bvc2l0aW9uICYgMHgwMDBGKSA8PCA0KTsKLQkJQ0RCRygicG9zaXRpb24gdmFsdWUgPSAlZFxuIiwgbmV4dF9sZW5zX3Bvc2l0aW9uKTsKLQkJQ0RCRygibW92ZWZvY3VzIHZjbV9tc2IgPSAlZFxuIiwgY29kZV92YWxfbXNiKTsKLQkJQ0RCRygibW92ZWZvY3VzIHZjbV9sc2IgPSAlZFxuIiwgY29kZV92YWxfbHNiKTsKLQkJcmMgPSBpbXgwNzJfaTJjX3dyaXRlX2JfYWYoY29kZV92YWxfbXNiLCBjb2RlX3ZhbF9sc2IpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoImlteDA3Ml9tb3ZlX2ZvY3VzIGZhaWxlZCB3cml0aW5nIGkyY1xuIik7Ci0JCQlyZXR1cm4gcmM7Ci0JCQl9Ci0JCWlteDA3Ml9jdHJsLT5jdXJyX2xlbnNfcG9zID0gbmV4dF9sZW5zX3Bvc2l0aW9uOwotCQl1c2xlZXAoaW14MDcyX3N3X2RhbXBpbmdfdGltZV93YWl0KjEwMCk7Ci0JfQotCWlmIChpbXgwNzJfY3RybC0+Y3Vycl9sZW5zX3BvcyAhPSBkZXN0X2xlbnNfcG9zaXRpb24pIHsKLQkJY29kZV92YWxfbXNiID0gKChkZXN0X2xlbnNfcG9zaXRpb24gJiAweDAzRjApID4+IDQpOwotCQljb2RlX3ZhbF9sc2IgPSAoKGRlc3RfbGVuc19wb3NpdGlvbiAmIDB4MDAwRikgPDwgNCk7Ci0JCUNEQkcoInBvc2l0aW9uIHZhbHVlID0gJWRcbiIsIGRlc3RfbGVuc19wb3NpdGlvbik7Ci0JCUNEQkcoIm1vdmVmb2N1cyB2Y21fbXNiID0gJWRcbiIsIGNvZGVfdmFsX21zYik7Ci0JCUNEQkcoIm1vdmVmb2N1cyB2Y21fbHNiID0gJWRcbiIsIGNvZGVfdmFsX2xzYik7Ci0JCXJjID0gaW14MDcyX2kyY193cml0ZV9iX2FmKGNvZGVfdmFsX21zYiwgY29kZV92YWxfbHNiKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCJpbXgwNzJfbW92ZV9mb2N1cyBmYWlsZWQgd3JpdGluZyBpMmNcbiIpOwotCQkJcmV0dXJuIHJjOwotCQkJfQotCQl1c2xlZXAoaW14MDcyX3N3X2RhbXBpbmdfdGltZV93YWl0ICogMTAwKTsKLQl9Ci0JaW14MDcyX2N0cmwtPmN1cnJfbGVuc19wb3MgPSBkZXN0X2xlbnNfcG9zaXRpb247Ci0JaW14MDcyX2N0cmwtPmN1cnJfc3RlcF9wb3MgPSBkZXN0X3N0ZXBfcG9zaXRpb247Ci0JcmV0dXJuIHJjOwotCi19Ci0KLXN0YXRpYyBpbnQzMl90IGlteDA3Ml9pbml0X2ZvY3VzKHZvaWQpCi17Ci0JdWludDhfdCBpOwotCWludDMyX3QgcmMgPSAwOwotCi0JaW14MDcyX3N0ZXBfcG9zaXRpb25fdGFibGVbMF0gPSBpbXgwNzJfYWZfaW5pdGlhbF9jb2RlOwotCWZvciAoaSA9IDE7IGkgPD0gSU1YMDcyX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSOyBpKyspIHsKLQkJaWYgKGkgPD0gaW14MDcyX25sX3JlZ2lvbl9ib3VuZGFyeTEpCi0JCQlpbXgwNzJfc3RlcF9wb3NpdGlvbl90YWJsZVtpXSA9Ci0JCQkJaW14MDcyX3N0ZXBfcG9zaXRpb25fdGFibGVbaS0xXQotCQkJCSsgaW14MDcyX25sX3JlZ2lvbl9jb2RlX3Blcl9zdGVwMTsKLQkJZWxzZQotCQkJaW14MDcyX3N0ZXBfcG9zaXRpb25fdGFibGVbaV0gPQotCQkJCWlteDA3Ml9zdGVwX3Bvc2l0aW9uX3RhYmxlW2ktMV0KLQkJCQkrIGlteDA3Ml9sX3JlZ2lvbl9jb2RlX3Blcl9zdGVwOwotCi0JCWlmIChpbXgwNzJfc3RlcF9wb3NpdGlvbl90YWJsZVtpXSA+IDEwMjMpCi0JCQlpbXgwNzJfc3RlcF9wb3NpdGlvbl90YWJsZVtpXSA9IDEwMjM7Ci0JfQotCWlteDA3Ml9jdHJsLT5jdXJyX2xlbnNfcG9zID0gMDsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgaW14MDcyX3NldF9kZWZhdWx0X2ZvY3VzKHZvaWQpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JdWludDhfdCBjb2RlX3ZhbF9tc2IsIGNvZGVfdmFsX2xzYjsKLQlpbnQxNl90IGRlc3RfbGVuc19wb3NpdGlvbiA9IDA7Ci0KLQlDREJHKCIlcyBJbmRleCA9IFslZF1cbiIsIF9fZnVuY19fLCAwKTsKLQlpZiAoaW14MDcyX2N0cmwtPmN1cnJfc3RlcF9wb3MgIT0gMCkKLQkJcmMgPSBpbXgwNzJfbW92ZV9mb2N1cyhNT1ZFX0ZBUiwKLQkJaW14MDcyX2N0cmwtPmN1cnJfc3RlcF9wb3MpOwotCWVsc2UgewotCQlkZXN0X2xlbnNfcG9zaXRpb24gPSBpbXgwNzJfYWZfaW5pdGlhbF9jb2RlOwotCQljb2RlX3ZhbF9tc2IgPSAoKGRlc3RfbGVuc19wb3NpdGlvbiAmIDB4MDNGMCkgPj4gNCk7Ci0JCWNvZGVfdmFsX2xzYiA9ICgoZGVzdF9sZW5zX3Bvc2l0aW9uICYgMHgwMDBGKSA8PCA0KTsKLQotCQlDREJHKCJwb3NpdGlvbiB2YWx1ZSA9ICVkXG4iLCBkZXN0X2xlbnNfcG9zaXRpb24pOwotCQlDREJHKCJtb3ZlZm9jdXMgdmNtX21zYiA9ICVkXG4iLCBjb2RlX3ZhbF9tc2IpOwotCQlDREJHKCJtb3ZlZm9jdXMgdmNtX2xzYiA9ICVkXG4iLCBjb2RlX3ZhbF9sc2IpOwotCQlyYyA9IGlteDA3Ml9pMmNfd3JpdGVfYl9hZihjb2RlX3ZhbF9tc2IsIGNvZGVfdmFsX2xzYik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiaW14MDcyX3NldF9kZWZhdWx0X2ZvY3VzIGZhaWxlZCB3cml0aW5nIGkyY1xuIik7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQlpbXgwNzJfY3RybC0+Y3Vycl9sZW5zX3BvcyA9IGRlc3RfbGVuc19wb3NpdGlvbjsKLQkJaW14MDcyX2N0cmwtPmN1cnJfc3RlcF9wb3MgPSAwOwotCi0JfQotCXVzbGVlcCg1MDAwKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IGlteDA3Ml9hZl9wb3dlcl9kb3duKHZvaWQpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JaW50MzJfdCBpID0gMDsKLQlpbnQxNl90IGRlc3RfbGVuc19wb3NpdGlvbiA9IGlteDA3Ml9hZl9pbml0aWFsX2NvZGU7Ci0KLQlpZiAoaW14MDcyX2N0cmwtPmN1cnJfbGVuc19wb3MgIT0gMCkgewotCQlyYyA9IGlteDA3Ml9zZXRfZGVmYXVsdF9mb2N1cygpOwotCQlDREJHKCIlcyBhZnRlciBpbXgwNzJfc2V0X2RlZmF1bHRfZm9jdXNcbiIsIF9fZnVuY19fKTsKLQkJbXNsZWVwKDQwKTsKLQkJLyp0byBhdm9pZCB0aGUgc291bmQgZHVyaW5nIHRoZSBwb3dlciBvZmYuCi0JCWJyaW5ncyB0aGUgYWN0dWF0b3IgdG8gbWVjaGFuaWNhbCBpbmZpbml0eSBncmFkdWFsbHkuKi8KLQkJZm9yIChpID0gMDsgaSA8IElNWDA3Ml9UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUjsgaSsrKSB7Ci0JCQlkZXN0X2xlbnNfcG9zaXRpb24gPSBkZXN0X2xlbnNfcG9zaXRpb24gLQotCQkJCShpbXgwNzJfYWZfaW5pdGlhbF9jb2RlIC8KLQkJCQkJSU1YMDcyX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSKTsKLQkJCUNEQkcoInBvc2l0aW9uIHZhbHVlID0gJWRcbiIsIGRlc3RfbGVuc19wb3NpdGlvbik7Ci0JCQlyYyA9IGlteDA3Ml9pMmNfd3JpdGVfYl9hZigKLQkJCQkoKGRlc3RfbGVuc19wb3NpdGlvbiAmIDB4MDNGMCkgPj4gNCksCi0JCQkJKChkZXN0X2xlbnNfcG9zaXRpb24gJiAweDAwMEYpIDw8IDQpKTsKLQkJCUNEQkcoImNvdW50ID0gJWRcbiIsIGkpOwotCQkJbXNsZWVwKDIwKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoImlteDA3Ml9zZXRfZGVmYXVsdF9mb2N1cyBmYWlsZWQgd3JpdGluZyBpMmNcbiIpOwotCQkJCXJldHVybiByYzsKLQkJCX0KLQkJfQotCQlyYyA9IGlteDA3Ml9pMmNfd3JpdGVfYl9hZigweDAwLCAwMCk7Ci0JCW1zbGVlcCg0MCk7Ci0JfQotCXJjID0gaW14MDcyX2kyY193cml0ZV9iX2FmKDB4ODAsIDAwKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IGlteDA3Ml9wb3dlcl9kb3duKHZvaWQpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlyYyA9IGlteDA3Ml9hZl9wb3dlcl9kb3duKCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGlteDA3Ml9wcm9iZV9pbml0X2RvbmUoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JcHJfZXJyKCJwcm9iZSBkb25lXG4iKTsKLQlncGlvX2ZyZWUoZGF0YS0+c2Vuc29yX3Jlc2V0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpbXgwNzJfcHJvYmVfaW5pdF9zZW5zb3IoCi0JY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JdWludDE2X3QgY2hpcGlkID0gMDsKLQotCUNEQkcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlyYyA9IGdwaW9fcmVxdWVzdChkYXRhLT5zZW5zb3JfcmVzZXQsICJpbXgwNzIiKTsKLQlDREJHKCIgaW14MDcyX3Byb2JlX2luaXRfc2Vuc29yXG4iKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2Vycigic2Vuc29yX3Jlc2V0ID0gJWRcbiIsIHJjKTsKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JCW1zbGVlcCg1MCk7Ci0JCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGRhdGEtPnNlbnNvcl9yZXNldCwgMSk7Ci0JCW1zbGVlcCgyMCk7Ci0JfSBlbHNlCi0JCWdvdG8gZ3Bpb19yZXFfZmFpbDsKLQotCUNEQkcoIiBpbXgwNzJfcHJvYmVfaW5pdF9zZW5zb3IgaXMgY2FsbGVkXG4iKTsKLQlyYyA9IGlteDA3Ml9pMmNfcmVhZCgweDAsICZjaGlwaWQsIDIpOwotCUNEQkcoIklEOiAlZFxuIiwgY2hpcGlkKTsKLQkvKiA0LiBDb21wYXJlIHNlbnNvciBJRCB0byBJTVgwNzIgSUQ6ICovCi0JaWYgKGNoaXBpZCAhPSAweDAwNDUpIHsKLQkJcmMgPSAtRU5PREVWOwotCQlwcl9lcnIoImlteDA3Ml9wcm9iZV9pbml0X3NlbnNvciBjaGlwIGlkIGRvZXNub3QgbWF0Y2hcbiIpOwotCQlnb3RvIGluaXRfcHJvYmVfZmFpbDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci1pbml0X3Byb2JlX2ZhaWw6Ci0JcHJfZXJyKCIgaW14MDcyX3Byb2JlX2luaXRfc2Vuc29yIGZhaWxzXG4iKTsKLQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCWlteDA3Ml9wcm9iZV9pbml0X2RvbmUoZGF0YSk7Ci0JaWYgKGRhdGEtPnZjbV9lbmFibGUpIHsKLQkJaW50IHJldCA9IGdwaW9fcmVxdWVzdChkYXRhLT52Y21fcHdkLCAiaW14MDcyX2FmIik7Ci0JCWlmICghcmV0KSB7Ci0JCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+dmNtX3B3ZCwgMCk7Ci0JCQltc2xlZXAoMjApOwotCQkJZ3Bpb19mcmVlKGRhdGEtPnZjbV9wd2QpOwotCQl9Ci0JfQotZ3Bpb19yZXFfZmFpbDoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBpbXgwNzJfc2Vuc29yX29wZW5faW5pdChjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCUNEQkcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlpbXgwNzJfY3RybCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpbXgwNzJfY3RybF90KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbXgwNzJfY3RybCkgewotCQlwcl9lcnIoImlteDA3Ml9pbml0IGZhaWxlZCFcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gaW5pdF9kb25lOwotCX0KLQlpbXgwNzJfY3RybC0+ZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQlpbXgwNzJfY3RybC0+cGljdF9mcHNfZGl2aWRlciA9IDEgKiAweDAwMDAwNDAwOwotCWlteDA3Ml9jdHJsLT5zZXRfdGVzdCA9IFRFU1RfT0ZGOwotCWlteDA3Ml9jdHJsLT5jYW1fbW9kZSA9IE1PREVfSU5WQUxJRDsKLQotCWlmIChkYXRhKQotCQlpbXgwNzJfY3RybC0+c2Vuc29yZGF0YSA9IGRhdGE7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIkNhbGxpbmcgaW14MDcyX3NlbnNvcl9vcGVuX2luaXQgZmFpbDFcbiIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCUNEQkcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkvKiBlbmFibGUgbWNsayBmaXJzdCAqLwotCW1zbV9jYW1pb19jbGtfcmF0ZV9zZXQoSU1YMDcyX01BU1RFUl9DTEtfUkFURSk7Ci0JcmMgPSBpbXgwNzJfcHJvYmVfaW5pdF9zZW5zb3IoZGF0YSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X2ZhaWw7Ci0KLQlpbXgwNzJfaW5pdF9mb2N1cygpOwotCWlteDA3Ml9jdHJsLT5mcHMgPSAzMCpRODsKLQlpZiAocmMgPCAwKSB7Ci0JCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JCWdvdG8gaW5pdF9mYWlsOwotCX0gZWxzZQotCQlnb3RvIGluaXRfZG9uZTsKLWluaXRfZmFpbDoKLQlwcl9lcnIoImluaXRfZmFpbFxuIik7Ci0JaW14MDcyX3Byb2JlX2luaXRfZG9uZShkYXRhKTsKLWluaXRfZG9uZToKLQlwcl9lcnIoImluaXRfZG9uZVxuIik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGlteDA3Ml9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCS8qIEluaXRpYWxpemUgdGhlIE1TTV9DQU1JMkMgQ2hpcCAqLwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlteDA3Ml93YWl0X3F1ZXVlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGlteDA3Ml9pMmNfaWRbXSA9IHsKLQl7ImlteDA3MiIsIDB9LAotCXsgfQotfTsKLQotc3RhdGljIGludCBpbXgwNzJfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCWludCByYyA9IDA7Ci0JQ0RCRygiaW14MDcyX3Byb2JlIGNhbGxlZCFcbiIpOwotCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKLQkJcHJfZXJyKCJpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eSBmYWlsZWRcbiIpOwotCQlnb3RvIHByb2JlX2ZhaWx1cmU7Ci0JfQotCi0JaW14MDcyX3NlbnNvcncgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW14MDcyX3dvcmtfdCksCi0JCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWlteDA3Ml9zZW5zb3J3KSB7Ci0JCXByX2Vycigia3phbGxvYyBmYWlsZWQuXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIHByb2JlX2ZhaWx1cmU7Ci0JfQotCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW14MDcyX3NlbnNvcncpOwotCWlteDA3Ml9pbml0X2NsaWVudChjbGllbnQpOwotCWlteDA3Ml9jbGllbnQgPSBjbGllbnQ7Ci0KLQltc2xlZXAoNTApOwotCi0JQ0RCRygiaW14MDcyX3Byb2JlIHN1Y2Nlc3NlZCEgcmMgPSAlZFxuIiwgcmMpOwotCXJldHVybiAwOwotCi1wcm9iZV9mYWlsdXJlOgotCXByX2VycigiaW14MDcyX3Byb2JlIGZhaWxlZCEgcmMgPSAlZFxuIiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBpbXgwNzJfc2VuZF93Yl9pbmZvKHN0cnVjdCB3Yl9pbmZvX2NmZyAqd2IpCi17Ci0JcmV0dXJuIDA7Ci0KLX0KLQotc3RhdGljIGludCBfX2V4aXQgaW14MDcyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBpbXgwNzJfd29ya190X3QgKnNlbnNvcncgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlmcmVlX2lycShjbGllbnQtPmlycSwgc2Vuc29ydyk7Ci0JaW14MDcyX2NsaWVudCA9IE5VTEw7Ci0Ja2ZyZWUoc2Vuc29ydyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpbXgwNzJfaTJjX2RyaXZlciA9IHsKLQkuaWRfdGFibGUgPSBpbXgwNzJfaTJjX2lkLAotCS5wcm9iZSAgPSBpbXgwNzJfaTJjX3Byb2JlLAotCS5yZW1vdmUgPSBfX2V4aXRfcChpbXgwNzJfaTJjX3JlbW92ZSksCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiaW14MDcyIiwKLQl9LAotfTsKLQotaW50IGlteDA3Ml9zZW5zb3JfY29uZmlnKHZvaWQgX191c2VyICphcmdwKQotewotCXN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEgY2RhdGE7Ci0JbG9uZyAgIHJjID0gMDsKLQlpZiAoY29weV9mcm9tX3VzZXIoJmNkYXRhLAotCQkodm9pZCAqKWFyZ3AsCi0JCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCW11dGV4X2xvY2soJmlteDA3Ml9tdXQpOwotCUNEQkcoImlteDA3Ml9zZW5zb3JfY29uZmlnOiBjZmd0eXBlID0gJWRcbiIsCi0JCSBjZGF0YS5jZmd0eXBlKTsKLQlzd2l0Y2ggKGNkYXRhLmNmZ3R5cGUpIHsKLQljYXNlIENGR19HRVRfUElDVF9GUFM6Ci0JCWlteDA3Ml9nZXRfcGljdF9mcHMoCi0JCQljZGF0YS5jZmcuZ2Zwcy5wcmV2ZnBzLAotCQkJJihjZGF0YS5jZmcuZ2Zwcy5waWN0ZnBzKSk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkmY2RhdGEsCi0JCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQljYXNlIENGR19HRVRfUFJFVl9MX1BGOgotCQljZGF0YS5jZmcucHJldmxfcGYgPQotCQlpbXgwNzJfZ2V0X3ByZXZfbGluZXNfcGYoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCSZjZGF0YSwKLQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX0dFVF9QUkVWX1BfUEw6Ci0JCWNkYXRhLmNmZy5wcmV2cF9wbCA9Ci0JCQlpbXgwNzJfZ2V0X3ByZXZfcGl4ZWxzX3BsKCk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkmY2RhdGEsCi0JCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQljYXNlIENGR19HRVRfUElDVF9MX1BGOgotCQljZGF0YS5jZmcucGljdGxfcGYgPQotCQkJaW14MDcyX2dldF9waWN0X2xpbmVzX3BmKCk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkmY2RhdGEsCi0JCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQljYXNlIENGR19HRVRfUElDVF9QX1BMOgotCQljZGF0YS5jZmcucGljdHBfcGwgPQotCQkJaW14MDcyX2dldF9waWN0X3BpeGVsc19wbCgpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJJmNkYXRhLAotCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfR0VUX1BJQ1RfTUFYX0VYUF9MQzoKLQkJY2RhdGEuY2ZnLnBpY3RfbWF4X2V4cF9sYyA9Ci0JCQlpbXgwNzJfZ2V0X3BpY3RfbWF4X2V4cF9sYygpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJJmNkYXRhLAotCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX0ZQUzoKLQljYXNlIENGR19TRVRfUElDVF9GUFM6Ci0JCXJjID0gaW14MDcyX3NldF9mcHMoJihjZGF0YS5jZmcuZnBzKSk7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9FWFBfR0FJTjoKLQkJcmMgPSBpbXgwNzJfd3JpdGVfZXhwX2dhaW4oCi0JCQljZGF0YS5jZmcuZXhwX2dhaW4uZ2FpbiwKLQkJCWNkYXRhLmNmZy5leHBfZ2Fpbi5saW5lKTsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX1BJQ1RfRVhQX0dBSU46Ci0JCXJjID0gaW14MDcyX3NldF9waWN0X2V4cF9nYWluKAotCQkJY2RhdGEuY2ZnLmV4cF9nYWluLmdhaW4sCi0JCQljZGF0YS5jZmcuZXhwX2dhaW4ubGluZSk7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9NT0RFOgotCQlyYyA9IGlteDA3Ml9zZXRfc2Vuc29yX21vZGUoY2RhdGEubW9kZSwgY2RhdGEucnMpOwotCQlicmVhazsKLQljYXNlIENGR19QV1JfRE9XTjoKLQkJcmMgPSBpbXgwNzJfcG93ZXJfZG93bigpOwotCQlicmVhazsKLQljYXNlIENGR19NT1ZFX0ZPQ1VTOgotCQlyYyA9IGlteDA3Ml9tb3ZlX2ZvY3VzKGNkYXRhLmNmZy5mb2N1cy5kaXIsCi0JCQkJY2RhdGEuY2ZnLmZvY3VzLnN0ZXBzKTsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX0RFRkFVTFRfRk9DVVM6Ci0JCWlteDA3Ml9zZXRfZGVmYXVsdF9mb2N1cygpOwotCQlicmVhazsKLQljYXNlIENGR19HRVRfQUZfTUFYX1NURVBTOgotCQljZGF0YS5tYXhfc3RlcHMgPSBJTVgwNzJfVE9UQUxfU1RFUFNfTkVBUl9UT19GQVI7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJJmNkYXRhLAotCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX0VGRkVDVDoKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VORF9XQl9JTkZPOgotCQlyYyA9IGlteDA3Ml9zZW5kX3diX2luZm8oCi0JCQkmKGNkYXRhLmNmZy53Yl9pbmZvKSk7Ci0JYnJlYWs7Ci0JY2FzZSBDRkdfU0VOU09SX0lOSVQ6Ci0JCXJjID0gaW14MDcyX21vZGVfaW5pdChjZGF0YS5tb2RlLAotCQkJCWNkYXRhLmNmZy5pbml0X2luZm8pOwotCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9MRU5TX1NIQURJTkc6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZpbXgwNzJfbXV0KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBpbXgwNzJfc2Vuc29yX3JlbGVhc2Uodm9pZCkKLXsKLQlpbnQgcmMgPSAtRUJBREY7Ci0JbXV0ZXhfbG9jaygmaW14MDcyX211dCk7Ci0JaW14MDcyX3Bvd2VyX2Rvd24oKTsKLQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChpbXgwNzJfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3Jlc2V0LCAwKTsKLQltc2xlZXAoMjApOwotCWdwaW9fZnJlZShpbXgwNzJfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3Jlc2V0KTsKLQlpZiAoaW14MDcyX2N0cmwtPnNlbnNvcmRhdGEtPnZjbV9lbmFibGUpIHsKLQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoaW14MDcyX2N0cmwtPnNlbnNvcmRhdGEtPnZjbV9wd2QsIDApOwotCQlncGlvX2ZyZWUoaW14MDcyX2N0cmwtPnNlbnNvcmRhdGEtPnZjbV9wd2QpOwotCX0KLQlrZnJlZShpbXgwNzJfY3RybCk7Ci0JaW14MDcyX2N0cmwgPSBOVUxMOwotCXByX2VycigiaW14MDcyX3JlbGVhc2UgY29tcGxldGVkXG4iKTsKLQltdXRleF91bmxvY2soJmlteDA3Ml9tdXQpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGlteDA3Ml9zZW5zb3JfcHJvYmUoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmluZm8sCi0JCXN0cnVjdCBtc21fc2Vuc29yX2N0cmwgKnMpCi17Ci0JaW50IHJjID0gMDsKLQlyYyA9IGkyY19hZGRfZHJpdmVyKCZpbXgwNzJfaTJjX2RyaXZlcik7Ci0JaWYgKHJjIDwgMCB8fCBpbXgwNzJfY2xpZW50ID09IE5VTEwpIHsKLQkJcmMgPSAtRU5PVFNVUFA7Ci0JCXByX2VycigiSTJDIGFkZCBkcml2ZXIgZmFpbGVkIik7Ci0JCWdvdG8gcHJvYmVfZmFpbDsKLQl9Ci0JbXNtX2NhbWlvX2Nsa19yYXRlX3NldChJTVgwNzJfTUFTVEVSX0NMS19SQVRFKTsKLQlyYyA9IGlteDA3Ml9wcm9iZV9pbml0X3NlbnNvcihpbmZvKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIHByb2JlX2ZhaWw7Ci0Jcy0+c19pbml0ID0gaW14MDcyX3NlbnNvcl9vcGVuX2luaXQ7Ci0Jcy0+c19yZWxlYXNlID0gaW14MDcyX3NlbnNvcl9yZWxlYXNlOwotCXMtPnNfY29uZmlnICA9IGlteDA3Ml9zZW5zb3JfY29uZmlnOwotCXMtPnNfbW91bnRfYW5nbGUgPSBpbmZvLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+bW91bnRfYW5nbGU7Ci0KLQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChpbmZvLT5zZW5zb3JfcmVzZXQsIDApOwotCWlteDA3Ml9wcm9iZV9pbml0X2RvbmUoaW5mbyk7Ci0JaWYgKGluZm8tPnZjbV9lbmFibGUpIHsKLQkJcmMgPSBncGlvX3JlcXVlc3QoaW5mby0+dmNtX3B3ZCwgImlteDA3Ml9hZiIpOwotCQlpZiAoIXJjKSB7Ci0JCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoaW5mby0+dmNtX3B3ZCwgMCk7Ci0JCQltc2xlZXAoMjApOwotCQkJZ3Bpb19mcmVlKGluZm8tPnZjbV9wd2QpOwotCQl9IGVsc2UKLQkJCXJldHVybiByYzsKLQl9Ci0JcHJfaW5mbygiaW14MDcyX3NlbnNvcl9wcm9iZSA6IFNVQ0NFU1NcbiIpOwotCXJldHVybiByYzsKLQotcHJvYmVfZmFpbDoKLQlwcl9lcnIoImlteDA3Ml9zZW5zb3JfcHJvYmU6IFNFTlNPUiBQUk9CRSBGQUlMUyFcbiIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX2lteDA3Ml9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBtc21fY2FtZXJhX2Rydl9zdGFydChwZGV2LCBpbXgwNzJfc2Vuc29yX3Byb2JlKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2NhbWVyYV9kcml2ZXIgPSB7Ci0JLnByb2JlID0gX19pbXgwNzJfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtX2NhbWVyYV9pbXgwNzIiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW14MDcyX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fY2FtZXJhX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGlteDA3Ml9pbml0KTsKLXZvaWQgaW14MDcyX2V4aXQodm9pZCkKLXsKLQlpMmNfZGVsX2RyaXZlcigmaW14MDcyX2kyY19kcml2ZXIpOwotfQotTU9EVUxFX0RFU0NSSVBUSU9OKCJBcHRpbmEgOCBNUCBCYXllciBzZW5zb3IgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBib29sIHN0cmVhbWluZyA9IDE7Ci0KLXN0YXRpYyBpbnQgY2FtX2RlYnVnX3N0cmVhbV9zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKHZhbCkgewotCQlpbXgwNzJfc3RhcnRfc3RyZWFtKCk7Ci0JCXN0cmVhbWluZyA9IDE7Ci0JfSBlbHNlIHsKLQkJaW14MDcyX3N0b3Bfc3RyZWFtKCk7Ci0JCXN0cmVhbWluZyA9IDA7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGNhbV9kZWJ1Z19zdHJlYW1fZ2V0KHZvaWQgKmRhdGEsIHU2NCAqdmFsKQotewotCSp2YWwgPSBzdHJlYW1pbmc7Ci0JcmV0dXJuIDA7Ci19Ci1ERUZJTkVfU0lNUExFX0FUVFJJQlVURShjYW1fc3RyZWFtLCBjYW1fZGVidWdfc3RyZWFtX2dldCwKLQkJCWNhbV9kZWJ1Z19zdHJlYW1fc2V0LCAiJWxsdVxuIik7Ci0KLQotCi1zdGF0aWMgaW50IGlteDA3Ml9zZXRfYWZfY29kZXN0ZXAodm9pZCAqZGF0YSwgdTY0IHZhbCkKLXsKLQlpbXgwNzJfbF9yZWdpb25fY29kZV9wZXJfc3RlcCA9IHZhbDsKLQlpbXgwNzJfaW5pdF9mb2N1cygpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlteDA3Ml9nZXRfYWZfY29kZXN0ZXAodm9pZCAqZGF0YSwgdTY0ICp2YWwpCi17Ci0JKnZhbCA9IGlteDA3Ml9sX3JlZ2lvbl9jb2RlX3Blcl9zdGVwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdWludDE2X3QgaW14MDcyX2xpbmVhcl90b3RhbF9zdGVwID0gSU1YMDcyX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSOwotc3RhdGljIGludCBpbXgwNzJfc2V0X2xpbmVhcl90b3RhbF9zdGVwKHZvaWQgKmRhdGEsIHU2NCB2YWwpCi17Ci0JaW14MDcyX2xpbmVhcl90b3RhbF9zdGVwID0gdmFsOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlteDA3Ml9hZl9saW5lYXJpdHlfdGVzdCh2b2lkICpkYXRhLCB1NjQgKnZhbCkKLXsKLQlpbnQgaSA9IDA7Ci0KLQlpbXgwNzJfc2V0X2RlZmF1bHRfZm9jdXMoKTsKLQltc2xlZXAoMzAwMCk7Ci0JZm9yIChpID0gMDsgaSA8IGlteDA3Ml9saW5lYXJfdG90YWxfc3RlcDsgaSsrKSB7Ci0JCWlteDA3Ml9tb3ZlX2ZvY3VzKE1PVkVfTkVBUiwgMSk7Ci0JCUNEQkcoIm1vdmVkIHRvIGluZGV4ID1bJWRdXG4iLCBpKTsKLQkJbXNsZWVwKDEwMDApOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBpbXgwNzJfbGluZWFyX3RvdGFsX3N0ZXA7IGkrKykgewotCQlpbXgwNzJfbW92ZV9mb2N1cyhNT1ZFX0ZBUiwgMSk7Ci0JCUNEQkcoIm1vdmVkIHRvIGluZGV4ID1bJWRdXG4iLCBpKTsKLQkJbXNsZWVwKDEwMDApOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVpbnQxNl90IGlteDA3Ml9zdGVwX3ZhbCA9IElNWDA3Ml9UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUjsKLXN0YXRpYyB1aW50OF90IGlteDA3Ml9zdGVwX2RpciA9IE1PVkVfTkVBUjsKLXN0YXRpYyBpbnQgaW14MDcyX2FmX3N0ZXBfY29uZmlnKHZvaWQgKmRhdGEsIHU2NCB2YWwpCi17Ci0JaW14MDcyX3N0ZXBfdmFsID0gdmFsICYgMHhGRkZGOwotCWlteDA3Ml9zdGVwX2RpciA9ICh2YWwgPj4gMTYpICYgMHgxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlteDA3Ml9hZl9zdGVwKHZvaWQgKmRhdGEsIHU2NCAqdmFsKQotewotCWludCBpID0gMDsKLQlpbnQgZGlyID0gTU9WRV9ORUFSOwotCWlteDA3Ml9zZXRfZGVmYXVsdF9mb2N1cygpOwotCW1zbGVlcCgzMDAwKTsKLQlpZiAoaW14MDcyX3N0ZXBfZGlyID09IDEpCi0JCWRpciA9IE1PVkVfRkFSOwotCi0JZm9yIChpID0gMDsgaSA8IGlteDA3Ml9zdGVwX3ZhbDsgaSArPSA0KSB7Ci0JCWlteDA3Ml9tb3ZlX2ZvY3VzKGRpciwgNCk7Ci0JCW1zbGVlcCgxMDAwKTsKLQl9Ci0JaW14MDcyX3NldF9kZWZhdWx0X2ZvY3VzKCk7Ci0JbXNsZWVwKDMwMDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlteDA3Ml9hZl9zZXRfcmVzb2x1dGlvbih2b2lkICpkYXRhLCB1NjQgdmFsKQotewotCWlteDA3Ml9pbml0X2ZvY3VzKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW14MDcyX2FmX2dldF9yZXNvbHV0aW9uKHZvaWQgKmRhdGEsIHU2NCAqdmFsKQotewotCSp2YWwgPSAweEZGOwotCXJldHVybiAwOwotfQotCi0KLQotREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoYWZfY29kZXBlcnN0ZXAsIGlteDA3Ml9nZXRfYWZfY29kZXN0ZXAsCi0JCQlpbXgwNzJfc2V0X2FmX2NvZGVzdGVwLCAiJWxsdVxuIik7Ci0KLURFRklORV9TSU1QTEVfQVRUUklCVVRFKGFmX2xpbmVhciwgaW14MDcyX2FmX2xpbmVhcml0eV90ZXN0LAotCQkJaW14MDcyX3NldF9saW5lYXJfdG90YWxfc3RlcCwgIiVsbHVcbiIpOwotCi1ERUZJTkVfU0lNUExFX0FUVFJJQlVURShhZl9zdGVwLCBpbXgwNzJfYWZfc3RlcCwKLQkJCWlteDA3Ml9hZl9zdGVwX2NvbmZpZywgIiVsbHVcbiIpOwotCi1ERUZJTkVfU0lNUExFX0FUVFJJQlVURShhZl9zdGVwX3JlcywgaW14MDcyX2FmX2dldF9yZXNvbHV0aW9uLAotCQkJaW14MDcyX2FmX3NldF9yZXNvbHV0aW9uLCAiJWxsdVxuIik7Ci0KLXN0YXRpYyBpbnQgY2FtX2RlYnVnX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgZGVudHJ5ICpjYW1fZGlyOwotCWRlYnVnZnNfYmFzZSA9IGRlYnVnZnNfY3JlYXRlX2Rpcigic2Vuc29yIiwgTlVMTCk7Ci0JaWYgKCFkZWJ1Z2ZzX2Jhc2UpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY2FtX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigiaW14MDcyIiwgZGVidWdmc19iYXNlKTsKLQlpZiAoIWNhbV9kaXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzdHJlYW0iLCBTX0lSVUdPIHwgU19JV1VTUiwgY2FtX2RpciwKLQkJCQkJCQkgTlVMTCwgJmNhbV9zdHJlYW0pKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmICghZGVidWdmc19jcmVhdGVfZmlsZSgiYWZfY29kZXBlcnN0ZXAiLCBTX0lSVUdPIHwgU19JV1VTUiwgY2FtX2RpciwKLQkJCQkJCQkgTlVMTCwgJmFmX2NvZGVwZXJzdGVwKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhZl9saW5lYXIiLCBTX0lSVUdPIHwgU19JV1VTUiwgY2FtX2RpciwKLQkJCQkJCQkgTlVMTCwgJmFmX2xpbmVhcikpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmICghZGVidWdmc19jcmVhdGVfZmlsZSgiYWZfc3RlcCIsIFNfSVJVR08gfCBTX0lXVVNSLCBjYW1fZGlyLAotCQkJCQkJCSBOVUxMLCAmYWZfc3RlcCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhZl9zdGVwX3JlcyIsIFNfSVJVR08gfCBTX0lXVVNSLCBjYW1fZGlyLAotCQkJCQkJCSBOVUxMLCAmYWZfc3RlcF9yZXMpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW14MDcyLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW14MDcyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZjY4OGMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lteDA3Mi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIElNWDA3Ml9ICi0jZGVmaW5lIElNWDA3Ml9ICi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci1leHRlcm4gc3RydWN0IGlteDA3Ml9yZWcgaW14MDcyX3JlZ3M7Ci0KLXN0cnVjdCBpbXgwNzJfaTJjX3JlZ19jb25mIHsKLQl1bnNpZ25lZCBzaG9ydCB3YWRkcjsKLQl1bnNpZ25lZCBzaG9ydCB3ZGF0YTsKLX07Ci0KLXN0cnVjdCBpbXgwNzJfaTJjX2NvbmZfYXJyYXkgewotCXN0cnVjdCBpbXgwNzJfaTJjX3JlZ19jb25mICpjb25mOwotCXVuc2lnbmVkIHNob3J0IHNpemU7Ci19OwotCi1lbnVtIGlteDA3Ml90ZXN0X21vZGVfdCB7Ci0JVEVTVF9PRkYsCi0JVEVTVF8xLAotCVRFU1RfMiwKLQlURVNUXzMKLX07Ci0KLWVudW0gaW14MDcyX3Jlc29sdXRpb25fdCB7Ci0JUVRSXzJEX1NJWkUsCi0JRlVMTF8yRF9TSVpFLAotCVFUUl8zRF9TSVpFLAotCUZVTExfM0RfU0laRSwKLQlJTlZBTElEX1NJWkUKLX07Ci1lbnVtIGlteDA3Ml9zZXR0aW5nIHsKLQlSRVNfUFJFVklFVywKLQlSRVNfQ0FQVFVSRSwKLQlSRVNfM0RfUFJFVklFVywKLQlSRVNfM0RfQ0FQVFVSRQotfTsKLWVudW0gaW14MDcyX2NhbV9tb2RlX3QgewotCU1PREVfMkRfUklHSFQsCi0JTU9ERV8yRF9MRUZULAotCU1PREVfM0QsCi0JTU9ERV9JTlZBTElECi19OwotZW51bSBpbXgwNzJfcmVnX3VwZGF0ZSB7Ci0JLyogU2Vuc29yIGVnaXN0ZXJzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiAqLwotCVJFR19JTklULAotCS8qIFNlbnNvciBlZ2lzdGVycyB0aGF0IG5lZWRzIHBlcmlvZGljIEkyQyB3cml0ZXMgKi8KLQlVUERBVEVfUEVSSU9ESUMsCi0JLyogQWxsIHRoZSBzZW5zb3IgUmVnaXN0ZXJzIHdpbGwgYmUgdXBkYXRlZCAqLwotCVVQREFURV9BTEwsCi0JLyogTm90IHZhbGlkIHVwZGF0ZSAqLwotCVVQREFURV9JTlZBTElECi19OwotCi1lbnVtIGlteDA3Ml9yZWdfbW9kZSB7Ci0JSU1YMDcyX0ZSQU1FX0xFTkdUSF9MSU5FU19ISSA9IDAsCi0JSU1YMDcyX0ZSQU1FX0xFTkdUSF9MSU5FU19MTywKLQlJTVgwNzJfTElORV9MRU5HVEhfUENLX0hJLAotCUlNWDA3Ml9MSU5FX0xFTkdUSF9QQ0tfTE8sCi19OwotCi1zdHJ1Y3QgaW14MDcyX3JlZyB7Ci0JY29uc3Qgc3RydWN0IGlteDA3Ml9pMmNfcmVnX2NvbmYgKnJlY19zZXR0aW5nczsKLQljb25zdCB1bnNpZ25lZCBzaG9ydCByZWNfc2l6ZTsKLQljb25zdCBzdHJ1Y3QgaW14MDcyX2kyY19jb25mX2FycmF5ICpjb25mX2FycmF5OwotfTsKLSNlbmRpZiAvKiBJTVgwNzJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lteDA3Ml9yZWcuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pbXgwNzJfcmVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMDdlMGYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lteDA3Ml9yZWcuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlICJpbXgwNzIuaCIKLQotc3RydWN0IGlteDA3Ml9pMmNfcmVnX2NvbmYgaW14MDcyX3ByZXZfc2V0dGluZ3NbXSA9IHsKLQl7MHgwMzQwLCAweDAzfSwvKmZyYW1lX2xlbmd0aCovCi0JezB4MDM0MSwgMHhGN30sLypmcmFtZV9sZW5ndGgqLwotCXsweDAzNDIsIDB4MEF9LC8qbGluZV9sZW5ndGgqLwotCXsweDAzNDMsIDB4RTB9LC8qbGluZV9sZW5ndGgqLwotCXsweDAzNDQsIDB4MDB9LC8qeF9hZGRyX3N0YXJ0Ki8KLQl7MHgwMzQ1LCAweDAwfSwvKnhfYWRkcl9zdGFydCovCi0JezB4MDM0NiwgMHgwMH0sLyp5X2FkZHJfc3RhcnQqLwotCXsweDAzNDcsIDB4MDB9LC8qeV9hZGRyX3N0YXJ0Ki8KLQl7MHgwMzQ4LCAweDBBfSwvKnhfYWRkcl9lbmQqLwotCXsweDAzNDksIDB4MkZ9LC8qeF9hZGRyX2VuZCovCi0JezB4MDM0QSwgMHgwN30sLyp5X2FkZHJfZW5kKi8KLQl7MHgwMzRCLCAweEE3fSwvKnlfYWRkcl9lbmQqLwotCXsweDAzNEMsIDB4MDV9LC8qeF9vdXRfc2l6ZSovCi0JezB4MDM0RCwgMHgxOH0sLyp4X291dF9zaXplKi8KLQl7MHgwMzRFLCAweDAzfSwvKnlfb3V0X3NpemUqLwotCXsweDAzNEYsIDB4RDR9LC8qeV9vdXRfc2l6ZSovCi0JezB4MDM4MSwgMHgwMX0sLyp4X2V2ZW5faW5jKi8KLQl7MHgwMzgzLCAweDAzfSwvKnhfb2RkX2luYyovCi0JezB4MDM4NSwgMHgwMX0sLyp5X2V2ZW5faW5jKi8KLQl7MHgwMzg3LCAweDAzfSwvKnlfb2RkX2luYyovCi0JezB4MzAxNiwgMHgwNn0sLypWTU9ERUFERCovCi0JezB4MzAxNywgMHg0MH0sCi0JezB4MzA2OSwgMHgyNH0sCi0JezB4MzA2QSwgMHgwMH0sCi0JezB4MzA2QiwgMHhDQn0sCi0JezB4MzA2QywgMHgwN30sCi0JezB4MzBFOCwgMHg4Nn0sCi0JezB4MzMwNCwgMHgwM30sCi0JezB4MzMwNSwgMHgwMn0sCi0JezB4MzMwNiwgMHgwQX0sCi0JezB4MzMwNywgMHgwMn0sCi0JezB4MzMwOCwgMHgxMX0sCi0JezB4MzMwOSwgMHgwNH0sCi0JezB4MzMwQSwgMHgwNX0sCi0JezB4MzMwQiwgMHgwNH0sCi0JezB4MzMwQywgMHgwNX0sCi0JezB4MzMwRCwgMHgwNH0sCi0JezB4MzMwRSwgMHgwMX0sCi0JezB4MzMwMSwgMHg4MH0sCi19OwotCi1zdHJ1Y3QgaW14MDcyX2kyY19yZWdfY29uZiBpbXgwNzJfc25hcF9zZXR0aW5nc1tdID0gewotCXsweDAzNDAsIDB4MDd9LC8qZnJhbWVfbGVuZ3RoKi8KLQl7MHgwMzQxLCAweEVFfSwvKmZyYW1lX2xlbmd0aCovCi0JezB4MDM0MiwgMHgwQX0sLypsaW5lX2xlbmd0aCovCi0JezB4MDM0MywgMHhFMH0sLypsaW5lX2xlbmd0aCovCi0JezB4MDM0NCwgMHgwMH0sLyp4X2FkZHJfc3RhcnQqLwotCXsweDAzNDUsIDB4MDB9LC8qeF9hZGRyX3N0YXJ0Ki8KLQl7MHgwMzQ2LCAweDAwfSwvKnlfYWRkcl9zdGFydCovCi0JezB4MDM0NywgMHgwMH0sLyp5X2FkZHJfc3RhcnQqLwotCXsweDAzNDgsIDB4MEF9LC8qeF9hZGRyX2VuZCovCi0JezB4MDM0OSwgMHgyRn0sLyp4X2FkZHJfZW5kKi8KLQl7MHgwMzRBLCAweDA3fSwvKnlfYWRkcl9lbmQqLwotCXsweDAzNEIsIDB4QTd9LC8qeV9hZGRyX2VuZCovCi0JezB4MDM0QywgMHgwQX0sLyp4X291dF9zaXplKi8KLQl7MHgwMzRELCAweDMwfSwvKnhfb3V0X3NpemUqLwotCXsweDAzNEUsIDB4MDd9LC8qeV9vdXRfc2l6ZSovCi0JezB4MDM0RiwgMHhBOH0sLyp5X291dF9zaXplKi8KLQl7MHgwMzgxLCAweDAxfSwvKnhfZXZlbl9pbmMqLwotCXsweDAzODMsIDB4MDF9LC8qeF9vZGRfaW5jKi8KLQl7MHgwMzg1LCAweDAxfSwvKnlfZXZlbl9pbmMqLwotCXsweDAzODcsIDB4MDF9LC8qeV9vZGRfaW5jKi8KLQl7MHgzMDE2LCAweDA2fSwvKlZNT0RFQUREKi8KLQl7MHgzMDE3LCAweDQwfSwKLQl7MHgzMDY5LCAweDI0fSwKLQl7MHgzMDZBLCAweDAwfSwKLQl7MHgzMDZCLCAweENCfSwKLQl7MHgzMDZDLCAweDA3fSwKLQl7MHgzMEU4LCAweDA2fSwKLQl7MHgzMzA0LCAweDA1fSwKLQl7MHgzMzA1LCAweDA0fSwKLQl7MHgzMzA2LCAweDE1fSwKLQl7MHgzMzA3LCAweDAyfSwKLQl7MHgzMzA4LCAweDExfSwKLQl7MHgzMzA5LCAweDA3fSwKLQl7MHgzMzBBLCAweDA1fSwKLQl7MHgzMzBCLCAweDA0fSwKLQl7MHgzMzBDLCAweDA1fSwKLQl7MHgzMzBELCAweDA0fSwKLQl7MHgzMzBFLCAweDAxfSwKLQl7MHgzMzAxLCAweDAwfSwKLX07Ci0KLXN0cnVjdCBpbXgwNzJfaTJjX3JlZ19jb25mIGlteDA3Ml9yZWNvbW1lbmRfc2V0dGluZ3NbXSA9IHsKLQl7MHgwMzA3LCAweDEyfSwKLQl7MHgzMDJCLCAweDRCfSwKLQl7MHgwMTAxLCAweDAzfSwKLQl7MHgzMDBBLCAweDgwfSwKLQl7MHgzMDE0LCAweDA4fSwKLQl7MHgzMDE1LCAweDM3fSwKLQl7MHgzMDE3LCAweDQwfSwKLQl7MHgzMDFDLCAweDAxfSwKLQl7MHgzMDMxLCAweDI4fSwKLQl7MHgzMDQwLCAweDAwfSwKLQl7MHgzMDQxLCAweDYwfSwKLQl7MHgzMDUxLCAweDI0fSwKLQl7MHgzMDUzLCAweDM0fSwKLQl7MHgzMDU1LCAweDNCfSwKLQl7MHgzMDU3LCAweEMwfSwKLQl7MHgzMDYwLCAweDMwfSwKLQl7MHgzMDY1LCAweDAwfSwKLQl7MHgzMEFBLCAweDg4fSwKLQl7MHgzMEFCLCAweDFDfSwKLQl7MHgzMEIwLCAweDMyfSwKLQl7MHgzMEIyLCAweDgzfSwKLQl7MHgzMEQzLCAweDA0fSwKLQl7MHgzMTBFLCAweEREfSwKLQl7MHgzMUE0LCAweEQ4fSwKLQl7MHgzMUE2LCAweDE3fSwKLQl7MHgzMUFDLCAweENGfSwKLQl7MHgzMUFFLCAweEYxfSwKLQl7MHgzMUI0LCAweEQ4fSwKLQl7MHgzMUI2LCAweDE3fSwKLQl7MHgzMzA0LCAweDA1fSwKLQl7MHgzMzA1LCAweDA0fSwKLQl7MHgzMzA2LCAweDE1fSwKLQl7MHgzMzA3LCAweDAyfSwKLQl7MHgzMzA4LCAweDExfSwKLQl7MHgzMzA5LCAweDA3fSwKLQl7MHgzMzBBLCAweDA1fSwKLQl7MHgzMzBCLCAweDA0fSwKLQl7MHgzMzBDLCAweDA1fSwKLQl7MHgzMzBELCAweDA0fSwKLQl7MHgzMzBFLCAweDAxfSwKLQl7MHgzMGQ4LCAweDIwfSwKLX07Ci0KLXN0cnVjdCBpbXgwNzJfaTJjX2NvbmZfYXJyYXkgaW14MDcyX2NvbmZzW10gPSB7Ci0JeyZpbXgwNzJfcHJldl9zZXR0aW5nc1swXSwgQVJSQVlfU0laRShpbXgwNzJfcHJldl9zZXR0aW5ncyl9LAotCXsmaW14MDcyX3NuYXBfc2V0dGluZ3NbMF0sIEFSUkFZX1NJWkUoaW14MDcyX3NuYXBfc2V0dGluZ3MpfSwKLX07Ci0KLXN0cnVjdCBpbXgwNzJfcmVnIGlteDA3Ml9yZWdzID0gewotCS5yZWNfc2V0dGluZ3MgPSAmaW14MDcyX3JlY29tbWVuZF9zZXR0aW5nc1swXSwKLQkucmVjX3NpemUgPSBBUlJBWV9TSVpFKGlteDA3Ml9yZWNvbW1lbmRfc2V0dGluZ3MpLAotCS5jb25mX2FycmF5ID0gJmlteDA3Ml9jb25mc1swXSwKLX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW14MDc0LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW14MDc0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMWM3ZGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lteDA3NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQxNCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSAiaW14MDc0LmgiCi0KLS8qU0VOU09SIFJFR0lTVEVSIERFRklORVMqLwotI2RlZmluZQlJTVgwNzRfRUVQUk9NX1NMQVZFX0FERFIJCQkweDUyCi0jZGVmaW5lIFJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xECQkJMHgwMTA0Ci0jZGVmaW5lIEdST1VQRURfUEFSQU1FVEVSX0hPTERfT0ZGCQkJMHgwMAotI2RlZmluZSBHUk9VUEVEX1BBUkFNRVRFUl9IT0xECQkJCTB4MDEKLSNkZWZpbmUgUkVHX01PREVfU0VMRUNUCQkJCQkweDEwMAotI2RlZmluZSBNT0RFX1NFTEVDVF9TVEFOREJZX01PREUJCQkweDAwCi0jZGVmaW5lIE1PREVfU0VMRUNUX1NUUkVBTQkJCQkweDAxCi0vKiBJbnRlZ3JhdGlvbiBUaW1lICovCi0jZGVmaW5lIFJFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9ISQkJCTB4MDIwMgotI2RlZmluZSBSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfTE8JCQkweDAyMDMKLS8qIEdhaW4gKi8KLSNkZWZpbmUgUkVHX0FOQUxPR1VFX0dBSU5fQ09ERV9HTE9CQUxfSEkJCTB4MDIwNAotI2RlZmluZSBSRUdfQU5BTE9HVUVfR0FJTl9DT0RFX0dMT0JBTF9MTwkJMHgwMjA1Ci0vKiBQTEwgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFJFR19QTExfTVVMVElQTElFUgkJCQkweDAzMDcKLSNkZWZpbmUgUkVHX1BSRV9QTExfQ0xLX0RJVgkJCQkweDAzMDUKLSNkZWZpbmUgUkVHX1BMU1RBVElNCQkJCQkweDMwMmIKLSNkZWZpbmUgUkVHXzMwMjQJCQkJCTB4MzAyNAotI2RlZmluZSBSRUdfSU1BR0VfT1JJRU5UQVRJT04JCQkJMHgwMTAxCi0jZGVmaW5lIFJFR19WTkRNWV9BQkxNR1NITE1UCQkJCTB4MzAwYQotI2RlZmluZSBSRUdfWV9PUEJBRERSX1NUQVJUX0RJCQkJCTB4MzAxNAotI2RlZmluZSBSRUdfMzAxNQkJCQkJMHgzMDE1Ci0jZGVmaW5lIFJFR18zMDFDCQkJCQkweDMwMUMKLSNkZWZpbmUgUkVHXzMwMkMJCQkJCTB4MzAyQwotI2RlZmluZSBSRUdfMzAzMQkJCQkJMHgzMDMxCi0jZGVmaW5lIFJFR18zMDQxCQkJCQkweDMwNDEKLSNkZWZpbmUgUkVHXzMwNTEJCQkJCTB4MzA1MQotI2RlZmluZSBSRUdfMzA1MwkJCQkJMHgzMDUzCi0jZGVmaW5lIFJFR18zMDU3CQkJCQkweDMwNTcKLSNkZWZpbmUgUkVHXzMwNUMJCQkJCTB4MzA1QwotI2RlZmluZSBSRUdfMzA1RAkJCQkJMHgzMDVECi0jZGVmaW5lIFJFR18zMDYwCQkJCQkweDMwNjAKLSNkZWZpbmUgUkVHXzMwNjUJCQkJCTB4MzA2NQotI2RlZmluZSBSRUdfMzBBQQkJCQkJMHgzMEFBCi0jZGVmaW5lIFJFR18zMEFCCQkJCQkweDMwQUIKLSNkZWZpbmUgUkVHXzMwQjAJCQkJCTB4MzBCMAotI2RlZmluZSBSRUdfMzBCMgkJCQkJMHgzMEIyCi0jZGVmaW5lIFJFR18zMEQzCQkJCQkweDMwRDMKLSNkZWZpbmUgUkVHXzMxMDYJCQkJCTB4MzEwNgotI2RlZmluZSBSRUdfMzEwQwkJCQkJMHgzMTBDCi0jZGVmaW5lIFJFR18zMzA0CQkJCQkweDMzMDQKLSNkZWZpbmUgUkVHXzMzMDUJCQkJCTB4MzMwNQotI2RlZmluZSBSRUdfMzMwNgkJCQkJMHgzMzA2Ci0jZGVmaW5lIFJFR18zMzA3CQkJCQkweDMzMDcKLSNkZWZpbmUgUkVHXzMzMDgJCQkJCTB4MzMwOAotI2RlZmluZSBSRUdfMzMwOQkJCQkJMHgzMzA5Ci0jZGVmaW5lIFJFR18zMzBBCQkJCQkweDMzMEEKLSNkZWZpbmUgUkVHXzMzMEIJCQkJCTB4MzMwQgotI2RlZmluZSBSRUdfMzMwQwkJCQkJMHgzMzBDCi0jZGVmaW5lIFJFR18zMzBECQkJCQkweDMzMEQKLSNkZWZpbmUgUkVHXzMzMEYJCQkJCTB4MzMwRgotI2RlZmluZSBSRUdfMzM4MQkJCQkJMHgzMzgxCi0KLS8qIG1vZGUgc2V0dGluZyAqLwotI2RlZmluZSBSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0hJCQkJMHgwMzQwCi0jZGVmaW5lIFJFR19GUkFNRV9MRU5HVEhfTElORVNfTE8JCQkweDAzNDEKLSNkZWZpbmUgUkVHX1lBRERSX1NUQVJUCQkJCQkweDAzNDcKLSNkZWZpbmUgUkVHX1lBQUFSX0VORAkJCQkJMHgwMzRiCi0jZGVmaW5lIFJFR19YX09VVFBVVF9TSVpFX01TQgkJCQkweDAzNGMKLSNkZWZpbmUgUkVHX1hfT1VUUFVUX1NJWkVfTFNCCQkJCTB4MDM0ZAotI2RlZmluZSBSRUdfWV9PVVRQVVRfU0laRV9NU0IJCQkJMHgwMzRlCi0jZGVmaW5lIFJFR19ZX09VVFBVVF9TSVpFX0xTQgkJCQkweDAzNGYKLSNkZWZpbmUgUkVHX1hfRVZFTl9JTkMJCQkJCTB4MDM4MQotI2RlZmluZSBSRUdfWF9PRERfSU5DCQkJCQkweDAzODMKLSNkZWZpbmUgUkVHX1lfRVZFTl9JTkMJCQkJCTB4MDM4NQotI2RlZmluZSBSRUdfWV9PRERfSU5DCQkJCQkweDAzODcKLSNkZWZpbmUgUkVHX0hNT0RFQURECQkJCQkweDMwMDEKLSNkZWZpbmUgUkVHX1ZNT0RFQURECQkJCQkweDMwMTYKLSNkZWZpbmUgUkVHX1ZBUFBMSU5FX1NUQVJUCQkJCTB4MzA2OQotI2RlZmluZSBSRUdfVkFQUExJTkVfRU5ECQkJCTB4MzA2YgotI2RlZmluZSBSRUdfU0hVVFRFUgkJCQkJMHgzMDg2Ci0jZGVmaW5lIFJFR19IQUREQVZFCQkJCQkweDMwZTgKLSNkZWZpbmUgUkVHX0xBTkVTRUwJCQkJCTB4MzMwMQotLyogVGVzdCBQYXR0ZXJuICovCi0jZGVmaW5lIFJFR19URVNUX1BBVFRFUk5fTU9ERQkJCQkweDA2MDEKLQotI2RlZmluZSBSRUdfTElORV9MRU5HVEhfUENLX0hJCQkJCTB4MDM0MgotI2RlZmluZSBSRUdfTElORV9MRU5HVEhfUENLX0xPCQkJCTB4MDM0MwotLyouLi4uLiBUWVBFIERFQ0xBUkFUSU9OUy4uLi4uKi8KLSNkZWZpbmUJSU1YMDc0X09GRlNFVAkJCQkJMwotI2RlZmluZQlJTVgwNzRfREVGQVVMVF9NQVNURVJfQ0xLX1JBVEUJCQkyNDAwMDAwMAotLyogRnVsbAlTaXplICovCi0jZGVmaW5lCUlNWDA3NF9GVUxMX1NJWkVfV0lEVEgJCQkJNDIwOAotI2RlZmluZQlJTVgwNzRfRlVMTF9TSVpFX0hFSUdIVAkJCQkzMTIwCi0jZGVmaW5lCUlNWDA3NF9GVUxMX1NJWkVfRFVNTVlfUElYRUxTCQkJMAotI2RlZmluZQlJTVgwNzRfRlVMTF9TSVpFX0RVTU1ZX0xJTkVTCQkJMAotLyogUXVhcnRlciBTaXplCSovCi0jZGVmaW5lCUlNWDA3NF9RVFJfU0laRV9XSURUSAkJCQkyMTA0Ci0jZGVmaW5lCUlNWDA3NF9RVFJfU0laRV9IRUlHSFQJCQkJMTU2MAotI2RlZmluZQlJTVgwNzRfUVRSX1NJWkVfRFVNTVlfUElYRUxTCQkJMAotI2RlZmluZQlJTVgwNzRfUVRSX1NJWkVfRFVNTVlfTElORVMJCQkwCi0vKiBCbGFua2luZyBhcyBtZWFzdXJlZAlvbiB0aGUgc2NvcGUgKi8KLS8qIEZ1bGwJU2l6ZSAqLwotI2RlZmluZQlJTVgwNzRfSFJaX0ZVTExfQkxLX1BJWEVMUwkJCTI2NAotI2RlZmluZQlJTVgwNzRfVkVSX0ZVTExfQkxLX0xJTkVTCQkJOTYKLS8qIFF1YXJ0ZXIgU2l6ZQkqLwotI2RlZmluZQlJTVgwNzRfSFJaX1FUUl9CTEtfUElYRUxTCQkJMjM2OAotI2RlZmluZQlJTVgwNzRfVkVSX1FUUl9CTEtfTElORVMJCQkyMQotI2RlZmluZQlROAkJCQkJCTB4MTAwCi0jZGVmaW5lCVExMAkJCQkJCTB4NDAwCi0jZGVmaW5lCUlNWDA3NF9BRl9JMkNfU0xBVkVfSUQJCQkJMHg3MgotI2RlZmluZQlJTVgwNzRfU1RFUFNfTkVBUl9UT19DTE9TRVNUX0lORgkJNTIKLSNkZWZpbmUJSU1YMDc0X1RPVEFMX1NURVBTX05FQVJfVE9fRkFSCQkJNTIKLXN0YXRpYyB1aW50MzJfdCBpbXgwNzRfbF9yZWdpb25fY29kZV9wZXJfc3RlcCA9IDI7Ci0KLXN0cnVjdCBpbXgwNzRfd29ya190IHsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW14MDc0X3dvcmtfdCAqaW14MDc0X3NlbnNvcnc7Ci1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKmlteDA3NF9jbGllbnQ7Ci0KLXN0cnVjdCBpbXgwNzRfY3RybF90IHsKLQljb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2Vuc29yZGF0YTsKLQl1aW50MzJfdCBzZW5zb3Jtb2RlOwotCXVpbnQzMl90IGZwc19kaXZpZGVyOy8qIGluaXQgdG8gMSAqIDB4MDAwMDA0MDAgKi8KLQl1aW50MzJfdCBwaWN0X2Zwc19kaXZpZGVyOy8qIGluaXQgdG8gMSAqIDB4MDAwMDA0MDAgKi8KLQl1aW50MTZfdCBmcHM7Ci0JaW50MTZfdCBjdXJyX2xlbnNfcG9zOwotCXVpbnQxNl90IGN1cnJfc3RlcF9wb3M7Ci0JdWludDE2X3QgbXlfcmVnX2dhaW47Ci0JdWludDMyX3QgbXlfcmVnX2xpbmVfY291bnQ7Ci0JdWludDE2X3QgdG90YWxfbGluZXNfcGVyX2ZyYW1lOwotCWVudW0gaW14MDc0X3Jlc29sdXRpb25fdCBwcmV2X3JlczsKLQllbnVtIGlteDA3NF9yZXNvbHV0aW9uX3QgcGljdF9yZXM7Ci0JZW51bSBpbXgwNzRfcmVzb2x1dGlvbl90IGN1cnJfcmVzOwotCWVudW0gaW14MDc0X3Rlc3RfbW9kZV90IHNldF90ZXN0OwotCXVuc2lnbmVkIHNob3J0IGltZ2FkZHI7Ci19Owotc3RhdGljIHVpbnQ4X3QgaW14MDc0X2RlbGF5X21zZWNzX3N0ZGJ5ID0gNTsKLXN0YXRpYyB1aW50MTZfdCBpbXgwNzRfZGVsYXlfbXNlY3Nfc3RyZWFtID0gNTsKLXN0YXRpYyBpbnQzMl90IGNvbmZpZ19jc2k7Ci0KLXN0YXRpYyBzdHJ1Y3QgaW14MDc0X2N0cmxfdCAqaW14MDc0X2N0cmw7Ci1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoaW14MDc0X3dhaXRfcXVldWUpOwotREVGSU5FX01VVEVYKGlteDA3NF9tdXQpOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgaW50IGlteDA3NF9pMmNfcnhkYXRhKHVuc2lnbmVkIHNob3J0IHNhZGRyLAotCXVuc2lnbmVkIGNoYXIgKnJ4ZGF0YSwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7Ci0JCXsKLQkJCS5hZGRyICA9IHNhZGRyLAotCQkJLmZsYWdzID0gMCwKLQkJCS5sZW4gICA9IDIsCi0JCQkuYnVmICAgPSByeGRhdGEsCi0JCX0sCi0JCXsKLQkJCS5hZGRyICA9IHNhZGRyLAotCQkJLmZsYWdzID0gSTJDX01fUkQsCi0JCQkubGVuICAgPSAyLAotCQkJLmJ1ZiAgID0gcnhkYXRhLAotCQl9LAotCX07Ci0JaWYgKGkyY190cmFuc2ZlcihpbXgwNzRfY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAyKSA8IDApIHsKLQkJQ0RCRygiaW14MDc0X2kyY19yeGRhdGEgZmFpbGVkIVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbnQzMl90IGlteDA3NF9pMmNfdHhkYXRhKHVuc2lnbmVkIHNob3J0IHNhZGRyLAotCQkJCXVuc2lnbmVkIGNoYXIgKnR4ZGF0YSwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKLQkJewotCQkJLmFkZHIgPSBzYWRkciwKLQkJCS5mbGFncyA9IDAsCi0JCQkubGVuID0gbGVuZ3RoLAotCQkJLmJ1ZiA9IHR4ZGF0YSwKLQkJIH0sCi0JfTsKLQlpZiAoaTJjX3RyYW5zZmVyKGlteDA3NF9jbGllbnQtPmFkYXB0ZXIsIG1zZywgMSkgPCAwKSB7Ci0JCUNEQkcoImlteDA3NF9pMmNfdHhkYXRhIGZhaWxkIDB4JXhcbiIsIGlteDA3NF9jbGllbnQtPmFkZHIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50MzJfdCBpbXgwNzRfaTJjX3JlYWQodW5zaWduZWQgc2hvcnQgcmFkZHIsCi0JdW5zaWduZWQgc2hvcnQgKnJkYXRhLCBpbnQgcmxlbikKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKLQlpZiAoIXJkYXRhKQotCQlyZXR1cm4gLUVJTzsKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gKHJhZGRyICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlsxXSA9IChyYWRkciAmIDB4MDBGRik7Ci0JcmMgPSBpbXgwNzRfaTJjX3J4ZGF0YShpbXgwNzRfY2xpZW50LT5hZGRyLCBidWYsIHJsZW4pOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiaW14MDc0X2kyY19yZWFkIDB4JXggZmFpbGVkIVxuIiwgcmFkZHIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCSpyZGF0YSA9IChybGVuID09IDIgPyBidWZbMF0gPDwgOCB8IGJ1ZlsxXSA6IGJ1ZlswXSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGlteDA3NF9hZl9pMmNfcnhkYXRhX2IodW5zaWduZWQgc2hvcnQgc2FkZHIsCi0JdW5zaWduZWQgY2hhciAqcnhkYXRhLCBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKLQkJewotCQkuYWRkciAgPSBzYWRkciwKLQkJLmZsYWdzID0gMCwKLQkJLmxlbiAgID0gMSwKLQkJLmJ1ZiAgID0gcnhkYXRhLAotCQl9LAotCQl7Ci0JCS5hZGRyICA9IHNhZGRyLAotCQkuZmxhZ3MgPSBJMkNfTV9SRCwKLQkJLmxlbiAgID0gMSwKLQkJLmJ1ZiAgID0gcnhkYXRhLAotCQl9LAotCX07Ci0KLQlpZiAoaTJjX3RyYW5zZmVyKGlteDA3NF9jbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpIDwgMCkgewotCQlDREJHKCJpbXgwNzRfaTJjX3J4ZGF0YV9iIGZhaWxlZCFcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgaW14MDc0X2kyY19yZWFkX3dfZWVwcm9tKHVuc2lnbmVkIHNob3J0IHJhZGRyLAotCXVuc2lnbmVkIHNob3J0ICpyZGF0YSkKLXsKLQlpbnQzMl90IHJjOwotCXVuc2lnbmVkIGNoYXIgYnVmOwotCWlmICghcmRhdGEpCi0JCXJldHVybiAtRUlPOwotCS8qIFJlYWQgMiBieXRlcyBpbiBzZXF1ZW5jZSAqLwotCWJ1ZiA9IChyYWRkciAmIDB4MDBGRik7Ci0JcmMgPSBpbXgwNzRfYWZfaTJjX3J4ZGF0YV9iKElNWDA3NF9FRVBST01fU0xBVkVfQUREUiwgJmJ1ZiwgMSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJpbXgwNzRfaTJjX3JlYWRfZWVwcm9tIDB4JXggZmFpbGVkIVxuIiwgcmFkZHIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCSpyZGF0YSA9IGJ1Zjw8ODsKLQotCS8qIFJlYWQgU2Vjb25kIGJ5dGUgb2YgZGF0YSAqLwotCWJ1ZiA9IChyYWRkciAmIDB4MDBGRikgKyAxOwotCXJjID0gaW14MDc0X2FmX2kyY19yeGRhdGFfYihJTVgwNzRfRUVQUk9NX1NMQVZFX0FERFIsICZidWYsIDEpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiaW14MDc0X2kyY19yZWFkX2VlcHJvbSAweCV4IGZhaWxlZCFcbiIsIHJhZGRyKTsKLQkJcmV0dXJuIHJjOwotCX0KLQkqcmRhdGEgfD0gYnVmOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgaW14MDc0X2kyY193cml0ZV9iX3NlbnNvcih1bnNpZ25lZCBzaG9ydCB3YWRkciwgdWludDhfdCBiZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gLUVGQVVMVDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlszXTsKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gKHdhZGRyICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlsxXSA9ICh3YWRkciAmIDB4MDBGRik7Ci0JYnVmWzJdID0gYmRhdGE7Ci0JQ0RCRygiaTJjX3dyaXRlX2IgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIHdhZGRyLCBiZGF0YSk7Ci0JcmMgPSBpbXgwNzRfaTJjX3R4ZGF0YShpbXgwNzRfY2xpZW50LT5hZGRyLCBidWYsIDMpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiaTJjX3dyaXRlX2IgZmFpbGVkLCBhZGRyID0gMHgleCwgdmFsID0gMHgleCFcbiIsCi0JCQl3YWRkciwgYmRhdGEpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50MTZfdCBpbXgwNzRfaTJjX3dyaXRlX2JfYWYodW5zaWduZWQgc2hvcnQgc2FkZHIsCi0JdW5zaWduZWQgc2hvcnQgYmFkZHIsIHVuc2lnbmVkIHNob3J0IGJkYXRhKQotewotCWludDMyX3QgcmM7Ci0JdW5zaWduZWQgY2hhciBidWZbMl07Ci0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9IGJhZGRyOwotCWJ1ZlsxXSA9IGJkYXRhOwotCXJjID0gaW14MDc0X2kyY190eGRhdGEoc2FkZHIsIGJ1ZiwgMik7Ci0JaWYgKHJjIDwgMCkKLQkJQ0RCRygiQUZpMmNfd3JpdGUgZmFpbGVkLCBzYWRkciA9IDB4JXggYWRkciA9IDB4JXgsIHZhbCA9MHgleCEiLAotCQkJc2FkZHIsIGJhZGRyLCBiZGF0YSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBpbXgwNzRfaTJjX3dyaXRlX3dfdGFibGUoc3RydWN0IGlteDA3NF9pMmNfcmVnX2NvbmYgY29uc3QKLQkJCQkJICpyZWdfY29uZl90YmwsIGludCBudW0pCi17Ci0JaW50IGk7Ci0JaW50MzJfdCByYyA9IC1FSU87Ci0JZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCXJjID0gaW14MDc0X2kyY193cml0ZV9iX3NlbnNvcihyZWdfY29uZl90YmwtPndhZGRyLAotCQkJcmVnX2NvbmZfdGJsLT53ZGF0YSk7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQkJcmVnX2NvbmZfdGJsKys7Ci0JfQotCXJldHVybiByYzsKLX0KLXN0YXRpYyBpbnQxNl90IGlteDA3NF9hZl9pbml0KHZvaWQpCi17Ci0JaW50MzJfdCByYzsKLQkvKiBJbml0aWFsaXplIHdhdmVmb3JtICovCi0JcmMgPSBpbXgwNzRfaTJjX3dyaXRlX2JfYWYoSU1YMDc0X0FGX0kyQ19TTEFWRV9JRCwgMHgwMSwgMHhBOSk7Ci0JcmMgPSBpbXgwNzRfaTJjX3dyaXRlX2JfYWYoSU1YMDc0X0FGX0kyQ19TTEFWRV9JRCwgMHgwMiwgMHhEMik7Ci0JcmMgPSBpbXgwNzRfaTJjX3dyaXRlX2JfYWYoSU1YMDc0X0FGX0kyQ19TTEFWRV9JRCwgMHgwMywgMHgwQyk7Ci0JcmMgPSBpbXgwNzRfaTJjX3dyaXRlX2JfYWYoSU1YMDc0X0FGX0kyQ19TTEFWRV9JRCwgMHgwNCwgMHgxNCk7Ci0JcmMgPSBpbXgwNzRfaTJjX3dyaXRlX2JfYWYoSU1YMDc0X0FGX0kyQ19TTEFWRV9JRCwgMHgwNSwgMHhCNik7Ci0JcmMgPSBpbXgwNzRfaTJjX3dyaXRlX2JfYWYoSU1YMDc0X0FGX0kyQ19TTEFWRV9JRCwgMHgwNiwgMHg0Rik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBpbXgwNzRfZ2V0X3BpY3RfZnBzKHVpbnQxNl90IGZwcywgdWludDE2X3QgKnBmcHMpCi17Ci0JLyogaW5wdXQgZnBzIGlzIHByZXZpZXcgZnBzIGluIFE4IGZvcm1hdCAqLwotCXVpbnQxNl90IHByZXZpZXdfZnJhbWVfbGVuZ3RoX2xpbmVzLCBzbmFwc2hvdF9mcmFtZV9sZW5ndGhfbGluZXM7Ci0JdWludDMyX3QgZGl2aWRlciwgZDE7Ci0JdWludDMyX3QgcGNsa19tdWx0Oy8qUTEwICovCi0JLyogVG90YWwgZnJhbWVfbGVuZ3RoX2xpbmVzIGFuZCBsaW5lX2xlbmd0aF9wY2sgZm9yIHByZXZpZXcgKi8KLQlwcmV2aWV3X2ZyYW1lX2xlbmd0aF9saW5lcyA9IElNWDA3NF9RVFJfU0laRV9IRUlHSFQgKwotCQlJTVgwNzRfVkVSX1FUUl9CTEtfTElORVM7Ci0JLyogVG90YWwgZnJhbWVfbGVuZ3RoX2xpbmVzIGFuZCBsaW5lX2xlbmd0aF9wY2sgZm9yIHNuYXBzaG90ICovCi0Jc25hcHNob3RfZnJhbWVfbGVuZ3RoX2xpbmVzID0gSU1YMDc0X0ZVTExfU0laRV9IRUlHSFQgKwotCQlJTVgwNzRfVkVSX0ZVTExfQkxLX0xJTkVTOwotCWQxID0gcHJldmlld19mcmFtZV9sZW5ndGhfbGluZXMgKiAweDAwMDEwMDAwIC8KLQkJc25hcHNob3RfZnJhbWVfbGVuZ3RoX2xpbmVzOwotCXBjbGtfbXVsdCA9Ci0JCSh1aW50MzJfdCkgKChpbXgwNzRfcmVncy5yZWdfcGF0W1JFU19DQVBUVVJFXS5wbGxfbXVsdGlwbGllciAqCi0JCTB4MDAwMTAwMDApIC8KLQkJKGlteDA3NF9yZWdzLnJlZ19wYXRbUkVTX1BSRVZJRVddLnBsbF9tdWx0aXBsaWVyKSk7Ci0JZGl2aWRlciA9IGQxICogcGNsa19tdWx0IC8gMHgwMDAxMDAwMDsKLQkqcGZwcyA9ICh1aW50MTZfdCkgKGZwcyAqIGRpdmlkZXIgLyAweDAwMDEwMDAwKTsKLX0KLQotc3RhdGljIHVpbnQxNl90IGlteDA3NF9nZXRfcHJldl9saW5lc19wZih2b2lkKQotewotCWlmIChpbXgwNzRfY3RybC0+cHJldl9yZXMgPT0gUVRSX1NJWkUpCi0JCXJldHVybiBJTVgwNzRfUVRSX1NJWkVfSEVJR0hUICsgSU1YMDc0X1ZFUl9RVFJfQkxLX0xJTkVTOwotCWVsc2UKLQkJcmV0dXJuIElNWDA3NF9GVUxMX1NJWkVfSEVJR0hUICsgSU1YMDc0X1ZFUl9GVUxMX0JMS19MSU5FUzsKLQotfQotCi1zdGF0aWMgdWludDE2X3QgaW14MDc0X2dldF9wcmV2X3BpeGVsc19wbCh2b2lkKQotewotCWlmIChpbXgwNzRfY3RybC0+cHJldl9yZXMgPT0gUVRSX1NJWkUpCi0JCXJldHVybiBJTVgwNzRfUVRSX1NJWkVfV0lEVEggKyBJTVgwNzRfSFJaX1FUUl9CTEtfUElYRUxTOwotCWVsc2UKLQkJcmV0dXJuIElNWDA3NF9GVUxMX1NJWkVfV0lEVEggKyBJTVgwNzRfSFJaX0ZVTExfQkxLX1BJWEVMUzsKLX0KLQotc3RhdGljIHVpbnQxNl90IGlteDA3NF9nZXRfcGljdF9saW5lc19wZih2b2lkKQotewotCQlpZiAoaW14MDc0X2N0cmwtPnBpY3RfcmVzID09IFFUUl9TSVpFKQotCQkJcmV0dXJuIElNWDA3NF9RVFJfU0laRV9IRUlHSFQgKwotCQkJCUlNWDA3NF9WRVJfUVRSX0JMS19MSU5FUzsKLQkJZWxzZQotCQkJcmV0dXJuIElNWDA3NF9GVUxMX1NJWkVfSEVJR0hUICsKLQkJCQlJTVgwNzRfVkVSX0ZVTExfQkxLX0xJTkVTOwotfQotCi1zdGF0aWMgdWludDE2X3QgaW14MDc0X2dldF9waWN0X3BpeGVsc19wbCh2b2lkKQotewotCWlmIChpbXgwNzRfY3RybC0+cGljdF9yZXMgPT0gUVRSX1NJWkUpCi0JCXJldHVybiBJTVgwNzRfUVRSX1NJWkVfV0lEVEggKwotCQkJSU1YMDc0X0hSWl9RVFJfQkxLX1BJWEVMUzsKLQllbHNlCi0JCXJldHVybiBJTVgwNzRfRlVMTF9TSVpFX1dJRFRIICsKLQkJCUlNWDA3NF9IUlpfRlVMTF9CTEtfUElYRUxTOwotfQotCi1zdGF0aWMgdWludDMyX3QgaW14MDc0X2dldF9waWN0X21heF9leHBfbGModm9pZCkKLXsKLQlpZiAoaW14MDc0X2N0cmwtPnBpY3RfcmVzID09IFFUUl9TSVpFKQotCQlyZXR1cm4gKElNWDA3NF9RVFJfU0laRV9IRUlHSFQgKwotCQkJSU1YMDc0X1ZFUl9RVFJfQkxLX0xJTkVTKSoyNDsKLQllbHNlCi0JCXJldHVybiAoSU1YMDc0X0ZVTExfU0laRV9IRUlHSFQgKwotCQkJSU1YMDc0X1ZFUl9GVUxMX0JMS19MSU5FUykqMjQ7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IGlteDA3NF9zZXRfZnBzKHN0cnVjdCBmcHNfY2ZnCSpmcHMpCi17Ci0JdWludDE2X3QgdG90YWxfbGluZXNfcGVyX2ZyYW1lOwotCWludDMyX3QgcmMgPSAwOwotCWlteDA3NF9jdHJsLT5mcHNfZGl2aWRlciA9IGZwcy0+ZnBzX2RpdjsKLQlpbXgwNzRfY3RybC0+cGljdF9mcHNfZGl2aWRlciA9IGZwcy0+cGljdF9mcHNfZGl2OwotCWlmIChpbXgwNzRfY3RybC0+Y3Vycl9yZXMgID09IFFUUl9TSVpFKSB7Ci0JCXRvdGFsX2xpbmVzX3Blcl9mcmFtZSA9ICh1aW50MTZfdCkoKChJTVgwNzRfUVRSX1NJWkVfSEVJR0hUICsKLQkJCUlNWDA3NF9WRVJfUVRSX0JMS19MSU5FUykgKgotCQkJaW14MDc0X2N0cmwtPmZwc19kaXZpZGVyKSAvIDB4NDAwKTsKLQl9IGVsc2UgewotCQl0b3RhbF9saW5lc19wZXJfZnJhbWUgPSAodWludDE2X3QpKCgoSU1YMDc0X0ZVTExfU0laRV9IRUlHSFQgKwotCQkJSU1YMDc0X1ZFUl9GVUxMX0JMS19MSU5FUykgKgotCQkJaW14MDc0X2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIpIC8gMHg0MDApOwotCX0KLQlpZiAoaW14MDc0X2kyY193cml0ZV9iX3NlbnNvcihSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0hJLAotCQkoKHRvdGFsX2xpbmVzX3Blcl9mcmFtZSAmIDB4RkYwMCkgPj4gOCkpIDwgMCkKLQkJcmV0dXJuIHJjOwotCWlmIChpbXgwNzRfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19GUkFNRV9MRU5HVEhfTElORVNfTE8sCi0JCSh0b3RhbF9saW5lc19wZXJfZnJhbWUgJiAweDAwRkYpKSA8IDApCi0JCXJldHVybiByYzsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IGlteDA3NF93cml0ZV9leHBfZ2Fpbih1aW50MTZfdCBnYWluLCB1aW50MzJfdCBsaW5lKQotewotCXN0YXRpYyB1aW50MTZfdCBtYXhfbGVnYWxfZ2FpbiA9IDB4MDBFMDsKLQl1aW50OF90IGdhaW5fbXNiLCBnYWluX2xzYjsKLQl1aW50OF90IGludGdfdGltZV9tc2IsIGludGdfdGltZV9sc2I7Ci0JdWludDhfdCBmcmFtZV9sZW5ndGhfbGluZV9tc2IsIGZyYW1lX2xlbmd0aF9saW5lX2xzYjsKLQl1aW50MTZfdCBmcmFtZV9sZW5ndGhfbGluZXM7Ci0JaW50MzJfdCByYyA9IC0xOwotCi0JQ0RCRygiaW14MDc0X3dyaXRlX2V4cF9nYWluIDogZ2FpbiA9ICVkIGxpbmUgPSAlZCIsIGdhaW4sIGxpbmUpOwotCWlmIChpbXgwNzRfY3RybC0+Y3Vycl9yZXMgID09IFFUUl9TSVpFKSB7Ci0JCWZyYW1lX2xlbmd0aF9saW5lcyA9IElNWDA3NF9RVFJfU0laRV9IRUlHSFQgKwotCQkJSU1YMDc0X1ZFUl9RVFJfQkxLX0xJTkVTOwotCQlmcmFtZV9sZW5ndGhfbGluZXMgPSBmcmFtZV9sZW5ndGhfbGluZXMgKgotCQkJaW14MDc0X2N0cmwtPmZwc19kaXZpZGVyIC8gMHg0MDA7Ci0JfSBlbHNlIHsKLQkJZnJhbWVfbGVuZ3RoX2xpbmVzID0gSU1YMDc0X0ZVTExfU0laRV9IRUlHSFQgKwotCQkJSU1YMDc0X1ZFUl9GVUxMX0JMS19MSU5FUzsKLQkJZnJhbWVfbGVuZ3RoX2xpbmVzID0gZnJhbWVfbGVuZ3RoX2xpbmVzICoKLQkJCWlteDA3NF9jdHJsLT5waWN0X2Zwc19kaXZpZGVyIC8gMHg0MDA7Ci0JfQotCWlmIChsaW5lID4gKGZyYW1lX2xlbmd0aF9saW5lcyAtIElNWDA3NF9PRkZTRVQpKQotCQlmcmFtZV9sZW5ndGhfbGluZXMgPSBsaW5lICsgSU1YMDc0X09GRlNFVDsKLQotCUNEQkcoImlteDA3NCBzZXR0aW5nIGxpbmUgPSAlZFxuIiwgbGluZSk7Ci0KLQotCUNEQkcoImlteDA3NCBzZXR0aW5nIGZyYW1lX2xlbmd0aF9saW5lcyA9ICVkXG4iLAotCQkJCQlmcmFtZV9sZW5ndGhfbGluZXMpOwotCi0JaWYgKGdhaW4gPiBtYXhfbGVnYWxfZ2FpbikKLQkJLyogcmFuZ2U6IDAgdG8gMjI0ICovCi0JCWdhaW4gPSBtYXhfbGVnYWxfZ2FpbjsKLQotCS8qIHVwZGF0ZSBnYWluIHJlZ2lzdGVycyAqLwotCWdhaW5fbXNiID0gKHVpbnQ4X3QpICgoZ2FpbiAmIDB4RkYwMCkgPj4gOCk7Ci0JZ2Fpbl9sc2IgPSAodWludDhfdCkgKGdhaW4gJiAweDAwRkYpOwotCi0JZnJhbWVfbGVuZ3RoX2xpbmVfbXNiID0gKHVpbnQ4X3QpICgoZnJhbWVfbGVuZ3RoX2xpbmVzICYgMHhGRjAwKSA+PiA4KTsKLQlmcmFtZV9sZW5ndGhfbGluZV9sc2IgPSAodWludDhfdCkgKGZyYW1lX2xlbmd0aF9saW5lcyAmIDB4MDBGRik7Ci0KLQkvKiB1cGRhdGUgbGluZSBjb3VudCByZWdpc3RlcnMgKi8KLQlpbnRnX3RpbWVfbXNiID0gKHVpbnQ4X3QpICgobGluZSAmIDB4RkYwMCkgPj4gOCk7Ci0JaW50Z190aW1lX2xzYiA9ICh1aW50OF90KSAobGluZSAmIDB4MDBGRik7Ci0KLQlyYyA9IGlteDA3NF9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJCUdST1VQRURfUEFSQU1FVEVSX0hPTEQpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQlDREJHKCJpbXgwNzQgc2V0dGluZyBSRUdfQU5BTE9HVUVfR0FJTl9DT0RFX0dMT0JBTF9ISSA9IDB4JVhcbiIsCi0JCQkJCWdhaW5fbXNiKTsKLQlyYyA9IGlteDA3NF9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0FOQUxPR1VFX0dBSU5fQ09ERV9HTE9CQUxfSEksCi0JCQkJCWdhaW5fbXNiKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0JQ0RCRygiaW14MDc0IHNldHRpbmcgUkVHX0FOQUxPR1VFX0dBSU5fQ09ERV9HTE9CQUxfTE8gPSAweCVYXG4iLAotCQkJCQlnYWluX2xzYik7Ci0JcmMgPSBpbXgwNzRfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19BTkFMT0dVRV9HQUlOX0NPREVfR0xPQkFMX0xPLAotCQkJCQlnYWluX2xzYik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JQ0RCRygiaW14MDc0IHNldHRpbmcgUkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19ISSA9IDB4JVhcbiIsCi0JCQkJCWZyYW1lX2xlbmd0aF9saW5lX21zYik7Ci0JcmMgPSBpbXgwNzRfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19GUkFNRV9MRU5HVEhfTElORVNfSEksCi0JCQlmcmFtZV9sZW5ndGhfbGluZV9tc2IpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCUNEQkcoImlteDA3NCBzZXR0aW5nIFJFR19GUkFNRV9MRU5HVEhfTElORVNfTE8gPSAweCVYXG4iLAotCQkJZnJhbWVfbGVuZ3RoX2xpbmVfbHNiKTsKLQlyYyA9IGlteDA3NF9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19MTywKLQkJCWZyYW1lX2xlbmd0aF9saW5lX2xzYik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JQ0RCRygiaW14MDc0IHNldHRpbmcgUkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0hJID0gMHglWFxuIiwKLQkJCQkJaW50Z190aW1lX21zYik7Ci0JcmMgPSBpbXgwNzRfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9ISSwKLQkJCQkJaW50Z190aW1lX21zYik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JQ0RCRygiaW14MDc0IHNldHRpbmcgUkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0xPID0gMHglWFxuIiwKLQkJCQkJaW50Z190aW1lX2xzYik7Ci0JcmMgPSBpbXgwNzRfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9MTywKLQkJCQkJaW50Z190aW1lX2xzYik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBpbXgwNzRfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCQlHUk9VUEVEX1BBUkFNRVRFUl9IT0xEX09GRik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBpbXgwNzRfc2V0X3BpY3RfZXhwX2dhaW4odWludDE2X3QgZ2FpbiwgdWludDMyX3QgbGluZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlyYyA9IGlteDA3NF93cml0ZV9leHBfZ2FpbihnYWluLCBsaW5lKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IGlteDA3NF9tb3ZlX2ZvY3VzKGludCBkaXJlY3Rpb24sCi0JaW50MzJfdCBudW1fc3RlcHMpCi17Ci0JaW50MzJfdCBzdGVwX2RpcmVjdGlvbiwgZGVzdF9zdGVwX3Bvc2l0aW9uLCBiaXRfbWFzazsKLQlpbnQzMl90IHJjID0gMDsKLQotCWlmIChudW1fc3RlcHMgPT0gMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGRpcmVjdGlvbiA9PSBNT1ZFX05FQVIpIHsKLQkJc3RlcF9kaXJlY3Rpb24gPSAxOwotCQliaXRfbWFzayA9IDB4ODA7Ci0JfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gTU9WRV9GQVIpIHsKLQkJc3RlcF9kaXJlY3Rpb24gPSAtMTsKLQkJYml0X21hc2sgPSAweDAwOwotCX0gZWxzZSB7Ci0JCUNEQkcoImlteDA3NF9tb3ZlX2ZvY3VzOiBJbGxlZ2FsIGZvY3VzIGRpcmVjdGlvbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGVzdF9zdGVwX3Bvc2l0aW9uID0gaW14MDc0X2N0cmwtPmN1cnJfc3RlcF9wb3MgKwotCQkoc3RlcF9kaXJlY3Rpb24gKiBudW1fc3RlcHMpOwotCWlmIChkZXN0X3N0ZXBfcG9zaXRpb24gPCAwKQotCQlkZXN0X3N0ZXBfcG9zaXRpb24gPSAwOwotCWVsc2UgaWYgKGRlc3Rfc3RlcF9wb3NpdGlvbiA+IElNWDA3NF9UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUikKLQkJZGVzdF9zdGVwX3Bvc2l0aW9uID0gSU1YMDc0X1RPVEFMX1NURVBTX05FQVJfVE9fRkFSOwotCXJjID0gaW14MDc0X2kyY193cml0ZV9iX2FmKElNWDA3NF9BRl9JMkNfU0xBVkVfSUQsIDB4MDAsCi0JCSgobnVtX3N0ZXBzICogaW14MDc0X2xfcmVnaW9uX2NvZGVfcGVyX3N0ZXApIHwgYml0X21hc2spKTsKLQlDREJHKCIlczogSW5kZXg6ICVkXG4iLCBfX2Z1bmNfXywgZGVzdF9zdGVwX3Bvc2l0aW9uKTsKLQlpbXgwNzRfY3RybC0+Y3Vycl9zdGVwX3BvcyA9IGRlc3Rfc3RlcF9wb3NpdGlvbjsKLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIGludDMyX3QgaW14MDc0X3NldF9kZWZhdWx0X2ZvY3VzKHVpbnQ4X3QgYWZfc3RlcCkKLXsKLQlpbnQzMl90IHJjOwotCS8qIEluaXRpYWxpemUgdG8gaW5maW5pdHkgKi8KLQlyYyA9IGlteDA3NF9pMmNfd3JpdGVfYl9hZihJTVgwNzRfQUZfSTJDX1NMQVZFX0lELCAweDAwLCAweDdGKTsKLQlyYyA9IGlteDA3NF9pMmNfd3JpdGVfYl9hZihJTVgwNzRfQUZfSTJDX1NMQVZFX0lELCAweDAwLCAweDdGKTsKLQlpbXgwNzRfY3RybC0+Y3Vycl9zdGVwX3BvcyA9IDA7Ci0JcmV0dXJuIHJjOwotfQotc3RhdGljIGludDMyX3QgaW14MDc0X3Rlc3QoZW51bSBpbXgwNzRfdGVzdF9tb2RlX3QgbW8pCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JaWYgKG1vID09IFRFU1RfT0ZGKQotCQlyZXR1cm4gcmM7Ci0JZWxzZSB7Ci0JCS8qIFNldCBtbyB0byAyIGlub3JkZXIgdG8gZW5hYmxlIHRlc3QgcGF0dGVybiovCi0JCWlmIChpbXgwNzRfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19URVNUX1BBVFRFUk5fTU9ERSwKLQkJCSh1aW50OF90KSBtbykgPCAwKSB7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotc3RhdGljIGludDMyX3QgaW14MDc0X3NlbnNvcl9zZXR0aW5nKGludCB1cGRhdGVfdHlwZSwgaW50IHJ0KQotewotCWludDMyX3QgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX2NzaV9wYXJhbXMgaW14MDc0X2NzaV9wYXJhbXM7Ci0Jc3dpdGNoICh1cGRhdGVfdHlwZSkgewotCWNhc2UgUkVHX0lOSVQ6Ci0JCWlmIChydCA9PSBSRVNfUFJFVklFVyB8fCBydCA9PSBSRVNfQ0FQVFVSRSkgewotCQkJc3RydWN0IGlteDA3NF9pMmNfcmVnX2NvbmYgaW5pdF90YmxbXSA9IHsKLQkJCQl7UkVHX1BSRV9QTExfQ0xLX0RJViwKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCQlwcmVfcGxsX2Nsa19kaXZ9LAotCQkJCXtSRUdfUExTVEFUSU0sCi0JCQkJCWlteDA3NF9yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcGxzdGF0aW19LAotCQkJCXtSRUdfMzAyNCwKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCQlyZWdfMzAyNH0sCi0JCQkJe1JFR19JTUFHRV9PUklFTlRBVElPTiwKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCQlpbWFnZV9vcmllbnRhdGlvbn0sCi0JCQkJe1JFR19WTkRNWV9BQkxNR1NITE1ULAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJCXZuZG15X2FibG1nc2hsbXR9LAotCQkJCXtSRUdfWV9PUEJBRERSX1NUQVJUX0RJLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJCXlfb3BiYWRkcl9zdGFydF9kaX0sCi0JCQkJe1JFR18zMDE1LAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJCXJlZ18weDMwMTV9LAotCQkJCXtSRUdfMzAxQywKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCQlyZWdfMHgzMDFjfSwKLQkJCQl7UkVHXzMwMkMsCi0JCQkJCWlteDA3NF9yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcmVnXzB4MzAyY30sCi0JCQkJe1JFR18zMDMxLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAzMX0sCi0JCQkJe1JFR18zMDQxLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzA0MX0sCi0JCQkJe1JFR18zMDUxLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzA1MX0sCi0JCQkJe1JFR18zMDUzLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzA1M30sCi0JCQkJe1JFR18zMDU3LAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzA1N30sCi0JCQkJe1JFR18zMDVDLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzA1Y30sCi0JCQkJe1JFR18zMDVELAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzA1ZH0sCi0JCQkJe1JFR18zMDYwLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzA2MH0sCi0JCQkJe1JFR18zMDY1LAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzA2NX0sCi0JCQkJe1JFR18zMEFBLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzBhYX0sCi0JCQkJe1JFR18zMEFCLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzBhYn0sCi0JCQkJe1JFR18zMEIwLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzBiMH0sCi0JCQkJe1JFR18zMEIyLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzBiMn0sCi0JCQkJe1JFR18zMEQzLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzBkM30sCi0JCQkJe1JFR18zMTA2LAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzEwNn0sCi0JCQkJe1JFR18zMTBDLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzEwY30sCi0JCQkJe1JFR18zMzA0LAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzMwNH0sCi0JCQkJe1JFR18zMzA1LAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzMwNX0sCi0JCQkJe1JFR18zMzA2LAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzMwNn0sCi0JCQkJe1JFR18zMzA3LAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzMwN30sCi0JCQkJe1JFR18zMzA4LAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzMwOH0sCi0JCQkJe1JFR18zMzA5LAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzMwOX0sCi0JCQkJe1JFR18zMzBBLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzMwYX0sCi0JCQkJe1JFR18zMzBCLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzMwYn0sCi0JCQkJe1JFR18zMzBDLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzMwY30sCi0JCQkJe1JFR18zMzBELAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzMwZH0sCi0JCQkJe1JFR18zMzBGLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzMwZn0sCi0JCQkJe1JFR18zMzgxLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzM4MX0sCi0JCQl9OwotCQkJc3RydWN0IGlteDA3NF9pMmNfcmVnX2NvbmYgaW5pdF9tb2RlX3RibFtdID0gewotCQkJCXtSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQkJR1JPVVBFRF9QQVJBTUVURVJfSE9MRH0sCi0JCQkJe1JFR19QTExfTVVMVElQTElFUiwKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXBsbF9tdWx0aXBsaWVyfSwKLQkJCQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19ISSwKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCWZyYW1lX2xlbmd0aF9saW5lc19oaX0sCi0JCQkJe1JFR19GUkFNRV9MRU5HVEhfTElORVNfTE8sCi0JCQkJCWlteDA3NF9yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQlmcmFtZV9sZW5ndGhfbGluZXNfbG99LAotCQkJCXtSRUdfWUFERFJfU1RBUlQgLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJeV9hZGRyX3N0YXJ0fSwKLQkJCQl7UkVHX1lBQUFSX0VORCwKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXlfYWRkX2VuZH0sCi0JCQkJe1JFR19YX09VVFBVVF9TSVpFX01TQiwKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXhfb3V0cHV0X3NpemVfbXNifSwKLQkJCQl7UkVHX1hfT1VUUFVUX1NJWkVfTFNCLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJeF9vdXRwdXRfc2l6ZV9sc2J9LAotCQkJCXtSRUdfWV9PVVRQVVRfU0laRV9NU0IsCi0JCQkJCWlteDA3NF9yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQl5X291dHB1dF9zaXplX21zYn0sCi0JCQkJe1JFR19ZX09VVFBVVF9TSVpFX0xTQiAsCi0JCQkJCWlteDA3NF9yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQl5X291dHB1dF9zaXplX2xzYn0sCi0JCQkJe1JFR19YX0VWRU5fSU5DLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJeF9ldmVuX2luY30sCi0JCQkJe1JFR19YX09ERF9JTkMsCi0JCQkJCWlteDA3NF9yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQl4X29kZF9pbmN9LAotCQkJCXtSRUdfWV9FVkVOX0lOQywKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXlfZXZlbl9pbmN9LAotCQkJCXtSRUdfWV9PRERfSU5DLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJeV9vZGRfaW5jfSwKLQkJCQl7UkVHX0hNT0RFQURELAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJaG1vZGVhZGR9LAotCQkJCXtSRUdfVk1PREVBREQsCi0JCQkJCWlteDA3NF9yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQl2bW9kZWFkZH0sCi0JCQkJe1JFR19WQVBQTElORV9TVEFSVCwKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXZhcHBsaW5lcG9zX3N0YXJ0fSwKLQkJCQl7UkVHX1ZBUFBMSU5FX0VORCwKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXZhcHBsaW5lcG9zX2VuZH0sCi0JCQkJe1JFR19TSFVUVEVSLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJc2h1dHRlcn0sCi0JCQkJe1JFR19IQUREQVZFLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJaGFkZGF2ZX0sCi0JCQkJe1JFR19MQU5FU0VMLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJbGFuZXNlbH0sCi0JCQkJe1JFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCQlHUk9VUEVEX1BBUkFNRVRFUl9IT0xEX09GRn0sCi0KLQkJCX07Ci0JCQkvKiByZXNldCBmcHNfZGl2aWRlciAqLwotCQkJaW14MDc0X2N0cmwtPmZwcyA9IDMwICogUTg7Ci0JCQlpbXgwNzRfY3RybC0+ZnBzX2RpdmlkZXIgPSAxICogMHg0MDA7Ci0JCQkvKiBzdG9wIHN0cmVhbWluZyAqLwotCQkJcmMgPSBpbXgwNzRfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19NT0RFX1NFTEVDVCwKLQkJCQlNT0RFX1NFTEVDVF9TVEFOREJZX01PREUpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQltc2xlZXAoaW14MDc0X2RlbGF5X21zZWNzX3N0ZGJ5KTsKLQkJCXJjID0gaW14MDc0X2kyY193cml0ZV93X3RhYmxlKCZpbml0X3RibFswXSwKLQkJCQlBUlJBWV9TSVpFKGluaXRfdGJsKSk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCXJjID0gaW14MDc0X2kyY193cml0ZV93X3RhYmxlKCZpbml0X21vZGVfdGJsWzBdLAotCQkJCUFSUkFZX1NJWkUoaW5pdF9tb2RlX3RibCkpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlyYyA9IGlteDA3NF90ZXN0KGlteDA3NF9jdHJsLT5zZXRfdGVzdCk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBVUERBVEVfUEVSSU9ESUM6Ci0JCWlmIChydCA9PSBSRVNfUFJFVklFVyB8fCBydCA9PSBSRVNfQ0FQVFVSRSkgewotCQkJc3RydWN0IGlteDA3NF9pMmNfcmVnX2NvbmYgbW9kZV90YmxbXSA9IHsKLQkJCQl7UkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJCUdST1VQRURfUEFSQU1FVEVSX0hPTER9LAotCQkJCXtSRUdfUExMX01VTFRJUExJRVIsCi0JCQkJCWlteDA3NF9yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQlwbGxfbXVsdGlwbGllcn0sCi0JCQkJe1JFR19GUkFNRV9MRU5HVEhfTElORVNfSEksCi0JCQkJCWlteDA3NF9yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQlmcmFtZV9sZW5ndGhfbGluZXNfaGl9LAotCQkJCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0xPLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJZnJhbWVfbGVuZ3RoX2xpbmVzX2xvfSwKLQkJCQl7UkVHX1lBRERSX1NUQVJUICwKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXlfYWRkcl9zdGFydH0sCi0JCQkJe1JFR19ZQUFBUl9FTkQsCi0JCQkJCWlteDA3NF9yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQl5X2FkZF9lbmR9LAotCQkJCXtSRUdfWF9PVVRQVVRfU0laRV9NU0IsCi0JCQkJCWlteDA3NF9yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQl4X291dHB1dF9zaXplX21zYn0sCi0JCQkJe1JFR19YX09VVFBVVF9TSVpFX0xTQiwKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXhfb3V0cHV0X3NpemVfbHNifSwKLQkJCQl7UkVHX1lfT1VUUFVUX1NJWkVfTVNCLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJeV9vdXRwdXRfc2l6ZV9tc2J9LAotCQkJCXtSRUdfWV9PVVRQVVRfU0laRV9MU0IgLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJeV9vdXRwdXRfc2l6ZV9sc2J9LAotCQkJCXtSRUdfWF9FVkVOX0lOQywKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXhfZXZlbl9pbmN9LAotCQkJCXtSRUdfWF9PRERfSU5DLAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJeF9vZGRfaW5jfSwKLQkJCQl7UkVHX1lfRVZFTl9JTkMsCi0JCQkJCWlteDA3NF9yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQl5X2V2ZW5faW5jfSwKLQkJCQl7UkVHX1lfT0REX0lOQywKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXlfb2RkX2luY30sCi0JCQkJe1JFR19ITU9ERUFERCwKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCWhtb2RlYWRkfSwKLQkJCQl7UkVHX1ZNT0RFQURELAotCQkJCQlpbXgwNzRfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJdm1vZGVhZGR9LAotCQkJCXtSRUdfVkFQUExJTkVfU1RBUlQsCi0JCQkJCWlteDA3NF9yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQl2YXBwbGluZXBvc19zdGFydH0sCi0JCQkJe1JFR19WQVBQTElORV9FTkQsCi0JCQkJCWlteDA3NF9yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQl2YXBwbGluZXBvc19lbmR9LAotCQkJCXtSRUdfU0hVVFRFUiwKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXNodXR0ZXJ9LAotCQkJCXtSRUdfSEFEREFWRSwKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCWhhZGRhdmV9LAotCQkJCXtSRUdfTEFORVNFTCwKLQkJCQkJaW14MDc0X3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCWxhbmVzZWx9LAotCQkJCXtSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQkJR1JPVVBFRF9QQVJBTUVURVJfSE9MRF9PRkZ9LAotCQkJfTsKLQotCQkJLyogc3RvcCBzdHJlYW1pbmcgKi8KLQkJCXJjID0gaW14MDc0X2kyY193cml0ZV9iX3NlbnNvcihSRUdfTU9ERV9TRUxFQ1QsCi0JCQkJTU9ERV9TRUxFQ1RfU1RBTkRCWV9NT0RFKTsKLQkJCW1zbGVlcChpbXgwNzRfZGVsYXlfbXNlY3Nfc3RkYnkpOwotCQkJaWYgKGNvbmZpZ19jc2kgPT0gMCkgewotCQkJCWlteDA3NF9jc2lfcGFyYW1zLmxhbmVfY250ID0gNDsKLQkJCQlpbXgwNzRfY3NpX3BhcmFtcy5kYXRhX2Zvcm1hdCA9IENTSV8xMEJJVDsKLQkJCQlpbXgwNzRfY3NpX3BhcmFtcy5sYW5lX2Fzc2lnbiA9IDB4ZTQ7Ci0JCQkJaW14MDc0X2NzaV9wYXJhbXMuZHBjbV9zY2hlbWUgPSAwOwotCQkJCWlteDA3NF9jc2lfcGFyYW1zLnNldHRsZV9jbnQgPSAweDE0OwotCQkJCXJjID0gbXNtX2NhbWlvX2NzaV9jb25maWcoJmlteDA3NF9jc2lfcGFyYW1zKTsKLQkJCQkvKmlteDA3NF9kZWxheV9tc2Vjc19zdGRieSovCi0JCQkJbXNsZWVwKGlteDA3NF9kZWxheV9tc2Vjc19zdHJlYW0pOwotCQkJCWNvbmZpZ19jc2kgPSAxOwotCQkJfQotCQkJcmMgPSBpbXgwNzRfaTJjX3dyaXRlX3dfdGFibGUoJm1vZGVfdGJsWzBdLAotCQkJCUFSUkFZX1NJWkUobW9kZV90YmwpKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJcmMgPSBpbXgwNzRfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19NT0RFX1NFTEVDVCwKLQkJCQlNT0RFX1NFTEVDVF9TVFJFQU0pOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQltc2xlZXAoaW14MDc0X2RlbGF5X21zZWNzX3N0cmVhbSk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIGludDMyX3QgaW14MDc0X3ZpZGVvX2NvbmZpZyhpbnQgbW9kZSkKLXsKLQotCWludDMyX3QJcmMgPSAwOwotCWludAlydDsKLQkvKiBjaGFuZ2Ugc2Vuc29yIHJlc29sdXRpb24JaWYgbmVlZGVkICovCi0JaWYgKGlteDA3NF9jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkgewotCQlydCA9IFJFU19QUkVWSUVXOwotCX0gZWxzZSB7Ci0JCXJ0ID0gUkVTX0NBUFRVUkU7Ci0JfQotCWlmIChpbXgwNzRfc2Vuc29yX3NldHRpbmcoVVBEQVRFX1BFUklPRElDLCBydCkgPCAwKQotCQlyZXR1cm4gcmM7Ci0JaW14MDc0X2N0cmwtPmN1cnJfcmVzID0gaW14MDc0X2N0cmwtPnByZXZfcmVzOwotCWlteDA3NF9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IGlteDA3NF9zbmFwc2hvdF9jb25maWcoaW50IG1vZGUpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JaW50IHJ0ID0gUkVTX1BSRVZJRVc7IC8qIFRPRE86IFVzZWQgd2l0aG91dCBpbml0aWFsaXphdGlvbiwgZ3Vlc3NpbmcuICovCi0JLyogY2hhbmdlIHNlbnNvciByZXNvbHV0aW9uIGlmIG5lZWRlZCAqLwotCWlmIChpbXgwNzRfY3RybC0+Y3Vycl9yZXMgIT0gaW14MDc0X2N0cmwtPnBpY3RfcmVzKSB7Ci0JCWlmIChpbXgwNzRfY3RybC0+cGljdF9yZXMgPT0gUVRSX1NJWkUpIHsKLQkJCXJ0ID0gUkVTX1BSRVZJRVc7Ci0JCX0gZWxzZSB7Ci0JCQlydCA9IFJFU19DQVBUVVJFOwotCQl9Ci0JfQotCWlmIChpbXgwNzRfc2Vuc29yX3NldHRpbmcoVVBEQVRFX1BFUklPRElDLCBydCkgPCAwKQotCQlyZXR1cm4gcmM7Ci0JaW14MDc0X2N0cmwtPmN1cnJfcmVzID0gaW14MDc0X2N0cmwtPnBpY3RfcmVzOwotCWlteDA3NF9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50MzJfdCBpbXgwNzRfcmF3X3NuYXBzaG90X2NvbmZpZyhpbnQgbW9kZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlpbnQgcnQgPSBSRVNfUFJFVklFVzsgLyogVE9ETzogVXNlZCB3aXRob3V0IGluaXRpYWxpemF0aW9uLCBndWVzc2luZy4gKi8KLQkvKiBjaGFuZ2Ugc2Vuc29yIHJlc29sdXRpb24gaWYgbmVlZGVkICovCi0JaWYgKGlteDA3NF9jdHJsLT5jdXJyX3JlcyAhPSBpbXgwNzRfY3RybC0+cGljdF9yZXMpIHsKLQkJaWYgKGlteDA3NF9jdHJsLT5waWN0X3JlcyA9PSBRVFJfU0laRSkgewotCQkJcnQgPSBSRVNfUFJFVklFVzsKLQkJfSBlbHNlIHsKLQkJCXJ0ID0gUkVTX0NBUFRVUkU7Ci0JCX0KLQl9Ci0JaWYgKGlteDA3NF9zZW5zb3Jfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsIHJ0KSA8IDApCi0JCXJldHVybiByYzsKLQlpbXgwNzRfY3RybC0+Y3Vycl9yZXMgPSBpbXgwNzRfY3RybC0+cGljdF9yZXM7Ci0JaW14MDc0X2N0cmwtPnNlbnNvcm1vZGUgPSBtb2RlOwotCXJldHVybiByYzsKLX0KLXN0YXRpYyBpbnQzMl90IGlteDA3NF9zZXRfc2Vuc29yX21vZGUoaW50IG1vZGUsCi0JaW50IHJlcykKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFNFTlNPUl9QUkVWSUVXX01PREU6Ci0JCXJjID0gaW14MDc0X3ZpZGVvX2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfU05BUFNIT1RfTU9ERToKLQkJcmMgPSBpbXgwNzRfc25hcHNob3RfY29uZmlnKG1vZGUpOwotCQlicmVhazsKLQljYXNlIFNFTlNPUl9SQVdfU05BUFNIT1RfTU9ERToKLQkJcmMgPSBpbXgwNzRfcmF3X3NuYXBzaG90X2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotc3RhdGljIGludDMyX3QgaW14MDc0X3Bvd2VyX2Rvd24odm9pZCkKLXsKLQlpbXgwNzRfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19NT0RFX1NFTEVDVCwKLQkJTU9ERV9TRUxFQ1RfU1RBTkRCWV9NT0RFKTsKLQltc2xlZXAoaW14MDc0X2RlbGF5X21zZWNzX3N0ZGJ5KTsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbnQgaW14MDc0X3Byb2JlX2luaXRfZG9uZShjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCWdwaW9fZGlyZWN0aW9uX2lucHV0KGRhdGEtPnNlbnNvcl9yZXNldCk7Ci0JZ3Bpb19mcmVlKGRhdGEtPnNlbnNvcl9yZXNldCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW14MDc0X3JlYWRfZWVwcm9tX2RhdGEoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSAqY2ZnKQotewotCWludDMyX3QgcmMgPSAwOwotCXVpbnQxNl90IGVlcHJvbWRhdGEgPSAwOwotCXVpbnQ4X3QgYWRkciA9IDA7Ci0KLQlhZGRyID0gMHgxMDsKLQlyYyA9IGlteDA3NF9pMmNfcmVhZF93X2VlcHJvbShhZGRyLCAmZWVwcm9tZGF0YSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCIlczogRXJyb3IgUmVhZGluZyBFRVBST00gQCAweCV4XG4iLCBfX2Z1bmNfXywgYWRkcik7Ci0JCXJldHVybiByYzsKLQl9Ci0JY2ZnLT5jZmcuY2FsaWJfaW5mby5yX292ZXJfZyA9IGVlcHJvbWRhdGE7Ci0KLQlhZGRyID0gMHgxMjsKLQlyYyA9IGlteDA3NF9pMmNfcmVhZF93X2VlcHJvbShhZGRyLCAmZWVwcm9tZGF0YSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCIlczogRXJyb3IgUmVhZGluZyBFRVBST00gQCAweCV4XG4iLCBfX2Z1bmNfXywgYWRkcik7Ci0JCXJldHVybiByYzsKLQl9Ci0JY2ZnLT5jZmcuY2FsaWJfaW5mby5iX292ZXJfZyA9IGVlcHJvbWRhdGE7Ci0KLQlhZGRyID0gMHgxNDsKLQlyYyA9IGlteDA3NF9pMmNfcmVhZF93X2VlcHJvbShhZGRyLCAmZWVwcm9tZGF0YSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCIlczogRXJyb3IgUmVhZGluZyBFRVBST00gQCAweCV4XG4iLCBfX2Z1bmNfXywgYWRkcik7Ci0JCXJldHVybiByYzsKLQl9Ci0JY2ZnLT5jZmcuY2FsaWJfaW5mby5ncl9vdmVyX2diID0gZWVwcm9tZGF0YTsKLQotCWFkZHIgPSAweDFBOwotCXJjID0gaW14MDc0X2kyY19yZWFkX3dfZWVwcm9tKGFkZHIsICZlZXByb21kYXRhKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIiVzOiBFcnJvciBSZWFkaW5nIEVFUFJPTSBAIDB4JXhcbiIsIF9fZnVuY19fLCBhZGRyKTsKLQkJcmV0dXJuIHJjOwotCX0KLQljZmctPmNmZy5jYWxpYl9pbmZvLm1hY3JvXzJfaW5mID0gZWVwcm9tZGF0YTsKLQotCWFkZHIgPSAweDFDOwotCXJjID0gaW14MDc0X2kyY19yZWFkX3dfZWVwcm9tKGFkZHIsICZlZXByb21kYXRhKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIiVzOiBFcnJvciBSZWFkaW5nIEVFUFJPTSBAIDB4JXhcbiIsIF9fZnVuY19fLCBhZGRyKTsKLQkJcmV0dXJuIHJjOwotCX0KLQljZmctPmNmZy5jYWxpYl9pbmZvLmluZl8yX21hY3JvID0gZWVwcm9tZGF0YTsKLQotCWFkZHIgPSAweDFFOwotCXJjID0gaW14MDc0X2kyY19yZWFkX3dfZWVwcm9tKGFkZHIsICZlZXByb21kYXRhKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIiVzOiBFcnJvciBSZWFkaW5nIEVFUFJPTSBAIDB4JXhcbiIsIF9fZnVuY19fLCBhZGRyKTsKLQkJcmV0dXJuIHJjOwotCX0KLQljZmctPmNmZy5jYWxpYl9pbmZvLnN0cm9rZV9hbXQgPSBlZXByb21kYXRhOwotCi0JYWRkciA9IDB4MjA7Ci0JcmMgPSBpbXgwNzRfaTJjX3JlYWRfd19lZXByb20oYWRkciwgJmVlcHJvbWRhdGEpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiJXM6IEVycm9yIFJlYWRpbmcgRUVQUk9NIEAgMHgleFxuIiwgX19mdW5jX18sIGFkZHIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCWNmZy0+Y2ZnLmNhbGliX2luZm8uYWZfcG9zXzFtID0gZWVwcm9tZGF0YTsKLQotCWFkZHIgPSAweDIyOwotCXJjID0gaW14MDc0X2kyY19yZWFkX3dfZWVwcm9tKGFkZHIsICZlZXByb21kYXRhKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIiVzOiBFcnJvciBSZWFkaW5nIEVFUFJPTSBAIDB4JXhcbiIsIF9fZnVuY19fLCBhZGRyKTsKLQkJcmV0dXJuIHJjOwotCX0KLQljZmctPmNmZy5jYWxpYl9pbmZvLmFmX3Bvc19pbmYgPSBlZXByb21kYXRhOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGlteDA3NF9wcm9iZV9pbml0X3NlbnNvcihjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1bnNpZ25lZCBzaG9ydCBjaGlwaWRsLCBjaGlwaWRoOwotCUNEQkcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlyYyA9IGdwaW9fcmVxdWVzdChkYXRhLT5zZW5zb3JfcmVzZXQsICJpbXgwNzQiKTsKLQlDREJHKCIgaW14MDc0X3Byb2JlX2luaXRfc2Vuc29yIFxuIik7Ci0JaWYgKCFyYykgewotCQlDREJHKCJzZW5zb3JfcmVzZXQgPSAlZFxuIiwgcmMpOwotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+c2Vuc29yX3Jlc2V0LCAwKTsKLQkJdXNsZWVwX3JhbmdlKDUwMDAsIDYwMDApOwotCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChkYXRhLT5zZW5zb3JfcmVzZXQsIDEpOwotCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNjAwMCk7Ci0JfSBlbHNlIHsKLQkJQ0RCRygiZ3BpbyByZXNldCBmYWlsIik7Ci0JCWdvdG8gaW5pdF9wcm9iZV9kb25lOwotCX0KLQlDREJHKCJpbXgwNzRfcHJvYmVfaW5pdF9zZW5zb3IgaXMgY2FsbGVkXG4iKTsKLQkvKiAzLiBSZWFkIHNlbnNvciBNb2RlbCBJRDogKi8KLQlyYyA9IGlteDA3NF9pMmNfcmVhZCgweDAwMDAsICZjaGlwaWRoLCAxKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIk1vZGVsIHJlYWQgZmFpbGVkXG4iKTsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCXJjID0gaW14MDc0X2kyY19yZWFkKDB4MDAwMSwgJmNoaXBpZGwsIDEpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiTW9kZWwgcmVhZCBmYWlsZWRcbiIpOwotCQlnb3RvIGluaXRfcHJvYmVfZmFpbDsKLQl9Ci0JQ0RCRygiaW14MDc0IG1vZGVsX2lkID0gMHgleCAgMHgleFxuIiwgY2hpcGlkaCwgY2hpcGlkbCk7Ci0JLyogNC4gQ29tcGFyZSBzZW5zb3IgSUQgdG8gSU1YMDc0IElEOiAqLwotCWlmIChjaGlwaWRoICE9IDB4MDAgfHwgY2hpcGlkbCAhPSAweDc0KSB7Ci0JCXJjID0gLUVOT0RFVjsKLQkJQ0RCRygiaW14MDc0X3Byb2JlX2luaXRfc2Vuc29yIGZhaWwgY2hpcCBpZCBkb2Vzbm90IG1hdGNoXG4iKTsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCWdvdG8gaW5pdF9wcm9iZV9kb25lOwotaW5pdF9wcm9iZV9mYWlsOgotCUNEQkcoImlteDA3NF9wcm9iZV9pbml0X3NlbnNvciBmYWlsc1xuIik7Ci0JaW14MDc0X3Byb2JlX2luaXRfZG9uZShkYXRhKTsKLWluaXRfcHJvYmVfZG9uZToKLQlDREJHKCIgaW14MDc0X3Byb2JlX2luaXRfc2Vuc29yIGZpbmlzaGVzXG4iKTsKLQlyZXR1cm4gcmM7Ci0JfQotc3RhdGljIGludDMyX3QgaW14MDc0X3Bvd2Vyb25fYWYodm9pZCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlDREJHKCJpbXgwNzQgZW5hYmxlIEFGIGFjdHVhdG9yLCBncGlvID0gJWRcbiIsCi0JCQlpbXgwNzRfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCk7Ci0JcmMgPSBncGlvX3JlcXVlc3QoaW14MDc0X2N0cmwtPnNlbnNvcmRhdGEtPnZjbV9wd2QsICJpbXgwNzQiKTsKLQlpZiAoIXJjKSB7Ci0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChpbXgwNzRfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCwgMSk7Ci0JCW1zbGVlcCgyMCk7Ci0JCXJjID0gaW14MDc0X2FmX2luaXQoKTsKLQkJaWYgKHJjIDwgMCkKLQkJCUNEQkcoImlteDA3NCBBRiBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOwotCX0gZWxzZSB7Ci0JCUNEQkcoIiVzOiBBRiBQb3dlck9OIGdwaW9fcmVxdWVzdCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JIH0KLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgdm9pZCBpbXgwNzRfcG93ZXJvZmZfYWYodm9pZCkKLXsKLQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChpbXgwNzRfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCwgMCk7Ci0JZ3Bpb19mcmVlKGlteDA3NF9jdHJsLT5zZW5zb3JkYXRhLT52Y21fcHdkKTsKLX0KLS8qIGNhbXNlbnNvcl9pdTA2MGZfaW14MDc0X3Jlc2V0ICovCi1pbnQgaW14MDc0X3NlbnNvcl9vcGVuX2luaXQoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JQ0RCRygiJXM6ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCUNEQkcoIkNhbGxpbmcgaW14MDc0X3NlbnNvcl9vcGVuX2luaXRcbiIpOwotCWlteDA3NF9jdHJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlteDA3NF9jdHJsX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlteDA3NF9jdHJsKSB7Ci0JCUNEQkcoImlteDA3NF9pbml0IGZhaWxlZCFcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gaW5pdF9kb25lOwotCX0KLQlpbXgwNzRfY3RybC0+ZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQlpbXgwNzRfY3RybC0+cGljdF9mcHNfZGl2aWRlciA9IDEgKiAweDAwMDAwNDAwOwotCWlteDA3NF9jdHJsLT5mcHMgPSAzMCAqIFE4OwotCWlteDA3NF9jdHJsLT5zZXRfdGVzdCA9IFRFU1RfT0ZGOwotCWlteDA3NF9jdHJsLT5wcmV2X3JlcyA9IFFUUl9TSVpFOwotCWlteDA3NF9jdHJsLT5waWN0X3JlcyA9IEZVTExfU0laRTsKLQlpbXgwNzRfY3RybC0+Y3Vycl9yZXMgPSBJTlZBTElEX1NJWkU7Ci0JY29uZmlnX2NzaSA9IDA7Ci0KLQlpZiAoZGF0YSkKLQkJaW14MDc0X2N0cmwtPnNlbnNvcmRhdGEgPSBkYXRhOwotCi0JLyogZW5hYmxlIG1jbGsgZmlyc3QgKi8KLQltc21fY2FtaW9fY2xrX3JhdGVfc2V0KElNWDA3NF9ERUZBVUxUX01BU1RFUl9DTEtfUkFURSk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwotCXJjID0gaW14MDc0X3Byb2JlX2luaXRfc2Vuc29yKGRhdGEpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiQ2FsbGluZyBpbXgwNzRfc2Vuc29yX29wZW5faW5pdCBmYWlsXG4iKTsKLQkJZ290byBwcm9iZV9mYWlsOwotCX0KLQotCXJjID0gaW14MDc0X3NlbnNvcl9zZXR0aW5nKFJFR19JTklULCBSRVNfUFJFVklFVyk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJpbXgwNzRfc2Vuc29yX3NldHRpbmcgZmFpbGVkXG4iKTsKLQkJZ290byBpbml0X2ZhaWw7Ci0JfQotCWlmIChtYWNoaW5lX2lzX21zbTh4NjBfZmx1aWQoKSkKLQkJcmMgPSBpbXgwNzRfcG93ZXJvbl9hZigpOwotCWVsc2UKLQkJcmMgPSBpbXgwNzRfYWZfaW5pdCgpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiQUYgaW5pdGlhbGlzYXRpb24gZmFpbGVkXG4iKTsKLQkJZ290byBpbml0X2ZhaWw7Ci0JfSBlbHNlCi0JCWdvdG8gaW5pdF9kb25lOwotcHJvYmVfZmFpbDoKLQlDREJHKCIgaW14MDc0X3NlbnNvcl9vcGVuX2luaXQgcHJvYmUgZmFpbFxuIik7Ci0Ja2ZyZWUoaW14MDc0X2N0cmwpOwotCXJldHVybiByYzsKLWluaXRfZmFpbDoKLQlDREJHKCIgaW14MDc0X3NlbnNvcl9vcGVuX2luaXQgZmFpbFxuIik7Ci0JaW14MDc0X3Byb2JlX2luaXRfZG9uZShkYXRhKTsKLQlrZnJlZShpbXgwNzRfY3RybCk7Ci1pbml0X2RvbmU6Ci0JQ0RCRygiaW14MDc0X3NlbnNvcl9vcGVuX2luaXQgZG9uZVxuIik7Ci0JcmV0dXJuIHJjOwotfQotc3RhdGljIGludCBpbXgwNzRfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQkvKiBJbml0aWFsaXplIHRoZSBNU01fQ0FNSTJDIENoaXAgKi8KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbXgwNzRfd2FpdF9xdWV1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBpbXgwNzRfaTJjX2lkW10gPSB7Ci0JeyJpbXgwNzQiLCAwfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBpbnQgaW14MDc0X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQgcmMgPSAwOwotCUNEQkcoImlteDA3NF9wcm9iZSBjYWxsZWQhXG4iKTsKLQotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7Ci0JCUNEQkcoImkyY19jaGVja19mdW5jdGlvbmFsaXR5IGZhaWxlZFxuIik7Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0KLQlpbXgwNzRfc2Vuc29ydyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpbXgwNzRfd29ya190KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbXgwNzRfc2Vuc29ydykgewotCQlDREJHKCJremFsbG9jIGZhaWxlZC5cbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpbXgwNzRfc2Vuc29ydyk7Ci0JaW14MDc0X2luaXRfY2xpZW50KGNsaWVudCk7Ci0JaW14MDc0X2NsaWVudCA9IGNsaWVudDsKLQotCi0JQ0RCRygiaW14MDc0X3Byb2JlIHN1Y2Nlc3NlZCEgcmMgPSAlZFxuIiwgcmMpOwotCXJldHVybiAwOwotCi1wcm9iZV9mYWlsdXJlOgotCUNEQkcoImlteDA3NF9wcm9iZSBmYWlsZWQhIHJjID0gJWRcbiIsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgX19leGl0IGlteDA3NF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgaW14MDc0X3dvcmtfdF90ICpzZW5zb3J3ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JZnJlZV9pcnEoY2xpZW50LT5pcnEsIHNlbnNvcncpOwotCWlteDA3NF9jbGllbnQgPSBOVUxMOwotCWtmcmVlKHNlbnNvcncpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaW14MDc0X2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gaW14MDc0X2kyY19pZCwKLQkucHJvYmUgID0gaW14MDc0X2kyY19wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3AoaW14MDc0X2kyY19yZW1vdmUpLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImlteDA3NCIsCi0JfSwKLX07Ci0KLWludCBpbXgwNzRfc2Vuc29yX2NvbmZpZyh2b2lkIF9fdXNlciAqYXJncCkKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhIGNkYXRhOwotCWxvbmcgICByYyA9IDA7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZjZGF0YSwKLQkJKHZvaWQgKilhcmdwLAotCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQltdXRleF9sb2NrKCZpbXgwNzRfbXV0KTsKLQlDREJHKCJpbXgwNzRfc2Vuc29yX2NvbmZpZzogY2ZndHlwZSA9ICVkXG4iLAotCWNkYXRhLmNmZ3R5cGUpOwotCXN3aXRjaCAoY2RhdGEuY2ZndHlwZSkgewotCWNhc2UgQ0ZHX0dFVF9QSUNUX0ZQUzoKLQkJaW14MDc0X2dldF9waWN0X2ZwcygKLQkJCWNkYXRhLmNmZy5nZnBzLnByZXZmcHMsCi0JCQkmKGNkYXRhLmNmZy5nZnBzLnBpY3RmcHMpKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkmY2RhdGEsCi0JCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JY2FzZSBDRkdfR0VUX1BSRVZfTF9QRjoKLQkJY2RhdGEuY2ZnLnByZXZsX3BmID0KLQkJCWlteDA3NF9nZXRfcHJldl9saW5lc19wZigpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCSZjZGF0YSwKLQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQljYXNlIENGR19HRVRfUFJFVl9QX1BMOgotCQljZGF0YS5jZmcucHJldnBfcGwgPQotCQkJaW14MDc0X2dldF9wcmV2X3BpeGVsc19wbCgpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCSZjZGF0YSwKLQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQotCWNhc2UgQ0ZHX0dFVF9QSUNUX0xfUEY6Ci0JCWNkYXRhLmNmZy5waWN0bF9wZiA9Ci0JCQlpbXgwNzRfZ2V0X3BpY3RfbGluZXNfcGYoKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkmY2RhdGEsCi0JCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JY2FzZSBDRkdfR0VUX1BJQ1RfUF9QTDoKLQkJY2RhdGEuY2ZnLnBpY3RwX3BsID0KLQkJCWlteDA3NF9nZXRfcGljdF9waXhlbHNfcGwoKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkmY2RhdGEsCi0JCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JY2FzZSBDRkdfR0VUX1BJQ1RfTUFYX0VYUF9MQzoKLQkJY2RhdGEuY2ZnLnBpY3RfbWF4X2V4cF9sYyA9Ci0JCQlpbXgwNzRfZ2V0X3BpY3RfbWF4X2V4cF9sYygpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCSZjZGF0YSwKLQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQljYXNlIENGR19TRVRfRlBTOgotCWNhc2UgQ0ZHX1NFVF9QSUNUX0ZQUzoKLQkJcmMgPSBpbXgwNzRfc2V0X2ZwcygmKGNkYXRhLmNmZy5mcHMpKTsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX0VYUF9HQUlOOgotCQlyYyA9Ci0JCQlpbXgwNzRfd3JpdGVfZXhwX2dhaW4oCi0JCQljZGF0YS5jZmcuZXhwX2dhaW4uZ2FpbiwKLQkJCWNkYXRhLmNmZy5leHBfZ2Fpbi5saW5lKTsKLQkJCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9QSUNUX0VYUF9HQUlOOgotCQlyYyA9Ci0JCQlpbXgwNzRfc2V0X3BpY3RfZXhwX2dhaW4oCi0JCQljZGF0YS5jZmcuZXhwX2dhaW4uZ2FpbiwKLQkJCWNkYXRhLmNmZy5leHBfZ2Fpbi5saW5lKTsKLQkJCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9NT0RFOgotCQlyYyA9IGlteDA3NF9zZXRfc2Vuc29yX21vZGUoY2RhdGEubW9kZSwKLQkJCWNkYXRhLnJzKTsKLQkJCWJyZWFrOwotCWNhc2UgQ0ZHX1BXUl9ET1dOOgotCQlyYyA9IGlteDA3NF9wb3dlcl9kb3duKCk7Ci0JCQlicmVhazsKLQljYXNlIENGR19HRVRfQ0FMSUJfREFUQToKLQkJcmMgPSBpbXgwNzRfcmVhZF9lZXByb21fZGF0YSgmY2RhdGEpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJJmNkYXRhLAotCQkJc2l6ZW9mKGNkYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX01PVkVfRk9DVVM6Ci0JCXJjID0KLQkJCWlteDA3NF9tb3ZlX2ZvY3VzKAotCQkJY2RhdGEuY2ZnLmZvY3VzLmRpciwKLQkJCWNkYXRhLmNmZy5mb2N1cy5zdGVwcyk7Ci0JCQlicmVhazsKLQljYXNlIENGR19TRVRfREVGQVVMVF9GT0NVUzoKLQkJcmMgPQotCQkJaW14MDc0X3NldF9kZWZhdWx0X2ZvY3VzKAotCQkJY2RhdGEuY2ZnLmZvY3VzLnN0ZXBzKTsKLQkJCWJyZWFrOwotCWNhc2UgQ0ZHX0dFVF9BRl9NQVhfU1RFUFM6Ci0JCWNkYXRhLm1heF9zdGVwcyA9IElNWDA3NF9TVEVQU19ORUFSX1RPX0NMT1NFU1RfSU5GOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCSZjZGF0YSwKLQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQljYXNlIENGR19TRVRfRUZGRUNUOgotCWRlZmF1bHQ6Ci0JCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZpbXgwNzRfbXV0KTsKLQotCXJldHVybiByYzsKLX0KLXN0YXRpYyBpbnQgaW14MDc0X3NlbnNvcl9yZWxlYXNlKHZvaWQpCi17Ci0JaW50IHJjID0gLUVCQURGOwotCW11dGV4X2xvY2soJmlteDA3NF9tdXQpOwotCWlmIChtYWNoaW5lX2lzX21zbTh4NjBfZmx1aWQoKSkKLQkJaW14MDc0X3Bvd2Vyb2ZmX2FmKCk7Ci0JaW14MDc0X3Bvd2VyX2Rvd24oKTsKLQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChpbXgwNzRfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3Jlc2V0LCAwKTsKLQltc2xlZXAoNSk7Ci0JZ3Bpb19kaXJlY3Rpb25faW5wdXQoaW14MDc0X2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9yZXNldCk7Ci0JZ3Bpb19mcmVlKGlteDA3NF9jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcmVzZXQpOwotCWtmcmVlKGlteDA3NF9jdHJsKTsKLQlpbXgwNzRfY3RybCA9IE5VTEw7Ci0JQ0RCRygiaW14MDc0X3JlbGVhc2UgY29tcGxldGVkXG4iKTsKLQltdXRleF91bmxvY2soJmlteDA3NF9tdXQpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGlteDA3NF9zZW5zb3JfcHJvYmUoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmluZm8sCi0JCXN0cnVjdCBtc21fc2Vuc29yX2N0cmwgKnMpCi17Ci0JaW50IHJjID0gMDsKLQlyYyA9IGkyY19hZGRfZHJpdmVyKCZpbXgwNzRfaTJjX2RyaXZlcik7Ci0JaWYgKHJjIDwgMCB8fCBpbXgwNzRfY2xpZW50ID09IE5VTEwpIHsKLQkJcmMgPSAtRU5PVFNVUFA7Ci0JCWdvdG8gcHJvYmVfZmFpbDsKLQl9Ci0JbXNtX2NhbWlvX2Nsa19yYXRlX3NldChJTVgwNzRfREVGQVVMVF9NQVNURVJfQ0xLX1JBVEUpOwotCXJjID0gaW14MDc0X3Byb2JlX2luaXRfc2Vuc29yKGluZm8pOwotCWlmIChyYyA8IDApCi0JCWdvdG8gcHJvYmVfZmFpbDsKLQlzLT5zX2luaXQgPSBpbXgwNzRfc2Vuc29yX29wZW5faW5pdDsKLQlzLT5zX3JlbGVhc2UgPSBpbXgwNzRfc2Vuc29yX3JlbGVhc2U7Ci0Jcy0+c19jb25maWcgID0gaW14MDc0X3NlbnNvcl9jb25maWc7Ci0Jcy0+c19tb3VudF9hbmdsZSA9IGluZm8tPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5tb3VudF9hbmdsZTsKLQlpbXgwNzRfcHJvYmVfaW5pdF9kb25lKGluZm8pOwotCXJldHVybiByYzsKLQotcHJvYmVfZmFpbDoKLQlDREJHKCJpbXgwNzRfc2Vuc29yX3Byb2JlOiBTRU5TT1IgUFJPQkUgRkFJTFMhXG4iKTsKLQlpMmNfZGVsX2RyaXZlcigmaW14MDc0X2kyY19kcml2ZXIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX2lteDA3NF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCi0JcmV0dXJuIG1zbV9jYW1lcmFfZHJ2X3N0YXJ0KHBkZXYsIGlteDA3NF9zZW5zb3JfcHJvYmUpOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fY2FtZXJhX2RyaXZlciA9IHsKLQkucHJvYmUgPSBfX2lteDA3NF9wcm9iZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc21fY2FtZXJhX2lteDA3NCIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbXgwNzRfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9jYW1lcmFfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoaW14MDc0X2luaXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlNvbnkgMTMgTVAgQmF5ZXIgc2Vuc29yIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW14MDc0LmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW14MDc0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NjhjYjAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lteDA3NC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIElNWDA3NF9ICi0jZGVmaW5lIElNWDA3NF9ICi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci1leHRlcm4gc3RydWN0IGlteDA3NF9yZWcgaW14MDc0X3JlZ3M7Ci1zdHJ1Y3QgcmVnX3N0cnVjdF9pbml0IHsKLSAgICAvKiBQTEwgc2V0dGluZyAqLwotCXVpbnQ4X3QgcHJlX3BsbF9jbGtfZGl2OyAvKiAweDAzMDUgKi8KLQl1aW50OF90IHBsc3RhdGltOyAvKiAweDMwMmIgKi8KLQl1aW50OF90IHJlZ18zMDI0OyAvKm94MzAyNCovCi0JdWludDhfdCBpbWFnZV9vcmllbnRhdGlvbjsgIC8qIDB4MDEwMSovCi0JdWludDhfdCB2bmRteV9hYmxtZ3NobG10OyAvKjB4MzAwYSovCi0JdWludDhfdCB5X29wYmFkZHJfc3RhcnRfZGk7IC8qMHgzMDE0Ki8KLQl1aW50OF90IHJlZ18weDMwMTU7IC8qMHgzMDE1Ki8KLQl1aW50OF90IHJlZ18weDMwMWM7IC8qMHgzMDFjKi8KLQl1aW50OF90IHJlZ18weDMwMmM7IC8qMHgzMDJjKi8KLQl1aW50OF90IHJlZ18weDMwMzE7IC8qMHgzMDMxKi8KLQl1aW50OF90IHJlZ18weDMwNDE7IC8qIDB4MzA0MSAqLwotCXVpbnQ4X3QgcmVnXzB4MzA1MTsgLyogMHgzMDUxICovCi0JdWludDhfdCByZWdfMHgzMDUzOyAvKiAweDMwNTMgKi8KLQl1aW50OF90IHJlZ18weDMwNTc7IC8qIDB4MzA1NyAqLwotCXVpbnQ4X3QgcmVnXzB4MzA1YzsgLyogMHgzMDVjICovCi0JdWludDhfdCByZWdfMHgzMDVkOyAvKiAweDMwNWQgKi8KLQl1aW50OF90IHJlZ18weDMwNjA7IC8qIDB4MzA2MCAqLwotCXVpbnQ4X3QgcmVnXzB4MzA2NTsgLyogMHgzMDY1ICovCi0JdWludDhfdCByZWdfMHgzMGFhOyAvKiAweDMwYWEgKi8KLQl1aW50OF90IHJlZ18weDMwYWI7Ci0JdWludDhfdCByZWdfMHgzMGIwOwotCXVpbnQ4X3QgcmVnXzB4MzBiMjsKLQl1aW50OF90IHJlZ18weDMwZDM7Ci0JdWludDhfdCByZWdfMHgzMTA2OwotCXVpbnQ4X3QgcmVnXzB4MzEwYzsKLQl1aW50OF90IHJlZ18weDMzMDQ7Ci0JdWludDhfdCByZWdfMHgzMzA1OwotCXVpbnQ4X3QgcmVnXzB4MzMwNjsKLQl1aW50OF90IHJlZ18weDMzMDc7Ci0JdWludDhfdCByZWdfMHgzMzA4OwotCXVpbnQ4X3QgcmVnXzB4MzMwOTsKLQl1aW50OF90IHJlZ18weDMzMGE7Ci0JdWludDhfdCByZWdfMHgzMzBiOwotCXVpbnQ4X3QgcmVnXzB4MzMwYzsKLQl1aW50OF90IHJlZ18weDMzMGQ7Ci0JdWludDhfdCByZWdfMHgzMzBmOwotCXVpbnQ4X3QgcmVnXzB4MzM4MTsKLX07Ci0KLXN0cnVjdCByZWdfc3RydWN0IHsKLQl1aW50OF90IHBsbF9tdWx0aXBsaWVyOyAvKiAweDAzMDcgKi8KLQl1aW50OF90IGZyYW1lX2xlbmd0aF9saW5lc19oaTsgLyogMHgwMzQwKi8KLQl1aW50OF90IGZyYW1lX2xlbmd0aF9saW5lc19sbzsgLyogMHgwMzQxKi8KLQl1aW50OF90IHlfYWRkcl9zdGFydDsgIC8qIDB4MzQ3ICovCi0JdWludDhfdCB5X2FkZF9lbmQ7ICAvKiAweDAzNGIgKi8KLQl1aW50OF90IHhfb3V0cHV0X3NpemVfbXNiOyAgLyogMHgwMzRjICovCi0JdWludDhfdCB4X291dHB1dF9zaXplX2xzYjsgIC8qIDB4MDM0ZCAqLwotCXVpbnQ4X3QgeV9vdXRwdXRfc2l6ZV9tc2I7IC8qIDB4MDM0ZSAqLwotCXVpbnQ4X3QgeV9vdXRwdXRfc2l6ZV9sc2I7IC8qIDB4MDM0ZiAqLwotCXVpbnQ4X3QgeF9ldmVuX2luYzsgIC8qIDB4MDM4MSAqLwotCXVpbnQ4X3QgeF9vZGRfaW5jOyAvKiAweDAzODMgKi8KLQl1aW50OF90IHlfZXZlbl9pbmM7ICAvKiAweDAzODUgKi8KLQl1aW50OF90IHlfb2RkX2luYzsgLyogMHgwMzg3ICovCi0JdWludDhfdCBobW9kZWFkZDsgICAvKiAweDMwMDEgKi8KLQl1aW50OF90IHZtb2RlYWRkOyAgIC8qIDB4MzAxNiAqLwotCXVpbnQ4X3QgdmFwcGxpbmVwb3Nfc3RhcnQ7LypveDMwNjkqLwotCXVpbnQ4X3QgdmFwcGxpbmVwb3NfZW5kOy8qMzA2YiovCi0JdWludDhfdCBzaHV0dGVyOwkvKiAweDMwODYgKi8KLQl1aW50OF90IGhhZGRhdmU7CS8qIDB4MzBlOCAqLwotCXVpbnQ4X3QgbGFuZXNlbDsgICAgLyogMHgzMzAxICovCi19OwotCi1zdHJ1Y3QgaW14MDc0X2kyY19yZWdfY29uZiB7Ci0JdW5zaWduZWQgc2hvcnQgd2FkZHI7Ci0JdW5zaWduZWQgc2hvcnQgd2RhdGE7Ci19OwotCi1lbnVtIGlteDA3NF90ZXN0X21vZGVfdCB7Ci0JVEVTVF9PRkYsCi0JVEVTVF8xLAotCVRFU1RfMiwKLQlURVNUXzMKLX07Ci0KLWVudW0gaW14MDc0X3Jlc29sdXRpb25fdCB7Ci0JUVRSX1NJWkUsCi0JRlVMTF9TSVpFLAotCUlOVkFMSURfU0laRQotfTsKLWVudW0gaW14MDc0X3NldHRpbmcgewotCVJFU19QUkVWSUVXLAotCVJFU19DQVBUVVJFCi19OwotZW51bSBtdDlwMDEyX3JlZ191cGRhdGUgewotCS8qIFNlbnNvciBlZ2lzdGVycyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKi8KLQlSRUdfSU5JVCwKLQkvKiBTZW5zb3IgZWdpc3RlcnMgdGhhdCBuZWVkcyBwZXJpb2RpYyBJMkMgd3JpdGVzICovCi0JVVBEQVRFX1BFUklPRElDLAotCS8qIEFsbCB0aGUgc2Vuc29yIFJlZ2lzdGVycyB3aWxsIGJlIHVwZGF0ZWQgKi8KLQlVUERBVEVfQUxMLAotCS8qIE5vdCB2YWxpZCB1cGRhdGUgKi8KLQlVUERBVEVfSU5WQUxJRAotfTsKLQotc3RydWN0IGlteDA3NF9yZWcgewotCWNvbnN0IHN0cnVjdCByZWdfc3RydWN0X2luaXQgICpyZWdfcGF0X2luaXQ7Ci0JY29uc3Qgc3RydWN0IHJlZ19zdHJ1Y3QgICpyZWdfcGF0OwotfTsKLSNlbmRpZiAvKiBJTVgwNzRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lteDA3NF9yZWcuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pbXgwNzRfcmVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZDE5ZjIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lteDA3NF9yZWcuYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgImlteDA3NC5oIgotY29uc3Qgc3RydWN0IHJlZ19zdHJ1Y3RfaW5pdCBpbXgwNzRfcmVnX2luaXRbMV0gPSB7Ci0JewotCQkvKiBQTEwgc2V0dGluZyAqLwotCQkweDAyLAkvKiBwbGxfZGl2aWRlciAweDAzMDUgKi8KLQkJMHg0QiwJLyogcGxzdGF0aW0gMHgzMDJiICovCi0JCTB4MDMsCS8qIHJlZ18zMDI0ICovCi0JCTB4MDAsCS8qIGltYWdlX29yaWVudGF0aW9uIDB4MDEwMSAqLwotCQkweDgwLAkvKiB2bmRteV9hYmxtZ3NobG10IDB4MzAwYSovCi0JCTB4MDgsCS8qIHlfb3BiYWRkcl9zdGFydF9kaSAzMDE0Ki8KLQkJMHgzNywJLyogMHgzMDE1Ki8KLQkJMHgwMSwJLyogMHgzMDFjKi8KLQkJMHgwNSwJLyogMHgzMDJjKi8KLQkJMHgyNiwJLyogMHgzMDMxKi8KLQkJMHg2MCwJLyogMHgzMDQxKi8KLQkJMHgyNCwJLyogMHgzMDUxIENMSyBESVYqLwotCQkweDM0LAkvKiAweDMwNTMqLwotCQkweGMwLAkvKiAweDMwNTcqLwotCQkweDA5LAkvKiAweDMwNWMqLwotCQkweDA3LAkvKiAweDMwNWQgKi8KLQkJMHgzMCwJLyogMHgzMDYwICovCi0JCTB4MDAsCS8qIDB4MzA2NSAqLwotCQkweDA4LAkvKiAweDMwYWEgKi8KLQkJMHgxYywJLyogMHgzMGFiICovCi0JCTB4MzIsCS8qIDB4MzBiMCAqLwotCQkweDgzLAkvKiAweDMwYjIgKi8KLQkJMHgwNCwJLyogMHgzMGQzICovCi0JCTB4NzgsCS8qIDB4MzEwNiAqLwotCQkweDgyLAkvKiAweDMxMGMgKi8KLQkJMHgwNSwJLyogMHgzMzA0ICovCi0JCTB4MDQsCS8qIDB4MzMwNSAqLwotCQkweDExLAkvKiAweDMzMDYgKi8KLQkJMHgwMiwJLyogMHgzMzA3ICovCi0JCTB4MGMsCS8qIDB4MzMwOCAqLwotCQkweDA2LAkvKiAweDMzMDkgKi8KLQkJMHgwOCwJLyogMHgzMzBhICovCi0JCTB4MDQsCS8qIDB4MzMwYiAqLwotCQkweDA4LAkvKiAweDMzMGMgKi8KLQkJMHgwNiwJLyogMHgzMzBkICovCi0JCTB4MDEsCS8qIDB4MzMwZiAqLwotCQkweDAwLAkvKiAweDMzODEgKi8KLQotCX0KLX07Ci0KLS8qIFByZXZpZXcgLyBTbmFwc2hvdCByZWdpc3RlciBzZXR0aW5ncwkqLwotY29uc3Qgc3RydWN0IHJlZ19zdHJ1Y3QJaW14MDc0X3JlZ19wYXRbMl0gPSB7Ci0JLypwcmV2aWV3Ki8KLQl7Ci0JCTB4MkQsIC8qcGxsX211bHRpcGxpZXIqLwotCQkweDA2LCAvKmZyYW1lX2xlbmd0aF9saW5lc19oaSAweDAzNDAqLwotCQkweDJELCAvKiBmcmFtZV9sZW5ndGhfbGluZXNfbG8gMHgwMzQxKi8KLQkJMHgwMCwgLyogeV9hZGRyX3N0YXJ0IDB4MzQ3ICovCi0JCTB4MkYsIC8qIHlfYWRkX2VuZCAweDAzNGIgKi8KLQkJMHgwOCwgLyogeF9vdXRwdXRfc2l6ZV9tc2IweDAzNGMgKi8KLQkJMHgzOCwgLyogeF9vdXRwdXRfc2l6ZV9sc2IweDAzNGQgKi8KLQkJMHgwNiwgLyogIHlfb3V0cHV0X3NpemVfbXNiMHgwMzRlICovCi0JCTB4MTgsIC8qICB5X291dHB1dF9zaXplX2xzYjB4MDM0ZiAqLwotCQkweDAxLCAvKiB4X2V2ZW5faW5jIDB4MDM4MSAqLwotCQkweDAzLCAvKiB4X29kZF9pbmMgMHgwMzgzICovCi0JCTB4MDEsIC8qIHlfZXZlbl9pbmMgMHgwMzg1ICovCi0JCTB4MDMsIC8qIHlfb2RkX2luYyAweDAzODcgKi8KLQkJMHg4MCwgLyogaG1vZGVhZGQweDMwMDEgKi8KLQkJMHgxNiwgLyogdm1vZGVhZGQweDMwMTYgKi8KLQkJMHgyNCwgLyogdmFwcGxpbmVwb3Nfc3RhcnRveDMwNjkqLwotCQkweDUzLCAvKiB2YXBwbGluZXBvc19lbmQzMDZiKi8KLQkJMHgwMCwvKiAgc2h1dHRlciAweDMwODYgKi8KLQkJMHg4MCwgLyogaGFkZGF2ZSAweDMwZTggKi8KLQkJMHg4MywgLyogbGFuZXNlbCAweDMzMDEgKi8KLQl9LAotCi0JLypzbmFwc2hvdCovCi0JewotCQkweDI2LCAvKnBsbF9tdWx0aXBsaWVyKi8KLQkJMHgwQywgLyogZnJhbWVfbGVuZ3RoX2xpbmVzX2hpIDB4MDM0MCovCi0JCTB4OTAsIC8qIGZyYW1lX2xlbmd0aF9saW5lc19sbyAweDAzNDEqLwotCQkweDAwLCAvKiB5X2FkZHJfc3RhcnQgMHgzNDcgKi8KLQkJMHgyRiwgLyogeV9hZGRfZW5kIDB4MDM0YiAqLwotCQkweDEwLCAvKiB4X291dHB1dF9zaXplX21zYjB4MDM0YyAqLwotCQkweDcwLCAvKiB4X291dHB1dF9zaXplX2xzYjB4MDM0ZCAqLwotCQkweDBjLCAvKiB5X291dHB1dF9zaXplX21zYjB4MDM0ZSAqLwotCQkweDMwLCAvKiB5X291dHB1dF9zaXplX2xzYjB4MDM0ZiAqLwotCQkweDAxLCAvKiB4X2V2ZW5faW5jIDB4MDM4MSAqLwotCQkweDAxLCAvKiB4X29kZF9pbmMgMHgwMzgzICovCi0JCTB4MDEsIC8qIHlfZXZlbl9pbmMgMHgwMzg1ICovCi0JCTB4MDEsIC8qIHlfb2RkX2luYyAweDAzODcgKi8KLQkJMHgwMCwgLyogaG1vZGVhZGQweDMwMDEgKi8KLQkJMHgwNiwgLyogdm1vZGVhZGQweDMwMTYgKi8KLQkJMHgyNCwgLyogdmFwcGxpbmVwb3Nfc3RhcnRveDMwNjkqLwotCQkweDUzLCAvKiB2YXBwbGluZXBvc19lbmQzMDZiKi8KLQkJMHgwMCwgLyogc2h1dHRlciAweDMwODYgKi8KLQkJMHgwMCwgLyogaGFkZGF2ZSAweDMwZTggKi8KLQkJMHgwMywgLyogbGFuZXNlbCAweDMzMDEgKi8KLQl9Ci19Owotc3RydWN0IGlteDA3NF9yZWcgaW14MDc0X3JlZ3MgPSB7Ci0JLnJlZ19wYXRfaW5pdCA9ICZpbXgwNzRfcmVnX2luaXRbMF0sCi0JLnJlZ19wYXQgPSAmaW14MDc0X3JlZ19wYXRbMF0sCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWMxMTljLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLUdDQ19WRVJTSU9OICAgICAgOj0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChQV0QpL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2ggJChDUk9TU19DT01QSUxFKWdjYykKLQotY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxIC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2NjaQotb2JqLSQoQ09ORklHX01TTV9DQU1FUkEpICAgKz0gbXNtX2NhbWVyYV9pb191dGlsLm8gbXNtX2NhbWVyYV9pMmMubwotaWZlcSAoJChDT05GSUdfTVNNX0NBTUVSQV9WNEwyKSx5KQotICBvYmotJChDT05GSUdfTVNNX0NBTUVSQSkgKz0gbXNtX2NhbWVyYV9pMmNfbXV4Lm8KLSAgb2JqLSQoQ09ORklHX0FSQ0hfTVNNN1gyN0EpICs9IG1zbV9pb183eDI3YV92NGwyLm8KLSAgb2JqLSQoQ09ORklHX0FSQ0hfTVNNOFg2MCkgKz0gbXNtX2lvX3ZmZTMxX3Y0bDIubwotICBvYmotJChDT05GSUdfQVJDSF9NU003WDMwKSArPSBtc21faW9fdmZlMzFfdjRsMi5vCi1lbHNlCi0gIG9iai0kKENPTkZJR19BUkNIX01TTTdYMjdBKSArPSBtc21faW9fN3gyN2EubwotICBvYmotJChDT05GSUdfQVJDSF9NU004WDYwKSArPSBtc21faW9fOHg2MC5vCi0gIG9iai0kKENPTkZJR19BUkNIX01TTTdYMzApICs9IG1zbV9pb192ZmUzMS5vCi1lbmRpZgotb2JqLSQoQ09ORklHX0FSQ0hfTVNNX0FSTTExKSArPSBtc21faW83eC5vCi1vYmotJChDT05GSUdfQVJDSF9RU0Q4WDUwKSArPSBtc21faW84eC5vCi1vYmotJChDT05GSUdfQVJDSF9NU004OTYwKSArPSBtc21faW9fODk2MC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW8vbXNtX2NhbWVyYV9pMmMuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9tc21fY2FtZXJhX2kyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzgyNmFhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9tc21fY2FtZXJhX2kyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlICJtc21fY2FtZXJhX2kyYy5oIgotI2luY2x1ZGUgIm1zbS5oIgotI2luY2x1ZGUgIm1zbV9jY2kuaCIKLQotaW50MzJfdCBtc21fY2FtZXJhX2kyY19yeGRhdGEoc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCAqZGV2X2NsaWVudCwKLQl1bnNpZ25lZCBjaGFyICpyeGRhdGEsIGludCBkYXRhX2xlbmd0aCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1aW50MTZfdCBzYWRkciA9IGRldl9jbGllbnQtPmNsaWVudC0+YWRkciA+PiAxOwotCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKLQkJewotCQkJLmFkZHIgID0gc2FkZHIsCi0JCQkuZmxhZ3MgPSAwLAotCQkJLmxlbiAgID0gZGV2X2NsaWVudC0+YWRkcl90eXBlLAotCQkJLmJ1ZiAgID0gcnhkYXRhLAotCQl9LAotCQl7Ci0JCQkuYWRkciAgPSBzYWRkciwKLQkJCS5mbGFncyA9IEkyQ19NX1JELAotCQkJLmxlbiAgID0gZGF0YV9sZW5ndGgsCi0JCQkuYnVmICAgPSByeGRhdGEsCi0JCX0sCi0JfTsKLQlyYyA9IGkyY190cmFuc2ZlcihkZXZfY2xpZW50LT5jbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpOwotCWlmIChyYyA8IDApCi0JCVNfSTJDX0RCRygibXNtX2NhbWVyYV9pMmNfcnhkYXRhIGZhaWxlZCAweCV4XG4iLCBzYWRkcik7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQzMl90IG1zbV9jYW1lcmFfaTJjX3R4ZGF0YShzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50ICpkZXZfY2xpZW50LAotCQkJCXVuc2lnbmVkIGNoYXIgKnR4ZGF0YSwgaW50IGxlbmd0aCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1aW50MTZfdCBzYWRkciA9IGRldl9jbGllbnQtPmNsaWVudC0+YWRkciA+PiAxOwotCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0gewotCQl7Ci0JCQkuYWRkciA9IHNhZGRyLAotCQkJLmZsYWdzID0gMCwKLQkJCS5sZW4gPSBsZW5ndGgsCi0JCQkuYnVmID0gdHhkYXRhLAotCQkgfSwKLQl9OwotCXJjID0gaTJjX3RyYW5zZmVyKGRldl9jbGllbnQtPmNsaWVudC0+YWRhcHRlciwgbXNnLCAxKTsKLQlpZiAocmMgPCAwKQotCQlTX0kyQ19EQkcoIm1zbV9jYW1lcmFfaTJjX3R4ZGF0YSBmYWlsZCAweCV4XG4iLCBzYWRkcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludDMyX3QgbXNtX2NhbWVyYV9pMmNfd3JpdGUoc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCAqY2xpZW50LAotCXVpbnQxNl90IGFkZHIsIHVpbnQxNl90IGRhdGEsCi0JZW51bSBtc21fY2FtZXJhX2kyY19kYXRhX3R5cGUgZGF0YV90eXBlKQotewotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCXVuc2lnbmVkIGNoYXIgYnVmW2NsaWVudC0+YWRkcl90eXBlK2RhdGFfdHlwZV07Ci0JdWludDhfdCBsZW4gPSAwOwotCi0JaWYgKChjbGllbnQtPmFkZHJfdHlwZSAhPSBNU01fQ0FNRVJBX0kyQ19CWVRFX0FERFIKLQkJJiYgY2xpZW50LT5hZGRyX3R5cGUgIT0gTVNNX0NBTUVSQV9JMkNfV09SRF9BRERSKQotCQl8fCAoZGF0YV90eXBlICE9IE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQQotCQkmJiBkYXRhX3R5cGUgIT0gTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBKSkKLQkJcmV0dXJuIHJjOwotCi0JU19JMkNfREJHKCIlcyByZWcgYWRkciA9IDB4JXggZGF0YSB0eXBlOiAlZFxuIiwKLQkJCSAgX19mdW5jX18sIGFkZHIsIGRhdGFfdHlwZSk7Ci0JaWYgKGNsaWVudC0+Y2NpX2NsaWVudCkgewotCQlzdHJ1Y3QgbXNtX2NhbWVyYV9jY2lfY3RybCBjY2lfY3RybDsKLQkJc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIHJlZ19jb25mX3RibDsKLQkJcmVnX2NvbmZfdGJsLnJlZ19hZGRyID0gYWRkcjsKLQkJcmVnX2NvbmZfdGJsLnJlZ19kYXRhID0gZGF0YTsKLQkJY2NpX2N0cmwuY21kID0gTVNNX0NDSV9JMkNfV1JJVEU7Ci0JCWNjaV9jdHJsLmNjaV9pbmZvID0gY2xpZW50LT5jY2lfY2xpZW50OwotCQljY2lfY3RybC5jZmcuY2NpX2kyY193cml0ZV9jZmcucmVnX2NvbmZfdGJsID0gJnJlZ19jb25mX3RibDsKLQkJY2NpX2N0cmwuY2ZnLmNjaV9pMmNfd3JpdGVfY2ZnLmRhdGFfdHlwZSA9IGRhdGFfdHlwZTsKLQkJY2NpX2N0cmwuY2ZnLmNjaV9pMmNfd3JpdGVfY2ZnLmFkZHJfdHlwZSA9IGNsaWVudC0+YWRkcl90eXBlOwotCQljY2lfY3RybC5jZmcuY2NpX2kyY193cml0ZV9jZmcuc2l6ZSA9IDE7Ci0JCXJjID0gdjRsMl9zdWJkZXZfY2FsbChjbGllbnQtPmNjaV9jbGllbnQtPmNjaV9zdWJkZXYsCi0JCQkJY29yZSwgaW9jdGwsIFZJRElPQ19NU01fQ0NJX0NGRywgJmNjaV9jdHJsKTsKLQkJQ0RCRygiJXMgbGluZSAlZCByYyA9ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJjKTsKLQkJcmMgPSBjY2lfY3RybC5zdGF0dXM7Ci0JfSBlbHNlIHsKLQkJaWYgKGNsaWVudC0+YWRkcl90eXBlID09IE1TTV9DQU1FUkFfSTJDX0JZVEVfQUREUikgewotCQkJYnVmWzBdID0gYWRkcjsKLQkJCVNfSTJDX0RCRygiJXMgYnl0ZSAlZDogMHgleFxuIiwgX19mdW5jX18sCi0JCQkJbGVuLCBidWZbbGVuXSk7Ci0JCQlsZW4gPSAxOwotCQl9IGVsc2UgaWYgKGNsaWVudC0+YWRkcl90eXBlID09IE1TTV9DQU1FUkFfSTJDX1dPUkRfQUREUikgewotCQkJYnVmWzBdID0gYWRkciA+PiBCSVRTX1BFUl9CWVRFOwotCQkJYnVmWzFdID0gYWRkcjsKLQkJCVNfSTJDX0RCRygiJXMgYnl0ZSAlZDogMHgleFxuIiwgX19mdW5jX18sCi0JCQkJbGVuLCBidWZbbGVuXSk7Ci0JCQlTX0kyQ19EQkcoIiVzIGJ5dGUgJWQ6IDB4JXhcbiIsIF9fZnVuY19fLAotCQkJCWxlbisxLCBidWZbbGVuKzFdKTsKLQkJCWxlbiA9IDI7Ci0JCX0KLQkJU19JMkNfREJHKCJEYXRhOiAweCV4XG4iLCBkYXRhKTsKLQkJaWYgKGRhdGFfdHlwZSA9PSBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpIHsKLQkJCWJ1ZltsZW5dID0gZGF0YTsKLQkJCVNfSTJDX0RCRygiQnl0ZSAlZDogMHgleFxuIiwgbGVuLCBidWZbbGVuXSk7Ci0JCQlsZW4gKz0gMTsKLQkJfSBlbHNlIGlmIChkYXRhX3R5cGUgPT0gTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBKSB7Ci0JCQlidWZbbGVuXSA9IGRhdGEgPj4gQklUU19QRVJfQllURTsKLQkJCWJ1ZltsZW4rMV0gPSBkYXRhOwotCQkJU19JMkNfREJHKCJCeXRlICVkOiAweCV4XG4iLCBsZW4sIGJ1ZltsZW5dKTsKLQkJCVNfSTJDX0RCRygiQnl0ZSAlZDogMHgleFxuIiwgbGVuKzEsIGJ1ZltsZW4rMV0pOwotCQkJbGVuICs9IDI7Ci0JCX0KLQkJcmMgPSBtc21fY2FtZXJhX2kyY190eGRhdGEoY2xpZW50LCBidWYsIGxlbik7Ci0JCWlmIChyYyA8IDApCi0JCQlTX0kyQ19EQkcoIiVzIGZhaWxcbiIsIF9fZnVuY19fKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQzMl90IG1zbV9jYW1lcmFfaTJjX3dyaXRlX3NlcShzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50ICpjbGllbnQsCi0JdWludDE2X3QgYWRkciwgdWludDhfdCAqZGF0YSwgdWludDE2X3QgbnVtX2J5dGUpCi17Ci0JaW50MzJfdCByYyA9IC1FRkFVTFQ7Ci0JdW5zaWduZWQgY2hhciBidWZbY2xpZW50LT5hZGRyX3R5cGUrbnVtX2J5dGVdOwotCXVpbnQ4X3QgbGVuID0gMCwgaSA9IDA7Ci0KLQlpZiAoKGNsaWVudC0+YWRkcl90eXBlICE9IE1TTV9DQU1FUkFfSTJDX0JZVEVfQUREUgotCQkmJiBjbGllbnQtPmFkZHJfdHlwZSAhPSBNU01fQ0FNRVJBX0kyQ19XT1JEX0FERFIpCi0JCXx8IG51bV9ieXRlID09IDApCi0JCXJldHVybiByYzsKLQotCVNfSTJDX0RCRygiJXMgcmVnIGFkZHIgPSAweCV4IG51bSBieXRlczogJWRcbiIsCi0JCQkgIF9fZnVuY19fLCBhZGRyLCBudW1fYnl0ZSk7Ci0JaWYgKGNsaWVudC0+Y2NpX2NsaWVudCkgewotCQlzdHJ1Y3QgbXNtX2NhbWVyYV9jY2lfY3RybCBjY2lfY3RybDsKLQkJc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIHJlZ19jb25mX3RibFtudW1fYnl0ZV07Ci0JCXJlZ19jb25mX3RibFswXS5yZWdfYWRkciA9IGFkZHI7Ci0JCWZvciAoaSA9IDA7IGkgPCBudW1fYnl0ZTsgaSsrKQotCQkJcmVnX2NvbmZfdGJsW2ldLnJlZ19kYXRhID0gZGF0YVtpXTsKLQkJY2NpX2N0cmwuY21kID0gTVNNX0NDSV9JMkNfV1JJVEU7Ci0JCWNjaV9jdHJsLmNjaV9pbmZvID0gY2xpZW50LT5jY2lfY2xpZW50OwotCQljY2lfY3RybC5jZmcuY2NpX2kyY193cml0ZV9jZmcucmVnX2NvbmZfdGJsID0gcmVnX2NvbmZfdGJsOwotCQljY2lfY3RybC5jZmcuY2NpX2kyY193cml0ZV9jZmcuc2l6ZSA9IG51bV9ieXRlOwotCQlyYyA9IHY0bDJfc3ViZGV2X2NhbGwoY2xpZW50LT5jY2lfY2xpZW50LT5jY2lfc3ViZGV2LAotCQkJCWNvcmUsIGlvY3RsLCBWSURJT0NfTVNNX0NDSV9DRkcsICZjY2lfY3RybCk7Ci0JCUNEQkcoIiVzIGxpbmUgJWQgcmMgPSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCByYyk7Ci0JCXJjID0gY2NpX2N0cmwuc3RhdHVzOwotCX0gZWxzZSB7Ci0JCWlmIChjbGllbnQtPmFkZHJfdHlwZSA9PSBNU01fQ0FNRVJBX0kyQ19CWVRFX0FERFIpIHsKLQkJCWJ1ZlswXSA9IGFkZHI7Ci0JCQlTX0kyQ19EQkcoIiVzIGJ5dGUgJWQ6IDB4JXhcbiIsIF9fZnVuY19fLAotCQkJCWxlbiwgYnVmW2xlbl0pOwotCQkJbGVuID0gMTsKLQkJfSBlbHNlIGlmIChjbGllbnQtPmFkZHJfdHlwZSA9PSBNU01fQ0FNRVJBX0kyQ19XT1JEX0FERFIpIHsKLQkJCWJ1ZlswXSA9IGFkZHIgPj4gQklUU19QRVJfQllURTsKLQkJCWJ1ZlsxXSA9IGFkZHI7Ci0JCQlTX0kyQ19EQkcoIiVzIGJ5dGUgJWQ6IDB4JXhcbiIsIF9fZnVuY19fLAotCQkJCWxlbiwgYnVmW2xlbl0pOwotCQkJU19JMkNfREJHKCIlcyBieXRlICVkOiAweCV4XG4iLCBfX2Z1bmNfXywKLQkJCQlsZW4rMSwgYnVmW2xlbisxXSk7Ci0JCQlsZW4gPSAyOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBudW1fYnl0ZTsgaSsrKSB7Ci0JCQlidWZbaStsZW5dID0gZGF0YVtpXTsKLQkJCVNfSTJDX0RCRygiQnl0ZSAlZDogMHgleFxuIiwgaStsZW4sIGJ1ZltpK2xlbl0pOwotCQkJU19JMkNfREJHKCJEYXRhOiAweCV4XG4iLCBkYXRhW2ldKTsKLQkJfQotCQlyYyA9IG1zbV9jYW1lcmFfaTJjX3R4ZGF0YShjbGllbnQsIGJ1ZiwgbGVuK251bV9ieXRlKTsKLQkJaWYgKHJjIDwgMCkKLQkJCVNfSTJDX0RCRygiJXMgZmFpbFxuIiwgX19mdW5jX18pOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludDMyX3QgbXNtX2NhbWVyYV9pMmNfc2V0X21hc2soc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCAqY2xpZW50LAotCXVpbnQxNl90IGFkZHIsIHVpbnQxNl90IG1hc2ssCi0JZW51bSBtc21fY2FtZXJhX2kyY19kYXRhX3R5cGUgZGF0YV90eXBlLCB1aW50MTZfdCBzZXRfbWFzaykKLXsKLQlpbnQzMl90IHJjOwotCXVpbnQxNl90IHJlZ19kYXRhOwotCi0JcmMgPSBtc21fY2FtZXJhX2kyY19yZWFkKGNsaWVudCwgYWRkciwgJnJlZ19kYXRhLCBkYXRhX3R5cGUpOwotCWlmIChyYyA8IDApIHsKLQkJU19JMkNfREJHKCIlcyByZWFkIGZhaWxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlTX0kyQ19EQkcoIiVzIGFkZHI6IDB4JXggZGF0YTogMHgleCBzZXRtYXNrOiAweCV4XG4iLAotCQkJX19mdW5jX18sIGFkZHIsIHJlZ19kYXRhLCBtYXNrKTsKLQotCWlmIChzZXRfbWFzaykKLQkJcmVnX2RhdGEgfD0gbWFzazsKLQllbHNlCi0JCXJlZ19kYXRhICY9IH5tYXNrOwotCVNfSTJDX0RCRygiJXMgd3JpdGU6IDB4JXhcbiIsIF9fZnVuY19fLCByZWdfZGF0YSk7Ci0KLQlyYyA9IG1zbV9jYW1lcmFfaTJjX3dyaXRlKGNsaWVudCwgYWRkciwgcmVnX2RhdGEsIGRhdGFfdHlwZSk7Ci0JaWYgKHJjIDwgMCkKLQkJU19JMkNfREJHKCIlcyB3cml0ZSBmYWlsXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci1pbnQzMl90IG1zbV9jYW1lcmFfaTJjX3NldF93cml0ZV9tYXNrX2RhdGEoc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCAqY2xpZW50LAotCXVpbnQxNl90IGFkZHIsIHVpbnQxNl90IGRhdGEsIGludDE2X3QgbWFzaywKLQllbnVtIG1zbV9jYW1lcmFfaTJjX2RhdGFfdHlwZSBkYXRhX3R5cGUpCi17Ci0JaW50MzJfdCByYzsKLQl1aW50MTZfdCByZWdfZGF0YTsKLQlDREJHKCIlc1xuIiwgX19mdW5jX18pOwotCWlmIChtYXNrID09IC0xKQotCQlyZXR1cm4gMDsKLQlpZiAobWFzayA9PSAwKQotCQlyYyA9IG1zbV9jYW1lcmFfaTJjX3dyaXRlKGNsaWVudCwgYWRkciwgZGF0YSwgZGF0YV90eXBlKTsKLQllbHNlewotCQlyYyA9IG1zbV9jYW1lcmFfaTJjX3JlYWQoY2xpZW50LCBhZGRyLCAmcmVnX2RhdGEsIGRhdGFfdHlwZSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCUNEQkcoIiVzIHJlYWQgZmFpbFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCXJlZ19kYXRhICA9IHJlZ19kYXRhICYgbWFzazsKLQkJcmVnX2RhdGEgID0gKHJlZ19kYXRhIHwgKGRhdGEgJiAofm1hc2spKSk7Ci0JCXJjID0gbXNtX2NhbWVyYV9pMmNfd3JpdGUoY2xpZW50LCBhZGRyLCByZWdfZGF0YSwgZGF0YV90eXBlKTsKLQkJaWYgKHJjIDwgMCkKLQkJCUNEQkcoIiVzIHdyaXRlIGZhaWxcbiIsIF9fZnVuY19fKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQzMl90IG1zbV9jYW1lcmFfaTJjX2NvbXBhcmUoc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCAqY2xpZW50LAotCXVpbnQxNl90IGFkZHIsIHVpbnQxNl90IGRhdGEsCi0JZW51bSBtc21fY2FtZXJhX2kyY19kYXRhX3R5cGUgZGF0YV90eXBlKQotewotCWludDMyX3QgcmMgPSAtRUlPOwotCXVpbnQxNl90IHJlZ19kYXRhID0gMDsKLQlpbnQgZGF0YV9sZW4gPSAwOwotCXN3aXRjaCAoZGF0YV90eXBlKSB7Ci0JY2FzZSBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEE6Ci0JY2FzZSBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEE6Ci0JCWRhdGFfbGVuID0gZGF0YV90eXBlOwotCQlicmVhazsKLQljYXNlIE1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX01BU0s6Ci0JY2FzZSBNU01fQ0FNRVJBX0kyQ19VTlNFVF9CWVRFX01BU0s6Ci0JCWRhdGFfbGVuID0gTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBOwotCQlicmVhazsKLQljYXNlIE1TTV9DQU1FUkFfSTJDX1NFVF9XT1JEX01BU0s6Ci0JY2FzZSBNU01fQ0FNRVJBX0kyQ19VTlNFVF9XT1JEX01BU0s6Ci0JCWRhdGFfbGVuID0gTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbnN1cHBvcnQgZGF0YSB0eXBlOiAlZFxuIiwgX19mdW5jX18sIGRhdGFfdHlwZSk7Ci0JCWJyZWFrOwotCX0KLQotCXJjID0gbXNtX2NhbWVyYV9pMmNfcmVhZChjbGllbnQsCi0JCWFkZHIsICZyZWdfZGF0YSwgZGF0YV9sZW4pOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gMDsKLQlzd2l0Y2ggKGRhdGFfdHlwZSkgewotCWNhc2UgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBOgotCWNhc2UgTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBOgotCQlpZiAoZGF0YSA9PSByZWdfZGF0YSkKLQkJCXJldHVybiByYzsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQ0FNRVJBX0kyQ19TRVRfQllURV9NQVNLOgotCWNhc2UgTVNNX0NBTUVSQV9JMkNfU0VUX1dPUkRfTUFTSzoKLQkJaWYgKChyZWdfZGF0YSAmIGRhdGEpID09IGRhdGEpCi0JCQlyZXR1cm4gcmM7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0NBTUVSQV9JMkNfVU5TRVRfQllURV9NQVNLOgotCWNhc2UgTVNNX0NBTUVSQV9JMkNfVU5TRVRfV09SRF9NQVNLOgotCQlpZiAoIShyZWdfZGF0YSAmIGRhdGEpKQotCQkJcmV0dXJuIHJjOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbnN1cHBvcnQgZGF0YSB0eXBlOiAlZFxuIiwgX19mdW5jX18sIGRhdGFfdHlwZSk7Ci0JCWJyZWFrOwotCX0KLQotCVNfSTJDX0RCRygiJXM6IFJlZ2lzdGVyIGFuZCBkYXRhIGRvZXMgbm90IG1hdGNoXG4iLCBfX2Z1bmNfXyk7Ci0JcmMgPSAxOwotCXJldHVybiByYzsKLX0KLQotaW50MzJfdCBtc21fY2FtZXJhX2kyY19wb2xsKHN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgKmNsaWVudCwKLQl1aW50MTZfdCBhZGRyLCB1aW50MTZfdCBkYXRhLAotCWVudW0gbXNtX2NhbWVyYV9pMmNfZGF0YV90eXBlIGRhdGFfdHlwZSkKLXsKLQlpbnQzMl90IHJjID0gLUVJTzsKLQlpbnQgaTsKLQlTX0kyQ19EQkcoIiVzOiBhZGRyOiAweCV4IGRhdGE6IDB4JXggZHQ6ICVkXG4iLAotCQlfX2Z1bmNfXywgYWRkciwgZGF0YSwgZGF0YV90eXBlKTsKLQotCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7Ci0JCXJjID0gbXNtX2NhbWVyYV9pMmNfY29tcGFyZShjbGllbnQsCi0JCQlhZGRyLCBkYXRhLCBkYXRhX3R5cGUpOwotCQlpZiAocmMgPT0gMCB8fCByYyA8IDApCi0JCQlicmVhazsKLQkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotaW50MzJfdCBtc21fY2FtZXJhX2kyY193cml0ZV90YWJsZV93X21pY3JvZGVsYXkoCi0Jc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCAqY2xpZW50LAotCXN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfdGJsICpyZWdfdGJsLCB1aW50MTZfdCBzaXplLAotCWVudW0gbXNtX2NhbWVyYV9pMmNfZGF0YV90eXBlIGRhdGFfdHlwZSkKLXsKLQlpbnQgaTsKLQlpbnQzMl90IHJjID0gLUVGQVVMVDsKLQotCWlmICghY2xpZW50IHx8ICFyZWdfdGJsKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoKGNsaWVudC0+YWRkcl90eXBlICE9IE1TTV9DQU1FUkFfSTJDX0JZVEVfQUREUgotCQkmJiBjbGllbnQtPmFkZHJfdHlwZSAhPSBNU01fQ0FNRVJBX0kyQ19XT1JEX0FERFIpCi0JCXx8IChkYXRhX3R5cGUgIT0gTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBCi0JCSYmIGRhdGFfdHlwZSAhPSBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEEpKQotCQlyZXR1cm4gcmM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCXJjID0gbXNtX2NhbWVyYV9pMmNfd3JpdGUoY2xpZW50LCByZWdfdGJsLT5yZWdfYWRkciwKLQkJCXJlZ190YmwtPnJlZ19kYXRhLCBkYXRhX3R5cGUpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0JCWlmIChyZWdfdGJsLT5kZWxheSkKLQkJCXVzbGVlcF9yYW5nZShyZWdfdGJsLT5kZWxheSwgcmVnX3RibC0+ZGVsYXkgKyAxMDAwKTsKLQkJcmVnX3RibCsrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludDMyX3QgbXNtX2NhbWVyYV9pMmNfd3JpdGVfYmF5ZXJfdGFibGUoCi0Jc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCAqY2xpZW50LAotCXN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfc2V0dGluZyAqd3JpdGVfc2V0dGluZykKLXsKLQlpbnQgaTsKLQlpbnQzMl90IHJjID0gLUVGQVVMVDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2FycmF5ICpyZWdfc2V0dGluZzsKLQotCWlmICghY2xpZW50IHx8ICF3cml0ZV9zZXR0aW5nKQotCQlyZXR1cm4gcmM7Ci0KLQlyZWdfc2V0dGluZyA9IHdyaXRlX3NldHRpbmctPnJlZ19zZXR0aW5nOwotCWNsaWVudC0+YWRkcl90eXBlID0gd3JpdGVfc2V0dGluZy0+YWRkcl90eXBlOwotCWlmICgod3JpdGVfc2V0dGluZy0+YWRkcl90eXBlICE9IE1TTV9DQU1FUkFfSTJDX0JZVEVfQUREUgotCQkmJiB3cml0ZV9zZXR0aW5nLT5hZGRyX3R5cGUgIT0gTVNNX0NBTUVSQV9JMkNfV09SRF9BRERSKQotCQl8fCAod3JpdGVfc2V0dGluZy0+ZGF0YV90eXBlICE9IE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQQotCQkmJiB3cml0ZV9zZXR0aW5nLT5kYXRhX3R5cGUgIT0gTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBKSkKLQkJcmV0dXJuIHJjOwotCWZvciAoaSA9IDA7IGkgPCB3cml0ZV9zZXR0aW5nLT5zaXplOyBpKyspIHsKLQkJcmMgPSBtc21fY2FtZXJhX2kyY193cml0ZShjbGllbnQsIHJlZ19zZXR0aW5nLT5yZWdfYWRkciwKLQkJCXJlZ19zZXR0aW5nLT5yZWdfZGF0YSwgd3JpdGVfc2V0dGluZy0+ZGF0YV90eXBlKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlyZWdfc2V0dGluZysrOwotCX0KLQlpZiAod3JpdGVfc2V0dGluZy0+ZGVsYXkgPiAyMCkKLQkJbXNsZWVwKHdyaXRlX3NldHRpbmctPmRlbGF5KTsKLQllbHNlIGlmICh3cml0ZV9zZXR0aW5nLT5kZWxheSkKLQkJdXNsZWVwX3JhbmdlKHdyaXRlX3NldHRpbmctPmRlbGF5ICogMTAwMCwgKHdyaXRlX3NldHRpbmctPmRlbGF5Ci0JCQkqIDEwMDApICsgMTAwMCk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQzMl90IG1zbV9jYW1lcmFfaTJjX3dyaXRlX3RibChzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50ICpjbGllbnQsCi0Jc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mICpyZWdfY29uZl90YmwsIHVpbnQxNl90IHNpemUsCi0JZW51bSBtc21fY2FtZXJhX2kyY19kYXRhX3R5cGUgZGF0YV90eXBlKQotewotCWludCBpOwotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJZW51bSBtc21fY2FtZXJhX2kyY19kYXRhX3R5cGUgZHQ7Ci0JCWlmIChyZWdfY29uZl90YmwtPmNtZF90eXBlID09IE1TTV9DQU1FUkFfSTJDX0NNRF9QT0xMKSB7Ci0JCQlyYyA9IG1zbV9jYW1lcmFfaTJjX3BvbGwoY2xpZW50LAotCQkJCXJlZ19jb25mX3RibC0+cmVnX2FkZHIsCi0JCQkJcmVnX2NvbmZfdGJsLT5yZWdfZGF0YSwKLQkJCQlyZWdfY29uZl90YmwtPmR0KTsKLQkJfSBlbHNlIHsKLQkJCWlmIChyZWdfY29uZl90YmwtPmR0ID09IDApCi0JCQkJZHQgPSBkYXRhX3R5cGU7Ci0JCQllbHNlCi0JCQkJZHQgPSByZWdfY29uZl90YmwtPmR0OwotCQkJc3dpdGNoIChkdCkgewotCQkJY2FzZSBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEE6Ci0JCQljYXNlIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQToKLQkJCQlyYyA9IG1zbV9jYW1lcmFfaTJjX3dyaXRlKAotCQkJCQljbGllbnQsCi0JCQkJCXJlZ19jb25mX3RibC0+cmVnX2FkZHIsCi0JCQkJCXJlZ19jb25mX3RibC0+cmVnX2RhdGEsIGR0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfTUFTSzoKLQkJCQlyYyA9IG1zbV9jYW1lcmFfaTJjX3NldF9tYXNrKGNsaWVudCwKLQkJCQkJcmVnX2NvbmZfdGJsLT5yZWdfYWRkciwKLQkJCQkJcmVnX2NvbmZfdGJsLT5yZWdfZGF0YSwKLQkJCQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBLCAxKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTVNNX0NBTUVSQV9JMkNfVU5TRVRfQllURV9NQVNLOgotCQkJCXJjID0gbXNtX2NhbWVyYV9pMmNfc2V0X21hc2soY2xpZW50LAotCQkJCQlyZWdfY29uZl90YmwtPnJlZ19hZGRyLAotCQkJCQlyZWdfY29uZl90YmwtPnJlZ19kYXRhLAotCQkJCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEsIDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNU01fQ0FNRVJBX0kyQ19TRVRfV09SRF9NQVNLOgotCQkJCXJjID0gbXNtX2NhbWVyYV9pMmNfc2V0X21hc2soY2xpZW50LAotCQkJCQlyZWdfY29uZl90YmwtPnJlZ19hZGRyLAotCQkJCQlyZWdfY29uZl90YmwtPnJlZ19kYXRhLAotCQkJCQlNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEEsIDEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNU01fQ0FNRVJBX0kyQ19VTlNFVF9XT1JEX01BU0s6Ci0JCQkJcmMgPSBtc21fY2FtZXJhX2kyY19zZXRfbWFzayhjbGllbnQsCi0JCQkJCXJlZ19jb25mX3RibC0+cmVnX2FkZHIsCi0JCQkJCXJlZ19jb25mX3RibC0+cmVnX2RhdGEsCi0JCQkJCU1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX1dSSVRFX01BU0tfREFUQToKLQkJCQlyYyA9IG1zbV9jYW1lcmFfaTJjX3NldF93cml0ZV9tYXNrX2RhdGEoCi0JCQkJCWNsaWVudCwKLQkJCQkJcmVnX2NvbmZfdGJsLT5yZWdfYWRkciwKLQkJCQkJcmVnX2NvbmZfdGJsLT5yZWdfZGF0YSwKLQkJCQkJcmVnX2NvbmZfdGJsLT5tYXNrLAotCQkJCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcl9lcnIoIiVzOiBVbnN1cHBvcnQgZGF0YSB0eXBlOiAlZFxuIiwKLQkJCQkJX19mdW5jX18sIGR0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0JCXJlZ19jb25mX3RibCsrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludDMyX3QgbXNtX2NhbWVyYV9pMmNfcmVhZChzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50ICpjbGllbnQsCi0JdWludDE2X3QgYWRkciwgdWludDE2X3QgKmRhdGEsCi0JZW51bSBtc21fY2FtZXJhX2kyY19kYXRhX3R5cGUgZGF0YV90eXBlKQotewotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCXVuc2lnbmVkIGNoYXIgYnVmW2NsaWVudC0+YWRkcl90eXBlK2RhdGFfdHlwZV07Ci0KLQlpZiAoKGNsaWVudC0+YWRkcl90eXBlICE9IE1TTV9DQU1FUkFfSTJDX0JZVEVfQUREUgotCQkmJiBjbGllbnQtPmFkZHJfdHlwZSAhPSBNU01fQ0FNRVJBX0kyQ19XT1JEX0FERFIpCi0JCXx8IChkYXRhX3R5cGUgIT0gTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBCi0JCSYmIGRhdGFfdHlwZSAhPSBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEEpKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoY2xpZW50LT5jY2lfY2xpZW50KSB7Ci0JCXN0cnVjdCBtc21fY2FtZXJhX2NjaV9jdHJsIGNjaV9jdHJsOwotCQljY2lfY3RybC5jbWQgPSBNU01fQ0NJX0kyQ19SRUFEOwotCQljY2lfY3RybC5jY2lfaW5mbyA9IGNsaWVudC0+Y2NpX2NsaWVudDsKLQkJY2NpX2N0cmwuY2ZnLmNjaV9pMmNfcmVhZF9jZmcuYWRkciA9IGFkZHI7Ci0JCWNjaV9jdHJsLmNmZy5jY2lfaTJjX3JlYWRfY2ZnLmFkZHJfdHlwZSA9IGNsaWVudC0+YWRkcl90eXBlOwotCQljY2lfY3RybC5jZmcuY2NpX2kyY19yZWFkX2NmZy5kYXRhID0gYnVmOwotCQljY2lfY3RybC5jZmcuY2NpX2kyY19yZWFkX2NmZy5udW1fYnl0ZSA9IGRhdGFfdHlwZTsKLQkJcmMgPSB2NGwyX3N1YmRldl9jYWxsKGNsaWVudC0+Y2NpX2NsaWVudC0+Y2NpX3N1YmRldiwKLQkJCQljb3JlLCBpb2N0bCwgVklESU9DX01TTV9DQ0lfQ0ZHLCAmY2NpX2N0cmwpOwotCQlDREJHKCIlcyBsaW5lICVkIHJjID0gJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcmMpOwotCQlyYyA9IGNjaV9jdHJsLnN0YXR1czsKLQl9IGVsc2UgewotCQlpZiAoY2xpZW50LT5hZGRyX3R5cGUgPT0gTVNNX0NBTUVSQV9JMkNfQllURV9BRERSKSB7Ci0JCQlidWZbMF0gPSBhZGRyOwotCQl9IGVsc2UgaWYgKGNsaWVudC0+YWRkcl90eXBlID09IE1TTV9DQU1FUkFfSTJDX1dPUkRfQUREUikgewotCQkJYnVmWzBdID0gYWRkciA+PiBCSVRTX1BFUl9CWVRFOwotCQkJYnVmWzFdID0gYWRkcjsKLQkJfQotCQlyYyA9IG1zbV9jYW1lcmFfaTJjX3J4ZGF0YShjbGllbnQsIGJ1ZiwgZGF0YV90eXBlKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJU19JMkNfREJHKCIlcyBmYWlsXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0JaWYgKGRhdGFfdHlwZSA9PSBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpCi0JCSpkYXRhID0gYnVmWzBdOwotCWVsc2UKLQkJKmRhdGEgPSBidWZbMF0gPDwgOCB8IGJ1ZlsxXTsKLQotCVNfSTJDX0RCRygiJXMgYWRkciA9IDB4JXggZGF0YTogMHgleFxuIiwgX19mdW5jX18sIGFkZHIsICpkYXRhKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludDMyX3QgbXNtX2NhbWVyYV9pMmNfcmVhZF9zZXEoc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCAqY2xpZW50LAotCXVpbnQxNl90IGFkZHIsIHVpbnQ4X3QgKmRhdGEsIHVpbnQxNl90IG51bV9ieXRlKQotewotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCXVuc2lnbmVkIGNoYXIgYnVmW2NsaWVudC0+YWRkcl90eXBlK251bV9ieXRlXTsKLQlpbnQgaTsKLQotCWlmICgoY2xpZW50LT5hZGRyX3R5cGUgIT0gTVNNX0NBTUVSQV9JMkNfQllURV9BRERSCi0JCSYmIGNsaWVudC0+YWRkcl90eXBlICE9IE1TTV9DQU1FUkFfSTJDX1dPUkRfQUREUikKLQkJfHwgbnVtX2J5dGUgPT0gMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGNsaWVudC0+Y2NpX2NsaWVudCkgewotCQlzdHJ1Y3QgbXNtX2NhbWVyYV9jY2lfY3RybCBjY2lfY3RybDsKLQkJY2NpX2N0cmwuY21kID0gTVNNX0NDSV9JMkNfUkVBRDsKLQkJY2NpX2N0cmwuY2NpX2luZm8gPSBjbGllbnQtPmNjaV9jbGllbnQ7Ci0JCWNjaV9jdHJsLmNmZy5jY2lfaTJjX3JlYWRfY2ZnLmFkZHIgPSBhZGRyOwotCQljY2lfY3RybC5jZmcuY2NpX2kyY19yZWFkX2NmZy5hZGRyX3R5cGUgPSBjbGllbnQtPmFkZHJfdHlwZTsKLQkJY2NpX2N0cmwuY2ZnLmNjaV9pMmNfcmVhZF9jZmcuZGF0YSA9IGJ1ZjsKLQkJY2NpX2N0cmwuY2ZnLmNjaV9pMmNfcmVhZF9jZmcubnVtX2J5dGUgPSBudW1fYnl0ZTsKLQkJcmMgPSB2NGwyX3N1YmRldl9jYWxsKGNsaWVudC0+Y2NpX2NsaWVudC0+Y2NpX3N1YmRldiwKLQkJCQljb3JlLCBpb2N0bCwgVklESU9DX01TTV9DQ0lfQ0ZHLCAmY2NpX2N0cmwpOwotCQlDREJHKCIlcyBsaW5lICVkIHJjID0gJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcmMpOwotCQlyYyA9IGNjaV9jdHJsLnN0YXR1czsKLQl9IGVsc2UgewotCQlpZiAoY2xpZW50LT5hZGRyX3R5cGUgPT0gTVNNX0NBTUVSQV9JMkNfQllURV9BRERSKSB7Ci0JCQlidWZbMF0gPSBhZGRyOwotCQl9IGVsc2UgaWYgKGNsaWVudC0+YWRkcl90eXBlID09IE1TTV9DQU1FUkFfSTJDX1dPUkRfQUREUikgewotCQkJYnVmWzBdID0gYWRkciA+PiBCSVRTX1BFUl9CWVRFOwotCQkJYnVmWzFdID0gYWRkcjsKLQkJfQotCQlyYyA9IG1zbV9jYW1lcmFfaTJjX3J4ZGF0YShjbGllbnQsIGJ1ZiwgbnVtX2J5dGUpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlTX0kyQ19EQkcoIiVzIGZhaWxcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCVNfSTJDX0RCRygiJXMgYWRkciA9IDB4JXgiLCBfX2Z1bmNfXywgYWRkcik7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9ieXRlOyBpKyspIHsKLQkJZGF0YVtpXSA9IGJ1ZltpXTsKLQkJU19JMkNfREJHKCJCeXRlICVkOiAweCV4XG4iLCBpLCBidWZbaV0pOwotCQlTX0kyQ19EQkcoIkRhdGE6IDB4JXhcbiIsIGRhdGFbaV0pOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludDMyX3QgbXNtX3NlbnNvcl93cml0ZV9jb25mX2FycmF5KHN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgKmNsaWVudCwKLQkJCXN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5ICphcnJheSwgdWludDE2X3QgaW5kZXgpCi17Ci0JaW50MzJfdCByYzsKLQotCXJjID0gbXNtX2NhbWVyYV9pMmNfd3JpdGVfdGJsKGNsaWVudCwKLQkJKHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiAqKSBhcnJheVtpbmRleF0uY29uZiwKLQkJYXJyYXlbaW5kZXhdLnNpemUsIGFycmF5W2luZGV4XS5kYXRhX3R5cGUpOwotCWlmIChhcnJheVtpbmRleF0uZGVsYXkgPiAyMCkKLQkJbXNsZWVwKGFycmF5W2luZGV4XS5kZWxheSk7Ci0JZWxzZQotCQl1c2xlZXBfcmFuZ2UoYXJyYXlbaW5kZXhdLmRlbGF5KjEwMDAsCi0JCQkJCShhcnJheVtpbmRleF0uZGVsYXkrMSkqMTAwMCk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQzMl90IG1zbV9zZW5zb3Jfd3JpdGVfZW51bV9jb25mX2FycmF5KHN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgKmNsaWVudCwKLQkJCXN0cnVjdCBtc21fY2FtZXJhX2kyY19lbnVtX2NvbmZfYXJyYXkgKmNvbmYsCi0JCQl1aW50MTZfdCBlbnVtX3ZhbCkKLXsKLQlpbnQzMl90IHJjID0gLTEsIGk7Ci0JZm9yIChpID0gMDsgaSA8IGNvbmYtPm51bV9lbnVtOyBpKyspIHsKLQkJaWYgKGNvbmYtPmNvbmZfZW51bVtpXSA9PSBlbnVtX3ZhbCkKLQkJCWJyZWFrOwotCQlpZiAoY29uZi0+Y29uZl9lbnVtW2ldID4gZW51bV92YWwpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPT0gY29uZi0+bnVtX2VudW0pCi0JCWkgPSBjb25mLT5udW1fZW51bSAtIDE7Ci0KLQlpZiAoaSA+PSBjb25mLT5udW1faW5kZXgpCi0JCXJldHVybiByYzsKLQlyYyA9IG1zbV9zZW5zb3Jfd3JpdGVfYWxsX2NvbmZfYXJyYXkoY2xpZW50LAotCQkmY29uZi0+Y29uZltpKmNvbmYtPm51bV9jb25mXSwgY29uZi0+bnVtX2NvbmYpOwotCi0JaWYgKGNvbmYtPmRlbGF5ID4gMjApCi0JCW1zbGVlcChjb25mLT5kZWxheSk7Ci0JZWxzZQotCQl1c2xlZXBfcmFuZ2UoY29uZi0+ZGVsYXkqMTAwMCwKLQkJCQkJKGNvbmYtPmRlbGF5KzEpKjEwMDApOwotCXJldHVybiByYzsKLX0KLQotaW50MzJfdCBtc21fc2Vuc29yX3dyaXRlX2FsbF9jb25mX2FycmF5KHN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgKmNsaWVudCwKLQkJCXN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5ICphcnJheSwgdWludDE2X3Qgc2l6ZSkKLXsKLQlpbnQzMl90IHJjID0gMCwgaTsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCXJjID0gbXNtX3NlbnNvcl93cml0ZV9jb25mX2FycmF5KGNsaWVudCwgYXJyYXksIGkpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotaW50MzJfdCBtc21fc2Vuc29yX2NjaV91dGlsKHN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgKmNsaWVudCwKLQl1aW50MTZfdCBjY2lfY21kKQotewotCWludDMyX3QgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX2NjaV9jdHJsIGNjaV9jdHJsOwotCi0JQ0RCRygiJXMgbGluZSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQljY2lfY3RybC5jbWQgPSBjY2lfY21kOwotCWNjaV9jdHJsLmNjaV9pbmZvID0gY2xpZW50LT5jY2lfY2xpZW50OwotCXJjID0gdjRsMl9zdWJkZXZfY2FsbChjbGllbnQtPmNjaV9jbGllbnQtPmNjaV9zdWJkZXYsCi0JCQljb3JlLCBpb2N0bCwgVklESU9DX01TTV9DQ0lfQ0ZHLCAmY2NpX2N0cmwpOwotCUNEQkcoIiVzIGxpbmUgJWQgcmMgPSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCByYyk7Ci0JcmV0dXJuIGNjaV9jdHJsLnN0YXR1czsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9tc21fY2FtZXJhX2kyYy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvL21zbV9jYW1lcmFfaTJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNDI2MDcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvL21zbV9jYW1lcmFfaTJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBNU01fQ0FNRVJBX0kyQ19ICi0jZGVmaW5lIE1TTV9DQU1FUkFfSTJDX0gKLQotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9jYW1lcmEuaD4KLQotI2RlZmluZSBDT05GSUdfTVNNX0NBTUVSQV9JMkNfREJHIDAKLQotI2lmIENPTkZJR19NU01fQ0FNRVJBX0kyQ19EQkcKLSNkZWZpbmUgU19JMkNfREJHKGZtdCwgYXJncy4uLikgcHJpbnRrKGZtdCwgIyNhcmdzKQotI2Vsc2UKLSNkZWZpbmUgU19JMkNfREJHKGZtdCwgYXJncy4uLikgQ0RCRyhmbXQsICMjYXJncykKLSNlbmRpZgotCi1zdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50IHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBtc21fY2FtZXJhX2NjaV9jbGllbnQgKmNjaV9jbGllbnQ7Ci0JZW51bSBtc21fY2FtZXJhX2kyY19yZWdfYWRkcl90eXBlIGFkZHJfdHlwZTsKLX07Ci0KLXN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfdGJsIHsKLQl1aW50MTZfdCByZWdfYWRkcjsKLQl1aW50MTZfdCByZWdfZGF0YTsKLQl1aW50MTZfdCBkZWxheTsKLX07Ci0KLXN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5IHsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgKmNvbmY7Ci0JdWludDE2X3Qgc2l6ZTsKLQl1aW50MTZfdCBkZWxheTsKLQllbnVtIG1zbV9jYW1lcmFfaTJjX2RhdGFfdHlwZSBkYXRhX3R5cGU7Ci19OwotCi1zdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfZW51bV9jb25mX2FycmF5IHsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY29uZl9hcnJheSAqY29uZjsKLQlpbnQgKmNvbmZfZW51bTsKLQl1aW50MTZfdCBudW1fZW51bTsKLQl1aW50MTZfdCBudW1faW5kZXg7Ci0JdWludDE2X3QgbnVtX2NvbmY7Ci0JdWludDE2X3QgZGVsYXk7Ci0JZW51bSBtc21fY2FtZXJhX2kyY19kYXRhX3R5cGUgZGF0YV90eXBlOwotfTsKLQotaW50MzJfdCBtc21fY2FtZXJhX2kyY19yeGRhdGEoc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCAqY2xpZW50LAotCXVuc2lnbmVkIGNoYXIgKnJ4ZGF0YSwgaW50IGRhdGFfbGVuZ3RoKTsKLQotaW50MzJfdCBtc21fY2FtZXJhX2kyY190eGRhdGEoc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCAqY2xpZW50LAotCXVuc2lnbmVkIGNoYXIgKnR4ZGF0YSwgaW50IGxlbmd0aCk7Ci0KLWludDMyX3QgbXNtX2NhbWVyYV9pMmNfcmVhZChzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50ICpjbGllbnQsCi0JdWludDE2X3QgYWRkciwgdWludDE2X3QgKmRhdGEsCi0JZW51bSBtc21fY2FtZXJhX2kyY19kYXRhX3R5cGUgZGF0YV90eXBlKTsKLQotaW50MzJfdCBtc21fY2FtZXJhX2kyY19yZWFkX3NlcShzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50ICpjbGllbnQsCi0JdWludDE2X3QgYWRkciwgdWludDhfdCAqZGF0YSwgdWludDE2X3QgbnVtX2J5dGUpOwotCi1pbnQzMl90IG1zbV9jYW1lcmFfaTJjX3dyaXRlKHN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgKmNsaWVudCwKLQl1aW50MTZfdCBhZGRyLCB1aW50MTZfdCBkYXRhLAotCWVudW0gbXNtX2NhbWVyYV9pMmNfZGF0YV90eXBlIGRhdGFfdHlwZSk7Ci0KLWludDMyX3QgbXNtX2NhbWVyYV9pMmNfd3JpdGVfc2VxKHN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgKmNsaWVudCwKLQl1aW50MTZfdCBhZGRyLCB1aW50OF90ICpkYXRhLCB1aW50MTZfdCBudW1fYnl0ZSk7Ci0KLWludDMyX3QgbXNtX2NhbWVyYV9pMmNfc2V0X21hc2soc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCAqY2xpZW50LAotCXVpbnQxNl90IGFkZHIsIHVpbnQxNl90IG1hc2ssCi0JZW51bSBtc21fY2FtZXJhX2kyY19kYXRhX3R5cGUgZGF0YV90eXBlLCB1aW50MTZfdCBmbGFnKTsKLQotaW50MzJfdCBtc21fY2FtZXJhX2kyY19jb21wYXJlKHN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgKmNsaWVudCwKLQl1aW50MTZfdCBhZGRyLCB1aW50MTZfdCBkYXRhLAotCWVudW0gbXNtX2NhbWVyYV9pMmNfZGF0YV90eXBlIGRhdGFfdHlwZSk7Ci0KLWludDMyX3QgbXNtX2NhbWVyYV9pMmNfcG9sbChzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50ICpjbGllbnQsCi0JdWludDE2X3QgYWRkciwgdWludDE2X3QgZGF0YSwKLQllbnVtIG1zbV9jYW1lcmFfaTJjX2RhdGFfdHlwZSBkYXRhX3R5cGUpOwotCi1pbnQzMl90IG1zbV9jYW1lcmFfaTJjX3dyaXRlX3RhYmxlX3dfbWljcm9kZWxheSgKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50ICpjbGllbnQsCi0Jc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ190YmwgKnJlZ190YmwsIHVpbnQxNl90IHNpemUsCi0JZW51bSBtc21fY2FtZXJhX2kyY19kYXRhX3R5cGUgZGF0YV90eXBlKTsKLQotaW50MzJfdCBtc21fY2FtZXJhX2kyY193cml0ZV9iYXllcl90YWJsZSgKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50ICpjbGllbnQsCi0Jc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19zZXR0aW5nICp3cml0ZV9zZXR0aW5nKTsKLQotaW50MzJfdCBtc21fY2FtZXJhX2kyY193cml0ZV90Ymwoc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCAqY2xpZW50LAotCXN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiAqcmVnX2NvbmZfdGJsLCB1aW50MTZfdCBzaXplLAotCWVudW0gbXNtX2NhbWVyYV9pMmNfZGF0YV90eXBlIGRhdGFfdHlwZSk7Ci0KLWludDMyX3QgbXNtX3NlbnNvcl93cml0ZV9jb25mX2FycmF5KHN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgKmNsaWVudCwKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY29uZl9hcnJheSAqYXJyYXksIHVpbnQxNl90IGluZGV4KTsKLQotaW50MzJfdCBtc21fc2Vuc29yX3dyaXRlX2VudW1fY29uZl9hcnJheShzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50ICpjbGllbnQsCi0Jc3RydWN0IG1zbV9jYW1lcmFfaTJjX2VudW1fY29uZl9hcnJheSAqY29uZiwgdWludDE2X3QgZW51bV92YWwpOwotCi1pbnQzMl90IG1zbV9zZW5zb3Jfd3JpdGVfYWxsX2NvbmZfYXJyYXkoc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCAqY2xpZW50LAotCXN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5ICphcnJheSwgdWludDE2X3Qgc2l6ZSk7Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9jY2lfdXRpbChzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50ICpjbGllbnQsCi0JdWludDE2X3QgY2NpX2NtZCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9tc21fY2FtZXJhX2kyY19tdXguYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9tc21fY2FtZXJhX2kyY19tdXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0YTkxYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW8vbXNtX2NhbWVyYV9pMmNfbXV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlICJtc20uaCIKLSNpbmNsdWRlICJtc21fY2FtZXJhX2kyY19tdXguaCIKLQotc3RhdGljIGludCBtc21faTJjX211eF9jb25maWcoc3RydWN0IGkyY19tdXhfZGV2aWNlICptdXhfZGV2aWNlLCB1aW50OF90ICptb2RlKQotewotCXVpbnQzMl90IHZhbDsKLQl2YWwgPSBtc21fY2FtZXJhX2lvX3IobXV4X2RldmljZS0+Y3RsX2Jhc2UpOwotCWlmICgqbW9kZSA9PSBNT0RFX0RVQUwpIHsKLQkJbXNtX2NhbWVyYV9pb193KHZhbCB8IDB4MywgbXV4X2RldmljZS0+Y3RsX2Jhc2UpOwotCX0gZWxzZSBpZiAoKm1vZGUgPT0gTU9ERV9MKSB7Ci0JCW1zbV9jYW1lcmFfaW9fdygoKHZhbCB8IDB4MikgJiB+KDB4MSkpLCBtdXhfZGV2aWNlLT5jdGxfYmFzZSk7Ci0JCXZhbCA9IG1zbV9jYW1lcmFfaW9fcihtdXhfZGV2aWNlLT5jdGxfYmFzZSk7Ci0JCUNEQkcoInRoZSBjYW1pbyBtb2RlIGNvbmZpZyBsZWZ0IHZhbHVlIGlzICVkXG4iLCB2YWwpOwotCX0gZWxzZSB7Ci0JCW1zbV9jYW1lcmFfaW9fdygoKHZhbCB8IDB4MSkgJiB+KDB4MikpLCBtdXhfZGV2aWNlLT5jdGxfYmFzZSk7Ci0JCXZhbCA9IG1zbV9jYW1lcmFfaW9fcihtdXhfZGV2aWNlLT5jdGxfYmFzZSk7Ci0JCUNEQkcoInRoZSBjYW1pbyBtb2RlIGNvbmZpZyByaWdodCB2YWx1ZSBpcyAlZFxuIiwgdmFsKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2kyY19tdXhfaW5pdChzdHJ1Y3QgaTJjX211eF9kZXZpY2UgKm11eF9kZXZpY2UpCi17Ci0JaW50IHJjID0gMCwgdmFsID0gMDsKLQlpZiAobXV4X2RldmljZS0+dXNlX2NvdW50ID09IDApIHsKLQkJbXV4X2RldmljZS0+Y3RsX2Jhc2UgPSBpb3JlbWFwKG11eF9kZXZpY2UtPmN0bF9tZW0tPnN0YXJ0LAotCQkJcmVzb3VyY2Vfc2l6ZShtdXhfZGV2aWNlLT5jdGxfbWVtKSk7Ci0JCWlmICghbXV4X2RldmljZS0+Y3RsX2Jhc2UpIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCXJldHVybiByYzsKLQkJfQotCQltdXhfZGV2aWNlLT5yd19iYXNlID0gaW9yZW1hcChtdXhfZGV2aWNlLT5yd19tZW0tPnN0YXJ0LAotCQkJcmVzb3VyY2Vfc2l6ZShtdXhfZGV2aWNlLT5yd19tZW0pKTsKLQkJaWYgKCFtdXhfZGV2aWNlLT5yd19iYXNlKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlpb3VubWFwKG11eF9kZXZpY2UtPmN0bF9iYXNlKTsKLQkJCXJldHVybiByYzsKLQkJfQotCQl2YWwgPSBtc21fY2FtZXJhX2lvX3IobXV4X2RldmljZS0+cndfYmFzZSk7Ci0JCW1zbV9jYW1lcmFfaW9fdygodmFsIHwgMHgyMDApLCBtdXhfZGV2aWNlLT5yd19iYXNlKTsKLQl9Ci0JbXV4X2RldmljZS0+dXNlX2NvdW50Kys7Ci0JcmV0dXJuIDA7Ci19OwotCi1zdGF0aWMgaW50IG1zbV9pMmNfbXV4X3JlbGVhc2Uoc3RydWN0IGkyY19tdXhfZGV2aWNlICptdXhfZGV2aWNlKQotewotCWludCB2YWwgPSAwOwotCW11eF9kZXZpY2UtPnVzZV9jb3VudC0tOwotCWlmIChtdXhfZGV2aWNlLT51c2VfY291bnQgPT0gMCkgewotCQl2YWwgPSBtc21fY2FtZXJhX2lvX3IobXV4X2RldmljZS0+cndfYmFzZSk7Ci0JCW1zbV9jYW1lcmFfaW9fdygodmFsICYgfjB4MjAwKSwgbXV4X2RldmljZS0+cndfYmFzZSk7Ci0JCWlvdW5tYXAobXV4X2RldmljZS0+cndfYmFzZSk7Ci0JCWlvdW5tYXAobXV4X2RldmljZS0+Y3RsX2Jhc2UpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgbXNtX2kyY19tdXhfc3ViZGV2X2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IGkyY19tdXhfZGV2aWNlICptdXhfZGV2aWNlOwotCWludCByYyA9IDA7Ci0JbXV4X2RldmljZSA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCWlmIChtdXhfZGV2aWNlID09IE5VTEwpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlyZXR1cm4gcmM7Ci0JfQotCW11dGV4X2xvY2soJm11eF9kZXZpY2UtPm11dGV4KTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVklESU9DX01TTV9JMkNfTVVYX0NGRzoKLQkJcmMgPSBtc21faTJjX211eF9jb25maWcobXV4X2RldmljZSwgKHVpbnQ4X3QgKikgYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBWSURJT0NfTVNNX0kyQ19NVVhfSU5JVDoKLQkJcmMgPSBtc21faTJjX211eF9pbml0KG11eF9kZXZpY2UpOwotCQlicmVhazsKLQljYXNlIFZJRElPQ19NU01fSTJDX01VWF9SRUxFQVNFOgotCQlyYyA9IG1zbV9pMmNfbXV4X3JlbGVhc2UobXV4X2RldmljZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVOT0lPQ1RMQ01EOwotCX0KLQltdXRleF91bmxvY2soJm11eF9kZXZpY2UtPm11dGV4KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbXNtX2kyY19tdXhfc3ViZGV2X2NvcmVfb3BzID0gewotCS5pb2N0bCA9ICZtc21faTJjX211eF9zdWJkZXZfaW9jdGwsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBtc21faTJjX211eF9zdWJkZXZfb3BzID0gewotCS5jb3JlID0gJm1zbV9pMmNfbXV4X3N1YmRldl9jb3JlX29wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGkyY19tdXhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgaTJjX211eF9kZXZpY2UgKm11eF9kZXZpY2U7Ci0JaW50IHJjID0gMDsKLQlDREJHKCIlczogZGV2aWNlIGlkID0gJWRcbiIsIF9fZnVuY19fLCBwZGV2LT5pZCk7Ci0JbXV4X2RldmljZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfbXV4X2RldmljZSksIEdGUF9LRVJORUwpOwotCWlmICghbXV4X2RldmljZSkgewotCQlwcl9lcnIoIiVzOiBubyBlbm91Z2ggbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXY0bDJfc3ViZGV2X2luaXQoJm11eF9kZXZpY2UtPnN1YmRldiwgJm1zbV9pMmNfbXV4X3N1YmRldl9vcHMpOwotCXY0bDJfc2V0X3N1YmRldmRhdGEoJm11eF9kZXZpY2UtPnN1YmRldiwgbXV4X2RldmljZSk7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJm11eF9kZXZpY2UtPnN1YmRldik7Ci0JbXV0ZXhfaW5pdCgmbXV4X2RldmljZS0+bXV0ZXgpOwotCi0JbXV4X2RldmljZS0+Y3RsX21lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKLQkJCQkJSU9SRVNPVVJDRV9NRU0sICJpMmNfbXV4X2N0bCIpOwotCWlmICghbXV4X2RldmljZS0+Y3RsX21lbSkgewotCQlwcl9lcnIoIiVzOiBubyBtZW0gcmVzb3VyY2U/XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBpMmNfbXV4X25vX3Jlc291cmNlOwotCX0KLQltdXhfZGV2aWNlLT5jdGxfaW8gPSByZXF1ZXN0X21lbV9yZWdpb24obXV4X2RldmljZS0+Y3RsX21lbS0+c3RhcnQsCi0JCXJlc291cmNlX3NpemUobXV4X2RldmljZS0+Y3RsX21lbSksIHBkZXYtPm5hbWUpOwotCWlmICghbXV4X2RldmljZS0+Y3RsX2lvKSB7Ci0JCXByX2VycigiJXM6IG5vIHZhbGlkIG1lbSByZWdpb25cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gaTJjX211eF9ub19yZXNvdXJjZTsKLQl9Ci0JbXV4X2RldmljZS0+cndfbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LAotCQkJCQlJT1JFU09VUkNFX01FTSwgImkyY19tdXhfcnciKTsKLQlpZiAoIW11eF9kZXZpY2UtPnJ3X21lbSkgewotCQlwcl9lcnIoIiVzOiBubyBtZW0gcmVzb3VyY2U/XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBpMmNfbXV4X25vX3Jlc291cmNlOwotCX0KLQltdXhfZGV2aWNlLT5yd19pbyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihtdXhfZGV2aWNlLT5yd19tZW0tPnN0YXJ0LAotCQlyZXNvdXJjZV9zaXplKG11eF9kZXZpY2UtPnJ3X21lbSksIHBkZXYtPm5hbWUpOwotCWlmICghbXV4X2RldmljZS0+cndfaW8pIHsKLQkJcHJfZXJyKCIlczogbm8gdmFsaWQgbWVtIHJlZ2lvblxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBpMmNfbXV4X25vX3Jlc291cmNlOwotCX0KLQltdXhfZGV2aWNlLT5wZGV2ID0gcGRldjsKLQlyZXR1cm4gMDsKLQotaTJjX211eF9ub19yZXNvdXJjZToKLQltdXRleF9kZXN0cm95KCZtdXhfZGV2aWNlLT5tdXRleCk7Ci0Ja2ZyZWUobXV4X2RldmljZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGkyY19tdXhfZHJpdmVyID0gewotCS5wcm9iZSA9IGkyY19tdXhfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBNU01fSTJDX01VWF9EUlZfTkFNRSwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9jYW1lcmFfaTJjX211eF9pbml0X21vZHVsZSh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmkyY19tdXhfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG1zbV9jYW1lcmFfaTJjX211eF9leGl0X21vZHVsZSh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZpMmNfbXV4X2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KG1zbV9jYW1lcmFfaTJjX211eF9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChtc21fY2FtZXJhX2kyY19tdXhfZXhpdF9tb2R1bGUpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gQ2FtZXJhIEkyQyBtdXggZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW8vbXNtX2NhbWVyYV9pMmNfbXV4LmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW8vbXNtX2NhbWVyYV9pMmNfbXV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZjkwOGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvL21zbV9jYW1lcmFfaTJjX211eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBNU01fSTJDX01VWF9ICi0jZGVmaW5lIE1TTV9JMkNfTVVYX0gKLQotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KLQotc3RydWN0IGkyY19tdXhfZGV2aWNlIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXN0cnVjdCB2NGwyX3N1YmRldiBzdWJkZXY7Ci0Jc3RydWN0IHJlc291cmNlICpjdGxfbWVtOwotCXN0cnVjdCByZXNvdXJjZSAqY3RsX2lvOwotCXZvaWQgX19pb21lbSAqY3RsX2Jhc2U7Ci0Jc3RydWN0IHJlc291cmNlICpyd19tZW07Ci0Jc3RydWN0IHJlc291cmNlICpyd19pbzsKLQl2b2lkIF9faW9tZW0gKnJ3X2Jhc2U7Ci0Jc3RydWN0IG11dGV4IG11dGV4OwotCXVuc2lnbmVkIHVzZV9jb3VudDsKLX07Ci0KLXN0cnVjdCBpMmNfbXV4X2NmZ19wYXJhbXMgewotCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2OwotCXZvaWQgKnBhcm1zOwotfTsKLQotI2RlZmluZSBWSURJT0NfTVNNX0kyQ19NVVhfQ0ZHIFwKLQlfSU9XUignVicsIEJBU0VfVklESU9DX1BSSVZBVEUgKyAxMywgc3RydWN0IGkyY19tdXhfY2ZnX3BhcmFtcykKLQotI2RlZmluZSBWSURJT0NfTVNNX0kyQ19NVVhfSU5JVCBcCi0JX0lPV1IoJ1YnLCBCQVNFX1ZJRElPQ19QUklWQVRFICsgMTQsIHN0cnVjdCB2NGwyX3N1YmRldiopCi0KLSNkZWZpbmUgVklESU9DX01TTV9JMkNfTVVYX1JFTEVBU0UgXAotCV9JT1dSKCdWJywgQkFTRV9WSURJT0NfUFJJVkFURSArIDE1LCBzdHJ1Y3QgdjRsMl9zdWJkZXYqKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9tc21fY2FtZXJhX2lvX3V0aWwuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9tc21fY2FtZXJhX2lvX3V0aWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwYTAxMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW8vbXNtX2NhbWVyYV9pb191dGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0YWlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpb211eC5oPgotCi0jZGVmaW5lIEJVRkZfU0laRV8xMjggMTI4Ci1zdGF0aWMgaW50IGdwaW9fcmVmX2NvdW50OwotCi12b2lkIG1zbV9jYW1lcmFfaW9fdyh1MzIgZGF0YSwgdm9pZCBfX2lvbWVtICphZGRyKQotewotCUNEQkcoIiVzOiAlMDh4ICUwOHhcbiIsIF9fZnVuY19fLCAoaW50KSAoYWRkciksIChkYXRhKSk7Ci0Jd3JpdGVsX3JlbGF4ZWQoKGRhdGEpLCAoYWRkcikpOwotfQotCi12b2lkIG1zbV9jYW1lcmFfaW9fd19tYih1MzIgZGF0YSwgdm9pZCBfX2lvbWVtICphZGRyKQotewotCUNEQkcoIiVzOiAlMDh4ICUwOHhcbiIsIF9fZnVuY19fLCAoaW50KSAoYWRkciksIChkYXRhKSk7Ci0Jd21iKCk7Ci0Jd3JpdGVsX3JlbGF4ZWQoKGRhdGEpLCAoYWRkcikpOwotCXdtYigpOwotfQotCi11MzIgbXNtX2NhbWVyYV9pb19yKHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQl1aW50MzJfdCBkYXRhID0gcmVhZGxfcmVsYXhlZChhZGRyKTsKLQlDREJHKCIlczogJTA4eCAlMDh4XG4iLCBfX2Z1bmNfXywgKGludCkgKGFkZHIpLCAoZGF0YSkpOwotCXJldHVybiBkYXRhOwotfQotCi11MzIgbXNtX2NhbWVyYV9pb19yX21iKHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQl1aW50MzJfdCBkYXRhOwotCXJtYigpOwotCWRhdGEgPSByZWFkbF9yZWxheGVkKGFkZHIpOwotCXJtYigpOwotCUNEQkcoIiVzOiAlMDh4ICUwOHhcbiIsIF9fZnVuY19fLCAoaW50KSAoYWRkciksIChkYXRhKSk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLXZvaWQgbXNtX2NhbWVyYV9pb19tZW1jcHlfdG9pbyh2b2lkIF9faW9tZW0gKmRlc3RfYWRkciwKLQl2b2lkIF9faW9tZW0gKnNyY19hZGRyLCB1MzIgbGVuKQotewotCWludCBpOwotCXUzMiAqZCA9ICh1MzIgKikgZGVzdF9hZGRyOwotCXUzMiAqcyA9ICh1MzIgKikgc3JjX2FkZHI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCXdyaXRlbF9yZWxheGVkKCpzKyssIGQrKyk7Ci19Ci0KLXZvaWQgbXNtX2NhbWVyYV9pb19kdW1wKHZvaWQgX19pb21lbSAqYWRkciwgaW50IHNpemUpCi17Ci0JY2hhciBsaW5lX3N0cltCVUZGX1NJWkVfMTI4XSwgKnBfc3RyOwotCWludCBpOwotCXUzMiAqcCA9ICh1MzIgKikgYWRkcjsKLQl1MzIgZGF0YTsKLQlDREJHKCIlczogJXAgJWRcbiIsIF9fZnVuY19fLCBhZGRyLCBzaXplKTsKLQlsaW5lX3N0clswXSA9ICdcMCc7Ci0JcF9zdHIgPSBsaW5lX3N0cjsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZS80OyBpKyspIHsKLQkJaWYgKGkgJSA0ID09IDApIHsKLQkJCXNucHJpbnRmKHBfc3RyLCAxMiwgIiUwOHg6ICIsICh1MzIpIHApOwotCQkJcF9zdHIgKz0gMTA7Ci0JCX0KLQkJZGF0YSA9IHJlYWRsX3JlbGF4ZWQocCsrKTsKLQkJc25wcmludGYocF9zdHIsIDEyLCAiJTA4eCAiLCBkYXRhKTsKLQkJcF9zdHIgKz0gOTsKLQkJaWYgKChpICsgMSkgJSA0ID09IDApIHsKLQkJCUNEQkcoIiVzXG4iLCBsaW5lX3N0cik7Ci0JCQlsaW5lX3N0clswXSA9ICdcMCc7Ci0JCQlwX3N0ciA9IGxpbmVfc3RyOwotCQl9Ci0JfQotCWlmIChsaW5lX3N0clswXSAhPSAnXDAnKQotCQlDREJHKCIlc1xuIiwgbGluZV9zdHIpOwotfQotCi12b2lkIG1zbV9jYW1lcmFfaW9fbWVtY3B5KHZvaWQgX19pb21lbSAqZGVzdF9hZGRyLAotCXZvaWQgX19pb21lbSAqc3JjX2FkZHIsIHUzMiBsZW4pCi17Ci0JQ0RCRygiJXM6ICVwICVwICVkXG4iLCBfX2Z1bmNfXywgZGVzdF9hZGRyLCBzcmNfYWRkciwgbGVuKTsKLQltc21fY2FtZXJhX2lvX21lbWNweV90b2lvKGRlc3RfYWRkciwgc3JjX2FkZHIsIGxlbiAvIDQpOwotCW1zbV9jYW1lcmFfaW9fZHVtcChkZXN0X2FkZHIsIGxlbik7Ci19Ci0KLWludCBtc21fY2FtX2Nsa19lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgbXNtX2NhbV9jbGtfaW5mbyAqY2xrX2luZm8sCi0JCXN0cnVjdCBjbGsgKipjbGtfcHRyLCBpbnQgbnVtX2NsaywgaW50IGVuYWJsZSkKLXsKLQlpbnQgaTsKLQlpbnQgcmMgPSAwOwotCWlmIChlbmFibGUpIHsKLQkJZm9yIChpID0gMDsgaSA8IG51bV9jbGs7IGkrKykgewotCQkJY2xrX3B0cltpXSA9IGNsa19nZXQoZGV2LCBjbGtfaW5mb1tpXS5jbGtfbmFtZSk7Ci0JCQlpZiAoSVNfRVJSKGNsa19wdHJbaV0pKSB7Ci0JCQkJcHJfZXJyKCIlcyBnZXQgZmFpbGVkXG4iLCBjbGtfaW5mb1tpXS5jbGtfbmFtZSk7Ci0JCQkJcmMgPSBQVFJfRVJSKGNsa19wdHJbaV0pOwotCQkJCWdvdG8gY2FtX2Nsa19nZXRfZXJyOwotCQkJfQotCQkJaWYgKGNsa19pbmZvW2ldLmNsa19yYXRlID49IDApIHsKLQkJCQlyYyA9IGNsa19zZXRfcmF0ZShjbGtfcHRyW2ldLAotCQkJCQkJCWNsa19pbmZvW2ldLmNsa19yYXRlKTsKLQkJCQlpZiAocmMgPCAwKSB7Ci0JCQkJCXByX2VycigiJXMgc2V0IGZhaWxlZFxuIiwKLQkJCQkJCSAgIGNsa19pbmZvW2ldLmNsa19uYW1lKTsKLQkJCQkJZ290byBjYW1fY2xrX3NldF9lcnI7Ci0JCQkJfQotCQkJfQotCQkJcmMgPSBjbGtfcHJlcGFyZShjbGtfcHRyW2ldKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzIHByZXBhcmUgZmFpbGVkXG4iLAotCQkJCQkgICBjbGtfaW5mb1tpXS5jbGtfbmFtZSk7Ci0JCQkJZ290byBjYW1fY2xrX3ByZXBhcmVfZXJyOwotCQkJfQotCi0JCQlyYyA9IGNsa19lbmFibGUoY2xrX3B0cltpXSk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlcyBlbmFibGUgZmFpbGVkXG4iLAotCQkJCQkgICBjbGtfaW5mb1tpXS5jbGtfbmFtZSk7Ci0JCQkJZ290byBjYW1fY2xrX2VuYWJsZV9lcnI7Ci0JCQl9Ci0JCQlpZiAoY2xrX2luZm9baV0uZGVsYXkgPiAyMCkgewotCQkJCW1zbGVlcChjbGtfaW5mb1tpXS5kZWxheSk7Ci0JCQl9IGVsc2UgaWYgKGNsa19pbmZvW2ldLmRlbGF5KSB7Ci0JCQkJdXNsZWVwX3JhbmdlKGNsa19pbmZvW2ldLmRlbGF5ICogMTAwMCwKLQkJCQkJKGNsa19pbmZvW2ldLmRlbGF5ICogMTAwMCkgKyAxMDAwKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IG51bV9jbGsgLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKGNsa19wdHJbaV0gIT0gTlVMTCkgewotCQkJCWNsa19kaXNhYmxlKGNsa19wdHJbaV0pOwotCQkJCWNsa191bnByZXBhcmUoY2xrX3B0cltpXSk7Ci0JCQkJY2xrX3B1dChjbGtfcHRyW2ldKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gcmM7Ci0KLQotY2FtX2Nsa19lbmFibGVfZXJyOgotCWNsa191bnByZXBhcmUoY2xrX3B0cltpXSk7Ci1jYW1fY2xrX3ByZXBhcmVfZXJyOgotY2FtX2Nsa19zZXRfZXJyOgotCWNsa19wdXQoY2xrX3B0cltpXSk7Ci1jYW1fY2xrX2dldF9lcnI6Ci0JZm9yIChpLS07IGkgPj0gMDsgaS0tKSB7Ci0JCWlmIChjbGtfcHRyW2ldICE9IE5VTEwpIHsKLQkJCWNsa19kaXNhYmxlKGNsa19wdHJbaV0pOwotCQkJY2xrX3VucHJlcGFyZShjbGtfcHRyW2ldKTsKLQkJCWNsa19wdXQoY2xrX3B0cltpXSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2NhbWVyYV9jb25maWdfdnJlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBjYW1lcmFfdnJlZ190ICpjYW1fdnJlZywKLQkJaW50IG51bV92cmVnLCBlbnVtIG1zbV9jYW1lcmFfdnJlZ19uYW1lX3QgKnZyZWdfc2VxLAotCQlpbnQgbnVtX3ZyZWdfc2VxLCBzdHJ1Y3QgcmVndWxhdG9yICoqcmVnX3B0ciwgaW50IGNvbmZpZykKLXsKLQlpbnQgaSA9IDAsIGogPSAwOwotCWludCByYyA9IDA7Ci0Jc3RydWN0IGNhbWVyYV92cmVnX3QgKmN1cnJfdnJlZzsKLQotCWlmIChudW1fdnJlZ19zZXEgPiBudW1fdnJlZykgewotCQlwcl9lcnIoIiVzOiVkIHZyZWcgc2VxdWVuY2UgaW52YWxpZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICghbnVtX3ZyZWdfc2VxKQotCQludW1fdnJlZ19zZXEgPSBudW1fdnJlZzsKLQotCWlmIChjb25maWcpIHsKLQkJZm9yIChpID0gMDsgaSA8IG51bV92cmVnX3NlcTsgaSsrKSB7Ci0JCQlpZiAodnJlZ19zZXEpIHsKLQkJCQlqID0gdnJlZ19zZXFbaV07Ci0JCQkJaWYgKGogPj0gbnVtX3ZyZWcpCi0JCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlCi0JCQkJaiA9IGk7Ci0JCQljdXJyX3ZyZWcgPSAmY2FtX3ZyZWdbal07Ci0JCQlyZWdfcHRyW2pdID0gcmVndWxhdG9yX2dldChkZXYsCi0JCQkJY3Vycl92cmVnLT5yZWdfbmFtZSk7Ci0JCQlpZiAoSVNfRVJSKHJlZ19wdHJbal0pKSB7Ci0JCQkJcHJfZXJyKCIlczogJXMgZ2V0IGZhaWxlZFxuIiwKLQkJCQkJIF9fZnVuY19fLAotCQkJCQkgY3Vycl92cmVnLT5yZWdfbmFtZSk7Ci0JCQkJcmVnX3B0cltqXSA9IE5VTEw7Ci0JCQkJZ290byB2cmVnX2dldF9mYWlsOwotCQkJfQotCQkJaWYgKGN1cnJfdnJlZy0+dHlwZSA9PSBSRUdfTERPKSB7Ci0JCQkJcmMgPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UoCi0JCQkJCXJlZ19wdHJbal0sCi0JCQkJCWN1cnJfdnJlZy0+bWluX3ZvbHRhZ2UsCi0JCQkJCWN1cnJfdnJlZy0+bWF4X3ZvbHRhZ2UpOwotCQkJCWlmIChyYyA8IDApIHsKLQkJCQkJcHJfZXJyKCIlczogJXMgc2V0IHZvbHRhZ2UgZmFpbGVkXG4iLAotCQkJCQkJX19mdW5jX18sCi0JCQkJCQljdXJyX3ZyZWctPnJlZ19uYW1lKTsKLQkJCQkJZ290byB2cmVnX3NldF92b2x0YWdlX2ZhaWw7Ci0JCQkJfQotCQkJCWlmIChjdXJyX3ZyZWctPm9wX21vZGUgPj0gMCkgewotCQkJCQlyYyA9IHJlZ3VsYXRvcl9zZXRfb3B0aW11bV9tb2RlKAotCQkJCQkJcmVnX3B0cltqXSwKLQkJCQkJCWN1cnJfdnJlZy0+b3BfbW9kZSk7Ci0JCQkJCWlmIChyYyA8IDApIHsKLQkJCQkJCXByX2VycigKLQkJCQkJCSIlczogJXMgc2V0IG9wdGltdW0gbW9kZSBmYWlsZWRcbiIsCi0JCQkJCQlfX2Z1bmNfXywKLQkJCQkJCWN1cnJfdnJlZy0+cmVnX25hbWUpOwotCQkJCQkJZ290byB2cmVnX3NldF9vcHRfbW9kZV9mYWlsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gbnVtX3ZyZWdfc2VxLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAodnJlZ19zZXEpIHsKLQkJCQlqID0gdnJlZ19zZXFbaV07Ci0JCQkJaWYgKGogPj0gbnVtX3ZyZWcpCi0JCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlCi0JCQkJaiA9IGk7Ci0JCQljdXJyX3ZyZWcgPSAmY2FtX3ZyZWdbal07Ci0JCQlpZiAocmVnX3B0cltqXSkgewotCQkJCWlmIChjdXJyX3ZyZWctPnR5cGUgPT0gUkVHX0xETykgewotCQkJCQlpZiAoY3Vycl92cmVnLT5vcF9tb2RlID49IDApIHsKLQkJCQkJCXJlZ3VsYXRvcl9zZXRfb3B0aW11bV9tb2RlKAotCQkJCQkJCXJlZ19wdHJbal0sIDApOwotCQkJCQl9Ci0JCQkJCXJlZ3VsYXRvcl9zZXRfdm9sdGFnZSgKLQkJCQkJCXJlZ19wdHJbal0sIDAsIGN1cnJfdnJlZy0+Ci0JCQkJCQltYXhfdm9sdGFnZSk7Ci0JCQkJfQotCQkJCXJlZ3VsYXRvcl9wdXQocmVnX3B0cltqXSk7Ci0JCQkJcmVnX3B0cltqXSA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci0KLXZyZWdfdW5jb25maWc6Ci1pZiAoY3Vycl92cmVnLT50eXBlID09IFJFR19MRE8pCi0JcmVndWxhdG9yX3NldF9vcHRpbXVtX21vZGUocmVnX3B0cltqXSwgMCk7Ci0KLXZyZWdfc2V0X29wdF9tb2RlX2ZhaWw6Ci1pZiAoY3Vycl92cmVnLT50eXBlID09IFJFR19MRE8pCi0JcmVndWxhdG9yX3NldF92b2x0YWdlKHJlZ19wdHJbal0sIDAsCi0JCWN1cnJfdnJlZy0+bWF4X3ZvbHRhZ2UpOwotCi12cmVnX3NldF92b2x0YWdlX2ZhaWw6Ci0JcmVndWxhdG9yX3B1dChyZWdfcHRyW2pdKTsKLQlyZWdfcHRyW2pdID0gTlVMTDsKLQotdnJlZ19nZXRfZmFpbDoKLQlmb3IgKGktLTsgaSA+PSAwOyBpLS0pIHsKLQkJaWYgKHZyZWdfc2VxKSB7Ci0JCQlqID0gdnJlZ19zZXFbaV07Ci0JCQlpZiAoaiA+PSBudW1fdnJlZykKLQkJCQljb250aW51ZTsKLQkJfSBlbHNlCi0JCQlqID0gaTsKLQkJY3Vycl92cmVnID0gJmNhbV92cmVnW2pdOwotCQlnb3RvIHZyZWdfdW5jb25maWc7Ci0JfQotCXJldHVybiAtRU5PREVWOwotfQotCi1pbnQgbXNtX2NhbWVyYV9lbmFibGVfdnJlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBjYW1lcmFfdnJlZ190ICpjYW1fdnJlZywKLQkJaW50IG51bV92cmVnLCBlbnVtIG1zbV9jYW1lcmFfdnJlZ19uYW1lX3QgKnZyZWdfc2VxLAotCQlpbnQgbnVtX3ZyZWdfc2VxLCBzdHJ1Y3QgcmVndWxhdG9yICoqcmVnX3B0ciwgaW50IGVuYWJsZSkKLXsKLQlpbnQgaSA9IDAsIGogPSAwLCByYyA9IDA7Ci0KLQlpZiAobnVtX3ZyZWdfc2VxID4gbnVtX3ZyZWcpIHsKLQkJcHJfZXJyKCIlczolZCB2cmVnIHNlcXVlbmNlIGludmFsaWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoIW51bV92cmVnX3NlcSkKLQkJbnVtX3ZyZWdfc2VxID0gbnVtX3ZyZWc7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBudW1fdnJlZ19zZXE7IGkrKykgewotCQkJaWYgKHZyZWdfc2VxKSB7Ci0JCQkJaiA9IHZyZWdfc2VxW2ldOwotCQkJCWlmIChqID49IG51bV92cmVnKQotCQkJCQljb250aW51ZTsKLQkJCX0gZWxzZQotCQkJCWogPSBpOwotCQkJaWYgKElTX0VSUihyZWdfcHRyW2pdKSkgewotCQkJCXByX2VycigiJXM6ICVzIG51bGwgcmVndWxhdG9yXG4iLAotCQkJCQlfX2Z1bmNfXywgY2FtX3ZyZWdbal0ucmVnX25hbWUpOwotCQkJCWdvdG8gZGlzYWJsZV92cmVnOwotCQkJfQotCQkJcmMgPSByZWd1bGF0b3JfZW5hYmxlKHJlZ19wdHJbal0pOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6ICVzIGVuYWJsZSBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fLCBjYW1fdnJlZ1tqXS5yZWdfbmFtZSk7Ci0JCQkJZ290byBkaXNhYmxlX3ZyZWc7Ci0JCQl9Ci0JCQlpZiAoY2FtX3ZyZWdbal0uZGVsYXkgPiAyMCkKLQkJCQltc2xlZXAoY2FtX3ZyZWdbal0uZGVsYXkpOwotCQkJZWxzZSBpZiAoY2FtX3ZyZWdbal0uZGVsYXkpCi0JCQkJdXNsZWVwX3JhbmdlKGNhbV92cmVnW2pdLmRlbGF5ICogMTAwMCwKLQkJCQkJKGNhbV92cmVnW2pdLmRlbGF5ICogMTAwMCkgKyAxMDAwKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IG51bV92cmVnX3NlcS0xOyBpID49IDA7IGktLSkgewotCQkJaWYgKHZyZWdfc2VxKSB7Ci0JCQkJaiA9IHZyZWdfc2VxW2ldOwotCQkJCWlmIChqID49IG51bV92cmVnKQotCQkJCQljb250aW51ZTsKLQkJCX0gZWxzZQotCQkJCWogPSBpOwotCQkJcmVndWxhdG9yX2Rpc2FibGUocmVnX3B0cltqXSk7Ci0JCQlpZiAoY2FtX3ZyZWdbal0uZGVsYXkgPiAyMCkKLQkJCQltc2xlZXAoY2FtX3ZyZWdbal0uZGVsYXkpOwotCQkJZWxzZSBpZiAoY2FtX3ZyZWdbal0uZGVsYXkpCi0JCQkJdXNsZWVwX3JhbmdlKGNhbV92cmVnW2pdLmRlbGF5ICogMTAwMCwKLQkJCQkJKGNhbV92cmVnW2pdLmRlbGF5ICogMTAwMCkgKyAxMDAwKTsKLQkJfQotCX0KLQlyZXR1cm4gcmM7Ci1kaXNhYmxlX3ZyZWc6Ci0JZm9yIChpLS07IGkgPj0gMDsgaS0tKSB7Ci0JCWlmICh2cmVnX3NlcSkgewotCQkJaiA9IHZyZWdfc2VxW2ldOwotCQkJaWYgKGogPj0gbnVtX3ZyZWcpCi0JCQkJY29udGludWU7Ci0JCX0gZWxzZQotCQkJaiA9IGk7Ci0JCXJlZ3VsYXRvcl9kaXNhYmxlKHJlZ19wdHJbal0pOwotCQlpZiAoY2FtX3ZyZWdbal0uZGVsYXkgPiAyMCkKLQkJCW1zbGVlcChjYW1fdnJlZ1tqXS5kZWxheSk7Ci0JCWVsc2UgaWYgKGNhbV92cmVnW2pdLmRlbGF5KQotCQkJdXNsZWVwX3JhbmdlKGNhbV92cmVnW2pdLmRlbGF5ICogMTAwMCwKLQkJCQkoY2FtX3ZyZWdbal0uZGVsYXkgKiAxMDAwKSArIDEwMDApOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgY29uZmlnX2dwaW9fdGFibGUoc3RydWN0IG1zbV9jYW1lcmFfZ3Bpb19jb25mICpncGlvKQotewotCWludCByYyA9IDAsIGkgPSAwOwotCXVpbnQzMl90ICp0YWJsZV9vbjsKLQl1aW50MzJfdCAqdGFibGVfb2ZmOwotCXVpbnQzMl90IGxlbjsKLQotCXRhYmxlX29uID0gZ3Bpby0+Y2FtZXJhX29uX3RhYmxlOwotCXRhYmxlX29mZiA9IGdwaW8tPmNhbWVyYV9vZmZfdGFibGU7Ci0JbGVuID0gZ3Bpby0+Y2FtZXJhX29uX3RhYmxlX3NpemU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJcmMgPSBncGlvX3RsbW1fY29uZmlnKHRhYmxlX29uW2ldLCBHUElPX0NGR19FTkFCTEUpOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXMgbm90IGFibGUgdG8gZ2V0IGdwaW9cbiIsIF9fZnVuY19fKTsKLQkJCWZvciAoaS0tOyBpID49IDA7IGktLSkKLQkJCQlncGlvX3RsbW1fY29uZmlnKHRhYmxlX29mZltpXSwKLQkJCQkJR1BJT19DRkdfRU5BQkxFKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9jYW1lcmFfcmVxdWVzdF9ncGlvX3RhYmxlKHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzaW5mbywKLQlpbnQgZ3Bpb19lbikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX2dwaW9fY29uZiAqZ3Bpb19jb25mID0KLQkJc2luZm8tPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5ncGlvX2NvbmY7Ci0KLQlpZiAoIWdwaW9fY29uZi0+Z3Bpb19ub19tdXgpIHsKLQkJaWYgKGdwaW9fY29uZi0+Y2FtX2dwaW9fcmVxX3RibCA9PSBOVUxMIHx8Ci0JCQlncGlvX2NvbmYtPmNhbV9ncGlvX2NvbW1vbl90YmwgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogTlVMTCBjYW1lcmEgZ3BpbyB0YWJsZVxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0JaWYgKGdwaW9fY29uZi0+Z3Bpb19ub19tdXgpCi0JCWNvbmZpZ19ncGlvX3RhYmxlKGdwaW9fY29uZik7Ci0KLQlpZiAoZ3Bpb19lbikgewotCQlpZiAoIWdwaW9fY29uZi0+Z3Bpb19ub19tdXggJiYgIWdwaW9fcmVmX2NvdW50KSB7Ci0JCQlpZiAoZ3Bpb19jb25mLT5jYW1fZ3Bpb211eF9jb25mX3RibCAhPSBOVUxMKSB7Ci0JCQkJbXNtX2dwaW9tdXhfaW5zdGFsbCgKLQkJCQkJKHN0cnVjdCBtc21fZ3Bpb211eF9jb25maWcgKikKLQkJCQkJZ3Bpb19jb25mLT5jYW1fZ3Bpb211eF9jb25mX3RibCwKLQkJCQkJZ3Bpb19jb25mLT5jYW1fZ3Bpb211eF9jb25mX3RibF9zaXplKTsKLQkJCX0KLQkJCXJjID0gZ3Bpb19yZXF1ZXN0X2FycmF5KGdwaW9fY29uZi0+Y2FtX2dwaW9fY29tbW9uX3RibCwKLQkJCQlncGlvX2NvbmYtPmNhbV9ncGlvX2NvbW1vbl90Ymxfc2l6ZSk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlcyBjb21tb24gZ3BpbyByZXF1ZXN0IGZhaWxlZFxuIgotCQkJCQkJLCBfX2Z1bmNfXyk7Ci0JCQkJcmV0dXJuIHJjOwotCQkJfQotCQl9Ci0JCWdwaW9fcmVmX2NvdW50Kys7Ci0JCWlmIChncGlvX2NvbmYtPmNhbV9ncGlvX3JlcV90Ymxfc2l6ZSkgewotCQkJcmMgPSBncGlvX3JlcXVlc3RfYXJyYXkoZ3Bpb19jb25mLT5jYW1fZ3Bpb19yZXFfdGJsLAotCQkJCWdwaW9fY29uZi0+Y2FtX2dwaW9fcmVxX3RibF9zaXplKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzIGNhbWVyYSBncGlvIgotCQkJCQkicmVxdWVzdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCQlncGlvX2ZyZWVfYXJyYXkoZ3Bpb19jb25mLT5jYW1fZ3Bpb19jb21tb25fdGJsLAotCQkJCQlncGlvX2NvbmYtPmNhbV9ncGlvX2NvbW1vbl90Ymxfc2l6ZSk7Ci0JCQkJcmV0dXJuIHJjOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJZ3Bpb19yZWZfY291bnQtLTsKLQkJZ3Bpb19mcmVlX2FycmF5KGdwaW9fY29uZi0+Y2FtX2dwaW9fcmVxX3RibCwKLQkJCQlncGlvX2NvbmYtPmNhbV9ncGlvX3JlcV90Ymxfc2l6ZSk7Ci0JCWlmICghZ3Bpb19jb25mLT5ncGlvX25vX211eCAmJiAhZ3Bpb19yZWZfY291bnQpCi0JCQlncGlvX2ZyZWVfYXJyYXkoZ3Bpb19jb25mLT5jYW1fZ3Bpb19jb21tb25fdGJsLAotCQkJCWdwaW9fY29uZi0+Y2FtX2dwaW9fY29tbW9uX3RibF9zaXplKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2NhbWVyYV9jb25maWdfZ3Bpb190YWJsZShzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2luZm8sCi0JaW50IGdwaW9fZW4pCi17Ci0Jc3RydWN0IG1zbV9jYW1lcmFfZ3Bpb19jb25mICpncGlvX2NvbmYgPQotCQlzaW5mby0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmdwaW9fY29uZjsKLQlpbnQgcmMgPSAwLCBpOwotCi0JaWYgKGdwaW9fZW4pIHsKLQkJZm9yIChpID0gMDsgaSA8IGdwaW9fY29uZi0+Y2FtX2dwaW9fc2V0X3RibF9zaXplOyBpKyspIHsKLQkJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKAotCQkJCWdwaW9fY29uZi0+Y2FtX2dwaW9fc2V0X3RibFtpXS5ncGlvLAotCQkJCWdwaW9fY29uZi0+Y2FtX2dwaW9fc2V0X3RibFtpXS5mbGFncyk7Ci0JCQl1c2xlZXBfcmFuZ2UoZ3Bpb19jb25mLT5jYW1fZ3Bpb19zZXRfdGJsW2ldLmRlbGF5LAotCQkJCWdwaW9fY29uZi0+Y2FtX2dwaW9fc2V0X3RibFtpXS5kZWxheSArIDEwMDApOwotCQl9Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gZ3Bpb19jb25mLT5jYW1fZ3Bpb19zZXRfdGJsX3NpemUgLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKGdwaW9fY29uZi0+Y2FtX2dwaW9fc2V0X3RibFtpXS5mbGFncykKLQkJCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcCgKLQkJCQkJZ3Bpb19jb25mLT5jYW1fZ3Bpb19zZXRfdGJsW2ldLmdwaW8sCi0JCQkJCUdQSU9GX09VVF9JTklUX0xPVyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi12b2lkIG1zbV9jYW1lcmFfYnVzX3NjYWxlX2NmZyh1aW50MzJfdCBidXNfcGVyZl9jbGllbnQsCi0JCWVudW0gbXNtX2J1c19wZXJmX3NldHRpbmcgcGVyZl9zZXR0aW5nKQotewotCWludCByYyA9IDA7Ci0JaWYgKCFidXNfcGVyZl9jbGllbnQpIHsKLQkJcHJfZXJyKCIlczogQnVzIENsaWVudCBOT1QgUmVnaXN0ZXJlZCEhIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0Jc3dpdGNoIChwZXJmX3NldHRpbmcpIHsKLQljYXNlIFNfRVhJVDoKLQkJcmMgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdChidXNfcGVyZl9jbGllbnQsIDEpOwotCQltc21fYnVzX3NjYWxlX3VucmVnaXN0ZXJfY2xpZW50KGJ1c19wZXJmX2NsaWVudCk7Ci0JCWJyZWFrOwotCWNhc2UgU19QUkVWSUVXOgotCQlyYyA9IG1zbV9idXNfc2NhbGVfY2xpZW50X3VwZGF0ZV9yZXF1ZXN0KGJ1c19wZXJmX2NsaWVudCwgMSk7Ci0JCWJyZWFrOwotCWNhc2UgU19WSURFTzoKLQkJcmMgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdChidXNfcGVyZl9jbGllbnQsIDIpOwotCQlicmVhazsKLQljYXNlIFNfQ0FQVFVSRToKLQkJcmMgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdChidXNfcGVyZl9jbGllbnQsIDMpOwotCQlicmVhazsKLQljYXNlIFNfWlNMOgotCQlyYyA9IG1zbV9idXNfc2NhbGVfY2xpZW50X3VwZGF0ZV9yZXF1ZXN0KGJ1c19wZXJmX2NsaWVudCwgNCk7Ci0JCWJyZWFrOwotCWNhc2UgU19MSVZFU0hPVDoKLQkJcmMgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdChidXNfcGVyZl9jbGllbnQsIDUpOwotCQlicmVhazsKLQljYXNlIFNfREVGQVVMVDoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfd2FybmluZygiJXM6IElOVkFMSUQgQ0FTRVxuIiwgX19mdW5jX18pOwotCX0KLX0KLQotaW50IG1zbV9jYW1lcmFfaW5pdF9ncGlvX3RhYmxlKHN0cnVjdCBncGlvICpncGlvX3RibCwgdWludDhfdCBncGlvX3RibF9zaXplLAotCWludCBncGlvX2VuKQotewotCWludCByYyA9IDA7Ci0KLQlpZiAoZ3Bpb19lbikgewotCQlyYyA9IGdwaW9fcmVxdWVzdF9hcnJheShncGlvX3RibCwgZ3Bpb190Ymxfc2l6ZSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6JWQgZmFpbGVkXG4iICwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0gZWxzZSB7Ci0JCWdwaW9fZnJlZV9hcnJheShncGlvX3RibCwgZ3Bpb190Ymxfc2l6ZSk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9jYW1lcmFfc2V0X2dwaW9fdGFibGUoc3RydWN0IG1zbV9ncGlvX3NldF90YmwgKmdwaW9fdGJsLAotCXVpbnQ4X3QgZ3Bpb190Ymxfc2l6ZSwgaW50IGdwaW9fZW4pCi17Ci0JaW50IHJjID0gMCwgaTsKLQotCWlmIChncGlvX2VuKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBncGlvX3RibF9zaXplOyBpKyspIHsKLQkJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGdwaW9fdGJsW2ldLmdwaW8sCi0JCQkJZ3Bpb190YmxbaV0uZmxhZ3MpOwotCQkJdXNsZWVwX3JhbmdlKGdwaW9fdGJsW2ldLmRlbGF5LAotCQkJCWdwaW9fdGJsW2ldLmRlbGF5ICsgMTAwMCk7Ci0JCX0KLQl9IGVsc2UgewotCQlmb3IgKGkgPSBncGlvX3RibF9zaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChncGlvX3RibFtpXS5mbGFncykKLQkJCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChncGlvX3RibFtpXS5ncGlvLAotCQkJCQlHUElPRl9PVVRfSU5JVF9MT1cpOwotCQl9Ci0JfQotCXJldHVybiByYzsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9tc21faW83eC5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvL21zbV9pbzd4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZGFlYjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvL21zbV9pbzd4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWFjaC9jbGsuaD4KLQotI2RlZmluZSBDQU1JRl9DRkdfUk1TSyAweDFmZmZmZgotI2RlZmluZSBDQU1fU0VMX0JNU0sgMHgyCi0jZGVmaW5lIENBTV9QQ0xLX1NSQ19TRUxfQk1TSyAweDYwMDAwCi0jZGVmaW5lIENBTV9QQ0xLX0lOVkVSVF9CTVNLIDB4ODAwMDAKLSNkZWZpbmUgQ0FNX1BBRF9SRUdfU1dfUkVTRVRfQk1TSyAweDEwMDAwMAotCi0jZGVmaW5lIEVYVF9DQU1fSFNZTkNfUE9MX1NFTF9CTVNLIDB4MTAwMDAKLSNkZWZpbmUgRVhUX0NBTV9WU1lOQ19QT0xfU0VMX0JNU0sgMHg4MDAwCi0jZGVmaW5lIE1ERElfQ0xLX0NISUNLRU5fQklUX0JNU0sgIDB4ODAKLQotI2RlZmluZSBDQU1fU0VMX1NIRlQgMHgxCi0jZGVmaW5lIENBTV9QQ0xLX1NSQ19TRUxfU0hGVCAweDExCi0jZGVmaW5lIENBTV9QQ0xLX0lOVkVSVF9TSEZUIDB4MTMKLSNkZWZpbmUgQ0FNX1BBRF9SRUdfU1dfUkVTRVRfU0hGVCAweDE0Ci0KLSNkZWZpbmUgRVhUX0NBTV9IU1lOQ19QT0xfU0VMX1NIRlQgMHgxMAotI2RlZmluZSBFWFRfQ0FNX1ZTWU5DX1BPTF9TRUxfU0hGVCAweEYKLSNkZWZpbmUgTURESV9DTEtfQ0hJQ0tFTl9CSVRfU0hGVCAgMHg3Ci0jZGVmaW5lIEFQUFNfUkVTRVRfT0ZGU0VUIDB4MDAwMDAyMTAKLQotc3RhdGljIHN0cnVjdCBjbGsgKmNhbWlvX3ZmZV9tZGNfY2xrOwotc3RhdGljIHN0cnVjdCBjbGsgKmNhbWlvX21kY19jbGs7Ci1zdGF0aWMgc3RydWN0IGNsayAqY2FtaW9fdmZlX2NsazsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2lvX2V4dCBjYW1pb19leHQ7Ci1zdGF0aWMgc3RydWN0IHJlc291cmNlICphcHBpbywgKm1kY2lvOwotdm9pZCBfX2lvbWVtICphcHBiYXNlLCAqbWRjYmFzZTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqYXBwaW8sICptZGNpbzsKLXZvaWQgX19pb21lbSAqYXBwYmFzZSwgKm1kY2Jhc2U7Ci0KLWludCBtc21fY2FtaW9fY2xrX2VuYWJsZShlbnVtIG1zbV9jYW1pb19jbGtfdHlwZSBjbGt0eXBlKQotewotCWludCByYyA9IC0xOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7Ci0KLQlzd2l0Y2ggKGNsa3R5cGUpIHsKLQljYXNlIENBTUlPX1ZGRV9NRENfQ0xLOgotCQljbGsgPSBjYW1pb192ZmVfbWRjX2NsayA9IGNsa19nZXQoTlVMTCwgInZmZV9tZGNfY2xrIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19NRENfQ0xLOgotCQljbGsgPSBjYW1pb19tZGNfY2xrID0gY2xrX2dldChOVUxMLCAibWRjX2NsayIpOwotCQlicmVhazsKLQotCWNhc2UgQ0FNSU9fVkZFX0NMSzoKLQkJY2xrID0gY2FtaW9fdmZlX2NsayA9IGNsa19nZXQoTlVMTCwgInZmZV9jbGsiKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlpZiAoIUlTX0VSUihjbGspKSB7Ci0JCWNsa19lbmFibGUoY2xrKTsKLQkJcmMgPSAwOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9jYW1pb19jbGtfZGlzYWJsZShlbnVtIG1zbV9jYW1pb19jbGtfdHlwZSBjbGt0eXBlKQotewotCWludCByYyA9IC0xOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7Ci0KLQlzd2l0Y2ggKGNsa3R5cGUpIHsKLQljYXNlIENBTUlPX1ZGRV9NRENfQ0xLOgotCQljbGsgPSBjYW1pb192ZmVfbWRjX2NsazsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX01EQ19DTEs6Ci0JCWNsayA9IGNhbWlvX21kY19jbGs7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19WRkVfQ0xLOgotCQljbGsgPSBjYW1pb192ZmVfY2xrOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmICghSVNfRVJSKGNsaykpIHsKLQkJY2xrX2Rpc2FibGUoY2xrKTsKLQkJY2xrX3B1dChjbGspOwotCQlyYyA9IDA7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi12b2lkIG1zbV9jYW1pb19jbGtfcmF0ZV9zZXQoaW50IHJhdGUpCi17Ci0Jc3RydWN0IGNsayAqY2xrID0gY2FtaW9fdmZlX2NsazsKLQotCWlmIChjbGsgIT0gRVJSX1BUUigtRU5PRU5UKSkKLQkJY2xrX3NldF9yYXRlKGNsaywgcmF0ZSk7Ci19Ci0KLWludCBtc21fY2FtaW9fZW5hYmxlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2luZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9kZXZpY2VfcGxhdGZvcm1fZGF0YSAqY2FtZGV2ID0gc2luZm8tPnBkYXRhOwotCi0JY2FtaW9fZXh0ID0gY2FtZGV2LT5pb2V4dDsKLQotCWFwcGlvID0gcmVxdWVzdF9tZW1fcmVnaW9uKGNhbWlvX2V4dC5hcHBwaHksCi0JCWNhbWlvX2V4dC5hcHBzeiwgcGRldi0+bmFtZSk7Ci0JaWYgKCFhcHBpbykgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBlbmFibGVfZmFpbDsKLQl9Ci0KLQlhcHBiYXNlID0gaW9yZW1hcChjYW1pb19leHQuYXBwcGh5LAotCQljYW1pb19leHQuYXBwc3opOwotCWlmICghYXBwYmFzZSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gYXBwc19ub19tZW07Ci0JfQotCi0JbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fVkZFX0NMSyk7Ci0JbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fTURDX0NMSyk7Ci0JcmV0dXJuIDA7Ci1hcHBzX25vX21lbToKLQlyZWxlYXNlX21lbV9yZWdpb24oY2FtaW9fZXh0LmFwcHBoeSwgY2FtaW9fZXh0LmFwcHN6KTsKLWVuYWJsZV9mYWlsOgotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9jYW1pb19zZW5zb3JfY2xrX29uKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNpbmZvID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfZGV2aWNlX3BsYXRmb3JtX2RhdGEgKmNhbWRldiA9IHNpbmZvLT5wZGF0YTsKLQlpbnQzMl90IHJjID0gMDsKLQljYW1pb19leHQgPSBjYW1kZXYtPmlvZXh0OwotCW1kY2lvID0gcmVxdWVzdF9tZW1fcmVnaW9uKGNhbWlvX2V4dC5tZGNwaHksCi0JCWNhbWlvX2V4dC5tZGNzeiwgcGRldi0+bmFtZSk7Ci0JaWYgKCFtZGNpbykKLQkJcmMgPSAtRUJVU1k7Ci0JbWRjYmFzZSA9IGlvcmVtYXAoY2FtaW9fZXh0Lm1kY3BoeSwKLQkJY2FtaW9fZXh0Lm1kY3N6KTsKLQlpZiAoIW1kY2Jhc2UpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG1kY19ub19tZW07Ci0JfQotCWNhbWRldi0+Y2FtZXJhX2dwaW9fb24oKTsKLQlyZXR1cm4gbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fVkZFX01EQ19DTEspOwotCi1tZGNfbm9fbWVtOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihjYW1pb19leHQubWRjcGh5LCBjYW1pb19leHQubWRjc3opOwotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9jYW1pb19zZW5zb3JfY2xrX29mZihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBtc21fY2FtZXJhX2RldmljZV9wbGF0Zm9ybV9kYXRhICpjYW1kZXYgPSBzaW5mby0+cGRhdGE7Ci0JY2FtZGV2LT5jYW1lcmFfZ3Bpb19vZmYoKTsKLQlpb3VubWFwKG1kY2Jhc2UpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihjYW1pb19leHQubWRjcGh5LCBjYW1pb19leHQubWRjc3opOwotCXJldHVybiBtc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fVkZFX01EQ19DTEspOwotfQotCi12b2lkIG1zbV9jYW1pb19kaXNhYmxlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW91bm1hcChhcHBiYXNlKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oY2FtaW9fZXh0LmFwcHBoeSwgY2FtaW9fZXh0LmFwcHN6KTsKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fVkZFX0NMSyk7Ci0JbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX01EQ19DTEspOwotfQotCi12b2lkIG1zbV9kaXNhYmxlX2lvX2dwaW9fY2xrKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuOwotfQotCi12b2lkIG1zbV9jYW1pb19jYW1pZl9wYWRfcmVnX3Jlc2V0KHZvaWQpCi17Ci0JdWludDMyX3QgcmVnOwotCXVpbnQzMl90IG1hc2ssIHZhbHVlOwotCi0JLyogc2VsZWN0IENMS1JHTV9WRkVfU1JDX0NBTV9WRkVfU1JDOiAgaW50ZXJuYWwgc291cmNlICovCi0JbXNtX2NhbWlvX2Nsa19zZWwoTVNNX0NBTUlPX0NMS19TUkNfSU5URVJOQUwpOwotCi0JcmVnID0gKG1zbV9jYW1lcmFfaW9fcl9tYihtZGNiYXNlKSkgJiBDQU1JRl9DRkdfUk1TSzsKLQotCW1hc2sgPSBDQU1fU0VMX0JNU0sgfAotCQlDQU1fUENMS19TUkNfU0VMX0JNU0sgfAotCQlDQU1fUENMS19JTlZFUlRfQk1TSzsKLQotCXZhbHVlID0gMSA8PCBDQU1fU0VMX1NIRlQgfAotCQkzIDw8IENBTV9QQ0xLX1NSQ19TRUxfU0hGVCB8Ci0JCTAgPDwgQ0FNX1BDTEtfSU5WRVJUX1NIRlQ7Ci0KLQltc21fY2FtZXJhX2lvX3dfbWIoKHJlZyAmICh+bWFzaykpIHwgKHZhbHVlICYgbWFzayksIG1kY2Jhc2UpOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotCi0JcmVnID0gKG1zbV9jYW1lcmFfaW9fcl9tYihtZGNiYXNlKSkgJiBDQU1JRl9DRkdfUk1TSzsKLQltYXNrID0gQ0FNX1BBRF9SRUdfU1dfUkVTRVRfQk1TSzsKLQl2YWx1ZSA9IDEgPDwgQ0FNX1BBRF9SRUdfU1dfUkVTRVRfU0hGVDsKLQltc21fY2FtZXJhX2lvX3dfbWIoKHJlZyAmICh+bWFzaykpIHwgKHZhbHVlICYgbWFzayksIG1kY2Jhc2UpOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotCi0JcmVnID0gKG1zbV9jYW1lcmFfaW9fcl9tYihtZGNiYXNlKSkgJiBDQU1JRl9DRkdfUk1TSzsKLQltYXNrID0gQ0FNX1BBRF9SRUdfU1dfUkVTRVRfQk1TSzsKLQl2YWx1ZSA9IDAgPDwgQ0FNX1BBRF9SRUdfU1dfUkVTRVRfU0hGVDsKLQltc21fY2FtZXJhX2lvX3dfbWIoKHJlZyAmICh+bWFzaykpIHwgKHZhbHVlICYgbWFzayksIG1kY2Jhc2UpOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotCi0JbXNtX2NhbWlvX2Nsa19zZWwoTVNNX0NBTUlPX0NMS19TUkNfRVhURVJOQUwpOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotfQotCi12b2lkIG1zbV9jYW1pb192ZmVfYmxrX3Jlc2V0KHZvaWQpCi17Ci0JdWludDMyX3QgdmFsOwotCi0JLyogZG8gYXBwcyByZXNldCAqLwotCXZhbCA9IG1zbV9jYW1lcmFfaW9fcl9tYihhcHBiYXNlICsgMHgwMDAwMDIxMCk7Ci0JdmFsIHw9IDB4MTsKLQltc21fY2FtZXJhX2lvX3dfbWIodmFsLCBhcHBiYXNlICsgMHgwMDAwMDIxMCk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7Ci0KLQl2YWwgPSBtc21fY2FtZXJhX2lvX3JfbWIoYXBwYmFzZSArIDB4MDAwMDAyMTApOwotCXZhbCAmPSB+MHgxOwotCW1zbV9jYW1lcmFfaW9fd19tYih2YWwsIGFwcGJhc2UgKyAweDAwMDAwMjEwKTsKLQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKLQotCS8qIGRvIGF4aSByZXNldCAqLwotCXZhbCA9IG1zbV9jYW1lcmFfaW9fcl9tYihhcHBiYXNlICsgMHgwMDAwMDIwOCk7Ci0JdmFsIHw9IDB4MTsKLQltc21fY2FtZXJhX2lvX3dfbWIodmFsLCBhcHBiYXNlICsgMHgwMDAwMDIwOCk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7Ci0KLQl2YWwgPSBtc21fY2FtZXJhX2lvX3JfbWIoYXBwYmFzZSArIDB4MDAwMDAyMDgpOwotCXZhbCAmPSB+MHgxOwotCW1zbV9jYW1lcmFfaW9fd19tYih2YWwsIGFwcGJhc2UgKyAweDAwMDAwMjA4KTsKLQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKLX0KLQotdm9pZCBtc21fY2FtaW9fY2FtaWZfcGFkX3JlZ19yZXNldF8yKHZvaWQpCi17Ci0JdWludDMyX3QgcmVnOwotCXVpbnQzMl90IG1hc2ssIHZhbHVlOwotCi0JcmVnID0gKG1zbV9jYW1lcmFfaW9fcl9tYihtZGNiYXNlKSkgJiBDQU1JRl9DRkdfUk1TSzsKLQltYXNrID0gQ0FNX1BBRF9SRUdfU1dfUkVTRVRfQk1TSzsKLQl2YWx1ZSA9IDEgPDwgQ0FNX1BBRF9SRUdfU1dfUkVTRVRfU0hGVDsKLQltc21fY2FtZXJhX2lvX3dfbWIoKHJlZyAmICh+bWFzaykpIHwgKHZhbHVlICYgbWFzayksIG1kY2Jhc2UpOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotCi0JcmVnID0gKG1zbV9jYW1lcmFfaW9fcl9tYihtZGNiYXNlKSkgJiBDQU1JRl9DRkdfUk1TSzsKLQltYXNrID0gQ0FNX1BBRF9SRUdfU1dfUkVTRVRfQk1TSzsKLQl2YWx1ZSA9IDAgPDwgQ0FNX1BBRF9SRUdfU1dfUkVTRVRfU0hGVDsKLQltc21fY2FtZXJhX2lvX3dfbWIoKHJlZyAmICh+bWFzaykpIHwgKHZhbHVlICYgbWFzayksIG1kY2Jhc2UpOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotfQotCi12b2lkIG1zbV9jYW1pb19jbGtfc2VsKGVudW0gbXNtX2NhbWlvX2Nsa19zcmNfdHlwZSBzcmN0eXBlKQotewotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7Ci0KLQljbGsgPSBjYW1pb192ZmVfY2xrOwotCi0JaWYgKGNsayAhPSBOVUxMICYmIGNsayAhPSBFUlJfUFRSKC1FTk9FTlQpKSB7Ci0JCXN3aXRjaCAoc3JjdHlwZSkgewotCQljYXNlIE1TTV9DQU1JT19DTEtfU1JDX0lOVEVSTkFMOgotCQkJY2xrX3NldF9mbGFncyhjbGssIDB4MDAwMDAxMDAgPDwgMSk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1TTV9DQU1JT19DTEtfU1JDX0VYVEVSTkFMOgotCQkJY2xrX3NldF9mbGFncyhjbGssIDB4MDAwMDAxMDApOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi1pbnQgbXNtX2NhbWlvX3Byb2JlX29uKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNpbmZvID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfZGV2aWNlX3BsYXRmb3JtX2RhdGEgKmNhbWRldiA9IHNpbmZvLT5wZGF0YTsKLQljYW1kZXYtPmNhbWVyYV9ncGlvX29uKCk7Ci0JcmV0dXJuIG1zbV9jYW1pb19jbGtfZW5hYmxlKENBTUlPX1ZGRV9DTEspOwotfQotCi1pbnQgbXNtX2NhbWlvX3Byb2JlX29mZihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBtc21fY2FtZXJhX2RldmljZV9wbGF0Zm9ybV9kYXRhICpjYW1kZXYgPSBzaW5mby0+cGRhdGE7Ci0JY2FtZGV2LT5jYW1lcmFfZ3Bpb19vZmYoKTsKLQlyZXR1cm4gbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX1ZGRV9DTEspOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvL21zbV9pbzh4LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW8vbXNtX2lvOHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhOTNhMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW8vbXNtX2lvOHguYworKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2Nsay5oPgotCi0jZGVmaW5lIENBTUlGX0NGR19STVNLIDB4MWZmZmZmCi0jZGVmaW5lIENBTV9TRUxfQk1TSyAweDIKLSNkZWZpbmUgQ0FNX1BDTEtfU1JDX1NFTF9CTVNLIDB4NjAwMDAKLSNkZWZpbmUgQ0FNX1BDTEtfSU5WRVJUX0JNU0sgMHg4MDAwMAotI2RlZmluZSBDQU1fUEFEX1JFR19TV19SRVNFVF9CTVNLIDB4MTAwMDAwCi0KLSNkZWZpbmUgRVhUX0NBTV9IU1lOQ19QT0xfU0VMX0JNU0sgMHgxMDAwMAotI2RlZmluZSBFWFRfQ0FNX1ZTWU5DX1BPTF9TRUxfQk1TSyAweDgwMDAKLSNkZWZpbmUgTURESV9DTEtfQ0hJQ0tFTl9CSVRfQk1TSyAgMHg4MAotCi0jZGVmaW5lIENBTV9TRUxfU0hGVCAweDEKLSNkZWZpbmUgQ0FNX1BDTEtfU1JDX1NFTF9TSEZUIDB4MTEKLSNkZWZpbmUgQ0FNX1BDTEtfSU5WRVJUX1NIRlQgMHgxMwotI2RlZmluZSBDQU1fUEFEX1JFR19TV19SRVNFVF9TSEZUIDB4MTQKLQotI2RlZmluZSBFWFRfQ0FNX0hTWU5DX1BPTF9TRUxfU0hGVCAweDEwCi0jZGVmaW5lIEVYVF9DQU1fVlNZTkNfUE9MX1NFTF9TSEZUIDB4RgotI2RlZmluZSBNRERJX0NMS19DSElDS0VOX0JJVF9TSEZUICAweDcKLSNkZWZpbmUgQVBQU19SRVNFVF9PRkZTRVQgMHgwMDAwMDIxNAotCi1zdGF0aWMgc3RydWN0IGNsayAqY2FtaW9fdmZlX21kY19jbGs7Ci1zdGF0aWMgc3RydWN0IGNsayAqY2FtaW9fbWRjX2NsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpjYW1pb192ZmVfY2xrOwotc3RhdGljIHN0cnVjdCBjbGsgKmNhbWlvX3ZmZV9heGlfY2xrOwotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2lvX2V4dCBjYW1pb19leHQ7Ci1zdGF0aWMgc3RydWN0IHJlc291cmNlICphcHBpbywgKm1kY2lvOwotCi12b2lkIF9faW9tZW0gKmFwcGJhc2UsICptZGNiYXNlOwotCi0KLWludCBtc21fY2FtaW9fY2xrX2VuYWJsZShlbnVtIG1zbV9jYW1pb19jbGtfdHlwZSBjbGt0eXBlKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKLQotCXN3aXRjaCAoY2xrdHlwZSkgewotCWNhc2UgQ0FNSU9fVkZFX01EQ19DTEs6Ci0JCWNhbWlvX3ZmZV9tZGNfY2xrID0gY2xrID0gY2xrX2dldChOVUxMLCAidmZlX21kY19jbGsiKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX01EQ19DTEs6Ci0JCWNhbWlvX21kY19jbGsgPSBjbGsgPSBjbGtfZ2V0KE5VTEwsICJtZGNfY2xrIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19WRkVfQ0xLOgotCQljYW1pb192ZmVfY2xrID0gY2xrID0gY2xrX2dldChOVUxMLCAidmZlX2NsayIpOwotCQlicmVhazsKLQotCWNhc2UgQ0FNSU9fVkZFX0FYSV9DTEs6Ci0JCWNhbWlvX3ZmZV9heGlfY2xrID0gY2xrID0gY2xrX2dldChOVUxMLCAidmZlX2F4aV9jbGsiKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlpZiAoIUlTX0VSUihjbGspKQotCQljbGtfZW5hYmxlKGNsayk7Ci0JZWxzZQotCQlyYyA9IC0xOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2NhbWlvX2Nsa19kaXNhYmxlKGVudW0gbXNtX2NhbWlvX2Nsa190eXBlIGNsa3R5cGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwotCi0Jc3dpdGNoIChjbGt0eXBlKSB7Ci0JY2FzZSBDQU1JT19WRkVfTURDX0NMSzoKLQkJY2xrID0gY2FtaW9fdmZlX21kY19jbGs7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19NRENfQ0xLOgotCQljbGsgPSBjYW1pb19tZGNfY2xrOwotCQlicmVhazsKLQotCWNhc2UgQ0FNSU9fVkZFX0NMSzoKLQkJY2xrID0gY2FtaW9fdmZlX2NsazsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX1ZGRV9BWElfQ0xLOgotCQljbGsgPSBjYW1pb192ZmVfYXhpX2NsazsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlpZiAoIUlTX0VSUihjbGspKSB7Ci0JCWNsa19kaXNhYmxlKGNsayk7Ci0JCWNsa19wdXQoY2xrKTsKLQl9IGVsc2UKLQkJcmMgPSAtMTsKLQotCXJldHVybiByYzsKLX0KLQotdm9pZCBtc21fY2FtaW9fY2xrX3JhdGVfc2V0KGludCByYXRlKQotewotCXN0cnVjdCBjbGsgKmNsayA9IGNhbWlvX3ZmZV9tZGNfY2xrOwotCi0JLyogVE9ETzogY2hlY2sgcmV0dXJuICovCi0JY2xrX3NldF9yYXRlKGNsaywgcmF0ZSk7Ci19Ci0KLWludCBtc21fY2FtaW9fZW5hYmxlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjID0gMDsKLQotCWFwcGlvID0gcmVxdWVzdF9tZW1fcmVnaW9uKGNhbWlvX2V4dC5hcHBwaHksCi0JCWNhbWlvX2V4dC5hcHBzeiwgcGRldi0+bmFtZSk7Ci0JaWYgKCFhcHBpbykgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBlbmFibGVfZmFpbDsKLQl9Ci0KLQlhcHBiYXNlID0gaW9yZW1hcChjYW1pb19leHQuYXBwcGh5LCBjYW1pb19leHQuYXBwc3opOwotCWlmICghYXBwYmFzZSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gYXBwc19ub19tZW07Ci0JfQotCW1zbV9jYW1pb19jbGtfZW5hYmxlKENBTUlPX01EQ19DTEspOwotCW1zbV9jYW1pb19jbGtfZW5hYmxlKENBTUlPX1ZGRV9BWElfQ0xLKTsKLQlyZXR1cm4gMDsKLQotYXBwc19ub19tZW06Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGNhbWlvX2V4dC5hcHBwaHksIGNhbWlvX2V4dC5hcHBzeik7Ci1lbmFibGVfZmFpbDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXZvaWQgbXNtX2NhbWlvX2Rpc2FibGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpb3VubWFwKGFwcGJhc2UpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihjYW1pb19leHQuYXBwcGh5LCBjYW1pb19leHQuYXBwc3opOwotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19NRENfQ0xLKTsKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fVkZFX0FYSV9DTEspOwotfQotCi1pbnQgbXNtX2NhbWlvX3NlbnNvcl9jbGtfb24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBtc21fY2FtZXJhX2RldmljZV9wbGF0Zm9ybV9kYXRhICpjYW1kZXYgPSBzaW5mby0+cGRhdGE7Ci0JaW50MzJfdCByYyA9IDA7Ci0JY2FtaW9fZXh0ID0gY2FtZGV2LT5pb2V4dDsKLQotCW1kY2lvID0gcmVxdWVzdF9tZW1fcmVnaW9uKGNhbWlvX2V4dC5tZGNwaHksCi0JCWNhbWlvX2V4dC5tZGNzeiwgcGRldi0+bmFtZSk7Ci0JaWYgKCFtZGNpbykKLQkJcmMgPSAtRUJVU1k7Ci0JbWRjYmFzZSA9IGlvcmVtYXAoY2FtaW9fZXh0Lm1kY3BoeSwKLQkJY2FtaW9fZXh0Lm1kY3N6KTsKLQlpZiAoIW1kY2Jhc2UpCi0JCWdvdG8gbWRjX25vX21lbTsKLQljYW1kZXYtPmNhbWVyYV9ncGlvX29uKCk7Ci0KLQltc21fY2FtaW9fY2xrX2VuYWJsZShDQU1JT19WRkVfQ0xLKTsKLQltc21fY2FtaW9fY2xrX2VuYWJsZShDQU1JT19WRkVfTURDX0NMSyk7Ci0JcmV0dXJuIHJjOwotCi0KLW1kY19ub19tZW06Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGNhbWlvX2V4dC5tZGNwaHksIGNhbWlvX2V4dC5tZGNzeik7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLWludCBtc21fY2FtaW9fc2Vuc29yX2Nsa19vZmYoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2luZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9kZXZpY2VfcGxhdGZvcm1fZGF0YSAqY2FtZGV2ID0gc2luZm8tPnBkYXRhOwotCWNhbWRldi0+Y2FtZXJhX2dwaW9fb2ZmKCk7Ci0JaW91bm1hcChtZGNiYXNlKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oY2FtaW9fZXh0Lm1kY3BoeSwgY2FtaW9fZXh0Lm1kY3N6KTsKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fVkZFX0NMSyk7Ci0JcmV0dXJuIG1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19WRkVfTURDX0NMSyk7Ci0KLX0KLQotdm9pZCBtc21fZGlzYWJsZV9pb19ncGlvX2NsayhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybjsKLX0KLQotdm9pZCBtc21fY2FtaW9fY2FtaWZfcGFkX3JlZ19yZXNldCh2b2lkKQotewotCXVpbnQzMl90IHJlZzsKLQl1aW50MzJfdCBtYXNrLCB2YWx1ZTsKLQotCS8qIHNlbGVjdCBDTEtSR01fVkZFX1NSQ19DQU1fVkZFX1NSQzogIGludGVybmFsIHNvdXJjZSAqLwotCW1zbV9jYW1pb19jbGtfc2VsKE1TTV9DQU1JT19DTEtfU1JDX0lOVEVSTkFMKTsKLQotCXJlZyA9IChtc21fY2FtZXJhX2lvX3JfbWIobWRjYmFzZSkpICYgQ0FNSUZfQ0ZHX1JNU0s7Ci0KLQltYXNrID0gQ0FNX1NFTF9CTVNLIHwKLQkJQ0FNX1BDTEtfU1JDX1NFTF9CTVNLIHwKLQkJQ0FNX1BDTEtfSU5WRVJUX0JNU0sgfAotCQlFWFRfQ0FNX0hTWU5DX1BPTF9TRUxfQk1TSyB8Ci0JICAgIEVYVF9DQU1fVlNZTkNfUE9MX1NFTF9CTVNLIHwgTURESV9DTEtfQ0hJQ0tFTl9CSVRfQk1TSzsKLQotCXZhbHVlID0gMSA8PCBDQU1fU0VMX1NIRlQgfAotCQkzIDw8IENBTV9QQ0xLX1NSQ19TRUxfU0hGVCB8Ci0JCTAgPDwgQ0FNX1BDTEtfSU5WRVJUX1NIRlQgfAotCQkwIDw8IEVYVF9DQU1fSFNZTkNfUE9MX1NFTF9TSEZUIHwKLQkgICAgMCA8PCBFWFRfQ0FNX1ZTWU5DX1BPTF9TRUxfU0hGVCB8IDAgPDwgTURESV9DTEtfQ0hJQ0tFTl9CSVRfU0hGVDsKLQltc21fY2FtZXJhX2lvX3dfbWIoKHJlZyAmICh+bWFzaykpIHwgKHZhbHVlICYgbWFzayksIG1kY2Jhc2UpOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotCi0JcmVnID0gKG1zbV9jYW1lcmFfaW9fcl9tYihtZGNiYXNlKSkgJiBDQU1JRl9DRkdfUk1TSzsKLQltYXNrID0gQ0FNX1BBRF9SRUdfU1dfUkVTRVRfQk1TSzsKLQl2YWx1ZSA9IDEgPDwgQ0FNX1BBRF9SRUdfU1dfUkVTRVRfU0hGVDsKLQltc21fY2FtZXJhX2lvX3dfbWIoKHJlZyAmICh+bWFzaykpIHwgKHZhbHVlICYgbWFzayksIG1kY2Jhc2UpOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotCi0JcmVnID0gKG1zbV9jYW1lcmFfaW9fcl9tYihtZGNiYXNlKSkgJiBDQU1JRl9DRkdfUk1TSzsKLQltYXNrID0gQ0FNX1BBRF9SRUdfU1dfUkVTRVRfQk1TSzsKLQl2YWx1ZSA9IDAgPDwgQ0FNX1BBRF9SRUdfU1dfUkVTRVRfU0hGVDsKLQltc21fY2FtZXJhX2lvX3dfbWIoKHJlZyAmICh+bWFzaykpIHwgKHZhbHVlICYgbWFzayksIG1kY2Jhc2UpOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotCi0JbXNtX2NhbWlvX2Nsa19zZWwoTVNNX0NBTUlPX0NMS19TUkNfRVhURVJOQUwpOwotCi0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7Ci0KLQkvKiB0b2RvOiBjaGVjayByZXR1cm4gKi8KLQlpZiAoY2FtaW9fdmZlX2NsaykKLQkJY2xrX3NldF9yYXRlKGNhbWlvX3ZmZV9jbGssIDk2MDAwMDAwKTsKLX0KLQotdm9pZCBtc21fY2FtaW9fdmZlX2Jsa19yZXNldCh2b2lkKQotewotCXVpbnQzMl90IHZhbDsKLQotCXZhbCA9IG1zbV9jYW1lcmFfaW9fcl9tYihhcHBiYXNlICsgQVBQU19SRVNFVF9PRkZTRVQpOwotCXZhbCB8PSAweDE7Ci0JbXNtX2NhbWVyYV9pb193X21iKHZhbCwgYXBwYmFzZSArIEFQUFNfUkVTRVRfT0ZGU0VUKTsKLQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKLQotCXZhbCA9IG1zbV9jYW1lcmFfaW9fcl9tYihhcHBiYXNlICsgQVBQU19SRVNFVF9PRkZTRVQpOwotCXZhbCAmPSB+MHgxOwotCW1zbV9jYW1lcmFfaW9fd19tYih2YWwsIGFwcGJhc2UgKyBBUFBTX1JFU0VUX09GRlNFVCk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7Ci19Ci0KLXZvaWQgbXNtX2NhbWlvX2NhbWlmX3BhZF9yZWdfcmVzZXRfMih2b2lkKQotewotCXVpbnQzMl90IHJlZzsKLQl1aW50MzJfdCBtYXNrLCB2YWx1ZTsKLQotCXJlZyA9IChtc21fY2FtZXJhX2lvX3JfbWIobWRjYmFzZSkpICYgQ0FNSUZfQ0ZHX1JNU0s7Ci0JbWFzayA9IENBTV9QQURfUkVHX1NXX1JFU0VUX0JNU0s7Ci0JdmFsdWUgPSAxIDw8IENBTV9QQURfUkVHX1NXX1JFU0VUX1NIRlQ7Ci0JbXNtX2NhbWVyYV9pb193X21iKChyZWcgJiAofm1hc2spKSB8ICh2YWx1ZSAmIG1hc2spLCBtZGNiYXNlKTsKLQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKLQotCXJlZyA9IChtc21fY2FtZXJhX2lvX3JfbWIobWRjYmFzZSkpICYgQ0FNSUZfQ0ZHX1JNU0s7Ci0JbWFzayA9IENBTV9QQURfUkVHX1NXX1JFU0VUX0JNU0s7Ci0JdmFsdWUgPSAwIDw8IENBTV9QQURfUkVHX1NXX1JFU0VUX1NIRlQ7Ci0JbXNtX2NhbWVyYV9pb193X21iKChyZWcgJiAofm1hc2spKSB8ICh2YWx1ZSAmIG1hc2spLCBtZGNiYXNlKTsKLQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKLX0KLQotdm9pZCBtc21fY2FtaW9fY2xrX3NlbChlbnVtIG1zbV9jYW1pb19jbGtfc3JjX3R5cGUgc3JjdHlwZSkKLXsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwotCi0JY2xrID0gY2FtaW9fdmZlX2NsazsKLQotCWlmIChjbGsgIT0gTlVMTCkgewotCQlzd2l0Y2ggKHNyY3R5cGUpIHsKLQkJY2FzZSBNU01fQ0FNSU9fQ0xLX1NSQ19JTlRFUk5BTDoKLQkJCWNsa19zZXRfZmxhZ3MoY2xrLCAweDAwMDAwMTAwIDw8IDEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNU01fQ0FNSU9fQ0xLX1NSQ19FWFRFUk5BTDoKLQkJCWNsa19zZXRfZmxhZ3MoY2xrLCAweDAwMDAwMTAwKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotdm9pZCBtc21fY2FtaW9fY2xrX2F4aV9yYXRlX3NldChpbnQgcmF0ZSkKLXsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBjYW1pb192ZmVfYXhpX2NsazsKLQkvKiB0b2RvOiBjaGVjayByZXR1cm4gKi8KLQljbGtfc2V0X3JhdGUoY2xrLCByYXRlKTsKLX0KLQotaW50IG1zbV9jYW1pb19wcm9iZV9vbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBtc21fY2FtZXJhX2RldmljZV9wbGF0Zm9ybV9kYXRhICpjYW1kZXYgPSBzaW5mby0+cGRhdGE7Ci0KLQljYW1kZXYtPmNhbWVyYV9ncGlvX29uKCk7Ci0JcmV0dXJuIG1zbV9jYW1pb19jbGtfZW5hYmxlKENBTUlPX1ZGRV9NRENfQ0xLKTsKLX0KLQotaW50IG1zbV9jYW1pb19wcm9iZV9vZmYoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2luZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9kZXZpY2VfcGxhdGZvcm1fZGF0YSAqY2FtZGV2ID0gc2luZm8tPnBkYXRhOwotCi0JY2FtZGV2LT5jYW1lcmFfZ3Bpb19vZmYoKTsKLQlyZXR1cm4gbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX1ZGRV9NRENfQ0xLKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9tc21faW9fN3gyN2EuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9tc21faW9fN3gyN2EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3MGQzNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW8vbXNtX2lvXzd4MjdhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9xb3MuaD4KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgPG1hY2gvY2xrLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fYnVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fYnVzX2JvYXJkLmg+Ci0KLQotLyogTUlQSQlDU0kgY29udHJvbGxlciByZWdpc3RlcnMgKi8KLSNkZWZpbmUJTUlQSV9QSFlfQ09OVFJPTAkJMHgwMDAwMDAwMAotI2RlZmluZQlNSVBJX1BST1RPQ09MX0NPTlRST0wJCTB4MDAwMDAwMDQKLSNkZWZpbmUJTUlQSV9JTlRFUlJVUFRfU1RBVFVTCQkweDAwMDAwMDA4Ci0jZGVmaW5lCU1JUElfSU5URVJSVVBUX01BU0sJCTB4MDAwMDAwMEMKLSNkZWZpbmUJTUlQSV9DQU1FUkFfQ05UTAkJMHgwMDAwMDAyNAotI2RlZmluZQlNSVBJX0NBTElCUkFUSU9OX0NPTlRST0wJMHgwMDAwMDAxOAotI2RlZmluZQlNSVBJX1BIWV9EMF9DT05UUk9MMgkJMHgwMDAwMDAzOAotI2RlZmluZQlNSVBJX1BIWV9EMV9DT05UUk9MMgkJMHgwMDAwMDAzQwotI2RlZmluZQlNSVBJX1BIWV9EMl9DT05UUk9MMgkJMHgwMDAwMDA0MAotI2RlZmluZQlNSVBJX1BIWV9EM19DT05UUk9MMgkJMHgwMDAwMDA0NAotI2RlZmluZQlNSVBJX1BIWV9DTF9DT05UUk9MCQkweDAwMDAwMDQ4Ci0jZGVmaW5lCU1JUElfUEhZX0QwX0NPTlRST0wJCTB4MDAwMDAwMzQKLSNkZWZpbmUJTUlQSV9QSFlfRDFfQ09OVFJPTAkJMHgwMDAwMDAyMAotI2RlZmluZQlNSVBJX1BIWV9EMl9DT05UUk9MCQkweDAwMDAwMDJDCi0jZGVmaW5lCU1JUElfUEhZX0QzX0NPTlRST0wJCTB4MDAwMDAwMzAKLSNkZWZpbmUJTUlQSV9QV1JfQ05UTAkJCTB4MDAwMDAwNTQKLQotLyoKLSAqIE1JUElfUFJPVE9DT0xfQ09OVFJPTCByZWdpc3RlciBiaXRzIHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBmZWF0dXJlcyBvZgotICogQ1NJIFJ4IEJsb2NrCi0gKi8KLQotLyogRFBDTSBzY2hlbWUgKi8KLSNkZWZpbmUJTUlQSV9QUk9UT0NPTF9DT05UUk9MX0RQQ01fU0NIRU1FX1NIRlQJCQkweDFlCi0vKiBTV19SU1QgdG8gaXNzdWUgYSBTVyByZXNldCB0byB0aGUgQ1NJIGNvcmUgKi8KLSNkZWZpbmUJTUlQSV9QUk9UT0NPTF9DT05UUk9MX1NXX1JTVF9CTVNLCQkJMHg4MDAwMDAwCi0vKiBUbyBDYXB0dXJlIExvbmcgcGFja2V0IEhlYWRlciBJbmZvIGluIE1JUElfUFJPVE9DT0xfU1RBVFVTIHJlZ2lzdGVyICovCi0jZGVmaW5lCU1JUElfUFJPVE9DT0xfQ09OVFJPTF9MT05HX1BBQ0tFVF9IRUFERVJfQ0FQVFVSRV9CTVNLCTB4MjAwMDAwCi0vKiBEYXRhIGZvcm1hdCBmb3IgdW5wYWNraW5nIHB1cnBvc2UgKi8KLSNkZWZpbmUJTUlQSV9QUk9UT0NPTF9DT05UUk9MX0RBVEFfRk9STUFUX1NIRlQJCQkweDEzCi0vKiBFbmFibGUgZGVjb2Rpbmcgb2YgcGF5bG9hZCBiYXNlZCBvbiBkYXRhIHR5cGUgZmlsZWQgb2YgcGFja2V0IGhkciAqLwotI2RlZmluZQlNSVBJX1BST1RPQ09MX0NPTlRST0xfREVDT0RFX0lEX0JNU0sJCQkweDAwMDAwCi0vKiBFbmFibGUgZXJyb3IgY29ycmVjdGlvbiBvbiBwYWNrZXQgaGVhZGVycyAqLwotI2RlZmluZQlNSVBJX1BST1RPQ09MX0NPTlRST0xfRUNDX0VOX0JNU0sJCQkweDIwMDAwCi0KLS8qCi0gKiBNSVBJX0NBTElCUkFUSU9OX0NPTlRST0wgcmVnaXN0ZXIgY29udGFpbnMgY29udHJvbCBpbmZvIGZvcgotICogY2FsaWJyYXRpb24gaW1wbGVkZW5jZSBjb250cm9sbGVyCi0qLwotCi0vKiBFbmFibGUgYml0IGZvciBjYWxpYnJhdGlvbiBwYWQgKi8KLSNkZWZpbmUJTUlQSV9DQUxJQlJBVElPTl9DT05UUk9MX1NXQ0FMX0NBTF9FTl9TSEZUCQkweDE2Ci0vKiBXaXRoIFNXQ0FMX1NUUkVOR1RIX09WRVJSSURFX0VOLCBTV19DQUxfRU4gYW5kIE1BTlVBTF9PVkVSUklERV9FTgotICogdGhlIGhhcmR3YXJlIGNhbGlicmF0aW9uIGNpcmN1aXRyeSBhc3NvY2lhdGVkIHdpdGggQ0FMX1NXX0hXX01PREUKLSAqIGlzIGJ5cGFzc2VkCi0qLwotI2RlZmluZQlNSVBJX0NBTElCUkFUSU9OX0NPTlRST0xfU1dDQUxfU1RSRU5HVEhfT1ZFUlJJREVfRU5fU0hGVAkweDE1Ci0vKiBUbyBpbmRpY2F0ZSB0aGUgQ2FsaWJyYXRpb24gcHJvY2VzcyBpcyBpbiB0aGUgY29udHJvbCBvZiBIVy9TVyAqLwotI2RlZmluZQlNSVBJX0NBTElCUkFUSU9OX0NPTlRST0xfQ0FMX1NXX0hXX01PREVfU0hGVAkJMHgxNAotLyogV2hlbiB0aGlzIGlzIHNldCB0aGUgc3RyZW5ndGggdmFsdWUgb2YgdGhlIGRhdGEgYW5kIGNsayBsYW5lIGltcGVkZW5jZQotICogdGVybWluYXRpb24gaXMgdXBkYXRlZCB3aXRoIE1BTlVBTF9TVFJFTkdUSCBzZXR0aW5ncyBhbmQgY2FsaWJyYXRpb24KLSAqIHNlbnNpbmcgbG9naWMgaXMgaWRsZS4KLSovCi0jZGVmaW5lCU1JUElfQ0FMSUJSQVRJT05fQ09OVFJPTF9NQU5VQUxfT1ZFUlJJREVfRU5fU0hGVAkweDcKLQotLyogRGF0YSBsYW5lMCBjb250cm9sICovCi0vKiBULWhzIFNldHRsZSBjb3VudCB2YWx1ZSAgZm9yIFJ4ICovCi0jZGVmaW5lCU1JUElfUEhZX0QwX0NPTlRST0wyX1NFVFRMRV9DT1VOVF9TSEZUCQkJMHgxOAotLyogUnggdGVybWluYXRpb24gY29udHJvbCAqLwotI2RlZmluZQlNSVBJX1BIWV9EMF9DT05UUk9MMl9IU19URVJNX0lNUF9TSEZUCQkJMHgxMAotLyogTFAgUnggZW5hYmxlICovCi0jZGVmaW5lCU1JUElfUEhZX0QwX0NPTlRST0wyX0xQX1JFQ19FTl9TSEZUCQkJMHg0Ci0vKgotICogRW5hYmxlIGZvciBlcnJvciBpbiBzeW5jIHNlcXVlbmNlCi0gKiAxIC0gb25lIGJpdCBlcnJvciBpbiBzeW5jIHNlcQotICogMCAtIHJlcXVpcmVzIGFsbCA4IGJpdCBjb3JyZWN0IHNlcQotKi8KLSNkZWZpbmUJTUlQSV9QSFlfRDBfQ09OVFJPTDJfRVJSX1NPVF9IU19FTl9TSEZUCQkJMHgzCi0KLS8qIENvbW1lbnRzIGFyZSBzYW1lIGFzIEQwICovCi0jZGVmaW5lCU1JUElfUEhZX0QxX0NPTlRST0wyX1NFVFRMRV9DT1VOVF9TSEZUCQkJMHgxOAotI2RlZmluZQlNSVBJX1BIWV9EMV9DT05UUk9MMl9IU19URVJNX0lNUF9TSEZUCQkJMHgxMAotI2RlZmluZQlNSVBJX1BIWV9EMV9DT05UUk9MMl9MUF9SRUNfRU5fU0hGVAkJCTB4NAotI2RlZmluZQlNSVBJX1BIWV9EMV9DT05UUk9MMl9FUlJfU09UX0hTX0VOX1NIRlQJCQkweDMKLQotLyogQ29tbWVudHMgYXJlIHNhbWUgYXMgRDAgKi8KLSNkZWZpbmUJTUlQSV9QSFlfRDJfQ09OVFJPTDJfU0VUVExFX0NPVU5UX1NIRlQJCQkweDE4Ci0jZGVmaW5lCU1JUElfUEhZX0QyX0NPTlRST0wyX0hTX1RFUk1fSU1QX1NIRlQJCQkweDEwCi0jZGVmaW5lCU1JUElfUEhZX0QyX0NPTlRST0wyX0xQX1JFQ19FTl9TSEZUCQkJMHg0Ci0jZGVmaW5lCU1JUElfUEhZX0QyX0NPTlRST0wyX0VSUl9TT1RfSFNfRU5fU0hGVAkJCTB4MwotCi0vKiBDb21tZW50cyBhcmUgc2FtZSBhcyBEMCAqLwotI2RlZmluZQlNSVBJX1BIWV9EM19DT05UUk9MMl9TRVRUTEVfQ09VTlRfU0hGVAkJCTB4MTgKLSNkZWZpbmUJTUlQSV9QSFlfRDNfQ09OVFJPTDJfSFNfVEVSTV9JTVBfU0hGVAkJCTB4MTAKLSNkZWZpbmUJTUlQSV9QSFlfRDNfQ09OVFJPTDJfTFBfUkVDX0VOX1NIRlQJCQkweDQKLSNkZWZpbmUJTUlQSV9QSFlfRDNfQ09OVFJPTDJfRVJSX1NPVF9IU19FTl9TSEZUCQkJMHgzCi0KLS8qIFBIWV9DTF9DVFJMIHByb2dyYW1zIHRoZSBwYXJhbWV0ZXJzIG9mIGNsayBsYW5lIG9mIENTSVJYUEhZICovCi0vKiBIUyBSeCB0ZXJtaW5hdGlvbiBjb250cm9sICovCi0jZGVmaW5lCU1JUElfUEhZX0NMX0NPTlRST0xfSFNfVEVSTV9JTVBfU0hGVAkJCTB4MTgKLS8qIFN0YXJ0IHNpZ25hbCBmb3IgVC1ocyBkZWxheSAqLwotI2RlZmluZQlNSVBJX1BIWV9DTF9DT05UUk9MX0xQX1JFQ19FTl9TSEZUCQkJMHgyCi0KLS8qIFBIWSBEQVRBIGxhbmUgMCBjb250cm9sICovCi0vKgotICogSFMgUlggZXF1YWxpemVyIHN0cmVuZ3RoIGNvbnRyb2wKLSAqIDAwIC0gMGRiIDAxIC0gM2RiIDEwIC0gNWRiIDExIC0gN2RiCi0qLwotI2RlZmluZQlNSVBJX1BIWV9EMF9DT05UUk9MX0hTX1JFQ19FUV9TSEZUCQkJMHgxYwotCi0vKiBQSFkgREFUQSBsYW5lIDEgY29udHJvbCAqLwotLyogU2h1dGRvd24gc2lnbmFsIGZvciBNSVBJIGNsayBwaHkgbGluZSAqLwotI2RlZmluZQlNSVBJX1BIWV9EMV9DT05UUk9MX01JUElfQ0xLX1BIWV9TSFVURE9XTkJfU0hGVAkJMHg5Ci0vKiBTaHV0ZG93biBzaWduYWwgZm9yIE1JUEkgZGF0YSBwaHkgbGluZSAqLwotI2RlZmluZQlNSVBJX1BIWV9EMV9DT05UUk9MX01JUElfREFUQV9QSFlfU0hVVERPV05CX1NIRlQJMHg4Ci0KLSNkZWZpbmUgTVNNX0FYSV9RT1NfUFJFVklFVyAyMDAwMDAKLSNkZWZpbmUgTVNNX0FYSV9RT1NfU05BUFNIT1QgMjAwMDAwCi0jZGVmaW5lIE1TTV9BWElfUU9TX1JFQ09SRElORyAyMDAwMDAKLQotI2RlZmluZSBNSVBJX1BXUl9DTlRMX0VOQQkweDA3Ci0jZGVmaW5lIE1JUElfUFdSX0NOVExfRElTCTB4MAotCi1zdGF0aWMgc3RydWN0IGNsayAqY2FtaW9fY2FtX2NsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpjYW1pb192ZmVfY2xrOwotc3RhdGljIHN0cnVjdCBjbGsgKmNhbWlvX2NzaV9zcmNfY2xrOwotc3RhdGljIHN0cnVjdCBjbGsgKmNhbWlvX2NzaTBfdmZlX2NsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpjYW1pb19jc2kxX3ZmZV9jbGs7Ci1zdGF0aWMgc3RydWN0IGNsayAqY2FtaW9fY3NpMF9jbGs7Ci1zdGF0aWMgc3RydWN0IGNsayAqY2FtaW9fY3NpMV9jbGs7Ci1zdGF0aWMgc3RydWN0IGNsayAqY2FtaW9fY3NpMF9wY2xrOwotc3RhdGljIHN0cnVjdCBjbGsgKmNhbWlvX2NzaTFfcGNsazsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2lvX2V4dCBjYW1pb19leHQ7Ci1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaW9fY2xrIGNhbWlvX2NsazsKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjYW1pb19kZXY7Ci12b2lkIF9faW9tZW0gKmNzaWJhc2U7Ci12b2lkIF9faW9tZW0gKmFwcGJhc2U7Ci0KLQotaW50IG1zbV9jYW1pb192ZmVfY2xrX3JhdGVfc2V0KGludCByYXRlKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGNsayAqY2xrID0gY2FtaW9fdmZlX2NsazsKLQlpZiAocmF0ZSA+IGNsa19nZXRfcmF0ZShjbGspKQotCQlyYyA9IGNsa19zZXRfcmF0ZShjbGssIHJhdGUpOwotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9jYW1pb19jbGtfZW5hYmxlKGVudW0gbXNtX2NhbWlvX2Nsa190eXBlIGNsa3R5cGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwotCi0Jc3dpdGNoIChjbGt0eXBlKSB7Ci0JY2FzZSBDQU1JT19DQU1fTUNMS19DTEs6Ci0JCWNsayA9IGNsa19nZXQoTlVMTCwgImNhbV9tX2NsayIpOwotCQljYW1pb19jYW1fY2xrID0gY2xrOwotCQltc21fY2FtaW9fY2xrX3JhdGVfc2V0XzIoY2xrLCBjYW1pb19jbGsubWNsa19jbGtfcmF0ZSk7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNSU9fVkZFX0NMSzoKLQkJY2xrID0gY2xrX2dldChOVUxMLCAidmZlX2NsayIpOwotCQljYW1pb192ZmVfY2xrID0gY2xrOwotCQltc21fY2FtaW9fY2xrX3JhdGVfc2V0XzIoY2xrLCBjYW1pb19jbGsudmZlX2Nsa19yYXRlKTsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1JT19DU0kwX1ZGRV9DTEs6Ci0JCWNsayA9IGNsa19nZXQoJmNhbWlvX2Rldi0+ZGV2LCAiY3NpX3ZmZV9jbGsiKTsKLQkJY2FtaW9fY3NpMF92ZmVfY2xrID0gY2xrOwotCQlicmVhazsKLQljYXNlIENBTUlPX0NTSTFfVkZFX0NMSzoKLQkJY2xrID0gY2xrX2dldChOVUxMLCAiY3NpX3ZmZV9jbGsiKTsKLQkJY2FtaW9fY3NpMV92ZmVfY2xrID0gY2xrOwotCQlicmVhazsKLQljYXNlIENBTUlPX0NTSV9TUkNfQ0xLOgotCQljbGsgPSBjbGtfZ2V0KE5VTEwsICJjc2lfc3JjX2NsayIpOwotCQljYW1pb19jc2lfc3JjX2NsayA9IGNsazsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1JT19DU0kwX0NMSzoKLQkJY2xrID0gY2xrX2dldCgmY2FtaW9fZGV2LT5kZXYsICJjc2lfY2xrIik7Ci0JCWNhbWlvX2NzaTBfY2xrID0gY2xrOwotCQltc21fY2FtaW9fY2xrX3JhdGVfc2V0XzIoY2xrLCA0MDAwMDAwMDApOwotCQlicmVhazsKLQljYXNlIENBTUlPX0NTSTFfQ0xLOgotCQljbGsgPSBjbGtfZ2V0KE5VTEwsICJjc2lfY2xrIik7Ci0JCWNhbWlvX2NzaTFfY2xrID0gY2xrOwotCQlicmVhazsKLQljYXNlIENBTUlPX0NTSTBfUENMSzoKLQkJY2xrID0gY2xrX2dldCgmY2FtaW9fZGV2LT5kZXYsICJjc2lfcGNsayIpOwotCQljYW1pb19jc2kwX3BjbGsgPSBjbGs7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNSU9fQ1NJMV9QQ0xLOgotCQljbGsgPSBjbGtfZ2V0KE5VTEwsICJjc2lfcGNsayIpOwotCQljYW1pb19jc2kxX3BjbGsgPSBjbGs7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmICghSVNfRVJSKGNsaykpCi0JCWNsa19lbmFibGUoY2xrKTsKLQllbHNlCi0JCXJjID0gLTE7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2NhbWlvX2Nsa19kaXNhYmxlKGVudW0gbXNtX2NhbWlvX2Nsa190eXBlIGNsa3R5cGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwotCi0Jc3dpdGNoIChjbGt0eXBlKSB7Ci0JY2FzZSBDQU1JT19DQU1fTUNMS19DTEs6Ci0JCWNsayA9IGNhbWlvX2NhbV9jbGs7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNSU9fVkZFX0NMSzoKLQkJY2xrID0gY2FtaW9fdmZlX2NsazsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1JT19DU0lfU1JDX0NMSzoKLQkJY2xrID0gY2FtaW9fY3NpX3NyY19jbGs7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNSU9fQ1NJMF9WRkVfQ0xLOgotCQljbGsgPSBjYW1pb19jc2kwX3ZmZV9jbGs7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNSU9fQ1NJMV9WRkVfQ0xLOgotCQljbGsgPSBjYW1pb19jc2kxX3ZmZV9jbGs7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNSU9fQ1NJMF9DTEs6Ci0JCWNsayA9IGNhbWlvX2NzaTBfY2xrOwotCQlicmVhazsKLQljYXNlIENBTUlPX0NTSTFfQ0xLOgotCQljbGsgPSBjYW1pb19jc2kxX2NsazsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1JT19DU0kwX1BDTEs6Ci0JCWNsayA9IGNhbWlvX2NzaTBfcGNsazsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1JT19DU0kxX1BDTEs6Ci0JCWNsayA9IGNhbWlvX2NzaTFfcGNsazsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCFJU19FUlIoY2xrKSkgewotCQljbGtfZGlzYWJsZShjbGspOwotCQljbGtfcHV0KGNsayk7Ci0JfSBlbHNlCi0JCXJjID0gLTE7Ci0JcmV0dXJuIHJjOwotfQotCi12b2lkIG1zbV9jYW1pb19jbGtfcmF0ZV9zZXQoaW50IHJhdGUpCi17Ci0Jc3RydWN0IGNsayAqY2xrID0gY2FtaW9fY2FtX2NsazsKLQljbGtfc2V0X3JhdGUoY2xrLCByYXRlKTsKLX0KLQotdm9pZCBtc21fY2FtaW9fY2xrX3JhdGVfc2V0XzIoc3RydWN0IGNsayAqY2xrLCBpbnQgcmF0ZSkKLXsKLQljbGtfc2V0X3JhdGUoY2xrLCByYXRlKTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IG1zbV9pb19jc2lfaXJxKGludCBpcnFfbnVtLCB2b2lkICpkYXRhKQotewotCXVpbnQzMl90IGlycTsKLQotCWlycSA9IG1zbV9jYW1lcmFfaW9fcihjc2liYXNlICsgTUlQSV9JTlRFUlJVUFRfU1RBVFVTKTsKLQlDREJHKCIlcyBNSVBJX0lOVEVSUlVQVF9TVEFUVVMgPSAweCV4XG4iLCBfX2Z1bmNfXywgaXJxKTsKLQltc21fY2FtZXJhX2lvX3coaXJxLCBjc2liYXNlICsgTUlQSV9JTlRFUlJVUFRfU1RBVFVTKTsKLQotCS8qIFRPRE86IE5lZWRzIHRvIHNlbmQgdGhpcyBpbmZvIHRvIHVwcGVyIGxheWVycyAqLwotCWlmICgoaXJxID4+IDE5KSAmIDB4MSkKLQkJcHJfaW5mbygiVW5zdXBwb3J0ZWQgcGFja2V0IGZvcm1hdCBpcyByZWNlaXZlZFxuIik7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1pbnQgbXNtX2NhbWlvX2VuYWJsZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByYyA9IDA7Ci0JY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNpbmZvID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfZGV2aWNlX3BsYXRmb3JtX2RhdGEgKmNhbWRldiA9IHNpbmZvLT5wZGF0YTsKLQl1aW50MzJfdCB2YWw7Ci0KLQljYW1pb19kZXYgPSBwZGV2OwotCWNhbWlvX2V4dCA9IGNhbWRldi0+aW9leHQ7Ci0JY2FtaW9fY2xrID0gY2FtZGV2LT5pb2NsazsKLQotCW1zbV9jYW1pb19jbGtfZW5hYmxlKENBTUlPX1ZGRV9DTEspOwotCW1zbV9jYW1pb19jbGtfZW5hYmxlKENBTUlPX0NTSTBfVkZFX0NMSyk7Ci0JbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fQ1NJMV9WRkVfQ0xLKTsKLQltc21fY2FtaW9fY2xrX2VuYWJsZShDQU1JT19DU0kwX0NMSyk7Ci0JbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fQ1NJMV9DTEspOwotCW1zbV9jYW1pb19jbGtfZW5hYmxlKENBTUlPX0NTSTBfUENMSyk7Ci0JbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fQ1NJMV9QQ0xLKTsKLQotCWNzaWJhc2UgPSBpb3JlbWFwKGNhbWlvX2V4dC5jc2lwaHksIGNhbWlvX2V4dC5jc2lzeik7Ci0JaWYgKCFjc2liYXNlKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBjc2lfYnVzeTsKLQl9Ci0JcmMgPSByZXF1ZXN0X2lycShjYW1pb19leHQuY3NpaXJxLCBtc21faW9fY3NpX2lycSwKLQkJCQlJUlFGX1RSSUdHRVJfUklTSU5HLCAiY3NpIiwgMCk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBjc2lfaXJxX2ZhaWw7Ci0KLQltc2xlZXAoMjApOwotCXZhbCA9ICgyMCA8PAotCQlNSVBJX1BIWV9EMF9DT05UUk9MMl9TRVRUTEVfQ09VTlRfU0hGVCkgfAotCQkoMHgwRiA8PCBNSVBJX1BIWV9EMF9DT05UUk9MMl9IU19URVJNX0lNUF9TSEZUKSB8Ci0JCSgweDAgPDwgTUlQSV9QSFlfRDBfQ09OVFJPTDJfTFBfUkVDX0VOX1NIRlQpIHwKLQkJKDB4MSA8PCBNSVBJX1BIWV9EMF9DT05UUk9MMl9FUlJfU09UX0hTX0VOX1NIRlQpOwotCUNEQkcoIiVzIE1JUElfUEhZX0QwX0NPTlRST0wyIHZhbD0weCV4XG4iLCBfX2Z1bmNfXywgdmFsKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjc2liYXNlICsgTUlQSV9QSFlfRDBfQ09OVFJPTDIpOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWJhc2UgKyBNSVBJX1BIWV9EMV9DT05UUk9MMik7Ci0JbXNtX2NhbWVyYV9pb193KHZhbCwgY3NpYmFzZSArIE1JUElfUEhZX0QyX0NPTlRST0wyKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjc2liYXNlICsgTUlQSV9QSFlfRDNfQ09OVFJPTDIpOwotCi0JdmFsID0gKDB4MEYgPDwgTUlQSV9QSFlfQ0xfQ09OVFJPTF9IU19URVJNX0lNUF9TSEZUKSB8Ci0JCSgweDAgPDwgTUlQSV9QSFlfQ0xfQ09OVFJPTF9MUF9SRUNfRU5fU0hGVCk7Ci0JQ0RCRygiJXMgTUlQSV9QSFlfQ0xfQ09OVFJPTCB2YWw9MHgleFxuIiwgX19mdW5jX18sIHZhbCk7Ci0JbXNtX2NhbWVyYV9pb193KHZhbCwgY3NpYmFzZSArIE1JUElfUEhZX0NMX0NPTlRST0wpOwotCi0JYXBwYmFzZSA9IGlvcmVtYXAoY2FtaW9fZXh0LmFwcHBoeSwKLQkJY2FtaW9fZXh0LmFwcHN6KTsKLQlpZiAoIWFwcGJhc2UpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGNzaV9pcnFfZmFpbDsKLQl9Ci0JcmV0dXJuIDA7Ci0KLWNzaV9pcnFfZmFpbDoKLQlpb3VubWFwKGNzaWJhc2UpOwotY3NpX2J1c3k6Ci0JbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX0NBTV9NQ0xLX0NMSyk7Ci0JbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX1ZGRV9DTEspOwotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19DU0kwX1ZGRV9DTEspOwotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19DU0kxX1ZGRV9DTEspOwotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19DU0kwX0NMSyk7Ci0JbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX0NTSTFfQ0xLKTsKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ1NJMF9QQ0xLKTsKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ1NJMV9QQ0xLKTsKLQljYW1kZXYtPmNhbWVyYV9ncGlvX29mZigpOwotCXJldHVybiByYzsKLX0KLQotdm9pZCBtc21fY2FtaW9fZGlzYWJsZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXVpbnQzMl90IHZhbDsKLQotCXZhbCA9ICgyMCA8PAotCQlNSVBJX1BIWV9EMF9DT05UUk9MMl9TRVRUTEVfQ09VTlRfU0hGVCkgfAotCQkoMHgwRiA8PCBNSVBJX1BIWV9EMF9DT05UUk9MMl9IU19URVJNX0lNUF9TSEZUKSB8Ci0JCSgweDAgPDwgTUlQSV9QSFlfRDBfQ09OVFJPTDJfTFBfUkVDX0VOX1NIRlQpIHwKLQkJKDB4MSA8PCBNSVBJX1BIWV9EMF9DT05UUk9MMl9FUlJfU09UX0hTX0VOX1NIRlQpOwotCUNEQkcoIiVzIE1JUElfUEhZX0QwX0NPTlRST0wyIHZhbD0weCV4XG4iLCBfX2Z1bmNfXywgdmFsKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjc2liYXNlICsgTUlQSV9QSFlfRDBfQ09OVFJPTDIpOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWJhc2UgKyBNSVBJX1BIWV9EMV9DT05UUk9MMik7Ci0JbXNtX2NhbWVyYV9pb193KHZhbCwgY3NpYmFzZSArIE1JUElfUEhZX0QyX0NPTlRST0wyKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjc2liYXNlICsgTUlQSV9QSFlfRDNfQ09OVFJPTDIpOwotCi0JdmFsID0gKDB4MEYgPDwgTUlQSV9QSFlfQ0xfQ09OVFJPTF9IU19URVJNX0lNUF9TSEZUKSB8Ci0JCSgweDAgPDwgTUlQSV9QSFlfQ0xfQ09OVFJPTF9MUF9SRUNfRU5fU0hGVCk7Ci0JQ0RCRygiJXMgTUlQSV9QSFlfQ0xfQ09OVFJPTCB2YWw9MHgleFxuIiwgX19mdW5jX18sIHZhbCk7Ci0JbXNtX2NhbWVyYV9pb193KHZhbCwgY3NpYmFzZSArIE1JUElfUEhZX0NMX0NPTlRST0wpOwotCW1zbGVlcCgyMCk7Ci0KLQlmcmVlX2lycShjYW1pb19leHQuY3NpaXJxLCAwKTsKLQlpb3VubWFwKGNzaWJhc2UpOwotCWlvdW5tYXAoYXBwYmFzZSk7Ci0JQ0RCRygiZGlzYWJsZSBjbG9ja3NcbiIpOwotCi0JbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX1ZGRV9DTEspOwotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19DU0kwX0NMSyk7Ci0JbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX0NTSTFfQ0xLKTsKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ1NJMF9WRkVfQ0xLKTsKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ1NJMV9WRkVfQ0xLKTsKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ1NJMF9QQ0xLKTsKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ1NJMV9QQ0xLKTsKLX0KLQotaW50IG1zbV9jYW1pb19zZW5zb3JfY2xrX29uKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjID0gMDsKLQljb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2luZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9kZXZpY2VfcGxhdGZvcm1fZGF0YSAqY2FtZGV2ID0gc2luZm8tPnBkYXRhOwotCWNhbWlvX2RldiA9IHBkZXY7Ci0JY2FtaW9fZXh0ID0gY2FtZGV2LT5pb2V4dDsKLQljYW1pb19jbGsgPSBjYW1kZXYtPmlvY2xrOwotCi0JcmMgPSBjYW1kZXYtPmNhbWVyYV9ncGlvX29uKCk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXJldHVybiBtc21fY2FtaW9fY2xrX2VuYWJsZShDQU1JT19DQU1fTUNMS19DTEspOwotfQotCi1pbnQgbXNtX2NhbWlvX3NlbnNvcl9jbGtfb2ZmKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNpbmZvID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfZGV2aWNlX3BsYXRmb3JtX2RhdGEgKmNhbWRldiA9IHNpbmZvLT5wZGF0YTsKLQljYW1kZXYtPmNhbWVyYV9ncGlvX29mZigpOwotCXJldHVybiBtc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ0FNX01DTEtfQ0xLKTsKLQotfQotCi12b2lkIG1zbV9jYW1pb192ZmVfYmxrX3Jlc2V0KHZvaWQpCi17Ci0JdWludDMyX3QgdmFsOwotCi0JLyogZG8gYXBwcyByZXNldCAqLwotCXZhbCA9IG1zbV9jYW1lcmFfaW9fcihhcHBiYXNlICsgMHgwMDAwMDIxMCk7Ci0JdmFsIHw9IDB4MTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBhcHBiYXNlICsgMHgwMDAwMDIxMCk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7Ci0KLQl2YWwgPSBtc21fY2FtZXJhX2lvX3IoYXBwYmFzZSArIDB4MDAwMDAyMTApOwotCXZhbCAmPSB+MHgxOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGFwcGJhc2UgKyAweDAwMDAwMjEwKTsKLQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKLQotCS8qIGRvIGF4aSByZXNldCAqLwotCXZhbCA9IG1zbV9jYW1lcmFfaW9fcihhcHBiYXNlICsgMHgwMDAwMDIwOCk7Ci0JdmFsIHw9IDB4MTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBhcHBiYXNlICsgMHgwMDAwMDIwOCk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7Ci0KLQl2YWwgPSBtc21fY2FtZXJhX2lvX3IoYXBwYmFzZSArIDB4MDAwMDAyMDgpOwotCXZhbCAmPSB+MHgxOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGFwcGJhc2UgKyAweDAwMDAwMjA4KTsKLQltYigpOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotCXJldHVybjsKLX0KLQotaW50IG1zbV9jYW1pb19wcm9iZV9vbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByYyA9IDA7Ci0JY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNpbmZvID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfZGV2aWNlX3BsYXRmb3JtX2RhdGEgKmNhbWRldiA9IHNpbmZvLT5wZGF0YTsKLQljYW1pb19kZXYgPSBwZGV2OwotCWNhbWlvX2V4dCA9IGNhbWRldi0+aW9leHQ7Ci0JY2FtaW9fY2xrID0gY2FtZGV2LT5pb2NsazsKLQotCW1zbV9jYW1pb19jbGtfZW5hYmxlKENBTUlPX0NTSTBfUENMSyk7Ci0JbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fQ1NJMV9QQ0xLKTsKLQotCXJjID0gY2FtZGV2LT5jYW1lcmFfZ3Bpb19vbigpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQlyZXR1cm4gbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fQ0FNX01DTEtfQ0xLKTsKLX0KLQotaW50IG1zbV9jYW1pb19wcm9iZV9vZmYoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQljb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2luZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9kZXZpY2VfcGxhdGZvcm1fZGF0YSAqY2FtZGV2ID0gc2luZm8tPnBkYXRhOwotCWNhbWRldi0+Y2FtZXJhX2dwaW9fb2ZmKCk7Ci0KLQljc2liYXNlID0gaW9yZW1hcChjYW1kZXYtPmlvZXh0LmNzaXBoeSwgY2FtZGV2LT5pb2V4dC5jc2lzeik7Ci0JaWYgKCFjc2liYXNlKSB7Ci0JCXByX2VycigiaW9yZW1hcCBmYWlsZWQgZm9yIENTSUJBU0VcbiIpOwotCQlnb3RvIGlvcmVtYXBfZmFpbDsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KE1JUElfUFdSX0NOVExfRElTLCBjc2liYXNlICsgTUlQSV9QV1JfQ05UTCk7Ci0JaW91bm1hcChjc2liYXNlKTsKLWlvcmVtYXBfZmFpbDoKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ1NJMF9QQ0xLKTsKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ1NJMV9QQ0xLKTsKLQlyZXR1cm4gbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX0NBTV9NQ0xLX0NMSyk7Ci19Ci0KLWludCBtc21fY2FtaW9fY3NpX2NvbmZpZyhzdHJ1Y3QgbXNtX2NhbWVyYV9jc2lfcGFyYW1zICpjc2lfcGFyYW1zKQotewotCWludCByYyA9IDA7Ci0JdWludDMyX3QgdmFsID0gMDsKLQotCUNEQkcoIm1zbV9jYW1pb19jc2lfY29uZmlnXG4iKTsKLQotCS8qIEVuYWJsZSBlcnJvciBjb3JyZWN0aW9uIGZvciBEQVRBIGxhbmUuIEFwcGxpZXMgdG8gYWxsIGRhdGEgbGFuZXMgKi8KLQltc21fY2FtZXJhX2lvX3coMHg0LCBjc2liYXNlICsgTUlQSV9QSFlfQ09OVFJPTCk7Ci0KLQltc21fY2FtZXJhX2lvX3coTUlQSV9QUk9UT0NPTF9DT05UUk9MX1NXX1JTVF9CTVNLLAotCQljc2liYXNlICsgTUlQSV9QUk9UT0NPTF9DT05UUk9MKTsKLQotCXZhbCA9IE1JUElfUFJPVE9DT0xfQ09OVFJPTF9MT05HX1BBQ0tFVF9IRUFERVJfQ0FQVFVSRV9CTVNLIHwKLQkJTUlQSV9QUk9UT0NPTF9DT05UUk9MX0RFQ09ERV9JRF9CTVNLIHwKLQkJTUlQSV9QUk9UT0NPTF9DT05UUk9MX0VDQ19FTl9CTVNLOwotCXZhbCB8PSAodWludDMyX3QpKGNzaV9wYXJhbXMtPmRhdGFfZm9ybWF0KSA8PAotCQlNSVBJX1BST1RPQ09MX0NPTlRST0xfREFUQV9GT1JNQVRfU0hGVDsKLQl2YWwgfD0gY3NpX3BhcmFtcy0+ZHBjbV9zY2hlbWUgPDwKLQkJTUlQSV9QUk9UT0NPTF9DT05UUk9MX0RQQ01fU0NIRU1FX1NIRlQ7Ci0JQ0RCRygiJXMgTUlQSV9QUk9UT0NPTF9DT05UUk9MIHZhbD0weCV4XG4iLCBfX2Z1bmNfXywgdmFsKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjc2liYXNlICsgTUlQSV9QUk9UT0NPTF9DT05UUk9MKTsKLQotCXZhbCA9ICgweDEgPDwgTUlQSV9DQUxJQlJBVElPTl9DT05UUk9MX1NXQ0FMX0NBTF9FTl9TSEZUKSB8Ci0JCSgweDEgPDwKLQkJTUlQSV9DQUxJQlJBVElPTl9DT05UUk9MX1NXQ0FMX1NUUkVOR1RIX09WRVJSSURFX0VOX1NIRlQpIHwKLQkJKDB4MSA8PCBNSVBJX0NBTElCUkFUSU9OX0NPTlRST0xfQ0FMX1NXX0hXX01PREVfU0hGVCkgfAotCQkoMHgxIDw8IE1JUElfQ0FMSUJSQVRJT05fQ09OVFJPTF9NQU5VQUxfT1ZFUlJJREVfRU5fU0hGVCk7Ci0JQ0RCRygiJXMgTUlQSV9DQUxJQlJBVElPTl9DT05UUk9MIHZhbD0weCV4XG4iLCBfX2Z1bmNfXywgdmFsKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjc2liYXNlICsgTUlQSV9DQUxJQlJBVElPTl9DT05UUk9MKTsKLQotCXZhbCA9IChjc2lfcGFyYW1zLT5zZXR0bGVfY250IDw8Ci0JCU1JUElfUEhZX0QwX0NPTlRST0wyX1NFVFRMRV9DT1VOVF9TSEZUKSB8Ci0JCSgweDBGIDw8IE1JUElfUEhZX0QwX0NPTlRST0wyX0hTX1RFUk1fSU1QX1NIRlQpIHwKLQkJKDB4MSA8PCBNSVBJX1BIWV9EMF9DT05UUk9MMl9MUF9SRUNfRU5fU0hGVCkgfAotCQkoMHgxIDw8IE1JUElfUEhZX0QwX0NPTlRST0wyX0VSUl9TT1RfSFNfRU5fU0hGVCk7Ci0JQ0RCRygiJXMgTUlQSV9QSFlfRDBfQ09OVFJPTDIgdmFsPTB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWJhc2UgKyBNSVBJX1BIWV9EMF9DT05UUk9MMik7Ci0JbXNtX2NhbWVyYV9pb193KHZhbCwgY3NpYmFzZSArIE1JUElfUEhZX0QxX0NPTlRST0wyKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjc2liYXNlICsgTUlQSV9QSFlfRDJfQ09OVFJPTDIpOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWJhc2UgKyBNSVBJX1BIWV9EM19DT05UUk9MMik7Ci0KLQotCXZhbCA9ICgweDBGIDw8IE1JUElfUEhZX0NMX0NPTlRST0xfSFNfVEVSTV9JTVBfU0hGVCkgfAotCQkoMHgxIDw8IE1JUElfUEhZX0NMX0NPTlRST0xfTFBfUkVDX0VOX1NIRlQpOwotCUNEQkcoIiVzIE1JUElfUEhZX0NMX0NPTlRST0wgdmFsPTB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWJhc2UgKyBNSVBJX1BIWV9DTF9DT05UUk9MKTsKLQotCXZhbCA9IDAgPDwgTUlQSV9QSFlfRDBfQ09OVFJPTF9IU19SRUNfRVFfU0hGVDsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjc2liYXNlICsgTUlQSV9QSFlfRDBfQ09OVFJPTCk7Ci0KLQl2YWwgPSAoMHgxIDw8IE1JUElfUEhZX0QxX0NPTlRST0xfTUlQSV9DTEtfUEhZX1NIVVRET1dOQl9TSEZUKSB8Ci0JCSgweDEgPDwgTUlQSV9QSFlfRDFfQ09OVFJPTF9NSVBJX0RBVEFfUEhZX1NIVVRET1dOQl9TSEZUKTsKLQlDREJHKCIlcyBNSVBJX1BIWV9EMV9DT05UUk9MIHZhbD0weCV4XG4iLCBfX2Z1bmNfXywgdmFsKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjc2liYXNlICsgTUlQSV9QSFlfRDFfQ09OVFJPTCk7Ci0KLQltc21fY2FtZXJhX2lvX3coMHgwMDAwMDAwMCwgY3NpYmFzZSArIE1JUElfUEhZX0QyX0NPTlRST0wpOwotCW1zbV9jYW1lcmFfaW9fdygweDAwMDAwMDAwLCBjc2liYXNlICsgTUlQSV9QSFlfRDNfQ09OVFJPTCk7Ci0KLQkvKiBwcm9ncmFtIG51bWJlciBvZiBsYW5lcyBhbmQgbGFuZSBtYXBwaW5nICovCi0Jc3dpdGNoIChjc2lfcGFyYW1zLT5sYW5lX2NudCkgewotCWNhc2UgMToKLQkJbXNtX2NhbWVyYV9pb193KGNzaV9wYXJhbXMtPmxhbmVfYXNzaWduIDw8IDggfCAweDQsCi0JCQljc2liYXNlICsgTUlQSV9DQU1FUkFfQ05UTCk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJbXNtX2NhbWVyYV9pb193KGNzaV9wYXJhbXMtPmxhbmVfYXNzaWduIDw8IDggfCAweDUsCi0JCQljc2liYXNlICsgTUlQSV9DQU1FUkFfQ05UTCk7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJbXNtX2NhbWVyYV9pb193KGNzaV9wYXJhbXMtPmxhbmVfYXNzaWduIDw8IDggfCAweDYsCi0JCQljc2liYXNlICsgTUlQSV9DQU1FUkFfQ05UTCk7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJbXNtX2NhbWVyYV9pb193KGNzaV9wYXJhbXMtPmxhbmVfYXNzaWduIDw8IDggfCAweDcsCi0JCQljc2liYXNlICsgTUlQSV9DQU1FUkFfQ05UTCk7Ci0JCWJyZWFrOwotCX0KLQotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGM0ZGLCBjc2liYXNlICsgTUlQSV9JTlRFUlJVUFRfTUFTSyk7Ci0JLypjbGVhciBJUlEgYml0cyAtIHdyaXRlIDEgY2xlYXJzIHRoZSBzdGF0dXMqLwotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGM0ZGLCBjc2liYXNlICsgTUlQSV9JTlRFUlJVUFRfU1RBVFVTKTsKLQotCXJldHVybiByYzsKLX0KLQotdm9pZCBtc21fY2FtaW9fc2V0X3BlcmZfbHZsKGVudW0gbXNtX2J1c19wZXJmX3NldHRpbmcgcGVyZl9zZXR0aW5nKQotewotCXN3aXRjaCAocGVyZl9zZXR0aW5nKSB7Ci0JY2FzZSBTX0lOSVQ6Ci0JCWFkZF9heGlfcW9zKCk7Ci0JCWJyZWFrOwotCWNhc2UgU19QUkVWSUVXOgotCQl1cGRhdGVfYXhpX3FvcyhNU01fQVhJX1FPU19QUkVWSUVXKTsKLQkJYnJlYWs7Ci0JY2FzZSBTX1ZJREVPOgotCQl1cGRhdGVfYXhpX3FvcyhNU01fQVhJX1FPU19SRUNPUkRJTkcpOwotCQlicmVhazsKLQljYXNlIFNfQ0FQVFVSRToKLQkJdXBkYXRlX2F4aV9xb3MoTVNNX0FYSV9RT1NfU05BUFNIT1QpOwotCQlicmVhazsKLQljYXNlIFNfREVGQVVMVDoKLQkJdXBkYXRlX2F4aV9xb3MoUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotCQlicmVhazsKLQljYXNlIFNfRVhJVDoKLQkJcmVsZWFzZV9heGlfcW9zKCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUNEQkcoIiVzOiBJTlZBTElEIENBU0VcbiIsIF9fZnVuY19fKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW8vbXNtX2lvXzd4MjdhX3Y0bDIuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9tc21faW9fN3gyN2FfdjRsMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDJhMTFkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9tc21faW9fN3gyN2FfdjRsMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWFjaC9jbGsuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9idXMuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9idXNfYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2RhbF9heGkuaD4KLQotI2RlZmluZSBNU01fQVhJX1FPU19QUkVWSUVXIDIwMDAwMAotI2RlZmluZSBNU01fQVhJX1FPU19TTkFQU0hPVCAyMDAwMDAKLSNkZWZpbmUgTVNNX0FYSV9RT1NfUkVDT1JESU5HIDIwMDAwMAotCi1zdGF0aWMgc3RydWN0IGNsayAqY2FtaW9fY2FtX2NsazsKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKmNsa19jdHJsX21lbTsKLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pb19jbGsgY2FtaW9fY2xrOwotc3RhdGljIGludCBhcHBzX3Jlc2V0Owotdm9pZCBfX2lvbWVtICphcHBiYXNlOwotCi12b2lkIG1zbV9jYW1pb19jbGtfcmF0ZV9zZXRfMihzdHJ1Y3QgY2xrICpjbGssIGludCByYXRlKQotewotCWNsa19zZXRfcmF0ZShjbGssIHJhdGUpOwotfQotaW50IG1zbV9jYW1pb19jbGtfZW5hYmxlKGVudW0gbXNtX2NhbWlvX2Nsa190eXBlIGNsa3R5cGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwotCi0Jc3dpdGNoIChjbGt0eXBlKSB7Ci0JY2FzZSBDQU1JT19DQU1fTUNMS19DTEs6Ci0JCWNsayA9IGNsa19nZXQoTlVMTCwgImNhbV9tX2NsayIpOwotCQljYW1pb19jYW1fY2xrID0gY2xrOwotCQltc21fY2FtaW9fY2xrX3JhdGVfc2V0XzIoY2xrLCBjYW1pb19jbGsubWNsa19jbGtfcmF0ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmICghSVNfRVJSKGNsaykpCi0JCWNsa19lbmFibGUoY2xrKTsKLQllbHNlCi0JCXJjID0gLTE7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2NhbWlvX2Nsa19kaXNhYmxlKGVudW0gbXNtX2NhbWlvX2Nsa190eXBlIGNsa3R5cGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwotCi0Jc3dpdGNoIChjbGt0eXBlKSB7Ci0JY2FzZSBDQU1JT19DQU1fTUNMS19DTEs6Ci0JCWNsayA9IGNhbWlvX2NhbV9jbGs7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmICghSVNfRVJSKGNsaykpIHsKLQkJY2xrX2Rpc2FibGUoY2xrKTsKLQkJY2xrX3B1dChjbGspOwotCX0gZWxzZQotCQlyYyA9IC0xOwotCXJldHVybiByYzsKLX0KLQotdm9pZCBtc21fY2FtaW9fY2xrX3JhdGVfc2V0KGludCByYXRlKQotewotCXN0cnVjdCBjbGsgKmNsayA9IGNhbWlvX2NhbV9jbGs7Ci0JY2xrX3NldF9yYXRlKGNsaywgcmF0ZSk7Ci19Ci0KLXZvaWQgbXNtX2NhbWlvX3ZmZV9ibGtfcmVzZXRfMih2b2lkKQotewotCXVpbnQzMl90IHZhbDsKLQotCS8qIGRvIGFwcHMgcmVzZXQgKi8KLQl2YWwgPSByZWFkbF9yZWxheGVkKGFwcGJhc2UgKyAweDAwMDAwMjEwKTsKLQl2YWwgfD0gMHgxOwotCXdyaXRlbF9yZWxheGVkKHZhbCwgYXBwYmFzZSArIDB4MDAwMDAyMTApOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotCi0JdmFsID0gcmVhZGxfcmVsYXhlZChhcHBiYXNlICsgMHgwMDAwMDIxMCk7Ci0JdmFsICY9IH4weDE7Ci0Jd3JpdGVsX3JlbGF4ZWQodmFsLCBhcHBiYXNlICsgMHgwMDAwMDIxMCk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7Ci0KLQkvKiBkbyBheGkgcmVzZXQgKi8KLQl2YWwgPSByZWFkbF9yZWxheGVkKGFwcGJhc2UgKyAweDAwMDAwMjA4KTsKLQl2YWwgfD0gMHgxOwotCXdyaXRlbF9yZWxheGVkKHZhbCwgYXBwYmFzZSArIDB4MDAwMDAyMDgpOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotCi0JdmFsID0gcmVhZGxfcmVsYXhlZChhcHBiYXNlICsgMHgwMDAwMDIwOCk7Ci0JdmFsICY9IH4weDE7Ci0Jd3JpdGVsX3JlbGF4ZWQodmFsLCBhcHBiYXNlICsgMHgwMDAwMDIwOCk7Ci0JbWIoKTsKLQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKLX0KLQotdm9pZCBtc21fY2FtaW9fdmZlX2Jsa19yZXNldF8zKHZvaWQpCi17Ci0JdWludDMyX3QgdmFsOwotCi0JaWYgKCFhcHBzX3Jlc2V0KQotCQlyZXR1cm47Ci0KLQkvKiBkbyBhcHBzIHJlc2V0ICovCi0JdmFsID0gcmVhZGxfcmVsYXhlZChhcHBiYXNlICsgMHgwMDAwMDIxMCk7Ci0JdmFsIHw9IDB4MTBBMDAwMDsKLQl3cml0ZWxfcmVsYXhlZCh2YWwsIGFwcGJhc2UgKyAweDAwMDAwMjEwKTsKLQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKLQotCXZhbCA9IHJlYWRsX3JlbGF4ZWQoYXBwYmFzZSArIDB4MDAwMDAyMTApOwotCXZhbCAmPSB+KDB4MTBBMDAwMCk7Ci0Jd3JpdGVsX3JlbGF4ZWQodmFsLCBhcHBiYXNlICsgMHgwMDAwMDIxMCk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7Ci0JbWIoKTsKLX0KLQotdm9pZCBtc21fY2FtaW9fc2V0X3BlcmZfbHZsKGVudW0gbXNtX2J1c19wZXJmX3NldHRpbmcgcGVyZl9zZXR0aW5nKQotewotCXN3aXRjaCAocGVyZl9zZXR0aW5nKSB7Ci0JY2FzZSBTX0lOSVQ6Ci0JCWFkZF9heGlfcW9zKCk7Ci0JCXVwZGF0ZV9heGlfcW9zKE1TTV9BWElfUU9TX1BSRVZJRVcpOwotCQlheGlfYWxsb2NhdGUoQVhJX0ZMT1dfVklFV0ZJTkRFUl9ISSk7Ci0JCWJyZWFrOwotCWNhc2UgU19QUkVWSUVXOgotCQlicmVhazsKLQljYXNlIFNfVklERU86Ci0JCWJyZWFrOwotCWNhc2UgU19DQVBUVVJFOgotCQlicmVhazsKLQljYXNlIFNfREVGQVVMVDoKLQkJYnJlYWs7Ci0JY2FzZSBTX0VYSVQ6Ci0JCWF4aV9mcmVlKEFYSV9GTE9XX1ZJRVdGSU5ERVJfSEkpOwotCQlyZWxlYXNlX2F4aV9xb3MoKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQ0RCRygiJXM6IElOVkFMSUQgQ0FTRVxuIiwgX19mdW5jX18pOwotCX0KLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgY2xrY3RsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjID0gMDsKLQotCWFwcHNfcmVzZXQgPSAqKGludCAqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWNsa19jdHJsX21lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKLQkJCQkJSU9SRVNPVVJDRV9NRU0sICJjbGtfY3RsIik7Ci0JaWYgKCFjbGtfY3RybF9tZW0pIHsKLQkJcHJfZXJyKCIlczogbm8gbWVtIHJlc291cmNlOjM/XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWFwcGJhc2UgPSBpb3JlbWFwKGNsa19jdHJsX21lbS0+c3RhcnQsCi0JCXJlc291cmNlX3NpemUoY2xrX2N0cmxfbWVtKSk7Ci0JaWYgKCFhcHBiYXNlKSB7Ci0JCXByX2VycigiY2xrY3RsX3Byb2JlOiBhcHBiYXNlOmVyclxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBpb3JlbWFwX2ZhaWw7Ci0JfQotCXJldHVybiAwOwotCi1pb3JlbWFwX2ZhaWw6Ci0JbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX0NBTV9NQ0xLX0NMSyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGNsa2N0bF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpZiAoY2xrX2N0cmxfbWVtKQotCQlpb3VubWFwKGNsa19jdHJsX21lbSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY2xrY3RsX2RyaXZlciA9IHsKLQkucHJvYmUgID0gY2xrY3RsX3Byb2JlLAotCS5yZW1vdmUgPSBjbGtjdGxfcmVtb3ZlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm1zbV9jbGtfY3RsIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9jbGtjdGxfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZjbGtjdGxfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG1zbV9jbGtjdGxfZXhpdF9tb2R1bGUodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY2xrY3RsX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KG1zbV9jbGtjdGxfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQobXNtX2Nsa2N0bF9leGl0X21vZHVsZSk7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkNBTSBJTyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9tc21faW9fODk2MC5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvL21zbV9pb184OTYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYzRmYTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvL21zbV9pb184OTYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvcG04eHh4L3BtODkyMS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpb211eC5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgPG1hY2gvdnJlZy5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWFjaC9jbGsuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9idXMuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9idXNfYm9hcmQuaD4KLQotI2RlZmluZSBCVUZGX1NJWkVfMTI4IDEyOAotCi12b2lkIG1zbV9jYW1pb19jbGtfcmF0ZV9zZXRfMihzdHJ1Y3QgY2xrICpjbGssIGludCByYXRlKQotewotCWNsa19zZXRfcmF0ZShjbGssIHJhdGUpOwotfQotCi12b2lkIG1zbV9jYW1pb19idXNfc2NhbGVfY2ZnKHN0cnVjdCBtc21fYnVzX3NjYWxlX3BkYXRhICpjYW1fYnVzX3NjYWxlX3RhYmxlLAotCQllbnVtIG1zbV9idXNfcGVyZl9zZXR0aW5nIHBlcmZfc2V0dGluZykKLXsKLQlzdGF0aWMgdWludDMyX3QgYnVzX3BlcmZfY2xpZW50OwotCWludCByYyA9IDA7Ci0Jc3dpdGNoIChwZXJmX3NldHRpbmcpIHsKLQljYXNlIFNfSU5JVDoKLQkJYnVzX3BlcmZfY2xpZW50ID0KLQkJCW1zbV9idXNfc2NhbGVfcmVnaXN0ZXJfY2xpZW50KGNhbV9idXNfc2NhbGVfdGFibGUpOwotCQlpZiAoIWJ1c19wZXJmX2NsaWVudCkgewotCQkJQ0RCRygiJXM6IFJlZ2lzdHJhdGlvbiBGYWlsZWQhISFcbiIsIF9fZnVuY19fKTsKLQkJCWJ1c19wZXJmX2NsaWVudCA9IDA7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ0RCRygiJXM6IFNfSU5JVCByYyA9ICV1XG4iLCBfX2Z1bmNfXywgYnVzX3BlcmZfY2xpZW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBTX0VYSVQ6Ci0JCWlmIChidXNfcGVyZl9jbGllbnQpIHsKLQkJCUNEQkcoIiVzOiBTX0VYSVRcbiIsIF9fZnVuY19fKTsKLQkJCW1zbV9idXNfc2NhbGVfdW5yZWdpc3Rlcl9jbGllbnQoYnVzX3BlcmZfY2xpZW50KTsKLQkJfSBlbHNlCi0JCQlDREJHKCIlczogQnVzIENsaWVudCBOT1QgUmVnaXN0ZXJlZCEhIVxuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIFNfUFJFVklFVzoKLQkJaWYgKGJ1c19wZXJmX2NsaWVudCkgewotCQkJcmMgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdCgKLQkJCQlidXNfcGVyZl9jbGllbnQsIDEpOwotCQkJQ0RCRygiJXM6IFNfUFJFVklFVyByYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQl9IGVsc2UKLQkJCUNEQkcoIiVzOiBCdXMgQ2xpZW50IE5PVCBSZWdpc3RlcmVkISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgU19WSURFTzoKLQkJaWYgKGJ1c19wZXJmX2NsaWVudCkgewotCQkJcmMgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdCgKLQkJCQlidXNfcGVyZl9jbGllbnQsIDIpOwotCQkJQ0RCRygiJXM6IFNfVklERU8gcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJfSBlbHNlCi0JCQlDREJHKCIlczogQnVzIENsaWVudCBOT1QgUmVnaXN0ZXJlZCEhIVxuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIFNfQ0FQVFVSRToKLQkJaWYgKGJ1c19wZXJmX2NsaWVudCkgewotCQkJcmMgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdCgKLQkJCQlidXNfcGVyZl9jbGllbnQsIDMpOwotCQkJQ0RCRygiJXM6IFNfQ0FQVFVSRSByYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQl9IGVsc2UKLQkJCUNEQkcoIiVzOiBCdXMgQ2xpZW50IE5PVCBSZWdpc3RlcmVkISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgU19aU0w6Ci0JCWlmIChidXNfcGVyZl9jbGllbnQpIHsKLQkJCXJjID0gbXNtX2J1c19zY2FsZV9jbGllbnRfdXBkYXRlX3JlcXVlc3QoCi0JCQkJYnVzX3BlcmZfY2xpZW50LCA0KTsKLQkJCUNEQkcoIiVzOiBTX1pTTCByYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQl9IGVsc2UKLQkJCUNEQkcoIiVzOiBCdXMgQ2xpZW50IE5PVCBSZWdpc3RlcmVkISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgU19MSVZFU0hPVDoKLQkJaWYgKGJ1c19wZXJmX2NsaWVudCkgewotCQkJcmMgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdCgKLQkJCQlidXNfcGVyZl9jbGllbnQsIDUpOwotCQkJQ0RCRygiJXM6IFNfTElWRVNIT1QgcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJfSBlbHNlCi0JCQlDREJHKCIlczogQnVzIENsaWVudCBOT1QgUmVnaXN0ZXJlZCEhIVxuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIFNfRFVBTDoKLQkJaWYgKGJ1c19wZXJmX2NsaWVudCkgewotCQkJcmMgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdCgKLQkJCQlidXNfcGVyZl9jbGllbnQsIDYpOwotCQkJQ0RCRygiJXM6IFNfRFVBTCByYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQl9IGVsc2UKLQkJCUNEQkcoIiVzOiBCdXMgQ2xpZW50IE5PVCBSZWdpc3RlcmVkISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgU19BRFZfVklERU86Ci0JCWlmIChidXNfcGVyZl9jbGllbnQpIHsKLQkJCXJjID0gbXNtX2J1c19zY2FsZV9jbGllbnRfdXBkYXRlX3JlcXVlc3QoCi0JCQkJYnVzX3BlcmZfY2xpZW50LCA3KTsKLQkJCUNEQkcoIiVzOiBTX0FEVl9WSURFTyByYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQl9IGVsc2UKLQkJCUNEQkcoIiVzOiBCdXMgQ2xpZW50IE5PVCBSZWdpc3RlcmVkISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgU19ERUZBVUxUOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl93YXJuaW5nKCIlczogSU5WQUxJRCBDQVNFXG4iLCBfX2Z1bmNfXyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvL21zbV9pb184eDYwLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW8vbXNtX2lvXzh4NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg5NjUzOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW8vbXNtX2lvXzh4NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDgyMCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL3ZyZWcuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgPG1hY2gvY2xrLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fYnVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fYnVzX2JvYXJkLmg+Ci0KLQotLyogTUlQSQlDU0kJY29udHJvbGxlciByZWdpc3RlcnMgKi8KLSNkZWZpbmUJTUlQSV9QSFlfQ09OVFJPTAkJCTB4MDAwMDAwMDAKLSNkZWZpbmUJTUlQSV9QUk9UT0NPTF9DT05UUk9MCQkweDAwMDAwMDA0Ci0jZGVmaW5lCU1JUElfSU5URVJSVVBUX1NUQVRVUwkJMHgwMDAwMDAwOAotI2RlZmluZQlNSVBJX0lOVEVSUlVQVF9NQVNLCQkJMHgwMDAwMDAwQwotI2RlZmluZQlNSVBJX0NBTUVSQV9DTlRMCQkJMHgwMDAwMDAyNAotI2RlZmluZQlNSVBJX0NBTElCUkFUSU9OX0NPTlRST0wJMHgwMDAwMDAxOAotI2RlZmluZQlNSVBJX1BIWV9EMF9DT05UUk9MMgkJMHgwMDAwMDAzOAotI2RlZmluZQlNSVBJX1BIWV9EMV9DT05UUk9MMgkJMHgwMDAwMDAzQwotI2RlZmluZQlNSVBJX1BIWV9EMl9DT05UUk9MMgkJMHgwMDAwMDA0MAotI2RlZmluZQlNSVBJX1BIWV9EM19DT05UUk9MMgkJMHgwMDAwMDA0NAotI2RlZmluZQlNSVBJX1BIWV9DTF9DT05UUk9MCQkJMHgwMDAwMDA0OAotI2RlZmluZQlNSVBJX1BIWV9EMF9DT05UUk9MCQkJMHgwMDAwMDAzNAotI2RlZmluZQlNSVBJX1BIWV9EMV9DT05UUk9MCQkJMHgwMDAwMDAyMAotI2RlZmluZQlNSVBJX1BIWV9EMl9DT05UUk9MCQkJMHgwMDAwMDAyQwotI2RlZmluZQlNSVBJX1BIWV9EM19DT05UUk9MCQkJMHgwMDAwMDAzMAotI2RlZmluZQlNSVBJX1BST1RPQ09MX0NPTlRST0xfU1dfUlNUX0JNU0sJCQkweDgwMDAwMDAKLSNkZWZpbmUJTUlQSV9QUk9UT0NPTF9DT05UUk9MX0xPTkdfUEFDS0VUX0hFQURFUl9DQVBUVVJFX0JNU0sJMHgyMDAwMDAKLSNkZWZpbmUJTUlQSV9QUk9UT0NPTF9DT05UUk9MX0RBVEFfRk9STUFUX0JNU0sJCQkweDE4MDAwMAotI2RlZmluZQlNSVBJX1BST1RPQ09MX0NPTlRST0xfREVDT0RFX0lEX0JNU0sJCQkweDQwMDAwCi0jZGVmaW5lCU1JUElfUFJPVE9DT0xfQ09OVFJPTF9FQ0NfRU5fQk1TSwkJCTB4MjAwMDAKLSNkZWZpbmUJTUlQSV9DQUxJQlJBVElPTl9DT05UUk9MX1NXQ0FMX0NBTF9FTl9TSEZUCQkweDE2Ci0jZGVmaW5lCU1JUElfQ0FMSUJSQVRJT05fQ09OVFJPTF9TV0NBTF9TVFJFTkdUSF9PVkVSUklERV9FTl9TSEZUCTB4MTUKLSNkZWZpbmUJTUlQSV9DQUxJQlJBVElPTl9DT05UUk9MX0NBTF9TV19IV19NT0RFX1NIRlQJCTB4MTQKLSNkZWZpbmUJTUlQSV9DQUxJQlJBVElPTl9DT05UUk9MX01BTlVBTF9PVkVSUklERV9FTl9TSEZUCTB4NwotI2RlZmluZQlNSVBJX1BST1RPQ09MX0NPTlRST0xfREFUQV9GT1JNQVRfU0hGVAkJCTB4MTMKLSNkZWZpbmUJTUlQSV9QUk9UT0NPTF9DT05UUk9MX0RQQ01fU0NIRU1FX1NIRlQJCQkweDFlCi0jZGVmaW5lCU1JUElfUEhZX0QwX0NPTlRST0wyX1NFVFRMRV9DT1VOVF9TSEZUCQkJMHgxOAotI2RlZmluZQlNSVBJX1BIWV9EMF9DT05UUk9MMl9IU19URVJNX0lNUF9TSEZUCQkJMHgxMAotI2RlZmluZQlNSVBJX1BIWV9EMF9DT05UUk9MMl9MUF9SRUNfRU5fU0hGVAkJCQkweDQKLSNkZWZpbmUJTUlQSV9QSFlfRDBfQ09OVFJPTDJfRVJSX1NPVF9IU19FTl9TSEZUCQkJMHgzCi0jZGVmaW5lCU1JUElfUEhZX0QxX0NPTlRST0wyX1NFVFRMRV9DT1VOVF9TSEZUCQkJMHgxOAotI2RlZmluZQlNSVBJX1BIWV9EMV9DT05UUk9MMl9IU19URVJNX0lNUF9TSEZUCQkJMHgxMAotI2RlZmluZQlNSVBJX1BIWV9EMV9DT05UUk9MMl9MUF9SRUNfRU5fU0hGVAkJCQkweDQKLSNkZWZpbmUJTUlQSV9QSFlfRDFfQ09OVFJPTDJfRVJSX1NPVF9IU19FTl9TSEZUCQkJMHgzCi0jZGVmaW5lCU1JUElfUEhZX0QyX0NPTlRST0wyX1NFVFRMRV9DT1VOVF9TSEZUCQkJMHgxOAotI2RlZmluZQlNSVBJX1BIWV9EMl9DT05UUk9MMl9IU19URVJNX0lNUF9TSEZUCQkJMHgxMAotI2RlZmluZQlNSVBJX1BIWV9EMl9DT05UUk9MMl9MUF9SRUNfRU5fU0hGVAkJCQkweDQKLSNkZWZpbmUJTUlQSV9QSFlfRDJfQ09OVFJPTDJfRVJSX1NPVF9IU19FTl9TSEZUCQkJMHgzCi0jZGVmaW5lCU1JUElfUEhZX0QzX0NPTlRST0wyX1NFVFRMRV9DT1VOVF9TSEZUCQkJMHgxOAotI2RlZmluZQlNSVBJX1BIWV9EM19DT05UUk9MMl9IU19URVJNX0lNUF9TSEZUCQkJMHgxMAotI2RlZmluZQlNSVBJX1BIWV9EM19DT05UUk9MMl9MUF9SRUNfRU5fU0hGVAkJCQkweDQKLSNkZWZpbmUJTUlQSV9QSFlfRDNfQ09OVFJPTDJfRVJSX1NPVF9IU19FTl9TSEZUCQkJMHgzCi0jZGVmaW5lCU1JUElfUEhZX0NMX0NPTlRST0xfSFNfVEVSTV9JTVBfU0hGVAkJCTB4MTgKLSNkZWZpbmUJTUlQSV9QSFlfQ0xfQ09OVFJPTF9MUF9SRUNfRU5fU0hGVAkJCQkweDIKLSNkZWZpbmUJTUlQSV9QSFlfRDBfQ09OVFJPTF9IU19SRUNfRVFfU0hGVAkJCQkweDFjCi0jZGVmaW5lCU1JUElfUEhZX0QxX0NPTlRST0xfTUlQSV9DTEtfUEhZX1NIVVRET1dOQl9TSEZUCQkweDkKLSNkZWZpbmUJTUlQSV9QSFlfRDFfQ09OVFJPTF9NSVBJX0RBVEFfUEhZX1NIVVRET1dOQl9TSEZUCTB4OAotI2RlZmluZQlEQkdfQ1NJCTAKLQotc3RhdGljIHN0cnVjdCBjbGsgKmNhbWlvX2NhbV9jbGs7Ci1zdGF0aWMgc3RydWN0IGNsayAqY2FtaW9fdmZlX2NsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpjYW1pb19jc2lfc3JjX2NsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpjYW1pb19jc2kwX3ZmZV9jbGs7Ci1zdGF0aWMgc3RydWN0IGNsayAqY2FtaW9fY3NpMV92ZmVfY2xrOwotc3RhdGljIHN0cnVjdCBjbGsgKmNhbWlvX2NzaTBfY2xrOwotc3RhdGljIHN0cnVjdCBjbGsgKmNhbWlvX2NzaTFfY2xrOwotc3RhdGljIHN0cnVjdCBjbGsgKmNhbWlvX2NzaTBfcGNsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpjYW1pb19jc2kxX3BjbGs7Ci1zdGF0aWMgc3RydWN0IGNsayAqY2FtaW9fdmZlX3BjbGs7Ci1zdGF0aWMgc3RydWN0IGNsayAqY2FtaW9fdnBlX2NsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpjYW1pb192cGVfcGNsazsKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yICpmc192ZmU7Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvciAqZnNfdnBlOwotc3RhdGljIHN0cnVjdCByZWd1bGF0b3IgKmxkbzE1Owotc3RhdGljIHN0cnVjdCByZWd1bGF0b3IgKmx2czA7Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvciAqbGRvMjU7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pb19leHQgY2FtaW9fZXh0Owotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2lvX2NsayBjYW1pb19jbGs7Ci1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY2FtaW9fZGV2Owotc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqY3NpaW87Ci12b2lkIF9faW9tZW0gKmNzaWJhc2U7Ci1zdGF0aWMgaW50IHZwZV9jbGtfcmF0ZTsKLXN0cnVjdCBtc21fYnVzX3NjYWxlX3BkYXRhICpjYW1fYnVzX3NjYWxlX3RhYmxlOwotCi1zdGF0aWMgdm9pZCBtc21fY2FtZXJhX3ZyZWdfZW5hYmxlKHZvaWQpCi17Ci0JbGRvMTUgPSByZWd1bGF0b3JfZ2V0KE5VTEwsICI4MDU4X2wxNSIpOwotCWlmIChJU19FUlIobGRvMTUpKSB7Ci0JCXByX2VycigiJXM6IFZSRUcgTERPMTUgZ2V0IGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlsZG8xNSA9IE5VTEw7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHJlZ3VsYXRvcl9zZXRfdm9sdGFnZShsZG8xNSwgMjg1MDAwMCwgMjg1MDAwMCkpIHsKLQkJcHJfZXJyKCIlczogVlJFRyBMRE8xNSBzZXQgdm9sdGFnZSBmYWlsZWRcbiIsICBfX2Z1bmNfXyk7Ci0JCWdvdG8gbGRvMTVfZGlzYWJsZTsKLQl9Ci0JaWYgKHJlZ3VsYXRvcl9lbmFibGUobGRvMTUpKSB7Ci0JCXByX2VycigiJXM6IFZSRUcgTERPMTUgZW5hYmxlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGxkbzE1X3B1dDsKLQl9Ci0KLQlsdnMwID0gcmVndWxhdG9yX2dldChOVUxMLCAiODA1OF9sdnMwIik7Ci0JaWYgKElTX0VSUihsdnMwKSkgewotCQlwcl9lcnIoIiVzOiBWUkVHIExWUzAgZ2V0IGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlsdnMwID0gTlVMTDsKLQkJZ290byBsZG8xNV9kaXNhYmxlOwotCX0KLQlpZiAocmVndWxhdG9yX2VuYWJsZShsdnMwKSkgewotCQlwcl9lcnIoIiVzOiBWUkVHIExWUzAgZW5hYmxlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGx2czBfcHV0OwotCX0KLQotCWxkbzI1ID0gcmVndWxhdG9yX2dldChOVUxMLCAiODA1OF9sMjUiKTsKLQlpZiAoSVNfRVJSKGxkbzI1KSkgewotCQlwcl9lcnIoIiVzOiBWUkVHIExETzI1IGdldCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJbGRvMjUgPSBOVUxMOwotCQlnb3RvIGx2czBfZGlzYWJsZTsKLQl9Ci0JaWYgKHJlZ3VsYXRvcl9zZXRfdm9sdGFnZShsZG8yNSwgMTIwMDAwMCwgMTIwMDAwMCkpIHsKLQkJcHJfZXJyKCIlczogVlJFRyBMRE8yNSBzZXQgdm9sdGFnZSBmYWlsZWRcbiIsICBfX2Z1bmNfXyk7Ci0JCWdvdG8gbGRvMjVfZGlzYWJsZTsKLQl9Ci0JaWYgKHJlZ3VsYXRvcl9lbmFibGUobGRvMjUpKSB7Ci0JCXByX2VycigiJXM6IFZSRUcgTERPMjUgZW5hYmxlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGxkbzI1X3B1dDsKLQl9Ci0KLQlmc192ZmUgPSByZWd1bGF0b3JfZ2V0KE5VTEwsICJmc192ZmUiKTsKLQlpZiAoSVNfRVJSKGZzX3ZmZSkpIHsKLQkJQ0RCRygiJXM6IFJlZ3VsYXRvciBGU19WRkUgZ2V0IGZhaWxlZCAlbGRcbiIsIF9fZnVuY19fLAotCQkJUFRSX0VSUihmc192ZmUpKTsKLQkJZnNfdmZlID0gTlVMTDsKLQl9IGVsc2UgaWYgKHJlZ3VsYXRvcl9lbmFibGUoZnNfdmZlKSkgewotCQlDREJHKCIlczogUmVndWxhdG9yIEZTX1ZGRSBlbmFibGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJlZ3VsYXRvcl9wdXQoZnNfdmZlKTsKLQl9Ci0JcmV0dXJuOwotCi1sZG8yNV9kaXNhYmxlOgotCXJlZ3VsYXRvcl9kaXNhYmxlKGxkbzI1KTsKLWxkbzI1X3B1dDoKLQlyZWd1bGF0b3JfcHV0KGxkbzI1KTsKLWx2czBfZGlzYWJsZToKLQlyZWd1bGF0b3JfZGlzYWJsZShsdnMwKTsKLWx2czBfcHV0OgotCXJlZ3VsYXRvcl9wdXQobHZzMCk7Ci1sZG8xNV9kaXNhYmxlOgotCXJlZ3VsYXRvcl9kaXNhYmxlKGxkbzE1KTsKLWxkbzE1X3B1dDoKLQlyZWd1bGF0b3JfcHV0KGxkbzE1KTsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2NhbWVyYV92cmVnX2Rpc2FibGUodm9pZCkKLXsKLQlpZiAobGRvMTUpIHsKLQkJcmVndWxhdG9yX2Rpc2FibGUobGRvMTUpOwotCQlyZWd1bGF0b3JfcHV0KGxkbzE1KTsKLQl9Ci0KLQlpZiAobHZzMCkgewotCQlyZWd1bGF0b3JfZGlzYWJsZShsdnMwKTsKLQkJcmVndWxhdG9yX3B1dChsdnMwKTsKLQl9Ci0KLQlpZiAobGRvMjUpIHsKLQkJcmVndWxhdG9yX2Rpc2FibGUobGRvMjUpOwotCQlyZWd1bGF0b3JfcHV0KGxkbzI1KTsKLQl9Ci0KLQlpZiAoZnNfdmZlKSB7Ci0JCXJlZ3VsYXRvcl9kaXNhYmxlKGZzX3ZmZSk7Ci0JCXJlZ3VsYXRvcl9wdXQoZnNfdmZlKTsKLQl9Ci19Ci0KLWludCBtc21fY2FtaW9fY2xrX2VuYWJsZShlbnVtIG1zbV9jYW1pb19jbGtfdHlwZSBjbGt0eXBlKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKLQotCXN3aXRjaCAoY2xrdHlwZSkgewotCWNhc2UgQ0FNSU9fQ0FNX01DTEtfQ0xLOgotCQljYW1pb19jYW1fY2xrID0KLQkJY2xrID0gY2xrX2dldChOVUxMLCAiY2FtX2NsayIpOwotCQltc21fY2FtaW9fY2xrX3JhdGVfc2V0XzIoY2xrLCBjYW1pb19jbGsubWNsa19jbGtfcmF0ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19WRkVfQ0xLOgotCQljYW1pb192ZmVfY2xrID0KLQkJY2xrID0gY2xrX2dldChOVUxMLCAidmZlX2NsayIpOwotCQltc21fY2FtaW9fY2xrX3JhdGVfc2V0XzIoY2xrLCBjYW1pb19jbGsudmZlX2Nsa19yYXRlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX0NTSTBfVkZFX0NMSzoKLQkJY2FtaW9fY3NpMF92ZmVfY2xrID0KLQkJY2xrID0gY2xrX2dldChOVUxMLCAiY3NpX3ZmZV9jbGsiKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX0NTSTFfVkZFX0NMSzoKLQkJY2FtaW9fY3NpMV92ZmVfY2xrID0KLQkJY2xrID0gY2xrX2dldCgmY2FtaW9fZGV2LT5kZXYsICJjc2lfdmZlX2NsayIpOwotCQlicmVhazsKLQotCWNhc2UgQ0FNSU9fQ1NJX1NSQ19DTEs6Ci0JCWNhbWlvX2NzaV9zcmNfY2xrID0KLQkJY2xrID0gY2xrX2dldChOVUxMLCAiY3NpX3NyY19jbGsiKTsKLQkJbXNtX2NhbWlvX2Nsa19yYXRlX3NldF8yKGNsaywgMzg0MDAwMDAwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX0NTSTBfQ0xLOgotCQljYW1pb19jc2kwX2NsayA9Ci0JCWNsayA9IGNsa19nZXQoTlVMTCwgImNzaV9jbGsiKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX0NTSTFfQ0xLOgotCQljYW1pb19jc2kxX2NsayA9Ci0JCWNsayA9IGNsa19nZXQoJmNhbWlvX2Rldi0+ZGV2LCAiY3NpX2NsayIpOwotCQlicmVhazsKLQotCWNhc2UgQ0FNSU9fVkZFX1BDTEs6Ci0JCWNhbWlvX3ZmZV9wY2xrID0KLQkJY2xrID0gY2xrX2dldChOVUxMLCAidmZlX3BjbGsiKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX0NTSTBfUENMSzoKLQkJY2FtaW9fY3NpMF9wY2xrID0KLQkJY2xrID0gY2xrX2dldChOVUxMLCAiY3NpX3BjbGsiKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX0NTSTFfUENMSzoKLQkJY2FtaW9fY3NpMV9wY2xrID0KLQkJY2xrID0gY2xrX2dldCgmY2FtaW9fZGV2LT5kZXYsICJjc2lfcGNsayIpOwotCQlicmVhazsKLQotCWNhc2UgQ0FNSU9fVlBFX0NMSzoKLQkJY2FtaW9fdnBlX2NsayA9Ci0JCWNsayA9IGNsa19nZXQoTlVMTCwgInZwZV9jbGsiKTsKLQkJdnBlX2Nsa19yYXRlID0gY2xrX3JvdW5kX3JhdGUoY2FtaW9fdnBlX2NsaywgdnBlX2Nsa19yYXRlKTsKLQkJY2xrX3NldF9yYXRlKGNhbWlvX3ZwZV9jbGssIHZwZV9jbGtfcmF0ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19WUEVfUENMSzoKLQkJY2FtaW9fdnBlX3BjbGsgPQotCQljbGsgPSBjbGtfZ2V0KE5VTEwsICJ2cGVfcGNsayIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmICghSVNfRVJSKGNsaykpCi0JCWNsa19lbmFibGUoY2xrKTsKLQllbHNlCi0JCXJjID0gLTE7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2NhbWlvX2Nsa19kaXNhYmxlKGVudW0gbXNtX2NhbWlvX2Nsa190eXBlIGNsa3R5cGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwotCi0Jc3dpdGNoIChjbGt0eXBlKSB7Ci0JY2FzZSBDQU1JT19DQU1fTUNMS19DTEs6Ci0JCWNsayA9IGNhbWlvX2NhbV9jbGs7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19WRkVfQ0xLOgotCQljbGsgPSBjYW1pb192ZmVfY2xrOwotCQlicmVhazsKLQotCWNhc2UgQ0FNSU9fQ1NJX1NSQ19DTEs6Ci0JCWNsayA9IGNhbWlvX2NzaV9zcmNfY2xrOwotCQlicmVhazsKLQotCWNhc2UgQ0FNSU9fQ1NJMF9WRkVfQ0xLOgotCQljbGsgPSBjYW1pb19jc2kwX3ZmZV9jbGs7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19DU0kxX1ZGRV9DTEs6Ci0JCWNsayA9IGNhbWlvX2NzaTFfdmZlX2NsazsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX0NTSTBfQ0xLOgotCQljbGsgPSBjYW1pb19jc2kwX2NsazsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX0NTSTFfQ0xLOgotCQljbGsgPSBjYW1pb19jc2kxX2NsazsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX1ZGRV9QQ0xLOgotCQljbGsgPSBjYW1pb192ZmVfcGNsazsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX0NTSTBfUENMSzoKLQkJY2xrID0gY2FtaW9fY3NpMF9wY2xrOwotCQlicmVhazsKLQotCWNhc2UgQ0FNSU9fQ1NJMV9QQ0xLOgotCQljbGsgPSBjYW1pb19jc2kxX3BjbGs7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19WUEVfQ0xLOgotCQljbGsgPSBjYW1pb192cGVfY2xrOwotCQlicmVhazsKLQotCWNhc2UgQ0FNSU9fVlBFX1BDTEs6Ci0JCWNsayA9IGNhbWlvX3ZwZV9wY2xrOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmICghSVNfRVJSKGNsaykpIHsKLQkJY2xrX2Rpc2FibGUoY2xrKTsKLQkJY2xrX3B1dChjbGspOwotCX0gZWxzZQotCQlyYyA9IC0xOwotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9jYW1pb192ZmVfY2xrX3JhdGVfc2V0KGludCByYXRlKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGNsayAqY2xrID0gY2FtaW9fdmZlX2NsazsKLQlpZiAocmF0ZSA+IGNsa19nZXRfcmF0ZShjbGspKQotCQlyYyA9IGNsa19zZXRfcmF0ZShjbGssIHJhdGUpOwotCXJldHVybiByYzsKLX0KLQotdm9pZCBtc21fY2FtaW9fY2xrX3JhdGVfc2V0KGludCByYXRlKQotewotCXN0cnVjdCBjbGsgKmNsayA9IGNhbWlvX2NhbV9jbGs7Ci0JY2xrX3NldF9yYXRlKGNsaywgcmF0ZSk7Ci19Ci0KLXZvaWQgbXNtX2NhbWlvX2Nsa19yYXRlX3NldF8yKHN0cnVjdCBjbGsgKmNsaywgaW50IHJhdGUpCi17Ci0JY2xrX3NldF9yYXRlKGNsaywgcmF0ZSk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBtc21faW9fY3NpX2lycShpbnQgaXJxX251bSwgdm9pZCAqZGF0YSkKLXsKLQl1aW50MzJfdCBpcnEgPSAwOwotCWlmIChjc2liYXNlICE9IE5VTEwpCi0JCWlycSA9IG1zbV9jYW1lcmFfaW9fcihjc2liYXNlICsgTUlQSV9JTlRFUlJVUFRfU1RBVFVTKTsKLQlDREJHKCIlcyBNSVBJX0lOVEVSUlVQVF9TVEFUVVMgPSAweCV4XG4iLCBfX2Z1bmNfXywgaXJxKTsKLQlpZiAoY3NpYmFzZSAhPSBOVUxMKQotCQltc21fY2FtZXJhX2lvX3coaXJxLCBjc2liYXNlICsgTUlQSV9JTlRFUlJVUFRfU1RBVFVTKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLWludCBtc21fY2FtaW9fdnBlX2Nsa19kaXNhYmxlKHZvaWQpCi17Ci0JaW50IHJjID0gMDsKLQlpZiAoZnNfdnBlKSB7Ci0JCXJlZ3VsYXRvcl9kaXNhYmxlKGZzX3ZwZSk7Ci0JCXJlZ3VsYXRvcl9wdXQoZnNfdnBlKTsKLQl9Ci0KLQlyYyA9IG1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19WUEVfQ0xLKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0JcmMgPSBtc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fVlBFX1BDTEspOwotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9jYW1pb192cGVfY2xrX2VuYWJsZSh1aW50MzJfdCBjbGtfcmF0ZSkKLXsKLQlpbnQgcmMgPSAwOwotCWZzX3ZwZSA9IHJlZ3VsYXRvcl9nZXQoTlVMTCwgImZzX3ZwZSIpOwotCWlmIChJU19FUlIoZnNfdnBlKSkgewotCQlDREJHKCIlczogUmVndWxhdG9yIEZTX1ZQRSBnZXQgZmFpbGVkICVsZFxuIiwgX19mdW5jX18sCi0JCQlQVFJfRVJSKGZzX3ZwZSkpOwotCQlmc192cGUgPSBOVUxMOwotCX0gZWxzZSBpZiAocmVndWxhdG9yX2VuYWJsZShmc192cGUpKSB7Ci0JCUNEQkcoIiVzOiBSZWd1bGF0b3IgRlNfVlBFIGVuYWJsZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmVndWxhdG9yX3B1dChmc192cGUpOwotCX0KLQotCXZwZV9jbGtfcmF0ZSA9IGNsa19yYXRlOwotCXJjID0gbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fVlBFX0NMSyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBtc21fY2FtaW9fY2xrX2VuYWJsZShDQU1JT19WUEVfUENMSyk7Ci0JcmV0dXJuIHJjOwotfQotCi0jaWZkZWYgREJHX0NTSQotc3RhdGljIGludCBjc2lfcmVxdWVzdF9pcnEodm9pZCkKLXsKLQlyZXR1cm4gcmVxdWVzdF9pcnEoY2FtaW9fZXh0LmNzaWlycSwgbXNtX2lvX2NzaV9pcnEsCi0JCUlSUUZfVFJJR0dFUl9ISUdILCAiY3NpIiwgMCk7Ci19Ci0jZWxzZQotc3RhdGljIGludCBjc2lfcmVxdWVzdF9pcnEodm9pZCkgeyByZXR1cm4gMDsgfQotI2VuZGlmCi0KLSNpZmRlZiBEQkdfQ1NJCi1zdGF0aWMgdm9pZCBjc2lfZnJlZV9pcnEodm9pZCkKLXsKLQlmcmVlX2lycShjYW1pb19leHQuY3NpaXJxLCAwKTsKLX0KLSNlbHNlCi1zdGF0aWMgdm9pZCBjc2lfZnJlZV9pcnEodm9pZCkgeyByZXR1cm4gMDsgfQotI2VuZGlmCi0KLWludCBtc21fY2FtaW9fZW5hYmxlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2luZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9kZXZpY2VfcGxhdGZvcm1fZGF0YSAqY2FtZGV2ID0gc2luZm8tPnBkYXRhOwotCWNhbWlvX2RldiA9IHBkZXY7Ci0JY2FtaW9fZXh0ID0gY2FtZGV2LT5pb2V4dDsKLQljYW1pb19jbGsgPSBjYW1kZXYtPmlvY2xrOwotCWNhbV9idXNfc2NhbGVfdGFibGUgPSBjYW1kZXYtPmNhbV9idXNfc2NhbGVfdGFibGU7Ci0KLQltc21fY2FtaW9fY2xrX2VuYWJsZShDQU1JT19WRkVfQ0xLKTsKLQltc21fY2FtaW9fY2xrX2VuYWJsZShDQU1JT19DU0kwX1ZGRV9DTEspOwotCW1zbV9jYW1pb19jbGtfZW5hYmxlKENBTUlPX0NTSTFfVkZFX0NMSyk7Ci0JbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fQ1NJX1NSQ19DTEspOwotCW1zbV9jYW1pb19jbGtfZW5hYmxlKENBTUlPX0NTSTBfQ0xLKTsKLQltc21fY2FtaW9fY2xrX2VuYWJsZShDQU1JT19DU0kxX0NMSyk7Ci0JbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fVkZFX1BDTEspOwotCW1zbV9jYW1pb19jbGtfZW5hYmxlKENBTUlPX0NTSTBfUENMSyk7Ci0JbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fQ1NJMV9QQ0xLKTsKLQotCWNzaWlvID0gcmVxdWVzdF9tZW1fcmVnaW9uKGNhbWlvX2V4dC5jc2lwaHksCi0JCWNhbWlvX2V4dC5jc2lzeiwgcGRldi0+bmFtZSk7Ci0JaWYgKCFjc2lpbykgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBjb21tb25fZmFpbDsKLQl9Ci0JY3NpYmFzZSA9IGlvcmVtYXAoY2FtaW9fZXh0LmNzaXBoeSwKLQkJY2FtaW9fZXh0LmNzaXN6KTsKLQlpZiAoIWNzaWJhc2UpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGNzaV9idXN5OwotCX0KLQlyYyA9IGNzaV9yZXF1ZXN0X2lycSgpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gY3NpX2lycV9mYWlsOwotCi0JcmV0dXJuIDA7Ci0KLWNzaV9pcnFfZmFpbDoKLQlpb3VubWFwKGNzaWJhc2UpOwotCWNzaWJhc2UgPSBOVUxMOwotY3NpX2J1c3k6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGNhbWlvX2V4dC5jc2lwaHksIGNhbWlvX2V4dC5jc2lzeik7Ci0JY3NpYmFzZSA9IE5VTEw7Ci1jb21tb25fZmFpbDoKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ0FNX01DTEtfQ0xLKTsKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ1NJMF9WRkVfQ0xLKTsKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ1NJMF9DTEspOwotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19DU0kxX1ZGRV9DTEspOwotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19DU0kxX0NMSyk7Ci0JbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX1ZGRV9QQ0xLKTsKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ1NJMF9QQ0xLKTsKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ1NJMV9QQ0xLKTsKLQltc21fY2FtZXJhX3ZyZWdfZGlzYWJsZSgpOwotCWNhbWRldi0+Y2FtZXJhX2dwaW9fb2ZmKCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBtc21fY2FtaW9fY3NpX2Rpc2FibGUodm9pZCkKLXsKLQl1aW50MzJfdCB2YWw7Ci0KLQl2YWwgPSAweDA7Ci0JaWYgKGNzaWJhc2UgIT0gTlVMTCkgewotCQlDREJHKCIlcyBNSVBJX1BIWV9EMF9DT05UUk9MMiB2YWw9MHgleFxuIiwgX19mdW5jX18sIHZhbCk7Ci0JCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWJhc2UgKyBNSVBJX1BIWV9EMF9DT05UUk9MMik7Ci0JCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWJhc2UgKyBNSVBJX1BIWV9EMV9DT05UUk9MMik7Ci0JCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWJhc2UgKyBNSVBJX1BIWV9EMl9DT05UUk9MMik7Ci0JCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWJhc2UgKyBNSVBJX1BIWV9EM19DT05UUk9MMik7Ci0JCUNEQkcoIiVzIE1JUElfUEhZX0NMX0NPTlRST0wgdmFsPTB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOwotCQltc21fY2FtZXJhX2lvX3codmFsLCBjc2liYXNlICsgTUlQSV9QSFlfQ0xfQ09OVFJPTCk7Ci0JCW1zbGVlcCgyMCk7Ci0JCXZhbCA9IG1zbV9jYW1lcmFfaW9fcihjc2liYXNlICsgTUlQSV9QSFlfRDFfQ09OVFJPTCk7Ci0JCXZhbCAmPQotCQl+KCgweDEgPDwgTUlQSV9QSFlfRDFfQ09OVFJPTF9NSVBJX0NMS19QSFlfU0hVVERPV05CX1NIRlQpCi0JCXwoMHgxIDw8IE1JUElfUEhZX0QxX0NPTlRST0xfTUlQSV9EQVRBX1BIWV9TSFVURE9XTkJfU0hGVCkpOwotCQlDREJHKCIlcyBNSVBJX1BIWV9EMV9DT05UUk9MIHZhbD0weCV4XG4iLCBfX2Z1bmNfXywgdmFsKTsKLQkJbXNtX2NhbWVyYV9pb193KHZhbCwgY3NpYmFzZSArIE1JUElfUEhZX0QxX0NPTlRST0wpOwotCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNjAwMCk7Ci0JCW1zbV9jYW1lcmFfaW9fdygweDAsIGNzaWJhc2UgKyBNSVBJX0lOVEVSUlVQVF9NQVNLKTsKLQkJbXNtX2NhbWVyYV9pb193KDB4MCwgY3NpYmFzZSArIE1JUElfSU5URVJSVVBUX1NUQVRVUyk7Ci0JCWNzaV9mcmVlX2lycSgpOwotCQlpb3VubWFwKGNzaWJhc2UpOwotCQljc2liYXNlID0gTlVMTDsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKGNhbWlvX2V4dC5jc2lwaHksIGNhbWlvX2V4dC5jc2lzeik7Ci0JfQotfQotdm9pZCBtc21fY2FtaW9fZGlzYWJsZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCUNEQkcoImRpc2FibGUgbWlwaVxuIik7Ci0JbXNtX2NhbWlvX2NzaV9kaXNhYmxlKCk7Ci0JQ0RCRygiZGlzYWJsZSBjbG9ja3NcbiIpOwotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19DU0kwX1ZGRV9DTEspOwotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19DU0kwX0NMSyk7Ci0JbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX0NTSTFfVkZFX0NMSyk7Ci0JbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX0NTSTFfQ0xLKTsKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fVkZFX1BDTEspOwotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19DU0kwX1BDTEspOwotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19DU0kxX1BDTEspOwotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19DU0lfU1JDX0NMSyk7Ci0JbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX1ZGRV9DTEspOwotfQotCi1pbnQgbXNtX2NhbWlvX3NlbnNvcl9jbGtfb24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBtc21fY2FtZXJhX2RldmljZV9wbGF0Zm9ybV9kYXRhICpjYW1kZXYgPSBzaW5mby0+cGRhdGE7Ci0JY2FtaW9fZGV2ID0gcGRldjsKLQljYW1pb19leHQgPSBjYW1kZXYtPmlvZXh0OwotCWNhbWlvX2NsayA9IGNhbWRldi0+aW9jbGs7Ci0KLQltc21fY2FtZXJhX3ZyZWdfZW5hYmxlKCk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7Ci0JcmMgPSBjYW1kZXYtPmNhbWVyYV9ncGlvX29uKCk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXJldHVybiBtc21fY2FtaW9fY2xrX2VuYWJsZShDQU1JT19DQU1fTUNMS19DTEspOwotfQotCi1pbnQgbXNtX2NhbWlvX3NlbnNvcl9jbGtfb2ZmKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNpbmZvID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfZGV2aWNlX3BsYXRmb3JtX2RhdGEgKmNhbWRldiA9IHNpbmZvLT5wZGF0YTsKLQltc21fY2FtZXJhX3ZyZWdfZGlzYWJsZSgpOwotCWNhbWRldi0+Y2FtZXJhX2dwaW9fb2ZmKCk7Ci0JcmV0dXJuIG1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19DQU1fTUNMS19DTEspOwotCi19Ci0KLXZvaWQgbXNtX2NhbWlvX3ZmZV9ibGtfcmVzZXQodm9pZCkKLXsKLQlyZXR1cm47Ci19Ci0KLWludCBtc21fY2FtaW9fcHJvYmVfb24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBtc21fY2FtZXJhX2RldmljZV9wbGF0Zm9ybV9kYXRhICpjYW1kZXYgPSBzaW5mby0+cGRhdGE7Ci0JY2FtaW9fZGV2ID0gcGRldjsKLQljYW1pb19leHQgPSBjYW1kZXYtPmlvZXh0OwotCWNhbWlvX2NsayA9IGNhbWRldi0+aW9jbGs7Ci0KLQlyYyA9IGNhbWRldi0+Y2FtZXJhX2dwaW9fb24oKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0JbXNtX2NhbWVyYV92cmVnX2VuYWJsZSgpOwotCXJldHVybiBtc21fY2FtaW9fY2xrX2VuYWJsZShDQU1JT19DQU1fTUNMS19DTEspOwotfQotCi1pbnQgbXNtX2NhbWlvX3Byb2JlX29mZihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBtc21fY2FtZXJhX2RldmljZV9wbGF0Zm9ybV9kYXRhICpjYW1kZXYgPSBzaW5mby0+cGRhdGE7Ci0JbXNtX2NhbWVyYV92cmVnX2Rpc2FibGUoKTsKLQljYW1kZXYtPmNhbWVyYV9ncGlvX29mZigpOwotCXJldHVybiBtc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ0FNX01DTEtfQ0xLKTsKLX0KLQotaW50IG1zbV9jYW1pb19jc2lfY29uZmlnKHN0cnVjdCBtc21fY2FtZXJhX2NzaV9wYXJhbXMgKmNzaV9wYXJhbXMpCi17Ci0JaW50IHJjID0gMDsKLQl1aW50MzJfdCB2YWwgPSAwOwotCWludCBpOwotCi0JQ0RCRygibXNtX2NhbWlvX2NzaV9jb25maWdcbiIpOwotCWlmIChjc2liYXNlICE9IE5VTEwpIHsKLQkJLyogU09UX0VDQ19FTiBlbmFibGUgZXJyb3IgY29ycmVjdGlvbiBmb3IgU1lOQyAoZGF0YS1sYW5lKSAqLwotCQltc21fY2FtZXJhX2lvX3coMHg0LCBjc2liYXNlICsgTUlQSV9QSFlfQ09OVFJPTCk7Ci0KLQkJLyogU1dfUlNUIHRvIHRoZSBDU0kgY29yZSAqLwotCQltc21fY2FtZXJhX2lvX3coTUlQSV9QUk9UT0NPTF9DT05UUk9MX1NXX1JTVF9CTVNLLAotCQljc2liYXNlICsgTUlQSV9QUk9UT0NPTF9DT05UUk9MKTsKLQotCQkvKiBQUk9UT0NPTCBDT05UUk9MICovCi0JCXZhbCA9IE1JUElfUFJPVE9DT0xfQ09OVFJPTF9MT05HX1BBQ0tFVF9IRUFERVJfQ0FQVFVSRV9CTVNLIHwKLQkJCU1JUElfUFJPVE9DT0xfQ09OVFJPTF9ERUNPREVfSURfQk1TSyB8Ci0JCQlNSVBJX1BST1RPQ09MX0NPTlRST0xfRUNDX0VOX0JNU0s7Ci0JCXZhbCB8PSAodWludDMyX3QpKGNzaV9wYXJhbXMtPmRhdGFfZm9ybWF0KSA8PAotCQkJTUlQSV9QUk9UT0NPTF9DT05UUk9MX0RBVEFfRk9STUFUX1NIRlQ7Ci0JCXZhbCB8PSBjc2lfcGFyYW1zLT5kcGNtX3NjaGVtZSA8PAotCQkJTUlQSV9QUk9UT0NPTF9DT05UUk9MX0RQQ01fU0NIRU1FX1NIRlQ7Ci0JCUNEQkcoIiVzIE1JUElfUFJPVE9DT0xfQ09OVFJPTCB2YWw9MHgleFxuIiwgX19mdW5jX18sIHZhbCk7Ci0JCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWJhc2UgKyBNSVBJX1BST1RPQ09MX0NPTlRST0wpOwotCi0JCS8qIHNldHRsZV9jbnQgaXMgdmVyeSBzZW5zaXRpdmUgdG8gc3BlZWQhCi0JCWluY3JlYXNlIHRoaXMgdmFsdWUgdG8gcnVuIGF0IGhpZ2hlciBzcGVlZHMgKi8KLQkJdmFsID0gKGNzaV9wYXJhbXMtPnNldHRsZV9jbnQgPDwKLQkJCU1JUElfUEhZX0QwX0NPTlRST0wyX1NFVFRMRV9DT1VOVF9TSEZUKSB8Ci0JCQkoMHgwRiA8PCBNSVBJX1BIWV9EMF9DT05UUk9MMl9IU19URVJNX0lNUF9TSEZUKSB8Ci0JCQkoMHgxIDw8IE1JUElfUEhZX0QwX0NPTlRST0wyX0xQX1JFQ19FTl9TSEZUKSB8Ci0JCQkoMHgxIDw8IE1JUElfUEhZX0QwX0NPTlRST0wyX0VSUl9TT1RfSFNfRU5fU0hGVCk7Ci0JCUNEQkcoIiVzIE1JUElfUEhZX0QwX0NPTlRST0wyIHZhbD0weCV4XG4iLCBfX2Z1bmNfXywgdmFsKTsKLQkJZm9yIChpID0gMDsgaSA8IGNzaV9wYXJhbXMtPmxhbmVfY250OyBpKyspCi0JCQltc21fY2FtZXJhX2lvX3codmFsLAotCQkJCWNzaWJhc2UgKyBNSVBJX1BIWV9EMF9DT05UUk9MMiArIGkgKiA0KTsKLQotCQl2YWwgPSAoMHgwRiA8PCBNSVBJX1BIWV9DTF9DT05UUk9MX0hTX1RFUk1fSU1QX1NIRlQpIHwKLQkJCSgweDEgPDwgTUlQSV9QSFlfQ0xfQ09OVFJPTF9MUF9SRUNfRU5fU0hGVCk7Ci0JCUNEQkcoIiVzIE1JUElfUEhZX0NMX0NPTlRST0wgdmFsPTB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOwotCQltc21fY2FtZXJhX2lvX3codmFsLCBjc2liYXNlICsgTUlQSV9QSFlfQ0xfQ09OVFJPTCk7Ci0KLQkJdmFsID0gMCA8PCBNSVBJX1BIWV9EMF9DT05UUk9MX0hTX1JFQ19FUV9TSEZUOwotCQltc21fY2FtZXJhX2lvX3codmFsLCBjc2liYXNlICsgTUlQSV9QSFlfRDBfQ09OVFJPTCk7Ci0KLQkJdmFsID0KLQkJKDB4MSA8PCBNSVBJX1BIWV9EMV9DT05UUk9MX01JUElfQ0xLX1BIWV9TSFVURE9XTkJfU0hGVCkKLQkJfCgweDEgPDwgTUlQSV9QSFlfRDFfQ09OVFJPTF9NSVBJX0RBVEFfUEhZX1NIVVRET1dOQl9TSEZUKTsKLQkJQ0RCRygiJXMgTUlQSV9QSFlfRDFfQ09OVFJPTCB2YWw9MHgleFxuIiwgX19mdW5jX18sIHZhbCk7Ci0JCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWJhc2UgKyBNSVBJX1BIWV9EMV9DT05UUk9MKTsKLQotCQltc21fY2FtZXJhX2lvX3coMHgwMDAwMDAwMCwgY3NpYmFzZSArIE1JUElfUEhZX0QyX0NPTlRST0wpOwotCQltc21fY2FtZXJhX2lvX3coMHgwMDAwMDAwMCwgY3NpYmFzZSArIE1JUElfUEhZX0QzX0NPTlRST0wpOwotCi0JCS8qIGhhbGN5b24gb25seSBzdXBwb3J0cyAxIG9yIDIgbGFuZSAqLwotCQlzd2l0Y2ggKGNzaV9wYXJhbXMtPmxhbmVfY250KSB7Ci0JCWNhc2UgMToKLQkJCW1zbV9jYW1lcmFfaW9fdyhjc2lfcGFyYW1zLT5sYW5lX2Fzc2lnbiA8PCA4IHwgMHg0LAotCQkJCWNzaWJhc2UgKyBNSVBJX0NBTUVSQV9DTlRMKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQltc21fY2FtZXJhX2lvX3coY3NpX3BhcmFtcy0+bGFuZV9hc3NpZ24gPDwgOCB8IDB4NSwKLQkJCQljc2liYXNlICsgTUlQSV9DQU1FUkFfQ05UTCk7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJbXNtX2NhbWVyYV9pb193KGNzaV9wYXJhbXMtPmxhbmVfYXNzaWduIDw8IDggfCAweDYsCi0JCQkJY3NpYmFzZSArIE1JUElfQ0FNRVJBX0NOVEwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCW1zbV9jYW1lcmFfaW9fdyhjc2lfcGFyYW1zLT5sYW5lX2Fzc2lnbiA8PCA4IHwgMHg3LAotCQkJCWNzaWJhc2UgKyBNSVBJX0NBTUVSQV9DTlRMKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogbWFzayBvdXQgSURfRVJST1JbMTldLCBEQVRBX0NNTV9FUlJbMTFdCi0JCWFuZCBDTEtfQ01NX0VSUlsxMF0gLSBkZS1mZWF0dXJlZCAqLwotCQltc21fY2FtZXJhX2lvX3coMHhGMDE3RjNDMCwgY3NpYmFzZSArIE1JUElfSU5URVJSVVBUX01BU0spOwotCQkvKmNsZWFyIElSUSBiaXRzKi8KLQkJbXNtX2NhbWVyYV9pb193KDB4RjAxN0YzQzAsIGNzaWJhc2UgKyBNSVBJX0lOVEVSUlVQVF9TVEFUVVMpOwotCX0gZWxzZSB7Ci0JCXByX2luZm8oIkNTSUJBU0UgaXMgTlVMTCIpOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotdm9pZCBtc21fY2FtaW9fc2V0X3BlcmZfbHZsKGVudW0gbXNtX2J1c19wZXJmX3NldHRpbmcgcGVyZl9zZXR0aW5nKQotewotCXN0YXRpYyB1aW50MzJfdCBidXNfcGVyZl9jbGllbnQ7Ci0JaW50IHJjID0gMDsKLQlzd2l0Y2ggKHBlcmZfc2V0dGluZykgewotCWNhc2UgU19JTklUOgotCQlidXNfcGVyZl9jbGllbnQgPQotCQkJbXNtX2J1c19zY2FsZV9yZWdpc3Rlcl9jbGllbnQoY2FtX2J1c19zY2FsZV90YWJsZSk7Ci0JCWlmICghYnVzX3BlcmZfY2xpZW50KSB7Ci0JCQlwcl9lcnIoIiVzOiBSZWdpc3RyYXRpb24gRmFpbGVkISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCQlidXNfcGVyZl9jbGllbnQgPSAwOwotCQkJcmV0dXJuOwotCQl9Ci0JCUNEQkcoIiVzOiBTX0lOSVQgcmMgPSAldVxuIiwgX19mdW5jX18sIGJ1c19wZXJmX2NsaWVudCk7Ci0JCWJyZWFrOwotCWNhc2UgU19FWElUOgotCQlpZiAoYnVzX3BlcmZfY2xpZW50KSB7Ci0JCQlDREJHKCIlczogU19FWElUXG4iLCBfX2Z1bmNfXyk7Ci0JCQltc21fYnVzX3NjYWxlX3VucmVnaXN0ZXJfY2xpZW50KGJ1c19wZXJmX2NsaWVudCk7Ci0JCX0gZWxzZQotCQkJcHJfZXJyKCIlczogQnVzIENsaWVudCBOT1QgUmVnaXN0ZXJlZCEhIVxuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIFNfUFJFVklFVzoKLQkJaWYgKGJ1c19wZXJmX2NsaWVudCkgewotCQkJcmMgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdCgKLQkJCQlidXNfcGVyZl9jbGllbnQsIDEpOwotCQkJQ0RCRygiJXM6IFNfUFJFVklFVyByYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQl9IGVsc2UKLQkJCXByX2VycigiJXM6IEJ1cyBDbGllbnQgTk9UIFJlZ2lzdGVyZWQhISFcbiIsIF9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JY2FzZSBTX1ZJREVPOgotCQlpZiAoYnVzX3BlcmZfY2xpZW50KSB7Ci0JCQlyYyA9IG1zbV9idXNfc2NhbGVfY2xpZW50X3VwZGF0ZV9yZXF1ZXN0KAotCQkJCWJ1c19wZXJmX2NsaWVudCwgMik7Ci0JCQlDREJHKCIlczogU19WSURFTyByYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQl9IGVsc2UKLQkJCXByX2VycigiJXM6IEJ1cyBDbGllbnQgTk9UIFJlZ2lzdGVyZWQhISFcbiIsIF9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JY2FzZSBTX0NBUFRVUkU6Ci0JCWlmIChidXNfcGVyZl9jbGllbnQpIHsKLQkJCXJjID0gbXNtX2J1c19zY2FsZV9jbGllbnRfdXBkYXRlX3JlcXVlc3QoCi0JCQkJYnVzX3BlcmZfY2xpZW50LCAzKTsKLQkJCUNEQkcoIiVzOiBTX0NBUFRVUkUgcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJfSBlbHNlCi0JCQlwcl9lcnIoIiVzOiBCdXMgQ2xpZW50IE5PVCBSZWdpc3RlcmVkISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTX1pTTDoKLQkJaWYgKGJ1c19wZXJmX2NsaWVudCkgewotCQkJcmMgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdCgKLQkJCQlidXNfcGVyZl9jbGllbnQsIDQpOwotCQkJQ0RCRygiJXM6IFNfWlNMIHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCX0gZWxzZQotCQkJcHJfZXJyKCIlczogQnVzIENsaWVudCBOT1QgUmVnaXN0ZXJlZCEhIVxuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIFNfU1RFUkVPX1ZJREVPOgotCQlpZiAoYnVzX3BlcmZfY2xpZW50KSB7Ci0JCQlyYyA9IG1zbV9idXNfc2NhbGVfY2xpZW50X3VwZGF0ZV9yZXF1ZXN0KAotCQkJCWJ1c19wZXJmX2NsaWVudCwgNSk7Ci0JCQlDREJHKCIlczogU19TVEVSRU9fVklERU8gcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJfSBlbHNlCi0JCQlwcl9lcnIoIiVzOiBCdXMgQ2xpZW50IE5PVCBSZWdpc3RlcmVkISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgU19TVEVSRU9fQ0FQVFVSRToKLQkJaWYgKGJ1c19wZXJmX2NsaWVudCkgewotCQkJcmMgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdCgKLQkJCQlidXNfcGVyZl9jbGllbnQsIDYpOwotCQkJQ0RCRygiJXM6IFNfU1RFUkVPX1ZJREVPIHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCX0gZWxzZQotCQkJcHJfZXJyKCIlczogQnVzIENsaWVudCBOT1QgUmVnaXN0ZXJlZCEhIVxuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIFNfREVGQVVMVDoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfd2FybmluZygiJXM6IElOVkFMSUQgQ0FTRVxuIiwgX19mdW5jX18pOwotCX0KLX0KLQotaW50IG1zbV9jYW1fY29yZV9yZXNldCh2b2lkKQotewotCXN0cnVjdCBjbGsgKmNsazE7Ci0JaW50IHJjID0gMDsKLQljbGsxID0gY2xrX2dldCgmY2FtaW9fZGV2LT5kZXYsICJjc2lfdmZlX2NsayIpOwotCWlmIChJU19FUlIoY2xrMSkpIHsKLQkJcHJfZXJyKCIlczogZGlkIG5vdCBnZXQgY3NpX3ZmZV9jbGtcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIFBUUl9FUlIoY2xrMSk7Ci0JfQotCXJjID0gY2xrX3Jlc2V0KGNsazEsIENMS19SRVNFVF9BU1NFUlQpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOmNzaV92ZmVfY2xrIGFzc2VydCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJY2xrX3B1dChjbGsxKTsKLQkJcmV0dXJuIHJjOwotCX0KLQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTIwMCk7Ci0JcmMgPSBjbGtfcmVzZXQoY2xrMSwgQ0xLX1JFU0VUX0RFQVNTRVJUKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczpjc2lfdmZlX2NsayBkZWFzc2VydCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJY2xrX3B1dChjbGsxKTsKLQkJcmV0dXJuIHJjOwotCX0KLQljbGtfcHV0KGNsazEpOwotCi0JY2xrMSA9IGNsa19nZXQoJmNhbWlvX2Rldi0+ZGV2LCAiY3NpX2NsayIpOwotCWlmIChJU19FUlIoY2xrMSkpIHsKLQkJcHJfZXJyKCIlczogZGlkIG5vdCBnZXQgY3NpX2Nsa1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gUFRSX0VSUihjbGsxKTsKLQl9Ci0JcmMgPSBjbGtfcmVzZXQoY2xrMSwgQ0xLX1JFU0VUX0FTU0VSVCk7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6Y3NpX2NsayBhc3NlcnQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWNsa19wdXQoY2xrMSk7Ci0JCXJldHVybiByYzsKLQl9Ci0JdXNsZWVwX3JhbmdlKDEwMDAsIDEyMDApOwotCXJjID0gY2xrX3Jlc2V0KGNsazEsIENMS19SRVNFVF9ERUFTU0VSVCk7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6Y3NpX2NsayBkZWFzc2VydCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJY2xrX3B1dChjbGsxKTsKLQkJcmV0dXJuIHJjOwotCX0KLQljbGtfcHV0KGNsazEpOwotCi0JY2xrMSA9IGNsa19nZXQoJmNhbWlvX2Rldi0+ZGV2LCAiY3NpX3BjbGsiKTsKLQlpZiAoSVNfRVJSKGNsazEpKSB7Ci0JCXByX2VycigiJXM6IGRpZCBub3QgZ2V0IGNzaV9wY2xrXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBQVFJfRVJSKGNsazEpOwotCX0KLQlyYyA9IGNsa19yZXNldChjbGsxLCBDTEtfUkVTRVRfQVNTRVJUKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczpjc2lfcGNsayBhc3NlcnQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWNsa19wdXQoY2xrMSk7Ci0JCXJldHVybiByYzsKLQl9Ci0JdXNsZWVwX3JhbmdlKDEwMDAsIDEyMDApOwotCXJjID0gY2xrX3Jlc2V0KGNsazEsIENMS19SRVNFVF9ERUFTU0VSVCk7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6Y3NpX3BjbGsgZGVhc3NlcnQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWNsa19wdXQoY2xrMSk7Ci0JCXJldHVybiByYzsKLQl9Ci0JY2xrX3B1dChjbGsxKTsKLQotCXJldHVybiByYzsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9tc21faW9fdmZlMzEuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9tc21faW9fdmZlMzEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkMjc4Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvaW8vbXNtX2lvX3ZmZTMxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWFjaC92cmVnLmg+Ci0jaW5jbHVkZSA8bWFjaC9jbGsuaD4KLQotI2RlZmluZSBDQU1JRl9DRkdfUk1TSyAgICAgICAgICAgICAweDFmZmZmZgotI2RlZmluZSBDQU1fU0VMX0JNU0sgICAgICAgICAgICAgICAweDIKLSNkZWZpbmUgQ0FNX1BDTEtfU1JDX1NFTF9CTVNLICAgICAgMHg2MDAwMAotI2RlZmluZSBDQU1fUENMS19JTlZFUlRfQk1TSyAgICAgICAweDgwMDAwCi0jZGVmaW5lIENBTV9QQURfUkVHX1NXX1JFU0VUX0JNU0sgIDB4MTAwMDAwCi0KLSNkZWZpbmUgRVhUX0NBTV9IU1lOQ19QT0xfU0VMX0JNU0sgMHgxMDAwMAotI2RlZmluZSBFWFRfQ0FNX1ZTWU5DX1BPTF9TRUxfQk1TSyAweDgwMDAKLSNkZWZpbmUgTURESV9DTEtfQ0hJQ0tFTl9CSVRfQk1TSyAgMHg4MAotCi0jZGVmaW5lIENBTV9TRUxfU0hGVCAgICAgICAgICAgICAgIDB4MQotI2RlZmluZSBDQU1fUENMS19TUkNfU0VMX1NIRlQgICAgICAweDExCi0jZGVmaW5lIENBTV9QQ0xLX0lOVkVSVF9TSEZUICAgICAgIDB4MTMKLSNkZWZpbmUgQ0FNX1BBRF9SRUdfU1dfUkVTRVRfU0hGVCAgMHgxNAotCi0jZGVmaW5lIEVYVF9DQU1fSFNZTkNfUE9MX1NFTF9TSEZUIDB4MTAKLSNkZWZpbmUgRVhUX0NBTV9WU1lOQ19QT0xfU0VMX1NIRlQgMHhGCi0jZGVmaW5lIE1ERElfQ0xLX0NISUNLRU5fQklUX1NIRlQgIDB4NwotCi0vKiBNSVBJCUNTSQljb250cm9sbGVyIHJlZ2lzdGVycyAqLwotI2RlZmluZQlNSVBJX1BIWV9DT05UUk9MCQkJMHgwMDAwMDAwMAotI2RlZmluZQlNSVBJX1BST1RPQ09MX0NPTlRST0wJCTB4MDAwMDAwMDQKLSNkZWZpbmUJTUlQSV9JTlRFUlJVUFRfU1RBVFVTCQkweDAwMDAwMDA4Ci0jZGVmaW5lCU1JUElfSU5URVJSVVBUX01BU0sJCQkweDAwMDAwMDBDCi0jZGVmaW5lCU1JUElfQ0FNRVJBX0NOVEwJCQkweDAwMDAwMDI0Ci0jZGVmaW5lCU1JUElfQ0FMSUJSQVRJT05fQ09OVFJPTAkweDAwMDAwMDE4Ci0jZGVmaW5lCU1JUElfUEhZX0QwX0NPTlRST0wyCQkweDAwMDAwMDM4Ci0jZGVmaW5lCU1JUElfUEhZX0QxX0NPTlRST0wyCQkweDAwMDAwMDNDCi0jZGVmaW5lCU1JUElfUEhZX0QyX0NPTlRST0wyCQkweDAwMDAwMDQwCi0jZGVmaW5lCU1JUElfUEhZX0QzX0NPTlRST0wyCQkweDAwMDAwMDQ0Ci0jZGVmaW5lCU1JUElfUEhZX0NMX0NPTlRST0wJCQkweDAwMDAwMDQ4Ci0jZGVmaW5lCU1JUElfUEhZX0QwX0NPTlRST0wJCQkweDAwMDAwMDM0Ci0jZGVmaW5lCU1JUElfUEhZX0QxX0NPTlRST0wJCQkweDAwMDAwMDIwCi0jZGVmaW5lCU1JUElfUEhZX0QyX0NPTlRST0wJCQkweDAwMDAwMDJDCi0jZGVmaW5lCU1JUElfUEhZX0QzX0NPTlRST0wJCQkweDAwMDAwMDMwCi0jZGVmaW5lCU1JUElfUFJPVE9DT0xfQ09OVFJPTF9TV19SU1RfQk1TSwkJCTB4ODAwMDAwMAotI2RlZmluZQlNSVBJX1BST1RPQ09MX0NPTlRST0xfTE9OR19QQUNLRVRfSEVBREVSX0NBUFRVUkVfQk1TSwkweDIwMDAwMAotI2RlZmluZQlNSVBJX1BST1RPQ09MX0NPTlRST0xfREFUQV9GT1JNQVRfQk1TSwkJCTB4MTgwMDAwCi0jZGVmaW5lCU1JUElfUFJPVE9DT0xfQ09OVFJPTF9ERUNPREVfSURfQk1TSwkJCTB4NDAwMDAKLSNkZWZpbmUJTUlQSV9QUk9UT0NPTF9DT05UUk9MX0VDQ19FTl9CTVNLCQkJMHgyMDAwMAotI2RlZmluZQlNSVBJX0NBTElCUkFUSU9OX0NPTlRST0xfU1dDQUxfQ0FMX0VOX1NIRlQJCTB4MTYKLSNkZWZpbmUJTUlQSV9DQUxJQlJBVElPTl9DT05UUk9MX1NXQ0FMX1NUUkVOR1RIX09WRVJSSURFX0VOX1NIRlQJMHgxNQotI2RlZmluZQlNSVBJX0NBTElCUkFUSU9OX0NPTlRST0xfQ0FMX1NXX0hXX01PREVfU0hGVAkJMHgxNAotI2RlZmluZQlNSVBJX0NBTElCUkFUSU9OX0NPTlRST0xfTUFOVUFMX09WRVJSSURFX0VOX1NIRlQJMHg3Ci0jZGVmaW5lCU1JUElfUFJPVE9DT0xfQ09OVFJPTF9EQVRBX0ZPUk1BVF9TSEZUCQkJMHgxMwotI2RlZmluZQlNSVBJX1BST1RPQ09MX0NPTlRST0xfRFBDTV9TQ0hFTUVfU0hGVAkJCTB4MWUKLSNkZWZpbmUJTUlQSV9QSFlfRDBfQ09OVFJPTDJfU0VUVExFX0NPVU5UX1NIRlQJCQkweDE4Ci0jZGVmaW5lCU1JUElfUEhZX0QwX0NPTlRST0wyX0hTX1RFUk1fSU1QX1NIRlQJCQkweDEwCi0jZGVmaW5lCU1JUElfUEhZX0QwX0NPTlRST0wyX0xQX1JFQ19FTl9TSEZUCQkJCTB4NAotI2RlZmluZQlNSVBJX1BIWV9EMF9DT05UUk9MMl9FUlJfU09UX0hTX0VOX1NIRlQJCQkweDMKLSNkZWZpbmUJTUlQSV9QSFlfRDFfQ09OVFJPTDJfU0VUVExFX0NPVU5UX1NIRlQJCQkweDE4Ci0jZGVmaW5lCU1JUElfUEhZX0QxX0NPTlRST0wyX0hTX1RFUk1fSU1QX1NIRlQJCQkweDEwCi0jZGVmaW5lCU1JUElfUEhZX0QxX0NPTlRST0wyX0xQX1JFQ19FTl9TSEZUCQkJCTB4NAotI2RlZmluZQlNSVBJX1BIWV9EMV9DT05UUk9MMl9FUlJfU09UX0hTX0VOX1NIRlQJCQkweDMKLSNkZWZpbmUJTUlQSV9QSFlfRDJfQ09OVFJPTDJfU0VUVExFX0NPVU5UX1NIRlQJCQkweDE4Ci0jZGVmaW5lCU1JUElfUEhZX0QyX0NPTlRST0wyX0hTX1RFUk1fSU1QX1NIRlQJCQkweDEwCi0jZGVmaW5lCU1JUElfUEhZX0QyX0NPTlRST0wyX0xQX1JFQ19FTl9TSEZUCQkJCTB4NAotI2RlZmluZQlNSVBJX1BIWV9EMl9DT05UUk9MMl9FUlJfU09UX0hTX0VOX1NIRlQJCQkweDMKLSNkZWZpbmUJTUlQSV9QSFlfRDNfQ09OVFJPTDJfU0VUVExFX0NPVU5UX1NIRlQJCQkweDE4Ci0jZGVmaW5lCU1JUElfUEhZX0QzX0NPTlRST0wyX0hTX1RFUk1fSU1QX1NIRlQJCQkweDEwCi0jZGVmaW5lCU1JUElfUEhZX0QzX0NPTlRST0wyX0xQX1JFQ19FTl9TSEZUCQkJCTB4NAotI2RlZmluZQlNSVBJX1BIWV9EM19DT05UUk9MMl9FUlJfU09UX0hTX0VOX1NIRlQJCQkweDMKLSNkZWZpbmUJTUlQSV9QSFlfQ0xfQ09OVFJPTF9IU19URVJNX0lNUF9TSEZUCQkJMHgxOAotI2RlZmluZQlNSVBJX1BIWV9DTF9DT05UUk9MX0xQX1JFQ19FTl9TSEZUCQkJCTB4MgotI2RlZmluZQlNSVBJX1BIWV9EMF9DT05UUk9MX0hTX1JFQ19FUV9TSEZUCQkJCTB4MWMKLSNkZWZpbmUJTUlQSV9QSFlfRDFfQ09OVFJPTF9NSVBJX0NMS19QSFlfU0hVVERPV05CX1NIRlQJCTB4OQotI2RlZmluZQlNSVBJX1BIWV9EMV9DT05UUk9MX01JUElfREFUQV9QSFlfU0hVVERPV05CX1NIRlQJMHg4Ci0KLSNkZWZpbmUJQ0FNSU9fVkZFX0NMS19TTkFQCQkJMTIyODgwMDAwCi0jZGVmaW5lCUNBTUlPX1ZGRV9DTEtfUFJFVgkJCTEyMjg4MDAwMAotCi0vKiBBWEkgcmF0ZXMgaW4gS0h6ICovCi0jZGVmaW5lIE1TTV9BWElfUU9TX1BSRVZJRVcgICAgIDE5MjAwMAotI2RlZmluZSBNU01fQVhJX1FPU19TTkFQU0hPVCAgICAxOTIwMDAKLSNkZWZpbmUgTVNNX0FYSV9RT1NfUkVDT1JESU5HICAgMTkyMDAwCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpjYW1pb192ZmVfbWRjX2NsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpjYW1pb19tZGNfY2xrOwotc3RhdGljIHN0cnVjdCBjbGsgKmNhbWlvX3ZmZV9jbGs7Ci1zdGF0aWMgc3RydWN0IGNsayAqY2FtaW9fdmZlX2NhbWlmX2NsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpjYW1pb192ZmVfcGJkZ19jbGs7Ci1zdGF0aWMgc3RydWN0IGNsayAqY2FtaW9fY2FtX21fY2xrOwotc3RhdGljIHN0cnVjdCBjbGsgKmNhbWlvX2NhbWlmX3BhZF9wYmRnX2NsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpjYW1pb19jc2lfY2xrOwotc3RhdGljIHN0cnVjdCBjbGsgKmNhbWlvX2NzaV9wY2xrOwotc3RhdGljIHN0cnVjdCBjbGsgKmNhbWlvX2NzaV92ZmVfY2xrOwotc3RhdGljIHN0cnVjdCBjbGsgKmNhbWlvX3ZwZV9jbGs7Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvciAqZnNfdnBlOwotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2lvX2V4dCBjYW1pb19leHQ7Ci1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaW9fY2xrIGNhbWlvX2NsazsKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKmNhbWlmcGFkaW8sICpjc2lpbzsKLXZvaWQgX19pb21lbSAqY2FtaWZwYWRiYXNlLCAqY3NpYmFzZTsKLXN0YXRpYyB1aW50MzJfdCB2cGVfY2xrX3JhdGU7Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSByZWdzW10gPSB7Ci0JeyAuc3VwcGx5ID0gImdwMiIsICAubWluX3VWID0gMjYwMDAwMCwgLm1heF91ViA9IDI2MDAwMDAgfSwKLQl7IC5zdXBwbHkgPSAibHZzdzEiIH0sCi0JeyAuc3VwcGx5ID0gImZzX3ZmZSIgfSwKLQkvKiBzbjEybTBweiByZWd1bGF0b3JzICovCi0JeyAuc3VwcGx5ID0gImdwNiIsICAubWluX3VWID0gMzA1MDAwMCwgLm1heF91ViA9IDMxMDAwMDAgfSwKLQl7IC5zdXBwbHkgPSAiZ3AxNiIsIC5taW5fdVYgPSAxMjAwMDAwLCAubWF4X3VWID0gMTIwMDAwMCB9LAotfTsKLQotc3RhdGljIGludCByZWdfY291bnQ7Ci0KLXN0YXRpYyB2b2lkIG1zbV9jYW1lcmFfdnJlZ19lbmFibGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgY291bnQsIHJjOwotCi0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQotCS8qIFVzZSBncDYgYW5kIGdwMTYgaWYgYW5kIG9ubHkgaWYgZGV2IG5hbWUgbWF0Y2hlcy4gKi8KLQlpZiAoIXN0cm5jbXAocGRldi0+bmFtZSwgIm1zbV9jYW1lcmFfc24xMm0wcHoiLCAyMCkpCi0JCWNvdW50ID0gQVJSQVlfU0laRShyZWdzKTsKLQllbHNlCi0JCWNvdW50ID0gQVJSQVlfU0laRShyZWdzKSAtIDI7Ci0KLQlyYyA9IHJlZ3VsYXRvcl9idWxrX2dldChkZXYsIGNvdW50LCByZWdzKTsKLQotCWlmIChyYykgewotCQlkZXZfZXJyKGRldiwgIiVzOiBjb3VsZCBub3QgZ2V0IHJlZ3VsYXRvcnM6ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlyYyA9IHJlZ3VsYXRvcl9idWxrX3NldF92b2x0YWdlKGNvdW50LCByZWdzKTsKLQotCWlmIChyYykgewotCQlkZXZfZXJyKGRldiwgIiVzOiBjb3VsZCBub3Qgc2V0IHZvbHRhZ2VzOiAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIHJlZ19mcmVlOwotCX0KLQotCXJjID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKGNvdW50LCByZWdzKTsKLQotCWlmIChyYykgewotCQlkZXZfZXJyKGRldiwgIiVzOiBjb3VsZCBub3QgZW5hYmxlIHJlZ3VsYXRvcnM6ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gcmVnX2ZyZWU7Ci0JfQotCi0JcmVnX2NvdW50ID0gY291bnQ7Ci0JcmV0dXJuOwotCi1yZWdfZnJlZToKLQlyZWd1bGF0b3JfYnVsa19mcmVlKGNvdW50LCByZWdzKTsKLQlyZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQgbXNtX2NhbWVyYV92cmVnX2Rpc2FibGUodm9pZCkKLXsKLQlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKHJlZ19jb3VudCwgcmVncyk7Ci0JcmVndWxhdG9yX2J1bGtfZnJlZShyZWdfY291bnQsIHJlZ3MpOwotCXJlZ19jb3VudCA9IDA7Ci19Ci0KLWludCBtc21fY2FtaW9fY2xrX2VuYWJsZShlbnVtIG1zbV9jYW1pb19jbGtfdHlwZSBjbGt0eXBlKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKLQotCXN3aXRjaCAoY2xrdHlwZSkgewotCWNhc2UgQ0FNSU9fVkZFX01EQ19DTEs6Ci0JCWNhbWlvX3ZmZV9tZGNfY2xrID0KLQkJY2xrID0gY2xrX2dldChOVUxMLCAidmZlX21kY19jbGsiKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX01EQ19DTEs6Ci0JCWNhbWlvX21kY19jbGsgPQotCQljbGsgPSBjbGtfZ2V0KE5VTEwsICJtZGNfY2xrIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19WRkVfQ0xLOgotCQljYW1pb192ZmVfY2xrID0KLQkJY2xrID0gY2xrX2dldChOVUxMLCAidmZlX2NsayIpOwotCQltc21fY2FtaW9fY2xrX3JhdGVfc2V0XzIoY2xrLCBjYW1pb19jbGsudmZlX2Nsa19yYXRlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX1ZGRV9DQU1JRl9DTEs6Ci0JCWNhbWlvX3ZmZV9jYW1pZl9jbGsgPQotCQljbGsgPSBjbGtfZ2V0KE5VTEwsICJ2ZmVfY2FtaWZfY2xrIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19WRkVfUEJER19DTEs6Ci0JCWNhbWlvX3ZmZV9wYmRnX2NsayA9Ci0JCWNsayA9IGNsa19nZXQoTlVMTCwgInZmZV9wY2xrIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19DQU1fTUNMS19DTEs6Ci0JCWNhbWlvX2NhbV9tX2NsayA9Ci0JCWNsayA9IGNsa19nZXQoTlVMTCwgImNhbV9tX2NsayIpOwotCQltc21fY2FtaW9fY2xrX3JhdGVfc2V0XzIoY2xrLCBjYW1pb19jbGsubWNsa19jbGtfcmF0ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19DQU1JRl9QQURfUEJER19DTEs6Ci0JCWNhbWlvX2NhbWlmX3BhZF9wYmRnX2NsayA9Ci0JCWNsayA9IGNsa19nZXQoTlVMTCwgImNhbWlmX3BhZF9wY2xrIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19DU0kwX0NMSzoKLQkJY2FtaW9fY3NpX2NsayA9Ci0JCWNsayA9IGNsa19nZXQoTlVMTCwgImNzaV9jbGsiKTsKLQkJbXNtX2NhbWlvX2Nsa19yYXRlX3NldF8yKGNsaywgMTUzNjAwMDAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1JT19DU0kwX1ZGRV9DTEs6Ci0JCWNhbWlvX2NzaV92ZmVfY2xrID0KLQkJY2xrID0gY2xrX2dldChOVUxMLCAiY3NpX3ZmZV9jbGsiKTsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1JT19DU0kwX1BDTEs6Ci0JCWNhbWlvX2NzaV9wY2xrID0KLQkJY2xrID0gY2xrX2dldChOVUxMLCAiY3NpX3BjbGsiKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX1ZQRV9DTEs6Ci0JCWNhbWlvX3ZwZV9jbGsgPQotCQljbGsgPSBjbGtfZ2V0KE5VTEwsICJ2cGVfY2xrIik7Ci0JCXZwZV9jbGtfcmF0ZSA9IGNsa19yb3VuZF9yYXRlKGNsaywgdnBlX2Nsa19yYXRlKTsKLQkJY2xrX3NldF9yYXRlKGNsaywgdnBlX2Nsa19yYXRlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCFJU19FUlIoY2xrKSkKLQkJY2xrX3ByZXBhcmVfZW5hYmxlKGNsayk7Ci0JZWxzZQotCQlyYyA9IC0xOwotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9jYW1pb19jbGtfZGlzYWJsZShlbnVtIG1zbV9jYW1pb19jbGtfdHlwZSBjbGt0eXBlKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKLQotCXN3aXRjaCAoY2xrdHlwZSkgewotCWNhc2UgQ0FNSU9fVkZFX01EQ19DTEs6Ci0JCWNsayA9IGNhbWlvX3ZmZV9tZGNfY2xrOwotCQlicmVhazsKLQotCWNhc2UgQ0FNSU9fTURDX0NMSzoKLQkJY2xrID0gY2FtaW9fbWRjX2NsazsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX1ZGRV9DTEs6Ci0JCWNsayA9IGNhbWlvX3ZmZV9jbGs7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19WRkVfQ0FNSUZfQ0xLOgotCQljbGsgPSBjYW1pb192ZmVfY2FtaWZfY2xrOwotCQlicmVhazsKLQotCWNhc2UgQ0FNSU9fVkZFX1BCREdfQ0xLOgotCQljbGsgPSBjYW1pb192ZmVfcGJkZ19jbGs7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19DQU1fTUNMS19DTEs6Ci0JCWNsayA9IGNhbWlvX2NhbV9tX2NsazsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX0NBTUlGX1BBRF9QQkRHX0NMSzoKLQkJY2xrID0gY2FtaW9fY2FtaWZfcGFkX3BiZGdfY2xrOwotCQlicmVhazsKLQljYXNlIENBTUlPX0NTSTBfQ0xLOgotCQljbGsgPSBjYW1pb19jc2lfY2xrOwotCQlicmVhazsKLQljYXNlIENBTUlPX0NTSTBfVkZFX0NMSzoKLQkJY2xrID0gY2FtaW9fY3NpX3ZmZV9jbGs7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNSU9fQ1NJMF9QQ0xLOgotCQljbGsgPSBjYW1pb19jc2lfcGNsazsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1JT19WUEVfQ0xLOgotCQljbGsgPSBjYW1pb192cGVfY2xrOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlpZiAoIUlTX0VSUihjbGspKSB7Ci0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShjbGspOwotCQljbGtfcHV0KGNsayk7Ci0JfSBlbHNlIHsKLQkJcmMgPSAtMTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXZvaWQgbXNtX2NhbWlvX2Nsa19yYXRlX3NldChpbnQgcmF0ZSkKLXsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBjYW1pb19jYW1fbV9jbGs7Ci0JY2xrX3NldF9yYXRlKGNsaywgcmF0ZSk7Ci19Ci0KLWludCBtc21fY2FtaW9fdmZlX2Nsa19yYXRlX3NldChpbnQgcmF0ZSkKLXsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBjYW1pb192ZmVfY2xrOwotCXJldHVybiBjbGtfc2V0X3JhdGUoY2xrLCByYXRlKTsKLX0KLQotdm9pZCBtc21fY2FtaW9fY2xrX3JhdGVfc2V0XzIoc3RydWN0IGNsayAqY2xrLCBpbnQgcmF0ZSkKLXsKLQljbGtfc2V0X3JhdGUoY2xrLCByYXRlKTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IG1zbV9pb19jc2lfaXJxKGludCBpcnFfbnVtLCB2b2lkICpkYXRhKQotewotCXVpbnQzMl90IGlycTsKLQlpcnEgPSBtc21fY2FtZXJhX2lvX3IoY3NpYmFzZSArIE1JUElfSU5URVJSVVBUX1NUQVRVUyk7Ci0JQ0RCRygiJXMgTUlQSV9JTlRFUlJVUFRfU1RBVFVTID0gMHgleFxuIiwgX19mdW5jX18sIGlycSk7Ci0JbXNtX2NhbWVyYV9pb193KGlycSwgY3NpYmFzZSArIE1JUElfSU5URVJSVVBUX1NUQVRVUyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1pbnQgbXNtX2NhbWlvX3ZwZV9jbGtfZGlzYWJsZSh2b2lkKQotewotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19WUEVfQ0xLKTsKLQotCWlmIChmc192cGUpIHsKLQkJcmVndWxhdG9yX2Rpc2FibGUoZnNfdnBlKTsKLQkJcmVndWxhdG9yX3B1dChmc192cGUpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgbXNtX2NhbWlvX3ZwZV9jbGtfZW5hYmxlKHVpbnQzMl90IGNsa19yYXRlKQotewotCWZzX3ZwZSA9IHJlZ3VsYXRvcl9nZXQoTlVMTCwgImZzX3ZwZSIpOwotCWlmIChJU19FUlIoZnNfdnBlKSkgewotCQlwcl9lcnIoIiVzOiBSZWd1bGF0b3IgRlNfVlBFIGdldCBmYWlsZWQgJWxkXG4iLCBfX2Z1bmNfXywKLQkJCVBUUl9FUlIoZnNfdnBlKSk7Ci0JCWZzX3ZwZSA9IE5VTEw7Ci0JfSBlbHNlIGlmIChyZWd1bGF0b3JfZW5hYmxlKGZzX3ZwZSkpIHsKLQkJcHJfZXJyKCIlczogUmVndWxhdG9yIEZTX1ZQRSBlbmFibGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJlZ3VsYXRvcl9wdXQoZnNfdnBlKTsKLQl9Ci0KLQl2cGVfY2xrX3JhdGUgPSBjbGtfcmF0ZTsKLQltc21fY2FtaW9fY2xrX2VuYWJsZShDQU1JT19WUEVfQ0xLKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IG1zbV9jYW1pb19lbmFibGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCW1zbV9jYW1pb19jbGtfZW5hYmxlKENBTUlPX1ZGRV9QQkRHX0NMSyk7Ci0JaWYgKCFzaW5mby0+Y3NpX2lmKQotCQltc21fY2FtaW9fY2xrX2VuYWJsZShDQU1JT19WRkVfQ0FNSUZfQ0xLKTsKLQllbHNlIHsKLQkJbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fVkZFX0NMSyk7Ci0JCWNzaWlvID0gcmVxdWVzdF9tZW1fcmVnaW9uKGNhbWlvX2V4dC5jc2lwaHksCi0JCQljYW1pb19leHQuY3Npc3osIHBkZXYtPm5hbWUpOwotCQlpZiAoIWNzaWlvKSB7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWdvdG8gY29tbW9uX2ZhaWw7Ci0JCX0KLQkJY3NpYmFzZSA9IGlvcmVtYXAoY2FtaW9fZXh0LmNzaXBoeSwKLQkJCWNhbWlvX2V4dC5jc2lzeik7Ci0JCWlmICghY3NpYmFzZSkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBjc2lfYnVzeTsKLQkJfQotCQlyYyA9IHJlcXVlc3RfaXJxKGNhbWlvX2V4dC5jc2lpcnEsIG1zbV9pb19jc2lfaXJxLAotCQkJSVJRRl9UUklHR0VSX1JJU0lORywgImNzaSIsIDApOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBjc2lfaXJxX2ZhaWw7Ci0JCS8qIGVuYWJsZSByZXF1aXJlZCBjbG9ja3MgZm9yIENTSSAqLwotCQltc21fY2FtaW9fY2xrX2VuYWJsZShDQU1JT19DU0kwX1BDTEspOwotCQltc21fY2FtaW9fY2xrX2VuYWJsZShDQU1JT19DU0kwX1ZGRV9DTEspOwotCQltc21fY2FtaW9fY2xrX2VuYWJsZShDQU1JT19DU0kwX0NMSyk7Ci0JfQotCXJldHVybiAwOwotY3NpX2lycV9mYWlsOgotCWlvdW5tYXAoY3NpYmFzZSk7Ci1jc2lfYnVzeToKLQlyZWxlYXNlX21lbV9yZWdpb24oY2FtaW9fZXh0LmNzaXBoeSwgY2FtaW9fZXh0LmNzaXN6KTsKLWNvbW1vbl9mYWlsOgotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19WRkVfUEJER19DTEspOwotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19WRkVfQ0xLKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9jYW1pb19jc2lfZGlzYWJsZSh2b2lkKQotewotCXVpbnQzMl90IHZhbDsKLQl2YWwgPSAweDA7Ci0JQ0RCRygiJXMgTUlQSV9QSFlfRDBfQ09OVFJPTDIgdmFsPTB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWJhc2UgKyBNSVBJX1BIWV9EMF9DT05UUk9MMik7Ci0JbXNtX2NhbWVyYV9pb193KHZhbCwgY3NpYmFzZSArIE1JUElfUEhZX0QxX0NPTlRST0wyKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjc2liYXNlICsgTUlQSV9QSFlfRDJfQ09OVFJPTDIpOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWJhc2UgKyBNSVBJX1BIWV9EM19DT05UUk9MMik7Ci0KLQlDREJHKCIlcyBNSVBJX1BIWV9DTF9DT05UUk9MIHZhbD0weCV4XG4iLCBfX2Z1bmNfXywgdmFsKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjc2liYXNlICsgTUlQSV9QSFlfQ0xfQ09OVFJPTCk7Ci0JdXNsZWVwX3JhbmdlKDkwMDAsIDEwMDAwKTsKLQlmcmVlX2lycShjYW1pb19leHQuY3NpaXJxLCAwKTsKLQlpb3VubWFwKGNzaWJhc2UpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihjYW1pb19leHQuY3NpcGh5LCBjYW1pb19leHQuY3Npc3opOwotfQotCi12b2lkIG1zbV9jYW1pb19kaXNhYmxlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNpbmZvID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaWYgKCFzaW5mby0+Y3NpX2lmKSB7Ci0JCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19WRkVfQ0FNSUZfQ0xLKTsKLQl9IGVsc2UgewotCQlDREJHKCJkaXNhYmxlIG1pcGlcbiIpOwotCQltc21fY2FtaW9fY3NpX2Rpc2FibGUoKTsKLQkJQ0RCRygiZGlzYWJsZSBjbG9ja3NcbiIpOwotCQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ1NJMF9QQ0xLKTsKLQkJbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX0NTSTBfVkZFX0NMSyk7Ci0JCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19DU0kwX0NMSyk7Ci0JCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19WRkVfQ0xLKTsKLQl9Ci0JbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX1ZGRV9QQkRHX0NMSyk7Ci19Ci0KLXZvaWQgbXNtX2NhbWlvX2NhbWlmX3BhZF9yZWdfcmVzZXQodm9pZCkKLXsKLQl1aW50MzJfdCByZWc7Ci0KLQltc21fY2FtaW9fY2xrX3NlbChNU01fQ0FNSU9fQ0xLX1NSQ19JTlRFUk5BTCk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7Ci0KLQlyZWcgPSAobXNtX2NhbWVyYV9pb19yKGNhbWlmcGFkYmFzZSkpICYgQ0FNSUZfQ0ZHX1JNU0s7Ci0JcmVnIHw9IDB4MzsKLQltc21fY2FtZXJhX2lvX3cocmVnLCBjYW1pZnBhZGJhc2UpOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotCi0JcmVnID0gKG1zbV9jYW1lcmFfaW9fcihjYW1pZnBhZGJhc2UpKSAmIENBTUlGX0NGR19STVNLOwotCXJlZyB8PSAweDEwOwotCW1zbV9jYW1lcmFfaW9fdyhyZWcsIGNhbWlmcGFkYmFzZSk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7Ci0KLQlyZWcgPSAobXNtX2NhbWVyYV9pb19yKGNhbWlmcGFkYmFzZSkpICYgQ0FNSUZfQ0ZHX1JNU0s7Ci0JLyogTmVlZCB0byBiZSB1bmludmVydGVkKi8KLQlyZWcgJj0gMHgwMzsKLQltc21fY2FtZXJhX2lvX3cocmVnLCBjYW1pZnBhZGJhc2UpOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotfQotCi12b2lkIG1zbV9jYW1pb192ZmVfYmxrX3Jlc2V0KHZvaWQpCi17Ci0JcmV0dXJuOwotCi0KLX0KLQotdm9pZCBtc21fY2FtaW9fY2FtaWZfcGFkX3JlZ19yZXNldF8yKHZvaWQpCi17Ci0JdWludDMyX3QgcmVnOwotCXVpbnQzMl90IG1hc2ssIHZhbHVlOwotCXJlZyA9IChtc21fY2FtZXJhX2lvX3IoY2FtaWZwYWRiYXNlKSkgJiBDQU1JRl9DRkdfUk1TSzsKLQltYXNrID0gQ0FNX1BBRF9SRUdfU1dfUkVTRVRfQk1TSzsKLQl2YWx1ZSA9IDEgPDwgQ0FNX1BBRF9SRUdfU1dfUkVTRVRfU0hGVDsKLQltc21fY2FtZXJhX2lvX3coKHJlZyAmICh+bWFzaykpIHwgKHZhbHVlICYgbWFzayksIGNhbWlmcGFkYmFzZSk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7Ci0JcmVnID0gKG1zbV9jYW1lcmFfaW9fcihjYW1pZnBhZGJhc2UpKSAmIENBTUlGX0NGR19STVNLOwotCW1hc2sgPSBDQU1fUEFEX1JFR19TV19SRVNFVF9CTVNLOwotCXZhbHVlID0gMCA8PCBDQU1fUEFEX1JFR19TV19SRVNFVF9TSEZUOwotCW1zbV9jYW1lcmFfaW9fdygocmVnICYgKH5tYXNrKSkgfCAodmFsdWUgJiBtYXNrKSwgY2FtaWZwYWRiYXNlKTsKLQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKLX0KLQotdm9pZCBtc21fY2FtaW9fY2xrX3NlbChlbnVtIG1zbV9jYW1pb19jbGtfc3JjX3R5cGUgc3JjdHlwZSkKLXsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwotCi0JY2xrID0gY2FtaW9fdmZlX2NsazsKLQotCWlmIChjbGsgIT0gTlVMTCkgewotCQlzd2l0Y2ggKHNyY3R5cGUpIHsKLQkJY2FzZSBNU01fQ0FNSU9fQ0xLX1NSQ19JTlRFUk5BTDoKLQkJCWNsa19zZXRfZmxhZ3MoY2xrLCAweDAwMDAwMTAwIDw8IDEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNU01fQ0FNSU9fQ0xLX1NSQ19FWFRFUk5BTDoKLQkJCWNsa19zZXRfZmxhZ3MoY2xrLCAweDAwMDAwMTAwKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLWludCBtc21fY2FtaW9fcHJvYmVfb24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2luZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9kZXZpY2VfcGxhdGZvcm1fZGF0YSAqY2FtZGV2ID0gc2luZm8tPnBkYXRhOwotCWNhbWlvX2NsayA9IGNhbWRldi0+aW9jbGs7Ci0JY2FtaW9fZXh0ID0gY2FtZGV2LT5pb2V4dDsKLQljYW1kZXYtPmNhbWVyYV9ncGlvX29uKCk7Ci0JbXNtX2NhbWVyYV92cmVnX2VuYWJsZShwZGV2KTsKLQlyZXR1cm4gbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fQ0FNX01DTEtfQ0xLKTsKLX0KLQotaW50IG1zbV9jYW1pb19wcm9iZV9vZmYoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2luZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9kZXZpY2VfcGxhdGZvcm1fZGF0YSAqY2FtZGV2ID0gc2luZm8tPnBkYXRhOwotCW1zbV9jYW1lcmFfdnJlZ19kaXNhYmxlKCk7Ci0JY2FtZGV2LT5jYW1lcmFfZ3Bpb19vZmYoKTsKLQlyZXR1cm4gbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX0NBTV9NQ0xLX0NMSyk7Ci19Ci0KLWludCBtc21fY2FtaW9fc2Vuc29yX2Nsa19vbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNpbmZvID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfZGV2aWNlX3BsYXRmb3JtX2RhdGEgKmNhbWRldiA9IHNpbmZvLT5wZGF0YTsKLQljYW1pb19jbGsgPSBjYW1kZXYtPmlvY2xrOwotCWNhbWlvX2V4dCA9IGNhbWRldi0+aW9leHQ7Ci0JY2FtZGV2LT5jYW1lcmFfZ3Bpb19vbigpOwotCW1zbV9jYW1lcmFfdnJlZ19lbmFibGUocGRldik7Ci0JbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fQ0FNX01DTEtfQ0xLKTsKLQltc21fY2FtaW9fY2xrX2VuYWJsZShDQU1JT19DQU1JRl9QQURfUEJER19DTEspOwotCWlmICghc2luZm8tPmNzaV9pZikgewotCQljYW1pZnBhZGlvID0gcmVxdWVzdF9tZW1fcmVnaW9uKGNhbWlvX2V4dC5jYW1pZnBhZHBoeSwKLQkJCWNhbWlvX2V4dC5jYW1pZnBhZHN6LCBwZGV2LT5uYW1lKTsKLQkJbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fVkZFX0NMSyk7Ci0JCWlmICghY2FtaWZwYWRpbykgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIGNvbW1vbl9mYWlsOwotCQl9Ci0JCWNhbWlmcGFkYmFzZSA9IGlvcmVtYXAoY2FtaW9fZXh0LmNhbWlmcGFkcGh5LAotCQkJY2FtaW9fZXh0LmNhbWlmcGFkc3opOwotCQlpZiAoIWNhbWlmcGFkYmFzZSkgewotCQkJQ0RCRygibXNtX2NhbWlvX3NlbnNvcl9jbGtfb24gZmFpbFxuIik7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHBhcmFsbGVsX2J1c3k7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotcGFyYWxsZWxfYnVzeToKLQlyZWxlYXNlX21lbV9yZWdpb24oY2FtaW9fZXh0LmNhbWlmcGFkcGh5LCBjYW1pb19leHQuY2FtaWZwYWRzeik7Ci0JZ290byBjb21tb25fZmFpbDsKLWNvbW1vbl9mYWlsOgotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19DQU1fTUNMS19DTEspOwotCW1zbV9jYW1pb19jbGtfZGlzYWJsZShDQU1JT19WRkVfQ0xLKTsKLQltc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ0FNSUZfUEFEX1BCREdfQ0xLKTsKLQltc21fY2FtZXJhX3ZyZWdfZGlzYWJsZSgpOwotCWNhbWRldi0+Y2FtZXJhX2dwaW9fb2ZmKCk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2NhbWlvX3NlbnNvcl9jbGtfb2ZmKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JdWludDMyX3QgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBtc21fY2FtZXJhX2RldmljZV9wbGF0Zm9ybV9kYXRhICpjYW1kZXYgPSBzaW5mby0+cGRhdGE7Ci0JY2FtZGV2LT5jYW1lcmFfZ3Bpb19vZmYoKTsKLQltc21fY2FtZXJhX3ZyZWdfZGlzYWJsZSgpOwotCXJjID0gbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX0NBTV9NQ0xLX0NMSyk7Ci0JcmMgPSBtc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fQ0FNSUZfUEFEX1BCREdfQ0xLKTsKLQlpZiAoIXNpbmZvLT5jc2lfaWYpIHsKLQkJaW91bm1hcChjYW1pZnBhZGJhc2UpOwotCQlyZWxlYXNlX21lbV9yZWdpb24oY2FtaW9fZXh0LmNhbWlmcGFkcGh5LCBjYW1pb19leHQuY2FtaWZwYWRzeik7Ci0JCXJjID0gbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX1ZGRV9DTEspOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fY2FtaW9fY3NpX2NvbmZpZyhzdHJ1Y3QgbXNtX2NhbWVyYV9jc2lfcGFyYW1zICpjc2lfcGFyYW1zKQotewotCWludCByYyA9IDA7Ci0JdWludDMyX3QgdmFsID0gMDsKLQlpbnQgaTsKLQotCUNEQkcoIm1zbV9jYW1pb19jc2lfY29uZmlnXG4iKTsKLQotCS8qIFNPVF9FQ0NfRU4gZW5hYmxlIGVycm9yIGNvcnJlY3Rpb24gZm9yIFNZTkMgKGRhdGEtbGFuZSkgKi8KLQltc21fY2FtZXJhX2lvX3coMHg0LCBjc2liYXNlICsgTUlQSV9QSFlfQ09OVFJPTCk7Ci0KLQkvKiBTV19SU1QgdG8gdGhlIENTSSBjb3JlICovCi0JbXNtX2NhbWVyYV9pb193KE1JUElfUFJPVE9DT0xfQ09OVFJPTF9TV19SU1RfQk1TSywKLQkJY3NpYmFzZSArIE1JUElfUFJPVE9DT0xfQ09OVFJPTCk7Ci0KLQkvKiBQUk9UT0NPTCBDT05UUk9MICovCi0JdmFsID0gTUlQSV9QUk9UT0NPTF9DT05UUk9MX0xPTkdfUEFDS0VUX0hFQURFUl9DQVBUVVJFX0JNU0sgfAotCQlNSVBJX1BST1RPQ09MX0NPTlRST0xfREVDT0RFX0lEX0JNU0sgfAotCQlNSVBJX1BST1RPQ09MX0NPTlRST0xfRUNDX0VOX0JNU0s7Ci0JdmFsIHw9ICh1aW50MzJfdCkoY3NpX3BhcmFtcy0+ZGF0YV9mb3JtYXQpIDw8Ci0JCU1JUElfUFJPVE9DT0xfQ09OVFJPTF9EQVRBX0ZPUk1BVF9TSEZUOwotCXZhbCB8PSBjc2lfcGFyYW1zLT5kcGNtX3NjaGVtZSA8PAotCQlNSVBJX1BST1RPQ09MX0NPTlRST0xfRFBDTV9TQ0hFTUVfU0hGVDsKLQlDREJHKCIlcyBNSVBJX1BST1RPQ09MX0NPTlRST0wgdmFsPTB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWJhc2UgKyBNSVBJX1BST1RPQ09MX0NPTlRST0wpOwotCi0JLyogU1cgQ0FMIEVOICovCi0JdmFsID0gKDB4MSA8PCBNSVBJX0NBTElCUkFUSU9OX0NPTlRST0xfU1dDQUxfQ0FMX0VOX1NIRlQpIHwKLQkJKDB4MSA8PAotCQlNSVBJX0NBTElCUkFUSU9OX0NPTlRST0xfU1dDQUxfU1RSRU5HVEhfT1ZFUlJJREVfRU5fU0hGVCkgfAotCQkoMHgxIDw8IE1JUElfQ0FMSUJSQVRJT05fQ09OVFJPTF9DQUxfU1dfSFdfTU9ERV9TSEZUKSB8Ci0JCSgweDEgPDwgTUlQSV9DQUxJQlJBVElPTl9DT05UUk9MX01BTlVBTF9PVkVSUklERV9FTl9TSEZUKTsKLQlDREJHKCIlcyBNSVBJX0NBTElCUkFUSU9OX0NPTlRST0wgdmFsPTB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsIGNzaWJhc2UgKyBNSVBJX0NBTElCUkFUSU9OX0NPTlRST0wpOwotCi0JLyogc2V0dGxlX2NudCBpcyB2ZXJ5IHNlbnNpdGl2ZSB0byBzcGVlZCEKLQlpbmNyZWFzZSB0aGlzIHZhbHVlIHRvIHJ1biBhdCBoaWdoZXIgc3BlZWRzICovCi0JdmFsID0gKGNzaV9wYXJhbXMtPnNldHRsZV9jbnQgPDwKLQkJCU1JUElfUEhZX0QwX0NPTlRST0wyX1NFVFRMRV9DT1VOVF9TSEZUKSB8Ci0JCSgweDBGIDw8IE1JUElfUEhZX0QwX0NPTlRST0wyX0hTX1RFUk1fSU1QX1NIRlQpIHwKLQkJKDB4MSA8PCBNSVBJX1BIWV9EMF9DT05UUk9MMl9MUF9SRUNfRU5fU0hGVCkgfAotCQkoMHgxIDw8IE1JUElfUEhZX0QwX0NPTlRST0wyX0VSUl9TT1RfSFNfRU5fU0hGVCk7Ci0JQ0RCRygiJXMgTUlQSV9QSFlfRDBfQ09OVFJPTDIgdmFsPTB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOwotCWZvciAoaSA9IDA7IGkgPCBjc2lfcGFyYW1zLT5sYW5lX2NudDsgaSsrKQotCQltc21fY2FtZXJhX2lvX3codmFsLCBjc2liYXNlICsgTUlQSV9QSFlfRDBfQ09OVFJPTDIgKyBpICogNCk7Ci0KLQl2YWwgPSAoMHgwRiA8PCBNSVBJX1BIWV9DTF9DT05UUk9MX0hTX1RFUk1fSU1QX1NIRlQpIHwKLQkJKDB4MSA8PCBNSVBJX1BIWV9DTF9DT05UUk9MX0xQX1JFQ19FTl9TSEZUKTsKLQlDREJHKCIlcyBNSVBJX1BIWV9DTF9DT05UUk9MIHZhbD0weCV4XG4iLCBfX2Z1bmNfXywgdmFsKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCBjc2liYXNlICsgTUlQSV9QSFlfQ0xfQ09OVFJPTCk7Ci0KLQl2YWwgPSAwIDw8IE1JUElfUEhZX0QwX0NPTlRST0xfSFNfUkVDX0VRX1NIRlQ7Ci0JbXNtX2NhbWVyYV9pb193KHZhbCwgY3NpYmFzZSArIE1JUElfUEhZX0QwX0NPTlRST0wpOwotCi0JdmFsID0gKDB4MSA8PCBNSVBJX1BIWV9EMV9DT05UUk9MX01JUElfQ0xLX1BIWV9TSFVURE9XTkJfU0hGVCkgfAotCQkoMHgxIDw8IE1JUElfUEhZX0QxX0NPTlRST0xfTUlQSV9EQVRBX1BIWV9TSFVURE9XTkJfU0hGVCk7Ci0JQ0RCRygiJXMgTUlQSV9QSFlfRDFfQ09OVFJPTCB2YWw9MHgleFxuIiwgX19mdW5jX18sIHZhbCk7Ci0JbXNtX2NhbWVyYV9pb193KHZhbCwgY3NpYmFzZSArIE1JUElfUEhZX0QxX0NPTlRST0wpOwotCi0JbXNtX2NhbWVyYV9pb193KDB4MDAwMDAwMDAsIGNzaWJhc2UgKyBNSVBJX1BIWV9EMl9DT05UUk9MKTsKLQltc21fY2FtZXJhX2lvX3coMHgwMDAwMDAwMCwgY3NpYmFzZSArIE1JUElfUEhZX0QzX0NPTlRST0wpOwotCi0JLyogaGFsY3lvbiBvbmx5IHN1cHBvcnRzIDEgb3IgMiBsYW5lICovCi0Jc3dpdGNoIChjc2lfcGFyYW1zLT5sYW5lX2NudCkgewotCWNhc2UgMToKLQkJbXNtX2NhbWVyYV9pb193KGNzaV9wYXJhbXMtPmxhbmVfYXNzaWduIDw8IDggfCAweDQsCi0JCQljc2liYXNlICsgTUlQSV9DQU1FUkFfQ05UTCk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJbXNtX2NhbWVyYV9pb193KGNzaV9wYXJhbXMtPmxhbmVfYXNzaWduIDw8IDggfCAweDUsCi0JCQljc2liYXNlICsgTUlQSV9DQU1FUkFfQ05UTCk7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJbXNtX2NhbWVyYV9pb193KGNzaV9wYXJhbXMtPmxhbmVfYXNzaWduIDw8IDggfCAweDYsCi0JCQljc2liYXNlICsgTUlQSV9DQU1FUkFfQ05UTCk7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJbXNtX2NhbWVyYV9pb193KGNzaV9wYXJhbXMtPmxhbmVfYXNzaWduIDw8IDggfCAweDcsCi0JCQljc2liYXNlICsgTUlQSV9DQU1FUkFfQ05UTCk7Ci0JCWJyZWFrOwotCX0KLQotCS8qIG1hc2sgb3V0IElEX0VSUk9SWzE5XSwgREFUQV9DTU1fRVJSWzExXQotCWFuZCBDTEtfQ01NX0VSUlsxMF0gLSBkZS1mZWF0dXJlZCAqLwotCW1zbV9jYW1lcmFfaW9fdygweEZGRjdGM0ZGLCBjc2liYXNlICsgTUlQSV9JTlRFUlJVUFRfTUFTSyk7Ci0JLypjbGVhciBJUlEgYml0cyovCi0JbXNtX2NhbWVyYV9pb193KDB4RkZGN0YzRkYsIGNzaWJhc2UgKyBNSVBJX0lOVEVSUlVQVF9TVEFUVVMpOwotCi0JcmV0dXJuIHJjOwotfQotdm9pZCBtc21fY2FtaW9fc2V0X3BlcmZfbHZsKGVudW0gbXNtX2J1c19wZXJmX3NldHRpbmcgcGVyZl9zZXR0aW5nKQotewotCXN3aXRjaCAocGVyZl9zZXR0aW5nKSB7Ci0JY2FzZSBTX0lOSVQ6Ci0JCWFkZF9heGlfcW9zKCk7Ci0JCWJyZWFrOwotCWNhc2UgU19QUkVWSUVXOgotCQl1cGRhdGVfYXhpX3FvcyhNU01fQVhJX1FPU19QUkVWSUVXKTsKLQkJYnJlYWs7Ci0JY2FzZSBTX1ZJREVPOgotCQl1cGRhdGVfYXhpX3FvcyhNU01fQVhJX1FPU19SRUNPUkRJTkcpOwotCQlicmVhazsKLQljYXNlIFNfQ0FQVFVSRToKLQkJdXBkYXRlX2F4aV9xb3MoTVNNX0FYSV9RT1NfU05BUFNIT1QpOwotCQlicmVhazsKLQljYXNlIFNfREVGQVVMVDoKLQkJdXBkYXRlX2F4aV9xb3MoUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotCQlicmVhazsKLQljYXNlIFNfRVhJVDoKLQkJcmVsZWFzZV9heGlfcW9zKCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUNEQkcoIiVzOiBJTlZBTElEIENBU0VcbiIsIF9fZnVuY19fKTsKLQl9Ci19Ci0KLWludCBtc21fY2FtX2NvcmVfcmVzZXQodm9pZCkKLXsKLQlzdHJ1Y3QgY2xrICpjbGsxOwotCWludCByYyA9IDA7Ci0KLQljbGsxID0gY2xrX2dldChOVUxMLCAiY3NpX3ZmZV9jbGsiKTsKLQlpZiAoSVNfRVJSKGNsazEpKSB7Ci0JCXByX2VycigiJXM6IGRpZCBub3QgZ2V0IGNzaV92ZmVfY2xrXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBQVFJfRVJSKGNsazEpOwotCX0KLQotCXJjID0gY2xrX3Jlc2V0KGNsazEsIENMS19SRVNFVF9BU1NFUlQpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOmNzaV92ZmVfY2xrIGFzc2VydCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJY2xrX3B1dChjbGsxKTsKLQkJcmV0dXJuIHJjOwotCX0KLQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTIwMCk7Ci0JcmMgPSBjbGtfcmVzZXQoY2xrMSwgQ0xLX1JFU0VUX0RFQVNTRVJUKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczpjc2lfdmZlX2NsayBkZWFzc2VydCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJY2xrX3B1dChjbGsxKTsKLQkJcmV0dXJuIHJjOwotCX0KLQljbGtfcHV0KGNsazEpOwotCi0JY2xrMSA9IGNsa19nZXQoTlVMTCwgImNzaV9jbGsiKTsKLQlpZiAoSVNfRVJSKGNsazEpKSB7Ci0JCXByX2VycigiJXM6IGRpZCBub3QgZ2V0IGNzaV9jbGtcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIFBUUl9FUlIoY2xrMSk7Ci0JfQotCi0JcmMgPSBjbGtfcmVzZXQoY2xrMSwgQ0xLX1JFU0VUX0FTU0VSVCk7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6Y3NpX2NsayBhc3NlcnQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWNsa19wdXQoY2xrMSk7Ci0JCXJldHVybiByYzsKLQl9Ci0JdXNsZWVwX3JhbmdlKDEwMDAsIDEyMDApOwotCXJjID0gY2xrX3Jlc2V0KGNsazEsIENMS19SRVNFVF9ERUFTU0VSVCk7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6Y3NpX2NsayBkZWFzc2VydCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJY2xrX3B1dChjbGsxKTsKLQkJcmV0dXJuIHJjOwotCX0KLQljbGtfcHV0KGNsazEpOwotCi0JY2xrMSA9IGNsa19nZXQoTlVMTCwgImNzaV9wY2xrIik7Ci0JaWYgKElTX0VSUihjbGsxKSkgewotCQlwcl9lcnIoIiVzOiBkaWQgbm90IGdldCBjc2lfcGNsa1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gUFRSX0VSUihjbGsxKTsKLQl9Ci0KLQlyYyA9IGNsa19yZXNldChjbGsxLCBDTEtfUkVTRVRfQVNTRVJUKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczpjc2lfcGNsayBhc3NlcnQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWNsa19wdXQoY2xrMSk7Ci0JCXJldHVybiByYzsKLQl9Ci0JdXNsZWVwX3JhbmdlKDEwMDAsIDEyMDApOwotCXJjID0gY2xrX3Jlc2V0KGNsazEsIENMS19SRVNFVF9ERUFTU0VSVCk7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6Y3NpX3BjbGsgZGVhc3NlcnQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWNsa19wdXQoY2xrMSk7Ci0JCXJldHVybiByYzsKLQl9Ci0JY2xrX3B1dChjbGsxKTsKLQotCXJldHVybiByYzsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9pby9tc21faW9fdmZlMzFfdjRsMi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvL21zbV9pb192ZmUzMV92NGwyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjg3ZTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvL21zbV9pb192ZmUzMV92NGwyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWFjaC92cmVnLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2Nsay5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX2J1cy5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX2J1c19ib2FyZC5oPgotCi0jaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Ci0KLS8qIEFYSSByYXRlcyBpbiBLSHogKi8KLSNkZWZpbmUgTVNNX0FYSV9RT1NfUFJFVklFVyAgICAgMTkyMDAwCi0jZGVmaW5lIE1TTV9BWElfUU9TX1NOQVBTSE9UICAgIDE5MjAwMAotI2RlZmluZSBNU01fQVhJX1FPU19SRUNPUkRJTkcgICAxOTIwMDAKLQotI2RlZmluZSBCVUZGX1NJWkVfMTI4IDEyOAotCi1zdGF0aWMgc3RydWN0IGNsayAqY2FtaW9fdmZlX2NsazsKLXN0YXRpYyBzdHJ1Y3QgY2xrICpjYW1pb192cGVfY2xrOwotc3RhdGljIHN0cnVjdCBjbGsgKmNhbWlvX3ZwZV9wY2xrOwotc3RhdGljIHN0cnVjdCByZWd1bGF0b3IgKmZzX3ZwZTsKLQotc3RhdGljIGludCB2cGVfY2xrX3JhdGU7Ci0KLWludCBtc21fY2FtaW9fY2xrX2VuYWJsZShlbnVtIG1zbV9jYW1pb19jbGtfdHlwZSBjbGt0eXBlKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKLQotCXN3aXRjaCAoY2xrdHlwZSkgewotCWNhc2UgQ0FNSU9fVlBFX0NMSzoKLQkJY2FtaW9fdnBlX2NsayA9Ci0JCWNsayA9IGNsa19nZXQoTlVMTCwgInZwZV9jbGsiKTsKLQkJdnBlX2Nsa19yYXRlID0gY2xrX3JvdW5kX3JhdGUoY2FtaW9fdnBlX2NsaywgdnBlX2Nsa19yYXRlKTsKLQkJY2xrX3NldF9yYXRlKGNhbWlvX3ZwZV9jbGssIHZwZV9jbGtfcmF0ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1JT19WUEVfUENMSzoKLQkJY2FtaW9fdnBlX3BjbGsgPQotCQljbGsgPSBjbGtfZ2V0KE5VTEwsICJ2cGVfcGNsayIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmICghSVNfRVJSKGNsaykpIHsKLQkJY2xrX3ByZXBhcmUoY2xrKTsKLQkJY2xrX2VuYWJsZShjbGspOwotCX0gZWxzZSB7Ci0JCXJjID0gLTE7Ci0JfQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9jYW1pb19jbGtfZGlzYWJsZShlbnVtIG1zbV9jYW1pb19jbGtfdHlwZSBjbGt0eXBlKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKLQotCXN3aXRjaCAoY2xrdHlwZSkgewotCWNhc2UgQ0FNSU9fVlBFX0NMSzoKLQkJY2xrID0gY2FtaW9fdnBlX2NsazsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlPX1ZQRV9QQ0xLOgotCQljbGsgPSBjYW1pb192cGVfcGNsazsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlpZiAoIUlTX0VSUihjbGspKSB7Ci0JCWNsa19kaXNhYmxlKGNsayk7Ci0JCWNsa191bnByZXBhcmUoY2xrKTsKLQkJY2xrX3B1dChjbGspOwotCX0gZWxzZSB7Ci0JCXJjID0gLTE7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2NhbWlvX3ZmZV9jbGtfcmF0ZV9zZXQoaW50IHJhdGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBjYW1pb192ZmVfY2xrOwotCWlmIChyYXRlID4gY2xrX2dldF9yYXRlKGNsaykpCi0JCXJjID0gY2xrX3NldF9yYXRlKGNsaywgcmF0ZSk7Ci0JcmV0dXJuIHJjOwotfQotCi12b2lkIG1zbV9jYW1pb19jbGtfcmF0ZV9zZXRfMihzdHJ1Y3QgY2xrICpjbGssIGludCByYXRlKQotewotCWNsa19zZXRfcmF0ZShjbGssIHJhdGUpOwotfQotCi1pbnQgbXNtX2NhbWlvX3ZwZV9jbGtfZGlzYWJsZSh2b2lkKQotewotCWludCByYyA9IDA7Ci0JaWYgKGZzX3ZwZSkgewotCQlyZWd1bGF0b3JfZGlzYWJsZShmc192cGUpOwotCQlyZWd1bGF0b3JfcHV0KGZzX3ZwZSk7Ci0JfQotCi0JcmMgPSBtc21fY2FtaW9fY2xrX2Rpc2FibGUoQ0FNSU9fVlBFX0NMSyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXJjID0gbXNtX2NhbWlvX2Nsa19kaXNhYmxlKENBTUlPX1ZQRV9QQ0xLKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fY2FtaW9fdnBlX2Nsa19lbmFibGUodWludDMyX3QgY2xrX3JhdGUpCi17Ci0JaW50IHJjID0gMDsKLQlmc192cGUgPSByZWd1bGF0b3JfZ2V0KE5VTEwsICJmc192cGUiKTsKLQlpZiAoSVNfRVJSKGZzX3ZwZSkpIHsKLQkJQ0RCRygiJXM6IFJlZ3VsYXRvciBGU19WUEUgZ2V0IGZhaWxlZCAlbGRcbiIsIF9fZnVuY19fLAotCQkJUFRSX0VSUihmc192cGUpKTsKLQkJZnNfdnBlID0gTlVMTDsKLQl9IGVsc2UgaWYgKHJlZ3VsYXRvcl9lbmFibGUoZnNfdnBlKSkgewotCQlDREJHKCIlczogUmVndWxhdG9yIEZTX1ZQRSBlbmFibGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJlZ3VsYXRvcl9wdXQoZnNfdnBlKTsKLQl9Ci0KLQl2cGVfY2xrX3JhdGUgPSBjbGtfcmF0ZTsKLQlyYyA9IG1zbV9jYW1pb19jbGtfZW5hYmxlKENBTUlPX1ZQRV9DTEspOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gbXNtX2NhbWlvX2Nsa19lbmFibGUoQ0FNSU9fVlBFX1BDTEspOwotCXJldHVybiByYzsKLX0KLQotdm9pZCBtc21fY2FtaW9fdmZlX2Jsa19yZXNldCh2b2lkKQotewotCXJldHVybjsKLX0KLQotdm9pZCBtc21fY2FtaW9fdmZlX2Jsa19yZXNldF8zKHZvaWQpCi17Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBtc21fY2FtaW9fYXhpX2NmZyhlbnVtIG1zbV9idXNfcGVyZl9zZXR0aW5nIHBlcmZfc2V0dGluZykKLXsKLQlzd2l0Y2ggKHBlcmZfc2V0dGluZykgewotCWNhc2UgU19JTklUOgotCQlhZGRfYXhpX3FvcygpOwotCQlicmVhazsKLQljYXNlIFNfUFJFVklFVzoKLQkJdXBkYXRlX2F4aV9xb3MoTVNNX0FYSV9RT1NfUFJFVklFVyk7Ci0JCWJyZWFrOwotCWNhc2UgU19WSURFTzoKLQkJdXBkYXRlX2F4aV9xb3MoTVNNX0FYSV9RT1NfUkVDT1JESU5HKTsKLQkJYnJlYWs7Ci0JY2FzZSBTX0NBUFRVUkU6Ci0JCXVwZGF0ZV9heGlfcW9zKE1TTV9BWElfUU9TX1NOQVBTSE9UKTsKLQkJYnJlYWs7Ci0JY2FzZSBTX0RFRkFVTFQ6Ci0JCXVwZGF0ZV9heGlfcW9zKFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQkJYnJlYWs7Ci0JY2FzZSBTX0VYSVQ6Ci0JCXJlbGVhc2VfYXhpX3FvcygpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlDREJHKCIlczogSU5WQUxJRCBDQVNFXG4iLCBfX2Z1bmNfXyk7Ci0JfQotfQotCi12b2lkIG1zbV9jYW1pb19idXNfc2NhbGVfY2ZnKHN0cnVjdCBtc21fYnVzX3NjYWxlX3BkYXRhICpjYW1fYnVzX3NjYWxlX3RhYmxlLAotCQllbnVtIG1zbV9idXNfcGVyZl9zZXR0aW5nIHBlcmZfc2V0dGluZykKLXsKLQlzdGF0aWMgdWludDMyX3QgYnVzX3BlcmZfY2xpZW50OwotCWludCByYyA9IDA7Ci0JaWYgKGNhbV9idXNfc2NhbGVfdGFibGUgPT0gTlVMTCkgewotCQltc21fY2FtaW9fYXhpX2NmZyhwZXJmX3NldHRpbmcpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3dpdGNoIChwZXJmX3NldHRpbmcpIHsKLQljYXNlIFNfSU5JVDoKLQkJYnVzX3BlcmZfY2xpZW50ID0KLQkJCW1zbV9idXNfc2NhbGVfcmVnaXN0ZXJfY2xpZW50KGNhbV9idXNfc2NhbGVfdGFibGUpOwotCQlpZiAoIWJ1c19wZXJmX2NsaWVudCkgewotCQkJcHJfZXJyKCIlczogUmVnaXN0cmF0aW9uIEZhaWxlZCEhIVxuIiwgX19mdW5jX18pOwotCQkJYnVzX3BlcmZfY2xpZW50ID0gMDsKLQkJCXJldHVybjsKLQkJfQotCQlDREJHKCIlczogU19JTklUIHJjID0gJXVcbiIsIF9fZnVuY19fLCBidXNfcGVyZl9jbGllbnQpOwotCQlicmVhazsKLQljYXNlIFNfRVhJVDoKLQkJaWYgKGJ1c19wZXJmX2NsaWVudCkgewotCQkJQ0RCRygiJXM6IFNfRVhJVFxuIiwgX19mdW5jX18pOwotCQkJbXNtX2J1c19zY2FsZV91bnJlZ2lzdGVyX2NsaWVudChidXNfcGVyZl9jbGllbnQpOwotCQl9IGVsc2UKLQkJCXByX2VycigiJXM6IEJ1cyBDbGllbnQgTk9UIFJlZ2lzdGVyZWQhISFcbiIsIF9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JY2FzZSBTX1BSRVZJRVc6Ci0JCWlmIChidXNfcGVyZl9jbGllbnQpIHsKLQkJCXJjID0gbXNtX2J1c19zY2FsZV9jbGllbnRfdXBkYXRlX3JlcXVlc3QoCi0JCQkJYnVzX3BlcmZfY2xpZW50LCAxKTsKLQkJCUNEQkcoIiVzOiBTX1BSRVZJRVcgcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJfSBlbHNlCi0JCQlwcl9lcnIoIiVzOiBCdXMgQ2xpZW50IE5PVCBSZWdpc3RlcmVkISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgU19WSURFTzoKLQkJaWYgKGJ1c19wZXJmX2NsaWVudCkgewotCQkJcmMgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdCgKLQkJCQlidXNfcGVyZl9jbGllbnQsIDIpOwotCQkJQ0RCRygiJXM6IFNfVklERU8gcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJfSBlbHNlCi0JCQlwcl9lcnIoIiVzOiBCdXMgQ2xpZW50IE5PVCBSZWdpc3RlcmVkISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgU19DQVBUVVJFOgotCQlpZiAoYnVzX3BlcmZfY2xpZW50KSB7Ci0JCQlyYyA9IG1zbV9idXNfc2NhbGVfY2xpZW50X3VwZGF0ZV9yZXF1ZXN0KAotCQkJCWJ1c19wZXJmX2NsaWVudCwgMyk7Ci0JCQlDREJHKCIlczogU19DQVBUVVJFIHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCX0gZWxzZQotCQkJcHJfZXJyKCIlczogQnVzIENsaWVudCBOT1QgUmVnaXN0ZXJlZCEhIVxuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQotCWNhc2UgU19aU0w6Ci0JCWlmIChidXNfcGVyZl9jbGllbnQpIHsKLQkJCXJjID0gbXNtX2J1c19zY2FsZV9jbGllbnRfdXBkYXRlX3JlcXVlc3QoCi0JCQkJYnVzX3BlcmZfY2xpZW50LCA0KTsKLQkJCUNEQkcoIiVzOiBTX1pTTCByYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQl9IGVsc2UKLQkJCXByX2VycigiJXM6IEJ1cyBDbGllbnQgTk9UIFJlZ2lzdGVyZWQhISFcbiIsIF9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JY2FzZSBTX1NURVJFT19WSURFTzoKLQkJaWYgKGJ1c19wZXJmX2NsaWVudCkgewotCQkJcmMgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdCgKLQkJCQlidXNfcGVyZl9jbGllbnQsIDUpOwotCQkJQ0RCRygiJXM6IFNfU1RFUkVPX1ZJREVPIHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCX0gZWxzZQotCQkJcHJfZXJyKCIlczogQnVzIENsaWVudCBOT1QgUmVnaXN0ZXJlZCEhIVxuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIFNfU1RFUkVPX0NBUFRVUkU6Ci0JCWlmIChidXNfcGVyZl9jbGllbnQpIHsKLQkJCXJjID0gbXNtX2J1c19zY2FsZV9jbGllbnRfdXBkYXRlX3JlcXVlc3QoCi0JCQkJYnVzX3BlcmZfY2xpZW50LCA2KTsKLQkJCUNEQkcoIiVzOiBTX1NURVJFT19WSURFTyByYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQl9IGVsc2UKLQkJCXByX2VycigiJXM6IEJ1cyBDbGllbnQgTk9UIFJlZ2lzdGVyZWQhISFcbiIsIF9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JY2FzZSBTX0RFRkFVTFQ6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX3dhcm5pbmcoIiVzOiBJTlZBTElEIENBU0VcbiIsIF9fZnVuY19fKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21lcmN1cnkvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOWM5NTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21lcmN1cnkvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUdDQ19WRVJTSU9OICAgICAgOj0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChQV0QpL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2ggJChDUk9TU19DT01QSUxFKWdjYykKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MQotb2JqLSQoQ09ORklHX01TTV9NRVJDVVJZKSArPSBtc21fbWVyY3VyeV9kZXYubyBtc21fbWVyY3VyeV9jb3JlLm8gbXNtX21lcmN1cnlfaHcubyBtc21fbWVyY3VyeV9wbGF0Zm9ybS5vIG1zbV9tZXJjdXJ5X3N5bmMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21lcmN1cnkvbXNtX21lcmN1cnlfY29tbW9uLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbWVyY3VyeS9tc21fbWVyY3VyeV9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlN2Y3ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbWVyY3VyeS9tc21fbWVyY3VyeV9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIE1TTV9NRVJDVVJZX0NPTU1PTl9ICi0jZGVmaW5lIE1TTV9NRVJDVVJZX0NPTU1PTl9ICi0KLSNkZWZpbmUgTVNNX01FUkNVUllfREVCVUcKLSNpZmRlZiBNU01fTUVSQ1VSWV9ERUJVRwotI2RlZmluZSBNQ1JfREJHKGZtdCwgYXJncy4uLikgcHJfZGVidWcoZm10LCAjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBNQ1JfREJHKGZtdCwgYXJncy4uLikgZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNkZWZpbmUgTUNSX1BSX0VSUiAgIHByX2VycgotI2VuZGlmIC8qIE1TTV9NRVJDVVJZX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbWVyY3VyeS9tc21fbWVyY3VyeV9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbWVyY3VyeS9tc21fbWVyY3VyeV9jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNjMwZjAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21lcmN1cnkvbXNtX21lcmN1cnlfY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bWFjaC9jbGsuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9idXMuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9idXNfYm9hcmQuaD4KLSNpbmNsdWRlICJtc21fbWVyY3VyeV9ody5oIgotI2luY2x1ZGUgIm1zbV9tZXJjdXJ5X2NvcmUuaCIKLSNpbmNsdWRlICJtc21fbWVyY3VyeV9wbGF0Zm9ybS5oIgotI2luY2x1ZGUgIm1zbV9tZXJjdXJ5X2NvbW1vbi5oIgotCi1zdGF0aWMgaW50IHJlc2V0X2RvbmVfYWNrOwotc3RhdGljIHNwaW5sb2NrX3QgcmVzZXRfbG9jazsKLXN0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCByZXNldF93YWl0OwotCi1pbnQgbWVyY3VyeV9jb3JlX3Jlc2V0KHZvaWQpCi17Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKLQotCS8qUmVzZXR0dGluZyBNTVNTIEZhYnJpYyovCi0KLQljbGsgPSBjbGtfZ2V0KE5VTEwsICJqcGVnZF9jbGsiKTsKLQotCWlmICghSVNfRVJSKGNsaykpCi0JCWNsa19lbmFibGUoY2xrKTsKLQotCW1zbV9idXNfYXhpX3BvcnRoYWx0KE1TTV9CVVNfTUFTVEVSX0pQRUdfREVDKTsKLQljbGtfcmVzZXQoY2xrLCBDTEtfUkVTRVRfQVNTRVJUKTsKLQotCS8qbmVlZCB0byBoYXZlIHNvbWUgZGVsYXkgaGVyZSwgdGhlcmUgaXMgbm8KLQkgb3RoZXIgd2F5IHRvIGtub3cgaWYgaGFyZHdhcmUgcmVzZXQgaXMgY29tcGxldGUqLwotCXVzbGVlcF9yYW5nZSgxMDAwLCAxMjAwKTsKLQotCW1zbV9idXNfYXhpX3BvcnR1bmhhbHQoTVNNX0JVU19NQVNURVJfSlBFR19ERUMpOwotCWNsa19yZXNldChjbGssIENMS19SRVNFVF9ERUFTU0VSVCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IG1zbV9tZXJjdXJ5X2NvcmVfcmVzZXQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByYyA9IDA7Ci0JaW50IHRtID0gNTAwOy8qNTAwbXMqLwotCU1DUl9EQkcoIlxuJXNcbiglZCklcygpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZyZXNldF9sb2NrLCBmbGFncyk7Ci0JcmVzZXRfZG9uZV9hY2sgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlc2V0X2xvY2ssIGZsYWdzKTsKLQotCW1zbV9tZXJjdXJ5X2h3X3Jlc2V0KCk7Ci0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChyZXNldF93YWl0LAotCQlyZXNldF9kb25lX2FjaywKLQkJbXNlY3NfdG9famlmZmllcyh0bSkpOwotCi0JaWYgKCFyZXNldF9kb25lX2FjaykgewotCQlNQ1JfREJHKCIlczogcmVzZXQgQUNLIGZhaWxlZCAlZCIsIF9fZnVuY19fLCByYyk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JTUNSX0RCRygiKCVkKSVzKCkgcmVzZXRfZG9uZV9hY2sgcmMgJWRcblxuIiwgX19MSU5FX18sIF9fZnVuY19fLCByYyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJlc2V0X2xvY2ssIGZsYWdzKTsKLQlyZXNldF9kb25lX2FjayA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVzZXRfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgbXNtX21lcmN1cnlfY29yZV9pbml0KHZvaWQpCi17Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmcmVzZXRfd2FpdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnJlc2V0X2xvY2spOwotfQotCi1zdGF0aWMgaW50ICgqbXNtX21lcmN1cnlfaXJxX2hhbmRsZXIpIChpbnQsIHZvaWQgKiwgdm9pZCAqKTsKLQotaXJxcmV0dXJuX3QgbXNtX21lcmN1cnlfY29yZV9pcnEoaW50IGlycV9udW0sIHZvaWQgKmNvbnRleHQpCi17Ci0Jdm9pZCAqZGF0YSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50MTZfdCBtY3JfcmRfaXJxOwotCXVpbnQxNl90IG1jcl93cl9pcnE7Ci0JdWludDMyX3QganBlZ19zdGF0dXM7Ci0KLQlNQ1JfREJHKCJcbiglZCklcygpIGlycV9udW1iZXIgPSAlZCIsIF9fTElORV9fLCBfX2Z1bmNfXywgaXJxX251bSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcmVzZXRfbG9jaywgZmxhZ3MpOwotCXJlc2V0X2RvbmVfYWNrID0gMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNldF9sb2NrLCBmbGFncyk7Ci0KLQltc21fbWVyY3VyeV9od19pcnFfZ2V0X3N0YXR1cygmbWNyX3JkX2lycSwgJm1jcl93cl9pcnEpOwotCW1zbV9tZXJjdXJ5X2h3X2dldF9qcGVnX3N0YXR1cygmanBlZ19zdGF0dXMpOwotCU1DUl9EQkcoIm1lcmN1cnlfcmRfaXJxID0gMHglMDhYXG4iLCBtY3JfcmRfaXJxKTsKLQlNQ1JfREJHKCJtZXJjdXJ5X3dyX2lycSA9IDB4JTA4WFxuIiwgbWNyX3dyX2lycSk7Ci0JTUNSX0RCRygianBlZ19zdGF0dXMgPSAweCUwOFhcbiIsIGpwZWdfc3RhdHVzKTsKLQlpZiAobWNyX3dyX2lycSAmIE1TTV9NRVJDVVJZX0hXX0lSUV9TV19SRVNFVF9BQ0spIHsKLQkJTUNSX0RCRygiKioqIFNXIFJlc2V0IElSUSByZWNlaXZlZCAqKipcbiIpOwotCQl3YWtlX3VwKCZyZXNldF93YWl0KTsKLQkJbXNtX21lcmN1cnlfaHdfd3JfaXJxX2NsZWFyKE1TTV9NRVJDVVJZX0hXX0lSUV9TV19SRVNFVF9BQ0spOwotCX0KLQlpZiAobWNyX3dyX2lycSAmIE1TTV9NRVJDVVJZX0hXX0lSUV9XUl9FUlJfQUNLKSB7Ci0JCU1DUl9EQkcoIiAgICoqKiBFcnJvciBJUlEgcmVjZWl2ZWQgKioqXG4iKTsKLQkJbXNtX21lcmN1cnlfaXJxX2hhbmRsZXIoTVNNX01FUkNVUllfSFdfSVJRX1dSX0VSUl9BQ0ssCi0JCQkJCQkJCWNvbnRleHQsIGRhdGEpOwotCX0KLQlpZiAobWNyX3dyX2lycSAmIE1TTV9NRVJDVVJZX0hXX0lSUV9XUl9FT0lfQUNLKSB7Ci0JCU1DUl9EQkcoIiAgICoqKiBXRV9FT0kgSVJRIHJlY2VpdmVkICoqKlxuIik7Ci0JCW1zbV9tZXJjdXJ5X2lycV9oYW5kbGVyKE1TTV9NRVJDVVJZX0hXX0lSUV9XUl9FT0lfQUNLLAotCQkJCQkJCQljb250ZXh0LCBkYXRhKTsKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi12b2lkIG1zbV9tZXJjdXJ5X2NvcmVfaXJxX2luc3RhbGwoaW50ICgqaXJxX2hhbmRsZXIpIChpbnQsIHZvaWQgKiwgdm9pZCAqKSkKLXsKLQltc21fbWVyY3VyeV9pcnFfaGFuZGxlciA9IGlycV9oYW5kbGVyOwotfQotCi12b2lkIG1zbV9tZXJjdXJ5X2NvcmVfaXJxX3JlbW92ZSh2b2lkKQotewotCW1zbV9tZXJjdXJ5X2lycV9oYW5kbGVyID0gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X2NvcmUuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X2NvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzN2U3Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbWVyY3VyeS9tc21fbWVyY3VyeV9jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBNU01fTUVSQ1VSWV9DT1JFX0gKLSNkZWZpbmUgTVNNX01FUkNVUllfQ09SRV9ICi0KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlICJtc21fbWVyY3VyeV9ody5oIgotCi0jZGVmaW5lIG1zbV9tZXJjdXJ5X2NvcmVfYnVmIG1zbV9tZXJjdXJ5X2h3X2J1ZgotCi1pcnFyZXR1cm5fdCBtc21fbWVyY3VyeV9jb3JlX2lycShpbnQgaXJxX251bSwgdm9pZCAqY29udGV4dCk7Ci0KLXZvaWQgbXNtX21lcmN1cnlfY29yZV9pcnFfaW5zdGFsbChpbnQgKCppcnFfaGFuZGxlcikgKGludCwgdm9pZCAqLCB2b2lkICopKTsKLXZvaWQgbXNtX21lcmN1cnlfY29yZV9pcnFfcmVtb3ZlKHZvaWQpOwotCi1pbnQgbXNtX21lcmN1cnlfY29yZV9yZXNldCh2b2lkKTsKLXZvaWQgbXNtX21lcmN1cnlfY29yZV9pbml0KHZvaWQpOwotCi0jZW5kaWYgLyogTVNNX01FUkNVUllfQ09SRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbWVyY3VyeS9tc21fbWVyY3VyeV9kZXYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X2Rldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjQ1YmZkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X2Rldi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX21lcmN1cnkuaD4KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jaW5jbHVkZSAibXNtX21lcmN1cnlfc3luYy5oIgotI2luY2x1ZGUgIm1zbV9tZXJjdXJ5X2NvbW1vbi5oIgotI2luY2x1ZGUgIm1zbS5oIgotCi0jZGVmaW5lIE1TTV9NRVJDVVJZX05BTUUgIm1lcmN1cnkiCi0KLXN0YXRpYyBpbnQgbXNtX21lcmN1cnlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlpbnQgcmM7Ci0KLQlzdHJ1Y3QgbXNtX21lcmN1cnlfZGV2aWNlICpwbWVyY3VyeV9kZXYgPSBjb250YWluZXJfb2YoaW5vZGUtPmlfY2RldiwKLQkJc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSwgY2Rldik7Ci0JZmlscC0+cHJpdmF0ZV9kYXRhID0gcG1lcmN1cnlfZGV2OwotCi0JTUNSX0RCRygiXG4tLS0oJWQpJXMoKVxuIiwgX19MSU5FX18sIF9fZnVuY19fKTsKLQotCXJjID0gX19tc21fbWVyY3VyeV9vcGVuKHBtZXJjdXJ5X2Rldik7Ci0KLQlNQ1JfREJHKCIlczolZF0gJXMgb3Blbl9jb3VudCA9ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLCBwbWVyY3VyeV9kZXYtPm9wZW5fY291bnQpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9tZXJjdXJ5X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCi17Ci0JaW50IHJjOwotCi0Jc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqcG1lcmN1cnlfZGV2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCi0JTUNSX0RCRygiXG4tLS0oJWQpJXMoKVxuIiwgX19MSU5FX18sIF9fZnVuY19fKTsKLQotCXJjID0gX19tc21fbWVyY3VyeV9yZWxlYXNlKHBtZXJjdXJ5X2Rldik7Ci0KLQlNQ1JfREJHKCIlczolZF0gJXMgb3Blbl9jb3VudCA9ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLCBwbWVyY3VyeV9kZXYtPm9wZW5fY291bnQpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgbXNtX21lcmN1cnlfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCi0JdW5zaWduZWQgbG9uZyBhcmcpIHsKLQlpbnQgcmM7Ci0Jc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqcG1lcmN1cnlfZGV2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCXJjID0gX19tc21fbWVyY3VyeV9pb2N0bChwbWVyY3VyeV9kZXYsIGNtZCwgYXJnKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1zbV9tZXJjdXJ5X2ZvcHMgPSB7Ci0JLm93bmVyICAgICA9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgID0gbXNtX21lcmN1cnlfb3BlbiwKLQkucmVsZWFzZSA9IG1zbV9tZXJjdXJ5X3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsID0gbXNtX21lcmN1cnlfaW9jdGwsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsYXNzICptc21fbWVyY3VyeV9jbGFzczsKLXN0YXRpYyBkZXZfdCBtc21fbWVyY3VyeV9kZXZubzsKLXN0YXRpYyBzdHJ1Y3QgbXNtX21lcmN1cnlfZGV2aWNlICptc21fbWVyY3VyeV9kZXZpY2VfcDsKLQotaW50IG1zbV9tZXJjdXJ5X3N1YmRldl9pbml0KHN0cnVjdCB2NGwyX3N1YmRldiAqbWVyY3VyeV9zZCkKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqcGdtbl9kZXYgPQotCQkoc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqKW1lcmN1cnlfc2QtPmhvc3RfcHJpdjsKLQotCU1DUl9EQkcoIiVzOiVkOiBtZXJjdXJ5X3NkPTB4JXggcGdtbl9kZXY9MHgleFxuIiwKLQkJX19mdW5jX18sIF9fTElORV9fLCAodWludDMyX3QpbWVyY3VyeV9zZCwgKHVpbnQzMl90KXBnbW5fZGV2KTsKLQlyYyA9IF9fbXNtX21lcmN1cnlfb3BlbihwZ21uX2Rldik7Ci0JTUNSX0RCRygiJXM6JWQ6IHJjPSVkXG4iLAotCQlfX2Z1bmNfXywgX19MSU5FX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBsb25nIG1zbV9tZXJjdXJ5X3N1YmRldl9pb2N0bChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlsb25nIHJjOwotCXN0cnVjdCBtc21fbWVyY3VyeV9kZXZpY2UgKnBnbW5fZGV2ID0KLQkJKHN0cnVjdCBtc21fbWVyY3VyeV9kZXZpY2UgKilzZC0+aG9zdF9wcml2OwotCi0JTUNSX0RCRygiJXM6IGNtZD0lZFxuIiwgX19mdW5jX18sIGNtZCk7Ci0KLQlNQ1JfREJHKCIlczogcGdtbl9kZXYgMHgleCIsIF9fZnVuY19fLCAodWludDMyX3QpcGdtbl9kZXYpOwotCi0JTUNSX0RCRygiJXM6IENhbGxpbmcgX19tc21fbWVyY3VyeV9pb2N0bFxuIiwgX19mdW5jX18pOwotCi0JcmMgPSBfX21zbV9tZXJjdXJ5X2lvY3RsKHBnbW5fZGV2LCBjbWQsICh1bnNpZ25lZCBsb25nKWFyZyk7Ci0JcHJfZGVidWcoIiVzOiBYXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi12b2lkIG1zbV9tZXJjdXJ5X3N1YmRldl9yZWxlYXNlKHN0cnVjdCB2NGwyX3N1YmRldiAqbWVyY3VyeV9zZCkKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqcGdtbl9kZXYgPQotCQkoc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqKW1lcmN1cnlfc2QtPmhvc3RfcHJpdjsKLQlNQ1JfREJHKCIlczpwZ21uX2Rldj0weCV4IiwgX19mdW5jX18sICh1aW50MzJfdClwZ21uX2Rldik7Ci0JcmMgPSBfX21zbV9tZXJjdXJ5X3JlbGVhc2UocGdtbl9kZXYpOwotCU1DUl9EQkcoIiVzOnJjPSVkIiwgX19mdW5jX18sIHJjKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBtc21fbWVyY3VyeV9zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmlvY3RsID0gbXNtX21lcmN1cnlfc3ViZGV2X2lvY3RsLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgbXNtX21lcmN1cnlfc3ViZGV2X29wcyA9IHsKLQkuY29yZSA9ICZtc21fbWVyY3VyeV9zdWJkZXZfY29yZV9vcHMsCi19OwotCi1zdGF0aWMgaW50IG1zbV9tZXJjdXJ5X2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmMgPSAtMTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0KLQlNQ1JfREJHKCIlczpcbiIsIF9fZnVuY19fKTsKLQltc21fbWVyY3VyeV9kZXZpY2VfcCA9IF9fbXNtX21lcmN1cnlfaW5pdChwZGV2KTsKLQlpZiAobXNtX21lcmN1cnlfZGV2aWNlX3AgPT0gTlVMTCkgewotCQlNQ1JfUFJfRVJSKCIlczogaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQl2NGwyX3N1YmRldl9pbml0KCZtc21fbWVyY3VyeV9kZXZpY2VfcC0+c3ViZGV2LAotCQkmbXNtX21lcmN1cnlfc3ViZGV2X29wcyk7Ci0JdjRsMl9zZXRfc3ViZGV2X2hvc3RkYXRhKCZtc21fbWVyY3VyeV9kZXZpY2VfcC0+c3ViZGV2LAotCQltc21fbWVyY3VyeV9kZXZpY2VfcCk7Ci0JcHJfZGVidWcoIiVzOiBtc21fbWVyY3VyeV9kZXZpY2VfcCAweCV4IiwgX19mdW5jX18sCi0JCSh1aW50MzJfdCltc21fbWVyY3VyeV9kZXZpY2VfcCk7Ci0JTUNSX0RCRygiJXM6bWVyY3VyeTogcGxhdGZvcm1fc2V0X2RydmRhdGFcbiIsIF9fZnVuY19fKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCAmbXNtX21lcmN1cnlfZGV2aWNlX3AtPnN1YmRldik7Ci0KLQlyYyA9IGFsbG9jX2NocmRldl9yZWdpb24oJm1zbV9tZXJjdXJ5X2Rldm5vLCAwLCAxLCBNU01fTUVSQ1VSWV9OQU1FKTsKLQlpZiAocmMgPCAwKSB7Ci0JCU1DUl9QUl9FUlIoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgY2hyZGV2XG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbF8xOwotCX0KLQotCWlmICghbXNtX21lcmN1cnlfY2xhc3MpIHsKLQkJbXNtX21lcmN1cnlfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsIE1TTV9NRVJDVVJZX05BTUUpOwotCQlpZiAoSVNfRVJSKG1zbV9tZXJjdXJ5X2NsYXNzKSkgewotCQkJcmMgPSBQVFJfRVJSKG1zbV9tZXJjdXJ5X2NsYXNzKTsKLQkJCU1DUl9QUl9FUlIoIiVzOiBjcmVhdGUgZGV2aWNlIGNsYXNzIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGZhaWxfMjsKLQkJfQotCX0KLQotCWRldiA9IGRldmljZV9jcmVhdGUobXNtX21lcmN1cnlfY2xhc3MsIE5VTEwsCi0JCU1LREVWKE1BSk9SKG1zbV9tZXJjdXJ5X2Rldm5vKSwgTUlOT1IobXNtX21lcmN1cnlfZGV2bm8pKSwgTlVMTCwKLQkJIiVzJWQiLCBNU01fTUVSQ1VSWV9OQU1FLCAwKTsKLQotCWlmIChJU19FUlIoZGV2KSkgewotCQlNQ1JfUFJfRVJSKCIlczogZXJyb3IgY3JlYXRpbmcgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBmYWlsXzM7Ci0JfQotCi0JY2Rldl9pbml0KCZtc21fbWVyY3VyeV9kZXZpY2VfcC0+Y2RldiwgJm1zbV9tZXJjdXJ5X2ZvcHMpOwotCW1zbV9tZXJjdXJ5X2RldmljZV9wLT5jZGV2Lm93bmVyID0gVEhJU19NT0RVTEU7Ci0JbXNtX21lcmN1cnlfZGV2aWNlX3AtPmNkZXYub3BzICAgPQotCQkoY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqKSAmbXNtX21lcmN1cnlfZm9wczsKLQlyYyA9IGNkZXZfYWRkKCZtc21fbWVyY3VyeV9kZXZpY2VfcC0+Y2RldiwgbXNtX21lcmN1cnlfZGV2bm8sIDEpOwotCWlmIChyYyA8IDApIHsKLQkJTUNSX1BSX0VSUigiJXM6IGVycm9yIGFkZGluZyBjZGV2XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBmYWlsXzQ7Ci0JfQotCi0JTUNSX0RCRygiJXMgJXM6IHN1Y2Nlc3NcbiIsIF9fZnVuY19fLCBNU01fTUVSQ1VSWV9OQU1FKTsKLQotCXJldHVybiByYzsKLQotZmFpbF80OgotCWRldmljZV9kZXN0cm95KG1zbV9tZXJjdXJ5X2NsYXNzLCBtc21fbWVyY3VyeV9kZXZubyk7Ci0KLWZhaWxfMzoKLQljbGFzc19kZXN0cm95KG1zbV9tZXJjdXJ5X2NsYXNzKTsKLQotZmFpbF8yOgotCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihtc21fbWVyY3VyeV9kZXZubywgMSk7Ci0KLWZhaWxfMToKLQlfX21zbV9tZXJjdXJ5X2V4aXQobXNtX21lcmN1cnlfZGV2aWNlX3ApOwotCi1mYWlsOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgbXNtX21lcmN1cnlfZXhpdCh2b2lkKQotewotCWNkZXZfZGVsKCZtc21fbWVyY3VyeV9kZXZpY2VfcC0+Y2Rldik7Ci0JZGV2aWNlX2Rlc3Ryb3kobXNtX21lcmN1cnlfY2xhc3MsIG1zbV9tZXJjdXJ5X2Rldm5vKTsKLQljbGFzc19kZXN0cm95KG1zbV9tZXJjdXJ5X2NsYXNzKTsKLQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24obXNtX21lcmN1cnlfZGV2bm8sIDEpOwotCi0JX19tc21fbWVyY3VyeV9leGl0KG1zbV9tZXJjdXJ5X2RldmljZV9wKTsKLX0KLQotc3RhdGljIGludCBfX21zbV9tZXJjdXJ5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIG1zbV9tZXJjdXJ5X2luaXQocGRldik7Ci19Ci0KLXN0YXRpYyBpbnQgX19tc21fbWVyY3VyeV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQltc21fbWVyY3VyeV9leGl0KCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9tZXJjdXJ5X2RyaXZlciA9IHsKLQkucHJvYmUgID0gX19tc21fbWVyY3VyeV9wcm9iZSwKLQkucmVtb3ZlID0gX19tc21fbWVyY3VyeV9yZW1vdmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBNU01fTUVSQ1VSWV9EUlZfTkFNRSwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9tZXJjdXJ5X2RyaXZlcl9pbml0KHZvaWQpCi17Ci0JaW50IHJjOwotCXJjID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fbWVyY3VyeV9kcml2ZXIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG1zbV9tZXJjdXJ5X2RyaXZlcl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9tZXJjdXJ5X2RyaXZlcik7Ci19Ci0KLU1PRFVMRV9ERVNDUklQVElPTigibXNtIG1lcmN1cnkganBlZyBkcml2ZXIiKTsKLQotbW9kdWxlX2luaXQobXNtX21lcmN1cnlfZHJpdmVyX2luaXQpOwotbW9kdWxlX2V4aXQobXNtX21lcmN1cnlfZHJpdmVyX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21lcmN1cnkvbXNtX21lcmN1cnlfaHcuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X2h3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NGMwMzguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21lcmN1cnkvbXNtX21lcmN1cnlfaHcuYworKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlICJtc21fbWVyY3VyeV9ody5oIgotI2luY2x1ZGUgIm1zbV9tZXJjdXJ5X2NvbW1vbi5oIgotI2luY2x1ZGUgIm1zbV9tZXJjdXJ5X2h3X3JlZy5oIgotI2luY2x1ZGUgIm1zbV9tZXJjdXJ5X21hY3Jvcy5oIgotCi1zdGF0aWMgdm9pZCAqbWVyY3VyeV9yZWdpb25fYmFzZTsKLXN0YXRpYyB1aW50MzJfdCBtZXJjdXJ5X3JlZ2lvbl9zaXplOwotCi0KLXZvaWQgbXNtX21lcmN1cnlfaHdfd3JpdGUoc3RydWN0IG1zbV9tZXJjdXJ5X2h3X2NtZCAqaHdfY21kX3ApCi17Ci0JdWludDMyX3QgKnBhZGRyOwotCXVpbnQzMl90IG9sZF9kYXRhLCBuZXdfZGF0YTsKLQotCXBhZGRyID0gbWVyY3VyeV9yZWdpb25fYmFzZSArIGh3X2NtZF9wLT5vZmZzZXQ7Ci0KLQlpZiAoaHdfY21kX3AtPm1hc2sgPT0gMHhmZmZmZmZmZikgewotCQlvbGRfZGF0YSA9IDA7Ci0JfSBlbHNlIHsKLQkJb2xkX2RhdGEgPSByZWFkbF9yZWxheGVkKHBhZGRyKTsKLQkJb2xkX2RhdGEgJj0gfmh3X2NtZF9wLT5tYXNrOwotCX0KLQotCW5ld19kYXRhID0gaHdfY21kX3AtPmRhdGEgJiBod19jbWRfcC0+bWFzazsKLQluZXdfZGF0YSB8PSBvbGRfZGF0YTsKLQl3cml0ZWxfcmVsYXhlZChuZXdfZGF0YSwgcGFkZHIpOwotfQotCi11aW50MzJfdCBtc21fbWVyY3VyeV9od19yZWFkKHN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQgKmh3X2NtZF9wKQotewotCXVpbnQzMl90ICpwYWRkcjsKLQl1aW50MzJfdCBkYXRhOwotCi0JcGFkZHIgPSBtZXJjdXJ5X3JlZ2lvbl9iYXNlICsgaHdfY21kX3AtPm9mZnNldDsKLQotCWRhdGEgPSByZWFkbF9yZWxheGVkKHBhZGRyKTsKLQlkYXRhICY9IGh3X2NtZF9wLT5tYXNrOwotCi0JTUNSX0RCRygiTUVSQ1VSWV9SRUFEOiBvZmZzZXQ9MHglMDRYIGRhdGE9MHglMDhYXG4iLAotCQlod19jbWRfcC0+b2Zmc2V0LCBkYXRhKTsKLQotCXJldHVybiBkYXRhOwotfQotCi12b2lkIG1zbV9tZXJjdXJ5X2h3X3N0YXJ0X2RlY29kZSh2b2lkKQotewotCXN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQgaHdfY21kOwotCi0JbWVyY3VyeV9rcmVhZChKUEVHX1NUQVRVUyk7Ci0JbWVyY3VyeV9rcmVhZChSVERNQV9KUEVHX1JEX1NUQV9BQ0spOwotCW1lcmN1cnlfa3JlYWQoUlRETUFfSlBFR19XUl9TVEFfQUNLKTsKLQltZXJjdXJ5X2tyZWFkKFJURE1BX0pQRUdfUkRfQlVGX1lfUE5UUik7Ci0JbWVyY3VyeV9rcmVhZChSVERNQV9KUEVHX1dSX0JVRl9ZX1BOVFIpOwotCW1lcmN1cnlfa3JlYWQoUlRETUFfSlBFR19XUl9CVUZfVV9QTlRSKTsKLQltZXJjdXJ5X2t3cml0ZShSVERNQV9KUEVHX1JEX0JVRl9NTkdSX0JVRl9JRF9GSUZPLCAoNzw8MikpOwotCXJldHVybjsKLX0KLQotdm9pZCBtc21fbWVyY3VyeV9od19iaXRzdHJlYW1fYnVmX2NmZyh1aW50MzJfdCBiaXRzdHJlYW1fYnVmX2FkZHIpCi17Ci0Jc3RydWN0IG1zbV9tZXJjdXJ5X2h3X2NtZCBod19jbWQ7Ci0KLQltZXJjdXJ5X2t3cml0ZShSVERNQV9KUEVHX1JEX0JVRl9ZX1BOVFIsIGJpdHN0cmVhbV9idWZfYWRkcik7Ci0JcmV0dXJuOwotfQotCi0KLXZvaWQgbXNtX21lcmN1cnlfaHdfb3V0cHV0X3lfYnVmX2NmZyh1aW50MzJfdCB5X2J1Zl9hZGRyKQotewotCXN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQgaHdfY21kOwotCi0JbWVyY3VyeV9rd3JpdGUoUlRETUFfSlBFR19XUl9CVUZfWV9QTlRSLCB5X2J1Zl9hZGRyKTsKLQlyZXR1cm47Ci19Ci0KLXZvaWQgbXNtX21lcmN1cnlfaHdfb3V0cHV0X3VfYnVmX2NmZyh1aW50MzJfdCB1X2J1Zl9hZGRyKQotewotCXN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQgaHdfY21kOwotCi0JbWVyY3VyeV9rd3JpdGUoUlRETUFfSlBFR19XUl9CVUZfVV9QTlRSLCB1X2J1Zl9hZGRyKTsKLQlyZXR1cm47Ci19Ci0KLXZvaWQgbXNtX21lcmN1cnlfaHdfb3V0cHV0X3ZfYnVmX2NmZyh1aW50MzJfdCB2X2J1Zl9hZGRyKQotewotCXN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQgaHdfY21kOwotCi0JbWVyY3VyeV9rd3JpdGUoUlRETUFfSlBFR19XUl9CVUZfVl9QTlRSLCB2X2J1Zl9hZGRyKTsKLQlyZXR1cm47Ci19Ci0KLWludCBtc21fbWVyY3VyeV9od193YWl0KHN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQgKmh3X2NtZF9wLCBpbnQgbV91cykKLXsKLQlpbnQgdG0gPSBod19jbWRfcC0+bjsKLQl1aW50MzJfdCBkYXRhOwotCXVpbnQzMl90IHdhaXRfZGF0YSA9IGh3X2NtZF9wLT5kYXRhICYgaHdfY21kX3AtPm1hc2s7Ci0KLQlkYXRhID0gbXNtX21lcmN1cnlfaHdfcmVhZChod19jbWRfcCk7Ci0JaWYgKGRhdGEgIT0gd2FpdF9kYXRhKSB7Ci0JCXdoaWxlICh0bSkgewotCQkJdWRlbGF5KG1fdXMpOwotCQkJZGF0YSA9IG1zbV9tZXJjdXJ5X2h3X3JlYWQoaHdfY21kX3ApOwotCQkJaWYgKGRhdGEgPT0gd2FpdF9kYXRhKQotCQkJCWJyZWFrOwotCQkJdG0tLTsKLQkJfQotCX0KLQlod19jbWRfcC0+ZGF0YSA9IGRhdGE7Ci0JcmV0dXJuIHRtOwotfQotCi12b2lkIG1zbV9tZXJjdXJ5X2h3X2lycV9nZXRfc3RhdHVzKHVpbnQxNl90ICpyZF9pcnEsIHVpbnQxNl90ICp3cl9pcnEpCi17Ci0Jc3RydWN0IG1zbV9tZXJjdXJ5X2h3X2NtZCBod19jbWQ7Ci0Jcm1iKCk7Ci0JbWVyY3VyeV9rcmVhZChSVERNQV9KUEVHX1JEX1NUQV9BQ0spOwotCSpyZF9pcnEgPSBod19jbWQuZGF0YTsKLQotCW1lcmN1cnlfa3JlYWQoUlRETUFfSlBFR19XUl9TVEFfQUNLKTsKLQkqd3JfaXJxID0gaHdfY21kLmRhdGE7Ci0Jcm1iKCk7Ci19Ci0KLXZvaWQgbXNtX21lcmN1cnlfaHdfZ2V0X2pwZWdfc3RhdHVzKHVpbnQzMl90ICpqcGVnX3N0YXR1cykKLXsKLQlzdHJ1Y3QgbXNtX21lcmN1cnlfaHdfY21kIGh3X2NtZDsKLQotCXJtYigpOwotCW1lcmN1cnlfa3JlYWQoSlBFR19TVEFUVVMpOwotCSpqcGVnX3N0YXR1cyA9IGh3X2NtZC5kYXRhOwotCXJtYigpOwotfQotCi11aW50MzJfdCBtc21fbWVyY3VyeV9nZXRfcmVzdGFydEludGVydmFsKHZvaWQpCi17Ci0Jc3RydWN0IG1zbV9tZXJjdXJ5X2h3X2NtZCBod19jbWQ7Ci0KLQlybWIoKTsKLQltZXJjdXJ5X2tyZWFkKEpQRUdfRFJJKTsKLQlybWIoKTsKLQlyZXR1cm4gaHdfY21kLmRhdGE7Ci0KLX0KLQotdm9pZCBtc21fbWVyY3VyeV9od19yZF9pcnFfY2xlYXIodWludDMyX3QgdmFsKQotewotCXN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQgaHdfY21kOwotCW1lcmN1cnlfa3dyaXRlKFJURE1BX0pQRUdfUkRfU1RBX0FDSywgdmFsKTsKLX0KLQotdm9pZCBtc21fbWVyY3VyeV9od193cl9pcnFfY2xlYXIodWludDMyX3QgdmFsKQotewotCXN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQgaHdfY21kOwotCi0JbWVyY3VyeV9rd3JpdGUoUlRETUFfSlBFR19XUl9TVEFfQUNLLCB2YWwpOwotfQotCi12b2lkIG1zbV9tZXJjdXJ5X2h3X3NldF9yZF9pcnFfbWFzayh1aW50MzJfdCB2YWwpCi17Ci0Jc3RydWN0IG1zbV9tZXJjdXJ5X2h3X2NtZCBod19jbWQ7Ci0KLQltZXJjdXJ5X2t3cml0ZShSVERNQV9KUEVHX1JEX0lOVF9FTiwgdmFsKTsKLX0KLQotdm9pZCBtc21fbWVyY3VyeV9od19zZXRfd3JfaXJxX21hc2sodWludDMyX3QgdmFsKQotewotCXN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQgaHdfY21kOwotCi0JbWVyY3VyeV9rd3JpdGUoUlRETUFfSlBFR19XUl9JTlRfRU4sIHZhbCk7Ci19Ci0KLXZvaWQgbXNtX21lcmN1cnlfc2V0X2pwZWdfY3RsX2NvbW1vbih1aW50MzJfdCB2YWwpCi17Ci0Jc3RydWN0IG1zbV9tZXJjdXJ5X2h3X2NtZCBod19jbWQ7Ci0KLQltZXJjdXJ5X2t3cml0ZShKUEVHX0NUUkxfQ09NTU9OLCB2YWwpOwotfQotCi12b2lkIG1zbV9tZXJjdXJ5X2h3X3Jlc2V0KHZvaWQpCi17Ci0JdWludDMyX3QgdmFsOwotCXN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQgaHdfY21kOwotCi0Jd21iKCk7Ci0JLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyovCi0JbWVyY3VyeV9rd3JpdGUoUlRETUFfSlBFR19SRF9JTlRfRU4sIDApOwotCi0JbWVyY3VyeV9rd3JpdGUoUlRETUFfSlBFR19XUl9JTlRfRU4sIDApOwotCi0JLyogY2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzKi8KLQl2YWwgPSAwOwotCU1FTV9PVVRGMigmdmFsLCBSVERNQV9KUEVHX1dSX1NUQV9BQ0ssCi0JCVNXX1JFU0VUX0FCT1JUX1JEWV9BQ0ssCi0JCUVSUl9BQ0ssIDEsIDEpOwotCU1FTV9PVVRGMigmdmFsLCBSVERNQV9KUEVHX1dSX1NUQV9BQ0ssIEVPRl9BQ0ssIFNPRl9BQ0ssIDEsIDEpOwotCW1lcmN1cnlfa3dyaXRlKFJURE1BX0pQRUdfV1JfU1RBX0FDSywgdmFsKTsKLQotCXZhbCA9IDA7Ci0JTUVNX09VVEYyKCZ2YWwsIFJURE1BX0pQRUdfUkRfU1RBX0FDSywgRU9GX0FDSywgU09GX0FDSywgMSwgMSk7Ci0JbWVyY3VyeV9rd3JpdGUoUlRETUFfSlBFR19SRF9TVEFfQUNLLCB2YWwpOwotCi0JLyogZW5hYmxlIFNXUmVzZXRBYm9ydFJkeUludCBmb3IgY29yZSByZXNldCovCi0JdmFsID0gMDsKLQlNRU1fT1VURigmdmFsLCBSVERNQV9KUEVHX1dSX0lOVF9FTiwgU1dfUkVTRVRfQUJPUlRfUkRZX0VOLCAxKTsKLQltZXJjdXJ5X2t3cml0ZShSVERNQV9KUEVHX1dSX0lOVF9FTiwgdmFsKTsKLQotCS8qIFJlc2V0IENvcmUgZnJvbSBNTVNTIEZhYnJpYyovCi0JbWVyY3VyeV9jb3JlX3Jlc2V0KCk7Ci0KLQkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzKi8KLQltZXJjdXJ5X2t3cml0ZShSVERNQV9KUEVHX1dSX0lOVF9FTiwgMCk7Ci0KLQkvKiBjbGVhciBwZW5kaW5nIGludGVycnVwdHMqLwotCXZhbCA9IDA7Ci0JTUVNX09VVEYyKCZ2YWwsIFJURE1BX0pQRUdfV1JfU1RBX0FDSywKLQkJU1dfUkVTRVRfQUJPUlRfUkRZX0FDSywKLQkJRVJSX0FDSywgMSwgMSk7Ci0JTUVNX09VVEYyKCZ2YWwsIFJURE1BX0pQRUdfV1JfU1RBX0FDSywgRU9GX0FDSywgU09GX0FDSywgMSwgMSk7Ci0JbWVyY3VyeV9rd3JpdGUoUlRETUFfSlBFR19XUl9TVEFfQUNLLCB2YWwpOwotCi0JdmFsID0gMDsKLQlNRU1fT1VURjIoJnZhbCwgUlRETUFfSlBFR19SRF9TVEFfQUNLLCBFT0ZfQUNLLCBTT0ZfQUNLLCAxLCAxKTsKLQltZXJjdXJ5X2t3cml0ZShSVERNQV9KUEVHX1JEX1NUQV9BQ0ssIHZhbCk7Ci0KLQkvKiBlbmFibGUgbmVjY2Vzc2FyeSBpbnRlcnJ1cHQgc291cmNlKi8KLQl2YWwgPSAwOwotCU1FTV9PVVRGMigmdmFsLCBSVERNQV9KUEVHX1dSX0lOVF9FTiwgRU9GX0VOLCBFUlJfRU4sIDEsIDEpOwotCU1FTV9PVVRGKCZ2YWwsIFJURE1BX0pQRUdfV1JfSU5UX0VOLCBTV19SRVNFVF9BQk9SVF9SRFlfRU4sIDEpOwotCW1lcmN1cnlfa3dyaXRlKFJURE1BX0pQRUdfV1JfSU5UX0VOLCB2YWwpOwotCi0Jd21iKCk7Ci0KLX0KLQotdm9pZCBtc21fbWVyY3VyeV9od19pbml0KHZvaWQgKmJhc2UsIGludCBzaXplKQotewotCW1lcmN1cnlfcmVnaW9uX2Jhc2UgPSBiYXNlOwotCW1lcmN1cnlfcmVnaW9uX3NpemUgPSBzaXplOwotfQotCi0KLXZvaWQgbXNtX21lcmN1cnlfaHdfZGVsYXkoc3RydWN0IG1zbV9tZXJjdXJ5X2h3X2NtZCAqaHdfY21kX3AsIGludCBtX3VzKQotewotCWludCB0bSA9IGh3X2NtZF9wLT5uOwotCXdoaWxlICh0bSkgewotCQl1ZGVsYXkobV91cyk7Ci0JCXRtLS07Ci0JfQotfQotCi1pbnQgbXNtX21lcmN1cnlfaHdfZXhlY19jbWRzKHN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQgKmh3X2NtZF9wLCBpbnQgbV9jbWRzKQotewotCWludCBpc19jb3B5X3RvX3VzZXIgPSAtMTsKLQl1aW50MzJfdCBkYXRhOwotCWlmIChtX2NtZHMgPiAxKQotCQlNQ1JfREJHKCJtX2NtZHMgPSAlZFxuIiwgbV9jbWRzKTsKLQotCXdoaWxlIChtX2NtZHMtLSkgewotCQlpZiAoaHdfY21kX3AtPm9mZnNldCA+IG1lcmN1cnlfcmVnaW9uX3NpemUpIHsKLQkJCU1DUl9QUl9FUlIoIiVzOiVkXSAlZCBleGNlZWQgaHcgcmVnaW9uICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgX19MSU5FX18sIGh3X2NtZF9wLT5vZmZzZXQsCi0JCQkJCW1lcmN1cnlfcmVnaW9uX3NpemUpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlzd2l0Y2ggKGh3X2NtZF9wLT50eXBlKSB7Ci0JCWNhc2UgTVNNX01FUkNVUllfSFdfQ01EX1RZUEVfUkVBRDoKLQkJCWh3X2NtZF9wLT5kYXRhID0gbXNtX21lcmN1cnlfaHdfcmVhZChod19jbWRfcCk7Ci0JCQlpc19jb3B5X3RvX3VzZXIgPSAxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNU01fTUVSQ1VSWV9IV19DTURfVFlQRV9XUklURToKLQkJCW1zbV9tZXJjdXJ5X2h3X3dyaXRlKGh3X2NtZF9wKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTVNNX01FUkNVUllfSFdfQ01EX1RZUEVfV1JJVEVfT1I6Ci0JCQlkYXRhID0gbXNtX21lcmN1cnlfaHdfcmVhZChod19jbWRfcCk7Ci0JCQlod19jbWRfcC0+ZGF0YSA9IChod19jbWRfcC0+ZGF0YSAmIGh3X2NtZF9wLT5tYXNrKSB8Ci0JCQkJZGF0YTsKLQkJCW1zbV9tZXJjdXJ5X2h3X3dyaXRlKGh3X2NtZF9wKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTVNNX01FUkNVUllfSFdfQ01EX1RZUEVfVVdBSVQ6Ci0JCQltc21fbWVyY3VyeV9od193YWl0KGh3X2NtZF9wLCAxKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTVNNX01FUkNVUllfSFdfQ01EX1RZUEVfTVdBSVQ6Ci0JCQltc21fbWVyY3VyeV9od193YWl0KGh3X2NtZF9wLCAxMDAwKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTVNNX01FUkNVUllfSFdfQ01EX1RZUEVfVURFTEFZOgotCQkJbXNtX21lcmN1cnlfaHdfZGVsYXkoaHdfY21kX3AsIDEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNU01fTUVSQ1VSWV9IV19DTURfVFlQRV9NREVMQVk6Ci0JCQltc21fbWVyY3VyeV9od19kZWxheShod19jbWRfcCwgMTAwMCk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJTUNSX0RCRygid3JvbmcgaHcgY29tbWFuZCB0eXBlXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaHdfY21kX3ArKzsKLQl9Ci0JcmV0dXJuIGlzX2NvcHlfdG9fdXNlcjsKLX0KLQotdm9pZCBtc21fbWVyY3VyeV9od19yZWdpb25fZHVtcChpbnQgc2l6ZSkKLXsKLQl1aW50MzJfdCAqcDsKLQl1aW50OF90ICpwODsKLQotCU1DUl9EQkcoIiglZCklcygpXG4iLCBfX0xJTkVfXywgX19mdW5jX18pOwotCWlmIChzaXplID4gbWVyY3VyeV9yZWdpb25fc2l6ZSkKLQkJTUNSX0RCRygiJXM6JWRdIHdyb25nIHJlZ2lvbiBkdW1wIHNpemVcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCi0JcCA9ICh1aW50MzJfdCAqKSBtZXJjdXJ5X3JlZ2lvbl9iYXNlOwotCXdoaWxlIChzaXplID49IDE2KSB7Ci0JCU1DUl9EQkcoIjB4JTA4WF0gJTA4WCAlMDhYICUwOFggJTA4WFxuIiwKLQkJCW1lcmN1cnlfcmVnaW9uX3NpemUgLSBzaXplLAotCQkJcmVhZGxfcmVsYXhlZChwKSwgcmVhZGxfcmVsYXhlZChwKzEpLAotCQkJcmVhZGxfcmVsYXhlZChwKzIpLCByZWFkbF9yZWxheGVkKHArMykpOwotCQlwICs9IDQ7Ci0JCXNpemUgLT0gMTY7Ci0JfQotCi0JaWYgKHNpemUgPiAwKSB7Ci0JCXVpbnQzMl90IGQ7Ci0JCU1DUl9EQkcoIjB4JTA4WF0gIiwgbWVyY3VyeV9yZWdpb25fc2l6ZSAtIHNpemUpOwotCQl3aGlsZSAoc2l6ZSA+PSA0KSB7Ci0JCQlNQ1JfREJHKCIlMDhYICIsIHJlYWRsX3JlbGF4ZWQocCsrKSk7Ci0JCQlzaXplIC09IDQ7Ci0JCX0KLQotCQlkID0gcmVhZGxfcmVsYXhlZChwKTsKLQkJcDggPSAodWludDhfdCAqKSAmZDsKLQkJd2hpbGUgKHNpemUpIHsKLQkJCU1DUl9EQkcoIiUwMlgiLCAqcDgrKyk7Ci0JCQlzaXplLS07Ci0JCX0KLQotCQlNQ1JfREJHKCJcbiIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X2h3LmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbWVyY3VyeS9tc21fbWVyY3VyeV9ody5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGZjODE4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X2h3LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBNU01fTUVSQ1VSWV9IV19ICi0jZGVmaW5lIE1TTV9NRVJDVVJZX0hXX0gKLQotI2luY2x1ZGUgPG1lZGlhL21zbV9tZXJjdXJ5Lmg+Ci0KLS8qbnVtYmVyIG9mIHBlbCBwZXIgYmxvY2sgKGhvcml6L3ZlcnQpKi8KLSNkZWZpbmUgSlBFR0RFQ19CTE9DS19TSVpFICAgICAgICAgICAgICAgICAoOCkKLS8qIEhhcmR3YXJlIGFsaWdubWVudCovCi0jZGVmaW5lIEpQRUdERUNfSFdfQUxJR04gICAgICAgICAgICAgICAgICAgKDgpCi0jZGVmaW5lIEpQRUdERUNfSFdfU0FNUExJTkdfUkFUSU9fTUFYICAgICAgKDQpCi0KLSNkZWZpbmUgTVNNX01FUkNVUllfSFdfSVJRX1NXX1JFU0VUX0FDSyAgICAoMTw8MykKLSNkZWZpbmUgTVNNX01FUkNVUllfSFdfSVJRX1dSX0VSUl9BQ0sgICAgICAoMTw8MikKLSNkZWZpbmUgTVNNX01FUkNVUllfSFdfSVJRX1dSX0VPSV9BQ0sgICAgICAoMTw8MSkKLSNkZWZpbmUgTVNNX01FUkNVUllfSFdfSVJRX1dSX1NPRl9BQ0sgICAgICAoMTw8MCkKLQotI2RlZmluZSBNU01fTUVSQ1VSWV9IV19JUlFfUkRfRU9GX0FDSyAgICAgICgxPDwxKQotI2RlZmluZSBNU01fTUVSQ1VSWV9IV19JUlFfUkRfU09GX0FDSyAgICAgICgxPDwwKQotCi1leHRlcm4gaW50IG1lcmN1cnlfY29yZV9yZXNldCh2b2lkKTsKLQotc3RydWN0IG1zbV9tZXJjdXJ5X2h3X2J1ZiB7Ci0JCXN0cnVjdCBtc21fbWVyY3VyeV9idWYgdmJ1ZjsKLQkJc3RydWN0IGZpbGUgICpmaWxlOwotCQl1aW50MzJfdCBmcmFtZWRvbmVfbGVuOwotCQl1aW50MzJfdCB5X2J1ZmZlcl9hZGRyOwotCQl1aW50MzJfdCB5X2xlbjsKLQkJdWludDMyX3QgY2Jjcl9idWZmZXJfYWRkcjsKLQkJdWludDMyX3QgY2Jjcl9sZW47Ci0JCXVpbnQzMl90IG51bV9vZl9tY3Vfcm93czsKLQkJc3RydWN0IG1zbV9tYXBwZWRfYnVmZmVyICptc21fYnVmZmVyOwotCQlpbnQgKnN1YnN5c3RlbV9pZDsKLQkJc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZTsKLX07Ci0KLQotdm9pZCBtc21fbWVyY3VyeV9od19yZXNldCh2b2lkKTsKLXZvaWQgbXNtX21lcmN1cnlfaHdfaW5pdCh2b2lkICpiYXNlLCBpbnQgc2l6ZSk7Ci12b2lkIG1zbV9tZXJjdXJ5X2h3X3JkX2lycV9jbGVhcih1aW50MzJfdCB2YWwpOwotdm9pZCBtc21fbWVyY3VyeV9od193cl9pcnFfY2xlYXIodWludDMyX3QgdmFsKTsKLQotdWludDMyX3QgbXNtX21lcmN1cnlfaHdfcmVhZChzdHJ1Y3QgbXNtX21lcmN1cnlfaHdfY21kICpod19jbWRfcCk7Ci12b2lkIG1zbV9tZXJjdXJ5X2h3X3dyaXRlKHN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQgKmh3X2NtZF9wKTsKLWludCBtc21fbWVyY3VyeV9od193YWl0KHN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQgKmh3X2NtZF9wLCBpbnQgbV91cyk7Ci12b2lkIG1zbV9tZXJjdXJ5X2h3X2RlbGF5KHN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQgKmh3X2NtZF9wLCBpbnQgbV91cyk7Ci1pbnQgbXNtX21lcmN1cnlfaHdfZXhlY19jbWRzKHN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQgKmh3X2NtZF9wLCBpbnQgbV9jbWRzKTsKLXZvaWQgbXNtX21lcmN1cnlfaHdfcmVnaW9uX2R1bXAoaW50IHNpemUpOwotCi0KLXZvaWQgbXNtX21lcmN1cnlfaHdfaXJxX2dldF9zdGF0dXModWludDE2X3QgKnJkX2lycSwgdWludDE2X3QgKndyX2lycSk7Ci12b2lkIG1zbV9tZXJjdXJ5X2h3X3N0YXJ0X2RlY29kZSh2b2lkKTsKLXZvaWQgbXNtX21lcmN1cnlfaHdfZ2V0X2pwZWdfc3RhdHVzKHVpbnQzMl90ICpqcGVnX3N0YXR1cyk7Ci12b2lkIG1zbV9tZXJjdXJ5X2h3X291dHB1dF95X2J1Zl9jZmcodWludDMyX3QgeV9idWZfYWRkcik7Ci12b2lkIG1zbV9tZXJjdXJ5X2h3X291dHB1dF91X2J1Zl9jZmcodWludDMyX3QgdV9idWZfYWRkcik7Ci12b2lkIG1zbV9tZXJjdXJ5X2h3X291dHB1dF92X2J1Zl9jZmcodWludDMyX3Qgdl9idWZfYWRkcik7Ci12b2lkIG1zbV9tZXJjdXJ5X2h3X2JpdHN0cmVhbV9idWZfY2ZnKHVpbnQzMl90IGJpdHN0cmVhbV9idWZfYWRkcik7Ci0KLSNlbmRpZiAvKiBNU01fTUVSQ1VSWV9IV19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbWVyY3VyeS9tc21fbWVyY3VyeV9od19yZWcuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X2h3X3JlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTViZjQ5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X2h3X3JlZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzE1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIE1TTV9NRVJDVVJZX0hXX1JFR19ICi0jZGVmaW5lIE1TTV9NRVJDVVJZX0hXX1JFR19ICi0KLQotI2RlZmluZSBKUEVHRF9CQVNFICAweDAwMDAwMDAwCi0KLS8qIFJlZ2lzdGVyIEFERFIsIFJNU0ssIGFuZCBTSEZUKi8KLS8qIFJXICovCi0jZGVmaW5lIEpQRUdfQ1RSTF9DT01NT04gICAgICAgICAgICAgICAgICAgICAgICBKUEVHX0NUUkxfQ09NTU9OCi0jZGVmaW5lIEhXSU9fSlBFR19DVFJMX0NPTU1PTl9BRERSICAgICAgICAgICAgKEpQRUdEX0JBU0UrMHgwMDAwMDAwMCkKLSNkZWZpbmUgSFdJT19KUEVHX0NUUkxfQ09NTU9OX19QT1IgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFdJT19KUEVHX0NUUkxfQ09NTU9OX19STVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUYKLSNkZWZpbmUgSFdJT19KUEVHX0NUUkxfQ09NTU9OX19TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX0pQRUdfQ1RSTF9DT01NT05fX0pQRUdfQ1RSTF9DT01NT05fWlpfT1ZFUlJJREVfRU5fX0JNU0sgMHgwMDAwMDAxMAotI2RlZmluZSBIV0lPX0pQRUdfQ1RSTF9DT01NT05fX0pQRUdfQ1RSTF9DT01NT05fWlpfT1ZFUlJJREVfRU5fX1NIRlQgICAgICAgICAgNAotI2RlZmluZSBIV0lPX0pQRUdfQ1RSTF9DT01NT05fX0pQRUdfQ1RSTF9DT01NT05fTU9ERV9fQk1TSyAgICAgICAgICAgMHgwMDAwMDAwRgotI2RlZmluZSBIV0lPX0pQRUdfQ1RSTF9DT01NT05fX0pQRUdfQ1RSTF9DT01NT05fTU9ERV9fU0hGVCAgICAgICAgICAgICAgICAgICAgMAotCi0vKiBSZWdpc3RlciBGaWVsZCBGTVNLIGFuZCBTSEZUKi8KLS8qIFJXICovCi0jZGVmaW5lIEpQRUdfQ1RSTF9FTkNPREUgICAgICAgICAgICAgICAgICAgICBKUEVHX0NUUkxfRU5DT0RFCi0jZGVmaW5lIEhXSU9fSlBFR19DVFJMX0VOQ09ERV9BRERSICAgICAgICAoSlBFR0RfQkFTRSsweDAwMDAwMDA4KQotI2RlZmluZSBIV0lPX0pQRUdfQ1RSTF9FTkNPREVfX1BPUiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIV0lPX0pQRUdfQ1RSTF9FTkNPREVfX1JNU0sgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBIV0lPX0pQRUdfQ1RSTF9FTkNPREVfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgNAotLyogUmVnaXN0ZXIgRWxlbWVudCBNSU4gYW5kIE1BWCovCi0jZGVmaW5lIEhXSU9fSlBFR19DVFJMX0VOQ09ERV9fX1MgICAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0KLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX0pQRUdfQ1RSTF9FTkNPREVfX0pQRUdfQ1RSTF9FTkNPREVfRU9JX01BUktFUl9FTl9fQk1TSyAgMHgwMDAwMDAxMAotI2RlZmluZSBIV0lPX0pQRUdfQ1RSTF9FTkNPREVfX0pQRUdfQ1RSTF9FTkNPREVfRU9JX01BUktFUl9FTl9fU0hGVCAgICAgICAgICAgNAotCi0vKiBSZWdpc3RlciBGaWVsZCBGTVNLIGFuZCBTSEZUKi8KLSNkZWZpbmUgSlBFR19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICBKUEVHX1NUQVRVUwotI2RlZmluZSBIV0lPX0pQRUdfU1RBVFVTX0FERFIgICAgICAgIChKUEVHRF9CQVNFKzB4MDAwMDAwMTApCi0jZGVmaW5lIEhXSU9fSlBFR19TVEFUVVNfX1BPUiAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFdJT19KUEVHX1NUQVRVU19fUk1TSyAgICAgICAgICAgICAgMHgwMDAwM0ZGMAotI2RlZmluZSBIV0lPX0pQRUdfU1RBVFVTX19TSEZUICAgICAgICAgICAgICAgICAgICAgICA0Ci0vKiBSZWdpc3RlciBFbGVtZW50IE1JTiBhbmQgTUFYKi8KLSNkZWZpbmUgSFdJT19KUEVHX1NUQVRVU19fX1MgICAgICAgICAgICAgICAgICAgICAgICAgNAotCi0vKiBSZWdpc3RlciBGaWVsZCBGTVNLIGFuZCBTSEZUKi8KLSNkZWZpbmUgSFdJT19KUEVHX1NUQVRVU19fSlBFR19TVEFUVVNfUkVHSVNURVJfVElNRU9VVF9fQk1TSyAgICAgICAweDAwMDAyMDAwCi0jZGVmaW5lIEhXSU9fSlBFR19TVEFUVVNfX0pQRUdfU1RBVFVTX1JFR0lTVEVSX1RJTUVPVVRfX1NIRlQgICAgICAgICAgICAgICAxMwotI2RlZmluZSBIV0lPX0pQRUdfU1RBVFVTX19KUEVHX1NUQVRVU19ESERRX0VPSV9fQk1TSyAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgSFdJT19KUEVHX1NUQVRVU19fSlBFR19TVEFUVVNfREhEUV9FT0lfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIEhXSU9fSlBFR19TVEFUVVNfX0pQRUdfU1RBVFVTX0RIRFFfRVJSX1VORVNDQVBFRF9GRl9fQk1TSyAgMHgwMDAwMDgwMAotI2RlZmluZSBIV0lPX0pQRUdfU1RBVFVTX19KUEVHX1NUQVRVU19ESERRX0VSUl9VTkVTQ0FQRURfRkZfX1NIRlQgICAgICAgICAgMTEKLSNkZWZpbmUgSFdJT19KUEVHX1NUQVRVU19fSlBFR19TVEFUVVNfREhEUV9FUlJfSU5WX0hVRkZDT0RFX19CTVNLICAweDAwMDAwNDAwCi0jZGVmaW5lIEhXSU9fSlBFR19TVEFUVVNfX0pQRUdfU1RBVFVTX0RIRFFfRVJSX0lOVl9IVUZGQ09ERV9fU0hGVCAgICAgICAgICAxMAotI2RlZmluZSBIV0lPX0pQRUdfU1RBVFVTX19KUEVHX1NUQVRVU19ESERRX0VSUl9JTlZfTUFSS0VSX19CTVNLICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgSFdJT19KUEVHX1NUQVRVU19fSlBFR19TVEFUVVNfREhEUV9FUlJfSU5WX01BUktFUl9fU0hGVCAgICAgICAgICAgICA5Ci0jZGVmaW5lIEhXSU9fSlBFR19TVEFUVVNfX0pQRUdfU1RBVFVTX0RIRFFfRVJSX1JTVFJUX1NFUV9fQk1TSyAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBIV0lPX0pQRUdfU1RBVFVTX19KUEVHX1NUQVRVU19ESERRX0VSUl9SU1RSVF9TRVFfX1NIRlQgICAgICAgICAgICAgIDgKLSNkZWZpbmUgSFdJT19KUEVHX1NUQVRVU19fSlBFR19TVEFUVVNfREhEUV9FUlJfUlNUUlRfT1ZSRkxXX19CTVNLICAweDAwMDAwMDgwCi0jZGVmaW5lIEhXSU9fSlBFR19TVEFUVVNfX0pQRUdfU1RBVFVTX0RIRFFfRVJSX1JTVFJUX09WUkZMV19fU0hGVCAgICAgICAgICAgNwotI2RlZmluZSBIV0lPX0pQRUdfU1RBVFVTX19KUEVHX1NUQVRVU19ESERRX0VSUl9SU1RSVF9VTkRGTFdfX0JNU0sgIDB4MDAwMDAwNDAKLSNkZWZpbmUgSFdJT19KUEVHX1NUQVRVU19fSlBFR19TVEFUVVNfREhEUV9FUlJfUlNUUlRfVU5ERkxXX19TSEZUICAgICAgICAgICA2Ci0jZGVmaW5lIEhXSU9fSlBFR19TVEFUVVNfX0pQRUdfU1RBVFVTX0RIRFFfRVJSX1NDQU5fT1ZSRkxXX19CTVNLICAgMHgwMDAwMDAyMAotI2RlZmluZSBIV0lPX0pQRUdfU1RBVFVTX19KUEVHX1NUQVRVU19ESERRX0VSUl9TQ0FOX09WUkZMV19fU0hGVCAgICAgICAgICAgIDUKLSNkZWZpbmUgSFdJT19KUEVHX1NUQVRVU19fSlBFR19TVEFUVVNfREhEUV9FUlJfU0NBTl9VTkRGTFdfX0JNU0sgICAweDAwMDAwMDEwCi0jZGVmaW5lIEhXSU9fSlBFR19TVEFUVVNfX0pQRUdfU1RBVFVTX0RIRFFfRVJSX1NDQU5fVU5ERkxXX19TSEZUICAgICAgICAgICAgNAotCi0vKiBSZWdpc3RlciBBRERSLCBSTVNLLCBhbmQgU0hGVCovCi0vKiBSICovCi0jZGVmaW5lIEpQRUdfU09GX1JFR18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpQRUdfU09GX1JFR18wCi0jZGVmaW5lIEhXSU9fSlBFR19TT0ZfUkVHXzBfQUREUiAgLyogUlcgKi8gICAgICAgICAgICAgICAoSlBFR0RfQkFTRSsweDAwMDAwMDE0KQotI2RlZmluZSBIV0lPX0pQRUdfU09GX1JFR18wX19QT1IgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIV0lPX0pQRUdfU09GX1JFR18wX19STVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgotI2RlZmluZSBIV0lPX0pQRUdfU09GX1JFR18wX19TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotLyogUmVnaXN0ZXIgRmllbGQgRk1TSyBhbmQgU0hGVCovCi0jZGVmaW5lIEhXSU9fSlBFR19TT0ZfUkVHXzBfX0pQRUdfU09GX1JFR18wX05GX19CTVNLICAgICAweDAwMDAwMEZGCi0jZGVmaW5lIEhXSU9fSlBFR19TT0ZfUkVHXzBfX0pQRUdfU09GX1JFR18wX05GX19TSEZUICAgICAgICAgICAgICAwCi0KLS8qIFJlZ2lzdGVyIEFERFIsIFJNU0ssIGFuZCBTSEZUKi8KLSNkZWZpbmUgSlBFR19TT0ZfUkVHXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlBFR19TT0ZfUkVHXzEKLSNkZWZpbmUgSFdJT19KUEVHX1NPRl9SRUdfMV9BRERSICAvKiBSVyAqLyAgICAgICAgICAgICAgIChKUEVHRF9CQVNFKzB4MDAwMDAwMTgpCi0jZGVmaW5lIEhXSU9fSlBFR19TT0ZfUkVHXzFfX1BPUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhXSU9fSlBFR19TT0ZfUkVHXzFfX1JNU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwRkZGRkZGCi0jZGVmaW5lIEhXSU9fSlBFR19TT0ZfUkVHXzFfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0vKiBSZWdpc3RlciBGaWVsZCBGTVNLIGFuZCBTSEZUKi8KLSNkZWZpbmUgSFdJT19KUEVHX1NPRl9SRUdfMV9fSlBFR19TT0ZfUkVHXzFfQ19fQk1TSyAgICAgIDB4MDBGRjAwMDAKLSNkZWZpbmUgSFdJT19KUEVHX1NPRl9SRUdfMV9fSlBFR19TT0ZfUkVHXzFfQ19fU0hGVCAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgSFdJT19KUEVHX1NPRl9SRUdfMV9fSlBFR19TT0ZfUkVHXzFfSF9fQk1TSyAgICAgIDB4MDAwMEYwMDAKLSNkZWZpbmUgSFdJT19KUEVHX1NPRl9SRUdfMV9fSlBFR19TT0ZfUkVHXzFfSF9fU0hGVCAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgSFdJT19KUEVHX1NPRl9SRUdfMV9fSlBFR19TT0ZfUkVHXzFfVl9fQk1TSyAgICAgIDB4MDAwMDBGMDAKLSNkZWZpbmUgSFdJT19KUEVHX1NPRl9SRUdfMV9fSlBFR19TT0ZfUkVHXzFfVl9fU0hGVCAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgSFdJT19KUEVHX1NPRl9SRUdfMV9fSlBFR19TT0ZfUkVHXzFfVFFfX0JNU0sgICAgIDB4MDAwMDAwRkYKLSNkZWZpbmUgSFdJT19KUEVHX1NPRl9SRUdfMV9fSlBFR19TT0ZfUkVHXzFfVFFfX1NIRlQgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBKUEVHX1NPRl9SRUdfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUEVHX1NPRl9SRUdfMgotI2RlZmluZSBIV0lPX0pQRUdfU09GX1JFR18yX0FERFIgIC8qIFJXICovICAgICAgICAgICAgICAgKEpQRUdEX0JBU0UrMHgwMDAwMDAxQykKLSNkZWZpbmUgSFdJT19KUEVHX1NPRl9SRUdfMl9fUE9SICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFdJT19KUEVHX1NPRl9SRUdfMl9fUk1TSyAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKLSNkZWZpbmUgSFdJT19KUEVHX1NPRl9SRUdfMl9fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX0pQRUdfU09GX1JFR18yX19KUEVHX1NPRl9SRUdfMl9ZX19CTVNLICAgICAgMHhGRkZGMDAwMAotI2RlZmluZSBIV0lPX0pQRUdfU09GX1JFR18yX19KUEVHX1NPRl9SRUdfMl9ZX19TSEZUICAgICAgICAgICAgICAxNgotI2RlZmluZSBIV0lPX0pQRUdfU09GX1JFR18yX19KUEVHX1NPRl9SRUdfMl9YX19CTVNLICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBIV0lPX0pQRUdfU09GX1JFR18yX19KUEVHX1NPRl9SRUdfMl9YX19TSEZUICAgICAgICAgICAgICAgMAotCi0vKiBSZWdpc3RlciBBRERSLCBSTVNLLCBhbmQgU0hGVCovCi0jZGVmaW5lIEpQRUdfU09TX1JFR18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpQRUdfU09TX1JFR18wCi0jZGVmaW5lIEhXSU9fSlBFR19TT1NfUkVHXzBfQUREUiAgLyogUlcgKi8gICAgICAgICAgICAgICAoSlBFR0RfQkFTRSsweDAwMDAwMDIwKQotI2RlZmluZSBIV0lPX0pQRUdfU09TX1JFR18wX19QT1IgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIV0lPX0pQRUdfU09TX1JFR18wX19STVNLICAgICAgICAgICAgICAgICAgICAgICAgMHhGRjAwMDAwMAotI2RlZmluZSBIV0lPX0pQRUdfU09TX1JFR18wX19TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNAotLypSZWdpc3RlciBFbGVtZW50IE1JTiBhbmQgTUFYKi8KLSNkZWZpbmUgSFdJT19KUEVHX1NPU19SRUdfMF9fX1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQKLSNkZWZpbmUgSFdJT19KUEVHX1NPU19SRUdfMF9fX1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQKLSNkZWZpbmUgSFdJT19KUEVHX1NPU19SRUdfMF9fX1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQKLSNkZWZpbmUgSFdJT19KUEVHX1NPU19SRUdfMF9fX1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQKLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX0pQRUdfU09TX1JFR18wX19KUEVHX1NPU19SRUdfMF9OU19fQk1TSyAgICAgICAweEZGMDAwMDAwCi0jZGVmaW5lIEhXSU9fSlBFR19TT1NfUkVHXzBfX0pQRUdfU09TX1JFR18wX05TX19TSEZUICAgICAgICAgICAgICAgMjQKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBKUEVHX1NPU19SRUdfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlBFR19TT1NfUkVHXzEKLSNkZWZpbmUgSFdJT19KUEVHX1NPU19SRUdfMV9BRERSICAvKiBSVyAqLyAgICAgICAgICAgICAgKEpQRUdEX0JBU0UrMHgwMDAwMDAyNCkKLSNkZWZpbmUgSFdJT19KUEVHX1NPU19SRUdfMV9fUE9SICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIV0lPX0pQRUdfU09TX1JFR18xX19STVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEhXSU9fSlBFR19TT1NfUkVHXzFfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX0pQRUdfU09TX1JFR18xX19KUEVHX1NPU19SRUdfMV9DU19fQk1TSyAgICAweDAwMDBGRjAwCi0jZGVmaW5lIEhXSU9fSlBFR19TT1NfUkVHXzFfX0pQRUdfU09TX1JFR18xX0NTX19TSEZUICAgICAgICAgICAgIDgKLSNkZWZpbmUgSFdJT19KUEVHX1NPU19SRUdfMV9fSlBFR19TT1NfUkVHXzFfVERfX0JNU0sgICAgMHgwMDAwMDBGMAotI2RlZmluZSBIV0lPX0pQRUdfU09TX1JFR18xX19KUEVHX1NPU19SRUdfMV9URF9fU0hGVCAgICAgICAgICAgICA0Ci0jZGVmaW5lIEhXSU9fSlBFR19TT1NfUkVHXzFfX0pQRUdfU09TX1JFR18xX1RBX19CTVNLICAgIDB4MDAwMDAwMEYKLSNkZWZpbmUgSFdJT19KUEVHX1NPU19SRUdfMV9fSlBFR19TT1NfUkVHXzFfVEFfX1NIRlQgICAgICAgICAgICAgMAotCi0vKiBSZWdpc3RlciBBRERSLCBSTVNLLCBhbmQgU0hGVCovCi0jZGVmaW5lIEpQRUdfUVRfSURYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlBFR19RVF9JRFgKLSNkZWZpbmUgSFdJT19KUEVHX1FUX0lEWF9BRERSICAgICAgIChKUEVHRF9CQVNFKzB4MDAwMDAwMzApCi0jZGVmaW5lIEhXSU9fSlBFR19RVF9JRFhfX1BPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFdJT19KUEVHX1FUX0lEWF9fUk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBIV0lPX0pQRUdfUVRfSURYX19TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0vKiBSZWdpc3RlciBGaWVsZCBGTVNLIGFuZCBTSEZUKi8KLSNkZWZpbmUgSFdJT19KUEVHX1FUX0lEWF9fSlBFR19RVF9JRFhfVEFCTEVfMV9fQk1TSyAgICAgICAgMHgwMDAwRkYwMAotI2RlZmluZSBIV0lPX0pQRUdfUVRfSURYX19KUEVHX1FUX0lEWF9UQUJMRV8xX19TSEZUICAgICAgICAgICAgICAgICAgOAotI2RlZmluZSBIV0lPX0pQRUdfUVRfSURYX19KUEVHX1FUX0lEWF9UQUJMRV8wX19CTVNLICAgICAgICAgMHgwMDAwMDBGRgotI2RlZmluZSBIV0lPX0pQRUdfUVRfSURYX19KUEVHX1FUX0lEWF9UQUJMRV8wX19TSEZUICAgICAgICAgICAgICAgICAgMAotCi0vKiBSZWdpc3RlciBBRERSLCBSTVNLLCBhbmQgU0hGVCovCi0jZGVmaW5lIEpQRUdfRFFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpQRUdfRFFUCi0jZGVmaW5lIEhXSU9fSlBFR19EUVRfQUREUiAgLyogUlcgKi8gICAgICAgICAgICAgICAgICAgIChKUEVHRF9CQVNFKzB4MDAwMDAwMzQpCi0jZGVmaW5lIEhXSU9fSlBFR19EUVRfX1BPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFdJT19KUEVHX0RRVF9fUk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRjAwRkZGRgotI2RlZmluZSBIV0lPX0pQRUdfRFFUX19TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0vKiBSZWdpc3RlciBGaWVsZCBGTVNLIGFuZCBTSEZUKi8KLSNkZWZpbmUgSFdJT19KUEVHX0RRVF9fSlBFR19EUVRfVFFfX0JNU0sgICAgICAgICAgICAgICAgMHgwRjAwMDAwMAotI2RlZmluZSBIV0lPX0pQRUdfRFFUX19KUEVHX0RRVF9UUV9fU0hGVCAgICAgICAgICAgICAgICAyNAotI2RlZmluZSBIV0lPX0pQRUdfRFFUX19KUEVHX0RRVF9RS19fQk1TSyAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEhXSU9fSlBFR19EUVRfX0pQRUdfRFFUX1FLX19TSEZUICAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBKUEVHX0RSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlBFR19EUkkKLSNkZWZpbmUgSFdJT19KUEVHX0RSSV9BRERSICAvKiBSVyAqLyAgICAgICAgICAgIChKUEVHRF9CQVNFKzB4MDAwMDAwNDApCi0jZGVmaW5lIEhXSU9fSlBFR19EUklfX1BPUiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhXSU9fSlBFR19EUklfX1JNU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEhXSU9fSlBFR19EUklfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0vKiBSZWdpc3RlciBGaWVsZCBGTVNLIGFuZCBTSEZUKi8KLSNkZWZpbmUgSFdJT19KUEVHX0RSSV9fSlBFR19EUklfUklfX0JNU0sgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgSFdJT19KUEVHX0RSSV9fSlBFR19EUklfUklfX1NIRlQgICAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBKUEVHX0RIVF9SRUdfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUEVHX0RIVF9SRUdfMAotI2RlZmluZSBIV0lPX0pQRUdfREhUX1JFR18wX0FERFIgIC8qIFJXICovICAgICAgICAgICAgICAgKEpQRUdEX0JBU0UrMHgwMDAwMDA1MCkKLSNkZWZpbmUgSFdJT19KUEVHX0RIVF9SRUdfMF9fUE9SICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFdJT19KUEVHX0RIVF9SRUdfMF9fUk1TSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKLSNkZWZpbmUgSFdJT19KUEVHX0RIVF9SRUdfMF9fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX0pQRUdfREhUX1JFR18wX19KUEVHX0RIVF9SRUdfMF9USF9fQk1TSyAgICAgMHgwMDAwMDBGMAotI2RlZmluZSBIV0lPX0pQRUdfREhUX1JFR18wX19KUEVHX0RIVF9SRUdfMF9USF9fU0hGVCAgICAgICAgICAgICAgNAotI2RlZmluZSBIV0lPX0pQRUdfREhUX1JFR18wX19KUEVHX0RIVF9SRUdfMF9UQ19fQk1TSyAgICAgMHgwMDAwMDAwRgotI2RlZmluZSBIV0lPX0pQRUdfREhUX1JFR18wX19KUEVHX0RIVF9SRUdfMF9UQ19fU0hGVCAgICAgICAgICAgICAgMAotCi0vKiBSZWdpc3RlciBBRERSLCBSTVNLLCBhbmQgU0hGVCovCi0jZGVmaW5lIEpQRUdfREhUX0lEWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUEVHX0RIVF9JRFgKLSNkZWZpbmUgSFdJT19KUEVHX0RIVF9JRFhfQUREUiAgLyogUlcgKi8gICAgICAoSlBFR0RfQkFTRSsweDAwMDAwMDU0KQotI2RlZmluZSBIV0lPX0pQRUdfREhUX0lEWF9fUE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhXSU9fSlBFR19ESFRfSURYX19STVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDBGRkYKLSNkZWZpbmUgSFdJT19KUEVHX0RIVF9JRFhfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotLyogUmVnaXN0ZXIgRmllbGQgRk1TSyBhbmQgU0hGVCovCi0jZGVmaW5lIEhXSU9fSlBFR19ESFRfSURYX19KUEVHX0RIVF9JRFhfQ0NDX01BWF9fQk1TSyAgICAgICAgIDB4MDAwMDBGMDAKLSNkZWZpbmUgSFdJT19KUEVHX0RIVF9JRFhfX0pQRUdfREhUX0lEWF9DQ0NfTUFYX19TSEZUICAgICAgICAgICAgICAgICAgOAotI2RlZmluZSBIV0lPX0pQRUdfREhUX0lEWF9fSlBFR19ESFRfSURYX1ZJSl9fQk1TSyAgICAgICAgICAgICAweDAwMDAwMEZGCi0jZGVmaW5lIEhXSU9fSlBFR19ESFRfSURYX19KUEVHX0RIVF9JRFhfVklKX19TSEZUICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBKUEVHX0RIVF9SRUdfMSAgICAgICAgICAgICAgICAgICAgICAgICAgSlBFR19ESFRfUkVHXzEKLSNkZWZpbmUgSFdJT19KUEVHX0RIVF9SRUdfMV9BRERSICAvKiBSVyAqLyAgICAgICAgICAoSlBFR0RfQkFTRSsweDAwMDAwMDU4KQotI2RlZmluZSBIV0lPX0pQRUdfREhUX1JFR18xX19QT1IgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFdJT19KUEVHX0RIVF9SRUdfMV9fUk1TSyAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCi0jZGVmaW5lIEhXSU9fSlBFR19ESFRfUkVHXzFfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotLyogUmVnaXN0ZXIgRmllbGQgRk1TSyBhbmQgU0hGVCovCi0jZGVmaW5lIEhXSU9fSlBFR19ESFRfUkVHXzFfX0pQRUdfREhUX1JFR18xX1ZJSl8wX19CTVNLICAgICAgIDB4RkYwMDAwMDAKLSNkZWZpbmUgSFdJT19KUEVHX0RIVF9SRUdfMV9fSlBFR19ESFRfUkVHXzFfVklKXzBfX1NIRlQgICAgICAgICAgICAgICAyNAotI2RlZmluZSBIV0lPX0pQRUdfREhUX1JFR18xX19KUEVHX0RIVF9SRUdfMV9WSUpfMV9fQk1TSyAgICAgICAweDAwRkYwMDAwCi0jZGVmaW5lIEhXSU9fSlBFR19ESFRfUkVHXzFfX0pQRUdfREhUX1JFR18xX1ZJSl8xX19TSEZUICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgSFdJT19KUEVHX0RIVF9SRUdfMV9fSlBFR19ESFRfUkVHXzFfVklKXzJfX0JNU0sgICAgICAgMHgwMDAwRkYwMAotI2RlZmluZSBIV0lPX0pQRUdfREhUX1JFR18xX19KUEVHX0RIVF9SRUdfMV9WSUpfMl9fU0hGVCAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIEhXSU9fSlBFR19ESFRfUkVHXzFfX0pQRUdfREhUX1JFR18xX1ZJSl8zX19CTVNLICAgICAgIDB4MDAwMDAwRkYKLSNkZWZpbmUgSFdJT19KUEVHX0RIVF9SRUdfMV9fSlBFR19ESFRfUkVHXzFfVklKXzNfX1NIRlQgICAgICAgICAgICAgICAgMAotCi0vKiBSZWdpc3RlciBBRERSLCBSTVNLLCBhbmQgU0hGVCovCi0jZGVmaW5lIEpQRUdfREhUX0NDQ19NQVggICAgICAgICAgICAgICAgICAgICAgICAgIEpQRUdfREhUX0NDQ19NQVgKLSNkZWZpbmUgSFdJT19KUEVHX0RIVF9DQ0NfTUFYX0FERFIgIC8qIFJXICovICAgICAgICAgICAgKEpQRUdEX0JBU0UrMHgwMDAwMDA1QykKLSNkZWZpbmUgSFdJT19KUEVHX0RIVF9DQ0NfTUFYX19QT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIV0lPX0pQRUdfREhUX0NDQ19NQVhfX1JNU0sgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCi0jZGVmaW5lIEhXSU9fSlBFR19ESFRfQ0NDX01BWF9fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX0pQRUdfREhUX0NDQ19NQVhfX0pQRUdfREhUX0NDQ19NQVhfTUFYX19CTVNLICAgIDB4RkZGRjAwMDAKLSNkZWZpbmUgSFdJT19KUEVHX0RIVF9DQ0NfTUFYX19KUEVHX0RIVF9DQ0NfTUFYX01BWF9fU0hGVCAgICAgICAgICAgIDE2Ci0jZGVmaW5lIEhXSU9fSlBFR19ESFRfQ0NDX01BWF9fSlBFR19ESFRfQ0NDX01BWF9DQ0NfX0JNU0sgICAgMHgwMDAwRkZGRgotI2RlZmluZSBIV0lPX0pQRUdfREhUX0NDQ19NQVhfX0pQRUdfREhUX0NDQ19NQVhfQ0NDX19TSEZUICAgICAgICAgICAgIDAKLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX0pQRUdfREhUX0NDQ19NQVhfX0pQRUdfREhUX0NDQ19NQVhfTUFYX19CTVNLICAgIDB4RkZGRjAwMDAKLSNkZWZpbmUgSFdJT19KUEVHX0RIVF9DQ0NfTUFYX19KUEVHX0RIVF9DQ0NfTUFYX01BWF9fU0hGVCAgICAgICAgICAgIDE2Ci0jZGVmaW5lIEhXSU9fSlBFR19ESFRfQ0NDX01BWF9fSlBFR19ESFRfQ0NDX01BWF9DQ0NfX0JNU0sgICAgMHgwMDAwRkZGRgotI2RlZmluZSBIV0lPX0pQRUdfREhUX0NDQ19NQVhfX0pQRUdfREhUX0NDQ19NQVhfQ0NDX19TSEZUICAgICAgICAgICAgIDAKLSNkZWZpbmUgSFdJT19KUEVHX0RIVF9DQ0NfTUFYX19KUEVHX0RIVF9MSV9fQk1TSyAgICAgICAweDAwMDAwMEZGCi0jZGVmaW5lIEhXSU9fSlBFR19ESFRfQ0NDX01BWF9fSlBFR19ESFRfTElfX1NIRlQgICAgICAgICAgICAgICAgMAotCi0vKiBSZWdpc3RlciBBRERSLCBSTVNLLCBhbmQgU0hGVCovCi0jZGVmaW5lIEpQRUdfREVDX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICBKUEVHX0RFQ19TQ0FMRQotI2RlZmluZSBIV0lPX0pQRUdfREVDX1NDQUxFX0FERFIgIC8qIFJXICovICAgICAgIChKUEVHRF9CQVNFKzB4MDAwMDAwNjApCi0jZGVmaW5lIEhXSU9fSlBFR19ERUNfU0NBTEVfX1BPUiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIV0lPX0pQRUdfREVDX1NDQUxFX19STVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKLSNkZWZpbmUgSFdJT19KUEVHX0RFQ19TQ0FMRV9fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCi0vKiBSZWdpc3RlciBGaWVsZCBGTVNLIGFuZCBTSEZUKi8KLSNkZWZpbmUgSFdJT19KUEVHX0RFQ19TQ0FMRV9fSlBFR19ERUNfU0NBTEVfUkFUSU9fX0JNU0sgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBIV0lPX0pQRUdfREVDX1NDQUxFX19KUEVHX0RFQ19TQ0FMRV9SQVRJT19fU0hGVCAgICAgICAgICAgICAgICAwCi0KLS8qIFJlZ2lzdGVyIEFERFIsIFJNU0ssIGFuZCBTSEZUKi8KLSNkZWZpbmUgSlBFR19DT05WRVJUICAgICAgICAgICAgICAgICAgICAgICAgIEpQRUdfQ09OVkVSVAotI2RlZmluZSBIV0lPX0pQRUdfQ09OVkVSVF9BRERSICAvKiBSVyAqLyAgICAgICAoSlBFR0RfQkFTRSsweDAwMDAwMDY0KQotI2RlZmluZSBIV0lPX0pQRUdfQ09OVkVSVF9fUE9SICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhXSU9fSlBFR19DT05WRVJUX19STVNLICAgICAgICAgICAgICAgIDB4RkZGRjEzRkYKLSNkZWZpbmUgSFdJT19KUEVHX0NPTlZFUlRfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAotLyogUmVnaXN0ZXIgRmllbGQgRk1TSyBhbmQgU0hGVCovCi0jZGVmaW5lIEhXSU9fSlBFR19DT05WRVJUX19KUEVHX0NPTlZFUlRfTU9OT19DQl9WQUxVRV9fQk1TSyAgICAgIDB4RkYwMDAwMDAKLSNkZWZpbmUgSFdJT19KUEVHX0NPTlZFUlRfX0pQRUdfQ09OVkVSVF9NT05PX0NCX1ZBTFVFX19TSEZUICAgICAgICAgICAgICAyNAotI2RlZmluZSBIV0lPX0pQRUdfQ09OVkVSVF9fSlBFR19DT05WRVJUX01PTk9fQ1JfVkFMVUVfX0JNU0sgICAgICAweDAwRkYwMDAwCi0jZGVmaW5lIEhXSU9fSlBFR19DT05WRVJUX19KUEVHX0NPTlZFUlRfTU9OT19DUl9WQUxVRV9fU0hGVCAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgSFdJT19KUEVHX0NPTlZFUlRfX0pQRUdfQ09OVkVSVF9DTEFNUF9FTl9fQk1TSyAgICAgICAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBIV0lPX0pQRUdfQ09OVkVSVF9fSlBFR19DT05WRVJUX0NMQU1QX0VOX19TSEZUICAgICAgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIEhXSU9fSlBFR19DT05WRVJUX19KUEVHX0NPTlZFUlRfQ0JDUl9TV0lUQ0hfX0JNU0sgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgSFdJT19KUEVHX0NPTlZFUlRfX0pQRUdfQ09OVkVSVF9DQkNSX1NXSVRDSF9fU0hGVCAgICAgICAgICAgICAgICAgOQotI2RlZmluZSBIV0lPX0pQRUdfQ09OVkVSVF9fSlBFR19DT05WRVJUX01PTk9DSFJPTUVfRU5fX0JNU0sgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEhXSU9fSlBFR19DT05WRVJUX19KUEVHX0NPTlZFUlRfTU9OT0NIUk9NRV9FTl9fU0hGVCAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgSFdJT19KUEVHX0NPTlZFUlRfX0pQRUdfQ09OVkVSVF9NRU1fT1JHX19CTVNLICAgICAgICAgICAgMHgwMDAwMDBDMAotI2RlZmluZSBIV0lPX0pQRUdfQ09OVkVSVF9fSlBFR19DT05WRVJUX01FTV9PUkdfX1NIRlQgICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIEhXSU9fSlBFR19DT05WRVJUX19KUEVHX0NPTlZFUlRfNDIyX01DVV9UWVBFX19CTVNLICAgICAgIDB4MDAwMDAwMzAKLSNkZWZpbmUgSFdJT19KUEVHX0NPTlZFUlRfX0pQRUdfQ09OVkVSVF80MjJfTUNVX1RZUEVfX1NIRlQgICAgICAgICAgICAgICAgNAotI2RlZmluZSBIV0lPX0pQRUdfQ09OVkVSVF9fSlBFR19DT05WRVJUX09VVFBVVF9GT1JNQVRfX0JNU0sgICAgICAweDAwMDAwMDBDCi0jZGVmaW5lIEhXSU9fSlBFR19DT05WRVJUX19KUEVHX0NPTlZFUlRfT1VUUFVUX0ZPUk1BVF9fU0hGVCAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgSFdJT19KUEVHX0NPTlZFUlRfX0pQRUdfQ09OVkVSVF9JTlBVVF9GT1JNQVRfX0JNU0sgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBIV0lPX0pQRUdfQ09OVkVSVF9fSlBFR19DT05WRVJUX0lOUFVUX0ZPUk1BVF9fU0hGVCAgICAgICAgICAgICAgICAwCi0KLS8qIFJlZ2lzdGVyIEFERFIsIFJNU0ssIGFuZCBTSEZUKi8KLSNkZWZpbmUgSlBFR19FTkNfQllURV9DTlQgICAgICAgICAgICAgICAgICAgICAgIEpQRUdfRU5DX0JZVEVfQ05UCi0jZGVmaW5lIEhXSU9fSlBFR19FTkNfQllURV9DTlRfQUREUiAgLyogUlcgKi8gICAgICAgICAgKEpQRUdEX0JBU0UrMHgwMDAwMDA3MCkKLSNkZWZpbmUgSFdJT19KUEVHX0VOQ19CWVRFX0NOVF9fUE9SICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhXSU9fSlBFR19FTkNfQllURV9DTlRfX1JNU0sgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgotI2RlZmluZSBIV0lPX0pQRUdfRU5DX0JZVEVfQ05UX19TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX0pQRUdfRU5DX0JZVEVfQ05UX19KUEVHX0VOQ19CWVRFX0NOVF9UT1RfX0JNU0sgICAgIDB4RkZGRkZGRkYKLSNkZWZpbmUgSFdJT19KUEVHX0VOQ19CWVRFX0NOVF9fSlBFR19FTkNfQllURV9DTlRfVE9UX19TSEZUICAgICAgICAgICAgICAwCi0KLS8qIFJlZ2lzdGVyIEFERFIsIFJNU0ssIGFuZCBTSEZUKi8KLSNkZWZpbmUgSlBFR19ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUEVHX0RFQlVHCi0jZGVmaW5lIEhXSU9fSlBFR19ERUJVR19BRERSICAvKiBSVyAqLyAgICAgICAgICAgICAgKEpQRUdEX0JBU0UrMHgwMDAwMDA4MCkKLSNkZWZpbmUgSFdJT19KUEVHX0RFQlVHX19QT1IgICAgICAgICAgICAgICAgICAgICAgICAweDRBNTA0NTQ3Ci0jZGVmaW5lIEhXSU9fSlBFR19ERUJVR19fUk1TSyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgotI2RlZmluZSBIV0lPX0pQRUdfREVCVUdfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX0pQRUdfREVCVUdfX0pQRUdfREVCVUdfX0JNU0sgICAgICAgICAgICAweEZGRkZGRkZGCi0jZGVmaW5lIEhXSU9fSlBFR19ERUJVR19fSlBFR19ERUJVR19fU0hGVCAgICAgICAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBKUEVHX1NQQVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUEVHX1NQQVJFCi0jZGVmaW5lIEhXSU9fSlBFR19TUEFSRV9BRERSICAvKiBSVyAqLyAgICAgICAgICAgIChKUEVHRF9CQVNFKzB4MDAwMDAwODQpCi0jZGVmaW5lIEhXSU9fSlBFR19TUEFSRV9fUE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFdJT19KUEVHX1NQQVJFX19STVNLICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgotI2RlZmluZSBIV0lPX0pQRUdfU1BBUkVfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0vKiBSZWdpc3RlciBGaWVsZCBGTVNLIGFuZCBTSEZUKi8KLSNkZWZpbmUgSFdJT19KUEVHX1NQQVJFX19KUEVHX1NQQVJFXzAwX19CTVNLICAgICAgICAgICAgMHhGRkZGRkZGRgotI2RlZmluZSBIV0lPX0pQRUdfU1BBUkVfX0pQRUdfU1BBUkVfMDBfX1NIRlQgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qIFJlZ2lzdGVyIEFERFIsIFJNU0ssIGFuZCBTSEZUKi8KLSNkZWZpbmUgSlBFR19SRUdJU1RFUl9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICBKUEVHX1JFR0lTVEVSX1RJTUVPVVQKLSNkZWZpbmUgSFdJT19KUEVHX1JFR0lTVEVSX1RJTUVPVVRfQUREUiAgICAoSlBFR0RfQkFTRSsweDAwMDAwMDg4KQotI2RlZmluZSBIV0lPX0pQRUdfUkVHSVNURVJfVElNRU9VVF9fUE9SICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBIV0lPX0pQRUdfUkVHSVNURVJfVElNRU9VVF9fUk1TSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBIV0lPX0pQRUdfUkVHSVNURVJfVElNRU9VVF9fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotLyogUmVnaXN0ZXIgRmllbGQgRk1TSyBhbmQgU0hGVCovCi0jZGVmaW5lIEhXSU9fSlBFR19SRUdJU1RFUl9USU1FT1VUX19KUEVHX1RJTUVPVVRfVkFMVUVfX0JNU0sgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgSFdJT19KUEVHX1JFR0lTVEVSX1RJTUVPVVRfX0pQRUdfVElNRU9VVF9WQUxVRV9fU0hGVCAgICAgICAgICAgICAgICAgMAotCi0vKiBSZWdpc3RlciBBRERSLCBSTVNLLCBhbmQgU0hGVCovCi0jZGVmaW5lIEpQRUdEX1NUQVRVU19CVVNfREFUQSAgICAgICAgICAgICAgICAgICAgIEpQRUdEX1NUQVRVU19CVVNfREFUQQotI2RlZmluZSBIV0lPX0pQRUdEX1NUQVRVU19CVVNfREFUQV9BRERSICAvKiBSVyAqLyAgICAgICAoSlBFR0RfQkFTRSsweDAwMDAwMjU4KQotI2RlZmluZSBIV0lPX0pQRUdEX1NUQVRVU19CVVNfREFUQV9fUE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFdJT19KUEVHRF9TVEFUVVNfQlVTX0RBVEFfX1JNU0sgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCi0jZGVmaW5lIEhXSU9fSlBFR0RfU1RBVFVTX0JVU19EQVRBX19TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotLyogUmVnaXN0ZXIgRmllbGQgRk1TSyBhbmQgU0hGVCovCi0jZGVmaW5lIEhXSU9fSlBFR0RfU1RBVFVTX0JVU19EQVRBX19TVEFUVVNfQlVTX0RBVEFfX0JNU0sgICAgICAweEZGRkZGRkZGCi0jZGVmaW5lIEhXSU9fSlBFR0RfU1RBVFVTX0JVU19EQVRBX19TVEFUVVNfQlVTX0RBVEFfX1NIRlQgICAgICAgICAgICAgICAwCi0KLS8qIFJlZ2lzdGVyIEFERFIsIFJNU0ssIGFuZCBTSEZUKi8KLSNkZWZpbmUgSlBFR0RfU1RBVFVTX0JVU19DT05GSUcgICAgICAgICAgICAgICAgICAgICBKUEVHRF9TVEFUVVNfQlVTX0NPTkZJRwotI2RlZmluZSBIV0lPX0pQRUdEX1NUQVRVU19CVVNfQ09ORklHX0FERFIgIC8qIFJXICovICAgICAoSlBFR0RfQkFTRSsweDAwMDAwMjVDKQotI2RlZmluZSBIV0lPX0pQRUdEX1NUQVRVU19CVVNfQ09ORklHX19QT1IgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhXSU9fSlBFR0RfU1RBVFVTX0JVU19DT05GSUdfX1JNU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUYKLSNkZWZpbmUgSFdJT19KUEVHRF9TVEFUVVNfQlVTX0NPTkZJR19fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotLyogUmVnaXN0ZXIgRmllbGQgRk1TSyBhbmQgU0hGVCovCi0jZGVmaW5lIEhXSU9fSlBFR0RfU1RBVFVTX0JVU19DT05GSUdfX1NUQVRVU19CVVNfU0VMX19CTVNLICAgICAgICAgMHgwMDAwMDAxRgotI2RlZmluZSBIV0lPX0pQRUdEX1NUQVRVU19CVVNfQ09ORklHX19TVEFUVVNfQlVTX1NFTF9fU0hGVCAgICAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBSVERNQV9KUEVHX0FYSV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgIFJURE1BX0pQRUdfQVhJX0NPTkZJRwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfQVhJX0NPTkZJR19BRERSICAvKiBSVyAqLyAgICAgICAgKEpQRUdEX0JBU0UrMHgwMDAwMDI2MCkKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX0FYSV9DT05GSUdfX1BPUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjQKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX0FYSV9DT05GSUdfX1JNU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDBGRkYKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX0FYSV9DT05GSUdfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfQVhJX0NPTkZJR19fT1VUX09GX09SREVSX1dSX19CTVNLICAgICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX0FYSV9DT05GSUdfX09VVF9PRl9PUkRFUl9XUl9fU0hGVCAgICAgICAgICAgICAgICAgIDExCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19BWElfQ09ORklHX19PVVRfT0ZfT1JERVJfUkRfX0JNU0sgICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfQVhJX0NPTkZJR19fT1VUX09GX09SREVSX1JEX19TSEZUICAgICAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX0FYSV9DT05GSUdfX0JPVU5EX0xJTUlUX19CTVNLICAgICAgICAgICAgICAweDAwMDAwMzAwCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19BWElfQ09ORklHX19CT1VORF9MSU1JVF9fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgOAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfQVhJX0NPTkZJR19fUEFDS19USU1FT1VUX19CTVNLICAgICAgICAgICAgIDB4MDAwMDAwRjAKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX0FYSV9DT05GSUdfX1BBQ0tfVElNRU9VVF9fU0hGVCAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19BWElfQ09ORklHX19QQUNLX01BWF9CTEVOX19CTVNLICAgICAgICAgICAgMHgwMDAwMDAwRgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfQVhJX0NPTkZJR19fUEFDS19NQVhfQkxFTl9fU0hGVCAgICAgICAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBKUEVHRF9DTEtfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlBFR0RfQ0xLX0NPTlRST0wKLSNkZWZpbmUgSFdJT19KUEVHRF9DTEtfQ09OVFJPTF9BRERSICAvKiBSVyAqLyAgIChKUEVHRF9CQVNFKzB4MDAwMDAyNjQpCi0jZGVmaW5lIEhXSU9fSlBFR0RfQ0xLX0NPTlRST0xfX1BPUiAgICAgICAgICAgICAweDAwMDAwMDA1Ci0jZGVmaW5lIEhXSU9fSlBFR0RfQ0xLX0NPTlRST0xfX1JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRgotI2RlZmluZSBIV0lPX0pQRUdEX0NMS19DT05UUk9MX19TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX0pQRUdEX0NMS19DT05UUk9MX19KUEVHX0NMS0lETEVfX0JNU0sgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgSFdJT19KUEVHRF9DTEtfQ09OVFJPTF9fSlBFR19DTEtJRExFX19TSEZUICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEhXSU9fSlBFR0RfQ0xLX0NPTlRST0xfX0pQRUdfQ0xLT05fX0JNU0sgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBIV0lPX0pQRUdEX0NMS19DT05UUk9MX19KUEVHX0NMS09OX19TSEZUICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgSFdJT19KUEVHRF9DTEtfQ09OVFJPTF9fQVhJX0NMS0lETEVfX0JNU0sgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEhXSU9fSlBFR0RfQ0xLX0NPTlRST0xfX0FYSV9DTEtJRExFX19TSEZUICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBIV0lPX0pQRUdEX0NMS19DT05UUk9MX19BWElfQ0xLT05fX0JNU0sgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSFdJT19KUEVHRF9DTEtfQ09OVFJPTF9fQVhJX0NMS09OX19TSEZUICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qIFJlZ2lzdGVyIEFERFIsIFJNU0ssIGFuZCBTSEZUKi8KLSNkZWZpbmUgUlRETUFfSlBFR19XUl9CVUZfQ09ORklHICAgICAgICAgICAgICAgICAgICAgUlRETUFfSlBFR19XUl9CVUZfQ09ORklHCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZfQ09ORklHX0FERFIgIC8qIFJXICovICAgKEpQRUdEX0JBU0UrMHgwMDAwMDIwMCkKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9DT05GSUdfX1BPUiAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZfQ09ORklHX19STVNLICAgICAgICAgICAgMHgwMDAwMDAxRgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGX0NPTkZJR19fU0hGVCAgICAgICAgICAgICAgICAgICAgIDAKLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGX0NPTkZJR19fQlVGX0ZPUk1BVF9fQk1TSyAgICAgICAgIDB4MDAwMDAwMUMKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9DT05GSUdfX0JVRl9GT1JNQVRfX1NIRlQgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZfQ09ORklHX19OVU1fT0ZfUExBTkVTX19CTVNLICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGX0NPTkZJR19fTlVNX09GX1BMQU5FU19fU0hGVCAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBSVERNQV9KUEVHX1dSX09QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJURE1BX0pQRUdfV1JfT1AKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX09QX0FERFIgIC8qIFJXICovICAgICAgICAoSlBFR0RfQkFTRSsweDAwMDAwMjA0KQotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfT1BfX1BPUiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX09QX19STVNLICAgICAgICAgICAgICAgICAweDAwMDAwMDEzCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9PUF9fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotLyogUmVnaXN0ZXIgRmllbGQgRk1TSyBhbmQgU0hGVCovCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9PUF9fQUxJR05fX0JNU0sgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfT1BfX0FMSUdOX19TSEZUICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX09QX19GTElQX19CTVNLICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9PUF9fRkxJUF9fU0hGVCAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfT1BfX01JUlJPUl9fQk1TSyAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX09QX19NSVJST1JfX1NIRlQgICAgICAgICAgICAgICAgICAwCi0KLS8qIFJlZ2lzdGVyIEFERFIsIFJNU0ssIGFuZCBTSEZUKi8KLSNkZWZpbmUgUlRETUFfSlBFR19XUl9CVUZfWV9QTlRSICAgICAgICAgICAgICAgICAgICAgIFJURE1BX0pQRUdfV1JfQlVGX1lfUE5UUgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGX1lfUE5UUl9BRERSICAgIChKUEVHRF9CQVNFKzB4MDAwMDAyMDgpCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZfWV9QTlRSX19QT1IgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGX1lfUE5UUl9fUk1TSyAgICAgICAgICAgICAgIDB4RkZGRkZGRjgKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9ZX1BOVFJfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAzCi0vKiBSZWdpc3RlciBFbGVtZW50IE1JTiBhbmQgTUFYKi8KLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9ZX1BOVFJfX19TICAgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZfWV9QTlRSX19fUyAgICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGX1lfUE5UUl9fX1MgICAgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9ZX1BOVFJfX19TICAgICAgICAgICAgICAgICAgICAgICAgICAzCi0KLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGX1lfUE5UUl9fUE5UUl9fQk1TSyAgICAgICAgIDB4RkZGRkZGRjgKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9ZX1BOVFJfX1BOVFJfX1NIRlQgICAgICAgICAgICAgICAgICAzCi0KLS8qIFJlZ2lzdGVyIEFERFIsIFJNU0ssIGFuZCBTSEZUKi8KLSNkZWZpbmUgUlRETUFfSlBFR19XUl9CVUZfVV9QTlRSICAgICAgICAgICAgICAgICAgICAgIFJURE1BX0pQRUdfV1JfQlVGX1VfUE5UUgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGX1VfUE5UUl9BRERSICAvKiBSVyAqLyAgICAgKEpQRUdEX0JBU0UrMHgwMDAwMDIwQykKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9VX1BOVFJfX1BPUiAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9VX1BOVFJfX1JNU0sgICAgICAgICAgICAgIDB4RkZGRkZGRjgKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9VX1BOVFJfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgIDMKLQotLyogUmVnaXN0ZXIgRWxlbWVudCBNSU4gYW5kIE1BWCovCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZfVV9QTlRSX19fUyAgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZfVV9QTlRSX19fUyAgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZfVV9QTlRSX19fUyAgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZfVV9QTlRSX19fUyAgICAgICAgICAgICAgICAgICAgICAgICAzCi0KLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGX1VfUE5UUl9fUE5UUl9fQk1TSyAgICAgICAgMHhGRkZGRkZGOAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGX1VfUE5UUl9fUE5UUl9fU0hGVCAgICAgICAgICAgICAgICAgMwotCi0vKiBSZWdpc3RlciBBRERSLCBSTVNLLCBhbmQgU0hGVCovCi0jZGVmaW5lIFJURE1BX0pQRUdfV1JfQlVGX1ZfUE5UUiAgICAgICAgICAgICAgICAgICAgICAgUlRETUFfSlBFR19XUl9CVUZfVl9QTlRSCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZfVl9QTlRSX0FERFIgICAoSlBFR0RfQkFTRSsweDAwMDAwMjEwKQotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGX1ZfUE5UUl9fUE9SICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9WX1BOVFJfX1JNU0sgICAgICAgICAgICAgICAweEZGRkZGRkY4Ci0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZfVl9QTlRSX19TSEZUICAgICAgICAgICAgICAgICAgICAgICAgMwotCi0vKiBSZWdpc3RlciBFbGVtZW50IE1JTiBhbmQgTUFYKi8KLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9WX1BOVFJfX19TICAgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZfVl9QTlRSX19fUyAgICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGX1ZfUE5UUl9fX1MgICAgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9WX1BOVFJfX19TICAgICAgICAgICAgICAgICAgICAgICAgICAzCi0KLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGX1ZfUE5UUl9fUE5UUl9fQk1TSyAgICAgICAgIDB4RkZGRkZGRjgKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9WX1BOVFJfX1BOVFJfX1NIRlQgICAgICAgICAgICAgICAgICAzCi0KLS8qIFJlZ2lzdGVyIEFERFIsIFJNU0ssIGFuZCBTSEZUKi8KLSNkZWZpbmUgUlRETUFfSlBFR19XUl9CVUZfUElUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgUlRETUFfSlBFR19XUl9CVUZfUElUQ0gKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9QSVRDSF9BRERSICAvKiBSVyAqLyAgICAoSlBFR0RfQkFTRSsweDAwMDAwMjE0KQotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGX1BJVENIX19QT1IgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9QSVRDSF9fUk1TSyAgICAgICAgICAgICAweDAwMDAzRkY4Ci0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZfUElUQ0hfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgMwotCi0vKiBSZWdpc3RlciBFbGVtZW50IE1JTiBhbmQgTUFYKi8KLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9QSVRDSF9fX1MgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZfUElUQ0hfX19TICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGX1BJVENIX19fUyAgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRl9QSVRDSF9fX1MgICAgICAgICAgICAgICAgICAgICAgICAzCi0KLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGX1BJVENIX19QSVRDSF9fQk1TSyAgICAgICAgICAweDAwMDAzRkY4Ci0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZfUElUQ0hfX1BJVENIX19TSEZUICAgICAgICAgICAgICAgICAgIDMKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBSVERNQV9KUEVHX1dSX1BMQU5FX1NJWkUgICAgICAgICAgICAgICAgICAgICAgUlRETUFfSlBFR19XUl9QTEFORV9TSVpFCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9QTEFORV9TSVpFX0FERFIgIC8qIFJXICovICAoSlBFR0RfQkFTRSsweDAwMDAwMjE4KQotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfUExBTkVfU0laRV9fUE9SICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfUExBTkVfU0laRV9fUk1TSyAgICAgICAgICAgMHgxRkZGMUZGRgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfUExBTkVfU0laRV9fU0hGVCAgICAgICAgICAgICAgICAgICAgMAotCi0vKiBSZWdpc3RlciBGaWVsZCBGTVNLIGFuZCBTSEZUKi8KLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX1BMQU5FX1NJWkVfX1BMQU5FX1ZTSVpFX19CTVNLICAgICAgIDB4MUZGRjAwMDAKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX1BMQU5FX1NJWkVfX1BMQU5FX1ZTSVpFX19TSEZUICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX1BMQU5FX1NJWkVfX1BMQU5FX0hTSVpFX19CTVNLICAgICAgIDB4MDAwMDFGRkYKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX1BMQU5FX1NJWkVfX1BMQU5FX0hTSVpFX19TSEZUICAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBSVERNQV9KUEVHX1dSX0JMT0NLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgUlRETUFfSlBFR19XUl9CTE9DS19TSVpFCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CTE9DS19TSVpFX0FERFIgIC8qIFJXICovICAgIChKUEVHRF9CQVNFKzB4MDAwMDAyMUMpCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CTE9DS19TSVpFX19QT1IgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JMT0NLX1NJWkVfX1JNU0sgICAgICAgICAgICAgMHgwMDAwMEZGRgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQkxPQ0tfU0laRV9fU0hGVCAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQkxPQ0tfU0laRV9fQkxPQ0tfVlNJWkVfX0JNU0sgICAgICAgICAgIDB4MDAwMDBGQzAKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JMT0NLX1NJWkVfX0JMT0NLX1ZTSVpFX19TSEZUICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CTE9DS19TSVpFX19CTE9DS19IU0laRV9fQk1TSyAgICAgICAgICAgMHgwMDAwMDAzRgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQkxPQ0tfU0laRV9fQkxPQ0tfSFNJWkVfX1NIRlQgICAgICAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBSVERNQV9KUEVHX1dSX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgIFJURE1BX0pQRUdfV1JfQlVGRkVSX1NJWkUKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRkZFUl9TSVpFX0FERFIgIC8qIFJXICovICAgKEpQRUdEX0JBU0UrMHgwMDAwMDIyMCkKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0JVRkZFUl9TSVpFX19QT1IgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGRkVSX1NJWkVfX1JNU0sgICAgICAgICAgICAweDAwMDAxRkZGCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZGRVJfU0laRV9fU0hGVCAgICAgICAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgRmllbGQgRk1TSyBhbmQgU0hGVCovCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9CVUZGRVJfU0laRV9fQlVGRkVSX1ZTSVpFX19CTVNLICAgICAgICAgMHgwMDAwMUZGRgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfQlVGRkVSX1NJWkVfX0JVRkZFUl9WU0laRV9fU0hGVCAgICAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBSVERNQV9KUEVHX1dSX1NUQV9BQ0sgICAgICAgICAgICAgICAgICAgICAgUlRETUFfSlBFR19XUl9TVEFfQUNLCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9TVEFfQUNLX0FERFIgIC8qIFJXICovICAgKEpQRUdEX0JBU0UrMHgwMDAwMDIyNCkKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX1NUQV9BQ0tfX1BPUiAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9TVEFfQUNLX19STVNLICAgICAgICAgICAgMHgwMDAwMDAwRgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfU1RBX0FDS19fU0hGVCAgICAgICAgICAgICAgICAgICAgIDMKLQotLyogUmVnaXN0ZXIgRWxlbWVudCBNSU4gYW5kIE1BWCovCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9TVEFfQUNLX19fUyAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfU1RBX0FDS19fX1MgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX1NUQV9BQ0tfX19TICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9TVEFfQUNLX19fUyAgICAgICAgICAgICAgICAgICAgICAgMwotCi0vKiBSZWdpc3RlciBGaWVsZCBGTVNLIGFuZCBTSEZUKi8KLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX1NUQV9BQ0tfX1NXX1JFU0VUX0FCT1JUX1JEWV9TVEFfX0JNU0sgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9TVEFfQUNLX19TV19SRVNFVF9BQk9SVF9SRFlfU1RBX19TSEZUICAgICAgICAgICAgMwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfU1RBX0FDS19fU1dfUkVTRVRfQUJPUlRfUkRZX0FDS19fQk1TSyAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX1NUQV9BQ0tfX1NXX1JFU0VUX0FCT1JUX1JEWV9BQ0tfX1NIRlQgICAgICAgICAgICAzCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9TVEFfQUNLX19FUlJfU1RBX19CTVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfU1RBX0FDS19fRVJSX1NUQV9fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX1NUQV9BQ0tfX0VSUl9BQ0tfX0JNU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9TVEFfQUNLX19FUlJfQUNLX19TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfU1RBX0FDS19fRU9GX1NUQV9fQk1TSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX1NUQV9BQ0tfX0VPRl9TVEFfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9TVEFfQUNLX19FT0ZfQUNLX19CTVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfU1RBX0FDS19fRU9GX0FDS19fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX1NUQV9BQ0tfX1NPRl9TVEFfX0JNU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9TVEFfQUNLX19TT0ZfU1RBX19TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfU1RBX0FDS19fU09GX0FDS19fQk1TSyAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfU1RBX0FDS19fU09GX0FDS19fU0hGVCAgICAgICAgICAgICAgICAgICAgMAotCi0vKiBSZWdpc3RlciBBRERSLCBSTVNLLCBhbmQgU0hGVCovCi0jZGVmaW5lIFJURE1BX0pQRUdfV1JfSU5UX0VOICAgICAgICAgICAgICAgICAgICAgIFJURE1BX0pQRUdfV1JfSU5UX0VOCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9JTlRfRU5fQUREUiAgLyogVyAqLyAgICAgICAgKEpQRUdEX0JBU0UrMHgwMDAwMDIyOCkKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1dSX0lOVF9FTl9fUE9SICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9JTlRfRU5fX1JNU0sgICAgICAgICAgICAgICAgMHgwMDAwMDAwRgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfV1JfSU5UX0VOX19TSEZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgRmllbGQgRk1TSyBhbmQgU0hGVCovCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9JTlRfRU5fX1NXX1JFU0VUX0FCT1JUX1JEWV9FTl9fQk1TSyAweDAwMDAwMDA4Ci0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9JTlRfRU5fX1NXX1JFU0VUX0FCT1JUX1JEWV9FTl9fU0hGVCAgICAgICAgICAzCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9JTlRfRU5fX0VSUl9FTl9fQk1TSyAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9JTlRfRU5fX0VSUl9FTl9fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9JTlRfRU5fX0VPRl9FTl9fQk1TSyAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9JTlRfRU5fX0VPRl9FTl9fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9JTlRfRU5fX1NPRl9FTl9fQk1TSyAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19XUl9JTlRfRU5fX1NPRl9FTl9fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qIFJlZ2lzdGVyIEFERFIsIFJNU0ssIGFuZCBTSEZUKi8KLSNkZWZpbmUgUlRETUFfSlBFR19SRF9CVUZfQ09ORklHICAgICAgICAgICAgICAgICAgICAgUlRETUFfSlBFR19SRF9CVUZfQ09ORklHCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfQ09ORklHX0FERFIgIC8qIFJXICovICAgICAoSlBFR0RfQkFTRSsweDAwMDAwMTAwKQotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX0NPTkZJR19fUE9SICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX0NPTkZJR19fUk1TSyAgICAgICAgICAgICAgMHgwMDAwMDAxRgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX0NPTkZJR19fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKiBSZWdpc3RlciBGaWVsZCBGTVNLIGFuZCBTSEZUKi8KLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9DT05GSUdfX0JVRl9GT1JNQVRfX0JNU0sgICAgICAgICAgMHgwMDAwMDAxQwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX0NPTkZJR19fQlVGX0ZPUk1BVF9fU0hGVCAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfQ09ORklHX19OVU1fT0ZfUExBTkVTX19CTVNLICAgICAgIDB4MDAwMDAwMDMKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9DT05GSUdfX05VTV9PRl9QTEFORVNfX1NIRlQgICAgICAgICAgICAgICAgMAotCi0vKiBSZWdpc3RlciBBRERSLCBSTVNLLCBhbmQgU0hGVCwgVyAqLwotI2RlZmluZSBSVERNQV9KUEVHX1JEX0JVRl9NTkdSX0JVRl9JRF9GSUZPICAgUlRETUFfSlBFR19SRF9CVUZfTU5HUl9CVUZfSURfRklGTwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX01OR1JfQlVGX0lEX0ZJRk9fQUREUiAgKEpQRUdEX0JBU0UrMHgwMDAwMDEwNCkKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9NTkdSX0JVRl9JRF9GSUZPX19QT1IgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfTU5HUl9CVUZfSURfRklGT19fUk1TSyAgICAgICAgICAgMHgwMDAwMDAxQwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX01OR1JfQlVGX0lEX0ZJRk9fX1NIRlQgICAgICAgICAgICAgICAgICAgIDIKLQotLyogUmVnaXN0ZXIgRWxlbWVudCBNSU4gYW5kIE1BWCovCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfTU5HUl9CVUZfSURfRklGT19fX1MgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX01OR1JfQlVGX0lEX0ZJRk9fX19TICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9NTkdSX0JVRl9JRF9GSUZPX19fUyAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfTU5HUl9CVUZfSURfRklGT19fX1MgICAgICAgICAgICAgICAgICAgICAgMgotCi0vKiBSZWdpc3RlciBGaWVsZCBGTVNLIGFuZCBTSEZUKi8KLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9NTkdSX0JVRl9JRF9GSUZPX19CVUZfQVBQTFlfX0JNU0sgICAweDAwMDAwMDEwCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfTU5HUl9CVUZfSURfRklGT19fQlVGX0FQUExZX19TSEZUICAgICAgICAgICAgNAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX01OR1JfQlVGX0lEX0ZJRk9fX0JVRl9FT0ZfX0JNU0sgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9NTkdSX0JVRl9JRF9GSUZPX19CVUZfRU9GX19TSEZUICAgICAgICAgICAgICAzCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfTU5HUl9CVUZfSURfRklGT19fQlVGX1NPRl9fQk1TSyAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX01OR1JfQlVGX0lEX0ZJRk9fX0JVRl9TT0ZfX1NIRlQgICAgICAgICAgICAgIDIKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBSVERNQV9KUEVHX1JEX0JVRl9ZX1BOVFIgICAgICAgICAgICAgICAgICAgICAgICBSVERNQV9KUEVHX1JEX0JVRl9ZX1BOVFIKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9ZX1BOVFJfQUREUiAgLyogUlcgKi8gICAoSlBFR0RfQkFTRSsweDAwMDAwMTBDKQotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX1lfUE5UUl9fUE9SICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9ZX1BOVFJfX1JNU0sgICAgICAgICAgICAweEZGRkZGRkY4Ci0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfWV9QTlRSX19TSEZUICAgICAgICAgICAgICAgICAgICAgMwotCi0vKiBSZWdpc3RlciBFbGVtZW50IE1JTiBhbmQgTUFYKi8KLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9ZX1BOVFJfX19TICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfWV9QTlRSX19fUyAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX1lfUE5UUl9fX1MgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9ZX1BOVFJfX19TICAgICAgICAgICAgICAgICAgICAgICAzCi0KLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX1lfUE5UUl9fUE5UUl9fQk1TSyAgICAgIDB4RkZGRkZGRjgKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9ZX1BOVFJfX1BOVFJfX1NIRlQgICAgICAgICAgICAgICAzCi0KLS8qIFJlZ2lzdGVyIEFERFIsIFJNU0ssIGFuZCBTSEZUKi8KLSNkZWZpbmUgUlRETUFfSlBFR19SRF9CVUZfVV9QTlRSICAgICAgICAgICAgICAgICAgICAgUlRETUFfSlBFR19SRF9CVUZfVV9QTlRSCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfVV9QTlRSX0FERFIgIC8qIFJXICovIChKUEVHRF9CQVNFKzB4MDAwMDAxMTApCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfVV9QTlRSX19QT1IgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9VX1BOVFJfX1JNU0sgICAgICAgICAgMHhGRkZGRkZGOAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX1VfUE5UUl9fU0hGVCAgICAgICAgICAgICAgICAgICAzCi0KLS8qIFJlZ2lzdGVyIEVsZW1lbnQgTUlOIGFuZCBNQVgqLwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX1VfUE5UUl9fX1MgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfVV9QTlRSX19fUyAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9VX1BOVFJfX19TICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX1VfUE5UUl9fX1MgICAgICAgICAgICAgICAgICAgICAzCi0KLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX1VfUE5UUl9fUE5UUl9fQk1TSyAgICAgICAgMHhGRkZGRkZGOAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX1VfUE5UUl9fUE5UUl9fU0hGVCAgICAgICAgICAgICAgIDMKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBSVERNQV9KUEVHX1JEX0JVRl9WX1BOVFIgICAgICAgICAgICAgICAgICAgICBSVERNQV9KUEVHX1JEX0JVRl9WX1BOVFIKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9WX1BOVFJfQUREUiAgLyogUlcgKi8gICAgKEpQRUdEX0JBU0UrMHgwMDAwMDExNCkKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9WX1BOVFJfX1BPUiAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX1ZfUE5UUl9fUk1TSyAgICAgICAgICAgICAweEZGRkZGRkY4Ci0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfVl9QTlRSX19TSEZUICAgICAgICAgICAgICAgICAgICAgIDMKLQotLyogUmVnaXN0ZXIgRWxlbWVudCBNSU4gYW5kIE1BWCovCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfVl9QTlRSX19fUyAgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9WX1BOVFJfX19TICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX1ZfUE5UUl9fX1MgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfVl9QTlRSX19fUyAgICAgICAgICAgICAgICAgICAgICAgIDMKLQotLyogUmVnaXN0ZXIgRmllbGQgRk1TSyBhbmQgU0hGVCovCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfVl9QTlRSX19QTlRSX19CTVNLICAgICAgIDB4RkZGRkZGRjgKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9WX1BOVFJfX1BOVFJfX1NIRlQgICAgICAgICAgICAgICAgMwotCi0vKiBSZWdpc3RlciBBRERSLCBSTVNLLCBhbmQgU0hGVCovCi0jZGVmaW5lIFJURE1BX0pQRUdfUkRfQlVGX1BJVENIICAgICAgICAgICAgICAgICAgICAgICBSVERNQV9KUEVHX1JEX0JVRl9QSVRDSAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX1BJVENIX0FERFIgIC8qIFJXICovICAgIChKUEVHRF9CQVNFKzB4MDAwMDAxMTgpCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfUElUQ0hfX1BPUiAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX1BJVENIX19STVNLICAgICAgICAgICAgIDB4MDAwMDNGRjgKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9QSVRDSF9fU0hGVCAgICAgICAgICAgICAgICAgICAgICAzCi0KLS8qIFJlZ2lzdGVyIEVsZW1lbnQgTUlOIGFuZCBNQVgqLwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX1BJVENIX19fUyAgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRl9QSVRDSF9fX1MgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfUElUQ0hfX19TICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX1BJVENIX19fUyAgICAgICAgICAgICAgICAgICAgICAgIDMKLQotLyogUmVnaXN0ZXIgRmllbGQgRk1TSyBhbmQgU0hGVCovCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZfUElUQ0hfX1BJVENIX19CTVNLICAgICAgICAgICAgMHgwMDAwM0ZGOAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGX1BJVENIX19QSVRDSF9fU0hGVCAgICAgICAgICAgICAgICAgICAgIDMKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBSVERNQV9KUEVHX1JEX1BMQU5FX1NJWkUgICAgICAgICAgICAgICAgICAgICBSVERNQV9KUEVHX1JEX1BMQU5FX1NJWkUKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX1BMQU5FX1NJWkVfQUREUiAgLyogUlcgKi8gIChKUEVHRF9CQVNFKzB4MDAwMDAxMUMpCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9QTEFORV9TSVpFX19QT1IgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9QTEFORV9TSVpFX19STVNLICAgICAgICAgICAgMHgxRkZGMUZGRgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfUExBTkVfU0laRV9fU0hGVCAgICAgICAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgRmllbGQgRk1TSyBhbmQgU0hGVCovCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9QTEFORV9TSVpFX19QTEFORV9WU0laRV9fQk1TSyAgICAgICAgIDB4MUZGRjAwMDAKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX1BMQU5FX1NJWkVfX1BMQU5FX1ZTSVpFX19TSEZUICAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfUExBTkVfU0laRV9fUExBTkVfSFNJWkVfX0JNU0sgICAgICAgICAweDAwMDAxRkZGCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9QTEFORV9TSVpFX19QTEFORV9IU0laRV9fU0hGVCAgICAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBSVERNQV9KUEVHX1JEX0JMT0NLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgIFJURE1BX0pQRUdfUkRfQkxPQ0tfU0laRQotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQkxPQ0tfU0laRV9BRERSICAvKiBSVyAqLyAgICAoSlBFR0RfQkFTRSsweDAwMDAwMTIwKQotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQkxPQ0tfU0laRV9fUE9SICAgICAgICAgICAgICAweDAwMDAwM0NGCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CTE9DS19TSVpFX19STVNLICAgICAgICAgICAgIDB4MDAwMDBGRkYKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JMT0NLX1NJWkVfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKiBSZWdpc3RlciBGaWVsZCBGTVNLIGFuZCBTSEZUKi8KLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JMT0NLX1NJWkVfX0JMT0NLX1ZTSVpFX19CTVNLICAgICAgIDB4MDAwMDBGQzAKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JMT0NLX1NJWkVfX0JMT0NLX1ZTSVpFX19TSEZUICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JMT0NLX1NJWkVfX0JMT0NLX0hTSVpFX19CTVNLICAgICAgIDB4MDAwMDAwM0YKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JMT0NLX1NJWkVfX0JMT0NLX0hTSVpFX19TSEZUICAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBSVERNQV9KUEVHX1JEX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgUlRETUFfSlBFR19SRF9CVUZGRVJfU0laRQotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGRkVSX1NJWkVfQUREUiAgKEpQRUdEX0JBU0UrMHgwMDAwMDEyNCkKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX0JVRkZFUl9TSVpFX19QT1IgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZGRVJfU0laRV9fUk1TSyAgICAgICAgICAgICAgMHgwMDAwMUZGRgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGRkVSX1NJWkVfX1NIRlQgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgRmllbGQgRk1TSyBhbmQgU0hGVCovCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9CVUZGRVJfU0laRV9fQlVGRkVSX1ZTSVpFX19CTVNLICAgICAgMHgwMDAwMUZGRgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfQlVGRkVSX1NJWkVfX0JVRkZFUl9WU0laRV9fU0hGVCAgICAgICAgICAgICAgICAwCi0KLS8qIFJlZ2lzdGVyIEFERFIsIFJNU0ssIGFuZCBTSEZUKi8KLSNkZWZpbmUgUlRETUFfSlBFR19SRF9TVEFfQUNLICAgICAgICAgICAgICAgICAgICAgUlRETUFfSlBFR19SRF9TVEFfQUNLCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9TVEFfQUNLX0FERFIgICAgICAgICAoSlBFR0RfQkFTRSsweDAwMDAwMTI4KQotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfU1RBX0FDS19fUE9SICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfU1RBX0FDS19fUk1TSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfU1RBX0FDS19fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKiBSZWdpc3RlciBGaWVsZCBGTVNLIGFuZCBTSEZUKi8KLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX1NUQV9BQ0tfX0VPRl9TVEFfX0JNU0sgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX1NUQV9BQ0tfX0VPRl9TVEFfX1NIRlQgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX1NUQV9BQ0tfX1NPRl9TVEFfX0JNU0sgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX1NUQV9BQ0tfX1NPRl9TVEFfX1NIRlQgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX1NUQV9BQ0tfX0VPRl9BQ0tfX0JNU0sgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX1NUQV9BQ0tfX0VPRl9BQ0tfX1NIRlQgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX1NUQV9BQ0tfX1NPRl9BQ0tfX0JNU0sgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSFdJT19SVERNQV9KUEVHX1JEX1NUQV9BQ0tfX1NPRl9BQ0tfX1NIRlQgICAgICAgICAgICAgICAgICAgIDAKLQotLyogUmVnaXN0ZXIgQUREUiwgUk1TSywgYW5kIFNIRlQqLwotI2RlZmluZSBSVERNQV9KUEVHX1JEX0lOVF9FTiAgICAgICAgICAgICAgICAgICAgICBSVERNQV9KUEVHX1JEX0lOVF9FTgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfSU5UX0VOX0FERFIgIC8qIFcgKi8gICAgICAgIChKUEVHRF9CQVNFKzB4MDAwMDAxMkMpCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9JTlRfRU5fX1BPUiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9JTlRfRU5fX1JNU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCi0jZGVmaW5lIEhXSU9fUlRETUFfSlBFR19SRF9JTlRfRU5fX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qIFJlZ2lzdGVyIEZpZWxkIEZNU0sgYW5kIFNIRlQqLwotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfSU5UX0VOX19FT0ZfRU5fX0JNU0sgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfSU5UX0VOX19FT0ZfRU5fX1NIRlQgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfSU5UX0VOX19TT0ZfRU5fX0JNU0sgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBIV0lPX1JURE1BX0pQRUdfUkRfSU5UX0VOX19TT0ZfRU5fX1NIRlQgICAgICAgICAgICAgICAgICAgICAgMAotCi0jZW5kaWYgLyogTVNNX01FUkNVUllfSFdfUkVHX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X21hY3Jvcy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21lcmN1cnkvbXNtX21lcmN1cnlfbWFjcm9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYjA3Y2QuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21lcmN1cnkvbXNtX21lcmN1cnlfbWFjcm9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgTVNNX01FUkNVUllfTUFDUk9TX0gKLSNkZWZpbmUgTVNNX01FUkNVUllfTUFDUk9TX0gKLQotI2luY2x1ZGUgPG1lZGlhL21zbV9tZXJjdXJ5Lmg+Ci0KLSNkZWZpbmUgbWVyY3VyeV9rcmVhZChyZWcpIFwKLQlod19jbWQudHlwZSA9IE1TTV9NRVJDVVJZX0hXX0NNRF9UWVBFX1JFQUQ7IFwKLQlod19jbWQubiA9IDE7IFwKLQlod19jbWQub2Zmc2V0ID0gSFdJT18jI3JlZyMjX0FERFI7IFwKLQlod19jbWQubWFzayA9IEhXSU9fIyNyZWcjI19fUk1TSzsgXAotCWh3X2NtZC5kYXRhID0gMHgwOyBcCi0JbXNtX21lcmN1cnlfaHdfZXhlY19jbWRzKCZod19jbWQsIDEpOwotCi0jZGVmaW5lIG1lcmN1cnlfa3dyaXRlKHJlZywgdmFsKSBcCi0JaHdfY21kLm9mZnNldCA9IEhXSU9fIyNyZWcjI19BRERSOyBcCi0JaHdfY21kLm1hc2sgPSBIV0lPXyMjcmVnIyNfX1JNU0s7IFwKLQlod19jbWQudHlwZSA9IE1TTV9NRVJDVVJZX0hXX0NNRF9UWVBFX1dSSVRFOyBcCi0JaHdfY21kLm4gPSAxOyBcCi0JaHdfY21kLmRhdGEgPSB2YWw7IFwKLQltc21fbWVyY3VyeV9od19leGVjX2NtZHMoJmh3X2NtZCwgMSk7Ci0KLSNkZWZpbmUgR0VUX0ZWQUwodmFsLCByZWcsIGZpZWxkKSAoKHZhbCAmIEhXSU9fRk1TSyhyZWcsIGZpZWxkKSkgPj4gXAotCUhXSU9fU0hGVChyZWcsIGZpZWxkKSkKLQotI2RlZmluZSBieXRlIHVuc2lnbmVkIGNoYXIKLSNkZWZpbmUgd29yZCB1bnNpZ25lZCBzaG9ydAotI2RlZmluZSBkd29yZCB1bnNpZ25lZCBsb25nCi0KLSNkZWZpbmUgaW5wKHBvcnQpICAgICgqKChkd29yZCAqKSAocG9ydCkpKQotI2RlZmluZSBpbnBiKHBvcnQpICAgICAoKigoYnl0ZSAqKSAocG9ydCkpKQotI2RlZmluZSBpbnB3KHBvcnQpICAgKCooKHdvcmQgKikgKHBvcnQpKSkKLSNkZWZpbmUgaW5wZHcocG9ydCkgICAoKigoZHdvcmQgKikocG9ydCkpKQotCi0jZGVmaW5lIG91dHAocG9ydCwgdmFsKSAgICgqKChkd29yZCAqKSAocG9ydCkpID0gKChkd29yZCkgKHZhbCkpKQotI2RlZmluZSBvdXRwYihwb3J0LCB2YWwpICAgKCooKGJ5dGUgKikgKHBvcnQpKSA9ICgoYnl0ZSkgKHZhbCkpKQotI2RlZmluZSBvdXRwdyhwb3J0LCB2YWwpICAoKigod29yZCAqKSAocG9ydCkpID0gKCh3b3JkKSAodmFsKSkpCi0jZGVmaW5lIG91dHBkdyhwb3J0LCB2YWwpICgqKChkd29yZCAqKSAocG9ydCkpID0gKChkd29yZCkgKHZhbCkpKQotCi0KLSNkZWZpbmUgaW5fYnl0ZShhZGRyKQkJCQkoaW5wKGFkZHIpKQotI2RlZmluZSBpbl9ieXRlX21hc2tlZChhZGRyLCBtYXNrKQkoaW5wKGFkZHIpICYgKGJ5dGUpbWFzaykKLSNkZWZpbmUgb3V0X2J5dGUoYWRkciwgdmFsKQkJCSBvdXRwKGFkZHIsIHZhbCkKLSNkZWZpbmUgaW5fd29yZChhZGRyKQkJCQkoaW5wdyhhZGRyKSkKLSNkZWZpbmUgaW5fd29yZF9tYXNrZWQoYWRkciwgbWFzaykJKGlucHcoYWRkcikgJiAod29yZCltYXNrKQotI2RlZmluZSBvdXRfd29yZChhZGRyLCB2YWwpCQkJIG91dHB3KGFkZHIsIHZhbCkKLSNkZWZpbmUgaW5fZHdvcmQoYWRkcikJCQkJKGlucGR3KGFkZHIpKQotI2RlZmluZSBpbl9kd29yZF9tYXNrZWQoYWRkciwgbWFzaykJKGlucGR3KGFkZHIpICYgbWFzaykKLSNkZWZpbmUgb3V0X2R3b3JkKGFkZHIsIHZhbCkJCQkgb3V0cGR3KGFkZHIsIHZhbCkKLQotLyogc2hhZG93ZWQsIG1hc2tlZCBvdXRwdXQgZm9yIHdyaXRlLW9ubHkgcmVnaXN0ZXJzICovCi0jZGVmaW5lIG91dF9ieXRlX21hc2tlZChpbywgbWFzaywgdmFsLCBzaGFkb3cpICBcCi0JZG8geyBcCi0JCXNoYWRvdyA9IChzaGFkb3cgJiAod29yZCkofihtYXNrKSkpIHwgXAotCQkoKHdvcmQpKCh2YWwpICYgKG1hc2spKSk7IFwKLQkJKHZvaWQpIG91dF9ieXRlKGlvLCBzaGFkb3cpO1wKLQl9IHdoaWxlICgwKTsKLQotI2RlZmluZSBvdXRfd29yZF9tYXNrZWQoaW8sIG1hc2ssIHZhbCwgc2hhZG93KSAgXAotCWRvIHsgXAotCQlzaGFkb3cgPSAoc2hhZG93ICYgKHdvcmQpKH4obWFzaykpKSB8IFwKLQkJKCh3b3JkKSgodmFsKSAmIChtYXNrKSkpOyBcCi0JCSh2b2lkKSBvdXRfd29yZChpbywgc2hhZG93KTsgXAotCX0gd2hpbGUgKDApOwotCi0jZGVmaW5lIG91dF9kd29yZF9tYXNrZWQoaW8sIG1hc2ssIHZhbCwgc2hhZG93KSAgXAotCWRvIHsgXAotCQlzaGFkb3cgPSAoc2hhZG93ICYgKGR3b3JkKSh+KG1hc2spKSkgfCBcCi0JCSgoZHdvcmQpKCh2YWwpICYgKG1hc2spKSk7IFwKLQkJKHZvaWQpIG91dF9kd29yZChpbywgc2hhZG93KTtcCi0JfSB3aGlsZSAoMCk7Ci0KLSNkZWZpbmUgb3V0X2J5dGVfbWFza2VkX25zKGlvLCBtYXNrLCB2YWwsIGN1cnJlbnRfcmVnX2NvbnRlbnQpICBcCi0JKHZvaWQpIG91dF9ieXRlKGlvLCAoKGN1cnJlbnRfcmVnX2NvbnRlbnQgJiBcCi0JKHdvcmQpKH4obWFzaykpKSB8ICgod29yZCkoKHZhbCkgJiAobWFzaykpKSkpCi0KLSNkZWZpbmUgb3V0X3dvcmRfbWFza2VkX25zKGlvLCBtYXNrLCB2YWwsIGN1cnJlbnRfcmVnX2NvbnRlbnQpICBcCi0JKHZvaWQpIG91dF93b3JkKGlvLCAoKGN1cnJlbnRfcmVnX2NvbnRlbnQgJiBcCi0JKHdvcmQpKH4obWFzaykpKSB8ICgod29yZCkoKHZhbCkgJiAobWFzaykpKSkpCi0KLSNkZWZpbmUgb3V0X2R3b3JkX21hc2tlZF9ucyhpbywgbWFzaywgdmFsLCBjdXJyZW50X3JlZ19jb250ZW50KSBcCi0JKHZvaWQpIG91dF9kd29yZChpbywgKChjdXJyZW50X3JlZ19jb250ZW50ICYgXAotCShkd29yZCkofihtYXNrKSkpIHwgKChkd29yZCkoKHZhbCkgJiAobWFzaykpKSkpCi0KLSNkZWZpbmUgTUVNX0lORih2YWwsIHJlZywgZmllbGQpCSgodmFsICYgSFdJT19GTVNLKHJlZywgZmllbGQpKSA+PiBcCi0JSFdJT19TSEZUKHJlZywgZmllbGQpKQotCi0jZGVmaW5lIE1FTV9PVVRGKG1lbSwgcmVnLCBmaWVsZCwgdmFsKVwKLQlvdXRfZHdvcmRfbWFza2VkX25zKG1lbSwgSFdJT19GTVNLKHJlZywgZmllbGQpLCBcCi0JKHVuc2lnbmVkICBpbnQpdmFsPDxIV0lPX1NIRlQocmVnLCBmaWVsZCksIGluX2R3b3JkKG1lbSkpCi0KLSNkZWZpbmUgTUVNX09VVEYyKG1lbSwgcmVnLCBmaWVsZDIsIGZpZWxkMSwgdmFsMiwgdmFsMSkgIFwKLQlvdXRfZHdvcmRfbWFza2VkX25zKG1lbSwgKEhXSU9fRk1TSyhyZWcsIGZpZWxkMil8IFwKLQlIV0lPX0ZNU0socmVnLCBmaWVsZDEpKSwgXAotCSgoKHVuc2lnbmVkIGludCl2YWwyPDxIV0lPX1NIRlQocmVnLCBmaWVsZDIpKXwgXAotCSgodW5zaWduZWQgaW50KXZhbDE8PEhXSU9fU0hGVChyZWcsIGZpZWxkMSkpKSwgaW5fZHdvcmQobWVtKSkKLQotI2RlZmluZSBNRU1fT1VURjMobWVtLCByZWcsIGZsZDMsIGZsZDIsIGZsZDEsIHZhbDMsIHZhbDIsIHZhbDEpICBcCi0Jb3V0X2R3b3JkX21hc2tlZF9ucyhtZW0sIChIV0lPX0ZNU0socmVnLCBmbGQzKXwgXAotCUhXSU9fRk1TSyhyZWcsIGZsZDIpfEhXSU9fRk1TSyhyZWcsIGZsZDEpKSwgXAotCSgoKHVuc2lnbmVkIGludCl2YWwzPDxIV0lPX1NIRlQocmVnLCBmbGQzKSl8IFwKLQkoKHVuc2lnbmVkIGludCl2YWwyPDxIV0lPX1NIRlQocmVnLCBmbGQyKSl8IFwKLQkoKHVuc2lnbmVkIGludCl2YWwxPDxIV0lPX1NIRlQocmVnLCBmbGQxKSkpLCBpbl9kd29yZChtZW0pKQotCi0jZGVmaW5lIEhXSU9fRk1TSyhyZWcsIGZpZWxkKSAgIEhXSU9fIyNyZWcjI19fIyNmaWVsZCMjX19CTVNLCi0jZGVmaW5lIEhXSU9fU0hGVChyZWcsIGZpZWxkKSAgIEhXSU9fIyNyZWcjI19fIyNmaWVsZCMjX19TSEZUCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X3BsYXRmb3JtLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbWVyY3VyeS9tc21fbWVyY3VyeV9wbGF0Zm9ybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGEzNmQ5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X3BsYXRmb3JtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8bWFjaC9jbGsuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotCi0jaW5jbHVkZSAibXNtX21lcmN1cnlfcGxhdGZvcm0uaCIKLSNpbmNsdWRlICJtc21fbWVyY3VyeV9zeW5jLmgiCi0jaW5jbHVkZSAibXNtX21lcmN1cnlfY29tbW9uLmgiCi0jaW5jbHVkZSAibXNtX21lcmN1cnlfaHcuaCIKLQotCi1zdHJ1Y3QgaW9uX2NsaWVudCAqbWVyY3VyeV9jbGllbnQ7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbV9jbGtfaW5mbyBtZXJjdXJ5X2pwZWdkX2Nsa19pbmZvW10gPSB7Ci0JeyJjb3JlX2NsayIsIDIwMDAwMDAwMH0sCi0JeyJpZmFjZV9jbGsiLCAtMX0KLX07Ci0KLXZvaWQgbXNtX21lcmN1cnlfcGxhdGZvcm1fcDJ2KHN0cnVjdCBmaWxlICAqZmlsZSwKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqKmlvbmhhbmRsZSkKLXsKLSNpZmRlZiBDT05GSUdfTVNNX01VTFRJTUVESUFfVVNFX0lPTgotCWlvbl91bm1hcF9pb21tdShtZXJjdXJ5X2NsaWVudCwgKmlvbmhhbmRsZSwgQ0FNRVJBX0RPTUFJTiwKLQkJR0VOX1BPT0wpOwotCWlvbl9mcmVlKG1lcmN1cnlfY2xpZW50LCAqaW9uaGFuZGxlKTsKLQkqaW9uaGFuZGxlID0gTlVMTDsKLSNlbmRpZgotfQotCi11aW50MzJfdCBtc21fbWVyY3VyeV9wbGF0Zm9ybV92MnAoaW50IGZkLCB1aW50MzJfdCBsZW4sCi0Jc3RydWN0IGZpbGUgKipmaWxlX3AsCi0Jc3RydWN0IGlvbl9oYW5kbGUgKippb25oYW5kbGUpCi17Ci0JdW5zaWduZWQgbG9uZyBwYWRkcjsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0JaW50IHJjOwotI2lmZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0JKmlvbmhhbmRsZSA9IGlvbl9pbXBvcnRfZG1hX2J1ZihtZXJjdXJ5X2NsaWVudCwgZmQpOwotCWlmIChJU19FUlJfT1JfTlVMTCgqaW9uaGFuZGxlKSkKLQkJcmV0dXJuIDA7Ci0KLQlyYyA9IGlvbl9tYXBfaW9tbXUobWVyY3VyeV9jbGllbnQsICppb25oYW5kbGUsIENBTUVSQV9ET01BSU4sCi0JCUdFTl9QT09MLCBTWl80SywgMCwgJnBhZGRyLAotCQkodW5zaWduZWQgbG9uZyAqKSZzaXplLCAwLCAwKTsKLQlyYyA9IDA7Ci0JcGFkZHIgPSAwOwotCXNpemUgPSAwOwotI2VuZGlmCi0JaWYgKHJjIDwgMCkgewotCQlNQ1JfUFJfRVJSKCIlczogZ2V0X3BtZW1fZmlsZSBmZCAlZCBlcnJvciAlZFxuIiwgX19mdW5jX18sIGZkLAotCQkJcmMpOwotCQlnb3RvIGVycm9yMTsKLQl9Ci0KLQkvKiB2YWxpZGF0ZSB1c2VyIGlucHV0ICovCi0JaWYgKGxlbiA+IHNpemUpIHsKLQkJTUNSX1BSX0VSUigiJXM6IGludmFsaWQgb2Zmc2V0ICsgbGVuXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyb3IxOwotCX0KLQotCXJldHVybiBwYWRkcjsKLWVycm9yMToKLSNpZmRlZiBDT05GSUdfTVNNX01VTFRJTUVESUFfVVNFX0lPTgotCWlvbl9mcmVlKG1lcmN1cnlfY2xpZW50LCAqaW9uaGFuZGxlKTsKLSNlbmRpZgotCXJldHVybiAwOwotfQotCi1pbnQgbXNtX21lcmN1cnlfcGxhdGZvcm1faW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCXN0cnVjdCByZXNvdXJjZSAqKm1lbSwKLQl2b2lkICoqYmFzZSwKLQlpbnQgKmlycSwKLQlpcnFyZXR1cm5fdCAoKmhhbmRsZXIpIChpbnQsIHZvaWQgKiksCi0Jdm9pZCAqY29udGV4dCkKLXsKLQlpbnQgcmMgPSAwOwotCWludCBtZXJjdXJ5X2lycTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm1lcmN1cnlfbWVtLCAqbWVyY3VyeV9pbywgKm1lcmN1cnlfaXJxX3JlczsKLQl2b2lkICptZXJjdXJ5X2Jhc2U7Ci0Jc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqcG1lcmN1cnlfZGV2ID0KLQkJKHN0cnVjdCBtc21fbWVyY3VyeV9kZXZpY2UgKikgY29udGV4dDsKLQotCU1DUl9EQkcoIiVzOiVkXVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCW1lcmN1cnlfbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIW1lcmN1cnlfbWVtKSB7Ci0JCU1DUl9QUl9FUlIoIiVzOiBubyBtZW0gcmVzb3VyY2U/XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCW1lcmN1cnlfaXJxX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7Ci0JaWYgKCFtZXJjdXJ5X2lycV9yZXMpIHsKLQkJTUNSX1BSX0VSUigibm8gaXJxIHJlc291cmNlP1xuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQltZXJjdXJ5X2lycSA9IG1lcmN1cnlfaXJxX3Jlcy0+c3RhcnQ7Ci0KLQltZXJjdXJ5X2lvID0gcmVxdWVzdF9tZW1fcmVnaW9uKG1lcmN1cnlfbWVtLT5zdGFydCwKLQkJcmVzb3VyY2Vfc2l6ZShtZXJjdXJ5X21lbSksIHBkZXYtPm5hbWUpOwotCWlmICghbWVyY3VyeV9pbykgewotCQlNQ1JfUFJfRVJSKCIlczogcmVnaW9uIGFscmVhZHkgY2xhaW1lZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQlNQ1JfREJHKCIlczolZF1cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JbWVyY3VyeV9iYXNlID0gaW9yZW1hcChtZXJjdXJ5X21lbS0+c3RhcnQsCi0JCXJlc291cmNlX3NpemUobWVyY3VyeV9tZW0pKTsKLQlpZiAoIW1lcmN1cnlfYmFzZSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCU1DUl9QUl9FUlIoIiVzOiBpb3JlbWFwIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGZhaWwxOwotCX0KLQlNQ1JfREJHKCIlczolZF1cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0KLQlyYyA9IG1zbV9jYW1fY2xrX2VuYWJsZSgmcG1lcmN1cnlfZGV2LT5wZGV2LT5kZXYsCi0JCW1lcmN1cnlfanBlZ2RfY2xrX2luZm8sIHBtZXJjdXJ5X2Rldi0+bWVyY3VyeV9jbGssCi0JCUFSUkFZX1NJWkUobWVyY3VyeV9qcGVnZF9jbGtfaW5mbyksIDEpOwotCWlmIChyYyA8IDApCi0JCU1DUl9QUl9FUlIoIiVzOiVkXSByYyA9ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJjKTsKLQotCU1DUl9EQkcoIiVzOiVkXVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQltc21fbWVyY3VyeV9od19pbml0KG1lcmN1cnlfYmFzZSwgcmVzb3VyY2Vfc2l6ZShtZXJjdXJ5X21lbSkpOwotCXJjID0gcmVxdWVzdF9pcnEobWVyY3VyeV9pcnEsIGhhbmRsZXIsIElSUUZfVFJJR0dFUl9SSVNJTkcsCi0JCSJtZXJjdXJ5IiwgY29udGV4dCk7Ci0JaWYgKHJjKSB7Ci0JCU1DUl9QUl9FUlIoIiVzOiByZXF1ZXN0X2lycSBmYWlsZWQsICVkXG4iLCBfX2Z1bmNfXywKLQkJCW1lcmN1cnlfaXJxKTsKLQkJZ290byBmYWlsMzsKLQl9Ci0JTUNSX0RCRygiJXM6JWRdXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCSptZW0gID0gbWVyY3VyeV9tZW07Ci0JKmJhc2UgPSBtZXJjdXJ5X2Jhc2U7Ci0JKmlycSAgPSBtZXJjdXJ5X2lycTsKLQlNQ1JfREJHKCIlczolZF1cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0jaWZkZWYgQ09ORklHX01TTV9NVUxUSU1FRElBX1VTRV9JT04KLQltZXJjdXJ5X2NsaWVudCA9IG1zbV9pb25fY2xpZW50X2NyZWF0ZSgtMSwgImNhbWVyYS9tZXJjdXJ5Iik7Ci0jZW5kaWYKLQlNQ1JfUFJfRVJSKCIlczolZF0gc3VjY2Vzc1xuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlyZXR1cm4gcmM7Ci1mYWlsMzoKLQlNQ1JfREJHKCIlczolZF1cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JbXNtX2NhbV9jbGtfZW5hYmxlKCZwbWVyY3VyeV9kZXYtPnBkZXYtPmRldiwgbWVyY3VyeV9qcGVnZF9jbGtfaW5mbywKLQkJcG1lcmN1cnlfZGV2LT5tZXJjdXJ5X2NsaywKLQkJQVJSQVlfU0laRShtZXJjdXJ5X2pwZWdkX2Nsa19pbmZvKSwgMCk7Ci0JTUNSX0RCRygiJXM6JWRdXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCWlvdW5tYXAobWVyY3VyeV9iYXNlKTsKLWZhaWwxOgotCU1DUl9EQkcoIiVzOiVkXVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlyZWxlYXNlX21lbV9yZWdpb24obWVyY3VyeV9tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lcmN1cnlfbWVtKSk7Ci0JTUNSX0RCRygiJXM6JWRdXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9tZXJjdXJ5X3BsYXRmb3JtX3JlbGVhc2Uoc3RydWN0IHJlc291cmNlICptZW0sIHZvaWQgKmJhc2UsCi0JaW50IGlycSwgdm9pZCAqY29udGV4dCkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgbXNtX21lcmN1cnlfZGV2aWNlICpwbWVyY3VyeV9kZXYgPQotCQkoc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqKSBjb250ZXh0OwotCi0JZnJlZV9pcnEoaXJxLCBjb250ZXh0KTsKLQltc21fY2FtX2Nsa19lbmFibGUoJnBtZXJjdXJ5X2Rldi0+cGRldi0+ZGV2LCBtZXJjdXJ5X2pwZWdkX2Nsa19pbmZvLAotCQlwbWVyY3VyeV9kZXYtPm1lcmN1cnlfY2xrLCBBUlJBWV9TSVpFKG1lcmN1cnlfanBlZ2RfY2xrX2luZm8pLAotCQkwKTsKLQlpb3VubWFwKGJhc2UpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOwotI2lmZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0JaW9uX2NsaWVudF9kZXN0cm95KG1lcmN1cnlfY2xpZW50KTsKLSNlbmRpZgotCU1DUl9EQkcoIiVzOiVkXSBzdWNjZXNzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X3BsYXRmb3JtLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbWVyY3VyeS9tc21fbWVyY3VyeV9wbGF0Zm9ybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmRlYTNjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X3BsYXRmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBNU01fTUVSQ1VSWV9QTEFURk9STV9ICi0jZGVmaW5lIE1TTV9NRVJDVVJZX1BMQVRGT1JNX0gKLQotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KLQotaW50IG1zbV9tZXJjdXJ5X3BsYXRmb3JtX2Nsa19lbmFibGUodm9pZCk7Ci1pbnQgbXNtX21lcmN1cnlfcGxhdGZvcm1fY2xrX2Rpc2FibGUodm9pZCk7Ci0KLXZvaWQgbXNtX21lcmN1cnlfcGxhdGZvcm1fcDJ2KHN0cnVjdCBmaWxlICAqZmlsZSwKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqKmlvbmhhbmRsZSk7Ci0KLXVpbnQzMl90IG1zbV9tZXJjdXJ5X3BsYXRmb3JtX3YycChpbnQgZmQsIHVpbnQzMl90IGxlbiwgc3RydWN0IGZpbGUgKipmaWxlLAotCXN0cnVjdCBpb25faGFuZGxlICoqaW9uaGFuZGxlKTsKLQotaW50IG1zbV9tZXJjdXJ5X3BsYXRmb3JtX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQlzdHJ1Y3QgcmVzb3VyY2UgKiptZW0sCi0Jdm9pZCAqKmJhc2UsCi0JaW50ICppcnEsCi0JaXJxcmV0dXJuX3QgKCpoYW5kbGVyKSAoaW50LCB2b2lkICopLAotCXZvaWQgKmNvbnRleHQpOwotCi1pbnQgbXNtX21lcmN1cnlfcGxhdGZvcm1fcmVsZWFzZShzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwgdm9pZCAqYmFzZSwgaW50IGlycSwKLQl2b2lkICpjb250ZXh0KTsKLQotI2VuZGlmIC8qIE1TTV9NRVJDVVJZX1BMQVRGT1JNX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X3N5bmMuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X3N5bmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0ODNjMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbWVyY3VyeS9tc21fbWVyY3VyeV9zeW5jLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX21lcmN1cnkuaD4KLQotI2luY2x1ZGUgIm1zbV9tZXJjdXJ5X3N5bmMuaCIKLSNpbmNsdWRlICJtc21fbWVyY3VyeV9jb3JlLmgiCi0jaW5jbHVkZSAibXNtX21lcmN1cnlfcGxhdGZvcm0uaCIKLSNpbmNsdWRlICJtc21fbWVyY3VyeV9jb21tb24uaCIKLSNpbmNsdWRlICJtc21fbWVyY3VyeV9tYWNyb3MuaCIKLSNpbmNsdWRlICJtc21fbWVyY3VyeV9od19yZWcuaCIKLQotc3RhdGljIHN0cnVjdCBtc21fbWVyY3VyeV9jb3JlX2J1ZiBvdXRfYnVmX2xvY2FsOwotc3RhdGljIHN0cnVjdCBtc21fbWVyY3VyeV9jb3JlX2J1ZiBpbl9idWZfbG9jYWw7Ci0KLS8qKioqKioqKioqKioqKiogcXVldWUgaGVscGVyICoqKioqKioqKioqKioqKiovCi1pbmxpbmUgdm9pZCBtc21fbWVyY3VyeV9xX2luaXQoY2hhciBjb25zdCAqbmFtZSwgc3RydWN0IG1zbV9tZXJjdXJ5X3EgKnFfcCkKLXsKLQlNQ1JfREJHKCIlczolZF0gJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbmFtZSk7Ci0JcV9wLT5uYW1lID0gbmFtZTsKLQlzcGluX2xvY2tfaW5pdCgmcV9wLT5sY2spOwotCUlOSVRfTElTVF9IRUFEKCZxX3AtPnEpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnFfcC0+d2FpdCk7Ci0JcV9wLT51bmJsY2sgPSAwOwotfQotCi1pbmxpbmUgdm9pZCAqbXNtX21lcmN1cnlfcV9vdXQoc3RydWN0IG1zbV9tZXJjdXJ5X3EgKnFfcCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBtc21fbWVyY3VyeV9xX2VudHJ5ICpxX2VudHJ5X3AgPSBOVUxMOwotCXZvaWQgKmRhdGEgPSBOVUxMOwotCi0JTUNSX0RCRygiKCVkKSVzKCkgICVzXG4iLCBfX0xJTkVfXywgX19mdW5jX18sIHFfcC0+bmFtZSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnFfcC0+bGNrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZxX3AtPnEpKSB7Ci0JCXFfZW50cnlfcCA9IGxpc3RfZmlyc3RfZW50cnkoJnFfcC0+cSwKLQkJCXN0cnVjdCBtc21fbWVyY3VyeV9xX2VudHJ5LAotCQkJbGlzdCk7Ci0JCWxpc3RfZGVsX2luaXQoJnFfZW50cnlfcC0+bGlzdCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFfcC0+bGNrLCBmbGFncyk7Ci0KLQlpZiAocV9lbnRyeV9wKSB7Ci0JCWRhdGEgPSBxX2VudHJ5X3AtPmRhdGE7Ci0JCWtmcmVlKHFfZW50cnlfcCk7Ci0JfSBlbHNlIHsKLQkJTUNSX0RCRygiJXM6JWRdICVzIG5vIGVudHJ5XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHFfcC0+bmFtZSk7Ci0JfQotCi0JcmV0dXJuIGRhdGE7Ci19Ci0KLWlubGluZSBpbnQgbXNtX21lcmN1cnlfcV9pbihzdHJ1Y3QgbXNtX21lcmN1cnlfcSAqcV9wLCB2b2lkICpkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzdHJ1Y3QgbXNtX21lcmN1cnlfcV9lbnRyeSAqcV9lbnRyeV9wOwotCi0JTUNSX0RCRygiJXM6JWRdICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHFfcC0+bmFtZSk7Ci0KLQlxX2VudHJ5X3AgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX21lcmN1cnlfcV9lbnRyeSksIEdGUF9BVE9NSUMpOwotCWlmICghcV9lbnRyeV9wKSB7Ci0JCU1DUl9QUl9FUlIoIiVzOiBubyBtZW1cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCXFfZW50cnlfcC0+ZGF0YSA9IGRhdGE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcV9wLT5sY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZxX2VudHJ5X3AtPmxpc3QsICZxX3AtPnEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFfcC0+bGNrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW5saW5lIGludCBtc21fbWVyY3VyeV9xX2luX2J1ZihzdHJ1Y3QgbXNtX21lcmN1cnlfcSAqcV9wLAotCXN0cnVjdCBtc21fbWVyY3VyeV9jb3JlX2J1ZiAqYnVmKQotewotCXN0cnVjdCBtc21fbWVyY3VyeV9jb3JlX2J1ZiAqYnVmX3A7Ci0KLQlNQ1JfREJHKCIlczolZF1cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JYnVmX3AgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX21lcmN1cnlfY29yZV9idWYpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWJ1Zl9wKSB7Ci0JCU1DUl9QUl9FUlIoIiVzOiBubyBtZW1cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JbWVtY3B5KGJ1Zl9wLCBidWYsIHNpemVvZihzdHJ1Y3QgbXNtX21lcmN1cnlfY29yZV9idWYpKTsKLQotCW1zbV9tZXJjdXJ5X3FfaW4ocV9wLCBidWZfcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWlubGluZSBpbnQgbXNtX21lcmN1cnlfcV93YWl0KHN0cnVjdCBtc21fbWVyY3VyeV9xICpxX3ApCi17Ci0JaW50IHRtID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7IC8qIDUwMG1zICovCi0JaW50IHJjOwotCi0JTUNSX0RCRygiJXM6JWQgJXMgd2FpdFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBxX3AtPm5hbWUpOwotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocV9wLT53YWl0LAotCQkoIWxpc3RfZW1wdHlfY2FyZWZ1bCgmcV9wLT5xKSB8fCBxX3AtPnVuYmxjayksCi0JCW1zZWNzX3RvX2ppZmZpZXModG0pKTsKLQotCU1DUl9EQkcoIiVzOiVkICVzIHdhaXQgZG9uZSAocmM9JWQpXG4iLCBfX2Z1bmNfXywKLQkJX19MSU5FX18sIHFfcC0+bmFtZSwgcmMpOwotCWlmIChsaXN0X2VtcHR5X2NhcmVmdWwoJnFfcC0+cSkpIHsKLQkJaWYgKHJjID09IDApIHsKLQkJCXJjID0gLUVUSU1FRE9VVDsKLQkJCU1DUl9QUl9FUlIoIiVzOiVkXSAlcyB0aW1lb3V0XG4iLCBfX2Z1bmNfXywKLQkJCQlfX0xJTkVfXywgcV9wLT5uYW1lKTsKLQkJfSBlbHNlIGlmIChxX3AtPnVuYmxjaykgewotCQkJTUNSX0RCRygiJXM6JWQgJXMgdW5ibG9jayBpcyB0cnVlIiwgX19mdW5jX18sCi0JCQkJX19MSU5FX18sIHFfcC0+bmFtZSk7Ci0JCQlyYyA9IHFfcC0+dW5ibGNrOwotCQkJcV9wLT51bmJsY2sgPSAwOwotCQl9IGVsc2UgaWYgKHJjIDwgMCkgewotCQkJTUNSX1BSX0VSUigiJXM6JWQgJXMgcmMgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJCQlxX3AtPm5hbWUsIHJjKTsKLQkJfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLWlubGluZSBpbnQgbXNtX21lcmN1cnlfcV93YWtldXAoc3RydWN0IG1zbV9tZXJjdXJ5X3EgKnFfcCkKLXsKLQlNQ1JfREJHKCIlczolZF0gJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcV9wLT5uYW1lKTsKLQl3YWtlX3VwKCZxX3AtPndhaXQpOwotCXJldHVybiAwOwotfQotCi1pbmxpbmUgaW50IG1zbV9tZXJjdXJ5X3Ffd3JfZW9pKHN0cnVjdCBtc21fbWVyY3VyeV9xICpxX3ApCi17Ci0JTUNSX0RCRygiJXM6JWRdIFdha2UgdXAgJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcV9wLT5uYW1lKTsKLQlxX3AtPnVuYmxjayA9IE1TTV9NRVJDVVJZX0VWVF9GUkFNRURPTkU7Ci0Jd2FrZV91cCgmcV9wLT53YWl0KTsKLQlyZXR1cm4gMDsKLX0KLQotaW5saW5lIGludCBtc21fbWVyY3VyeV9xX3dyX2VycihzdHJ1Y3QgbXNtX21lcmN1cnlfcSAqcV9wKQotewotCU1DUl9EQkcoIiVzOiVkXSBXYWtlIHVwICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHFfcC0+bmFtZSk7Ci0JcV9wLT51bmJsY2sgPSBNU01fTUVSQ1VSWV9FVlRfRVJSOwotCXdha2VfdXAoJnFfcC0+d2FpdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWlubGluZSBpbnQgbXNtX21lcmN1cnlfcV91bmJsb2NrKHN0cnVjdCBtc21fbWVyY3VyeV9xICpxX3ApCi17Ci0JTUNSX0RCRygiJXM6JWRdIFdha2UgdXAgJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcV9wLT5uYW1lKTsKLQlxX3AtPnVuYmxjayA9IE1TTV9NRVJDVVJZX0VWVF9VTkJMT0NLOwotCXdha2VfdXAoJnFfcC0+d2FpdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWlubGluZSB2b2lkIG1zbV9tZXJjdXJ5X3FfY2xlYW51cChzdHJ1Y3QgbXNtX21lcmN1cnlfcSAqcV9wKQotewotCXZvaWQgKmRhdGE7Ci0JTUNSX0RCRygiXG4lczolZF0gJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcV9wLT5uYW1lKTsKLQlkbyB7Ci0JCWRhdGEgPSBtc21fbWVyY3VyeV9xX291dChxX3ApOwotCQlpZiAoZGF0YSkgewotCQkJTUNSX0RCRygiJXM6JWRdICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHFfcC0+bmFtZSk7Ci0JCQlrZnJlZShkYXRhKTsKLQkJfQotCX0gd2hpbGUgKGRhdGEpOwotCXFfcC0+dW5ibGNrID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKiBldmVudCBxdWV1ZSAqKioqKioqKioqKioqKioqLwotaW50IG1zbV9tZXJjdXJ5X2ZyYW1lZG9uZV9pcnEoc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqcG1lcmN1cnlfZGV2KQotewotCU1DUl9EQkcoIiVzOiVkXSBFbnRlclxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQltc21fbWVyY3VyeV9xX3VuYmxvY2soJnBtZXJjdXJ5X2Rldi0+ZXZ0X3EpOwotCi0JTUNSX0RCRygiJXM6JWRdIEV4aXRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fbWVyY3VyeV9ldnRfZ2V0KHN0cnVjdCBtc21fbWVyY3VyeV9kZXZpY2UgKnBtZXJjdXJ5X2RldiwKLQl2b2lkIF9fdXNlciAqYXJnKQotewotCXN0cnVjdCBtc21fbWVyY3VyeV9jdHJsX2NtZCBjdHJsX2NtZDsKLQlpbnQgcmMgPSAwOwotCi0JTUNSX0RCRygiKCVkKSVzKCkgRW50ZXJcbiIsIF9fTElORV9fLCBfX2Z1bmNfXyk7Ci0JbWVtc2V0KCZjdHJsX2NtZCwgMCwgc2l6ZW9mKGN0cmxfY21kKSk7Ci0JY3RybF9jbWQudHlwZSA9ICh1aW50MzJfdCltc21fbWVyY3VyeV9xX3dhaXQoJnBtZXJjdXJ5X2Rldi0+ZXZ0X3EpOwotCi0JcmMgPSBjb3B5X3RvX3VzZXIoYXJnLCAmY3RybF9jbWQsIHNpemVvZihjdHJsX2NtZCkpOwotCi0JaWYgKHJjKSB7Ci0JCU1DUl9QUl9FUlIoIiVzOiVkXSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgbXNtX21lcmN1cnlfZXZ0X2dldF91bmJsb2NrKHN0cnVjdCBtc21fbWVyY3VyeV9kZXZpY2UgKnBtZXJjdXJ5X2RldikKLXsKLQlNQ1JfREJHKCItLSglZCklcygpIEVudGVyXG4iLCBfX0xJTkVfXywgX19mdW5jX18pOwotCW1zbV9tZXJjdXJ5X3FfdW5ibG9jaygmcG1lcmN1cnlfZGV2LT5ldnRfcSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fbWVyY3VyeV9vdXRwdXRfYnVmX2NmZyhzdHJ1Y3QgbXNtX21lcmN1cnlfZGV2aWNlICpwbWVyY3VyeV9kZXYsCi0Jdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlzdHJ1Y3QgbXNtX21lcmN1cnlfYnVmIGJ1Zl9jbWQ7Ci0KLQotCU1DUl9EQkcoIiVzOiVkXSBFbnRlclxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1Zl9jbWQsIGFyZywgc2l6ZW9mKHN0cnVjdCBtc21fbWVyY3VyeV9idWYpKSkgewotCQlNQ1JfUFJfRVJSKCIlczolZF0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlvdXRfYnVmX2xvY2FsLnlfYnVmZmVyX2FkZHIgPSBtc21fbWVyY3VyeV9wbGF0Zm9ybV92MnAoYnVmX2NtZC5mZCwKLQkJYnVmX2NtZC55X2xlbiwgJm91dF9idWZfbG9jYWwuZmlsZSwgJm91dF9idWZfbG9jYWwuaGFuZGxlKTsKLQlvdXRfYnVmX2xvY2FsLmNiY3JfYnVmZmVyX2FkZHIgPSBvdXRfYnVmX2xvY2FsLnlfYnVmZmVyX2FkZHIgKwotCQlidWZfY21kLnlfbGVuOwotCi0JaWYgKCFvdXRfYnVmX2xvY2FsLnlfYnVmZmVyX2FkZHIpIHsKLQkJTUNSX1BSX0VSUigiJXM6JWRdIHYycCB3cm9uZ1xuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JbXNtX21lcmN1cnlfaHdfb3V0cHV0X3lfYnVmX2NmZyhvdXRfYnVmX2xvY2FsLnlfYnVmZmVyX2FkZHIpOwotCW1zbV9tZXJjdXJ5X2h3X291dHB1dF91X2J1Zl9jZmcob3V0X2J1Zl9sb2NhbC5jYmNyX2J1ZmZlcl9hZGRyKTsKLQotCU1DUl9EQkcoIiglZCklcygpXG4gIHlfYnVmPTB4JTA4WCwgeV9sZW49MHglMDhYLCB2YWRkcj0weCUwOFhcbiIKLQkJIiAgdV9idWY9MHglMDhYLCB1X2xlbj0weCUwOFhcblxuIiwgX19MSU5FX18sIF9fZnVuY19fLAotCQlvdXRfYnVmX2xvY2FsLnlfYnVmZmVyX2FkZHIsIGJ1Zl9jbWQueV9sZW4sIChpbnQpIGJ1Zl9jbWQudmFkZHIsCi0JCW91dF9idWZfbG9jYWwuY2Jjcl9idWZmZXJfYWRkciwgYnVmX2NtZC5jYmNyX2xlbik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IG1zbV9tZXJjdXJ5X2lucHV0X2J1Zl9jZmcoc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqcG1lcmN1cnlfZGV2LAotCXZvaWQgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IG1zbV9tZXJjdXJ5X2J1ZiBidWZfY21kOwotCi0KLQlNQ1JfREJHKCIlczolZF0gRW50ZXJcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZidWZfY21kLCBhcmcsIHNpemVvZihzdHJ1Y3QgbXNtX21lcmN1cnlfYnVmKSkpIHsKLQkJTUNSX1BSX0VSUigiJXM6JWRdIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaW5fYnVmX2xvY2FsLnlfYnVmZmVyX2FkZHIgPSBtc21fbWVyY3VyeV9wbGF0Zm9ybV92MnAoYnVmX2NtZC5mZCwKLQkJYnVmX2NtZC55X2xlbiwgJmluX2J1Zl9sb2NhbC5maWxlLCAmaW5fYnVmX2xvY2FsLmhhbmRsZSk7Ci0KLQlpZiAoIWluX2J1Zl9sb2NhbC55X2J1ZmZlcl9hZGRyKSB7Ci0JCU1DUl9QUl9FUlIoIiVzOiVkXSB2MnAgd3JvbmdcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCW1zbV9tZXJjdXJ5X2h3X2JpdHN0cmVhbV9idWZfY2ZnKGluX2J1Zl9sb2NhbC55X2J1ZmZlcl9hZGRyKTsKLQotCU1DUl9EQkcoIiglZCklcygpXG4gIGJpdHN0cmVhbV9idWY9MHglMDhYLCBsZW49MHglMDhYLCB2YWRkcj0weCUwOFhcbiIsCi0JCV9fTElORV9fLCBfX2Z1bmNfXywgaW5fYnVmX2xvY2FsLnlfYnVmZmVyX2FkZHIsIGJ1Zl9jbWQueV9sZW4sCi0JCShpbnQpIGJ1Zl9jbWQudmFkZHIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fbWVyY3VyeV9vdXRwdXRfZ2V0KHN0cnVjdCBtc21fbWVyY3VyeV9kZXZpY2UgKnBtZXJjdXJ5X2RldiwKLQl2b2lkIF9fdXNlciAqdG8pCi17Ci0JTUNSX0RCRygiJXM6JWRdIEVudGVyXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCW1zbV9tZXJjdXJ5X3BsYXRmb3JtX3AydihvdXRfYnVmX2xvY2FsLmZpbGUsICZvdXRfYnVmX2xvY2FsLmhhbmRsZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fbWVyY3VyeV9pbnB1dF9nZXQoc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqcG1lcmN1cnlfZGV2LAotCXZvaWQgX191c2VyICp0bykKLXsKLQotCi0JTUNSX0RCRygiJXM6JWRdIEVudGVyXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCW1zbV9tZXJjdXJ5X3BsYXRmb3JtX3Aydihpbl9idWZfbG9jYWwuZmlsZSwgJmluX2J1Zl9sb2NhbC5oYW5kbGUpOwotCXJldHVybiAwOwotfQotCi1pbnQgbXNtX21lcmN1cnlfaW9jdGxfZHVtcF9yZWdzKHZvaWQpCi17Ci0JdWludDMyX3QgbWVyY3VyeV9yZWdzW10gPSB7Ci0JCTB4MDAwMCwgMHgwMDA4LCAweDAwMTAsIDB4MDAxNCwgMHgwMDE4LCAweDAwMUMsIDB4MDAyMCwgMHgwMDI0LAotCQkweDAwMzAsIDB4MDAzNCwgMHgwMDQwLCAweDAwNTAsIDB4MDA1NCwgMHgwMDU4LCAweDAwNUMsIDB4MDA2MCwKLQkJMHgwMDY0LCAweDAwNzAsIDB4MDA4MCwgMHgwMDg0LCAweDAwODgsIDB4MDI1OCwgMHgwMjVDLCAweDAyNjAsCi0JCTB4MDI2NCwgMHgwMjAwLCAweDAyMDQsIDB4MDIwOCwgMHgwMjBDLCAweDAyMTAsIDB4MDIxNCwgMHgwMjE4LAotCQkweDAyMUMsIDB4MDIyMCwgMHgwMjI0LCAweDAyMjgsIDB4MDEwMCwgMHgwMTA0LCAweDAxMEMsIDB4MDExMCwKLQkJMHgwMTE0LCAweDAxMTgsIDB4MDExQywgMHgwMTIwLCAweDAxMjQsIDB4MDEyOCwgMHgwMTJDfTsKLQotCXN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQgaHdfY21kOwotCWludCBsZW4gPSBzaXplb2YobWVyY3VyeV9yZWdzKS80OwotCWludCBpOwotCi0JTUNSX0RCRygiXG4lc1xuICAoJWQpJXMoKVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7Ci0KLQlod19jbWQubWFzayA9IDB4RkZGRkZGRkY7Ci0JaHdfY21kLnR5cGUgPSBNU01fTUVSQ1VSWV9IV19DTURfVFlQRV9SRUFEOwotCWh3X2NtZC5uID0gMTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlod19jbWQub2Zmc2V0ID0gbWVyY3VyeV9yZWdzW2ldOwotCQltc21fbWVyY3VyeV9od19leGVjX2NtZHMoJmh3X2NtZCwgMSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fbWVyY3VyeV9pb2N0bF9tYWdpY19jb2RlKHN0cnVjdCBtc21fbWVyY3VyeV9kZXZpY2UgKnBtZXJjdXJ5X2RldiwKLQl2b2lkICogX191c2VyIGFyZykKLXsKLQlzdHJ1Y3QgbXNtX21lcmN1cnlfaHdfY21kIGh3X2NtZDsKLQlpbnQgcmMgPSAwOwotCi0JcmMgPSBjb3B5X2Zyb21fdXNlcigmaHdfY21kLCBhcmcsIHNpemVvZihzdHJ1Y3QgbXNtX21lcmN1cnlfaHdfY21kKSk7Ci0JaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6JWRdIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaHdfY21kLmRhdGEgPSAweDYwMEQ2MDBEOwotCXJjID0gY29weV90b191c2VyKGFyZywgJmh3X2NtZCwgc2l6ZW9mKGh3X2NtZCkpOwotCi0JaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6JWRdIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fbWVyY3VyeV9pcnEoaW50IGV2ZW50LCB2b2lkICpjb250ZXh0LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBtc21fbWVyY3VyeV9kZXZpY2UgKnBtZXJjdXJ5X2RldiA9Ci0JCShzdHJ1Y3QgbXNtX21lcmN1cnlfZGV2aWNlICopIGNvbnRleHQ7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBNU01fTUVSQ1VSWV9IV19JUlFfU1dfUkVTRVRfQUNLOgotCQkvKiB3YWtlIHVwIGV2dF9xKi8KLQkJTUNSX0RCRygiKCVkKSVzIFdha2UgdXAgZXZlbnQgcSBmcm9tIFJlc2V0IElSUVxuIiwgX19MSU5FX18sCi0JCQlfX2Z1bmNfXyk7Ci0JCW1zbV9tZXJjdXJ5X3Ffd2FrZXVwKCZwbWVyY3VyeV9kZXYtPmV2dF9xKTsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fTUVSQ1VSWV9IV19JUlFfV1JfRU9JX0FDSzoKLQkJLyp3YWtlIHVwIGV2dF9xKi8KLQkJTUNSX0RCRygiJWQlcyBXYWtlIHVwIGV2ZW50cSBmcm9tIFdSX0VPSSBJUlFcbiIsIF9fTElORV9fLAotCQkJX19mdW5jX18pOwotCQltc21fbWVyY3VyeV9xX3dyX2VvaSgmcG1lcmN1cnlfZGV2LT5ldnRfcSk7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX01FUkNVUllfSFdfSVJRX1dSX0VSUl9BQ0s6Ci0JCU1DUl9EQkcoIiglZCklcyBXYWtlIHVwIGV2ZW50cSBmcm9tIFdSX0VSUiBJUlFcbiIsCi0JCQlfX0xJTkVfXywgX19mdW5jX18pOwotCQltc21fbWVyY3VyeV9xX3dyX2VycigmcG1lcmN1cnlfZGV2LT5ldnRfcSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1DUl9EQkcoIiglZCklcyAoZGVmYXVsdCkgV2FrZSB1cCBldmVudCBxIGZyb20gV1JfRVJSIElSUVxuIiwKLQkJCV9fTElORV9fLCBfX2Z1bmNfXyk7Ci0JCW1zbV9tZXJjdXJ5X3Ffd3JfZXJyKCZwbWVyY3VyeV9kZXYtPmV2dF9xKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBfX21zbV9tZXJjdXJ5X29wZW4oc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqcG1lcmN1cnlfZGV2KQotewotCWludCByYyA9IDA7Ci0KLQltdXRleF9sb2NrKCZwbWVyY3VyeV9kZXYtPmxvY2spOwotCWlmIChwbWVyY3VyeV9kZXYtPm9wZW5fY291bnQpIHsKLQkJLyogb25seSBvcGVuIG9uY2UgKi8KLQkJTUNSX1BSX0VSUigiJXM6JWRdIGJ1c3lcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCW11dGV4X3VubG9jaygmcG1lcmN1cnlfZGV2LT5sb2NrKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JcG1lcmN1cnlfZGV2LT5vcGVuX2NvdW50Kys7Ci0JbXV0ZXhfdW5sb2NrKCZwbWVyY3VyeV9kZXYtPmxvY2spOwotCi0JbXNtX21lcmN1cnlfY29yZV9pcnFfaW5zdGFsbChtc21fbWVyY3VyeV9pcnEpOwotCi0JcmMgPSBtc21fbWVyY3VyeV9wbGF0Zm9ybV9pbml0KHBtZXJjdXJ5X2Rldi0+cGRldiwKLQkJJnBtZXJjdXJ5X2Rldi0+bWVtLCAmcG1lcmN1cnlfZGV2LT5iYXNlLAotCQkmcG1lcmN1cnlfZGV2LT5pcnEsIG1zbV9tZXJjdXJ5X2NvcmVfaXJxLCBwbWVyY3VyeV9kZXYpOwotCWlmIChyYykgewotCQlNQ1JfUFJfRVJSKCIlczolZF0gcGxhdGZvcm1faW5pdCBmYWlsICVkXG4iLCBfX2Z1bmNfXywKLQkJCV9fTElORV9fLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlNQ1JfREJHKCJcbiVzOiVkXSBwbGF0Zm9ybSByZXNvdXJjZXMgLSBtZW0gMHglcCwgYmFzZSAweCVwLCBpcnEgJWRcbiIsCi0JCV9fZnVuY19fLCBfX0xJTkVfXywgcG1lcmN1cnlfZGV2LT5tZW0sIHBtZXJjdXJ5X2Rldi0+YmFzZSwKLQkJcG1lcmN1cnlfZGV2LT5pcnEpOwotCi0JbXNtX21lcmN1cnlfcV9jbGVhbnVwKCZwbWVyY3VyeV9kZXYtPmV2dF9xKTsKLQltc21fbWVyY3VyeV9jb3JlX2luaXQoKTsKLQotCU1DUl9EQkcoIlxuJXM6JWRdIHN1Y2Nlc3NcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgX19tc21fbWVyY3VyeV9yZWxlYXNlKHN0cnVjdCBtc21fbWVyY3VyeV9kZXZpY2UgKnBtZXJjdXJ5X2RldikKLXsKLQlNQ1JfREJHKCIlczolZF0gRW50ZXJcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JbXV0ZXhfbG9jaygmcG1lcmN1cnlfZGV2LT5sb2NrKTsKLQlpZiAoIXBtZXJjdXJ5X2Rldi0+b3Blbl9jb3VudCkgewotCQlNQ1JfUFJfRVJSKEtFUk5fRVJSICIlczogbm90IG9wZW5lZFxuIiwgX19mdW5jX18pOwotCQltdXRleF91bmxvY2soJnBtZXJjdXJ5X2Rldi0+bG9jayk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlwbWVyY3VyeV9kZXYtPm9wZW5fY291bnQtLTsKLQltdXRleF91bmxvY2soJnBtZXJjdXJ5X2Rldi0+bG9jayk7Ci0KLQltc21fbWVyY3VyeV9xX2NsZWFudXAoJnBtZXJjdXJ5X2Rldi0+ZXZ0X3EpOwotCi0JaWYgKHBtZXJjdXJ5X2Rldi0+b3Blbl9jb3VudCkKLQkJTUNSX1BSX0VSUihLRVJOX0VSUiAiJXM6IG11bHRpcGxlIG9wZW5zXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAocG1lcmN1cnlfZGV2LT5vcGVuX2NvdW50KQotCQlNQ1JfUFJfRVJSKEtFUk5fRVJSICIlczogbXVsdGlwbGUgb3BlbnNcbiIsIF9fZnVuY19fKTsKLQotCi0JbXNtX21lcmN1cnlfcGxhdGZvcm1fcmVsZWFzZShwbWVyY3VyeV9kZXYtPm1lbSwgcG1lcmN1cnlfZGV2LT5iYXNlLAotCQlwbWVyY3VyeV9kZXYtPmlycSwgcG1lcmN1cnlfZGV2KTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgbXNtX21lcmN1cnlfaW9jdGxfaHdfY21kKHN0cnVjdCBtc21fbWVyY3VyeV9kZXZpY2UgKnBtZXJjdXJ5X2RldiwKLQl2b2lkICogX191c2VyIGFyZykKLXsKLQlzdHJ1Y3QgbXNtX21lcmN1cnlfaHdfY21kIGh3X2NtZDsKLQlpbnQgaXNfY29weV90b191c2VyOwotCWludCByYyA9IDA7Ci0KLQlyYyA9IGNvcHlfZnJvbV91c2VyKCZod19jbWQsIGFyZywgc2l6ZW9mKHN0cnVjdCBtc21fbWVyY3VyeV9od19jbWQpKTsKLQlpZiAocmMpIHsKLQkJTUNSX1BSX0VSUigiJXM6JWRdIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaXNfY29weV90b191c2VyID0gbXNtX21lcmN1cnlfaHdfZXhlY19jbWRzKCZod19jbWQsIDEpOwotCWlmIChpc19jb3B5X3RvX3VzZXIgPj0gMCkgewotCQlyYyA9IGNvcHlfdG9fdXNlcihhcmcsICZod19jbWQsIHNpemVvZihod19jbWQpKTsKLQotCQlpZiAocmMpIHsKLQkJCU1DUl9QUl9FUlIoIiVzOiVkXSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgbXNtX21lcmN1cnlfaW9jdGxfaHdfY21kcyhzdHJ1Y3QgbXNtX21lcmN1cnlfZGV2aWNlICpwbWVyY3VyeV9kZXYsCi0Jdm9pZCAqIF9fdXNlciBhcmcpCi17Ci0JaW50IGlzX2NvcHlfdG9fdXNlcjsKLQlpbnQgbGVuOwotCXVpbnQzMl90IG07Ci0Jc3RydWN0IG1zbV9tZXJjdXJ5X2h3X2NtZHMgKmh3X2NtZHNfcDsKLQlzdHJ1Y3QgbXNtX21lcmN1cnlfaHdfY21kICpod19jbWRfcDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmbSwgYXJnLCBzaXplb2YobSkpKSB7Ci0JCU1DUl9QUl9FUlIoIiVzOiVkXSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCWxlbiA9IHNpemVvZihzdHJ1Y3QgbXNtX21lcmN1cnlfaHdfY21kcykgKwotCQlzaXplb2Yoc3RydWN0IG1zbV9tZXJjdXJ5X2h3X2NtZCkgKiAobSAtIDEpOwotCWh3X2NtZHNfcCA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWh3X2NtZHNfcCkgewotCQlNQ1JfUFJfRVJSKCJbJWRdJXMoKSBubyBtZW0gJWRcbiIsIF9fTElORV9fLCBfX2Z1bmNfXywgbGVuKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGh3X2NtZHNfcCwgYXJnLCBsZW4pKSB7Ci0JCU1DUl9QUl9FUlIoIlslZF0lcyBGYWlsIHRvIGNvcHkgaHdfY21kcyBvZiBsZW4gJWQgZnJvbSB1c2VyXG4iLAotCQkJX19MSU5FX18sIF9fZnVuY19fLCBsZW4pOwotCQlrZnJlZShod19jbWRzX3ApOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlod19jbWRfcCA9IChzdHJ1Y3QgbXNtX21lcmN1cnlfaHdfY21kICopICYoaHdfY21kc19wLT5od19jbWQpOwotCi0JaXNfY29weV90b191c2VyID0gbXNtX21lcmN1cnlfaHdfZXhlY19jbWRzKGh3X2NtZF9wLCBtKTsKLQotCWlmIChpc19jb3B5X3RvX3VzZXIgPj0gMCkgewotCQlpZiAoY29weV90b191c2VyKGFyZywgaHdfY21kc19wLCBsZW4pKSB7Ci0JCQlNQ1JfUFJfRVJSKCIlczolZF0gZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJa2ZyZWUoaHdfY21kc19wKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfQotCWtmcmVlKGh3X2NtZHNfcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fbWVyY3VyeV9pb2N0bF9yZXNldChzdHJ1Y3QgbXNtX21lcmN1cnlfZGV2aWNlICpwbWVyY3VyeV9kZXYsCi0Jdm9pZCAqIF9fdXNlciBhcmcpCi17Ci0JaW50IHJjID0gMDsKLQotCU1DUl9EQkcoIiglZCklcygpIEVudGVyXG4iLCBfX0xJTkVfXywgX19mdW5jX18pOwotCXJjID0gbXNtX21lcmN1cnlfY29yZV9yZXNldCgpOwotCi0JcmV0dXJuIHJjOwotfQotCi1sb25nIF9fbXNtX21lcmN1cnlfaW9jdGwoc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqcG1lcmN1cnlfZGV2LAotCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgTVNNX01DUl9JT0NUTF9HRVRfSFdfVkVSU0lPTjoKLQkJcmMgPSBtc21fbWVyY3VyeV9pb2N0bF9tYWdpY19jb2RlKHBtZXJjdXJ5X2RldiwKLQkJCSh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX01DUl9JT0NUTF9SRVNFVDoKLQkJcmMgPSBtc21fbWVyY3VyeV9pb2N0bF9yZXNldChwbWVyY3VyeV9kZXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX01DUl9JT0NUTF9FVlRfR0VUOgotCQlyYyA9IG1zbV9tZXJjdXJ5X2V2dF9nZXQocG1lcmN1cnlfZGV2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9NQ1JfSU9DVExfRVZUX0dFVF9VTkJMT0NLOgotCQlyYyA9IG1zbV9tZXJjdXJ5X2V2dF9nZXRfdW5ibG9jayhwbWVyY3VyeV9kZXYpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX01DUl9JT0NUTF9IV19DTUQ6Ci0JCXJjID0gbXNtX21lcmN1cnlfaW9jdGxfaHdfY21kKHBtZXJjdXJ5X2RldiwKLQkJCSh2b2lkIF9fdXNlciAqKSBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX01DUl9JT0NUTF9IV19DTURTOgotCQlyYyA9IG1zbV9tZXJjdXJ5X2lvY3RsX2h3X2NtZHMocG1lcmN1cnlfZGV2LAotCQkJKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fTUNSX0lPQ1RMX0lOUFVUX0JVRl9DRkc6Ci0JCXJjID0gbXNtX21lcmN1cnlfaW5wdXRfYnVmX2NmZyhwbWVyY3VyeV9kZXYsCi0JCQkodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9NQ1JfSU9DVExfT1VUUFVUX0JVRl9DRkc6Ci0JCXJjID0gbXNtX21lcmN1cnlfb3V0cHV0X2J1Zl9jZmcocG1lcmN1cnlfZGV2LAotCQkJKHZvaWQgX191c2VyICopIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fTUNSX0lPQ1RMX09VVFBVVF9HRVQ6Ci0JCXJjID0gbXNtX21lcmN1cnlfb3V0cHV0X2dldChwbWVyY3VyeV9kZXYsCi0JCQkodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9NQ1JfSU9DVExfSU5QVVRfR0VUOgotCQlyYyA9IG1zbV9tZXJjdXJ5X2lucHV0X2dldChwbWVyY3VyeV9kZXYsCi0JCQkodm9pZCBfX3VzZXIgKikgYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9NQ1JfSU9DVExfVEVTVF9EVU1QX1JFR0lPTjoKLQkJcmMgPSBtc21fbWVyY3VyeV9pb2N0bF9kdW1wX3JlZ3MoKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIiglZCklcygpICBjbWQgPSAlZCBub3Qgc3VwcG9ydGVkXG4iLAotCQkJX19MSU5FX18sIF9fZnVuY19fLCBfSU9DX05SKGNtZCkpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0cnVjdCBtc21fbWVyY3VyeV9kZXZpY2UgKl9fbXNtX21lcmN1cnlfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBtc21fbWVyY3VyeV9kZXZpY2UgKnBtZXJjdXJ5X2RldjsKLQlwbWVyY3VyeV9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX21lcmN1cnlfZGV2aWNlKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwbWVyY3VyeV9kZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczolZF1ubyBtZW1cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCW11dGV4X2luaXQoJnBtZXJjdXJ5X2Rldi0+bG9jayk7Ci0KLQlwbWVyY3VyeV9kZXYtPnBkZXYgPSBwZGV2OwotCi0JbXNtX21lcmN1cnlfcV9pbml0KCJldnRfcSIsICZwbWVyY3VyeV9kZXYtPmV2dF9xKTsKLQotCXJldHVybiBwbWVyY3VyeV9kZXY7Ci19Ci0KLWludCBfX21zbV9tZXJjdXJ5X2V4aXQoc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqcG1lcmN1cnlfZGV2KQotewotCW11dGV4X2Rlc3Ryb3koJnBtZXJjdXJ5X2Rldi0+bG9jayk7Ci0Ja2ZyZWUocG1lcmN1cnlfZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21lcmN1cnkvbXNtX21lcmN1cnlfc3luYy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21lcmN1cnkvbXNtX21lcmN1cnlfc3luYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDQwOTJmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tZXJjdXJ5L21zbV9tZXJjdXJ5X3N5bmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIE1TTV9NRVJDVVJZX1NZTkNfSAotI2RlZmluZSBNU01fTUVSQ1VSWV9TWU5DX0gKLQotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+Ci0jaW5jbHVkZSAibXNtX21lcmN1cnlfY29yZS5oIgotCi1zdHJ1Y3QgbXNtX21lcmN1cnlfcSB7Ci0JCWNoYXIgY29uc3QgICpuYW1lOwotCQlzdHJ1Y3QgbGlzdF9oZWFkICBxOwotCQlzcGlubG9ja190ICBsY2s7Ci0JCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0JCWludCAgICAgICAgdW5ibGNrOwotfTsKLQotc3RydWN0IG1zbV9tZXJjdXJ5X3FfZW50cnkgewotCQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JCXZvaWQgICAqZGF0YTsKLX07Ci0KLXN0cnVjdCBtc21fbWVyY3VyeV9kZXZpY2UgewotCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCQlzdHJ1Y3QgcmVzb3VyY2UgICAgICAgICptZW07Ci0JCWludCAgICAgICAgICAgICAgICAgICAgIGlycTsKLQkJdm9pZCAgICAgICAgICAgICAgICAgICAqYmFzZTsKLQkJc3RydWN0IGNsayAqbWVyY3VyeV9jbGtbMl07Ci0JCXN0cnVjdCBkZXZpY2UgKmRldmljZTsKLQkJc3RydWN0IGNkZXYgICBjZGV2OwotCQlzdHJ1Y3QgbXV0ZXggIGxvY2s7Ci0JCWNoYXIgICAgICBvcGVuX2NvdW50OwotCQl1aW50OF90ICAgICAgIG9wX21vZGU7Ci0KLQkJLyogZXZlbnQgcXVldWUgaW5jbHVkaW5nIGZyYW1lIGRvbmUgJiBlcnIgaW5kaWNhdGlvbnMqLwotCQlzdHJ1Y3QgbXNtX21lcmN1cnlfcSBldnRfcTsKLQkJc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKLQotfTsKLQotaW50IF9fbXNtX21lcmN1cnlfb3BlbihzdHJ1Y3QgbXNtX21lcmN1cnlfZGV2aWNlICpwbWNyeV9kZXYpOwotaW50IF9fbXNtX21lcmN1cnlfcmVsZWFzZShzdHJ1Y3QgbXNtX21lcmN1cnlfZGV2aWNlICpwbWNyeV9kZXYpOwotCi1sb25nIF9fbXNtX21lcmN1cnlfaW9jdGwoc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqcG1jcnlfZGV2LAotCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLQotc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqX19tc21fbWVyY3VyeV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwotaW50IF9fbXNtX21lcmN1cnlfZXhpdChzdHJ1Y3QgbXNtX21lcmN1cnlfZGV2aWNlICpwbWNyeV9kZXYpOwotaW50IG1zbV9tZXJjdXJ5X2lvY3RsX2h3X2NtZHMoc3RydWN0IG1zbV9tZXJjdXJ5X2RldmljZSAqcG1jcnlfZGV2LAotCXZvaWQgKiBfX3VzZXIgYXJnKTsKLWludCBtc21fbWVyY3VyeV9pb2N0bF9od19jbWRzX3dvKHN0cnVjdCBtc21fbWVyY3VyeV9kZXZpY2UgKnBtY3J5X2RldiwKLQl2b2lkICogX191c2VyIGFyZyk7Ci0jZW5kaWYgLyogTVNNX01FUkNVUllfU1lOQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMWVkYWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU5MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlICJtc20uaCIKLSNpbmNsdWRlICJtc21fY2FtX3NlcnZlci5oIgotI2luY2x1ZGUgIm1zbV9zZW5zb3IuaCIKLSNpbmNsdWRlICJtc21fYWN0dWF0b3IuaCIKLSNpbmNsdWRlICJtc21fY2FtZXJhX2VlcHJvbS5oIgotCi0jZGVmaW5lIE1TTV9NQVhfQ0FNRVJBX1NFTlNPUlMgNQotCi0jaWZkZWYgQ09ORklHX01TTV9DQU1FUkFfREVCVUcKLSNkZWZpbmUgRChmbXQsIGFyZ3MuLi4pIHByX2RlYnVnKCJtc206ICIgZm10LCAjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBEKGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQotc3RhdGljIHVuc2lnbmVkIG1zbV9jYW1lcmFfdjRsMl9uciA9IC0xOwotc3RhdGljIGludCB2bm9kZV9jb3VudDsKLQotbW9kdWxlX3BhcmFtKG1zbV9jYW1lcmFfdjRsMl9uciwgdWludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1zbV9jYW1lcmFfdjRsMl9uciwgInZpZGVvWCBzdGFydCBudW1iZXIsIC0xIGlzIGF1dG9kZXRlY3QiKTsKLQotLyogY2FsbGJhY2sgZnVuY3Rpb24gZnJvbSBhbGwgc3ViZGV2aWNlcyBvZiBhIG1zbV9jYW1fdjRsMl9kZXZpY2UgKi8KLXN0YXRpYyB2b2lkIG1zbV9jYW1fdjRsMl9zdWJkZXZfbm90aWZ5KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQkJdW5zaWduZWQgaW50IG5vdGlmaWNhdGlvbiwgdm9pZCAqYXJnKQotewotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtOwotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsOwotCi0JaWYgKHNkID09IE5VTEwpCi0JCXJldHVybjsKLQotCXBjYW0gPSB0b19wY2FtKHNkLT52NGwyX2Rldik7Ci0KLQlpZiAocGNhbSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlwbWN0bCA9IG1zbV9jYW1fc2VydmVyX2dldF9tY3RsKHBjYW0tPm1jdGxfaGFuZGxlKTsKLQlpZiAocG1jdGwgPT0gTlVMTCkKLQkJcmV0dXJuOwotfQotCi0vKgotICoKLSAqIGltcGxlbWVudGF0aW9uIG9mIHY0bDJfaW9jdGxfb3BzCi0gKgotICovCi1zdGF0aWMgaW50IG1zbV9jYW1lcmFfdjRsMl9xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZiwgdm9pZCAqcGN0eCwKLQkJCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpwY2FwcykKLXsKLQotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JV0FSTl9PTihwY3R4ICE9IGYtPnByaXZhdGVfZGF0YSk7Ci0KLQkvKiBzb21lIG90aGVyIGRheSwgc29tZSBvdGhlciB0aW1lICovCi0JLypjYXAtPnZlcnNpb24gPSBMSU5VWF9WRVJTSU9OX0NPREU7ICovCi0JcGNhcHMtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9TVFJFQU1JTkc7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NhbWVyYV92NGwyX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZiwgdm9pZCAqcGN0eCwKLQkJCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnBxY3RybCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtICA9IHZpZGVvX2RydmRhdGEoZik7Ci0KLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCVdBUk5fT04ocGN0eCAhPSBmLT5wcml2YXRlX2RhdGEpOwotCi0JbXV0ZXhfbG9jaygmcGNhbS0+dmlkX2xvY2spOwotCXJjID0gbXNtX3NlcnZlcl9xX2N0cmwocGNhbSwgcHFjdHJsKTsKLQltdXRleF91bmxvY2soJnBjYW0tPnZpZF9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NhbWVyYV92NGwyX3ByaXZhdGVfZ2VuZXJhbChzdHJ1Y3QgZmlsZSAqZiwgdm9pZCAqcGN0eCwKLQlzdHJ1Y3QgbXNtX2NhbWVyYV92NGwyX2lvY3RsX3QgKmlvY3RsX3B0cikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtICA9IHZpZGVvX2RydmRhdGEoZik7Ci0KLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQotCXJjID0gbXNtX3NlcnZlcl9wcml2YXRlX2dlbmVyYWwocGNhbSwgaW9jdGxfcHRyKTsKLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoIiVzOiBQcml2YXRlIGNvbW1hbmQgZmFpbGVkIHJjICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fY2FtZXJhX3Y0bDJfcHJpdmF0ZV9nX2N0cmwoc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0Jc3RydWN0IG1zbV9jYW1lcmFfdjRsMl9pb2N0bF90ICppb2N0bF9wdHIpCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSAgPSB2aWRlb19kcnZkYXRhKGYpOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdDsKLQlwY2FtX2luc3QgPSBjb250YWluZXJfb2YoZi0+cHJpdmF0ZV9kYXRhLAotCQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0LCBldmVudEhhbmRsZSk7Ci0KLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQotCW11dGV4X2xvY2soJnBjYW0tPnZpZF9sb2NrKTsKLQlzd2l0Y2ggKGlvY3RsX3B0ci0+aWQpIHsKLQljYXNlIE1TTV9WNEwyX1BJRF9JTlNUX0hBTkRMRToKLQkJQ09QWV9UT19VU0VSKHJjLCAodm9pZCBfX3VzZXIgKilpb2N0bF9wdHItPmlvY3RsX3B0ciwKLQkJCSh2b2lkICopJnBjYW1faW5zdC0+aW5zdF9oYW5kbGUsIHNpemVvZih1aW50MzJfdCkpOwotCQlpZiAocmMpCi0JCQlFUlJfQ09QWV9UT19VU0VSKCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXMgVW5zdXBwb3J0ZWQgaW9jdGwgJWQgIiwgX19mdW5jX18sIGlvY3RsX3B0ci0+aWQpOwotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwY2FtLT52aWRfbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9jYW1lcmFfdjRsMl9nX2N0cmwoc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0JCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmMpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSAgPSB2aWRlb19kcnZkYXRhKGYpOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQotCW11dGV4X2xvY2soJnBjYW0tPnZpZF9sb2NrKTsKLQlyYyA9IG1zbV9zZXJ2ZXJfZ19jdHJsKHBjYW0sIGMpOwotCW11dGV4X3VubG9jaygmcGNhbS0+dmlkX2xvY2spOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9jYW1lcmFfdjRsMl9wcml2YXRlX3NfY3RybChzdHJ1Y3QgZmlsZSAqZiwgdm9pZCAqcGN0eCwKLQkJCXN0cnVjdCBtc21fY2FtZXJhX3Y0bDJfaW9jdGxfdCAqaW9jdGxfcHRyKQotewotCWludCByYyA9IC1FSU5WQUw7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0gID0gdmlkZW9fZHJ2ZGF0YShmKTsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3Q7Ci0JcGNhbV9pbnN0ID0gY29udGFpbmVyX29mKGYtPnByaXZhdGVfZGF0YSwKLQkJc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCwgZXZlbnRIYW5kbGUpOwotCVdBUk5fT04ocGN0eCAhPSBmLT5wcml2YXRlX2RhdGEpOwotCW11dGV4X2xvY2soJnBjYW0tPnZpZF9sb2NrKTsKLQlzd2l0Y2ggKGlvY3RsX3B0ci0+aWQpIHsKLQljYXNlIE1TTV9WNEwyX1BJRF9DVFJMX0NNRDoKLQkJcmMgPSBtc21fc2VydmVyX3Byb2NfY3RybF9jbWQocGNhbSwgaW9jdGxfcHRyLCAxKTsKLQkJYnJlYWs7Ci0JfQotCW11dGV4X3VubG9jaygmcGNhbS0+dmlkX2xvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fY2FtZXJhX3Y0bDJfc19jdHJsKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0gID0gdmlkZW9fZHJ2ZGF0YShmKTsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3Q7Ci0JcGNhbV9pbnN0ID0gY29udGFpbmVyX29mKGYtPnByaXZhdGVfZGF0YSwKLQkJc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCwgZXZlbnRIYW5kbGUpOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQotCVdBUk5fT04ocGN0eCAhPSBmLT5wcml2YXRlX2RhdGEpOwotCW11dGV4X2xvY2soJnBjYW0tPnZpZF9sb2NrKTsKLQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBNU01fVjRMMl9QSURfTU1BUF9JTlNUOgotCQlEKCIlczogbW1hcF9pbnN0PSgweCVwLCAlZClcbiIsCi0JCQkgX19mdW5jX18sIHBjYW1faW5zdCwgcGNhbV9pbnN0LT5teV9pbmRleCk7Ci0JCXBjYW1faW5zdC0+aXNfbWVtX21hcF9pbnN0ID0gMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaWYgKGN0cmwtPmlkID09IE1TTV9WNEwyX1BJRF9DQU1fTU9ERSkKLQkJCXBjYW0tPm9wX21vZGUgPSBjdHJsLT52YWx1ZTsKLQkJcmMgPSBtc21fc2VydmVyX3NfY3RybChwY2FtLCBjdHJsKTsKLQkJYnJlYWs7Ci0JfQotCW11dGV4X3VubG9jaygmcGNhbS0+dmlkX2xvY2spOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9jYW1lcmFfdjRsMl9yZXFidWZzKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpwYikKLXsKLQlpbnQgcmMgPSAwLCBpLCBqOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdDsKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSA9IHZpZGVvX2RydmRhdGEoZik7Ci0JcGNhbV9pbnN0ID0gY29udGFpbmVyX29mKGYtPnByaXZhdGVfZGF0YSwKLQkJc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCwgZXZlbnRIYW5kbGUpOwotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JV0FSTl9PTihwY3R4ICE9IGYtPnByaXZhdGVfZGF0YSk7Ci0KLQltdXRleF9sb2NrKCZwY2FtX2luc3QtPmluc3RfbG9jayk7Ci0JaWYgKCFwY2FtX2luc3QtPnZicXVldWVfaW5pdGlhbGl6ZWQgJiYgcGItPmNvdW50KSB7Ci0JCXBtY3RsID0gbXNtX2NhbV9zZXJ2ZXJfZ2V0X21jdGwocGNhbS0+bWN0bF9oYW5kbGUpOwotCQlpZiAocG1jdGwgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlcyBJbnZhbGlkIG1jdGwgcHRyIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJcG1jdGwtPm1jdGxfdmJxdWV1ZV9pbml0KHBjYW1faW5zdCwgJnBjYW1faW5zdC0+dmlkX2J1ZnEsCi0JCQlwYi0+dHlwZSk7Ci0JCXBjYW1faW5zdC0+dmJxdWV1ZV9pbml0aWFsaXplZCA9IDE7Ci0JfQotCi0JcmMgPSB2YjJfcmVxYnVmcygmcGNhbV9pbnN0LT52aWRfYnVmcSwgcGIpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyByZXFidWZzIGZhaWxlZCAlZCAiLCBfX2Z1bmNfXywgcmMpOwotCQltdXRleF91bmxvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlpZiAoIXBiLT5jb3VudCkgewotCQkvKiBEZWFsbG9jYXRpb24uIGZyZWUgYnVmX29mZnNldCBhcnJheSAqLwotCQlEKCIlcyBJbnN0ICVwIGZyZWVpbmcgYnVmZmVyIG9mZnNldHMgYXJyYXkiLAotCQkJX19mdW5jX18sIHBjYW1faW5zdCk7Ci0JCWZvciAoaiA9IDAgOyBqIDwgcGNhbV9pbnN0LT5idWZfY291bnQgOyBqKyspIHsKLQkJCWtmcmVlKHBjYW1faW5zdC0+YnVmX29mZnNldFtqXSk7Ci0JCQlwY2FtX2luc3QtPmJ1Zl9vZmZzZXRbal0gPSBOVUxMOwotCQl9Ci0JCWtmcmVlKHBjYW1faW5zdC0+YnVmX29mZnNldCk7Ci0JCXBjYW1faW5zdC0+YnVmX29mZnNldCA9IE5VTEw7Ci0JCS8qIElmIHRoZSB1c2Vyc3BhY2UgaGFzIGRlYWxsb2NhdGVkIGFsbCB0aGUKLQkJICogYnVmZmVycywgdGhlbiByZWxlYXNlIHRoZSB2YjIgcXVldWUgKi8KLQkJaWYgKHBjYW1faW5zdC0+dmJxdWV1ZV9pbml0aWFsaXplZCkgewotCQkJdmIyX3F1ZXVlX3JlbGVhc2UoJnBjYW1faW5zdC0+dmlkX2J1ZnEpOwotCQkJcGNhbV9pbnN0LT52YnF1ZXVlX2luaXRpYWxpemVkID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCUQoIiVzIEluc3QgJXAgQWxsb2NhdGluZyBidWZfb2Zmc2V0IGFycmF5IiwKLQkJCV9fZnVuY19fLCBwY2FtX2luc3QpOwotCQkvKiBBbGxvY2F0aW9uLiBhbGxvY2F0ZSBidWZfb2Zmc2V0IGFycmF5ICovCi0JCXBjYW1faW5zdC0+YnVmX29mZnNldCA9IChzdHJ1Y3QgbXNtX2NhbV9idWZfb2Zmc2V0ICoqKQotCQkJa3phbGxvYyhwYi0+Y291bnQgKiBzaXplb2Yoc3RydWN0IG1zbV9jYW1fYnVmX29mZnNldCAqKSwKLQkJCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCFwY2FtX2luc3QtPmJ1Zl9vZmZzZXQpIHsKLQkJCXByX2VycigiJXMgb3V0IG9mIG1lbW9yeSAiLCBfX2Z1bmNfXyk7Ci0JCQltdXRleF91bmxvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBwYi0+Y291bnQ7IGkrKykgewotCQkJcGNhbV9pbnN0LT5idWZfb2Zmc2V0W2ldID0KLQkJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2NhbV9idWZfb2Zmc2V0KSAqCi0JCQkJcGNhbV9pbnN0LT5wbGFuZV9pbmZvLm51bV9wbGFuZXMsIEdGUF9LRVJORUwpOwotCQkJaWYgKCFwY2FtX2luc3QtPmJ1Zl9vZmZzZXRbaV0pIHsKLQkJCQlwcl9lcnIoIiVzIG91dCBvZiBtZW1vcnkgIiwgX19mdW5jX18pOwotCQkJCWZvciAoaiA9IGktMSA7IGogPj0gMDsgai0tKSB7Ci0JCQkJCWtmcmVlKHBjYW1faW5zdC0+YnVmX29mZnNldFtqXSk7Ci0JCQkJCXBjYW1faW5zdC0+YnVmX29mZnNldFtqXSA9IE5VTEw7Ci0JCQkJfQotCQkJCWtmcmVlKHBjYW1faW5zdC0+YnVmX29mZnNldCk7Ci0JCQkJcGNhbV9pbnN0LT5idWZfb2Zmc2V0ID0gTlVMTDsKLQkJCQltdXRleF91bmxvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQkJfQotCX0KLQlwY2FtX2luc3QtPmJ1Zl9jb3VudCA9IHBiLT5jb3VudDsKLQltdXRleF91bmxvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NhbWVyYV92NGwyX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKnBiKQotewotCS8qIGdldCB0aGUgdmlkZW8gZGV2aWNlICovCi0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3Q7Ci0JcGNhbV9pbnN0ID0gY29udGFpbmVyX29mKGYtPnByaXZhdGVfZGF0YSwKLQkJc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCwgZXZlbnRIYW5kbGUpOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQltdXRleF9sb2NrKCZwY2FtX2luc3QtPmluc3RfbG9jayk7Ci0JcmMgPSB2YjJfcXVlcnlidWYoJnBjYW1faW5zdC0+dmlkX2J1ZnEsIHBiKTsKLQltdXRleF91bmxvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NhbWVyYV92NGwyX3FidWYoc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0JCQkJCXN0cnVjdCB2NGwyX2J1ZmZlciAqcGIpCi17Ci0JaW50IHJjID0gMCwgaSA9IDA7Ci0JLyogZ2V0IHRoZSBjYW1lcmEgZGV2aWNlICovCi0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0OwotCXBjYW1faW5zdCA9IGNvbnRhaW5lcl9vZihmLT5wcml2YXRlX2RhdGEsCi0JCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QsIGV2ZW50SGFuZGxlKTsKLQotCUQoIiVzIEluc3Q9JXAsIG1vZGU9JWQsIGlkeD0lZFxuIiwgX19mdW5jX18sIHBjYW1faW5zdCwKLQkJcGNhbV9pbnN0LT5pbWFnZV9tb2RlLCBwYi0+aW5kZXgpOwotCVdBUk5fT04ocGN0eCAhPSBmLT5wcml2YXRlX2RhdGEpOwotCi0JbXV0ZXhfbG9jaygmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCWlmICghcGNhbV9pbnN0LT5idWZfb2Zmc2V0KSB7Ci0JCXByX2VycigiJXMgQnVmZmVyIGlzIGFscmVhZHkgcmVsZWFzZWQuIFJldHVybmluZy5cbiIsIF9fZnVuY19fKTsKLQkJbXV0ZXhfdW5sb2NrKCZwY2FtX2luc3QtPmluc3RfbG9jayk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChwYi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7Ci0JCS8qIFJlamVjdCB0aGUgYnVmZmVyIGlmIHBsYW5lcyBhcnJheSB3YXMgbm90IGFsbG9jYXRlZCAqLwotCQlpZiAocGItPm0ucGxhbmVzID09IE5VTEwpIHsKLQkJCXByX2VycigiJXMgUGxhbmVzIGFycmF5IGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJCW11dGV4X3VubG9jaygmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IHBjYW1faW5zdC0+cGxhbmVfaW5mby5udW1fcGxhbmVzOyBpKyspIHsKLQkJCUQoIiVzIHN0b3JlZCBvZmZzZXRzIGZvciBwbGFuZSAlZCBhcyIKLQkJCQkiYWRkciBvZmZzZXQgJWQsIGRhdGEgb2Zmc2V0ICVkXG4iLAotCQkJCV9fZnVuY19fLCBpLCBwYi0+bS5wbGFuZXNbaV0ucmVzZXJ2ZWRbMF0sCi0JCQkJcGItPm0ucGxhbmVzW2ldLmRhdGFfb2Zmc2V0KTsKLQkJCXBjYW1faW5zdC0+YnVmX29mZnNldFtwYi0+aW5kZXhdW2ldLmRhdGFfb2Zmc2V0ID0KLQkJCQlwYi0+bS5wbGFuZXNbaV0uZGF0YV9vZmZzZXQ7Ci0JCQlwY2FtX2luc3QtPmJ1Zl9vZmZzZXRbcGItPmluZGV4XVtpXS5hZGRyX29mZnNldCA9Ci0JCQkJcGItPm0ucGxhbmVzW2ldLnJlc2VydmVkWzBdOwotCQl9Ci0JfSBlbHNlIHsKLQkJRCgiJXMgc3RvcmVkIHJlc2VydmVkIGluZm8gJWRcbiIsIF9fZnVuY19fLCBwYi0+cmVzZXJ2ZWQpOwotCQlwY2FtX2luc3QtPmJ1Zl9vZmZzZXRbcGItPmluZGV4XVswXS5hZGRyX29mZnNldCA9IHBiLT5yZXNlcnZlZDsKLQl9Ci0KLQlyYyA9IHZiMl9xYnVmKCZwY2FtX2luc3QtPnZpZF9idWZxLCBwYik7Ci0JRCgiJXMsIHZpZGVvYnVmX3FidWYgbW9kZSAlZCBhbmQgaWR4ICVkIHJldHVybnMgJWRcbiIsIF9fZnVuY19fLAotCQlwY2FtX2luc3QtPmltYWdlX21vZGUsIHBiLT5pbmRleCwgcmMpOwotCW11dGV4X3VubG9jaygmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fY2FtZXJhX3Y0bDJfZHFidWYoc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0JCQkJCXN0cnVjdCB2NGwyX2J1ZmZlciAqcGIpCi17Ci0JaW50IHJjID0gMCwgaSA9IDA7Ci0JLyogZ2V0IHRoZSBjYW1lcmEgZGV2aWNlICovCi0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0OwotCXBjYW1faW5zdCA9IGNvbnRhaW5lcl9vZihmLT5wcml2YXRlX2RhdGEsCi0JCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QsIGV2ZW50SGFuZGxlKTsKLQotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JV0FSTl9PTihwY3R4ICE9IGYtPnByaXZhdGVfZGF0YSk7Ci0KLQltdXRleF9sb2NrKCZwY2FtX2luc3QtPmluc3RfbG9jayk7Ci0JaWYgKDAgPT0gcGNhbV9pbnN0LT5zdHJlYW1vbikgewotCQltdXRleF91bmxvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQkJcmV0dXJuIC1FQUNDRVM7Ci0JfQotCXJjID0gdmIyX2RxYnVmKCZwY2FtX2luc3QtPnZpZF9idWZxLCBwYiwgIGYtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKLQlEKCIlcywgdmlkZW9idWZfZHFidWYgcmV0dXJucyAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQotCWlmIChwYi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7Ci0JCS8qIFJlamVjdCB0aGUgYnVmZmVyIGlmIHBsYW5lcyBhcnJheSB3YXMgbm90IGFsbG9jYXRlZCAqLwotCQlpZiAocGItPm0ucGxhbmVzID09IE5VTEwpIHsKLQkJCXByX2VycigiJXMgUGxhbmVzIGFycmF5IGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJCW11dGV4X3VubG9jaygmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IHBjYW1faW5zdC0+cGxhbmVfaW5mby5udW1fcGxhbmVzOyBpKyspIHsKLQkJCXBiLT5tLnBsYW5lc1tpXS5kYXRhX29mZnNldCA9Ci0JCQkJcGNhbV9pbnN0LT5idWZfb2Zmc2V0W3BiLT5pbmRleF1baV0uZGF0YV9vZmZzZXQ7Ci0JCQlwYi0+bS5wbGFuZXNbaV0ucmVzZXJ2ZWRbMF0gPQotCQkJCXBjYW1faW5zdC0+YnVmX29mZnNldFtwYi0+aW5kZXhdW2ldLmFkZHJfb2Zmc2V0OwotCQkJRCgiJXMgc3RvcmVkIG9mZnNldHMgZm9yIHBsYW5lICVkIGFzICIKLQkJCQkiYWRkciBvZmZzZXQgJWQsIGRhdGEgb2Zmc2V0ICVkXG4iLAotCQkJCV9fZnVuY19fLCBpLCBwYi0+bS5wbGFuZXNbaV0ucmVzZXJ2ZWRbMF0sCi0JCQkJcGItPm0ucGxhbmVzW2ldLmRhdGFfb2Zmc2V0KTsKLQkJfQotCX0gZWxzZSB7Ci0JCUQoIiVzIHN0b3JlZCByZXNlcnZlZCBpbmZvICVkXG4iLCBfX2Z1bmNfXywgcGItPnJlc2VydmVkKTsKLQkJcGItPnJlc2VydmVkID0gcGNhbV9pbnN0LT5idWZfb2Zmc2V0W3BiLT5pbmRleF1bMF0uYWRkcl9vZmZzZXQ7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZwY2FtX2luc3QtPmluc3RfbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9jYW1lcmFfdjRsMl9zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZiwgdm9pZCAqcGN0eCwKLQkJCQkJZW51bSB2NGwyX2J1Zl90eXBlIGJ1Zl90eXBlKQotewotCWludCByYyA9IDA7Ci0JLyogZ2V0IHRoZSBjYW1lcmEgZGV2aWNlICovCi0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0gID0gdmlkZW9fZHJ2ZGF0YShmKTsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3Q7Ci0JcGNhbV9pbnN0ID0gY29udGFpbmVyX29mKGYtPnByaXZhdGVfZGF0YSwKLQkJc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCwgZXZlbnRIYW5kbGUpOwotCi0JRCgiJXMgSW5zdCAlcFxuIiwgX19mdW5jX18sIHBjYW1faW5zdCk7Ci0JV0FSTl9PTihwY3R4ICE9IGYtPnByaXZhdGVfZGF0YSk7Ci0KLQltdXRleF9sb2NrKCZwY2FtLT52aWRfbG9jayk7Ci0JbXV0ZXhfbG9jaygmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCWlmICgoYnVmX3R5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgJiYKLQkJKGJ1Zl90eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkpIHsKLQkJcHJfZXJyKCIlcyBJbnZhbGlkIGJ1ZmZlciB0eXBlICIsIF9fZnVuY19fKTsKLQkJbXV0ZXhfdW5sb2NrKCZwY2FtX2luc3QtPmluc3RfbG9jayk7Ci0JCW11dGV4X3VubG9jaygmcGNhbS0+dmlkX2xvY2spOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlEKCIlcyBDYWxsaW5nIHZpZGVvYnVmX3N0cmVhbW9uIiwgX19mdW5jX18pOwotCS8qIGlmIEhXIHN0cmVhbWluZyBvbiBpcyBzdWNjZXNzZnVsLCBzdGFydCBidWZmZXIgc3RyZWFtaW5nICovCi0JcmMgPSB2YjJfc3RyZWFtb24oJnBjYW1faW5zdC0+dmlkX2J1ZnEsIGJ1Zl90eXBlKTsKLQlEKCIlcywgdmlkZW9idWZfc3RyZWFtb24gcmV0dXJucyAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQotCS8qIHR1cm4gSFcgKFZGRS9zZW5zb3IpIHN0cmVhbWluZyAqLwotCXBjYW1faW5zdC0+c3RyZWFtb24gPSAxOwotCXJjID0gbXNtX3NlcnZlcl9zdHJlYW1vbihwY2FtLCBwY2FtX2luc3QtPm15X2luZGV4KTsKLQltdXRleF91bmxvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQltdXRleF91bmxvY2soJnBjYW0tPnZpZF9sb2NrKTsKLQlEKCIlcyByYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fY2FtZXJhX3Y0bDJfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCQllbnVtIHY0bDJfYnVmX3R5cGUgYnVmX3R5cGUpCi17Ci0JaW50IHJjID0gMDsKLQkvKiBnZXQgdGhlIGNhbWVyYSBkZXZpY2UgKi8KLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSAgPSB2aWRlb19kcnZkYXRhKGYpOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdDsKLQlwY2FtX2luc3QgPSBjb250YWluZXJfb2YoZi0+cHJpdmF0ZV9kYXRhLAotCQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0LCBldmVudEhhbmRsZSk7Ci0KLQlEKCIlcyBJbnN0ICVwXG4iLCBfX2Z1bmNfXywgcGNhbV9pbnN0KTsKLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQotCWlmICgoYnVmX3R5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgJiYKLQkJKGJ1Zl90eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkpIHsKLQkJcHJfZXJyKCIlcyBJbnZhbGlkIGJ1ZmZlciB0eXBlICIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogZmlyc3QgdHVybiBvZiBIVyAoVkZFL3NlbnNvcikgc3RyZWFtaW5nIHNvIHRoYXQgYnVmZmVycyBhcmUKLQkJbm90IGluIHVzZSB3aGVuIHdlIGZyZWUgdGhlIGJ1ZmZlcnMgKi8KLQltdXRleF9sb2NrKCZwY2FtLT52aWRfbG9jayk7Ci0JbXV0ZXhfbG9jaygmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCXBjYW1faW5zdC0+c3RyZWFtb24gPSAwOwotCWlmIChtc21fc2VydmVyX2dldF91c2Vjb3VudCgpID4gMCkKLQkJcmMgPSBtc21fc2VydmVyX3N0cmVhbW9mZihwY2FtLCBwY2FtX2luc3QtPm15X2luZGV4KTsKLQotCWlmIChyYyA8IDApCi0JCXByX2VycigiJXM6IGh3IGZhaWxlZCB0byBzdG9wIHN0cmVhbWluZ1xuIiwgX19mdW5jX18pOwotCi0JLyogc3RvcCBidWZmZXIgc3RyZWFtaW5nICovCi0JcmMgPSB2YjJfc3RyZWFtb2ZmKCZwY2FtX2luc3QtPnZpZF9idWZxLCBidWZfdHlwZSk7Ci0JRCgiJXMsIHZpZGVvYnVmX3N0cmVhbW9mZiByZXR1cm5zICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCi0JbXV0ZXhfdW5sb2NrKCZwY2FtX2luc3QtPmluc3RfbG9jayk7Ci0JbXV0ZXhfdW5sb2NrKCZwY2FtLT52aWRfbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9jYW1lcmFfdjRsMl9lbnVtX2ZtdF9jYXAoc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0JCQkJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKnBmbXRkZXNjKQotewotCS8qIGdldCB0aGUgdmlkZW8gZGV2aWNlICovCi0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0gID0gdmlkZW9fZHJ2ZGF0YShmKTsKLQljb25zdCBzdHJ1Y3QgbXNtX2lzcF9jb2xvcl9mbXQgKmlzcF9mbXQ7Ci0KLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCVdBUk5fT04ocGN0eCAhPSBmLT5wcml2YXRlX2RhdGEpOwotCWlmICgocGZtdGRlc2MtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgJiYKLQkJKHBmbXRkZXNjLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHBmbXRkZXNjLT5pbmRleCA+PSBwY2FtLT5udW1fZm10cykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpc3BfZm10ID0gJnBjYW0tPnVzcl9mbXRzW3BmbXRkZXNjLT5pbmRleF07Ci0KLQlpZiAoaXNwX2ZtdC0+bmFtZSkKLQkJc3RybGNweShwZm10ZGVzYy0+ZGVzY3JpcHRpb24sIGlzcF9mbXQtPm5hbWUsCi0JCQkJCQlzaXplb2YocGZtdGRlc2MtPmRlc2NyaXB0aW9uKSk7Ci0KLQlwZm10ZGVzYy0+cGl4ZWxmb3JtYXQgPSBpc3BfZm10LT5mb3VyY2M7Ci0KLQlEKCIlczogWyVkXSAweCV4LCAlc1xuIiwgX19mdW5jX18sIHBmbXRkZXNjLT5pbmRleCwKLQkJaXNwX2ZtdC0+Zm91cmNjLCBpc3BfZm10LT5uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fY2FtZXJhX3Y0bDJfZ19mbXRfY2FwKHN0cnVjdCBmaWxlICpmLAotCQl2b2lkICpwY3R4LCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKnBmbXQpCi17Ci0JaW50IHJjID0gMDsKLQkvKiBnZXQgdGhlIHZpZGVvIGRldmljZSAqLwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtICA9IHZpZGVvX2RydmRhdGEoZik7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0OwotCXBjYW1faW5zdCA9IGNvbnRhaW5lcl9vZihmLT5wcml2YXRlX2RhdGEsCi0JCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QsIGV2ZW50SGFuZGxlKTsKLQotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JV0FSTl9PTihwY3R4ICE9IGYtPnByaXZhdGVfZGF0YSk7Ci0KLQlpZiAocGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmMgPSBtc21fc2VydmVyX2dldF9mbXQocGNhbSwgcGNhbV9pbnN0LT5teV9pbmRleCwgcGZtdCk7Ci0JRCgiJXM6IGN1cnJlbnRfZm10LT5mb3VyY2M6IDB4JTA4eCwgcmMgPSAlZFxuIiwgX19mdW5jX18sCi0JCQkJcGZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fY2FtZXJhX3Y0bDJfZ19mbXRfY2FwX21wbGFuZShzdHJ1Y3QgZmlsZSAqZiwKLQkJdm9pZCAqcGN0eCwgc3RydWN0IHY0bDJfZm9ybWF0ICpwZm10KQotewotCWludCByYyA9IDA7Ci0JLyogZ2V0IHRoZSB2aWRlbyBkZXZpY2UgKi8KLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSAgPSB2aWRlb19kcnZkYXRhKGYpOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdDsKLQlwY2FtX2luc3QgPSBjb250YWluZXJfb2YoZi0+cHJpdmF0ZV9kYXRhLAotCQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0LCBldmVudEhhbmRsZSk7Ci0KLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCVdBUk5fT04ocGN0eCAhPSBmLT5wcml2YXRlX2RhdGEpOwotCi0JaWYgKHBmbXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyYyA9IG1zbV9zZXJ2ZXJfZ2V0X2ZtdF9tcGxhbmUocGNhbSwgcGNhbV9pbnN0LT5teV9pbmRleCwgcGZtdCk7Ci0JRCgiJXM6IGN1cnJlbnRfZm10LT5mb3VyY2M6IDB4JTA4eCwgcmMgPSAlZFxuIiwgX19mdW5jX18sCi0JCQkJCXBmbXQtPmZtdC5waXhfbXAucGl4ZWxmb3JtYXQsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gd2lsbCByZWFkanVzdCB0aGUgZm9ybWF0IHBhcmFtZXRlcnMgYmFzZWQgaW4gSFcKLSAgY2FwYWJpbGl0aWVzLiBDYWxsZWQgYnkgc19mbXRfY2FwCi0qLwotc3RhdGljIGludCBtc21fY2FtZXJhX3Y0bDJfdHJ5X2ZtdF9jYXAoc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0JCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqcGZtdCkKLXsKLQlpbnQgcmMgPSAwOwotCS8qIGdldCB0aGUgdmlkZW8gZGV2aWNlICovCi0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0gID0gdmlkZW9fZHJ2ZGF0YShmKTsKLQotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JV0FSTl9PTihwY3R4ICE9IGYtPnByaXZhdGVfZGF0YSk7Ci0KLQltdXRleF9sb2NrKCZwY2FtLT52aWRfbG9jayk7Ci0JcmMgPSBtc21fc2VydmVyX3RyeV9mbXQocGNhbSwgcGZtdCk7Ci0JaWYgKHJjKQotCQlwcl9lcnIoIkZvcm1hdCAleCBub3QgZm91bmQsIHJjID0gJWRcbiIsCi0JCQkJcGZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCwgcmMpOwotCi0JbXV0ZXhfdW5sb2NrKCZwY2FtLT52aWRfbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9jYW1lcmFfdjRsMl90cnlfZm10X2NhcF9tcGxhbmUoc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0JCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqcGZtdCkKLXsKLQlpbnQgcmMgPSAwOwotCS8qIGdldCB0aGUgdmlkZW8gZGV2aWNlICovCi0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0gID0gdmlkZW9fZHJ2ZGF0YShmKTsKLQotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JV0FSTl9PTihwY3R4ICE9IGYtPnByaXZhdGVfZGF0YSk7Ci0KLQltdXRleF9sb2NrKCZwY2FtLT52aWRfbG9jayk7Ci0JcmMgPSBtc21fc2VydmVyX3RyeV9mbXRfbXBsYW5lKHBjYW0sIHBmbXQpOwotCWlmIChyYykKLQkJcHJfZXJyKCJGb3JtYXQgJXggbm90IGZvdW5kLCByYyA9ICVkXG4iLAotCQkJCXBmbXQtPmZtdC5waXhfbXAucGl4ZWxmb3JtYXQsIHJjKTsKLQotCW11dGV4X3VubG9jaygmcGNhbS0+dmlkX2xvY2spOwotCXJldHVybiByYzsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB3aWxsIHJlY29uZmlnIHRoZSB2NGwyIGRyaXZlciBhbmQgSFcgZGV2aWNlLCBpdCBzaG91bGQgYmUKLSAgIGNhbGxlZCBhZnRlciB0aGUgc3RyZWFtaW5nIGlzIHN0b3BwZWQuCi0qLwotc3RhdGljIGludCBtc21fY2FtZXJhX3Y0bDJfc19mbXRfY2FwKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKnBmbXQpCi17Ci0JaW50IHJjOwotCS8qIGdldCB0aGUgdmlkZW8gZGV2aWNlICovCi0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0gID0gdmlkZW9fZHJ2ZGF0YShmKTsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3Q7Ci0JcGNhbV9pbnN0ID0gY29udGFpbmVyX29mKGYtPnByaXZhdGVfZGF0YSwKLQkJc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCwgZXZlbnRIYW5kbGUpOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlEKCIlcywgaW5zdD0weCV4LGlkeD0lZCxwcml2ID0gMHglcFxuIiwKLQkJX19mdW5jX18sICh1MzIpcGNhbV9pbnN0LCBwY2FtX2luc3QtPm15X2luZGV4LAotCQkodm9pZCAqKXBmbXQtPmZtdC5waXgucHJpdik7Ci0JV0FSTl9PTihwY3R4ICE9IGYtPnByaXZhdGVfZGF0YSk7Ci0KLQltdXRleF9sb2NrKCZwY2FtLT52aWRfbG9jayk7Ci0KLQlyYyA9IG1zbV9zZXJ2ZXJfc2V0X2ZtdChwY2FtLCBwY2FtX2luc3QtPm15X2luZGV4LCBwZm10KTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IG1zbV9zZXJ2ZXJfc2V0X2ZtdCBFcnJvcjogJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwY2FtLT52aWRfbG9jayk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NhbWVyYV92NGwyX3NfZm10X2NhcF9tcGxhbmUoc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0JCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpwZm10KQotewotCWludCByYzsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSA9IHZpZGVvX2RydmRhdGEoZik7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0OwotCXBjYW1faW5zdCA9IGNvbnRhaW5lcl9vZihmLT5wcml2YXRlX2RhdGEsCi0JCQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0LCBldmVudEhhbmRsZSk7Ci0KLQlEKCIlcyBJbnN0ICVwXG4iLCBfX2Z1bmNfXywgcGNhbV9pbnN0KTsKLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQotCW11dGV4X2xvY2soJnBjYW0tPnZpZF9sb2NrKTsKLQlyYyA9IG1zbV9zZXJ2ZXJfc2V0X2ZtdF9tcGxhbmUocGNhbSwgcGNhbV9pbnN0LT5teV9pbmRleCwgcGZtdCk7Ci0JbXV0ZXhfdW5sb2NrKCZwY2FtLT52aWRfbG9jayk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50IG1zbV9jYW1lcmFfdjRsMl9nX2pwZWdjb21wKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCXN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiAqcGNvbXApCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JV0FSTl9PTihwY3R4ICE9IGYtPnByaXZhdGVfZGF0YSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NhbWVyYV92NGwyX3NfanBlZ2NvbXAoc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0JCQkJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpwY29tcCkKLXsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQotCXJldHVybiByYzsKLX0KLQotCi1zdGF0aWMgaW50IG1zbV9jYW1lcmFfdjRsMl9nX2Nyb3Aoc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0JCQkJCXN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSAgPSB2aWRlb19kcnZkYXRhKGYpOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdDsKLQotCXBjYW1faW5zdCA9IGNvbnRhaW5lcl9vZihmLT5wcml2YXRlX2RhdGEsCi0JCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QsIGV2ZW50SGFuZGxlKTsKLQotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JV0FSTl9PTihwY3R4ICE9IGYtPnByaXZhdGVfZGF0YSk7Ci0KLQltdXRleF9sb2NrKCZwY2FtLT52aWRfbG9jayk7Ci0JcmMgPSBtc21fc2VydmVyX2dldF9jcm9wKHBjYW0sIHBjYW1faW5zdC0+bXlfaW5kZXgsIGNyb3ApOwotCW11dGV4X3VubG9jaygmcGNhbS0+dmlkX2xvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fY2FtZXJhX3Y0bDJfc19jcm9wKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCQlzdHJ1Y3QgdjRsMl9jcm9wICphKQotewotCWludCByYyA9IC1FSU5WQUw7Ci0KLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCVdBUk5fT04ocGN0eCAhPSBmLT5wcml2YXRlX2RhdGEpOwotCi0JcmV0dXJuIHJjOwotfQotCi0vKiBTdHJlYW0gdHlwZS1kZXBlbmRlbnQgcGFyYW1ldGVyIGlvY3RscyAqLwotc3RhdGljIGludCBtc21fY2FtZXJhX3Y0bDJfZ19wYXJtKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKmEpCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50IG1zbV92aWRidWZfZ2V0X3BhdGgodTMyIGV4dGVuZGVkbW9kZSkKLXsKLQlzd2l0Y2ggKGV4dGVuZGVkbW9kZSkgewotCWNhc2UgTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9USFVNQk5BSUw6Ci0JCXJldHVybiBPVVRQVVRfVFlQRV9UOwotCWNhc2UgTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9NQUlOOgotCQlyZXR1cm4gT1VUUFVUX1RZUEVfUzsKLQljYXNlIE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfVklERU86Ci0JCXJldHVybiBPVVRQVVRfVFlQRV9WOwotCWNhc2UgTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9SREk6Ci0JCXJldHVybiBPVVRQVVRfVFlQRV9SOwotCWNhc2UgTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9SREkxOgotCQlyZXR1cm4gT1VUUFVUX1RZUEVfUjE7Ci0JY2FzZSBNU01fVjRMMl9FWFRfQ0FQVFVSRV9NT0RFX0FFQzoKLQkJcmV0dXJuIE9VVFBVVF9UWVBFX1NBRUM7Ci0JY2FzZSBNU01fVjRMMl9FWFRfQ0FQVFVSRV9NT0RFX0FGOgotCQlyZXR1cm4gT1VUUFVUX1RZUEVfU0FGQzsKLQljYXNlIE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfQVdCOgotCQlyZXR1cm4gT1VUUFVUX1RZUEVfU0FXQjsKLQljYXNlIE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfSUhJU1Q6Ci0JCXJldHVybiBPVVRQVVRfVFlQRV9JSFNUOwotCWNhc2UgTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9DU1RBOgotCQlyZXR1cm4gT1VUUFVUX1RZUEVfQ1NUQTsKLQljYXNlIE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfREVGQVVMVDoKLQljYXNlIE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfUFJFVklFVzoKLQlkZWZhdWx0OgotCQlyZXR1cm4gT1VUUFVUX1RZUEVfUDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NhbWVyYV92NGwyX3NfcGFybShzdHJ1Y3QgZmlsZSAqZiwgdm9pZCAqcGN0eCwKLQkJCQlzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICphKQotewotCWludCByYyA9IDA7Ci0JaW50IGlzX2JheWVyX3NlbnNvciA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0OwotCXBjYW1faW5zdCA9IGNvbnRhaW5lcl9vZihmLT5wcml2YXRlX2RhdGEsCi0JCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QsIGV2ZW50SGFuZGxlKTsKLQlwY2FtX2luc3QtPmltYWdlX21vZGUgPSAoYS0+cGFybS5jYXB0dXJlLmV4dGVuZGVkbW9kZSAmIDB4N0YpOwotCVNFVF9ERVZJRF9NT0RFKHBjYW1faW5zdC0+aW5zdF9oYW5kbGUsIHBjYW1faW5zdC0+cGNhbS0+dm5vZGVfaWQpOwotCVNFVF9JTUdfTU9ERShwY2FtX2luc3QtPmluc3RfaGFuZGxlLCBwY2FtX2luc3QtPmltYWdlX21vZGUpOwotCVNFVF9WSURFT19JTlNUX0lEWChwY2FtX2luc3QtPmluc3RfaGFuZGxlLCBwY2FtX2luc3QtPm15X2luZGV4KTsKLQlwY2FtX2luc3QtPnBjYW0tPmRldl9pbnN0X21hcFtwY2FtX2luc3QtPmltYWdlX21vZGVdID0gcGNhbV9pbnN0OwotCXBjYW1faW5zdC0+cGF0aCA9IG1zbV92aWRidWZfZ2V0X3BhdGgocGNhbV9pbnN0LT5pbWFnZV9tb2RlKTsKLQlpZiAocGNhbV9pbnN0LT5wY2FtLT5zZGF0YS0+c2Vuc29yX3R5cGUgPT0gQkFZRVJfU0VOU09SKQotCQlpc19iYXllcl9zZW5zb3IgPSAxOwotCXJjID0gbXNtX2NhbV9zZXJ2ZXJfY29uZmlnX2ludGVyZmFjZV9tYXAocGNhbV9pbnN0LT5pbWFnZV9tb2RlLAotCQkJcGNhbV9pbnN0LT5wY2FtLT5tY3RsX2hhbmRsZSwgcGNhbV9pbnN0LT5wY2FtLT52bm9kZV9pZCwKLQkJCWlzX2JheWVyX3NlbnNvcik7Ci0JRCgiJXMgcGF0aD0lZCwgcmM9JWRcbiIsIF9fZnVuY19fLAotCQlwY2FtX2luc3QtPnBhdGgsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NhbWVyYV92NGwyX3N1YnNjcmliZV9ldmVudChzdHJ1Y3QgdjRsMl9maCAqZmgsCi0JCQlzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24gKnN1YikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdDsKLQlwY2FtX2luc3QgPQotCQkoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqKWNvbnRhaW5lcl9vZihmaCwKLQkJc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCwgZXZlbnRIYW5kbGUpOwotCi0JRCgiJXM6ZmggPSAweCV4LCB0eXBlID0gMHgleFxuIiwgX19mdW5jX18sICh1MzIpZmgsIHN1Yi0+dHlwZSk7Ci0JaWYgKHBjYW1faW5zdC0+bXlfaW5kZXggIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHN1Yi0+dHlwZSA9PSBWNEwyX0VWRU5UX0FMTCkKLQkJc3ViLT50eXBlID0gVjRMMl9FVkVOVF9QUklWQVRFX1NUQVJUK01TTV9DQU1fQVBQX05PVElGWV9FVkVOVDsKLQlyYyA9IHY0bDJfZXZlbnRfc3Vic2NyaWJlKGZoLCBzdWIsIDMwKTsKLQlpZiAocmMgPCAwKQotCQlEKCIlczogZmFpbGVkIGZvciBldnRUeXBlID0gMHgleCwgcmMgPSAlZFxuIiwKLQkJCQkJCV9fZnVuY19fLCBzdWItPnR5cGUsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NhbWVyYV92NGwyX3Vuc3Vic2NyaWJlX2V2ZW50KHN0cnVjdCB2NGwyX2ZoICpmaCwKLQkJCXN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiAqc3ViKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0OwotCXBjYW1faW5zdCA9Ci0JCShzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICopY29udGFpbmVyX29mKGZoLAotCQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0LCBldmVudEhhbmRsZSk7Ci0KLQlEKCIlczogZmggPSAweCV4XG4iLCBfX2Z1bmNfXywgKHUzMilmaCk7Ci0JaWYgKHBjYW1faW5zdC0+bXlfaW5kZXggIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyYyA9IHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUoZmgsIHN1Yik7Ci0JRCgiJXM6IHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBtc21fY2FtZXJhX3Y0bDJfcHJpdmF0ZV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCi0JCQkJCSAgYm9vbCB2YWxpZF9wcmlvLCBpbnQgY21kLAotCQkJCQkgIHZvaWQgKmFyZykKLXsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXN0cnVjdCBtc21fY2FtZXJhX3Y0bDJfaW9jdGxfdCAqaW9jdGxfcHRyID0gYXJnOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtICA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0JRCgiJXM6IGNtZCAlZFxuIiwgX19mdW5jX18sIF9JT0NfTlIoY21kKSk7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgTVNNX0NBTV9WNEwyX0lPQ1RMX1BSSVZBVEVfU19DVFJMOgotCQlyYyA9IG1zbV9jYW1lcmFfdjRsMl9wcml2YXRlX3NfY3RybChmaWxlLCBmaCwgaW9jdGxfcHRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQ0FNX1Y0TDJfSU9DVExfUFJJVkFURV9HX0NUUkw6Ci0JCXJjID0gbXNtX2NhbWVyYV92NGwyX3ByaXZhdGVfZ19jdHJsKGZpbGUsIGZoLCBpb2N0bF9wdHIpOwotCQlicmVhazsKLQljYXNlIE1TTV9DQU1fVjRMMl9JT0NUTF9QUklWQVRFX0dFTkVSQUw6Ci0JCXJjID0gbXNtX2NhbWVyYV92NGwyX3ByaXZhdGVfZ2VuZXJhbChmaWxlLCBmaCwgaW9jdGxfcHRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQ0FNX1Y0TDJfSU9DVExfR0VUX0VWRU5UX1BBWUxPQUQ6IHsKLQkJc3RydWN0IG1zbV9xdWV1ZV9jbWQgKmV2ZW50X2NtZDsKLQkJdm9pZCAqcGF5bG9hZDsKLQkJbXV0ZXhfbG9jaygmcGNhbS0+ZXZlbnRfbG9jayk7Ci0JCWV2ZW50X2NtZCA9IG1zbV9kZXF1ZXVlKCZwY2FtLT5ldmVudERhdGFfcSwgbGlzdF9ldmVudGRhdGEpOwotCQlpZiAoIWV2ZW50X2NtZCkgewotCQkJcHJfZXJyKCIlczogTm8gZXZlbnQgcGF5bG9hZFxuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJbXV0ZXhfdW5sb2NrKCZwY2FtLT5ldmVudF9sb2NrKTsKLQkJCXJldHVybiByYzsKLQkJfQotCQlwYXlsb2FkID0gZXZlbnRfY21kLT5jb21tYW5kOwotCQlpZiAoZXZlbnRfY21kLT50cmFuc19jb2RlICE9IGlvY3RsX3B0ci0+dHJhbnNfY29kZSkgewotCQkJcHJfZXJyKCIlczogRXZlbnRzIGRvbid0IG1hdGNoXG4iLCBfX2Z1bmNfXyk7Ci0JCQlrZnJlZShwYXlsb2FkKTsKLQkJCWtmcmVlKGV2ZW50X2NtZCk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQltdXRleF91bmxvY2soJnBjYW0tPmV2ZW50X2xvY2spOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGlvY3RsX3B0ci0+bGVuID4gMCkgewotCQkJaWYgKGNvcHlfdG9fdXNlcihpb2N0bF9wdHItPmlvY3RsX3B0ciwgcGF5bG9hZCwKLQkJCQkgaW9jdGxfcHRyLT5sZW4pKSB7Ci0JCQkJcHJfZXJyKCIlcyBDb3B5IHRvIHVzZXIgZmFpbGVkIGZvciBjbWQgJWQiLAotCQkJCQlfX2Z1bmNfXywgY21kKTsKLQkJCQlrZnJlZShwYXlsb2FkKTsKLQkJCQlrZnJlZShldmVudF9jbWQpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQltdXRleF91bmxvY2soJnBjYW0tPmV2ZW50X2xvY2spOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWtmcmVlKHBheWxvYWQpOwotCQlrZnJlZShldmVudF9jbWQpOwotCQltdXRleF91bmxvY2soJnBjYW0tPmV2ZW50X2xvY2spOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzIFVuc3VwcG9ydGVkIGlvY3RsIGNtZCAlZCAiLCBfX2Z1bmNfXywgY21kKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotLyogdjRsMl9pb2N0bF9vcHMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgZ19tc21faW9jdGxfb3BzID0gewotCS52aWRpb2NfcXVlcnljYXAgPSBtc21fY2FtZXJhX3Y0bDJfcXVlcnljYXAsCi0KLQkudmlkaW9jX3NfY3JvcCA9IG1zbV9jYW1lcmFfdjRsMl9zX2Nyb3AsCi0JLnZpZGlvY19nX2Nyb3AgPSBtc21fY2FtZXJhX3Y0bDJfZ19jcm9wLAotCi0JLnZpZGlvY19xdWVyeWN0cmwgPSBtc21fY2FtZXJhX3Y0bDJfcXVlcnljdHJsLAotCS52aWRpb2NfZ19jdHJsID0gbXNtX2NhbWVyYV92NGwyX2dfY3RybCwKLQkudmlkaW9jX3NfY3RybCA9IG1zbV9jYW1lcmFfdjRsMl9zX2N0cmwsCi0KLQkudmlkaW9jX3JlcWJ1ZnMgPSBtc21fY2FtZXJhX3Y0bDJfcmVxYnVmcywKLQkudmlkaW9jX3F1ZXJ5YnVmID0gbXNtX2NhbWVyYV92NGwyX3F1ZXJ5YnVmLAotCS52aWRpb2NfcWJ1ZiA9IG1zbV9jYW1lcmFfdjRsMl9xYnVmLAotCS52aWRpb2NfZHFidWYgPSBtc21fY2FtZXJhX3Y0bDJfZHFidWYsCi0KLQkudmlkaW9jX3N0cmVhbW9uID0gbXNtX2NhbWVyYV92NGwyX3N0cmVhbW9uLAotCS52aWRpb2Nfc3RyZWFtb2ZmID0gbXNtX2NhbWVyYV92NGwyX3N0cmVhbW9mZiwKLQotCS8qIGZvcm1hdCBpb2N0bHMgKi8KLQkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAgPSBtc21fY2FtZXJhX3Y0bDJfZW51bV9mbXRfY2FwLAotCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcF9tcGxhbmUgPSBtc21fY2FtZXJhX3Y0bDJfZW51bV9mbXRfY2FwLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwID0gbXNtX2NhbWVyYV92NGwyX3RyeV9mbXRfY2FwLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwX21wbGFuZSA9IG1zbV9jYW1lcmFfdjRsMl90cnlfZm10X2NhcF9tcGxhbmUsCi0JLnZpZGlvY19nX2ZtdF92aWRfY2FwID0gbXNtX2NhbWVyYV92NGwyX2dfZm10X2NhcCwKLQkudmlkaW9jX2dfZm10X3ZpZF9jYXBfbXBsYW5lID0gbXNtX2NhbWVyYV92NGwyX2dfZm10X2NhcF9tcGxhbmUsCi0JLnZpZGlvY19zX2ZtdF92aWRfY2FwID0gbXNtX2NhbWVyYV92NGwyX3NfZm10X2NhcCwKLQkudmlkaW9jX3NfZm10X3ZpZF9jYXBfbXBsYW5lID0gbXNtX2NhbWVyYV92NGwyX3NfZm10X2NhcF9tcGxhbmUsCi0KLQkudmlkaW9jX2dfanBlZ2NvbXAgPSBtc21fY2FtZXJhX3Y0bDJfZ19qcGVnY29tcCwKLQkudmlkaW9jX3NfanBlZ2NvbXAgPSBtc21fY2FtZXJhX3Y0bDJfc19qcGVnY29tcCwKLQotCS8qIFN0cmVhbSB0eXBlLWRlcGVuZGVudCBwYXJhbWV0ZXIgaW9jdGxzICovCi0JLnZpZGlvY19nX3Bhcm0gPSAgbXNtX2NhbWVyYV92NGwyX2dfcGFybSwKLQkudmlkaW9jX3NfcGFybSA9ICBtc21fY2FtZXJhX3Y0bDJfc19wYXJtLAotCi0JLyogZXZlbnQgc3Vic2NyaWJlL3Vuc3Vic2NyaWJlICovCi0JLnZpZGlvY19zdWJzY3JpYmVfZXZlbnQgPSBtc21fY2FtZXJhX3Y0bDJfc3Vic2NyaWJlX2V2ZW50LAotCS52aWRpb2NfdW5zdWJzY3JpYmVfZXZlbnQgPSBtc21fY2FtZXJhX3Y0bDJfdW5zdWJzY3JpYmVfZXZlbnQsCi0JLnZpZGlvY19kZWZhdWx0ID0gbXNtX2NhbWVyYV92NGwyX3ByaXZhdGVfaW9jdGwsCi19OwotCi0vKiB2NGwyX2ZpbGVfb3BlcmF0aW9ucyAqLwotc3RhdGljIGludCBtc21fb3BlbihzdHJ1Y3QgZmlsZSAqZikKLXsKLQlpbnQgaSwgcmMgPSAtRUlOVkFMOwotI2lmZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0JaW50IGlvbl9jbGllbnRfY3JlYXRlZCA9IDA7Ci0jZW5kaWYKLQlpbnQgc2VydmVyX3FfaWR4ID0gMDsKLQkvKiBnZXQgdGhlIHZpZGVvIGRldmljZSAqLwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtICA9IHZpZGVvX2RydmRhdGEoZik7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0OwotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsID0gTlVMTDsKLQotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIXBjYW0pIHsKLQkJcHJfZXJyKCIlcyBOVUxMIHBvaW50ZXIgcGFzc2VkIGluIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCWlmICghbXNtX3NlcnZlcl9nZXRfdXNlY291bnQoKSkgewotCQlwcl9lcnIoIiVzOiBlcnJvciwgZGFlbW9uIG5vdCB5ZXQgc3RhcnRlZC4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQltdXRleF9sb2NrKCZwY2FtLT52aWRfbG9jayk7Ci0JZm9yIChpID0gMDsgaSA8IE1TTV9ERVZfSU5TVF9NQVg7IGkrKykgewotCQlpZiAocGNhbS0+ZGV2X2luc3RbaV0gPT0gTlVMTCkKLQkJCWJyZWFrOwotCX0KLQotCS8qIGlmIG5vIGluc3RhbmNlIGlzIGF2YWlsYWJsZSwgcmV0dXJuIGVycm9yICovCi0JaWYgKGkgPT0gTVNNX0RFVl9JTlNUX01BWCkgewotCQltdXRleF91bmxvY2soJnBjYW0tPnZpZF9sb2NrKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlwY2FtX2luc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwY2FtX2luc3QpIHsKLQkJbXV0ZXhfdW5sb2NrKCZwY2FtLT52aWRfbG9jayk7Ci0JCXJldHVybiByYzsKLQl9Ci0JbXV0ZXhfaW5pdCgmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCXBjYW1faW5zdC0+c2Vuc29yX3B4bGNvZGUgPSBwY2FtLT51c3JfZm10c1swXS5weGxjb2RlOwotCXBjYW1faW5zdC0+bXlfaW5kZXggPSBpOwotCXBjYW1faW5zdC0+cGNhbSA9IHBjYW07Ci0JcGNhbS0+ZGV2X2luc3RbaV0gPSBwY2FtX2luc3Q7Ci0KLQlEKCIlcyBpbmRleCAlZCBub2RlaWQgJWQgY291bnQgJWRcbiIsIF9fZnVuY19fLAotCQkJcGNhbV9pbnN0LT5teV9pbmRleCwKLQkJCXBjYW0tPnZub2RlX2lkLCBwY2FtLT51c2VfY291bnQpOwotCXBjYW0tPnVzZV9jb3VudCsrOwotCUQoIiVzIEluc3QgJXAgdXNlX2NvdW50ICVkXG4iLCBfX2Z1bmNfXywgcGNhbV9pbnN0LCBwY2FtLT51c2VfY291bnQpOwotCWlmIChwY2FtLT51c2VfY291bnQgPT0gMSkgewotCQlzZXJ2ZXJfcV9pZHggPSBtc21fZmluZF9mcmVlX3F1ZXVlKCk7Ci0JCWlmIChzZXJ2ZXJfcV9pZHggPCAwKQotCQkJcmV0dXJuIHNlcnZlcl9xX2lkeDsKLQkJcmMgPSBtc21fc2VydmVyX2JlZ2luX3Nlc3Npb24ocGNhbSwgc2VydmVyX3FfaWR4KTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlcyBlcnJvciBzdGFydGluZyBzZXJ2ZXIgc2Vzc2lvbiAiLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIG1zbV9jYW1fc2VydmVyX2JlZ2luX3Nlc3Npb25fZmFpbGVkOwotCQl9Ci0JCXBtY3RsID0gbXNtX2NhbV9zZXJ2ZXJfZ2V0X21jdGwocGNhbS0+bWN0bF9oYW5kbGUpOwotCQlpZiAoIXBtY3RsKSB7Ci0JCQlwcl9lcnIoIiVzIG1jdGwgcHRyIGlzIG51bGwgIiwgX19mdW5jX18pOwotCQkJZ290byBtc21fY2FtX3NlcnZlcl9iZWdpbl9zZXNzaW9uX2ZhaWxlZDsKLQkJfQotI2lmZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0JCXBtY3RsLT5jbGllbnQgPSBtc21faW9uX2NsaWVudF9jcmVhdGUoLTEsICJjYW1lcmEiKTsKLQkJa3JlZl9pbml0KCZwbWN0bC0+cmVmY291bnQpOwotCQlpb25fY2xpZW50X2NyZWF0ZWQgPSAxOwotI2VuZGlmCi0KLQkJLyogU2hvdWxkIGJlIHNldCB0byBzZW5zb3Igb3BzIGlmIGFueSBidXQgcmlnaHQgbm93IGl0cyBPSyEhICovCi0JCWlmICghcG1jdGwtPm1jdGxfb3BlbikgewotCQkJRCgiJXM6IG1lZGlhIGNvbnRvbGxlciBpcyBub3QgaW5pdGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIG1jdGxfb3Blbl9mYWlsZWQ7Ci0JCX0KLQotCQkvKiBOb3cgd2UgcmVhbGx5IGhhdmUgdG8gYWN0aXZhdGUgdGhlIGNhbWVyYSAqLwotCQlEKCIlczogY2FsbCBtY3RsX29wZW5cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSBwbWN0bC0+bWN0bF9vcGVuKHBtY3RsLCBNU01fQVBQU19JRF9WNEwyKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogSFcgb3BlbiBmYWlsZWQgcmMgPSAweCV4XG4iLCAgX19mdW5jX18sIHJjKTsKLQkJCWdvdG8gbWN0bF9vcGVuX2ZhaWxlZDsKLQkJfQotCQlwbWN0bC0+cGNhbV9wdHIgPSBwY2FtOwotCi0JCW1zbV9zZXR1cF92NGwyX2V2ZW50X3F1ZXVlKCZwY2FtX2luc3QtPmV2ZW50SGFuZGxlLAotCQkJcGNhbS0+cHZkZXYpOwotCQltdXRleF9pbml0KCZwY2FtLT5ldmVudF9sb2NrKTsKLQkJbXNtX3F1ZXVlX2luaXQoJnBjYW0tPmV2ZW50RGF0YV9xLCAiZXZlbnREYXRhIik7Ci0JfQotCXBjYW1faW5zdC0+dmJxdWV1ZV9pbml0aWFsaXplZCA9IDA7Ci0JcmMgPSAwOwotCi0JZi0+cHJpdmF0ZV9kYXRhID0gJnBjYW1faW5zdC0+ZXZlbnRIYW5kbGU7Ci0KLQlEKCJmLT5wcml2YXRlX2RhdGEgPSAweCV4LCBwY2FtID0gMHgleFxuIiwKLQkJKHUzMilmLT5wcml2YXRlX2RhdGEsICh1MzIpcGNhbV9pbnN0KTsKLQotCWlmIChwY2FtLT51c2VfY291bnQgPT0gMSkgewotCQlyYyA9IG1zbV9zZW5kX29wZW5fc2VydmVyKHBjYW0pOwotCQlpZiAocmMgPCAwICYmIHJjICE9IC1FUkVTVEFSVFNZUykgewotCQkJcHJfZXJyKCIlczogbXNtX3NlbmRfb3Blbl9zZXJ2ZXIgZmFpbGVkICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlnb3RvIG1zbV9zZW5kX29wZW5fc2VydmVyX2ZhaWxlZDsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJnBjYW0tPnZpZF9sb2NrKTsKLQlEKCIlczogZW5kXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHJjOwotCi1tc21fc2VuZF9vcGVuX3NlcnZlcl9mYWlsZWQ6Ci0JbXNtX2RyYWluX2V2ZW50cSgmcGNhbS0+ZXZlbnREYXRhX3EpOwotCW1zbV9kZXN0cm95X3Y0bDJfZXZlbnRfcXVldWUoJnBjYW1faW5zdC0+ZXZlbnRIYW5kbGUpOwotCi0JaWYgKHBtY3RsLT5tY3RsX3JlbGVhc2UpCi0JCXBtY3RsLT5tY3RsX3JlbGVhc2UocG1jdGwpOwotbWN0bF9vcGVuX2ZhaWxlZDoKLQlpZiAocGNhbS0+dXNlX2NvdW50ID09IDEpIHsKLSNpZmRlZiBDT05GSUdfTVNNX01VTFRJTUVESUFfVVNFX0lPTgotCQlpZiAoaW9uX2NsaWVudF9jcmVhdGVkKSB7Ci0JCQlEKCIlczogZGVzdHJveSBpb24gY2xpZW50IiwgX19mdW5jX18pOwotCQkJa3JlZl9wdXQoJnBtY3RsLT5yZWZjb3VudCwgbXNtX3JlbGVhc2VfaW9uX2NsaWVudCk7Ci0JCX0KLSNlbmRpZgotCQlpZiAobXNtX3NlcnZlcl9lbmRfc2Vzc2lvbihwY2FtKSA8IDApCi0JCQlwcl9lcnIoIiVzOiBtc21fc2VydmVyX2VuZF9zZXNzaW9uIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JfQotbXNtX2NhbV9zZXJ2ZXJfYmVnaW5fc2Vzc2lvbl9mYWlsZWQ6Ci0JaWYgKHBjYW0tPnVzZV9jb3VudCA9PSAxKSB7Ci0JCXBjYW0tPmRldl9pbnN0W2ldID0gTlVMTDsKLQkJcGNhbS0+dXNlX2NvdW50ID0gMDsKLQl9Ci0JcGNhbS0+ZGV2X2luc3RbaV0gPSBOVUxMOwotCW11dGV4X3VubG9jaygmcGNhbS0+dmlkX2xvY2spOwotCW11dGV4X2Rlc3Ryb3koJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQlrZnJlZShwY2FtX2luc3QpOwotCXByX2VycigiJXM6IGVycm9yIGVuZCIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FkZHJfcmVtYXAoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0LAotCQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCWludCBwaHlhZGRyOwotCWludCByZXR2YWw7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqbWN0bDsKLQotCW1jdGwgPSBtc21fY2FtX3NlcnZlcl9nZXRfbWN0bChwY2FtX2luc3QtPnBjYW0tPm1jdGxfaGFuZGxlKTsKLQlpZiAoIW1jdGwpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBtY3RsIHBvaW50ZXIiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJjID0gbXNtX3BtZW1fcmVnaW9uX2dldF9waHlfYWRkcigmbWN0bC0+c3RhdHNfaW5mby5wbWVtX3N0YXRzX2xpc3QsCi0JCQkmcGNhbV9pbnN0LT5tZW1fbWFwLAotCQkJJnBoeWFkZHIpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBjYW5ub3QgbWFwIHZhZGRyIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0Jc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKLQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOwotCXJldHZhbCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCi0JCQlwaHlhZGRyID4+IFBBR0VfU0hJRlQsCi0JCQlzaXplLCB2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0JaWYgKHJldHZhbCkgewotCQlwcl9lcnIoIiVzOm1tYXA6IHJlbWFwIGZhaWxlZCB3aXRoIGVycm9yICVkLiAiLAotCQkJICAgX19mdW5jX18sIHJldHZhbCk7Ci0JCW1lbXNldCgmcGNhbV9pbnN0LT5tZW1fbWFwLCAwLCBzaXplb2YocGNhbV9pbnN0LT5tZW1fbWFwKSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlEKCIlczptbWFwOiBwaHlfYWRkcj0weCV4OiAlMDhseC0lMDhseCwgcGdvZmYgJTA4bHhcbiIsCi0JCSAgIF9fZnVuY19fLCAodWludDMyX3QpcGh5YWRkciwKLQkJICAgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIHZtYS0+dm1fcGdvZmYpOwotCW1lbXNldCgmcGNhbV9pbnN0LT5tZW1fbWFwLCAwLCBzaXplb2YocGNhbV9pbnN0LT5tZW1fbWFwKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX21tYXAoc3RydWN0IGZpbGUgKmYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0OwotCXBjYW1faW5zdCA9IGNvbnRhaW5lcl9vZihmLT5wcml2YXRlX2RhdGEsCi0JCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QsIGV2ZW50SGFuZGxlKTsKLQotCUQoIm1tYXAgY2FsbGVkLCB2bWE9MHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpdm1hKTsKLQotCWlmIChwY2FtX2luc3QtPmlzX21lbV9tYXBfaW5zdCAmJgotCQlwY2FtX2luc3QtPm1lbV9tYXAuY29va2llKSB7Ci0JCXJjID0gbXNtX2FkZHJfcmVtYXAocGNhbV9pbnN0LCB2bWEpOwotCQlEKCIlczogbXNtX2FkZHJfcmVtYXAgcmV0PSVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfSBlbHNlCi0JCXJjID0gdmIyX21tYXAoJnBjYW1faW5zdC0+dmlkX2J1ZnEsIHZtYSk7Ci0JRCgidm1hIHN0YXJ0PTB4JTA4bHgsIHNpemU9JWxkLCByZXQ9JWRcbiIsCi0JCSh1bnNpZ25lZCBsb25nKXZtYS0+dm1fc3RhcnQsCi0JCSh1bnNpZ25lZCBsb25nKXZtYS0+dm1fZW5kIC0gKHVuc2lnbmVkIGxvbmcpdm1hLT52bV9zdGFydCwKLQkJcmMpOwotCi0JcmV0dXJuIHJjOwotfQotCi12b2lkIG1zbV9yZWxlYXNlX2lvbl9jbGllbnQoc3RydWN0IGtyZWYgKnJlZikKLXsKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICptY3RsID0gY29udGFpbmVyX29mKHJlZiwKLQkJc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciwgcmVmY291bnQpOwotCXByX2VycigiJXMgQ2FsbGluZyBpb25fY2xpZW50X2Rlc3Ryb3lcbiIsIF9fZnVuY19fKTsKLQlpb25fY2xpZW50X2Rlc3Ryb3kobWN0bC0+Y2xpZW50KTsKLX0KLQotc3RhdGljIGludCBtc21fY2xvc2Uoc3RydWN0IGZpbGUgKmYpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbTsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3Q7Ci0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGw7Ci0JcGNhbV9pbnN0ID0gY29udGFpbmVyX29mKGYtPnByaXZhdGVfZGF0YSwKLQkJc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCwgZXZlbnRIYW5kbGUpOwotCXBjYW0gPSBwY2FtX2luc3QtPnBjYW07Ci0JaWYgKCFwY2FtKSB7Ci0JCXByX2VycigiJXMgTlVMTCBwb2ludGVyIG9mIGNhbWVyYSBkZXZpY2UhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXBtY3RsID0gbXNtX2NhbV9zZXJ2ZXJfZ2V0X21jdGwocGNhbS0+bWN0bF9oYW5kbGUpOwotCWlmICghcG1jdGwpIHsKLQkJcHJfZXJyKCIlcyBOVUxMIG1jdGwgcG9pbnRlclxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF9sb2NrKCZwY2FtLT52aWRfbG9jayk7Ci0JbXV0ZXhfbG9jaygmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCi0JaWYgKHBjYW1faW5zdC0+c3RyZWFtb24pIHsKLQkJLypzb21ldGhpbmcgd2VudCB3cm9uZyBzaW5jZSBpbnN0YW5jZQotCQlpcyBjbG9zaW5nIHdpdGhvdXQgc3RyZWFtb2ZmKi8KLQkJaWYgKHBtY3RsLT5tY3RsX3JlbGVhc2UpCi0JCQlwbWN0bC0+bWN0bF9yZWxlYXNlKHBtY3RsKTsKLQkJcG1jdGwtPm1jdGxfcmVsZWFzZSA9IE5VTEw7LypzbyB0aGF0IGl0IGlzbid0IGNsb3NlZCBhZ2FpbiovCi0JfQotCi0JcGNhbV9pbnN0LT5zdHJlYW1vbiA9IDA7Ci0JcGNhbS0+dXNlX2NvdW50LS07Ci0JcGNhbS0+ZGV2X2luc3RfbWFwW3BjYW1faW5zdC0+aW1hZ2VfbW9kZV0gPSBOVUxMOwotCWlmIChwY2FtX2luc3QtPnZicXVldWVfaW5pdGlhbGl6ZWQpCi0JCXZiMl9xdWV1ZV9yZWxlYXNlKCZwY2FtX2luc3QtPnZpZF9idWZxKTsKLQlEKCIlcyBDbG9zaW5nIGRvd24gaW5zdGFuY2UgJXAgIiwgX19mdW5jX18sIHBjYW1faW5zdCk7Ci0JRCgiJXMgaW5kZXggJWQgbm9kZWlkICVkIGNvdW50ICVkXG4iLCBfX2Z1bmNfXywgcGNhbV9pbnN0LT5teV9pbmRleCwKLQkJcGNhbS0+dm5vZGVfaWQsIHBjYW0tPnVzZV9jb3VudCk7Ci0JcGNhbS0+ZGV2X2luc3RbcGNhbV9pbnN0LT5teV9pbmRleF0gPSBOVUxMOwotCWlmIChwY2FtX2luc3QtPm15X2luZGV4ID09IDApIHsKLQkJbXV0ZXhfbG9jaygmcGNhbS0+ZXZlbnRfbG9jayk7Ci0JCW1zbV9kcmFpbl9ldmVudHEoJnBjYW0tPmV2ZW50RGF0YV9xKTsKLQkJbXV0ZXhfdW5sb2NrKCZwY2FtLT5ldmVudF9sb2NrKTsKLQkJbXV0ZXhfZGVzdHJveSgmcGNhbS0+ZXZlbnRfbG9jayk7Ci0JCW1zbV9kZXN0cm95X3Y0bDJfZXZlbnRfcXVldWUoJnBjYW1faW5zdC0+ZXZlbnRIYW5kbGUpOwotCX0KLQotCUNMUl9WSURFT19JTlNUX0lEWChwY2FtX2luc3QtPmluc3RfaGFuZGxlKTsKLQlDTFJfSU1HX01PREUocGNhbV9pbnN0LT5pbnN0X2hhbmRsZSk7Ci0JQ0xSX0RFVklEX01PREUocGNhbV9pbnN0LT5pbnN0X2hhbmRsZSk7Ci0JbXV0ZXhfdW5sb2NrKCZwY2FtX2luc3QtPmluc3RfbG9jayk7Ci0JbXV0ZXhfZGVzdHJveSgmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCWtmcmVlKHBjYW1faW5zdCk7Ci0JZi0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQotCWlmIChwY2FtLT51c2VfY291bnQgPT0gMCkgewotCQlpZiAobXNtX3NlcnZlcl9nZXRfdXNlY291bnQoKSA+IDApIHsKLQkJCXJjID0gbXNtX3NlbmRfY2xvc2Vfc2VydmVyKHBjYW0pOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlwcl9lcnIoIm1zbV9zZW5kX2Nsb3NlX3NlcnZlciBmYWlsZWQgJWRcbiIsIHJjKTsKLQkJfQotCi0JCWlmIChwbWN0bC0+bWN0bF9yZWxlYXNlKQotCQkJcG1jdGwtPm1jdGxfcmVsZWFzZShwbWN0bCk7Ci0KLSNpZmRlZiBDT05GSUdfTVNNX01VTFRJTUVESUFfVVNFX0lPTgotCQlrcmVmX3B1dCgmcG1jdGwtPnJlZmNvdW50LCBtc21fcmVsZWFzZV9pb25fY2xpZW50KTsKLSNlbmRpZgotCQlyYyA9IG1zbV9zZXJ2ZXJfZW5kX3Nlc3Npb24ocGNhbSk7Ci0JCWlmIChyYyA8IDApCi0JCQlwcl9lcnIoIm1zbV9zZXJ2ZXJfZW5kX3Nlc3Npb24gZmFpbHMgJWRcbiIsIHJjKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwY2FtLT52aWRfbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IG1zbV9wb2xsKHN0cnVjdCBmaWxlICpmLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbTsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3Q7Ci0JcGNhbV9pbnN0ID0gY29udGFpbmVyX29mKGYtPnByaXZhdGVfZGF0YSwKLQkJc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCwgZXZlbnRIYW5kbGUpOwotCXBjYW0gPSBwY2FtX2luc3QtPnBjYW07Ci0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAoIXBjYW0pIHsKLQkJcHJfZXJyKCIlcyBOVUxMIHBvaW50ZXIgb2YgY2FtZXJhIGRldmljZSFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChwY2FtX2luc3QtPm15X2luZGV4ID09IDApIHsKLQkJcG9sbF93YWl0KGYsICYocGNhbV9pbnN0LT5ldmVudEhhbmRsZS53YWl0KSwgd2FpdCk7Ci0JCWlmICh2NGwyX2V2ZW50X3BlbmRpbmcoJnBjYW1faW5zdC0+ZXZlbnRIYW5kbGUpKQotCQkJcmMgfD0gUE9MTFBSSTsKLQl9IGVsc2UgewotCQlpZiAoIXBjYW1faW5zdC0+dmlkX2J1ZnEuc3RyZWFtaW5nKSB7Ci0JCQlEKCIlcyB2aWRfYnVmcS5zdHJlYW1pbmcgaXMgb2ZmLCBpbnN0PTB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgKHUzMilwY2FtX2luc3QpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJcmMgfD0gdmIyX3BvbGwoJnBjYW1faW5zdC0+dmlkX2J1ZnEsIGYsIHdhaXQpOwotCX0KLQlEKCIlcyByZXR1cm5zLCByYyAgPSAweCV4XG4iLCBfX2Z1bmNfXywgcmMpOwotCXJldHVybiByYzsKLX0KLQotbG9uZyBtc21fdjRsMl9ldnRfbm90aWZ5KHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKm1jdGwsCi0JdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBldnQpCi17Ci0Jc3RydWN0IHY0bDJfZXZlbnQgdjRsMl9ldjsKLQlzdHJ1Y3QgdjRsMl9ldmVudF9hbmRfcGF5bG9hZCBldnRfcGF5bG9hZDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSA9IE5VTEw7Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqZXZlbnRfcWNtZDsKLQl2b2lkICpwYXlsb2FkOwotCWlmICghbWN0bCkgewotCQlwcl9lcnIoIiVzOiBtY3RsIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZldnRfcGF5bG9hZCwgKHZvaWQgX191c2VyICopZXZ0LAotCQlzaXplb2Yoc3RydWN0IHY0bDJfZXZlbnRfYW5kX3BheWxvYWQpKSkgewotCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JdjRsMl9ldiA9IGV2dF9wYXlsb2FkLmV2dDsKLQl2NGwyX2V2LmlkID0gMDsKLQlwY2FtID0gbWN0bC0+cGNhbV9wdHI7Ci0Ja3RpbWVfZ2V0X3RzKCZ2NGwyX2V2LnRpbWVzdGFtcCk7Ci0JaWYgKGV2dF9wYXlsb2FkLnBheWxvYWRfbGVuZ3RoID4gMCAmJiBldnRfcGF5bG9hZC5wYXlsb2FkICE9IE5VTEwpIHsKLQkJbXV0ZXhfbG9jaygmcGNhbS0+ZXZlbnRfbG9jayk7Ci0JCWV2ZW50X3FjbWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCksIEdGUF9LRVJORUwpOwotCQlpZiAoIWV2ZW50X3FjbWQpIHsKLQkJCXByX2VycigiJXMgSW5zdWZmaWNpZW50IG1lbW9yeS4gcmV0dXJuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBldmVudF9xY21kX2FsbG9jX2ZhaWw7Ci0JCX0KLQkJcGF5bG9hZCA9IGt6YWxsb2MoZXZ0X3BheWxvYWQucGF5bG9hZF9sZW5ndGgsIEdGUF9LRVJORUwpOwotCQlpZiAoIXBheWxvYWQpIHsKLQkJCXByX2VycigiJXMgSW5zdWZmaWNpZW50IG1lbW9yeS4gcmV0dXJuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwYXlsb2FkX2FsbG9jX2ZhaWw7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKHBheWxvYWQsCi0JCQkJKHZvaWQgX191c2VyICopZXZ0X3BheWxvYWQucGF5bG9hZCwKLQkJCQlldnRfcGF5bG9hZC5wYXlsb2FkX2xlbmd0aCkpIHsKLQkJCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBjb3B5X2Zyb21fdXNlcl9mYWlsZWQ7Ci0JCX0KLQkJZXZlbnRfcWNtZC0+Y29tbWFuZCA9IHBheWxvYWQ7Ci0JCWV2ZW50X3FjbWQtPnRyYW5zX2NvZGUgPSBldnRfcGF5bG9hZC50cmFuc2FjdGlvbl9pZDsKLQkJbXNtX2VucXVldWUoJnBjYW0tPmV2ZW50RGF0YV9xLCAmZXZlbnRfcWNtZC0+bGlzdF9ldmVudGRhdGEpOwotCQltdXRleF91bmxvY2soJnBjYW0tPmV2ZW50X2xvY2spOwotCX0KLQl2NGwyX2V2ZW50X3F1ZXVlKHBjYW0tPnB2ZGV2LCAmdjRsMl9ldik7Ci0JcmV0dXJuIHJjOwotY29weV9mcm9tX3VzZXJfZmFpbGVkOgotCWtmcmVlKHBheWxvYWQpOwotcGF5bG9hZF9hbGxvY19mYWlsOgotCWtmcmVlKGV2ZW50X3FjbWQpOwotZXZlbnRfcWNtZF9hbGxvY19mYWlsOgotCXJldHVybiByYzsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIGdfbXNtX2ZvcHMgPSB7Ci0JLm93bmVyICAgPSBUSElTX01PRFVMRSwKLQkub3Blbgk9IG1zbV9vcGVuLAotCS5wb2xsCT0gbXNtX3BvbGwsCi0JLm1tYXAJPSBtc21fbW1hcCwKLQkucmVsZWFzZSA9IG1zbV9jbG9zZSwKLQkuaW9jdGwgICA9IHZpZGVvX2lvY3RsMiwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2NhbV9kZXZfaW5pdChzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSkKLXsKLQlpbnQgcmMgPSAtRU5PTUVNOwotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnB2ZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gTlVMTDsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gTlVMTDsKLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCi0JLyogZmlyc3QgcmVnaXN0ZXIgdGhlIHY0bDIgZGV2aWNlICovCi0JaWYgKHBjYW0tPnNlbnNvcl9zZGV2LT5mbGFncyAmIFY0TDJfU1VCREVWX0ZMX0lTX0kyQykgewotCQljbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHBjYW0tPnNlbnNvcl9zZGV2KTsKLQkJcGNhbS0+djRsMl9kZXYuZGV2ID0gJmNsaWVudC0+ZGV2OwotCQlwY2FtLT5tZWRpYV9kZXYuZGV2ID0gJmNsaWVudC0+ZGV2OwotCX0gZWxzZSB7Ci0JCXBkZXYgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHBjYW0tPnNlbnNvcl9zZGV2KTsKLQkJcGNhbS0+djRsMl9kZXYuZGV2ID0gJnBkZXYtPmRldjsKLQkJcGNhbS0+bWVkaWFfZGV2LmRldiA9ICZwZGV2LT5kZXY7Ci0JfQotCi0JcmMgPSB2NGwyX2RldmljZV9yZWdpc3RlcihwY2FtLT52NGwyX2Rldi5kZXYsICZwY2FtLT52NGwyX2Rldik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZWxzZQotCQlwY2FtLT52NGwyX2Rldi5ub3RpZnkgPSBtc21fY2FtX3Y0bDJfc3ViZGV2X25vdGlmeTsKLQotCi0JLyogbm93IHNldHVwIHZpZGVvIGRldmljZSAqLwotCXB2ZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7Ci0JaWYgKHB2ZGV2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdmlkZW9fZGV2aWNlX2FsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0Jc3RybGNweShwY2FtLT5tZWRpYV9kZXYubW9kZWwsIFFDQU1FUkFfTkFNRSwKLQkJCXNpemVvZihwY2FtLT5tZWRpYV9kZXYubW9kZWwpKTsKLQlyYyA9IG1lZGlhX2RldmljZV9yZWdpc3RlcigmcGNhbS0+bWVkaWFfZGV2KTsKLQlwdmRldi0+djRsMl9kZXYgPSAmcGNhbS0+djRsMl9kZXY7Ci0JcGNhbS0+djRsMl9kZXYubWRldiA9ICZwY2FtLT5tZWRpYV9kZXY7Ci0KLQkvKiBpbml0IHZpZGVvIGRldmljZSdzIGRyaXZlciBpbnRlcmZhY2UgKi8KLQlEKCJzZW5zb3IgbmFtZSA9ICVzLCBzaXplb2YocHZkZXYtPm5hbWUpPSVkXG4iLAotCQlwY2FtLT5zZW5zb3Jfc2Rldi0+bmFtZSwgc2l6ZW9mKHB2ZGV2LT5uYW1lKSk7Ci0KLQkvKiBkZXZpY2UgaW5mbyAtIHN0cmxjcHkgaXMgc2FmZXIgdGhhbiBzdHJuY3B5IGJ1dAotCSAgIG9ubHkgaWYgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzKi8KLQlzdHJsY3B5KHB2ZGV2LT5uYW1lLCBwY2FtLT5zZW5zb3Jfc2Rldi0+bmFtZSwgc2l6ZW9mKHB2ZGV2LT5uYW1lKSk7Ci0KLQlwdmRldi0+cmVsZWFzZSAgID0gdmlkZW9fZGV2aWNlX3JlbGVhc2U7Ci0JcHZkZXYtPmZvcHMJICAgICA9ICZnX21zbV9mb3BzOwotCXB2ZGV2LT5pb2N0bF9vcHMgPSAmZ19tc21faW9jdGxfb3BzOwotCXB2ZGV2LT5taW5vcgkgPSAtMTsKLQlwdmRldi0+dmZsX3R5cGUgID0gVkZMX1RZUEVfR1JBQkJFUjsKLQotCW1lZGlhX2VudGl0eV9pbml0KCZwdmRldi0+ZW50aXR5LCAwLCBOVUxMLCAwKTsKLQlwdmRldi0+ZW50aXR5LnR5cGUgPSBNRURJQV9FTlRfVF9ERVZOT0RFX1Y0TDsKLQlwdmRldi0+ZW50aXR5Lmdyb3VwX2lkID0gUUNBTUVSQV9WTk9ERV9HUk9VUF9JRDsKLQotCS8qIHJlZ2lzdGVyIHY0bDIgdmlkZW8gZGV2aWNlIHRvIGtlcm5lbCBhcyAvZGV2L3ZpZGVvWFggKi8KLQlEKCJ2aWRlb19yZWdpc3Rlcl9kZXZpY2VcbiIpOwotCXJjID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHB2ZGV2LAotCQkJCQlWRkxfVFlQRV9HUkFCQkVSLAotCQkJCQltc21fY2FtZXJhX3Y0bDJfbnIpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiB2aWRlb19yZWdpc3Rlcl9kZXZpY2UgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gcmVnX2ZhaWw7Ci0JfQotCXB2ZGV2LT5lbnRpdHkubmFtZSA9IHZpZGVvX2RldmljZV9ub2RlX25hbWUocHZkZXYpOwotCUQoIiVzOiB2aWRlbyBkZXZpY2UgcmVnaXN0ZXJlZCBhcyAvZGV2L3ZpZGVvJWRcbiIsCi0JCV9fZnVuY19fLCBwdmRldi0+bnVtKTsKLQotCS8qIGNvbm5lY3QgcGNhbSBhbmQgdmlkZW8gZGV2IHRvIGVhY2ggb3RoZXIgKi8KLQlwY2FtLT5wdmRldgk9IHB2ZGV2OwotCXZpZGVvX3NldF9kcnZkYXRhKHBjYW0tPnB2ZGV2LCBwY2FtKTsKLQotCXJldHVybiByYzsKLQotcmVnX2ZhaWw6Ci0JdmlkZW9fZGV2aWNlX3JlbGVhc2UocHZkZXYpOwotCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJnBjYW0tPnY0bDJfZGV2KTsKLQlwY2FtLT52NGwyX2Rldi5kZXYgPSBOVUxMOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldiAqbXNtX2FjdHVhdG9yX3Byb2JlKAotCXN0cnVjdCBtc21fYWN0dWF0b3JfaW5mbyAqYWN0dWF0b3JfaW5mbykKLXsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmFjdF9zZGV2OwotCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9hY3R1YXRvcl9jdHJsX3QgKmFjdHJsOwotCXZvaWQgKmFjdF9jbGllbnQgPSBOVUxMOwotCi0JRCgiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIWFjdHVhdG9yX2luZm8gfHwgIWFjdHVhdG9yX2luZm8tPmJvYXJkX2luZm8pCi0JCWdvdG8gcHJvYmVfZmFpbDsKLQotCWFkYXB0ZXIgPSBpMmNfZ2V0X2FkYXB0ZXIoYWN0dWF0b3JfaW5mby0+YnVzX2lkKTsKLQlpZiAoIWFkYXB0ZXIpCi0JCWdvdG8gcHJvYmVfZmFpbDsKLQotCWFjdF9jbGllbnQgPSBpMmNfbmV3X2RldmljZShhZGFwdGVyLCBhY3R1YXRvcl9pbmZvLT5ib2FyZF9pbmZvKTsKLQlpZiAoIWFjdF9jbGllbnQpCi0JCWdvdG8gZGV2aWNlX2ZhaWw7Ci0KLQlhY3Rfc2RldiA9IChzdHJ1Y3QgdjRsMl9zdWJkZXYgKilpMmNfZ2V0X2NsaWVudGRhdGEoYWN0X2NsaWVudCk7Ci0JaWYgKGFjdF9zZGV2ID09IE5VTEwpCi0JCWdvdG8gY2xpZW50X2ZhaWw7Ci0KLQlpZiAoYWN0dWF0b3JfaW5mby0+dmNtX2VuYWJsZSkgewotCQlhY3RybCA9IGdldF9hY3RybChhY3Rfc2Rldik7Ci0JCWlmIChhY3RybCkgewotCQkJYWN0cmwtPnZjbV9lbmFibGUgPSBhY3R1YXRvcl9pbmZvLT52Y21fZW5hYmxlOwotCQkJYWN0cmwtPnZjbV9wd2QgPSBhY3R1YXRvcl9pbmZvLT52Y21fcHdkOwotCQl9Ci0JfQotCi0JaTJjX3B1dF9hZGFwdGVyKGFkYXB0ZXIpOwotCXJldHVybiBhY3Rfc2RldjsKLQotY2xpZW50X2ZhaWw6Ci0JaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGFjdF9jbGllbnQpOwotZGV2aWNlX2ZhaWw6Ci0JaTJjX3B1dF9hZGFwdGVyKGFkYXB0ZXIpOwotCWFkYXB0ZXIgPSBOVUxMOwotcHJvYmVfZmFpbDoKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldiAqbXNtX2VlcHJvbV9wcm9iZSgKLQlzdHJ1Y3QgbXNtX2VlcHJvbV9pbmZvICplZXByb21faW5mbykKLXsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmVlcHJvbV9zZGV2OwotCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IE5VTEw7Ci0Jdm9pZCAqZWVwcm9tX2NsaWVudCA9IE5VTEw7Ci0KLQlEKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKLQotCWlmICghZWVwcm9tX2luZm8gfHwgIWVlcHJvbV9pbmZvLT5ib2FyZF9pbmZvKQotCQlnb3RvIHByb2JlX2ZhaWw7Ci0KLQlhZGFwdGVyID0gaTJjX2dldF9hZGFwdGVyKGVlcHJvbV9pbmZvLT5idXNfaWQpOwotCWlmICghYWRhcHRlcikKLQkJZ290byBwcm9iZV9mYWlsOwotCi0JZWVwcm9tX2NsaWVudCA9IGkyY19uZXdfZGV2aWNlKGFkYXB0ZXIsIGVlcHJvbV9pbmZvLT5ib2FyZF9pbmZvKTsKLQlpZiAoIWVlcHJvbV9jbGllbnQpCi0JCWdvdG8gZGV2aWNlX2ZhaWw7Ci0KLQllZXByb21fc2RldiA9IChzdHJ1Y3QgdjRsMl9zdWJkZXYgKilpMmNfZ2V0X2NsaWVudGRhdGEoZWVwcm9tX2NsaWVudCk7Ci0JaWYgKGVlcHJvbV9zZGV2ID09IE5VTEwpCi0JCWdvdG8gY2xpZW50X2ZhaWw7Ci0KLQlpMmNfcHV0X2FkYXB0ZXIoYWRhcHRlcik7Ci0JcmV0dXJuIGVlcHJvbV9zZGV2OwotY2xpZW50X2ZhaWw6Ci0JcHJfZXJyKCIlcyBjbGllbnRfZmFpbFxuIiwgX19mdW5jX18pOwotCWkyY191bnJlZ2lzdGVyX2RldmljZShlZXByb21fY2xpZW50KTsKLWRldmljZV9mYWlsOgotCXByX2VycigiJXMgZGV2aWNlX2ZhaWxcbiIsIF9fZnVuY19fKTsKLQlpMmNfcHV0X2FkYXB0ZXIoYWRhcHRlcik7Ci0JYWRhcHRlciA9IE5VTEw7Ci1wcm9iZV9mYWlsOgotCXByX2VycigiJXMgcHJvYmVfZmFpbFxuIiwgX19mdW5jX18pOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2ICptc21fZmxhc2hfcHJvYmUoCi0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2ZsYXNoX2RhdGEgKmZsYXNoX2luZm8pCi17Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICpmbGFzaF9zZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBOVUxMOwotCXZvaWQgKmZsYXNoX2NsaWVudCA9IE5VTEw7Ci0KLQlEKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKLQotCWlmICghZmxhc2hfaW5mbyB8fCAhZmxhc2hfaW5mby0+Ym9hcmRfaW5mbykKLQkJZ290byBwcm9iZV9mYWlsOwotCi0JYWRhcHRlciA9IGkyY19nZXRfYWRhcHRlcihmbGFzaF9pbmZvLT5idXNfaWQpOwotCWlmICghYWRhcHRlcikKLQkJZ290byBwcm9iZV9mYWlsOwotCi0JZmxhc2hfY2xpZW50ID0gaTJjX25ld19kZXZpY2UoYWRhcHRlciwgZmxhc2hfaW5mby0+Ym9hcmRfaW5mbyk7Ci0JaWYgKCFmbGFzaF9jbGllbnQpCi0JCWdvdG8gZGV2aWNlX2ZhaWw7Ci0KLQlmbGFzaF9zZGV2ID0gKHN0cnVjdCB2NGwyX3N1YmRldiAqKWkyY19nZXRfY2xpZW50ZGF0YShmbGFzaF9jbGllbnQpOwotCWlmIChmbGFzaF9zZGV2ID09IE5VTEwpCi0JCWdvdG8gY2xpZW50X2ZhaWw7Ci0KLQlpMmNfcHV0X2FkYXB0ZXIoYWRhcHRlcik7Ci0JcmV0dXJuIGZsYXNoX3NkZXY7Ci0KLWNsaWVudF9mYWlsOgotCXByX2VycigiJXMgY2xpZW50X2ZhaWxcbiIsIF9fZnVuY19fKTsKLQlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoZmxhc2hfY2xpZW50KTsKLWRldmljZV9mYWlsOgotCXByX2VycigiJXMgZGV2aWNlX2ZhaWxcbiIsIF9fZnVuY19fKTsKLQlpMmNfcHV0X2FkYXB0ZXIoYWRhcHRlcik7Ci0JYWRhcHRlciA9IE5VTEw7Ci1wcm9iZV9mYWlsOgotCXByX2VycigiJXMgcHJvYmVfZmFpbFxuIiwgX19mdW5jX18pOwotCXJldHVybiBOVUxMOwotfQotCi0vKiByZWdpc3RlciBhIG1zbSBzZW5zb3IgaW50byB0aGUgbXNtIGRldmljZSwgd2hpY2ggd2lsbCBwcm9iZSB0aGUKLSAqIHNlbnNvciBIVy4gaWYgdGhlIEhXIGV4aXN0IHRoZW4gY3JlYXRlIGEgdmlkZW8gZGV2aWNlICgvZGV2L3ZpZGVvWC8pCi0gKiB0byByZXByZXNlbnQgdGhpcyBzZW5zb3IgKi8KLWludCBtc21fc2Vuc29yX3JlZ2lzdGVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2Vuc29yX3NkKQotewotCWludCByYyA9IC1FSU5WQUw7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNkYXRhOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtOwotCXN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsOwotCXN0cnVjdCBtc21fY2FtX3N1YmRldl9pbmZvIHNkX2luZm87Ci0KLQlEKCIlcyBmb3IgJXNcbiIsIF9fZnVuY19fLCBzZW5zb3Jfc2QtPm5hbWUpOwotCi0JLyogYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIGNhbWVyYSBkZXZpY2UgZmlyc3QgKi8KLQlwY2FtID0ga3phbGxvYyhzaXplb2YoKnBjYW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBjYW0pIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGFsbG9jYXRlIG1lbSBmb3IgbXNtX2NhbV92NGwyX2RldmljZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcGNhbS0+c2Vuc29yX3NkZXYgPSBzZW5zb3Jfc2Q7Ci0Jc19jdHJsID0gZ2V0X3NjdHJsKHNlbnNvcl9zZCk7Ci0Jc2RhdGEgPSAoc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKikgc19jdHJsLT5zZW5zb3JkYXRhOwotCi0JcGNhbS0+YWN0X3NkZXYgPSBtc21fYWN0dWF0b3JfcHJvYmUoc2RhdGEtPmFjdHVhdG9yX2luZm8pOwotCXBjYW0tPmVlcHJvbV9zZGV2ID0gbXNtX2VlcHJvbV9wcm9iZShzZGF0YS0+ZWVwcm9tX2luZm8pOwotCXBjYW0tPmZsYXNoX3NkZXYgPSBtc21fZmxhc2hfcHJvYmUoc2RhdGEtPmZsYXNoX2RhdGEpOwotCi0JRCgiJXM6IHBjYW0gPTB4JXBcbiIsIF9fZnVuY19fLCBwY2FtKTsKLQotCXBjYW0tPnNkYXRhID0gc2RhdGE7Ci0KLQkvKiBpbml0IHRoZSB1c2VyIGNvdW50IGFuZCBsb2NrKi8KLQlwY2FtLT51c2VfY291bnQgPSAwOwotCW11dGV4X2luaXQoJnBjYW0tPnZpZF9sb2NrKTsKLQltdXRleF9pbml0KCZwY2FtLT5tY3RsX25vZGUuZGV2X2xvY2spOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgZm9ybWF0cyBzdXBwb3J0ZWQgKi8KLQlyYyAgPSBtc21fbWN0bF9pbml0X3VzZXJfZm9ybWF0cyhwY2FtKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGZhaWx1cmU7Ci0KLQlyYyAgPSBtc21fY2FtX2Rldl9pbml0KHBjYW0pOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZmFpbHVyZTsKLQotCXJjID0gbXNtX3NldHVwX21jdGxfbm9kZShwY2FtKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6ZmFpbGVkIHRvIGNyZWF0ZSBtY3RsIGRldmljZTogJWRcbiIsCi0JCQkgX19mdW5jX18sIHJjKTsKLQkJZ290byBmYWlsdXJlOwotCX0KLQltc21fc2VydmVyX3VwZGF0ZV9zZW5zb3JfaW5mbyhwY2FtLCBzZGF0YSk7Ci0KLQlzZF9pbmZvLnNkZXZfdHlwZSA9IFNFTlNPUl9ERVY7Ci0Jc2RfaW5mby5zZF9pbmRleCA9IHZub2RlX2NvdW50OwotCXNkX2luZm8uaXJxX251bSA9IDA7Ci0JLyogcmVnaXN0ZXIgdGhlIHN1YmRldmljZSwgbXVzdCBiZSBkb25lIGZvciBjYWxsYmFja3MgKi8KLQlyYyA9IG1zbV9jYW1fcmVnaXN0ZXJfc3ViZGV2X25vZGUoc2Vuc29yX3NkLCAmc2RfaW5mbyk7Ci0JaWYgKHJjIDwgMCkgewotCQlEKCIlcyBzZW5zb3Igc3ViIGRldmljZSByZWdpc3RlciBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbHVyZTsKLQl9Ci0KLQlpZiAocGNhbS0+YWN0X3NkZXYpIHsKLQkJcmMgPSB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYoJnBjYW0tPnY0bDJfZGV2LAotCQkJCXBjYW0tPmFjdF9zZGV2KTsKLQkJaWYgKHJjIDwgMCkgewotCQkJRCgiJXMgYWN0dWF0b3Igc3ViIGRldmljZSByZWdpc3RlciBmYWlsZWRcbiIsCi0JCQkgIF9fZnVuY19fKTsKLQkJCWdvdG8gZmFpbHVyZTsKLQkJfQotCX0KLQotCWlmIChwY2FtLT5lZXByb21fc2RldikgewotCQlyYyA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldigmcGNhbS0+djRsMl9kZXYsCi0JCQlwY2FtLT5lZXByb21fc2Rldik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCUQoIiVzIGVlcHJvbSBzdWIgZGV2aWNlIHJlZ2lzdGVyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJZ290byBmYWlsdXJlOwotCQl9Ci0JfQotCi0JaWYgKHBjYW0tPmZsYXNoX3NkZXYpIHsKLQkJcmMgPSB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYoJnBjYW0tPnY0bDJfZGV2LAotCQkJcGNhbS0+Zmxhc2hfc2Rldik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCUQoIiVzIGZsYXNoIHN1YiBkZXZpY2UgcmVnaXN0ZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGZhaWx1cmU7Ci0JCX0KLQl9Ci0KLQlwY2FtLT52bm9kZV9pZCA9IHZub2RlX2NvdW50Kys7Ci0JcmV0dXJuIHJjOwotCi1mYWlsdXJlOgotCWt6ZnJlZShwY2FtKTsKLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9zZW5zb3JfcmVnaXN0ZXIpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOThmMTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQ2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9NU01fSAotI2RlZmluZSBfTVNNX0gKLQotI2lmZGVmIF9fS0VSTkVMX18KLQotLyogSGVhZGVyIGZpbGVzICovCi0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItZmguaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWV2ZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1tZWRpYWJ1cy5oPgotI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1kbWEtY29udGlnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLW1zbS1tZW0uaD4KLSNpbmNsdWRlIDxtZWRpYS9tc21faXNwLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbW11Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2lzcC5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KLSNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9nZXN0dXJlcy5oPgotCi0jZGVmaW5lIE1TTV9WNEwyX0RJTUVOU0lPTl9TSVpFIDk2Ci0jZGVmaW5lIE1BWF9ERVZfTkFNRV9MRU4gNTAKLQotI2RlZmluZSBFUlJfVVNFUl9DT1BZKHRvKSBwcl9lcnIoIiVzKCVkKTogY29weSAlcyB1c2VyXG4iLCBcCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCAoKHRvKSA/ICJ0byIgOiAiZnJvbSIpKQotI2RlZmluZSBFUlJfQ09QWV9GUk9NX1VTRVIoKSBFUlJfVVNFUl9DT1BZKDApCi0jZGVmaW5lIEVSUl9DT1BZX1RPX1VTRVIoKSBFUlJfVVNFUl9DT1BZKDEpCi0KLSNkZWZpbmUgQ09QWV9GUk9NX1VTRVIoZXJyb3IsIGRlc3QsIHNyYywgc2l6ZSkgXAotCShlcnJvciA9IChjb3B5X2Zyb21fdXNlcihkZXN0LCBzcmMsIHNpemUpID8gLUVGQVVMVCA6IDApKQotI2RlZmluZSBDT1BZX1RPX1VTRVIoZXJyb3IsIGRlc3QsIHNyYywgc2l6ZSkgXAotCShlcnJvciA9IChjb3B5X3RvX3VzZXIoZGVzdCwgc3JjLCBzaXplKSA/IC1FRkFVTFQgOiAwKSkKLQotI2RlZmluZSBNU01fQ1NJUEhZX0RSVl9OQU1FICJtc21fY3NpcGh5IgotI2RlZmluZSBNU01fQ1NJRF9EUlZfTkFNRSAibXNtX2NzaWQiCi0jZGVmaW5lIE1TTV9DU0lDX0RSVl9OQU1FICJtc21fY3NpYyIKLSNkZWZpbmUgTVNNX0lTUElGX0RSVl9OQU1FICJtc21faXNwaWYiCi0jZGVmaW5lIE1TTV9WRkVfRFJWX05BTUUgIm1zbV92ZmUiCi0jZGVmaW5lIE1TTV9WUEVfRFJWX05BTUUgIm1zbV92cGUiCi0jZGVmaW5lIE1TTV9HRU1JTklfRFJWX05BTUUgIm1zbV9nZW1pbmkiCi0jZGVmaW5lIE1TTV9NRVJDVVJZX0RSVl9OQU1FICJtc21fbWVyY3VyeSIKLSNkZWZpbmUgTVNNX0pQRUdfRFJWX05BTUUgIm1zbV9qcGVnIgotI2RlZmluZSBNU01fSTJDX01VWF9EUlZfTkFNRSAibXNtX2NhbV9pMmNfbXV4IgotI2RlZmluZSBNU01fSVJRX1JPVVRFUl9EUlZfTkFNRSAibXNtX2NhbV9pcnFfcm91dGVyIgotI2RlZmluZSBNU01fQ1BQX0RSVl9OQU1FICJtc21fY3BwIgotI2RlZmluZSBNU01fQ0NJX0RSVl9OQU1FICJtc21fY2NpIgotCi0jZGVmaW5lIE1BWF9OVU1fU0VOU09SX0RFViAzCi0jZGVmaW5lIE1BWF9OVU1fQ1NJUEhZX0RFViAzCi0jZGVmaW5lIE1BWF9OVU1fQ1NJRF9ERVYgNAotI2RlZmluZSBNQVhfTlVNX0NTSUNfREVWIDMKLSNkZWZpbmUgTUFYX05VTV9JU1BJRl9ERVYgMQotI2RlZmluZSBNQVhfTlVNX1ZGRV9ERVYgMgotI2RlZmluZSBNQVhfTlVNX0FYSV9ERVYgMgotI2RlZmluZSBNQVhfTlVNX1ZQRV9ERVYgMQotI2RlZmluZSBNQVhfTlVNX0pQRUdfREVWIDMKLSNkZWZpbmUgTUFYX05VTV9DUFBfREVWIDEKLSNkZWZpbmUgTUFYX05VTV9DQ0lfREVWIDEKLSNkZWZpbmUgTUFYX05VTV9GTEFTSF9ERVYgNAotCi0vKiBtc20gcXVldWUgbWFuYWdlbWVudCBBUElzKi8KLQotI2RlZmluZSBtc21fZGVxdWV1ZShxdWV1ZSwgbWVtYmVyKSAoewkgICBcCi0JdW5zaWduZWQgbG9uZyBmbGFnczsJCSAgXAotCXN0cnVjdCBtc21fZGV2aWNlX3F1ZXVlICpfX3EgPSAocXVldWUpOwkgXAotCXN0cnVjdCBtc21fcXVldWVfY21kICpxY21kID0gMDsJICAgXAotCXNwaW5fbG9ja19pcnFzYXZlKCZfX3EtPmxvY2ssIGZsYWdzKTsJIFwKLQlpZiAoIWxpc3RfZW1wdHkoJl9fcS0+bGlzdCkpIHsJCVwKLQkJX19xLT5sZW4tLTsJCSBcCi0JCXFjbWQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZfX3EtPmxpc3QsICAgXAotCQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCwgbWVtYmVyKTsgIFwKLQkJbGlzdF9kZWxfaW5pdCgmcWNtZC0+bWVtYmVyKTsJIFwKLQl9CQkJIFwKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZfX3EtPmxvY2ssIGZsYWdzKTsgIFwKLQlxY21kOwkJCSBcCi19KQotCi0jZGVmaW5lIG1zbV9xdWV1ZV9kcmFpbihxdWV1ZSwgbWVtYmVyKSBkbyB7CSBcCi0JdW5zaWduZWQgbG9uZyBmbGFnczsJCSAgXAotCXN0cnVjdCBtc21fZGV2aWNlX3F1ZXVlICpfX3EgPSAocXVldWUpOwkgXAotCXN0cnVjdCBtc21fcXVldWVfY21kICpxY21kOwkgICBcCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJl9fcS0+bG9jaywgZmxhZ3MpOwkgXAotCXdoaWxlICghbGlzdF9lbXB0eSgmX19xLT5saXN0KSkgewkgXAotCQlxY21kID0gbGlzdF9maXJzdF9lbnRyeSgmX19xLT5saXN0LCAgIFwKLQkJCXN0cnVjdCBtc21fcXVldWVfY21kLCBtZW1iZXIpOwlcCi0JCQlsaXN0X2RlbF9pbml0KCZxY21kLT5tZW1iZXIpOwkgXAotCQkJa2ZyZWUocWNtZC0+Y29tbWFuZCk7CQlcCi0JCQlmcmVlX3FjbWQocWNtZCk7CQlcCi0JIH07CQkJICBcCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmX19xLT5sb2NrLCBmbGFncyk7CVwKLX0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3FjbWQoc3RydWN0IG1zbV9xdWV1ZV9jbWQgKnFjbWQpCi17Ci0JaWYgKCFxY21kIHx8ICFhdG9taWNfcmVhZCgmcWNtZC0+b25faGVhcCkpCi0JCXJldHVybjsKLQlpZiAoIWF0b21pY19zdWJfcmV0dXJuKDEsICZxY21kLT5vbl9oZWFwKSkKLQkJa2ZyZWUocWNtZCk7Ci19Ci0KLXN0cnVjdCBpc3BfbXNnX3N0YXRzIHsKLQl1aW50MzJfdCAgICBpZDsKLQl1aW50MzJfdCAgICBidWZmZXI7Ci0JdWludDMyX3QgICAgZnJhbWVDb3VudGVyOwotCWludDMyX3QgICAgIGJ1Zl9pZHg7Ci0JaW50MzJfdCAgICAgZmQ7Ci19OwotCi1zdHJ1Y3QgbXNtX2ZyZWVfYnVmIHsKLQl1aW50OF90IG51bV9wbGFuZXM7Ci0JdWludDMyX3QgaW5zdF9oYW5kbGU7Ci0JdWludDMyX3QgY2hfcGFkZHJbVklERU9fTUFYX1BMQU5FU107Ci0JdWludDMyX3QgdmI7Ci19OwotCi1zdHJ1Y3QgaXNwX21zZ19ldmVudCB7Ci0JdWludDMyX3QgbXNnX2lkOwotCXVpbnQzMl90IHNvZl9jb3VudDsKLX07Ci0KLXN0cnVjdCBpc3BfbXNnX291dHB1dCB7Ci0JdWludDhfdCAgIG91dHB1dF9pZDsKLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmIGJ1ZjsKLQl1aW50MzJfdCAgZnJhbWVDb3VudGVyOwotfTsKLQotc3RydWN0IHJkaV9jb3VudF9tc2cgewotCXVpbnQzMl90IHJkaV9pbnRlcmZhY2U7Ci0JdWludDMyX3QgY291bnQ7Ci19OwotCi0vKiBtZXNzYWdlIGlkIGZvciB2NGwyX3N1YmRldl9ub3RpZnkqLwotZW51bSBtc21fY2FtZXJhX3Y0bDJfc3ViZGV2X25vdGlmeSB7Ci0JTk9USUZZX0lTUF9NU0dfRVZULCAvKiBhcmcgPSBlbnVtIElTUF9NRVNTQUdFX0lEICovCi0JTk9USUZZX1ZGRV9NU0dfT1VULCAvKiBhcmcgPSBzdHJ1Y3QgaXNwX21zZ19vdXRwdXQgKi8KLQlOT1RJRllfVkZFX01TR19TVEFUUywgIC8qIGFyZyA9IHN0cnVjdCBpc3BfbXNnX3N0YXRzICovCi0JTk9USUZZX1ZGRV9NU0dfQ09NUF9TVEFUUywgLyogYXJnID0gc3RydWN0IG1zbV9zdGF0c19idWYgKi8KLQlOT1RJRllfVkZFX0JVRl9FVlQsIC8qIGFyZyA9IHN0cnVjdCBtc21fdmZlX3Jlc3AgKi8KLQlOT1RJRllfVkZFX0NBTUlGX0VSUk9SLAotCU5PVElGWV9WRkVfUElYX1NPRl9DT1VOVCwgLyphcmcgPSBpbnQqLwotCU5PVElGWV9BWElfUkRJX1NPRl9DT1VOVCwgLyphcmcgPSBzdHJ1Y3QgcmRpX2NvdW50X21zZyovCi0JTk9USUZZX1BDTEtfQ0hBTkdFLCAvKiBhcmcgPSBwY2xrICovCi0JTk9USUZZX1ZGRV9JUlEsCi0JTk9USUZZX0FYSV9JUlEsCi0JTk9USUZZX0dFU1RVUkVfRVZULCAvKiBhcmcgPSB2NGwyX2V2ZW50ICovCi0JTk9USUZZX0dFU1RVUkVfQ0FNX0VWVCwgLyogYXJnID0gaW50ICovCi0JTk9USUZZX0lOVkFMSUQKLX07Ci0KLWVudW0gaXNwX3ZmZV9jbWRfaWQgewotCS8qCi0JKkltcG9ydGFudCEgQ29tbWFuZF9JRCBhcmUgYXJyYW5nZWQgaW4gb3JkZXIuCi0JKkRvbid0IGNoYW5nZSEqLwotCUlTUF9WRkVfQ01EX0lEX1NUUkVBTV9PTiwKLQlJU1BfVkZFX0NNRF9JRF9TVFJFQU1fT0ZGLAotCUlTUF9WRkVfQ01EX0lEX0ZSQU1FX0JVRl9SRUxFQVNFCi19OwotCi1zdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZTsKLXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3Q7Ci0jZGVmaW5lIE1TTV9NQVhfSU1HX01PREUgICAgICAgICAgICAgICAgTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9NQVgKLQotZW51bSBtc21fYnVmZmVyX3N0YXRlIHsKLQlNU01fQlVGRkVSX1NUQVRFX1VOVVNFRCwKLQlNU01fQlVGRkVSX1NUQVRFX0lOSVRJQUxJWkVELAotCU1TTV9CVUZGRVJfU1RBVEVfUFJFUEFSRUQsCi0JTVNNX0JVRkZFUl9TVEFURV9RVUVVRUQsCi0JTVNNX0JVRkZFUl9TVEFURV9SRVNFUlZFRCwKLQlNU01fQlVGRkVSX1NUQVRFX0RFUVVFVUVECi19OwotCi0vKiBidWZmZXIgZm9yIG9uZSB2aWRlbyBmcmFtZSAqLwotc3RydWN0IG1zbV9mcmFtZV9idWZmZXIgewotCS8qIGNvbW1vbiB2NGwgYnVmZmVyIHN0dWZmIC0tIG11c3QgYmUgZmlyc3QgKi8KLQlzdHJ1Y3QgdmIyX2J1ZmZlciAgICAgICAgIHZpZGJ1ZjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQkgIGxpc3Q7Ci0JZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlICBweGxjb2RlOwotCWVudW0gbXNtX2J1ZmZlcl9zdGF0ZSBzdGF0ZTsKLQlpbnQgYWN0aXZlOwotfTsKLQotc3RydWN0IG1zbV9pc3BfY29sb3JfZm10IHsKLQljaGFyICpuYW1lOwotCWludCBkZXB0aDsKLQlpbnQgYml0c3BlcnB4bDsKLQl1MzIgZm91cmNjOwotCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBweGxjb2RlOwotCWVudW0gdjRsMl9jb2xvcnNwYWNlIGNvbG9yc3BhY2U7Ci19OwotCi1zdHJ1Y3QgbXNtX2NhbV9yZXR1cm5fZnJhbWVfaW5mbyB7Ci0JaW50IGRpcnR5OwotCWludCBub2RlX3R5cGU7Ci0Jc3RydWN0IHRpbWV2YWwgdGltZXN0YW1wOwotCXVpbnQzMl90IGZyYW1lX2lkOwotfTsKLQotc3RydWN0IG1zbV9jYW1fdGltZXN0YW1wIHsKLQl1aW50OF90IHByZXNlbnQ7Ci0Jc3RydWN0IHRpbWV2YWwgdGltZXN0YW1wOwotCXVpbnQzMl90IGZyYW1lX2lkOwotfTsKLQotc3RydWN0IG1zbV9jYW1fYnVmX21hcF9pbmZvIHsKLQlpbnQgZmQ7Ci0JdWludDMyX3QgZGF0YV9vZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBwYWRkcjsKLQl1bnNpZ25lZCBsb25nIGxlbjsKLQlzdHJ1Y3QgZmlsZSAqZmlsZTsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOwotfTsKLQotc3RydWN0IG1zbV9jYW1fbWV0YV9mcmFtZSB7Ci0Jc3RydWN0IG1zbV9wcF9mcmFtZSBmcmFtZTsKLQkvKiBNYXBwaW5nIGluZm9ybWF0aW9uIHBlciBwbGFuZSAqLwotCXN0cnVjdCBtc21fY2FtX2J1Zl9tYXBfaW5mbyBtYXBbVklERU9fTUFYX1BMQU5FU107Ci19OwotCi1zdHJ1Y3QgbXNtX21jdGxfcHBfZnJhbWVfaW5mbyB7Ci0JaW50IHVzZXJfY21kOwotCXN0cnVjdCBtc21fY2FtX21ldGFfZnJhbWUgc3JjX2ZyYW1lOwotCXN0cnVjdCBtc21fY2FtX21ldGFfZnJhbWUgZGVzdF9mcmFtZTsKLQlzdHJ1Y3QgbXNtX21jdGxfcHBfZnJhbWVfY21kIHBwX2ZyYW1lX2NtZDsKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwX21jdGw7Ci19OwotCi1zdHJ1Y3QgbXNtX21jdGxfcHBfY3RybCB7Ci0JaW50IHBwX21zZ190eXBlOwotCXN0cnVjdCBtc21fbWN0bF9wcF9mcmFtZV9pbmZvICpwcF9mcmFtZV9pbmZvOwotCi19Owotc3RydWN0IG1zbV9tY3RsX3BwX2luZm8gewotCXNwaW5sb2NrX3QgbG9jazsKLQl1aW50MzJfdCBjbnQ7Ci0JdWludDMyX3QgcHBfa2V5OwotCXVpbnQzMl90IGN1cl9mcmFtZV9pZFtNU01fTUFYX0lNR19NT0RFXTsKLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmIGRpdl9mcmFtZVtNU01fTUFYX0lNR19NT0RFXTsKLQlzdHJ1Y3QgbXNtX21jdGxfcHBfY3RybCBwcF9jdHJsOwotCi19OwotLyogIk1lZGlhIENvbnRyb2xsZXIiIHJlcHJlc2VudHMgYSBjYW1lcmEgc3RlYW1pbmcgc2Vzc2lvbiwKLSAqIHdoaWNoIGNvbnNpc3RzIG9mIGEgInNlbnNvciIgZGV2aWNlIGFuZCBhbiAiaXNwIiBkZXZpY2UKLSAqIChzdWNoIGFzIFZGRSwgaWYgbmVlZGVkKSwgY29ubmVjdGVkIHZpYSBhbiAiSU8iIGRldmljZSwKLSAqIChzdWNoIGFzIElQSUYgb24gODk2MCwgb3Igbm9uZSBvbiA4NjYwKSBwbHVzIG90aGVyIGV4dHJhCi0gKiBzdWIgZGV2aWNlcyBzdWNoIGFzIFZQRSBhbmQgZmxhc2guCi0gKi8KLQotc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciB7Ci0KLQlpbnQgKCptY3RsX29wZW4pKHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBfbWN0bCwKLQkJCQkJIGNvbnN0IGNoYXIgKmNvbnN0IGFwcHNfaWQpOwotCWludCAoKm1jdGxfY2IpKHZvaWQpOwotCWludCAoKm1jdGxfY21kKShzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwX21jdGwsCi0JCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLQl2b2lkICgqbWN0bF9yZWxlYXNlKShzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwX21jdGwpOwotCWludCAoKm1jdGxfYnVmX2luaXQpKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW0pOwotCWludCAoKm1jdGxfdmJxdWV1ZV9pbml0KShzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtLAotCQkJCXN0cnVjdCB2YjJfcXVldWUgKnEsIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKTsKLQlpbnQgKCptY3RsX3VmbXRfaW5pdCkoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcF9tY3RsKTsKLQlpbnQgKCppc3BfY29uZmlnKShzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLQlpbnQgKCppc3Bfbm90aWZ5KShzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQkJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdW5zaWduZWQgaW50IG5vdGlmaWNhdGlvbiwgdm9pZCAqYXJnKTsKLQotCS8qIHRoZSBmb2xsb3dpbmcgcmVmbGVjdCB0aGUgSFcgdG9wb2xvZ3kgaW5mb3JtYXRpb24qLwotCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Vuc29yX3NkZXY7IC8qIHNlbnNvciBzdWIgZGV2aWNlICovCi0Jc3RydWN0IHY0bDJfc3ViZGV2ICphY3Rfc2RldjsgLyogYWN0dWF0b3Igc3ViIGRldmljZSAqLwotCXN0cnVjdCB2NGwyX3N1YmRldiAqY3NpcGh5X3NkZXY7IC8qY3NpcGh5IHN1YiBkZXZpY2UqLwotCXN0cnVjdCB2NGwyX3N1YmRldiAqY3NpZF9zZGV2OyAvKmNzaWQgc3ViIGRldmljZSovCi0Jc3RydWN0IHY0bDJfc3ViZGV2ICpjc2ljX3NkZXY7IC8qY3NpZCBzdWIgZGV2aWNlKi8KLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmlzcGlmX3NkZXY7IC8qIGlzcGlmIHN1YiBkZXZpY2UgKi8KLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmdlbWluaV9zZGV2OyAvKiBnZW1pbmkgc3ViIGRldmljZSAqLwotCXN0cnVjdCB2NGwyX3N1YmRldiAqdnBlX3NkZXY7IC8qIHZwZSBzdWIgZGV2aWNlICovCi0Jc3RydWN0IHY0bDJfc3ViZGV2ICpheGlfc2RldjsgLyogYXhpIHN1YiBkZXZpY2UgKi8KLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnZmZV9zZGV2OyAvKiB2ZmUgc3ViIGRldmljZSAqLwotCXN0cnVjdCB2NGwyX3N1YmRldiAqZWVwcm9tX3NkZXY7IC8qIGVlcHJvbSBzdWIgZGV2aWNlICovCi0Jc3RydWN0IHY0bDJfc3ViZGV2ICpjcHBfc2RldjsvKmNwcCBzdWIgZGV2aWNlKi8KLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmZsYXNoX3NkZXY7LypmbGFzaCBzdWIgZGV2aWNlKi8KLQotCXN0cnVjdCBtc21fY2FtX2NvbmZpZ19kZXYgKmNvbmZpZ19kZXZpY2U7Ci0KLQkvKm1jdGwgc2Vzc2lvbiBjb250cm9sIGluZm9ybWF0aW9uKi8KLQl1aW50OF90IG9wZW5jbnQ7IC8qbWN0bCByZWYgY291bnQqLwotCWNvbnN0IGNoYXIgKmFwcHNfaWQ7IC8qSUQgZm9yIGFwcCB0aGF0IG9wZW4gdGhpcyBzZXNzaW9uKi8KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3Qgd2FrZV9sb2NrIHdha2VfbG9jazsgLyphdm9pZCBsb3cgcG93ZXIgbW9kZSB3aGVuIGFjdGl2ZSovCi0Jc3RydWN0IHBtX3Fvc19yZXF1ZXN0IHBtX3Fvc19yZXFfbGlzdDsKLQlzdHJ1Y3QgbXNtX21jdGxfcHBfaW5mbyBwcF9pbmZvOwotCXN0cnVjdCBtc21fbWN0bF9zdGF0c190IHN0YXRzX2luZm87IC8qc3RhdHMgcG1lbSBpbmZvKi8KLQl1aW50MzJfdCB2ZmVfb3V0cHV0X21vZGU7IC8qIFZGRSBvdXRwdXQgbW9kZSAqLwotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQ7Ci0Jc3RydWN0IGtyZWYgcmVmY291bnQ7Ci0KLQkvKnBjYW0gcHRyKi8KLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbV9wdHI7Ci0KLQkvKnNlbnNvciBpbmZvKi8KLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2RhdGE7Ci0KLQkvKklPTU1VIG1hcHBlZCBJTUVNIGFkZHJlc3NlcyovCi0JdWludDMyX3QgcGluZ19pbWVtX3k7Ci0JdWludDMyX3QgcGluZ19pbWVtX2NiY3I7Ci0JdWludDMyX3QgcG9uZ19pbWVtX3k7Ci0JdWludDMyX3QgcG9uZ19pbWVtX2NiY3I7Ci0KLQkvKklPTU1VIGRvbWFpbiBmb3IgdGhpcyBzZXNzaW9uKi8KLQlpbnQgZG9tYWluX251bTsKLQlzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW47Ci19OwotCi1zdHJ1Y3QgbXNtX2lzcF9idWZfaW5mbyB7Ci0JaW50IHR5cGU7Ci0JdW5zaWduZWQgbG9uZyBidWZmZXI7Ci0JaW50IGZkOwotfTsKLXN0cnVjdCBtc21fY2FtX2J1Zl9vZmZzZXQgewotCXVpbnQzMl90IGFkZHJfb2Zmc2V0OwotCXVpbnQzMl90IGRhdGFfb2Zmc2V0OwotfTsKLQotI2RlZmluZSBNU01fREVWX0lOU1RfTUFYICAgICAgICAgICAgICAgICAgICAyNAotc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCB7Ci0Jc3RydWN0IHY0bDJfZmggIGV2ZW50SGFuZGxlOwotCXN0cnVjdCB2YjJfcXVldWUgdmlkX2J1ZnE7Ci0Jc3BpbmxvY2tfdCB2cV9pcnFsb2NrOwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV92cTsKLQlzdHJ1Y3QgdjRsMl9mb3JtYXQgdmlkX2ZtdDsKLQkvKiBzZW5zb3IgcGl4ZWwgY29kZSovCi0JZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIHNlbnNvcl9weGxjb2RlOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtOwotCWludCBteV9pbmRleDsKLQl1aW50MzJfdCBpbWFnZV9tb2RlOwotCWludCBwYXRoOwotCWludCBidWZfY291bnQ7Ci0JLyogYnVmZmVyIG9mZnNldHMsIGlmIGFueSAqLwotCXN0cnVjdCBtc21fY2FtX2J1Zl9vZmZzZXQgKipidWZfb2Zmc2V0OwotCXN0cnVjdCB2NGwyX2Nyb3AgY3JvcDsKLQlpbnQgc3RyZWFtb247Ci0Jc3RydWN0IG1zbV9tZW1fbWFwX2luZm8gbWVtX21hcDsKLQlpbnQgaXNfbWVtX21hcF9pbnN0OwotCXN0cnVjdCBpbWdfcGxhbmVfaW5mbyBwbGFuZV9pbmZvOwotCWludCB2YnF1ZXVlX2luaXRpYWxpemVkOwotCXN0cnVjdCBtdXRleCBpbnN0X2xvY2s7Ci0JdWludDMyX3QgaW5zdF9oYW5kbGU7Ci19OwotCi1zdHJ1Y3QgbXNtX2NhbV9tY3RsX25vZGUgewotCS8qIE1DVEwgVjRsMiBkZXZpY2UgKi8KLQlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqcHZkZXY7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqZGV2X2luc3RbTVNNX0RFVl9JTlNUX01BWF07Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqZGV2X2luc3RfbWFwW01TTV9NQVhfSU1HX01PREVdOwotCXN0cnVjdCBtdXRleCBkZXZfbG9jazsKLQlpbnQgYWN0aXZlOwotCWludCB1c2VfY291bnQ7Ci19OwotCi0vKiBhYnN0cmFjdCBjYW1lcmEgZGV2aWNlIGZvciBlYWNoIHNlbnNvciBzdWNjZXNzZnVsbHkgcHJvYmVkKi8KLXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlIHsKLQotCS8qIGRldmljZSBub2RlIGluZm9ybWF0aW9uICovCi0JaW50IHZub2RlX2lkOwotCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsgLyogVjRsMiBkZXZpY2UgKi8KLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpwdmRldjsgLyogcmVnaXN0ZXJlZCBhcyAvZGV2L3ZpZGVvKi8KLQlzdHJ1Y3QgbXNtX2NhbV9tY3RsX25vZGUgbWN0bF9ub2RlOyAvKiBub2RlIGZvciBidWZmZXIgbWFuYWdlbWVudCAqLwotCXN0cnVjdCBtZWRpYV9kZXZpY2UgbWVkaWFfZGV2OyAvKiBub2RlIHRvIGdldCB2aWRlbyBub2RlIGluZm8qLwotCi0JLyogZGV2aWNlIHNlc3Npb24gaW5mb3JtYXRpb24gKi8KLQlpbnQgdXNlX2NvdW50OwotCXN0cnVjdCBtdXRleCB2aWRfbG9jazsKLQl1aW50MzJfdCBzZXJ2ZXJfcXVldWVfaWR4OwotCXVpbnQzMl90IG1jdGxfaGFuZGxlOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKmRldl9pbnN0W01TTV9ERVZfSU5TVF9NQVhdOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKmRldl9pbnN0X21hcFtNU01fTUFYX0lNR19NT0RFXTsKLQlpbnQgb3BfbW9kZTsKLQotCS8qIHY0bDIgZm9ybWF0IHN1cHBvcnQgKi8KLQlzdHJ1Y3QgbXNtX2lzcF9jb2xvcl9mbXQgKnVzcl9mbXRzOwotCWludCBudW1fZm10czsKLQotCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Vuc29yX3NkZXY7IC8qIHNlbnNvciBzdWIgZGV2aWNlICovCi0Jc3RydWN0IHY0bDJfc3ViZGV2ICphY3Rfc2RldjsgLyogYWN0dWF0b3Igc3ViIGRldmljZSAqLwotCXN0cnVjdCB2NGwyX3N1YmRldiAqZWVwcm9tX3NkZXY7IC8qIGFjdHVhdG9yIHN1YiBkZXZpY2UgKi8KLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmZsYXNoX3NkZXY7IC8qIGZsYXNoIHN1YiBkZXZpY2UgKi8KLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2RhdGE7Ci0KLQlzdHJ1Y3QgbXNtX2RldmljZV9xdWV1ZSBldmVudERhdGFfcTsgLypwYXlsb2FkIGZvciBldmVudHMgc2VudCB0byBhcHAqLwotCXN0cnVjdCBtdXRleCBldmVudF9sb2NrOwotfTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqdG9fcGNhbSgKLQlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2KQotewotCXJldHVybiBjb250YWluZXJfb2YodjRsMl9kZXYsIHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlLCB2NGwyX2Rldik7Ci19Ci0KLS8qcHNldWRvIHY0bDIgZGV2aWNlIGFuZCB2NGwyIGV2ZW50IHF1ZXVlCi0gIGZvciBzZXJ2ZXIgYW5kIGNvbmZpZyBjZGV2cyovCi1zdHJ1Y3QgdjRsMl9xdWV1ZV91dGlsIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpwdmRldjsKLQlzdHJ1Y3QgdjRsMl9maCAgZXZlbnRIYW5kbGU7Ci19OwotCi0vKiBhYnN0cmFjdCBjb25maWcgZGV2aWNlIGZvciBhbGwgc2Vuc29yIHN1Y2Nlc3NmdWxseSBwcm9iZWQqLwotc3RydWN0IG1zbV9jYW1fY29uZmlnX2RldiB7Ci0Jc3RydWN0IGNkZXYgY29uZmlnX2NkZXY7Ci0Jc3RydWN0IHY0bDJfcXVldWVfdXRpbCBjb25maWdfc3RhdF9ldmVudF9xdWV1ZTsKLQlpbnQgdXNlX2NvdW50OwotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBfbWN0bDsKLQlzdHJ1Y3QgbXNtX21lbV9tYXBfaW5mbyBtZW1fbWFwOwotCWludCBkZXZfbnVtOwotCWludCBkb21haW5fbnVtOwotCXN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbjsKLX07Ci0KLXN0cnVjdCBtc21fY2FtX3N1YmRldl9pbmZvIHsKLQl1aW50OF90IHNkZXZfdHlwZTsKLQkvKiBTdWJkZXYgaW5kZXguIEZvciBlZzogQ1NJUEhZMCwgQ1NJUEhZMSBldGMgKi8KLQl1aW50OF90IHNkX2luZGV4OwotCS8qIFRoaXMgZGV2aWNlL3N1YmRldidzIGludGVycnVwdCBudW1iZXIsIGFzc2lnbmVkCi0JICogZnJvbSB0aGUgaGFyZHdhcmUgZG9jdW1lbnQuICovCi0JdWludDhfdCBpcnFfbnVtOwotfTsKLQotLyogMiBmb3IgY2FtZXJhLCAxIGZvciBnZXN0dXJlICovCi0jZGVmaW5lIE1BWF9OVU1fQUNUSVZFX0NBTUVSQSAzCi0KLXN0cnVjdCBtc21fY2FtX3NlcnZlcl9xdWV1ZSB7Ci0JdWludDMyX3QgcXVldWVfYWN0aXZlOwotCXN0cnVjdCBtc21fZGV2aWNlX3F1ZXVlIGN0cmxfcTsKLQlzdHJ1Y3QgbXNtX2RldmljZV9xdWV1ZSBldmVudERhdGFfcTsKLQl1aW50OF90ICpjdHJsX2RhdGE7Ci0JdWludDMyX3QgZXZ0X2lkOwotfTsKLQotc3RydWN0IG1zbV9jYW1fc2VydmVyX21jdGxfaW5zdCB7Ci0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciBtY3RsOwotCXVpbnQzMl90IGhhbmRsZTsKLX07Ci0KLXN0cnVjdCBtc21fY2FtX3NlcnZlcl9pcnFtYXBfZW50cnkgewotCWludCBpcnFfbnVtOwotCWludCBpcnFfaWR4OwotCXVpbnQ4X3QgY2FtX2h3X2lkeDsKLQl1aW50OF90IGlzX2NvbXBvc2l0ZTsKLX07Ci0KLXN0cnVjdCBpbnRyX3RhYmxlX2VudHJ5IHsKLQkvKiBpcnFfbnVtIGFzIHVuZGVyc3Rvb2QgYnkgbXNtLgotCSAqIFVuaXF1ZSBmb3IgZXZlcnkgY2FtZXJhIGh3IGNvcmUgJiB0YXJnZXQuIFVzZSBhIG1hcHBpbmcgZnVuY3Rpb24KLQkgKiB0byBtYXAgdGhpcyBpcnEgbnVtYmVyIHRvIGl0cyBlcXVpdmFsZW50IGluZGV4IGluIGNhbWVyYSBzaWRlLiAqLwotCWludCBpcnFfbnVtOwotCS8qIENhbWVyYSBodyBjb3JlIGlkeCwgaW4gY2FzZSBvZiBub24tY29tcG9zaXRlIElSUXMqLwotCXVpbnQ4X3QgY2FtX2h3X2lkeDsKLQkvKiBDYW1lcmEgaHcgY29yZSBtYXNrLCBpbiBjYXNlIG9mIGNvbXBvc2l0ZSBJUlFzLiAqLwotCXVpbnQzMl90IGNhbV9od19tYXNrOwotCS8qIEVhY2ggaW50ZXJydXB0IGlzIG1hcHBlZCB0byBhbiBpbmRleCwgd2hpY2ggaXMgdXNlZAotCSAqIHRvIGFkZC9kZWxldGUgZW50cmllcyBpbnRvIHRoZSBsb29rdXAgdGFibGUuIEJvdGggdGhlIGluZm9ybWF0aW9uCi0JICogYXJlIG5lZWRlZCBpbiB0aGUgbG9va3VwIHRhYmxlIHRvIGF2b2lkIGFub3RoZXIgc3ViZGV2IGNhbGwgaW50bwotCSAqIHRoZSBJUlEgUm91dGVyIHN1YmRldiB0byBnZXQgdGhlIGlycV9pZHggaW4gdGhlIGludGVycnVwdCBjb250ZXh0ICovCi0JaW50IGlycV9pZHg7Ci0JLyogSXMgdGhpcyBpcnEgY29tcG9zaXRlPyAqLwotCXVpbnQ4X3QgaXNfY29tcG9zaXRlOwotCS8qIElSUSBUcmlnZ2VyIHR5cGU6IFRSSUdHRVJfUkFJU0lORywgVFJJR0dFUl9ISUdILCBldGMuICovCi0JdWludDMyX3QgaXJxX3RyaWdnZXJfdHlwZTsKLQkvKiBJZiBJUlEgUm91dGVyIGh3IGlzIHByZXNlbnQsCi0JICogdGhpcyBmaWVsZCBob2xkcyB0aGUgbnVtYmVyIG9mIGNhbWVyYSBodyBjb3JlCi0JICogd2hpY2ggYXJlIGJ1bmRsZWQgdG9nZXRoZXIgaW4gdGhlIGFib3ZlCi0JICogaW50ZXJydXB0LiA+IDEgaW4gY2FzZSBvZiBjb21wb3NpdGUgaXJxcy4KLQkgKiBJZiBJUlEgUm91dGVyIGh3IGlzIG5vdCBwcmVzZW50LCB0aGlzIGZpZWxkIHNob3VsZCBiZSBzZXQgdG8gMS4gKi8KLQlpbnQgbnVtX2h3Y29yZTsKLQkvKiBQb2ludGVycyB0byB0aGUgc3ViZGV2cyBjb21wb3NpdGVkIGluIHRoaXMKLQkgKiBpcnEuIElmIG5vdCBjb21wb3NpdGUsIHRoZSAwdGggaW5kZXggc3RvcmVzIHRoZSBzdWJkZXYgdG8gd2hpY2gKLQkgKiB0aGlzIGlycSBuZWVkcyB0byBiZSBkaXNwYXRjaGVkIHRvLiAqLwotCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2X2xpc3RbQ0FNRVJBX1NTX0lSUV9NQVhdOwotCS8qIERldmljZSByZXF1ZXN0aW5nIHRoZSBpcnEuICovCi0JY29uc3QgY2hhciAqZGV2X25hbWU7Ci0JLyogc3ViZGV2IHByaXZhdGUgZGF0YSwgaWYgYW55ICovCi0Jdm9pZCAqZGF0YTsKLX07Ci0KLXN0cnVjdCBpcnFtZ3JfaW50cl9sa3VwX3RhYmxlIHsKLQkvKiBJbmRpdmlkdWFsKGh3KSBpbnRlcnJ1cHQgbG9va3VwIHRhYmxlOgotCSAqIFRoaXMgdGFibGUgaXMgcG9wdWxhdGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQgZG9lc250Ci0JICogY2hhbmdlLCB1bmxlc3MgdGhlIElSUSBSb3V0ZXIgaGFzIGJlZW4gY29uZmlndXJlZAotCSAqIGZvciBjb21wb3NpdGUgSVJRcy4gSWYgdGhlIElSUSBSb3V0ZXIgaGFzIGJlZW4gY29uZmlndXJlZAotCSAqIGZvciBjb21wb3NpdGUgSVJRcywgdGhlIGlzX2NvbXBvc2l0ZSBmaWVsZCBvZiB0aGF0IElSUSB3aWxsCi0JICogYmUgc2V0IHRvIDEoZGVmYXVsdCAwKS4gQW5kIHdoZW4gdGhlcmUgaXMgYW4gaW50ZXJydXB0IG9uCi0JICogdGhhdCBsaW5lLCB0aGUgY29tcG9zaXRlIGludGVycnVwdCBsb29rdXAgdGFibGUgaXMgdXNlZAotCSAqIGZvciBoYW5kbGluZyB0aGUgaW50ZXJydXB0LiAqLwotCXN0cnVjdCBpbnRyX3RhYmxlX2VudHJ5IGluZF9pbnRyX3RibFtDQU1FUkFfU1NfSVJRX01BWF07Ci0KLQkvKiBDb21wb3NpdGUgaW50ZXJydXB0IGxvb2t1cCB0YWJsZToKLQkgKiBUaGlzIHRhYmxlIGNhbiBiZSBkeW5hbWljYWxseSBtb2RpZmllZCBiYXNlZCBvbiB0aGUgdXNlY2FzZS4KLQkgKiBJZiB0aGUgdXNlY2FzZSByZXF1aXJlcyB0d28gb3IgbW9yZSBIVyBjb3JlIElSUXMgdG8gYmUgYnVuZGxlZAotCSAqIGludG8gYSBzaW5nbGUgY29tcG9zaXRlIElSUSwgdGhlbiB0aGlzIHRhYmxlIGlzIHBvcHVsYXRlZAotCSAqIGFjY29yZGluZ2x5LiBBbHNvIHdoZW4gdGhpcyBpcyBkb25lLCB0aGUgY29tcG9zaXRlIGZpZWxkCi0JICogaW4gdGhlIGludHJfbG9va3VwX3RhYmxlIGhhcyB0byBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhhdAotCSAqIHRoZSBpcnEgJ2lycV9udW0nIHdpbGwgbm93ICBiZSB0cmlnZ2VyZWQgaW4gY29tcG9zaXRlIG1vZGUuICovCi0Jc3RydWN0IGludHJfdGFibGVfZW50cnkgY29tcF9pbnRyX3RibFtDQU1FUkFfU1NfSVJRX01BWF07Ci19OwotCi1zdHJ1Y3QgaW50ZXJmYWNlX21hcCB7Ci0JLyogVGhlIGludGVyZmFjZSBhIHBhcnRpY3VsYXIgc3RyZWFtIGJlbG9uZ3MgdG8uCi0JICogUElYMCwgUkRJMCwgUkRJMSwgb3IgUkRJMgotCSAqLwotCWludCBpbnRlcmZhY2U7Ci0JLyogVGhlIGhhbmRsZSBvZiB0aGUgbWN0bCBpbnN0YW5jZSwgaW50ZXJmYWNlIHJ1bnMgb24gKi8KLQl1aW50MzJfdCBtY3RsX2hhbmRsZTsKLQlpbnQgdm5vZGVfaWQ7Ci0JaW50IGlzX2JheWVyX3NlbnNvcjsKLX07Ci0KLS8qIGFic3RyYWN0IGNhbWVyYSBzZXJ2ZXIgZGV2aWNlIGZvciBhbGwgc2Vuc29yIHN1Y2Nlc3NmdWxseSBwcm9iZWQqLwotc3RydWN0IG1zbV9jYW1fc2VydmVyX2RldiB7Ci0KLQkvKiBjb25maWcgbm9kZSBkZXZpY2UqLwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNlcnZlcl9wZGV2OwotCS8qIHNlcnZlciBub2RlIHY0bDIgZGV2aWNlICovCi0Jc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OwotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZpZGVvX2RldjsKLQlzdHJ1Y3QgbWVkaWFfZGV2aWNlIG1lZGlhX2RldjsKLQotCS8qIGluZm8gb2Ygc2Vuc29ycyBzdWNjZXNzZnVsbHkgcHJvYmVkKi8KLQlzdHJ1Y3QgbXNtX2NhbWVyYV9pbmZvIGNhbWVyYV9pbmZvOwotCS8qIGluZm8gb2YgY29uZmlncyBzdWNjZXNzZnVsbHkgY3JlYXRlZCovCi0Jc3RydWN0IG1zbV9jYW1fY29uZmlnX2Rldl9pbmZvIGNvbmZpZ19pbmZvOwotCS8qIGFjdGl2ZSB3b3JraW5nIGNhbWVyYSBkZXZpY2UgLSBvbmx5IG9uZSBhbGxvd2VkIGF0IHRoaXMgdGltZSovCi0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW1fYWN0aXZlW01BWF9OVU1fQUNUSVZFX0NBTUVSQV07Ci0JLyogc2F2ZSB0aGUgb3BlbmVkIHBjYW0gZm9yIGZpbmRpbmcgdGhlIG1jdGwgd2hlbiBkb2luZyBidWYgbG9va3VwICovCi0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKm9wZW5lZF9wY2FtW01BWF9OVU1fQUNUSVZFX0NBTUVSQV07Ci0JLyogbnVtYmVyIG9mIGNhbWVyYSBkZXZpY2VzIG9wZW5lZCovCi0JYXRvbWljX3QgbnVtYmVyX3BjYW1fYWN0aXZlOwotCXN0cnVjdCB2NGwyX3F1ZXVlX3V0aWwgc2VydmVyX2NvbW1hbmRfcXVldWU7Ci0KLQkvKiBUaGlzIHF1ZXVlIHVzZWQgYnkgdGhlIGNvbmZpZyB0aHJlYWQgdG8gc2VuZCByZXNwb25zZXMgYmFjayB0byB0aGUKLQkgKiBjb250cm9sIHRocmVhZC4gIEl0IGlzIGFjY2Vzc2VkIG9ubHkgZnJvbSBhIHByb2Nlc3MgY29udGV4dC4KLQkgKi8KLQlzdHJ1Y3QgbXNtX2NhbV9zZXJ2ZXJfcXVldWUgc2VydmVyX3F1ZXVlW01BWF9OVU1fQUNUSVZFX0NBTUVSQV07Ci0JdWludDMyX3Qgc2VydmVyX2V2dF9pZDsKLQotCXN0cnVjdCBtc21fY2FtX3NlcnZlcl9tY3RsX2luc3QgbWN0bFtNQVhfTlVNX0FDVElWRV9DQU1FUkFdOwotCXVpbnQzMl90IG1jdGxfaGFuZGxlX2NudDsKLQotCXN0cnVjdCBpbnRlcmZhY2VfbWFwIGludGVyZmFjZV9tYXBfdGFibGVbSU5URl9NQVhdOwotCi0JaW50IHVzZV9jb3VudDsKLQkvKiBhbGwgdGhlIHJlZ2lzdGVyZWQgSVNQIHN1YmRldmljZSovCi0Jc3RydWN0IG1zbV9pc3Bfb3BzICppc3Bfc3ViZGV2W01TTV9NQVhfQ0FNRVJBX0NPTkZJR1NdOwotCS8qIGluZm8gb2YgTUNUTCBub2RlcyBzdWNjZXNzZnVsbHkgcHJvYmVkKi8KLQlzdHJ1Y3QgbXNtX21jdGxfbm9kZV9pbmZvIG1jdGxfbm9kZV9pbmZvOwotCXN0cnVjdCBtdXRleCBzZXJ2ZXJfbG9jazsKLQlzdHJ1Y3QgbXV0ZXggc2VydmVyX3F1ZXVlX2xvY2s7Ci0JLyp2NGwyIHN1YmRldnMqLwotCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Vuc29yX2RldmljZVtNQVhfTlVNX1NFTlNPUl9ERVZdOwotCXN0cnVjdCB2NGwyX3N1YmRldiAqY3NpcGh5X2RldmljZVtNQVhfTlVNX0NTSVBIWV9ERVZdOwotCXN0cnVjdCB2NGwyX3N1YmRldiAqY3NpZF9kZXZpY2VbTUFYX05VTV9DU0lEX0RFVl07Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICpjc2ljX2RldmljZVtNQVhfTlVNX0NTSUNfREVWXTsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmlzcGlmX2RldmljZVtNQVhfTlVNX0lTUElGX0RFVl07Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICp2ZmVfZGV2aWNlW01BWF9OVU1fVkZFX0RFVl07Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICpheGlfZGV2aWNlW01BWF9OVU1fQVhJX0RFVl07Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICp2cGVfZGV2aWNlW01BWF9OVU1fVlBFX0RFVl07Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICpnZXN0dXJlX2RldmljZTsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmNwcF9kZXZpY2VbTUFYX05VTV9DUFBfREVWXTsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmlycXJfZGV2aWNlOwotCXN0cnVjdCB2NGwyX3N1YmRldiAqY2NpX2RldmljZTsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmZsYXNoX2RldmljZVtNQVhfTlVNX0ZMQVNIX0RFVl07Ci0KLQlzcGlubG9ja190ICBpbnRyX3RhYmxlX2xvY2s7Ci0Jc3RydWN0IGlycW1ncl9pbnRyX2xrdXBfdGFibGUgaXJxX2xrdXBfdGFibGU7Ci0JLyogU3RvcmVzIHRoZSBwb2ludGVyIHRvIHRoZSBzdWJkZXYgd2hlbiB0aGUgaW5kaXZpZHVhbAotCSAqIHN1YmRldmljZXMgcmVnaXN0ZXIgdGhlbXNlbHZlcyB3aXRoIHRoZSBzZXJ2ZXIuIFRoaXMKLQkgKiB3aWxsIGJlIHVzZWQgd2hpbGUgZGlzcGF0Y2hpbmcgY29tcG9zaXRlIGlycXMuIFRoZQotCSAqIGNhbV9od19pZHggd2lsbCBzZXJ2ZSBhcyB0aGUgaW5kZXggaW50byB0aGlzIGFycmF5IHRvCi0JICogZGlzcGF0Y2ggdGhlIGlycSB0byB0aGUgY29ycmVzcG9uZGluZyBzdWJkZXYuICovCi0Jc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXZfdGFibGVbTVNNX0NBTV9IV19NQVhdOwotCXN0cnVjdCBtc21fY2FtX3NlcnZlcl9pcnFtYXBfZW50cnkgaHdfaXJxbWFwW0NBTUVSQV9TU19JUlFfTUFYXTsKLQotICAgIC8qSU9NTVUgZG9tYWluIChQYWdlIHRhYmxlKSovCi0JaW50IGRvbWFpbl9udW07Ci0Jc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluOwotfTsKLQotZW51bSBtc21fY2FtX2J1Zl9sb29rdXBfdHlwZSB7Ci0JQlVGX0xPT0tVUF9JTlZBTElELAotCUJVRl9MT09LVVBfQllfSU1HX01PREUsCi0JQlVGX0xPT0tVUF9CWV9JTlNUX0hBTkRMRSwKLX07Ci0KLXN0cnVjdCBtc21fY2FtX2J1Zl9oYW5kbGUgewotCXVpbnQxNl90IGJ1Zl9sb29rdXBfdHlwZTsKLQl1aW50MzJfdCBpbWFnZV9tb2RlOwotCXVpbnQzMl90IGluc3RfaGFuZGxlOwotfTsKLQotLyogSVNQIHJlbGF0ZWQgZnVuY3Rpb25zICovCi12b2lkIG1zbV9pc3BfdmZlX2Rldl9pbml0KHN0cnVjdCB2NGwyX3N1YmRldiAqdmQpOwotaW50IG1zbV9pc3BfY29uZmlnKHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWludCBtc21faXNwX25vdGlmeShzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1bnNpZ25lZCBpbnQgbm90aWZpY2F0aW9uLCB2b2lkICphcmcpOwotLyoKLWludCBtc21faXNwX3JlZ2lzdGVyKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtKTsKLSovCi1pbnQgbXNtX3NlbnNvcl9yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKik7Ci1pbnQgbXNtX2lzcF9pbml0X21vZHVsZShpbnQgZ19udW1fY29uZmlnX25vZGVzKTsKLQotaW50IG1zbV9tY3RsX2luaXQoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0pOwotaW50IG1zbV9tY3RsX2ZyZWUoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0pOwotaW50IG1zbV9tY3RsX2J1Zl9pbml0KHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtKTsKLWludCBtc21fbWN0bF9pbml0X3VzZXJfZm9ybWF0cyhzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSk7Ci1pbnQgbXNtX21jdGxfYnVmX2RvbmUoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwsCi0Jc3RydWN0IG1zbV9jYW1fYnVmX2hhbmRsZSAqYnVmX2hhbmRsZSwKLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmICpidWYsCi0JdWludDMyX3QgZnJhbWVfaWQpOwotaW50IG1zbV9tY3RsX2J1Zl9kb25lX3BwKHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXN0cnVjdCBtc21fY2FtX2J1Zl9oYW5kbGUgKmJ1Zl9oYW5kbGUsCi0Jc3RydWN0IG1zbV9mcmVlX2J1ZiAqZnJhbWUsCi0Jc3RydWN0IG1zbV9jYW1fcmV0dXJuX2ZyYW1lX2luZm8gKnJldF9mcmFtZSk7Ci1pbnQgbXNtX21jdGxfcmVzZXJ2ZV9mcmVlX2J1ZihzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3QsCi0Jc3RydWN0IG1zbV9jYW1fYnVmX2hhbmRsZSAqYnVmX2hhbmRsZSwKLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmICpmcmVlX2J1Zik7Ci1pbnQgbXNtX21jdGxfcmVsZWFzZV9mcmVlX2J1ZihzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3QsCi0Jc3RydWN0IG1zbV9mcmVlX2J1ZiAqZnJlZV9idWYpOwotLypNZW1vcnkoUE1FTSkgZnVuY3Rpb25zKi8KLWludCBtc21fcmVnaXN0ZXJfcG1lbShzdHJ1Y3QgaGxpc3RfaGVhZCAqcHR5cGUsIHZvaWQgX191c2VyICphcmcsCi0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgaW50IGRvbWFpbl9udW0pOwotaW50IG1zbV9wbWVtX3RhYmxlX2RlbChzdHJ1Y3QgaGxpc3RfaGVhZCAqcHR5cGUsIHZvaWQgX191c2VyICphcmcsCi0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgaW50IGRvbWFpbl9udW0pOwotaW50IG1zbV9wbWVtX3JlZ2lvbl9nZXRfcGh5X2FkZHIoc3RydWN0IGhsaXN0X2hlYWQgKnB0eXBlLAotCXN0cnVjdCBtc21fbWVtX21hcF9pbmZvICptZW1fbWFwLCBpbnQzMl90ICpwaHlhZGRyKTsKLXVpbnQ4X3QgbXNtX3BtZW1fcmVnaW9uX2xvb2t1cChzdHJ1Y3QgaGxpc3RfaGVhZCAqcHR5cGUsCi0JaW50IHBtZW1fdHlwZSwgc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiAqcmVnLCB1aW50OF90IG1heGNvdW50KTsKLXVpbnQ4X3QgbXNtX3BtZW1fcmVnaW9uX2xvb2t1cF8yKHN0cnVjdCBobGlzdF9oZWFkICpwdHlwZSwKLQlpbnQgcG1lbV90eXBlLCBzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uICpyZWcsCi0JdWludDhfdCBtYXhjb3VudCk7Ci11bnNpZ25lZCBsb25nIG1zbV9wbWVtX3N0YXRzX3Z0b3BfbG9va3VwKAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKm1jdGwsCi0JdW5zaWduZWQgbG9uZyBidWZmZXIsIGludCBmZCk7Ci11bnNpZ25lZCBsb25nIG1zbV9wbWVtX3N0YXRzX3B0b3ZfbG9va3VwKAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKm1jdGwsCi0JdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgKmZkKTsKLQotaW50IG1zbV92ZmVfc3ViZGV2X2luaXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCk7Ci12b2lkIG1zbV92ZmVfc3ViZGV2X3JlbGVhc2Uoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCk7Ci0KLWludCBtc21faXNwX3N1YmRldl9pb2N0bChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXN0cnVjdCBtc21fdmZlX2NmZ19jbWQgKmNmZ2NtZCwgdm9pZCAqZGF0YSk7Ci1pbnQgbXNtX3ZwZV9zdWJkZXZfaW5pdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKTsKLWludCBtc21fZ2VtaW5pX3N1YmRldl9pbml0KHN0cnVjdCB2NGwyX3N1YmRldiAqZ2VtaW5pX3NkKTsKLXZvaWQgbXNtX3ZwZV9zdWJkZXZfcmVsZWFzZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKTsKLXZvaWQgbXNtX2dlbWluaV9zdWJkZXZfcmVsZWFzZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKmdlbWluaV9zZCk7Ci1pbnQgbXNtX21jdGxfaXNfcHBfbXNnX3R5cGUoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcF9tY3RsLAotCWludCBtc2dfdHlwZSk7Ci1pbnQgbXNtX21jdGxfZG9fcHAoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcF9tY3RsLAotCWludCBtc2dfdHlwZSwgdWludDMyX3QgeV9waHksIHVpbnQzMl90IGZyYW1lX2lkKTsKLWludCBtc21fbWN0bF9wcF9pb2N0bChzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwX21jdGwsCi0JdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotaW50IG1zbV9tY3RsX3BwX25vdGlmeShzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQlzdHJ1Y3QgbXNtX21jdGxfcHBfZnJhbWVfaW5mbyAqcHBfZnJhbWVfaW5mbyk7Ci1pbnQgbXNtX21jdGxfaW1nX21vZGVfdG9faW5zdF9pbmRleChzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQlpbnQgb3V0X3R5cGUsIGludCBub2RlX3R5cGUpOwotc3RydWN0IG1zbV9mcmFtZV9idWZmZXIgKm1zbV9tY3RsX2J1Zl9maW5kKAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdCwgaW50IGRlbF9idWYsCi0Jc3RydWN0IG1zbV9mcmVlX2J1ZiAqZmJ1Zik7Ci12b2lkIG1zbV9tY3RsX2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqdHYpOwotaW50IG1zbV9tY3RsX2NoZWNrX3BwKHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBfbWN0bCwKLQlpbnQgbXNnX3R5cGUsIGludCAqcHBfZGl2ZXJ0X3R5cGUsIGludCAqcHBfdHlwZSk7Ci1pbnQgbXNtX21jdGxfZG9fcHBfZGl2ZXJ0KAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBfbWN0bCwKLQlzdHJ1Y3QgbXNtX2NhbV9idWZfaGFuZGxlICpidWZfaGFuZGxlLAotCXN0cnVjdCBtc21fZnJlZV9idWYgKmZidWYsCi0JdWludDMyX3QgZnJhbWVfaWQsIGludCBwcF90eXBlKTsKLWludCBtc21fbWN0bF9wcF9yZWxlYXNlX2ZyZWVfZnJhbWUoCi0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcF9tY3RsLAotCXZvaWQgX191c2VyICphcmcpOwotaW50IG1zbV9tY3RsX3BwX3Jlc2VydmVfZnJlZV9mcmFtZSgKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwX21jdGwsCi0Jdm9pZCBfX3VzZXIgKmFyZyk7Ci1pbnQgbXNtX21jdGxfc2V0X3BwX2tleShzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwX21jdGwsCi0Jdm9pZCBfX3VzZXIgKmFyZyk7Ci1pbnQgbXNtX21jdGxfcHBfZG9uZSgKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwX21jdGwsCi0Jdm9pZCBfX3VzZXIgKmFyZyk7Ci1pbnQgbXNtX21jdGxfcHBfZGl2ZXJ0X2RvbmUoCi0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcF9tY3RsLAotCXZvaWQgX191c2VyICphcmcpOwotdm9pZCBtc21fc2V0dXBfdjRsMl9ldmVudF9xdWV1ZShzdHJ1Y3QgdjRsMl9maCAqZXZlbnRIYW5kbGUsCi0Jc3RydWN0IHZpZGVvX2RldmljZSAqcHZkZXYpOwotdm9pZCBtc21fZGVzdHJveV92NGwyX2V2ZW50X3F1ZXVlKHN0cnVjdCB2NGwyX2ZoICpldmVudEhhbmRsZSk7Ci1pbnQgbXNtX3NldHVwX21jdGxfbm9kZShzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSk7Ci1zdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICptc21fbWN0bF9nZXRfcGNhbV9pbnN0KAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXN0cnVjdCBtc21fY2FtX2J1Zl9oYW5kbGUgKmJ1Zl9oYW5kbGUpOwotaW50IG1zbV9tY3RsX2J1Zl9yZXR1cm5fYnVmKHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCWludCBpbWFnZV9tb2RlLCBzdHJ1Y3QgbXNtX2ZyYW1lX2J1ZmZlciAqYnVmKTsKLWludCBtc21fbWN0bF9tYXBfdXNlcl9mcmFtZShzdHJ1Y3QgbXNtX2NhbV9tZXRhX2ZyYW1lICptZXRhX2ZyYW1lLAotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIGludCBkb21haW5fbnVtKTsKLWludCBtc21fbWN0bF91bm1hcF91c2VyX2ZyYW1lKHN0cnVjdCBtc21fY2FtX21ldGFfZnJhbWUgKm1ldGFfZnJhbWUsCi0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgaW50IGRvbWFpbl9udW0pOwotaW50IG1zbV9tY3RsX3BwX21jdGxfZGl2ZXJ0X2RvbmUoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcF9tY3RsLAotCXZvaWQgX191c2VyICphcmcpOwotdm9pZCBtc21fcmVsZWFzZV9pb25fY2xpZW50KHN0cnVjdCBrcmVmICpyZWYpOwotaW50IG1zbV9jYW1fcmVnaXN0ZXJfc3ViZGV2X25vZGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQlzdHJ1Y3QgbXNtX2NhbV9zdWJkZXZfaW5mbyAqc2RfaW5mbyk7Ci1pbnQgbXNtX21jdGxfZmluZF9zZW5zb3Jfc3ViZGV2cyhzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwX21jdGwsCi0JdWludDhfdCBjc2lwaHlfY29yZV9pbmRleCwgdWludDhfdCBjc2lkX2NvcmVfaW5kZXgpOwotaW50IG1zbV9tY3RsX2ZpbmRfZmxhc2hfc3ViZGV2KHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBfbWN0bCwKLQl1aW50OF90IGluZGV4KTsKLWludCBtc21fc2VydmVyX29wZW5fY2xpZW50KGludCAqcF9xaWR4KTsKLWludCBtc21fc2VydmVyX3NlbmRfY3RybChzdHJ1Y3QgbXNtX2N0cmxfY21kICpvdXQsIGludCBjdHJsX2lkKTsKLWludCBtc21fc2VydmVyX2Nsb3NlX2NsaWVudChpbnQgaWR4KTsKLWludCBtc21fY2FtX3NlcnZlcl9vcGVuX21jdGxfc2Vzc2lvbihzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSwKLQlpbnQgKnBfYWN0aXZlKTsKLWludCBtc21fY2FtX3NlcnZlcl9jbG9zZV9tY3RsX3Nlc3Npb24oc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0pOwotbG9uZyBtc21fdjRsMl9ldnRfbm90aWZ5KHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKm1jdGwsCi0JdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBldnQpOwotaW50IG1zbV9tY3RsX3BwX2dldF92cGVfYnVmX2luZm8oc3RydWN0IG1zbV9tY3RsX3BwX2ZyYW1lX2luZm8gKnpvb20pOwotdm9pZCBtc21fcXVldWVfaW5pdChzdHJ1Y3QgbXNtX2RldmljZV9xdWV1ZSAqcXVldWUsIGNvbnN0IGNoYXIgKm5hbWUpOwotdm9pZCBtc21fZW5xdWV1ZShzdHJ1Y3QgbXNtX2RldmljZV9xdWV1ZSAqcXVldWUsIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5KTsKLXZvaWQgbXNtX2RyYWluX2V2ZW50cShzdHJ1Y3QgbXNtX2RldmljZV9xdWV1ZSAqcXVldWUpOwotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9NU01fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV9heGlfcW9zLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtX2F4aV9xb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM0ODRkMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtX2F4aV9xb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jZGVmaW5lIE1TTV9BWElfUU9TX05BTUUgIm1zbV9jYW1lcmEiCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrICplYmkxX2NsazsKLQotaW50IGFkZF9heGlfcW9zKHZvaWQpCi17Ci0JZWJpMV9jbGsgPSBjbGtfZ2V0KE5VTEwsICJlYmkxX3ZmZV9jbGsiKTsKLQlpZiAoSVNfRVJSKGViaTFfY2xrKSkKLQkJZWJpMV9jbGsgPSBOVUxMOwotCWVsc2UgewotCQljbGtfcHJlcGFyZShlYmkxX2Nsayk7Ci0JCWNsa19lbmFibGUoZWJpMV9jbGspOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgdXBkYXRlX2F4aV9xb3ModWludDMyX3QgcmF0ZSkKLXsKLQlpZiAoIWViaTFfY2xrKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBjbGtfc2V0X3JhdGUoZWJpMV9jbGssIHJhdGUgKiAxMDAwKTsKLX0KLQotdm9pZCByZWxlYXNlX2F4aV9xb3Modm9pZCkKLXsKLQlpZiAoIWViaTFfY2xrKQotCQlyZXR1cm47Ci0KLQljbGtfZGlzYWJsZShlYmkxX2Nsayk7Ci0JY2xrX3VucHJlcGFyZShlYmkxX2Nsayk7Ci0JY2xrX3B1dChlYmkxX2Nsayk7Ci0JZWJpMV9jbGsgPSBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV9jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tc21fY2FtZXJhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxM2NjYzcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV9jYW1lcmEuYworKysgL2Rldi9udWxsCkBAIC0xLDQwNTIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0vL0ZJWE1FOiBtb3N0IGFsbG9jYXRpb25zIG5lZWQgbm90IGJlIEdGUF9BVE9NSUMKLS8qIEZJWE1FOiBtYW5hZ2VtZW50IG9mIG11dGV4ZXMgKi8KLS8qIEZJWE1FOiBtc21fcG1lbV9yZWdpb25fbG9va3VwIHJldHVybiB2YWx1ZXMgKi8KLS8qIEZJWE1FOiB3YXkgdG9vIG1hbnkgY29weSB0by9mcm9tIHVzZXIgKi8KLS8qIEZJWE1FOiBkb2VzIHJlZ2lvbi0+YWN0aXZlIG1lYW4gZnJlZSAqLwotLyogRklYTUU6IGNoZWNrIGxpbWl0cyBvbiBjb21tYW5kIGxlbmdodHMgcGFzc2VkIGZyb20gdXNlcnNwYWNlICovCi0vKiBGSVhNRTogX19tc21fcmVsZWFzZTogd2hpY2ggcXVldWVzIHNob3VsZCB3ZSBmbHVzaCB3aGVuIG9wZW5jbnQgIT0gMCAqLwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+Ci0jaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KLQotI2luY2x1ZGUgPG1hY2gvY3B1aWRsZS5oPgotREVGSU5FX01VVEVYKGN0cmxfY21kX2xvY2spOwotCi0jZGVmaW5lIENBTUVSQV9TVE9QX1ZJREVPIDU4Ci1zcGlubG9ja190IHBwX3ByZXZfc3BpbmxvY2s7Ci1zcGlubG9ja190IHBwX3N0ZXJlb2NhbV9zcGlubG9jazsKLXNwaW5sb2NrX3Qgc3RfZnJhbWVfc3BpbmxvY2s7Ci0KLSNkZWZpbmUgRVJSX1VTRVJfQ09QWSh0bykgcHJfZXJyKCIlcyglZCk6IGNvcHkgJXMgdXNlclxuIiwgXAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgKCh0bykgPyAidG8iIDogImZyb20iKSkKLSNkZWZpbmUgRVJSX0NPUFlfRlJPTV9VU0VSKCkgRVJSX1VTRVJfQ09QWSgwKQotI2RlZmluZSBFUlJfQ09QWV9UT19VU0VSKCkgRVJSX1VTRVJfQ09QWSgxKQotI2RlZmluZSBNQVhfUE1FTV9DRkdfQlVGRkVSUyAxMAotCi1zdGF0aWMgc3RydWN0IGNsYXNzICptc21fY2xhc3M7Ci1zdGF0aWMgZGV2X3QgbXNtX2Rldm5vOwotc3RhdGljIExJU1RfSEVBRChtc21fc2Vuc29ycyk7Ci1zdHJ1Y3QgIG1zbV9jb250cm9sX2RldmljZSAqZ192NGwyX2NvbnRyb2xfZGV2aWNlOwotaW50IGdfdjRsMl9vcGVuY250Owotc3RhdGljIGludCBjYW1lcmFfbm9kZTsKLXN0YXRpYyBlbnVtIG1zbV9jYW1lcmFfdHlwZSBjYW1lcmFfdHlwZVtNU01fTUFYX0NBTUVSQV9TRU5TT1JTXTsKLXN0YXRpYyB1aW50MzJfdCBzZW5zb3JfbW91bnRfYW5nbGVbTVNNX01BWF9DQU1FUkFfU0VOU09SU107Ci0KLXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnRfZm9yX2lvbjsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnZmZV9jb25maWdfY21kW10gPSB7Ci0JIkNNRF9HRU5FUkFMIiwgIC8qIDAgKi8KLQkiQ01EX0FYSV9DRkdfT1VUMSIsCi0JIkNNRF9BWElfQ0ZHX1NOQVBfTzFfQU5EX08yIiwKLQkiQ01EX0FYSV9DRkdfT1VUMiIsCi0JIkNNRF9QSUNUX1RfQVhJX0NGRyIsCi0JIkNNRF9QSUNUX01fQVhJX0NGRyIsICAvKiA1ICovCi0JIkNNRF9SQVdfUElDVF9BWElfQ0ZHIiwKLQkiQ01EX0ZSQU1FX0JVRl9SRUxFQVNFIiwKLQkiQ01EX1BSRVZfQlVGX0NGRyIsCi0JIkNNRF9TTkFQX0JVRl9SRUxFQVNFIiwKLQkiQ01EX1NOQVBfQlVGX0NGRyIsICAvKiAxMCAqLwotCSJDTURfU1RBVFNfRElTQUJMRSIsCi0JIkNNRF9TVEFUU19BRUNfQVdCX0VOQUJMRSIsCi0JIkNNRF9TVEFUU19BRl9FTkFCTEUiLAotCSJDTURfU1RBVFNfQUVDX0VOQUJMRSIsCi0JIkNNRF9TVEFUU19BV0JfRU5BQkxFIiwgIC8qIDE1ICovCi0JIkNNRF9TVEFUU19FTkFCTEUiLAotCSJDTURfU1RBVFNfQVhJX0NGRyIsCi0JIkNNRF9TVEFUU19BRUNfQVhJX0NGRyIsCi0JIkNNRF9TVEFUU19BRl9BWElfQ0ZHIiwKLQkiQ01EX1NUQVRTX0FXQl9BWElfQ0ZHIiwgIC8qIDIwICovCi0JIkNNRF9TVEFUU19SU19BWElfQ0ZHIiwKLQkiQ01EX1NUQVRTX0NTX0FYSV9DRkciLAotCSJDTURfU1RBVFNfSUhJU1RfQVhJX0NGRyIsCi0JIkNNRF9TVEFUU19TS0lOX0FYSV9DRkciLAotCSJDTURfU1RBVFNfQlVGX1JFTEVBU0UiLCAgLyogMjUgKi8KLQkiQ01EX1NUQVRTX0FFQ19CVUZfUkVMRUFTRSIsCi0JIkNNRF9TVEFUU19BRl9CVUZfUkVMRUFTRSIsCi0JIkNNRF9TVEFUU19BV0JfQlVGX1JFTEVBU0UiLAotCSJDTURfU1RBVFNfUlNfQlVGX1JFTEVBU0UiLAotCSJDTURfU1RBVFNfQ1NfQlVGX1JFTEVBU0UiLCAgLyogMzAgKi8KLQkiQ01EX1NUQVRTX0lISVNUX0JVRl9SRUxFQVNFIiwKLQkiQ01EX1NUQVRTX1NLSU5fQlVGX1JFTEVBU0UiLAotCSJVUERBVEVfU1RBVFNfSU5WQUxJRCIsCi0JIkNNRF9BWElfQ0ZHX1NOQVBfR0VNSU5JIiwKLQkiQ01EX0FYSV9DRkdfU05BUCIsICAvKiAzNSAqLwotCSJDTURfQVhJX0NGR19QUkVWSUVXIiwKLQkiQ01EX0FYSV9DRkdfVklERU8iLAotCSJDTURfU1RBVFNfSUhJU1RfRU5BQkxFIiwKLQkiQ01EX1NUQVRTX1JTX0VOQUJMRSIsCi0JIkNNRF9TVEFUU19DU19FTkFCTEUiLCAgLyogNDAgKi8KLQkiQ01EX1ZQRSIsCi0JIkNNRF9BWElfQ0ZHX1ZQRSIsCi0JIkNNRF9BWElfQ0ZHX1NOQVBfVlBFIiwKLQkiQ01EX0FYSV9DRkdfU05BUF9USFVNQl9WUEUiLAotfTsKLSNkZWZpbmUgX19DT05UQUlOUyhyLCB2LCBsLCBmaWVsZCkgKHsJCQkJXAotCXR5cGVvZihyKSBfX3IgPSByOwkJCQkJXAotCXR5cGVvZih2KSBfX3YgPSB2OwkJCQkJXAotCXR5cGVvZih2KSBfX2UgPSBfX3YgKyBsOwkJCQlcCi0JaW50IHJlcyA9IF9fdiA+PSBfX3ItPmZpZWxkICYmCQkJCVwKLQkJX19lIDw9IF9fci0+ZmllbGQgKyBfX3ItPmxlbjsJCQlcCi0JcmVzOwkJCQkJCQlcCi19KQotCi0jZGVmaW5lIENPTlRBSU5TKHIxLCByMiwgZmllbGQpICh7CQkJCVwKLQl0eXBlb2YocjIpIF9fcjIgPSByMjsJCQkJCVwKLQlfX0NPTlRBSU5TKHIxLCBfX3IyLT5maWVsZCwgX19yMi0+bGVuLCBmaWVsZCk7CQlcCi19KQotCi0jZGVmaW5lIElOX1JBTkdFKHIsIHYsIGZpZWxkKSAoewkJCQlcCi0JdHlwZW9mKHIpIF9fciA9IHI7CQkJCQlcCi0JdHlwZW9mKHYpIF9fdnYgPSB2OwkJCQkJXAotCWludCByZXMgPSAoKF9fdnYgPj0gX19yLT5maWVsZCkgJiYJCQlcCi0JCShfX3Z2IDwgKF9fci0+ZmllbGQgKyBfX3ItPmxlbikpKTsJCVwKLQlyZXM7CQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgT1ZFUkxBUFMocjEsIHIyLCBmaWVsZCkgKHsJCQkJXAotCXR5cGVvZihyMSkgX19yMSA9IHIxOwkJCQkJXAotCXR5cGVvZihyMikgX19yMiA9IHIyOwkJCQkJXAotCXR5cGVvZihfX3IyLT5maWVsZCkgX192ID0gX19yMi0+ZmllbGQ7CQkJXAotCXR5cGVvZihfX3YpIF9fZSA9IF9fdiArIF9fcjItPmxlbiAtIDE7CQkJXAotCWludCByZXMgPSAoSU5fUkFOR0UoX19yMSwgX192LCBmaWVsZCkgfHwJCVwKLQkJICAgSU5fUkFOR0UoX19yMSwgX19lLCBmaWVsZCkpOyAgICAgICAgICAgICAgICAgXAotCXJlczsJCQkJCQkJXAotfSkKLQotc3RhdGljIGlubGluZSB2b2lkIGZyZWVfcWNtZChzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqcWNtZCkKLXsKLQlpZiAoIXFjbWQgfHwgIWF0b21pY19yZWFkKCZxY21kLT5vbl9oZWFwKSkKLQkJcmV0dXJuOwotCWlmICghYXRvbWljX3N1Yl9yZXR1cm4oMSwgJnFjbWQtPm9uX2hlYXApKQotCQlrZnJlZShxY21kKTsKLX0KLQotc3RhdGljIHZvaWQgbXNtX3JlZ2lvbl9pbml0KHN0cnVjdCBtc21fc3luYyAqc3luYykKLXsKLQlJTklUX0hMSVNUX0hFQUQoJnN5bmMtPnBtZW1fZnJhbWVzKTsKLQlJTklUX0hMSVNUX0hFQUQoJnN5bmMtPnBtZW1fc3RhdHMpOwotCXNwaW5fbG9ja19pbml0KCZzeW5jLT5wbWVtX2ZyYW1lX3NwaW5sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmc3luYy0+cG1lbV9zdGF0c19zcGlubG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9xdWV1ZV9pbml0KHN0cnVjdCBtc21fZGV2aWNlX3F1ZXVlICpxdWV1ZSwgY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzcGluX2xvY2tfaW5pdCgmcXVldWUtPmxvY2spOwotCXF1ZXVlLT5sZW4gPSAwOwotCXF1ZXVlLT5tYXggPSAwOwotCXF1ZXVlLT5uYW1lID0gbmFtZTsKLQlJTklUX0xJU1RfSEVBRCgmcXVldWUtPmxpc3QpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnF1ZXVlLT53YWl0KTsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2VucXVldWUoc3RydWN0IG1zbV9kZXZpY2VfcXVldWUgKnF1ZXVlLAotCQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+bG9jaywgZmxhZ3MpOwotCXF1ZXVlLT5sZW4rKzsKLQlpZiAocXVldWUtPmxlbiA+IHF1ZXVlLT5tYXgpIHsKLQkJcXVldWUtPm1heCA9IHF1ZXVlLT5sZW47Ci0JCUNEQkcoIiVzOiBxdWV1ZSAlcyBuZXcgbWF4IGlzICVkXG4iLCBfX2Z1bmNfXywKLQkJCXF1ZXVlLT5uYW1lLCBxdWV1ZS0+bWF4KTsKLQl9Ci0JbGlzdF9hZGRfdGFpbChlbnRyeSwgJnF1ZXVlLT5saXN0KTsKLQl3YWtlX3VwKCZxdWV1ZS0+d2FpdCk7Ci0JQ0RCRygiJXM6IHdva2UgdXAgJXNcbiIsIF9fZnVuY19fLCBxdWV1ZS0+bmFtZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2VucXVldWVfdnBlKHN0cnVjdCBtc21fZGV2aWNlX3F1ZXVlICpxdWV1ZSwKLQkJc3RydWN0IGxpc3RfaGVhZCAqZW50cnkpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPmxvY2ssIGZsYWdzKTsKLQlxdWV1ZS0+bGVuKys7Ci0JaWYgKHF1ZXVlLT5sZW4gPiBxdWV1ZS0+bWF4KSB7Ci0JCXF1ZXVlLT5tYXggPSBxdWV1ZS0+bGVuOwotCQlDREJHKCIlczogcXVldWUgJXMgbmV3IG1heCBpcyAlZFxuIiwgX19mdW5jX18sCi0JCQlxdWV1ZS0+bmFtZSwgcXVldWUtPm1heCk7Ci0JfQotCWxpc3RfYWRkX3RhaWwoZW50cnksICZxdWV1ZS0+bGlzdCk7Ci0gICAgQ0RCRygiJXM6IHdva2UgdXAgJXNcbiIsIF9fZnVuY19fLCBxdWV1ZS0+bmFtZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmxvY2ssIGZsYWdzKTsKLX0KLQotI2RlZmluZSBtc21fZGVxdWV1ZShxdWV1ZSwgbWVtYmVyKSAoewkJCQlcCi0JdW5zaWduZWQgbG9uZyBmbGFnczsJCQkJCVwKLQlzdHJ1Y3QgbXNtX2RldmljZV9xdWV1ZSAqX19xID0gKHF1ZXVlKTsJCQlcCi0Jc3RydWN0IG1zbV9xdWV1ZV9jbWQgKnFjbWQgPSAwOwkJCQlcCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJl9fcS0+bG9jaywgZmxhZ3MpOwkJCVwKLQlpZiAoIWxpc3RfZW1wdHkoJl9fcS0+bGlzdCkpIHsJCQkJXAotCQlfX3EtPmxlbi0tOwkJCQkJXAotCQlxY21kID0gbGlzdF9maXJzdF9lbnRyeSgmX19xLT5saXN0LAkJXAotCQkJCXN0cnVjdCBtc21fcXVldWVfY21kLCBtZW1iZXIpOwlcCi0JCWlmICgocWNtZCkgJiYgKCZxY21kLT5tZW1iZXIpICYmICgmcWNtZC0+bWVtYmVyLm5leHQpKQlcCi0JCQlsaXN0X2RlbF9pbml0KCZxY21kLT5tZW1iZXIpOwkJCVwKLQl9CQkJCQkJCVwKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZfX3EtPmxvY2ssIGZsYWdzKTsJXAotCXFjbWQ7CQkJCQkJCVwKLX0pCi0KLSNkZWZpbmUgbXNtX2RlbGV0ZV9lbnRyeShxdWV1ZSwgbWVtYmVyLCBxX2NtZCkgKHsJCVwKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwkJCQkJXAotCXN0cnVjdCBtc21fZGV2aWNlX3F1ZXVlICpfX3EgPSAocXVldWUpOwkJCVwKLQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqcWNtZCA9IDA7CQkJCVwKLQlzcGluX2xvY2tfaXJxc2F2ZSgmX19xLT5sb2NrLCBmbGFncyk7CQkJXAotCWlmICghbGlzdF9lbXB0eSgmX19xLT5saXN0KSkgewkJCQlcCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkocWNtZCwgJl9fcS0+bGlzdCwgbWVtYmVyKQlcCi0JCWlmIChxY21kID09IHFfY21kKSB7CQkJCVwKLQkJCV9fcS0+bGVuLS07CQkJCVwKLQkJCWxpc3RfZGVsX2luaXQoJnFjbWQtPm1lbWJlcik7CQlcCi0JCQlDREJHKCJtc21fZGVsZXRlX2VudHJ5LCBtYXRjaCBmb3VuZFxuIik7XAotCQkJa2ZyZWUocV9jbWQpOwkJCQlcCi0JCQlxX2NtZCA9IE5VTEw7CQkJCVwKLQkJCWJyZWFrOwkJCQkJXAotCQl9CQkJCQkJXAotCX0JCQkJCQkJXAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJl9fcS0+bG9jaywgZmxhZ3MpOwkJXAotCXFfY21kOwkJXAotfSkKLQotI2RlZmluZSBtc21fcXVldWVfZHJhaW4ocXVldWUsIG1lbWJlcikgZG8gewkJCVwKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwkJCQkJXAotCXN0cnVjdCBtc21fZGV2aWNlX3F1ZXVlICpfX3EgPSAocXVldWUpOwkJCVwKLQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqcWNtZDsJCQkJXAotCXNwaW5fbG9ja19pcnFzYXZlKCZfX3EtPmxvY2ssIGZsYWdzKTsJCQlcCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZfX3EtPmxpc3QpKSB7CQkJXAotCQlfX3EtPmxlbi0tOwkJCQkJXAotCQlxY21kID0gbGlzdF9maXJzdF9lbnRyeSgmX19xLT5saXN0LAkJXAotCQkJc3RydWN0IG1zbV9xdWV1ZV9jbWQsIG1lbWJlcik7CQlcCi0JCWlmIChxY21kKSB7CQkJCQlcCi0JCQlpZiAoJnFjbWQtPm1lbWJlcikJXAotCQkJCWxpc3RfZGVsX2luaXQoJnFjbWQtPm1lbWJlcik7CQlcCi0JCQlmcmVlX3FjbWQocWNtZCk7CQkJCVwKLQkJfQkJCQkJCQlcCi0JfQkJCQkJCQlcCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmX19xLT5sb2NrLCBmbGFncyk7CQlcCi19IHdoaWxlICgwKQotCi1zdGF0aWMgaW50IGNoZWNrX292ZXJsYXAoc3RydWN0IGhsaXN0X2hlYWQgKnB0eXBlLAotCQkJdW5zaWduZWQgbG9uZyBwYWRkciwKLQkJCXVuc2lnbmVkIGxvbmcgbGVuKQotewotCXN0cnVjdCBtc21fcG1lbV9yZWdpb24gKnJlZ2lvbjsKLQlzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uIHQgPSB7IC5wYWRkciA9IHBhZGRyLCAubGVuID0gbGVuIH07Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7Ci0KLQlobGlzdF9mb3JfZWFjaF9lbnRyeShyZWdpb24sIG5vZGUsIHB0eXBlLCBsaXN0KSB7Ci0JCWlmIChDT05UQUlOUyhyZWdpb24sICZ0LCBwYWRkcikgfHwKLQkJCQlDT05UQUlOUygmdCwgcmVnaW9uLCBwYWRkcikgfHwKLQkJCQlPVkVSTEFQUyhyZWdpb24sICZ0LCBwYWRkcikpIHsKLQkJCUNEQkcoIiByZWdpb24gKFBIWVMgJXAgbGVuICVsZCkiCi0JCQkJIiBjbGFzaGVzIHdpdGggcmVnaXN0ZXJlZCByZWdpb24iCi0JCQkJIiAocGFkZHIgJXAgbGVuICVsZClcbiIsCi0JCQkJKHZvaWQgKil0LnBhZGRyLCB0LmxlbiwKLQkJCQkodm9pZCAqKXJlZ2lvbi0+cGFkZHIsIHJlZ2lvbi0+bGVuKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNoZWNrX3BtZW1faW5mbyhzdHJ1Y3QgbXNtX3BtZW1faW5mbyAqaW5mbywgaW50IGxlbikKLXsKLQlpZiAoaW5mby0+b2Zmc2V0IDwgbGVuICYmCi0JICAgIGluZm8tPm9mZnNldCArIGluZm8tPmxlbiA8PSBsZW4gJiYKLQkgICAgaW5mby0+cGxhbmFyMF9vZmYgPCBsZW4gJiYKLQkgICAgaW5mby0+cGxhbmFyMV9vZmYgPCBsZW4gJiYKLQkgICAgaW5mby0+cGxhbmFyMl9vZmYgPCBsZW4pCi0JCXJldHVybiAwOwotCi0JcHJfZXJyKCIlczogY2hlY2sgZmFpbGVkOiBvZmYgJWQgbGVuICVkIHkgMHgleCBjYmNyX3AxIDB4JXggcDJfYWRkIDB4JXgodG90YWwgbGVuICVkKVxuIiwKLQkJX19mdW5jX18sCi0JCWluZm8tPm9mZnNldCwKLQkJaW5mby0+bGVuLAotCQlpbmZvLT5wbGFuYXIwX29mZiwKLQkJaW5mby0+cGxhbmFyMV9vZmYsCi0JCWluZm8tPnBsYW5hcjJfb2ZmLAotCQlsZW4pOwotCXJldHVybiAtRUlOVkFMOwotfQotc3RhdGljIGludCBtc21fcG1lbV90YWJsZV9hZGQoc3RydWN0IGhsaXN0X2hlYWQgKnB0eXBlLAotCXN0cnVjdCBtc21fcG1lbV9pbmZvICppbmZvLCBzcGlubG9ja190KiBwbWVtX3NwaW5sb2NrLAotCXN0cnVjdCBtc21fc3luYyAqc3luYykKLXsKLQl1bnNpZ25lZCBsb25nIHBhZGRyOwotI2lmbmRlZiBDT05GSUdfTVNNX01VTFRJTUVESUFfVVNFX0lPTgotCXN0cnVjdCBmaWxlICpmaWxlOwotCXVuc2lnbmVkIGxvbmcga3ZzdGFydDsKLSNlbmRpZgotCXVuc2lnbmVkIGxvbmcgbGVuOwotCWludCByYyA9IC1FTk9NRU07Ci0Jc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiAqcmVnaW9uOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlyZWdpb24gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZWdpb24pCi0JCWdvdG8gb3V0OwotI2lmZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0JCXJlZ2lvbi0+aGFuZGxlID0gaW9uX2ltcG9ydF9kbWFfYnVmKGNsaWVudF9mb3JfaW9uLCBpbmZvLT5mZCk7Ci0JCWlmIChJU19FUlJfT1JfTlVMTChyZWdpb24tPmhhbmRsZSkpCi0JCQlnb3RvIG91dDE7Ci0JCWlvbl9waHlzKGNsaWVudF9mb3JfaW9uLCByZWdpb24tPmhhbmRsZSwKLQkJCSZwYWRkciwgKHNpemVfdCAqKSZsZW4pOwotI2VuZGlmCi0JaWYgKCFpbmZvLT5sZW4pCi0JCWluZm8tPmxlbiA9IGxlbjsKLQotCXJjID0gY2hlY2tfcG1lbV9pbmZvKGluZm8sIGxlbik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBvdXQyOwotCi0JcGFkZHIgKz0gaW5mby0+b2Zmc2V0OwotCWxlbiA9IGluZm8tPmxlbjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKHBtZW1fc3BpbmxvY2ssIGZsYWdzKTsKLQlpZiAoY2hlY2tfb3ZlcmxhcChwdHlwZSwgcGFkZHIsIGxlbikgPCAwKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocG1lbV9zcGlubG9jaywgZmxhZ3MpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0MjsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwbWVtX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZShwbWVtX3NwaW5sb2NrLCBmbGFncyk7Ci0JSU5JVF9ITElTVF9OT0RFKCZyZWdpb24tPmxpc3QpOwotCi0JcmVnaW9uLT5wYWRkciA9IHBhZGRyOwotCXJlZ2lvbi0+bGVuID0gbGVuOwotCW1lbWNweSgmcmVnaW9uLT5pbmZvLCBpbmZvLCBzaXplb2YocmVnaW9uLT5pbmZvKSk7Ci0KLQlobGlzdF9hZGRfaGVhZCgmKHJlZ2lvbi0+bGlzdCksIHB0eXBlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHBtZW1fc3BpbmxvY2ssIGZsYWdzKTsKLQlDREJHKCIlczogdHlwZSAlZCwgcGFkZHIgMHglbHgsIHZhZGRyIDB4JWx4IHAwX2FkZCA9IDB4JXgiCi0JCSJwMV9hZGRyID0gMHgleCBwMl9hZGRyID0gMHgleFxuIiwKLQkJX19mdW5jX18sIGluZm8tPnR5cGUsIHBhZGRyLCAodW5zaWduZWQgbG9uZylpbmZvLT52YWRkciwKLQkJaW5mby0+cGxhbmFyMF9vZmYsIGluZm8tPnBsYW5hcjFfb2ZmLCBpbmZvLT5wbGFuYXIyX29mZik7Ci0JcmV0dXJuIDA7Ci1vdXQyOgotI2lmZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0JaW9uX2ZyZWUoY2xpZW50X2Zvcl9pb24sIHJlZ2lvbi0+aGFuZGxlKTsKLSNlbmRpZgotb3V0MToKLQlrZnJlZShyZWdpb24pOwotb3V0OgotCXJldHVybiByYzsKLX0KLQotLyogcmV0dXJuIG9mIDAgbWVhbnMgZmFpbHVyZSAqLwotc3RhdGljIHVpbnQ4X3QgbXNtX3BtZW1fcmVnaW9uX2xvb2t1cChzdHJ1Y3QgaGxpc3RfaGVhZCAqcHR5cGUsCi0JaW50IHBtZW1fdHlwZSwgc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiAqcmVnLCB1aW50OF90IG1heGNvdW50LAotCXNwaW5sb2NrX3QgKnBtZW1fc3BpbmxvY2spCi17Ci0Jc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiAqcmVnaW9uOwotCXN0cnVjdCBtc21fcG1lbV9yZWdpb24gKnJlZ3B0cjsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm47Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0KLQl1aW50OF90IHJjID0gMDsKLQotCXJlZ3B0ciA9IHJlZzsKLQlzcGluX2xvY2tfaXJxc2F2ZShwbWVtX3NwaW5sb2NrLCBmbGFncyk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZWdpb24sIG5vZGUsIG4sIHB0eXBlLCBsaXN0KSB7Ci0JCWlmIChyZWdpb24tPmluZm8udHlwZSA9PSBwbWVtX3R5cGUgJiYgcmVnaW9uLT5pbmZvLmFjdGl2ZSkgewotCQkJKnJlZ3B0ciA9ICpyZWdpb247Ci0JCQlyYyArPSAxOwotCQkJaWYgKHJjID49IG1heGNvdW50KQotCQkJCWJyZWFrOwotCQkJcmVncHRyKys7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwbWVtX3NwaW5sb2NrLCBmbGFncyk7Ci0JLyogQWZ0ZXIgbG9va3VwIGZhaWx1cmUsIGR1bXAgYWxsIHRoZSBsaXN0IGVudHJpZXMuLi4qLwotCWlmIChyYyA9PSAwKSB7Ci0JCXByX2VycigiJXM6IHBtZW1fdHlwZSA9ICVkXG4iLCBfX2Z1bmNfXywgcG1lbV90eXBlKTsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZWdpb24sIG5vZGUsIG4sIHB0eXBlLCBsaXN0KSB7Ci0JCQlwcl9lcnIoImxpc3RlZCByZWdpb24tPmluZm8udHlwZSA9ICVkLCBhY3RpdmUgPSAlZCIsCi0JCQkJcmVnaW9uLT5pbmZvLnR5cGUsIHJlZ2lvbi0+aW5mby5hY3RpdmUpOwotCQl9Ci0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdWludDhfdCBtc21fcG1lbV9yZWdpb25fbG9va3VwXzIoc3RydWN0IGhsaXN0X2hlYWQgKnB0eXBlLAotCQkJCQlpbnQgcG1lbV90eXBlLAotCQkJCQlzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uICpyZWcsCi0JCQkJCXVpbnQ4X3QgbWF4Y291bnQsCi0JCQkJCXNwaW5sb2NrX3QgKnBtZW1fc3BpbmxvY2spCi17Ci0Jc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiAqcmVnaW9uOwotCXN0cnVjdCBtc21fcG1lbV9yZWdpb24gKnJlZ3B0cjsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm47Ci0JdWludDhfdCByYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0JcmVncHRyID0gcmVnOwotCXNwaW5fbG9ja19pcnFzYXZlKHBtZW1fc3BpbmxvY2ssIGZsYWdzKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlZ2lvbiwgbm9kZSwgbiwgcHR5cGUsIGxpc3QpIHsKLQkJQ0RCRygiJXM6aW5mby50eXBlPSVkLCBwbWVtX3R5cGUgPSAlZCwiCi0JCQkJCQkiaW5mby5hY3RpdmUgPSAlZFxuIiwKLQkJX19mdW5jX18sIHJlZ2lvbi0+aW5mby50eXBlLCBwbWVtX3R5cGUsIHJlZ2lvbi0+aW5mby5hY3RpdmUpOwotCi0JCWlmIChyZWdpb24tPmluZm8udHlwZSA9PSBwbWVtX3R5cGUgJiYgcmVnaW9uLT5pbmZvLmFjdGl2ZSkgewotCQkJQ0RCRygiJXM6aW5mby50eXBlPSVkLCBwbWVtX3R5cGUgPSAlZCwiCi0JCQkJCQkJImluZm8uYWN0aXZlID0gJWQsXG4iLAotCQkJCV9fZnVuY19fLCByZWdpb24tPmluZm8udHlwZSwgcG1lbV90eXBlLAotCQkJCXJlZ2lvbi0+aW5mby5hY3RpdmUpOwotCQkJKnJlZ3B0ciA9ICpyZWdpb247Ci0JCQlyZWdpb24tPmluZm8udHlwZSA9IE1TTV9QTUVNX1ZJREVPOwotCQkJcmMgKz0gMTsKLQkJCWlmIChyYyA+PSBtYXhjb3VudCkKLQkJCQlicmVhazsKLQkJCXJlZ3B0cisrOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocG1lbV9zcGlubG9jaywgZmxhZ3MpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fcG1lbV9mcmFtZV9wdG92X2xvb2t1cChzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsCi0JCXVuc2lnbmVkIGxvbmcgcDBhZGRyLAotCQl1bnNpZ25lZCBsb25nIHAxYWRkciwKLQkJdW5zaWduZWQgbG9uZyBwMmFkZHIsCi0JCXN0cnVjdCBtc21fcG1lbV9pbmZvICpwbWVtX2luZm8sCi0JCWludCBjbGVhcl9hY3RpdmUpCi17Ci0Jc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiAqcmVnaW9uOwotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzeW5jLT5wbWVtX2ZyYW1lX3NwaW5sb2NrLCBmbGFncyk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZWdpb24sIG5vZGUsIG4sICZzeW5jLT5wbWVtX2ZyYW1lcywgbGlzdCkgewotCQlpZiAocDBhZGRyID09IChyZWdpb24tPnBhZGRyICsgcmVnaW9uLT5pbmZvLnBsYW5hcjBfb2ZmKSAmJgotCQkJcDFhZGRyID09IChyZWdpb24tPnBhZGRyICsgcmVnaW9uLT5pbmZvLnBsYW5hcjFfb2ZmKSAmJgotCQkJcDJhZGRyID09IChyZWdpb24tPnBhZGRyICsgcmVnaW9uLT5pbmZvLnBsYW5hcjJfb2ZmKSAmJgotCQkJcmVnaW9uLT5pbmZvLmFjdGl2ZSkgewotCQkJLyogb2Zmc2V0IHNpbmNlIHdlIGNvdWxkIHBhc3MgdmFkZHIgaW5zaWRlCi0JCQkgKiBhIHJlZ2lzdGVyZCBwbWVtIGJ1ZmZlcgotCQkJICovCi0JCQltZW1jcHkocG1lbV9pbmZvLCAmcmVnaW9uLT5pbmZvLCBzaXplb2YoKnBtZW1faW5mbykpOwotCQkJaWYgKGNsZWFyX2FjdGl2ZSkKLQkJCQlyZWdpb24tPmluZm8uYWN0aXZlID0gMDsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bmMtPnBtZW1fZnJhbWVfc3BpbmxvY2ssCi0JCQkJZmxhZ3MpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JLyogQWZ0ZXIgbG9va3VwIGZhaWx1cmUsIGR1bXAgYWxsIHRoZSBsaXN0IGVudHJpZXMuLi4gKi8KLQlwcl9lcnIoIiVzLCBmb3IgcGxhbmUwIGFkZHIgPSAweCVseCwgcGxhbmUxIGFkZHIgPSAweCVseCAgcGxhbmUyIGFkZHIgPSAweCVseFxuIiwKLQkJCV9fZnVuY19fLCBwMGFkZHIsIHAxYWRkciwgcDJhZGRyKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlZ2lvbiwgbm9kZSwgbiwgJnN5bmMtPnBtZW1fZnJhbWVzLCBsaXN0KSB7Ci0JCXByX2VycigibGlzdGVkIHAwYWRkciAweCVseCwgcDFhZGRyIDB4JWx4LCBwMmFkZHIgMHglbHgsIGFjdGl2ZSA9ICVkIiwKLQkJCQkocmVnaW9uLT5wYWRkciArIHJlZ2lvbi0+aW5mby5wbGFuYXIwX29mZiksCi0JCQkJKHJlZ2lvbi0+cGFkZHIgKyByZWdpb24tPmluZm8ucGxhbmFyMV9vZmYpLAotCQkJCShyZWdpb24tPnBhZGRyICsgcmVnaW9uLT5pbmZvLnBsYW5hcjJfb2ZmKSwKLQkJCQlyZWdpb24tPmluZm8uYWN0aXZlKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW5jLT5wbWVtX2ZyYW1lX3NwaW5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BtZW1fZnJhbWVfcHRvdl9sb29rdXAyKHN0cnVjdCBtc21fc3luYyAqc3luYywKLQkJdW5zaWduZWQgbG9uZyBwMF9waHksCi0JCXN0cnVjdCBtc21fcG1lbV9pbmZvICpwbWVtX2luZm8sCi0JCWludCBjbGVhcl9hY3RpdmUpCi17Ci0Jc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiAqcmVnaW9uOwotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzeW5jLT5wbWVtX2ZyYW1lX3NwaW5sb2NrLCBmbGFncyk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZWdpb24sIG5vZGUsIG4sICZzeW5jLT5wbWVtX2ZyYW1lcywgbGlzdCkgewotCQlpZiAocDBfcGh5ID09IChyZWdpb24tPnBhZGRyICsgcmVnaW9uLT5pbmZvLnBsYW5hcjBfb2ZmKSAmJgotCQkJCXJlZ2lvbi0+aW5mby5hY3RpdmUpIHsKLQkJCS8qIG9mZnNldCBzaW5jZSB3ZSBjb3VsZCBwYXNzIHZhZGRyIGluc2lkZQotCQkJICogYSByZWdpc3RlcmQgcG1lbSBidWZmZXIKLQkJCSAqLwotCQkJbWVtY3B5KHBtZW1faW5mbywgJnJlZ2lvbi0+aW5mbywgc2l6ZW9mKCpwbWVtX2luZm8pKTsKLQkJCWlmIChjbGVhcl9hY3RpdmUpCi0JCQkJcmVnaW9uLT5pbmZvLmFjdGl2ZSA9IDA7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW5jLT5wbWVtX2ZyYW1lX3NwaW5sb2NrLAotCQkJCWZsYWdzKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luYy0+cG1lbV9mcmFtZV9zcGlubG9jaywgZmxhZ3MpOwotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtc21fcG1lbV9zdGF0c19wdG92X2xvb2t1cChzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsCi0JCXVuc2lnbmVkIGxvbmcgYWRkciwgaW50ICpmZCkKLXsKLQlzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uICpyZWdpb247Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICpuOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN5bmMtPnBtZW1fc3RhdHNfc3BpbmxvY2ssIGZsYWdzKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlZ2lvbiwgbm9kZSwgbiwgJnN5bmMtPnBtZW1fc3RhdHMsIGxpc3QpIHsKLQkJaWYgKGFkZHIgPT0gcmVnaW9uLT5wYWRkciAmJiByZWdpb24tPmluZm8uYWN0aXZlKSB7Ci0JCQkvKiBvZmZzZXQgc2luY2Ugd2UgY291bGQgcGFzcyB2YWRkciBpbnNpZGUgYQotCQkJICogcmVnaXN0ZXJlZCBwbWVtIGJ1ZmZlciAqLwotCQkJKmZkID0gcmVnaW9uLT5pbmZvLmZkOwotCQkJcmVnaW9uLT5pbmZvLmFjdGl2ZSA9IDA7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW5jLT5wbWVtX3N0YXRzX3NwaW5sb2NrLAotCQkJCWZsYWdzKTsKLQkJCXJldHVybiAodW5zaWduZWQgbG9uZykocmVnaW9uLT5pbmZvLnZhZGRyKTsKLQkJfQotCX0KLQkvKiBBZnRlciBsb29rdXAgZmFpbHVyZSwgZHVtcCBhbGwgdGhlIGxpc3QgZW50cmllcy4uLiAqLwotCXByX2VycigiJXMsIGxvb2t1cCBmYWlsdXJlLCBmb3IgcGFkZHIgMHglbHhcbiIsCi0JCQlfX2Z1bmNfXywgYWRkcik7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZWdpb24sIG5vZGUsIG4sICZzeW5jLT5wbWVtX3N0YXRzLCBsaXN0KSB7Ci0JCXByX2VycigibGlzdGVkIHBhZGRyIDB4JWx4LCBhY3RpdmUgPSAlZCIsCi0JCQkJcmVnaW9uLT5wYWRkciwKLQkJCQlyZWdpb24tPmluZm8uYWN0aXZlKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luYy0+cG1lbV9zdGF0c19zcGlubG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1zbV9wbWVtX2ZyYW1lX3Z0b3BfbG9va3VwKHN0cnVjdCBtc21fc3luYyAqc3luYywKLQkJdW5zaWduZWQgbG9uZyBidWZmZXIsIHVpbnQzMl90IHAwX29mZiwgdWludDMyX3QgcDFfb2ZmLAotCQl1aW50MzJfdCBwMl9vZmYsIGludCBmZCwgaW50IGNoYW5nZV9mbGFnKQotewotCXN0cnVjdCBtc21fcG1lbV9yZWdpb24gKnJlZ2lvbjsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm47Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3luYy0+cG1lbV9mcmFtZV9zcGlubG9jaywgZmxhZ3MpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVnaW9uLAotCQlub2RlLCBuLCAmc3luYy0+cG1lbV9mcmFtZXMsIGxpc3QpIHsKLQkJaWYgKCgodW5zaWduZWQgbG9uZykocmVnaW9uLT5pbmZvLnZhZGRyKSA9PSBidWZmZXIpICYmCi0JCQkJKHJlZ2lvbi0+aW5mby5wbGFuYXIwX29mZiA9PSBwMF9vZmYpICYmCi0JCQkJKHJlZ2lvbi0+aW5mby5wbGFuYXIxX29mZiA9PSBwMV9vZmYpICYmCi0JCQkJKHJlZ2lvbi0+aW5mby5wbGFuYXIyX29mZiA9PSBwMl9vZmYpICYmCi0JCQkJKHJlZ2lvbi0+aW5mby5mZCA9PSBmZCkgJiYKLQkJCQkocmVnaW9uLT5pbmZvLmFjdGl2ZSA9PSAwKSkgewotCQkJaWYgKGNoYW5nZV9mbGFnKQotCQkJCXJlZ2lvbi0+aW5mby5hY3RpdmUgPSAxOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luYy0+cG1lbV9mcmFtZV9zcGlubG9jaywKLQkJCQlmbGFncyk7Ci0JCQlyZXR1cm4gcmVnaW9uLT5wYWRkcjsKLQkJfQotCX0KLQkvKiBBZnRlciBsb29rdXAgZmFpbHVyZSwgZHVtcCBhbGwgdGhlIGxpc3QgZW50cmllcy4uLiAqLwotCXByX2VycigiJXMsIGZhaWxlZCBmb3IgdmFkZHIgMHglbHgsIHAwX29mZiAlZCBwMV9vZmYgJWRcbiIsCi0JCQlfX2Z1bmNfXywgYnVmZmVyLCBwMF9vZmYsIHAxX29mZik7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZWdpb24sIG5vZGUsIG4sICZzeW5jLT5wbWVtX2ZyYW1lcywgbGlzdCkgewotCQlwcl9lcnIoIiVzLCBsaXN0ZWQgdmFkZHIgMHglbHgsIHJfcDAgPSAweCV4IHAwX29mZiAweCV4IgotCQkJInJfcDEgPSAweCV4LCBwMV9vZmYgMHgleCwgcl9wMiA9IDB4JXgsIHAyX29mZiA9IDB4JXgiCi0JCQkiIGFjdGl2ZSA9ICVkXG4iLCBfX2Z1bmNfXywgYnVmZmVyLAotCQkJcmVnaW9uLT5pbmZvLnBsYW5hcjBfb2ZmLAotCQkJcDBfb2ZmLCByZWdpb24tPmluZm8ucGxhbmFyMV9vZmYsCi0JCQlwMV9vZmYsIHJlZ2lvbi0+aW5mby5wbGFuYXIyX29mZiwgcDJfb2ZmLAotCQkJcmVnaW9uLT5pbmZvLmFjdGl2ZSk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luYy0+cG1lbV9mcmFtZV9zcGlubG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1zbV9wbWVtX3N0YXRzX3Z0b3BfbG9va3VwKAotCQlzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsCi0JCXVuc2lnbmVkIGxvbmcgYnVmZmVyLAotCQlpbnQgZmQpCi17Ci0Jc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiAqcmVnaW9uOwotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzeW5jLT5wbWVtX3N0YXRzX3NwaW5sb2NrLCBmbGFncyk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZWdpb24sIG5vZGUsIG4sICZzeW5jLT5wbWVtX3N0YXRzLCBsaXN0KSB7Ci0JCWlmICgoKHVuc2lnbmVkIGxvbmcpKHJlZ2lvbi0+aW5mby52YWRkcikgPT0gYnVmZmVyKSAmJgotCQkJCShyZWdpb24tPmluZm8uZmQgPT0gZmQpICYmCi0JCQkJcmVnaW9uLT5pbmZvLmFjdGl2ZSA9PSAwKSB7Ci0JCQlyZWdpb24tPmluZm8uYWN0aXZlID0gMTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bmMtPnBtZW1fc3RhdHNfc3BpbmxvY2ssCi0JCQkJZmxhZ3MpOwotCQkJcmV0dXJuIHJlZ2lvbi0+cGFkZHI7Ci0JCX0KLQl9Ci0JLyogQWZ0ZXIgbG9va3VwIGZhaWx1cmUsIGR1bXAgYWxsIHRoZSBsaXN0IGVudHJpZXMuLi4gKi8KLQlwcl9lcnIoIiVzLGxvb2sgdXAgZXJyb3IgZm9yIHZhZGRyICVsZFxuIiwKLQkJCV9fZnVuY19fLCBidWZmZXIpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVnaW9uLCBub2RlLCBuLCAmc3luYy0+cG1lbV9zdGF0cywgbGlzdCkgewotCQlwcl9lcnIoImxpc3RlZCB2YWRkciAweCVwLCBhY3RpdmUgPSAlZCIsCi0JCQkJcmVnaW9uLT5pbmZvLnZhZGRyLAotCQkJCXJlZ2lvbi0+aW5mby5hY3RpdmUpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW5jLT5wbWVtX3N0YXRzX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX21zbV9wbWVtX3RhYmxlX2RlbChzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsCi0JCXN0cnVjdCBtc21fcG1lbV9pbmZvICpwaW5mbykKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fcG1lbV9yZWdpb24gKnJlZ2lvbjsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm47Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0KLQlzd2l0Y2ggKHBpbmZvLT50eXBlKSB7Ci0JY2FzZSBNU01fUE1FTV9QUkVWSUVXOgotCWNhc2UgTVNNX1BNRU1fVEhVTUJOQUlMOgotCWNhc2UgTVNNX1BNRU1fTUFJTklNRzoKLQljYXNlIE1TTV9QTUVNX1JBV19NQUlOSU1HOgotCWNhc2UgTVNNX1BNRU1fQzJEOgotCWNhc2UgTVNNX1BNRU1fTUFJTklNR19WUEU6Ci0JY2FzZSBNU01fUE1FTV9USFVNQk5BSUxfVlBFOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3luYy0+cG1lbV9mcmFtZV9zcGlubG9jaywgZmxhZ3MpOwotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlZ2lvbiwgbm9kZSwgbiwKLQkJCSZzeW5jLT5wbWVtX2ZyYW1lcywgbGlzdCkgewotCi0JCQlpZiAocGluZm8tPnR5cGUgPT0gcmVnaW9uLT5pbmZvLnR5cGUgJiYKLQkJCQkJcGluZm8tPnZhZGRyID09IHJlZ2lvbi0+aW5mby52YWRkciAmJgotCQkJCQlwaW5mby0+ZmQgPT0gcmVnaW9uLT5pbmZvLmZkKSB7Ci0JCQkJaGxpc3RfZGVsKG5vZGUpOwotI2lmZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0JCQkJaW9uX2ZyZWUoY2xpZW50X2Zvcl9pb24sIHJlZ2lvbi0+aGFuZGxlKTsKLSNlbmRpZgotCQkJCWtmcmVlKHJlZ2lvbik7Ci0JCQkJQ0RCRygiJXM6IHR5cGUgJWQsIHZhZGRyICAweCVwXG4iLAotCQkJCQlfX2Z1bmNfXywgcGluZm8tPnR5cGUsIHBpbmZvLT52YWRkcik7Ci0JCQl9Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luYy0+cG1lbV9mcmFtZV9zcGlubG9jaywgZmxhZ3MpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX1BNRU1fVklERU86Ci0JY2FzZSBNU01fUE1FTV9WSURFT19WUEU6Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZzeW5jLT5wbWVtX2ZyYW1lX3NwaW5sb2NrLCBmbGFncyk7Ci0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVnaW9uLCBub2RlLCBuLAotCQkJJnN5bmMtPnBtZW1fZnJhbWVzLCBsaXN0KSB7Ci0KLQkJCWlmICgoKHJlZ2lvbi0+aW5mby50eXBlID09IE1TTV9QTUVNX1ZJREVPKSB8fAotCQkJCShyZWdpb24tPmluZm8udHlwZSA9PSBNU01fUE1FTV9WSURFT19WUEUpKSAmJgotCQkJCXBpbmZvLT52YWRkciA9PSByZWdpb24tPmluZm8udmFkZHIgJiYKLQkJCQlwaW5mby0+ZmQgPT0gcmVnaW9uLT5pbmZvLmZkKSB7Ci0JCQkJaGxpc3RfZGVsKG5vZGUpOwotI2lmZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0JCQkJaW9uX2ZyZWUoY2xpZW50X2Zvcl9pb24sIHJlZ2lvbi0+aGFuZGxlKTsKLSNlbmRpZgotCQkJCWtmcmVlKHJlZ2lvbik7Ci0JCQkJQ0RCRygiJXM6IHR5cGUgJWQsIHZhZGRyICAweCVwXG4iLAotCQkJCQlfX2Z1bmNfXywgcGluZm8tPnR5cGUsIHBpbmZvLT52YWRkcik7Ci0JCQl9Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luYy0+cG1lbV9mcmFtZV9zcGlubG9jaywgZmxhZ3MpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX1BNRU1fQUVDX0FXQjoKLQljYXNlIE1TTV9QTUVNX0FGOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3luYy0+cG1lbV9zdGF0c19zcGlubG9jaywgZmxhZ3MpOwotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlZ2lvbiwgbm9kZSwgbiwKLQkJCSZzeW5jLT5wbWVtX3N0YXRzLCBsaXN0KSB7Ci0KLQkJCWlmIChwaW5mby0+dHlwZSA9PSByZWdpb24tPmluZm8udHlwZSAmJgotCQkJCQlwaW5mby0+dmFkZHIgPT0gcmVnaW9uLT5pbmZvLnZhZGRyICYmCi0JCQkJCXBpbmZvLT5mZCA9PSByZWdpb24tPmluZm8uZmQpIHsKLQkJCQlobGlzdF9kZWwobm9kZSk7Ci0jaWZkZWYgQ09ORklHX01TTV9NVUxUSU1FRElBX1VTRV9JT04KLQkJCQlpb25fZnJlZShjbGllbnRfZm9yX2lvbiwgcmVnaW9uLT5oYW5kbGUpOwotI2VuZGlmCi0JCQkJa2ZyZWUocmVnaW9uKTsKLQkJCQlDREJHKCIlczogdHlwZSAlZCwgdmFkZHIgIDB4JXBcbiIsCi0JCQkJCV9fZnVuY19fLCBwaW5mby0+dHlwZSwgcGluZm8tPnZhZGRyKTsKLQkJCX0KLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW5jLT5wbWVtX3N0YXRzX3NwaW5sb2NrLCBmbGFncyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BtZW1fdGFibGVfZGVsKHN0cnVjdCBtc21fc3luYyAqc3luYywgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlzdHJ1Y3QgbXNtX3BtZW1faW5mbyBpbmZvOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpIHsKLQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJldHVybiBfX21zbV9wbWVtX3RhYmxlX2RlbChzeW5jLCAmaW5mbyk7Ci19Ci0KLXN0YXRpYyBpbnQgX19tc21fZ2V0X2ZyYW1lKHN0cnVjdCBtc21fc3luYyAqc3luYywKLQkJc3RydWN0IG1zbV9mcmFtZSAqZnJhbWUpCi17Ci0JaW50IHJjID0gMDsKLQotCXN0cnVjdCBtc21fcG1lbV9pbmZvIHBtZW1faW5mbzsKLQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqcWNtZCA9IE5VTEw7Ci0Jc3RydWN0IG1zbV92ZmVfcmVzcCAqdmRhdGE7Ci0Jc3RydWN0IG1zbV92ZmVfcGh5X2luZm8gKnBwaHk7Ci0KLQlxY21kID0gbXNtX2RlcXVldWUoJnN5bmMtPmZyYW1lX3EsIGxpc3RfZnJhbWUpOwotCi0JaWYgKCFxY21kKSB7Ci0JCXByX2VycigiJXM6IG5vIHByZXZpZXcgZnJhbWUuXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQotCWlmICgoIXFjbWQtPmNvbW1hbmQpICYmIChxY21kLT5lcnJvcl9jb2RlICYgTVNNX0NBTUVSQV9FUlJfTUFTSykpIHsKLQkJZnJhbWUtPmVycm9yX2NvZGUgPSBxY21kLT5lcnJvcl9jb2RlOwotCQlwcl9lcnIoIiVzOiBmYWtlIGZyYW1lIHdpdGggY2FtZXJhIGVycm9yIGNvZGUgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBmcmFtZS0+ZXJyb3JfY29kZSk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXZkYXRhID0gKHN0cnVjdCBtc21fdmZlX3Jlc3AgKikocWNtZC0+Y29tbWFuZCk7Ci0JcHBoeSA9ICZ2ZGF0YS0+cGh5OwotCUNEQkcoIiVzLCBwcGh5LT5wMl9waHkgPSAweCV4XG4iLCBfX2Z1bmNfXywgcHBoeS0+cDJfcGh5KTsKLQotCXJjID0gbXNtX3BtZW1fZnJhbWVfcHRvdl9sb29rdXAoc3luYywKLQkJCXBwaHktPnAwX3BoeSwKLQkJCXBwaHktPnAxX3BoeSwKLQkJCXBwaHktPnAyX3BoeSwKLQkJCSZwbWVtX2luZm8sCi0JCQkxKTsgLyogQ2xlYXIgdGhlIGFjdGl2ZSBmbGFnICovCi0KLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNhbm5vdCBnZXQgZnJhbWUsIGludmFsaWQgbG9va3VwIGFkZHJlc3MiCi0JCSJwbGFuZTAgYWRkICV4IHBsYW5lMSBhZGQgJXggcGxhbmUyIGFkZCV4XG4iLAotCQlfX2Z1bmNfXywKLQkJcHBoeS0+cDBfcGh5LAotCQlwcGh5LT5wMV9waHksCi0JCXBwaHktPnAyX3BoeSk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWZyYW1lLT50cyA9IHFjbWQtPnRzOwotCWZyYW1lLT5idWZmZXIgPSAodW5zaWduZWQgbG9uZylwbWVtX2luZm8udmFkZHI7Ci0JZnJhbWUtPnBsYW5hcjBfb2ZmID0gcG1lbV9pbmZvLnBsYW5hcjBfb2ZmOwotCWZyYW1lLT5wbGFuYXIxX29mZiA9IHBtZW1faW5mby5wbGFuYXIxX29mZjsKLQlmcmFtZS0+cGxhbmFyMl9vZmYgPSBwbWVtX2luZm8ucGxhbmFyMl9vZmY7Ci0JZnJhbWUtPmZkID0gcG1lbV9pbmZvLmZkOwotCWZyYW1lLT5wYXRoID0gdmRhdGEtPnBoeS5vdXRwdXRfaWQ7Ci0JZnJhbWUtPmZyYW1lX2lkID0gdmRhdGEtPnBoeS5mcmFtZV9pZDsKLQlDREJHKCIlczogcGxhbmUwICV4LCBwbGFuZTEgJXgsIHBsYW5lMiAleCxxY21kICV4LCB2aXJ0X2FkZHIgJXhcbiIsCi0JCV9fZnVuY19fLCBwcGh5LT5wMF9waHksIHBwaHktPnAxX3BoeSwgcHBoeS0+cDJfcGh5LAotCQkoaW50KSBxY21kLCAoaW50KSBmcmFtZS0+YnVmZmVyKTsKLQotZXJyOgotCWZyZWVfcWNtZChxY21kKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2dldF9mcmFtZShzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsIHZvaWQgX191c2VyICphcmcpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2ZyYW1lIGZyYW1lOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZmcmFtZSwKLQkJCQlhcmcsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fZnJhbWUpKSkgewotCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmMgPSBfX21zbV9nZXRfZnJhbWUoc3luYywgJmZyYW1lKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQltdXRleF9sb2NrKCZzeW5jLT5sb2NrKTsKLQlpZiAoc3luYy0+Y3JvcGxlbiAmJiAoIXN5bmMtPnN0ZXJlb2NhbV9lbmFibGVkKSkgewotCQlpZiAoZnJhbWUuY3JvcGxlbiAhPSBzeW5jLT5jcm9wbGVuKSB7Ci0JCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGZyYW1lIGNyb3BsZW4gJWQsIgotCQkJCSJleHBlY3RpbmcgJWRcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJZnJhbWUuY3JvcGxlbiwKLQkJCQlzeW5jLT5jcm9wbGVuKTsKLQkJCW11dGV4X3VubG9jaygmc3luYy0+bG9jayk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilmcmFtZS5jcm9waW5mbywKLQkJCQlzeW5jLT5jcm9waW5mbywKLQkJCQlzeW5jLT5jcm9wbGVuKSkgewotCQkJRVJSX0NPUFlfVE9fVVNFUigpOwotCQkJbXV0ZXhfdW5sb2NrKCZzeW5jLT5sb2NrKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfQotCi0JaWYgKHN5bmMtPmZkcm9paW5mby5pbmZvKSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilmcmFtZS5yb2lfaW5mby5pbmZvLAotCQkJc3luYy0+ZmRyb2lpbmZvLmluZm8sCi0JCQlzeW5jLT5mZHJvaWluZm8uaW5mb19sZW4pKSB7Ci0JCQlFUlJfQ09QWV9UT19VU0VSKCk7Ci0JCQltdXRleF91bmxvY2soJnN5bmMtPmxvY2spOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0KLQlpZiAoc3luYy0+c3RlcmVvY2FtX2VuYWJsZWQpIHsKLQkJZnJhbWUuc3RjYW1fY29udl92YWx1ZSA9IHN5bmMtPnN0Y2FtX2NvbnZfdmFsdWU7Ci0JCWZyYW1lLnN0Y2FtX3F1YWxpdHlfaW5kID0gc3luYy0+c3RjYW1fcXVhbGl0eV9pbmQ7Ci0JfQotCi0JaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKLQkJCQkmZnJhbWUsIHNpemVvZihzdHJ1Y3QgbXNtX2ZyYW1lKSkpIHsKLQkJRVJSX0NPUFlfVE9fVVNFUigpOwotCQlyYyA9IC1FRkFVTFQ7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZzeW5jLT5sb2NrKTsKLQlDREJHKCIlczogZ290IGZyYW1lXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2VuYWJsZV92ZmUoc3RydWN0IG1zbV9zeW5jICpzeW5jLCB2b2lkIF9fdXNlciAqYXJnKQotewotCWludCByYyA9IC1FSU87Ci0Jc3RydWN0IGNhbWVyYV9lbmFibGVfY21kIGNmZzsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLAotCQkJYXJnLAotCQkJc2l6ZW9mKHN0cnVjdCBjYW1lcmFfZW5hYmxlX2NtZCkpKSB7Ci0JCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlpZiAoc3luYy0+dmZlZm4udmZlX2VuYWJsZSkKLQkJcmMgPSBzeW5jLT52ZmVmbi52ZmVfZW5hYmxlKCZjZmcpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9kaXNhYmxlX3ZmZShzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsIHZvaWQgX191c2VyICphcmcpCi17Ci0JaW50IHJjID0gLUVJTzsKLQlzdHJ1Y3QgY2FtZXJhX2VuYWJsZV9jbWQgY2ZnOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsCi0JCQlhcmcsCi0JCQlzaXplb2Yoc3RydWN0IGNhbWVyYV9lbmFibGVfY21kKSkpIHsKLQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCWlmIChzeW5jLT52ZmVmbi52ZmVfZGlzYWJsZSkKLQkJcmMgPSBzeW5jLT52ZmVmbi52ZmVfZGlzYWJsZSgmY2ZnLCBOVUxMKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHN0cnVjdCBtc21fcXVldWVfY21kICpfX21zbV9jb250cm9sKHN0cnVjdCBtc21fc3luYyAqc3luYywKLQkJc3RydWN0IG1zbV9kZXZpY2VfcXVldWUgKnF1ZXVlLAotCQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqcWNtZCwKLQkJaW50IHRpbWVvdXQpCi17Ci0JaW50IHJjOwotCi0JQ0RCRygiSW5zaWRlIF9fbXNtX2NvbnRyb2xcbiIpOwotCWlmIChzeW5jLT5ldmVudF9xLmxlbiA8PSAxMDAgJiYgc3luYy0+ZnJhbWVfcS5sZW4gPD0gMTAwKSB7Ci0JCS8qIHdha2UgdXAgY29uZmlnIHRocmVhZCAqLwotCQltc21fZW5xdWV1ZSgmc3luYy0+ZXZlbnRfcSwgJnFjbWQtPmxpc3RfY29uZmlnKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzLCBFcnJvciBRdWV1ZSBsaW1pdCBleGNlZWRlZCBlX3EgPSAlZCwgZl9xID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgc3luYy0+ZXZlbnRfcS5sZW4sIHN5bmMtPmZyYW1lX3EubGVuKTsKLQkJZnJlZV9xY21kKHFjbWQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFxdWV1ZSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiB3YWl0IGZvciBjb25maWcgc3RhdHVzICovCi0JQ0RCRygiV2FpdGluZyBmb3IgY29uZmlnIHN0YXR1cyBcbiIpOwotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCi0JCQlxdWV1ZS0+d2FpdCwKLQkJCSFsaXN0X2VtcHR5X2NhcmVmdWwoJnF1ZXVlLT5saXN0KSwKLQkJCXRpbWVvdXQpOwotCUNEQkcoIldhaXRpbmcgb3ZlciBmb3IgY29uZmlnIHN0YXR1c1xuIik7Ci0JaWYgKGxpc3RfZW1wdHlfY2FyZWZ1bCgmcXVldWUtPmxpc3QpKSB7Ci0JCWlmICghcmMpIHsKLQkJCXJjID0gLUVUSU1FRE9VVDsKLQkJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCQlyZXR1cm4gRVJSX1BUUihyYyk7Ci0JCX0gZWxzZSBpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQkJaWYgKG1zbV9kZWxldGVfZW50cnkoJnN5bmMtPmV2ZW50X3EsCi0JCQkJbGlzdF9jb25maWcsIHFjbWQpKSB7Ci0JCQkJc3luYy0+aWdub3JlX3FjbWQgPSB0cnVlOwotCQkJCXN5bmMtPmlnbm9yZV9xY21kX3R5cGUgPQotCQkJCQkoaW50MTZfdCkoKHN0cnVjdCBtc21fY3RybF9jbWQgKikKLQkJCQkJKHFjbWQtPmNvbW1hbmQpKS0+dHlwZTsKLQkJCX0KLQkJCXJldHVybiBFUlJfUFRSKHJjKTsKLQkJfQotCX0KLQlxY21kID0gbXNtX2RlcXVldWUocXVldWUsIGxpc3RfY29udHJvbCk7Ci0JQlVHX09OKCFxY21kKTsKLQlDREJHKCJfX21zbV9jb250cm9sIGRvbmUgXG4iKTsKLQlyZXR1cm4gcWNtZDsKLX0KLQotc3RhdGljIHN0cnVjdCBtc21fcXVldWVfY21kICpfX21zbV9jb250cm9sX25iKHN0cnVjdCBtc21fc3luYyAqc3luYywKLQkJCQkJc3RydWN0IG1zbV9xdWV1ZV9jbWQgKnFjbWRfdG9fY29weSkKLXsKLQkvKiBTaW5jZSB0aGlzIGlzIGEgbm9uLWJsb2NraW5nIGNvbW1hbmQsIHdlIGNhbm5vdCB1c2UgcWNtZF90b19jb3B5IGFuZAotCSAqIGl0cyBkYXRhLCBzaW5jZSB0aGV5IGFyZSBvbiB0aGUgc3RhY2suICBXZSByZXBsaWNhdGUgdGhlbSBvbiB0aGUgaGVhcAotCSAqIGFuZCBtYXJrIHRoZW0gb25faGVhcCBzbyB0aGF0IHRoZXkgZ2V0IGZyZWVkIHdoZW4gdGhlIGNvbmZpZyB0aHJlYWQKLQkgKiBkZXF1ZXVlcyB0aGVtLgotCSAqLwotCi0Jc3RydWN0IG1zbV9jdHJsX2NtZCAqdWRhdGE7Ci0Jc3RydWN0IG1zbV9jdHJsX2NtZCAqdWRhdGFfdG9fY29weSA9IHFjbWRfdG9fY29weS0+Y29tbWFuZDsKLQotCXN0cnVjdCBtc21fcXVldWVfY21kICpxY21kID0KLQkJCWttYWxsb2Moc2l6ZW9mKCpxY21kX3RvX2NvcHkpICsKLQkJCQlzaXplb2YoKnVkYXRhX3RvX2NvcHkpICsKLQkJCQl1ZGF0YV90b19jb3B5LT5sZW5ndGgsCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFxY21kKSB7Ci0JCXByX2VycigiJXM6IG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQotCSpxY21kID0gKnFjbWRfdG9fY29weTsKLQl1ZGF0YSA9IHFjbWQtPmNvbW1hbmQgPSBxY21kICsgMTsKLQltZW1jcHkodWRhdGEsIHVkYXRhX3RvX2NvcHksIHNpemVvZigqdWRhdGEpKTsKLQl1ZGF0YS0+dmFsdWUgPSB1ZGF0YSArIDE7Ci0JbWVtY3B5KHVkYXRhLT52YWx1ZSwgdWRhdGFfdG9fY29weS0+dmFsdWUsIHVkYXRhX3RvX2NvcHktPmxlbmd0aCk7Ci0KLQlhdG9taWNfc2V0KCZxY21kLT5vbl9oZWFwLCAxKTsKLQotCS8qIHFjbWRfcmVzcCB3aWxsIGJlIHNldCB0byBOVUxMICovCi0JcmV0dXJuIF9fbXNtX2NvbnRyb2woc3luYywgTlVMTCwgcWNtZCwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbnRyb2woc3RydWN0IG1zbV9jb250cm9sX2RldmljZSAqY3RybF9wbXNtLAotCQkJaW50IGJsb2NrLAotCQkJdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlpbnQgcmMgPSAwOwotCi0Jc3RydWN0IG1zbV9zeW5jICpzeW5jID0gY3RybF9wbXNtLT5wbXNtLT5zeW5jOwotCXZvaWQgX191c2VyICp1cHRyOwotCXN0cnVjdCBtc21fY3RybF9jbWQgdWRhdGFfcmVzcDsKLQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqcWNtZF9yZXNwID0gTlVMTDsKLQl1aW50OF90IGRhdGFbbWF4X2NvbnRyb2xfY29tbWFuZF9zaXplXTsKLQlzdHJ1Y3QgbXNtX2N0cmxfY21kICp1ZGF0YTsKLQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqcWNtZCA9Ci0JCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fcXVldWVfY21kKSArCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9jdHJsX2NtZCksIEdGUF9BVE9NSUMpOwotCWlmICghcWNtZCkgewotCQlwcl9lcnIoIiVzOiBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQl1ZGF0YSA9IChzdHJ1Y3QgbXNtX2N0cmxfY21kICopKHFjbWQgKyAxKTsKLQlhdG9taWNfc2V0KCYocWNtZC0+b25faGVhcCksIDEpOwotCUNEQkcoIkluc2lkZSBtc21fY29udHJvbFxuIik7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKHVkYXRhLCBhcmcsIHNpemVvZihzdHJ1Y3QgbXNtX2N0cmxfY21kKSkpIHsKLQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JdXB0ciA9IHVkYXRhLT52YWx1ZTsKLQl1ZGF0YS0+dmFsdWUgPSBkYXRhOwotCXFjbWQtPnR5cGUgPSBNU01fQ0FNX1FfQ1RSTDsKLQlxY21kLT5jb21tYW5kID0gdWRhdGE7Ci0KLQlpZiAodWRhdGEtPmxlbmd0aCkgewotCQlpZiAodWRhdGEtPmxlbmd0aCA+IHNpemVvZihkYXRhKSkgewotCQkJcHJfZXJyKCIlczogdXNlciBkYXRhIHRvbyBsYXJnZSAoJWQsIG1heCBpcyAlZClcbiIsCi0JCQkJCV9fZnVuY19fLAotCQkJCQl1ZGF0YS0+bGVuZ3RoLAotCQkJCQlzaXplb2YoZGF0YSkpOwotCQkJcmMgPSAtRUlPOwotCQkJZ290byBlbmQ7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKHVkYXRhLT52YWx1ZSwgdXB0ciwgdWRhdGEtPmxlbmd0aCkpIHsKLQkJCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBlbmQ7Ci0JCX0KLQl9Ci0KLQlpZiAodW5saWtlbHkoIWJsb2NrKSkgewotCQlxY21kX3Jlc3AgPSBfX21zbV9jb250cm9sX25iKHN5bmMsIHFjbWQpOwotCQlnb3RvIGVuZDsKLQl9Ci0JbXNtX3F1ZXVlX2RyYWluKCZjdHJsX3Btc20tPmN0cmxfcSwgbGlzdF9jb250cm9sKTsKLQlxY21kX3Jlc3AgPSBfX21zbV9jb250cm9sKHN5bmMsCi0JCQkJICAmY3RybF9wbXNtLT5jdHJsX3EsCi0JCQkJICBxY21kLCBtc2Vjc190b19qaWZmaWVzKDEwMDAwKSk7Ci0KLQkvKiBvd25lcnNoaXAgb2YgcWNtZCB3aWxsIGJlIHRyYW5zZmVyZWQgdG8gZXZlbnQgcXVldWUgKi8KLQlxY21kID0gTlVMTDsKLQotCWlmICghcWNtZF9yZXNwIHx8IElTX0VSUihxY21kX3Jlc3ApKSB7Ci0JCS8qIERvIG5vdCBmcmVlIHFjbWRfcmVzcCBoZXJlLiAgSWYgdGhlIGNvbmZpZyB0aHJlYWQgcmVhZCBpdCwKLQkJICogdGhlbiBpdCBoYXMgYWxyZWFkeSBiZWVuIGZyZWVkLCBhbmQgd2UgdGltZWQgb3V0IGJlY2F1c2UKLQkJICogd2UgZGlkIG5vdCByZWNlaXZlIGEgTVNNX0NBTV9JT0NUTF9DVFJMX0NNRF9ET05FLiAgSWYgdGhlCi0JCSAqIGNvbmZpZyB0aHJlYWQgaXRzZWxmIGlzIGJsb2NrZWQgYW5kIG5vdCBkZXF1ZXVlaW5nIGNvbW1hbmRzLAotCQkgKiB0aGVuIGl0IHdpbGwgZWl0aGVyIGV2ZW50dWFsbHkgdW5ibG9jayBhbmQgcHJvY2VzcyB0aGVtLAotCQkgKiBvciB3aGVuIGl0IGlzIGtpbGxlZCwgcWNtZCB3aWxsIGJlIGZyZWVkIGluCi0JCSAqIG1zbV9yZWxlYXNlX2NvbmZpZy4KLQkJICovCi0JCXJjID0gUFRSX0VSUihxY21kX3Jlc3ApOwotCQlxY21kX3Jlc3AgPSBOVUxMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlpZiAocWNtZF9yZXNwLT5jb21tYW5kKSB7Ci0JCXVkYXRhX3Jlc3AgPSAqKHN0cnVjdCBtc21fY3RybF9jbWQgKilxY21kX3Jlc3AtPmNvbW1hbmQ7Ci0JCWlmICh1ZGF0YV9yZXNwLmxlbmd0aCA+IDApIHsKLQkJCWlmIChjb3B5X3RvX3VzZXIodXB0ciwKLQkJCQkJIHVkYXRhX3Jlc3AudmFsdWUsCi0JCQkJCSB1ZGF0YV9yZXNwLmxlbmd0aCkpIHsKLQkJCQlFUlJfQ09QWV9UT19VU0VSKCk7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWdvdG8gZW5kOwotCQkJfQotCQl9Ci0JCXVkYXRhX3Jlc3AudmFsdWUgPSB1cHRyOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZ1ZGF0YV9yZXNwLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2N0cmxfY21kKSkpIHsKLQkJCUVSUl9DT1BZX1RPX1VTRVIoKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gZW5kOwotCQl9Ci0JfQotCi1lbmQ6Ci0JZnJlZV9xY21kKHFjbWQpOwotCUNEQkcoIiVzOiBkb25lIHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKiBEaXZlcnQgZnJhbWVzIGZvciBwb3N0LXByb2Nlc3NpbmcgYnkgZGVsaXZlcmluZyB0aGVtIHRvIHRoZSBjb25maWcgdGhyZWFkOwotICogd2hlbiBwb3N0LXByb2Nlc3NpbmcgaXMgZG9uZSwgaXQgd2lsbCByZXR1cm4gdGhlIGZyYW1lIHRvIHRoZSBmcmFtZSB0aHJlYWQuCi0gKi8KLXN0YXRpYyBpbnQgbXNtX2RpdmVydF9mcmFtZShzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsCi0JCXN0cnVjdCBtc21fdmZlX3Jlc3AgKmRhdGEsCi0JCXN0cnVjdCBtc21fc3RhdHNfZXZlbnRfY3RybCAqc2UpCi17Ci0Jc3RydWN0IG1zbV9wbWVtX2luZm8gcGluZm87Ci0Jc3RydWN0IG1zbV9wb3N0cHJvYyBidWY7Ci0JaW50IHJjOwotCi0JQ0RCRygiJXM6IEZyYW1lIFBQIHN5bmMtPnBwX21hc2sgJWRcbiIsIF9fZnVuY19fLCBzeW5jLT5wcF9tYXNrKTsKLQotCWlmICghKHN5bmMtPnBwX21hc2sgJiBQUF9QUkVWKSAgJiYgIShzeW5jLT5wcF9tYXNrICYgUFBfU05BUCkpIHsKLQkJcHJfZXJyKCIlczogZGl2ZXJ0aW5nIGZyYW1lLCBub3QgaW4gUFBfUFJFViBvciBQUF9TTkFQIVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmMgPSBtc21fcG1lbV9mcmFtZV9wdG92X2xvb2t1cChzeW5jLCBkYXRhLT5waHkucDBfcGh5LAotCQkJZGF0YS0+cGh5LnAxX3BoeSwgZGF0YS0+cGh5LnAyX3BoeSwgJnBpbmZvLAotCQkJMCk7IC8qIGRvIG5vdCBjbGVhciB0aGUgYWN0aXZlIGZsYWcgKi8KLQotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogbXNtX3BtZW1fZnJhbWVfcHRvdl9sb29rdXAgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlidWYuZm1haW4uYnVmZmVyID0gKHVuc2lnbmVkIGxvbmcpcGluZm8udmFkZHI7Ci0JYnVmLmZtYWluLnBsYW5hcjBfb2ZmID0gcGluZm8ucGxhbmFyMF9vZmY7Ci0JYnVmLmZtYWluLnBsYW5hcjFfb2ZmID0gcGluZm8ucGxhbmFyMV9vZmY7Ci0JYnVmLmZtYWluLmZkID0gcGluZm8uZmQ7Ci0KLQlDREJHKCIlczogYnVmIDB4JXggZmQgJWRcbiIsIF9fZnVuY19fLCAodW5zaWduZWQgaW50KWJ1Zi5mbWFpbi5idWZmZXIsCi0JCSBidWYuZm1haW4uZmQpOwotCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikoc2UtPnN0YXRzX2V2ZW50LmRhdGEpLAotCQkJJihidWYuZm1haW4pLCBzaXplb2Yoc3RydWN0IG1zbV9mcmFtZSkpKSB7Ci0JCUVSUl9DT1BZX1RPX1VTRVIoKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiBEaXZlcnQgc3RlcmVvIGZyYW1lcyBmb3IgcG9zdC1wcm9jZXNzaW5nIGJ5IGRlbGl2ZXJpbmcKLSAqIHRoZW0gdG8gdGhlIGNvbmZpZyB0aHJlYWQuCi0gKi8KLXN0YXRpYyBpbnQgbXNtX2RpdmVydF9zdF9mcmFtZShzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsCi0Jc3RydWN0IG1zbV92ZmVfcmVzcCAqZGF0YSwgc3RydWN0IG1zbV9zdGF0c19ldmVudF9jdHJsICpzZSwgaW50IHBhdGgpCi17Ci0Jc3RydWN0IG1zbV9wbWVtX2luZm8gcGluZm87Ci0Jc3RydWN0IG1zbV9zdF9mcmFtZSBidWY7Ci0Jc3RydWN0IHZpZGVvX2Nyb3BfdCAqY3JvcCA9IE5VTEw7Ci0JaW50IHJjID0gMDsKLQotCWlmIChzZS0+c3RhdHNfZXZlbnQubXNnX2lkID09IE9VVFBVVF9UWVBFX1NUX0wpIHsKLQkJYnVmLnR5cGUgPSBPVVRQVVRfVFlQRV9TVF9MOwotCX0gZWxzZSBpZiAoc2UtPnN0YXRzX2V2ZW50Lm1zZ19pZCA9PSBPVVRQVVRfVFlQRV9TVF9SKSB7Ci0JCWJ1Zi50eXBlID0gT1VUUFVUX1RZUEVfU1RfUjsKLQl9IGVsc2UgewotCQlpZiAoc2UtPnJlc3B0eXBlID09IE1TTV9DQU1fUkVTUF9TVEVSRU9fT1BfMSkgewotCQkJcmMgPSBtc21fcG1lbV9mcmFtZV9wdG92X2xvb2t1cChzeW5jLCBkYXRhLT5waHkucDBfcGh5LAotCQkJCWRhdGEtPnBoeS5wMV9waHksIGRhdGEtPnBoeS5wMl9waHksICZwaW5mbywKLQkJCQkxKTsgIC8qIGRvIGNsZWFyIHRoZSBhY3RpdmUgZmxhZyAqLwotCQkJYnVmLmJ1Zl9pbmZvLnBhdGggPSBwYXRoOwotCQl9IGVsc2UgaWYgKHNlLT5yZXNwdHlwZSA9PSBNU01fQ0FNX1JFU1BfU1RFUkVPX09QXzIpIHsKLQkJCXJjID0gbXNtX3BtZW1fZnJhbWVfcHRvdl9sb29rdXAoc3luYywgZGF0YS0+cGh5LnAwX3BoeSwKLQkJCQlkYXRhLT5waHkucDFfcGh5LCBkYXRhLT5waHkucDJfcGh5LCAmcGluZm8sCi0JCQkJMCk7IC8qIGRvIG5vdCBjbGVhciB0aGUgYWN0aXZlIGZsYWcgKi8KLQkJCWJ1Zi5idWZfaW5mby5wYXRoID0gcGF0aDsKLQkJfSBlbHNlCi0JCQlDREJHKCIlczogSW52YWxpZCByZXNwdHlwZSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQlzZS0+cmVzcHR5cGUpOwotCi0JCWlmIChyYyA8IDApIHsKLQkJCUNEQkcoIiVzOiBtc21fcG1lbV9mcmFtZV9wdG92X2xvb2t1cCBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0KLQkJYnVmLnR5cGUgPSBPVVRQVVRfVFlQRV9TVF9EOwotCi0JCWlmIChzeW5jLT5jcm9waW5mbyAhPSBOVUxMKSB7Ci0JCQljcm9wID0gc3luYy0+Y3JvcGluZm87Ci0JCQlzd2l0Y2ggKHBhdGgpIHsKLQkJCWNhc2UgT1VUUFVUX1RZUEVfUDoKLQkJCWNhc2UgT1VUUFVUX1RZUEVfVDogewotCQkJCWJ1Zi5MLnN0Q3JvcEluZm8uaW5fdyA9IGNyb3AtPmluMV93OwotCQkJCWJ1Zi5MLnN0Q3JvcEluZm8uaW5faCA9IGNyb3AtPmluMV9oOwotCQkJCWJ1Zi5MLnN0Q3JvcEluZm8ub3V0X3cgPSBjcm9wLT5vdXQxX3c7Ci0JCQkJYnVmLkwuc3RDcm9wSW5mby5vdXRfaCA9IGNyb3AtPm91dDFfaDsKLQkJCQlidWYuUi5zdENyb3BJbmZvID0gYnVmLkwuc3RDcm9wSW5mbzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJY2FzZSBPVVRQVVRfVFlQRV9WOgotCQkJY2FzZSBPVVRQVVRfVFlQRV9TOiB7Ci0JCQkJYnVmLkwuc3RDcm9wSW5mby5pbl93ID0gY3JvcC0+aW4yX3c7Ci0JCQkJYnVmLkwuc3RDcm9wSW5mby5pbl9oID0gY3JvcC0+aW4yX2g7Ci0JCQkJYnVmLkwuc3RDcm9wSW5mby5vdXRfdyA9IGNyb3AtPm91dDJfdzsKLQkJCQlidWYuTC5zdENyb3BJbmZvLm91dF9oID0gY3JvcC0+b3V0Ml9oOwotCQkJCWJ1Zi5SLnN0Q3JvcEluZm8gPSBidWYuTC5zdENyb3BJbmZvOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdDogewotCQkJCXByX3dhcm5pbmcoIiVzOiBpbnZhbGlkIGZyYW1lIHBhdGggJWRcbiIsCi0JCQkJCV9fZnVuY19fLCBwYXRoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJ1Zi5MLnN0Q3JvcEluZm8uaW5fdyA9IDA7Ci0JCQlidWYuTC5zdENyb3BJbmZvLmluX2ggPSAwOwotCQkJYnVmLkwuc3RDcm9wSW5mby5vdXRfdyA9IDA7Ci0JCQlidWYuTC5zdENyb3BJbmZvLm91dF9oID0gMDsKLQkJCWJ1Zi5SLnN0Q3JvcEluZm8gPSBidWYuTC5zdENyb3BJbmZvOwotCQl9Ci0KLQkJLyogaGFyZGNvZGUgZm9yIG5vdy4gKi8KLQkJaWYgKChwYXRoID09IE9VVFBVVF9UWVBFX1MpIHx8IChwYXRoID09IE9VVFBVVF9UWVBFX1QpKQotCQkJYnVmLnBhY2tpbmcgPSBzeW5jLT5zY3RybC5zX3NuYXBfcGFja2luZzsKLQkJZWxzZQotCQkJYnVmLnBhY2tpbmcgPSBzeW5jLT5zY3RybC5zX3ZpZGVvX3BhY2tpbmc7Ci0KLQkJYnVmLmJ1Zl9pbmZvLmJ1ZmZlciA9ICh1bnNpZ25lZCBsb25nKXBpbmZvLnZhZGRyOwotCQlidWYuYnVmX2luZm8ucGh5X29mZnNldCA9IHBpbmZvLm9mZnNldDsKLQkJYnVmLmJ1Zl9pbmZvLnBsYW5hcjBfb2ZmID0gcGluZm8ucGxhbmFyMF9vZmY7Ci0JCWJ1Zi5idWZfaW5mby5wbGFuYXIxX29mZiA9IHBpbmZvLnBsYW5hcjFfb2ZmOwotCQlidWYuYnVmX2luZm8ucGxhbmFyMl9vZmYgPSBwaW5mby5wbGFuYXIyX29mZjsKLQkJYnVmLmJ1Zl9pbmZvLmZkID0gcGluZm8uZmQ7Ci0KLQkJQ0RCRygiJXM6IGJ1ZiAweCV4IGZkICVkXG4iLCBfX2Z1bmNfXywKLQkJCSh1bnNpZ25lZCBpbnQpYnVmLmJ1Zl9pbmZvLmJ1ZmZlciwgYnVmLmJ1Zl9pbmZvLmZkKTsKLQl9Ci0KLQlpZiAoY29weV90b191c2VyKCh2b2lkICopKHNlLT5zdGF0c19ldmVudC5kYXRhKSwKLQkJCSZidWYsIHNpemVvZihzdHJ1Y3QgbXNtX3N0X2ZyYW1lKSkpIHsKLQkJRVJSX0NPUFlfVE9fVVNFUigpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2dldF9zdGF0cyhzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsIHZvaWQgX191c2VyICphcmcpCi17Ci0JaW50IHJjID0gMDsKLQotCXN0cnVjdCBtc21fc3RhdHNfZXZlbnRfY3RybCBzZTsKLQotCXN0cnVjdCBtc21fcXVldWVfY21kICpxY21kID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX2N0cmxfY21kICAqY3RybCA9IE5VTEw7Ci0Jc3RydWN0IG1zbV92ZmVfcmVzcCAgKmRhdGEgPSBOVUxMOwotCXN0cnVjdCBtc21fdnBlX3Jlc3AgICp2cGVfZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9zdGF0c19idWYgc3RhdHM7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnNlLCBhcmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19ldmVudF9jdHJsKSkpIHsKLQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCXByX2VycigiJXMsIEVSUl9DT1BZX0ZST01fVVNFUlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyYyA9IDA7Ci0KLQlxY21kID0gbXNtX2RlcXVldWUoJnN5bmMtPmV2ZW50X3EsIGxpc3RfY29uZmlnKTsKLQlpZiAoIXFjbWQpIHsKLQkJLyogU2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCB3YWl0X2V2ZW50Ci0JCQllcnJvciAtNTEyIGZyb20gX19tc21fY29udHJvbCovCi0JCXByX2VycigiJXMsIHFjbWQgaXMgTnVsbFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlDREJHKCIlczogcmVjZWl2ZWQgZnJvbSBEU1AgJWRcbiIsIF9fZnVuY19fLCBxY21kLT50eXBlKTsKLQotCXN3aXRjaCAocWNtZC0+dHlwZSkgewotCWNhc2UgTVNNX0NBTV9RX1ZQRV9NU0c6Ci0JCS8qIENvbXBsZXRlIFZQRSByZXNwb25zZS4gKi8KLQkJdnBlX2RhdGEgPSAoc3RydWN0IG1zbV92cGVfcmVzcCAqKShxY21kLT5jb21tYW5kKTsKLQkJc2UucmVzcHR5cGUgPSBNU01fQ0FNX1JFU1BfU1RFUkVPX09QXzI7Ci0JCXNlLnN0YXRzX2V2ZW50LnR5cGUgICA9IHZwZV9kYXRhLT5ldnRfbXNnLnR5cGU7Ci0JCXNlLnN0YXRzX2V2ZW50Lm1zZ19pZCA9IHZwZV9kYXRhLT5ldnRfbXNnLm1zZ19pZDsKLQkJc2Uuc3RhdHNfZXZlbnQubGVuICAgID0gdnBlX2RhdGEtPmV2dF9tc2cubGVuOwotCi0JCWlmICh2cGVfZGF0YS0+dHlwZSA9PSBWUEVfTVNHX09VVFBVVF9TVF9MKSB7Ci0JCQlDREJHKCIlczogQ2hhbmdlIG1zZ19pZCB0byBPVVRQVVRfVFlQRV9TVF9MXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXNlLnN0YXRzX2V2ZW50Lm1zZ19pZCA9IE9VVFBVVF9UWVBFX1NUX0w7Ci0JCQlyYyA9IG1zbV9kaXZlcnRfc3RfZnJhbWUoc3luYywgZGF0YSwgJnNlLAotCQkJCU9VVFBVVF9UWVBFX1YpOwotCQl9IGVsc2UgaWYgKHZwZV9kYXRhLT50eXBlID09IFZQRV9NU0dfT1VUUFVUX1NUX1IpIHsKLQkJCUNEQkcoIiVzOiBDaGFuZ2UgbXNnX2lkIHRvIE9VVFBVVF9UWVBFX1NUX1JcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJc2Uuc3RhdHNfZXZlbnQubXNnX2lkID0gT1VUUFVUX1RZUEVfU1RfUjsKLQkJCXJjID0gbXNtX2RpdmVydF9zdF9mcmFtZShzeW5jLCBkYXRhLCAmc2UsCi0JCQkJT1VUUFVUX1RZUEVfVik7Ci0JCX0gZWxzZSB7Ci0JCQlwcl93YXJuaW5nKCIlczogaW52YWxpZCB2cGVfZGF0YS0+dHlwZSA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCB2cGVfZGF0YS0+dHlwZSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9DQU1fUV9WRkVfRVZUOgotCWNhc2UgTVNNX0NBTV9RX1ZGRV9NU0c6Ci0JCWRhdGEgPSAoc3RydWN0IG1zbV92ZmVfcmVzcCAqKShxY21kLT5jb21tYW5kKTsKLQotCQkvKiBhZHNwIGV2ZW50IGFuZCBtZXNzYWdlICovCi0JCXNlLnJlc3B0eXBlID0gTVNNX0NBTV9SRVNQX1NUQVRfRVZUX01TRzsKLQotCQkvKiAwIC0gbXNnIGZyb20gYURTUCwgMSAtIGV2ZW50IGZyb20gbUFSTSAqLwotCQlzZS5zdGF0c19ldmVudC50eXBlICAgPSBkYXRhLT5ldnRfbXNnLnR5cGU7Ci0JCXNlLnN0YXRzX2V2ZW50Lm1zZ19pZCA9IGRhdGEtPmV2dF9tc2cubXNnX2lkOwotCQlzZS5zdGF0c19ldmVudC5sZW4gICAgPSBkYXRhLT5ldnRfbXNnLmxlbjsKLQkJc2Uuc3RhdHNfZXZlbnQuZnJhbWVfaWQgPSBkYXRhLT5ldnRfbXNnLmZyYW1lX2lkOwotCi0JCUNEQkcoIiVzOiBxY21kLT50eXBlICVkIGxlbmd0aCAlZCBtc2RfaWQgJWRcbiIsIF9fZnVuY19fLAotCQkJcWNtZC0+dHlwZSwKLQkJCXNlLnN0YXRzX2V2ZW50LmxlbiwKLQkJCXNlLnN0YXRzX2V2ZW50Lm1zZ19pZCk7Ci0KLQkJaWYgKGRhdGEtPnR5cGUgPT0gVkZFX01TR19DT01NT04pIHsKLQkJCXN0YXRzLnN0YXR1c19iaXRzID0gZGF0YS0+c3RhdHNfbXNnLnN0YXR1c19iaXRzOwotCQkJc3RhdHMuYXdiX3ltaW4gPSBkYXRhLT5zdGF0c19tc2cuYXdiX3ltaW47Ci0KLQkJCWlmIChkYXRhLT5zdGF0c19tc2cuYWVjX2J1ZmYpIHsKLQkJCQlzdGF0cy5hZWMuYnVmZiA9Ci0JCQkJbXNtX3BtZW1fc3RhdHNfcHRvdl9sb29rdXAoc3luYywKLQkJCQkJCWRhdGEtPnN0YXRzX21zZy5hZWNfYnVmZiwKLQkJCQkJCSYoc3RhdHMuYWVjLmZkKSk7Ci0JCQkJaWYgKCFzdGF0cy5hZWMuYnVmZikgewotCQkJCQlwcl9lcnIoIiVzOiBtc21fcG1lbV9zdGF0c19wdG92X2xvb2t1cCBlcnJvclxuIiwKLQkJCQkJCV9fZnVuY19fKTsKLQkJCQkJcmMgPSAtRUlOVkFMOwotCQkJCQlnb3RvIGZhaWx1cmU7Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCXN0YXRzLmFlYy5idWZmID0gMDsKLQkJCX0KLQkJCWlmIChkYXRhLT5zdGF0c19tc2cuYXdiX2J1ZmYpIHsKLQkJCQlzdGF0cy5hd2IuYnVmZiA9Ci0JCQkJbXNtX3BtZW1fc3RhdHNfcHRvdl9sb29rdXAoc3luYywKLQkJCQkJCWRhdGEtPnN0YXRzX21zZy5hd2JfYnVmZiwKLQkJCQkJCSYoc3RhdHMuYXdiLmZkKSk7Ci0JCQkJaWYgKCFzdGF0cy5hd2IuYnVmZikgewotCQkJCQlwcl9lcnIoIiVzOiBtc21fcG1lbV9zdGF0c19wdG92X2xvb2t1cCBlcnJvclxuIiwKLQkJCQkJCV9fZnVuY19fKTsKLQkJCQkJcmMgPSAtRUlOVkFMOwotCQkJCQlnb3RvIGZhaWx1cmU7Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCXN0YXRzLmF3Yi5idWZmID0gMDsKLQkJCX0KLQkJCWlmIChkYXRhLT5zdGF0c19tc2cuYWZfYnVmZikgewotCQkJCXN0YXRzLmFmLmJ1ZmYgPQotCQkJCW1zbV9wbWVtX3N0YXRzX3B0b3ZfbG9va3VwKHN5bmMsCi0JCQkJCQlkYXRhLT5zdGF0c19tc2cuYWZfYnVmZiwKLQkJCQkJCSYoc3RhdHMuYWYuZmQpKTsKLQkJCQlpZiAoIXN0YXRzLmFmLmJ1ZmYpIHsKLQkJCQkJcHJfZXJyKCIlczogbXNtX3BtZW1fc3RhdHNfcHRvdl9sb29rdXAgZXJyb3JcbiIsCi0JCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJCXJjID0gLUVJTlZBTDsKLQkJCQkJZ290byBmYWlsdXJlOwotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQlzdGF0cy5hZi5idWZmID0gMDsKLQkJCX0KLQkJCWlmIChkYXRhLT5zdGF0c19tc2cuaWhpc3RfYnVmZikgewotCQkJCXN0YXRzLmloaXN0LmJ1ZmYgPQotCQkJCW1zbV9wbWVtX3N0YXRzX3B0b3ZfbG9va3VwKHN5bmMsCi0JCQkJCQlkYXRhLT5zdGF0c19tc2cuaWhpc3RfYnVmZiwKLQkJCQkJCSYoc3RhdHMuaWhpc3QuZmQpKTsKLQkJCQlpZiAoIXN0YXRzLmloaXN0LmJ1ZmYpIHsKLQkJCQkJcHJfZXJyKCIlczogbXNtX3BtZW1fc3RhdHNfcHRvdl9sb29rdXAgZXJyb3JcbiIsCi0JCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJCXJjID0gLUVJTlZBTDsKLQkJCQkJZ290byBmYWlsdXJlOwotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQlzdGF0cy5paGlzdC5idWZmID0gMDsKLQkJCX0KLQotCQkJaWYgKGRhdGEtPnN0YXRzX21zZy5yc19idWZmKSB7Ci0JCQkJc3RhdHMucnMuYnVmZiA9Ci0JCQkJbXNtX3BtZW1fc3RhdHNfcHRvdl9sb29rdXAoc3luYywKLQkJCQkJCWRhdGEtPnN0YXRzX21zZy5yc19idWZmLAotCQkJCQkJJihzdGF0cy5ycy5mZCkpOwotCQkJCWlmICghc3RhdHMucnMuYnVmZikgewotCQkJCQlwcl9lcnIoIiVzOiBtc21fcG1lbV9zdGF0c19wdG92X2xvb2t1cCBlcnJvclxuIiwKLQkJCQkJCV9fZnVuY19fKTsKLQkJCQkJcmMgPSAtRUlOVkFMOwotCQkJCQlnb3RvIGZhaWx1cmU7Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCXN0YXRzLnJzLmJ1ZmYgPSAwOwotCQkJfQotCi0JCQlpZiAoZGF0YS0+c3RhdHNfbXNnLmNzX2J1ZmYpIHsKLQkJCQlzdGF0cy5jcy5idWZmID0KLQkJCQltc21fcG1lbV9zdGF0c19wdG92X2xvb2t1cChzeW5jLAotCQkJCQkJZGF0YS0+c3RhdHNfbXNnLmNzX2J1ZmYsCi0JCQkJCQkmKHN0YXRzLmNzLmZkKSk7Ci0JCQkJaWYgKCFzdGF0cy5jcy5idWZmKSB7Ci0JCQkJCXByX2VycigiJXM6IG1zbV9wbWVtX3N0YXRzX3B0b3ZfbG9va3VwIGVycm9yXG4iLAotCQkJCQkJX19mdW5jX18pOwotCQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJCWdvdG8gZmFpbHVyZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXN0YXRzLmNzLmJ1ZmYgPSAwOwotCQkJfQotCi0JCQlzZS5zdGF0c19ldmVudC5mcmFtZV9pZCA9IGRhdGEtPnBoeS5mcmFtZV9pZDsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikoc2Uuc3RhdHNfZXZlbnQuZGF0YSksCi0JCQkJCSZzdGF0cywKLQkJCQkJc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfYnVmKSkpIHsKLQkJCQlFUlJfQ09QWV9UT19VU0VSKCk7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWdvdG8gZmFpbHVyZTsKLQkJCX0KLQkJfSBlbHNlIGlmICgoZGF0YS0+dHlwZSA+PSBWRkVfTVNHX1NUQVRTX0FFQykgJiYKLQkJCShkYXRhLT50eXBlIDw9ICBWRkVfTVNHX1NUQVRTX1dFKSkgewotCQkJLyogdGhlIGNoZWNrIGFib3ZlIGluY2x1ZGVzIGFsbCBzdGF0cyB0eXBlLiAqLwotCQkJc3RhdHMuYXdiX3ltaW4gPSBkYXRhLT5zdGF0c19tc2cuYXdiX3ltaW47Ci0JCQlzdGF0cy5idWZmZXIgPQotCQkJCW1zbV9wbWVtX3N0YXRzX3B0b3ZfbG9va3VwKHN5bmMsCi0JCQkJCQlkYXRhLT5waHkuc2J1Zl9waHksCi0JCQkJCQkmKHN0YXRzLmZkKSk7Ci0JCQlpZiAoIXN0YXRzLmJ1ZmZlcikgewotCQkJCQlwcl9lcnIoIiVzOiBtc21fcG1lbV9zdGF0c19wdG92X2xvb2t1cCBlcnJvclxuIiwKLQkJCQkJCV9fZnVuY19fKTsKLQkJCQkJcmMgPSAtRUlOVkFMOwotCQkJCQlnb3RvIGZhaWx1cmU7Ci0JCQl9Ci0JCQlzZS5zdGF0c19ldmVudC5mcmFtZV9pZCA9IGRhdGEtPnBoeS5mcmFtZV9pZDsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikoc2Uuc3RhdHNfZXZlbnQuZGF0YSksCi0JCQkJCSZzdGF0cywKLQkJCQkJc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfYnVmKSkpIHsKLQkJCQlFUlJfQ09QWV9UT19VU0VSKCk7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWdvdG8gZmFpbHVyZTsKLQkJCX0KLQkJfSBlbHNlIGlmICgoZGF0YS0+ZXZ0X21zZy5sZW4gPiAwKSAmJgotCQkJCShkYXRhLT50eXBlID09IFZGRV9NU0dfR0VORVJBTCkpIHsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikoc2Uuc3RhdHNfZXZlbnQuZGF0YSksCi0JCQkJCWRhdGEtPmV2dF9tc2cuZGF0YSwKLQkJCQkJZGF0YS0+ZXZ0X21zZy5sZW4pKSB7Ci0JCQkJRVJSX0NPUFlfVE9fVVNFUigpOwotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlnb3RvIGZhaWx1cmU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc3luYy0+c3RlcmVvY2FtX2VuYWJsZWQpIHsKLQkJCQlpZiAoZGF0YS0+dHlwZSA9PSBWRkVfTVNHX09VVFBVVF9QKSB7Ci0JCQkJCUNEQkcoIiVzOiBQcmV2aWV3IG1hcmsgYXMgc3Qgb3AgMVxuIiwKLQkJCQkJCV9fZnVuY19fKTsKLQkJCQkJc2UucmVzcHR5cGUgPSBNU01fQ0FNX1JFU1BfU1RFUkVPX09QXzE7Ci0JCQkJCXJjID0gbXNtX2RpdmVydF9zdF9mcmFtZShzeW5jLCBkYXRhLAotCQkJCQkJJnNlLCBPVVRQVVRfVFlQRV9QKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIGlmIChkYXRhLT50eXBlID09IFZGRV9NU0dfT1VUUFVUX1YpIHsKLQkJCQkJQ0RCRygiJXM6IFZpZGVvIG1hcmsgYXMgc3Qgb3AgMlxuIiwKLQkJCQkJCV9fZnVuY19fKTsKLQkJCQkJc2UucmVzcHR5cGUgPSBNU01fQ0FNX1JFU1BfU1RFUkVPX09QXzI7Ci0JCQkJCXJjID0gbXNtX2RpdmVydF9zdF9mcmFtZShzeW5jLCBkYXRhLAotCQkJCQkJJnNlLCBPVVRQVVRfVFlQRV9WKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIGlmIChkYXRhLT50eXBlID09IFZGRV9NU0dfT1VUUFVUX1MpIHsKLQkJCQkJQ0RCRygiJXM6IE1haW4gaW1nIG1hcmsgYXMgc3Qgb3AgMlxuIiwKLQkJCQkJCV9fZnVuY19fKTsKLQkJCQkJc2UucmVzcHR5cGUgPSBNU01fQ0FNX1JFU1BfU1RFUkVPX09QXzI7Ci0JCQkJCXJjID0gbXNtX2RpdmVydF9zdF9mcmFtZShzeW5jLCBkYXRhLAotCQkJCQkJJnNlLCBPVVRQVVRfVFlQRV9TKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIGlmIChkYXRhLT50eXBlID09IFZGRV9NU0dfT1VUUFVUX1QpIHsKLQkJCQkJQ0RCRygiJXM6IFRodW1iIGltZyBtYXJrIGFzIHN0IG9wIDJcbiIsCi0JCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJCXNlLnJlc3B0eXBlID0gTVNNX0NBTV9SRVNQX1NURVJFT19PUF8yOwotCQkJCQlyYyA9IG1zbV9kaXZlcnRfc3RfZnJhbWUoc3luYywgZGF0YSwKLQkJCQkJCSZzZSwgT1VUUFVUX1RZUEVfVCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZQotCQkJCQlDREJHKCIlczogVkZFX01TRyBGYWxsIFRocm91Z2hcbiIsCi0JCQkJCQlfX2Z1bmNfXyk7Ci0JCQl9Ci0JCQlpZiAoKHN5bmMtPnBwX2ZyYW1lX2F2YWlsID09IDEpICYmCi0JCQkJKHN5bmMtPnBwX21hc2sgJiBQUF9QUkVWKSAmJgotCQkJCShkYXRhLT50eXBlID09IFZGRV9NU0dfT1VUUFVUX1ApKSB7Ci0JCQkJCUNEQkcoIiVzOiVkOnByZWlldyBQUFxuIiwKLQkJCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJCQkJc2Uuc3RhdHNfZXZlbnQuZnJhbWVfaWQgPQotCQkJCQkJCWRhdGEtPnBoeS5mcmFtZV9pZDsKLQkJCQkJcmMgPSBtc21fZGl2ZXJ0X2ZyYW1lKHN5bmMsIGRhdGEsICZzZSk7Ci0JCQkJCXN5bmMtPnBwX2ZyYW1lX2F2YWlsID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKChzeW5jLT5wcF9tYXNrICYgUFBfUFJFVikgJiYKLQkJCQkJKGRhdGEtPnR5cGUgPT0gVkZFX01TR19PVVRQVVRfUCkpIHsKLQkJCQkJc2Uuc3RhdHNfZXZlbnQuZnJhbWVfaWQgPQotCQkJCQkJCWRhdGEtPnBoeS5mcmFtZV9pZDsKLQkJCQkJZnJlZV9xY21kKHFjbWQpOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9IGVsc2UKLQkJCQkJQ0RCRygiJXM6aW5kaWNhdGlvbiB0eXBlIGlzICVkXG4iLAotCQkJCQkJX19mdW5jX18sIGRhdGEtPnR5cGUpOwotCQkJfQotCQkJaWYgKHN5bmMtPnBwX21hc2sgJiBQUF9TTkFQKQotCQkJCWlmIChkYXRhLT50eXBlID09IFZGRV9NU0dfT1VUUFVUX1MgfHwKLQkJCQkJZGF0YS0+dHlwZSA9PSBWRkVfTVNHX09VVFBVVF9UKQotCQkJCQlyYyA9IG1zbV9kaXZlcnRfZnJhbWUoc3luYywgZGF0YSwgJnNlKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTV9RX0NUUkw6Ci0JCS8qIGNvbnRyb2wgY29tbWFuZCBmcm9tIGNvbnRyb2wgdGhyZWFkICovCi0JCWN0cmwgPSAoc3RydWN0IG1zbV9jdHJsX2NtZCAqKShxY21kLT5jb21tYW5kKTsKLQotCQlDREJHKCIlczogcWNtZC0+dHlwZSAlZCBsZW5ndGggJWRcbiIsIF9fZnVuY19fLAotCQkJcWNtZC0+dHlwZSwgY3RybC0+bGVuZ3RoKTsKLQotCQlpZiAoY3RybC0+bGVuZ3RoID4gMCkgewotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKShzZS5jdHJsX2NtZC52YWx1ZSksCi0JCQkJCQljdHJsLT52YWx1ZSwKLQkJCQkJCWN0cmwtPmxlbmd0aCkpIHsKLQkJCQlFUlJfQ09QWV9UT19VU0VSKCk7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWdvdG8gZmFpbHVyZTsKLQkJCX0KLQkJfQotCi0JCXNlLnJlc3B0eXBlID0gTVNNX0NBTV9SRVNQX0NUUkw7Ci0KLQkJLyogd2hhdCB0byBjb250cm9sICovCi0JCXNlLmN0cmxfY21kLnR5cGUgPSBjdHJsLT50eXBlOwotCQlzZS5jdHJsX2NtZC5sZW5ndGggPSBjdHJsLT5sZW5ndGg7Ci0JCXNlLmN0cmxfY21kLnJlc3BfZmQgPSBjdHJsLT5yZXNwX2ZkOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTV9RX1Y0TDJfUkVROgotCQkvKiBjb250cm9sIGNvbW1hbmQgZnJvbSB2NGwyIGNsaWVudCAqLwotCQljdHJsID0gKHN0cnVjdCBtc21fY3RybF9jbWQgKikocWNtZC0+Y29tbWFuZCk7Ci0JCWlmIChjdHJsLT5sZW5ndGggPiAwKSB7Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopKHNlLmN0cmxfY21kLnZhbHVlKSwKLQkJCQkJY3RybC0+dmFsdWUsIGN0cmwtPmxlbmd0aCkpIHsKLQkJCQlFUlJfQ09QWV9UT19VU0VSKCk7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWdvdG8gZmFpbHVyZTsKLQkJCX0KLQkJfQotCi0JCS8qIDIgdGVsbHMgY29uZmlnIHRocmVhZCB0aGlzIGlzIHY0bDIgcmVxdWVzdCAqLwotCQlzZS5yZXNwdHlwZSA9IE1TTV9DQU1fUkVTUF9WNEwyOwotCi0JCS8qIHdoYXQgdG8gY29udHJvbCAqLwotCQlzZS5jdHJsX2NtZC50eXBlICAgPSBjdHJsLT50eXBlOwotCQlzZS5jdHJsX2NtZC5sZW5ndGggPSBjdHJsLT5sZW5ndGg7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIGZhaWx1cmU7Ci0JfSAvKiBzd2l0Y2ggcWNtZC0+dHlwZSAqLwotCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZzZSwgc2l6ZW9mKHNlKSkpIHsKLQkJRVJSX0NPUFlfVE9fVVNFUigpOwotCQlyYyA9IC1FRkFVTFQ7Ci0JCWdvdG8gZmFpbHVyZTsKLQl9Ci0KLWZhaWx1cmU6Ci0JZnJlZV9xY21kKHFjbWQpOwotCi0JQ0RCRygiJXM6ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fY3RybF9jbWRfZG9uZShzdHJ1Y3QgbXNtX2NvbnRyb2xfZGV2aWNlICpjdHJsX3Btc20sCi0JCXZvaWQgX191c2VyICphcmcpCi17Ci0Jdm9pZCBfX3VzZXIgKnVwdHI7Ci0Jc3RydWN0IG1zbV9xdWV1ZV9jbWQgKnFjbWQgPSAmY3RybF9wbXNtLT5xY21kOwotCXN0cnVjdCBtc21fY3RybF9jbWQgKmNvbW1hbmQgPSAmY3RybF9wbXNtLT5jdHJsOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGNvbW1hbmQsIGFyZywgc2l6ZW9mKCpjb21tYW5kKSkpIHsKLQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCWF0b21pY19zZXQoJnFjbWQtPm9uX2hlYXAsIDApOwotCXFjbWQtPmNvbW1hbmQgPSBjb21tYW5kOwotCXVwdHIgPSBjb21tYW5kLT52YWx1ZTsKLQotCWlmIChjb21tYW5kLT5sZW5ndGggPiAwKSB7Ci0JCWNvbW1hbmQtPnZhbHVlID0gY3RybF9wbXNtLT5jdHJsX2RhdGE7Ci0JCWlmIChjb21tYW5kLT5sZW5ndGggPiBzaXplb2YoY3RybF9wbXNtLT5jdHJsX2RhdGEpKSB7Ci0JCQlwcl9lcnIoIiVzOiB1c2VyIGRhdGEgJWQgaXMgdG9vIGJpZyAobWF4ICVkKVxuIiwKLQkJCQlfX2Z1bmNfXywgY29tbWFuZC0+bGVuZ3RoLAotCQkJCXNpemVvZihjdHJsX3Btc20tPmN0cmxfZGF0YSkpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoY29tbWFuZC0+dmFsdWUsCi0JCQkJCXVwdHIsCi0JCQkJCWNvbW1hbmQtPmxlbmd0aCkpIHsKLQkJCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9IGVsc2UKLQkJY29tbWFuZC0+dmFsdWUgPSBOVUxMOwotCi0JLyogSWdub3JlIHRoZSBjb21tYW5kIGlmIHRoZSBjdHJsIGNtZCBoYXMKLQkgICByZXR1cm4gYmFjayBkdWUgdG8gc2lnbmFsaW5nICovCi0JLyogU2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCB3YWl0X2V2ZW50Ci0JICAgZXJyb3IgLTUxMiBmcm9tIF9fbXNtX2NvbnRyb2wqLwotCWlmIChjdHJsX3Btc20tPnBtc20tPnN5bmMtPmlnbm9yZV9xY21kID09IHRydWUgJiYKLQkgICBjdHJsX3Btc20tPnBtc20tPnN5bmMtPmlnbm9yZV9xY21kX3R5cGUgPT0gKGludDE2X3QpY29tbWFuZC0+dHlwZSkgewotCQljdHJsX3Btc20tPnBtc20tPnN5bmMtPmlnbm9yZV9xY21kID0gZmFsc2U7Ci0JCWN0cmxfcG1zbS0+cG1zbS0+c3luYy0+aWdub3JlX3FjbWRfdHlwZSA9IC0xOwotCX0gZWxzZSAvKiB3YWtlIHVwIGNvbnRyb2wgdGhyZWFkICovCi0JCW1zbV9lbnF1ZXVlKCZjdHJsX3Btc20tPmN0cmxfcSwgJnFjbWQtPmxpc3RfY29udHJvbCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fY29uZmlnX3ZwZShzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsIHZvaWQgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IG1zbV92cGVfY2ZnX2NtZCBjZmdjbWQ7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZjZmdjbWQsIGFyZywgc2l6ZW9mKGNmZ2NtZCkpKSB7Ci0JCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JQ0RCRygiJXM6IGNtZF90eXBlICVzXG4iLCBfX2Z1bmNfXywgdmZlX2NvbmZpZ19jbWRbY2ZnY21kLmNtZF90eXBlXSk7Ci0Jc3dpdGNoIChjZmdjbWQuY21kX3R5cGUpIHsKLQljYXNlIENNRF9WUEU6Ci0JCXJldHVybiBzeW5jLT52cGVmbi52cGVfY29uZmlnKCZjZmdjbWQsIE5VTEwpOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IHVua25vd24gY29tbWFuZCB0eXBlICVkXG4iLAotCQkJX19mdW5jX18sIGNmZ2NtZC5jbWRfdHlwZSk7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IG1zbV9jb25maWdfdmZlKHN0cnVjdCBtc21fc3luYyAqc3luYywgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlzdHJ1Y3QgbXNtX3ZmZV9jZmdfY21kIGNmZ2NtZDsKLQlzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uIHJlZ2lvbls4XTsKLQlzdHJ1Y3QgYXhpZGF0YSBheGlfZGF0YTsKLQotCWlmICghc3luYy0+dmZlZm4udmZlX2NvbmZpZykgewotCQlwcl9lcnIoIiVzOiBubyB2ZmVfY29uZmlnIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZ2NtZCwgYXJnLCBzaXplb2YoY2ZnY21kKSkpIHsKLQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCW1lbXNldCgmYXhpX2RhdGEsIDAsIHNpemVvZihheGlfZGF0YSkpOwotCUNEQkcoIiVzOiBjbWRfdHlwZSAlc1xuIiwgX19mdW5jX18sIHZmZV9jb25maWdfY21kW2NmZ2NtZC5jbWRfdHlwZV0pOwotCXN3aXRjaCAoY2ZnY21kLmNtZF90eXBlKSB7Ci0JY2FzZSBDTURfU1RBVFNfRU5BQkxFOgotCQlheGlfZGF0YS5idWZudW0xID0KLQkJCW1zbV9wbWVtX3JlZ2lvbl9sb29rdXAoJnN5bmMtPnBtZW1fc3RhdHMsCi0JCQkJTVNNX1BNRU1fQUVDX0FXQiwgJnJlZ2lvblswXSwKLQkJCQlOVU1fU1RBVF9PVVRQVVRfQlVGRkVSUywKLQkJCQkmc3luYy0+cG1lbV9zdGF0c19zcGlubG9jayk7Ci0JCWF4aV9kYXRhLmJ1Zm51bTIgPQotCQkJbXNtX3BtZW1fcmVnaW9uX2xvb2t1cCgmc3luYy0+cG1lbV9zdGF0cywKLQkJCQlNU01fUE1FTV9BRiwgJnJlZ2lvbltheGlfZGF0YS5idWZudW0xXSwKLQkJCQlOVU1fU1RBVF9PVVRQVVRfQlVGRkVSUywKLQkJCQkmc3luYy0+cG1lbV9zdGF0c19zcGlubG9jayk7Ci0JCWlmICghYXhpX2RhdGEuYnVmbnVtMSB8fCAhYXhpX2RhdGEuYnVmbnVtMikgewotCQkJcHJfZXJyKCIlczogcG1lbSByZWdpb24gbG9va3VwIGVycm9yXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlheGlfZGF0YS5yZWdpb24gPSAmcmVnaW9uWzBdOwotCQlyZXR1cm4gc3luYy0+dmZlZm4udmZlX2NvbmZpZygmY2ZnY21kLCAmYXhpX2RhdGEpOwotCWNhc2UgQ01EX1NUQVRTX0FGX0VOQUJMRToKLQkJYXhpX2RhdGEuYnVmbnVtMSA9Ci0JCQltc21fcG1lbV9yZWdpb25fbG9va3VwKCZzeW5jLT5wbWVtX3N0YXRzLAotCQkJCU1TTV9QTUVNX0FGLCAmcmVnaW9uWzBdLAotCQkJCU5VTV9TVEFUX09VVFBVVF9CVUZGRVJTLAotCQkJCSZzeW5jLT5wbWVtX3N0YXRzX3NwaW5sb2NrKTsKLQkJaWYgKCFheGlfZGF0YS5idWZudW0xKSB7Ci0JCQlwcl9lcnIoIiVzICVkOiBwbWVtIHJlZ2lvbiBsb29rdXAgZXJyb3JcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWF4aV9kYXRhLnJlZ2lvbiA9ICZyZWdpb25bMF07Ci0JCXJldHVybiBzeW5jLT52ZmVmbi52ZmVfY29uZmlnKCZjZmdjbWQsICZheGlfZGF0YSk7Ci0JY2FzZSBDTURfU1RBVFNfQUVDX0FXQl9FTkFCTEU6Ci0JCWF4aV9kYXRhLmJ1Zm51bTEgPQotCQkJbXNtX3BtZW1fcmVnaW9uX2xvb2t1cCgmc3luYy0+cG1lbV9zdGF0cywKLQkJCQlNU01fUE1FTV9BRUNfQVdCLCAmcmVnaW9uWzBdLAotCQkJCU5VTV9TVEFUX09VVFBVVF9CVUZGRVJTLAotCQkJCSZzeW5jLT5wbWVtX3N0YXRzX3NwaW5sb2NrKTsKLQkJaWYgKCFheGlfZGF0YS5idWZudW0xKSB7Ci0JCQlwcl9lcnIoIiVzICVkOiBwbWVtIHJlZ2lvbiBsb29rdXAgZXJyb3JcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWF4aV9kYXRhLnJlZ2lvbiA9ICZyZWdpb25bMF07Ci0JCXJldHVybiBzeW5jLT52ZmVmbi52ZmVfY29uZmlnKCZjZmdjbWQsICZheGlfZGF0YSk7Ci0JY2FzZSBDTURfU1RBVFNfQUVDX0VOQUJMRToKLQkJYXhpX2RhdGEuYnVmbnVtMSA9Ci0JCQltc21fcG1lbV9yZWdpb25fbG9va3VwKCZzeW5jLT5wbWVtX3N0YXRzLAotCQkJTVNNX1BNRU1fQUVDLCAmcmVnaW9uWzBdLAotCQkJTlVNX1NUQVRfT1VUUFVUX0JVRkZFUlMsCi0JCQkmc3luYy0+cG1lbV9zdGF0c19zcGlubG9jayk7Ci0JCWlmICghYXhpX2RhdGEuYnVmbnVtMSkgewotCQkJcHJfZXJyKCIlcyAlZDogcG1lbSByZWdpb24gbG9va3VwIGVycm9yXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlheGlfZGF0YS5yZWdpb24gPSAmcmVnaW9uWzBdOwotCQlyZXR1cm4gc3luYy0+dmZlZm4udmZlX2NvbmZpZygmY2ZnY21kLCAmYXhpX2RhdGEpOwotCWNhc2UgQ01EX1NUQVRTX0FXQl9FTkFCTEU6Ci0JCWF4aV9kYXRhLmJ1Zm51bTEgPQotCQkJbXNtX3BtZW1fcmVnaW9uX2xvb2t1cCgmc3luYy0+cG1lbV9zdGF0cywKLQkJCU1TTV9QTUVNX0FXQiwgJnJlZ2lvblswXSwKLQkJCU5VTV9TVEFUX09VVFBVVF9CVUZGRVJTLAotCQkJJnN5bmMtPnBtZW1fc3RhdHNfc3BpbmxvY2spOwotCQlpZiAoIWF4aV9kYXRhLmJ1Zm51bTEpIHsKLQkJCXByX2VycigiJXMgJWQ6IHBtZW0gcmVnaW9uIGxvb2t1cCBlcnJvclxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJYXhpX2RhdGEucmVnaW9uID0gJnJlZ2lvblswXTsKLQkJcmV0dXJuIHN5bmMtPnZmZWZuLnZmZV9jb25maWcoJmNmZ2NtZCwgJmF4aV9kYXRhKTsKLQotCi0JY2FzZSBDTURfU1RBVFNfSUhJU1RfRU5BQkxFOgotCQlheGlfZGF0YS5idWZudW0xID0KLQkJCW1zbV9wbWVtX3JlZ2lvbl9sb29rdXAoJnN5bmMtPnBtZW1fc3RhdHMsCi0JCQlNU01fUE1FTV9JSElTVCwgJnJlZ2lvblswXSwKLQkJCU5VTV9TVEFUX09VVFBVVF9CVUZGRVJTLAotCQkJJnN5bmMtPnBtZW1fc3RhdHNfc3BpbmxvY2spOwotCQlpZiAoIWF4aV9kYXRhLmJ1Zm51bTEpIHsKLQkJCXByX2VycigiJXMgJWQ6IHBtZW0gcmVnaW9uIGxvb2t1cCBlcnJvclxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJYXhpX2RhdGEucmVnaW9uID0gJnJlZ2lvblswXTsKLQkJcmV0dXJuIHN5bmMtPnZmZWZuLnZmZV9jb25maWcoJmNmZ2NtZCwgJmF4aV9kYXRhKTsKLQotCWNhc2UgQ01EX1NUQVRTX1JTX0VOQUJMRToKLQkJYXhpX2RhdGEuYnVmbnVtMSA9Ci0JCQltc21fcG1lbV9yZWdpb25fbG9va3VwKCZzeW5jLT5wbWVtX3N0YXRzLAotCQkJTVNNX1BNRU1fUlMsICZyZWdpb25bMF0sCi0JCQlOVU1fU1RBVF9PVVRQVVRfQlVGRkVSUywKLQkJCSZzeW5jLT5wbWVtX3N0YXRzX3NwaW5sb2NrKTsKLQkJaWYgKCFheGlfZGF0YS5idWZudW0xKSB7Ci0JCQlwcl9lcnIoIiVzICVkOiBwbWVtIHJlZ2lvbiBsb29rdXAgZXJyb3JcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWF4aV9kYXRhLnJlZ2lvbiA9ICZyZWdpb25bMF07Ci0JCXJldHVybiBzeW5jLT52ZmVmbi52ZmVfY29uZmlnKCZjZmdjbWQsICZheGlfZGF0YSk7Ci0KLQljYXNlIENNRF9TVEFUU19DU19FTkFCTEU6Ci0JCWF4aV9kYXRhLmJ1Zm51bTEgPQotCQkJbXNtX3BtZW1fcmVnaW9uX2xvb2t1cCgmc3luYy0+cG1lbV9zdGF0cywKLQkJCU1TTV9QTUVNX0NTLCAmcmVnaW9uWzBdLAotCQkJTlVNX1NUQVRfT1VUUFVUX0JVRkZFUlMsCi0JCQkmc3luYy0+cG1lbV9zdGF0c19zcGlubG9jayk7Ci0JCWlmICghYXhpX2RhdGEuYnVmbnVtMSkgewotCQkJcHJfZXJyKCIlcyAlZDogcG1lbSByZWdpb24gbG9va3VwIGVycm9yXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlheGlfZGF0YS5yZWdpb24gPSAmcmVnaW9uWzBdOwotCQlyZXR1cm4gc3luYy0+dmZlZm4udmZlX2NvbmZpZygmY2ZnY21kLCAmYXhpX2RhdGEpOwotCi0JY2FzZSBDTURfR0VORVJBTDoKLQljYXNlIENNRF9TVEFUU19ESVNBQkxFOgotCQlyZXR1cm4gc3luYy0+dmZlZm4udmZlX2NvbmZpZygmY2ZnY21kLCBOVUxMKTsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiB1bmtub3duIGNvbW1hbmQgdHlwZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBjZmdjbWQuY21kX3R5cGUpOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotc3RhdGljIGludCBtc21fdnBlX2ZyYW1lX2NmZyhzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsCi0JCQkJdm9pZCAqY2ZnY21kaW4pCi17Ci0JaW50IHJjID0gLUVJTzsKLQlzdHJ1Y3QgYXhpZGF0YSBheGlfZGF0YTsKLQl2b2lkICpkYXRhID0gJmF4aV9kYXRhOwotCXN0cnVjdCBtc21fcG1lbV9yZWdpb24gcmVnaW9uWzhdOwotCWludCBwbWVtX3R5cGU7Ci0KLQlzdHJ1Y3QgbXNtX3ZwZV9jZmdfY21kICpjZmdjbWQ7Ci0JY2ZnY21kID0gKHN0cnVjdCBtc21fdnBlX2NmZ19jbWQgKiljZmdjbWRpbjsKLQotCW1lbXNldCgmYXhpX2RhdGEsIDAsIHNpemVvZihheGlfZGF0YSkpOwotCUNEQkcoIkluIHZwZV9mcmFtZV9jZmcgY2ZnY21kLT5jbWRfdHlwZSA9ICVzXG4iLAotCQl2ZmVfY29uZmlnX2NtZFtjZmdjbWQtPmNtZF90eXBlXSk7Ci0Jc3dpdGNoIChjZmdjbWQtPmNtZF90eXBlKSB7Ci0JY2FzZSBDTURfQVhJX0NGR19WUEU6Ci0JCXBtZW1fdHlwZSA9IE1TTV9QTUVNX1ZJREVPX1ZQRTsKLQkJYXhpX2RhdGEuYnVmbnVtMSA9Ci0JCQltc21fcG1lbV9yZWdpb25fbG9va3VwXzIoJnN5bmMtPnBtZW1fZnJhbWVzLCBwbWVtX3R5cGUsCi0JCQkJJnJlZ2lvblswXSwgOCwgJnN5bmMtPnBtZW1fZnJhbWVfc3BpbmxvY2spOwotCQlDREJHKCJheGlfZGF0YS5idWZudW0xID0gJWRcbiIsIGF4aV9kYXRhLmJ1Zm51bTEpOwotCQlpZiAoIWF4aV9kYXRhLmJ1Zm51bTEpIHsKLQkJCXByX2VycigiJXMgJWQ6IHBtZW0gcmVnaW9uIGxvb2t1cCBlcnJvclxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJcG1lbV90eXBlID0gTVNNX1BNRU1fVklERU87Ci0JCWJyZWFrOwotCWNhc2UgQ01EX0FYSV9DRkdfU05BUF9USFVNQl9WUEU6Ci0JCUNEQkcoIiVzOiBDTURfQVhJX0NGR19TTkFQX1RIVU1CX1ZQRSIsIF9fZnVuY19fKTsKLQkJcG1lbV90eXBlID0gTVNNX1BNRU1fVEhVTUJOQUlMX1ZQRTsKLQkJYXhpX2RhdGEuYnVmbnVtMSA9Ci0JCQltc21fcG1lbV9yZWdpb25fbG9va3VwKCZzeW5jLT5wbWVtX2ZyYW1lcywgcG1lbV90eXBlLAotCQkJJnJlZ2lvblswXSwgOCwgJnN5bmMtPnBtZW1fZnJhbWVfc3BpbmxvY2spOwotCQlpZiAoIWF4aV9kYXRhLmJ1Zm51bTEpIHsKLQkJCXByX2VycigiJXM6IFRIVU1CTkFJTF9WUEUgcG1lbSByZWdpb24gbG9va3VwIGVycm9yXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ01EX0FYSV9DRkdfU05BUF9WUEU6Ci0JCUNEQkcoIiVzOiBDTURfQVhJX0NGR19TTkFQX1ZQRSIsIF9fZnVuY19fKTsKLQkJcG1lbV90eXBlID0gTVNNX1BNRU1fTUFJTklNR19WUEU7Ci0JCWF4aV9kYXRhLmJ1Zm51bTEgPQotCQkJbXNtX3BtZW1fcmVnaW9uX2xvb2t1cCgmc3luYy0+cG1lbV9mcmFtZXMsIHBtZW1fdHlwZSwKLQkJCQkmcmVnaW9uWzBdLCA4LCAmc3luYy0+cG1lbV9mcmFtZV9zcGlubG9jayk7Ci0JCWlmICghYXhpX2RhdGEuYnVmbnVtMSkgewotCQkJcHJfZXJyKCIlczogTUFJTklNR19WUEUgcG1lbSByZWdpb24gbG9va3VwIGVycm9yXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IHVua25vd24gY29tbWFuZCB0eXBlICVkXG4iLAotCQkJX19mdW5jX18sIGNmZ2NtZC0+Y21kX3R5cGUpOwotCQlicmVhazsKLQl9Ci0JYXhpX2RhdGEucmVnaW9uID0gJnJlZ2lvblswXTsKLQlDREJHKCJvdXQgdnBlX2ZyYW1lX2NmZyBjZmdjbWQtPmNtZF90eXBlID0gJXNcbiIsCi0JCXZmZV9jb25maWdfY21kW2NmZ2NtZC0+Y21kX3R5cGVdKTsKLQkvKiBzZW5kIHRoZSBBWEkgY29uZmlndXJhdGlvbiBjb21tYW5kIHRvIGRyaXZlciAqLwotCWlmIChzeW5jLT52cGVmbi52cGVfY29uZmlnKQotCQlyYyA9IHN5bmMtPnZwZWZuLnZwZV9jb25maWcoY2ZnY21kLCBkYXRhKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2ZyYW1lX2F4aV9jZmcoc3RydWN0IG1zbV9zeW5jICpzeW5jLAotCQlzdHJ1Y3QgbXNtX3ZmZV9jZmdfY21kICpjZmdjbWQpCi17Ci0JaW50IHJjID0gLUVJTzsKLQlzdHJ1Y3QgYXhpZGF0YSBheGlfZGF0YTsKLQl2b2lkICpkYXRhID0gJmF4aV9kYXRhOwotCXN0cnVjdCBtc21fcG1lbV9yZWdpb24gcmVnaW9uW01BWF9QTUVNX0NGR19CVUZGRVJTXTsKLQlpbnQgcG1lbV90eXBlOwotCi0JbWVtc2V0KCZheGlfZGF0YSwgMCwgc2l6ZW9mKGF4aV9kYXRhKSk7Ci0KLQlzd2l0Y2ggKGNmZ2NtZC0+Y21kX3R5cGUpIHsKLQotCWNhc2UgQ01EX0FYSV9DRkdfUFJFVklFVzoKLQkJcG1lbV90eXBlID0gTVNNX1BNRU1fUFJFVklFVzsKLQkJYXhpX2RhdGEuYnVmbnVtMiA9Ci0JCQltc21fcG1lbV9yZWdpb25fbG9va3VwKCZzeW5jLT5wbWVtX2ZyYW1lcywgcG1lbV90eXBlLAotCQkJCSZyZWdpb25bMF0sIE1BWF9QTUVNX0NGR19CVUZGRVJTLAotCQkJCSZzeW5jLT5wbWVtX2ZyYW1lX3NwaW5sb2NrKTsKLQkJaWYgKCFheGlfZGF0YS5idWZudW0yKSB7Ci0JCQlwcl9lcnIoIiVzICVkOiBwbWVtIHJlZ2lvbiBsb29rdXAgZXJyb3IgKGVtcHR5ICVkKVxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18sCi0JCQkJaGxpc3RfZW1wdHkoJnN5bmMtPnBtZW1fZnJhbWVzKSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQ01EX0FYSV9DRkdfVklERU9fQUxMX0NITkxTOgotCWNhc2UgQ01EX0FYSV9DRkdfVklERU86Ci0JCXBtZW1fdHlwZSA9IE1TTV9QTUVNX1BSRVZJRVc7Ci0JCWF4aV9kYXRhLmJ1Zm51bTEgPQotCQkJbXNtX3BtZW1fcmVnaW9uX2xvb2t1cCgmc3luYy0+cG1lbV9mcmFtZXMsIHBtZW1fdHlwZSwKLQkJCQkmcmVnaW9uWzBdLCBNQVhfUE1FTV9DRkdfQlVGRkVSUywKLQkJCQkmc3luYy0+cG1lbV9mcmFtZV9zcGlubG9jayk7Ci0JCWlmICghYXhpX2RhdGEuYnVmbnVtMSkgewotCQkJcHJfZXJyKCIlcyAlZDogcG1lbSByZWdpb24gbG9va3VwIGVycm9yXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCXBtZW1fdHlwZSA9IE1TTV9QTUVNX1ZJREVPOwotCQlheGlfZGF0YS5idWZudW0yID0KLQkJCW1zbV9wbWVtX3JlZ2lvbl9sb29rdXAoJnN5bmMtPnBtZW1fZnJhbWVzLCBwbWVtX3R5cGUsCi0JCQkJJnJlZ2lvbltheGlfZGF0YS5idWZudW0xXSwKLQkJCQkoTUFYX1BNRU1fQ0ZHX0JVRkZFUlMtKGF4aV9kYXRhLmJ1Zm51bTEpKSwKLQkJCQkmc3luYy0+cG1lbV9mcmFtZV9zcGlubG9jayk7Ci0JCWlmICghYXhpX2RhdGEuYnVmbnVtMikgewotCQkJcHJfZXJyKCIlcyAlZDogcG1lbSByZWdpb24gbG9va3VwIGVycm9yXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQ01EX0FYSV9DRkdfU05BUDoKLQkJQ0RCRygiJXMsIENNRF9BWElfQ0ZHX1NOQVAsIHR5cGU9JWRcbiIsIF9fZnVuY19fLAotCQkJY2ZnY21kLT5jbWRfdHlwZSk7Ci0JCXBtZW1fdHlwZSA9IE1TTV9QTUVNX1RIVU1CTkFJTDsKLQkJYXhpX2RhdGEuYnVmbnVtMSA9Ci0JCQltc21fcG1lbV9yZWdpb25fbG9va3VwKCZzeW5jLT5wbWVtX2ZyYW1lcywgcG1lbV90eXBlLAotCQkJCSZyZWdpb25bMF0sIE1BWF9QTUVNX0NGR19CVUZGRVJTLAotCQkJCSZzeW5jLT5wbWVtX2ZyYW1lX3NwaW5sb2NrKTsKLQkJaWYgKCFheGlfZGF0YS5idWZudW0xKSB7Ci0JCQlwcl9lcnIoIiVzICVkOiBwbWVtIHJlZ2lvbiBsb29rdXAgZXJyb3JcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJcG1lbV90eXBlID0gTVNNX1BNRU1fTUFJTklNRzsKLQkJYXhpX2RhdGEuYnVmbnVtMiA9Ci0JCQltc21fcG1lbV9yZWdpb25fbG9va3VwKCZzeW5jLT5wbWVtX2ZyYW1lcywgcG1lbV90eXBlLAotCQkJCSZyZWdpb25bYXhpX2RhdGEuYnVmbnVtMV0sCi0JCQkJKE1BWF9QTUVNX0NGR19CVUZGRVJTLShheGlfZGF0YS5idWZudW0xKSksCi0JCQkJICZzeW5jLT5wbWVtX2ZyYW1lX3NwaW5sb2NrKTsKLQkJaWYgKCFheGlfZGF0YS5idWZudW0yKSB7Ci0JCQlwcl9lcnIoIiVzICVkOiBwbWVtIHJlZ2lvbiBsb29rdXAgZXJyb3JcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBDTURfQVhJX0NGR19aU0xfQUxMX0NITkxTOgotCWNhc2UgQ01EX0FYSV9DRkdfWlNMOgotCQlDREJHKCIlcywgQ01EX0FYSV9DRkdfWlNMLCB0eXBlID0gJWRcbiIsIF9fZnVuY19fLAotCQkJY2ZnY21kLT5jbWRfdHlwZSk7Ci0JCXBtZW1fdHlwZSA9IE1TTV9QTUVNX1BSRVZJRVc7Ci0JCWF4aV9kYXRhLmJ1Zm51bTEgPQotCQkJbXNtX3BtZW1fcmVnaW9uX2xvb2t1cCgmc3luYy0+cG1lbV9mcmFtZXMsIHBtZW1fdHlwZSwKLQkJCQkmcmVnaW9uWzBdLCBNQVhfUE1FTV9DRkdfQlVGRkVSUywKLQkJCQkmc3luYy0+cG1lbV9mcmFtZV9zcGlubG9jayk7Ci0JCWlmICghYXhpX2RhdGEuYnVmbnVtMSkgewotCQkJcHJfZXJyKCIlcyAlZDogcG1lbSByZWdpb24gbG9va3VwIGVycm9yXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCXBtZW1fdHlwZSA9IE1TTV9QTUVNX1RIVU1CTkFJTDsKLQkJYXhpX2RhdGEuYnVmbnVtMiA9Ci0JCQltc21fcG1lbV9yZWdpb25fbG9va3VwKCZzeW5jLT5wbWVtX2ZyYW1lcywgcG1lbV90eXBlLAotCQkJCSZyZWdpb25bYXhpX2RhdGEuYnVmbnVtMV0sCi0JCQkJKE1BWF9QTUVNX0NGR19CVUZGRVJTLShheGlfZGF0YS5idWZudW0xKSksCi0JCQkJICZzeW5jLT5wbWVtX2ZyYW1lX3NwaW5sb2NrKTsKLQkJaWYgKCFheGlfZGF0YS5idWZudW0yKSB7Ci0JCQlwcl9lcnIoIiVzICVkOiBwbWVtIHJlZ2lvbiBsb29rdXAgZXJyb3JcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJcG1lbV90eXBlID0gTVNNX1BNRU1fTUFJTklNRzsKLQkJYXhpX2RhdGEuYnVmbnVtMyA9Ci0JCQltc21fcG1lbV9yZWdpb25fbG9va3VwKCZzeW5jLT5wbWVtX2ZyYW1lcywgcG1lbV90eXBlLAotCQkJCSZyZWdpb25bYXhpX2RhdGEuYnVmbnVtMSArIGF4aV9kYXRhLmJ1Zm51bTJdLAotCQkJCShNQVhfUE1FTV9DRkdfQlVGRkVSUyAtIGF4aV9kYXRhLmJ1Zm51bTEgLQotCQkJCWF4aV9kYXRhLmJ1Zm51bTIpLCAmc3luYy0+cG1lbV9mcmFtZV9zcGlubG9jayk7Ci0JCWlmICghYXhpX2RhdGEuYnVmbnVtMykgewotCQkJcHJfZXJyKCIlcyAlZDogcG1lbSByZWdpb24gbG9va3VwIGVycm9yXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQ01EX1JBV19QSUNUX0FYSV9DRkc6Ci0JCXBtZW1fdHlwZSA9IE1TTV9QTUVNX1JBV19NQUlOSU1HOwotCQlheGlfZGF0YS5idWZudW0yID0KLQkJCW1zbV9wbWVtX3JlZ2lvbl9sb29rdXAoJnN5bmMtPnBtZW1fZnJhbWVzLCBwbWVtX3R5cGUsCi0JCQkJJnJlZ2lvblswXSwgTUFYX1BNRU1fQ0ZHX0JVRkZFUlMsCi0JCQkJJnN5bmMtPnBtZW1fZnJhbWVfc3BpbmxvY2spOwotCQlpZiAoIWF4aV9kYXRhLmJ1Zm51bTIpIHsKLQkJCXByX2VycigiJXMgJWQ6IHBtZW0gcmVnaW9uIGxvb2t1cCBlcnJvclxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9HRU5FUkFMOgotCQlkYXRhID0gTlVMTDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiB1bmtub3duIGNvbW1hbmQgdHlwZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBjZmdjbWQtPmNtZF90eXBlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYXhpX2RhdGEucmVnaW9uID0gJnJlZ2lvblswXTsKLQotCS8qIHNlbmQgdGhlIEFYSSBjb25maWd1cmF0aW9uIGNvbW1hbmQgdG8gZHJpdmVyICovCi0JaWYgKHN5bmMtPnZmZWZuLnZmZV9jb25maWcpCi0JCXJjID0gc3luYy0+dmZlZm4udmZlX2NvbmZpZyhjZmdjbWQsIGRhdGEpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9nZXRfc2Vuc29yX2luZm8oc3RydWN0IG1zbV9zeW5jICpzeW5jLCB2b2lkIF9fdXNlciAqYXJnKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1zZW5zb3JfaW5mbyBpbmZvOwotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzZGF0YTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywKLQkJCWFyZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2NhbXNlbnNvcl9pbmZvKSkpIHsKLQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXNkYXRhID0gc3luYy0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaWYgKHN5bmMtPnNjdHJsLnNfY2FtZXJhX3R5cGUgPT0gQkFDS19DQU1FUkFfM0QpCi0JCWluZm8uc3VwcG9ydF8zZCA9IHRydWU7Ci0JZWxzZQotCQlpbmZvLnN1cHBvcnRfM2QgPSBmYWxzZTsKLQltZW1jcHkoJmluZm8ubmFtZVswXSwKLQkJc2RhdGEtPnNlbnNvcl9uYW1lLAotCQlNQVhfU0VOU09SX05BTUUpOwotCWluZm8uZmxhc2hfZW5hYmxlZCA9IHNkYXRhLT5mbGFzaF9kYXRhLT5mbGFzaF90eXBlICE9Ci0JCU1TTV9DQU1FUkFfRkxBU0hfTk9ORTsKLQotCS8qIGNvcHkgYmFjayB0byB1c2VyIHNwYWNlICovCi0JaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKLQkJCSZpbmZvLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fY2Ftc2Vuc29yX2luZm8pKSkgewotCQlFUlJfQ09QWV9UT19VU0VSKCk7Ci0JCXJjID0gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2dldF9jYW1lcmFfaW5mbyh2b2lkIF9fdXNlciAqYXJnKQotewotCWludCByYyA9IDA7Ci0JaW50IGkgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX2luZm8gaW5mbzsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2Yoc3RydWN0IG1zbV9jYW1lcmFfaW5mbykpKSB7Ci0JCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlDREJHKCIlczogY2FtZXJhX25vZGUgJWRcbiIsIF9fZnVuY19fLCBjYW1lcmFfbm9kZSk7Ci0JaW5mby5udW1fY2FtZXJhcyA9IGNhbWVyYV9ub2RlOwotCi0JZm9yIChpID0gMDsgaSA8IGNhbWVyYV9ub2RlOyBpKyspIHsKLQkJaW5mby5oYXNfM2Rfc3VwcG9ydFtpXSA9IDA7Ci0JCWluZm8uaXNfaW50ZXJuYWxfY2FtW2ldID0gMDsKLQkJaW5mby5zX21vdW50X2FuZ2xlW2ldID0gc2Vuc29yX21vdW50X2FuZ2xlW2ldOwotCQlzd2l0Y2ggKGNhbWVyYV90eXBlW2ldKSB7Ci0JCWNhc2UgRlJPTlRfQ0FNRVJBXzJEOgotCQkJaW5mby5pc19pbnRlcm5hbF9jYW1baV0gPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgQkFDS19DQU1FUkFfM0Q6Ci0JCQlpbmZvLmhhc18zZF9zdXBwb3J0W2ldID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIEJBQ0tfQ0FNRVJBXzJEOgotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JLyogY29weSBiYWNrIHRvIHVzZXIgc3BhY2UgKi8KLQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmaW5mbywgc2l6ZW9mKHN0cnVjdCBtc21fY2FtZXJhX2luZm8pKSkgewotCQlFUlJfQ09QWV9UT19VU0VSKCk7Ci0JCXJjID0gLUVGQVVMVDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fbXNtX3B1dF9mcmFtZV9idWYoc3RydWN0IG1zbV9zeW5jICpzeW5jLAotCQlzdHJ1Y3QgbXNtX2ZyYW1lICpwYikKLXsKLQl1bnNpZ25lZCBsb25nIHBwaHk7Ci0Jc3RydWN0IG1zbV92ZmVfY2ZnX2NtZCBjZmdjbWQ7Ci0KLQlpbnQgcmMgPSAtRUlPOwotCi0JLyogQ2hhbmdlIHRoZSBhY3RpdmUgZmxhZy4gKi8KLQlwcGh5ID0gbXNtX3BtZW1fZnJhbWVfdnRvcF9sb29rdXAoc3luYywKLQkJcGItPmJ1ZmZlciwKLQkJcGItPnBsYW5hcjBfb2ZmLCBwYi0+cGxhbmFyMV9vZmYsIHBiLT5wbGFuYXIyX29mZiwgcGItPmZkLCAxKTsKLQotCWlmIChwcGh5ICE9IDApIHsKLQkJQ0RCRygiJXM6IHJlbDogdmFkZHIgJWx4LCBwYWRkciAlbHhcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCXBiLT5idWZmZXIsIHBwaHkpOwotCQljZmdjbWQuY21kX3R5cGUgPSBDTURfRlJBTUVfQlVGX1JFTEVBU0U7Ci0JCWNmZ2NtZC52YWx1ZSAgICA9ICh2b2lkICopcGI7Ci0JCWlmIChzeW5jLT52ZmVmbi52ZmVfY29uZmlnKQotCQkJcmMgPSBzeW5jLT52ZmVmbi52ZmVfY29uZmlnKCZjZmdjbWQsICZwcGh5KTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBtc21fcG1lbV9mcmFtZV92dG9wX2xvb2t1cCBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50IF9fbXNtX3B1dF9waWNfYnVmKHN0cnVjdCBtc21fc3luYyAqc3luYywKLQkJc3RydWN0IG1zbV9mcmFtZSAqcGIpCi17Ci0JdW5zaWduZWQgbG9uZyBwcGh5OwotCXN0cnVjdCBtc21fdmZlX2NmZ19jbWQgY2ZnY21kOwotCi0JaW50IHJjID0gLUVJTzsKLQotCXBwaHkgPSBtc21fcG1lbV9mcmFtZV92dG9wX2xvb2t1cChzeW5jLAotCQlwYi0+YnVmZmVyLAotCQlwYi0+cGxhbmFyMF9vZmYsIHBiLT5wbGFuYXIxX29mZiwgcGItPnBsYW5hcjJfb2ZmLCBwYi0+ZmQsIDEpOwotCi0JaWYgKHBwaHkgIT0gMCkgewotCQlDREJHKCIlczogcmVsOiB2YWRkciAlbHgsIHBhZGRyICVseFxuIiwKLQkJCV9fZnVuY19fLAotCQkJcGItPmJ1ZmZlciwgcHBoeSk7Ci0JCWNmZ2NtZC5jbWRfdHlwZSA9IENNRF9TTkFQX0JVRl9SRUxFQVNFOwotCQljZmdjbWQudmFsdWUgICAgPSAodm9pZCAqKXBiOwotCQlpZiAoc3luYy0+dmZlZm4udmZlX2NvbmZpZykKLQkJCXJjID0gc3luYy0+dmZlZm4udmZlX2NvbmZpZygmY2ZnY21kLCAmcHBoeSk7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogbXNtX3BtZW1fZnJhbWVfdnRvcF9sb29rdXAgZmFpbGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi0KLXN0YXRpYyBpbnQgbXNtX3B1dF9mcmFtZV9idWZmZXIoc3RydWN0IG1zbV9zeW5jICpzeW5jLCB2b2lkIF9fdXNlciAqYXJnKQotewotCXN0cnVjdCBtc21fZnJhbWUgYnVmX3Q7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1Zl90LAotCQkJCWFyZywKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9mcmFtZSkpKSB7Ci0JCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gX19tc21fcHV0X2ZyYW1lX2J1ZihzeW5jLCAmYnVmX3QpOwotfQotCi0KLXN0YXRpYyBpbnQgbXNtX3B1dF9waWNfYnVmZmVyKHN0cnVjdCBtc21fc3luYyAqc3luYywgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlzdHJ1Y3QgbXNtX2ZyYW1lIGJ1Zl90OwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZidWZfdCwKLQkJCQlhcmcsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fZnJhbWUpKSkgewotCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIF9fbXNtX3B1dF9waWNfYnVmKHN5bmMsICZidWZfdCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19tc21fcmVnaXN0ZXJfcG1lbShzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsCi0JCXN0cnVjdCBtc21fcG1lbV9pbmZvICpwaW5mbykKLXsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChwaW5mby0+dHlwZSkgewotCWNhc2UgTVNNX1BNRU1fVklERU86Ci0JY2FzZSBNU01fUE1FTV9QUkVWSUVXOgotCWNhc2UgTVNNX1BNRU1fVEhVTUJOQUlMOgotCWNhc2UgTVNNX1BNRU1fTUFJTklNRzoKLQljYXNlIE1TTV9QTUVNX1JBV19NQUlOSU1HOgotCWNhc2UgTVNNX1BNRU1fVklERU9fVlBFOgotCWNhc2UgTVNNX1BNRU1fQzJEOgotCWNhc2UgTVNNX1BNRU1fTUFJTklNR19WUEU6Ci0JY2FzZSBNU01fUE1FTV9USFVNQk5BSUxfVlBFOgotCQlyYyA9IG1zbV9wbWVtX3RhYmxlX2FkZCgmc3luYy0+cG1lbV9mcmFtZXMsIHBpbmZvLAotCQkJJnN5bmMtPnBtZW1fZnJhbWVfc3BpbmxvY2ssIHN5bmMpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX1BNRU1fQUVDX0FXQjoKLQljYXNlIE1TTV9QTUVNX0FGOgotCWNhc2UgTVNNX1BNRU1fQUVDOgotCWNhc2UgTVNNX1BNRU1fQVdCOgotCWNhc2UgTVNNX1BNRU1fUlM6Ci0JY2FzZSBNU01fUE1FTV9DUzoKLQljYXNlIE1TTV9QTUVNX0lISVNUOgotCWNhc2UgTVNNX1BNRU1fU0tJTjoKLQotCQlyYyA9IG1zbV9wbWVtX3RhYmxlX2FkZCgmc3luYy0+cG1lbV9zdGF0cywgcGluZm8sCi0JCQkgJnN5bmMtPnBtZW1fc3RhdHNfc3BpbmxvY2ssIHN5bmMpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9yZWdpc3Rlcl9wbWVtKHN0cnVjdCBtc21fc3luYyAqc3luYywgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlzdHJ1Y3QgbXNtX3BtZW1faW5mbyBpbmZvOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpIHsKLQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJldHVybiBfX21zbV9yZWdpc3Rlcl9wbWVtKHN5bmMsICZpbmZvKTsKLX0KLQotc3RhdGljIGludCBtc21fc3RhdHNfYXhpX2NmZyhzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsCi0JCXN0cnVjdCBtc21fdmZlX2NmZ19jbWQgKmNmZ2NtZCkKLXsKLQlpbnQgcmMgPSAtRUlPOwotCXN0cnVjdCBheGlkYXRhIGF4aV9kYXRhOwotCXZvaWQgKmRhdGEgPSAmYXhpX2RhdGE7Ci0KLQlzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uIHJlZ2lvblszXTsKLQlpbnQgcG1lbV90eXBlID0gTVNNX1BNRU1fTUFYOwotCi0JbWVtc2V0KCZheGlfZGF0YSwgMCwgc2l6ZW9mKGF4aV9kYXRhKSk7Ci0KLQlzd2l0Y2ggKGNmZ2NtZC0+Y21kX3R5cGUpIHsKLQljYXNlIENNRF9TVEFUU19BWElfQ0ZHOgotCQlwbWVtX3R5cGUgPSBNU01fUE1FTV9BRUNfQVdCOwotCQlicmVhazsKLQljYXNlIENNRF9TVEFUU19BRl9BWElfQ0ZHOgotCQlwbWVtX3R5cGUgPSBNU01fUE1FTV9BRjsKLQkJYnJlYWs7Ci0JY2FzZSBDTURfR0VORVJBTDoKLQkJZGF0YSA9IE5VTEw7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IHVua25vd24gY29tbWFuZCB0eXBlICVkXG4iLAotCQkJX19mdW5jX18sIGNmZ2NtZC0+Y21kX3R5cGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoY2ZnY21kLT5jbWRfdHlwZSAhPSBDTURfR0VORVJBTCkgewotCQlheGlfZGF0YS5idWZudW0xID0KLQkJCW1zbV9wbWVtX3JlZ2lvbl9sb29rdXAoJnN5bmMtPnBtZW1fc3RhdHMsIHBtZW1fdHlwZSwKLQkJCQkmcmVnaW9uWzBdLCBOVU1fU1RBVF9PVVRQVVRfQlVGRkVSUywKLQkJCQkmc3luYy0+cG1lbV9zdGF0c19zcGlubG9jayk7Ci0JCWlmICghYXhpX2RhdGEuYnVmbnVtMSkgewotCQkJcHJfZXJyKCIlcyAlZDogcG1lbSByZWdpb24gbG9va3VwIGVycm9yXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCWF4aV9kYXRhLnJlZ2lvbiA9ICZyZWdpb25bMF07Ci0JfQotCi0JLyogc2VuZCB0aGUgQUVDL0FXQiBTVEFUUyBjb25maWd1cmF0aW9uIGNvbW1hbmQgdG8gZHJpdmVyICovCi0JaWYgKHN5bmMtPnZmZWZuLnZmZV9jb25maWcpCi0JCXJjID0gc3luYy0+dmZlZm4udmZlX2NvbmZpZyhjZmdjbWQsICZheGlfZGF0YSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3B1dF9zdGF0c19idWZmZXIoc3RydWN0IG1zbV9zeW5jICpzeW5jLCB2b2lkIF9fdXNlciAqYXJnKQotewotCWludCByYyA9IC1FSU87Ci0KLQlzdHJ1Y3QgbXNtX3N0YXRzX2J1ZiBidWY7Ci0JdW5zaWduZWQgbG9uZyBwcGh5OwotCXN0cnVjdCBtc21fdmZlX2NmZ19jbWQgY2ZnY21kOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZidWYsIGFyZywKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19idWYpKSkgewotCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JQ0RCRygiJXNcbiIsIF9fZnVuY19fKTsKLQlwcGh5ID0gbXNtX3BtZW1fc3RhdHNfdnRvcF9sb29rdXAoc3luYywgYnVmLmJ1ZmZlciwgYnVmLmZkKTsKLQotCWlmIChwcGh5ICE9IDApIHsKLQkJaWYgKGJ1Zi50eXBlID09IFNUQVRfQUVBVykKLQkJCWNmZ2NtZC5jbWRfdHlwZSA9IENNRF9TVEFUU19CVUZfUkVMRUFTRTsKLQkJZWxzZSBpZiAoYnVmLnR5cGUgPT0gU1RBVF9BRikKLQkJCWNmZ2NtZC5jbWRfdHlwZSA9IENNRF9TVEFUU19BRl9CVUZfUkVMRUFTRTsKLQkJZWxzZSBpZiAoYnVmLnR5cGUgPT0gU1RBVF9BRUMpCi0JCQljZmdjbWQuY21kX3R5cGUgPSBDTURfU1RBVFNfQUVDX0JVRl9SRUxFQVNFOwotCQllbHNlIGlmIChidWYudHlwZSA9PSBTVEFUX0FXQikKLQkJCWNmZ2NtZC5jbWRfdHlwZSA9IENNRF9TVEFUU19BV0JfQlVGX1JFTEVBU0U7Ci0JCWVsc2UgaWYgKGJ1Zi50eXBlID09IFNUQVRfSUhJU1QpCi0JCQljZmdjbWQuY21kX3R5cGUgPSBDTURfU1RBVFNfSUhJU1RfQlVGX1JFTEVBU0U7Ci0JCWVsc2UgaWYgKGJ1Zi50eXBlID09IFNUQVRfUlMpCi0JCQljZmdjbWQuY21kX3R5cGUgPSBDTURfU1RBVFNfUlNfQlVGX1JFTEVBU0U7Ci0JCWVsc2UgaWYgKGJ1Zi50eXBlID09IFNUQVRfQ1MpCi0JCQljZmdjbWQuY21kX3R5cGUgPSBDTURfU1RBVFNfQ1NfQlVGX1JFTEVBU0U7Ci0KLQkJZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGJ1ZiB0eXBlICVkXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCWJ1Zi50eXBlKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gcHV0X2RvbmU7Ci0JCX0KLQotCQljZmdjbWQudmFsdWUgPSAodm9pZCAqKSZidWY7Ci0KLQkJaWYgKHN5bmMtPnZmZWZuLnZmZV9jb25maWcpIHsKLQkJCXJjID0gc3luYy0+dmZlZm4udmZlX2NvbmZpZygmY2ZnY21kLCAmcHBoeSk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXByX2VycigiJXM6IHZmZV9jb25maWcgZXJyb3IgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByYyk7Ci0JCX0gZWxzZQotCQkJcHJfZXJyKCIlczogdmZlX2NvbmZpZyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogTlVMTCBwaHlzaWNhbCBhZGRyZXNzXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0KLXB1dF9kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fYXhpX2NvbmZpZyhzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsIHZvaWQgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IG1zbV92ZmVfY2ZnX2NtZCBjZmdjbWQ7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZ2NtZCwgYXJnLCBzaXplb2YoY2ZnY21kKSkpIHsKLQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXN3aXRjaCAoY2ZnY21kLmNtZF90eXBlKSB7Ci0JY2FzZSBDTURfQVhJX0NGR19WSURFTzoKLQljYXNlIENNRF9BWElfQ0ZHX1BSRVZJRVc6Ci0JY2FzZSBDTURfQVhJX0NGR19TTkFQOgotCWNhc2UgQ01EX1JBV19QSUNUX0FYSV9DRkc6Ci0JY2FzZSBDTURfQVhJX0NGR19aU0w6Ci0JY2FzZSBDTURfQVhJX0NGR19WSURFT19BTExfQ0hOTFM6Ci0JY2FzZSBDTURfQVhJX0NGR19aU0xfQUxMX0NITkxTOgotCQlDREJHKCIlcywgY2ZnY21kLmNtZF90eXBlID0gJWRcbiIsIF9fZnVuY19fLCBjZmdjbWQuY21kX3R5cGUpOwotCQlyZXR1cm4gbXNtX2ZyYW1lX2F4aV9jZmcoc3luYywgJmNmZ2NtZCk7Ci0KLQljYXNlIENNRF9BWElfQ0ZHX1ZQRToKLQljYXNlIENNRF9BWElfQ0ZHX1NOQVBfVlBFOgotCWNhc2UgQ01EX0FYSV9DRkdfU05BUF9USFVNQl9WUEU6Ci0JCXJldHVybiBtc21fdnBlX2ZyYW1lX2NmZyhzeW5jLCAodm9pZCAqKSZjZmdjbWQpOwotCi0JY2FzZSBDTURfU1RBVFNfQVhJX0NGRzoKLQljYXNlIENNRF9TVEFUU19BRl9BWElfQ0ZHOgotCQlyZXR1cm4gbXNtX3N0YXRzX2F4aV9jZmcoc3luYywgJmNmZ2NtZCk7Ci0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiB1bmtub3duIGNvbW1hbmQgdHlwZSAlZFxuIiwKLQkJCV9fZnVuY19fLAotCQkJY2ZnY21kLmNtZF90eXBlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19tc21fZ2V0X3BpYyhzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsCi0JCXN0cnVjdCBtc21fZnJhbWUgKmZyYW1lKQotewotCi0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqcWNtZCA9IE5VTEw7Ci0Jc3RydWN0IG1zbV92ZmVfcmVzcCAqdmRhdGE7Ci0Jc3RydWN0IG1zbV92ZmVfcGh5X2luZm8gKnBwaHk7Ci0Jc3RydWN0IG1zbV9wbWVtX2luZm8gcG1lbV9pbmZvOwotCXN0cnVjdCBtc21fZnJhbWUgKnBmcmFtZTsKLQotCXFjbWQgPSBtc21fZGVxdWV1ZSgmc3luYy0+cGljdF9xLCBsaXN0X3BpY3QpOwotCi0JaWYgKCFxY21kKSB7Ci0JCXByX2VycigiJXM6IG5vIHBpYyBmcmFtZS5cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0JaWYgKE1TTV9DQU1fUV9QUF9NU0cgIT0gcWNtZC0+dHlwZSkgewotCQl2ZGF0YSA9IChzdHJ1Y3QgbXNtX3ZmZV9yZXNwICopKHFjbWQtPmNvbW1hbmQpOwotCQlwcGh5ID0gJnZkYXRhLT5waHk7Ci0KLQkJcmMgPSBtc21fcG1lbV9mcmFtZV9wdG92X2xvb2t1cDIoc3luYywKLQkJCQlwcGh5LT5wMF9waHksCi0JCQkJJnBtZW1faW5mbywKLQkJCQkxKTsgLyogbWFyayBwaWMgZnJhbWUgaW4gdXNlICovCi0KLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogY2Fubm90IGdldCBwaWMgZnJhbWUsIGludmFsaWQgbG9va3VwIgotCQkJCSIgYWRkcmVzcyBwMF9waHkgYWRkICAleCBwMV9waHkgYWRkJXhcbiIsCi0JCQkJX19mdW5jX18sIHBwaHktPnAwX3BoeSwgcHBoeS0+cDFfcGh5KTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0KLQkJZnJhbWUtPnRzID0gcWNtZC0+dHM7Ci0JCWZyYW1lLT5idWZmZXIgPSAodW5zaWduZWQgbG9uZylwbWVtX2luZm8udmFkZHI7Ci0JCWZyYW1lLT5wbGFuYXIwX29mZiA9IHBtZW1faW5mby5wbGFuYXIwX29mZjsKLQkJZnJhbWUtPnBsYW5hcjFfb2ZmID0gcG1lbV9pbmZvLnBsYW5hcjFfb2ZmOwotCQlmcmFtZS0+ZmQgPSBwbWVtX2luZm8uZmQ7Ci0JCWlmIChzeW5jLT5zdGVyZW9jYW1fZW5hYmxlZCAmJgotCQkJc3luYy0+c3RlcmVvX3N0YXRlICE9IFNURVJFT19SQVdfU05BUF9TVEFSVEVEKSB7Ci0JCQlpZiAocG1lbV9pbmZvLnR5cGUgPT0gTVNNX1BNRU1fVEhVTUJOQUlMX1ZQRSkKLQkJCQlmcmFtZS0+cGF0aCA9IE9VVFBVVF9UWVBFX1Q7Ci0JCQllbHNlCi0JCQkJZnJhbWUtPnBhdGggPSBPVVRQVVRfVFlQRV9TOwotCQl9IGVsc2UKLQkJCWZyYW1lLT5wYXRoID0gdmRhdGEtPnBoeS5vdXRwdXRfaWQ7Ci0KLQkJQ0RCRygiJXM6cDBfcGh5IGFkZCAleCwgcDBfcGh5IGFkZCAleCwgcWNtZCAleCwgdmlydF9hZGRyICV4XG4iLAotCQkJX19mdW5jX18sIHBwaHktPnAwX3BoeSwKLQkJCXBwaHktPnAxX3BoeSwgKGludCkgcWNtZCwgKGludCkgZnJhbWUtPmJ1ZmZlcik7Ci0JfSBlbHNlIHsgLyogUFAgKi8KLQkJcGZyYW1lID0gKHN0cnVjdCBtc21fZnJhbWUgKikocWNtZC0+Y29tbWFuZCk7Ci0JCWZyYW1lLT50cyA9IHFjbWQtPnRzOwotCQlmcmFtZS0+YnVmZmVyID0gcGZyYW1lLT5idWZmZXI7Ci0JCWZyYW1lLT5wbGFuYXIwX29mZiA9IHBmcmFtZS0+cGxhbmFyMF9vZmY7Ci0JCWZyYW1lLT5wbGFuYXIxX29mZiA9IHBmcmFtZS0+cGxhbmFyMV9vZmY7Ci0JCWZyYW1lLT5mZCA9IHBmcmFtZS0+ZmQ7Ci0JCWZyYW1lLT5wYXRoID0gcGZyYW1lLT5wYXRoOwotCQlDREJHKCIlczogUFAgeV9vZmYgJXgsIGNiY3Jfb2ZmICV4LCBwYXRoICVkIHZhZGRyIDB4JXhcbiIsCi0JCV9fZnVuY19fLCBmcmFtZS0+cGxhbmFyMF9vZmYsIGZyYW1lLT5wbGFuYXIxX29mZiwgZnJhbWUtPnBhdGgsCi0JCShpbnQpIGZyYW1lLT5idWZmZXIpOwotCX0KLQotZXJyOgotCWZyZWVfcWNtZChxY21kKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fZ2V0X3BpYyhzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsIHZvaWQgX191c2VyICphcmcpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2ZyYW1lIGZyYW1lOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZmcmFtZSwKLQkJCQlhcmcsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fZnJhbWUpKSkgewotCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmMgPSBfX21zbV9nZXRfcGljKHN5bmMsICZmcmFtZSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKHN5bmMtPmNyb3BsZW4gJiYgKCFzeW5jLT5zdGVyZW9jYW1fZW5hYmxlZCkpIHsKLQkJaWYgKGZyYW1lLmNyb3BsZW4gIT0gc3luYy0+Y3JvcGxlbikgewotCQkJcHJfZXJyKCIlczogaW52YWxpZCBmcmFtZSBjcm9wbGVuICVkLCIKLQkJCQkiZXhwZWN0aW5nICVkXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCWZyYW1lLmNyb3BsZW4sCi0JCQkJc3luYy0+Y3JvcGxlbik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilmcmFtZS5jcm9waW5mbywKLQkJCQlzeW5jLT5jcm9waW5mbywKLQkJCQlzeW5jLT5jcm9wbGVuKSkgewotCQkJRVJSX0NPUFlfVE9fVVNFUigpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0JQ0RCRygiJXM6IGNvcHkgc25hcHNob3QgZnJhbWUgdG8gdXNlclxuIiwgX19mdW5jX18pOwotCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsCi0JCQkJJmZyYW1lLCBzaXplb2Yoc3RydWN0IG1zbV9mcmFtZSkpKSB7Ci0JCUVSUl9DT1BZX1RPX1VTRVIoKTsKLQkJcmMgPSAtRUZBVUxUOwotCX0KLQotCUNEQkcoIiVzOiBnb3QgcGljIGZyYW1lXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3NldF9jcm9wKHN0cnVjdCBtc21fc3luYyAqc3luYywgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlzdHJ1Y3QgY3JvcF9pbmZvIGNyb3A7Ci0KLQltdXRleF9sb2NrKCZzeW5jLT5sb2NrKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoJmNyb3AsCi0JCQkJYXJnLAotCQkJCXNpemVvZihzdHJ1Y3QgY3JvcF9pbmZvKSkpIHsKLQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCW11dGV4X3VubG9jaygmc3luYy0+bG9jayk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCWlmIChjcm9wLmxlbiAhPSBDUk9QX0xFTikgewotCQltdXRleF91bmxvY2soJnN5bmMtPmxvY2spOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIXN5bmMtPmNyb3BsZW4pIHsKLQkJc3luYy0+Y3JvcGluZm8gPSBrbWFsbG9jKGNyb3AubGVuLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFzeW5jLT5jcm9waW5mbykgewotCQkJbXV0ZXhfdW5sb2NrKCZzeW5jLT5sb2NrKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKHN5bmMtPmNyb3BpbmZvLAotCQkJCWNyb3AuaW5mbywKLQkJCQljcm9wLmxlbikpIHsKLQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCXN5bmMtPmNyb3BsZW4gPSAwOwotCQlrZnJlZShzeW5jLT5jcm9waW5mbyk7Ci0JCW11dGV4X3VubG9jaygmc3luYy0+bG9jayk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXN5bmMtPmNyb3BsZW4gPSBjcm9wLmxlbjsKLQotCW11dGV4X3VubG9jaygmc3luYy0+bG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2Vycm9yX2NvbmZpZyhzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsIHZvaWQgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IG1zbV9xdWV1ZV9jbWQgKnFjbWQgPQotCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCksIEdGUF9LRVJORUwpOwotCi0JcWNtZC0+Y29tbWFuZCA9IE5VTEw7Ci0KLQlpZiAocWNtZCkKLQkJYXRvbWljX3NldCgmKHFjbWQtPm9uX2hlYXApLCAxKTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmKHFjbWQtPmVycm9yX2NvZGUpLCBhcmcsIHNpemVvZih1aW50MzJfdCkpKSB7Ci0JCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQlmcmVlX3FjbWQocWNtZCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXByX2VycigiJXM6IEVucXVldWUgRmFrZSBGcmFtZSB3aXRoIGVycm9yIGNvZGUgPSAlZFxuIiwgX19mdW5jX18sCi0JCXFjbWQtPmVycm9yX2NvZGUpOwotCW1zbV9lbnF1ZXVlKCZzeW5jLT5mcmFtZV9xLCAmcWNtZC0+bGlzdF9mcmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3NldF9mZF9yb2koc3RydWN0IG1zbV9zeW5jICpzeW5jLCB2b2lkIF9fdXNlciAqYXJnKQotewotCXN0cnVjdCBmZF9yb2lfaW5mbyBmZF9yb2k7Ci0KLQltdXRleF9sb2NrKCZzeW5jLT5sb2NrKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoJmZkX3JvaSwKLQkJCWFyZywKLQkJCXNpemVvZihzdHJ1Y3QgZmRfcm9pX2luZm8pKSkgewotCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJbXV0ZXhfdW5sb2NrKCZzeW5jLT5sb2NrKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCWlmIChmZF9yb2kuaW5mb19sZW4gPD0gMCkgewotCQltdXRleF91bmxvY2soJnN5bmMtPmxvY2spOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlpZiAoIXN5bmMtPmZkcm9paW5mby5pbmZvKSB7Ci0JCXN5bmMtPmZkcm9paW5mby5pbmZvID0ga21hbGxvYyhmZF9yb2kuaW5mb19sZW4sIEdGUF9LRVJORUwpOwotCQlpZiAoIXN5bmMtPmZkcm9paW5mby5pbmZvKSB7Ci0JCQltdXRleF91bmxvY2soJnN5bmMtPmxvY2spOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJc3luYy0+ZmRyb2lpbmZvLmluZm9fbGVuID0gZmRfcm9pLmluZm9fbGVuOwotCX0gZWxzZSBpZiAoc3luYy0+ZmRyb2lpbmZvLmluZm9fbGVuIDwgZmRfcm9pLmluZm9fbGVuKSB7Ci0JCW11dGV4X3VubG9jaygmc3luYy0+bG9jayk7Ci0JCXJldHVybiAtRUlOVkFMOwotICAgIH0KLQotCWlmIChjb3B5X2Zyb21fdXNlcihzeW5jLT5mZHJvaWluZm8uaW5mbywKLQkJCWZkX3JvaS5pbmZvLAotCQkJZmRfcm9pLmluZm9fbGVuKSkgewotCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJa2ZyZWUoc3luYy0+ZmRyb2lpbmZvLmluZm8pOwotCQlzeW5jLT5mZHJvaWluZm8uaW5mbyA9IE5VTEw7Ci0JCW11dGV4X3VubG9jaygmc3luYy0+bG9jayk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQltdXRleF91bmxvY2soJnN5bmMtPmxvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wcF9ncmFiKHN0cnVjdCBtc21fc3luYyAqc3luYywgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQl1aW50MzJfdCBlbmFibGU7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZlbmFibGUsIGFyZywgc2l6ZW9mKGVuYWJsZSkpKSB7Ci0JCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9IGVsc2UgewotCQllbmFibGUgJj0gUFBfTUFTSzsKLQkJaWYgKGVuYWJsZSAmIChlbmFibGUgLSAxKSkgewotCQkJQ0RCRygiJXM6IG1vcmUgdGhhbiBvbmUgUFAgcmVxdWVzdCFcbiIsCi0JCQkJX19mdW5jX18pOwotCQl9Ci0JCWlmIChzeW5jLT5wcF9tYXNrKSB7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJQ0RCRygiJXM6IHBvc3Rwcm9jICV4IGlzIGFscmVhZHkgZW5hYmxlZFxuIiwKLQkJCQkJX19mdW5jX18sIHN5bmMtPnBwX21hc2sgJiBlbmFibGUpOwotCQkJfSBlbHNlIHsKLQkJCQlzeW5jLT5wcF9tYXNrICY9IGVuYWJsZTsKLQkJCQlDREJHKCIlczogc3luYy0+cHBfbWFzayAlZCBlbmFibGUgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCBzeW5jLT5wcF9tYXNrLCBlbmFibGUpOwotCQkJfQotCQl9Ci0KLQkJQ0RCRygiJXM6IHN5bmMtPnBwX21hc2sgJWQgZW5hYmxlICVkXG4iLCBfX2Z1bmNfXywKLQkJCXN5bmMtPnBwX21hc2ssIGVuYWJsZSk7Ci0JCXN5bmMtPnBwX21hc2sgfD0gZW5hYmxlOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wdXRfc3RfZnJhbWUoc3RydWN0IG1zbV9zeW5jICpzeW5jLCB2b2lkIF9fdXNlciAqYXJnKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBzdF9wcGh5OwotCWlmIChzeW5jLT5zdGVyZW9jYW1fZW5hYmxlZCkgewotCQkvKiBNYWtlIHN0ZXJlbyBmcmFtZSByZWFkeSBmb3IgVlBFLiAqLwotCQlzdHJ1Y3QgbXNtX3N0X2ZyYW1lIHN0ZXJlb19mcmFtZV9oYWxmOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmc3RlcmVvX2ZyYW1lX2hhbGYsIGFyZywKLQkJCXNpemVvZihzdGVyZW9fZnJhbWVfaGFsZikpKSB7Ci0JCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJaWYgKHN0ZXJlb19mcmFtZV9oYWxmLnR5cGUgPT0gT1VUUFVUX1RZUEVfU1RfTCkgewotCQkJc3RydWN0IG1zbV92ZmVfcmVzcCAqdmZlX3JwOwotCQkJc3RydWN0IG1zbV9xdWV1ZV9jbWQgKnFjbWQ7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcF9zdGVyZW9jYW1fc3BpbmxvY2ssIGZsYWdzKTsKLQkJCWlmICghc3luYy0+cHBfc3RlcmVvY2FtKSB7Ci0JCQkJcHJfd2FybmluZygiJXM6IG5vIHN0ZXJlbyBmcmFtZSB0byBkZWxpdmVyIVxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwX3N0ZXJlb2NhbV9zcGlubG9jaywKLQkJCQkJZmxhZ3MpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJQ0RCRygiJXM6IGRlbGl2ZXJpbmcgbGVmdCBmcmFtZSB0byBWUEVcbiIsIF9fZnVuY19fKTsKLQotCQkJcWNtZCA9IHN5bmMtPnBwX3N0ZXJlb2NhbTsKLQkJCXN5bmMtPnBwX3N0ZXJlb2NhbSA9IE5VTEw7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcF9zdGVyZW9jYW1fc3BpbmxvY2ssIGZsYWdzKTsKLQotCQkJdmZlX3JwID0gKHN0cnVjdCBtc21fdmZlX3Jlc3AgKilxY21kLT5jb21tYW5kOwotCi0JCQlDREJHKCIlczogTGVmdCBQeSA9IDB4JXggeV9vZmYgPSAlZCBjYmNyX29mZiA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCB2ZmVfcnAtPnBoeS5wMF9waHksCi0JCQkJc3RlcmVvX2ZyYW1lX2hhbGYuTC5idWZfcDBfb2ZmLAotCQkJCXN0ZXJlb19mcmFtZV9oYWxmLkwuYnVmX3AxX29mZik7Ci0KLQkJCXN5bmMtPnZwZWZuLnZwZV9jZmdfb2Zmc2V0KHN0ZXJlb19mcmFtZV9oYWxmLnBhY2tpbmcsCi0JCQl2ZmVfcnAtPnBoeS5wMF9waHkgKyBzdGVyZW9fZnJhbWVfaGFsZi5MLmJ1Zl9wMF9vZmYsCi0JCQl2ZmVfcnAtPnBoeS5wMV9waHkgKyBzdGVyZW9fZnJhbWVfaGFsZi5MLmJ1Zl9wMV9vZmYsCi0JCQkmKHFjbWQtPnRzKSwgT1VUUFVUX1RZUEVfU1RfTCwgc3RlcmVvX2ZyYW1lX2hhbGYuTCwKLQkJCXN0ZXJlb19mcmFtZV9oYWxmLmZyYW1lX2lkKTsKLQotCQkJZnJlZV9xY21kKHFjbWQpOwotCQl9IGVsc2UgaWYgKHN0ZXJlb19mcmFtZV9oYWxmLnR5cGUgPT0gT1VUUFVUX1RZUEVfU1RfUikgewotCQkJQ0RCRygiJXM6IGRlbGl2ZXJpbmcgcmlnaHQgZnJhbWUgdG8gVlBFXG4iLCBfX2Z1bmNfXyk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RfZnJhbWVfc3BpbmxvY2ssIGZsYWdzKTsKLQotCQkJc3luYy0+c3RjYW1fY29udl92YWx1ZSA9Ci0JCQkJc3RlcmVvX2ZyYW1lX2hhbGYuYnVmX2luZm8uc3RjYW1fY29udl92YWx1ZTsKLQkJCXN5bmMtPnN0Y2FtX3F1YWxpdHlfaW5kID0KLQkJCQlzdGVyZW9fZnJhbWVfaGFsZi5idWZfaW5mby5zdGNhbV9xdWFsaXR5X2luZDsKLQotCQkJc3RfcHBoeSA9IG1zbV9wbWVtX2ZyYW1lX3Z0b3BfbG9va3VwKHN5bmMsCi0JCQkJc3RlcmVvX2ZyYW1lX2hhbGYuYnVmX2luZm8uYnVmZmVyLAotCQkJCXN0ZXJlb19mcmFtZV9oYWxmLmJ1Zl9pbmZvLnBsYW5hcjBfb2ZmLAotCQkJCXN0ZXJlb19mcmFtZV9oYWxmLmJ1Zl9pbmZvLnBsYW5hcjFfb2ZmLAotCQkJCXN0ZXJlb19mcmFtZV9oYWxmLmJ1Zl9pbmZvLnBsYW5hcjJfb2ZmLAotCQkJCXN0ZXJlb19mcmFtZV9oYWxmLmJ1Zl9pbmZvLmZkLAotCQkJCTApOyAvKiBEbyBub3QgY2hhbmdlIHRoZSBhY3RpdmUgZmxhZy4gKi8KLQotCQkJc3luYy0+dnBlZm4udnBlX2NmZ19vZmZzZXQoc3RlcmVvX2ZyYW1lX2hhbGYucGFja2luZywKLQkJCQlzdF9wcGh5ICsgc3RlcmVvX2ZyYW1lX2hhbGYuUi5idWZfcDBfb2ZmLAotCQkJCXN0X3BwaHkgKyBzdGVyZW9fZnJhbWVfaGFsZi5SLmJ1Zl9wMV9vZmYsCi0JCQkJTlVMTCwgT1VUUFVUX1RZUEVfU1RfUiwgc3RlcmVvX2ZyYW1lX2hhbGYuUiwKLQkJCQlzdGVyZW9fZnJhbWVfaGFsZi5mcmFtZV9pZCk7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0X2ZyYW1lX3NwaW5sb2NrLCBmbGFncyk7Ci0JCX0gZWxzZSB7Ci0JCQlDREJHKCIlczogSW52YWxpZCBNc2dcbiIsIF9fZnVuY19fKTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9xdWV1ZV9jbWQgKm1zbV9nZXRfcHBfcWNtZChzdHJ1Y3QgbXNtX2ZyYW1lKiBmcmFtZSkKLXsKLQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqcWNtZCA9Ci0JCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fcXVldWVfY21kKSArCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9mcmFtZSksIEdGUF9BVE9NSUMpOwotCXFjbWQtPmNvbW1hbmQgPSAoc3RydWN0IG1zbV9mcmFtZSAqKShxY21kICsgMSk7Ci0KLQlxY21kLT50eXBlID0gTVNNX0NBTV9RX1BQX01TRzsKLQotCWt0aW1lX2dldF90cygmKHFjbWQtPnRzKSk7Ci0JbWVtY3B5KHFjbWQtPmNvbW1hbmQsIGZyYW1lLCBzaXplb2Yoc3RydWN0IG1zbV9mcmFtZSkpOwotCWF0b21pY19zZXQoJihxY21kLT5vbl9oZWFwKSwgMSk7Ci0JcmV0dXJuIHFjbWQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BwX3JlbGVhc2Uoc3RydWN0IG1zbV9zeW5jICpzeW5jLCB2b2lkIF9fdXNlciAqYXJnKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIXN5bmMtPnBwX21hc2spIHsKLQkJcHJfd2FybmluZygiJXM6IHBwIG5vdCBpbiBwcm9ncmVzcyBmb3JcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChzeW5jLT5wcF9tYXNrICYgUFBfUFJFVikgewotCi0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBwX3ByZXZfc3BpbmxvY2ssIGZsYWdzKTsKLQkJaWYgKCFzeW5jLT5wcF9wcmV2KSB7Ci0JCQlwcl9lcnIoIiVzOiBubyBwcmV2aWV3IGZyYW1lIHRvIGRlbGl2ZXIhXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwX3ByZXZfc3BpbmxvY2ssCi0JCQkJZmxhZ3MpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJQ0RCRygiJXM6IGRlbGl2ZXJpbmcgcHBfcHJldlxuIiwgX19mdW5jX18pOwotCi0JCQlpZiAoc3luYy0+ZnJhbWVfcS5sZW4gPD0gMTAwICYmCi0JCQkJc3luYy0+ZXZlbnRfcS5sZW4gPD0gMTAwKSB7Ci0JCQkJCW1zbV9lbnF1ZXVlKCZzeW5jLT5mcmFtZV9xLAotCQkJCQkJJnN5bmMtPnBwX3ByZXYtPmxpc3RfZnJhbWUpOwotCQkJfSBlbHNlIHsKLQkJCQlwcl9lcnIoIiVzLCBFcnJvciBRdWV1ZSBsaW1pdCBleGNlZWRlZCBmX3E9JWQsXAotCQkJCQllX3EgPSAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHN5bmMtPmZyYW1lX3EubGVuLAotCQkJCQlzeW5jLT5ldmVudF9xLmxlbik7Ci0JCQkJZnJlZV9xY21kKHN5bmMtPnBwX3ByZXYpOwotCQkJCWdvdG8gZG9uZTsKLQkJCX0KLQotCQkJc3luYy0+cHBfcHJldiA9IE5VTEw7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcF9wcmV2X3NwaW5sb2NrLCBmbGFncyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoKHN5bmMtPnBwX21hc2sgJiBQUF9TTkFQKSB8fAotCQkoc3luYy0+cHBfbWFzayAmIFBQX1JBV19TTkFQKSkgewotCQlzdHJ1Y3QgbXNtX2ZyYW1lIGZyYW1lOwotCQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqcWNtZDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmZyYW1lLAotCQkJYXJnLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fZnJhbWUpKSkgewotCQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlxY21kID0gbXNtX2dldF9wcF9xY21kKCZmcmFtZSk7Ci0JCWlmICghcWNtZCkgewotCQkJcHJfZXJyKCIlczogbm8gc25hcHNob3QgdG8gZGVsaXZlciFcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCUNEQkcoIiVzOiBkZWxpdmVyaW5nIHBwIHNuYXBcbiIsIF9fZnVuY19fKTsKLQkJbXNtX2VucXVldWUoJnN5bmMtPnBpY3RfcSwgJnFjbWQtPmxpc3RfcGljdCk7Ci0JfQotCi1kb25lOgotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyBtc21faW9jdGxfY29tbW9uKHN0cnVjdCBtc21fY2FtX2RldmljZSAqcG1zbSwKLQkJdW5zaWduZWQgaW50IGNtZCwKLQkJdm9pZCBfX3VzZXIgKmFyZ3ApCi17Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIE1TTV9DQU1fSU9DVExfUkVHSVNURVJfUE1FTToKLQkJQ0RCRygiJXMgY21kID0gTVNNX0NBTV9JT0NUTF9SRUdJU1RFUl9QTUVNXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBtc21fcmVnaXN0ZXJfcG1lbShwbXNtLT5zeW5jLCBhcmdwKTsKLQljYXNlIE1TTV9DQU1fSU9DVExfVU5SRUdJU1RFUl9QTUVNOgotCQlDREJHKCIlcyBjbWQgPSBNU01fQ0FNX0lPQ1RMX1VOUkVHSVNURVJfUE1FTVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gbXNtX3BtZW1fdGFibGVfZGVsKHBtc20tPnN5bmMsIGFyZ3ApOwotCWNhc2UgTVNNX0NBTV9JT0NUTF9SRUxFQVNFX0ZSQU1FX0JVRkZFUjoKLQkJQ0RCRygiJXMgY21kID0gTVNNX0NBTV9JT0NUTF9SRUxFQVNFX0ZSQU1FX0JVRkZFUlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gbXNtX3B1dF9mcmFtZV9idWZmZXIocG1zbS0+c3luYywgYXJncCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUNEQkcoIiVzIGNtZCBpbnZhbGlkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLX0KLQotc3RhdGljIGxvbmcgbXNtX2lvY3RsX2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsCi0JdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlzdHJ1Y3QgbXNtX2NhbV9kZXZpY2UgKnBtc20gPSBmaWxlcC0+cHJpdmF0ZV9kYXRhOwotCi0JQ0RCRygiJXM6IGNtZCAlZFxuIiwgX19mdW5jX18sIF9JT0NfTlIoY21kKSk7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgTVNNX0NBTV9JT0NUTF9HRVRfU0VOU09SX0lORk86Ci0JCXJjID0gbXNtX2dldF9zZW5zb3JfaW5mbyhwbXNtLT5zeW5jLCBhcmdwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9DQU1fSU9DVExfQ09ORklHX1ZGRToKLQkJLyogQ29taW5nIGZyb20gY29uZmlnIHRocmVhZCBmb3IgdXBkYXRlICovCi0JCXJjID0gbXNtX2NvbmZpZ192ZmUocG1zbS0+c3luYywgYXJncCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNX0lPQ1RMX0NPTkZJR19WUEU6Ci0JCS8qIENvbWluZyBmcm9tIGNvbmZpZyB0aHJlYWQgZm9yIHVwZGF0ZSAqLwotCQlyYyA9IG1zbV9jb25maWdfdnBlKHBtc20tPnN5bmMsIGFyZ3ApOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTV9JT0NUTF9HRVRfU1RBVFM6Ci0JCS8qIENvbWluZyBmcm9tIGNvbmZpZyB0aHJlYWQgd2FpdAotCQkgKiBmb3IgdmZlIHN0YXRpc3RpY3MgYW5kIGNvbnRyb2wgcmVxdWVzdHMgKi8KLQkJcmMgPSBtc21fZ2V0X3N0YXRzKHBtc20tPnN5bmMsIGFyZ3ApOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTV9JT0NUTF9FTkFCTEVfVkZFOgotCQkvKiBUaGlzIHJlcXVlc3QgY29tZXMgZnJvbSBjb250cm9sIHRocmVhZDoKLQkJICogZW5hYmxlIGVpdGhlciBRQ0FNVEFTSyBvciBWRkVUQVNLICovCi0JCXJjID0gbXNtX2VuYWJsZV92ZmUocG1zbS0+c3luYywgYXJncCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNX0lPQ1RMX0RJU0FCTEVfVkZFOgotCQkvKiBUaGlzIHJlcXVlc3QgY29tZXMgZnJvbSBjb250cm9sIHRocmVhZDoKLQkJICogZGlzYWJsZSBlaXRoZXIgUUNBTVRBU0sgb3IgVkZFVEFTSyAqLwotCQlyYyA9IG1zbV9kaXNhYmxlX3ZmZShwbXNtLT5zeW5jLCBhcmdwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9DQU1fSU9DVExfVkZFX0FQUFNfUkVTRVQ6Ci0JCW1zbV9jYW1pb192ZmVfYmxrX3Jlc2V0KCk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9DQU1fSU9DVExfUkVMRUFTRV9TVEFUU19CVUZGRVI6Ci0JCXJjID0gbXNtX3B1dF9zdGF0c19idWZmZXIocG1zbS0+c3luYywgYXJncCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNX0lPQ1RMX0FYSV9DT05GSUc6Ci0JY2FzZSBNU01fQ0FNX0lPQ1RMX0FYSV9WUEVfQ09ORklHOgotCQlyYyA9IG1zbV9heGlfY29uZmlnKHBtc20tPnN5bmMsIGFyZ3ApOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTV9JT0NUTF9TRVRfQ1JPUDoKLQkJcmMgPSBtc21fc2V0X2Nyb3AocG1zbS0+c3luYywgYXJncCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNX0lPQ1RMX1NFVF9GRF9ST0k6Ci0JCXJjID0gbXNtX3NldF9mZF9yb2kocG1zbS0+c3luYywgYXJncCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNX0lPQ1RMX1BJQ1RfUFA6Ci0JCS8qIEdyYWIgb25lIHByZXZpZXcgZnJhbWUgb3Igb25lIHNuYXBzaG90Ci0JCSAqIGZyYW1lLgotCQkgKi8KLQkJcmMgPSBtc21fcHBfZ3JhYihwbXNtLT5zeW5jLCBhcmdwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9DQU1fSU9DVExfUElDVF9QUF9ET05FOgotCQkvKiBSZWxlYXNlIHRoZSBwcmV2aWV3IG9mIHNuYXBzaG90IGZyYW1lCi0JCSAqIHRoYXQgd2FzIGdyYWJiZWQuCi0JCSAqLwotCQlyYyA9IG1zbV9wcF9yZWxlYXNlKHBtc20tPnN5bmMsIGFyZ3ApOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTV9JT0NUTF9QVVRfU1RfRlJBTUU6Ci0JCS8qIFJlbGVhc2UgdGhlIGxlZnQgb3IgcmlnaHQgZnJhbWUKLQkJICogdGhhdCB3YXMgc2VudCBmb3Igc3RlcmVvIHByb2Nlc3NpbmcuCi0JCSAqLwotCQlyYyA9IG1zbV9wdXRfc3RfZnJhbWUocG1zbS0+c3luYywgYXJncCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNX0lPQ1RMX1NFTlNPUl9JT19DRkc6Ci0JCXJjID0gcG1zbS0+c3luYy0+c2N0cmwuc19jb25maWcoYXJncCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNX0lPQ1RMX0VSUk9SX0NPTkZJRzoKLQkJcmMgPSBtc21fZXJyb3JfY29uZmlnKHBtc20tPnN5bmMsIGFyZ3ApOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTV9JT0NUTF9BQk9SVF9DQVBUVVJFOiB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCQlDREJHKCJnZXRfcGljOk1TTV9DQU1fSU9DVExfQUJPUlRfQ0FQVFVSRVxuIik7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwbXNtLT5zeW5jLT5hYm9ydF9waWN0X2xvY2ssIGZsYWdzKTsKLQkJcG1zbS0+c3luYy0+Z2V0X3BpY19hYm9ydCA9IDE7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtc20tPnN5bmMtPmFib3J0X3BpY3RfbG9jaywgZmxhZ3MpOwotCQl3YWtlX3VwKCYocG1zbS0+c3luYy0+cGljdF9xLndhaXQpKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQl9Ci0KLQlkZWZhdWx0OgotCQlyYyA9IG1zbV9pb2N0bF9jb21tb24ocG1zbSwgY21kLCBhcmdwKTsKLQkJYnJlYWs7Ci0JfQotCi0JQ0RCRygiJXM6IGNtZCAlZCBET05FXG4iLCBfX2Z1bmNfXywgX0lPQ19OUihjbWQpKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3VuYmxvY2tfcG9sbF9mcmFtZShzdHJ1Y3QgbXNtX3N5bmMgKik7Ci0KLXN0YXRpYyBsb25nIG1zbV9pb2N0bF9mcmFtZShzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsCi0JdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlzdHJ1Y3QgbXNtX2NhbV9kZXZpY2UgKnBtc20gPSBmaWxlcC0+cHJpdmF0ZV9kYXRhOwotCi0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgTVNNX0NBTV9JT0NUTF9HRVRGUkFNRToKLQkJLyogQ29taW5nIGZyb20gZnJhbWUgdGhyZWFkIHRvIGdldCBmcmFtZQotCQkgKiBhZnRlciBTRUxFQ1QgaXMgZG9uZSAqLwotCQlyYyA9IG1zbV9nZXRfZnJhbWUocG1zbS0+c3luYywgYXJncCk7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0NBTV9JT0NUTF9SRUxFQVNFX0ZSQU1FX0JVRkZFUjoKLQkJcmMgPSBtc21fcHV0X2ZyYW1lX2J1ZmZlcihwbXNtLT5zeW5jLCBhcmdwKTsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQ0FNX0lPQ1RMX1VOQkxPQ0tfUE9MTF9GUkFNRToKLQkJcmMgPSBtc21fdW5ibG9ja19wb2xsX2ZyYW1lKHBtc20tPnN5bmMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3VuYmxvY2tfcG9sbF9waWMoc3RydWN0IG1zbV9zeW5jICpzeW5jKTsKLXN0YXRpYyBsb25nIG1zbV9pb2N0bF9waWMoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLAotCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByYyA9IC1FSU5WQUw7Ci0Jdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0Jc3RydWN0IG1zbV9jYW1fZGV2aWNlICpwbXNtID0gZmlsZXAtPnByaXZhdGVfZGF0YTsKLQotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIE1TTV9DQU1fSU9DVExfR0VUX1BJQ1RVUkU6Ci0JCXJjID0gbXNtX2dldF9waWMocG1zbS0+c3luYywgYXJncCk7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0NBTV9JT0NUTF9SRUxFQVNFX1BJQ19CVUZGRVI6Ci0JCXJjID0gbXNtX3B1dF9waWNfYnVmZmVyKHBtc20tPnN5bmMsIGFyZ3ApOwotCQlicmVhazsKLQljYXNlIE1TTV9DQU1fSU9DVExfVU5CTE9DS19QT0xMX1BJQ19GUkFNRToKLQkJcmMgPSBtc21fdW5ibG9ja19wb2xsX3BpYyhwbXNtLT5zeW5jKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi0KLXN0YXRpYyBsb25nIG1zbV9pb2N0bF9jb250cm9sKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCwKLQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCXN0cnVjdCBtc21fY29udHJvbF9kZXZpY2UgKmN0cmxfcG1zbSA9IGZpbGVwLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IG1zbV9jYW1fZGV2aWNlICpwbXNtID0gY3RybF9wbXNtLT5wbXNtOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIE1TTV9DQU1fSU9DVExfQ1RSTF9DT01NQU5EOgotCQkvKiBDb21pbmcgZnJvbSBjb250cm9sIHRocmVhZCwgbWF5IG5lZWQgdG8gd2FpdCBmb3IKLQkJICogY29tbWFuZCBzdGF0dXMgKi8KLQkJQ0RCRygiY2FsbGluZyBtc21fY29udHJvbCBrZXJuZWwgbXNtX2lvY3RsX2NvbnRyb2xcbiIpOwotCQltdXRleF9sb2NrKCZjdHJsX2NtZF9sb2NrKTsKLQkJcmMgPSBtc21fY29udHJvbChjdHJsX3Btc20sIDEsIGFyZ3ApOwotCQltdXRleF91bmxvY2soJmN0cmxfY21kX2xvY2spOwotCQlicmVhazsKLQljYXNlIE1TTV9DQU1fSU9DVExfQ1RSTF9DT01NQU5EXzI6Ci0JCS8qIFNlbmRzIGEgbWVzc2FnZSwgcmV0dXJucyBpbW1lZGlhdGVseSAqLwotCQlyYyA9IG1zbV9jb250cm9sKGN0cmxfcG1zbSwgMCwgYXJncCk7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0NBTV9JT0NUTF9DVFJMX0NNRF9ET05FOgotCQkvKiBDb25maWcgdGhyZWFkIGNhbGxzIHRoZSBjb250cm9sIHRocmVhZCB0byBub3RpZnkgaXQKLQkJICogb2YgdGhlIHJlc3VsdCBvZiBhIE1TTV9DQU1fSU9DVExfQ1RSTF9DT01NQU5ELgotCQkgKi8KLQkJcmMgPSBtc21fY3RybF9jbWRfZG9uZShjdHJsX3Btc20sIGFyZ3ApOwotCQlicmVhazsKLQljYXNlIE1TTV9DQU1fSU9DVExfR0VUX1NFTlNPUl9JTkZPOgotCQlyYyA9IG1zbV9nZXRfc2Vuc29yX2luZm8ocG1zbS0+c3luYywgYXJncCk7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0NBTV9JT0NUTF9HRVRfQ0FNRVJBX0lORk86Ci0JCXJjID0gbXNtX2dldF9jYW1lcmFfaW5mbyhhcmdwKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSBtc21faW9jdGxfY29tbW9uKHBtc20sIGNtZCwgYXJncCk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX21zbV9yZWxlYXNlKHN0cnVjdCBtc21fc3luYyAqc3luYykKLXsKLQlzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uICpyZWdpb247Ci0Jc3RydWN0IGhsaXN0X25vZGUgKmhub2RlOwotCXN0cnVjdCBobGlzdF9ub2RlICpuOwotCi0JbXV0ZXhfbG9jaygmc3luYy0+bG9jayk7Ci0JaWYgKHN5bmMtPm9wZW5jbnQpCi0JCXN5bmMtPm9wZW5jbnQtLTsKLQlwcl9pbmZvKCIlcywgb3BlbiBjb3VudCA9JWRcbiIsIF9fZnVuY19fLCBzeW5jLT5vcGVuY250KTsKLQlpZiAoIXN5bmMtPm9wZW5jbnQpIHsKLQkJLyogbmVlZCB0byBjbGVhbiB1cCBzeXN0ZW0gcmVzb3VyY2UgKi8KLQkJcHJfaW5mbygiJXMsIHJlbGVhc2UgVkZFXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmIChzeW5jLT5jb3JlX3Bvd2VyZWRfb24pIHsKLQkJCWlmIChzeW5jLT52ZmVmbi52ZmVfcmVsZWFzZSkKLQkJCQlzeW5jLT52ZmVmbi52ZmVfcmVsZWFzZShzeW5jLT5wZGV2KTsKLQkJCS8qc2Vuc29yIHJlbGVhc2UgKi8KLQkJCXByX2luZm8oIiVzLCByZWxlYXNlIFNlbnNvclxuIiwgX19mdW5jX18pOwotCQkJc3luYy0+c2N0cmwuc19yZWxlYXNlKCk7Ci0JCQlDREJHKCIlcywgbXNtX2NhbWlvX3NlbnNvcl9jbGtfb2ZmXG4iLCBfX2Z1bmNfXyk7Ci0JCQltc21fY2FtaW9fc2Vuc29yX2Nsa19vZmYoc3luYy0+cGRldik7Ci0JCQlpZiAoc3luYy0+c2ZjdHJsLnN0cm9iZV9mbGFzaF9yZWxlYXNlKSB7Ci0JCQkJQ0RCRygiJXMsIHN0cm9iZV9mbGFzaF9yZWxlYXNlXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJc3luYy0+c2ZjdHJsLnN0cm9iZV9mbGFzaF9yZWxlYXNlKAotCQkJCXN5bmMtPnNkYXRhLT5zdHJvYmVfZmxhc2hfZGF0YSwgMSk7Ci0JCQl9Ci0JCX0KLQkJa2ZyZWUoc3luYy0+Y3JvcGluZm8pOwotCQlzeW5jLT5jcm9waW5mbyA9IE5VTEw7Ci0JCXN5bmMtPmNyb3BsZW4gPSAwOwotCQlDREJHKCIlcywgZnJlZSBmcmFtZSBwbWVtIHJlZ2lvblxuIiwgX19mdW5jX18pOwotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlZ2lvbiwgaG5vZGUsIG4sCi0JCQkJJnN5bmMtPnBtZW1fZnJhbWVzLCBsaXN0KSB7Ci0JCQlobGlzdF9kZWwoaG5vZGUpOwotI2lmZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0JCQkJaW9uX2ZyZWUoY2xpZW50X2Zvcl9pb24sIHJlZ2lvbi0+aGFuZGxlKTsKLSNlbmRpZgotCQkJa2ZyZWUocmVnaW9uKTsKLQkJfQotCQlDREJHKCIlcywgZnJlZSBzdGF0cyBwbWVtIHJlZ2lvblxuIiwgX19mdW5jX18pOwotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlZ2lvbiwgaG5vZGUsIG4sCi0JCQkJJnN5bmMtPnBtZW1fc3RhdHMsIGxpc3QpIHsKLQkJCWhsaXN0X2RlbChobm9kZSk7Ci0jaWZkZWYgQ09ORklHX01TTV9NVUxUSU1FRElBX1VTRV9JT04KLQkJCQlpb25fZnJlZShjbGllbnRfZm9yX2lvbiwgcmVnaW9uLT5oYW5kbGUpOwotI2VuZGlmCi0JCQlrZnJlZShyZWdpb24pOwotCQl9Ci0JCW1zbV9xdWV1ZV9kcmFpbigmc3luYy0+cGljdF9xLCBsaXN0X3BpY3QpOwotCQltc21fcXVldWVfZHJhaW4oJnN5bmMtPmV2ZW50X3EsIGxpc3RfY29uZmlnKTsKLQotCQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJnN5bmMtPmlkbGVfcG1fcW9zLCBQTV9RT1NfREVGQVVMVF9WQUxVRSk7Ci0JCXN5bmMtPmFwcHNfaWQgPSBOVUxMOwotCQlzeW5jLT5jb3JlX3Bvd2VyZWRfb24gPSAwOwotCX0KLQltdXRleF91bmxvY2soJnN5bmMtPmxvY2spOwotCWlvbl9jbGllbnRfZGVzdHJveShjbGllbnRfZm9yX2lvbik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcmVsZWFzZV9jb25maWcoc3RydWN0IGlub2RlICpub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCi17Ci0JaW50IHJjOwotCXN0cnVjdCBtc21fY2FtX2RldmljZSAqcG1zbSA9IGZpbGVwLT5wcml2YXRlX2RhdGE7Ci0JcHJfaW5mbygiJXM6ICVzXG4iLCBfX2Z1bmNfXywgZmlsZXAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lKTsKLQlyYyA9IF9fbXNtX3JlbGVhc2UocG1zbS0+c3luYyk7Ci0JaWYgKCFyYykgewotCQltc21fcXVldWVfZHJhaW4oJnBtc20tPnN5bmMtPmV2ZW50X3EsIGxpc3RfY29uZmlnKTsKLQkJYXRvbWljX3NldCgmcG1zbS0+b3BlbmVkLCAwKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9yZWxlYXNlX2NvbnRyb2woc3RydWN0IGlub2RlICpub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCi17Ci0JaW50IHJjOwotCXN0cnVjdCBtc21fY29udHJvbF9kZXZpY2UgKmN0cmxfcG1zbSA9IGZpbGVwLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IG1zbV9jYW1fZGV2aWNlICpwbXNtID0gY3RybF9wbXNtLT5wbXNtOwotCXByX2luZm8oIiVzOiAlc1xuIiwgX19mdW5jX18sIGZpbGVwLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSk7Ci0JZ192NGwyX29wZW5jbnQtLTsKLQltdXRleF9sb2NrKCZwbXNtLT5zeW5jLT5sb2NrKTsKLQlpZiAocG1zbS0+c3luYy0+Y29yZV9wb3dlcmVkX29uICYmIHBtc20tPnN5bmMtPnZmZWZuLnZmZV9zdG9wKSB7Ci0JCXByX2luZm8oIiVzLCBzdG9wIHZmZSBpZiBhY3RpdmVcbiIsIF9fZnVuY19fKTsKLQkJcG1zbS0+c3luYy0+dmZlZm4udmZlX3N0b3AoKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwbXNtLT5zeW5jLT5sb2NrKTsKLQlyYyA9IF9fbXNtX3JlbGVhc2UocG1zbS0+c3luYyk7Ci0JaWYgKCFyYykgewotCQltc21fcXVldWVfZHJhaW4oJmN0cmxfcG1zbS0+Y3RybF9xLCBsaXN0X2NvbnRyb2wpOwotCQlrZnJlZShjdHJsX3Btc20pOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JlbGVhc2VfZnJhbWUoc3RydWN0IGlub2RlICpub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCi17Ci0JaW50IHJjOwotCXN0cnVjdCBtc21fY2FtX2RldmljZSAqcG1zbSA9IGZpbGVwLT5wcml2YXRlX2RhdGE7Ci0JcHJfaW5mbygiJXM6ICVzXG4iLCBfX2Z1bmNfXywgZmlsZXAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lKTsKLQlyYyA9IF9fbXNtX3JlbGVhc2UocG1zbS0+c3luYyk7Ci0JaWYgKCFyYykgewotCQltc21fcXVldWVfZHJhaW4oJnBtc20tPnN5bmMtPmZyYW1lX3EsIGxpc3RfZnJhbWUpOwotCQlhdG9taWNfc2V0KCZwbXNtLT5vcGVuZWQsIDApOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIGludCBtc21fcmVsZWFzZV9waWMoc3RydWN0IGlub2RlICpub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCi17Ci0JaW50IHJjOwotCXN0cnVjdCBtc21fY2FtX2RldmljZSAqcG1zbSA9IGZpbGVwLT5wcml2YXRlX2RhdGE7Ci0JQ0RCRygiJXM6ICVzXG4iLCBfX2Z1bmNfXywgZmlsZXAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lKTsKLQlyYyA9IF9fbXNtX3JlbGVhc2UocG1zbS0+c3luYyk7Ci0JaWYgKCFyYykgewotCQltc21fcXVldWVfZHJhaW4oJnBtc20tPnN5bmMtPnBpY3RfcSwgbGlzdF9waWN0KTsKLQkJYXRvbWljX3NldCgmcG1zbS0+b3BlbmVkLCAwKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV91bmJsb2NrX3BvbGxfcGljKHN0cnVjdCBtc21fc3luYyAqc3luYykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCUNEQkcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN5bmMtPnBpY3RfcS5sb2NrLCBmbGFncyk7Ci0Jc3luYy0+dW5ibG9ja19wb2xsX3BpY19mcmFtZSA9IDE7Ci0Jd2FrZV91cCgmc3luYy0+cGljdF9xLndhaXQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bmMtPnBpY3RfcS5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3VuYmxvY2tfcG9sbF9mcmFtZShzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlDREJHKCIlc1xuIiwgX19mdW5jX18pOwotCXNwaW5fbG9ja19pcnFzYXZlKCZzeW5jLT5mcmFtZV9xLmxvY2ssIGZsYWdzKTsKLQlzeW5jLT51bmJsb2NrX3BvbGxfZnJhbWUgPSAxOwotCXdha2VfdXAoJnN5bmMtPmZyYW1lX3Eud2FpdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luYy0+ZnJhbWVfcS5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19tc21fcG9sbF9mcmFtZShzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsCi0JCXN0cnVjdCBmaWxlICpmaWxlcCwKLQkJc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICpwbGxfdGFibGUpCi17Ci0JaW50IHJjID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcG9sbF93YWl0KGZpbGVwLCAmc3luYy0+ZnJhbWVfcS53YWl0LCBwbGxfdGFibGUpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN5bmMtPmZyYW1lX3EubG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eV9jYXJlZnVsKCZzeW5jLT5mcmFtZV9xLmxpc3QpKQotCQkvKiBmcmFtZSByZWFkeSAqLwotCQlyYyA9IFBPTExJTiB8IFBPTExSRE5PUk07Ci0JaWYgKHN5bmMtPnVuYmxvY2tfcG9sbF9mcmFtZSkgewotCQlDREJHKCIlczogc3luYy0+dW5ibG9ja19wb2xsX2ZyYW1lIGlzIHRydWVcbiIsIF9fZnVuY19fKTsKLQkJcmMgfD0gUE9MTFBSSTsKLQkJc3luYy0+dW5ibG9ja19wb2xsX2ZyYW1lID0gMDsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luYy0+ZnJhbWVfcS5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19tc21fcG9sbF9waWMoc3RydWN0IG1zbV9zeW5jICpzeW5jLAotCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsCi0JCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqcGxsX3RhYmxlKQotewotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXBvbGxfd2FpdChmaWxlcCwgJnN5bmMtPnBpY3RfcS53YWl0ICwgcGxsX3RhYmxlKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3luYy0+YWJvcnRfcGljdF9sb2NrLCBmbGFncyk7Ci0JaWYgKHN5bmMtPmdldF9waWNfYWJvcnQgPT0gMSkgewotCQkvKiBUT0RPOiBuZWVkIHRvIHBhc3MgYW4gZXJyb3IgY2FzZSAqLwotCQlzeW5jLT5nZXRfcGljX2Fib3J0ID0gMDsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luYy0+YWJvcnRfcGljdF9sb2NrLCBmbGFncyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3luYy0+cGljdF9xLmxvY2ssIGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHlfY2FyZWZ1bCgmc3luYy0+cGljdF9xLmxpc3QpKQotCQkvKiBmcmFtZSByZWFkeSAqLwotCQlyYyA9IFBPTExJTiB8IFBPTExSRE5PUk07Ci0JaWYgKHN5bmMtPnVuYmxvY2tfcG9sbF9waWNfZnJhbWUpIHsKLQkJQ0RCRygiJXM6IHN5bmMtPnVuYmxvY2tfcG9sbF9waWNfZnJhbWUgaXMgdHJ1ZVxuIiwgX19mdW5jX18pOwotCQlyYyB8PSBQT0xMUFJJOwotCQlzeW5jLT51bmJsb2NrX3BvbGxfcGljX2ZyYW1lID0gMDsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luYy0+cGljdF9xLmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBtc21fcG9sbF9mcmFtZShzdHJ1Y3QgZmlsZSAqZmlsZXAsCi0Jc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICpwbGxfdGFibGUpCi17Ci0Jc3RydWN0IG1zbV9jYW1fZGV2aWNlICpwbXNtID0gZmlsZXAtPnByaXZhdGVfZGF0YTsKLQlyZXR1cm4gX19tc21fcG9sbF9mcmFtZShwbXNtLT5zeW5jLCBmaWxlcCwgcGxsX3RhYmxlKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBtc21fcG9sbF9waWMoc3RydWN0IGZpbGUgKmZpbGVwLAotCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqcGxsX3RhYmxlKQotewotCXN0cnVjdCBtc21fY2FtX2RldmljZSAqcG1zbSA9IGZpbGVwLT5wcml2YXRlX2RhdGE7Ci0JcmV0dXJuIF9fbXNtX3BvbGxfcGljKHBtc20tPnN5bmMsIGZpbGVwLCBwbGxfdGFibGUpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IF9fbXNtX3BvbGxfY29uZmlnKHN0cnVjdCBtc21fc3luYyAqc3luYywKLQkJc3RydWN0IGZpbGUgKmZpbGVwLAotCQlzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKnBsbF90YWJsZSkKLXsKLQlpbnQgcmMgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlwb2xsX3dhaXQoZmlsZXAsICZzeW5jLT5ldmVudF9xLndhaXQsIHBsbF90YWJsZSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3luYy0+ZXZlbnRfcS5sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5X2NhcmVmdWwoJnN5bmMtPmV2ZW50X3EubGlzdCkpCi0JCS8qIGV2ZW50IHJlYWR5ICovCi0JCXJjID0gUE9MTElOIHwgUE9MTFJETk9STTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW5jLT5ldmVudF9xLmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBtc21fcG9sbF9jb25maWcoc3RydWN0IGZpbGUgKmZpbGVwLAotCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqcGxsX3RhYmxlKQotewotCXN0cnVjdCBtc21fY2FtX2RldmljZSAqcG1zbSA9IGZpbGVwLT5wcml2YXRlX2RhdGE7Ci0JcmV0dXJuIF9fbXNtX3BvbGxfY29uZmlnKHBtc20tPnN5bmMsIGZpbGVwLCBwbGxfdGFibGUpOwotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBleGVjdXRlcyBpbiBpbnRlcnJ1cHQgY29udGV4dC4KLSAqLwotCi1zdGF0aWMgdm9pZCAqbXNtX3ZmZV9zeW5jX2FsbG9jKGludCBzaXplLAotCQkJdm9pZCAqc3luY2RhdGEgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCi0JCQlnZnBfdCBnZnApCi17Ci0Jc3RydWN0IG1zbV9xdWV1ZV9jbWQgKnFjbWQgPQotCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCkgKyBzaXplLCBnZnApOwotCWlmIChxY21kKSB7Ci0JCWF0b21pY19zZXQoJnFjbWQtPm9uX2hlYXAsIDEpOwotCQlyZXR1cm4gcWNtZCArIDE7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCAqbXNtX3ZwZV9zeW5jX2FsbG9jKGludCBzaXplLAotCQkJdm9pZCAqc3luY2RhdGEgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCi0JCQlnZnBfdCBnZnApCi17Ci0Jc3RydWN0IG1zbV9xdWV1ZV9jbWQgKnFjbWQgPQotCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCkgKyBzaXplLCBnZnApOwotCWlmIChxY21kKSB7Ci0JCWF0b21pY19zZXQoJnFjbWQtPm9uX2hlYXAsIDEpOwotCQlyZXR1cm4gcWNtZCArIDE7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBtc21fdmZlX3N5bmNfZnJlZSh2b2lkICpwdHIpCi17Ci0JaWYgKHB0cikgewotCQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqcWNtZCA9Ci0JCQkoc3RydWN0IG1zbV9xdWV1ZV9jbWQgKilwdHI7Ci0JCXFjbWQtLTsKLQkJaWYgKGF0b21pY19yZWFkKCZxY21kLT5vbl9oZWFwKSkKLQkJCWtmcmVlKHFjbWQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbXNtX3ZwZV9zeW5jX2ZyZWUodm9pZCAqcHRyKQotewotCWlmIChwdHIpIHsKLQkJc3RydWN0IG1zbV9xdWV1ZV9jbWQgKnFjbWQgPQotCQkJKHN0cnVjdCBtc21fcXVldWVfY21kICopcHRyOwotCQlxY21kLS07Ci0JCWlmIChhdG9taWNfcmVhZCgmcWNtZC0+b25faGVhcCkpCi0JCQlrZnJlZShxY21kKTsKLQl9Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIGluIGludGVycnVwdCBjb250ZXh0LgotICovCi0KLXN0YXRpYyB2b2lkIG1zbV92ZmVfc3luYyhzdHJ1Y3QgbXNtX3ZmZV9yZXNwICp2ZGF0YSwKLQkJZW51bSBtc21fcXVldWUgcXR5cGUsIHZvaWQgKnN5bmNkYXRhLAotCQlnZnBfdCBnZnApCi17Ci0Jc3RydWN0IG1zbV9xdWV1ZV9jbWQgKnFjbWQgPSBOVUxMOwotCXN0cnVjdCBtc21fc3luYyAqc3luYyA9IChzdHJ1Y3QgbXNtX3N5bmMgKilzeW5jZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFzeW5jKSB7Ci0JCXByX2VycigiJXM6IG5vIGNvbnRleHQgaW4gZHNwIGNhbGxiYWNrLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JcWNtZCA9ICgoc3RydWN0IG1zbV9xdWV1ZV9jbWQgKil2ZGF0YSkgLSAxOwotCXFjbWQtPnR5cGUgPSBxdHlwZTsKLQlxY21kLT5jb21tYW5kID0gdmRhdGE7Ci0KLQlrdGltZV9nZXRfdHMoJihxY21kLT50cykpOwotCi0JaWYgKHF0eXBlICE9IE1TTV9DQU1fUV9WRkVfTVNHKQotCQlnb3RvIHZmZV9mb3JfY29uZmlnOwotCi0JQ0RCRygiJXM6IHZkYXRhLT50eXBlICVkXG4iLCBfX2Z1bmNfXywgdmRhdGEtPnR5cGUpOwotCi0Jc3dpdGNoICh2ZGF0YS0+dHlwZSkgewotCWNhc2UgVkZFX01TR19PVVRQVVRfUDoKLQkJaWYgKHN5bmMtPnBwX21hc2sgJiBQUF9QUkVWKSB7Ci0JCQlDREJHKCIlczogUFBfUFJFViBpbiBwcm9ncmVzczogcDBfYWRkICV4IHAxX2FkZCAleFxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQl2ZGF0YS0+cGh5LnAwX3BoeSwKLQkJCQl2ZGF0YS0+cGh5LnAxX3BoeSk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHBfcHJldl9zcGlubG9jaywgZmxhZ3MpOwotCQkJaWYgKHN5bmMtPnBwX3ByZXYpCi0JCQkJQ0RCRygiJXM6IG92ZXJ3cml0aW5nIHBwX3ByZXYhXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQlDREJHKCIlczogc2VuZGluZyBwcmV2aWV3IHRvIGNvbmZpZ1xuIiwgX19mdW5jX18pOwotCQkJc3luYy0+cHBfcHJldiA9IHFjbWQ7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcF9wcmV2X3NwaW5sb2NrLCBmbGFncyk7Ci0JCQlzeW5jLT5wcF9mcmFtZV9hdmFpbCA9IDE7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJnFjbWQtPm9uX2hlYXApKQotCQkJCWF0b21pY19hZGQoMSwgJnFjbWQtPm9uX2hlYXApOwotCQkJYnJlYWs7Ci0JCX0KLQkJQ0RCRygiJXM6IG1zbV9lbnF1ZXVlIGZyYW1lX3FcbiIsIF9fZnVuY19fKTsKLQkJaWYgKHN5bmMtPnN0ZXJlb2NhbV9lbmFibGVkKQotCQkJQ0RCRygiJXM6IEVucXVldWUgVkZFX01TR19PVVRQVVRfUCB0byBldmVudF9xIGZvciAiCi0JCQkJInN0ZXJlbyBwcm9jZXNzaW5nXG4iLCBfX2Z1bmNfXyk7Ci0JCWVsc2UgewotCQkJaWYgKHN5bmMtPmZyYW1lX3EubGVuIDw9IDEwMCAmJgotCQkJCXN5bmMtPmV2ZW50X3EubGVuIDw9IDEwMCkgewotCQkJCWlmIChhdG9taWNfcmVhZCgmcWNtZC0+b25faGVhcCkpCi0JCQkJCWF0b21pY19hZGQoMSwgJnFjbWQtPm9uX2hlYXApOwotCQkJCW1zbV9lbnF1ZXVlKCZzeW5jLT5mcmFtZV9xLCAmcWNtZC0+bGlzdF9mcmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCXByX2VycigiJXMsIEVycm9yIFF1ZXVlIGxpbWl0IGV4Y2VlZGVkICIKLQkJCQkJImZfcSA9ICVkLCBlX3EgPSAlZFxuIiwJX19mdW5jX18sCi0JCQkJCXN5bmMtPmZyYW1lX3EubGVuLCBzeW5jLT5ldmVudF9xLmxlbik7Ci0JCQkJZnJlZV9xY21kKHFjbWQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCWNhc2UgVkZFX01TR19PVVRQVVRfVDoKLQkJaWYgKHN5bmMtPnN0ZXJlb2NhbV9lbmFibGVkKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHBfc3RlcmVvY2FtX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQkJCS8qIGlmIG91dDEvMiBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MsIHNhdmUgdGhlIHFjbWQKLQkJCWFuZCBpc3N1ZSBvbmx5IGlvbmNlIHRoZSAxc3Qgb25lIGNvbXBsZXRlcyB0aGUgM0QKLQkJCXBpcGVsaW5lICovCi0JCQlpZiAoU1RFUkVPX1NOQVBfQlVGRkVSMV9QUk9DRVNTSU5HID09Ci0JCQkJc3luYy0+c3RlcmVvX3N0YXRlKSB7Ci0JCQkJc3luYy0+cHBfc3RlcmVvY2FtMiA9IHFjbWQ7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHBfc3RlcmVvY2FtX3NwaW5sb2NrLAotCQkJCQlmbGFncyk7Ci0JCQkJaWYgKGF0b21pY19yZWFkKCZxY21kLT5vbl9oZWFwKSkKLQkJCQkJYXRvbWljX2FkZCgxLCAmcWNtZC0+b25faGVhcCk7Ci0JCQkJQ0RCRygiJXM6IHNuYXBzaG90IHN0ZXJlbyBpbiBwcm9ncmVzc1xuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKHN5bmMtPnBwX3N0ZXJlb2NhbSkKLQkJCQlDREJHKCIlczogb3ZlcndyaXRpbmcgcHBfc3RlcmVvY2FtIVxuIiwKLQkJCQkJX19mdW5jX18pOwotCi0JCQlDREJHKCIlczogc2VuZGluZyBzdGVyZW8gZnJhbWUgdG8gY29uZmlnXG4iLCBfX2Z1bmNfXyk7Ci0JCQlzeW5jLT5wcF9zdGVyZW9jYW0gPSBxY21kOwotCQkJc3luYy0+c3RlcmVvX3N0YXRlID0KLQkJCQlTVEVSRU9fU05BUF9CVUZGRVIxX1BST0NFU1NJTkc7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwX3N0ZXJlb2NhbV9zcGlubG9jaywgZmxhZ3MpOwotCi0JCQkvKiBJbmNyZWFtZW50IG9uX2hlYXAgYnkgb25lIGJlY2F1c2UgdGhlIHNhbWUgcWNtZCB3aWxsCi0JCQliZSB1c2VkIGZvciBWUEUgaW4gbXNtX3BwX3JlbGVhc2UuICovCi0JCQlpZiAoYXRvbWljX3JlYWQoJnFjbWQtPm9uX2hlYXApKQotCQkJCWF0b21pY19hZGQoMSwgJnFjbWQtPm9uX2hlYXApOwotCQkJQ0RCRygiJXM6IEVucXVldWUgVkZFX01TR19PVVRQVVRfVCB0byBldmVudF9xIGZvciAiCi0JCQkJInN0ZXJlbyBwcm9jZXNzaW5nLlxuIiwgX19mdW5jX18pOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHN5bmMtPnBwX21hc2sgJiBQUF9TTkFQKSB7Ci0JCQlDREJHKCIlczogcHAgc2VuZGluZyB0aHVtYm5haWwgdG8gY29uZmlnXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJfSBlbHNlIHsKLQkJCW1zbV9lbnF1ZXVlKCZzeW5jLT5waWN0X3EsICZxY21kLT5saXN0X3BpY3QpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQljYXNlIFZGRV9NU0dfT1VUUFVUX1M6Ci0JCWlmIChzeW5jLT5zdGVyZW9jYW1fZW5hYmxlZCAmJgotCQkJc3luYy0+c3RlcmVvX3N0YXRlICE9IFNURVJFT19SQVdfU05BUF9TVEFSVEVEKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHBfc3RlcmVvY2FtX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQkJCS8qIGlmIG91dDEvMiBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MsIHNhdmUgdGhlIHFjbWQKLQkJCWFuZCBpc3N1ZSBvbmx5IG9uY2UgdGhlIDFzdCBvbmUgY29tcGxldGVzIHRoZSAzRAotCQkJcGlwZWxpbmUgKi8KLQkJCWlmIChTVEVSRU9fU05BUF9CVUZGRVIxX1BST0NFU1NJTkcgPT0KLQkJCQlzeW5jLT5zdGVyZW9fc3RhdGUpIHsKLQkJCQlzeW5jLT5wcF9zdGVyZW9jYW0yID0gcWNtZDsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcF9zdGVyZW9jYW1fc3BpbmxvY2ssCi0JCQkJCWZsYWdzKTsKLQkJCQlpZiAoYXRvbWljX3JlYWQoJnFjbWQtPm9uX2hlYXApKQotCQkJCQlhdG9taWNfYWRkKDEsICZxY21kLT5vbl9oZWFwKTsKLQkJCQlDREJHKCIlczogc25hcHNob3Qgc3RlcmVvIGluIHByb2dyZXNzXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKHN5bmMtPnBwX3N0ZXJlb2NhbSkKLQkJCQlDREJHKCIlczogb3ZlcndyaXRpbmcgcHBfc3RlcmVvY2FtIVxuIiwKLQkJCQkJX19mdW5jX18pOwotCi0JCQlDREJHKCIlczogc2VuZGluZyBzdGVyZW8gZnJhbWUgdG8gY29uZmlnXG4iLCBfX2Z1bmNfXyk7Ci0JCQlzeW5jLT5wcF9zdGVyZW9jYW0gPSBxY21kOwotCQkJc3luYy0+c3RlcmVvX3N0YXRlID0KLQkJCQlTVEVSRU9fU05BUF9CVUZGRVIxX1BST0NFU1NJTkc7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwX3N0ZXJlb2NhbV9zcGlubG9jaywgZmxhZ3MpOwotCi0JCQkvKiBJbmNyZWFtZW50IG9uX2hlYXAgYnkgb25lIGJlY2F1c2UgdGhlIHNhbWUgcWNtZCB3aWxsCi0JCQliZSB1c2VkIGZvciBWUEUgaW4gbXNtX3BwX3JlbGVhc2UuICovCi0JCQlpZiAoYXRvbWljX3JlYWQoJnFjbWQtPm9uX2hlYXApKQotCQkJCWF0b21pY19hZGQoMSwgJnFjbWQtPm9uX2hlYXApOwotCQkJQ0RCRygiJXM6IEVucXVldWUgVkZFX01TR19PVVRQVVRfUyB0byBldmVudF9xIGZvciAiCi0JCQkJInN0ZXJlbyBwcm9jZXNzaW5nLlxuIiwgX19mdW5jX18pOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHN5bmMtPnBwX21hc2sgJiBQUF9TTkFQKSB7Ci0JCQlDREJHKCIlczogcHAgc2VuZGluZyBtYWluIGltYWdlIHRvIGNvbmZpZ1xuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCX0gZWxzZSB7Ci0JCQlDREJHKCIlczogZW5xdWV1ZSB0byBwaWN0dXJlIHF1ZXVlXG4iLCBfX2Z1bmNfXyk7Ci0JCQltc21fZW5xdWV1ZSgmc3luYy0+cGljdF9xLCAmcWNtZC0+bGlzdF9waWN0KTsKLQkJCXJldHVybjsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVkZFX01TR19PVVRQVVRfVjoKLQkJaWYgKHN5bmMtPnN0ZXJlb2NhbV9lbmFibGVkKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHBfc3RlcmVvY2FtX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmIChzeW5jLT5wcF9zdGVyZW9jYW0pCi0JCQkJQ0RCRygiJXM6IG92ZXJ3cml0aW5nIHBwX3N0ZXJlb2NhbSFcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQotCQkJQ0RCRygiJXM6IHNlbmRpbmcgc3RlcmVvIGZyYW1lIHRvIGNvbmZpZ1xuIiwgX19mdW5jX18pOwotCQkJc3luYy0+cHBfc3RlcmVvY2FtID0gcWNtZDsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHBfc3RlcmVvY2FtX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQkJCS8qIEluY3JlYW1lbnQgb25faGVhcCBieSBvbmUgYmVjYXVzZSB0aGUgc2FtZSBxY21kIHdpbGwKLQkJCWJlIHVzZWQgZm9yIFZQRSBpbiBtc21fcHBfcmVsZWFzZS4gKi8KLQkJCWlmIChhdG9taWNfcmVhZCgmcWNtZC0+b25faGVhcCkpCi0JCQkJYXRvbWljX2FkZCgxLCAmcWNtZC0+b25faGVhcCk7Ci0JCQlDREJHKCIlczogRW5xdWV1ZSBWRkVfTVNHX09VVFBVVF9WIHRvIGV2ZW50X3EgZm9yICIKLQkJCQkic3RlcmVvIHByb2Nlc3NpbmcuXG4iLCBfX2Z1bmNfXyk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoc3luYy0+dnBlZm4udnBlX2NmZ191cGRhdGUpIHsKLQkJCUNEQkcoImRpc19lbiA9ICVkXG4iLCAqc3luYy0+dnBlZm4uZGlzKTsKLQkJCWlmICgqKHN5bmMtPnZwZWZuLmRpcykpIHsKLQkJCQltZW1zZXQoJih2ZGF0YS0+dnBlX2JmKSwgMCwKLQkJCQkJc2l6ZW9mKHZkYXRhLT52cGVfYmYpKTsKLQotCQkJCWlmIChzeW5jLT5jcm9waW5mbyAhPSBOVUxMKQotCQkJCQl2ZGF0YS0+dnBlX2JmLnZwZV9jcm9wID0KLQkJCQkqKHN0cnVjdCB2aWRlb19jcm9wX3QgKikoc3luYy0+Y3JvcGluZm8pOwotCi0JCQkJdmRhdGEtPnZwZV9iZi5wMF9waHkgPSB2ZGF0YS0+cGh5LnAwX3BoeTsKLQkJCQl2ZGF0YS0+dnBlX2JmLnAxX3BoeSA9IHZkYXRhLT5waHkucDFfcGh5OwotCQkJCXZkYXRhLT52cGVfYmYudHMgPSAocWNtZC0+dHMpOwotCQkJCXZkYXRhLT52cGVfYmYuZnJhbWVfaWQgPSB2ZGF0YS0+cGh5LmZyYW1lX2lkOwotCQkJCXFjbWQtPmNvbW1hbmQgPSB2ZGF0YTsKLQkJCQltc21fZW5xdWV1ZV92cGUoJnN5bmMtPnZwZV9xLAotCQkJCQkmcWNtZC0+bGlzdF92cGVfZnJhbWUpOwotCQkJCXJldHVybjsKLQkJCX0gZWxzZSBpZiAoc3luYy0+dnBlZm4udnBlX2NmZ191cGRhdGUoc3luYy0+Y3JvcGluZm8pKSB7Ci0JCQkJQ0RCRygiJXM6IG1zbV9lbnF1ZXVlIHZpZGVvIGZyYW1lIHRvIHZwZSB0aW1lICIKLQkJCQkJIj0gJWxkXG4iLCBfX2Z1bmNfXywgcWNtZC0+dHMudHZfbnNlYyk7Ci0KLQkJCQlzeW5jLT52cGVmbi5zZW5kX2ZyYW1lX3RvX3ZwZSgKLQkJCQkJdmRhdGEtPnBoeS5wMF9waHksCi0JCQkJCXZkYXRhLT5waHkucDFfcGh5LAotCQkJCQkmKHFjbWQtPnRzKSwgT1VUUFVUX1RZUEVfVik7Ci0KLQkJCQlmcmVlX3FjbWQocWNtZCk7Ci0JCQkJcmV0dXJuOwotCQkJfSBlbHNlIHsKLQkJCQlDREJHKCIlczogbXNtX2VucXVldWUgdmlkZW8gZnJhbWVfcVxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCWlmIChzeW5jLT5saXZlc2hvdF9lbmFibGVkKSB7Ci0JCQkJCUNEQkcoIiVzOiBtc21fZW5xdWV1ZSBsaXZlc2hvdFxuIiwKLQkJCQkJCV9fZnVuY19fKTsKLQkJCQkJdmRhdGEtPnBoeS5vdXRwdXRfaWQgfD0gT1VUUFVUX1RZUEVfTDsKLQkJCQkJc3luYy0+bGl2ZXNob3RfZW5hYmxlZCA9IGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoc3luYy0+ZnJhbWVfcS5sZW4gPD0gMTAwICYmCi0JCQkJCXN5bmMtPmV2ZW50X3EubGVuIDw9IDEwMCkgewotCQkJCQkJbXNtX2VucXVldWUoJnN5bmMtPmZyYW1lX3EsCi0JCQkJCQkJJnFjbWQtPmxpc3RfZnJhbWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByX2VycigiJXMsIEVycm9yIFF1ZXVlIGxpbWl0IGV4Y2VlZGVkXAotCQkJCQkJZl9xID0gJWQsIGVfcSA9ICVkXG4iLAotCQkJCQkJX19mdW5jX18sIHN5bmMtPmZyYW1lX3EubGVuLAotCQkJCQkJc3luYy0+ZXZlbnRfcS5sZW4pOwotCQkJCQlmcmVlX3FjbWQocWNtZCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGVsc2UgewotCQkJQ0RCRygiJXM6IG1zbV9lbnF1ZXVlIHZpZGVvIGZyYW1lX3FcbiIsCV9fZnVuY19fKTsKLQkJCWlmIChzeW5jLT5mcmFtZV9xLmxlbiA8PSAxMDAgJiYKLQkJCQlzeW5jLT5ldmVudF9xLmxlbiA8PSAxMDApIHsKLQkJCQltc21fZW5xdWV1ZSgmc3luYy0+ZnJhbWVfcSwgJnFjbWQtPmxpc3RfZnJhbWUpOwotCQkJfSBlbHNlIHsKLQkJCQlwcl9lcnIoIiVzLCBFcnJvciBRdWV1ZSBsaW1pdCBleGNlZWRlZFwKLQkJCQkJZl9xID0gJWQsIGVfcSA9ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgc3luYy0+ZnJhbWVfcS5sZW4sCi0JCQkJCXN5bmMtPmV2ZW50X3EubGVuKTsKLQkJCQlmcmVlX3FjbWQocWNtZCk7Ci0JCQl9Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JY2FzZSBWRkVfTVNHX1NOQVBTSE9UOgotCQlpZiAoc3luYy0+cHBfbWFzayAmIChQUF9TTkFQIHwgUFBfUkFXX1NOQVApKSB7Ci0JCQlDREJHKCIlczogUFBfU05BUCBpbiBwcm9ncmVzczogcHBfbWFzayAleFxuIiwKLQkJCQlfX2Z1bmNfXywgc3luYy0+cHBfbWFzayk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJnFjbWQtPm9uX2hlYXApKQotCQkJCWF0b21pY19hZGQoMSwgJnFjbWQtPm9uX2hlYXApOwotCQkJQ0RCRygiJXM6IFZGRV9NU0dfU05BUFNIT1Qgc3RvcmVcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJaWYgKHN5bmMtPnN0ZXJlb2NhbV9lbmFibGVkICYmCi0JCQkJc3luYy0+c3RlcmVvX3N0YXRlICE9IFNURVJFT19SQVdfU05BUF9TVEFSVEVEKSB7Ci0JCQkJc3luYy0+cHBfc3RlcmVvc25hcCA9IHFjbWQ7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfTVNHX0NPTU1PTjoKLQkJQ0RCRygiJXM6IHF0eXBlICVkLCBjb21wIHN0YXRzLCBlbnF1ZXVlIGV2ZW50X3EuXG4iLAotCQkJX19mdW5jX18sIHZkYXRhLT50eXBlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9NU0dfR0VORVJBTDoKLQkJQ0RCRygiJXM6IHF0eXBlICVkLCBnZW5lcmFsIG1zZywgZW5xdWV1ZSBldmVudF9xLlxuIiwKLQkJCV9fZnVuY19fLCB2ZGF0YS0+dHlwZSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJQ0RCRygiJXM6IHF0eXBlICVkIG5vdCBoYW5kbGVkXG4iLCBfX2Z1bmNfXywgdmRhdGEtPnR5cGUpOwotCQkvKiBmYWxsIHRocm91Z2gsIHNlbmQgdG8gY29uZmlnLiAqLwotCX0KLQotdmZlX2Zvcl9jb25maWc6Ci0JQ0RCRygiJXM6IG1zbV9lbnF1ZXVlIGV2ZW50X3FcbiIsIF9fZnVuY19fKTsKLQlpZiAoc3luYy0+ZnJhbWVfcS5sZW4gPD0gMTAwICYmIHN5bmMtPmV2ZW50X3EubGVuIDw9IDEwMCkgewotCQltc21fZW5xdWV1ZSgmc3luYy0+ZXZlbnRfcSwgJnFjbWQtPmxpc3RfY29uZmlnKTsKLQl9IGVsc2UgaWYgKHN5bmMtPmV2ZW50X3EubGVuID4gMTAwKSB7Ci0JCXByX2VycigiJXMsIEVycm9yIEV2ZW50IFF1ZXVlIGxpbWl0IGV4Y2VlZGVkIGZfcSA9ICVkLCBlX3EgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBzeW5jLT5mcmFtZV9xLmxlbiwgc3luYy0+ZXZlbnRfcS5sZW4pOwotCQlxY21kLT5lcnJvcl9jb2RlID0gMHhmZmZmZmZmZjsKLQkJcWNtZC0+Y29tbWFuZCA9IE5VTEw7Ci0JCW1zbV9lbnF1ZXVlKCZzeW5jLT5mcmFtZV9xLCAmcWNtZC0+bGlzdF9mcmFtZSk7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlcywgRXJyb3IgUXVldWUgbGltaXQgZXhjZWVkZWQgZl9xID0gJWQsIGVfcSA9ICVkXG4iLAotCQkJX19mdW5jX18sIHN5bmMtPmZyYW1lX3EubGVuLCBzeW5jLT5ldmVudF9xLmxlbik7Ci0JCWZyZWVfcWNtZChxY21kKTsKLQl9Ci0KLX0KLQotc3RhdGljIHZvaWQgbXNtX3ZwZV9zeW5jKHN0cnVjdCBtc21fdnBlX3Jlc3AgKnZkYXRhLAotCWVudW0gbXNtX3F1ZXVlIHF0eXBlLCB2b2lkICpzeW5jZGF0YSwgdm9pZCAqdHMsIGdmcF90IGdmcCkKLXsKLQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqcWNtZCA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXN0cnVjdCBtc21fc3luYyAqc3luYyA9IChzdHJ1Y3QgbXNtX3N5bmMgKilzeW5jZGF0YTsKLQlpZiAoIXN5bmMpIHsKLQkJcHJfZXJyKCIlczogbm8gY29udGV4dCBpbiBkc3AgY2FsbGJhY2suXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlxY21kID0gKChzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqKXZkYXRhKSAtIDE7Ci0JcWNtZC0+dHlwZSA9IHF0eXBlOwotCXFjbWQtPmNvbW1hbmQgPSB2ZGF0YTsKLQlxY21kLT50cyA9ICooKHN0cnVjdCB0aW1lc3BlYyAqKXRzKTsKLQotCWlmIChxdHlwZSAhPSBNU01fQ0FNX1FfVlBFX01TRykgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHFjbWQgdHlwZSA9ICVkLlxuIiwgX19mdW5jX18sIHFjbWQtPnR5cGUpOwotCQlmcmVlX3FjbWQocWNtZCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlDREJHKCIlczogdmRhdGEtPnR5cGUgJWRcbiIsIF9fZnVuY19fLCB2ZGF0YS0+dHlwZSk7Ci0Jc3dpdGNoICh2ZGF0YS0+dHlwZSkgewotCWNhc2UgVlBFX01TR19PVVRQVVRfVjoKLQkJaWYgKHN5bmMtPmxpdmVzaG90X2VuYWJsZWQpIHsKLQkJCUNEQkcoIiVzOiBtc21fZW5xdWV1ZSBsaXZlc2hvdCAlZFxuIiwgX19mdW5jX18sCi0JCQkJc3luYy0+bGl2ZXNob3RfZW5hYmxlZCk7Ci0JCQl2ZGF0YS0+cGh5Lm91dHB1dF9pZCB8PSBPVVRQVVRfVFlQRV9MOwotCQkJc3luYy0+bGl2ZXNob3RfZW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JCXZkYXRhLT5waHkucDJfcGh5ID0gdmRhdGEtPnBoeS5wMF9waHk7Ci0JCWlmIChzeW5jLT5mcmFtZV9xLmxlbiA8PSAxMDAgJiYgc3luYy0+ZXZlbnRfcS5sZW4gPD0gMTAwKSB7Ci0JCQlDREJHKCIlczogZW5xdWV1ZSB0byBmcmFtZV9xIGZyb20gVlBFXG4iLCBfX2Z1bmNfXyk7Ci0JCQltc21fZW5xdWV1ZSgmc3luYy0+ZnJhbWVfcSwgJnFjbWQtPmxpc3RfZnJhbWUpOwotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlcywgRXJyb3IgUXVldWUgbGltaXQgZXhjZWVkZWQgZl9xID0gJWQsICIKLQkJCQkiZV9xID0gJWRcbiIsIF9fZnVuY19fLCBzeW5jLT5mcmFtZV9xLmxlbiwKLQkJCQlzeW5jLT5ldmVudF9xLmxlbik7Ci0JCQlmcmVlX3FjbWQocWNtZCk7Ci0JCX0KLQkJcmV0dXJuOwotCi0JY2FzZSBWUEVfTVNHX09VVFBVVF9TVF9MOgotCQlDREJHKCIlczogZW5xdWV1ZSBsZWZ0IGZyYW1lIGRvbmUgbXNnIHRvIGV2ZW50X3EgZnJvbSBWUEVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCW1zbV9lbnF1ZXVlKCZzeW5jLT5ldmVudF9xLCAmcWNtZC0+bGlzdF9jb25maWcpOwotCQlyZXR1cm47Ci0KLQljYXNlIFZQRV9NU0dfT1VUUFVUX1NUX1I6Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcF9zdGVyZW9jYW1fc3BpbmxvY2ssIGZsYWdzKTsKLQkJQ0RCRygiJXM6IHJlY2VpdmVkIFZQRV9NU0dfT1VUUFVUX1NUX1Igc3RhdGUgJWRcbiIsIF9fZnVuY19fLAotCQkJc3luYy0+c3RlcmVvX3N0YXRlKTsKLQotCQlpZiAoU1RFUkVPX1NOQVBfQlVGRkVSMV9QUk9DRVNTSU5HID09IHN5bmMtPnN0ZXJlb19zdGF0ZSkgewotCQkJbXNtX2VucXVldWUoJnN5bmMtPnBpY3RfcSwgJnFjbWQtPmxpc3RfcGljdCk7Ci0JCQlxY21kID0gc3luYy0+cHBfc3RlcmVvY2FtMjsKLQkJCXN5bmMtPnBwX3N0ZXJlb2NhbSA9IHN5bmMtPnBwX3N0ZXJlb2NhbTI7Ci0JCQlzeW5jLT5wcF9zdGVyZW9jYW0yID0gTlVMTDsKLQkJCW1zbV9lbnF1ZXVlKCZzeW5jLT5ldmVudF9xLCAmcWNtZC0+bGlzdF9jb25maWcpOwotCQkJc3luYy0+c3RlcmVvX3N0YXRlID0KLQkJCQlTVEVSRU9fU05BUF9CVUZGRVIyX1BST0NFU1NJTkc7Ci0JCX0gZWxzZSBpZiAoU1RFUkVPX1NOQVBfQlVGRkVSMl9QUk9DRVNTSU5HID09Ci0JCQkJc3luYy0+c3RlcmVvX3N0YXRlKSB7Ci0JCQlzeW5jLT5zdGVyZW9fc3RhdGUgPSBTVEVSRU9fU05BUF9JRExFOwotCQkJLyogU2VuZCBzbmFwc2hvdCBET05FICovCi0JCQltc21fZW5xdWV1ZSgmc3luYy0+cGljdF9xLCAmcWNtZC0+bGlzdF9waWN0KTsKLQkJCXFjbWQgPSBzeW5jLT5wcF9zdGVyZW9zbmFwOwotCQkJc3luYy0+cHBfc3RlcmVvc25hcCA9IE5VTEw7Ci0JCQlDREJHKCIlczogc2VuZCBTTkFQU0hPVF9ET05FIG1lc3NhZ2VcbiIsIF9fZnVuY19fKTsKLQkJCW1zbV9lbnF1ZXVlKCZzeW5jLT5ldmVudF9xLCAmcWNtZC0+bGlzdF9jb25maWcpOwotCQl9IGVsc2UgewotCQkJaWYgKGF0b21pY19yZWFkKCZxY21kLT5vbl9oZWFwKSkKLQkJCQlhdG9taWNfYWRkKDEsICZxY21kLT5vbl9oZWFwKTsKLQkJCW1zbV9lbnF1ZXVlKCZzeW5jLT5ldmVudF9xLCAmcWNtZC0+bGlzdF9jb25maWcpOwotCQkJaWYgKHN5bmMtPnN0ZXJlb19zdGF0ZSA9PSBTVEVSRU9fVklERU9fQUNUSVZFKSB7Ci0JCQkJQ0RCRygiJXM6IHN0IGZyYW1lIHRvIGZyYW1lX3EgZnJvbSBWUEVcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQltc21fZW5xdWV1ZSgmc3luYy0+ZnJhbWVfcSwgJnFjbWQtPmxpc3RfZnJhbWUpOwotCQkJfQotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwX3N0ZXJlb2NhbV9zcGlubG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBxdHlwZSAlZCBub3QgaGFuZGxlZFxuIiwgX19mdW5jX18sIHZkYXRhLT50eXBlKTsKLQl9Ci0JcHJfZXJyKCIlczogU2hvdWxkIG5vdCBjb21lIGhlcmUuIEVycm9yLlxuIiwgX19mdW5jX18pOwotfQotCi1zdGF0aWMgc3RydWN0IG1zbV92cGVfY2FsbGJhY2sgbXNtX3ZwZV9zID0gewotCS52cGVfcmVzcCA9IG1zbV92cGVfc3luYywKLQkudnBlX2FsbG9jID0gbXNtX3ZwZV9zeW5jX2FsbG9jLAotCS52cGVfZnJlZSA9IG1zbV92cGVfc3luY19mcmVlLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fdmZlX2NhbGxiYWNrIG1zbV92ZmVfcyA9IHsKLQkudmZlX3Jlc3AgPSBtc21fdmZlX3N5bmMsCi0JLnZmZV9hbGxvYyA9IG1zbV92ZmVfc3luY19hbGxvYywKLQkudmZlX2ZyZWUgPSBtc21fdmZlX3N5bmNfZnJlZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19tc21fb3BlbihzdHJ1Y3QgbXNtX2NhbV9kZXZpY2UgKnBtc20sIGNvbnN0IGNoYXIgKmNvbnN0IGFwcHNfaWQsCi0JCQlpbnQgaXNfY29udHJvbG5vZGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMgPSBwbXNtLT5zeW5jOwotCi0JbXV0ZXhfbG9jaygmc3luYy0+bG9jayk7Ci0JaWYgKHN5bmMtPmFwcHNfaWQgJiYgc3RyY21wKHN5bmMtPmFwcHNfaWQsIGFwcHNfaWQpCi0JCQkJJiYgKCFzdHJjbXAoTVNNX0FQUFNfSURfVjRMMiwgYXBwc19pZCkpKSB7Ci0JCXByX2VycigiJXMoJXMpOiBzZW5zb3IgJXMgaXMgYWxyZWFkeSBvcGVuZWQgZm9yICVzXG4iLAotCQkJX19mdW5jX18sCi0JCQlhcHBzX2lkLAotCQkJc3luYy0+c2RhdGEtPnNlbnNvcl9uYW1lLAotCQkJc3luYy0+YXBwc19pZCk7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIG1zbV9vcGVuX2RvbmU7Ci0JfQotCi0Jc3luYy0+YXBwc19pZCA9IGFwcHNfaWQ7Ci0KLQlpZiAoIXN5bmMtPmNvcmVfcG93ZXJlZF9vbiAmJiAhaXNfY29udHJvbG5vZGUpIHsKLQkJcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KCZzeW5jLT5pZGxlX3BtX3FvcywKLQkJCW1zbV9jcHVpZGxlX2dldF9kZWVwX2lkbGVfbGF0ZW5jeSgpKTsKLQotCQltc21fY2FtdmZlX2ZuX2luaXQoJnN5bmMtPnZmZWZuLCBzeW5jKTsKLQkJaWYgKHN5bmMtPnZmZWZuLnZmZV9pbml0KSB7Ci0JCQlzeW5jLT5wcF9mcmFtZV9hdmFpbCA9IDA7Ci0JCQlzeW5jLT5nZXRfcGljX2Fib3J0ID0gMDsKLQkJCXJjID0gbXNtX2NhbWlvX3NlbnNvcl9jbGtfb24oc3luYy0+cGRldik7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczogc2V0dGluZyBzZW5zb3IgY2xvY2tzIGZhaWxlZDogJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByYyk7Ci0JCQkJZ290byBtc21fb3Blbl9lcnI7Ci0JCQl9Ci0JCQlyYyA9IHN5bmMtPnNjdHJsLnNfaW5pdChzeW5jLT5zZGF0YSk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczogc2Vuc29yIGluaXQgZmFpbGVkOiAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJjKTsKLQkJCQltc21fY2FtaW9fc2Vuc29yX2Nsa19vZmYoc3luYy0+cGRldik7Ci0JCQkJZ290byBtc21fb3Blbl9lcnI7Ci0JCQl9Ci0JCQlyYyA9IHN5bmMtPnZmZWZuLnZmZV9pbml0KCZtc21fdmZlX3MsCi0JCQkJc3luYy0+cGRldik7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczogdmZlX2luaXQgZmFpbGVkIGF0ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJCXN5bmMtPnNjdHJsLnNfcmVsZWFzZSgpOwotCQkJCW1zbV9jYW1pb19zZW5zb3JfY2xrX29mZihzeW5jLT5wZGV2KTsKLQkJCQlnb3RvIG1zbV9vcGVuX2VycjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IG5vIHNlbnNvciBpbml0IGZ1bmNcbiIsIF9fZnVuY19fKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gbXNtX29wZW5fZXJyOwotCQl9Ci0JCW1zbV9jYW12cGVfZm5faW5pdCgmc3luYy0+dnBlZm4sIHN5bmMpOwotCi0JCXNwaW5fbG9ja19pbml0KCZzeW5jLT5hYm9ydF9waWN0X2xvY2spOwotCQlzcGluX2xvY2tfaW5pdCgmcHBfcHJldl9zcGlubG9jayk7Ci0JCXNwaW5fbG9ja19pbml0KCZwcF9zdGVyZW9jYW1fc3BpbmxvY2spOwotCQlzcGluX2xvY2tfaW5pdCgmc3RfZnJhbWVfc3BpbmxvY2spOwotCQlpZiAocmMgPj0gMCkgewotCQkJbXNtX3JlZ2lvbl9pbml0KHN5bmMpOwotCQkJaWYgKHN5bmMtPnZwZWZuLnZwZV9yZWcpCi0JCQkJc3luYy0+dnBlZm4udnBlX3JlZygmbXNtX3ZwZV9zKTsKLQkJCXN5bmMtPnVuYmxvY2tfcG9sbF9mcmFtZSA9IDA7Ci0JCQlzeW5jLT51bmJsb2NrX3BvbGxfcGljX2ZyYW1lID0gMDsKLQkJfQotCQlzeW5jLT5jb3JlX3Bvd2VyZWRfb24gPSAxOwotCX0KLQlzeW5jLT5vcGVuY250Kys7Ci0JY2xpZW50X2Zvcl9pb24gPSBtc21faW9uX2NsaWVudF9jcmVhdGUoLTEsICJjYW1lcmEiKTsKLQotbXNtX29wZW5fZG9uZToKLQltdXRleF91bmxvY2soJnN5bmMtPmxvY2spOwotCXJldHVybiByYzsKLQotbXNtX29wZW5fZXJyOgotCWF0b21pY19zZXQoJnBtc20tPm9wZW5lZCwgMCk7Ci0JbXV0ZXhfdW5sb2NrKCZzeW5jLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX29wZW5fY29tbW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCwKLQkJCWludCBvbmNlLCBpbnQgaXNfY29udHJvbG5vZGUpCi17Ci0JaW50IHJjOwotCXN0cnVjdCBtc21fY2FtX2RldmljZSAqcG1zbSA9Ci0JCWNvbnRhaW5lcl9vZihpbm9kZS0+aV9jZGV2LCBzdHJ1Y3QgbXNtX2NhbV9kZXZpY2UsIGNkZXYpOwotCi0JQ0RCRygiJXM6IG9wZW4gJXNcbiIsIF9fZnVuY19fLCBmaWxlcC0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLm5hbWUpOwotCi0JaWYgKGF0b21pY19jbXB4Y2hnKCZwbXNtLT5vcGVuZWQsIDAsIDEpICYmIG9uY2UpIHsKLQkJcHJfZXJyKCIlczogJXMgaXMgYWxyZWFkeSBvcGVuZWQuXG4iLAotCQkJX19mdW5jX18sCi0JCQlmaWxlcC0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLm5hbWUpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCXJjID0gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZXApOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogbm9uc2Vla2FibGVfb3BlbiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXJjID0gX19tc21fb3BlbihwbXNtLCBNU01fQVBQU19JRF9QUk9QLCBpc19jb250cm9sbm9kZSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCWZpbGVwLT5wcml2YXRlX2RhdGEgPSBwbXNtOwotCUNEQkcoIiVzOiByYyAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX29wZW5fZnJhbWUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwKQotewotCXN0cnVjdCBtc21fY2FtX2RldmljZSAqcG1zbSA9Ci0JCWNvbnRhaW5lcl9vZihpbm9kZS0+aV9jZGV2LCBzdHJ1Y3QgbXNtX2NhbV9kZXZpY2UsIGNkZXYpOwotCW1zbV9xdWV1ZV9kcmFpbigmcG1zbS0+c3luYy0+ZnJhbWVfcSwgbGlzdF9mcmFtZSk7Ci0JcmV0dXJuIG1zbV9vcGVuX2NvbW1vbihpbm9kZSwgZmlsZXAsIDEsIDApOwotfQotCi1zdGF0aWMgaW50IG1zbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCkKLXsKLQlyZXR1cm4gbXNtX29wZW5fY29tbW9uKGlub2RlLCBmaWxlcCwgMSwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX29wZW5fY29udHJvbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCi17Ci0JaW50IHJjOwotCi0Jc3RydWN0IG1zbV9jb250cm9sX2RldmljZSAqY3RybF9wbXNtID0KLQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9jb250cm9sX2RldmljZSksIEdGUF9LRVJORUwpOwotCWlmICghY3RybF9wbXNtKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJjID0gbXNtX29wZW5fY29tbW9uKGlub2RlLCBmaWxlcCwgMCwgMSk7Ci0JaWYgKHJjIDwgMCkgewotCQlrZnJlZShjdHJsX3Btc20pOwotCQlyZXR1cm4gcmM7Ci0JfQotCWN0cmxfcG1zbS0+cG1zbSA9IGZpbGVwLT5wcml2YXRlX2RhdGE7Ci0JZmlsZXAtPnByaXZhdGVfZGF0YSA9IGN0cmxfcG1zbTsKLQotCW1zbV9xdWV1ZV9pbml0KCZjdHJsX3Btc20tPmN0cmxfcSwgImNvbnRyb2wiKTsKLQotCWlmICghZ192NGwyX29wZW5jbnQpCi0JCWdfdjRsMl9jb250cm9sX2RldmljZSA9IGN0cmxfcG1zbTsKLQlnX3Y0bDJfb3BlbmNudCsrOwotCUNEQkcoIiVzOiByYyAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1zbV9mb3BzX2NvbmZpZyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IG1zbV9vcGVuLAotCS51bmxvY2tlZF9pb2N0bCA9IG1zbV9pb2N0bF9jb25maWcsCi0JLnJlbGVhc2UgPSBtc21fcmVsZWFzZV9jb25maWcsCi0JLnBvbGwgPSBtc21fcG9sbF9jb25maWcsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtc21fZm9wc19jb250cm9sID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gbXNtX29wZW5fY29udHJvbCwKLQkudW5sb2NrZWRfaW9jdGwgPSBtc21faW9jdGxfY29udHJvbCwKLQkucmVsZWFzZSA9IG1zbV9yZWxlYXNlX2NvbnRyb2wsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtc21fZm9wc19mcmFtZSA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IG1zbV9vcGVuX2ZyYW1lLAotCS51bmxvY2tlZF9pb2N0bCA9IG1zbV9pb2N0bF9mcmFtZSwKLQkucmVsZWFzZSA9IG1zbV9yZWxlYXNlX2ZyYW1lLAotCS5wb2xsID0gbXNtX3BvbGxfZnJhbWUsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtc21fZm9wc19waWMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSBtc21fb3BlbiwKLQkudW5sb2NrZWRfaW9jdGwgPSBtc21faW9jdGxfcGljLAotCS5yZWxlYXNlID0gbXNtX3JlbGVhc2VfcGljLAotCS5wb2xsID0gbXNtX3BvbGxfcGljLAotfTsKLQotc3RhdGljIGludCBtc21fc2V0dXBfY2RldihzdHJ1Y3QgbXNtX2NhbV9kZXZpY2UgKm1zbSwKLQkJCWludCBub2RlLAotCQkJZGV2X3QgZGV2bm8sCi0JCQljb25zdCBjaGFyICpzdWZmaXgsCi0JCQljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzKQotewotCWludCByYyA9IC1FTk9ERVY7Ci0KLQlzdHJ1Y3QgZGV2aWNlICpkZXZpY2UgPQotCQlkZXZpY2VfY3JlYXRlKG1zbV9jbGFzcywgTlVMTCwKLQkJCWRldm5vLCBOVUxMLAotCQkJIiVzJWQiLCBzdWZmaXgsIG5vZGUpOwotCi0JaWYgKElTX0VSUihkZXZpY2UpKSB7Ci0JCXJjID0gUFRSX0VSUihkZXZpY2UpOwotCQlwcl9lcnIoIiVzOiBlcnJvciBjcmVhdGluZyBkZXZpY2U6ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JY2Rldl9pbml0KCZtc20tPmNkZXYsIGZvcHMpOwotCW1zbS0+Y2Rldi5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JcmMgPSBjZGV2X2FkZCgmbXNtLT5jZGV2LCBkZXZubywgMSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBlcnJvciBhZGRpbmcgY2RldjogJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCWRldmljZV9kZXN0cm95KG1zbV9jbGFzcywgZGV2bm8pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV90ZWFyX2Rvd25fY2RldihzdHJ1Y3QgbXNtX2NhbV9kZXZpY2UgKm1zbSwgZGV2X3QgZGV2bm8pCi17Ci0JY2Rldl9kZWwoJm1zbS0+Y2Rldik7Ci0JZGV2aWNlX2Rlc3Ryb3kobXNtX2NsYXNzLCBkZXZubyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3N5bmNfaW5pdChzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMsCi0JCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCWludCAoKnNlbnNvcl9wcm9iZSkoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKiwKLQkJCQlzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsICopKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9zZW5zb3JfY3RybCBzY3RybDsKLQlzeW5jLT5zZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCi0JbXNtX3F1ZXVlX2luaXQoJnN5bmMtPmV2ZW50X3EsICJldmVudCIpOwotCW1zbV9xdWV1ZV9pbml0KCZzeW5jLT5mcmFtZV9xLCAiZnJhbWUiKTsKLQltc21fcXVldWVfaW5pdCgmc3luYy0+cGljdF9xLCAicGljdCIpOwotCW1zbV9xdWV1ZV9pbml0KCZzeW5jLT52cGVfcSwgInZwZSIpOwotCi0JcG1fcW9zX2FkZF9yZXF1ZXN0KCZzeW5jLT5pZGxlX3BtX3FvcywgUE1fUU9TX0NQVV9ETUFfTEFURU5DWSwKLQkJCQkJICAgUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotCi0JcmMgPSBtc21fY2FtaW9fcHJvYmVfb24ocGRldik7Ci0JaWYgKHJjIDwgMCkgewotCQlwbV9xb3NfcmVtb3ZlX3JlcXVlc3QoJnN5bmMtPmlkbGVfcG1fcW9zKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlyYyA9IHNlbnNvcl9wcm9iZShzeW5jLT5zZGF0YSwgJnNjdHJsKTsKLQlpZiAocmMgPj0gMCkgewotCQlzeW5jLT5wZGV2ID0gcGRldjsKLQkJc3luYy0+c2N0cmwgPSBzY3RybDsKLQl9Ci0JbXNtX2NhbWlvX3Byb2JlX29mZihwZGV2KTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byBpbml0aWFsaXplICVzXG4iLAotCQkJX19mdW5jX18sCi0JCQlzeW5jLT5zZGF0YS0+c2Vuc29yX25hbWUpOwotCQlwbV9xb3NfcmVtb3ZlX3JlcXVlc3QoJnN5bmMtPmlkbGVfcG1fcW9zKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXN5bmMtPm9wZW5jbnQgPSAwOwotCXN5bmMtPmNvcmVfcG93ZXJlZF9vbiA9IDA7Ci0Jc3luYy0+aWdub3JlX3FjbWQgPSBmYWxzZTsKLQlzeW5jLT5pZ25vcmVfcWNtZF90eXBlID0gLTE7Ci0JbXV0ZXhfaW5pdCgmc3luYy0+bG9jayk7Ci0JaWYgKHN5bmMtPnNkYXRhLT5zdHJvYmVfZmxhc2hfZGF0YSkgewotCQlzeW5jLT5zZGF0YS0+c3Ryb2JlX2ZsYXNoX2RhdGEtPnN0YXRlID0gMDsKLQkJc3Bpbl9sb2NrX2luaXQoJnN5bmMtPnNkYXRhLT5zdHJvYmVfZmxhc2hfZGF0YS0+c3Bpbl9sb2NrKTsKLQl9Ci0JQ0RCRygiJXM6IGluaXRpYWxpemVkICVzXG4iLCBfX2Z1bmNfXywgc3luYy0+c2RhdGEtPnNlbnNvcl9uYW1lKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3N5bmNfZGVzdHJveShzdHJ1Y3QgbXNtX3N5bmMgKnN5bmMpCi17Ci0JcG1fcW9zX3JlbW92ZV9yZXF1ZXN0KCZzeW5jLT5pZGxlX3BtX3Fvcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RldmljZV9pbml0KHN0cnVjdCBtc21fY2FtX2RldmljZSAqcG1zbSwKLQkJc3RydWN0IG1zbV9zeW5jICpzeW5jLAotCQlpbnQgbm9kZSkKLXsKLQlpbnQgZGV2X251bSA9IDQgKiBub2RlOwotCWludCByYyA9IG1zbV9zZXR1cF9jZGV2KHBtc20sIG5vZGUsCi0JCU1LREVWKE1BSk9SKG1zbV9kZXZubyksIGRldl9udW0pLAotCQkiY29udHJvbCIsICZtc21fZm9wc19jb250cm9sKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IGVycm9yIGNyZWF0aW5nIGNvbnRyb2wgbm9kZTogJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IG1zbV9zZXR1cF9jZGV2KHBtc20gKyAxLCBub2RlLAotCQlNS0RFVihNQUpPUihtc21fZGV2bm8pLCBkZXZfbnVtICsgMSksCi0JCSJjb25maWciLCAmbXNtX2ZvcHNfY29uZmlnKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IGVycm9yIGNyZWF0aW5nIGNvbmZpZyBub2RlOiAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJbXNtX3RlYXJfZG93bl9jZGV2KHBtc20sIE1LREVWKE1BSk9SKG1zbV9kZXZubyksCi0JCQkJZGV2X251bSkpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBtc21fc2V0dXBfY2RldihwbXNtICsgMiwgbm9kZSwKLQkJTUtERVYoTUFKT1IobXNtX2Rldm5vKSwgZGV2X251bSArIDIpLAotCQkiZnJhbWUiLCAmbXNtX2ZvcHNfZnJhbWUpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogZXJyb3IgY3JlYXRpbmcgZnJhbWUgbm9kZTogJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCW1zbV90ZWFyX2Rvd25fY2RldihwbXNtLAotCQkJTUtERVYoTUFKT1IobXNtX2Rldm5vKSwgZGV2X251bSkpOwotCQltc21fdGVhcl9kb3duX2NkZXYocG1zbSArIDEsCi0JCQlNS0RFVihNQUpPUihtc21fZGV2bm8pLCBkZXZfbnVtICsgMSkpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBtc21fc2V0dXBfY2RldihwbXNtICsgMywgbm9kZSwKLQkJTUtERVYoTUFKT1IobXNtX2Rldm5vKSwgZGV2X251bSArIDMpLAotCQkicGljIiwgJm1zbV9mb3BzX3BpYyk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBlcnJvciBjcmVhdGluZyBwaWMgbm9kZTogJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCW1zbV90ZWFyX2Rvd25fY2RldihwbXNtLAotCQkJTUtERVYoTUFKT1IobXNtX2Rldm5vKSwgZGV2X251bSkpOwotCQltc21fdGVhcl9kb3duX2NkZXYocG1zbSArIDEsCi0JCQlNS0RFVihNQUpPUihtc21fZGV2bm8pLCBkZXZfbnVtICsgMSkpOwotCQltc21fdGVhcl9kb3duX2NkZXYocG1zbSArIDIsCi0JCQlNS0RFVihNQUpPUihtc21fZGV2bm8pLCBkZXZfbnVtICsgMikpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0KLQlhdG9taWNfc2V0KCZwbXNtWzBdLm9wZW5lZCwgMCk7Ci0JYXRvbWljX3NldCgmcG1zbVsxXS5vcGVuZWQsIDApOwotCWF0b21pY19zZXQoJnBtc21bMl0ub3BlbmVkLCAwKTsKLQlhdG9taWNfc2V0KCZwbXNtWzNdLm9wZW5lZCwgMCk7Ci0KLQlwbXNtWzBdLnN5bmMgPSBzeW5jOwotCXBtc21bMV0uc3luYyA9IHN5bmM7Ci0JcG1zbVsyXS5zeW5jID0gc3luYzsKLQlwbXNtWzNdLnN5bmMgPSBzeW5jOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2NhbWVyYV9kcnZfc3RhcnQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LAotCQlpbnQgKCpzZW5zb3JfcHJvYmUpKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICosCi0JCQlzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsICopKQotewotCXN0cnVjdCBtc21fY2FtX2RldmljZSAqcG1zbSA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9zeW5jICpzeW5jOwotCWludCByYyA9IC1FTk9ERVY7Ci0KLQlpZiAoY2FtZXJhX25vZGUgPj0gTVNNX01BWF9DQU1FUkFfU0VOU09SUykgewotCQlwcl9lcnIoIiVzOiB0b28gbWFueSBjYW1lcmEgc2Vuc29yc1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKCFtc21fY2xhc3MpIHsKLQkJLyogVGhlcmUgYXJlIHRocmVlIGRldmljZSBub2RlcyBwZXIgc2Vuc29yICovCi0JCXJjID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmbXNtX2Rldm5vLCAwLAotCQkJCTQgKiBNU01fTUFYX0NBTUVSQV9TRU5TT1JTLAotCQkJCSJtc21fY2FtZXJhIik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBjaHJkZXY6ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQlyYyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQltc21fY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJtc21fY2FtZXJhIik7Ci0JCWlmIChJU19FUlIobXNtX2NsYXNzKSkgewotCQkJcmMgPSBQVFJfRVJSKG1zbV9jbGFzcyk7Ci0JCQlwcl9lcnIoIiVzOiBjcmVhdGUgZGV2aWNlIGNsYXNzIGZhaWxlZDogJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCXBtc20gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2NhbV9kZXZpY2UpICogNCArCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9zeW5jKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwbXNtKQotCQlyZXR1cm4gLUVOT01FTTsKLQlzeW5jID0gKHN0cnVjdCBtc21fc3luYyAqKShwbXNtICsgNCk7Ci0KLQlyYyA9IG1zbV9zeW5jX2luaXQoc3luYywgZGV2LCBzZW5zb3JfcHJvYmUpOwotCWlmIChyYyA8IDApIHsKLQkJa2ZyZWUocG1zbSk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlDREJHKCIlczogc2V0dGluZyBjYW1lcmEgbm9kZSAlZFxuIiwgX19mdW5jX18sIGNhbWVyYV9ub2RlKTsKLQlyYyA9IG1zbV9kZXZpY2VfaW5pdChwbXNtLCBzeW5jLCBjYW1lcmFfbm9kZSk7Ci0JaWYgKHJjIDwgMCkgewotCQltc21fc3luY19kZXN0cm95KHN5bmMpOwotCQlrZnJlZShwbXNtKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWNhbWVyYV90eXBlW2NhbWVyYV9ub2RlXSA9IHN5bmMtPnNjdHJsLnNfY2FtZXJhX3R5cGU7Ci0Jc2Vuc29yX21vdW50X2FuZ2xlW2NhbWVyYV9ub2RlXSA9IHN5bmMtPnNjdHJsLnNfbW91bnRfYW5nbGU7Ci0JY2FtZXJhX25vZGUrKzsKLQotCWxpc3RfYWRkKCZzeW5jLT5saXN0LCAmbXNtX3NlbnNvcnMpOwotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2NhbWVyYV9kcnZfc3RhcnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV9jYW1pcnFfcm91dGVyLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtX2NhbWlycV9yb3V0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdkZDZjMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtX2NhbWlycV9yb3V0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9pc3AuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+Ci0jaW5jbHVkZSAibXNtLmgiCi0jaW5jbHVkZSAic2VydmVyL21zbV9jYW1fc2VydmVyLmgiCi0jaW5jbHVkZSAibXNtX2NhbWlycV9yb3V0ZXIuaCIKLQotI2lmZGVmIENPTkZJR19NU01fQ0FNRVJBX0RFQlVHCi0jZGVmaW5lIEQoZm10LCBhcmdzLi4uKSBwcl9kZWJ1ZygibXNtOiAiIGZtdCwgIyNhcmdzKQotI2Vsc2UKLSNkZWZpbmUgRChmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIG1zbV9pcnFyb3V0ZXJfdXBkYXRlX2lycW1hcF9lbnRyeSgKLQlzdHJ1Y3QgbXNtX2NhbV9zZXJ2ZXJfaXJxbWFwX2VudHJ5ICplbnRyeSwKLQlpbnQgaXNfY29tcG9zaXRlLCBpbnQgaXJxX2lkeCwgaW50IGNhbV9od19pZHgpCi17Ci0JaW50IHJjID0gMDsKLQllbnRyeS0+aXJxX2lkeCA9IGlycV9pZHg7Ci0JZW50cnktPmlzX2NvbXBvc2l0ZSA9IGlzX2NvbXBvc2l0ZTsKLQllbnRyeS0+Y2FtX2h3X2lkeCA9IGNhbV9od19pZHg7Ci0JcmMgPSBtc21fY2FtX3NlcnZlcl91cGRhdGVfaXJxbWFwKGVudHJ5KTsKLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoIiVzIEVycm9yIHVwZGF0aW5nIGlycSAlZCBpbmZvcm1hdGlvbiAiLAotCQkJX19mdW5jX18sIGlycV9pZHgpOwotfQotCi1zdGF0aWMgdm9pZCBtc21faXJxcm91dGVyX3NlbmRfZGVmYXVsdF9pcnFtYXAoCi0Jc3RydWN0IGlycXJvdXRlcl9jdHJsX3R5cGUgKmlycXJvdXRlcl9jdHJsKQotewotCXN0cnVjdCBtc21fY2FtX3NlcnZlcl9pcnFtYXBfZW50cnkgKmlycW1hcCA9Ci0JCSZpcnFyb3V0ZXJfY3RybC0+ZGVmX2h3X2lycW1hcFswXTsKLQotCW1zbV9pcnFyb3V0ZXJfdXBkYXRlX2lycW1hcF9lbnRyeSgmaXJxbWFwW0NBTUVSQV9TU19JUlFfMF0sCi0JCTAsIENBTUVSQV9TU19JUlFfMCwgTVNNX0NBTV9IV19NSUNSTyk7Ci0KLQltc21faXJxcm91dGVyX3VwZGF0ZV9pcnFtYXBfZW50cnkoJmlycW1hcFtDQU1FUkFfU1NfSVJRXzFdLAotCQkwLCBDQU1FUkFfU1NfSVJRXzEsIE1TTV9DQU1fSFdfQ0NJKTsKLQotCW1zbV9pcnFyb3V0ZXJfdXBkYXRlX2lycW1hcF9lbnRyeSgmaXJxbWFwW0NBTUVSQV9TU19JUlFfMl0sCi0JCTAsIENBTUVSQV9TU19JUlFfMiwgTVNNX0NBTV9IV19DU0kwKTsKLQotCW1zbV9pcnFyb3V0ZXJfdXBkYXRlX2lycW1hcF9lbnRyeSgmaXJxbWFwW0NBTUVSQV9TU19JUlFfM10sCi0JCTAsIENBTUVSQV9TU19JUlFfMywgTVNNX0NBTV9IV19DU0kxKTsKLQotCW1zbV9pcnFyb3V0ZXJfdXBkYXRlX2lycW1hcF9lbnRyeSgmaXJxbWFwW0NBTUVSQV9TU19JUlFfNF0sCi0JCTAsIENBTUVSQV9TU19JUlFfNCwgTVNNX0NBTV9IV19DU0kyKTsKLQotCW1zbV9pcnFyb3V0ZXJfdXBkYXRlX2lycW1hcF9lbnRyeSgmaXJxbWFwW0NBTUVSQV9TU19JUlFfNV0sCi0JCTAsIENBTUVSQV9TU19JUlFfNSwgTVNNX0NBTV9IV19DU0kzKTsKLQotCW1zbV9pcnFyb3V0ZXJfdXBkYXRlX2lycW1hcF9lbnRyeSgmaXJxbWFwW0NBTUVSQV9TU19JUlFfNl0sCi0JCTAsIENBTUVSQV9TU19JUlFfNiwgTVNNX0NBTV9IV19JU1BJRik7Ci0KLQltc21faXJxcm91dGVyX3VwZGF0ZV9pcnFtYXBfZW50cnkoJmlycW1hcFtDQU1FUkFfU1NfSVJRXzddLAotCQkwLCBDQU1FUkFfU1NfSVJRXzcsIE1TTV9DQU1fSFdfQ1BQKTsKLQotCW1zbV9pcnFyb3V0ZXJfdXBkYXRlX2lycW1hcF9lbnRyeSgmaXJxbWFwW0NBTUVSQV9TU19JUlFfOF0sCi0JCTAsIENBTUVSQV9TU19JUlFfOCwgTVNNX0NBTV9IV19WRkUwKTsKLQotCW1zbV9pcnFyb3V0ZXJfdXBkYXRlX2lycW1hcF9lbnRyeSgmaXJxbWFwW0NBTUVSQV9TU19JUlFfOV0sCi0JCTAsIENBTUVSQV9TU19JUlFfOSwgTVNNX0NBTV9IV19WRkUxKTsKLQotCW1zbV9pcnFyb3V0ZXJfdXBkYXRlX2lycW1hcF9lbnRyeSgmaXJxbWFwW0NBTUVSQV9TU19JUlFfMTBdLAotCQkwLCBDQU1FUkFfU1NfSVJRXzEwLCBNU01fQ0FNX0hXX0pQRUcwKTsKLQotCW1zbV9pcnFyb3V0ZXJfdXBkYXRlX2lycW1hcF9lbnRyeSgmaXJxbWFwW0NBTUVSQV9TU19JUlFfMTFdLAotCQkwLCBDQU1FUkFfU1NfSVJRXzExLCBNU01fQ0FNX0hXX0pQRUcxKTsKLQotCW1zbV9pcnFyb3V0ZXJfdXBkYXRlX2lycW1hcF9lbnRyeSgmaXJxbWFwW0NBTUVSQV9TU19JUlFfMTJdLAotCQkwLCBDQU1FUkFfU1NfSVJRXzEyLCBNU01fQ0FNX0hXX0pQRUcyKTsKLX0KLQotc3RhdGljIGludCBtc21faXJxcm91dGVyX29wZW4oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQlzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoKQotewotCXN0cnVjdCBpcnFyb3V0ZXJfY3RybF90eXBlICppcnFyb3V0ZXJfY3RybCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCS8qIE9ubHkgb25lIG9iamVjdCBvZiBJUlEgUm91dGVyIGFsbG93ZWQuICovCi0JaWYgKGF0b21pY19yZWFkKCZpcnFyb3V0ZXJfY3RybC0+YWN0aXZlKSAhPSAwKSB7Ci0JCXByX2VycigiJXMgSVJRIHJvdXRlciBpcyBhbHJlYWR5IG9wZW5lZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlEKCIlcyBFICIsIF9fZnVuY19fKTsKLQlhdG9taWNfaW5jKCZpcnFyb3V0ZXJfY3RybC0+YWN0aXZlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9pcnFyb3V0ZXJfY2xvc2Uoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQlzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoKQotewotCXN0cnVjdCBpcnFyb3V0ZXJfY3RybF90eXBlICppcnFyb3V0ZXJfY3RybCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCWlmIChhdG9taWNfcmVhZCgmaXJxcm91dGVyX2N0cmwtPmFjdGl2ZSkgPT0gMCkgewotCQlwcl9lcnIoIiVzIElSUSByb3V0ZXIgaXMgYWxyZWFkeSBjbG9zZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCUQoIiVzIEUgIiwgX19mdW5jX18pOwotCWF0b21pY19kZWMoJmlycXJvdXRlcl9jdHJsLT5hY3RpdmUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2ludGVybmFsX29wcyBtc21faXJxcm91dGVyX2ludGVybmFsX29wcyA9IHsKLQkub3BlbiA9IG1zbV9pcnFyb3V0ZXJfb3BlbiwKLQkuY2xvc2UgPSBtc21faXJxcm91dGVyX2Nsb3NlLAotfTsKLQotbG9uZyBtc21faXJxcm91dGVyX3N1YmRldl9pb2N0bChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgaXJxcm91dGVyX2N0cmxfdHlwZSAqaXJxcm91dGVyX2N0cmwgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9pcnFfY2ZnICppcnFfY2ZnOwotCXN0cnVjdCBpbnRyX3RhYmxlX2VudHJ5IGlycV9yZXE7Ci0JaW50IHJjID0gMDsKLQotCS8qIEhhbmRsZSBhbGwgSVJRIFJvdXRlciBTdWJkZXYgSU9DVExzIGhlcmUuCi0JICogVXNlcnNwYWNlIHNlbmRzIHRoZSBjb21wb3NpdGUgaXJxIGNvbmZpZ3VyYXRpb24uCi0JICogSVJRIFJvdXRlciBzdWJkZXYgdGhlbiBjb25maWd1cmVzIHRoZSByZWdpc3RlcnMgdG8gZ3JvdXAKLQkgKiB0b2dldGhlciBpbmRpdmlkdWFsIGNvcmUgaHcgaXJxcyBpbnRvIGEgY29tcG9zaXRlIElSUQotCSAqIHRvIHRoZSBNU00gSVJRIGNvbnRyb2xsZXIuIEl0IGFsc28gcmVnaXN0ZXJzIHRoZW0gd2l0aAotCSAqIHRoZSBpcnEgbWFuYWdlciBpbiB0aGUgY2FtZXJhIHNlcnZlci4gKi8KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgTVNNX0lSUVJPVVRFUl9DRkdfQ09NUElSUToKLQkJQ09QWV9GUk9NX1VTRVIocmMsICZpcnFfY2ZnLCAodm9pZCBfX3VzZXIgKilhcmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9jYW1lcmFfaXJxX2NmZykpOwotCQlpZiAocmMpIHsKLQkJCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoIWlycV9jZmcgfHwKLQkJCShpcnFfY2ZnLT5pcnFfaWR4IDwgQ0FNRVJBX1NTX0lSUV8wKSB8fAotCQkJKGlycV9jZmctPmlycV9pZHggPj0gQ0FNRVJBX1NTX0lSUV9NQVgpKSB7Ci0JCQlwcl9lcnIoIiVzIEludmFsaWQgaW5wdXQiLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfSBlbHNlIHsKLQkJCWlycV9yZXEuY2FtX2h3X21hc2sgICAgICA9IGlycV9jZmctPmNhbV9od19tYXNrOwotCQkJaXJxX3JlcS5pcnFfaWR4ICAgICAgICAgID0gaXJxX2NmZy0+aXJxX2lkeDsKLQkJCWlycV9yZXEuaXJxX251bSAgICAgICAgICA9Ci0JCQlpcnFyb3V0ZXJfY3RybC0+ZGVmX2h3X2lycW1hcFtpcnFfY2ZnLT5pcnFfaWR4XS5pcnFfbnVtOwotCQkJaXJxX3JlcS5pc19jb21wb3NpdGUgICAgID0gMTsKLQkJCWlycV9yZXEuaXJxX3RyaWdnZXJfdHlwZSA9IElSUUZfVFJJR0dFUl9SSVNJTkc7Ci0JCQlpcnFfcmVxLm51bV9od2NvcmUgICAgICAgPSBpcnFfY2ZnLT5udW1faHdjb3JlOwotCQkJaXJxX3JlcS5kYXRhICAgICAgICAgICAgID0gTlVMTDsKLQkJCXJjID0gbXNtX2NhbV9zZXJ2ZXJfcmVxdWVzdF9pcnEoJmlycV9yZXEpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXMgRXJyb3IgcmVxdWVzdGluZyBjb21wIGlycSAlZCAiLAotCQkJCQlfX2Z1bmNfXywgaXJxX3JlcS5pcnFfaWR4KTsKLQkJCQlyZXR1cm4gcmM7Ci0JCQl9Ci0JCQlpcnFyb3V0ZXJfY3RybC0+ZGVmX2h3X2lycW1hcAotCQkJCVtpcnFfY2ZnLT5pcnFfaWR4XS5pc19jb21wb3NpdGUgPSAxOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXMgSW52YWxpZCBjbWQgJWQgIiwgX19mdW5jX18sIGNtZCk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBtc21faXJxcm91dGVyX3N1YmRldl9jb3JlX29wcyA9IHsKLQkuaW9jdGwgPSBtc21faXJxcm91dGVyX3N1YmRldl9pb2N0bCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG1zbV9pcnFyb3V0ZXJfc3ViZGV2X29wcyA9IHsKLQkuY29yZSA9ICZtc21faXJxcm91dGVyX3N1YmRldl9jb3JlX29wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGlycXJvdXRlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGlycXJvdXRlcl9jdHJsX3R5cGUgKmlycXJvdXRlcl9jdHJsOwotCXN0cnVjdCBtc21fY2FtX3N1YmRldl9pbmZvIHNkX2luZm87Ci0KLQlEKCIlczogZGV2aWNlIGlkID0gJWRcbiIsIF9fZnVuY19fLCBwZGV2LT5pZCk7Ci0KLQlpcnFyb3V0ZXJfY3RybCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcnFyb3V0ZXJfY3RybF90eXBlKSwKLQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWlycXJvdXRlcl9jdHJsKSB7Ci0JCXByX2VycigiJXM6IG5vdCBlbm91Z2ggbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXY0bDJfc3ViZGV2X2luaXQoJmlycXJvdXRlcl9jdHJsLT5zdWJkZXYsICZtc21faXJxcm91dGVyX3N1YmRldl9vcHMpOwotCWlycXJvdXRlcl9jdHJsLT5zdWJkZXYuaW50ZXJuYWxfb3BzID0gJm1zbV9pcnFyb3V0ZXJfaW50ZXJuYWxfb3BzOwotCWlycXJvdXRlcl9jdHJsLT5zdWJkZXYuZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7Ci0Jc25wcmludGYoaXJxcm91dGVyX2N0cmwtPnN1YmRldi5uYW1lLAotCQkJIHNpemVvZihpcnFyb3V0ZXJfY3RybC0+c3ViZGV2Lm5hbWUpLCAibXNtX2lycXJvdXRlciIpOwotCXY0bDJfc2V0X3N1YmRldmRhdGEoJmlycXJvdXRlcl9jdHJsLT5zdWJkZXYsIGlycXJvdXRlcl9jdHJsKTsKLQlpcnFyb3V0ZXJfY3RybC0+cGRldiA9IHBkZXY7Ci0KLQlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCi0JCW9mX3Byb3BlcnR5X3JlYWRfdTMyKCgmcGRldi0+ZGV2KS0+b2Zfbm9kZSwKLQkJCSJjZWxsLWluZGV4IiwgJnBkZXYtPmlkKTsKLQotCW1zbV9pcnFyb3V0ZXJfc2VuZF9kZWZhdWx0X2lycW1hcChpcnFyb3V0ZXJfY3RybCk7Ci0KLQltZWRpYV9lbnRpdHlfaW5pdCgmaXJxcm91dGVyX2N0cmwtPnN1YmRldi5lbnRpdHksIDAsIE5VTEwsIDApOwotCWlycXJvdXRlcl9jdHJsLT5zdWJkZXYuZW50aXR5LnR5cGUgPSBNRURJQV9FTlRfVF9ERVZOT0RFX1Y0TDsKLQlpcnFyb3V0ZXJfY3RybC0+c3ViZGV2LmVudGl0eS5ncm91cF9pZCA9IElSUV9ST1VURVJfREVWOwotCWlycXJvdXRlcl9jdHJsLT5zdWJkZXYuZW50aXR5Lm5hbWUgPSBwZGV2LT5uYW1lOwotCi0Jc2RfaW5mby5zZGV2X3R5cGUgPSBJUlFfUk9VVEVSX0RFVjsKLQlzZF9pbmZvLnNkX2luZGV4ID0gMDsKLQlzZF9pbmZvLmlycV9udW0gPSAwOwotCS8qIE5vdyByZWdpc3RlciB0aGlzIHN1YmRldiB3aXRoIHRoZSBjYW1lcmEgc2VydmVyLiAqLwotCXJjID0gbXNtX2NhbV9yZWdpc3Rlcl9zdWJkZXZfbm9kZSgmaXJxcm91dGVyX2N0cmwtPnN1YmRldiwgJnNkX2luZm8pOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyBFcnJvciByZWdpc3RlcmluZyBpcnFyIHN1YmRldiAlZCIsIF9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWlycXJvdXRlcl9jdHJsLT5zdWJkZXYuZW50aXR5LnJldmlzaW9uID0KLQkJaXJxcm91dGVyX2N0cmwtPnN1YmRldi5kZXZub2RlLT5udW07Ci0JYXRvbWljX3NldCgmaXJxcm91dGVyX2N0cmwtPmFjdGl2ZSwgMCk7Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCAmaXJxcm91dGVyX2N0cmwtPnN1YmRldik7Ci0KLQlyZXR1cm4gcmM7Ci1lcnJvcjoKLQlrZnJlZShpcnFyb3V0ZXJfY3RybCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fZXhpdCBpcnFyb3V0ZXJfZXhpdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwotCXN0cnVjdCBpcnFyb3V0ZXJfY3RybF90eXBlICppcnFyb3V0ZXJfY3RybCA9Ci0JCXY0bDJfZ2V0X3N1YmRldmRhdGEoc3ViZGV2KTsKLQlrZnJlZShpcnFyb3V0ZXJfY3RybCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9pcnFyb3V0ZXJfZHRfbWF0Y2hbXSA9IHsKLQl7LmNvbXBhdGlibGUgPSAicWNvbSxpcnFyb3V0ZXIifSwKLQl7fQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2lycXJvdXRlcl9kdF9tYXRjaCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9pcnFyb3V0ZXJfZHJpdmVyID0gewotCS5wcm9iZSA9IGlycXJvdXRlcl9wcm9iZSwKLQkucmVtb3ZlID0gaXJxcm91dGVyX2V4aXQsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBNU01fSVJRX1JPVVRFUl9EUlZfTkFNRSwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9pcnFyb3V0ZXJfZHRfbWF0Y2gsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9pcnFyb3V0ZXJfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21faXJxcm91dGVyX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtc21faXJxcm91dGVyX2V4aXRfbW9kdWxlKHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9pcnFyb3V0ZXJfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQobXNtX2lycXJvdXRlcl9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChtc21faXJxcm91dGVyX2V4aXRfbW9kdWxlKTsKLU1PRFVMRV9ERVNDUklQVElPTigibXNtIGNhbWVyYSBpcnEgcm91dGVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtX2NhbWlycV9yb3V0ZXIuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tc21fY2FtaXJxX3JvdXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWEzY2VjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tc21fY2FtaXJxX3JvdXRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX01TTV9DQU1fSVJRUk9VVEVSX0hfXwotI2RlZmluZSBfX01TTV9DQU1fSVJRUk9VVEVSX0hfXwotCi0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0KLS8qIENhbWVyYSBTUyBjb21tb24gcmVnaXN0ZXJzIGRlZmluZXMgLSBTdGFydCAqLwotLyogVGhlc2UgcmVnaXN0ZXJzIGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0bwotICogSVJRIFJvdXRlciwgYnV0IGFyZSBjb21tb24gdG8gdGhlIENhbWVyYSBTUy4KLSAqIElSUSBSb3V0ZXIgcmVnaXN0ZXJzIGRvbnQgaGF2ZSBhIHVuaXF1ZSBiYXNlIGFkZHJlc3MKLSAqIGluIHRoZSBtZW1vcnkgbWFwcGVkIGFkZHJlc3Mgc3BhY2UuIEl0IGlzIG9mZnNldCBmcm9tCi0gKiB0aGUgQ2FtZXJhIFNTIGJhc2UgYWRkcmVzcy4gU28ga2VlcCB0aGUgY29tbW9uIENhbWVyYQotICogU1MgcmVnaXN0ZXJzIGFsc28gaW4gdGhlIElSUSBSb3V0ZXIgc3ViZGV2IGZvciBub3cuICovCi0KLS8qIFJFQUQgT05MWTogQ2FtZXJhIFN1YnN5c3RlbSBIVyB2ZXJzaW9uICovCi0jZGVmaW5lIENBTVNTX0hXX1ZFUlNJT04JCQkweDAwMDAwMDAwCi0KLS8qIEJpdHMgNDowIG9mIHRoaXMgcmVnaXN0ZXIgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IGEgZGVzaXJlZAotICogY2FtZXJhIGNvcmUgdGVzdCBidXMgdG8gZHJpdmUgdGhlIENhbWVyYV9TUyB0ZXN0IGJ1cyBvdXRwdXQgKi8KLSNkZWZpbmUgQ0FNU1NfVEVTVEJVU19TRUwJCQkweDAwMDAwMDA0Ci0KLS8qIEJpdHMgNDowIG9mIHRoaXMgcmVnaXN0ZXIgaXMgdXNlZCB0byBhbGxvdyBlaXRoZXIgTWljcm9jb250cm9sbGVyCi0gKiBvciB0aGUgQ0NJIGRyaXZlIHRoZSBjb3JyZXNwb25kaW5nIEdQSU8gb3V0cHV0LgotICogRm9yIGVnOiBTZXR0aW5nIGJpdCAwIG9mIHRoaXMgcmVnaXN0ZXIgYWxsb3dzIE1pY3JvY29udHJvbGxlciB0bwotICogZHJpdmUgR1BJTyAjMC4gQ2xlYXJpbmcgdGhlIGJpdCBhbGxvd3MgQ0NJIHRvIGRyaXZlIEdQSU8gIzAuICovCi0jZGVmaW5lIENBTVNTX0dQSU9fTVVYX1NFTAkJCTB4MDAwMDAwMDgKLQotLyogQml0IDAgb2YgdGhpcyByZWdpc3RlciBpcyB1c2VkIHRvIHNldCB0aGUgZGVmYXVsdCBBSEIgbWFzdGVyCi0gKiBmb3IgdGhlIEFIQiBBcmJpdGVyLiAwIC0gQUhCIE1hc3RlciAwLCAxIC0gQUhCIE1hc3RlciAxKi8KLSNkZWZpbmUgQ0FNU1NfQUhCX0FSQl9DVEwJCQkweDAwMDAwMDBDCi0KLS8qIFJFQUQgT05MWSAqLwotI2RlZmluZSBDQU1TU19YUFUyX1NUQVRVUwkJCTB4MDAwMDAwMTAKLQotLyogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBDU0kgY2xvY2sgZm9yIENTSUQgUGl4ZWwgcGlwZXMgKi8KLSNkZWZpbmUgQ0FNU1NfQ1NJX1BJWF9DTEtfTVVYX1NFTAkJMHgwMDAwMDAyMAotI2RlZmluZSBDQU1TU19DU0lfUElYX0NMS19DR0NfRU4JCTB4MDAwMDAwMjQKLQotLyogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBDU0kgY2xvY2sgZm9yIENTSUQgUkRJIHBpcGVzICovCi0jZGVmaW5lIENBTVNTX0NTSV9SRElfQ0xLX01VWF9TRUwJCTB4MDAwMDAwMjgKLSNkZWZpbmUgQ0FNU1NfQ1NJX1JESV9DTEtfQ0dDX0VOCQkweDAwMDAwMDJDCi0KLS8qIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgQ1NJIGNsb2NrIGZvciBDU0kgUGh5MCAqLwotI2RlZmluZSBDQU1TU19DU0lfUEhZXzBfQ0xLX01VWF9TRUwJCTB4MDAwMDAwMzAKLSNkZWZpbmUgQ0FNU1NfQ1NJX1BIWV8wX0NMS19DR0NfRU4JCTB4MDAwMDAwMzQKLQotLyogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBDU0kgY2xvY2sgZm9yIENTSSBQaHkxICovCi0jZGVmaW5lIENBTVNTX0NTSV9QSFlfMV9DTEtfTVVYX1NFTAkJMHgwMDAwMDAzOAotI2RlZmluZSBDQU1TU19DU0lfUEhZXzFfQ0xLX0NHQ19FTgkJMHgwMDAwMDAzQwotCi0vKiBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIENTSSBjbG9jayBmb3IgQ1NJIFBoeTIgKi8KLSNkZWZpbmUgQ0FNU1NfQ1NJX1BIWV8yX0NMS19NVVhfU0VMCQkweDAwMDAwMDQwCi0jZGVmaW5lIENBTVNTX0NTSV9QSFlfMl9DTEtfQ0dDX0VOCQkweDAwMDAwMDQ0Ci0vKiBDYW1lcmEgU1MgY29tbW9uIHJlZ2lzdGVycyBkZWZpbmVzIC0gRW5kICovCi0KLS8qIElSUSBSb3V0ZXIgcmVnaXN0ZXJzIGRlZmluZXMgLSBTdGFydCAqLwotLyogVGhpcyByZWdpc3RlciBpcyB1c2VkIHRvIHJlc2V0IHRoZSBjb21wb3NpdGUKLSAqIElSUSBvdXRwdXRzIG9mIHRoZSBDYW1lcmFfU1MgSVJRIFJvdXRlciAqLwotI2RlZmluZSBDQU1TU19JUlFfQ09NUE9TSVRFX1JFU0VUX0NUUkwJCTB4MDAwMDAwNjAKLQotLyogQnkgZGVmYXVsdCwgdGhpcyAnYWxsb3dzJyB0aGUgaW50ZXJydXB0cyBmcm9tCi0gKiBNaWNybyB0byBwYXNzIHRocm91Z2gsIHVubGVzcyBjb25maWd1cmVkIGluCi0gKiBjb21wb3NpdGUgbW9kZS4gKi8KLSNkZWZpbmUgQ0FNU1NfSVJRX0NPTVBPU0lURV9NQVNLXzAJCTB4MDAwMDAwNjQKLQotLyogQnkgZGVmYXVsdCwgdGhpcyAnYWxsb3dzJyB0aGUgaW50ZXJydXB0cyBmcm9tCi0gKiBDQ0kgdG8gcGFzcyB0aHJvdWdoLCB1bmxlc3MgY29uZmlndXJlZCBpbgotICogY29tcG9zaXRlIG1vZGUuICovCi0jZGVmaW5lIENBTVNTX0lSUV9DT01QT1NJVEVfTUFTS18xCQkweDAwMDAwMDY4Ci0KLS8qIEJ5IGRlZmF1bHQsIHRoaXMgJ2FsbG93cycgdGhlIGludGVycnVwdHMgZnJvbQotICogQ1NJXzAgdG8gcGFzcyB0aHJvdWdoLCB1bmxlc3MgY29uZmlndXJlZCBpbgotICogY29tcG9zaXRlIG1vZGUuICovCi0jZGVmaW5lIENBTVNTX0lSUV9DT01QT1NJVEVfTUFTS18yCQkweDAwMDAwMDZDCi0KLS8qIEJ5IGRlZmF1bHQsIHRoaXMgJ2FsbG93cycgdGhlIGludGVycnVwdHMgZnJvbQotICogQ1NJXzEgdG8gcGFzcyB0aHJvdWdoLCB1bmxlc3MgY29uZmlndXJlZCBpbgotICogY29tcG9zaXRlIG1vZGUuICovCi0jZGVmaW5lIENBTVNTX0lSUV9DT01QT1NJVEVfTUFTS18zCQkweDAwMDAwMDcwCi0KLS8qIEJ5IGRlZmF1bHQsIHRoaXMgJ2FsbG93cycgdGhlIGludGVycnVwdHMgZnJvbQotICogQ1NJXzIgdG8gcGFzcyB0aHJvdWdoLCB1bmxlc3MgY29uZmlndXJlZCBpbgotICogY29tcG9zaXRlIG1vZGUuICovCi0jZGVmaW5lIENBTVNTX0lSUV9DT01QT1NJVEVfTUFTS180CQkweDAwMDAwMDc0Ci0KLS8qIEJ5IGRlZmF1bHQsIHRoaXMgJ2FsbG93cycgdGhlIGludGVycnVwdHMgZnJvbQotICogQ1NJXzMgdG8gcGFzcyB0aHJvdWdoLCB1bmxlc3MgY29uZmlndXJlZCBpbgotICogY29tcG9zaXRlIG1vZGUuICovCi0jZGVmaW5lIENBTVNTX0lSUV9DT01QT1NJVEVfTUFTS181CQkweDAwMDAwMDc4Ci0KLS8qIEJ5IGRlZmF1bHQsIHRoaXMgJ2FsbG93cycgdGhlIGludGVycnVwdHMgZnJvbQotICogSVNQSUYgdG8gcGFzcyB0aHJvdWdoLCB1bmxlc3MgY29uZmlndXJlZCBpbgotICogY29tcG9zaXRlIG1vZGUuICovCi0jZGVmaW5lIENBTVNTX0lSUV9DT01QT1NJVEVfTUFTS182CQkweDAwMDAwMDdDCi0KLS8qIEJ5IGRlZmF1bHQsIHRoaXMgJ2FsbG93cycgdGhlIGludGVycnVwdHMgZnJvbQotICogQ1BQIHRvIHBhc3MgdGhyb3VnaCwgdW5sZXNzIGNvbmZpZ3VyZWQgaW4KLSAqIGNvbXBvc2l0ZSBtb2RlLiAqLwotI2RlZmluZSBDQU1TU19JUlFfQ09NUE9TSVRFX01BU0tfNwkJMHgwMDAwMDA4MAotCi0vKiBCeSBkZWZhdWx0LCB0aGlzICdhbGxvd3MnIHRoZSBpbnRlcnJ1cHRzIGZyb20KLSAqIFZGRV8wIHRvIHBhc3MgdGhyb3VnaCwgdW5sZXNzIGNvbmZpZ3VyZWQgaW4KLSAqIGNvbXBvc2l0ZSBtb2RlLiAqLwotI2RlZmluZSBDQU1TU19JUlFfQ09NUE9TSVRFX01BU0tfOAkJMHgwMDAwMDA4NAotCi0vKiBCeSBkZWZhdWx0LCB0aGlzICdhbGxvd3MnIHRoZSBpbnRlcnJ1cHRzIGZyb20KLSAqIFZGRV8xIHRvIHBhc3MgdGhyb3VnaCwgdW5sZXNzIGNvbmZpZ3VyZWQgaW4KLSAqIGNvbXBvc2l0ZSBtb2RlLiAqLwotI2RlZmluZSBDQU1TU19JUlFfQ09NUE9TSVRFX01BU0tfOQkJMHgwMDAwMDA4OAotCi0vKiBCeSBkZWZhdWx0LCB0aGlzICdhbGxvd3MnIHRoZSBpbnRlcnJ1cHRzIGZyb20KLSAqIEpQRUdfMCB0byBwYXNzIHRocm91Z2gsIHVubGVzcyBjb25maWd1cmVkIGluCi0gKiBjb21wb3NpdGUgbW9kZS4gKi8KLSNkZWZpbmUgQ0FNU1NfSVJRX0NPTVBPU0lURV9NQVNLXzEwCQkweDAwMDAwMDhDCi0KLS8qIEJ5IGRlZmF1bHQsIHRoaXMgJ2FsbG93cycgdGhlIGludGVycnVwdHMgZnJvbQotICogSlBFR18xIHRvIHBhc3MgdGhyb3VnaCwgdW5sZXNzIGNvbmZpZ3VyZWQgaW4KLSAqIGNvbXBvc2l0ZSBtb2RlLiAqLwotI2RlZmluZSBDQU1TU19JUlFfQ09NUE9TSVRFX01BU0tfMTEJCTB4MDAwMDAwOTAKLQotLyogQnkgZGVmYXVsdCwgdGhpcyAnYWxsb3dzJyB0aGUgaW50ZXJydXB0cyBmcm9tCi0gKiBKUEVHXzIgdG8gcGFzcyB0aHJvdWdoLCB1bmxlc3MgY29uZmlndXJlZCBpbgotICogY29tcG9zaXRlIG1vZGUuICovCi0jZGVmaW5lIENBTVNTX0lSUV9DT01QT1NJVEVfTUFTS18xMgkJMHgwMDAwMDA5NAotCi0vKiBUaGUgZm9sbG93aW5nIElSUV9DT01QT1NJVEVfTUlDUk9fTUFTSyByZWdpc3RlcnMKLSAqIGFsbG93IHRoZSBpbnRlcnJ1cHRzIGZyb20gdGhlIGluZGl2aWR1YWwgaHcKLSAqIGNvcmVzIHRvIGJlIGNvbXBvc2l0ZWQgaW50byBhbiBJUlEgZm9yIE1pY3JvLiAqLwotI2RlZmluZSBDQU1TU19JUlFfQ09NUE9TSVRFX01JQ1JPX01BU0tfMAkweDAwMDAwMEE0Ci0jZGVmaW5lIENBTVNTX0lSUV9DT01QT1NJVEVfTUlDUk9fTUFTS18xCTB4MDAwMDAwQTgKLSNkZWZpbmUgQ0FNU1NfSVJRX0NPTVBPU0lURV9NSUNST19NQVNLXzIJMHgwMDAwMDBBQwotI2RlZmluZSBDQU1TU19JUlFfQ09NUE9TSVRFX01JQ1JPX01BU0tfMwkweDAwMDAwMEIwCi0jZGVmaW5lIENBTVNTX0lSUV9DT01QT1NJVEVfTUlDUk9fTUFTS180CTB4MDAwMDAwQjQKLSNkZWZpbmUgQ0FNU1NfSVJRX0NPTVBPU0lURV9NSUNST19NQVNLXzUJMHgwMDAwMDBCOAotLyogSVJRIFJvdXRlciByZWdpc3RlciBkZWZpbmVzIC0gRW5kICovCi0KLS8qIFdyaXRpbmcgdGhpcyBtYXNrIHdpbGwgcmVzZXQgYWxsIHRoZSBjb21wb3NpdGUKLSAqIElSUXMgb2YgdGhlIENhbWVyYV9TUyBJUlEgUm91dGVyICovCi0jZGVmaW5lIENBTVNTX0lSUV9DT01QT1NJVEVfUkVTRVRfTUFTSwkJMHgwMDNGMUZGRgotCi0vKiBVc2UgdGhpcyB0byBlbmFibGUgTWljcm8gSVJRIGZyb20gSVJRIFJvdXRlcgotICogY29tcG9zaXRlIGludGVycnVwdCAqLwotI2RlZmluZSBFTkFCTEVfTUlDUk9fSVJRX0lOX0NPTVBPU0lURQkJQklUKDApCi0vKiBVc2UgdGhpcyB0byBlbmFibGUgQ0NJIElSUSBmcm9tIElSUSBSb3V0ZXIKLSAqIGNvbXBvc2l0ZSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgRU5BQkxFX0NDSV9JUlFfSU5fQ09NUE9TSVRFCQlCSVQoMSkKLS8qIFVzZSB0aGlzIHRvIGVuYWJsZSBDU0kwIElSUSBmcm9tIElSUSBSb3V0ZXIKLSAqIGNvbXBvc2l0ZSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgRU5BQkxFX0NTSTBfSVJRX0lOX0NPTVBPU0lURQkJQklUKDIpCi0vKiBVc2UgdGhpcyB0byBlbmFibGUgQ1NJMSBJUlEgZnJvbSBJUlEgUm91dGVyCi0gKiBjb21wb3NpdGUgaW50ZXJydXB0ICovCi0jZGVmaW5lIEVOQUJMRV9DU0kxX0lSUV9JTl9DT01QT1NJVEUJCUJJVCgzKQotLyogVXNlIHRoaXMgdG8gZW5hYmxlIENTSTIgSVJRIGZyb20gSVJRIFJvdXRlcgotICogY29tcG9zaXRlIGludGVycnVwdCAqLwotI2RlZmluZSBFTkFCTEVfQ1NJMl9JUlFfSU5fQ09NUE9TSVRFCQlCSVQoNCkKLS8qIFVzZSB0aGlzIHRvIGVuYWJsZSBDU0kzIElSUSBmcm9tIElSUSBSb3V0ZXIKLSAqIGNvbXBvc2l0ZSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgRU5BQkxFX0NTSTNfSVJRX0lOX0NPTVBPU0lURQkJQklUKDUpCi0vKiBVc2UgdGhpcyB0byBlbmFibGUgSVNQSUYgSVJRIGZyb20gSVJRIFJvdXRlcgotICogY29tcG9zaXRlIGludGVycnVwdCAqLwotI2RlZmluZSBFTkFCTEVfSVNQSUZfSVJRX0lOX0NPTVBPU0lURQkJQklUKDYpCi0vKiBVc2UgdGhpcyB0byBlbmFibGUgQ1BQIElSUSBmcm9tIElSUSBSb3V0ZXIKLSAqIGNvbXBvc2l0ZSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgRU5BQkxFX0NQUF9JUlFfSU5fQ09NUE9TSVRFCQlCSVQoNykKLS8qIFVzZSB0aGlzIHRvIGVuYWJsZSBWRkUwIElSUSBmcm9tIElSUSBSb3V0ZXIKLSAqIGNvbXBvc2l0ZSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgRU5BQkxFX1ZGRTBfSVJRX0lOX0NPTVBPU0lURQkJQklUKDgpCi0vKiBVc2UgdGhpcyB0byBlbmFibGUgVkZFMSBJUlEgZnJvbSBJUlEgUm91dGVyCi0gKiBjb21wb3NpdGUgaW50ZXJydXB0ICovCi0jZGVmaW5lIEVOQUJMRV9WRkUxX0lSUV9JTl9DT01QT1NJVEUJCUJJVCg5KQotLyogVXNlIHRoaXMgdG8gZW5hYmxlIEpQRUcwIElSUSBmcm9tIElSUSBSb3V0ZXIKLSAqIGNvbXBvc2l0ZSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgRU5BQkxFX0pQRUcwX0lSUV9JTl9DT01QT1NJVEUJCUJJVCgxMCkKLS8qIFVzZSB0aGlzIHRvIGVuYWJsZSBKUEVHMSBJUlEgZnJvbSBJUlEgUm91dGVyCi0gKiBjb21wb3NpdGUgaW50ZXJydXB0ICovCi0jZGVmaW5lIEVOQUJMRV9KUEVHMV9JUlFfSU5fQ09NUE9TSVRFCQlCSVQoMTEpCi0vKiBVc2UgdGhpcyB0byBlbmFibGUgSlBFRzIgSVJRIGZyb20gSVJRIFJvdXRlcgotICogY29tcG9zaXRlIGludGVycnVwdCAqLwotI2RlZmluZSBFTkFCTEVfSlBFRzJfSVJRX0lOX0NPTVBPU0lURQkJQklUKDEyKQotCi1zdHJ1Y3QgaXJxcm91dGVyX2N0cmxfdHlwZSB7Ci0JLyogdjRsMiBzdWJkZXYgKi8KLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgc3ViZGV2OwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0KLQl2b2lkIF9faW9tZW0gKmlycXJfZGV2X2Jhc2U7Ci0KLQlzdHJ1Y3QgcmVzb3VyY2UJKmlycXJfZGV2X21lbTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmlycXJfZGV2X2lvOwotCWF0b21pY190IGFjdGl2ZTsKLQlzdHJ1Y3QgbXNtX2NhbV9zZXJ2ZXJfaXJxbWFwX2VudHJ5IGRlZl9od19pcnFtYXBbQ0FNRVJBX1NTX0lSUV9NQVhdOwotfTsKLQotI2VuZGlmIC8qIF9fTVNNX0NBTV9JUlFST1VURVJfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtX2dlc3R1cmUuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tc21fZ2VzdHVyZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWIwNDFlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tc21fZ2VzdHVyZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KLSNpbmNsdWRlIDxtZWRpYS9tc21fY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2dlc3R1cmVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSAibXNtLmgiCi0KLSNpZmRlZiBDT05GSUdfTVNNX0NBTUVSQV9ERUJVRwotI2RlZmluZSBEKGZtdCwgYXJncy4uLikgcHJfZGVidWcoIm1zbV9nZXN0dXJlOiAiIGZtdCwgIyNhcmdzKQotI2Vsc2UKLSNkZWZpbmUgRChmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLXN0cnVjdCBtc21fZ2VzdHVyZV9jdHJsIHsKLQlpbnQgcXVldWVfaWQ7Ci0JYXRvbWljX3QgYWN0aXZlOwotCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBjdHJsX2hhbmRsZXI7Ci0JaW50IG51bV9jdHJsczsKLQlzdHJ1Y3QgdjRsMl9maCAqcF9ldmVudEhhbmRsZTsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOwotCXN0cnVjdCBtc21fZ2VzX2V2dCBldmVudDsKLQlpbnQgY2FtZXJhX29wZW5lZDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2dlc3R1cmVfY3RybCBnX2dlc3R1cmVfY3RybDsKLQotaW50IG1zbV9nZXN0dXJlX3N1YnNjcmliZV9ldmVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9maCAqZmgsCi0Jc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIpCi17Ci0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAoc3ViLT50eXBlID09IFY0TDJfRVZFTlRfQUxMKQotCQlzdWItPnR5cGUgPSBNU01fR0VTX0FQUF9OT1RJRllfRVZFTlQ7Ci0JcmV0dXJuIHY0bDJfZXZlbnRfc3Vic2NyaWJlKGZoLCBzdWIsIDMwKTsKLX0KLQotc3RhdGljIGludCBtc21fZ2VzdHVyZV9zZW5kX2N0cmwoc3RydWN0IG1zbV9nZXN0dXJlX2N0cmwgKnBfZ2VzdHVyZV9jdHJsLAotCWludCB0eXBlLCB2b2lkICp2YWx1ZSwgaW50IGxlbmd0aCwgdWludDMyX3QgdGltZW91dCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY3RybF9jbWQgY3RybGNtZDsKLQlEKCIlcyBxaWQgJWRcbiIsIF9fZnVuY19fLCBwX2dlc3R1cmVfY3RybC0+cXVldWVfaWQpOwotCWN0cmxjbWQudHlwZSA9IHR5cGU7Ci0JY3RybGNtZC50aW1lb3V0X21zID0gdGltZW91dDsKLQljdHJsY21kLmxlbmd0aCA9IGxlbmd0aDsKLQljdHJsY21kLnZhbHVlID0gdmFsdWU7Ci0JY3RybGNtZC52bm9kZV9pZCA9IDA7Ci0JY3RybGNtZC5xdWV1ZV9pZHggPSBwX2dlc3R1cmVfY3RybC0+cXVldWVfaWQ7Ci0JY3RybGNtZC5jb25maWdfaWRlbnQgPSAwOwotCi0JcmMgPSBtc21fc2VydmVyX3NlbmRfY3RybCgmY3RybGNtZCwgTVNNX0dFU19SRVNQX1Y0TDIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fZ2VzdHVyZV9wcm9jX2N0cmxfY21kKHN0cnVjdCBtc21fZ2VzdHVyZV9jdHJsICpwX2dlc3R1cmVfY3RybCwKLQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jdHJsX2NtZCAqdG1wX2NtZCA9IE5VTEw7Ci0JdWludDhfdCAqY3RybF9kYXRhID0gTlVMTDsKLQl2b2lkIF9fdXNlciAqdXB0cl9jbWQ7Ci0Jdm9pZCBfX3VzZXIgKnVwdHJfdmFsdWU7Ci0JdWludDMyX3QgY21kX2xlbiA9IHNpemVvZihzdHJ1Y3QgbXNtX2N0cmxfY21kKTsKLQl1aW50MzJfdCB2YWx1ZV9sZW47Ci0KLQl0bXBfY21kID0gKHN0cnVjdCBtc21fY3RybF9jbWQgKiljdHJsLT52YWx1ZTsKLQl1cHRyX2NtZCA9ICh2b2lkIF9fdXNlciAqKWN0cmwtPnZhbHVlOwotCXVwdHJfdmFsdWUgPSAodm9pZCBfX3VzZXIgKil0bXBfY21kLT52YWx1ZTsKLQl2YWx1ZV9sZW4gPSB0bXBfY21kLT5sZW5ndGg7Ci0KLQlEKCIlczogY21kIHR5cGUgPSAlZCwgdXAxPTB4JXgsIHVsZW4xPSVkLCB1cDI9MHgleCwgdWxlbjI9JWRcbiIsCi0JCV9fZnVuY19fLCB0bXBfY21kLT50eXBlLCAodWludDMyX3QpdXB0cl9jbWQsIGNtZF9sZW4sCi0JCSh1aW50MzJfdCl1cHRyX3ZhbHVlLCB0bXBfY21kLT5sZW5ndGgpOwotCi0JY3RybF9kYXRhID0ga3phbGxvYyh2YWx1ZV9sZW4gKyBjbWRfbGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoY3RybF9kYXRhID09IDApIHsKLQkJcHJfZXJyKCIlcyBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlbmQ7Ci0JfQotCXRtcF9jbWQgPSAoc3RydWN0IG1zbV9jdHJsX2NtZCAqKWN0cmxfZGF0YTsKLQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKiljdHJsX2RhdGEsIHVwdHJfY21kLAotCQkJY21kX2xlbikpIHsKLQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkLlxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kOwotCX0KLQl0bXBfY21kLT52YWx1ZSA9ICh2b2lkICopKGN0cmxfZGF0YSArIGNtZF9sZW4pOwotCWlmICh1cHRyX3ZhbHVlICYmIHRtcF9jbWQtPmxlbmd0aCA+IDApIHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopdG1wX2NtZC0+dmFsdWUsIHVwdHJfdmFsdWUsCi0JCQl2YWx1ZV9sZW4pKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIHNpemU9JWRcbiIsCi0JCQkJX19mdW5jX18sIHZhbHVlX2xlbik7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCX0gZWxzZQotCQl0bXBfY21kLT52YWx1ZSA9IE5VTEw7Ci0KLQkvKiBzZW5kIGNvbW1hbmQgdG8gY29uZmlnIHRocmVhZCBpbiB1c2Vyc3NwYWNlLCBhbmQgZ2V0IHJldHVybiB2YWx1ZSAqLwotCXJjID0gbXNtX3NlcnZlcl9zZW5kX2N0cmwoKHN0cnVjdCBtc21fY3RybF9jbWQgKiljdHJsX2RhdGEsCi0JCQlNU01fR0VTX1JFU1BfVjRMMik7Ci0JRCgiJXM6IG1zbV9zZXJ2ZXJfY29udHJvbCByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKLQlpZiAocmMgPT0gMCkgewotCQlpZiAodXB0cl92YWx1ZSAmJiB0bXBfY21kLT5sZW5ndGggPiAwICYmCi0JCQljb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopdXB0cl92YWx1ZSwKLQkJCQkodm9pZCAqKShjdHJsX2RhdGEgKyBjbWRfbGVuKSwKLQkJCQl0bXBfY21kLT5sZW5ndGgpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZmFpbGVkLCBzaXplPSVkXG4iLAotCQkJCV9fZnVuY19fLCB0bXBfY21kLT5sZW5ndGgpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBlbmQ7Ci0JCX0KLQkJdG1wX2NtZC0+dmFsdWUgPSB1cHRyX3ZhbHVlOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKXVwdHJfY21kLAotCQkJKHZvaWQgKil0bXBfY21kLCBjbWRfbGVuKSkgewotCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZhaWxlZCBpbiBjcHksIHNpemU9JWRcbiIsCi0JCQkJX19mdW5jX18sIGNtZF9sZW4pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBlbmQ7Ci0JCX0KLQl9Ci1lbmQ6Ci0JRCgiJXM6IEVORCwgdHlwZSA9ICVkLCB2YWRkciA9IDB4JXgsIHZsZW4gPSAlZCwgc3RhdHVzID0gJWQsIHJjID0gJWRcbiIsCi0JCV9fZnVuY19fLCB0bXBfY21kLT50eXBlLCAodWludDMyX3QpdG1wX2NtZC0+dmFsdWUsCi0JCXRtcF9jbWQtPmxlbmd0aCwgdG1wX2NtZC0+c3RhdHVzLCByYyk7Ci0Ja2ZyZWUoY3RybF9kYXRhKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2dlc3R1cmVfc19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0Jc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fZ2VzdHVyZV9jdHJsICpwX2dlc3R1cmVfY3RybCA9ICZnX2dlc3R1cmVfY3RybDsKLQlEKCIlcyBjdHJsLT5pZCAlZFxuIiwgX19mdW5jX18sIGN0cmwtPmlkKTsKLQlyYyA9IG1zbV9nZXN0dXJlX3Byb2NfY3RybF9jbWQocF9nZXN0dXJlX2N0cmwsIGN0cmwpOwotCWlmIChyYyAhPSAwKSB7Ci0JCXByX2VycigiJXMgc2V0IGN0cmwgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9nZXN0dXJlX3NfY3RybF9vcHMoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKLQlzdHJ1Y3QgbXNtX2dlc3R1cmVfY3RybCAqcF9nZXN0dXJlX2N0cmwgPSAmZ19nZXN0dXJlX2N0cmw7Ci0JY29udHJvbC5pZCA9IGN0cmwtPmlkOwotCWNvbnRyb2wudmFsdWUgPSBjdHJsLT52YWw7Ci0JRCgiJXMgY3RybC0+aWQgMHgleFxuIiwgX19mdW5jX18sIGN0cmwtPmlkKTsKLQlyYyA9IG1zbV9nZXN0dXJlX3Byb2NfY3RybF9jbWQocF9nZXN0dXJlX2N0cmwsICZjb250cm9sKTsKLQlpZiAocmMgIT0gMCkgewotCQlwcl9lcnIoIiVzIHByb2MgY3RybCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2dlc3R1cmVfc19jdHJsX2V4dChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqY3RybHMpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7Ci0Jc3RydWN0IG1zbV9nZXN0dXJlX2N0cmwgKnBfZ2VzdHVyZV9jdHJsID0gJmdfZ2VzdHVyZV9jdHJsOwotCWlmICgoY3RybHMtPmNvdW50IDwgMSkgfHwgKE5VTEwgPT0gY3RybHMtPmNvbnRyb2xzKSkgewotCQlwcl9lcnIoIiVzIGludmFsaWQgY3RybCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWNvbnRyb2wuaWQgPSBjdHJscy0+Y29udHJvbHMtPmlkOwotCWNvbnRyb2wudmFsdWUgPSBjdHJscy0+Y29udHJvbHMtPnZhbHVlOwotCUQoIiVzIGN0cmwtPmlkICVkXG4iLCBfX2Z1bmNfXywgY29udHJvbC5pZCk7Ci0JcmMgPSBtc21fZ2VzdHVyZV9wcm9jX2N0cmxfY21kKHBfZ2VzdHVyZV9jdHJsLCAmY29udHJvbCk7Ci0JaWYgKHJjICE9IDApIHsKLQkJcHJfZXJyKCIlcyBwcm9jIGN0cmwgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9nZXN0dXJlX2hhbmRsZV9ldmVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXN0cnVjdCBtc21fZ2VzdHVyZV9jdHJsICpwX2dlc3R1cmVfY3RybCwgdm9pZCogYXJnKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHY0bDJfZXZlbnQgKmV2dCA9IChzdHJ1Y3QgdjRsMl9ldmVudCAqKWFyZzsKLQlzdHJ1Y3QgbXNtX2dlc19ldnQgKnBfZ2VzX2V2dCA9IE5VTEw7Ci0JRCgiJXM6IFJlY2VpdmVkIGdlc3R1cmUgZXZ0IDB4JXggIiwgX19mdW5jX18sIGV2dC0+dHlwZSk7Ci0JcF9nZXN0dXJlX2N0cmwtPmV2ZW50LmV2dF9sZW4gPSAwOwotCXBfZ2VzdHVyZV9jdHJsLT5ldmVudC5ldnRfZGF0YSA9IE5VTEw7Ci0KLQlwX2dlc19ldnQgPSAoc3RydWN0IG1zbV9nZXNfZXZ0ICopZXZ0LT51LmRhdGE7Ci0JRCgiJXM6IGV2ZW50IGRhdGEgJXAgbGVuICVkIiwgX19mdW5jX18sCi0JCXBfZ2VzX2V2dC0+ZXZ0X2RhdGEsCi0JCXBfZ2VzX2V2dC0+ZXZ0X2xlbik7Ci0KLQlpZiAocF9nZXNfZXZ0LT5ldnRfbGVuID4gMCkgewotCQlwX2dlc3R1cmVfY3RybC0+ZXZlbnQuZXZ0X2RhdGEgPQotCQkJa3phbGxvYyhwX2dlc19ldnQtPmV2dF9sZW4sIEdGUF9LRVJORUwpOwotCi0JCWlmIChOVUxMID09IHBfZ2VzdHVyZV9jdHJsLT5ldmVudC5ldnRfZGF0YSkgewotCQkJcHJfZXJyKCIlczogY2Fubm90IGFsbG9jYXRlIGV2ZW50IiwgX19mdW5jX18pOwotCQkJcmMgPSAtRU5PTUVNOwotCQl9IGVsc2UgewotCQkJaWYgKGNvcHlfZnJvbV91c2VyKAotCQkJCSh2b2lkICopcF9nZXN0dXJlX2N0cmwtPmV2ZW50LmV2dF9kYXRhLAotCQkJCSh2b2lkIF9fdXNlciAqKXBfZ2VzX2V2dC0+ZXZ0X2RhdGEsCi0JCQkJcF9nZXNfZXZ0LT5ldnRfbGVuKSkgewotCQkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQl9IGVsc2UgewotCQkJCUQoIiVzOiBjb3BpZWQgdGhlIGV2ZW50IiwgX19mdW5jX18pOwotCQkJCXBfZ2VzdHVyZV9jdHJsLT5ldmVudC5ldnRfbGVuID0KLQkJCQkJcF9nZXNfZXZ0LT5ldnRfbGVuOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHJjID09IDApIHsKLQkJa3RpbWVfZ2V0X3RzKCZldnQtPnRpbWVzdGFtcCk7Ci0JCXY0bDJfZXZlbnRfcXVldWUoc2QtPmRldm5vZGUsIGV2dCk7Ci0JfQotCUQoIiVzOiBleGl0IHJjICVkICIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9nZXN0dXJlX2dldF9ldnRfcGF5bG9hZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXN0cnVjdCBtc21fZ2VzdHVyZV9jdHJsICpwX2dlc3R1cmVfY3RybCwgdm9pZCogYXJnKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9nZXNfZXZ0ICpwX2dlc19ldnQgPSAoc3RydWN0IG1zbV9nZXNfZXZ0ICopYXJnOwotCUQoIiVzOiBlbnRlciAiLCBfX2Z1bmNfXyk7Ci0JaWYgKE5VTEwgIT0gcF9nZXN0dXJlX2N0cmwtPmV2ZW50LmV2dF9kYXRhKSB7Ci0JCUQoIiVzOiBldmVudCBkYXRhICVwIGxlbiAlZCIsIF9fZnVuY19fLAotCQkJcF9nZXN0dXJlX2N0cmwtPmV2ZW50LmV2dF9kYXRhLAotCQkJcF9nZXN0dXJlX2N0cmwtPmV2ZW50LmV2dF9sZW4pOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopcF9nZXNfZXZ0LT5ldnRfZGF0YSwKLQkJCXBfZ2VzdHVyZV9jdHJsLT5ldmVudC5ldnRfZGF0YSwKLQkJCXBfZ2VzdHVyZV9jdHJsLT5ldmVudC5ldnRfbGVuKSkgewotCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZhaWxlZC5cbiIsIF9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfSBlbHNlIHsKLQkJCUQoIiVzOiBjb3BpZWQgdGhlIGV2ZW50IiwgX19mdW5jX18pOwotCQkJcF9nZXNfZXZ0LT5ldnRfbGVuID0gcF9nZXN0dXJlX2N0cmwtPmV2ZW50LmV2dF9sZW47Ci0JCX0KLQl9Ci0JRCgiJXM6IGV4aXQgcmMgJWQgIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2dlc3R1cmVfaGFuZGxlX2NhbV9ldmVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXN0cnVjdCBtc21fZ2VzdHVyZV9jdHJsICpwX2dlc3R1cmVfY3RybCwgaW50IGNhbV9ldnQpCi17Ci0JaW50IHJjID0gMDsKLQlEKCIlczogY2FtX2V2dCAlZCAiLCBfX2Z1bmNfXywgY2FtX2V2dCk7Ci0KLQlpZiAoKGNhbV9ldnQgIT0gTVNNX1Y0TDJfR0VTX0NBTV9PUEVOKQotCQkmJiAoY2FtX2V2dCAhPSBNU01fVjRMMl9HRVNfQ0FNX0NMT1NFKSkgewotCQlwcl9lcnIoIiVzOiBlcnJvciBpbnZhbGlkIGV2ZW50ICVkICIsIF9fZnVuY19fLCBjYW1fZXZ0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcF9nZXN0dXJlX2N0cmwtPmNhbWVyYV9vcGVuZWQgPQotCQkoY2FtX2V2dCA9PSBNU01fVjRMMl9HRVNfQ0FNX09QRU4pOwotCi0JaWYgKGF0b21pY19yZWFkKCZwX2dlc3R1cmVfY3RybC0+YWN0aXZlKSA9PSAwKSB7Ci0JCUQoIiVzIGdlc3R1cmUgbm90IGFjdGl2ZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyYyA9IG1zbV9nZXN0dXJlX3NlbmRfY3RybChwX2dlc3R1cmVfY3RybCwgY2FtX2V2dCwgTlVMTCwKLQkJMCwgMjAwMCk7Ci0JaWYgKHJjICE9IDApIHsKLQkJcHJfZXJyKCIlcyBnZXN0dXJlIGN0cmwgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCUQoIiVzIGV4aXQgcmMgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1sb25nIG1zbV9nZXN0dXJlX2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fZ2VzdHVyZV9jdHJsICpwX2dlc3R1cmVfY3RybCA9ICZnX2dlc3R1cmVfY3RybDsKLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBNU01fR0VTX0lPQ1RMX0NUUkxfQ09NTUFORDogewotCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gKHN0cnVjdCB2NGwyX2NvbnRyb2wgKilhcmc7Ci0JCUQoIiVzIE1TTV9HRVNfSU9DVExfQ1RSTF9DT01NQU5EIGFyZyAlcCBzaXplICVkXG4iLCBfX2Z1bmNfXywKLQkJCWFyZywgc2l6ZW9mKGN0cmwpKTsKLQkJcmMgPSBtc21fZ2VzdHVyZV9zX2N0cmwoc2QsIGN0cmwpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfTVNNX0dFU1RVUkVfRVZUOiB7Ci0JCXJjID0gbXNtX2dlc3R1cmVfaGFuZGxlX2V2ZW50KHNkLCBwX2dlc3R1cmVfY3RybCwgYXJnKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX01TTV9HRVNUVVJFX0NBTV9FVlQ6IHsKLQkJaW50IGNhbV9ldnQgPSAqKChpbnQgKilhcmcpOwotCQlyYyA9IG1zbV9nZXN0dXJlX2hhbmRsZV9jYW1fZXZlbnQoc2QsIHBfZ2VzdHVyZV9jdHJsLCBjYW1fZXZ0KTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgTVNNX0dFU19HRVRfRVZUX1BBWUxPQUQ6IHsKLQkJcmMgPSBtc21fZ2VzdHVyZV9nZXRfZXZ0X3BheWxvYWQoc2QsIHBfZ2VzdHVyZV9jdHJsLCBhcmcpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogSW52YWxpZCBpb2N0bCAlZCIsIF9fZnVuY19fLCBjbWQpOwotCQlicmVhazsKLQl9Ci0JRCgiJXMgZXhpdCByYyAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBtc21fZ2VzdHVyZV9jdHJsX29wcyA9IHsKLQkuc19jdHJsID0gbXNtX2dlc3R1cmVfc19jdHJsX29wcywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBtc21fZ2VzdHVyZV9jdHJsX2ZpbHRlciA9IHsKLQkub3BzID0gJm1zbV9nZXN0dXJlX2N0cmxfb3BzLAotCS5pZCA9IE1TTV9HRVNUVVJFX0NJRF9DVFJMX0NNRCwKLQkubmFtZSA9ICJHZXN0dXJlIGN0cmwiLAotCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkuZmxhZ3MgPSBWNEwyX0NUUkxfRkxBR19TTElERVIsCi0JLm1heCA9IDB4N2ZmZmZmZmYsCi0JLnN0ZXAgPSAxLAotCS5taW4gPSAweDgwMDAwMDAwLAotfTsKLQotc3RhdGljIGludCBtc21fZ2VzdHVyZV9pbml0X2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQlzdHJ1Y3QgbXNtX2dlc3R1cmVfY3RybCAqcF9nZXN0dXJlX2N0cmwpCi17Ci0JaW50IHJjID0gMDsKLQlwX2dlc3R1cmVfY3RybC0+bnVtX2N0cmxzID0gMTsKLQlwX2dlc3R1cmVfY3RybC0+Y3RybF9oYW5kbGVyLmVycm9yID0gMDsKLQl2NGwyX2N0cmxfaGFuZGxlcl9pbml0KCZwX2dlc3R1cmVfY3RybC0+Y3RybF9oYW5kbGVyLAotCQlwX2dlc3R1cmVfY3RybC0+bnVtX2N0cmxzKTsKLQl2NGwyX2N0cmxfbmV3X2N1c3RvbSgmcF9nZXN0dXJlX2N0cmwtPmN0cmxfaGFuZGxlciwKLQkJJm1zbV9nZXN0dXJlX2N0cmxfZmlsdGVyLCBwX2dlc3R1cmVfY3RybCk7Ci0JaWYgKHBfZ2VzdHVyZV9jdHJsLT5jdHJsX2hhbmRsZXIuZXJyb3IpIHsKLQkJaW50IGVyciA9IHBfZ2VzdHVyZV9jdHJsLT5jdHJsX2hhbmRsZXIuZXJyb3I7Ci0JCUQoIiVzOiBlcnJvciBhZGRpbmcgY29udHJvbCAlZCIsIF9fZnVuY19fLCBlcnIpOwotCQlwX2dlc3R1cmVfY3RybC0+Y3RybF9oYW5kbGVyLmVycm9yID0gMDsKLQl9Ci0Jc2QtPmN0cmxfaGFuZGxlciA9ICZwX2dlc3R1cmVfY3RybC0+Y3RybF9oYW5kbGVyOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fZ2VzdHVyZV9vcGVuKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgpCi17Ci0JaW50IHJjID0gMCwgcmNfZXJyID0gMDsKLQlzdHJ1Y3QgbXNtX2dlc3R1cmVfY3RybCAqcF9nZXN0dXJlX2N0cmwgPSAmZ19nZXN0dXJlX2N0cmw7Ci0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAoYXRvbWljX3JlYWQoJnBfZ2VzdHVyZV9jdHJsLT5hY3RpdmUpICE9IDApIHsKLQkJcHJfZXJyKCIlcyBhbHJlYWR5IG9wZW5lZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbWVtc2V0KCZwX2dlc3R1cmVfY3RybC0+ZXZlbnQsIDB4MCwgc2l6ZW9mKHN0cnVjdCBtc21fZ2VzX2V2dCkpOwotCXJjID0gbXNtX3NlcnZlcl9vcGVuX2NsaWVudCgmcF9nZXN0dXJlX2N0cmwtPnF1ZXVlX2lkKTsKLQlpZiAocmMgIT0gMCkgewotCQlwcl9lcnIoIiVzIG9wZW4gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJjID0gbXNtX2dlc3R1cmVfaW5pdF9jdHJsKHNkLCBwX2dlc3R1cmVfY3RybCk7Ci0JaWYgKHJjICE9IDApIHsKLQkJcHJfZXJyKCIlcyBpbml0IGN0cmwgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJjID0gbXNtX2dlc3R1cmVfc2VuZF9jdHJsKHBfZ2VzdHVyZV9jdHJsLCBNU01fVjRMMl9HRVNfT1BFTiwgTlVMTCwKLQkJMCwgMTAwMDApOwotCWlmIChyYyAhPSAwKSB7Ci0JCXByX2VycigiJXMgZ2VzdHVyZSBjdHJsIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlhdG9taWNfaW5jKCZwX2dlc3R1cmVfY3RybC0+YWN0aXZlKTsKLQotCXJldHVybiByYzsKLQotZXJyOgotCXJjX2VyciA9IG1zbV9zZXJ2ZXJfY2xvc2VfY2xpZW50KHBfZ2VzdHVyZV9jdHJsLT5xdWV1ZV9pZCk7Ci0JaWYgKHJjX2VyciAhPSAwKQotCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2dlc3R1cmVfY2xvc2Uoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fZ2VzdHVyZV9jdHJsICpwX2dlc3R1cmVfY3RybCA9ICZnX2dlc3R1cmVfY3RybDsKLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCWlmIChhdG9taWNfcmVhZCgmcF9nZXN0dXJlX2N0cmwtPmFjdGl2ZSkgPT0gMCkgewotCQlwcl9lcnIoIiVzIGFscmVhZHkgY2xvc2VkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJjID0gbXNtX2dlc3R1cmVfc2VuZF9jdHJsKHBfZ2VzdHVyZV9jdHJsLCBNU01fVjRMMl9HRVNfQ0xPU0UsIE5VTEwsCi0JCTAsIDEwMDAwKTsKLQlpZiAocmMgIT0gMCkKLQkJcHJfZXJyKCIlcyBnZXN0dXJlIGN0cmwgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCi0JcmMgPSBtc21fc2VydmVyX2Nsb3NlX2NsaWVudChwX2dlc3R1cmVfY3RybC0+cXVldWVfaWQpOwotCWlmIChyYyAhPSAwKQotCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQotCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnBfZ2VzdHVyZV9jdHJsLT5jdHJsX2hhbmRsZXIpOwotCWtmcmVlKHBfZ2VzdHVyZV9jdHJsLT5ldmVudC5ldnRfZGF0YSk7Ci0KLQlhdG9taWNfZGVjKCZwX2dlc3R1cmVfY3RybC0+YWN0aXZlKTsKLQlnX2dlc3R1cmVfY3RybC5xdWV1ZV9pZCA9IC0xOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIG1zbV9nZXN0dXJlX2NvcmVfb3BzID0gewotCS5zX2N0cmwgPSBtc21fZ2VzdHVyZV9zX2N0cmwsCi0JLnNfZXh0X2N0cmxzID0gbXNtX2dlc3R1cmVfc19jdHJsX2V4dCwKLQkuaW9jdGwgPSBtc21fZ2VzdHVyZV9pb2N0bCwKLQkuc3Vic2NyaWJlX2V2ZW50ID0gbXNtX2dlc3R1cmVfc3Vic2NyaWJlX2V2ZW50LAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgbXNtX2dlc3R1cmVfdmlkZW9fb3BzOwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBtc21fZ2VzdHVyZV9zdWJkZXZfb3BzID0gewotCS5jb3JlID0gJm1zbV9nZXN0dXJlX2NvcmVfb3BzLAotCS52aWRlbyAgPSAmbXNtX2dlc3R1cmVfdmlkZW9fb3BzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgbXNtX2dlc3R1cmVfaW50ZXJuYWxfb3BzID0gewotCS5vcGVuID0gbXNtX2dlc3R1cmVfb3BlbiwKLQkuY2xvc2UgPSBtc21fZ2VzdHVyZV9jbG9zZSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2dlc3R1cmVfbm9kZV9yZWdpc3Rlcih2b2lkKQotewotCXN0cnVjdCBtc21fZ2VzdHVyZV9jdHJsICpwX2dlc3R1cmVfY3RybCA9ICZnX2dlc3R1cmVfY3RybDsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmdlc3R1cmVfc3ViZGV2ID0KLQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHY0bDJfc3ViZGV2KSwgR0ZQX0tFUk5FTCk7Ci0Jc3RydWN0IG1zbV9jYW1fc3ViZGV2X2luZm8gc2RfaW5mbzsKLQotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKCFnZXN0dXJlX3N1YmRldikgewotCQlwcl9lcnIoIiVzOiBubyBlbm91Z2ggbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX07Ci0KLQl2NGwyX3N1YmRldl9pbml0KGdlc3R1cmVfc3ViZGV2LCAmbXNtX2dlc3R1cmVfc3ViZGV2X29wcyk7Ci0JZ2VzdHVyZV9zdWJkZXYtPmludGVybmFsX29wcyA9ICZtc21fZ2VzdHVyZV9pbnRlcm5hbF9vcHM7Ci0JZ2VzdHVyZV9zdWJkZXYtPmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOwotCXNucHJpbnRmKGdlc3R1cmVfc3ViZGV2LT5uYW1lLAotCQkJIHNpemVvZihnZXN0dXJlX3N1YmRldi0+bmFtZSksICJnZXN0dXJlIik7Ci0KLQltZWRpYV9lbnRpdHlfaW5pdCgmZ2VzdHVyZV9zdWJkZXYtPmVudGl0eSwgMCwgTlVMTCwgMCk7Ci0JZ2VzdHVyZV9zdWJkZXYtPmVudGl0eS50eXBlID0gTUVESUFfRU5UX1RfREVWTk9ERV9WNEw7Ci0JZ2VzdHVyZV9zdWJkZXYtPmVudGl0eS5ncm91cF9pZCA9IEdFU1RVUkVfREVWOwotCWdlc3R1cmVfc3ViZGV2LT5lbnRpdHkubmFtZSA9IGdlc3R1cmVfc3ViZGV2LT5uYW1lOwotCi0JLyogZXZlbnRzICovCi0JZ2VzdHVyZV9zdWJkZXYtPmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19FVkVOVFM7Ci0KLQlzZF9pbmZvLnNkZXZfdHlwZSA9IEdFU1RVUkVfREVWOwotCXNkX2luZm8uc2RfaW5kZXggPSAwOwotCXNkX2luZm8uaXJxX251bSA9IDA7Ci0JbXNtX2NhbV9yZWdpc3Rlcl9zdWJkZXZfbm9kZShnZXN0dXJlX3N1YmRldiwgJnNkX2luZm8pOwotCi0JZ2VzdHVyZV9zdWJkZXYtPmVudGl0eS5yZXZpc2lvbiA9IGdlc3R1cmVfc3ViZGV2LT5kZXZub2RlLT5udW07Ci0KLQlhdG9taWNfc2V0KCZwX2dlc3R1cmVfY3RybC0+YWN0aXZlLCAwKTsKLQlwX2dlc3R1cmVfY3RybC0+cXVldWVfaWQgPSAtMTsKLQlwX2dlc3R1cmVfY3RybC0+ZXZlbnQuZXZ0X2RhdGEgPSBOVUxMOwotCXBfZ2VzdHVyZV9jdHJsLT5ldmVudC5ldnRfbGVuID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgbXNtX2dlc3R1cmVfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlyZXR1cm4gbXNtX2dlc3R1cmVfbm9kZV9yZWdpc3RlcigpOwotfQotCi1tb2R1bGVfaW5pdChtc21fZ2VzdHVyZV9pbml0X21vZHVsZSk7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1TTSBHZXN0dXJlIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV9pc3AuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tc21faXNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MjkwZWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV9pc3AuYworKysgL2Rldi9udWxsCkBAIC0xLDc2NyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0KLQotI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2lzcC5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9nZW1pbmkuaD4KLQotI2luY2x1ZGUgIm1zbS5oIgotCi0jaWZkZWYgQ09ORklHX01TTV9DQU1FUkFfREVCVUcKLSNkZWZpbmUgRChmbXQsIGFyZ3MuLi4pIHByX2RlYnVnKCJtc21faXNwOiAiIGZtdCwgIyNhcmdzKQotI2Vsc2UKLSNkZWZpbmUgRChmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNkZWZpbmUgTVNNX0ZSQU1FX0FYSV9NQVhfQlVGIDMyCi0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIGluIGludGVycnVwdCBjb250ZXh0LgotICovCi0KLXZvaWQgKm1zbV9pc3Bfc3luY19hbGxvYyhpbnQgc2l6ZSwKLQkgIGdmcF90IGdmcCkKLXsKLQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqcWNtZCA9Ci0JCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fcXVldWVfY21kKSArIHNpemUsIGdmcCk7Ci0KLQlpZiAocWNtZCkgewotCQlhdG9taWNfc2V0KCZxY21kLT5vbl9oZWFwLCAxKTsKLQkJcmV0dXJuIHFjbWQgKyAxOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBtc21faXNwX3N5bmNfZnJlZSh2b2lkICpwdHIpCi17Ci0JaWYgKHB0cikgewotCQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqcWNtZCA9Ci0JCQkoc3RydWN0IG1zbV9xdWV1ZV9jbWQgKilwdHI7Ci0JCXFjbWQtLTsKLQkJaWYgKGF0b21pY19yZWFkKCZxY21kLT5vbl9oZWFwKSkKLQkJCWtmcmVlKHFjbWQpOwotCX0KLX0KLQotc3RhdGljIGludCBtc21faXNwX25vdGlmeV9WRkVfU09GX0NPVU5UX0VWVChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IG1zbV92ZmVfY2ZnX2NtZCBjZmdjbWQ7Ci0Jc3RydWN0IG1zbV9jYW12ZmVfcGFyYW1zIHZmZV9wYXJhbXM7Ci0JaW50IHJjOwotCi0JY2ZnY21kLmNtZF90eXBlID0gQ01EX1ZGRV9QSVhfU09GX0NPVU5UX1VQREFURTsKLQljZmdjbWQudmFsdWUgPSBOVUxMOwotCXZmZV9wYXJhbXMudmZlX2NmZyA9ICZjZmdjbWQ7Ci0JdmZlX3BhcmFtcy5kYXRhID0gYXJnOwotCXJjID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgY29yZSwgaW9jdGwsIDAsICZ2ZmVfcGFyYW1zKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IG1zbV9pc3BfdmZlX21zZ190b19pbWdfbW9kZShzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQkJCQlpbnQgdmZlX21zZykKLXsKLQlpbnQgaW1hZ2VfbW9kZTsKLQl1aW50MzJfdCB2ZmVfb3V0cHV0X21vZGUgPSBwbWN0bC0+dmZlX291dHB1dF9tb2RlOwotCXZmZV9vdXRwdXRfbW9kZSAmPSB+KFZGRV9PVVRQVVRTX1JESTB8VkZFX09VVFBVVFNfUkRJMSk7Ci0JaWYgKHZmZV9tc2cgPT0gVkZFX01TR19PVVRQVVRfUFJJTUFSWSkgewotCQlzd2l0Y2ggKHZmZV9vdXRwdXRfbW9kZSkgewotCQljYXNlIFZGRV9PVVRQVVRTX01BSU5fQU5EX1BSRVZJRVc6Ci0JCWNhc2UgVkZFX09VVFBVVFNfTUFJTl9BTkRfVklERU86Ci0JCWNhc2UgVkZFX09VVFBVVFNfTUFJTl9BTkRfVEhVTUI6Ci0JCWNhc2UgVkZFX09VVFBVVFNfUkFXOgotCQljYXNlIFZGRV9PVVRQVVRTX0pQRUdfQU5EX1RIVU1COgotCQkJaW1hZ2VfbW9kZSA9IE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfTUFJTjsKLQkJCWJyZWFrOwotCQljYXNlIFZGRV9PVVRQVVRTX1RIVU1CX0FORF9NQUlOOgotCQkJaW1hZ2VfbW9kZSA9IE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfVEhVTUJOQUlMOwotCQkJYnJlYWs7Ci0JCWNhc2UgVkZFX09VVFBVVFNfVklERU86Ci0JCWNhc2UgVkZFX09VVFBVVFNfVklERU9fQU5EX1BSRVZJRVc6Ci0JCQlpbWFnZV9tb2RlID0gTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9WSURFTzsKLQkJCWJyZWFrOwotCQljYXNlIFZGRV9PVVRQVVRTX1BSRVZJRVc6Ci0JCWNhc2UgVkZFX09VVFBVVFNfUFJFVklFV19BTkRfVklERU86Ci0JCQlpbWFnZV9tb2RlID0gTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9QUkVWSUVXOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpbWFnZV9tb2RlID0gLTE7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSBpZiAodmZlX21zZyA9PSBWRkVfTVNHX09VVFBVVF9TRUNPTkRBUlkpIHsKLQkJc3dpdGNoICh2ZmVfb3V0cHV0X21vZGUpIHsKLQkJY2FzZSBWRkVfT1VUUFVUU19NQUlOX0FORF9QUkVWSUVXOgotCQljYXNlIFZGRV9PVVRQVVRTX1ZJREVPX0FORF9QUkVWSUVXOgotCQkJaW1hZ2VfbW9kZSA9IE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfUFJFVklFVzsKLQkJCWJyZWFrOwotCQljYXNlIFZGRV9PVVRQVVRTX01BSU5fQU5EX1ZJREVPOgotCQljYXNlIFZGRV9PVVRQVVRTX1BSRVZJRVdfQU5EX1ZJREVPOgotCQkJaW1hZ2VfbW9kZSA9IE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfVklERU87Ci0JCQlicmVhazsKLQkJY2FzZSBWRkVfT1VUUFVUU19NQUlOX0FORF9USFVNQjoKLQkJCWltYWdlX21vZGUgPSBNU01fVjRMMl9FWFRfQ0FQVFVSRV9NT0RFX1RIVU1CTkFJTDsKLQkJCWJyZWFrOwotCQljYXNlIFZGRV9PVVRQVVRTX1RIVU1CX0FORF9NQUlOOgotCQkJaW1hZ2VfbW9kZSA9IE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfTUFJTjsKLQkJCWJyZWFrOwotCQljYXNlIFZGRV9PVVRQVVRTX0pQRUdfQU5EX1RIVU1COgotCQkJaW1hZ2VfbW9kZSA9IE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfVEhVTUJOQUlMOwotCQkJYnJlYWs7Ci0JCWNhc2UgVkZFX09VVFBVVFNfUFJFVklFVzoKLQkJY2FzZSBWRkVfT1VUUFVUU19WSURFTzoKLQkJCWltYWdlX21vZGUgPSBNU01fVjRMMl9FWFRfQ0FQVFVSRV9NT0RFX1BSRVZJRVc7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWltYWdlX21vZGUgPSAtMTsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIGlmICh2ZmVfbXNnID09IFZGRV9NU0dfT1VUUFVUX1RFUlRJQVJZMSkgewotCQlpZiAocG1jdGwtPnZmZV9vdXRwdXRfbW9kZSAmIFZGRV9PVVRQVVRTX1JESTApCi0JCQlpbWFnZV9tb2RlID0gTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9SREk7Ci0JCWVsc2UKLQkJCWltYWdlX21vZGUgPSAtMTsKLQl9IGVsc2UgaWYgKHZmZV9tc2cgPT0gVkZFX01TR19PVVRQVVRfVEVSVElBUlkyKSB7Ci0JCWlmIChwbWN0bC0+dmZlX291dHB1dF9tb2RlICYgVkZFX09VVFBVVFNfUkRJMSkKLQkJCWltYWdlX21vZGUgPSBNU01fVjRMMl9FWFRfQ0FQVFVSRV9NT0RFX1JESTE7Ci0JCWVsc2UKLQkJCWltYWdlX21vZGUgPSAtMTsKLQl9IGVsc2UgaWYgKFZGRV9NU0dfVjJYX0xJVkVTSE9UX1BSSU1BUlkgPT0gdmZlX21zZykgewotCQkJaW1hZ2VfbW9kZSA9IE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfVjJYX0xJVkVTSE9UOwotCX0gZWxzZQotCQlpbWFnZV9tb2RlID0gLTE7Ci0KLQlEKCIlcyBTZWxlY3RlZCBpbWFnZSBtb2RlICVkIHZmZSBvdXRwdXQgbW9kZSAlZCwgdmZlIG1zZyAlZFxuIiwKLQkgIF9fZnVuY19fLCBpbWFnZV9tb2RlLCBwbWN0bC0+dmZlX291dHB1dF9tb2RlLCB2ZmVfbXNnKTsKLQlyZXR1cm4gaW1hZ2VfbW9kZTsKLX0KLQotc3RhdGljIGludCBtc21faXNwX25vdGlmeV9WRkVfQlVGX0VWVChzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQkJCQkJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdm9pZCAqYXJnKQotewotCWludCByYyA9IC1FSU5WQUw7Ci0Jc3RydWN0IG1zbV92ZmVfcmVzcCAqdmRhdGEgPSAoc3RydWN0IG1zbV92ZmVfcmVzcCAqKWFyZzsKLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmIGZyZWVfYnVmLCB0ZW1wX2ZyZWVfYnVmOwotCXN0cnVjdCBtc21fY2FtdmZlX3BhcmFtcyB2ZmVfcGFyYW1zOwotCXN0cnVjdCBtc21fdmZlX2NmZ19jbWQgY2ZnY21kOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtID0gcG1jdGwtPnBjYW1fcHRyOwotCXN0cnVjdCBtc21fZnJhbWVfaW5mbyAqZnJhbWVfaW5mbyA9Ci0JCShzdHJ1Y3QgbXNtX2ZyYW1lX2luZm8gKil2ZGF0YS0+ZXZ0X21zZy5kYXRhOwotCXVpbnQzMl90IHZmZV9pZDsKLQlzdHJ1Y3QgbXNtX2NhbV9idWZfaGFuZGxlIGJ1Zl9oYW5kbGU7Ci0KLQlpZiAoIXBjYW0pIHsKLQkJcHJfZXJyKCIlcyBwY2FtIGlzIG51bGwuIHJldHVyblxuIiwgX19mdW5jX18pOwotCQltc21faXNwX3N5bmNfZnJlZSh2ZGF0YSk7Ci0JCXJldHVybiByYzsKLQl9Ci0JaWYgKGZyYW1lX2luZm8pIHsKLQkJdmZlX2lkID0gZnJhbWVfaW5mby0+cGF0aDsKLQkJYnVmX2hhbmRsZS5idWZfbG9va3VwX3R5cGUgPSBCVUZfTE9PS1VQX0JZX0lOU1RfSEFORExFOwotCQlidWZfaGFuZGxlLmluc3RfaGFuZGxlID0gZnJhbWVfaW5mby0+aW5zdF9oYW5kbGU7Ci0JfSBlbHNlIHsKLQkJdmZlX2lkID0gdmRhdGEtPmV2dF9tc2cubXNnX2lkOwotCQlidWZfaGFuZGxlLmJ1Zl9sb29rdXBfdHlwZSA9IEJVRl9MT09LVVBfQllfSU1HX01PREU7Ci0JCWJ1Zl9oYW5kbGUuaW1hZ2VfbW9kZSA9Ci0JCQltc21faXNwX3ZmZV9tc2dfdG9faW1nX21vZGUocG1jdGwsIHZmZV9pZCk7Ci0JfQotCi0Jc3dpdGNoICh2ZGF0YS0+dHlwZSkgewotCWNhc2UgVkZFX01TR19TVEFSVDoKLQljYXNlIFZGRV9NU0dfU1RBUlRfUkVDT1JESU5HOgotCWNhc2UgVkZFX01TR19QUkVWSUVXOgotCQlEKCIlcyBHb3QgVjMyX1NUQVJUXyo6IEdldHRpbmcgcGluZyBhZGRyIGlkID0gJWQiLAotCQkJCQkJX19mdW5jX18sIHZmZV9pZCk7Ci0JCW1zbV9tY3RsX3Jlc2VydmVfZnJlZV9idWYocG1jdGwsIE5VTEwsCi0JCQkJCSZidWZfaGFuZGxlLCAmZnJlZV9idWYpOwotCQljZmdjbWQuY21kX3R5cGUgPSBDTURfQ09ORklHX1BJTkdfQUREUjsKLQkJY2ZnY21kLnZhbHVlID0gJnZmZV9pZDsKLQkJdmZlX3BhcmFtcy52ZmVfY2ZnID0gJmNmZ2NtZDsKLQkJdmZlX3BhcmFtcy5kYXRhID0gKHZvaWQgKikmZnJlZV9idWY7Ci0JCXJjID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgY29yZSwgaW9jdGwsIDAsICZ2ZmVfcGFyYW1zKTsKLQkJbXNtX21jdGxfcmVzZXJ2ZV9mcmVlX2J1ZihwbWN0bCwgTlVMTCwKLQkJCQkJJmJ1Zl9oYW5kbGUsICZmcmVlX2J1Zik7Ci0JCWNmZ2NtZC5jbWRfdHlwZSA9IENNRF9DT05GSUdfUE9OR19BRERSOwotCQljZmdjbWQudmFsdWUgPSAmdmZlX2lkOwotCQl2ZmVfcGFyYW1zLnZmZV9jZmcgPSAmY2ZnY21kOwotCQl2ZmVfcGFyYW1zLmRhdGEgPSAodm9pZCAqKSZmcmVlX2J1ZjsKLQkJcmMgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBpb2N0bCwgMCwgJnZmZV9wYXJhbXMpOwotCQlicmVhazsKLQljYXNlIFZGRV9NU0dfQ0FQVFVSRToKLQkJcHJfZGVidWcoIiVzIEdvdCBWMzJfQ0FQVFVSRTogZ2V0dGluZyBidWZmZXIgZm9yIGlkID0gJWQiLAotCQkJCQkJX19mdW5jX18sIHZmZV9pZCk7Ci0JCW1zbV9tY3RsX3Jlc2VydmVfZnJlZV9idWYocG1jdGwsIE5VTEwsCi0JCQkJCSZidWZfaGFuZGxlLCAmZnJlZV9idWYpOwotCQljZmdjbWQuY21kX3R5cGUgPSBDTURfQ09ORklHX1BJTkdfQUREUjsKLQkJY2ZnY21kLnZhbHVlID0gJnZmZV9pZDsKLQkJdmZlX3BhcmFtcy52ZmVfY2ZnID0gJmNmZ2NtZDsKLQkJdmZlX3BhcmFtcy5kYXRhID0gKHZvaWQgKikmZnJlZV9idWY7Ci0JCXJjID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgY29yZSwgaW9jdGwsIDAsICZ2ZmVfcGFyYW1zKTsKLQkJdGVtcF9mcmVlX2J1ZiA9IGZyZWVfYnVmOwotCQlpZiAobXNtX21jdGxfcmVzZXJ2ZV9mcmVlX2J1ZihwbWN0bCwgTlVMTCwKLQkJCQkJJmJ1Zl9oYW5kbGUsICZmcmVlX2J1ZikpIHsKLQkJCS8qIFdyaXRlIHRoZSBzYW1lIGJ1ZmZlciBpbnRvIFBPTkcgKi8KLQkJCWZyZWVfYnVmID0gdGVtcF9mcmVlX2J1ZjsKLQkJfQotCQljZmdjbWQuY21kX3R5cGUgPSBDTURfQ09ORklHX1BPTkdfQUREUjsKLQkJY2ZnY21kLnZhbHVlID0gJnZmZV9pZDsKLQkJdmZlX3BhcmFtcy52ZmVfY2ZnID0gJmNmZ2NtZDsKLQkJdmZlX3BhcmFtcy5kYXRhID0gKHZvaWQgKikmZnJlZV9idWY7Ci0JCXJjID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgY29yZSwgaW9jdGwsIDAsICZ2ZmVfcGFyYW1zKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfTVNHX0pQRUdfQ0FQVFVSRToKLQkJRCgiJXM6VkZFX01TR19KUEVHX0NBUFRVUkUgdmRhdGEtPnR5cGUgJWRcbiIsIF9fZnVuY19fLAotCQkJdmRhdGEtPnR5cGUpOwotCQlmcmVlX2J1Zi5udW1fcGxhbmVzID0gMjsKLQkJZnJlZV9idWYuY2hfcGFkZHJbMF0gPSBwbWN0bC0+cGluZ19pbWVtX3k7Ci0JCWZyZWVfYnVmLmNoX3BhZGRyWzFdID0gcG1jdGwtPnBpbmdfaW1lbV9jYmNyOwotCQljZmdjbWQuY21kX3R5cGUgPSBDTURfQ09ORklHX1BJTkdfQUREUjsKLQkJY2ZnY21kLnZhbHVlID0gJnZmZV9pZDsKLQkJdmZlX3BhcmFtcy52ZmVfY2ZnID0gJmNmZ2NtZDsKLQkJdmZlX3BhcmFtcy5kYXRhID0gKHZvaWQgKikmZnJlZV9idWY7Ci0JCUQoIiVzOlZGRV9NU0dfSlBFR19DQVBUVVJFIHlfcGluZz0leCBjYmNyX3Bpbmc9JXhcbiIsCi0JCQlfX2Z1bmNfXywgZnJlZV9idWYuY2hfcGFkZHJbMF0sIGZyZWVfYnVmLmNoX3BhZGRyWzFdKTsKLQkJcmMgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBpb2N0bCwgMCwgJnZmZV9wYXJhbXMpOwotCQkvKiBXcml0ZSB0aGUgc2FtZSBidWZmZXIgaW50byBQT05HICovCi0JCWZyZWVfYnVmLmNoX3BhZGRyWzBdID0gcG1jdGwtPnBvbmdfaW1lbV95OwotCQlmcmVlX2J1Zi5jaF9wYWRkclsxXSA9IHBtY3RsLT5wb25nX2ltZW1fY2JjcjsKLQkJY2ZnY21kLmNtZF90eXBlID0gQ01EX0NPTkZJR19QT05HX0FERFI7Ci0JCWNmZ2NtZC52YWx1ZSA9ICZ2ZmVfaWQ7Ci0JCXZmZV9wYXJhbXMudmZlX2NmZyA9ICZjZmdjbWQ7Ci0JCXZmZV9wYXJhbXMuZGF0YSA9ICh2b2lkICopJmZyZWVfYnVmOwotCQlEKCIlczpWRkVfTVNHX0pQRUdfQ0FQVFVSRSB5X3Bvbmc9JXggY2Jjcl9wb25nPSV4XG4iLAotCQkJX19mdW5jX18sIGZyZWVfYnVmLmNoX3BhZGRyWzBdLCBmcmVlX2J1Zi5jaF9wYWRkclsxXSk7Ci0JCXJjID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgY29yZSwgaW9jdGwsIDAsICZ2ZmVfcGFyYW1zKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfTVNHX09VVFBVVF9JUlE6Ci0JCUQoIiVzIEdvdCBPVVRQVVRfSVJROiBHZXR0aW5nIGZyZWUgYnVmIGlkID0gJWQiLAotCQkJCQkJX19mdW5jX18sIHZmZV9pZCk7Ci0JCW1zbV9tY3RsX3Jlc2VydmVfZnJlZV9idWYocG1jdGwsIE5VTEwsCi0JCQkJCSZidWZfaGFuZGxlLCAmZnJlZV9idWYpOwotCQljZmdjbWQuY21kX3R5cGUgPSBDTURfQ09ORklHX0ZSRUVfQlVGX0FERFI7Ci0JCWNmZ2NtZC52YWx1ZSA9ICZ2ZmVfaWQ7Ci0JCXZmZV9wYXJhbXMudmZlX2NmZyA9ICZjZmdjbWQ7Ci0JCXZmZV9wYXJhbXMuZGF0YSA9ICh2b2lkICopJmZyZWVfYnVmOwotCQlyYyA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIGlvY3RsLCAwLCAmdmZlX3BhcmFtcyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgdmRhdGEgdHlwZTogJWRcbiIsIF9fZnVuY19fLCB2ZGF0YS0+dHlwZSk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIGluIGludGVycnVwdCBjb250ZXh0LgotICovCi1zdGF0aWMgaW50IG1zbV9pc3Bfbm90aWZ5X3ZmZShzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAl1bnNpZ25lZCBpbnQgbm90aWZpY2F0aW9uLCAgdm9pZCAqYXJnKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHY0bDJfZXZlbnQgdjRsMl9ldnQ7Ci0Jc3RydWN0IG1zbV9pc3BfZXZlbnRfY3RybCAqaXNwX2V2ZW50OwotCXN0cnVjdCBtc21fZnJlZV9idWYgYnVmOwotCi0JaWYgKCFwbWN0bCkgewotCQlwcl9lcnIoIiVzOiBubyBjb250ZXh0IGluIGRzcCBjYWxsYmFjay5cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKG5vdGlmaWNhdGlvbiA9PSBOT1RJRllfVkZFX0JVRl9FVlQpCi0JCXJldHVybiBtc21faXNwX25vdGlmeV9WRkVfQlVGX0VWVChwbWN0bCwgc2QsIGFyZyk7Ci0KLQlpZiAobm90aWZpY2F0aW9uID09IE5PVElGWV9WRkVfUElYX1NPRl9DT1VOVCkKLQkJcmV0dXJuIG1zbV9pc3Bfbm90aWZ5X1ZGRV9TT0ZfQ09VTlRfRVZUKHNkLCBhcmcpOwotCi0JaXNwX2V2ZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9pc3BfZXZlbnRfY3RybCksIEdGUF9BVE9NSUMpOwotCWlmICghaXNwX2V2ZW50KSB7Ci0JCXByX2VycigiJXMgSW5zdWZmaWNpZW50IG1lbW9yeS4gcmV0dXJuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQl2NGwyX2V2dC50eXBlID0gVjRMMl9FVkVOVF9QUklWQVRFX1NUQVJUICsKLQkJCQkJTVNNX0NBTV9SRVNQX1NUQVRfRVZUX01TRzsKLQl2NGwyX2V2dC5pZCA9IDA7Ci0KLQkqKCh1aW50MzJfdCAqKXY0bDJfZXZ0LnUuZGF0YSkgPSAodWludDMyX3QpaXNwX2V2ZW50OwotCi0JaXNwX2V2ZW50LT5yZXNwdHlwZSA9IE1TTV9DQU1fUkVTUF9TVEFUX0VWVF9NU0c7Ci0JaXNwX2V2ZW50LT5pc3BfZGF0YS5pc3BfbXNnLnR5cGUgPSBNU01fQ0FNRVJBX01TRzsKLQlpc3BfZXZlbnQtPmlzcF9kYXRhLmlzcF9tc2cubGVuID0gMDsKLQotCXN3aXRjaCAobm90aWZpY2F0aW9uKSB7Ci0JY2FzZSBOT1RJRllfSVNQX01TR19FVlQ6IHsKLQkJc3RydWN0IGlzcF9tc2dfZXZlbnQgKmlzcF9tc2cgPSAoc3RydWN0IGlzcF9tc2dfZXZlbnQgKilhcmc7Ci0KLQkJaXNwX2V2ZW50LT5pc3BfZGF0YS5pc3BfbXNnLm1zZ19pZCA9IGlzcF9tc2ctPm1zZ19pZDsKLQkJaXNwX2V2ZW50LT5pc3BfZGF0YS5pc3BfbXNnLmZyYW1lX2lkID0gaXNwX21zZy0+c29mX2NvdW50OwotCQlnZXRuc3RpbWVvZmRheSgmKGlzcF9ldmVudC0+aXNwX2RhdGEuaXNwX21zZy50aW1lc3RhbXApKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgTk9USUZZX1ZGRV9NU0dfT1VUOiB7Ci0JCXVpbnQ4X3QgbXNnaWQ7Ci0JCXN0cnVjdCBtc21fY2FtX2J1Zl9oYW5kbGUgYnVmX2hhbmRsZTsKLQkJc3RydWN0IGlzcF9tc2dfb3V0cHV0ICppc3Bfb3V0cHV0ID0KLQkJCQkoc3RydWN0IGlzcF9tc2dfb3V0cHV0ICopYXJnOwotCQlpZiAoIWlzcF9vdXRwdXQtPmJ1Zi5pbnN0X2hhbmRsZSkgewotCQkJc3dpdGNoIChpc3Bfb3V0cHV0LT5vdXRwdXRfaWQpIHsKLQkJCWNhc2UgTVNHX0lEX09VVFBVVF9QOgotCQkJCW1zZ2lkID0gVkZFX01TR19PVVRQVVRfUDsKLQkJCQlicmVhazsKLQkJCWNhc2UgTVNHX0lEX09VVFBVVF9WOgotCQkJCW1zZ2lkID0gVkZFX01TR19PVVRQVVRfVjsKLQkJCQlicmVhazsKLQkJCWNhc2UgTVNHX0lEX09VVFBVVF9UOgotCQkJCW1zZ2lkID0gVkZFX01TR19PVVRQVVRfVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgTVNHX0lEX09VVFBVVF9TOgotCQkJCW1zZ2lkID0gVkZFX01TR19PVVRQVVRfUzsKLQkJCQlicmVhazsKLQkJCWNhc2UgTVNHX0lEX09VVFBVVF9QUklNQVJZOgotCQkJCW1zZ2lkID0gVkZFX01TR19PVVRQVVRfUFJJTUFSWTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTVNHX0lEX09VVFBVVF9TRUNPTkRBUlk6Ci0JCQkJbXNnaWQgPSBWRkVfTVNHX09VVFBVVF9TRUNPTkRBUlk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1TR19JRF9PVVRQVVRfVEVSVElBUlkxOgotCQkJCW1zZ2lkID0gVkZFX01TR19PVVRQVVRfVEVSVElBUlkxOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNU0dfSURfT1VUUFVUX1RFUlRJQVJZMjoKLQkJCQltc2dpZCA9IFZGRV9NU0dfT1VUUFVUX1RFUlRJQVJZMjsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIFZGRSBvdXRwdXQgaWQ6ICVkXG4iLAotCQkJCQkgICBfX2Z1bmNfXywgaXNwX291dHB1dC0+b3V0cHV0X2lkKTsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoIXJjKSB7Ci0JCQkJYnVmX2hhbmRsZS5idWZfbG9va3VwX3R5cGUgPQotCQkJCQlCVUZfTE9PS1VQX0JZX0lNR19NT0RFOwotCQkJCWJ1Zl9oYW5kbGUuaW1hZ2VfbW9kZSA9Ci0JCQkJbXNtX2lzcF92ZmVfbXNnX3RvX2ltZ19tb2RlKHBtY3RsLCBtc2dpZCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlidWZfaGFuZGxlLmJ1Zl9sb29rdXBfdHlwZSA9IEJVRl9MT09LVVBfQllfSU5TVF9IQU5ETEU7Ci0JCQlidWZfaGFuZGxlLmluc3RfaGFuZGxlID0gaXNwX291dHB1dC0+YnVmLmluc3RfaGFuZGxlOwotCQl9Ci0JCWlzcF9ldmVudC0+aXNwX2RhdGEuaXNwX21zZy5tc2dfaWQgPQotCQkJaXNwX291dHB1dC0+b3V0cHV0X2lkOwotCQlpc3BfZXZlbnQtPmlzcF9kYXRhLmlzcF9tc2cuZnJhbWVfaWQgPQotCQkJaXNwX291dHB1dC0+ZnJhbWVDb3VudGVyOwotCQlidWYgPSBpc3Bfb3V0cHV0LT5idWY7Ci0JCW1zbV9tY3RsX2J1Zl9kb25lKHBtY3RsLCAmYnVmX2hhbmRsZSwKLQkJCSZidWYsIGlzcF9vdXRwdXQtPmZyYW1lQ291bnRlcik7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBOT1RJRllfVkZFX01TR19DT01QX1NUQVRTOiB7Ci0JCXN0cnVjdCBtc21fc3RhdHNfYnVmICpzdGF0cyA9IChzdHJ1Y3QgbXNtX3N0YXRzX2J1ZiAqKWFyZzsKLQkJc3RydWN0IG1zbV9zdGF0c19idWYgKnN0YXRzX2J1ZiA9IE5VTEw7Ci0KLQkJaXNwX2V2ZW50LT5pc3BfZGF0YS5pc3BfbXNnLm1zZ19pZCA9IE1TR19JRF9TVEFUU19DT01QT1NJVEU7Ci0JCXN0YXRzLT5hZWMuYnVmZiA9IG1zbV9wbWVtX3N0YXRzX3B0b3ZfbG9va3VwKHBtY3RsLAotCQkJCQlzdGF0cy0+YWVjLmJ1ZmYsICYoc3RhdHMtPmFlYy5mZCkpOwotCQlzdGF0cy0+YXdiLmJ1ZmYgPSBtc21fcG1lbV9zdGF0c19wdG92X2xvb2t1cChwbWN0bCwKLQkJCQkJc3RhdHMtPmF3Yi5idWZmLCAmKHN0YXRzLT5hd2IuZmQpKTsKLQkJc3RhdHMtPmFmLmJ1ZmYgPSBtc21fcG1lbV9zdGF0c19wdG92X2xvb2t1cChwbWN0bCwKLQkJCQkJc3RhdHMtPmFmLmJ1ZmYsICYoc3RhdHMtPmFmLmZkKSk7Ci0JCXN0YXRzLT5paGlzdC5idWZmID0gbXNtX3BtZW1fc3RhdHNfcHRvdl9sb29rdXAocG1jdGwsCi0JCQkJCXN0YXRzLT5paGlzdC5idWZmLCAmKHN0YXRzLT5paGlzdC5mZCkpOwotCQlzdGF0cy0+cnMuYnVmZiA9IG1zbV9wbWVtX3N0YXRzX3B0b3ZfbG9va3VwKHBtY3RsLAotCQkJCQlzdGF0cy0+cnMuYnVmZiwgJihzdGF0cy0+cnMuZmQpKTsKLQkJc3RhdHMtPmNzLmJ1ZmYgPSBtc21fcG1lbV9zdGF0c19wdG92X2xvb2t1cChwbWN0bCwKLQkJCQkJc3RhdHMtPmNzLmJ1ZmYsICYoc3RhdHMtPmNzLmZkKSk7Ci0KLQkJc3RhdHNfYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19idWYpLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFzdGF0c19idWYpIHsKLQkJCXByX2VycigiJXM6IG91dCBvZiBtZW1vcnkuXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCX0gZWxzZSB7Ci0JCQkqc3RhdHNfYnVmID0gKnN0YXRzOwotCQkJaXNwX2V2ZW50LT5pc3BfZGF0YS5pc3BfbXNnLmxlbgk9Ci0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfYnVmKTsKLQkJCWlzcF9ldmVudC0+aXNwX2RhdGEuaXNwX21zZy5kYXRhID0gc3RhdHNfYnVmOwotCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBOT1RJRllfVkZFX01TR19TVEFUUzogewotCQlzdHJ1Y3QgbXNtX3N0YXRzX2J1ZiBzdGF0czsKLQkJc3RydWN0IGlzcF9tc2dfc3RhdHMgKmlzcF9zdGF0cyA9IChzdHJ1Y3QgaXNwX21zZ19zdGF0cyAqKWFyZzsKLQotCQltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKLQkJaXNwX2V2ZW50LT5pc3BfZGF0YS5pc3BfbXNnLm1zZ19pZCA9IGlzcF9zdGF0cy0+aWQ7Ci0JCWlzcF9ldmVudC0+aXNwX2RhdGEuaXNwX21zZy5mcmFtZV9pZCA9Ci0JCQlpc3Bfc3RhdHMtPmZyYW1lQ291bnRlcjsKLQkJc3RhdHMuYnVmZmVyID0gaXNwX3N0YXRzLT5idWZmZXI7Ci0JCXN0YXRzLmZkID0gaXNwX3N0YXRzLT5mZDsKLQkJLyogYnVmX2lkeCB1c2VkIGZvciBPKDApIGxvb2t1cCAqLwotCQlzdGF0cy5idWZfaWR4ID0gaXNwX3N0YXRzLT5idWZfaWR4OwotCQlzd2l0Y2ggKGlzcF9zdGF0cy0+aWQpIHsKLQkJY2FzZSBNU0dfSURfU1RBVFNfQUVDOgotCQljYXNlIE1TR19JRF9TVEFUU19CRzoKLQkJCXN0YXRzLmFlYy5idWZmID0gc3RhdHMuYnVmZmVyOwotCQkJc3RhdHMuYWVjLmZkID0gc3RhdHMuZmQ7Ci0JCQlicmVhazsKLQkJY2FzZSBNU0dfSURfU1RBVFNfQkU6Ci0JCQlzdGF0cy5iZS5idWZmID0gc3RhdHMuYnVmZmVyOwotCQkJc3RhdHMuYmUuZmQgPSBzdGF0cy5mZDsKLQkJCWJyZWFrOwotCQljYXNlIE1TR19JRF9TVEFUU19BRjoKLQkJY2FzZSBNU0dfSURfU1RBVFNfQkY6Ci0JCQlzdGF0cy5hZi5idWZmID0gc3RhdHMuYnVmZmVyOwotCQkJc3RhdHMuYWYuZmQgPSBzdGF0cy5mZDsKLQkJCWJyZWFrOwotCQljYXNlIE1TR19JRF9TVEFUU19BV0I6Ci0JCQlzdGF0cy5hd2IuYnVmZiA9IHN0YXRzLmJ1ZmZlcjsKLQkJCXN0YXRzLmF3Yi5mZCA9IHN0YXRzLmZkOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNHX0lEX1NUQVRTX0lISVNUOgotCQkJc3RhdHMuaWhpc3QuYnVmZiA9IHN0YXRzLmJ1ZmZlcjsKLQkJCXN0YXRzLmloaXN0LmZkID0gc3RhdHMuZmQ7Ci0JCQlicmVhazsKLQkJY2FzZSBNU0dfSURfU1RBVFNfUlM6Ci0JCQlzdGF0cy5ycy5idWZmID0gc3RhdHMuYnVmZmVyOwotCQkJc3RhdHMucnMuZmQgPSBzdGF0cy5mZDsKLQkJCWJyZWFrOwotCQljYXNlIE1TR19JRF9TVEFUU19DUzoKLQkJCXN0YXRzLmNzLmJ1ZmYgPSBzdGF0cy5idWZmZXI7Ci0JCQlzdGF0cy5jcy5mZCA9IHN0YXRzLmZkOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNHX0lEX1NUQVRTX0JISVNUOgotCQkJc3RhdHMuc2tpbi5idWZmID0gc3RhdHMuYnVmZmVyOwotCQkJc3RhdHMuc2tpbi5mZCA9IHN0YXRzLmZkOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNHX0lEX1NUQVRTX0FXQl9BRUM6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2VycigiJXM6IEludmFsaWQgbXNnIHR5cGUiLCBfX2Z1bmNfXyk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoIXN0YXRzLmJ1ZmZlcikgewotCQkJcHJfZXJyKCIlczogbXNtX3BtZW1fc3RhdHNfcHRvdl9sb29rdXAgZXJyb3JcbiIsCi0JCQkJCQkJX19mdW5jX18pOwotCQkJaXNwX2V2ZW50LT5pc3BfZGF0YS5pc3BfbXNnLmxlbiA9IDA7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3QgbXNtX3N0YXRzX2J1ZiAqc3RhdHNfYnVmID0KLQkJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX2J1ZiksCi0JCQkJCQkJR0ZQX0FUT01JQyk7Ci0JCQlpZiAoIXN0YXRzX2J1ZikgewotCQkJCXByX2VycigiJXM6IG91dCBvZiBtZW1vcnkuIHN0YXRzX2lkID0gJWRcbiIsCi0JCQkJCV9fZnVuY19fLCBpc3Bfc3RhdHMtPmlkKTsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQl9IGVsc2UgewotCQkJCSpzdGF0c19idWYgPSBzdGF0czsKLQkJCQlpc3BfZXZlbnQtPmlzcF9kYXRhLmlzcF9tc2cubGVuCT0KLQkJCQkJc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfYnVmKTsKLQkJCQlpc3BfZXZlbnQtPmlzcF9kYXRhLmlzcF9tc2cuZGF0YSA9IHN0YXRzX2J1ZjsKLQkJCX0KLQkJfQotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IFVuc3VwcG9ydCBpc3Agbm90aWZpY2F0aW9uICVkXG4iLAotCQkJX19mdW5jX18sIG5vdGlmaWNhdGlvbik7Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JdjRsMl9ldmVudF9xdWV1ZShwbWN0bC0+Y29uZmlnX2RldmljZS0+Y29uZmlnX3N0YXRfZXZlbnRfcXVldWUucHZkZXYsCi0JCQkgJnY0bDJfZXZ0KTsKLQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9pc3Bfbm90aWZ5KHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCXVuc2lnbmVkIGludCBub3RpZmljYXRpb24sIHZvaWQgKmFyZykKLXsKLQlyZXR1cm4gbXNtX2lzcF9ub3RpZnlfdmZlKHBtY3RsLCBzZCwgbm90aWZpY2F0aW9uLCBhcmcpOwotfQotRVhQT1JUX1NZTUJPTChtc21faXNwX25vdGlmeSk7Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbmZpZ192ZmUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICptY3RsLCB2b2lkIF9fdXNlciAqYXJnKQotewotCXN0cnVjdCBtc21fdmZlX2NmZ19jbWQgY2ZnY21kOwotCXN0cnVjdCBheGlkYXRhIGF4aV9kYXRhOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjZmdjbWQsIGFyZywgc2l6ZW9mKGNmZ2NtZCkpKSB7Ci0JCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQltZW1zZXQoJmF4aV9kYXRhLCAwLCBzaXplb2YoYXhpX2RhdGEpKTsKLQlDREJHKCIlczogY21kX3R5cGUgJWRcbiIsIF9fZnVuY19fLCBjZmdjbWQuY21kX3R5cGUpOwotCXN3aXRjaCAoY2ZnY21kLmNtZF90eXBlKSB7Ci0JY2FzZSBDTURfU1RBVFNfQkdfRU5BQkxFOgotCWNhc2UgQ01EX1NUQVRTX0JFX0VOQUJMRToKLQljYXNlIENNRF9TVEFUU19CRl9FTkFCTEU6Ci0JY2FzZSBDTURfU1RBVFNfQkhJU1RfRU5BQkxFOgotCWNhc2UgQ01EX1NUQVRTX0FGX0VOQUJMRToKLQljYXNlIENNRF9TVEFUU19BRUNfRU5BQkxFOgotCWNhc2UgQ01EX1NUQVRTX0FXQl9FTkFCTEU6Ci0JY2FzZSBDTURfU1RBVFNfQUVDX0FXQl9FTkFCTEU6Ci0JY2FzZSBDTURfU1RBVFNfSUhJU1RfRU5BQkxFOgotCWNhc2UgQ01EX1NUQVRTX1JTX0VOQUJMRToKLQljYXNlIENNRF9TVEFUU19DU19FTkFCTEU6Ci0JCXJldHVybiBtc21faXNwX3N1YmRldl9pb2N0bChzZCwgJmNmZ2NtZCwgTlVMTCk7Ci0JY2FzZSBDTURfR0VORVJBTDoKLQljYXNlIENNRF9TVEFUU19ESVNBQkxFOgotCQlyZXR1cm4gbXNtX2lzcF9zdWJkZXZfaW9jdGwoc2QsICZjZmdjbWQsCi0JCQkJCQkJJmF4aV9kYXRhKTsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiB1bmtub3duIGNvbW1hbmQgdHlwZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBjZmdjbWQuY21kX3R5cGUpOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IG1zbV9heGlfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKm1jdGwsIHZvaWQgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IG1zbV92ZmVfY2ZnX2NtZCBjZmdjbWQ7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZ2NtZCwgYXJnLCBzaXplb2YoY2ZnY21kKSkpIHsKLQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXN3aXRjaCAoY2ZnY21kLmNtZF90eXBlKSB7Ci0JY2FzZSBDTURfQVhJX0NGR19QUklNOgotCWNhc2UgQ01EX0FYSV9DRkdfU0VDOgotCWNhc2UgQ01EX0FYSV9DRkdfWlNMOgotCWNhc2UgQ01EX1JBV19QSUNUX0FYSV9DRkc6Ci0JY2FzZSBDTURfQVhJX0NGR19QUklNX0FMTF9DSE5MUzoKLQljYXNlIENNRF9BWElfQ0ZHX1BSSU18Q01EX0FYSV9DRkdfU0VDOgotCWNhc2UgQ01EX0FYSV9DRkdfUFJJTXxDTURfQVhJX0NGR19TRUNfQUxMX0NITkxTOgotCWNhc2UgQ01EX0FYSV9DRkdfUFJJTV9BTExfQ0hOTFN8Q01EX0FYSV9DRkdfU0VDOgotCWNhc2UgQ01EX0FYSV9TVEFSVDoKLQljYXNlIENNRF9BWElfU1RPUDoKLQljYXNlIENNRF9BWElfUkVTRVQ6Ci0JY2FzZSBDTURfQVhJX0NGR19URVJUMToKLQljYXNlIENNRF9BWElfQ0ZHX1RFUlQyOgotCQkvKiBEb250IG5lZWQgdG8gcGFzcyBidWZmZXIgaW5mb3JtYXRpb24uCi0JCSAqIHN1YmRldiB3aWxsIGdldCB0aGUgYnVmZmVyIGZyb20gbWVkaWEKLQkJICogY29udHJvbGxlciBmcmVlIHF1ZXVlLgotCQkgKi8KLQkJcmV0dXJuIG1zbV9pc3Bfc3ViZGV2X2lvY3RsKHNkLCAmY2ZnY21kLCBOVUxMKTsKLQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IHVua25vd24gY29tbWFuZCB0eXBlICVkXG4iLAotCQkJX19mdW5jX18sCi0JCQljZmdjbWQuY21kX3R5cGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcHV0X3N0YXRzX2J1ZmZlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCQkJc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqbWN0bCwgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlpbnQgcmMgPSAtRUlPOwotCi0Jc3RydWN0IG1zbV9zdGF0c19idWYgYnVmOwotCXVuc2lnbmVkIGxvbmcgcHBoeTsKLQlzdHJ1Y3QgbXNtX3ZmZV9jZmdfY21kIGNmZ2NtZDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmLCBhcmcsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfYnVmKSkpIHsKLQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCUNEQkcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JcHBoeSA9IG1zbV9wbWVtX3N0YXRzX3Z0b3BfbG9va3VwKG1jdGwsIGJ1Zi5idWZmZXIsIGJ1Zi5mZCk7Ci0KLQlpZiAocHBoeSAhPSAwKSB7Ci0JCWlmIChidWYudHlwZSA9PSBTVEFUX0FGKQotCQkJY2ZnY21kLmNtZF90eXBlID0gQ01EX1NUQVRTX0FGX0JVRl9SRUxFQVNFOwotCQllbHNlIGlmIChidWYudHlwZSA9PSBTVEFUX0FFQykKLQkJCWNmZ2NtZC5jbWRfdHlwZSA9IENNRF9TVEFUU19BRUNfQlVGX1JFTEVBU0U7Ci0JCWVsc2UgaWYgKGJ1Zi50eXBlID09IFNUQVRfQVdCKQotCQkJY2ZnY21kLmNtZF90eXBlID0gQ01EX1NUQVRTX0FXQl9CVUZfUkVMRUFTRTsKLQkJZWxzZSBpZiAoYnVmLnR5cGUgPT0gU1RBVF9JSElTVCkKLQkJCWNmZ2NtZC5jbWRfdHlwZSA9IENNRF9TVEFUU19JSElTVF9CVUZfUkVMRUFTRTsKLQkJZWxzZSBpZiAoYnVmLnR5cGUgPT0gU1RBVF9SUykKLQkJCWNmZ2NtZC5jbWRfdHlwZSA9IENNRF9TVEFUU19SU19CVUZfUkVMRUFTRTsKLQkJZWxzZSBpZiAoYnVmLnR5cGUgPT0gU1RBVF9DUykKLQkJCWNmZ2NtZC5jbWRfdHlwZSA9IENNRF9TVEFUU19DU19CVUZfUkVMRUFTRTsKLQkJZWxzZSBpZiAoYnVmLnR5cGUgPT0gU1RBVF9BRUFXKQotCQkJY2ZnY21kLmNtZF90eXBlID0gQ01EX1NUQVRTX0JVRl9SRUxFQVNFOwotCQllbHNlIGlmIChidWYudHlwZSA9PSBTVEFUX0JHKQotCQkJY2ZnY21kLmNtZF90eXBlID0gQ01EX1NUQVRTX0JHX0JVRl9SRUxFQVNFOwotCQllbHNlIGlmIChidWYudHlwZSA9PSBTVEFUX0JFKQotCQkJY2ZnY21kLmNtZF90eXBlID0gQ01EX1NUQVRTX0JFX0JVRl9SRUxFQVNFOwotCQllbHNlIGlmIChidWYudHlwZSA9PSBTVEFUX0JGKQotCQkJY2ZnY21kLmNtZF90eXBlID0gQ01EX1NUQVRTX0JGX0JVRl9SRUxFQVNFOwotCQllbHNlIGlmIChidWYudHlwZSA9PSBTVEFUX0JISVNUKQotCQkJY2ZnY21kLmNtZF90eXBlID0gQ01EX1NUQVRTX0JISVNUX0JVRl9SRUxFQVNFOwotCi0JCWVsc2UgewotCQkJcHJfZXJyKCIlczogaW52YWxpZCBidWYgdHlwZSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQlidWYudHlwZSk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIHB1dF9kb25lOwotCQl9Ci0KLQkJY2ZnY21kLnZhbHVlID0gKHZvaWQgKikmYnVmOwotCi0JCXJjID0gbXNtX2lzcF9zdWJkZXZfaW9jdGwoc2QsICZjZmdjbWQsICZwcGh5KTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBOVUxMIHBoeXNpY2FsIGFkZHJlc3NcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQotcHV0X2RvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV92ZmVfc3RhdHNfYnVmX2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JdW5zaWduZWQgaW50IGNtZCwKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICptY3RsLAotCXZvaWQgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IG1zbV92ZmVfY2ZnX2NtZCBjZmdjbWQ7Ci0JaW50IHJjID0gMDsKLQl2NGwyX3NldF9zdWJkZXZfaG9zdGRhdGEoc2QsIG1jdGwpOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBNU01fQ0FNX0lPQ1RMX1NUQVRTX1JFUUJVRjogewotCQlzdHJ1Y3QgbXNtX3N0YXRzX3JlcWJ1ZiByZXFidWY7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxYnVmLCBhcmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19yZXFidWYpKSkgewotCQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCWNmZ2NtZC5jbWRfdHlwZSA9IFZGRV9DTURfU1RBVFNfUkVRQlVGOwotCWNmZ2NtZC52YWx1ZSA9ICh2b2lkICopJnJlcWJ1ZjsKLQljZmdjbWQubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfcmVxYnVmKTsKLQlyYyA9IG1zbV9pc3Bfc3ViZGV2X2lvY3RsKHNkLCAmY2ZnY21kLCAodm9pZCAqKW1jdGwtPmNsaWVudCk7Ci0JYnJlYWs7Ci0JfQotCWNhc2UgTVNNX0NBTV9JT0NUTF9TVEFUU19FTlFVRVVFQlVGOiB7Ci0JCXN0cnVjdCBtc21fc3RhdHNfYnVmX2luZm8gYnVmX2luZm87Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmX2luZm8sIGFyZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX2J1Zl9pbmZvKSkpIHsKLQkJCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQljZmdjbWQuY21kX3R5cGUgPSBWRkVfQ01EX1NUQVRTX0VOUVVFVUVCVUY7Ci0JY2ZnY21kLnZhbHVlID0gKHZvaWQgKikmYnVmX2luZm87Ci0JY2ZnY21kLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX2J1Zl9pbmZvKTsKLQlyYyA9IG1zbV9pc3Bfc3ViZGV2X2lvY3RsKHNkLCAmY2ZnY21kLCBOVUxMKTsKLQlicmVhazsKLQl9Ci0JY2FzZSBNU01fQ0FNX0lPQ1RMX1NUQVRTX0ZMVVNIX0JVRlE6IHsKLQkJc3RydWN0IG1zbV9zdGF0c19mbHVzaF9idWZxIGJ1ZnFfaW5mbzsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZidWZxX2luZm8sIGFyZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX2ZsdXNoX2J1ZnEpKSkgewotCQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCWNmZ2NtZC5jbWRfdHlwZSA9IFZGRV9DTURfU1RBVFNfRkxVU0hfQlVGUTsKLQljZmdjbWQudmFsdWUgPSAodm9pZCAqKSZidWZxX2luZm87Ci0JY2ZnY21kLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX2ZsdXNoX2J1ZnEpOwotCXJjID0gbXNtX2lzcF9zdWJkZXZfaW9jdGwoc2QsICZjZmdjbWQsIE5VTEwpOwotCWJyZWFrOwotCX0KLQljYXNlIE1TTV9DQU1fSU9DVExfU1RBVFNfVU5SRUdfQlVGOiB7Ci0JCXN0cnVjdCBtc21fc3RhdHNfcmVxYnVmIHJlcWJ1ZjsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXFidWYsIGFyZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX3JlcWJ1ZikpKSB7Ci0JCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JY2ZnY21kLmNtZF90eXBlID0gVkZFX0NNRF9TVEFUU19VTlJFR0JVRjsKLQljZmdjbWQudmFsdWUgPSAodm9pZCAqKSZyZXFidWY7Ci0JY2ZnY21kLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX3JlcWJ1Zik7Ci0JcmMgPSBtc21faXNwX3N1YmRldl9pb2N0bChzZCwgJmNmZ2NtZCwgKHZvaWQgKiltY3RsLT5jbGllbnQpOwotCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlyYyA9IC0xOwotCWJyZWFrOwotCX0KLQlDREJHKCIlc1xuIiwgX19mdW5jX18pOwotCXJldHVybiByYzsKLX0KLS8qIGNvbmZpZyBmdW5jdGlvbiBzaW1saWFyIHRvIG9yaWdhbmwgbXNtX2lvY3RsX2NvbmZpZyovCi1pbnQgbXNtX2lzcF9jb25maWcoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwsCi0JCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0KLQlpbnQgcmMgPSAtRUlOVkFMOwotCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7Ci0JaWYgKCFwbWN0bC0+dmZlX3NkZXYpIHsKLQkJcHJfZXJyKCIlcyB2ZmUgc3ViZGV2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0Jc2QgPSBwbWN0bC0+dmZlX3NkZXY7Ci0JRCgiJXM6IGNtZCAlZFxuIiwgX19mdW5jX18sIF9JT0NfTlIoY21kKSk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIE1TTV9DQU1fSU9DVExfQ09ORklHX1ZGRToKLQkJLyogQ29taW5nIGZyb20gY29uZmlnIHRocmVhZCBmb3IgdXBkYXRlICovCi0JCXJjID0gbXNtX2NvbmZpZ192ZmUoc2QsIHBtY3RsLCBhcmdwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9DQU1fSU9DVExfQVhJX0NPTkZJRzoKLQkJRCgiUmVjZWl2ZWQgTVNNX0NBTV9JT0NUTF9BWElfQ09ORklHXG4iKTsKLQkJcmMgPSBtc21fYXhpX2NvbmZpZyhzZCwgcG1jdGwsIGFyZ3ApOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTV9JT0NUTF9SRUxFQVNFX1NUQVRTX0JVRkZFUjoKLQkJcmMgPSBtc21fcHV0X3N0YXRzX2J1ZmZlcihzZCwgcG1jdGwsIGFyZ3ApOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTV9JT0NUTF9TVEFUU19SRVFCVUY6Ci0JY2FzZSBNU01fQ0FNX0lPQ1RMX1NUQVRTX0VOUVVFVUVCVUY6Ci0JY2FzZSBNU01fQ0FNX0lPQ1RMX1NUQVRTX0ZMVVNIX0JVRlE6Ci0JY2FzZSBNU01fQ0FNX0lPQ1RMX1NUQVRTX1VOUkVHX0JVRjoKLQkJcmMgPSBtc21fdmZlX3N0YXRzX2J1Zl9pb2N0bChzZCwgY21kLCBwbWN0bCwgYXJncCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JRCgiJXM6IGNtZCAlZCBET05FXG4iLCBfX2Z1bmNfXywgX0lPQ19OUihjbWQpKTsKLQotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2lzcF9jb25maWcpOwotCi1pbnQgbXNtX2lzcF9zdWJkZXZfaW9jdGwoc3RydWN0IHY0bDJfc3ViZGV2ICppc3Bfc3ViZGV2LAotCXN0cnVjdCBtc21fdmZlX2NmZ19jbWQgKmNmZ2NtZCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbXNtX2NhbXZmZV9wYXJhbXMgdmZlX3BhcmFtczsKLQl2ZmVfcGFyYW1zLnZmZV9jZmcgPSBjZmdjbWQ7Ci0JdmZlX3BhcmFtcy5kYXRhID0gZGF0YTsKLQlyZXR1cm4gdjRsMl9zdWJkZXZfY2FsbChpc3Bfc3ViZGV2LCBjb3JlLCBpb2N0bCwgMCwgJnZmZV9wYXJhbXMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV9tY3RsLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtX21jdGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVlODg5ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtX21jdGwuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NTMgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0YWlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgotCi0jaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXYuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KLQotCi0KLSNpbmNsdWRlICJtc20uaCIKLSNpbmNsdWRlICJtc21fY2FtX3NlcnZlci5oIgotI2luY2x1ZGUgIm1zbV9jc2lkLmgiCi0jaW5jbHVkZSAibXNtX2NzaWMuaCIKLSNpbmNsdWRlICJtc21fY3NpcGh5LmgiCi0jaW5jbHVkZSAibXNtX2lzcGlmLmgiCi0jaW5jbHVkZSAibXNtX3NlbnNvci5oIgotI2luY2x1ZGUgIm1zbV9hY3R1YXRvci5oIgotI2luY2x1ZGUgIm1zbV92cGUuaCIKLSNpbmNsdWRlICJtc21fdmZlMzIuaCIKLSNpbmNsdWRlICJtc21fY2FtZXJhX2VlcHJvbS5oIgotI2luY2x1ZGUgIm1zbV9jc2lfcmVnaXN0ZXIuaCIKLSNpbmNsdWRlICJtc21fZmxhc2guaCIKLQotI2lmZGVmIENPTkZJR19NU01fQ0FNRVJBX0RFQlVHCi0jZGVmaW5lIEQoZm10LCBhcmdzLi4uKSBwcl9kZWJ1ZygibXNtX21jdGw6ICIgZm10LCAjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBEKGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQotI2RlZmluZSBNU01fVjRMMl9TV0ZJX0xBVEVOQ1kgMwotLyogVkZFIHJlcXVpcmVkIGJ1ZmZlciBudW1iZXIgZm9yIHN0cmVhbWluZyAqLwotc3RhdGljIHN0cnVjdCBtc21faXNwX2NvbG9yX2ZtdCBtc21faXNwX2Zvcm1hdHNbXSA9IHsKLQl7Ci0JLm5hbWUJICAgPSAiTlYxMllVViIsCi0JLmRlcHRoCSAgPSAxMiwKLQkuYml0c3BlcnB4bCA9IDgsCi0JLmZvdXJjYwkgPSBWNEwyX1BJWF9GTVRfTlYxMiwKLQkucHhsY29kZQk9IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4LCAvKiBZVVYgc2Vuc29yICovCi0JLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKLQl9LAotCXsKLQkubmFtZQkgICA9ICJOVjIxWVVWIiwKLQkuZGVwdGgJICA9IDEyLAotCS5iaXRzcGVycHhsID0gOCwKLQkuZm91cmNjCSA9IFY0TDJfUElYX0ZNVF9OVjIxLAotCS5weGxjb2RlCT0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDgsIC8qIFlVViBzZW5zb3IgKi8KLQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAotCX0sCi0JewotCS5uYW1lCSAgID0gIk5WMTJCQVlFUiIsCi0JLmRlcHRoCSAgPSA4LAotCS5iaXRzcGVycHhsID0gOCwKLQkuZm91cmNjCSA9IFY0TDJfUElYX0ZNVF9OVjEyLAotCS5weGxjb2RlCT0gVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzFYMTAsIC8qIEJheWVyIHNlbnNvciAqLwotCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCi0JfSwKLQl7Ci0JLm5hbWUJICAgPSAiTlYyMUJBWUVSIiwKLQkuZGVwdGgJICA9IDgsCi0JLmJpdHNwZXJweGwgPSA4LAotCS5mb3VyY2MJID0gVjRMMl9QSVhfRk1UX05WMjEsCi0JLnB4bGNvZGUJPSBWNEwyX01CVVNfRk1UX1NCR0dSMTBfMVgxMCwgLyogQmF5ZXIgc2Vuc29yICovCi0JLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKLQl9LAotCXsKLQkubmFtZQkgICA9ICJOVjE2QkFZRVIiLAotCS5kZXB0aAkgID0gOCwKLQkuYml0c3BlcnB4bCA9IDgsCi0JLmZvdXJjYwkgPSBWNEwyX1BJWF9GTVRfTlYxNiwKLQkucHhsY29kZQk9IFY0TDJfTUJVU19GTVRfU0JHR1IxMF8xWDEwLCAvKiBCYXllciBzZW5zb3IgKi8KLQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAotCX0sCi0JewotCS5uYW1lCSAgID0gIk5WNjFCQVlFUiIsCi0JLmRlcHRoCSAgPSA4LAotCS5iaXRzcGVycHhsID0gOCwKLQkuZm91cmNjCSA9IFY0TDJfUElYX0ZNVF9OVjYxLAotCS5weGxjb2RlCT0gVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzFYMTAsIC8qIEJheWVyIHNlbnNvciAqLwotCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCi0JfSwKLQl7Ci0JLm5hbWUJICAgPSAiTlYyMUJBWUVSIiwKLQkuZGVwdGgJICA9IDgsCi0JLmJpdHNwZXJweGwgPSA4LAotCS5mb3VyY2MJID0gVjRMMl9QSVhfRk1UX05WMjEsCi0JLnB4bGNvZGUJPSBWNEwyX01CVVNfRk1UX1NHUkJHMTBfMVgxMCwgLyogQmF5ZXIgc2Vuc29yICovCi0JLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKLQl9LAotCXsKLQkubmFtZQkgICA9ICJZVTEyQkFZRVIiLAotCS5kZXB0aAkgID0gOCwKLQkuYml0c3BlcnB4bCA9IDgsCi0JLmZvdXJjYwkgPSBWNEwyX1BJWF9GTVRfWVVWNDIwTSwKLQkucHhsY29kZQk9IFY0TDJfTUJVU19GTVRfU0JHR1IxMF8xWDEwLCAvKiBCYXllciBzZW5zb3IgKi8KLQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAotCX0sCi0JewotCS5uYW1lCSAgID0gIlJBV0JBWUVSIiwKLQkuZGVwdGgJICA9IDEwLAotCS5iaXRzcGVycHhsID0gMTAsCi0JLmZvdXJjYwkgPSBWNEwyX1BJWF9GTVRfU0JHR1IxMCwKLQkucHhsY29kZQk9IFY0TDJfTUJVU19GTVRfU0JHR1IxMF8xWDEwLCAvKiBCYXllciBzZW5zb3IgKi8KLQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAotCX0sCi0JewotCS5uYW1lCSAgID0gIlJBV0JBWUVSIiwKLQkuZGVwdGgJICA9IDEwLAotCS5iaXRzcGVycHhsID0gMTAsCi0JLmZvdXJjYwkgPSBWNEwyX1BJWF9GTVRfU0JHR1IxMCwKLQkucHhsY29kZQk9IFY0TDJfTUJVU19GTVRfU0dSQkcxMF8xWDEwLCAvKiBCYXllciBzZW5zb3IgKi8KLQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAotCX0sCi0JewotCS5uYW1lCSAgID0gIllVWVYiLAotCS5kZXB0aAkgID0gMTYsCi0JLmJpdHNwZXJweGwgPSAxNiwKLQkuZm91cmNjCSA9IFY0TDJfUElYX0ZNVF9ZVVlWLAotCS5weGxjb2RlCT0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDgsIC8qIFlVViBzZW5zb3IgKi8KLQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAotCX0sCi0JewotCS5uYW1lCSAgID0gIlNBRUMiLAotCS5kZXB0aAkgID0gMTYsCi0JLmJpdHNwZXJweGwgPSAxNiwKLQkuZm91cmNjCSA9IFY0TDJfUElYX0ZNVF9TVEFUU19BRSwKLQkucHhsY29kZQk9IFY0TDJfTUJVU19GTVRfU0JHR1IxMF8xWDEwLCAvKiBZVVYgc2Vuc29yICovCi0JLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKLQl9LAotCXsKLQkubmFtZQkgICA9ICJTQVdCIiwKLQkuZGVwdGgJICA9IDE2LAotCS5iaXRzcGVycHhsID0gMTYsCi0JLmZvdXJjYwkgPSBWNEwyX1BJWF9GTVRfU1RBVFNfQVdCLAotCS5weGxjb2RlCT0gVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzFYMTAsIC8qIFlVViBzZW5zb3IgKi8KLQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAotCX0sCi0JewotCS5uYW1lCSAgID0gIlNBRkMiLAotCS5kZXB0aAkgID0gMTYsCi0JLmJpdHNwZXJweGwgPSAxNiwKLQkuZm91cmNjCSA9IFY0TDJfUElYX0ZNVF9TVEFUU19BRiwKLQkucHhsY29kZQk9IFY0TDJfTUJVU19GTVRfU0JHR1IxMF8xWDEwLCAvKiBZVVYgc2Vuc29yICovCi0JLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKLQl9LAotCXsKLQkubmFtZSAgICAgID0gIlNIU1QiLAotCS5kZXB0aCAgICA9IDE2LAotCS5iaXRzcGVycHhsID0gMTYsCi0JLmZvdXJjYyAgPSBWNEwyX1BJWF9GTVRfU1RBVFNfSUhTVCwKLQkucHhsY29kZSAgICAgICAgPSBWNEwyX01CVVNfRk1UX1NCR0dSMTBfMVgxMCwgLyogWVVWIHNlbnNvciAqLwotCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2dldF9zZW5zb3JfaW5mbygKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICptY3RsLAotCXZvaWQgX191c2VyICphcmcpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbXNlbnNvcl9pbmZvIGluZm87Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNkYXRhOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtID0gbWN0bC0+cGNhbV9wdHI7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLAotCQkJYXJnLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fY2Ftc2Vuc29yX2luZm8pKSkgewotCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0Jc2RhdGEgPSBtY3RsLT5zZGF0YTsKLQlEKCIlczogc2Vuc29yX25hbWUgJXNcbiIsIF9fZnVuY19fLCBzZGF0YS0+c2Vuc29yX25hbWUpOwotCi0JbWVtY3B5KCZpbmZvLm5hbWVbMF0sIHNkYXRhLT5zZW5zb3JfbmFtZSwgTUFYX1NFTlNPUl9OQU1FKTsKLQlpbmZvLmZsYXNoX2VuYWJsZWQgPSBzZGF0YS0+Zmxhc2hfZGF0YS0+Zmxhc2hfdHlwZSAhPQotCQkJCQlNU01fQ0FNRVJBX0ZMQVNIX05PTkU7Ci0JaW5mby5weGxjb2RlID0gcGNhbS0+dXNyX2ZtdHNbMF0ucHhsY29kZTsKLQlpbmZvLmZsYXNodHlwZSA9IHNkYXRhLT5mbGFzaF90eXBlOyAvKiB0d28gZmxhc2hfdHlwZXMgaGVyZT8gKi8KLQlpbmZvLmNhbWVyYV90eXBlID0gc2RhdGEtPmNhbWVyYV90eXBlOwotCS8qIHNlbnNvcl90eXBlIG5lZWRlZCB0byBhZGQgWVVWL1NPQyBpbiBwcm9iaW5nICovCi0JaW5mby5zZW5zb3JfdHlwZSA9IHNkYXRhLT5zZW5zb3JfdHlwZTsKLQlpbmZvLm1vdW50X2FuZ2xlID0gc2RhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5tb3VudF9hbmdsZTsKLQlpbmZvLmFjdHVhdG9yX2VuYWJsZWQgPSBzZGF0YS0+YWN0dWF0b3JfaW5mbyA/IDEgOiAwOwotCWluZm8uc3Ryb2JlX2ZsYXNoX2VuYWJsZWQgPSBzZGF0YS0+c3Ryb2JlX2ZsYXNoX2RhdGEgPyAxIDogMDsKLQlpbmZvLmlzcGlmX3N1cHBvcnRlZCA9IG1jdGwtPmlzcGlmX3NkZXYgPyAxIDogMDsKLQotCS8qIGNvcHkgYmFjayB0byB1c2VyIHNwYWNlICovCi0JaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywKLQkJCQkmaW5mbywKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9jYW1zZW5zb3JfaW5mbykpKSB7Ci0JCUVSUl9DT1BZX1RPX1VTRVIoKTsKLQkJcmMgPSAtRUZBVUxUOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX21jdGxfc2V0X3ZmZV9vdXRwdXRfbW9kZShzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyCi0JCQkJCSpwX21jdGwsIHZvaWQgX191c2VyICphcmcpCi17Ci0JaW50IHJjID0gMDsKLQlpZiAoY29weV9mcm9tX3VzZXIoJnBfbWN0bC0+dmZlX291dHB1dF9tb2RlLAotCQkodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihwX21jdGwtPnZmZV9vdXRwdXRfbW9kZSkpKSB7Ci0JCXByX2VycigiJXMgQ29weSBmcm9tIHVzZXIgZmFpbGVkICIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUZBVUxUOwotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCIlczogbWN0bD0weCVwLCB2ZmUgb3V0cHV0IG1vZGUgPTB4JXhcbiIsCi0JCSAgX19mdW5jX18sIHBfbWN0bCwgcF9tY3RsLT52ZmVfb3V0cHV0X21vZGUpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB1aW50OF90IG1zbV9zZW5zb3Jfc3RhdGVfY2hlY2soCi0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcF9tY3RsKQotewotCXN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsID0gTlVMTDsKLQlpZiAoIXBfbWN0bCkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFwX21jdGwtPnNlbnNvcl9zZGV2KQotCQlyZXR1cm4gMDsKLQlzX2N0cmwgPSBnZXRfc2N0cmwocF9tY3RsLT5zZW5zb3Jfc2Rldik7Ci0JaWYgKHNfY3RybC0+c2Vuc29yX3N0YXRlID09IE1TTV9TRU5TT1JfUE9XRVJfVVApCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCi0vKiBjYWxsZWQgYnkgdGhlIHNlcnZlciBvciB0aGUgY29uZmlnIG5vZGVzIHRvIGhhbmRsZSB1c2VyIHNwYWNlCi0JY29tbWFuZHMqLwotc3RhdGljIGludCBtc21fbWN0bF9jbWQoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcF9tY3RsLAotCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlpZiAoIXBfbWN0bCkgewotCQlwcl9lcnIoIiVzOiBwYXJhbSBpcyBOVUxMIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JRCgiJXM6JWQ6IGNtZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjbWQpOwotCi0JLyogLi4uIGNhbGwgc2Vuc29yLCBJU1BJRiBvciBWRUYgc3ViZGV2Ki8KLQlzd2l0Y2ggKGNtZCkgewotCQkvKiBzZW5zb3IgY29uZmlnKi8KLQljYXNlIE1TTV9DQU1fSU9DVExfR0VUX1NFTlNPUl9JTkZPOgotCQkJcmMgPSBtc21fZ2V0X3NlbnNvcl9pbmZvKHBfbWN0bCwgYXJncCk7Ci0JCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTV9JT0NUTF9TRU5TT1JfSU9fQ0ZHOgotCQlyYyA9IHY0bDJfc3ViZGV2X2NhbGwocF9tY3RsLT5zZW5zb3Jfc2RldiwKLQkJCWNvcmUsIGlvY3RsLCBWSURJT0NfTVNNX1NFTlNPUl9DRkcsIGFyZ3ApOwotCQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9DQU1fSU9DVExfT0VNOgotCSByYyA9IHY0bDJfc3ViZGV2X2NhbGwocF9tY3RsLT5zZW5zb3Jfc2RldiwKLQkJIGNvcmUsIGlvY3RsLCBWSURJT0NfTVNNX1NFTlNPUl9DRkcsIGFyZ3ApOwotCQkgYnJlYWs7Ci0KLQljYXNlIE1TTV9DQU1fSU9DVExfU0VOU09SX1Y0bDJfU19DVFJMOiB7Ci0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sIHY0bDJfY3RybDsKLQkJCUNEQkcoInN1YmRldiBjYWxsXG4iKTsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmdjRsMl9jdHJsLAotCQkJCSh2b2lkICopYXJncCwKLQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfY29udHJvbCkpKSB7Ci0JCQkJQ0RCRygiY29weSBmYWlsXG4iKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCUNEQkcoInN1YmRldiBjYWxsIG9rXG4iKTsKLQkJCXJjID0gdjRsMl9zdWJkZXZfY2FsbChwX21jdGwtPnNlbnNvcl9zZGV2LAotCQkJCWNvcmUsIHNfY3RybCwgJnY0bDJfY3RybCk7Ci0JCQlicmVhazsKLQl9Ci0KLQljYXNlIE1TTV9DQU1fSU9DVExfU0VOU09SX1Y0bDJfUVVFUllfQ1RSTDogewotCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsIHY0bDJfcWN0cmw7Ci0JCQlDREJHKCJxdWVyeSBjYWxsZWRcbiIpOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2NGwyX3FjdHJsLAotCQkJCSh2b2lkICopYXJncCwKLQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKSkpIHsKLQkJCQlDREJHKCJjb3B5IGZhaWxcbiIpOwotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJjID0gdjRsMl9zdWJkZXZfY2FsbChwX21jdGwtPnNlbnNvcl9zZGV2LAotCQkJCWNvcmUsIHF1ZXJ5Y3RybCwgJnY0bDJfcWN0cmwpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCQkgJnY0bDJfcWN0cmwsCi0JCQkJCSBzaXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQl9Ci0JCQlicmVhazsKLQl9Ci0KLQljYXNlIE1TTV9DQU1fSU9DVExfR0VUX0FDVFVBVE9SX0lORk86IHsKLQkJc3RydWN0IG1zbV9hY3R1YXRvcl9jZmdfZGF0YSBjZGF0YTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZGF0YSwKLQkJCSh2b2lkICopYXJncCwKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2FjdHVhdG9yX2NmZ19kYXRhKSkpIHsKLQkJCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJY2RhdGEuaXNfYWZfc3VwcG9ydGVkID0gMDsKLQkJcmMgPSAwOwotCi0JCWlmIChwX21jdGwtPmFjdF9zZGV2KSB7Ci0JCQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2RhdGE7Ci0KLQkJCXNkYXRhID0gcF9tY3RsLT5zZGF0YTsKLQkJCUNEQkcoIiVzOiBBY3RfY2FtX05hbWUgJWRcbiIsIF9fZnVuY19fLAotCQkJCXNkYXRhLT5hY3R1YXRvcl9pbmZvLT5jYW1fbmFtZSk7Ci0KLQkJCWNkYXRhLmlzX2FmX3N1cHBvcnRlZCA9IDE7Ci0JCQljZGF0YS5jZmcuY2FtX25hbWUgPQotCQkJCShlbnVtIGFmX2NhbWVyYV9uYW1lKXNkYXRhLT4KLQkJCQlhY3R1YXRvcl9pbmZvLT5jYW1fbmFtZTsKLQotCQkJQ0RCRygiJXM6IEFmIFN1cHBvcnQ6JWRcbiIsIF9fZnVuY19fLAotCQkJCWNkYXRhLmlzX2FmX3N1cHBvcnRlZCk7Ci0JCQlDREJHKCIlczogQWN0X25hbWU6JWRcbiIsIF9fZnVuY19fLCBjZGF0YS5jZmcuY2FtX25hbWUpOwotCi0JCX0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2FjdHVhdG9yX2NmZ19kYXRhKSkpIHsKLQkJCUVSUl9DT1BZX1RPX1VTRVIoKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIE1TTV9DQU1fSU9DVExfQUNUVUFUT1JfSU9fQ0ZHOiB7Ci0JCXN0cnVjdCBtc21fYWN0dWF0b3JfY2ZnX2RhdGEgYWN0X2RhdGE7Ci0JCWlmIChwX21jdGwtPmFjdF9zZGV2KSB7Ci0JCQlyYyA9IHY0bDJfc3ViZGV2X2NhbGwocF9tY3RsLT5hY3Rfc2RldiwKLQkJCQljb3JlLCBpb2N0bCwgVklESU9DX01TTV9BQ1RVQVRPUl9DRkcsIGFyZ3ApOwotCQl9IGVsc2UgewotCQkJcmMgPSBjb3B5X2Zyb21fdXNlcigKLQkJCQkmYWN0X2RhdGEsCi0JCQkJKHZvaWQgKilhcmdwLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2FjdHVhdG9yX2NmZ19kYXRhKSk7Ci0JCQlpZiAocmMgIT0gMCkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWFjdF9kYXRhLmlzX2FmX3N1cHBvcnRlZCA9IDA7Ci0JCQlyYyA9IGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJCSAmYWN0X2RhdGEsCi0JCQkJCSBzaXplb2Yoc3RydWN0IG1zbV9hY3R1YXRvcl9jZmdfZGF0YSkpOwotCQkJaWYgKHJjICE9IDApIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBNU01fQ0FNX0lPQ1RMX0VFUFJPTV9JT19DRkc6IHsKLQkJc3RydWN0IG1zbV9lZXByb21fY2ZnX2RhdGEgZWVwcm9tX2RhdGE7Ci0JCWlmIChwX21jdGwtPmVlcHJvbV9zZGV2KSB7Ci0JCQlyYyA9IHY0bDJfc3ViZGV2X2NhbGwocF9tY3RsLT5lZXByb21fc2RldiwKLQkJCQljb3JlLCBpb2N0bCwgVklESU9DX01TTV9FRVBST01fQ0ZHLCBhcmdwKTsKLQkJfSBlbHNlIHsKLQkJCXJjID0gY29weV9mcm9tX3VzZXIoCi0JCQkJJmVlcHJvbV9kYXRhLAotCQkJCSh2b2lkICopYXJncCwKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9lZXByb21fY2ZnX2RhdGEpKTsKLQkJCWlmIChyYyAhPSAwKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWVwcm9tX2RhdGEuaXNfZWVwcm9tX3N1cHBvcnRlZCA9IDA7Ci0JCQlyYyA9IGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJCSAmZWVwcm9tX2RhdGEsCi0JCQkJCSBzaXplb2Yoc3RydWN0IG1zbV9lZXByb21fY2ZnX2RhdGEpKTsKLQkJCWlmIChyYyAhPSAwKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgTVNNX0NBTV9JT0NUTF9HRVRfS0VSTkVMX1NZU1RFTV9USU1FOiB7Ci0JCXN0cnVjdCB0aW1ldmFsIHRpbWVzdGFtcDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0aW1lc3RhbXAsIGFyZ3AsIHNpemVvZih0aW1lc3RhbXApKSkgewotCQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0gZWxzZSB7Ci0JCQltc21fbWN0bF9nZXR0aW1lb2ZkYXkoJnRpbWVzdGFtcCk7Ci0JCQlyYyA9IGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJICZ0aW1lc3RhbXAsIHNpemVvZih0aW1lc3RhbXApKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIE1TTV9DQU1fSU9DVExfRkxBU0hfQ1RSTDogewotCQlpZiAocF9tY3RsLT5mbGFzaF9zZGV2ICYmIG1zbV9zZW5zb3Jfc3RhdGVfY2hlY2socF9tY3RsKSkKLQkJCXJjID0gdjRsMl9zdWJkZXZfY2FsbChwX21jdGwtPmZsYXNoX3NkZXYsCi0JCQkJY29yZSwgaW9jdGwsIFZJRElPQ19NU01fRkxBU0hfQ0ZHLCBhcmdwKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgTVNNX0NBTV9JT0NUTF9QSUNUX1BQOgotCQlyYyA9IG1zbV9tY3RsX3NldF9wcF9rZXkocF9tY3RsLCAodm9pZCBfX3VzZXIgKilhcmcpOwotCQlicmVhazsKLQljYXNlIE1TTV9DQU1fSU9DVExfUElDVF9QUF9ESVZFUlRfRE9ORToKLQkJcmMgPSBtc21fbWN0bF9wcF9kaXZlcnRfZG9uZShwX21jdGwsICh2b2lkIF9fdXNlciAqKWFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0NBTV9JT0NUTF9QSUNUX1BQX0RPTkU6Ci0JCXJjID0gbXNtX21jdGxfcHBfZG9uZShwX21jdGwsICh2b2lkIF9fdXNlciAqKWFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0NBTV9JT0NUTF9NQ1RMX1BPU1RfUFJPQzoKLQkJcmMgPSBtc21fbWN0bF9wcF9pb2N0bChwX21jdGwsIGNtZCwgYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQ0FNX0lPQ1RMX1JFU0VSVkVfRlJFRV9GUkFNRToKLQkJcmMgPSBtc21fbWN0bF9wcF9yZXNlcnZlX2ZyZWVfZnJhbWUocF9tY3RsLAotCQkJKHZvaWQgX191c2VyICopYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQ0FNX0lPQ1RMX1JFTEVBU0VfRlJFRV9GUkFNRToKLQkJcmMgPSBtc21fbWN0bF9wcF9yZWxlYXNlX2ZyZWVfZnJhbWUocF9tY3RsLAotCQkJKHZvaWQgX191c2VyICopYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQ0FNX0lPQ1RMX1NFVF9WRkVfT1VUUFVUX1RZUEU6Ci0JCXJjID0gbXNtX21jdGxfc2V0X3ZmZV9vdXRwdXRfbW9kZShwX21jdGwsCi0JCSAgKHZvaWQgX191c2VyICopYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQ0FNX0lPQ1RMX01DVExfRElWRVJUX0RPTkU6Ci0JCXJjID0gbXNtX21jdGxfcHBfbWN0bF9kaXZlcnRfZG9uZShwX21jdGwsCi0JCQkodm9pZCBfX3VzZXIgKilhcmcpOwotCQlicmVhazsKLQkJCS8qIElTRklGIGNvbmZpZyovCi0JY2FzZSBNU01fQ0FNX0lPQ1RMX0FYSV9DT05GSUc6Ci0JCWlmIChwX21jdGwtPmF4aV9zZGV2KSB7Ci0JCQl2NGwyX3NldF9zdWJkZXZfaG9zdGRhdGEocF9tY3RsLT5heGlfc2RldiwgcF9tY3RsKTsKLQkJCXJjID0gdjRsMl9zdWJkZXZfY2FsbChwX21jdGwtPmF4aV9zZGV2LCBjb3JlLCBpb2N0bCwKLQkJCQlWSURJT0NfTVNNX0FYSV9DRkcsICh2b2lkIF9fdXNlciAqKWFyZyk7Ci0JCX0gZWxzZQotCQkJcmMgPSBwX21jdGwtPmlzcF9jb25maWcocF9tY3RsLCBjbWQsIGFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0NBTV9JT0NUTF9JU1BJRl9JT19DRkc6Ci0JCXJjID0gdjRsMl9zdWJkZXZfY2FsbChwX21jdGwtPmlzcGlmX3NkZXYsCi0JCQljb3JlLCBpb2N0bCwgVklESU9DX01TTV9JU1BJRl9DRkcsIGFyZ3ApOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTV9JT0NUTF9DU0lQSFlfSU9fQ0ZHOgotCQlpZiAocF9tY3RsLT5jc2lwaHlfc2RldikKLQkJCXJjID0gdjRsMl9zdWJkZXZfY2FsbChwX21jdGwtPmNzaXBoeV9zZGV2LAotCQkJCWNvcmUsIGlvY3RsLCBWSURJT0NfTVNNX0NTSVBIWV9DRkcsIGFyZ3ApOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTV9JT0NUTF9DU0lDX0lPX0NGRzoKLQkJaWYgKHBfbWN0bC0+Y3NpY19zZGV2KQotCQkJcmMgPSB2NGwyX3N1YmRldl9jYWxsKHBfbWN0bC0+Y3NpY19zZGV2LAotCQkJCWNvcmUsIGlvY3RsLCBWSURJT0NfTVNNX0NTSUNfQ0ZHLCBhcmdwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9DQU1fSU9DVExfQ1NJRF9JT19DRkc6Ci0JCWlmIChwX21jdGwtPmNzaWRfc2RldikKLQkJCXJjID0gdjRsMl9zdWJkZXZfY2FsbChwX21jdGwtPmNzaWRfc2RldiwKLQkJCQljb3JlLCBpb2N0bCwgVklESU9DX01TTV9DU0lEX0NGRywgYXJncCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNX0lPQ1RMX0FYSV9JTklUOgotCQlpZiAocF9tY3RsLT5heGlfc2RldikgewotCQkJdjRsMl9zZXRfc3ViZGV2X2hvc3RkYXRhKHBfbWN0bC0+YXhpX3NkZXYsIHBfbWN0bCk7Ci0JCQlyYyA9IHY0bDJfc3ViZGV2X2NhbGwocF9tY3RsLT5heGlfc2RldiwgY29yZSwgaW9jdGwsCi0JCQkJVklESU9DX01TTV9BWElfSU5JVCwgKHZvaWQgX191c2VyICopYXJnKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTV9JT0NUTF9BWElfUkVMRUFTRToKLQkJaWYgKHBfbWN0bC0+YXhpX3NkZXYpIHsKLQkJCXY0bDJfc2V0X3N1YmRldl9ob3N0ZGF0YShwX21jdGwtPmF4aV9zZGV2LCBwX21jdGwpOwotCQkJcmMgPSB2NGwyX3N1YmRldl9jYWxsKHBfbWN0bC0+YXhpX3NkZXYsIGNvcmUsIGlvY3RsLAotCQkJCVZJRElPQ19NU01fQVhJX1JFTEVBU0UsIE5VTEwpOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyogSVNQIGNvbmZpZyovCi0JCUQoIiVzOiVkOiBnbyB0byBkZWZhdWx0LiBDYWxsaW5nIG1zbV9pc3BfY29uZmlnXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmMgPSBwX21jdGwtPmlzcF9jb25maWcocF9tY3RsLCBjbWQsIGFyZyk7Ci0JCWJyZWFrOwotCX0KLQlEKCIlczogISEhIGNtZCA9ICVkLCByYyA9ICVkXG4iLAotCQlfX2Z1bmNfXywgX0lPQ19OUihjbWQpLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9tY3RsX29wZW4oc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcF9tY3RsLAotCQkJCSBjb25zdCBjaGFyICpjb25zdCBhcHBzX2lkKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwgPSBnZXRfc2N0cmwocF9tY3RsLT5zZW5zb3Jfc2Rldik7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNpbmZvID0KLQkJKHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICopIHNfY3RybC0+c2Vuc29yZGF0YTsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9kZXZpY2VfcGxhdGZvcm1fZGF0YSAqY2FtZGV2ID0gc2luZm8tPnBkYXRhOwotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9mbGFzaF9kYXRhICpmbGFzaF9kYXRhID0gc2luZm8tPmZsYXNoX2RhdGE7Ci0JdWludDhfdCBjc2lkX2NvcmU7Ci0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAoIXBfbWN0bCkgewotCQlwcl9lcnIoIiVzOiBwYXJhbSBpcyBOVUxMIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF9sb2NrKCZwX21jdGwtPmxvY2spOwotCS8qIG9wZW4gc3ViIGRldmljZXMgLSBvbmNlIG9ubHkqLwotCWlmICghcF9tY3RsLT5vcGVuY250KSB7Ci0JCXN0cnVjdCBtc21fc2Vuc29yX2NzaV9pbmZvIGNzaV9pbmZvOwotCQl3YWtlX2xvY2soJnBfbWN0bC0+d2FrZV9sb2NrKTsKLQotCQljc2lkX2NvcmUgPSBjYW1kZXYtPmNzaWRfY29yZTsKLQkJcmMgPSBtc21fbWN0bF9maW5kX3NlbnNvcl9zdWJkZXZzKHBfbWN0bCwgY2FtZGV2LT5jc2lwaHlfY29yZSwKLQkJCWNzaWRfY29yZSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IG1zbV9tY3RsX2ZpbmRfc2Vuc29yX3N1YmRldnMgZmFpbGVkOiVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlnb3RvIHJlZ2lzdGVyX3NkZXZfZmFpbGVkOwotCQl9Ci0KLQkJLyogdGhlbiBzZW5zb3IgLSBtb3ZlIHN1YiBkZXYgbGF0ZXIgKi8KLQkJcmMgPSB2NGwyX3N1YmRldl9jYWxsKHBfbWN0bC0+c2Vuc29yX3NkZXYsIGNvcmUsIHNfcG93ZXIsIDEpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBzZW5zb3IgcG93ZXJ1cCBmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQkJZ290byBzZW5zb3Jfc2Rldl9mYWlsZWQ7Ci0JCX0KLQotCQlpZiAocF9tY3RsLT5hY3Rfc2RldikKLQkJCXJjID0gdjRsMl9zdWJkZXZfY2FsbChwX21jdGwtPmFjdF9zZGV2LAotCQkJCWNvcmUsIHNfcG93ZXIsIDEpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBhY3QgcG93ZXIgZmFpbGVkOiVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQkJZ290byBhY3RfcG93ZXJfdXBfZmFpbGVkOwotCQl9Ci0KLQkJaWYgKHBfbWN0bC0+Y3NpY19zZGV2KQotCQkJY3NpX2luZm8uaXNfY3NpYyA9IDE7Ci0JCWVsc2UKLQkJCWNzaV9pbmZvLmlzX2NzaWMgPSAwOwotCQlyYyA9IHY0bDJfc3ViZGV2X2NhbGwocF9tY3RsLT5zZW5zb3Jfc2RldiwgY29yZSwgaW9jdGwsCi0JCQkJVklESU9DX01TTV9TRU5TT1JfQ1NJRF9JTkZPLCAmY3NpX2luZm8pOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBzZW5zb3IgY3NpIHZlcnNpb24gZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJCWdvdG8gbXNtX2NzaV92ZXJzaW9uOwotCQl9Ci0KLQkJaWYgKCFwX21jdGwtPmZsYXNoX3NkZXYgJiYgZmxhc2hfZGF0YSkgewotCQkJaWYgKChmbGFzaF9kYXRhLT5mbGFzaF90eXBlID09IE1TTV9DQU1FUkFfRkxBU0hfTEVEKSAmJgotCQkJCShmbGFzaF9kYXRhLT5mbGFzaF9zcmNfaW5kZXggPj0gMCkpCi0JCQkJbXNtX21jdGxfZmluZF9mbGFzaF9zdWJkZXYocF9tY3RsLAotCQkJCQlmbGFzaF9kYXRhLT5mbGFzaF9zcmNfaW5kZXgpOwotCQl9Ci0KLQkJaWYgKHBfbWN0bC0+Zmxhc2hfc2RldiAmJiBwX21jdGwtPnNkYXRhLT5mbGFzaF9kYXRhICYmCi0JCQlwX21jdGwtPnNkYXRhLT5mbGFzaF9kYXRhLT5mbGFzaF90eXBlICE9Ci0JCQlNU01fQ0FNRVJBX0ZMQVNIX05PTkUpIHsKLQkJCXJjID0gdjRsMl9zdWJkZXZfY2FsbChwX21jdGwtPmZsYXNoX3NkZXYsIGNvcmUsIGlvY3RsLAotCQkJCQlWSURJT0NfTVNNX0ZMQVNIX0xFRF9EQVRBX0NGRywKLQkJCQkJcF9tY3RsLT5zZGF0YS0+Zmxhc2hfZGF0YSk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczogc2V0IGZsYXNoIGxlZCBmYWlsZWQgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwX21jdGwtPmZsYXNoX3NkZXYgJiYgcF9tY3RsLT5zZGF0YS0+c3Ryb2JlX2ZsYXNoX2RhdGEpIHsKLQkJCXJjID0gdjRsMl9zdWJkZXZfY2FsbChwX21jdGwtPmZsYXNoX3NkZXYsIGNvcmUsIGlvY3RsLAotCQkJCQlWSURJT0NfTVNNX0ZMQVNIX1NUUk9CRV9EQVRBX0NGRywKLQkJCQkJcF9tY3RsLT5zZGF0YS0+c3Ryb2JlX2ZsYXNoX2RhdGEpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6IHNldCBzdHJvYmUgZmxhc2ggbGVkIGZhaWxlZCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJfQotCQl9Ci0KLQkJcG1fcW9zX2FkZF9yZXF1ZXN0KCZwX21jdGwtPnBtX3Fvc19yZXFfbGlzdCwKLQkJCVBNX1FPU19DUFVfRE1BX0xBVEVOQ1ksIFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQkJcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KCZwX21jdGwtPnBtX3Fvc19yZXFfbGlzdCwKLQkJCU1TTV9WNEwyX1NXRklfTEFURU5DWSk7Ci0KLQkJcF9tY3RsLT5hcHBzX2lkID0gYXBwc19pZDsKLQkJcF9tY3RsLT5vcGVuY250Kys7Ci0JfSBlbHNlIHsKLQkJRCgiJXM6IGNhbWVyYSBpcyBhbHJlYWR5IG9wZW4iLCBfX2Z1bmNfXyk7Ci0JfQotCW11dGV4X3VubG9jaygmcF9tY3RsLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci0KLW1zbV9jc2lfdmVyc2lvbjoKLWFjdF9wb3dlcl91cF9mYWlsZWQ6Ci0JaWYgKHY0bDJfc3ViZGV2X2NhbGwocF9tY3RsLT5zZW5zb3Jfc2RldiwgY29yZSwgc19wb3dlciwgMCkgPCAwKQotCQlwcl9lcnIoIiVzOiBzZW5zb3IgcG93ZXJkb3duIGZhaWxlZDogJWRcbiIsIF9fZnVuY19fLCByYyk7Ci1zZW5zb3Jfc2Rldl9mYWlsZWQ6Ci1yZWdpc3Rlcl9zZGV2X2ZhaWxlZDoKLQl3YWtlX3VubG9jaygmcF9tY3RsLT53YWtlX2xvY2spOwotCW11dGV4X3VubG9jaygmcF9tY3RsLT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9tY3RsX3JlbGVhc2Uoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcF9tY3RsKQotewotCXN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsID0gZ2V0X3NjdHJsKHBfbWN0bC0+c2Vuc29yX3NkZXYpOwotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzaW5mbyA9Ci0JCShzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqKSBzX2N0cmwtPnNlbnNvcmRhdGE7Ci0JdjRsMl9zdWJkZXZfY2FsbChwX21jdGwtPnNlbnNvcl9zZGV2LCBjb3JlLCBpb2N0bCwKLQkJVklESU9DX01TTV9TRU5TT1JfUkVMRUFTRSwgTlVMTCk7Ci0KLQlpZiAocF9tY3RsLT5jc2ljX3NkZXYpIHsKLQkJdjRsMl9zdWJkZXZfY2FsbChwX21jdGwtPmNzaWNfc2RldiwgY29yZSwgaW9jdGwsCi0JCQlWSURJT0NfTVNNX0NTSUNfUkVMRUFTRSwgTlVMTCk7Ci0JfQotCi0JaWYgKHBfbWN0bC0+dnBlX3NkZXYpIHsKLQkJdjRsMl9zdWJkZXZfY2FsbChwX21jdGwtPnZwZV9zZGV2LCBjb3JlLCBpb2N0bCwKLQkJCVZJRElPQ19NU01fVlBFX1JFTEVBU0UsIE5VTEwpOwotCX0KLQotCWlmIChwX21jdGwtPmF4aV9zZGV2KSB7Ci0JCXY0bDJfc2V0X3N1YmRldl9ob3N0ZGF0YShwX21jdGwtPmF4aV9zZGV2LCBwX21jdGwpOwotCQl2NGwyX3N1YmRldl9jYWxsKHBfbWN0bC0+YXhpX3NkZXYsIGNvcmUsIGlvY3RsLAotCQkJVklESU9DX01TTV9BWElfUkVMRUFTRSwgTlVMTCk7Ci0JfQotCi0JaWYgKHBfbWN0bC0+Y3NpZF9zZGV2KSB7Ci0JCXY0bDJfc3ViZGV2X2NhbGwocF9tY3RsLT5jc2lkX3NkZXYsIGNvcmUsIGlvY3RsLAotCQkJVklESU9DX01TTV9DU0lEX1JFTEVBU0UsIE5VTEwpOwotCX0KLQotCWlmIChwX21jdGwtPmNzaXBoeV9zZGV2KSB7Ci0JCXY0bDJfc3ViZGV2X2NhbGwocF9tY3RsLT5jc2lwaHlfc2RldiwgY29yZSwgaW9jdGwsCi0JCQlWSURJT0NfTVNNX0NTSVBIWV9SRUxFQVNFLAotCQkJc2luZm8tPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5jc2lfbGFuZV9wYXJhbXMpOwotCX0KLQotCWlmIChwX21jdGwtPmFjdF9zZGV2KSB7Ci0JCXY0bDJfc3ViZGV2X2NhbGwocF9tY3RsLT5hY3Rfc2RldiwgY29yZSwgc19wb3dlciwgMCk7Ci0JCXBfbWN0bC0+YWN0X3NkZXYgPSBOVUxMOwotCX0KLQotCXY0bDJfc3ViZGV2X2NhbGwocF9tY3RsLT5zZW5zb3Jfc2RldiwgY29yZSwgc19wb3dlciwgMCk7Ci0KLQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJnBfbWN0bC0+cG1fcW9zX3JlcV9saXN0LAotCQkJCVBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQlwbV9xb3NfcmVtb3ZlX3JlcXVlc3QoJnBfbWN0bC0+cG1fcW9zX3JlcV9saXN0KTsKLQotCXdha2VfdW5sb2NrKCZwX21jdGwtPndha2VfbG9jayk7Ci19Ci0KLWludCBtc21fbWN0bF9pbml0X3VzZXJfZm9ybWF0cyhzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSkKLXsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gcGNhbS0+c2Vuc29yX3NkZXY7Ci0JZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIHB4bGNvZGU7Ci0JaW50IG51bWZtdF9zZW5zb3IgPSAwOwotCWludCBudW1mbXQgPSAwOwotCWludCByYyA9IDA7Ci0JaW50IGksIGo7Ci0KLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCXdoaWxlICghdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIGVudW1fbWJ1c19mbXQsIG51bWZtdF9zZW5zb3IsCi0JCQkJCQkJCSZweGxjb2RlKSkKLQkJbnVtZm10X3NlbnNvcisrOwotCi0JRCgiJXMsIG51bWZtdF9zZW5zb3IgPSAlZFxuIiwgX19mdW5jX18sIG51bWZtdF9zZW5zb3IpOwotCWlmICghbnVtZm10X3NlbnNvcikKLQkJcmV0dXJuIC1FTlhJTzsKLQotCXBjYW0tPnVzcl9mbXRzID0gdm1hbGxvYyhudW1mbXRfc2Vuc29yICogQVJSQVlfU0laRShtc21faXNwX2Zvcm1hdHMpICoKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9pc3BfY29sb3JfZm10KSk7Ci0JaWYgKCFwY2FtLT51c3JfZm10cykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBmcm9tIHNlbnNvciB0byBJU1AuLiBmaWxsIHRoZSBkYXRhIHN0cnVjdHVyZSAqLwotCWZvciAoaSA9IDA7IGkgPCBudW1mbXRfc2Vuc29yOyBpKyspIHsKLQkJcmMgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgZW51bV9tYnVzX2ZtdCwgaSwgJnB4bGNvZGUpOwotCQlEKCJyYyBpcyAgJWRcbiIsIHJjKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJdmZyZWUocGNhbS0+dXNyX2ZtdHMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0KLQkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUobXNtX2lzcF9mb3JtYXRzKTsgaisrKSB7Ci0JCQkvKiBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGZvcm1hdCAqLwotCQkJaWYgKHB4bGNvZGUgPT0gbXNtX2lzcF9mb3JtYXRzW2pdLnB4bGNvZGUpIHsKLQkJCQlwY2FtLT51c3JfZm10c1tudW1mbXRdID0gbXNtX2lzcF9mb3JtYXRzW2pdOwotCQkJCUQoInBjYW0tPnVzcl9mbXRzPTB4JXhcbiIsICh1MzIpcGNhbS0+dXNyX2ZtdHMpOwotCQkJCUQoImZvcm1hdCBweGxjb2RlIDB4JXggKDB4JXgpIGZvdW5kXG4iLAotCQkJCQkgIHBjYW0tPnVzcl9mbXRzW251bWZtdF0ucHhsY29kZSwKLQkJCQkJICBwY2FtLT51c3JfZm10c1tudW1mbXRdLmZvdXJjYyk7Ci0JCQkJbnVtZm10Kys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwY2FtLT5udW1fZm10cyA9IG51bWZtdDsKLQotCWlmIChudW1mbXQgPT0gMCkgewotCQlwcl9lcnIoIiVzOiBObyBzdXBwb3J0ZWQgZm9ybWF0cy5cbiIsIF9fZnVuY19fKTsKLQkJdmZyZWUocGNhbS0+dXNyX2ZtdHMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlEKCJGb3VuZCAlZCBzdXBwb3J0ZWQgZm9ybWF0cy5cbiIsIHBjYW0tPm51bV9mbXRzKTsKLQkvKiBzZXQgdGhlIGRlZmF1bHQgcHhsY29kZSwgaW4gYW55IGNhc2UsIGl0IHdpbGwgYmUgc2V0IHRocm91Z2gKLQkgKiBzZXRmbXQgKi8KLQlyZXR1cm4gMDsKLX0KLQotLyogdGhpcyBmdW5jdGlvbiBwbHVnIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHY0bDJfc3ViZGV2ICovCi1pbnQgbXNtX21jdGxfaW5pdChzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSkKLXsKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCA9IE5VTEw7Ci0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAoIXBjYW0pIHsKLQkJcHJfZXJyKCIlczogcGFyYW0gaXMgTlVMTCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXBjYW0tPm1jdGxfaGFuZGxlID0gbXNtX2NhbV9zZXJ2ZXJfZ2V0X21jdGxfaGFuZGxlKCk7Ci0JaWYgKHBjYW0tPm1jdGxfaGFuZGxlID09IDApIHsKLQkJcHJfZXJyKCIlczogY2Fubm90IGdldCBtY3RsIGhhbmRsZSIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcG1jdGwgPSBtc21fY2FtX3NlcnZlcl9nZXRfbWN0bChwY2FtLT5tY3RsX2hhbmRsZSk7Ci0JaWYgKCFwbWN0bCkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIG1jdGwgY29udHJvbGxlciIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jd2FrZV9sb2NrX2luaXQoJnBtY3RsLT53YWtlX2xvY2ssIFdBS0VfTE9DS19TVVNQRU5ELCAibXNtX2NhbWVyYSIpOwotCW11dGV4X2luaXQoJnBtY3RsLT5sb2NrKTsKLQlwbWN0bC0+b3BlbmNudCA9IDA7Ci0KLQkvKiBpbml0IG1vZHVsZSBvcGVyYXRpb25zKi8KLQlwbWN0bC0+bWN0bF9vcGVuID0gbXNtX21jdGxfb3BlbjsKLQlwbWN0bC0+bWN0bF9jbWQgPSBtc21fbWN0bF9jbWQ7Ci0JcG1jdGwtPm1jdGxfcmVsZWFzZSA9IG1zbV9tY3RsX3JlbGVhc2U7Ci0JcG1jdGwtPmlzcF9jb25maWcgPSBtc21faXNwX2NvbmZpZzsKLQlwbWN0bC0+aXNwX25vdGlmeSA9IG1zbV9pc3Bfbm90aWZ5OwotCi0JLyogaW5pdCBtY3RsIGJ1ZiAqLwotCW1zbV9tY3RsX2J1Zl9pbml0KHBjYW0pOwotCW1lbXNldCgmcG1jdGwtPnBwX2luZm8sIDAsIHNpemVvZihwbWN0bC0+cHBfaW5mbykpOwotCXBtY3RsLT52ZmVfb3V0cHV0X21vZGUgPSAwOwotCXNwaW5fbG9ja19pbml0KCZwbWN0bC0+cHBfaW5mby5sb2NrKTsKLQotCXBtY3RsLT5mbGFzaF9zZGV2ID0gcGNhbS0+Zmxhc2hfc2RldjsKLQlwbWN0bC0+YWN0X3NkZXYgPSBwY2FtLT5hY3Rfc2RldjsKLQlwbWN0bC0+ZWVwcm9tX3NkZXYgPSBwY2FtLT5lZXByb21fc2RldjsKLQlwbWN0bC0+c2Vuc29yX3NkZXYgPSBwY2FtLT5zZW5zb3Jfc2RldjsKLQlwbWN0bC0+c2RhdGEgPSBwY2FtLT5zZGF0YTsKLQl2NGwyX3NldF9zdWJkZXZfaG9zdGRhdGEocGNhbS0+c2Vuc29yX3NkZXYsIHBtY3RsKTsKLQotI2lmZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0JcG1jdGwtPmNsaWVudCA9IG1zbV9pb25fY2xpZW50X2NyZWF0ZSgtMSwgImNhbWVyYSIpOwotCWtyZWZfaW5pdCgmcG1jdGwtPnJlZmNvdW50KTsKLSNlbmRpZgotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fbWN0bF9mcmVlKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwgPSBOVUxMOwotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlwbWN0bCA9IG1zbV9jYW1fc2VydmVyX2dldF9tY3RsKHBjYW0tPm1jdGxfaGFuZGxlKTsKLQlpZiAoIXBtY3RsKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgbWN0bCBjb250cm9sbGVyIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF9kZXN0cm95KCZwbWN0bC0+bG9jayk7Ci0Jd2FrZV9sb2NrX2Rlc3Ryb3koJnBtY3RsLT53YWtlX2xvY2spOwotCS8qY2xlYXIgb3V0IG1jdGwgZmllbGRzKi8KLQltZW1zZXQocG1jdGwsIDAsIHNpemVvZihzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyKSk7Ci0JbXNtX2NhbV9zZXJ2ZXJfZnJlZV9tY3RsKHBjYW0tPm1jdGxfaGFuZGxlKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIG1jdGwgbm9kZSB2NGwyX2ZpbGVfb3BlcmF0aW9ucyAqLwotc3RhdGljIGludCBtc21fbWN0bF9kZXZfb3BlbihzdHJ1Y3QgZmlsZSAqZikKLXsKLQlpbnQgcmMgPSAtRUlOVkFMLCBpOwotCS8qIGdldCB0aGUgdmlkZW8gZGV2aWNlICovCi0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0gID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3Q7Ci0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGw7Ci0KLQlpZiAoZiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMgOjogY2Fubm90IG9wZW4gdmlkZW8gZHJpdmVyIGRhdGEiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByYzsKLQl9Ci0JcGNhbSA9IHZpZGVvX2RydmRhdGEoZik7Ci0KLQlpZiAoIXBjYW0pIHsKLQkJcHJfZXJyKCIlcyBOVUxMIHBvaW50ZXIgcGFzc2VkIGluIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JRCgiJXMgOiBFIHVzZV9jb3VudCAlZCIsIF9fZnVuY19fLCBwY2FtLT5tY3RsX25vZGUudXNlX2NvdW50KTsKLQltdXRleF9sb2NrKCZwY2FtLT5tY3RsX25vZGUuZGV2X2xvY2spOwotCWZvciAoaSA9IDA7IGkgPCBNU01fREVWX0lOU1RfTUFYOyBpKyspIHsKLQkJaWYgKHBjYW0tPm1jdGxfbm9kZS5kZXZfaW5zdFtpXSA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JfQotCS8qIGlmIG5vIGluc3RhbmNlIGlzIGF2YWlsYWJsZSwgcmV0dXJuIGVycm9yICovCi0JaWYgKGkgPT0gTVNNX0RFVl9JTlNUX01BWCkgewotCQltdXRleF91bmxvY2soJnBjYW0tPm1jdGxfbm9kZS5kZXZfbG9jayk7Ci0JCXJldHVybiByYzsKLQl9Ci0JcGNhbV9pbnN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCksIEdGUF9LRVJORUwpOwotCWlmICghcGNhbV9pbnN0KSB7Ci0JCW11dGV4X3VubG9jaygmcGNhbS0+bWN0bF9ub2RlLmRldl9sb2NrKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXBjYW1faW5zdC0+c2Vuc29yX3B4bGNvZGUgPSBwY2FtLT51c3JfZm10c1swXS5weGxjb2RlOwotCXBjYW1faW5zdC0+bXlfaW5kZXggPSBpOwotCXBjYW1faW5zdC0+cGNhbSA9IHBjYW07Ci0JbXV0ZXhfaW5pdCgmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCXBjYW0tPm1jdGxfbm9kZS5kZXZfaW5zdFtpXSA9IHBjYW1faW5zdDsKLQotCUQoIiVzIHBjYW1faW5zdCAlcCBteV9pbmRleCA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJcGNhbV9pbnN0LCBwY2FtX2luc3QtPm15X2luZGV4KTsKLQlyYyA9IG1zbV9jYW1fc2VydmVyX29wZW5fbWN0bF9zZXNzaW9uKHBjYW0sCi0JCSZwY2FtLT5tY3RsX25vZGUuYWN0aXZlKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IG1jdGwgc2Vzc2lvbiBvcGVuIGZhaWxlZCAlZCIsIF9fZnVuY19fLCByYyk7Ci0JCW11dGV4X3VubG9jaygmcGNhbS0+bWN0bF9ub2RlLmRldl9sb2NrKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXBtY3RsID0gbXNtX2NhbV9zZXJ2ZXJfZ2V0X21jdGwocGNhbS0+bWN0bF9oYW5kbGUpOwotCWlmICghcG1jdGwpIHsKLQkJcHJfZXJyKCIlcyBtY3RsIE5VTEwhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlEKCIlcyBhY3RpdmUgJWRcbiIsIF9fZnVuY19fLCBwY2FtLT5tY3RsX25vZGUuYWN0aXZlKTsKLQltc21fc2V0dXBfdjRsMl9ldmVudF9xdWV1ZSgmcGNhbV9pbnN0LT5ldmVudEhhbmRsZSwKLQkJCXBjYW0tPm1jdGxfbm9kZS5wdmRldik7Ci0KLQlwY2FtX2luc3QtPnZicXVldWVfaW5pdGlhbGl6ZWQgPSAwOwotCWtyZWZfZ2V0KCZwbWN0bC0+cmVmY291bnQpOwotCWYtPnByaXZhdGVfZGF0YSA9ICZwY2FtX2luc3QtPmV2ZW50SGFuZGxlOwotCi0JRCgiZi0+cHJpdmF0ZV9kYXRhID0gMHgleCwgcGNhbSA9IDB4JXhcbiIsCi0JCSh1MzIpZi0+cHJpdmF0ZV9kYXRhLCAodTMyKXBjYW1faW5zdCk7Ci0KLQlwY2FtLT5tY3RsX25vZGUudXNlX2NvdW50Kys7Ci0JbXV0ZXhfdW5sb2NrKCZwY2FtLT5tY3RsX25vZGUuZGV2X2xvY2spOwotCUQoIiVzIDogWCAiLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IG1zbV9tY3RsX2Rldl9wb2xsKHN0cnVjdCBmaWxlICpmLAotCQkJCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdDsKLQlwY2FtX2luc3QgPSBjb250YWluZXJfb2YoZi0+cHJpdmF0ZV9kYXRhLAotCQkJc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCwgZXZlbnRIYW5kbGUpOwotCXBjYW0gPSBwY2FtX2luc3QtPnBjYW07Ci0KLQlEKCIlcyA6IEUgcGNhbV9pbnN0ID0gJXAiLCBfX2Z1bmNfXywgcGNhbV9pbnN0KTsKLQlpZiAoIXBjYW0pIHsKLQkJcHJfZXJyKCIlcyBOVUxMIHBvaW50ZXIgb2YgY2FtZXJhIGRldmljZSFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcG9sbF93YWl0KGYsICYocGNhbV9pbnN0LT5ldmVudEhhbmRsZS53YWl0KSwgd2FpdCk7Ci0JaWYgKHY0bDJfZXZlbnRfcGVuZGluZygmcGNhbV9pbnN0LT5ldmVudEhhbmRsZSkpIHsKLQkJcmMgfD0gUE9MTFBSSTsKLQkJRCgiJXMgRXZlbnQgYXZhaWxhYmxlIG9uIG1jdGwgbm9kZSAiLCBfX2Z1bmNfXyk7Ci0JfQotCi0JRCgiJXMgcG9sbCBvbiB2YjJcbiIsIF9fZnVuY19fKTsKLQlpZiAoIXBjYW1faW5zdC0+dmlkX2J1ZnEuc3RyZWFtaW5nKSB7Ci0JCUQoIiVzIHZpZF9idWZxLnN0cmVhbWluZyBpcyBvZmYsIGluc3Q9MHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgKHUzMilwY2FtX2luc3QpOwotCQlyZXR1cm4gcmM7Ci0JfQotCXJjIHw9IHZiMl9wb2xsKCZwY2FtX2luc3QtPnZpZF9idWZxLCBmLCB3YWl0KTsKLQotCUQoIiVzIDogWCAiLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9tY3RsX2Rldl9jbG9zZShzdHJ1Y3QgZmlsZSAqZikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdDsKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bDsKLQlwY2FtX2luc3QgPSBjb250YWluZXJfb2YoZi0+cHJpdmF0ZV9kYXRhLAotCQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0LCBldmVudEhhbmRsZSk7Ci0JcGNhbSA9IHBjYW1faW5zdC0+cGNhbTsKLQotCUQoIiVzIDogRSAiLCBfX2Z1bmNfXyk7Ci0JaWYgKCFwY2FtKSB7Ci0JCXByX2VycigiJXMgTlVMTCBwb2ludGVyIG9mIGNhbWVyYSBkZXZpY2UhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXBtY3RsID0gbXNtX2NhbV9zZXJ2ZXJfZ2V0X21jdGwocGNhbS0+bWN0bF9oYW5kbGUpOwotCW11dGV4X2xvY2soJnBjYW0tPm1jdGxfbm9kZS5kZXZfbG9jayk7Ci0JbXV0ZXhfbG9jaygmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCUQoIiVzIDogYWN0aXZlICVkICIsIF9fZnVuY19fLCBwY2FtLT5tY3RsX25vZGUuYWN0aXZlKTsKLQlpZiAocGNhbS0+bWN0bF9ub2RlLmFjdGl2ZSA9PSAxKSB7Ci0JCXJjID0gbXNtX2NhbV9zZXJ2ZXJfY2xvc2VfbWN0bF9zZXNzaW9uKHBjYW0pOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBtY3RsIHNlc3Npb24gY2xvc2UgZmFpbGVkICVkIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJbXV0ZXhfdW5sb2NrKCZwY2FtLT5tY3RsX25vZGUuZGV2X2xvY2spOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCXBtY3RsID0gTlVMTDsKLQl9Ci0JcGNhbV9pbnN0LT5zdHJlYW1vbiA9IDA7Ci0JcGNhbS0+bWN0bF9ub2RlLnVzZV9jb3VudC0tOwotCXBjYW0tPm1jdGxfbm9kZS5kZXZfaW5zdF9tYXBbcGNhbV9pbnN0LT5pbWFnZV9tb2RlXSA9IE5VTEw7Ci0JaWYgKHBjYW1faW5zdC0+dmJxdWV1ZV9pbml0aWFsaXplZCkKLQkJdmIyX3F1ZXVlX3JlbGVhc2UoJnBjYW1faW5zdC0+dmlkX2J1ZnEpOwotCUQoIiVzIENsb3NpbmcgZG93biBpbnN0YW5jZSAlcCAiLCBfX2Z1bmNfXywgcGNhbV9pbnN0KTsKLQlwY2FtLT5tY3RsX25vZGUuZGV2X2luc3RbcGNhbV9pbnN0LT5teV9pbmRleF0gPSBOVUxMOwotCW1zbV9kZXN0cm95X3Y0bDJfZXZlbnRfcXVldWUoJnBjYW1faW5zdC0+ZXZlbnRIYW5kbGUpOwotCUNMUl9NQ1RMUFBfSU5TVF9JRFgocGNhbV9pbnN0LT5pbnN0X2hhbmRsZSk7Ci0JQ0xSX0RFVklEX01PREUocGNhbV9pbnN0LT5pbnN0X2hhbmRsZSk7Ci0JQ0xSX0lNR19NT0RFKHBjYW1faW5zdC0+aW5zdF9oYW5kbGUpOwotCW11dGV4X3VubG9jaygmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCW11dGV4X2Rlc3Ryb3koJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQotCWtmcmVlKHBjYW1faW5zdCk7Ci0JZi0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQlpZiAoTlVMTCAhPSBwbWN0bCkgewotCQlEKCIlcyA6IHJlbGVhc2UgaW9uIGNsaWVudCIsIF9fZnVuY19fKTsKLQkJa3JlZl9wdXQoJnBtY3RsLT5yZWZjb3VudCwgbXNtX3JlbGVhc2VfaW9uX2NsaWVudCk7Ci0JfQotCW11dGV4X3VubG9jaygmcGNhbS0+bWN0bF9ub2RlLmRldl9sb2NrKTsKLQlEKCIlcyA6IHVzZV9jb3VudCAlZCBYICIsIF9fZnVuY19fLCBwY2FtLT5tY3RsX25vZGUudXNlX2NvdW50KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgZ19tc21fbWN0bF9mb3BzID0gewotCS5vd25lciAgID0gVEhJU19NT0RVTEUsCi0JLm9wZW4JPSBtc21fbWN0bF9kZXZfb3BlbiwKLQkucG9sbAk9IG1zbV9tY3RsX2Rldl9wb2xsLAotCS5yZWxlYXNlID0gbXNtX21jdGxfZGV2X2Nsb3NlLAotCS51bmxvY2tlZF9pb2N0bCA9IHZpZGVvX2lvY3RsMiwKLX07Ci0KLS8qCi0gKgotICogaW1wbGVtZW50YXRpb24gb2YgbWN0bCBub2RlIHY0bDJfaW9jdGxfb3BzCi0gKgotICovCi1zdGF0aWMgaW50IG1zbV9tY3RsX3Y0bDJfcXVlcnljYXAoc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0JCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqcGNhcHMpCi17Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW07Ci0KLQlpZiAoZiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMgOjogTlVMTCBmaWxlIHBvaW50ZXIiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXBjYW0gPSB2aWRlb19kcnZkYXRhKGYpOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQotCWlmICghcGNhbSkgewotCQlwcl9lcnIoIiVzIE5VTEwgcG9pbnRlciBwYXNzZWQgaW4hXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN0cmxjcHkocGNhcHMtPmRyaXZlciwgcGNhbS0+bWVkaWFfZGV2LmRldi0+ZHJpdmVyLT5uYW1lLAotCQkJc2l6ZW9mKHBjYXBzLT5kcml2ZXIpKTsKLQlwY2Fwcy0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fbWN0bF92NGwyX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZiwgdm9pZCAqcGN0eCwKLQkJCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnBxY3RybCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fbWN0bF92NGwyX2dfY3RybChzdHJ1Y3QgZmlsZSAqZiwgdm9pZCAqcGN0eCwKLQkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqYykKLXsKLQlpbnQgcmMgPSAwOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fbWN0bF92NGwyX3NfY3RybChzdHJ1Y3QgZmlsZSAqZiwgdm9pZCAqcGN0eCwKLQkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtICA9IHZpZGVvX2RydmRhdGEoZik7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0OwotCXBjYW1faW5zdCA9IGNvbnRhaW5lcl9vZihmLT5wcml2YXRlX2RhdGEsCi0JCQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0LCBldmVudEhhbmRsZSk7Ci0KLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCi0JV0FSTl9PTihwY3R4ICE9IGYtPnByaXZhdGVfZGF0YSk7Ci0JbXV0ZXhfbG9jaygmcGNhbS0+bWN0bF9ub2RlLmRldl9sb2NrKTsKLQlpZiAoY3RybC0+aWQgPT0gTVNNX1Y0TDJfUElEX1BQX1BMQU5FX0lORk8pIHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwY2FtX2luc3QtPnBsYW5lX2luZm8sCi0JCQkJCSh2b2lkICopY3RybC0+dmFsdWUsCi0JCQkJCXNpemVvZihzdHJ1Y3QgaW1nX3BsYW5lX2luZm8pKSkgewotCQkJcHJfZXJyKCIlcyBpbnN0ICVwIENvcHlpbmcgcGxhbmVfaW5mbyBmYWlsZWQgIiwKLQkJCQkJX19mdW5jX18sIHBjYW1faW5zdCk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJRCgiJXMgaW5zdCAlcCBnb3QgcGxhbmUgaW5mbzogbnVtX3BsYW5lcyA9ICVkLCIKLQkJCQkicGxhbmUgc2l6ZSA9ICVsZCAlbGQgIiwgX19mdW5jX18sIHBjYW1faW5zdCwKLQkJCQlwY2FtX2luc3QtPnBsYW5lX2luZm8ubnVtX3BsYW5lcywKLQkJCQlwY2FtX2luc3QtPnBsYW5lX2luZm8ucGxhbmVbMF0uc2l6ZSwKLQkJCQlwY2FtX2luc3QtPnBsYW5lX2luZm8ucGxhbmVbMV0uc2l6ZSk7Ci0JfSBlbHNlCi0JCXByX2VycigiJXMgVW5zdXBwb3J0ZWQgU19DVFJMIFZhbHVlICIsIF9fZnVuY19fKTsKLQotCW11dGV4X3VubG9jaygmcGNhbS0+bWN0bF9ub2RlLmRldl9sb2NrKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fbWN0bF92NGwyX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0JCQkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnBiKQotewotCWludCByYyA9IDAsIGksIGo7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0OwotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtID0gdmlkZW9fZHJ2ZGF0YShmKTsKLQlwY2FtX2luc3QgPSBjb250YWluZXJfb2YoZi0+cHJpdmF0ZV9kYXRhLAotCQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0LCBldmVudEhhbmRsZSk7Ci0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQotCW11dGV4X2xvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQlpZiAoIXBjYW1faW5zdC0+dmJxdWV1ZV9pbml0aWFsaXplZCAmJiBwYi0+Y291bnQpIHsKLQkJcG1jdGwgPSBtc21fY2FtX3NlcnZlcl9nZXRfbWN0bChwY2FtLT5tY3RsX2hhbmRsZSk7Ci0JCWlmIChwbWN0bCA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIiVzIEludmFsaWQgbWN0bCBwdHIiLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlwbWN0bC0+bWN0bF92YnF1ZXVlX2luaXQocGNhbV9pbnN0LCAmcGNhbV9pbnN0LT52aWRfYnVmcSwKLQkJCXBiLT50eXBlKTsKLQkJcGNhbV9pbnN0LT52YnF1ZXVlX2luaXRpYWxpemVkID0gMTsKLQl9Ci0JcmMgPSB2YjJfcmVxYnVmcygmcGNhbV9pbnN0LT52aWRfYnVmcSwgcGIpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyByZXFidWZzIGZhaWxlZCAlZCAiLCBfX2Z1bmNfXywgcmMpOwotCQltdXRleF91bmxvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlpZiAoIXBiLT5jb3VudCkgewotCQkvKiBEZWFsbG9jYXRpb24uIGZyZWUgYnVmX29mZnNldCBhcnJheSAqLwotCQlEKCIlcyBJbnN0ICVwIGZyZWVpbmcgYnVmZmVyIG9mZnNldHMgYXJyYXkiLAotCQkJX19mdW5jX18sIHBjYW1faW5zdCk7Ci0JCWZvciAoaiA9IDAgOyBqIDwgcGNhbV9pbnN0LT5idWZfY291bnQgOyBqKyspIHsKLQkJCWtmcmVlKHBjYW1faW5zdC0+YnVmX29mZnNldFtqXSk7Ci0JCQlwY2FtX2luc3QtPmJ1Zl9vZmZzZXRbal0gPSBOVUxMOwotCQl9Ci0JCWtmcmVlKHBjYW1faW5zdC0+YnVmX29mZnNldCk7Ci0JCXBjYW1faW5zdC0+YnVmX29mZnNldCA9IE5VTEw7Ci0JCS8qIElmIHRoZSB1c2Vyc3BhY2UgaGFzIGRlYWxsb2NhdGVkIGFsbCB0aGUKLQkJICogYnVmZmVycywgdGhlbiByZWxlYXNlIHRoZSB2YjIgcXVldWUgKi8KLQkJaWYgKHBjYW1faW5zdC0+dmJxdWV1ZV9pbml0aWFsaXplZCkgewotCQkJdmIyX3F1ZXVlX3JlbGVhc2UoJnBjYW1faW5zdC0+dmlkX2J1ZnEpOwotCQkJcGNhbV9pbnN0LT52YnF1ZXVlX2luaXRpYWxpemVkID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCUQoIiVzIEluc3QgJXAgQWxsb2NhdGluZyBidWZfb2Zmc2V0IGFycmF5IiwKLQkJCV9fZnVuY19fLCBwY2FtX2luc3QpOwotCQkvKiBBbGxvY2F0aW9uLiBhbGxvY2F0ZSBidWZfb2Zmc2V0IGFycmF5ICovCi0JCXBjYW1faW5zdC0+YnVmX29mZnNldCA9IChzdHJ1Y3QgbXNtX2NhbV9idWZfb2Zmc2V0ICoqKQotCQkJa3phbGxvYyhwYi0+Y291bnQgKiBzaXplb2Yoc3RydWN0IG1zbV9jYW1fYnVmX29mZnNldCAqKSwKLQkJCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCFwY2FtX2luc3QtPmJ1Zl9vZmZzZXQpIHsKLQkJCXByX2VycigiJXMgb3V0IG9mIG1lbW9yeSAiLCBfX2Z1bmNfXyk7Ci0JCQltdXRleF91bmxvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBwYi0+Y291bnQ7IGkrKykgewotCQkJcGNhbV9pbnN0LT5idWZfb2Zmc2V0W2ldID0KLQkJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2NhbV9idWZfb2Zmc2V0KSAqCi0JCQkJcGNhbV9pbnN0LT5wbGFuZV9pbmZvLm51bV9wbGFuZXMsIEdGUF9LRVJORUwpOwotCQkJaWYgKCFwY2FtX2luc3QtPmJ1Zl9vZmZzZXRbaV0pIHsKLQkJCQlwcl9lcnIoIiVzIG91dCBvZiBtZW1vcnkgIiwgX19mdW5jX18pOwotCQkJCWZvciAoaiA9IGktMSA7IGogPj0gMDsgai0tKSB7Ci0JCQkJCWtmcmVlKHBjYW1faW5zdC0+YnVmX29mZnNldFtqXSk7Ci0JCQkJCXBjYW1faW5zdC0+YnVmX29mZnNldFtqXSA9IE5VTEw7Ci0JCQkJfQotCQkJCWtmcmVlKHBjYW1faW5zdC0+YnVmX29mZnNldCk7Ci0JCQkJcGNhbV9pbnN0LT5idWZfb2Zmc2V0ID0gTlVMTDsKLQkJCQltdXRleF91bmxvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQkJfQotCX0KLQlwY2FtX2luc3QtPmJ1Zl9jb3VudCA9IHBiLT5jb3VudDsKLQlEKCIlcyBpbnN0ICVwLCBidWYgY291bnQgJWQgIiwgX19mdW5jX18sCi0JCXBjYW1faW5zdCwgcGNhbV9pbnN0LT5idWZfY291bnQpOwotCW11dGV4X3VubG9jaygmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fbWN0bF92NGwyX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKnBiKQotewotCS8qIGdldCB0aGUgdmlkZW8gZGV2aWNlICovCi0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3Q7Ci0JcGNhbV9pbnN0ID0gY29udGFpbmVyX29mKGYtPnByaXZhdGVfZGF0YSwKLQkJc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCwgZXZlbnRIYW5kbGUpOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQltdXRleF9sb2NrKCZwY2FtX2luc3QtPmluc3RfbG9jayk7Ci0JcmMgPSB2YjJfcXVlcnlidWYoJnBjYW1faW5zdC0+dmlkX2J1ZnEsIHBiKTsKLQltdXRleF91bmxvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX21jdGxfdjRsMl9xYnVmKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKnBiKQotewotCWludCByYyA9IDAsIGkgPSAwOwotCS8qIGdldCB0aGUgY2FtZXJhIGRldmljZSAqLwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdDsKLQlwY2FtX2luc3QgPSBjb250YWluZXJfb2YoZi0+cHJpdmF0ZV9kYXRhLAotCQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0LCBldmVudEhhbmRsZSk7Ci0KLQlEKCIlcyBJbnN0ID0gJXBcbiIsIF9fZnVuY19fLCBwY2FtX2luc3QpOwotCVdBUk5fT04ocGN0eCAhPSBmLT5wcml2YXRlX2RhdGEpOwotCi0JbXV0ZXhfbG9jaygmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCWlmICghcGNhbV9pbnN0LT5idWZfb2Zmc2V0KSB7Ci0JCXByX2VycigiJXMgQnVmZmVyIGlzIGFscmVhZHkgcmVsZWFzZWQuIFJldHVybmluZy4gIiwgX19mdW5jX18pOwotCQltdXRleF91bmxvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHBiLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpIHsKLQkJLyogUmVqZWN0IHRoZSBidWZmZXIgaWYgcGxhbmVzIGFycmF5IHdhcyBub3QgYWxsb2NhdGVkICovCi0JCWlmIChwYi0+bS5wbGFuZXMgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlcyBQbGFuZXMgYXJyYXkgaXMgbnVsbCAiLCBfX2Z1bmNfXyk7Ci0JCQltdXRleF91bmxvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBwY2FtX2luc3QtPnBsYW5lX2luZm8ubnVtX3BsYW5lczsgaSsrKSB7Ci0JCQlEKCIlcyBzdG9yZWQgb2Zmc2V0cyBmb3IgcGxhbmUgJWQgYXMiCi0JCQkJImFkZHIgb2Zmc2V0ICVkLCBkYXRhIG9mZnNldCAlZCIsCi0JCQkJX19mdW5jX18sIGksIHBiLT5tLnBsYW5lc1tpXS5yZXNlcnZlZFswXSwKLQkJCQlwYi0+bS5wbGFuZXNbaV0uZGF0YV9vZmZzZXQpOwotCQkJcGNhbV9pbnN0LT5idWZfb2Zmc2V0W3BiLT5pbmRleF1baV0uZGF0YV9vZmZzZXQgPQotCQkJCXBiLT5tLnBsYW5lc1tpXS5kYXRhX29mZnNldDsKLQkJCXBjYW1faW5zdC0+YnVmX29mZnNldFtwYi0+aW5kZXhdW2ldLmFkZHJfb2Zmc2V0ID0KLQkJCQlwYi0+bS5wbGFuZXNbaV0ucmVzZXJ2ZWRbMF07Ci0JCQlwY2FtX2luc3QtPnBsYW5lX2luZm8ucGxhbmVbaV0ub2Zmc2V0ID0gMDsKLQkJCUQoIiVzLCBsZW4gJWQgdXNlclslZF0gJXAgYnVmX2xlbiAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcGItPmxlbmd0aCwgaSwKLQkJCQkodm9pZCAqKXBiLT5tLnBsYW5lc1tpXS5tLnVzZXJwdHIsCi0JCQkJcGItPm0ucGxhbmVzW2ldLmxlbmd0aCk7Ci0JCX0KLQl9IGVsc2UgewotCQlEKCIlcyBzdG9yZWQgcmVzZXJ2ZWQgaW5mbyAlZCIsIF9fZnVuY19fLCBwYi0+cmVzZXJ2ZWQpOwotCQlwY2FtX2luc3QtPmJ1Zl9vZmZzZXRbcGItPmluZGV4XVswXS5hZGRyX29mZnNldCA9IHBiLT5yZXNlcnZlZDsKLQl9Ci0KLQlyYyA9IHZiMl9xYnVmKCZwY2FtX2luc3QtPnZpZF9idWZxLCBwYik7Ci0JRCgiJXMsIHZpZGVvYnVmX3FidWYgcmV0dXJucyAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQotCW11dGV4X3VubG9jaygmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fbWN0bF92NGwyX2RxYnVmKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKnBiKQotewotCWludCByYyA9IDAsIGk7Ci0JLyogZ2V0IHRoZSBjYW1lcmEgZGV2aWNlICovCi0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0OwotCXBjYW1faW5zdCA9IGNvbnRhaW5lcl9vZihmLT5wcml2YXRlX2RhdGEsCi0JCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QsIGV2ZW50SGFuZGxlKTsKLQotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JV0FSTl9PTihwY3R4ICE9IGYtPnByaXZhdGVfZGF0YSk7Ci0JbXV0ZXhfbG9jaygmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCWlmICgwID09IHBjYW1faW5zdC0+c3RyZWFtb24pIHsKLQkJbXV0ZXhfdW5sb2NrKCZwY2FtX2luc3QtPmluc3RfbG9jayk7Ci0JCXJldHVybiAtRUFDQ0VTOwotCX0KLQotCXJjID0gdmIyX2RxYnVmKCZwY2FtX2luc3QtPnZpZF9idWZxLCBwYiwgIGYtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKLQlEKCIlcywgdmlkZW9idWZfZHFidWYgcmV0dXJucyAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQotCWlmIChwYi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7Ci0JCS8qIFJlamVjdCB0aGUgYnVmZmVyIGlmIHBsYW5lcyBhcnJheSB3YXMgbm90IGFsbG9jYXRlZCAqLwotCQlpZiAocGItPm0ucGxhbmVzID09IE5VTEwpIHsKLQkJCXByX2VycigiJXMgUGxhbmVzIGFycmF5IGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJCW11dGV4X3VubG9jaygmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IHBjYW1faW5zdC0+cGxhbmVfaW5mby5udW1fcGxhbmVzOyBpKyspIHsKLQkJCXBiLT5tLnBsYW5lc1tpXS5kYXRhX29mZnNldCA9Ci0JCQkJcGNhbV9pbnN0LT5idWZfb2Zmc2V0W3BiLT5pbmRleF1baV0uZGF0YV9vZmZzZXQ7Ci0JCQlwYi0+bS5wbGFuZXNbaV0ucmVzZXJ2ZWRbMF0gPQotCQkJCXBjYW1faW5zdC0+YnVmX29mZnNldFtwYi0+aW5kZXhdW2ldLmFkZHJfb2Zmc2V0OwotCQkJRCgiJXMgdXBkYXRlIG9mZnNldHMgZm9yIHBsYW5lICVkIGFzIEEgJWQgRCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgaSwgcGItPm0ucGxhbmVzW2ldLnJlc2VydmVkWzBdLAotCQkJCXBiLT5tLnBsYW5lc1tpXS5kYXRhX29mZnNldCk7Ci0JCX0KLQl9IGVsc2UgewotCQlwYi0+cmVzZXJ2ZWQgPSBwY2FtX2luc3QtPmJ1Zl9vZmZzZXRbcGItPmluZGV4XVswXS5hZGRyX29mZnNldDsKLQkJRCgiJXMgc3RvcmVkIHJlc2VydmVkIGluZm8gJWRcbiIsIF9fZnVuY19fLCBwYi0+cmVzZXJ2ZWQpOwotCX0KLQltdXRleF91bmxvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX21jdGxfdjRsMl9zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZiwgdm9pZCAqcGN0eCwKLQkJCQkJZW51bSB2NGwyX2J1Zl90eXBlIGJ1Zl90eXBlKQotewotCWludCByYyA9IDA7Ci0JLyogZ2V0IHRoZSBjYW1lcmEgZGV2aWNlICovCi0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0gID0gdmlkZW9fZHJ2ZGF0YShmKTsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3Q7Ci0JcGNhbV9pbnN0ID0gY29udGFpbmVyX29mKGYtPnByaXZhdGVfZGF0YSwKLQkJc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCwgZXZlbnRIYW5kbGUpOwotCi0JRCgiJXMgSW5zdCAlcFxuIiwgX19mdW5jX18sIHBjYW1faW5zdCk7Ci0JV0FSTl9PTihwY3R4ICE9IGYtPnByaXZhdGVfZGF0YSk7Ci0KLQltdXRleF9sb2NrKCZwY2FtLT5tY3RsX25vZGUuZGV2X2xvY2spOwotCW11dGV4X2xvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQlpZiAoKGJ1Zl90eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpICYmCi0JCShidWZfdHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpKSB7Ci0JCXByX2VycigiJXMgSW52YWxpZCBidWZmZXIgdHlwZSAiLCBfX2Z1bmNfXyk7Ci0JCW11dGV4X3VubG9jaygmcGNhbV9pbnN0LT5pbnN0X2xvY2spOwotCQltdXRleF91bmxvY2soJnBjYW0tPm1jdGxfbm9kZS5kZXZfbG9jayk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCUQoIiVzIENhbGxpbmcgdmlkZW9idWZfc3RyZWFtb24iLCBfX2Z1bmNfXyk7Ci0JLyogaWYgSFcgc3RyZWFtaW5nIG9uIGlzIHN1Y2Nlc3NmdWwsIHN0YXJ0IGJ1ZmZlciBzdHJlYW1pbmcgKi8KLQlyYyA9IHZiMl9zdHJlYW1vbigmcGNhbV9pbnN0LT52aWRfYnVmcSwgYnVmX3R5cGUpOwotCUQoIiVzLCB2aWRlb2J1Zl9zdHJlYW1vbiByZXR1cm5zICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCi0JLyogdHVybiBIVyAoVkZFL3NlbnNvcikgc3RyZWFtaW5nICovCi0JcGNhbV9pbnN0LT5zdHJlYW1vbiA9IDE7Ci0JbXV0ZXhfdW5sb2NrKCZwY2FtX2luc3QtPmluc3RfbG9jayk7Ci0JbXV0ZXhfdW5sb2NrKCZwY2FtLT5tY3RsX25vZGUuZGV2X2xvY2spOwotCUQoIiVzIHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9tY3RsX3Y0bDJfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCQllbnVtIHY0bDJfYnVmX3R5cGUgYnVmX3R5cGUpCi17Ci0JaW50IHJjID0gMDsKLQkvKiBnZXQgdGhlIGNhbWVyYSBkZXZpY2UgKi8KLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSAgPSB2aWRlb19kcnZkYXRhKGYpOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdDsKLQlwY2FtX2luc3QgPSBjb250YWluZXJfb2YoZi0+cHJpdmF0ZV9kYXRhLAotCQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0LCBldmVudEhhbmRsZSk7Ci0KLQlEKCIlcyBJbnN0ICVwXG4iLCBfX2Z1bmNfXywgcGNhbV9pbnN0KTsKLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQotCWlmICgoYnVmX3R5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgJiYKLQkJKGJ1Zl90eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkpIHsKLQkJcHJfZXJyKCIlcyBJbnZhbGlkIGJ1ZmZlciB0eXBlICIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogZmlyc3QgdHVybiBvZiBIVyAoVkZFL3NlbnNvcikgc3RyZWFtaW5nIHNvIHRoYXQgYnVmZmVycyBhcmUKLQkJbm90IGluIHVzZSB3aGVuIHdlIGZyZWUgdGhlIGJ1ZmZlcnMgKi8KLQltdXRleF9sb2NrKCZwY2FtLT5tY3RsX25vZGUuZGV2X2xvY2spOwotCW11dGV4X2xvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQlwY2FtX2luc3QtPnN0cmVhbW9uID0gMDsKLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoIiVzOiBodyBmYWlsZWQgdG8gc3RvcCBzdHJlYW1pbmdcbiIsIF9fZnVuY19fKTsKLQotCS8qIHN0b3AgYnVmZmVyIHN0cmVhbWluZyAqLwotCXJjID0gdmIyX3N0cmVhbW9mZigmcGNhbV9pbnN0LT52aWRfYnVmcSwgYnVmX3R5cGUpOwotCUQoIiVzLCB2aWRlb2J1Zl9zdHJlYW1vZmYgcmV0dXJucyAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQltdXRleF91bmxvY2soJnBjYW1faW5zdC0+aW5zdF9sb2NrKTsKLQltdXRleF91bmxvY2soJnBjYW0tPm1jdGxfbm9kZS5kZXZfbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9tY3RsX3Y0bDJfZW51bV9mbXRfY2FwKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpwZm10ZGVzYykKLXsKLQkvKiBnZXQgdGhlIHZpZGVvIGRldmljZSAqLwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtICA9IHZpZGVvX2RydmRhdGEoZik7Ci0JY29uc3Qgc3RydWN0IG1zbV9pc3BfY29sb3JfZm10ICppc3BfZm10OwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQlpZiAoKHBmbXRkZXNjLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpICYmCi0JCShwZm10ZGVzYy0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChwZm10ZGVzYy0+aW5kZXggPj0gcGNhbS0+bnVtX2ZtdHMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaXNwX2ZtdCA9ICZwY2FtLT51c3JfZm10c1twZm10ZGVzYy0+aW5kZXhdOwotCi0JaWYgKGlzcF9mbXQtPm5hbWUpCi0JCXN0cmxjcHkocGZtdGRlc2MtPmRlc2NyaXB0aW9uLCBpc3BfZm10LT5uYW1lLAotCQkJCQkJc2l6ZW9mKHBmbXRkZXNjLT5kZXNjcmlwdGlvbikpOwotCi0JcGZtdGRlc2MtPnBpeGVsZm9ybWF0ID0gaXNwX2ZtdC0+Zm91cmNjOwotCi0JRCgiJXM6IFslZF0gMHgleCwgJXNcbiIsIF9fZnVuY19fLCBwZm10ZGVzYy0+aW5kZXgsCi0JCWlzcF9mbXQtPmZvdXJjYywgaXNwX2ZtdC0+bmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX21jdGxfdjRsMl9nX2ZtdF9jYXAoc3RydWN0IGZpbGUgKmYsCi0JCXZvaWQgKnBjdHgsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqcGZtdCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQotCWlmIChwZm10LT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX21jdGxfdjRsMl9nX2ZtdF9jYXBfbXBsYW5lKHN0cnVjdCBmaWxlICpmLAotCQl2b2lkICpwY3R4LCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKnBmbXQpCi17Ci0JaW50IHJjID0gMDsKLQotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JV0FSTl9PTihwY3R4ICE9IGYtPnByaXZhdGVfZGF0YSk7Ci0KLQlpZiAocGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiByYzsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB3aWxsIHJlYWRqdXN0IHRoZSBmb3JtYXQgcGFyYW1ldGVycyBiYXNlZCBpbiBIVwotICBjYXBhYmlsaXRpZXMuIENhbGxlZCBieSBzX2ZtdF9jYXAKLSovCi1zdGF0aWMgaW50IG1zbV9tY3RsX3Y0bDJfdHJ5X2ZtdF9jYXAoc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0JCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqcGZtdCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fbWN0bF92NGwyX3RyeV9mbXRfY2FwX21wbGFuZShzdHJ1Y3QgZmlsZSAqZiwgdm9pZCAqcGN0eCwKLQkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpwZm10KQotewotCWludCByYyA9IDA7Ci0KLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCVdBUk5fT04ocGN0eCAhPSBmLT5wcml2YXRlX2RhdGEpOwotCi0JcmV0dXJuIHJjOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVjb25maWcgdGhlIHY0bDIgZHJpdmVyIGFuZCBIVyBkZXZpY2UsIGl0IHNob3VsZCBiZQotICAgY2FsbGVkIGFmdGVyIHRoZSBzdHJlYW1pbmcgaXMgc3RvcHBlZC4KLSovCi1zdGF0aWMgaW50IG1zbV9tY3RsX3Y0bDJfc19mbXRfY2FwKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKnBmbXQpCi17Ci0JaW50IHJjID0gMDsKLQotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JV0FSTl9PTihwY3R4ICE9IGYtPnByaXZhdGVfZGF0YSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX21jdGxfdjRsMl9zX2ZtdF9jYXBfbXBsYW5lKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqcGZtdCkKLXsKLQlpbnQgcmMgPSAwLCBpOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtID0gdmlkZW9fZHJ2ZGF0YShmKTsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3Q7Ci0JcGNhbV9pbnN0ID0gY29udGFpbmVyX29mKGYtPnByaXZhdGVfZGF0YSwKLQkJCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QsIGV2ZW50SGFuZGxlKTsKLQotCUQoIiVzIEluc3QgJXBcbiIsIF9fZnVuY19fLCBwY2FtX2luc3QpOwotCVdBUk5fT04ocGN0eCAhPSBmLT5wcml2YXRlX2RhdGEpOwotCi0JZm9yIChpID0gMDsgaSA8IHBjYW0tPm51bV9mbXRzOyBpKyspCi0JCWlmIChwY2FtLT51c3JfZm10c1tpXS5mb3VyY2MgPT0gcGZtdC0+Zm10LnBpeF9tcC5waXhlbGZvcm1hdCkKLQkJCWJyZWFrOwotCWlmIChpID09IHBjYW0tPm51bV9mbXRzKSB7Ci0JCXByX2VycigiJXM6IFVzZXIgcmVxdWVzdGVkIHBpeGVsZm9ybWF0ICV4IG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQlfX2Z1bmNfXywgcGZtdC0+Zm10LnBpeF9tcC5waXhlbGZvcm1hdCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlwY2FtX2luc3QtPnZpZF9mbXQgPSAqcGZtdDsKLQlwY2FtX2luc3QtPnNlbnNvcl9weGxjb2RlID0KLQkJcGNhbS0+dXNyX2ZtdHNbaV0ucHhsY29kZTsKLQlEKCIlczogaW5zdD0lcCwgd2lkdGg9JWQsIGhlaWd0aD0lZFxuIiwKLQkJX19mdW5jX18sIHBjYW1faW5zdCwKLQkJcGNhbV9pbnN0LT52aWRfZm10LmZtdC5waXhfbXAud2lkdGgsCi0JCXBjYW1faW5zdC0+dmlkX2ZtdC5mbXQucGl4X21wLmhlaWdodCk7Ci0JcmV0dXJuIHJjOwotfQotc3RhdGljIGludCBtc21fbWN0bF92NGwyX2dfanBlZ2NvbXAoc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0JCQkJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpwY29tcCkKLXsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fbWN0bF92NGwyX3NfanBlZ2NvbXAoc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0JCQkJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpwY29tcCkKLXsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQotCXJldHVybiByYzsKLX0KLQotCi1zdGF0aWMgaW50IG1zbV9tY3RsX3Y0bDJfZ19jcm9wKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCQlzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wKQotewotCWludCByYyA9IC1FSU5WQUw7Ci0KLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCVdBUk5fT04ocGN0eCAhPSBmLT5wcml2YXRlX2RhdGEpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9tY3RsX3Y0bDJfc19jcm9wKHN0cnVjdCBmaWxlICpmLCB2b2lkICpwY3R4LAotCQkJCQlzdHJ1Y3QgdjRsMl9jcm9wICphKQotewotCWludCByYyA9IC1FSU5WQUw7Ci0KLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCVdBUk5fT04ocGN0eCAhPSBmLT5wcml2YXRlX2RhdGEpOwotCi0JcmV0dXJuIHJjOwotfQotCi0vKiBTdHJlYW0gdHlwZS1kZXBlbmRlbnQgcGFyYW1ldGVyIGlvY3RscyAqLwotc3RhdGljIGludCBtc21fbWN0bF92NGwyX2dfcGFybShzdHJ1Y3QgZmlsZSAqZiwgdm9pZCAqcGN0eCwKLQkJCQlzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICphKQotewotCWludCByYyA9IC1FSU5WQUw7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9tY3RsX3ZpZGJ1Zl9nZXRfcGF0aCh1MzIgZXh0ZW5kZWRtb2RlKQotewotCXN3aXRjaCAoZXh0ZW5kZWRtb2RlKSB7Ci0JY2FzZSBNU01fVjRMMl9FWFRfQ0FQVFVSRV9NT0RFX1RIVU1CTkFJTDoKLQkJcmV0dXJuIE9VVFBVVF9UWVBFX1Q7Ci0JY2FzZSBNU01fVjRMMl9FWFRfQ0FQVFVSRV9NT0RFX01BSU46Ci0JCXJldHVybiBPVVRQVVRfVFlQRV9TOwotCWNhc2UgTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9WSURFTzoKLQkJcmV0dXJuIE9VVFBVVF9UWVBFX1Y7Ci0JY2FzZSBNU01fVjRMMl9FWFRfQ0FQVFVSRV9NT0RFX1JESToKLQkJcmV0dXJuIE9VVFBVVF9UWVBFX1I7Ci0JY2FzZSBNU01fVjRMMl9FWFRfQ0FQVFVSRV9NT0RFX1JESTE6Ci0JCXJldHVybiBPVVRQVVRfVFlQRV9SMTsKLQljYXNlIE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfREVGQVVMVDoKLQljYXNlIE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfUFJFVklFVzoKLQlkZWZhdWx0OgotCQlyZXR1cm4gT1VUUFVUX1RZUEVfUDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX21jdGxfdjRsMl9zX3Bhcm0oc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0JCQkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqYSkKLXsKLQlpbnQgcmMgPSAwOwotCWludCBpc19iYXllcl9zZW5zb3IgPSAwOwotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3Q7Ci0JcGNhbV9pbnN0ID0gY29udGFpbmVyX29mKGYtPnByaXZhdGVfZGF0YSwKLQkJc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCwgZXZlbnRIYW5kbGUpOwotCXBjYW1faW5zdC0+aW1hZ2VfbW9kZSA9IChhLT5wYXJtLmNhcHR1cmUuZXh0ZW5kZWRtb2RlICYgMHg3Rik7Ci0KLQlwbWN0bCA9IG1zbV9jYW1fc2VydmVyX2dldF9tY3RsKHBjYW1faW5zdC0+cGNhbS0+bWN0bF9oYW5kbGUpOwotCWlmICghcG1jdGwpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBtY3RsIGNvbnRyb2xsZXIiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQkvKiBzYXZlIG1zbV9kZXYgbm9kZSBpZHggZm9yIHN1YmRldiBub3RpZnkgbG9va3VwICovCi0JU0VUX0RFVklEX01PREUocGNhbV9pbnN0LT5pbnN0X2hhbmRsZSwgcG1jdGwtPnBjYW1fcHRyLT52bm9kZV9pZCk7Ci0JU0VUX0lNR19NT0RFKHBjYW1faW5zdC0+aW5zdF9oYW5kbGUsIHBjYW1faW5zdC0+aW1hZ2VfbW9kZSk7Ci0JU0VUX01DVExQUF9JTlNUX0lEWChwY2FtX2luc3QtPmluc3RfaGFuZGxlLCBwY2FtX2luc3QtPm15X2luZGV4KTsKLQlwY2FtX2luc3QtPnBjYW0tPm1jdGxfbm9kZS5kZXZfaW5zdF9tYXBbcGNhbV9pbnN0LT5pbWFnZV9tb2RlXSA9Ci0JCXBjYW1faW5zdDsKLQlwY2FtX2luc3QtPnBhdGggPSBtc21fbWN0bF92aWRidWZfZ2V0X3BhdGgocGNhbV9pbnN0LT5pbWFnZV9tb2RlKTsKLQlpZiAocGNhbV9pbnN0LT5wY2FtLT5zZGF0YS0+c2Vuc29yX3R5cGUgPT0gQkFZRVJfU0VOU09SKQotCQlpc19iYXllcl9zZW5zb3IgPSAxOwotCXJjID0gbXNtX2NhbV9zZXJ2ZXJfY29uZmlnX2ludGVyZmFjZV9tYXAocGNhbV9pbnN0LT5pbWFnZV9tb2RlLAotCQkJcGNhbV9pbnN0LT5wY2FtLT5tY3RsX2hhbmRsZSwKLQkJCXBjYW1faW5zdC0+cGNhbS0+dm5vZGVfaWQsIGlzX2JheWVyX3NlbnNvcik7Ci0JRCgiJXMgcGF0aD0lZCwgaW1hZ2UgbW9kZSA9ICVkIHJjPSVkXG4iLCBfX2Z1bmNfXywKLQkJcGNhbV9pbnN0LT5wYXRoLCBwY2FtX2luc3QtPmltYWdlX21vZGUsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX21jdGxfdjRsMl9zdWJzY3JpYmVfZXZlbnQoc3RydWN0IHY0bDJfZmggKmZoLAotCQkJc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3Q7Ci0JcGNhbV9pbnN0ID0KLQkJKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKiljb250YWluZXJfb2YoZmgsCi0JCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QsIGV2ZW50SGFuZGxlKTsKLQotCUQoIiVzOmZoID0gMHgleCwgdHlwZSA9IDB4JXhcbiIsIF9fZnVuY19fLCAodTMyKWZoLCBzdWItPnR5cGUpOwotCi0JaWYgKHN1Yi0+dHlwZSA9PSBWNEwyX0VWRU5UX0FMTCkKLQkJc3ViLT50eXBlID0gVjRMMl9FVkVOVF9QUklWQVRFX1NUQVJUK01TTV9DQU1fQVBQX05PVElGWV9FVkVOVDsKLQlyYyA9IHY0bDJfZXZlbnRfc3Vic2NyaWJlKGZoLCBzdWIsIDMwKTsKLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoIiVzOiBmYWlsZWQgZm9yIGV2dFR5cGUgPSAweCV4LCByYyA9ICVkXG4iLAotCQkJCQkJX19mdW5jX18sIHN1Yi0+dHlwZSwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fbWN0bF92NGwyX3Vuc3Vic2NyaWJlX2V2ZW50KHN0cnVjdCB2NGwyX2ZoICpmaCwKLQkJCXN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiAqc3ViKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0OwotCXBjYW1faW5zdCA9Ci0JCShzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICopY29udGFpbmVyX29mKGZoLAotCQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0LCBldmVudEhhbmRsZSk7Ci0KLQlEKCIlczogZmggPSAweCV4XG4iLCBfX2Z1bmNfXywgKHUzMilmaCk7Ci0KLQlyYyA9IHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUoZmgsIHN1Yik7Ci0JRCgiJXM6IHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9tY3RsX3Y0bDJfcHJpdmF0ZV9nX2N0cmwoc3RydWN0IGZpbGUgKmYsIHZvaWQgKnBjdHgsCi0Jc3RydWN0IG1zbV9jYW1lcmFfdjRsMl9pb2N0bF90ICppb2N0bF9wdHIpCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSAgPSB2aWRlb19kcnZkYXRhKGYpOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdDsKLQlwY2FtX2luc3QgPSBjb250YWluZXJfb2YoZi0+cHJpdmF0ZV9kYXRhLAotCQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0LCBldmVudEhhbmRsZSk7Ci0KLQlXQVJOX09OKHBjdHggIT0gZi0+cHJpdmF0ZV9kYXRhKTsKLQotCW11dGV4X2xvY2soJnBjYW0tPm1jdGxfbm9kZS5kZXZfbG9jayk7Ci0Jc3dpdGNoIChpb2N0bF9wdHItPmlkKSB7Ci0JY2FzZSBNU01fVjRMMl9QSURfSU5TVF9IQU5ETEU6Ci0JCUNPUFlfVE9fVVNFUihyYywgKHZvaWQgX191c2VyICopaW9jdGxfcHRyLT5pb2N0bF9wdHIsCi0JCQkodm9pZCAqKSZwY2FtX2luc3QtPmluc3RfaGFuZGxlLCBzaXplb2YodWludDMyX3QpKTsKLQkJaWYgKHJjKQotCQkJRVJSX0NPUFlfVE9fVVNFUigpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzIFVuc3VwcG9ydGVkIGlvY3RsICVkICIsIF9fZnVuY19fLCBpb2N0bF9wdHItPmlkKTsKLQkJYnJlYWs7Ci0JfQotCW11dGV4X3VubG9jaygmcGNhbS0+bWN0bF9ub2RlLmRldl9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBsb25nIG1zbV9tY3RsX3Y0bDJfcHJpdmF0ZV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCi0JICBib29sIHZhbGlkX3ByaW8sIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXN0cnVjdCBtc21fY2FtZXJhX3Y0bDJfaW9jdGxfdCAqaW9jdGxfcHRyID0gYXJnOwotCUQoIiVzOiBjbWQgJWRcbiIsIF9fZnVuY19fLCBfSU9DX05SKGNtZCkpOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIE1TTV9DQU1fVjRMMl9JT0NUTF9QUklWQVRFX0dfQ1RSTDoKLQkJcmMgPSBtc21fbWN0bF92NGwyX3ByaXZhdGVfZ19jdHJsKGZpbGUsIGZoLCBpb2N0bF9wdHIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzIFVuc3VwcG9ydGVkIGlvY3RsIGNtZCAlZCAiLCBfX2Z1bmNfXywgY21kKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotLyogbWN0bCBub2RlIHY0bDJfaW9jdGxfb3BzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIGdfbXNtX21jdGxfaW9jdGxfb3BzID0gewotCS52aWRpb2NfcXVlcnljYXAgPSBtc21fbWN0bF92NGwyX3F1ZXJ5Y2FwLAotCi0JLnZpZGlvY19zX2Nyb3AgPSBtc21fbWN0bF92NGwyX3NfY3JvcCwKLQkudmlkaW9jX2dfY3JvcCA9IG1zbV9tY3RsX3Y0bDJfZ19jcm9wLAotCi0JLnZpZGlvY19xdWVyeWN0cmwgPSBtc21fbWN0bF92NGwyX3F1ZXJ5Y3RybCwKLQkudmlkaW9jX2dfY3RybCA9IG1zbV9tY3RsX3Y0bDJfZ19jdHJsLAotCS52aWRpb2Nfc19jdHJsID0gbXNtX21jdGxfdjRsMl9zX2N0cmwsCi0KLQkudmlkaW9jX3JlcWJ1ZnMgPSBtc21fbWN0bF92NGwyX3JlcWJ1ZnMsCi0JLnZpZGlvY19xdWVyeWJ1ZiA9IG1zbV9tY3RsX3Y0bDJfcXVlcnlidWYsCi0JLnZpZGlvY19xYnVmID0gbXNtX21jdGxfdjRsMl9xYnVmLAotCS52aWRpb2NfZHFidWYgPSBtc21fbWN0bF92NGwyX2RxYnVmLAotCi0JLnZpZGlvY19zdHJlYW1vbiA9IG1zbV9tY3RsX3Y0bDJfc3RyZWFtb24sCi0JLnZpZGlvY19zdHJlYW1vZmYgPSBtc21fbWN0bF92NGwyX3N0cmVhbW9mZiwKLQotCS8qIGZvcm1hdCBpb2N0bHMgKi8KLQkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAgPSBtc21fbWN0bF92NGwyX2VudW1fZm10X2NhcCwKLQkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXBfbXBsYW5lID0gbXNtX21jdGxfdjRsMl9lbnVtX2ZtdF9jYXAsCi0JLnZpZGlvY190cnlfZm10X3ZpZF9jYXAgPSBtc21fbWN0bF92NGwyX3RyeV9mbXRfY2FwLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwX21wbGFuZSA9IG1zbV9tY3RsX3Y0bDJfdHJ5X2ZtdF9jYXBfbXBsYW5lLAotCS52aWRpb2NfZ19mbXRfdmlkX2NhcCA9IG1zbV9tY3RsX3Y0bDJfZ19mbXRfY2FwLAotCS52aWRpb2NfZ19mbXRfdmlkX2NhcF9tcGxhbmUgPSBtc21fbWN0bF92NGwyX2dfZm10X2NhcF9tcGxhbmUsCi0JLnZpZGlvY19zX2ZtdF92aWRfY2FwID0gbXNtX21jdGxfdjRsMl9zX2ZtdF9jYXAsCi0JLnZpZGlvY19zX2ZtdF92aWRfY2FwX21wbGFuZSA9IG1zbV9tY3RsX3Y0bDJfc19mbXRfY2FwX21wbGFuZSwKLQotCS52aWRpb2NfZ19qcGVnY29tcCA9IG1zbV9tY3RsX3Y0bDJfZ19qcGVnY29tcCwKLQkudmlkaW9jX3NfanBlZ2NvbXAgPSBtc21fbWN0bF92NGwyX3NfanBlZ2NvbXAsCi0KLQkvKiBTdHJlYW0gdHlwZS1kZXBlbmRlbnQgcGFyYW1ldGVyIGlvY3RscyAqLwotCS52aWRpb2NfZ19wYXJtID0gIG1zbV9tY3RsX3Y0bDJfZ19wYXJtLAotCS52aWRpb2Nfc19wYXJtID0gIG1zbV9tY3RsX3Y0bDJfc19wYXJtLAotCi0JLyogZXZlbnQgc3Vic2NyaWJlL3Vuc3Vic2NyaWJlICovCi0JLnZpZGlvY19zdWJzY3JpYmVfZXZlbnQgPSBtc21fbWN0bF92NGwyX3N1YnNjcmliZV9ldmVudCwKLQkudmlkaW9jX3Vuc3Vic2NyaWJlX2V2ZW50ID0gbXNtX21jdGxfdjRsMl91bnN1YnNjcmliZV9ldmVudCwKLQkudmlkaW9jX2RlZmF1bHQgPSBtc21fbWN0bF92NGwyX3ByaXZhdGVfaW9jdGwsCi19OwotCi1pbnQgbXNtX3NldHVwX21jdGxfbm9kZShzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSkKLXsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnB2ZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gTlVMTDsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gTlVMTDsKLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCi0JLyogZmlyc3QgcmVnaXN0ZXIgdGhlIHY0bDIgZGV2aWNlICovCi0JaWYgKHBjYW0tPnNlbnNvcl9zZGV2LT5mbGFncyAmIFY0TDJfU1VCREVWX0ZMX0lTX0kyQykgewotCQljbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHBjYW0tPnNlbnNvcl9zZGV2KTsKLQkJcGNhbS0+bWN0bF9ub2RlLnY0bDJfZGV2LmRldiA9ICZjbGllbnQtPmRldjsKLQl9IGVsc2UgewotCQlwZGV2ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShwY2FtLT5zZW5zb3Jfc2Rldik7Ci0JCXBjYW0tPm1jdGxfbm9kZS52NGwyX2Rldi5kZXYgPSAmcGRldi0+ZGV2OwotCX0KLQotCS8qIGZpcnN0IHJlZ2lzdGVyIHRoZSB2NGwyIGRldmljZSAqLwotCXJjID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIocGNhbS0+bWN0bF9ub2RlLnY0bDJfZGV2LmRldiwKLQkJCQkmcGNhbS0+bWN0bF9ub2RlLnY0bDJfZGV2KTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkvKgllbHNlCi0JCQlwY2FtLT52NGwyX2Rldi5ub3RpZnkgPSBtc21fY2FtX3Y0bDJfc3ViZGV2X25vdGlmeTsgKi8KLQotCS8qIG5vdyBzZXR1cCB2aWRlbyBkZXZpY2UgKi8KLQlwdmRldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOwotCWlmIChwdmRldiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHZpZGVvX2RldmljZV9hbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIGluaXQgdmlkZW8gZGV2aWNlJ3MgZHJpdmVyIGludGVyZmFjZSAqLwotCUQoInNlbnNvciBuYW1lID0gJXMsIHNpemVvZihwdmRldi0+bmFtZSk9JWRcbiIsCi0JCQlwY2FtLT5zZW5zb3Jfc2Rldi0+bmFtZSwgc2l6ZW9mKHB2ZGV2LT5uYW1lKSk7Ci0KLQkvKiBkZXZpY2UgaW5mbyAtIHN0cmxjcHkgaXMgc2FmZXIgdGhhbiBzdHJuY3B5IGJ1dAotCSAgIG9ubHkgaWYgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzKi8KLQlzdHJsY3B5KHB2ZGV2LT5uYW1lLCBwY2FtLT5zZW5zb3Jfc2Rldi0+bmFtZSwKLQkJCXNpemVvZihwdmRldi0+bmFtZSkpOwotCi0JcHZkZXYtPnJlbGVhc2UgICA9IHZpZGVvX2RldmljZV9yZWxlYXNlOwotCXB2ZGV2LT5mb3BzCSAgPSAmZ19tc21fbWN0bF9mb3BzOwotCXB2ZGV2LT5pb2N0bF9vcHMgID0gJmdfbXNtX21jdGxfaW9jdGxfb3BzOwotCXB2ZGV2LT5taW5vcgkgID0gLTE7Ci0JcHZkZXYtPnZmbF90eXBlICAgPSAxOwotCi0JLyogcmVnaXN0ZXIgdjRsMiB2aWRlbyBkZXZpY2UgdG8ga2VybmVsIGFzIC9kZXYvdmlkZW9YWCAqLwotCUQoIiVzIHZpZGVvX3JlZ2lzdGVyX2RldmljZVxuIiwgX19mdW5jX18pOwotCXJjID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHB2ZGV2LAotCQkJVkZMX1RZUEVfR1JBQkJFUiwKLQkJCS0xKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogdmlkZW9fcmVnaXN0ZXJfZGV2aWNlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIHJlZ19mYWlsOwotCX0KLQlEKCIlczogdmlkZW8gZGV2aWNlIHJlZ2lzdGVyZWQgYXMgL2Rldi92aWRlbyVkXG4iLAotCQkJX19mdW5jX18sIHB2ZGV2LT5udW0pOwotCi0JLyogY29ubmVjdCBwY2FtIGFuZCBtY3RsIHZpZGVvIGRldiB0byBlYWNoIG90aGVyICovCi0JcGNhbS0+bWN0bF9ub2RlLnB2ZGV2CT0gcHZkZXY7Ci0JdmlkZW9fc2V0X2RydmRhdGEocGNhbS0+bWN0bF9ub2RlLnB2ZGV2LCBwY2FtKTsKLQotCXJldHVybiByYyA7Ci0KLXJlZ19mYWlsOgotCXZpZGVvX2RldmljZV9yZWxlYXNlKHB2ZGV2KTsKLQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZwY2FtLT5tY3RsX25vZGUudjRsMl9kZXYpOwotCXBjYW0tPm1jdGxfbm9kZS52NGwyX2Rldi5kZXYgPSBOVUxMOwotCXJldHVybiByYzsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tc21fbWN0bF9idWYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tc21fbWN0bF9idWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxZjY3NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtX21jdGxfYnVmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgotCi0KLQotI2luY2x1ZGUgIm1zbS5oIgotI2luY2x1ZGUgIm1zbV9jYW1fc2VydmVyLmgiCi0jaW5jbHVkZSAibXNtX2lzcGlmLmgiCi0KLSNpZmRlZiBDT05GSUdfTVNNX0NBTUVSQV9ERUJVRwotI2RlZmluZSBEKGZtdCwgYXJncy4uLikgcHJfZGVidWcoIm1zbV9tY3RsX2J1ZjogIiBmbXQsICMjYXJncykKLSNlbHNlCi0jZGVmaW5lIEQoZm10LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi1zdGF0aWMgaW50IG1zbV92YjJfb3BzX3F1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLAotCQkJCWNvbnN0IHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10LAotCQkJCXVuc2lnbmVkIGludCAqbnVtX2J1ZmZlcnMsCi0JCQkJdW5zaWduZWQgaW50ICpudW1fcGxhbmVzLAotCQkJCXVuc2lnbmVkIGludCBzaXplc1tdLAotCQkJCXZvaWQgKmFsbG9jX2N0eHNbXSkKLXsKLQkvKiBnZXQgdGhlIHZpZGVvIGRldmljZSAqLwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdCA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtID0gcGNhbV9pbnN0LT5wY2FtOwotCWludCBpOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAoIXBjYW0gfHwgISgqbnVtX2J1ZmZlcnMpKSB7Ci0JCXByX2VycigiJXMgZXJyb3IgOiBpbnZhbGlkIGlucHV0XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCSpudW1fcGxhbmVzID0gcGNhbV9pbnN0LT5wbGFuZV9pbmZvLm51bV9wbGFuZXM7Ci0JZm9yIChpID0gMDsgaSA8IHBjYW1faW5zdC0+dmlkX2ZtdC5mbXQucGl4X21wLm51bV9wbGFuZXM7IGkrKykgewotCQlzaXplc1tpXSA9IHBjYW1faW5zdC0+cGxhbmVfaW5mby5wbGFuZVtpXS5zaXplOwotCQlEKCIlcyBJbnN0ICVwIDogUGxhbmUgJWQgT2Zmc2V0ID0gJWQgU2l6ZSA9ICVsZCIKLQkJCSJBbGlnbmVkIFNpemUgPSAlZCIsIF9fZnVuY19fLCBwY2FtX2luc3QsIGksCi0JCQlwY2FtX2luc3QtPnBsYW5lX2luZm8ucGxhbmVbaV0ub2Zmc2V0LAotCQkJcGNhbV9pbnN0LT5wbGFuZV9pbmZvLnBsYW5lW2ldLnNpemUsIHNpemVzW2ldKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV92YjJfb3BzX3dhaXRfcHJlcGFyZShzdHJ1Y3QgdmIyX3F1ZXVlICpxKQotewotCS8qIHdlIHVzZSBwb2xsaW5nIHNvIGRvIG5vdCB1c2UgdGhpcyBmbiBub3cgKi8KLX0KLXN0YXRpYyB2b2lkIG1zbV92YjJfb3BzX3dhaXRfZmluaXNoKHN0cnVjdCB2YjJfcXVldWUgKnEpCi17Ci0JLyogd2UgdXNlIHBvbGxpbmcgc28gZG8gbm90IHVzZSB0aGlzIGZuIG5vdyAqLwotfQotCi1zdGF0aWMgaW50IG1zbV92YjJfb3BzX2J1Zl9pbml0KHN0cnVjdCB2YjJfYnVmZmVyICp2YikKLXsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3Q7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW07Ci0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGw7Ci0Jc3RydWN0IHZpZGVvYnVmMl9jb250aWdfcG1lbSAqbWVtOwotCXN0cnVjdCB2YjJfcXVldWUJKnZxOwotCXVpbnQzMl90IGJ1Zl9pZHg7Ci0Jc3RydWN0IG1zbV9mcmFtZV9idWZmZXIgKmJ1ZjsKLQlpbnQgcmMgPSAwLCBpOwotCWVudW0gdmlkZW9idWYyX2J1ZmZlcl90eXBlIGJ1Zl90eXBlOwotCXN0cnVjdCB2aWRlb2J1ZjJfbXNtX29mZnNldCBvZmZzZXQ7Ci0JdnEgPSB2Yi0+dmIyX3F1ZXVlOwotCXBjYW1faW5zdCA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOwotCXBjYW0gPSBwY2FtX2luc3QtPnBjYW07Ci0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlEKCIlcywgaW5zdD0weCV4LGlkeD0lZCwgd2lkdGggPSAlZFxuIiwgX19mdW5jX18sCi0JCSh1MzIpcGNhbV9pbnN0LCBwY2FtX2luc3QtPm15X2luZGV4LAotCQlwY2FtX2luc3QtPnZpZF9mbXQuZm10LnBpeC53aWR0aCk7Ci0JRCgiJXMsIGluc3Q9MHgleCxpZHg9JWQsIGhlaWdodCA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJKHUzMilwY2FtX2luc3QsIHBjYW1faW5zdC0+bXlfaW5kZXgsCi0JCXBjYW1faW5zdC0+dmlkX2ZtdC5mbXQucGl4LmhlaWdodCk7Ci0KLQlidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBtc21fZnJhbWVfYnVmZmVyLCB2aWRidWYpOwotCWlmIChidWYtPnN0YXRlID09IE1TTV9CVUZGRVJfU1RBVEVfSU5JVElBTElaRUQpCi0JCXJldHVybiByYzsKLQotCWlmIChwY2FtX2luc3QtPnBsYW5lX2luZm8uYnVmZmVyX3R5cGUgPT0KLQkJVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkKLQkJYnVmX3R5cGUgPSBWSURFT0JVRjJfTVVMVElQTEVfUExBTkVTOwotCWVsc2UgaWYgKHBjYW1faW5zdC0+cGxhbmVfaW5mby5idWZmZXJfdHlwZSA9PQotCQlWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCWJ1Zl90eXBlID0gVklERU9CVUYyX1NJTkdMRV9QTEFORTsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGJ1Zl90eXBlID09IFZJREVPQlVGMl9TSU5HTEVfUExBTkUpIHsKLQkJb2Zmc2V0LnNwX29mZi55X29mZiA9IHBjYW1faW5zdC0+cGxhbmVfaW5mby5zcF95X29mZnNldDsKLQkJb2Zmc2V0LnNwX29mZi5jYmNyX29mZiA9Ci0JCQlwY2FtX2luc3QtPnBsYW5lX2luZm8ucGxhbmVbMF0ub2Zmc2V0OwotCX0KLQlidWZfaWR4ID0gdmItPnY0bDJfYnVmLmluZGV4OwotCXBtY3RsID0gbXNtX2NhbV9zZXJ2ZXJfZ2V0X21jdGwocGNhbS0+bWN0bF9oYW5kbGUpOwotCWlmIChwbWN0bCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMgTm8gbWN0bCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IHZiLT5udW1fcGxhbmVzOyBpKyspIHsKLQkJbWVtID0gdmIyX3BsYW5lX2Nvb2tpZSh2YiwgaSk7Ci0JCWlmIChtZW0gPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlcyBJbnN0ICVwIEJ1ZmZlciAlZCBQbGFuZSAlZCBjb29raWUgaXMgbnVsbCIsCi0JCQkJX19mdW5jX18sIHBjYW1faW5zdCwgYnVmX2lkeCwgaSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlpZiAoYnVmX3R5cGUgPT0gVklERU9CVUYyX01VTFRJUExFX1BMQU5FUykKLQkJCW9mZnNldC5kYXRhX29mZnNldCA9Ci0JCQkJcGNhbV9pbnN0LT5wbGFuZV9pbmZvLnBsYW5lW2ldLm9mZnNldDsKLQotCQlpZiAodmItPnY0bDJfYnVmLm1lbW9yeSA9PSBWNEwyX01FTU9SWV9VU0VSUFRSKQotCQkJcmMgPSB2aWRlb2J1ZjJfcG1lbV9jb250aWdfdXNlcl9nZXQobWVtLCAmb2Zmc2V0LAotCQkJCWJ1Zl90eXBlLAotCQkJCXBjYW1faW5zdC0+YnVmX29mZnNldFtidWZfaWR4XVtpXS5hZGRyX29mZnNldCwKLQkJCQlwY2FtX2luc3QtPnBhdGgsIHBtY3RsLT5jbGllbnQsCi0JCQkJcG1jdGwtPmRvbWFpbl9udW0pOwotCQllbHNlCi0JCQlyYyA9IHZpZGVvYnVmMl9wbWVtX2NvbnRpZ19tbWFwX2dldChtZW0sICZvZmZzZXQsCi0JCQkJYnVmX3R5cGUsIHBjYW1faW5zdC0+cGF0aCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgZXJyb3IgaW5pdGlhbGl6aW5nIGJ1ZmZlciAiLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQlidWYtPnN0YXRlID0gTVNNX0JVRkZFUl9TVEFURV9JTklUSUFMSVpFRDsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ZiMl9vcHNfYnVmX3ByZXBhcmUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQotewotCWludCBpLCByYyA9IDA7Ci0JdWludDMyX3QgbGVuOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbTsKLQlzdHJ1Y3QgbXNtX2ZyYW1lX2J1ZmZlciAqYnVmOwotCXN0cnVjdCB2YjJfcXVldWUgKnZxOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAoIXZiIHx8ICF2Yi0+dmIyX3F1ZXVlKSB7Ci0JCXByX2VycigiJXMgZXJyb3IgOiBpbnB1dCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQl2cSA9IHZiLT52YjJfcXVldWU7Ci0JcGNhbV9pbnN0ID0gdmIyX2dldF9kcnZfcHJpdih2cSk7Ci0JcGNhbSA9IHBjYW1faW5zdC0+cGNhbTsKLQlidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBtc21fZnJhbWVfYnVmZmVyLCB2aWRidWYpOwotCi0JaWYgKCFwY2FtIHx8ICFidWYpIHsKLQkJcHJfZXJyKCIlcyBlcnJvciA6IHBvaW50ZXIgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JLyogYnkgdGhpcyB0aW1lIHZpZF9mbXQgc2hvdWxkIGJlIGFscmVhZHkgc2V0LgotCSAqIHJldHVybiBlcnJvciBpZiBpdCBpcyBub3QuICovCi0JaWYgKChwY2FtX2luc3QtPnZpZF9mbXQuZm10LnBpeC53aWR0aCA9PSAwKSB8fAotCQkocGNhbV9pbnN0LT52aWRfZm10LmZtdC5waXguaGVpZ2h0ID09IDApKSB7Ci0JCXByX2VycigiJXMgZXJyb3IgOiBwY2FtIHZpZF9mbXQgaXMgbm90IHNldFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JLyogcHJlZmlsbCBpbiB0aGUgYnl0ZXVzZWQgZmllbGQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgdmItPm51bV9wbGFuZXM7IGkrKykgewotCQlsZW4gPSB2YjJfcGxhbmVfc2l6ZSh2YiwgaSk7Ci0JCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCh2YiwgaSwgbGVuKTsKLQl9Ci0JYnVmLT5zdGF0ZSA9IE1TTV9CVUZGRVJfU1RBVEVfUFJFUEFSRUQ7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV92YjJfb3BzX2J1Zl9maW5pc2goc3RydWN0IHZiMl9idWZmZXIgKnZiKQotewotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbTsKLQlzdHJ1Y3QgbXNtX2ZyYW1lX2J1ZmZlciAqYnVmOwotCi0JcGNhbV9pbnN0ID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKLQlwY2FtID0gcGNhbV9pbnN0LT5wY2FtOwotCWJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IG1zbV9mcmFtZV9idWZmZXIsIHZpZGJ1Zik7Ci0JYnVmLT5zdGF0ZSA9IE1TTV9CVUZGRVJfU1RBVEVfREVRVUVVRUQ7Ci0JRCgiJXM6IGluc3Q9MHgleCwgYnVmPTB4JXgsIGlkeD0lZFxuIiwgX19mdW5jX18sCi0JKHVpbnQzMl90KXBjYW1faW5zdCwgKHVpbnQzMl90KWJ1ZiwgdmItPnY0bDJfYnVmLmluZGV4KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbXNtX3ZiMl9vcHNfYnVmX2NsZWFudXAoc3RydWN0IHZiMl9idWZmZXIgKnZiKQotewotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdDsKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbTsKLQlzdHJ1Y3QgdmlkZW9idWYyX2NvbnRpZ19wbWVtICptZW07Ci0Jc3RydWN0IG1zbV9mcmFtZV9idWZmZXIgKmJ1ZiwgKnRtcDsKLQl1aW50MzJfdCBpLCB2Yl9waHlhZGRyID0gMCwgYnVmX3BoeWFkZHIgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCi0JcGNhbV9pbnN0ID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKLQlwY2FtID0gcGNhbV9pbnN0LT5wY2FtOwotCWJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IG1zbV9mcmFtZV9idWZmZXIsIHZpZGJ1Zik7Ci0KLQotCWlmIChwY2FtX2luc3QtPnZpZF9mbXQudHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCB2Yi0+bnVtX3BsYW5lczsgaSsrKSB7Ci0JCQltZW0gPSB2YjJfcGxhbmVfY29va2llKHZiLCBpKTsKLQkJCWlmICghbWVtKSB7Ci0JCQkJRCgiJXMgSW5zdCAlcCBtZW1vcnkgYWxyZWFkeSBmcmVlZCB1cC4gcmV0dXJuIiwKLQkJCQkJX19mdW5jX18sIHBjYW1faW5zdCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJRCgiJXM6IGluc3Q9JXAsIGJ1Zj0weCV4LCBpZHg9JWQgcGxhbmUgaWQgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcGNhbV9pbnN0LAotCQkJCSh1aW50MzJfdClidWYsIHZiLT52NGwyX2J1Zi5pbmRleCwgaSk7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwY2FtX2luc3QtPnZxX2lycWxvY2ssIGZsYWdzKTsKLQkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShidWYsIHRtcCwKLQkJCQkJJnBjYW1faW5zdC0+ZnJlZV92cSwgbGlzdCkgewotCQkJCWlmICgmYnVmLT52aWRidWYgPT0gdmIpIHsKLQkJCQkJbGlzdF9kZWxfaW5pdCgmYnVmLT5saXN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNhbV9pbnN0LT52cV9pcnFsb2NrLCBmbGFncyk7Ci0JCX0KLQl9IGVsc2UgewotCQltZW0gPSB2YjJfcGxhbmVfY29va2llKHZiLCAwKTsKLQkJaWYgKCFtZW0pCi0JCQlyZXR1cm47Ci0JCUQoIiVzOiBpbnN0PTB4JXgsIGJ1Zj0weCV4LCBpZHg9JWRcbiIsIF9fZnVuY19fLAotCQkodWludDMyX3QpcGNhbV9pbnN0LCAodWludDMyX3QpYnVmLCB2Yi0+djRsMl9idWYuaW5kZXgpOwotCQl2Yl9waHlhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHZpZGVvYnVmMl90b19wbWVtX2NvbnRpZyh2YiwgMCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwY2FtX2luc3QtPnZxX2lycWxvY2ssIGZsYWdzKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJ1ZiwgdG1wLAotCQkJCSZwY2FtX2luc3QtPmZyZWVfdnEsIGxpc3QpIHsKLQkJCWJ1Zl9waHlhZGRyID0gKHVuc2lnbmVkIGxvbmcpCi0JCQkJdmlkZW9idWYyX3RvX3BtZW1fY29udGlnKCZidWYtPnZpZGJ1ZiwgMCk7Ci0JCQlEKCIlcyB2Yl9pZHg9JWQsdmJfcGFkZHI9MHgleCxwaHlhZGRyPTB4JXhcbiIsCi0JCQkJX19mdW5jX18sIGJ1Zi0+dmlkYnVmLnY0bDJfYnVmLmluZGV4LAotCQkJCWJ1Zl9waHlhZGRyLCB2Yl9waHlhZGRyKTsKLQkJCWlmICh2Yl9waHlhZGRyID09IGJ1Zl9waHlhZGRyKSB7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmYnVmLT5saXN0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2FtX2luc3QtPnZxX2lycWxvY2ssIGZsYWdzKTsKLQl9Ci0JcG1jdGwgPSBtc21fY2FtX3NlcnZlcl9nZXRfbWN0bChwY2FtLT5tY3RsX2hhbmRsZSk7Ci0JaWYgKHBtY3RsID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlcyBObyBtY3RsIGZvdW5kXG4iLCBfX2Z1bmNfXyk7Ci0JCWJ1Zi0+c3RhdGUgPSBNU01fQlVGRkVSX1NUQVRFX1VOVVNFRDsKLQkJcmV0dXJuOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgdmItPm51bV9wbGFuZXM7IGkrKykgewotCQltZW0gPSB2YjJfcGxhbmVfY29va2llKHZiLCBpKTsKLQkJaWYgKG1lbSkgewotCQkJdmlkZW9idWYyX3BtZW1fY29udGlnX3VzZXJfcHV0KG1lbSwgcG1jdGwtPmNsaWVudCwKLQkJCQlwbWN0bC0+ZG9tYWluX251bSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzIEluc3QgJXAgYnVmZmVyIHBsYW5lIGNvb2tpZSBpcyBudWxsIiwKLQkJCQlfX2Z1bmNfXywgcGNhbV9pbnN0KTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlidWYtPnN0YXRlID0gTVNNX0JVRkZFUl9TVEFURV9VTlVTRUQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ZiMl9vcHNfc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnEsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fdmIyX29wc19zdG9wX3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICpxKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBtc21fdmIyX29wc19idWZfcXVldWUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQotewotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdCA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0gPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXN0cnVjdCB2YjJfcXVldWUgKnZxOwotCXN0cnVjdCBtc21fZnJhbWVfYnVmZmVyICpidWY7Ci0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAoIXZiIHx8ICF2Yi0+dmIyX3F1ZXVlKSB7Ci0JCXByX2VycigiJXMgZXJyb3IgOiBpbnB1dCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiA7Ci0JfQotCXZxID0gdmItPnZiMl9xdWV1ZTsKLQlwY2FtX2luc3QgPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKLQlwY2FtID0gcGNhbV9pbnN0LT5wY2FtOwotCUQoIiVzIHBjYW1faW5zdD0lcCwodmI9MHglcCksaWR4PSVkLGxlbj0lZFxuIiwKLQkJX19mdW5jX18sIHBjYW1faW5zdCwKLQl2YiwgdmItPnY0bDJfYnVmLmluZGV4LCB2Yi0+djRsMl9idWYubGVuZ3RoKTsKLQlEKCIlcyBwY2FtX2luc3Q9JXAsIGlkeD0lZFxuIiwgX19mdW5jX18sIHBjYW1faW5zdCwKLQkJdmItPnY0bDJfYnVmLmluZGV4KTsKLQlidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBtc21fZnJhbWVfYnVmZmVyLCB2aWRidWYpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZwY2FtX2luc3QtPnZxX2lycWxvY2ssIGZsYWdzKTsKLQkvKiB3ZSBhcmUgcmV0dXJuaW5nIGEgYnVmZmVyIHRvIHRoZSBxdWV1ZSAqLwotCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+bGlzdCwgJnBjYW1faW5zdC0+ZnJlZV92cSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNhbV9pbnN0LT52cV9pcnFsb2NrLCBmbGFncyk7Ci0JYnVmLT5zdGF0ZSA9IE1TTV9CVUZGRVJfU1RBVEVfUVVFVUVEOwotfQotCi1zdGF0aWMgc3RydWN0IHZiMl9vcHMgbXNtX3ZiMl9vcHMgPSB7Ci0JLnF1ZXVlX3NldHVwID0gbXNtX3ZiMl9vcHNfcXVldWVfc2V0dXAsCi0JLndhaXRfcHJlcGFyZSA9IG1zbV92YjJfb3BzX3dhaXRfcHJlcGFyZSwKLQkud2FpdF9maW5pc2ggPSBtc21fdmIyX29wc193YWl0X2ZpbmlzaCwKLQkuYnVmX2luaXQgPSBtc21fdmIyX29wc19idWZfaW5pdCwKLQkuYnVmX3ByZXBhcmUgPSBtc21fdmIyX29wc19idWZfcHJlcGFyZSwKLQkuYnVmX2ZpbmlzaCA9IG1zbV92YjJfb3BzX2J1Zl9maW5pc2gsCi0JLmJ1Zl9jbGVhbnVwID0gbXNtX3ZiMl9vcHNfYnVmX2NsZWFudXAsCi0JLnN0YXJ0X3N0cmVhbWluZyA9IG1zbV92YjJfb3BzX3N0YXJ0X3N0cmVhbWluZywKLQkuc3RvcF9zdHJlYW1pbmcgPSBtc21fdmIyX29wc19zdG9wX3N0cmVhbWluZywKLQkuYnVmX3F1ZXVlID0gbXNtX3ZiMl9vcHNfYnVmX3F1ZXVlLAotfTsKLQotCi0vKiBwcmVwYXJlIGEgdmlkZW8gYnVmZmVyIHF1ZXVlIGZvciBhIHZsNDIgZGV2aWNlKi8KLXN0YXRpYyBpbnQgbXNtX3ZicXVldWVfaW5pdChzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3QsCi0JCQlzdHJ1Y3QgdmIyX3F1ZXVlICpxLCBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKLXsKLQlpZiAoIXEpIHsKLQkJcHJfZXJyKCIlcyBlcnJvciA6IGlucHV0IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3Bpbl9sb2NrX2luaXQoJnBjYW1faW5zdC0+dnFfaXJxbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnBjYW1faW5zdC0+ZnJlZV92cSk7Ci0JdmlkZW9idWYyX3F1ZXVlX3BtZW1fY29udGlnX2luaXQocSwgdHlwZSwKLQkJCQkJJm1zbV92YjJfb3BzLAotCQkJCQlzaXplb2Yoc3RydWN0IG1zbV9mcmFtZV9idWZmZXIpLAotCQkJCQkodm9pZCAqKXBjYW1faW5zdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fbWN0bF9pbWdfbW9kZV90b19pbnN0X2luZGV4KHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCQkJCQlpbnQgaW1hZ2VfbW9kZSwgaW50IG5vZGVfdHlwZSkKLXsKLQlpZiAoKGltYWdlX21vZGUgPj0gMCkgJiYgbm9kZV90eXBlICYmCi0JCXBtY3RsLT5wY2FtX3B0ci0+bWN0bF9ub2RlLmRldl9pbnN0X21hcFtpbWFnZV9tb2RlXSkKLQkJcmV0dXJuIHBtY3RsLT5wY2FtX3B0ci0+Ci0JCQkJbWN0bF9ub2RlLmRldl9pbnN0X21hcFtpbWFnZV9tb2RlXS0+bXlfaW5kZXg7Ci0JZWxzZSBpZiAoKGltYWdlX21vZGUgPj0gMCkgJiYKLQkJcG1jdGwtPnBjYW1fcHRyLT5kZXZfaW5zdF9tYXBbaW1hZ2VfbW9kZV0pCi0JCXJldHVybglwbWN0bC0+cGNhbV9wdHItPgotCQkJCWRldl9pbnN0X21hcFtpbWFnZV9tb2RlXS0+bXlfaW5kZXg7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotdm9pZCBtc21fbWN0bF9nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2KQotewotCXN0cnVjdCB0aW1lc3BlYyB0czsKLQotCUJVR19PTighdHYpOwotCi0Ja3RpbWVfZ2V0X3RzKCZ0cyk7Ci0JdHYtPnR2X3NlYyA9IHRzLnR2X3NlYzsKLQl0di0+dHZfdXNlYyA9IHRzLnR2X25zZWMvMTAwMDsKLX0KLQotc3RydWN0IG1zbV9mcmFtZV9idWZmZXIgKm1zbV9tY3RsX2J1Zl9maW5kKAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdCwgaW50IGRlbF9idWYsCi0Jc3RydWN0IG1zbV9mcmVlX2J1ZiAqZmJ1ZikKLXsKLQlzdHJ1Y3QgbXNtX2ZyYW1lX2J1ZmZlciAqYnVmID0gTlVMTCwgKnRtcDsKLQl1aW50MzJfdCBidWZfcGh5YWRkciA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0JdWludDMyX3QgYnVmX2lkeCwgb2Zmc2V0ID0gMDsKLQlzdHJ1Y3QgdmlkZW9idWYyX2NvbnRpZ19wbWVtICptZW07Ci0KLQkvKiB3ZSBhY3R1YWxseSBuZWVkIGEgbGlzdCwgbm90IGEgcXVldWUgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGNhbV9pbnN0LT52cV9pcnFsb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJ1ZiwgdG1wLAotCQkJJnBjYW1faW5zdC0+ZnJlZV92cSwgbGlzdCkgewotCQlidWZfaWR4ID0gYnVmLT52aWRidWYudjRsMl9idWYuaW5kZXg7Ci0JCW1lbSA9IHZiMl9wbGFuZV9jb29raWUoJmJ1Zi0+dmlkYnVmLCAwKTsKLQkJaWYgKG1lbSA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIiVzIEluc3QgJXAgcGxhbmUgY29va2llIGlzIG51bGwiLAotCQkJCV9fZnVuY19fLCBwY2FtX2luc3QpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNhbV9pbnN0LT52cV9pcnFsb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAobWVtLT5idWZmZXJfdHlwZSA9PSBWSURFT0JVRjJfTVVMVElQTEVfUExBTkVTKQotCQkJb2Zmc2V0ID0gbWVtLT5vZmZzZXQuZGF0YV9vZmZzZXQgKwotCQkJCXBjYW1faW5zdC0+YnVmX29mZnNldFtidWZfaWR4XVswXS5kYXRhX29mZnNldDsKLQkJZWxzZQotCQkJb2Zmc2V0ID0gbWVtLT5vZmZzZXQuc3Bfb2ZmLnlfb2ZmOwotCQlidWZfcGh5YWRkciA9ICh1bnNpZ25lZCBsb25nKQotCQkJCXZpZGVvYnVmMl90b19wbWVtX2NvbnRpZygmYnVmLT52aWRidWYsIDApICsKLQkJCQlvZmZzZXQ7Ci0JCUQoIiVzIHZiX2lkeD0lZCx2Yl9wYWRkcj0weCV4IGNoMD0weCV4XG4iLAotCQkJX19mdW5jX18sIGJ1Zi0+dmlkYnVmLnY0bDJfYnVmLmluZGV4LAotCQkJYnVmX3BoeWFkZHIsIGZidWYtPmNoX3BhZGRyWzBdKTsKLQkJaWYgKGZidWYtPmNoX3BhZGRyWzBdID09IGJ1Zl9waHlhZGRyKSB7Ci0JCQlpZiAoZGVsX2J1ZikKLQkJCQlsaXN0X2RlbF9pbml0KCZidWYtPmxpc3QpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNhbV9pbnN0LT52cV9pcnFsb2NrLAotCQkJCQkJCQlmbGFncyk7Ci0JCQlidWYtPnN0YXRlID0gTVNNX0JVRkZFUl9TVEFURV9SRVNFUlZFRDsKLQkJCXJldHVybiBidWY7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNhbV9pbnN0LT52cV9pcnFsb2NrLCBmbGFncyk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLWludCBtc21fbWN0bF9idWZfZG9uZV9wcm9jKAotCQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQkJc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0LAotCQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmICpmYnVmLAotCQl1aW50MzJfdCAqZnJhbWVfaWQsCi0JCXN0cnVjdCBtc21fY2FtX3RpbWVzdGFtcCAqY2FtX3RzKQotewotCXN0cnVjdCBtc21fZnJhbWVfYnVmZmVyICpidWYgPSBOVUxMOwotCWludCBkZWxfYnVmID0gMTsKLQotCWJ1ZiA9IG1zbV9tY3RsX2J1Zl9maW5kKHBtY3RsLCBwY2FtX2luc3QsIGRlbF9idWYsIGZidWYpOwotCWlmICghYnVmKSB7Ci0JCXByX2VycigiJXM6IGJ1Zj0weCV4IG5vdCBmb3VuZFxuIiwKLQkJCV9fZnVuY19fLCBmYnVmLT5jaF9wYWRkclswXSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoIWNhbV90cy0+cHJlc2VudCkgewotCQlpZiAoZnJhbWVfaWQpCi0JCQlidWYtPnZpZGJ1Zi52NGwyX2J1Zi5zZXF1ZW5jZSA9ICpmcmFtZV9pZDsKLQkJbXNtX21jdGxfZ2V0dGltZW9mZGF5KAotCQkJJmJ1Zi0+dmlkYnVmLnY0bDJfYnVmLnRpbWVzdGFtcCk7Ci0JfSBlbHNlIHsKLQkJRCgiJXMgQ29weWluZyB0aW1lc3RhbXAgYXMgJWxkLiVsZCIsIF9fZnVuY19fLAotCQkJY2FtX3RzLT50aW1lc3RhbXAudHZfc2VjLCBjYW1fdHMtPnRpbWVzdGFtcC50dl91c2VjKTsKLQkJYnVmLT52aWRidWYudjRsMl9idWYudGltZXN0YW1wID0gY2FtX3RzLT50aW1lc3RhbXA7Ci0JCWJ1Zi0+dmlkYnVmLnY0bDJfYnVmLnNlcXVlbmNlICA9IGNhbV90cy0+ZnJhbWVfaWQ7Ci0JfQotCUQoIiVzIE5vdGlmeSB1c2VyIGFib3V0IGJ1ZmZlciAlZCBpbWFnZV9tb2RlICVkIGZyYW1lX2lkICVkIiwgX19mdW5jX18sCi0JCWJ1Zi0+dmlkYnVmLnY0bDJfYnVmLmluZGV4LCBwY2FtX2luc3QtPmltYWdlX21vZGUsCi0JCWJ1Zi0+dmlkYnVmLnY0bDJfYnVmLnNlcXVlbmNlKTsKLQl2YjJfYnVmZmVyX2RvbmUoJmJ1Zi0+dmlkYnVmLCBWQjJfQlVGX1NUQVRFX0RPTkUpOwotCXJldHVybiAwOwotfQotCi0KLWludCBtc21fbWN0bF9idWZfZG9uZShzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwX21jdGwsCi0Jc3RydWN0IG1zbV9jYW1fYnVmX2hhbmRsZSAqYnVmX2hhbmRsZSwKLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmICpmYnVmLAotCXVpbnQzMl90IGZyYW1lX2lkKQotewotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdDsKLQlpbnQgaWR4LCByYzsKLQlpbnQgcHBfZGl2ZXJ0X3R5cGUgPSAwLCBwcF90eXBlID0gMDsKLQl1aW50MzJfdCBpbWFnZV9tb2RlOwotCXN0cnVjdCBtc21fY2FtX3RpbWVzdGFtcCBjYW1fdHM7Ci0KLQlpZiAoIXBfbWN0bCB8fCAhYnVmX2hhbmRsZSB8fCAhZmJ1ZikgewotCQlwcl9lcnIoIiVzIEludmFsaWQgYXJndW1lbnQuICIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChidWZfaGFuZGxlLT5idWZfbG9va3VwX3R5cGUgPT0gQlVGX0xPT0tVUF9CWV9JTUdfTU9ERSkKLQkJaW1hZ2VfbW9kZSA9IGJ1Zl9oYW5kbGUtPmltYWdlX21vZGU7Ci0JZWxzZQotCQlpbWFnZV9tb2RlID0gR0VUX0lNR19NT0RFKGJ1Zl9oYW5kbGUtPmluc3RfaGFuZGxlKTsKLQotCWlmIChpbWFnZV9tb2RlID4gTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9NQVgpIHsKLQkJcHJfZXJyKCIlcyBJbnZhbGlkIGltYWdlIG1vZGUgJWQgIiwgX19mdW5jX18sIGltYWdlX21vZGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltc21fbWN0bF9jaGVja19wcChwX21jdGwsIGltYWdlX21vZGUsICZwcF9kaXZlcnRfdHlwZSwgJnBwX3R5cGUpOwotCUQoIiVzOiBwcF90eXBlPSVkLCBwcF9kaXZlcnRfdHlwZSA9ICVkLCBmcmFtZV9pZCA9IDB4JXggaW1hZ2VfbW9kZSAlZCIsCi0JCV9fZnVuY19fLCBwcF90eXBlLCBwcF9kaXZlcnRfdHlwZSwgZnJhbWVfaWQsIGltYWdlX21vZGUpOwotCWlmIChwcF90eXBlIHx8IHBwX2RpdmVydF90eXBlKSB7Ci0JCXJjID0gbXNtX21jdGxfZG9fcHBfZGl2ZXJ0KHBfbWN0bCwgYnVmX2hhbmRsZSwKLQkJCWZidWYsIGZyYW1lX2lkLCBwcF90eXBlKTsKLQl9IGVsc2UgewotCQkvKiBGaW5kIHRoZSBpbnN0YW5jZSBvbiB3aGljaCB2YjJfYnVmZmVyX2RvbmUoKSBuZWVkcyB0byBiZQotCQkgKiBjYWxsZWQsIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGdldCB0aGUgYnVmZmVyLgotCQkgKiBJZiB0aGUgbG9va3VwIHR5cGUgaXMKLQkJICogLSBCeSBpbnN0YW5jZSBoYW5kbGU6Ci0JCSAqICAgIEVpdGhlciBtY3RsX3BwIGluc3QgaWR4IG9yIHZpZGVvIGluc3QgaWR4IHNob3VsZCBiZSBzZXQuCi0JCSAqICAgIFRyeSB0byBnZXQgdGhlIE1DVExfUFAgaW5zdCBpZHggZmlyc3QsIGlmIGl0cyBub3Qgc2V0LAotCQkgKiAgICBmYWxsIGJhY2sgdG8gdmlkZW8gaW5zdCBpZHguIE9uY2Ugd2UgZ2V0IHRoZSBpbnN0IGlkeCwKLQkJICogICAgZ2V0IHRoZSBwY2FtX2luc3QgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBkZXZfaW5zdFtdIG1hcC4KLQkJICogICAgSWYgbmVpdGhlciBhcmUgc2V0LCBpdHMgYSBzZXJpb3VzIGVycm9yLCB0cmlnZ2VyIGEgQlVHX09OLgotCQkgKiAtIEJ5IGltYWdlIG1vZGU6Ci0JCSAqICAgIExlZ2FjeSB1c2VjYXNlLiBVc2UgdGhlIGltYWdlIG1vZGUgYW5kIGdldCB0aGUgcGNhbV9pbnN0Ci0JCSAqICAgIGZyb20gdGhlIHZpZGVvIG5vZGUuCi0JCSAqLwotCQlpZiAoYnVmX2hhbmRsZS0+YnVmX2xvb2t1cF90eXBlID09IEJVRl9MT09LVVBfQllfSU5TVF9IQU5ETEUpIHsKLQkJCWlkeCA9IEdFVF9NQ1RMUFBfSU5TVF9JRFgoYnVmX2hhbmRsZS0+aW5zdF9oYW5kbGUpOwotCQkJaWYgKGlkeCA+IE1TTV9ERVZfSU5TVF9NQVgpIHsKLQkJCQlpZHggPSBHRVRfVklERU9fSU5TVF9JRFgoCi0JCQkJCWJ1Zl9oYW5kbGUtPmluc3RfaGFuZGxlKTsKLQkJCQlCVUdfT04oaWR4ID4gTVNNX0RFVl9JTlNUX01BWCk7Ci0JCQkJcGNhbV9pbnN0ID0gcF9tY3RsLT5wY2FtX3B0ci0+ZGV2X2luc3RbaWR4XTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGNhbV9pbnN0ID0gcF9tY3RsLT5wY2FtX3B0ci0+bWN0bF9ub2RlLgotCQkJCQlkZXZfaW5zdFtpZHhdOwotCQkJfQotCQl9IGVsc2UgaWYgKGJ1Zl9oYW5kbGUtPmJ1Zl9sb29rdXBfdHlwZSA9PQotCQkJCUJVRl9MT09LVVBfQllfSU1HX01PREUpIHsKLQkJCWlkeCA9IG1zbV9tY3RsX2ltZ19tb2RlX3RvX2luc3RfaW5kZXgocF9tY3RsLAotCQkJCWJ1Zl9oYW5kbGUtPmltYWdlX21vZGUsIDApOwotCQkJaWYgKGlkeCA8IDApIHsKLQkJCQlwcl9lcnIoIiVzIEludmFsaWQgaWR4ICVkICIsIF9fZnVuY19fLCBpZHgpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJcGNhbV9pbnN0ID0gcF9tY3RsLT5wY2FtX3B0ci0+ZGV2X2luc3RbaWR4XTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXMgSW52YWxpZCBidWZmZXIgbG9va3VwIHR5cGUgJWQiLCBfX2Z1bmNfXywKLQkJCQlidWZfaGFuZGxlLT5idWZfbG9va3VwX3R5cGUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJaWYgKCFwY2FtX2luc3QpIHsKLQkJCXByX2VycigiJXMgSW52YWxpZCBpbnN0YW5jZSwgRHJvcHBpbmcgYnVmZmVyLiAiLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCW1lbXNldCgmY2FtX3RzLCAwLCBzaXplb2YoY2FtX3RzKSk7Ci0JCXJjID0gbXNtX21jdGxfYnVmX2RvbmVfcHJvYyhwX21jdGwsIHBjYW1faW5zdCwKLQkJCWZidWYsICZmcmFtZV9pZCwgJmNhbV90cyk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9tY3RsX2J1Zl9pbml0KHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtKQotewotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsOwotCXBtY3RsID0gbXNtX2NhbV9zZXJ2ZXJfZ2V0X21jdGwocGNhbS0+bWN0bF9oYW5kbGUpOwotCWlmIChwbWN0bCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMgTm8gbWN0bCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcG1jdGwtPm1jdGxfdmJxdWV1ZV9pbml0ID0gbXNtX3ZicXVldWVfaW5pdDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpc19idWZmZXJfcXVldWVkKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtLCBpbnQgaW1hZ2VfbW9kZSkKLXsKLQlpbnQgaWR4OwotCWludCByZXQgPSAwOwotCXN0cnVjdCBtc21fZnJhbWVfYnVmZmVyICpidWYgPSBOVUxMOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdCA9IE5VTEw7Ci0JaWR4ID0gcGNhbS0+bWN0bF9ub2RlLmRldl9pbnN0X21hcFtpbWFnZV9tb2RlXS0+bXlfaW5kZXg7Ci0JcGNhbV9pbnN0ID0gcGNhbS0+bWN0bF9ub2RlLmRldl9pbnN0W2lkeF07Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShidWYsICZwY2FtX2luc3QtPmZyZWVfdnEsIGxpc3QpIHsKLQkJaWYgKGJ1Zi0+c3RhdGUgIT0gTVNNX0JVRkZFUl9TVEFURV9RVUVVRUQpCi0JCQljb250aW51ZTsKLQkJcmV0ID0gMTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqbXNtX21jdGxfZ2V0X2luc3RfYnlfaW1nX21vZGUoCi0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwsIHVpbnQzMl90IGltZ19tb2RlKQotewotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdCA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0gPSBwbWN0bC0+cGNhbV9wdHI7Ci0JaW50IGlkeDsKLQotCQkvKiBWYWxpZCBpbWFnZSBtb2RlLiBTZWFyY2ggdGhlIG1jdGwgbm9kZSBmaXJzdC4KLQkJICogSWYgbWN0bCBub2RlIGRvZXNudCBoYXZlIHRoZSBpbnN0YW5jZSwgdGhlbgotCQkgKiBzZWFyY2ggaW4gdGhlIHVzZXIncyB2aWRlbyBub2RlICovCi0JCWlmIChwbWN0bC0+dmZlX291dHB1dF9tb2RlID09IFZGRV9PVVRQVVRTX01BSU5fQU5EX1RIVU1CCi0JCXx8IHBtY3RsLT52ZmVfb3V0cHV0X21vZGUgPT0gVkZFX09VVFBVVFNfVEhVTUJfQU5EX01BSU4pIHsKLQkJCWlmIChwY2FtLT5tY3RsX25vZGUuZGV2X2luc3RfbWFwW2ltZ19tb2RlXQotCQkJJiYgaXNfYnVmZmVyX3F1ZXVlZChwY2FtLCBpbWdfbW9kZSkpIHsKLQkJCQlpZHggPSBwY2FtLT5tY3RsX25vZGUuZGV2X2luc3RfbWFwW2ltZ19tb2RlXQotCQkJCQkJCS0+bXlfaW5kZXg7Ci0JCQkJcGNhbV9pbnN0ID0gcGNhbS0+bWN0bF9ub2RlLmRldl9pbnN0W2lkeF07Ci0JCQkJRCgiJXMgRm91bmQgaW5zdGFuY2UgJXAgaW4gbWN0bCBub2RlIGRldmljZVxuIiwKLQkJCQkgIF9fZnVuY19fLCBwY2FtX2luc3QpOwotCQkJfSBlbHNlIGlmIChwY2FtLT5kZXZfaW5zdF9tYXBbaW1nX21vZGVdKSB7Ci0JCQkJaWR4ID0gcGNhbS0+ZGV2X2luc3RfbWFwW2ltZ19tb2RlXS0+bXlfaW5kZXg7Ci0JCQkJcGNhbV9pbnN0ID0gcGNhbS0+ZGV2X2luc3RbaWR4XTsKLQkJCQlEKCIlcyBGb3VuZCBpbnN0YW5jZSAlcCBpbiB2aWRlbyBkZXZpY2VcbiIsCi0JCQkJX19mdW5jX18sIHBjYW1faW5zdCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaW1nX21vZGUgPT0gTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9WMlhfTElWRVNIT1QpIHsKLQkJCQlpbWdfbW9kZSA9IE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfTUFJTjsKLQkJCWlmIChwY2FtLT5tY3RsX25vZGUuZGV2X2luc3RfbWFwW2ltZ19tb2RlXSAmJgotCQkJCQlpc19idWZmZXJfcXVldWVkKHBjYW0sIGltZ19tb2RlKSkgewotCQkJCWlkeCA9IHBjYW0tPm1jdGxfbm9kZS5kZXZfaW5zdF9tYXBbaW1nX21vZGVdCi0JCQkJCQkJLT5teV9pbmRleDsKLQkJCQlwY2FtX2luc3QgPSBwY2FtLT5tY3RsX25vZGUuZGV2X2luc3RbaWR4XTsKLQkJCQlEKCIlcyBGb3VuZCBpbnN0YW5jZSAlcCBpbiBtY3RsIG5vZGUgZGV2aWNlXG4iLAotCQkJCSAgX19mdW5jX18sIHBjYW1faW5zdCk7Ci0JCQl9IGVsc2UgaWYgKHBjYW0tPmRldl9pbnN0X21hcFtpbWdfbW9kZV0pIHsKLQkJCQlpZHggPSBwY2FtLT5kZXZfaW5zdF9tYXBbaW1nX21vZGVdLT5teV9pbmRleDsKLQkJCQlwY2FtX2luc3QgPSBwY2FtLT5kZXZfaW5zdFtpZHhdOwotCQkJCUQoIiVzIEZvdW5kIGluc3RhbmNlICVwIGluIHZpZGVvIGRldmljZVxuIiwKLQkJCQlfX2Z1bmNfXywgcGNhbV9pbnN0KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChwY2FtLT5tY3RsX25vZGUuZGV2X2luc3RfbWFwW2ltZ19tb2RlXSkgewotCQkJCWlkeCA9IHBjYW0tPm1jdGxfbm9kZS5kZXZfaW5zdF9tYXBbaW1nX21vZGVdCi0JCQkJLT5teV9pbmRleDsKLQkJCQlwY2FtX2luc3QgPSBwY2FtLT5tY3RsX25vZGUuZGV2X2luc3RbaWR4XTsKLQkJCQlEKCIlcyBGb3VuZCBpbnN0YW5jZSAlcCBpbiBtY3RsIG5vZGUgZGV2aWNlXG4iLAotCQkJCV9fZnVuY19fLCBwY2FtX2luc3QpOwotCQkJfSBlbHNlIGlmIChwY2FtLT5kZXZfaW5zdF9tYXBbaW1nX21vZGVdKSB7Ci0JCQkJaWR4ID0gcGNhbS0+ZGV2X2luc3RfbWFwW2ltZ19tb2RlXS0+bXlfaW5kZXg7Ci0JCQkJcGNhbV9pbnN0ID0gcGNhbS0+ZGV2X2luc3RbaWR4XTsKLQkJCQlEKCIlcyBGb3VuZCBpbnN0YW5jZSAlcCBpbiB2aWRlbyBkZXZpY2VcbiIsCi0JCQkJCV9fZnVuY19fLCBwY2FtX2luc3QpOwotCQkJfQotCQl9Ci0JcmV0dXJuIHBjYW1faW5zdDsKLX0KLQotc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqbXNtX21jdGxfZ2V0X3BjYW1faW5zdCgKLQkJCQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQkJCQlzdHJ1Y3QgbXNtX2NhbV9idWZfaGFuZGxlICpidWZfaGFuZGxlKQotewotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdCA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0gPSBwbWN0bC0+cGNhbV9wdHI7Ci0JaW50IGlkeDsKLQotCS8qIEdldCB0aGUgcGNhbSBpbnN0YW5jZSBvbiBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHJ1bGVzOgotCSAqIElmIHRoZSBsb29rdXAgdHlwZSBpcwotCSAqIC0gQnkgaW5zdGFuY2UgaGFuZGxlOgotCSAqICAgIEVpdGhlciBtY3RsX3BwIGluc3QgaWR4IG9yIHZpZGVvIGluc3QgaWR4IHNob3VsZCBiZSBzZXQuCi0JICogICAgVHJ5IHRvIGdldCB0aGUgTUNUTF9QUCBpbnN0IGlkeCBmaXJzdCwgaWYgaXRzIG5vdCBzZXQsCi0JICogICAgZmFsbCBiYWNrIHRvIHZpZGVvIGluc3QgaWR4LiBPbmNlIHdlIGdldCB0aGUgaW5zdCBpZHgsCi0JICogICAgZ2V0IHRoZSBwY2FtX2luc3QgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBkZXZfaW5zdFtdIG1hcC4KLQkgKiAgICBJZiBuZWl0aGVyIGFyZSBzZXQsIGl0cyBhIHNlcmlvdXMgZXJyb3IsIHRyaWdnZXIgYSBCVUdfT04uCi0JICogLSBCeSBpbWFnZSBtb2RlOihMZWdhY3kgdXNlY2FzZSkKLQkgKiAgICBJZiB2ZmUgaXMgaW4gY29uZmlndXJlZCBpbiBzbmFwc2hvdCBtb2RlLCBmaXJzdCBjaGVjayBpZgotCSAqICAgIG1jdGwgcHAgbm9kZSBoYXMgYSBpbnN0YW5jZSBjcmVhdGVkIGZvciB0aGlzIGltYWdlIG1vZGUKLQkgKiAgICBhbmQgaWYgdGhlcmUgaXMgYSBidWZmZXIgcXVldWVkIGZvciB0aGF0IGluc3RhbmNlLgotCSAqICAgIElmIHNvLCByZXR1cm4gdGhhdCBpbnN0YW5jZSwgb3RoZXJ3aXNlIGdldCB0aGUgcGNhbSBpbnN0YW5jZQotCSAqICAgIGZvciB0aGlzIGltYWdlX21vZGUgZnJvbSB0aGUgdmlkZW8gaW5zdGFuY2UuCi0JICogICAgSWYgdGhlIHZmZSBpcyBjb25maWd1cmVkIGluIGFueSBvdGhlciBtb2RlLCB0aGVuIGZpcnN0IGNoZWNrCi0JICogICAgaWYgbWN0bCBwcCBub2RlIGhhcyBhIGluc3RhbmNlIGNyZWF0ZWQgZm9yIHRoaXMgaW1hZ2UgbW9kZSwKLQkgKiAgICBvdGhlcndpc2UgZ2V0IHRoZSBwY2FtIGluc3RhbmNlIGZvciB0aGlzIGltYWdlIG1vZGUgZnJvbSB0aGUKLQkgKiAgICB2aWRlbyBpbnN0YW5jZS4KLQkgKi8KLQlpZiAoYnVmX2hhbmRsZS0+YnVmX2xvb2t1cF90eXBlID09IEJVRl9MT09LVVBfQllfSU5TVF9IQU5ETEUpIHsKLQkJaWR4ID0gR0VUX01DVExQUF9JTlNUX0lEWChidWZfaGFuZGxlLT5pbnN0X2hhbmRsZSk7Ci0JCWlmIChpZHggPiBNU01fREVWX0lOU1RfTUFYKSB7Ci0JCQlpZHggPSBHRVRfVklERU9fSU5TVF9JRFgoYnVmX2hhbmRsZS0+aW5zdF9oYW5kbGUpOwotCQkJQlVHX09OKGlkeCA+IE1TTV9ERVZfSU5TVF9NQVgpOwotCQkJcGNhbV9pbnN0ID0gcGNhbS0+ZGV2X2luc3RbaWR4XTsKLQkJfSBlbHNlIHsKLQkJCXBjYW1faW5zdCA9IHBjYW0tPm1jdGxfbm9kZS5kZXZfaW5zdFtpZHhdOwotCQl9Ci0JfSBlbHNlIGlmICgoYnVmX2hhbmRsZS0+YnVmX2xvb2t1cF90eXBlID09IEJVRl9MT09LVVBfQllfSU1HX01PREUpCi0JCSYmIChidWZfaGFuZGxlLT5pbWFnZV9tb2RlID49IDAgJiYKLQkJYnVmX2hhbmRsZS0+aW1hZ2VfbW9kZSA8IE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfTUFYKSkgewotCQlwY2FtX2luc3QgPSBtc21fbWN0bF9nZXRfaW5zdF9ieV9pbWdfbW9kZShwbWN0bCwKLQkJCQlidWZfaGFuZGxlLT5pbWFnZV9tb2RlKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzIEludmFsaWQgYnVmZmVyIGxvb2t1cCB0eXBlICVkIiwgX19mdW5jX18sCi0JCQlidWZfaGFuZGxlLT5idWZfbG9va3VwX3R5cGUpOwotCX0KLQlyZXR1cm4gcGNhbV9pbnN0OwotfQotCi1pbnQgbXNtX21jdGxfcmVzZXJ2ZV9mcmVlX2J1ZigKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwcmVmX3BjYW1faW5zdCwKLQlzdHJ1Y3QgbXNtX2NhbV9idWZfaGFuZGxlICpidWZfaGFuZGxlLAotCXN0cnVjdCBtc21fZnJlZV9idWYgKmZyZWVfYnVmKQotewotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdCA9IHByZWZfcGNhbV9pbnN0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXN0cnVjdCB2aWRlb2J1ZjJfY29udGlnX3BtZW0gKm1lbTsKLQlzdHJ1Y3QgbXNtX2ZyYW1lX2J1ZmZlciAqYnVmID0gTlVMTDsKLQlpbnQgcmMgPSAtRUlOVkFMLCBpOwotCXVpbnQzMl90IGJ1Zl9pZHgsIHBsYW5lX29mZnNldCA9IDA7Ci0KLQlpZiAoIWZyZWVfYnVmIHx8ICFwbWN0bCB8fCAhYnVmX2hhbmRsZSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCW1lbXNldChmcmVlX2J1ZiwgMCwgc2l6ZW9mKHN0cnVjdCBtc21fZnJlZV9idWYpKTsKLQotCS8qIElmIHRoZSBjYWxsZXIgd2FudHMgdG8gcmVzZXJ2ZSBhIGJ1ZmZlciBmcm9tIGEgcGFydGljdWxhcgotCSAqIGNhbWVyYSBpbnN0YW5jZSwgaGUgd291bGQgc2VuZCB0aGUgcHJlZmVycmVkIGNhbWVyYSBpbnN0YW5jZS4KLQkgKiBJZiB0aGUgcHJlZmVycmVkIGNhbWVyYSBpbnN0YW5jZSBpcyBOVUxMLCBnZXQgdGhlCi0JICogY2FtZXJhIGluc3RhbmNlIHVzaW5nIHRoZSBpbWFnZSBtb2RlIHBhc3NlZCAqLwotCWlmICghcGNhbV9pbnN0KQotCQlwY2FtX2luc3QgPSBtc21fbWN0bF9nZXRfcGNhbV9pbnN0KHBtY3RsLCBidWZfaGFuZGxlKTsKLQotCWlmICghcGNhbV9pbnN0IHx8ICFwY2FtX2luc3QtPnN0cmVhbW9uKSB7Ci0JCXByX2VycigiJXM6IHN0cmVhbSBpcyB0dXJuZWQgb2ZmXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByYzsKLQl9Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBjYW1faW5zdC0+dnFfaXJxbG9jaywgZmxhZ3MpOwotCWlmIChwY2FtX2luc3QtPmZyZWVfdnEubmV4dCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMgSW5zdCAlcCBGcmVlIHF1ZXVlIGhlYWQgaXMgbnVsbCIsCi0JCQlfX2Z1bmNfXywgcGNhbV9pbnN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNhbV9pbnN0LT52cV9pcnFsb2NrLCBmbGFncyk7Ci0JCXJldHVybiByYzsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShidWYsICZwY2FtX2luc3QtPmZyZWVfdnEsIGxpc3QpIHsKLQkJaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIiVzIEluc3QgJXAgSW52YWxpZCBidWZmZXIgcHRyIiwKLQkJCQlfX2Z1bmNfXywgcGNhbV9pbnN0KTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjYW1faW5zdC0+dnFfaXJxbG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCWlmIChidWYtPnN0YXRlICE9IE1TTV9CVUZGRVJfU1RBVEVfUVVFVUVEKQotCQkJY29udGludWU7Ci0KLQkJYnVmX2lkeCA9IGJ1Zi0+dmlkYnVmLnY0bDJfYnVmLmluZGV4OwotCQlpZiAocGNhbV9pbnN0LT52aWRfZm10LnR5cGUgPT0KLQkJCQlWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7Ci0JCQlmcmVlX2J1Zi0+bnVtX3BsYW5lcyA9Ci0JCQkJcGNhbV9pbnN0LT5wbGFuZV9pbmZvLm51bV9wbGFuZXM7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZnJlZV9idWYtPm51bV9wbGFuZXM7IGkrKykgewotCQkJCW1lbSA9IHZiMl9wbGFuZV9jb29raWUoJmJ1Zi0+dmlkYnVmLCBpKTsKLQkJCQlpZiAobWVtID09IE5VTEwpIHsKLQkJCQkJcHJfZXJyKCIlcyBJbnN0ICVwICVkIGludmFsaWQgY29va2llIiwKLQkJCQkJCV9fZnVuY19fLCBwY2FtX2luc3QsIGJ1Zl9pZHgpOwotCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAotCQkJCQkJJnBjYW1faW5zdC0+dnFfaXJxbG9jaywgZmxhZ3MpOwotCQkJCQlyZXR1cm4gcmM7Ci0JCQkJfQotCQkJCWlmIChtZW0tPmJ1ZmZlcl90eXBlID09Ci0JCQkJCQlWSURFT0JVRjJfTVVMVElQTEVfUExBTkVTKQotCQkJCQlwbGFuZV9vZmZzZXQgPQotCQkJCQltZW0tPm9mZnNldC5kYXRhX29mZnNldDsKLQkJCQllbHNlCi0JCQkJCXBsYW5lX29mZnNldCA9Ci0JCQkJCW1lbS0+b2Zmc2V0LnNwX29mZi5jYmNyX29mZjsKLQotCQkJCUQoIiVzOiBkYXRhIG9mZiAlZCBwbGFuZSBvZmYgJWQiLAotCQkJCQlfX2Z1bmNfXywKLQkJCQkJcGNhbV9pbnN0LT5idWZfb2Zmc2V0W2J1Zl9pZHhdW2ldLgotCQkJCQlkYXRhX29mZnNldCwgcGxhbmVfb2Zmc2V0KTsKLQkJCQlmcmVlX2J1Zi0+Y2hfcGFkZHJbaV0gPQkodWludDMyX3QpCi0JCQkJdmlkZW9idWYyX3RvX3BtZW1fY29udGlnKCZidWYtPnZpZGJ1ZiwgaSkgKwotCQkJCXBjYW1faW5zdC0+YnVmX29mZnNldFtidWZfaWR4XVtpXS5kYXRhX29mZnNldCArCi0JCQkJcGxhbmVfb2Zmc2V0OwotCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQltZW0gPSB2YjJfcGxhbmVfY29va2llKCZidWYtPnZpZGJ1ZiwgMCk7Ci0JCQlpZiAobWVtID09IE5VTEwpIHsKLQkJCQlwcl9lcnIoIiVzIEluc3QgJXAgJWQgaW52YWxpZCBjb29raWUiLAotCQkJCQlfX2Z1bmNfXywgcGNhbV9pbnN0LCBidWZfaWR4KTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAotCQkJCQkmcGNhbV9pbnN0LT52cV9pcnFsb2NrLCBmbGFncyk7Ci0JCQkJcmV0dXJuIHJjOwotCQkJfQotCQkJZnJlZV9idWYtPmNoX3BhZGRyWzBdID0gKHVpbnQzMl90KQotCQkJCXZpZGVvYnVmMl90b19wbWVtX2NvbnRpZygmYnVmLT52aWRidWYsIDApICsKLQkJCQltZW0tPm9mZnNldC5zcF9vZmYueV9vZmY7Ci0JCQlmcmVlX2J1Zi0+Y2hfcGFkZHJbMV0gPQlmcmVlX2J1Zi0+Y2hfcGFkZHJbMF0gKwotCQkJCW1lbS0+b2Zmc2V0LnNwX29mZi5jYmNyX29mZjsKLQkJfQotCQlmcmVlX2J1Zi0+dmIgPSAodWludDMyX3QpYnVmOwotCQlidWYtPnN0YXRlID0gTVNNX0JVRkZFUl9TVEFURV9SRVNFUlZFRDsKLQkJRCgiJXMgaW5zdD0weCVwLCBpZHg9JWQsIHBhZGRyPTB4JXgsICIKLQkJCSJjaDEgYWRkcj0weCV4XG4iLCBfX2Z1bmNfXywKLQkJCXBjYW1faW5zdCwgYnVmLT52aWRidWYudjRsMl9idWYuaW5kZXgsCi0JCQlmcmVlX2J1Zi0+Y2hfcGFkZHJbMF0sIGZyZWVfYnVmLT5jaF9wYWRkclsxXSk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCWlmIChyYyAhPSAwKQotCQlEKCIlczpObyBmcmVlIGJ1ZmZlciBhdmFpbGFibGU6IGluc3QgPSAweCVwICIsCi0JCQkJX19mdW5jX18sIHBjYW1faW5zdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNhbV9pbnN0LT52cV9pcnFsb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX21jdGxfcmVsZWFzZV9mcmVlX2J1ZihzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQkJCQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3QsCi0JCQkJc3RydWN0IG1zbV9mcmVlX2J1ZiAqZnJlZV9idWYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0Jc3RydWN0IG1zbV9mcmFtZV9idWZmZXIgKmJ1ZiA9IE5VTEw7Ci0JdWludDMyX3QgYnVmX3BoeWFkZHIgPSAwOwotCWludCByYyA9IC1FSU5WQUw7Ci0KLQlpZiAoIXBjYW1faW5zdCB8fCAhZnJlZV9idWYpIHsKLQkJcHJfZXJyKCIlcyBJbnZhbGlkIGFyZ3VtZW50LCBidWZmZXIgd2lsbCBub3QgYmUgcmV0dXJuZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGNhbV9pbnN0LT52cV9pcnFsb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShidWYsICZwY2FtX2luc3QtPmZyZWVfdnEsIGxpc3QpIHsKLQkJYnVmX3BoeWFkZHIgPQotCQkJKHVpbnQzMl90KSB2aWRlb2J1ZjJfdG9fcG1lbV9jb250aWcoJmJ1Zi0+dmlkYnVmLCAwKTsKLQkJaWYgKGZyZWVfYnVmLT5jaF9wYWRkclswXSA9PSBidWZfcGh5YWRkcikgewotCQkJRCgiJXMgUmV0dXJuIGJ1ZmZlciAlZCBhbmQgbWFyayBpdCBhcyBRVUVVRURcbiIsCi0JCQkJX19mdW5jX18sIGJ1Zi0+dmlkYnVmLnY0bDJfYnVmLmluZGV4KTsKLQkJCWJ1Zi0+c3RhdGUgPSBNU01fQlVGRkVSX1NUQVRFX1FVRVVFRDsKLQkJCXJjID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjYW1faW5zdC0+dnFfaXJxbG9jaywgZmxhZ3MpOwotCi0JaWYgKHJjKQotCQlwcl9lcnIoIiVzIENhbm5vdCBmaW5kIGJ1ZmZlciAleCIsIF9fZnVuY19fLAotCQkJZnJlZV9idWYtPmNoX3BhZGRyWzBdKTsKLQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9tY3RsX2J1Zl9kb25lX3BwKHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXN0cnVjdCBtc21fY2FtX2J1Zl9oYW5kbGUgKmJ1Zl9oYW5kbGUsCi0Jc3RydWN0IG1zbV9mcmVlX2J1ZiAqZnJhbWUsCi0Jc3RydWN0IG1zbV9jYW1fcmV0dXJuX2ZyYW1lX2luZm8gKnJldF9mcmFtZSkKLXsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3QgPSBOVUxMOwotCWludCByYyA9IDAsIGlkeDsKLQlzdHJ1Y3QgbXNtX2NhbV90aW1lc3RhbXAgY2FtX3RzOwotCi0JaWYgKCFwbWN0bCB8fCAhYnVmX2hhbmRsZSB8fCAhcmV0X2ZyYW1lKSB7Ci0JCXByX2VycigiJXMgSW52YWxpZCBhcmd1bWVudCAiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChidWZfaGFuZGxlLT5idWZfbG9va3VwX3R5cGUgPT0gQlVGX0xPT0tVUF9CWV9JTlNUX0hBTkRMRSkgewotCQlpZHggPSBHRVRfTUNUTFBQX0lOU1RfSURYKGJ1Zl9oYW5kbGUtPmluc3RfaGFuZGxlKTsKLQkJaWYgKGlkeCA+IE1TTV9ERVZfSU5TVF9NQVgpIHsKLQkJCWlkeCA9IEdFVF9WSURFT19JTlNUX0lEWChidWZfaGFuZGxlLT5pbnN0X2hhbmRsZSk7Ci0JCQlCVUdfT04oaWR4ID4gTVNNX0RFVl9JTlNUX01BWCk7Ci0JCQlwY2FtX2luc3QgPSBwbWN0bC0+cGNhbV9wdHItPmRldl9pbnN0W2lkeF07Ci0JCX0gZWxzZSB7Ci0JCQlwY2FtX2luc3QgPSBwbWN0bC0+cGNhbV9wdHItPm1jdGxfbm9kZS5kZXZfaW5zdFtpZHhdOwotCQl9Ci0JfSBlbHNlIGlmIChidWZfaGFuZGxlLT5idWZfbG9va3VwX3R5cGUgPT0gQlVGX0xPT0tVUF9CWV9JTUdfTU9ERSkgewotCQlpZHggPSBtc21fbWN0bF9pbWdfbW9kZV90b19pbnN0X2luZGV4KHBtY3RsLAotCQkJYnVmX2hhbmRsZS0+aW1hZ2VfbW9kZSwgcmV0X2ZyYW1lLT5ub2RlX3R5cGUpOwotCQlpZiAoaWR4IDwgMCkgewotCQkJcHJfZXJyKCIlcyBJbnZhbGlkIGluc3RhbmNlLCBidWZmZXIgbm90IHJlbGVhc2VkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHVybiBpZHg7Ci0JCX0KLQkJaWYgKHJldF9mcmFtZS0+bm9kZV90eXBlKQotCQkJcGNhbV9pbnN0ID0gcG1jdGwtPnBjYW1fcHRyLT5tY3RsX25vZGUuZGV2X2luc3RbaWR4XTsKLQkJZWxzZQotCQkJcGNhbV9pbnN0ID0gcG1jdGwtPnBjYW1fcHRyLT5kZXZfaW5zdFtpZHhdOwotCX0KLQlpZiAoIXBjYW1faW5zdCkgewotCQlwcl9lcnIoIiVzIEludmFsaWQgaW5zdGFuY2UsIGNhbm5vdCBzZW5kIGJ1ZiB0byB1c2VyIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JRCgiJXM6aW5zdD0weCVwLCBwYWRkcj0weCV4LCBkaXJ0eT0lZCIsCi0JCV9fZnVuY19fLCBwY2FtX2luc3QsIGZyYW1lLT5jaF9wYWRkclswXSwgcmV0X2ZyYW1lLT5kaXJ0eSk7Ci0JY2FtX3RzLnByZXNlbnQgPSAxOwotCWNhbV90cy50aW1lc3RhbXAgPSByZXRfZnJhbWUtPnRpbWVzdGFtcDsKLQljYW1fdHMuZnJhbWVfaWQgICA9IHJldF9mcmFtZS0+ZnJhbWVfaWQ7Ci0JaWYgKHJldF9mcmFtZS0+ZGlydHkpCi0JCS8qIHRoZSBmcmFtZSBpcyBkaXJ0eSwgbm90IGdvaW5nIHRvIGRpc3B0YWNoIHRvIGFwcCAqLwotCQlyYyA9IG1zbV9tY3RsX3JlbGVhc2VfZnJlZV9idWYocG1jdGwsIHBjYW1faW5zdCwgZnJhbWUpOwotCWVsc2UKLQkJcmMgPSBtc21fbWN0bF9idWZfZG9uZV9wcm9jKHBtY3RsLCBwY2FtX2luc3QsIGZyYW1lLAotCQkJTlVMTCwgJmNhbV90cyk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX21jdGxfYnVmX3JldHVybl9idWYoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwsCi0JCQlpbnQgaW1hZ2VfbW9kZSwgc3RydWN0IG1zbV9mcmFtZV9idWZmZXIgKnJidWYpCi17Ci0JaW50IGlkeCA9IDA7Ci0Jc3RydWN0IG1zbV9mcmFtZV9idWZmZXIgKmJ1ZiA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0OwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtID0gcG1jdGwtPnBjYW1fcHRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCi0JaWYgKHBjYW0tPm1jdGxfbm9kZS5kZXZfaW5zdF9tYXBbaW1hZ2VfbW9kZV0pIHsKLQkJaWR4ID0gcGNhbS0+bWN0bF9ub2RlLmRldl9pbnN0X21hcFtpbWFnZV9tb2RlXS0+bXlfaW5kZXg7Ci0JCXBjYW1faW5zdCA9IHBjYW0tPm1jdGxfbm9kZS5kZXZfaW5zdFtpZHhdOwotCQlEKCIlcyBGb3VuZCBpbnN0YW5jZSAlcCBpbiBtY3RsIG5vZGUgZGV2aWNlXG4iLAotCQkJX19mdW5jX18sIHBjYW1faW5zdCk7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlcyBJbnZhbGlkIGltYWdlIG1vZGUgJWQgIiwgX19mdW5jX18sIGltYWdlX21vZGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIXBjYW1faW5zdCkgewotCQlwcl9lcnIoIiVzIEludmFsaWQgaW5zdGFuY2VcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBjYW1faW5zdC0+dnFfaXJxbG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmcGNhbV9pbnN0LT5mcmVlX3ZxKSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1ZiwgJnBjYW1faW5zdC0+ZnJlZV92cSwgbGlzdCkgewotCQkJaWYgKHJidWYgPT0gYnVmKSB7Ci0JCQkJRCgiJXMgUmV0dXJuIGJ1ZmZlciAleCBpbiBwY2FtX2luc3QgJXAgIiwKLQkJCQlfX2Z1bmNfXywgKGludClyYnVmLCBwY2FtX2luc3QpOwotCQkJCWJ1Zi0+c3RhdGUgPSBNU01fQlVGRkVSX1NUQVRFX1FVRVVFRDsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2FtX2luc3QtPnZxX2lycWxvY2ssCi0JCQkJCWZsYWdzKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2FtX2luc3QtPnZxX2lycWxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotI2lmZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0vKiBVbm1hcCB1c2luZyBJT04gQVBJcyAqLwotc3RhdGljIHZvaWQgX19tc21fbWN0bF91bm1hcF91c2VyX2ZyYW1lKHN0cnVjdCBtc21fY2FtX21ldGFfZnJhbWUgKm1ldGFfZnJhbWUsCi0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgaW50IGRvbWFpbl9udW0pCi17Ci0JaW50IGkgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBtZXRhX2ZyYW1lLT5mcmFtZS5udW1fcGxhbmVzOyBpKyspIHsKLQkJRCgiJXMgUGxhbmUgJWQgaGFuZGxlICVwIiwgX19mdW5jX18sIGksCi0JCQltZXRhX2ZyYW1lLT5tYXBbaV0uaGFuZGxlKTsKLQkJaW9uX3VubWFwX2lvbW11KGNsaWVudCwgbWV0YV9mcmFtZS0+bWFwW2ldLmhhbmRsZSwKLQkJCQkJZG9tYWluX251bSwgMCk7Ci0JCWlvbl9mcmVlKGNsaWVudCwgbWV0YV9mcmFtZS0+bWFwW2ldLmhhbmRsZSk7Ci0JfQotfQotCi0vKiBNYXAgdXNpbmcgSU9OIEFQSXMgKi8KLXN0YXRpYyBpbnQgX19tc21fbWN0bF9tYXBfdXNlcl9mcmFtZShzdHJ1Y3QgbXNtX2NhbV9tZXRhX2ZyYW1lICptZXRhX2ZyYW1lLAotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIGludCBkb21haW5fbnVtKQotewotCXVuc2lnbmVkIGxvbmcgcGFkZHIgPSAwOwotCXVuc2lnbmVkIGxvbmcgbGVuID0gMDsKLQlpbnQgaSA9IDAsIGogPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IG1ldGFfZnJhbWUtPmZyYW1lLm51bV9wbGFuZXM7IGkrKykgewotCQltZXRhX2ZyYW1lLT5tYXBbaV0uaGFuZGxlID0gaW9uX2ltcG9ydF9kbWFfYnVmKGNsaWVudCwKLQkJCW1ldGFfZnJhbWUtPmZyYW1lLm1wW2ldLmZkKTsKLQkJaWYgKElTX0VSUl9PUl9OVUxMKG1ldGFfZnJhbWUtPm1hcFtpXS5oYW5kbGUpKSB7Ci0JCQlwcl9lcnIoIiVzOiBpb25faW1wb3J0IGZhaWxlZCBmb3IgcGxhbmUgPSAlZCBmZCA9ICVkIiwKLQkJCQlfX2Z1bmNfXywgaSwgbWV0YV9mcmFtZS0+ZnJhbWUubXBbaV0uZmQpOwotCQkJLyogUm9sbCBiYWNrIHByZXZpb3VzIHBsYW5lIG1hcHBpbmdzLCBpZiBhbnkgKi8KLQkJCWZvciAoaiA9IGktMTsgaiA+PSAwOyBqLS0pIHsKLQkJCQlpb25fdW5tYXBfaW9tbXUoY2xpZW50LAotCQkJCQltZXRhX2ZyYW1lLT5tYXBbal0uaGFuZGxlLAotCQkJCQlkb21haW5fbnVtLCAwKTsKLQkJCQlpb25fZnJlZShjbGllbnQsIG1ldGFfZnJhbWUtPm1hcFtqXS5oYW5kbGUpOwotCQkJfQotCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCX0KLQkJRCgiJXMgTWFwcGluZyBmZCAlZCBwbGFuZSAlZCBoYW5kbGUgJXAiLCBfX2Z1bmNfXywKLQkJCW1ldGFfZnJhbWUtPmZyYW1lLm1wW2ldLmZkLCBpLAotCQkJbWV0YV9mcmFtZS0+bWFwW2ldLmhhbmRsZSk7Ci0JCWlmIChpb25fbWFwX2lvbW11KGNsaWVudCwgbWV0YV9mcmFtZS0+bWFwW2ldLmhhbmRsZSwKLQkJCQlkb21haW5fbnVtLCAwLCBTWl80SywKLQkJCQkwLCAmcGFkZHIsICZsZW4sIDAsIDApIDwgMCkgewotCQkJcHJfZXJyKCIlczogY2Fubm90IG1hcCBhZGRyZXNzIHBsYW5lICVkIiwgX19mdW5jX18sIGkpOwotCQkJaW9uX2ZyZWUoY2xpZW50LCBtZXRhX2ZyYW1lLT5tYXBbaV0uaGFuZGxlKTsKLQkJCS8qIFJvbGwgYmFjayBwcmV2aW91cyBwbGFuZSBtYXBwaW5ncywgaWYgYW55ICovCi0JCQlmb3IgKGogPSBpLTE7IGogPj0gMDsgai0tKSB7Ci0JCQkJaWYgKG1ldGFfZnJhbWUtPm1hcFtqXS5oYW5kbGUpIHsKLQkJCQkJaW9uX3VubWFwX2lvbW11KGNsaWVudCwKLQkJCQkJCW1ldGFfZnJhbWUtPm1hcFtqXS5oYW5kbGUsCi0JCQkJCQlkb21haW5fbnVtLCAwKTsKLQkJCQkJaW9uX2ZyZWUoY2xpZW50LAotCQkJCQkJbWV0YV9mcmFtZS0+bWFwW2pdLmhhbmRsZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQkvKiBWYWxpZGF0ZSB0aGUgb2Zmc2V0cyB3aXRoIHRoZSBtYXBwZWQgbGVuZ3RoLiAqLwotCQlpZiAoKG1ldGFfZnJhbWUtPmZyYW1lLm1wW2ldLmFkZHJfb2Zmc2V0ID4gbGVuKSB8fAotCQkJKG1ldGFfZnJhbWUtPmZyYW1lLm1wW2ldLmRhdGFfb2Zmc2V0ICsKLQkJCW1ldGFfZnJhbWUtPmZyYW1lLm1wW2ldLmxlbmd0aCA+IGxlbikpIHsKLQkJCXByX2VycigiJXM6IEludmFsaWQgb2Zmc2V0cyBBICVkIEQgJWQgTCAlZCBsZW4gJWxkIiwKLQkJCQlfX2Z1bmNfXywgbWV0YV9mcmFtZS0+ZnJhbWUubXBbaV0uYWRkcl9vZmZzZXQsCi0JCQkJbWV0YV9mcmFtZS0+ZnJhbWUubXBbaV0uZGF0YV9vZmZzZXQsCi0JCQkJbWV0YV9mcmFtZS0+ZnJhbWUubXBbaV0ubGVuZ3RoLCBsZW4pOwotCQkJLyogUm9sbCBiYWNrIHByZXZpb3VzIHBsYW5lIG1hcHBpbmdzLCBpZiBhbnkgKi8KLQkJCWZvciAoaiA9IGk7IGogPj0gMDsgai0tKSB7Ci0JCQkJaWYgKG1ldGFfZnJhbWUtPm1hcFtqXS5oYW5kbGUpIHsKLQkJCQkJaW9uX3VubWFwX2lvbW11KGNsaWVudCwKLQkJCQkJCW1ldGFfZnJhbWUtPm1hcFtqXS5oYW5kbGUsCi0JCQkJCQlkb21haW5fbnVtLCAwKTsKLQkJCQkJaW9uX2ZyZWUoY2xpZW50LAotCQkJCQkJbWV0YV9mcmFtZS0+bWFwW2pdLmhhbmRsZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJbWV0YV9mcmFtZS0+bWFwW2ldLmRhdGFfb2Zmc2V0ID0KLQkJCW1ldGFfZnJhbWUtPmZyYW1lLm1wW2ldLmRhdGFfb2Zmc2V0OwotCQkvKiBBZGQgdGhlIGFkZHJfb2Zmc2V0IHRvIHRoZSBwYWRkciBoZXJlIGl0c2VsZi4gVGhlIGFkZHJfb2Zmc2V0Ci0JCSAqIHdpbGwgYmUgbm9uLXplcm8gb25seSBpZiB0aGUgdXNlciBoYXMgYWxsb2NhdGVkIGEgYnVmZmVyIHdpdGgKLQkJICogYSBzaW5nbGUgZmQsIGJ1dCBsb2dpY2FsbHkgcGFydGl0aW9uZWQgaXQgaW50bwotCQkgKiBtdWx0aXBsZSBwbGFuZXMgb3IgYnVmZmVycy4qLwotCQlwYWRkciArPSBtZXRhX2ZyYW1lLT5mcmFtZS5tcFtpXS5hZGRyX29mZnNldDsKLQkJbWV0YV9mcmFtZS0+bWFwW2ldLnBhZGRyID0gcGFkZHI7Ci0JCW1ldGFfZnJhbWUtPm1hcFtpXS5sZW4gPSBsZW47Ci0JCUQoIiVzIFBsYW5lICVkIGZkICVkIGhhbmRsZSAlcCBwYWRkciAleCIsIF9fZnVuY19fLAotCQkJaSwgbWV0YV9mcmFtZS0+ZnJhbWUubXBbaV0uZmQsCi0JCQltZXRhX2ZyYW1lLT5tYXBbaV0uaGFuZGxlLAotCQkJKHVpbnQzMl90KW1ldGFfZnJhbWUtPm1hcFtpXS5wYWRkcik7Ci0JfQotCUQoIiVzIEZyYW1lIG1hcHBlZCBzdWNjZXNzZnVsbHkgIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLWludCBtc21fbWN0bF9tYXBfdXNlcl9mcmFtZShzdHJ1Y3QgbXNtX2NhbV9tZXRhX2ZyYW1lICptZXRhX2ZyYW1lLAotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIGludCBkb21haW5fbnVtKQotewotCi0JaWYgKChOVUxMID09IG1ldGFfZnJhbWUpIHx8IChOVUxMID09IGNsaWVudCkpIHsKLQkJcHJfZXJyKCIlcyBJbnZhbGlkIGlucHV0ICIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbWVtc2V0KCZtZXRhX2ZyYW1lLT5tYXBbMF0sIDAsCi0JCXNpemVvZihzdHJ1Y3QgbXNtX2NhbV9idWZfbWFwX2luZm8pICogVklERU9fTUFYX1BMQU5FUyk7Ci0KLQlyZXR1cm4gX19tc21fbWN0bF9tYXBfdXNlcl9mcmFtZShtZXRhX2ZyYW1lLCBjbGllbnQsIGRvbWFpbl9udW0pOwotfQotCi1pbnQgbXNtX21jdGxfdW5tYXBfdXNlcl9mcmFtZShzdHJ1Y3QgbXNtX2NhbV9tZXRhX2ZyYW1lICptZXRhX2ZyYW1lLAotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIGludCBkb21haW5fbnVtKQotewotCWlmICgoTlVMTCA9PSBtZXRhX2ZyYW1lKSB8fCAoTlVMTCA9PSBjbGllbnQpKSB7Ci0JCXByX2VycigiJXMgSW52YWxpZCBpbnB1dCAiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlfX21zbV9tY3RsX3VubWFwX3VzZXJfZnJhbWUobWV0YV9mcmFtZSwgY2xpZW50LCBkb21haW5fbnVtKTsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tc21fbWN0bF9wcC5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV9tY3RsX3BwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlM2NlNjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV9tY3RsX3BwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXYuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KLQotCi0KLSNpbmNsdWRlICJtc20uaCIKLSNpbmNsdWRlICJtc21fdnBlLmgiCi0KLSNpZmRlZiBDT05GSUdfTVNNX0NBTUVSQV9ERUJVRwotI2RlZmluZSBEKGZtdCwgYXJncy4uLikgcHJfZGVidWcoIm1zbV9tY3RsOiAiIGZtdCwgIyNhcmdzKQotI2Vsc2UKLSNkZWZpbmUgRChmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgbXNtX21jdGxfcHBfYnVmX2RpdmVydCgKLQkJCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCQkJc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0LAotCQkJc3RydWN0IG1zbV9jYW1fZXZ0X2RpdmVydF9mcmFtZSAqZGl2KQotewotCXN0cnVjdCB2NGwyX2V2ZW50IHY0bDJfZXZ0OwotCXN0cnVjdCBtc21faXNwX2V2ZW50X2N0cmwgKmlzcF9ldmVudDsKLQlpc3BfZXZlbnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2lzcF9ldmVudF9jdHJsKSwKLQkJCQkJCUdGUF9BVE9NSUMpOwotCWlmICghaXNwX2V2ZW50KSB7Ci0JCXByX2VycigiJXMgSW5zdWZmaWNpZW50IG1lbW9yeS4gcmV0dXJuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JRCgiJXM6IG1zbV9jYW1fZXZ0X2RpdmVydF9mcmFtZT0lZCIsCi0JCV9fZnVuY19fLCBzaXplb2Yoc3RydWN0IG1zbV9jYW1fZXZ0X2RpdmVydF9mcmFtZSkpOwotCW1lbXNldCgmdjRsMl9ldnQsIDAsIHNpemVvZih2NGwyX2V2dCkpOwotCXY0bDJfZXZ0LmlkID0gMDsKLQl2NGwyX2V2dC50eXBlID0gVjRMMl9FVkVOVF9QUklWQVRFX1NUQVJUICsKLQkJCU1TTV9DQU1fUkVTUF9ESVZfRlJBTUVfRVZUX01TRzsKLQkqKCh1aW50MzJfdCAqKXY0bDJfZXZ0LnUuZGF0YSkgPSAodWludDMyX3QpaXNwX2V2ZW50OwotCS8qIENvcHkgdGhlIGRpdmVydCBmcmFtZSBzdHJ1Y3QgaW50byBldmVudCBjdHJsIHN0cnVjdC4gKi8KLQlpc3BfZXZlbnQtPmlzcF9kYXRhLmRpdl9mcmFtZSA9ICpkaXY7Ci0KLQlEKCIlcyBpbnN0PSVwLCBpbWdfbW9kZT0lZCwgZnJhbWVfaWQ9JWRcbiIsIF9fZnVuY19fLAotCQlwY2FtX2luc3QsIHBjYW1faW5zdC0+aW1hZ2VfbW9kZSwgZGl2LT5mcmFtZS5mcmFtZV9pZCk7Ci0JdjRsMl9ldmVudF9xdWV1ZSgKLQkJcG1jdGwtPmNvbmZpZ19kZXZpY2UtPmNvbmZpZ19zdGF0X2V2ZW50X3F1ZXVlLnB2ZGV2LAotCQkmdjRsMl9ldnQpOwotCXJldHVybiAwOwotfQotCi1pbnQgbXNtX21jdGxfY2hlY2tfcHAoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcF9tY3RsLAotCWludCBpbWFnZV9tb2RlLCBpbnQgKnBwX2RpdmVydF90eXBlLCBpbnQgKnBwX3R5cGUpCi17Ci0JaW50IHJjID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IHBwX2tleSA9IDA7Ci0KLQkqcHBfdHlwZSA9IDA7Ci0JKnBwX2RpdmVydF90eXBlID0gMDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcF9tY3RsLT5wcF9pbmZvLmxvY2ssIGZsYWdzKTsKLQlzd2l0Y2ggKGltYWdlX21vZGUpIHsKLQljYXNlIE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfUFJFVklFVzoKLQkJcHBfa2V5ID0gUFBfUFJFVjsKLQkJaWYgKHBfbWN0bC0+cHBfaW5mby5wcF9rZXkgJiBwcF9rZXkpCi0JCQkqcHBfZGl2ZXJ0X3R5cGUgPSBPVVRQVVRfVFlQRV9QOwotCQlpZiAocF9tY3RsLT5wcF9pbmZvLnBwX2N0cmwucHBfbXNnX3R5cGUgJiBPVVRQVVRfVFlQRV9QKQotCQkJKnBwX3R5cGUgPSBPVVRQVVRfVFlQRV9QOwotCQlicmVhazsKLQljYXNlIE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfTUFJTjoKLQkJcHBfa2V5ID0gUFBfU05BUDsKLQkJaWYgKHBfbWN0bC0+cHBfaW5mby5wcF9rZXkgJiBwcF9rZXkpCi0JCQkqcHBfZGl2ZXJ0X3R5cGUgPSBPVVRQVVRfVFlQRV9TOwotCQlpZiAocF9tY3RsLT5wcF9pbmZvLnBwX2N0cmwucHBfbXNnX3R5cGUgJiBPVVRQVVRfVFlQRV9TKQotCQkJKnBwX3R5cGUgPSBPVVRQVVRfVFlQRV9QOwotCQlicmVhazsKLQljYXNlIE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfVklERU86Ci0JCWlmIChwX21jdGwtPnBwX2luZm8ucHBfY3RybC5wcF9tc2dfdHlwZSA9PSBPVVRQVVRfVFlQRV9WKQotCQkJKnBwX3R5cGUgPSBPVVRQVVRfVFlQRV9WOwotCQlicmVhazsKLQljYXNlIE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfVEhVTUJOQUlMOgotCQlwcF9rZXkgPSBQUF9USFVNQjsKLQkJaWYgKHBfbWN0bC0+cHBfaW5mby5wcF9rZXkgJiBwcF9rZXkpCi0JCQkqcHBfZGl2ZXJ0X3R5cGUgPSBPVVRQVVRfVFlQRV9UOwotCQlpZiAocF9tY3RsLT5wcF9pbmZvLnBwX2N0cmwucHBfbXNnX3R5cGUgPT0gT1VUUFVUX1RZUEVfVCkKLQkJCSpwcF90eXBlID0gT1VUUFVUX1RZUEVfVDsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fVjRMMl9FWFRfQ0FQVFVSRV9NT0RFX1JESToKLQkJaWYgKHBfbWN0bC0+cHBfaW5mby5wcF9jdHJsLnBwX21zZ190eXBlICYgT1VUUFVUX1RZUEVfUikKLQkJCSpwcF90eXBlID0gT1VUUFVUX1RZUEVfUjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCWlmIChwX21jdGwtPnZmZV9vdXRwdXRfbW9kZSAhPSBWRkVfT1VUUFVUU19NQUlOX0FORF9USFVNQiAmJgotCQlwX21jdGwtPnZmZV9vdXRwdXRfbW9kZSAhPSBWRkVfT1VUUFVUU19USFVNQl9BTkRfTUFJTikgewotCQlpZiAocF9tY3RsLT5wcF9pbmZvLmRpdl9mcmFtZVtpbWFnZV9tb2RlXS5jaF9wYWRkclswXSkKLQkJCSpwcF9kaXZlcnRfdHlwZSA9IDA7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBfbWN0bC0+cHBfaW5mby5sb2NrLCBmbGFncyk7Ci0JRCgiJXM6IHBwX3R5cGU9JWQsIHBwX2RpdmVydF90eXBlID0gJWQiLAotCV9fZnVuY19fLCAqcHBfdHlwZSwgKnBwX2RpdmVydF90eXBlKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgaXNfYnVmX2luX3F1ZXVlKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtLAotCXN0cnVjdCBtc21fZnJlZV9idWYgKmZidWYsIGludCBpbWFnZV9tb2RlKQotewotCXN0cnVjdCBtc21fZnJhbWVfYnVmZmVyICpidWYgPSBOVUxMLCAqdG1wOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdCA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0Jc3RydWN0IHZpZGVvYnVmMl9jb250aWdfcG1lbSAqbWVtOwotCXVpbnQzMl90IGJ1Zl9pZHgsIG9mZnNldCA9IDA7Ci0JdWludDMyX3QgYnVmX3BoeWFkZHIgPSAwOwotCWludCBpZHg7Ci0JaWR4ID0gcGNhbS0+bWN0bF9ub2RlLmRldl9pbnN0X21hcFtpbWFnZV9tb2RlXS0+bXlfaW5kZXg7Ci0JcGNhbV9pbnN0ID0gcGNhbS0+bWN0bF9ub2RlLmRldl9pbnN0W2lkeF07Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBjYW1faW5zdC0+dnFfaXJxbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShidWYsIHRtcCwKLQkmcGNhbV9pbnN0LT5mcmVlX3ZxLCBsaXN0KSB7Ci0JCWJ1Zl9pZHggPSBidWYtPnZpZGJ1Zi52NGwyX2J1Zi5pbmRleDsKLQkJbWVtID0gdmIyX3BsYW5lX2Nvb2tpZSgmYnVmLT52aWRidWYsIDApOwotCQlpZiAobWVtID09IE5VTEwpIHsKLQkJCXByX2VycigiJXMgSW5zdCAlcCBCdWZmZXIgJWQgaW52YWxpZCBwbGFuZSBjb29raWUiLAotCQkJCV9fZnVuY19fLCBwY2FtX2luc3QsIGJ1Zl9pZHgpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNhbV9pbnN0LT52cV9pcnFsb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAobWVtLT5idWZmZXJfdHlwZSA9PQlWSURFT0JVRjJfTVVMVElQTEVfUExBTkVTKQotCQkJb2Zmc2V0ID0gbWVtLT5vZmZzZXQuZGF0YV9vZmZzZXQgKwotCQkJCXBjYW1faW5zdC0+YnVmX29mZnNldFtidWZfaWR4XVswXS5kYXRhX29mZnNldDsKLQkJZWxzZQotCQkJb2Zmc2V0ID0gbWVtLT5vZmZzZXQuc3Bfb2ZmLnlfb2ZmOwotCQlidWZfcGh5YWRkciA9ICh1bnNpZ25lZCBsb25nKQotCQkJdmlkZW9idWYyX3RvX3BtZW1fY29udGlnKCZidWYtPnZpZGJ1ZiwgMCkgKwotCQkJb2Zmc2V0OwotCQlEKCIlcyB2Yl9pZHg9JWQsdmJfcGFkZHI9MHgleCBjaDA9MHgleFxuIiwKLQkJICBfX2Z1bmNfXywgYnVmLT52aWRidWYudjRsMl9idWYuaW5kZXgsCi0JCSAgYnVmX3BoeWFkZHIsIGZidWYtPmNoX3BhZGRyWzBdKTsKLQkJaWYgKGZidWYtPmNoX3BhZGRyWzBdID09IGJ1Zl9waHlhZGRyKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2FtX2luc3QtPnZxX2lycWxvY2ssIGZsYWdzKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjYW1faW5zdC0+dnFfaXJxbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqbXNtX21jdGxfZ2V0X3BjYW1faW5zdF9mb3JfZGl2ZXJ0KAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXN0cnVjdCBtc21fY2FtX2J1Zl9oYW5kbGUgKmJ1Zl9oYW5kbGUsCi0Jc3RydWN0IG1zbV9mcmVlX2J1ZiAqZmJ1ZiwgaW50ICpub2RlX3R5cGUpCi17Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0ID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSA9IHBtY3RsLT5wY2FtX3B0cjsKLQlpbnQgaWR4OwotCXVpbnQzMl90IGltZ19tb2RlOwotCi0JaWYgKGJ1Zl9oYW5kbGUtPmJ1Zl9sb29rdXBfdHlwZSA9PSBCVUZfTE9PS1VQX0JZX0lOU1RfSEFORExFKSB7Ci0JCWlkeCA9IEdFVF9NQ1RMUFBfSU5TVF9JRFgoYnVmX2hhbmRsZS0+aW5zdF9oYW5kbGUpOwotCQlpZiAoaWR4ID4gTVNNX0RFVl9JTlNUX01BWCkgewotCQkJaWR4ID0gR0VUX1ZJREVPX0lOU1RfSURYKGJ1Zl9oYW5kbGUtPmluc3RfaGFuZGxlKTsKLQkJCUJVR19PTihpZHggPiBNU01fREVWX0lOU1RfTUFYKTsKLQkJCXBjYW1faW5zdCA9IHBjYW0tPmRldl9pbnN0W2lkeF07Ci0JCQkqbm9kZV90eXBlID0gVklERU9fTk9ERTsKLQkJfSBlbHNlIHsKLQkJCXBjYW1faW5zdCA9IHBjYW0tPm1jdGxfbm9kZS5kZXZfaW5zdFtpZHhdOwotCQkJKm5vZGVfdHlwZSA9IE1DVExfTk9ERTsKLQkJfQotCX0gZWxzZSBpZiAoYnVmX2hhbmRsZS0+YnVmX2xvb2t1cF90eXBlID09IEJVRl9MT09LVVBfQllfSU1HX01PREUpIHsKLQkJaW1nX21vZGUgPSBidWZfaGFuZGxlLT5pbWFnZV9tb2RlOwotCQlpZiAoaW1nX21vZGUgPj0gMCAmJiBpbWdfbW9kZSA8IE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfTUFYKSB7Ci0JCQkvKiBWYWxpZCBpbWFnZSBtb2RlLiBTZWFyY2ggdGhlIG1jdGwgbm9kZSBmaXJzdC4KLQkJCSAqIElmIG1jdGwgbm9kZSBkb2VzbnQgaGF2ZSB0aGUgaW5zdGFuY2UsIHRoZW4KLQkJCSAqIHNlYXJjaCBpbiB0aGUgdXNlcidzIHZpZGVvIG5vZGUgKi8KLQkJCWlmIChwY2FtLT5tY3RsX25vZGUuZGV2X2luc3RfbWFwW2ltZ19tb2RlXQotCQkJCSYmIGlzX2J1Zl9pbl9xdWV1ZShwY2FtLCBmYnVmLCBpbWdfbW9kZSkpIHsKLQkJCQlpZHggPSBwY2FtLT5tY3RsX25vZGUuCi0JCQkJCWRldl9pbnN0X21hcFtpbWdfbW9kZV0tPm15X2luZGV4OwotCQkJCXBjYW1faW5zdCA9IHBjYW0tPm1jdGxfbm9kZS5kZXZfaW5zdFtpZHhdOwotCQkJCSpub2RlX3R5cGUgPSBNQ1RMX05PREU7Ci0JCQkJRCgiJXMgRm91bmQgaW5zdGFuY2UgJXAgaW4gbWN0bCBub2RlIGRldmljZVxuIiwKLQkJCQkJX19mdW5jX18sIHBjYW1faW5zdCk7Ci0JCQl9IGVsc2UgaWYgKHBjYW0tPmRldl9pbnN0X21hcFtpbWdfbW9kZV0pIHsKLQkJCQlpZHggPSBwY2FtLT5kZXZfaW5zdF9tYXBbaW1nX21vZGVdLT5teV9pbmRleDsKLQkJCQlwY2FtX2luc3QgPSBwY2FtLT5kZXZfaW5zdFtpZHhdOwotCQkJCSpub2RlX3R5cGUgPSBWSURFT19OT0RFOwotCQkJCUQoIiVzIEZvdW5kIGluc3RhbmNlICVwIGluIHZpZGVvIGRldmljZSIsCi0JCQkJCV9fZnVuY19fLCBwY2FtX2luc3QpOwotCQkJfSBlbHNlIHsKLQkJCQlwcl9lcnIoIiVzIENhbm5vdCBmaW5kIGluc3RhbmNlIGZvciAlZC5cbiIsCi0JCQkJCV9fZnVuY19fLCBpbWdfbW9kZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzIEludmFsaWQgaW1hZ2UgbW9kZSAlZC4gUmV0dXJuIE5VTExcbiIsCi0JCQkJX19mdW5jX18sIGJ1Zl9oYW5kbGUtPmltYWdlX21vZGUpOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlcyBJbnZhbGlkIGJ1ZmZlciBsb29rdXAgdHlwZSAiLCBfX2Z1bmNfXyk7Ci0JfQotCXJldHVybiBwY2FtX2luc3Q7Ci19Ci0KLWludCBtc21fbWN0bF9kb19wcF9kaXZlcnQoCi0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcF9tY3RsLAotCXN0cnVjdCBtc21fY2FtX2J1Zl9oYW5kbGUgKmJ1Zl9oYW5kbGUsCi0Jc3RydWN0IG1zbV9mcmVlX2J1ZiAqZmJ1ZiwKLQl1aW50MzJfdCBmcmFtZV9pZCwgaW50IHBwX3R5cGUpCi17Ci0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0OwotCWludCByYyA9IDAsIGksIGJ1Zl9pZHgsIG5vZGU7Ci0JaW50IGRlbF9idWYgPSAwOyAvKiBkZWxldGUgZnJvbSBmcmVlIHF1ZXVlICovCi0Jc3RydWN0IG1zbV9jYW1fZXZ0X2RpdmVydF9mcmFtZSBkaXY7Ci0Jc3RydWN0IG1zbV9mcmFtZV9idWZmZXIgKnZiID0gTlVMTDsKLQlzdHJ1Y3QgdmlkZW9idWYyX2NvbnRpZ19wbWVtICptZW07Ci0JdWludDMyX3QgaW1hZ2VfbW9kZTsKLQotCWlmIChidWZfaGFuZGxlLT5idWZfbG9va3VwX3R5cGUgPT0gQlVGX0xPT0tVUF9CWV9JTUdfTU9ERSkgewotCQlpbWFnZV9tb2RlID0gYnVmX2hhbmRsZS0+aW1hZ2VfbW9kZTsKLQkJZGl2LmZyYW1lLmluc3RfaGFuZGxlID0gMDsKLQl9IGVsc2UgaWYgKGJ1Zl9oYW5kbGUtPmJ1Zl9sb29rdXBfdHlwZSA9PSBCVUZfTE9PS1VQX0JZX0lOU1RfSEFORExFKSB7Ci0JCWltYWdlX21vZGUgPSBHRVRfSU1HX01PREUoYnVmX2hhbmRsZS0+aW5zdF9oYW5kbGUpOwotCQlkaXYuZnJhbWUuaW5zdF9oYW5kbGUgPSBidWZfaGFuZGxlLT5pbnN0X2hhbmRsZTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzIEludmFsaWQgYnVmZmVyIGxvb2t1cCB0eXBlICVkICIsIF9fZnVuY19fLAotCQkJYnVmX2hhbmRsZS0+YnVmX2xvb2t1cF90eXBlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcGNhbV9pbnN0ID0gbXNtX21jdGxfZ2V0X3BjYW1faW5zdF9mb3JfZGl2ZXJ0KHBfbWN0bCwKLQkJCWJ1Zl9oYW5kbGUsIGZidWYsICZub2RlKTsKLQlpZiAoIXBjYW1faW5zdCkgewotCQlwcl9lcnIoIiVzIEludmFsaWQgaW5zdGFuY2UuIENhbm5vdCBkaXZlcnQgZnJhbWUuXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JdmIgPSBtc21fbWN0bF9idWZfZmluZChwX21jdGwsIHBjYW1faW5zdCwgZGVsX2J1ZiwgZmJ1Zik7Ci0JaWYgKCF2YikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl2Yi0+dmlkYnVmLnY0bDJfYnVmLnNlcXVlbmNlID0gZnJhbWVfaWQ7Ci0JYnVmX2lkeCA9IHZiLT52aWRidWYudjRsMl9idWYuaW5kZXg7Ci0JRCgiJXMgRGl2ZXJ0aW5nIGZyYW1lICVkICV4IEltYWdlIG1vZGUgJWRcbiIsIF9fZnVuY19fLCBidWZfaWR4LAotCQkodWludDMyX3QpdmIsIHBjYW1faW5zdC0+aW1hZ2VfbW9kZSk7Ci0JZGl2LmltYWdlX21vZGUgPSBwY2FtX2luc3QtPmltYWdlX21vZGU7Ci0JZGl2Lm9wX21vZGUgICAgPSBwY2FtX2luc3QtPnBjYW0tPm9wX21vZGU7Ci0JZGl2Lmluc3RfaWR4ICAgPSBwY2FtX2luc3QtPm15X2luZGV4OwotCWRpdi5ub2RlX2lkeCAgID0gcGNhbV9pbnN0LT5wY2FtLT52bm9kZV9pZDsKLQlwX21jdGwtPnBwX2luZm8uY3VyX2ZyYW1lX2lkW3BjYW1faW5zdC0+aW1hZ2VfbW9kZV0gPSBmcmFtZV9pZDsKLQlkaXYuZnJhbWUuZnJhbWVfaWQgPQotCQlwX21jdGwtPnBwX2luZm8uY3VyX2ZyYW1lX2lkW3BjYW1faW5zdC0+aW1hZ2VfbW9kZV07Ci0JZGl2LmZyYW1lLmJ1Zl9pZHggID0gYnVmX2lkeDsKLQlkaXYuZnJhbWUuaGFuZGxlID0gKHVpbnQzMl90KXZiOwotCW1zbV9tY3RsX2dldHRpbWVvZmRheSgmZGl2LmZyYW1lLnRpbWVzdGFtcCk7Ci0JdmItPnZpZGJ1Zi52NGwyX2J1Zi50aW1lc3RhbXAgPSBkaXYuZnJhbWUudGltZXN0YW1wOwotCWRpdi5kb19wcCA9IHBwX3R5cGU7Ci0JRCgiJXMgRGl2ZXJ0aW5nIGZyYW1lICV4IGlkICVkIHRvIHVzZXJzcGFjZSAiLCBfX2Z1bmNfXywKLQkJKGludClkaXYuZnJhbWUuaGFuZGxlLCBkaXYuZnJhbWUuZnJhbWVfaWQpOwotCS8qIEdldCB0aGUgY29va2llIGZvciAxc3QgcGxhbmUgYW5kIHN0b3JlIHRoZSBwYXRoLgotCSAqIEFsc28gdXNlIHRoaXMgdG8gY2hlY2sgdGhlIG51bWJlciBvZiBwbGFuZXMgaW4KLQkgKiB0aGlzIGJ1ZmZlci4qLwotCW1lbSA9IHZiMl9wbGFuZV9jb29raWUoJnZiLT52aWRidWYsIDApOwotCWlmIChtZW0gPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzIEluc3QgJXAgQnVmZmVyICVkLCBpbnZhbGlkIHBsYW5lIGNvb2tpZSAiLCBfX2Z1bmNfXywKLQkJCXBjYW1faW5zdCwgYnVmX2lkeCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlkaXYuZnJhbWUucGF0aCA9IG1lbS0+cGF0aDsKLQlkaXYuZnJhbWUubm9kZV90eXBlID0gbm9kZTsKLQlpZiAobWVtLT5idWZmZXJfdHlwZSA9PSBWSURFT0JVRjJfU0lOR0xFX1BMQU5FKSB7Ci0JCS8qIFRoaXMgYnVmZmVyIGNvbnRhaW5zIG9ubHkgMSBwbGFuZS4gVXNlIHRoZQotCQkgKiBzaW5nbGUgcGxhbmFyIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgaW5mby4qLwotCQlkaXYuZnJhbWUubnVtX3BsYW5lcwk9IDE7Ci0JCWRpdi5mcmFtZS5zcC5waHlfYWRkcgk9Ci0JCQl2aWRlb2J1ZjJfdG9fcG1lbV9jb250aWcoJnZiLT52aWRidWYsIDApOwotCQlkaXYuZnJhbWUuc3AuYWRkcl9vZmZzZXQgPSBtZW0tPmFkZHJfb2Zmc2V0OwotCQlkaXYuZnJhbWUuc3AueV9vZmYgICAgICA9IDA7Ci0JCWRpdi5mcmFtZS5zcC5jYmNyX29mZiAgID0gbWVtLT5vZmZzZXQuc3Bfb2ZmLmNiY3Jfb2ZmOwotCQlkaXYuZnJhbWUuc3AuZmQgICAgICAgICA9IChpbnQpbWVtLT52YWRkcjsKLQkJZGl2LmZyYW1lLnNwLmxlbmd0aCAgICAgPSBtZW0tPnNpemU7Ci0JCWlmICghcHBfdHlwZSkKLQkJCXBfbWN0bC0+cHBfaW5mby5kaXZfZnJhbWVbcGNhbV9pbnN0LT5pbWFnZV9tb2RlXS4KLQkJCWNoX3BhZGRyWzBdID0gZGl2LmZyYW1lLnNwLnBoeV9hZGRyOwotCX0gZWxzZSB7Ci0JCS8qIFRoaXMgYnVmZmVyIGNvbnRhaW5zIG11bHRpcGxlIHBsYW5lcy4gVXNlIHRoZSBtdXRsaXBsYW5hcgotCQkgKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIGluZm8uICovCi0JCWRpdi5mcmFtZS5udW1fcGxhbmVzCT0gcGNhbV9pbnN0LT5wbGFuZV9pbmZvLm51bV9wbGFuZXM7Ci0JCS8qIE5vdyB0cmF2ZXJzZSB0aHJvdWdoIGFsbCB0aGUgcGxhbmVzIG9mIHRoZSBidWZmZXIgdG8KLQkJICogZmlsbCBvdXQgdGhlIHBsYW5lIGluZm8uICovCi0JCWZvciAoaSA9IDA7IGkgPCBkaXYuZnJhbWUubnVtX3BsYW5lczsgaSsrKSB7Ci0JCQltZW0gPSB2YjJfcGxhbmVfY29va2llKCZ2Yi0+dmlkYnVmLCBpKTsKLQkJCWlmIChtZW0gPT0gTlVMTCkgewotCQkJCXByX2VycigiJXMgSW5zdCAlcCAlZCBpbnZhbGlkIHBsYW5lIGNvb2tpZSAiLAotCQkJCQlfX2Z1bmNfXywgcGNhbV9pbnN0LCBidWZfaWR4KTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCWRpdi5mcmFtZS5tcFtpXS5waHlfYWRkciA9Ci0JCQkJdmlkZW9idWYyX3RvX3BtZW1fY29udGlnKCZ2Yi0+dmlkYnVmLCBpKTsKLQkJCWlmICghcGNhbV9pbnN0LT5idWZfb2Zmc2V0KQotCQkJCWRpdi5mcmFtZS5tcFtpXS5kYXRhX29mZnNldCA9IDA7Ci0JCQllbHNlCi0JCQkJZGl2LmZyYW1lLm1wW2ldLmRhdGFfb2Zmc2V0ID0KLQkJCQlwY2FtX2luc3QtPmJ1Zl9vZmZzZXRbYnVmX2lkeF1baV0uZGF0YV9vZmZzZXQ7Ci0JCQlkaXYuZnJhbWUubXBbaV0uYWRkcl9vZmZzZXQgPQotCQkJCW1lbS0+YWRkcl9vZmZzZXQ7Ci0JCQlkaXYuZnJhbWUubXBbaV0uZmQgPSAoaW50KW1lbS0+dmFkZHI7Ci0JCQlkaXYuZnJhbWUubXBbaV0ubGVuZ3RoID0gbWVtLT5zaXplOwotCQl9Ci0JCWlmICghcHBfdHlwZSkKLQkJCXBfbWN0bC0+cHBfaW5mby5kaXZfZnJhbWVbcGNhbV9pbnN0LT5pbWFnZV9tb2RlXS4KLQkJCWNoX3BhZGRyWzBdID0gZGl2LmZyYW1lLm1wWzBdLnBoeV9hZGRyICsKLQkJCQkJZGl2LmZyYW1lLm1wWzBdLmRhdGFfb2Zmc2V0OwotCX0KLQlyYyA9IG1zbV9tY3RsX3BwX2J1Zl9kaXZlcnQocF9tY3RsLCBwY2FtX2luc3QsICZkaXYpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fbWN0bF9wcF9nZXRfcGh5X2FkZHIoCi0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZfaW5zdCAqcGNhbV9pbnN0LAotCXVpbnQzMl90IGZyYW1lX2hhbmRsZSwKLQlzdHJ1Y3QgbXNtX3BwX2ZyYW1lICpwcF9mcmFtZSkKLXsKLQlzdHJ1Y3QgbXNtX2ZyYW1lX2J1ZmZlciAqdmIgPSBOVUxMOwotCXN0cnVjdCB2aWRlb2J1ZjJfY29udGlnX3BtZW0gKm1lbTsKLQlpbnQgaSwgYnVmX2lkeCA9IDA7Ci0KLQl2YiA9IChzdHJ1Y3QgbXNtX2ZyYW1lX2J1ZmZlciAqKWZyYW1lX2hhbmRsZTsKLQlidWZfaWR4ID0gdmItPnZpZGJ1Zi52NGwyX2J1Zi5pbmRleDsKLQltZW1zZXQocHBfZnJhbWUsIDAsIHNpemVvZihzdHJ1Y3QgbXNtX3BwX2ZyYW1lKSk7Ci0JcHBfZnJhbWUtPmhhbmRsZSA9ICh1aW50MzJfdCl2YjsKLQlwcF9mcmFtZS0+ZnJhbWVfaWQgPSB2Yi0+dmlkYnVmLnY0bDJfYnVmLnNlcXVlbmNlOwotCXBwX2ZyYW1lLT50aW1lc3RhbXAgPSB2Yi0+dmlkYnVmLnY0bDJfYnVmLnRpbWVzdGFtcDsKLQlwcF9mcmFtZS0+YnVmX2lkeCA9IGJ1Zl9pZHg7Ci0JcHBfZnJhbWUtPmluc3RfaGFuZGxlID0gcGNhbV9pbnN0LT5pbnN0X2hhbmRsZTsKLQkvKiBHZXQgdGhlIGNvb2tpZSBmb3IgMXN0IHBsYW5lIGFuZCBzdG9yZSB0aGUgcGF0aC4KLQkgKiBBbHNvIHVzZSB0aGlzIHRvIGNoZWNrIHRoZSBudW1iZXIgb2YgcGxhbmVzIGluCi0JICogdGhpcyBidWZmZXIuKi8KLQltZW0gPSB2YjJfcGxhbmVfY29va2llKCZ2Yi0+dmlkYnVmLCAwKTsKLQlpZiAobWVtID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlcyBJbnN0ICVwIEJ1ZmZlciAlZCwgaW52YWxpZCBwbGFuZSBjb29raWUgIiwgX19mdW5jX18sCi0JCQlwY2FtX2luc3QsIGJ1Zl9pZHgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcHBfZnJhbWUtPmltYWdlX3R5cGUgPSAodW5zaWduZWQgc2hvcnQpbWVtLT5wYXRoOwotCWlmIChtZW0tPmJ1ZmZlcl90eXBlID09IFZJREVPQlVGMl9TSU5HTEVfUExBTkUpIHsKLQkJcHBfZnJhbWUtPm51bV9wbGFuZXMgPSAxOwotCQlwcF9mcmFtZS0+c3AuYWRkcl9vZmZzZXQgPSBtZW0tPmFkZHJfb2Zmc2V0OwotCQlwcF9mcmFtZS0+c3AucGh5X2FkZHIgPQotCQkJdmlkZW9idWYyX3RvX3BtZW1fY29udGlnKCZ2Yi0+dmlkYnVmLCAwKTsKLQkJcHBfZnJhbWUtPnNwLnlfb2ZmID0gMDsKLQkJcHBfZnJhbWUtPnNwLmNiY3Jfb2ZmID0gbWVtLT5vZmZzZXQuc3Bfb2ZmLmNiY3Jfb2ZmOwotCQlwcF9mcmFtZS0+c3AubGVuZ3RoID0gbWVtLT5zaXplOwotCQlwcF9mcmFtZS0+c3AuZmQgPSAoaW50KW1lbS0+dmFkZHI7Ci0JfSBlbHNlIHsKLQkJcHBfZnJhbWUtPm51bV9wbGFuZXMgPSBwY2FtX2luc3QtPnBsYW5lX2luZm8ubnVtX3BsYW5lczsKLQkJZm9yIChpID0gMDsgaSA8IHBwX2ZyYW1lLT5udW1fcGxhbmVzOyBpKyspIHsKLQkJCW1lbSA9IHZiMl9wbGFuZV9jb29raWUoJnZiLT52aWRidWYsIGkpOwotCQkJcHBfZnJhbWUtPm1wW2ldLmFkZHJfb2Zmc2V0ID0gbWVtLT5hZGRyX29mZnNldDsKLQkJCXBwX2ZyYW1lLT5tcFtpXS5waHlfYWRkciA9Ci0JCQkJdmlkZW9idWYyX3RvX3BtZW1fY29udGlnKCZ2Yi0+dmlkYnVmLCBpKTsKLQkJCXBwX2ZyYW1lLT5tcFtpXS5kYXRhX29mZnNldCA9Ci0JCQlwY2FtX2luc3QtPmJ1Zl9vZmZzZXRbYnVmX2lkeF1baV0uZGF0YV9vZmZzZXQ7Ci0JCQlwcF9mcmFtZS0+bXBbaV0uZmQgPSAoaW50KW1lbS0+dmFkZHI7Ci0JCQlwcF9mcmFtZS0+bXBbaV0ubGVuZ3RoID0gbWVtLT5zaXplOwotCQkJRCgiJXMgZnJhbWUgaWQgJWQgYnVmZmVyICVkIHBsYW5lICVkIHBoeSBhZGRyIDB4JXgiCi0JCQkJIiBmZCAlZCBsZW5ndGggJWRcbiIsIF9fZnVuY19fLAotCQkJCXBwX2ZyYW1lLT5mcmFtZV9pZCwgYnVmX2lkeCwgaSwKLQkJCQkodWludDMyX3QpcHBfZnJhbWUtPm1wW2ldLnBoeV9hZGRyLAotCQkJCXBwX2ZyYW1lLT5tcFtpXS5mZCwgcHBfZnJhbWUtPm1wW2ldLmxlbmd0aCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX21jdGxfcHBfcGF0aF90b19pbWdfbW9kZShpbnQgcGF0aCkKLXsKLQlzd2l0Y2ggKHBhdGgpIHsKLQljYXNlIE9VVFBVVF9UWVBFX1A6Ci0JCXJldHVybiBNU01fVjRMMl9FWFRfQ0FQVFVSRV9NT0RFX1BSRVZJRVc7Ci0JY2FzZSBPVVRQVVRfVFlQRV9WOgotCQlyZXR1cm4gTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9WSURFTzsKLQljYXNlIE9VVFBVVF9UWVBFX1M6Ci0JCXJldHVybiBNU01fVjRMMl9FWFRfQ0FQVFVSRV9NT0RFX01BSU47Ci0JY2FzZSBPVVRQVVRfVFlQRV9UOgotCQlyZXR1cm4gTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9USFVNQk5BSUw7Ci0JY2FzZSBPVVRQVVRfVFlQRV9TQUVDOgotCQlyZXR1cm4gTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9BRUM7Ci0JY2FzZSBPVVRQVVRfVFlQRV9TQVdCOgotCQlyZXR1cm4gTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9BV0I7Ci0JY2FzZSBPVVRQVVRfVFlQRV9TQUZDOgotCQlyZXR1cm4gTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9BRjsKLQljYXNlIE9VVFBVVF9UWVBFX0lIU1Q6Ci0JCXJldHVybiBNU01fVjRMMl9FWFRfQ0FQVFVSRV9NT0RFX0lISVNUOwotCWNhc2UgT1VUUFVUX1RZUEVfQ1NUQToKLQkJcmV0dXJuIE1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfQ1NUQTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci19Ci0KLWludCBtc21fbWN0bF9wcF9wcm9jX2NtZChzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwX21jdGwsCi0JCQlzdHJ1Y3QgbXNtX21jdGxfcHBfY21kICpwcF9jbWQpCi17Ci0JaW50IHJjID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3dpdGNoIChwcF9jbWQtPmlkKSB7Ci0JY2FzZSBNQ1RMX0NNRF9ESVZFUlRfRlJBTUVfUFBfUEFUSDogewotCQlzdHJ1Y3QgbXNtX21jdGxfcHBfZGl2ZXJ0X3BwIGRpdmVydF9wcDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkaXZlcnRfcHAsIHBwX2NtZC0+dmFsdWUsCi0JCQkJc2l6ZW9mKGRpdmVydF9wcCkpKSB7Ci0JCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCUQoIiVzOiBEaXZlcnQgSW1hZ2UgbW9kZSA9JWQgRW5hYmxlICVkIiwKLQkJCV9fZnVuY19fLCBkaXZlcnRfcHAucGF0aCwgZGl2ZXJ0X3BwLmVuYWJsZSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwX21jdGwtPnBwX2luZm8ubG9jaywgZmxhZ3MpOwotCQlpZiAoZGl2ZXJ0X3BwLmVuYWJsZSkKLQkJCXBfbWN0bC0+cHBfaW5mby5wcF9jdHJsLnBwX21zZ190eXBlIHw9IGRpdmVydF9wcC5wYXRoOwotCQllbHNlCi0JCQlwX21jdGwtPnBwX2luZm8ucHBfY3RybC5wcF9tc2dfdHlwZSAmPSB+ZGl2ZXJ0X3BwLnBhdGg7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBfbWN0bC0+cHBfaW5mby5sb2NrLCBmbGFncyk7Ci0JCUQoIiVzOiBwcCBwYXRoID0gMHgleCIsIF9fZnVuY19fLAotCQkJcF9tY3RsLT5wcF9pbmZvLnBwX2N0cmwucHBfbXNnX3R5cGUpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRVBFUk07Ci0JYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotCi1pbnQgbXNtX21jdGxfcHBfaW9jdGwoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcF9tY3RsLAotCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQlzdHJ1Y3QgbXNtX21jdGxfcG9zdF9wcm9jX2NtZCBwcF9jbWQ7Ci0Jdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnBwX2NtZCwgYXJncCwgc2l6ZW9mKHBwX2NtZCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXN3aXRjaCAocHBfY21kLnR5cGUpIHsKLQljYXNlIE1TTV9QUF9DTURfVFlQRV9NQ1RMOgotCQlyYyA9IG1zbV9tY3RsX3BwX3Byb2NfY21kKHBfbWN0bCwgJnBwX2NtZC5jbWQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IC1FUEVSTTsKLQkJYnJlYWs7Ci0JfQotCWlmICghcmMpIHsKLQkJLyogZGVlcCBjb3B5IGJhY2sgdGhlIHJldHVybiB2YWx1ZSAqLwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLAotCQkJJnBwX2NtZCwKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX21jdGxfcG9zdF9wcm9jX2NtZCkpKSB7Ci0JCQlFUlJfQ09QWV9UT19VU0VSKCk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX21jdGxfcHBfcmVzZXJ2ZV9mcmVlX2ZyYW1lKAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBfbWN0bCwKLQl2b2lkIF9fdXNlciAqYXJnKQotewotCXN0cnVjdCBtc21fY2FtX2V2dF9kaXZlcnRfZnJhbWUgZGl2X2ZyYW1lOwotCWludCBpbWFnZV9tb2RlLCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9mcmVlX2J1ZiBmcmVlX2J1ZjsKLQlzdHJ1Y3QgbXNtX2NhbV92NGwyX2Rldl9pbnN0ICpwY2FtX2luc3Q7Ci0Jc3RydWN0IG1zbV9jYW1fYnVmX2hhbmRsZSBidWZfaGFuZGxlOwotCi0JbWVtc2V0KCZmcmVlX2J1ZiwgMCwgc2l6ZW9mKHN0cnVjdCBtc21fZnJlZV9idWYpKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoJmRpdl9mcmFtZSwgYXJnLAotCQlzaXplb2Yoc3RydWN0IG1zbV9jYW1fZXZ0X2RpdmVydF9mcmFtZSkpKSB7Ci0JCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlpbWFnZV9tb2RlID0gZGl2X2ZyYW1lLmltYWdlX21vZGU7Ci0JaWYgKGltYWdlX21vZGUgPD0gMCkgewotCQlwcl9lcnIoIiVzIEludmFsaWQgaW1hZ2UgbW9kZSAlZCIsIF9fZnVuY19fLCBpbWFnZV9tb2RlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCS8qIEFsd2F5cyByZXNlcnZlIHRoZSBidWZmZXIgZnJvbSB1c2VyJ3MgdmlkZW8gbm9kZSAqLwotCXBjYW1faW5zdCA9IHBfbWN0bC0+cGNhbV9wdHItPmRldl9pbnN0X21hcFtpbWFnZV9tb2RlXTsKLQlpZiAoIXBjYW1faW5zdCkgewotCQlwcl9lcnIoIiVzIEluc3RhbmNlIGFscmVhZHkgY2xvc2VkICIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCUQoIiVzIFJlc2VydmluZyBmcmVlIGZyYW1lIHVzaW5nICVwIGluc3QgaGFuZGxlICV4ICIsIF9fZnVuY19fLAotCQlwY2FtX2luc3QsIGRpdl9mcmFtZS5mcmFtZS5pbnN0X2hhbmRsZSk7Ci0JaWYgKGRpdl9mcmFtZS5mcmFtZS5pbnN0X2hhbmRsZSkgewotCQlidWZfaGFuZGxlLmJ1Zl9sb29rdXBfdHlwZSA9IEJVRl9MT09LVVBfQllfSU5TVF9IQU5ETEU7Ci0JCWJ1Zl9oYW5kbGUuaW5zdF9oYW5kbGUgPSBkaXZfZnJhbWUuZnJhbWUuaW5zdF9oYW5kbGU7Ci0JfSBlbHNlIHsKLQkJYnVmX2hhbmRsZS5idWZfbG9va3VwX3R5cGUgPSBCVUZfTE9PS1VQX0JZX0lNR19NT0RFOwotCQlidWZfaGFuZGxlLmltYWdlX21vZGUgPSBpbWFnZV9tb2RlOwotCX0KLQlyYyA9IG1zbV9tY3RsX3Jlc2VydmVfZnJlZV9idWYocF9tY3RsLCBwY2FtX2luc3QsCi0JCQkJCSZidWZfaGFuZGxlLCAmZnJlZV9idWYpOwotCWlmIChyYyA9PSAwKSB7Ci0JCW1zbV9tY3RsX3BwX2dldF9waHlfYWRkcihwY2FtX2luc3QsCi0JCQlmcmVlX2J1Zi52YiwgJmRpdl9mcmFtZS5mcmFtZSk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZkaXZfZnJhbWUsIHNpemVvZihkaXZfZnJhbWUpKSkgewotCQkJRVJSX0NPUFlfVE9fVVNFUigpOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JfQotCUQoIiVzOiBHb3QgYnVmZmVyICVkIGZyb20gSW5zdCAlcCByYyA9ICVkLCBwaHkgPSAweCV4IiwKLQkJX19mdW5jX18sIGRpdl9mcmFtZS5mcmFtZS5idWZfaWR4LAotCQlwY2FtX2luc3QsIHJjLCBmcmVlX2J1Zi5jaF9wYWRkclswXSk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX21jdGxfcHBfcmVsZWFzZV9mcmVlX2ZyYW1lKAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBfbWN0bCwKLQl2b2lkIF9fdXNlciAqYXJnKQotewotCXN0cnVjdCBtc21fY2FtX2V2dF9kaXZlcnRfZnJhbWUgZGl2X2ZyYW1lOwotCXN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2X2luc3QgKnBjYW1faW5zdDsKLQlzdHJ1Y3QgbXNtX3BwX2ZyYW1lICpmcmFtZTsKLQlpbnQgaW1hZ2VfbW9kZSwgcmMgPSAwOwotCXN0cnVjdCBtc21fZnJlZV9idWYgZnJlZV9idWY7Ci0Jc3RydWN0IG1zbV9jYW1fYnVmX2hhbmRsZSBidWZfaGFuZGxlOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZkaXZfZnJhbWUsIGFyZywKLQkJc2l6ZW9mKHN0cnVjdCBtc21fY2FtX2V2dF9kaXZlcnRfZnJhbWUpKSkgewotCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaW1hZ2VfbW9kZSA9IGRpdl9mcmFtZS5pbWFnZV9tb2RlOwotCWlmIChpbWFnZV9tb2RlIDwgMCkgewotCQlwcl9lcnIoIiVzIEludmFsaWQgaW1hZ2UgbW9kZSAlZFxuIiwgX19mdW5jX18sIGltYWdlX21vZGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZnJhbWUgPSAmZGl2X2ZyYW1lLmZyYW1lOwotCWlmIChmcmFtZS0+bnVtX3BsYW5lcyA+IDEpCi0JCWZyZWVfYnVmLmNoX3BhZGRyWzBdID0gZnJhbWUtPm1wWzBdLnBoeV9hZGRyOwotCWVsc2UKLQkJZnJlZV9idWYuY2hfcGFkZHJbMF0gPSBmcmFtZS0+c3AucGh5X2FkZHI7Ci0KLQlpZiAoZGl2X2ZyYW1lLmZyYW1lLmluc3RfaGFuZGxlKSB7Ci0JCWJ1Zl9oYW5kbGUuYnVmX2xvb2t1cF90eXBlID0gQlVGX0xPT0tVUF9CWV9JTlNUX0hBTkRMRTsKLQkJYnVmX2hhbmRsZS5pbnN0X2hhbmRsZSA9IGRpdl9mcmFtZS5mcmFtZS5pbnN0X2hhbmRsZTsKLQl9IGVsc2UgewotCQlidWZfaGFuZGxlLmJ1Zl9sb29rdXBfdHlwZSA9IEJVRl9MT09LVVBfQllfSU1HX01PREU7Ci0JCWJ1Zl9oYW5kbGUuaW1hZ2VfbW9kZSA9IGltYWdlX21vZGU7Ci0JfQotCXBjYW1faW5zdCA9IG1zbV9tY3RsX2dldF9wY2FtX2luc3QocF9tY3RsLCAmYnVmX2hhbmRsZSk7Ci0JaWYgKCFwY2FtX2luc3QpIHsKLQkJcHJfZXJyKCIlcyBJbnZhbGlkIGluc3RhbmNlLiBDYW5ub3QgcmVsZWFzZSBmcmFtZS5cbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJjID0gbXNtX21jdGxfcmVsZWFzZV9mcmVlX2J1ZihwX21jdGwsIHBjYW1faW5zdCwgJmZyZWVfYnVmKTsKLQlEKCIlczogcmVsZWFzZSBmcmVlIGJ1ZiwgcmMgPSAlZCwgcGh5ID0gMHgleCIsCi0JCV9fZnVuY19fLCByYywgZnJlZV9idWYuY2hfcGFkZHJbMF0pOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX21jdGxfc2V0X3BwX2tleShzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwX21jdGwsCi0JCQkJdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlpbnQgcmMgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBfbWN0bC0+cHBfaW5mby5sb2NrLCBmbGFncyk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZwX21jdGwtPnBwX2luZm8ucHBfa2V5LAotCQkJYXJnLCBzaXplb2YocF9tY3RsLT5wcF9pbmZvLnBwX2tleSkpKSB7Ci0JCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQlyYyA9IC1FRkFVTFQ7Ci0JfSBlbHNlIHsKLQkJRCgiJXM6IG1jdGw9MHglcCwgcHBfa2V5X3NldHRpbmc9MHgleCIsCi0JCQlfX2Z1bmNfXywgcF9tY3RsLCBwX21jdGwtPnBwX2luZm8ucHBfa2V5KTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcF9tY3RsLT5wcF9pbmZvLmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fbWN0bF9wcF9kb25lKAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBfbWN0bCwKLQl2b2lkIF9fdXNlciAqYXJnKQotewotCXN0cnVjdCBtc21fcHBfZnJhbWUgZnJhbWU7Ci0JaW50IGltYWdlX21vZGUsIHJjID0gMDsKLQlpbnQgZGlydHkgPSAwOwotCXN0cnVjdCBtc21fZnJlZV9idWYgYnVmOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IG1zbV9jYW1fYnVmX2hhbmRsZSBidWZfaGFuZGxlOwotCXN0cnVjdCBtc21fY2FtX3JldHVybl9mcmFtZV9pbmZvIHJldF9mcmFtZTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmZnJhbWUsIGFyZywgc2l6ZW9mKGZyYW1lKSkpIHsKLQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwX21jdGwtPnBwX2luZm8ubG9jaywgZmxhZ3MpOwotCWlmIChmcmFtZS5pbnN0X2hhbmRsZSkgewotCQlidWZfaGFuZGxlLmJ1Zl9sb29rdXBfdHlwZSA9IEJVRl9MT09LVVBfQllfSU5TVF9IQU5ETEU7Ci0JCWJ1Zl9oYW5kbGUuaW5zdF9oYW5kbGUgPSBmcmFtZS5pbnN0X2hhbmRsZTsKLQkJaW1hZ2VfbW9kZSA9IEdFVF9JTUdfTU9ERShmcmFtZS5pbnN0X2hhbmRsZSk7Ci0JfSBlbHNlIHsKLQkJYnVmX2hhbmRsZS5idWZfbG9va3VwX3R5cGUgPSBCVUZfTE9PS1VQX0JZX0lNR19NT0RFOwotCQlidWZfaGFuZGxlLmltYWdlX21vZGUgPQotCQkJbXNtX21jdGxfcHBfcGF0aF90b19pbWdfbW9kZShmcmFtZS5wYXRoKTsKLQkJaW1hZ2VfbW9kZSA9IGJ1Zl9oYW5kbGUuaW1hZ2VfbW9kZTsKLQl9Ci0JaWYgKGltYWdlX21vZGUgPCAwKSB7Ci0JCXByX2VycigiJXMgSW52YWxpZCBpbWFnZSBtb2RlXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBpbWFnZV9tb2RlOwotCX0KLQlEKCIlcyBSZXR1cm5pbmcgZnJhbWUgJXggaWQgJWQgdG8ga2VybmVsICIsIF9fZnVuY19fLAotCQkoaW50KWZyYW1lLmhhbmRsZSwgZnJhbWUuZnJhbWVfaWQpOwotCWlmIChwX21jdGwtPnBwX2luZm8uZGl2X2ZyYW1lW2ltYWdlX21vZGVdLmNoX3BhZGRyWzBdKSB7Ci0JCW1lbWNweSgmYnVmLAotCQkJJnBfbWN0bC0+cHBfaW5mby5kaXZfZnJhbWVbaW1hZ2VfbW9kZV0sCi0JCQlzaXplb2YoYnVmKSk7Ci0JCW1lbXNldCgmcF9tY3RsLT5wcF9pbmZvLmRpdl9mcmFtZVtpbWFnZV9tb2RlXSwKLQkJCTAsIHNpemVvZihidWYpKTsKLQkJaWYgKHBfbWN0bC0+cHBfaW5mby5jdXJfZnJhbWVfaWRbaW1hZ2VfbW9kZV0gIT0KLQkJCQkJZnJhbWUuZnJhbWVfaWQpIHsKLQkJCS8qIGRpcnR5IGZyYW1lLiBzaG91bGQgbm90IHBhc3MgdG8gYXBwICovCi0JCQlkaXJ0eSA9IDE7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoZnJhbWUubnVtX3BsYW5lcyA+IDEpCi0JCQlidWYuY2hfcGFkZHJbMF0gPSBmcmFtZS5tcFswXS5waHlfYWRkciArCi0JCQkJCQlmcmFtZS5tcFswXS5kYXRhX29mZnNldDsKLQkJZWxzZQotCQkJYnVmLmNoX3BhZGRyWzBdID0gZnJhbWUuc3AucGh5X2FkZHIgKyBmcmFtZS5zcC55X29mZjsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcF9tY3RsLT5wcF9pbmZvLmxvY2ssIGZsYWdzKTsKLQotCXJldF9mcmFtZS5kaXJ0eSA9IGRpcnR5OwotCXJldF9mcmFtZS5ub2RlX3R5cGUgPSAwOwotCXJldF9mcmFtZS50aW1lc3RhbXAgPSBmcmFtZS50aW1lc3RhbXA7Ci0JcmV0X2ZyYW1lLmZyYW1lX2lkICAgPSBmcmFtZS5mcmFtZV9pZDsKLQlEKCIlcyBmcmFtZV9pZDogJWQgYnVmZmVyIGlkeCAlZFxuIiwgX19mdW5jX18sCi0JCWZyYW1lLmZyYW1lX2lkLCBmcmFtZS5idWZfaWR4KTsKLQlyYyA9IG1zbV9tY3RsX2J1Zl9kb25lX3BwKHBfbWN0bCwgJmJ1Zl9oYW5kbGUsICZidWYsICZyZXRfZnJhbWUpOwotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9tY3RsX3BwX2RpdmVydF9kb25lKAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBfbWN0bCwKLQl2b2lkIF9fdXNlciAqYXJnKQotewotCXN0cnVjdCBtc21fcHBfZnJhbWUgZnJhbWU7Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmIGJ1ZjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBtc21fY2FtX2J1Zl9oYW5kbGUgYnVmX2hhbmRsZTsKLQlzdHJ1Y3QgbXNtX2NhbV9yZXR1cm5fZnJhbWVfaW5mbyByZXRfZnJhbWU7Ci0KLQlEKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZmcmFtZSwgYXJnLCBzaXplb2YoZnJhbWUpKSkgewotCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBfbWN0bC0+cHBfaW5mby5sb2NrLCBmbGFncyk7Ci0JaWYgKGZyYW1lLmluc3RfaGFuZGxlKSB7Ci0JCWJ1Zl9oYW5kbGUuYnVmX2xvb2t1cF90eXBlID0gQlVGX0xPT0tVUF9CWV9JTlNUX0hBTkRMRTsKLQkJYnVmX2hhbmRsZS5pbnN0X2hhbmRsZSA9IGZyYW1lLmluc3RfaGFuZGxlOwotCX0gZWxzZSB7Ci0JCWJ1Zl9oYW5kbGUuYnVmX2xvb2t1cF90eXBlID0gQlVGX0xPT0tVUF9CWV9JTUdfTU9ERTsKLQkJYnVmX2hhbmRsZS5pbWFnZV9tb2RlID0gZnJhbWUuaW1hZ2VfdHlwZTsKLQl9Ci0KLQlpZiAoZnJhbWUubnVtX3BsYW5lcyA+IDEpCi0JCWJ1Zi5jaF9wYWRkclswXSA9IGZyYW1lLm1wWzBdLnBoeV9hZGRyICsKLQkJCQkJZnJhbWUubXBbMF0uZGF0YV9vZmZzZXQ7Ci0JZWxzZQotCQlidWYuY2hfcGFkZHJbMF0gPSBmcmFtZS5zcC5waHlfYWRkciArIGZyYW1lLnNwLnlfb2ZmOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcF9tY3RsLT5wcF9pbmZvLmxvY2ssIGZsYWdzKTsKLQotCXJldF9mcmFtZS5kaXJ0eSA9IDA7Ci0JcmV0X2ZyYW1lLm5vZGVfdHlwZSA9IGZyYW1lLm5vZGVfdHlwZTsKLQlyZXRfZnJhbWUudGltZXN0YW1wID0gZnJhbWUudGltZXN0YW1wOwotCXJldF9mcmFtZS5mcmFtZV9pZCAgPSBmcmFtZS5mcmFtZV9pZDsKLQlEKCIlcyBGcmFtZSBkb25lIGlkOiAlZFxuIiwgX19mdW5jX18sIGZyYW1lLmZyYW1lX2lkKTsKLQlyYyA9IG1zbV9tY3RsX2J1Zl9kb25lX3BwKHBfbWN0bCwgJmJ1Zl9oYW5kbGUsICZidWYsICZyZXRfZnJhbWUpOwotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9tY3RsX3BwX21jdGxfZGl2ZXJ0X2RvbmUoCi0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcF9tY3RsLAotCXZvaWQgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IG1zbV9jYW1fZXZ0X2RpdmVydF9mcmFtZSBkaXZfZnJhbWU7Ci0Jc3RydWN0IG1zbV9mcmFtZV9idWZmZXIgKmJ1ZjsKLQlpbnQgaW1hZ2VfbW9kZSwgcmMgPSAwOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZkaXZfZnJhbWUsIGFyZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2NhbV9ldnRfZGl2ZXJ0X2ZyYW1lKSkpIHsKLQkJcHJfZXJyKCIlcyBjb3B5IGZyb20gdXNlciBmYWlsZWQgIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlpZiAoIWRpdl9mcmFtZS5mcmFtZS5oYW5kbGUpIHsKLQkJcHJfZXJyKCIlcyBJbnZhbGlkIGJ1ZmZlciBoYW5kbGUgIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaW1hZ2VfbW9kZSA9IGRpdl9mcmFtZS5pbWFnZV9tb2RlOwotCWJ1ZiA9IChzdHJ1Y3QgbXNtX2ZyYW1lX2J1ZmZlciAqKWRpdl9mcmFtZS5mcmFtZS5oYW5kbGU7Ci0JRCgiJXMgUmV0dXJuaW5nIGJ1ZmZlciAleCBJbWFnZSBtb2RlICVkICIsIF9fZnVuY19fLAotCQkoaW50KWJ1ZiwgaW1hZ2VfbW9kZSk7Ci0JcmMgPSBtc21fbWN0bF9idWZfcmV0dXJuX2J1ZihwX21jdGwsIGltYWdlX21vZGUsIGJ1Zik7Ci0JaWYgKHJjIDwgMCkKLQkJcHJfZXJyKCIlcyBFcnJvciByZXR1cm5pbmcgbWN0bCBidWZmZXIgIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIHJjOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV9tZW0uYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tc21fbWVtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YTg3ZDcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV9tZW0uYworKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgotCi0KLQotI2luY2x1ZGUgIm1zbS5oIgotCi0jaWZkZWYgQ09ORklHX01TTV9DQU1FUkFfREVCVUcKLSNkZWZpbmUgRChmbXQsIGFyZ3MuLi4pIHByX2RlYnVnKCJtc21faXNwOiAiIGZtdCwgIyNhcmdzKQotI2Vsc2UKLSNkZWZpbmUgRChmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNkZWZpbmUgUEFEX1RPX1dPUkQoYSkJICAoKChhKSArIDMpICYgfjMpCi0KLSNkZWZpbmUgX19DT05UQUlOUyhyLCB2LCBsLCBmaWVsZCkgKHsJCQkgICBcCi0JdHlwZW9mKHIpIF9fciA9IHI7CQkJCSAgXAotCXR5cGVvZih2KSBfX3YgPSB2OwkJCQkgIFwKLQl0eXBlb2YodikgX19lID0gX192ICsgbDsJCQkJXAotCWludCByZXMgPSBfX3YgPj0gX19yLT5maWVsZCAmJgkJCSAgXAotCQlfX2UgPD0gX19yLT5maWVsZCArIF9fci0+bGVuOwkJICAgXAotCXJlczsJCQkJCQkJXAotfSkKLQotI2RlZmluZSBDT05UQUlOUyhyMSwgcjIsIGZpZWxkKSAoewkJCSAgXAotCXR5cGVvZihyMikgX19yMiA9IHIyOwkJCQkgICBcCi0JX19DT05UQUlOUyhyMSwgX19yMi0+ZmllbGQsIF9fcjItPmxlbiwgZmllbGQpOwkgIFwKLX0pCi0KLSNkZWZpbmUgSU5fUkFOR0UociwgdiwgZmllbGQpICh7CQkJCVwKLQl0eXBlb2YocikgX19yID0gcjsJCQkJICBcCi0JdHlwZW9mKHYpIF9fdnYgPSB2OwkJCQkgXAotCWludCByZXMgPSAoKF9fdnYgPj0gX19yLT5maWVsZCkgJiYJCSAgXAotCQkoX192diA8IChfX3ItPmZpZWxkICsgX19yLT5sZW4pKSk7CSAgXAotCXJlczsJCQkJCQkJXAotfSkKLQotI2RlZmluZSBPVkVSTEFQUyhyMSwgcjIsIGZpZWxkKSAoewkJCSAgXAotCXR5cGVvZihyMSkgX19yMSA9IHIxOwkJCQkgICBcCi0JdHlwZW9mKHIyKSBfX3IyID0gcjI7CQkJCSAgIFwKLQl0eXBlb2YoX19yMi0+ZmllbGQpIF9fdiA9IF9fcjItPmZpZWxkOwkJICBcCi0JdHlwZW9mKF9fdikgX19lID0gX192ICsgX19yMi0+bGVuIC0gMTsJCSAgXAotCWludCByZXMgPSAoSU5fUkFOR0UoX19yMSwgX192LCBmaWVsZCkgfHwJCVwKLQkJSU5fUkFOR0UoX19yMSwgX19lLCBmaWVsZCkpOwkJCQkgXAotCXJlczsJCQkJCQkJXAotfSkKLQotc3RhdGljIERFRklORV9NVVRFWChobGlzdF9tdXQpOwotCi1zdGF0aWMgaW50IGNoZWNrX292ZXJsYXAoc3RydWN0IGhsaXN0X2hlYWQgKnB0eXBlLAotCQkJCXVuc2lnbmVkIGxvbmcgcGFkZHIsCi0JCQkJdW5zaWduZWQgbG9uZyBsZW4pCi17Ci0Jc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiAqcmVnaW9uOwotCXN0cnVjdCBtc21fcG1lbV9yZWdpb24gdCA9IHsgLnBhZGRyID0gcGFkZHIsIC5sZW4gPSBsZW4gfTsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKLQotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZ2lvbiwgbm9kZSwgcHR5cGUsIGxpc3QpIHsKLQkJaWYgKENPTlRBSU5TKHJlZ2lvbiwgJnQsIHBhZGRyKSB8fAotCQkJQ09OVEFJTlMoJnQsIHJlZ2lvbiwgcGFkZHIpIHx8Ci0JCQlPVkVSTEFQUyhyZWdpb24sICZ0LCBwYWRkcikpIHsKLQkJCUNEQkcoIiByZWdpb24gKFBIWVMgJXAgbGVuICVsZCkiCi0JCQkJIiBjbGFzaGVzIHdpdGggcmVnaXN0ZXJlZCByZWdpb24iCi0JCQkJIiAocGFkZHIgJXAgbGVuICVsZClcbiIsCi0JCQkJKHZvaWQgKil0LnBhZGRyLCB0LmxlbiwKLQkJCQkodm9pZCAqKXJlZ2lvbi0+cGFkZHIsIHJlZ2lvbi0+bGVuKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BtZW1fdGFibGVfYWRkKHN0cnVjdCBobGlzdF9oZWFkICpwdHlwZSwKLQlzdHJ1Y3QgbXNtX3BtZW1faW5mbyAqaW5mbywgc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgaW50IGRvbWFpbl9udW0pCi17Ci0JdW5zaWduZWQgbG9uZyBwYWRkcjsKLSNpZm5kZWYgQ09ORklHX01TTV9NVUxUSU1FRElBX1VTRV9JT04KLQl1bnNpZ25lZCBsb25nIGt2c3RhcnQ7Ci0Jc3RydWN0IGZpbGUgKmZpbGU7Ci0jZW5kaWYKLQlpbnQgcmMgPSAtRU5PTUVNOwotCi0JdW5zaWduZWQgbG9uZyBsZW47Ci0Jc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiAqcmVnaW9uOwotCi0JcmVnaW9uID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiksIEdGUF9LRVJORUwpOwotCWlmICghcmVnaW9uKQotCQlnb3RvIG91dDsKLSNpZmRlZiBDT05GSUdfTVNNX01VTFRJTUVESUFfVVNFX0lPTgotCXJlZ2lvbi0+aGFuZGxlID0gaW9uX2ltcG9ydF9kbWFfYnVmKGNsaWVudCwgaW5mby0+ZmQpOwotCWlmIChJU19FUlJfT1JfTlVMTChyZWdpb24tPmhhbmRsZSkpCi0JCWdvdG8gb3V0MTsKLQlpZiAoaW9uX21hcF9pb21tdShjbGllbnQsIHJlZ2lvbi0+aGFuZGxlLCBkb21haW5fbnVtLCAwLAotCQkJCSAgU1pfNEssIDAsICZwYWRkciwgJmxlbiwgMCwgMCkgPCAwKQotCQlnb3RvIG91dDI7Ci0jZWxzZQotCXBhZGRyID0gMDsKLQlmaWxlID0gTlVMTDsKLQlrdnN0YXJ0ID0gMDsKLSNlbmRpZgotCWlmICghaW5mby0+bGVuKQotCQlpbmZvLT5sZW4gPSBsZW47Ci0JcGFkZHIgKz0gaW5mby0+b2Zmc2V0OwotCWxlbiA9IGluZm8tPmxlbjsKLQotCWlmIChjaGVja19vdmVybGFwKHB0eXBlLCBwYWRkciwgbGVuKSA8IDApIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG91dDM7Ci0JfQotCi0JQ0RCRygiJXM6IHR5cGUgJWQsIGFjdGl2ZSBmbGFnICVkLCBwYWRkciAweCVseCwgdmFkZHIgMHglbHhcbiIsCi0JCV9fZnVuY19fLCBpbmZvLT50eXBlLCBpbmZvLT5hY3RpdmUsIHBhZGRyLAotCQkodW5zaWduZWQgbG9uZylpbmZvLT52YWRkcik7Ci0KLQlJTklUX0hMSVNUX05PREUoJnJlZ2lvbi0+bGlzdCk7Ci0JcmVnaW9uLT5wYWRkciA9IHBhZGRyOwotCXJlZ2lvbi0+bGVuID0gbGVuOwotCW1lbWNweSgmcmVnaW9uLT5pbmZvLCBpbmZvLCBzaXplb2YocmVnaW9uLT5pbmZvKSk7Ci0JRCgiJXMgQWRkaW5nIHJlZ2lvbiB0byBsaXN0IHdpdGggdHlwZSAlZFxuIiwgX19mdW5jX18sCi0JCQkJCQlyZWdpb24tPmluZm8udHlwZSk7Ci0JRCgiJXMgcG1lbV9zdGF0cyBhZGRyZXNzIGlzIDB4JXBcbiIsIF9fZnVuY19fLCBwdHlwZSk7Ci0JaGxpc3RfYWRkX2hlYWQoJihyZWdpb24tPmxpc3QpLCBwdHlwZSk7Ci0KLQlyZXR1cm4gMDsKLW91dDM6Ci0jaWZkZWYgQ09ORklHX01TTV9NVUxUSU1FRElBX1VTRV9JT04KLQlpb25fdW5tYXBfaW9tbXUoY2xpZW50LCByZWdpb24tPmhhbmRsZSwgZG9tYWluX251bSwgMCk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTVNNX01VTFRJTUVESUFfVVNFX0lPTgotb3V0MjoKLQlpb25fZnJlZShjbGllbnQsIHJlZ2lvbi0+aGFuZGxlKTsKLSNlbmRpZgotb3V0MToKLQlrZnJlZShyZWdpb24pOwotb3V0OgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX21zbV9yZWdpc3Rlcl9wbWVtKHN0cnVjdCBobGlzdF9oZWFkICpwdHlwZSwKLQkJCXN0cnVjdCBtc21fcG1lbV9pbmZvICpwaW5mbywgc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKLQkJCWludCBkb21haW5fbnVtKQotewotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKHBpbmZvLT50eXBlKSB7Ci0JY2FzZSBNU01fUE1FTV9BRjoKLQljYXNlIE1TTV9QTUVNX0FFQzoKLQljYXNlIE1TTV9QTUVNX0FXQjoKLQljYXNlIE1TTV9QTUVNX1JTOgotCWNhc2UgTVNNX1BNRU1fQ1M6Ci0JY2FzZSBNU01fUE1FTV9JSElTVDoKLQljYXNlIE1TTV9QTUVNX1NLSU46Ci0JY2FzZSBNU01fUE1FTV9BRUNfQVdCOgotCWNhc2UgTVNNX1BNRU1fQkFZRVJfR1JJRDoKLQljYXNlIE1TTV9QTUVNX0JBWUVSX0VYUE9TVVJFOgotCWNhc2UgTVNNX1BNRU1fQkFZRVJfRk9DVVM6Ci0JY2FzZSBNU01fUE1FTV9CQVlFUl9ISVNUOgotCQlyYyA9IG1zbV9wbWVtX3RhYmxlX2FkZChwdHlwZSwgcGluZm8sIGNsaWVudCwgZG9tYWluX251bSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgX19tc21fcG1lbV90YWJsZV9kZWwoc3RydWN0IGhsaXN0X2hlYWQgKnB0eXBlLAotCQkJc3RydWN0IG1zbV9wbWVtX2luZm8gKnBpbmZvLCBzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LAotCQkJaW50IGRvbWFpbl9udW0pCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uICpyZWdpb247Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICpuOwotCi0Jc3dpdGNoIChwaW5mby0+dHlwZSkgewotCWNhc2UgTVNNX1BNRU1fQUY6Ci0JY2FzZSBNU01fUE1FTV9BRUM6Ci0JY2FzZSBNU01fUE1FTV9BV0I6Ci0JY2FzZSBNU01fUE1FTV9SUzoKLQljYXNlIE1TTV9QTUVNX0NTOgotCWNhc2UgTVNNX1BNRU1fSUhJU1Q6Ci0JY2FzZSBNU01fUE1FTV9TS0lOOgotCWNhc2UgTVNNX1BNRU1fQUVDX0FXQjoKLQljYXNlIE1TTV9QTUVNX0JBWUVSX0dSSUQ6Ci0JY2FzZSBNU01fUE1FTV9CQVlFUl9FWFBPU1VSRToKLQljYXNlIE1TTV9QTUVNX0JBWUVSX0ZPQ1VTOgotCWNhc2UgTVNNX1BNRU1fQkFZRVJfSElTVDoKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZWdpb24sIG5vZGUsIG4sCi0JCQkJcHR5cGUsIGxpc3QpIHsKLQotCQkJaWYgKHBpbmZvLT50eXBlID09IHJlZ2lvbi0+aW5mby50eXBlICYmCi0JCQkJcGluZm8tPnZhZGRyID09IHJlZ2lvbi0+aW5mby52YWRkciAmJgotCQkJCXBpbmZvLT5mZCA9PSByZWdpb24tPmluZm8uZmQpIHsKLQkJCQlobGlzdF9kZWwobm9kZSk7Ci0jaWZkZWYgQ09ORklHX01TTV9NVUxUSU1FRElBX1VTRV9JT04KLQkJCQlpb25fdW5tYXBfaW9tbXUoY2xpZW50LCByZWdpb24tPmhhbmRsZSwKLQkJCQkJZG9tYWluX251bSwgMCk7Ci0JCQkJaW9uX2ZyZWUoY2xpZW50LCByZWdpb24tPmhhbmRsZSk7Ci0jZW5kaWYKLQkJCQlrZnJlZShyZWdpb24pOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIHJldHVybiBvZiAwIG1lYW5zIGZhaWx1cmUgKi8KLXVpbnQ4X3QgbXNtX3BtZW1fcmVnaW9uX2xvb2t1cChzdHJ1Y3QgaGxpc3RfaGVhZCAqcHR5cGUsCi0JaW50IHBtZW1fdHlwZSwgc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiAqcmVnLCB1aW50OF90IG1heGNvdW50KQotewotCXN0cnVjdCBtc21fcG1lbV9yZWdpb24gKnJlZ2lvbjsKLQlzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uICpyZWdwdHI7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICpuOwotCi0JdWludDhfdCByYyA9IDA7Ci0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlyZWdwdHIgPSByZWc7Ci0JbXV0ZXhfbG9jaygmaGxpc3RfbXV0KTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlZ2lvbiwgbm9kZSwgbiwgcHR5cGUsIGxpc3QpIHsKLQkJaWYgKHJlZ2lvbi0+aW5mby50eXBlID09IHBtZW1fdHlwZSAmJiByZWdpb24tPmluZm8uYWN0aXZlKSB7Ci0JCQkqcmVncHRyID0gKnJlZ2lvbjsKLQkJCXJjICs9IDE7Ci0JCQlpZiAocmMgPj0gbWF4Y291bnQpCi0JCQkJYnJlYWs7Ci0JCQlyZWdwdHIrKzsKLQkJfQotCX0KLQlEKCIlcyBmaW5pc2hlZCwgcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JbXV0ZXhfdW5sb2NrKCZobGlzdF9tdXQpOwotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9wbWVtX3JlZ2lvbl9nZXRfcGh5X2FkZHIoc3RydWN0IGhsaXN0X2hlYWQgKnB0eXBlLAotCXN0cnVjdCBtc21fbWVtX21hcF9pbmZvICptZW1fbWFwLCBpbnQzMl90ICpwaHlhZGRyKQotewotCXN0cnVjdCBtc21fcG1lbV9yZWdpb24gKnJlZ2lvbjsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm47Ci0JaW50IHBtZW1fdHlwZSA9IG1lbV9tYXAtPm1lbV90eXBlOwotCWludCByYyA9IC1FRkFVTFQ7Ci0KLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCSpwaHlhZGRyID0gMDsKLQltdXRleF9sb2NrKCZobGlzdF9tdXQpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVnaW9uLCBub2RlLCBuLCBwdHlwZSwgbGlzdCkgewotCQlpZiAocmVnaW9uLT5pbmZvLnR5cGUgPT0gcG1lbV90eXBlICYmCi0JCQkodWludDMyX3QpcmVnaW9uLT5pbmZvLnZhZGRyID09IG1lbV9tYXAtPmNvb2tpZSkgewotCQkJKnBoeWFkZHIgPSAoaW50MzJfdClyZWdpb24tPnBhZGRyOwotCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JRCgiJXMgZmluaXNoZWQsIHBoeV9hZGRyID0gMHgleCwgcmM9JWRcbiIsIF9fZnVuY19fLCAqcGh5YWRkciwgcmMpOwotCW11dGV4X3VubG9jaygmaGxpc3RfbXV0KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXVpbnQ4X3QgbXNtX3BtZW1fcmVnaW9uX2xvb2t1cF8yKHN0cnVjdCBobGlzdF9oZWFkICpwdHlwZSwKLQkJCQkJaW50IHBtZW1fdHlwZSwKLQkJCQkJc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiAqcmVnLAotCQkJCQl1aW50OF90IG1heGNvdW50KQotewotCXN0cnVjdCBtc21fcG1lbV9yZWdpb24gKnJlZ2lvbjsKLQlzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uICpyZWdwdHI7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICpuOwotCXVpbnQ4X3QgcmMgPSAwOwotCXJlZ3B0ciA9IHJlZzsKLQltdXRleF9sb2NrKCZobGlzdF9tdXQpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVnaW9uLCBub2RlLCBuLCBwdHlwZSwgbGlzdCkgewotCQlEKCJNaW86IGluZm8udHlwZT0lZCwgcG1lbV90eXBlID0gJWQsIgotCQkJCQkJImluZm8uYWN0aXZlID0gJWRcbiIsCi0JCXJlZ2lvbi0+aW5mby50eXBlLCBwbWVtX3R5cGUsIHJlZ2lvbi0+aW5mby5hY3RpdmUpOwotCi0JCWlmIChyZWdpb24tPmluZm8udHlwZSA9PSBwbWVtX3R5cGUgJiYgcmVnaW9uLT5pbmZvLmFjdGl2ZSkgewotCQkJRCgiaW5mby50eXBlPSVkLCBwbWVtX3R5cGUgPSAlZCwiCi0JCQkJCQkJImluZm8uYWN0aXZlID0gJWQsXG4iLAotCQkJCXJlZ2lvbi0+aW5mby50eXBlLCBwbWVtX3R5cGUsCi0JCQkJcmVnaW9uLT5pbmZvLmFjdGl2ZSk7Ci0JCQkqcmVncHRyID0gKnJlZ2lvbjsKLQkJCXJlZ2lvbi0+aW5mby50eXBlID0gTVNNX1BNRU1fVklERU87Ci0JCQlyYyArPSAxOwotCQkJaWYgKHJjID49IG1heGNvdW50KQotCQkJCWJyZWFrOwotCQkJcmVncHRyKys7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZobGlzdF9tdXQpOwotCXJldHVybiByYzsKLX0KLQotdW5zaWduZWQgbG9uZyBtc21fcG1lbV9zdGF0c192dG9wX2xvb2t1cCgKLQkJCQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICptY3RsLAotCQkJCXVuc2lnbmVkIGxvbmcgYnVmZmVyLAotCQkJCWludCBmZCkKLXsKLQlzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uICpyZWdpb247Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICpuOwotCi0JaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZWdpb24sIG5vZGUsIG4sCi0JJm1jdGwtPnN0YXRzX2luZm8ucG1lbV9zdGF0c19saXN0LCBsaXN0KSB7Ci0JCWlmICgoKHVuc2lnbmVkIGxvbmcpKHJlZ2lvbi0+aW5mby52YWRkcikgPT0gYnVmZmVyKSAmJgotCQkJCQkJKHJlZ2lvbi0+aW5mby5mZCA9PSBmZCkgJiYKLQkJCQkJCXJlZ2lvbi0+aW5mby5hY3RpdmUgPT0gMCkgewotCQkJcmVnaW9uLT5pbmZvLmFjdGl2ZSA9IDE7Ci0JCQlyZXR1cm4gcmVnaW9uLT5wYWRkcjsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi11bnNpZ25lZCBsb25nIG1zbV9wbWVtX3N0YXRzX3B0b3ZfbG9va3VwKAotCQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICptY3RsLAotCQl1bnNpZ25lZCBsb25nIGFkZHIsIGludCAqZmQpCi17Ci0Jc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiAqcmVnaW9uOwotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbjsKLQotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVnaW9uLCBub2RlLCBuLAotCSZtY3RsLT5zdGF0c19pbmZvLnBtZW1fc3RhdHNfbGlzdCwgbGlzdCkgewotCQlpZiAoYWRkciA9PSByZWdpb24tPnBhZGRyICYmIHJlZ2lvbi0+aW5mby5hY3RpdmUpIHsKLQkJCS8qIG9mZnNldCBzaW5jZSB3ZSBjb3VsZCBwYXNzIHZhZGRyIGluc2lkZSBhCi0JCQkgKiByZWdpc3RlcmVkIHBtZW0gYnVmZmVyICovCi0JCQkqZmQgPSByZWdpb24tPmluZm8uZmQ7Ci0JCQlyZWdpb24tPmluZm8uYWN0aXZlID0gMDsKLQkJCXJldHVybiAodW5zaWduZWQgbG9uZykocmVnaW9uLT5pbmZvLnZhZGRyKTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgbXNtX3JlZ2lzdGVyX3BtZW0oc3RydWN0IGhsaXN0X2hlYWQgKnB0eXBlLCB2b2lkIF9fdXNlciAqYXJnLAotCQkJCQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LAotCQkJCQlpbnQgZG9tYWluX251bSkKLXsKLQlzdHJ1Y3QgbXNtX3BtZW1faW5mbyBpbmZvOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpIHsKLQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gX19tc21fcmVnaXN0ZXJfcG1lbShwdHlwZSwgJmluZm8sIGNsaWVudCwgZG9tYWluX251bSk7Ci19Ci0vL0VYUE9SVF9TWU1CT0wobXNtX3JlZ2lzdGVyX3BtZW0pOwotCi1pbnQgbXNtX3BtZW1fdGFibGVfZGVsKHN0cnVjdCBobGlzdF9oZWFkICpwdHlwZSwgdm9pZCBfX3VzZXIgKmFyZywKLQkJCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIGludCBkb21haW5fbnVtKQotewotCXN0cnVjdCBtc21fcG1lbV9pbmZvIGluZm87Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkgewotCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIF9fbXNtX3BtZW1fdGFibGVfZGVsKHB0eXBlLCAmaW5mbywgY2xpZW50LCBkb21haW5fbnVtKTsKLX0KLS8vRVhQT1JUX1NZTUJPTChtc21fcG1lbV90YWJsZV9kZWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV92NGwyX3ZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtX3Y0bDJfdmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0OWJmNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtX3Y0bDJfdmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDk2NiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX21kcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgotCi0jaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgotI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWRtYS1zZy5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX3Y0bDJfb3ZlcmxheS5oPgotCi0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX2ZiLmg+Ci0KLSNpbmNsdWRlICJtc21fdjRsMl92aWRlby5oIgotCi0jZGVmaW5lIE1TTV9WSURFTyAtMQotCi1zdGF0aWMgc3RydWN0IG1zbV92NGwyX292ZXJsYXlfZGV2aWNlCSpzYXZlZF92b3V0MDsKLQotc3RhdGljIHN0cnVjdCBtdXRleCBtc21mYl9sb2NrOwotc3RhdGljIGNoYXIgKnY0bDJfcmFtX3BoeXM7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHY0bDJfcmFtX3NpemU7Ci0KLXN0YXRpYyBpbnQgbXNtX3Y0bDJfb3ZlcmxheV9tYXBmb3JtYXQodWludDMyX3QgcGl4ZWxmb3JtYXQpOwotCi1zdGF0aWMgaW50IG1zbV92NGwyX292ZXJsYXlfc3RhcnRzdHJlYW1pbmcoc3RydWN0IG1zbV92NGwyX292ZXJsYXlfZGV2aWNlICp2b3V0KQotewotCXZvdXQtPnJlcS5zcmMud2lkdGggPSB2b3V0LT5waXgud2lkdGg7Ci0Jdm91dC0+cmVxLnNyYy5oZWlnaHQgPSB2b3V0LT5waXguaGVpZ2h0OwotCi0Jdm91dC0+cmVxLnNyY19yZWN0LnggPSB2b3V0LT5jcm9wX3JlY3QubGVmdDsKLQl2b3V0LT5yZXEuc3JjX3JlY3QueSA9IHZvdXQtPmNyb3BfcmVjdC50b3A7Ci0Jdm91dC0+cmVxLnNyY19yZWN0LncgPSB2b3V0LT5jcm9wX3JlY3Qud2lkdGg7Ci0Jdm91dC0+cmVxLnNyY19yZWN0LmggPSB2b3V0LT5jcm9wX3JlY3QuaGVpZ2h0OwotCi0Jdm91dC0+cmVxLnNyYy5mb3JtYXQgPQotCQltc21fdjRsMl9vdmVybGF5X21hcGZvcm1hdCh2b3V0LT5waXgucGl4ZWxmb3JtYXQpOwotCi0Jdm91dC0+cmVxLmRzdF9yZWN0LnggPSB2b3V0LT53aW4udy5sZWZ0OwotCXZvdXQtPnJlcS5kc3RfcmVjdC55ID0gdm91dC0+d2luLncudG9wOwotCXZvdXQtPnJlcS5kc3RfcmVjdC53ID0gdm91dC0+d2luLncud2lkdGg7Ci0Jdm91dC0+cmVxLmRzdF9yZWN0LmggPSB2b3V0LT53aW4udy5oZWlnaHQ7Ci0KLQl2b3V0LT5yZXEuYWxwaGEgPSBNRFBfQUxQSEFfTk9QOwotCXZvdXQtPnJlcS50cmFuc3BfbWFzayA9IE1EUF9UUkFOU1BfTk9QOwotCi0JcHJfZGVidWcoIm1zbV92NGwyX292ZXJsYXk6c3RhcnRzdHJlYW1pbmc6ZW5hYmxpbmcgZmJcbiIpOwotCW11dGV4X2xvY2soJm1zbWZiX2xvY2spOwotCW1zbV9mYl92NGwyX2VuYWJsZSgmdm91dC0+cmVxLCB0cnVlLCAmdm91dC0+cGFyKTsKLQltdXRleF91bmxvY2soJm1zbWZiX2xvY2spOwotCi0Jdm91dC0+c3RyZWFtaW5nID0gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV92NGwyX292ZXJsYXlfc3RvcHN0cmVhbWluZyhzdHJ1Y3QgbXNtX3Y0bDJfb3ZlcmxheV9kZXZpY2UgKnZvdXQpCi17Ci0JaWYgKCF2b3V0LT5zdHJlYW1pbmcpCi0JCXJldHVybiAwOwotCi0JcHJfZGVidWcoIm1zbV92NGwyX292ZXJsYXk6c3RhcnRzdHJlYW1pbmc6ZGlzYWJsaW5nIGZiXG4iKTsKLQltdXRleF9sb2NrKCZtc21mYl9sb2NrKTsKLQltc21fZmJfdjRsMl9lbmFibGUoJnZvdXQtPnJlcSwgZmFsc2UsICZ2b3V0LT5wYXIpOwotCW11dGV4X3VubG9jaygmbXNtZmJfbG9jayk7Ci0KLQl2b3V0LT5zdHJlYW1pbmcgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3Y0bDJfb3ZlcmxheV9tYXBmb3JtYXQodWludDMyX3QgcGl4ZWxmb3JtYXQpCi17Ci0JaW50IG1kcF9mb3JtYXQ7Ci0KLQlzd2l0Y2ggKHBpeGVsZm9ybWF0KSB7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OgotCQltZHBfZm9ybWF0ID0gTURQX1JHQl81NjU7Ci0JCWJyZWFrOwotCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjMyOgotCQltZHBfZm9ybWF0ID0gTURQX0FSR0JfODg4ODsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfUkdCMjQ6Ci0JCW1kcF9mb3JtYXQgPSBNRFBfUkdCXzg4ODsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKLQkJbWRwX2Zvcm1hdCA9IE1EUF9ZX0NCQ1JfSDJWMjsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfTlYyMToKLQkJbWRwX2Zvcm1hdCA9IE1EUF9ZX0NSQ0JfSDJWMjsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIwOgotCQltZHBfZm9ybWF0ID0gTURQX1lfQ0JfQ1JfSDJWMjsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfVVlWWToKLQkJbWRwX2Zvcm1hdCA9IE1EUF9DQllDUllfSDJWMTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfWVVZVjoKLQkJbWRwX2Zvcm1hdCA9IE1EUF9ZQ0JZQ1JfSDJWMTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfWVZVNDIwOgotCQltZHBfZm9ybWF0ID0gTURQX1lfQ1JfQ0JfR0gyVjI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6VW5yZWNvZ25pemVkIGZvcm1hdCAldVxuIiwgX19mdW5jX18sIHBpeGVsZm9ybWF0KTsKLQkJbWRwX2Zvcm1hdCA9IE1EUF9ZX0NCQ1JfSDJWMjsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIG1kcF9mb3JtYXQ7Ci19Ci0KLXN0YXRpYyBpbnQKLW1zbV92NGwyX292ZXJsYXlfZmJfdXBkYXRlKHN0cnVjdCBtc21fdjRsMl9vdmVybGF5X2RldmljZSAqdm91dCwKLQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGxvbmcgc3JjX2FkZHIsIHNyY19zaXplOwotCXN0cnVjdCBtc21fdjRsMl9vdmVybGF5X3VzZXJwdHJfYnVmZmVyIHVwX2J1ZmZlcjsKLQotCWlmICghYnVmZmVyIHx8Ci0JCShidWZmZXItPm1lbW9yeSA9PSBWNEwyX01FTU9SWV9NTUFQICYmCi0JCSBidWZmZXItPmluZGV4ID49IHZvdXQtPm51bWJ1ZnMpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJm1zbWZiX2xvY2spOwotCXN3aXRjaCAoYnVmZmVyLT5tZW1vcnkpIHsKLQljYXNlIFY0TDJfTUVNT1JZX01NQVA6Ci0JCXNyY19hZGRyID0gKHVuc2lnbmVkIGxvbmcpdjRsMl9yYW1fcGh5cwotCQkrIHZvdXQtPmJ1ZnNbYnVmZmVyLT5pbmRleF0ub2Zmc2V0OwotCQlzcmNfc2l6ZSA9IGJ1ZmZlci0+Ynl0ZXN1c2VkOwotCQlyZXQgPSBtc21fZmJfdjRsMl91cGRhdGUodm91dC0+cGFyLCBmYWxzZSwgc3JjX2FkZHIsIHNyY19zaXplLAotCQkwLCAwLCAwLCAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX01FTU9SWV9VU0VSUFRSOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJnVwX2J1ZmZlciwKLQkJKHZvaWQgX191c2VyICopYnVmZmVyLT5tLnVzZXJwdHIsCi0JCXNpemVvZihzdHJ1Y3QgbXNtX3Y0bDJfb3ZlcmxheV91c2VycHRyX2J1ZmZlcikpKSB7Ci0JCQlwcl9lcnIoIiVzOmNvcHlfZnJvbV91c2VyIGZvciB1c2VycHRyIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQltdXRleF91bmxvY2soJm1zbWZiX2xvY2spOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJcmV0ID0gbXNtX2ZiX3Y0bDJfdXBkYXRlKHZvdXQtPnBhciwgdHJ1ZSwKLQkJKHVuc2lnbmVkIGxvbmcpdXBfYnVmZmVyLmZkWzBdLCB1cF9idWZmZXIub2Zmc2V0WzBdLAotCQkodW5zaWduZWQgbG9uZyl1cF9idWZmZXIuZmRbMV0sIHVwX2J1ZmZlci5vZmZzZXRbMV0sCi0JCSh1bnNpZ25lZCBsb25nKXVwX2J1ZmZlci5mZFsyXSwgdXBfYnVmZmVyLm9mZnNldFsyXSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCW11dGV4X3VubG9jaygmbXNtZmJfbG9jayk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJm1zbWZiX2xvY2spOwotCi0JaWYgKGJ1ZmZlci0+bWVtb3J5ID09IFY0TDJfTUVNT1JZX01NQVApIHsKLQkJdm91dC0+YnVmc1tidWZmZXItPmluZGV4XS5xdWV1ZWQgPSAxOwotCQlidWZmZXItPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOwotCX0KLQlidWZmZXItPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfUVVFVUVEOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotbXNtX3Y0bDJfb3ZlcmxheV92aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsCi0Jc3RydWN0IG1zbV92NGwyX292ZXJsYXlfZmggKmZoLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IG1zbV92NGwyX292ZXJsYXlfZGV2aWNlICp2b3V0ID0gZmgtPnZvdXQ7Ci0Jc3RydWN0IHY0bDJfYnVmZmVyICpidWZmZXIgPSBhcmc7Ci0JaW50IGk7Ci0KLQlpZiAoIXZvdXQtPnN0cmVhbWluZykgewotCQlwcl9lcnIoIiVzOiBWaWRlbyBTdHJlYW0gbm90IGVuYWJsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFidWZmZXIgfHwgYnVmZmVyLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChidWZmZXItPm1lbW9yeSA9PSBWNEwyX01FTU9SWV9NTUFQKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCB2b3V0LT5udW1idWZzOyBpKyspIHsKLQkJCWlmICh2b3V0LT5idWZzW2ldLnF1ZXVlZCA9PSAxKSAgewotCQkJCXZvdXQtPmJ1ZnNbaV0ucXVldWVkID0gMDsKLQkJCQkvKiBDYWxsIGludG8gZmIgdG8gcmVtb3ZlIHRoaXMgYnVmZmVyPyAqLwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogVGhpcyBzaG91bGQgYWN0dWFsbHkgYmxvY2ssIHVubGVzcyBPX05PTkJMT0NLIHdhcwotCQkgKiAgc3BlY2lmaWVkIGluIG9wZW4sIGJ1dCBmaW5lIGZvciBub3csIGVzcGVjaWFsbHkKLQkJICogIHNpbmNlIHRoaXMgaXMgbm90IGEgY2FwdHVyaW5nIGRldmljZQotCQkgKi8KLQkJaWYgKGkgPT0gdm91dC0+bnVtYnVmcykKLQkJCXJldHVybiAtRUFHQUlOOwotCX0KLQotCWJ1ZmZlci0+ZmxhZ3MgJj0gflY0TDJfQlVGX0ZMQUdfUVVFVUVEOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotbXNtX3Y0bDJfb3ZlcmxheV92aWRpb2NfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IG1zbV92NGwyX292ZXJsYXlfZmgqIGZoLAotCXZvaWQgKmFyZywgYm9vbCBiVXNlclB0cikKLXsKLQlzdHJ1Y3QgbXNtX3Y0bDJfb3ZlcmxheV9kZXZpY2UgKnZvdXQgPSBmaC0+dm91dDsKLQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZmZlciA9IGFyZzsKLQlpbnQgcmV0OwotCi0JaWYgKCFiVXNlclB0ciAmJiBidWZmZXItPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghdm91dC0+c3RyZWFtaW5nKSB7Ci0JCXByX2VycigiJXM6IFZpZGVvIFN0cmVhbSBub3QgZW5hYmxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIWJ1ZmZlciB8fCBidWZmZXItPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogbWF5YmUgYWxsb3cgb25seSBvbmUgcWJ1ZiBhdCBhIHRpbWU/ICovCi0JcmV0ID0gIG1zbV92NGwyX292ZXJsYXlfZmJfdXBkYXRlKHZvdXQsIGJ1ZmZlcik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbXNtX3Y0bDJfb3ZlcmxheV92aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpidWZmZXIgPSBhcmc7Ci0KLQltZW1zZXQoYnVmZmVyLCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfY2FwYWJpbGl0eSkpOwotCXN0cmxjcHkoYnVmZmVyLT5kcml2ZXIsICJtc21fdjRsMl92aWRlb19vdmVybGF5IiwKLQkJQVJSQVlfU0laRShidWZmZXItPmRyaXZlcikpOwotCXN0cmxjcHkoYnVmZmVyLT5jYXJkLCAiTVNNIE1EUCIsCi0JCUFSUkFZX1NJWkUoYnVmZmVyLT5jYXJkKSk7Ci0JYnVmZmVyLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9TVFJFQU1JTkcgfCBWNEwyX0NBUF9WSURFT19PVVRQVVQKLQkJfCBWNEwyX0NBUF9WSURFT19PVkVSTEFZOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1tc21fdjRsMl9vdmVybGF5X3ZpZGlvY19mYnVmKHN0cnVjdCBmaWxlICpmaWxlLAotCXN0cnVjdCBtc21fdjRsMl9vdmVybGF5X2RldmljZSAqdm91dCwgdm9pZCAqYXJnLCBib29sIGdldCkKLXsKLQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqZmIgPSBhcmc7Ci0KLQlpZiAoZmIgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoZ2V0KSB7Ci0JCW11dGV4X2xvY2soJnZvdXQtPnVwZGF0ZV9sb2NrKTsKLQkJbWVtY3B5KCZmYi0+Zm10LCAmdm91dC0+cGl4LCBzaXplb2Yoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCkpOwotCQltdXRleF91bmxvY2soJnZvdXQtPnVwZGF0ZV9sb2NrKTsKLQl9Ci0JLyogVGhlIFNfRkJVRiByZXF1ZXN0IGRvZXMgbm90IHN0b3JlIGFueXRoaW5nIHJpZ2h0IG5vdyAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyBtc21fdjRsMl9vdmVybGF5X2NhbGN1bGF0ZV9idWZzaXplKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCkKLXsKLQlpbnQgYnBwOwotCWxvbmcgYnVmc2l6ZTsKLQlzd2l0Y2ggKHBpeC0+cGl4ZWxmb3JtYXQpIHsKLQljYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjA6Ci0JY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKLQkJYnBwID0gMTI7Ci0JCWJyZWFrOwotCi0JY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OgotCQlicHAgPSAxNjsKLQkJYnJlYWs7Ci0KLQljYXNlIFY0TDJfUElYX0ZNVF9SR0IyNDoKLQljYXNlIFY0TDJfUElYX0ZNVF9CR1IyNDoKLQljYXNlIFY0TDJfUElYX0ZNVF9ZVVY0NDQ6Ci0JCWJwcCA9IDI0OwotCQlicmVhazsKLQotCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjMyOgotCWNhc2UgVjRMMl9QSVhfRk1UX0JHUjMyOgotCQlicHAgPSAzMjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogVW5yZWNvZ25pemVkIGZvcm1hdCAldVxuIiwgX19mdW5jX18sCi0JCXBpeC0+cGl4ZWxmb3JtYXQpOwotCQlicHAgPSAwOwotCX0KLQotCWJ1ZnNpemUgPSAocGl4LT53aWR0aCAqIHBpeC0+aGVpZ2h0ICogYnBwKS84OwotCi0JcmV0dXJuIGJ1ZnNpemU7Ci19Ci0KLXN0YXRpYyBsb25nCi1tc21fdjRsMl9vdmVybGF5X3ZpZGlvY19yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLAotCXN0cnVjdCBtc21fdjRsMl9vdmVybGF5X2RldmljZSAqdm91dCwgdm9pZCAqYXJnKQotCi17Ci0Jc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJxYiA9IGFyZzsKLQlsb25nIGJ1ZnNpemU7Ci0JaW50IGk7Ci0KLQlpZiAocnFiID09IE5VTEwgfHwgcnFiLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChycWItPm1lbW9yeSA9PSBWNEwyX01FTU9SWV9NTUFQKSB7Ci0JCWlmIChycWItPmNvdW50ID09IDApIHsKLQkJCS8qIERlYWxsb2NhdGUgYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KLQkJCW11dGV4X2xvY2soJnZvdXQtPnVwZGF0ZV9sb2NrKTsKLQkJCXZvdXQtPm51bWJ1ZnMgPSAwOwotCQkJa2ZyZWUodm91dC0+YnVmcyk7Ci0JCQkvKgotCQkJICogVGhlcmUgc2hvdWxkIGJlIGEgd2F5IHRvIGxvb2sgYXQgYnVmc1tpXS0+bWFwcGVkLAotCQkJICogYW5kIHByZXZlbnQgdXNlcnNwYWNlIGZyb20gbW1hcGluZyBhbmQgZGlyZWN0bHkKLQkJCSAqIGNhbGxpbmcgdGhpcyBpb2N0bCB3aXRob3V0IHVubWFwcGluZy4gTWF5YmUga2VybmVsCi0JCQkgKiBoYW5kbGVzIGZvciB1cywgYnV0IG5lZWRzIHRvIGJlIGNoZWNrZWQgb3V0Ci0JCQkgKi8KLQkJCW11dGV4X3VubG9jaygmdm91dC0+dXBkYXRlX2xvY2spOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIEtlZXAgaXQgc2ltcGxlIGZvciBub3cgLSBuZWVkIHRvIGRlYWxsb2NhdGUKLQkJCSAqIGJlZm9yZSByZWFsbG9jYXRlCi0JCQkgKi8KLQkJCWlmICh2b3V0LT5idWZzKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQltdXRleF9sb2NrKCZ2b3V0LT51cGRhdGVfbG9jayk7Ci0JCQlidWZzaXplID0KLQkJCQltc21fdjRsMl9vdmVybGF5X2NhbGN1bGF0ZV9idWZzaXplKCZ2b3V0LT5waXgpOwotCQkJbXV0ZXhfdW5sb2NrKCZ2b3V0LT51cGRhdGVfbG9jayk7Ci0KLQkJCWlmIChidWZzaXplID09IDAKLQkJCQl8fCAoYnVmc2l6ZSAqIHJxYi0+Y291bnQpID4gdjRsMl9yYW1fc2l6ZSkgewotCQkJCXByX2VycigiJXM6IFVuc3VwcG9ydGVkIGZvcm1hdCBvciBidWZmZXIgc2l6ZSB0b28gbGFyZ2VcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJCXByX2VycigiJXM6IGJ1ZnNpemUgJWx1IHJhbV9zaXplICV1IGNvdW50ICV1XG4iLAotCQkJCV9fZnVuY19fLCBidWZzaXplLCB2NGwyX3JhbV9zaXplLCBycWItPmNvdW50KTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIFdlIGRvbid0IHN1cHBvcnQgbXVsdGlwbGUgb3BlbiBvZiBvbmUgdm91dCwKLQkJCSAqIGJ1dCB0aGVyZSBhcmUgcHJvYmFibHkgc3RpbGwgc29tZSBNVCBwcm9ibGVtcyBoZXJlLAotCQkJICogKHdoYXQgaWYgc2FtZSBmaCBpcyBzaGFyZWQgYmV0d2VlbiB0d28gdXNlcnNwYWNlCi0JCQkgKiB0aHJlYWRzIGFuZCB0aGV5IGJvdGggY2FsbCBSRVFCVUZTIGV0YykKLQkJCSAqLwotCi0JCQltdXRleF9sb2NrKCZ2b3V0LT51cGRhdGVfbG9jayk7Ci0JCQl2b3V0LT5udW1idWZzID0gcnFiLT5jb3VudDsKLQkJCXZvdXQtPmJ1ZnMgPQotCQkJCWttYWxsb2MocnFiLT5jb3VudCAqCi0JCQkJCXNpemVvZihzdHJ1Y3QgbXNtX3Y0bDJfb3ZlcmxheV9idWZmZXIpLAotCQkJCQlHRlBfS0VSTkVMKTsKLQotCQkJZm9yIChpID0gMDsgaSA8IHJxYi0+Y291bnQ7IGkrKykgewotCQkJCXN0cnVjdCBtc21fdjRsMl9vdmVybGF5X2J1ZmZlciAqYiA9Ci0JCQkJKHN0cnVjdCBtc21fdjRsMl9vdmVybGF5X2J1ZmZlciAqKXZvdXQtPmJ1ZnMKLQkJCQkrIGk7Ci0JCQkJYi0+bWFwcGVkID0gMDsKLQkJCQliLT5xdWV1ZWQgPSAwOwotCQkJCWItPm9mZnNldCA9IFBBR0VfQUxJR04oYnVmc2l6ZSppKTsKLQkJCQliLT5idWZzaXplID0gYnVmc2l6ZTsKLQkJCX0KLQotCQkJbXV0ZXhfdW5sb2NrKCZ2b3V0LT51cGRhdGVfbG9jayk7Ci0KLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZwotbXNtX3Y0bDJfb3ZlcmxheV92aWRpb2NfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJIHN0cnVjdCBtc21fdjRsMl9vdmVybGF5X2RldmljZSAqdm91dCwKLQkJCQkgdm9pZCAqYXJnKQotewotCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmID0gYXJnOwotCXN0cnVjdCBtc21fdjRsMl9vdmVybGF5X2J1ZmZlciAqbWJ1ZjsKLQotCWlmIChidWYgPT0gTlVMTCB8fCBidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQKLQkJCXx8IGJ1Zi0+bWVtb3J5ID09IFY0TDJfTUVNT1JZX1VTRVJQVFIKLQkJCXx8IGJ1Zi0+aW5kZXggPj0gdm91dC0+bnVtYnVmcykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZ2b3V0LT51cGRhdGVfbG9jayk7Ci0KLQltYnVmID0gKHN0cnVjdCBtc21fdjRsMl9vdmVybGF5X2J1ZmZlciAqKXZvdXQtPmJ1ZnMgKyBidWYtPmluZGV4OwotCWJ1Zi0+ZmxhZ3MgPSAwOwotCWlmIChtYnVmLT5tYXBwZWQpCi0JCWJ1Zi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19NQVBQRUQ7Ci0JaWYgKG1idWYtPnF1ZXVlZCkKLQkJYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1FVRVVFRDsKLQotCWJ1Zi0+bWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKLQlidWYtPmxlbmd0aCA9IG1idWYtPmJ1ZnNpemU7Ci0JYnVmLT5tLm9mZnNldCA9IG1idWYtPm9mZnNldDsKLQotCW11dGV4X3VubG9jaygmdm91dC0+dXBkYXRlX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nCi1tc21fdjRsMl9vdmVybGF5X2RvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCXN0cnVjdCBtc21fdjRsMl9vdmVybGF5X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbXNtX3Y0bDJfb3ZlcmxheV9kZXZpY2UgKnZvdXQgPSBmaC0+dm91dDsKLQlpbnQgcmV0OwotCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmZmVyID0gYXJnOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFZJRElPQ19RVUVSWUNBUDoKLQkJcmV0dXJuIG1zbV92NGwyX292ZXJsYXlfdmlkaW9jX3F1ZXJ5Y2FwKGZpbGUsIGFyZyk7Ci0KLQljYXNlIFZJRElPQ19HX0ZCVUY6Ci0JCXJldHVybiBtc21fdjRsMl9vdmVybGF5X3ZpZGlvY19mYnVmKGZpbGUsIHZvdXQsIGFyZywgdHJ1ZSk7Ci0KLQljYXNlIFZJRElPQ19TX0ZCVUY6Ci0JCXJldHVybiBtc21fdjRsMl9vdmVybGF5X3ZpZGlvY19mYnVmKGZpbGUsIHZvdXQsIGFyZywgZmFsc2UpOwotCi0JY2FzZSBWSURJT0NfUkVRQlVGUzoKLQkJcmV0dXJuIG1zbV92NGwyX292ZXJsYXlfdmlkaW9jX3JlcWJ1ZnMoZmlsZSwgdm91dCwgYXJnKTsKLQotCWNhc2UgVklESU9DX1FVRVJZQlVGOgotCQlyZXR1cm4gbXNtX3Y0bDJfb3ZlcmxheV92aWRpb2NfcXVlcnlidWYoZmlsZSwgdm91dCwgYXJnKTsKLQotCWNhc2UgVklESU9DX1FCVUY6Ci0JCW11dGV4X2xvY2soJnZvdXQtPnVwZGF0ZV9sb2NrKTsKLQkJaWYgKGJ1ZmZlci0+bWVtb3J5ID09IFY0TDJfTUVNT1JZX1VTRVJQVFIpIHsKLQkJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKLQkJCQlyZXR1cm4gLUVQRVJNOwotCQkJcmV0ID0gbXNtX3Y0bDJfb3ZlcmxheV92aWRpb2NfcWJ1ZihmaWxlLCBmaCwgYXJnLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXJldCA9IG1zbV92NGwyX292ZXJsYXlfdmlkaW9jX3FidWYoZmlsZSwgZmgsIGFyZywKLQkJCQkJCWZhbHNlKTsKLQkJfQotCQltdXRleF91bmxvY2soJnZvdXQtPnVwZGF0ZV9sb2NrKTsKLQotCQlyZXR1cm4gcmV0OwotCi0JY2FzZSBWSURJT0NfTVNNX1VTRVJQVFJfUUJVRjoKLQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQotCQkJcmV0dXJuIC1FUEVSTTsKLQotCQltdXRleF9sb2NrKCZ2b3V0LT51cGRhdGVfbG9jayk7Ci0JCXJldCA9IG1zbV92NGwyX292ZXJsYXlfdmlkaW9jX3FidWYoZmlsZSwgZmgsIGFyZywgdHJ1ZSk7Ci0JCW11dGV4X3VubG9jaygmdm91dC0+dXBkYXRlX2xvY2spOwotCi0JCXJldHVybiByZXQ7Ci0KLQljYXNlIFZJRElPQ19EUUJVRjoKLQkJbXV0ZXhfbG9jaygmdm91dC0+dXBkYXRlX2xvY2spOwotCQlyZXQgPSBtc21fdjRsMl9vdmVybGF5X3ZpZGlvY19kcWJ1ZihmaWxlLCBmaCwgYXJnKTsKLQkJbXV0ZXhfdW5sb2NrKCZ2b3V0LT51cGRhdGVfbG9jayk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfU19GTVQ6IHsKLQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gYXJnOwotCi0JCXN3aXRjaCAoZi0+dHlwZSkgewotCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKLQkJCW11dGV4X2xvY2soJnZvdXQtPnVwZGF0ZV9sb2NrKTsKLQkJCW1lbWNweSgmdm91dC0+d2luLCAmZi0+Zm10LndpbiwKLQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfd2luZG93KSk7Ci0JCQltdXRleF91bmxvY2soJnZvdXQtPnVwZGF0ZV9sb2NrKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6Ci0JCQltdXRleF9sb2NrKCZ2b3V0LT51cGRhdGVfbG9jayk7Ci0JCQltZW1jcHkoJnZvdXQtPnBpeCwgJmYtPmZtdC5waXgsCi0JCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQpKTsKLQkJCW11dGV4X3VubG9jaygmdm91dC0+dXBkYXRlX2xvY2spOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIFZJRElPQ19HX0ZNVDogewotCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYgPSBhcmc7Ci0KLQkJc3dpdGNoIChmLT50eXBlKSB7Ci0JCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6IHsKLQkJCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmLT5mbXQucGl4OwotCQkJbWVtc2V0KHBpeCwgMCwgc2l6ZW9mKCpwaXgpKTsKLQkJCSpwaXggPSB2b3V0LT5waXg7Ci0JCQlicmVhazsKLQkJfQotCi0JCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOiB7Ci0JCQlzdHJ1Y3QgdjRsMl93aW5kb3cgKndpbiA9ICZmLT5mbXQud2luOwotCQkJbWVtc2V0KHdpbiwgMCwgc2l6ZW9mKCp3aW4pKTsKLQkJCXdpbi0+dyA9IHZvdXQtPndpbi53OwotCQkJYnJlYWs7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgVklESU9DX0NST1BDQVA6IHsKLQkJc3RydWN0IHY0bDJfY3JvcGNhcCAqY3IgPSBhcmc7Ci0JCWlmIChjci0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWNyLT5ib3VuZHMubGVmdCA9ICAwOwotCQljci0+Ym91bmRzLnRvcCA9IDA7Ci0JCWNyLT5ib3VuZHMud2lkdGggPSB2b3V0LT5jcm9wX3JlY3Qud2lkdGg7Ci0JCWNyLT5ib3VuZHMuaGVpZ2h0ID0gdm91dC0+Y3JvcF9yZWN0LmhlaWdodDsKLQotCQljci0+ZGVmcmVjdC5sZWZ0ID0gIDA7Ci0JCWNyLT5kZWZyZWN0LnRvcCA9IDA7Ci0JCWNyLT5kZWZyZWN0LndpZHRoID0gdm91dC0+Y3JvcF9yZWN0LndpZHRoOwotCQljci0+ZGVmcmVjdC5oZWlnaHQgPSB2b3V0LT5jcm9wX3JlY3QuaGVpZ2h0OwotCi0JCWNyLT5waXhlbGFzcGVjdC5udW1lcmF0b3IgPSAxOwotCQljci0+cGl4ZWxhc3BlY3QuZGVub21pbmF0b3IgPSAxOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFZJRElPQ19TX0NST1A6IHsKLQkJc3RydWN0IHY0bDJfY3JvcCAqY3JvcCA9IGFyZzsKLQotCQlzd2l0Y2ggKGNyb3AtPnR5cGUpIHsKLQotCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgotCi0JCQltdXRleF9sb2NrKCZ2b3V0LT51cGRhdGVfbG9jayk7Ci0JCQltZW1jcHkoJnZvdXQtPmNyb3BfcmVjdCwgJmNyb3AtPmMsCi0JCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3JlY3QpKTsKLQkJCW11dGV4X3VubG9jaygmdm91dC0+dXBkYXRlX2xvY2spOwotCi0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfR19DUk9QOiB7Ci0JCXN0cnVjdCB2NGwyX2Nyb3AgKmNyb3AgPSBhcmc7Ci0KLQkJc3dpdGNoIChjcm9wLT50eXBlKSB7Ci0KLQkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKLQkJCW1lbWNweSgmY3JvcC0+YywgJnZvdXQtPmNyb3BfcmVjdCwKLQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfcmVjdCkpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgVklESU9DX1NfQ1RSTDogewotCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOwotCQlpbnQzMl90IHJvdGZsYWc7Ci0KLQkJc3dpdGNoIChjdHJsLT5pZCkgewotCi0JCWNhc2UgVjRMMl9DSURfUk9UQVRFOgotCQkJc3dpdGNoIChjdHJsLT52YWx1ZSkgewotCQkJY2FzZSAwOgotCQkJCXJvdGZsYWcgPSBNRFBfUk9UX05PUDsKLQkJCQlicmVhazsKLQkJCWNhc2UgOTA6Ci0JCQkJcm90ZmxhZyA9IE1EUF9ST1RfOTA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE4MDoKLQkJCQlyb3RmbGFnID0gTURQX1JPVF8xODA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI3MDoKLQkJCQlyb3RmbGFnID0gTURQX1JPVF8yNzA7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXByX2VycigiJXM6IFY0TDJfQ0lEX1JPVEFURSBpbnZhbGlkIHJvdGF0aW9uIHZhbHVlICVkLlxuIiwKLQkJCQkJCV9fZnVuY19fLCBjdHJsLT52YWx1ZSk7Ci0JCQkJcmV0dXJuIC1FUkFOR0U7Ci0JCQl9Ci0KLQkJCW11dGV4X2xvY2soJnZvdXQtPnVwZGF0ZV9sb2NrKTsKLQkJCS8qIENsZWFyIHRoZSByb3RhdGlvbiBmbGFncyAqLwotCQkJdm91dC0+cmVxLmZsYWdzICY9IH5NRFBfUk9UX05PUDsKLQkJCXZvdXQtPnJlcS5mbGFncyAmPSB+TURQX1JPVF85MDsKLQkJCXZvdXQtPnJlcS5mbGFncyAmPSB+TURQX1JPVF8xODA7Ci0JCQl2b3V0LT5yZXEuZmxhZ3MgJj0gfk1EUF9ST1RfMjcwOwotCQkJLyogU2V0IHRoZSBuZXcgcm90YXRpb24gZmxhZyAqLwotCQkJdm91dC0+cmVxLmZsYWdzIHw9IHJvdGZsYWc7Ci0JCQltdXRleF91bmxvY2soJnZvdXQtPnVwZGF0ZV9sb2NrKTsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJCW11dGV4X2xvY2soJnZvdXQtPnVwZGF0ZV9sb2NrKTsKLQkJCS8qIENsZWFyIHRoZSBmbGlwIGZsYWcgKi8KLQkJCXZvdXQtPnJlcS5mbGFncyAmPSB+TURQX0ZMSVBfTFI7Ci0JCQlpZiAodHJ1ZSA9PSBjdHJsLT52YWx1ZSkKLQkJCQl2b3V0LT5yZXEuZmxhZ3MgfD0gTURQX0ZMSVBfTFI7Ci0JCQltdXRleF91bmxvY2soJnZvdXQtPnVwZGF0ZV9sb2NrKTsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJCW11dGV4X2xvY2soJnZvdXQtPnVwZGF0ZV9sb2NrKTsKLQkJCS8qIENsZWFyIHRoZSBmbGlwIGZsYWcgKi8KLQkJCXZvdXQtPnJlcS5mbGFncyAmPSB+TURQX0ZMSVBfVUQ7Ci0JCQlpZiAodHJ1ZSA9PSBjdHJsLT52YWx1ZSkKLQkJCQl2b3V0LT5yZXEuZmxhZ3MgfD0gTURQX0ZMSVBfVUQ7Ci0JCQltdXRleF91bmxvY2soJnZvdXQtPnVwZGF0ZV9sb2NrKTsKLQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXByX2VycigiJXM6IFZJRElPQ19TX0NUUkwgaW52YWxpZCBjb250cm9sIElEICVkLlxuIiwKLQkJCV9fZnVuY19fLCBjdHJsLT5pZCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfR19DVFJMOiB7Ci0JCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7Ci0JCV9fczMyIHJvdGF0aW9uOwotCi0JCXN3aXRjaCAoY3RybC0+aWQpIHsKLQotCQljYXNlIFY0TDJfQ0lEX1JPVEFURToKLQkJCWlmIChNRFBfUk9UX05PUCA9PSAodm91dC0+cmVxLmZsYWdzICYgTURQX1JPVF9OT1ApKQotCQkJCXJvdGF0aW9uID0gMDsKLQkJCWlmIChNRFBfUk9UXzkwID09ICh2b3V0LT5yZXEuZmxhZ3MgJiBNRFBfUk9UXzkwKSkKLQkJCQlyb3RhdGlvbiA9IDkwOwotCQkJaWYgKE1EUF9ST1RfMTgwID09ICh2b3V0LT5yZXEuZmxhZ3MgJiBNRFBfUk9UXzE4MCkpCi0JCQkJcm90YXRpb24gPSAxODA7Ci0JCQlpZiAoTURQX1JPVF8yNzAgPT0gKHZvdXQtPnJlcS5mbGFncyAmIE1EUF9ST1RfMjcwKSkKLQkJCQlyb3RhdGlvbiA9IDI3MDsKLQotCQkJY3RybC0+dmFsdWUgPSByb3RhdGlvbjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVjRMMl9DSURfSEZMSVA6Ci0JCQlpZiAoTURQX0ZMSVBfTFIgPT0gKHZvdXQtPnJlcS5mbGFncyAmIE1EUF9GTElQX0xSKSkKLQkJCQljdHJsLT52YWx1ZSA9IHRydWU7Ci0JCQlicmVhazsKLQotCQljYXNlIFY0TDJfQ0lEX1ZGTElQOgotCQkJaWYgKE1EUF9GTElQX1VEID09ICh2b3V0LT5yZXEuZmxhZ3MgJiBNRFBfRkxJUF9VRCkpCi0JCQkJY3RybC0+dmFsdWUgPSB0cnVlOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXByX2VycigiJXM6IFZJRElPQ19HX0NUUkwgaW52YWxpZCBjb250cm9sIElEICVkLlxuIiwKLQkJCV9fZnVuY19fLCBjdHJsLT5pZCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIFZJRElPQ19TVFJFQU1PTjogewotCi0JCWlmICh2b3V0LT5zdHJlYW1pbmcpIHsKLQkJCXByX2VycigiJXM6IFZJRElPQ19TVFJFQU1PTjogYWxyZWFkeSBzdHJlYW1pbmcuXG4iLAotCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCi0JCW11dGV4X2xvY2soJnZvdXQtPnVwZGF0ZV9sb2NrKTsKLQkJbXNtX3Y0bDJfb3ZlcmxheV9zdGFydHN0cmVhbWluZyh2b3V0KTsKLQkJbXV0ZXhfdW5sb2NrKCZ2b3V0LT51cGRhdGVfbG9jayk7Ci0KLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBWSURJT0NfU1RSRUFNT0ZGOiB7Ci0KLQkJaWYgKCF2b3V0LT5zdHJlYW1pbmcpIHsKLQkJCXByX2VycigiJXM6IFZJRElPQ19TVFJFQU1PRkY6IG5vdCBjdXJyZW50bHkgc3RyZWFtaW5nLlxuIiwKLQkJCV9fZnVuY19fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJbXV0ZXhfbG9jaygmdm91dC0+dXBkYXRlX2xvY2spOwotCQltc21fdjRsMl9vdmVybGF5X3N0b3BzdHJlYW1pbmcodm91dCk7Ci0JCW11dGV4X3VubG9jaygmdm91dC0+dXBkYXRlX2xvY2spOwotCi0JCWJyZWFrOwotCX0KLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0KLQl9IC8qIHN3aXRjaCAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nCi1tc21fdjRsMl9vdmVybGF5X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGZpbGUsIGNtZCwgYXJnLCBtc21fdjRsMl9vdmVybGF5X2RvX2lvY3RsKTsKLX0KLQotc3RhdGljIGludAotbXNtX3Y0bDJfb3ZlcmxheV9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCi17Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9ICh1bnNpZ25lZCBsb25nKXY0bDJfcmFtX3BoeXM7Ci0KLQkvKgotCSAqIHZtX3Bnb2ZmIGlzIHRoZSBvZmZzZXQgKD4+UEFHRV9TSElGVCkgdGhhdCB3ZSBwcm92aWRlZAotCSAqIGR1cmluZyBSRVFCVUZTLiBvZmYgdGhlcmVmb3JlIHNob3VsZCBlcXVhbCB0aGUgb2Zmc2V0IHdlCi0JICogcHJvdmlkZWQgaW4gUkVRQlVGUywgc2luY2UgbGFzdCAoUEFHRV9TSElGVCkgYml0cyBvZiBvZmYKLQkgKiBzaG91bGQgYmUgMAotCSAqLwotCXVuc2lnbmVkIGxvbmcgb2ZmID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOwotCXUzMiBsZW4gPSBQQUdFX0FMSUdOKChzdGFydCAmIH5QQUdFX01BU0spICsgdjRsMl9yYW1fc2l6ZSk7Ci0KLQkvKgotCSAqIFRoaXMgaXMgcHJvYmFibHkgdW5uZWNlc3Nhcnkgbm93IC0gdGhlIGxhc3QgUEFHRV9TSElGVAotCSAqIGJpdHMgb2Ygc3RhcnQgc2hvdWxkIGJlIDAgbm93LCBzaW5jZSB3ZSBhcmUgcGFnZSBhbGlnbmluZwotCSAqIHY0bDJfcmFtX3BoeXMKLQkgKi8KLQlzdGFydCAmPSBQQUdFX01BU0s7Ci0KLQlwcl9kZWJ1ZygidjRsMiBtYXAgcmVxIGZvciBwaHlzKCVwLCVwKSBvZmZzZXQgJXUgdG8gdmlydCAoJXAsJXApXG4iLAotCSh2b2lkICopKHN0YXJ0K29mZiksICh2b2lkICopKHN0YXJ0K29mZisodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSksCi0JKHVuc2lnbmVkIGludClvZmYsICh2b2lkICopdm1hLT52bV9zdGFydCwgKHZvaWQgKil2bWEtPnZtX2VuZCk7Ci0KLQlpZiAoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCArIG9mZikgPiBsZW4pIHsKLQkJcHJfZXJyKCJ2NGwyIG1hcCByZXF1ZXN0LCBtZW1vcnkgcmVxdWVzdGVkIHRvbyBiaWdcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzdGFydCArPSBvZmY7Ci0Jdm1hLT52bV9wZ29mZiA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7Ci0JLyogVGhpcyBpcyBhbiBJTyBtYXAgLSB0ZWxsIG1heWR1bXAgdG8gc2tpcCB0aGlzIFZNQSAqLwotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU8gfCBWTV9SRVNFUlZFRDsKLQotCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0KLQkvKiBSZW1hcCB0aGUgZnJhbWUgYnVmZmVyIEkvTyByYW5nZSAqLwotCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBzdGFydCA+PiBQQUdFX1NISUZULAotCQkJCXZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKLQkJCQl2bWEtPnZtX3BhZ2VfcHJvdCkpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW1zbV92NGwyX292ZXJsYXlfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgbXNtX3Y0bDJfb3ZlcmxheV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IG1zbV92NGwyX292ZXJsYXlfZGV2aWNlICp2b3V0ID0gZmgtPnZvdXQ7Ci0KLQlpZiAodm91dC0+c3RyZWFtaW5nKQotCQltc21fdjRsMl9vdmVybGF5X3N0b3BzdHJlYW1pbmcodm91dCk7Ci0KLQl2b3V0LT5yZWZfY291bnQtLTsKLQotCWtmcmVlKHZvdXQtPmJ1ZnMpOwotCXZvdXQtPm51bWJ1ZnMgPSAwOwotCWtmcmVlKGZoKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1tc21fdjRsMl9vdmVybGF5X29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IG1zbV92NGwyX292ZXJsYXlfZGV2aWNlCSp2b3V0ID0gTlVMTDsKLQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0CSpwaXggPSBOVUxMOwotCXN0cnVjdCBtc21fdjRsMl9vdmVybGF5X2ZoICpmaDsKLQotCXZvdXQgPSBzYXZlZF92b3V0MDsKLQl2b3V0LT5pZCA9IDA7Ci0KLQlpZiAodm91dC0+cmVmX2NvdW50KSB7Ci0JCXByX2VycigiJXM6IG11bHRpcGxlIG9wZW4gY3VycmVudGx5IGlzIG5vdCIKLQkJInN1cHBvcnRlZCFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQl2b3V0LT5yZWZfY291bnQrKzsKLQotCS8qIGFsbG9jYXRlIHBlci1maWxlaGFuZGxlIGRhdGEgKi8KLQlmaCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fdjRsMl9vdmVybGF5X2ZoKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKE5VTEwgPT0gZmgpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZmgtPnZvdXQgPSB2b3V0OwotCWZoLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKLQotCXZvdXQtPnN0cmVhbWluZwkJPSAwOwotCXZvdXQtPmNyb3BfcmVjdC5sZWZ0CT0gdm91dC0+Y3JvcF9yZWN0LnRvcCA9IDA7Ci0Jdm91dC0+Y3JvcF9yZWN0LndpZHRoCT0gdm91dC0+c2NyZWVuX3dpZHRoOwotCXZvdXQtPmNyb3BfcmVjdC5oZWlnaHQJPSB2b3V0LT5zY3JlZW5faGVpZ2h0OwotCi0JcGl4CQkJCT0gJnZvdXQtPnBpeDsKLQlwaXgtPndpZHRoCQkJPSB2b3V0LT5zY3JlZW5fd2lkdGg7Ci0JcGl4LT5oZWlnaHQJCT0gdm91dC0+c2NyZWVuX2hlaWdodDsKLQlwaXgtPnBpeGVsZm9ybWF0CT0gVjRMMl9QSVhfRk1UX1JHQjMyOwotCXBpeC0+ZmllbGQJCQk9IFY0TDJfRklFTERfTk9ORTsKLQlwaXgtPmJ5dGVzcGVybGluZQk9IHBpeC0+d2lkdGggKiA0OwotCXBpeC0+c2l6ZWltYWdlCQk9IHBpeC0+Ynl0ZXNwZXJsaW5lICogcGl4LT5oZWlnaHQ7Ci0JcGl4LT5wcml2CQkJPSAwOwotCXBpeC0+Y29sb3JzcGFjZQkJPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKLQotCXZvdXQtPndpbi53LmxlZnQJPSAwOwotCXZvdXQtPndpbi53LnRvcAkJPSAwOwotCXZvdXQtPndpbi53LndpZHRoCT0gdm91dC0+c2NyZWVuX3dpZHRoOwotCXZvdXQtPndpbi53LmhlaWdodAk9IHZvdXQtPnNjcmVlbl9oZWlnaHQ7Ci0KLQl2b3V0LT5mYi5jYXBhYmlsaXR5ID0gVjRMMl9GQlVGX0NBUF9FWFRFUk5PVkVSTEFZCi0JCXwgVjRMMl9GQlVGX0NBUF9MT0NBTF9BTFBIQTsKLQl2b3V0LT5mYi5mbGFncyA9IFY0TDJfRkJVRl9GTEFHX0xPQ0FMX0FMUEhBOwotCXZvdXQtPmZiLmJhc2UgPSAwOwotCW1lbWNweSgmdm91dC0+ZmIuZm10LCBwaXgsIHNpemVvZihzdHJ1Y3QgdjRsMl9mb3JtYXQpKTsKLQotCXZvdXQtPmJ1ZnMgPSAwOwotCXZvdXQtPm51bWJ1ZnMgPSAwOwotCi0JbXV0ZXhfaW5pdCgmdm91dC0+dXBkYXRlX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBfX2RldmluaXQKLW1zbV92NGwyX292ZXJsYXlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQljaGFyICp2NGwyX3JhbV9waHlzX3VuYWxpZ25lZDsKLQlpZiAoKHBkZXYtPmlkID09IDApICYmIChwZGV2LT5udW1fcmVzb3VyY2VzID4gMCkpIHsKLQkJdjRsMl9yYW1fc2l6ZSA9Ci0JCQlwZGV2LT5yZXNvdXJjZVswXS5lbmQgLSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydCArIDE7Ci0JCXY0bDJfcmFtX3BoeXNfdW5hbGlnbmVkID0gKGNoYXIgKilwZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKLQkJdjRsMl9yYW1fcGh5cyA9Ci0JCShjaGFyICopUEFHRV9BTElHTigodW5zaWduZWQgaW50KXY0bDJfcmFtX3BoeXNfdW5hbGlnbmVkKTsKLQkJLyoKLQkJICogV2UgYXJlIChmd2QpIHBhZ2UgYWxpZ25pbmcgdGhlIHN0YXJ0IG9mIHY0bDIgbWVtb3J5LgotCQkgKiBUaGVyZWZvcmUgd2UgaGF2ZSB0aGF0IG11Y2ggbGVzcyBwaHlzaWNhbCBtZW1vcnkgYXZhaWxhYmxlCi0JCSAqLwotCQl2NGwyX3JhbV9zaXplIC09ICh1bnNpZ25lZCBpbnQpdjRsMl9yYW1fcGh5cwotCQkJLSAodW5zaWduZWQgaW50KXY0bDJfcmFtX3BoeXNfdW5hbGlnbmVkOwotCi0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0Ci1tc21fdjRsMl9vdmVybGF5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBtc21fdjRsMl9vdmVybGF5X3ZpZGVvZGV2X3JlbGVhc2Uoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkKQotewotCXJldHVybjsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBtc21fdjRsMl9vdmVybGF5X2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IG1zbV92NGwyX292ZXJsYXlfb3BlbiwKLQkucmVsZWFzZQk9IG1zbV92NGwyX292ZXJsYXlfcmVsZWFzZSwKLQkubW1hcAkJPSBtc21fdjRsMl9vdmVybGF5X21tYXAsCi0JLmlvY3RsCQk9IG1zbV92NGwyX292ZXJsYXlfaW9jdGwsCi19OwotCi1zdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBtc21fdjRsMl9vdmVybGF5X3ZpZF9kZXZpY2UwID0gewotCS5uYW1lCQk9ICJtc21fdjRsMl9vdmVybGF5IiwKLQkuZm9wcyAgICAgICA9ICZtc21fdjRsMl9vdmVybGF5X2ZvcHMsCi0JLm1pbm9yCQk9IC0xLAotCS5yZWxlYXNlCT0gbXNtX3Y0bDJfb3ZlcmxheV92aWRlb2Rldl9yZWxlYXNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX3Y0bDJfb3ZlcmxheV9wbGF0Zm9ybV9kcml2ZXIgPSB7Ci0JLnByb2JlICAgPSBtc21fdjRsMl9vdmVybGF5X3Byb2JlLAotCS5yZW1vdmUgID0gbXNtX3Y0bDJfb3ZlcmxheV9yZW1vdmUsCi0JLmRyaXZlciAgPSB7Ci0JCQkgLm5hbWUgPSAibXNtX3Y0bDJfb3ZlcmxheV9wZCIsCi0JCSAgIH0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fdjRsMl9vdmVybGF5X2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0KLQlzYXZlZF92b3V0MCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fdjRsMl9vdmVybGF5X2RldmljZSksCi0JCUdGUF9LRVJORUwpOwotCi0JaWYgKCFzYXZlZF92b3V0MCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV92NGwyX292ZXJsYXlfcGxhdGZvcm1fZHJpdmVyKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlbmQ7Ci0KLQkvKgotCSAqIFJlZ2lzdGVyIHRoZSBkZXZpY2Ugd2l0aCB2aWRlb2Rldi4KLQkgKiBWaWRlb2RldiB3aWxsIG1ha2UgSU9DVEwgY2FsbHMgb24gYXBwbGljYXRpb24gcmVxdWVzdHMKLQkgKi8KLQlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJm1zbV92NGwyX292ZXJsYXlfdmlkX2RldmljZTAsCi0JCVZGTF9UWVBFX0dSQUJCRVIsIE1TTV9WSURFTyk7Ci0KLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBWNEwyIHZpZGVvIG92ZXJsYXkgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsdXJlKCVkKVxuIiwKLQkJCQkgIF9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVuZF91bnJlZ2lzdGVyOwotCX0KLQotCW11dGV4X2luaXQoJm1zbWZiX2xvY2spOwotCi0JcmV0dXJuIDA7Ci0KLWVuZF91bnJlZ2lzdGVyOgotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fdjRsMl9vdmVybGF5X3BsYXRmb3JtX2RyaXZlcik7Ci0KLWVuZDoKLQlrZnJlZShzYXZlZF92b3V0MCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG1zbV92NGwyX292ZXJsYXlfZXhpdCh2b2lkKQotewotCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZtc21fdjRsMl9vdmVybGF5X3ZpZF9kZXZpY2UwKTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX3Y0bDJfb3ZlcmxheV9wbGF0Zm9ybV9kcml2ZXIpOwotCW11dGV4X2Rlc3Ryb3koJm1zbWZiX2xvY2spOwotCWtmcmVlKHNhdmVkX3ZvdXQwKTsKLX0KLQotbW9kdWxlX2luaXQobXNtX3Y0bDJfb3ZlcmxheV9pbml0KTsKLW1vZHVsZV9leGl0KG1zbV92NGwyX292ZXJsYXlfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIFY0TDIgVmlkZW8gT3ZlcmxheSBEcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tc21fdjRsMl92aWRlby5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV92NGwyX3ZpZGVvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZTZjODAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV92NGwyX3ZpZGVvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpZm5kZWYgTVNNX1Y0TDJfVklERU9fSAotI2RlZmluZSBNU01fVjRMMl9WSURFT19ICi0KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9tZHAuaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLQotCi1zdHJ1Y3QgbXNtX3Y0bDJfb3ZlcmxheV9idWZmZXIgewotCWludCBtYXBwZWQ7Ci0JaW50IHF1ZXVlZDsKLQlpbnQgb2Zmc2V0OwotCWludCBidWZzaXplOwotfTsKLQotc3RydWN0IG1zbV92NGwyX292ZXJsYXlfZGV2aWNlIHsKLQlzdHJ1Y3QgZGV2aWNlIGRldjsKLQotCWludCByZWZfY291bnQ7Ci0JaW50IGlkOwotCi0JaW50IHNjcmVlbl93aWR0aDsKLQlpbnQgc2NyZWVuX2hlaWdodDsKLQlpbnQgc3RyZWFtaW5nOwotCi0Jc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBwaXg7Ci0Jc3RydWN0IHY0bDJfd2luZG93IHdpbjsKLQlzdHJ1Y3QgdjRsMl9yZWN0IGNyb3BfcmVjdDsKLQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciBmYjsKLQlzdHJ1Y3QgbXNtX3Y0bDJfb3ZlcmxheV9idWZmZXIgKmJ1ZnM7Ci0JaW50IG51bWJ1ZnM7Ci0Jc3RydWN0IG1kcF9vdmVybGF5IHJlcTsKLQl2b2lkICpwYXI7Ci0KLQlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7Ci19OwotCi1zdHJ1Y3QgbXNtX3Y0bDJfb3ZlcmxheV9maCB7Ci0Jc3RydWN0IG1zbV92NGwyX292ZXJsYXlfZGV2aWNlICp2b3V0OwotCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlOwotfTsKLQotc3RydWN0IG1zbV92NGwyX292ZXJsYXlfdXNlcnB0cl9idWZmZXIgewotCXVpbnQgZmRbM107IC8qIElPTiBmZCBvZiBmcmFtZSBvciBwbGFuZSAqLwotCXNpemVfdCBvZmZzZXRbM107IC8qIG9mZnNldCBvZiBmcmFtZSBvciBwbGFuZSBpbiBtdWx0aSBidWZmZXIgY2FzZSAqLwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtX3ZwZS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV92cGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExYzgxOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtX3ZwZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0NiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bWFjaC9jbGsuaD4KLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlICJtc20uaCIKLSNpbmNsdWRlICJtc21fdnBlLmgiCi0KLSNpZmRlZiBDT05GSUdfTVNNX0NBTUVSQV9ERUJVRwotI2RlZmluZSBEKGZtdCwgYXJncy4uLikgcHJfZGVidWcoIm1zbV92cGU6ICIgZm10LCAjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBEKGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQotc3RhdGljIGludCB2cGVfZW5hYmxlKHVpbnQzMl90LCBzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICopOwotc3RhdGljIGludCB2cGVfZGlzYWJsZShzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICopOwotc3RhdGljIGludCB2cGVfdXBkYXRlX3NjYWxlcihzdHJ1Y3QgbXNtX3BwX2Nyb3AgKnBjcm9wKTsKLXN0cnVjdCB2cGVfY3RybF90eXBlICp2cGVfY3RybDsKLXN0YXRpYyBhdG9taWNfdCB2cGVfaW5pdF9kb25lID0gQVRPTUlDX0lOSVQoMCk7Ci0KLXN0YXRpYyBpbnQgbXNtX3ZwZV9kb19wcChzdHJ1Y3QgbXNtX21jdGxfcHBfZnJhbWVfaW5mbyAqcHBfZnJhbWVfaW5mbyk7Ci0KLXN0YXRpYyBsb25nIGxvbmcgdnBlX2RvX2Rpdihsb25nIGxvbmcgbnVtLCBsb25nIGxvbmcgZGVuKQotewotCWRvX2RpdihudW0sIGRlbik7Ci0JcmV0dXJuIG51bTsKLX0KLQotc3RhdGljIGludCB2cGVfc3RhcnQodm9pZCkKLXsKLQkvKiAgZW5hYmxlIHRoZSBmcmFtZSBpcnEsIGJpdCAwID0gRGlzcGxheSBsaXN0IDAgUk9JIGRvbmUgKi8KLQltc21fY2FtZXJhX2lvX3dfbWIoMSwgdnBlX2N0cmwtPnZwZWJhc2UgKyBWUEVfSU5UUl9FTkFCTEVfT0ZGU0VUKTsKLQltc21fY2FtZXJhX2lvX2R1bXAodnBlX2N0cmwtPnZwZWJhc2UsIDB4MTIwKTsKLQltc21fY2FtZXJhX2lvX2R1bXAodnBlX2N0cmwtPnZwZWJhc2UgKyAweDAwNDAwLCAweDE4KTsKLQltc21fY2FtZXJhX2lvX2R1bXAodnBlX2N0cmwtPnZwZWJhc2UgKyAweDEwMDAwLCAweDI1MCk7Ci0JbXNtX2NhbWVyYV9pb19kdW1wKHZwZV9jdHJsLT52cGViYXNlICsgMHgzMDAwMCwgMHgyMCk7Ci0JbXNtX2NhbWVyYV9pb19kdW1wKHZwZV9jdHJsLT52cGViYXNlICsgMHg1MDAwMCwgMHgzMCk7Ci0JbXNtX2NhbWVyYV9pb19kdW1wKHZwZV9jdHJsLT52cGViYXNlICsgMHg1MDQwMCwgMHgxMCk7Ci0KLQkvKiB0aGlzIHRyaWdnZXJzIHRoZSBvcGVyYXRpb24uICovCi0JbXNtX2NhbWVyYV9pb193X21iKDEsIHZwZV9jdHJsLT52cGViYXNlICsgVlBFX0RMMF9TVEFSVF9PRkZTRVQpOwotCXJldHVybiAwOwotfQotCi12b2lkIHZwZV9yZXNldF9zdGF0ZV92YXJpYWJsZXModm9pZCkKLXsKLQkvKiBpbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlcyBmb3Igc3RhdGUgY29udHJvbCwgZXRjLiovCi0JdnBlX2N0cmwtPm9wX21vZGUgPSAwOwotCXZwZV9jdHJsLT5zdGF0ZSA9IFZQRV9TVEFURV9JTklUOwotfQotCi1zdGF0aWMgdm9pZCB2cGVfY29uZmlnX2F4aV9kZWZhdWx0KHZvaWQpCi17Ci0JbXNtX2NhbWVyYV9pb193KDB4MjUsIHZwZV9jdHJsLT52cGViYXNlICsgVlBFX0FYSV9BUkJfMl9PRkZTRVQpOwotCUQoIiVzOiB5YWRkciAlbGQgY2JjcmFkZHIgJWxkIiwgX19mdW5jX18sCi0JCSB2cGVfY3RybC0+b3V0X3lfYWRkciwgdnBlX2N0cmwtPm91dF9jYmNyX2FkZHIpOwotCWlmICghdnBlX2N0cmwtPm91dF95X2FkZHIgfHwgIXZwZV9jdHJsLT5vdXRfY2Jjcl9hZGRyKQotCQlyZXR1cm47Ci0JbXNtX2NhbWVyYV9pb193KHZwZV9jdHJsLT5vdXRfeV9hZGRyLAotCQl2cGVfY3RybC0+dnBlYmFzZSArIFZQRV9PVVRQMF9BRERSX09GRlNFVCk7Ci0JLyogZm9yIHZpZGVvICBDYkNyIGFkZHJlc3MgKi8KLQltc21fY2FtZXJhX2lvX3codnBlX2N0cmwtPm91dF9jYmNyX2FkZHIsCi0JCXZwZV9jdHJsLT52cGViYXNlICsgVlBFX09VVFAxX0FERFJfT0ZGU0VUKTsKLX0KLQotc3RhdGljIGludCB2cGVfcmVzZXQodm9pZCkKLXsKLQl1aW50MzJfdCB2cGVfdmVyc2lvbjsKLQl1aW50MzJfdCByYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdnBlX2N0cmwtPmxvY2ssIGZsYWdzKTsKLQlpZiAodnBlX2N0cmwtPnN0YXRlID09IFZQRV9TVEFURV9JRExFKSB7Ci0JCUQoIiVzOiBWUEUgYWxyZWFkeSBkaXNhYmxlZC4iLCBfX2Z1bmNfXyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwZV9jdHJsLT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiByYzsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnBlX2N0cmwtPmxvY2ssIGZsYWdzKTsKLQotCXZwZV9yZXNldF9zdGF0ZV92YXJpYWJsZXMoKTsKLQl2cGVfdmVyc2lvbiA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZwZV9jdHJsLT52cGViYXNlICsgVlBFX0hXX1ZFUlNJT05fT0ZGU0VUKTsKLQlEKCJ2cGVfdmVyc2lvbiA9IDB4JXhcbiIsIHZwZV92ZXJzaW9uKTsKLQkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzLiovCi0JbXNtX2NhbWVyYV9pb193KDAsIHZwZV9jdHJsLT52cGViYXNlICsgVlBFX0lOVFJfRU5BQkxFX09GRlNFVCk7Ci0JLyogY2xlYXIgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyovCi0JbXNtX2NhbWVyYV9pb193KDB4MWZmZmZmLCB2cGVfY3RybC0+dnBlYmFzZSArIFZQRV9JTlRSX0NMRUFSX09GRlNFVCk7Ci0JLyogd3JpdGUgc3dfcmVzZXQgdG8gcmVzZXQgdGhlIGNvcmUuICovCi0JbXNtX2NhbWVyYV9pb193KDB4MTAsIHZwZV9jdHJsLT52cGViYXNlICsgVlBFX1NXX1JFU0VUX09GRlNFVCk7Ci0JLyogdGhlbiBwb2xsIHRoZSByZXNldCBiaXQsIGl0IHNob3VsZCBiZSBzZWxmLWNsZWFyZWQuICovCi0Jd2hpbGUgKDEpIHsKLQkJcmMgPQotCQltc21fY2FtZXJhX2lvX3IodnBlX2N0cmwtPnZwZWJhc2UgKyBWUEVfU1dfUkVTRVRfT0ZGU0VUKSAmIDB4MTA7Ci0JCWlmIChyYyA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCS8qICBhdCB0aGlzIHBvaW50LCBoYXJkd2FyZSBpcyByZXNldC4gVGhlbiBwb2dyYW0gdG8gZGVmYXVsdAotCQl2YWx1ZXMuICovCi0JbXNtX2NhbWVyYV9pb193KFZQRV9BWElfUkRfQVJCX0NPTkZJR19WQUxVRSwKLQkJCXZwZV9jdHJsLT52cGViYXNlICsgVlBFX0FYSV9SRF9BUkJfQ09ORklHX09GRlNFVCk7Ci0KLQltc21fY2FtZXJhX2lvX3coVlBFX0NHQ19FTkFCTEVfVkFMVUUsCi0JCQl2cGVfY3RybC0+dnBlYmFzZSArIFZQRV9DR0NfRU5fT0ZGU0VUKTsKLQltc21fY2FtZXJhX2lvX3coMSwgdnBlX2N0cmwtPnZwZWJhc2UgKyBWUEVfQ01EX01PREVfT0ZGU0VUKTsKLQltc21fY2FtZXJhX2lvX3coVlBFX0RFRkFVTFRfT1BfTU9ERV9WQUxVRSwKLQkJCXZwZV9jdHJsLT52cGViYXNlICsgVlBFX09QX01PREVfT0ZGU0VUKTsKLQltc21fY2FtZXJhX2lvX3coVlBFX0RFRkFVTFRfU0NBTEVfQ09ORklHLAotCQkJdnBlX2N0cmwtPnZwZWJhc2UgKyBWUEVfU0NBTEVfQ09ORklHX09GRlNFVCk7Ci0JdnBlX2NvbmZpZ19heGlfZGVmYXVsdCgpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fdnBlX2NmZ191cGRhdGUodm9pZCAqcGluZm8pCi17Ci0JdWludDMyX3QgIHJvdF9mbGFnLCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9wcF9jcm9wICpwY3JvcCA9IChzdHJ1Y3QgbXNtX3BwX2Nyb3AgKilwaW5mbzsKLQotCXJvdF9mbGFnID0gbXNtX2NhbWVyYV9pb19yKHZwZV9jdHJsLT52cGViYXNlICsKLQkJCQkJCVZQRV9PUF9NT0RFX09GRlNFVCkgJiAweEUwMDsKLQlpZiAocGluZm8gIT0gTlVMTCkgewotCQlEKCIlczogQ3JvcCBpbmZvIGluMl93ID0gJWQsIGluMl9oID0gJWQgIgotCQkJIm91dDJfdyA9ICVkIG91dDJfaCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHBjcm9wLT5zcmNfdywgcGNyb3AtPnNyY19oLAotCQkJcGNyb3AtPmRzdF93LCBwY3JvcC0+ZHN0X2gpOwotCQlyYyA9IHZwZV91cGRhdGVfc2NhbGVyKHBjcm9wKTsKLQl9Ci0JRCgicmV0dXJuIHJjID0gJWQgcm90X2ZsYWcgPSAlZFxuIiwgcmMsIHJvdF9mbGFnKTsKLQlyYyB8PSByb3RfZmxhZzsKLQotCXJldHVybiByYzsKLX0KLQotdm9pZCB2cGVfdXBkYXRlX3NjYWxlX2NvZWYodWludDMyX3QgKnApCi17Ci0JdWludDMyX3QgaSwgb2Zmc2V0OwotCW9mZnNldCA9ICpwOwotCWZvciAoaSA9IG9mZnNldDsgaSA8IChWUEVfU0NBTEVfQ09FRkZfTlVNICsgb2Zmc2V0KTsgaSsrKSB7Ci0JCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksCi0JCQl2cGVfY3RybC0+dnBlYmFzZSArIFZQRV9TQ0FMRV9DT0VGRl9MU0JuKGkpKTsKLQkJbXNtX2NhbWVyYV9pb193KCooKytwKSwKLQkJCXZwZV9jdHJsLT52cGViYXNlICsgVlBFX1NDQUxFX0NPRUZGX01TQm4oaSkpOwotCX0KLX0KLQotdm9pZCB2cGVfaW5wdXRfcGxhbmVfY29uZmlnKHVpbnQzMl90ICpwKQotewotCW1zbV9jYW1lcmFfaW9fdygqcCwgdnBlX2N0cmwtPnZwZWJhc2UgKyBWUEVfU1JDX0ZPUk1BVF9PRkZTRVQpOwotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksCi0JCXZwZV9jdHJsLT52cGViYXNlICsgVlBFX1NSQ19VTlBBQ0tfUEFUVEVSTjFfT0ZGU0VUKTsKLQltc21fY2FtZXJhX2lvX3coKigrK3ApLCB2cGVfY3RybC0+dnBlYmFzZSArIFZQRV9TUkNfSU1BR0VfU0laRV9PRkZTRVQpOwotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksIHZwZV9jdHJsLT52cGViYXNlICsgVlBFX1NSQ19ZU1RSSURFMV9PRkZTRVQpOwotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksIHZwZV9jdHJsLT52cGViYXNlICsgVlBFX1NSQ19TSVpFX09GRlNFVCk7Ci0JbXNtX2NhbWVyYV9pb193KCooKytwKSwgdnBlX2N0cmwtPnZwZWJhc2UgKyBWUEVfU1JDX1hZX09GRlNFVCk7Ci19Ci0KLXZvaWQgdnBlX291dHB1dF9wbGFuZV9jb25maWcodWludDMyX3QgKnApCi17Ci0JbXNtX2NhbWVyYV9pb193KCpwLCB2cGVfY3RybC0+dnBlYmFzZSArIFZQRV9PVVRfRk9STUFUX09GRlNFVCk7Ci0JbXNtX2NhbWVyYV9pb193KCooKytwKSwKLQkJdnBlX2N0cmwtPnZwZWJhc2UgKyBWUEVfT1VUX1BBQ0tfUEFUVEVSTjFfT0ZGU0VUKTsKLQltc21fY2FtZXJhX2lvX3coKigrK3ApLCB2cGVfY3RybC0+dnBlYmFzZSArIFZQRV9PVVRfWVNUUklERTFfT0ZGU0VUKTsKLQltc21fY2FtZXJhX2lvX3coKigrK3ApLCB2cGVfY3RybC0+dnBlYmFzZSArIFZQRV9PVVRfU0laRV9PRkZTRVQpOwotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksIHZwZV9jdHJsLT52cGViYXNlICsgVlBFX09VVF9YWV9PRkZTRVQpOwotfQotCi1zdGF0aWMgaW50IHZwZV9vcGVyYXRpb25fY29uZmlnKHVpbnQzMl90ICpwKQotewotCXVpbnQzMl90IHcsIGgsIHRlbXA7Ci0JbXNtX2NhbWVyYV9pb193KCpwLCB2cGVfY3RybC0+dnBlYmFzZSArIFZQRV9PUF9NT0RFX09GRlNFVCk7Ci0KLQl0ZW1wID0gbXNtX2NhbWVyYV9pb19yKHZwZV9jdHJsLT52cGViYXNlICsgVlBFX09VVF9TSVpFX09GRlNFVCk7Ci0JdyA9IHRlbXAgJiAweEZGRjsKLQloID0gKHRlbXAgJiAweEZGRjAwMDApID4+IDE2OwotCWlmICgqcCsrICYgMHhFMDApIHsKLQkJLyogcm90YXRpb24gZW5hYmxlZC4gKi8KLQkJdnBlX2N0cmwtPm91dF93ID0gaDsKLQkJdnBlX2N0cmwtPm91dF9oID0gdzsKLQl9IGVsc2UgewotCQl2cGVfY3RybC0+b3V0X3cgPSB3OwotCQl2cGVfY3RybC0+b3V0X2ggPSBoOwotCX0KLQlEKCIlczogb3V0X3c9JWQsIG91dF9oPSVkIiwgX19mdW5jX18sIHZwZV9jdHJsLT5vdXRfdywKLQkJdnBlX2N0cmwtPm91dF9oKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogTGF0ZXIgd2UgY2FuIHNlcGFyYXRlIHRoZSByb3RhdGlvbiBhbmQgc2NhbGVyIGNhbGMuIElmCi0qICByb3RhdGlvbiBpcyBlbmFibGVkLCBzaW1wbHkgc3dhcCB0aGUgZGVzdGluYXRpb24gZGltZW5zaW9uLgotKiAgQW5kIHRoZW4gcGFzcyB0aGUgYWxyZWFkeSBzd2FwcGVkIG91dHB1dCBzaXplIHRvIHRoaXMKLSogIGZ1bmN0aW9uLiAqLwotc3RhdGljIGludCB2cGVfdXBkYXRlX3NjYWxlcihzdHJ1Y3QgbXNtX3BwX2Nyb3AgKnBjcm9wKQotewotCXVpbnQzMl90IG91dF9ST0lfd2lkdGgsIG91dF9ST0lfaGVpZ2h0OwotCXVpbnQzMl90IHNyY19ST0lfd2lkdGgsIHNyY19ST0lfaGVpZ2h0OwotCi0JLyoKLQkqIHBoYXNlX3N0ZXBfeCwgcGhhc2Vfc3RlcF95LCBwaGFzZV9pbml0X3ggYW5kIHBoYXNlX2luaXRfeQotCSogYXJlIHJlcHJlc2VudGVkIGluIGZpeGVkLXBvaW50LCB1bnNpZ25lZCAzLjI5IGZvcm1hdAotCSovCi0JdWludDMyX3QgcGhhc2Vfc3RlcF94ID0gMDsKLQl1aW50MzJfdCBwaGFzZV9zdGVwX3kgPSAwOwotCXVpbnQzMl90IHBoYXNlX2luaXRfeCA9IDA7Ci0JdWludDMyX3QgcGhhc2VfaW5pdF95ID0gMDsKLQotCXVpbnQzMl90IHNyY19yb2ksIHNyY194LCBzcmNfeSwgc3JjX3h5LCB0ZW1wOwotCXVpbnQzMl90IHlzY2FsZV9maWx0ZXJfc2VsLCB4c2NhbGVfZmlsdGVyX3NlbDsKLQl1aW50MzJfdCBzY2FsZV91bml0X3NlbF94LCBzY2FsZV91bml0X3NlbF95OwotCXVpbnQ2NF90IG51bWVyYXRvciwgZGVub21pbmF0b3I7Ci0KLQkvKiBhc3N1bXB0aW9uIGlzIGJvdGggZGlyZWN0aW9uIG5lZWQgem9vbS4gdGhpcyBjYW4gYmUKLQlpbXByb3ZlZC4gKi8KLQl0ZW1wID0KLQkJbXNtX2NhbWVyYV9pb19yKHZwZV9jdHJsLT52cGViYXNlICsgVlBFX09QX01PREVfT0ZGU0VUKSB8IDB4MzsKLQltc21fY2FtZXJhX2lvX3codGVtcCwgdnBlX2N0cmwtPnZwZWJhc2UgKyBWUEVfT1BfTU9ERV9PRkZTRVQpOwotCi0Jc3JjX1JPSV93aWR0aCA9IHBjcm9wLT5zcmNfdzsKLQlzcmNfUk9JX2hlaWdodCA9IHBjcm9wLT5zcmNfaDsKLQlvdXRfUk9JX3dpZHRoID0gcGNyb3AtPmRzdF93OwotCW91dF9ST0lfaGVpZ2h0ID0gcGNyb3AtPmRzdF9oOwotCi0JRCgic3JjIHcgPSAweCV4LCBoPTB4JXgsIGRzdCB3ID0gMHgleCwgaCA9MHgleC5cbiIsCi0JCXNyY19ST0lfd2lkdGgsIHNyY19ST0lfaGVpZ2h0LCBvdXRfUk9JX3dpZHRoLAotCQlvdXRfUk9JX2hlaWdodCk7Ci0Jc3JjX3JvaSA9IChzcmNfUk9JX2hlaWdodCA8PCAxNikgKyBzcmNfUk9JX3dpZHRoOwotCi0JbXNtX2NhbWVyYV9pb193KHNyY19yb2ksIHZwZV9jdHJsLT52cGViYXNlICsgVlBFX1NSQ19TSVpFX09GRlNFVCk7Ci0KLQlzcmNfeCA9IHBjcm9wLT5zcmNfeDsKLQlzcmNfeSA9IHBjcm9wLT5zcmNfeTsKLQotCUQoInNyY194ID0gJWQsIHNyY195PSVkLlxuIiwgc3JjX3gsIHNyY195KTsKLQotCXNyY194eSA9IHNyY195KigxPDwxNikgKyBzcmNfeDsKLQltc21fY2FtZXJhX2lvX3coc3JjX3h5LCB2cGVfY3RybC0+dnBlYmFzZSArCi0JCQlWUEVfU1JDX1hZX09GRlNFVCk7Ci0JRCgic3JjX3h5ID0gJWQsIHNyY19yb2k9JWQuXG4iLCBzcmNfeHksIHNyY19yb2kpOwotCi0JLyogZGVjaWRlIHdoZXRoZXIgdG8gdXNlIEZJUiBvciBNL04gZm9yIHNjYWxpbmcgKi8KLQlpZiAoKG91dF9ST0lfd2lkdGggPT0gMSAmJiBzcmNfUk9JX3dpZHRoIDwgNCkgfHwKLQkJKHNyY19ST0lfd2lkdGggPCA0ICogb3V0X1JPSV93aWR0aCAtIDMpKQotCQlzY2FsZV91bml0X3NlbF94ID0gMDsvKiB1c2UgRklSIHNjYWxhciAqLwotCWVsc2UKLQkJc2NhbGVfdW5pdF9zZWxfeCA9IDE7LyogdXNlIE0vTiBzY2FsYXIgKi8KLQotCWlmICgob3V0X1JPSV9oZWlnaHQgPT0gMSAmJiBzcmNfUk9JX2hlaWdodCA8IDQpIHx8Ci0JCShzcmNfUk9JX2hlaWdodCA8IDQgKiBvdXRfUk9JX2hlaWdodCAtIDMpKQotCQlzY2FsZV91bml0X3NlbF95ID0gMDsvKiB1c2UgRklSIHNjYWxhciAqLwotCWVsc2UKLQkJc2NhbGVfdW5pdF9zZWxfeSA9IDE7LyogdXNlIE0vTiBzY2FsYXIgKi8KLQotCS8qIGNhbGN1bGF0ZSBwaGFzZSBzdGVwIGZvciB0aGUgeCBkaXJlY3Rpb24gKi8KLQotCS8qIGlmIGRlc3RpbmF0aW9uIGlzIG9ubHkgMSBwaXhlbCB3aWRlLAotCXRoZSB2YWx1ZSBvZiBwaGFzZV9zdGVwX3gKLQlpcyB1bmltcG9ydGFudC4gQXNzaWduaW5nIHBoYXNlX3N0ZXBfeCB0bwotCXNyYyBST0kgd2lkdGggYXMgYW4gYXJiaXRyYXJ5IHZhbHVlLiAqLwotCWlmIChvdXRfUk9JX3dpZHRoID09IDEpCi0JCXBoYXNlX3N0ZXBfeCA9ICh1aW50MzJfdCkgKChzcmNfUk9JX3dpZHRoKSA8PAotCQkJCQkJU0NBTEVSX1BIQVNFX0JJVFMpOwotCi0JCS8qIGlmIHVzaW5nIEZJUiBzY2FsYXIgKi8KLQllbHNlIGlmIChzY2FsZV91bml0X3NlbF94ID09IDApIHsKLQotCQkvKiBDYWxjdWxhdGUgdGhlIHF1b3RpZW50ICggc3JjX1JPSV93aWR0aCAtIDEgKQotCQkJKCBvdXRfUk9JX3dpZHRoIC0gMSkKLQkJCXdpdGggdTMuMjkgcHJlY2lzaW9uLiBRdW90aWVudCBpcyByb3VuZGVkIHVwIHRvCi0JCQl0aGUgbGFyZ2VyIDI5dGggZGVjaW1hbCBwb2ludCovCi0JCW51bWVyYXRvciA9ICh1aW50NjRfdCkoc3JjX1JPSV93aWR0aCAtIDEpIDw8Ci0JCQlTQ0FMRVJfUEhBU0VfQklUUzsKLQkJLyogbmV2ZXIgZXF1YWxzIHRvIDAgYmVjYXVzZSBvZiB0aGUKLQkJCSIob3V0X1JPSV93aWR0aCA9PSAxICkiKi8KLQkJZGVub21pbmF0b3IgPSAodWludDY0X3QpKG91dF9ST0lfd2lkdGggLSAxKTsKLQkJLyogZGl2aWRlIGFuZCByb3VuZCB1cCB0byB0aGUgbGFyZ2VyIDI5dGgKLQkJCWRlY2ltYWwgcG9pbnQuKi8KLQkJcGhhc2Vfc3RlcF94ID0gKHVpbnQzMl90KSB2cGVfZG9fZGl2KChudW1lcmF0b3IgKwotCQkJCQlkZW5vbWluYXRvciAtIDEpLCBkZW5vbWluYXRvcik7Ci0JfSBlbHNlIGlmIChzY2FsZV91bml0X3NlbF94ID09IDEpIHsgLyogaWYgTS9OIHNjYWxhciAqLwotCQkvKiBDYWxjdWxhdGUgdGhlIHF1b3RpZW50ICggc3JjX1JPSV93aWR0aCApIC8KLQkJCSggb3V0X1JPSV93aWR0aCkKLQkJCXdpdGggdTMuMjkgcHJlY2lzaW9uLiBRdW90aWVudCBpcyByb3VuZGVkIGRvd24gdG8gdGhlCi0JCQlzbWFsbGVyIDI5dGggZGVjaW1hbCBwb2ludC4qLwotCQludW1lcmF0b3IgPSAodWludDY0X3QpKHNyY19ST0lfd2lkdGgpIDw8Ci0JCQlTQ0FMRVJfUEhBU0VfQklUUzsKLQkJZGVub21pbmF0b3IgPSAodWludDY0X3QpKG91dF9ST0lfd2lkdGgpOwotCQlwaGFzZV9zdGVwX3ggPQotCQkJKHVpbnQzMl90KSB2cGVfZG9fZGl2KG51bWVyYXRvciwgZGVub21pbmF0b3IpOwotCX0KLQkvKiBjYWxjdWxhdGUgcGhhc2Ugc3RlcCBmb3IgdGhlIHkgZGlyZWN0aW9uICovCi0KLQkvKiBpZiBkZXN0aW5hdGlvbiBpcyBvbmx5IDEgcGl4ZWwgd2lkZSwgdGhlIHZhbHVlIG9mCi0JCXBoYXNlX3N0ZXBfeCBpcyB1bmltcG9ydGFudC4gQXNzaWduaW5nIHBoYXNlX3N0ZXBfeAotCQl0byBzcmMgUk9JIHdpZHRoIGFzIGFuIGFyYml0cmFyeSB2YWx1ZS4gKi8KLQlpZiAob3V0X1JPSV9oZWlnaHQgPT0gMSkKLQkJcGhhc2Vfc3RlcF95ID0KLQkJKHVpbnQzMl90KSAoKHNyY19ST0lfaGVpZ2h0KSA8PCBTQ0FMRVJfUEhBU0VfQklUUyk7Ci0KLQkvKiBpZiBGSVIgc2NhbGFyICovCi0JZWxzZSBpZiAoc2NhbGVfdW5pdF9zZWxfeSA9PSAwKSB7Ci0JCS8qIENhbGN1bGF0ZSB0aGUgcXVvdGllbnQgKCBzcmNfUk9JX2hlaWdodCAtIDEgKSAvCi0JCSggb3V0X1JPSV9oZWlnaHQgLSAxKQotCQl3aXRoIHUzLjI5IHByZWNpc2lvbi4gUXVvdGllbnQgaXMgcm91bmRlZCB1cCB0byB0aGUKLQkJbGFyZ2VyIDI5dGggZGVjaW1hbCBwb2ludC4gKi8KLQkJbnVtZXJhdG9yID0gKHVpbnQ2NF90KShzcmNfUk9JX2hlaWdodCAtIDEpIDw8Ci0JCQlTQ0FMRVJfUEhBU0VfQklUUzsKLQkJLyogbmV2ZXIgZXF1YWxzIHRvIDAgYmVjYXVzZSBvZiB0aGUgIgotCQkoIG91dF9ST0lfaGVpZ2h0ID09IDEgKSIgY2FzZSAqLwotCQlkZW5vbWluYXRvciA9ICh1aW50NjRfdCkob3V0X1JPSV9oZWlnaHQgLSAxKTsKLQkJLyogUXVvdGllbnQgaXMgcm91bmRlZCB1cCB0byB0aGUgbGFyZ2VyCi0JCTI5dGggZGVjaW1hbCBwb2ludC4gKi8KLQkJcGhhc2Vfc3RlcF95ID0KLQkJKHVpbnQzMl90KSB2cGVfZG9fZGl2KAotCQkJKG51bWVyYXRvciArIGRlbm9taW5hdG9yIC0gMSksIGRlbm9taW5hdG9yKTsKLQl9IGVsc2UgaWYgKHNjYWxlX3VuaXRfc2VsX3kgPT0gMSkgeyAvKiBpZiBNL04gc2NhbGFyICovCi0JCS8qIENhbGN1bGF0ZSB0aGUgcXVvdGllbnQgKCBzcmNfUk9JX2hlaWdodCApCi0JCQkoIG91dF9ST0lfaGVpZ2h0KQotCQkJd2l0aCB1My4yOSBwcmVjaXNpb24uIFF1b3RpZW50IGlzIHJvdW5kZWQgZG93bgotCQkJdG8gdGhlIHNtYWxsZXIgMjl0aCBkZWNpbWFsIHBvaW50LiAqLwotCQludW1lcmF0b3IgPSAodWludDY0X3QpKHNyY19ST0lfaGVpZ2h0KSA8PAotCQkJU0NBTEVSX1BIQVNFX0JJVFM7Ci0JCWRlbm9taW5hdG9yID0gKHVpbnQ2NF90KShvdXRfUk9JX2hlaWdodCk7Ci0JCXBoYXNlX3N0ZXBfeSA9ICh1aW50MzJfdCkgdnBlX2RvX2RpdigKLQkJCW51bWVyYXRvciwgZGVub21pbmF0b3IpOwotCX0KLQotCS8qIGRlY2lkZSB3aGljaCBzZXQgb2YgRklSIGNvZWZmaWNpZW50cyB0byB1c2UgKi8KLQlpZiAocGhhc2Vfc3RlcF94ID4gSEFMX01EUF9QSEFTRV9TVEVQXzJQNTApCi0JCXhzY2FsZV9maWx0ZXJfc2VsID0gMDsKLQllbHNlIGlmIChwaGFzZV9zdGVwX3ggPiBIQUxfTURQX1BIQVNFX1NURVBfMVA2NikKLQkJeHNjYWxlX2ZpbHRlcl9zZWwgPSAxOwotCWVsc2UgaWYgKHBoYXNlX3N0ZXBfeCA+IEhBTF9NRFBfUEhBU0VfU1RFUF8xUDI1KQotCQl4c2NhbGVfZmlsdGVyX3NlbCA9IDI7Ci0JZWxzZQotCQl4c2NhbGVfZmlsdGVyX3NlbCA9IDM7Ci0KLQlpZiAocGhhc2Vfc3RlcF95ID4gSEFMX01EUF9QSEFTRV9TVEVQXzJQNTApCi0JCXlzY2FsZV9maWx0ZXJfc2VsID0gMDsKLQllbHNlIGlmIChwaGFzZV9zdGVwX3kgPiBIQUxfTURQX1BIQVNFX1NURVBfMVA2NikKLQkJeXNjYWxlX2ZpbHRlcl9zZWwgPSAxOwotCWVsc2UgaWYgKHBoYXNlX3N0ZXBfeSA+IEhBTF9NRFBfUEhBU0VfU1RFUF8xUDI1KQotCQl5c2NhbGVfZmlsdGVyX3NlbCA9IDI7Ci0JZWxzZQotCQl5c2NhbGVfZmlsdGVyX3NlbCA9IDM7Ci0KLQkvKiBjYWxjdWxhdGUgcGhhc2UgaW5pdCBmb3IgdGhlIHggZGlyZWN0aW9uICovCi0KLQkvKiBpZiB1c2luZyBGSVIgc2NhbGFyICovCi0JaWYgKHNjYWxlX3VuaXRfc2VsX3ggPT0gMCkgewotCQlpZiAob3V0X1JPSV93aWR0aCA9PSAxKQotCQkJcGhhc2VfaW5pdF94ID0KLQkJCQkodWludDMyX3QpICgoc3JjX1JPSV93aWR0aCAtIDEpIDw8Ci0JCQkJCQkJU0NBTEVSX1BIQVNFX0JJVFMpOwotCQllbHNlCi0JCQlwaGFzZV9pbml0X3ggPSAwOwotCX0gZWxzZSBpZiAoc2NhbGVfdW5pdF9zZWxfeCA9PSAxKSAvKiBNIG92ZXIgTiBzY2FsYXIgICovCi0JCXBoYXNlX2luaXRfeCA9IDA7Ci0KLQkvKiBjYWxjdWxhdGUgcGhhc2UgaW5pdCBmb3IgdGhlIHkgZGlyZWN0aW9uCi0JaWYgdXNpbmcgRklSIHNjYWxhciAqLwotCWlmIChzY2FsZV91bml0X3NlbF95ID09IDApIHsKLQkJaWYgKG91dF9ST0lfaGVpZ2h0ID09IDEpCi0JCQlwaGFzZV9pbml0X3kgPQotCQkJKHVpbnQzMl90KSAoKHNyY19ST0lfaGVpZ2h0IC0KLQkJCQkJCTEpIDw8IFNDQUxFUl9QSEFTRV9CSVRTKTsKLQkJZWxzZQotCQkJcGhhc2VfaW5pdF95ID0gMDsKLQl9IGVsc2UgaWYgKHNjYWxlX3VuaXRfc2VsX3kgPT0gMSkgLyogTSBvdmVyIE4gc2NhbGFyICAgKi8KLQkJcGhhc2VfaW5pdF95ID0gMDsKLQotCUQoInBoYXNlIHN0ZXAgeCA9ICVkLCBzdGVwIHkgPSAlZC5cbiIsCi0JCSBwaGFzZV9zdGVwX3gsIHBoYXNlX3N0ZXBfeSk7Ci0JRCgicGhhc2UgaW5pdCB4ID0gJWQsIGluaXQgeSA9ICVkLlxuIiwKLQkJIHBoYXNlX2luaXRfeCwgcGhhc2VfaW5pdF95KTsKLQotCW1zbV9jYW1lcmFfaW9fdyhwaGFzZV9zdGVwX3gsIHZwZV9jdHJsLT52cGViYXNlICsKLQkJCVZQRV9TQ0FMRV9QSEFTRVhfU1RFUF9PRkZTRVQpOwotCW1zbV9jYW1lcmFfaW9fdyhwaGFzZV9zdGVwX3ksIHZwZV9jdHJsLT52cGViYXNlICsKLQkJCVZQRV9TQ0FMRV9QSEFTRVlfU1RFUF9PRkZTRVQpOwotCi0JbXNtX2NhbWVyYV9pb193KHBoYXNlX2luaXRfeCwgdnBlX2N0cmwtPnZwZWJhc2UgKwotCQkJVlBFX1NDQUxFX1BIQVNFWF9JTklUX09GRlNFVCk7Ci0KLQltc21fY2FtZXJhX2lvX3cocGhhc2VfaW5pdF95LCB2cGVfY3RybC0+dnBlYmFzZSArCi0JCQlWUEVfU0NBTEVfUEhBU0VZX0lOSVRfT0ZGU0VUKTsKLQotCXJldHVybiAxOwotfQotCi1pbnQgbXNtX3ZwZV9pc19idXN5KHZvaWQpCi17Ci0JaW50IGJ1c3kgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZwZV9jdHJsLT5sb2NrLCBmbGFncyk7Ci0JaWYgKHZwZV9jdHJsLT5zdGF0ZSA9PSBWUEVfU1RBVEVfQUNUSVZFKQotCQlidXN5ID0gMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cGVfY3RybC0+bG9jaywgZmxhZ3MpOwotCXJldHVybiBidXN5OwotfQotCi1zdGF0aWMgaW50IG1zbV9zZW5kX2ZyYW1lX3RvX3ZwZSh2b2lkKQotewotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIHNyY1AwLCBzcmNQMSwgb3V0UDAsIG91dFAxOwotCXN0cnVjdCBtc21fbWN0bF9wcF9mcmFtZV9pbmZvICpmcmFtZV9pbmZvID0gdnBlX2N0cmwtPnBwX2ZyYW1lX2luZm87Ci0KLQlpZiAoIWZyYW1lX2luZm8pIHsKLQkJcHJfZXJyKCIlcyBJbnZhbGlkIGZyYW1lIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdnBlX2N0cmwtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChmcmFtZV9pbmZvLT5zcmNfZnJhbWUuZnJhbWUubnVtX3BsYW5lcyA+IDEpIHsKLQkJc3JjUDAgPSBmcmFtZV9pbmZvLT5zcmNfZnJhbWUubWFwWzBdLnBhZGRyICsKLQkJCWZyYW1lX2luZm8tPnNyY19mcmFtZS5tYXBbMF0uZGF0YV9vZmZzZXQ7Ci0JCXNyY1AxID0gZnJhbWVfaW5mby0+c3JjX2ZyYW1lLm1hcFsxXS5wYWRkciArCi0JCQlmcmFtZV9pbmZvLT5zcmNfZnJhbWUubWFwWzFdLmRhdGFfb2Zmc2V0OwotCQlvdXRQMCA9IGZyYW1lX2luZm8tPmRlc3RfZnJhbWUubWFwWzBdLnBhZGRyICsKLQkJCWZyYW1lX2luZm8tPmRlc3RfZnJhbWUubWFwWzBdLmRhdGFfb2Zmc2V0OwotCQlvdXRQMSA9IGZyYW1lX2luZm8tPmRlc3RfZnJhbWUubWFwWzFdLnBhZGRyICsKLQkJCWZyYW1lX2luZm8tPmRlc3RfZnJhbWUubWFwWzFdLmRhdGFfb2Zmc2V0OwotCX0gZWxzZSB7Ci0JCXNyY1AwID0gZnJhbWVfaW5mby0+c3JjX2ZyYW1lLm1hcFswXS5wYWRkcjsKLQkJc3JjUDEgPSBmcmFtZV9pbmZvLT5zcmNfZnJhbWUubWFwWzBdLnBhZGRyICsKLQkJCWZyYW1lX2luZm8tPnNyY19mcmFtZS5tYXBbMF0uZGF0YV9vZmZzZXQ7Ci0JCW91dFAwID0gZnJhbWVfaW5mby0+ZGVzdF9mcmFtZS5tYXBbMF0ucGFkZHI7Ci0JCW91dFAxID0gZnJhbWVfaW5mby0+ZGVzdF9mcmFtZS5tYXBbMF0ucGFkZHIgKwotCQkJZnJhbWVfaW5mby0+ZGVzdF9mcmFtZS5tYXBbMF0uZGF0YV9vZmZzZXQ7Ci0JfQotCi0JRCgiJXMgVlBFIENvbmZpZ3VyZWQgd2l0aCBTcmMgJXgsICV4IERlc3QgJXgsICV4IiwKLQkJX19mdW5jX18sICh1aW50MzJfdClzcmNQMCwgKHVpbnQzMl90KXNyY1AxLAotCQkodWludDMyX3Qpb3V0UDAsICh1aW50MzJfdClvdXRQMSk7Ci0KLQltc21fY2FtZXJhX2lvX3coc3JjUDAsIHZwZV9jdHJsLT52cGViYXNlICsgVlBFX1NSQ1AwX0FERFJfT0ZGU0VUKTsKLQltc21fY2FtZXJhX2lvX3coc3JjUDEsIHZwZV9jdHJsLT52cGViYXNlICsgVlBFX1NSQ1AxX0FERFJfT0ZGU0VUKTsKLQltc21fY2FtZXJhX2lvX3cob3V0UDAsIHZwZV9jdHJsLT52cGViYXNlICsgVlBFX09VVFAwX0FERFJfT0ZGU0VUKTsKLQltc21fY2FtZXJhX2lvX3cob3V0UDEsIHZwZV9jdHJsLT52cGViYXNlICsgVlBFX09VVFAxX0FERFJfT0ZGU0VUKTsKLQotCXZwZV9jdHJsLT5zdGF0ZSA9IFZQRV9TVEFURV9BQ1RJVkU7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnBlX2N0cmwtPmxvY2ssIGZsYWdzKTsKLQl2cGVfc3RhcnQoKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIHZwZV9zZW5kX291dG1zZyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHY0bDJfZXZlbnQgdjRsMl9ldnQ7Ci0Jc3RydWN0IG1zbV9xdWV1ZV9jbWQgKmV2ZW50X3FjbWQ7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZwZV9jdHJsLT5sb2NrLCBmbGFncyk7Ci0JaWYgKHZwZV9jdHJsLT5zdGF0ZSA9PSBWUEVfU1RBVEVfSURMRSkgewotCQlwcl9lcnIoIiVzIFZQRSBpcyBpbiBJRExFIHN0YXRlLiBJZ25vcmUgdGhlIGFjayBtc2ciLCBfX2Z1bmNfXyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwZV9jdHJsLT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0JZXZlbnRfcWNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fcXVldWVfY21kKSwgR0ZQX0FUT01JQyk7Ci0JYXRvbWljX3NldCgmZXZlbnRfcWNtZC0+b25faGVhcCwgMSk7Ci0JZXZlbnRfcWNtZC0+Y29tbWFuZCA9ICh2b2lkICopdnBlX2N0cmwtPnBwX2ZyYW1lX2luZm87Ci0JdnBlX2N0cmwtPnBwX2ZyYW1lX2luZm8gPSBOVUxMOwotCXZwZV9jdHJsLT5zdGF0ZSA9IFZQRV9TVEFURV9JTklUOyAgIC8qIHB1dCBpdCBiYWNrIHRvIGlkbGUuICovCi0KLQkvKiBFbnF1ZXVlIHRoZSBldmVudCBwYXlsb2FkLiAqLwotCW1zbV9lbnF1ZXVlKCZ2cGVfY3RybC0+ZXZlbnREYXRhX3EsICZldmVudF9xY21kLT5saXN0X2V2ZW50ZGF0YSk7Ci0JLyogTm93IHF1ZXVlIHRoZSBldmVudC4gKi8KLQl2NGwyX2V2dC50eXBlID0gVjRMMl9FVkVOVF9QUklWQVRFX1NUQVJUICsgTVNNX0NBTV9SRVNQX01DVExfUFBfRVZFTlQ7Ci0JdjRsMl9ldnQuaWQgPSAwOwotCXY0bDJfZXZlbnRfcXVldWUodnBlX2N0cmwtPnN1YmRldi5kZXZub2RlLCAmdjRsMl9ldnQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwZV9jdHJsLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZwZV9kb190YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlEKCIlczogaXJxX3N0YXR1cyA9IDB4JXgiLAotCQkgICBfX2Z1bmNfXywgdnBlX2N0cmwtPmlycV9zdGF0dXMpOwotCWlmICh2cGVfY3RybC0+aXJxX3N0YXR1cyAmIDB4MSkKLQkJdnBlX3NlbmRfb3V0bXNnKCk7Ci0KLX0KLURFQ0xBUkVfVEFTS0xFVCh2cGVfdGFza2xldCwgdnBlX2RvX3Rhc2tsZXQsIDApOwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgdnBlX3BhcnNlX2lycShpbnQgaXJxX251bSwgdm9pZCAqZGF0YSkKLXsKLQl2cGVfY3RybC0+aXJxX3N0YXR1cyA9IG1zbV9jYW1lcmFfaW9fcl9tYih2cGVfY3RybC0+dnBlYmFzZSArCi0JCQkJCQkJVlBFX0lOVFJfU1RBVFVTX09GRlNFVCk7Ci0JbXNtX2NhbWVyYV9pb193X21iKHZwZV9jdHJsLT5pcnFfc3RhdHVzLCB2cGVfY3RybC0+dnBlYmFzZSArCi0JCQkJVlBFX0lOVFJfQ0xFQVJfT0ZGU0VUKTsKLQltc21fY2FtZXJhX2lvX3coMCwgdnBlX2N0cmwtPnZwZWJhc2UgKyBWUEVfSU5UUl9FTkFCTEVfT0ZGU0VUKTsKLQlEKCIlczogdnBlX3BhcnNlX2lycSA9MHgleC5cbiIsIF9fZnVuY19fLCB2cGVfY3RybC0+aXJxX3N0YXR1cyk7Ci0JdGFza2xldF9zY2hlZHVsZSgmdnBlX3Rhc2tsZXQpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHN0cnVjdCBtc21fY2FtX2Nsa19pbmZvIHZwZV9jbGtfaW5mb1tdID0gewotCXsidnBlX2NsayIsIDE2MDAwMDAwMH0sCi0JeyJ2cGVfcGNsayIsIC0xfSwKLX07Ci0KLWludCB2cGVfZW5hYmxlKHVpbnQzMl90IGNsa19yYXRlLCBzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICptY3RsKQotewotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0JRCgiJXMiLCBfX2Z1bmNfXyk7Ci0JLyogZG9uJ3QgY2hhbmdlIHRoZSBvcmRlciBvZiBjbG9jayBhbmQgaXJxLiovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZwZV9jdHJsLT5sb2NrLCBmbGFncyk7Ci0JaWYgKHZwZV9jdHJsLT5zdGF0ZSAhPSBWUEVfU1RBVEVfSURMRSkgewotCQlwcl9lcnIoIiVzOiBWUEUgYWxyZWFkeSBlbmFibGVkIiwgX19mdW5jX18pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cGVfY3RybC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0JdnBlX2N0cmwtPnN0YXRlID0gVlBFX1NUQVRFX0lOSVQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnBlX2N0cmwtPmxvY2ssIGZsYWdzKTsKLQllbmFibGVfaXJxKHZwZV9jdHJsLT52cGVpcnEtPnN0YXJ0KTsKLQotCWlmICh2cGVfY3RybC0+ZnNfdnBlKSB7Ci0JCXJjID0gcmVndWxhdG9yX2VuYWJsZSh2cGVfY3RybC0+ZnNfdnBlKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcl9lcnIoIiVzOiBSZWd1bGF0b3IgZW5hYmxlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJZ290byB2cGVfZnNfZmFpbGVkOwotCQl9Ci0JfQotCi0JcmMgPSBtc21fY2FtX2Nsa19lbmFibGUoJnZwZV9jdHJsLT5wZGV2LT5kZXYsIHZwZV9jbGtfaW5mbywKLQkJCXZwZV9jdHJsLT52cGVfY2xrLCBBUlJBWV9TSVpFKHZwZV9jbGtfaW5mbyksIDEpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gdnBlX2Nsa19mYWlsZWQ7Ci0KLSNpZmRlZiBDT05GSUdfTVNNX0lPTU1VCi0JcmMgPSBpb21tdV9hdHRhY2hfZGV2aWNlKG1jdGwtPmRvbWFpbiwgdnBlX2N0cmwtPmlvbW11X2N0eF9zcmMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogRGV2aWNlIGF0dGFjaCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBzcmNfYXR0YWNoX2ZhaWxlZDsKLQl9Ci0JcmMgPSBpb21tdV9hdHRhY2hfZGV2aWNlKG1jdGwtPmRvbWFpbiwgdnBlX2N0cmwtPmlvbW11X2N0eF9kc3QpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogRGV2aWNlIGF0dGFjaCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBkc3RfYXR0YWNoX2ZhaWxlZDsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gcmM7Ci0KLSNpZmRlZiBDT05GSUdfTVNNX0lPTU1VCi1kc3RfYXR0YWNoX2ZhaWxlZDoKLQlpb21tdV9kZXRhY2hfZGV2aWNlKG1jdGwtPmRvbWFpbiwgdnBlX2N0cmwtPmlvbW11X2N0eF9zcmMpOwotc3JjX2F0dGFjaF9mYWlsZWQ6Ci0jZW5kaWYKLQltc21fY2FtX2Nsa19lbmFibGUoJnZwZV9jdHJsLT5wZGV2LT5kZXYsIHZwZV9jbGtfaW5mbywKLQkJdnBlX2N0cmwtPnZwZV9jbGssIEFSUkFZX1NJWkUodnBlX2Nsa19pbmZvKSwgMCk7Ci12cGVfY2xrX2ZhaWxlZDoKLQlpZiAodnBlX2N0cmwtPmZzX3ZwZSkKLQkJcmVndWxhdG9yX2Rpc2FibGUodnBlX2N0cmwtPmZzX3ZwZSk7Ci12cGVfZnNfZmFpbGVkOgotCWRpc2FibGVfaXJxKHZwZV9jdHJsLT52cGVpcnEtPnN0YXJ0KTsKLQl2cGVfY3RybC0+c3RhdGUgPSBWUEVfU1RBVEVfSURMRTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCB2cGVfZGlzYWJsZShzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICptY3RsKQotewotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0JRCgiJXMiLCBfX2Z1bmNfXyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZwZV9jdHJsLT5sb2NrLCBmbGFncyk7Ci0JaWYgKHZwZV9jdHJsLT5zdGF0ZSA9PSBWUEVfU1RBVEVfSURMRSkgewotCQlEKCIlczogVlBFIGFscmVhZHkgZGlzYWJsZWQiLCBfX2Z1bmNfXyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwZV9jdHJsLT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiByYzsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnBlX2N0cmwtPmxvY2ssIGZsYWdzKTsKLSNpZmRlZiBDT05GSUdfTVNNX0lPTU1VCi0JaW9tbXVfZGV0YWNoX2RldmljZShtY3RsLT5kb21haW4sIHZwZV9jdHJsLT5pb21tdV9jdHhfZHN0KTsKLQlpb21tdV9kZXRhY2hfZGV2aWNlKG1jdGwtPmRvbWFpbiwgdnBlX2N0cmwtPmlvbW11X2N0eF9zcmMpOwotI2VuZGlmCi0JZGlzYWJsZV9pcnEodnBlX2N0cmwtPnZwZWlycS0+c3RhcnQpOwotCXRhc2tsZXRfa2lsbCgmdnBlX3Rhc2tsZXQpOwotCW1zbV9jYW1fY2xrX2VuYWJsZSgmdnBlX2N0cmwtPnBkZXYtPmRldiwgdnBlX2Nsa19pbmZvLAotCQkJdnBlX2N0cmwtPnZwZV9jbGssIEFSUkFZX1NJWkUodnBlX2Nsa19pbmZvKSwgMCk7Ci0KLQlyZWd1bGF0b3JfZGlzYWJsZSh2cGVfY3RybC0+ZnNfdnBlKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdnBlX2N0cmwtPmxvY2ssIGZsYWdzKTsKLQl2cGVfY3RybC0+c3RhdGUgPSBWUEVfU1RBVEVfSURMRTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cGVfY3RybC0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fdnBlX2RvX3BwKHN0cnVjdCBtc21fbWN0bF9wcF9mcmFtZV9pbmZvICpwcF9mcmFtZV9pbmZvKQotewotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ2cGVfY3RybC0+bG9jaywgZmxhZ3MpOwotCWlmICh2cGVfY3RybC0+c3RhdGUgPT0gVlBFX1NUQVRFX0FDVElWRSB8fAotCQkgdnBlX2N0cmwtPnN0YXRlID09IFZQRV9TVEFURV9JRExFKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwZV9jdHJsLT5sb2NrLCBmbGFncyk7Ci0JCXByX2VycigiID09PT09VlBFIGluIHdyb25nIHN0YXRlOiVkISEhICBXcm9uZyE9PT09PT09PVxuIiwKLQkJdnBlX2N0cmwtPnN0YXRlKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnBlX2N0cmwtPmxvY2ssIGZsYWdzKTsKLQl2cGVfY3RybC0+cHBfZnJhbWVfaW5mbyA9IHBwX2ZyYW1lX2luZm87Ci0JbXNtX3ZwZV9jZmdfdXBkYXRlKAotCQkmdnBlX2N0cmwtPnBwX2ZyYW1lX2luZm8tPnBwX2ZyYW1lX2NtZC5jcm9wKTsKLQlEKCIlcyBTZW5kaW5nIGZyYW1lIGlkeCAlZCBpZCAlZCB0byBWUEUgIiwgX19mdW5jX18sCi0JCXBwX2ZyYW1lX2luZm8tPnNyY19mcmFtZS5mcmFtZS5idWZfaWR4LAotCQlwcF9mcmFtZV9pbmZvLT5zcmNfZnJhbWUuZnJhbWUuZnJhbWVfaWQpOwotCXJjID0gbXNtX3NlbmRfZnJhbWVfdG9fdnBlKCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV92cGVfcmVzb3VyY2VfaW5pdCh2b2lkKTsKLQotaW50IG1zbV92cGVfc3ViZGV2X2luaXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKm1jdGw7Ci0JbWN0bCA9IHY0bDJfZ2V0X3N1YmRldl9ob3N0ZGF0YShzZCk7Ci0JRCgiJXM6YmVnaW4iLCBfX2Z1bmNfXyk7Ci0JaWYgKGF0b21pY19yZWFkKCZ2cGVfaW5pdF9kb25lKSkgewotCQlwcl9lcnIoIiVzOiBWUEUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCWF0b21pY19zZXQoJnZwZV9pbml0X2RvbmUsIDEpOwotCi0JcmMgPSBtc21fdnBlX3Jlc291cmNlX2luaXQoKTsKLQlpZiAocmMgPCAwKSB7Ci0JCWF0b21pY19zZXQoJnZwZV9pbml0X2RvbmUsIDApOwotCQlyZXR1cm4gcmM7Ci0JfQotCXNwaW5fbG9ja19pbml0KCZ2cGVfY3RybC0+bG9jayk7Ci0JRCgiJXM6ZW5kIiwgX19mdW5jX18pOwotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX3ZwZV9zdWJkZXZfaW5pdCk7Ci0KLXN0YXRpYyBpbnQgbXNtX3ZwZV9yZXNvdXJjZV9pbml0KHZvaWQpCi17Ci0JaW50IHJjID0gMDsKLQotCXZwZV9jdHJsLT52cGViYXNlID0gaW9yZW1hcCh2cGVfY3RybC0+dnBlbWVtLT5zdGFydCwKLQkJcmVzb3VyY2Vfc2l6ZSh2cGVfY3RybC0+dnBlbWVtKSk7Ci0KLQlpZiAoIXZwZV9jdHJsLT52cGViYXNlKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJcHJfZXJyKCIlczogdnBlIGlvcmVtYXAgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gdnBlX3VubWFwX21lbV9yZWdpb247Ci0JfQotCi0JcmV0dXJuIHJjOwotLyogZnJvbSB0aGlzIHBhcnQgaXQgaXMgZXJyb3IgaGFuZGxpbmcuICovCi12cGVfdW5tYXBfbWVtX3JlZ2lvbjoKLQlpb3VubWFwKHZwZV9jdHJsLT52cGViYXNlKTsKLQl2cGVfY3RybC0+dnBlYmFzZSA9IE5VTEw7Ci0JcmV0dXJuIHJjOyAgLyogdGhpcyByYyBzaG91bGQgaGF2ZSBlcnJvciBjb2RlLiAqLwotfQotCi12b2lkIG1zbV92cGVfc3ViZGV2X3JlbGVhc2Uoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKLXsKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICptY3RsOwotCW1jdGwgPSB2NGwyX2dldF9zdWJkZXZfaG9zdGRhdGEoc2QpOwotCWlmICghYXRvbWljX3JlYWQoJnZwZV9pbml0X2RvbmUpKSB7Ci0JCS8qIG5vIFZQRSBvYmplY3QgY3JlYXRlZCAqLwotCQlwcl9lcnIoIiVzOiBubyBWUEUgb2JqZWN0IHRvIHJlbGVhc2UiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0JdnBlX3Jlc2V0KCk7Ci0JdnBlX2Rpc2FibGUobWN0bCk7Ci0JaW91bm1hcCh2cGVfY3RybC0+dnBlYmFzZSk7Ci0JdnBlX2N0cmwtPnZwZWJhc2UgPSBOVUxMOwotCWF0b21pY19zZXQoJnZwZV9pbml0X2RvbmUsIDApOwotfQotRVhQT1JUX1NZTUJPTChtc21fdnBlX3N1YmRldl9yZWxlYXNlKTsKLQotc3RhdGljIGludCBtc21fdnBlX3Byb2Nlc3NfdnBlX2NtZChzdHJ1Y3QgbXNtX3ZwZV9jZmdfY21kICp2cGVfY21kLAotCQkJCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKm1jdGwpCi17Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAodnBlX2NtZC0+Y21kX3R5cGUpIHsKLQljYXNlIFZQRV9DTURfUkVTRVQ6Ci0JCXJjID0gdnBlX3Jlc2V0KCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWUEVfQ01EX09QRVJBVElPTl9NT0RFX0NGRzogewotCQlzdHJ1Y3QgbXNtX3ZwZV9vcF9tb2RlX2NmZyBvcF9tb2RlX2NmZzsKLQkJaWYgKHNpemVvZihzdHJ1Y3QgbXNtX3ZwZV9vcF9tb2RlX2NmZykgIT0gdnBlX2NtZC0+bGVuZ3RoKSB7Ci0JCQlwcl9lcnIoIiVzOiBzaXplIG1pc21hdGNoIGNtZD0lZCwgbGVuPSVkLCBleHBlY3RlZD0lZCIsCi0JCQkJX19mdW5jX18sIHZwZV9jbWQtPmNtZF90eXBlLCB2cGVfY21kLT5sZW5ndGgsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fdnBlX29wX21vZGVfY2ZnKSk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlDT1BZX0ZST01fVVNFUihyYywgJm9wX21vZGVfY2ZnLCAodm9pZCBfX3VzZXIgKil2cGVfY21kLT52YWx1ZSwKLQkJCXNpemVvZihvcF9tb2RlX2NmZykpOwotCQlpZiAocmMpIHsKLQkJCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQl2cGVfY21kLT52YWx1ZSA9ICh2b2lkICopJm9wX21vZGVfY2ZnOwotCQlyYyA9IHZwZV9vcGVyYXRpb25fY29uZmlnKHZwZV9jbWQtPnZhbHVlKTsKLQkJYnJlYWs7Ci0JCX0KLQotCWNhc2UgVlBFX0NNRF9JTlBVVF9QTEFORV9DRkc6IHsKLQkJc3RydWN0IG1zbV92cGVfaW5wdXRfcGxhbmVfY2ZnIGlucHV0X2NmZzsKLQkJaWYgKHNpemVvZihzdHJ1Y3QgbXNtX3ZwZV9pbnB1dF9wbGFuZV9jZmcpICE9IHZwZV9jbWQtPmxlbmd0aCkgewotCQkJcHJfZXJyKCIlczogbWlzbWF0Y2ggY21kID0gJWQsIGxlbiA9ICVkLCBleHBlY3RlZCA9ICVkIiwKLQkJCQlfX2Z1bmNfXywgdnBlX2NtZC0+Y21kX3R5cGUsIHZwZV9jbWQtPmxlbmd0aCwKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV92cGVfaW5wdXRfcGxhbmVfY2ZnKSk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlDT1BZX0ZST01fVVNFUihyYywgJmlucHV0X2NmZywgKHZvaWQgX191c2VyICopdnBlX2NtZC0+dmFsdWUsCi0JCQlzaXplb2YoaW5wdXRfY2ZnKSk7Ci0JCWlmIChyYykgewotCQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXZwZV9jbWQtPnZhbHVlID0gKHZvaWQgKikmaW5wdXRfY2ZnOwotCQl2cGVfaW5wdXRfcGxhbmVfY29uZmlnKHZwZV9jbWQtPnZhbHVlKTsKLQkJYnJlYWs7Ci0JCX0KLQotCWNhc2UgVlBFX0NNRF9PVVRQVVRfUExBTkVfQ0ZHOiB7Ci0JCXN0cnVjdCBtc21fdnBlX291dHB1dF9wbGFuZV9jZmcgb3V0cHV0X2NmZzsKLQkJaWYgKHNpemVvZihzdHJ1Y3QgbXNtX3ZwZV9vdXRwdXRfcGxhbmVfY2ZnKSAhPQotCQkJdnBlX2NtZC0+bGVuZ3RoKSB7Ci0JCQlwcl9lcnIoIiVzOiBzaXplIG1pc21hdGNoIGNtZD0lZCwgbGVuPSVkLCBleHBlY3RlZD0lZCIsCi0JCQkJX19mdW5jX18sIHZwZV9jbWQtPmNtZF90eXBlLCB2cGVfY21kLT5sZW5ndGgsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fdnBlX291dHB1dF9wbGFuZV9jZmcpKTsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJQ09QWV9GUk9NX1VTRVIocmMsICZvdXRwdXRfY2ZnLCAodm9pZCBfX3VzZXIgKil2cGVfY21kLT52YWx1ZSwKLQkJCXNpemVvZihvdXRwdXRfY2ZnKSk7Ci0JCWlmIChyYykgewotCQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXZwZV9jbWQtPnZhbHVlID0gKHZvaWQgKikmb3V0cHV0X2NmZzsKLQkJdnBlX291dHB1dF9wbGFuZV9jb25maWcodnBlX2NtZC0+dmFsdWUpOwotCQlicmVhazsKLQkJfQotCi0JY2FzZSBWUEVfQ01EX1NDQUxFX0NGR19UWVBFOnsKLQkJc3RydWN0IG1zbV92cGVfc2NhbGVyX2NmZyBzY2FsZXJfY2ZnOwotCQlpZiAoc2l6ZW9mKHN0cnVjdCBtc21fdnBlX3NjYWxlcl9jZmcpICE9IHZwZV9jbWQtPmxlbmd0aCkgewotCQkJcHJfZXJyKCIlczogc2l6ZSBtaXNtYXRjaCBjbWQ9JWQsIGxlbj0lZCwgZXhwZWN0ZWQ9JWQiLAotCQkJCV9fZnVuY19fLCB2cGVfY21kLT5jbWRfdHlwZSwgdnBlX2NtZC0+bGVuZ3RoLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX3ZwZV9zY2FsZXJfY2ZnKSk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlDT1BZX0ZST01fVVNFUihyYywgJnNjYWxlcl9jZmcsICh2b2lkIF9fdXNlciAqKXZwZV9jbWQtPnZhbHVlLAotCQkJc2l6ZW9mKHNjYWxlcl9jZmcpKTsKLQkJaWYgKHJjKSB7Ci0JCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJdnBlX2NtZC0+dmFsdWUgPSAodm9pZCAqKSZzY2FsZXJfY2ZnOwotCQl2cGVfdXBkYXRlX3NjYWxlX2NvZWYodnBlX2NtZC0+dmFsdWUpOwotCQlicmVhazsKLQkJfQotCi0JY2FzZSBWUEVfQ01EX1pPT006IHsKLQkJc3RydWN0IG1zbV9tY3RsX3BwX2ZyYW1lX2luZm8gKnpvb207Ci0JCXpvb20gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX21jdGxfcHBfZnJhbWVfaW5mbyksCi0JCQkJR0ZQX0FUT01JQyk7Ci0JCWlmICghem9vbSkgewotCQkJcHJfZXJyKCIlcyBOb3QgZW5vdWdoIG1lbW9yeSAiLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChzaXplb2Yoem9vbS0+cHBfZnJhbWVfY21kKSAhPSB2cGVfY21kLT5sZW5ndGgpIHsKLQkJCXByX2VycigiJXM6IHNpemUgbWlzbWF0Y2ggaWQ9JWQsIGxlbj0lZCwgZXhwZWN0ZWQ9JWQiLAotCQkJCV9fZnVuY19fLCB2cGVfY21kLT5jbWRfdHlwZSwgdnBlX2NtZC0+bGVuZ3RoLAotCQkJCXNpemVvZih6b29tLT5wcF9mcmFtZV9jbWQpKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWtmcmVlKHpvb20pOwotCQkJYnJlYWs7Ci0JCX0KLQkJQ09QWV9GUk9NX1VTRVIocmMsICZ6b29tLT5wcF9mcmFtZV9jbWQsCi0JCQkodm9pZCBfX3VzZXIgKil2cGVfY21kLT52YWx1ZSwKLQkJCXNpemVvZih6b29tLT5wcF9mcmFtZV9jbWQpKTsKLQkJaWYgKHJjKSB7Ci0JCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJCWtmcmVlKHpvb20pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQl6b29tLT51c2VyX2NtZCA9IHZwZV9jbWQtPmNtZF90eXBlOwotCQl6b29tLT5wX21jdGwgPSB2NGwyX2dldF9zdWJkZXZfaG9zdGRhdGEoJnZwZV9jdHJsLT5zdWJkZXYpOwotCQlEKCIlczogY29va2llPTB4JXgsYWN0aW9uPTB4JXgscGF0aD0weCV4IiwKLQkJCV9fZnVuY19fLCB6b29tLT5wcF9mcmFtZV9jbWQuY29va2llLAotCQkJem9vbS0+cHBfZnJhbWVfY21kLnZwZV9vdXRwdXRfYWN0aW9uLAotCQkJem9vbS0+cHBfZnJhbWVfY21kLnBhdGgpOwotCi0JCUQoIiVzIE1hcHBpbmcgU291cmNlIGZyYW1lICIsIF9fZnVuY19fKTsKLQkJem9vbS0+c3JjX2ZyYW1lLmZyYW1lID0gem9vbS0+cHBfZnJhbWVfY21kLnNyY19mcmFtZTsKLQkJcmMgPSBtc21fbWN0bF9tYXBfdXNlcl9mcmFtZSgmem9vbS0+c3JjX2ZyYW1lLAotCQkJem9vbS0+cF9tY3RsLT5jbGllbnQsIG1jdGwtPmRvbWFpbl9udW0pOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzIEVycm9yIG1hcHBpbmcgc291cmNlIGJ1ZmZlciByYyA9ICVkIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJa2ZyZWUoem9vbSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCUQoIiVzIE1hcHBpbmcgRGVzdGluYXRpb24gZnJhbWUgIiwgX19mdW5jX18pOwotCQl6b29tLT5kZXN0X2ZyYW1lLmZyYW1lID0gem9vbS0+cHBfZnJhbWVfY21kLmRlc3RfZnJhbWU7Ci0JCXJjID0gbXNtX21jdGxfbWFwX3VzZXJfZnJhbWUoJnpvb20tPmRlc3RfZnJhbWUsCi0JCQl6b29tLT5wX21jdGwtPmNsaWVudCwgbWN0bC0+ZG9tYWluX251bSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgRXJyb3IgbWFwcGluZyBkZXN0IGJ1ZmZlciByYyA9ICVkIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJbXNtX21jdGxfdW5tYXBfdXNlcl9mcmFtZSgmem9vbS0+c3JjX2ZyYW1lLAotCQkJCXpvb20tPnBfbWN0bC0+Y2xpZW50LCBtY3RsLT5kb21haW5fbnVtKTsKLQkJCWtmcmVlKHpvb20pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyYyA9IG1zbV92cGVfZG9fcHAoem9vbSk7Ci0JCWJyZWFrOwotCQl9Ci0KLQljYXNlIFZQRV9DTURfRU5BQkxFOiB7Ci0JCXN0cnVjdCBtc21fdnBlX2Nsb2NrX3JhdGUgY2xrX3JhdGU7Ci0JCWludCB0dXJib19tb2RlOwotCQlpZiAoc2l6ZW9mKHN0cnVjdCBtc21fdnBlX2Nsb2NrX3JhdGUpICE9IHZwZV9jbWQtPmxlbmd0aCkgewotCQkJcHJfZXJyKCIlczogc2l6ZSBtaXNtYXRjaCBjbWQ9JWQsIGxlbj0lZCwgZXhwZWN0ZWQ9JWQiLAotCQkJCV9fZnVuY19fLCB2cGVfY21kLT5jbWRfdHlwZSwgdnBlX2NtZC0+bGVuZ3RoLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX3ZwZV9jbG9ja19yYXRlKSk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNsa19yYXRlLCAodm9pZCBfX3VzZXIgKil2cGVfY21kLT52YWx1ZSwKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX3ZwZV9jbG9ja19yYXRlKSkpIHsKLQkJCXByX2VycigiJXM6Y2xrX3JhdGUgY29weSBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQl0dXJib19tb2RlID0gKGludCljbGtfcmF0ZS5yYXRlOwotCQlyYyA9IHR1cmJvX21vZGUgPyB2cGVfZW5hYmxlKFZQRV9UVVJCT19NT0RFX0NMT0NLX1JBVEUsIG1jdGwpIDoKLQkJCQl2cGVfZW5hYmxlKFZQRV9OT1JNQUxfTU9ERV9DTE9DS19SQVRFLCBtY3RsKTsKLQkJYnJlYWs7Ci0JCX0KLQotCWNhc2UgVlBFX0NNRF9ESVNBQkxFOgotCQlyYyA9IHZwZV9kaXNhYmxlKG1jdGwpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgbXNtX3ZwZV9zdWJkZXZfaW9jdGwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgbXNtX3ZwZV9jZmdfY21kICp2cGVfY21kOwotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqbWN0bDsKLQltY3RsID0gdjRsMl9nZXRfc3ViZGV2X2hvc3RkYXRhKHNkKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVklESU9DX01TTV9WUEVfSU5JVDogewotCQltc21fdnBlX3N1YmRldl9pbml0KHNkKTsKLQkJYnJlYWs7Ci0JCX0KLQotCWNhc2UgVklESU9DX01TTV9WUEVfUkVMRUFTRToKLQkJbXNtX3ZwZV9zdWJkZXZfcmVsZWFzZShzZCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNX1Y0TDJfSU9DVExfQ0ZHX1ZQRTogewotCQl2cGVfY21kID0gKHN0cnVjdCBtc21fdnBlX2NmZ19jbWQgKilhcmc7Ci0JCXJjID0gbXNtX3ZwZV9wcm9jZXNzX3ZwZV9jbWQodnBlX2NtZCwgbWN0bCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgRXJyb3IgcHJvY2Vzc2luZyBWUEUgY21kICVkICIsCi0JCQkJX19mdW5jX18sIHZwZV9jbWQtPmNtZF90eXBlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCQl9Ci0KLQljYXNlIE1TTV9DQU1fVjRMMl9JT0NUTF9HRVRfRVZFTlRfUEFZTE9BRDogewotCQlzdHJ1Y3QgbXNtX2RldmljZV9xdWV1ZSAqcXVldWUgPSAmdnBlX2N0cmwtPmV2ZW50RGF0YV9xOwotCQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqZXZlbnRfcWNtZDsKLQkJc3RydWN0IG1zbV9tY3RsX3BwX2V2ZW50X2luZm8gcHBfZXZlbnRfaW5mbzsKLQkJc3RydWN0IG1zbV9tY3RsX3BwX2ZyYW1lX2luZm8gKnBwX2ZyYW1lX2luZm87Ci0JCXN0cnVjdCBtc21fY2FtZXJhX3Y0bDJfaW9jdGxfdCAqdjRsMl9pb2N0bCA9IGFyZzsKLQotCQlldmVudF9xY21kID0gbXNtX2RlcXVldWUocXVldWUsIGxpc3RfZXZlbnRkYXRhKTsKLQkJaWYgKCFldmVudF9xY21kKSB7Ci0JCQlwcl9lcnIoIiVzIE5vIGV2ZW50cyBpbiB0aGUgcXVldWUiLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlwcF9mcmFtZV9pbmZvID0gZXZlbnRfcWNtZC0+Y29tbWFuZDsKLQotCQlEKCIlcyBVbm1hcHBpbmcgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBidWZmZXJzICIsCi0JCQlfX2Z1bmNfXyk7Ci0JCW1zbV9tY3RsX3VubWFwX3VzZXJfZnJhbWUoJnBwX2ZyYW1lX2luZm8tPnNyY19mcmFtZSwKLQkJCXBwX2ZyYW1lX2luZm8tPnBfbWN0bC0+Y2xpZW50LCBtY3RsLT5kb21haW5fbnVtKTsKLQkJbXNtX21jdGxfdW5tYXBfdXNlcl9mcmFtZSgmcHBfZnJhbWVfaW5mby0+ZGVzdF9mcmFtZSwKLQkJCXBwX2ZyYW1lX2luZm8tPnBfbWN0bC0+Y2xpZW50LCBtY3RsLT5kb21haW5fbnVtKTsKLQotCQlwcF9ldmVudF9pbmZvLmV2ZW50ID0gTUNUTF9QUF9FVkVOVF9DTURfQUNLOwotCQlwcF9ldmVudF9pbmZvLmFjay5jbWQgPSBwcF9mcmFtZV9pbmZvLT51c2VyX2NtZDsKLQkJcHBfZXZlbnRfaW5mby5hY2suc3RhdHVzID0gMDsKLQkJcHBfZXZlbnRfaW5mby5hY2suY29va2llID0gcHBfZnJhbWVfaW5mby0+cHBfZnJhbWVfY21kLmNvb2tpZTsKLQkJRCgiJXMgU2VuZGluZyBwYXlsb2FkICVkICVkICVkIiwgX19mdW5jX18sCi0JCQlwcF9ldmVudF9pbmZvLmFjay5jbWQsIHBwX2V2ZW50X2luZm8uYWNrLnN0YXR1cywKLQkJCXBwX2V2ZW50X2luZm8uYWNrLmNvb2tpZSk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopdjRsMl9pb2N0bC0+aW9jdGxfcHRyLAotCQkJJnBwX2V2ZW50X2luZm8sCXNpemVvZihzdHJ1Y3QgbXNtX21jdGxfcHBfZXZlbnRfaW5mbykpKQotCQkJcHJfZXJyKCIlcyBQQVlMT0FEIENvcHkgdG8gdXNlciBmYWlsZWQgIiwgX19mdW5jX18pOwotCi0JCWtmcmVlKHBwX2ZyYW1lX2luZm8pOwotCQlrZnJlZShldmVudF9xY21kKTsKLQkJYnJlYWs7Ci0JCX0KLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fdnBlX3N1YmRldl9zdWJzY3JpYmVfZXZlbnQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfZmggKmZoLAotCXN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiAqc3ViKQotewotCUQoIiVzIEVcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gdjRsMl9ldmVudF9zdWJzY3JpYmUoZmgsIHN1YiwgVlBFX1NVQkRFVl9NQVhfRVZFTlRTKTsKLX0KLQotaW50IG1zbV92cGVfc3ViZGV2X3Vuc3Vic2NyaWJlX2V2ZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2ZoICpmaCwKLQlzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24gKnN1YikKLXsKLQlEKCIlcyBFXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUoZmgsIHN1Yik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbXNtX3ZwZV9zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmlvY3RsID0gbXNtX3ZwZV9zdWJkZXZfaW9jdGwsCi0JLnN1YnNjcmliZV9ldmVudCA9IG1zbV92cGVfc3ViZGV2X3N1YnNjcmliZV9ldmVudCwKLQkudW5zdWJzY3JpYmVfZXZlbnQgPSBtc21fdnBlX3N1YmRldl91bnN1YnNjcmliZV9ldmVudCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG1zbV92cGVfc3ViZGV2X29wcyA9IHsKLQkuY29yZSA9ICZtc21fdnBlX3N1YmRldl9jb3JlX29wcywKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3ZwZV9zdWJkZXZfb3BlbihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgpCi17Ci0Jc3RydWN0IHZwZV9jdHJsX3R5cGUgKnZwZV9jdHJsID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0JLyogT25seSBvbmUgY2xpZW50IG9mIFZQRSBhbGxvd2VkLiAqLwotCWlmIChhdG9taWNfcmVhZCgmdnBlX2N0cmwtPmFjdGl2ZSkgIT0gMCkgewotCQlwcl9lcnIoIiVzIGFscmVhZHkgb3BlbmVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCUQoIiVzIEUgIiwgX19mdW5jX18pOwotCWF0b21pY19pbmMoJnZwZV9jdHJsLT5hY3RpdmUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV92cGVfc3ViZGV2X2Nsb3NlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0Jc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCkKLXsKLQlzdHJ1Y3QgdnBlX2N0cmxfdHlwZSAqdnBlX2N0cmwgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgbXNtX21jdGxfcHBfZnJhbWVfaW5mbyAqZnJhbWVfaW5mbyA9IHZwZV9jdHJsLT5wcF9mcmFtZV9pbmZvOwotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKm1jdGw7Ci0JbWN0bCA9IHY0bDJfZ2V0X3N1YmRldl9ob3N0ZGF0YShzZCk7Ci0JaWYgKGF0b21pY19yZWFkKCZ2cGVfY3RybC0+YWN0aXZlKSA9PSAwKSB7Ci0JCXByX2VycigiJXMgYWxyZWFkeSBjbG9zZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JRCgiJXMgRSAiLCBfX2Z1bmNfXyk7Ci0JaWYgKGZyYW1lX2luZm8pIHsKLQkJRCgiJXMgVW5tYXAgdGhlIHBlbmRpbmcgaXRlbSBmcm9tIHRoZSBxdWV1ZSAiLCBfX2Z1bmNfXyk7Ci0JCW1zbV9tY3RsX3VubWFwX3VzZXJfZnJhbWUoJmZyYW1lX2luZm8tPnNyY19mcmFtZSwKLQkJCWZyYW1lX2luZm8tPnBfbWN0bC0+Y2xpZW50LCBtY3RsLT5kb21haW5fbnVtKTsKLQkJbXNtX21jdGxfdW5tYXBfdXNlcl9mcmFtZSgmZnJhbWVfaW5mby0+ZGVzdF9mcmFtZSwKLQkJCWZyYW1lX2luZm8tPnBfbWN0bC0+Y2xpZW50LCBtY3RsLT5kb21haW5fbnVtKTsKLQl9Ci0JLyogRHJhaW4gdGhlIHBheWxvYWQgcXVldWUuICovCi0JbXNtX3F1ZXVlX2RyYWluKCZ2cGVfY3RybC0+ZXZlbnREYXRhX3EsIGxpc3RfZXZlbnRkYXRhKTsKLQlhdG9taWNfZGVjKCZ2cGVfY3RybC0+YWN0aXZlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgbXNtX3ZwZV9pbnRlcm5hbF9vcHMgPSB7Ci0JLm9wZW4gPSBtc21fdnBlX3N1YmRldl9vcGVuLAotCS5jbG9zZSA9IG1zbV92cGVfc3ViZGV2X2Nsb3NlLAotfTsKLQotc3RhdGljIGludCBfX2RldmluaXQgbXNtX3ZwZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1fc3ViZGV2X2luZm8gc2RfaW5mbzsKLQotCUQoIiVzOiBkZXZpY2UgaWQgPSAlZFxuIiwgX19mdW5jX18sIHBkZXYtPmlkKTsKLQl2cGVfY3RybCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2cGVfY3RybF90eXBlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2cGVfY3RybCkgewotCQlwcl9lcnIoIiVzOiBub3QgZW5vdWdoIG1lbW9yeVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQl2NGwyX3N1YmRldl9pbml0KCZ2cGVfY3RybC0+c3ViZGV2LCAmbXNtX3ZwZV9zdWJkZXZfb3BzKTsKLQl2NGwyX3NldF9zdWJkZXZkYXRhKCZ2cGVfY3RybC0+c3ViZGV2LCB2cGVfY3RybCk7Ci0JdnBlX2N0cmwtPnN1YmRldi5pbnRlcm5hbF9vcHMgPSAmbXNtX3ZwZV9pbnRlcm5hbF9vcHM7Ci0JdnBlX2N0cmwtPnN1YmRldi5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKLQlzbnByaW50Zih2cGVfY3RybC0+c3ViZGV2Lm5hbWUsIHNpemVvZih2cGVfY3RybC0+c3ViZGV2Lm5hbWUpLCAidnBlIik7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJnZwZV9jdHJsLT5zdWJkZXYpOwotCi0JbWVkaWFfZW50aXR5X2luaXQoJnZwZV9jdHJsLT5zdWJkZXYuZW50aXR5LCAwLCBOVUxMLCAwKTsKLQl2cGVfY3RybC0+c3ViZGV2LmVudGl0eS50eXBlID0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVY7Ci0JdnBlX2N0cmwtPnN1YmRldi5lbnRpdHkuZ3JvdXBfaWQgPSBWUEVfREVWOwotCXZwZV9jdHJsLT5zdWJkZXYuZW50aXR5Lm5hbWUgPSB2cGVfY3RybC0+c3ViZGV2Lm5hbWU7Ci0KLQl2cGVfY3RybC0+c3ViZGV2LmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19FVkVOVFM7Ci0KLQl2cGVfY3RybC0+dnBlbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LAotCQkJCQlJT1JFU09VUkNFX01FTSwgInZwZSIpOwotCWlmICghdnBlX2N0cmwtPnZwZW1lbSkgewotCQlwcl9lcnIoIiVzOiBubyBtZW0gcmVzb3VyY2U/XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byB2cGVfbm9fcmVzb3VyY2U7Ci0JfQotCXZwZV9jdHJsLT52cGVpcnEgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsCi0JCQkJCUlPUkVTT1VSQ0VfSVJRLCAidnBlIik7Ci0JaWYgKCF2cGVfY3RybC0+dnBlaXJxKSB7Ci0JCXByX2VycigiJXM6IG5vIGlycSByZXNvdXJjZT9cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIHZwZV9ub19yZXNvdXJjZTsKLQl9Ci0KLQl2cGVfY3RybC0+dnBlaW8gPSByZXF1ZXN0X21lbV9yZWdpb24odnBlX2N0cmwtPnZwZW1lbS0+c3RhcnQsCi0JCXJlc291cmNlX3NpemUodnBlX2N0cmwtPnZwZW1lbSksIHBkZXYtPm5hbWUpOwotCWlmICghdnBlX2N0cmwtPnZwZWlvKSB7Ci0JCXByX2VycigiJXM6IG5vIHZhbGlkIG1lbSByZWdpb25cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gdnBlX25vX3Jlc291cmNlOwotCX0KLQotCXJjID0gcmVxdWVzdF9pcnEodnBlX2N0cmwtPnZwZWlycS0+c3RhcnQsIHZwZV9wYXJzZV9pcnEsCi0JCUlSUUZfVFJJR0dFUl9SSVNJTkcsICJ2cGUiLCAwKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbih2cGVfY3RybC0+dnBlbWVtLT5zdGFydCwKLQkJCXJlc291cmNlX3NpemUodnBlX2N0cmwtPnZwZW1lbSkpOwotCQlwcl9lcnIoIiVzOiBpcnEgcmVxdWVzdCBmYWlsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIHZwZV9ub19yZXNvdXJjZTsKLQl9Ci0KLQl2cGVfY3RybC0+ZnNfdnBlID0gcmVndWxhdG9yX2dldCgmcGRldi0+ZGV2LCAidmRkIik7Ci0JaWYgKElTX0VSUih2cGVfY3RybC0+ZnNfdnBlKSkgewotCQlwcl9lcnIoIiVzOiBSZWd1bGF0b3IgRlNfVlBFIGdldCBmYWlsZWQgJWxkXG4iLCBfX2Z1bmNfXywKLQkJCVBUUl9FUlIodnBlX2N0cmwtPmZzX3ZwZSkpOwotCQl2cGVfY3RybC0+ZnNfdnBlID0gTlVMTDsKLQl9Ci0KLQlkaXNhYmxlX2lycSh2cGVfY3RybC0+dnBlaXJxLT5zdGFydCk7Ci0KLSNpZmRlZiBDT05GSUdfTVNNX0lPTU1VCi0JLypnZXQgZGV2aWNlIGNvbnRleHQgZm9yIElPTU1VKi8KLQl2cGVfY3RybC0+aW9tbXVfY3R4X3NyYyA9IG1zbV9pb21tdV9nZXRfY3R4KCJ2cGVfc3JjIik7IC8qcmUtY29uZmlybSovCi0JdnBlX2N0cmwtPmlvbW11X2N0eF9kc3QgPSBtc21faW9tbXVfZ2V0X2N0eCgidnBlX2RzdCIpOyAvKnJlLWNvbmZpcm0qLwotCWlmICghdnBlX2N0cmwtPmlvbW11X2N0eF9zcmMgfHwgIXZwZV9jdHJsLT5pb21tdV9jdHhfZHN0KSB7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbih2cGVfY3RybC0+dnBlbWVtLT5zdGFydCwKLQkJCXJlc291cmNlX3NpemUodnBlX2N0cmwtPnZwZW1lbSkpOwotCQlwcl9lcnIoIiVzOiBObyBpb21tdSBmdyBjb250ZXh0IGZvdW5kXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byB2cGVfbm9fcmVzb3VyY2U7Ci0JfQotI2VuZGlmCi0KLQlhdG9taWNfc2V0KCZ2cGVfY3RybC0+YWN0aXZlLCAwKTsKLQl2cGVfY3RybC0+cGRldiA9IHBkZXY7Ci0Jc2RfaW5mby5zZGV2X3R5cGUgPSBWUEVfREVWOwotCXNkX2luZm8uc2RfaW5kZXggPSBwZGV2LT5pZDsKLQlzZF9pbmZvLmlycV9udW0gPSB2cGVfY3RybC0+dnBlaXJxLT5zdGFydDsKLQltc21fY2FtX3JlZ2lzdGVyX3N1YmRldl9ub2RlKCZ2cGVfY3RybC0+c3ViZGV2LCAmc2RfaW5mbyk7Ci0JdnBlX2N0cmwtPnN1YmRldi5lbnRpdHkucmV2aXNpb24gPSB2cGVfY3RybC0+c3ViZGV2LmRldm5vZGUtPm51bTsKLQltc21fcXVldWVfaW5pdCgmdnBlX2N0cmwtPmV2ZW50RGF0YV9xLCAiYWNrZXZlbnRzIik7Ci0KLQlyZXR1cm4gMDsKLQotdnBlX25vX3Jlc291cmNlOgotCXByX2VycigiJXM6IFZQRSBQcm9iZSBmYWlsZWQuXG4iLCBfX2Z1bmNfXyk7Ci0Ja2ZyZWUodnBlX2N0cmwpOwotCXJldHVybiByYzsKLX0KLQotc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fdnBlX2RyaXZlciA9IHsKLQkucHJvYmUgPSBtc21fdnBlX3Byb2JlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gTVNNX1ZQRV9EUlZfTkFNRSwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV92cGVfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fdnBlX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtc21fdnBlX2V4aXRfbW9kdWxlKHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV92cGVfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQobXNtX3ZwZV9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChtc21fdnBlX2V4aXRfbW9kdWxlKTsKLU1PRFVMRV9ERVNDUklQVElPTigiVlBFIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV92cGUuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tc21fdnBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiODliZjAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV92cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfTVNNX1ZQRV9IXwotI2RlZmluZSBfTVNNX1ZQRV9IXwotCi0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLQotLyoqKioqKioqKioqICBzdGFydCBvZiByZWdpc3RlciBvZmZzZXQgKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBWUEVfSU5UUl9FTkFCTEVfT0ZGU0VUICAgICAgICAgICAgICAgIDB4MDAyMAotI2RlZmluZSBWUEVfSU5UUl9TVEFUVVNfT0ZGU0VUICAgICAgICAgICAgICAgIDB4MDAyNAotI2RlZmluZSBWUEVfSU5UUl9DTEVBUl9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MDAyOAotI2RlZmluZSBWUEVfREwwX1NUQVJUX09GRlNFVCAgICAgICAgICAgICAgICAgIDB4MDAzMAotI2RlZmluZSBWUEVfSFdfVkVSU0lPTl9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MDA3MAotI2RlZmluZSBWUEVfU1dfUkVTRVRfT0ZGU0VUICAgICAgICAgICAgICAgICAgIDB4MDA3NAotI2RlZmluZSBWUEVfQVhJX1JEX0FSQl9DT05GSUdfT0ZGU0VUICAgICAgICAgIDB4MDA3OAotI2RlZmluZSBWUEVfU0VMX0NMS19PUl9IQ0xLX1RFU1RfQlVTX09GRlNFVCAgIDB4MDA3QwotI2RlZmluZSBWUEVfQ0dDX0VOX09GRlNFVCAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAotI2RlZmluZSBWUEVfQ01EX1NUQVRVU19PRkZTRVQgICAgICAgICAgICAgICAgIDB4MTAwMDgKLSNkZWZpbmUgVlBFX1BST0ZJTEVfRU5fT0ZGU0VUICAgICAgICAgICAgICAgICAweDEwMDEwCi0jZGVmaW5lIFZQRV9QUk9GSUxFX0NPVU5UX09GRlNFVCAgICAgICAgICAgICAgMHgxMDAxNAotI2RlZmluZSBWUEVfQ01EX01PREVfT0ZGU0VUICAgICAgICAgICAgICAgICAgIDB4MTAwNjAKLSNkZWZpbmUgVlBFX1NSQ19TSVpFX09GRlNFVCAgICAgICAgICAgICAgICAgICAweDEwMTA4Ci0jZGVmaW5lIFZQRV9TUkNQMF9BRERSX09GRlNFVCAgICAgICAgICAgICAgICAgMHgxMDEwQwotI2RlZmluZSBWUEVfU1JDUDFfQUREUl9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MTAxMTAKLSNkZWZpbmUgVlBFX1NSQ19ZU1RSSURFMV9PRkZTRVQgICAgICAgICAgICAgICAweDEwMTFDCi0jZGVmaW5lIFZQRV9TUkNfRk9STUFUX09GRlNFVCAgICAgICAgICAgICAgICAgMHgxMDEyNAotI2RlZmluZSBWUEVfU1JDX1VOUEFDS19QQVRURVJOMV9PRkZTRVQgICAgICAgIDB4MTAxMjgKLSNkZWZpbmUgVlBFX09QX01PREVfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAweDEwMTM4Ci0jZGVmaW5lIFZQRV9TQ0FMRV9QSEFTRVhfSU5JVF9PRkZTRVQgICAgICAgICAgMHgxMDEzQwotI2RlZmluZSBWUEVfU0NBTEVfUEhBU0VZX0lOSVRfT0ZGU0VUICAgICAgICAgIDB4MTAxNDAKLSNkZWZpbmUgVlBFX1NDQUxFX1BIQVNFWF9TVEVQX09GRlNFVCAgICAgICAgICAweDEwMTQ0Ci0jZGVmaW5lIFZQRV9TQ0FMRV9QSEFTRVlfU1RFUF9PRkZTRVQgICAgICAgICAgMHgxMDE0OAotI2RlZmluZSBWUEVfT1VUX0ZPUk1BVF9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MTAxNTAKLSNkZWZpbmUgVlBFX09VVF9QQUNLX1BBVFRFUk4xX09GRlNFVCAgICAgICAgICAweDEwMTU0Ci0jZGVmaW5lIFZQRV9PVVRfU0laRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgMHgxMDE2NAotI2RlZmluZSBWUEVfT1VUUDBfQUREUl9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MTAxNjgKLSNkZWZpbmUgVlBFX09VVFAxX0FERFJfT0ZGU0VUICAgICAgICAgICAgICAgICAweDEwMTZDCi0jZGVmaW5lIFZQRV9PVVRfWVNUUklERTFfT0ZGU0VUICAgICAgICAgICAgICAgMHgxMDE3OAotI2RlZmluZSBWUEVfT1VUX1hZX09GRlNFVCAgICAgICAgICAgICAgICAgICAgIDB4MTAxOUMKLSNkZWZpbmUgVlBFX1NSQ19YWV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAweDEwMjAwCi0jZGVmaW5lIFZQRV9TUkNfSU1BR0VfU0laRV9PRkZTRVQgICAgICAgICAgICAgMHgxMDIwOAotI2RlZmluZSBWUEVfU0NBTEVfQ09ORklHX09GRlNFVCAgICAgICAgICAgICAgIDB4MTAyMzAKLSNkZWZpbmUgVlBFX0RFSU5UX1NUQVRVU19PRkZTRVQgICAgICAgICAgICAgICAweDMwMDAwCi0jZGVmaW5lIFZQRV9ERUlOVF9ERUNJU0lPTl9PRkZTRVQgICAgICAgICAgICAgMHgzMDAwNAotI2RlZmluZSBWUEVfREVJTlRfQ09FRkYwX09GRlNFVCAgICAgICAgICAgICAgIDB4MzAwMTAKLSNkZWZpbmUgVlBFX1NDQUxFX1NUQVRVU19PRkZTRVQgICAgICAgICAgICAgICAweDUwMDAwCi0jZGVmaW5lIFZQRV9TQ0FMRV9TVklfUEFSQU1fT0ZGU0VUICAgICAgICAgICAgMHg1MDAxMAotI2RlZmluZSBWUEVfU0NBTEVfU0hBUlBFTl9DRkdfT0ZGU0VUICAgICAgICAgIDB4NTAwMjAKLSNkZWZpbmUgVlBFX1NDQUxFX0NPRUZGX0xTUF8wX09GRlNFVCAgICAgICAgICAweDUwNDAwCi0jZGVmaW5lIFZQRV9TQ0FMRV9DT0VGRl9NU1BfMF9PRkZTRVQgICAgICAgICAgMHg1MDQwNAotCi0jZGVmaW5lIFZQRV9BWElfQVJCXzFfT0ZGU0VUICAgICAgICAgICAgICAgICAgMHgwMDQwOAotI2RlZmluZSBWUEVfQVhJX0FSQl8yX09GRlNFVCAgICAgICAgICAgICAgICAgIDB4MDA0MEMKLQotI2RlZmluZSBWUEVfU0NBTEVfQ09FRkZfTFNCbihuKQkoMHg1MDQwMCArIDggKiAobikpCi0jZGVmaW5lIFZQRV9TQ0FMRV9DT0VGRl9NU0JuKG4pCSgweDUwNDA0ICsgOCAqIChuKSkKLSNkZWZpbmUgVlBFX1NDQUxFX0NPRUZGX05VTQkJCTMyCi0KLS8qKioqKioqKioqKiBlbmQgb2YgcmVnaXN0ZXIgb2Zmc2V0ICoqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgVlBFX0hBUkRXQVJFX1ZFUlNJT04gICAgICAgICAgMHgwMDA4MDMwOAotI2RlZmluZSBWUEVfU1dfUkVTRVRfVkFMVUUgICAgICAgICAgICAweDAwMDAwMDEwICAvKiBiaXQgNCBmb3IgUFBQKi8KLSNkZWZpbmUgVlBFX0FYSV9SRF9BUkJfQ09ORklHX1ZBTFVFICAgMHgxMjQ5MjQKLSNkZWZpbmUgVlBFX0NNRF9NT0RFX1ZBTFVFICAgICAgICAgICAgMHgxCi0jZGVmaW5lIFZQRV9ERUZBVUxUX09QX01PREVfVkFMVUUgICAgIDB4NDBGQzAwMDQKLSNkZWZpbmUgVlBFX0NHQ19FTkFCTEVfVkFMVUUgICAgICAgICAgMHhmZmZmCi0jZGVmaW5lIFZQRV9ERUZBVUxUX1NDQUxFX0NPTkZJRyAgICAgIDB4M2MKLQotI2RlZmluZSBWUEVfTk9STUFMX01PREVfQ0xPQ0tfUkFURSAgIDE1MDAwMDAwMAotI2RlZmluZSBWUEVfVFVSQk9fTU9ERV9DTE9DS19SQVRFICAgIDIwMDAwMDAwMAotI2RlZmluZSBWUEVfU1VCREVWX01BWF9FVkVOVFMgICAgICAgIDMwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKiBFbmQgb2YgY29tbWFuZCBpZCAqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotZW51bSB2cGVfc3RhdGUgewotCVZQRV9TVEFURV9JRExFLAotCVZQRV9TVEFURV9JTklULAotCVZQRV9TVEFURV9BQ1RJVkUsCi19OwotCi1zdHJ1Y3QgdnBlX2N0cmxfdHlwZSB7Ci0Jc3BpbmxvY2tfdCAgICAgICAgbG9jazsKLQl1aW50MzJfdCAgICAgICAgICBpcnFfc3RhdHVzOwotCXZvaWQgICAgICAgICAgICAgICpzeW5jZGF0YTsKLQl1aW50MTZfdCAgICAgICAgICBvcF9tb2RlOwotCXZvaWQgICAgICAgICAgICAgICpleHRkYXRhOwotCXVpbnQzMl90ICAgICAgICAgIGV4dGxlbjsKLQlzdHJ1Y3QgbXNtX3ZwZV9jYWxsYmFjayAqcmVzcDsKLQl1aW50MzJfdCAgICAgICAgICBvdXRfaDsgIC8qIHRoaXMgaXMgQkVGT1JFIHJvdGF0aW9uLiAqLwotCXVpbnQzMl90ICAgICAgICAgIG91dF93OyAgLyogdGhpcyBpcyBCRUZPUkUgcm90YXRpb24uICovCi0Jc3RydWN0IHRpbWVzcGVjICAgdHM7Ci0JaW50ICAgICAgICAgICAgICAgb3V0cHV0X3R5cGU7Ci0JaW50ICAgICAgICAgICAgICAgZnJhbWVfcGFjazsKLQl1aW50OF90ICAgICAgICAgICBwYWRfMmtfYm9vbDsKLQllbnVtIHZwZV9zdGF0ZSAgICBzdGF0ZTsKLQl1bnNpZ25lZCBsb25nICAgICBvdXRfeV9hZGRyOwotCXVuc2lnbmVkIGxvbmcgICAgIG91dF9jYmNyX2FkZHI7Ci0Jc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXN0cnVjdCByZXNvdXJjZSAgICp2cGVpcnE7Ci0Jdm9pZCBfX2lvbWVtICAgICAgKnZwZWJhc2U7Ci0Jc3RydWN0IHJlc291cmNlCSAgKnZwZW1lbTsKLQlzdHJ1Y3QgcmVzb3VyY2UgICAqdnBlaW87Ci0Jdm9pZCAgICAgICAgKmRldmljZV9leHRkYXRhOwotCXN0cnVjdCByZWd1bGF0b3IgKmZzX3ZwZTsKLQlzdHJ1Y3QgY2xrCSp2cGVfY2xrWzJdOwotCXN0cnVjdCBtc21fbWN0bF9wcF9mcmFtZV9pbmZvICpwcF9mcmFtZV9pbmZvOwotCWF0b21pY190IGFjdGl2ZTsKLQlzdHJ1Y3QgbXNtX2RldmljZV9xdWV1ZSBldmVudERhdGFfcTsgLypWNEwyIEV2ZW50IFBheWxvYWQgUXVldWUqLwotCXN0cnVjdCBkZXZpY2UgKmlvbW11X2N0eF9zcmM7Ci0Jc3RydWN0IGRldmljZSAqaW9tbXVfY3R4X2RzdDsKLX07Ci0KLS8qCi0qIHZwZV9pbnB1dF91cGRhdGUKLSoKLSogRGVmaW5lIHRoZSBwYXJhbWV0ZXJzIGZvciBvdXRwdXQgcGxhbmUKLSovCi0vKiB0aGlzIGlzIHRoZSBkaW1lbnNpb24gb2YgUk9JLiAgd2lkdGggLyBoZWlnaHQuICovCi1zdHJ1Y3QgdnBlX3NyY19zaXplX3BhY2tlZCB7Ci0JdWludDMyX3QgICAgICAgIHNyY193OwotCXVpbnQzMl90ICAgICAgICBzcmNfaDsKLX07Ci0KLXN0cnVjdCB2cGVfc3JjX3h5X3BhY2tlZCB7Ci0JdWludDMyX3QgICAgICAgIHNyY194OwotCXVpbnQzMl90ICAgICAgICBzcmNfeTsKLX07Ci0KLXN0cnVjdCB2cGVfaW5wdXRfcGxhbmVfdXBkYXRlX3R5cGUgewotCXN0cnVjdCB2cGVfc3JjX3NpemVfcGFja2VkICAgICAgICAgICAgIHNyY19yb2lfc2l6ZTsKLQkvKiBjcm9wIHVwZGF0ZXMgdGhpcyBzZXQuICovCi0Jc3RydWN0IHZwZV9zcmNfeHlfcGFja2VkICAgICAgICAgICAgICAgc3JjX3JvaV9vZmZzZXQ7Ci0JLyogaW5wdXQgYWRkcmVzcyovCi0JdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAqc3JjX3AwX2FkZHI7Ci0JdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAqc3JjX3AxX2FkZHI7Ci19OwotCi1zdHJ1Y3QgdnBlX21zZ19zdGF0cyB7Ci0JdWludDMyX3QgICAgYnVmZmVyOwotCXVpbnQzMl90ICAgIGZyYW1lQ291bnRlcjsKLX07Ci0KLXN0cnVjdCB2cGVfbXNnX291dHB1dCB7Ci0JdWludDhfdCAgIG91dHB1dF9pZDsKLQl1aW50MzJfdCAgeUJ1ZmZlcjsKLQl1aW50MzJfdCAgY2JjckJ1ZmZlcjsKLQl1aW50MzJfdCAgZnJhbWVDb3VudGVyOwotfTsKLQotc3RydWN0IHZwZV9tZXNzYWdlIHsKLQl1aW50OF90ICBfZDsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB2cGVfbXNnX291dHB1dCAgICAgICAgICAgICAgbXNnT3V0OwotCQlzdHJ1Y3QgdnBlX21zZ19zdGF0cyAgICAgICAgICAgICAgIG1zZ1N0YXRzOwotCX0gX3U7Ci19OwotCi0jZGVmaW5lIFNDQUxFUl9QSEFTRV9CSVRTIDI5Ci0jZGVmaW5lIEhBTF9NRFBfUEhBU0VfU1RFUF8yUDUwICAgIDB4NTAwMDAwMDAKLSNkZWZpbmUgSEFMX01EUF9QSEFTRV9TVEVQXzFQNjYgICAgMHgzNTU1NTU1NQotI2RlZmluZSBIQUxfTURQX1BIQVNFX1NURVBfMVAyNSAgICAweDI4MDAwMDAwCi0KLXN0cnVjdCBwaGFzZV92YWxfdCB7Ci0JaW50MzJfdCBwaGFzZV9pbml0X3g7Ci0JaW50MzJfdCBwaGFzZV9pbml0X3k7Ci0JaW50MzJfdCBwaGFzZV9zdGVwX3g7Ci0JaW50MzJfdCBwaGFzZV9zdGVwX3k7Ci19OwotCi0jZW5kaWYgLypfTVNNX1ZQRV9IXyovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tc21fdnBlMS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV92cGUxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0OGY3YWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL21zbV92cGUxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDY5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMC0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgIm1zbV92cGUxLmgiCi0jaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bWFjaC9jbGsuaD4KLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLQotc3RhdGljIGludCB2cGVfZW5hYmxlKHVpbnQzMl90KTsKLXN0YXRpYyBpbnQgdnBlX2Rpc2FibGUodm9pZCk7Ci1zdGF0aWMgaW50IHZwZV91cGRhdGVfc2NhbGVyKHN0cnVjdCB2aWRlb19jcm9wX3QgKnBjcm9wKTsKLXN0YXRpYyBzdHJ1Y3QgdnBlX2RldmljZV90eXBlICB2cGVfZGV2aWNlX2RhdGE7Ci1zdGF0aWMgc3RydWN0IHZwZV9kZXZpY2VfdHlwZSAgKnZwZV9kZXZpY2U7Ci1zdHJ1Y3QgdnBlX2N0cmxfdHlwZSAgICAqdnBlX2N0cmw7Ci1jaGFyICp2cGVfZ2VuZXJhbF9jbWRbXSA9IHsKLQkiVlBFX0RVTU1ZXzAiLCAgLyogMCAqLwotCSJWUEVfU0VUX0NMSyIsCi0JIlZQRV9SRVNFVCIsCi0JIlZQRV9TVEFSVCIsCi0JIlZQRV9BQk9SVCIsCi0JIlZQRV9PUEVSQVRJT05fTU9ERV9DRkciLCAgLyogNSAqLwotCSJWUEVfSU5QVVRfUExBTkVfQ0ZHIiwKLQkiVlBFX09VVFBVVF9QTEFORV9DRkciLAotCSJWUEVfSU5QVVRfUExBTkVfVVBEQVRFIiwKLQkiVlBFX1NDQUxFX0NGR19UWVBFIiwKLQkiVlBFX1JPVEFUSU9OX0NGR19UWVBFIiwgIC8qIDEwICovCi0JIlZQRV9BWElfT1VUX0NGRyIsCi0JIlZQRV9DTURfRElTX09GRlNFVF9DRkciLAotCSJWUEVfRU5BQkxFIiwKLQkiVlBFX0RJU0FCTEUiLAotfTsKLXN0YXRpYyB1aW50MzJfdCBvcmlnX3NyY195LCBvcmlnX3NyY19jYmNyOwotCi0jZGVmaW5lIENIRUNLRURfQ09QWV9GUk9NX1VTRVIoaW4pIHsJCQkJCVwKLQlpZiAoY29weV9mcm9tX3VzZXIoKGluKSwgKHZvaWQgX191c2VyICopY21kLT52YWx1ZSwJCVwKLQkJCWNtZC0+bGVuZ3RoKSkgewkJCQkJXAotCQlyYyA9IC1FRkFVTFQ7CQkJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCX0JCQkJCQkJCVwKLX0KLQotI2RlZmluZSBtc21fZGVxdWV1ZV92cGUocXVldWUsIG1lbWJlcikgKHsJCQlcCi0JdW5zaWduZWQgbG9uZyBmbGFnczsJCQkJCVwKLQlzdHJ1Y3QgbXNtX2RldmljZV9xdWV1ZSAqX19xID0gKHF1ZXVlKTsJCQlcCi0Jc3RydWN0IG1zbV9xdWV1ZV9jbWQgKnFjbWQgPSAwOwkJCQlcCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJl9fcS0+bG9jaywgZmxhZ3MpOwkJCVwKLQlpZiAoIWxpc3RfZW1wdHkoJl9fcS0+bGlzdCkpIHsJCQkJXAotCQlfX3EtPmxlbi0tOwkJCQkJXAotCQlxY21kID0gbGlzdF9maXJzdF9lbnRyeSgmX19xLT5saXN0LAkJXAotCQkJCXN0cnVjdCBtc21fcXVldWVfY21kLCBtZW1iZXIpOwlcCi0JCWxpc3RfZGVsX2luaXQoJnFjbWQtPm1lbWJlcik7CQkJXAotCX0JCQkJCQkJXAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJl9fcS0+bG9jaywgZmxhZ3MpOwkJXAotCXFjbWQ7CQkJCQkJCVwKLX0pCi0KLS8qCi1zdGF0aWMgICBzdHJ1Y3QgdnBlX2NtZF90eXBlIHZwZV9jbWRbXSA9IHsKLQkJe1ZQRV9EVU1NWV8wLCAwfSwKLQkJe1ZQRV9TRVRfQ0xLLCAwfSwKLQkJe1ZQRV9SRVNFVCwgMH0sCi0JCXtWUEVfU1RBUlQsIDB9LAotCQl7VlBFX0FCT1JULCAwfSwKLQkJe1ZQRV9PUEVSQVRJT05fTU9ERV9DRkcsIFZQRV9PUEVSQVRJT05fTU9ERV9DRkdfTEVOfSwKLQkJe1ZQRV9JTlBVVF9QTEFORV9DRkcsIFZQRV9JTlBVVF9QTEFORV9DRkdfTEVOfSwKLQkJe1ZQRV9PVVRQVVRfUExBTkVfQ0ZHLCBWUEVfT1VUUFVUX1BMQU5FX0NGR19MRU59LAotCQl7VlBFX0lOUFVUX1BMQU5FX1VQREFURSwgVlBFX0lOUFVUX1BMQU5FX1VQREFURV9MRU59LAotCQl7VlBFX1NDQUxFX0NGR19UWVBFLCBWUEVfU0NBTEVSX0NPTkZJR19MRU59LAotCQl7VlBFX1JPVEFUSU9OX0NGR19UWVBFLCAwfSwKLQkJe1ZQRV9BWElfT1VUX0NGRywgMH0sCi0JCXtWUEVfQ01EX0RJU19PRkZTRVRfQ0ZHLCBWUEVfRElTX09GRlNFVF9DRkdfTEVOfSwKLX07Ci0qLwotCi1zdGF0aWMgbG9uZyBsb25nIHZwZV9kb19kaXYobG9uZyBsb25nIG51bSwgbG9uZyBsb25nIGRlbikKLXsKLQlkb19kaXYobnVtLCBkZW4pOwotCXJldHVybiBudW07Ci19Ci0KLXN0YXRpYyBpbnQgdnBlX3N0YXJ0KHZvaWQpCi17Ci0JLyogIGVuYWJsZSB0aGUgZnJhbWUgaXJxLCBiaXQgMCA9IERpc3BsYXkgbGlzdCAwIFJPSSBkb25lICovCi0JbXNtX2NhbWVyYV9pb193KDEsIHZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfSU5UUl9FTkFCTEVfT0ZGU0VUKTsKLQltc21fY2FtZXJhX2lvX2R1bXAodnBlX2RldmljZS0+dnBlYmFzZSArIDB4MTAwMDAsIDB4MjUwKTsKLQkvKiB0aGlzIHRyaWdnZXJzIHRoZSBvcGVyYXRpb24uICovCi0JbXNtX2NhbWVyYV9pb193KDEsIHZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfREwwX1NUQVJUX09GRlNFVCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCB2cGVfcmVzZXRfc3RhdGVfdmFyaWFibGVzKHZvaWQpCi17Ci0JLyogaW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZXMgZm9yIHN0YXRlIGNvbnRyb2wsIGV0Yy4qLwotCXZwZV9jdHJsLT5vcF9tb2RlID0gMDsKLQl2cGVfY3RybC0+c3RhdGUgPSBWUEVfU1RBVEVfSU5JVDsKLQlzcGluX2xvY2tfaW5pdCgmdnBlX2N0cmwtPnRhc2tsZXRfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnZwZV9jdHJsLT5zdGF0ZV9sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmdnBlX2N0cmwtPnRhc2tsZXRfcSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZwZV9jb25maWdfYXhpX2RlZmF1bHQodm9pZCkKLXsKLQltc21fY2FtZXJhX2lvX3coMHgyNSwgdnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9BWElfQVJCXzJfT0ZGU0VUKTsKLQotCUNEQkcoIiVzOiB5YWRkciAlbGQgY2JjcmFkZHIgJWxkIiwgX19mdW5jX18sCi0JCSB2cGVfY3RybC0+b3V0X3lfYWRkciwgdnBlX2N0cmwtPm91dF9jYmNyX2FkZHIpOwotCi0JaWYgKCF2cGVfY3RybC0+b3V0X3lfYWRkciB8fCAhdnBlX2N0cmwtPm91dF9jYmNyX2FkZHIpCi0JCXJldHVybjsKLQotCW1zbV9jYW1lcmFfaW9fdyh2cGVfY3RybC0+b3V0X3lfYWRkciwKLQkJdnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9PVVRQMF9BRERSX09GRlNFVCk7Ci0JLyogZm9yIHZpZGVvICBDYkNyIGFkZHJlc3MgKi8KLQltc21fY2FtZXJhX2lvX3codnBlX2N0cmwtPm91dF9jYmNyX2FkZHIsCi0JCXZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfT1VUUDFfQUREUl9PRkZTRVQpOwotCi19Ci0KLXN0YXRpYyBpbnQgdnBlX3Jlc2V0KHZvaWQpCi17Ci0JdWludDMyX3QgdnBlX3ZlcnNpb247Ci0JdWludDMyX3QgcmM7Ci0KLQl2cGVfcmVzZXRfc3RhdGVfdmFyaWFibGVzKCk7Ci0JdnBlX3ZlcnNpb24gPSBtc21fY2FtZXJhX2lvX3IoCi0JCQl2cGVfZGV2aWNlLT52cGViYXNlICsgVlBFX0hXX1ZFUlNJT05fT0ZGU0VUKTsKLQlDREJHKCJ2cGVfdmVyc2lvbiA9IDB4JXhcbiIsIHZwZV92ZXJzaW9uKTsKLQotCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMuKi8KLQltc21fY2FtZXJhX2lvX3coMCwgdnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9JTlRSX0VOQUJMRV9PRkZTRVQpOwotCS8qIGNsZWFyIGFsbCBwZW5kaW5nIGludGVycnVwdHMqLwotCW1zbV9jYW1lcmFfaW9fdygweDFmZmZmZiwgdnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9JTlRSX0NMRUFSX09GRlNFVCk7Ci0KLQkvKiB3cml0ZSBzd19yZXNldCB0byByZXNldCB0aGUgY29yZS4gKi8KLQltc21fY2FtZXJhX2lvX3coMHgxMCwgdnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9TV19SRVNFVF9PRkZTRVQpOwotCi0JLyogdGhlbiBwb2xsIHRoZSByZXNldCBiaXQsIGl0IHNob3VsZCBiZSBzZWxmLWNsZWFyZWQuICovCi0Jd2hpbGUgKDEpIHsKLQkJcmMgPSBtc21fY2FtZXJhX2lvX3IodnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9TV19SRVNFVF9PRkZTRVQpCi0JCQkJJiAweDEwOwotCQlpZiAocmMgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQotCS8qICBhdCB0aGlzIHBvaW50LCBoYXJkd2FyZSBpcyByZXNldC4gVGhlbiBwb2dyYW0gdG8gZGVmYXVsdAotCQl2YWx1ZXMuICovCi0JbXNtX2NhbWVyYV9pb193KFZQRV9BWElfUkRfQVJCX0NPTkZJR19WQUxVRSwKLQkJCXZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfQVhJX1JEX0FSQl9DT05GSUdfT0ZGU0VUKTsKLQotCW1zbV9jYW1lcmFfaW9fdyhWUEVfQ0dDX0VOQUJMRV9WQUxVRSwKLQkJCXZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfQ0dDX0VOX09GRlNFVCk7Ci0KLQltc21fY2FtZXJhX2lvX3coMSwgdnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9DTURfTU9ERV9PRkZTRVQpOwotCi0JbXNtX2NhbWVyYV9pb193KFZQRV9ERUZBVUxUX09QX01PREVfVkFMVUUsCi0JCQl2cGVfZGV2aWNlLT52cGViYXNlICsgVlBFX09QX01PREVfT0ZGU0VUKTsKLQotCW1zbV9jYW1lcmFfaW9fdyhWUEVfREVGQVVMVF9TQ0FMRV9DT05GSUcsCi0JCQl2cGVfZGV2aWNlLT52cGViYXNlICsgVlBFX1NDQUxFX0NPTkZJR19PRkZTRVQpOwotCi0JdnBlX2NvbmZpZ19heGlfZGVmYXVsdCgpOwotCXJldHVybiAwOwotfQotCi1pbnQgbXNtX3ZwZV9jZmdfdXBkYXRlKHZvaWQgKnBpbmZvKQotewotCXVpbnQzMl90ICByb3RfZmxhZywgcmMgPSAwOwotCXN0cnVjdCB2aWRlb19jcm9wX3QgKnBjcm9wID0gKHN0cnVjdCB2aWRlb19jcm9wX3QgKilwaW5mbzsKLQotCXJvdF9mbGFnID0gbXNtX2NhbWVyYV9pb19yKHZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJCQkJVlBFX09QX01PREVfT0ZGU0VUKSAmIDB4RTAwOwotCWlmIChwaW5mbyAhPSBOVUxMKSB7Ci0JCUNEQkcoIkNyb3AgaW5mbyBpbjJfdyA9ICVkLCBpbjJfaCA9ICVkICIKLQkJCSJvdXQyX2ggPSAlZCBvdXQyX3cgPSAlZCBcbiIsIHBjcm9wLT5pbjJfdywKLQkJCXBjcm9wLT5pbjJfaCwKLQkJCXBjcm9wLT5vdXQyX2gsIHBjcm9wLT5vdXQyX3cpOwotCQlyYyA9IHZwZV91cGRhdGVfc2NhbGVyKHBjcm9wKTsKLQl9Ci0JQ0RCRygicmV0dXJuIHJjID0gJWQgcm90X2ZsYWcgPSAlZFxuIiwgcmMsIHJvdF9mbGFnKTsKLQlyYyB8PSByb3RfZmxhZzsKLQotCXJldHVybiByYzsKLX0KLQotdm9pZCB2cGVfdXBkYXRlX3NjYWxlX2NvZWYodWludDMyX3QgKnApCi17Ci0JdWludDMyX3QgaSwgb2Zmc2V0OwotCW9mZnNldCA9ICpwOwotCWZvciAoaSA9IG9mZnNldDsgaSA8IChWUEVfU0NBTEVfQ09FRkZfTlVNICsgb2Zmc2V0KTsgaSsrKSB7Ci0JCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksCi0JCQl2cGVfZGV2aWNlLT52cGViYXNlICsgVlBFX1NDQUxFX0NPRUZGX0xTQm4oaSkpOwotCQltc21fY2FtZXJhX2lvX3coKigrK3ApLAotCQkJdnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9TQ0FMRV9DT0VGRl9NU0JuKGkpKTsKLQl9Ci19Ci0KLXZvaWQgdnBlX2lucHV0X3BsYW5lX2NvbmZpZyh1aW50MzJfdCAqcCkKLXsKLQltc21fY2FtZXJhX2lvX3coKnAsCi0JCXZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfU1JDX0ZPUk1BVF9PRkZTRVQpOwotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksCi0JCXZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfU1JDX1VOUEFDS19QQVRURVJOMV9PRkZTRVQpOwotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksCi0JCXZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfU1JDX0lNQUdFX1NJWkVfT0ZGU0VUKTsKLQltc21fY2FtZXJhX2lvX3coKigrK3ApLAotCQl2cGVfZGV2aWNlLT52cGViYXNlICsgVlBFX1NSQ19ZU1RSSURFMV9PRkZTRVQpOwotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksCi0JCXZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfU1JDX1NJWkVfT0ZGU0VUKTsKLQl2cGVfY3RybC0+aW5faF93ID0gKnA7Ci0JbXNtX2NhbWVyYV9pb193KCooKytwKSwKLQkJdnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9TUkNfWFlfT0ZGU0VUKTsKLX0KLQotdm9pZCB2cGVfb3V0cHV0X3BsYW5lX2NvbmZpZyh1aW50MzJfdCAqcCkKLXsKLQltc21fY2FtZXJhX2lvX3coKnAsCi0JCXZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfT1VUX0ZPUk1BVF9PRkZTRVQpOwotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksCi0JCXZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfT1VUX1BBQ0tfUEFUVEVSTjFfT0ZGU0VUKTsKLQltc21fY2FtZXJhX2lvX3coKigrK3ApLAotCQl2cGVfZGV2aWNlLT52cGViYXNlICsgVlBFX09VVF9ZU1RSSURFMV9PRkZTRVQpOwotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksCi0JCXZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfT1VUX1NJWkVfT0ZGU0VUKTsKLQltc21fY2FtZXJhX2lvX3coKigrK3ApLAotCQl2cGVfZGV2aWNlLT52cGViYXNlICsgVlBFX09VVF9YWV9PRkZTRVQpOwotCXZwZV9jdHJsLT5wY2Jjcl9kaXNfb2Zmc2V0ID0gKigrK3ApOwotfQotCi1zdGF0aWMgaW50IHZwZV9vcGVyYXRpb25fY29uZmlnKHVpbnQzMl90ICpwKQotewotCXVpbnQzMl90ICBvdXR3LCBvdXRoLCB0ZW1wOwotCW1zbV9jYW1lcmFfaW9fdygqcCwgdnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9PUF9NT0RFX09GRlNFVCk7Ci0KLQl0ZW1wID0gbXNtX2NhbWVyYV9pb19yKHZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfT1VUX1NJWkVfT0ZGU0VUKTsKLQlvdXR3ID0gdGVtcCAmIDB4RkZGOwotCW91dGggPSAodGVtcCAmIDB4RkZGMDAwMCkgPj4gMTY7Ci0KLQlpZiAoKnArKyAmIDB4RTAwKSB7Ci0JCS8qIHJvdGF0aW9uIGVuYWJsZWQuICovCi0JCXZwZV9jdHJsLT5vdXRfdyA9IG91dGg7Ci0JCXZwZV9jdHJsLT5vdXRfaCA9IG91dHc7Ci0JfSBlbHNlIHsKLQkJdnBlX2N0cmwtPm91dF93ID0gb3V0dzsKLQkJdnBlX2N0cmwtPm91dF9oID0gb3V0aDsKLQl9Ci0JdnBlX2N0cmwtPmRpc19lbiA9ICpwOwotCXJldHVybiAwOwotfQotCi0vKiBMYXRlciB3ZSBjYW4gc2VwYXJhdGUgdGhlIHJvdGF0aW9uIGFuZCBzY2FsZXIgY2FsYy4gSWYKLSogIHJvdGF0aW9uIGlzIGVuYWJsZWQsIHNpbXBseSBzd2FwIHRoZSBkZXN0aW5hdGlvbiBkaW1lbnNpb24uCi0qICBBbmQgdGhlbiBwYXNzIHRoZSBhbHJlYWR5IHN3YXBwZWQgb3V0cHV0IHNpemUgdG8gdGhpcwotKiAgZnVuY3Rpb24uICovCi1zdGF0aWMgaW50IHZwZV91cGRhdGVfc2NhbGVyKHN0cnVjdCB2aWRlb19jcm9wX3QgKnBjcm9wKQotewotCXVpbnQzMl90IG91dF9ST0lfd2lkdGgsIG91dF9ST0lfaGVpZ2h0OwotCXVpbnQzMl90IHNyY19ST0lfd2lkdGgsIHNyY19ST0lfaGVpZ2h0OwotCi0JdWludDMyX3QgcmMgPSAwOyAgLyogZGVmYXVsdCB0byBubyB6b29tLiAqLwotCS8qCi0JKiBwaGFzZV9zdGVwX3gsIHBoYXNlX3N0ZXBfeSwgcGhhc2VfaW5pdF94IGFuZCBwaGFzZV9pbml0X3kKLQkqIGFyZSByZXByZXNlbnRlZCBpbiBmaXhlZC1wb2ludCwgdW5zaWduZWQgMy4yOSBmb3JtYXQKLQkqLwotCXVpbnQzMl90IHBoYXNlX3N0ZXBfeCA9IDA7Ci0JdWludDMyX3QgcGhhc2Vfc3RlcF95ID0gMDsKLQl1aW50MzJfdCBwaGFzZV9pbml0X3ggPSAwOwotCXVpbnQzMl90IHBoYXNlX2luaXRfeSA9IDA7Ci0KLQl1aW50MzJfdCBzcmNfcm9pLCBzcmNfeCwgc3JjX3ksIHNyY194eSwgdGVtcDsKLQl1aW50MzJfdCB5c2NhbGVfZmlsdGVyX3NlbCwgeHNjYWxlX2ZpbHRlcl9zZWw7Ci0JdWludDMyX3Qgc2NhbGVfdW5pdF9zZWxfeCwgc2NhbGVfdW5pdF9zZWxfeTsKLQl1aW50NjRfdCBudW1lcmF0b3IsIGRlbm9taW5hdG9yOwotCi0JaWYgKChwY3JvcC0+aW4yX3cgPj0gcGNyb3AtPm91dDJfdykgJiYKLQkJKHBjcm9wLT5pbjJfaCA+PSBwY3JvcC0+b3V0Ml9oKSkgewotCQlDREJHKCIgPT09PT09PVZQRSBubyB6b29tIG5lZWRlZC5cbiIpOwotCi0JCXRlbXAgPSBtc21fY2FtZXJhX2lvX3IodnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9PUF9NT0RFX09GRlNFVCkKLQkJJiAweGZmZmZmZmZjOwotCQltc21fY2FtZXJhX2lvX3codGVtcCwgdnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9PUF9NT0RFX09GRlNFVCk7Ci0KLQotCQltc21fY2FtZXJhX2lvX3coMCwgdnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9TUkNfWFlfT0ZGU0VUKTsKLQotCQlDREJHKCJ2cGVfY3RybC0+aW5faF93ID0gJWRcbiIsIHZwZV9jdHJsLT5pbl9oX3cpOwotCQltc21fY2FtZXJhX2lvX3codnBlX2N0cmwtPmluX2hfdyAsIHZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJCVZQRV9TUkNfU0laRV9PRkZTRVQpOwotCi0JCXJldHVybiByYzsKLQl9Ci0JLyogSWYgZmFsbCB0aHJvdWdoIHRoZW4gc2NhbGVyIGlzIG5lZWRlZC4qLwotCi0JQ0RCRygiPT09PT09PT1WUEUgem9vbSBuZWVkZWQuXG4iKTsKLQkvKiBhc3N1bXB0aW9uIGlzIGJvdGggZGlyZWN0aW9uIG5lZWQgem9vbS4gdGhpcyBjYW4gYmUKLQlpbXByb3ZlZC4gKi8KLQl0ZW1wID0KLQkJbXNtX2NhbWVyYV9pb19yKHZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfT1BfTU9ERV9PRkZTRVQpIHwgMHgzOwotCW1zbV9jYW1lcmFfaW9fdyh0ZW1wLCB2cGVfZGV2aWNlLT52cGViYXNlICsgVlBFX09QX01PREVfT0ZGU0VUKTsKLQotCXNyY19ST0lfd2lkdGggPSBwY3JvcC0+aW4yX3c7Ci0Jc3JjX1JPSV9oZWlnaHQgPSBwY3JvcC0+aW4yX2g7Ci0Jb3V0X1JPSV93aWR0aCA9IHBjcm9wLT5vdXQyX3c7Ci0Jb3V0X1JPSV9oZWlnaHQgPSBwY3JvcC0+b3V0Ml9oOwotCi0JQ0RCRygic3JjIHcgPSAweCV4LCBoPTB4JXgsIGRzdCB3ID0gMHgleCwgaCA9MHgleC5cbiIsCi0JCXNyY19ST0lfd2lkdGgsIHNyY19ST0lfaGVpZ2h0LCBvdXRfUk9JX3dpZHRoLAotCQlvdXRfUk9JX2hlaWdodCk7Ci0Jc3JjX3JvaSA9IChzcmNfUk9JX2hlaWdodCA8PCAxNikgKyBzcmNfUk9JX3dpZHRoOwotCi0JbXNtX2NhbWVyYV9pb193KHNyY19yb2ksIHZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfU1JDX1NJWkVfT0ZGU0VUKTsKLQotCXNyY194ID0gKG91dF9ST0lfd2lkdGggLSBzcmNfUk9JX3dpZHRoKS8yOwotCXNyY195ID0gKG91dF9ST0lfaGVpZ2h0IC0gc3JjX1JPSV9oZWlnaHQpLzI7Ci0KLQlDREJHKCJzcmNfeCA9ICVkLCBzcmNfeT0lZC5cbiIsIHNyY194LCBzcmNfeSk7Ci0KLQlzcmNfeHkgPSBzcmNfeSooMTw8MTYpICsgc3JjX3g7Ci0JbXNtX2NhbWVyYV9pb193KHNyY194eSwgdnBlX2RldmljZS0+dnBlYmFzZSArCi0JCQlWUEVfU1JDX1hZX09GRlNFVCk7Ci0JQ0RCRygic3JjX3h5ID0gJWQsIHNyY19yb2k9JWQuXG4iLCBzcmNfeHksIHNyY19yb2kpOwotCi0JLyogZGVjaWRlIHdoZXRoZXIgdG8gdXNlIEZJUiBvciBNL04gZm9yIHNjYWxpbmcgKi8KLQlpZiAoKG91dF9ST0lfd2lkdGggPT0gMSAmJiBzcmNfUk9JX3dpZHRoIDwgNCkgfHwKLQkJKHNyY19ST0lfd2lkdGggPCA0ICogb3V0X1JPSV93aWR0aCAtIDMpKQotCQlzY2FsZV91bml0X3NlbF94ID0gMDsvKiB1c2UgRklSIHNjYWxhciAqLwotCWVsc2UKLQkJc2NhbGVfdW5pdF9zZWxfeCA9IDE7LyogdXNlIE0vTiBzY2FsYXIgKi8KLQotCWlmICgob3V0X1JPSV9oZWlnaHQgPT0gMSAmJiBzcmNfUk9JX2hlaWdodCA8IDQpIHx8Ci0JCShzcmNfUk9JX2hlaWdodCA8IDQgKiBvdXRfUk9JX2hlaWdodCAtIDMpKQotCQlzY2FsZV91bml0X3NlbF95ID0gMDsvKiB1c2UgRklSIHNjYWxhciAqLwotCWVsc2UKLQkJc2NhbGVfdW5pdF9zZWxfeSA9IDE7LyogdXNlIE0vTiBzY2FsYXIgKi8KLQotCS8qIGNhbGN1bGF0ZSBwaGFzZSBzdGVwIGZvciB0aGUgeCBkaXJlY3Rpb24gKi8KLQotCS8qIGlmIGRlc3RpbmF0aW9uIGlzIG9ubHkgMSBwaXhlbCB3aWRlLAotCXRoZSB2YWx1ZSBvZiBwaGFzZV9zdGVwX3gKLQlpcyB1bmltcG9ydGFudC4gQXNzaWduaW5nIHBoYXNlX3N0ZXBfeCB0bwotCXNyYyBST0kgd2lkdGggYXMgYW4gYXJiaXRyYXJ5IHZhbHVlLiAqLwotCWlmIChvdXRfUk9JX3dpZHRoID09IDEpCi0JCXBoYXNlX3N0ZXBfeCA9ICh1aW50MzJfdCkgKChzcmNfUk9JX3dpZHRoKSA8PAotCQkJCQkJU0NBTEVSX1BIQVNFX0JJVFMpOwotCi0JCS8qIGlmIHVzaW5nIEZJUiBzY2FsYXIgKi8KLQllbHNlIGlmIChzY2FsZV91bml0X3NlbF94ID09IDApIHsKLQotCQkvKiBDYWxjdWxhdGUgdGhlIHF1b3RpZW50ICggc3JjX1JPSV93aWR0aCAtIDEgKQotCQkvICggb3V0X1JPSV93aWR0aCAtIDEpCi0JCXdpdGggdTMuMjkgcHJlY2lzaW9uLiBRdW90aWVudCBpcyByb3VuZGVkIHVwIHRvCi0JCXRoZSBsYXJnZXIgMjl0aCBkZWNpbWFsIHBvaW50LiAqLwotCQludW1lcmF0b3IgPSAodWludDY0X3QpKHNyY19ST0lfd2lkdGggLSAxKSA8PAotCQkJU0NBTEVSX1BIQVNFX0JJVFM7Ci0JCS8qIG5ldmVyIGVxdWFscyB0byAwIGJlY2F1c2Ugb2YgdGhlCi0JCSIob3V0X1JPSV93aWR0aCA9PSAxICkiKi8KLQkJZGVub21pbmF0b3IgPSAodWludDY0X3QpKG91dF9ST0lfd2lkdGggLSAxKTsKLQkJLyogZGl2aWRlIGFuZCByb3VuZCB1cCB0byB0aGUgbGFyZ2VyIDI5dGgKLQkJZGVjaW1hbCBwb2ludC4gKi8KLQkJcGhhc2Vfc3RlcF94ID0gKHVpbnQzMl90KSB2cGVfZG9fZGl2KChudW1lcmF0b3IgKwotCQkJCQlkZW5vbWluYXRvciAtIDEpLCBkZW5vbWluYXRvcik7Ci0JfSBlbHNlIGlmIChzY2FsZV91bml0X3NlbF94ID09IDEpIHsgLyogaWYgTS9OIHNjYWxhciAqLwotCQkvKiBDYWxjdWxhdGUgdGhlIHF1b3RpZW50ICggc3JjX1JPSV93aWR0aCApIC8KLQkJKCBvdXRfUk9JX3dpZHRoKQotCQl3aXRoIHUzLjI5IHByZWNpc2lvbi4gUXVvdGllbnQgaXMgcm91bmRlZCBkb3duIHRvIHRoZQotCQlzbWFsbGVyIDI5dGggZGVjaW1hbCBwb2ludC4gKi8KLQkJbnVtZXJhdG9yID0gKHVpbnQ2NF90KShzcmNfUk9JX3dpZHRoKSA8PAotCQkJU0NBTEVSX1BIQVNFX0JJVFM7Ci0JCWRlbm9taW5hdG9yID0gKHVpbnQ2NF90KShvdXRfUk9JX3dpZHRoKTsKLQkJcGhhc2Vfc3RlcF94ID0KLQkJCSh1aW50MzJfdCkgdnBlX2RvX2RpdihudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKLQl9Ci0JLyogY2FsY3VsYXRlIHBoYXNlIHN0ZXAgZm9yIHRoZSB5IGRpcmVjdGlvbiAqLwotCi0JLyogaWYgZGVzdGluYXRpb24gaXMgb25seSAxIHBpeGVsIHdpZGUsIHRoZSB2YWx1ZSBvZgotCQlwaGFzZV9zdGVwX3ggaXMgdW5pbXBvcnRhbnQuIEFzc2lnbmluZyBwaGFzZV9zdGVwX3gKLQkJdG8gc3JjIFJPSSB3aWR0aCBhcyBhbiBhcmJpdHJhcnkgdmFsdWUuICovCi0JaWYgKG91dF9ST0lfaGVpZ2h0ID09IDEpCi0JCXBoYXNlX3N0ZXBfeSA9Ci0JCSh1aW50MzJfdCkgKChzcmNfUk9JX2hlaWdodCkgPDwgU0NBTEVSX1BIQVNFX0JJVFMpOwotCi0JLyogaWYgRklSIHNjYWxhciAqLwotCWVsc2UgaWYgKHNjYWxlX3VuaXRfc2VsX3kgPT0gMCkgewotCQkvKiBDYWxjdWxhdGUgdGhlIHF1b3RpZW50ICggc3JjX1JPSV9oZWlnaHQgLSAxICkgLwotCQkoIG91dF9ST0lfaGVpZ2h0IC0gMSkKLQkJd2l0aCB1My4yOSBwcmVjaXNpb24uIFF1b3RpZW50IGlzIHJvdW5kZWQgdXAgdG8gdGhlCi0JCWxhcmdlciAyOXRoIGRlY2ltYWwgcG9pbnQuICovCi0JCW51bWVyYXRvciA9ICh1aW50NjRfdCkoc3JjX1JPSV9oZWlnaHQgLSAxKSA8PAotCQkJU0NBTEVSX1BIQVNFX0JJVFM7Ci0JCS8qIG5ldmVyIGVxdWFscyB0byAwIGJlY2F1c2Ugb2YgdGhlICIKLQkJKCBvdXRfUk9JX2hlaWdodCA9PSAxICkiIGNhc2UgKi8KLQkJZGVub21pbmF0b3IgPSAodWludDY0X3QpKG91dF9ST0lfaGVpZ2h0IC0gMSk7Ci0JCS8qIFF1b3RpZW50IGlzIHJvdW5kZWQgdXAgdG8gdGhlIGxhcmdlcgotCQkyOXRoIGRlY2ltYWwgcG9pbnQuICovCi0JCXBoYXNlX3N0ZXBfeSA9Ci0JCSh1aW50MzJfdCkgdnBlX2RvX2RpdigKLQkJCShudW1lcmF0b3IgKyBkZW5vbWluYXRvciAtIDEpLCBkZW5vbWluYXRvcik7Ci0JfSBlbHNlIGlmIChzY2FsZV91bml0X3NlbF95ID09IDEpIHsgLyogaWYgTS9OIHNjYWxhciAqLwotCQkvKiBDYWxjdWxhdGUgdGhlIHF1b3RpZW50ICggc3JjX1JPSV9oZWlnaHQgKQotCQkvICggb3V0X1JPSV9oZWlnaHQpCi0JCXdpdGggdTMuMjkgcHJlY2lzaW9uLiBRdW90aWVudCBpcyByb3VuZGVkIGRvd24KLQkJdG8gdGhlIHNtYWxsZXIgMjl0aCBkZWNpbWFsIHBvaW50LiAqLwotCQludW1lcmF0b3IgPSAodWludDY0X3QpKHNyY19ST0lfaGVpZ2h0KSA8PAotCQkJU0NBTEVSX1BIQVNFX0JJVFM7Ci0JCWRlbm9taW5hdG9yID0gKHVpbnQ2NF90KShvdXRfUk9JX2hlaWdodCk7Ci0JCXBoYXNlX3N0ZXBfeSA9ICh1aW50MzJfdCkgdnBlX2RvX2RpdigKLQkJCW51bWVyYXRvciwgZGVub21pbmF0b3IpOwotCX0KLQotCS8qIGRlY2lkZSB3aGljaCBzZXQgb2YgRklSIGNvZWZmaWNpZW50cyB0byB1c2UgKi8KLQlpZiAocGhhc2Vfc3RlcF94ID4gSEFMX01EUF9QSEFTRV9TVEVQXzJQNTApCi0JCXhzY2FsZV9maWx0ZXJfc2VsID0gMDsKLQllbHNlIGlmIChwaGFzZV9zdGVwX3ggPiBIQUxfTURQX1BIQVNFX1NURVBfMVA2NikKLQkJeHNjYWxlX2ZpbHRlcl9zZWwgPSAxOwotCWVsc2UgaWYgKHBoYXNlX3N0ZXBfeCA+IEhBTF9NRFBfUEhBU0VfU1RFUF8xUDI1KQotCQl4c2NhbGVfZmlsdGVyX3NlbCA9IDI7Ci0JZWxzZQotCQl4c2NhbGVfZmlsdGVyX3NlbCA9IDM7Ci0KLQlpZiAocGhhc2Vfc3RlcF95ID4gSEFMX01EUF9QSEFTRV9TVEVQXzJQNTApCi0JCXlzY2FsZV9maWx0ZXJfc2VsID0gMDsKLQllbHNlIGlmIChwaGFzZV9zdGVwX3kgPiBIQUxfTURQX1BIQVNFX1NURVBfMVA2NikKLQkJeXNjYWxlX2ZpbHRlcl9zZWwgPSAxOwotCWVsc2UgaWYgKHBoYXNlX3N0ZXBfeSA+IEhBTF9NRFBfUEhBU0VfU1RFUF8xUDI1KQotCQl5c2NhbGVfZmlsdGVyX3NlbCA9IDI7Ci0JZWxzZQotCQl5c2NhbGVfZmlsdGVyX3NlbCA9IDM7Ci0KLQkvKiBjYWxjdWxhdGUgcGhhc2UgaW5pdCBmb3IgdGhlIHggZGlyZWN0aW9uICovCi0KLQkvKiBpZiB1c2luZyBGSVIgc2NhbGFyICovCi0JaWYgKHNjYWxlX3VuaXRfc2VsX3ggPT0gMCkgewotCQlpZiAob3V0X1JPSV93aWR0aCA9PSAxKQotCQkJcGhhc2VfaW5pdF94ID0KLQkJCQkodWludDMyX3QpICgoc3JjX1JPSV93aWR0aCAtIDEpIDw8Ci0JCQkJCQkJU0NBTEVSX1BIQVNFX0JJVFMpOwotCQllbHNlCi0JCQlwaGFzZV9pbml0X3ggPSAwOwotCX0gZWxzZSBpZiAoc2NhbGVfdW5pdF9zZWxfeCA9PSAxKSAvKiBNIG92ZXIgTiBzY2FsYXIgICovCi0JCXBoYXNlX2luaXRfeCA9IDA7Ci0KLQkvKiBjYWxjdWxhdGUgcGhhc2UgaW5pdCBmb3IgdGhlIHkgZGlyZWN0aW9uCi0JaWYgdXNpbmcgRklSIHNjYWxhciAqLwotCWlmIChzY2FsZV91bml0X3NlbF95ID09IDApIHsKLQkJaWYgKG91dF9ST0lfaGVpZ2h0ID09IDEpCi0JCQlwaGFzZV9pbml0X3kgPQotCQkJKHVpbnQzMl90KSAoKHNyY19ST0lfaGVpZ2h0IC0KLQkJCQkJCTEpIDw8IFNDQUxFUl9QSEFTRV9CSVRTKTsKLQkJZWxzZQotCQkJcGhhc2VfaW5pdF95ID0gMDsKLQl9IGVsc2UgaWYgKHNjYWxlX3VuaXRfc2VsX3kgPT0gMSkgLyogTSBvdmVyIE4gc2NhbGFyICAgKi8KLQkJcGhhc2VfaW5pdF95ID0gMDsKLQotCUNEQkcoInBoYXNlIHN0ZXAgeCA9ICVkLCBzdGVwIHkgPSAlZC5cbiIsCi0JCSBwaGFzZV9zdGVwX3gsIHBoYXNlX3N0ZXBfeSk7Ci0JQ0RCRygicGhhc2UgaW5pdCB4ID0gJWQsIGluaXQgeSA9ICVkLlxuIiwKLQkJIHBoYXNlX2luaXRfeCwgcGhhc2VfaW5pdF95KTsKLQotCW1zbV9jYW1lcmFfaW9fdyhwaGFzZV9zdGVwX3gsIHZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJVlBFX1NDQUxFX1BIQVNFWF9TVEVQX09GRlNFVCk7Ci0JbXNtX2NhbWVyYV9pb193KHBoYXNlX3N0ZXBfeSwgdnBlX2RldmljZS0+dnBlYmFzZSArCi0JCQlWUEVfU0NBTEVfUEhBU0VZX1NURVBfT0ZGU0VUKTsKLQotCW1zbV9jYW1lcmFfaW9fdyhwaGFzZV9pbml0X3gsIHZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJVlBFX1NDQUxFX1BIQVNFWF9JTklUX09GRlNFVCk7Ci0KLQltc21fY2FtZXJhX2lvX3cocGhhc2VfaW5pdF95LCB2cGVfZGV2aWNlLT52cGViYXNlICsKLQkJCVZQRV9TQ0FMRV9QSEFTRVlfSU5JVF9PRkZTRVQpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgdnBlX3VwZGF0ZV9zY2FsZXJfd2l0aF9kaXMoc3RydWN0IHZpZGVvX2Nyb3BfdCAqcGNyb3AsCi0JCQkJc3RydWN0IGRpc19vZmZzZXRfdHlwZSAqZGlzX29mZnNldCkKLXsKLQl1aW50MzJfdCBvdXRfUk9JX3dpZHRoLCBvdXRfUk9JX2hlaWdodDsKLQl1aW50MzJfdCBzcmNfUk9JX3dpZHRoLCBzcmNfUk9JX2hlaWdodDsKLQotCXVpbnQzMl90IHJjID0gMDsgIC8qIGRlZmF1bHQgdG8gbm8gem9vbS4gKi8KLQkvKgotCSogcGhhc2Vfc3RlcF94LCBwaGFzZV9zdGVwX3ksIHBoYXNlX2luaXRfeCBhbmQgcGhhc2VfaW5pdF95Ci0JKiBhcmUgcmVwcmVzZW50ZWQgaW4gZml4ZWQtcG9pbnQsIHVuc2lnbmVkIDMuMjkgZm9ybWF0Ci0JKi8KLQl1aW50MzJfdCBwaGFzZV9zdGVwX3ggPSAwOwotCXVpbnQzMl90IHBoYXNlX3N0ZXBfeSA9IDA7Ci0JdWludDMyX3QgcGhhc2VfaW5pdF94ID0gMDsKLQl1aW50MzJfdCBwaGFzZV9pbml0X3kgPSAwOwotCi0JdWludDMyX3Qgc3JjX3JvaSwgdGVtcDsKLQlpbnQzMl90ICBzcmNfeCwgc3JjX3ksIHNyY194eTsKLQl1aW50MzJfdCB5c2NhbGVfZmlsdGVyX3NlbCwgeHNjYWxlX2ZpbHRlcl9zZWw7Ci0JdWludDMyX3Qgc2NhbGVfdW5pdF9zZWxfeCwgc2NhbGVfdW5pdF9zZWxfeTsKLQl1aW50NjRfdCBudW1lcmF0b3IsIGRlbm9taW5hdG9yOwotCWludDMyX3QgIHpvb21fZGlzX3gsIHpvb21fZGlzX3k7Ci0KLQlDREJHKCIlczogcGNyb3AtPmluMl93ID0gJWQsIHBjcm9wLT5pbjJfaCA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIHBjcm9wLT5pbjJfdywgcGNyb3AtPmluMl9oKTsKLQlDREJHKCIlczogcGNyb3AtPm91dDJfdyA9ICVkLCBwY3JvcC0+b3V0Ml9oID0gJWRcbiIsIF9fZnVuY19fLAotCQkgcGNyb3AtPm91dDJfdywgcGNyb3AtPm91dDJfaCk7Ci0KLQlpZiAoKHBjcm9wLT5pbjJfdyA+PSBwY3JvcC0+b3V0Ml93KSAmJgotCQkocGNyb3AtPmluMl9oID49IHBjcm9wLT5vdXQyX2gpKSB7Ci0JCUNEQkcoIiA9PT09PT09VlBFIG5vIHpvb20gbmVlZGVkLCBESVMgaXMgc3RpbGwgZW5hYmxlZC5cbiIpOwotCi0JCXRlbXAgPSBtc21fY2FtZXJhX2lvX3IodnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9PUF9NT0RFX09GRlNFVCkKLQkJJiAweGZmZmZmZmZjOwotCQltc21fY2FtZXJhX2lvX3codGVtcCwgdnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9PUF9NT0RFX09GRlNFVCk7Ci0KLQkJLyogbm8gem9vbSwgdXNlIGRpcyBvZmZzZXQgZGlyZWN0bHkuICovCi0JCXNyY194eSA9IGRpc19vZmZzZXQtPmRpc19vZmZzZXRfeSAqICgxPDwxNikgKwotCQkJZGlzX29mZnNldC0+ZGlzX29mZnNldF94OwotCi0JCW1zbV9jYW1lcmFfaW9fdyhzcmNfeHksCi0JCQl2cGVfZGV2aWNlLT52cGViYXNlICsgVlBFX1NSQ19YWV9PRkZTRVQpOwotCi0JCUNEQkcoInZwZV9jdHJsLT5pbl9oX3cgPSAweCV4XG4iLCB2cGVfY3RybC0+aW5faF93KTsKLQkJbXNtX2NhbWVyYV9pb193KHZwZV9jdHJsLT5pbl9oX3csCi0JCQl2cGVfZGV2aWNlLT52cGViYXNlICsgVlBFX1NSQ19TSVpFX09GRlNFVCk7Ci0JCXJldHVybiByYzsKLQl9Ci0JLyogSWYgZmFsbCB0aHJvdWdoIHRoZW4gc2NhbGVyIGlzIG5lZWRlZC4qLwotCi0JQ0RCRygiPT09PT09PT1WUEUgem9vbSBuZWVkZWQgKyBESVMgZW5hYmxlZC5cbiIpOwotCS8qIGFzc3VtcHRpb24gaXMgYm90aCBkaXJlY3Rpb24gbmVlZCB6b29tLiB0aGlzIGNhbiBiZQotCSBpbXByb3ZlZC4gKi8KLQl0ZW1wID0gbXNtX2NhbWVyYV9pb19yKHZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJCQlWUEVfT1BfTU9ERV9PRkZTRVQpIHwgMHgzOwotCW1zbV9jYW1lcmFfaW9fdyh0ZW1wLCB2cGVfZGV2aWNlLT52cGViYXNlICsKLQkJCVZQRV9PUF9NT0RFX09GRlNFVCk7Ci0Jem9vbV9kaXNfeCA9IGRpc19vZmZzZXQtPmRpc19vZmZzZXRfeCAqCi0JCXBjcm9wLT5pbjJfdyAvIHBjcm9wLT5vdXQyX3c7Ci0Jem9vbV9kaXNfeSA9IGRpc19vZmZzZXQtPmRpc19vZmZzZXRfeSAqCi0JCXBjcm9wLT5pbjJfaCAvIHBjcm9wLT5vdXQyX2g7Ci0KLQlzcmNfeCA9IHpvb21fZGlzX3ggKyAocGNyb3AtPm91dDJfdy1wY3JvcC0+aW4yX3cpLzI7Ci0Jc3JjX3kgPSB6b29tX2Rpc195ICsgKHBjcm9wLT5vdXQyX2gtcGNyb3AtPmluMl9oKS8yOwotCi0Jb3V0X1JPSV93aWR0aCA9IHZwZV9jdHJsLT5vdXRfdzsKLQlvdXRfUk9JX2hlaWdodCA9IHZwZV9jdHJsLT5vdXRfaDsKLQotCXNyY19ST0lfd2lkdGggPSBvdXRfUk9JX3dpZHRoICogcGNyb3AtPmluMl93IC8gcGNyb3AtPm91dDJfdzsKLQlzcmNfUk9JX2hlaWdodCA9IG91dF9ST0lfaGVpZ2h0ICogcGNyb3AtPmluMl9oIC8gcGNyb3AtPm91dDJfaDsKLQotCS8qIGNsYW1wIHRvIG91dHB1dCBzaXplLiAgVGhpcyBpcyBiZWNhdXNlIGFsb25nCi0JcHJvY2Vzc2luZywgd2UgbW9zdGx5IGRvIHRydW5jYXRpb24sIHRoZXJlZm9yZQotCWRpc19vZmZzZXQgdGVuZHMgdG8gYmUKLQlzbWFsbGVyIHZhbHVlcy4gIFRoZSBpbnRlbnRpb24gd2FzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQotCW9mZnNldCBkb2VzIG5vdCBleGNlZWQgbWFyZ2luLiAgIEJ1dCBpbiB0aGUgY2FzZSBpdCBjb3VsZAotCXJlc3VsdCBzcmNfcm9pIGJpZ2dlciwgZHVlIHRvIHN1YnRyYWN0IGEgc21hbGxlciB2YWx1ZS4gKi8KLQlDREJHKCJzcmMgdyA9IDB4JXgsIGg9MHgleCwgZHN0IHcgPSAweCV4LCBoID0weCV4LlxuIiwKLQkJc3JjX1JPSV93aWR0aCwgc3JjX1JPSV9oZWlnaHQsIG91dF9ST0lfd2lkdGgsCi0JCW91dF9ST0lfaGVpZ2h0KTsKLQotCXNyY19yb2kgPSAoc3JjX1JPSV9oZWlnaHQgPDwgMTYpICsgc3JjX1JPSV93aWR0aDsKLQotCW1zbV9jYW1lcmFfaW9fdyhzcmNfcm9pLCB2cGVfZGV2aWNlLT52cGViYXNlICsgVlBFX1NSQ19TSVpFX09GRlNFVCk7Ci0KLQlDREJHKCJzcmNfeCA9ICVkLCBzcmNfeT0lZC5cbiIsIHNyY194LCBzcmNfeSk7Ci0KLQlzcmNfeHkgPSBzcmNfeSooMTw8MTYpICsgc3JjX3g7Ci0JbXNtX2NhbWVyYV9pb193KHNyY194eSwgdnBlX2RldmljZS0+dnBlYmFzZSArCi0JCQlWUEVfU1JDX1hZX09GRlNFVCk7Ci0JQ0RCRygic3JjX3h5ID0gMHgleCwgc3JjX3JvaT0weCV4LlxuIiwgc3JjX3h5LCBzcmNfcm9pKTsKLQotCS8qIGRlY2lkZSB3aGV0aGVyIHRvIHVzZSBGSVIgb3IgTS9OIGZvciBzY2FsaW5nICovCi0JaWYgKChvdXRfUk9JX3dpZHRoID09IDEgJiYgc3JjX1JPSV93aWR0aCA8IDQpIHx8Ci0JCShzcmNfUk9JX3dpZHRoIDwgNCAqIG91dF9ST0lfd2lkdGggLSAzKSkKLQkJc2NhbGVfdW5pdF9zZWxfeCA9IDA7LyogdXNlIEZJUiBzY2FsYXIgKi8KLQllbHNlCi0JCXNjYWxlX3VuaXRfc2VsX3ggPSAxOy8qIHVzZSBNL04gc2NhbGFyICovCi0KLQlpZiAoKG91dF9ST0lfaGVpZ2h0ID09IDEgJiYgc3JjX1JPSV9oZWlnaHQgPCA0KSB8fAotCQkoc3JjX1JPSV9oZWlnaHQgPCA0ICogb3V0X1JPSV9oZWlnaHQgLSAzKSkKLQkJc2NhbGVfdW5pdF9zZWxfeSA9IDA7LyogdXNlIEZJUiBzY2FsYXIgKi8KLQllbHNlCi0JCXNjYWxlX3VuaXRfc2VsX3kgPSAxOy8qIHVzZSBNL04gc2NhbGFyICovCi0JLyogY2FsY3VsYXRlIHBoYXNlIHN0ZXAgZm9yIHRoZSB4IGRpcmVjdGlvbiAqLwotCi0JLyogaWYgZGVzdGluYXRpb24gaXMgb25seSAxIHBpeGVsIHdpZGUsIHRoZSB2YWx1ZSBvZgotCXBoYXNlX3N0ZXBfeCBpcyB1bmltcG9ydGFudC4gQXNzaWduaW5nIHBoYXNlX3N0ZXBfeAotCXRvIHNyYyBST0kgd2lkdGggYXMgYW4gYXJiaXRyYXJ5IHZhbHVlLiAqLwotCWlmIChvdXRfUk9JX3dpZHRoID09IDEpCi0JCXBoYXNlX3N0ZXBfeCA9ICh1aW50MzJfdCkgKChzcmNfUk9JX3dpZHRoKSA8PAotCQkJCQkJCVNDQUxFUl9QSEFTRV9CSVRTKTsKLQllbHNlIGlmIChzY2FsZV91bml0X3NlbF94ID09IDApIHsgLyogaWYgdXNpbmcgRklSIHNjYWxhciAqLwotCQkvKiBDYWxjdWxhdGUgdGhlIHF1b3RpZW50ICggc3JjX1JPSV93aWR0aCAtIDEgKQotCQkvICggb3V0X1JPSV93aWR0aCAtIDEpd2l0aCB1My4yOSBwcmVjaXNpb24uCi0JCVF1b3RpZW50IGlzIHJvdW5kZWQgdXAgdG8gdGhlIGxhcmdlcgotCQkyOXRoIGRlY2ltYWwgcG9pbnQuICovCi0JCW51bWVyYXRvciA9Ci0JCQkodWludDY0X3QpKHNyY19ST0lfd2lkdGggLSAxKSA8PAotCQkJU0NBTEVSX1BIQVNFX0JJVFM7Ci0JCS8qIG5ldmVyIGVxdWFscyB0byAwIGJlY2F1c2Ugb2YgdGhlICIKLQkJKG91dF9ST0lfd2lkdGggPT0gMSApIiovCi0JCWRlbm9taW5hdG9yID0gKHVpbnQ2NF90KShvdXRfUk9JX3dpZHRoIC0gMSk7Ci0JCS8qIGRpdmlkZSBhbmQgcm91bmQgdXAgdG8gdGhlIGxhcmdlciAyOXRoCi0JCWRlY2ltYWwgcG9pbnQuICovCi0JCXBoYXNlX3N0ZXBfeCA9ICh1aW50MzJfdCkgdnBlX2RvX2RpdigKLQkJCShudW1lcmF0b3IgKyBkZW5vbWluYXRvciAtIDEpLCBkZW5vbWluYXRvcik7Ci0JfSBlbHNlIGlmIChzY2FsZV91bml0X3NlbF94ID09IDEpIHsgLyogaWYgTS9OIHNjYWxhciAqLwotCQkvKiBDYWxjdWxhdGUgdGhlIHF1b3RpZW50Ci0JCSggc3JjX1JPSV93aWR0aCApIC8gKCBvdXRfUk9JX3dpZHRoKQotCQl3aXRoIHUzLjI5IHByZWNpc2lvbi4gUXVvdGllbnQgaXMgcm91bmRlZAotCQlkb3duIHRvIHRoZSBzbWFsbGVyIDI5dGggZGVjaW1hbCBwb2ludC4gKi8KLQkJbnVtZXJhdG9yID0gKHVpbnQ2NF90KShzcmNfUk9JX3dpZHRoKSA8PAotCQkJU0NBTEVSX1BIQVNFX0JJVFM7Ci0JCWRlbm9taW5hdG9yID0gKHVpbnQ2NF90KShvdXRfUk9JX3dpZHRoKTsKLQkJcGhhc2Vfc3RlcF94ID0KLQkJCSh1aW50MzJfdCkgdnBlX2RvX2RpdihudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKLQl9Ci0JLyogY2FsY3VsYXRlIHBoYXNlIHN0ZXAgZm9yIHRoZSB5IGRpcmVjdGlvbiAqLwotCi0JLyogaWYgZGVzdGluYXRpb24gaXMgb25seSAxIHBpeGVsIHdpZGUsIHRoZSB2YWx1ZSBvZgotCQlwaGFzZV9zdGVwX3ggaXMgdW5pbXBvcnRhbnQuIEFzc2lnbmluZyBwaGFzZV9zdGVwX3gKLQkJdG8gc3JjIFJPSSB3aWR0aCBhcyBhbiBhcmJpdHJhcnkgdmFsdWUuICovCi0JaWYgKG91dF9ST0lfaGVpZ2h0ID09IDEpCi0JCXBoYXNlX3N0ZXBfeSA9Ci0JCSh1aW50MzJfdCkgKChzcmNfUk9JX2hlaWdodCkgPDwgU0NBTEVSX1BIQVNFX0JJVFMpOwotCWVsc2UgaWYgKHNjYWxlX3VuaXRfc2VsX3kgPT0gMCkgeyAvKiBpZiBGSVIgc2NhbGFyICovCi0JCS8qIENhbGN1bGF0ZSB0aGUgcXVvdGllbnQKLQkJKCBzcmNfUk9JX2hlaWdodCAtIDEgKSAvICggb3V0X1JPSV9oZWlnaHQgLSAxKQotCQl3aXRoIHUzLjI5IHByZWNpc2lvbi4gUXVvdGllbnQgaXMgcm91bmRlZCB1cCB0byB0aGUKLQkJbGFyZ2VyIDI5dGggZGVjaW1hbCBwb2ludC4gKi8KLQkJbnVtZXJhdG9yID0gKHVpbnQ2NF90KShzcmNfUk9JX2hlaWdodCAtIDEpIDw8Ci0JCQlTQ0FMRVJfUEhBU0VfQklUUzsKLQkJLyogbmV2ZXIgZXF1YWxzIHRvIDAgYmVjYXVzZSBvZiB0aGUKLQkJIiggb3V0X1JPSV9oZWlnaHQgPT0gMSApIiBjYXNlICovCi0JCWRlbm9taW5hdG9yID0gKHVpbnQ2NF90KShvdXRfUk9JX2hlaWdodCAtIDEpOwotCQkvKiBRdW90aWVudCBpcyByb3VuZGVkIHVwIHRvIHRoZSBsYXJnZXIgMjl0aAotCQlkZWNpbWFsIHBvaW50LiAqLwotCQlwaGFzZV9zdGVwX3kgPQotCQkodWludDMyX3QpIHZwZV9kb19kaXYoCi0JCShudW1lcmF0b3IgKyBkZW5vbWluYXRvciAtIDEpLCBkZW5vbWluYXRvcik7Ci0JfSBlbHNlIGlmIChzY2FsZV91bml0X3NlbF95ID09IDEpIHsgLyogaWYgTS9OIHNjYWxhciAqLwotCQkvKiBDYWxjdWxhdGUgdGhlIHF1b3RpZW50ICggc3JjX1JPSV9oZWlnaHQgKSAvICggb3V0X1JPSV9oZWlnaHQpCi0JCXdpdGggdTMuMjkgcHJlY2lzaW9uLiBRdW90aWVudCBpcyByb3VuZGVkIGRvd24gdG8gdGhlIHNtYWxsZXIKLQkJMjl0aCBkZWNpbWFsIHBvaW50LiAqLwotCQludW1lcmF0b3IgPSAodWludDY0X3QpKHNyY19ST0lfaGVpZ2h0KSA8PAotCQkJU0NBTEVSX1BIQVNFX0JJVFM7Ci0JCWRlbm9taW5hdG9yID0gKHVpbnQ2NF90KShvdXRfUk9JX2hlaWdodCk7Ci0JCXBoYXNlX3N0ZXBfeSA9ICh1aW50MzJfdCkgdnBlX2RvX2RpdigKLQkJCW51bWVyYXRvciwgZGVub21pbmF0b3IpOwotCX0KLQotCS8qIGRlY2lkZSB3aGljaCBzZXQgb2YgRklSIGNvZWZmaWNpZW50cyB0byB1c2UgKi8KLQlpZiAocGhhc2Vfc3RlcF94ID4gSEFMX01EUF9QSEFTRV9TVEVQXzJQNTApCi0JCXhzY2FsZV9maWx0ZXJfc2VsID0gMDsKLQllbHNlIGlmIChwaGFzZV9zdGVwX3ggPiBIQUxfTURQX1BIQVNFX1NURVBfMVA2NikKLQkJeHNjYWxlX2ZpbHRlcl9zZWwgPSAxOwotCWVsc2UgaWYgKHBoYXNlX3N0ZXBfeCA+IEhBTF9NRFBfUEhBU0VfU1RFUF8xUDI1KQotCQl4c2NhbGVfZmlsdGVyX3NlbCA9IDI7Ci0JZWxzZQotCQl4c2NhbGVfZmlsdGVyX3NlbCA9IDM7Ci0KLQlpZiAocGhhc2Vfc3RlcF95ID4gSEFMX01EUF9QSEFTRV9TVEVQXzJQNTApCi0JCXlzY2FsZV9maWx0ZXJfc2VsID0gMDsKLQllbHNlIGlmIChwaGFzZV9zdGVwX3kgPiBIQUxfTURQX1BIQVNFX1NURVBfMVA2NikKLQkJeXNjYWxlX2ZpbHRlcl9zZWwgPSAxOwotCWVsc2UgaWYgKHBoYXNlX3N0ZXBfeSA+IEhBTF9NRFBfUEhBU0VfU1RFUF8xUDI1KQotCQl5c2NhbGVfZmlsdGVyX3NlbCA9IDI7Ci0JZWxzZQotCQl5c2NhbGVfZmlsdGVyX3NlbCA9IDM7Ci0KLQkvKiBjYWxjdWxhdGUgcGhhc2UgaW5pdCBmb3IgdGhlIHggZGlyZWN0aW9uICovCi0KLQkvKiBpZiB1c2luZyBGSVIgc2NhbGFyICovCi0JaWYgKHNjYWxlX3VuaXRfc2VsX3ggPT0gMCkgewotCQlpZiAob3V0X1JPSV93aWR0aCA9PSAxKQotCQkJcGhhc2VfaW5pdF94ID0KLQkJCSh1aW50MzJfdCkgKChzcmNfUk9JX3dpZHRoIC0gMSkgPDwKLQkJCQkJCVNDQUxFUl9QSEFTRV9CSVRTKTsKLQkJZWxzZQotCQkJcGhhc2VfaW5pdF94ID0gMDsKLQotCX0gZWxzZSBpZiAoc2NhbGVfdW5pdF9zZWxfeCA9PSAxKSAvKiBNIG92ZXIgTiBzY2FsYXIgICovCi0JCXBoYXNlX2luaXRfeCA9IDA7Ci0KLQkvKiBjYWxjdWxhdGUgcGhhc2UgaW5pdCBmb3IgdGhlIHkgZGlyZWN0aW9uCi0JaWYgdXNpbmcgRklSIHNjYWxhciAqLwotCWlmIChzY2FsZV91bml0X3NlbF95ID09IDApIHsKLQkJaWYgKG91dF9ST0lfaGVpZ2h0ID09IDEpCi0JCQlwaGFzZV9pbml0X3kgPQotCQkJKHVpbnQzMl90KSAoKHNyY19ST0lfaGVpZ2h0IC0KLQkJCQkJCTEpIDw8IFNDQUxFUl9QSEFTRV9CSVRTKTsKLQkJZWxzZQotCQkJcGhhc2VfaW5pdF95ID0gMDsKLQotCX0gZWxzZSBpZiAoc2NhbGVfdW5pdF9zZWxfeSA9PSAxKSAvKiBNIG92ZXIgTiBzY2FsYXIgICAqLwotCQlwaGFzZV9pbml0X3kgPSAwOwotCi0JQ0RCRygicGhhc2Ugc3RlcCB4ID0gJWQsIHN0ZXAgeSA9ICVkLlxuIiwKLQkJcGhhc2Vfc3RlcF94LCBwaGFzZV9zdGVwX3kpOwotCUNEQkcoInBoYXNlIGluaXQgeCA9ICVkLCBpbml0IHkgPSAlZC5cbiIsCi0JCXBoYXNlX2luaXRfeCwgcGhhc2VfaW5pdF95KTsKLQotCW1zbV9jYW1lcmFfaW9fdyhwaGFzZV9zdGVwX3gsIHZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJVlBFX1NDQUxFX1BIQVNFWF9TVEVQX09GRlNFVCk7Ci0KLQltc21fY2FtZXJhX2lvX3cocGhhc2Vfc3RlcF95LCB2cGVfZGV2aWNlLT52cGViYXNlICsKLQkJCVZQRV9TQ0FMRV9QSEFTRVlfU1RFUF9PRkZTRVQpOwotCi0JbXNtX2NhbWVyYV9pb193KHBoYXNlX2luaXRfeCwgdnBlX2RldmljZS0+dnBlYmFzZSArCi0JCQlWUEVfU0NBTEVfUEhBU0VYX0lOSVRfT0ZGU0VUKTsKLQotCW1zbV9jYW1lcmFfaW9fdyhwaGFzZV9pbml0X3ksIHZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJVlBFX1NDQUxFX1BIQVNFWV9JTklUX09GRlNFVCk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotdm9pZCBtc21fc2VuZF9mcmFtZV90b192cGUodWludDMyX3QgcDBfcGh5X2FkZCwgdWludDMyX3QgcDFfcGh5X2FkZCwKLQkJc3RydWN0IHRpbWVzcGVjICp0cywgaW50IG91dHB1dF90eXBlKQotewotCXVpbnQzMl90IHRlbXBfcHlhZGRyID0gMCwgdGVtcF9wY2JjcmFkZHIgPSAwOwotCi0JQ0RCRygidnBlIGlucHV0LCBwMF9waHlfYWRkID0gMHgleCwgcDFfcGh5X2FkZCA9IDB4JXhcbiIsCi0JCXAwX3BoeV9hZGQsIHAxX3BoeV9hZGQpOwotCW1zbV9jYW1lcmFfaW9fdyhwMF9waHlfYWRkLAotCQl2cGVfZGV2aWNlLT52cGViYXNlICsgVlBFX1NSQ1AwX0FERFJfT0ZGU0VUKTsKLQltc21fY2FtZXJhX2lvX3cocDFfcGh5X2FkZCwKLQkJdnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9TUkNQMV9BRERSX09GRlNFVCk7Ci0KLQlpZiAodnBlX2N0cmwtPnN0YXRlID09IFZQRV9TVEFURV9BQ1RJVkUpCi0JCUNEQkcoIiA9PT09PVZQRSBpcyBidXN5ISEhICBXcm9uZyE9PT09PT09PVxuIik7Ci0KLQlpZiAob3V0cHV0X3R5cGUgIT0gT1VUUFVUX1RZUEVfU1RfUikKLQkJdnBlX2N0cmwtPnRzID0gKnRzOwotCi0JaWYgKG91dHB1dF90eXBlID09IE9VVFBVVF9UWVBFX1NUX0wpIHsKLQkJdnBlX2N0cmwtPnBjYmNyX2JlZm9yZV9kaXMgPQotCQkJbXNtX2NhbWVyYV9pb19yKHZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJVlBFX09VVFAxX0FERFJfT0ZGU0VUKTsKLQkJdGVtcF9weWFkZHIgPSBtc21fY2FtZXJhX2lvX3IodnBlX2RldmljZS0+dnBlYmFzZSArCi0JCQlWUEVfT1VUUDBfQUREUl9PRkZTRVQpOwotCQl0ZW1wX3BjYmNyYWRkciA9IHRlbXBfcHlhZGRyICsgUEFEX1RPXzJLKHZwZV9jdHJsLT5vdXRfdyAqCi0JCQl2cGVfY3RybC0+b3V0X2ggKiAyLCB2cGVfY3RybC0+cGFkXzJrX2Jvb2wpOwotCQltc21fY2FtZXJhX2lvX3codGVtcF9wY2JjcmFkZHIsIHZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJVlBFX09VVFAxX0FERFJfT0ZGU0VUKTsKLQl9Ci0KLQlpZiAodnBlX2N0cmwtPmRpc19lbikgewotCQkvKiBDaGFuZ2luZyB0aGUgVlBFIG91dHB1dCBDQkNSIGFkZHJlc3MsCi0JCXRvIG1ha2UgWS9DQkNSIGNvbnRpbnVvdXMgKi8KLQkJdnBlX2N0cmwtPnBjYmNyX2JlZm9yZV9kaXMgPQotCQkJbXNtX2NhbWVyYV9pb19yKHZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJVlBFX09VVFAxX0FERFJfT0ZGU0VUKTsKLQkJdGVtcF9weWFkZHIgPSBtc21fY2FtZXJhX2lvX3IodnBlX2RldmljZS0+dnBlYmFzZSArCi0JCQlWUEVfT1VUUDBfQUREUl9PRkZTRVQpOwotCQl0ZW1wX3BjYmNyYWRkciA9IHRlbXBfcHlhZGRyICsgdnBlX2N0cmwtPnBjYmNyX2Rpc19vZmZzZXQ7Ci0JCW1zbV9jYW1lcmFfaW9fdyh0ZW1wX3BjYmNyYWRkciwgdnBlX2RldmljZS0+dnBlYmFzZSArCi0JCQlWUEVfT1VUUDFfQUREUl9PRkZTRVQpOwotCX0KLQotCXZwZV9jdHJsLT5vdXRwdXRfdHlwZSA9IG91dHB1dF90eXBlOwotCXZwZV9jdHJsLT5zdGF0ZSA9IFZQRV9TVEFURV9BQ1RJVkU7Ci0JdnBlX3N0YXJ0KCk7Ci19Ci0KLXN0YXRpYyBpbnQgdnBlX3Byb2NfZ2VuZXJhbChzdHJ1Y3QgbXNtX3ZwZV9jbWQgKmNtZCkKLXsKLQlpbnQgcmMgPSAwOwotCXVpbnQzMl90ICpjbWRwID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCAqcWNtZCA9IE5VTEw7Ci0Jc3RydWN0IG1zbV92cGVfYnVmX2luZm8gKnZwZV9idWY7Ci0JaW50IHR1cmJvX21vZGUgPSAwOwotCXN0cnVjdCBtc21fc3luYyAqc3luYyA9IChzdHJ1Y3QgbXNtX3N5bmMgKil2cGVfY3RybC0+c3luY2RhdGE7Ci0JQ0RCRygidnBlX3Byb2NfZ2VuZXJhbDogY21kSUQgPSAlcywgbGVuZ3RoID0gJWRcbiIsCi0JCXZwZV9nZW5lcmFsX2NtZFtjbWQtPmlkXSwgY21kLT5sZW5ndGgpOwotCXN3aXRjaCAoY21kLT5pZCkgewotCWNhc2UgVlBFX0VOQUJMRToKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gdnBlX3Byb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHZwZV9wcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQl0dXJib19tb2RlID0gKigoaW50ICopKGNtZC0+dmFsdWUpKTsKLQkJcmMgPSB0dXJib19tb2RlID8gdnBlX2VuYWJsZShWUEVfVFVSQk9fTU9ERV9DTE9DS19SQVRFKQotCQkJOiB2cGVfZW5hYmxlKFZQRV9OT1JNQUxfTU9ERV9DTE9DS19SQVRFKTsKLQkJYnJlYWs7Ci0JY2FzZSBWUEVfRElTQUJMRToKLQkJcmMgPSB2cGVfZGlzYWJsZSgpOwotCQlicmVhazsKLQljYXNlIFZQRV9SRVNFVDoKLQljYXNlIFZQRV9BQk9SVDoKLQkJcmMgPSB2cGVfcmVzZXQoKTsKLQkJYnJlYWs7Ci0JY2FzZSBWUEVfU1RBUlQ6Ci0JCXJjID0gdnBlX3N0YXJ0KCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWUEVfSU5QVVRfUExBTkVfQ0ZHOgotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byB2cGVfcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gdnBlX3Byb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCXZwZV9pbnB1dF9wbGFuZV9jb25maWcoY21kcCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWUEVfT1BFUkFUSU9OX01PREVfQ0ZHOgotCQlDREJHKCJjbWQtPmxlbmd0aCA9ICVkIFxuIiwgY21kLT5sZW5ndGgpOwotCQlpZiAoY21kLT5sZW5ndGggIT0gVlBFX09QRVJBVElPTl9NT0RFX0NGR19MRU4pIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gdnBlX3Byb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHAgPSBrbWFsbG9jKFZQRV9PUEVSQVRJT05fTU9ERV9DRkdfTEVOLAotCQkJCQlHRlBfQVRPTUlDKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQlWUEVfT1BFUkFUSU9OX01PREVfQ0ZHX0xFTikpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gdnBlX3Byb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCXJjID0gdnBlX29wZXJhdGlvbl9jb25maWcoY21kcCk7Ci0JCUNEQkcoInJjID0gJWQgXG4iLCByYyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWUEVfT1VUUFVUX1BMQU5FX0NGRzoKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gdnBlX3Byb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHZwZV9wcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQl2cGVfb3V0cHV0X3BsYW5lX2NvbmZpZyhjbWRwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZQRV9TQ0FMRV9DRkdfVFlQRToKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gdnBlX3Byb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHZwZV9wcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQl2cGVfdXBkYXRlX3NjYWxlX2NvZWYoY21kcCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWUEVfQ01EX0RJU19PRkZTRVRfQ0ZHOiB7Ci0JCXN0cnVjdCBtc21fdmZlX3Jlc3AgKnZkYXRhOwotCQkvKiBmaXJzdCBnZXQgdGhlIGRpcyBvZmZzZXQgYW5kIGZyYW1lIGlkLiAqLwotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byB2cGVfcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gdnBlX3Byb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCS8qIGdldCB0aGUgb2Zmc2V0LiAqLwotCQl2cGVfY3RybC0+ZGlzX29mZnNldCA9ICooc3RydWN0IGRpc19vZmZzZXRfdHlwZSAqKWNtZHA7Ci0JCXFjbWQgPSBtc21fZGVxdWV1ZV92cGUoJnN5bmMtPnZwZV9xLCBsaXN0X3ZwZV9mcmFtZSk7Ci0JCWlmICghcWNtZCkgewotCQkJcHJfZXJyKCIlczogbm8gdmlkZW8gZnJhbWUuXG4iLCBfX2Z1bmNfXyk7Ci0JCQlrZnJlZShjbWRwKTsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9Ci0JCXZkYXRhID0gKHN0cnVjdCBtc21fdmZlX3Jlc3AgKikocWNtZC0+Y29tbWFuZCk7Ci0JCXZwZV9idWYgPSAmdmRhdGEtPnZwZV9iZjsKLQkJdnBlX3VwZGF0ZV9zY2FsZXJfd2l0aF9kaXMoJih2cGVfYnVmLT52cGVfY3JvcCksCi0JCQkJCSYodnBlX2N0cmwtPmRpc19vZmZzZXQpKTsKLQotCQltc21fc2VuZF9mcmFtZV90b192cGUodnBlX2J1Zi0+cDBfcGh5LCB2cGVfYnVmLT5wMV9waHksCi0JCQkJCQkmKHZwZV9idWYtPnRzKSwgT1VUUFVUX1RZUEVfVik7Ci0KLQkJaWYgKCFxY21kIHx8ICFhdG9taWNfcmVhZCgmcWNtZC0+b25faGVhcCkpIHsKLQkJCWtmcmVlKGNtZHApOwotCQkJcmV0dXJuIC1FQUdBSU47Ci0JCX0KLQkJaWYgKCFhdG9taWNfc3ViX3JldHVybigxLCAmcWNtZC0+b25faGVhcCkpCi0JCQlrZnJlZShxY21kKTsKLQkJYnJlYWs7Ci0JfQotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotdnBlX3Byb2NfZ2VuZXJhbF9kb25lOgotCWtmcmVlKGNtZHApOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgdnBlX2FkZHJfY29udmVydChzdHJ1Y3QgbXNtX3ZwZV9waHlfaW5mbyAqcGluZm8sCi0JZW51bSB2cGVfcmVzcF9tc2cgdHlwZSwgdm9pZCAqZGF0YSwgdm9pZCAqKmV4dCwgaW50MzJfdCAqZWxlbikKLXsKLQlDREJHKCJJbiB2cGVfYWRkcl9jb252ZXJ0IHR5cGUgPSAlZFxuIiwgdHlwZSk7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBWUEVfTVNHX09VVFBVVF9WOgotCQlwaW5mby0+b3V0cHV0X2lkID0gT1VUUFVUX1RZUEVfVjsKLQkJYnJlYWs7Ci0JY2FzZSBWUEVfTVNHX09VVFBVVF9TVF9SOgotCQkvKiBvdXRwdXRfaWQgd2lsbCBiZSB1c2VkIGJ5IHVzZXIgc3BhY2Ugb25seS4gKi8KLQkJcGluZm8tPm91dHB1dF9pZCA9IE9VVFBVVF9UWVBFX1Y7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0gLyogc3dpdGNoICovCi0KLQlDREJHKCJJbiB2cGVfYWRkcl9jb252ZXJ0IG91dHB1dF9pZCA9ICVkXG4iLCBwaW5mby0+b3V0cHV0X2lkKTsKLQotCXBpbmZvLT5wMF9waHkgPQotCQkoKHN0cnVjdCB2cGVfbWVzc2FnZSAqKWRhdGEpLT5fdS5tc2dPdXQucDBfQnVmZmVyOwotCXBpbmZvLT5wMV9waHkgPQotCQkoKHN0cnVjdCB2cGVfbWVzc2FnZSAqKWRhdGEpLT5fdS5tc2dPdXQucDFfQnVmZmVyOwotCSpleHQgID0gdnBlX2N0cmwtPmV4dGRhdGE7Ci0JKmVsZW4gPSB2cGVfY3RybC0+ZXh0bGVuOwotfQotCi12b2lkIHZwZV9wcm9jX29wcyh1aW50OF90IGlkLCB2b2lkICptc2csIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IG1zbV92cGVfcmVzcCAqcnA7Ci0KLQlycCA9IHZwZV9jdHJsLT5yZXNwLT52cGVfYWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fdnBlX3Jlc3ApLAotCQl2cGVfY3RybC0+c3luY2RhdGEsIEdGUF9BVE9NSUMpOwotCWlmICghcnApIHsKLQkJQ0RCRygicnA6IGNhbm5vdCBhbGxvY2F0ZSBidWZmZXJcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JQ0RCRygidnBlX3Byb2Nfb3BzLCBtc2dJZCA9ICVkIHJwLT5ldnRfbXNnLm1zZ19pZCA9ICVkXG4iLAotCQlpZCwgcnAtPmV2dF9tc2cubXNnX2lkKTsKLQlycC0+ZXZ0X21zZy50eXBlICAgPSBNU01fQ0FNRVJBX01TRzsKLQlycC0+ZXZ0X21zZy5tc2dfaWQgPSBpZDsKLQlycC0+ZXZ0X21zZy5sZW4gICAgPSBsZW47Ci0JcnAtPmV2dF9tc2cuZGF0YSAgID0gbXNnOwotCi0Jc3dpdGNoIChycC0+ZXZ0X21zZy5tc2dfaWQpIHsKLQljYXNlIE1TR19JRF9WUEVfT1VUUFVUX1Y6Ci0JCXJwLT50eXBlID0gVlBFX01TR19PVVRQVVRfVjsKLQkJdnBlX2FkZHJfY29udmVydCgmKHJwLT5waHkpLCBWUEVfTVNHX09VVFBVVF9WLAotCQkJcnAtPmV2dF9tc2cuZGF0YSwgJihycC0+ZXh0ZGF0YSksCi0JCQkmKHJwLT5leHRsZW4pKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TR19JRF9WUEVfT1VUUFVUX1NUX1I6Ci0JCXJwLT50eXBlID0gVlBFX01TR19PVVRQVVRfU1RfUjsKLQkJdnBlX2FkZHJfY29udmVydCgmKHJwLT5waHkpLCBWUEVfTVNHX09VVFBVVF9TVF9SLAotCQkJcnAtPmV2dF9tc2cuZGF0YSwgJihycC0+ZXh0ZGF0YSksCi0JCQkmKHJwLT5leHRsZW4pKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TR19JRF9WUEVfT1VUUFVUX1NUX0w6Ci0JCXJwLT50eXBlID0gVlBFX01TR19PVVRQVVRfU1RfTDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlycC0+dHlwZSA9IFZQRV9NU0dfR0VORVJBTDsKLQkJYnJlYWs7Ci0JfQotCUNEQkcoIiVzOiB0aW1lID0gJWxkXG4iLAotCQkJX19mdW5jX18sIHZwZV9jdHJsLT50cy50dl9uc2VjKTsKLQotCXZwZV9jdHJsLT5yZXNwLT52cGVfcmVzcChycCwgTVNNX0NBTV9RX1ZQRV9NU0csCi0JCQkJCXZwZV9jdHJsLT5zeW5jZGF0YSwKLQkJCQkJJih2cGVfY3RybC0+dHMpLCBHRlBfQVRPTUlDKTsKLX0KLQotaW50IHZwZV9jb25maWdfYXhpKHN0cnVjdCBheGlkYXRhICphZCkKLXsKLQl1aW50MzJfdCBwMTsKLQlzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uICpyZWdwMSA9IE5VTEw7Ci0JQ0RCRygidnBlX2NvbmZpZ19heGk6YnVmbnVtMSA9ICVkLlxuIiwgYWQtPmJ1Zm51bTEpOwotCi0JaWYgKGFkLT5idWZudW0xICE9IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmVncDEgPSAmKGFkLT5yZWdpb25bMF0pOwotCS8qIGZvciB2aWRlbyAgWSBhZGRyZXNzICovCi0JcDEgPSAocmVncDEtPnBhZGRyICsgcmVncDEtPmluZm8ucGxhbmFyMF9vZmYpOwotCW1zbV9jYW1lcmFfaW9fdyhwMSwgdnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9PVVRQMF9BRERSX09GRlNFVCk7Ci0JLyogZm9yIHZpZGVvICBDYkNyIGFkZHJlc3MgKi8KLQlwMSA9IChyZWdwMS0+cGFkZHIgKyByZWdwMS0+aW5mby5wbGFuYXIxX29mZik7Ci0JbXNtX2NhbWVyYV9pb193KHAxLCB2cGVfZGV2aWNlLT52cGViYXNlICsgVlBFX09VVFAxX0FERFJfT0ZGU0VUKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgbXNtX3ZwZV9jb25maWcoc3RydWN0IG1zbV92cGVfY2ZnX2NtZCAqY21kLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBtc21fdnBlX2NtZCB2cGVjbWQ7Ci0JaW50IHJjID0gMDsKLQlpZiAoY29weV9mcm9tX3VzZXIoJnZwZWNtZCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCXNpemVvZih2cGVjbWQpKSkgewotCQlwcl9lcnIoIiVzICVkOiBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsIF9fZnVuY19fLAotCQkJCV9fTElORV9fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCUNEQkcoIiVzOiBjbWRfdHlwZSAlZFxuIiwgX19mdW5jX18sIGNtZC0+Y21kX3R5cGUpOwotCXN3aXRjaCAoY21kLT5jbWRfdHlwZSkgewotCWNhc2UgQ01EX1ZQRToKLQkJcmMgPSB2cGVfcHJvY19nZW5lcmFsKCZ2cGVjbWQpOwotCQlDREJHKCIgcmMgPSAlZFxuIiwgcmMpOwotCQlicmVhazsKLQotCWNhc2UgQ01EX0FYSV9DRkdfVlBFOgotCWNhc2UgQ01EX0FYSV9DRkdfU05BUF9WUEU6Ci0JY2FzZSBDTURfQVhJX0NGR19TTkFQX1RIVU1CX1ZQRTogewotCQlzdHJ1Y3QgYXhpZGF0YSAqYXhpZDsKLQkJYXhpZCA9IGRhdGE7Ci0JCWlmICghYXhpZCkKLQkJCXJldHVybiAtRUZBVUxUOwotCQl2cGVfY29uZmlnX2F4aShheGlkKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlDREJHKCIlczogcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXZvaWQgbXNtX3ZwZV9vZmZzZXRfdXBkYXRlKGludCBmcmFtZV9wYWNrLCB1aW50MzJfdCBweWFkZHIsIHVpbnQzMl90IHBjYmNyYWRkciwKLQlzdHJ1Y3QgdGltZXNwZWMgKnRzLCBpbnQgb3V0cHV0X2lkLCBzdHJ1Y3QgbXNtX3N0X2hhbGYgc3RfaGFsZiwKLQlpbnQgZnJhbWVpZCkKLXsKLQlzdHJ1Y3QgbXNtX3ZwZV9idWZfaW5mbyB2cGVfYnVmOwotCXVpbnQzMl90IGlucHV0X3N0cmlkZTsKLQotCXZwZV9idWYudnBlX2Nyb3AuaW4yX3cgPSBzdF9oYWxmLnN0Q3JvcEluZm8uaW5fdzsKLQl2cGVfYnVmLnZwZV9jcm9wLmluMl9oID0gc3RfaGFsZi5zdENyb3BJbmZvLmluX2g7Ci0JdnBlX2J1Zi52cGVfY3JvcC5vdXQyX3cgPSBzdF9oYWxmLnN0Q3JvcEluZm8ub3V0X3c7Ci0JdnBlX2J1Zi52cGVfY3JvcC5vdXQyX2ggPSBzdF9oYWxmLnN0Q3JvcEluZm8ub3V0X2g7Ci0JdnBlX2N0cmwtPmRpc19vZmZzZXQuZGlzX29mZnNldF94ID0gc3RfaGFsZi5waXhfeF9vZmY7Ci0JdnBlX2N0cmwtPmRpc19vZmZzZXQuZGlzX29mZnNldF95ID0gc3RfaGFsZi5waXhfeV9vZmY7Ci0JdnBlX2N0cmwtPmRpc19vZmZzZXQuZnJhbWVfaWQgPSBmcmFtZWlkOwotCXZwZV9jdHJsLT5mcmFtZV9wYWNrID0gZnJhbWVfcGFjazsKLQl2cGVfY3RybC0+b3V0cHV0X3R5cGUgPSBvdXRwdXRfaWQ7Ci0KLQlpbnB1dF9zdHJpZGUgPSAoc3RfaGFsZi5idWZfcDFfc3RyaWRlICogKDE8PDE2KSkgKwotCQlzdF9oYWxmLmJ1Zl9wMF9zdHJpZGU7Ci0KLQltc21fY2FtZXJhX2lvX3coaW5wdXRfc3RyaWRlLAotCQl2cGVfZGV2aWNlLT52cGViYXNlICsgVlBFX1NSQ19ZU1RSSURFMV9PRkZTRVQpOwotCi0JdnBlX3VwZGF0ZV9zY2FsZXJfd2l0aF9kaXMoJih2cGVfYnVmLnZwZV9jcm9wKSwKLQkJJih2cGVfY3RybC0+ZGlzX29mZnNldCkpOwotCi0JbXNtX3NlbmRfZnJhbWVfdG9fdnBlKHB5YWRkciwgcGNiY3JhZGRyLCB0cywgb3V0cHV0X2lkKTsKLX0KLQotc3RhdGljIHZvaWQgdnBlX3NlbmRfb3V0bXNnKHVpbnQ4X3QgbXNnaWQsIHVpbnQzMl90IHAwX2FkZHIsCi0JdWludDMyX3QgcDFfYWRkciwgdWludDMyX3QgcDJfYWRkcikKLXsKLQlzdHJ1Y3QgdnBlX21lc3NhZ2UgbXNnOwotCXVpbnQ4X3Qgb3V0aWQ7Ci0JbXNnLl9kID0gb3V0aWQgPSBtc2dpZDsKLQltc2cuX3UubXNnT3V0Lm91dHB1dF9pZCAgID0gbXNnaWQ7Ci0JbXNnLl91Lm1zZ091dC5wMF9CdWZmZXIgPSBwMF9hZGRyOwotCW1zZy5fdS5tc2dPdXQucDFfQnVmZmVyID0gcDFfYWRkcjsKLQltc2cuX3UubXNnT3V0LnAyX0J1ZmZlciA9IHAyX2FkZHI7Ci0JdnBlX3Byb2Nfb3BzKG91dGlkLCAmbXNnLCBzaXplb2Yoc3RydWN0IHZwZV9tZXNzYWdlKSk7Ci0JcmV0dXJuOwotfQotCi1pbnQgbXNtX3ZwZV9yZWcoc3RydWN0IG1zbV92cGVfY2FsbGJhY2sgKnByZXNwKQotewotCWlmIChwcmVzcCAmJiBwcmVzcC0+dnBlX3Jlc3ApCi0JCXZwZV9jdHJsLT5yZXNwID0gcHJlc3A7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdnBlX3NlbmRfbXNnX25vX3BheWxvYWQoZW51bSBWUEVfTUVTU0FHRV9JRCBpZCkKLXsKLQlzdHJ1Y3QgdnBlX21lc3NhZ2UgbXNnOwotCi0JQ0RCRygidmZlMzFfc2VuZF9tc2dfbm9fcGF5bG9hZFxuIik7Ci0JbXNnLl9kID0gaWQ7Ci0JdnBlX3Byb2Nfb3BzKGlkLCAmbXNnLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgdnBlX2RvX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdWludDMyX3QgcHlhZGRyID0gMCwgcGNiY3JhZGRyID0gMDsKLQl1aW50MzJfdCBzcmNfeSwgc3JjX2NiY3IsIHRlbXA7Ci0KLQlzdHJ1Y3QgdnBlX2lzcl9xdWV1ZV9jbWRfdHlwZSAqcWNtZCA9IE5VTEw7Ci0KLQlDREJHKCI9PT0gdnBlX2RvX3Rhc2tsZXQgc3RhcnQgPT09IFxuIik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdnBlX2N0cmwtPnRhc2tsZXRfbG9jaywgZmxhZ3MpOwotCXFjbWQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2cGVfY3RybC0+dGFza2xldF9xLAotCQlzdHJ1Y3QgdnBlX2lzcl9xdWV1ZV9jbWRfdHlwZSwgbGlzdCk7Ci0KLQlpZiAoIXFjbWQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnBlX2N0cmwtPnRhc2tsZXRfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JbGlzdF9kZWwoJnFjbWQtPmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwZV9jdHJsLT50YXNrbGV0X2xvY2ssIGZsYWdzKTsKLQotCS8qIGludGVycnVwdCB0byBiZSBwcm9jZXNzZWQsICAqcWNtZCBoYXMgdGhlIHBheWxvYWQuICAqLwotCWlmIChxY21kLT5pcnFfc3RhdHVzICYgMHgxKSB7Ci0JCWlmICh2cGVfY3RybC0+b3V0cHV0X3R5cGUgPT0gT1VUUFVUX1RZUEVfU1RfTCkgewotCQkJQ0RCRygidnBlIGxlZnQgZnJhbWUgZG9uZS5cbiIpOwotCQkJdnBlX2N0cmwtPm91dHB1dF90eXBlID0gMDsKLQkJCUNEQkcoInZwZSBzZW5kIG91dCBtc2cuXG4iKTsKLQkJCW9yaWdfc3JjX3kgPSBtc21fY2FtZXJhX2lvX3IodnBlX2RldmljZS0+dnBlYmFzZSArCi0JCQkJVlBFX1NSQ1AwX0FERFJfT0ZGU0VUKTsKLQkJCW9yaWdfc3JjX2NiY3IgPSBtc21fY2FtZXJhX2lvX3IodnBlX2RldmljZS0+dnBlYmFzZSArCi0JCQkJVlBFX1NSQ1AxX0FERFJfT0ZGU0VUKTsKLQotCQkJcHlhZGRyID0gbXNtX2NhbWVyYV9pb19yKHZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJCVZQRV9PVVRQMF9BRERSX09GRlNFVCk7Ci0JCQlwY2JjcmFkZHIgPSBtc21fY2FtZXJhX2lvX3IodnBlX2RldmljZS0+dnBlYmFzZSArCi0JCQkJVlBFX09VVFAxX0FERFJfT0ZGU0VUKTsKLQkJCUNEQkcoIiVzOiBvdXRfdyA9ICVkLCBvdXRfaCA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQl2cGVfY3RybC0+b3V0X3csIHZwZV9jdHJsLT5vdXRfaCk7Ci0KLQkJCWlmICgodnBlX2N0cmwtPmZyYW1lX3BhY2sgPT0gVE9QX0RPV05fRlVMTCkgfHwKLQkJCQkodnBlX2N0cmwtPmZyYW1lX3BhY2sgPT0gVE9QX0RPV05fSEFMRikpIHsKLQkJCQltc21fY2FtZXJhX2lvX3cocHlhZGRyICsgKHZwZV9jdHJsLT5vdXRfdyAqCi0JCQkJCXZwZV9jdHJsLT5vdXRfaCksIHZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJCQlWUEVfT1VUUDBfQUREUl9PRkZTRVQpOwotCQkJCW1zbV9jYW1lcmFfaW9fdyhwY2JjcmFkZHIgKyAodnBlX2N0cmwtPm91dF93ICoKLQkJCQkJdnBlX2N0cmwtPm91dF9oLzIpLAotCQkJCQl2cGVfZGV2aWNlLT52cGViYXNlICsKLQkJCQkJVlBFX09VVFAxX0FERFJfT0ZGU0VUKTsKLQkJCX0gZWxzZSBpZiAoKHZwZV9jdHJsLT5mcmFtZV9wYWNrID09Ci0JCQkJU0lERV9CWV9TSURFX0hBTEYpIHx8ICh2cGVfY3RybC0+ZnJhbWVfcGFjayA9PQotCQkJCVNJREVfQllfU0lERV9GVUxMKSkgewotCQkJCW1zbV9jYW1lcmFfaW9fdyhweWFkZHIgKyB2cGVfY3RybC0+b3V0X3csCi0JCQkJCXZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJCQlWUEVfT1VUUDBfQUREUl9PRkZTRVQpOwotCQkJCW1zbV9jYW1lcmFfaW9fdyhwY2JjcmFkZHIgKyB2cGVfY3RybC0+b3V0X3csCi0JCQkJCXZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJCQlWUEVfT1VUUDFfQUREUl9PRkZTRVQpOwotCQkJfSBlbHNlCi0JCQkJQ0RCRygiJXM6IEludmFsaWQgcGFja2luZyA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkJdnBlX2N0cmwtPmZyYW1lX3BhY2spOwotCi0JCQl2cGVfc2VuZF9tc2dfbm9fcGF5bG9hZChNU0dfSURfVlBFX09VVFBVVF9TVF9MKTsKLQkJCXZwZV9jdHJsLT5zdGF0ZSA9IFZQRV9TVEFURV9JTklUOwotCQkJa2ZyZWUocWNtZCk7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSBpZiAodnBlX2N0cmwtPm91dHB1dF90eXBlID09IE9VVFBVVF9UWVBFX1NUX1IpIHsKLQkJCXNyY195ID0gb3JpZ19zcmNfeTsKLQkJCXNyY19jYmNyID0gb3JpZ19zcmNfY2JjcjsKLQkJCUNEQkcoIiVzOiBvdXRfdyA9ICVkLCBvdXRfaCA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQl2cGVfY3RybC0+b3V0X3csIHZwZV9jdHJsLT5vdXRfaCk7Ci0KLQkJCWlmICgodnBlX2N0cmwtPmZyYW1lX3BhY2sgPT0gVE9QX0RPV05fRlVMTCkgfHwKLQkJCQkodnBlX2N0cmwtPmZyYW1lX3BhY2sgPT0gVE9QX0RPV05fSEFMRikpIHsKLQkJCQlweWFkZHIgPSBtc21fY2FtZXJhX2lvX3IodnBlX2RldmljZS0+dnBlYmFzZSArCi0JCQkJCVZQRV9PVVRQMF9BRERSX09GRlNFVCkgLQotCQkJCQkodnBlX2N0cmwtPm91dF93ICogdnBlX2N0cmwtPm91dF9oKTsKLQkJCX0gZWxzZSBpZiAoKHZwZV9jdHJsLT5mcmFtZV9wYWNrID09Ci0JCQkJU0lERV9CWV9TSURFX0hBTEYpIHx8ICh2cGVfY3RybC0+ZnJhbWVfcGFjayA9PQotCQkJCVNJREVfQllfU0lERV9GVUxMKSkgewotCQkJCXB5YWRkciA9IG1zbV9jYW1lcmFfaW9fcih2cGVfZGV2aWNlLT52cGViYXNlICsKLQkJCQlWUEVfT1VUUDBfQUREUl9PRkZTRVQpIC0gdnBlX2N0cmwtPm91dF93OwotCQkJfSBlbHNlCi0JCQkJQ0RCRygiJXM6IEludmFsaWQgcGFja2luZyA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkJdnBlX2N0cmwtPmZyYW1lX3BhY2spOwotCi0JCQlwY2JjcmFkZHIgPSB2cGVfY3RybC0+cGNiY3JfYmVmb3JlX2RpczsKLQkJfSBlbHNlIHsKLQkJCXNyY195ID0JbXNtX2NhbWVyYV9pb19yKHZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJCVZQRV9TUkNQMF9BRERSX09GRlNFVCk7Ci0JCQlzcmNfY2JjciA9IG1zbV9jYW1lcmFfaW9fcih2cGVfZGV2aWNlLT52cGViYXNlICsKLQkJCQlWUEVfU1JDUDFfQUREUl9PRkZTRVQpOwotCQkJcHlhZGRyID0gbXNtX2NhbWVyYV9pb19yKHZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJCVZQRV9PVVRQMF9BRERSX09GRlNFVCk7Ci0JCQlwY2JjcmFkZHIgPSBtc21fY2FtZXJhX2lvX3IodnBlX2RldmljZS0+dnBlYmFzZSArCi0JCQkJVlBFX09VVFAxX0FERFJfT0ZGU0VUKTsKLQkJfQotCi0JCWlmICh2cGVfY3RybC0+ZGlzX2VuKQotCQkJcGNiY3JhZGRyID0gdnBlX2N0cmwtPnBjYmNyX2JlZm9yZV9kaXM7Ci0KLQkJbXNtX2NhbWVyYV9pb193KHNyY195LAotCQkJCXZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfT1VUUDBfQUREUl9PRkZTRVQpOwotCQltc21fY2FtZXJhX2lvX3coc3JjX2NiY3IsCi0JCQkJdnBlX2RldmljZS0+dnBlYmFzZSArIFZQRV9PVVRQMV9BRERSX09GRlNFVCk7Ci0KLQkJdGVtcCA9IG1zbV9jYW1lcmFfaW9fcih2cGVfZGV2aWNlLT52cGViYXNlICsgVlBFX09QX01PREVfT0ZGU0VUKQotCQkJCSYgMHhGRkZGRkZGQzsKLQkJbXNtX2NhbWVyYV9pb193KHRlbXAsIHZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfT1BfTU9ERV9PRkZTRVQpOwotCi0JCS8qICBub3cgcGFzcyB0aGlzIGZyYW1lIHRvIG1zbV9jYW1lcmEuYy4gKi8KLQkJaWYgKHZwZV9jdHJsLT5vdXRwdXRfdHlwZSA9PSBPVVRQVVRfVFlQRV9TVF9SKSB7Ci0JCQlDREJHKCJ2cGUgc2VuZCBvdXQgUiBtc2cuXG4iKTsKLQkJCXZwZV9zZW5kX291dG1zZyhNU0dfSURfVlBFX09VVFBVVF9TVF9SLCBweWFkZHIsCi0JCQkJcGNiY3JhZGRyLCBweWFkZHIpOwotCQl9IGVsc2UgaWYgKHZwZV9jdHJsLT5vdXRwdXRfdHlwZSA9PSBPVVRQVVRfVFlQRV9WKSB7Ci0JCQlDREJHKCJ2cGUgc2VuZCBvdXQgViBtc2cuXG4iKTsKLQkJCXZwZV9zZW5kX291dG1zZyhNU0dfSURfVlBFX09VVFBVVF9WLCBweWFkZHIsCi0JCQkJcGNiY3JhZGRyLCBweWFkZHIpOwotCQl9Ci0KLQkJdnBlX2N0cmwtPm91dHB1dF90eXBlID0gMDsKLQkJdnBlX2N0cmwtPnN0YXRlID0gVlBFX1NUQVRFX0lOSVQ7ICAgLyogcHV0IGl0IGJhY2sgdG8gaWRsZS4gKi8KLQotCX0KLQlrZnJlZShxY21kKTsKLX0KLURFQ0xBUkVfVEFTS0xFVCh2cGVfdGFza2xldCwgdnBlX2RvX3Rhc2tsZXQsIDApOwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgdnBlX3BhcnNlX2lycShpbnQgaXJxX251bSwgdm9pZCAqZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IGlycV9zdGF0dXMgPSAwOwotCXN0cnVjdCB2cGVfaXNyX3F1ZXVlX2NtZF90eXBlICpxY21kOwotCi0JQ0RCRygidnBlX3BhcnNlX2lycS5cbiIpOwotCS8qIHJlYWQgYW5kIGNsZWFyIGJhY2stdG8tYmFjay4gKi8KLQlpcnFfc3RhdHVzID0gbXNtX2NhbWVyYV9pb19yX21iKHZwZV9kZXZpY2UtPnZwZWJhc2UgKwotCQkJCQkJCVZQRV9JTlRSX1NUQVRVU19PRkZTRVQpOwotCW1zbV9jYW1lcmFfaW9fd19tYihpcnFfc3RhdHVzLCB2cGVfZGV2aWNlLT52cGViYXNlICsKLQkJCQlWUEVfSU5UUl9DTEVBUl9PRkZTRVQpOwotCi0JbXNtX2NhbWVyYV9pb193KDAsIHZwZV9kZXZpY2UtPnZwZWJhc2UgKyBWUEVfSU5UUl9FTkFCTEVfT0ZGU0VUKTsKLQotCWlmIChpcnFfc3RhdHVzID09IDApIHsKLQkJcHJfZXJyKCIlczogaXJxX3N0YXR1cyA9IDAsU29tZXRoaW5nIGlzIHdyb25nIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCWlycV9zdGF0dXMgJj0gMHgxOwotCS8qIGFwcGx5IG1hc2suIG9ubHkgaW50ZXJlc3RlZCBpbiBiaXQgMC4gICovCi0JaWYgKGlycV9zdGF0dXMpIHsKLQkJcWNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2cGVfaXNyX3F1ZXVlX2NtZF90eXBlKSwKLQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIXFjbWQpIHsKLQkJCXByX2VycigiJXM6IHFjbWQgbWFsbG9jIGZhaWxlZCFcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiBJUlFfSEFORExFRDsKLQkJfQotCQkvKiBtdXN0IGJlIDB4MSBub3cuIHNvIGluIGJvdHRvbSBoYWxmIHdlIGRvbid0IHJlYWxseQotCQluZWVkIHRvIGNoZWNrLiAqLwotCQlxY21kLT5pcnFfc3RhdHVzID0gaXJxX3N0YXR1cyAmIDB4MTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnZwZV9jdHJsLT50YXNrbGV0X2xvY2ssIGZsYWdzKTsKLQkJbGlzdF9hZGRfdGFpbCgmcWNtZC0+bGlzdCwgJnZwZV9jdHJsLT50YXNrbGV0X3EpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cGVfY3RybC0+dGFza2xldF9sb2NrLCBmbGFncyk7Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJnZwZV90YXNrbGV0KTsKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaW50IHZwZV9lbmFibGVfaXJxKHZvaWQpCi17Ci0JdWludDMyX3QgICByYyA9IDA7Ci0JcmMgPSByZXF1ZXN0X2lycSh2cGVfZGV2aWNlLT52cGVpcnEsCi0JCQkJdnBlX3BhcnNlX2lycSwKLQkJCQlJUlFGX1RSSUdHRVJfSElHSCwgInZwZSIsIDApOwotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV92cGVfb3Blbih2b2lkKQotewotCWludCByYyA9IDA7Ci0KLQlDREJHKCIlczogSW4gXG4iLCBfX2Z1bmNfXyk7Ci0KLQl2cGVfY3RybCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2cGVfY3RybF90eXBlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2cGVfY3RybCkgewotCQlwcl9lcnIoIiVzOiBubyBtZW1vcnkhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXNwaW5fbG9ja19pbml0KCZ2cGVfY3RybC0+b3BzX2xvY2spOwotCUNEQkcoIiVzOiBPdXRcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV92cGVfcmVsZWFzZSh2b2lkKQotewotCS8qIGNsZWFuIHVwLi4uLiovCi0JaW50IHJjID0gMDsKLQlDREJHKCIlczogc3RhdGUgJWRcbiIsIF9fZnVuY19fLCB2cGVfY3RybC0+c3RhdGUpOwotCWlmICh2cGVfY3RybC0+c3RhdGUgIT0gVlBFX1NUQVRFX0lETEUpCi0JCXJjID0gdnBlX2Rpc2FibGUoKTsKLQotCWtmcmVlKHZwZV9jdHJsKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLQotaW50IHZwZV9lbmFibGUodWludDMyX3QgY2xrX3JhdGUpCi17Ci0JaW50IHJjID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQkvKiBkb24ndCBjaGFuZ2UgdGhlIG9yZGVyIG9mIGNsb2NrIGFuZCBpcnEuKi8KLQlDREJHKCIlczogZW5hYmxlX2Nsb2NrIHJhdGUgJXVcbiIsIF9fZnVuY19fLCBjbGtfcmF0ZSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZwZV9jdHJsLT5vcHNfbG9jaywgZmxhZ3MpOwotCWlmICh2cGVfY3RybC0+c3RhdGUgIT0gVlBFX1NUQVRFX0lETEUpIHsKLQkJQ0RCRygiJXM6IFZQRSBhbHJlYWR5IGVuYWJsZWQiLCBfX2Z1bmNfXyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwZV9jdHJsLT5vcHNfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0JdnBlX2N0cmwtPnN0YXRlID0gVlBFX1NUQVRFX0lOSVQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnBlX2N0cmwtPm9wc19sb2NrLCBmbGFncyk7Ci0KLQlyYyA9IG1zbV9jYW1pb192cGVfY2xrX2VuYWJsZShjbGtfcmF0ZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBtc21fY2FtaW9fdnBlX2Nsa19lbmFibGUgZmFpbGVkIiwgX19mdW5jX18pOwotCQl2cGVfY3RybC0+c3RhdGUgPSBWUEVfU1RBVEVfSURMRTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCUNEQkcoIiVzOiBlbmFibGVfaXJxXG4iLCBfX2Z1bmNfXyk7Ci0JdnBlX2VuYWJsZV9pcnEoKTsKLQotCS8qIGluaXRpYWxpemUgdGhlIGRhdGEgc3RydWN0dXJlIC0gbG9jaywgcXVldWUgZXRjLiAqLwotCXNwaW5fbG9ja19pbml0KCZ2cGVfY3RybC0+dGFza2xldF9sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmdnBlX2N0cmwtPnRhc2tsZXRfcSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCB2cGVfZGlzYWJsZSh2b2lkKQotewotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0JQ0RCRygiJXM6IGNhbGxlZCIsIF9fZnVuY19fKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdnBlX2N0cmwtPm9wc19sb2NrLCBmbGFncyk7Ci0JaWYgKHZwZV9jdHJsLT5zdGF0ZSA9PSBWUEVfU1RBVEVfSURMRSkgewotCQlDREJHKCIlczogVlBFIGFscmVhZHkgZGlzYWJsZWQiLCBfX2Z1bmNfXyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwZV9jdHJsLT5vcHNfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0JdnBlX2N0cmwtPnN0YXRlID0gVlBFX1NUQVRFX0lETEU7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnBlX2N0cmwtPm9wc19sb2NrLCBmbGFncyk7Ci0JdnBlX2N0cmwtPm91dF95X2FkZHIgPSBtc21fY2FtZXJhX2lvX3IodnBlX2RldmljZS0+dnBlYmFzZSArCi0JCVZQRV9PVVRQMF9BRERSX09GRlNFVCk7Ci0JdnBlX2N0cmwtPm91dF9jYmNyX2FkZHIgPSBtc21fY2FtZXJhX2lvX3IodnBlX2RldmljZS0+dnBlYmFzZSArCi0JCVZQRV9PVVRQMV9BRERSX09GRlNFVCk7Ci0JZnJlZV9pcnEodnBlX2RldmljZS0+dnBlaXJxLCAwKTsKLQl0YXNrbGV0X2tpbGwoJnZwZV90YXNrbGV0KTsKLQlyYyA9IG1zbV9jYW1pb192cGVfY2xrX2Rpc2FibGUoKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgX19tc21fdnBlX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgcmVzb3VyY2UgICAqdnBlbWVtLCAqdnBlaXJxLCAqdnBlaW87Ci0Jdm9pZCBfX2lvbWVtICAgICAgKnZwZWJhc2U7Ci0KLQkvKiBmaXJzdCBhbGxvY2F0ZSAqLwotCi0JdnBlX2RldmljZSA9ICZ2cGVfZGV2aWNlX2RhdGE7Ci0JbWVtc2V0KHZwZV9kZXZpY2UsIDAsIHNpemVvZihzdHJ1Y3QgdnBlX2RldmljZV90eXBlKSk7Ci0KLQkvKiBkb2VzIHRoZSBkZXZpY2UgZXhpc3Q/ICovCi0JdnBlaXJxID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKLQlpZiAoIXZwZWlycSkgewotCQlwcl9lcnIoIiVzOiBubyB2cGUgaXJxIHJlc291cmNlLlxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gdnBlX2ZyZWVfZGV2aWNlOwotCX0KLQl2cGVtZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghdnBlbWVtKSB7Ci0JCXByX2VycigiJXM6IG5vIHZwZSBtZW0gcmVzb3VyY2UhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byB2cGVfZnJlZV9kZXZpY2U7Ci0JfQotCXZwZWlvID0gcmVxdWVzdF9tZW1fcmVnaW9uKHZwZW1lbS0+c3RhcnQsCi0JCQlyZXNvdXJjZV9zaXplKHZwZW1lbSksIHBkZXYtPm5hbWUpOwotCWlmICghdnBlaW8pIHsKLQkJcHJfZXJyKCIlczogVlBFIHJlZ2lvbiBhbHJlYWR5IGNsYWltZWQuXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIHZwZV9mcmVlX2RldmljZTsKLQl9Ci0KLQl2cGViYXNlID0KLQkJaW9yZW1hcCh2cGVtZW0tPnN0YXJ0LAotCQkJCSh2cGVtZW0tPmVuZCAtIHZwZW1lbS0+c3RhcnQpICsgMSk7Ci0JaWYgKCF2cGViYXNlKSB7Ci0JCXByX2VycigiJXM6IHZwZSBpb3JlbWFwIGZhaWxlZC5cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIHZwZV9yZWxlYXNlX21lbV9yZWdpb247Ci0JfQotCi0JLyogRmFsbCB0aHJvdWdoLCBfcHJvYmUgaXMgc3VjY2Vzc2Z1bC4gKi8KLQl2cGVfZGV2aWNlLT52cGVpcnEgPSB2cGVpcnEtPnN0YXJ0OwotCXZwZV9kZXZpY2UtPnZwZW1lbSA9IHZwZW1lbTsKLQl2cGVfZGV2aWNlLT52cGVpbyA9IHZwZWlvOwotCXZwZV9kZXZpY2UtPnZwZWJhc2UgPSB2cGViYXNlOwotCXJldHVybiByYzsgIC8qIHRoaXMgcmMgc2hvdWxkIGJlIHplcm8uKi8KLQotCWlvdW5tYXAodnBlX2RldmljZS0+dnBlYmFzZSk7ICAvKiB0aGlzIHBhdGggc2hvdWxkIG5ldmVyIG9jY3VyICovCi0JdnBlX2RldmljZS0+dnBlYmFzZSA9IE5VTEw7Ci0vKiBmcm9tIHRoaXMgcGFydCBpdCBpcyBlcnJvciBoYW5kbGluZy4gKi8KLXZwZV9yZWxlYXNlX21lbV9yZWdpb246Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHZwZW1lbS0+c3RhcnQsICh2cGVtZW0tPmVuZCAtIHZwZW1lbS0+c3RhcnQpICsgMSk7Ci12cGVfZnJlZV9kZXZpY2U6Ci0JcmV0dXJuIHJjOyAgLyogdGhpcyByYyBzaG91bGQgaGF2ZSBlcnJvciBjb2RlLiAqLwotfQotCi1zdGF0aWMgaW50IF9fbXNtX3ZwZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgcmVzb3VyY2UJKnZwZW1lbTsKLQl2cGVtZW0gPSB2cGVfZGV2aWNlLT52cGVtZW07Ci0KLQlpb3VubWFwKHZwZV9kZXZpY2UtPnZwZWJhc2UpOwotCXZwZV9kZXZpY2UtPnZwZWJhc2UgPSBOVUxMOwotCXJlbGVhc2VfbWVtX3JlZ2lvbih2cGVtZW0tPnN0YXJ0LAotCQkJCQkodnBlbWVtLT5lbmQgLSB2cGVtZW0tPnN0YXJ0KSArIDEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fdnBlX2RyaXZlciA9IHsKLQkucHJvYmUgPSBfX21zbV92cGVfcHJvYmUsCi0JLnJlbW92ZSA9IF9fbXNtX3ZwZV9yZW1vdmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtX3ZwZSIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fdnBlX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fdnBlX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChtc21fdnBlX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXNtX3ZwZV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV92cGVfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG1zbV92cGVfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigibXNtIHZwZSAxLjAgZHJpdmVyIik7Ci1NT0RVTEVfVkVSU0lPTigibXNtIHZwZSBkcml2ZXIgMS4wIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXNtX3ZwZTEuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tc21fdnBlMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmQ3YTRhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tc21fdnBlMS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9tc21fdnBlMV9oXwotI2RlZmluZSBfbXNtX3ZwZTFfaF8KLQotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0KLS8qKioqKioqKioqKiAgc3RhcnQgb2YgcmVnaXN0ZXIgb2Zmc2V0ICoqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVlBFX0lOVFJfRU5BQkxFX09GRlNFVCAgICAgICAgICAgICAgICAweDAwMjAKLSNkZWZpbmUgVlBFX0lOVFJfU1RBVFVTX09GRlNFVCAgICAgICAgICAgICAgICAweDAwMjQKLSNkZWZpbmUgVlBFX0lOVFJfQ0xFQVJfT0ZGU0VUICAgICAgICAgICAgICAgICAweDAwMjgKLSNkZWZpbmUgVlBFX0RMMF9TVEFSVF9PRkZTRVQgICAgICAgICAgICAgICAgICAweDAwMzAKLSNkZWZpbmUgVlBFX0hXX1ZFUlNJT05fT0ZGU0VUICAgICAgICAgICAgICAgICAweDAwNzAKLSNkZWZpbmUgVlBFX1NXX1JFU0VUX09GRlNFVCAgICAgICAgICAgICAgICAgICAweDAwNzQKLSNkZWZpbmUgVlBFX0FYSV9SRF9BUkJfQ09ORklHX09GRlNFVCAgICAgICAgICAweDAwNzgKLSNkZWZpbmUgVlBFX1NFTF9DTEtfT1JfSENMS19URVNUX0JVU19PRkZTRVQgICAweDAwN0MKLSNkZWZpbmUgVlBFX0NHQ19FTl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAweDAxMDAKLSNkZWZpbmUgVlBFX0NNRF9TVEFUVVNfT0ZGU0VUICAgICAgICAgICAgICAgICAweDEwMDA4Ci0jZGVmaW5lIFZQRV9QUk9GSUxFX0VOX09GRlNFVCAgICAgICAgICAgICAgICAgMHgxMDAxMAotI2RlZmluZSBWUEVfUFJPRklMRV9DT1VOVF9PRkZTRVQgICAgICAgICAgICAgIDB4MTAwMTQKLSNkZWZpbmUgVlBFX0NNRF9NT0RFX09GRlNFVCAgICAgICAgICAgICAgICAgICAweDEwMDYwCi0jZGVmaW5lIFZQRV9TUkNfU0laRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgMHgxMDEwOAotI2RlZmluZSBWUEVfU1JDUDBfQUREUl9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MTAxMEMKLSNkZWZpbmUgVlBFX1NSQ1AxX0FERFJfT0ZGU0VUICAgICAgICAgICAgICAgICAweDEwMTEwCi0jZGVmaW5lIFZQRV9TUkNfWVNUUklERTFfT0ZGU0VUICAgICAgICAgICAgICAgMHgxMDExQwotI2RlZmluZSBWUEVfU1JDX0ZPUk1BVF9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MTAxMjQKLSNkZWZpbmUgVlBFX1NSQ19VTlBBQ0tfUEFUVEVSTjFfT0ZGU0VUICAgICAgICAweDEwMTI4Ci0jZGVmaW5lIFZQRV9PUF9NT0RFX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgxMDEzOAotI2RlZmluZSBWUEVfU0NBTEVfUEhBU0VYX0lOSVRfT0ZGU0VUICAgICAgICAgIDB4MTAxM0MKLSNkZWZpbmUgVlBFX1NDQUxFX1BIQVNFWV9JTklUX09GRlNFVCAgICAgICAgICAweDEwMTQwCi0jZGVmaW5lIFZQRV9TQ0FMRV9QSEFTRVhfU1RFUF9PRkZTRVQgICAgICAgICAgMHgxMDE0NAotI2RlZmluZSBWUEVfU0NBTEVfUEhBU0VZX1NURVBfT0ZGU0VUICAgICAgICAgIDB4MTAxNDgKLSNkZWZpbmUgVlBFX09VVF9GT1JNQVRfT0ZGU0VUICAgICAgICAgICAgICAgICAweDEwMTUwCi0jZGVmaW5lIFZQRV9PVVRfUEFDS19QQVRURVJOMV9PRkZTRVQgICAgICAgICAgMHgxMDE1NAotI2RlZmluZSBWUEVfT1VUX1NJWkVfT0ZGU0VUICAgICAgICAgICAgICAgICAgIDB4MTAxNjQKLSNkZWZpbmUgVlBFX09VVFAwX0FERFJfT0ZGU0VUICAgICAgICAgICAgICAgICAweDEwMTY4Ci0jZGVmaW5lIFZQRV9PVVRQMV9BRERSX09GRlNFVCAgICAgICAgICAgICAgICAgMHgxMDE2QwotI2RlZmluZSBWUEVfT1VUX1lTVFJJREUxX09GRlNFVCAgICAgICAgICAgICAgIDB4MTAxNzgKLSNkZWZpbmUgVlBFX09VVF9YWV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAweDEwMTlDCi0jZGVmaW5lIFZQRV9TUkNfWFlfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgMHgxMDIwMAotI2RlZmluZSBWUEVfU1JDX0lNQUdFX1NJWkVfT0ZGU0VUICAgICAgICAgICAgIDB4MTAyMDgKLSNkZWZpbmUgVlBFX1NDQUxFX0NPTkZJR19PRkZTRVQgICAgICAgICAgICAgICAweDEwMjMwCi0jZGVmaW5lIFZQRV9ERUlOVF9TVEFUVVNfT0ZGU0VUICAgICAgICAgICAgICAgMHgzMDAwMAotI2RlZmluZSBWUEVfREVJTlRfREVDSVNJT05fT0ZGU0VUICAgICAgICAgICAgIDB4MzAwMDQKLSNkZWZpbmUgVlBFX0RFSU5UX0NPRUZGMF9PRkZTRVQgICAgICAgICAgICAgICAweDMwMDEwCi0jZGVmaW5lIFZQRV9TQ0FMRV9TVEFUVVNfT0ZGU0VUICAgICAgICAgICAgICAgMHg1MDAwMAotI2RlZmluZSBWUEVfU0NBTEVfU1ZJX1BBUkFNX09GRlNFVCAgICAgICAgICAgIDB4NTAwMTAKLSNkZWZpbmUgVlBFX1NDQUxFX1NIQVJQRU5fQ0ZHX09GRlNFVCAgICAgICAgICAweDUwMDIwCi0jZGVmaW5lIFZQRV9TQ0FMRV9DT0VGRl9MU1BfMF9PRkZTRVQgICAgICAgICAgMHg1MDQwMAotI2RlZmluZSBWUEVfU0NBTEVfQ09FRkZfTVNQXzBfT0ZGU0VUICAgICAgICAgIDB4NTA0MDQKLQotI2RlZmluZSBWUEVfQVhJX0FSQl8yX09GRlNFVCAgICAgICAgICAgICAgICAgIDB4MDA0QwotCi0jZGVmaW5lIFZQRV9TQ0FMRV9DT0VGRl9MU0JuKG4pCSgweDUwNDAwICsgOCAqIChuKSkKLSNkZWZpbmUgVlBFX1NDQUxFX0NPRUZGX01TQm4obikJKDB4NTA0MDQgKyA4ICogKG4pKQotI2RlZmluZSBWUEVfU0NBTEVfQ09FRkZfTlVNCQkJMzIKLQotLyoqKioqKioqKioqIGVuZCBvZiByZWdpc3RlciBvZmZzZXQgKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBWUEVfSEFSRFdBUkVfVkVSU0lPTiAgICAgICAgICAweDAwMDgwMzA4Ci0jZGVmaW5lIFZQRV9TV19SRVNFVF9WQUxVRSAgICAgICAgICAgIDB4MDAwMDAwMTAgIC8qIGJpdCA0IGZvciBQUFAqLwotI2RlZmluZSBWUEVfQVhJX1JEX0FSQl9DT05GSUdfVkFMVUUgICAweDEyNDkyNAotI2RlZmluZSBWUEVfQ01EX01PREVfVkFMVUUgICAgICAgIDB4MQotI2RlZmluZSBWUEVfREVGQVVMVF9PUF9NT0RFX1ZBTFVFICAgICAweDQwRkMwMDA0Ci0jZGVmaW5lIFZQRV9DR0NfRU5BQkxFX1ZBTFVFICAgICAgICAgIDB4ZmZmZgotI2RlZmluZSBWUEVfREVGQVVMVF9TQ0FMRV9DT05GSUcgICAgICAweDNjCi0KLSNkZWZpbmUgVlBFX05PUk1BTF9NT0RFX0NMT0NLX1JBVEUgICAxNTAwMDAwMDAKLSNkZWZpbmUgVlBFX1RVUkJPX01PREVfQ0xPQ0tfUkFURSAgIDIwMDAwMDAwMAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqIFN0YXJ0IG9mIGNvbW1hbmQgaWQgKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZW51bSBWUEVfQ01EX0lEX0VOVU0gewotCVZQRV9EVU1NWV8wID0gMCwKLQlWUEVfU0VUX0NMSywKLQlWUEVfUkVTRVQsCi0JVlBFX1NUQVJULAotCVZQRV9BQk9SVCwKLQlWUEVfT1BFUkFUSU9OX01PREVfQ0ZHLCAvKiA1ICovCi0JVlBFX0lOUFVUX1BMQU5FX0NGRywKLQlWUEVfT1VUUFVUX1BMQU5FX0NGRywKLQlWUEVfSU5QVVRfUExBTkVfVVBEQVRFLAotCVZQRV9TQ0FMRV9DRkdfVFlQRSwKLQlWUEVfUk9UQVRJT05fQ0ZHX1RZUEUsIC8qIDEwICovCi0JVlBFX0FYSV9PVVRfQ0ZHLAotCVZQRV9DTURfRElTX09GRlNFVF9DRkcsCi0JVlBFX0VOQUJMRSwKLQlWUEVfRElTQUJMRSwKLX07Ci0KLS8qIExlbmd0aCBvZiBlYWNoIGNvbW1hbmQuICBJbiBieXRlcy4gIChwYXlsb2FkIG9ubHkpICovCi0jZGVmaW5lIFZQRV9PUEVSQVRJT05fTU9ERV9DRkdfTEVOIDgKLSNkZWZpbmUgVlBFX0lOUFVUX1BMQU5FX0NGR19MRU4gICAgMjQKLSNkZWZpbmUgVlBFX09VVFBVVF9QTEFORV9DRkdfTEVOICAgMjAKLSNkZWZpbmUgVlBFX0lOUFVUX1BMQU5FX1VQREFURV9MRU4gMTIKLSNkZWZpbmUgVlBFX1NDQUxFUl9DT05GSUdfTEVOICAgICAgMjYwCi0jZGVmaW5lIFZQRV9ESVNfT0ZGU0VUX0NGR19MRU4gICAgIDEyCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKiogRW5kIG9mIGNvbW1hbmQgaWQgKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBtc21fdnBlX2NtZCB7Ci0JaW50MzJfdCAgaWQ7Ci0JdWludDE2X3QgbGVuZ3RoOwotCXZvaWQgICAgICp2YWx1ZTsKLX07Ci0KLXN0cnVjdCB2cGVfY21kX3R5cGUgewotCXVpbnQxNl90IGlkOwotCXVpbnQzMl90IGxlbmd0aDsKLX07Ci0KLXN0cnVjdCB2cGVfaXNyX3F1ZXVlX2NtZF90eXBlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgbGlzdDsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgaXJxX3N0YXR1czsKLX07Ci0KLWVudW0gVlBFX01FU1NBR0VfSUQgewotCU1TR19JRF9WUEVfT1VUUFVUX1YgPSA3LCAvKiBUbyBtYXRjaCB3aXRoIHRoYXQgb2YgVkZFICovCi0JTVNHX0lEX1ZQRV9PVVRQVVRfU1RfTCwKLQlNU0dfSURfVlBFX09VVFBVVF9TVF9SLAotfTsKLQotZW51bSB2cGVfc3RhdGUgewotCVZQRV9TVEFURV9JRExFLAotCVZQRV9TVEFURV9JTklULAotCVZQRV9TVEFURV9BQ1RJVkUsCi19OwotCi1zdHJ1Y3QgdnBlX2RldmljZV90eXBlIHsKLQkvKiBkZXZpY2UgcmVsYXRlZC4gKi8KLQlpbnQgICB2cGVpcnE7Ci0Jdm9pZCBfX2lvbWVtICAgICAgKnZwZWJhc2U7Ci0Jc3RydWN0IHJlc291cmNlCSAgKnZwZW1lbTsKLQlzdHJ1Y3QgcmVzb3VyY2UgICAqdnBlaW87Ci0Jdm9pZCAgICAgICAgKmRldmljZV9leHRkYXRhOwotfTsKLQotc3RydWN0IGRpc19vZmZzZXRfdHlwZSB7Ci0JaW50MzJfdCBkaXNfb2Zmc2V0X3g7Ci0JaW50MzJfdCBkaXNfb2Zmc2V0X3k7Ci0JdWludDMyX3QgZnJhbWVfaWQ7Ci19OwotCi1zdHJ1Y3QgdnBlX2N0cmxfdHlwZSB7Ci0Jc3BpbmxvY2tfdCAgICAgICAgdGFza2xldF9sb2NrOwotCXNwaW5sb2NrX3QgICAgICAgIHN0YXRlX2xvY2s7Ci0Jc3BpbmxvY2tfdCAgICAgICAgb3BzX2xvY2s7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkICB0YXNrbGV0X3E7Ci0Jdm9pZCAgICAgICAgICAgICAgKnN5bmNkYXRhOwotCXVpbnQxNl90ICAgICAgICAgIG9wX21vZGU7Ci0Jdm9pZCAgICAgICAgICAgICAgKmV4dGRhdGE7Ci0JdWludDMyX3QgICAgICAgICAgZXh0bGVuOwotCXN0cnVjdCBtc21fdnBlX2NhbGxiYWNrICpyZXNwOwotCXVpbnQzMl90ICAgICAgICAgIGluX2hfdzsKLQl1aW50MzJfdCAgICAgICAgICBvdXRfaDsgIC8qIHRoaXMgaXMgQkVGT1JFIHJvdGF0aW9uLiAqLwotCXVpbnQzMl90ICAgICAgICAgIG91dF93OyAgLyogdGhpcyBpcyBCRUZPUkUgcm90YXRpb24uICovCi0JdWludDMyX3QgICAgICAgICAgZGlzX2VuOwotCXN0cnVjdCB0aW1lc3BlYyAgIHRzOwotCXN0cnVjdCBkaXNfb2Zmc2V0X3R5cGUgICBkaXNfb2Zmc2V0OwotCXVpbnQzMl90ICAgICAgICAgIHBjYmNyX2JlZm9yZV9kaXM7Ci0JdWludDMyX3QgICAgICAgICAgcGNiY3JfZGlzX29mZnNldDsKLQlpbnQgICAgICAgICAgICAgICBvdXRwdXRfdHlwZTsKLQlpbnQgICAgICAgICAgICAgICBmcmFtZV9wYWNrOwotCXVpbnQ4X3QgICAgICAgICAgIHBhZF8ya19ib29sOwotCWVudW0gdnBlX3N0YXRlICAgIHN0YXRlOwotCXVuc2lnbmVkIGxvbmcgICAgIG91dF95X2FkZHI7Ci0JdW5zaWduZWQgbG9uZyAgICAgb3V0X2NiY3JfYWRkcjsKLX07Ci0KLS8qCi0qIHZwZV9pbnB1dF91cGRhdGUKLSoKLSogRGVmaW5lIHRoZSBwYXJhbWV0ZXJzIGZvciBvdXRwdXQgcGxhbmUKLSovCi0vKiB0aGlzIGlzIHRoZSBkaW1lbnNpb24gb2YgUk9JLiAgd2lkdGggLyBoZWlnaHQuICovCi1zdHJ1Y3QgdnBlX3NyY19zaXplX3BhY2tlZCB7Ci0JdWludDMyX3QgICAgICAgIHNyY193OwotCXVpbnQzMl90ICAgICAgICBzcmNfaDsKLX07Ci0KLXN0cnVjdCB2cGVfc3JjX3h5X3BhY2tlZCB7Ci0JdWludDMyX3QgICAgICAgIHNyY194OwotCXVpbnQzMl90ICAgICAgICBzcmNfeTsKLX07Ci0KLXN0cnVjdCB2cGVfaW5wdXRfcGxhbmVfdXBkYXRlX3R5cGUgewotCXN0cnVjdCB2cGVfc3JjX3NpemVfcGFja2VkICAgICAgICAgICAgIHNyY19yb2lfc2l6ZTsKLQkvKiBESVMgdXBkYXRlcyB0aGlzIHNldC4gKi8KLQlzdHJ1Y3QgdnBlX3NyY194eV9wYWNrZWQgICAgICAgICAgICAgICBzcmNfcm9pX29mZnNldDsKLQkvKiBpbnB1dCBhZGRyZXNzKi8KLQl1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICpzcmNfcDBfYWRkcjsKLQl1aW50OF90ICAgICAgICAgICAgICAgICAgICAgICAgICpzcmNfcDFfYWRkcjsKLX07Ci0KLXN0cnVjdCB2cGVfbXNnX3N0YXRzewotCXVpbnQzMl90ICAgIGJ1ZmZlcjsKLQl1aW50MzJfdCAgICBmcmFtZUNvdW50ZXI7Ci19OwotCi1zdHJ1Y3QgdnBlX21zZ19vdXRwdXQgewotCXVpbnQ4X3QgICBvdXRwdXRfaWQ7Ci0JdWludDMyX3QgIHAwX0J1ZmZlcjsKLQl1aW50MzJfdCAgcDFfQnVmZmVyOwotCXVpbnQzMl90ICBwMl9CdWZmZXI7Ci0JdWludDMyX3QgIGZyYW1lQ291bnRlcjsKLX07Ci0KLXN0cnVjdCB2cGVfbWVzc2FnZSB7Ci0JdWludDhfdCAgX2Q7Ci0JdW5pb24gewotCQlzdHJ1Y3QgdnBlX21zZ19vdXRwdXQgICAgICAgICAgICAgIG1zZ091dDsKLQkJc3RydWN0IHZwZV9tc2dfc3RhdHMgICAgICAgICAgICAgICBtc2dTdGF0czsKLQl9IF91OwotfTsKLQotI2RlZmluZSBTQ0FMRVJfUEhBU0VfQklUUyAyOQotI2RlZmluZSBIQUxfTURQX1BIQVNFX1NURVBfMlA1MCAgICAweDUwMDAwMDAwCi0jZGVmaW5lIEhBTF9NRFBfUEhBU0VfU1RFUF8xUDY2ICAgIDB4MzU1NTU1NTUKLSNkZWZpbmUgSEFMX01EUF9QSEFTRV9TVEVQXzFQMjUgICAgMHgyODAwMDAwMAotCi1zdHJ1Y3QgcGhhc2VfdmFsX3QgewotCWludDMyX3QgcGhhc2VfaW5pdF94OwotCWludDMyX3QgcGhhc2VfaW5pdF95OwotCWludDMyX3QgcGhhc2Vfc3RlcF94OwotCWludDMyX3QgcGhhc2Vfc3RlcF95OwotfTsKLQotZXh0ZXJuIHN0cnVjdCB2cGVfY3RybF90eXBlICp2cGVfY3RybDsKLQotaW50IG1zbV92cGVfb3Blbih2b2lkKTsKLWludCBtc21fdnBlX3JlbGVhc2Uodm9pZCk7Ci1pbnQgbXNtX3ZwZV9yZWcoc3RydWN0IG1zbV92cGVfY2FsbGJhY2sgKnByZXNwKTsKLXZvaWQgbXNtX3NlbmRfZnJhbWVfdG9fdnBlKHVpbnQzMl90IHB5YWRkciwgdWludDMyX3QgcGNiY3JhZGRyLAotCXN0cnVjdCB0aW1lc3BlYyAqdHMsIGludCBvdXRwdXRfaWQpOwotaW50IG1zbV92cGVfY29uZmlnKHN0cnVjdCBtc21fdnBlX2NmZ19jbWQgKmNtZCwgdm9pZCAqZGF0YSk7Ci1pbnQgbXNtX3ZwZV9jZmdfdXBkYXRlKHZvaWQgKnBpbmZvKTsKLXZvaWQgbXNtX3ZwZV9vZmZzZXRfdXBkYXRlKGludCBmcmFtZV9wYWNrLCB1aW50MzJfdCBweWFkZHIsIHVpbnQzMl90IHBjYmNyYWRkciwKLQlzdHJ1Y3QgdGltZXNwZWMgKnRzLCBpbnQgb3V0cHV0X2lkLCBzdHJ1Y3QgbXNtX3N0X2hhbGYgc3RfaGFsZiwKLQlpbnQgZnJhbWVpZCk7Ci0jZW5kaWYgLypfbXNtX3ZwZTFfaF8qLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5ZDExMi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL210OWQxMTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxOTk2NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5ZDExMi5jCisrKyAvZGV2L251bGwKQEAgLTEsODQ2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLSNpbmNsdWRlICJtdDlkMTEyLmgiCi0KLS8qIE1pY3JvbiBNVDlEMTEyIFJlZ2lzdGVycyBhbmQgdGhlaXIgdmFsdWVzICovCi0vKiBTZW5zb3IgQ29yZSBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgIFJFR19NVDlEMTEyX01PREVMX0lEIDB4MzAwMAotI2RlZmluZSAgTVQ5RDExMl9NT0RFTF9JRCAgICAgMHgxNTgwCi0KLS8qICBTT0MgUmVnaXN0ZXJzIFBhZ2UgMSAgKi8KLSNkZWZpbmUgIFJFR19NVDlEMTEyX1NFTlNPUl9SRVNFVCAgICAgMHgzMDFBCi0jZGVmaW5lICBSRUdfTVQ5RDExMl9TVEFOREJZX0NPTlRST0wgIDB4MzIwMgotI2RlZmluZSAgUkVHX01UOUQxMTJfTUNVX0JPT1QgICAgICAgICAweDMzODYKLQotI2RlZmluZSBTRU5TT1JfREVCVUcgMAotCi1zdHJ1Y3QgbXQ5ZDExMl93b3JrIHsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgIG10OWQxMTJfd29yayAqbXQ5ZDExMl9zZW5zb3J3Owotc3RhdGljIHN0cnVjdCAgaTJjX2NsaWVudCAqbXQ5ZDExMl9jbGllbnQ7Ci0KLXN0cnVjdCBtdDlkMTEyX2N0cmwgewotCWNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzZW5zb3JkYXRhOwotfTsKLQotCi1zdGF0aWMgc3RydWN0IG10OWQxMTJfY3RybCAqbXQ5ZDExMl9jdHJsOwotCi1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobXQ5ZDExMl93YWl0X3F1ZXVlKTsKLURFRklORV9TRU1BUEhPUkUobXQ5ZDExMl9zZW0pOwotc3RhdGljIGludDE2X3QgbXQ5ZDExMl9lZmZlY3QgPSBDQU1FUkFfRUZGRUNUX09GRjsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRVhURVJOQUwgREVDTEFSQVRJT05TCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1leHRlcm4gc3RydWN0IG10OWQxMTJfcmVnIG10OWQxMTJfcmVnczsKLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgaW50IG10OWQxMTJfcmVzZXQoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRldikKLXsKLQlpbnQgcmMgPSAwOwotCi0JcmMgPSBncGlvX3JlcXVlc3QoZGV2LT5zZW5zb3JfcmVzZXQsICJtdDlkMTEyIik7Ci0KLQlpZiAoIXJjKSB7Ci0JCXJjID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRldi0+c2Vuc29yX3Jlc2V0LCAwKTsKLQkJbXNsZWVwKDIwKTsKLQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoZGV2LT5zZW5zb3JfcmVzZXQsIDEpOwotCQltc2xlZXAoMjApOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5ZDExMl9pMmNfdHhkYXRhKHVuc2lnbmVkIHNob3J0IHNhZGRyLAotCXVuc2lnbmVkIGNoYXIgKnR4ZGF0YSwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKLQkJewotCQkJLmFkZHIgPSBzYWRkciwKLQkJCS5mbGFncyA9IDAsCi0JCQkubGVuID0gbGVuZ3RoLAotCQkJLmJ1ZiA9IHR4ZGF0YSwKLQkJfSwKLQl9OwotCi0jaWYgU0VOU09SX0RFQlVHCi0JaWYgKGxlbmd0aCA9PSAyKQotCQlDREJHKCJtc21faW9faTJjX3c6IDB4JTA0eCAweCUwNHhcbiIsCi0JCQkqKHUxNiAqKSB0eGRhdGEsICoodTE2ICopICh0eGRhdGEgKyAyKSk7Ci0JZWxzZSBpZiAobGVuZ3RoID09IDQpCi0JCUNEQkcoIm1zbV9pb19pMmNfdzogMHglMDR4XG4iLCAqKHUxNiAqKSB0eGRhdGEpOwotCWVsc2UKLQkJQ0RCRygibXNtX2lvX2kyY193OiBsZW5ndGggPSAlZFxuIiwgbGVuZ3RoKTsKLSNlbmRpZgotCWlmIChpMmNfdHJhbnNmZXIobXQ5ZDExMl9jbGllbnQtPmFkYXB0ZXIsIG1zZywgMSkgPCAwKSB7Ci0JCUNEQkcoIm10OWQxMTJfaTJjX3R4ZGF0YSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5ZDExMl9pMmNfd3JpdGUodW5zaWduZWQgc2hvcnQgc2FkZHIsCi0JdW5zaWduZWQgc2hvcnQgd2FkZHIsIHVuc2lnbmVkIHNob3J0IHdkYXRhLCBlbnVtIG10OWQxMTJfd2lkdGggd2lkdGgpCi17Ci0JaW50MzJfdCByYyA9IC1FSU87Ci0JdW5zaWduZWQgY2hhciBidWZbNF07Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0Jc3dpdGNoICh3aWR0aCkgewotCWNhc2UgV09SRF9MRU46IHsKLQkJYnVmWzBdID0gKHdhZGRyICYgMHhGRjAwKT4+ODsKLQkJYnVmWzFdID0gKHdhZGRyICYgMHgwMEZGKTsKLQkJYnVmWzJdID0gKHdkYXRhICYgMHhGRjAwKT4+ODsKLQkJYnVmWzNdID0gKHdkYXRhICYgMHgwMEZGKTsKLQotCQlyYyA9IG10OWQxMTJfaTJjX3R4ZGF0YShzYWRkciwgYnVmLCA0KTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBCWVRFX0xFTjogewotCQlidWZbMF0gPSB3YWRkcjsKLQkJYnVmWzFdID0gd2RhdGE7Ci0JCXJjID0gbXQ5ZDExMl9pMmNfdHhkYXRhKHNhZGRyLCBidWYsIDIpOwotCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlpZiAocmMgPCAwKQotCQlDREJHKAotCQkiaTJjX3dyaXRlIGZhaWxlZCwgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXghXG4iLAotCQl3YWRkciwgd2RhdGEpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlkMTEyX2kyY193cml0ZV90YWJsZSgKLQlzdHJ1Y3QgbXQ5ZDExMl9pMmNfcmVnX2NvbmYgY29uc3QgKnJlZ19jb25mX3RibCwKLQlpbnQgbnVtX29mX2l0ZW1zX2luX3RhYmxlKQotewotCWludCBpOwotCWludDMyX3QgcmMgPSAtRUlPOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9vZl9pdGVtc19pbl90YWJsZTsgaSsrKSB7Ci0JCXJjID0gbXQ5ZDExMl9pMmNfd3JpdGUobXQ5ZDExMl9jbGllbnQtPmFkZHIsCi0JCQlyZWdfY29uZl90YmwtPndhZGRyLCByZWdfY29uZl90YmwtPndkYXRhLAotCQkJcmVnX2NvbmZfdGJsLT53aWR0aCk7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQkJaWYgKHJlZ19jb25mX3RibC0+bWRlbGF5X3RpbWUgIT0gMCkKLQkJCW1kZWxheShyZWdfY29uZl90YmwtPm1kZWxheV90aW1lKTsKLQkJcmVnX2NvbmZfdGJsKys7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG10OWQxMTJfaTJjX3J4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQl1bnNpZ25lZCBjaGFyICpyeGRhdGEsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGkyY19tc2cgbXNnc1tdID0gewotCXsKLQkJLmFkZHIgICA9IHNhZGRyLAotCQkuZmxhZ3MgPSAwLAotCQkubGVuICAgPSAyLAotCQkuYnVmICAgPSByeGRhdGEsCi0JfSwKLQl7Ci0JCS5hZGRyICAgPSBzYWRkciwKLQkJLmZsYWdzID0gSTJDX01fUkQsCi0JCS5sZW4gICA9IGxlbmd0aCwKLQkJLmJ1ZiAgID0gcnhkYXRhLAotCX0sCi0JfTsKLQotI2lmIFNFTlNPUl9ERUJVRwotCWlmIChsZW5ndGggPT0gMikKLQkJQ0RCRygibXNtX2lvX2kyY19yOiAweCUwNHggMHglMDR4XG4iLAotCQkJKih1MTYgKikgcnhkYXRhLCAqKHUxNiAqKSAocnhkYXRhICsgMikpOwotCWVsc2UgaWYgKGxlbmd0aCA9PSA0KQotCQlDREJHKCJtc21faW9faTJjX3I6IDB4JTA0eFxuIiwgKih1MTYgKikgcnhkYXRhKTsKLQllbHNlCi0JCUNEQkcoIm1zbV9pb19pMmNfcjogbGVuZ3RoID0gJWRcbiIsIGxlbmd0aCk7Ci0jZW5kaWYKLQotCWlmIChpMmNfdHJhbnNmZXIobXQ5ZDExMl9jbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpIDwgMCkgewotCQlDREJHKCJtdDlkMTEyX2kyY19yeGRhdGEgZmFpbGVkIVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlkMTEyX2kyY19yZWFkKHVuc2lnbmVkIHNob3J0ICAgc2FkZHIsCi0JdW5zaWduZWQgc2hvcnQgcmFkZHIsIHVuc2lnbmVkIHNob3J0ICpyZGF0YSwgZW51bSBtdDlkMTEyX3dpZHRoIHdpZHRoKQotewotCWludDMyX3QgcmMgPSAwOwotCXVuc2lnbmVkIGNoYXIgYnVmWzRdOwotCi0JaWYgKCFyZGF0YSkKLQkJcmV0dXJuIC1FSU87Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0KLQlzd2l0Y2ggKHdpZHRoKSB7Ci0JY2FzZSBXT1JEX0xFTjogewotCQlidWZbMF0gPSAocmFkZHIgJiAweEZGMDApPj44OwotCQlidWZbMV0gPSAocmFkZHIgJiAweDAwRkYpOwotCi0JCXJjID0gbXQ5ZDExMl9pMmNfcnhkYXRhKHNhZGRyLCBidWYsIDIpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCSpyZGF0YSA9IGJ1ZlswXSA8PCA4IHwgYnVmWzFdOwotCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlpZiAocmMgPCAwKQotCQlDREJHKCJtdDlkMTEyX2kyY19yZWFkIGZhaWxlZCFcbiIpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlkMTEyX3NldF9sZW5zX3JvbGxfb2ZmKHZvaWQpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JcmMgPSBtdDlkMTEyX2kyY193cml0ZV90YWJsZSgmbXQ5ZDExMl9yZWdzLnJmdGJsWzBdLAotCQkJCQkJCQkgbXQ5ZDExMl9yZWdzLnJmdGJsX3NpemUpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgbXQ5ZDExMl9yZWdfaW5pdCh2b2lkKQotewotCWludDMyX3QgYXJyYXlfbGVuZ3RoOwotCWludDMyX3QgaTsKLQlsb25nIHJjOwotCi0JLyogUExMIFNldHVwIFN0YXJ0ICovCi0JcmMgPSBtdDlkMTEyX2kyY193cml0ZV90YWJsZSgmbXQ5ZDExMl9yZWdzLnBsbHRibFswXSwKLQkJCQkJbXQ5ZDExMl9yZWdzLnBsbHRibF9zaXplKTsKLQotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQkvKiBQTEwgU2V0dXAgRW5kICAgKi8KLQotCWFycmF5X2xlbmd0aCA9IG10OWQxMTJfcmVncy5wcmV2X3NuYXBfcmVnX3NldHRpbmdzX3NpemU7Ci0KLQkvKiBDb25maWd1cmUgc2Vuc29yIGZvciBQcmV2aWV3IG1vZGUgYW5kIFNuYXBzaG90IG1vZGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgYXJyYXlfbGVuZ3RoOyBpKyspIHsKLQkJcmMgPSBtdDlkMTEyX2kyY193cml0ZShtdDlkMTEyX2NsaWVudC0+YWRkciwKLQkJICBtdDlkMTEyX3JlZ3MucHJldl9zbmFwX3JlZ19zZXR0aW5nc1tpXS5yZWdpc3Rlcl9hZGRyZXNzLAotCQkgIG10OWQxMTJfcmVncy5wcmV2X3NuYXBfcmVnX3NldHRpbmdzW2ldLnJlZ2lzdGVyX3ZhbHVlLAotCQkgIFdPUkRfTEVOKTsKLQotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIENvbmZpZ3VyZSBmb3IgTm9pc2UgUmVkdWN0aW9uLCBTYXR1cmF0aW9uIGFuZCBBcGVydHVyZSBDb3JyZWN0aW9uICovCi0JYXJyYXlfbGVuZ3RoID0gbXQ5ZDExMl9yZWdzLm5vaXNlX3JlZHVjdGlvbl9yZWdfc2V0dGluZ3Nfc2l6ZTsKLQotCWZvciAoaSA9IDA7IGkgPCBhcnJheV9sZW5ndGg7IGkrKykgewotCQlyYyA9IG10OWQxMTJfaTJjX3dyaXRlKG10OWQxMTJfY2xpZW50LT5hZGRyLAotCQkJbXQ5ZDExMl9yZWdzLm5vaXNlX3JlZHVjdGlvbl9yZWdfc2V0dGluZ3NbaV0ucmVnaXN0ZXJfYWRkcmVzcywKLQkJCW10OWQxMTJfcmVncy5ub2lzZV9yZWR1Y3Rpb25fcmVnX3NldHRpbmdzW2ldLnJlZ2lzdGVyX3ZhbHVlLAotCQkJV09SRF9MRU4pOwotCi0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0JLyogU2V0IENvbG9yIEtpbGwgU2F0dXJhdGlvbiBwb2ludCB0byBvcHRpbXVtIHZhbHVlICovCi0JcmMgPQotCW10OWQxMTJfaTJjX3dyaXRlKG10OWQxMTJfY2xpZW50LT5hZGRyLAotCTB4MzVBNCwKLQkweDA1OTMsCi0JV09SRF9MRU4pOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gbXQ5ZDExMl9pMmNfd3JpdGVfdGFibGUoJm10OWQxMTJfcmVncy5zdGJsWzBdLAotCQkJCQltdDlkMTEyX3JlZ3Muc3RibF9zaXplKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IG10OWQxMTJfc2V0X2xlbnNfcm9sbF9vZmYoKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgbXQ5ZDExMl9zZXRfZWZmZWN0KGludCBtb2RlLCBpbnQgZWZmZWN0KQotewotCXVpbnQxNl90IHJlZ19hZGRyOwotCXVpbnQxNl90IHJlZ192YWw7Ci0JbG9uZyByYyA9IDA7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFNFTlNPUl9QUkVWSUVXX01PREU6Ci0JCS8qIENvbnRleHQgQSBTcGVjaWFsIEVmZmVjdHMgKi8KLQkJcmVnX2FkZHIgPSAweDI3OTk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTRU5TT1JfUkFXX1NOQVBTSE9UX01PREU6Ci0JY2FzZSBTRU5TT1JfU05BUFNIT1RfTU9ERToKLQkJLyogQ29udGV4dCBCIFNwZWNpYWwgRWZmZWN0cyAqLwotCQlyZWdfYWRkciA9IDB4Mjc5QjsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZWdfYWRkciA9IDB4Mjc5OTsKLQkJYnJlYWs7Ci0JfQotCi0Jc3dpdGNoIChlZmZlY3QpIHsKLQljYXNlIENBTUVSQV9FRkZFQ1RfT0ZGOiB7Ci0JCXJlZ192YWwgPSAweDY0NDA7Ci0KLQkJcmMgPSBtdDlkMTEyX2kyY193cml0ZShtdDlkMTEyX2NsaWVudC0+YWRkciwKLQkJCTB4MzM4QywgcmVnX2FkZHIsIFdPUkRfTEVOKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9IG10OWQxMTJfaTJjX3dyaXRlKG10OWQxMTJfY2xpZW50LT5hZGRyLAotCQkJMHgzMzkwLCByZWdfdmFsLCBXT1JEX0xFTik7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfQotCQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9FRkZFQ1RfTU9OTzogewotCQlyZWdfdmFsID0gMHg2NDQxOwotCQlyYyA9IG10OWQxMTJfaTJjX3dyaXRlKG10OWQxMTJfY2xpZW50LT5hZGRyLAotCQkJMHgzMzhDLCByZWdfYWRkciwgV09SRF9MRU4pOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0gbXQ5ZDExMl9pMmNfd3JpdGUobXQ5ZDExMl9jbGllbnQtPmFkZHIsCi0JCQkweDMzOTAsIHJlZ192YWwsIFdPUkRfTEVOKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1FUkFfRUZGRUNUX05FR0FUSVZFOiB7Ci0JCXJlZ192YWwgPSAweDY0NDM7Ci0JCXJjID0gbXQ5ZDExMl9pMmNfd3JpdGUobXQ5ZDExMl9jbGllbnQtPmFkZHIsCi0JCQkweDMzOEMsIHJlZ19hZGRyLCBXT1JEX0xFTik7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPSBtdDlkMTEyX2kyY193cml0ZShtdDlkMTEyX2NsaWVudC0+YWRkciwKLQkJCTB4MzM5MCwgcmVnX3ZhbCwgV09SRF9MRU4pOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9FRkZFQ1RfU09MQVJJWkU6IHsKLQkJcmVnX3ZhbCA9IDB4NjQ0NTsKLQkJcmMgPSBtdDlkMTEyX2kyY193cml0ZShtdDlkMTEyX2NsaWVudC0+YWRkciwKLQkJCTB4MzM4QywgcmVnX2FkZHIsIFdPUkRfTEVOKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9IG10OWQxMTJfaTJjX3dyaXRlKG10OWQxMTJfY2xpZW50LT5hZGRyLAotCQkJMHgzMzkwLCByZWdfdmFsLCBXT1JEX0xFTik7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgQ0FNRVJBX0VGRkVDVF9TRVBJQTogewotCQlyZWdfdmFsID0gMHg2NDQyOwotCQlyYyA9IG10OWQxMTJfaTJjX3dyaXRlKG10OWQxMTJfY2xpZW50LT5hZGRyLAotCQkJMHgzMzhDLCByZWdfYWRkciwgV09SRF9MRU4pOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0gbXQ5ZDExMl9pMmNfd3JpdGUobXQ5ZDExMl9jbGllbnQtPmFkZHIsCi0JCQkweDMzOTAsIHJlZ192YWwsIFdPUkRfTEVOKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDogewotCQlyZWdfdmFsID0gMHg2NDQwOwotCQlyYyA9IG10OWQxMTJfaTJjX3dyaXRlKG10OWQxMTJfY2xpZW50LT5hZGRyLAotCQkJMHgzMzhDLCByZWdfYWRkciwgV09SRF9MRU4pOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0gbXQ5ZDExMl9pMmNfd3JpdGUobXQ5ZDExMl9jbGllbnQtPmFkZHIsCi0JCQkweDMzOTAsIHJlZ192YWwsIFdPUkRfTEVOKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JfQotCW10OWQxMTJfZWZmZWN0ID0gZWZmZWN0OwotCS8qIFJlZnJlc2ggU2VxdWVuY2VyICovCi0JcmMgPSBtdDlkMTEyX2kyY193cml0ZShtdDlkMTEyX2NsaWVudC0+YWRkciwKLQkJMHgzMzhDLCAweEExMDMsIFdPUkRfTEVOKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IG10OWQxMTJfaTJjX3dyaXRlKG10OWQxMTJfY2xpZW50LT5hZGRyLAotCQkweDMzOTAsIDB4MDAwNSwgV09SRF9MRU4pOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBtdDlkMTEyX3NldF9zZW5zb3JfbW9kZShpbnQgbW9kZSkKLXsKLQl1aW50MTZfdCBjbG9jazsKLQlsb25nIHJjID0gMDsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgU0VOU09SX1BSRVZJRVdfTU9ERToKLQkJcmMgPQotCQkJbXQ5ZDExMl9pMmNfd3JpdGUobXQ5ZDExMl9jbGllbnQtPmFkZHIsCi0JCQkJMHgzMzhDLCAweEEyMEMsIFdPUkRfTEVOKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9Ci0JCQltdDlkMTEyX2kyY193cml0ZShtdDlkMTEyX2NsaWVudC0+YWRkciwKLQkJCQkweDMzOTAsIDB4MDAwNCwgV09SRF9MRU4pOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0KLQkJCW10OWQxMTJfaTJjX3dyaXRlKG10OWQxMTJfY2xpZW50LT5hZGRyLAotCQkJCTB4MzM4QywgMHhBMjE1LCBXT1JEX0xFTik7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5ZDExMl9pMmNfd3JpdGUobXQ5ZDExMl9jbGllbnQtPmFkZHIsCi0JCQkJMHgzMzkwLCAweDAwMDQsIFdPUkRfTEVOKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9Ci0JCQltdDlkMTEyX2kyY193cml0ZShtdDlkMTEyX2NsaWVudC0+YWRkciwKLQkJCQkweDMzOEMsIDB4QTIwQiwgV09SRF9MRU4pOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0KLQkJCW10OWQxMTJfaTJjX3dyaXRlKG10OWQxMTJfY2xpZW50LT5hZGRyLAotCQkJCTB4MzM5MCwgMHgwMDAwLCBXT1JEX0xFTik7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJY2xvY2sgPSAweDIzQzsKLQotCQlyYyA9Ci0JCQltdDlkMTEyX2kyY193cml0ZShtdDlkMTEyX2NsaWVudC0+YWRkciwKLQkJCQkweDM0MUMsIGNsb2NrLCBXT1JEX0xFTik7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5ZDExMl9pMmNfd3JpdGUobXQ5ZDExMl9jbGllbnQtPmFkZHIsCi0JCQkJMHgzMzhDLCAweEExMDMsIFdPUkRfTEVOKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9Ci0JCQltdDlkMTEyX2kyY193cml0ZShtdDlkMTEyX2NsaWVudC0+YWRkciwKLQkJCQkweDMzOTAsIDB4MDAwMSwgV09SRF9MRU4pOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQltZGVsYXkoNSk7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFNFTlNPUl9TTkFQU0hPVF9NT0RFOgotCQkvKiBTd2l0Y2ggdG8gbG93ZXIgZnBzIGZvciBTbmFwc2hvdCAqLwotCQlyYyA9Ci0JCQltdDlkMTEyX2kyY193cml0ZShtdDlkMTEyX2NsaWVudC0+YWRkciwKLQkJCQkweDM0MUMsIDB4MDEyMCwgV09SRF9MRU4pOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0KLQkJCW10OWQxMTJfaTJjX3dyaXRlKG10OWQxMTJfY2xpZW50LT5hZGRyLAotCQkJCTB4MzM4QywgMHhBMTIwLCBXT1JEX0xFTik7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJbXNsZWVwKDQwKTsvKndhaXRpbmcgZm9yIHRoZSBkZWxheSBvZiBvbmUgZnJhbWUqLwotCQlyYyA9Ci0JCQltdDlkMTEyX2kyY193cml0ZShtdDlkMTEyX2NsaWVudC0+YWRkciwKLQkJCQkweDMzOTAsIDB4MDAwMiwgV09SRF9MRU4pOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCW1zbGVlcCg4MCk7Lyp3YWl0aW5nIGZvciB0aGUgZGVsYXkgb2YgdHdvIGZyYW1lcyovCi0KLQkJcmMgPQotCQkJbXQ5ZDExMl9pMmNfd3JpdGUobXQ5ZDExMl9jbGllbnQtPmFkZHIsCi0JCQkJMHgzMzhDLCAweEExMDMsIFdPUkRfTEVOKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQltc2xlZXAoNDApOy8qd2FpdGluZyBmb3IgdGhlIGRlbGF5IG9mIG9uZSBmcmFtZSovCi0JCXJjID0KLQkJCW10OWQxMTJfaTJjX3dyaXRlKG10OWQxMTJfY2xpZW50LT5hZGRyLAotCQkJCTB4MzM5MCwgMHgwMDAyLCBXT1JEX0xFTik7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JCWJyZWFrOwotCi0JY2FzZSBTRU5TT1JfUkFXX1NOQVBTSE9UX01PREU6Ci0JCS8qIFNldHRpbmcgdGhlIGVmZmVjdCB0byBDQU1FUkFfRUZGRUNUX09GRiAqLwotCQlyYyA9Ci0JCQltdDlkMTEyX2kyY193cml0ZShtdDlkMTEyX2NsaWVudC0+YWRkciwKLQkJCQkweDMzOEMsIDB4Mjc5QiwgV09SRF9MRU4pOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0KLQkJCW10OWQxMTJfaTJjX3dyaXRlKG10OWQxMTJfY2xpZW50LT5hZGRyLAotCQkJMHgzMzkwLCAweDY0NDAsIFdPUkRfTEVOKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJbXNsZWVwKDQwKTsvKndhaXRpbmcgZm9yIHRoZSBkZWxheSBvZiBvbmUgZnJhbWUqLwotCQkvKiBTd2l0Y2ggdG8gbG93ZXIgZnBzIGZvciBTbmFwc2hvdCAqLwotCQlyYyA9Ci0JCQltdDlkMTEyX2kyY193cml0ZShtdDlkMTEyX2NsaWVudC0+YWRkciwKLQkJCQkweDM0MUMsIDB4MDEyMCwgV09SRF9MRU4pOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0KLQkJCW10OWQxMTJfaTJjX3dyaXRlKG10OWQxMTJfY2xpZW50LT5hZGRyLAotCQkJCTB4MzM4QywgMHhBMTIwLCBXT1JEX0xFTik7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5ZDExMl9pMmNfd3JpdGUobXQ5ZDExMl9jbGllbnQtPmFkZHIsCi0JCQkJMHgzMzkwLCAweDAwMDIsIFdPUkRfTEVOKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJbXNsZWVwKDgwKTsvKndhaXRpbmcgZm9yIHRoZSBkZWxheSBvZiB0d28gZnJhbWVzIGZyYW1lKi8KLQkJcmMgPQotCQkJbXQ5ZDExMl9pMmNfd3JpdGUobXQ5ZDExMl9jbGllbnQtPmFkZHIsCi0JCQkJMHgzMzhDLCAweEExMDMsIFdPUkRfTEVOKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJbXNsZWVwKDQwKTsvKndhaXRpbmcgZm9yIHRoZSBkZWxheSBvZiBvbmUgZnJhbWUqLwotCQlyYyA9Ci0JCQltdDlkMTEyX2kyY193cml0ZShtdDlkMTEyX2NsaWVudC0+YWRkciwKLQkJCQkweDMzOTAsIDB4MDAwMiwgV09SRF9MRU4pOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG10OWQxMTJfc2Vuc29yX2luaXRfcHJvYmUoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JdWludDE2X3QgbW9kZWxfaWQgPSAwOwotCWludCByYyA9IDA7Ci0KLQlDREJHKCJpbml0IGVudHJ5IFxuIik7Ci0JcmMgPSBtdDlkMTEyX3Jlc2V0KGRhdGEpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygicmVzZXQgZmFpbGVkIVxuIik7Ci0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCX0KLQotCW1zbV9jYW1pb19jbGtfcmF0ZV9zZXQoMjQwMDAwMDApOwotCW1zbGVlcCgyMCk7Ci0KLQkvKiBNaWNyb24gc3VnZ2VzdGVkIFBvd2VyIHVwIGJsb2NrIFN0YXJ0OgotCSogUHV0IE1DVSBpbnRvIFJlc2V0IC0gU3RvcCBNQ1UgKi8KLQlyYyA9IG10OWQxMTJfaTJjX3dyaXRlKG10OWQxMTJfY2xpZW50LT5hZGRyLAotCQlSRUdfTVQ5RDExMl9NQ1VfQk9PVCwgMHgwNTAxLCBXT1JEX0xFTik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0KLQkvKiBQdWxsIE1DVSBmcm9tIFJlc2V0IC0gU3RhcnQgTUNVICovCi0JcmMgPSBtdDlkMTEyX2kyY193cml0ZShtdDlkMTEyX2NsaWVudC0+YWRkciwKLQkJUkVHX01UOUQxMTJfTUNVX0JPT1QsIDB4MDUwMCwgV09SRF9MRU4pOwotCWlmIChyYyA8IDApCi0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCi0JbWRlbGF5KDUpOwotCi0JLyogTWljcm9uIFN1Z2dlc3RlZCAtIFBvd2VyIHVwIGJsb2NrICovCi0JcmMgPSBtdDlkMTEyX2kyY193cml0ZShtdDlkMTEyX2NsaWVudC0+YWRkciwKLQkJUkVHX01UOUQxMTJfU0VOU09SX1JFU0VULCAweDBBQ0MsIFdPUkRfTEVOKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGluaXRfcHJvYmVfZmFpbDsKLQotCXJjID0gbXQ5ZDExMl9pMmNfd3JpdGUobXQ5ZDExMl9jbGllbnQtPmFkZHIsCi0JCVJFR19NVDlEMTEyX1NUQU5EQllfQ09OVFJPTCwgMHgwMDA4LCBXT1JEX0xFTik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0KLQkvKiBGVVNFRF9ERUZFQ1RfQ09SUkVDVElPTiAqLwotCXJjID0gbXQ5ZDExMl9pMmNfd3JpdGUobXQ5ZDExMl9jbGllbnQtPmFkZHIsCi0JCTB4MzNGNCwgMHgwMzFELCBXT1JEX0xFTik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0KLQltZGVsYXkoNSk7Ci0KLQkvKiBNaWNyb24gc3VnZ2VzdGVkIFBvd2VyIHVwIGJsb2NrIEVuZCAqLwotCS8qIFJlYWQgdGhlIE1vZGVsIElEIG9mIHRoZSBzZW5zb3IgKi8KLQlyYyA9IG10OWQxMTJfaTJjX3JlYWQobXQ5ZDExMl9jbGllbnQtPmFkZHIsCi0JCVJFR19NVDlEMTEyX01PREVMX0lELCAmbW9kZWxfaWQsIFdPUkRfTEVOKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGluaXRfcHJvYmVfZmFpbDsKLQotCUNEQkcoIm10OWQxMTIgbW9kZWxfaWQgPSAweCV4XG4iLCBtb2RlbF9pZCk7Ci0KLQkvKiBDaGVjayBpZiBpdCBtYXRjaGVzIGl0IHdpdGggdGhlIHZhbHVlIGluIERhdGFzaGVldCAqLwotCWlmIChtb2RlbF9pZCAhPSBNVDlEMTEyX01PREVMX0lEKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCi0JcmMgPSBtdDlkMTEyX3JlZ19pbml0KCk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0KLQlyZXR1cm4gcmM7Ci0KLWluaXRfcHJvYmVfZmFpbDoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtdDlkMTEyX3NlbnNvcl9pbml0KGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCWludCByYyA9IDA7Ci0KLQltdDlkMTEyX2N0cmwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXQ5ZDExMl9jdHJsKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtdDlkMTEyX2N0cmwpIHsKLQkJQ0RCRygibXQ5ZDExMl9pbml0IGZhaWxlZCFcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gaW5pdF9kb25lOwotCX0KLQotCWlmIChkYXRhKQotCQltdDlkMTEyX2N0cmwtPnNlbnNvcmRhdGEgPSBkYXRhOwotCi0JLyogSW5wdXQgTUNMSyA9IDI0TUh6ICovCi0JbXNtX2NhbWlvX2Nsa19yYXRlX3NldCgyNDAwMDAwMCk7Ci0JbWRlbGF5KDUpOwotCi0JbXNtX2NhbWlvX2NhbWlmX3BhZF9yZWdfcmVzZXQoKTsKLQotCXJjID0gbXQ5ZDExMl9zZW5zb3JfaW5pdF9wcm9iZShkYXRhKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIm10OWQxMTJfc2Vuc29yX2luaXQgZmFpbGVkIVxuIik7Ci0JCWdvdG8gaW5pdF9mYWlsOwotCX0KLQotaW5pdF9kb25lOgotCXJldHVybiByYzsKLQotaW5pdF9mYWlsOgotCWtmcmVlKG10OWQxMTJfY3RybCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG10OWQxMTJfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQkvKiBJbml0aWFsaXplIHRoZSBNU01fQ0FNSTJDIENoaXAgKi8KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtdDlkMTEyX3dhaXRfcXVldWUpOwotCXJldHVybiAwOwotfQotCi1pbnQgbXQ5ZDExMl9zZW5zb3JfY29uZmlnKHZvaWQgX191c2VyICphcmdwKQotewotCXN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEgY2ZnX2RhdGE7Ci0JbG9uZyAgIHJjID0gMDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnX2RhdGEsCi0JCQkodm9pZCAqKWFyZ3AsCi0JCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCS8qIGRvd24oJm10OWQxMTJfc2VtKTsgKi8KLQotCUNEQkcoIm10OWQxMTJfaW9jdGwsIGNmZ3R5cGUgPSAlZCwgbW9kZSA9ICVkXG4iLAotCQljZmdfZGF0YS5jZmd0eXBlLCBjZmdfZGF0YS5tb2RlKTsKLQotCQlzd2l0Y2ggKGNmZ19kYXRhLmNmZ3R5cGUpIHsKLQkJY2FzZSBDRkdfU0VUX01PREU6Ci0JCQlyYyA9IG10OWQxMTJfc2V0X3NlbnNvcl9tb2RlKAotCQkJCQkJY2ZnX2RhdGEubW9kZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19TRVRfRUZGRUNUOgotCQkJcmMgPSBtdDlkMTEyX3NldF9lZmZlY3QoY2ZnX2RhdGEubW9kZSwKLQkJCQkJCWNmZ19kYXRhLmNmZy5lZmZlY3QpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfR0VUX0FGX01BWF9TVEVQUzoKLQkJZGVmYXVsdDoKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkvKiB1cCgmbXQ5ZDExMl9zZW0pOyAqLwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXQ5ZDExMl9zZW5zb3JfcmVsZWFzZSh2b2lkKQotewotCWludCByYyA9IDA7Ci0KLQkvKiBkb3duKCZtdDlkMTEyX3NlbSk7ICovCi0JZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAobXQ5ZDExMl9jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCW1zbGVlcCgyMCk7Ci0JZ3Bpb19mcmVlKG10OWQxMTJfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3Jlc2V0KTsKLQlrZnJlZShtdDlkMTEyX2N0cmwpOwotCS8qIHVwKCZtdDlkMTEyX3NlbSk7ICovCi0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXQ5ZDExMl9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJjID0gMDsKLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgewotCQlyYyA9IC1FTk9UU1VQUDsKLQkJZ290byBwcm9iZV9mYWlsdXJlOwotCX0KLQotCW10OWQxMTJfc2Vuc29ydyA9Ci0JCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtdDlkMTEyX3dvcmspLCBHRlBfS0VSTkVMKTsKLQotCWlmICghbXQ5ZDExMl9zZW5zb3J3KSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBwcm9iZV9mYWlsdXJlOwotCX0KLQotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIG10OWQxMTJfc2Vuc29ydyk7Ci0JbXQ5ZDExMl9pbml0X2NsaWVudChjbGllbnQpOwotCW10OWQxMTJfY2xpZW50ID0gY2xpZW50OwotCi0JQ0RCRygibXQ5ZDExMl9wcm9iZSBzdWNjZWVkZWQhXG4iKTsKLQotCXJldHVybiAwOwotCi1wcm9iZV9mYWlsdXJlOgotCWtmcmVlKG10OWQxMTJfc2Vuc29ydyk7Ci0JbXQ5ZDExMl9zZW5zb3J3ID0gTlVMTDsKLQlDREJHKCJtdDlkMTEyX3Byb2JlIGZhaWxlZCFcbiIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG10OWQxMTJfaTJjX2lkW10gPSB7Ci0JeyAibXQ5ZDExMiIsIDB9LAotCXsgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtdDlkMTEyX2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gbXQ5ZDExMl9pMmNfaWQsCi0JLnByb2JlICA9IG10OWQxMTJfaTJjX3Byb2JlLAotCS5yZW1vdmUgPSBfX2V4aXRfcChtdDlkMTEyX2kyY19yZW1vdmUpLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm10OWQxMTIiLAotCX0sCi19OwotCi1zdGF0aWMgaW50IG10OWQxMTJfc2Vuc29yX3Byb2JlKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICppbmZvLAotCQkJCXN0cnVjdCBtc21fc2Vuc29yX2N0cmwgKnMpCi17Ci0JaW50IHJjID0gaTJjX2FkZF9kcml2ZXIoJm10OWQxMTJfaTJjX2RyaXZlcik7Ci0JaWYgKHJjIDwgMCB8fCBtdDlkMTEyX2NsaWVudCA9PSBOVUxMKSB7Ci0JCXJjID0gLUVOT1RTVVBQOwotCQlnb3RvIHByb2JlX2RvbmU7Ci0JfQotCi0JLyogSW5wdXQgTUNMSyA9IDI0TUh6ICovCi0JbXNtX2NhbWlvX2Nsa19yYXRlX3NldCgyNDAwMDAwMCk7Ci0JbWRlbGF5KDUpOwotCi0JcmMgPSBtdDlkMTEyX3NlbnNvcl9pbml0X3Byb2JlKGluZm8pOwotCWlmIChyYyA8IDApIHsKLQkJZ3Bpb19mcmVlKGluZm8tPnNlbnNvcl9yZXNldCk7Ci0JCWdvdG8gcHJvYmVfZG9uZTsKLQl9Ci0Jcy0+c19pbml0ID0gbXQ5ZDExMl9zZW5zb3JfaW5pdDsKLQlzLT5zX3JlbGVhc2UgPSBtdDlkMTEyX3NlbnNvcl9yZWxlYXNlOwotCXMtPnNfY29uZmlnICA9IG10OWQxMTJfc2Vuc29yX2NvbmZpZzsKLQlzLT5zX2NhbWVyYV90eXBlID0gRlJPTlRfQ0FNRVJBXzJEOwotCXMtPnNfbW91bnRfYW5nbGUgID0gMDsKLQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChpbmZvLT5zZW5zb3JfcmVzZXQsIDApOwotCW1zbGVlcCgyMCk7Ci0JZ3Bpb19mcmVlKGluZm8tPnNlbnNvcl9yZXNldCk7Ci0KLXByb2JlX2RvbmU6Ci0JQ0RCRygiJXMgJXM6JWRcbiIsIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX210OWQxMTJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gbXNtX2NhbWVyYV9kcnZfc3RhcnQocGRldiwgbXQ5ZDExMl9zZW5zb3JfcHJvYmUpOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fY2FtZXJhX2RyaXZlciA9IHsKLQkucHJvYmUgPSBfX210OWQxMTJfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtX2NhbWVyYV9tdDlkMTEyIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG10OWQxMTJfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9jYW1lcmFfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQobXQ5ZDExMl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDlkMTEyLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5ZDExMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDdkNzMyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDlkMTEyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgTVQ5RDExMl9ICi0jZGVmaW5lIE1UOUQxMTJfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotCi1leHRlcm4gc3RydWN0IG10OWQxMTJfcmVnIG10OWQxMTJfcmVnczsKLQotZW51bSBtdDlkMTEyX3dpZHRoIHsKLQlXT1JEX0xFTiwKLQlCWVRFX0xFTgotfTsKLQotc3RydWN0IG10OWQxMTJfaTJjX3JlZ19jb25mIHsKLQl1bnNpZ25lZCBzaG9ydCB3YWRkcjsKLQl1bnNpZ25lZCBzaG9ydCB3ZGF0YTsKLQllbnVtIG10OWQxMTJfd2lkdGggd2lkdGg7Ci0JdW5zaWduZWQgc2hvcnQgbWRlbGF5X3RpbWU7Ci19OwotCi1zdHJ1Y3QgbXQ5ZDExMl9yZWcgewotCWNvbnN0IHN0cnVjdCByZWdpc3Rlcl9hZGRyZXNzX3ZhbHVlX3BhaXIgKnByZXZfc25hcF9yZWdfc2V0dGluZ3M7Ci0JdWludDE2X3QgcHJldl9zbmFwX3JlZ19zZXR0aW5nc19zaXplOwotCWNvbnN0IHN0cnVjdCByZWdpc3Rlcl9hZGRyZXNzX3ZhbHVlX3BhaXIgKm5vaXNlX3JlZHVjdGlvbl9yZWdfc2V0dGluZ3M7Ci0JdWludDE2X3Qgbm9pc2VfcmVkdWN0aW9uX3JlZ19zZXR0aW5nc19zaXplOwotCWNvbnN0IHN0cnVjdCBtdDlkMTEyX2kyY19yZWdfY29uZiAqcGxsdGJsOwotCXVpbnQxNl90IHBsbHRibF9zaXplOwotCWNvbnN0IHN0cnVjdCBtdDlkMTEyX2kyY19yZWdfY29uZiAqc3RibDsKLQl1aW50MTZfdCBzdGJsX3NpemU7Ci0JY29uc3Qgc3RydWN0IG10OWQxMTJfaTJjX3JlZ19jb25mICpyZnRibDsKLQl1aW50MTZfdCByZnRibF9zaXplOwotfTsKLQotI2VuZGlmIC8qIE1UOUQxMTJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL210OWQxMTJfcmVnLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5ZDExMl9yZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzNWNiYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5ZDExMl9yZWcuYworKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlICJtdDlkMTEyLmgiCi0KLQotc3RydWN0IHJlZ2lzdGVyX2FkZHJlc3NfdmFsdWVfcGFpciBjb25zdAotcHJldmlld19zbmFwc2hvdF9tb2RlX3JlZ19zZXR0aW5nc19hcnJheVtdID0gewotCXsweDMzOEMsIDB4MjcwM30sCi0JezB4MzM5MCwgODAwfSwgICAgLyogT3V0cHV0IFdpZHRoIChQKSA9IDY0MCAqLwotCXsweDMzOEMsIDB4MjcwNX0sCi0JezB4MzM5MCwgNjAwfSwgICAgLyogT3V0cHV0IEhlaWdodCAoUCkgPSA0ODAgKi8KLQl7MHgzMzhDLCAweDI3MDd9LAotCXsweDMzOTAsIDB4MDY0MH0sIC8qIE91dHB1dCBXaWR0aCAoUykgPSAxNjAwICovCi0JezB4MzM4QywgMHgyNzA5fSwKLQl7MHgzMzkwLCAweDA0QjB9LCAvKiBPdXRwdXQgSGVpZ2h0IChTKSA9IDEyMDAgKi8KLQl7MHgzMzhDLCAweDI3MER9LAotCXsweDMzOTAsIDB4MDAwMH0sIC8qIFJvdyBTdGFydCAoUCkgPSAwICovCi0JezB4MzM4QywgMHgyNzBGfSwKLQl7MHgzMzkwLCAweDAwMDB9LCAvKiBDb2x1bW4gU3RhcnQgKFApID0gMCAqLwotCXsweDMzOEMsIDB4MjcxMX0sCi0JezB4MzM5MCwgMHgwNEJEfSwgLyogUm93IEVuZCAoUCkgPSAxMjEzICovCi0JezB4MzM4QywgMHgyNzEzfSwKLQl7MHgzMzkwLCAweDA2NER9LCAvKiBDb2x1bW4gRW5kIChQKSA9IDE2MTMgKi8KLQl7MHgzMzhDLCAweDI3MTV9LAotCXsweDMzOTAsIDB4MDAwMH0sIC8qIEV4dHJhIERlbGF5IChQKSA9IDAgKi8KLQl7MHgzMzhDLCAweDI3MTd9LAotCXsweDMzOTAsIDB4MjExMX0sIC8qIFJvdyBTcGVlZCAoUCkgPSA4NDY1ICovCi0JezB4MzM4QywgMHgyNzE5fSwKLQl7MHgzMzkwLCAweDA0NkN9LCAvKiBSZWFkIE1vZGUgKFApID0gMTEzMiAqLwotCXsweDMzOEMsIDB4MjcxQn0sCi0JezB4MzM5MCwgMHgwMjRGfSwgLyogU2Vuc29yX1NhbXBsZV9UaW1lX3BjayhQKSA9IDU5MSAqLwotCXsweDMzOEMsIDB4MjcxRH0sCi0JezB4MzM5MCwgMHgwMTAyfSwgLyogU2Vuc29yX0ZpbmVfQ29ycmVjdGlvbihQKSA9IDI1OCAqLwotCXsweDMzOEMsIDB4MjcxRn0sCi0JezB4MzM5MCwgMHgwMjc5fSwgLyogU2Vuc29yX0ZpbmVfSVRfbWluKFApID0gNjMzICovCi0JezB4MzM4QywgMHgyNzIxfSwKLQl7MHgzMzkwLCAweDAxNTV9LCAvKiBTZW5zb3JfRmluZV9JVF9tYXhfbWFyZ2luKFApID0gMzQxICovCi0JezB4MzM4QywgMHgyNzIzfSwKLQl7MHgzMzkwLCA2NTl9LCAgICAvKiBGcmFtZSBMaW5lcyAoUCkgPSA2NzkgKi8KLQl7MHgzMzhDLCAweDI3MjV9LAotCXsweDMzOTAsIDB4MDYxQn0sIC8qIExpbmUgTGVuZ3RoIChQKSA9IDE1NjMgKi8KLQl7MHgzMzhDLCAweDI3Mjd9LAotCXsweDMzOTAsIDB4MjAyMH0sCi0JezB4MzM4QywgMHgyNzI5fSwKLQl7MHgzMzkwLCAweDIwMjB9LAotCXsweDMzOEMsIDB4MjcyQn0sCi0JezB4MzM5MCwgMHgxMDIwfSwKLQl7MHgzMzhDLCAweDI3MkR9LAotCXsweDMzOTAsIDB4MjAwN30sCi0JezB4MzM4QywgMHgyNzJGfSwKLQl7MHgzMzkwLCAweDAwMDR9LCAvKiBSb3cgU3RhcnQoUykgPSA0ICovCi0JezB4MzM4QywgMHgyNzMxfSwKLQl7MHgzMzkwLCAweDAwMDR9LCAvKiBDb2x1bW4gU3RhcnQoUykgPSA0ICovCi0JezB4MzM4QywgMHgyNzMzfSwKLQl7MHgzMzkwLCAweDA0QkJ9LCAvKiBSb3cgRW5kKFMpID0gMTIxMSAqLwotCXsweDMzOEMsIDB4MjczNX0sCi0JezB4MzM5MCwgMHgwNjRCfSwgLyogQ29sdW1uIEVuZChTKSA9IDE2MTEgKi8KLQl7MHgzMzhDLCAweDI3Mzd9LAotCXsweDMzOTAsIDB4MDRDRX0sIC8qIEV4dHJhIERlbGF5KFMpID0gMTIzMCAqLwotCXsweDMzOEMsIDB4MjczOX0sCi0JezB4MzM5MCwgMHgyMTExfSwgLyogUm93IFNwZWVkKFMpID0gODQ2NSAqLwotCXsweDMzOEMsIDB4MjczQn0sCi0JezB4MzM5MCwgMHgwMDI0fSwgLyogUmVhZCBNb2RlKFMpID0gMzYgKi8KLQl7MHgzMzhDLCAweDI3M0R9LAotCXsweDMzOTAsIDB4MDEyMH0sIC8qIFNlbnNvciBzYW1wbGUgdGltZSBwY2soUykgPSAyODggKi8KLQl7MHgzMzhDLCAweDI3NDF9LAotCXsweDMzOTAsIDB4MDE2OX0sIC8qIFNlbnNvcl9GaW5lX0lUX21pbihQKSA9IDM2MSAqLwotCXsweDMzOEMsIDB4Mjc0NX0sCi0JezB4MzM5MCwgMHgwNEZGfSwgLyogRnJhbWUgTGluZXMoUykgPSAxMjc5ICovCi0JezB4MzM4QywgMHgyNzQ3fSwKLQl7MHgzMzkwLCAweDA4MjR9LCAvKiBMaW5lIExlbmd0aChTKSA9IDIwODQgKi8KLQl7MHgzMzhDLCAweDI3NTF9LAotCXsweDMzOTAsIDB4MDAwMH0sIC8qIENyb3BfWDAoUCkgPSAwICovCi0JezB4MzM4QywgMHgyNzUzfSwKLQl7MHgzMzkwLCAweDAzMjB9LCAvKiBDcm9wX1gxKFApID0gODAwICovCi0JezB4MzM4QywgMHgyNzU1fSwKLQl7MHgzMzkwLCAweDAwMDB9LCAvKiBDcm9wX1kwKFApID0gMCAqLwotCXsweDMzOEMsIDB4Mjc1N30sCi0JezB4MzM5MCwgMHgwMjU4fSwgLyogQ3JvcF9ZMShQKSA9IDYwMCAqLwotCXsweDMzOEMsIDB4Mjc1Rn0sCi0JezB4MzM5MCwgMHgwMDAwfSwgLyogQ3JvcF9YMChTKSA9IDAgKi8KLQl7MHgzMzhDLCAweDI3NjF9LAotCXsweDMzOTAsIDB4MDY0MH0sIC8qIENyb3BfWDEoUykgPSAxNjAwICovCi0JezB4MzM4QywgMHgyNzYzfSwKLQl7MHgzMzkwLCAweDAwMDB9LCAvKiBDcm9wX1kwKFMpID0gMCAqLwotCXsweDMzOEMsIDB4Mjc2NX0sCi0JezB4MzM5MCwgMHgwNEIwfSwgLyogQ3JvcF9ZMShTKSA9IDEyMDAgKi8KLQl7MHgzMzhDLCAweDIyMkV9LAotCXsweDMzOTAsIDB4MDBBMH0sIC8qIFI5IFN0ZXAgPSAxNjAgKi8KLQl7MHgzMzhDLCAweEE0MDh9LAotCXsweDMzOTAsIDB4MDAxRn0sCi0JezB4MzM4QywgMHhBNDA5fSwKLQl7MHgzMzkwLCAweDAwMjF9LAotCXsweDMzOEMsIDB4QTQwQX0sCi0JezB4MzM5MCwgMHgwMDI1fSwKLQl7MHgzMzhDLCAweEE0MEJ9LAotCXsweDMzOTAsIDB4MDAyN30sCi0JezB4MzM4QywgMHgyNDExfSwKLQl7MHgzMzkwLCAweDAwQTB9LAotCXsweDMzOEMsIDB4MjQxM30sCi0JezB4MzM5MCwgMHgwMEMwfSwKLQl7MHgzMzhDLCAweDI0MTV9LAotCXsweDMzOTAsIDB4MDBBMH0sCi0JezB4MzM4QywgMHgyNDE3fSwKLQl7MHgzMzkwLCAweDAwQzB9LAotCXsweDMzOEMsIDB4Mjc5OX0sCi0JezB4MzM5MCwgMHg2NDA4fSwgLyogTU9ERV9TUEVDX0VGRkVDVFMoUCkgKi8KLQl7MHgzMzhDLCAweDI3OUJ9LAotCXsweDMzOTAsIDB4NjQwOH0sIC8qIE1PREVfU1BFQ19FRkZFQ1RTKFMpICovCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ2lzdGVyX2FkZHJlc3NfdmFsdWVfcGFpciBjb25zdAotbm9pc2VfcmVkdWN0aW9uX3JlZ19zZXR0aW5nc19hcnJheVtdID0gewotCXsweDMzOEMsIDB4QTc2RH0sCi0JezB4MzM5MCwgMHgwMDAzfSwKLQl7MHgzMzhDLCAweEE3NkV9LAotCXsweDMzOTAsIDB4MDAwM30sCi0JezB4MzM4QywgMHhBNzZGfSwKLQl7MHgzMzkwLCAwfSwKLQl7MHgzMzhDLCAweEE3NzB9LAotCXsweDMzOTAsIDIxfSwKLQl7MHgzMzhDLCAweEE3NzF9LAotCXsweDMzOTAsIDM3fSwKLQl7MHgzMzhDLCAweEE3NzJ9LAotCXsweDMzOTAsIDYzfSwKLQl7MHgzMzhDLCAweEE3NzN9LAotCXsweDMzOTAsIDEwMH0sCi0JezB4MzM4QywgMHhBNzc0fSwKLQl7MHgzMzkwLCAxMjh9LAotCXsweDMzOEMsIDB4QTc3NX0sCi0JezB4MzM5MCwgMTUxfSwKLQl7MHgzMzhDLCAweEE3NzZ9LAotCXsweDMzOTAsIDE2OX0sCi0JezB4MzM4QywgMHhBNzc3fSwKLQl7MHgzMzkwLCAxODZ9LAotCXsweDMzOEMsIDB4QTc3OH0sCi0JezB4MzM5MCwgMTk5fSwKLQl7MHgzMzhDLCAweEE3Nzl9LAotCXsweDMzOTAsIDIxMH0sCi0JezB4MzM4QywgMHhBNzdBfSwKLQl7MHgzMzkwLCAyMjB9LAotCXsweDMzOEMsIDB4QTc3Qn0sCi0JezB4MzM5MCwgMjI4fSwKLQl7MHgzMzhDLCAweEE3N0N9LAotCXsweDMzOTAsIDIzNH0sCi0JezB4MzM4QywgMHhBNzdEfSwKLQl7MHgzMzkwLCAyNDB9LAotCXsweDMzOEMsIDB4QTc3RX0sCi0JezB4MzM5MCwgMjQ0fSwKLQl7MHgzMzhDLCAweEE3N0Z9LAotCXsweDMzOTAsIDI0OH0sCi0JezB4MzM4QywgMHhBNzgwfSwKLQl7MHgzMzkwLCAyNTJ9LAotCXsweDMzOEMsIDB4QTc4MX0sCi0JezB4MzM5MCwgMjU1fSwKLQl7MHgzMzhDLCAweEE3ODJ9LAotCXsweDMzOTAsIDB9LAotCXsweDMzOEMsIDB4QTc4M30sCi0JezB4MzM5MCwgMjF9LAotCXsweDMzOEMsIDB4QTc4NH0sCi0JezB4MzM5MCwgMzd9LAotCXsweDMzOEMsIDB4QTc4NX0sCi0JezB4MzM5MCwgNjN9LAotCXsweDMzOEMsIDB4QTc4Nn0sCi0JezB4MzM5MCwgMTAwfSwKLQl7MHgzMzhDLCAweEE3ODd9LAotCXsweDMzOTAsIDEyOH0sCi0JezB4MzM4QywgMHhBNzg4fSwKLQl7MHgzMzkwLCAxNTF9LAotCXsweDMzOEMsIDB4QTc4OX0sCi0JezB4MzM5MCwgMTY5fSwKLQl7MHgzMzhDLCAweEE3OEF9LAotCXsweDMzOTAsIDE4Nn0sCi0JezB4MzM4QywgMHhBNzhCfSwKLQl7MHgzMzkwLCAxOTl9LAotCXsweDMzOEMsIDB4QTc4Q30sCi0JezB4MzM5MCwgMjEwfSwKLQl7MHgzMzhDLCAweEE3OER9LAotCXsweDMzOTAsIDIyMH0sCi0JezB4MzM4QywgMHhBNzhFfSwKLQl7MHgzMzkwLCAyMjh9LAotCXsweDMzOEMsIDB4QTc4Rn0sCi0JezB4MzM5MCwgMjM0fSwKLQl7MHgzMzhDLCAweEE3OTB9LAotCXsweDMzOTAsIDI0MH0sCi0JezB4MzM4QywgMHhBNzkxfSwKLQl7MHgzMzkwLCAyNDR9LAotCXsweDMzOEMsIDB4QTc5M30sCi0JezB4MzM5MCwgMjUyfSwKLQl7MHgzMzhDLCAweEE3OTR9LAotCXsweDMzOTAsIDI1NX0sCi0JezB4MzM4QywgMHhBMTAzfSwKLQl7MHgzMzkwLCA2fSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbXQ5ZDExMl9pMmNfcmVnX2NvbmYgY29uc3QgbGVuc19yb2xsX29mZl90YmxbXSA9IHsKLQl7IDB4MzRDRSwgMHg4MUEwLCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNEQwLCAweDYzMzEsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM0RDIsIDB4MzM5NCwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzRENCwgMHg5OTY2LCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNEQ2LCAweDRCMjUsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM0RDgsIDB4MjY3MCwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzREQSwgMHg3MjRDLCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNERDLCAweEZGRkQsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM0REUsIDB4MDBDQSwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzRFNiwgMHgwMEFDLCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNEVFLCAweDBFRTEsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM0RjYsIDB4MEQ4NywgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzUwMCwgMHhFMUY3LCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTA4LCAweDFDRjQsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM1MTAsIDB4MUQyOCwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzUxOCwgMHgxRjI2LCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTIwLCAweDIyMjAsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM1MjgsIDB4MzMzRCwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzUzMCwgMHgxNUQ5LCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTM4LCAweENGQjgsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM1NEMsIDB4MDVGRSwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzU0NCwgMHgwNUY4LCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTVDLCAweDA1OTYsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM1NTQsIDB4MDYxMSwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzRFMCwgMHgwMEYyLCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNEU4LCAweDAwQTgsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM0RjAsIDB4MEY3QiwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzRGOCwgMHgwQ0Q3LCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTAyLCAweEZFREIsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM1MEEsIDB4MTNFNCwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzUxMiwgMHgxRjJDLCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTFBLCAweDFEMjAsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM1MjIsIDB4MjQyMiwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzUyQSwgMHgyOTI1LCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTMyLCAweDFEMDQsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM1M0EsIDB4RkJGMiwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzU0RSwgMHgwNjE2LCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTQ2LCAweDA1OTcsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM1NUUsIDB4MDVDRCwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzU1NiwgMHgwNTI5LCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNEU0LCAweDAwQjIsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM0RUMsIDB4MDA1RSwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzRGNCwgMHgwRjQzLCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNEZDLCAweDBFMkYsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM1MDYsIDB4RjlGQywgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzUwRSwgMHgwQ0U0LCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTE2LCAweDFFMUUsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM1MUUsIDB4MUIxOSwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzUyNiwgMHgxNTFCLCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTJFLCAweDE0MTYsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM1MzYsIDB4MTBGQywgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzUzRSwgMHhDMDE4LCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTUyLCAweDA2QjQsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM1NEEsIDB4MDUwNiwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzU2MiwgMHgwNkFCLCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTVBLCAweDA2M0EsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM0RTIsIDB4MDBFNSwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzRFQSwgMHgwMDhCLCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNEYyLCAweDBFNEMsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM0RkEsIDB4MENBMywgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzUwNCwgMHgwOTA3LCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTBDLCAweDFERkQsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM1MTQsIDB4MUUyNCwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzUxQywgMHgyNTI5LCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTI0LCAweDFEMjAsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM1MkMsIDB4MjMzMiwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzUzNCwgMHgxMEU5LCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTNDLCAweDBCQ0IsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM1NTAsIDB4MDRFRiwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzU0OCwgMHgwNjA5LCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTYwLCAweDA1ODAsIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM1NTgsIDB4MDVERCwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzU0MCwgMHgwMDAwLCBXT1JEX0xFTiwgMCB9LAotCXsgMHgzNTQyLCAweDAwMDAsIFdPUkRfTEVOLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbXQ5ZDExMl9pMmNfcmVnX2NvbmYgY29uc3QgcGxsX3NldHVwX3RibFtdID0gewotCXsgMHgzNDFFLCAweDhGMDksIFdPUkRfTEVOLCAwIH0sCi0JeyAweDM0MUMsIDB4MDI1MCwgV09SRF9MRU4sIDAgfSwKLQl7IDB4MzQxRSwgMHg4RjA5LCBXT1JEX0xFTiwgNSB9LAotCXsgMHgzNDFFLCAweDhGMDgsIFdPUkRfTEVOLCAwIH0KLX07Ci0KLS8qIFJlZnJlc2ggU2VxdWVuY2VyICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IG10OWQxMTJfaTJjX3JlZ19jb25mIGNvbnN0IHNlcXVlbmNlcl90YmxbXSA9IHsKLQl7IDB4MzM4QywgMHgyNzk5LCBXT1JEX0xFTiwgMH0sCi0JeyAweDMzOTAsIDB4NjQ0MCwgV09SRF9MRU4sIDV9LAotCXsgMHgzMzhDLCAweDI3OUIsIFdPUkRfTEVOLCAwfSwKLQl7IDB4MzM5MCwgMHg2NDQwLCBXT1JEX0xFTiwgNX0sCi0JeyAweDMzOEMsIDB4QTEwMywgV09SRF9MRU4sIDB9LAotCXsgMHgzMzkwLCAweDAwMDUsIFdPUkRfTEVOLCA1fSwKLQl7IDB4MzM4QywgMHhBMTAzLCBXT1JEX0xFTiwgMH0sCi0JeyAweDMzOTAsIDB4MDAwNiwgV09SRF9MRU4sIDV9Ci19OwotCi1zdHJ1Y3QgbXQ5ZDExMl9yZWcgbXQ5ZDExMl9yZWdzID0gewotCS5wcmV2X3NuYXBfcmVnX3NldHRpbmdzID0gJnByZXZpZXdfc25hcHNob3RfbW9kZV9yZWdfc2V0dGluZ3NfYXJyYXlbMF0sCi0JLnByZXZfc25hcF9yZWdfc2V0dGluZ3Nfc2l6ZSA9IEFSUkFZX1NJWkUoCi0JCXByZXZpZXdfc25hcHNob3RfbW9kZV9yZWdfc2V0dGluZ3NfYXJyYXkpLAotCS5ub2lzZV9yZWR1Y3Rpb25fcmVnX3NldHRpbmdzID0gJm5vaXNlX3JlZHVjdGlvbl9yZWdfc2V0dGluZ3NfYXJyYXlbMF0sCi0JLm5vaXNlX3JlZHVjdGlvbl9yZWdfc2V0dGluZ3Nfc2l6ZSA9IEFSUkFZX1NJWkUoCi0JCW5vaXNlX3JlZHVjdGlvbl9yZWdfc2V0dGluZ3NfYXJyYXkpLAotCS5wbGx0YmwgPSBwbGxfc2V0dXBfdGJsLAotCS5wbGx0Ymxfc2l6ZSA9IEFSUkFZX1NJWkUocGxsX3NldHVwX3RibCksCi0JLnN0YmwgPSBzZXF1ZW5jZXJfdGJsLAotCS5zdGJsX3NpemUgPSBBUlJBWV9TSVpFKHNlcXVlbmNlcl90YmwpLAotCS5yZnRibCA9IGxlbnNfcm9sbF9vZmZfdGJsLAotCS5yZnRibF9zaXplID0gQVJSQVlfU0laRShsZW5zX3JvbGxfb2ZmX3RibCkKLX07Ci0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5ZDExMy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL210OWQxMTMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyYzgwNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5ZDExMy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjU2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9tc21fY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSAibXQ5ZDExMy5oIgotCi0vKiBNaWNyb24gTVQ5RDExMyBSZWdpc3RlcnMgYW5kIHRoZWlyIHZhbHVlcyAqLwotI2RlZmluZSAgUkVHX01UOUQxMTNfTU9ERUxfSUQJMHgwMDAwCi0jZGVmaW5lICBNVDlEMTEzX01PREVMX0lECQkweDI1ODAKLSNkZWZpbmUgUTgJCQkJCQkweDAwMDAwMTAwCi0KLXN0cnVjdCBtdDlkMTEzX3dvcmsgewotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotfTsKLQotc3RhdGljIHN0cnVjdCAgbXQ5ZDExM193b3JrICptdDlkMTEzX3NlbnNvcnc7Ci1zdGF0aWMgc3RydWN0ICBpMmNfY2xpZW50ICptdDlkMTEzX2NsaWVudDsKLQotc3RydWN0IG10OWQxMTNfY3RybCB7Ci0JY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNlbnNvcmRhdGE7Ci0JdWludDMyX3Qgc2Vuc29ybW9kZTsKLQl1aW50MzJfdCBmcHNfZGl2aWRlcjsvKiBpbml0IHRvIDEgKiAweDAwMDAwNDAwICovCi0JdWludDMyX3QgcGljdF9mcHNfZGl2aWRlcjsvKiBpbml0IHRvIDEgKiAweDAwMDAwNDAwICovCi0JdWludDE2X3QgZnBzOwotCXVpbnQxNl90IGN1cnJfc3RlcF9wb3M7Ci0JdWludDE2X3QgbXlfcmVnX2dhaW47Ci0JdWludDMyX3QgbXlfcmVnX2xpbmVfY291bnQ7Ci0JdWludDE2X3QgdG90YWxfbGluZXNfcGVyX2ZyYW1lOwotCXVpbnQxNl90IGNvbmZpZ19jc2k7Ci0JZW51bSBtdDlkMTEzX3Jlc29sdXRpb25fdCBwcmV2X3JlczsKLQllbnVtIG10OWQxMTNfcmVzb2x1dGlvbl90IHBpY3RfcmVzOwotCWVudW0gbXQ5ZDExM19yZXNvbHV0aW9uX3QgY3Vycl9yZXM7Ci0JZW51bSBtdDlkMTEzX3Rlc3RfbW9kZV90ICBzZXRfdGVzdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXQ5ZDExM19jdHJsICptdDlkMTEzX2N0cmw7Ci0KLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChtdDlkMTEzX3dhaXRfcXVldWUpOwotREVGSU5FX01VVEVYKG10OWQxMTNfbXV0KTsKLQotc3RhdGljIGludCBtdDlkMTEzX2kyY19yeGRhdGEodW5zaWduZWQgc2hvcnQgc2FkZHIsCi0JCQkJdW5zaWduZWQgY2hhciAqcnhkYXRhLCBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKLQkJewotCQkJLmFkZHIgICA9IHNhZGRyLAotCQkJLmZsYWdzID0gMCwKLQkJCS5sZW4gICA9IDIsCi0JCQkuYnVmICAgPSByeGRhdGEsCi0JCX0sCi0JCXsKLQkJCS5hZGRyICAgPSBzYWRkciwKLQkJCS5mbGFncyA9IEkyQ19NX1JELAotCQkJLmxlbiAgID0gbGVuZ3RoLAotCQkJLmJ1ZiAgID0gcnhkYXRhLAotCQl9LAotCX07Ci0JaWYgKGkyY190cmFuc2ZlcihtdDlkMTEzX2NsaWVudC0+YWRhcHRlciwgbXNncywgMikgPCAwKSB7Ci0JCUNEQkcoIm10OWQxMTNfaTJjX3J4ZGF0YSBmYWlsZWQhXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlkMTEzX2kyY19yZWFkKHVuc2lnbmVkIHNob3J0ICAgc2FkZHIsCi0JCQkJdW5zaWduZWQgc2hvcnQgcmFkZHIsCi0JCQkJdW5zaWduZWQgc2hvcnQgKnJkYXRhLAotCQkJCWVudW0gbXQ5ZDExM193aWR0aCB3aWR0aCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKLQlpZiAoIXJkYXRhKQotCQlyZXR1cm4gLUVJTzsKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0Jc3dpdGNoICh3aWR0aCkgewotCWNhc2UgV09SRF9MRU46IHsKLQkJCWJ1ZlswXSA9IChyYWRkciAmIDB4RkYwMCk+Pjg7Ci0JCQlidWZbMV0gPSAocmFkZHIgJiAweDAwRkYpOwotCQkJcmMgPSBtdDlkMTEzX2kyY19yeGRhdGEoc2FkZHIsIGJ1ZiwgMik7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCSpyZGF0YSA9IGJ1ZlswXSA8PCA4IHwgYnVmWzFdOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlpZiAocmMgPCAwKQotCQlDREJHKCJtdDlkMTEzX2kyY19yZWFkIGZhaWxlZCAhXG4iKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OWQxMTNfaTJjX3R4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQkJCQl1bnNpZ25lZCBjaGFyICp0eGRhdGEsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGkyY19tc2cgbXNnW10gPSB7Ci0JCXsKLQkJCS5hZGRyID0gc2FkZHIsCi0JCQkuZmxhZ3MgPSAwLAotCQkJLmxlbiA9IGxlbmd0aCwKLQkJCS5idWYgPSB0eGRhdGEsCi0JCX0sCi0JfTsKLQlpZiAoaTJjX3RyYW5zZmVyKG10OWQxMTNfY2xpZW50LT5hZGFwdGVyLCBtc2csIDEpIDwgMCkgewotCQlDREJHKCJtdDlkMTEzX2kyY190eGRhdGEgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlkMTEzX2kyY193cml0ZSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQkJCQl1bnNpZ25lZCBzaG9ydCB3YWRkciwKLQkJCQl1bnNpZ25lZCBzaG9ydCB3ZGF0YSwKLQkJCQllbnVtIG10OWQxMTNfd2lkdGggd2lkdGgpCi17Ci0JaW50MzJfdCByYyA9IC1FSU87Ci0JdW5zaWduZWQgY2hhciBidWZbNF07Ci0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCXN3aXRjaCAod2lkdGgpIHsKLQljYXNlIFdPUkRfTEVOOiB7Ci0JCQlidWZbMF0gPSAod2FkZHIgJiAweEZGMDApPj44OwotCQkJYnVmWzFdID0gKHdhZGRyICYgMHgwMEZGKTsKLQkJCWJ1ZlsyXSA9ICh3ZGF0YSAmIDB4RkYwMCk+Pjg7Ci0JCQlidWZbM10gPSAod2RhdGEgJiAweDAwRkYpOwotCQkJcmMgPSBtdDlkMTEzX2kyY190eGRhdGEoc2FkZHIsIGJ1ZiwgNCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBCWVRFX0xFTjogewotCQkJYnVmWzBdID0gd2FkZHI7Ci0JCQlidWZbMV0gPSB3ZGF0YTsKLQkJCXJjID0gbXQ5ZDExM19pMmNfdHhkYXRhKHNhZGRyLCBidWYsIDIpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlpZiAocmMgPCAwKQotCQlwcmludGsoS0VSTl9FUlIKLQkJCSJpMmNfd3JpdGUgZmFpbGVkLCBhZGRyID0gMHgleCwgdmFsID0gMHgleCFcbiIsCi0JCQl3YWRkciwgd2RhdGEpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5ZDExM19pMmNfd3JpdGVfdGFibGUoCi0JCQkJc3RydWN0IG10OWQxMTNfaTJjX3JlZ19jb25mCi0JCQkJY29uc3QgKnJlZ19jb25mX3RibCwKLQkJCQlpbnQgbnVtX29mX2l0ZW1zX2luX3RhYmxlKQotewotCWludCBpOwotCWludDMyX3QgcmMgPSAtRUlPOwotCWZvciAoaSA9IDA7IGkgPCBudW1fb2ZfaXRlbXNfaW5fdGFibGU7IGkrKykgewotCQlyYyA9IG10OWQxMTNfaTJjX3dyaXRlKG10OWQxMTNfY2xpZW50LT5hZGRyLAotCQkJCXJlZ19jb25mX3RibC0+d2FkZHIsIHJlZ19jb25mX3RibC0+d2RhdGEsCi0JCQkJV09SRF9MRU4pOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0JCXJlZ19jb25mX3RibCsrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBsb25nIG10OWQxMTNfcmVnX2luaXQodm9pZCkKLXsKLQl1aW50MTZfdCBkYXRhID0gMDsKLQlpbnQzMl90IHJjID0gMDsKLQlpbnQgY291bnQgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX2NzaV9wYXJhbXMgbXQ5ZDExM19jc2lfcGFyYW1zOwotCWlmICghbXQ5ZDExM19jdHJsLT5jb25maWdfY3NpKSB7Ci0JCW10OWQxMTNfY3NpX3BhcmFtcy5sYW5lX2NudCA9IDE7Ci0JCW10OWQxMTNfY3NpX3BhcmFtcy5kYXRhX2Zvcm1hdCA9IENTSV84QklUOwotCQltdDlkMTEzX2NzaV9wYXJhbXMubGFuZV9hc3NpZ24gPSAweGU0OwotCQltdDlkMTEzX2NzaV9wYXJhbXMuZHBjbV9zY2hlbWUgPSAwOwotCQltdDlkMTEzX2NzaV9wYXJhbXMuc2V0dGxlX2NudCA9IDB4MTQ7Ci0JCXJjID0gbXNtX2NhbWlvX2NzaV9jb25maWcoJm10OWQxMTNfY3NpX3BhcmFtcyk7Ci0JCW10OWQxMTNfY3RybC0+Y29uZmlnX2NzaSA9IDE7Ci0JCW1zbGVlcCg1MCk7Ci0JfQotCS8qIERpc2FibGUgcGFyYWxsZWwgYW5kIGVuYWJsZSBtaXBpKi8KLQlyYyA9IG10OWQxMTNfaTJjX3dyaXRlKG10OWQxMTNfY2xpZW50LT5hZGRyLAotCQkJCTB4MDAxQSwKLQkJCQkweDAwNTEsIFdPUkRfTEVOKTsKLQlyYyA9IG10OWQxMTNfaTJjX3dyaXRlKG10OWQxMTNfY2xpZW50LT5hZGRyLAotCQkJCTB4MDAxQSwKLQkJCQkweDAwNTAsCi0JCQkJV09SRF9MRU4pOwotCW1zbGVlcCgyMCk7Ci0JcmMgPSBtdDlkMTEzX2kyY193cml0ZShtdDlkMTEzX2NsaWVudC0+YWRkciwKLQkJCQkweDAwMUEsCi0JCQkJMHgwMDU4LAotCQkJCVdPUkRfTEVOKTsKLQotCS8qIFByZXNldCBwbGwgc2V0dGluZ3MgYmVnaW4qLwotCXJjID0gbXQ5ZDExM19pMmNfd3JpdGVfdGFibGUoJm10OWQxMTNfcmVncy5wbGxfdGJsWzBdLAotCQkJCW10OWQxMTNfcmVncy5wbGxfdGJsX3NpemUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQlyYyA9IG10OWQxMTNfaTJjX3JlYWQobXQ5ZDExM19jbGllbnQtPmFkZHIsCi0JCQkJMHgwMDE0LCAmZGF0YSwgV09SRF9MRU4pOwotCWRhdGEgPSBkYXRhJjB4ODAwMDsKLQkvKiBQb2xsKi8KLQl3aGlsZSAoZGF0YSA9PSAweDAwMDApIHsKLQkJZGF0YSA9IDA7Ci0JCXJjID0gbXQ5ZDExM19pMmNfcmVhZChtdDlkMTEzX2NsaWVudC0+YWRkciwKLQkJCQkweDAwMTQsICZkYXRhLCBXT1JEX0xFTik7Ci0JCWRhdGEgPSBkYXRhICYgMHg4MDAwOwotCQl1c2xlZXBfcmFuZ2UoMTEwMDAsIDEyMDAwKTsKLQkJY291bnQrKzsKLQkJaWYgKGNvdW50ID09IDEwMCkgewotCQkJQ0RCRygiIFRpbWVvdXQ6MVxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyYyA9IG10OWQxMTNfaTJjX3dyaXRlKG10OWQxMTNfY2xpZW50LT5hZGRyLAotCQkJCTB4MDAxNCwKLQkJCQkweDIwRkEsCi0JCQkJV09SRF9MRU4pOwotCi0JLypQcmVzZXQgcGxsIEVuZHMqLwotCW10OWQxMTNfaTJjX3dyaXRlKG10OWQxMTNfY2xpZW50LT5hZGRyLAotCQkJCTB4MDAxOCwKLQkJCQkweDQwMkQsCi0JCQkJV09SRF9MRU4pOwotCi0JbXQ5ZDExM19pMmNfd3JpdGUobXQ5ZDExM19jbGllbnQtPmFkZHIsCi0JCQkJMHgwMDE4LAotCQkJCTB4NDAyQywKLQkJCQlXT1JEX0xFTik7Ci0JLypQT0xMX1JFRz0weDAwMTgsMHg0MDAwLCE9MHgwMDAwLERFTEFZPTEwLFRJTUVPVVQ9MTAwKi8KLQlkYXRhID0gMDsKLQlyYyA9IG10OWQxMTNfaTJjX3JlYWQobXQ5ZDExM19jbGllbnQtPmFkZHIsCi0JCTB4MDAxOCwgJmRhdGEsIFdPUkRfTEVOKTsKLQlkYXRhID0gZGF0YSAmIDB4NDAwMDsKLQljb3VudCA9IDA7Ci0Jd2hpbGUgKGRhdGEgIT0gMHgwMDAwKSB7Ci0JCXJjID0gbXQ5ZDExM19pMmNfcmVhZChtdDlkMTEzX2NsaWVudC0+YWRkciwKLQkJCTB4MDAxOCwgJmRhdGEsIFdPUkRfTEVOKTsKLQkJZGF0YSA9IGRhdGEgJiAweDQwMDA7Ci0JCUNEQkcoIiBkYXRhIGlzICVkXG4iICwgZGF0YSk7Ci0JCXVzbGVlcF9yYW5nZSgxMTAwMCwgMTIwMDApOwotCQljb3VudCsrOwotCQlpZiAoY291bnQgPT0gMTAwKSB7Ci0JCQlDREJHKCIgTG9vcDIgdGltZW91dDogTVQ5RDExM1xuIik7Ci0JCQlicmVhazsKLQkJfQotCQlDREJHKCIgTm90IHN0cmVhbWluZ1xuIik7Ci0JfQotCUNEQkcoIk1UOUQxMTM6IFN0YXJ0IHN0cmVhbVxuIik7Ci0JLypQcmVzZXQgUmVnaXN0ZXIgV2l6YXJkIENvbmYqLwotCXJjID0gbXQ5ZDExM19pMmNfd3JpdGVfdGFibGUoJm10OWQxMTNfcmVncy5yZWdpc3Rlcl90YmxbMF0sCi0JCQkJbXQ5ZDExM19yZWdzLnJlZ2lzdGVyX3RibF9zaXplKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0JcmMgPSBtdDlkMTEzX2kyY193cml0ZV90YWJsZSgmbXQ5ZDExM19yZWdzLmVycl90YmxbMF0sCi0JCQkJbXQ5ZDExM19yZWdzLmVycl90Ymxfc2l6ZSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXJjID0gbXQ5ZDExM19pMmNfd3JpdGVfdGFibGUoJm10OWQxMTNfcmVncy5lZXByb21fdGJsWzBdLAotCQkJCW10OWQxMTNfcmVncy5lZXByb21fdGJsX3NpemUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gbXQ5ZDExM19pMmNfd3JpdGVfdGFibGUoJm10OWQxMTNfcmVncy5sb3dfbGlnaHRfdGJsWzBdLAotCQkJCW10OWQxMTNfcmVncy5sb3dfbGlnaHRfdGJsX3NpemUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gbXQ5ZDExM19pMmNfd3JpdGVfdGFibGUoJm10OWQxMTNfcmVncy5hd2JfdGJsWzBdLAotCQkJCW10OWQxMTNfcmVncy5hd2JfdGJsX3NpemUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gbXQ5ZDExM19pMmNfd3JpdGVfdGFibGUoJm10OWQxMTNfcmVncy5wYXRjaF90YmxbMF0sCi0JCQkJbXQ5ZDExM19yZWdzLnBhdGNoX3RibF9zaXplKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQkvKmNoZWNrIHBhdGNoIGxvYWQqLwotCW10OWQxMTNfaTJjX3dyaXRlKG10OWQxMTNfY2xpZW50LT5hZGRyLAotCQkJCTB4MDk4QywKLQkJCQkweEEwMjQsCi0JCQkJV09SRF9MRU4pOwotCWNvdW50ID0gMDsKLQkvKlRvIGNoZWNrIGlmIHBhdGNoIGlzIGxvYWRlZCBwcm9wZXJseQotCXBvbGwgdGhlIHJlZ2lzdGVyIDB4OTkwIHRpbGwgdGhlIGNvbmRpdGlvbiBpcwotCW1ldCBvciB0aWxsIHRoZSB0aW1lb3V0Ki8KLQlkYXRhID0gMDsKLQlyYyA9IG10OWQxMTNfaTJjX3JlYWQobXQ5ZDExM19jbGllbnQtPmFkZHIsCi0JCQkJMHgwOTkwLCAmZGF0YSwgV09SRF9MRU4pOwotCXdoaWxlIChkYXRhID09IDApIHsKLQkJZGF0YSA9IDA7Ci0JCXJjID0gbXQ5ZDExM19pMmNfcmVhZChtdDlkMTEzX2NsaWVudC0+YWRkciwKLQkJCQkweDA5OTAsICZkYXRhLCBXT1JEX0xFTik7Ci0JCXVzbGVlcF9yYW5nZSgxMTAwMCwgMTIwMDApOwotCQljb3VudCsrOwotCQlpZiAoY291bnQgPT0gMTAwKSB7Ci0JCQlDREJHKCJUaW1lb3V0IGluIHBhdGNoIGxvYWRpbmdcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCS8qQklURklFTEQ9MHgwMDE4LCAweDAwMDQsIDAqLwotCS8qUHJlc2V0IGNvbnRpbnVlIGJlZ2luICovCi0JcmMgPSBtdDlkMTEzX2kyY193cml0ZShtdDlkMTEzX2NsaWVudC0+YWRkciwgMHgwMDE4LCAweDAwMjgsCi0JCQkJV09SRF9MRU4pOwotCUNEQkcoIiBtdDlkMTEzIHdhaXQgZm9yIHNlcSBkb25lXG4iKTsKLQkvKiBzeW5jcm9uaXplIHRoZSBGVyB3aXRoIHRoZSBzZW5zb3IKLQlNQ1VfQUREUkVTUyBbU0VRX0NNRF0qLwotCXJjID0gbXQ5ZDExM19pMmNfd3JpdGUobXQ5ZDExM19jbGllbnQtPmFkZHIsCi0JCQkJMHgwOThDLCAweEExMDMsIFdPUkRfTEVOKTsKLQlyYyA9IG10OWQxMTNfaTJjX3dyaXRlKG10OWQxMTNfY2xpZW50LT5hZGRyLAotCQkJCTB4MDk5MCwgMHgwMDA2LCBXT1JEX0xFTik7Ci0JCS8qbXQ5ZDExMyB3YWl0IGZvciBzZXEgZG9uZQotCSBzeW5jcm9uaXplIHRoZSBGVyB3aXRoIHRoZSBzZW5zb3IgKi8KLQltc2xlZXAoMjApOwotCS8qUHJlc2V0IGNvbnRpbnVlIGVuZCAqLwotCUNEQkcoIiBNVDlEMTEzOiBQcmVzZXQgY29udGludWUgZW5kXG4iKTsKLQlyYyA9IG10OWQxMTNfaTJjX3dyaXRlKG10OWQxMTNfY2xpZW50LT5hZGRyLAotCQkJCTB4MDAxMiwKLQkJCQkweDAwRjUsCi0JCQkJV09SRF9MRU4pOwotCS8qY29udGludWUgYmVnaW4gKi8KLQlDREJHKCIgTVQ5RDExMzogUHJlc2V0IGNvbnRpbnVlIGJlZ2luXG4iKTsKLQlyYyA9IG10OWQxMTNfaTJjX3dyaXRlKG10OWQxMTNfY2xpZW50LT5hZGRyLCAweDAwMTgsIDB4MDAyOCAsCi0JCQkJV09SRF9MRU4pOwotCS8qbXQ5ZDExMyB3YWl0IGZvciBzZXEgZG9uZQotCSBzeW5jcm9uaXplIHRoZSBGVyB3aXRoIHRoZSBzZW5zb3IKLQlNQ1VfQUREUkVTUyBbU0VRX0NNRF0qLwotCW1zbGVlcCgyMCk7Ci0JcmMgPSBtdDlkMTEzX2kyY193cml0ZShtdDlkMTEzX2NsaWVudC0+YWRkciwKLQkJCQkweDA5OEMsIDB4QTEwMywgV09SRF9MRU4pOwotCS8qIE1DVSBEQVRBICovCi0JcmMgPSBtdDlkMTEzX2kyY193cml0ZShtdDlkMTEzX2NsaWVudC0+YWRkciwgMHgwOTkwLAotCQkJCTB4MDAwNiwgV09SRF9MRU4pOwotCS8qbXQ5ZDExMyB3YWl0IGZvciBzZXEgZG9uZQotCXN5bmNyb25pemUgdGhlIEZXIHdpdGggdGhlIHNlbnNvciAqLwotCS8qIE1DVV9BRERSRVNTIFtTRVFfQ01EXSovCi0JbXNsZWVwKDIwKTsKLQkvKlByZXNldCBjb250aW51ZSBlbmQqLwotCXJldHVybiByYzsKLQotfQotCi1zdGF0aWMgbG9uZyBtdDlkMTEzX3NldF9zZW5zb3JfbW9kZShpbnQgbW9kZSkKLXsKLQlsb25nIHJjID0gMDsKLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFNFTlNPUl9QUkVWSUVXX01PREU6Ci0JCXJjID0gbXQ5ZDExM19yZWdfaW5pdCgpOwotCQlDREJHKCJNVDlEMTEzOiBjb25maWd1cmUgdG8gcHJldmlldyBiZWdpblxuIik7Ci0JCXJjID0KLQkJbXQ5ZDExM19pMmNfd3JpdGUobXQ5ZDExM19jbGllbnQtPmFkZHIsCi0JCQkJCQkweDA5OEMsIDB4QTExNSwgV09SRF9MRU4pOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQlyYyA9Ci0JCW10OWQxMTNfaTJjX3dyaXRlKG10OWQxMTNfY2xpZW50LT5hZGRyLAotCQkJCQkJMHgwOTkwLCAweDAwMDAsIFdPUkRfTEVOKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJcmMgPQotCQltdDlkMTEzX2kyY193cml0ZShtdDlkMTEzX2NsaWVudC0+YWRkciwKLQkJCQkJCTB4MDk4QywgMHhBMTAzLCBXT1JEX0xFTik7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JCXJjID0KLQkJbXQ5ZDExM19pMmNfd3JpdGUobXQ5ZDExM19jbGllbnQtPmFkZHIsCi0JCQkJCQkweDA5OTAsIDB4MDAwMSwgV09SRF9MRU4pOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQlicmVhazsKLQljYXNlIFNFTlNPUl9TTkFQU0hPVF9NT0RFOgotCWNhc2UgU0VOU09SX1JBV19TTkFQU0hPVF9NT0RFOgotCQlyYyA9Ci0JCW10OWQxMTNfaTJjX3dyaXRlKG10OWQxMTNfY2xpZW50LT5hZGRyLAotCQkJCQkJMHgwOThDLCAweEExMTUsIFdPUkRfTEVOKTsKLQkJcmMgPQotCQltdDlkMTEzX2kyY193cml0ZShtdDlkMTEzX2NsaWVudC0+YWRkciwKLQkJCQkJCTB4MDk5MCwgMHgwMDAyLCBXT1JEX0xFTik7Ci0JCXJjID0KLQkJbXQ5ZDExM19pMmNfd3JpdGUobXQ5ZDExM19jbGllbnQtPmFkZHIsCi0JCQkJCQkweDA5OEMsIDB4QTEwMywgV09SRF9MRU4pOwotCQlyYyA9Ci0JCW10OWQxMTNfaTJjX3dyaXRlKG10OWQxMTNfY2xpZW50LT5hZGRyLAotCQkJCQkJMHgwOTkwLCAweDAwMDIsIFdPUkRfTEVOKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG10OWQxMTNfc2Vuc29yX2luaXRfcHJvYmUoY29uc3Qgc3RydWN0Ci0JCQkJbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqIGRhdGEpCi17Ci0JdWludDE2X3QgbW9kZWxfaWQgPSAwOwotCWludCByYyA9IDA7Ci0JLyogUmVhZCB0aGUgTW9kZWwgSUQgb2YgdGhlIHNlbnNvciAqLwotCXJjID0gbXQ5ZDExM19pMmNfcmVhZChtdDlkMTEzX2NsaWVudC0+YWRkciwKLQkJCQkJCVJFR19NVDlEMTEzX01PREVMX0lELAotCQkJCQkJJm1vZGVsX2lkLCBXT1JEX0xFTik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JLyogQ2hlY2sgaWYgaXQgbWF0Y2hlcyBpdCB3aXRoIHRoZSB2YWx1ZSBpbiBEYXRhc2hlZXQgKi8KLQlpZiAobW9kZWxfaWQgIT0gTVQ5RDExM19NT0RFTF9JRCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAibXQ5ZDExMyBtb2RlbF9pZCA9IDB4JXhcbiIsIG1vZGVsX2lkKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGluaXRfcHJvYmVfZmFpbDsKLQlyZXR1cm4gcmM7Ci1pbml0X3Byb2JlX2ZhaWw6Ci0JcHJpbnRrKEtFUk5fSU5GTyAicHJvYmUgZmFpbFxuIik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG10OWQxMTNfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQkvKiBJbml0aWFsaXplIHRoZSBNU01fQ0FNSTJDIENoaXAgKi8KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtdDlkMTEzX3dhaXRfcXVldWUpOwotCXJldHVybiAwOwotfQotCi1pbnQgbXQ5ZDExM19zZW5zb3JfY29uZmlnKHZvaWQgX191c2VyICphcmdwKQotewotCXN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEgY2ZnX2RhdGE7Ci0JbG9uZyByYyA9IDA7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZ19kYXRhLAotCQkJCQkodm9pZCAqKWFyZ3AsCi0JCQkJCShzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JbXV0ZXhfbG9jaygmbXQ5ZDExM19tdXQpOwotCUNEQkcoIm10OWQxMTNfaW9jdGwsIGNmZ3R5cGUgPSAlZCwgbW9kZSA9ICVkXG4iLAotCQkgY2ZnX2RhdGEuY2ZndHlwZSwgY2ZnX2RhdGEubW9kZSk7Ci0Jc3dpdGNoIChjZmdfZGF0YS5jZmd0eXBlKSB7Ci0JY2FzZSBDRkdfU0VUX01PREU6Ci0JCXJjID0gbXQ5ZDExM19zZXRfc2Vuc29yX21vZGUoCi0JCQkJCQljZmdfZGF0YS5tb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX0VGRkVDVDoKLQkJcmV0dXJuIHJjOwotCWNhc2UgQ0ZHX0dFVF9BRl9NQVhfU1RFUFM6Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZtdDlkMTEzX211dCk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXQ5ZDExM19zZW5zb3JfcmVsZWFzZSh2b2lkKQotewotCWludCByYyA9IDA7Ci0KLQltdXRleF9sb2NrKCZtdDlkMTEzX211dCk7Ci0JZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAobXQ5ZDExM19jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCW1zbGVlcCgyMCk7Ci0JZ3Bpb19mcmVlKG10OWQxMTNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3Jlc2V0KTsKLQlrZnJlZShtdDlkMTEzX2N0cmwpOwotCW11dGV4X3VubG9jaygmbXQ5ZDExM19tdXQpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG10OWQxMTNfcHJvYmVfaW5pdF9kb25lKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvCi0JCQkJKmRhdGEpCi17Ci0JZ3Bpb19mcmVlKGRhdGEtPnNlbnNvcl9yZXNldCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXQ5ZDExM19wcm9iZV9pbml0X3NlbnNvcihjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbwotCQkJCSpkYXRhKQotewotCWludDMyX3QgcmMgPSAwOwotCXVpbnQxNl90IGNoaXBpZCA9IDA7Ci0KLQlyYyA9IGdwaW9fcmVxdWVzdChkYXRhLT5zZW5zb3JfcmVzZXQsICJtdDlkMTEzIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiIG10OWQxMTNfcHJvYmVfaW5pdF9zZW5zb3JcbiIpOwotCWlmICghcmMpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAic2Vuc29yX3Jlc2V0ID0gJWRcbiIsIHJjKTsKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JCXVzbGVlcF9yYW5nZSgxMTAwMCwgMTIwMDApOwotCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChkYXRhLT5zZW5zb3JfcmVzZXQsIDEpOwotCQl1c2xlZXBfcmFuZ2UoMTEwMDAsIDEyMDAwKTsKLQl9IGVsc2UKLQkJZ290byBpbml0X3Byb2JlX2RvbmU7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiIG10OWQxMTNfcHJvYmVfaW5pdF9zZW5zb3IgY2FsbGVkXG4iKTsKLQlyYyA9IG10OWQxMTNfaTJjX3JlYWQobXQ5ZDExM19jbGllbnQtPmFkZHIsIFJFR19NVDlEMTEzX01PREVMX0lELAotCQkJCQkJJmNoaXBpZCwgV09SRF9MRU4pOwotCWlmIChyYyA8IDApCi0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCS8qQ29tcGFyZSBzZW5zb3IgSUQgdG8gTVQ5RDExMyBJRDogKi8KLQlpZiAoY2hpcGlkICE9IE1UOUQxMTNfTU9ERUxfSUQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAibXQ5ZDExM19wcm9iZV9pbml0X3NlbnNvciBjaGlwIGlkIGlzJWRcbiIsCi0JCQljaGlwaWQpOwotCX0KLQlDREJHKCJtdDlkMTEzX3Byb2JlX2luaXRfc2Vuc29yIFN1Y2Nlc3NcbiIpOwotCWdvdG8gaW5pdF9wcm9iZV9kb25lOwotaW5pdF9wcm9iZV9mYWlsOgotCUNEQkcoIiBvdjI3MjBfcHJvYmVfaW5pdF9zZW5zb3IgZmFpbHNcbiIpOwotCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JbXQ5ZDExM19wcm9iZV9pbml0X2RvbmUoZGF0YSk7Ci1pbml0X3Byb2JlX2RvbmU6Ci0JcHJpbnRrKEtFUk5fSU5GTyAiIG10OWQxMTNfcHJvYmVfaW5pdF9zZW5zb3IgZmluaXNoZXNcbiIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtdDlkMTEzX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQgcmMgPSAwOwotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7Ci0JCXJjID0gLUVOT1RTVVBQOwotCQlnb3RvIHByb2JlX2ZhaWx1cmU7Ci0JfQotCW10OWQxMTNfc2Vuc29ydyA9Ci0Ja3phbGxvYyhzaXplb2Yoc3RydWN0IG10OWQxMTNfd29yayksIEdGUF9LRVJORUwpOwotCWlmICghbXQ5ZDExM19zZW5zb3J3KSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBwcm9iZV9mYWlsdXJlOwotCX0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBtdDlkMTEzX3NlbnNvcncpOwotCW10OWQxMTNfaW5pdF9jbGllbnQoY2xpZW50KTsKLQltdDlkMTEzX2NsaWVudCA9IGNsaWVudDsKLQlDREJHKCJtdDlkMTEzX3Byb2JlIHN1Y2NlZWRlZCFcbiIpOwotCXJldHVybiAwOwotcHJvYmVfZmFpbHVyZToKLQlrZnJlZShtdDlkMTEzX3NlbnNvcncpOwotCW10OWQxMTNfc2Vuc29ydyA9IE5VTEw7Ci0JQ0RCRygibXQ5ZDExM19wcm9iZSBmYWlsZWQhXG4iKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtdDlkMTEzX2kyY19pZFtdID0gewotCXsgIm10OWQxMTMiLCAwfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtdDlkMTEzX2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gbXQ5ZDExM19pMmNfaWQsCi0JLnByb2JlICA9IG10OWQxMTNfaTJjX3Byb2JlLAotCS5yZW1vdmUgPSBfX2V4aXRfcChtdDlkMTEzX2kyY19yZW1vdmUpLAotCQkJICAuZHJpdmVyID0gewotCQkubmFtZSA9ICJtdDlkMTEzIiwKLQl9LAotfTsKLQotaW50IG10OWQxMTNfc2Vuc29yX29wZW5faW5pdChjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQltdDlkMTEzX2N0cmwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXQ5ZDExM19jdHJsKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtdDlkMTEzX2N0cmwpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAibXQ5ZDExM19pbml0IGZhaWxlZCFcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gaW5pdF9kb25lOwotCX0KLQltdDlkMTEzX2N0cmwtPmZwc19kaXZpZGVyID0gMSAqIDB4MDAwMDA0MDA7Ci0JbXQ5ZDExM19jdHJsLT5waWN0X2Zwc19kaXZpZGVyID0gMSAqIDB4MDAwMDA0MDA7Ci0JbXQ5ZDExM19jdHJsLT5zZXRfdGVzdCA9IFRFU1RfT0ZGOwotCW10OWQxMTNfY3RybC0+Y29uZmlnX2NzaSA9IDA7Ci0JbXQ5ZDExM19jdHJsLT5wcmV2X3JlcyA9IFFUUl9TSVpFOwotCW10OWQxMTNfY3RybC0+cGljdF9yZXMgPSBGVUxMX1NJWkU7Ci0JbXQ5ZDExM19jdHJsLT5jdXJyX3JlcyA9IElOVkFMSURfU0laRTsKLQlpZiAoZGF0YSkKLQkJbXQ5ZDExM19jdHJsLT5zZW5zb3JkYXRhID0gZGF0YTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIm10OWQxMTNfc2Vuc29yX29wZW5faW5pdCBmYWlsXG4iKTsKLQkJcmV0dXJuIHJjOwotCX0KLQkJLyogZW5hYmxlIG1jbGsgZmlyc3QgKi8KLQkJbXNtX2NhbWlvX2Nsa19yYXRlX3NldCgyNDAwMDAwMCk7Ci0JCW1zbGVlcCgyMCk7Ci0JCXJjID0gbXQ5ZDExM19wcm9iZV9pbml0X3NlbnNvcihkYXRhKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gaW5pdF9mYWlsOwotCQltdDlkMTEzX2N0cmwtPmZwcyA9IDMwKlE4OwotCQlyYyA9IG10OWQxMTNfc2Vuc29yX2luaXRfcHJvYmUoZGF0YSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JCQlnb3RvIGluaXRfZmFpbDsKLQkJfSBlbHNlCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJZ290byBpbml0X2RvbmU7Ci1pbml0X2ZhaWw6Ci0JCXByaW50ayhLRVJOX0lORk8gImluaXRfZmFpbFxuIik7Ci0JCW10OWQxMTNfcHJvYmVfaW5pdF9kb25lKGRhdGEpOwotaW5pdF9kb25lOgotCQlDREJHKCJpbml0X2RvbmVcbiIpOwotCQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXQ5ZDExM19zZW5zb3JfcHJvYmUoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8KLQkJCQkqaW5mbywKLQkJCQlzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsICpzKQotewotCWludCByYyA9IDA7Ci0JcmMgPSBpMmNfYWRkX2RyaXZlcigmbXQ5ZDExM19pMmNfZHJpdmVyKTsKLQlpZiAocmMgPCAwIHx8IG10OWQxMTNfY2xpZW50ID09IE5VTEwpIHsKLQkJcmMgPSAtRU5PVFNVUFA7Ci0JCWdvdG8gcHJvYmVfZmFpbDsKLQl9Ci0JbXNtX2NhbWlvX2Nsa19yYXRlX3NldCgyNDAwMDAwMCk7Ci0JdXNsZWVwX3JhbmdlKDUwMDAsIDYwMDApOwotCXJjID0gbXQ5ZDExM19wcm9iZV9pbml0X3NlbnNvcihpbmZvKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIHByb2JlX2ZhaWw7Ci0Jcy0+c19pbml0ID0gbXQ5ZDExM19zZW5zb3Jfb3Blbl9pbml0OwotCXMtPnNfcmVsZWFzZSA9IG10OWQxMTNfc2Vuc29yX3JlbGVhc2U7Ci0Jcy0+c19jb25maWcgID0gbXQ5ZDExM19zZW5zb3JfY29uZmlnOwotCXMtPnNfY2FtZXJhX3R5cGUgPSBGUk9OVF9DQU1FUkFfMkQ7Ci0Jcy0+c19tb3VudF9hbmdsZSAgPSAwOwotCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGluZm8tPnNlbnNvcl9yZXNldCwgMCk7Ci0JbXQ5ZDExM19wcm9iZV9pbml0X2RvbmUoaW5mbyk7Ci0JcmV0dXJuIHJjOwotcHJvYmVfZmFpbDoKLQlwcmludGsoS0VSTl9JTkZPICJtdDlkMTEzX3NlbnNvcl9wcm9iZTogU0VOU09SIFBST0JFIEZBSUxTIVxuIik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fbXQ5ZDExM19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBtc21fY2FtZXJhX2Rydl9zdGFydChwZGV2LCBtdDlkMTEzX3NlbnNvcl9wcm9iZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9jYW1lcmFfZHJpdmVyID0gewotCS5wcm9iZSA9IF9fbXQ5ZDExM19wcm9iZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc21fY2FtX210OWQxMTMiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXQ5ZDExM19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX2NhbWVyYV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChtdDlkMTEzX2luaXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1pY3JvbiAyTVAgWVVWIHNlbnNvciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDlkMTEzLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5ZDExMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWVkYzVlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDlkMTEzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgTVQ5RDExM19ICi0jZGVmaW5lIE1UOUQxMTNfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotCi1leHRlcm4gc3RydWN0IG10OWQxMTNfcmVnIG10OWQxMTNfcmVnczsKLQotZW51bSBtdDlkMTEzX3dpZHRoIHsKLQlXT1JEX0xFTiwKLQlCWVRFX0xFTgotfTsKLQotc3RydWN0IG10OWQxMTNfaTJjX3JlZ19jb25mIHsKLQl1bnNpZ25lZCBzaG9ydCB3YWRkcjsKLQl1bnNpZ25lZCBzaG9ydCB3ZGF0YTsKLX07Ci0KLXN0cnVjdCBtdDlkMTEzX3JlZyB7Ci0JY29uc3Qgc3RydWN0IG10OWQxMTNfaTJjX3JlZ19jb25mICpwbGxfdGJsOwotCXVpbnQxNl90IHBsbF90Ymxfc2l6ZTsKLQljb25zdCBzdHJ1Y3QgbXQ5ZDExM19pMmNfcmVnX2NvbmYgKnJlZ2lzdGVyX3RibDsKLQl1aW50MTZfdCByZWdpc3Rlcl90Ymxfc2l6ZTsKLQljb25zdCBzdHJ1Y3QgbXQ5ZDExM19pMmNfcmVnX2NvbmYgKmVycl90Ymw7Ci0JdWludDE2X3QgZXJyX3RibF9zaXplOwotCWNvbnN0IHN0cnVjdCBtdDlkMTEzX2kyY19yZWdfY29uZiAqbG93X2xpZ2h0X3RibDsKLQl1aW50MTZfdCBsb3dfbGlnaHRfdGJsX3NpemU7Ci0JY29uc3Qgc3RydWN0IG10OWQxMTNfaTJjX3JlZ19jb25mICphd2JfdGJsOwotCXVpbnQxNl90IGF3Yl90Ymxfc2l6ZTsKLQljb25zdCBzdHJ1Y3QgbXQ5ZDExM19pMmNfcmVnX2NvbmYgKnBhdGNoX3RibDsKLQl1aW50MTZfdCBwYXRjaF90Ymxfc2l6ZTsKLQljb25zdCBzdHJ1Y3QgbXQ5ZDExM19pMmNfcmVnX2NvbmYgKmVlcHJvbV90YmwgOwotCXVpbnQxNl90IGVlcHJvbV90Ymxfc2l6ZSA7Ci19OwotCi1lbnVtIG10OWQxMTNfdGVzdF9tb2RlX3QgewotCVRFU1RfT0ZGLAotCVRFU1RfMSwKLQlURVNUXzIsCi0JVEVTVF8zCi19OwotCi1lbnVtIG10OWQxMTNfcmVzb2x1dGlvbl90IHsKLQlRVFJfU0laRSwKLQlGVUxMX1NJWkUsCi0JSU5WQUxJRF9TSVpFCi19OwotCi1lbnVtIG10OWQxMTNfc2V0dGluZyB7Ci0JUkVTX1BSRVZJRVcsCi0JUkVTX0NBUFRVUkUKLX07Ci0jZW5kaWYgLyogTVQ5RDExM19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5ZDExM19yZWcuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDlkMTEzX3JlZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGZmNTE4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDlkMTEzX3JlZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgIm10OWQxMTMuaCIKLQotc3RydWN0IG10OWQxMTNfaTJjX3JlZ19jb25mIGNvbnN0Ci0JcGxsX3RibF9zZXR0aW5nc1tdID0gewotCQl7MHgwMDE0LCAweDIxRjkgfSwgLypQTEwgY29udHJvbDogQllQQVNTIFBMTCA9IDg2OTcqLwotCQl7MHgwMDEwLCAweDAxMTUgfSwgLypQTEwgRGl2aWRlcnMgPSAyNzcqLwotCQl7MHgwMDEyLCAweDBGNSAgfSwgLypQTEwgUCBEaXZpZGVycyA9IDI0NSovCi0JCXsweDAwMTQsIDB4MjFGQiB9LCAvKlBMTCBjb250cm9sOiBQTExfRU5BQkxFIG9uID0gODY5OSovCi0JCXsweDAwMTQsIDB4MjBGQiB9LCAvKlBMTCBjb250cm9sOiBTRUxfTE9DS19ERVQgb24gPSA4NDQzKi8KLX07Ci0KLXN0cnVjdCBtdDlkMTEzX2kyY19yZWdfY29uZiBjb25zdAotCXJlZ2lzdGVyX3dpemFyZF9zZXR0aW5nc1tdID0gewotCQl7MHgwOThDLCAweDI3MTl9LAotCQl7MHgwOTkwLCAweDAwNUF9LAotCQl7MHgwOThDLCAweDI3MUJ9LAotCQl7MHgwOTkwLCAweDAxQkV9LAotCQl7MHgwOThDLCAweDI3MUR9LAotCQl7MHgwOTkwLCAweDAxMzF9LAotCQl7MHgwOThDLCAweDI3MUZ9LAotCQl7MHgwOTkwLCAweDAyQkJ9LAotCQl7MHgwOThDLCAweDI3MjF9LAotCQl7MHgwOTkwLCAweDA4ODh9LAotCQl7MHgwOThDLCAweDI3MkZ9LAotCQl7MHgwOTkwLCAweDAwM0F9LAotCQl7MHgwOThDLCAweDI3MzF9LAotCQl7MHgwOTkwLCAweDAwRjZ9LAotCQl7MHgwOThDLCAweDI3MzN9LAotCQl7MHgwOTkwLCAweDAwOEJ9LAotCQl7MHgwOThDLCAweDI3MzV9LAotCQl7MHgwOTkwLCAweDA1MjF9LAotCQl7MHgwOThDLCAweDI3Mzd9LAotCQl7MHgwOTkwLCAweDA4ODh9LAotCQl7MHgwOThDLCAweDI3NUZ9LAotCQl7MHgwOTkwLCAweDAxOTR9LAotCQl7MHgwOThDLCAweDI3NjF9LAotCQl7MHgwOTkwLCAweDAwMTR9LAotCQl7MHgwOThDLCAweEE3NjV9LAotCQl7MHgwOTkwLCAweDAwNDR9LAotCQl7MHgwOThDLCAweEEyNEZ9LAotCQl7MHgwOTkwLCAweDAwMjh9LAotCQl7MHgwOThDLCAweEEyMEV9LAotCQl7MHgwOTkwLCAweDAwQTB9LAotCQl7MHgwOThDLCAweEEyMEN9LAotCQl7MHgwOTkwLCAweDAwMEV9LAotCQl7MHgwOThDLCAweDIyMjJ9LAotCQl7MHgwOTkwLCAweDAwQTB9LAotCQl7MHgwOThDLCAweDIyMTJ9LAotCQl7MHgwOTkwLCAweDAxRUV9LAotCQl7MHgwOThDLCAweEE0MDh9LAotCQl7MHgwOTkwLCAweDAwMjZ9LAotCQl7MHgwOThDLCAweEE0MDl9LAotCQl7MHgwOTkwLCAweDAwMjl9LAotCQl7MHgwOThDLCAweEE0MEF9LAotCQl7MHgwOTkwLCAweDAwMkV9LAotCQl7MHgwOThDLCAweEE0MEJ9LAotCQl7MHgwOTkwLCAweDAwMzF9LAotCQl7MHgwOThDLCAweDI0MTF9LAotCQl7MHgwOTkwLCAweDAwQTB9LAotCQl7MHgwOThDLCAweDI0MTN9LAotCQl7MHgwOTkwLCAweDAwQzB9LAotCQl7MHgwOThDLCAweDI0MTV9LAotCQl7MHgwOTkwLCAweDAwQTB9LAotCQl7MHgwOThDLCAweDI0MTd9LAotCQl7MHgwOTkwLCAweDAwQzB9LAotfTsKLQotc3RydWN0IG10OWQxMTNfaTJjX3JlZ19jb25mIGNvbnN0Ci0JZXJyX3NldHRpbmdzW10gPSB7Ci0JCXsweDMwODQsIDB4MjQwQ30sCi0JCXsweDMwOTIsIDB4MEE0Q30sCi0JCXsweDMwOTQsIDB4NEM0Q30sCi0JCXsweDMwOTYsIDB4NEM1NH0sCi19OwotCi1zdHJ1Y3QgbXQ5ZDExM19pMmNfcmVnX2NvbmYgY29uc3QKLQlwYXRjaF9zZXR0aW5nc1tdID0gewotCQl7MHgwOThDLCAweDA0MTV9LCAgICAvKiBNQ1VfQUREUkVTUyovCi0JCXsweDA5OTAsIDB4RjYwMX0sCi0JCXsweDA5OTIsIDB4NDJDMX0sCi0JCXsweDA5OTQsIDB4MDMyNn0sCi0JCXsweDA5OTYsIDB4MTFGNn0sCi0JCXsweDA5OTgsIDB4MDE0M30sCi0JCXsweDA5OUEsIDB4QzEwNH0sCi0JCXsweDA5OUMsIDB4MjYwQX0sCi0JCXsweDA5OUUsIDB4Q0MwNH0sCi0JCXsweDA5OEMsIDB4MDQyNX0sCi0JCXsweDA5OTAsIDB4MzNCRH0sCi0JCXsweDA5OTIsIDB4QTM2Mn0sCi0JCXsweDA5OTQsIDB4QkQwNH0sCi0JCXsweDA5OTYsIDB4MzMzOX0sCi0JCXsweDA5OTgsIDB4QzZGRn0sCi0JCXsweDA5OUEsIDB4RjcwMX0sCi0JCXsweDA5OUMsIDB4NjQzOX0sCi0JCXsweDA5OUUsIDB4RkUwMX0sCi0JCXsweDA5OEMsIDB4MDQzNX0sCi0JCXsweDA5OTAsIDB4NjkxOH0sCi0JCXsweDA5OTIsIDB4Q0UwM30sCi0JCXsweDA5OTQsIDB4MjVDQ30sCi0JCXsweDA5OTYsIDB4MDAxM30sCi0JCXsweDA5OTgsIDB4QkRDMn0sCi0JCXsweDA5OUEsIDB4QjhDQ30sCi0JCXsweDA5OUMsIDB4MDQ4OX0sCi0JCXsweDA5OUUsIDB4RkQwM30sCi0JCXsweDA5OEMsIDB4MDQ0NX0sCi0JCXsweDA5OTAsIDB4MjdDQ30sCi0JCXsweDA5OTIsIDB4MDMyNX0sCi0JCXsweDA5OTQsIDB4RkQwMX0sCi0JCXsweDA5OTYsIDB4NjlGRX0sCi0JCXsweDA5OTgsIDB4MDJCRH0sCi0JCXsweDA5OUEsIDB4MThDRX0sCi0JCXsweDA5OUMsIDB4MDMzOX0sCi0JCXsweDA5OUUsIDB4Q0MwMH0sCi0JCXsweDA5OEMsIDB4MDQ1NX0sCi0JCXsweDA5OTAsIDB4MTFCRH0sCi0JCXsweDA5OTIsIDB4QzJCOH0sCi0JCXsweDA5OTQsIDB4Q0MwNH0sCi0JCXsweDA5OTYsIDB4QzhGRH0sCi0JCXsweDA5OTgsIDB4MDM0N30sCi0JCXsweDA5OUEsIDB4Q0MwM30sCi0JCXsweDA5OUMsIDB4MzlGRH0sCi0JCXsweDA5OUUsIDB4MDJCRH0sCi0JCXsweDA5OEMsIDB4MDQ2NX0sCi0JCXsweDA5OTAsIDB4REUwMH0sCi0JCXsweDA5OTIsIDB4MThDRX0sCi0JCXsweDA5OTQsIDB4MDBDMn0sCi0JCXsweDA5OTYsIDB4Q0MwMH0sCi0JCXsweDA5OTgsIDB4MzdCRH0sCi0JCXsweDA5OUEsIDB4QzJCOH0sCi0JCXsweDA5OUMsIDB4Q0MwNH0sCi0JCXsweDA5OUUsIDB4RUZERH0sCi0JCXsweDA5OEMsIDB4MDQ3NX0sCi0JCXsweDA5OTAsIDB4RTZDQ30sCi0JCXsweDA5OTIsIDB4MDBDMn0sCi0JCXsweDA5OTQsIDB4REQwMH0sCi0JCXsweDA5OTYsIDB4QzYwMX0sCi0JCXsweDA5OTgsIDB4RjcwMX0sCi0JCXsweDA5OUEsIDB4NjRDNn0sCi0JCXsweDA5OUMsIDB4MDNGN30sCi0JCXsweDA5OUUsIDB4MDE2NX0sCi0JCXsweDA5OEMsIDB4MDQ4NX0sCi0JCXsweDA5OTAsIDB4N0YwMX0sCi0JCXsweDA5OTIsIDB4NjYzOX0sCi0JCXsweDA5OTQsIDB4M0MzQ30sCi0JCXsweDA5OTYsIDB4M0MzNH0sCi0JCXsweDA5OTgsIDB4Q0MzMn0sCi0JCXsweDA5OUEsIDB4M0VCRH0sCi0JCXsweDA5OUMsIDB4QTU1OH0sCi0JCXsweDA5OUUsIDB4MzBFRH0sCi0JCXsweDA5OEMsIDB4MDQ5NX0sCi0JCXsweDA5OTAsIDB4MDRCRH0sCi0JCXsweDA5OTIsIDB4QjJEN30sCi0JCXsweDA5OTQsIDB4MzBFN30sCi0JCXsweDA5OTYsIDB4MDZDQ30sCi0JCXsweDA5OTgsIDB4MzIzRX0sCi0JCXsweDA5OUEsIDB4RUQwMH0sCi0JCXsweDA5OUMsIDB4RUMwNH0sCi0JCXsweDA5OUUsIDB4QkRBNX0sCi0JCXsweDA5OEMsIDB4MDRBNX0sCi0JCXsweDA5OTAsIDB4NDRDQ30sCi0JCXsweDA5OTIsIDB4MzI0NH0sCi0JCXsweDA5OTQsIDB4QkRBNX0sCi0JCXsweDA5OTYsIDB4NTg1Rn0sCi0JCXsweDA5OTgsIDB4MzBFRH0sCi0JCXsweDA5OUEsIDB4MDJDQ30sCi0JCXsweDA5OUMsIDB4MzI0NH0sCi0JCXsweDA5OUUsIDB4RUQwMH0sCi0JCXsweDA5OEMsIDB4MDRCNX0sCi0JCXsweDA5OTAsIDB4RjYwMX0sCi0JCXsweDA5OTIsIDB4RDU0Rn0sCi0JCXsweDA5OTQsIDB4RUEwM30sCi0JCXsweDA5OTYsIDB4QUEwMn0sCi0JCXsweDA5OTgsIDB4QkRBNX0sCi0JCXsweDA5OUEsIDB4NDQzMH0sCi0JCXsweDA5OUMsIDB4RTYwNn0sCi0JCXsweDA5OUUsIDB4MzgzOH0sCi0JCXsweDA5OEMsIDB4MDRDNX0sCi0JCXsweDA5OTAsIDB4MzgzMX0sCi0JCXsweDA5OTIsIDB4MzlCRH0sCi0JCXsweDA5OTQsIDB4RDY2MX0sCi0JCXsweDA5OTYsIDB4RjYwMn0sCi0JCXsweDA5OTgsIDB4RjRDMX0sCi0JCXsweDA5OUEsIDB4MDEyNn0sCi0JCXsweDA5OUMsIDB4MEJGRX0sCi0JCXsweDA5OUUsIDB4MDJCRH0sCi0JCXsweDA5OEMsIDB4MDRENX0sCi0JCXsweDA5OTAsIDB4RUUxMH0sCi0JCXsweDA5OTIsIDB4RkMwMn0sCi0JCXsweDA5OTQsIDB4RjVBRH0sCi0JCXsweDA5OTYsIDB4MDAzOX0sCi0JCXsweDA5OTgsIDB4RjYwMn0sCi0JCXsweDA5OUEsIDB4RjRDMX0sCi0JCXsweDA5OUMsIDB4MDIyNn0sCi0JCXsweDA5OUUsIDB4MEFGRX0sCi0JCXsweDA5OEMsIDB4MDRFNX0sCi0JCXsweDA5OTAsIDB4MDJCRH0sCi0JCXsweDA5OTIsIDB4RUUxMH0sCi0JCXsweDA5OTQsIDB4RkMwMn0sCi0JCXsweDA5OTYsIDB4RjdBRH0sCi0JCXsweDA5OTgsIDB4MDAzOX0sCi0JCXsweDA5OUEsIDB4M0NCRH0sCi0JCXsweDA5OUMsIDB4QjA1OX0sCi0JCXsweDA5OUUsIDB4Q0MwMH0sCi0JCXsweDA5OEMsIDB4MDRGNX0sCi0JCXsweDA5OTAsIDB4MjhCRH0sCi0JCXsweDA5OTIsIDB4QTU1OH0sCi0JCXsweDA5OTQsIDB4ODMwMH0sCi0JCXsweDA5OTYsIDB4MDAyN30sCi0JCXsweDA5OTgsIDB4MEJDQ30sCi0JCXsweDA5OUEsIDB4MDAyNn0sCi0JCXsweDA5OUMsIDB4MzBFRH0sCi0JCXsweDA5OUUsIDB4MDBDNn0sCi0JCXsweDA5OEMsIDB4MDUwNX0sCi0JCXsweDA5OTAsIDB4MDNCRH0sCi0JCXsweDA5OTIsIDB4QTU0NH0sCi0JCXsweDA5OTQsIDB4MzgzOX0sCi0JCXsweDA5OEMsIDB4MjAwNn0sCi0JCXsweDA5OTAsIDB4MDQxNX0sCi0JCXsweDA5OEMsIDB4QTAwNX0sCi0JCXsweDA5OTAsIDB4MDAwMX0sCi19OwotCi1zdHJ1Y3QgbXQ5ZDExM19pMmNfcmVnX2NvbmYgY29uc3QKLQllZXByb21fc2V0dGluZ3NbXSA9IHsKLQkJezB4MzY1OCwgMHgwMTEwfSwKLQkJezB4MzY1QSwgMHgxQjZEfSwKLQkJezB4MzY1QywgMHgwMUYyfSwKLQkJezB4MzY1RSwgMHhGQkNEfSwKLQkJezB4MzY2MCwgMHg4QzkxfSwKLQkJezB4MzY4MCwgMHhCOUVEfSwKLQkJezB4MzY4MiwgMHgwRUV9LAotCQl7MHgzNjg0LCAweDI1NkZ9LAotCQl7MHgzNjg2LCAweDgyNEZ9LAotCQl7MHgzNjg4LCAweEQyOTN9LAotCQl7MHgzNkE4LCAweDVCRjJ9LAotCQl7MHgzNkFBLCAweDE3MTF9LAotCQl7MHgzNkFDLCAweEEwOTV9LAotCQl7MHgzNkFFLCAweDY0MkN9LAotCQl7MHgzNkIwLCAweDBFMzh9LAotCQl7MHgzNkQwLCAweDg4QjB9LAotCQl7MHgzNkQyLCAweDJFQjJ9LAotCQl7MHgzNkQ0LCAweDRDNzR9LAotCQl7MHgzNkQ2LCAweDlGOTZ9LAotCQl7MHgzNkQ4LCAweDk1NTd9LAotCQl7MHgzNkY4LCAweENFNTF9LAotCQl7MHgzNkZBLCAweEIzNTR9LAotCQl7MHgzNkZDLCAweDI4MTd9LAotCQl7MHgzNkZFLCAweDE0Qjh9LAotCQl7MHgzNzAwLCAweEIwMTl9LAotCQl7MHgzNjRFLCAweDA3MTB9LAotCQl7MHgzNjUwLCAweDMwRUR9LAotCQl7MHgzNjUyLCAweDAzRjJ9LAotCQl7MHgzNjU0LCAweEYxMkV9LAotCQl7MHgzNjU2LCAweDg0OTJ9LAotCQl7MHgzNjc2LCAweEQ5QUR9LAotCQl7MHgzNjc4LCAweDg4RDB9LAotCQl7MHgzNjdBLCAweDdERUR9LAotCQl7MHgzNjdDLCAweDNFMzF9LAotCQl7MHgzNjdFLCAweDkxQjN9LAotCQl7MHgzNjlFLCAweDcwMzJ9LAotCQl7MHgzNkEwLCAweDI3OTF9LAotCQl7MHgzNkEyLCAweEJCNTV9LAotCQl7MHgzNkE0LCAweEFCMzJ9LAotCQl7MHgzNkE2LCAweDFBNTh9LAotCQl7MHgzNkM2LCAweEI1MEZ9LAotCQl7MHgzNkM4LCAweDAwMTF9LAotCQl7MHgzNkNBLCAweDZEQjR9LAotCQl7MHgzNkNDLCAweDk2RjV9LAotCQl7MHgzNkNFLCAweDlCQjd9LAotCQl7MHgzNkVFLCAweDkzNTN9LAotCQl7MHgzNkYwLCAweERGNzR9LAotCQl7MHgzNkYyLCAweDA0Rjh9LAotCQl7MHgzNkY0LCAweDBGRDh9LAotCQl7MHgzNkY2LCAweEE4N0F9LAotCQl7MHgzNjYyLCAweDAxNzB9LAotCQl7MHgzNjY0LCAweDZGMEN9LAotCQl7MHgzNjY2LCAweDAxMTJ9LAotCQl7MHgzNjY4LCAweENCQUJ9LAotCQl7MHgzNjZBLCAweDkxMTF9LAotCQl7MHgzNjhBLCAweEIzOER9LAotCQl7MHgzNjhDLCAweEU5NkZ9LAotCQl7MHgzNjhFLCAweENDMEZ9LAotCQl7MHgzNjkwLCAweDU4NTF9LAotCQl7MHgzNjkyLCAweEZERDJ9LAotCQl7MHgzNkIyLCAweDVGOTJ9LAotCQl7MHgzNkI0LCAweDMzQjJ9LAotCQl7MHgzNkI2LCAweDk4MTV9LAotCQl7MHgzNkI4LCAweDg2RjV9LAotCQl7MHgzNkJBLCAweDA1Nzh9LAotCQl7MHgzNkRBLCAweENEOTB9LAotCQl7MHgzNkRDLCAweDExMzF9LAotCQl7MHgzNkRFLCAweDUyNzV9LAotCQl7MHgzNkUwLCAweEU4NTV9LAotCQl7MHgzNkUyLCAweEQwMzd9LAotCQl7MHgzNzAyLCAweEFBRDF9LAotCQl7MHgzNzA0LCAweEVCNzV9LAotCQl7MHgzNzA2LCAweDBDRDd9LAotCQl7MHgzNzA4LCAweDJDNzl9LAotCQl7MHgzNzBBLCAweEUwQjl9LAotCQl7MHgzNjZDLCAweDAxOTB9LAotCQl7MHgzNjZFLCAweDFDOER9LAotCQl7MHgzNjcwLCAweDAwNTJ9LAotCQl7MHgzNjcyLCAweEQ2NkV9LAotCQl7MHgzNjc0LCAweEY1MTF9LAotCQl7MHgzNjk0LCAweEI1NER9LAotCQl7MHgzNjk2LCAweDZFNEV9LAotCQl7MHgzNjk4LCAweDE0MkV9LAotCQl7MHgzNjlBLCAweEMxOTB9LAotCQl7MHgzNjlDLCAweEE3NTN9LAotCQl7MHgzNkJDLCAweDcwRjJ9LAotCQl7MHgzNkJFLCAweDA0RjF9LAotCQl7MHgzNkMwLCAweEJEOTV9LAotCQl7MHgzNkMyLCAweDBDRUV9LAotCQl7MHgzNkM0LCAweDFCRjh9LAotCQl7MHgzNkU0LCAweDgwNkZ9LAotCQl7MHgzNkU2LCAweDE2NzJ9LAotCQl7MHgzNkU4LCAweDJERjR9LAotCQl7MHgzNkVBLCAweDhGMTZ9LAotCQl7MHgzNkVDLCAweEY3NzZ9LAotCQl7MHgzNzBDLCAweEFENzN9LAotCQl7MHgzNzBFLCAweEI1MzR9LAotCQl7MHgzNzEwLCAweDBEMTh9LAotCQl7MHgzNzEyLCAweDYwNTd9LAotCQl7MHgzNzE0LCAweEJEMUF9LAotCQl7MHgzNjQ0LCAweDAzNTR9LAotCQl7MHgzNjQyLCAweDAyMzR9LAotCQl7MHgzMjEwLCAweDAxQjh9LAotfTsKLQotc3RydWN0IG10OWQxMTNfaTJjX3JlZ19jb25mIGNvbnN0Ci0JYXdiX3NldHRpbmdzW10gPSB7Ci0JCXsweDA5OEMsIDB4MjMwNn0sCi0JCXsweDA5OTAsIDB4MDE4MH0sCi0JCXsweDA5OEMsIDB4MjMwOH0sCi0JCXsweDA5OTAsIDB4RkYwMH0sCi0JCXsweDA5OEMsIDB4MjMwQX0sCi0JCXsweDA5OTAsIDB4MDA4MH0sCi0JCXsweDA5OEMsIDB4MjMwQ30sCi0JCXsweDA5OTAsIDB4RkY2Nn0sCi0JCXsweDA5OEMsIDB4MjMwRX0sCi0JCXsweDA5OTAsIDB4MDE4MH0sCi0JCXsweDA5OEMsIDB4MjMxMH0sCi0JCXsweDA5OTAsIDB4RkZFRX0sCi0JCXsweDA5OEMsIDB4MjMxMn0sCi0JCXsweDA5OTAsIDB4RkZDRH0sCi0JCXsweDA5OEMsIDB4MjMxNH0sCi0JCXsweDA5OTAsIDB4RkVDRH0sCi0JCXsweDA5OEMsIDB4MjMxNn0sCi0JCXsweDA5OTAsIDB4MDE5QX0sCi0JCXsweDA5OEMsIDB4MjMxOH0sCi0JCXsweDA5OTAsIDB4MDAyMH0sCi0JCXsweDA5OEMsIDB4MjMxQX0sCi0JCXsweDA5OTAsIDB4MDAzM30sCi0JCXsweDA5OEMsIDB4MjMxQ30sCi0JCXsweDA5OTAsIDB4MDEwMH0sCi0JCXsweDA5OEMsIDB4MjMxRX0sCi0JCXsweDA5OTAsIDB4RkY5QX0sCi0JCXsweDA5OEMsIDB4MjMyMH0sCi0JCXsweDA5OTAsIDB4MDAwMH0sCi0JCXsweDA5OEMsIDB4MjMyMn0sCi0JCXsweDA5OTAsIDB4MDA0RH0sCi0JCXsweDA5OEMsIDB4MjMyNH0sCi0JCXsweDA5OTAsIDB4RkZDRH0sCi0JCXsweDA5OEMsIDB4MjMyNn0sCi0JCXsweDA5OTAsIDB4RkZCOH0sCi0JCXsweDA5OEMsIDB4MjMyOH0sCi0JCXsweDA5OTAsIDB4MDA0RH0sCi0JCXsweDA5OEMsIDB4MjMyQX0sCi0JCXsweDA5OTAsIDB4MDA4MH0sCi0JCXsweDA5OEMsIDB4MjMyQ30sCi0JCXsweDA5OTAsIDB4RkY2Nn0sCi0JCXsweDA5OEMsIDB4MjMyRX0sCi0JCXsweDA5OTAsIDB4MDAwOH0sCi0JCXsweDA5OEMsIDB4MjMzMH0sCi0JCXsweDA5OTAsIDB4RkZGN30sCi0JCXsweDA5OEMsIDB4QTM2M30sCi0JCXsweDA5OTAsIDB4MDBEMn0sCi0JCXsweDA5OEMsIDB4QTM2NH0sCi0JCXsweDA5OTAsIDB4MDBFRX0sCi0JCXsweDMyNDQsIDB4MDMyOH0sCi0JCXsweDMyM0UsIDB4QzIyQ30sCi19OwotCi1zdHJ1Y3QgbXQ5ZDExM19pMmNfcmVnX2NvbmYgY29uc3QKLQlsb3dfbGlnaHRfc2V0dGluZ1tdID0gewotCQl7MHgwOThDLCAweDJCMjh9LAotCQl7MHgwOTkwLCAweDM1RTh9LAotCQl7MHgwOThDLCAweDJCMkF9LAotCQl7MHgwOTkwLCAweEIzQjB9LAotCQl7MHgwOThDLCAweEFCMjB9LAotCQl7MHgwOTkwLCAweDAwNEJ9LAotCQl7MHgwOThDLCAweEFCMjR9LAotCQl7MHgwOTkwLCAweDAwMDB9LAotCQl7MHgwOThDLCAweEFCMjV9LAotCQl7MHgwOTkwLCAweDAwRkZ9LAotCQl7MHgwOThDLCAweEFCMzB9LAotCQl7MHgwOTkwLCAweDAwRkZ9LAotCQl7MHgwOThDLCAweEFCMzF9LAotCQl7MHgwOTkwLCAweDAwRkZ9LAotCQl7MHgwOThDLCAweEFCMzJ9LAotCQl7MHgwOTkwLCAweDAwRkZ9LAotCQl7MHgwOThDLCAweEFCMzN9LAotCQl7MHgwOTkwLCAweDAwNTd9LAotCQl7MHgwOThDLCAweEFCMzR9LAotCQl7MHgwOTkwLCAweDAwODB9LAotCQl7MHgwOThDLCAweEFCMzV9LAotCQl7MHgwOTkwLCAweDAwRkZ9LAotCQl7MHgwOThDLCAweEFCMzZ9LAotCQl7MHgwOTkwLCAweDAwMTR9LAotCQl7MHgwOThDLCAweEFCMzd9LAotCQl7MHgwOTkwLCAweDAwMDN9LAotCQl7MHgwOThDLCAweDJCMzh9LAotCQl7MHgwOTkwLCAweDMyQzh9LAotCQl7MHgwOThDLCAweDJCM0F9LAotCQl7MHgwOTkwLCAweDc5MTh9LAotCQl7MHgwOThDLCAweDJCNjJ9LAotCQl7MHgwOTkwLCAweEZGRkV9LAotCQl7MHgwOThDLCAweDJCNjR9LAotCQl7MHgwOTkwLCAweEZGRkZ9LAotfTsKLQotc3RydWN0IG10OWQxMTNfcmVnIG10OWQxMTNfcmVncyA9IHsKLQkJLnBsbF90YmwgPSBwbGxfdGJsX3NldHRpbmdzLAotCQkucGxsX3RibF9zaXplID0gQVJSQVlfU0laRSgKLQkJCXBsbF90Ymxfc2V0dGluZ3MpLAotCQkucmVnaXN0ZXJfdGJsID0gcmVnaXN0ZXJfd2l6YXJkX3NldHRpbmdzLAotCQkucmVnaXN0ZXJfdGJsX3NpemUgPSBBUlJBWV9TSVpFKAotCQkJcmVnaXN0ZXJfd2l6YXJkX3NldHRpbmdzKSwKLQkJLmVycl90YmwgPSBlcnJfc2V0dGluZ3MsCi0JCS5lcnJfdGJsX3NpemUgPSBBUlJBWV9TSVpFKGVycl9zZXR0aW5ncyksCi0JCS5sb3dfbGlnaHRfdGJsID0gbG93X2xpZ2h0X3NldHRpbmcsCi0JCS5sb3dfbGlnaHRfdGJsX3NpemUgPSBBUlJBWV9TSVpFKGxvd19saWdodF9zZXR0aW5nKSwKLQkJLmF3Yl90YmwgPSBhd2Jfc2V0dGluZ3MsCi0JCS5hd2JfdGJsX3NpemUgPSBBUlJBWV9TSVpFKGF3Yl9zZXR0aW5ncyksCi0JCS5wYXRjaF90YmwgPSBwYXRjaF9zZXR0aW5ncywKLQkJLnBhdGNoX3RibF9zaXplID0gQVJSQVlfU0laRShwYXRjaF9zZXR0aW5ncyksCi0JCS5lZXByb21fdGJsID0gZWVwcm9tX3NldHRpbmdzLAotCQkuZWVwcm9tX3RibF9zaXplID0gQVJSQVlfU0laRShlZXByb21fc2V0dGluZ3MpLAotfTsKLQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDllMDEzLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5ZTAxMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTFiZWM0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDllMDEzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQwICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2NhbWVyYS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSAibXQ5ZTAxMy5oIgotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JU0VOU09SIFJFR0lTVEVSIERFRklORVMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLSNkZWZpbmUgUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQJCTB4MDEwNAotI2RlZmluZSBHUk9VUEVEX1BBUkFNRVRFUl9IT0xEX09GRgkJMHgwMAotI2RlZmluZSBHUk9VUEVEX1BBUkFNRVRFUl9IT0xECQkJMHgwMQotLyogSW50ZWdyYXRpb24gVGltZSAqLwotI2RlZmluZSBSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUUJCTB4MzAxMgotLyogR2FpbiAqLwotI2RlZmluZSBSRUdfR0xPQkFMX0dBSU4JMHgzMDVFCi0vKiBQTEwgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFJFR19GUkFNRV9MRU5HVEhfTElORVMJCTB4MDM0MAotLyogVGVzdCBQYXR0ZXJuICovCi0jZGVmaW5lIFJFR19URVNUX1BBVFRFUk5fTU9ERQkJCTB4MDYwMQotI2RlZmluZSBSRUdfVkNNX05FV19DT0RFCQkJMHgzMEYyCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkJCQkJCSBUWVBFIERFQ0xBUkFUSU9OUwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qIDE2Yml0IGFkZHJlc3MgLSA4IGJpdCBjb250ZXh0IHJlZ2lzdGVyIHN0cnVjdHVyZSAqLwotI2RlZmluZSBROAkweDAwMDAwMTAwCi0jZGVmaW5lIFExMAkweDAwMDAwNDAwCi0jZGVmaW5lIE1UOUUwMTNfTUFTVEVSX0NMS19SQVRFIDI0MDAwMDAwCi0KLS8qIEFGIFRvdGFsIHN0ZXBzIHBhcmFtZXRlcnMgKi8KLSNkZWZpbmUgTVQ5RTAxM19UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUiAgICAzMgotCi11aW50MTZfdCBtdDllMDEzX3N0ZXBfcG9zaXRpb25fdGFibGVbTVQ5RTAxM19UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUisxXTsKLXVpbnQxNl90IG10OWUwMTNfbmxfcmVnaW9uX2JvdW5kYXJ5MTsKLXVpbnQxNl90IG10OWUwMTNfbmxfcmVnaW9uX2NvZGVfcGVyX3N0ZXAxOwotdWludDE2X3QgbXQ5ZTAxM19sX3JlZ2lvbl9jb2RlX3Blcl9zdGVwID0gNDsKLXVpbnQxNl90IG10OWUwMTNfZGFtcGluZ190aHJlc2hvbGQgPSAxMDsKLXVpbnQxNl90IG10OWUwMTNfc3dfZGFtcGluZ190aW1lX3dhaXQgPSAxOwotCi1zdHJ1Y3QgbXQ5ZTAxM193b3JrX3QgewotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotfTsKLQotc3RhdGljIHN0cnVjdCBtdDllMDEzX3dvcmtfdCAqbXQ5ZTAxM19zZW5zb3J3Owotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50ICptdDllMDEzX2NsaWVudDsKLQotc3RydWN0IG10OWUwMTNfY3RybF90IHsKLQljb25zdCBzdHJ1Y3QgIG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNlbnNvcmRhdGE7Ci0KLQl1aW50MzJfdCBzZW5zb3Jtb2RlOwotCXVpbnQzMl90IGZwc19kaXZpZGVyOy8qIGluaXQgdG8gMSAqIDB4MDAwMDA0MDAgKi8KLQl1aW50MzJfdCBwaWN0X2Zwc19kaXZpZGVyOy8qIGluaXQgdG8gMSAqIDB4MDAwMDA0MDAgKi8KLQl1aW50MTZfdCBmcHM7Ci0KLQl1aW50MTZfdCBjdXJyX2xlbnNfcG9zOwotCXVpbnQxNl90IGN1cnJfc3RlcF9wb3M7Ci0JdWludDE2X3QgbXlfcmVnX2dhaW47Ci0JdWludDMyX3QgbXlfcmVnX2xpbmVfY291bnQ7Ci0JdWludDE2X3QgdG90YWxfbGluZXNfcGVyX2ZyYW1lOwotCi0JZW51bSBtdDllMDEzX3Jlc29sdXRpb25fdCBwcmV2X3JlczsKLQllbnVtIG10OWUwMTNfcmVzb2x1dGlvbl90IHBpY3RfcmVzOwotCWVudW0gbXQ5ZTAxM19yZXNvbHV0aW9uX3QgY3Vycl9yZXM7Ci0JZW51bSBtdDllMDEzX3Rlc3RfbW9kZV90ICBzZXRfdGVzdDsKLX07Ci0KLQotc3RhdGljIGJvb2wgQ1NJX0NPTkZJRzsKLXN0YXRpYyBzdHJ1Y3QgbXQ5ZTAxM19jdHJsX3QgKm10OWUwMTNfY3RybDsKLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChtdDllMDEzX3dhaXRfcXVldWUpOwotREVGSU5FX01VVEVYKG10OWUwMTNfbXV0KTsKLQotc3RhdGljIGludCBjYW1fZGVidWdfaW5pdCh2b2lkKTsKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2Jhc2U7Ci0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgaW50IG10OWUwMTNfaTJjX3J4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQl1bnNpZ25lZCBjaGFyICpyeGRhdGEsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGkyY19tc2cgbXNnc1tdID0gewotCQl7Ci0JCQkuYWRkciAgPSBzYWRkciwKLQkJCS5mbGFncyA9IDAsCi0JCQkubGVuICAgPSAyLAotCQkJLmJ1ZiAgID0gcnhkYXRhLAotCQl9LAotCQl7Ci0JCQkuYWRkciAgPSBzYWRkciwKLQkJCS5mbGFncyA9IEkyQ19NX1JELAotCQkJLmxlbiAgID0gMiwKLQkJCS5idWYgICA9IHJ4ZGF0YSwKLQkJfSwKLQl9OwotCWlmIChpMmNfdHJhbnNmZXIobXQ5ZTAxM19jbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpIDwgMCkgewotCQlDREJHKCJtdDllMDEzX2kyY19yeGRhdGEgZmFpbGQgMHgleFxuIiwgc2FkZHIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OWUwMTNfaTJjX3R4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQkJCQl1bnNpZ25lZCBjaGFyICp0eGRhdGEsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGkyY19tc2cgbXNnW10gPSB7Ci0JCXsKLQkJCS5hZGRyID0gc2FkZHIsCi0JCQkuZmxhZ3MgPSAwLAotCQkJLmxlbiA9IGxlbmd0aCwKLQkJCS5idWYgPSB0eGRhdGEsCi0JCSB9LAotCX07Ci0JaWYgKGkyY190cmFuc2ZlcihtdDllMDEzX2NsaWVudC0+YWRhcHRlciwgbXNnLCAxKSA8IDApIHsKLQkJQ0RCRygibXQ5ZTAxM19pMmNfdHhkYXRhIGZhaWxkIDB4JXhcbiIsIHNhZGRyKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OWUwMTNfaTJjX3JlYWQodW5zaWduZWQgc2hvcnQgcmFkZHIsCi0JdW5zaWduZWQgc2hvcnQgKnJkYXRhLCBpbnQgcmxlbikKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKLQlpZiAoIXJkYXRhKQotCQlyZXR1cm4gLUVJTzsKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gKHJhZGRyICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlsxXSA9IChyYWRkciAmIDB4MDBGRik7Ci0JcmMgPSBtdDllMDEzX2kyY19yeGRhdGEobXQ5ZTAxM19jbGllbnQtPmFkZHI8PDEsIGJ1Ziwgcmxlbik7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJtdDllMDEzX2kyY19yZWFkIDB4JXggZmFpbGVkIVxuIiwgcmFkZHIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCSpyZGF0YSA9IChybGVuID09IDIgPyBidWZbMF0gPDwgOCB8IGJ1ZlsxXSA6IGJ1ZlswXSk7Ci0JQ0RCRygibXQ5ZTAxM19pMmNfcmVhZCAweCV4IHZhbCA9IDB4JXghXG4iLCByYWRkciwgKnJkYXRhKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OWUwMTNfaTJjX3dyaXRlX3dfc2Vuc29yKHVuc2lnbmVkIHNob3J0IHdhZGRyLCB1aW50MTZfdCB3ZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gLUVGQVVMVDsKLQl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gKHdhZGRyICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlsxXSA9ICh3YWRkciAmIDB4MDBGRik7Ci0JYnVmWzJdID0gKHdkYXRhICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlszXSA9ICh3ZGF0YSAmIDB4MDBGRik7Ci0JQ0RCRygiaTJjX3dyaXRlX2IgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIHdhZGRyLCB3ZGF0YSk7Ci0JcmMgPSBtdDllMDEzX2kyY190eGRhdGEobXQ5ZTAxM19jbGllbnQtPmFkZHI8PDEsIGJ1ZiwgNCk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJpMmNfd3JpdGVfYiBmYWlsZWQsIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4IVxuIiwKLQkJCXdhZGRyLCB3ZGF0YSk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5ZTAxM19pMmNfd3JpdGVfYl9zZW5zb3IodW5zaWduZWQgc2hvcnQgd2FkZHIsIHVpbnQ4X3QgYmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IC1FRkFVTFQ7Ci0JdW5zaWduZWQgY2hhciBidWZbM107Ci0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9ICh3YWRkciAmIDB4RkYwMCkgPj4gODsKLQlidWZbMV0gPSAod2FkZHIgJiAweDAwRkYpOwotCWJ1ZlsyXSA9IGJkYXRhOwotCUNEQkcoImkyY193cml0ZV9iIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4XG4iLCB3YWRkciwgYmRhdGEpOwotCXJjID0gbXQ5ZTAxM19pMmNfdHhkYXRhKG10OWUwMTNfY2xpZW50LT5hZGRyPDwxLCBidWYsIDMpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiaTJjX3dyaXRlX2IgZmFpbGVkLCBhZGRyID0gMHgleCwgdmFsID0gMHgleCFcbiIsCi0JCQl3YWRkciwgYmRhdGEpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OWUwMTNfaTJjX3dyaXRlX3dfdGFibGUoc3RydWN0IG10OWUwMTNfaTJjX3JlZ19jb25mIGNvbnN0Ci0JCQkJCSAqcmVnX2NvbmZfdGJsLCBpbnQgbnVtKQotewotCWludCBpOwotCWludDMyX3QgcmMgPSAtRUlPOwotCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQlyYyA9IG10OWUwMTNfaTJjX3dyaXRlX3dfc2Vuc29yKHJlZ19jb25mX3RibC0+d2FkZHIsCi0JCQlyZWdfY29uZl90YmwtPndkYXRhKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlyZWdfY29uZl90YmwrKzsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBtdDllMDEzX2dyb3VwX2hvbGRfb24odm9pZCkKLXsKLQltdDllMDEzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQkJCUdST1VQRURfUEFSQU1FVEVSX0hPTEQpOwotfQotCi1zdGF0aWMgdm9pZCBtdDllMDEzX2dyb3VwX2hvbGRfb2ZmKHZvaWQpCi17Ci0JbXQ5ZTAxM19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJCQlHUk9VUEVEX1BBUkFNRVRFUl9IT0xEX09GRik7Ci19Ci0KLXN0YXRpYyB2b2lkIG10OWUwMTNfc3RhcnRfc3RyZWFtKHZvaWQpCi17Ci0JbXQ5ZTAxM19pMmNfd3JpdGVfd19zZW5zb3IoMHgzMDFBLCAweDgyNTApOwotCW10OWUwMTNfaTJjX3dyaXRlX3dfc2Vuc29yKDB4MzAxQSwgMHg4NjUwKTsKLQltdDllMDEzX2kyY193cml0ZV93X3NlbnNvcigweDMwMUEsIDB4ODY1OCk7Ci0JbXQ5ZTAxM19pMmNfd3JpdGVfYl9zZW5zb3IoMHgwMTA0LCAweDAwKTsKLQltdDllMDEzX2kyY193cml0ZV93X3NlbnNvcigweDMwMUEsIDB4MDY1Qyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG10OWUwMTNfc3RvcF9zdHJlYW0odm9pZCkKLXsKLQltdDllMDEzX2kyY193cml0ZV93X3NlbnNvcigweDMwMUEsIDB4MDA1OCk7Ci0JbXQ5ZTAxM19pMmNfd3JpdGVfd19zZW5zb3IoMHgzMDFBLCAweDAwNTApOwotCW10OWUwMTNfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MDEwNCwgMHgwMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG10OWUwMTNfZ2V0X3BpY3RfZnBzKHVpbnQxNl90IGZwcywgdWludDE2X3QgKnBmcHMpCi17Ci0JLyogaW5wdXQgZnBzIGlzIHByZXZpZXcgZnBzIGluIFE4IGZvcm1hdCAqLwotCXVpbnQzMl90IGRpdmlkZXIsIGQxLCBkMjsKLQotCWQxID0gbXQ5ZTAxM19yZWdzLnJlZ19wcmV2W0UwMTNfRlJBTUVfTEVOR1RIX0xJTkVTXS53ZGF0YQotCQkqIDB4MDAwMDA0MDAvCi0JCW10OWUwMTNfcmVncy5yZWdfc25hcFtFMDEzX0ZSQU1FX0xFTkdUSF9MSU5FU10ud2RhdGE7Ci0JZDIgPSBtdDllMDEzX3JlZ3MucmVnX3ByZXZbRTAxM19MSU5FX0xFTkdUSF9QQ0tdLndkYXRhCi0JCSogMHgwMDAwMDQwMC8KLQkJbXQ5ZTAxM19yZWdzLnJlZ19zbmFwW0UwMTNfTElORV9MRU5HVEhfUENLXS53ZGF0YTsKLQlkaXZpZGVyID0gZDEgKiBkMiAvIDB4NDAwOwotCi0JLypWZXJpZnkgUENMSyBzZXR0aW5ncyBhbmQgZnJhbWUgc2l6ZXMuKi8KLQkqcGZwcyA9ICh1aW50MTZfdCkgKGZwcyAqIGRpdmlkZXIgLyAweDQwMCk7Ci0JLyogMiBpcyB0aGUgcmF0aW8gb2Ygbm8ub2Ygc25hcHNob3QgY2hhbm5lbHMKLQl0byBudW1iZXIgb2YgcHJldmlldyBjaGFubmVscyAqLwotfQotCi1zdGF0aWMgdWludDE2X3QgbXQ5ZTAxM19nZXRfcHJldl9saW5lc19wZih2b2lkKQotewotCWlmIChtdDllMDEzX2N0cmwtPnByZXZfcmVzID09IFFUUl9TSVpFKQotCQlyZXR1cm4gbXQ5ZTAxM19yZWdzLnJlZ19wcmV2W0UwMTNfRlJBTUVfTEVOR1RIX0xJTkVTXS53ZGF0YTsKLQllbHNlIGlmIChtdDllMDEzX2N0cmwtPnByZXZfcmVzID09IEZVTExfU0laRSkKLQkJcmV0dXJuIG10OWUwMTNfcmVncy5yZWdfc25hcFtFMDEzX0ZSQU1FX0xFTkdUSF9MSU5FU10ud2RhdGE7Ci0JZWxzZSBpZiAobXQ5ZTAxM19jdHJsLT5wcmV2X3JlcyA9PSBIRlJfNjBGUFMpCi0JCXJldHVybiBtdDllMDEzX3JlZ3MucmVnXzYwZnBzW0UwMTNfRlJBTUVfTEVOR1RIX0xJTkVTXS53ZGF0YTsKLQllbHNlIGlmIChtdDllMDEzX2N0cmwtPnByZXZfcmVzID09IEhGUl85MEZQUykKLQkJcmV0dXJuIG10OWUwMTNfcmVncy5yZWdfMTIwZnBzW0UwMTNfRlJBTUVfTEVOR1RIX0xJTkVTXS53ZGF0YTsKLQllbHNlCi0JCXJldHVybiBtdDllMDEzX3JlZ3MucmVnXzEyMGZwc1tFMDEzX0ZSQU1FX0xFTkdUSF9MSU5FU10ud2RhdGE7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBtdDllMDEzX2dldF9wcmV2X3BpeGVsc19wbCh2b2lkKQotewotCWlmIChtdDllMDEzX2N0cmwtPnByZXZfcmVzID09IFFUUl9TSVpFKQotCQlyZXR1cm4gbXQ5ZTAxM19yZWdzLnJlZ19wcmV2W0UwMTNfTElORV9MRU5HVEhfUENLXS53ZGF0YTsKLQllbHNlIGlmIChtdDllMDEzX2N0cmwtPnByZXZfcmVzID09IEZVTExfU0laRSkKLQkJcmV0dXJuIG10OWUwMTNfcmVncy5yZWdfc25hcFtFMDEzX0xJTkVfTEVOR1RIX1BDS10ud2RhdGE7Ci0JZWxzZSBpZiAobXQ5ZTAxM19jdHJsLT5wcmV2X3JlcyA9PSBIRlJfNjBGUFMpCi0JCXJldHVybiBtdDllMDEzX3JlZ3MucmVnXzYwZnBzW0UwMTNfTElORV9MRU5HVEhfUENLXS53ZGF0YTsKLQllbHNlIGlmIChtdDllMDEzX2N0cmwtPnByZXZfcmVzID09IEhGUl85MEZQUykKLQkJcmV0dXJuIG10OWUwMTNfcmVncy5yZWdfMTIwZnBzW0UwMTNfTElORV9MRU5HVEhfUENLXS53ZGF0YTsKLQllbHNlCi0JCXJldHVybiBtdDllMDEzX3JlZ3MucmVnXzEyMGZwc1tFMDEzX0xJTkVfTEVOR1RIX1BDS10ud2RhdGE7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBtdDllMDEzX2dldF9waWN0X2xpbmVzX3BmKHZvaWQpCi17Ci0JaWYgKG10OWUwMTNfY3RybC0+cGljdF9yZXMgPT0gUVRSX1NJWkUpCi0JCXJldHVybiBtdDllMDEzX3JlZ3MucmVnX3ByZXZbRTAxM19GUkFNRV9MRU5HVEhfTElORVNdLndkYXRhOwotCWVsc2UgaWYgKG10OWUwMTNfY3RybC0+cGljdF9yZXMgPT0gRlVMTF9TSVpFKQotCQlyZXR1cm4gbXQ5ZTAxM19yZWdzLnJlZ19zbmFwW0UwMTNfRlJBTUVfTEVOR1RIX0xJTkVTXS53ZGF0YTsKLQllbHNlIGlmIChtdDllMDEzX2N0cmwtPnBpY3RfcmVzID09IEhGUl82MEZQUykKLQkJcmV0dXJuIG10OWUwMTNfcmVncy5yZWdfNjBmcHNbRTAxM19GUkFNRV9MRU5HVEhfTElORVNdLndkYXRhOwotCWVsc2UgaWYgKG10OWUwMTNfY3RybC0+cGljdF9yZXMgPT0gSEZSXzkwRlBTKQotCQlyZXR1cm4gbXQ5ZTAxM19yZWdzLnJlZ18xMjBmcHNbRTAxM19GUkFNRV9MRU5HVEhfTElORVNdLndkYXRhOwotCWVsc2UKLQkJcmV0dXJuIG10OWUwMTNfcmVncy5yZWdfMTIwZnBzW0UwMTNfRlJBTUVfTEVOR1RIX0xJTkVTXS53ZGF0YTsKLX0KLQotc3RhdGljIHVpbnQxNl90IG10OWUwMTNfZ2V0X3BpY3RfcGl4ZWxzX3BsKHZvaWQpCi17Ci0JaWYgKG10OWUwMTNfY3RybC0+cGljdF9yZXMgPT0gUVRSX1NJWkUpCi0JCXJldHVybiBtdDllMDEzX3JlZ3MucmVnX3ByZXZbRTAxM19MSU5FX0xFTkdUSF9QQ0tdLndkYXRhOwotCWVsc2UgaWYgKG10OWUwMTNfY3RybC0+cGljdF9yZXMgPT0gRlVMTF9TSVpFKQotCQlyZXR1cm4gbXQ5ZTAxM19yZWdzLnJlZ19zbmFwW0UwMTNfTElORV9MRU5HVEhfUENLXS53ZGF0YTsKLQllbHNlIGlmIChtdDllMDEzX2N0cmwtPnBpY3RfcmVzID09IEhGUl82MEZQUykKLQkJcmV0dXJuIG10OWUwMTNfcmVncy5yZWdfNjBmcHNbRTAxM19MSU5FX0xFTkdUSF9QQ0tdLndkYXRhOwotCWVsc2UgaWYgKG10OWUwMTNfY3RybC0+cGljdF9yZXMgPT0gSEZSXzkwRlBTKQotCQlyZXR1cm4gbXQ5ZTAxM19yZWdzLnJlZ18xMjBmcHNbRTAxM19MSU5FX0xFTkdUSF9QQ0tdLndkYXRhOwotCWVsc2UKLQkJcmV0dXJuIG10OWUwMTNfcmVncy5yZWdfMTIwZnBzW0UwMTNfTElORV9MRU5HVEhfUENLXS53ZGF0YTsKLX0KLQotc3RhdGljIHVpbnQzMl90IG10OWUwMTNfZ2V0X3BpY3RfbWF4X2V4cF9sYyh2b2lkKQotewotCWlmIChtdDllMDEzX2N0cmwtPnBpY3RfcmVzID09IFFUUl9TSVpFKQotCQlyZXR1cm4gbXQ5ZTAxM19yZWdzLnJlZ19wcmV2W0UwMTNfRlJBTUVfTEVOR1RIX0xJTkVTXS53ZGF0YQotCQkJKiAyNDsKLQllbHNlIGlmIChtdDllMDEzX2N0cmwtPnBpY3RfcmVzID09IEZVTExfU0laRSkKLQkJcmV0dXJuIG10OWUwMTNfcmVncy5yZWdfc25hcFtFMDEzX0ZSQU1FX0xFTkdUSF9MSU5FU10ud2RhdGEKLQkJCSogMjQ7Ci0JZWxzZSBpZiAobXQ5ZTAxM19jdHJsLT5waWN0X3JlcyA9PSBIRlJfNjBGUFMpCi0JCXJldHVybiBtdDllMDEzX3JlZ3MucmVnXzYwZnBzW0UwMTNfRlJBTUVfTEVOR1RIX0xJTkVTXS53ZGF0YQotCQkJKiAyNDsKLQllbHNlIGlmIChtdDllMDEzX2N0cmwtPnBpY3RfcmVzID09IEhGUl85MEZQUykKLQkJcmV0dXJuIG10OWUwMTNfcmVncy5yZWdfMTIwZnBzW0UwMTNfRlJBTUVfTEVOR1RIX0xJTkVTXS53ZGF0YQotCQkJKiAyNDsKLQllbHNlCi0JCXJldHVybiBtdDllMDEzX3JlZ3MucmVnXzEyMGZwc1tFMDEzX0ZSQU1FX0xFTkdUSF9MSU5FU10ud2RhdGEKLQkJCSogMjQ7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OWUwMTNfc2V0X2ZwcyhzdHJ1Y3QgZnBzX2NmZyAgICpmcHMpCi17Ci0JdWludDE2X3QgdG90YWxfbGluZXNfcGVyX2ZyYW1lOwotCWludDMyX3QgcmMgPSAwOwotCWlmIChtdDllMDEzX2N0cmwtPmN1cnJfcmVzID09IFFUUl9TSVpFKQotCQl0b3RhbF9saW5lc19wZXJfZnJhbWUgPQotCQltdDllMDEzX3JlZ3MucmVnX3ByZXZbRTAxM19GUkFNRV9MRU5HVEhfTElORVNdLndkYXRhOwotCWVsc2UgaWYgKG10OWUwMTNfY3RybC0+Y3Vycl9yZXMgPT0gRlVMTF9TSVpFKQotCQl0b3RhbF9saW5lc19wZXJfZnJhbWUgPQotCQltdDllMDEzX3JlZ3MucmVnX3NuYXBbRTAxM19GUkFNRV9MRU5HVEhfTElORVNdLndkYXRhOwotCWVsc2UgaWYgKG10OWUwMTNfY3RybC0+Y3Vycl9yZXMgPT0gSEZSXzYwRlBTKQotCQl0b3RhbF9saW5lc19wZXJfZnJhbWUgPQotCQltdDllMDEzX3JlZ3MucmVnXzYwZnBzW0UwMTNfRlJBTUVfTEVOR1RIX0xJTkVTXS53ZGF0YTsKLQllbHNlIGlmIChtdDllMDEzX2N0cmwtPmN1cnJfcmVzID09IEhGUl85MEZQUykKLQkJdG90YWxfbGluZXNfcGVyX2ZyYW1lID0KLQkJbXQ5ZTAxM19yZWdzLnJlZ18xMjBmcHNbRTAxM19GUkFNRV9MRU5HVEhfTElORVNdLndkYXRhOwotCWVsc2UKLQkJdG90YWxfbGluZXNfcGVyX2ZyYW1lID0KLQkJbXQ5ZTAxM19yZWdzLnJlZ18xMjBmcHNbRTAxM19GUkFNRV9MRU5HVEhfTElORVNdLndkYXRhOwotCi0JbXQ5ZTAxM19jdHJsLT5mcHNfZGl2aWRlciA9IGZwcy0+ZnBzX2RpdjsKLQltdDllMDEzX2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIgPSBmcHMtPnBpY3RfZnBzX2RpdjsKLQotCWlmIChtdDllMDEzX2N0cmwtPmN1cnJfcmVzID09IEZVTExfU0laRSkgewotCQl0b3RhbF9saW5lc19wZXJfZnJhbWUgPSAodWludDE2X3QpCi0JCSh0b3RhbF9saW5lc19wZXJfZnJhbWUgKiBtdDllMDEzX2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIvMHg0MDApOwotCX0gZWxzZSB7Ci0JCXRvdGFsX2xpbmVzX3Blcl9mcmFtZSA9ICh1aW50MTZfdCkKLQkJKHRvdGFsX2xpbmVzX3Blcl9mcmFtZSAqIG10OWUwMTNfY3RybC0+ZnBzX2RpdmlkZXIvMHg0MDApOwotCX0KLQotCW10OWUwMTNfZ3JvdXBfaG9sZF9vbigpOwotCXJjID0gbXQ5ZTAxM19pMmNfd3JpdGVfd19zZW5zb3IoUkVHX0ZSQU1FX0xFTkdUSF9MSU5FUywKLQkJCQkJCQl0b3RhbF9saW5lc19wZXJfZnJhbWUpOwotCW10OWUwMTNfZ3JvdXBfaG9sZF9vZmYoKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OWUwMTNfd3JpdGVfZXhwX2dhaW4odWludDE2X3QgZ2FpbiwgdWludDMyX3QgbGluZSkKLXsKLQl1aW50MTZfdCBtYXhfbGVnYWxfZ2FpbiA9IDB4RTdGOwotCWludDMyX3QgcmMgPSAwOwotCWlmIChnYWluID4gbWF4X2xlZ2FsX2dhaW4pIHsKLQkJQ0RCRygiTWF4IGxlZ2FsIGdhaW4gTGluZTolZFxuIiwgX19MSU5FX18pOwotCQlnYWluID0gbWF4X2xlZ2FsX2dhaW47Ci0JfQotCi0JaWYgKG10OWUwMTNfY3RybC0+Y3Vycl9yZXMgIT0gRlVMTF9TSVpFKSB7Ci0JCW10OWUwMTNfY3RybC0+bXlfcmVnX2dhaW4gPSBnYWluOwotCQltdDllMDEzX2N0cmwtPm15X3JlZ19saW5lX2NvdW50ID0gKHVpbnQxNl90KSBsaW5lOwotCQlsaW5lID0gKHVpbnQzMl90KSAobGluZSAqIG10OWUwMTNfY3RybC0+ZnBzX2RpdmlkZXIgLwotCQkJCQkJICAgMHgwMDAwMDQwMCk7Ci0JfSBlbHNlIHsKLQkJbGluZSA9ICh1aW50MzJfdCkgKGxpbmUgKiBtdDllMDEzX2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIgLwotCQkJCQkJICAgMHgwMDAwMDQwMCk7Ci0JfQotCi0JZ2FpbiB8PSAweDEwMDA7Ci0KLQltdDllMDEzX2dyb3VwX2hvbGRfb24oKTsKLQlyYyA9IG10OWUwMTNfaTJjX3dyaXRlX3dfc2Vuc29yKFJFR19HTE9CQUxfR0FJTiwgZ2Fpbik7Ci0JcmMgPSBtdDllMDEzX2kyY193cml0ZV93X3NlbnNvcihSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUUsIGxpbmUpOwotCW10OWUwMTNfZ3JvdXBfaG9sZF9vZmYoKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OWUwMTNfc2V0X3BpY3RfZXhwX2dhaW4odWludDE2X3QgZ2FpbiwgdWludDMyX3QgbGluZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlyYyA9IG10OWUwMTNfd3JpdGVfZXhwX2dhaW4oZ2FpbiwgbGluZSk7Ci0JbXQ5ZTAxM19pMmNfd3JpdGVfd19zZW5zb3IoMHgzMDFBLCAweDA2NUN8MHgyKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLSNkZWZpbmUgRElWX0NFSUwoeCwgeSkgKHgveSArICh4JXkpID8gMSA6IDApCi0KLXN0YXRpYyBpbnQzMl90IG10OWUwMTNfbW92ZV9mb2N1cyhpbnQgZGlyZWN0aW9uLAotCWludDMyX3QgbnVtX3N0ZXBzKQotewotCWludDE2X3Qgc3RlcF9kaXJlY3Rpb24sIGRlc3RfbGVuc19wb3NpdGlvbiwgZGVzdF9zdGVwX3Bvc2l0aW9uOwotCWludDE2X3QgdGFyZ2V0X2Rpc3QsIHNtYWxsX3N0ZXAsIG5leHRfbGVuc19wb3NpdGlvbjsKLQlpZiAoZGlyZWN0aW9uID09IE1PVkVfTkVBUikKLQkJc3RlcF9kaXJlY3Rpb24gPSAxOwotCWVsc2UKLQkJc3RlcF9kaXJlY3Rpb24gPSAtMTsKLQotCWRlc3Rfc3RlcF9wb3NpdGlvbiA9IG10OWUwMTNfY3RybC0+Y3Vycl9zdGVwX3BvcwotCQkJCQkJKyAoc3RlcF9kaXJlY3Rpb24gKiBudW1fc3RlcHMpOwotCi0JaWYgKGRlc3Rfc3RlcF9wb3NpdGlvbiA8IDApCi0JCWRlc3Rfc3RlcF9wb3NpdGlvbiA9IDA7Ci0JZWxzZSBpZiAoZGVzdF9zdGVwX3Bvc2l0aW9uID4gTVQ5RTAxM19UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUikKLQkJZGVzdF9zdGVwX3Bvc2l0aW9uID0gTVQ5RTAxM19UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUjsKLQotCWlmIChkZXN0X3N0ZXBfcG9zaXRpb24gPT0gbXQ5ZTAxM19jdHJsLT5jdXJyX3N0ZXBfcG9zKQotCQlyZXR1cm4gMDsKLQotCWRlc3RfbGVuc19wb3NpdGlvbiA9IG10OWUwMTNfc3RlcF9wb3NpdGlvbl90YWJsZVtkZXN0X3N0ZXBfcG9zaXRpb25dOwotCXRhcmdldF9kaXN0ID0gc3RlcF9kaXJlY3Rpb24gKgotCQkoZGVzdF9sZW5zX3Bvc2l0aW9uIC0gbXQ5ZTAxM19jdHJsLT5jdXJyX2xlbnNfcG9zKTsKLQotCWlmIChzdGVwX2RpcmVjdGlvbiA8IDAgJiYgKHRhcmdldF9kaXN0ID49Ci0JCW10OWUwMTNfc3RlcF9wb3NpdGlvbl90YWJsZVttdDllMDEzX2RhbXBpbmdfdGhyZXNob2xkXSkpIHsKLQkJc21hbGxfc3RlcCA9IERJVl9DRUlMKHRhcmdldF9kaXN0LCAxMCk7Ci0JCW10OWUwMTNfc3dfZGFtcGluZ190aW1lX3dhaXQgPSAxMDsKLQl9IGVsc2UgewotCQlzbWFsbF9zdGVwID0gRElWX0NFSUwodGFyZ2V0X2Rpc3QsIDQpOwotCQltdDllMDEzX3N3X2RhbXBpbmdfdGltZV93YWl0ID0gNDsKLQl9Ci0KLQlmb3IgKG5leHRfbGVuc19wb3NpdGlvbiA9IG10OWUwMTNfY3RybC0+Y3Vycl9sZW5zX3BvcwotCQkrIChzdGVwX2RpcmVjdGlvbiAqIHNtYWxsX3N0ZXApOwotCQkoc3RlcF9kaXJlY3Rpb24gKiBuZXh0X2xlbnNfcG9zaXRpb24pIDw9Ci0JCShzdGVwX2RpcmVjdGlvbiAqIGRlc3RfbGVuc19wb3NpdGlvbik7Ci0JCW5leHRfbGVuc19wb3NpdGlvbiArPSAoc3RlcF9kaXJlY3Rpb24gKiBzbWFsbF9zdGVwKSkgewotCQltdDllMDEzX2kyY193cml0ZV93X3NlbnNvcihSRUdfVkNNX05FV19DT0RFLAotCQluZXh0X2xlbnNfcG9zaXRpb24pOwotCQltdDllMDEzX2N0cmwtPmN1cnJfbGVuc19wb3MgPSBuZXh0X2xlbnNfcG9zaXRpb247Ci0JCXVzbGVlcChtdDllMDEzX3N3X2RhbXBpbmdfdGltZV93YWl0KjUwKTsKLQl9Ci0KLQlpZiAobXQ5ZTAxM19jdHJsLT5jdXJyX2xlbnNfcG9zICE9IGRlc3RfbGVuc19wb3NpdGlvbikgewotCQltdDllMDEzX2kyY193cml0ZV93X3NlbnNvcihSRUdfVkNNX05FV19DT0RFLAotCQlkZXN0X2xlbnNfcG9zaXRpb24pOwotCQl1c2xlZXAobXQ5ZTAxM19zd19kYW1waW5nX3RpbWVfd2FpdCo1MCk7Ci0JfQotCW10OWUwMTNfY3RybC0+Y3Vycl9sZW5zX3BvcyA9IGRlc3RfbGVuc19wb3NpdGlvbjsKLQltdDllMDEzX2N0cmwtPmN1cnJfc3RlcF9wb3MgPSBkZXN0X3N0ZXBfcG9zaXRpb247Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OWUwMTNfc2V0X2RlZmF1bHRfZm9jdXModWludDhfdCBhZl9zdGVwKQotewotCWludDMyX3QgcmMgPSAwOwotCWlmIChtdDllMDEzX2N0cmwtPmN1cnJfc3RlcF9wb3MgIT0gMCkgewotCQlyYyA9IG10OWUwMTNfbW92ZV9mb2N1cyhNT1ZFX0ZBUiwKLQkJbXQ5ZTAxM19jdHJsLT5jdXJyX3N0ZXBfcG9zKTsKLQl9IGVsc2UgewotCQltdDllMDEzX2kyY193cml0ZV93X3NlbnNvcihSRUdfVkNNX05FV19DT0RFLCAweDAwKTsKLQl9Ci0KLQltdDllMDEzX2N0cmwtPmN1cnJfbGVuc19wb3MgPSAwOwotCW10OWUwMTNfY3RybC0+Y3Vycl9zdGVwX3BvcyA9IDA7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIG10OWUwMTNfaW5pdF9mb2N1cyh2b2lkKQotewotCXVpbnQ4X3QgaTsKLQltdDllMDEzX3N0ZXBfcG9zaXRpb25fdGFibGVbMF0gPSAwOwotCWZvciAoaSA9IDE7IGkgPD0gTVQ5RTAxM19UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUjsgaSsrKSB7Ci0JCWlmIChpIDw9IG10OWUwMTNfbmxfcmVnaW9uX2JvdW5kYXJ5MSkgewotCQkJbXQ5ZTAxM19zdGVwX3Bvc2l0aW9uX3RhYmxlW2ldID0KLQkJCQltdDllMDEzX3N0ZXBfcG9zaXRpb25fdGFibGVbaS0xXQotCQkJCSsgbXQ5ZTAxM19ubF9yZWdpb25fY29kZV9wZXJfc3RlcDE7Ci0JCX0gZWxzZSB7Ci0JCQltdDllMDEzX3N0ZXBfcG9zaXRpb25fdGFibGVbaV0gPQotCQkJCW10OWUwMTNfc3RlcF9wb3NpdGlvbl90YWJsZVtpLTFdCi0JCQkJKyBtdDllMDEzX2xfcmVnaW9uX2NvZGVfcGVyX3N0ZXA7Ci0JCX0KLQotCQlpZiAobXQ5ZTAxM19zdGVwX3Bvc2l0aW9uX3RhYmxlW2ldID4gMjU1KQotCQkJbXQ5ZTAxM19zdGVwX3Bvc2l0aW9uX3RhYmxlW2ldID0gMjU1OwotCX0KLX0KLQotc3RhdGljIGludDMyX3QgbXQ5ZTAxM190ZXN0KGVudW0gbXQ5ZTAxM190ZXN0X21vZGVfdCBtbykKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlpZiAobW8gPT0gVEVTVF9PRkYpCi0JCXJldHVybiByYzsKLQllbHNlIHsKLQkJLyogUkVHXzB4MzBEOFs0XSBpcyBURVNCWVBFTjogMDogTm9ybWFsIE9wZXJhdGlvbiwKLQkJMTogQnlwYXNzIFNpZ25hbCBQcm9jZXNzaW5nCi0JCVJFR18weDMwRDhbNV0gaXMgRUJETUFTSzogMDoKLQkJT3V0cHV0IEVtYmVkZGVkIGRhdGEsIDE6IE5vIG91dHB1dCBlbWJlZGRlZCBkYXRhICovCi0JCWlmIChtdDllMDEzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfVEVTVF9QQVRURVJOX01PREUsCi0JCQkodWludDhfdCkgbW8pIDwgMCkgewotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5ZTAxM19zZW5zb3Jfc2V0dGluZyhpbnQgdXBkYXRlX3R5cGUsIGludCBydCkKLXsKLQotCWludDMyX3QgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX2NzaV9wYXJhbXMgbXQ5ZTAxM19jc2lfcGFyYW1zOwotCXVpbnQ4X3Qgc3RvcmVkX2FmX3N0ZXAgPSAwOwotCUNEQkcoInNlbnNvcl9zZXR0aW5nc1xuIik7Ci0Jc3RvcmVkX2FmX3N0ZXAgPSBtdDllMDEzX2N0cmwtPmN1cnJfc3RlcF9wb3M7Ci0JbXQ5ZTAxM19zZXRfZGVmYXVsdF9mb2N1cygwKTsKLQltdDllMDEzX3N0b3Bfc3RyZWFtKCk7Ci0JbXNsZWVwKDE1KTsKLQlpZiAodXBkYXRlX3R5cGUgPT0gUkVHX0lOSVQpIHsKLQkJbXQ5ZTAxM19pMmNfd3JpdGVfd190YWJsZShtdDllMDEzX3JlZ3MucmVnX21pcGksCi0JCQltdDllMDEzX3JlZ3MucmVnX21pcGlfc2l6ZSk7Ci0JCW10OWUwMTNfaTJjX3dyaXRlX3dfdGFibGUobXQ5ZTAxM19yZWdzLnJlY19zZXR0aW5ncywKLQkJCW10OWUwMTNfcmVncy5yZWNfc2l6ZSk7Ci0JCWNhbV9kZWJ1Z19pbml0KCk7Ci0JCUNTSV9DT05GSUcgPSAwOwotCX0gZWxzZSBpZiAodXBkYXRlX3R5cGUgPT0gVVBEQVRFX1BFUklPRElDKSB7Ci0JCWlmIChydCA9PSBRVFJfU0laRSkgewotCQkJbXQ5ZTAxM19pMmNfd3JpdGVfd190YWJsZShtdDllMDEzX3JlZ3MucmVnX3BsbCwKLQkJCQltdDllMDEzX3JlZ3MucmVnX3BsbF9zaXplKTsKLQkJCW10OWUwMTNfaTJjX3dyaXRlX3dfdGFibGUobXQ5ZTAxM19yZWdzLnJlZ19wcmV2LAotCQkJCW10OWUwMTNfcmVncy5yZWdfcHJldl9zaXplKTsKLQkJfSBlbHNlIGlmIChydCA9PSBGVUxMX1NJWkUpIHsKLQkJCW10OWUwMTNfaTJjX3dyaXRlX3dfdGFibGUobXQ5ZTAxM19yZWdzLnJlZ19wbGwsCi0JCQkJbXQ5ZTAxM19yZWdzLnJlZ19wbGxfc2l6ZSk7Ci0JCQltdDllMDEzX2kyY193cml0ZV93X3RhYmxlKG10OWUwMTNfcmVncy5yZWdfc25hcCwKLQkJCQltdDllMDEzX3JlZ3MucmVnX3NuYXBfc2l6ZSk7Ci0JCX0gZWxzZSBpZiAocnQgPT0gSEZSXzYwRlBTKSB7Ci0JCQltdDllMDEzX2kyY193cml0ZV93X3RhYmxlKG10OWUwMTNfcmVncy5yZWdfcGxsXzEyMGZwcywKLQkJCQltdDllMDEzX3JlZ3MucmVnX3BsbF8xMjBmcHNfc2l6ZSk7Ci0JCQltdDllMDEzX2kyY193cml0ZV93X3NlbnNvcigweDAzMDYsIDB4MDAyOSk7Ci0JCQltdDllMDEzX2kyY193cml0ZV93X3RhYmxlKG10OWUwMTNfcmVncy5yZWdfMTIwZnBzLAotCQkJCW10OWUwMTNfcmVncy5yZWdfMTIwZnBzX3NpemUpOwotCQl9IGVsc2UgaWYgKHJ0ID09IEhGUl85MEZQUykgewotCQkJbXQ5ZTAxM19pMmNfd3JpdGVfd190YWJsZShtdDllMDEzX3JlZ3MucmVnX3BsbF8xMjBmcHMsCi0JCQkJbXQ5ZTAxM19yZWdzLnJlZ19wbGxfMTIwZnBzX3NpemUpOwotCQkJbXQ5ZTAxM19pMmNfd3JpdGVfd19zZW5zb3IoMHgwMzA2LCAweDAwM0QpOwotCQkJbXQ5ZTAxM19pMmNfd3JpdGVfd190YWJsZShtdDllMDEzX3JlZ3MucmVnXzEyMGZwcywKLQkJCQltdDllMDEzX3JlZ3MucmVnXzEyMGZwc19zaXplKTsKLQkJfSBlbHNlIGlmIChydCA9PSBIRlJfMTIwRlBTKSB7Ci0JCQltc21fY2FtaW9fdmZlX2Nsa19yYXRlX3NldCgyNjY2NjcwMDApOwotCQkJbXQ5ZTAxM19pMmNfd3JpdGVfd190YWJsZShtdDllMDEzX3JlZ3MucmVnX3BsbF8xMjBmcHMsCi0JCQkJbXQ5ZTAxM19yZWdzLnJlZ19wbGxfMTIwZnBzX3NpemUpOwotCQkJbXQ5ZTAxM19pMmNfd3JpdGVfd190YWJsZShtdDllMDEzX3JlZ3MucmVnXzEyMGZwcywKLQkJCQltdDllMDEzX3JlZ3MucmVnXzEyMGZwc19zaXplKTsKLQkJfQotCQlpZiAoIUNTSV9DT05GSUcpIHsKLQkJCW1zbV9jYW1pb192ZmVfY2xrX3JhdGVfc2V0KDE5MjAwMDAwMCk7Ci0JCQltdDllMDEzX2NzaV9wYXJhbXMuZGF0YV9mb3JtYXQgPSBDU0lfMTBCSVQ7Ci0JCQltdDllMDEzX2NzaV9wYXJhbXMubGFuZV9jbnQgPSAyOwotCQkJbXQ5ZTAxM19jc2lfcGFyYW1zLmxhbmVfYXNzaWduID0gMHhlNDsKLQkJCW10OWUwMTNfY3NpX3BhcmFtcy5kcGNtX3NjaGVtZSA9IDA7Ci0JCQltdDllMDEzX2NzaV9wYXJhbXMuc2V0dGxlX2NudCA9IDB4MTg7Ci0JCQlyYyA9IG1zbV9jYW1pb19jc2lfY29uZmlnKCZtdDllMDEzX2NzaV9wYXJhbXMpOwotCQkJbXNsZWVwKDEwKTsKLQkJCUNTSV9DT05GSUcgPSAxOwotCQl9Ci0JCW10OWUwMTNfbW92ZV9mb2N1cyhNT1ZFX05FQVIsIHN0b3JlZF9hZl9zdGVwKTsKLQkJbXQ5ZTAxM19zdGFydF9zdHJlYW0oKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDllMDEzX3ZpZGVvX2NvbmZpZyhpbnQgbW9kZSkKLXsKLQotCWludDMyX3QgcmMgPSAwOwotCi0JQ0RCRygidmlkZW8gY29uZmlnXG4iKTsKLQkvKiBjaGFuZ2Ugc2Vuc29yIHJlc29sdXRpb24gaWYgbmVlZGVkICovCi0JaWYgKG10OWUwMTNfc2Vuc29yX3NldHRpbmcoVVBEQVRFX1BFUklPRElDLAotCQkJbXQ5ZTAxM19jdHJsLT5wcmV2X3JlcykgPCAwKQotCQlyZXR1cm4gcmM7Ci0JaWYgKG10OWUwMTNfY3RybC0+c2V0X3Rlc3QpIHsKLQkJaWYgKG10OWUwMTNfdGVzdChtdDllMDEzX2N0cmwtPnNldF90ZXN0KSA8IDApCi0JCQlyZXR1cm4gIHJjOwotCX0KLQotCW10OWUwMTNfY3RybC0+Y3Vycl9yZXMgPSBtdDllMDEzX2N0cmwtPnByZXZfcmVzOwotCW10OWUwMTNfY3RybC0+c2Vuc29ybW9kZSA9IG1vZGU7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDllMDEzX3NuYXBzaG90X2NvbmZpZyhpbnQgbW9kZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQkvKmNoYW5nZSBzZW5zb3IgcmVzb2x1dGlvbiBpZiBuZWVkZWQgKi8KLQlpZiAobXQ5ZTAxM19jdHJsLT5jdXJyX3JlcyAhPSBtdDllMDEzX2N0cmwtPnBpY3RfcmVzKSB7Ci0JCWlmIChtdDllMDEzX3NlbnNvcl9zZXR0aW5nKFVQREFURV9QRVJJT0RJQywKLQkJCQltdDllMDEzX2N0cmwtPnBpY3RfcmVzKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0JbXQ5ZTAxM19jdHJsLT5jdXJyX3JlcyA9IG10OWUwMTNfY3RybC0+cGljdF9yZXM7Ci0JbXQ5ZTAxM19jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19IC8qZW5kIG9mIG10OWUwMTNfc25hcHNob3RfY29uZmlnKi8KLQotc3RhdGljIGludDMyX3QgbXQ5ZTAxM19yYXdfc25hcHNob3RfY29uZmlnKGludCBtb2RlKQotewotCWludDMyX3QgcmMgPSAwOwotCS8qIGNoYW5nZSBzZW5zb3IgcmVzb2x1dGlvbiBpZiBuZWVkZWQgKi8KLQlpZiAobXQ5ZTAxM19jdHJsLT5jdXJyX3JlcyAhPSBtdDllMDEzX2N0cmwtPnBpY3RfcmVzKSB7Ci0JCWlmIChtdDllMDEzX3NlbnNvcl9zZXR0aW5nKFVQREFURV9QRVJJT0RJQywKLQkJCQltdDllMDEzX2N0cmwtPnBpY3RfcmVzKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0JbXQ5ZTAxM19jdHJsLT5jdXJyX3JlcyA9IG10OWUwMTNfY3RybC0+cGljdF9yZXM7Ci0JbXQ5ZTAxM19jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19IC8qZW5kIG9mIG10OWUwMTNfcmF3X3NuYXBzaG90X2NvbmZpZyovCi0KLXN0YXRpYyBpbnQzMl90IG10OWUwMTNfc2V0X3NlbnNvcl9tb2RlKGludCBtb2RlLAotCWludCByZXMpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBTRU5TT1JfUFJFVklFV19NT0RFOgotCWNhc2UgU0VOU09SX0hGUl82MEZQU19NT0RFOgotCWNhc2UgU0VOU09SX0hGUl85MEZQU19NT0RFOgotCWNhc2UgU0VOU09SX0hGUl8xMjBGUFNfTU9ERToKLQkJbXQ5ZTAxM19jdHJsLT5wcmV2X3JlcyA9IHJlczsKLQkJcmMgPSBtdDllMDEzX3ZpZGVvX2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfU05BUFNIT1RfTU9ERToKLQkJbXQ5ZTAxM19jdHJsLT5waWN0X3JlcyA9IHJlczsKLQkJcmMgPSBtdDllMDEzX3NuYXBzaG90X2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfUkFXX1NOQVBTSE9UX01PREU6Ci0JCW10OWUwMTNfY3RybC0+cGljdF9yZXMgPSByZXM7Ci0JCXJjID0gbXQ5ZTAxM19yYXdfc25hcHNob3RfY29uZmlnKG1vZGUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OWUwMTNfcG93ZXJfZG93bih2b2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG10OWUwMTNfcHJvYmVfaW5pdF9kb25lKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCUNEQkcoInByb2JlIGRvbmVcbiIpOwotCWdwaW9fZnJlZShkYXRhLT5zZW5zb3JfcmVzZXQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG10OWUwMTNfcHJvYmVfaW5pdF9zZW5zb3IoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JdWludDE2X3QgY2hpcGlkID0gMDsKLQlDREJHKCIlczogJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmMgPSBncGlvX3JlcXVlc3QoZGF0YS0+c2Vuc29yX3Jlc2V0LCAibXQ5ZTAxMyIpOwotCUNEQkcoIiBtdDllMDEzX3Byb2JlX2luaXRfc2Vuc29yXG4iKTsKLQlpZiAoIXJjKSB7Ci0JCUNEQkcoInNlbnNvcl9yZXNldCA9ICVkXG4iLCByYyk7Ci0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCQltc2xlZXAoMTApOwotCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChkYXRhLT5zZW5zb3JfcmVzZXQsIDEpOwotCQltc2xlZXAoMTApOwotCX0gZWxzZSB7Ci0JCWdvdG8gaW5pdF9wcm9iZV9kb25lOwotCX0KLQotCUNEQkcoIiBtdDllMDEzX3Byb2JlX2luaXRfc2Vuc29yIGlzIGNhbGxlZFxuIik7Ci0JcmMgPSBtdDllMDEzX2kyY19yZWFkKDB4MDAwMCwgJmNoaXBpZCwgMik7Ci0JQ0RCRygiSUQ6ICVkXG4iLCBjaGlwaWQpOwotCS8qIDQuIENvbXBhcmUgc2Vuc29yIElEIHRvIE1UOUUwMTMgSUQ6ICovCi0JaWYgKGNoaXBpZCAhPSAweDRCMDApIHsKLQkJcmMgPSAtRU5PREVWOwotCQlDREJHKCJtdDllMDEzX3Byb2JlX2luaXRfc2Vuc29yIGZhaWwgY2hpcCBpZCBkb2Vzbm90IG1hdGNoXG4iKTsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCi0JbXQ5ZTAxM19jdHJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG10OWUwMTNfY3RybF90KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtdDllMDEzX2N0cmwpIHsKLQkJQ0RCRygibXQ5ZTAxM19pbml0IGZhaWxlZCFcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JfQotCW10OWUwMTNfY3RybC0+ZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQltdDllMDEzX2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQltdDllMDEzX2N0cmwtPnNldF90ZXN0ID0gVEVTVF9PRkY7Ci0JbXQ5ZTAxM19jdHJsLT5wcmV2X3JlcyA9IFFUUl9TSVpFOwotCW10OWUwMTNfY3RybC0+cGljdF9yZXMgPSBGVUxMX1NJWkU7Ci0KLQlpZiAoZGF0YSkKLQkJbXQ5ZTAxM19jdHJsLT5zZW5zb3JkYXRhID0gZGF0YTsKLQotCWdvdG8gaW5pdF9wcm9iZV9kb25lOwotaW5pdF9wcm9iZV9mYWlsOgotCUNEQkcoIiBtdDllMDEzX3Byb2JlX2luaXRfc2Vuc29yIGZhaWxzXG4iKTsKLQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCW10OWUwMTNfcHJvYmVfaW5pdF9kb25lKGRhdGEpOwotaW5pdF9wcm9iZV9kb25lOgotCUNEQkcoIiBtdDllMDEzX3Byb2JlX2luaXRfc2Vuc29yIGZpbmlzaGVzXG4iKTsKLQlyZXR1cm4gcmM7Ci19Ci0vKiBjYW1zZW5zb3JfbXQ5ZTAxM19yZXNldCAqLwotCi1pbnQgbXQ5ZTAxM19zZW5zb3Jfb3Blbl9pbml0KGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JQ0RCRygiJXM6ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCUNEQkcoIkNhbGxpbmcgbXQ5ZTAxM19zZW5zb3Jfb3Blbl9pbml0XG4iKTsKLQotCW10OWUwMTNfY3RybCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtdDllMDEzX2N0cmxfdCksIEdGUF9LRVJORUwpOwotCWlmICghbXQ5ZTAxM19jdHJsKSB7Ci0JCUNEQkcoIm10OWUwMTNfaW5pdCBmYWlsZWQhXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGluaXRfZG9uZTsKLQl9Ci0JbXQ5ZTAxM19jdHJsLT5mcHNfZGl2aWRlciA9IDEgKiAweDAwMDAwNDAwOwotCW10OWUwMTNfY3RybC0+cGljdF9mcHNfZGl2aWRlciA9IDEgKiAweDAwMDAwNDAwOwotCW10OWUwMTNfY3RybC0+c2V0X3Rlc3QgPSBURVNUX09GRjsKLQltdDllMDEzX2N0cmwtPnByZXZfcmVzID0gUVRSX1NJWkU7Ci0JbXQ5ZTAxM19jdHJsLT5waWN0X3JlcyA9IEZVTExfU0laRTsKLQotCWlmIChkYXRhKQotCQltdDllMDEzX2N0cmwtPnNlbnNvcmRhdGEgPSBkYXRhOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiQ2FsbGluZyBtdDllMDEzX3NlbnNvcl9vcGVuX2luaXQgZmFpbDFcbiIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCUNEQkcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkvKiBlbmFibGUgbWNsayBmaXJzdCAqLwotCW1zbV9jYW1pb19jbGtfcmF0ZV9zZXQoTVQ5RTAxM19NQVNURVJfQ0xLX1JBVEUpOwotCXJjID0gbXQ5ZTAxM19wcm9iZV9pbml0X3NlbnNvcihkYXRhKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGluaXRfZmFpbDsKLQotCUNEQkcoImluaXQgc2V0dGluZ3NcbiIpOwotCXJjID0gbXQ5ZTAxM19zZW5zb3Jfc2V0dGluZyhSRUdfSU5JVCwgbXQ5ZTAxM19jdHJsLT5wcmV2X3Jlcyk7Ci0JbXQ5ZTAxM19jdHJsLT5mcHMgPSAzMCpRODsKLQltdDllMDEzX2luaXRfZm9jdXMoKTsKLQlpZiAocmMgPCAwKSB7Ci0JCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JCWdvdG8gaW5pdF9mYWlsOwotCX0gZWxzZQotCQlnb3RvIGluaXRfZG9uZTsKLWluaXRfZmFpbDoKLQlDREJHKCJpbml0X2ZhaWxcbiIpOwotCW10OWUwMTNfcHJvYmVfaW5pdF9kb25lKGRhdGEpOwotaW5pdF9kb25lOgotCUNEQkcoImluaXRfZG9uZVxuIik7Ci0JcmV0dXJuIHJjOwotfSAvKmVuZG9mIG10OWUwMTNfc2Vuc29yX29wZW5faW5pdCovCi0KLXN0YXRpYyBpbnQgbXQ5ZTAxM19pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCS8qIEluaXRpYWxpemUgdGhlIE1TTV9DQU1JMkMgQ2hpcCAqLwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm10OWUwMTNfd2FpdF9xdWV1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtdDllMDEzX2kyY19pZFtdID0gewotCXsibXQ5ZTAxMyIsIDB9LAotCXsgfQotfTsKLQotc3RhdGljIGludCBtdDllMDEzX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQgcmMgPSAwOwotCUNEQkcoIm10OWUwMTNfcHJvYmUgY2FsbGVkIVxuIik7Ci0KLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgewotCQlDREJHKCJpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eSBmYWlsZWRcbiIpOwotCQlnb3RvIHByb2JlX2ZhaWx1cmU7Ci0JfQotCi0JbXQ5ZTAxM19zZW5zb3J3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG10OWUwMTNfd29ya190KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtdDllMDEzX3NlbnNvcncpIHsKLQkJQ0RCRygia3phbGxvYyBmYWlsZWQuXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIHByb2JlX2ZhaWx1cmU7Ci0JfQotCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgbXQ5ZTAxM19zZW5zb3J3KTsKLQltdDllMDEzX2luaXRfY2xpZW50KGNsaWVudCk7Ci0JbXQ5ZTAxM19jbGllbnQgPSBjbGllbnQ7Ci0KLQotCUNEQkcoIm10OWUwMTNfcHJvYmUgc3VjY2Vzc2VkISByYyA9ICVkXG4iLCByYyk7Ci0JcmV0dXJuIDA7Ci0KLXByb2JlX2ZhaWx1cmU6Ci0JQ0RCRygibXQ5ZTAxM19wcm9iZSBmYWlsZWQhIHJjID0gJWRcbiIsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXQ5ZTAxM19zZW5kX3diX2luZm8oc3RydWN0IHdiX2luZm9fY2ZnICp3YikKLXsKLQlyZXR1cm4gMDsKLQotfSAvKmVuZCBvZiBtdDllMDEzX3NuYXBzaG90X2NvbmZpZyovCi0KLXN0YXRpYyBpbnQgX19leGl0IG10OWUwMTNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IG10OWUwMTNfd29ya190X3QgKnNlbnNvcncgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlmcmVlX2lycShjbGllbnQtPmlycSwgc2Vuc29ydyk7Ci0JbXQ5ZTAxM19jbGllbnQgPSBOVUxMOwotCWtmcmVlKHNlbnNvcncpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbXQ5ZTAxM19pMmNfZHJpdmVyID0gewotCS5pZF90YWJsZSA9IG10OWUwMTNfaTJjX2lkLAotCS5wcm9iZSAgPSBtdDllMDEzX2kyY19wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3AobXQ5ZTAxM19pMmNfcmVtb3ZlKSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtdDllMDEzIiwKLQl9LAotfTsKLQotaW50IG10OWUwMTNfc2Vuc29yX2NvbmZpZyh2b2lkIF9fdXNlciAqYXJncCkKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhIGNkYXRhOwotCWxvbmcgICByYyA9IDA7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZjZGF0YSwKLQkJKHZvaWQgKilhcmdwLAotCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQltdXRleF9sb2NrKCZtdDllMDEzX211dCk7Ci0JQ0RCRygibXQ5ZTAxM19zZW5zb3JfY29uZmlnOiBjZmd0eXBlID0gJWRcbiIsCi0JY2RhdGEuY2ZndHlwZSk7Ci0JCXN3aXRjaCAoY2RhdGEuY2ZndHlwZSkgewotCQljYXNlIENGR19HRVRfUElDVF9GUFM6Ci0JCQltdDllMDEzX2dldF9waWN0X2ZwcygKLQkJCQljZGF0YS5jZmcuZ2Zwcy5wcmV2ZnBzLAotCQkJCSYoY2RhdGEuY2ZnLmdmcHMucGljdGZwcykpOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19HRVRfUFJFVl9MX1BGOgotCQkJY2RhdGEuY2ZnLnByZXZsX3BmID0KLQkJCW10OWUwMTNfZ2V0X3ByZXZfbGluZXNfcGYoKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfR0VUX1BSRVZfUF9QTDoKLQkJCWNkYXRhLmNmZy5wcmV2cF9wbCA9Ci0JCQkJbXQ5ZTAxM19nZXRfcHJldl9waXhlbHNfcGwoKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfR0VUX1BJQ1RfTF9QRjoKLQkJCWNkYXRhLmNmZy5waWN0bF9wZiA9Ci0JCQkJbXQ5ZTAxM19nZXRfcGljdF9saW5lc19wZigpOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19HRVRfUElDVF9QX1BMOgotCQkJY2RhdGEuY2ZnLnBpY3RwX3BsID0KLQkJCQltdDllMDEzX2dldF9waWN0X3BpeGVsc19wbCgpOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19HRVRfUElDVF9NQVhfRVhQX0xDOgotCQkJY2RhdGEuY2ZnLnBpY3RfbWF4X2V4cF9sYyA9Ci0JCQkJbXQ5ZTAxM19nZXRfcGljdF9tYXhfZXhwX2xjKCk7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSZjZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0ZHX1NFVF9GUFM6Ci0JCWNhc2UgQ0ZHX1NFVF9QSUNUX0ZQUzoKLQkJCXJjID0gbXQ5ZTAxM19zZXRfZnBzKCYoY2RhdGEuY2ZnLmZwcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfU0VUX0VYUF9HQUlOOgotCQkJcmMgPQotCQkJCW10OWUwMTNfd3JpdGVfZXhwX2dhaW4oCi0JCQkJCWNkYXRhLmNmZy5leHBfZ2Fpbi5nYWluLAotCQkJCQljZGF0YS5jZmcuZXhwX2dhaW4ubGluZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19TRVRfUElDVF9FWFBfR0FJTjoKLQkJCXJjID0KLQkJCQltdDllMDEzX3NldF9waWN0X2V4cF9nYWluKAotCQkJCWNkYXRhLmNmZy5leHBfZ2Fpbi5nYWluLAotCQkJCWNkYXRhLmNmZy5leHBfZ2Fpbi5saW5lKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0ZHX1NFVF9NT0RFOgotCQkJcmMgPSBtdDllMDEzX3NldF9zZW5zb3JfbW9kZShjZGF0YS5tb2RlLAotCQkJCQljZGF0YS5ycyk7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19QV1JfRE9XTjoKLQkJCXJjID0gbXQ5ZTAxM19wb3dlcl9kb3duKCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19NT1ZFX0ZPQ1VTOgotCQkJcmMgPQotCQkJCW10OWUwMTNfbW92ZV9mb2N1cygKLQkJCQljZGF0YS5jZmcuZm9jdXMuZGlyLAotCQkJCWNkYXRhLmNmZy5mb2N1cy5zdGVwcyk7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19TRVRfREVGQVVMVF9GT0NVUzoKLQkJCXJjID0KLQkJCQltdDllMDEzX3NldF9kZWZhdWx0X2ZvY3VzKAotCQkJCWNkYXRhLmNmZy5mb2N1cy5zdGVwcyk7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19HRVRfQUZfTUFYX1NURVBTOgotCQkJY2RhdGEubWF4X3N0ZXBzID0gTVQ5RTAxM19UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUjsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSZjZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0ZHX1NFVF9FRkZFQ1Q6Ci0JCQlyYyA9IG10OWUwMTNfc2V0X2RlZmF1bHRfZm9jdXMoCi0JCQkJY2RhdGEuY2ZnLmVmZmVjdCk7Ci0JCQlicmVhazsKLQotCi0JCWNhc2UgQ0ZHX1NFTkRfV0JfSU5GTzoKLQkJCXJjID0gbXQ5ZTAxM19zZW5kX3diX2luZm8oCi0JCQkJJihjZGF0YS5jZmcud2JfaW5mbykpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQltdXRleF91bmxvY2soJm10OWUwMTNfbXV0KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtdDllMDEzX3NlbnNvcl9yZWxlYXNlKHZvaWQpCi17Ci0JaW50IHJjID0gLUVCQURGOwotCW11dGV4X2xvY2soJm10OWUwMTNfbXV0KTsKLQltdDllMDEzX3Bvd2VyX2Rvd24oKTsKLQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChtdDllMDEzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JbXNsZWVwKDUpOwotCWdwaW9fZnJlZShtdDllMDEzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9yZXNldCk7Ci0Ja2ZyZWUobXQ5ZTAxM19jdHJsKTsKLQltdDllMDEzX2N0cmwgPSBOVUxMOwotCUNEQkcoIm10OWUwMTNfcmVsZWFzZSBjb21wbGV0ZWRcbiIpOwotCW11dGV4X3VubG9jaygmbXQ5ZTAxM19tdXQpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG10OWUwMTNfc2Vuc29yX3Byb2JlKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICppbmZvLAotCQlzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsICpzKQotewotCWludCByYyA9IDA7Ci0JcmMgPSBpMmNfYWRkX2RyaXZlcigmbXQ5ZTAxM19pMmNfZHJpdmVyKTsKLQlpZiAocmMgPCAwIHx8IG10OWUwMTNfY2xpZW50ID09IE5VTEwpIHsKLQkJcmMgPSAtRU5PVFNVUFA7Ci0JCUNEQkcoIkkyQyBhZGQgZHJpdmVyIGZhaWxlZCIpOwotCQlnb3RvIHByb2JlX2ZhaWw7Ci0JfQotCW1zbV9jYW1pb19jbGtfcmF0ZV9zZXQoTVQ5RTAxM19NQVNURVJfQ0xLX1JBVEUpOwotCXJjID0gbXQ5ZTAxM19wcm9iZV9pbml0X3NlbnNvcihpbmZvKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIHByb2JlX2ZhaWw7Ci0Jcy0+c19pbml0ID0gbXQ5ZTAxM19zZW5zb3Jfb3Blbl9pbml0OwotCXMtPnNfcmVsZWFzZSA9IG10OWUwMTNfc2Vuc29yX3JlbGVhc2U7Ci0Jcy0+c19jb25maWcgID0gbXQ5ZTAxM19zZW5zb3JfY29uZmlnOwotCXMtPnNfbW91bnRfYW5nbGUgPSBpbmZvLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+bW91bnRfYW5nbGU7Ci0JZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoaW5mby0+c2Vuc29yX3Jlc2V0LCAwKTsKLQltdDllMDEzX3Byb2JlX2luaXRfZG9uZShpbmZvKTsKLQlyZXR1cm4gcmM7Ci0KLXByb2JlX2ZhaWw6Ci0JQ0RCRygibXQ5ZTAxM19zZW5zb3JfcHJvYmU6IFNFTlNPUiBQUk9CRSBGQUlMUyFcbiIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX210OWUwMTNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gbXNtX2NhbWVyYV9kcnZfc3RhcnQocGRldiwgbXQ5ZTAxM19zZW5zb3JfcHJvYmUpOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fY2FtZXJhX2RyaXZlciA9IHsKLQkucHJvYmUgPSBfX210OWUwMTNfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtX2NhbWVyYV9tdDllMDEzIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG10OWUwMTNfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9jYW1lcmFfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQobXQ5ZTAxM19pbml0KTsKLXZvaWQgbXQ5ZTAxM19leGl0KHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJm10OWUwMTNfaTJjX2RyaXZlcik7Ci19Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkFwdGluYSA4IE1QIEJheWVyIHNlbnNvciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLQotc3RhdGljIGJvb2wgc3RyZWFtaW5nID0gMTsKLQotc3RhdGljIGludCBtdDllMDEzX2ZvY3VzX3Rlc3Qodm9pZCAqZGF0YSwgdTY0ICp2YWwpCi17Ci0JaW50IGkgPSAwOwotCW10OWUwMTNfc2V0X2RlZmF1bHRfZm9jdXMoMCk7Ci0KLQlmb3IgKGkgPSA5MDsgaSA8IDI1NjsgaSsrKSB7Ci0JCW10OWUwMTNfaTJjX3dyaXRlX3dfc2Vuc29yKFJFR19WQ01fTkVXX0NPREUsIGkpOwotCQltc2xlZXAoNTAwMCk7Ci0JfQotCW1zbGVlcCg1MDAwKTsKLQlmb3IgKGkgPSAyNTU7IGkgPiA5MDsgaS0tKSB7Ci0JCW10OWUwMTNfaTJjX3dyaXRlX3dfc2Vuc29yKFJFR19WQ01fTkVXX0NPREUsIGkpOwotCQltc2xlZXAoNTAwMCk7Ci0JfQotCXJldHVybiAwOwotfQotCi1ERUZJTkVfU0lNUExFX0FUVFJJQlVURShjYW1fZm9jdXMsIG10OWUwMTNfZm9jdXNfdGVzdCwKLQkJCU5VTEwsICIlbGxkXG4iKTsKLQotc3RhdGljIGludCBtdDllMDEzX3N0ZXBfdGVzdCh2b2lkICpkYXRhLCB1NjQgKnZhbCkKLXsKLQlpbnQgaSA9IDA7Ci0JbXQ5ZTAxM19zZXRfZGVmYXVsdF9mb2N1cygwKTsKLQotCWZvciAoaSA9IDA7IGkgPCBNVDlFMDEzX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSOyBpKyspIHsKLQkJbXQ5ZTAxM19tb3ZlX2ZvY3VzKE1PVkVfTkVBUiwgMSk7Ci0JCW1zbGVlcCg1MDAwKTsKLQl9Ci0KLQltdDllMDEzX21vdmVfZm9jdXMoTU9WRV9GQVIsIE1UOUUwMTNfVE9UQUxfU1RFUFNfTkVBUl9UT19GQVIpOwotCW1zbGVlcCg1MDAwKTsKLQlyZXR1cm4gMDsKLX0KLQotREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoY2FtX3N0ZXAsIG10OWUwMTNfc3RlcF90ZXN0LAotCQkJTlVMTCwgIiVsbGRcbiIpOwotCi1zdGF0aWMgaW50IGNhbV9kZWJ1Z19zdHJlYW1fc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmICh2YWwpIHsKLQkJbXQ5ZTAxM19zdGFydF9zdHJlYW0oKTsKLQkJc3RyZWFtaW5nID0gMTsKLQl9IGVsc2UgewotCQltdDllMDEzX3N0b3Bfc3RyZWFtKCk7Ci0JCXN0cmVhbWluZyA9IDA7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGNhbV9kZWJ1Z19zdHJlYW1fZ2V0KHZvaWQgKmRhdGEsIHU2NCAqdmFsKQotewotCSp2YWwgPSBzdHJlYW1pbmc7Ci0JcmV0dXJuIDA7Ci19Ci1ERUZJTkVfU0lNUExFX0FUVFJJQlVURShjYW1fc3RyZWFtLCBjYW1fZGVidWdfc3RyZWFtX2dldCwKLQkJCWNhbV9kZWJ1Z19zdHJlYW1fc2V0LCAiJWxsdVxuIik7Ci0KLQotc3RhdGljIGludCBjYW1fZGVidWdfaW5pdCh2b2lkKQotewotCXN0cnVjdCBkZW50cnkgKmNhbV9kaXI7Ci0JZGVidWdmc19iYXNlID0gZGVidWdmc19jcmVhdGVfZGlyKCJzZW5zb3IiLCBOVUxMKTsKLQlpZiAoIWRlYnVnZnNfYmFzZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljYW1fZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJtdDllMDEzIiwgZGVidWdmc19iYXNlKTsKLQlpZiAoIWNhbV9kaXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJmb2N1cyIsIFNfSVJVR08gfCBTX0lXVVNSLCBjYW1fZGlyLAotCQkJCQkJCSBOVUxMLCAmY2FtX2ZvY3VzKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzdGVwIiwgU19JUlVHTyB8IFNfSVdVU1IsIGNhbV9kaXIsCi0JCQkJCQkJIE5VTEwsICZjYW1fc3RlcCkpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmICghZGVidWdmc19jcmVhdGVfZmlsZSgic3RyZWFtIiwgU19JUlVHTyB8IFNfSVdVU1IsIGNhbV9kaXIsCi0JCQkJCQkJIE5VTEwsICZjYW1fc3RyZWFtKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDllMDEzLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5ZTAxMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjQzZWM0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDllMDEzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIE1UOUUwMTNfSAotI2RlZmluZSBNVDlFMDEzX0gKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLWV4dGVybiBzdHJ1Y3QgbXQ5ZTAxM19yZWcgbXQ5ZTAxM19yZWdzOwotc3RydWN0IHJlZ19zdHJ1Y3RfaW5pdCB7Ci0JdWludDhfdCByZWdfMHgwMTEyOyAgICAgIC8qIDB4MDExMiovCi0JdWludDhfdCByZWdfMHgwMTEzOyAgICAgIC8qIDB4MDExMyovCi0JdWludDhfdCB2dF9waXhfY2xrX2RpdjsgIC8qIDB4MDMwMSovCi0JdWludDhfdCBwcmVfcGxsX2Nsa19kaXY7IC8qIDB4MDMwNSovCi0JdWludDhfdCBwbGxfbXVsdGlwbGllcjsgIC8qIDB4MDMwNyovCi0JdWludDhfdCBvcF9waXhfY2xrX2RpdjsgIC8qIDB4MDMwOSovCi0JdWludDhfdCByZWdfMHgzMDMwOyAgICAgIC8qMHgzMDMwKi8KLQl1aW50OF90IHJlZ18weDAxMTE7ICAgICAgLyoweDAxMTEqLwotCXVpbnQ4X3QgcmVnXzB4MGIwMDsgICAgICAvKjB4MGIwMCovCi0JdWludDhfdCByZWdfMHgzMDAxOyAgICAgIC8qMHgzMDAxKi8KLQl1aW50OF90IHJlZ18weDMwMDQ7ICAgICAgLyoweDMwMDQqLwotCXVpbnQ4X3QgcmVnXzB4MzAwNzsgICAgICAvKjB4MzAwNyovCi0JdWludDhfdCByZWdfMHgzMDE2OyAgICAgIC8qMHgzMDE2Ki8KLQl1aW50OF90IHJlZ18weDMwMWQ7ICAgICAgLyoweDMwMWQqLwotCXVpbnQ4X3QgcmVnXzB4MzE3ZTsgICAgICAvKjB4MzE3RSovCi0JdWludDhfdCByZWdfMHgzMTdmOyAgICAgIC8qMHgzMTdGKi8KLQl1aW50OF90IHJlZ18weDM0MDA7ICAgICAgLyoweDM0MDAqLwotCXVpbnQ4X3QgcmVnXzB4MGIwNjsgICAgICAvKjB4MGIwNiovCi0JdWludDhfdCByZWdfMHgwYjA3OyAgICAgIC8qMHgwYjA3Ki8KLQl1aW50OF90IHJlZ18weDBiMDg7ICAgICAgLyoweDBiMDgqLwotCXVpbnQ4X3QgcmVnXzB4MGIwOTsgICAgICAvKjB4MGIwOSovCi0JdWludDhfdCByZWdfMHgwMTM2OwotCXVpbnQ4X3QgcmVnXzB4MDEzNzsKLQkvKiBFZG9mICovCi0JdWludDhfdCByZWdfMHgwYjgzOyAgICAgIC8qMHgwYjgzKi8KLQl1aW50OF90IHJlZ18weDBiODQ7ICAgICAgLyoweDBiODQqLwotCXVpbnQ4X3QgcmVnXzB4MGI4NTsgICAgICAvKjB4MGI4NSovCi0JdWludDhfdCByZWdfMHgwYjg4OyAgICAgIC8qMHgwYjg4Ki8KLQl1aW50OF90IHJlZ18weDBiODk7ICAgICAgLyoweDBiODkqLwotCXVpbnQ4X3QgcmVnXzB4MGI4YTsgICAgICAvKjB4MGI4YSovCi0JfTsKLXN0cnVjdCByZWdfc3RydWN0IHsKLQl1aW50OF90IGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX2hpOyAvKlJFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9ISSovCi0JdWludDhfdCBjb2Fyc2VfaW50ZWdyYXRpb25fdGltZV9sbzsgLypSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfTE8qLwotCXVpbnQ4X3QgYW5hbG9ndWVfZ2Fpbl9jb2RlX2dsb2JhbDsKLQl1aW50OF90IGZyYW1lX2xlbmd0aF9saW5lc19oaTsgLyogMHgwMzQwKi8KLQl1aW50OF90IGZyYW1lX2xlbmd0aF9saW5lc19sbzsgLyogMHgwMzQxKi8KLQl1aW50OF90IGxpbmVfbGVuZ3RoX3Bja19oaTsgICAgLyogMHgwMzQyKi8KLQl1aW50OF90IGxpbmVfbGVuZ3RoX3Bja19sbzsgICAgLyogMHgwMzQzKi8KLQl1aW50OF90IHJlZ18weDMwMDU7ICAgLyogMHgzMDA1Ki8KLQl1aW50OF90IHJlZ18weDMwMTA7ICAvKiAweDMwMTAqLwotCXVpbnQ4X3QgcmVnXzB4MzAxMTsgIC8qIDB4MzAxMSovCi0JdWludDhfdCByZWdfMHgzMDFhOyAgLyogMHgzMDFhKi8KLQl1aW50OF90IHJlZ18weDMwMzU7ICAvKiAweDMwMzUqLwotCXVpbnQ4X3QgcmVnXzB4MzAzNjsgICAvKiAweDMwMzYqLwotCXVpbnQ4X3QgcmVnXzB4MzA0MTsgIC8qMHgzMDQxKi8KLQl1aW50OF90IHJlZ18weDMwNDI7ICAvKjB4MzA0MiovCi0JdWludDhfdCByZWdfMHgzMDQ1OyAgLyoweDMwNDUqLwotCXVpbnQ4X3QgcmVnXzB4MGI4MDsgICAvKiAweDBiODAqLwotCXVpbnQ4X3QgcmVnXzB4MDkwMDsgICAvKjB4MDkwMCovCi0JdWludDhfdCByZWdfMHgwOTAxOyAgIC8qIDB4MDkwMSovCi0JdWludDhfdCByZWdfMHgwOTAyOyAgIC8qMHgwOTAyKi8KLQl1aW50OF90IHJlZ18weDAzODM7ICAgLyoweDAzODMqLwotCXVpbnQ4X3QgcmVnXzB4MDM4NzsgICAvKiAweDAzODcqLwotCXVpbnQ4X3QgcmVnXzB4MDM0YzsgICAvKiAweDAzNGMqLwotCXVpbnQ4X3QgcmVnXzB4MDM0ZDsgICAvKjB4MDM0ZCovCi0JdWludDhfdCByZWdfMHgwMzRlOyAgIC8qIDB4MDM0ZSovCi0JdWludDhfdCByZWdfMHgwMzRmOyAgIC8qIDB4MDM0ZiovCi0JdWludDhfdCByZWdfMHgxNzE2OyAvKjB4MTcxNiovCi0JdWludDhfdCByZWdfMHgxNzE3OyAvKjB4MTcxNyovCi0JdWludDhfdCByZWdfMHgxNzE4OyAvKjB4MTcxOCovCi0JdWludDhfdCByZWdfMHgxNzE5OyAvKjB4MTcxOSovCi0JdWludDhfdCByZWdfMHgzMjEwOy8qMHgzMjEwKi8KLQl1aW50OF90IHJlZ18weDExMTsgLyoweDExMSovCi0JdWludDhfdCByZWdfMHgzNDEwOyAgLyoweDM0MTAqLwotCXVpbnQ4X3QgcmVnXzB4MzA5ODsKLQl1aW50OF90IHJlZ18weDMwOUQ7Ci0JdWludDhfdCByZWdfMHgwMjAwOwotCXVpbnQ4X3QgcmVnXzB4MDIwMTsKLQl9Owotc3RydWN0IG10OWUwMTNfaTJjX3JlZ19jb25mIHsKLQl1bnNpZ25lZCBzaG9ydCB3YWRkcjsKLQl1bnNpZ25lZCBzaG9ydCB3ZGF0YTsKLX07Ci0KLWVudW0gbXQ5ZTAxM190ZXN0X21vZGVfdCB7Ci0JVEVTVF9PRkYsCi0JVEVTVF8xLAotCVRFU1RfMiwKLQlURVNUXzMKLX07Ci0KLWVudW0gbXQ5ZTAxM19yZXNvbHV0aW9uX3QgewotCVFUUl9TSVpFLAotCUZVTExfU0laRSwKLQlIRlJfNjBGUFMsCi0JSEZSXzkwRlBTLAotCUhGUl8xMjBGUFMsCi0JSU5WQUxJRF9TSVpFCi19OwotZW51bSBtdDllMDEzX3NldHRpbmcgewotCVJFU19QUkVWSUVXLAotCVJFU19DQVBUVVJFCi19OwotZW51bSBtdDllMDEzX3JlZ191cGRhdGUgewotCS8qIFNlbnNvciBlZ2lzdGVycyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKi8KLQlSRUdfSU5JVCwKLQkvKiBTZW5zb3IgZWdpc3RlcnMgdGhhdCBuZWVkcyBwZXJpb2RpYyBJMkMgd3JpdGVzICovCi0JVVBEQVRFX1BFUklPRElDLAotCS8qIEFsbCB0aGUgc2Vuc29yIFJlZ2lzdGVycyB3aWxsIGJlIHVwZGF0ZWQgKi8KLQlVUERBVEVfQUxMLAotCS8qIE5vdCB2YWxpZCB1cGRhdGUgKi8KLQlVUERBVEVfSU5WQUxJRAotfTsKLQotZW51bSBtdDllMDEzX3JlZ19wbGwgewotCUUwMTNfVlRfUElYX0NMS19ESVYsCi0JRTAxM19WVF9TWVNfQ0xLX0RJViwKLQlFMDEzX1BSRV9QTExfQ0xLX0RJViwKLQlFMDEzX1BMTF9NVUxUSVBMSUVSLAotCUUwMTNfT1BfUElYX0NMS19ESVYsCi0JRTAxM19PUF9TWVNfQ0xLX0RJVgotfTsKLQotZW51bSBtdDllMDEzX3JlZ19tb2RlIHsKLQlFMDEzX1hfQUREUl9TVEFSVCwKLQlFMDEzX1hfQUREUl9FTkQsCi0JRTAxM19ZX0FERFJfU1RBUlQsCi0JRTAxM19ZX0FERFJfRU5ELAotCUUwMTNfWF9PVVRQVVRfU0laRSwKLQlFMDEzX1lfT1VUUFVUX1NJWkUsCi0JRTAxM19EQVRBUEFUSF9TRUxFQ1QsCi0JRTAxM19SRUFEX01PREUsCi0JRTAxM19BTkFMT0dfQ09OVFJPTDUsCi0JRTAxM19EQUNfTERfNF81LAotCUUwMTNfU0NBTElOR19NT0RFLAotCUUwMTNfU0NBTEVfTSwKLQlFMDEzX0xJTkVfTEVOR1RIX1BDSywKLQlFMDEzX0ZSQU1FX0xFTkdUSF9MSU5FUywKLQlFMDEzX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FLAotCUUwMTNfRklORV9JTlRFR1JBVElPTl9USU1FLAotCUUwMTNfRklORV9DT1JSRUNUSU9OCi19OwotCi1zdHJ1Y3QgbXQ5ZTAxM19yZWcgewotCWNvbnN0IHN0cnVjdCBtdDllMDEzX2kyY19yZWdfY29uZiAqcmVnX21pcGk7Ci0JY29uc3QgdW5zaWduZWQgc2hvcnQgcmVnX21pcGlfc2l6ZTsKLQljb25zdCBzdHJ1Y3QgbXQ5ZTAxM19pMmNfcmVnX2NvbmYgKnJlY19zZXR0aW5nczsKLQljb25zdCB1bnNpZ25lZCBzaG9ydCByZWNfc2l6ZTsKLQljb25zdCBzdHJ1Y3QgbXQ5ZTAxM19pMmNfcmVnX2NvbmYgKnJlZ19wbGw7Ci0JY29uc3QgdW5zaWduZWQgc2hvcnQgcmVnX3BsbF9zaXplOwotCWNvbnN0IHN0cnVjdCBtdDllMDEzX2kyY19yZWdfY29uZiAqcmVnX3BsbF82MGZwczsKLQljb25zdCB1bnNpZ25lZCBzaG9ydCByZWdfcGxsXzYwZnBzX3NpemU7Ci0JY29uc3Qgc3RydWN0IG10OWUwMTNfaTJjX3JlZ19jb25mICpyZWdfcGxsXzEyMGZwczsKLQljb25zdCB1bnNpZ25lZCBzaG9ydCByZWdfcGxsXzEyMGZwc19zaXplOwotCWNvbnN0IHN0cnVjdCBtdDllMDEzX2kyY19yZWdfY29uZiAqcmVnX3ByZXY7Ci0JY29uc3QgdW5zaWduZWQgc2hvcnQgcmVnX3ByZXZfc2l6ZTsKLQljb25zdCBzdHJ1Y3QgbXQ5ZTAxM19pMmNfcmVnX2NvbmYgKnJlZ19zbmFwOwotCWNvbnN0IHVuc2lnbmVkIHNob3J0IHJlZ19zbmFwX3NpemU7Ci0JY29uc3Qgc3RydWN0IG10OWUwMTNfaTJjX3JlZ19jb25mICpyZWdfNjBmcHM7Ci0JY29uc3QgdW5zaWduZWQgc2hvcnQgcmVnXzYwZnBzX3NpemU7Ci0JY29uc3Qgc3RydWN0IG10OWUwMTNfaTJjX3JlZ19jb25mICpyZWdfMTIwZnBzOwotCWNvbnN0IHVuc2lnbmVkIHNob3J0IHJlZ18xMjBmcHNfc2l6ZTsKLX07Ci0jZW5kaWYgLyogTVQ5RTAxM19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5ZTAxM19yZWcuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDllMDEzX3JlZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGNmM2Y4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDllMDEzX3JlZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotCi0jaW5jbHVkZSAibXQ5ZTAxMy5oIgotCi1zdGF0aWMgc3RydWN0IG10OWUwMTNfaTJjX3JlZ19jb25mIG1pcGlfc2V0dGluZ3NbXSA9IHsKLQkvKkRpc2FibGUgZW1iZWRkZWQgZGF0YSovCi0JezB4MzA2NCwgMHg3ODAwfSwvKlNNSUFfVEVTVCovCi0JLypjb25maWd1cmUgMi1sYW5lIE1JUEkqLwotCXsweDMxQUUsIDB4MDIwMn0sLypTRVJJQUxfRk9STUFUKi8KLQl7MHgzMUI4LCAweDBFM0Z9LC8qTUlQSV9USU1JTkdfMiovCi0JLypzZXQgZGF0YSB0byBSQVcxMCBmb3JtYXQqLwotCXsweDAxMTIsIDB4MEEwQX0sLypDQ1BfREFUQV9GT1JNQVQqLwotCXsweDMwRjAsIDB4ODAwMH0sLypWQ00gQ09OVFJPTCovCi19OwotCi0vKlBMTCBDb25maWd1cmF0aW9uCi0oRXh0PTI0TUh6LCB2dF9waXhfY2xrPTE3NE1Ieiwgb3BfcGl4X2Nsaz02OS42TUh6KSovCi1zdGF0aWMgc3RydWN0IG10OWUwMTNfaTJjX3JlZ19jb25mIHBsbF9zZXR0aW5nc1tdID0gewotCXsweDAzMDAsIDB4MDAwNH0sLypWVF9QSVhfQ0xLX0RJViovCi0JezB4MDMwMiwgMHgwMDAxfSwvKlZUX1NZU19DTEtfRElWKi8KLQl7MHgwMzA0LCAweDAwMDJ9LC8qUFJFX1BMTF9DTEtfRElWKi8KLQl7MHgwMzA2LCAweDAwM0F9LC8qUExMX01VTFRJUExJRVIqLwotCXsweDAzMDgsIDB4MDAwQX0sLypPUF9QSVhfQ0xLX0RJViovCi0JezB4MDMwQSwgMHgwMDAxfSwvKk9QX1NZU19DTEtfRElWKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXQ5ZTAxM19pMmNfcmVnX2NvbmYgcHJldl9zZXR0aW5nc1tdID0gewotCS8qT3V0cHV0IFNpemUgKDE2MzJ4MTIyNCkqLwotCXsweDAzNDQsIDB4MDAwOH0sLypYX0FERFJfU1RBUlQqLwotCXsweDAzNDgsIDB4MENDOX0sLypYX0FERFJfRU5EKi8KLQl7MHgwMzQ2LCAweDAwMDh9LC8qWV9BRERSX1NUQVJUKi8KLQl7MHgwMzRBLCAweDA5OTl9LC8qWV9BRERSX0VORCovCi0JezB4MDM0QywgMHgwNjYwfSwvKlhfT1VUUFVUX1NJWkUqLwotCXsweDAzNEUsIDB4MDRDOH0sLypZX09VVFBVVF9TSVpFKi8KLQl7MHgzMDZFLCAweEZDQjB9LC8qREFUQVBBVEhfU0VMRUNUKi8KLQl7MHgzMDQwLCAweDA0QzN9LC8qUkVBRF9NT0RFKi8KLQl7MHgzMTc4LCAweDAwMDB9LC8qQU5BTE9HX0NPTlRST0w1Ki8KLQl7MHgzRUQwLCAweDFFMjR9LC8qREFDX0xEXzRfNSovCi0JezB4MDQwMCwgMHgwMDAyfSwvKlNDQUxJTkdfTU9ERSovCi0JezB4MDQwNCwgMHgwMDEwfSwvKlNDQUxFX00qLwotCS8qVGltaW5nIGNvbmZpZ3VyYXRpb24qLwotCXsweDAzNDIsIDB4MTAxOH0sLypMSU5FX0xFTkdUSF9QQ0sqLwotCXsweDAzNDAsIDB4MDU1Qn0sLypGUkFNRV9MRU5HVEhfTElORVMqLwotCXsweDAyMDIsIDB4MDU1N30sLypDT0FSU0VfSU5URUdSQVRJT05fVElNRSovCi0JezB4MzAxNCwgMHgwODQ2fSwvKkZJTkVfSU5URUdSQVRJT05fVElNRV8qLwotCXsweDMwMTAsIDB4MDEzMH0sLypGSU5FX0NPUlJFQ1RJT04qLwotfTsKLQotc3RhdGljIHN0cnVjdCBtdDllMDEzX2kyY19yZWdfY29uZiBzbmFwX3NldHRpbmdzW10gPSB7Ci0JLypPdXRwdXQgU2l6ZSAoMzI2NHgyNDQ4KSovCi0JezB4MDM0NCwgMHgwMDA4fSwvKlhfQUREUl9TVEFSVCAqLwotCXsweDAzNDgsIDB4MENEN30sLypYX0FERFJfRU5EKi8KLQl7MHgwMzQ2LCAweDAwMDh9LC8qWV9BRERSX1NUQVJUICovCi0JezB4MDM0QSwgMHgwOUE3fSwvKllfQUREUl9FTkQqLwotCXsweDAzNEMsIDB4MENEMH0sLypYX09VVFBVVF9TSVpFKi8KLQl7MHgwMzRFLCAweDA5QTB9LC8qWV9PVVRQVVRfU0laRSovCi0JezB4MzA2RSwgMHhGQzgwfSwvKkRBVEFQQVRIX1NFTEVDVCovCi0JezB4MzA0MCwgMHgwMDQxfSwvKlJFQURfTU9ERSovCi0JezB4MzE3OCwgMHgwMDAwfSwvKkFOQUxPR19DT05UUk9MNSovCi0JezB4M0VEMCwgMHgxRTI0fSwvKkRBQ19MRF80XzUqLwotCXsweDA0MDAsIDB4MDAwMH0sLypTQ0FMSU5HX01PREUqLwotCXsweDA0MDQsIDB4MDAxMH0sLypTQ0FMRV9NKi8KLQkvKlRpbWluZyBjb25maWd1cmF0aW9uKi8KLQl7MHgwMzQyLCAweDEzRjh9LC8qTElORV9MRU5HVEhfUENLKi8KLQl7MHgwMzQwLCAweDBBMkZ9LC8qRlJBTUVfTEVOR1RIX0xJTkVTKi8KLQl7MHgwMjAyLCAweDBBMUZ9LC8qQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUUqLwotCXsweDMwMTQsIDB4MDNGNn0sLypGSU5FX0lOVEVHUkFUSU9OX1RJTUVfICovCi0JezB4MzAxMCwgMHgwMDc4fSwvKkZJTkVfQ09SUkVDVElPTiovCi19OwotCi1zdGF0aWMgc3RydWN0IG10OWUwMTNfaTJjX3JlZ19jb25mIHBsbF9zZXR0aW5nc182MGZwc1tdID0gewotCXsweDAzMDAsIDB4MDAwNH0sLypWVF9QSVhfQ0xLX0RJViovCi0JezB4MDMwMiwgMHgwMDAxfSwvKlZUX1NZU19DTEtfRElWKi8KLQl7MHgwMzA0LCAweDAwMDJ9LC8qUFJFX1BMTF9DTEtfRElWKi8KLQl7MHgwMzA2LCAweDAwNDJ9LC8qUExMX01VTFRJUExJRVIqLwotCXsweDAzMDgsIDB4MDAwQX0sLypPUF9QSVhfQ0xLX0RJViovCi0JezB4MDMwQSwgMHgwMDAxfSwvKk9QX1NZU19DTEtfRElWKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXQ5ZTAxM19pMmNfcmVnX2NvbmYgcHJldl9zZXR0aW5nc182MGZwc1tdID0gewotCS8qT3V0cHV0IFNpemUgKDE2MzJ4MTIyNCkqLwotCXsweDAzNDQsIDB4MDAwOH0sLypYX0FERFJfU1RBUlQqLwotCXsweDAzNDgsIDB4MENDNX0sLypYX0FERFJfRU5EKi8KLQl7MHgwMzQ2LCAweDAxM2F9LC8qWV9BRERSX1NUQVJUKi8KLQl7MHgwMzRBLCAweDA4NjN9LC8qWV9BRERSX0VORCovCi0JezB4MDM0QywgMHgwNjYwfSwvKlhfT1VUUFVUX1NJWkUqLwotCXsweDAzNEUsIDB4MDM5Nn0sLypZX09VVFBVVF9TSVpFKi8KLQl7MHgzMDZFLCAweEZDODB9LC8qREFUQVBBVEhfU0VMRUNUKi8KLQl7MHgzMDQwLCAweDAwQzN9LC8qUkVBRF9NT0RFKi8KLQl7MHgzMTc4LCAweDAwMDB9LC8qQU5BTE9HX0NPTlRST0w1Ki8KLQl7MHgzRUQwLCAweDFFMjR9LC8qREFDX0xEXzRfNSovCi0JezB4MDQwMCwgMHgwMDAwfSwvKlNDQUxJTkdfTU9ERSovCi0JezB4MDQwNCwgMHgwMDEwfSwvKlNDQUxFX00qLwotCS8qVGltaW5nIGNvbmZpZ3VyYXRpb24qLwotCXsweDAzNDIsIDB4MEJFOH0sLypMSU5FX0xFTkdUSF9QQ0sqLwotCXsweDAzNDAsIDB4MDQyNX0sLypGUkFNRV9MRU5HVEhfTElORVMqLwotCXsweDAyMDIsIDB4MDQyNX0sLypDT0FSU0VfSU5URUdSQVRJT05fVElNRSovCi0JezB4MzAxNCwgMHgwM0Y2fSwvKkZJTkVfSU5URUdSQVRJT05fVElNRV8qLwotCXsweDMwMTAsIDB4MDA3OH0sLypGSU5FX0NPUlJFQ1RJT04qLwotfTsKLQotc3RhdGljIHN0cnVjdCBtdDllMDEzX2kyY19yZWdfY29uZiBwbGxfc2V0dGluZ3NfMTIwZnBzW10gPSB7Ci0JezB4MDMwMCwgMHgwMDA1fSwvKlZUX1BJWF9DTEtfRElWKi8KLQl7MHgwMzAyLCAweDAwMDF9LC8qVlRfU1lTX0NMS19ESVYqLwotCXsweDAzMDQsIDB4MDAwMn0sLypQUkVfUExMX0NMS19ESVYqLwotCXsweDAzMDYsIDB4MDA1Mn0sLypQTExfTVVMVElQTElFUiovCi0JezB4MDMwOCwgMHgwMDBBfSwvKk9QX1BJWF9DTEtfRElWKi8KLQl7MHgwMzBBLCAweDAwMDF9LC8qT1BfU1lTX0NMS19ESVYqLwotfTsKLQotc3RhdGljIHN0cnVjdCBtdDllMDEzX2kyY19yZWdfY29uZiBwcmV2X3NldHRpbmdzXzEyMGZwc1tdID0gewotCXsweDAzNDQsIDB4MDAwOH0sLypYX0FERFJfU1RBUlQqLwotCXsweDAzNDgsIDB4MDY4NX0sLypYX0FERFJfRU5EKi8KLQl7MHgwMzQ2LCAweDAxM2F9LC8qWV9BRERSX1NUQVJUKi8KLQl7MHgwMzRBLCAweDA1NUJ9LC8qWV9BRERSX0VORCovCi0JezB4MDM0QywgMHgwMzQwfSwvKlhfT1VUUFVUX1NJWkUqLwotCXsweDAzNEUsIDB4MDIxMn0sLypZX09VVFBVVF9TSVpFKi8KLQl7MHgzMDZFLCAweEZDODB9LC8qREFUQVBBVEhfU0VMRUNUKi8KLQl7MHgzMDQwLCAweDAwQzN9LC8qUkVBRF9NT0RFKi8KLQl7MHgzMTc4LCAweDAwMDB9LC8qQU5BTE9HX0NPTlRST0w1Ki8KLQl7MHgzRUQwLCAweDFFMjR9LC8qREFDX0xEXzRfNSovCi0JezB4MDQwMCwgMHgwMDAwfSwvKlNDQUxJTkdfTU9ERSovCi0JezB4MDQwNCwgMHgwMDEwfSwvKlNDQUxFX00qLwotCS8qVGltaW5nIGNvbmZpZ3VyYXRpb24qLwotCXsweDAzNDIsIDB4MDk3MH0sLypMSU5FX0xFTkdUSF9QQ0sqLwotCXsweDAzNDAsIDB4MDJBMX0sLypGUkFNRV9MRU5HVEhfTElORVMqLwotCXsweDAyMDIsIDB4MDJBMX0sLypDT0FSU0VfSU5URUdSQVRJT05fVElNRSovCi0JezB4MzAxNCwgMHgwM0Y2fSwvKkZJTkVfSU5URUdSQVRJT05fVElNRV8qLwotCXsweDMwMTAsIDB4MDA3OH0sLypGSU5FX0NPUlJFQ1RJT04qLwotfTsKLQotc3RhdGljIHN0cnVjdCBtdDllMDEzX2kyY19yZWdfY29uZiByZWNvbW1lbmRfc2V0dGluZ3NbXSA9IHsKLQl7MHgzMDQ0LCAweDA1OTB9LAotCXsweDMwNkUsIDB4RkM4MH0sCi0JezB4MzBCMiwgMHhDMDAwfSwKLQl7MHgzMEQ2LCAweDA4MDB9LAotCXsweDMxNkMsIDB4QjQyRn0sCi0JezB4MzE2RSwgMHg4NjlDfSwKLQl7MHgzMTcwLCAweDIxMEV9LAotCXsweDMxN0EsIDB4MDEwRX0sCi0JezB4MzFFMCwgMHgxRkI5fSwKLQl7MHgzMUU2LCAweDA3RkN9LAotCXsweDM3QzAsIDB4MDAwMH0sCi0JezB4MzdDMiwgMHgwMDAwfSwKLQl7MHgzN0M0LCAweDAwMDB9LAotCXsweDM3QzYsIDB4MDAwMH0sCi0JezB4M0UwMiwgMHg4ODAxfSwKLQl7MHgzRTA0LCAweDIzMDF9LAotCXsweDNFMDYsIDB4ODQ0OX0sCi0JezB4M0UwOCwgMHg2ODQxfSwKLQl7MHgzRTBBLCAweDQwMEN9LAotCXsweDNFMEMsIDB4MTAwMX0sCi0JezB4M0UwRSwgMHgyMTAzfSwKLQl7MHgzRTEwLCAweDRCNDF9LAotCXsweDNFMTIsIDB4NEIyNn0sCi0JezB4M0UxNiwgMHg4ODAyfSwKLQl7MHgzRTE4LCAweDg0RkZ9LAotCXsweDNFMUEsIDB4ODYwMX0sCi0JezB4M0UxQywgMHg4NDAxfSwKLQl7MHgzRTFFLCAweDg0MEF9LAotCXsweDNFMjAsIDB4RkYwMH0sCi0JezB4M0UyMiwgMHg4NDAxfSwKLQl7MHgzRTI0LCAweDAwRkZ9LAotCXsweDNFMjYsIDB4MDA4OH0sCi0JezB4M0UyOCwgMHgyRThBfSwKLQl7MHgzRTMyLCAweDg4MDF9LAotCXsweDNFMzQsIDB4NDAyNH0sCi0JezB4M0UzOCwgMHg4NDY5fSwKLQl7MHgzRTNDLCAweDIzMDF9LAotCXsweDNFM0UsIDB4M0UyNX0sCi0JezB4M0U0MCwgMHgxQzAxfSwKLQl7MHgzRTQyLCAweDg0ODZ9LAotCXsweDNFNDQsIDB4ODQwMX0sCi0JezB4M0U0NiwgMHgwMEZGfSwKLQl7MHgzRTQ4LCAweDg0MDF9LAotCXsweDNFNEEsIDB4ODYwMX0sCi0JezB4M0U0QywgMHg4NDAyfSwKLQl7MHgzRTRFLCAweDAwRkZ9LAotCXsweDNFNTAsIDB4NjYyM30sCi0JezB4M0U1MiwgMHg4MzQwfSwKLQl7MHgzRTU0LCAweDAwRkZ9LAotCXsweDNFNTYsIDB4NEE0Mn0sCi0JezB4M0U1OCwgMHgyMjAzfSwKLQl7MHgzRTVBLCAweDY3NER9LAotCXsweDNFNUMsIDB4M0YyNX0sCi0JezB4M0U1RSwgMHg4NDZBfSwKLQl7MHgzRTYwLCAweDRDMDF9LAotCXsweDNFNjIsIDB4ODQwMX0sCi0JezB4M0U2NiwgMHgzOTAxfSwKLQl7MHgzRUNDLCAweDAwRUJ9LAotCXsweDNFRDAsIDB4MUUyNH0sCi0JezB4M0VENCwgMHhBRkM0fSwKLQl7MHgzRUQ2LCAweDkwOUJ9LAotCXsweDNFRDgsIDB4MDAwNn0sCi0JezB4M0VEQSwgMHhDRkM2fSwKLQl7MHgzRURDLCAweDRGRTR9LAotCXsweDNFRTAsIDB4MjQyNH0sCi0JezB4M0VFMiwgMHg5Nzk3fSwKLQl7MHgzRUU0LCAweEMxMDB9LAotCXsweDNFRTYsIDB4MDU0MH0KLX07Ci0KLXN0cnVjdCBtdDllMDEzX3JlZyBtdDllMDEzX3JlZ3MgPSB7Ci0JLnJlZ19taXBpID0gJm1pcGlfc2V0dGluZ3NbMF0sCi0JLnJlZ19taXBpX3NpemUgPSBBUlJBWV9TSVpFKG1pcGlfc2V0dGluZ3MpLAotCS5yZWNfc2V0dGluZ3MgPSAmcmVjb21tZW5kX3NldHRpbmdzWzBdLAotCS5yZWNfc2l6ZSA9IEFSUkFZX1NJWkUocmVjb21tZW5kX3NldHRpbmdzKSwKLQkucmVnX3BsbCA9ICZwbGxfc2V0dGluZ3NbMF0sCi0JLnJlZ19wbGxfc2l6ZSA9IEFSUkFZX1NJWkUocGxsX3NldHRpbmdzKSwKLQkucmVnX3ByZXYgPSAmcHJldl9zZXR0aW5nc1swXSwKLQkucmVnX3BsbF82MGZwcyA9ICZwbGxfc2V0dGluZ3NfNjBmcHNbMF0sCi0JLnJlZ19wbGxfNjBmcHNfc2l6ZSA9IEFSUkFZX1NJWkUocGxsX3NldHRpbmdzXzYwZnBzKSwKLQkucmVnX3BsbF8xMjBmcHMgPSAmcGxsX3NldHRpbmdzXzEyMGZwc1swXSwKLQkucmVnX3BsbF8xMjBmcHNfc2l6ZSA9IEFSUkFZX1NJWkUocGxsX3NldHRpbmdzXzEyMGZwcyksCi0JLnJlZ19wcmV2X3NpemUgPSBBUlJBWV9TSVpFKHByZXZfc2V0dGluZ3MpLAotCS5yZWdfc25hcCA9ICZzbmFwX3NldHRpbmdzWzBdLAotCS5yZWdfc25hcF9zaXplID0gQVJSQVlfU0laRShzbmFwX3NldHRpbmdzKSwKLQkucmVnXzYwZnBzID0gJnByZXZfc2V0dGluZ3NfNjBmcHNbMF0sCi0JLnJlZ182MGZwc19zaXplID0gQVJSQVlfU0laRShwcmV2X3NldHRpbmdzXzYwZnBzKSwKLQkucmVnXzEyMGZwcyA9ICZwcmV2X3NldHRpbmdzXzEyMGZwc1swXSwKLQkucmVnXzEyMGZwc19zaXplID0gQVJSQVlfU0laRShwcmV2X3NldHRpbmdzXzEyMGZwcyksCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL210OXAwMTIuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDlwMDEyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMGIyZjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL210OXAwMTIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIE1UOVQwMTJfSAotI2RlZmluZSBNVDlUMDEyX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotCi1leHRlcm4gc3RydWN0IG10OXAwMTJfcmVnIG10OXAwMTJfcmVnczsJLyogZnJvbSBtdDlwMDEyX3JlZy5jICovCi0KLXN0cnVjdCByZWdfc3RydWN0IHsKLQl1aW50MTZfdCB2dF9waXhfY2xrX2RpdjsgICAgIC8qIDB4MDMwMCAqLwotCXVpbnQxNl90IHZ0X3N5c19jbGtfZGl2OyAgICAgLyogMHgwMzAyICovCi0JdWludDE2X3QgcHJlX3BsbF9jbGtfZGl2OyAgICAvKiAweDAzMDQgKi8KLQl1aW50MTZfdCBwbGxfbXVsdGlwbGllcjsgICAgIC8qIDB4MDMwNiAqLwotCXVpbnQxNl90IG9wX3BpeF9jbGtfZGl2OyAgICAgLyogMHgwMzA4ICovCi0JdWludDE2X3Qgb3Bfc3lzX2Nsa19kaXY7ICAgICAvKiAweDAzMEEgKi8KLQl1aW50MTZfdCBzY2FsZV9tOyAgICAgICAgICAgIC8qIDB4MDQwNCAqLwotCXVpbnQxNl90IHJvd19zcGVlZDsgICAgICAgICAgLyogMHgzMDE2ICovCi0JdWludDE2X3QgeF9hZGRyX3N0YXJ0OyAgICAgICAvKiAweDMwMDQgKi8KLQl1aW50MTZfdCB4X2FkZHJfZW5kOyAgICAgICAgIC8qIDB4MzAwOCAqLwotCXVpbnQxNl90IHlfYWRkcl9zdGFydDsgICAgICAgLyogMHgzMDAyICovCi0JdWludDE2X3QgeV9hZGRyX2VuZDsgICAgICAgICAvKiAweDMwMDYgKi8KLQl1aW50MTZfdCByZWFkX21vZGU7ICAgICAgICAgIC8qIDB4MzA0MCAqLwotCXVpbnQxNl90IHhfb3V0cHV0X3NpemUgOyAgICAgLyogMHgwMzRDICovCi0JdWludDE2X3QgeV9vdXRwdXRfc2l6ZTsgICAgICAvKiAweDAzNEUgKi8KLQl1aW50MTZfdCBsaW5lX2xlbmd0aF9wY2s7ICAgIC8qIDB4MzAwQyAqLwotCXVpbnQxNl90IGZyYW1lX2xlbmd0aF9saW5lczsgLyogMHgzMDBBICovCi0JdWludDE2X3QgY29hcnNlX2ludF90aW1lOyAgICAvKiAweDMwMTIgKi8KLQl1aW50MTZfdCBmaW5lX2ludF90aW1lOyAgICAgIC8qIDB4MzAxNCAqLwotfTsKLQotCi1zdHJ1Y3QgbXQ5cDAxMl9pMmNfcmVnX2NvbmYgewotCXVuc2lnbmVkIHNob3J0IHdhZGRyOwotCXVuc2lnbmVkIHNob3J0IHdkYXRhOwotfTsKLQotCi1zdHJ1Y3QgbXQ5cDAxMl9yZWcgewotCXN0cnVjdCByZWdfc3RydWN0IGNvbnN0ICpyZWdfcGF0OwotCXVpbnQxNl90IHJlZ19wYXRfc2l6ZTsKLQlzdHJ1Y3QgbXQ5cDAxMl9pMmNfcmVnX2NvbmYgY29uc3QgKnR0Ymw7Ci0JdWludDE2X3QgdHRibF9zaXplOwotCXN0cnVjdCBtdDlwMDEyX2kyY19yZWdfY29uZiBjb25zdCAqcmZ0Ymw7Ci0JdWludDE2X3QgcmZ0Ymxfc2l6ZTsKLX07Ci0KLSNlbmRpZiAvKiBNVDlUMDEyX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDlwMDEyX2JhbS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL210OXAwMTJfYmFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNjM4OTMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL210OXAwMTJfYmFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDI2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOC0yMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2NhbWVyYS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSAibXQ5cDAxMi5oIgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBTRU5TT1IgUkVHSVNURVIgREVGSU5FUwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotI2RlZmluZSBNVDlQMDEyX1JFR19NT0RFTF9JRCAgICAgICAgIDB4MDAwMAotI2RlZmluZSBNVDlQMDEyX01PREVMX0lEICAgICAgICAgICAgIDB4MjgwMQotI2RlZmluZSBSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCAgIDB4MDEwNAotI2RlZmluZSBHUk9VUEVEX1BBUkFNRVRFUl9IT0xEICAgICAgIDB4MDEwMAotI2RlZmluZSBHUk9VUEVEX1BBUkFNRVRFUl9VUERBVEUgICAgIDB4MDAwMAotI2RlZmluZSBSRUdfQ09BUlNFX0lOVF9USU1FICAgICAgICAgIDB4MzAxMgotI2RlZmluZSBSRUdfVlRfUElYX0NMS19ESVYgICAgICAgICAgIDB4MDMwMAotI2RlZmluZSBSRUdfVlRfU1lTX0NMS19ESVYgICAgICAgICAgIDB4MDMwMgotI2RlZmluZSBSRUdfUFJFX1BMTF9DTEtfRElWICAgICAgICAgIDB4MDMwNAotI2RlZmluZSBSRUdfUExMX01VTFRJUExJRVIgICAgICAgICAgIDB4MDMwNgotI2RlZmluZSBSRUdfT1BfUElYX0NMS19ESVYgICAgICAgICAgIDB4MDMwOAotI2RlZmluZSBSRUdfT1BfU1lTX0NMS19ESVYgICAgICAgICAgIDB4MDMwQQotI2RlZmluZSBSRUdfU0NBTEVfTSAgICAgICAgICAgICAgICAgIDB4MDQwNAotI2RlZmluZSBSRUdfRlJBTUVfTEVOR1RIX0xJTkVTICAgICAgIDB4MzAwQQotI2RlZmluZSBSRUdfTElORV9MRU5HVEhfUENLICAgICAgICAgIDB4MzAwQwotI2RlZmluZSBSRUdfWF9BRERSX1NUQVJUICAgICAgICAgICAgIDB4MzAwNAotI2RlZmluZSBSRUdfWV9BRERSX1NUQVJUICAgICAgICAgICAgIDB4MzAwMgotI2RlZmluZSBSRUdfWF9BRERSX0VORCAgICAgICAgICAgICAgIDB4MzAwOAotI2RlZmluZSBSRUdfWV9BRERSX0VORCAgICAgICAgICAgICAgIDB4MzAwNgotI2RlZmluZSBSRUdfWF9PVVRQVVRfU0laRSAgICAgICAgICAgIDB4MDM0QwotI2RlZmluZSBSRUdfWV9PVVRQVVRfU0laRSAgICAgICAgICAgIDB4MDM0RQotI2RlZmluZSBSRUdfRklORV9JTlRFR1JBVElPTl9USU1FICAgIDB4MzAxNAotI2RlZmluZSBSRUdfUk9XX1NQRUVEICAgICAgICAgICAgICAgIDB4MzAxNgotI2RlZmluZSBNVDlQMDEyX1JFR19SRVNFVF9SRUdJU1RFUiAgIDB4MzAxQQotI2RlZmluZSBNVDlQMDEyX1JFU0VUX1JFR0lTVEVSX1BXT04gIDB4MTBDQwotI2RlZmluZSBNVDlQMDEyX1JFU0VUX1JFR0lTVEVSX1BXT0ZGIDB4MTBDOAotI2RlZmluZSBSRUdfUkVBRF9NT0RFICAgICAgICAgICAgICAgIDB4MzA0MAotI2RlZmluZSBSRUdfR0xPQkFMX0dBSU4gICAgICAgICAgICAgIDB4MzA1RQotI2RlZmluZSBSRUdfVEVTVF9QQVRURVJOX01PREUgICAgICAgIDB4MzA3MAotCi0jZGVmaW5lIE1UOVAwMTJfUkVWXzcKLQotZW51bSBtdDlwMDEyX3Rlc3RfbW9kZSB7Ci0JVEVTVF9PRkYsCi0JVEVTVF8xLAotCVRFU1RfMiwKLQlURVNUXzMKLX07Ci0KLWVudW0gbXQ5cDAxMl9yZXNvbHV0aW9uIHsKLQlRVFJfU0laRSwKLQlGVUxMX1NJWkUsCi0JSU5WQUxJRF9TSVpFCi19OwotCi1lbnVtIG10OXAwMTJfcmVnX3VwZGF0ZSB7Ci0JLyogU2Vuc29yIGVnaXN0ZXJzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiAqLwotCVJFR19JTklULAotCS8qIFNlbnNvciBlZ2lzdGVycyB0aGF0IG5lZWRzIHBlcmlvZGljIEkyQyB3cml0ZXMgKi8KLQlVUERBVEVfUEVSSU9ESUMsCi0JLyogQWxsIHRoZSBzZW5zb3IgUmVnaXN0ZXJzIHdpbGwgYmUgdXBkYXRlZCAqLwotCVVQREFURV9BTEwsCi0JLyogTm90IHZhbGlkIHVwZGF0ZSAqLwotCVVQREFURV9JTlZBTElECi19OwotCi1lbnVtIG10OXAwMTJfc2V0dGluZyB7Ci0JUkVTX1BSRVZJRVcsCi0JUkVTX0NBUFRVUkUKLX07Ci0KLS8qIGFjdHVhdG9yJ3MgU2xhdmUgQWRkcmVzcyAqLwotI2RlZmluZSBNVDlQMDEyX0FGX0kyQ19BRERSICAgMHgwQQotCi0vKiBBRiBUb3RhbCBzdGVwcyBwYXJhbWV0ZXJzICovCi0jZGVmaW5lIE1UOVAwMTJfU1RFUFNfTkVBUl9UT19DTE9TRVNUX0lORiAgMjAKLSNkZWZpbmUgTVQ5UDAxMl9UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUiAgICAyMAotCi0jZGVmaW5lIE1UOVAwMTJfTVU1TTBfUFJFVklFV19EVU1NWV9QSVhFTFMgMAotI2RlZmluZSBNVDlQMDEyX01VNU0wX1BSRVZJRVdfRFVNTVlfTElORVMgIDAKLQotLyogVGltZSBpbiBtaWxpc2VjcyBmb3Igd2FpdGluZyBmb3IgdGhlIHNlbnNvciB0byByZXNldC4qLwotI2RlZmluZSBNVDlQMDEyX1JFU0VUX0RFTEFZX01TRUNTICAgNjYKLQotLyogZm9yIDIwIGZwcyBwcmV2aWV3ICovCi0jZGVmaW5lIE1UOVAwMTJfREVGQVVMVF9DTE9DS19SQVRFICAyNDAwMDAwMAotI2RlZmluZSBNVDlQMDEyX0RFRkFVTFRfTUFYX0ZQUyAgICAgMjYJLyogPz8/PyAqLwotCi1zdHJ1Y3QgbXQ5cDAxMl93b3JrIHsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKLX07Ci1zdGF0aWMgc3RydWN0IG10OXAwMTJfd29yayAqbXQ5cDAxMl9zZW5zb3J3Owotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50ICptdDlwMDEyX2NsaWVudDsKLQotc3RydWN0IG10OXAwMTJfY3RybCB7Ci0JY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNlbnNvcmRhdGE7Ci0KLQlpbnQgc2Vuc29ybW9kZTsKLQl1aW50MzJfdCBmcHNfZGl2aWRlcjsJLyogaW5pdCB0byAxICogMHgwMDAwMDQwMCAqLwotCXVpbnQzMl90IHBpY3RfZnBzX2RpdmlkZXI7CS8qIGluaXQgdG8gMSAqIDB4MDAwMDA0MDAgKi8KLQotCXVpbnQxNl90IGN1cnJfbGVuc19wb3M7Ci0JdWludDE2X3QgaW5pdF9jdXJyX2xlbnNfcG9zOwotCXVpbnQxNl90IG15X3JlZ19nYWluOwotCXVpbnQzMl90IG15X3JlZ19saW5lX2NvdW50OwotCi0JZW51bSBtdDlwMDEyX3Jlc29sdXRpb24gcHJldl9yZXM7Ci0JZW51bSBtdDlwMDEyX3Jlc29sdXRpb24gcGljdF9yZXM7Ci0JZW51bSBtdDlwMDEyX3Jlc29sdXRpb24gY3Vycl9yZXM7Ci0JZW51bSBtdDlwMDEyX3Rlc3RfbW9kZSBzZXRfdGVzdDsKLX07Ci0KLXN0YXRpYyB1aW50MTZfdCBiYW1fbWFjcm8sIGJhbV9pbmZpbml0ZTsKLXN0YXRpYyB1aW50MTZfdCBiYW1fc3RlcF9sb29rdXBfdGFibGVbTVQ5UDAxMl9UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUiArIDFdOwotc3RhdGljIHVpbnQxNl90IHVwZGF0ZV90eXBlID0gVVBEQVRFX1BFUklPRElDOwotc3RhdGljIHN0cnVjdCBtdDlwMDEyX2N0cmwgKm10OXAwMTJfY3RybDsKLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChtdDlwMDEyX3dhaXRfcXVldWUpOwotREVGSU5FX01VVEVYKG10OXAwMTJfbXV0KTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotc3RhdGljIGludCBtdDlwMDEyX2kyY19yeGRhdGEodW5zaWduZWQgc2hvcnQgc2FkZHIsIGludCBzbGVuZ3RoLAotCQkJICAgICAgdW5zaWduZWQgY2hhciAqcnhkYXRhLCBpbnQgcnhsZW5ndGgpCi17Ci0Jc3RydWN0IGkyY19tc2cgbXNnc1tdID0gewotCQl7Ci0JCQkuYWRkciA9IHNhZGRyLAotCQkJLmZsYWdzID0gMCwKLQkJCS5sZW4gPSBzbGVuZ3RoLAotCQkJLmJ1ZiA9IHJ4ZGF0YSwKLQkJfSwKLQkJewotCQkJLmFkZHIgPSBzYWRkciwKLQkJCS5mbGFncyA9IEkyQ19NX1JELAotCQkJLmxlbiA9IHJ4bGVuZ3RoLAotCQkJLmJ1ZiA9IHJ4ZGF0YSwKLQkJfSwKLQl9OwotCi0JaWYgKGkyY190cmFuc2ZlcihtdDlwMDEyX2NsaWVudC0+YWRhcHRlciwgbXNncywgMikgPCAwKSB7Ci0JCUNEQkcoIm10OXAwMTJfaTJjX3J4ZGF0YSBmYWlsZWQhXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX2kyY19yZWFkX2IodW5zaWduZWQgc2hvcnQgc2FkZHIsIHVuc2lnbmVkIGNoYXIgcmFkZHIsCi0JCQkJICB1bnNpZ25lZCBzaG9ydCAqcmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JaWYgKCFyZGF0YSkKLQkJcmV0dXJuIC1FSU87Ci0JcmMgPSBtdDlwMDEyX2kyY19yeGRhdGEoc2FkZHIsIDEsICZyYWRkciwgMSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCSpyZGF0YSA9IHJhZGRyOwotCWlmIChyYyA8IDApCi0JCUNEQkcoIm10OXAwMTJfaTJjX3JlYWRfYiBmYWlsZWQhXG4iKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfaTJjX3JlYWRfdyh1bnNpZ25lZCBzaG9ydCBzYWRkciwgdW5zaWduZWQgc2hvcnQgcmFkZHIsCi0JCQkJICB1bnNpZ25lZCBzaG9ydCAqcmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JdW5zaWduZWQgY2hhciBidWZbNF07Ci0KLQlpZiAoIXJkYXRhKQotCQlyZXR1cm4gLUVJTzsKLQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQotCWJ1ZlswXSA9IChyYWRkciAmIDB4RkYwMCkgPj4gODsKLQlidWZbMV0gPSAocmFkZHIgJiAweDAwRkYpOwotCi0JcmMgPSBtdDlwMDEyX2kyY19yeGRhdGEoc2FkZHIsIDIsIGJ1ZiwgMik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JKnJkYXRhID0gYnVmWzBdIDw8IDggfCBidWZbMV07Ci0KLQlpZiAocmMgPCAwKQotCQlDREJHKCJtdDlwMDEyX2kyY19yZWFkIGZhaWxlZCFcbiIpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX2kyY190eGRhdGEodW5zaWduZWQgc2hvcnQgc2FkZHIsIHVuc2lnbmVkIGNoYXIgKnR4ZGF0YSwKLQkJCQkgIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGkyY19tc2cgbXNnW10gPSB7Ci0JCXsKLQkJIC5hZGRyID0gc2FkZHIsCi0JCSAuZmxhZ3MgPSAwLAotCQkgLmxlbiA9IGxlbmd0aCwKLQkJIC5idWYgPSB0eGRhdGEsCi0JCSB9LAotCX07Ci0KLQlpZiAoaTJjX3RyYW5zZmVyKG10OXAwMTJfY2xpZW50LT5hZGFwdGVyLCBtc2csIDEpIDwgMCkgewotCQlDREJHKCJtdDlwMDEyX2kyY190eGRhdGEgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfaTJjX3dyaXRlX2IodW5zaWduZWQgc2hvcnQgc2FkZHIsIHVuc2lnbmVkIHNob3J0IGJhZGRyLAotCQkJCSAgIHVuc2lnbmVkIHNob3J0IGJkYXRhKQotewotCWludDMyX3QgcmMgPSAtRUlPOwotCXVuc2lnbmVkIGNoYXIgYnVmWzJdOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9IGJhZGRyOwotCWJ1ZlsxXSA9IGJkYXRhOwotCXJjID0gbXQ5cDAxMl9pMmNfdHhkYXRhKHNhZGRyLCBidWYsIDIpOwotCi0JaWYgKHJjIDwgMCkKLQkJQ0RCRygiaTJjX3dyaXRlIGZhaWxlZCwgc2FkZHIgPSAweCV4IGFkZHIgPSAweCV4LCB2YWwgPTB4JXghXG4iLAotCQkgICAgIHNhZGRyLCBiYWRkciwgYmRhdGEpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX2kyY193cml0ZV93KHVuc2lnbmVkIHNob3J0IHNhZGRyLCB1bnNpZ25lZCBzaG9ydCB3YWRkciwKLQkJCQkgICB1bnNpZ25lZCBzaG9ydCB3ZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gLUVJTzsKLQl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKLQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZbMF0gPSAod2FkZHIgJiAweEZGMDApID4+IDg7Ci0JYnVmWzFdID0gKHdhZGRyICYgMHgwMEZGKTsKLQlidWZbMl0gPSAod2RhdGEgJiAweEZGMDApID4+IDg7Ci0JYnVmWzNdID0gKHdkYXRhICYgMHgwMEZGKTsKLQotCXJjID0gbXQ5cDAxMl9pMmNfdHhkYXRhKHNhZGRyLCBidWYsIDQpOwotCi0JaWYgKHJjIDwgMCkKLQkJQ0RCRygiaTJjX3dyaXRlX3cgZmFpbGVkLCBhZGRyID0gMHgleCwgdmFsID0gMHgleCFcbiIsCi0JCSAgICAgd2FkZHIsIHdkYXRhKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5cDAxMl9pMmNfd3JpdGVfd190YWJsZShzdHJ1Y3QgbXQ5cDAxMl9pMmNfcmVnX2NvbmYgY29uc3QKLQkJCQkJICpyZWdfY29uZl90YmwsIGludCBudW0pCi17Ci0JaW50IGk7Ci0JaW50MzJfdCByYyA9IC1FSU87Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJcmMgPSBtdDlwMDEyX2kyY193cml0ZV93KG10OXAwMTJfY2xpZW50LT5hZGRyLAotCQkJCQkgcmVnX2NvbmZfdGJsLT53YWRkciwKLQkJCQkJIHJlZ19jb25mX3RibC0+d2RhdGEpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0JCXJlZ19jb25mX3RibCsrOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5cDAxMl90ZXN0KGVudW0gbXQ5cDAxMl90ZXN0X21vZGUgbW8pCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsCi0JCQkJIFJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCSBHUk9VUEVEX1BBUkFNRVRFUl9IT0xEKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAobW8gPT0gVEVTVF9PRkYpCi0JCXJldHVybiAwOwotCWVsc2UgewotCQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3dfdGFibGUobXQ5cDAxMl9yZWdzLnR0YmwsCi0JCQkJCSAgICAgICBtdDlwMDEyX3JlZ3MudHRibF9zaXplKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsCi0JCQkJCSBSRUdfVEVTVF9QQVRURVJOX01PREUsICh1aW50MTZfdCkgbW8pOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCX0KLQotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwKLQkJCQkgUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJIEdST1VQRURfUEFSQU1FVEVSX1VQREFURSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX2xlbnNfc2hhZGluZ19lbmFibGUodWludDhfdCBpc19lbmFibGUpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlDREJHKCIlczogZW50ZXJlZC4gZW5hYmxlID0gJWRcbiIsIF9fZnVuY19fLCBpc19lbmFibGUpOwotCi0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV93KG10OXAwMTJfY2xpZW50LT5hZGRyLAotCQkJCSBSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQkgR1JPVVBFRF9QQVJBTUVURVJfSE9MRCk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV93KG10OXAwMTJfY2xpZW50LT5hZGRyLCAweDM3ODAsCi0JCQkJICgodWludDE2X3QpIGlzX2VuYWJsZSkgPDwgMTUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwKLQkJCQkgUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJIEdST1VQRURfUEFSQU1FVEVSX1VQREFURSk7Ci0KLQlDREJHKCIlczogZXhpdGluZy4gcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfc2V0X2xjKHZvaWQpCi17Ci0JaW50MzJfdCByYzsKLQotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfd190YWJsZShtdDlwMDEyX3JlZ3MucmZ0YmwsCi0JCQkJICAgICAgIG10OXAwMTJfcmVncy5yZnRibF9zaXplKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgbXQ5cDAxMl9nZXRfcGljdF9mcHModWludDE2X3QgZnBzLCB1aW50MTZfdCAqcGZwcykKLXsKLQkvKiBpbnB1dCBmcHMgaXMgcHJldmlldyBmcHMgaW4gUTggZm9ybWF0ICovCi0JdWludDMyX3QgZGl2aWRlcjsJLypRMTAgKi8KLQl1aW50MzJfdCBwY2xrX211bHQ7CS8qUTEwICovCi0KLQlpZiAobXQ5cDAxMl9jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkgewotCQlkaXZpZGVyID0gKHVpbnQzMl90KQotCQkgICAgKCgobXQ5cDAxMl9yZWdzLnJlZ19wYXRbUkVTX1BSRVZJRVddLmZyYW1lX2xlbmd0aF9saW5lcyAqCi0JCSAgICAgICBtdDlwMDEyX3JlZ3MucmVnX3BhdFtSRVNfUFJFVklFV10ubGluZV9sZW5ndGhfcGNrKSAqCi0JCSAgICAgIDB4MDAwMDA0MDApIC8KLQkJICAgICAobXQ5cDAxMl9yZWdzLnJlZ19wYXRbUkVTX0NBUFRVUkVdLmZyYW1lX2xlbmd0aF9saW5lcyAqCi0JCSAgICAgIG10OXAwMTJfcmVncy5yZWdfcGF0W1JFU19DQVBUVVJFXS5saW5lX2xlbmd0aF9wY2spKTsKLQotCQlwY2xrX211bHQgPQotCQkgICAgKHVpbnQzMl90KSAoKG10OXAwMTJfcmVncy5yZWdfcGF0W1JFU19DQVBUVVJFXS4KLQkJCQkgcGxsX211bHRpcGxpZXIgKiAweDAwMDAwNDAwKSAvCi0JCQkJKG10OXAwMTJfcmVncy5yZWdfcGF0W1JFU19QUkVWSUVXXS4KLQkJCQkgcGxsX211bHRpcGxpZXIpKTsKLQl9IGVsc2UgewotCQkvKiBmdWxsIHNpemUgcmVzb2x1dGlvbiB1c2VkIGZvciBwcmV2aWV3LiAqLwotCQlkaXZpZGVyID0gMHgwMDAwMDQwMDsJLyoxLjAgKi8KLQkJcGNsa19tdWx0ID0gMHgwMDAwMDQwMDsJLyoxLjAgKi8KLQl9Ci0KLQkvKiBWZXJpZnkgUENMSyBzZXR0aW5ncyBhbmQgZnJhbWUgc2l6ZXMuICovCi0JKnBmcHMgPSAodWludDE2X3QpIChmcHMgKiBkaXZpZGVyICogcGNsa19tdWx0IC8gMHgwMDAwMDQwMCAvCi0JCQkgICAgMHgwMDAwMDQwMCk7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBtdDlwMDEyX2dldF9wcmV2X2xpbmVzX3BmKHZvaWQpCi17Ci0JaWYgKG10OXAwMTJfY3RybC0+cHJldl9yZXMgPT0gUVRSX1NJWkUpCi0JCXJldHVybiBtdDlwMDEyX3JlZ3MucmVnX3BhdFtSRVNfUFJFVklFV10uZnJhbWVfbGVuZ3RoX2xpbmVzOwotCWVsc2UKLQkJcmV0dXJuIG10OXAwMTJfcmVncy5yZWdfcGF0W1JFU19DQVBUVVJFXS5mcmFtZV9sZW5ndGhfbGluZXM7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBtdDlwMDEyX2dldF9wcmV2X3BpeGVsc19wbCh2b2lkKQotewotCWlmIChtdDlwMDEyX2N0cmwtPnByZXZfcmVzID09IFFUUl9TSVpFKQotCQlyZXR1cm4gbXQ5cDAxMl9yZWdzLnJlZ19wYXRbUkVTX1BSRVZJRVddLmxpbmVfbGVuZ3RoX3BjazsKLQllbHNlCi0JCXJldHVybiBtdDlwMDEyX3JlZ3MucmVnX3BhdFtSRVNfQ0FQVFVSRV0ubGluZV9sZW5ndGhfcGNrOwotfQotCi1zdGF0aWMgdWludDE2X3QgbXQ5cDAxMl9nZXRfcGljdF9saW5lc19wZih2b2lkKQotewotCXJldHVybiBtdDlwMDEyX3JlZ3MucmVnX3BhdFtSRVNfQ0FQVFVSRV0uZnJhbWVfbGVuZ3RoX2xpbmVzOwotfQotCi1zdGF0aWMgdWludDE2X3QgbXQ5cDAxMl9nZXRfcGljdF9waXhlbHNfcGwodm9pZCkKLXsKLQlyZXR1cm4gbXQ5cDAxMl9yZWdzLnJlZ19wYXRbUkVTX0NBUFRVUkVdLmxpbmVfbGVuZ3RoX3BjazsKLX0KLQotc3RhdGljIHVpbnQzMl90IG10OXAwMTJfZ2V0X3BpY3RfbWF4X2V4cF9sYyh2b2lkKQotewotCXVpbnQxNl90IHNuYXBzaG90X2xpbmVzX3Blcl9mcmFtZTsKLQotCWlmIChtdDlwMDEyX2N0cmwtPnBpY3RfcmVzID09IFFUUl9TSVpFKQotCQlzbmFwc2hvdF9saW5lc19wZXJfZnJhbWUgPQotCQkgICAgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbUkVTX1BSRVZJRVddLmZyYW1lX2xlbmd0aF9saW5lcyAtIDE7Ci0JZWxzZQotCQlzbmFwc2hvdF9saW5lc19wZXJfZnJhbWUgPQotCQkgICAgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbUkVTX0NBUFRVUkVdLmZyYW1lX2xlbmd0aF9saW5lcyAtIDE7Ci0KLQlyZXR1cm4gc25hcHNob3RfbGluZXNfcGVyX2ZyYW1lICogMjQ7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfc2V0X2ZwcyhzdHJ1Y3QgZnBzX2NmZyAqZnBzKQotewotCS8qIGlucHV0IGlzIG5ldyBmcHMgaW4gUTEwIGZvcm1hdCAqLwotCWludDMyX3QgcmMgPSAwOwotCWVudW0gbXQ5cDAxMl9zZXR0aW5nIHNldHRpbmc7Ci0KLQltdDlwMDEyX2N0cmwtPmZwc19kaXZpZGVyID0gZnBzLT5mcHNfZGl2OwotCW10OXAwMTJfY3RybC0+cGljdF9mcHNfZGl2aWRlciA9IGZwcy0+cGljdF9mcHNfZGl2OwotCi0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV93KG10OXAwMTJfY2xpZW50LT5hZGRyLAotCQkJCSBSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQkgR1JPVVBFRF9QQVJBTUVURVJfSE9MRCk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCWlmIChtdDlwMDEyX2N0cmwtPnNlbnNvcm1vZGUgPT0gU0VOU09SX1BSRVZJRVdfTU9ERSkKLQkJc2V0dGluZyA9IFJFU19QUkVWSUVXOwotCWVsc2UKLQkJc2V0dGluZyA9IFJFU19DQVBUVVJFOwotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwKLQkJCVJFR19GUkFNRV9MRU5HVEhfTElORVMsCi0JCQkobXQ5cDAxMl9yZWdzLnJlZ19wYXRbc2V0dGluZ10uZnJhbWVfbGVuZ3RoX2xpbmVzICoKLQkJCWZwcy0+ZnBzX2RpdiAvIDB4MDAwMDA0MDApKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsCi0JCQkJIFJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCSBHUk9VUEVEX1BBUkFNRVRFUl9VUERBVEUpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX3dyaXRlX2V4cF9nYWluKHVpbnQxNl90IGdhaW4sIHVpbnQzMl90IGxpbmUpCi17Ci0JdWludDE2X3QgbWF4X2xlZ2FsX2dhaW4gPSAweDAxRkY7Ci0JdWludDMyX3QgbGluZV9sZW5ndGhfcmF0aW8gPSAweDAwMDAwNDAwOwotCWVudW0gbXQ5cDAxMl9zZXR0aW5nIHNldHRpbmc7Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlDREJHKCJMaW5lOiVkIG10OXAwMTJfd3JpdGVfZXhwX2dhaW4gXG4iLCBfX0xJTkVfXyk7Ci0KLQlpZiAobXQ5cDAxMl9jdHJsLT5zZW5zb3Jtb2RlID09IFNFTlNPUl9QUkVWSUVXX01PREUpIHsKLQkJbXQ5cDAxMl9jdHJsLT5teV9yZWdfZ2FpbiA9IGdhaW47Ci0JCW10OXAwMTJfY3RybC0+bXlfcmVnX2xpbmVfY291bnQgPSAodWludDE2X3QpIGxpbmU7Ci0JfQotCi0JaWYgKGdhaW4gPiBtYXhfbGVnYWxfZ2FpbikgewotCQlDREJHKCJNYXggbGVnYWwgZ2FpbiBMaW5lOiVkIFxuIiwgX19MSU5FX18pOwotCQlnYWluID0gbWF4X2xlZ2FsX2dhaW47Ci0JfQotCi0JLyogVmVyaWZ5IG5vIG92ZXJmbG93ICovCi0JaWYgKG10OXAwMTJfY3RybC0+c2Vuc29ybW9kZSA9PSBTRU5TT1JfUFJFVklFV19NT0RFKSB7Ci0JCWxpbmUgPSAodWludDMyX3QpIChsaW5lICogbXQ5cDAxMl9jdHJsLT5mcHNfZGl2aWRlciAvCi0JCQkJICAgMHgwMDAwMDQwMCk7Ci0JCXNldHRpbmcgPSBSRVNfUFJFVklFVzsKLQl9IGVsc2UgewotCQlsaW5lID0gKHVpbnQzMl90KSAobGluZSAqIG10OXAwMTJfY3RybC0+cGljdF9mcHNfZGl2aWRlciAvCi0JCQkJICAgMHgwMDAwMDQwMCk7Ci0JCXNldHRpbmcgPSBSRVNfQ0FQVFVSRTsKLQl9Ci0KLQkvKiBTZXQgZGlnaXRhbCBnYWluIHRvIDEgKi8KLSNpZmRlZiBNVDlQMDEyX1JFVl83Ci0JZ2FpbiB8PSAweDEwMDA7Ci0jZWxzZQotCWdhaW4gfD0gMHgwMjAwOwotI2VuZGlmCi0KLQlpZiAoKG10OXAwMTJfcmVncy5yZWdfcGF0W3NldHRpbmddLmZyYW1lX2xlbmd0aF9saW5lcyAtIDEpIDwgbGluZSkgewotCQlsaW5lX2xlbmd0aF9yYXRpbyA9ICh1aW50MzJfdCkgKGxpbmUgKiAweDAwMDAwNDAwKSAvCi0JCSAgICAobXQ5cDAxMl9yZWdzLnJlZ19wYXRbc2V0dGluZ10uZnJhbWVfbGVuZ3RoX2xpbmVzIC0gMSk7Ci0JfSBlbHNlCi0JCWxpbmVfbGVuZ3RoX3JhdGlvID0gMHgwMDAwMDQwMDsKLQotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwgUkVHX0dMT0JBTF9HQUlOLCBnYWluKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIm10OXAwMTJfaTJjX3dyaXRlX3cgZmFpbGVkLi4uIExpbmU6JWQgXG4iLCBfX0xJTkVfXyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsCi0JCQkJIFJFR19DT0FSU0VfSU5UX1RJTUUsIGxpbmUpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygibXQ5cDAxMl9pMmNfd3JpdGVfdyBmYWlsZWQuLi4gTGluZTolZCBcbiIsIF9fTElORV9fKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCUNEQkcoIm10OXAwMTJfd3JpdGVfZXhwX2dhaW46IGdhaW4gPSAlZCwgbGluZSA9ICVkXG4iLCBnYWluLCBsaW5lKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5cDAxMl9zZXRfcGljdF9leHBfZ2Fpbih1aW50MTZfdCBnYWluLCB1aW50MzJfdCBsaW5lKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JQ0RCRygiTGluZTolZCBtdDlwMDEyX3NldF9waWN0X2V4cF9nYWluIFxuIiwgX19MSU5FX18pOwotCi0JcmMgPSBtdDlwMDEyX3dyaXRlX2V4cF9nYWluKGdhaW4sIGxpbmUpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiTGluZTolZCBtdDlwMDEyX3NldF9waWN0X2V4cF9nYWluIGZhaWxlZC4uLiBcbiIsCi0JCSAgICAgX19MSU5FX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV93KG10OXAwMTJfY2xpZW50LT5hZGRyLAotCQkJCSBNVDlQMDEyX1JFR19SRVNFVF9SRUdJU1RFUiwgMHgxMENDIHwgMHgwMDAyKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIm10OXAwMTJfaTJjX3dyaXRlX3cgZmFpbGVkLi4uIExpbmU6JWQgXG4iLCBfX0xJTkVfXyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQltZGVsYXkoNSk7Ci0KLQkvKiBjYW1lcmFfdGltZWRfd2FpdChzbmFwc2hvdF93YWl0KmV4cG9zdXJlX3JhdGlvKTsgKi8KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfc2V0dGluZyhlbnVtIG10OXAwMTJfcmVnX3VwZGF0ZSBydXBkYXRlLAotCQkJICAgICAgIGVudW0gbXQ5cDAxMl9zZXR0aW5nIHJ0KQotewotCWludDMyX3QgcmMgPSAwOwotCi0Jc3dpdGNoIChydXBkYXRlKSB7Ci0JY2FzZSBVUERBVEVfUEVSSU9ESUM6Ci0JCWlmIChydCA9PSBSRVNfUFJFVklFVyB8fCBydCA9PSBSRVNfQ0FQVFVSRSkgewotCQkJc3RydWN0IG10OXAwMTJfaTJjX3JlZ19jb25mIHBwY190YmxbXSA9IHsKLQkJCQl7UkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJIEdST1VQRURfUEFSQU1FVEVSX0hPTER9LAotCQkJCXtSRUdfUk9XX1NQRUVELAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ucm93X3NwZWVkfSwKLQkJCQl7UkVHX1hfQUREUl9TVEFSVCwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnhfYWRkcl9zdGFydH0sCi0JCQkJe1JFR19YX0FERFJfRU5ELAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ueF9hZGRyX2VuZH0sCi0JCQkJe1JFR19ZX0FERFJfU1RBUlQsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS55X2FkZHJfc3RhcnR9LAotCQkJCXtSRUdfWV9BRERSX0VORCwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnlfYWRkcl9lbmR9LAotCQkJCXtSRUdfUkVBRF9NT0RFLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ucmVhZF9tb2RlfSwKLQkJCQl7UkVHX1NDQUxFX00sIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS5zY2FsZV9tfSwKLQkJCQl7UkVHX1hfT1VUUFVUX1NJWkUsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS54X291dHB1dF9zaXplfSwKLQkJCQl7UkVHX1lfT1VUUFVUX1NJWkUsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS55X291dHB1dF9zaXplfSwKLQotCQkJCXtSRUdfTElORV9MRU5HVEhfUENLLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ubGluZV9sZW5ndGhfcGNrfSwKLQkJCQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FUywKLQkJCQkgKG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS5mcmFtZV9sZW5ndGhfbGluZXMgKgotCQkJCSAgbXQ5cDAxMl9jdHJsLT5mcHNfZGl2aWRlciAvIDB4MDAwMDA0MDApfSwKLQkJCQl7UkVHX0NPQVJTRV9JTlRfVElNRSwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLmNvYXJzZV9pbnRfdGltZX0sCi0JCQkJe1JFR19GSU5FX0lOVEVHUkFUSU9OX1RJTUUsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS5maW5lX2ludF90aW1lfSwKLQkJCQl7UkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJIEdST1VQRURfUEFSQU1FVEVSX1VQREFURX0sCi0JCQl9OwotCQkJaWYgKHVwZGF0ZV90eXBlID09IFJFR19JTklUKSB7Ci0JCQkJdXBkYXRlX3R5cGUgPSBydXBkYXRlOwotCQkJCXJldHVybiByYzsKLQkJCX0KLQkJCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfd190YWJsZSgmcHBjX3RibFswXSwKLQkJCQkJCUFSUkFZX1NJWkUocHBjX3RibCkpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCXJjID0gbXQ5cDAxMl90ZXN0KG10OXAwMTJfY3RybC0+c2V0X3Rlc3QpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwKLQkJCQkJCSBNVDlQMDEyX1JFR19SRVNFVF9SRUdJU1RFUiwKLQkJCQkJCSBNVDlQMDEyX1JFU0VUX1JFR0lTVEVSX1BXT04gfAotCQkJCQkJIDB4MDAwMik7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJbWRlbGF5KDUpOwkvKiAxNT8gd2FpdCBmb3Igc2Vuc29yIHRvIHRyYW5zaXRpb24gKi8KLQotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCWJyZWFrOwkJLyogVVBEQVRFX1BFUklPRElDICovCi0KLQljYXNlIFJFR19JTklUOgotCQlpZiAocnQgPT0gUkVTX1BSRVZJRVcgfHwgcnQgPT0gUkVTX0NBUFRVUkUpIHsKLQkJCXN0cnVjdCBtdDlwMDEyX2kyY19yZWdfY29uZiBpcGNfdGJsMVtdID0gewotCQkJCXtNVDlQMDEyX1JFR19SRVNFVF9SRUdJU1RFUiwKLQkJCQkgTVQ5UDAxMl9SRVNFVF9SRUdJU1RFUl9QV09GRn0sCi0JCQkJe1JFR19WVF9QSVhfQ0xLX0RJViwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnZ0X3BpeF9jbGtfZGl2fSwKLQkJCQl7UkVHX1ZUX1NZU19DTEtfRElWLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0udnRfc3lzX2Nsa19kaXZ9LAotCQkJCXtSRUdfUFJFX1BMTF9DTEtfRElWLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ucHJlX3BsbF9jbGtfZGl2fSwKLQkJCQl7UkVHX1BMTF9NVUxUSVBMSUVSLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ucGxsX211bHRpcGxpZXJ9LAotCQkJCXtSRUdfT1BfUElYX0NMS19ESVYsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS5vcF9waXhfY2xrX2Rpdn0sCi0JCQkJe1JFR19PUF9TWVNfQ0xLX0RJViwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLm9wX3N5c19jbGtfZGl2fSwKLSNpZmRlZiBNVDlQMDEyX1JFVl83Ci0JCQkJezB4MzBCMCwgMHgwMDAxfSwKLQkJCQl7MHgzMDhFLCAweEUwNjB9LAotCQkJCXsweDMwOTIsIDB4MEE1Mn0sCi0JCQkJezB4MzA5NCwgMHg0NjU2fSwKLQkJCQl7MHgzMDk2LCAweDU2NTJ9LAotCQkJCXsweDMwQ0EsIDB4ODAwNn0sCi0JCQkJezB4MzEyQSwgMHhERDAyfSwKLQkJCQl7MHgzMTJDLCAweDAwRTR9LAotCQkJCXsweDMxNzAsIDB4Mjk5QX0sCi0jZW5kaWYKLQkJCQkvKiBvcHRpbWl6ZWQgc2V0dGluZ3MgZm9yIG5vaXNlICovCi0JCQkJezB4MzA4OCwgMHg2RkY2fSwKLQkJCQl7MHgzMTU0LCAweDAyODJ9LAotCQkJCXsweDMxNTYsIDB4MDM4MX0sCi0JCQkJezB4MzE2MiwgMHgwNENFfSwKLQkJCQl7MHgwMjA0LCAweDAwMTB9LAotCQkJCXsweDAyMDYsIDB4MDAxMH0sCi0JCQkJezB4MDIwOCwgMHgwMDEwfSwKLQkJCQl7MHgwMjBBLCAweDAwMTB9LAotCQkJCXsweDAyMEMsIDB4MDAxMH0sCi0JCQkJe01UOVAwMTJfUkVHX1JFU0VUX1JFR0lTVEVSLAotCQkJCSBNVDlQMDEyX1JFU0VUX1JFR0lTVEVSX1BXT059LAotCQkJfTsKLQotCQkJc3RydWN0IG10OXAwMTJfaTJjX3JlZ19jb25mIGlwY190YmwyW10gPSB7Ci0JCQkJe01UOVAwMTJfUkVHX1JFU0VUX1JFR0lTVEVSLAotCQkJCSBNVDlQMDEyX1JFU0VUX1JFR0lTVEVSX1BXT0ZGfSwKLQkJCQl7UkVHX1ZUX1BJWF9DTEtfRElWLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0udnRfcGl4X2Nsa19kaXZ9LAotCQkJCXtSRUdfVlRfU1lTX0NMS19ESVYsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS52dF9zeXNfY2xrX2Rpdn0sCi0JCQkJe1JFR19QUkVfUExMX0NMS19ESVYsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS5wcmVfcGxsX2Nsa19kaXZ9LAotCQkJCXtSRUdfUExMX01VTFRJUExJRVIsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS5wbGxfbXVsdGlwbGllcn0sCi0JCQkJe1JFR19PUF9QSVhfQ0xLX0RJViwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLm9wX3BpeF9jbGtfZGl2fSwKLQkJCQl7UkVHX09QX1NZU19DTEtfRElWLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ub3Bfc3lzX2Nsa19kaXZ9LAotI2lmZGVmIE1UOVAwMTJfUkVWXzcKLQkJCQl7MHgzMEIwLCAweDAwMDF9LAotCQkJCXsweDMwOEUsIDB4RTA2MH0sCi0JCQkJezB4MzA5MiwgMHgwQTUyfSwKLQkJCQl7MHgzMDk0LCAweDQ2NTZ9LAotCQkJCXsweDMwOTYsIDB4NTY1Mn0sCi0JCQkJezB4MzBDQSwgMHg4MDA2fSwKLQkJCQl7MHgzMTJBLCAweEREMDJ9LAotCQkJCXsweDMxMkMsIDB4MDBFNH0sCi0JCQkJezB4MzE3MCwgMHgyOTlBfSwKLSNlbmRpZgotCQkJCS8qIG9wdGltaXplZCBzZXR0aW5ncyBmb3Igbm9pc2UgKi8KLQkJCQl7MHgzMDg4LCAweDZGRjZ9LAotCQkJCXsweDMxNTQsIDB4MDI4Mn0sCi0JCQkJezB4MzE1NiwgMHgwMzgxfSwKLQkJCQl7MHgzMTYyLCAweDA0Q0V9LAotCQkJCXsweDAyMDQsIDB4MDAxMH0sCi0JCQkJezB4MDIwNiwgMHgwMDEwfSwKLQkJCQl7MHgwMjA4LCAweDAwMTB9LAotCQkJCXsweDAyMEEsIDB4MDAxMH0sCi0JCQkJezB4MDIwQywgMHgwMDEwfSwKLQkJCQl7TVQ5UDAxMl9SRUdfUkVTRVRfUkVHSVNURVIsCi0JCQkJIE1UOVAwMTJfUkVTRVRfUkVHSVNURVJfUFdPTn0sCi0JCQl9OwotCi0JCQlzdHJ1Y3QgbXQ5cDAxMl9pMmNfcmVnX2NvbmYgaXBjX3RibDNbXSA9IHsKLQkJCQl7UkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJIEdST1VQRURfUEFSQU1FVEVSX0hPTER9LAotCQkJCS8qIFNldCBwcmV2aWV3IG9yIHNuYXBzaG90IG1vZGUgKi8KLQkJCQl7UkVHX1JPV19TUEVFRCwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnJvd19zcGVlZH0sCi0JCQkJe1JFR19YX0FERFJfU1RBUlQsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS54X2FkZHJfc3RhcnR9LAotCQkJCXtSRUdfWF9BRERSX0VORCwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnhfYWRkcl9lbmR9LAotCQkJCXtSRUdfWV9BRERSX1NUQVJULAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ueV9hZGRyX3N0YXJ0fSwKLQkJCQl7UkVHX1lfQUREUl9FTkQsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS55X2FkZHJfZW5kfSwKLQkJCQl7UkVHX1JFQURfTU9ERSwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnJlYWRfbW9kZX0sCi0JCQkJe1JFR19TQ0FMRV9NLCBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0uc2NhbGVfbX0sCi0JCQkJe1JFR19YX09VVFBVVF9TSVpFLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ueF9vdXRwdXRfc2l6ZX0sCi0JCQkJe1JFR19ZX09VVFBVVF9TSVpFLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ueV9vdXRwdXRfc2l6ZX0sCi0JCQkJe1JFR19MSU5FX0xFTkdUSF9QQ0ssCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS5saW5lX2xlbmd0aF9wY2t9LAotCQkJCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0uZnJhbWVfbGVuZ3RoX2xpbmVzfSwKLQkJCQl7UkVHX0NPQVJTRV9JTlRfVElNRSwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLmNvYXJzZV9pbnRfdGltZX0sCi0JCQkJe1JFR19GSU5FX0lOVEVHUkFUSU9OX1RJTUUsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS5maW5lX2ludF90aW1lfSwKLQkJCQl7UkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJIEdST1VQRURfUEFSQU1FVEVSX1VQREFURX0sCi0JCQl9OwotCi0JCQkvKiByZXNldCBmcHNfZGl2aWRlciAqLwotCQkJbXQ5cDAxMl9jdHJsLT5mcHNfZGl2aWRlciA9IDEgKiAweDA0MDA7Ci0KLQkJCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfd190YWJsZSgmaXBjX3RibDFbMF0sCi0JCQkJCQkgICAgICAgQVJSQVlfU0laRShpcGNfdGJsMSkpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfd190YWJsZSgmaXBjX3RibDJbMF0sCi0JCQkJCQkgICAgICAgQVJSQVlfU0laRShpcGNfdGJsMikpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCW1kZWxheSg1KTsKLQotCQkJcmMgPSBtdDlwMDEyX2kyY193cml0ZV93X3RhYmxlKCZpcGNfdGJsM1swXSwKLQkJCQkJCSAgICAgICBBUlJBWV9TSVpFKGlwY190YmwzKSk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJLyogbG9hZCBsZW5zIHNoYWRpbmcgKi8KLQkJCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwKLQkJCQkJCSBSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQkJCSBHUk9VUEVEX1BBUkFNRVRFUl9IT0xEKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlyYyA9IG10OXAwMTJfc2V0X2xjKCk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJcmMgPSBtdDlwMDEyX2kyY193cml0ZV93KG10OXAwMTJfY2xpZW50LT5hZGRyLAotCQkJCQkJIFJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCQkJIEdST1VQRURfUEFSQU1FVEVSX1VQREFURSk7Ci0KLQkJCWlmIChyYyA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQl9Ci0JCXVwZGF0ZV90eXBlID0gcnVwZGF0ZTsKLQkJYnJlYWs7CQkvKiBjYXNlIFJFR19JTklUOiAqLwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9CQkJLyogc3dpdGNoIChydXBkYXRlKSAqLwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX3ZpZGVvX2NvbmZpZyhpbnQgbW9kZSwgaW50IHJlcykKLXsKLQlpbnQzMl90IHJjOwotCi0Jc3dpdGNoIChyZXMpIHsKLQljYXNlIFFUUl9TSVpFOgotCQlyYyA9IG10OXAwMTJfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsIFJFU19QUkVWSUVXKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlDREJHKCJtdDlwMDEyIHNlbnNvciBjb25maWd1cmF0aW9uIGRvbmUhXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEZVTExfU0laRToKLQkJcmMgPSBtdDlwMDEyX3NldHRpbmcoVVBEQVRFX1BFUklPRElDLCBSRVNfQ0FQVFVSRSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gMDsKLQl9CQkJLyogc3dpdGNoICovCi0KLQltdDlwMDEyX2N0cmwtPnByZXZfcmVzID0gcmVzOwotCW10OXAwMTJfY3RybC0+Y3Vycl9yZXMgPSByZXM7Ci0JbXQ5cDAxMl9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQotCXJjID0gbXQ5cDAxMl93cml0ZV9leHBfZ2FpbihtdDlwMDEyX2N0cmwtPm15X3JlZ19nYWluLAotCQkJCSAgICBtdDlwMDEyX2N0cmwtPm15X3JlZ19saW5lX2NvdW50KTsKLQotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwKLQkJCQkgTVQ5UDAxMl9SRUdfUkVTRVRfUkVHSVNURVIsIDB4MTBjYyB8IDB4MDAwMik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfc25hcHNob3RfY29uZmlnKGludCBtb2RlKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JcmMgPSBtdDlwMDEyX3NldHRpbmcoVVBEQVRFX1BFUklPRElDLCBSRVNfQ0FQVFVSRSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JbXQ5cDAxMl9jdHJsLT5jdXJyX3JlcyA9IG10OXAwMTJfY3RybC0+cGljdF9yZXM7Ci0KLQltdDlwMDEyX2N0cmwtPnNlbnNvcm1vZGUgPSBtb2RlOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX3Jhd19zbmFwc2hvdF9jb25maWcoaW50IG1vZGUpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlyYyA9IG10OXAwMTJfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsIFJFU19DQVBUVVJFKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQltdDlwMDEyX2N0cmwtPmN1cnJfcmVzID0gbXQ5cDAxMl9jdHJsLT5waWN0X3JlczsKLQotCW10OXAwMTJfY3RybC0+c2Vuc29ybW9kZSA9IG1vZGU7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfcG93ZXJfZG93bih2b2lkKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV93KG10OXAwMTJfY2xpZW50LT5hZGRyLAotCQkJCSBNVDlQMDEyX1JFR19SRVNFVF9SRUdJU1RFUiwKLQkJCQkgTVQ5UDAxMl9SRVNFVF9SRUdJU1RFUl9QV09GRik7Ci0KLQltZGVsYXkoNSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX21vdmVfZm9jdXMoaW50IGRpcmVjdGlvbiwgaW50MzJfdCBudW1fc3RlcHMpCi17Ci0JaW50MzJfdCByYzsKLQlpbnQxNl90IHN0ZXBfZGlyZWN0aW9uOwotCWludDE2X3QgYWN0dWFsX3N0ZXA7Ci0JaW50MTZfdCBuZXh0X3Bvc2l0aW9uOwotCXVpbnQ4X3QgY29kZV92YWw7Ci0JdWludDhfdCB0aW1lX291dDsKLQl1aW50OF90IHRlbXBfcG9zOwotCi0JdWludDE2X3QgYWN0dWFsX3Bvc2l0aW9uX3RhcmdldDsKLQlpZiAobnVtX3N0ZXBzID4gTVQ5UDAxMl9UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUikKLQkJbnVtX3N0ZXBzID0gTVQ5UDAxMl9UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUjsKLQllbHNlIGlmIChudW1fc3RlcHMgPT0gMCkgewotCQlDREJHKCJtdDlwMDEyX21vdmVfZm9jdXMgZmFpbGVkIGF0IGxpbmUgJWQgLi4uXG4iLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChkaXJlY3Rpb24gPT0gTU9WRV9ORUFSKQotCQlzdGVwX2RpcmVjdGlvbiA9IC0xOwotCWVsc2UgaWYgKGRpcmVjdGlvbiA9PSBNT1ZFX0ZBUikKLQkJc3RlcF9kaXJlY3Rpb24gPSAxOwotCWVsc2UgewotCQlDREJHKCJtdDlwMDEyX21vdmVfZm9jdXMgZmFpbGVkIGF0IGxpbmUgJWQgLi4uXG4iLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChtdDlwMDEyX2N0cmwtPmN1cnJfbGVuc19wb3MgPCBtdDlwMDEyX2N0cmwtPmluaXRfY3Vycl9sZW5zX3BvcykKLQkJbXQ5cDAxMl9jdHJsLT5jdXJyX2xlbnNfcG9zID0gbXQ5cDAxMl9jdHJsLT5pbml0X2N1cnJfbGVuc19wb3M7Ci0KLQlhY3R1YWxfc3RlcCA9IChpbnQxNl90KSAoc3RlcF9kaXJlY3Rpb24gKiAoaW50MTZfdCkgbnVtX3N0ZXBzKTsKLQluZXh0X3Bvc2l0aW9uID0gKGludDE2X3QpIChtdDlwMDEyX2N0cmwtPmN1cnJfbGVuc19wb3MgKyBhY3R1YWxfc3RlcCk7Ci0KLQlpZiAobmV4dF9wb3NpdGlvbiA+IE1UOVAwMTJfVE9UQUxfU1RFUFNfTkVBUl9UT19GQVIpCi0JCW5leHRfcG9zaXRpb24gPSBNVDlQMDEyX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSOwotCWVsc2UgaWYgKG5leHRfcG9zaXRpb24gPCAwKQotCQluZXh0X3Bvc2l0aW9uID0gMDsKLQotCWlmIChudW1fc3RlcHMgPj0gMTApCi0JCXRpbWVfb3V0ID0gMTAwOwotCWVsc2UKLQkJdGltZV9vdXQgPSAzMDsKLQljb2RlX3ZhbCA9IG5leHRfcG9zaXRpb247Ci0JYWN0dWFsX3Bvc2l0aW9uX3RhcmdldCA9IGJhbV9zdGVwX2xvb2t1cF90YWJsZVtjb2RlX3ZhbF07Ci0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV9iKE1UOVAwMTJfQUZfSTJDX0FERFIgPj4gMSwgMHgwMSwgMHgyOSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXRlbXBfcG9zID0gKHVpbnQ4X3QpIChhY3R1YWxfcG9zaXRpb25fdGFyZ2V0ID4+IDgpOwotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfYihNVDlQMDEyX0FGX0kyQ19BRERSID4+IDEsIDB4MDUsIHRlbXBfcG9zKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0JdGVtcF9wb3MgPSAodWludDhfdCkgKGFjdHVhbF9wb3NpdGlvbl90YXJnZXQgJiAweDAwRkYpOwotCS8qIGNvZGVfdmFsX2xzYiB8PSBtb2RlX21hc2s7ICovCi0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV9iKE1UOVAwMTJfQUZfSTJDX0FERFIgPj4gMSwgMHgwNiwgdGVtcF9wb3MpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfYihNVDlQMDEyX0FGX0kyQ19BRERSID4+IDEsIDB4MEIsIHRpbWVfb3V0KTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV9iKE1UOVAwMTJfQUZfSTJDX0FERFIgPj4gMSwgMHgwNywgMHgyNyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JbWRlbGF5KHRpbWVfb3V0KTsKLQotCS8qIFN0b3JpbmcgdGhlIGN1cnJlbnQgbGVucyBQb3NpdGlvbiAqLwotCW10OXAwMTJfY3RybC0+Y3Vycl9sZW5zX3BvcyA9IG5leHRfcG9zaXRpb247Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfc2V0X2RlZmF1bHRfZm9jdXModm9pZCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCXVpbnQ4X3QgdGVtcF9wb3M7Ci0KLQkvKiBXcml0ZSB0aGUgZGlnaXRhbCBjb2RlIGZvciBjdXJyZW50IHRvIHRoZSBhY3R1YXRvciAqLwotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfYihNVDlQMDEyX0FGX0kyQ19BRERSID4+IDEsIDB4MDEsIDB4MjkpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQl0ZW1wX3BvcyA9ICh1aW50OF90KSAoYmFtX2luZmluaXRlID4+IDgpOwotCi0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV9iKE1UOVAwMTJfQUZfSTJDX0FERFIgPj4gMSwgMHgwNSwgdGVtcF9wb3MpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQl0ZW1wX3BvcyA9ICh1aW50OF90KSAoYmFtX2luZmluaXRlICYgMHgwMEZGKTsKLQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX2IoTVQ5UDAxMl9BRl9JMkNfQUREUiA+PiAxLCAweDA2LCB0ZW1wX3Bvcyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV9iKE1UOVAwMTJfQUZfSTJDX0FERFIgPj4gMSwgMHgwQiwgMHg2NCk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV9iKE1UOVAwMTJfQUZfSTJDX0FERFIgPj4gMSwgMHgwNywgMHgyNyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JbWRlbGF5KDE0MCk7Ci0KLQltdDlwMDEyX2N0cmwtPmN1cnJfbGVuc19wb3MgPSBNVDlQMDEyX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG10OXAwMTJfcHJvYmVfaW5pdF9kb25lKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCWdwaW9fZnJlZShkYXRhLT5zZW5zb3JfcmVzZXQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG10OXAwMTJfcHJvYmVfaW5pdF9zZW5zb3IoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JaW50MzJfdCByYzsKLQl1aW50MTZfdCBjaGlwaWQ7Ci0KLQlyYyA9IGdwaW9fcmVxdWVzdChkYXRhLT5zZW5zb3JfcmVzZXQsICJtdDlwMDEyIik7Ci0JaWYgKCFyYykKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnNlbnNvcl9yZXNldCwgMSk7Ci0JZWxzZQotCQlnb3RvIGluaXRfcHJvYmVfZG9uZTsKLQotCW1zbGVlcCgyMCk7Ci0KLQkvKiBSRVNFVCB0aGUgc2Vuc29yIGltYWdlIHBhcnQgdmlhIEkyQyBjb21tYW5kICovCi0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV93KG10OXAwMTJfY2xpZW50LT5hZGRyLAotCQkJCSBNVDlQMDEyX1JFR19SRVNFVF9SRUdJU1RFUiwgMHgxMENDIHwgMHgwMDAxKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoInNlbnNvciByZXNldCBmYWlsZWQuIHJjID0gJWRcbiIsIHJjKTsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCi0JbXNsZWVwKE1UOVAwMTJfUkVTRVRfREVMQVlfTVNFQ1MpOwotCi0JLyogMy4gUmVhZCBzZW5zb3IgTW9kZWwgSUQ6ICovCi0JcmMgPSBtdDlwMDEyX2kyY19yZWFkX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsCi0JCQkJTVQ5UDAxMl9SRUdfTU9ERUxfSUQsICZjaGlwaWQpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCi0JLyogNC4gQ29tcGFyZSBzZW5zb3IgSUQgdG8gTVQ5VDAxMlZDIElEOiAqLwotCWlmIChjaGlwaWQgIT0gTVQ5UDAxMl9NT0RFTF9JRCkgewotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCX0KLQotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwgMHgzMDZFLCAweDkwMDApOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiUkVWXzcgd3JpdGUgZmFpbGVkLiByYyA9ICVkXG4iLCByYyk7Ci0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCX0KLQotCS8qIFJFU0VUX1JFR0lTVEVSLCBlbmFibGUgcGFyYWxsZWwgaW50ZXJmYWNlIGFuZCBkaXNhYmxlIHNlcmlhbGlzZXIgKi8KLQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsIDB4MzAxQSwgMHgxMENDKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoImVuYWJsZSBwYXJhbGxlbCBpbnRlcmZhY2UgZmFpbGVkLiByYyA9ICVkXG4iLCByYyk7Ci0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCX0KLQotCS8qIFRvIGRpc2FibGUgdGhlIDIgZXh0cmEgbGluZXMgKi8KLQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsIDB4MzA2NCwgMHgwODA1KTsKLQotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiZGlzYWJsZSB0aGUgMiBleHRyYSBsaW5lcyBmYWlsZWQuIHJjID0gJWRcbiIsIHJjKTsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCi0JZ290byBpbml0X3Byb2JlX2RvbmU7Ci0KLWluaXRfcHJvYmVfZmFpbDoKLQltdDlwMDEyX3Byb2JlX2luaXRfZG9uZShkYXRhKTsKLWluaXRfcHJvYmVfZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXQ5cDAxMl9zZW5zb3Jfb3Blbl9pbml0KGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCWludDMyX3QgcmM7Ci0JdW5zaWduZWQgc2hvcnQgdGVtcF9wb3M7Ci0JdWludDhfdCBpOwotCXVpbnQxNl90IHRlbXA7Ci0KLQltdDlwMDEyX2N0cmwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXQ5cDAxMl9jdHJsKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtdDlwMDEyX2N0cmwpIHsKLQkJQ0RCRygibXQ5cDAxMl9pbml0IGZhaWxlZCFcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gaW5pdF9kb25lOwotCX0KLQotCW10OXAwMTJfY3RybC0+ZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQltdDlwMDEyX2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQltdDlwMDEyX2N0cmwtPnNldF90ZXN0ID0gVEVTVF9PRkY7Ci0JbXQ5cDAxMl9jdHJsLT5wcmV2X3JlcyA9IFFUUl9TSVpFOwotCW10OXAwMTJfY3RybC0+cGljdF9yZXMgPSBGVUxMX1NJWkU7Ci0KLQlpZiAoZGF0YSkKLQkJbXQ5cDAxMl9jdHJsLT5zZW5zb3JkYXRhID0gZGF0YTsKLQotCW1zbV9jYW1pb19jYW1pZl9wYWRfcmVnX3Jlc2V0KCk7Ci0JbWRlbGF5KDIwKTsKLQotCXJjID0gbXQ5cDAxMl9wcm9iZV9pbml0X3NlbnNvcihkYXRhKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGluaXRfZmFpbDE7Ci0KLQlpZiAobXQ5cDAxMl9jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkKLQkJcmMgPSBtdDlwMDEyX3NldHRpbmcoUkVHX0lOSVQsIFJFU19QUkVWSUVXKTsKLQllbHNlCi0JCXJjID0gbXQ5cDAxMl9zZXR0aW5nKFJFR19JTklULCBSRVNfQ0FQVFVSRSk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIm10OXAwMTJfc2V0dGluZyBmYWlsZWQuIHJjID0gJWRcbiIsIHJjKTsKLQkJZ290byBpbml0X2ZhaWwxOwotCX0KLQotCS8qIHNlbnNvciA6IG91dHB1dCBlbmFibGUgKi8KLQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsCi0JCQkJIE1UOVAwMTJfUkVHX1JFU0VUX1JFR0lTVEVSLAotCQkJCSBNVDlQMDEyX1JFU0VUX1JFR0lTVEVSX1BXT04pOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygic2Vuc29yIG91dHB1dCBlbmFibGUgZmFpbGVkLiByYyA9ICVkXG4iLCByYyk7Ci0JCWdvdG8gaW5pdF9mYWlsMTsKLQl9Ci0KLQkvKiBlbmFibGUgQUYgYWN0dWF0b3IgKi8KLQlyYyA9IGdwaW9fcmVxdWVzdChtdDlwMDEyX2N0cmwtPnNlbnNvcmRhdGEtPnZjbV9wd2QsICJtdDlwMDEyIik7Ci0JaWYgKCFyYykKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG10OXAwMTJfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCwgMSk7Ci0JZWxzZSB7Ci0JCUNEQkcoIm10OXAwMTJfY3RybCBncGlvIHJlcXVlc3QgZmFpbGVkIVxuIik7Ci0JCWdvdG8gaW5pdF9mYWlsMTsKLQl9Ci0KLQltZGVsYXkoMjApOwotCi0JYmFtX2luZmluaXRlID0gMDsKLQliYW1fbWFjcm8gPSAwOwotCS8qaW5pdGlhbGl6ZSBBRiBhY3R1YXRvciAqLwotCW10OXAwMTJfaTJjX3dyaXRlX2IoTVQ5UDAxMl9BRl9JMkNfQUREUiA+PiAxLCAweDAxLCAweDA5KTsKLQltdDlwMDEyX2kyY193cml0ZV9iKE1UOVAwMTJfQUZfSTJDX0FERFIgPj4gMSwgMHgwNywgMHgyRSk7Ci0JbXQ5cDAxMl9pMmNfd3JpdGVfYihNVDlQMDEyX0FGX0kyQ19BRERSID4+IDEsIDB4MEEsIDB4MDEpOwotCW10OXAwMTJfaTJjX3dyaXRlX2IoTVQ5UDAxMl9BRl9JMkNfQUREUiA+PiAxLCAweDE3LCAweDA2KTsKLQltdDlwMDEyX2kyY193cml0ZV9iKE1UOVAwMTJfQUZfSTJDX0FERFIgPj4gMSwgMHgxNiwgMHgwQSk7Ci0KLQltdDlwMDEyX2kyY193cml0ZV9iKE1UOVAwMTJfQUZfSTJDX0FERFIgPj4gMSwgMHgwMSwgMHgyOSk7Ci0JbXQ5cDAxMl9pMmNfd3JpdGVfYihNVDlQMDEyX0FGX0kyQ19BRERSID4+IDEsIDB4MDUsIDB4MDApOwotCW10OXAwMTJfaTJjX3dyaXRlX2IoTVQ5UDAxMl9BRl9JMkNfQUREUiA+PiAxLCAweDA2LCAweDAwKTsKLQltdDlwMDEyX2kyY193cml0ZV9iKE1UOVAwMTJfQUZfSTJDX0FERFIgPj4gMSwgMHgwQiwgMHg2NCk7Ci0JbXQ5cDAxMl9pMmNfd3JpdGVfYihNVDlQMDEyX0FGX0kyQ19BRERSID4+IDEsIDB4MDcsIDB4MjcpOwotCW1kZWxheSgxNDApOwotCW10OXAwMTJfaTJjX3dyaXRlX2IoTVQ5UDAxMl9BRl9JMkNfQUREUiA+PiAxLCAweDAxLCAweDI5KTsKLQltdDlwMDEyX2kyY193cml0ZV9iKE1UOVAwMTJfQUZfSTJDX0FERFIgPj4gMSwgMHgwNSwgMHgwMyk7Ci0JbXQ5cDAxMl9pMmNfd3JpdGVfYihNVDlQMDEyX0FGX0kyQ19BRERSID4+IDEsIDB4MDYsIDB4RkYpOwotCW10OXAwMTJfaTJjX3dyaXRlX2IoTVQ5UDAxMl9BRl9JMkNfQUREUiA+PiAxLCAweDBCLCAweDY0KTsKLQltdDlwMDEyX2kyY193cml0ZV9iKE1UOVAwMTJfQUZfSTJDX0FERFIgPj4gMSwgMHgwNywgMHgyNyk7Ci0JbWRlbGF5KDE0MCk7Ci0KLQlpZiAobXQ5cDAxMl9pMmNfcmVhZF9iKE1UOVAwMTJfQUZfSTJDX0FERFIgPj4gMSwgMHgxMiwgJnRlbXBfcG9zKQotCSAgICA+PSAwKSB7Ci0JCWJhbV9pbmZpbml0ZSA9ICh1aW50MTZfdCkgdGVtcF9wb3M7Ci0JCWlmIChtdDlwMDEyX2kyY19yZWFkX2IKLQkJICAgIChNVDlQMDEyX0FGX0kyQ19BRERSID4+IDEsIDB4MTMsICZ0ZW1wX3BvcykgPj0gMCkKLQkJCWJhbV9pbmZpbml0ZSA9Ci0JCQkgICAgKGJhbV9pbmZpbml0ZSA8PCA4KSB8ICgodWludDE2X3QpIHRlbXBfcG9zKTsKLQl9IGVsc2UgewotCQliYW1faW5maW5pdGUgPSAxMDA7Ci0JfQotCi0JaWYgKG10OXAwMTJfaTJjX3JlYWRfYihNVDlQMDEyX0FGX0kyQ19BRERSID4+IDEsIDB4MTQsICZ0ZW1wX3BvcykKLQkgICAgPj0gMCkgewotCQliYW1fbWFjcm8gPSAodWludDE2X3QpIHRlbXBfcG9zOwotCQlpZiAobXQ5cDAxMl9pMmNfcmVhZF9iCi0JCSAgICAoTVQ5UDAxMl9BRl9JMkNfQUREUiA+PiAxLCAweDE1LCAmdGVtcF9wb3MpID49IDApCi0JCQliYW1fbWFjcm8gPSAoYmFtX21hY3JvIDw8IDgpIHwgKCh1aW50MTZfdCkgdGVtcF9wb3MpOwotCX0KLQl0ZW1wID0gKGJhbV9pbmZpbml0ZSAtIGJhbV9tYWNybykgLyBNVDlQMDEyX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSOwotCWZvciAoaSA9IDA7IGkgPCBNVDlQMDEyX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSOyBpKyspCi0JCWJhbV9zdGVwX2xvb2t1cF90YWJsZVtpXSA9IGJhbV9tYWNybyArIHRlbXAgKiBpOwotCi0JYmFtX3N0ZXBfbG9va3VwX3RhYmxlW01UOVAwMTJfVE9UQUxfU1RFUFNfTkVBUl9UT19GQVJdID0gYmFtX2luZmluaXRlOwotCi0JcmMgPSBtdDlwMDEyX3NldF9kZWZhdWx0X2ZvY3VzKCk7Ci0JaWYgKHJjID49IDApCi0JCWdvdG8gaW5pdF9kb25lOwotCi1pbml0X2ZhaWwxOgotCW10OXAwMTJfcHJvYmVfaW5pdF9kb25lKGRhdGEpOwotCWtmcmVlKG10OXAwMTJfY3RybCk7Ci1pbml0X2RvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG10OXAwMTJfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQkvKiBJbml0aWFsaXplIHRoZSBNU01fQ0FNSTJDIENoaXAgKi8KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtdDlwMDEyX3dhaXRfcXVldWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX3NldF9zZW5zb3JfbW9kZShpbnQgbW9kZSwgaW50IHJlcykKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgU0VOU09SX1BSRVZJRVdfTU9ERToKLQkJcmMgPSBtdDlwMDEyX3ZpZGVvX2NvbmZpZyhtb2RlLCByZXMpOwotCQlicmVhazsKLQotCWNhc2UgU0VOU09SX1NOQVBTSE9UX01PREU6Ci0JCXJjID0gbXQ5cDAxMl9zbmFwc2hvdF9jb25maWcobW9kZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTRU5TT1JfUkFXX1NOQVBTSE9UX01PREU6Ci0JCXJjID0gbXQ5cDAxMl9yYXdfc25hcHNob3RfY29uZmlnKG1vZGUpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXQ5cDAxMl9zZW5zb3JfY29uZmlnKHZvaWQgX191c2VyICphcmdwKQotewotCXN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEgY2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmY2RhdGEsCi0JCQkgICAodm9pZCAqKWFyZ3AsIHNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JbXV0ZXhfbG9jaygmbXQ5cDAxMl9tdXQpOwotCi0JQ0RCRygiJXM6IGNmZ3R5cGUgPSAlZFxuIiwgX19mdW5jX18sIGNkYXRhLmNmZ3R5cGUpOwotCXN3aXRjaCAoY2RhdGEuY2ZndHlwZSkgewotCWNhc2UgQ0ZHX0dFVF9QSUNUX0ZQUzoKLQkJbXQ5cDAxMl9nZXRfcGljdF9mcHMoY2RhdGEuY2ZnLmdmcHMucHJldmZwcywKLQkJCQkgICAgICYoY2RhdGEuY2ZnLmdmcHMucGljdGZwcykpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLCAmY2RhdGEsCi0JCQkJIHNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfR0VUX1BSRVZfTF9QRjoKLQkJY2RhdGEuY2ZnLnByZXZsX3BmID0gbXQ5cDAxMl9nZXRfcHJldl9saW5lc19wZigpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSAmY2RhdGEsIHNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfR0VUX1BSRVZfUF9QTDoKLQkJY2RhdGEuY2ZnLnByZXZwX3BsID0gbXQ5cDAxMl9nZXRfcHJldl9waXhlbHNfcGwoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkgJmNkYXRhLCBzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX0dFVF9QSUNUX0xfUEY6Ci0JCWNkYXRhLmNmZy5waWN0bF9wZiA9IG10OXAwMTJfZ2V0X3BpY3RfbGluZXNfcGYoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkgJmNkYXRhLCBzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX0dFVF9QSUNUX1BfUEw6Ci0JCWNkYXRhLmNmZy5waWN0cF9wbCA9IG10OXAwMTJfZ2V0X3BpY3RfcGl4ZWxzX3BsKCk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJICZjZGF0YSwgc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19HRVRfUElDVF9NQVhfRVhQX0xDOgotCQljZGF0YS5jZmcucGljdF9tYXhfZXhwX2xjID0gbXQ5cDAxMl9nZXRfcGljdF9tYXhfZXhwX2xjKCk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJICZjZGF0YSwgc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfRlBTOgotCWNhc2UgQ0ZHX1NFVF9QSUNUX0ZQUzoKLQkJcmMgPSBtdDlwMDEyX3NldF9mcHMoJihjZGF0YS5jZmcuZnBzKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX0VYUF9HQUlOOgotCQlyYyA9IG10OXAwMTJfd3JpdGVfZXhwX2dhaW4oY2RhdGEuY2ZnLmV4cF9nYWluLmdhaW4sCi0JCQkJCSAgICBjZGF0YS5jZmcuZXhwX2dhaW4ubGluZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX1BJQ1RfRVhQX0dBSU46Ci0JCUNEQkcoIkxpbmU6JWQgQ0ZHX1NFVF9QSUNUX0VYUF9HQUlOIFxuIiwgX19MSU5FX18pOwotCQlyYyA9IG10OXAwMTJfc2V0X3BpY3RfZXhwX2dhaW4oY2RhdGEuY2ZnLmV4cF9nYWluLmdhaW4sCi0JCQkJCSAgICAgICBjZGF0YS5jZmcuZXhwX2dhaW4ubGluZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX01PREU6Ci0JCXJjID0gbXQ5cDAxMl9zZXRfc2Vuc29yX21vZGUoY2RhdGEubW9kZSwgY2RhdGEucnMpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1BXUl9ET1dOOgotCQlyYyA9IG10OXAwMTJfcG93ZXJfZG93bigpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX01PVkVfRk9DVVM6Ci0JCUNEQkcoIm10OXAwMTJfaW9jdGw6IENGR19NT1ZFX0ZPQ1VTOiBkaXI9JWQgc3RlcHM9JWRcbiIsCi0JCSAgICAgY2RhdGEuY2ZnLmZvY3VzLmRpciwgY2RhdGEuY2ZnLmZvY3VzLnN0ZXBzKTsKLQkJcmMgPSBtdDlwMDEyX21vdmVfZm9jdXMoY2RhdGEuY2ZnLmZvY3VzLmRpciwKLQkJCQkJY2RhdGEuY2ZnLmZvY3VzLnN0ZXBzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfREVGQVVMVF9GT0NVUzoKLQkJcmMgPSBtdDlwMDEyX3NldF9kZWZhdWx0X2ZvY3VzKCk7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfRUZGRUNUOgotCQlyYyA9IG10OXAwMTJfc2V0X2RlZmF1bHRfZm9jdXMoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfTEVOU19TSEFESU5HOgotCQlDREJHKCIlczogQ0ZHX1NFVF9MRU5TX1NIQURJTkdcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSBtdDlwMDEyX2xlbnNfc2hhZGluZ19lbmFibGUoY2RhdGEuY2ZnLmxlbnNfc2hhZGluZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfR0VUX0FGX01BWF9TVEVQUzoKLQkJY2RhdGEubWF4X3N0ZXBzID0gTVQ5UDAxMl9TVEVQU19ORUFSX1RPX0NMT1NFU1RfSU5GOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkgJmNkYXRhLCBzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZtdDlwMDEyX211dCk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXQ5cDAxMl9zZW5zb3JfcmVsZWFzZSh2b2lkKQotewotCWludCByYyA9IC1FQkFERjsKLQotCW11dGV4X2xvY2soJm10OXAwMTJfbXV0KTsKLQotCW10OXAwMTJfcG93ZXJfZG93bigpOwotCi0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG10OXAwMTJfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3Jlc2V0LCAwKTsKLQlncGlvX2ZyZWUobXQ5cDAxMl9jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcmVzZXQpOwotCi0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG10OXAwMTJfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCwgMCk7Ci0JZ3Bpb19mcmVlKG10OXAwMTJfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCk7Ci0KLQlrZnJlZShtdDlwMDEyX2N0cmwpOwotCW10OXAwMTJfY3RybCA9IE5VTEw7Ci0KLQlDREJHKCJtdDlwMDEyX3JlbGVhc2UgY29tcGxldGVkXG4iKTsKLQotCW11dGV4X3VubG9jaygmbXQ5cDAxMl9tdXQpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtdDlwMDEyX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJjID0gMDsKLQlDREJHKCJtdDlwMDEyX3Byb2JlIGNhbGxlZCFcbiIpOwotCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKLQkJQ0RCRygiaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkgZmFpbGVkXG4iKTsKLQkJZ290byBwcm9iZV9mYWlsdXJlOwotCX0KLQotCW10OXAwMTJfc2Vuc29ydyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtdDlwMDEyX3dvcmspLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW10OXAwMTJfc2Vuc29ydykgewotCQlDREJHKCJremFsbG9jIGZhaWxlZC5cbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBtdDlwMDEyX3NlbnNvcncpOwotCW10OXAwMTJfaW5pdF9jbGllbnQoY2xpZW50KTsKLQltdDlwMDEyX2NsaWVudCA9IGNsaWVudDsKLQotCW1kZWxheSg1MCk7Ci0KLQlDREJHKCJtdDlwMDEyX3Byb2JlIHN1Y2Nlc3NlZCEgcmMgPSAlZFxuIiwgcmMpOwotCXJldHVybiAwOwotCi1wcm9iZV9mYWlsdXJlOgotCUNEQkcoIm10OXAwMTJfcHJvYmUgZmFpbGVkISByYyA9ICVkXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fZXhpdCBtdDlwMDEyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBtdDlwMDEyX3dvcmtfdCAqc2Vuc29ydyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBzZW5zb3J3KTsKLQltdDlwMDEyX2NsaWVudCA9IE5VTEw7Ci0Ja2ZyZWUoc2Vuc29ydyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtdDlwMDEyX2kyY19pZFtdID0gewotCXsibXQ5cDAxMiIsIDB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbXQ5cDAxMl9pMmNfZHJpdmVyID0gewotCS5pZF90YWJsZSA9IG10OXAwMTJfaTJjX2lkLAotCS5wcm9iZSA9IG10OXAwMTJfaTJjX3Byb2JlLAotCS5yZW1vdmUgPSBfX2V4aXRfcChtdDlwMDEyX2kyY19yZW1vdmUpLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm10OXAwMTIiLAotCX0sCi19OwotCi1zdGF0aWMgaW50IG10OXAwMTJfc2Vuc29yX3Byb2JlKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICppbmZvLAotCQkJCXN0cnVjdCBtc21fc2Vuc29yX2N0cmwgKnMpCi17Ci0JaW50IHJjID0gaTJjX2FkZF9kcml2ZXIoJm10OXAwMTJfaTJjX2RyaXZlcik7Ci0JaWYgKHJjIDwgMCB8fCBtdDlwMDEyX2NsaWVudCA9PSBOVUxMKSB7Ci0JCXJjID0gLUVOT1RTVVBQOwotCQlnb3RvIHByb2JlX2RvbmU7Ci0JfQotCi0JbXNtX2NhbWlvX2Nsa19yYXRlX3NldChNVDlQMDEyX0RFRkFVTFRfQ0xPQ0tfUkFURSk7Ci0JbWRlbGF5KDIwKTsKLQotCXJjID0gbXQ5cDAxMl9wcm9iZV9pbml0X3NlbnNvcihpbmZvKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIHByb2JlX2RvbmU7Ci0KLQlzLT5zX2luaXQgPSBtdDlwMDEyX3NlbnNvcl9vcGVuX2luaXQ7Ci0Jcy0+c19yZWxlYXNlID0gbXQ5cDAxMl9zZW5zb3JfcmVsZWFzZTsKLQlzLT5zX2NvbmZpZyA9IG10OXAwMTJfc2Vuc29yX2NvbmZpZzsKLQlzLT5zX21vdW50X2FuZ2xlICA9IDA7Ci0JbXQ5cDAxMl9wcm9iZV9pbml0X2RvbmUoaW5mbyk7Ci0KLXByb2JlX2RvbmU6Ci0JQ0RCRygiJXMgJXM6JWRcbiIsIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX210OXAwMTJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gbXNtX2NhbWVyYV9kcnZfc3RhcnQocGRldiwgbXQ5cDAxMl9zZW5zb3JfcHJvYmUpOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fY2FtZXJhX2RyaXZlciA9IHsKLQkucHJvYmUgPSBfX210OXAwMTJfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtX2NhbWVyYV9tdDlwMDEyIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG10OXAwMTJfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9jYW1lcmFfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQobXQ5cDAxMl9pbml0KTsKLXZvaWQgbXQ5cDAxMl9leGl0KHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJm10OXAwMTJfaTJjX2RyaXZlcik7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5cDAxMl9mb3guYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDlwMDEyX2ZveC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGQ5MGMxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDlwMDEyX2ZveC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM0NiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxtZWRpYS9tc21fY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlICJtdDlwMDEyLmgiCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIFNFTlNPUiBSRUdJU1RFUiBERUZJTkVTCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0jZGVmaW5lIE1UOVAwMTJfUkVHX01PREVMX0lEICAgICAgICAgMHgwMDAwCi0jZGVmaW5lIE1UOVAwMTJfTU9ERUxfSUQgICAgICAgICAgICAgMHgyODAxCi0jZGVmaW5lIFJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xEICAgMHgwMTA0Ci0jZGVmaW5lIEdST1VQRURfUEFSQU1FVEVSX0hPTEQgICAgICAgMHgwMTAwCi0jZGVmaW5lIEdST1VQRURfUEFSQU1FVEVSX1VQREFURSAgICAgMHgwMDAwCi0jZGVmaW5lIFJFR19DT0FSU0VfSU5UX1RJTUUgICAgICAgICAgMHgzMDEyCi0jZGVmaW5lIFJFR19WVF9QSVhfQ0xLX0RJViAgICAgICAgICAgMHgwMzAwCi0jZGVmaW5lIFJFR19WVF9TWVNfQ0xLX0RJViAgICAgICAgICAgMHgwMzAyCi0jZGVmaW5lIFJFR19QUkVfUExMX0NMS19ESVYgICAgICAgICAgMHgwMzA0Ci0jZGVmaW5lIFJFR19QTExfTVVMVElQTElFUiAgICAgICAgICAgMHgwMzA2Ci0jZGVmaW5lIFJFR19PUF9QSVhfQ0xLX0RJViAgICAgICAgICAgMHgwMzA4Ci0jZGVmaW5lIFJFR19PUF9TWVNfQ0xLX0RJViAgICAgICAgICAgMHgwMzBBCi0jZGVmaW5lIFJFR19TQ0FMRV9NICAgICAgICAgICAgICAgICAgMHgwNDA0Ci0jZGVmaW5lIFJFR19GUkFNRV9MRU5HVEhfTElORVMgICAgICAgMHgzMDBBCi0jZGVmaW5lIFJFR19MSU5FX0xFTkdUSF9QQ0sgICAgICAgICAgMHgzMDBDCi0jZGVmaW5lIFJFR19YX0FERFJfU1RBUlQgICAgICAgICAgICAgMHgzMDA0Ci0jZGVmaW5lIFJFR19ZX0FERFJfU1RBUlQgICAgICAgICAgICAgMHgzMDAyCi0jZGVmaW5lIFJFR19YX0FERFJfRU5EICAgICAgICAgICAgICAgMHgzMDA4Ci0jZGVmaW5lIFJFR19ZX0FERFJfRU5EICAgICAgICAgICAgICAgMHgzMDA2Ci0jZGVmaW5lIFJFR19YX09VVFBVVF9TSVpFICAgICAgICAgICAgMHgwMzRDCi0jZGVmaW5lIFJFR19ZX09VVFBVVF9TSVpFICAgICAgICAgICAgMHgwMzRFCi0jZGVmaW5lIFJFR19GSU5FX0lOVEVHUkFUSU9OX1RJTUUgICAgMHgzMDE0Ci0jZGVmaW5lIFJFR19ST1dfU1BFRUQgICAgICAgICAgICAgICAgMHgzMDE2Ci0jZGVmaW5lIE1UOVAwMTJfUkVHX1JFU0VUX1JFR0lTVEVSICAgMHgzMDFBCi0jZGVmaW5lIE1UOVAwMTJfUkVTRVRfUkVHSVNURVJfUFdPTiAgMHgxMENDCi0jZGVmaW5lIE1UOVAwMTJfUkVTRVRfUkVHSVNURVJfUFdPRkYgMHgxMEM4Ci0jZGVmaW5lIFJFR19SRUFEX01PREUgICAgICAgICAgICAgICAgMHgzMDQwCi0jZGVmaW5lIFJFR19HTE9CQUxfR0FJTiAgICAgICAgICAgICAgMHgzMDVFCi0jZGVmaW5lIFJFR19URVNUX1BBVFRFUk5fTU9ERSAgICAgICAgMHgzMDcwCi0KLSNkZWZpbmUgTVQ5UDAxMl9SRVZfNwotCi1lbnVtIG10OXAwMTJfdGVzdF9tb2RlIHsKLQlURVNUX09GRiwKLQlURVNUXzEsCi0JVEVTVF8yLAotCVRFU1RfMwotfTsKLQotZW51bSBtdDlwMDEyX3Jlc29sdXRpb24gewotCVFUUl9TSVpFLAotCUZVTExfU0laRSwKLQlJTlZBTElEX1NJWkUKLX07Ci0KLWVudW0gbXQ5cDAxMl9yZWdfdXBkYXRlIHsKLQkvKiBTZW5zb3IgZWdpc3RlcnMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uICovCi0JUkVHX0lOSVQsCi0JLyogU2Vuc29yIGVnaXN0ZXJzIHRoYXQgbmVlZHMgcGVyaW9kaWMgSTJDIHdyaXRlcyAqLwotCVVQREFURV9QRVJJT0RJQywKLQkvKiBBbGwgdGhlIHNlbnNvciBSZWdpc3RlcnMgd2lsbCBiZSB1cGRhdGVkICovCi0JVVBEQVRFX0FMTCwKLQkvKiBOb3QgdmFsaWQgdXBkYXRlICovCi0JVVBEQVRFX0lOVkFMSUQKLX07Ci0KLWVudW0gbXQ5cDAxMl9zZXR0aW5nIHsKLQlSRVNfUFJFVklFVywKLQlSRVNfQ0FQVFVSRQotfTsKLQotLyogYWN0dWF0b3IncyBTbGF2ZSBBZGRyZXNzICovCi0jZGVmaW5lIE1UOVAwMTJfQUZfSTJDX0FERFIgICAweDE4Ci0KLS8qIEFGIFRvdGFsIHN0ZXBzIHBhcmFtZXRlcnMgKi8KLSNkZWZpbmUgTVQ5UDAxMl9TVEVQU19ORUFSX1RPX0NMT1NFU1RfSU5GICAzMgotI2RlZmluZSBNVDlQMDEyX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSICAgIDMyCi0KLSNkZWZpbmUgTVQ5UDAxMl9NVTVNMF9QUkVWSUVXX0RVTU1ZX1BJWEVMUyAwCi0jZGVmaW5lIE1UOVAwMTJfTVU1TTBfUFJFVklFV19EVU1NWV9MSU5FUyAgMAotCi0vKiBUaW1lIGluIG1pbGlzZWNzIGZvciB3YWl0aW5nIGZvciB0aGUgc2Vuc29yIHRvIHJlc2V0LiovCi0jZGVmaW5lIE1UOVAwMTJfUkVTRVRfREVMQVlfTVNFQ1MgICA2NgotCi0vKiBmb3IgMjAgZnBzIHByZXZpZXcgKi8KLSNkZWZpbmUgTVQ5UDAxMl9ERUZBVUxUX0NMT0NLX1JBVEUgIDI0MDAwMDAwCi0jZGVmaW5lIE1UOVAwMTJfREVGQVVMVF9NQVhfRlBTICAgICAyNgkvKiA/Pz8/ICovCi0KLXN0cnVjdCBtdDlwMDEyX3dvcmsgewotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotfTsKLXN0YXRpYyBzdHJ1Y3QgbXQ5cDAxMl93b3JrICptdDlwMDEyX3NlbnNvcnc7Ci1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKm10OXAwMTJfY2xpZW50OwotCi1zdHJ1Y3QgbXQ5cDAxMl9jdHJsIHsKLQljb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2Vuc29yZGF0YTsKLQotCWludCBzZW5zb3Jtb2RlOwotCXVpbnQzMl90IGZwc19kaXZpZGVyOwkvKiBpbml0IHRvIDEgKiAweDAwMDAwNDAwICovCi0JdWludDMyX3QgcGljdF9mcHNfZGl2aWRlcjsJLyogaW5pdCB0byAxICogMHgwMDAwMDQwMCAqLwotCi0JdWludDE2X3QgY3Vycl9sZW5zX3BvczsKLQl1aW50MTZfdCBpbml0X2N1cnJfbGVuc19wb3M7Ci0JdWludDE2X3QgbXlfcmVnX2dhaW47Ci0JdWludDMyX3QgbXlfcmVnX2xpbmVfY291bnQ7Ci0KLQllbnVtIG10OXAwMTJfcmVzb2x1dGlvbiBwcmV2X3JlczsKLQllbnVtIG10OXAwMTJfcmVzb2x1dGlvbiBwaWN0X3JlczsKLQllbnVtIG10OXAwMTJfcmVzb2x1dGlvbiBjdXJyX3JlczsKLQllbnVtIG10OXAwMTJfdGVzdF9tb2RlIHNldF90ZXN0OwotfTsKLXN0YXRpYyB1aW50MTZfdCB1cGRhdGVfdHlwZSA9IFVQREFURV9QRVJJT0RJQzsKLXN0YXRpYyBzdHJ1Y3QgbXQ5cDAxMl9jdHJsICptdDlwMDEyX2N0cmw7Ci1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobXQ5cDAxMl93YWl0X3F1ZXVlKTsKLURFRklORV9NVVRFWChtdDlwMDEyX211dCk7Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotc3RhdGljIGludCBtdDlwMDEyX2kyY19yeGRhdGEodW5zaWduZWQgc2hvcnQgc2FkZHIsIHVuc2lnbmVkIGNoYXIgKnJ4ZGF0YSwKLQkJCSAgICAgIGludCBsZW5ndGgpCi17Ci0JaW50IHJldHJ5X2NudCA9IDA7Ci0JaW50IHJjOwotCi0Jc3RydWN0IGkyY19tc2cgbXNnc1tdID0gewotCQl7Ci0JCSAuYWRkciA9IHNhZGRyLAotCQkgLmZsYWdzID0gMCwKLQkJIC5sZW4gPSAyLAotCQkgLmJ1ZiA9IHJ4ZGF0YSwKLQkJIH0sCi0JCXsKLQkJIC5hZGRyID0gc2FkZHIsCi0JCSAuZmxhZ3MgPSBJMkNfTV9SRCwKLQkJIC5sZW4gPSBsZW5ndGgsCi0JCSAuYnVmID0gcnhkYXRhLAotCQkgfSwKLQl9OwotCi0JZG8gewotCQlyYyA9IGkyY190cmFuc2ZlcihtdDlwMDEyX2NsaWVudC0+YWRhcHRlciwgbXNncywgMik7Ci0JCWlmIChyYyA+IDApCi0JCQlicmVhazsKLQkJcmV0cnlfY250Kys7Ci0JfSB3aGlsZSAocmV0cnlfY250IDwgMyk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigibXQ5cDAxMl9pMmNfcnhkYXRhIGZhaWxlZCE6JWQgJWRcbiIsIHJjLCByZXRyeV9jbnQpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5cDAxMl9pMmNfcmVhZF93KHVuc2lnbmVkIHNob3J0IHNhZGRyLCB1bnNpZ25lZCBzaG9ydCByYWRkciwKLQkJCQkgIHVuc2lnbmVkIHNob3J0ICpyZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKLQotCWlmICghcmRhdGEpCi0JCXJldHVybiAtRUlPOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCi0JYnVmWzBdID0gKHJhZGRyICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlsxXSA9IChyYWRkciAmIDB4MDBGRik7Ci0KLQlyYyA9IG10OXAwMTJfaTJjX3J4ZGF0YShzYWRkciwgYnVmLCAyKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQkqcmRhdGEgPSBidWZbMF0gPDwgOCB8IGJ1ZlsxXTsKLQotCWlmIChyYyA8IDApCi0JCUNEQkcoIm10OXAwMTJfaTJjX3JlYWQgZmFpbGVkIVxuIik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfaTJjX3R4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwgdW5zaWduZWQgY2hhciAqdHhkYXRhLAotCQkJCSAgaW50IGxlbmd0aCkKLXsKLQlpbnQgcmV0cnlfY250ID0gMDsKLQlpbnQgcmM7Ci0KLQlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKLQkJewotCQkgLmFkZHIgPSBzYWRkciwKLQkJIC5mbGFncyA9IDAsCi0JCSAubGVuID0gbGVuZ3RoLAotCQkgLmJ1ZiA9IHR4ZGF0YSwKLQkJIH0sCi0JfTsKLQotCWRvIHsKLQkJcmMgPSBpMmNfdHJhbnNmZXIobXQ5cDAxMl9jbGllbnQtPmFkYXB0ZXIsIG1zZywgMSk7Ci0JCWlmIChyYyA+IDApCi0JCQlicmVhazsKLQkJcmV0cnlfY250Kys7Ci0JfSB3aGlsZSAocmV0cnlfY250IDwgMyk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigibXQ5cDAxMl9pMmNfdHhkYXRhIGZhaWxlZDogJWQgJWRcbiIsIHJjLCByZXRyeV9jbnQpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5cDAxMl9pMmNfd3JpdGVfYih1bnNpZ25lZCBzaG9ydCBzYWRkciwgdW5zaWduZWQgc2hvcnQgYmFkZHIsCi0JCQkJICAgdW5zaWduZWQgc2hvcnQgYmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IC1FSU87Ci0JdW5zaWduZWQgY2hhciBidWZbMl07Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gYmFkZHI7Ci0JYnVmWzFdID0gYmRhdGE7Ci0JcmMgPSBtdDlwMDEyX2kyY190eGRhdGEoc2FkZHIsIGJ1ZiwgMik7Ci0KLQlpZiAocmMgPCAwKQotCQlDREJHKCJpMmNfd3JpdGUgZmFpbGVkLCBzYWRkciA9IDB4JXggYWRkciA9IDB4JXgsIHZhbCA9MHgleCFcbiIsCi0JCSAgICAgc2FkZHIsIGJhZGRyLCBiZGF0YSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfaTJjX3dyaXRlX3codW5zaWduZWQgc2hvcnQgc2FkZHIsIHVuc2lnbmVkIHNob3J0IHdhZGRyLAotCQkJCSAgIHVuc2lnbmVkIHNob3J0IHdkYXRhKQotewotCWludDMyX3QgcmMgPSAtRUlPOwotCXVuc2lnbmVkIGNoYXIgYnVmWzRdOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9ICh3YWRkciAmIDB4RkYwMCkgPj4gODsKLQlidWZbMV0gPSAod2FkZHIgJiAweDAwRkYpOwotCWJ1ZlsyXSA9ICh3ZGF0YSAmIDB4RkYwMCkgPj4gODsKLQlidWZbM10gPSAod2RhdGEgJiAweDAwRkYpOwotCi0JcmMgPSBtdDlwMDEyX2kyY190eGRhdGEoc2FkZHIsIGJ1ZiwgNCk7Ci0KLQlpZiAocmMgPCAwKQotCQlDREJHKCJpMmNfd3JpdGVfdyBmYWlsZWQsIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4IVxuIiwKLQkJICAgICB3YWRkciwgd2RhdGEpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX2kyY193cml0ZV93X3RhYmxlKHN0cnVjdCBtdDlwMDEyX2kyY19yZWdfY29uZiBjb25zdAotCQkJCQkgKnJlZ19jb25mX3RibCwgaW50IG51bSkKLXsKLQlpbnQgaTsKLQlpbnQzMl90IHJjID0gLUVJTzsKLQotCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsCi0JCQkJCSByZWdfY29uZl90YmwtPndhZGRyLAotCQkJCQkgcmVnX2NvbmZfdGJsLT53ZGF0YSk7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQkJcmVnX2NvbmZfdGJsKys7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX3Rlc3QoZW51bSBtdDlwMDEyX3Rlc3RfbW9kZSBtbykKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwKLQkJCQkgUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJIEdST1VQRURfUEFSQU1FVEVSX0hPTEQpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCWlmIChtbyA9PSBURVNUX09GRikKLQkJcmV0dXJuIDA7Ci0JZWxzZSB7Ci0JCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfd190YWJsZShtdDlwMDEyX3JlZ3MudHRibCwKLQkJCQkJICAgICAgIG10OXAwMTJfcmVncy50dGJsX3NpemUpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwKLQkJCQkJIFJFR19URVNUX1BBVFRFUk5fTU9ERSwgKHVpbnQxNl90KSBtbyk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV93KG10OXAwMTJfY2xpZW50LT5hZGRyLAotCQkJCSBSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQkgR1JPVVBFRF9QQVJBTUVURVJfVVBEQVRFKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfbGVuc19zaGFkaW5nX2VuYWJsZSh1aW50OF90IGlzX2VuYWJsZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCUNEQkcoIiVzOiBlbnRlcmVkLiBlbmFibGUgPSAlZFxuIiwgX19mdW5jX18sIGlzX2VuYWJsZSk7Ci0KLQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsCi0JCQkJIFJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCSBHUk9VUEVEX1BBUkFNRVRFUl9IT0xEKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsIDB4Mzc4MCwKLQkJCQkgKCh1aW50MTZfdCkgaXNfZW5hYmxlKSA8PCAxNSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV93KG10OXAwMTJfY2xpZW50LT5hZGRyLAotCQkJCSBSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQkgR1JPVVBFRF9QQVJBTUVURVJfVVBEQVRFKTsKLQotCUNEQkcoIiVzOiBleGl0aW5nLiByYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5cDAxMl9zZXRfbGModm9pZCkKLXsKLQlpbnQzMl90IHJjOwotCi0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV93X3RhYmxlKG10OXAwMTJfcmVncy5yZnRibCwKLQkJCQkgICAgICAgbXQ5cDAxMl9yZWdzLnJmdGJsX3NpemUpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBtdDlwMDEyX2dldF9waWN0X2Zwcyh1aW50MTZfdCBmcHMsIHVpbnQxNl90ICpwZnBzKQotewotCS8qIGlucHV0IGZwcyBpcyBwcmV2aWV3IGZwcyBpbiBROCBmb3JtYXQgKi8KLQl1aW50MzJfdCBkaXZpZGVyOwkvKlExMCAqLwotCXVpbnQzMl90IHBjbGtfbXVsdDsJLypRMTAgKi8KLQl1aW50MzJfdCBkMTsKLQl1aW50MzJfdCBkMjsKLQotCWQxID0KLQkJKHVpbnQzMl90KSgKLQkJKG10OXAwMTJfcmVncy5yZWdfcGF0W1JFU19QUkVWSUVXXS5mcmFtZV9sZW5ndGhfbGluZXMgKgotCQkweDAwMDAwNDAwKSAvCi0JCW10OXAwMTJfcmVncy5yZWdfcGF0W1JFU19DQVBUVVJFXS5mcmFtZV9sZW5ndGhfbGluZXMpOwotCi0JZDIgPQotCQkodWludDMyX3QpKAotCQkobXQ5cDAxMl9yZWdzLnJlZ19wYXRbUkVTX1BSRVZJRVddLmxpbmVfbGVuZ3RoX3BjayAqCi0JCTB4MDAwMDA0MDApIC8KLQkJbXQ5cDAxMl9yZWdzLnJlZ19wYXRbUkVTX0NBUFRVUkVdLmxpbmVfbGVuZ3RoX3Bjayk7Ci0KLQlkaXZpZGVyID0gKHVpbnQzMl90KSAoZDEgKiBkMikgLyAweDAwMDAwNDAwOwotCi0JcGNsa19tdWx0ID0KLQkJKHVpbnQzMl90KSAoKG10OXAwMTJfcmVncy5yZWdfcGF0W1JFU19DQVBUVVJFXS5wbGxfbXVsdGlwbGllciAqCi0JCTB4MDAwMDA0MDApIC8KLQkJKG10OXAwMTJfcmVncy5yZWdfcGF0W1JFU19QUkVWSUVXXS5wbGxfbXVsdGlwbGllcikpOwotCi0JLyogVmVyaWZ5IFBDTEsgc2V0dGluZ3MgYW5kIGZyYW1lIHNpemVzLiAqLwotCSpwZnBzID0gKHVpbnQxNl90KSAoZnBzICogZGl2aWRlciAqIHBjbGtfbXVsdCAvIDB4MDAwMDA0MDAgLwotCQkJICAgIDB4MDAwMDA0MDApOwotfQotCi1zdGF0aWMgdWludDE2X3QgbXQ5cDAxMl9nZXRfcHJldl9saW5lc19wZih2b2lkKQotewotCWlmIChtdDlwMDEyX2N0cmwtPnByZXZfcmVzID09IFFUUl9TSVpFKQotCQlyZXR1cm4gbXQ5cDAxMl9yZWdzLnJlZ19wYXRbUkVTX1BSRVZJRVddLmZyYW1lX2xlbmd0aF9saW5lczsKLQllbHNlCi0JCXJldHVybiBtdDlwMDEyX3JlZ3MucmVnX3BhdFtSRVNfQ0FQVFVSRV0uZnJhbWVfbGVuZ3RoX2xpbmVzOwotfQotCi1zdGF0aWMgdWludDE2X3QgbXQ5cDAxMl9nZXRfcHJldl9waXhlbHNfcGwodm9pZCkKLXsKLQlpZiAobXQ5cDAxMl9jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkKLQkJcmV0dXJuIG10OXAwMTJfcmVncy5yZWdfcGF0W1JFU19QUkVWSUVXXS5saW5lX2xlbmd0aF9wY2s7Ci0JZWxzZQotCQlyZXR1cm4gbXQ5cDAxMl9yZWdzLnJlZ19wYXRbUkVTX0NBUFRVUkVdLmxpbmVfbGVuZ3RoX3BjazsKLX0KLQotc3RhdGljIHVpbnQxNl90IG10OXAwMTJfZ2V0X3BpY3RfbGluZXNfcGYodm9pZCkKLXsKLQlyZXR1cm4gbXQ5cDAxMl9yZWdzLnJlZ19wYXRbUkVTX0NBUFRVUkVdLmZyYW1lX2xlbmd0aF9saW5lczsKLX0KLQotc3RhdGljIHVpbnQxNl90IG10OXAwMTJfZ2V0X3BpY3RfcGl4ZWxzX3BsKHZvaWQpCi17Ci0JcmV0dXJuIG10OXAwMTJfcmVncy5yZWdfcGF0W1JFU19DQVBUVVJFXS5saW5lX2xlbmd0aF9wY2s7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBtdDlwMDEyX2dldF9waWN0X21heF9leHBfbGModm9pZCkKLXsKLQl1aW50MTZfdCBzbmFwc2hvdF9saW5lc19wZXJfZnJhbWU7Ci0KLQlpZiAobXQ5cDAxMl9jdHJsLT5waWN0X3JlcyA9PSBRVFJfU0laRSkKLQkJc25hcHNob3RfbGluZXNfcGVyX2ZyYW1lID0KLQkJICAgIG10OXAwMTJfcmVncy5yZWdfcGF0W1JFU19QUkVWSUVXXS5mcmFtZV9sZW5ndGhfbGluZXMgLSAxOwotCWVsc2UKLQkJc25hcHNob3RfbGluZXNfcGVyX2ZyYW1lID0KLQkJICAgIG10OXAwMTJfcmVncy5yZWdfcGF0W1JFU19DQVBUVVJFXS5mcmFtZV9sZW5ndGhfbGluZXMgLSAxOwotCi0JcmV0dXJuIHNuYXBzaG90X2xpbmVzX3Blcl9mcmFtZSAqIDI0OwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX3NldF9mcHMoc3RydWN0IGZwc19jZmcgKmZwcykKLXsKLQkvKiBpbnB1dCBpcyBuZXcgZnBzIGluIFExMCBmb3JtYXQgKi8KLQlpbnQzMl90IHJjID0gMDsKLQllbnVtIG10OXAwMTJfc2V0dGluZyBzZXR0aW5nOwotCi0JbXQ5cDAxMl9jdHJsLT5mcHNfZGl2aWRlciA9IGZwcy0+ZnBzX2RpdjsKLQltdDlwMDEyX2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIgPSBmcHMtPnBpY3RfZnBzX2RpdjsKLQotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwKLQkJCQkgUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJIEdST1VQRURfUEFSQU1FVEVSX0hPTEQpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlpZiAobXQ5cDAxMl9jdHJsLT5zZW5zb3Jtb2RlID09IFNFTlNPUl9QUkVWSUVXX01PREUpCi0JCXNldHRpbmcgPSBSRVNfUFJFVklFVzsKLQllbHNlCi0JCXNldHRpbmcgPSBSRVNfQ0FQVFVSRTsKLQotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwKLQkJUkVHX0ZSQU1FX0xFTkdUSF9MSU5FUywKLQkJKG10OXAwMTJfcmVncy5yZWdfcGF0W3NldHRpbmddLmZyYW1lX2xlbmd0aF9saW5lcyAqCi0JCWZwcy0+ZnBzX2RpdiAvIDB4MDAwMDA0MDApKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsCi0JCQkJIFJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCSBHUk9VUEVEX1BBUkFNRVRFUl9VUERBVEUpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX3dyaXRlX2V4cF9nYWluKHVpbnQxNl90IGdhaW4sIHVpbnQzMl90IGxpbmUpCi17Ci0JdWludDE2X3QgbWF4X2xlZ2FsX2dhaW4gPSAweDAxRkY7Ci0JdWludDMyX3QgbGluZV9sZW5ndGhfcmF0aW8gPSAweDAwMDAwNDAwOwotCWVudW0gbXQ5cDAxMl9zZXR0aW5nIHNldHRpbmc7Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlDREJHKCJMaW5lOiVkIG10OXAwMTJfd3JpdGVfZXhwX2dhaW4gXG4iLCBfX0xJTkVfXyk7Ci0KLQlpZiAobXQ5cDAxMl9jdHJsLT5zZW5zb3Jtb2RlID09IFNFTlNPUl9QUkVWSUVXX01PREUpIHsKLQkJbXQ5cDAxMl9jdHJsLT5teV9yZWdfZ2FpbiA9IGdhaW47Ci0JCW10OXAwMTJfY3RybC0+bXlfcmVnX2xpbmVfY291bnQgPSAodWludDE2X3QpIGxpbmU7Ci0JfQotCi0JaWYgKGdhaW4gPiBtYXhfbGVnYWxfZ2FpbikgewotCQlDREJHKCJNYXggbGVnYWwgZ2FpbiBMaW5lOiVkIFxuIiwgX19MSU5FX18pOwotCQlnYWluID0gbWF4X2xlZ2FsX2dhaW47Ci0JfQotCi0JLyogVmVyaWZ5IG5vIG92ZXJmbG93ICovCi0JaWYgKG10OXAwMTJfY3RybC0+c2Vuc29ybW9kZSA9PSBTRU5TT1JfUFJFVklFV19NT0RFKSB7Ci0JCWxpbmUgPSAodWludDMyX3QpIChsaW5lICogbXQ5cDAxMl9jdHJsLT5mcHNfZGl2aWRlciAvCi0JCQkJICAgMHgwMDAwMDQwMCk7Ci0JCXNldHRpbmcgPSBSRVNfUFJFVklFVzsKLQl9IGVsc2UgewotCQlsaW5lID0gKHVpbnQzMl90KSAobGluZSAqIG10OXAwMTJfY3RybC0+cGljdF9mcHNfZGl2aWRlciAvCi0JCQkJICAgMHgwMDAwMDQwMCk7Ci0JCXNldHRpbmcgPSBSRVNfQ0FQVFVSRTsKLQl9Ci0KLQkvKiBTZXQgZGlnaXRhbCBnYWluIHRvIDEgKi8KLSNpZmRlZiBNVDlQMDEyX1JFVl83Ci0JZ2FpbiB8PSAweDEwMDA7Ci0jZWxzZQotCWdhaW4gfD0gMHgwMjAwOwotI2VuZGlmCi0KLQlpZiAoKG10OXAwMTJfcmVncy5yZWdfcGF0W3NldHRpbmddLmZyYW1lX2xlbmd0aF9saW5lcyAtIDEpIDwgbGluZSkgewotCQlsaW5lX2xlbmd0aF9yYXRpbyA9ICh1aW50MzJfdCkgKGxpbmUgKiAweDAwMDAwNDAwKSAvCi0JCSAgICAobXQ5cDAxMl9yZWdzLnJlZ19wYXRbc2V0dGluZ10uZnJhbWVfbGVuZ3RoX2xpbmVzIC0gMSk7Ci0JfSBlbHNlCi0JCWxpbmVfbGVuZ3RoX3JhdGlvID0gMHgwMDAwMDQwMDsKLQotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwgUkVHX0dMT0JBTF9HQUlOLCBnYWluKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIm10OXAwMTJfaTJjX3dyaXRlX3cgZmFpbGVkLi4uIExpbmU6JWQgXG4iLCBfX0xJTkVfXyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsCi0JCQkJIFJFR19DT0FSU0VfSU5UX1RJTUUsIGxpbmUpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygibXQ5cDAxMl9pMmNfd3JpdGVfdyBmYWlsZWQuLi4gTGluZTolZCBcbiIsIF9fTElORV9fKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCUNEQkcoIm10OXAwMTJfd3JpdGVfZXhwX2dhaW46IGdhaW4gPSAlZCwgbGluZSA9ICVkXG4iLCBnYWluLCBsaW5lKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5cDAxMl9zZXRfcGljdF9leHBfZ2Fpbih1aW50MTZfdCBnYWluLCB1aW50MzJfdCBsaW5lKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JQ0RCRygiTGluZTolZCBtdDlwMDEyX3NldF9waWN0X2V4cF9nYWluIFxuIiwgX19MSU5FX18pOwotCi0JcmMgPSBtdDlwMDEyX3dyaXRlX2V4cF9nYWluKGdhaW4sIGxpbmUpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiTGluZTolZCBtdDlwMDEyX3NldF9waWN0X2V4cF9nYWluIGZhaWxlZC4uLiBcbiIsCi0JCSAgICAgX19MSU5FX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV93KG10OXAwMTJfY2xpZW50LT5hZGRyLAotCQkJCSBNVDlQMDEyX1JFR19SRVNFVF9SRUdJU1RFUiwgMHgxMENDIHwgMHgwMDAyKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIm10OXAwMTJfaTJjX3dyaXRlX3cgZmFpbGVkLi4uIExpbmU6JWQgXG4iLCBfX0xJTkVfXyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQltZGVsYXkoNSk7Ci0KLQkvKiBjYW1lcmFfdGltZWRfd2FpdChzbmFwc2hvdF93YWl0KmV4cG9zdXJlX3JhdGlvKTsgKi8KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfc2V0dGluZyhlbnVtIG10OXAwMTJfcmVnX3VwZGF0ZSBydXBkYXRlLAotCQkJICAgICAgIGVudW0gbXQ5cDAxMl9zZXR0aW5nIHJ0KQotewotCWludDMyX3QgcmMgPSAwOwotCXN3aXRjaCAocnVwZGF0ZSkgewotCWNhc2UgVVBEQVRFX1BFUklPRElDOgotCQlpZiAocnQgPT0gUkVTX1BSRVZJRVcgfHwgcnQgPT0gUkVTX0NBUFRVUkUpIHsKLQkJCXN0cnVjdCBtdDlwMDEyX2kyY19yZWdfY29uZiBwcGNfdGJsW10gPSB7Ci0JCQkJe1JFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCSBHUk9VUEVEX1BBUkFNRVRFUl9IT0xEfSwKLQkJCQl7UkVHX1JPV19TUEVFRCwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnJvd19zcGVlZH0sCi0JCQkJe1JFR19YX0FERFJfU1RBUlQsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS54X2FkZHJfc3RhcnR9LAotCQkJCXtSRUdfWF9BRERSX0VORCwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnhfYWRkcl9lbmR9LAotCQkJCXtSRUdfWV9BRERSX1NUQVJULAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ueV9hZGRyX3N0YXJ0fSwKLQkJCQl7UkVHX1lfQUREUl9FTkQsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS55X2FkZHJfZW5kfSwKLQkJCQl7UkVHX1JFQURfTU9ERSwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnJlYWRfbW9kZX0sCi0JCQkJe1JFR19TQ0FMRV9NLCBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0uc2NhbGVfbX0sCi0JCQkJe1JFR19YX09VVFBVVF9TSVpFLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ueF9vdXRwdXRfc2l6ZX0sCi0JCQkJe1JFR19ZX09VVFBVVF9TSVpFLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ueV9vdXRwdXRfc2l6ZX0sCi0KLQkJCQl7UkVHX0xJTkVfTEVOR1RIX1BDSywKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLmxpbmVfbGVuZ3RoX3Bja30sCi0JCQkJe1JFR19GUkFNRV9MRU5HVEhfTElORVMsCi0JCQkJIChtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0uZnJhbWVfbGVuZ3RoX2xpbmVzICoKLQkJCQkgIG10OXAwMTJfY3RybC0+ZnBzX2RpdmlkZXIgLyAweDAwMDAwNDAwKX0sCi0JCQkJe1JFR19DT0FSU0VfSU5UX1RJTUUsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS5jb2Fyc2VfaW50X3RpbWV9LAotCQkJCXtSRUdfRklORV9JTlRFR1JBVElPTl9USU1FLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0uZmluZV9pbnRfdGltZX0sCi0JCQkJe1JFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCSBHUk9VUEVEX1BBUkFNRVRFUl9VUERBVEV9LAotCQkJfTsKLQkJCWlmICh1cGRhdGVfdHlwZSA9PSBSRUdfSU5JVCkgewotCQkJCXVwZGF0ZV90eXBlID0gcnVwZGF0ZTsKLQkJCQlyZXR1cm4gcmM7Ci0JCQl9Ci0JCQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3dfdGFibGUoJnBwY190YmxbMF0sCi0JCQkJCQlBUlJBWV9TSVpFKHBwY190YmwpKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlyYyA9IG10OXAwMTJfdGVzdChtdDlwMDEyX2N0cmwtPnNldF90ZXN0KTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsCi0JCQkJCQkgTVQ5UDAxMl9SRUdfUkVTRVRfUkVHSVNURVIsCi0JCQkJCQkgTVQ5UDAxMl9SRVNFVF9SRUdJU1RFUl9QV09OIHwKLQkJCQkJCSAweDAwMDIpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCW1kZWxheSg1KTsJLyogMTU/IHdhaXQgZm9yIHNlbnNvciB0byB0cmFuc2l0aW9uICovCi0KLQkJCXJldHVybiByYzsKLQkJfQotCQlicmVhazsJCS8qIFVQREFURV9QRVJJT0RJQyAqLwotCi0JY2FzZSBSRUdfSU5JVDoKLQkJaWYgKHJ0ID09IFJFU19QUkVWSUVXIHx8IHJ0ID09IFJFU19DQVBUVVJFKSB7Ci0JCQlzdHJ1Y3QgbXQ5cDAxMl9pMmNfcmVnX2NvbmYgaXBjX3RibDFbXSA9IHsKLQkJCQl7TVQ5UDAxMl9SRUdfUkVTRVRfUkVHSVNURVIsCi0JCQkJIE1UOVAwMTJfUkVTRVRfUkVHSVNURVJfUFdPRkZ9LAotCQkJCXtSRUdfVlRfUElYX0NMS19ESVYsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS52dF9waXhfY2xrX2Rpdn0sCi0JCQkJe1JFR19WVF9TWVNfQ0xLX0RJViwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnZ0X3N5c19jbGtfZGl2fSwKLQkJCQl7UkVHX1BSRV9QTExfQ0xLX0RJViwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnByZV9wbGxfY2xrX2Rpdn0sCi0JCQkJe1JFR19QTExfTVVMVElQTElFUiwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnBsbF9tdWx0aXBsaWVyfSwKLQkJCQl7UkVHX09QX1BJWF9DTEtfRElWLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ub3BfcGl4X2Nsa19kaXZ9LAotCQkJCXtSRUdfT1BfU1lTX0NMS19ESVYsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS5vcF9zeXNfY2xrX2Rpdn0sCi0jaWZkZWYgTVQ5UDAxMl9SRVZfNwotCQkJCXsweDMwQjAsIDB4MDAwMX0sCi0JCQkJezB4MzA4RSwgMHhFMDYwfSwKLQkJCQl7MHgzMDkyLCAweDBBNTJ9LAotCQkJCXsweDMwOTQsIDB4NDY1Nn0sCi0JCQkJezB4MzA5NiwgMHg1NjUyfSwKLQkJCQl7MHgzMENBLCAweDgwMDZ9LAotCQkJCXsweDMxMkEsIDB4REQwMn0sCi0JCQkJezB4MzEyQywgMHgwMEU0fSwKLQkJCQl7MHgzMTcwLCAweDI5OUF9LAotI2VuZGlmCi0JCQkJLyogb3B0aW1pemVkIHNldHRpbmdzIGZvciBub2lzZSAqLwotCQkJCXsweDMwODgsIDB4NkZGNn0sCi0JCQkJezB4MzE1NCwgMHgwMjgyfSwKLQkJCQl7MHgzMTU2LCAweDAzODF9LAotCQkJCXsweDMxNjIsIDB4MDRDRX0sCi0JCQkJezB4MDIwNCwgMHgwMDEwfSwKLQkJCQl7MHgwMjA2LCAweDAwMTB9LAotCQkJCXsweDAyMDgsIDB4MDAxMH0sCi0JCQkJezB4MDIwQSwgMHgwMDEwfSwKLQkJCQl7MHgwMjBDLCAweDAwMTB9LAotCQkJCXtNVDlQMDEyX1JFR19SRVNFVF9SRUdJU1RFUiwKLQkJCQkgTVQ5UDAxMl9SRVNFVF9SRUdJU1RFUl9QV09OfSwKLQkJCX07Ci0KLQkJCXN0cnVjdCBtdDlwMDEyX2kyY19yZWdfY29uZiBpcGNfdGJsMltdID0gewotCQkJCXtNVDlQMDEyX1JFR19SRVNFVF9SRUdJU1RFUiwKLQkJCQkgTVQ5UDAxMl9SRVNFVF9SRUdJU1RFUl9QV09GRn0sCi0JCQkJe1JFR19WVF9QSVhfQ0xLX0RJViwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnZ0X3BpeF9jbGtfZGl2fSwKLQkJCQl7UkVHX1ZUX1NZU19DTEtfRElWLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0udnRfc3lzX2Nsa19kaXZ9LAotCQkJCXtSRUdfUFJFX1BMTF9DTEtfRElWLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ucHJlX3BsbF9jbGtfZGl2fSwKLQkJCQl7UkVHX1BMTF9NVUxUSVBMSUVSLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ucGxsX211bHRpcGxpZXJ9LAotCQkJCXtSRUdfT1BfUElYX0NMS19ESVYsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS5vcF9waXhfY2xrX2Rpdn0sCi0JCQkJe1JFR19PUF9TWVNfQ0xLX0RJViwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLm9wX3N5c19jbGtfZGl2fSwKLSNpZmRlZiBNVDlQMDEyX1JFVl83Ci0JCQkJezB4MzBCMCwgMHgwMDAxfSwKLQkJCQl7MHgzMDhFLCAweEUwNjB9LAotCQkJCXsweDMwOTIsIDB4MEE1Mn0sCi0JCQkJezB4MzA5NCwgMHg0NjU2fSwKLQkJCQl7MHgzMDk2LCAweDU2NTJ9LAotCQkJCXsweDMwQ0EsIDB4ODAwNn0sCi0JCQkJezB4MzEyQSwgMHhERDAyfSwKLQkJCQl7MHgzMTJDLCAweDAwRTR9LAotCQkJCXsweDMxNzAsIDB4Mjk5QX0sCi0jZW5kaWYKLQkJCQkvKiBvcHRpbWl6ZWQgc2V0dGluZ3MgZm9yIG5vaXNlICovCi0JCQkJezB4MzA4OCwgMHg2RkY2fSwKLQkJCQl7MHgzMTU0LCAweDAyODJ9LAotCQkJCXsweDMxNTYsIDB4MDM4MX0sCi0JCQkJezB4MzE2MiwgMHgwNENFfSwKLQkJCQl7MHgwMjA0LCAweDAwMTB9LAotCQkJCXsweDAyMDYsIDB4MDAxMH0sCi0JCQkJezB4MDIwOCwgMHgwMDEwfSwKLQkJCQl7MHgwMjBBLCAweDAwMTB9LAotCQkJCXsweDAyMEMsIDB4MDAxMH0sCi0JCQkJe01UOVAwMTJfUkVHX1JFU0VUX1JFR0lTVEVSLAotCQkJCSBNVDlQMDEyX1JFU0VUX1JFR0lTVEVSX1BXT059LAotCQkJfTsKLQotCQkJc3RydWN0IG10OXAwMTJfaTJjX3JlZ19jb25mIGlwY190YmwzW10gPSB7Ci0JCQkJe1JFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCSBHUk9VUEVEX1BBUkFNRVRFUl9IT0xEfSwKLQkJCQkvKiBTZXQgcHJldmlldyBvciBzbmFwc2hvdCBtb2RlICovCi0JCQkJe1JFR19ST1dfU1BFRUQsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS5yb3dfc3BlZWR9LAotCQkJCXtSRUdfWF9BRERSX1NUQVJULAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ueF9hZGRyX3N0YXJ0fSwKLQkJCQl7UkVHX1hfQUREUl9FTkQsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS54X2FkZHJfZW5kfSwKLQkJCQl7UkVHX1lfQUREUl9TVEFSVCwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnlfYWRkcl9zdGFydH0sCi0JCQkJe1JFR19ZX0FERFJfRU5ELAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ueV9hZGRyX2VuZH0sCi0JCQkJe1JFR19SRUFEX01PREUsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS5yZWFkX21vZGV9LAotCQkJCXtSRUdfU0NBTEVfTSwgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnNjYWxlX219LAotCQkJCXtSRUdfWF9PVVRQVVRfU0laRSwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnhfb3V0cHV0X3NpemV9LAotCQkJCXtSRUdfWV9PVVRQVVRfU0laRSwKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLnlfb3V0cHV0X3NpemV9LAotCQkJCXtSRUdfTElORV9MRU5HVEhfUENLLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0ubGluZV9sZW5ndGhfcGNrfSwKLQkJCQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FUywKLQkJCQkgbXQ5cDAxMl9yZWdzLnJlZ19wYXRbcnRdLmZyYW1lX2xlbmd0aF9saW5lc30sCi0JCQkJe1JFR19DT0FSU0VfSU5UX1RJTUUsCi0JCQkJIG10OXAwMTJfcmVncy5yZWdfcGF0W3J0XS5jb2Fyc2VfaW50X3RpbWV9LAotCQkJCXtSRUdfRklORV9JTlRFR1JBVElPTl9USU1FLAotCQkJCSBtdDlwMDEyX3JlZ3MucmVnX3BhdFtydF0uZmluZV9pbnRfdGltZX0sCi0JCQkJe1JFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCSBHUk9VUEVEX1BBUkFNRVRFUl9VUERBVEV9LAotCQkJfTsKLQotCQkJLyogcmVzZXQgZnBzX2RpdmlkZXIgKi8KLQkJCW10OXAwMTJfY3RybC0+ZnBzX2RpdmlkZXIgPSAxICogMHgwNDAwOwotCi0JCQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3dfdGFibGUoJmlwY190YmwxWzBdLAotCQkJCQkJICAgICAgIEFSUkFZX1NJWkUoaXBjX3RibDEpKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3dfdGFibGUoJmlwY190YmwyWzBdLAotCQkJCQkJICAgICAgIEFSUkFZX1NJWkUoaXBjX3RibDIpKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQltZGVsYXkoNSk7Ci0KLQkJCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfd190YWJsZSgmaXBjX3RibDNbMF0sCi0JCQkJCQkgICAgICAgQVJSQVlfU0laRShpcGNfdGJsMykpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCS8qIGxvYWQgbGVucyBzaGFkaW5nICovCi0JCQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsCi0JCQkJCQkgUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJCQkgR1JPVVBFRF9QQVJBTUVURVJfSE9MRCk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJcmMgPSBtdDlwMDEyX3NldF9sYygpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwKLQkJCQkJCSBSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQkJCSBHUk9VUEVEX1BBUkFNRVRFUl9VUERBVEUpOwotCi0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQkJfQotCQl1cGRhdGVfdHlwZSA9IHJ1cGRhdGU7Ci0JCWJyZWFrOwkJLyogY2FzZSBSRUdfSU5JVDogKi8KLQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQkJCS8qIHN3aXRjaCAocnVwZGF0ZSkgKi8KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5cDAxMl92aWRlb19jb25maWcoaW50IG1vZGUsIGludCByZXMpCi17Ci0JaW50MzJfdCByYzsKLQotCXN3aXRjaCAocmVzKSB7Ci0JY2FzZSBRVFJfU0laRToKLQkJcmMgPSBtdDlwMDEyX3NldHRpbmcoVVBEQVRFX1BFUklPRElDLCBSRVNfUFJFVklFVyk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJQ0RCRygibXQ5cDAxMiBzZW5zb3IgY29uZmlndXJhdGlvbiBkb25lIVxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBGVUxMX1NJWkU6Ci0JCXJjID0gbXQ5cDAxMl9zZXR0aW5nKFVQREFURV9QRVJJT0RJQywgUkVTX0NBUFRVUkUpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfQkJCS8qIHN3aXRjaCAqLwotCi0JbXQ5cDAxMl9jdHJsLT5wcmV2X3JlcyA9IHJlczsKLQltdDlwMDEyX2N0cmwtPmN1cnJfcmVzID0gcmVzOwotCW10OXAwMTJfY3RybC0+c2Vuc29ybW9kZSA9IG1vZGU7Ci0KLQlyYyA9IG10OXAwMTJfd3JpdGVfZXhwX2dhaW4obXQ5cDAxMl9jdHJsLT5teV9yZWdfZ2FpbiwKLQkJCQkgICAgbXQ5cDAxMl9jdHJsLT5teV9yZWdfbGluZV9jb3VudCk7Ci0KLQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsCi0JCQkJIE1UOVAwMTJfUkVHX1JFU0VUX1JFR0lTVEVSLCAweDEwY2MgfCAweDAwMDIpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX3NuYXBzaG90X2NvbmZpZyhpbnQgbW9kZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCXJjID0gbXQ5cDAxMl9zZXR0aW5nKFVQREFURV9QRVJJT0RJQywgUkVTX0NBUFRVUkUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCW10OXAwMTJfY3RybC0+Y3Vycl9yZXMgPSBtdDlwMDEyX2N0cmwtPnBpY3RfcmVzOwotCi0JbXQ5cDAxMl9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5cDAxMl9yYXdfc25hcHNob3RfY29uZmlnKGludCBtb2RlKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JcmMgPSBtdDlwMDEyX3NldHRpbmcoVVBEQVRFX1BFUklPRElDLCBSRVNfQ0FQVFVSRSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JbXQ5cDAxMl9jdHJsLT5jdXJyX3JlcyA9IG10OXAwMTJfY3RybC0+cGljdF9yZXM7Ci0KLQltdDlwMDEyX2N0cmwtPnNlbnNvcm1vZGUgPSBtb2RlOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX3Bvd2VyX2Rvd24odm9pZCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwKLQkJCQkgTVQ5UDAxMl9SRUdfUkVTRVRfUkVHSVNURVIsCi0JCQkJIE1UOVAwMTJfUkVTRVRfUkVHSVNURVJfUFdPRkYpOwotCi0JbWRlbGF5KDUpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5cDAxMl9tb3ZlX2ZvY3VzKGludCBkaXJlY3Rpb24sIGludDMyX3QgbnVtX3N0ZXBzKQotewotCWludDE2X3Qgc3RlcF9kaXJlY3Rpb247Ci0JaW50MTZfdCBhY3R1YWxfc3RlcDsKLQlpbnQxNl90IG5leHRfcG9zaXRpb247Ci0JdWludDhfdCBjb2RlX3ZhbF9tc2IsIGNvZGVfdmFsX2xzYjsKLQotCWlmIChudW1fc3RlcHMgPiBNVDlQMDEyX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSKQotCQludW1fc3RlcHMgPSBNVDlQMDEyX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSOwotCWVsc2UgaWYgKG51bV9zdGVwcyA9PSAwKSB7Ci0JCUNEQkcoIm10OXAwMTJfbW92ZV9mb2N1cyBmYWlsZWQgYXQgbGluZSAlZCAuLi5cbiIsIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGRpcmVjdGlvbiA9PSBNT1ZFX05FQVIpCi0JCXN0ZXBfZGlyZWN0aW9uID0gMTY7CS8qIDEwYml0ICovCi0JZWxzZSBpZiAoZGlyZWN0aW9uID09IE1PVkVfRkFSKQotCQlzdGVwX2RpcmVjdGlvbiA9IC0xNjsJLyogMTAgYml0ICovCi0JZWxzZSB7Ci0JCUNEQkcoIm10OXAwMTJfbW92ZV9mb2N1cyBmYWlsZWQgYXQgbGluZSAlZCAuLi5cbiIsIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKG10OXAwMTJfY3RybC0+Y3Vycl9sZW5zX3BvcyA8IG10OXAwMTJfY3RybC0+aW5pdF9jdXJyX2xlbnNfcG9zKQotCQltdDlwMDEyX2N0cmwtPmN1cnJfbGVuc19wb3MgPSBtdDlwMDEyX2N0cmwtPmluaXRfY3Vycl9sZW5zX3BvczsKLQotCWFjdHVhbF9zdGVwID0gKGludDE2X3QpIChzdGVwX2RpcmVjdGlvbiAqIChpbnQxNl90KSBudW1fc3RlcHMpOwotCW5leHRfcG9zaXRpb24gPSAoaW50MTZfdCkgKG10OXAwMTJfY3RybC0+Y3Vycl9sZW5zX3BvcyArIGFjdHVhbF9zdGVwKTsKLQotCWlmIChuZXh0X3Bvc2l0aW9uID4gMTAyMykKLQkJbmV4dF9wb3NpdGlvbiA9IDEwMjM7Ci0JZWxzZSBpZiAobmV4dF9wb3NpdGlvbiA8IDApCi0JCW5leHRfcG9zaXRpb24gPSAwOwotCi0JY29kZV92YWxfbXNiID0gbmV4dF9wb3NpdGlvbiA+PiA0OwotCWNvZGVfdmFsX2xzYiA9IChuZXh0X3Bvc2l0aW9uICYgMHgwMDBGKSA8PCA0OwotCS8qIGNvZGVfdmFsX2xzYiB8PSBtb2RlX21hc2s7ICovCi0KLQkvKiBXcml0aW5nIHRoZSBkaWdpdGFsIGNvZGUgZm9yIGN1cnJlbnQgdG8gdGhlIGFjdHVhdG9yICovCi0JaWYgKG10OXAwMTJfaTJjX3dyaXRlX2IoTVQ5UDAxMl9BRl9JMkNfQUREUiA+PiAxLAotCQkJCWNvZGVfdmFsX21zYiwgY29kZV92YWxfbHNiKSA8IDApIHsKLQkJQ0RCRygibXQ5cDAxMl9tb3ZlX2ZvY3VzIGZhaWxlZCBhdCBsaW5lICVkIC4uLlxuIiwgX19MSU5FX18pOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCS8qIFN0b3JpbmcgdGhlIGN1cnJlbnQgbGVucyBQb3NpdGlvbiAqLwotCW10OXAwMTJfY3RybC0+Y3Vycl9sZW5zX3BvcyA9IG5leHRfcG9zaXRpb247Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5cDAxMl9zZXRfZGVmYXVsdF9mb2N1cyh2b2lkKQotewotCWludDMyX3QgcmMgPSAwOwotCXVpbnQ4X3QgY29kZV92YWxfbXNiLCBjb2RlX3ZhbF9sc2I7Ci0KLQljb2RlX3ZhbF9tc2IgPSAweDAwOwotCWNvZGVfdmFsX2xzYiA9IDB4MDA7Ci0KLQkvKiBXcml0ZSB0aGUgZGlnaXRhbCBjb2RlIGZvciBjdXJyZW50IHRvIHRoZSBhY3R1YXRvciAqLwotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfYihNVDlQMDEyX0FGX0kyQ19BRERSID4+IDEsCi0JCQkJIGNvZGVfdmFsX21zYiwgY29kZV92YWxfbHNiKTsKLQotCW10OXAwMTJfY3RybC0+Y3Vycl9sZW5zX3BvcyA9IDA7Ci0JbXQ5cDAxMl9jdHJsLT5pbml0X2N1cnJfbGVuc19wb3MgPSAwOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG10OXAwMTJfcHJvYmVfaW5pdF9kb25lKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCWdwaW9fZnJlZShkYXRhLT5zZW5zb3JfcmVzZXQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG10OXAwMTJfcHJvYmVfaW5pdF9zZW5zb3IoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JaW50MzJfdCByYzsKLQl1aW50MTZfdCBjaGlwaWQ7Ci0KLQlyYyA9IGdwaW9fcmVxdWVzdChkYXRhLT5zZW5zb3JfcmVzZXQsICJtdDlwMDEyIik7Ci0JaWYgKCFyYykKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnNlbnNvcl9yZXNldCwgMSk7Ci0JZWxzZQotCQlnb3RvIGluaXRfcHJvYmVfZG9uZTsKLQotCW1zbGVlcCgyMCk7Ci0KLQkvKiBSRVNFVCB0aGUgc2Vuc29yIGltYWdlIHBhcnQgdmlhIEkyQyBjb21tYW5kICovCi0JQ0RCRygibXQ5cDAxMl9zZW5zb3JfaW5pdCgpOiByZXNldGluZyBzZW5zb3IuXG4iKTsKLQlyYyA9IG10OXAwMTJfaTJjX3dyaXRlX3cobXQ5cDAxMl9jbGllbnQtPmFkZHIsCi0JCQkJIE1UOVAwMTJfUkVHX1JFU0VUX1JFR0lTVEVSLCAweDEwQ0MgfCAweDAwMDEpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygic2Vuc29yIHJlc2V0IGZhaWxlZC4gcmMgPSAlZFxuIiwgcmMpOwotCQlnb3RvIGluaXRfcHJvYmVfZmFpbDsKLQl9Ci0KLQltc2xlZXAoTVQ5UDAxMl9SRVNFVF9ERUxBWV9NU0VDUyk7Ci0KLQkvKiAzLiBSZWFkIHNlbnNvciBNb2RlbCBJRDogKi8KLQlyYyA9IG10OXAwMTJfaTJjX3JlYWRfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwKLQkJCQlNVDlQMDEyX1JFR19NT0RFTF9JRCwgJmNoaXBpZCk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0KLQkvKiA0LiBDb21wYXJlIHNlbnNvciBJRCB0byBNVDlUMDEyVkMgSUQ6ICovCi0JaWYgKGNoaXBpZCAhPSBNVDlQMDEyX01PREVMX0lEKSB7Ci0JCUNEQkcoIm10OXAwMTIgd3JvbmcgbW9kZWxfaWQgPSAweCV4XG4iLCBjaGlwaWQpOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCX0KLQotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwgMHgzMDZFLCAweDkwMDApOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiUkVWXzcgd3JpdGUgZmFpbGVkLiByYyA9ICVkXG4iLCByYyk7Ci0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCX0KLQotCS8qIFJFU0VUX1JFR0lTVEVSLCBlbmFibGUgcGFyYWxsZWwgaW50ZXJmYWNlIGFuZCBkaXNhYmxlIHNlcmlhbGlzZXIgKi8KLQlDREJHKCJtdDlwMDEyX3NlbnNvcl9pbml0KCk6IGVuYWJsaW5nIHBhcmFsbGVsIGludGVyZmFjZS5cbiIpOwotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwgMHgzMDFBLCAweDEwQ0MpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiZW5hYmxlIHBhcmFsbGVsIGludGVyZmFjZSBmYWlsZWQuIHJjID0gJWRcbiIsIHJjKTsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCi0JLyogVG8gZGlzYWJsZSB0aGUgMiBleHRyYSBsaW5lcyAqLwotCXJjID0gbXQ5cDAxMl9pMmNfd3JpdGVfdyhtdDlwMDEyX2NsaWVudC0+YWRkciwgMHgzMDY0LCAweDA4MDUpOwotCi0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJkaXNhYmxlIHRoZSAyIGV4dHJhIGxpbmVzIGZhaWxlZC4gcmMgPSAlZFxuIiwgcmMpOwotCQlnb3RvIGluaXRfcHJvYmVfZmFpbDsKLQl9Ci0JZ290byBpbml0X3Byb2JlX2RvbmU7Ci0KLWluaXRfcHJvYmVfZmFpbDoKLQltdDlwMDEyX3Byb2JlX2luaXRfZG9uZShkYXRhKTsKLWluaXRfcHJvYmVfZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXQ5cDAxMl9zZW5zb3Jfb3Blbl9pbml0KGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCWludDMyX3QgcmM7Ci0KLQltdDlwMDEyX2N0cmwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXQ5cDAxMl9jdHJsKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtdDlwMDEyX2N0cmwpIHsKLQkJQ0RCRygibXQ5cDAxMl9pbml0IGZhaWxlZCFcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gaW5pdF9kb25lOwotCX0KLQotCW10OXAwMTJfY3RybC0+ZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQltdDlwMDEyX2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQltdDlwMDEyX2N0cmwtPnNldF90ZXN0ID0gVEVTVF9PRkY7Ci0JbXQ5cDAxMl9jdHJsLT5wcmV2X3JlcyA9IFFUUl9TSVpFOwotCW10OXAwMTJfY3RybC0+cGljdF9yZXMgPSBGVUxMX1NJWkU7Ci0KLQlpZiAoZGF0YSkKLQkJbXQ5cDAxMl9jdHJsLT5zZW5zb3JkYXRhID0gZGF0YTsKLQotCW1zbV9jYW1pb19jYW1pZl9wYWRfcmVnX3Jlc2V0KCk7Ci0JbWRlbGF5KDIwKTsKLQotCXJjID0gbXQ5cDAxMl9wcm9iZV9pbml0X3NlbnNvcihkYXRhKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGluaXRfZmFpbDE7Ci0KLQlpZiAobXQ5cDAxMl9jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkKLQkJcmMgPSBtdDlwMDEyX3NldHRpbmcoUkVHX0lOSVQsIFJFU19QUkVWSUVXKTsKLQllbHNlCi0JCXJjID0gbXQ5cDAxMl9zZXR0aW5nKFJFR19JTklULCBSRVNfQ0FQVFVSRSk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIm10OXAwMTJfc2V0dGluZyBmYWlsZWQuIHJjID0gJWRcbiIsIHJjKTsKLQkJZ290byBpbml0X2ZhaWwxOwotCX0KLQotCS8qIHNlbnNvciA6IG91dHB1dCBlbmFibGUgKi8KLQlDREJHKCJtdDlwMDEyX3NlbnNvcl9vcGVuX2luaXQoKTogZW5hYmxpbmcgb3V0cHV0LlxuIik7Ci0JcmMgPSBtdDlwMDEyX2kyY193cml0ZV93KG10OXAwMTJfY2xpZW50LT5hZGRyLAotCQkJCSBNVDlQMDEyX1JFR19SRVNFVF9SRUdJU1RFUiwKLQkJCQkgTVQ5UDAxMl9SRVNFVF9SRUdJU1RFUl9QV09OKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoInNlbnNvciBvdXRwdXQgZW5hYmxlIGZhaWxlZC4gcmMgPSAlZFxuIiwgcmMpOwotCQlnb3RvIGluaXRfZmFpbDE7Ci0JfQotCi0JLyogZW5hYmxlIEFGIGFjdHVhdG9yICovCi0JaWYgKG10OXAwMTJfY3RybC0+c2Vuc29yZGF0YS0+dmNtX2VuYWJsZSkgewotCQlDREJHKCJlbmFibGUgQUYgYWN0dWF0b3IsIGdwaW8gPSAlZFxuIiwKLQkJCSBtdDlwMDEyX2N0cmwtPnNlbnNvcmRhdGEtPnZjbV9wd2QpOwotCQlyYyA9IGdwaW9fcmVxdWVzdChtdDlwMDEyX2N0cmwtPnNlbnNvcmRhdGEtPnZjbV9wd2QsCi0JCQkJCQkibXQ5cDAxMiIpOwotCQlpZiAoIXJjKQotCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KAotCQkJCW10OXAwMTJfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCwKLQkJCQkgMSk7Ci0JCWVsc2UgewotCQkJQ0RCRygibXQ5cDAxMl9jdHJsIGdwaW8gcmVxdWVzdCBmYWlsZWQhXG4iKTsKLQkJCWdvdG8gaW5pdF9mYWlsMTsKLQkJfQotCQltc2xlZXAoMjApOwotCQlyYyA9IG10OXAwMTJfc2V0X2RlZmF1bHRfZm9jdXMoKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG10OXAwMTJfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCwKLQkJCQkJCQkJMCk7Ci0JCQlncGlvX2ZyZWUobXQ5cDAxMl9jdHJsLT5zZW5zb3JkYXRhLT52Y21fcHdkKTsKLQkJfQotCX0KLQlpZiAocmMgPj0gMCkKLQkJZ290byBpbml0X2RvbmU7Ci1pbml0X2ZhaWwxOgotCW10OXAwMTJfcHJvYmVfaW5pdF9kb25lKGRhdGEpOwotCWtmcmVlKG10OXAwMTJfY3RybCk7Ci1pbml0X2RvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG10OXAwMTJfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQkvKiBJbml0aWFsaXplIHRoZSBNU01fQ0FNSTJDIENoaXAgKi8KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtdDlwMDEyX3dhaXRfcXVldWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX3NldF9zZW5zb3JfbW9kZShpbnQgbW9kZSwgaW50IHJlcykKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgU0VOU09SX1BSRVZJRVdfTU9ERToKLQkJcmMgPSBtdDlwMDEyX3ZpZGVvX2NvbmZpZyhtb2RlLCByZXMpOwotCQlicmVhazsKLQotCWNhc2UgU0VOU09SX1NOQVBTSE9UX01PREU6Ci0JCXJjID0gbXQ5cDAxMl9zbmFwc2hvdF9jb25maWcobW9kZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTRU5TT1JfUkFXX1NOQVBTSE9UX01PREU6Ci0JCXJjID0gbXQ5cDAxMl9yYXdfc25hcHNob3RfY29uZmlnKG1vZGUpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXQ5cDAxMl9zZW5zb3JfY29uZmlnKHZvaWQgX191c2VyICphcmdwKQotewotCXN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEgY2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmY2RhdGEsCi0JCQkgICAodm9pZCAqKWFyZ3AsIHNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JbXV0ZXhfbG9jaygmbXQ5cDAxMl9tdXQpOwotCi0JQ0RCRygiJXM6IGNmZ3R5cGUgPSAlZFxuIiwgX19mdW5jX18sIGNkYXRhLmNmZ3R5cGUpOwotCXN3aXRjaCAoY2RhdGEuY2ZndHlwZSkgewotCWNhc2UgQ0ZHX0dFVF9QSUNUX0ZQUzoKLQkJbXQ5cDAxMl9nZXRfcGljdF9mcHMoY2RhdGEuY2ZnLmdmcHMucHJldmZwcywKLQkJCQkgICAgICYoY2RhdGEuY2ZnLmdmcHMucGljdGZwcykpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLCAmY2RhdGEsCi0JCQkJIHNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfR0VUX1BSRVZfTF9QRjoKLQkJY2RhdGEuY2ZnLnByZXZsX3BmID0gbXQ5cDAxMl9nZXRfcHJldl9saW5lc19wZigpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSAmY2RhdGEsIHNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfR0VUX1BSRVZfUF9QTDoKLQkJY2RhdGEuY2ZnLnByZXZwX3BsID0gbXQ5cDAxMl9nZXRfcHJldl9waXhlbHNfcGwoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkgJmNkYXRhLCBzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX0dFVF9QSUNUX0xfUEY6Ci0JCWNkYXRhLmNmZy5waWN0bF9wZiA9IG10OXAwMTJfZ2V0X3BpY3RfbGluZXNfcGYoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkgJmNkYXRhLCBzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX0dFVF9QSUNUX1BfUEw6Ci0JCWNkYXRhLmNmZy5waWN0cF9wbCA9IG10OXAwMTJfZ2V0X3BpY3RfcGl4ZWxzX3BsKCk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJICZjZGF0YSwgc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19HRVRfUElDVF9NQVhfRVhQX0xDOgotCQljZGF0YS5jZmcucGljdF9tYXhfZXhwX2xjID0gbXQ5cDAxMl9nZXRfcGljdF9tYXhfZXhwX2xjKCk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJICZjZGF0YSwgc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfRlBTOgotCWNhc2UgQ0ZHX1NFVF9QSUNUX0ZQUzoKLQkJcmMgPSBtdDlwMDEyX3NldF9mcHMoJihjZGF0YS5jZmcuZnBzKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX0VYUF9HQUlOOgotCQlyYyA9IG10OXAwMTJfd3JpdGVfZXhwX2dhaW4oY2RhdGEuY2ZnLmV4cF9nYWluLmdhaW4sCi0JCQkJCSAgICBjZGF0YS5jZmcuZXhwX2dhaW4ubGluZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX1BJQ1RfRVhQX0dBSU46Ci0JCUNEQkcoIkxpbmU6JWQgQ0ZHX1NFVF9QSUNUX0VYUF9HQUlOIFxuIiwgX19MSU5FX18pOwotCQlyYyA9IG10OXAwMTJfc2V0X3BpY3RfZXhwX2dhaW4oY2RhdGEuY2ZnLmV4cF9nYWluLmdhaW4sCi0JCQkJCSAgICAgICBjZGF0YS5jZmcuZXhwX2dhaW4ubGluZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX01PREU6Ci0JCXJjID0gbXQ5cDAxMl9zZXRfc2Vuc29yX21vZGUoY2RhdGEubW9kZSwgY2RhdGEucnMpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1BXUl9ET1dOOgotCQlyYyA9IG10OXAwMTJfcG93ZXJfZG93bigpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX01PVkVfRk9DVVM6Ci0JCUNEQkcoIm10OXAwMTJfaW9jdGw6IENGR19NT1ZFX0ZPQ1VTOiBjZGF0YS5jZmcuZm9jdXMuZGlyPSVkIFwKLQkJCQljZGF0YS5jZmcuZm9jdXMuc3RlcHM9JWRcbiIsCi0JCQkJY2RhdGEuY2ZnLmZvY3VzLmRpciwgY2RhdGEuY2ZnLmZvY3VzLnN0ZXBzKTsKLQkJcmMgPSBtdDlwMDEyX21vdmVfZm9jdXMoY2RhdGEuY2ZnLmZvY3VzLmRpciwKLQkJCQkJY2RhdGEuY2ZnLmZvY3VzLnN0ZXBzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfREVGQVVMVF9GT0NVUzoKLQkJcmMgPSBtdDlwMDEyX3NldF9kZWZhdWx0X2ZvY3VzKCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX0xFTlNfU0hBRElORzoKLQkJQ0RCRygiJXM6IENGR19TRVRfTEVOU19TSEFESU5HXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gbXQ5cDAxMl9sZW5zX3NoYWRpbmdfZW5hYmxlKGNkYXRhLmNmZy5sZW5zX3NoYWRpbmcpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX0dFVF9BRl9NQVhfU1RFUFM6Ci0JCWNkYXRhLm1heF9zdGVwcyA9IE1UOVAwMTJfU1RFUFNfTkVBUl9UT19DTE9TRVNUX0lORjsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJICZjZGF0YSwgc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfRUZGRUNUOgotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZtdDlwMDEyX211dCk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXQ5cDAxMl9zZW5zb3JfcmVsZWFzZSh2b2lkKQotewotCWludCByYyA9IC1FQkFERjsKLQotCW11dGV4X2xvY2soJm10OXAwMTJfbXV0KTsKLQotCW10OXAwMTJfcG93ZXJfZG93bigpOwotCi0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG10OXAwMTJfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3Jlc2V0LCAwKTsKLQlncGlvX2ZyZWUobXQ5cDAxMl9jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcmVzZXQpOwotCi0JaWYgKG10OXAwMTJfY3RybC0+c2Vuc29yZGF0YS0+dmNtX2VuYWJsZSkgewotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQobXQ5cDAxMl9jdHJsLT5zZW5zb3JkYXRhLT52Y21fcHdkLCAwKTsKLQkJZ3Bpb19mcmVlKG10OXAwMTJfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCk7Ci0JfQotCi0Ja2ZyZWUobXQ5cDAxMl9jdHJsKTsKLQltdDlwMDEyX2N0cmwgPSBOVUxMOwotCi0JQ0RCRygibXQ5cDAxMl9yZWxlYXNlIGNvbXBsZXRlZFxuIik7Ci0KLQltdXRleF91bmxvY2soJm10OXAwMTJfbXV0KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXQ5cDAxMl9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCSAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCWludCByYyA9IDA7Ci0JQ0RCRygibXQ5cDAxMl9wcm9iZSBjYWxsZWQhXG4iKTsKLQotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7Ci0JCUNEQkcoImkyY19jaGVja19mdW5jdGlvbmFsaXR5IGZhaWxlZFxuIik7Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0KLQltdDlwMDEyX3NlbnNvcncgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXQ5cDAxMl93b3JrKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtdDlwMDEyX3NlbnNvcncpIHsKLQkJQ0RCRygia3phbGxvYyBmYWlsZWQuXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIHByb2JlX2ZhaWx1cmU7Ci0JfQotCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgbXQ5cDAxMl9zZW5zb3J3KTsKLQltdDlwMDEyX2luaXRfY2xpZW50KGNsaWVudCk7Ci0JbXQ5cDAxMl9jbGllbnQgPSBjbGllbnQ7Ci0KLQltZGVsYXkoNTApOwotCi0JQ0RCRygibXQ5cDAxMl9wcm9iZSBzdWNjZXNzZWQhIHJjID0gJWRcbiIsIHJjKTsKLQlyZXR1cm4gMDsKLQotcHJvYmVfZmFpbHVyZToKLQlDREJHKCJtdDlwMDEyX3Byb2JlIGZhaWxlZCEgcmMgPSAlZFxuIiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG10OXAwMTJfaTJjX2lkW10gPSB7Ci0JeyJtdDlwMDEyIiwgMH0sCi0Je30KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtdDlwMDEyX2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gbXQ5cDAxMl9pMmNfaWQsCi0JLnByb2JlID0gbXQ5cDAxMl9pMmNfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZXhpdF9wKG10OXAwMTJfaTJjX3JlbW92ZSksCi0JLmRyaXZlciA9IHsKLQkJICAgLm5hbWUgPSAibXQ5cDAxMiIsCi0JCSAgIH0sCi19OwotCi1zdGF0aWMgaW50IG10OXAwMTJfc2Vuc29yX3Byb2JlKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICppbmZvLAotCQkJCXN0cnVjdCBtc21fc2Vuc29yX2N0cmwgKnMpCi17Ci0JaW50IHJjID0gaTJjX2FkZF9kcml2ZXIoJm10OXAwMTJfaTJjX2RyaXZlcik7Ci0JaWYgKHJjIDwgMCB8fCBtdDlwMDEyX2NsaWVudCA9PSBOVUxMKSB7Ci0JCXJjID0gLUVOT1RTVVBQOwotCQlnb3RvIHByb2JlX2RvbmU7Ci0JfQotCi0JbXNtX2NhbWlvX2Nsa19yYXRlX3NldChNVDlQMDEyX0RFRkFVTFRfQ0xPQ0tfUkFURSk7Ci0JbWRlbGF5KDIwKTsKLQotCXJjID0gbXQ5cDAxMl9wcm9iZV9pbml0X3NlbnNvcihpbmZvKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIHByb2JlX2RvbmU7Ci0KLQlzLT5zX2luaXQgPSBtdDlwMDEyX3NlbnNvcl9vcGVuX2luaXQ7Ci0Jcy0+c19yZWxlYXNlID0gbXQ5cDAxMl9zZW5zb3JfcmVsZWFzZTsKLQlzLT5zX2NvbmZpZyA9IG10OXAwMTJfc2Vuc29yX2NvbmZpZzsKLQlzLT5zX21vdW50X2FuZ2xlICA9IDA7Ci0JbXQ5cDAxMl9wcm9iZV9pbml0X2RvbmUoaW5mbyk7Ci0KLXByb2JlX2RvbmU6Ci0JQ0RCRygiJXMgJXM6JWRcbiIsIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX210OXAwMTJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gbXNtX2NhbWVyYV9kcnZfc3RhcnQocGRldiwgbXQ5cDAxMl9zZW5zb3JfcHJvYmUpOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fY2FtZXJhX2RyaXZlciA9IHsKLQkucHJvYmUgPSBfX210OXAwMTJfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJICAgLm5hbWUgPSAibXNtX2NhbWVyYV9tdDlwMDEyIiwKLQkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCSAgIH0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtdDlwMDEyX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fY2FtZXJhX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KG10OXAwMTJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5cDAxMl9rbS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL210OXAwMTJfa20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5MDIzYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5cDAxMl9rbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5NiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxtZWRpYS9tc21fY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlICJtdDlwMDEyX2ttLmgiCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIFNFTlNPUiBSRUdJU1RFUiBERUZJTkVTCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNkZWZpbmUgTVQ5UDAxMl9LTV9SRUdfTU9ERUxfSUQgICAgICAweDAwMDAKLSNkZWZpbmUgTVQ5UDAxMl9LTV9NT0RFTF9JRCAgICAgICAgICAweDI4MDAKLSNkZWZpbmUgUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQgICAweDAxMDQKLSNkZWZpbmUgR1JPVVBFRF9QQVJBTUVURVJfSE9MRCAgICAgICAweDAxMDAKLSNkZWZpbmUgR1JPVVBFRF9QQVJBTUVURVJfVVBEQVRFICAgICAweDAwMDAKLSNkZWZpbmUgUkVHX0NPQVJTRV9JTlRfVElNRSAgICAgICAgICAweDMwMTIKLSNkZWZpbmUgUkVHX1ZUX1BJWF9DTEtfRElWICAgICAgICAgICAweDAzMDAKLSNkZWZpbmUgUkVHX1ZUX1NZU19DTEtfRElWICAgICAgICAgICAweDAzMDIKLSNkZWZpbmUgUkVHX1BSRV9QTExfQ0xLX0RJViAgICAgICAgICAweDAzMDQKLSNkZWZpbmUgUkVHX1BMTF9NVUxUSVBMSUVSICAgICAgICAgICAweDAzMDYKLSNkZWZpbmUgUkVHX09QX1BJWF9DTEtfRElWICAgICAgICAgICAweDAzMDgKLSNkZWZpbmUgUkVHX09QX1NZU19DTEtfRElWICAgICAgICAgICAweDAzMEEKLSNkZWZpbmUgUkVHX1NDQUxFX00gICAgICAgICAgICAgICAgICAweDA0MDQKLSNkZWZpbmUgUkVHX0ZSQU1FX0xFTkdUSF9MSU5FUyAgICAgICAweDMwMEEKLSNkZWZpbmUgUkVHX0xJTkVfTEVOR1RIX1BDSyAgICAgICAgICAweDMwMEMKLSNkZWZpbmUgUkVHX1hfQUREUl9TVEFSVCAgICAgICAgICAgICAweDMwMDQKLSNkZWZpbmUgUkVHX1lfQUREUl9TVEFSVCAgICAgICAgICAgICAweDMwMDIKLSNkZWZpbmUgUkVHX1hfQUREUl9FTkQgICAgICAgICAgICAgICAweDMwMDgKLSNkZWZpbmUgUkVHX1lfQUREUl9FTkQgICAgICAgICAgICAgICAweDMwMDYKLSNkZWZpbmUgUkVHX1hfT1VUUFVUX1NJWkUgICAgICAgICAgICAweDAzNEMKLSNkZWZpbmUgUkVHX1lfT1VUUFVUX1NJWkUgICAgICAgICAgICAweDAzNEUKLSNkZWZpbmUgUkVHX0ZJTkVfSU5URUdSQVRJT05fVElNRSAgICAweDMwMTQKLSNkZWZpbmUgUkVHX1JPV19TUEVFRCAgICAgICAgICAgICAgICAweDMwMTYKLSNkZWZpbmUgTVQ5UDAxMl9LTV9SRUdfUkVTRVRfUkVHSVNURVIgICAweDMwMUEKLSNkZWZpbmUgTVQ5UDAxMl9LTV9SRVNFVF9SRUdJU1RFUl9QV09OICAweDEwQ0MKLSNkZWZpbmUgTVQ5UDAxMl9LTV9SRVNFVF9SRUdJU1RFUl9QV09GRiAweDEwQzgKLSNkZWZpbmUgUkVHX1JFQURfTU9ERSAgICAgICAgICAgICAgICAweDMwNDAKLSNkZWZpbmUgUkVHX0dMT0JBTF9HQUlOICAgICAgICAgICAgICAweDMwNUUKLSNkZWZpbmUgUkVHX1RFU1RfUEFUVEVSTl9NT0RFICAgICAgICAweDMwNzAKLQotZW51bSBtdDlwMDEyX2ttX3Rlc3RfbW9kZSB7Ci0JVEVTVF9PRkYsCi0JVEVTVF8xLAotCVRFU1RfMiwKLQlURVNUXzMKLX07Ci0KLWVudW0gbXQ5cDAxMl9rbV9yZXNvbHV0aW9uIHsKLQlRVFJfU0laRSwKLQlGVUxMX1NJWkUsCi0JSU5WQUxJRF9TSVpFCi19OwotCi1lbnVtIG10OXAwMTJfa21fcmVnX3VwZGF0ZSB7Ci0JLyogU2Vuc29yIGVnaXN0ZXJzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiAqLwotCVJFR19JTklULAotCS8qIFNlbnNvciBlZ2lzdGVycyB0aGF0IG5lZWRzIHBlcmlvZGljIEkyQyB3cml0ZXMgKi8KLQlVUERBVEVfUEVSSU9ESUMsCi0JLyogQWxsIHRoZSBzZW5zb3IgUmVnaXN0ZXJzIHdpbGwgYmUgdXBkYXRlZCAqLwotCVVQREFURV9BTEwsCi0JLyogTm90IHZhbGlkIHVwZGF0ZSAqLwotCVVQREFURV9JTlZBTElECi19OwotCi1lbnVtIG10OXAwMTJfa21fc2V0dGluZyB7Ci0JUkVTX1BSRVZJRVcsCi0JUkVTX0NBUFRVUkUKLX07Ci0KLXVpbnQ4X3QgbW9kZV9tYXNrID0gMHgwNDsKLQotLyogYWN0dWF0b3IncyBTbGF2ZSBBZGRyZXNzICovCi0jZGVmaW5lIE1UOVAwMTJfS01fQUZfSTJDX0FERFIgICAoMHgxOCA+PiAxKQotCi0vKiBBRiBUb3RhbCBzdGVwcyBwYXJhbWV0ZXJzICovCi0jZGVmaW5lIE1UOVAwMTJfS01fU1RFUFNfTkVBUl9UT19DTE9TRVNUX0lORiAgMzAKLSNkZWZpbmUgTVQ5UDAxMl9LTV9UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUiAgICAzMAotCi0vKiBUaW1lIGluIG1pbGlzZWNzIGZvciB3YWl0aW5nIGZvciB0aGUgc2Vuc29yIHRvIHJlc2V0LiovCi0jZGVmaW5lIE1UOVAwMTJfS01fUkVTRVRfREVMQVlfTVNFQ1MgICA2NgotCi0vKiBmb3IgMjAgZnBzIHByZXZpZXcgKi8KLSNkZWZpbmUgTVQ5UDAxMl9LTV9ERUZBVUxUX0NMT0NLX1JBVEUgIDI0MDAwMDAwCi0KLXN0cnVjdCBtdDlwMDEyX2ttX3dvcmsgewotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotfTsKLXN0YXRpYyBzdHJ1Y3QgbXQ5cDAxMl9rbV93b3JrICptdDlwMDEyX2ttX3NlbnNvcnc7Ci1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKm10OXAwMTJfa21fY2xpZW50OwotCi1zdHJ1Y3QgbXQ5cDAxMl9rbV9jdHJsIHsKLQljb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2Vuc29yZGF0YTsKLQotCWludCBzZW5zb3Jtb2RlOwotCXVpbnQzMl90IGZwc19kaXZpZGVyOwkvKiBpbml0IHRvIDEgKiAweDAwMDAwNDAwICovCi0JdWludDMyX3QgcGljdF9mcHNfZGl2aWRlcjsJLyogaW5pdCB0byAxICogMHgwMDAwMDQwMCAqLwotCi0JdWludDE2X3QgY3Vycl9sZW5zX3BvczsKLQl1aW50MTZfdCBpbml0X2N1cnJfbGVuc19wb3M7Ci0JdWludDE2X3QgbXlfcmVnX2dhaW47Ci0JdWludDMyX3QgbXlfcmVnX2xpbmVfY291bnQ7Ci0KLQllbnVtIG10OXAwMTJfa21fcmVzb2x1dGlvbiBwcmV2X3JlczsKLQllbnVtIG10OXAwMTJfa21fcmVzb2x1dGlvbiBwaWN0X3JlczsKLQllbnVtIG10OXAwMTJfa21fcmVzb2x1dGlvbiBjdXJyX3JlczsKLQllbnVtIG10OXAwMTJfa21fdGVzdF9tb2RlIHNldF90ZXN0OwotfTsKLXN0YXRpYyB1aW50MTZfdCB1cGRhdGVfdHlwZSA9IFVQREFURV9QRVJJT0RJQzsKLXN0YXRpYyBzdHJ1Y3QgbXQ5cDAxMl9rbV9jdHJsICptdDlwMDEyX2ttX2N0cmw7Ci1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobXQ5cDAxMl9rbV93YWl0X3F1ZXVlKTsKLURFRklORV9NVVRFWChtdDlwMDEyX2ttX211dCk7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLXN0YXRpYyBpbnQgbXQ5cDAxMl9rbV9pMmNfcnhkYXRhKHVuc2lnbmVkIHNob3J0IHNhZGRyLCB1bnNpZ25lZCBjaGFyICpyeGRhdGEsCi0JCQlpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKLQkJewotCQkJLmFkZHIgPSBzYWRkciA8PCAxLAotCQkJLmZsYWdzID0gMCwKLQkJCS5sZW4gPSAyLAotCQkJLmJ1ZiA9IHJ4ZGF0YSwKLQkJfSwKLQkJewotCQkJLmFkZHIgPSBzYWRkciA8PCAxLAotCQkJLmZsYWdzID0gSTJDX01fUkQsCi0JCQkubGVuID0gbGVuZ3RoLAotCQkJLmJ1ZiA9IHJ4ZGF0YSwKLQkJfSwKLQl9OwotCi0JaWYgKGkyY190cmFuc2ZlcihtdDlwMDEyX2ttX2NsaWVudC0+YWRhcHRlciwgbXNncywgMikgPCAwKSB7Ci0JCUNEQkcoIm10OXAwMTJfa21faTJjX3J4ZGF0YSBmYWlsZWQhXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfa21faTJjX3JlYWRfdyh1bnNpZ25lZCBzaG9ydCBzYWRkciwgdW5zaWduZWQgc2hvcnQgcmFkZHIsCi0JCQkJICB1bnNpZ25lZCBzaG9ydCAqcmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JdW5zaWduZWQgY2hhciBidWZbNF07Ci0KLQlpZiAoIXJkYXRhKQotCQlyZXR1cm4gLUVJTzsKLQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQotCWJ1ZlswXSA9IChyYWRkciAmIDB4RkYwMCkgPj4gODsKLQlidWZbMV0gPSAocmFkZHIgJiAweDAwRkYpOwotCi0JcmMgPSBtdDlwMDEyX2ttX2kyY19yeGRhdGEoc2FkZHIsIGJ1ZiwgMik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JKnJkYXRhID0gYnVmWzBdIDw8IDggfCBidWZbMV07Ci0KLQlpZiAocmMgPCAwKQotCQlDREJHKCJtdDlwMDEyX2ttX2kyY19yZWFkIGZhaWxlZCFcbiIpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX2ttX2kyY190eGRhdGEodW5zaWduZWQgc2hvcnQgc2FkZHIsCi0JCQkJICB1bnNpZ25lZCBjaGFyICp0eGRhdGEsCi0JCQkJICBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0gewotCQl7Ci0JCSAuYWRkciA9IHNhZGRyIDw8IDEsCi0JCSAuZmxhZ3MgPSAwLAotCQkgLmxlbiA9IGxlbmd0aCwKLQkJIC5idWYgPSB0eGRhdGEsCi0JCSB9LAotCX07Ci0KLQlpZiAoaTJjX3RyYW5zZmVyKG10OXAwMTJfa21fY2xpZW50LT5hZGFwdGVyLCBtc2csIDEpIDwgMCkgewotCQlDREJHKCJtdDlwMDEyX2ttX2kyY190eGRhdGEgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfa21faTJjX3dyaXRlX2IodW5zaWduZWQgc2hvcnQgc2FkZHIsCi0JCQkJICAgdW5zaWduZWQgc2hvcnQgYmFkZHIsCi0JCQkJICAgdW5zaWduZWQgc2hvcnQgYmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IC1FSU87Ci0JdW5zaWduZWQgY2hhciBidWZbMl07Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gYmFkZHI7Ci0JYnVmWzFdID0gYmRhdGE7Ci0JcmMgPSBtdDlwMDEyX2ttX2kyY190eGRhdGEoc2FkZHIsIGJ1ZiwgMik7Ci0KLQlpZiAocmMgPCAwKQotCQlDREJHKCJpMmNfd3JpdGUgZmFpbGVkLCBzYWRkciA9IDB4JXggYWRkciA9IDB4JXgsIHZhbCA9MHgleCFcbiIsCi0JCSAgICAgc2FkZHIsIGJhZGRyLCBiZGF0YSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfa21faTJjX3dyaXRlX3codW5zaWduZWQgc2hvcnQgc2FkZHIsCi0JCQkJICAgdW5zaWduZWQgc2hvcnQgd2FkZHIsCi0JCQkJICAgdW5zaWduZWQgc2hvcnQgd2RhdGEpCi17Ci0JaW50MzJfdCByYyA9IC1FSU87Ci0JdW5zaWduZWQgY2hhciBidWZbNF07Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gKHdhZGRyICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlsxXSA9ICh3YWRkciAmIDB4MDBGRik7Ci0JYnVmWzJdID0gKHdkYXRhICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlszXSA9ICh3ZGF0YSAmIDB4MDBGRik7Ci0KLQlyYyA9IG10OXAwMTJfa21faTJjX3R4ZGF0YShzYWRkciwgYnVmLCA0KTsKLQotCWlmIChyYyA8IDApCi0JCUNEQkcoImkyY193cml0ZV93IGZhaWxlZCwgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXghXG4iLAotCQkgICAgIHdhZGRyLCB3ZGF0YSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfa21faTJjX3dyaXRlX3dfdGFibGUoc3RydWN0IG10OXAwMTJfa21faTJjX3JlZ19jb25mIGNvbnN0Ci0JCQkJCSAqcmVnX2NvbmZfdGJsLCBpbnQgbnVtKQotewotCWludCBpOwotCWludDMyX3QgcmMgPSAtRUlPOwotCi0JZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCXJjID0gbXQ5cDAxMl9rbV9pMmNfd3JpdGVfdyhtdDlwMDEyX2ttX2NsaWVudC0+YWRkciwKLQkJCQkJIHJlZ19jb25mX3RibC0+d2FkZHIsCi0JCQkJCSByZWdfY29uZl90YmwtPndkYXRhKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlyZWdfY29uZl90YmwrKzsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfa21fdGVzdChlbnVtIG10OXAwMTJfa21fdGVzdF9tb2RlIG1vKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JcmMgPSBtdDlwMDEyX2ttX2kyY193cml0ZV93KG10OXAwMTJfa21fY2xpZW50LT5hZGRyLAotCQkJCSBSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQkgR1JPVVBFRF9QQVJBTUVURVJfSE9MRCk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKG1vID09IFRFU1RfT0ZGKQotCQlyZXR1cm4gMDsKLQllbHNlIHsKLQkJcmMgPSBtdDlwMDEyX2ttX2kyY193cml0ZV93X3RhYmxlKG10OXAwMTJfa21fcmVncy50dGJsLAotCQkJCQkgbXQ5cDAxMl9rbV9yZWdzLnR0Ymxfc2l6ZSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPSBtdDlwMDEyX2ttX2kyY193cml0ZV93KG10OXAwMTJfa21fY2xpZW50LT5hZGRyLAotCQkJCQkgUkVHX1RFU1RfUEFUVEVSTl9NT0RFLCAodWludDE2X3QpIG1vKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IG10OXAwMTJfa21faTJjX3dyaXRlX3cobXQ5cDAxMl9rbV9jbGllbnQtPmFkZHIsCi0JCQkJIFJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCSBHUk9VUEVEX1BBUkFNRVRFUl9VUERBVEUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5cDAxMl9rbV9sZW5zX3NoYWRpbmdfZW5hYmxlKHVpbnQ4X3QgaXNfZW5hYmxlKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JQ0RCRygiJXM6IGVudGVyZWQuIGVuYWJsZSA9ICVkXG4iLCBfX2Z1bmNfXywgaXNfZW5hYmxlKTsKLQotCXJjID0gbXQ5cDAxMl9rbV9pMmNfd3JpdGVfdyhtdDlwMDEyX2ttX2NsaWVudC0+YWRkciwKLQkJCQkgUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJIEdST1VQRURfUEFSQU1FVEVSX0hPTEQpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gbXQ5cDAxMl9rbV9pMmNfd3JpdGVfdyhtdDlwMDEyX2ttX2NsaWVudC0+YWRkciwgMHgzNzgwLAotCQkJCSAoKHVpbnQxNl90KSBpc19lbmFibGUpIDw8IDE1KTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IG10OXAwMTJfa21faTJjX3dyaXRlX3cobXQ5cDAxMl9rbV9jbGllbnQtPmFkZHIsCi0JCQkJIFJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCSBHUk9VUEVEX1BBUkFNRVRFUl9VUERBVEUpOwotCi0JQ0RCRygiJXM6IGV4aXRpbmcuIHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX2ttX3NldF9sYyh2b2lkKQotewotCWludDMyX3QgcmM7Ci0KLQlyYyA9IG10OXAwMTJfa21faTJjX3dyaXRlX3dfdGFibGUobXQ5cDAxMl9rbV9yZWdzLmxjdGJsLAotCQkJCSAgICAgICBtdDlwMDEyX2ttX3JlZ3MubGN0Ymxfc2l6ZSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIG10OXAwMTJfa21fZ2V0X3BpY3RfZnBzKHVpbnQxNl90IGZwcywgdWludDE2X3QgKnBmcHMpCi17Ci0KLQkvKiBpbnB1dCBmcHMgaXMgcHJldmlldyBmcHMgaW4gUTggZm9ybWF0ICovCi0JdWludDMyX3QgZGl2aWRlcjsgICAvKlExMCAqLwotCXVpbnQzMl90IHBjbGtfbXVsdDsgLypRMTAgKi8KLQl1aW50MzJfdCBkMTsKLQl1aW50MzJfdCBkMjsKLQotCWQxID0KLQkJKHVpbnQzMl90KSgKLQkJKG10OXAwMTJfa21fcmVncy5yZWdfcGF0W1JFU19QUkVWSUVXXS5mcmFtZV9sZW5ndGhfbGluZXMgKgotCQkweDAwMDAwNDAwKSAvCi0JCW10OXAwMTJfa21fcmVncy5yZWdfcGF0W1JFU19DQVBUVVJFXS5mcmFtZV9sZW5ndGhfbGluZXMpOwotCi0JZDIgPQotCQkodWludDMyX3QpKAotCQkobXQ5cDAxMl9rbV9yZWdzLnJlZ19wYXRbUkVTX1BSRVZJRVddLmxpbmVfbGVuZ3RoX3BjayAqCi0JCTB4MDAwMDA0MDApIC8KLQkJbXQ5cDAxMl9rbV9yZWdzLnJlZ19wYXRbUkVTX0NBUFRVUkVdLmxpbmVfbGVuZ3RoX3Bjayk7Ci0KLQlkaXZpZGVyID0gKHVpbnQzMl90KSAoZDEgKiBkMikgLyAweDAwMDAwNDAwOwotCi0JcGNsa19tdWx0ID0KLQkJKHVpbnQzMl90KSAoKG10OXAwMTJfa21fcmVncy5yZWdfcGF0W1JFU19DQVBUVVJFXS4KLQkJcGxsX211bHRpcGxpZXIgKiAweDAwMDAwNDAwKSAvCi0JCShtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtSRVNfUFJFVklFV10ucGxsX211bHRpcGxpZXIpKTsKLQotCi0JLyogVmVyaWZ5IFBDTEsgc2V0dGluZ3MgYW5kIGZyYW1lIHNpemVzLiAqLwotCSpwZnBzID0gKHVpbnQxNl90KSgoKChmcHMgKiBwY2xrX211bHQpIC8gMHgwMDAwMDQwMCkgKiBkaXZpZGVyKS8KLQkJCQkweDAwMDAwNDAwKTsKLX0KLQotc3RhdGljIHVpbnQxNl90IG10OXAwMTJfa21fZ2V0X3ByZXZfbGluZXNfcGYodm9pZCkKLXsKLQlpZiAobXQ5cDAxMl9rbV9jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkKLQkJcmV0dXJuICBtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtSRVNfUFJFVklFV10uZnJhbWVfbGVuZ3RoX2xpbmVzOwotCWVsc2UKLQkJcmV0dXJuICBtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtSRVNfQ0FQVFVSRV0uZnJhbWVfbGVuZ3RoX2xpbmVzOwotfQotCi1zdGF0aWMgdWludDE2X3QgbXQ5cDAxMl9rbV9nZXRfcHJldl9waXhlbHNfcGwodm9pZCkKLXsKLQlpZiAobXQ5cDAxMl9rbV9jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkKLQkJcmV0dXJuICBtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtSRVNfUFJFVklFV10ubGluZV9sZW5ndGhfcGNrOwotCWVsc2UKLQkJcmV0dXJuICBtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtSRVNfQ0FQVFVSRV0ubGluZV9sZW5ndGhfcGNrOwotfQotCi1zdGF0aWMgdWludDE2X3QgbXQ5cDAxMl9rbV9nZXRfcGljdF9saW5lc19wZih2b2lkKQotewotCXJldHVybiAgbXQ5cDAxMl9rbV9yZWdzLnJlZ19wYXRbUkVTX0NBUFRVUkVdLmZyYW1lX2xlbmd0aF9saW5lczsKLX0KLQotc3RhdGljIHVpbnQxNl90IG10OXAwMTJfa21fZ2V0X3BpY3RfcGl4ZWxzX3BsKHZvaWQpCi17Ci0JcmV0dXJuICBtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtSRVNfQ0FQVFVSRV0ubGluZV9sZW5ndGhfcGNrOwotfQotCi1zdGF0aWMgdWludDMyX3QgbXQ5cDAxMl9rbV9nZXRfcGljdF9tYXhfZXhwX2xjKHZvaWQpCi17Ci0JdWludDE2X3Qgc25hcHNob3RfbGluZXNfcGVyX2ZyYW1lOwotCi0JaWYgKG10OXAwMTJfa21fY3RybC0+cGljdF9yZXMgPT0gUVRSX1NJWkUpCi0JCXNuYXBzaG90X2xpbmVzX3Blcl9mcmFtZSA9Ci0JICAgIG10OXAwMTJfa21fcmVncy5yZWdfcGF0W1JFU19QUkVWSUVXXS5mcmFtZV9sZW5ndGhfbGluZXMgLSAxOwotCWVsc2UKLQkJc25hcHNob3RfbGluZXNfcGVyX2ZyYW1lID0KLQkgICAgbXQ5cDAxMl9rbV9yZWdzLnJlZ19wYXRbUkVTX0NBUFRVUkVdLmZyYW1lX2xlbmd0aF9saW5lcyAtIDE7Ci0KLQlyZXR1cm4gc25hcHNob3RfbGluZXNfcGVyX2ZyYW1lICogMjQ7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfa21fc2V0X2ZwcyhzdHJ1Y3QgZnBzX2NmZyAqZnBzKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JbXQ5cDAxMl9rbV9jdHJsLT5mcHNfZGl2aWRlciA9IGZwcy0+ZnBzX2RpdjsKLQltdDlwMDEyX2ttX2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIgPSBmcHMtPnBpY3RfZnBzX2RpdjsKLQotCXJjID0gbXQ5cDAxMl9rbV9pMmNfd3JpdGVfdyhtdDlwMDEyX2ttX2NsaWVudC0+YWRkciwKLQkJCQkgUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJIEdST1VQRURfUEFSQU1FVEVSX0hPTEQpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlyYyA9IG10OXAwMTJfa21faTJjX3dyaXRlX3cobXQ5cDAxMl9rbV9jbGllbnQtPmFkZHIsCi0JCQlSRUdfRlJBTUVfTEVOR1RIX0xJTkVTLAotCQkJbXQ5cDAxMl9rbV9yZWdzLnJlZ19wYXRbbXQ5cDAxMl9rbV9jdHJsLT5zZW5zb3Jtb2RlXS4KLQkJCWZyYW1lX2xlbmd0aF9saW5lcyAqCi0JCQltdDlwMDEyX2ttX2N0cmwtPmZwc19kaXZpZGVyIC8gMHgwMDAwMDQwMCk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBtdDlwMDEyX2ttX2kyY193cml0ZV93KG10OXAwMTJfa21fY2xpZW50LT5hZGRyLAotCQkJCSBSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQkgR1JPVVBFRF9QQVJBTUVURVJfVVBEQVRFKTsKLQotCXJldHVybiByYzsKLX0KLQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX2ttX3dyaXRlX2V4cF9nYWluKHVpbnQxNl90IGdhaW4sIHVpbnQzMl90IGxpbmUpCi17Ci0JdWludDE2X3QgbWF4X2xlZ2FsX2dhaW4gPSAweDAxRkY7Ci0JdWludDMyX3QgbGluZV9sZW5ndGhfcmF0aW8gPSAweDAwMDAwNDAwOwotCWVudW0gbXQ5cDAxMl9rbV9zZXR0aW5nIHNldHRpbmc7Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlDREJHKCJMaW5lOiVkIG10OXAwMTJfa21fd3JpdGVfZXhwX2dhaW4gXG4iLCBfX0xJTkVfXyk7Ci0KLQlpZiAobXQ5cDAxMl9rbV9jdHJsLT5zZW5zb3Jtb2RlID09IFNFTlNPUl9QUkVWSUVXX01PREUpIHsKLQkJbXQ5cDAxMl9rbV9jdHJsLT5teV9yZWdfZ2FpbiA9IGdhaW47Ci0JCW10OXAwMTJfa21fY3RybC0+bXlfcmVnX2xpbmVfY291bnQgPSAodWludDE2X3QpIGxpbmU7Ci0JfQotCi0JaWYgKGdhaW4gPiBtYXhfbGVnYWxfZ2FpbikgewotCQlDREJHKCJNYXggbGVnYWwgZ2FpbiBMaW5lOiVkIFxuIiwgX19MSU5FX18pOwotCQlnYWluID0gbWF4X2xlZ2FsX2dhaW47Ci0JfQotCi0JLyogVmVyaWZ5IG5vIG92ZXJmbG93ICovCi0JaWYgKG10OXAwMTJfa21fY3RybC0+c2Vuc29ybW9kZSA9PSBTRU5TT1JfUFJFVklFV19NT0RFKSB7Ci0JCWxpbmUgPSAodWludDMyX3QpIChsaW5lICogbXQ5cDAxMl9rbV9jdHJsLT5mcHNfZGl2aWRlciAvCi0JCQkJICAgMHgwMDAwMDQwMCk7Ci0JCXNldHRpbmcgPSBSRVNfUFJFVklFVzsKLQl9IGVsc2UgewotCQlsaW5lID0gKHVpbnQzMl90KSAobGluZSAqIG10OXAwMTJfa21fY3RybC0+cGljdF9mcHNfZGl2aWRlciAvCi0JCQkJICAgMHgwMDAwMDQwMCk7Ci0JCXNldHRpbmcgPSBSRVNfQ0FQVFVSRTsKLQl9Ci0KLQlnYWluIHw9IDB4MDIwMDsKLQotCWlmICgobXQ5cDAxMl9rbV9yZWdzLnJlZ19wYXRbc2V0dGluZ10uZnJhbWVfbGVuZ3RoX2xpbmVzIC0gMSkgPCBsaW5lKSB7Ci0JCWxpbmVfbGVuZ3RoX3JhdGlvID0gKHVpbnQzMl90KSAobGluZSAqIDB4MDAwMDA0MDApIC8KLQkJICAgIChtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtzZXR0aW5nXS5mcmFtZV9sZW5ndGhfbGluZXMgLSAxKTsKLQl9IGVsc2UKLQkJbGluZV9sZW5ndGhfcmF0aW8gPSAweDAwMDAwNDAwOwotCi0JcmMgPSBtdDlwMDEyX2ttX2kyY193cml0ZV93KG10OXAwMTJfa21fY2xpZW50LT5hZGRyLAotCQkJCVJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCUdST1VQRURfUEFSQU1FVEVSX0hPTEQpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygibXQ5cDAxMl9rbV9pMmNfd3JpdGVfdyBmYWlsZWQuLi4gTGluZTolZCBcbiIsIF9fTElORV9fKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXJjID0gbXQ5cDAxMl9rbV9pMmNfd3JpdGVfdyhtdDlwMDEyX2ttX2NsaWVudC0+YWRkciwKLQkJCQkgUkVHX0dMT0JBTF9HQUlOLCBnYWluKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIm10OXAwMTJfa21faTJjX3dyaXRlX3cgZmFpbGVkLi4uIExpbmU6JWQgXG4iLCBfX0xJTkVfXyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IG10OXAwMTJfa21faTJjX3dyaXRlX3cobXQ5cDAxMl9rbV9jbGllbnQtPmFkZHIsCi0JCQkJUkVHX0xJTkVfTEVOR1RIX1BDSywKLQkJCSAgICAgICAodWludDE2X3QpIChtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtzZXR0aW5nXS4KLQkJCSAgICBsaW5lX2xlbmd0aF9wY2sgKiBsaW5lX2xlbmd0aF9yYXRpbyAvIDB4MDAwMDA0MDApKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IG10OXAwMTJfa21faTJjX3dyaXRlX3cobXQ5cDAxMl9rbV9jbGllbnQtPmFkZHIsCi0JCQkJIFJFR19DT0FSU0VfSU5UX1RJTUUsCi0JCQkJICh1aW50MTZfdCkgKChsaW5lICogMHgwMDAwMDQwMCkvCi0JCQkJIGxpbmVfbGVuZ3RoX3JhdGlvKSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJtdDlwMDEyX2ttX2kyY193cml0ZV93IGZhaWxlZC4uLiBMaW5lOiVkIFxuIiwgX19MSU5FX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBtdDlwMDEyX2ttX2kyY193cml0ZV93KG10OXAwMTJfa21fY2xpZW50LT5hZGRyLAotCQkJCSBSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQkgR1JPVVBFRF9QQVJBTUVURVJfVVBEQVRFKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIm10OXAwMTJfa21faTJjX3dyaXRlX3cgZmFpbGVkLi4uIExpbmU6JWQgXG4iLCBfX0xJTkVfXyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlDREJHKCJtdDlwMDEyX2ttX3dyaXRlX2V4cF9nYWluOiBnYWluID0gJWQsIGxpbmUgPSAlZFxuIiwgZ2FpbiwgbGluZSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfa21fc2V0X3BpY3RfZXhwX2dhaW4odWludDE2X3QgZ2FpbiwgdWludDMyX3QgbGluZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCUNEQkcoIkxpbmU6JWQgbXQ5cDAxMl9rbV9zZXRfcGljdF9leHBfZ2FpbiBcbiIsIF9fTElORV9fKTsKLQotCXJjID0gbXQ5cDAxMl9rbV93cml0ZV9leHBfZ2FpbihnYWluLCBsaW5lKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIkxpbmU6JWQgbXQ5cDAxMl9rbV9zZXRfcGljdF9leHBfZ2FpbiBmYWlsZWQuLi4gXG4iLAotCQkgICAgIF9fTElORV9fKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXJjID0gbXQ5cDAxMl9rbV9pMmNfd3JpdGVfdyhtdDlwMDEyX2ttX2NsaWVudC0+YWRkciwKLQkJCQkgTVQ5UDAxMl9LTV9SRUdfUkVTRVRfUkVHSVNURVIsCi0JCQkJIDB4MTBDQyB8IDB4MDAwMik7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJtdDlwMDEyX2ttX2kyY193cml0ZV93IGZhaWxlZC4uLiBMaW5lOiVkIFxuIiwgX19MSU5FX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JbWRlbGF5KDUpOwotCi0JLyogY2FtZXJhX3RpbWVkX3dhaXQoc25hcHNob3Rfd2FpdCpleHBvc3VyZV9yYXRpbyk7ICovCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX2ttX3NldHRpbmcoZW51bSBtdDlwMDEyX2ttX3JlZ191cGRhdGUgcnVwZGF0ZSwKLQkJCQllbnVtIG10OXAwMTJfa21fc2V0dGluZyBydCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCXN3aXRjaCAocnVwZGF0ZSkgewotCWNhc2UgVVBEQVRFX1BFUklPRElDOgotCQlpZiAocnQgPT0gUkVTX1BSRVZJRVcgfHwgcnQgPT0gUkVTX0NBUFRVUkUpIHsKLQotCQkJc3RydWN0IG10OXAwMTJfa21faTJjX3JlZ19jb25mIHBwY190YmxbXSA9IHsKLQkJCQl7UkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJIEdST1VQRURfUEFSQU1FVEVSX0hPTER9LAotCQkJCXtSRUdfUk9XX1NQRUVELAotCQkJCSBtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtydF0ucm93X3NwZWVkfSwKLQkJCQl7UkVHX1hfQUREUl9TVEFSVCwKLQkJCQkgbXQ5cDAxMl9rbV9yZWdzLnJlZ19wYXRbcnRdLnhfYWRkcl9zdGFydH0sCi0JCQkJe1JFR19YX0FERFJfRU5ELAotCQkJCSBtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtydF0ueF9hZGRyX2VuZH0sCi0JCQkJe1JFR19ZX0FERFJfU1RBUlQsCi0JCQkJIG10OXAwMTJfa21fcmVncy5yZWdfcGF0W3J0XS55X2FkZHJfc3RhcnR9LAotCQkJCXtSRUdfWV9BRERSX0VORCwKLQkJCQkgbXQ5cDAxMl9rbV9yZWdzLnJlZ19wYXRbcnRdLnlfYWRkcl9lbmR9LAotCQkJCXtSRUdfUkVBRF9NT0RFLAotCQkJCSBtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtydF0ucmVhZF9tb2RlfSwKLQkJCQl7UkVHX1NDQUxFX00sCi0JCQkJIG10OXAwMTJfa21fcmVncy5yZWdfcGF0W3J0XS5zY2FsZV9tfSwKLQkJCQl7UkVHX1hfT1VUUFVUX1NJWkUsCi0JCQkJIG10OXAwMTJfa21fcmVncy5yZWdfcGF0W3J0XS54X291dHB1dF9zaXplfSwKLQkJCQl7UkVHX1lfT1VUUFVUX1NJWkUsCi0JCQkJIG10OXAwMTJfa21fcmVncy5yZWdfcGF0W3J0XS55X291dHB1dF9zaXplfSwKLQkJCQl7UkVHX0xJTkVfTEVOR1RIX1BDSywKLQkJCQkgbXQ5cDAxMl9rbV9yZWdzLnJlZ19wYXRbcnRdLmxpbmVfbGVuZ3RoX3Bja30sCi0JCQkJe1JFR19GUkFNRV9MRU5HVEhfTElORVMsCi0JCQkgICAgICAgKG10OXAwMTJfa21fcmVncy5yZWdfcGF0W3J0XS5mcmFtZV9sZW5ndGhfbGluZXMgKgotCQkJCW10OXAwMTJfa21fY3RybC0+ZnBzX2RpdmlkZXIgLyAweDAwMDAwNDAwKX0sCi0JCQkJe1JFR19DT0FSU0VfSU5UX1RJTUUsCi0JCQkJIG10OXAwMTJfa21fcmVncy5yZWdfcGF0W3J0XS5jb2Fyc2VfaW50X3RpbWV9LAotCQkJCXtSRUdfRklORV9JTlRFR1JBVElPTl9USU1FLAotCQkJCSBtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtydF0uZmluZV9pbnRfdGltZX0sCi0JCQkJe1JFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCSBHUk9VUEVEX1BBUkFNRVRFUl9VUERBVEV9LAotCQkJfTsKLQotCQkJaWYgKHVwZGF0ZV90eXBlID09IFJFR19JTklUKSB7Ci0JCQkJdXBkYXRlX3R5cGUgPSBydXBkYXRlOwotCQkJCXJldHVybiByYzsKLQkJCX0KLQotCQkJcmMgPSBtdDlwMDEyX2ttX2kyY193cml0ZV93X3RhYmxlKCZwcGNfdGJsWzBdLAotCQkJCQkJQVJSQVlfU0laRShwcGNfdGJsKSk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJcmMgPSBtdDlwMDEyX2ttX3Rlc3QobXQ5cDAxMl9rbV9jdHJsLT5zZXRfdGVzdCk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJcmMgPSBtdDlwMDEyX2ttX2kyY193cml0ZV93KG10OXAwMTJfa21fY2xpZW50LT5hZGRyLAotCQkJCQkJIE1UOVAwMTJfS01fUkVHX1JFU0VUX1JFR0lTVEVSLAotCQkJCQkJIDB4MTBjYyB8Ci0JCQkJCQkgMHgwMDAyKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQltZGVsYXkoMTUpOwkvKiAxNT8gd2FpdCBmb3Igc2Vuc29yIHRvIHRyYW5zaXRpb24gKi8KLQotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCWJyZWFrOwkvKiBVUERBVEVfUEVSSU9ESUMgKi8KLQotCWNhc2UgUkVHX0lOSVQ6Ci0JCWlmIChydCA9PSBSRVNfUFJFVklFVyB8fCBydCA9PSBSRVNfQ0FQVFVSRSkgewotCQkJc3RydWN0IG10OXAwMTJfa21faTJjX3JlZ19jb25mIGlwY190YmwxW10gPSB7Ci0JCQkJe01UOVAwMTJfS01fUkVHX1JFU0VUX1JFR0lTVEVSLAotCQkJCSBNVDlQMDEyX0tNX1JFU0VUX1JFR0lTVEVSX1BXT0ZGfSwKLQkJCQl7UkVHX1ZUX1BJWF9DTEtfRElWLAotCQkJCSBtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtydF0udnRfcGl4X2Nsa19kaXZ9LAotCQkJCXtSRUdfVlRfU1lTX0NMS19ESVYsCi0JCQkJIG10OXAwMTJfa21fcmVncy5yZWdfcGF0W3J0XS52dF9zeXNfY2xrX2Rpdn0sCi0JCQkJe1JFR19QUkVfUExMX0NMS19ESVYsCi0JCQkJIG10OXAwMTJfa21fcmVncy5yZWdfcGF0W3J0XS5wcmVfcGxsX2Nsa19kaXZ9LAotCQkJCXtSRUdfUExMX01VTFRJUExJRVIsCi0JCQkJIG10OXAwMTJfa21fcmVncy5yZWdfcGF0W3J0XS5wbGxfbXVsdGlwbGllcn0sCi0JCQkJe1JFR19PUF9QSVhfQ0xLX0RJViwKLQkJCQkgbXQ5cDAxMl9rbV9yZWdzLnJlZ19wYXRbcnRdLm9wX3BpeF9jbGtfZGl2fSwKLQkJCQl7UkVHX09QX1NZU19DTEtfRElWLAotCQkJCSBtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtydF0ub3Bfc3lzX2Nsa19kaXZ9LAotCQkJCXtNVDlQMDEyX0tNX1JFR19SRVNFVF9SRUdJU1RFUiwKLQkJCQkgTVQ5UDAxMl9LTV9SRVNFVF9SRUdJU1RFUl9QV09OfSwKLQkJCX07Ci0KLQkJCXN0cnVjdCBtdDlwMDEyX2ttX2kyY19yZWdfY29uZiBpcGNfdGJsMltdID0gewotCQkJCXtSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQkgR1JPVVBFRF9QQVJBTUVURVJfSE9MRH0sCi0JCQkJLyogT3B0aW1pemVkIHJlZ2lzdGVyIHNldHRpbmdzIGZvcgotCQkJCSAgIFJldjMgU2lsaWNvbiAqLwotCQkJCXsweDMwOEEsIDB4NjQyNH0sCi0JCQkJezB4MzA5MiwgMHgwQTUyfSwKLQkJCQl7MHgzMDk0LCAweDQ2NTZ9LAotCQkJCXsweDMwOTYsIDB4NTY1Mn0sCi0JCQkJezB4MDIwNCwgMHgwMDEwfSwKLQkJCQl7MHgwMjA2LCAweDAwMTB9LAotCQkJCXsweDAyMDgsIDB4MDAxMH0sCi0JCQkJezB4MDIwQSwgMHgwMDEwfSwKLQkJCQl7MHgwMjBDLCAweDAwMTB9LAotCQkJCXsweDMwODgsIDB4NkZGNn0sCi0JCQkJezB4MzE1NCwgMHgwMjgyfSwKLQkJCQl7MHgzMTU2LCAweDAzODF9LAotCQkJCXsweDMxNjIsIDB4MDRDRX0sCi0JCQl9OwotCi0JCQlzdHJ1Y3QgbXQ5cDAxMl9rbV9pMmNfcmVnX2NvbmYgaXBjX3RibDNbXSA9IHsKLQkJCQkvKiBTZXQgcHJldmlldyBvciBzbmFwc2hvdCBtb2RlICovCi0JCQkJe1JFR19ST1dfU1BFRUQsCi0JCQkJIG10OXAwMTJfa21fcmVncy5yZWdfcGF0W3J0XS5yb3dfc3BlZWR9LAotCQkJCXtSRUdfWF9BRERSX1NUQVJULAotCQkJCSBtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtydF0ueF9hZGRyX3N0YXJ0fSwKLQkJCQl7UkVHX1hfQUREUl9FTkQsCi0JCQkJIG10OXAwMTJfa21fcmVncy5yZWdfcGF0W3J0XS54X2FkZHJfZW5kfSwKLQkJCQl7UkVHX1lfQUREUl9TVEFSVCwKLQkJCQkgbXQ5cDAxMl9rbV9yZWdzLnJlZ19wYXRbcnRdLnlfYWRkcl9zdGFydH0sCi0JCQkJe1JFR19ZX0FERFJfRU5ELAotCQkJCSBtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtydF0ueV9hZGRyX2VuZH0sCi0JCQkJe1JFR19SRUFEX01PREUsCi0JCQkJIG10OXAwMTJfa21fcmVncy5yZWdfcGF0W3J0XS5yZWFkX21vZGV9LAotCQkJCXtSRUdfU0NBTEVfTSwKLQkJCQkgbXQ5cDAxMl9rbV9yZWdzLnJlZ19wYXRbcnRdLnNjYWxlX219LAotCQkJCXtSRUdfWF9PVVRQVVRfU0laRSwKLQkJCQkgbXQ5cDAxMl9rbV9yZWdzLnJlZ19wYXRbcnRdLnhfb3V0cHV0X3NpemV9LAotCQkJCXtSRUdfWV9PVVRQVVRfU0laRSwKLQkJCQkgbXQ5cDAxMl9rbV9yZWdzLnJlZ19wYXRbcnRdLnlfb3V0cHV0X3NpemV9LAotCQkJCXtSRUdfTElORV9MRU5HVEhfUENLLAotCQkJCSBtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtydF0ubGluZV9sZW5ndGhfcGNrfSwKLQkJCQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FUywKLQkJCQkgbXQ5cDAxMl9rbV9yZWdzLnJlZ19wYXRbcnRdLgotCQkJCSBmcmFtZV9sZW5ndGhfbGluZXN9LAotCQkJCXtSRUdfQ09BUlNFX0lOVF9USU1FLAotCQkJCSBtdDlwMDEyX2ttX3JlZ3MucmVnX3BhdFtydF0uY29hcnNlX2ludF90aW1lfSwKLQkJCQl7UkVHX0ZJTkVfSU5URUdSQVRJT05fVElNRSwKLQkJCQkgbXQ5cDAxMl9rbV9yZWdzLnJlZ19wYXRbcnRdLmZpbmVfaW50X3RpbWV9LAotCQkJCXtSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQkgR1JPVVBFRF9QQVJBTUVURVJfVVBEQVRFfSwKLQkJCX07Ci0KLQkJCS8qIHJlc2V0IGZwc19kaXZpZGVyICovCi0JCQltdDlwMDEyX2ttX2N0cmwtPmZwc19kaXZpZGVyID0gMSAqIDB4MDQwMDsKLQotCQkJcmMgPSBtdDlwMDEyX2ttX2kyY193cml0ZV93X3RhYmxlKCZpcGNfdGJsMVswXSwKLQkJCQkJCQlBUlJBWV9TSVpFKGlwY190YmwxKSk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJbWRlbGF5KDE1KTsKLQotCQkJcmMgPSBtdDlwMDEyX2ttX2kyY193cml0ZV93X3RhYmxlKCZpcGNfdGJsMlswXSwKLQkJCQkJCQlBUlJBWV9TSVpFKGlwY190YmwyKSk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJbWRlbGF5KDUpOwotCi0JCQlyYyA9IG10OXAwMTJfa21faTJjX3dyaXRlX3dfdGFibGUoJmlwY190YmwzWzBdLAotCQkJCQkJICAgICAgIEFSUkFZX1NJWkUoaXBjX3RibDMpKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQkvKiBsb2FkIGxlbnMgc2hhZGluZyAqLwotCQkJcmMgPSBtdDlwMDEyX2ttX2kyY193cml0ZV93KG10OXAwMTJfa21fY2xpZW50LT5hZGRyLAotCQkJCQkJIFJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCQkJIEdST1VQRURfUEFSQU1FVEVSX0hPTEQpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCXJjID0gbXQ5cDAxMl9rbV9zZXRfbGMoKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlyYyA9IG10OXAwMTJfa21faTJjX3dyaXRlX3cobXQ5cDAxMl9rbV9jbGllbnQtPmFkZHIsCi0JCQkJCQkgUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJCQkgR1JPVVBFRF9QQVJBTUVURVJfVVBEQVRFKTsKLQotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCX0KLQkJdXBkYXRlX3R5cGUgPSBydXBkYXRlOwotCQlicmVhazsJCS8qIGNhc2UgUkVHX0lOSVQ6ICovCi0KLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0JCQkvKiBzd2l0Y2ggKHJ1cGRhdGUpICovCi0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXAwMTJfa21fdmlkZW9fY29uZmlnKGludCBtb2RlLCBpbnQgcmVzKQotewotCWludDMyX3QgcmM7Ci0KLQlzd2l0Y2ggKHJlcykgewotCWNhc2UgUVRSX1NJWkU6Ci0JCXJjID0gbXQ5cDAxMl9rbV9zZXR0aW5nKFVQREFURV9QRVJJT0RJQywgUkVTX1BSRVZJRVcpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCUNEQkcoIm10OXAwMTJfa20gc2Vuc29yIGNvbmZpZ3VyYXRpb24gZG9uZSFcbiIpOwotCQlicmVhazsKLQotCWNhc2UgRlVMTF9TSVpFOgotCQlyYyA9IG10OXAwMTJfa21fc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsIFJFU19DQVBUVVJFKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0JCQkvKiBzd2l0Y2ggKi8KLQotCW10OXAwMTJfa21fY3RybC0+cHJldl9yZXMgPSByZXM7Ci0JbXQ5cDAxMl9rbV9jdHJsLT5jdXJyX3JlcyA9IHJlczsKLQltdDlwMDEyX2ttX2N0cmwtPnNlbnNvcm1vZGUgPSBtb2RlOwotCi0JcmMgPSBtdDlwMDEyX2ttX3dyaXRlX2V4cF9nYWluKG10OXAwMTJfa21fY3RybC0+bXlfcmVnX2dhaW4sCi0JCQkJICAgIG10OXAwMTJfa21fY3RybC0+bXlfcmVnX2xpbmVfY291bnQpOwotCi0JcmMgPSBtdDlwMDEyX2ttX2kyY193cml0ZV93KG10OXAwMTJfa21fY2xpZW50LT5hZGRyLAotCQkJCSBNVDlQMDEyX0tNX1JFR19SRVNFVF9SRUdJU1RFUiwKLQkJCQkgMHgxMGNjIHwgMHgwMDAyKTsKLQotCW1kZWxheSgxNSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX2ttX3NuYXBzaG90X2NvbmZpZyhpbnQgbW9kZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCXJjID0gbXQ5cDAxMl9rbV9zZXR0aW5nKFVQREFURV9QRVJJT0RJQywgUkVTX0NBUFRVUkUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCW10OXAwMTJfa21fY3RybC0+Y3Vycl9yZXMgPSBtdDlwMDEyX2ttX2N0cmwtPnBpY3RfcmVzOwotCi0JbXQ5cDAxMl9rbV9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5cDAxMl9rbV9yYXdfc25hcHNob3RfY29uZmlnKGludCBtb2RlKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JcmMgPSBtdDlwMDEyX2ttX3NldHRpbmcoVVBEQVRFX1BFUklPRElDLCBSRVNfQ0FQVFVSRSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JbXQ5cDAxMl9rbV9jdHJsLT5jdXJyX3JlcyA9IG10OXAwMTJfa21fY3RybC0+cGljdF9yZXM7Ci0KLQltdDlwMDEyX2ttX2N0cmwtPnNlbnNvcm1vZGUgPSBtb2RlOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDlwMDEyX2ttX3Bvd2VyX2Rvd24odm9pZCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCXJjID0gbXQ5cDAxMl9rbV9pMmNfd3JpdGVfdyhtdDlwMDEyX2ttX2NsaWVudC0+YWRkciwKLQkJCQkgTVQ5UDAxMl9LTV9SRUdfUkVTRVRfUkVHSVNURVIsCi0JCQkJIE1UOVAwMTJfS01fUkVTRVRfUkVHSVNURVJfUFdPRkYpOwotCi0JbWRlbGF5KDUpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5cDAxMl9rbV9tb3ZlX2ZvY3VzKGludCBkaXJlY3Rpb24sIGludDMyX3QgbnVtX3N0ZXBzKQotewotCWludDE2X3Qgc3RlcF9kaXJlY3Rpb247Ci0JaW50MTZfdCBhY3R1YWxfc3RlcDsKLQlpbnQxNl90IG5leHRfcG9zaXRpb247Ci0JdWludDhfdCBjb2RlX3ZhbF9tc2IsIGNvZGVfdmFsX2xzYjsKLQotCWlmIChudW1fc3RlcHMgPiBNVDlQMDEyX0tNX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSKQotCQludW1fc3RlcHMgPSBNVDlQMDEyX0tNX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSOwotCWVsc2UgaWYgKG51bV9zdGVwcyA9PSAwKSB7Ci0JCUNEQkcoIm10OXAwMTJfa21fbW92ZV9mb2N1cyBmYWlsZWQgYXQgbGluZSAlZCAuLi5cbiIsIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGRpcmVjdGlvbiA9PSBNT1ZFX05FQVIpCi0JCXN0ZXBfZGlyZWN0aW9uID0gMTY7CS8qIDEwYml0ICovCi0JZWxzZSBpZiAoZGlyZWN0aW9uID09IE1PVkVfRkFSKQotCQlzdGVwX2RpcmVjdGlvbiA9IC0xNjsJLyogMTAgYml0ICovCi0JZWxzZSB7Ci0JCUNEQkcoIm10OXAwMTJfa21fbW92ZV9mb2N1cyBmYWlsZWQgYXQgbGluZSAlZCAuLi5cbiIsIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKG10OXAwMTJfa21fY3RybC0+Y3Vycl9sZW5zX3BvcyA8Ci0JCQkJbXQ5cDAxMl9rbV9jdHJsLT5pbml0X2N1cnJfbGVuc19wb3MpCi0JCW10OXAwMTJfa21fY3RybC0+Y3Vycl9sZW5zX3BvcyA9Ci0JCQkJbXQ5cDAxMl9rbV9jdHJsLT5pbml0X2N1cnJfbGVuc19wb3M7Ci0KLQlhY3R1YWxfc3RlcCA9IChpbnQxNl90KSAoc3RlcF9kaXJlY3Rpb24gKiAoaW50MTZfdCkgbnVtX3N0ZXBzKTsKLQluZXh0X3Bvc2l0aW9uID0gKGludDE2X3QpIChtdDlwMDEyX2ttX2N0cmwtPmN1cnJfbGVuc19wb3MgKwotCQkJCQkJCWFjdHVhbF9zdGVwKTsKLQotCWlmIChuZXh0X3Bvc2l0aW9uID4gMTAyMykKLQkJbmV4dF9wb3NpdGlvbiA9IDEwMjM7Ci0JZWxzZSBpZiAobmV4dF9wb3NpdGlvbiA8IDApCi0JCW5leHRfcG9zaXRpb24gPSAwOwotCi0JY29kZV92YWxfbXNiID0gbmV4dF9wb3NpdGlvbiA+PiA0OwotCWNvZGVfdmFsX2xzYiA9IChuZXh0X3Bvc2l0aW9uICYgMHgwMDBGKSA8PCA0OwotCWNvZGVfdmFsX2xzYiB8PSBtb2RlX21hc2s7Ci0KLQkvKiBXcml0aW5nIHRoZSBkaWdpdGFsIGNvZGUgZm9yIGN1cnJlbnQgdG8gdGhlIGFjdHVhdG9yICovCi0JaWYgKG10OXAwMTJfa21faTJjX3dyaXRlX2IoTVQ5UDAxMl9LTV9BRl9JMkNfQUREUiA+PiAxLAotCQkJCWNvZGVfdmFsX21zYiwgY29kZV92YWxfbHNiKSA8IDApIHsKLQkJQ0RCRygibXQ5cDAxMl9rbV9tb3ZlX2ZvY3VzIGZhaWxlZCBhdCBsaW5lICVkIC4uLlxuIiwgX19MSU5FX18pOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCS8qIFN0b3JpbmcgdGhlIGN1cnJlbnQgbGVucyBQb3NpdGlvbiAqLwotCW10OXAwMTJfa21fY3RybC0+Y3Vycl9sZW5zX3BvcyA9IG5leHRfcG9zaXRpb247Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5cDAxMl9rbV9zZXRfZGVmYXVsdF9mb2N1cyh2b2lkKQotewotCWludDMyX3QgcmMgPSAwOwotCXVpbnQ4X3QgY29kZV92YWxfbXNiLCBjb2RlX3ZhbF9sc2I7Ci0KLQljb2RlX3ZhbF9tc2IgPSAweDAwOwotCWNvZGVfdmFsX2xzYiA9IDB4MDQ7Ci0KLQkvKiBXcml0ZSB0aGUgZGlnaXRhbCBjb2RlIGZvciBjdXJyZW50IHRvIHRoZSBhY3R1YXRvciAqLwotCXJjID0gbXQ5cDAxMl9rbV9pMmNfd3JpdGVfYihNVDlQMDEyX0tNX0FGX0kyQ19BRERSID4+IDEsCi0JCQkJIGNvZGVfdmFsX21zYiwgY29kZV92YWxfbHNiKTsKLQotCW10OXAwMTJfa21fY3RybC0+Y3Vycl9sZW5zX3BvcyA9IDA7Ci0JbXQ5cDAxMl9rbV9jdHJsLT5pbml0X2N1cnJfbGVuc19wb3MgPSAwOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG10OXAwMTJfa21fcHJvYmVfaW5pdF9kb25lKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCWdwaW9fZnJlZShkYXRhLT5zZW5zb3JfcmVzZXQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci0JbXQ5cDAxMl9rbV9wcm9iZV9pbml0X3NlbnNvcihjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlpbnQzMl90IHJjOwotCXVpbnQxNl90IGNoaXBpZDsKLQotCXJjID0gZ3Bpb19yZXF1ZXN0KGRhdGEtPnNlbnNvcl9yZXNldCwgIm10OXAwMTJfa20iKTsKLQlpZiAoIXJjKQotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+c2Vuc29yX3Jlc2V0LCAxKTsKLQllbHNlCi0JCWdvdG8gaW5pdF9wcm9iZV9kb25lOwotCi0JbXNsZWVwKDIwKTsKLQotCS8qIFJFU0VUIHRoZSBzZW5zb3IgaW1hZ2UgcGFydCB2aWEgSTJDIGNvbW1hbmQgKi8KLQlDREJHKCJtdDlwMDEyX2ttX3NlbnNvcl9pbml0KCk6IHJlc2V0aW5nIHNlbnNvci5cbiIpOwotCXJjID0gbXQ5cDAxMl9rbV9pMmNfd3JpdGVfdyhtdDlwMDEyX2ttX2NsaWVudC0+YWRkciwKLQkJCQkgTVQ5UDAxMl9LTV9SRUdfUkVTRVRfUkVHSVNURVIsCi0JCQkJIDB4MTBDQyB8IDB4MDAwMSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJzZW5zb3IgcmVzZXQgZmFpbGVkLiByYyA9ICVkXG4iLCByYyk7Ci0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCX0KLQotCQltc2xlZXAoTVQ5UDAxMl9LTV9SRVNFVF9ERUxBWV9NU0VDUyk7Ci0KLQkvKiAzLiBSZWFkIHNlbnNvciBNb2RlbCBJRDogKi8KLQlyYyA9IG10OXAwMTJfa21faTJjX3JlYWRfdyhtdDlwMDEyX2ttX2NsaWVudC0+YWRkciwKLQkJCQlNVDlQMDEyX0tNX1JFR19NT0RFTF9JRCwgJmNoaXBpZCk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0KLQkvKiA0LiBDb21wYXJlIHNlbnNvciBJRCB0byBNVDlUMDEyVkMgSUQ6ICovCi0JaWYgKGNoaXBpZCAhPSBNVDlQMDEyX0tNX01PREVMX0lEKSB7Ci0JCUNEQkcoIm10OXAwMTJfa20gd3JvbmcgbW9kZWxfaWQgPSAweCV4XG4iLCBjaGlwaWQpOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCX0KLQotCXJjID0gbXQ5cDAxMl9rbV9pMmNfd3JpdGVfdyhtdDlwMDEyX2ttX2NsaWVudC0+YWRkciwgMHgzMDZFLCAweDkwODApOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiUkVWXzcgd3JpdGUgZmFpbGVkLiByYyA9ICVkXG4iLCByYyk7Ci0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCX0KLQotCS8qIFJFU0VUX1JFR0lTVEVSLCBlbmFibGUgcGFyYWxsZWwgaW50ZXJmYWNlIGFuZCBkaXNhYmxlIHNlcmlhbGlzZXIgKi8KLQlDREJHKCJtdDlwMDEyX2ttX3NlbnNvcl9pbml0KCk6IGVuYWJsaW5nIHBhcmFsbGVsIGludGVyZmFjZS5cbiIpOwotCXJjID0gbXQ5cDAxMl9rbV9pMmNfd3JpdGVfdyhtdDlwMDEyX2ttX2NsaWVudC0+YWRkciwgMHgzMDFBLCAweDEwQ0MpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiZW5hYmxlIHBhcmFsbGVsIGludGVyZmFjZSBmYWlsZWQuIHJjID0gJWRcbiIsIHJjKTsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCi0JLyogVG8gZGlzYWJsZSB0aGUgMiBleHRyYSBsaW5lcyAqLwotCXJjID0gbXQ5cDAxMl9rbV9pMmNfd3JpdGVfdyhtdDlwMDEyX2ttX2NsaWVudC0+YWRkciwgMHgzMDY0LCAweDA4MDUpOwotCi0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJkaXNhYmxlIHRoZSAyIGV4dHJhIGxpbmVzIGZhaWxlZC4gcmMgPSAlZFxuIiwgcmMpOwotCQlnb3RvIGluaXRfcHJvYmVfZmFpbDsKLQl9Ci0KLQlnb3RvIGluaXRfcHJvYmVfZG9uZTsKLQotaW5pdF9wcm9iZV9mYWlsOgotCW10OXAwMTJfa21fcHJvYmVfaW5pdF9kb25lKGRhdGEpOwotaW5pdF9wcm9iZV9kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludAotCW10OXAwMTJfa21fc2Vuc29yX29wZW5faW5pdChjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlpbnQzMl90IHJjOwotCi0JbXQ5cDAxMl9rbV9jdHJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG10OXAwMTJfa21fY3RybCksIEdGUF9LRVJORUwpOwotCWlmICghbXQ5cDAxMl9rbV9jdHJsKSB7Ci0JCUNEQkcoIm10OXAwMTJfa21faW5pdCBmYWlsZWQhXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGluaXRfZG9uZTsKLQl9Ci0KLQltdDlwMDEyX2ttX2N0cmwtPmZwc19kaXZpZGVyID0gMSAqIDB4MDAwMDA0MDA7Ci0JbXQ5cDAxMl9rbV9jdHJsLT5waWN0X2Zwc19kaXZpZGVyID0gMSAqIDB4MDAwMDA0MDA7Ci0JbXQ5cDAxMl9rbV9jdHJsLT5zZXRfdGVzdCA9IFRFU1RfT0ZGOwotCW10OXAwMTJfa21fY3RybC0+cHJldl9yZXMgPSBRVFJfU0laRTsKLQltdDlwMDEyX2ttX2N0cmwtPnBpY3RfcmVzID0gRlVMTF9TSVpFOwotCi0JaWYgKGRhdGEpCi0JCW10OXAwMTJfa21fY3RybC0+c2Vuc29yZGF0YSA9IGRhdGE7Ci0KLQltc21fY2FtaW9fY2FtaWZfcGFkX3JlZ19yZXNldCgpOwotCW1kZWxheSgyMCk7Ci0KLQlyYyA9IG10OXAwMTJfa21fcHJvYmVfaW5pdF9zZW5zb3IoZGF0YSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X2ZhaWwxOwotCi0JaWYgKG10OXAwMTJfa21fY3RybC0+cHJldl9yZXMgPT0gUVRSX1NJWkUpCi0JCXJjID0gbXQ5cDAxMl9rbV9zZXR0aW5nKFJFR19JTklULCBSRVNfUFJFVklFVyk7Ci0JZWxzZQotCQlyYyA9IG10OXAwMTJfa21fc2V0dGluZyhSRUdfSU5JVCwgUkVTX0NBUFRVUkUpOwotCi0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJtdDlwMDEyX2ttX3NldHRpbmcgZmFpbGVkLiByYyA9ICVkXG4iLCByYyk7Ci0JCWdvdG8gaW5pdF9mYWlsMTsKLQl9Ci0KLQkvKiBzZW5zb3IgOiBvdXRwdXQgZW5hYmxlICovCi0JQ0RCRygibXQ5cDAxMl9rbV9zZW5zb3Jfb3Blbl9pbml0KCk6IGVuYWJsaW5nIG91dHB1dC5cbiIpOwotCXJjID0gbXQ5cDAxMl9rbV9pMmNfd3JpdGVfdyhtdDlwMDEyX2ttX2NsaWVudC0+YWRkciwKLQkJCQkgTVQ5UDAxMl9LTV9SRUdfUkVTRVRfUkVHSVNURVIsCi0JCQkJIE1UOVAwMTJfS01fUkVTRVRfUkVHSVNURVJfUFdPTik7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJzZW5zb3Igb3V0cHV0IGVuYWJsZSBmYWlsZWQuIHJjID0gJWRcbiIsIHJjKTsKLQkJZ290byBpbml0X2ZhaWwxOwotCX0KLQotCWlmIChyYyA+PSAwKQotCQlnb3RvIGluaXRfZG9uZTsKLQotaW5pdF9mYWlsMToKLQltdDlwMDEyX2ttX3Byb2JlX2luaXRfZG9uZShkYXRhKTsKLQlrZnJlZShtdDlwMDEyX2ttX2N0cmwpOwotaW5pdF9kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtdDlwMDEyX2ttX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JLyogSW5pdGlhbGl6ZSB0aGUgTVNNX0NBTUkyQyBDaGlwICovCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmbXQ5cDAxMl9rbV93YWl0X3F1ZXVlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5cDAxMl9rbV9zZXRfc2Vuc29yX21vZGUoaW50IG1vZGUsIGludCByZXMpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFNFTlNPUl9QUkVWSUVXX01PREU6Ci0JCXJjID0gbXQ5cDAxMl9rbV92aWRlb19jb25maWcobW9kZSwgcmVzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNFTlNPUl9TTkFQU0hPVF9NT0RFOgotCQlyYyA9IG10OXAwMTJfa21fc25hcHNob3RfY29uZmlnKG1vZGUpOwotCQlicmVhazsKLQotCWNhc2UgU0VOU09SX1JBV19TTkFQU0hPVF9NT0RFOgotCQlyYyA9IG10OXAwMTJfa21fcmF3X3NuYXBzaG90X2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotaW50IG10OXAwMTJfa21fc2Vuc29yX2NvbmZpZyh2b2lkIF9fdXNlciAqYXJncCkKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhIGNkYXRhOwotCWludCByYyA9IDA7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmNkYXRhLAotCQkJICAgKHZvaWQgKilhcmdwLCBzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCW11dGV4X2xvY2soJm10OXAwMTJfa21fbXV0KTsKLQotCUNEQkcoIiVzOiBjZmd0eXBlID0gJWRcbiIsIF9fZnVuY19fLCBjZGF0YS5jZmd0eXBlKTsKLQlzd2l0Y2ggKGNkYXRhLmNmZ3R5cGUpIHsKLQljYXNlIENGR19HRVRfUElDVF9GUFM6Ci0JCW10OXAwMTJfa21fZ2V0X3BpY3RfZnBzKGNkYXRhLmNmZy5nZnBzLnByZXZmcHMsCi0JCQkJICAgICAmKGNkYXRhLmNmZy5nZnBzLnBpY3RmcHMpKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwgJmNkYXRhLAotCQkJCSBzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX0dFVF9QUkVWX0xfUEY6Ci0JCWNkYXRhLmNmZy5wcmV2bF9wZiA9IG10OXAwMTJfa21fZ2V0X3ByZXZfbGluZXNfcGYoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkgJmNkYXRhLCBzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX0dFVF9QUkVWX1BfUEw6Ci0JCWNkYXRhLmNmZy5wcmV2cF9wbCA9IG10OXAwMTJfa21fZ2V0X3ByZXZfcGl4ZWxzX3BsKCk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJICZjZGF0YSwgc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19HRVRfUElDVF9MX1BGOgotCQljZGF0YS5jZmcucGljdGxfcGYgPSBtdDlwMDEyX2ttX2dldF9waWN0X2xpbmVzX3BmKCk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJICZjZGF0YSwgc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19HRVRfUElDVF9QX1BMOgotCQljZGF0YS5jZmcucGljdHBfcGwgPSBtdDlwMDEyX2ttX2dldF9waWN0X3BpeGVsc19wbCgpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSAmY2RhdGEsIHNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfR0VUX1BJQ1RfTUFYX0VYUF9MQzoKLQkJY2RhdGEuY2ZnLnBpY3RfbWF4X2V4cF9sYyA9IG10OXAwMTJfa21fZ2V0X3BpY3RfbWF4X2V4cF9sYygpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSAmY2RhdGEsIHNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX0ZQUzoKLQljYXNlIENGR19TRVRfUElDVF9GUFM6Ci0JCXJjID0gbXQ5cDAxMl9rbV9zZXRfZnBzKCYoY2RhdGEuY2ZnLmZwcykpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1NFVF9FWFBfR0FJTjoKLQkJcmMgPSBtdDlwMDEyX2ttX3dyaXRlX2V4cF9nYWluKGNkYXRhLmNmZy5leHBfZ2Fpbi5nYWluLAotCQkJCQkgICAgY2RhdGEuY2ZnLmV4cF9nYWluLmxpbmUpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1NFVF9QSUNUX0VYUF9HQUlOOgotCQlDREJHKCJMaW5lOiVkIENGR19TRVRfUElDVF9FWFBfR0FJTiBcbiIsIF9fTElORV9fKTsKLQkJcmMgPSBtdDlwMDEyX2ttX3NldF9waWN0X2V4cF9nYWluKGNkYXRhLmNmZy5leHBfZ2Fpbi5nYWluLAotCQkJCQkgICAgICAgY2RhdGEuY2ZnLmV4cF9nYWluLmxpbmUpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1NFVF9NT0RFOgotCQlyYyA9IG10OXAwMTJfa21fc2V0X3NlbnNvcl9tb2RlKGNkYXRhLm1vZGUsIGNkYXRhLnJzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19QV1JfRE9XTjoKLQkJcmMgPSBtdDlwMDEyX2ttX3Bvd2VyX2Rvd24oKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19NT1ZFX0ZPQ1VTOgotCQlDREJHKCJtdDlwMDEyX2ttX2lvY3RsOiBDRkdfTU9WRV9GT0NVUzogY2RhdGEuY2ZnLmZvY3VzLmRpcj0lZCBcCi0JCQkJY2RhdGEuY2ZnLmZvY3VzLnN0ZXBzPSVkXG4iLAotCQkJCWNkYXRhLmNmZy5mb2N1cy5kaXIsIGNkYXRhLmNmZy5mb2N1cy5zdGVwcyk7Ci0JCXJjID0gbXQ5cDAxMl9rbV9tb3ZlX2ZvY3VzKGNkYXRhLmNmZy5mb2N1cy5kaXIsCi0JCQkJCWNkYXRhLmNmZy5mb2N1cy5zdGVwcyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX0RFRkFVTFRfRk9DVVM6Ci0JCXJjID0gbXQ5cDAxMl9rbV9zZXRfZGVmYXVsdF9mb2N1cygpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1NFVF9MRU5TX1NIQURJTkc6Ci0JCUNEQkcoIiVzOiBDRkdfU0VUX0xFTlNfU0hBRElOR1xuIiwgX19mdW5jX18pOwotCQlyYyA9IG10OXAwMTJfa21fbGVuc19zaGFkaW5nX2VuYWJsZShjZGF0YS5jZmcubGVuc19zaGFkaW5nKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19HRVRfQUZfTUFYX1NURVBTOgotCQljZGF0YS5tYXhfc3RlcHMgPSBNVDlQMDEyX0tNX1NURVBTX05FQVJfVE9fQ0xPU0VTVF9JTkY7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSAmY2RhdGEsIHNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX0VGRkVDVDoKLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotCW11dGV4X3VubG9jaygmbXQ5cDAxMl9rbV9tdXQpOwotCXJldHVybiByYzsKLX0KLQotaW50IG10OXAwMTJfa21fc2Vuc29yX3JlbGVhc2Uodm9pZCkKLXsKLQlpbnQgcmMgPSAtRUJBREY7Ci0KLQltdXRleF9sb2NrKCZtdDlwMDEyX2ttX211dCk7Ci0KLQltdDlwMDEyX2ttX3Bvd2VyX2Rvd24oKTsKLQotCWdwaW9fZGlyZWN0aW9uX291dHB1dChtdDlwMDEyX2ttX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JZ3Bpb19mcmVlKG10OXAwMTJfa21fY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3Jlc2V0KTsKLQotCWdwaW9fZGlyZWN0aW9uX291dHB1dChtdDlwMDEyX2ttX2N0cmwtPnNlbnNvcmRhdGEtPnZjbV9wd2QsIDApOwotCWdwaW9fZnJlZShtdDlwMDEyX2ttX2N0cmwtPnNlbnNvcmRhdGEtPnZjbV9wd2QpOwotCi0Ja2ZyZWUobXQ5cDAxMl9rbV9jdHJsKTsKLQltdDlwMDEyX2ttX2N0cmwgPSBOVUxMOwotCi0JQ0RCRygibXQ5cDAxMl9rbV9yZWxlYXNlIGNvbXBsZXRlZFxuIik7Ci0KLQltdXRleF91bmxvY2soJm10OXAwMTJfa21fbXV0KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXQ5cDAxMl9rbV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCSAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCWludCByYyA9IDA7Ci0JQ0RCRygibXQ5cDAxMl9rbV9wcm9iZSBjYWxsZWQhXG4iKTsKLQotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7Ci0JCUNEQkcoImkyY19jaGVja19mdW5jdGlvbmFsaXR5IGZhaWxlZFxuIik7Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0KLQltdDlwMDEyX2ttX3NlbnNvcncgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXQ5cDAxMl9rbV93b3JrKSwKLQkJCQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIW10OXAwMTJfa21fc2Vuc29ydykgewotCQlDREJHKCJremFsbG9jIGZhaWxlZC5cbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBtdDlwMDEyX2ttX3NlbnNvcncpOwotCW10OXAwMTJfa21faW5pdF9jbGllbnQoY2xpZW50KTsKLQltdDlwMDEyX2ttX2NsaWVudCA9IGNsaWVudDsKLQotCW1kZWxheSg1MCk7Ci0KLQlDREJHKCJtdDlwMDEyX2ttX3Byb2JlIHN1Y2Nlc3NlZCEgcmMgPSAlZFxuIiwgcmMpOwotCXJldHVybiAwOwotCi1wcm9iZV9mYWlsdXJlOgotCUNEQkcoIm10OXAwMTJfa21fcHJvYmUgZmFpbGVkISByYyA9ICVkXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbXQ5cDAxMl9rbV9pMmNfaWRbXSA9IHsKLQl7Im10OXAwMTJfa20iLCAwfSwKLQl7fQotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG10OXAwMTJfa21faTJjX2RyaXZlciA9IHsKLQkuaWRfdGFibGUgPSBtdDlwMDEyX2ttX2kyY19pZCwKLQkucHJvYmUgPSBtdDlwMDEyX2ttX2kyY19wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3AobXQ5cDAxMl9rbV9pMmNfcmVtb3ZlKSwKLQkuZHJpdmVyID0gewotCQkgICAubmFtZSA9ICJtdDlwMDEyX2ttIiwKLQkJICAgfSwKLX07Ci0KLXN0YXRpYyBpbnQgbXQ5cDAxMl9rbV9zZW5zb3JfcHJvYmUoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmluZm8sCi0JCQkJc3RydWN0IG1zbV9zZW5zb3JfY3RybCAqcykKLXsKLQlpbnQgcmMgPSBpMmNfYWRkX2RyaXZlcigmbXQ5cDAxMl9rbV9pMmNfZHJpdmVyKTsKLQlpZiAocmMgPCAwIHx8IG10OXAwMTJfa21fY2xpZW50ID09IE5VTEwpIHsKLQkJcmMgPSAtRU5PVFNVUFA7Ci0JCWdvdG8gcHJvYmVfZG9uZTsKLQl9Ci0KLQltc21fY2FtaW9fY2xrX3JhdGVfc2V0KE1UOVAwMTJfS01fREVGQVVMVF9DTE9DS19SQVRFKTsKLQltZGVsYXkoMjApOwotCi0JcmMgPSBtdDlwMDEyX2ttX3Byb2JlX2luaXRfc2Vuc29yKGluZm8pOwotCWlmIChyYyA8IDApCi0JCWdvdG8gcHJvYmVfZG9uZTsKLQotCXMtPnNfaW5pdCA9IG10OXAwMTJfa21fc2Vuc29yX29wZW5faW5pdDsKLQlzLT5zX3JlbGVhc2UgPSBtdDlwMDEyX2ttX3NlbnNvcl9yZWxlYXNlOwotCXMtPnNfY29uZmlnID0gbXQ5cDAxMl9rbV9zZW5zb3JfY29uZmlnOwotCXMtPnNfbW91bnRfYW5nbGUgID0gMDsKLQltdDlwMDEyX2ttX3Byb2JlX2luaXRfZG9uZShpbmZvKTsKLQotcHJvYmVfZG9uZToKLQlDREJHKCIlcyAlczolZFxuIiwgX19GSUxFX18sIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fbXQ5cDAxMl9rbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBtc21fY2FtZXJhX2Rydl9zdGFydChwZGV2LCBtdDlwMDEyX2ttX3NlbnNvcl9wcm9iZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9jYW1lcmFfZHJpdmVyID0gewotCS5wcm9iZSA9IF9fbXQ5cDAxMl9rbV9wcm9iZSwKLQkuZHJpdmVyID0gewotCQkgICAubmFtZSA9ICJtc21fY2FtZXJhX210OXAwMTJfa20iLAotCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKLQkJICAgfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG10OXAwMTJfa21faW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9jYW1lcmFfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQobXQ5cDAxMl9rbV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDlwMDEyX2ttLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5cDAxMl9rbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg2NDc0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDlwMDEyX2ttLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBNVDlQMDEyX0tNX0gKLSNkZWZpbmUgTVQ5UDAxMl9LTV9ICi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLQotZXh0ZXJuIHN0cnVjdCBtdDlwMDEyX2ttX3JlZyBtdDlwMDEyX2ttX3JlZ3M7CS8qIGZyb20gbXQ5cDAxMl9rbV9yZWcuYyAqLwotCi1zdHJ1Y3QgcmVnX3N0cnVjdCB7Ci0JdWludDE2X3QgdnRfcGl4X2Nsa19kaXY7ICAgICAvKiAweDAzMDAgKi8KLQl1aW50MTZfdCB2dF9zeXNfY2xrX2RpdjsgICAgIC8qIDB4MDMwMiAqLwotCXVpbnQxNl90IHByZV9wbGxfY2xrX2RpdjsgICAgLyogMHgwMzA0ICovCi0JdWludDE2X3QgcGxsX211bHRpcGxpZXI7ICAgICAvKiAweDAzMDYgKi8KLQl1aW50MTZfdCBvcF9waXhfY2xrX2RpdjsgICAgIC8qIDB4MDMwOCAqLwotCXVpbnQxNl90IG9wX3N5c19jbGtfZGl2OyAgICAgLyogMHgwMzBBICovCi0JdWludDE2X3Qgc2NhbGVfbTsgICAgICAgICAgICAvKiAweDA0MDQgKi8KLQl1aW50MTZfdCByb3dfc3BlZWQ7ICAgICAgICAgIC8qIDB4MzAxNiAqLwotCXVpbnQxNl90IHhfYWRkcl9zdGFydDsgICAgICAgLyogMHgzMDA0ICovCi0JdWludDE2X3QgeF9hZGRyX2VuZDsgICAgICAgICAvKiAweDMwMDggKi8KLQl1aW50MTZfdCB5X2FkZHJfc3RhcnQ7ICAgICAgIC8qIDB4MzAwMiAqLwotCXVpbnQxNl90IHlfYWRkcl9lbmQ7ICAgICAgICAgLyogMHgzMDA2ICovCi0JdWludDE2X3QgcmVhZF9tb2RlOyAgICAgICAgICAvKiAweDMwNDAgKi8KLQl1aW50MTZfdCB4X291dHB1dF9zaXplIDsgICAgIC8qIDB4MDM0QyAqLwotCXVpbnQxNl90IHlfb3V0cHV0X3NpemU7ICAgICAgLyogMHgwMzRFICovCi0JdWludDE2X3QgbGluZV9sZW5ndGhfcGNrOyAgICAvKiAweDMwMEMgKi8KLQl1aW50MTZfdCBmcmFtZV9sZW5ndGhfbGluZXM7IC8qIDB4MzAwQSAqLwotCXVpbnQxNl90IGNvYXJzZV9pbnRfdGltZTsgICAgLyogMHgzMDEyICovCi0JdWludDE2X3QgZmluZV9pbnRfdGltZTsgICAgICAvKiAweDMwMTQgKi8KLX07Ci0KLQotc3RydWN0IG10OXAwMTJfa21faTJjX3JlZ19jb25mIHsKLQl1bnNpZ25lZCBzaG9ydCB3YWRkcjsKLQl1bnNpZ25lZCBzaG9ydCB3ZGF0YTsKLX07Ci0KLQotc3RydWN0IG10OXAwMTJfa21fcmVnIHsKLQlzdHJ1Y3QgcmVnX3N0cnVjdCBjb25zdCAqcmVnX3BhdDsKLQl1aW50MTZfdCByZWdfcGF0X3NpemU7Ci0Jc3RydWN0IG10OXAwMTJfa21faTJjX3JlZ19jb25mIGNvbnN0ICp0dGJsOwotCXVpbnQxNl90IHR0Ymxfc2l6ZTsKLQlzdHJ1Y3QgbXQ5cDAxMl9rbV9pMmNfcmVnX2NvbmYgY29uc3QgKmxjdGJsOwotCXVpbnQxNl90IGxjdGJsX3NpemU7Ci0Jc3RydWN0IG10OXAwMTJfa21faTJjX3JlZ19jb25mIGNvbnN0ICpyZnRibDsKLQl1aW50MTZfdCByZnRibF9zaXplOwotfTsKLQotI2VuZGlmIC8qIE1UOVAwMTJfS01fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL210OXAwMTJfa21fcmVnLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5cDAxMl9rbV9yZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2MzE4Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5cDAxMl9rbV9yZWcuYworKysgL2Rldi9udWxsCkBAIC0xLDM3NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgIm10OXAwMTJfa20uaCIKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotLypNaWNyb24gc2V0dGluZ3MgZnJvbSBBcHBsaWNhdGlvbnMgZm9yIGxvd2VyIHBvd2VyIGNvbnN1bXB0aW9uLiovCi1zdHJ1Y3QgcmVnX3N0cnVjdCBjb25zdCBtdDlwMDEyX2ttX3JlZ19wYXRbMl0gPSB7Ci0JeyAvKiBQcmV2aWV3ICovCi0JCS8qIHZ0X3BpeF9jbGtfZGl2ICAgICAgICAgIFJFRz0weDAzMDAgKi8KLQkJNiwgIC8qIDUgKi8KLQotCQkvKiB2dF9zeXNfY2xrX2RpdiAgICAgICAgICBSRUc9MHgwMzAyICovCi0JCTEsCi0KLQkJLyogcHJlX3BsbF9jbGtfZGl2ICAgICAgICAgUkVHPTB4MDMwNCAqLwotCQkyLAotCi0JCS8qIHBsbF9tdWx0aXBsaWVyICAgICAgICAgIFJFRz0weDAzMDYgKi8KLQkJNjAsCi0KLQkJLyogb3BfcGl4X2Nsa19kaXYgICAgICAgICAgUkVHPTB4MDMwOCAqLwotCQk4LCAgLyogMTAgKi8KLQotCQkvKiBvcF9zeXNfY2xrX2RpdiAgICAgICAgICBSRUc9MHgwMzBBICovCi0JCTEsCi0KLQkJLyogc2NhbGVfbSAgICAgICAgICAgICAgICAgUkVHPTB4MDQwNCAqLwotCQkxNiwKLQotCQkvKiByb3dfc3BlZWQgICAgICAgICAgICAgICBSRUc9MHgzMDE2ICovCi0JCTB4MDExMSwKLQotCQkvKiB4X2FkZHJfc3RhcnQgICAgICAgICAgICBSRUc9MHgzMDA0ICovCi0JCTgsCi0KLQkJLyogeF9hZGRyX2VuZCAgICAgICAgICAgICAgUkVHPTB4MzAwOCAqLwotCQkyNTk3LAotCi0JCS8qIHlfYWRkcl9zdGFydCAgICAgICAgICAgIFJFRz0weDMwMDIgKi8KLQkJOCwKLQotCQkvKiB5X2FkZHJfZW5kICAgICAgICAgICAgICBSRUc9MHgzMDA2ICovCi0JCTE5NDksCi0KLQkJLyogcmVhZF9tb2RlICAgICAgICAgICAgICAgUkVHPTB4MzA0MAotCQkgKiBQcmV2aWV3IDJ4MiBza2lwcGluZyAqLwotCQkweDAwNkMsCi0KLQkJLyogeF9vdXRwdXRfc2l6ZSAgICAgICAgICAgUkVHPTB4MDM0QyAqLwotCQkxMjk2LAotCi0JCS8qIHlfb3V0cHV0X3NpemUgICAgICAgICAgIFJFRz0weDAzNEUgKi8KLQkJOTcyLAotCi0JCS8qIGxpbmVfbGVuZ3RoX3BjayAgICAgICAgIFJFRz0weDMwMEMgKi8KLQkJMzc4MywKLQotCQkvKiBmcmFtZV9sZW5ndGhfbGluZXMgICAgICBSRUc9MHgzMDBBICovCi0JCTEwNzQsCi0KLQkJLyogY29hcnNlX2ludGVncmF0aW9uX3RpbWUgUkVHPTB4MzAxMiAqLwotCQkxNiwKLQotCQkvKiBmaW5lX2ludGVncmF0aW9uX3RpbWUgICBSRUc9MHgzMDE0ICovCi0JCTE3NjQKLQl9LAotCXsgLyogU25hcHNob3QgKi8KLQkJLyogdnRfcGl4X2Nsa19kaXYgICAgICAgICAgUkVHPTB4MDMwMCAqLwotCQk2LAotCi0JCS8qIHZ0X3N5c19jbGtfZGl2ICAgICAgICAgIFJFRz0weDAzMDIgKi8KLQkJMSwKLQotCQkvKiBwcmVfcGxsX2Nsa19kaXYgICAgICAgICBSRUc9MHgwMzA0ICovCi0JCTIsCi0KLQkJLyogcGxsX211bHRpcGxpZXIgICAgICAgICAgUkVHPTB4MDMwNgotCQkgKiAzOSBmb3IgMTBmcHMgc25hcHNob3QgKi8KLQkJMzksCi0KLQkJLyogb3BfcGl4X2Nsa19kaXYgICAgICAgICAgUkVHPTB4MDMwOCAqLwotCQk4LAotCi0JCS8qIG9wX3N5c19jbGtfZGl2ICAgICAgICAgIFJFRz0weDAzMEEgKi8KLQkJMSwKLQotCQkvKiBzY2FsZV9tICAgICAgICAgICAgICAgICBSRUc9MHgwNDA0ICovCi0JCTE2LAotCi0JCS8qIHJvd19zcGVlZCAgICAgICAgICAgICAgIFJFRz0weDMwMTYgKi8KLQkJMHgwMTExLAotCi0JCS8qIHhfYWRkcl9zdGFydCAgICAgICAgICAgIFJFRz0weDMwMDQgKi8KLQkJOCwKLQotCQkvKiB4X2FkZHJfZW5kICAgICAgICAgICAgICBSRUc9MHgzMDA4ICovCi0JCTI2MTUsCi0KLQkJLyogeV9hZGRyX3N0YXJ0ICAgICAgICAgICAgUkVHPTB4MzAwMiAqLwotCQk4LAotCi0JCS8qIHlfYWRkcl9lbmQgICAgICAgICAgICAgIFJFRz0weDMwMDYgKi8KLQkJMTk2NywKLQotCQkvKiByZWFkX21vZGUgICAgICAgICAgICAgICBSRUc9MHgzMDQwICovCi0JCTB4MDAyNCwKLQotCQkvKiB4X291dHB1dF9zaXplICAgICAgICAgICBSRUc9MHgwMzRDICovCi0JCTI2MDgsCi0KLQkJLyogeV9vdXRwdXRfc2l6ZSAgICAgICAgICAgUkVHPTB4MDM0RSAqLwotCQkxOTYwLAotCi0JCS8qIGxpbmVfbGVuZ3RoX3BjayAgICAgICAgIFJFRz0weDMwMEMgKi8KLQkJMzc4OCwKLQotCQkvKiBmcmFtZV9sZW5ndGhfbGluZXMgICAgICBSRUc9MHgzMDBBIDEwIGZwcyBzbmFwc2hvdCAqLwotCQkyMDQ1LAotCi0JCS8qIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lIFJFRz0weDMwMTIgKi8KLQkJMTYsCi0KLQkJLyogZmluZV9pbnRlZ3JhdGlvbl90aW1lICAgUkVHPTB4MzAxNCAqLwotCQk4ODIKLQl9Ci19OwotCi1zdHJ1Y3QgbXQ5cDAxMl9rbV9pMmNfcmVnX2NvbmYgY29uc3QgbXQ5cDAxMl9rbV90ZXN0X3RibFtdID0gewotCXsweDMwNDQsIDB4MDU0NCAmIDB4RkJGRn0sCi0JezB4MzBDQSwgMHgwMDA0IHwgMHgwMDAxfSwKLQl7MHgzMEQ0LCAweDkwMjAgJiAweDdGRkZ9LAotCXsweDMxRTAsIDB4MDAwMyAmIDB4RkZGRX0sCi0JezB4MzE4MCwgMHg5MUZGICYgMHg3RkZGfSwKLQl7MHgzMDFBLCAoMHgxMENDIHwgMHg4MDAwKSAmIDB4RkZGN30sCi0JezB4MzAxRSwgMHgwMDAwfSwKLQl7MHgzNzgwLCAweDAwMDB9LAotfTsKLQotCi1zdHJ1Y3QgbXQ5cDAxMl9rbV9pMmNfcmVnX2NvbmYgY29uc3QgbXQ5cDAxMl9rbV9sY190YmxbXSA9IHsKLQl7MHgzNjBBLCAweDAwRjB9LAotCXsweDM2MEMsIDB4MEIyOX0sCi0JezB4MzYwRSwgMHg1RUQxfSwKLQl7MHgzNjEwLCAweDg5MER9LAotCXsweDM2MTIsIDB4OTg3MX0sCi0JezB4MzY0QSwgMHhBRDJDfSwKLQl7MHgzNjRDLCAweDBBOEN9LAotCXsweDM2NEUsIDB4OTFFQ30sCi0JezB4MzY1MCwgMHg5NEVDfSwKLQl7MHgzNjUyLCAweEM3NkJ9LAotCXsweDM2OEEsIDB4NTkzMX0sCi0JezB4MzY4QywgMHg0RkVEfSwKLQl7MHgzNjhFLCAweDhBNTB9LAotCXsweDM2OTAsIDB4NUMwRn0sCi0JezB4MzY5MiwgMHg4MzkzfSwKLQl7MHgzNkNBLCAweERCOEV9LAotCXsweDM2Q0MsIDB4Q0E0RH0sCi0JezB4MzZDRSwgMHgxNDZGfSwKLQl7MHgzNkQwLCAweDYxOEZ9LAotCXsweDM2RDIsIDB4MDE0Rn0sCi0JezB4MzcwQSwgMHgxRkVFfSwKLQl7MHgzNzBDLCAweERENTB9LAotCXsweDM3MEUsIDB4REI1NH0sCi0JezB4MzcxMCwgMHhDQTkyfSwKLQl7MHgzNzEyLCAweDE4OTZ9LAotCXsweDM2MDAsIDB4MDBGMH0sCi0JezB4MzYwMiwgMHhBMDRDfSwKLQl7MHgzNjA0LCAweDU3MTF9LAotCXsweDM2MDYsIDB4NUU2RH0sCi0JezB4MzYwOCwgMHhBOTcxfSwKLQl7MHgzNjQwLCAweERDQ0N9LAotCXsweDM2NDIsIDB4MDUyOX0sCi0JezB4MzY0NCwgMHg5NkVEfSwKLQl7MHgzNjQ2LCAweEY0NDd9LAotCXsweDM2NDgsIDB4NEFFRX0sCi0JezB4MzY4MCwgMHgyMTcxfSwKLQl7MHgzNjgyLCAweDYzNEZ9LAotCXsweDM2ODQsIDB4Q0M5MX0sCi0JezB4MzY4NiwgMHhBOUNFfSwKLQl7MHgzNjg4LCAweDg3NTF9LAotCXsweDM2QzAsIDB4OEI2RH0sCi0JezB4MzZDMiwgMHhFMjBFfSwKLQl7MHgzNkM0LCAweDc1MEZ9LAotCXsweDM2QzYsIDB4MDA5MH0sCi0JezB4MzZDOCwgMHg5RTkxfSwKLQl7MHgzNzAwLCAweEVBQUZ9LAotCXsweDM3MDIsIDB4QjhBRn0sCi0JezB4MzcwNCwgMHhFMjkzfSwKLQl7MHgzNzA2LCAweEFCMzN9LAotCXsweDM3MDgsIDB4NDU5NX0sCi0JezB4MzYxNCwgMHgwMEQwfSwKLQl7MHgzNjE2LCAweDhBQUJ9LAotCXsweDM2MTgsIDB4MThCMX0sCi0JezB4MzYxQSwgMHg1NEFEfSwKLQl7MHgzNjFDLCAweDlEQjB9LAotCXsweDM2NTQsIDB4MTFFQn0sCi0JezB4MzY1NiwgMHgzMzJDfSwKLQl7MHgzNjU4LCAweDMxNkR9LAotCXsweDM2NUEsIDB4RjBFQn0sCi0JezB4MzY1QywgMHhCNEVEfSwKLQl7MHgzNjk0LCAweDBGMzF9LAotCXsweDM2OTYsIDB4MDhEMH0sCi0JezB4MzY5OCwgMHhBNTJGfSwKLQl7MHgzNjlBLCAweEU2NEZ9LAotCXsweDM2OUMsIDB4QzlEMn0sCi0JezB4MzZENCwgMHg4QzJEfSwKLQl7MHgzNkQ2LCAweEFENkV9LAotCXsweDM2RDgsIDB4RTFDRX0sCi0JezB4MzZEQSwgMHgxNzUwfSwKLQl7MHgzNkRDLCAweDhDQUR9LAotCXsweDM3MTQsIDB4OENBRn0sCi0JezB4MzcxNiwgMHg4QzExfSwKLQl7MHgzNzE4LCAweEU0NTN9LAotCXsweDM3MUEsIDB4OTY5M30sCi0JezB4MzcxQywgMHgzOEI1fSwKLQl7MHgzNjFFLCAweDAwRDB9LAotCXsweDM2MjAsIDB4QjZDQn0sCi0JezB4MzYyMiwgMHg0ODExfSwKLQl7MHgzNjI0LCAweEI3MEN9LAotCXsweDM2MjYsIDB4QTc3MX0sCi0JezB4MzY1RSwgMHhCNUE5fSwKLQl7MHgzNjYwLCAweDA1QUF9LAotCXsweDM2NjIsIDB4MDBDRn0sCi0JezB4MzY2NCwgMHhCODZCfSwKLQl7MHgzNjY2LCAweEE0QUZ9LAotCXsweDM2OUUsIDB4M0UzMX0sCi0JezB4MzZBMCwgMHg5MDJCfSwKLQl7MHgzNkEyLCAweEQyNTF9LAotCXsweDM2QTQsIDB4NUMyRn0sCi0JezB4MzZBNiwgMHg4NDcxfSwKLQl7MHgzNkRFLCAweDJDNkR9LAotCXsweDM2RTAsIDB4RUNFRX0sCi0JezB4MzZFMiwgMHhCNjUwfSwKLQl7MHgzNkU0LCAweDAyMTB9LAotCXsweDM2RTYsIDB4QUNBRX0sCi0JezB4MzcxRSwgMHhBQzMwfSwKLQl7MHgzNzIwLCAweDM5NEV9LAotCXsweDM3MjIsIDB4RkREM30sCi0JezB4MzcyNCwgMHhCQ0IyfSwKLQl7MHgzNzI2LCAweDVBRDV9LAotCXsweDM3ODIsIDB4MDUwOH0sCi0JezB4Mzc4NCwgMHgwM0I0fSwKLQl7MHgzNzgwLCAweDgwMDB9LAotfTsKLQotc3RydWN0IG10OXAwMTJfa21faTJjX3JlZ19jb25mIGNvbnN0IG10OXAwMTJfa21fcm9sbG9mZl90YmxbXSA9IHsKLQl7MHgzNjBBLCAweDAwRjB9LAotCXsweDM2MEMsIDB4MEIyOX0sCi0JezB4MzYwRSwgMHg1RUQxfSwKLQl7MHgzNjEwLCAweDg5MER9LAotCXsweDM2MTIsIDB4OTg3MX0sCi0JezB4MzY0QSwgMHhBRDJDfSwKLQl7MHgzNjRDLCAweDBBOEN9LAotCXsweDM2NEUsIDB4OTFFQ30sCi0JezB4MzY1MCwgMHg5NEVDfSwKLQl7MHgzNjUyLCAweEM3NkJ9LAotCXsweDM2OEEsIDB4NTkzMX0sCi0JezB4MzY4QywgMHg0RkVEfSwKLQl7MHgzNjhFLCAweDhBNTB9LAotCXsweDM2OTAsIDB4NUMwRn0sCi0JezB4MzY5MiwgMHg4MzkzfSwKLQl7MHgzNkNBLCAweERCOEV9LAotCXsweDM2Q0MsIDB4Q0E0RH0sCi0JezB4MzZDRSwgMHgxNDZGfSwKLQl7MHgzNkQwLCAweDYxOEZ9LAotCXsweDM2RDIsIDB4MDE0Rn0sCi0JezB4MzcwQSwgMHgxRkVFfSwKLQl7MHgzNzBDLCAweERENTB9LAotCXsweDM3MEUsIDB4REI1NH0sCi0JezB4MzcxMCwgMHhDQTkyfSwKLQl7MHgzNzEyLCAweDE4OTZ9LAotCXsweDM2MDAsIDB4MDBGMH0sCi0JezB4MzYwMiwgMHhBMDRDfSwKLQl7MHgzNjA0LCAweDU3MTF9LAotCXsweDM2MDYsIDB4NUU2RH0sCi0JezB4MzYwOCwgMHhBOTcxfSwKLQl7MHgzNjQwLCAweERDQ0N9LAotCXsweDM2NDIsIDB4MDUyOX0sCi0JezB4MzY0NCwgMHg5NkVEfSwKLQl7MHgzNjQ2LCAweEY0NDd9LAotCXsweDM2NDgsIDB4NEFFRX0sCi0JezB4MzY4MCwgMHgyMTcxfSwKLQl7MHgzNjgyLCAweDYzNEZ9LAotCXsweDM2ODQsIDB4Q0M5MX0sCi0JezB4MzY4NiwgMHhBOUNFfSwKLQl7MHgzNjg4LCAweDg3NTF9LAotCXsweDM2QzAsIDB4OEI2RH0sCi0JezB4MzZDMiwgMHhFMjBFfSwKLQl7MHgzNkM0LCAweDc1MEZ9LAotCXsweDM2QzYsIDB4MDA5MH0sCi0JezB4MzZDOCwgMHg5RTkxfSwKLQl7MHgzNzAwLCAweEVBQUZ9LAotCXsweDM3MDIsIDB4QjhBRn0sCi0JezB4MzcwNCwgMHhFMjkzfSwKLQl7MHgzNzA2LCAweEFCMzN9LAotCXsweDM3MDgsIDB4NDU5NX0sCi0JezB4MzYxNCwgMHgwMEQwfSwKLQl7MHgzNjE2LCAweDhBQUJ9LAotCXsweDM2MTgsIDB4MThCMX0sCi0JezB4MzYxQSwgMHg1NEFEfSwKLQl7MHgzNjFDLCAweDlEQjB9LAotCXsweDM2NTQsIDB4MTFFQn0sCi0JezB4MzY1NiwgMHgzMzJDfSwKLQl7MHgzNjU4LCAweDMxNkR9LAotCXsweDM2NUEsIDB4RjBFQn0sCi0JezB4MzY1QywgMHhCNEVEfSwKLQl7MHgzNjk0LCAweDBGMzF9LAotCXsweDM2OTYsIDB4MDhEMH0sCi0JezB4MzY5OCwgMHhBNTJGfSwKLQl7MHgzNjlBLCAweEU2NEZ9LAotCXsweDM2OUMsIDB4QzlEMn0sCi0JezB4MzZENCwgMHg4QzJEfSwKLQl7MHgzNkQ2LCAweEFENkV9LAotCXsweDM2RDgsIDB4RTFDRX0sCi0JezB4MzZEQSwgMHgxNzUwfSwKLQl7MHgzNkRDLCAweDhDQUR9LAotCXsweDM3MTQsIDB4OENBRn0sCi0JezB4MzcxNiwgMHg4QzExfSwKLQl7MHgzNzE4LCAweEU0NTN9LAotCXsweDM3MUEsIDB4OTY5M30sCi0JezB4MzcxQywgMHgzOEI1fSwKLQl7MHgzNjFFLCAweDAwRDB9LAotCXsweDM2MjAsIDB4QjZDQn0sCi0JezB4MzYyMiwgMHg0ODExfSwKLQl7MHgzNjI0LCAweEI3MEN9LAotCXsweDM2MjYsIDB4QTc3MX0sCi0JezB4MzY1RSwgMHhCNUE5fSwKLQl7MHgzNjYwLCAweDA1QUF9LAotCXsweDM2NjIsIDB4MDBDRn0sCi0JezB4MzY2NCwgMHhCODZCfSwKLQl7MHgzNjY2LCAweEE0QUZ9LAotCXsweDM2OUUsIDB4M0UzMX0sCi0JezB4MzZBMCwgMHg5MDJCfSwKLQl7MHgzNkEyLCAweEQyNTF9LAotCXsweDM2QTQsIDB4NUMyRn0sCi0JezB4MzZBNiwgMHg4NDcxfSwKLQl7MHgzNkRFLCAweDJDNkR9LAotCXsweDM2RTAsIDB4RUNFRX0sCi0JezB4MzZFMiwgMHhCNjUwfSwKLQl7MHgzNkU0LCAweDAyMTB9LAotCXsweDM2RTYsIDB4QUNBRX0sCi0JezB4MzcxRSwgMHhBQzMwfSwKLQl7MHgzNzIwLCAweDM5NEV9LAotCXsweDM3MjIsIDB4RkREM30sCi0JezB4MzcyNCwgMHhCQ0IyfSwKLQl7MHgzNzI2LCAweDVBRDV9LAotCXsweDM3ODIsIDB4MDUwOH0sCi0JezB4Mzc4NCwgMHgwM0I0fSwKLQl7MHgzNzgwLCAweDgwMDB9LAotfTsKLQotCi1zdHJ1Y3QgbXQ5cDAxMl9rbV9yZWcgbXQ5cDAxMl9rbV9yZWdzID0gewotCS5yZWdfcGF0ID0gJm10OXAwMTJfa21fcmVnX3BhdFswXSwKLQkucmVnX3BhdF9zaXplID0gQVJSQVlfU0laRShtdDlwMDEyX2ttX3JlZ19wYXQpLAotCS50dGJsID0gJm10OXAwMTJfa21fdGVzdF90YmxbMF0sCi0JLnR0Ymxfc2l6ZSA9IEFSUkFZX1NJWkUobXQ5cDAxMl9rbV90ZXN0X3RibCksCi0JLmxjdGJsID0gJm10OXAwMTJfa21fbGNfdGJsWzBdLAotCS5sY3RibF9zaXplID0gQVJSQVlfU0laRShtdDlwMDEyX2ttX2xjX3RibCksCi0JLnJmdGJsID0gJm10OXAwMTJfa21fcm9sbG9mZl90YmxbMF0sCi0JLnJmdGJsX3NpemUgPSBBUlJBWV9TSVpFKG10OXAwMTJfa21fcm9sbG9mZl90YmwpCi19OwotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDlwMDEyX3JlZy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL210OXAwMTJfcmVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4Mjg4NTIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL210OXAwMTJfcmVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSAibXQ5cDAxMi5oIgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0vKk1pY3JvbiBzZXR0aW5ncyBmcm9tIEFwcGxpY2F0aW9ucyBmb3IgbG93ZXIgcG93ZXIgY29uc3VtcHRpb24uKi8KLXN0cnVjdCByZWdfc3RydWN0IGNvbnN0IG10OXAwMTJfcmVnX3BhdFsyXSA9IHsKLQl7IC8qIFByZXZpZXcgKi8KLQkJLyogdnRfcGl4X2Nsa19kaXYgICAgICAgICAgUkVHPTB4MDMwMCAqLwotCQk2LCAgLyogNSAqLwotCi0JCS8qIHZ0X3N5c19jbGtfZGl2ICAgICAgICAgIFJFRz0weDAzMDIgKi8KLQkJMSwKLQkJLyogcHJlX3BsbF9jbGtfZGl2ICAgICAgICAgUkVHPTB4MDMwNCAqLwotCQkyLAotCQkvKiBwbGxfbXVsdGlwbGllciAgICAgICAgICBSRUc9MHgwMzA2ICovCi0JCTYwLAotCi0JCS8qIG9wX3BpeF9jbGtfZGl2ICAgICAgICAgIFJFRz0weDAzMDggKi8KLQkJOCwgIC8qIDEwICovCi0KLQkJLyogb3Bfc3lzX2Nsa19kaXYgICAgICAgICAgUkVHPTB4MDMwQSAqLwotCQkxLAotCi0JCS8qIHNjYWxlX20gICAgICAgICAgICAgICAgIFJFRz0weDA0MDQgKi8KLQkJMTYsCi0KLQkJLyogcm93X3NwZWVkICAgICAgICAgICAgICAgUkVHPTB4MzAxNiAqLwotCQkweDAxMTEsCi0KLQkJLyogeF9hZGRyX3N0YXJ0ICAgICAgICAgICAgUkVHPTB4MzAwNCAqLwotCQk4LAotCi0JCS8qIHhfYWRkcl9lbmQgICAgICAgICAgICAgIFJFRz0weDMwMDggKi8KLQkJMjU5NywKLQotCQkvKiB5X2FkZHJfc3RhcnQgICAgICAgICAgICBSRUc9MHgzMDAyICovCi0JCTgsCi0KLQkJLyogeV9hZGRyX2VuZCAgICAgICAgICAgICAgUkVHPTB4MzAwNiAqLwotCQkxOTQ5LAotCi0JCS8qIHJlYWRfbW9kZSAgICAgICAgICAgICAgIFJFRz0weDMwNDAKLQkJICogUHJldmlldyAyeDIgc2tpcHBpbmcgKi8KLQkJMHgwMEMzLAotCi0JCS8qIHhfb3V0cHV0X3NpemUgICAgICAgICAgIFJFRz0weDAzNEMgKi8KLQkJMTI5NiwKLQotCQkvKiB5X291dHB1dF9zaXplICAgICAgICAgICBSRUc9MHgwMzRFICovCi0JCTk3MiwKLQotCQkvKiBsaW5lX2xlbmd0aF9wY2sgICAgICAgICBSRUc9MHgzMDBDICovCi0JCTM2NTksCi0KLQkJLyogZnJhbWVfbGVuZ3RoX2xpbmVzICAgICAgUkVHPTB4MzAwQSAqLwotCQkxMDc0LAotCi0JCS8qIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lIFJFRz0weDMwMTIgKi8KLQkJMTYsCi0KLQkJLyogZmluZV9pbnRlZ3JhdGlvbl90aW1lICAgUkVHPTB4MzAxNCAqLwotCQkxNzY0Ci0JfSwKLQl7IC8qIFNuYXBzaG90ICovCi0JCS8qIHZ0X3BpeF9jbGtfZGl2ICAgICAgICAgIFJFRz0weDAzMDAgKi8KLQkJNiwKLQotCQkvKiB2dF9zeXNfY2xrX2RpdiAgICAgICAgICBSRUc9MHgwMzAyICovCi0JCTEsCi0KLQkJLyogcHJlX3BsbF9jbGtfZGl2ICAgICAgICAgUkVHPTB4MDMwNCAqLwotCQkyLAotCi0JCS8qIHBsbF9tdWx0aXBsaWVyICAgICAgICAgIFJFRz0weDAzMDYKLQkJICogNjAgZm9yIDEwZnBzIHNuYXBzaG90ICovCi0JCTYwLAotCi0JCS8qIG9wX3BpeF9jbGtfZGl2ICAgICAgICAgIFJFRz0weDAzMDggKi8KLQkJOCwKLQotCQkvKiBvcF9zeXNfY2xrX2RpdiAgICAgICAgICBSRUc9MHgwMzBBICovCi0JCTEsCi0KLQkJLyogc2NhbGVfbSAgICAgICAgICAgICAgICAgUkVHPTB4MDQwNCAqLwotCQkxNiwKLQotCQkvKiByb3dfc3BlZWQgICAgICAgICAgICAgICBSRUc9MHgzMDE2ICovCi0JCTB4MDExMSwKLQotCQkvKiB4X2FkZHJfc3RhcnQgICAgICAgICAgICBSRUc9MHgzMDA0ICovCi0JCTgsCi0KLQkJLyogeF9hZGRyX2VuZCAgICAgICAgICAgICAgUkVHPTB4MzAwOCAqLwotCQkyNjE1LAotCi0JCS8qIHlfYWRkcl9zdGFydCAgICAgICAgICAgIFJFRz0weDMwMDIgKi8KLQkJOCwKLQotCQkvKiB5X2FkZHJfZW5kICAgICAgICAgICAgICBSRUc9MHgzMDA2ICovCi0JCTE5NjcsCi0KLQkJLyogcmVhZF9tb2RlICAgICAgICAgICAgICAgUkVHPTB4MzA0MCAqLwotCQkweDAwNDEsCi0KLQkJLyogeF9vdXRwdXRfc2l6ZSAgICAgICAgICAgUkVHPTB4MDM0QyAqLwotCQkyNjA4LAotCi0JCS8qIHlfb3V0cHV0X3NpemUgICAgICAgICAgIFJFRz0weDAzNEUgKi8KLQkJMTk2MCwKLQotCQkvKiBsaW5lX2xlbmd0aF9wY2sgICAgICAgICBSRUc9MHgzMDBDICovCi0JCTM5MTEsCi0KLQkJLyogZnJhbWVfbGVuZ3RoX2xpbmVzICAgICAgUkVHPTB4MzAwQSAxMCBmcHMgc25hcHNob3QgKi8KLQkJMjA0NSwKLQotCQkvKiBjb2Fyc2VfaW50ZWdyYXRpb25fdGltZSBSRUc9MHgzMDEyICovCi0JCTE2LAotCi0JCS8qIGZpbmVfaW50ZWdyYXRpb25fdGltZSAgIFJFRz0weDMwMTQgKi8KLQkJODgyCi0JfQotfTsKLQotCi1zdHJ1Y3QgbXQ5cDAxMl9pMmNfcmVnX2NvbmYgY29uc3QgbXQ5cDAxMl90ZXN0X3RibFtdID0gewotCXsweDMwNDQsIDB4MDU0NCAmIDB4RkJGRn0sCi0JezB4MzBDQSwgMHgwMDA0IHwgMHgwMDAxfSwKLQl7MHgzMEQ0LCAweDkwMjAgJiAweDdGRkZ9LAotCXsweDMxRTAsIDB4MDAwMyAmIDB4RkZGRX0sCi0JezB4MzE4MCwgMHg5MUZGICYgMHg3RkZGfSwKLQl7MHgzMDFBLCAoMHgxMENDIHwgMHg4MDAwKSAmIDB4RkZGN30sCi0JezB4MzAxRSwgMHgwMDAwfSwKLQl7MHgzNzgwLCAweDAwMDB9LAotfTsKLXN0cnVjdCBtdDlwMDEyX2kyY19yZWdfY29uZiBjb25zdCBtdDlwMDEyX3JvbGxvZmZfdGJsW10gPSB7Ci0JezB4MzYwQSwgMHgwMTEwfSwKLQl7MHgzNjBDLCAweDI3MER9LAotCXsweDM2MEUsIDB4MDA3MX0sCi0JezB4MzYxMCwgMHhBMzhEfSwKLQl7MHgzNjEyLCAweEE2MTB9LAotCXsweDM2NEEsIDB4OEY0OX0sCi0JezB4MzY0QywgMHg2OTZBfSwKLQl7MHgzNjRFLCAweDBGQ0R9LAotCXsweDM2NTAsIDB4MjBFRH0sCi0JezB4MzY1MiwgMHg4MUVEfSwKLQl7MHgzNjhBLCAweDEwMzF9LAotCXsweDM2OEMsIDB4QkNBRH0sCi0JezB4MzY4RSwgMHg3N0FBfSwKLQl7MHgzNjkwLCAweEQxMEV9LAotCXsweDM2OTIsIDB4QzEzM30sCi0JezB4MzZDQSwgMHg0RjhEfSwKLQl7MHgzNkNDLCAweEFDNER9LAotCXsweDM2Q0UsIDB4QzhDRX0sCi0JezB4MzZEMCwgMHg3M0FEfSwKLQl7MHgzNkQyLCAweEMxNTB9LAotCXsweDM3MEEsIDB4QjU5MH0sCi0JezB4MzcwQywgMHg5MDEwfSwKLQl7MHgzNzBFLCAweEFDNTJ9LAotCXsweDM3MTAsIDB4NEQ1MX0sCi0JezB4MzcxMiwgMHg1NjcwfSwKLQl7MHgzNjAwLCAweDAwRjB9LAotCXsweDM2MDIsIDB4Q0U0Qn0sCi0JezB4MzYwNCwgMHg0MjcwfSwKLQl7MHgzNjA2LCAweDhCQzl9LAotCXsweDM2MDgsIDB4RkEyRn0sCi0JezB4MzY0MCwgMHg5QTA5fSwKLQl7MHgzNjQyLCAweEI0MEN9LAotCXsweDM2NDQsIDB4NEVDRH0sCi0JezB4MzY0NiwgMHgxQkNDfSwKLQl7MHgzNjQ4LCAweEQ2OEV9LAotCXsweDM2ODAsIDB4MUJGMH0sCi0JezB4MzY4MiwgMHhDOTREfSwKLQl7MHgzNjg0LCAweDcxNEZ9LAotCXsweDM2ODYsIDB4MTQ5MX0sCi0JezB4MzY4OCwgMHhCOEQzfSwKLQl7MHgzNkMwLCAweDNFNDl9LAotCXsweDM2QzIsIDB4N0E2Q30sCi0JezB4MzZDNCwgMHhFRjJFfSwKLQl7MHgzNkM2LCAweEUwRUV9LAotCXsweDM2QzgsIDB4NTcwRn0sCi0JezB4MzcwMCwgMHhENkFGfSwKLQl7MHgzNzAyLCAweDIyNTF9LAotCXsweDM3MDQsIDB4OEEzM30sCi0JezB4MzcwNiwgMHhFRkIzfSwKLQl7MHgzNzA4LCAweDExNzR9LAotCXsweDM2MTQsIDB4MDE1MH0sCi0JezB4MzYxNiwgMHhBOUFCfSwKLQl7MHgzNjE4LCAweDE3NzB9LAotCXsweDM2MUEsIDB4ODgwOX0sCi0JezB4MzYxQywgMHhFM0FFfSwKLQl7MHgzNjU0LCAweDVBQ0N9LAotCXsweDM2NTYsIDB4MzVFQX0sCi0JezB4MzY1OCwgMHgyREVDfSwKLQl7MHgzNjVBLCAweEI5MEJ9LAotCXsweDM2NUMsIDB4MjUwQ30sCi0JezB4MzY5NCwgMHgxNjMwfSwKLQl7MHgzNjk2LCAweEQ4OEN9LAotCXsweDM2OTgsIDB4QkQwRX0sCi0JezB4MzY5QSwgMHgxNkQxfSwKLQl7MHgzNjlDLCAweEU0OTJ9LAotCXsweDM2RDQsIDB4NUQ2RH0sCi0JezB4MzZENiwgMHg5MDZFfSwKLQl7MHgzNkQ4LCAweDEwQUV9LAotCXsweDM2REEsIDB4N0E4RX0sCi0JezB4MzZEQywgMHg5NjcyfSwKLQl7MHgzNzE0LCAweDhEOTB9LAotCXsweDM3MTYsIDB4MDRGMX0sCi0JezB4MzcxOCwgMHgyM0YxfSwKLQl7MHgzNzFBLCAweEYzMTN9LAotCXsweDM3MUMsIDB4RTgzM30sCi0JezB4MzYxRSwgMHgwNDkwfSwKLQl7MHgzNjIwLCAweDE0Q0R9LAotCXsweDM2MjIsIDB4MzhGMH0sCi0JezB4MzYyNCwgMHhCQUVEfSwKLQl7MHgzNjI2LCAweEZGNkZ9LAotCXsweDM2NUUsIDB4MzU4Q30sCi0JezB4MzY2MCwgMHhBOUU5fSwKLQl7MHgzNjYyLCAweDRBNEV9LAotCXsweDM2NjQsIDB4Mzk4RH0sCi0JezB4MzY2NiwgMHg4OTBGfSwKLQl7MHgzNjlFLCAweDJERjB9LAotCXsweDM2QTAsIDB4RjdDRX0sCi0JezB4MzZBMiwgMHhCM0NDfSwKLQl7MHgzNkE0LCAweDExOER9LAotCXsweDM2QTYsIDB4OUNCM30sCi0JezB4MzZERSwgMHg0NjJEfSwKLQl7MHgzNkUwLCAweDc0QUF9LAotCXsweDM2RTIsIDB4QzhDRn0sCi0JezB4MzZFNCwgMHg4REVGfSwKLQl7MHgzNkU2LCAweEYxMzB9LAotCXsweDM3MUUsIDB4OTI1MH0sCi0JezB4MzcyMCwgMHgxOUNDfSwKLQl7MHgzNzIyLCAweERGRDF9LAotCXsweDM3MjQsIDB4NUI3MH0sCi0JezB4MzcyNiwgMHgzNEQyfSwKLQl7MHgzNzgyLCAweDA1MzB9LAotCXsweDM3ODQsIDB4MDNDOH0sCi0JezB4Mzc4MCwgMHg4MDAwfSwKLX07Ci0KLXN0cnVjdCBtdDlwMDEyX3JlZyBtdDlwMDEyX3JlZ3MgPSB7Ci0JLnJlZ19wYXQgPSAmbXQ5cDAxMl9yZWdfcGF0WzBdLAotCS5yZWdfcGF0X3NpemUgPSBBUlJBWV9TSVpFKG10OXAwMTJfcmVnX3BhdCksCi0JLnR0YmwgPSAmbXQ5cDAxMl90ZXN0X3RibFswXSwKLQkudHRibF9zaXplID0gQVJSQVlfU0laRShtdDlwMDEyX3Rlc3RfdGJsKSwKLQkucmZ0YmwgPSAmbXQ5cDAxMl9yb2xsb2ZmX3RibFswXSwKLQkucmZ0Ymxfc2l6ZSA9IEFSUkFZX1NJWkUobXQ5cDAxMl9yb2xsb2ZmX3RibCkKLX07Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL210OXQwMTMuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDl0MDEzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMDc5MzAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL210OXQwMTMuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MDQgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2NhbWVyYS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlICJtdDl0MDEzLmgiCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVNFTlNPUiBSRUdJU1RFUiBERUZJTkVTCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0jZGVmaW5lIE1UOVQwMTNfUkVHX01PREVMX0lEIAkJIDB4MDAwMAotI2RlZmluZSBNVDlUMDEzX01PREVMX0lEICAgICAJCSAweDI2MDAKLSNkZWZpbmUgUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQgICAweDAxMDQKLSNkZWZpbmUgR1JPVVBFRF9QQVJBTUVURVJfSE9MRCAgICAgICAweDAxMDAKLSNkZWZpbmUgR1JPVVBFRF9QQVJBTUVURVJfVVBEQVRFICAgICAweDAwMDAKLSNkZWZpbmUgUkVHX0NPQVJTRV9JTlRfVElNRSAgICAgICAgICAweDMwMTIKLSNkZWZpbmUgUkVHX1ZUX1BJWF9DTEtfRElWICAgICAgICAgICAweDAzMDAKLSNkZWZpbmUgUkVHX1ZUX1NZU19DTEtfRElWICAgICAgICAgICAweDAzMDIKLSNkZWZpbmUgUkVHX1BSRV9QTExfQ0xLX0RJViAgICAgICAgICAweDAzMDQKLSNkZWZpbmUgUkVHX1BMTF9NVUxUSVBMSUVSICAgICAgICAgICAweDAzMDYKLSNkZWZpbmUgUkVHX09QX1BJWF9DTEtfRElWICAgICAgICAgICAweDAzMDgKLSNkZWZpbmUgUkVHX09QX1NZU19DTEtfRElWICAgICAgICAgICAweDAzMEEKLSNkZWZpbmUgUkVHX1NDQUxFX00gICAgICAgICAgICAgICAgICAweDA0MDQKLSNkZWZpbmUgUkVHX0ZSQU1FX0xFTkdUSF9MSU5FUyAgICAgICAweDMwMEEKLSNkZWZpbmUgUkVHX0xJTkVfTEVOR1RIX1BDSyAgICAgICAgICAweDMwMEMKLSNkZWZpbmUgUkVHX1hfQUREUl9TVEFSVCAgICAgICAgICAgICAweDMwMDQKLSNkZWZpbmUgUkVHX1lfQUREUl9TVEFSVCAgICAgICAgICAgICAweDMwMDIKLSNkZWZpbmUgUkVHX1hfQUREUl9FTkQgICAgICAgICAgICAgICAweDMwMDgKLSNkZWZpbmUgUkVHX1lfQUREUl9FTkQgICAgICAgICAgICAgICAweDMwMDYKLSNkZWZpbmUgUkVHX1hfT1VUUFVUX1NJWkUgICAgICAgICAgICAweDAzNEMKLSNkZWZpbmUgUkVHX1lfT1VUUFVUX1NJWkUgICAgICAgICAgICAweDAzNEUKLSNkZWZpbmUgUkVHX0ZJTkVfSU5UX1RJTUUgICAgICAgICAgICAweDMwMTQKLSNkZWZpbmUgUkVHX1JPV19TUEVFRCAgICAgICAgICAgICAgICAweDMwMTYKLSNkZWZpbmUgTVQ5VDAxM19SRUdfUkVTRVRfUkVHSVNURVIgICAweDMwMUEKLSNkZWZpbmUgTVQ5VDAxM19SRVNFVF9SRUdJU1RFUl9QV09OICAweDEwQ0MKLSNkZWZpbmUgTVQ5VDAxM19SRVNFVF9SRUdJU1RFUl9QV09GRiAweDEwMDggLyogMHgxMEM4IHN0b3Agc3RyZWFtaW5nKi8KLSNkZWZpbmUgTVQ5VDAxM19SRVNFVF9GQVNUX1RSQU5TSVRJT04gMHgwMDAyCi0jZGVmaW5lIFJFR19SRUFEX01PREUgICAgICAgICAgICAgICAgMHgzMDQwCi0jZGVmaW5lIFJFR19HTE9CQUxfR0FJTiAgICAgICAgICAgICAgMHgzMDVFCi0jZGVmaW5lIFJFR19URVNUX1BBVFRFUk5fTU9ERSAgICAgICAgMHgzMDcwCi0KLQotZW51bSBtdDl0MDEzX3Rlc3RfbW9kZSB7Ci0JVEVTVF9PRkYsCi0JVEVTVF8xLAotCVRFU1RfMiwKLQlURVNUXzMKLX07Ci0KLWVudW0gbXQ5dDAxM19yZXNvbHV0aW9uIHsKLQlRVFJfU0laRSwKLQlGVUxMX1NJWkUsCi0JSU5WQUxJRF9TSVpFCi19OwotCi1lbnVtIG10OXQwMTNfcmVnX3VwZGF0ZSB7Ci0JUkVHX0lOSVQsIC8qIHJlZ2lzdGVycyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKi8KLQlVUERBVEVfUEVSSU9ESUMsIC8qIHJlZ2lzdGVycyB0aGF0IG5lZWRzIHBlcmlvZGljIEkyQyB3cml0ZXMgKi8KLQlVUERBVEVfQUxMLCAvKiBhbGwgcmVnaXN0ZXJzIHdpbGwgYmUgdXBkYXRlZCAqLwotCVVQREFURV9JTlZBTElECi19OwotCi1lbnVtIG10OXQwMTNfc2V0dGluZyB7Ci0JUkVTX1BSRVZJRVcsCi0JUkVTX0NBUFRVUkUKLX07Ci0KLS8qIGFjdHVhdG9yJ3MgU2xhdmUgQWRkcmVzcyAqLwotI2RlZmluZSBNVDlUMDEzX0FGX0kyQ19BRERSICAgMHgxOAotCi0vKgotKiBBRiBUb3RhbCBzdGVwcyBwYXJhbWV0ZXJzCi0qLwotI2RlZmluZSBNVDlUMDEzX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSICAgIDMwCi0KLS8qCi0gKiBUaW1lIGluIG1pbGlzZWNzIGZvciB3YWl0aW5nIGZvciB0aGUgc2Vuc29yIHRvIHJlc2V0LgotICovCi0jZGVmaW5lIE1UOVQwMTNfUkVTRVRfREVMQVlfTVNFQ1MgICA2NgotCi0vKiBmb3IgMzAgZnBzIHByZXZpZXcgKi8KLSNkZWZpbmUgTVQ5VDAxM19ERUZBVUxUX0NMT0NLX1JBVEUgIDI0MDAwMDAwCi0jZGVmaW5lIE1UOVQwMTNfREVGQVVMVF9NQVhfRlBTICAgICAyNgotCi0KLS8qIEZJWE1FOiBDaGFuZ2VzIGZyb20gaGVyZSAqLwotc3RydWN0IG10OXQwMTNfd29yayB7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Ci19OwotCi1zdGF0aWMgc3RydWN0ICBtdDl0MDEzX3dvcmsgKm10OXQwMTNfc2Vuc29ydzsKLXN0YXRpYyBzdHJ1Y3QgIGkyY19jbGllbnQgKm10OXQwMTNfY2xpZW50OwotCi1zdHJ1Y3QgbXQ5dDAxM19jdHJsIHsKLQljb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2Vuc29yZGF0YTsKLQotCWludCBzZW5zb3Jtb2RlOwotCXVpbnQzMl90IGZwc19kaXZpZGVyOyAJCS8qIGluaXQgdG8gMSAqIDB4MDAwMDA0MDAgKi8KLQl1aW50MzJfdCBwaWN0X2Zwc19kaXZpZGVyOyAJLyogaW5pdCB0byAxICogMHgwMDAwMDQwMCAqLwotCi0JdWludDE2X3QgY3Vycl9sZW5zX3BvczsKLQl1aW50MTZfdCBpbml0X2N1cnJfbGVuc19wb3M7Ci0JdWludDE2X3QgbXlfcmVnX2dhaW47Ci0JdWludDMyX3QgbXlfcmVnX2xpbmVfY291bnQ7Ci0KLQllbnVtIG10OXQwMTNfcmVzb2x1dGlvbiBwcmV2X3JlczsKLQllbnVtIG10OXQwMTNfcmVzb2x1dGlvbiBwaWN0X3JlczsKLQllbnVtIG10OXQwMTNfcmVzb2x1dGlvbiBjdXJyX3JlczsKLQllbnVtIG10OXQwMTNfdGVzdF9tb2RlICBzZXRfdGVzdDsKLQotCXVuc2lnbmVkIHNob3J0IGltZ2FkZHI7Ci19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgbXQ5dDAxM19jdHJsICptdDl0MDEzX2N0cmw7Ci1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobXQ5dDAxM193YWl0X3F1ZXVlKTsKLURFRklORV9TRU1BUEhPUkUobXQ5dDAxM19zZW0pOwotCi1zdGF0aWMgaW50IG10OXQwMTNfaTJjX3J4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQl1bnNpZ25lZCBjaGFyICpyeGRhdGEsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGkyY19tc2cgbXNnc1tdID0gewotCXsKLQkJLmFkZHIgICA9IHNhZGRyLAotCQkuZmxhZ3MgPSAwLAotCQkubGVuICAgPSAyLAotCQkuYnVmICAgPSByeGRhdGEsCi0JfSwKLQl7Ci0JCS5hZGRyICA9IHNhZGRyLAotCQkuZmxhZ3MgPSBJMkNfTV9SRCwKLQkJLmxlbiAgID0gbGVuZ3RoLAotCQkuYnVmICAgPSByeGRhdGEsCi0JfSwKLQl9OwotCi0JaWYgKGkyY190cmFuc2ZlcihtdDl0MDEzX2NsaWVudC0+YWRhcHRlciwgbXNncywgMikgPCAwKSB7Ci0JCXByX2VycigibXQ5dDAxM19pMmNfcnhkYXRhIGZhaWxlZCFcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5dDAxM19pMmNfcmVhZF93KHVuc2lnbmVkIHNob3J0IHNhZGRyLAotCXVuc2lnbmVkIHNob3J0IHJhZGRyLCB1bnNpZ25lZCBzaG9ydCAqcmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JdW5zaWduZWQgY2hhciBidWZbNF07Ci0KLQlpZiAoIXJkYXRhKQotCQlyZXR1cm4gLUVJTzsKLQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQotCWJ1ZlswXSA9IChyYWRkciAmIDB4RkYwMCk+Pjg7Ci0JYnVmWzFdID0gKHJhZGRyICYgMHgwMEZGKTsKLQotCXJjID0gbXQ5dDAxM19pMmNfcnhkYXRhKHNhZGRyLCBidWYsIDIpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCSpyZGF0YSA9IGJ1ZlswXSA8PCA4IHwgYnVmWzFdOwotCi0JaWYgKHJjIDwgMCkKLQkJcHJfZXJyKCJtdDl0MDEzX2kyY19yZWFkIGZhaWxlZCFcbiIpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDl0MDEzX2kyY190eGRhdGEodW5zaWduZWQgc2hvcnQgc2FkZHIsCi0JdW5zaWduZWQgY2hhciAqdHhkYXRhLCBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0gewotCXsKLQkJLmFkZHIgPSBzYWRkciwKLQkJLmZsYWdzID0gMCwKLQkJLmxlbiA9IGxlbmd0aCwKLQkJLmJ1ZiA9IHR4ZGF0YSwKLQl9LAotCX07Ci0KLQlpZiAoaTJjX3RyYW5zZmVyKG10OXQwMTNfY2xpZW50LT5hZGFwdGVyLCBtc2csIDEpIDwgMCkgewotCQlwcl9lcnIoIm10OXQwMTNfaTJjX3R4ZGF0YSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5dDAxM19pMmNfd3JpdGVfYih1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQl1bnNpZ25lZCBzaG9ydCB3YWRkciwgdW5zaWduZWQgc2hvcnQgd2RhdGEpCi17Ci0JaW50MzJfdCByYyA9IC1FSU87Ci0JdW5zaWduZWQgY2hhciBidWZbMl07Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gd2FkZHI7Ci0JYnVmWzFdID0gd2RhdGE7Ci0JcmMgPSBtdDl0MDEzX2kyY190eGRhdGEoc2FkZHIsIGJ1ZiwgMik7Ci0KLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoImkyY193cml0ZSBmYWlsZWQsIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4IVxuIiwKLQkJd2FkZHIsIHdkYXRhKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5dDAxM19pMmNfd3JpdGVfdyh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQl1bnNpZ25lZCBzaG9ydCB3YWRkciwgdW5zaWduZWQgc2hvcnQgd2RhdGEpCi17Ci0JaW50MzJfdCByYyA9IC1FSU87Ci0JdW5zaWduZWQgY2hhciBidWZbNF07Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gKHdhZGRyICYgMHhGRjAwKT4+ODsKLQlidWZbMV0gPSAod2FkZHIgJiAweDAwRkYpOwotCWJ1ZlsyXSA9ICh3ZGF0YSAmIDB4RkYwMCk+Pjg7Ci0JYnVmWzNdID0gKHdkYXRhICYgMHgwMEZGKTsKLQotCXJjID0gbXQ5dDAxM19pMmNfdHhkYXRhKHNhZGRyLCBidWYsIDQpOwotCi0JaWYgKHJjIDwgMCkKLQkJcHJfZXJyKCJpMmNfd3JpdGVfdyBmYWlsZWQsIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4IVxuIiwKLQkJd2FkZHIsIHdkYXRhKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5dDAxM19pMmNfd3JpdGVfd190YWJsZSgKLQlzdHJ1Y3QgbXQ5dDAxM19pMmNfcmVnX2NvbmYgY29uc3QgKnJlZ19jb25mX3RibCwKLQlpbnQgbnVtX29mX2l0ZW1zX2luX3RhYmxlKQotewotCWludCBpOwotCWludDMyX3QgcmMgPSAtRUlPOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9vZl9pdGVtc19pbl90YWJsZTsgaSsrKSB7Ci0JCXJjID0gbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCXJlZ19jb25mX3RibC0+d2FkZHIsIHJlZ19jb25mX3RibC0+d2RhdGEpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0JCXJlZ19jb25mX3RibCsrOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5dDAxM190ZXN0KGVudW0gbXQ5dDAxM190ZXN0X21vZGUgbW8pCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlyYyA9IG10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQlSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCUdST1VQRURfUEFSQU1FVEVSX0hPTEQpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCWlmIChtbyA9PSBURVNUX09GRikKLQkJcmV0dXJuIDA7Ci0JZWxzZSB7Ci0JCXJjID0gbXQ5dDAxM19pMmNfd3JpdGVfd190YWJsZShtdDl0MDEzX3JlZ3MudHRibCwKLQkJCQltdDl0MDEzX3JlZ3MudHRibF9zaXplKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQkJcmMgPSBtdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19URVNUX1BBVFRFUk5fTU9ERSwgKHVpbnQxNl90KW1vKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IG10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQlSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCUdST1VQRURfUEFSQU1FVEVSX1VQREFURSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDl0MDEzX3NldF9sYyh2b2lkKQotewotCWludDMyX3QgcmM7Ci0KLQlyYyA9IG10OXQwMTNfaTJjX3dyaXRlX3dfdGFibGUobXQ5dDAxM19yZWdzLmxjdGJsLAotCQltdDl0MDEzX3JlZ3MubGN0Ymxfc2l6ZSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDl0MDEzX3NldF9kZWZhdWx0X2ZvY3VzKHVpbnQ4X3QgYWZfc3RlcCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1aW50OF90IGNvZGVfdmFsX21zYiwgY29kZV92YWxfbHNiOwotCWNvZGVfdmFsX21zYiA9IDB4MDE7Ci0JY29kZV92YWxfbHNiID0gYWZfc3RlcDsKLQotCS8qIFdyaXRlIHRoZSBkaWdpdGFsIGNvZGUgZm9yIGN1cnJlbnQgdG8gdGhlIGFjdHVhdG9yICovCi0JcmMgPSBtdDl0MDEzX2kyY193cml0ZV9iKE1UOVQwMTNfQUZfSTJDX0FERFI+PjEsCi0JCQljb2RlX3ZhbF9tc2IsIGNvZGVfdmFsX2xzYik7Ci0KLQltdDl0MDEzX2N0cmwtPmN1cnJfbGVuc19wb3MgPSAwOwotCW10OXQwMTNfY3RybC0+aW5pdF9jdXJyX2xlbnNfcG9zID0gMDsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIG10OXQwMTNfZ2V0X3BpY3RfZnBzKHVpbnQxNl90IGZwcywgdWludDE2X3QgKnBmcHMpCi17Ci0JLyogaW5wdXQgZnBzIGlzIHByZXZpZXcgZnBzIGluIFE4IGZvcm1hdCAqLwotCXVpbnQzMl90IGRpdmlkZXI7ICAgLypRMTAgKi8KLQl1aW50MzJfdCBwY2xrX211bHQ7IC8qUTEwICovCi0JdWludDMyX3QgZDE7Ci0JdWludDMyX3QgZDI7Ci0KLQlkMSA9Ci0JCSh1aW50MzJfdCkoCi0JCShtdDl0MDEzX3JlZ3MucmVnX3BhdFtSRVNfUFJFVklFV10uZnJhbWVfbGVuZ3RoX2xpbmVzICoKLQkJMHgwMDAwMDQwMCkgLwotCQltdDl0MDEzX3JlZ3MucmVnX3BhdFtSRVNfQ0FQVFVSRV0uZnJhbWVfbGVuZ3RoX2xpbmVzKTsKLQotCWQyID0KLQkJKHVpbnQzMl90KSgKLQkJKG10OXQwMTNfcmVncy5yZWdfcGF0W1JFU19QUkVWSUVXXS5saW5lX2xlbmd0aF9wY2sgKgotCQkweDAwMDAwNDAwKSAvCi0JCW10OXQwMTNfcmVncy5yZWdfcGF0W1JFU19DQVBUVVJFXS5saW5lX2xlbmd0aF9wY2spOwotCi0JZGl2aWRlciA9ICh1aW50MzJfdCkgKGQxICogZDIpIC8gMHgwMDAwMDQwMDsKLQotCXBjbGtfbXVsdCA9Ci0JCSh1aW50MzJfdCkgKChtdDl0MDEzX3JlZ3MucmVnX3BhdFtSRVNfQ0FQVFVSRV0ucGxsX211bHRpcGxpZXIgKgotCQkweDAwMDAwNDAwKSAvCi0JCShtdDl0MDEzX3JlZ3MucmVnX3BhdFtSRVNfUFJFVklFV10ucGxsX211bHRpcGxpZXIpKTsKLQotCi0JLyogVmVyaWZ5IFBDTEsgc2V0dGluZ3MgYW5kIGZyYW1lIHNpemVzLiAqLwotCSpwZnBzID0KLQkJKHVpbnQxNl90KSAoZnBzICogZGl2aWRlciAqIHBjbGtfbXVsdCAvCi0JCTB4MDAwMDA0MDAgLyAweDAwMDAwNDAwKTsKLX0KLQotc3RhdGljIHVpbnQxNl90IG10OXQwMTNfZ2V0X3ByZXZfbGluZXNfcGYodm9pZCkKLXsKLQlpZiAobXQ5dDAxM19jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkKLQkJcmV0dXJuIG10OXQwMTNfcmVncy5yZWdfcGF0W1JFU19QUkVWSUVXXS5mcmFtZV9sZW5ndGhfbGluZXM7Ci0JZWxzZQotCQlyZXR1cm4gbXQ5dDAxM19yZWdzLnJlZ19wYXRbUkVTX0NBUFRVUkVdLmZyYW1lX2xlbmd0aF9saW5lczsKLX0KLQotc3RhdGljIHVpbnQxNl90IG10OXQwMTNfZ2V0X3ByZXZfcGl4ZWxzX3BsKHZvaWQpCi17Ci0JaWYgKG10OXQwMTNfY3RybC0+cHJldl9yZXMgPT0gUVRSX1NJWkUpCi0JCXJldHVybiBtdDl0MDEzX3JlZ3MucmVnX3BhdFtSRVNfUFJFVklFV10ubGluZV9sZW5ndGhfcGNrOwotCWVsc2UKLQkJcmV0dXJuIG10OXQwMTNfcmVncy5yZWdfcGF0W1JFU19DQVBUVVJFXS5saW5lX2xlbmd0aF9wY2s7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBtdDl0MDEzX2dldF9waWN0X2xpbmVzX3BmKHZvaWQpCi17Ci0JcmV0dXJuIG10OXQwMTNfcmVncy5yZWdfcGF0W1JFU19DQVBUVVJFXS5mcmFtZV9sZW5ndGhfbGluZXM7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBtdDl0MDEzX2dldF9waWN0X3BpeGVsc19wbCh2b2lkKQotewotCXJldHVybiBtdDl0MDEzX3JlZ3MucmVnX3BhdFtSRVNfQ0FQVFVSRV0ubGluZV9sZW5ndGhfcGNrOwotfQotCi1zdGF0aWMgdWludDMyX3QgbXQ5dDAxM19nZXRfcGljdF9tYXhfZXhwX2xjKHZvaWQpCi17Ci0JdWludDE2X3Qgc25hcHNob3RfbGluZXNfcGVyX2ZyYW1lOwotCi0JaWYgKG10OXQwMTNfY3RybC0+cGljdF9yZXMgPT0gUVRSX1NJWkUpIHsKLQkJc25hcHNob3RfbGluZXNfcGVyX2ZyYW1lID0KLQkJbXQ5dDAxM19yZWdzLnJlZ19wYXRbUkVTX1BSRVZJRVddLmZyYW1lX2xlbmd0aF9saW5lcyAtIDE7Ci0JfSBlbHNlICB7Ci0JCXNuYXBzaG90X2xpbmVzX3Blcl9mcmFtZSA9Ci0JCW10OXQwMTNfcmVncy5yZWdfcGF0W1JFU19DQVBUVVJFXS5mcmFtZV9sZW5ndGhfbGluZXMgLSAxOwotCX0KLQotCXJldHVybiBzbmFwc2hvdF9saW5lc19wZXJfZnJhbWUgKiAyNDsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5dDAxM19zZXRfZnBzKHN0cnVjdCBmcHNfY2ZnICpmcHMpCi17Ci0JLyogaW5wdXQgaXMgbmV3IGZwcyBpbiBROCBmb3JtYXQgKi8KLQlpbnQzMl90IHJjID0gMDsKLQllbnVtIG10OXQwMTNfc2V0dGluZyBzZXR0aW5nOwotCi0JbXQ5dDAxM19jdHJsLT5mcHNfZGl2aWRlciA9IGZwcy0+ZnBzX2RpdjsKLQltdDl0MDEzX2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIgPSBmcHMtPnBpY3RfZnBzX2RpdjsKLQotCXJjID0gbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCVJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJR1JPVVBFRF9QQVJBTUVURVJfSE9MRCk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCUNEQkcoIm10OXQwMTNfc2V0X2ZwczogZnBzX2RpdiBpcyAlZCwgZl9tdWx0IGlzICVkXG4iLAotCQkJZnBzLT5mcHNfZGl2LCBmcHMtPmZfbXVsdCk7Ci0KLQlpZiAobXQ5dDAxM19jdHJsLT5zZW5zb3Jtb2RlID09IFNFTlNPUl9QUkVWSUVXX01PREUpCi0JCXNldHRpbmcgPSBSRVNfUFJFVklFVzsKLQllbHNlCi0JCXNldHRpbmcgPSBSRVNfQ0FQVFVSRTsKLQlyYyA9IG10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQlSRUdfRlJBTUVfTEVOR1RIX0xJTkVTLAotCQkJKHVpbnQxNl90KSAoCi0JCQltdDl0MDEzX3JlZ3MucmVnX3BhdFtzZXR0aW5nXS5mcmFtZV9sZW5ndGhfbGluZXMgKgotCQkJZnBzLT5mcHNfZGl2IC8gMHgwMDAwMDQwMCkpOwotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBtdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQlHUk9VUEVEX1BBUkFNRVRFUl9VUERBVEUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5dDAxM193cml0ZV9leHBfZ2Fpbih1aW50MTZfdCBnYWluLCB1aW50MzJfdCBsaW5lKQotewotCXVpbnQxNl90IG1heF9sZWdhbF9nYWluID0gMHgwMUZGOwotCWludDMyX3QgcmMgPSAwOwotCi0JaWYgKG10OXQwMTNfY3RybC0+c2Vuc29ybW9kZSA9PSBTRU5TT1JfUFJFVklFV19NT0RFKSB7Ci0JCW10OXQwMTNfY3RybC0+bXlfcmVnX2dhaW4gPSBnYWluOwotCQltdDl0MDEzX2N0cmwtPm15X3JlZ19saW5lX2NvdW50ID0gKHVpbnQxNl90KSBsaW5lOwotCX0KLQotCWlmIChnYWluID4gbWF4X2xlZ2FsX2dhaW4pCi0JCWdhaW4gPSBtYXhfbGVnYWxfZ2FpbjsKLQotCWlmIChtdDl0MDEzX2N0cmwtPnNlbnNvcm1vZGUgIT0gU0VOU09SX1NOQVBTSE9UX01PREUpCi0JCWxpbmUgPSAodWludDMyX3QpIChsaW5lICogbXQ5dDAxM19jdHJsLT5mcHNfZGl2aWRlciAvCi0JCQkJICAgMHgwMDAwMDQwMCk7Ci0JZWxzZQotCQlsaW5lID0gKHVpbnQzMl90KSAobGluZSAqIG10OXQwMTNfY3RybC0+cGljdF9mcHNfZGl2aWRlciAvCi0JCQkJICAgMHgwMDAwMDQwMCk7Ci0KLQkvKlNldCBkaWdpdGFsIGdhaW4gdG8gMSAqLwotCWdhaW4gfD0gMHgwMjAwOwotCi0JLyogVGhlcmUgdXNlZCB0byBiZSBQQVJBTUVURVJfSE9MRCByZWdpc3RlciB3cml0ZSBiZWZvcmUgYW5kCi0JICogYWZ0ZXIgUkVHX0dMT0JBTF9HQUlOICYgUkVHX0NPQVJTRV9JTklUX1RJTUUuIFRoaXMgY2F1c2VzCi0JICogYWVjIG9zY2lsbGF0aW9uLiBIZW5jZSByZW1vdmVkLiAqLwotCi0JcmMgPSBtdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLCBSRUdfR0xPQkFMX0dBSU4sIGdhaW4pOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCVJFR19DT0FSU0VfSU5UX1RJTUUsIGxpbmUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5dDAxM19zZXRfcGljdF9leHBfZ2Fpbih1aW50MTZfdCBnYWluLCB1aW50MzJfdCBsaW5lKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JcmMgPSBtdDl0MDEzX3dyaXRlX2V4cF9nYWluKGdhaW4sIGxpbmUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCU1UOVQwMTNfUkVHX1JFU0VUX1JFR0lTVEVSLAotCQkJMHgxMENDIHwgMHgwMDAyKTsKLQotCW1kZWxheSg1KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5dDAxM19zZXR0aW5nKGVudW0gbXQ5dDAxM19yZWdfdXBkYXRlIHJ1cGRhdGUsCi0JZW51bSBtdDl0MDEzX3NldHRpbmcgcnQpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlzd2l0Y2ggKHJ1cGRhdGUpIHsKLQljYXNlIFVQREFURV9QRVJJT0RJQzogewotCi0JaWYgKHJ0ID09IFJFU19QUkVWSUVXIHx8IHJ0ID09IFJFU19DQVBUVVJFKSB7Ci0jaWYgMAotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCU1UOVQwMTNfUkVHX1JFU0VUX1JFR0lTVEVSLAotCQkJCU1UOVQwMTNfUkVTRVRfUkVHSVNURVJfUFdPRkYpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotI2VuZGlmCi0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQlSRUdfVlRfUElYX0NMS19ESVYsCi0JCQkJbXQ5dDAxM19yZWdzLnJlZ19wYXRbcnRdLnZ0X3BpeF9jbGtfZGl2KTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19WVF9TWVNfQ0xLX0RJViwKLQkJCQltdDl0MDEzX3JlZ3MucmVnX3BhdFtydF0udnRfc3lzX2Nsa19kaXYpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0KLQkJCW10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQkJUkVHX1BSRV9QTExfQ0xLX0RJViwKLQkJCQltdDl0MDEzX3JlZ3MucmVnX3BhdFtydF0ucHJlX3BsbF9jbGtfZGl2KTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19QTExfTVVMVElQTElFUiwKLQkJCQltdDl0MDEzX3JlZ3MucmVnX3BhdFtydF0ucGxsX211bHRpcGxpZXIpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0KLQkJCW10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQkJUkVHX09QX1BJWF9DTEtfRElWLAotCQkJCW10OXQwMTNfcmVncy5yZWdfcGF0W3J0XS5vcF9waXhfY2xrX2Rpdik7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQlSRUdfT1BfU1lTX0NMS19ESVYsCi0JCQkJbXQ5dDAxM19yZWdzLnJlZ19wYXRbcnRdLm9wX3N5c19jbGtfZGl2KTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQltZGVsYXkoNSk7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQlSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQlHUk9VUEVEX1BBUkFNRVRFUl9IT0xEKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19ST1dfU1BFRUQsCi0JCQkJbXQ5dDAxM19yZWdzLnJlZ19wYXRbcnRdLnJvd19zcGVlZCk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQlSRUdfWF9BRERSX1NUQVJULAotCQkJCW10OXQwMTNfcmVncy5yZWdfcGF0W3J0XS54X2FkZHJfc3RhcnQpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0KLQkJCW10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQkJUkVHX1hfQUREUl9FTkQsCi0JCQkJbXQ5dDAxM19yZWdzLnJlZ19wYXRbcnRdLnhfYWRkcl9lbmQpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0KLQkJCW10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQkJUkVHX1lfQUREUl9TVEFSVCwKLQkJCQltdDl0MDEzX3JlZ3MucmVnX3BhdFtydF0ueV9hZGRyX3N0YXJ0KTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19ZX0FERFJfRU5ELAotCQkJCW10OXQwMTNfcmVncy5yZWdfcGF0W3J0XS55X2FkZHJfZW5kKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlpZiAobWFjaGluZV9pc19zYXBwaGlyZSgpKSB7Ci0JCQlpZiAocnQgPT0gMCkKLQkJCQlyYyA9IG10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQkJCVJFR19SRUFEX01PREUsCi0JCQkJCTB4MDQ2Rik7Ci0JCQllbHNlCi0JCQkJcmMgPSBtdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCQlSRUdfUkVBRF9NT0RFLAotCQkJCQkweDAwMjcpOwotCQl9IGVsc2UKLQkJCXJjID0gbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQkJUkVHX1JFQURfTU9ERSwKLQkJCQkJbXQ5dDAxM19yZWdzLnJlZ19wYXRbcnRdLnJlYWRfbW9kZSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQlSRUdfU0NBTEVfTSwKLQkJCQltdDl0MDEzX3JlZ3MucmVnX3BhdFtydF0uc2NhbGVfbSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19YX09VVFBVVF9TSVpFLAotCQkJCW10OXQwMTNfcmVncy5yZWdfcGF0W3J0XS54X291dHB1dF9zaXplKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19ZX09VVFBVVF9TSVpFLAotCQkJCW10OXQwMTNfcmVncy5yZWdfcGF0W3J0XS55X291dHB1dF9zaXplKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19MSU5FX0xFTkdUSF9QQ0ssCi0JCQkJbXQ5dDAxM19yZWdzLnJlZ19wYXRbcnRdLmxpbmVfbGVuZ3RoX3Bjayk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCVJFR19GUkFNRV9MRU5HVEhfTElORVMsCi0JCQkobXQ5dDAxM19yZWdzLnJlZ19wYXRbcnRdLmZyYW1lX2xlbmd0aF9saW5lcyAqCi0JCQltdDl0MDEzX2N0cmwtPmZwc19kaXZpZGVyIC8gMHgwMDAwMDQwMCkpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0KLQkJCW10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQlSRUdfQ09BUlNFX0lOVF9USU1FLAotCQkJbXQ5dDAxM19yZWdzLnJlZ19wYXRbcnRdLmNvYXJzZV9pbnRfdGltZSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCVJFR19GSU5FX0lOVF9USU1FLAotCQkJbXQ5dDAxM19yZWdzLnJlZ19wYXRbcnRdLmZpbmVfaW50X3RpbWUpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0KLQkJCW10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQlSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCUdST1VQRURfUEFSQU1FVEVSX1VQREFURSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPSBtdDl0MDEzX3Rlc3QobXQ5dDAxM19jdHJsLT5zZXRfdGVzdCk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCU1UOVQwMTNfUkVHX1JFU0VUX1JFR0lTVEVSLAotCQkJTVQ5VDAxM19SRVNFVF9SRUdJU1RFUl9QV09OfAotCQkJTVQ5VDAxM19SRVNFVF9GQVNUX1RSQU5TSVRJT04pOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCW1kZWxheSg1KTsKLQotCQlyZXR1cm4gcmM7Ci0JfQotCX0KLQkJYnJlYWs7Ci0KLQkvKkNBTVNFTlNPUl9SRUdfVVBEQVRFX1BFUklPRElDICovCi0JY2FzZSBSRUdfSU5JVDogewotCWlmIChydCA9PSBSRVNfUFJFVklFVyB8fCBydCA9PSBSRVNfQ0FQVFVSRSkgewotCi0JCXJjID0KLQkJCW10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQkJTVQ5VDAxM19SRUdfUkVTRVRfUkVHSVNURVIsCi0JCQkJTVQ5VDAxM19SRVNFVF9SRUdJU1RFUl9QV09GRik7Ci0JCWlmIChyYyA8IDApCi0JCQkvKiBNT0RFX1NFTEVDVCwgc3RvcCBzdHJlYW1pbmcgKi8KLQkJCXJldHVybiByYzsKLQotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19WVF9QSVhfQ0xLX0RJViwKLQkJCQltdDl0MDEzX3JlZ3MucmVnX3BhdFtydF0udnRfcGl4X2Nsa19kaXYpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0KLQkJCW10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQkJUkVHX1ZUX1NZU19DTEtfRElWLAotCQkJCW10OXQwMTNfcmVncy5yZWdfcGF0W3J0XS52dF9zeXNfY2xrX2Rpdik7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQlSRUdfUFJFX1BMTF9DTEtfRElWLAotCQkJCW10OXQwMTNfcmVncy5yZWdfcGF0W3J0XS5wcmVfcGxsX2Nsa19kaXYpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0KLQkJCW10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQkJUkVHX1BMTF9NVUxUSVBMSUVSLAotCQkJCW10OXQwMTNfcmVncy5yZWdfcGF0W3J0XS5wbGxfbXVsdGlwbGllcik7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQlSRUdfT1BfUElYX0NMS19ESVYsCi0JCQkJbXQ5dDAxM19yZWdzLnJlZ19wYXRbcnRdLm9wX3BpeF9jbGtfZGl2KTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19PUF9TWVNfQ0xLX0RJViwKLQkJCQltdDl0MDEzX3JlZ3MucmVnX3BhdFtydF0ub3Bfc3lzX2Nsa19kaXYpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCW1kZWxheSg1KTsKLQotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCUdST1VQRURfUEFSQU1FVEVSX0hPTEQpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCS8qIGFkZGl0aW9uYWwgcG93ZXIgc2F2aW5nIG1vZGUgb2sgYXJvdW5kIDM4LjJNSHogKi8KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQkweDMwODQsIDB4MjQwOSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQkweDMwOTIsIDB4MEE0OSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQkweDMwOTQsIDB4NDk0OSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQkweDMwOTYsIDB4NDk0OSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJLyogU2V0IHByZXZpZXcgb3Igc25hcHNob3QgbW9kZSAqLwotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19ST1dfU1BFRUQsCi0JCQkJbXQ5dDAxM19yZWdzLnJlZ19wYXRbcnRdLnJvd19zcGVlZCk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQlSRUdfWF9BRERSX1NUQVJULAotCQkJCW10OXQwMTNfcmVncy5yZWdfcGF0W3J0XS54X2FkZHJfc3RhcnQpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0KLQkJCW10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQkJUkVHX1hfQUREUl9FTkQsCi0JCQkJbXQ5dDAxM19yZWdzLnJlZ19wYXRbcnRdLnhfYWRkcl9lbmQpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0KLQkJCW10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQkJUkVHX1lfQUREUl9TVEFSVCwKLQkJCQltdDl0MDEzX3JlZ3MucmVnX3BhdFtydF0ueV9hZGRyX3N0YXJ0KTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19ZX0FERFJfRU5ELAotCQkJCW10OXQwMTNfcmVncy5yZWdfcGF0W3J0XS55X2FkZHJfZW5kKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlpZiAobWFjaGluZV9pc19zYXBwaGlyZSgpKSB7Ci0JCQlpZiAocnQgPT0gMCkKLQkJCQlyYyA9IG10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQkJCVJFR19SRUFEX01PREUsCi0JCQkJCTB4MDQ2Rik7Ci0JCQllbHNlCi0JCQkJcmMgPSBtdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCQlSRUdfUkVBRF9NT0RFLAotCQkJCQkweDAwMjcpOwotCQl9IGVsc2UKLQkJCXJjID0gbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQkJUkVHX1JFQURfTU9ERSwKLQkJCQkJbXQ5dDAxM19yZWdzLnJlZ19wYXRbcnRdLnJlYWRfbW9kZSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQlSRUdfU0NBTEVfTSwKLQkJCQltdDl0MDEzX3JlZ3MucmVnX3BhdFtydF0uc2NhbGVfbSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQlSRUdfWF9PVVRQVVRfU0laRSwKLQkJCQltdDl0MDEzX3JlZ3MucmVnX3BhdFtydF0ueF9vdXRwdXRfc2l6ZSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQlSRUdfWV9PVVRQVVRfU0laRSwKLQkJCQltdDl0MDEzX3JlZ3MucmVnX3BhdFtydF0ueV9vdXRwdXRfc2l6ZSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gMDsKLQotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19MSU5FX0xFTkdUSF9QQ0ssCi0JCQkJbXQ5dDAxM19yZWdzLnJlZ19wYXRbcnRdLmxpbmVfbGVuZ3RoX3Bjayk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQlSRUdfRlJBTUVfTEVOR1RIX0xJTkVTLAotCQkJCW10OXQwMTNfcmVncy5yZWdfcGF0W3J0XS5mcmFtZV9sZW5ndGhfbGluZXMpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0KLQkJCW10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQkJUkVHX0NPQVJTRV9JTlRfVElNRSwKLQkJCQltdDl0MDEzX3JlZ3MucmVnX3BhdFtydF0uY29hcnNlX2ludF90aW1lKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19GSU5FX0lOVF9USU1FLAotCQkJCW10OXQwMTNfcmVncy5yZWdfcGF0W3J0XS5maW5lX2ludF90aW1lKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCUdST1VQRURfUEFSQU1FVEVSX1VQREFURSk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkvKiBsb2FkIGxlbnMgc2hhZGluZyAqLwotCQlyYyA9Ci0JCQltdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJCVJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCUdST1VQRURfUEFSQU1FVEVSX0hPTEQpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCS8qIG1vc3QgbGlrZWx5IG5lZWRzIHRvIGJlIHdyaXR0ZW4gb25seSBvbmNlLiAqLwotCQlyYyA9IG10OXQwMTNfc2V0X2xjKCk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gLUVCVVNZOwotCi0JCXJjID0KLQkJCW10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQkJUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJR1JPVVBFRF9QQVJBTUVURVJfVVBEQVRFKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlyYyA9IG10OXQwMTNfdGVzdChtdDl0MDEzX2N0cmwtPnNldF90ZXN0KTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQltZGVsYXkoNSk7Ci0KLQkJcmMgPQotCQkJbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQlNVDlUMDEzX1JFR19SRVNFVF9SRUdJU1RFUiwKLQkJCQlNVDlUMDEzX1JFU0VUX1JFR0lTVEVSX1BXT04pOwotCQlpZiAocmMgPCAwKQotCQkJLyogTU9ERV9TRUxFQ1QsIHN0b3Agc3RyZWFtaW5nICovCi0JCQlyZXR1cm4gcmM7Ci0KLQkJQ0RCRygiISEhIG10OXQwMTMgISEhIFBvd2VyT24gaXMgZG9uZSFcbiIpOwotCQltZGVsYXkoNSk7Ci0JCXJldHVybiByYzsKLQkJfQotCX0gLyogY2FzZSBDQU1TRU5TT1JfUkVHX0lOSVQ6ICovCi0JYnJlYWs7Ci0KLQkvKkNBTVNFTlNPUl9SRUdfSU5JVCAqLwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfSAvKiBzd2l0Y2ggKHJ1cGRhdGUpICovCi0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OXQwMTNfdmlkZW9fY29uZmlnKGludCBtb2RlLCBpbnQgcmVzKQotewotCWludDMyX3QgcmM7Ci0KLQlzd2l0Y2ggKHJlcykgewotCWNhc2UgUVRSX1NJWkU6Ci0JCXJjID0gbXQ5dDAxM19zZXR0aW5nKFVQREFURV9QRVJJT0RJQywgUkVTX1BSRVZJRVcpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQlDREJHKCJzZW5zb3IgY29uZmlndXJhdGlvbiBkb25lIVxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBGVUxMX1NJWkU6Ci0JCXJjID0gbXQ5dDAxM19zZXR0aW5nKFVQREFURV9QRVJJT0RJQywgUkVTX0NBUFRVUkUpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0gLyogc3dpdGNoICovCi0KLQltdDl0MDEzX2N0cmwtPnByZXZfcmVzID0gcmVzOwotCW10OXQwMTNfY3RybC0+Y3Vycl9yZXMgPSByZXM7Ci0JbXQ5dDAxM19jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQotCXJjID0gbXQ5dDAxM193cml0ZV9leHBfZ2FpbihtdDl0MDEzX2N0cmwtPm15X3JlZ19nYWluLAotCQkJbXQ5dDAxM19jdHJsLT5teV9yZWdfbGluZV9jb3VudCk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBtdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQlNVDlUMDEzX1JFR19SRVNFVF9SRUdJU1RFUiwKLQkJTVQ5VDAxM19SRVNFVF9SRUdJU1RFUl9QV09OfE1UOVQwMTNfUkVTRVRfRkFTVF9UUkFOU0lUSU9OKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQltc2xlZXAoNSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDl0MDEzX3NuYXBzaG90X2NvbmZpZyhpbnQgbW9kZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCXJjID0gbXQ5dDAxM19zZXR0aW5nKFVQREFURV9QRVJJT0RJQywgUkVTX0NBUFRVUkUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCW10OXQwMTNfY3RybC0+Y3Vycl9yZXMgPSBtdDl0MDEzX2N0cmwtPnBpY3RfcmVzOwotCW10OXQwMTNfY3RybC0+c2Vuc29ybW9kZSA9IG1vZGU7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDl0MDEzX3Jhd19zbmFwc2hvdF9jb25maWcoaW50IG1vZGUpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlyYyA9IG10OXQwMTNfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsIFJFU19DQVBUVVJFKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQltdDl0MDEzX2N0cmwtPmN1cnJfcmVzID0gbXQ5dDAxM19jdHJsLT5waWN0X3JlczsKLQltdDl0MDEzX2N0cmwtPnNlbnNvcm1vZGUgPSBtb2RlOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5dDAxM19wb3dlcl9kb3duKHZvaWQpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlyYyA9IG10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCQlNVDlUMDEzX1JFR19SRVNFVF9SRUdJU1RFUiwKLQkJCU1UOVQwMTNfUkVTRVRfUkVHSVNURVJfUFdPRkYpOwotCWlmIChyYyA+PSAwKQotCQltZGVsYXkoNSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtdDl0MDEzX21vdmVfZm9jdXMoaW50IGRpcmVjdGlvbiwgaW50MzJfdCBudW1fc3RlcHMpCi17Ci0JaW50MTZfdCBzdGVwX2RpcmVjdGlvbjsKLQlpbnQxNl90IGFjdHVhbF9zdGVwOwotCWludDE2X3QgbmV4dF9wb3NpdGlvbjsKLQlpbnQxNl90IGJyZWFrX3N0ZXBzWzRdOwotCXVpbnQ4X3QgY29kZV92YWxfbXNiLCBjb2RlX3ZhbF9sc2I7Ci0JaW50MTZfdCBpOwotCi0JaWYgKG51bV9zdGVwcyA+IE1UOVQwMTNfVE9UQUxfU1RFUFNfTkVBUl9UT19GQVIpCi0JCW51bV9zdGVwcyA9IE1UOVQwMTNfVE9UQUxfU1RFUFNfTkVBUl9UT19GQVI7Ci0JZWxzZSBpZiAobnVtX3N0ZXBzID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGRpcmVjdGlvbiA9PSBNT1ZFX05FQVIpCi0JCXN0ZXBfZGlyZWN0aW9uID0gNDsKLQllbHNlIGlmIChkaXJlY3Rpb24gPT0gTU9WRV9GQVIpCi0JCXN0ZXBfZGlyZWN0aW9uID0gLTQ7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChtdDl0MDEzX2N0cmwtPmN1cnJfbGVuc19wb3MgPCBtdDl0MDEzX2N0cmwtPmluaXRfY3Vycl9sZW5zX3BvcykKLQkJbXQ5dDAxM19jdHJsLT5jdXJyX2xlbnNfcG9zID0gbXQ5dDAxM19jdHJsLT5pbml0X2N1cnJfbGVuc19wb3M7Ci0KLQlhY3R1YWxfc3RlcCA9Ci0JCShpbnQxNl90KSAoc3RlcF9kaXJlY3Rpb24gKgotCQkoaW50MTZfdCkgbnVtX3N0ZXBzKTsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCWJyZWFrX3N0ZXBzW2ldID0KLQkJCWFjdHVhbF9zdGVwIC8gNCAqIChpICsgMSkgLSBhY3R1YWxfc3RlcCAvIDQgKiBpOwotCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQluZXh0X3Bvc2l0aW9uID0KLQkJKGludDE2X3QpCi0JCShtdDl0MDEzX2N0cmwtPmN1cnJfbGVuc19wb3MgKyBicmVha19zdGVwc1tpXSk7Ci0KLQkJaWYgKG5leHRfcG9zaXRpb24gPiAyNTUpCi0JCQluZXh0X3Bvc2l0aW9uID0gMjU1OwotCQllbHNlIGlmIChuZXh0X3Bvc2l0aW9uIDwgMCkKLQkJCW5leHRfcG9zaXRpb24gPSAwOwotCi0JCWNvZGVfdmFsX21zYiA9Ci0JCSgobmV4dF9wb3NpdGlvbiA+PiA0KSA8PCAyKSB8Ci0JCSgobmV4dF9wb3NpdGlvbiA8PCA0KSA+PiA2KTsKLQotCQljb2RlX3ZhbF9sc2IgPQotCQkoKG5leHRfcG9zaXRpb24gJiAweDAzKSA8PCA2KTsKLQotCQkvKiBXcml0aW5nIHRoZSBkaWdpdGFsIGNvZGUgZm9yIGN1cnJlbnQgdG8gdGhlIGFjdHVhdG9yICovCi0JCWlmIChtdDl0MDEzX2kyY193cml0ZV9iKE1UOVQwMTNfQUZfSTJDX0FERFI+PjEsCi0JCQkJY29kZV92YWxfbXNiLCBjb2RlX3ZhbF9sc2IpIDwgMCkKLQkJCXJldHVybiAtRUJVU1k7Ci0KLQkJLyogU3RvcmluZyB0aGUgY3VycmVudCBsZW5zIFBvc2l0aW9uICovCi0JCW10OXQwMTNfY3RybC0+Y3Vycl9sZW5zX3BvcyA9IG5leHRfcG9zaXRpb247Ci0KLQkJaWYgKGkgPCAzKQotCQkJbWRlbGF5KDEpOwotCX0gLyogZm9yICovCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtdDl0MDEzX3NlbnNvcl9pbml0X2RvbmUoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JZ3Bpb19mcmVlKGRhdGEtPnNlbnNvcl9yZXNldCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXQ5dDAxM19wcm9iZV9pbml0X3NlbnNvcihjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlpbnQgcmM7Ci0JdWludDE2X3QgY2hpcGlkOwotCi0JcmMgPSBncGlvX3JlcXVlc3QoZGF0YS0+c2Vuc29yX3Jlc2V0LCAibXQ5dDAxMyIpOwotCWlmICghcmMpCi0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5zZW5zb3JfcmVzZXQsIDEpOwotCWVsc2UKLQkJZ290byBpbml0X3Byb2JlX2RvbmU7Ci0KLQltZGVsYXkoMjApOwotCi0JLyogUkVTRVQgdGhlIHNlbnNvciBpbWFnZSBwYXJ0IHZpYSBJMkMgY29tbWFuZCAqLwotCXJjID0gbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJTVQ5VDAxM19SRUdfUkVTRVRfUkVHSVNURVIsIDB4MTAwOSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0KLQltc2xlZXAoMTApOwotCi0JLyogMy4gUmVhZCBzZW5zb3IgTW9kZWwgSUQ6ICovCi0JcmMgPSBtdDl0MDEzX2kyY19yZWFkX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCU1UOVQwMTNfUkVHX01PREVMX0lELCAmY2hpcGlkKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCi0JQ0RCRygibXQ5dDAxMyBtb2RlbF9pZCA9IDB4JXhcbiIsIGNoaXBpZCk7Ci0KLQkvKiA0LiBDb21wYXJlIHNlbnNvciBJRCB0byBNVDlUMDEyVkMgSUQ6ICovCi0JaWYgKGNoaXBpZCAhPSBNVDlUMDEzX01PREVMX0lEKSB7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCi0JcmMgPSBtdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkweDMwNjQsIDB4MDgwNSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0KLQltZGVsYXkoTVQ5VDAxM19SRVNFVF9ERUxBWV9NU0VDUyk7Ci0KLQlnb3RvIGluaXRfcHJvYmVfZG9uZTsKLQotCS8qIHNlbnNvcjogb3V0cHV0IGVuYWJsZSAqLwotI2lmIDAKLQlyYyA9IG10OXQwMTNfaTJjX3dyaXRlX3cobXQ5dDAxM19jbGllbnQtPmFkZHIsCi0JCU1UOVQwMTNfUkVHX1JFU0VUX1JFR0lTVEVSLAotCQlNVDlUMDEzX1JFU0VUX1JFR0lTVEVSX1BXT04pOwotCi0JLyogaWYgdGhpcyBmYWlscywgdGhlIHNlbnNvciBpcyBub3QgdGhlIE1UOVQwMTMgKi8KLQlyYyA9IG10OXQwMTNfc2V0X2RlZmF1bHRfZm9jdXMoMCk7Ci0jZW5kaWYKLQotaW5pdF9wcm9iZV9mYWlsOgotCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCWdwaW9fZnJlZShkYXRhLT5zZW5zb3JfcmVzZXQpOwotaW5pdF9wcm9iZV9kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXQ5dDAxM19wb3dlcm9uX2FmKHZvaWQpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQkvKiBlbmFibGUgQUYgYWN0dWF0b3IgKi8KLQlDREJHKCJlbmFibGUgQUYgYWN0dWF0b3IsIGdwaW8gPSAlZFxuIiwKLQkJCW10OXQwMTNfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCk7Ci0JcmMgPSBncGlvX3JlcXVlc3QobXQ5dDAxM19jdHJsLT5zZW5zb3JkYXRhLT52Y21fcHdkLCAibXQ5dDAxMyIpOwotCWlmICghcmMpIHsKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG10OXQwMTNfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCwgMCk7Ci0JCW1kZWxheSgyMCk7Ci0JCXJjID0gbXQ5dDAxM19zZXRfZGVmYXVsdF9mb2N1cygwKTsKLQl9IGVsc2UKLQkJcHJfZXJyKCIlcywgZ3Bpb19yZXF1ZXN0IGZhaWxlZCAoJWQpIVxuIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIG10OXQwMTNfcG93ZXJvZmZfYWYodm9pZCkKLXsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQobXQ5dDAxM19jdHJsLT5zZW5zb3JkYXRhLT52Y21fcHdkLCAxKTsKLQlncGlvX2ZyZWUobXQ5dDAxM19jdHJsLT5zZW5zb3JkYXRhLT52Y21fcHdkKTsKLX0KLQotaW50IG10OXQwMTNfc2Vuc29yX29wZW5faW5pdChjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlpbnQzMl90ICByYzsKLQotCW10OXQwMTNfY3RybCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtdDl0MDEzX2N0cmwpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW10OXQwMTNfY3RybCkgewotCQlwcl9lcnIoIm10OXQwMTNfaW5pdCBmYWlsZWQhXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGluaXRfZG9uZTsKLQl9Ci0KLQltdDl0MDEzX2N0cmwtPmZwc19kaXZpZGVyID0gMSAqIDB4MDAwMDA0MDA7Ci0JbXQ5dDAxM19jdHJsLT5waWN0X2Zwc19kaXZpZGVyID0gMSAqIDB4MDAwMDA0MDA7Ci0JbXQ5dDAxM19jdHJsLT5zZXRfdGVzdCA9IFRFU1RfT0ZGOwotCW10OXQwMTNfY3RybC0+cHJldl9yZXMgPSBRVFJfU0laRTsKLQltdDl0MDEzX2N0cmwtPnBpY3RfcmVzID0gRlVMTF9TSVpFOwotCi0JaWYgKGRhdGEpCi0JCW10OXQwMTNfY3RybC0+c2Vuc29yZGF0YSA9IGRhdGE7Ci0KLQkvKiBlbmFibGUgbWNsayBmaXJzdCAqLwotCW1zbV9jYW1pb19jbGtfcmF0ZV9zZXQoTVQ5VDAxM19ERUZBVUxUX0NMT0NLX1JBVEUpOwotCW1kZWxheSgyMCk7Ci0KLQltc21fY2FtaW9fY2FtaWZfcGFkX3JlZ19yZXNldCgpOwotCW1kZWxheSgyMCk7Ci0KLQlyYyA9IG10OXQwMTNfcHJvYmVfaW5pdF9zZW5zb3IoZGF0YSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X2ZhaWw7Ci0KLQlpZiAobXQ5dDAxM19jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkKLQkJcmMgPSBtdDl0MDEzX3NldHRpbmcoUkVHX0lOSVQsIFJFU19QUkVWSUVXKTsKLQllbHNlCi0JCXJjID0gbXQ5dDAxM19zZXR0aW5nKFJFR19JTklULCBSRVNfQ0FQVFVSRSk7Ci0KLQlpZiAocmMgPj0gMCkKLQkJaWYgKG1hY2hpbmVfaXNfc2FwcGhpcmUoKSkKLQkJCXJjID0gbXQ5dDAxM19wb3dlcm9uX2FmKCk7Ci0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGluaXRfZmFpbDsKLQllbHNlCi0JCWdvdG8gaW5pdF9kb25lOwotCi1pbml0X2ZhaWw6Ci0Ja2ZyZWUobXQ5dDAxM19jdHJsKTsKLWluaXRfZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXQ5dDAxM19pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCS8qIEluaXRpYWxpemUgdGhlIE1TTV9DQU1JMkMgQ2hpcCAqLwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm10OXQwMTNfd2FpdF9xdWV1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludDMyX3QgbXQ5dDAxM19zZXRfc2Vuc29yX21vZGUoaW50IG1vZGUsIGludCByZXMpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JcmMgPSBtdDl0MDEzX2kyY193cml0ZV93KG10OXQwMTNfY2xpZW50LT5hZGRyLAotCQkJUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQlHUk9VUEVEX1BBUkFNRVRFUl9IT0xEKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFNFTlNPUl9QUkVWSUVXX01PREU6Ci0JCXJjID0gbXQ5dDAxM192aWRlb19jb25maWcobW9kZSwgcmVzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNFTlNPUl9TTkFQU0hPVF9NT0RFOgotCQlyYyA9IG10OXQwMTNfc25hcHNob3RfY29uZmlnKG1vZGUpOwotCQlicmVhazsKLQotCWNhc2UgU0VOU09SX1JBV19TTkFQU0hPVF9NT0RFOgotCQlyYyA9IG10OXQwMTNfcmF3X3NuYXBzaG90X2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBGSVhNRTogd2hhdCBzaG91bGQgd2UgZG8gaWYgcmMgPCAwPyAqLwotCWlmIChyYyA+PSAwKQotCQlyZXR1cm4gbXQ5dDAxM19pMmNfd3JpdGVfdyhtdDl0MDEzX2NsaWVudC0+YWRkciwKLQkJCQlSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCQlHUk9VUEVEX1BBUkFNRVRFUl9VUERBVEUpOwotCXJldHVybiByYzsKLX0KLQotaW50IG10OXQwMTNfc2Vuc29yX2NvbmZpZyh2b2lkIF9fdXNlciAqYXJncCkKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhIGNkYXRhOwotCWxvbmcgICByYyA9IDA7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmNkYXRhLCAodm9pZCAqKWFyZ3AsCi0JCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWRvd24oJm10OXQwMTNfc2VtKTsKLQotCUNEQkcoIm10OXQwMTNfc2Vuc29yX2NvbmZpZzogY2ZndHlwZSA9ICVkXG4iLCBjZGF0YS5jZmd0eXBlKTsKLQlzd2l0Y2ggKGNkYXRhLmNmZ3R5cGUpIHsKLQljYXNlIENGR19HRVRfUElDVF9GUFM6Ci0JCW10OXQwMTNfZ2V0X3BpY3RfZnBzKGNkYXRhLmNmZy5nZnBzLnByZXZmcHMsCi0JCQkJJihjZGF0YS5jZmcuZ2Zwcy5waWN0ZnBzKSk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSZjZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX0dFVF9QUkVWX0xfUEY6Ci0JCWNkYXRhLmNmZy5wcmV2bF9wZiA9IG10OXQwMTNfZ2V0X3ByZXZfbGluZXNfcGYoKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfR0VUX1BSRVZfUF9QTDoKLQkJY2RhdGEuY2ZnLnByZXZwX3BsID0gbXQ5dDAxM19nZXRfcHJldl9waXhlbHNfcGwoKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfR0VUX1BJQ1RfTF9QRjoKLQkJY2RhdGEuY2ZnLnBpY3RsX3BmID0gbXQ5dDAxM19nZXRfcGljdF9saW5lc19wZigpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19HRVRfUElDVF9QX1BMOgotCQljZGF0YS5jZmcucGljdHBfcGwgPQotCQkJbXQ5dDAxM19nZXRfcGljdF9waXhlbHNfcGwoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19HRVRfUElDVF9NQVhfRVhQX0xDOgotCQljZGF0YS5jZmcucGljdF9tYXhfZXhwX2xjID0KLQkJCW10OXQwMTNfZ2V0X3BpY3RfbWF4X2V4cF9sYygpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSZjZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1NFVF9GUFM6Ci0JY2FzZSBDRkdfU0VUX1BJQ1RfRlBTOgotCQlyYyA9IG10OXQwMTNfc2V0X2ZwcygmKGNkYXRhLmNmZy5mcHMpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfRVhQX0dBSU46Ci0JCXJjID0gbXQ5dDAxM193cml0ZV9leHBfZ2FpbihjZGF0YS5jZmcuZXhwX2dhaW4uZ2FpbiwKLQkJCQljZGF0YS5jZmcuZXhwX2dhaW4ubGluZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX1BJQ1RfRVhQX0dBSU46Ci0JCXJjID0gbXQ5dDAxM19zZXRfcGljdF9leHBfZ2FpbihjZGF0YS5jZmcuZXhwX2dhaW4uZ2FpbiwKLQkJCQljZGF0YS5jZmcuZXhwX2dhaW4ubGluZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX01PREU6Ci0JCXJjID0gbXQ5dDAxM19zZXRfc2Vuc29yX21vZGUoY2RhdGEubW9kZSwgY2RhdGEucnMpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1BXUl9ET1dOOgotCQlyYyA9IG10OXQwMTNfcG93ZXJfZG93bigpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX01PVkVfRk9DVVM6Ci0JCXJjID0gbXQ5dDAxM19tb3ZlX2ZvY3VzKGNkYXRhLmNmZy5mb2N1cy5kaXIsCi0JCQkJY2RhdGEuY2ZnLmZvY3VzLnN0ZXBzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfREVGQVVMVF9GT0NVUzoKLQkJcmMgPSBtdDl0MDEzX3NldF9kZWZhdWx0X2ZvY3VzKGNkYXRhLmNmZy5mb2N1cy5zdGVwcyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfR0VUX0FGX01BWF9TVEVQUzoKLQkJY2RhdGEubWF4X3N0ZXBzID0gTVQ5VDAxM19UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUjsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX0VGRkVDVDoKLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotCXVwKCZtdDl0MDEzX3NlbSk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXQ5dDAxM19zZW5zb3JfcmVsZWFzZSh2b2lkKQotewotCWludCByYyA9IC1FQkFERjsKLQotCWRvd24oJm10OXQwMTNfc2VtKTsKLQotCWlmIChtYWNoaW5lX2lzX3NhcHBoaXJlKCkpCi0JCW10OXQwMTNfcG93ZXJvZmZfYWYoKTsKLQltdDl0MDEzX3Bvd2VyX2Rvd24oKTsKLQotCWdwaW9fZGlyZWN0aW9uX291dHB1dChtdDl0MDEzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9yZXNldCwKLQkJCTApOwotCWdwaW9fZnJlZShtdDl0MDEzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9yZXNldCk7Ci0KLQlrZnJlZShtdDl0MDEzX2N0cmwpOwotCi0JdXAoJm10OXQwMTNfc2VtKTsKLQlDREJHKCJtdDl0MDEzX3JlbGVhc2UgY29tcGxldGVkIVxuIik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG10OXQwMTNfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCWludCByYyA9IDA7Ci0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKLQkJcmMgPSAtRU5PVFNVUFA7Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0KLQltdDl0MDEzX3NlbnNvcncgPQotCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgbXQ5dDAxM193b3JrKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIW10OXQwMTNfc2Vuc29ydykgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBtdDl0MDEzX3NlbnNvcncpOwotCW10OXQwMTNfaW5pdF9jbGllbnQoY2xpZW50KTsKLQltdDl0MDEzX2NsaWVudCA9IGNsaWVudDsKLQltdDl0MDEzX2NsaWVudC0+YWRkciA9IG10OXQwMTNfY2xpZW50LT5hZGRyID4+IDE7Ci0JbWRlbGF5KDUwKTsKLQotCUNEQkcoImkyYyBwcm9iZSBva1xuIik7Ci0JcmV0dXJuIDA7Ci0KLXByb2JlX2ZhaWx1cmU6Ci0Ja2ZyZWUobXQ5dDAxM19zZW5zb3J3KTsKLQltdDl0MDEzX3NlbnNvcncgPSBOVUxMOwotCXByX2VycigiaTJjIHByb2JlIGZhaWx1cmUgJWRcbiIsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtdDl0MDEzX2kyY19pZFtdID0gewotCXsgIm10OXQwMTMiLCAwfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtdDl0MDEzX2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gbXQ5dDAxM19pMmNfaWQsCi0JLnByb2JlICA9IG10OXQwMTNfaTJjX3Byb2JlLAotCS5yZW1vdmUgPSBfX2V4aXRfcChtdDl0MDEzX2kyY19yZW1vdmUpLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm10OXQwMTMiLAotCX0sCi19OwotCi1zdGF0aWMgaW50IG10OXQwMTNfc2Vuc29yX3Byb2JlKAotCQljb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqaW5mbywKLQkJc3RydWN0IG1zbV9zZW5zb3JfY3RybCAqcykKLXsKLQkvKiBXZSBleHBlY3QgdGhpcyBkcml2ZXIgdG8gbWF0Y2ggd2l0aCB0aGUgaTJjIGRldmljZSByZWdpc3RlcmVkCi0JICogaW4gdGhlIGJvYXJkIGZpbGUgaW1tZWRpYXRlbHkuICovCi0JaW50IHJjID0gaTJjX2FkZF9kcml2ZXIoJm10OXQwMTNfaTJjX2RyaXZlcik7Ci0JaWYgKHJjIDwgMCB8fCBtdDl0MDEzX2NsaWVudCA9PSBOVUxMKSB7Ci0JCXJjID0gLUVOT1RTVVBQOwotCQlnb3RvIHByb2JlX2RvbmU7Ci0JfQotCi0JLyogZW5hYmxlIG1jbGsgZmlyc3QgKi8KLQltc21fY2FtaW9fY2xrX3JhdGVfc2V0KE1UOVQwMTNfREVGQVVMVF9DTE9DS19SQVRFKTsKLQltZGVsYXkoMjApOwotCi0JcmMgPSBtdDl0MDEzX3Byb2JlX2luaXRfc2Vuc29yKGluZm8pOwotCWlmIChyYyA8IDApIHsKLQkJaTJjX2RlbF9kcml2ZXIoJm10OXQwMTNfaTJjX2RyaXZlcik7Ci0JCWdvdG8gcHJvYmVfZG9uZTsKLQl9Ci0KLQlzLT5zX2luaXQgPSBtdDl0MDEzX3NlbnNvcl9vcGVuX2luaXQ7Ci0Jcy0+c19yZWxlYXNlID0gbXQ5dDAxM19zZW5zb3JfcmVsZWFzZTsKLQlzLT5zX2NvbmZpZyAgPSBtdDl0MDEzX3NlbnNvcl9jb25maWc7Ci0Jcy0+c19tb3VudF9hbmdsZSA9IDA7Ci0JbXQ5dDAxM19zZW5zb3JfaW5pdF9kb25lKGluZm8pOwotCi1wcm9iZV9kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX210OXQwMTNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gbXNtX2NhbWVyYV9kcnZfc3RhcnQocGRldiwgbXQ5dDAxM19zZW5zb3JfcHJvYmUpOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fY2FtZXJhX2RyaXZlciA9IHsKLQkucHJvYmUgPSBfX210OXQwMTNfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtX2NhbWVyYV9tdDl0MDEzIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG10OXQwMTNfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9jYW1lcmFfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQobXQ5dDAxM19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDl0MDEzLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5dDAxMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmQwYzIzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDl0MDEzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBNVDlUMDEzX0gKLSNkZWZpbmUgTVQ5VDAxM19ICi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLQotZXh0ZXJuIHN0cnVjdCBtdDl0MDEzX3JlZyBtdDl0MDEzX3JlZ3M7IC8qIGZyb20gbXQ5dDAxM19yZWcuYyAqLwotCi1zdHJ1Y3QgcmVnX3N0cnVjdCB7Ci0JdWludDE2X3QgdnRfcGl4X2Nsa19kaXY7ICAgICAgICAvKiAgMHgwMzAwICovCi0JdWludDE2X3QgdnRfc3lzX2Nsa19kaXY7ICAgICAgICAvKiAgMHgwMzAyICovCi0JdWludDE2X3QgcHJlX3BsbF9jbGtfZGl2OyAgICAgICAvKiAgMHgwMzA0ICovCi0JdWludDE2X3QgcGxsX211bHRpcGxpZXI7ICAgICAgICAvKiAgMHgwMzA2ICovCi0JdWludDE2X3Qgb3BfcGl4X2Nsa19kaXY7ICAgICAgICAvKiAgMHgwMzA4ICovCi0JdWludDE2X3Qgb3Bfc3lzX2Nsa19kaXY7ICAgICAgICAvKiAgMHgwMzBBICovCi0JdWludDE2X3Qgc2NhbGVfbTsgICAgICAgICAgICAgICAvKiAgMHgwNDA0ICovCi0JdWludDE2X3Qgcm93X3NwZWVkOyAgICAgICAgICAgICAvKiAgMHgzMDE2ICovCi0JdWludDE2X3QgeF9hZGRyX3N0YXJ0OyAgICAgICAgICAvKiAgMHgzMDA0ICovCi0JdWludDE2X3QgeF9hZGRyX2VuZDsgICAgICAgICAgICAvKiAgMHgzMDA4ICovCi0JdWludDE2X3QgeV9hZGRyX3N0YXJ0OyAgICAgICAgCS8qICAweDMwMDIgKi8KLQl1aW50MTZfdCB5X2FkZHJfZW5kOyAgICAgICAgICAgIC8qICAweDMwMDYgKi8KLQl1aW50MTZfdCByZWFkX21vZGU7ICAgICAgICAgICAgIC8qICAweDMwNDAgKi8KLQl1aW50MTZfdCB4X291dHB1dF9zaXplOyAgICAgICAgIC8qICAweDAzNEMgKi8KLQl1aW50MTZfdCB5X291dHB1dF9zaXplOyAgICAgICAgIC8qICAweDAzNEUgKi8KLQl1aW50MTZfdCBsaW5lX2xlbmd0aF9wY2s7ICAgICAgIC8qICAweDMwMEMgKi8KLQl1aW50MTZfdCBmcmFtZV9sZW5ndGhfbGluZXM7CS8qICAweDMwMEEgKi8KLQl1aW50MTZfdCBjb2Fyc2VfaW50X3RpbWU7IAkJLyogIDB4MzAxMiAqLwotCXVpbnQxNl90IGZpbmVfaW50X3RpbWU7ICAgCQkvKiAgMHgzMDE0ICovCi19OwotCi1zdHJ1Y3QgbXQ5dDAxM19pMmNfcmVnX2NvbmYgewotCXVuc2lnbmVkIHNob3J0IHdhZGRyOwotCXVuc2lnbmVkIHNob3J0IHdkYXRhOwotfTsKLQotc3RydWN0IG10OXQwMTNfcmVnIHsKLQlzdHJ1Y3QgcmVnX3N0cnVjdCBjb25zdCAqcmVnX3BhdDsKLQl1aW50MTZfdCByZWdfcGF0X3NpemU7Ci0Jc3RydWN0IG10OXQwMTNfaTJjX3JlZ19jb25mIGNvbnN0ICp0dGJsOwotCXVpbnQxNl90IHR0Ymxfc2l6ZTsKLQlzdHJ1Y3QgbXQ5dDAxM19pMmNfcmVnX2NvbmYgY29uc3QgKmxjdGJsOwotCXVpbnQxNl90IGxjdGJsX3NpemU7Ci0Jc3RydWN0IG10OXQwMTNfaTJjX3JlZ19jb25mIGNvbnN0ICpyZnRibDsKLQl1aW50MTZfdCByZnRibF9zaXplOwotfTsKLQotI2VuZGlmIC8qICNkZWZpbmUgTVQ5VDAxM19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvbXQ5dDAxM19yZWcuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDl0MDEzX3JlZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDMxNDQxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9tdDl0MDEzX3JlZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgIm10OXQwMTMuaCIKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotc3RydWN0IHJlZ19zdHJ1Y3QgY29uc3QgbXQ5dDAxM19yZWdfcGF0WzJdID0gewotCXsgLyogUHJldmlldyAyeDIgYmlubmluZyAyMGZwcywgcGNsayBNSHosIE1DTEsgMjRNSHogKi8KLQkvKiB2dF9waXhfY2xrX2RpdjpSRUc9MHgwMzAwIHVwZGF0ZSBnZXRfc25hcHNob3RfZnBzCi0JKiBpZiB0aGlzIGNoYW5nZSAqLwotCTgsCi0KLQkvKiB2dF9zeXNfY2xrX2RpdjogUkVHPTB4MDMwMiAgdXBkYXRlIGdldF9zbmFwc2hvdF9mcHMKLQkqIGlmIHRoaXMgY2hhbmdlICovCi0JMSwKLQotCS8qIHByZV9wbGxfY2xrX2RpdiBSRUc9MHgwMzA0ICB1cGRhdGUgZ2V0X3NuYXBzaG90X2ZwcwotCSogaWYgdGhpcyBjaGFuZ2UgKi8KLQkyLAotCi0JLyogcGxsX211bHRpcGxpZXIgIFJFRz0weDAzMDYgNjAgZm9yIDMwZnBzIHByZXZpZXcsIDQwCi0JICogZm9yIDIwZnBzIHByZXZpZXcKLQkgKiA0NiBmb3IgMzBmcHMgcHJldmlldywgdHJ5IDQ3LzQ4IHRvIGluY3JlYXNlIGZ1cnRoZXIgKi8KLQk0NiwKLQotCS8qIG9wX3BpeF9jbGtfZGl2ICAgICAgICBSRUc9MHgwMzA4ICovCi0JOCwKLQotCS8qIG9wX3N5c19jbGtfZGl2ICAgICAgICBSRUc9MHgwMzBBICovCi0JMSwKLQotCS8qIHNjYWxlX20gICAgICAgUkVHPTB4MDQwNCAqLwotCTE2LAotCi0JLyogcm93X3NwZWVkICAgICBSRUc9MHgzMDE2ICovCi0JMHgwMTExLAotCi0JLyogeF9hZGRyX3N0YXJ0ICBSRUc9MHgzMDA0ICovCi0JOCwKLQotCS8qIHhfYWRkcl9lbmQgICAgUkVHPTB4MzAwOCAqLwotCTIwNTMsCi0KLQkvKiB5X2FkZHJfc3RhcnQgIFJFRz0weDMwMDIgKi8KLQk4LAotCi0JLyogeV9hZGRyX2VuZCAgICBSRUc9MHgzMDA2ICovCi0JMTU0MSwKLQotCS8qIHJlYWRfbW9kZSAgICAgUkVHPTB4MzA0MCAqLwotCTB4MDQ2QywKLQotCS8qIHhfb3V0cHV0X3NpemUgUkVHPTB4MDM0QyAqLwotCTEwMjQsCi0KLQkvKiB5X291dHB1dF9zaXplIFJFRz0weDAzNEUgKi8KLQk3NjgsCi0KLQkvKiBsaW5lX2xlbmd0aF9wY2sgICAgUkVHPTB4MzAwQyAqLwotCTI2MTYsCi0KLQkvKiBmcmFtZV9sZW5ndGhfbGluZXMgUkVHPTB4MzAwQSAqLwotCTkxNiwKLQotCS8qIGNvYXJzZV9pbnRfdGltZSBSRUc9MHgzMDEyICovCi0JMTYsCi0KLQkvKiBmaW5lX2ludF90aW1lICAgUkVHPTB4MzAxNCAqLwotCTE0NjEKLQl9LAotCXsgLypTbmFwc2hvdCAqLwotCS8qIHZ0X3BpeF9jbGtfZGl2ICBSRUc9MHgwMzAwIHVwZGF0ZSBnZXRfc25hcHNob3RfZnBzCi0JKiBpZiB0aGlzIGNoYW5nZSAqLwotCTgsCi0KLQkvKiB2dF9zeXNfY2xrX2RpdiAgUkVHPTB4MDMwMiB1cGRhdGUgZ2V0X3NuYXBzaG90X2ZwcwotCSogaWYgdGhpcyBjaGFuZ2UgKi8KLQkxLAotCi0JLyogcHJlX3BsbF9jbGtfZGl2IFJFRz0weDAzMDQgdXBkYXRlIGdldF9zbmFwc2hvdF9mcHMKLQkgKiBpZiB0aGlzIGNoYW5nZSAqLwotCTIsCi0KLQkvKiBwbGxfbXVsdGlwbGllciBSRUc9MHgwMzA2IDUwIGZvciAxNWZwcyBzbmFwc2hvdCwKLQkgKiA0MCBmb3IgMTBmcHMgc25hcHNob3QKLQkgKiA0NiBmb3IgMzBmcHMgc25hcHNob3QsIHRyeSA0Ny80OCB0byBpbmNyZWFzZSBmdXJ0aGVyICovCi0JNDYsCi0KLQkvKiBvcF9waXhfY2xrX2RpdiAgICAgICAgUkVHPTB4MDMwOCAqLwotCTgsCi0KLQkvKiBvcF9zeXNfY2xrX2RpdiAgICAgICAgUkVHPTB4MDMwQSAqLwotCTEsCi0KLQkvKiBzY2FsZV9tICAgICAgIFJFRz0weDA0MDQgKi8KLQkxNiwKLQotCS8qIHJvd19zcGVlZCAgICAgUkVHPTB4MzAxNiAqLwotCTB4MDExMSwKLQotCS8qIHhfYWRkcl9zdGFydCAgUkVHPTB4MzAwNCAqLwotCTgsCi0KLQkvKiB4X2FkZHJfZW5kICAgIFJFRz0weDMwMDggKi8KLQkyMDcxLAotCi0JLyogeV9hZGRyX3N0YXJ0ICBSRUc9MHgzMDAyICovCi0JOCwKLQotCS8qIHlfYWRkcl9lbmQgICAgUkVHPTB4MzAwNiAqLwotCTE1NTEsCi0KLQkvKiByZWFkX21vZGUgICAgIFJFRz0weDMwNDAgKi8KLQkweDAwMjQsCi0KLQkvKiB4X291dHB1dF9zaXplIFJFRz0weDAzNEMgKi8KLQkyMDY0LAotCi0JLyogeV9vdXRwdXRfc2l6ZSBSRUc9MHgwMzRFICovCi0JMTU0NCwKLQotCS8qIGxpbmVfbGVuZ3RoX3BjayBSRUc9MHgzMDBDICovCi0JMjk1MiwKLQotCS8qIGZyYW1lX2xlbmd0aF9saW5lcyAgICBSRUc9MHgzMDBBICovCi0JMTYyOSwKLQotCS8qIGNvYXJzZV9pbnRfdGltZSBSRUc9MHgzMDEyICovCi0JMTYsCi0KLQkvKiBmaW5lX2ludF90aW1lIFJFRz0weDMwMTQgICAqLwotCTczMwotCX0KLX07Ci0KLXN0cnVjdCBtdDl0MDEzX2kyY19yZWdfY29uZiBjb25zdCBtdDl0MDEzX3Rlc3RfdGJsW10gPSB7Ci0JeyAweDMwNDQsIDB4MDU0NCAmIDB4RkJGRiB9LAotCXsgMHgzMENBLCAweDAwMDQgfCAweDAwMDEgfSwKLQl7IDB4MzBENCwgMHg5MDIwICYgMHg3RkZGIH0sCi0JeyAweDMxRTAsIDB4MDAwMyAmIDB4RkZGRSB9LAotCXsgMHgzMTgwLCAweDkxRkYgJiAweDdGRkYgfSwKLQl7IDB4MzAxQSwgKDB4MTBDQyB8IDB4ODAwMCkgJiAweEZGRjcgfSwKLQl7IDB4MzAxRSwgMHgwMDAwIH0sCi0JeyAweDM3ODAsIDB4MDAwMCB9LAotfTsKLQotLyogW0xlbnMgc2hhZGluZyA4NSBQZXJjZW50IFRMODRdICovCi1zdHJ1Y3QgbXQ5dDAxM19pMmNfcmVnX2NvbmYgY29uc3QgbXQ5dDAxM19sY190YmxbXSA9IHsKLQl7IDB4MzYwQSwgMHgwMjkwIH0sIC8qIFBfUkRfUDBRMCAqLwotCXsgMHgzNjBDLCAweEM5MkQgfSwgLyogUF9SRF9QMFExICovCi0JeyAweDM2MEUsIDB4MDc3MSB9LCAvKiBQX1JEX1AwUTIgKi8KLQl7IDB4MzYxMCwgMHhFMzhDIH0sIC8qIFBfUkRfUDBRMyAqLwotCXsgMHgzNjEyLCAweEQ3NEYgfSwgLyogUF9SRF9QMFE0ICovCi0JeyAweDM2NEEsIDB4MTY4QyB9LCAvKiBQX1JEX1AxUTAgKi8KLQl7IDB4MzY0QywgMHhDQUNCIH0sIC8qIFBfUkRfUDFRMSAqLwotCXsgMHgzNjRFLCAweDhDNEMgfSwgLyogUF9SRF9QMVEyICovCi0JeyAweDM2NTAsIDB4MEJFQSB9LCAvKiBQX1JEX1AxUTMgKi8KLQl7IDB4MzY1MiwgMHhEQzBGIH0sIC8qIFBfUkRfUDFRNCAqLwotCXsgMHgzNjhBLCAweDcwQjAgfSwgLyogUF9SRF9QMlEwICovCi0JeyAweDM2OEMsIDB4MjAwQiB9LCAvKiBQX1JEX1AyUTEgKi8KLQl7IDB4MzY4RSwgMHgzMEIyIH0sIC8qIFBfUkRfUDJRMiAqLwotCXsgMHgzNjkwLCAweEQwNEYgfSwgLyogUF9SRF9QMlEzICovCi0JeyAweDM2OTIsIDB4QUNGNSB9LCAvKiBQX1JEX1AyUTQgKi8KLQl7IDB4MzZDQSwgMHhGN0M5IH0sIC8qIFBfUkRfUDNRMCAqLwotCXsgMHgzNkNDLCAweDJBRUQgfSwgLyogUF9SRF9QM1ExICovCi0JeyAweDM2Q0UsIDB4QTY1MiB9LCAvKiBQX1JEX1AzUTIgKi8KLQl7IDB4MzZEMCwgMHg4MTkyIH0sIC8qIFBfUkRfUDNRMyAqLwotCXsgMHgzNkQyLCAweDNBMTUgfSwgLyogUF9SRF9QM1E0ICovCi0JeyAweDM3MEEsIDB4REEzMCB9LCAvKiBQX1JEX1A0UTAgKi8KLQl7IDB4MzcwQywgMHgyRTJGIH0sIC8qIFBfUkRfUDRRMSAqLwotCXsgMHgzNzBFLCAweEJCNTYgfSwgLyogUF9SRF9QNFEyICovCi0JeyAweDM3MTAsIDB4ODE5NSB9LCAvKiBQX1JEX1A0UTMgKi8KLQl7IDB4MzcxMiwgMHgwMkY5IH0sIC8qIFBfUkRfUDRRNCAqLwotCXsgMHgzNjAwLCAweDAyMzAgfSwgLyogUF9HUl9QMFEwICovCi0JeyAweDM2MDIsIDB4NThBRCB9LCAvKiBQX0dSX1AwUTEgKi8KLQl7IDB4MzYwNCwgMHgxOEQxIH0sIC8qIFBfR1JfUDBRMiAqLwotCXsgMHgzNjA2LCAweDI2MEQgfSwgLyogUF9HUl9QMFEzICovCi0JeyAweDM2MDgsIDB4RjUzMCB9LCAvKiBQX0dSX1AwUTQgKi8KLQl7IDB4MzY0MCwgMHgxN0VCIH0sIC8qIFBfR1JfUDFRMCAqLwotCXsgMHgzNjQyLCAweDNDQUIgfSwgLyogUF9HUl9QMVExICovCi0JeyAweDM2NDQsIDB4ODdDRSB9LCAvKiBQX0dSX1AxUTIgKi8KLQl7IDB4MzY0NiwgMHhDMDJFIH0sIC8qIFBfR1JfUDFRMyAqLwotCXsgMHgzNjQ4LCAweEY0OEYgfSwgLyogUF9HUl9QMVE0ICovCi0JeyAweDM2ODAsIDB4NTM1MCB9LCAvKiBQX0dSX1AyUTAgKi8KLQl7IDB4MzY4MiwgMHg3RUFGIH0sIC8qIFBfR1JfUDJRMSAqLwotCXsgMHgzNjg0LCAweDQzMTIgfSwgLyogUF9HUl9QMlEyICovCi0JeyAweDM2ODYsIDB4QzY1MiB9LCAvKiBQX0dSX1AyUTMgKi8KLQl7IDB4MzY4OCwgMHhCQzE1IH0sIC8qIFBfR1JfUDJRNCAqLwotCXsgMHgzNkMwLCAweEI4QUQgfSwgLyogUF9HUl9QM1EwICovCi0JeyAweDM2QzIsIDB4QkRDRCB9LCAvKiBQX0dSX1AzUTEgKi8KLQl7IDB4MzZDNCwgMHhFNEIyIH0sIC8qIFBfR1JfUDNRMiAqLwotCXsgMHgzNkM2LCAweEI1MEYgfSwgLyogUF9HUl9QM1EzICovCi0JeyAweDM2QzgsIDB4NUI5NSB9LCAvKiBQX0dSX1AzUTQgKi8KLQl7IDB4MzcwMCwgMHhGQzkwIH0sIC8qIFBfR1JfUDRRMCAqLwotCXsgMHgzNzAyLCAweDhDNTEgfSwgLyogUF9HUl9QNFExICovCi0JeyAweDM3MDQsIDB4Q0VENiB9LCAvKiBQX0dSX1A0UTIgKi8KLQl7IDB4MzcwNiwgMHhCNTk0IH0sIC8qIFBfR1JfUDRRMyAqLwotCXsgMHgzNzA4LCAweDBBMzkgfSwgLyogUF9HUl9QNFE0ICovCi0JeyAweDM2MTQsIDB4MDIzMCB9LCAvKiBQX0JMX1AwUTAgKi8KLQl7IDB4MzYxNiwgMHgxNjBEIH0sIC8qIFBfQkxfUDBRMSAqLwotCXsgMHgzNjE4LCAweDA4RDEgfSwgLyogUF9CTF9QMFEyICovCi0JeyAweDM2MUEsIDB4OThBQiB9LCAvKiBQX0JMX1AwUTMgKi8KLQl7IDB4MzYxQywgMHhFQTUwIH0sIC8qIFBfQkxfUDBRNCAqLwotCXsgMHgzNjU0LCAweEI0RUEgfSwgLyogUF9CTF9QMVEwICovCi0JeyAweDM2NTYsIDB4RUE2QyB9LCAvKiBQX0JMX1AxUTEgKi8KLQl7IDB4MzY1OCwgMHhGRTA4IH0sIC8qIFBfQkxfUDFRMiAqLwotCXsgMHgzNjVBLCAweDJDNkUgfSwgLyogUF9CTF9QMVEzICovCi0JeyAweDM2NUMsIDB4RUIwRSB9LCAvKiBQX0JMX1AxUTQgKi8KLQl7IDB4MzY5NCwgMHg2REYwIH0sIC8qIFBfQkxfUDJRMCAqLwotCXsgMHgzNjk2LCAweDNBQ0YgfSwgLyogUF9CTF9QMlExICovCi0JeyAweDM2OTgsIDB4M0UwRiB9LCAvKiBQX0JMX1AyUTIgKi8KLQl7IDB4MzY5QSwgMHhCMkIxIH0sIC8qIFBfQkxfUDJRMyAqLwotCXsgMHgzNjlDLCAweEMzNzQgfSwgLyogUF9CTF9QMlE0ICovCi0JeyAweDM2RDQsIDB4RjJBQSB9LCAvKiBQX0JMX1AzUTAgKi8KLQl7IDB4MzZENiwgMHg4Q0NDIH0sIC8qIFBfQkxfUDNRMSAqLwotCXsgMHgzNkQ4LCAweERFRjIgfSwgLyogUF9CTF9QM1EyICovCi0JeyAweDM2REEsIDB4RkExMSB9LCAvKiBQX0JMX1AzUTMgKi8KLQl7IDB4MzZEQywgMHg0MkY1IH0sIC8qIFBfQkxfUDNRNCAqLwotCXsgMHgzNzE0LCAweEY0RjEgfSwgLyogUF9CTF9QNFEwICovCi0JeyAweDM3MTYsIDB4RjZGMCB9LCAvKiBQX0JMX1A0UTEgKi8KLQl7IDB4MzcxOCwgMHg4RkQ2IH0sIC8qIFBfQkxfUDRRMiAqLwotCXsgMHgzNzFBLCAweEVBMTQgfSwgLyogUF9CTF9QNFEzICovCi0JeyAweDM3MUMsIDB4NjMzOCB9LCAvKiBQX0JMX1A0UTQgKi8KLQl7IDB4MzYxRSwgMHgwMzUwIH0sIC8qIFBfR0JfUDBRMCAqLwotCXsgMHgzNjIwLCAweDkxQUUgfSwgLyogUF9HQl9QMFExICovCi0JeyAweDM2MjIsIDB4MDU3MSB9LCAvKiBQX0dCX1AwUTIgKi8KLQl7IDB4MzYyNCwgMHgxMDBEIH0sIC8qIFBfR0JfUDBRMyAqLwotCXsgMHgzNjI2LCAweENBNzAgfSwgLyogUF9HQl9QMFE0ICovCi0JeyAweDM2NUUsIDB4RTZDQiB9LCAvKiBQX0dCX1AxUTAgKi8KLQl7IDB4MzY2MCwgMHg1MEVEIH0sIC8qIFBfR0JfUDFRMSAqLwotCXsgMHgzNjYyLCAweDNEQUUgfSwgLyogUF9HQl9QMVEyICovCi0JeyAweDM2NjQsIDB4QUE0RiB9LCAvKiBQX0dCX1AxUTMgKi8KLQl7IDB4MzY2NiwgMHhEQzUwIH0sIC8qIFBfR0JfUDFRNCAqLwotCXsgMHgzNjlFLCAweDU0NzAgfSwgLyogUF9HQl9QMlEwICovCi0JeyAweDM2QTAsIDB4MUY2RSB9LCAvKiBQX0dCX1AyUTEgKi8KLQl7IDB4MzZBMiwgMHg2NjcxIH0sIC8qIFBfR0JfUDJRMiAqLwotCXsgMHgzNkE0LCAweEMwMTAgfSwgLyogUF9HQl9QMlEzICovCi0JeyAweDM2QTYsIDB4OERGNSB9LCAvKiBQX0dCX1AyUTQgKi8KLQl7IDB4MzZERSwgMHgwQjBDIH0sIC8qIFBfR0JfUDNRMCAqLwotCXsgMHgzNkUwLCAweDg0Q0UgfSwgLyogUF9HQl9QM1ExICovCi0JeyAweDM2RTIsIDB4ODQ5MyB9LCAvKiBQX0dCX1AzUTIgKi8KLQl7IDB4MzZFNCwgMHhBNjEwIH0sIC8qIFBfR0JfUDNRMyAqLwotCXsgMHgzNkU2LCAweDUwQjUgfSwgLyogUF9HQl9QM1E0ICovCi0JeyAweDM3MUUsIDB4OTY1MSB9LCAvKiBQX0dCX1A0UTAgKi8KLQl7IDB4MzcyMCwgMHgxRUFCIH0sIC8qIFBfR0JfUDRRMSAqLwotCXsgMHgzNzIyLCAweEFGNzYgfSwgLyogUF9HQl9QNFEyICovCi0JeyAweDM3MjQsIDB4RTRGNCB9LCAvKiBQX0dCX1A0UTMgKi8KLQl7IDB4MzcyNiwgMHg3OUY4IH0sIC8qIFBfR0JfUDRRNCAqLwotCXsgMHgzNzgyLCAweDA0MTAgfSwgLyogUE9MWV9PUklHSU5fQyAqLwotCXsgMHgzNzg0LCAweDAzMjAgfSwgLyogUE9MWV9PUklHSU5fUiAgKi8KLQl7IDB4Mzc4MCwgMHg4MDAwIH0gLyogUE9MWV9TQ19FTkFCTEUgKi8KLX07Ci0KLXN0cnVjdCBtdDl0MDEzX3JlZyBtdDl0MDEzX3JlZ3MgPSB7Ci0JLnJlZ19wYXQgPSAmbXQ5dDAxM19yZWdfcGF0WzBdLAotCS5yZWdfcGF0X3NpemUgPSBBUlJBWV9TSVpFKG10OXQwMTNfcmVnX3BhdCksCi0JLnR0YmwgPSAmbXQ5dDAxM190ZXN0X3RibFswXSwKLQkudHRibF9zaXplID0gQVJSQVlfU0laRShtdDl0MDEzX3Rlc3RfdGJsKSwKLQkubGN0YmwgPSAmbXQ5dDAxM19sY190YmxbMF0sCi0JLmxjdGJsX3NpemUgPSBBUlJBWV9TSVpFKG10OXQwMTNfbGNfdGJsKSwKLQkucmZ0YmwgPSAmbXQ5dDAxM19sY190YmxbMF0sCS8qICZtdDl0MDEzX3JvbGxvZmZfdGJsWzBdLCAqLwotCS5yZnRibF9zaXplID0gQVJSQVlfU0laRShtdDl0MDEzX2xjX3RibCkKLX07Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL292NTY0MC5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL292NTY0MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDQxYTQ2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9vdjU2NDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NzcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLS8qICNkZWZpbmUgREVCVUcgKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2NhbWVyYS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSAib3Y1NjQwLmgiCi0KLSNkZWZpbmUgRkFMU0UgMAotI2RlZmluZSBUUlVFIDEKLQotc3RydWN0IG92NTY0MF93b3JrIHsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKLX07Ci0KLXN0cnVjdCBfX292NTY0MF9jdHJsIHsKLQljb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2Vuc29yZGF0YTsKLQlpbnQgc2Vuc29ybW9kZTsKLQl1aW50IGZwc19kaXZpZGVyOyAvKiBpbml0IHRvIDEgKiAweDAwMDAwNDAwICovCi0JdWludCBwaWN0X2Zwc19kaXZpZGVyOyAvKiBpbml0IHRvIDEgKiAweDAwMDAwNDAwICovCi0JdTE2IGN1cnJfc3RlcF9wb3M7Ci0JdTE2IGN1cnJfbGVuc19wb3M7Ci0JdTE2IGluaXRfY3Vycl9sZW5zX3BvczsKLQl1MTYgbXlfcmVnX2dhaW47Ci0JdTE2IG15X3JlZ19saW5lX2NvdW50OwotCWVudW0gbXNtX3NfcmVzb2x1dGlvbiBwcmV2X3JlczsKLQllbnVtIG1zbV9zX3Jlc29sdXRpb24gcGljdF9yZXM7Ci0JZW51bSBtc21fc19yZXNvbHV0aW9uIGN1cnJfcmVzOwotCWVudW0gbXNtX3NfdGVzdF9tb2RlICBzZXRfdGVzdDsKLX07Ci0KLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChvdjU2NDBfd2FpdF9xdWV1ZSk7Ci1ERUZJTkVfTVVURVgob3Y1NjQwX211dGV4KTsKLQotc3RhdGljIGludCBvdjU2NDBfcHdkbl9ncGlvOwotc3RhdGljIGludCBvdjU2NDBfcmVzZXRfZ3BpbzsKLXN0YXRpYyBpbnQgb3Y1NjQwX2RyaXZlcl9wd2RuX2dwaW87Ci1zdGF0aWMgaW50IE9WNTY0MF9DU0lfQ09ORklHOwotc3RhdGljIHN0cnVjdCBvdjU2NDBfd29yayAqb3Y1NjQwX3NlbnNvcnc7Ci1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgICAgKm92NTY0MF9jbGllbnQ7Ci1zdGF0aWMgdTggb3Y1NjQwX2kyY19idWZbNF07Ci1zdGF0aWMgdTggb3Y1NjQwX2NvdW50ZXI7Ci1zdGF0aWMgaW50MTZfdCBvdjU2NDBfZWZmZWN0Owotc3RhdGljIGludCBpc19hdXRvZmxhc2g7Ci1zdGF0aWMgaW50IGVmZmVjdF92YWx1ZTsKLXVuc2lnbmVkIGludCBvdjU2NDBfU0FUX1UgPSAweDQwOwotdW5zaWduZWQgaW50IG92NTY0MF9TQVRfViA9IDB4NDA7Ci0KLXN0YXRpYyBzdHJ1Y3QgX19vdjU2NDBfY3RybCAqb3Y1NjQwX2N0cmw7Ci1zdGF0aWMgaW50IG92NTY0MF9hZmluaXQgPSAxOwotCi1zdHJ1Y3Qgcndfc2VtYXBob3JlIG92X2xlZHNfbGlzdF9sb2NrOwotc3RydWN0IGxpc3RfaGVhZCBvdl9sZWRzX2xpc3Q7Ci0KLXN0YXRpYyBpbnQgb3Y1NjQwX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7Ci1zdGF0aWMgaW50IG92NTY0MF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKTsKLQotc3RhdGljIGludCBvdjU2NDBfaTJjX3R4ZGF0YSh1MTYgc2FkZHIsIHU4ICp0eGRhdGEsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGkyY19tc2cgbXNnW10gPSB7Ci0JCXsKLQkJCS5hZGRyCT0gc2FkZHIsCi0JCQkuZmxhZ3MJPSAwLAotCQkJLmxlbgk9IGxlbmd0aCwKLQkJCS5idWYJPSB0eGRhdGEsCi0JCX0sCi0JfTsKLQotCWlmIChpMmNfdHJhbnNmZXIob3Y1NjQwX2NsaWVudC0+YWRhcHRlciwgbXNnLCAxKSA8IDApCi0JCXJldHVybiAtRUlPOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y1NjQwX2kyY193cml0ZSh1bnNpZ25lZCBzaG9ydCBzYWRkciwgdW5zaWduZWQgaW50IHdhZGRyLAotCQl1bnNpZ25lZCBzaG9ydCBiZGF0YSwgdTggdHJ5dGltZXMpCi17Ci0JaW50IHJjID0gLUVJTzsKLQotCW92NTY0MF9jb3VudGVyID0gMDsKLQlvdjU2NDBfaTJjX2J1ZlswXSA9ICh3YWRkciAmIDB4RkYwMCkgPj4gODsKLQlvdjU2NDBfaTJjX2J1ZlsxXSA9ICh3YWRkciAmIDB4MDBGRik7Ci0Jb3Y1NjQwX2kyY19idWZbMl0gPSAoYmRhdGEgJiAweDAwRkYpOwotCi0Jd2hpbGUgKChvdjU2NDBfY291bnRlciA8IHRyeXRpbWVzKSAmJiAocmMgIT0gMCkpIHsKLQkJcmMgPSBvdjU2NDBfaTJjX3R4ZGF0YShzYWRkciwgb3Y1NjQwX2kyY19idWYsIDMpOwotCi0JCWlmIChyYyA8IDApIHsKLQkJCW92NTY0MF9jb3VudGVyKys7Ci0JCQlDREJHKCIqKiotLUNBTUVSQSBpMmNfd3JpdGVfdyBmYWlsZWQsaTJjIGFkZHI9MHgleCwiCi0JCQkJImNvbW1hbmQgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXgscz0lZCwiCi0JCQkJCSJyYz0lZCFcbiIsIHNhZGRyLCB3YWRkciwgYmRhdGEsCi0JCQkJCW92NTY0MF9jb3VudGVyLCByYyk7Ci0JCQltc2xlZXAoMjApOwotCQl9Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBvdjU2NDBfaTJjX3J4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwgdW5zaWduZWQgY2hhciAqcnhkYXRhLAotCQlpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKLQkJewotCQkJLmFkZHIJPSBzYWRkciwKLQkJCS5mbGFncwk9IDAsCi0JCQkubGVuCT0gMiwKLQkJCS5idWYJPSByeGRhdGEsCi0JCX0sCi0JCXsKLQkJCS5hZGRyCT0gc2FkZHIsCi0JCQkuZmxhZ3MJPSBJMkNfTV9SRCwKLQkJCS5sZW4JPSBsZW5ndGgsCi0JCQkuYnVmCT0gcnhkYXRhLAotCQl9LAotCX07Ci0KLQlpZiAoaTJjX3RyYW5zZmVyKG92NTY0MF9jbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpIDwgMCkgewotCQlDREJHKCJvdjU2NDBfaTJjX3J4ZGF0YSBmYWlsZWQhXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG92NTY0MF9pMmNfcmVhZF9ieXRlKHVuc2lnbmVkIHNob3J0ICBzYWRkciwKLQkJdW5zaWduZWQgaW50IHJhZGRyLCB1bnNpZ25lZCBpbnQgKnJkYXRhKQotewotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgY2hhciBidWZbMl07Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0KLQlidWZbMF0gPSAocmFkZHIgJiAweEZGMDApPj44OwotCWJ1ZlsxXSA9IChyYWRkciAmIDB4MDBGRik7Ci0KLQlyYyA9IG92NTY0MF9pMmNfcnhkYXRhKHNhZGRyLCBidWYsIDEpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygib3Y1NjQwX2kyY19yZWFkX2J5dGUgZmFpbGVkIVxuIik7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkqcmRhdGEgPSBidWZbMF07Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG92NTY0MF93cml0ZXByZWdzKHN0cnVjdCBvdjU2NDBfc2Vuc29yICpwdGIsIGludDMyX3QgbGVuKQotewotCWludDMyX3QgaSwgcmV0ID0gMDsKLQl1aW50MzJfdCByZWd2OwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWlmICgwID09IHB0YltpXS5tYXNrKSB7Ci0JCQlvdjU2NDBfaTJjX3dyaXRlKG92NTY0MF9jbGllbnQtPmFkZHIsIHB0YltpXS5hZGRyLAotCQkJCQlwdGJbaV0uZGF0YSwgMTApOwotCQl9IGVsc2UgewotCQkJb3Y1NjQwX2kyY19yZWFkX2J5dGUob3Y1NjQwX2NsaWVudC0+YWRkciwgcHRiW2ldLmFkZHIsCi0JCQkJCSZyZWd2KTsKLQkJCXJlZ3YgJj0gcHRiW2ldLm1hc2s7Ci0JCQlyZWd2IHw9IChwdGJbaV0uZGF0YSAmICh+cHRiW2ldLm1hc2spKTsKLQkJCW92NTY0MF9pMmNfd3JpdGUob3Y1NjQwX2NsaWVudC0+YWRkciwgcHRiW2ldLmFkZHIsCi0JCQkJCXJlZ3YsIDEwKTsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBjYW1lcmFfc3dfcG93ZXJfb25vZmYoaW50IHYpCi17Ci0JaWYgKHYgPT0gMCkgewotCQlDREJHKCJjYW1lcmFfc3dfcG93ZXJfb25vZmY6IGRvd25cbiIpOwotCQlvdjU2NDBfaTJjX3dyaXRlKG92NTY0MF9jbGllbnQtPmFkZHIsIDB4MzAwOCwgMHg0MiwgMTApOwotCX0gZWxzZSB7Ci0JCUNEQkcoImNhbWVyYV9zd19wb3dlcl9vbm9mZjogb25cbiIpOwotCQlvdjU2NDBfaTJjX3dyaXRlKG92NTY0MF9jbGllbnQtPmFkZHIsIDB4MzAwOCwgMHgwMiwgMTApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgb3Y1NjQwX3Bvd2VyX29mZih2b2lkKQotewotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uIChTdGFydC4uLilcbiIsIF9fZnVuY19fKTsKLQlncGlvX3NldF92YWx1ZShvdjU2NDBfcHdkbl9ncGlvLCAxKTsKLQlDREJHKCItLUNBTUVSQS0tICVzIC4uLiAoRW5kLi4uKVxuIiwgX19mdW5jX18pOwotfQotCi1zdGF0aWMgdm9pZCBvdjU2NDBfcG93ZXJfb24odm9pZCkKLXsKLQlDREJHKCItLUNBTUVSQS0tICVzIC4uLiAoU3RhcnQuLi4pXG4iLCBfX2Z1bmNfXyk7Ci0JZ3Bpb19zZXRfdmFsdWUob3Y1NjQwX3B3ZG5fZ3BpbywgMCk7Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4gKEVuZC4uLilcbiIsIF9fZnVuY19fKTsKLX0KLQotc3RhdGljIHZvaWQgb3Y1NjQwX3Bvd2VyX3Jlc2V0KHZvaWQpCi17Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4gKFN0YXJ0Li4uKVxuIiwgX19mdW5jX18pOwotCWdwaW9fc2V0X3ZhbHVlKG92NTY0MF9yZXNldF9ncGlvLCAxKTsgICAvKiByZXNldCBjYW1lcmEgcmVzZXQgcGluICovCi0JbXNsZWVwKDIwKTsKLQlncGlvX3NldF92YWx1ZShvdjU2NDBfcmVzZXRfZ3BpbywgMCk7Ci0JbXNsZWVwKDIwKTsKLQlncGlvX3NldF92YWx1ZShvdjU2NDBfcmVzZXRfZ3BpbywgMSk7Ci0JbXNsZWVwKDIwKTsKLQotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uIChFbmQuLi4pXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y1NjQwX3Byb2JlX3JlYWRJRChjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlpbnQgcmMgPSAwOwotCXUzMiBkZXZpY2VfaWRfaGlnaCA9IDA7Ci0JdTMyIGRldmljZV9pZF9sb3cgPSAwOwotCi0JQ0RCRygiLS1DQU1FUkEtLSAlcyAoU3RhcnQuLi4pXG4iLCBfX2Z1bmNfXyk7Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyBzZW5zb3IgcG93ZXJvbixiZWdpbiB0byByZWFkIElEIVxuIiwgX19mdW5jX18pOwotCi0JLyogMHgzMDBBICxzZW5zb3IgSUQgcmVnaXN0ZXIgKi8KLQlyYyA9IG92NTY0MF9pMmNfcmVhZF9ieXRlKG92NTY0MF9jbGllbnQtPmFkZHIsIDB4MzAwQSwKLQkJCSZkZXZpY2VfaWRfaGlnaCk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gJXMgb2sgLCByZWFkSTJDIGZhaWxlZCwgcmMgPSAweCV4XHJcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlDREJHKCItLUNBTUVSQS0tICVzICByZWFkSUQgaGlnaCBieXRlLCBkYXRhID0gMHgleFxyXG4iLAotCQkJX19mdW5jX18sIGRldmljZV9pZF9oaWdoKTsKLQotCS8qIDB4MzAwQiAsc2Vuc29yIElEIHJlZ2lzdGVyICovCi0JcmMgPSBvdjU2NDBfaTJjX3JlYWRfYnl0ZShvdjU2NDBfY2xpZW50LT5hZGRyLCAweDMwMEIsCi0JCQkmZGV2aWNlX2lkX2xvdyk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCItLUNBTUVSQS0tICVzIG9rICwgcmVhZEkyQyBmYWlsZWQscmMgPSAweCV4XHJcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgIHJlYWRJRCBsb3cgYnl0ZSwgZGF0YSA9IDB4JXhcclxuIiwKLQkJCV9fZnVuY19fLCBkZXZpY2VfaWRfbG93KTsKLQlDREJHKCItLUNBTUVSQS0tICVzIHJldHVybiBJRCA6MHgleFxuIiwgX19mdW5jX18sCi0JCQkoZGV2aWNlX2lkX2hpZ2ggPDwgOCkgKyBkZXZpY2VfaWRfbG93KTsKLQotCS8qIDB4NTY0MCwgb3Y1NjQwIGNoaXAgaWQgKi8KLQlpZiAoKGRldmljZV9pZF9oaWdoIDw8IDgpICsgZGV2aWNlX2lkX2xvdyAhPSBPVjU2NDBfU0VOU09SX0lEKSB7Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gJXMgb2sgLCBkZXZpY2UgaWQgZXJyb3IsIHNob3VsZCBiZSAweCV4XHJcbiIsCi0JCQkJX19mdW5jX18sIE9WNTY0MF9TRU5TT1JfSUQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9IGVsc2UgewotCQlDREJHKCItLUNBTUVSQS0tICVzIG9rICwgZGV2aWNlIGlkPTB4JXhcbiIsIF9fZnVuY19fLAotCQkJCU9WNTY0MF9TRU5TT1JfSUQpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgb3Y1NjQwX2FmX3NldHRpbmcodm9pZCkKLXsKLQlpbnQgcmMgPSAwOwotCWludCBsZW5zID0gc2l6ZW9mKG92NTY0MF9hZmluaXRfdGJsKSAvIHNpemVvZihvdjU2NDBfYWZpbml0X3RibFswXSk7Ci0KLQlDREJHKCItLUNBTUVSQS0tIG92NTY0MF9hZl9zZXR0aW5nXG4iKTsKLQotCW92NTY0MF9pMmNfd3JpdGUob3Y1NjQwX2NsaWVudC0+YWRkciwgMHgzMDAwLCAweDIwLCAxMCk7Ci0KLQlyYyA9IG92NTY0MF9pMmNfdHhkYXRhKG92NTY0MF9jbGllbnQtPmFkZHIsIG92NTY0MF9hZmluaXRfdGJsLCBsZW5zKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQUZfaW5pdCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0Jb3Y1NjQwX2kyY193cml0ZShvdjU2NDBfY2xpZW50LT5hZGRyLCBPVjU2NDBfQ01EX01BSU4sIDB4MDAsIDEwKTsKLQlvdjU2NDBfaTJjX3dyaXRlKG92NTY0MF9jbGllbnQtPmFkZHIsIE9WNTY0MF9DTURfQUNLLCAweDAwLCAxMCk7Ci0Jb3Y1NjQwX2kyY193cml0ZShvdjU2NDBfY2xpZW50LT5hZGRyLCBPVjU2NDBfQ01EX1BBUkEwLCAweDAwLCAxMCk7Ci0Jb3Y1NjQwX2kyY193cml0ZShvdjU2NDBfY2xpZW50LT5hZGRyLCBPVjU2NDBfQ01EX1BBUkExLCAweDAwLCAxMCk7Ci0Jb3Y1NjQwX2kyY193cml0ZShvdjU2NDBfY2xpZW50LT5hZGRyLCBPVjU2NDBfQ01EX1BBUkEyLCAweDAwLCAxMCk7Ci0Jb3Y1NjQwX2kyY193cml0ZShvdjU2NDBfY2xpZW50LT5hZGRyLCBPVjU2NDBfQ01EX1BBUkEzLCAweDAwLCAxMCk7Ci0Jb3Y1NjQwX2kyY193cml0ZShvdjU2NDBfY2xpZW50LT5hZGRyLCBPVjU2NDBfQ01EX1BBUkE0LCAweDAwLCAxMCk7Ci0Jb3Y1NjQwX2kyY193cml0ZShvdjU2NDBfY2xpZW50LT5hZGRyLCBPVjU2NDBfQ01EX0ZXX1NUQVRVUywgMHg3ZiwgMTApOwotCW92NTY0MF9pMmNfd3JpdGUob3Y1NjQwX2NsaWVudC0+YWRkciwgMHgzMDAwLCAweDAwLCAxMCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y1NjQwX3NldF9mbGFzaF9saWdodChlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCi17Ci0Jc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXY7Ci0KLQlDREJHKCJvdjU2NDBfc2V0X2ZsYXNoX2xpZ2h0IGJyaWdodG5lc3MgPSAlZFxuIiwgYnJpZ2h0bmVzcyk7Ci0KLQlkb3duX3JlYWQoJm92X2xlZHNfbGlzdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxlZF9jZGV2LCAmb3ZfbGVkc19saXN0LCBub2RlKSB7Ci0JCWlmICghc3RybmNtcChsZWRfY2Rldi0+bmFtZSwgImZsYXNobGlnaHQiLCAxMCkpCi0JCQlicmVhazsKLQl9Ci0JdXBfcmVhZCgmb3ZfbGVkc19saXN0X2xvY2spOwotCi0JaWYgKGxlZF9jZGV2KSB7Ci0JCWxlZF9icmlnaHRuZXNzX3NldChsZWRfY2RldiwgYnJpZ2h0bmVzcyk7Ci0JfSBlbHNlIHsKLQkJQ0RCRygiZ2V0IGZsYXNobGlnaHQgZGV2aWNlIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG92NTY0MF92aWRlb19jb25maWcodm9pZCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JQ0RCRygiLS1DQU1FUkEtLSBvdjU2NDBfdmlkZW9fY29uZmlnXG4iKTsKLQlDREJHKCItLUNBTUVSQS0tIHByZXZpZXcgaW4sIGlzX2F1dG9mbGFzaCAtIDB4JXhcbiIsIGlzX2F1dG9mbGFzaCk7Ci0KLQkvKiBhdXRvZmxhc2ggc2V0dGluZyAqLwotCWlmIChpc19hdXRvZmxhc2ggPT0gMSkKLQkJb3Y1NjQwX3NldF9mbGFzaF9saWdodChMRURfT0ZGKTsKLQotCS8qIHByZXZpZXcgc2V0dGluZyAqLwotCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX3ByZXZpZXdfdGJsKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y1NjQwX3NuYXBzaG90X2NvbmZpZyh2b2lkKQotewotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCUNEQkcoIi0tQ0FNRVJBLS0gU0VOU09SX1NOQVBTSE9UX01PREVcbiIpOwotCUNEQkcoIi0tQ0FNRVJBLS0gJXMsIHNuYXBzaG90IGluLCBpc19hdXRvZmxhc2ggLSAweCV4XG4iLCBfX2Z1bmNfXywKLQkJCWlzX2F1dG9mbGFzaCk7Ci0KLQlpZiAoaXNfYXV0b2ZsYXNoID09IDEpIHsKLQkJb3Y1NjQwX2kyY19yZWFkX2J5dGUob3Y1NjQwX2NsaWVudC0+YWRkciwgMHgzNTBiLCAmdG1wKTsKLQkJQ0RCRygiLS1DQU1FUkEtLSBHQUlOIFZBTFVFIDogJXhcbiIsIHRtcCk7Ci0JCWlmICgodG1wICYgMHg4MCkgPT0gMCkKLQkJCW92NTY0MF9zZXRfZmxhc2hfbGlnaHQoTEVEX09GRik7Ci0JCWVsc2UKLQkJCW92NTY0MF9zZXRfZmxhc2hfbGlnaHQoTEVEX0ZVTEwpOwotCX0KLQotCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX2NhcHR1cmVfdGJsKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBvdjU2NDBfc2V0dGluZyhlbnVtIG1zbV9zX3JlZ191cGRhdGUgcnVwZGF0ZSwKLQkJZW51bSBtc21fc19zZXR0aW5nIHJ0KQotewotCWludCByYyA9IC1FSU5WQUwsIHRtcDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9jc2lfcGFyYW1zIG92NTY0MF9jc2lfcGFyYW1zOwotCi0JQ0RCRygiLS1DQU1FUkEtLSAlcyAoU3RhcnQuLi4pLCBydXBkYXRlPSVkXG4iLCBfX2Z1bmNfXywgcnVwZGF0ZSk7Ci0KLQlzd2l0Y2ggKHJ1cGRhdGUpIHsKLQljYXNlIFNfVVBEQVRFX1BFUklPRElDOgotCQlpZiAoIU9WNTY0MF9DU0lfQ09ORklHKSB7Ci0JCQljYW1lcmFfc3dfcG93ZXJfb25vZmYoMCk7IC8qIHN0YW5kYnkgKi8KLQkJCW1zbGVlcCgyMCk7Ci0KLQkJCW92NTY0MF9jc2lfcGFyYW1zLmxhbmVfY250ID0gMjsKLQkJCW92NTY0MF9jc2lfcGFyYW1zLmRhdGFfZm9ybWF0ID0gQ1NJXzhCSVQ7Ci0JCQlvdjU2NDBfY3NpX3BhcmFtcy5sYW5lX2Fzc2lnbiA9IDB4ZTQ7Ci0JCQlvdjU2NDBfY3NpX3BhcmFtcy5kcGNtX3NjaGVtZSA9IDA7Ci0JCQlvdjU2NDBfY3NpX3BhcmFtcy5zZXR0bGVfY250ID0gMHg2OwotCi0JCQlDREJHKCIlczogbXNtX2NhbWlvX2NzaV9jb25maWdcbiIsIF9fZnVuY19fKTsKLQotCQkJcmMgPSBtc21fY2FtaW9fY3NpX2NvbmZpZygmb3Y1NjQwX2NzaV9wYXJhbXMpOwotCQkJbXNsZWVwKDIwKTsKLQkJCWNhbWVyYV9zd19wb3dlcl9vbm9mZigxKTsgLyogb24gKi8KLQkJCW1zbGVlcCgyMCk7Ci0KLQkJCU9WNTY0MF9DU0lfQ09ORklHID0gMTsKLQotCQl9IGVsc2UgewotCQkJcmMgPSAwOwotCQl9Ci0KLQkJaWYgKFNfUkVTX1BSRVZJRVcgPT0gcnQpCi0JCQlyYyA9IG92NTY0MF92aWRlb19jb25maWcoKTsKLQkJZWxzZSBpZiAoU19SRVNfQ0FQVFVSRSA9PSBydCkKLQkJCXJjID0gb3Y1NjQwX3NuYXBzaG90X2NvbmZpZygpOwotCi0JCWJyZWFrOyAvKiBVUERBVEVfUEVSSU9ESUMgKi8KLQotCWNhc2UgU19SRUdfSU5JVDoKLQkJQ0RCRygiLS1DQU1FUkEtLSBTX1JFR19JTklUIChTdGFydClcbiIpOwotCi0JCXJjID0gb3Y1NjQwX2kyY193cml0ZShvdjU2NDBfY2xpZW50LT5hZGRyLCAweDMxMDMsIDB4MTEsIDEwKTsKLQkJcmMgPSBvdjU2NDBfaTJjX3dyaXRlKG92NTY0MF9jbGllbnQtPmFkZHIsIDB4MzAwOCwgMHg4MiwgMTApOwotCQltc2xlZXAoMjApOwotCi0JCS8qIHNldCBzZW5zb3IgaW5pdCBzZXR0aW5nICovCi0JCUNEQkcoInNldCBzZW5zb3IgaW5pdCBzZXR0aW5nXG4iKTsKLQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRyhvdjU2NDBfaW5pdF90YmwpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlDREJHKCJzZW5zb3IgaW5pdCBzZXR0aW5nIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIHNldCBpbWFnZSBxdWFsaXR5IHNldHRpbmcgKi8KLQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRyhvdjU2NDBfaW5pdF9pcV90YmwpOwotCQlyYyA9IG92NTY0MF9pMmNfcmVhZF9ieXRlKG92NTY0MF9jbGllbnQtPmFkZHIsIDB4NDc0MCwgJnRtcCk7Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gaW5pdCAweDQ3NDAgdmFsdWU9MHgleFxuIiwgdG1wKTsKLQotCQlpZiAodG1wICE9IDB4MjEpIHsKLQkJCXJjID0gb3Y1NjQwX2kyY193cml0ZShvdjU2NDBfY2xpZW50LT5hZGRyLCAweDQ3NDAsCi0JCQkJCTB4MjEsIDEwKTsKLQkJCW1zbGVlcCgyMCk7Ci0JCQlyYyA9IG92NTY0MF9pMmNfcmVhZF9ieXRlKG92NTY0MF9jbGllbnQtPmFkZHIsCi0JCQkJCTB4NDc0MCwgJnRtcCk7Ci0JCQlDREJHKCItLUNBTUVSQS0tIFdHIDB4NDc0MCB2YWx1ZT0weCV4XG4iLCB0bXApOwotCQl9Ci0KLQkJQ0RCRygiLS1DQU1FUkEtLSBBRl9pbml0OiBvdjU2NDBfYWZpbml0ID0gJWRcbiIsCi0JCQkJb3Y1NjQwX2FmaW5pdCk7Ci0JCWlmIChvdjU2NDBfYWZpbml0ID09IDEpIHsKLQkJCXJjID0gb3Y1NjQwX2FmX3NldHRpbmcoKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlDREJHKCItLUNBTUVSQS0tIG92NTY0MF9hZl9zZXR0aW5nIGZhaWxlZFxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlvdjU2NDBfYWZpbml0ID0gMDsKLQkJfQotCi0JCS8qIHJlc2V0IGZwc19kaXZpZGVyICovCi0JCW92NTY0MF9jdHJsLT5mcHNfZGl2aWRlciA9IDEgKiAweDA0MDA7Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gU19SRUdfSU5JVCAoRW5kKVxuIik7Ci0JCWJyZWFrOyAvKiBjYXNlIFJFR19JTklUOiAqLwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfSAvKiBzd2l0Y2ggKHJ1cGRhdGUpICovCi0KLQlDREJHKCItLUNBTUVSQS0tICVzIChFbmQpLCBydXBkYXRlPSVkXG4iLCBfX2Z1bmNfXywgcnVwZGF0ZSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y1NjQwX3NlbnNvcl9vcGVuX2luaXQoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JaW50IHJjID0gLUVOT01FTTsKLQotCUNEQkcoIi0tQ0FNRVJBLS0gJXNcbiIsIF9fZnVuY19fKTsKLQlvdjU2NDBfY3RybCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBfX292NTY0MF9jdHJsKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFvdjU2NDBfY3RybCkgewotCQlDREJHKCItLUNBTUVSQS0tIGt6YWxsb2Mgb3Y1NjQwX2N0cmwgZXJyb3IgISFcbiIpOwotCQlrZnJlZShvdjU2NDBfY3RybCk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlvdjU2NDBfY3RybC0+ZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQlvdjU2NDBfY3RybC0+cGljdF9mcHNfZGl2aWRlciA9IDEgKiAweDAwMDAwNDAwOwotCW92NTY0MF9jdHJsLT5zZXRfdGVzdCA9IFNfVEVTVF9PRkY7Ci0Jb3Y1NjQwX2N0cmwtPnByZXZfcmVzID0gU19RVFJfU0laRTsKLQlvdjU2NDBfY3RybC0+cGljdF9yZXMgPSBTX0ZVTExfU0laRTsKLQotCWlmIChkYXRhKQotCQlvdjU2NDBfY3RybC0+c2Vuc29yZGF0YSA9IGRhdGE7Ci0KLQlvdjU2NDBfcG93ZXJfb2ZmKCk7Ci0KLQlDREJHKCIlczogbXNtX2NhbWlvX2Nsa19yYXRlX3NldFxuIiwgX19mdW5jX18pOwotCi0JbXNtX2NhbWlvX2Nsa19yYXRlX3NldCgyNDAwMDAwMCk7Ci0JbXNsZWVwKDIwKTsKLQotCW92NTY0MF9wb3dlcl9vbigpOwotCW92NTY0MF9wb3dlcl9yZXNldCgpOwotCi0JQ0RCRygiJXM6IGluaXQgc2VxdWVuY2VcbiIsIF9fZnVuY19fKTsKLQotCWlmIChvdjU2NDBfY3RybC0+cHJldl9yZXMgPT0gU19RVFJfU0laRSkKLQkJcmMgPSBvdjU2NDBfc2V0dGluZyhTX1JFR19JTklULCBTX1JFU19QUkVWSUVXKTsKLQllbHNlCi0JCXJjID0gb3Y1NjQwX3NldHRpbmcoU19SRUdfSU5JVCwgU19SRVNfQ0FQVFVSRSk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gJXMgOiBvdjU2NDBfc2V0dGluZyBmYWlsZWQuIHJjID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJa2ZyZWUob3Y1NjQwX2N0cmwpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JT1Y1NjQwX0NTSV9DT05GSUcgPSAwOwotCi0JQ0RCRygiLS1DQU1FUkEtLXJlX2luaXRfc2Vuc29yIG9rISFcbiIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBvdjU2NDBfc2Vuc29yX3JlbGVhc2Uodm9pZCkKLXsKLQlDREJHKCItLUNBTUVSQS0tb3Y1NjQwX3NlbnNvcl9yZWxlYXNlISFcbiIpOwotCi0JbXV0ZXhfbG9jaygmb3Y1NjQwX211dGV4KTsKLQotCW92NTY0MF9wb3dlcl9vZmYoKTsKLQotCWtmcmVlKG92NTY0MF9jdHJsKTsKLQlvdjU2NDBfY3RybCA9IE5VTEw7Ci0KLQlPVjU2NDBfQ1NJX0NPTkZJRyA9IDA7Ci0KLQltdXRleF91bmxvY2soJm92NTY0MF9tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBvdjU2NDBfaTJjX2lkW10gPSB7Ci0JeyJvdjU2NDAiLCAgMH0sIHt9Ci19OwotCi1zdGF0aWMgaW50IG92NTY0MF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y1NjQwX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JLyogSW5pdGlhbGl6ZSB0aGUgTVNNX0NBTUkyQyBDaGlwICovCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmb3Y1NjQwX3dhaXRfcXVldWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyBvdjU2NDBfc2V0X2VmZmVjdChpbnQgbW9kZSwgaW50IGVmZmVjdCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4oU3RhcnQpXG4iLCBfX2Z1bmNfXyk7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFNFTlNPUl9QUkVWSUVXX01PREU6Ci0JCS8qIENvbnRleHQgQSBTcGVjaWFsIEVmZmVjdHMgKi8KLQkJQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi5TRU5TT1JfUFJFVklFV19NT0RFXG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTRU5TT1JfU05BUFNIT1RfTU9ERToKLQkJLyogQ29udGV4dCBCIFNwZWNpYWwgRWZmZWN0cyAqLwotCQlDREJHKCItLUNBTUVSQS0tICVzIC4uLlNFTlNPUl9TTkFQU0hPVF9NT0RFXG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JZWZmZWN0X3ZhbHVlID0gZWZmZWN0OwotCi0Jc3dpdGNoIChlZmZlY3QpCXsKLQljYXNlIENBTUVSQV9FRkZFQ1RfT0ZGOgotCQlDREJHKCItLUNBTUVSQS0tICVzIC4uLkNBTUVSQV9FRkZFQ1RfT0ZGXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX2VmZmVjdF9ub3JtYWxfdGJsKTsKLQkJLyogZm9yIHJlY292ZXIgc2F0dXJhdGlvbiBsZXZlbCB3aGVuIGNoYW5nZSBzcGVjaWFsIGVmZmVjdCAqLwotCQlvdjU2NDBfaTJjX3dyaXRlKG92NTY0MF9jbGllbnQtPmFkZHIsIDB4NTU4Mywgb3Y1NjQwX1NBVF9VLAotCQkJCTEwKTsKLQkJLyogZm9yIHJlY292ZXIgc2F0dXJhdGlvbiBsZXZlbCB3aGVuIGNoYW5nZSBzcGVjaWFsIGVmZmVjdCAqLwotCQlvdjU2NDBfaTJjX3dyaXRlKG92NTY0MF9jbGllbnQtPmFkZHIsIDB4NTU4NCwgb3Y1NjQwX1NBVF9WLAotCQkJCTEwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9FRkZFQ1RfTU9OTzoKLQkJQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi5DQU1FUkFfRUZGRUNUX01PTk9cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRyhvdjU2NDBfZWZmZWN0X21vbm9fdGJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9FRkZFQ1RfQlc6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uQ0FNRVJBX0VGRkVDVF9CV1xuIiwgX19mdW5jX18pOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9lZmZlY3RfYndfdGJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9FRkZFQ1RfQkxVSVNIOgotCQlDREJHKCItLUNBTUVSQS0tICVzIC4uLkNBTUVSQV9FRkZFQ1RfQkxVSVNIXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX2VmZmVjdF9ibHVpc2hfdGJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9FRkZFQ1RfU09MQVJJWkU6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uQ0FNRVJBX0VGRkVDVF9ORUdBVElWRVxuIiwgX19mdW5jX18pOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9lZmZlY3Rfc29sYXJpemVfdGJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9FRkZFQ1RfU0VQSUE6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uQ0FNRVJBX0VGRkVDVF9TRVBJQVxuIiwgX19mdW5jX18pOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9lZmZlY3Rfc2VwaWFfdGJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9FRkZFQ1RfUkVERElTSDoKLQkJQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi5DQU1FUkFfRUZGRUNUX1JFRERJU0hcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRyhvdjU2NDBfZWZmZWN0X3JlZGRpc2hfdGJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9FRkZFQ1RfR1JFRU5JU0g6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uQ0FNRVJBX0VGRkVDVF9HUkVFTklTSFxuIiwgX19mdW5jX18pOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9lZmZlY3RfZ3JlZW5pc2hfdGJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9FRkZFQ1RfTkVHQVRJVkU6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uQ0FNRVJBX0VGRkVDVF9ORUdBVElWRVxuIiwgX19mdW5jX18pOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9lZmZlY3RfbmVnYXRpdmVfdGJsKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlDREJHKCItLUNBTUVSQS0tICVzIC4uLkRlZmF1bHQoTm90IFN1cHBvcnQpXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi0Jb3Y1NjQwX2VmZmVjdCA9IGVmZmVjdDsKLQkvKiBSZWZyZXNoIFNlcXVlbmNlciAqLwotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uKEVuZClcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y1NjQwX3NldF9icmlnaHRuZXNzKGludDhfdCBicmlnaHRuZXNzKQotewotCWludCByYyA9IDA7Ci0KLQlDREJHKCItLUNBTUVSQS0tICVzIC4uLihTdGFydClcbiIsIF9fZnVuY19fKTsKLQlDREJHKCItLUNBTUVSQS0tICVzIC4uLmJyaWdodG5lc3MgPSAlZFxuIiwgX19mdW5jX18gLCBicmlnaHRuZXNzKTsKLQotCXN3aXRjaCAoYnJpZ2h0bmVzcykgewotCWNhc2UgQ0FNRVJBX0JSSUdIVE5FU1NfTFYwOgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0JSSUdIVE5FU1NfTFYwXG4iKTsKLQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRyhvdjU2NDBfYnJpZ2h0bmVzc19sdjBfdGJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9CUklHSFRORVNTX0xWMToKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9CUklHSFRORVNTX0xWMVxuIik7Ci0JCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX2JyaWdodG5lc3NfbHYxX3RibCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1FUkFfQlJJR0hUTkVTU19MVjI6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfQlJJR0hUTkVTU19MVjJcbiIpOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9icmlnaHRuZXNzX2x2Ml90YmwpOwotCQlicmVhazsKLQotCWNhc2UgQ0FNRVJBX0JSSUdIVE5FU1NfTFYzOgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0JSSUdIVE5FU1NfTFYzXG4iKTsKLQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRyhvdjU2NDBfYnJpZ2h0bmVzc19sdjNfdGJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9CUklHSFRORVNTX0xWNDoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9CUklHSFRORVNTX0xWNFxuIik7Ci0JCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX2JyaWdodG5lc3NfZGVmYXVsdF9sdjRfdGJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9CUklHSFRORVNTX0xWNToKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9CUklHSFRORVNTX0xWNVxuIik7Ci0JCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX2JyaWdodG5lc3NfbHY1X3RibCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1FUkFfQlJJR0hUTkVTU19MVjY6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfQlJJR0hUTkVTU19MVjZcbiIpOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9icmlnaHRuZXNzX2x2Nl90YmwpOwotCQlicmVhazsKLQotCWNhc2UgQ0FNRVJBX0JSSUdIVE5FU1NfTFY3OgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0JSSUdIVE5FU1NfTFY3XG4iKTsKLQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRyhvdjU2NDBfYnJpZ2h0bmVzc19sdjdfdGJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9CUklHSFRORVNTX0xWODoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9CUklHSFRORVNTX0xWOFxuIik7Ci0JCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX2JyaWdodG5lc3NfbHY4X3RibCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9CUklHSFRORVNTX0VSUk9SIENPTU1BTkRcbiIpOwotCQlicmVhazsKLQl9Ci0KLQlDREJHKCItLUNBTUVSQS0tICVzIC4uLihFbmQpXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92NTY0MF9zZXRfY29udHJhc3QoaW50IGNvbnRyYXN0KQotewotCWludCByYyA9IDA7Ci0KLQlDREJHKCItLUNBTUVSQS0tICVzIC4uLihTdGFydClcbiIsIF9fZnVuY19fKTsKLQlDREJHKCItLUNBTUVSQS0tICVzIC4uLmNvbnRyYXN0ID0gJWRcbiIsIF9fZnVuY19fICwgY29udHJhc3QpOwotCi0JaWYgKGVmZmVjdF92YWx1ZSA9PSBDQU1FUkFfRUZGRUNUX09GRikgewotCQlzd2l0Y2ggKGNvbnRyYXN0KSB7Ci0JCWNhc2UgQ0FNRVJBX0NPTlRSQVNUX0xWMDoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfQ09OVFJBU1RfTFYwXG4iKTsKLQkJCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX2NvbnRyYXN0X2x2MF90YmwpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDQU1FUkFfQ09OVFJBU1RfTFYxOgotCQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9DT05UUkFTVF9MVjFcbiIpOwotCQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRyhvdjU2NDBfY29udHJhc3RfbHYxX3RibCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENBTUVSQV9DT05UUkFTVF9MVjI6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0NPTlRSQVNUX0xWMlxuIik7Ci0JCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9jb250cmFzdF9sdjJfdGJsKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0FNRVJBX0NPTlRSQVNUX0xWMzoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfQ09OVFJBU1RfTFYzXG4iKTsKLQkJCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX2NvbnRyYXN0X2x2M190YmwpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDQU1FUkFfQ09OVFJBU1RfTFY0OgotCQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9DT05UUkFTVF9MVjRcbiIpOwotCQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRygKLQkJCQkJb3Y1NjQwX2NvbnRyYXN0X2RlZmF1bHRfbHY0X3RibCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENBTUVSQV9DT05UUkFTVF9MVjU6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0NPTlRSQVNUX0xWNVxuIik7Ci0JCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9jb250cmFzdF9sdjVfdGJsKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0FNRVJBX0NPTlRSQVNUX0xWNjoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfQ09OVFJBU1RfTFY2XG4iKTsKLQkJCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX2NvbnRyYXN0X2x2Nl90YmwpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDQU1FUkFfQ09OVFJBU1RfTFY3OgotCQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9DT05UUkFTVF9MVjdcbiIpOwotCQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRyhvdjU2NDBfY29udHJhc3RfbHY3X3RibCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENBTUVSQV9DT05UUkFTVF9MVjg6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0NPTlRSQVNUX0xWOFxuIik7Ci0JCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9jb250cmFzdF9sdjhfdGJsKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0NPTlRSQVNUX0VSUk9SIENPTU1BTkRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlDREJHKCItLUNBTUVSQS0tICVzIC4uLihFbmQpXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92NTY0MF9zZXRfc2hhcnBuZXNzKGludCBzaGFycG5lc3MpCi17Ci0JaW50IHJjID0gMDsKLQotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uKFN0YXJ0KVxuIiwgX19mdW5jX18pOwotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uc2hhcnBuZXNzID0gJWRcbiIsIF9fZnVuY19fICwgc2hhcnBuZXNzKTsKLQotCWlmIChlZmZlY3RfdmFsdWUgPT0gQ0FNRVJBX0VGRkVDVF9PRkYpIHsKLQkJc3dpdGNoIChzaGFycG5lc3MpIHsKLQkJY2FzZSBDQU1FUkFfU0hBUlBORVNTX0xWMDoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0hBUlBORVNTX0xWMFxuIik7Ci0JCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9zaGFycG5lc3NfbHYwX3RibCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENBTUVSQV9TSEFSUE5FU1NfTFYxOgotCQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TSEFSUE5FU1NfTFYxXG4iKTsKLQkJCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX3NoYXJwbmVzc19sdjFfdGJsKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0FNRVJBX1NIQVJQTkVTU19MVjI6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1NIQVJQTkVTU19MVjJcbiIpOwotCQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRygKLQkJCQkJb3Y1NjQwX3NoYXJwbmVzc19kZWZhdWx0X2x2Ml90YmwpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDQU1FUkFfU0hBUlBORVNTX0xWMzoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0hBUlBORVNTX0xWM1xuIik7Ci0JCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9zaGFycG5lc3NfbHYzX3RibCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENBTUVSQV9TSEFSUE5FU1NfTFY0OgotCQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TSEFSUE5FU1NfTFY0XG4iKTsKLQkJCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX3NoYXJwbmVzc19sdjRfdGJsKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0FNRVJBX1NIQVJQTkVTU19MVjU6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1NIQVJQTkVTU19MVjVcbiIpOwotCQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRyhvdjU2NDBfc2hhcnBuZXNzX2x2NV90YmwpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDQU1FUkFfU0hBUlBORVNTX0xWNjoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0hBUlBORVNTX0xWNlxuIik7Ci0JCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9zaGFycG5lc3NfbHY2X3RibCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENBTUVSQV9TSEFSUE5FU1NfTFY3OgotCQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TSEFSUE5FU1NfTFY3XG4iKTsKLQkJCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX3NoYXJwbmVzc19sdjdfdGJsKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0FNRVJBX1NIQVJQTkVTU19MVjg6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1NIQVJQTkVTU19MVjhcbiIpOwotCQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRyhvdjU2NDBfc2hhcnBuZXNzX2x2OF90YmwpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0hBUlBORVNTX0VSUk9SIENPTU1BTkRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlDREJHKCItLUNBTUVSQS0tICVzIC4uLihFbmQpXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92NTY0MF9zZXRfc2F0dXJhdGlvbihpbnQgc2F0dXJhdGlvbikKLXsKLQlsb25nIHJjID0gMDsKLQotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uKFN0YXJ0KVxuIiwgX19mdW5jX18pOwotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uc2F0dXJhdGlvbiA9ICVkXG4iLCBfX2Z1bmNfXyAsIHNhdHVyYXRpb24pOwotCi0JaWYgKGVmZmVjdF92YWx1ZSA9PSBDQU1FUkFfRUZGRUNUX09GRikgewotCQlzd2l0Y2ggKHNhdHVyYXRpb24pIHsKLQkJY2FzZSBDQU1FUkFfU0FUVVJBVElPTl9MVjA6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1NBVFVSQVRJT05fTFYwXG4iKTsKLQkJCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX3NhdHVyYXRpb25fbHYwX3RibCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENBTUVSQV9TQVRVUkFUSU9OX0xWMToKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjFcbiIpOwotCQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRyhvdjU2NDBfc2F0dXJhdGlvbl9sdjFfdGJsKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0FNRVJBX1NBVFVSQVRJT05fTFYyOgotCQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TQVRVUkFUSU9OX0xWMlxuIik7Ci0JCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9zYXR1cmF0aW9uX2x2Ml90YmwpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDQU1FUkFfU0FUVVJBVElPTl9MVjM6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1NBVFVSQVRJT05fTFYzXG4iKTsKLQkJCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX3NhdHVyYXRpb25fbHYzX3RibCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENBTUVSQV9TQVRVUkFUSU9OX0xWNDoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjRcbiIpOwotCQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRygKLQkJCQkJb3Y1NjQwX3NhdHVyYXRpb25fZGVmYXVsdF9sdjRfdGJsKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0FNRVJBX1NBVFVSQVRJT05fTFY1OgotCQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TQVRVUkFUSU9OX0xWNVxuIik7Ci0JCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9zYXR1cmF0aW9uX2x2NV90YmwpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDQU1FUkFfU0FUVVJBVElPTl9MVjY6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1NBVFVSQVRJT05fTFY2XG4iKTsKLQkJCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcob3Y1NjQwX3NhdHVyYXRpb25fbHY2X3RibCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENBTUVSQV9TQVRVUkFUSU9OX0xWNzoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjdcbiIpOwotCQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRyhvdjU2NDBfc2F0dXJhdGlvbl9sdjdfdGJsKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0FNRVJBX1NBVFVSQVRJT05fTFY4OgotCQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TQVRVUkFUSU9OX0xWOFxuIik7Ci0JCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9zYXR1cmF0aW9uX2x2OF90YmwpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9FUlJPUiBDT01NQU5EXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogZm9yIHJlY292ZXIgc2F0dXJhdGlvbiBsZXZlbCB3aGVuIGNoYW5nZSBzcGVjaWFsIGVmZmVjdCAqLwotCXN3aXRjaCAoc2F0dXJhdGlvbikgewotCWNhc2UgQ0FNRVJBX1NBVFVSQVRJT05fTFYwOgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1NBVFVSQVRJT05fTFYwXG4iKTsKLQkJb3Y1NjQwX1NBVF9VID0gMHgwMDsKLQkJb3Y1NjQwX1NBVF9WID0gMHgwMDsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1FUkFfU0FUVVJBVElPTl9MVjE6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjFcbiIpOwotCQlvdjU2NDBfU0FUX1UgPSAweDEwOwotCQlvdjU2NDBfU0FUX1YgPSAweDEwOwotCQlicmVhazsKLQljYXNlIENBTUVSQV9TQVRVUkFUSU9OX0xWMjoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TQVRVUkFUSU9OX0xWMlxuIik7Ci0JCW92NTY0MF9TQVRfVSA9IDB4MjA7Ci0JCW92NTY0MF9TQVRfViA9IDB4MjA7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNRVJBX1NBVFVSQVRJT05fTFYzOgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1NBVFVSQVRJT05fTFYzXG4iKTsKLQkJb3Y1NjQwX1NBVF9VID0gMHgzMDsKLQkJb3Y1NjQwX1NBVF9WID0gMHgzMDsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1FUkFfU0FUVVJBVElPTl9MVjQ6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjRcbiIpOwotCQlvdjU2NDBfU0FUX1UgPSAweDQwOwotCQlvdjU2NDBfU0FUX1YgPSAweDQwOyAgICAgICAgICAgIGJyZWFrOwotCWNhc2UgQ0FNRVJBX1NBVFVSQVRJT05fTFY1OgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1NBVFVSQVRJT05fTFY1XG4iKTsKLQkJb3Y1NjQwX1NBVF9VID0gMHg1MDsKLQkJb3Y1NjQwX1NBVF9WID0gMHg1MDsgICAgICAgICAgICBicmVhazsKLQljYXNlIENBTUVSQV9TQVRVUkFUSU9OX0xWNjoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TQVRVUkFUSU9OX0xWNlxuIik7Ci0JCW92NTY0MF9TQVRfVSA9IDB4NjA7Ci0JCW92NTY0MF9TQVRfViA9IDB4NjA7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNRVJBX1NBVFVSQVRJT05fTFY3OgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1NBVFVSQVRJT05fTFY3XG4iKTsKLQkJb3Y1NjQwX1NBVF9VID0gMHg3MDsKLQkJb3Y1NjQwX1NBVF9WID0gMHg3MDsgICAgICAgICAgICBicmVhazsKLQljYXNlIENBTUVSQV9TQVRVUkFUSU9OX0xWODoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TQVRVUkFUSU9OX0xWOFxuIik7Ci0JCW92NTY0MF9TQVRfVSA9IDB4ODA7Ci0JCW92NTY0MF9TQVRfViA9IDB4ODA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9FUlJPUiBDT01NQU5EXG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4oRW5kKVxuIiwgX19mdW5jX18pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgb3Y1NjQwX3NldF9hbnRpYmFuZGluZyhpbnQgYW50aWJhbmRpbmcpCi17Ci0JbG9uZyByYyA9IDA7Ci0KLQlDREJHKCItLUNBTUVSQS0tICVzIC4uLihTdGFydClcbiIsICBfX2Z1bmNfXyk7Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi5hbnRpYmFuZGluZyA9ICVkXG4iLCAgX19mdW5jX18sIGFudGliYW5kaW5nKTsKLQotCXN3aXRjaCAoYW50aWJhbmRpbmcpIHsKLQljYXNlIENBTUVSQV9BTlRJQkFORElOR19PRkY6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfQU5USUJBTkRJTkdfT0ZGXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9BTlRJQkFORElOR182MEhaOgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0FOVElCQU5ESU5HXzYwSFpcbiIpOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9hbnRpYmFuZGluZ182MHpfdGJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9BTlRJQkFORElOR181MEhaOgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0FOVElCQU5ESU5HXzUwSFpcbiIpOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9hbnRpYmFuZGluZ181MHpfdGJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9BTlRJQkFORElOR19BVVRPOgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0FOVElCQU5ESU5HX0FVVE9cbiIpOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9hbnRpYmFuZGluZ19hdXRvX3RibCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9BTlRJQkFORElOR19FUlJPUiBDT01NQU5EXG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4oRW5kKVxuIiwgX19mdW5jX18pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgb3Y1NjQwX3NldF9leHBvc3VyZV9tb2RlKGludCBtb2RlKQotewotCWxvbmcgcmMgPSAwOwotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uKFN0YXJ0KVxuIiwgX19mdW5jX18pOwotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4ubW9kZSA9ICVkXG4iLCBfX2Z1bmNfXyAsIG1vZGUpOwotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uKEVuZClcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG92NTY0MF9sZW5zX3NoYWRpbmdfZW5hYmxlKHVpbnQ4X3QgaXNfZW5hYmxlKQotewotCWludDMyX3QgcmMgPSAwOwotCUNEQkcoIi0tQ0FNRVJBLS0lczogLi4uKFN0YXJ0KS4gZW5hYmxlID0gJWRcbiIsICBfX2Z1bmNfXywgaXNfZW5hYmxlKTsKLQotCWlmIChpc19lbmFibGUpIHsKLQkJQ0RCRygiJXM6IGVuYWJsZX4hIVxuIiwgX19mdW5jX18pOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9sZW5zX3NoYWRpbmdfb25fdGJsKTsKLQl9IGVsc2UgewotCQlDREJHKCIlczogZGlzYWJsZX4hIVxuIiwgX19mdW5jX18pOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF9sZW5zX3NoYWRpbmdfb2ZmX3RibCk7Ci0JfQotCUNEQkcoIi0tQ0FNRVJBLS0lczogLi4uKEVuZCkuIHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92NTY0MF9zZXRfc2Vuc29yX21vZGUoaW50IG1vZGUsIGludCByZXMpCi17Ci0JaW50IHJjID0gMDsKLQotCUNEQkcoIi0tQ0FNRVJBLS0gb3Y1NjQwX3NldF9zZW5zb3JfbW9kZSBtb2RlID0gJWQsIHJlcyA9ICVkXG4iLAotCQkJbW9kZSwgcmVzKTsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgU0VOU09SX1BSRVZJRVdfTU9ERToKLQkJQ0RCRygiLS1DQU1FUkEtLSBTRU5TT1JfUFJFVklFV19NT0RFXG4iKTsKLQkJcmMgPSBvdjU2NDBfc2V0dGluZyhTX1VQREFURV9QRVJJT0RJQywgU19SRVNfUFJFVklFVyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTRU5TT1JfU05BUFNIT1RfTU9ERToKLQkJQ0RCRygiLS1DQU1FUkEtLSBTRU5TT1JfU05BUFNIT1RfTU9ERVxuIik7Ci0JCXJjID0gb3Y1NjQwX3NldHRpbmcoU19VUERBVEVfUEVSSU9ESUMsIFNfUkVTX0NBUFRVUkUpOwotCQlicmVhazsKLQotCWNhc2UgU0VOU09SX1JBV19TTkFQU0hPVF9NT0RFOgotCQlDREJHKCItLUNBTUVSQS0tIFNFTlNPUl9SQVdfU05BUFNIT1RfTU9ERVxuIik7Ci0JCXJjID0gb3Y1NjQwX3NldHRpbmcoU19VUERBVEVfUEVSSU9ESUMsIFNfUkVTX0NBUFRVUkUpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1vdjU2NDBfc2V0X3NlbnNvcl9tb2RlIG5vIHN1cHBvcnRcbiIpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBvdjU2NDBfc2V0X3diX29lbSh1aW50OF90IHBhcmFtKQotewotCWludCByYyA9IDA7Ci0JdW5zaWduZWQgaW50IHRtcDI7Ci0KLQlDREJHKCJba3lsaW5dICVzIFxyXG4iLCBfX2Z1bmNfXyk7Ci0KLQlvdjU2NDBfaTJjX3JlYWRfYnl0ZShvdjU2NDBfY2xpZW50LT5hZGRyLCAweDM1MGIsICZ0bXAyKTsKLQlDREJHKCItLUNBTUVSQS0tIEdBSU4gVkFMVUUgOiAleFxuIiwgdG1wMik7Ci0KLQlzd2l0Y2ggKHBhcmFtKSB7Ci0JY2FzZSBDQU1FUkFfV0JfQVVUTzoKLQotCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1dCX0FVVE9cbiIpOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF93Yl9kZWYpOwotCQlicmVhazsKLQotCWNhc2UgQ0FNRVJBX1dCX0NVU1RPTToKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9XQl9DVVNUT01cbiIpOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF93Yl9jdXN0b20pOwotCQlicmVhazsKLQljYXNlIENBTUVSQV9XQl9JTkNBTkRFU0NFTlQ6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfV0JfSU5DQU5ERVNDRU5UXG4iKTsKLQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRyhvdjU2NDBfd2JfaW5jKTsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1FUkFfV0JfREFZTElHSFQ6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfV0JfREFZTElHSFRcbiIpOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF93Yl9kYXlsaWdodCk7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNRVJBX1dCX0NMT1VEWV9EQVlMSUdIVDoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9XQl9DTE9VRFlfREFZTElHSFRcbiIpOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKG92NTY0MF93Yl9jbG91ZHkpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92NTY0MF9zZXRfdG91Y2hhZWModWludDMyX3QgeCwgdWludDMyX3QgeSkKLXsKLQl1aW50OF90IGFlY19hcnJbOF0gPSB7MHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMX07Ci0JaW50IGlkeCA9IDA7Ci0JaW50IGk7Ci0KLQlDREJHKCJba3lsaW5dICVzIHg6ICVkICx5OiAlZFxyXG4iLCBfX2Z1bmNfXyAsIHgsIHkpOwotCWlkeCA9IHggLyAyICsgeSAqIDI7Ci0JQ0RCRygiW2t5bGluXSBpZHg6ICVkXHJcbiIsIGlkeCk7Ci0KLQlpZiAoeCAlIDIgPT0gMCkKLQkJYWVjX2FycltpZHhdID0gMHgxMCB8IDB4MGE7Ci0JZWxzZQotCQlhZWNfYXJyW2lkeF0gPSAweDAxIHwgMHhhMDsKLQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJQ0RCRygid3JpdGUgOiAleCB2YWwgOiAleCAiLCAweDU2ODggKyBpLCBhZWNfYXJyW2ldKTsKLQkJb3Y1NjQwX2kyY193cml0ZShvdjU2NDBfY2xpZW50LT5hZGRyLCAweDU2ODggKyBpLAotCQkJCWFlY19hcnJbaV0sIDEwKTsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBvdjU2NDBfc2V0X2V4cG9zdXJlX2NvbXBlbnNhdGlvbihpbnQgY29tcGVuc2F0aW9uKQotewotCWxvbmcgcmMgPSAwOwotCi0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4oU3RhcnQpXG4iLCBfX2Z1bmNfXyk7Ci0KLQlDREJHKCItLUNBTUVSQS0tICVzIC4uLmV4cG9zdXJlX2NvbXBlbnNhdGlvbiA9ICVkXG4iLCBfX2Z1bmNfXyAsCi0JCQkgICAgY29tcGVuc2F0aW9uKTsKLQotCXN3aXRjaCAoY29tcGVuc2F0aW9uKSB7Ci0JY2FzZSBDQU1FUkFfRVhQT1NVUkVfQ09NUEVOU0FUSU9OX0xWMDoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9FWFBPU1VSRV9DT01QRU5TQVRJT05fTFYwXG4iKTsKLQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRygKLQkJCQlvdjU2NDBfZXhwb3N1cmVfY29tcGVuc2F0aW9uX2x2MF90YmwpOwotCQlicmVhazsKLQotCWNhc2UgQ0FNRVJBX0VYUE9TVVJFX0NPTVBFTlNBVElPTl9MVjE6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfRVhQT1NVUkVfQ09NUEVOU0FUSU9OX0xWMVxuIik7Ci0JCXJjID0gT1Y1NjQwQ09SRV9XUklURVBSRUcoCi0JCQkJb3Y1NjQwX2V4cG9zdXJlX2NvbXBlbnNhdGlvbl9sdjFfdGJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9FWFBPU1VSRV9DT01QRU5TQVRJT05fTFYyOgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0VYUE9TVVJFX0NPTVBFTlNBVElPTl9MVjJcbiIpOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKAotCQkJICAgIG92NTY0MF9leHBvc3VyZV9jb21wZW5zYXRpb25fbHYyX2RlZmF1bHRfdGJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENBTUVSQV9FWFBPU1VSRV9DT01QRU5TQVRJT05fTFYzOgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0VYUE9TVVJFX0NPTVBFTlNBVElPTl9MVjNcbiIpOwotCQlyYyA9IE9WNTY0MENPUkVfV1JJVEVQUkVHKAotCQkJCW92NTY0MF9leHBvc3VyZV9jb21wZW5zYXRpb25fbHYzX3RibCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1FUkFfRVhQT1NVUkVfQ09NUEVOU0FUSU9OX0xWNDoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9FWFBPU1VSRV9DT01QRU5TQVRJT05fTFYzXG4iKTsKLQkJcmMgPSBPVjU2NDBDT1JFX1dSSVRFUFJFRygKLQkJCQlvdjU2NDBfZXhwb3N1cmVfY29tcGVuc2F0aW9uX2x2NF90YmwpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1FUlJPUiBDQU1FUkFfRVhQT1NVUkVfQ09NUEVOU0FUSU9OXG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4oRW5kKVxuIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92NTY0MF9zZW5zb3Jfc3RhcnRfYWYodm9pZCkKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBpbnQgYWZfc3QgPSAwOwotCXVuc2lnbmVkIGludCBhZl9hY2sgPSAwOwotCXVuc2lnbmVkIGludCB0bXAgPSAwOwotCWludCByYyA9IDA7Ci0KLQlDREJHKCItLUNBTUVSQS0tICVzIChTdGFydC4uLilcbiIsIF9fZnVuY19fKTsKLQotCW92NTY0MF9pMmNfcmVhZF9ieXRlKG92NTY0MF9jbGllbnQtPmFkZHIsCi0JCQlPVjU2NDBfQ01EX0ZXX1NUQVRVUywgJmFmX3N0KTsKLQlDREJHKCItLUNBTUVSQS0tICVzIGFmX3N0ID0gJWRcbiIsIF9fZnVuY19fLCBhZl9zdCk7Ci0KLQlvdjU2NDBfaTJjX3dyaXRlKG92NTY0MF9jbGllbnQtPmFkZHIsIE9WNTY0MF9DTURfQUNLLCAweDAxLCAxMCk7Ci0Jb3Y1NjQwX2kyY193cml0ZShvdjU2NDBfY2xpZW50LT5hZGRyLCBPVjU2NDBfQ01EX01BSU4sIDB4MDMsIDEwKTsKLQotCWZvciAoaSA9IDA7IGkgPCA1MDsgaSsrKSB7Ci0JCW92NTY0MF9pMmNfcmVhZF9ieXRlKG92NTY0MF9jbGllbnQtPmFkZHIsCi0JCQkJT1Y1NjQwX0NNRF9BQ0ssICZhZl9hY2spOwotCQlpZiAoYWZfYWNrID09IDApCi0JCQlicmVhazsKLQkJbXNsZWVwKDUwKTsKLQl9Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyBhZl9hY2sgPSAweCV4XG4iLCBfX2Z1bmNfXywgYWZfYWNrKTsKLQotCW92NTY0MF9pMmNfcmVhZF9ieXRlKG92NTY0MF9jbGllbnQtPmFkZHIsIE9WNTY0MF9DTURfRldfU1RBVFVTLAotCQkJJmFmX3N0KTsKLQlDREJHKCItLUNBTUVSQS0tICVzIGFmX3N0ID0gJWRcbiIsIF9fZnVuY19fLCBhZl9zdCk7Ci0KLQlpZiAoYWZfc3QgPT0gMHgxMCkgewotCQlDREJHKCItLUNBTUVSQS0tICVzIEFGIG9rIGFuZCByZWxlYXNlIEFGIHNldHRpbmd+ISFcbiIsCi0JCQkJX19mdW5jX18pOwotCX0gZWxzZSB7Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gJXMgQUYgbm90IHJlYWR5ISFcbiIsIF9fZnVuY19fKTsKLQl9Ci0KLQlvdjU2NDBfaTJjX3dyaXRlKG92NTY0MF9jbGllbnQtPmFkZHIsIE9WNTY0MF9DTURfQUNLLCAweDAxLCAxMCk7Ci0Jb3Y1NjQwX2kyY193cml0ZShvdjU2NDBfY2xpZW50LT5hZGRyLCBPVjU2NDBfQ01EX01BSU4sIDB4MDcsIDEwKTsKLQotCWZvciAoaSA9IDA7IGkgPCA3MDsgaSsrKSB7Ci0JCW92NTY0MF9pMmNfcmVhZF9ieXRlKG92NTY0MF9jbGllbnQtPmFkZHIsIE9WNTY0MF9DTURfQUNLLAotCQkJCSZhZl9hY2spOwotCQlpZiAoYWZfYWNrID09IDApCi0JCQlicmVhazsKLQkJbXNsZWVwKDI1KTsKLQl9Ci0KLQlvdjU2NDBfaTJjX3JlYWRfYnl0ZShvdjU2NDBfY2xpZW50LT5hZGRyLCBPVjU2NDBfQ01EX1BBUkEwLCAmdG1wKTsKLQlDREJHKCIweDMwMjQgPSAleFxuIiwgdG1wKTsKLQlyYyA9ICgodG1wID09IDApID8gMSA6IDApOwotCi0Jb3Y1NjQwX2kyY19yZWFkX2J5dGUob3Y1NjQwX2NsaWVudC0+YWRkciwgT1Y1NjQwX0NNRF9QQVJBMSwgJnRtcCk7Ci0JQ0RCRygiMHgzMDI1ID0gJXhcbiIsIHRtcCk7Ci0JcmMgPSAoKHRtcCA9PSAwKSA/IDEgOiAwKTsKLQotCW92NTY0MF9pMmNfcmVhZF9ieXRlKG92NTY0MF9jbGllbnQtPmFkZHIsIE9WNTY0MF9DTURfUEFSQTIsICZ0bXApOwotCUNEQkcoIjB4MzAyNiA9ICV4XG4iLCB0bXApOwotCXJjID0gKCh0bXAgPT0gMCkgPyAxIDogMCk7Ci0KLQlvdjU2NDBfaTJjX3JlYWRfYnl0ZShvdjU2NDBfY2xpZW50LT5hZGRyLCBPVjU2NDBfQ01EX1BBUkEzLCAmdG1wKTsKLQlDREJHKCIweDMwMjcgPSAleFxuIiwgdG1wKTsKLQlyYyA9ICgodG1wID09IDApID8gMSA6IDApIDsKLQotCW92NTY0MF9pMmNfcmVhZF9ieXRlKG92NTY0MF9jbGllbnQtPmFkZHIsIE9WNTY0MF9DTURfUEFSQTQsICZ0bXApOwotCUNEQkcoIjB4MzAyOCA9ICV4XG4iLCB0bXApOwotCXJjID0gKCh0bXAgPT0gMCkgPyAxIDogMCkgOwotCi0JQ0RCRygiLS1DQU1FUkEtLSAlcyByYyA9ICVkKEVuZC4uLilcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92NTY0MF9zZW5zb3JfY29uZmlnKHZvaWQgX191c2VyICphcmdwKQotewotCXN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEgY2RhdGE7Ci0JbG9uZyByYyA9IDA7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmNkYXRhLCAodm9pZCAqKWFyZ3AsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlDREJHKCItLUNBTUVSQS0tICVzICVkXG4iLCBfX2Z1bmNfXywgY2RhdGEuY2ZndHlwZSk7Ci0KLQltdXRleF9sb2NrKCZvdjU2NDBfbXV0ZXgpOwotCi0Jc3dpdGNoIChjZGF0YS5jZmd0eXBlKSB7Ci0JY2FzZSBDRkdfU0VUX01PREU6Ci0JCXJjID0gb3Y1NjQwX3NldF9zZW5zb3JfbW9kZShjZGF0YS5tb2RlLCBjZGF0YS5ycyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX0VGRkVDVDoKLQkJQ0RCRygiLS1DQU1FUkEtLSBDRkdfU0VUX0VGRkVDVCBtb2RlPSVkLCIKLQkJCQkiZWZmZWN0ID0gJWQgISFcbiIsIGNkYXRhLm1vZGUsCi0JCQkJY2RhdGEuY2ZnLmVmZmVjdCk7Ci0JCXJjID0gb3Y1NjQwX3NldF9lZmZlY3QoY2RhdGEubW9kZSwgY2RhdGEuY2ZnLmVmZmVjdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU1RBUlQ6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX1NUQVJUIChOb3QgU3VwcG9ydCkgISFcbiIpOwotCQkvKiBOb3QgU3VwcG9ydCAqLwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1BXUl9VUDoKLQkJQ0RCRygiLS1DQU1FUkEtLSBDRkdfUFdSX1VQIChOb3QgU3VwcG9ydCkgISFcbiIpOwotCQkvKiBOb3QgU3VwcG9ydCAqLwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1BXUl9ET1dOOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19QV1JfRE9XTiAoTm90IFN1cHBvcnQpXG4iKTsKLQkJb3Y1NjQwX3Bvd2VyX29mZigpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1NFVF9ERUZBVUxUX0ZPQ1VTOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19TRVRfREVGQVVMVF9GT0NVUyAoTm90IEltcGxlbWVudCkgISFcbiIpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX01PVkVfRk9DVVM6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX01PVkVfRk9DVVMgKE5vdCBJbXBsZW1lbnQpICEhXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfQlJJR0hUTkVTUzoKLQkJQ0RCRygiLS1DQU1FUkEtLSBDRkdfU0VUX0JSSUdIVE5FU1MgICEhXG4iKTsKLQkJcmMgPSBvdjU2NDBfc2V0X2JyaWdodG5lc3MoY2RhdGEuY2ZnLmJyaWdodG5lc3MpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1NFVF9DT05UUkFTVDoKLQkJQ0RCRygiLS1DQU1FUkEtLSBDRkdfU0VUX0NPTlRSQVNUICAhIVxuIik7Ci0JCXJjID0gb3Y1NjQwX3NldF9jb250cmFzdChjZGF0YS5jZmcuY29udHJhc3QpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1NFVF9FWFBPU1VSRV9NT0RFOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19TRVRfRVhQT1NVUkVfTU9ERSAhIVxuIik7Ci0JCXJjID0gb3Y1NjQwX3NldF9leHBvc3VyZV9tb2RlKGNkYXRhLmNmZy5hZV9tb2RlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfQU5USUJBTkRJTkc6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX1NFVF9BTlRJQkFORElORyBhbnRpYmFuZGluZyA9ICVkISFcbiIsCi0JCQkJY2RhdGEuY2ZnLmFudGliYW5kaW5nKTsKLQkJcmMgPSBvdjU2NDBfc2V0X2FudGliYW5kaW5nKGNkYXRhLmNmZy5hbnRpYmFuZGluZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX0xFTlNfU0hBRElORzoKLQkJQ0RCRygiLS1DQU1FUkEtLSBDRkdfU0VUX0xFTlNfU0hBRElORyAhIVxuIik7Ci0JCXJjID0gb3Y1NjQwX2xlbnNfc2hhZGluZ19lbmFibGUoCi0JCQkJY2RhdGEuY2ZnLmxlbnNfc2hhZGluZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX1NBVFVSQVRJT046Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX1NFVF9TQVRVUkFUSU9OICEhXG4iKTsKLQkJcmMgPSBvdjU2NDBfc2V0X3NhdHVyYXRpb24oY2RhdGEuY2ZnLnNhdHVyYXRpb24pOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1NFVF9TSEFSUE5FU1M6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX1NFVF9TSEFSUE5FU1MgISFcbiIpOwotCQlyYyA9IG92NTY0MF9zZXRfc2hhcnBuZXNzKGNkYXRhLmNmZy5zaGFycG5lc3MpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1NFVF9XQjoKLQkJQ0RCRygiLS1DQU1FUkEtLSBDRkdfU0VUX1dCISFcbiIpOwotCQlvdjU2NDBfc2V0X3diX29lbShjZGF0YS5jZmcud2JfdmFsKTsKLQkJcmMgPSAwIDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfVE9VQ0hBRUM6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX1NFVF9UT1VDSEFFQyEhXG4iKTsKLQkJb3Y1NjQwX3NldF90b3VjaGFlYyhjZGF0YS5jZmcuYWVjX2NvcmQueCwKLQkJCQljZGF0YS5jZmcuYWVjX2NvcmQueSk7Ci0JCXJjID0gMCA7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX0FVVE9fRk9DVVM6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX1NFVF9BVVRPX0ZPQ1VTICFcbiIpOwotCQlyYyA9IG92NTY0MF9zZW5zb3Jfc3RhcnRfYWYoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfQVVUT0ZMQVNIOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19TRVRfQVVUT0ZMQVNIICFcbiIpOwotCQlpc19hdXRvZmxhc2ggPSBjZGF0YS5jZmcuaXNfYXV0b2ZsYXNoOwotCQlDREJHKCJba3lsaW5dIGlzIGF1dG9mbGFzaCAlZFxyXG4iLCBpc19hdXRvZmxhc2gpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX0VYUE9TVVJFX0NPTVBFTlNBVElPTjoKLQkJQ0RCRygiLS1DQU1FUkEtLSBDRkdfU0VUX0VYUE9TVVJFX0NPTVBFTlNBVElPTiAhXG4iKTsKLQkJcmMgPSBvdjU2NDBfc2V0X2V4cG9zdXJlX2NvbXBlbnNhdGlvbigKLQkJCQljZGF0YS5jZmcuZXhwX2NvbXBlbnNhdGlvbik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJQ0RCRygiJXM6IENvbW1hbmQ9JWQgKE5vdCBJbXBsZW1lbnQpISFcbiIsIF9fZnVuY19fLAotCQkJCWNkYXRhLmNmZ3R5cGUpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotCW11dGV4X3VubG9jaygmb3Y1NjQwX211dGV4KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBvdjU2NDBfaTJjX2RyaXZlciA9IHsKLQkuaWRfdGFibGUgPSBvdjU2NDBfaTJjX2lkLAotCS5wcm9iZSAgPSBvdjU2NDBfaTJjX3Byb2JlLAotCS5yZW1vdmUgPSBvdjU2NDBfaTJjX3JlbW92ZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJvdjU2NDAiLAotCX0sCi19OwotCi1zdGF0aWMgaW50IG92NTY0MF9wcm9iZV9pbml0X2dwaW8oY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JaW50IHJjID0gMDsKLQotCUNEQkcoIi0tQ0FNRVJBLS0gJXNcbiIsIF9fZnVuY19fKTsKLQotCW92NTY0MF9wd2RuX2dwaW8gPSBkYXRhLT5zZW5zb3JfcHdkOwotCW92NTY0MF9yZXNldF9ncGlvID0gZGF0YS0+c2Vuc29yX3Jlc2V0OwotCW92NTY0MF9kcml2ZXJfcHdkbl9ncGlvID0gZGF0YS0+dmNtX3B3ZCA7Ci0KLQlpZiAoZGF0YS0+dmNtX2VuYWJsZSkKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnZjbV9wd2QsIDEpOwotCi0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnNlbnNvcl9yZXNldCwgMSk7Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnNlbnNvcl9wd2QsIDEpOwotCi0JcmV0dXJuIHJjOwotCi19Ci0KLXN0YXRpYyB2b2lkIG92NTY0MF9wcm9iZV9mcmVlX2dwaW8oY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JZ3Bpb19mcmVlKG92NTY0MF9wd2RuX2dwaW8pOwotCWdwaW9fZnJlZShvdjU2NDBfcmVzZXRfZ3Bpbyk7Ci0KLQlpZiAoZGF0YS0+dmNtX2VuYWJsZSkgewotCQlncGlvX2ZyZWUob3Y1NjQwX2RyaXZlcl9wd2RuX2dwaW8pOwotCQlvdjU2NDBfZHJpdmVyX3B3ZG5fZ3BpbyA9IDB4RkYgOwotCX0KLQotCW92NTY0MF9wd2RuX2dwaW8JPSAweEZGOwotCW92NTY0MF9yZXNldF9ncGlvCT0gMHhGRjsKLX0KLQotc3RhdGljIGludCBvdjU2NDBfc2Vuc29yX3Byb2JlKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICppbmZvLAotCQlzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsICpzKQotewotCWludCByYyA9IC1FTk9UU1VQUDsKLQotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgKFN0YXJ0Li4uKVxuIiwgX19mdW5jX18pOwotCXJjID0gaTJjX2FkZF9kcml2ZXIoJm92NTY0MF9pMmNfZHJpdmVyKTsKLQlDREJHKCItLUNBTUVSQS0tIGkyY19hZGRfZHJpdmVyIHJldDoweCV4LG92NTY0MF9jbGllbnQ9MHgleFxuIiwKLQkJCXJjLCAodW5zaWduZWQgaW50KW92NTY0MF9jbGllbnQpOwotCWlmICgocmMgPCAwKSB8fCAob3Y1NjQwX2NsaWVudCA9PSBOVUxMKSkgewotCQlDREJHKCItLUNBTUVSQS0tIGkyY19hZGRfZHJpdmVyIEZBSUxTISFcbiIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBvdjU2NDBfcHJvYmVfaW5pdF9ncGlvKGluZm8pOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCW92NTY0MF9wb3dlcl9vZmYoKTsKLQotCS8qIFNFTlNPUiBORUVEIE1DTEsgVE8gRE8gSTJDIENPTU1VTklDVElPTiwgT1BFTiBDTEsgRklSU1QqLwotCW1zbV9jYW1pb19jbGtfcmF0ZV9zZXQoMjQwMDAwMDApOwotCi0JbXNsZWVwKDIwKTsKLQotCW92NTY0MF9wb3dlcl9vbigpOwotCW92NTY0MF9wb3dlcl9yZXNldCgpOwotCi0JcmMgPSBvdjU2NDBfcHJvYmVfcmVhZElEKGluZm8pOwotCi0JaWYgKHJjIDwgMCkgewotCQlDREJHKCItLUNBTUVSQS0tb3Y1NjQwX3Byb2JlX3JlYWRJRCBGYWlsICEhfn5+fiEhXG4iKTsKLQkJQ0RCRygiLS1DQU1FUkEtLSAlcywgdW5yZWdpc3RlclxuIiwgX19mdW5jX18pOwotCQlpMmNfZGVsX2RyaXZlcigmb3Y1NjQwX2kyY19kcml2ZXIpOwotCQlvdjU2NDBfcG93ZXJfb2ZmKCk7Ci0JCW92NTY0MF9wcm9iZV9mcmVlX2dwaW8oaW5mbyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlzLT5zX2luaXQJCT0gb3Y1NjQwX3NlbnNvcl9vcGVuX2luaXQ7Ci0Jcy0+c19yZWxlYXNlCQk9IG92NTY0MF9zZW5zb3JfcmVsZWFzZTsKLQlzLT5zX2NvbmZpZwkJPSBvdjU2NDBfc2Vuc29yX2NvbmZpZzsKLQlzLT5zX2NhbWVyYV90eXBlCT0gQkFDS19DQU1FUkFfMkQ7Ci0Jcy0+c19tb3VudF9hbmdsZQk9IGluZm8tPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5tb3VudF9hbmdsZTsKLQotCW92NTY0MF9wb3dlcl9vZmYoKTsKLQotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgKEVuZC4uLilcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y1NjQwX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4gKFN0YXJ0Li4uKVxuIiwgX19mdW5jX18pOwotCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKLQkJQ0RCRygiLS1DQU1FUkEtLWkyY19jaGVja19mdW5jdGlvbmFsaXR5IGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW92NTY0MF9zZW5zb3J3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG92NTY0MF93b3JrKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFvdjU2NDBfc2Vuc29ydykgewotCQlDREJHKCItLUNBTUVSQS0ta3phbGxvYyBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBvdjU2NDBfc2Vuc29ydyk7Ci0Jb3Y1NjQwX2luaXRfY2xpZW50KGNsaWVudCk7Ci0Jb3Y1NjQwX2NsaWVudCA9IGNsaWVudDsKLQotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uIChFbmQuLi4pXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19vdjU2NDBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gbXNtX2NhbWVyYV9kcnZfc3RhcnQocGRldiwgb3Y1NjQwX3NlbnNvcl9wcm9iZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9jYW1lcmFfZHJpdmVyID0gewotCS5wcm9iZQk9IF9fb3Y1NjQwX3Byb2JlLAotCS5kcml2ZXIJPSB7Ci0JCS5uYW1lCT0gIm1zbV9jYW1lcmFfb3Y1NjQwIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG92NTY0MF9pbml0KHZvaWQpCi17Ci0Jb3Y1NjQwX2kyY19idWZbMF0gPSAweDVBOwotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9jYW1lcmFfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQob3Y1NjQwX2luaXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk9WNTY0MCBZVVYgTUlQSSBzZW5zb3IgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvb3Y1NjQwLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvb3Y1NjQwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MjhkYTYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL292NTY0MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk5MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotCi0vKgotW1NFTlNPUl0KLVNlbnNvciBNb2RlbDogICBPVjU2NDAKLUNhbWVyYSBNb2R1bGU6Ci1MZW5zIE1vZGVsOgotRHJpdmVyIElDOgotUFYgU2l6ZSAgICAgICAgID0gNjQwIHggNDgwCi1DYXAgU2l6ZSAgICAgICAgPSAyNTkyIHggMTk0NAotT3V0cHV0IEZvcm1hdCAgID0gWVVZVgotTUNMSyBTcGVlZCAgICAgID0gMjRNCi1QViBEVlBfUENMSyAgICAgPSAyOE0KLUNhcCBEVlBfUENMSyAgICA9IDU2TQotUFYgRnJhbWUgUmF0ZSAgID0gMzBmcHMKLUNhcCBGcmFtZSBSYXRlICA9IDcuNWZwcwotSTJDIFNsYXZlIElEICAgID0gMHg3OAotSTJDIE1vZGUgICAgICAgID0gMTZBZGRyLCA4RGF0YQotKi8KLQotI2lmbmRlZiBDQU1TRU5TT1JfT1Y1NjQwCi0jZGVmaW5lIENBTVNFTlNPUl9PVjU2NDAKLQotI2RlZmluZSBJTlZNQVNLKHYpICAoMHhmZi12KQotI2RlZmluZSBPVjU2NDBDT1JFX1dSSVRFUFJFRyhQVEJMKQlvdjU2NDBfd3JpdGVwcmVncyhQVEJMLFwKLQkJCQkJc2l6ZW9mKFBUQkwpL3NpemVvZihQVEJMWzBdKSkKLQotLyogT1YgU0VOU09SIFNDQ0IgKi8KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIHsKLQl1aW50MTZfdCBhZGRyOwotCXVpbnQ4X3QgZGF0YTsKLQl1aW50OF90IG1hc2s7Ci19OwotCi0vKiBBdXRvIEZvY3VzIENvbW1hbmQgKi8KLSNkZWZpbmUgT1Y1NjQwX0NNRF9NQUlOIDB4MzAyMgotI2RlZmluZSBPVjU2NDBfQ01EX0FDSyAweDMwMjMKLSNkZWZpbmUgT1Y1NjQwX0NNRF9QQVJBMCAweDMwMjQKLSNkZWZpbmUgT1Y1NjQwX0NNRF9QQVJBMSAweDMwMjUKLSNkZWZpbmUgT1Y1NjQwX0NNRF9QQVJBMiAweDMwMjYKLSNkZWZpbmUgT1Y1NjQwX0NNRF9QQVJBMyAweDMwMjcKLSNkZWZpbmUgT1Y1NjQwX0NNRF9QQVJBNCAweDMwMjgKLSNkZWZpbmUgT1Y1NjQwX0NNRF9GV19TVEFUVVMgMHgzMDI5Ci0KLS8qIFNlbnNvciBJRCAqLwotI2RlZmluZSBPVjU2NDBfU0VOU09SX0lEIDB4NTY0MAotCi0jZGVmaW5lIGNhcHR1cmVfZnJhbWVyYXRlIDc1MCAgICAgLyogNy41ZnBzIGNhcHR1cmUgZnJhbWUgcmF0ZSAqLwotI2RlZmluZSBnX3ByZXZpZXdfZnJhbWVSYXRlIDMwMDAgIC8qIDMwZnBzIHByZXZpZXcgZnJhbWUgcmF0ZSAqLwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfaW5pdF90YmxbXSA9IHsKLQl7MHgzMDA4LCAweDQyfSwKLQl7MHgzMTAzLCAweDAzfSwKLQl7MHgzMDE3LCAweDAwfSwKLQl7MHgzMDE4LCAweDAwfSwKLQl7MHgzMDM0LCAweDE4fSwKLQl7MHgzMDM1LCAweDE0fSwKLQl7MHgzMDM2LCAweDM4fSwKLQl7MHgzMDM3LCAweDEzfSwKLQl7MHgzMTA4LCAweDAxfSwKLQl7MHgzNjMwLCAweDM2fSwKLQl7MHgzNjMxLCAweDBlfSwKLQl7MHgzNjMyLCAweGUyfSwKLQl7MHgzNjMzLCAweDEyfSwKLQl7MHgzNjIxLCAweGUwfSwKLQl7MHgzNzA0LCAweGEwfSwKLQl7MHgzNzAzLCAweDVhfSwKLQl7MHgzNzE1LCAweDc4fSwKLQl7MHgzNzE3LCAweDAxfSwKLQl7MHgzNzBiLCAweDYwfSwKLQl7MHgzNzA1LCAweDFhfSwKLQl7MHgzOTA1LCAweDAyfSwKLQl7MHgzOTA2LCAweDEwfSwKLQl7MHgzOTAxLCAweDBhfSwKLQl7MHgzNzMxLCAweDEyfSwKLQl7MHgzNjAwLCAweDA4fSwKLQl7MHgzNjAxLCAweDMzfSwKLQl7MHgzMDJkLCAweDYwfSwKLQl7MHgzNjIwLCAweDUyfSwKLQl7MHgzNzFiLCAweDIwfSwKLQl7MHg0NzFjLCAweDUwfSwKLQl7MHgzYTEzLCAweDQzfSwKLQl7MHgzYTE4LCAweDAwfSwKLQl7MHgzYTE5LCAweGY4fSwKLQl7MHgzNjM1LCAweDEzfSwKLQl7MHgzNjM2LCAweDAzfSwKLQl7MHgzNjM0LCAweDQwfSwKLQl7MHgzNjIyLCAweDAxfSwKLQl7MHgzYzAxLCAweDM0fSwKLQl7MHgzYzA0LCAweDI4fSwKLQl7MHgzYzA1LCAweDk4fSwKLQl7MHgzYzA2LCAweDAwfSwKLQl7MHgzYzA3LCAweDA4fSwKLQl7MHgzYzA4LCAweDAwfSwKLQl7MHgzYzA5LCAweDFjfSwKLQl7MHgzYzBhLCAweDljfSwKLQl7MHgzYzBiLCAweDQwfSwKLQl7MHgzODIwLCAweDQxfSwKLQl7MHgzODIxLCAweDA3fSwKLQl7MHgzODE0LCAweDMxfSwKLQl7MHgzODE1LCAweDMxfSwKLQl7MHgzODAwLCAweDAwfSwKLQl7MHgzODAxLCAweDAwfSwKLQl7MHgzODAyLCAweDAwfSwKLQl7MHgzODAzLCAweDA0fSwKLQl7MHgzODA0LCAweDBhfSwKLQl7MHgzODA1LCAweDNmfSwKLQl7MHgzODA2LCAweDA3fSwKLQl7MHgzODA3LCAweDlifSwKLQl7MHgzODA4LCAweDAyfSwKLQl7MHgzODA5LCAweDgwfSwKLQl7MHgzODBhLCAweDAxfSwKLQl7MHgzODBiLCAweGUwfSwKLQl7MHgzODBjLCAweDA3fSwKLQl7MHgzODBkLCAweDY4fSwKLQl7MHgzODBlLCAweDAzfSwKLQl7MHgzODBmLCAweGQ4fSwKLQl7MHgzODEwLCAweDAwfSwKLQl7MHgzODExLCAweDEwfSwKLQl7MHgzODEyLCAweDAwfSwKLQl7MHgzODEzLCAweDA2fSwKLQl7MHgzNjE4LCAweDAwfSwKLQl7MHgzNjEyLCAweDI5fSwKLQl7MHgzNzA4LCAweDY0fSwKLQl7MHgzNzA5LCAweDUyfSwKLQl7MHgzNzBjLCAweDAzfSwKLQl7MHgzYTAyLCAweDAzfSwKLQl7MHgzYTAzLCAweGQ4fSwKLQl7MHgzYTA4LCAweDAxfSwKLQl7MHgzYTA5LCAweDI3fSwKLQl7MHgzYTBhLCAweDAwfSwKLQl7MHgzYTBiLCAweGY2fSwKLQl7MHgzYTBlLCAweDAzfSwKLQl7MHgzYTBkLCAweDA0fSwKLQl7MHgzYTE0LCAweDAzfSwKLQl7MHgzYTE1LCAweGQ4fSwKLQl7MHg0MDAxLCAweDAyfSwKLQl7MHg0MDA0LCAweDAyfSwKLQl7MHgzMDAwLCAweDAwfSwKLQl7MHgzMDAyLCAweDFjfSwKLQl7MHgzMDA0LCAweGZmfSwKLQl7MHgzMDA2LCAweGMzfSwKLQl7MHgzMDBlLCAweDQ1fSwKLQl7MHgzMDJlLCAweDA4fSwKLQl7MHg0MzAwLCAweDMwfSwKLQl7MHg1MDFmLCAweDAwfSwKLQl7MHg0NzEzLCAweDAzfSwKLQl7MHg0NDA3LCAweDA0fSwKLQl7MHg0NDBlLCAweDAwfSwKLQl7MHg0NjBiLCAweDM1fSwKLQl7MHg0NjBjLCAweDIyfSwKLQl7MHg0ODM3LCAweDQ0fSwKLQl7MHgzODI0LCAweDAyfSwKLQl7MHg1MDAwLCAweGE3fSwKLQl7MHg1MDAxLCAweGEzfSwKLQl7MHg1MTgwLCAweGZmfSwKLQl7MHg1MTgxLCAweGYyfSwKLQl7MHg1MTgyLCAweDAwfSwKLQl7MHg1MTgzLCAweDE0fSwKLQl7MHg1MTg0LCAweDI1fSwKLQl7MHg1MTg1LCAweDI0fSwKLQl7MHg1MTg2LCAweDA5fSwKLQl7MHg1MTg3LCAweDA5fSwKLQl7MHg1MTg4LCAweDA5fSwKLQl7MHg1MTg5LCAweDc1fSwKLQl7MHg1MThhLCAweDU0fSwKLQl7MHg1MThiLCAweGUwfSwKLQl7MHg1MThjLCAweGIyfSwKLQl7MHg1MThkLCAweDQyfSwKLQl7MHg1MThlLCAweDNkfSwKLQl7MHg1MThmLCAweDU2fSwKLQl7MHg1MTkwLCAweDQ2fSwKLQl7MHg1MTkxLCAweGY4fSwKLQl7MHg1MTkyLCAweDA0fSwKLQl7MHg1MTkzLCAweDcwfSwKLQl7MHg1MTk0LCAweGYwfSwKLQl7MHg1MTk1LCAweGYwfSwKLQl7MHg1MTk2LCAweDAzfSwKLQl7MHg1MTk3LCAweDAxfSwKLQl7MHg1MTk4LCAweDA0fSwKLQl7MHg1MTk5LCAweDEyfSwKLQl7MHg1MTlhLCAweDA0fSwKLQl7MHg1MTliLCAweDAwfSwKLQl7MHg1MTljLCAweDA2fSwKLQl7MHg1MTlkLCAweDgyfSwKLQl7MHg1MTllLCAweDM4fSwKLQl7MHg1MzgxLCAweDFlfSwKLQl7MHg1MzgyLCAweDVifSwKLQl7MHg1MzgzLCAweDA4fSwKLQl7MHg1Mzg0LCAweDBhfSwKLQl7MHg1Mzg1LCAweDdlfSwKLQl7MHg1Mzg2LCAweDg4fSwKLQl7MHg1Mzg3LCAweDdjfSwKLQl7MHg1Mzg4LCAweDZjfSwKLQl7MHg1Mzg5LCAweDEwfSwKLQl7MHg1MzhhLCAweDAxfSwKLQl7MHg1MzhiLCAweDk4fSwKLQl7MHg1MzAwLCAweDA4fSwKLQl7MHg1MzAxLCAweDMwfSwKLQl7MHg1MzAyLCAweDEwfSwKLQl7MHg1MzAzLCAweDAwfSwKLQl7MHg1MzA0LCAweDA4fSwKLQl7MHg1MzA1LCAweDMwfSwKLQl7MHg1MzA2LCAweDA4fSwKLQl7MHg1MzA3LCAweDE2fSwKLQl7MHg1MzA5LCAweDA4fSwKLQl7MHg1MzBhLCAweDMwfSwKLQl7MHg1MzBiLCAweDA0fSwKLQl7MHg1MzBjLCAweDA2fSwKLQl7MHg1NDgwLCAweDAxfSwKLQl7MHg1NDgxLCAweDA4fSwKLQl7MHg1NDgyLCAweDE0fSwKLQl7MHg1NDgzLCAweDI4fSwKLQl7MHg1NDg0LCAweDUxfSwKLQl7MHg1NDg1LCAweDY1fSwKLQl7MHg1NDg2LCAweDcxfSwKLQl7MHg1NDg3LCAweDdkfSwKLQl7MHg1NDg4LCAweDg3fSwKLQl7MHg1NDg5LCAweDkxfSwKLQl7MHg1NDhhLCAweDlhfSwKLQl7MHg1NDhiLCAweGFhfSwKLQl7MHg1NDhjLCAweGI4fSwKLQl7MHg1NDhkLCAweGNkfSwKLQl7MHg1NDhlLCAweGRkfSwKLQl7MHg1NDhmLCAweGVhfSwKLQl7MHg1NDkwLCAweDFkfSwKLQl7MHg1NTgwLCAweDAyfSwKLQl7MHg1NTgzLCAweDQwfSwKLQl7MHg1NTg0LCAweDEwfSwKLQl7MHg1NTg5LCAweDEwfSwKLQl7MHg1NThhLCAweDAwfSwKLQl7MHg1NThiLCAweGY4fSwKLQl7MHg1ODAwLCAweDIzfSwKLQl7MHg1ODAxLCAweDE0fSwKLQl7MHg1ODAyLCAweDBmfSwKLQl7MHg1ODAzLCAweDBmfSwKLQl7MHg1ODA0LCAweDEyfSwKLQl7MHg1ODA1LCAweDI2fSwKLQl7MHg1ODA2LCAweDBjfSwKLQl7MHg1ODA3LCAweDA4fSwKLQl7MHg1ODA4LCAweDA1fSwKLQl7MHg1ODA5LCAweDA1fSwKLQl7MHg1ODBhLCAweDA4fSwKLQl7MHg1ODBiLCAweDBkfSwKLQl7MHg1ODBjLCAweDA4fSwKLQl7MHg1ODBkLCAweDAzfSwKLQl7MHg1ODBlLCAweDAwfSwKLQl7MHg1ODBmLCAweDAwfSwKLQl7MHg1ODEwLCAweDAzfSwKLQl7MHg1ODExLCAweDA5fSwKLQl7MHg1ODEyLCAweDA3fSwKLQl7MHg1ODEzLCAweDAzfSwKLQl7MHg1ODE0LCAweDAwfSwKLQl7MHg1ODE1LCAweDAxfSwKLQl7MHg1ODE2LCAweDAzfSwKLQl7MHg1ODE3LCAweDA4fSwKLQl7MHg1ODE4LCAweDBkfSwKLQl7MHg1ODE5LCAweDA4fSwKLQl7MHg1ODFhLCAweDA1fSwKLQl7MHg1ODFiLCAweDA2fSwKLQl7MHg1ODFjLCAweDA4fSwKLQl7MHg1ODFkLCAweDBlfSwKLQl7MHg1ODFlLCAweDI5fSwKLQl7MHg1ODFmLCAweDE3fSwKLQl7MHg1ODIwLCAweDExfSwKLQl7MHg1ODIxLCAweDExfSwKLQl7MHg1ODIyLCAweDE1fSwKLQl7MHg1ODIzLCAweDI4fSwKLQl7MHg1ODI0LCAweDQ2fSwKLQl7MHg1ODI1LCAweDI2fSwKLQl7MHg1ODI2LCAweDA4fSwKLQl7MHg1ODI3LCAweDI2fSwKLQl7MHg1ODI4LCAweDY0fSwKLQl7MHg1ODI5LCAweDI2fSwKLQl7MHg1ODJhLCAweDI0fSwKLQl7MHg1ODJiLCAweDIyfSwKLQl7MHg1ODJjLCAweDI0fSwKLQl7MHg1ODJkLCAweDI0fSwKLQl7MHg1ODJlLCAweDA2fSwKLQl7MHg1ODJmLCAweDIyfSwKLQl7MHg1ODMwLCAweDQwfSwKLQl7MHg1ODMxLCAweDQyfSwKLQl7MHg1ODMyLCAweDI0fSwKLQl7MHg1ODMzLCAweDI2fSwKLQl7MHg1ODM0LCAweDI0fSwKLQl7MHg1ODM1LCAweDIyfSwKLQl7MHg1ODM2LCAweDIyfSwKLQl7MHg1ODM3LCAweDI2fSwKLQl7MHg1ODM4LCAweDQ0fSwKLQl7MHg1ODM5LCAweDI0fSwKLQl7MHg1ODNhLCAweDI2fSwKLQl7MHg1ODNiLCAweDI4fSwKLQl7MHg1ODNjLCAweDQyfSwKLQl7MHg1ODNkLCAweGNlfSwKLQl7MHg1MDI1LCAweDAwfSwKLQl7MHgzYTBmLCAweDMwfSwKLQl7MHgzYTEwLCAweDI4fSwKLQl7MHgzYTFiLCAweDMwfSwKLQl7MHgzYTFlLCAweDI2fSwKLQl7MHgzYTExLCAweDYwfSwKLQl7MHgzYTFmLCAweDE0fSwKLQl7MHgzMDA4LCAweDAyfSwKLX07Ci0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF9pbml0X2lxX3RibFtdID0gewotLyogTGVucyBjb3JyZWN0aW9uICovCi0vKiBPVjU2NDAgTEVOQyBzZXR0aW5nICovCi0JezB4NTgwMCwgMHgzZn0sCi0JezB4NTgwMSwgMHgyMH0sCi0JezB4NTgwMiwgMHgxYX0sCi0JezB4NTgwMywgMHgxYX0sCi0JezB4NTgwNCwgMHgyM30sCi0JezB4NTgwNSwgMHgzZn0sCi0JezB4NTgwNiwgMHgxMX0sCi0JezB4NTgwNywgMHgwY30sCi0JezB4NTgwOCwgMHgwOX0sCi0JezB4NTgwOSwgMHgwOH0sCi0JezB4NTgwYSwgMHgwZH0sCi0JezB4NTgwYiwgMHgxMn0sCi0JezB4NTgwYywgMHgwZH0sCi0JezB4NTgwZCwgMHgwNH0sCi0JezB4NTgwZSwgMHgwMH0sCi0JezB4NTgwZiwgMHgwMH0sCi0JezB4NTgxMCwgMHgwNX0sCi0JezB4NTgxMSwgMHgwZH0sCi0JezB4NTgxMiwgMHgwZH0sCi0JezB4NTgxMywgMHgwNH0sCi0JezB4NTgxNCwgMHgwMH0sCi0JezB4NTgxNSwgMHgwMH0sCi0JezB4NTgxNiwgMHgwNH0sCi0JezB4NTgxNywgMHgwZH0sCi0JezB4NTgxOCwgMHgxM30sCi0JezB4NTgxOSwgMHgwZH0sCi0JezB4NTgxYSwgMHgwOH0sCi0JezB4NTgxYiwgMHgwOH0sCi0JezB4NTgxYywgMHgwY30sCi0JezB4NTgxZCwgMHgxM30sCi0JezB4NTgxZSwgMHgzZn0sCi0JezB4NTgxZiwgMHgxZn0sCi0JezB4NTgyMCwgMHgxYn0sCi0JezB4NTgyMSwgMHgxY30sCi0JezB4NTgyMiwgMHgyM30sCi0JezB4NTgyMywgMHgzZn0sCi0JezB4NTgyNCwgMHg2YX0sCi0JezB4NTgyNSwgMHgwNn0sCi0JezB4NTgyNiwgMHgwOH0sCi0JezB4NTgyNywgMHgwNn0sCi0JezB4NTgyOCwgMHgyYX0sCi0JezB4NTgyOSwgMHgwOH0sCi0JezB4NTgyYSwgMHgyNH0sCi0JezB4NTgyYiwgMHgyNH0sCi0JezB4NTgyYywgMHgyNH0sCi0JezB4NTgyZCwgMHgwOH0sCi0JezB4NTgyZSwgMHgwOH0sCi0JezB4NTgyZiwgMHgyMn0sCi0JezB4NTgzMCwgMHg0MH0sCi0JezB4NTgzMSwgMHgyMn0sCi0JezB4NTgzMiwgMHgwNn0sCi0JezB4NTgzMywgMHgwOH0sCi0JezB4NTgzNCwgMHgyNH0sCi0JezB4NTgzNSwgMHgyNH0sCi0JezB4NTgzNiwgMHgwNH0sCi0JezB4NTgzNywgMHgwYX0sCi0JezB4NTgzOCwgMHg4Nn0sCi0JezB4NTgzOSwgMHgwOH0sCi0JezB4NTgzYSwgMHgyOH0sCi0JezB4NTgzYiwgMHgyOH0sCi0JezB4NTgzYywgMHg2Nn0sCi0JezB4NTgzZCwgMHhjZX0sCi0vKiBBRUMgKi8KLQl7MHgzYTBmLCAweDM4fSwKLQl7MHgzYTEwLCAweDMwfSwKLQl7MHgzYTExLCAweDYxfSwKLQl7MHgzYTFiLCAweDM4fSwKLQl7MHgzYTFlLCAweDMwfSwKLQl7MHgzYTFmLCAweDEwfSwKLQkvKiBBV0IgKi8KLQl7MHg1MTgwLCAweGZmfSwKLQl7MHg1MTgxLCAweGYyfSwKLQl7MHg1MTgyLCAweDAwfSwKLQl7MHg1MTgzLCAweDE0fSwKLQl7MHg1MTg0LCAweDI1fSwKLQl7MHg1MTg1LCAweDI0fSwKLQl7MHg1MTg2LCAweDA5fSwKLQl7MHg1MTg3LCAweDA5fSwKLQl7MHg1MTg4LCAweDA5fSwKLQl7MHg1MTg5LCAweDg4fSwKLQl7MHg1MThhLCAweDU0fSwKLQl7MHg1MThiLCAweGVlfSwKLQl7MHg1MThjLCAweGIyfSwKLQl7MHg1MThkLCAweDUwfSwKLQl7MHg1MThlLCAweDM0fSwKLQl7MHg1MThmLCAweDZifSwKLQl7MHg1MTkwLCAweDQ2fSwKLQl7MHg1MTkxLCAweGY4fSwKLQl7MHg1MTkyLCAweDA0fSwKLQl7MHg1MTkzLCAweDcwfSwKLQl7MHg1MTk0LCAweGYwfSwKLQl7MHg1MTk1LCAweGYwfSwKLQl7MHg1MTk2LCAweDAzfSwKLQl7MHg1MTk3LCAweDAxfSwKLQl7MHg1MTk4LCAweDA0fSwKLQl7MHg1MTk5LCAweDZjfSwKLQl7MHg1MTlhLCAweDA0fSwKLQl7MHg1MTliLCAweDAwfSwKLQl7MHg1MTljLCAweDA5fSwKLQl7MHg1MTlkLCAweDJifSwKLQl7MHg1MTllLCAweDM4fSwKLQotLyogVVYgQWRqdXN0IEF1dG8gTW9kZSAqLwotCXsweDU1ODAsIDB4MDJ9LAkvKiAwMiA7U2F0IGVuYWJsZSAqLwotCXsweDU1ODgsIDB4MDF9LAkvKjQwIDtlbmFibGUgVVYgYWRqICovCi0JezB4NTU4MywgMHg0MH0sCS8qCTtvZmZzZXQgaGlnaCAqLwotCXsweDU1ODQsIDB4MTh9LAkvKgk7b2Zmc2V0IGxvdyAqLwotCXsweDU1ODksIDB4MTh9LAkvKgk7Z3RoMQkqLwotCXsweDU1OGEsIDB4MDB9LAotCXsweDM1OGIsIDB4Zjh9LAkvKgk7Z3RoMiAqLwotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX3ByZXZpZXdfdGJsW10gPSB7Ci0vKiBAQCBNSVBJXzJsYW5lXzVNIHRvIHZnYShZVVYpIDMwZnBzIDk5IDY0MCA0ODAgOTggMCAwICovCi0JezB4MzUwMywgMHgwMH0sIC8qIGVuYWJsZSBBRSBiYWNrIGZyb20gY2FwdHVyZSB0byBwcmV2aWV3ICovCi0JezB4MzAzNSwgMHgxNH0sCi0JezB4MzAzNiwgMHgzOH0sCi0JezB4MzgyMCwgMHg0MX0sCi0JezB4MzgyMSwgMHgwN30sCi0JezB4MzgxNCwgMHgzMX0sCi0JezB4MzgxNSwgMHgzMX0sCi0JezB4MzgwMywgMHgwNH0sCi0JezB4MzgwNywgMHg5Yn0sCi0JezB4MzgwOCwgMHgwMn0sCi0JezB4MzgwOSwgMHg4MH0sCi0JezB4MzgwYSwgMHgwMX0sCi0JezB4MzgwYiwgMHhlMH0sCi0JezB4MzgwYywgMHgwN30sCi0JezB4MzgwZCwgMHg2OH0sCi0JezB4MzgwZSwgMHgwM30sCi0JezB4MzgwZiwgMHhkOH0sCi0JezB4MzgxMywgMHgwNn0sCi0JezB4MzYxOCwgMHgwMH0sCi0JezB4MzYxMiwgMHgyOX0sCi0JezB4MzcwOCwgMHg2NH0sCi0JezB4MzcwOSwgMHg1Mn0sCi0JezB4MzcwYywgMHgwM30sCi0JezB4NTAwMSwgMHhhM30sCi0JezB4NDAwNCwgMHgwMn0sCi0JezB4NDAwNSwgMHgxOH0sCi0JezB4NDgzNywgMHg0NH0sCi0JezB4NDcxMywgMHgwM30sCi0JezB4NDQwNywgMHgwNH0sCi0JezB4NDYwYiwgMHgzNX0sCi0JezB4NDYwYywgMHgyMn0sCi0JezB4MzgyNCwgMHgwMn0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfY2FwdHVyZV90YmxbXSA9IHsKLS8qIEBAIE1JUElfMmxhbmVfNU0oWVVWKSA3LjUvMTVmcHMgOTkgMjU5MiAxOTQ0IDk4IDAgMCAqLwotCXsweDMwMzUsIDB4MjF9LCAvKiAxMSAqLwotCXsweDMwMzYsIDB4NTR9LAotCXsweDM4MjAsIDB4NDB9LAotCXsweDM4MjEsIDB4MDZ9LAotCXsweDM4MTQsIDB4MTF9LAotCXsweDM4MTUsIDB4MTF9LAotCXsweDM4MDMsIDB4MDB9LAotCXsweDM4MDcsIDB4OWZ9LAotCXsweDM4MDgsIDB4MGF9LAotCXsweDM4MDksIDB4MjB9LAotCXsweDM4MGEsIDB4MDd9LAotCXsweDM4MGIsIDB4OTh9LAotCXsweDM4MGMsIDB4MGJ9LAotCXsweDM4MGQsIDB4MWN9LAotCXsweDM4MGUsIDB4MDd9LAotCXsweDM4MGYsIDB4YjB9LAotCXsweDM4MTMsIDB4MDR9LAotCXsweDM2MTgsIDB4MDR9LAotCXsweDM2MTIsIDB4MmJ9LAotCXsweDM3MDgsIDB4MjF9LAotCXsweDM3MDksIDB4MTJ9LAotCXsweDM3MGMsIDB4MDB9LAotCXsweDUwMDEsIDB4ODN9LAotCXsweDQwMDQsIDB4MDZ9LAotCXsweDQwMDUsIDB4MWF9LAotCXsweDQ4MzcsIDB4MTV9LCAvKiAwYSAqLwotCXsweDQ3MTMsIDB4MDJ9LAotCXsweDQ0MDcsIDB4MGN9LAotCXsweDQ2MGIsIDB4Mzd9LAotCXsweDQ2MGMsIDB4MjB9LAotCXsweDM4MjQsIDB4MDF9LAotfTsKLQotLyogQ29udHJhc3QgKi8KLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX2NvbnRyYXN0X2x2MF90YmxbXSA9IHsKLS8qIENvbnRyYXN0IC00ICovCi0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sCi0JezB4NTU4MCwgMHgwNCwgSU5WTUFTSygweDA0KX0sIC8qIEVuYWJsZSBCSVQyIGZvciBjb250cmFzdC9icmlnaHRuZXNzCi0JCQkJCSAgY29udHJvbCovCi0JezB4NTU4NiwgMHgxMH0sICAgICAgICAgICAgICAgIC8qIEdhaW4gKi8KLQl7MHg1NTg1LCAweDEwfSwgICAgICAgICAgICAgICAgLyogT2Zmc2V0ICovCi0JezB4NTU4OCwgMHgwMCwgSU5WTUFTSygweDA0KX0sIC8qIE9mZnNldCBzaWduICovCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfY29udHJhc3RfbHYxX3RibFtdID0gewotLyogQ29udHJhc3QgLTMgKi8KLQl7MHg1MDAxLCAweDgzLCBJTlZNQVNLKDB4ODApfSwKLQl7MHg1NTgwLCAweDA0LCBJTlZNQVNLKDB4MDQpfSwgLyogRW5hYmxlIEJJVDIgZm9yIGNvbnRyYXN0L2JyaWdodG5lc3MKLQkJCQkJICBjb250cm9sICovCi0JezB4NTU4NiwgMHgxNH0sICAgICAgICAgICAgICAgIC8qIEdhaW4gKi8KLQl7MHg1NTg1LCAweDE0fSwgICAgICAgICAgICAgICAgLyogT2Zmc2V0ICovCi0JezB4NTU4OCwgMHgwMCwgSU5WTUFTSygweDA0KX0sIC8qIE9mZnNldCBzaWduICovCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfY29udHJhc3RfbHYyX3RibFtdID0gewotLyogQ29udHJhc3QgLTIgKi8KLQl7MHg1MDAxLCAweDgzLCBJTlZNQVNLKDB4ODApfSwKLQl7MHg1NTgwLCAweDA0LCBJTlZNQVNLKDB4MDQpfSwgLyogRW5hYmxlIEJJVDIgZm9yIGNvbnRyYXN0L2JyaWdodG5lc3MKLQkJCQkJICBjb250cm9sICovCi0JezB4NTU4NiwgMHgxOH0sICAgICAgICAgICAgICAgIC8qIEdhaW4gKi8KLQl7MHg1NTg1LCAweDE4fSwgICAgICAgICAgICAgICAgLyogT2Zmc2V0ICovCi0JezB4NTU4OCwgMHgwMCwgSU5WTUFTSygweDA0KX0sIC8qIE9mZnNldCBzaWduICovCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfY29udHJhc3RfbHYzX3RibFtdID0gewotLyogQ29udHJhc3QgLTEgKi8KLQl7MHg1MDAxLCAweDgzLCBJTlZNQVNLKDB4ODApfSwKLQl7MHg1NTgwLCAweDA0LCBJTlZNQVNLKDB4MDQpfSwKLQl7MHg1NTg2LCAweDFjfSwKLQl7MHg1NTg1LCAweDFjfSwKLQl7MHg1NTg4LCAweDAwLCBJTlZNQVNLKDB4MDQpfSwKLX07Ci0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF9jb250cmFzdF9kZWZhdWx0X2x2NF90YmxbXSA9IHsKLS8qIENvbnRyYXN0IChEZWZhdWx0KSAqLwotCXsweDUwMDEsIDB4ODMsIElOVk1BU0soMHg4MCl9LAotCXsweDU1ODAsIDB4MDQsIElOVk1BU0soMHgwNCl9LAotCXsweDU1ODYsIDB4MjB9LAotCXsweDU1ODUsIDB4MDB9LAotCXsweDU1ODgsIDB4MDAsIElOVk1BU0soMHgwNCl9LAotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX2NvbnRyYXN0X2x2NV90YmxbXSA9IHsKLS8qIENvbnRyYXN0ICsxICovCi0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sCi0JezB4NTU4MCwgMHgwNCwgSU5WTUFTSygweDA0KX0sCi0JezB4NTU4NiwgMHgyNH0sCi0JezB4NTU4NSwgMHgxMH0sCi0JezB4NTU4OCwgMHgwMCwgSU5WTUFTSygweDA0KX0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfY29udHJhc3RfbHY2X3RibFtdID0gewotLyogQ29udHJhc3QgKzIgKi8KLQl7MHg1MDAxLCAweDgzLCBJTlZNQVNLKDB4ODApfSwKLQl7MHg1NTgwLCAweDA0LCBJTlZNQVNLKDB4MDQpfSwKLQl7MHg1NTg2LCAweDI4fSwKLQl7MHg1NTg1LCAweDE4fSwKLQl7MHg1NTg4LCAweDAwLCBJTlZNQVNLKDB4MDQpfSwKLX07Ci0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF9jb250cmFzdF9sdjdfdGJsW10gPSB7Ci0vKiBDb250cmFzdCArMyAqLwotCXsweDUwMDEsIDB4ODMsIElOVk1BU0soMHg4MCl9LAotCXsweDU1ODAsIDB4MDQsIElOVk1BU0soMHgwNCl9LAotCXsweDU1ODYsIDB4MmN9LAotCXsweDU1ODUsIDB4MWN9LAotCXsweDU1ODgsIDB4MDAsIElOVk1BU0soMHgwNCl9LAotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX2NvbnRyYXN0X2x2OF90YmxbXSA9IHsKLS8qIENvbnRyYXN0ICs0ICovCi0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sCi0JezB4NTU4MCwgMHgwNCwgSU5WTUFTSygweDA0KX0sCi0JezB4NTU4NiwgMHgzMH0sCi0JezB4NTU4NSwgMHgyMH0sCi0JezB4NTU4OCwgMHgwMCwgSU5WTUFTSygweDA0KX0sCi19OwotCi0vKiBTaGFycG5lc3MgKi8KLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX3NoYXJwbmVzc19sdjBfdGJsW10gPSB7Ci0vKiBTaGFycG5lc3MgMCAqLwotCXsweDUzMDgsIDB4NDAsIElOVk1BU0soMHg0MCl9LAotCXsweDUzMDIsIDB4MDB9LAotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX3NoYXJwbmVzc19sdjFfdGJsW10gPSB7Ci0vKiBTaGFycG5lc3MgMSAqLwotCXsweDUzMDgsIDB4NDAsIElOVk1BU0soMHg0MCl9LAotCXsweDUzMDIsIDB4MDJ9LAotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX3NoYXJwbmVzc19kZWZhdWx0X2x2Ml90YmxbXSA9IHsKLS8qIFNoYXJwbmVzc19BdXRvIChEZWZhdWx0KSAqLwotCXsweDUzMDgsIDB4MDAsIElOVk1BU0soMHg0MCl9LAotCXsweDUzMDAsIDB4MDh9LAotCXsweDUzMDEsIDB4MzB9LAotCXsweDUzMDIsIDB4MTB9LAotCXsweDUzMDMsIDB4MDB9LAotCXsweDUzMDksIDB4MDh9LAotCXsweDUzMGEsIDB4MzB9LAotCXsweDUzMGIsIDB4MDR9LAotCXsweDUzMGMsIDB4MDZ9LAotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX3NoYXJwbmVzc19sdjNfdGJsW10gPSB7Ci0vKiBTaGFycG5lc3MgMyAqLwotCXsweDUzMDgsIDB4NDAsIElOVk1BU0soMHg0MCl9LAotCXsweDUzMDIsIDB4MDh9LAotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX3NoYXJwbmVzc19sdjRfdGJsW10gPSB7Ci0vKiBTaGFycG5lc3MgNCAqLwotCXsweDUzMDgsIDB4NDAsIElOVk1BU0soMHg0MCl9LAotCXsweDUzMDIsIDB4MGN9LAotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX3NoYXJwbmVzc19sdjVfdGJsW10gPSB7Ci0vKiBTaGFycG5lc3MgNSAqLwotCXsweDUzMDgsIDB4NDAsIElOVk1BU0soMHg0MCl9LAotCXsweDUzMDIsIDB4MTB9LAotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX3NoYXJwbmVzc19sdjZfdGJsW10gPSB7Ci0vKiBTaGFycG5lc3MgNiAqLwotCXsweDUzMDgsIDB4NDAsIElOVk1BU0soMHg0MCl9LAotCXsweDUzMDIsIDB4MTR9LAotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX3NoYXJwbmVzc19sdjdfdGJsW10gPSB7Ci0vKiBTaGFycG5lc3MgNyAqLwotCXsweDUzMDgsIDB4NDAsIElOVk1BU0soMHg0MCl9LAotCXsweDUzMDIsIDB4MTh9LAotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX3NoYXJwbmVzc19sdjhfdGJsW10gPSB7Ci0vKiBTaGFycG5lc3MgOCAqLwotCXsweDUzMDgsIDB4NDAsIElOVk1BU0soMHg0MCl9LAotCXsweDUzMDIsIDB4MjB9LAotfTsKLQotLyogU2F0dXJhdGlvbiAqLwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfc2F0dXJhdGlvbl9sdjBfdGJsW10gPSB7Ci0vKiBTYXR1cmF0aW9uIHgwLjI1ICovCi0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sICAvKiBTREVfRW4gKi8KLQl7MHg1NTgzLCAweDAwfSwgICAgICAgICAgICAgICAgIC8qIFNhdHVyYWlvbiBnYWluIGluIFUgKi8KLQl7MHg1NTg0LCAweDAwfSwgICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpb24gZ2FpbiBpbiBWICovCi0JezB4NTU4MCwgMHgwMiwgSU5WTUFTSygweDAyKX0sICAvKiBTYXR1cmF0aW9uIGVuYWJsZSAqLwotCXsweDU1ODgsIDB4NDAsIElOVk1BU0soMHg0MCl9LAotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX3NhdHVyYXRpb25fbHYxX3RibFtdID0gewotLyogU2F0dXJhdGlvbiB4MC41ICovCi0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sCi0JezB4NTU4MywgMHgxMH0sCi0JezB4NTU4NCwgMHgxMH0sCi0JezB4NTU4MCwgMHgwMiwgSU5WTUFTSygweDAyKX0sCi0JezB4NTU4OCwgMHg0MCwgSU5WTUFTSygweDQwKX0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfc2F0dXJhdGlvbl9sdjJfdGJsW10gPSB7Ci0vKiBTYXR1cmF0aW9uIHgwLjc1ICovCi0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sCi0JezB4NTU4MywgMHgyMH0sCi0JezB4NTU4NCwgMHgyMH0sCi0JezB4NTU4MCwgMHgwMiwgSU5WTUFTSygweDAyKX0sCi0JezB4NTU4OCwgMHg0MCwgSU5WTUFTSygweDQwKX0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfc2F0dXJhdGlvbl9sdjNfdGJsW10gPSB7Ci0vKiBTYXR1cmF0aW9uIHgwLjc1ICovCi0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sCi0JezB4NTU4MywgMHgzMH0sCi0JezB4NTU4NCwgMHgzMH0sCi0JezB4NTU4MCwgMHgwMiwgSU5WTUFTSygweDAyKX0sCi0JezB4NTU4OCwgMHg0MCwgSU5WTUFTSygweDQwKX0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfc2F0dXJhdGlvbl9kZWZhdWx0X2x2NF90YmxbXSA9IHsKLS8qIFNhdHVyYXRpb24geDEgKERlZmF1bHQpICovCi0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sCi0JezB4NTU4MywgMHg0MH0sCi0JezB4NTU4NCwgMHg0MH0sCi0JezB4NTU4MCwgMHgwMiwgSU5WTUFTSygweDAyKX0sCi0JezB4NTU4OCwgMHg0MCwgSU5WTUFTSygweDQwKX0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfc2F0dXJhdGlvbl9sdjVfdGJsW10gPSB7Ci0vKiBTYXR1cmF0aW9uIHgxLjI1ICovCi0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sCi0JezB4NTU4MywgMHg1MH0sCi0JezB4NTU4NCwgMHg1MH0sCi0JezB4NTU4MCwgMHgwMiwgSU5WTUFTSygweDAyKX0sCi0JezB4NTU4OCwgMHg0MCwgSU5WTUFTSygweDQwKX0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfc2F0dXJhdGlvbl9sdjZfdGJsW10gPSB7Ci0vKiBTYXR1cmF0aW9uIHgxLjUgKi8KLQl7MHg1MDAxLCAweDgzLCBJTlZNQVNLKDB4ODApfSwKLQl7MHg1NTgzLCAweDYwfSwKLQl7MHg1NTg0LCAweDYwfSwKLQl7MHg1NTgwLCAweDAyLCBJTlZNQVNLKDB4MDIpfSwKLQl7MHg1NTg4LCAweDQwLCBJTlZNQVNLKDB4NDApfSwKLX07Ci0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF9zYXR1cmF0aW9uX2x2N190YmxbXSA9IHsKLS8qIFNhdHVyYXRpb24geDEuMjUgKi8KLQl7MHg1MDAxLCAweDgzLCBJTlZNQVNLKDB4ODApfSwKLQl7MHg1NTgzLCAweDcwfSwKLQl7MHg1NTg0LCAweDcwfSwKLQl7MHg1NTgwLCAweDAyLCBJTlZNQVNLKDB4MDIpfSwKLQl7MHg1NTg4LCAweDQwLCBJTlZNQVNLKDB4NDApfSwKLX07Ci0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF9zYXR1cmF0aW9uX2x2OF90YmxbXSA9IHsKLS8qIFNhdHVyYXRpb24geDEuNSAqLwotCXsweDUwMDEsIDB4ODMsIElOVk1BU0soMHg4MCl9LAotCXsweDU1ODMsIDB4ODB9LAotCXsweDU1ODQsIDB4ODB9LAotCXsweDU1ODAsIDB4MDIsIElOVk1BU0soMHgwMil9LAotCXsweDU1ODgsIDB4NDAsIElOVk1BU0soMHg0MCl9LAotfTsKLQotLyogQnJpZ2h0bmVzcyAqLwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfYnJpZ2h0bmVzc19sdjBfdGJsW10gPSB7Ci0vKiBCcmlnaHRuZXNzIC00ICovCi0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sCi0JezB4NTU4NywgMHg0MH0sCi0JezB4NTU4MCwgMHgwNCwgSU5WTUFTSygweDA0KX0sCi0JezB4NTU4OCwgMHgwOCwgSU5WTUFTSygweDA4KX0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfYnJpZ2h0bmVzc19sdjFfdGJsW10gPSB7Ci0vKiBCcmlnaHRuZXNzIC0zICovCi0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sCi0JezB4NTU4NywgMHgzMH0sCi0JezB4NTU4MCwgMHgwNCwgSU5WTUFTSygweDA0KX0sCi0JezB4NTU4OCwgMHgwOCwgSU5WTUFTSygweDA4KX0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfYnJpZ2h0bmVzc19sdjJfdGJsW10gPSB7Ci0vKiBCcmlnaHRuZXNzIC0yICovCi0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sCi0JezB4NTU4NywgMHgyMH0sCi0JezB4NTU4MCwgMHgwNCwgSU5WTUFTSygweDA0KX0sCi0JezB4NTU4OCwgMHgwOCwgSU5WTUFTSygweDA4KX0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfYnJpZ2h0bmVzc19sdjNfdGJsW10gPSB7Ci0vKiBCcmlnaHRuZXNzIC0xICovCi0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sCi0JezB4NTU4NywgMHgxMH0sCi0JezB4NTU4MCwgMHgwNCwgSU5WTUFTSygweDA0KX0sCi0JezB4NTU4OCwgMHgwOCwgSU5WTUFTSygweDA4KX0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfYnJpZ2h0bmVzc19kZWZhdWx0X2x2NF90YmxbXSA9IHsKLS8qIEJyaWdodG5lc3MgMCAoRGVmYXVsdCkgKi8KLQl7MHg1MDAxLCAweDgzLCBJTlZNQVNLKDB4ODApfSwKLQl7MHg1NTg3LCAweDAwfSwKLQl7MHg1NTgwLCAweDA0LCBJTlZNQVNLKDB4MDQpfSwKLQl7MHg1NTg4LCAweDAwLCBJTlZNQVNLKDB4MDgpfSwKLX07Ci0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF9icmlnaHRuZXNzX2x2NV90YmxbXSA9IHsKLS8qIEJyaWdodG5lc3MgKzEgKi8KLQl7MHg1MDAxLCAweDgzLCBJTlZNQVNLKDB4ODApfSwKLQl7MHg1NTg3LCAweDEwfSwKLQl7MHg1NTgwLCAweDA0LCBJTlZNQVNLKDB4MDQpfSwKLQl7MHg1NTg4LCAweDAwLCBJTlZNQVNLKDB4MDgpfSwKLX07Ci0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF9icmlnaHRuZXNzX2x2Nl90YmxbXSA9IHsKLS8qIEJyaWdodG5lc3MgKzIgKi8KLQl7MHg1MDAxLCAweDgzLCBJTlZNQVNLKDB4ODApfSwKLQl7MHg1NTg3LCAweDIwfSwKLQl7MHg1NTgwLCAweDA0LCBJTlZNQVNLKDB4MDQpfSwKLQl7MHg1NTg4LCAweDAwLCBJTlZNQVNLKDB4MDgpfSwKLX07Ci0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF9icmlnaHRuZXNzX2x2N190YmxbXSA9IHsKLS8qIEJyaWdodG5lc3MgKzMgKi8KLQl7MHg1MDAxLCAweDgzLCBJTlZNQVNLKDB4ODApfSwKLQl7MHg1NTg3LCAweDMwfSwKLQl7MHg1NTgwLCAweDA0LCBJTlZNQVNLKDB4MDQpfSwKLQl7MHg1NTg4LCAweDAwLCBJTlZNQVNLKDB4MDgpfSwKLX07Ci0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF9icmlnaHRuZXNzX2x2OF90YmxbXSA9IHsKLS8qIEJyaWdodG5lc3MgKzQgKi8KLQl7MHg1MDAxLCAweDgzLCBJTlZNQVNLKDB4ODApfSwKLQl7MHg1NTg3LCAweDQwfSwKLQl7MHg1NTgwLCAweDA0LCBJTlZNQVNLKDB4MDQpfSwKLQl7MHg1NTg4LCAweDAwLCBJTlZNQVNLKDB4MDgpfSwKLX07Ci0KLS8qIEV4cG9zdXJlIENvbXBlbnNhdGlvbiAqLwotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX2V4cG9zdXJlX2NvbXBlbnNhdGlvbl9sdjBfdGJsW10gPSB7Ci0JLyogQEAgKzEuN0VWICovCi0JezB4M2EwZiwgMHg2MH0sCi0JezB4M2ExMCwgMHg1OH0sCi0JezB4M2ExMSwgMHhhMH0sCi0JezB4M2ExYiwgMHg2MH0sCi0JezB4M2ExZSwgMHg1OH0sCi0JezB4M2ExZiwgMHgyMH0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfZXhwb3N1cmVfY29tcGVuc2F0aW9uX2x2MV90YmxbXSA9IHsKLQkvKiBAQCArMS4wRVYgKi8KLQl7MHgzYTBmLCAweDUwfSwKLQl7MHgzYTEwLCAweDQ4fSwKLQl7MHgzYTExLCAweDkwfSwKLQl7MHgzYTFiLCAweDUwfSwKLQl7MHgzYTFlLCAweDQ4fSwKLQl7MHgzYTFmLCAweDIwfSwKLX07Ci0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF9leHBvc3VyZV9jb21wZW5zYXRpb25fbHYyX2RlZmF1bHRfdGJsW10gPSB7Ci0JLyogQEAgZGVmYXVsdCAqLwotCXsweDNhMGYsIDB4Mzh9LAotCXsweDNhMTAsIDB4MzB9LAotCXsweDNhMTEsIDB4NjF9LAotCXsweDNhMWIsIDB4Mzh9LAotCXsweDNhMWUsIDB4MzB9LAotCXsweDNhMWYsIDB4MTB9LAotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX2V4cG9zdXJlX2NvbXBlbnNhdGlvbl9sdjNfdGJsW10gPSB7Ci0JLyogQEAgLTEuMEVWICovCi0JezB4M2EwZiwgMHgyMH0sCi0JezB4M2ExMCwgMHgxOH0sCi0JezB4M2ExMSwgMHg0MX0sCi0JezB4M2ExYiwgMHgyMH0sCi0JezB4M2ExZSwgMHgxOH0sCi0JezB4M2ExZiwgMHgxMH0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfZXhwb3N1cmVfY29tcGVuc2F0aW9uX2x2NF90YmxbXSA9IHsKLQkvKiBAQCAtMS43RVYgKi8KLQl7MHgzYTBmLCAweDEwfSwKLQl7MHgzYTEwLCAweDA4fSwKLQl7MHgzYTExLCAweDEwfSwKLQl7MHgzYTFiLCAweDA4fSwKLQl7MHgzYTFlLCAweDIwfSwKLQl7MHgzYTFmLCAweDEwfSwKLX07Ci0KLS8qIEF1dG8gRXhwb3Vyc2UgV2VpZ2h0ICovCi0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF9hZV9hdmVyYWdlX3RibFtdID0gewotICAvKiBXaG9sZSBJbWFnZSBBdmVyYWdlICovCi0JezB4NTY4OCwgMHgxMX0sIC8qIFpvbmUgMS9ab25lIDAgd2VpZ2h0ICovCi0JezB4NTY4OSwgMHgxMX0sIC8qIFpvbmUgMy9ab25lIDIgd2VpZ2h0ICovCi0JezB4NTY5YSwgMHgxMX0sIC8qIFpvbmUgNS9ab25lIDQgd2VpZ2h0ICovCi0JezB4NTY5YiwgMHgxMX0sIC8qIFpvbmUgNy9ab25lIDYgd2VpZ2h0ICovCi0JezB4NTY5YywgMHgxMX0sIC8qIFpvbmUgOS9ab25lIDggd2VpZ2h0ICovCi0JezB4NTY5ZCwgMHgxMX0sIC8qIFpvbmUgYi9ab25lIGEgd2VpZ2h0ICovCi0JezB4NTY5ZSwgMHgxMX0sIC8qIFpvbmUgZC9ab25lIGMgd2VpZ2h0ICovCi0JezB4NTY5ZiwgMHgxMX0sIC8qIFpvbmUgZi9ab25lIGUgd2VpZ2h0ICovCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfYWVfY2VudGVyd2VpZ2h0X3RibFtdID0gewotICAvKiBXaG9sZSBJbWFnZSBDZW50ZXIgTW9yZSB3ZWlnaHQgKi8KLQl7MHg1Njg4LCAweDYyfSwKLQl7MHg1Njg5LCAweDI2fSwKLQl7MHg1NjhhLCAweGU2fSwKLQl7MHg1NjhiLCAweDZlfSwKLQl7MHg1NjhjLCAweGVhfSwKLQl7MHg1NjhkLCAweGFlfSwKLQl7MHg1NjhlLCAweGE2fSwKLQl7MHg1NjhmLCAweDZhfSwKLX07Ci0KLS8qIExpZ2h0IE1vZGUgKi8KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF93Yl9kZWZbXSA9IHsKLQl7MHgzNDA2LCAweDAwLCBJTlZNQVNLKDB4MDEpfSwKLX07Ci0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF93Yl9jdXN0b21bXSA9IHsKLQl7MHgzNDA2LCAweDAxLCBJTlZNQVNLKDB4MDEpfSwKLQl7MHgzNDAwLCAweDA0fSwKLQl7MHgzNDAxLCAweDU4fSwKLQl7MHgzNDAyLCAweDA0fSwKLQl7MHgzNDAzLCAweDAwfSwKLQl7MHgzNDA0LCAweDA4fSwKLQl7MHgzNDA1LCAweDQwfSwKLX07Ci0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF93Yl9pbmNbXSA9IHsKLQl7MHgzNDA2LCAweDAxLCBJTlZNQVNLKDB4MDEpfSwKLQl7MHgzNDAwLCAweDA0fSwKLQl7MHgzNDAxLCAweDg4fSwKLQl7MHgzNDAyLCAweDA0fSwKLQl7MHgzNDAzLCAweDAwfSwKLQl7MHgzNDA0LCAweDA4fSwKLQl7MHgzNDA1LCAweGI2fSwKLX07Ci0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF93Yl9kYXlsaWdodFtdID0gewotCXsweDM0MDYsIDB4MDEsIElOVk1BU0soMHgwMSl9LAotCXsweDM0MDAsIDB4MDd9LAotCXsweDM0MDEsIDB4MDJ9LAotCXsweDM0MDIsIDB4MDR9LAotCXsweDM0MDMsIDB4MDB9LAotCXsweDM0MDQsIDB4MDV9LAotCXsweDM0MDUsIDB4MTV9LAotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX3diX2Nsb3VkeVtdID0gewotCXsweDM0MDYsIDB4MDEsIElOVk1BU0soMHgwMSl9LAotCXsweDM0MDAsIDB4MDd9LAotCXsweDM0MDEsIDB4ODh9LAotCXsweDM0MDIsIDB4MDR9LAotCXsweDM0MDMsIDB4MDB9LAotCXsweDM0MDQsIDB4MDV9LAotCXsweDM0MDUsIDB4MDB9LAotfTsKLQotLyogRUZGRUNUICovCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfZWZmZWN0X25vcm1hbF90YmxbXSA9IHsKLQl7MHg1MDAxLCAweDgzLCBJTlZNQVNLKDB4ODApfSwKLQl7MHg1NTgwLCAweDAwLCBJTlZNQVNLKDB4NzgpfSwKLQl7MHg1MDAzLCAweDA4fSwKLQl7MHg1NTgzLCAweDQwfSwKLQl7MHg1NTg0LCAweDQwfSwKLX07Ci0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF9lZmZlY3RfbW9ub190YmxbXSA9IHsKLQl7MHg1MDAxLCAweDgzLCBJTlZNQVNLKDB4ODApfSwKLQl7MHg1NTgwLCAweDIwLCBJTlZNQVNLKDB4NzgpfSwKLQl7MHg1MDAzLCAweDA4fSwKLQl7MHg1NTgzLCAweDQwfSwKLQl7MHg1NTg0LCAweDQwfSwKLX07Ci0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF9lZmZlY3RfYndfdGJsW10gPSB7Ci0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sCi0JezB4NTU4MCwgMHgxOCwgSU5WTUFTSygweDc4KX0sCi0JezB4NTAwMywgMHgwOH0sCi0JezB4NTU4MywgMHg4MH0sCi0JezB4NTU4NCwgMHg4MH0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfZWZmZWN0X2JsdWlzaF90YmxbXSA9IHsKLQl7MHg1MDAxLCAweDgzLCBJTlZNQVNLKDB4ODApfSwKLQl7MHg1NTgwLCAweDE4LCBJTlZNQVNLKDB4NzgpfSwKLQl7MHg1MDAzLCAweDA4fSwKLQl7MHg1NTgzLCAweGEwfSwKLQl7MHg1NTg0LCAweDQwfSwKLX07Ci0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF9lZmZlY3Rfc29sYXJpemVfdGJsW10gPSB7Ci0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sCi0JezB4NTU4MCwgMHgwMCwgSU5WTUFTSygweDc4KX0sCi0JezB4NTAwMywgMHgwOX0sCi19OwotCi0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF9lZmZlY3Rfc2VwaWFfdGJsW10gPSB7Ci0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sCi0JezB4NTU4MCwgMHgxOCwgSU5WTUFTSygweDc4KX0sCi0JezB4NTAwMywgMHgwOH0sCi0JezB4NTU4MywgMHg0MH0sCi0JezB4NTU4NCwgMHhhMH0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfZWZmZWN0X3JlZGRpc2hfdGJsW10gPSB7Ci0JezB4NTAwMSwgMHg4MywgSU5WTUFTSygweDgwKX0sCi0JezB4NTU4MCwgMHgxOCwgSU5WTUFTSygweDc4KX0sCi0JezB4NTAwMywgMHgwOH0sCi0JezB4NTU4MywgMHg4MH0sCi0JezB4NTU4NCwgMHhjMH0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfZWZmZWN0X2dyZWVuaXNoX3RibFtdID0gewotCXsweDUwMDEsIDB4ODMsIElOVk1BU0soMHg4MCl9LAotCXsweDU1ODAsIDB4MTgsIElOVk1BU0soMHg3OCl9LAotCXsweDUwMDMsIDB4MDh9LAotCXsweDU1ODMsIDB4NjB9LAotCXsweDU1ODQsIDB4NjB9LAotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX2VmZmVjdF9uZWdhdGl2ZV90YmxbXSA9IHsKLQl7MHg1MDAxLCAweDgzLCBJTlZNQVNLKDB4ODApfSwKLQl7MHg1NTgwLCAweDQwLCBJTlZNQVNLKDB4NzgpfSwKLQl7MHg1MDAzLCAweDA4fSwKLX07Ci0KLS8qIEFudGlCYW5kaW5nICovCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfYW50aWJhbmRpbmdfYXV0b190YmxbXSA9IHsKLSAgLyogQXV0by1YQ0xLMjRNSHogKi8KLQl7MHgzNjIyLCAweDAxfSwgLyogUEQtc2VsICovCi0JezB4MzYzNSwgMHgxY30sIC8qIFZNUkVGIDM2MzVbMjowXSAqLwotCXsweDM2MzQsIDB4NDB9LCAvKiBJXzUwNjAgMzY0M1syOjBdICovCi0JezB4M2MwMSwgMHgzNH0sCi0JezB4M2MwMCwgMHgwMH0sCi0JezB4M2MwNCwgMHgyOH0sCi0JezB4M2MwNSwgMHg5OH0sCi0JezB4M2MwNiwgMHgwMH0sCi0JezB4M2MwNywgMHgwOH0sCi0JezB4M2MwOCwgMHgwMH0sCi0JezB4M2MwOSwgMHgxY30sCi0JezB4MzAwYywgMHgyMn0sIC8qIDUwLzYwZGl2IDMwMGNbMjowXSAqLwotCXsweDNjMGEsIDB4OWN9LAotCXsweDNjMGIsIDB4NDB9LAotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX2FudGliYW5kaW5nXzUwel90YmxbXSA9IHsKLSAgLyogQmFuZCA1MEh6ICovCi0JezB4M2MwMSwgMHg4MCwgSU5WTUFTSygweDgwKX0sCi0JezB4M2MwMCwgMHgwNH0sCi19OwotCi1zdHJ1Y3Qgb3Y1NjQwX3NlbnNvciBvdjU2NDBfYW50aWJhbmRpbmdfNjB6X3RibFtdID0gewotICAvKiBCYW5kIDYwSHogKi8KLQl7MHgzYzAxLCAweDgwLCBJTlZNQVNLKDB4ODApfSwKLQl7MHgzYzAwLCAweDAwfSwKLX07Ci0KLQotLyogTGVuc19zaGFkaW5nICovCi0KLXN0cnVjdCBvdjU2NDBfc2Vuc29yIG92NTY0MF9sZW5zX3NoYWRpbmdfb25fdGJsW10gPSB7Ci0JLyogQEAgTGVuYyBPbihDKSAqLwotCXsweDUwMDAsIDB4ODAsIElOVk1BU0soMHg4MCl9LAotfTsKLQotc3RydWN0IG92NTY0MF9zZW5zb3Igb3Y1NjQwX2xlbnNfc2hhZGluZ19vZmZfdGJsW10gPSB7Ci0JLyogIExlbmMgT2ZmICovCi0JezB4NTAwMCwgMHgwMCwgSU5WTUFTSygweDgwKX0sCi19OwotCi0vKiBBdXRvIEZvY3VzIEZpcm13YXJlLXVzZSAyMDExLTA4LTI0IGZpcm13YXJlIHNldHRpbmdzICovCi11OCBvdjU2NDBfYWZpbml0X3RibFtdID0gewotCTB4ODAsCTB4MDAsCTB4MDIsCTB4MGIsCTB4N2IsCTB4MDIsCTB4MDcsCTB4YmQsCTB4YzIsCi0JMHgwMSwJMHgyMiwJMHgyMiwJMHgwMCwJMHgwMiwJMHgwYiwJMHg1NywJMHhlNSwJMHgxZiwKLQkweDcwLAkweDcyLAkweGY1LAkweDFlLAkweGQyLAkweDM1LAkweGZmLAkweGVmLAkweDI1LAotCTB4ZTAsCTB4MjQsCTB4NGIsCTB4ZjgsCTB4ZTQsCTB4ZjYsCTB4MDgsCTB4ZjYsCTB4MGYsCi0JMHhiZiwJMHgzNCwJMHhmMiwJMHg5MCwJMHgwZSwJMHg4OCwJMHhlNCwJMHg5MywJMHhmZiwKLQkweGU1LAkweDQ5LAkweGMzLAkweDlmLAkweDUwLAkweDA0LAkweDdmLAkweDA1LAkweDgwLAotCTB4MDIsCTB4N2YsCTB4ZmIsCTB4NzgsCTB4YmEsCTB4YTYsCTB4MDcsCTB4MTIsCTB4MGEsCi0JMHhiNCwJMHg0MCwJMHgwNCwJMHg3ZiwJMHgwMywJMHg4MCwJMHgwMiwJMHg3ZiwJMHgzMCwKLQkweDc4LAkweGI5LAkweGE2LAkweDA3LAkweGU2LAkweDE4LAkweGY2LAkweDA4LAkweGU2LAotCTB4NzgsCTB4YjYsCTB4ZjYsCTB4NzgsCTB4YjksCTB4ZTYsCTB4NzgsCTB4YjcsCTB4ZjYsCi0JMHg3OCwJMHhiYywJMHg3NiwJMHgzMywJMHhlNCwJMHgwOCwJMHhmNiwJMHg3OCwJMHhiNSwKLQkweDc2LAkweDAxLAkweDc1LAkweDQ4LAkweDAyLAkweDc4LAkweGIzLAkweGY2LAkweDA4LAotCTB4ZjYsCTB4NzQsCTB4ZmYsCTB4NzgsCTB4YmUsCTB4ZjYsCTB4MDgsCTB4ZjYsCTB4NzUsCi0JMHgxZiwJMHgwMSwJMHg3OCwJMHhiOSwJMHhlNiwJMHg3NSwJMHhmMCwJMHgwNSwJMHhhNCwKLQkweGY1LAkweDQ5LAkweDEyLAkweDA4LAkweDViLAkweGMyLAkweDM3LAkweDIyLAkweDc4LAotCTB4YjUsCTB4ZTYsCTB4ZDMsCTB4OTQsCTB4MDAsCTB4NDAsCTB4MDIsCTB4MTYsCTB4MjIsCi0JMHhlNSwJMHgxZiwJMHg2NCwJMHgwNSwJMHg3MCwJMHgyOCwJMHhmNSwJMHgxZiwJMHhjMiwKLQkweDAxLAkweDc4LAkweGI2LAkweGU2LAkweDI1LAkweGUwLAkweDI0LAkweDRiLAkweGY4LAotCTB4ZTYsCTB4ZmUsCTB4MDgsCTB4ZTYsCTB4ZmYsCTB4NzgsCTB4NGIsCTB4YTYsCTB4MDYsCi0JMHgwOCwJMHhhNiwJMHgwNywJMHhhMiwJMHgzNywJMHhlNCwJMHgzMywJMHhmNSwJMHgzYywKLQkweDkwLAkweDMwLAkweDI4LAkweGYwLAkweDc1LAkweDFlLAkweDEwLAkweGQyLAkweDM1LAotCTB4MjIsCTB4ZTUsCTB4NDksCTB4NzUsCTB4ZjAsCTB4MDUsCTB4ODQsCTB4NzgsCTB4YjksCi0JMHhmNiwJMHg5MCwJMHgwZSwJMHg4NSwJMHhlNCwJMHg5MywJMHhmZiwJMHgyNSwJMHhlMCwKLQkweDI0LAkweDBhLAkweGY4LAkweGU2LAkweGZjLAkweDA4LAkweGU2LAkweGZkLAkweDc4LAotCTB4YjksCTB4ZTYsCTB4MjUsCTB4ZTAsCTB4MjQsCTB4NGIsCTB4ZjgsCTB4YTYsCTB4MDQsCi0JMHgwOCwJMHhhNiwJMHgwNSwJMHhlZiwJMHgxMiwJMHgwYSwJMHhiYiwJMHhkMywJMHg3OCwKLQkweGI0LAkweDk2LAkweGVlLAkweDE4LAkweDk2LAkweDQwLAkweDBkLAkweDc4LAkweGI5LAotCTB4ZTYsCTB4NzgsCTB4YjYsCTB4ZjYsCTB4NzgsCTB4YjMsCTB4YTYsCTB4MDYsCTB4MDgsCi0JMHhhNiwJMHgwNywJMHg5MCwJMHgwZSwJMHg4NSwJMHhlNCwJMHg5MywJMHgxMiwJMHgwYSwKLQkweGJiLAkweGMzLAkweDc4LAkweGJmLAkweDk2LAkweGVlLAkweDE4LAkweDk2LAkweDUwLAotCTB4MGQsCTB4NzgsCTB4YjksCTB4ZTYsCTB4NzgsCTB4YjcsCTB4ZjYsCTB4NzgsCTB4YmUsCi0JMHhhNiwJMHgwNiwJMHgwOCwJMHhhNiwJMHgwNywJMHg3OCwJMHhiMywJMHhlNiwJMHhmZSwKLQkweDA4LAkweGU2LAkweGMzLAkweDc4LAkweGJmLAkweDk2LAkweGZmLAkweGVlLAkweDE4LAotCTB4OTYsCTB4NzgsCTB4YzAsCTB4ZjYsCTB4MDgsCTB4YTYsCTB4MDcsCTB4OTAsCTB4MGUsCi0JMHg4YSwJMHhlNCwJMHgxOCwJMHgxMiwJMHgwYSwJMHg5OSwJMHhjMywJMHgzMywJMHhjZSwKLQkweDMzLAkweGNlLAkweGQ4LAkweGY5LAkweGZmLAkweGQzLAkweGVkLAkweDlmLAkweGVjLAotCTB4OWUsCTB4NDAsCTB4MDIsCTB4ZDIsCTB4MzcsCTB4NzgsCTB4YjksCTB4ZTYsCTB4MDgsCi0JMHgyNiwJMHgwOCwJMHhmNiwJMHhlNSwJMHgxZiwJMHg2NCwJMHgwMSwJMHg3MCwJMHg1NSwKLQkweGU2LAkweGMzLAkweDc4LAkweGJkLAkweDEyLAkweDBhLAkweDhmLAkweDQwLAkweDEwLAotCTB4MTIsCTB4MGEsCTB4OGEsCTB4NTAsCTB4MGIsCTB4MzAsCTB4MzcsCTB4NDEsCTB4NzgsCi0JMHhiOSwJMHhlNiwJMHg3OCwJMHhiNiwJMHg2NiwJMHg2MCwJMHgzOSwJMHgxMiwJMHgwYSwKLQkweGIyLAkweDQwLAkweDA0LAkweDdmLAkweGZlLAkweDgwLAkweDAyLAkweDdmLAkweDAyLAotCTB4NzgsCTB4YmEsCTB4YTYsCTB4MDcsCTB4NzgsCTB4YjYsCTB4ZTYsCTB4MjQsCTB4MDMsCi0JMHg3OCwJMHhiYywJMHhmNiwJMHg3OCwJMHhiNiwJMHhlNiwJMHgyNCwJMHhmZCwJMHg3OCwKLQkweGJkLAkweGY2LAkweDEyLAkweDBhLAkweGIyLAkweDQwLAkweDA2LAkweDc4LAkweGJkLAotCTB4ZTYsCTB4ZmYsCTB4ODAsCTB4MDQsCTB4NzgsCTB4YmMsCTB4ZTYsCTB4ZmYsCTB4NzgsCi0JMHhiYiwJMHhhNiwJMHgwNywJMHg3NSwJMHgxZiwJMHgwMiwJMHg3OCwJMHhiNSwJMHg3NiwKLQkweDAxLAkweDAyLAkweDAyLAkweDY4LAkweGU1LAkweDFmLAkweDY0LAkweDAyLAkweDYwLAotCTB4MDMsCTB4MDIsCTB4MDIsCTB4NDgsCTB4NzgsCTB4YmIsCTB4ZTYsCTB4ZmYsCTB4YzMsCi0JMHg3OCwJMHhiZCwJMHgxMiwJMHgwYSwJMHg5MCwJMHg0MCwJMHgwOCwJMHgxMiwJMHgwYSwKLQkweDhhLAkweDUwLAkweDAzLAkweDAyLAkweDAyLAkweDQ2LAkweDEyLAkweDBhLAkweGIyLAotCTB4NDAsCTB4MDQsCTB4N2YsCTB4ZmYsCTB4ODAsCTB4MDIsCTB4N2YsCTB4MDEsCTB4NzgsCi0JMHhiYSwJMHhhNiwJMHgwNywJMHg3OCwJMHhiNiwJMHhlNiwJMHgwNCwJMHg3OCwJMHhiYywKLQkweGY2LAkweDc4LAkweGI2LAkweGU2LAkweDE0LAkweDc4LAkweGJkLAkweGY2LAkweDE4LAotCTB4MTIsCTB4MGEsCTB4YjQsCTB4NDAsCTB4MDQsCTB4ZTYsCTB4ZmYsCTB4ODAsCTB4MDIsCi0JMHg3ZiwJMHgwMCwJMHg3OCwJMHhiYywJMHhhNiwJMHgwNywJMHhkMywJMHgwOCwJMHhlNiwKLQkweDY0LAkweDgwLAkweDk0LAkweDgwLAkweDQwLAkweDA0LAkweGU2LAkweGZmLAkweDgwLAotCTB4MDIsCTB4N2YsCTB4MDAsCTB4NzgsCTB4YmQsCTB4YTYsCTB4MDcsCTB4YzMsCTB4MTgsCi0JMHhlNiwJMHg2NCwJMHg4MCwJMHg5NCwJMHhiMywJMHg1MCwJMHgwNCwJMHhlNiwJMHhmZiwKLQkweDgwLAkweDAyLAkweDdmLAkweDMzLAkweDc4LAkweGJjLAkweGE2LAkweDA3LAkweGMzLAotCTB4MDgsCTB4ZTYsCTB4NjQsCTB4ODAsCTB4OTQsCTB4YjMsCTB4NTAsCTB4MDQsCTB4ZTYsCi0JMHhmZiwJMHg4MCwJMHgwMiwJMHg3ZiwJMHgzMywJMHg3OCwJMHhiZCwJMHhhNiwJMHgwNywKLQkweDEyLAkweDBhLAkweGIyLAkweDQwLAkweDA2LAkweDc4LAkweGJkLAkweGU2LAkweGZmLAotCTB4ODAsCTB4MDQsCTB4NzgsCTB4YmMsCTB4ZTYsCTB4ZmYsCTB4NzgsCTB4YmIsCTB4YTYsCi0JMHgwNywJMHg3NSwJMHgxZiwJMHgwMywJMHg3OCwJMHhiNSwJMHg3NiwJMHgwMSwJMHg4MCwKLQkweDIwLAkweGU1LAkweDFmLAkweDY0LAkweDAzLAkweDcwLAkweDI2LAkweDc4LAkweGJiLAotCTB4ZTYsCTB4ZmYsCTB4YzMsCTB4NzgsCTB4YmQsCTB4MTIsCTB4MGEsCTB4OTAsCTB4NDAsCi0JMHgwNSwJMHgxMiwJMHgwYSwJMHg4YSwJMHg0MCwJMHgwOSwJMHg3OCwJMHhiNiwJMHhlNiwKLQkweDc4LAkweGJiLAkweGY2LAkweDc1LAkweDFmLAkweDA0LAkweDc4LAkweGJiLAkweGU2LAotCTB4NzUsCTB4ZjAsCTB4MDUsCTB4YTQsCTB4ZjUsCTB4NDksCTB4MDIsCTB4MDgsCTB4NWIsCi0JMHhlNSwJMHgxZiwJMHhiNCwJMHgwNCwJMHgxZCwJMHg5MCwJMHgwZSwJMHg4OSwJMHhlNCwKLQkweDc4LAkweGMwLAkweDEyLAkweDBhLAkweDk5LAkweGMzLAkweDMzLAkweGNlLAkweDMzLAotCTB4Y2UsCTB4ZDgsCTB4ZjksCTB4ZmYsCTB4ZDMsCTB4ZWQsCTB4OWYsCTB4ZWMsCTB4OWUsCi0JMHg0MCwJMHgwMiwJMHhkMiwJMHgzNywJMHg3NSwJMHgxZiwJMHgwNSwJMHgyMiwJMHhlZiwKLQkweDhkLAkweGYwLAkweGE0LAkweGE4LAkweGYwLAkweGNmLAkweDhjLAkweGYwLAkweGE0LAotCTB4MjgsCTB4Y2UsCTB4OGQsCTB4ZjAsCTB4YTQsCTB4MmUsCTB4ZmUsCTB4MjIsCTB4YmMsCi0JMHgwMCwJMHgwYiwJMHhiZSwJMHgwMCwJMHgyOSwJMHhlZiwJMHg4ZCwJMHhmMCwJMHg4NCwKLQkweGZmLAkweGFkLAkweGYwLAkweDIyLAkweGU0LAkweGNjLAkweGY4LAkweDc1LAkweGYwLAotCTB4MDgsCTB4ZWYsCTB4MmYsCTB4ZmYsCTB4ZWUsCTB4MzMsCTB4ZmUsCTB4ZWMsCTB4MzMsCi0JMHhmYywJMHhlZSwJMHg5ZCwJMHhlYywJMHg5OCwJMHg0MCwJMHgwNSwJMHhmYywJMHhlZSwKLQkweDlkLAkweGZlLAkweDBmLAkweGQ1LAkweGYwLAkweGU5LAkweGU0LAkweGNlLAkweGZkLAotCTB4MjIsCTB4ZWQsCTB4ZjgsCTB4ZjUsCTB4ZjAsCTB4ZWUsCTB4ODQsCTB4MjAsCTB4ZDIsCi0JMHgxYywJMHhmZSwJMHhhZCwJMHhmMCwJMHg3NSwJMHhmMCwJMHgwOCwJMHhlZiwJMHgyZiwKLQkweGZmLAkweGVkLAkweDMzLAkweGZkLAkweDQwLAkweDA3LAkweDk4LAkweDUwLAkweDA2LAotCTB4ZDUsCTB4ZjAsCTB4ZjIsCTB4MjIsCTB4YzMsCTB4OTgsCTB4ZmQsCTB4MGYsCTB4ZDUsCi0JMHhmMCwJMHhlYSwJMHgyMiwJMHhlOCwJMHg4ZiwJMHhmMCwJMHhhNCwJMHhjYywJMHg4YiwKLQkweGYwLAkweGE0LAkweDJjLAkweGZjLAkweGU5LAkweDhlLAkweGYwLAkweGE0LAkweDJjLAotCTB4ZmMsCTB4OGEsCTB4ZjAsCTB4ZWQsCTB4YTQsCTB4MmMsCTB4ZmMsCTB4ZWEsCTB4OGUsCi0JMHhmMCwJMHhhNCwJMHhjZCwJMHhhOCwJMHhmMCwJMHg4YiwJMHhmMCwJMHhhNCwJMHgyZCwKLQkweGNjLAkweDM4LAkweDI1LAkweGYwLAkweGZkLAkweGU5LAkweDhmLAkweGYwLAkweGE0LAotCTB4MmMsCTB4Y2QsCTB4MzUsCTB4ZjAsCTB4ZmMsCTB4ZWIsCTB4OGUsCTB4ZjAsCTB4YTQsCi0JMHhmZSwJMHhhOSwJMHhmMCwJMHhlYiwJMHg4ZiwJMHhmMCwJMHhhNCwJMHhjZiwJMHhjNSwKLQkweGYwLAkweDJlLAkweGNkLAkweDM5LAkweGZlLAkweGU0LAkweDNjLAkweGZjLAkweGVhLAotCTB4YTQsCTB4MmQsCTB4Y2UsCTB4MzUsCTB4ZjAsCTB4ZmQsCTB4ZTQsCTB4M2MsCTB4ZmMsCi0JMHgyMiwJMHg3NSwJMHhmMCwJMHgwOCwJMHg3NSwJMHg4MiwJMHgwMCwJMHhlZiwJMHgyZiwKLQkweGZmLAkweGVlLAkweDMzLAkweGZlLAkweGNkLAkweDMzLAkweGNkLAkweGNjLAkweDMzLAotCTB4Y2MsCTB4YzUsCTB4ODIsCTB4MzMsCTB4YzUsCTB4ODIsCTB4OWIsCTB4ZWQsCTB4OWEsCi0JMHhlYywJMHg5OSwJMHhlNSwJMHg4MiwJMHg5OCwJMHg0MCwJMHgwYywJMHhmNSwJMHg4MiwKLQkweGVlLAkweDliLAkweGZlLAkweGVkLAkweDlhLAkweGZkLAkweGVjLAkweDk5LAkweGZjLAotCTB4MGYsCTB4ZDUsCTB4ZjAsCTB4ZDYsCTB4ZTQsCTB4Y2UsCTB4ZmIsCTB4ZTQsCTB4Y2QsCi0JMHhmYSwJMHhlNCwJMHhjYywJMHhmOSwJMHhhOCwJMHg4MiwJMHgyMiwJMHhiOCwJMHgwMCwKLQkweGMxLAkweGI5LAkweDAwLAkweDU5LAkweGJhLAkweDAwLAkweDJkLAkweGVjLAkweDhiLAotCTB4ZjAsCTB4ODQsCTB4Y2YsCTB4Y2UsCTB4Y2QsCTB4ZmMsCTB4ZTUsCTB4ZjAsCTB4Y2IsCi0JMHhmOSwJMHg3OCwJMHgxOCwJMHhlZiwJMHgyZiwJMHhmZiwJMHhlZSwJMHgzMywJMHhmZSwKLQkweGVkLAkweDMzLAkweGZkLAkweGVjLAkweDMzLAkweGZjLAkweGViLAkweDMzLAkweGZiLAotCTB4MTAsCTB4ZDcsCTB4MDMsCTB4OTksCTB4NDAsCTB4MDQsCTB4ZWIsCTB4OTksCTB4ZmIsCi0JMHgwZiwJMHhkOCwJMHhlNSwJMHhlNCwJMHhmOSwJMHhmYSwJMHgyMiwJMHg3OCwJMHgxOCwKLQkweGVmLAkweDJmLAkweGZmLAkweGVlLAkweDMzLAkweGZlLAkweGVkLAkweDMzLAkweGZkLAotCTB4ZWMsCTB4MzMsCTB4ZmMsCTB4YzksCTB4MzMsCTB4YzksCTB4MTAsCTB4ZDcsCTB4MDUsCi0JMHg5YiwJMHhlOSwJMHg5YSwJMHg0MCwJMHgwNywJMHhlYywJMHg5YiwJMHhmYywJMHhlOSwKLQkweDlhLAkweGY5LAkweDBmLAkweGQ4LAkweGUwLAkweGU0LAkweGM5LAkweGZhLAkweGU0LAotCTB4Y2MsCTB4ZmIsCTB4MjIsCTB4NzUsCTB4ZjAsCTB4MTAsCTB4ZWYsCTB4MmYsCTB4ZmYsCi0JMHhlZSwJMHgzMywJMHhmZSwJMHhlZCwJMHgzMywJMHhmZCwJMHhjYywJMHgzMywJMHhjYywKLQkweGM4LAkweDMzLAkweGM4LAkweDEwLAkweGQ3LAkweDA3LAkweDliLAkweGVjLAkweDlhLAotCTB4ZTgsCTB4OTksCTB4NDAsCTB4MGEsCTB4ZWQsCTB4OWIsCTB4ZmQsCTB4ZWMsCTB4OWEsCi0JMHhmYywJMHhlOCwJMHg5OSwJMHhmOCwJMHgwZiwJMHhkNSwJMHhmMCwJMHhkYSwJMHhlNCwKLQkweGNkLAkweGZiLAkweGU0LAkweGNjLAkweGZhLAkweGU0LAkweGM4LAkweGY5LAkweDIyLAotCTB4ZWIsCTB4OWYsCTB4ZjUsCTB4ZjAsCTB4ZWEsCTB4OWUsCTB4NDIsCTB4ZjAsCTB4ZTksCi0JMHg5ZCwJMHg0MiwJMHhmMCwJMHhlOCwJMHg5YywJMHg0NSwJMHhmMCwJMHgyMiwJMHhlOCwKLQkweDYwLAkweDBmLAkweGVmLAkweGMzLAkweDMzLAkweGZmLAkweGVlLAkweDMzLAkweGZlLAotCTB4ZWQsCTB4MzMsCTB4ZmQsCTB4ZWMsCTB4MzMsCTB4ZmMsCTB4ZDgsCTB4ZjEsCTB4MjIsCi0JMHhlNCwJMHg5MywJMHhmYywJMHg3NCwJMHgwMSwJMHg5MywJMHhmZCwJMHg3NCwJMHgwMiwKLQkweDkzLAkweGZlLAkweDc0LAkweDAzLAkweDkzLAkweGZmLAkweDIyLAkweGU2LAkweGZiLAotCTB4MDgsCTB4ZTYsCTB4ZjksCTB4MDgsCTB4ZTYsCTB4ZmEsCTB4MDgsCTB4ZTYsCTB4Y2IsCi0JMHhmOCwJMHgyMiwJMHhlYywJMHhmNiwJMHgwOCwJMHhlZCwJMHhmNiwJMHgwOCwJMHhlZSwKLQkweGY2LAkweDA4LAkweGVmLAkweGY2LAkweDIyLAkweGE0LAkweDI1LAkweDgyLAkweGY1LAotCTB4ODIsCTB4ZTUsCTB4ZjAsCTB4MzUsCTB4ODMsCTB4ZjUsCTB4ODMsCTB4MjIsCTB4ZDAsCi0JMHg4MywJMHhkMCwJMHg4MiwJMHhmOCwJMHhlNCwJMHg5MywJMHg3MCwJMHgxMiwJMHg3NCwKLQkweDAxLAkweDkzLAkweDcwLAkweDBkLAkweGEzLAkweGEzLAkweDkzLAkweGY4LAkweDc0LAotCTB4MDEsCTB4OTMsCTB4ZjUsCTB4ODIsCTB4ODgsCTB4ODMsCTB4ZTQsCTB4NzMsCTB4NzQsCi0JMHgwMiwJMHg5MywJMHg2OCwJMHg2MCwJMHhlZiwJMHhhMywJMHhhMywJMHhhMywJMHg4MCwKLQkweGRmLAkweDkwLAkweDM4LAkweDA0LAkweDc4LAkweDRmLAkweDEyLAkweDA5LAkweDUwLAotCTB4OTAsCTB4MzgsCTB4MDAsCTB4ZTAsCTB4ZmUsCTB4YTMsCTB4ZTAsCTB4ZmQsCTB4ZWQsCi0JMHhmZiwJMHhjMywJMHgxMiwJMHgwOSwJMHgwOSwJMHg5MCwJMHgzOCwJMHgxMCwJMHgxMiwKLQkweDA4LAkweGZkLAkweDkwLAkweDM4LAkweDA2LAkweDc4LAkweDUxLAkweDEyLAkweDA5LAotCTB4NTAsCTB4OTAsCTB4MzgsCTB4MDIsCTB4ZTAsCTB4ZmUsCTB4YTMsCTB4ZTAsCTB4ZmQsCi0JMHhlZCwJMHhmZiwJMHhjMywJMHgxMiwJMHgwOSwJMHgwOSwJMHg5MCwJMHgzOCwJMHgxMiwKLQkweDEyLAkweDA4LAkweGZkLAkweGEzLAkweGUwLAkweGI0LAkweDMxLAkweDA3LAkweDc4LAotCTB4NGYsCTB4NzksCTB4NGYsCTB4MTIsCTB4MDksCTB4NjYsCTB4OTAsCTB4MzgsCTB4MTQsCi0JMHhlMCwJMHhiNCwJMHg3MSwJMHgxNSwJMHg3OCwJMHg0ZiwJMHhlNiwJMHhmZSwJMHgwOCwKLQkweGU2LAkweDc4LAkweDAyLAkweGNlLAkweGMzLAkweDEzLAkweGNlLAkweDEzLAkweGQ4LAotCTB4ZjksCTB4NzksCTB4NTAsCTB4ZjcsCTB4ZWUsCTB4MTksCTB4ZjcsCTB4OTAsCTB4MzgsCi0JMHgxNSwJMHhlMCwJMHhiNCwJMHgzMSwJMHgwNywJMHg3OCwJMHg1MSwJMHg3OSwJMHg1MSwKLQkweDEyLAkweDA5LAkweDY2LAkweDkwLAkweDM4LAkweDE1LAkweGUwLAkweGI0LAkweDcxLAotCTB4MTUsCTB4NzgsCTB4NTEsCTB4ZTYsCTB4ZmUsCTB4MDgsCTB4ZTYsCTB4NzgsCTB4MDIsCi0JMHhjZSwJMHhjMywJMHgxMywJMHhjZSwJMHgxMywJMHhkOCwJMHhmOSwJMHg3OSwJMHg1MiwKLQkweGY3LAkweGVlLAkweDE5LAkweGY3LAkweDc5LAkweDRmLAkweDEyLAkweDA5LAkweDM4LAotCTB4MDksCTB4MTIsCTB4MDksCTB4MzgsCTB4YWYsCTB4NDUsCTB4MTIsCTB4MDgsCTB4ZWUsCi0JMHg3ZCwJMHg1MCwJMHgxMiwJMHgwMiwJMHhhOSwJMHg3OCwJMHg1NywJMHhhNiwJMHgwNiwKLQkweDA4LAkweGE2LAkweDA3LAkweGFmLAkweDQzLAkweDEyLAkweDA4LAkweGVlLAkweDdkLAotCTB4NTAsCTB4MTIsCTB4MDIsCTB4YTksCTB4NzgsCTB4NTMsCTB4YTYsCTB4MDYsCTB4MDgsCi0JMHhhNiwJMHgwNywJMHhhZiwJMHg0NiwJMHg3OCwJMHg1MSwJMHgxMiwJMHgwOCwJMHhmMCwKLQkweDdkLAkweDNjLAkweDEyLAkweDAyLAkweGE5LAkweDc4LAkweDU5LAkweGE2LAkweDA2LAotCTB4MDgsCTB4YTYsCTB4MDcsCTB4YWYsCTB4NDQsCTB4N2UsCTB4MDAsCTB4NzgsCTB4NTEsCi0JMHgxMiwJMHgwOCwJMHhmMiwJMHg3ZCwJMHgzYywJMHgxMiwJMHgwMiwJMHhhOSwJMHg3OCwKLQkweDU1LAkweGE2LAkweDA2LAkweDA4LAkweGE2LAkweDA3LAkweGMzLAkweDc4LAkweDU4LAotCTB4ZTYsCTB4OTQsCTB4MDgsCTB4MTgsCTB4ZTYsCTB4OTQsCTB4MDAsCTB4NTAsCTB4MDUsCi0JMHg3NiwJMHgwMCwJMHgwOCwJMHg3NiwJMHgwOCwJMHhjMywJMHg3OCwJMHg1YSwJMHhlNiwKLQkweDk0LAkweDA4LAkweDE4LAkweGU2LAkweDk0LAkweDAwLAkweDUwLAkweDA1LAkweDc2LAotCTB4MDAsCTB4MDgsCTB4NzYsCTB4MDgsCTB4NzgsCTB4NTcsCTB4MTIsCTB4MDksCTB4MjUsCi0JMHhmZiwJMHhkMywJMHg3OCwJMHg1NCwJMHhlNiwJMHg5ZiwJMHgxOCwJMHhlNiwJMHg5ZSwKLQkweDQwLAkweDBlLAkweDc4LAkweDU3LAkweGU2LAkweDEzLAkweGZlLAkweDA4LAkweGU2LAotCTB4NzgsCTB4NTQsCTB4MTIsCTB4MDksCTB4NWIsCTB4ODAsCTB4MDQsCTB4N2UsCTB4MDAsCi0JMHg3ZiwJMHgwMCwJMHg3OCwJMHg1YiwJMHgxMiwJMHgwOSwJMHgxZCwJMHhmZiwJMHhkMywKLQkweDc4LAkweDU2LAkweGU2LAkweDlmLAkweDE4LAkweGU2LAkweDllLAkweDQwLAkweDBlLAotCTB4NzgsCTB4NTksCTB4ZTYsCTB4MTMsCTB4ZmUsCTB4MDgsCTB4ZTYsCTB4NzgsCTB4NTYsCi0JMHgxMiwJMHgwOSwJMHg1YiwJMHg4MCwJMHgwNCwJMHg3ZSwJMHgwMCwJMHg3ZiwJMHgwMCwKLQkweGU0LAkweGZjLAkweGZkLAkweDc4LAkweDVmLAkweDEyLAkweDA0LAkweDVjLAkweDc4LAotCTB4NTcsCTB4MTIsCTB4MDksCTB4MjUsCTB4NzgsCTB4NTQsCTB4MjYsCTB4ZmYsCTB4ZWUsCi0JMHgxOCwJMHgzNiwJMHhmZSwJMHg3OCwJMHg2MywJMHgxMiwJMHgwOSwJMHgxZCwJMHg3OCwKLQkweDU2LAkweDI2LAkweGZmLAkweGVlLAkweDE4LAkweDM2LAkweGZlLAkweGU0LAkweGZjLAotCTB4ZmQsCTB4NzgsCTB4NjcsCTB4MTIsCTB4MDQsCTB4NWMsCTB4MTIsCTB4MDksCTB4MmQsCi0JMHg3OCwJMHg2MywJMHgxMiwJMHgwNCwJMHg0ZiwJMHhkMywJMHgxMiwJMHgwNCwJMHgxYiwKLQkweDQwLAkweDA4LAkweDEyLAkweDA5LAkweDJkLAkweDc4LAkweDYzLAkweDEyLAkweDA0LAotCTB4NWMsCTB4NzgsCTB4NTEsCTB4MTIsCTB4MDksCTB4MmYsCTB4NzgsCTB4NjcsCTB4MTIsCi0JMHgwNCwJMHg0ZiwJMHhkMywJMHgxMiwJMHgwNCwJMHgxYiwJMHg0MCwJMHgwYSwJMHg3OCwKLQkweDUxLAkweDEyLAkweDA5LAkweDJmLAkweDc4LAkweDY3LAkweDEyLAkweDA0LAkweDVjLAotCTB4ZTQsCTB4ZmQsCTB4NzgsCTB4NWUsCTB4MTIsCTB4MDksCTB4NDgsCTB4MjQsCTB4MDEsCi0JMHgxMiwJMHgwOSwJMHgxMSwJMHg3OCwJMHg2MiwJMHgxMiwJMHgwOSwJMHg0OCwJMHgyNCwKLQkweDAyLAkweDEyLAkweDA5LAkweDExLAkweDc4LAkweDY2LAkweDEyLAkweDA5LAkweDQ4LAotCTB4MjQsCTB4MDMsCTB4MTIsCTB4MDksCTB4MTEsCTB4NzgsCTB4NmEsCTB4MTIsCTB4MDksCi0JMHg0OCwJMHgyNCwJMHgwNCwJMHgxMiwJMHgwOSwJMHgxMSwJMHgwZCwJMHhiZCwJMHgwNSwKLQkweGQ0LAkweGMyLAkweDBlLAkweGMyLAkweDA2LAkweDIyLAkweDg1LAkweDA4LAkweDQxLAotCTB4OTAsCTB4MzAsCTB4MjQsCTB4ZTAsCTB4ZjUsCTB4M2QsCTB4YTMsCTB4ZTAsCTB4ZjUsCi0JMHgzZSwJMHhhMywJMHhlMCwJMHhmNSwJMHgzZiwJMHhhMywJMHhlMCwJMHhmNSwJMHg0MCwKLQkweGEzLAkweGUwLAkweGY1LAkweDNjLAkweGQyLAkweDM0LAkweGU1LAkweDQxLAkweDEyLAotCTB4MDQsCTB4NzQsCTB4MDYsCTB4YzcsCTB4MDMsCTB4MDYsCTB4Y2IsCTB4MDQsCTB4MDYsCi0JMHhkMSwJMHgwNywJMHgwNiwJMHhkYSwJMHgwOCwJMHgwNiwJMHhlYiwJMHgxMiwJMHgwNywKLQkweDAzLAkweDE4LAkweDA3LAkweDE5LAkweDE5LAkweDA2LAkweGVlLAkweDFhLAkweDA2LAotCTB4ZmEsCTB4MWIsCTB4MDcsCTB4M2UsCTB4ODAsCTB4MDcsCTB4NDMsCTB4ODEsCTB4MDcsCi0JMHhhMSwJMHg4ZiwJMHgwNywJMHg5MCwJMHg5MCwJMHgwNywJMHhhMSwJMHg5MSwJMHgwNywKLQkweGExLAkweDkyLAkweDA3LAkweGExLAkweDkzLAkweDA3LAkweGExLAkweDk0LAkweDA3LAotCTB4YTEsCTB4OTgsCTB4MDcsCTB4OWUsCTB4OWYsCTB4MDAsCTB4MDAsCTB4MDcsCTB4YmMsCi0JMHgxMiwJMHgwYSwJMHhmNCwJMHgyMiwJMHgxMiwJMHgwYSwJMHhmNCwJMHhkMiwJMHgwMywKLQkweDIyLAkweGEyLAkweDM3LAkweGU0LAkweDMzLAkweGY1LAkweDNjLAkweDAyLAkweDA3LAotCTB4YTEsCTB4YzIsCTB4MDEsCTB4YzIsCTB4MDIsCTB4YzIsCTB4MDMsCTB4MTIsCTB4MDksCi0JMHg3MCwJMHg3NSwJMHgxZSwJMHg3MCwJMHhkMiwJMHgzNSwJMHgwMiwJMHgwNywJMHhhMSwKLQkweDAyLAkweDA3LAkweDhiLAkweDg1LAkweDQwLAkweDQ4LAkweDg1LAkweDNjLAkweDQ5LAotCTB4MTIsCTB4MDgsCTB4NWIsCTB4MDIsCTB4MDcsCTB4YTEsCTB4ODUsCTB4NDgsCTB4NDAsCi0JMHg4NSwJMHg0OSwJMHgzYywJMHgwMiwJMHgwNywJMHhhMSwJMHhlNCwJMHhmNSwJMHgyMiwKLQkweGY1LAkweDIzLAkweDg1LAkweDQwLAkweDMxLAkweDg1LAkweDNmLAkweDMwLAkweDg1LAotCTB4M2UsCTB4MmYsCTB4ODUsCTB4M2QsCTB4MmUsCTB4MTIsCTB4MGEsCTB4YzYsCTB4ODAsCi0JMHgxZiwJMHg3NSwJMHgyMiwJMHgwMCwJMHg3NSwJMHgyMywJMHgwMSwJMHg3NCwJMHhmZiwKLQkweGY1LAkweDJkLAkweGY1LAkweDJjLAkweGY1LAkweDJiLAkweGY1LAkweDJhLAkweDEyLAotCTB4MGEsCTB4YzYsCTB4ODUsCTB4MmQsCTB4NDAsCTB4ODUsCTB4MmMsCTB4M2YsCTB4ODUsCi0JMHgyYiwJMHgzZSwJMHg4NSwJMHgyYSwJMHgzZCwJMHhlNCwJMHhmNSwJMHgzYywJMHgwMiwKLQkweDA3LAkweGExLAkweDEyLAkweDBiLAkweDNkLAkweDgwLAkweDVlLAkweDg1LAkweDNkLAotCTB4NDMsCTB4ODUsCTB4M2UsCTB4NDQsCTB4ZTUsCTB4NDUsCTB4YzMsCTB4MTMsCTB4ZmYsCi0JMHhlNSwJMHg0MywJMHhjMywJMHg5ZiwJMHg1MCwJMHgwMiwJMHg4ZiwJMHg0MywJMHhlNSwKLQkweDQ2LAkweGMzLAkweDEzLAkweGZmLAkweGU1LAkweDQ0LAkweGMzLAkweDlmLAkweDUwLAotCTB4MDIsCTB4OGYsCTB4NDQsCTB4ZTUsCTB4NDUsCTB4YzMsCTB4MTMsCTB4ZmYsCTB4ZmQsCi0JMHhlNSwJMHg0MywJMHg5MCwJMHgwZSwJMHg3ZiwJMHgxMiwJMHgwYiwJMHgxMCwJMHg0MCwKLQkweDA0LAkweGVlLAkweDlmLAkweGY1LAkweDQzLAkweGU1LAkweDQ2LAkweGMzLAkweDEzLAotCTB4ZmYsCTB4ZmQsCTB4ZTUsCTB4NDQsCTB4OTAsCTB4MGUsCTB4ODAsCTB4MTIsCTB4MGIsCi0JMHgxMCwJMHg0MCwJMHgwNCwJMHhlZSwJMHg5ZiwJMHhmNSwJMHg0NCwJMHgxMiwJMHgwNCwKLQkweDlhLAkweDgwLAkweDExLAkweDg1LAkweDQwLAkweDQ2LAkweDg1LAkweDNmLAkweDQ1LAotCTB4ODUsCTB4M2UsCTB4NDQsCTB4ODUsCTB4M2QsCTB4NDMsCTB4ODAsCTB4MDMsCTB4MDIsCi0JMHgwNCwJMHg5YSwJMHg5MCwJMHgzMCwJMHgyNCwJMHhlNSwJMHgzZCwJMHhmMCwJMHhhMywKLQkweGU1LAkweDNlLAkweGYwLAkweGEzLAkweGU1LAkweDNmLAkweGYwLAkweGEzLAkweGU1LAotCTB4NDAsCTB4ZjAsCTB4YTMsCTB4ZTUsCTB4M2MsCTB4ZjAsCTB4OTAsCTB4MzAsCTB4MjMsCi0JMHhlNCwJMHhmMCwJMHgyMiwJMHhjMCwJMHhlMCwJMHhjMCwJMHg4MywJMHhjMCwJMHg4MiwKLQkweGMwLAkweGQwLAkweDkwLAkweDNmLAkweDBjLAkweGUwLAkweGY1LAkweDMyLAkweGU1LAotCTB4MzIsCTB4MzAsCTB4ZTMsCTB4NGMsCTB4MzAsCTB4MzYsCTB4M2UsCTB4OTAsCTB4NjAsCi0JMHgxOSwKLQkweGUwLAotCTB4ZjUsCi0JMHgwYSwKLQkweGEzLAotCTB4ZTAsCi0JMHhmNSwKLQkweDBiLAotCTB4OTAsCi0JMHg2MCwKLQkweDFkLAotCTB4ZTAsCi0JMHhmNSwKLQkweDE0LAotCTB4YTMsCi0JMHhlMCwKLQkweGY1LAotCTB4MTUsCi0JMHgzMCwKLQkweDAxLAotCTB4MDYsCi0JMHgzMCwKLQkweDMzLAotCTB4MDMsCi0JMHhkMywKLQkweDgwLAotCTB4MDEsCi0JMHhjMywKLQkweDkyLAotCTB4MDksCi0JMHgzMCwKLQkweDAyLAotCTB4MDYsCi0JMHgzMCwKLQkweDMzLAotCTB4MDMsCi0JMHhkMywKLQkweDgwLAotCTB4MDEsCi0JMHhjMywKLQkweDkyLAotCTB4MGEsCi0JMHgzMCwKLQkweDMzLAotCTB4MGMsCi0JMHgzMCwKLQkweDAzLAotCTB4MDksCi0JMHgyMCwKLQkweDAyLAotCTB4MDYsCi0JMHgyMCwKLQkweDAxLAotCTB4MDMsCi0JMHhkMywKLQkweDgwLAotCTB4MDEsCi0JMHhjMywKLQkweDkyLAotCTB4MGIsCi0JMHg5MCwKLQkweDMwLAotCTB4MDEsCi0JMHhlMCwKLQkweDQ0LAotCTB4NDAsCi0JMHhmMCwKLQkweGUwLAotCTB4NTQsCi0JMHhiZiwKLQkweGYwLAotCTB4ZTUsCi0JMHgzMiwKLQkweDMwLAotCTB4ZTEsCi0JMHgxNCwKLQkweDMwLAotCTB4MzQsCi0JMHgxMSwKLQkweDkwLAotCTB4MzAsCi0JMHgyMiwKLQkweGUwLAotCTB4ZjUsCi0JMHgwOCwKLQkweGU0LAotCTB4ZjAsCi0JMHgzMCwKLQkweDAwLAotCTB4MDMsCi0JMHhkMywKLQkweDgwLAotCTB4MDEsCi0JMHhjMywKLQkweDkyLAotCTB4MDgsCi0JMHhlNSwKLQkweDMyLAotCTB4MzAsCi0JMHhlNSwKLQkweDEyLAotCTB4OTAsCi0JMHg1NiwKLQkweGExLAotCTB4ZTAsCi0JMHhmNSwKLQkweDA5LAotCTB4MzAsCi0JMHgzMSwKLQkweDA5LAotCTB4MzAsCi0JMHgwNSwKLQkweDAzLAotCTB4ZDMsCi0JMHg4MCwKLQkweDAxLAotCTB4YzMsCi0JMHg5MiwKLQkweDBkLAotCTB4OTAsCi0JMHgzZiwKLQkweDBjLAotCTB4ZTUsCi0JMHgzMiwKLQkweGYwLAotCTB4ZDAsCi0JMHhkMCwKLQkweGQwLAotCTB4ODIsCi0JMHhkMCwKLQkweDgzLAotCTB4ZDAsCi0JMHhlMCwKLQkweDMyLAotCTB4OTAsCi0JMHgwZSwKLQkweDdkLAotCTB4ZTQsCi0JMHg5MywKLQkweGZlLAotCTB4NzQsCi0JMHgwMSwKLQkweDkzLAotCTB4ZmYsCi0JMHhjMywKLQkweDkwLAotCTB4MGUsCi0JMHg3YiwKLQkweDc0LAotCTB4MDEsCi0JMHg5MywKLQkweDlmLAotCTB4ZmYsCi0JMHhlNCwKLQkweDkzLAotCTB4OWUsCi0JMHhmZSwKLQkweGU0LAotCTB4OGYsCi0JMHgzYiwKLQkweDhlLAotCTB4M2EsCi0JMHhmNSwKLQkweDM5LAotCTB4ZjUsCi0JMHgzOCwKLQkweGFiLAotCTB4M2IsCi0JMHhhYSwKLQkweDNhLAotCTB4YTksCi0JMHgzOSwKLQkweGE4LAotCTB4MzgsCi0JMHhhZiwKLQkweDQ5LAotCTB4ZmMsCi0JMHhmZCwKLQkweGZlLAotCTB4MTIsCi0JMHgwMiwKLQkweGZlLAotCTB4MTIsCi0JMHgwYiwKLQkweDIyLAotCTB4ZTQsCi0JMHg3YiwKLQkweGZmLAotCTB4ZmEsCi0JMHhmOSwKLQkweGY4LAotCTB4MTIsCi0JMHgwMywKLQkweDg5LAotCTB4MTIsCi0JMHgwYiwKLQkweDIyLAotCTB4OTAsCi0JMHgwZSwKLQkweDY5LAotCTB4ZTQsCi0JMHgxMiwKLQkweDBiLAotCTB4MzcsCi0JMHgxMiwKLQkweDBiLAotCTB4MjIsCi0JMHhlNCwKLQkweDg1LAotCTB4NDgsCi0JMHgzNywKLQkweGY1LAotCTB4MzYsCi0JMHhmNSwKLQkweDM1LAotCTB4ZjUsCi0JMHgzNCwKLQkweGFmLAotCTB4MzcsCi0JMHhhZSwKLQkweDM2LAotCTB4YWQsCi0JMHgzNSwKLQkweGFjLAotCTB4MzQsCi0JMHhhMywKLQkweDEyLAotCTB4MGIsCi0JMHgzNywKLQkweDhmLAotCTB4MzcsCi0JMHg4ZSwKLQkweDM2LAotCTB4OGQsCi0JMHgzNSwKLQkweDhjLAotCTB4MzQsCi0JMHhlNSwKLQkweDNiLAotCTB4NDUsCi0JMHgzNywKLQkweGY1LAotCTB4M2IsCi0JMHhlNSwKLQkweDNhLAotCTB4NDUsCi0JMHgzNiwKLQkweGY1LAotCTB4M2EsCi0JMHhlNSwKLQkweDM5LAotCTB4NDUsCi0JMHgzNSwKLQkweGY1LAotCTB4MzksCi0JMHhlNSwKLQkweDM4LAotCTB4NDUsCi0JMHgzNCwKLQkweGY1LAotCTB4MzgsCi0JMHhlNCwKLQkweGY1LAotCTB4MjIsCi0JMHhmNSwKLQkweDIzLAotCTB4ODUsCi0JMHgzYiwKLQkweDMxLAotCTB4ODUsCi0JMHgzYSwKLQkweDMwLAotCTB4ODUsCi0JMHgzOSwKLQkweDJmLAotCTB4ODUsCi0JMHgzOCwKLQkweDJlLAotCTB4MDIsCi0JMHgwYSwKLQkweGM2LAotCTB4NzgsCi0JMHg0ZiwKLQkweDdlLAotCTB4MDAsCi0JMHhlNiwKLQkweGZjLAotCTB4MDgsCi0JMHhlNiwKLQkweGZkLAotCTB4MTIsCi0JMHgwMiwKLQkweDk3LAotCTB4N2MsCi0JMHgwMCwKLQkweDIyLAotCTB4ZTAsCi0JMHhhMywKLQkweGUwLAotCTB4NzUsCi0JMHhmMCwKLQkweDAyLAotCTB4YTQsCi0JMHhmZiwKLQkweGFlLAotCTB4ZjAsCi0JMHhjMywKLQkweDA4LAotCTB4ZTYsCi0JMHg5ZiwKLQkweGY2LAotCTB4MTgsCi0JMHhlNiwKLQkweDllLAotCTB4ZjYsCi0JMHgyMiwKLQkweGZmLAotCTB4ZTUsCi0JMHhmMCwKLQkweDM0LAotCTB4NjAsCi0JMHg4ZiwKLQkweDgyLAotCTB4ZjUsCi0JMHg4MywKLQkweGVjLAotCTB4ZjAsCi0JMHgyMiwKLQkweGU0LAotCTB4ZmMsCi0JMHhmZCwKLQkweDEyLAotCTB4MDQsCi0JMHg1YywKLQkweDc4LAotCTB4NTksCi0JMHhlNiwKLQkweGMzLAotCTB4MTMsCi0JMHhmZSwKLQkweDA4LAotCTB4ZTYsCi0JMHgxMywKLQkweDIyLAotCTB4NzgsCi0JMHg0ZiwKLQkweGU2LAotCTB4ZmUsCi0JMHgwOCwKLQkweGU2LAotCTB4ZmYsCi0JMHhlNCwKLQkweGZjLAotCTB4ZmQsCi0JMHgyMiwKLQkweGU3LAotCTB4YzQsCi0JMHhmOCwKLQkweDU0LAotCTB4ZjAsCi0JMHhjOCwKLQkweDY4LAotCTB4ZjcsCi0JMHgwOSwKLQkweGU3LAotCTB4YzQsCi0JMHg1NCwKLQkweDBmLAotCTB4NDgsCi0JMHhmNywKLQkweDIyLAotCTB4ZTYsCi0JMHhmYywKLQkweGVkLAotCTB4NzUsCi0JMHhmMCwKLQkweDA0LAotCTB4YTQsCi0JMHgyMiwKLQkweGUwLAotCTB4ZmUsCi0JMHhhMywKLQkweGUwLAotCTB4ZmQsCi0JMHhlZSwKLQkweGY2LAotCTB4ZWQsCi0JMHgwOCwKLQkweGY2LAotCTB4MjIsCi0JMHgxMywKLQkweGZmLAotCTB4YzMsCi0JMHhlNiwKLQkweDlmLAotCTB4ZmYsCi0JMHgxOCwKLQkweGU2LAotCTB4OWUsCi0JMHhmZSwKLQkweDIyLAotCTB4ZTYsCi0JMHhjMywKLQkweDEzLAotCTB4ZjcsCi0JMHgwOCwKLQkweGU2LAotCTB4MTMsCi0JMHgwOSwKLQkweGY3LAotCTB4MjIsCi0JMHhlNCwKLQkweGY1LAotCTB4NDksCi0JMHg5MCwKLQkweDBlLAotCTB4NzcsCi0JMHg5MywKLQkweGZmLAotCTB4ZTQsCi0JMHg4ZiwKLQkweDM3LAotCTB4ZjUsCi0JMHgzNiwKLQkweGY1LAotCTB4MzUsCi0JMHhmNSwKLQkweDM0LAotCTB4YWYsCi0JMHgzNywKLQkweGFlLAotCTB4MzYsCi0JMHhhZCwKLQkweDM1LAotCTB4YWMsCi0JMHgzNCwKLQkweDkwLAotCTB4MGUsCi0JMHg2YSwKLQkweDEyLAotCTB4MGIsCi0JMHgzNywKLQkweDhmLAotCTB4MzcsCi0JMHg4ZSwKLQkweDM2LAotCTB4OGQsCi0JMHgzNSwKLQkweDhjLAotCTB4MzQsCi0JMHg5MCwKLQkweDBlLAotCTB4NzIsCi0JMHgxMiwKLQkweDA0LAotCTB4M2YsCi0JMHhlZiwKLQkweDQ1LAotCTB4MzcsCi0JMHhmNSwKLQkweDM3LAotCTB4ZWUsCi0JMHg0NSwKLQkweDM2LAotCTB4ZjUsCi0JMHgzNiwKLQkweGVkLAotCTB4NDUsCi0JMHgzNSwKLQkweGY1LAotCTB4MzUsCi0JMHhlYywKLQkweDQ1LAotCTB4MzQsCi0JMHhmNSwKLQkweDM0LAotCTB4ZTQsCi0JMHhmNSwKLQkweDIyLAotCTB4ZjUsCi0JMHgyMywKLQkweDg1LAotCTB4MzcsCi0JMHgzMSwKLQkweDg1LAotCTB4MzYsCi0JMHgzMCwKLQkweDg1LAotCTB4MzUsCi0JMHgyZiwKLQkweDg1LAotCTB4MzQsCi0JMHgyZSwKLQkweDEyLAotCTB4MGEsCi0JMHhjNiwKLQkweGU0LAotCTB4ZjUsCi0JMHgyMiwKLQkweGY1LAotCTB4MjMsCi0JMHg5MCwKLQkweDBlLAotCTB4NzIsCi0JMHgxMiwKLQkweDBiLAotCTB4MmIsCi0JMHgxMiwKLQkweDBhLAotCTB4YzYsCi0JMHhlNCwKLQkweGY1LAotCTB4MjIsCi0JMHhmNSwKLQkweDIzLAotCTB4OTAsCi0JMHgwZSwKLQkweDZlLAotCTB4MTIsCi0JMHgwYiwKLQkweDJiLAotCTB4MDIsCi0JMHgwYSwKLQkweGM2LAotCTB4NzUsCi0JMHg4OSwKLQkweDAzLAotCTB4NzUsCi0JMHhhOCwKLQkweDAxLAotCTB4NzUsCi0JMHhiOCwKLQkweDA0LAotCTB4NzUsCi0JMHgzNCwKLQkweGZmLAotCTB4NzUsCi0JMHgzNSwKLQkweDBlLAotCTB4NzUsCi0JMHgzNiwKLQkweDE1LAotCTB4NzUsCi0JMHgzNywKLQkweDBkLAotCTB4MTIsCi0JMHgwYSwKLQkweDRhLAotCTB4MTIsCi0JMHgwMCwKLQkweDA5LAotCTB4MTIsCi0JMHgwYiwKLQkweDNkLAotCTB4MTIsCi0JMHgwMCwKLQkweDA2LAotCTB4ZDIsCi0JMHgwMCwKLQkweGQyLAotCTB4MzQsCi0JMHhkMiwKLQkweGFmLAotCTB4NzUsCi0JMHgzNCwKLQkweGZmLAotCTB4NzUsCi0JMHgzNSwKLQkweDBlLAotCTB4NzUsCi0JMHgzNiwKLQkweDQ5LAotCTB4NzUsCi0JMHgzNywKLQkweDAzLAotCTB4MTIsCi0JMHgwYSwKLQkweDRhLAotCTB4MzAsCi0JMHgwOCwKLQkweDA5LAotCTB4YzIsCi0JMHgzNCwKLQkweDEyLAotCTB4MDYsCi0JMHg2YSwKLQkweGMyLAotCTB4MDgsCi0JMHhkMiwKLQkweDM0LAotCTB4MzAsCi0JMHgwOSwKLQkweDA5LAotCTB4YzIsCi0JMHgzNiwKLQkweDEyLAotCTB4MDAsCi0JMHgwZSwKLQkweGMyLAotCTB4MDksCi0JMHhkMiwKLQkweDM2LAotCTB4MzAsCi0JMHgwZSwKLQkweDAzLAotCTB4MTIsCi0JMHgwNCwKLQkweDlhLAotCTB4MzAsCi0JMHgzNSwKLQkweGRmLAotCTB4OTAsCi0JMHgzMCwKLQkweDI5LAotCTB4ZTUsCi0JMHgxZSwKLQkweGYwLAotCTB4YjQsCi0JMHgxMCwKLQkweDA1LAotCTB4OTAsCi0JMHgzMCwKLQkweDIzLAotCTB4ZTQsCi0JMHhmMCwKLQkweGMyLAotCTB4MzUsCi0JMHg4MCwKLQkweGNkLAotCTB4YWUsCi0JMHgzNSwKLQkweGFmLAotCTB4MzYsCi0JMHhlNCwKLQkweGZkLAotCTB4ZWQsCi0JMHhjMywKLQkweDk1LAotCTB4MzcsCi0JMHg1MCwKLQkweDMzLAotCTB4MTIsCi0JMHgwYiwKLQkweDg3LAotCTB4ZTQsCi0JMHg5MywKLQkweGY1LAotCTB4MzgsCi0JMHg3NCwKLQkweDAxLAotCTB4OTMsCi0JMHhmNSwKLQkweDM5LAotCTB4NDUsCi0JMHgzOCwKLQkweDYwLAotCTB4MjMsCi0JMHg4NSwKLQkweDM5LAotCTB4ODIsCi0JMHg4NSwKLQkweDM4LAotCTB4ODMsCi0JMHhlMCwKLQkweGZjLAotCTB4MTIsCi0JMHgwYiwKLQkweDg3LAotCTB4NzQsCi0JMHgwMywKLQkweDkzLAotCTB4NTIsCi0JMHgwNCwKLQkweDEyLAotCTB4MGIsCi0JMHg4NywKLQkweDc0LAotCTB4MDIsCi0JMHg5MywKLQkweDQyLAotCTB4MDQsCi0JMHg4NSwKLQkweDM5LAotCTB4ODIsCi0JMHg4NSwKLQkweDM4LAotCTB4ODMsCi0JMHhlYywKLQkweGYwLAotCTB4MGQsCi0JMHg4MCwKLQkweGM3LAotCTB4MjIsCi0JMHg3OCwKLQkweGJiLAotCTB4ZTYsCi0JMHhkMywKLQkweDA4LAotCTB4ZmYsCi0JMHhlNiwKLQkweDY0LAotCTB4ODAsCi0JMHhmOCwKLQkweGVmLAotCTB4NjQsCi0JMHg4MCwKLQkweDk4LAotCTB4MjIsCi0JMHg5MywKLQkweGZmLAotCTB4N2UsCi0JMHgwMCwKLQkweGU2LAotCTB4ZmMsCi0JMHgwOCwKLQkweGU2LAotCTB4ZmQsCi0JMHgxMiwKLQkweDAyLAotCTB4OTcsCi0JMHhhYywKLQkweDA2LAotCTB4YWQsCi0JMHgwNywKLQkweDc4LAotCTB4YjMsCi0JMHhlNiwKLQkweGZlLAotCTB4MDgsCi0JMHhlNiwKLQkweDc4LAotCTB4MDMsCi0JMHgyMiwKLQkweDc4LAotCTB4YmEsCi0JMHhkMywKLQkweGU2LAotCTB4NjQsCi0JMHg4MCwKLQkweDk0LAotCTB4ODAsCi0JMHgyMiwKLQkweDI1LAotCTB4ZTAsCi0JMHgyNCwKLQkweDBhLAotCTB4ZjgsCi0JMHhlNiwKLQkweGZlLAotCTB4MDgsCi0JMHhlNiwKLQkweGZmLAotCTB4MjIsCi0JMHhhMiwKLQkweGFmLAotCTB4OTIsCi0JMHgzMiwKLQkweGMyLAotCTB4YWYsCi0JMHhlNSwKLQkweDIzLAotCTB4NDUsCi0JMHgyMiwKLQkweDkwLAotCTB4MGUsCi0JMHg1ZCwKLQkweDYwLAotCTB4MGUsCi0JMHgxMiwKLQkweDBiLAotCTB4NzAsCi0JMHhlMCwKLQkweGY1LAotCTB4MmMsCi0JMHgxMiwKLQkweDBiLAotCTB4NmQsCi0JMHhlMCwKLQkweGY1LAotCTB4MmQsCi0JMHg4MCwKLQkweDBjLAotCTB4MTIsCi0JMHgwYiwKLQkweDcwLAotCTB4ZTUsCi0JMHgzMCwKLQkweGYwLAotCTB4MTIsCi0JMHgwYiwKLQkweDZkLAotCTB4ZTUsCi0JMHgzMSwKLQkweGYwLAotCTB4YTIsCi0JMHgzMiwKLQkweDkyLAotCTB4YWYsCi0JMHgyMiwKLQkweGQyLAotCTB4MDEsCi0JMHhjMiwKLQkweDAyLAotCTB4ZTQsCi0JMHhmNSwKLQkweDFmLAotCTB4ZjUsCi0JMHgxZSwKLQkweGQyLAotCTB4MzUsCi0JMHhkMiwKLQkweDMzLAotCTB4ZDIsCi0JMHgzNiwKLQkweGQyLAotCTB4MDEsCi0JMHhjMiwKLQkweDAyLAotCTB4ZjUsCi0JMHgxZiwKLQkweGY1LAotCTB4MWUsCi0JMHhkMiwKLQkweDM1LAotCTB4ZDIsCi0JMHgzMywKLQkweDIyLAotCTB4MmQsCi0JMHhmZCwKLQkweGU0LAotCTB4MzMsCi0JMHhmYywKLQkweGU0LAotCTB4OTMsCi0JMHhmZSwKLQkweGZiLAotCTB4ZDMsCi0JMHhlZCwKLQkweDliLAotCTB4NzQsCi0JMHg4MCwKLQkweGY4LAotCTB4NmMsCi0JMHg5OCwKLQkweDIyLAotCTB4OGYsCi0JMHgzYiwKLQkweDhlLAotCTB4M2EsCi0JMHg4ZCwKLQkweDM5LAotCTB4OGMsCi0JMHgzOCwKLQkweDIyLAotCTB4MTIsCi0JMHgwNCwKLQkweDNmLAotCTB4OGYsCi0JMHgzMSwKLQkweDhlLAotCTB4MzAsCi0JMHg4ZCwKLQkweDJmLAotCTB4OGMsCi0JMHgyZSwKLQkweDIyLAotCTB4OTMsCi0JMHhmOSwKLQkweGY4LAotCTB4MDIsCi0JMHgwNCwKLQkweDJjLAotCTB4OTAsCi0JMHgwZSwKLQkweDgxLAotCTB4MTIsCi0JMHgwNCwKLQkweDNmLAotCTB4OGYsCi0JMHg0NiwKLQkweDhlLAotCTB4NDUsCi0JMHg4ZCwKLQkweDQ0LAotCTB4OGMsCi0JMHg0MywKLQkweGQyLAotCTB4MDYsCi0JMHgzMCwKLQkweDA2LAotCTB4MDMsCi0JMHhkMywKLQkweDgwLAotCTB4MDEsCi0JMHhjMywKLQkweDkyLAotCTB4MGUsCi0JMHgyMiwKLQkweGMwLAotCTB4ZTAsCi0JMHhjMCwKLQkweDgzLAotCTB4YzAsCi0JMHg4MiwKLQkweDkwLAotCTB4M2YsCi0JMHgwZCwKLQkweGUwLAotCTB4ZjUsCi0JMHgzMywKLQkweGU1LAotCTB4MzMsCi0JMHhmMCwKLQkweGQwLAotCTB4ODIsCi0JMHhkMCwKLQkweDgzLAotCTB4ZDAsCi0JMHhlMCwKLQkweDMyLAotCTB4OTAsCi0JMHgwZSwKLQkweDVmLAotCTB4ZTQsCi0JMHg5MywKLQkweGZlLAotCTB4NzQsCi0JMHgwMSwKLQkweDkzLAotCTB4ZjUsCi0JMHg4MiwKLQkweDhlLAotCTB4ODMsCi0JMHgyMiwKLQkweDc4LAotCTB4N2YsCi0JMHhlNCwKLQkweGY2LAotCTB4ZDgsCi0JMHhmZCwKLQkweDc1LAotCTB4ODEsCi0JMHhjYSwKLQkweDAyLAotCTB4MDksCi0JMHhlMSwKLQkweDhmLAotCTB4ODIsCi0JMHg4ZSwKLQkweDgzLAotCTB4NzUsCi0JMHhmMCwKLQkweDA0LAotCTB4ZWQsCi0JMHgwMiwKLQkweDA0LAotCTB4NjgsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDExLAotCTB4MDcsCi0JMHgyMSwKLQkweDE1LAotCTB4MjksCi0JMHgxMywKLQkweDRmLAotCTB4NTYsCi0JMHg1NCwKLQkweDIwLAotCTB4MjAsCi0JMHgyMCwKLQkweDIwLAotCTB4MjAsCi0JMHgyMCwKLQkweDAxLAotCTB4MTAsCi0JMHgwMCwKLQkweDU2LAotCTB4NDAsCi0JMHgxYSwKLQkweDMwLAotCTB4MjksCi0JMHg3ZSwKLQkweDAwLAotCTB4MzAsCi0JMHgwNCwKLQkweDIwLAotCTB4ZGYsCi0JMHgzMCwKLQkweDA1LAotCTB4NDAsCi0JMHhiZiwKLQkweDUwLAotCTB4MDMsCi0JMHgwMCwKLQkweGZkLAotCTB4NTAsCi0JMHgyNywKLQkweDAxLAotCTB4ZmUsCi0JMHg2MCwKLQkweDAwLAotCTB4MTEsCi0JMHgwMCwKLQkweDNmLAotCTB4MDUsCi0JMHgzMCwKLQkweDAwLAotCTB4M2YsCi0JMHgwNiwKLQkweDIyLAotCTB4MDAsCi0JMHgzZiwKLQkweDAxLAotCTB4MmEsCi0JMHgwMCwKLQkweDNmLAotCTB4MDIsCi0JMHgwMCwKLQkweDAwLAotCTB4MzYsCi0JMHgwNiwKLQkweDA3LAotCTB4MDAsCi0JMHgzZiwKLQkweDBiLAotCTB4MGYsCi0JMHhmMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MzAsCi0JMHgwMSwKLQkweDQwLAotCTB4YmYsCi0JMHgzMCwKLQkweDAxLAotCTB4MDAsCi0JMHhiZiwKLQkweDMwLAotCTB4MjksCi0JMHg3MCwKLQkweDAwLAotCTB4M2EsCi0JMHgwMCwKLQkweDAwLAotCTB4ZmYsCi0JMHgzYSwKLQkweDAwLAotCTB4MDAsCi0JMHhmZiwKLQkweDM2LAotCTB4MDMsCi0JMHgzNiwKLQkweDAyLAotCTB4NDEsCi0JMHg0NCwKLQkweDU4LAotCTB4MjAsCi0JMHgxOCwKLQkweDEwLAotCTB4MGEsCi0JMHgwNCwKLQkweDA0LAotCTB4MDAsCi0JMHgwMywKLQkweGZmLAotCTB4NjQsCi0JMHgwMCwKLQkweDAwLAotCTB4ODAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMiwKLQkweDA0LAotCTB4MDYsCi0JMHgwMCwKLQkweDAzLAotCTB4OTgsCi0JMHgwMCwKLQkweGNjLAotCTB4NTAsCi0JMHgzYywKLQkweDI4LAotCTB4MWUsCi0JMHgxMCwKLQkweDEwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4NmUsCi0JMHgzMCwKLQkweDI4LAotCTB4MDAsCi0JMHhhNSwKLQkweDVhLAotCTB4MDAsCi19OwotCi0jZW5kaWYgLyogQ0FNU0VOU09SX09WNTY0MCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL292NTY0Ny5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL292NTY0Ny5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjVmYWVmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9vdjU2NDcuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMDEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9sZWRzLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtZWRpYS9tc21fY2FtZXJhLmg+Ci0jaW5jbHVkZSAib3Y1NjQ3LmgiCi0KLS8qIDE2Yml0IGFkZHJlc3MgLSA4IGJpdCBjb250ZXh0IHJlZ2lzdGVyIHN0cnVjdHVyZSAqLwotI2RlZmluZSBROAkweDAwMDAwMTAwCi0jZGVmaW5lIFExMAkweDAwMDAwNDAwCi0KLSNkZWZpbmUgUkVHX09WNTY0N19HQUlOX01TQiAgICAgICAgICAgMHgzNTBBCi0jZGVmaW5lIFJFR19PVjU2NDdfR0FJTl9MU0IgICAgICAgICAgIDB4MzUwQgotI2RlZmluZSBSRUdfT1Y1NjQ3X0xJTkVfSFNCICAgICAgICAgICAweDM1MDAKLSNkZWZpbmUgUkVHX09WNTY0N19MSU5FX01TQiAgICAgICAgICAgMHgzNTAxCi0jZGVmaW5lIFJFR19PVjU2NDdfTElORV9MU0IgICAgICAgICAgIDB4MzUwMgotCi0vKiBNQ0xLICovCi0jZGVmaW5lIE9WNTY0N19NQVNURVJfQ0xLX1JBVEUgMjQwMDAwMDAKLQotLyogQUYgVG90YWwgc3RlcHMgcGFyYW1ldGVycyAqLwotI2RlZmluZSBPVjU2NDdfVE9UQUxfU1RFUFNfTkVBUl9UT19GQVIJMzIKLQotI2RlZmluZSBPVjU2NDdfUkVHX1BSRVZfRlJBTUVfTEVOXzEJMzEKLSNkZWZpbmUgT1Y1NjQ3X1JFR19QUkVWX0ZSQU1FX0xFTl8yCTMyCi0jZGVmaW5lIE9WNTY0N19SRUdfUFJFVl9MSU5FX0xFTl8xCTMzCi0jZGVmaW5lIE9WNTY0N19SRUdfUFJFVl9MSU5FX0xFTl8yCTM0Ci0KLSNkZWZpbmUgT1Y1NjQ3X1JFR19TTkFQX0ZSQU1FX0xFTl8xCTE1Ci0jZGVmaW5lIE9WNTY0N19SRUdfU05BUF9GUkFNRV9MRU5fMgkxNgotI2RlZmluZSBPVjU2NDdfUkVHX1NOQVBfTElORV9MRU5fMQkxNwotI2RlZmluZSBPVjU2NDdfUkVHX1NOQVBfTElORV9MRU5fMgkxOAotI2RlZmluZSBNU0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgTFNCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qIERlYnVnIHN3aXRjaCAqLwotI2lmZGVmIENEQkcKLSN1bmRlZiBDREJHCi0jZW5kaWYKLSNpZmRlZiBDREJHX0hJR0gKLSN1bmRlZiBDREJHX0hJR0gKLSNlbmRpZgotCi0vKiNkZWZpbmUgT1Y1NjQ3X1ZFUkJPU0VfREdCKi8KLQotI2lmZGVmIE9WNTY0N19WRVJCT1NFX0RHQgotI2RlZmluZSBDREJHKGZtdCwgYXJncy4uLikgcHJfZGVidWcoZm10LCAjI2FyZ3MpCi0jZGVmaW5lIENEQkdfSElHSChmbXQsIGFyZ3MuLi4pIHByX2RlYnVnKGZtdCwgIyNhcmdzKQotI2Vsc2UKLSNkZWZpbmUgQ0RCRyhmbXQsIGFyZ3MuLi4pIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgQ0RCR19ISUdIKGZtdCwgYXJncy4uLikgcHJfZGVidWcoZm10LCAjI2FyZ3MpCi0jZW5kaWYKLQotLypmb3IgZGVidWcqLwotI2lmZGVmIENEQkcKLSN1bmRlZiBDREJHCi0jZW5kaWYKLSNkZWZpbmUgQ0RCRyhmbXQsIGFyZ3MuLi4pIHByaW50ayhmbXQsICMjYXJncykKLQotc3RhdGljIHVpbnQ4X3QgIG1vZGVfbWFzayA9IDB4MDk7Ci1zdHJ1Y3Qgb3Y1NjQ3X3dvcmtfdCB7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Ci19OwotCi1zdGF0aWMgc3RydWN0IG92NTY0N193b3JrX3QgKm92NTY0N19zZW5zb3J3Owotc3RhdGljIHN0cnVjdCBvdjU2NDdfd29ya190ICpvdjU2NDdfYWZfc2Vuc29ydzsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqb3Y1NjQ3X2FmX2NsaWVudDsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqb3Y1NjQ3X2NsaWVudDsKLQotc3RydWN0IG92NTY0N19jdHJsX3QgewotCWNvbnN0IHN0cnVjdCAgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2Vuc29yZGF0YTsKLQotCXVpbnQzMl90IHNlbnNvcm1vZGU7Ci0JdWludDMyX3QgZnBzX2RpdmlkZXI7LyogaW5pdCB0byAxICogMHgwMDAwMDQwMCAqLwotCXVpbnQzMl90IHBpY3RfZnBzX2RpdmlkZXI7LyogaW5pdCB0byAxICogMHgwMDAwMDQwMCAqLwotCXVpbnQxNl90IGZwczsKLQotCXVpbnQxNl90IGN1cnJfbGVuc19wb3M7Ci0JdWludDE2X3QgY3Vycl9zdGVwX3BvczsKLQl1aW50MTZfdCBteV9yZWdfZ2FpbjsKLQl1aW50MzJfdCBteV9yZWdfbGluZV9jb3VudDsKLQl1aW50MTZfdCB0b3RhbF9saW5lc19wZXJfZnJhbWU7Ci0KLQllbnVtIG92NTY0N19yZXNvbHV0aW9uX3QgcHJldl9yZXM7Ci0JZW51bSBvdjU2NDdfcmVzb2x1dGlvbl90IHBpY3RfcmVzOwotCWVudW0gb3Y1NjQ3X3Jlc29sdXRpb25fdCBjdXJyX3JlczsKLQllbnVtIG92NTY0N190ZXN0X21vZGVfdCAgc2V0X3Rlc3Q7Ci19OwotCi1zdGF0aWMgYm9vbCBDU0lfQ09ORklHOwotc3RhdGljIHN0cnVjdCBvdjU2NDdfY3RybF90ICpvdjU2NDdfY3RybDsKLQotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKG92NTY0N193YWl0X3F1ZXVlKTsKLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChvdjU2NDdfYWZfd2FpdF9xdWV1ZSk7Ci1ERUZJTkVfTVVURVgob3Y1NjQ3X211dCk7Ci0KLXN0YXRpYyB1aW50MTZfdCBwcmV2X2xpbmVfbGVuZ3RoX3BjazsKLXN0YXRpYyB1aW50MTZfdCBwcmV2X2ZyYW1lX2xlbmd0aF9saW5lczsKLXN0YXRpYyB1aW50MTZfdCBzbmFwX2xpbmVfbGVuZ3RoX3BjazsKLXN0YXRpYyB1aW50MTZfdCBzbmFwX2ZyYW1lX2xlbmd0aF9saW5lczsKLQotc3RhdGljIGludCBvdjU2NDdfaTJjX3J4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQkJdW5zaWduZWQgY2hhciAqcnhkYXRhLCBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKLQkJewotCQkJLmFkZHIgID0gc2FkZHIsCi0JCQkuZmxhZ3MgPSAwLAotCQkJLmxlbiAgID0gMiwKLQkJCS5idWYgICA9IHJ4ZGF0YSwKLQkJfSwKLQkJewotCQkJLmFkZHIgID0gc2FkZHIsCi0JCQkuZmxhZ3MgPSBJMkNfTV9SRCwKLQkJCS5sZW4gICA9IDEsCi0JCQkuYnVmICAgPSByeGRhdGEsCi0JCX0sCi0JfTsKLQlpZiAoaTJjX3RyYW5zZmVyKG92NTY0N19jbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpIDwgMCkgewotCQlDREJHKCJvdjU2NDdfaTJjX3J4ZGF0YSBmYWlsZCAweCV4XG4iLCBzYWRkcik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3Qgb3Y1NjQ3X2kyY190eGRhdGEodW5zaWduZWQgc2hvcnQgc2FkZHIsCi0JCXVuc2lnbmVkIGNoYXIgKnR4ZGF0YSwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKLQkJewotCQkJLmFkZHIgPSBzYWRkciwKLQkJCS5mbGFncyA9IDAsCi0JCQkubGVuID0gbGVuZ3RoLAotCQkJLmJ1ZiA9IHR4ZGF0YSwKLQkJfSwKLQl9OwotCWlmIChpMmNfdHJhbnNmZXIob3Y1NjQ3X2NsaWVudC0+YWRhcHRlciwgbXNnLCAxKSA8IDApIHsKLQkJQ0RCRygib3Y1NjQ3X2kyY190eGRhdGEgZmFpbGQgMHgleFxuIiwgc2FkZHIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3Qgb3Y1NjQ3X2kyY19yZWFkKHVuc2lnbmVkIHNob3J0IHJhZGRyLAotCQl1bnNpZ25lZCBzaG9ydCAqcmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JdW5zaWduZWQgY2hhciBidWZbMl07Ci0KLQlpZiAoIXJkYXRhKQotCQlyZXR1cm4gLUVJTzsKLQlDREJHKCIlczpzYWRkcjoweCV4IHJhZGRyOjB4JXggZGF0YToweCV4IiwKLQkJX19mdW5jX18sIG92NTY0N19jbGllbnQtPmFkZHIsIHJhZGRyLCAqcmRhdGEpOwotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZbMF0gPSAocmFkZHIgJiAweEZGMDApID4+IDg7Ci0JYnVmWzFdID0gKHJhZGRyICYgMHgwMEZGKTsKLQlyYyA9IG92NTY0N19pMmNfcnhkYXRhKG92NTY0N19jbGllbnQtPmFkZHIgPj4gMSwgYnVmLCAxKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIm92NTY0N19pMmNfcmVhZCAweCV4IGZhaWxlZCFcbiIsIHJhZGRyKTsKLQkJcmV0dXJuIHJjOwotCX0KLQkqcmRhdGEgPSBidWZbMF07Ci0JQ0RCRygib3Y1NjQ3X2kyY19yZWFkIDB4JXggdmFsID0gMHgleCFcbiIsIHJhZGRyLCAqcmRhdGEpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBvdjU2NDdfaTJjX3dyaXRlX2Jfc2Vuc29yKHVuc2lnbmVkIHNob3J0IHdhZGRyLCB1aW50OF90IGJkYXRhKQotewotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCXVuc2lnbmVkIGNoYXIgYnVmWzNdOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9ICh3YWRkciAmIDB4RkYwMCkgPj4gODsKLQlidWZbMV0gPSAod2FkZHIgJiAweDAwRkYpOwotCWJ1ZlsyXSA9IGJkYXRhOwotCUNEQkcoImkyY193cml0ZV9iIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4XG4iLCB3YWRkciwgYmRhdGEpOwotCXJjID0gb3Y1NjQ3X2kyY190eGRhdGEob3Y1NjQ3X2NsaWVudC0+YWRkciA+PiAxLCBidWYsIDMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCJpMmNfd3JpdGVfYiBmYWlsZWQsIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4IVxuIiwKLQkJCQl3YWRkciwgYmRhdGEpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG92NTY0N19pMmNfd3JpdGVfYl90YWJsZShzdHJ1Y3Qgb3Y1NjQ3X2kyY19yZWdfY29uZiBjb25zdAotCQkqcmVnX2NvbmZfdGJsLCBpbnQgbnVtKQotewotCWludCBpOwotCWludDMyX3QgcmMgPSAtRUlPOwotCi0JZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCXJjID0gb3Y1NjQ3X2kyY193cml0ZV9iX3NlbnNvcihyZWdfY29uZl90YmwtPndhZGRyLAotCQkJCXJlZ19jb25mX3RibC0+d2RhdGEpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0JCXJlZ19jb25mX3RibCsrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG92NTY0N19hZl9pMmNfdHhkYXRhKHVuc2lnbmVkIHNob3J0IHNhZGRyLAotCQl1bnNpZ25lZCBjaGFyICp0eGRhdGEsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGkyY19tc2cgbXNnW10gPSB7Ci0JCXsKLQkJCS5hZGRyID0gc2FkZHIsCi0JCQkuZmxhZ3MgPSAwLAotCQkJLmxlbiA9IGxlbmd0aCwKLQkJCS5idWYgPSB0eGRhdGEsCi0JCX0sCi0JfTsKLQlpZiAoaTJjX3RyYW5zZmVyKG92NTY0N19hZl9jbGllbnQtPmFkYXB0ZXIsIG1zZywgMSkgPCAwKSB7Ci0JCXByX2Vycigib3Y1NjQ3X2FmX2kyY190eGRhdGEgZmFpbGQgMHgleFxuIiwgc2FkZHIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3Qgb3Y1NjQ3X2FmX2kyY193cml0ZV9iX3NlbnNvcih1aW50OF90IHdhZGRyLCB1aW50OF90IGJkYXRhKQotewotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCXVuc2lnbmVkIGNoYXIgYnVmWzJdOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9IHdhZGRyOwotCWJ1ZlsxXSA9IGJkYXRhOwotCUNEQkcoImkyY193cml0ZV9iIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4XG4iLCB3YWRkciwgYmRhdGEpOwotCXJjID0gb3Y1NjQ3X2FmX2kyY190eGRhdGEob3Y1NjQ3X2FmX2NsaWVudC0+YWRkciwgYnVmLCAyKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiaTJjX3dyaXRlX2IgZmFpbGVkLCBhZGRyID0gMHgleCwgdmFsID0gMHgleCFcbiIsCi0JCQkJd2FkZHIsIGJkYXRhKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBvdjU2NDdfc3RhcnRfc3RyZWFtKHZvaWQpCi17Ci0JQ0RCRygiQ0FNRVJBX0RCRzogMHg0MjAyIDB4MCwgc3RyZWFtIG9uLi4uXHJcbiIpOwotCW92NTY0N19pMmNfd3JpdGVfYl9zZW5zb3IoMHg0MjAyLCAweDAwKTsvKiBzdHJlYW1pbmcgb24gKi8KLX0KLQotc3RhdGljIHZvaWQgb3Y1NjQ3X3N0b3Bfc3RyZWFtKHZvaWQpCi17Ci0JQ0RCRygiQ0FNRVJBX0RCRzogMHg0MjAyIDB4Ziwgc3RyZWFtIG9mZi4uLlxyXG4iKTsKLQlvdjU2NDdfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4NDIwMiwgMHgwZik7Lyogc3RyZWFtaW5nIG9mZiAqLwotfQotCi1zdGF0aWMgdm9pZCBvdjU2NDdfZ3JvdXBfaG9sZF9vbih2b2lkKQotewotCW92NTY0N19pMmNfd3JpdGVfYl9zZW5zb3IoMHgwMTA0LCAweDAxKTsKLX0KLQotc3RhdGljIHZvaWQgb3Y1NjQ3X2dyb3VwX2hvbGRfb2ZmKHZvaWQpCi17Ci0Jb3Y1NjQ3X2kyY193cml0ZV9iX3NlbnNvcigweDAxMDQsIDB4MCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG92NTY0N19nZXRfcGljdF9mcHModWludDE2X3QgZnBzLCB1aW50MTZfdCAqcGZwcykKLXsKLQkvKiBpbnB1dCBmcHMgaXMgcHJldmlldyBmcHMgaW4gUTggZm9ybWF0ICovCi0JdWludDMyX3QgZGl2aWRlciwgZDEsIGQyOwotCXVpbnQzMl90IHByZXZpZXdfcGNsayA9IDB4MzcsIHNuYXBzaG90X3BjbGsgPSAweDRmOwotCi0JZDEgPSAocHJldl9mcmFtZV9sZW5ndGhfbGluZXMgKiAweDAwMDAwNDAwKSAvIHNuYXBfZnJhbWVfbGVuZ3RoX2xpbmVzOwotCWQyID0gKHByZXZfbGluZV9sZW5ndGhfcGNrICogMHgwMDAwMDQwMCkgLyBzbmFwX2xpbmVfbGVuZ3RoX3BjazsKLQlkaXZpZGVyID0gKGQxICogZDIqcHJldmlld19wY2xrL3NuYXBzaG90X3BjbGspIC8gMHg0MDA7Ci0JQ0RCRyhLRVJOX0VSUiAib3Y1NjQ3X2dldF9waWN0X2ZwcyBkaXZpZGVyID0gJWQiLCBkaXZpZGVyKTsKLQkvKlZlcmlmeSBQQ0xLIHNldHRpbmdzIGFuZCBmcmFtZSBzaXplcy4qLwotCSpwZnBzID0gKHVpbnQxNl90KSAoZnBzICogZGl2aWRlciAvIDB4NDAwKTsKLX0KLQotc3RhdGljIHVpbnQxNl90IG92NTY0N19nZXRfcHJldl9saW5lc19wZih2b2lkKQotewotCWlmIChvdjU2NDdfY3RybC0+cHJldl9yZXMgPT0gUVRSX1NJWkUpCi0JCXJldHVybiBwcmV2X2ZyYW1lX2xlbmd0aF9saW5lczsKLQllbHNlCi0JCXJldHVybiBzbmFwX2ZyYW1lX2xlbmd0aF9saW5lczsKLX0KLQotc3RhdGljIHVpbnQxNl90IG92NTY0N19nZXRfcHJldl9waXhlbHNfcGwodm9pZCkKLXsKLQlpZiAob3Y1NjQ3X2N0cmwtPnByZXZfcmVzID09IFFUUl9TSVpFKQotCQlyZXR1cm4gcHJldl9saW5lX2xlbmd0aF9wY2s7Ci0JZWxzZQotCQlyZXR1cm4gc25hcF9saW5lX2xlbmd0aF9wY2s7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBvdjU2NDdfZ2V0X3BpY3RfbGluZXNfcGYodm9pZCkKLXsKLQlpZiAob3Y1NjQ3X2N0cmwtPnBpY3RfcmVzID09IFFUUl9TSVpFKQotCQlyZXR1cm4gcHJldl9mcmFtZV9sZW5ndGhfbGluZXM7Ci0JZWxzZQotCQlyZXR1cm4gc25hcF9mcmFtZV9sZW5ndGhfbGluZXM7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBvdjU2NDdfZ2V0X3BpY3RfcGl4ZWxzX3BsKHZvaWQpCi17Ci0JaWYgKG92NTY0N19jdHJsLT5waWN0X3JlcyA9PSBRVFJfU0laRSkKLQkJcmV0dXJuIHByZXZfbGluZV9sZW5ndGhfcGNrOwotCWVsc2UKLQkJcmV0dXJuIHNuYXBfbGluZV9sZW5ndGhfcGNrOwotfQotCi1zdGF0aWMgdWludDMyX3Qgb3Y1NjQ3X2dldF9waWN0X21heF9leHBfbGModm9pZCkKLXsKLQlyZXR1cm4gc25hcF9mcmFtZV9sZW5ndGhfbGluZXMgKiAyNDsKLX0KLQotc3RhdGljIGludDMyX3Qgb3Y1NjQ3X3NldF9mcHMoc3RydWN0IGZwc19jZmcgICAqZnBzKQotewotCXVpbnQxNl90IHRvdGFsX2xpbmVzX3Blcl9mcmFtZTsKLQlpbnQzMl90IHJjID0gMDsKLQotCW92NTY0N19jdHJsLT5mcHNfZGl2aWRlciA9IGZwcy0+ZnBzX2RpdjsKLQlvdjU2NDdfY3RybC0+cGljdF9mcHNfZGl2aWRlciA9IGZwcy0+cGljdF9mcHNfZGl2OwotCi0JaWYgKG92NTY0N19jdHJsLT5zZW5zb3Jtb2RlID09IFNFTlNPUl9QUkVWSUVXX01PREUpIHsKLQkJdG90YWxfbGluZXNfcGVyX2ZyYW1lID0gKHVpbnQxNl90KQotCQkoKHByZXZfZnJhbWVfbGVuZ3RoX2xpbmVzICogb3Y1NjQ3X2N0cmwtPmZwc19kaXZpZGVyKSAvIDB4NDAwKTsKLQl9IGVsc2UgewotCQl0b3RhbF9saW5lc19wZXJfZnJhbWUgPSAodWludDE2X3QpCi0JCSgoc25hcF9mcmFtZV9sZW5ndGhfbGluZXMgKiBvdjU2NDdfY3RybC0+ZnBzX2RpdmlkZXIpIC8gMHg0MDApOwotCX0KLQotCW92NTY0N19ncm91cF9ob2xkX29uKCk7Ci0JcmMgPSBvdjU2NDdfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MDM0MCwKLQkJCSgodG90YWxfbGluZXNfcGVyX2ZyYW1lICYgMHhGRjAwKSA+PiA4KSk7Ci0JcmMgPSBvdjU2NDdfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MDM0MSwKLQkJCSh0b3RhbF9saW5lc19wZXJfZnJhbWUgJiAweDAwRkYpKTsKLQlvdjU2NDdfZ3JvdXBfaG9sZF9vZmYoKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGlubGluZSB1aW50OF90IG92NTY0N19ieXRlKHVpbnQxNl90IHdvcmQsIHVpbnQ4X3Qgb2Zmc2V0KQotewotCXJldHVybiB3b3JkID4+IChvZmZzZXQgKiBCSVRTX1BFUl9CWVRFKTsKLX0KLQotc3RhdGljIGludDMyX3Qgb3Y1NjQ3X3dyaXRlX2V4cF9nYWluKHVpbnQxNl90IGdhaW4sIHVpbnQzMl90IGxpbmUpCi17Ci0JaW50IHJjID0gMDsKLQl1aW50MTZfdCBtYXhfbGluZTsKLQl1OCBpbnRnX3RpbWVfaHNiLCBpbnRnX3RpbWVfbXNiLCBpbnRnX3RpbWVfbHNiOwotCXVpbnQ4X3QgZ2Fpbl9sc2IsIGdhaW5faHNiOwotCW92NTY0N19jdHJsLT5teV9yZWdfZ2FpbiA9IGdhaW47Ci0Jb3Y1NjQ3X2N0cmwtPm15X3JlZ19saW5lX2NvdW50ID0gKHVpbnQxNl90KWxpbmU7Ci0KLQlDREJHKEtFUk5fRVJSICJwcmV2aWV3IGV4cG9zdXJlIHNldHRpbmcgMHgleCwgMHgleCwgJWQiLAotCQkgZ2FpbiwgbGluZSwgbGluZSk7Ci0KLQlnYWluX2xzYiA9ICh1aW50OF90KSAob3Y1NjQ3X2N0cmwtPm15X3JlZ19nYWluKTsKLQlnYWluX2hzYiA9ICh1aW50OF90KSgob3Y1NjQ3X2N0cmwtPm15X3JlZ19nYWluICYgMHgzMDApPj44KTsKLQkvKiBhZGp1c3QgZnJhbWUgcmF0ZSAqLwotCWlmIChsaW5lID4gOTgwKSB7Ci0JCXJjID0gb3Y1NjQ3X2kyY193cml0ZV9iX3NlbnNvcigweDM4MEUsCi0JCQkgKHVpbnQ4X3QpKChsaW5lKzQpID4+IDgpKSA7Ci0JCXJjID0gb3Y1NjQ3X2kyY193cml0ZV9iX3NlbnNvcigweDM4MEYsCi0JCQkgKHVpbnQ4X3QpKChsaW5lKzQpICYgMHgwMEZGKSkgOwotCQltYXhfbGluZSA9IGxpbmUgKyA0OwotCX0gZWxzZSBpZiAobWF4X2xpbmUgPiA5ODQpIHsKLQkJcmMgPSBvdjU2NDdfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MzgwRSwKLQkJCSAodWludDhfdCkoOTg0ID4+IDgpKSA7Ci0JCXJjID0gb3Y1NjQ3X2kyY193cml0ZV9iX3NlbnNvcigweDM4MEYsCi0JCQkgKHVpbnQ4X3QpKDk4NCAmIDB4MDBGRikpIDsKLQkJbWF4X2xpbmUgPSA5ODQ7Ci0JfQotCi0JbGluZSA9IGxpbmU8PDQ7Ci0JLyogb3Y1NjQ3IG5lZWQgdGhpcyBvcGVyYXRpb24gKi8KLQlpbnRnX3RpbWVfaHNiID0gKHU4KShsaW5lPj4xNik7Ci0JaW50Z190aW1lX21zYiA9ICh1OCkgKChsaW5lICYgMHhGRjAwKSA+PiA4KTsKLQlpbnRnX3RpbWVfbHNiID0gKHU4KSAobGluZSAmIDB4MDBGRik7Ci0KLQlvdjU2NDdfZ3JvdXBfaG9sZF9vbigpOwotCXJjID0gb3Y1NjQ3X2kyY193cml0ZV9iX3NlbnNvcihSRUdfT1Y1NjQ3X0xJTkVfSFNCLCBpbnRnX3RpbWVfaHNiKSA7Ci0JcmMgPSBvdjU2NDdfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19PVjU2NDdfTElORV9NU0IsIGludGdfdGltZV9tc2IpIDsKLQlyYyA9IG92NTY0N19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX09WNTY0N19MSU5FX0xTQiwgaW50Z190aW1lX2xzYikgOwotCi0JcmMgPSBvdjU2NDdfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19PVjU2NDdfR0FJTl9NU0IsIGdhaW5faHNiKSA7Ci0JcmMgPSBvdjU2NDdfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19PVjU2NDdfR0FJTl9MU0IsIGdhaW5fbHNiKSA7Ci0Jb3Y1NjQ3X2dyb3VwX2hvbGRfb2ZmKCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIGludDMyX3Qgb3Y1NjQ3X3NldF9waWN0X2V4cF9nYWluKHVpbnQxNl90IGdhaW4sIHVpbnQzMl90IGxpbmUpCi17Ci0JdWludDE2X3QgbWF4X2xpbmU7Ci0JaW50IHJjID0gMDsKLQl1aW50OF90IGdhaW5fbHNiLCBnYWluX2hzYjsKLQl1OCBpbnRnX3RpbWVfaHNiLCBpbnRnX3RpbWVfbXNiLCBpbnRnX3RpbWVfbHNiOwotCi0Jb3Y1NjQ3X2N0cmwtPm15X3JlZ19nYWluID0gZ2FpbjsKLQlvdjU2NDdfY3RybC0+bXlfcmVnX2xpbmVfY291bnQgPSAodWludDE2X3QpbGluZTsKLQotCWdhaW5fbHNiID0gKHVpbnQ4X3QpIChvdjU2NDdfY3RybC0+bXlfcmVnX2dhaW4pOwotCWdhaW5faHNiID0gKHVpbnQ4X3QpKChvdjU2NDdfY3RybC0+bXlfcmVnX2dhaW4gJiAweDMwMCk+PjgpOwotCi0JQ0RCRyhLRVJOX0VSUiAic25hcHNob3QgZXhwb3N1cmUgc2V0aW5nIDB4JXgsIDB4JXgsICVkIgotCQksIGdhaW4sIGxpbmUsIGxpbmUpOwotCi0JaWYgKGxpbmUgPiAxOTY0KSB7Ci0JCXJjID0gb3Y1NjQ3X2kyY193cml0ZV9iX3NlbnNvcigweDM4MEUsCi0JCQkgKHVpbnQ4X3QpKChsaW5lKzQpID4+IDgpKSA7Ci0JCXJjID0gb3Y1NjQ3X2kyY193cml0ZV9iX3NlbnNvcigweDM4MEYsCi0JCQkgKHVpbnQ4X3QpKChsaW5lKzQpICYgMHgwMEZGKSkgOwotCQltYXhfbGluZSA9IGxpbmUgKyA0OwotCX0gZWxzZSBpZiAobWF4X2xpbmUgPiAxOTY4KSB7Ci0JCXJjID0gb3Y1NjQ3X2kyY193cml0ZV9iX3NlbnNvcigweDM4MEUsCi0JCQkgKHVpbnQ4X3QpKDE5NjggPj4gOCkpIDsKLQkJcmMgPSBvdjU2NDdfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MzgwRiwKLQkJCSAodWludDhfdCkoMTk2OCAmIDB4MDBGRikpIDsKLQkJbWF4X2xpbmUgPSAxOTY4OwotCX0KLQlsaW5lID0gbGluZTw8NDsKLQkvKiBvdjU2NDcgbmVlZCB0aGlzIG9wZXJhdGlvbiAqLwotCWludGdfdGltZV9oc2IgPSAodTgpKGxpbmU+PjE2KTsKLQlpbnRnX3RpbWVfbXNiID0gKHU4KSAoKGxpbmUgJiAweEZGMDApID4+IDgpOwotCWludGdfdGltZV9sc2IgPSAodTgpIChsaW5lICYgMHgwMEZGKTsKLQotCS8qIEZJWE1FIGZvciBCTEMgdHJpZ2dlciAqLwotCW92NTY0N19ncm91cF9ob2xkX29uKCk7Ci0JcmMgPSBvdjU2NDdfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19PVjU2NDdfTElORV9IU0IsIGludGdfdGltZV9oc2IpIDsKLQlyYyA9IG92NTY0N19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX09WNTY0N19MSU5FX01TQiwgaW50Z190aW1lX21zYikgOwotCXJjID0gb3Y1NjQ3X2kyY193cml0ZV9iX3NlbnNvcihSRUdfT1Y1NjQ3X0xJTkVfTFNCLCBpbnRnX3RpbWVfbHNiKSA7Ci0KLQlyYyA9IG92NTY0N19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX09WNTY0N19HQUlOX01TQiwgZ2Fpbl9oc2IpIDsKLQlyYyA9IG92NTY0N19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX09WNTY0N19HQUlOX0xTQiwgZ2Fpbl9sc2IgLSAxKSA7Ci0KLQlyYyA9IG92NTY0N19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX09WNTY0N19MSU5FX0hTQiwgaW50Z190aW1lX2hzYikgOwotCXJjID0gb3Y1NjQ3X2kyY193cml0ZV9iX3NlbnNvcihSRUdfT1Y1NjQ3X0xJTkVfTVNCLCBpbnRnX3RpbWVfbXNiKSA7Ci0JcmMgPSBvdjU2NDdfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19PVjU2NDdfTElORV9MU0IsIGludGdfdGltZV9sc2IpIDsKLQotCXJjID0gb3Y1NjQ3X2kyY193cml0ZV9iX3NlbnNvcihSRUdfT1Y1NjQ3X0dBSU5fTVNCLCBnYWluX2hzYikgOwotCXJjID0gb3Y1NjQ3X2kyY193cml0ZV9iX3NlbnNvcihSRUdfT1Y1NjQ3X0dBSU5fTFNCLCBnYWluX2xzYikgOwotCW92NTY0N19ncm91cF9ob2xkX29mZigpOwotCi0JbXNsZWVwKDUwMCk7Ci0JcmV0dXJuIHJjOwotCi19Ci0KLXN0YXRpYyBpbnQzMl90IG92NTY0N19tb3ZlX2ZvY3VzKGludCBkaXJlY3Rpb24sIGludDMyX3QgbnVtX3N0ZXBzKQotewotCXVpbnQ4X3QgICBjb2RlX3ZhbF9tc2IgPSAwOwotCXVpbnQ4X3QgICBjb2RlX3ZhbF9sc2IgPSAwOwotCWludDE2X3QgICBzdGVwX2RpcmVjdGlvbiwgYWN0dWFsX3N0ZXAsIG5leHRfcG9zaXRpb247Ci0JaW50IHJjOwotCi0JaWYgKG51bV9zdGVwcyA9PSAwKQotCQlyZXR1cm4gMDsKLQotCWlmIChkaXJlY3Rpb24gPT0gTU9WRV9ORUFSKQotCQlzdGVwX2RpcmVjdGlvbiA9IDIwOwotCWVsc2UgaWYgKGRpcmVjdGlvbiA9PSBNT1ZFX0ZBUikKLQkJc3RlcF9kaXJlY3Rpb24gPSAtMjA7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWFjdHVhbF9zdGVwID0gKGludDE2X3QpKHN0ZXBfZGlyZWN0aW9uICogbnVtX3N0ZXBzKTsKLQluZXh0X3Bvc2l0aW9uID0gKGludDE2X3Qpb3Y1NjQ3X2N0cmwtPmN1cnJfbGVuc19wb3MgKyBhY3R1YWxfc3RlcDsKLQlpZiAobmV4dF9wb3NpdGlvbiA8IDApIHsKLQkJQ0RCRyhLRVJOX0VSUiAiJXM6IE9WNTY0NyBwb3NpdGlvbig9JWQpIG91dCBvZiByYW5nZSIsCi0JCQlfX2Z1bmNfXywgbmV4dF9wb3NpdGlvbik7Ci0JCW5leHRfcG9zaXRpb24gPSAwOwotCX0KLQlpZiAobmV4dF9wb3NpdGlvbiA+IDB4M0ZGKSB7Ci0JCUNEQkcoS0VSTl9FUlIgIiVzOiBPVjU2NDcgcG9zaXRpb24oPSVkKSBvdXQgb2YgcmFuZ2UiLAotCQkJX19mdW5jX18sIG5leHRfcG9zaXRpb24pOwotCQluZXh0X3Bvc2l0aW9uID0gMHgzRkY7Ci0JfQotCW92NTY0N19jdHJsLT5jdXJyX2xlbnNfcG9zID0gbmV4dF9wb3NpdGlvbjsKLQotCWNvZGVfdmFsX21zYiA9ICh1aW50OF90KSgob3Y1NjQ3X2N0cmwtPmN1cnJfbGVuc19wb3MgJiAweDAzRkYpID4+IDQpOwotCWNvZGVfdmFsX2xzYiA9ICh1aW50OF90KSgob3Y1NjQ3X2N0cmwtPmN1cnJfbGVuc19wb3MgJiAweDAwMEYpIDw8IDQpOwotCWNvZGVfdmFsX2xzYiB8PSBtb2RlX21hc2s7Ci0KLQlyYyA9IG92NTY0N19hZl9pMmNfd3JpdGVfYl9zZW5zb3IoY29kZV92YWxfbXNiLCBjb2RlX3ZhbF9sc2IpOwotCS8qIERBQyBTZXR0aW5nICovCi0JaWYgKHJjICE9IDApIHsKLQkJQ0RCRyhLRVJOX0VSUiAiJXM6IFdSSVRFIEVSUk9SIGxzYiA9IDB4JXgsIG1zYiA9IDB4JXgiLAotCQkJX19mdW5jX18sIGNvZGVfdmFsX2xzYiwgY29kZV92YWxfbXNiKTsKLQl9IGVsc2UgewotCQlDREJHKEtFUk5fRVJSICIlczogU3VjY2Vzc2Z1bCBsc2IgPSAweCV4LCBtc2IgPSAweCV4IiwKLQkJCV9fZnVuY19fLCBjb2RlX3ZhbF9sc2IsIGNvZGVfdmFsX21zYik7Ci0JCS8qIGRlbGF5IG1heSBzZXQgYmFzZWQgb24gdGhlIHN0ZXBzIG1vdmVkCi0JCXdoZW4gSTJDIHdyaXRlIHN1Y2Nlc3NmdWwgKi8KLQkJbXNsZWVwKDEwMCk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCBvdjU2NDdfc2V0X2RlZmF1bHRfZm9jdXModWludDhfdCBhZl9zdGVwKQotewotCXVpbnQ4X3QgIGNvZGVfdmFsX21zYiA9IDA7Ci0JdWludDhfdCAgY29kZV92YWxfbHNiID0gMDsKLQlpbnQgcmMgPSAwOwotCi0Jb3Y1NjQ3X2N0cmwtPmN1cnJfbGVuc19wb3MgPSAyMDA7Ci0KLQotCWNvZGVfdmFsX21zYiA9IChvdjU2NDdfY3RybC0+Y3Vycl9sZW5zX3BvcyAmIDB4MDNGRikgPj4gNDsKLQljb2RlX3ZhbF9sc2IgPSAob3Y1NjQ3X2N0cmwtPmN1cnJfbGVuc19wb3MgJiAweDAwMEYpIDw8IDQ7Ci0JY29kZV92YWxfbHNiIHw9IG1vZGVfbWFzazsKLQotCUNEQkcoS0VSTl9FUlIgIm92NTY0N19zZXRfZGVmYXVsdF9mb2N1czpsZW5zIHBvcyA9ICVkIiwKLQkJIG92NTY0N19jdHJsLT5jdXJyX2xlbnNfcG9zKTsKLQlyYyA9IG92NTY0N19hZl9pMmNfd3JpdGVfYl9zZW5zb3IoY29kZV92YWxfbXNiLCBjb2RlX3ZhbF9sc2IpOwotCS8qIERBQyBTZXR0aW5nICovCi0JaWYgKHJjICE9IDApCi0JCUNEQkcoS0VSTl9FUlIgIiVzOiBXUklURSBFUlJPUiBsc2IgPSAweCV4LCBtc2IgPSAweCV4IiwKLQkJCV9fZnVuY19fLCBjb2RlX3ZhbF9sc2IsIGNvZGVfdmFsX21zYik7Ci0JZWxzZQotCQlDREJHKEtFUk5fRVJSICIlczogV1JJVEUgc3VjY2Vzc2Z1bCBsc2IgPSAweCV4LCBtc2IgPSAweCV4IiwKLQkJCV9fZnVuY19fLCBjb2RlX3ZhbF9sc2IsIGNvZGVfdmFsX21zYik7Ci0KLQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3Qgb3Y1NjQ3X3Rlc3QoZW51bSBvdjU2NDdfdGVzdF9tb2RlX3QgbW8pCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlpZiAobW8gIT0gVEVTVF9PRkYpCi0JCXJjID0gb3Y1NjQ3X2kyY193cml0ZV9iX3NlbnNvcigweDA2MDEsICh1aW50OF90KSBtbyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIG92NTY0N19yZXNldF9zZW5zb3Iodm9pZCkKLXsKLQlvdjU2NDdfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MTAzLCAweDEpOwotfQotCi0KLXN0YXRpYyBpbnQzMl90IG92NTY0N19zZW5zb3Jfc2V0dGluZyhpbnQgdXBkYXRlX3R5cGUsIGludCBydCkKLXsKLQotCWludDMyX3QgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX2NzaV9wYXJhbXMgb3Y1NjQ3X2NzaV9wYXJhbXM7Ci0KLQlvdjU2NDdfc3RvcF9zdHJlYW0oKTsKLQotCS8qIHdhaXQgZm9yIGNsay9kYXRhIHJlYWxseSBzdG9wICovCi0JaWYgKChydCA9PSBSRVNfQ0FQVFVSRSkgfHwgKENTSV9DT05GSUcgPT0gMCkpCi0JCW1zbGVlcCg2Nik7Ci0JZWxzZQotCQltc2xlZXAoMjY2KTsKLQotCUNEQkcoIkNBTUVSQV9EQkcxOiAweDQ4MDAgcmVnVmFsOjB4MjVcclxuIik7Ci0Jb3Y1NjQ3X2kyY193cml0ZV9iX3NlbnNvcigweDQ4MDAsIDB4MjUpOy8qIHN0cmVhbWluZyBvZmYgKi8KLQotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotCi0JaWYgKHVwZGF0ZV90eXBlID09IFJFR19JTklUKSB7Ci0JCW92NTY0N19yZXNldF9zZW5zb3IoKTsKLQkJb3Y1NjQ3X2kyY193cml0ZV9iX3RhYmxlKG92NTY0N19yZWdzLnJlY19zZXR0aW5ncywKLQkJCW92NTY0N19yZWdzLnJlY19zaXplKTsKLQkJQ1NJX0NPTkZJRyA9IDA7Ci0JfSBlbHNlIGlmICh1cGRhdGVfdHlwZSA9PSBVUERBVEVfUEVSSU9ESUMpIHsKLQkJCS8qIHR1cm4gb2ZmIGZsYXNoIHdoZW4gcHJldmlldyAqLwotCi0JCQlpZiAocnQgPT0gUkVTX1BSRVZJRVcpIHsKLQkJCQlvdjU2NDdfaTJjX3dyaXRlX2JfdGFibGUob3Y1NjQ3X3JlZ3MucmVnX3ByZXYsCi0JCQkJCSBvdjU2NDdfcmVncy5yZWdfcHJldl9zaXplKTsKLQkJCQlDREJHKCJDQU1FUkFfREJHOnByZXZpZXcgc2V0dGluZ3MuLi5cclxuIik7Ci0JCQl9IGVsc2UgewotCQkJCW92NTY0N19pMmNfd3JpdGVfYl90YWJsZShvdjU2NDdfcmVncy5yZWdfc25hcCwKLQkJCQkJIG92NTY0N19yZWdzLnJlZ19zbmFwX3NpemUpOwotCQkJCUNEQkcoIkNBTUVSQV9EQkc6c25hcHNob3Qgc2V0dGluZ3MuLi5cclxuIik7Ci0JCQl9Ci0KLQkJCW1zbGVlcCgyMCk7Ci0JCQlpZiAoIUNTSV9DT05GSUcpIHsKLQkJCQltc21fY2FtaW9fdmZlX2Nsa19yYXRlX3NldCgxOTIwMDAwMDApOwotCQkJCW92NTY0N19jc2lfcGFyYW1zLmRhdGFfZm9ybWF0ID0gQ1NJXzhCSVQ7Ci0JCQkJb3Y1NjQ3X2NzaV9wYXJhbXMubGFuZV9jbnQgPSAyOwotCQkJCW92NTY0N19jc2lfcGFyYW1zLmxhbmVfYXNzaWduID0gMHhlNDsKLQkJCQlvdjU2NDdfY3NpX3BhcmFtcy5kcGNtX3NjaGVtZSA9IDA7Ci0JCQkJb3Y1NjQ3X2NzaV9wYXJhbXMuc2V0dGxlX2NudCA9IDEwOwotCQkJCXJjID0gbXNtX2NhbWlvX2NzaV9jb25maWcoJm92NTY0N19jc2lfcGFyYW1zKTsKLQkJCQltc2xlZXAoMjApOwotCQkJCUNTSV9DT05GSUcgPSAxOwotCQkJLyogZXhpdCBwb3dlcmRvd24gc3RhdGUgKi8KLQkJCQlvdjU2NDdfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MDEwMCwgMHgwMSk7Ci0JCQl9Ci0JCQlDREJHKCJDQU1FUkFfREJHOiAweDQ4MDAgcmVnVmFsOjB4MDRcclxuIik7Ci0JCQkvKiBzdHJlYW1pbmcgb24gKi8KLQkJCW92NTY0N19pMmNfd3JpdGVfYl9zZW5zb3IoMHg0ODAwLCAweDA0KTsKLQkJCW1zbGVlcCgyNjYpOwotCQkJb3Y1NjQ3X3N0YXJ0X3N0cmVhbSgpOwotCQkJbXNsZWVwKDMwKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBvdjU2NDdfdmlkZW9fY29uZmlnKGludCBtb2RlKQotewotCWludDMyX3QgcmMgPSAwOwotCWludCBydDsKLQlDREJHKCJ2aWRlbyBjb25maWdcbiIpOwotCS8qIGNoYW5nZSBzZW5zb3IgcmVzb2x1dGlvbiBpZiBuZWVkZWQgKi8KLQlpZiAob3Y1NjQ3X2N0cmwtPnByZXZfcmVzID09IFFUUl9TSVpFKQotCQlydCA9IFJFU19QUkVWSUVXOwotCWVsc2UKLQkJcnQgPSBSRVNfQ0FQVFVSRTsKLQlpZiAob3Y1NjQ3X3NlbnNvcl9zZXR0aW5nKFVQREFURV9QRVJJT0RJQywgcnQpIDwgMCkKLQkJcmV0dXJuIHJjOwotCWlmIChvdjU2NDdfY3RybC0+c2V0X3Rlc3QpIHsKLQkJaWYgKG92NTY0N190ZXN0KG92NTY0N19jdHJsLT5zZXRfdGVzdCkgPCAwKQotCQkJcmV0dXJuICByYzsKLQl9Ci0KLQlvdjU2NDdfY3RybC0+Y3Vycl9yZXMgPSBvdjU2NDdfY3RybC0+cHJldl9yZXM7Ci0Jb3Y1NjQ3X2N0cmwtPnNlbnNvcm1vZGUgPSBtb2RlOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3Qgb3Y1NjQ3X3NuYXBzaG90X2NvbmZpZyhpbnQgbW9kZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlpbnQgcnQ7Ci0KLQkvKmNoYW5nZSBzZW5zb3IgcmVzb2x1dGlvbiBpZiBuZWVkZWQgKi8KLQlpZiAob3Y1NjQ3X2N0cmwtPmN1cnJfcmVzICE9IG92NTY0N19jdHJsLT5waWN0X3JlcykgewotCQlpZiAob3Y1NjQ3X2N0cmwtPnBpY3RfcmVzID09IFFUUl9TSVpFKQotCQkJcnQgPSBSRVNfUFJFVklFVzsKLQkJZWxzZQotCQkJcnQgPSBSRVNfQ0FQVFVSRTsKLQkJaWYgKG92NTY0N19zZW5zb3Jfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsIHJ0KSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0Jb3Y1NjQ3X2N0cmwtPmN1cnJfcmVzID0gb3Y1NjQ3X2N0cmwtPnBpY3RfcmVzOwotCW92NTY0N19jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG92NTY0N19yYXdfc25hcHNob3RfY29uZmlnKGludCBtb2RlKQotewotCWludDMyX3QgcmMgPSAwOwotCWludCBydDsKLQotCS8qIGNoYW5nZSBzZW5zb3IgcmVzb2x1dGlvbiBpZiBuZWVkZWQgKi8KLQlpZiAob3Y1NjQ3X2N0cmwtPmN1cnJfcmVzICE9IG92NTY0N19jdHJsLT5waWN0X3JlcykgewotCQlpZiAob3Y1NjQ3X2N0cmwtPnBpY3RfcmVzID09IFFUUl9TSVpFKQotCQkJcnQgPSBSRVNfUFJFVklFVzsKLQkJZWxzZQotCQkJcnQgPSBSRVNfQ0FQVFVSRTsKLQkJaWYgKG92NTY0N19zZW5zb3Jfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsIHJ0KSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0Jb3Y1NjQ3X2N0cmwtPmN1cnJfcmVzID0gb3Y1NjQ3X2N0cmwtPnBpY3RfcmVzOwotCW92NTY0N19jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG92NTY0N19zZXRfc2Vuc29yX21vZGUoaW50IG1vZGUsCi0JCWludCByZXMpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFNFTlNPUl9QUkVWSUVXX01PREU6Ci0JCXJjID0gb3Y1NjQ3X3ZpZGVvX2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfU05BUFNIT1RfTU9ERToKLQkJcmMgPSBvdjU2NDdfc25hcHNob3RfY29uZmlnKG1vZGUpOwotCQlicmVhazsKLQljYXNlIFNFTlNPUl9SQVdfU05BUFNIT1RfTU9ERToKLQkJcmMgPSBvdjU2NDdfcmF3X3NuYXBzaG90X2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBvdjU2NDdfcG93ZXJfZG93bih2b2lkKQotewotCW92NTY0N19zdG9wX3N0cmVhbSgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG92NTY0N19wcm9iZV9pbml0X2RvbmUoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JQ0RCRygicHJvYmUgZG9uZVxuIik7Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnNlbnNvcl9wd2QsIDEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG92NTY0N19wcm9iZV9pbml0X3NlbnNvcihjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1aW50MTZfdCByZWdhZGRyZXNzMSA9IDB4MzAwYTsKLQl1aW50MTZfdCByZWdhZGRyZXNzMiA9IDB4MzAwYjsKLQl1aW50MTZfdCBjaGlwaWQxID0gMDsKLQl1aW50MTZfdCBjaGlwaWQyID0gMDsKLQotCUNEQkcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5zZW5zb3JfcHdkLCAwKTsKLQl1c2xlZXBfcmFuZ2UoNDAwMCwgNDEwMCk7Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnNlbnNvcl9yZXNldCwgMSk7Ci0JdXNsZWVwX3JhbmdlKDIwMDAsIDIxMDApOwotCi0Jb3Y1NjQ3X2kyY19yZWFkKHJlZ2FkZHJlc3MxLCAmY2hpcGlkMSk7Ci0JaWYgKGNoaXBpZDEgIT0gMHg1NikgewotCQlyYyA9IC1FTk9ERVY7Ci0JCXByX2Vycigib3Y1NjQ3X3Byb2JlX2luaXRfc2Vuc29yIGZhaWwgY2hpcCBpZCBkb2Vzbm90IG1hdGNoXG4iKTsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCi0Jb3Y1NjQ3X2kyY19yZWFkKHJlZ2FkZHJlc3MyLCAmY2hpcGlkMik7Ci0JaWYgKGNoaXBpZDIgIT0gMHg0NykgewotCQlyYyA9IC1FTk9ERVY7Ci0JCXByX2Vycigib3Y1NjQ3X3Byb2JlX2luaXRfc2Vuc29yIGZhaWwgY2hpcCBpZCBkb2Vzbm90IG1hdGNoXG4iKTsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCi0JcHJfZXJyKCJJRDE6IDB4JXhcbiIsIGNoaXBpZDEpOwotCXByX2VycigiSUQyOiAweCV4XG4iLCBjaGlwaWQyKTsKLQlnb3RvIGluaXRfcHJvYmVfZG9uZTsKLQotaW5pdF9wcm9iZV9mYWlsOgotCXByX2VycigiIG92NTY0N19wcm9iZV9pbml0X3NlbnNvciBmYWlsc1xuIik7Ci0Jb3Y1NjQ3X3Byb2JlX2luaXRfZG9uZShkYXRhKTsKLQlyZXR1cm4gcmM7Ci1pbml0X3Byb2JlX2RvbmU6Ci0JcHJfZGVidWcoIiBvdjU2NDdfcHJvYmVfaW5pdF9zZW5zb3IgZmluaXNoZXNcbiIpOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5zZW5zb3JfcHdkLCAxKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIGludCBvdjU2NDdfc2Vuc29yX29wZW5faW5pdChjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCUNEQkcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlDREJHKCJDYWxsaW5nIG92NTY0N19zZW5zb3Jfb3Blbl9pbml0XG4iKTsKLQotCW92NTY0N19jdHJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG92NTY0N19jdHJsX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW92NTY0N19jdHJsKSB7Ci0JCUNEQkcoIm92NTY0N19pbml0IGZhaWxlZCFcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gaW5pdF9kb25lOwotCX0KLQlvdjU2NDdfY3RybC0+ZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQlvdjU2NDdfY3RybC0+cGljdF9mcHNfZGl2aWRlciA9IDEgKiAweDAwMDAwNDAwOwotCW92NTY0N19jdHJsLT5zZXRfdGVzdCA9IFRFU1RfT0ZGOwotCW92NTY0N19jdHJsLT5wcmV2X3JlcyA9IFFUUl9TSVpFOwotCW92NTY0N19jdHJsLT5waWN0X3JlcyA9IEZVTExfU0laRTsKLQotCWlmIChkYXRhKQotCQlvdjU2NDdfY3RybC0+c2Vuc29yZGF0YSA9IGRhdGE7Ci0KLQlwcmV2X2ZyYW1lX2xlbmd0aF9saW5lcyA9IDB4M2Q4OwotCi0JcHJldl9saW5lX2xlbmd0aF9wY2sgPSAweDc2OCoyOwotCi0Jc25hcF9mcmFtZV9sZW5ndGhfbGluZXMgPSAweDdiMDsKLQotCXNuYXBfbGluZV9sZW5ndGhfcGNrID0gMHhhOGM7Ci0KLQkvKiBlbmFibGUgbWNsayBmaXJzdCAqLwotCW1zbV9jYW1pb19jbGtfcmF0ZV9zZXQoT1Y1NjQ3X01BU1RFUl9DTEtfUkFURSk7Ci0KLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+c2Vuc29yX3B3ZCwgMSk7Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7Ci0JLyogcG93ZXIgb24gY2FtZXJhIGxkbyBhbmQgdnJlZyAqLwotCWlmIChvdjU2NDdfY3RybC0+c2Vuc29yZGF0YS0+cG1pY19ncGlvX2VuYWJsZSkKLQkJbGNkX2NhbWVyYV9wb3dlcl9vbm9mZigxKTsKLQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsgLyp3YWl0aW5nIGZvciBsZG8gc3RhYmxlKi8KLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+c2Vuc29yX3B3ZCwgMCk7Ci0JbXNsZWVwKDIwKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+c2Vuc29yX3Jlc2V0LCAxKTsKLQltc2xlZXAoMjUpOwotCi0JQ0RCRygiaW5pdCBzZXR0aW5nc1xuIik7Ci0JaWYgKG92NTY0N19jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkKLQkJcmMgPSBvdjU2NDdfc2Vuc29yX3NldHRpbmcoUkVHX0lOSVQsIFJFU19QUkVWSUVXKTsKLQllbHNlCi0JCXJjID0gb3Y1NjQ3X3NlbnNvcl9zZXR0aW5nKFJFR19JTklULCBSRVNfQ0FQVFVSRSk7Ci0Jb3Y1NjQ3X2N0cmwtPmZwcyA9IDMwICogUTg7Ci0KLQkvKiBlbmFibGUgQUYgYWN0dWF0b3IgKi8KLQlpZiAob3Y1NjQ3X2N0cmwtPnNlbnNvcmRhdGEtPnZjbV9lbmFibGUpIHsKLQkJQ0RCRygiZW5hYmxlIEFGIGFjdHVhdG9yLCBncGlvID0gJWRcbiIsCi0JCQkgb3Y1NjQ3X2N0cmwtPnNlbnNvcmRhdGEtPnZjbV9wd2QpOwotCQlyYyA9IGdwaW9fcmVxdWVzdChvdjU2NDdfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCwKLQkJCQkJCSJvdjU2NDdfYWYiKTsKLQkJaWYgKCFyYykKLQkJCWdwaW9fZGlyZWN0aW9uX291dHB1dCgKLQkJCQlvdjU2NDdfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCwKLQkJCQkgMSk7Ci0JCWVsc2UgewotCQkJcHJfZXJyKCJvdjU2NDdfY3RybCBncGlvIHJlcXVlc3QgZmFpbGVkIVxuIik7Ci0JCQlnb3RvIGluaXRfZmFpbDsKLQkJfQotCQltc2xlZXAoMjApOwotCQlyYyA9IG92NTY0N19zZXRfZGVmYXVsdF9mb2N1cygwKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG92NTY0N19jdHJsLT5zZW5zb3JkYXRhLT52Y21fcHdkLAotCQkJCQkJCQkwKTsKLQkJCWdwaW9fZnJlZShvdjU2NDdfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCk7Ci0JCX0KLQl9Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X2ZhaWw7Ci0JZWxzZQotCQlnb3RvIGluaXRfZG9uZTsKLWluaXRfZmFpbDoKLQlDREJHKCJpbml0X2ZhaWxcbiIpOwotCW92NTY0N19wcm9iZV9pbml0X2RvbmUoZGF0YSk7Ci0JLyogTm8gbmVlZCB0byBwb3dlciBPRkYgY2FtZXJhIGxkbyBhbmQgdnJlZwotCWFmZmVjdHMgRGlzcGxheSB3aGlsZSByZXN1bWUgKi8KLWluaXRfZG9uZToKLQlDREJHKCJpbml0X2RvbmVcbiIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBvdjU2NDdfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG92NTY0N19pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCS8qIEluaXRpYWxpemUgdGhlIE1TTV9DQU1JMkMgQ2hpcCAqLwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm92NTY0N193YWl0X3F1ZXVlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdjU2NDdfYWZfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQkvKiBJbml0aWFsaXplIHRoZSBNU01fQ0FNSTJDIENoaXAgKi8KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZvdjU2NDdfYWZfd2FpdF9xdWV1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBvdjU2NDdfYWZfaTJjX2lkW10gPSB7Ci0JeyJvdjU2NDdfYWYiLCAwfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBpbnQgb3Y1NjQ3X2FmX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJjID0gMDsKLQlDREJHKCJvdjU2NDdfYWZfcHJvYmUgY2FsbGVkIVxuIik7Ci0KLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgewotCQlDREJHKCJpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eSBmYWlsZWRcbiIpOwotCQlnb3RvIHByb2JlX2ZhaWx1cmU7Ci0JfQotCi0Jb3Y1NjQ3X2FmX3NlbnNvcncgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb3Y1NjQ3X3dvcmtfdCksIEdGUF9LRVJORUwpOwotCWlmICghb3Y1NjQ3X2FmX3NlbnNvcncpIHsKLQkJQ0RCRygia3phbGxvYyBmYWlsZWQuXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIHByb2JlX2ZhaWx1cmU7Ci0JfQotCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgb3Y1NjQ3X2FmX3NlbnNvcncpOwotCW92NTY0N19hZl9pbml0X2NsaWVudChjbGllbnQpOwotCW92NTY0N19hZl9jbGllbnQgPSBjbGllbnQ7Ci0KLQltc2xlZXAoNTApOwotCi0JQ0RCRygib3Y1NjQ3X2FmX3Byb2JlIHN1Y2Nlc3NlZCEgcmMgPSAlZFxuIiwgcmMpOwotCXJldHVybiAwOwotCi1wcm9iZV9mYWlsdXJlOgotCUNEQkcoIm92NTY0N19hZl9wcm9iZSBmYWlsZWQhIHJjID0gJWRcbiIsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBvdjU2NDdfaTJjX2lkW10gPSB7Ci0JeyJvdjU2NDciLCAwfSwge30KLX07Ci0KLXN0YXRpYyBpbnQgb3Y1NjQ3X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJjID0gMDsKLQlDREJHKCJvdjU2NDdfcHJvYmUgY2FsbGVkIVxuIik7Ci0KLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgewotCQlDREJHKCJpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eSBmYWlsZWRcbiIpOwotCQlnb3RvIHByb2JlX2ZhaWx1cmU7Ci0JfQotCi0Jb3Y1NjQ3X3NlbnNvcncgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb3Y1NjQ3X3dvcmtfdCksIEdGUF9LRVJORUwpOwotCWlmICghb3Y1NjQ3X3NlbnNvcncpIHsKLQkJQ0RCRygia3phbGxvYyBmYWlsZWQuXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIHByb2JlX2ZhaWx1cmU7Ci0JfQotCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgb3Y1NjQ3X3NlbnNvcncpOwotCW92NTY0N19pbml0X2NsaWVudChjbGllbnQpOwotCW92NTY0N19jbGllbnQgPSBjbGllbnQ7Ci0KLQltc2xlZXAoNTApOwotCi0JQ0RCRygib3Y1NjQ3X3Byb2JlIHN1Y2Nlc3NlZCEgcmMgPSAlZFxuIiwgcmMpOwotCXJldHVybiAwOwotCi1wcm9iZV9mYWlsdXJlOgotCUNEQkcoIm92NTY0N19wcm9iZSBmYWlsZWQhIHJjID0gJWRcbiIsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IG92NTY0N19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3Qgb3Y1NjQ3X3dvcmtfdCAqc2Vuc29ydyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBzZW5zb3J3KTsKLQlvdjU2NDdfY2xpZW50ID0gTlVMTDsKLQlrZnJlZShzZW5zb3J3KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgb3Y1NjQ3X2FmX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBvdjU2NDdfd29ya190ICpvdjU2NDdfYWYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlmcmVlX2lycShjbGllbnQtPmlycSwgb3Y1NjQ3X2FmKTsKLQlvdjU2NDdfYWZfY2xpZW50ID0gTlVMTDsKLQlrZnJlZShvdjU2NDdfYWYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgb3Y1NjQ3X2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gb3Y1NjQ3X2kyY19pZCwKLQkucHJvYmUgID0gb3Y1NjQ3X2kyY19wcm9iZSwKLQkucmVtb3ZlID0gb3Y1NjQ3X2kyY19yZW1vdmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAib3Y1NjQ3IiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG92NTY0N19hZl9pMmNfZHJpdmVyID0gewotCS5pZF90YWJsZSA9IG92NTY0N19hZl9pMmNfaWQsCi0JLnByb2JlICA9IG92NTY0N19hZl9pMmNfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZXhpdF9wKG92NTY0N19hZl9pMmNfcmVtb3ZlKSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJvdjU2NDdfYWYiLAotCX0sCi19OwotCi1pbnQgb3Y1NjQ3X3NlbnNvcl9jb25maWcodm9pZCBfX3VzZXIgKmFyZ3ApCi17Ci0Jc3RydWN0IHNlbnNvcl9jZmdfZGF0YSBjZGF0YTsKLQlsb25nICAgcmMgPSAwOwotCWlmIChjb3B5X2Zyb21fdXNlcigmY2RhdGEsCi0JCQkJKHZvaWQgKilhcmdwLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCW11dGV4X2xvY2soJm92NTY0N19tdXQpOwotCUNEQkcoIm92NTY0N19zZW5zb3JfY29uZmlnOiBjZmd0eXBlID0gJWRcbiIsCi0JCQljZGF0YS5jZmd0eXBlKTsKLQlzd2l0Y2ggKGNkYXRhLmNmZ3R5cGUpIHsKLQljYXNlIENGR19HRVRfUElDVF9GUFM6Ci0JCW92NTY0N19nZXRfcGljdF9mcHMoCi0JCQljZGF0YS5jZmcuZ2Zwcy5wcmV2ZnBzLAotCQkJJihjZGF0YS5jZmcuZ2Zwcy5waWN0ZnBzKSk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkmY2RhdGEsCi0JCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQljYXNlIENGR19HRVRfUFJFVl9MX1BGOgotCQljZGF0YS5jZmcucHJldmxfcGYgPQotCQkJb3Y1NjQ3X2dldF9wcmV2X2xpbmVzX3BmKCk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX0dFVF9QUkVWX1BfUEw6Ci0JCWNkYXRhLmNmZy5wcmV2cF9wbCA9Ci0JCQlvdjU2NDdfZ2V0X3ByZXZfcGl4ZWxzX3BsKCk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX0dFVF9QSUNUX0xfUEY6Ci0JCWNkYXRhLmNmZy5waWN0bF9wZiA9Ci0JCQlvdjU2NDdfZ2V0X3BpY3RfbGluZXNfcGYoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfR0VUX1BJQ1RfUF9QTDoKLQkJY2RhdGEuY2ZnLnBpY3RwX3BsID0KLQkJCW92NTY0N19nZXRfcGljdF9waXhlbHNfcGwoKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX0dFVF9QSUNUX01BWF9FWFBfTEM6Ci0JCWNkYXRhLmNmZy5waWN0X21heF9leHBfbGMgPQotCQkJb3Y1NjQ3X2dldF9waWN0X21heF9leHBfbGMoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX0ZQUzoKLQljYXNlIENGR19TRVRfUElDVF9GUFM6Ci0JCXJjID0gb3Y1NjQ3X3NldF9mcHMoJihjZGF0YS5jZmcuZnBzKSk7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9FWFBfR0FJTjoKLQkJcmMgPSBvdjU2NDdfd3JpdGVfZXhwX2dhaW4oY2RhdGEuY2ZnLmV4cF9nYWluLmdhaW4sCi0JCQkJY2RhdGEuY2ZnLmV4cF9nYWluLmxpbmUpOwotCQlicmVhazsKLQljYXNlIENGR19TRVRfUElDVF9FWFBfR0FJTjoKLQkJcmMgPSBvdjU2NDdfc2V0X3BpY3RfZXhwX2dhaW4oY2RhdGEuY2ZnLmV4cF9nYWluLmdhaW4sCi0JCQkJY2RhdGEuY2ZnLmV4cF9nYWluLmxpbmUpOwotCQlicmVhazsKLQljYXNlIENGR19TRVRfTU9ERToKLQkJcmMgPSBvdjU2NDdfc2V0X3NlbnNvcl9tb2RlKGNkYXRhLm1vZGUsIGNkYXRhLnJzKTsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfUFdSX0RPV046Ci0JCXJjID0gb3Y1NjQ3X3Bvd2VyX2Rvd24oKTsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfTU9WRV9GT0NVUzoKLQkJcmMgPSBvdjU2NDdfbW92ZV9mb2N1cyhjZGF0YS5jZmcuZm9jdXMuZGlyLAotCQkJCWNkYXRhLmNmZy5mb2N1cy5zdGVwcyk7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9ERUZBVUxUX0ZPQ1VTOgotCQlyYyA9IG92NTY0N19zZXRfZGVmYXVsdF9mb2N1cyhjZGF0YS5jZmcuZm9jdXMuc3RlcHMpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX0dFVF9BRl9NQVhfU1RFUFM6Ci0JCWNkYXRhLm1heF9zdGVwcyA9IE9WNTY0N19UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUjsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJCSZjZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQljYXNlIENGR19TRVRfRUZGRUNUOgotCQlyYyA9IG92NTY0N19zZXRfZGVmYXVsdF9mb2N1cyhjZGF0YS5jZmcuZWZmZWN0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZvdjU2NDdfbXV0KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBvdjU2NDdfc2Vuc29yX3JlbGVhc2Uodm9pZCkKLXsKLQlpbnQgcmMgPSAtRUJBREY7Ci0JdW5zaWduZWQgc2hvcnQgcmRhdGE7Ci0KLQltdXRleF9sb2NrKCZvdjU2NDdfbXV0KTsKLQlvdjU2NDdfcG93ZXJfZG93bigpOwotCW1zbGVlcCgyMCk7Ci0Jb3Y1NjQ3X2kyY19yZWFkKDB4MzAxOCwgJnJkYXRhKTsKLQlyZGF0YSB8PSAweDE4OyAvKnNldCBiaXQgMyBiaXQgNCB0byAxKi8KLQlvdjU2NDdfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MzAxOCwgcmRhdGEpOy8qd3JpdGUgYmFjayovCi0JbXNsZWVwKDIwKTsKLQotCWdwaW9fc2V0X3ZhbHVlKG92NTY0N19jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcHdkLCAxKTsKLQl1c2xlZXBfcmFuZ2UoNTAwMCwgNTEwMCk7Ci0JaWYgKG92NTY0N19jdHJsLT5zZW5zb3JkYXRhLT52Y21fZW5hYmxlKSB7Ci0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChvdjU2NDdfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCwgMCk7Ci0JCWdwaW9fZnJlZShvdjU2NDdfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCk7Ci0JfQotCi0JLyogTm8gbmVlZCB0byBwb3dlciBPRkYgY2FtZXJhIGxkbyBhbmQgdnJlZwotCWFmZmVjdHMgRGlzcGxheSB3aGlsZSByZXN1bWUgKi8KLQotCWtmcmVlKG92NTY0N19jdHJsKTsKLQlvdjU2NDdfY3RybCA9IE5VTEw7Ci0JQ0RCRygib3Y1NjQ3X3JlbGVhc2UgY29tcGxldGVkXG4iKTsKLQltdXRleF91bmxvY2soJm92NTY0N19tdXQpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92NTY0N19zZW5zb3JfcHJvYmUoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmluZm8sCi0JCXN0cnVjdCBtc21fc2Vuc29yX2N0cmwgKnMpCi17Ci0JaW50IHJjID0gMDsKLQotCUNEQkcoIiVzIEVcbiIsIF9fZnVuY19fKTsKLQotCWdwaW9fZGlyZWN0aW9uX291dHB1dChpbmZvLT5zZW5zb3JfcHdkLCAxKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoaW5mby0+c2Vuc29yX3Jlc2V0LCAwKTsKLQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7Ci0JLyogdHVybiBvbiBsZG8gYW5kIHZyZWcgKi8KLQlpZiAoaW5mby0+cG1pY19ncGlvX2VuYWJsZSkKLQkJbGNkX2NhbWVyYV9wb3dlcl9vbm9mZigxKTsKLQotCXJjID0gaTJjX2FkZF9kcml2ZXIoJm92NTY0N19pMmNfZHJpdmVyKTsKLQlpZiAocmMgPCAwIHx8IG92NTY0N19jbGllbnQgPT0gTlVMTCkgewotCQlyYyA9IC1FTk9UU1VQUDsKLQkJQ0RCRygiSTJDIGFkZCBkcml2ZXIgb3Y1NjQ3IGZhaWxlZCIpOwotCQlnb3RvIHByb2JlX2ZhaWxfMjsKLQl9Ci0JaWYgKGluZm8tPnZjbV9lbmFibGUpIHsKLQkJcmMgPSBpMmNfYWRkX2RyaXZlcigmb3Y1NjQ3X2FmX2kyY19kcml2ZXIpOwotCQlpZiAocmMgPCAwIHx8IG92NTY0N19hZl9jbGllbnQgPT0gTlVMTCkgewotCQkJcmMgPSAtRU5PVFNVUFA7Ci0JCQlDREJHKCJJMkMgYWRkIGRyaXZlciBvdjU2NDcgYWYgZmFpbGVkIik7Ci0JCQlnb3RvIHByb2JlX2ZhaWxfMzsKLQkJfQotCX0KLQltc21fY2FtaW9fY2xrX3JhdGVfc2V0KE9WNTY0N19NQVNURVJfQ0xLX1JBVEUpOwotCi0JcmMgPSBvdjU2NDdfcHJvYmVfaW5pdF9zZW5zb3IoaW5mbyk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBwcm9iZV9mYWlsXzE7Ci0KLQlzLT5zX2luaXQgPSBvdjU2NDdfc2Vuc29yX29wZW5faW5pdDsKLQlzLT5zX3JlbGVhc2UgPSBvdjU2NDdfc2Vuc29yX3JlbGVhc2U7Ci0Jcy0+c19jb25maWcgID0gb3Y1NjQ3X3NlbnNvcl9jb25maWc7Ci0Jcy0+c19tb3VudF9hbmdsZSA9IGluZm8tPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5tb3VudF9hbmdsZTsKLQlncGlvX3NldF92YWx1ZShpbmZvLT5zZW5zb3JfcHdkLCAxKTsKLQlvdjU2NDdfcHJvYmVfaW5pdF9kb25lKGluZm8pOwotCS8qIHR1cm4gb2ZmIGxkbyBhbmQgdnJlZyAqLwotCWlmIChpbmZvLT5wbWljX2dwaW9fZW5hYmxlKQotCQlsY2RfY2FtZXJhX3Bvd2VyX29ub2ZmKDApOwotCi0JQ0RCRygiJXMgWCIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmM7Ci0KLXByb2JlX2ZhaWxfMzoKLQlpMmNfZGVsX2RyaXZlcigmb3Y1NjQ3X2FmX2kyY19kcml2ZXIpOwotcHJvYmVfZmFpbF8yOgotCWkyY19kZWxfZHJpdmVyKCZvdjU2NDdfaTJjX2RyaXZlcik7Ci1wcm9iZV9mYWlsXzE6Ci0JLyogdHVybiBvZmYgbGRvIGFuZCB2cmVnICovCi0JaWYgKGluZm8tPnBtaWNfZ3Bpb19lbmFibGUpCi0JCWxjZF9jYW1lcmFfcG93ZXJfb25vZmYoMCk7Ci0JQ0RCRygib3Y1NjQ3X3NlbnNvcl9wcm9iZTogU0VOU09SIFBST0JFIEZBSUxTIVxuIik7Ci0JQ0RCRygiJXMgWCIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IG92NTY0N19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBtc21fY2FtZXJhX2Rydl9zdGFydChwZGV2LCBvdjU2NDdfc2Vuc29yX3Byb2JlKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2NhbWVyYV9kcml2ZXIgPSB7Ci0JLnByb2JlID0gb3Y1NjQ3X3Byb2JlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm1zbV9jYW1lcmFfb3Y1NjQ3IiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG92NTY0N19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX2NhbWVyYV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChvdjU2NDdfaW5pdCk7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk9tbml2aXNpb24gNSBNUCBCYXllciBzZW5zb3IgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvb3Y1NjQ3LmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvb3Y1NjQ3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMTVkNjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL292NTY0Ny5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgT1Y1NjQ3X0gKLSNkZWZpbmUgT1Y1NjQ3X0gKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLQotZXh0ZXJuIHN0cnVjdCBvdjU2NDdfcmVnIG92NTY0N19yZWdzOwotZXh0ZXJuIGludCBsY2RfY2FtZXJhX3Bvd2VyX29ub2ZmKGludCBvbik7Ci1leHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSBsZWRzX2xpc3RfbG9jazsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGxlZHNfbGlzdDsKLQotc3RydWN0IG92NTY0N19pMmNfcmVnX2NvbmYgewotCXVuc2lnbmVkIHNob3J0IHdhZGRyOwotCXVuc2lnbmVkIHNob3J0IHdkYXRhOwotfTsKLQotZW51bSBvdjU2NDdfdGVzdF9tb2RlX3QgewotCVRFU1RfT0ZGLAotCVRFU1RfMSwKLQlURVNUXzIsCi0JVEVTVF8zCi19OwotCi1lbnVtIG92NTY0N19yZXNvbHV0aW9uX3QgewotCVFUUl9TSVpFLAotCUZVTExfU0laRSwKLQlJTlZBTElEX1NJWkUKLX07Ci1lbnVtIG92NTY0N19zZXR0aW5nIHsKLQlSRVNfUFJFVklFVywKLQlSRVNfQ0FQVFVSRQotfTsKLWVudW0gb3Y1NjQ3X3JlZ191cGRhdGUgewotCS8qIFNlbnNvciBlZ2lzdGVycyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKi8KLQlSRUdfSU5JVCwKLQkvKiBTZW5zb3IgZWdpc3RlcnMgdGhhdCBuZWVkcyBwZXJpb2RpYyBJMkMgd3JpdGVzICovCi0JVVBEQVRFX1BFUklPRElDLAotCS8qIEFsbCB0aGUgc2Vuc29yIFJlZ2lzdGVycyB3aWxsIGJlIHVwZGF0ZWQgKi8KLQlVUERBVEVfQUxMLAotCS8qIE5vdCB2YWxpZCB1cGRhdGUgKi8KLQlVUERBVEVfSU5WQUxJRAotfTsKLQotZW51bSBvdjU2NDdfcmVnX3BsbCB7Ci0JRTAxM19WVF9QSVhfQ0xLX0RJViwKLQlFMDEzX1ZUX1NZU19DTEtfRElWLAotCUUwMTNfUFJFX1BMTF9DTEtfRElWLAotCUUwMTNfUExMX01VTFRJUExJRVIsCi0JRTAxM19PUF9QSVhfQ0xLX0RJViwKLQlFMDEzX09QX1NZU19DTEtfRElWCi19OwotCi1lbnVtIG92NTY0N19yZWdfbW9kZSB7Ci0JRTAxM19YX0FERFJfU1RBUlQsCi0JRTAxM19YX0FERFJfRU5ELAotCUUwMTNfWV9BRERSX1NUQVJULAotCUUwMTNfWV9BRERSX0VORCwKLQlFMDEzX1hfT1VUUFVUX1NJWkUsCi0JRTAxM19ZX09VVFBVVF9TSVpFLAotCUUwMTNfREFUQVBBVEhfU0VMRUNULAotCUUwMTNfUkVBRF9NT0RFLAotCUUwMTNfQU5BTE9HX0NPTlRST0w1LAotCUUwMTNfREFDX0xEXzRfNSwKLQlFMDEzX1NDQUxJTkdfTU9ERSwKLQlFMDEzX1NDQUxFX00sCi0JRTAxM19MSU5FX0xFTkdUSF9QQ0ssCi0JRTAxM19GUkFNRV9MRU5HVEhfTElORVMsCi0JRTAxM19DT0FSU0VfSU5URUdSQVRJT05fVElNRSwKLQlFMDEzX0ZJTkVfSU5URUdSQVRJT05fVElNRSwKLQlFMDEzX0ZJTkVfQ09SUkVDVElPTgotfTsKLQotc3RydWN0IG92NTY0N19yZWcgewotCWNvbnN0IHN0cnVjdCBvdjU2NDdfaTJjX3JlZ19jb25mICpyZWNfc2V0dGluZ3M7Ci0JY29uc3QgdW5zaWduZWQgc2hvcnQgcmVjX3NpemU7Ci0JY29uc3Qgc3RydWN0IG92NTY0N19pMmNfcmVnX2NvbmYgKnJlZ19wcmV2OwotCWNvbnN0IHVuc2lnbmVkIHNob3J0IHJlZ19wcmV2X3NpemU7Ci0JY29uc3Qgc3RydWN0IG92NTY0N19pMmNfcmVnX2NvbmYgKnJlZ19zbmFwOwotCWNvbnN0IHVuc2lnbmVkIHNob3J0IHJlZ19zbmFwX3NpemU7Ci19OwotI2VuZGlmIC8qIE9WNTY0N19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvb3Y1NjQ3X3JlZy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL292NTY0N19yZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3MDliZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvb3Y1NjQ3X3JlZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0KLSNpbmNsdWRlICJvdjU2NDcuaCIKLXN0cnVjdCBvdjU2NDdfaTJjX3JlZ19jb25mIG92NTY0N19wcmV2X3NldHRpbmdzW10gPSB7Ci0JLyoxMjgwKjk2MCBSZWZlcmVuY2UgU2V0dGluZyAyNE0gTUNMSyAybGFuZSAyODBNYnBzL2xhbmUgMzBmcHMKLQlmb3IgYmFjayB0byBwcmV2aWV3Ki8KLQl7MHgzMDM1LCAweDIxfSwKLQl7MHgzMDM2LCAweDM3fSwKLQl7MHgzODIxLCAweDA3fSwKLQl7MHgzODIwLCAweDQxfSwKLQl7MHgzNjEyLCAweDA5fSwKLQl7MHgzNjE4LCAweDAwfSwKLQl7MHgzODBjLCAweDA3fSwKLQl7MHgzODBkLCAweDY4fSwKLQl7MHgzODBlLCAweDAzfSwKLQl7MHgzODBmLCAweGQ4fSwKLQl7MHgzODE0LCAweDMxfSwKLQl7MHgzODE1LCAweDMxfSwKLQl7MHgzNzA5LCAweDUyfSwKLQl7MHgzODA4LCAweDA1fSwKLQl7MHgzODA5LCAweDAwfSwKLQl7MHgzODBhLCAweDAzfSwKLQl7MHgzODBiLCAweGMwfSwKLQl7MHgzODAwLCAweDAwfSwKLQl7MHgzODAxLCAweDE4fSwKLQl7MHgzODAyLCAweDAwfSwKLQl7MHgzODAzLCAweDBlfSwKLQl7MHgzODA0LCAweDBhfSwKLQl7MHgzODA1LCAweDI3fSwKLQl7MHgzODA2LCAweDA3fSwKLQl7MHgzODA3LCAweDk1fSwKLQl7MHg0MDA0LCAweDAyfSwKLX07Ci0KLXN0cnVjdCBvdjU2NDdfaTJjX3JlZ19jb25mIG92NTY0N19zbmFwX3NldHRpbmdzW10gPSB7Ci0JLyoyNjA4KjE5NTIgUmVmZXJlbmNlIFNldHRpbmcgMjRNIE1DTEsgMmxhbmUgMjgwTWJwcy9sYW5lIDMwZnBzKi8KLQl7MHgzMDM1LCAweDIxfSwKLQl7MHgzMDM2LCAweDRmfSwKLQl7MHgzODIxLCAweDA2fSwKLQl7MHgzODIwLCAweDAwfSwKLQl7MHgzNjEyLCAweDBifSwKLQl7MHgzNjE4LCAweDA0fSwKLQl7MHgzODBjLCAweDBhfSwKLQl7MHgzODBkLCAweDhjfSwKLQl7MHgzODBlLCAweDA3fSwKLQl7MHgzODBmLCAweGIwfSwKLQl7MHgzODE0LCAweDExfSwKLQl7MHgzODE1LCAweDExfSwKLQl7MHgzNzA5LCAweDEyfSwKLQl7MHgzODA4LCAweDBhfSwKLQl7MHgzODA5LCAweDMwfSwKLQl7MHgzODBhLCAweDA3fSwKLQl7MHgzODBiLCAweGEwfSwKLQl7MHgzODAwLCAweDAwfSwKLQl7MHgzODAxLCAweDA0fSwKLQl7MHgzODAyLCAweDAwfSwKLQl7MHgzODAzLCAweDAwfSwKLQl7MHgzODA0LCAweDBhfSwKLQl7MHgzODA1LCAweDNifSwKLQl7MHgzODA2LCAweDA3fSwKLQl7MHgzODA3LCAweGEzfSwKLQl7MHg0MDA0LCAweDA0fSwKLX07Ci0KLXN0cnVjdCBvdjU2NDdfaTJjX3JlZ19jb25mIG92NTY0N19yZWNvbW1lbmRfc2V0dGluZ3NbXSA9IHsKLQl7MHgzMDM1LCAweDExfSwKLQl7MHgzMDNjLCAweDExfSwKLQl7MHgzNzBjLCAweDAzfSwKLQl7MHg1MDAwLCAweDA2fSwKLQl7MHg1MDAzLCAweDA4fSwKLQl7MHg1YTAwLCAweDA4fSwKLQl7MHgzMDAwLCAweGZmfSwKLQl7MHgzMDAxLCAweGZmfSwKLQl7MHgzMDAyLCAweGZmfSwKLQl7MHgzMDFkLCAweGYwfSwKLQl7MHgzYTE4LCAweDAwfSwKLQl7MHgzYTE5LCAweGY4fSwKLQl7MHgzYzAxLCAweDgwfSwKLQl7MHgzYjA3LCAweDBjfSwKLQl7MHgzNzA4LCAweDY0fSwKLQl7MHgzNjMwLCAweDJlfSwKLQl7MHgzNjMyLCAweGUyfSwKLQl7MHgzNjMzLCAweDIzfSwKLQl7MHgzNjM0LCAweDQ0fSwKLQl7MHgzNjIwLCAweDY0fSwKLQl7MHgzNjIxLCAweGUwfSwKLQl7MHgzNjAwLCAweDM3fSwKLQl7MHgzNzA0LCAweGEwfSwKLQl7MHgzNzAzLCAweDVhfSwKLQl7MHgzNzE1LCAweDc4fSwKLQl7MHgzNzE3LCAweDAxfSwKLQl7MHgzNzMxLCAweDAyfSwKLQl7MHgzNzBiLCAweDYwfSwKLQl7MHgzNzA1LCAweDFhfSwKLQl7MHgzZjA1LCAweDAyfSwKLQl7MHgzZjA2LCAweDEwfSwKLQl7MHgzZjAxLCAweDBhfSwKLQl7MHgzYTA4LCAweDAxfSwKLQl7MHgzYTBmLCAweDU4fSwKLQl7MHgzYTEwLCAweDUwfSwKLQl7MHgzYTFiLCAweDU4fSwKLQl7MHgzYTFlLCAweDUwfSwKLQl7MHgzYTExLCAweDYwfSwKLQl7MHgzYTFmLCAweDI4fSwKLQl7MHg0MDAxLCAweDAyfSwKLQl7MHg0MDAwLCAweDA5fSwKLQl7MHgzMDAwLCAweDAwfSwKLQl7MHgzMDAxLCAweDAwfSwKLQl7MHgzMDAyLCAweDAwfSwKLQl7MHgzMDE3LCAweGUwfSwKLQl7MHgzMDFjLCAweGZjfSwKLQl7MHgzNjM2LCAweDA2fSwKLQl7MHgzMDE2LCAweDA4fSwKLQl7MHgzODI3LCAweGVjfSwKLQl7MHgzMDE4LCAweDQ0fSwKLQl7MHgzMDM1LCAweDIxfSwKLQl7MHgzMTA2LCAweGY1fSwKLQl7MHgzMDM0LCAweDE4fSwKLQl7MHgzMDFjLCAweGY4fSwKLQkvKmxlbnMgc2V0dGluZyovCi0JezB4NTAwMCwgMHg4Nn0sCi0JezB4NTgwMCwgMHgxMX0sCi0JezB4NTgwMSwgMHgwY30sCi0JezB4NTgwMiwgMHgwYX0sCi0JezB4NTgwMywgMHgwYn0sCi0JezB4NTgwNCwgMHgwZH0sCi0JezB4NTgwNSwgMHgxM30sCi0JezB4NTgwNiwgMHgwOX0sCi0JezB4NTgwNywgMHgwNX0sCi0JezB4NTgwOCwgMHgwM30sCi0JezB4NTgwOSwgMHgwM30sCi0JezB4NTgwYSwgMHgwNn0sCi0JezB4NTgwYiwgMHgwOH0sCi0JezB4NTgwYywgMHgwNX0sCi0JezB4NTgwZCwgMHgwMX0sCi0JezB4NTgwZSwgMHgwMH0sCi0JezB4NTgwZiwgMHgwMH0sCi0JezB4NTgxMCwgMHgwMn0sCi0JezB4NTgxMSwgMHgwNn0sCi0JezB4NTgxMiwgMHgwNX0sCi0JezB4NTgxMywgMHgwMX0sCi0JezB4NTgxNCwgMHgwMH0sCi0JezB4NTgxNSwgMHgwMH0sCi0JezB4NTgxNiwgMHgwMn0sCi0JezB4NTgxNywgMHgwNn0sCi0JezB4NTgxOCwgMHgwOX0sCi0JezB4NTgxOSwgMHgwNX0sCi0JezB4NTgxYSwgMHgwNH0sCi0JezB4NTgxYiwgMHgwNH0sCi0JezB4NTgxYywgMHgwNn0sCi0JezB4NTgxZCwgMHgwOX0sCi0JezB4NTgxZSwgMHgxMX0sCi0JezB4NTgxZiwgMHgwY30sCi0JezB4NTgyMCwgMHgwYn0sCi0JezB4NTgyMSwgMHgwYn0sCi0JezB4NTgyMiwgMHgwZH0sCi0JezB4NTgyMywgMHgxM30sCi0JezB4NTgyNCwgMHgyMn0sCi0JezB4NTgyNSwgMHgyNn0sCi0JezB4NTgyNiwgMHgyNn0sCi0JezB4NTgyNywgMHgyNH0sCi0JezB4NTgyOCwgMHgyNH0sCi0JezB4NTgyOSwgMHgyNH0sCi0JezB4NTgyYSwgMHgyMn0sCi0JezB4NTgyYiwgMHgyMH0sCi0JezB4NTgyYywgMHgyMn0sCi0JezB4NTgyZCwgMHgyNn0sCi0JezB4NTgyZSwgMHgyMn0sCi0JezB4NTgyZiwgMHgyMn0sCi0JezB4NTgzMCwgMHg0Mn0sCi0JezB4NTgzMSwgMHgyMn0sCi0JezB4NTgzMiwgMHgwMn0sCi0JezB4NTgzMywgMHgyNH0sCi0JezB4NTgzNCwgMHgyMn0sCi0JezB4NTgzNSwgMHgyMn0sCi0JezB4NTgzNiwgMHgyMn0sCi0JezB4NTgzNywgMHgyNn0sCi0JezB4NTgzOCwgMHg0Mn0sCi0JezB4NTgzOSwgMHgyNn0sCi0JezB4NTgzYSwgMHgwNn0sCi0JezB4NTgzYiwgMHgyNn0sCi0JezB4NTgzYywgMHgyNH0sCi0JezB4NTgzZCwgMHhjZX0sCi0JLyogbWFudWFsIEFXQixtYW51YWwgQUUsY2xvc2UgTGVuYyxvcGVuIFdCQyovCi0JezB4MzUwMywgMHgwM30sIC8qbWFudWFsIEFFKi8KLQl7MHgzNTAxLCAweDEwfSwKLQl7MHgzNTAyLCAweDgwfSwKLQl7MHgzNTBhLCAweDAwfSwKLQl7MHgzNTBiLCAweDdmfSwKLQl7MHg1MDAxLCAweDAxfSwgLyptYW51YWwgQVdCKi8KLQl7MHg1MTgwLCAweDA4fSwKLQl7MHg1MTg2LCAweDA0fSwKLQl7MHg1MTg3LCAweDAwfSwKLQl7MHg1MTg4LCAweDA0fSwKLQl7MHg1MTg5LCAweDAwfSwKLQl7MHg1MThhLCAweDA0fSwKLQl7MHg1MThiLCAweDAwfSwKLQl7MHg1MDAwLCAweDA2fSwgLypObyBsZW5jLFdCQyBvbiovCi19OwotCi1zdHJ1Y3Qgb3Y1NjQ3X3JlZyBvdjU2NDdfcmVncyA9IHsKLQkucmVjX3NldHRpbmdzID0gJm92NTY0N19yZWNvbW1lbmRfc2V0dGluZ3NbMF0sCi0JLnJlY19zaXplID0gQVJSQVlfU0laRShvdjU2NDdfcmVjb21tZW5kX3NldHRpbmdzKSwKLQkucmVnX3ByZXYgPSAmb3Y1NjQ3X3ByZXZfc2V0dGluZ3NbMF0sCi0JLnJlZ19wcmV2X3NpemUgPSBBUlJBWV9TSVpFKG92NTY0N19wcmV2X3NldHRpbmdzKSwKLQkucmVnX3NuYXAgPSAmb3Y1NjQ3X3NuYXBfc2V0dGluZ3NbMF0sCi0JLnJlZ19zbmFwX3NpemUgPSBBUlJBWV9TSVpFKG92NTY0N19zbmFwX3NldHRpbmdzKSwKLX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvb3Y3NjkyLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvb3Y3NjkyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmQ0MmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL292NzY5Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTk3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2NhbWVyYS5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSAib3Y3NjkyLmgiCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVNFTlNPUiBSRUdJU1RFUiBERUZJTkVTCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0jZGVmaW5lIFE4ICAgIDB4MDAwMDAxMDAKLQotLyogT21uaXZpc2lvbjg4MTAgcHJvZHVjdCBJRCByZWdpc3RlciBhZGRyZXNzICovCi0jZGVmaW5lIFJFR19PVjc2OTJfTU9ERUxfSURfTVNCICAgICAgICAgICAgICAgICAgICAgICAweDBBCi0jZGVmaW5lIFJFR19PVjc2OTJfTU9ERUxfSURfTFNCICAgICAgICAgICAgICAgICAgICAgICAweDBCCi0KLSNkZWZpbmUgT1Y3NjkyX01PREVMX0lEICAgICAgICAgICAgICAgICAgICAgICAweDc2OTIKLS8qIE9tbml2aXNpb244ODEwIHByb2R1Y3QgSUQgKi8KLQotLyogVGltZSBpbiBtaWxpc2VjcyBmb3Igd2FpdGluZyBmb3IgdGhlIHNlbnNvciB0byByZXNldCAqLwotI2RlZmluZSBPVjc2OTJfUkVTRVRfREVMQVlfTVNFQ1MgICAgNjYKLSNkZWZpbmUgT1Y3NjkyX0RFRkFVTFRfQ0xPQ0tfUkFURSAgIDI0MDAwMDAwCi0vKiBSZWdpc3RlcnMqLwotCi0vKiBDb2xvciBiYXIgcGF0dGVybiBzZWxlY3Rpb24gKi8KLSNkZWZpbmUgT1Y3NjkyX0NPTE9SX0JBUl9QQVRURVJOX1NFTF9SRUcgICAgIDB4ODIKLS8qIENvbG9yIGJhciBlbmFibGluZyBjb250cm9sICovCi0jZGVmaW5lIE9WNzY5Ml9DT0xPUl9CQVJfRU5BQkxFX1JFRyAgICAgICAgICAgMHg2MDEKLS8qIFRpbWUgaW4gbWlsaXNlY3MgZm9yIHdhaXRpbmcgZm9yIHRoZSBzZW5zb3IgdG8gcmVzZXQqLwotI2RlZmluZSBPVjc2OTJfUkVTRVRfREVMQVlfTVNFQ1MgICAgNjYKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCQkJCQkJREFUQSBERUNMQVJBVElPTlMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogIDk2TUh6IFBDTEsgQCAyNE1IeiBNQ0xLICovCi1zdHJ1Y3QgcmVnX2FkZHJfdmFsX3BhaXJfc3RydWN0IG92NzY5Ml9pbml0X3NldHRpbmdzX2FycmF5W10gPSB7Ci0gICAgezB4MTIsIDB4ODB9LAotICAgIHsweDBlLCAweDA4fSwKLSAgICB7MHg2OSwgMHg1Mn0sCi0gICAgezB4MWUsIDB4YjN9LAotICAgIHsweDQ4LCAweDQyfSwKLSAgICB7MHhmZiwgMHgwMX0sCi0gICAgezB4YWUsIDB4YTB9LAotICAgIHsweGE4LCAweDI2fSwKLSAgICB7MHhiNCwgMHhjMH0sCi0gICAgezB4YjUsIDB4NDB9LAotICAgIHsweGZmLCAweDAwfSwKLSAgICB7MHgwYywgMHgwMH0sCi0gICAgezB4NjIsIDB4MTB9LAotICAgIHsweDEyLCAweDAwfSwKLSAgICB7MHgxNywgMHg2NX0sCi0gICAgezB4MTgsIDB4YTR9LAotICAgIHsweDE5LCAweDBhfSwKLSAgICB7MHgxYSwgMHhmNn0sCi0gICAgezB4M2UsIDB4MzB9LAotICAgIHsweDY0LCAweDBhfSwKLSAgICB7MHhmZiwgMHgwMX0sCi0gICAgezB4YjQsIDB4YzB9LAotICAgIHsweGZmLCAweDAwfSwKLSAgICB7MHg2NywgMHgyMH0sCi0gICAgezB4ODEsIDB4M2Z9LAotICAgIHsweGNjLCAweDAyfSwKLSAgICB7MHhjZCwgMHg4MH0sCi0gICAgezB4Y2UsIDB4MDF9LAotICAgIHsweGNmLCAweGUwfSwKLSAgICB7MHhjOCwgMHgwMn0sCi0gICAgezB4YzksIDB4ODB9LAotICAgIHsweGNhLCAweDAxfSwKLSAgICB7MHhjYiwgMHhlMH0sCi0gICAgezB4ZDAsIDB4NDh9LAotICAgIHsweDgyLCAweDAzfSwKLSAgICB7MHgwZSwgMHgwMH0sCi0gICAgezB4NzAsIDB4MDB9LAotICAgIHsweDcxLCAweDM0fSwKLSAgICB7MHg3NCwgMHgyOH0sCi0gICAgezB4NzUsIDB4OTh9LAotICAgIHsweDc2LCAweDAwfSwKLSAgICB7MHg3NywgMHg2NH0sCi0gICAgezB4NzgsIDB4MDF9LAotICAgIHsweDc5LCAweGMyfSwKLSAgICB7MHg3YSwgMHg0ZX0sCi0gICAgezB4N2IsIDB4MWZ9LAotICAgIHsweDdjLCAweDAwfSwKLSAgICB7MHgxMSwgMHgwMH0sCi0gICAgezB4MjAsIDB4MDB9LAotICAgIHsweDIxLCAweDIzfSwKLSAgICB7MHg1MCwgMHg5YX0sCi0gICAgezB4NTEsIDB4ODB9LAotICAgIHsweDRjLCAweDdkfSwKLSAgICB7MHgwZSwgMHgwMH0sCi0gICAgezB4ODAsIDB4N2Z9LAotICAgIHsweDg1LCAweDEwfSwKLSAgICB7MHg4NiwgMHgwMH0sCi0gICAgezB4ODcsIDB4MDB9LAotICAgIHsweDg4LCAweDAwfSwKLSAgICB7MHg4OSwgMHgyYX0sCi0gICAgezB4OGEsIDB4MjZ9LAotICAgIHsweDhiLCAweDIyfSwKLSAgICB7MHhiYiwgMHg3YX0sCi0gICAgezB4YmMsIDB4Njl9LAotICAgIHsweGJkLCAweDExfSwKLSAgICB7MHhiZSwgMHgxM30sCi0gICAgezB4YmYsIDB4ODF9LAotICAgIHsweGMwLCAweDk2fSwKLSAgICB7MHhjMSwgMHgxZX0sCi0gICAgezB4YjcsIDB4MDV9LAotICAgIHsweGI4LCAweDA5fSwKLSAgICB7MHhiOSwgMHgwMH0sCi0gICAgezB4YmEsIDB4MTh9LAotICAgIHsweDVhLCAweDFmfSwKLSAgICB7MHg1YiwgMHg5Zn0sCi0gICAgezB4NWMsIDB4NmF9LAotICAgIHsweDVkLCAweDQyfSwKLSAgICB7MHgyNCwgMHg3OH0sCi0gICAgezB4MjUsIDB4Njh9LAotICAgIHsweDI2LCAweGIzfSwKLSAgICB7MHhhMywgMHgwYn0sCi0gICAgezB4YTQsIDB4MTV9LAotICAgIHsweGE1LCAweDJhfSwKLSAgICB7MHhhNiwgMHg1MX0sCi0gICAgezB4YTcsIDB4NjN9LAotICAgIHsweGE4LCAweDc0fSwKLSAgICB7MHhhOSwgMHg4M30sCi0gICAgezB4YWEsIDB4OTF9LAotICAgIHsweGFiLCAweDllfSwKLSAgICB7MHhhYywgMHhhYX0sCi0gICAgezB4YWQsIDB4YmV9LAotICAgIHsweGFlLCAweGNlfSwKLSAgICB7MHhhZiwgMHhlNX0sCi0gICAgezB4YjAsIDB4ZjN9LAotICAgIHsweGIxLCAweGZifSwKLSAgICB7MHhiMiwgMHgwNn0sCi0gICAgezB4OGMsIDB4NWN9LAotICAgIHsweDhkLCAweDExfSwKLSAgICB7MHg4ZSwgMHgxMn0sCi0gICAgezB4OGYsIDB4MTl9LAotICAgIHsweDkwLCAweDUwfSwKLSAgICB7MHg5MSwgMHgyMH0sCi0gICAgezB4OTIsIDB4OTZ9LAotICAgIHsweDkzLCAweDgwfSwKLSAgICB7MHg5NCwgMHgxM30sCi0gICAgezB4OTUsIDB4MWJ9LAotICAgIHsweDk2LCAweGZmfSwKLSAgICB7MHg5NywgMHgwMH0sCi0gICAgezB4OTgsIDB4M2R9LAotICAgIHsweDk5LCAweDM2fSwKLSAgICB7MHg5YSwgMHg1MX0sCi0gICAgezB4OWIsIDB4NDN9LAotICAgIHsweDljLCAweGYwfSwKLSAgICB7MHg5ZCwgMHhmMH0sCi0gICAgezB4OWUsIDB4ZjB9LAotICAgIHsweDlmLCAweGZmfSwKLSAgICB7MHhhMCwgMHg2OH0sCi0gICAgezB4YTEsIDB4NjJ9LAotICAgIHsweGEyLCAweDBlfSwKLX07Ci0KLXN0YXRpYyBib29sIE9WNzY5Ml9DU0lfQ09ORklHOwotLyogODE2eDYxMiwgMjRNSHogTUNMSyA5Nk1IeiBQQ0xLICovCi11aW50MzJfdCBPVjc2OTJfRlVMTF9TSVpFX1dJRFRIICAgICAgICA9IDY0MDsKLXVpbnQzMl90IE9WNzY5Ml9GVUxMX1NJWkVfSEVJR0hUICAgICAgID0gNDgwOwotCi11aW50MzJfdCBPVjc2OTJfUVRSX1NJWkVfV0lEVEggICAgICAgICA9IDY0MDsKLXVpbnQzMl90IE9WNzY5Ml9RVFJfU0laRV9IRUlHSFQgICAgICAgID0gNDgwOwotCi11aW50MzJfdCBPVjc2OTJfSFJaX0ZVTExfQkxLX1BJWEVMUyAgICA9IDE2OwotdWludDMyX3QgT1Y3NjkyX1ZFUl9GVUxMX0JMS19MSU5FUyAgICAgPSAxMjsKLXVpbnQzMl90IE9WNzY5Ml9IUlpfUVRSX0JMS19QSVhFTFMgICAgID0gMTY7Ci11aW50MzJfdCBPVjc2OTJfVkVSX1FUUl9CTEtfTElORVMgICAgICA9IDEyOwotCi1zdHJ1Y3Qgb3Y3NjkyX3dvcmtfdCB7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Ci19Owotc3RhdGljIHN0cnVjdCAgb3Y3NjkyX3dvcmtfdCAqb3Y3NjkyX3NlbnNvcnc7Ci1zdGF0aWMgc3RydWN0ICBpMmNfY2xpZW50ICpvdjc2OTJfY2xpZW50Owotc3RydWN0IG92NzY5Ml9jdHJsX3QgewotCWNvbnN0IHN0cnVjdCAgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2Vuc29yZGF0YTsKLQl1aW50MzJfdCBzZW5zb3Jtb2RlOwotCXVpbnQzMl90IGZwc19kaXZpZGVyOwkJLyogaW5pdCB0byAxICogMHgwMDAwMDQwMCAqLwotCXVpbnQzMl90IHBpY3RfZnBzX2RpdmlkZXI7CS8qIGluaXQgdG8gMSAqIDB4MDAwMDA0MDAgKi8KLQl1aW50MzJfdCBmcHM7Ci0JaW50MzJfdCAgY3Vycl9sZW5zX3BvczsKLQl1aW50MzJfdCBjdXJyX3N0ZXBfcG9zOwotCXVpbnQzMl90IG15X3JlZ19nYWluOwotCXVpbnQzMl90IG15X3JlZ19saW5lX2NvdW50OwotCXVpbnQzMl90IHRvdGFsX2xpbmVzX3Blcl9mcmFtZTsKLQllbnVtIG92NzY5Ml9yZXNvbHV0aW9uX3QgcHJldl9yZXM7Ci0JZW51bSBvdjc2OTJfcmVzb2x1dGlvbl90IHBpY3RfcmVzOwotCWVudW0gb3Y3NjkyX3Jlc29sdXRpb25fdCBjdXJyX3JlczsKLQllbnVtIG92NzY5Ml90ZXN0X21vZGVfdCAgc2V0X3Rlc3Q7Ci0JdW5zaWduZWQgc2hvcnQgaW1nYWRkcjsKLX07Ci1zdGF0aWMgc3RydWN0IG92NzY5Ml9jdHJsX3QgKm92NzY5Ml9jdHJsOwotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKG92NzY5Ml93YWl0X3F1ZXVlKTsKLURFRklORV9NVVRFWChvdjc2OTJfbXV0KTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotc3RhdGljIGludCBvdjc2OTJfaTJjX3J4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQl1bnNpZ25lZCBjaGFyICpyeGRhdGEsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGkyY19tc2cgbXNnc1tdID0gewotCQl7Ci0JCQkuYWRkciAgPSBzYWRkciwKLQkJCS5mbGFncyA9IDAsCi0JCQkubGVuICAgPSAxLAotCQkJLmJ1ZiAgID0gcnhkYXRhLAotCQl9LAotCQl7Ci0JCQkuYWRkciAgPSBzYWRkciwKLQkJCS5mbGFncyA9IEkyQ19NX1JELAotCQkJLmxlbiAgID0gMSwKLQkJCS5idWYgICA9IHJ4ZGF0YSwKLQkJfSwKLQl9OwotCWlmIChpMmNfdHJhbnNmZXIob3Y3NjkyX2NsaWVudC0+YWRhcHRlciwgbXNncywgMikgPCAwKSB7Ci0JCUNEQkcoIm92NzY5Ml9pMmNfcnhkYXRhIGZhaWxlZCFcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50MzJfdCBvdjc2OTJfaTJjX3R4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQkJCQl1bnNpZ25lZCBjaGFyICp0eGRhdGEsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGkyY19tc2cgbXNnW10gPSB7Ci0JCXsKLQkJCS5hZGRyID0gc2FkZHIsCi0JCQkuZmxhZ3MgPSAwLAotCQkJLmxlbiA9IDIsCi0JCQkuYnVmID0gdHhkYXRhLAotCQkgfSwKLQl9OwotCWlmIChpMmNfdHJhbnNmZXIob3Y3NjkyX2NsaWVudC0+YWRhcHRlciwgbXNnLCAxKSA8IDApIHsKLQkJQ0RCRygib3Y3NjkyX2kyY190eGRhdGEgZmFpbGQgMHgleFxuIiwgb3Y3NjkyX2NsaWVudC0+YWRkcik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCBvdjc2OTJfaTJjX3JlYWQodWludDhfdCByYWRkciwKLQl1aW50OF90ICpyZGF0YSwgaW50IHJsZW4pCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JdW5zaWduZWQgY2hhciBidWZbMV07Ci0JaWYgKCFyZGF0YSkKLQkJcmV0dXJuIC1FSU87Ci0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9IHJhZGRyOwotCXJjID0gb3Y3NjkyX2kyY19yeGRhdGEob3Y3NjkyX2NsaWVudC0+YWRkciA+PiAxLCBidWYsIHJsZW4pOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygib3Y3NjkyX2kyY19yZWFkIDB4JXggZmFpbGVkIVxuIiwgcmFkZHIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCSpyZGF0YSA9IGJ1ZlswXTsKLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50MzJfdCBvdjc2OTJfaTJjX3dyaXRlX2Jfc2Vuc29yKHVpbnQ4X3Qgd2FkZHIsIHVpbnQ4X3QgYmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IC1FRkFVTFQ7Ci0JdW5zaWduZWQgY2hhciBidWZbMl07Ci0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9IHdhZGRyOwotCWJ1ZlsxXSA9IGJkYXRhOwotCUNEQkcoImkyY193cml0ZV9iIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4XG4iLCB3YWRkciwgYmRhdGEpOwotCXJjID0gb3Y3NjkyX2kyY190eGRhdGEob3Y3NjkyX2NsaWVudC0+YWRkciA+PiAxLCBidWYsIDIpOwotCWlmIChyYyA8IDApCi0JCUNEQkcoImkyY193cml0ZV9iIGZhaWxlZCwgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXghXG4iLAotCQkJd2FkZHIsIGJkYXRhKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG92NzY5Ml9zZW5zb3Jfc2V0dGluZyhpbnQgdXBkYXRlX3R5cGUsIGludCBydCkKLXsKLQlpbnQzMl90IGksIGFycmF5X2xlbmd0aDsKLQlpbnQzMl90IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9jc2lfcGFyYW1zIG92NzY5Ml9jc2lfcGFyYW1zOwotCXN3aXRjaCAodXBkYXRlX3R5cGUpIHsKLQljYXNlIFJFR19JTklUOgotCQlPVjc2OTJfQ1NJX0NPTkZJRyA9IDA7Ci0JCW92NzY5Ml9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwZSwgMHgwOCk7Ci0JCXJldHVybiByYzsKLQkJYnJlYWs7Ci0JY2FzZSBVUERBVEVfUEVSSU9ESUM6Ci0JCWlmICghT1Y3NjkyX0NTSV9DT05GSUcpIHsKLQkJCW92NzY5Ml9jc2lfcGFyYW1zLmxhbmVfY250ID0gMTsKLQkJCW92NzY5Ml9jc2lfcGFyYW1zLmRhdGFfZm9ybWF0ID0gQ1NJXzhCSVQ7Ci0JCQlvdjc2OTJfY3NpX3BhcmFtcy5sYW5lX2Fzc2lnbiA9IDB4ZTQ7Ci0JCQlvdjc2OTJfY3NpX3BhcmFtcy5kcGNtX3NjaGVtZSA9IDA7Ci0JCQlvdjc2OTJfY3NpX3BhcmFtcy5zZXR0bGVfY250ID0gMHgxNDsKLQotCQkJcmMgPSBtc21fY2FtaW9fY3NpX2NvbmZpZygmb3Y3NjkyX2NzaV9wYXJhbXMpOwotCQkJbXNsZWVwKDEwKTsKLQkJCWFycmF5X2xlbmd0aCA9IHNpemVvZihvdjc2OTJfaW5pdF9zZXR0aW5nc19hcnJheSkgLwotCQkJCXNpemVvZihvdjc2OTJfaW5pdF9zZXR0aW5nc19hcnJheVswXSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgYXJyYXlfbGVuZ3RoOyBpKyspIHsKLQkJCQlyYyA9IG92NzY5Ml9pMmNfd3JpdGVfYl9zZW5zb3IoCi0JCQkJCW92NzY5Ml9pbml0X3NldHRpbmdzX2FycmF5W2ldLnJlZ19hZGRyLAotCQkJCQlvdjc2OTJfaW5pdF9zZXR0aW5nc19hcnJheVtpXS5yZWdfdmFsKTsKLQkJCQlpZiAocmMgPCAwKQotCQkJCQlyZXR1cm4gcmM7Ci0JCQl9Ci0JCQlPVjc2OTJfQ1NJX0NPTkZJRyA9IDE7Ci0JCQltc2xlZXAoMjApOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3Qgb3Y3NjkyX3ZpZGVvX2NvbmZpZyhpbnQgbW9kZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlpbnQgcnQ7Ci0JLyogY2hhbmdlIHNlbnNvciByZXNvbHV0aW9uIGlmIG5lZWRlZCAqLwotCXJ0ID0gUkVTX1BSRVZJRVc7Ci0KLQlpZiAob3Y3NjkyX3NlbnNvcl9zZXR0aW5nKFVQREFURV9QRVJJT0RJQywgcnQpIDwgMCkKLQkJcmV0dXJuIHJjOwotCW92NzY5Ml9jdHJsLT5jdXJyX3JlcyA9IG92NzY5Ml9jdHJsLT5wcmV2X3JlczsKLQlvdjc2OTJfY3RybC0+c2Vuc29ybW9kZSA9IG1vZGU7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBvdjc2OTJfc2V0X3NlbnNvcl9tb2RlKGludCBtb2RlLAotCWludCByZXMpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBTRU5TT1JfUFJFVklFV19NT0RFOgotCQlyYyA9IG92NzY5Ml92aWRlb19jb25maWcobW9kZSk7Ci0JCWJyZWFrOwotCWNhc2UgU0VOU09SX1NOQVBTSE9UX01PREU6Ci0JY2FzZSBTRU5TT1JfUkFXX1NOQVBTSE9UX01PREU6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLXN0YXRpYyBpbnQzMl90IG92NzY5Ml9wb3dlcl9kb3duKHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y3NjkyX3Byb2JlX2luaXRfc2Vuc29yKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCXVpbnQ4X3QgbW9kZWxfaWRfbXNiLCBtb2RlbF9pZF9sc2IgPSAwOwotCXVpbnQxNl90IG1vZGVsX2lkOwotCWludDMyX3QgcmMgPSAwOwotCS8qVGhlIHJlc2V0IHBpbiBpcyBub3QgcGh5c2ljYWxseSBjb25uZWN0ZWQgdG8gdGhlIHNlbnNvci4KLQlUaGUgc3RhbmRieSBwaW4gd2lsbCBkbyB0aGUgcmVzZXQgaGVuY2UgdGhlcmUgaXMgbm8gbmVlZAotCXRvIHJlcXVlc3QgdGhlIGdwaW8gcmVzZXQqLwotCi0JLyogUmVhZCBzZW5zb3IgTW9kZWwgSUQ6ICovCi0JcmMgPSBvdjc2OTJfaTJjX3JlYWQoUkVHX09WNzY5Ml9NT0RFTF9JRF9NU0IsICZtb2RlbF9pZF9tc2IsIDEpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCXJjID0gb3Y3NjkyX2kyY19yZWFkKFJFR19PVjc2OTJfTU9ERUxfSURfTFNCLCAmbW9kZWxfaWRfbHNiLCAxKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGluaXRfcHJvYmVfZmFpbDsKLQltb2RlbF9pZCA9IChtb2RlbF9pZF9tc2IgPDwgOCkgfCAoKG1vZGVsX2lkX2xzYiAmIDB4MDBGRikpIDsKLQlDREJHKCJvdjc2OTIgbW9kZWxfaWQgPSAweCV4LCAweCV4LCAweCV4XG4iLAotCQkgbW9kZWxfaWQsIG1vZGVsX2lkX21zYiwgbW9kZWxfaWRfbHNiKTsKLQkvKiA0LiBDb21wYXJlIHNlbnNvciBJRCB0byBPVjc2OTIgSUQ6ICovCi0JaWYgKG1vZGVsX2lkICE9IE9WNzY5Ml9NT0RFTF9JRCkgewotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCX0KLQlnb3RvIGluaXRfcHJvYmVfZG9uZTsKLWluaXRfcHJvYmVfZmFpbDoKLQlwcl93YXJuaW5nKCIgb3Y3NjkyX3Byb2JlX2luaXRfc2Vuc29yIGZhaWxzXG4iKTsKLWluaXRfcHJvYmVfZG9uZToKLQlDREJHKCIgb3Y3NjkyX3Byb2JlX2luaXRfc2Vuc29yIGZpbmlzaGVzXG4iKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBvdjc2OTJfc2Vuc29yX29wZW5faW5pdChjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCUNEQkcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlDREJHKCJDYWxsaW5nIG92NzY5Ml9zZW5zb3Jfb3Blbl9pbml0XG4iKTsKLQlvdjc2OTJfY3RybCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvdjc2OTJfY3RybF90KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFvdjc2OTJfY3RybCkgewotCQlDREJHKCJvdjc2OTJfaW5pdCBmYWlsZWQhXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGluaXRfZG9uZTsKLQl9Ci0Jb3Y3NjkyX2N0cmwtPmZwc19kaXZpZGVyID0gMSAqIDB4MDAwMDA0MDA7Ci0Jb3Y3NjkyX2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQlvdjc2OTJfY3RybC0+ZnBzID0gMzAgKiBRODsKLQlvdjc2OTJfY3RybC0+c2V0X3Rlc3QgPSBURVNUX09GRjsKLQlvdjc2OTJfY3RybC0+cHJldl9yZXMgPSBRVFJfU0laRTsKLQlvdjc2OTJfY3RybC0+cGljdF9yZXMgPSBGVUxMX1NJWkU7Ci0Jb3Y3NjkyX2N0cmwtPmN1cnJfcmVzID0gSU5WQUxJRF9TSVpFOwotCi0JaWYgKGRhdGEpCi0JCW92NzY5Ml9jdHJsLT5zZW5zb3JkYXRhID0gZGF0YTsKLQotCS8qIGVuYWJsZSBtY2xrIGZpcnN0ICovCi0KLQltc21fY2FtaW9fY2xrX3JhdGVfc2V0KDI0MDAwMDAwKTsKLQltc2xlZXAoMjApOwotCi0JcmMgPSBvdjc2OTJfcHJvYmVfaW5pdF9zZW5zb3IoZGF0YSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJDYWxsaW5nIG92NzY5Ml9zZW5zb3Jfb3Blbl9pbml0IGZhaWxcbiIpOwotCQlnb3RvIGluaXRfZmFpbDsKLQl9Ci0KLQlyYyA9IG92NzY5Ml9zZW5zb3Jfc2V0dGluZyhSRUdfSU5JVCwgUkVTX1BSRVZJRVcpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gaW5pdF9mYWlsOwotCWVsc2UKLQkJZ290byBpbml0X2RvbmU7Ci0KLWluaXRfZmFpbDoKLQlDREJHKCIgb3Y3NjkyX3NlbnNvcl9vcGVuX2luaXQgZmFpbFxuIik7Ci0Ja2ZyZWUob3Y3NjkyX2N0cmwpOwotaW5pdF9kb25lOgotCUNEQkcoIm92NzY5Ml9zZW5zb3Jfb3Blbl9pbml0IGRvbmVcbiIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBvdjc2OTJfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQkvKiBJbml0aWFsaXplIHRoZSBNU01fQ0FNSTJDIENoaXAgKi8KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZvdjc2OTJfd2FpdF9xdWV1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBvdjc2OTJfaTJjX2lkW10gPSB7Ci0JeyJvdjc2OTIiLCAwfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBpbnQgb3Y3NjkyX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQgcmMgPSAwOwotCUNEQkcoIm92NzY5Ml9pMmNfcHJvYmUgY2FsbGVkIVxuIik7Ci0KLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgewotCQlDREJHKCJpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eSBmYWlsZWRcbiIpOwotCQlnb3RvIHByb2JlX2ZhaWx1cmU7Ci0JfQotCi0Jb3Y3NjkyX3NlbnNvcncgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb3Y3NjkyX3dvcmtfdCksIEdGUF9LRVJORUwpOwotCWlmICghb3Y3NjkyX3NlbnNvcncpIHsKLQkJQ0RCRygia3phbGxvYyBmYWlsZWQuXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIHByb2JlX2ZhaWx1cmU7Ci0JfQotCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgb3Y3NjkyX3NlbnNvcncpOwotCW92NzY5Ml9pbml0X2NsaWVudChjbGllbnQpOwotCW92NzY5Ml9jbGllbnQgPSBjbGllbnQ7Ci0KLQlDREJHKCJvdjc2OTJfaTJjX3Byb2JlIHN1Y2Nlc3MhIHJjID0gJWRcbiIsIHJjKTsKLQlyZXR1cm4gMDsKLQotcHJvYmVfZmFpbHVyZToKLQlDREJHKCJvdjc2OTJfaTJjX3Byb2JlIGZhaWxlZCEgcmMgPSAlZFxuIiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX2V4aXQgb3Y3NjkyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBvdjc2OTJfd29ya190X3QgKnNlbnNvcncgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlmcmVlX2lycShjbGllbnQtPmlycSwgc2Vuc29ydyk7Ci0Jb3Y3NjkyX2NsaWVudCA9IE5VTEw7Ci0Ja2ZyZWUoc2Vuc29ydyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBvdjc2OTJfaTJjX2RyaXZlciA9IHsKLQkuaWRfdGFibGUgPSBvdjc2OTJfaTJjX2lkLAotCS5wcm9iZSAgPSBvdjc2OTJfaTJjX3Byb2JlLAotCS5yZW1vdmUgPSBfX2V4aXRfcChvdjc2OTJfaTJjX3JlbW92ZSksCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAib3Y3NjkyIiwKLQl9LAotfTsKLQotaW50IG92NzY5Ml9zZW5zb3JfY29uZmlnKHZvaWQgX191c2VyICphcmdwKQotewotCXN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEgY2RhdGE7Ci0JbG9uZyAgIHJjID0gMDsKLQlpZiAoY29weV9mcm9tX3VzZXIoJmNkYXRhLAotCQkodm9pZCAqKWFyZ3AsCi0JCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCW11dGV4X2xvY2soJm92NzY5Ml9tdXQpOwotCUNEQkcoIm92NzY5Ml9zZW5zb3JfY29uZmlnOiBjZmd0eXBlID0gJWRcbiIsCi0JY2RhdGEuY2ZndHlwZSk7Ci0Jc3dpdGNoIChjZGF0YS5jZmd0eXBlKSB7Ci0JY2FzZSBDRkdfU0VUX01PREU6Ci0JCXJjID0gb3Y3NjkyX3NldF9zZW5zb3JfbW9kZShjZGF0YS5tb2RlLAotCQkJY2RhdGEucnMpOwotCQlicmVhazsKLQljYXNlIENGR19QV1JfRE9XTjoKLQkJcmMgPSBvdjc2OTJfcG93ZXJfZG93bigpOwotCQlicmVhazsKLQljYXNlIENGR19TRVRfRUZGRUNUOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCX0KLQotCW11dGV4X3VubG9jaygmb3Y3NjkyX211dCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50IG92NzY5Ml9zZW5zb3JfcmVsZWFzZSh2b2lkKQotewotCWludCByYyA9IC1FQkFERjsKLQltdXRleF9sb2NrKCZvdjc2OTJfbXV0KTsKLQlvdjc2OTJfcG93ZXJfZG93bigpOwotCWtmcmVlKG92NzY5Ml9jdHJsKTsKLQlvdjc2OTJfY3RybCA9IE5VTEw7Ci0JQ0RCRygib3Y3NjkyX3JlbGVhc2UgY29tcGxldGVkXG4iKTsKLQltdXRleF91bmxvY2soJm92NzY5Ml9tdXQpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92NzY5Ml9zZW5zb3JfcHJvYmUoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmluZm8sCi0JCXN0cnVjdCBtc21fc2Vuc29yX2N0cmwgKnMpCi17Ci0JaW50IHJjID0gMDsKLQlyYyA9IGkyY19hZGRfZHJpdmVyKCZvdjc2OTJfaTJjX2RyaXZlcik7Ci0JaWYgKHJjIDwgMCB8fCBvdjc2OTJfY2xpZW50ID09IE5VTEwpIHsKLQkJcmMgPSAtRU5PVFNVUFA7Ci0JCWdvdG8gcHJvYmVfZmFpbDsKLQl9Ci0JbXNtX2NhbWlvX2Nsa19yYXRlX3NldCgyNDAwMDAwMCk7Ci0JcmMgPSBvdjc2OTJfcHJvYmVfaW5pdF9zZW5zb3IoaW5mbyk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBwcm9iZV9mYWlsOwotCXMtPnNfaW5pdCA9IG92NzY5Ml9zZW5zb3Jfb3Blbl9pbml0OwotCXMtPnNfcmVsZWFzZSA9IG92NzY5Ml9zZW5zb3JfcmVsZWFzZTsKLQlzLT5zX2NvbmZpZyAgPSBvdjc2OTJfc2Vuc29yX2NvbmZpZzsKLQlzLT5zX2NhbWVyYV90eXBlID0gRlJPTlRfQ0FNRVJBXzJEOwotCXMtPnNfbW91bnRfYW5nbGUgPSAwOwotCXJldHVybiByYzsKLQotcHJvYmVfZmFpbDoKLQlDREJHKCJvdjc2OTJfc2Vuc29yX3Byb2JlOiBTRU5TT1IgUFJPQkUgRkFJTFMhXG4iKTsKLQlpMmNfZGVsX2RyaXZlcigmb3Y3NjkyX2kyY19kcml2ZXIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX292NzY5Ml9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCi0JcmV0dXJuIG1zbV9jYW1lcmFfZHJ2X3N0YXJ0KHBkZXYsIG92NzY5Ml9zZW5zb3JfcHJvYmUpOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fY2FtZXJhX2RyaXZlciA9IHsKLQkucHJvYmUgPSBfX292NzY5Ml9wcm9iZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc21fY2FtZXJhX292NzY5MiIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBvdjc2OTJfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9jYW1lcmFfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQob3Y3NjkyX2luaXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk9NTkkgVkdBIFlVViBzZW5zb3IgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvb3Y3NjkyLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvb3Y3NjkyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOTgyODQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL292NzY5Mi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjY2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBPVjc2OTJfSAotI2RlZmluZSBPVjc2OTJfSAotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotCi0jZGVmaW5lIElOVk1BU0sodikgICgweGZmLXYpCi0jZGVmaW5lIE9WNzY5MkNvcmVfV3JpdGVQUkVHKHBUYmwpICBPVjc2OTJfV3JpdGVQUmVncyBcCi0JCQkocFRibCwgc2l6ZW9mKHBUYmwpL3NpemVvZihwVGJsWzBdKSkKLQotZXh0ZXJuIGludCBsY2RfY2FtZXJhX3Bvd2VyX29ub2ZmKGludCBvbik7Ci1zdHJ1Y3QgcmVnX2FkZHJfdmFsX3BhaXJfc3RydWN0IHsKLQl1aW50OF90CXJlZ19hZGRyOwotCXVpbnQ4X3QJcmVnX3ZhbDsKLX07Ci0KLWVudW0gb3Y3NjkyX3Rlc3RfbW9kZV90IHsKLQlURVNUX09GRiwKLQlURVNUXzEsCi0JVEVTVF8yLAotCVRFU1RfMwotfTsKLQotZW51bSBvdjc2OTJfcmVzb2x1dGlvbl90IHsKLQlRVFJfU0laRSwKLQlGVUxMX1NJWkUsCi0JSU5WQUxJRF9TSVpFCi19OwotCi1lbnVtIG92NzY5Ml9zZXR0aW5nIHsKLQlSRVNfUFJFVklFVywKLQlSRVNfQ0FQVFVSRQotfTsKLWVudW0gb3Y3NjkyX3JlZ191cGRhdGUgewotCS8qIFNlbnNvciBlZ2lzdGVycyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKi8KLQlSRUdfSU5JVCwKLQkvKiBTZW5zb3IgZWdpc3RlcnMgdGhhdCBuZWVkcyBwZXJpb2RpYyBJMkMgd3JpdGVzICovCi0JVVBEQVRFX1BFUklPRElDLAotCS8qIEFsbCB0aGUgc2Vuc29yIFJlZ2lzdGVycyB3aWxsIGJlIHVwZGF0ZWQgKi8KLQlVUERBVEVfQUxMLAotCS8qIE5vdCB2YWxpZCB1cGRhdGUgKi8KLQlVUERBVEVfSU5WQUxJRAotfTsKLQotLypPViBTRU5TT1IgU0NDQiovCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgewotCXVpbnQ4X3QgYWRkcjsKLQl1aW50OF90IGRhdGE7Ci0JdWludDhfdCBtYXNrOwotfSBPVjc2OTJfV1JFRzsKLQotI2lmZGVmIENPTkZJR19XRUJDQU1fT1Y3NjkyX1FSRAotLyogIDk2TUh6IFBDTEsgQCAyNE1IeiBNQ0xLICovCi1zdHJ1Y3QgcmVnX2FkZHJfdmFsX3BhaXJfc3RydWN0IG92NzY5Ml9pbml0X3NldHRpbmdzX2FycmF5W10gPSB7Ci0JezB4MTIsIDB4ODB9LAotCXsweDBlLCAweDA4fSwKLQl7MHg2OSwgMHg1Mn0sCi0JezB4MWUsIDB4YjN9LAotCXsweDQ4LCAweDQyfSwKLQl7MHhmZiwgMHgwMX0sCi0JezB4YWUsIDB4YTB9LAotCXsweGE4LCAweDI2fSwKLQl7MHhiNCwgMHhjMH0sCi0JezB4YjUsIDB4NDB9LAotCXsweGZmLCAweDAwfSwKLQl7MHgwYywgMHgwMH0sCi0JezB4NjIsIDB4MTB9LAotCXsweDEyLCAweDAwfSwKLQl7MHgxNywgMHg2NX0sCi0JezB4MTgsIDB4YTR9LAotCXsweDE5LCAweDBhfSwKLQl7MHgxYSwgMHhmNn0sCi0JezB4M2UsIDB4MzB9LAotCXsweDY0LCAweDBhfSwKLQl7MHhmZiwgMHgwMX0sCi0JezB4YjQsIDB4YzB9LAotCXsweGZmLCAweDAwfSwKLQl7MHg2NywgMHgyMH0sCi0JezB4ODEsIDB4M2Z9LAotCXsweGNjLCAweDAyfSwKLQl7MHhjZCwgMHg4MH0sCi0JezB4Y2UsIDB4MDF9LAotCXsweGNmLCAweGUwfSwKLQl7MHhjOCwgMHgwMn0sCi0JezB4YzksIDB4ODB9LAotCXsweGNhLCAweDAxfSwKLQl7MHhjYiwgMHhlMH0sCi0JezB4ZDAsIDB4NDh9LAotCXsweDgyLCAweDAzfSwKLQkvKnsweDBlLCAweDAwfSwqLwotCXsweDcwLCAweDAwfSwKLQl7MHg3MSwgMHgzNH0sCi0JezB4NzQsIDB4Mjh9LAotCXsweDc1LCAweDk4fSwKLQl7MHg3NiwgMHgwMH0sCi0JezB4NzcsIDB4NjR9LAotCXsweDc4LCAweDAxfSwKLQl7MHg3OSwgMHhjMn0sCi0JezB4N2EsIDB4NGV9LAotCXsweDdiLCAweDFmfSwKLQl7MHg3YywgMHgwMH0sCi0JezB4MTEsIDB4MDB9LAotCXsweDIwLCAweDAwfSwKLQl7MHgyMSwgMHgyM30sCi0JezB4NTAsIDB4OWF9LAotCXsweDUxLCAweDgwfSwKLQl7MHg0YywgMHg3ZH0sCi0JLyp7MHgwZSwgMHgwMH0sKi8KLQl7MHg4NSwgMHgxMH0sCi0JezB4ODYsIDB4MDB9LAotCXsweDg3LCAweDAwfSwKLQl7MHg4OCwgMHgwMH0sCi0JezB4ODksIDB4MmF9LAotCXsweDhhLCAweDI2fSwKLQl7MHg4YiwgMHgyMn0sCi0JezB4YmIsIDB4N2F9LAotCXsweGJjLCAweDY5fSwKLQl7MHhiZCwgMHgxMX0sCi0JezB4YmUsIDB4MTN9LAotCXsweGJmLCAweDgxfSwKLQl7MHhjMCwgMHg5Nn0sCi0JezB4YzEsIDB4MWV9LAotCXsweGI3LCAweDA1fSwKLQl7MHhiOCwgMHgwOX0sCi0JezB4YjksIDB4MDB9LAotCXsweGJhLCAweDE4fSwKLQl7MHg1YSwgMHgxZn0sCi0JezB4NWIsIDB4OWZ9LAotCXsweDVjLCAweDZhfSwKLQl7MHg1ZCwgMHg0Mn0sCi0JezB4MjQsIDB4Nzh9LAotCXsweDI1LCAweDY4fSwKLQl7MHgyNiwgMHhiM30sCi0JezB4YTMsIDB4MGJ9LAotCXsweGE0LCAweDE1fSwKLQl7MHhhNSwgMHgyYX0sCi0JezB4YTYsIDB4NTF9LAotCXsweGE3LCAweDYzfSwKLQl7MHhhOCwgMHg3NH0sCi0JezB4YTksIDB4ODN9LAotCXsweGFhLCAweDkxfSwKLQl7MHhhYiwgMHg5ZX0sCi0JezB4YWMsIDB4YWF9LAotCXsweGFkLCAweGJlfSwKLQl7MHhhZSwgMHhjZX0sCi0JezB4YWYsIDB4ZTV9LAotCXsweGIwLCAweGYzfSwKLQl7MHhiMSwgMHhmYn0sCi0JezB4YjIsIDB4MDZ9LAotCXsweDhjLCAweDVjfSwKLQl7MHg4ZCwgMHgxMX0sCi0JezB4OGUsIDB4MTJ9LAotCXsweDhmLCAweDE5fSwKLQl7MHg5MCwgMHg1MH0sCi0JezB4OTEsIDB4MjB9LAotCXsweDkyLCAweDk2fSwKLQl7MHg5MywgMHg4MH0sCi0JezB4OTQsIDB4MTN9LAotCXsweDk1LCAweDFifSwKLQl7MHg5NiwgMHhmZn0sCi0JezB4OTcsIDB4MDB9LAotCXsweDk4LCAweDNkfSwKLQl7MHg5OSwgMHgzNn0sCi0JezB4OWEsIDB4NTF9LAotCXsweDliLCAweDQzfSwKLQl7MHg5YywgMHhmMH0sCi0JezB4OWQsIDB4ZjB9LAotCXsweDllLCAweGYwfSwKLQl7MHg5ZiwgMHhmZn0sCi0JezB4YTAsIDB4Njh9LAotCXsweGExLCAweDYyfSwKLQl7MHhhMiwgMHgwZX0sCi19OwotI2VuZGlmCi0vKiBFeHBvc3VyZSBDb21wZW5zYXRpb24gKi8KLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfZXhwb3N1cmVfY29tcGVuc2F0aW9uX2x2MF90YmxbXSA9IHsKLQkvKkBAICsxLjdFViovCi0JezB4MjQsIDB4YzB9LAotCXsweDI1LCAweGI4fSwKLQl7MHgyNiwgMHhlNn0sCi19OwotCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgb3Y3NjkyX2V4cG9zdXJlX2NvbXBlbnNhdGlvbl9sdjFfdGJsW10gPSB7Ci0JLypAQCArMS4wRVYqLwotCXsweDI0LCAweGE4fSwKLQl7MHgyNSwgMHhhMH0sCi0JezB4MjYsIDB4YzR9LAotfTsKLQotc3RydWN0IE9WNzY5Ml9XUkVHIG92NzY5Ml9leHBvc3VyZV9jb21wZW5zYXRpb25fbHYyX2RlZmF1bHRfdGJsW10gPSB7Ci0JLypAQCBkZWZhdWx0Ki8KLQl7MHgyNCwgMHg4Nn0sCi0JezB4MjUsIDB4NzZ9LAotCXsweDI2LCAweGIzfSwKLX07Ci0KLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfZXhwb3N1cmVfY29tcGVuc2F0aW9uX2x2M190YmxbXSA9IHsKLQkvKkBAIC0xLjBFViovCi0JezB4MjQsIDB4NzB9LAotCXsweDI1LCAweDYwfSwKLQl7MHgyNiwgMHhhMn0sCi19OwotCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgb3Y3NjkyX2V4cG9zdXJlX2NvbXBlbnNhdGlvbl9sdjRfdGJsW10gPSB7Ci0JLypAQCAtMS43RVYqLwotCXsweDI0LCAweDUwfSwKLQl7MHgyNSwgMHg0MH0sCi0JezB4MjYsIDB4YTJ9LAotfTsKLQotc3RydWN0IE9WNzY5Ml9XUkVHIG92NzY5Ml9hbnRpYmFuZGluZ19vZmZfdGJsW10gPSB7Ci0JezB4MTMsIDB4RTUsIElOVk1BU0soMHgyMCl9LAotfTsKLQotc3RydWN0IE9WNzY5Ml9XUkVHIG92NzY5Ml9hbnRpYmFuZGluZ19hdXRvX3RibFtdID0gewotCXsweDEzLCAweDIwLCBJTlZNQVNLKDB4MjApfSwKLQl7MHgxNCwgMHgxNCwgSU5WTUFTSygweDE3KX0sCi19OwotCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgb3Y3NjkyX2FudGliYW5kaW5nXzUwel90YmxbXSA9IHsKLQkvKkJhbmQgNTBIeiovCi0JezB4MTMsIDB4MjAsIElOVk1BU0soMHgyMCl9LAotCXsweDE0LCAweDE3LCBJTlZNQVNLKDB4MTcpfSwKLX07Ci0KLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfYW50aWJhbmRpbmdfNjB6X3RibFtdID0gewotCS8qQmFuZCA2MEh6Ki8KLQl7MHgxMywgMHgyMCwgSU5WTUFTSygweDIwKX0sCi0JezB4MTQsIDB4MTYsIElOVk1BU0soMHgxNyl9LAotfTsKLQotLypTYXR1cmF0aW9uKi8KLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfc2F0dXJhdGlvbl9sdjBfdGJsW10gPSB7Ci0JLypTYXR1cmF0aW9uIGxldmVsIDAqLwotCXsweDgxLCAweDMzLCBJTlZNQVNLKDB4MzMpfSwKLQl7MHhkOCwgMHgwMCwgSU5WTUFTSygweGZmKX0sCi0JezB4ZDksIDB4MDAsIElOVk1BU0soMHhmZil9LAotCXsweGQyLCAweDAyLCBJTlZNQVNLKDB4ZmYpfSwKLX07Ci0KLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfc2F0dXJhdGlvbl9sdjFfdGJsW10gPSB7Ci0JLypTYXR1cmF0aW9uIGxldmVsIDEqLwotCXsweDgxLCAweDMzLCBJTlZNQVNLKDB4MzMpfSwKLQl7MHhkOCwgMHgxMCwgSU5WTUFTSygweGZmKX0sCi0JezB4ZDksIDB4MTAsIElOVk1BU0soMHhmZil9LAotCXsweGQyLCAweDAyLCBJTlZNQVNLKDB4ZmYpfSwKLX07Ci0KLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfc2F0dXJhdGlvbl9sdjJfdGJsW10gPSB7Ci0JLypTYXR1cmF0aW9uIGxldmVsIDIqLwotCXsweDgxLCAweDMzLCBJTlZNQVNLKDB4MzMpfSwKLQl7MHhkOCwgMHgyMCwgSU5WTUFTSygweGZmKX0sCi0JezB4ZDksIDB4MjAsIElOVk1BU0soMHhmZil9LAotCXsweGQyLCAweDAyLCBJTlZNQVNLKDB4ZmYpfSwKLQotfTsKLQotc3RydWN0IE9WNzY5Ml9XUkVHIG92NzY5Ml9zYXR1cmF0aW9uX2x2M190YmxbXSA9IHsKLQkvKlNhdHVyYXRpb24gbGV2ZWwgMyovCi0JezB4ODEsIDB4MzMsIElOVk1BU0soMHgzMyl9LAotCXsweGQ4LCAweDMwLCBJTlZNQVNLKDB4ZmYpfSwKLQl7MHhkOSwgMHgzMCwgSU5WTUFTSygweGZmKX0sCi0JezB4ZDIsIDB4MDIsIElOVk1BU0soMHhmZil9LAotCi19OwotCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgb3Y3NjkyX3NhdHVyYXRpb25fZGVmYXVsdF9sdjRfdGJsW10gPSB7Ci0JLypTYXR1cmF0aW9uIGxldmVsIDQgKGRlZmF1bHQpKi8KLQl7MHg4MSwgMHgzMywgSU5WTUFTSygweDMzKX0sCi0JezB4ZDgsIDB4NDAsIElOVk1BU0soMHhmZil9LAotCXsweGQ5LCAweDQwLCBJTlZNQVNLKDB4ZmYpfSwKLQl7MHhkMiwgMHgwMiwgSU5WTUFTSygweGZmKX0sCi19OwotCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgb3Y3NjkyX3NhdHVyYXRpb25fbHY1X3RibFtdID0gewotCS8qU2F0dXJhdGlvbiBsZXZlbCA1Ki8KLQl7MHg4MSwgMHgzMywgSU5WTUFTSygweDMzKX0sCi0JezB4ZDgsIDB4NTAsIElOVk1BU0soMHhmZil9LAotCXsweGQ5LCAweDUwLCBJTlZNQVNLKDB4ZmYpfSwKLQl7MHhkMiwgMHgwMiwgSU5WTUFTSygweGZmKX0sCi19OwotCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgb3Y3NjkyX3NhdHVyYXRpb25fbHY2X3RibFtdID0gewotCS8qU2F0dXJhdGlvbiBsZXZlbCA2Ki8KLQl7MHg4MSwgMHgzMywgSU5WTUFTSygweDMzKX0sCi0JezB4ZDgsIDB4NjAsIElOVk1BU0soMHhmZil9LAotCXsweGQ5LCAweDYwLCBJTlZNQVNLKDB4ZmYpfSwKLQl7MHhkMiwgMHgwMiwgSU5WTUFTSygweGZmKX0sCi19OwotCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgb3Y3NjkyX3NhdHVyYXRpb25fbHY3X3RibFtdID0gewotCS8qU2F0dXJhdGlvbiBsZXZlbCA3Ki8KLQl7MHg4MSwgMHgzMywgSU5WTUFTSygweDMzKX0sCi0JezB4ZDgsIDB4NzAsIElOVk1BU0soMHhmZil9LAotCXsweGQ5LCAweDcwLCBJTlZNQVNLKDB4ZmYpfSwKLQl7MHhkMiwgMHgwMiwgSU5WTUFTSygweGZmKX0sCi19OwotCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgb3Y3NjkyX3NhdHVyYXRpb25fbHY4X3RibFtdID0gewotCS8qU2F0dXJhdGlvbiBsZXZlbCA4Ki8KLQl7MHg4MSwgMHgzMywgSU5WTUFTSygweDMzKX0sCi0JezB4ZDgsIDB4ODAsIElOVk1BU0soMHhmZil9LAotCXsweGQ5LCAweDgwLCBJTlZNQVNLKDB4ZmYpfSwKLQl7MHhkMiwgMHgwMiwgSU5WTUFTSygweGZmKX0sCi19OwotCi0vKkVGRkVDVCovCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgb3Y3NjkyX2VmZmVjdF9ub3JtYWxfdGJsW10gPSB7Ci0JezB4ODEsIDB4MDAsIElOVk1BU0soMHgyMCl9LAotCXsweDI4LCAweDAwLCB9LAotCXsweGQyLCAweDAwLCB9LAotCXsweGRhLCAweDgwLCB9LAotCXsweGRiLCAweDgwLCB9LAotfTsKLQotc3RydWN0IE9WNzY5Ml9XUkVHIG92NzY5Ml9lZmZlY3RfbW9ub190YmxbXSA9IHsKLQl7MHg4MSwgMHgyMCwgSU5WTUFTSygweDIwKX0sCi0JezB4MjgsIDB4MDAsIH0sCi0JezB4ZDIsIDB4MTgsIH0sCi0JezB4ZGEsIDB4ODAsIH0sCi0JezB4ZGIsIDB4ODAsIH0sCi19OwotCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgb3Y3NjkyX2VmZmVjdF9id190YmxbXSA9IHsKLQl7MHg4MSwgMHgyMCwgSU5WTUFTSygweDIwKX0sCi0JezB4MjgsIDB4MDAsIH0sCi0JezB4ZDIsIDB4MTgsIH0sCi0JezB4ZGEsIDB4ODAsIH0sCi0JezB4ZGIsIDB4ODAsIH0sCi19OwotCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgb3Y3NjkyX2VmZmVjdF9zZXBpYV90YmxbXSA9IHsKLQl7MHg4MSwgMHgyMCwgSU5WTUFTSygweDIwKX0sCi0JezB4MjgsIDB4MDAsIH0sCi0JezB4ZDIsIDB4MTgsIH0sCi0JezB4ZGEsIDB4NDAsIH0sCi0JezB4ZGIsIDB4YTAsIH0sCi19OwotCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgb3Y3NjkyX2VmZmVjdF9ibHVpc2hfdGJsW10gPSB7Ci0JezB4ODEsIDB4MjAsIElOVk1BU0soMHgyMCl9LAotCXsweDI4LCAweDAwLCB9LAotCXsweGQyLCAweDE4LCB9LAotCXsweGRhLCAweGMwLCB9LAotCXsweGRiLCAweDgwLCB9LAotfTsKLQotc3RydWN0IE9WNzY5Ml9XUkVHIG92NzY5Ml9lZmZlY3RfcmVkZGlzaF90YmxbXSA9IHsKLQl7MHg4MSwgMHgyMCwgSU5WTUFTSygweDIwKX0sCi0JezB4MjgsIDB4MDAsIH0sCi0JezB4ZDIsIDB4MTgsIH0sCi0JezB4ZGEsIDB4ODAsIH0sCi0JezB4ZGIsIDB4YzAsIH0sCi19OwotCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgb3Y3NjkyX2VmZmVjdF9ncmVlbmlzaF90YmxbXSA9IHsKLQl7MHg4MSwgMHgyMCwgSU5WTUFTSygweDIwKX0sCi0JezB4MjgsIDB4MDAsIH0sCi0JezB4ZDIsIDB4MTgsIH0sCi0JezB4ZGEsIDB4NjAsIH0sCi0JezB4ZGIsIDB4NjAsIH0sCi19OwotCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgb3Y3NjkyX2VmZmVjdF9uZWdhdGl2ZV90YmxbXSA9IHsKLQl7MHg4MSwgMHgyMCwgSU5WTUFTSygweDIwKX0sCi0JezB4MjgsIDB4ODAsIH0sCi0JezB4ZDIsIDB4NDAsIH0sCi0JezB4ZGEsIDB4ODAsIH0sCi0JezB4ZGIsIDB4ODAsIH0sCi19OwotCi0vKkNvbnRyYXN0Ki8KLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfY29udHJhc3RfbHYwX3RibFtdID0gewotCS8qQ29udHJhc3QgLTQqLwotCXsweGIyLCAweDI5fSwKLQl7MHhhMywgMHg1NX0sCi0JezB4YTQsIDB4NWJ9LAotCXsweGE1LCAweDY3fSwKLQl7MHhhNiwgMHg3ZX0sCi0JezB4YTcsIDB4ODl9LAotCXsweGE4LCAweDkzfSwKLQl7MHhhOSwgMHg5Y30sCi0JezB4YWEsIDB4YTR9LAotCXsweGFiLCAweGFjfSwKLQl7MHhhYywgMHhiM30sCi0JezB4YWQsIDB4YmV9LAotCXsweGFlLCAweGM3fSwKLQl7MHhhZiwgMHhkNX0sCi0JezB4YjAsIDB4ZGR9LAotCXsweGIxLCAweGUxfSwKLX07Ci0KLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfY29udHJhc3RfbHYxX3RibFtdID0gewotCS8qQ29udHJhc3QgLTMqLwotCXsweGIyLCAweDIwfSwKLQl7MHhhMywgMHg0M30sCi0JezB4YTQsIDB4NGF9LAotCXsweGE1LCAweDU4fSwKLQl7MHhhNiwgMHg3M30sCi0JezB4YTcsIDB4ODB9LAotCXsweGE4LCAweDhifSwKLQl7MHhhOSwgMHg5Nn0sCi0JezB4YWEsIDB4OWZ9LAotCXsweGFiLCAweGE4fSwKLQl7MHhhYywgMHhiMX0sCi0JezB4YWQsIDB4YmV9LAotCXsweGFlLCAweGM5fSwKLQl7MHhhZiwgMHhkOH0sCi0JezB4YjAsIDB4ZTJ9LAotCXsweGIxLCAweGU4fSwKLX07Ci0KLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfY29udHJhc3RfbHYyX3RibFtdID0gewotCS8qQ29udHJhc3QgLTIqLwotCXsweGIyLCAweDE4fSwKLQl7MHhhMywgMHgzMX0sCi0JezB4YTQsIDB4Mzl9LAotCXsweGE1LCAweDRhfSwKLQl7MHhhNiwgMHg2OH0sCi0JezB4YTcsIDB4Nzd9LAotCXsweGE4LCAweDg0fSwKLQl7MHhhOSwgMHg5MH0sCi0JezB4YWEsIDB4OWJ9LAotCXsweGFiLCAweGE1fSwKLQl7MHhhYywgMHhhZn0sCi0JezB4YWQsIDB4YmV9LAotCXsweGFlLCAweGNhfSwKLQl7MHhhZiwgMHhkY30sCi0JezB4YjAsIDB4ZTd9LAotCXsweGIxLCAweGVlfSwKLX07Ci0KLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfY29udHJhc3RfbHYzX3RibFtdID0gewotCS8qQ29udHJhc3QgLTEqLwotCXsweGIyLCAweDEwfSwKLQl7MHhhMywgMHgxZn0sCi0JezB4YTQsIDB4Mjh9LAotCXsweGE1LCAweDNifSwKLQl7MHhhNiwgMHg1ZH0sCi0JezB4YTcsIDB4NmV9LAotCXsweGE4LCAweDdkfSwKLQl7MHhhOSwgMHg4YX0sCi0JezB4YWEsIDB4OTZ9LAotCXsweGFiLCAweGEyfSwKLQl7MHhhYywgMHhhZH0sCi0JezB4YWQsIDB4YmV9LAotCXsweGFlLCAweGNjfSwKLQl7MHhhZiwgMHhlMH0sCi0JezB4YjAsIDB4ZWR9LAotCXsweGIxLCAweGY0fSwKLX07Ci0KLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfY29udHJhc3RfZGVmYXVsdF9sdjRfdGJsW10gPSB7Ci0JLypDb250cmFzdCAwKi8KLQl7MHhiMiwgMHg2fSwKLQl7MHhhMywgMHhifSwKLQl7MHhhNCwgMHgxNX0sCi0JezB4YTUsIDB4MmF9LAotCXsweGE2LCAweDUxfSwKLQl7MHhhNywgMHg2M30sCi0JezB4YTgsIDB4NzR9LAotCXsweGE5LCAweDgzfSwKLQl7MHhhYSwgMHg5MX0sCi0JezB4YWIsIDB4OWV9LAotCXsweGFjLCAweGFhfSwKLQl7MHhhZCwgMHhiZX0sCi0JezB4YWUsIDB4Y2V9LAotCXsweGFmLCAweGU1fSwKLQl7MHhiMCwgMHhmM30sCi0JezB4YjEsIDB4ZmJ9LAotfTsKLQotc3RydWN0IE9WNzY5Ml9XUkVHIG92NzY5Ml9jb250cmFzdF9sdjVfdGJsW10gPSB7Ci0JLypDb250cmFzdCAxKi8KLQl7MHhiMiwgMHhjfSwKLQl7MHhhMywgMHg0fSwKLQl7MHhhNCwgMHhjfSwKLQl7MHhhNSwgMHgxZn0sCi0JezB4YTYsIDB4NDV9LAotCXsweGE3LCAweDU4fSwKLQl7MHhhOCwgMHg2Yn0sCi0JezB4YTksIDB4N2N9LAotCXsweGFhLCAweDhkfSwKLQl7MHhhYiwgMHg5ZH0sCi0JezB4YWMsIDB4YWN9LAotCXsweGFkLCAweGMzfSwKLQl7MHhhZSwgMHhkMn0sCi0JezB4YWYsIDB4ZTh9LAotCXsweGIwLCAweGYyfSwKLQl7MHhiMSwgMHhmN30sCi19OwotCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgb3Y3NjkyX2NvbnRyYXN0X2x2Nl90YmxbXSA9IHsKLQkvKkNvbnRyYXN0IDIqLwotCXsweGIyLCAweDF9LAotCXsweGEzLCAweDJ9LAotCXsweGE0LCAweDl9LAotCXsweGE1LCAweDFhfSwKLQl7MHhhNiwgMHgzZX0sCi0JezB4YTcsIDB4NGF9LAotCXsweGE4LCAweDU5fSwKLQl7MHhhOSwgMHg2YX0sCi0JezB4YWEsIDB4Nzl9LAotCXsweGFiLCAweDhlfSwKLQl7MHhhYywgMHhhNH0sCi0JezB4YWQsIDB4YzF9LAotCXsweGFlLCAweGRifSwKLQl7MHhhZiwgMHhmNH0sCi0JezB4YjAsIDB4ZmZ9LAotCXsweGIxLCAweGZmfSwKLX07Ci0KLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfY29udHJhc3RfbHY3X3RibFtdID0gewotCS8qQ29udHJhc3QgMyovCi0JezB4YjIsIDB4Y30sCi0JezB4YTMsIDB4NH0sCi0JezB4YTQsIDB4OH0sCi0JezB4YTUsIDB4MTd9LAotCXsweGE2LCAweDI3fSwKLQl7MHhhNywgMHgzZH0sCi0JezB4YTgsIDB4NTR9LAotCXsweGE5LCAweDYwfSwKLQl7MHhhYSwgMHg3N30sCi0JezB4YWIsIDB4ODV9LAotCXsweGFjLCAweGE0fSwKLQl7MHhhZCwgMHhjNn0sCi0JezB4YWUsIDB4ZDJ9LAotCXsweGFmLCAweGU5fSwKLQl7MHhiMCwgMHhmMH0sCi0JezB4YjEsIDB4Zjd9LAotfTsKLQotc3RydWN0IE9WNzY5Ml9XUkVHIG92NzY5Ml9jb250cmFzdF9sdjhfdGJsW10gPSB7Ci0JLypDb250cmFzdCA0Ki8KLQl7MHhiMiwgMHgxfSwKLQl7MHhhMywgMHg0fSwKLQl7MHhhNCwgMHg0fSwKLQl7MHhhNSwgMHg3fSwKLQl7MHhhNiwgMHhifSwKLQl7MHhhNywgMHgxN30sCi0JezB4YTgsIDB4MmF9LAotCXsweGE5LCAweDQxfSwKLQl7MHhhYSwgMHg1OX0sCi0JezB4YWIsIDB4NmJ9LAotCXsweGFjLCAweDhifSwKLQl7MHhhZCwgMHhiMX0sCi0JezB4YWUsIDB4ZDJ9LAotCXsweGFmLCAweGVhfSwKLQl7MHhiMCwgMHhmNH0sCi0JezB4YjEsIDB4ZmZ9LAotfTsKLQotCS8qU2hhcnBuZXNzKi8KLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfc2hhcnBuZXNzX2x2MF90YmxbXSA9IHsKLQkvKlNoYXJwbmVzcyAwKi8KLQl7MHhiNCwgMHgyMCwgSU5WTUFTSygweDIwKX0sCi0JezB4YjYsIDB4MDAsIElOVk1BU0soMHgxZil9LAotfTsKLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfc2hhcnBuZXNzX2x2MV90YmxbXSA9IHsKLQkvKlNoYXJwbmVzcyAxKi8KLQl7MHhiNCwgMHgyMCwgSU5WTUFTSygweDIwKX0sCi0JezB4YjYsIDB4MDEsIElOVk1BU0soMHgxZil9LAotfTsKLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfc2hhcnBuZXNzX2RlZmF1bHRfbHYyX3RibFtdID0gewotCS8qU2hhcnBuZXNzIEF1dG8gKERlZmF1bHQpKi8KLQl7MHhiNCwgMHgwMCwgSU5WTUFTSygweDIwKX0sCi0JezB4YjYsIDB4MDAsIElOVk1BU0soMHgxZil9LAotfTsKLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfc2hhcnBuZXNzX2x2M190YmxbXSA9IHsKLQkvKlNoYXJwbmVzcyAzKi8KLQl7MHhiNCwgMHgyMCwgSU5WTUFTSygweDIwKX0sCi0JezB4YjYsIDB4NjYsIElOVk1BU0soMHgwNCl9LAotfTsKLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfc2hhcnBuZXNzX2x2NF90YmxbXSA9IHsKLQkvKlNoYXJwbmVzcyA0Ki8KLQl7MHhiNCwgMHgyMCwgSU5WTUFTSygweDIwKX0sCi0JezB4YjYsIDB4OTksIElOVk1BU0soMHgxZil9LAotfTsKLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfc2hhcnBuZXNzX2x2NV90YmxbXSA9IHsKLQkvKlNoYXJwbmVzcyA1Ki8KLQl7MHhiNCwgMHgyMCwgSU5WTUFTSygweDIwKX0sCi0JezB4YjYsIDB4Y2MsIElOVk1BU0soMHgxZil9LAotfTsKLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfc2hhcnBuZXNzX2x2Nl90YmxbXSA9IHsKLQkvKlNoYXJwbmVzcyA2Ki8KLQl7MHhiNCwgMHgyMCwgSU5WTUFTSygweDIwKX0sCi0JezB4YjYsIDB4ZmYsIElOVk1BU0soMHgxZil9LAotfTsKLQotCS8qIElTTyBUWVBFKi8KLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfaXNvX3R5cGVfYXV0b1tdID0gewotCS8qQEBJU08gQXV0byovCi0JezB4MTQsIDB4MjAsIElOVk1BU0soMHg3MCl9LAotfTsKLQotc3RydWN0IE9WNzY5Ml9XUkVHIG92NzY5Ml9pc29fdHlwZV8xMDBbXSA9IHsKLQkvKkBASVNPIDEwMCovCi0JezB4MTQsIDB4MDAsIElOVk1BU0soMHg3MCl9LAotfTsKLQotc3RydWN0IE9WNzY5Ml9XUkVHIG92NzY5Ml9pc29fdHlwZV8yMDBbXSA9IHsKLQkvKkBASVNPIDIwMCovCi0JezB4MTQsIDB4MTAsIElOVk1BU0soMHg3MCl9LAotfTsKLQotc3RydWN0IE9WNzY5Ml9XUkVHIG92NzY5Ml9pc29fdHlwZV80MDBbXSA9IHsKLQkvKkBASVNPIDQwMCovCi0JezB4MTQsIDB4MjAsIElOVk1BU0soMHg3MCl9LAotfTsKLQotc3RydWN0IE9WNzY5Ml9XUkVHIG92NzY5Ml9pc29fdHlwZV84MDBbXSA9IHsKLQkvKkBASVNPIDgwMCovCi0JezB4MTQsIDB4MzAsIElOVk1BU0soMHg3MCl9LAotfTsKLQotc3RydWN0IE9WNzY5Ml9XUkVHIG92NzY5Ml9pc29fdHlwZV8xNjAwW10gPSB7Ci0JLypAQElTTyAxNjAwKi8KLQl7MHgxNCwgMHg0MCwgSU5WTUFTSygweDcwKX0sCi19OwotCi0JLypMaWdodCBNb2RlKi8KLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfd2JfZGVmW10gPSB7Ci0JezB4MTMsIDB4Zjd9LAotCXsweDE1LCAweDAwfSwKLX07Ci0KLXN0cnVjdCBPVjc2OTJfV1JFRyBvdjc2OTJfd2JfY3VzdG9tW10gPSB7Ci0JezB4MTMsIDB4ZjV9LAotCXsweDAxLCAweDU2fSwKLQl7MHgwMiwgMHg1MH0sCi0JezB4MTUsIDB4MDB9LAotfTsKLQotc3RydWN0IE9WNzY5Ml9XUkVHIG92NzY5Ml93Yl9pbmNbXSA9IHsKLQl7MHgxMywgMHhmNX0sCi0JezB4MDEsIDB4NjZ9LAotCXsweDAyLCAweDQwfSwKLQl7MHgxNSwgMHgwMH0sCi19OwotCi1zdHJ1Y3QgT1Y3NjkyX1dSRUcgb3Y3NjkyX3diX2RheWxpZ2h0W10gPSB7Ci0JezB4MTMsIDB4ZjV9LAotCXsweDAxLCAweDQzfSwKLQl7MHgwMiwgMHg1ZH0sCi0JezB4MTUsIDB4MDB9LAotfTsKLQotc3RydWN0IE9WNzY5Ml9XUkVHIG92NzY5Ml93Yl9jbG91ZHlbXSA9IHsKLQl7MHgxMywgMHhmNX0sCi0JezB4MDEsIDB4NDh9LAotCXsweDAyLCAweDYzfSwKLQl7MHgxNSwgMHgwMH0sCi19OwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL292NzY5Ml9xcmQuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9vdjc2OTJfcXJkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTgyYWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL292NzY5Ml9xcmQuYworKysgL2Rldi9udWxsCkBAIC0xLDExNzggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxtZWRpYS9tc21fY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLSNpbmNsdWRlICJvdjc2OTIuaCIKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgU0VOU09SIFJFR0lTVEVSIERFRklORVMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLSNkZWZpbmUgUTggICAgMHgwMDAwMDEwMAotCi0vKiBPbW5pdmlzaW9uODgxMCBwcm9kdWN0IElEIHJlZ2lzdGVyIGFkZHJlc3MgKi8KLSNkZWZpbmUgUkVHX09WNzY5Ml9NT0RFTF9JRF9NU0IgICAgICAgICAgICAgICAgICAgICAgIDB4MEEKLSNkZWZpbmUgUkVHX09WNzY5Ml9NT0RFTF9JRF9MU0IgICAgICAgICAgICAgICAgICAgICAgIDB4MEIKLQotI2RlZmluZSBPVjc2OTJfTU9ERUxfSUQgICAgICAgICAgICAgICAgICAgICAgIDB4NzY5MgotLyogT21uaXZpc2lvbjg4MTAgcHJvZHVjdCBJRCAqLwotCi0vKiBUaW1lIGluIG1pbGlzZWNzIGZvciB3YWl0aW5nIGZvciB0aGUgc2Vuc29yIHRvIHJlc2V0ICovCi0jZGVmaW5lIE9WNzY5Ml9SRVNFVF9ERUxBWV9NU0VDUyAgICA2NgotI2RlZmluZSBPVjc2OTJfREVGQVVMVF9DTE9DS19SQVRFICAgMjQwMDAwMDAKLS8qIFJlZ2lzdGVycyovCi0KLS8qIENvbG9yIGJhciBwYXR0ZXJuIHNlbGVjdGlvbiAqLwotI2RlZmluZSBPVjc2OTJfQ09MT1JfQkFSX1BBVFRFUk5fU0VMX1JFRyAgICAgMHg4MgotLyogQ29sb3IgYmFyIGVuYWJsaW5nIGNvbnRyb2wgKi8KLSNkZWZpbmUgT1Y3NjkyX0NPTE9SX0JBUl9FTkFCTEVfUkVHICAgICAgICAgICAweDYwMQotLyogVGltZSBpbiBtaWxpc2VjcyBmb3Igd2FpdGluZyBmb3IgdGhlIHNlbnNvciB0byByZXNldCovCi0jZGVmaW5lIE9WNzY5Ml9SRVNFVF9ERUxBWV9NU0VDUyAgICA2NgotCi1zdGF0aWMgaW50IG92NzY5Ml9wd2RuX2dwaW87Ci1zdGF0aWMgaW50IG92NzY5Ml9yZXNldF9ncGlvOwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkJREFUQSBERUNMQVJBVElPTlMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0KLXN0YXRpYyBib29sIE9WNzY5Ml9DU0lfQ09ORklHOwotLyogODE2eDYxMiwgMjRNSHogTUNMSyA5Nk1IeiBQQ0xLICovCi11aW50MzJfdCBPVjc2OTJfRlVMTF9TSVpFX1dJRFRIICAgICAgICA9IDY0MDsKLXVpbnQzMl90IE9WNzY5Ml9GVUxMX1NJWkVfSEVJR0hUICAgICAgID0gNDgwOwotCi11aW50MzJfdCBPVjc2OTJfUVRSX1NJWkVfV0lEVEggICAgICAgICA9IDY0MDsKLXVpbnQzMl90IE9WNzY5Ml9RVFJfU0laRV9IRUlHSFQgICAgICAgID0gNDgwOwotCi11aW50MzJfdCBPVjc2OTJfSFJaX0ZVTExfQkxLX1BJWEVMUyAgICA9IDE2OwotdWludDMyX3QgT1Y3NjkyX1ZFUl9GVUxMX0JMS19MSU5FUyAgICAgPSAxMjsKLXVpbnQzMl90IE9WNzY5Ml9IUlpfUVRSX0JMS19QSVhFTFMgICAgID0gMTY7Ci11aW50MzJfdCBPVjc2OTJfVkVSX1FUUl9CTEtfTElORVMgICAgICA9IDEyOwotCi1zdHJ1Y3Qgb3Y3NjkyX3dvcmtfdCB7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Ci19Owotc3RhdGljIHN0cnVjdCAgb3Y3NjkyX3dvcmtfdCAqb3Y3NjkyX3NlbnNvcnc7Ci1zdGF0aWMgc3RydWN0ICBpMmNfY2xpZW50ICpvdjc2OTJfY2xpZW50Owotc3RydWN0IG92NzY5Ml9jdHJsX3QgewotCWNvbnN0IHN0cnVjdCAgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2Vuc29yZGF0YTsKLQl1aW50MzJfdCBzZW5zb3Jtb2RlOwotCXVpbnQzMl90IGZwc19kaXZpZGVyOyAgICAgICAgLyogaW5pdCB0byAxICogMHgwMDAwMDQwMCAqLwotCXVpbnQzMl90IHBpY3RfZnBzX2RpdmlkZXI7ICAgIC8qIGluaXQgdG8gMSAqIDB4MDAwMDA0MDAgKi8KLQl1aW50MzJfdCBmcHM7Ci0JaW50MzJfdCAgY3Vycl9sZW5zX3BvczsKLQl1aW50MzJfdCBjdXJyX3N0ZXBfcG9zOwotCXVpbnQzMl90IG15X3JlZ19nYWluOwotCXVpbnQzMl90IG15X3JlZ19saW5lX2NvdW50OwotCXVpbnQzMl90IHRvdGFsX2xpbmVzX3Blcl9mcmFtZTsKLQllbnVtIG92NzY5Ml9yZXNvbHV0aW9uX3QgcHJldl9yZXM7Ci0JZW51bSBvdjc2OTJfcmVzb2x1dGlvbl90IHBpY3RfcmVzOwotCWVudW0gb3Y3NjkyX3Jlc29sdXRpb25fdCBjdXJyX3JlczsKLQllbnVtIG92NzY5Ml90ZXN0X21vZGVfdCAgc2V0X3Rlc3Q7Ci0JdW5zaWduZWQgc2hvcnQgaW1nYWRkcjsKLX07Ci1zdGF0aWMgc3RydWN0IG92NzY5Ml9jdHJsX3QgKm92NzY5Ml9jdHJsOwotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKG92NzY5Ml93YWl0X3F1ZXVlKTsKLURFRklORV9NVVRFWChvdjc2OTJfbXV0KTsKLXN0YXRpYyBpbnQgZWZmZWN0X3ZhbHVlOwotc3RhdGljIGludDE2X3Qgb3Y3NjkyX2VmZmVjdCA9IENBTUVSQV9FRkZFQ1RfT0ZGOwotc3RhdGljIHVuc2lnbmVkIGludCBTQVRfVSA9IDB4ODA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IFNBVF9WID0gMHg4MDsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotc3RhdGljIGludCBvdjc2OTJfaTJjX3J4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQkJdW5zaWduZWQgY2hhciAqcnhkYXRhLCBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKLQkJewotCQkJLmFkZHIgID0gc2FkZHIsCi0JCQkuZmxhZ3MgPSAwLAotCQkJLmxlbiAgID0gMSwKLQkJCS5idWYgICA9IHJ4ZGF0YSwKLQkJfSwKLQkJewotCQkJLmFkZHIgID0gc2FkZHIsCi0JCQkuZmxhZ3MgPSBJMkNfTV9SRCwKLQkJCS5sZW4gICA9IDEsCi0JCQkuYnVmICAgPSByeGRhdGEsCi0JCX0sCi0JfTsKLQlpZiAoaTJjX3RyYW5zZmVyKG92NzY5Ml9jbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpIDwgMCkgewotCQlDREJHKCJvdjc2OTJfaTJjX3J4ZGF0YSBmYWlsZWQhXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCXJldHVybiAwOwotfQotc3RhdGljIGludDMyX3Qgb3Y3NjkyX2kyY190eGRhdGEodW5zaWduZWQgc2hvcnQgc2FkZHIsCi0JCXVuc2lnbmVkIGNoYXIgKnR4ZGF0YSwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKLQkJewotCQkJLmFkZHIgPSBzYWRkciwKLQkJCS5mbGFncyA9IDAsCi0JCQkubGVuID0gMiwKLQkJCS5idWYgPSB0eGRhdGEsCi0JCX0sCi0JfTsKLQlpZiAoaTJjX3RyYW5zZmVyKG92NzY5Ml9jbGllbnQtPmFkYXB0ZXIsIG1zZywgMSkgPCAwKSB7Ci0JCUNEQkcoIm92NzY5Ml9pMmNfdHhkYXRhIGZhaWxkIDB4JXhcbiIsIG92NzY5Ml9jbGllbnQtPmFkZHIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3Qgb3Y3NjkyX2kyY19yZWFkKHVpbnQ4X3QgcmFkZHIsCi0JCXVpbnQ4X3QgKnJkYXRhLCBpbnQgcmxlbikKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlsxXTsKLQlpZiAoIXJkYXRhKQotCQlyZXR1cm4gLUVJTzsKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gcmFkZHI7Ci0JcmMgPSBvdjc2OTJfaTJjX3J4ZGF0YShvdjc2OTJfY2xpZW50LT5hZGRyID4+IDEsIGJ1Ziwgcmxlbik7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJvdjc2OTJfaTJjX3JlYWQgMHgleCBmYWlsZWQhXG4iLCByYWRkcik7Ci0JCXJldHVybiByYzsKLQl9Ci0JKnJkYXRhID0gYnVmWzBdOwotCXJldHVybiByYzsKLX0KLXN0YXRpYyBpbnQzMl90IG92NzY5Ml9pMmNfd3JpdGVfYl9zZW5zb3IodWludDhfdCB3YWRkciwgdWludDhfdCBiZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gLUVGQVVMVDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKLQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZbMF0gPSB3YWRkcjsKLQlidWZbMV0gPSBiZGF0YTsKLQlDREJHKCJpMmNfd3JpdGVfYiBhZGRyID0gMHgleCwgdmFsID0gMHgleFxuIiwgd2FkZHIsIGJkYXRhKTsKLQlyYyA9IG92NzY5Ml9pMmNfdHhkYXRhKG92NzY5Ml9jbGllbnQtPmFkZHIgPj4gMSwgYnVmLCAyKTsKLQlpZiAocmMgPCAwKQotCQlDREJHKCJpMmNfd3JpdGVfYiBmYWlsZWQsIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4IVxuIiwKLQkJd2FkZHIsIGJkYXRhKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgT1Y3NjkyX1dyaXRlUFJlZ3Moc3RydWN0IE9WNzY5Ml9XUkVHICpwVGIsIGludDMyX3QgbGVuKQotewotCWludDMyX3QgaSwgcmV0ID0gMDsKLQl1aW50OF90IHJlZ3Y7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaWYgKHBUYltpXS5tYXNrID09IDApIHsKLQkJCW92NzY5Ml9pMmNfd3JpdGVfYl9zZW5zb3IocFRiW2ldLmFkZHIsIHBUYltpXS5kYXRhKTsKLQkJfSBlbHNlIHsKLQkJCW92NzY5Ml9pMmNfcmVhZChwVGJbaV0uYWRkciwgJnJlZ3YsIDEpOwotCQkJcmVndiAmPSBwVGJbaV0ubWFzazsKLQkJCXJlZ3YgfD0gKHBUYltpXS5kYXRhICYgKH5wVGJbaV0ubWFzaykpOwotCQkJb3Y3NjkyX2kyY193cml0ZV9iX3NlbnNvcihwVGJbaV0uYWRkciwgcmVndik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludDMyX3Qgb3Y3NjkyX3NlbnNvcl9zZXR0aW5nKGludCB1cGRhdGVfdHlwZSwgaW50IHJ0KQotewotCWludDMyX3QgaSwgYXJyYXlfbGVuZ3RoOwotCWludDMyX3QgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX2NzaV9wYXJhbXMgb3Y3NjkyX2NzaV9wYXJhbXM7Ci0KLQlDREJHKCIlczogcnQgPSAlZFxuIiwgX19mdW5jX18sIHJ0KTsKLQotCXN3aXRjaCAodXBkYXRlX3R5cGUpIHsKLQljYXNlIFJFR19JTklUOgotCQlPVjc2OTJfQ1NJX0NPTkZJRyA9IDA7Ci0JCW92NzY5Ml9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwZSwgMHgwOCk7Ci0JCXJldHVybiByYzsKLQkJYnJlYWs7Ci0JY2FzZSBVUERBVEVfUEVSSU9ESUM6Ci0JCWlmICghT1Y3NjkyX0NTSV9DT05GSUcpIHsKLQkJCW92NzY5Ml9jc2lfcGFyYW1zLmxhbmVfY250ID0gMTsKLQkJCW92NzY5Ml9jc2lfcGFyYW1zLmRhdGFfZm9ybWF0ID0gQ1NJXzhCSVQ7Ci0JCQlvdjc2OTJfY3NpX3BhcmFtcy5sYW5lX2Fzc2lnbiA9IDB4ZTQ7Ci0JCQlvdjc2OTJfY3NpX3BhcmFtcy5kcGNtX3NjaGVtZSA9IDA7Ci0JCQlvdjc2OTJfY3NpX3BhcmFtcy5zZXR0bGVfY250ID0gMHgxNDsKLQotCQkJYXJyYXlfbGVuZ3RoID0gc2l6ZW9mKG92NzY5Ml9pbml0X3NldHRpbmdzX2FycmF5KSAvCi0JCQkJc2l6ZW9mKG92NzY5Ml9pbml0X3NldHRpbmdzX2FycmF5WzBdKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBhcnJheV9sZW5ndGg7IGkrKykgewotCQkJCXJjID0gb3Y3NjkyX2kyY193cml0ZV9iX3NlbnNvcigKLQkJCQlvdjc2OTJfaW5pdF9zZXR0aW5nc19hcnJheVtpXS5yZWdfYWRkciwKLQkJCQlvdjc2OTJfaW5pdF9zZXR0aW5nc19hcnJheVtpXS5yZWdfdmFsKTsKLQkJCQlpZiAocmMgPCAwKQotCQkJCQlyZXR1cm4gcmM7Ci0JCQl9Ci0JCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKLQkJCXJjID0gbXNtX2NhbWlvX2NzaV9jb25maWcoJm92NzY5Ml9jc2lfcGFyYW1zKTsKLQkJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotCQkJb3Y3NjkyX2kyY193cml0ZV9iX3NlbnNvcigweDBlLCAweDAwKTsKLQkJCU9WNzY5Ml9DU0lfQ09ORklHID0gMTsKLQkJCW1zbGVlcCgyMCk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBvdjc2OTJfdmlkZW9fY29uZmlnKGludCBtb2RlKQotewotCWludDMyX3QgcmMgPSAwOwotCWludCBydDsKLQkvKiBjaGFuZ2Ugc2Vuc29yIHJlc29sdXRpb24gaWYgbmVlZGVkICovCi0JcnQgPSBSRVNfUFJFVklFVzsKLQotCUNEQkcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAob3Y3NjkyX3NlbnNvcl9zZXR0aW5nKFVQREFURV9QRVJJT0RJQywgcnQpIDwgMCkKLQkJcmV0dXJuIHJjOwotCW92NzY5Ml9jdHJsLT5jdXJyX3JlcyA9IG92NzY5Ml9jdHJsLT5wcmV2X3JlczsKLQlvdjc2OTJfY3RybC0+c2Vuc29ybW9kZSA9IG1vZGU7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBvdjc2OTJfc2V0X3NlbnNvcl9tb2RlKGludCBtb2RlLAotCQlpbnQgcmVzKQotewotCWludDMyX3QgcmMgPSAwOwotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgU0VOU09SX1BSRVZJRVdfTU9ERToKLQkJcmMgPSBvdjc2OTJfdmlkZW9fY29uZmlnKG1vZGUpOwotCQlicmVhazsKLQljYXNlIFNFTlNPUl9TTkFQU0hPVF9NT0RFOgotCWNhc2UgU0VOU09SX1JBV19TTkFQU0hPVF9NT0RFOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y3NjkyX3NldF9leHBvc3VyZV9jb21wZW5zYXRpb24oaW50IGNvbXBlbnNhdGlvbikKLXsKLQlsb25nIHJjID0gMDsKLQotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uKFN0YXJ0KVxuIiwgX19mdW5jX18pOwotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uZXhwb3N1cmVfY29tcGVuc2F0aW9uID0gJWRcbiIsCi0JCSBfX2Z1bmNfXyAsIGNvbXBlbnNhdGlvbik7Ci0Jc3dpdGNoIChjb21wZW5zYXRpb24pIHsKLQljYXNlIENBTUVSQV9FWFBPU1VSRV9DT01QRU5TQVRJT05fTFYwOgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0VYUE9TVVJFX0NPTVBFTlNBVElPTl9MVjBcbiIpOwotCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKAotCQkJb3Y3NjkyX2V4cG9zdXJlX2NvbXBlbnNhdGlvbl9sdjBfdGJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1FUkFfRVhQT1NVUkVfQ09NUEVOU0FUSU9OX0xWMToKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9FWFBPU1VSRV9DT01QRU5TQVRJT05fTFYxXG4iKTsKLQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRygKLQkJCW92NzY5Ml9leHBvc3VyZV9jb21wZW5zYXRpb25fbHYxX3RibCk7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNRVJBX0VYUE9TVVJFX0NPTVBFTlNBVElPTl9MVjI6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfRVhQT1NVUkVfQ09NUEVOU0FUSU9OX0xWMlxuIik7Ci0JCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcoCi0JCQlvdjc2OTJfZXhwb3N1cmVfY29tcGVuc2F0aW9uX2x2Ml9kZWZhdWx0X3RibCk7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNRVJBX0VYUE9TVVJFX0NPTVBFTlNBVElPTl9MVjM6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfRVhQT1NVUkVfQ09NUEVOU0FUSU9OX0xWM1xuIik7Ci0JCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcoCi0JCQlvdjc2OTJfZXhwb3N1cmVfY29tcGVuc2F0aW9uX2x2M190YmwpOwotCQlicmVhazsKLQljYXNlIENBTUVSQV9FWFBPU1VSRV9DT01QRU5TQVRJT05fTFY0OgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0VYUE9TVVJFX0NPTVBFTlNBVElPTl9MVjNcbiIpOwotCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKAotCQkJb3Y3NjkyX2V4cG9zdXJlX2NvbXBlbnNhdGlvbl9sdjRfdGJsKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQ0RCRygiLS1DQU1FUkEtLUVSUk9SIENBTUVSQV9FWFBPU1VSRV9DT01QRU5TQVRJT05cbiIpOwotCQlicmVhazsKLQl9Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4oRW5kKVxuIiwgX19mdW5jX18pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgb3Y3NjkyX3NldF9hbnRpYmFuZGluZyhpbnQgYW50aWJhbmRpbmcpCi17Ci0JbG9uZyByYyA9IDA7Ci0KLQlDREJHKCItLUNBTUVSQS0tICVzIC4uLihTdGFydClcbiIsIF9fZnVuY19fKTsKLQlDREJHKCItLUNBTUVSQS0tICVzIC4uLmFudGliYW5kaW5nID0gJWRcbiIsIF9fZnVuY19fLCBhbnRpYmFuZGluZyk7Ci0Jc3dpdGNoIChhbnRpYmFuZGluZykgewotCWNhc2UgQ0FNRVJBX0FOVElCQU5ESU5HX09GRjoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9BTlRJQkFORElOR19PRkZcbiIpOwotCQlicmVhazsKLQljYXNlIENBTUVSQV9BTlRJQkFORElOR182MEhaOgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0FOVElCQU5ESU5HXzYwSFpcbiIpOwotCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKG92NzY5Ml9hbnRpYmFuZGluZ182MHpfdGJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1FUkFfQU5USUJBTkRJTkdfNTBIWjoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9BTlRJQkFORElOR181MEhaXG4iKTsKLQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfYW50aWJhbmRpbmdfNTB6X3RibCk7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNRVJBX0FOVElCQU5ESU5HX0FVVE86Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfQU5USUJBTkRJTkdfQVVUT1xuIik7Ci0JCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcob3Y3NjkyX2FudGliYW5kaW5nX2F1dG9fdGJsKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9BTlRJQkFORElOR19FUlJPUiBDT01NQU5EXG4iKTsKLQkJYnJlYWs7Ci0JfQotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uKEVuZClcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y3NjkyX3NldF9zYXR1cmF0aW9uKGludCBzYXR1cmF0aW9uKQotewotCWxvbmcgcmMgPSAwOwotCi0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4oU3RhcnQpXG4iLCBfX2Z1bmNfXyk7Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi5zYXR1cmF0aW9uID0gJWRcbiIsIF9fZnVuY19fICwgc2F0dXJhdGlvbik7Ci0KLQlpZiAoZWZmZWN0X3ZhbHVlID09IENBTUVSQV9FRkZFQ1RfT0ZGKSB7Ci0JCXN3aXRjaCAoc2F0dXJhdGlvbikgewotCQljYXNlIENBTUVSQV9TQVRVUkFUSU9OX0xWMDoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjBcbiIpOwotCQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfc2F0dXJhdGlvbl9sdjBfdGJsKTsKLQkJCWJyZWFrOwotCQljYXNlIENBTUVSQV9TQVRVUkFUSU9OX0xWMToKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjFcbiIpOwotCQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfc2F0dXJhdGlvbl9sdjFfdGJsKTsKLQkJCWJyZWFrOwotCQljYXNlIENBTUVSQV9TQVRVUkFUSU9OX0xWMjoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjJcbiIpOwotCQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfc2F0dXJhdGlvbl9sdjJfdGJsKTsKLQkJCWJyZWFrOwotCQljYXNlIENBTUVSQV9TQVRVUkFUSU9OX0xWMzoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjNcbiIpOwotCQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfc2F0dXJhdGlvbl9sdjNfdGJsKTsKLQkJCWJyZWFrOwotCQljYXNlIENBTUVSQV9TQVRVUkFUSU9OX0xWNDoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjRcbiIpOwotCQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRygKLQkJCQlvdjc2OTJfc2F0dXJhdGlvbl9kZWZhdWx0X2x2NF90YmwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNRVJBX1NBVFVSQVRJT05fTFY1OgotCQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TQVRVUkFUSU9OX0xWNVxuIik7Ci0JCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKG92NzY5Ml9zYXR1cmF0aW9uX2x2NV90YmwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNRVJBX1NBVFVSQVRJT05fTFY2OgotCQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TQVRVUkFUSU9OX0xWNlxuIik7Ci0JCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKG92NzY5Ml9zYXR1cmF0aW9uX2x2Nl90YmwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNRVJBX1NBVFVSQVRJT05fTFY3OgotCQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TQVRVUkFUSU9OX0xWN1xuIik7Ci0JCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKG92NzY5Ml9zYXR1cmF0aW9uX2x2N190YmwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNRVJBX1NBVFVSQVRJT05fTFY4OgotCQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TQVRVUkFUSU9OX0xWOFxuIik7Ci0JCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKG92NzY5Ml9zYXR1cmF0aW9uX2x2OF90YmwpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1NBVFVSQVRJT05fRVJST1IgQ09NTUFORFxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qZm9yIHJlY292ZXIgc2F0dXJhdGlvbiBsZXZlbCB3aGVuIGNoYW5nZSBzcGVjaWFsIGVmZmVjdCovCi0Jc3dpdGNoIChzYXR1cmF0aW9uKSB7Ci0JY2FzZSBDQU1FUkFfU0FUVVJBVElPTl9MVjA6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjBcbiIpOwotCQlTQVRfVSA9IDB4MDA7Ci0JCVNBVF9WID0gMHgwMDsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1FUkFfU0FUVVJBVElPTl9MVjE6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjFcbiIpOwotCQlTQVRfVSA9IDB4MTA7Ci0JCVNBVF9WID0gMHgxMDsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1FUkFfU0FUVVJBVElPTl9MVjI6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjJcbiIpOwotCQlTQVRfVSA9IDB4MjA7Ci0JCVNBVF9WID0gMHgyMDsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1FUkFfU0FUVVJBVElPTl9MVjM6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjNcbiIpOwotCQlTQVRfVSA9IDB4MzA7Ci0JCVNBVF9WID0gMHgzMDsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1FUkFfU0FUVVJBVElPTl9MVjQ6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjRcbiIpOwotCQlTQVRfVSA9IDB4NDA7Ci0JCVNBVF9WID0gMHg0MDsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1FUkFfU0FUVVJBVElPTl9MVjU6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjVcbiIpOwotCQlTQVRfVSA9IDB4NTA7Ci0JCVNBVF9WID0gMHg1MDsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1FUkFfU0FUVVJBVElPTl9MVjY6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjZcbiIpOwotCQlTQVRfVSA9IDB4NjA7Ci0JCVNBVF9WID0gMHg2MDsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1FUkFfU0FUVVJBVElPTl9MVjc6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjdcbiIpOwotCQlTQVRfVSA9IDB4NzA7Ci0JCVNBVF9WID0gMHg3MDsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1FUkFfU0FUVVJBVElPTl9MVjg6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfU0FUVVJBVElPTl9MVjhcbiIpOwotCQlTQVRfVSA9IDB4ODA7Ci0JCVNBVF9WID0gMHg4MDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TQVRVUkFUSU9OX0VSUk9SIENPTU1BTkRcbiIpOwotCQlicmVhazsKLQl9Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4oRW5kKVxuIiwgX19mdW5jX18pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgb3Y3NjkyX3NldF9lZmZlY3QoaW50IG1vZGUsIGludCBlZmZlY3QpCi17Ci0JaW50IHJjID0gMDsKLQlDREJHKCItLUNBTUVSQS0tICVzIC4uLihTdGFydClcbiIsIF9fZnVuY19fKTsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgU0VOU09SX1BSRVZJRVdfTU9ERToKLQkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfSEZSXzYwRlBTX01PREU6Ci0JCWJyZWFrOwotCWNhc2UgU0VOU09SX0hGUl85MEZQU19NT0RFOgotCQkvKiBDb250ZXh0IEEgU3BlY2lhbCBFZmZlY3RzICovCi0JCUNEQkcoIi1DQU1FUkEtICVzIC4uLlNFTlNPUl9QUkVWSUVXX01PREVcbiIsIF9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfU05BUFNIT1RfTU9ERToKLQkJLyogQ29udGV4dCBCIFNwZWNpYWwgRWZmZWN0cyAqLwotCQlDREJHKCItQ0FNRVJBLSAlcyAuLi5TRU5TT1JfU05BUFNIT1RfTU9ERVxuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JZWZmZWN0X3ZhbHVlID0gZWZmZWN0OwotCXN3aXRjaCAoZWZmZWN0KSB7Ci0JY2FzZSBDQU1FUkFfRUZGRUNUX09GRjogewotCQlDREJHKCItLUNBTUVSQS0tICVzIC4uLkNBTUVSQV9FRkZFQ1RfT0ZGXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcob3Y3NjkyX2VmZmVjdF9ub3JtYWxfdGJsKTsKLQkJLyogZm9yIHJlY292ZXIgc2F0dXJhdGlvbiBsZXZlbAotCQkgd2hlbiBjaGFuZ2Ugc3BlY2lhbCBlZmZlY3QqLwotCQlvdjc2OTJfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4ZGEsIFNBVF9VKTsKLQkJLyogZm9yIHJlY292ZXIgc2F0dXJhdGlvbiBsZXZlbAotCQl3aGVuIGNoYW5nZSBzcGVjaWFsIGVmZmVjdCovCi0JCW92NzY5Ml9pMmNfd3JpdGVfYl9zZW5zb3IoMHhkYiwgU0FUX1YpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBDQU1FUkFfRUZGRUNUX01PTk86IHsKLQkJQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi5DQU1FUkFfRUZGRUNUX01PTk9cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfZWZmZWN0X21vbm9fdGJsKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQ0FNRVJBX0VGRkVDVF9CVzogewotCQlDREJHKCItLUNBTUVSQS0tICVzIC4uLkNBTUVSQV9FRkZFQ1RfQldcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfZWZmZWN0X2J3X3RibCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIENBTUVSQV9FRkZFQ1RfQkxVSVNIOiB7Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uQ0FNRVJBX0VGRkVDVF9CTFVJU0hcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfZWZmZWN0X2JsdWlzaF90YmwpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBDQU1FUkFfRUZGRUNUX1NPTEFSSVpFOiB7Ci0JCUNEQkcoIiVzIC4uLkNBTUVSQV9FRkZFQ1RfTkVHQVRJVkUoTm8gU3VwcG9ydCkhXG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIENBTUVSQV9FRkZFQ1RfU0VQSUE6IHsKLQkJQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi5DQU1FUkFfRUZGRUNUX1NFUElBXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcob3Y3NjkyX2VmZmVjdF9zZXBpYV90YmwpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBDQU1FUkFfRUZGRUNUX1JFRERJU0g6IHsKLQkJQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi5DQU1FUkFfRUZGRUNUX1JFRERJU0hcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfZWZmZWN0X3JlZGRpc2hfdGJsKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQ0FNRVJBX0VGRkVDVF9HUkVFTklTSDogewotCQlDREJHKCItLUNBTUVSQS0tICVzIC4uLkNBTUVSQV9FRkZFQ1RfR1JFRU5JU0hcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfZWZmZWN0X2dyZWVuaXNoX3RibCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIENBTUVSQV9FRkZFQ1RfTkVHQVRJVkU6IHsKLQkJQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi5DQU1FUkFfRUZGRUNUX05FR0FUSVZFXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcob3Y3NjkyX2VmZmVjdF9uZWdhdGl2ZV90YmwpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDogewotCQlDREJHKCItLUNBTUVSQS0tICVzIC4uLkRlZmF1bHQoTm90IFN1cHBvcnQpXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCX0KLQlvdjc2OTJfZWZmZWN0ID0gZWZmZWN0OwotCS8qUmVmcmVzaCBTZXF1ZW5jZXIgKi8KLQlDREJHKCItLUNBTUVSQS0tICVzIC4uLihFbmQpXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92NzY5Ml9zZXRfY29udHJhc3QoaW50IGNvbnRyYXN0KQotewotCWludCByYyA9IDA7Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4oU3RhcnQpXG4iLCBfX2Z1bmNfXyk7Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi5jb250cmFzdCA9ICVkXG4iLCBfX2Z1bmNfXyAsIGNvbnRyYXN0KTsKLQotCWlmIChlZmZlY3RfdmFsdWUgPT0gQ0FNRVJBX0VGRkVDVF9PRkYpIHsKLQkJc3dpdGNoIChjb250cmFzdCkgewotCQljYXNlIENBTUVSQV9DT05UUkFTVF9MVjA6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0NPTlRSQVNUX0xWMFxuIik7Ci0JCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKG92NzY5Ml9jb250cmFzdF9sdjBfdGJsKTsKLQkJCWJyZWFrOwotCQljYXNlIENBTUVSQV9DT05UUkFTVF9MVjE6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0NPTlRSQVNUX0xWMVxuIik7Ci0JCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKG92NzY5Ml9jb250cmFzdF9sdjFfdGJsKTsKLQkJCWJyZWFrOwotCQljYXNlIENBTUVSQV9DT05UUkFTVF9MVjI6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0NPTlRSQVNUX0xWMlxuIik7Ci0JCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKG92NzY5Ml9jb250cmFzdF9sdjJfdGJsKTsKLQkJCWJyZWFrOwotCQljYXNlIENBTUVSQV9DT05UUkFTVF9MVjM6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0NPTlRSQVNUX0xWM1xuIik7Ci0JCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKG92NzY5Ml9jb250cmFzdF9sdjNfdGJsKTsKLQkJCWJyZWFrOwotCQljYXNlIENBTUVSQV9DT05UUkFTVF9MVjQ6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0NPTlRSQVNUX0xWNFxuIik7Ci0JCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKAotCQkJCW92NzY5Ml9jb250cmFzdF9kZWZhdWx0X2x2NF90YmwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNRVJBX0NPTlRSQVNUX0xWNToKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfQ09OVFJBU1RfTFY1XG4iKTsKLQkJCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcob3Y3NjkyX2NvbnRyYXN0X2x2NV90YmwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNRVJBX0NPTlRSQVNUX0xWNjoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfQ09OVFJBU1RfTFY2XG4iKTsKLQkJCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcob3Y3NjkyX2NvbnRyYXN0X2x2Nl90YmwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNRVJBX0NPTlRSQVNUX0xWNzoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfQ09OVFJBU1RfTFY3XG4iKTsKLQkJCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcob3Y3NjkyX2NvbnRyYXN0X2x2N190YmwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNRVJBX0NPTlRSQVNUX0xWODoKLQkJCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfQ09OVFJBU1RfTFY4XG4iKTsKLQkJCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcob3Y3NjkyX2NvbnRyYXN0X2x2OF90YmwpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX0NPTlRSQVNUX0VSUk9SIENPTU1BTkRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4oRW5kKVxuIiwgX19mdW5jX18pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBvdjc2OTJfc2V0X3NoYXJwbmVzcyhpbnQgc2hhcnBuZXNzKQotewotCWludCByYyA9IDA7Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4oU3RhcnQpXG4iLCBfX2Z1bmNfXyk7Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi5zaGFycG5lc3MgPSAlZFxuIiwgX19mdW5jX18gLCBzaGFycG5lc3MpOwotCi0JaWYgKGVmZmVjdF92YWx1ZSA9PSBDQU1FUkFfRUZGRUNUX09GRikgewotCQlzd2l0Y2ggKHNoYXJwbmVzcykgewotCQljYXNlIENBTUVSQV9TSEFSUE5FU1NfTFYwOgotCQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TSEFSUE5FU1NfTFYwXG4iKTsKLQkJCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcob3Y3NjkyX3NoYXJwbmVzc19sdjBfdGJsKTsKLQkJCWJyZWFrOwotCQljYXNlIENBTUVSQV9TSEFSUE5FU1NfTFYxOgotCQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TSEFSUE5FU1NfTFYxXG4iKTsKLQkJCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcob3Y3NjkyX3NoYXJwbmVzc19sdjFfdGJsKTsKLQkJCWJyZWFrOwotCQljYXNlIENBTUVSQV9TSEFSUE5FU1NfTFYyOgotCQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9TSEFSUE5FU1NfTFYyXG4iKTsKLQkJCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcoCi0JCQkJb3Y3NjkyX3NoYXJwbmVzc19kZWZhdWx0X2x2Ml90YmwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNRVJBX1NIQVJQTkVTU19MVjM6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1NIQVJQTkVTU19MVjNcbiIpOwotCQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfc2hhcnBuZXNzX2x2M190YmwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNRVJBX1NIQVJQTkVTU19MVjQ6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1NIQVJQTkVTU19MVjRcbiIpOwotCQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfc2hhcnBuZXNzX2x2NF90YmwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNRVJBX1NIQVJQTkVTU19MVjU6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1NIQVJQTkVTU19MVjVcbiIpOwotCQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfc2hhcnBuZXNzX2x2NV90YmwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FNRVJBX1NIQVJQTkVTU19MVjY6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1NIQVJQTkVTU19MVjZcbiIpOwotCQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfc2hhcnBuZXNzX2x2Nl90YmwpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlDREJHKCItLUNBTUVSQS0tQ0FNRVJBX1NIQVJQTkVTU19FUlJPUiBDT01NQU5EXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCUNEQkcoIi0tQ0FNRVJBLS0gJXMgLi4uKEVuZClcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y3NjkyX3NldF9pc28oaW50OF90IGlzb190eXBlKQotewotCWxvbmcgcmMgPSAwOwotCi0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4oU3RhcnQpXG4iLCBfX2Z1bmNfXyk7Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi5pc29fdHlwZSA9ICVkXG4iLCBfX2Z1bmNfXyAsIGlzb190eXBlKTsKLQlzd2l0Y2ggKGlzb190eXBlKSB7Ci0JY2FzZSBDQU1FUkFfSVNPX1RZUEVfQVVUTzoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9JU09fVFlQRV9BVVRPXG4iKTsKLQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfaXNvX3R5cGVfYXV0byk7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNRUFSX0lTT19UWVBFX0hKUjoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVBUl9JU09fVFlQRV9ISlJcbiIpOwotCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKG92NzY5Ml9pc29fdHlwZV9hdXRvKTsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1FQVJfSVNPX1RZUEVfMTAwOgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRUFSX0lTT19UWVBFXzEwMFxuIik7Ci0JCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcob3Y3NjkyX2lzb190eXBlXzEwMCk7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNRVJBX0lTT19UWVBFXzIwMDoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9JU09fVFlQRV8yMDBcbiIpOwotCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKG92NzY5Ml9pc29fdHlwZV8yMDApOwotCQlicmVhazsKLQljYXNlIENBTUVSQV9JU09fVFlQRV80MDA6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfSVNPX1RZUEVfNDAwXG4iKTsKLQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfaXNvX3R5cGVfNDAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1FQVJfSVNPX1RZUEVfODAwOgotCQlDREJHKCItLUNBTUVSQS0tQ0FNRUFSX0lTT19UWVBFXzgwMFxuIik7Ci0JCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcob3Y3NjkyX2lzb190eXBlXzgwMCk7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNRVJBX0lTT19UWVBFXzE2MDA6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfSVNPX1RZUEVfMTYwMFxuIik7Ci0JCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcob3Y3NjkyX2lzb190eXBlXzE2MDApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlDREJHKCItLUNBTUVSQS0tRVJST1IgSVNPIFRZUEVcbiIpOwotCQlicmVhazsKLQl9Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4oRW5kKVxuIiwgX19mdW5jX18pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBvdjc2OTJfc2V0X3diX29lbSh1aW50OF90IHBhcmFtKQotewotCWludCByYyA9IDA7Ci0JQ0RCRygiLS1DQU1FUkEtLSVzIHJ1bnNcclxuIiwgX19mdW5jX18pOwotCi0Jc3dpdGNoIChwYXJhbSkgewotCWNhc2UgQ0FNRVJBX1dCX0FVVE86Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfV0JfQVVUT1xuIik7Ci0JCXJjID0gT1Y3NjkyQ29yZV9Xcml0ZVBSRUcob3Y3NjkyX3diX2RlZik7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNRVJBX1dCX0NVU1RPTToKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9XQl9DVVNUT01cbiIpOwotCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKG92NzY5Ml93Yl9jdXN0b20pOwotCQlicmVhazsKLQljYXNlIENBTUVSQV9XQl9JTkNBTkRFU0NFTlQ6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfV0JfSU5DQU5ERVNDRU5UXG4iKTsKLQkJcmMgPSBPVjc2OTJDb3JlX1dyaXRlUFJFRyhvdjc2OTJfd2JfaW5jKTsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1FUkFfV0JfREFZTElHSFQ6Ci0JCUNEQkcoIi0tQ0FNRVJBLS1DQU1FUkFfV0JfREFZTElHSFRcbiIpOwotCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKG92NzY5Ml93Yl9kYXlsaWdodCk7Ci0JCWJyZWFrOwotCWNhc2UgQ0FNRVJBX1dCX0NMT1VEWV9EQVlMSUdIVDoKLQkJQ0RCRygiLS1DQU1FUkEtLUNBTUVSQV9XQl9DTE9VRFlfREFZTElHSFRcbiIpOwotCQlyYyA9IE9WNzY5MkNvcmVfV3JpdGVQUkVHKG92NzY5Ml93Yl9jbG91ZHkpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBvdjc2OTJfcG93ZXJfb24odm9pZCkKLXsKLQlDREJHKCIlc1xuIiwgX19mdW5jX18pOwotCWdwaW9fc2V0X3ZhbHVlKG92NzY5Ml9wd2RuX2dwaW8sIDApOwotfQotCi1zdGF0aWMgdm9pZCBvdjc2OTJfcG93ZXJfZG93bih2b2lkKQotewotCUNEQkcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JZ3Bpb19zZXRfdmFsdWUob3Y3NjkyX3B3ZG5fZ3BpbywgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG92NzY5Ml9zd19yZXNldCh2b2lkKQotewotCUNEQkcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0Jb3Y3NjkyX2kyY193cml0ZV9iX3NlbnNvcigweDEyLCAweDgwKTsKLX0KLQotc3RhdGljIHZvaWQgb3Y3NjkyX2h3X3Jlc2V0KHZvaWQpCi17Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4gKFN0YXJ0Li4uKVxuIiwgX19mdW5jX18pOwotCWdwaW9fc2V0X3ZhbHVlKG92NzY5Ml9yZXNldF9ncGlvLCAxKTsgICAvKnJlc2V0IGNhbWVyYSByZXNldCBwaW4qLwotCXVzbGVlcF9yYW5nZSg1MDAwLCA1MTAwKTsKLQlncGlvX3NldF92YWx1ZShvdjc2OTJfcmVzZXRfZ3BpbywgMCk7Ci0JdXNsZWVwX3JhbmdlKDUwMDAsIDUxMDApOwotCWdwaW9fc2V0X3ZhbHVlKG92NzY5Ml9yZXNldF9ncGlvLCAxKTsKLQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4gKEVuZC4uLilcbiIsIF9fZnVuY19fKTsKLX0KLQotCi0KLXN0YXRpYyBpbnQgb3Y3NjkyX3Byb2JlX2luaXRfc2Vuc29yKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCXVpbnQ4X3QgbW9kZWxfaWRfbXNiLCBtb2RlbF9pZF9sc2IgPSAwOwotCXVpbnQxNl90IG1vZGVsX2lkID0gMDsKLQlpbnQzMl90IHJjID0gMDsKLQkvKlRoZSByZXNldCBwaW4gaXMgbm90IHBoeXNpY2FsbHkgY29ubmVjdGVkIHRvIHRoZSBzZW5zb3IuCi0JICBUaGUgc3RhbmRieSBwaW4gd2lsbCBkbyB0aGUgcmVzZXQgaGVuY2UgdGhlcmUgaXMgbm8gbmVlZAotCSAgdG8gcmVxdWVzdCB0aGUgZ3BpbyByZXNldCovCi0KLQkvKiBSZWFkIHNlbnNvciBNb2RlbCBJRDogKi8KLQlyYyA9IG92NzY5Ml9pMmNfcmVhZChSRUdfT1Y3NjkyX01PREVMX0lEX01TQiwgJm1vZGVsX2lkX21zYiwgMSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JcmMgPSBvdjc2OTJfaTJjX3JlYWQoUkVHX09WNzY5Ml9NT0RFTF9JRF9MU0IsICZtb2RlbF9pZF9sc2IsIDEpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCW1vZGVsX2lkID0gKG1vZGVsX2lkX21zYiA8PCA4KSB8ICgobW9kZWxfaWRfbHNiICYgMHgwMEZGKSkgOwotCUNEQkcoIm92NzY5MiBtb2RlbF9pZCA9IDB4JXgsIDB4JXgsIDB4JXhcbiIsCi0JCQltb2RlbF9pZCwgbW9kZWxfaWRfbXNiLCBtb2RlbF9pZF9sc2IpOwotCS8qIDQuIENvbXBhcmUgc2Vuc29yIElEIHRvIE9WNzY5MiBJRDogKi8KLQlpZiAobW9kZWxfaWQgIT0gT1Y3NjkyX01PREVMX0lEKSB7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCWdvdG8gaW5pdF9wcm9iZV9kb25lOwotaW5pdF9wcm9iZV9mYWlsOgotCXByX3dhcm5pbmcoIiBvdjc2OTJfcHJvYmVfaW5pdF9zZW5zb3IgZmFpbHNcbiIpOwotaW5pdF9wcm9iZV9kb25lOgotCUNEQkcoIiBvdjc2OTJfcHJvYmVfaW5pdF9zZW5zb3IgZmluaXNoZXNcbiIpOwotCXJldHVybiByYzsKLX0KLQotaW50IG92NzY5Ml9zZW5zb3Jfb3Blbl9pbml0KGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JQ0RCRygiJXM6ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCUNEQkcoIkNhbGxpbmcgb3Y3NjkyX3NlbnNvcl9vcGVuX2luaXRcbiIpOwotCW92NzY5Ml9jdHJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG92NzY5Ml9jdHJsX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW92NzY5Ml9jdHJsKSB7Ci0JCUNEQkcoIm92NzY5Ml9pbml0IGZhaWxlZCFcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gaW5pdF9kb25lOwotCX0KLQlvdjc2OTJfY3RybC0+ZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQlvdjc2OTJfY3RybC0+cGljdF9mcHNfZGl2aWRlciA9IDEgKiAweDAwMDAwNDAwOwotCW92NzY5Ml9jdHJsLT5mcHMgPSAzMCAqIFE4OwotCW92NzY5Ml9jdHJsLT5zZXRfdGVzdCA9IFRFU1RfT0ZGOwotCW92NzY5Ml9jdHJsLT5wcmV2X3JlcyA9IFFUUl9TSVpFOwotCW92NzY5Ml9jdHJsLT5waWN0X3JlcyA9IEZVTExfU0laRTsKLQlvdjc2OTJfY3RybC0+Y3Vycl9yZXMgPSBJTlZBTElEX1NJWkU7Ci0KLQlpZiAoZGF0YSkKLQkJb3Y3NjkyX2N0cmwtPnNlbnNvcmRhdGEgPSBkYXRhOwotCS8qIHR1cm4gb24gTERPIGZvciBQVlQgKi8KLQlpZiAoZGF0YS0+cG1pY19ncGlvX2VuYWJsZSkKLQkJbGNkX2NhbWVyYV9wb3dlcl9vbm9mZigxKTsKLQotCS8qIGVuYWJsZSBtY2xrIGZpcnN0ICovCi0KLQltc21fY2FtaW9fY2xrX3JhdGVfc2V0KDI0MDAwMDAwKTsKLQltc2xlZXAoMjApOwotCi0Jb3Y3NjkyX3Bvd2VyX29uKCk7Ci0JdXNsZWVwX3JhbmdlKDUwMDAsIDUxMDApOwotCi0JcmMgPSBvdjc2OTJfcHJvYmVfaW5pdF9zZW5zb3IoZGF0YSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJDYWxsaW5nIG92NzY5Ml9zZW5zb3Jfb3Blbl9pbml0IGZhaWxcbiIpOwotCQlnb3RvIGluaXRfZmFpbDsKLQl9Ci0KLQlyYyA9IG92NzY5Ml9zZW5zb3Jfc2V0dGluZyhSRUdfSU5JVCwgUkVTX1BSRVZJRVcpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gaW5pdF9mYWlsOwotCWVsc2UKLQkJZ290byBpbml0X2RvbmU7Ci0KLWluaXRfZmFpbDoKLQlDREJHKCIgb3Y3NjkyX3NlbnNvcl9vcGVuX2luaXQgZmFpbFxuIik7Ci0JaWYgKGRhdGEtPnBtaWNfZ3Bpb19lbmFibGUpCi0JCWxjZF9jYW1lcmFfcG93ZXJfb25vZmYoMCk7Ci0Ja2ZyZWUob3Y3NjkyX2N0cmwpOwotaW5pdF9kb25lOgotCUNEQkcoIm92NzY5Ml9zZW5zb3Jfb3Blbl9pbml0IGRvbmVcbiIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBvdjc2OTJfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQkvKiBJbml0aWFsaXplIHRoZSBNU01fQ0FNSTJDIENoaXAgKi8KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZvdjc2OTJfd2FpdF9xdWV1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBvdjc2OTJfaTJjX2lkW10gPSB7Ci0JeyJvdjc2OTIiLCAwfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBpbnQgb3Y3NjkyX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJjID0gMDsKLQlDREJHKCJvdjc2OTJfaTJjX3Byb2JlIGNhbGxlZCFcbiIpOwotCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKLQkJQ0RCRygiaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkgZmFpbGVkXG4iKTsKLQkJZ290byBwcm9iZV9mYWlsdXJlOwotCX0KLQotCW92NzY5Ml9zZW5zb3J3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG92NzY5Ml93b3JrX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW92NzY5Ml9zZW5zb3J3KSB7Ci0JCUNEQkcoImt6YWxsb2MgZmFpbGVkLlxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBwcm9iZV9mYWlsdXJlOwotCX0KLQotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIG92NzY5Ml9zZW5zb3J3KTsKLQlvdjc2OTJfaW5pdF9jbGllbnQoY2xpZW50KTsKLQlvdjc2OTJfY2xpZW50ID0gY2xpZW50OwotCi0JQ0RCRygib3Y3NjkyX2kyY19wcm9iZSBzdWNjZXNzISByYyA9ICVkXG4iLCByYyk7Ci0JcmV0dXJuIDA7Ci0KLXByb2JlX2ZhaWx1cmU6Ci0JQ0RCRygib3Y3NjkyX2kyY19wcm9iZSBmYWlsZWQhIHJjID0gJWRcbiIsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgX19leGl0IG92NzY5Ml9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3Qgb3Y3NjkyX3dvcmtfdF90ICpzZW5zb3J3ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JZnJlZV9pcnEoY2xpZW50LT5pcnEsIHNlbnNvcncpOwotCW92NzY5Ml9jbGllbnQgPSBOVUxMOwotCWtmcmVlKHNlbnNvcncpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgb3Y3NjkyX2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gb3Y3NjkyX2kyY19pZCwKLQkucHJvYmUgID0gb3Y3NjkyX2kyY19wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3Aob3Y3NjkyX2kyY19yZW1vdmUpLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm92NzY5MiIsCi0JfSwKLX07Ci0KLWludCBvdjc2OTJfc2Vuc29yX2NvbmZpZyh2b2lkIF9fdXNlciAqYXJncCkKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhIGNkYXRhOwotCWxvbmcgICByYyA9IDA7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZjZGF0YSwKLQkJCQkodm9pZCAqKWFyZ3AsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JbXV0ZXhfbG9jaygmb3Y3NjkyX211dCk7Ci0JQ0RCRygib3Y3NjkyX3NlbnNvcl9jb25maWc6IGNmZ3R5cGUgPSAlZFxuIiwgY2RhdGEuY2ZndHlwZSk7Ci0Jc3dpdGNoIChjZGF0YS5jZmd0eXBlKSB7Ci0JY2FzZSBDRkdfU0VUX01PREU6Ci0JCXJjID0gb3Y3NjkyX3NldF9zZW5zb3JfbW9kZShjZGF0YS5tb2RlLCBjZGF0YS5ycyk7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9FRkZFQ1Q6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX1NFVF9FRkZFQ1QgbW9kZT0lZCwgZWZmZWN0ID0gJWQgISFcbiIsCi0JCQkgY2RhdGEubW9kZSwgY2RhdGEuY2ZnLmVmZmVjdCk7Ci0JCXJjID0gb3Y3NjkyX3NldF9lZmZlY3QoY2RhdGEubW9kZSwgY2RhdGEuY2ZnLmVmZmVjdCk7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NUQVJUOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19TVEFSVCAoTm90IFN1cHBvcnQpICEhXG4iKTsKLQkJLyogTm90IFN1cHBvcnQgKi8KLQkJYnJlYWs7Ci0JY2FzZSBDRkdfUFdSX1VQOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19QV1JfVVAgKE5vdCBTdXBwb3J0KSAhIVxuIik7Ci0JCS8qIE5vdCBTdXBwb3J0ICovCi0JCWJyZWFrOwotCWNhc2UgQ0ZHX1BXUl9ET1dOOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19QV1JfRE9XTiAhIVxuIik7Ci0JCW92NzY5Ml9wb3dlcl9kb3duKCk7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX1dSSVRFX0VYUE9TVVJFX0dBSU46Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX1dSSVRFX0VYUE9TVVJFX0dBSU4gKE5vdCBTdXBwb3J0KSAhIVxuIik7Ci0JCS8qIE5vdCBTdXBwb3J0ICovCi0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9ERUZBVUxUX0ZPQ1VTOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19TRVRfREVGQVVMVF9GT0NVUyAoTm90IEltcGxlbWVudCkgISFcbiIpOwotCQlicmVhazsKLQljYXNlIENGR19NT1ZFX0ZPQ1VTOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19NT1ZFX0ZPQ1VTIChOb3QgSW1wbGVtZW50KSAhIVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX1JFR0lTVEVSX1RPX1JFQUxfR0FJTjoKLQkJQ0RCRygiLS1DQU1FUkEtLSBDRkdfUkVHSVNURVJfVE9fUkVBTF9HQUlOIChOb3QgU3VwcG9ydCkgISFcbiIpOwotCQkvKiBOb3QgU3VwcG9ydCAqLwotCQlicmVhazsKLQljYXNlIENGR19SRUFMX1RPX1JFR0lTVEVSX0dBSU46Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX1JFQUxfVE9fUkVHSVNURVJfR0FJTiAoTm90IFN1cHBvcnQpICEhXG4iKTsKLQkJLyogTm90IFN1cHBvcnQgKi8KLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX0ZQUzoKLQkJQ0RCRygiLS1DQU1FUkEtLSBDRkdfU0VUX0ZQUyAoTm90IFN1cHBvcnQpICEhXG4iKTsKLQkJLyogTm90IFN1cHBvcnQgKi8KLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX1BJQ1RfRlBTOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19TRVRfUElDVF9GUFMgKE5vdCBTdXBwb3J0KSAhIVxuIik7Ci0JCS8qIE5vdCBTdXBwb3J0ICovCi0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9CUklHSFRORVNTOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19TRVRfQlJJR0hUTkVTUyAgISFcbiIpOwotCQkvKiByYyA9IG92NzY5Ml9zZXRfYnJpZ2h0bmVzcyhjZGF0YS5jZmcuYnJpZ2h0bmVzcyk7ICovCi0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9DT05UUkFTVDoKLQkJQ0RCRygiLS1DQU1FUkEtLSBDRkdfU0VUX0NPTlRSQVNUICAhIVxuIik7Ci0JCXJjID0gb3Y3NjkyX3NldF9jb250cmFzdChjZGF0YS5jZmcuY29udHJhc3QpOwotCQlicmVhazsKLQljYXNlIENGR19TRVRfWk9PTToKLQkJQ0RCRygiLS1DQU1FUkEtLSBDRkdfU0VUX1pPT00gKE5vdCBTdXBwb3J0KSAhIVxuIik7Ci0JCS8qIE5vdCBTdXBwb3J0ICovCi0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9FWFBPU1VSRV9NT0RFOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19TRVRfRVhQT1NVUkVfTU9ERSAhIVxuIik7Ci0JCS8qIHJjID0gb3Y3NjkyX3NldF9leHBvc3VyZV9tb2RlKGNkYXRhLmNmZy5hZV9tb2RlKTsgKi8KLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX1dCOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19TRVRfV0IhIVxuIik7Ci0JCW92NzY5Ml9zZXRfd2Jfb2VtKGNkYXRhLmNmZy53Yl92YWwpOwotCQlyYyA9IDAgOwotCQlicmVhazsKLQljYXNlIENGR19TRVRfQU5USUJBTkRJTkc6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX1NFVF9BTlRJQkFORElORyBhbnRpYmFuZGluZyA9ICVkICEhXG4iLAotCQkJIGNkYXRhLmNmZy5hbnRpYmFuZGluZyk7Ci0JCXJjID0gb3Y3NjkyX3NldF9hbnRpYmFuZGluZyhjZGF0YS5jZmcuYW50aWJhbmRpbmcpOwotCQlicmVhazsKLQljYXNlIENGR19TRVRfRVhQX0dBSU46Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX1NFVF9FWFBfR0FJTiAoTm90IFN1cHBvcnQpICEhXG4iKTsKLQkJLyogTm90IFN1cHBvcnQgKi8KLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX1BJQ1RfRVhQX0dBSU46Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX1NFVF9QSUNUX0VYUF9HQUlOIChOb3QgU3VwcG9ydCkgISFcbiIpOwotCQkvKiBOb3QgU3VwcG9ydCAqLwotCQlicmVhazsKLQljYXNlIENGR19TRVRfTEVOU19TSEFESU5HOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19TRVRfTEVOU19TSEFESU5HICEhXG4iKTsKLQkJLyogcmMgPSBvdjc2OTJfbGVuc19zaGFkaW5nX2VuYWJsZShjZGF0YS5jZmcubGVuc19zaGFkaW5nKTsgKi8KLQkJYnJlYWs7Ci0JY2FzZSBDRkdfR0VUX1BJQ1RfRlBTOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19HRVRfUElDVF9GUFMgKE5vdCBTdXBwb3J0KSAhIVxuIik7Ci0JCS8qIE5vdCBTdXBwb3J0ICovCi0JCWJyZWFrOwotCWNhc2UgQ0ZHX0dFVF9QUkVWX0xfUEY6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX0dFVF9QUkVWX0xfUEYgKE5vdCBTdXBwb3J0KSAhIVxuIik7Ci0JCS8qIE5vdCBTdXBwb3J0ICovCi0JCWJyZWFrOwotCWNhc2UgQ0ZHX0dFVF9QUkVWX1BfUEw6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX0dFVF9QUkVWX1BfUEwgKE5vdCBTdXBwb3J0KSAhIVxuIik7Ci0JCS8qIE5vdCBTdXBwb3J0ICovCi0JCWJyZWFrOwotCWNhc2UgQ0ZHX0dFVF9QSUNUX0xfUEY6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX0dFVF9QSUNUX0xfUEYgKE5vdCBTdXBwb3J0KSAhIVxuIik7Ci0JCS8qIE5vdCBTdXBwb3J0ICovCi0JCWJyZWFrOwotCWNhc2UgQ0ZHX0dFVF9QSUNUX1BfUEw6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX0dFVF9QSUNUX1BfUEwgKE5vdCBTdXBwb3J0KSAhIVxuIik7Ci0JCS8qIE5vdCBTdXBwb3J0ICovCi0JCWJyZWFrOwotCWNhc2UgQ0ZHX0dFVF9BRl9NQVhfU1RFUFM6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX0dFVF9BRl9NQVhfU1RFUFMgKE5vdCBTdXBwb3J0KSAhIVxuIik7Ci0JCS8qIE5vdCBTdXBwb3J0ICovCi0JCWJyZWFrOwotCWNhc2UgQ0ZHX0dFVF9QSUNUX01BWF9FWFBfTEM6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX0dFVF9QSUNUX01BWF9FWFBfTEMgKE5vdCBTdXBwb3J0KSAhIVxuIik7Ci0JCS8qIE5vdCBTdXBwb3J0ICovCi0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NFTkRfV0JfSU5GTzoKLQkJQ0RCRygiLS1DQU1FUkEtLSBDRkdfU0VORF9XQl9JTkZPIChOb3QgU3VwcG9ydCkgISFcbiIpOwotCQkvKiBOb3QgU3VwcG9ydCAqLwotCQlicmVhazsKLQljYXNlIENGR19TRU5TT1JfSU5JVDoKLQkJQ0RCRygiLS1DQU1FUkEtLSBDRkdfU0VOU09SX0lOSVQgKE5vdCBTdXBwb3J0KSAhIVxuIik7Ci0JCS8qIE5vdCBTdXBwb3J0ICovCi0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9TQVRVUkFUSU9OOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19TRVRfU0FUVVJBVElPTiAhIVxuIik7Ci0JCXJjID0gb3Y3NjkyX3NldF9zYXR1cmF0aW9uKGNkYXRhLmNmZy5zYXR1cmF0aW9uKTsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX1NIQVJQTkVTUzoKLQkJQ0RCRygiLS1DQU1FUkEtLSBDRkdfU0VUX1NIQVJQTkVTUyAhIVxuIik7Ci0JCXJjID0gb3Y3NjkyX3NldF9zaGFycG5lc3MoY2RhdGEuY2ZnLnNoYXJwbmVzcyk7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9UT1VDSEFFQzoKLQkJQ0RCRygiLS1DQU1FUkEtLSBDRkdfU0VUX1RPVUNIQUVDISFcbiIpOwotCQkvKiBvdjc2OTJfc2V0X3RvdWNoYWVjKGNkYXRhLmNmZy5hZWNfY29yZC54LAotCQkJIGNkYXRhLmNmZy5hZWNfY29yZC55KTsgKi8KLQkJcmMgPSAwIDsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX0FVVE9fRk9DVVM6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gQ0ZHX1NFVF9BVVRPX0ZPQ1VTIChOb3QgU3VwcG9ydCkgISFcbiIpOwotCQkvKiBOb3QgU3VwcG9ydCAqLwotCQlicmVhazsKLQljYXNlIENGR19TRVRfQVVUT0ZMQVNIOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19TRVRfQVVUT0ZMQVNIIChOb3QgU3VwcG9ydCkgISFcbiIpOwotCQkvKiBOb3QgU3VwcG9ydCAqLwotCQlicmVhazsKLQljYXNlIENGR19TRVRfRVhQT1NVUkVfQ09NUEVOU0FUSU9OOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19TRVRfRVhQT1NVUkVfQ09NUEVOU0FUSU9OICFcbiIpOwotCQlyYyA9IG92NzY5Ml9zZXRfZXhwb3N1cmVfY29tcGVuc2F0aW9uKAotCQkJY2RhdGEuY2ZnLmV4cF9jb21wZW5zYXRpb24pOwotCQlicmVhazsKLQljYXNlIENGR19TRVRfSVNPOgotCQlDREJHKCItLUNBTUVSQS0tIENGR19TRVRfSVNPICFcbiIpOwotCQlyYyA9IG92NzY5Ml9zZXRfaXNvKGNkYXRhLmNmZy5pc29fdHlwZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUNEQkcoIi0tQ0FNRVJBLS0gJXM6IENvbW1hbmQ9JWQgKE5vdCBJbXBsZW1lbnQpICEhXG4iLAotCQkJIF9fZnVuY19fLCBjZGF0YS5jZmd0eXBlKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0KLQltdXRleF91bmxvY2soJm92NzY5Ml9tdXQpOwotCi0JcmV0dXJuIHJjOwotfQotc3RhdGljIGludCBvdjc2OTJfc2Vuc29yX3JlbGVhc2Uodm9pZCkKLXsKLQlpbnQgcmMgPSAtRUJBREY7Ci0KLQltdXRleF9sb2NrKCZvdjc2OTJfbXV0KTsKLQlvdjc2OTJfc3dfcmVzZXQoKTsKLQlvdjc2OTJfcG93ZXJfZG93bigpOwotCWtmcmVlKG92NzY5Ml9jdHJsKTsKLQlvdjc2OTJfY3RybCA9IE5VTEw7Ci0JQ0RCRygib3Y3NjkyX3JlbGVhc2UgY29tcGxldGVkXG4iKTsKLQltdXRleF91bmxvY2soJm92NzY5Ml9tdXQpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92NzY5Ml9wcm9iZV9pbml0X2dwaW8oY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JaW50IHJjID0gMDsKLQotCW92NzY5Ml9wd2RuX2dwaW8gPSBkYXRhLT5zZW5zb3JfcHdkOwotCW92NzY5Ml9yZXNldF9ncGlvID0gZGF0YS0+c2Vuc29yX3Jlc2V0IDsKLQotCWlmIChkYXRhLT5zZW5zb3JfcmVzZXRfZW5hYmxlKQotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+c2Vuc29yX3Jlc2V0LCAxKTsKLQotCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5zZW5zb3JfcHdkLCAxKTsKLQotCXJldHVybiByYzsKLQotfQotCi0KLXN0YXRpYyBpbnQgb3Y3NjkyX3NlbnNvcl9wcm9iZShjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqaW5mbywKLQkJc3RydWN0IG1zbV9zZW5zb3JfY3RybCAqcykKLXsKLQlpbnQgcmMgPSAwOwotCXJjID0gaTJjX2FkZF9kcml2ZXIoJm92NzY5Ml9pMmNfZHJpdmVyKTsKLQlpZiAocmMgPCAwIHx8IG92NzY5Ml9jbGllbnQgPT0gTlVMTCkgewotCQlyYyA9IC1FTk9UU1VQUDsKLQkJZ290byBwcm9iZV9mYWlsOwotCX0KLQlwcl9kZWJ1ZygiJXM6ICVkIEVudGVyZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmMgPSBvdjc2OTJfcHJvYmVfaW5pdF9ncGlvKGluZm8pOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiJXM6IGdwaW8gaW5pdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBwcm9iZV9mYWlsOwotCX0KLQkvKiB0dXJuIG9uIExETyBmb3IgUFZUICovCi0JaWYgKGluZm8tPnBtaWNfZ3Bpb19lbmFibGUpCi0JCWxjZF9jYW1lcmFfcG93ZXJfb25vZmYoMSk7Ci0KLQlvdjc2OTJfcG93ZXJfZG93bigpOwotCi0JbXNtX2NhbWlvX2Nsa19yYXRlX3NldCgyNDAwMDAwMCk7Ci0JdXNsZWVwX3JhbmdlKDUwMDAsIDUxMDApOwotCi0Jb3Y3NjkyX3Bvd2VyX29uKCk7Ci0JdXNsZWVwX3JhbmdlKDUwMDAsIDUxMDApOwotCi0JaWYgKGluZm8tPnNlbnNvcl9yZXNldF9lbmFibGUpCi0JCW92NzY5Ml9od19yZXNldCgpOwotCWVsc2UKLQkJb3Y3NjkyX3N3X3Jlc2V0KCk7Ci0KLQlyYyA9IG92NzY5Ml9wcm9iZV9pbml0X3NlbnNvcihpbmZvKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIHByb2JlX2ZhaWw7Ci0KLQotCXMtPnNfaW5pdCA9IG92NzY5Ml9zZW5zb3Jfb3Blbl9pbml0OwotCXMtPnNfcmVsZWFzZSA9IG92NzY5Ml9zZW5zb3JfcmVsZWFzZTsKLQlzLT5zX2NvbmZpZyAgPSBvdjc2OTJfc2Vuc29yX2NvbmZpZzsKLQlzLT5zX2NhbWVyYV90eXBlID0gRlJPTlRfQ0FNRVJBXzJEOwotCXMtPnNfbW91bnRfYW5nbGUgPSBpbmZvLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+bW91bnRfYW5nbGU7Ci0KLQkvKiBvdjc2OTJfc3dfcmVzZXQoKTsgKi8KLQlvdjc2OTJfcG93ZXJfZG93bigpOwotCi0JaWYgKGluZm8tPnBtaWNfZ3Bpb19lbmFibGUpCi0JCWxjZF9jYW1lcmFfcG93ZXJfb25vZmYoMCk7Ci0KLQlyZXR1cm4gcmM7Ci0KLXByb2JlX2ZhaWw6Ci0JQ0RCRygib3Y3NjkyX3NlbnNvcl9wcm9iZTogU0VOU09SIFBST0JFIEZBSUxTIVxuIik7Ci0JaWYgKGluZm8tPnBtaWNfZ3Bpb19lbmFibGUpCi0JCWxjZF9jYW1lcmFfcG93ZXJfb25vZmYoMCk7Ci0JaTJjX2RlbF9kcml2ZXIoJm92NzY5Ml9pMmNfZHJpdmVyKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgX19vdjc2OTJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gbXNtX2NhbWVyYV9kcnZfc3RhcnQocGRldiwgb3Y3NjkyX3NlbnNvcl9wcm9iZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9jYW1lcmFfZHJpdmVyID0gewotCS5wcm9iZSA9IF9fb3Y3NjkyX3Byb2JlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm1zbV9jYW1lcmFfb3Y3NjkyIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG92NzY5Ml9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX2NhbWVyYV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChvdjc2OTJfaW5pdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiT01OSSBWR0EgWVVWIHNlbnNvciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9vdjk3MjYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9vdjk3MjYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZhMDg0Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvb3Y5NzI2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTQgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2NhbWVyYS5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSAib3Y5NzI2LmgiCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVNFTlNPUiBSRUdJU1RFUiBERUZJTkVTCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0jZGVmaW5lIE9WOTcyNl9ROAkJCQkweDAwMDAwMTAwCi0jZGVmaW5lIE9WOTcyNl9ROFNoaWZ0CQkJCTgKLSNkZWZpbmUgT1Y5NzI2X1ExMAkJCQkweDAwMDAwNDAwCi0jZGVmaW5lIE9WOTcyNl9RMTBTaGlmdAkJCQkxMAotCi0vKiBPbW5pdmlzaW9uODgxMCBwcm9kdWN0IElEIHJlZ2lzdGVyIGFkZHJlc3MgKi8KLSNkZWZpbmUJT1Y5NzI2X1BJREhfUkVHCQkJCTB4MDAwMAotI2RlZmluZQlPVjk3MjZfUElETF9SRUcJCQkJMHgwMDAxCi0vKiBPbW5pdmlzaW9uODgxMCBwcm9kdWN0IElEICovCi0jZGVmaW5lCU9WOTcyNl9QSUQJCQkJMHg5NwotLyogT21uaXZpc2lvbjg4MTAgdmVyc2lvbiAqLwotI2RlZmluZQlPVjk3MjZfVkVSCQkJCTB4MjYKLS8qIFRpbWUgaW4gbWlsaXNlY3MgZm9yIHdhaXRpbmcgZm9yIHRoZSBzZW5zb3IgdG8gcmVzZXQgKi8KLSNkZWZpbmUJT1Y5NzI2X1JFU0VUX0RFTEFZX01TRUNTCQk2NgotI2RlZmluZQlPVjk3MjZfREVGQVVMVF9DTE9DS19SQVRFCQkyNDAwMDAwMAotLyogUmVnaXN0ZXJzKi8KLSNkZWZpbmUJT1Y5NzI2X0dBSU4JCQkJMHgzMDAwCi0jZGVmaW5lCU9WOTcyNl9BRUNfTVNCCQkJCTB4MzAwMgotI2RlZmluZQlPVjk3MjZfQUVDX0xTQgkJCQkweDMwMDMKLQotLyogQ29sb3IgYmFyIHBhdHRlcm4gc2VsZWN0aW9uICovCi0jZGVmaW5lIE9WOTcyNl9DT0xPUl9CQVJfUEFUVEVSTl9TRUxfUkVHCTB4NjAwCi0vKiBDb2xvciBiYXIgZW5hYmxpbmcgY29udHJvbCAqLwotI2RlZmluZSBPVjk3MjZfQ09MT1JfQkFSX0VOQUJMRV9SRUcJCTB4NjAxCi0vKiBUaW1lIGluIG1pbGlzZWNzIGZvciB3YWl0aW5nIGZvciB0aGUgc2Vuc29yIHRvIHJlc2V0Ki8KLSNkZWZpbmUgT1Y5NzI2X1JFU0VUX0RFTEFZX01TRUNTCQk2NgotLyogSTJDIEFkZHJlc3Mgb2YgdGhlIFNlbnNvciAqLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCURBVEEgREVDTEFSQVRJT05TCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLSNkZWZpbmUgT1Y5NzI2X0ZVTExfU0laRV9EVU1NWV9QSVhFTFMJCTAKLSNkZWZpbmUgT1Y5NzI2X0ZVTExfU0laRV9EVU1NWV9MSU5FUwkJMAotI2RlZmluZSBPVjk3MjZfUVRSX1NJWkVfRFVNTVlfUElYRUxTCQkwCi0jZGVmaW5lIE9WOTcyNl9RVFJfU0laRV9EVU1NWV9MSU5FUwkJMAotCi0jZGVmaW5lIE9WOTcyNl9GVUxMX1NJWkVfV0lEVEgJCQkxMjk2Ci0jZGVmaW5lIE9WOTcyNl9GVUxMX1NJWkVfSEVJR0hUCQkJODA4Ci0KLSNkZWZpbmUgT1Y5NzI2X1FUUl9TSVpFX1dJRFRICQkJMTI5NgotI2RlZmluZSBPVjk3MjZfUVRSX1NJWkVfSEVJR0hUCQkJODA4Ci0KLSNkZWZpbmUgT1Y5NzI2X0hSWl9GVUxMX0JMS19QSVhFTFMJCTM2OAotI2RlZmluZSBPVjk3MjZfVkVSX0ZVTExfQkxLX0xJTkVTCQkzMgotI2RlZmluZSBPVjk3MjZfSFJaX1FUUl9CTEtfUElYRUxTCQkzNjgKLSNkZWZpbmUgT1Y5NzI2X1ZFUl9RVFJfQkxLX0xJTkVTCQkzMgotCi0jZGVmaW5lIE9WOTcyNl9NU0JfTUFTSwkJCTB4RkYwMAotI2RlZmluZSBPVjk3MjZfTFNCX01BU0sJCQkweDAwRkYKLQotc3RydWN0IG92OTcyNl93b3JrX3QgewotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotfTsKLXN0YXRpYyBzdHJ1Y3Qgb3Y5NzI2X3dvcmtfdCAqb3Y5NzI2X3NlbnNvcnc7Ci1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKm92OTcyNl9jbGllbnQ7Ci1zdHJ1Y3Qgb3Y5NzI2X2N0cmxfdCB7Ci0JY29uc3Qgc3RydWN0ICBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzZW5zb3JkYXRhOwotCXVpbnQzMl90IHNlbnNvcm1vZGU7Ci0JdWludDMyX3QgZnBzX2RpdmlkZXI7CQkvKiBpbml0IHRvIDEgKiAweDAwMDAwNDAwICovCi0JdWludDMyX3QgcGljdF9mcHNfZGl2aWRlcjsJLyogaW5pdCB0byAxICogMHgwMDAwMDQwMCAqLwotCXVpbnQxNl90IGZwczsKLQlpbnQxNl90IGN1cnJfbGVuc19wb3M7Ci0JdWludDE2X3QgY3Vycl9zdGVwX3BvczsKLQl1aW50MTZfdCBteV9yZWdfZ2FpbjsKLQl1aW50MzJfdCBteV9yZWdfbGluZV9jb3VudDsKLQl1aW50MTZfdCB0b3RhbF9saW5lc19wZXJfZnJhbWU7Ci0JZW51bSBvdjk3MjZfcmVzb2x1dGlvbl90IHByZXZfcmVzOwotCWVudW0gb3Y5NzI2X3Jlc29sdXRpb25fdCBwaWN0X3JlczsKLQllbnVtIG92OTcyNl9yZXNvbHV0aW9uX3QgY3Vycl9yZXM7Ci0JZW51bSBvdjk3MjZfdGVzdF9tb2RlX3QgIHNldF90ZXN0OwotCXVuc2lnbmVkIHNob3J0IGltZ2FkZHI7Ci19Owotc3RhdGljIHN0cnVjdCBvdjk3MjZfY3RybF90ICpvdjk3MjZfY3RybDsKLXN0YXRpYyBpbnQ4X3QgY29uZmlnX25vdF9zZXQgPSAxOwotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKG92OTcyNl93YWl0X3F1ZXVlKTsKLURFRklORV9NVVRFWChvdjk3MjZfbXV0KTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyBpbnQgb3Y5NzI2X2kyY19yeGRhdGEodW5zaWduZWQgc2hvcnQgc2FkZHIsCi0JdW5zaWduZWQgY2hhciAqcnhkYXRhLCBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKLQl7Ci0JCS5hZGRyICA9IHNhZGRyLAotCQkuZmxhZ3MgPSAwLAotCQkubGVuICAgPSAyLAotCQkuYnVmICAgPSByeGRhdGEsCi0JfSwKLQl7Ci0JCS5hZGRyICA9IHNhZGRyLAotCQkuZmxhZ3MgPSBJMkNfTV9SRCwKLQkJLmxlbiAgID0gbGVuZ3RoLAotCQkuYnVmICAgPSByeGRhdGEsCi0JfSwKLQl9OwotCi0JaWYgKGkyY190cmFuc2Zlcihvdjk3MjZfY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAyKSA8IDApIHsKLQkJQ0RCRygib3Y5NzI2X2kyY19yeGRhdGEgZmFpbGVkIVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCBvdjk3MjZfaTJjX3R4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQkJCQl1bnNpZ25lZCBjaGFyICp0eGRhdGEsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGkyY19tc2cgbXNnW10gPSB7Ci0JCXsKLQkJIC5hZGRyID0gc2FkZHIgLAotCQkgLmZsYWdzID0gMCwKLQkJIC5sZW4gPSBsZW5ndGgsCi0JCSAuYnVmID0gdHhkYXRhLAotCQkgfSwKLQl9OwotCi0JaWYgKGkyY190cmFuc2Zlcihvdjk3MjZfY2xpZW50LT5hZGFwdGVyLCBtc2csIDEpIDwgMCkgewotCQlDREJHKCJvdjk3MjZfaTJjX3R4ZGF0YSBmYWlsZCAweCV4XG4iLCBvdjk3MjZfY2xpZW50LT5hZGRyKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG92OTcyNl9pMmNfcmVhZCh1bnNpZ25lZCBzaG9ydCByYWRkciwKLQkJCQl1bnNpZ25lZCBzaG9ydCAqcmRhdGEsIGludCBybGVuKQotewotCWludDMyX3QgcmMgPSAwOwotCXVuc2lnbmVkIGNoYXIgYnVmWzJdOwotCi0JaWYgKCFyZGF0YSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlidWZbMF0gPSAocmFkZHIgJiBPVjk3MjZfTVNCX01BU0spID4+IDg7Ci0JYnVmWzFdID0gKHJhZGRyICYgT1Y5NzI2X0xTQl9NQVNLKTsKLQotCXJjID0gb3Y5NzI2X2kyY19yeGRhdGEob3Y5NzI2X2NsaWVudC0+YWRkciwgYnVmLCBybGVuKTsKLQotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygib3Y5NzI2X2kyY19yZWFkIDB4JXggZmFpbGVkIVxuIiwgcmFkZHIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JKnJkYXRhID0gKHJsZW4gPT0gMiA/IGJ1ZlswXSA8PCA4IHwgYnVmWzFdIDogYnVmWzBdKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG92OTcyNl9pMmNfd3JpdGVfYih1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQl1bnNpZ25lZCBzaG9ydCB3YWRkciwgdWludDhfdCBiZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gLUVGQVVMVDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlszXTsKLQotCWJ1ZlswXSA9ICh3YWRkciAmIE9WOTcyNl9NU0JfTUFTSykgPj4gODsKLQlidWZbMV0gPSAod2FkZHIgJiBPVjk3MjZfTFNCX01BU0spOwotCWJ1ZlsyXSA9IGJkYXRhOwotCi0JQ0RCRygiaTJjX3dyaXRlX2IgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXhkXG4iLCB3YWRkciwgYmRhdGEpOwotCXJjID0gb3Y5NzI2X2kyY190eGRhdGEoc2FkZHIsIGJ1ZiwgMyk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoImkyY193cml0ZV9iIGZhaWxlZCwgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXghXG4iLAotCQkJIHdhZGRyLCBiZGF0YSk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBvdjk3MjZfZ2V0X3BpY3RfZnBzKHVpbnQxNl90IGZwcywgdWludDE2X3QgKnBmcHMpCi17Ci0JdWludDMyX3QgZGl2aWRlcjsJLypRMTAgKi8KLQl1aW50MzJfdCBkMTsKLQl1aW50MzJfdCBkMjsKLQl1aW50MTZfdCBzbmFwc2hvdF9oZWlnaHQsIHByZXZpZXdfaGVpZ2h0LCBwcmV2aWV3X3dpZHRoLCBzbmFwc2hvdF93aWR0aDsKLQlpZiAob3Y5NzI2X2N0cmwtPnByZXZfcmVzID09IFFUUl9TSVpFKSB7Ci0JCXByZXZpZXdfd2lkdGggPSBPVjk3MjZfUVRSX1NJWkVfV0lEVEggKwotCQkJT1Y5NzI2X0hSWl9RVFJfQkxLX1BJWEVMUyA7Ci0JCXByZXZpZXdfaGVpZ2h0ID0gT1Y5NzI2X1FUUl9TSVpFX0hFSUdIVCArCi0JCQlPVjk3MjZfVkVSX1FUUl9CTEtfTElORVMgOwotCX0gZWxzZSB7Ci0JCS8qIGZ1bGwgc2l6ZSByZXNvbHV0aW9uIHVzZWQgZm9yIHByZXZpZXcuICovCi0JCXByZXZpZXdfd2lkdGggPSBPVjk3MjZfRlVMTF9TSVpFX1dJRFRIICsKLQkJCU9WOTcyNl9IUlpfRlVMTF9CTEtfUElYRUxTIDsKLQkJcHJldmlld19oZWlnaHQgPSBPVjk3MjZfRlVMTF9TSVpFX0hFSUdIVCArCi0JCQlPVjk3MjZfVkVSX0ZVTExfQkxLX0xJTkVTIDsKLQl9Ci0JaWYgKG92OTcyNl9jdHJsLT5waWN0X3JlcyA9PSBRVFJfU0laRSkgewotCQlzbmFwc2hvdF93aWR0aCAgPSBPVjk3MjZfUVRSX1NJWkVfV0lEVEggKwotCQkJT1Y5NzI2X0hSWl9RVFJfQkxLX1BJWEVMUyA7Ci0JCXNuYXBzaG90X2hlaWdodCA9IE9WOTcyNl9RVFJfU0laRV9IRUlHSFQgKwotCQkJT1Y5NzI2X1ZFUl9RVFJfQkxLX0xJTkVTIDsKLQl9IGVsc2UgewotCQlzbmFwc2hvdF93aWR0aCAgPSBPVjk3MjZfRlVMTF9TSVpFX1dJRFRIICsKLQkJCU9WOTcyNl9IUlpfRlVMTF9CTEtfUElYRUxTOwotCQlzbmFwc2hvdF9oZWlnaHQgPSBPVjk3MjZfRlVMTF9TSVpFX0hFSUdIVCArCi0JCQlPVjk3MjZfVkVSX0ZVTExfQkxLX0xJTkVTOwotCX0KLQotCWQxID0gKHVpbnQzMl90KSgoKHVpbnQzMl90KXByZXZpZXdfaGVpZ2h0IDw8Ci0JCU9WOTcyNl9RMTBTaGlmdCkgLwotCQlzbmFwc2hvdF9oZWlnaHQpOwotCi0JZDIgPSAodWludDMyX3QpKCgodWludDMyX3QpcHJldmlld193aWR0aCA8PAotCQlPVjk3MjZfUTEwU2hpZnQpIC8KLQkJIHNuYXBzaG90X3dpZHRoKTsKLQotCWRpdmlkZXIgPSAodWludDMyX3QpIChkMSAqIGQyKSA+PiBPVjk3MjZfUTEwU2hpZnQ7Ci0JKnBmcHMgPSAodWludDE2X3QpKCh1aW50MzJfdCkoZnBzICogZGl2aWRlcikgPj4gT1Y5NzI2X1ExMFNoaWZ0KTsKLX0KLQotc3RhdGljIHVpbnQxNl90IG92OTcyNl9nZXRfcHJldl9saW5lc19wZih2b2lkKQotewotCWlmIChvdjk3MjZfY3RybC0+cHJldl9yZXMgPT0gUVRSX1NJWkUpCi0JCXJldHVybiBPVjk3MjZfUVRSX1NJWkVfSEVJR0hUICsgT1Y5NzI2X1ZFUl9RVFJfQkxLX0xJTkVTOwotCWVsc2UKLQkJcmV0dXJuIE9WOTcyNl9GVUxMX1NJWkVfSEVJR0hUICsgT1Y5NzI2X1ZFUl9GVUxMX0JMS19MSU5FUzsKLX0KLQotc3RhdGljIHVpbnQxNl90IG92OTcyNl9nZXRfcHJldl9waXhlbHNfcGwodm9pZCkKLXsKLQlpZiAob3Y5NzI2X2N0cmwtPnByZXZfcmVzID09IFFUUl9TSVpFKQotCQlyZXR1cm4gT1Y5NzI2X1FUUl9TSVpFX1dJRFRIICsgT1Y5NzI2X0hSWl9RVFJfQkxLX1BJWEVMUzsKLQllbHNlCi0JCXJldHVybiBPVjk3MjZfRlVMTF9TSVpFX1dJRFRIICsgT1Y5NzI2X0hSWl9GVUxMX0JMS19QSVhFTFM7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBvdjk3MjZfZ2V0X3BpY3RfbGluZXNfcGYodm9pZCkKLXsKLQlpZiAob3Y5NzI2X2N0cmwtPnBpY3RfcmVzID09IFFUUl9TSVpFKQotCQlyZXR1cm4gT1Y5NzI2X1FUUl9TSVpFX0hFSUdIVCArIE9WOTcyNl9WRVJfUVRSX0JMS19MSU5FUzsKLQllbHNlCi0JCXJldHVybiBPVjk3MjZfRlVMTF9TSVpFX0hFSUdIVCArIE9WOTcyNl9WRVJfRlVMTF9CTEtfTElORVM7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBvdjk3MjZfZ2V0X3BpY3RfcGl4ZWxzX3BsKHZvaWQpCi17Ci0JaWYgKG92OTcyNl9jdHJsLT5waWN0X3JlcyA9PSBRVFJfU0laRSkKLQkJcmV0dXJuIE9WOTcyNl9RVFJfU0laRV9XSURUSCArIE9WOTcyNl9IUlpfUVRSX0JMS19QSVhFTFM7Ci0JZWxzZQotCQlyZXR1cm4gT1Y5NzI2X0ZVTExfU0laRV9XSURUSCArIE9WOTcyNl9IUlpfRlVMTF9CTEtfUElYRUxTOwotfQotCi1zdGF0aWMgdWludDMyX3Qgb3Y5NzI2X2dldF9waWN0X21heF9leHBfbGModm9pZCkKLXsKLQlpZiAob3Y5NzI2X2N0cmwtPnBpY3RfcmVzID09IFFUUl9TSVpFKQotCQlyZXR1cm4gKE9WOTcyNl9RVFJfU0laRV9IRUlHSFQgKyBPVjk3MjZfVkVSX1FUUl9CTEtfTElORVMpKjI0OwotCWVsc2UKLQkJcmV0dXJuIChPVjk3MjZfRlVMTF9TSVpFX0hFSUdIVCArIE9WOTcyNl9WRVJfRlVMTF9CTEtfTElORVMpKjI0OwotfQotCi1zdGF0aWMgaW50MzJfdCBvdjk3MjZfc2V0X2ZwcyhzdHJ1Y3QgZnBzX2NmZwkqZnBzKQotewotCWludDMyX3QgcmMgPSAwOwotCUNEQkcoIiVzOiBmcHMtPmZwc19kaXYgPSAlZFxuIiwgX19mdW5jX18sIGZwcy0+ZnBzX2Rpdik7Ci0JLyogVE9ETzogUGFzc2luZyBvZiBmcHNfZGl2aWRlciBmcm9tIHVzZXIgc3BhY2UgaGFzIGlzc3Vlcy4gKi8KLQkvKiBvdjk3MjZfY3RybC0+ZnBzX2RpdmlkZXIgPSBmcHMtPmZwc19kaXY7ICovCi0Jb3Y5NzI2X2N0cmwtPmZwc19kaXZpZGVyID0gMSAqIDB4NDAwOwotCUNEQkcoIiVzOiBvdjk3MjZfY3RybC0+ZnBzX2RpdmlkZXIgPSAlZFxuIiwgX19mdW5jX18sCi0JCW92OTcyNl9jdHJsLT5mcHNfZGl2aWRlcik7Ci0Jb3Y5NzI2X2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIgPSBmcHMtPnBpY3RfZnBzX2RpdjsKLQlvdjk3MjZfY3RybC0+ZnBzID0gZnBzLT5mX211bHQ7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBvdjk3MjZfd3JpdGVfZXhwX2dhaW4odWludDE2X3QgZ2FpbiwgdWludDMyX3QgbGluZSkKLXsKLQlzdGF0aWMgdWludDE2X3QgbWF4X2xlZ2FsX2dhaW4gPSAweDAwRkY7Ci0JdWludDhfdCBnYWluX21zYiwgZ2Fpbl9sc2I7Ci0JdWludDhfdCBpbnRnX3RpbWVfbXNiLCBpbnRnX3RpbWVfbHNiOwotCXVpbnQ4X3Qgb3Y5NzI2X29mZnNldCA9IDY7Ci0JdWludDhfdCBsaW5lX2xlbmd0aF9wY2tfbXNiLCBsaW5lX2xlbmd0aF9wY2tfbHNiOwotCXVpbnQxNl90IGxpbmVfbGVuZ3RoX3BjaywgZnJhbWVfbGVuZ3RoX2xpbmVzOwotCXVpbnQzMl90IGxpbmVfbGVuZ3RoX3JhdGlvID0gMSA8PCBPVjk3MjZfUThTaGlmdDsKLQlpbnQzMl90IHJjID0gLTE7Ci0JQ0RCRygiJXM6IGdhaW4gPSAlZAlsaW5lID0gJWQiLCBfX2Z1bmNfXywgZ2FpbiwgbGluZSk7Ci0KLQlpZiAob3Y5NzI2X2N0cmwtPnNlbnNvcm1vZGUgIT0gU0VOU09SX1NOQVBTSE9UX01PREUpIHsKLQkJaWYgKG92OTcyNl9jdHJsLT5jdXJyX3JlcyA9PSBRVFJfU0laRSkgewotCQkJZnJhbWVfbGVuZ3RoX2xpbmVzID0gT1Y5NzI2X1FUUl9TSVpFX0hFSUdIVCArCi0JCQkgT1Y5NzI2X1ZFUl9RVFJfQkxLX0xJTkVTOwotCQkJbGluZV9sZW5ndGhfcGNrID0gT1Y5NzI2X1FUUl9TSVpFX1dJRFRICSsKLQkJCSBPVjk3MjZfSFJaX1FUUl9CTEtfUElYRUxTOwotCQl9IGVsc2UgewotCQkJZnJhbWVfbGVuZ3RoX2xpbmVzID0gT1Y5NzI2X0ZVTExfU0laRV9IRUlHSFQgKwotCQkJCU9WOTcyNl9WRVJfRlVMTF9CTEtfTElORVM7Ci0JCQlsaW5lX2xlbmd0aF9wY2sgPSBPVjk3MjZfRlVMTF9TSVpFX1dJRFRIICsKLQkJCQlPVjk3MjZfSFJaX0ZVTExfQkxLX1BJWEVMUzsKLQkJfQotCQlpZiAobGluZSA+IChmcmFtZV9sZW5ndGhfbGluZXMgLSBvdjk3MjZfb2Zmc2V0KSkKLQkJCW92OTcyNl9jdHJsLT5mcHMgPSAodWludDE2X3QpICgoKHVpbnQzMl90KTMwIDw8Ci0JCQkJT1Y5NzI2X1E4U2hpZnQpICoKLQkJCQkoZnJhbWVfbGVuZ3RoX2xpbmVzIC0gb3Y5NzI2X29mZnNldCkgLyBsaW5lKTsKLQkJZWxzZQotCQkJb3Y5NzI2X2N0cmwtPmZwcyA9ICh1aW50MTZfdCkgKCh1aW50MzJfdCkzMCA8PAotCQkJCU9WOTcyNl9ROFNoaWZ0KTsKLQl9IGVsc2UgewotCQlmcmFtZV9sZW5ndGhfbGluZXMgPSBPVjk3MjZfRlVMTF9TSVpFX0hFSUdIVCArCi0JCQlPVjk3MjZfVkVSX0ZVTExfQkxLX0xJTkVTOwotCQlsaW5lX2xlbmd0aF9wY2sgPSBPVjk3MjZfRlVMTF9TSVpFX1dJRFRIICsKLQkJCU9WOTcyNl9IUlpfRlVMTF9CTEtfUElYRUxTOwotCX0KLQotCWlmIChvdjk3MjZfY3RybC0+c2Vuc29ybW9kZSAhPSBTRU5TT1JfU05BUFNIT1RfTU9ERSkgewotCQlsaW5lID0gKHVpbnQzMl90KSAobGluZSAqIG92OTcyNl9jdHJsLT5mcHNfZGl2aWRlcikgPj4KLQkJCU9WOTcyNl9RMTBTaGlmdDsKLQl9IGVsc2UgewotCQlsaW5lID0gKHVpbnQzMl90KSAobGluZSAqIG92OTcyNl9jdHJsLT5waWN0X2Zwc19kaXZpZGVyKSA+PgotCQkJT1Y5NzI2X1ExMFNoaWZ0OwotCX0KLQotCS8qIGNhbGN1bGF0ZSBsaW5lX2xlbmd0aF9yYXRpbyAqLwotCWlmIChsaW5lID4gKGZyYW1lX2xlbmd0aF9saW5lcyAtIG92OTcyNl9vZmZzZXQpKSB7Ci0JCWxpbmVfbGVuZ3RoX3JhdGlvID0gKGxpbmUgPDwgT1Y5NzI2X1E4U2hpZnQpIC8KLQkJCShmcmFtZV9sZW5ndGhfbGluZXMgLSBvdjk3MjZfb2Zmc2V0KTsKLQkJbGluZSA9IGZyYW1lX2xlbmd0aF9saW5lcyAtIG92OTcyNl9vZmZzZXQ7Ci0JfSBlbHNlCi0JCWxpbmVfbGVuZ3RoX3JhdGlvID0gKHVpbnQzMl90KTEgPDwgT1Y5NzI2X1E4U2hpZnQ7Ci0KLQlpZiAoZ2FpbiA+IG1heF9sZWdhbF9nYWluKSB7Ci0JCS8qIHJhbmdlOgkwCXRvIDIyNCAqLwotCQlnYWluID0gbWF4X2xlZ2FsX2dhaW47Ci0JfQotCS8qIHVwZGF0ZQlnYWluIHJlZ2lzdGVycyAqLwotCWdhaW5fbXNiID0gKHVpbnQ4X3QpICgoZ2FpbiAmIDB4RkYwMCkgPj4gOCk7Ci0JZ2Fpbl9sc2IgPSAodWludDhfdCkgKGdhaW4gJiAweDAwRkYpOwotCS8qIGxpbmVhcglBRlIJaG9yaXpvbnRhbCBzdHJldGNoICovCi0JbGluZV9sZW5ndGhfcGNrID0gKHVpbnQxNl90KSAoKGxpbmVfbGVuZ3RoX3BjayAqCi0JCWxpbmVfbGVuZ3RoX3JhdGlvKSA+PiBPVjk3MjZfUThTaGlmdCk7Ci0JbGluZV9sZW5ndGhfcGNrX21zYiA9ICh1aW50OF90KSAoKGxpbmVfbGVuZ3RoX3BjayAmIDB4RkYwMCkgPj4gOCk7Ci0JbGluZV9sZW5ndGhfcGNrX2xzYiA9ICh1aW50OF90KSAobGluZV9sZW5ndGhfcGNrICYgMHgwMEZGKTsKLQkvKiB1cGRhdGUJbGluZSBjb3VudCByZWdpc3RlcnMgKi8KLQlpbnRnX3RpbWVfbXNiID0gKHVpbnQ4X3QpICgobGluZSAmIDB4RkYwMCkgPj4gOCk7Ci0JaW50Z190aW1lX2xzYiA9ICh1aW50OF90KSAobGluZQkmIDB4MDBGRik7Ci0KLQlyYyA9IG92OTcyNl9pMmNfd3JpdGVfYihvdjk3MjZfY2xpZW50LT5hZGRyLCAweDEwNCwgMHgxKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IG92OTcyNl9pMmNfd3JpdGVfYihvdjk3MjZfY2xpZW50LT5hZGRyLCAweDIwNCwgZ2Fpbl9tc2IpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gb3Y5NzI2X2kyY193cml0ZV9iKG92OTcyNl9jbGllbnQtPmFkZHIsIDB4MjA1LCBnYWluX2xzYik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBvdjk3MjZfaTJjX3dyaXRlX2Iob3Y5NzI2X2NsaWVudC0+YWRkciwgMHgzNDIsCi0JCWxpbmVfbGVuZ3RoX3Bja19tc2IpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gb3Y5NzI2X2kyY193cml0ZV9iKG92OTcyNl9jbGllbnQtPmFkZHIsIDB4MzQzLAotCQlsaW5lX2xlbmd0aF9wY2tfbHNiKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IG92OTcyNl9pMmNfd3JpdGVfYihvdjk3MjZfY2xpZW50LT5hZGRyLCAweDAyMDIsIGludGdfdGltZV9tc2IpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gb3Y5NzI2X2kyY193cml0ZV9iKG92OTcyNl9jbGllbnQtPmFkZHIsIDB4MDIwMywgaW50Z190aW1lX2xzYik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBvdjk3MjZfaTJjX3dyaXRlX2Iob3Y5NzI2X2NsaWVudC0+YWRkciwgMHgxMDQsIDB4MCk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBvdjk3MjZfc2V0X3BpY3RfZXhwX2dhaW4odWludDE2X3QgZ2FpbiwgdWludDMyX3QgbGluZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlyYyA9IG92OTcyNl93cml0ZV9leHBfZ2FpbihnYWluLCBsaW5lKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IGluaXRpYWxpemVfb3Y5NzI2X3JlZ2lzdGVycyh2b2lkKQotewotCWludDMyX3QgaTsKLQlpbnQzMl90IHJjID0gMDsKLQlvdjk3MjZfY3RybC0+c2Vuc29ybW9kZSA9IFNFTlNPUl9QUkVWSUVXX01PREUgOwotCS8qIENvbmZpZ3VyZSBzZW5zb3IgZm9yIFByZXZpZXcgbW9kZSBhbmQgU25hcHNob3QgbW9kZSAqLwotCUNEQkcoIkluaXRpYWxpemVfb3Y5NzI2X3JlZ2lzdGVyc1xuIik7Ci0JZm9yIChpID0gMDsgaSA8IG92OTcyNl9hcnJheV9sZW5ndGg7IGkrKykgewotCQlyYyA9IG92OTcyNl9pMmNfd3JpdGVfYihvdjk3MjZfY2xpZW50LT5hZGRyLAotCQkJb3Y5NzI2X2luaXRfc2V0dGluZ3NfYXJyYXlbaV0ucmVnX2FkZHIsCi0JCQlvdjk3MjZfaW5pdF9zZXR0aW5nc19hcnJheVtpXS5yZWdfdmFsKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3Qgb3Y5NzI2X3ZpZGVvX2NvbmZpZyhpbnQgbW9kZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCW92OTcyNl9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQotCWlmIChjb25maWdfbm90X3NldCkgewotCQlzdHJ1Y3QgbXNtX2NhbWVyYV9jc2lfcGFyYW1zIG92OTcyNl9jc2lfcGFyYW1zOwotCi0JCS8qIHNlbnNvciBpbiBzdGFuZGJ5ICovCi0JCW92OTcyNl9pMmNfd3JpdGVfYihvdjk3MjZfY2xpZW50LT5hZGRyLCAweDEwMCwgMCk7Ci0JCW1zbGVlcCg1KTsKLQkJLyogSW5pdGlhbGl6ZSBTZW5zb3IgcmVnaXN0ZXJzICovCi0JCW92OTcyNl9jc2lfcGFyYW1zLmRhdGFfZm9ybWF0ID0gQ1NJXzEwQklUOwotCQlvdjk3MjZfY3NpX3BhcmFtcy5sYW5lX2NudCA9IDE7Ci0JCW92OTcyNl9jc2lfcGFyYW1zLmxhbmVfYXNzaWduID0gMHhlNDsKLQkJb3Y5NzI2X2NzaV9wYXJhbXMuZHBjbV9zY2hlbWUgPSAwOwotCQlvdjk3MjZfY3NpX3BhcmFtcy5zZXR0bGVfY250ID0gNzsKLQotCQlyYyA9IG1zbV9jYW1pb19jc2lfY29uZmlnKCZvdjk3MjZfY3NpX3BhcmFtcyk7Ci0JCXJjID0gaW5pdGlhbGl6ZV9vdjk3MjZfcmVnaXN0ZXJzKCk7Ci0JCWNvbmZpZ19ub3Rfc2V0ID0gMDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBvdjk3MjZfc25hcHNob3RfY29uZmlnKGludCBtb2RlKQotewotCWludDMyX3QgcmMgPSAwOwotCW92OTcyNl9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG92OTcyNl9yYXdfc25hcHNob3RfY29uZmlnKGludCBtb2RlKQotewotCWludDMyX3QgcmMgPSAwOwotCW92OTcyNl9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG92OTcyNl9zZXRfc2Vuc29yX21vZGUoaW50ICBtb2RlLAotCQkJaW50ICByZXMpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBTRU5TT1JfUFJFVklFV19NT0RFOgotCQlyYyA9IG92OTcyNl92aWRlb19jb25maWcobW9kZSk7Ci0JCWJyZWFrOwotCWNhc2UgU0VOU09SX1NOQVBTSE9UX01PREU6Ci0JCXJjID0gb3Y5NzI2X3NuYXBzaG90X2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfUkFXX1NOQVBTSE9UX01PREU6Ci0JCXJjID0gb3Y5NzI2X3Jhd19zbmFwc2hvdF9jb25maWcobW9kZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBvdjk3MjZfcHJvYmVfaW5pdF9zZW5zb3IoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JdWludDE2X3QgIGNoaXBpZGwsIGNoaXBpZGg7Ci0KLQlpZiAoZGF0YS0+c2Vuc29yX3Jlc2V0X2VuYWJsZSkgewotCQlyYyA9IGdwaW9fcmVxdWVzdChkYXRhLT5zZW5zb3JfcmVzZXQsICJvdjk3MjYiKTsKLQkJaWYgKCFyYykgewotCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChkYXRhLT5zZW5zb3JfcmVzZXQsIDEpOwotCQkJbXNsZWVwKDIwKTsKLQkJfSBlbHNlCi0JCQlnb3RvIGluaXRfcHJvYmVfZG9uZTsKLQl9Ci0JLyogMy4gUmVhZCBzZW5zb3IgTW9kZWwgSUQ6ICovCi0JcmMgPSBvdjk3MjZfaTJjX3JlYWQoT1Y5NzI2X1BJREhfUkVHLCAmY2hpcGlkaCwgMSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JcmMgPSBvdjk3MjZfaTJjX3JlYWQoT1Y5NzI2X1BJRExfUkVHLCAmY2hpcGlkbCwgMSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JQ0RCRygia292OTcyNiBtb2RlbF9pZCA9IDB4JXggIDB4JXhcbiIsIGNoaXBpZGgsIGNoaXBpZGwpOwotCS8qIDQuIENvbXBhcmUgc2Vuc29yIElEIHRvIE9WOTcyNiBJRDogKi8KLQlpZiAoY2hpcGlkaCAhPSBPVjk3MjZfUElEKSB7Ci0JCXJjID0gLUVOT0RFVjsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUHJvYmVpbml0IGZhaWxcbiIpOwotCQlnb3RvIGluaXRfcHJvYmVfZmFpbDsKLQl9Ci0JQ0RCRygiY2hpcGlkaCA9PSBPVjk3MjZfUElEXG4iKTsKLQltc2xlZXAoT1Y5NzI2X1JFU0VUX0RFTEFZX01TRUNTKTsKLQlDREJHKCJhZnRlciBkZWxheVxuIik7Ci0JZ290byBpbml0X3Byb2JlX2RvbmU7Ci0KLWluaXRfcHJvYmVfZmFpbDoKLQlpZiAoZGF0YS0+c2Vuc29yX3Jlc2V0X2VuYWJsZSkgewotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+c2Vuc29yX3Jlc2V0LCAwKTsKLQkJZ3Bpb19mcmVlKGRhdGEtPnNlbnNvcl9yZXNldCk7Ci0JfQotaW5pdF9wcm9iZV9kb25lOgotCXByaW50ayhLRVJOX0lORk8gIiBvdjk3MjZfcHJvYmVfaW5pdF9zZW5zb3IgZmluaXNoZXNcbiIpOwotCXJldHVybiByYzsKLX0KLQotaW50IG92OTcyNl9zZW5zb3Jfb3Blbl9pbml0KGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCWludDMyX3QgIHJjOwotCi0JQ0RCRygiQ2FsbGluZyBvdjk3MjZfc2Vuc29yX29wZW5faW5pdFxuIik7Ci0Jb3Y5NzI2X2N0cmwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb3Y5NzI2X2N0cmxfdCksIEdGUF9LRVJORUwpOwotCWlmICghb3Y5NzI2X2N0cmwpIHsKLQkJQ0RCRygib3Y5NzI2X2luaXQgZmFpbGVkIVxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBpbml0X2RvbmU7Ci0JfQotCW92OTcyNl9jdHJsLT5jdXJyX2xlbnNfcG9zID0gLTE7Ci0Jb3Y5NzI2X2N0cmwtPmZwc19kaXZpZGVyID0gMSA8PCBPVjk3MjZfUTEwU2hpZnQ7Ci0Jb3Y5NzI2X2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIgPSAxIDw8IE9WOTcyNl9RMTBTaGlmdDsKLQlvdjk3MjZfY3RybC0+c2V0X3Rlc3QgPSBURVNUX09GRjsKLQlvdjk3MjZfY3RybC0+cHJldl9yZXMgPSBGVUxMX1NJWkU7Ci0Jb3Y5NzI2X2N0cmwtPnBpY3RfcmVzID0gRlVMTF9TSVpFOwotCW92OTcyNl9jdHJsLT5jdXJyX3JlcyA9IElOVkFMSURfU0laRTsKLQljb25maWdfbm90X3NldCA9IDE7Ci0JaWYgKGRhdGEpCi0JCW92OTcyNl9jdHJsLT5zZW5zb3JkYXRhID0gZGF0YTsKLQkvKiBlbmFibGUgbWNsayBmaXJzdCAqLwotCW1zbV9jYW1pb19jbGtfcmF0ZV9zZXQoT1Y5NzI2X0RFRkFVTFRfQ0xPQ0tfUkFURSk7Ci0JbXNsZWVwKDIwKTsKLQlyYyA9IG92OTcyNl9wcm9iZV9pbml0X3NlbnNvcihkYXRhKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGluaXRfZmFpbDsKLQotCW92OTcyNl9jdHJsLT5mcHMgPSAodWludDE2X3QpKDMwIDw8IE9WOTcyNl9ROFNoaWZ0KTsKLQkvKiBnZW5lcmF0ZSB0ZXN0IHBhdHRlcm4gKi8KLQlpZiAocmMgPCAwKQotCQlnb3RvIGluaXRfZmFpbDsKLQllbHNlCi0JCWdvdG8gaW5pdF9kb25lOwotCS8qIHJlc2V0IHRoZSBkcml2ZXIgc3RhdGUgKi8KLWluaXRfZmFpbDoKLQlDREJHKCIgaW5pdF9mYWlsXG4iKTsKLQlrZnJlZShvdjk3MjZfY3RybCk7Ci1pbml0X2RvbmU6Ci0JQ0RCRygiaW5pdF9kb25lXG4iKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y5NzI2X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JLyogSW5pdGlhbGl6ZSB0aGUgTVNNX0NBTUkyQyBDaGlwICovCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmb3Y5NzI2X3dhaXRfcXVldWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgb3Y5NzI2X2kyY19pZFtdID0gewotCXsgIm92OTcyNiIsIDB9LAotCXsgfQotfTsKLQotc3RhdGljIGludCBvdjk3MjZfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCWludCByYyA9IDA7Ci0JQ0RCRygib3Y5NzI2X3Byb2JlIGNhbGxlZCFcbiIpOwotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7Ci0JCUNEQkcoImkyY19jaGVja19mdW5jdGlvbmFsaXR5IGZhaWxlZFxuIik7Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0Jb3Y5NzI2X3NlbnNvcncgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb3Y5NzI2X3dvcmtfdCksIEdGUF9LRVJORUwpOwotCWlmICghb3Y5NzI2X3NlbnNvcncpIHsKLQkJQ0RCRygia3phbGxvYyBmYWlsZWQuXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIHByb2JlX2ZhaWx1cmU7Ci0JfQotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIG92OTcyNl9zZW5zb3J3KTsKLQlvdjk3MjZfaW5pdF9jbGllbnQoY2xpZW50KTsKLQlvdjk3MjZfY2xpZW50ID0gY2xpZW50OwotCW1zbGVlcCg1MCk7Ci0JQ0RCRygib3Y5NzI2X3Byb2JlIHN1Y2Nlc3NlZCEgcmMgPSAlZFxuIiwgcmMpOwotCXJldHVybiAwOwotcHJvYmVfZmFpbHVyZToKLQlDREJHKCJvdjk3MjZfcHJvYmUgZmFpbGVkISByYyA9ICVkXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fZXhpdCBvdjk3MjZfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IG92OTcyNl93b3JrX3RfdCAqc2Vuc29ydyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBzZW5zb3J3KTsKLQlvdjk3MjZfY2xpZW50ID0gTlVMTDsKLQlrZnJlZShzZW5zb3J3KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG92OTcyNl9pMmNfZHJpdmVyID0gewotCS5pZF90YWJsZSA9IG92OTcyNl9pMmNfaWQsCi0JLnByb2JlCT0gb3Y5NzI2X2kyY19wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3Aob3Y5NzI2X2kyY19yZW1vdmUpLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm92OTcyNiIsCi0JfSwKLX07Ci0KLWludCBvdjk3MjZfc2Vuc29yX2NvbmZpZyh2b2lkIF9fdXNlciAqYXJncCkKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhIGNkYXRhOwotCWxvbmcgICByYyA9IDA7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmNkYXRhLAotCQkJCSh2b2lkICopYXJncCwKLQkJCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQltdXRleF9sb2NrKCZvdjk3MjZfbXV0KTsKLQlDREJHKCJvdjk3MjZfc2Vuc29yX2NvbmZpZzogY2ZndHlwZSA9ICVkXG4iLAotCQljZGF0YS5jZmd0eXBlKTsKLQlzd2l0Y2ggKGNkYXRhLmNmZ3R5cGUpIHsKLQljYXNlIENGR19HRVRfUElDVF9GUFM6Ci0JCW92OTcyNl9nZXRfcGljdF9mcHMoY2RhdGEuY2ZnLmdmcHMucHJldmZwcywKLQkJCQkmKGNkYXRhLmNmZy5nZnBzLnBpY3RmcHMpKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQljYXNlIENGR19HRVRfUFJFVl9MX1BGOgotCQljZGF0YS5jZmcucHJldmxfcGYgPSBvdjk3MjZfZ2V0X3ByZXZfbGluZXNfcGYoKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX0dFVF9QUkVWX1BfUEw6Ci0JCWNkYXRhLmNmZy5wcmV2cF9wbCA9IG92OTcyNl9nZXRfcHJldl9waXhlbHNfcGwoKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX0dFVF9QSUNUX0xfUEY6Ci0JCWNkYXRhLmNmZy5waWN0bF9wZiA9IG92OTcyNl9nZXRfcGljdF9saW5lc19wZigpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfR0VUX1BJQ1RfUF9QTDoKLQkJY2RhdGEuY2ZnLnBpY3RwX3BsID0KLQkJCQlvdjk3MjZfZ2V0X3BpY3RfcGl4ZWxzX3BsKCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSZjZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQljYXNlIENGR19HRVRfUElDVF9NQVhfRVhQX0xDOgotCQljZGF0YS5jZmcucGljdF9tYXhfZXhwX2xjID0gb3Y5NzI2X2dldF9waWN0X21heF9leHBfbGMoKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9GUFM6Ci0JY2FzZSBDRkdfU0VUX1BJQ1RfRlBTOgotCQlyYyA9IG92OTcyNl9zZXRfZnBzKCYoY2RhdGEuY2ZnLmZwcykpOwotCQlicmVhazsKLQljYXNlIENGR19TRVRfRVhQX0dBSU46Ci0JCXJjID0gb3Y5NzI2X3dyaXRlX2V4cF9nYWluKAotCQkJCQljZGF0YS5jZmcuZXhwX2dhaW4uZ2FpbiwKLQkJCQkJY2RhdGEuY2ZnLmV4cF9nYWluLmxpbmUpOwotCQlicmVhazsKLQljYXNlIENGR19TRVRfUElDVF9FWFBfR0FJTjoKLQkJcmMgPSBvdjk3MjZfc2V0X3BpY3RfZXhwX2dhaW4oCi0JCQkJCWNkYXRhLmNmZy5leHBfZ2Fpbi5nYWluLAotCQkJCQljZGF0YS5jZmcuZXhwX2dhaW4ubGluZSk7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9NT0RFOgotCQlyYyA9IG92OTcyNl9zZXRfc2Vuc29yX21vZGUoY2RhdGEubW9kZSwKLQkJCQkJCWNkYXRhLnJzKTsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfUFdSX0RPV046Ci0JY2FzZSBDRkdfTU9WRV9GT0NVUzoKLQljYXNlIENGR19TRVRfREVGQVVMVF9GT0NVUzoKLQkJcmMgPSAwOwotCQlicmVhazsKLQljYXNlIENGR19TRVRfRUZGRUNUOgotCWRlZmF1bHQ6Ci0JCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JfQotCW11dGV4X3VubG9jaygmb3Y5NzI2X211dCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG92OTcyNl9wcm9iZV9pbml0X2RvbmUoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JaWYgKGRhdGEtPnNlbnNvcl9yZXNldF9lbmFibGUpIHsKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JCWdwaW9fZnJlZShkYXRhLT5zZW5zb3JfcmVzZXQpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdjk3MjZfc2Vuc29yX3JlbGVhc2Uodm9pZCkKLXsKLQlpbnQgcmMgPSAtRUJBREY7Ci0JbXV0ZXhfbG9jaygmb3Y5NzI2X211dCk7Ci0JaWYgKG92OTcyNl9jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcmVzZXRfZW5hYmxlKSB7Ci0JCWdwaW9fZGlyZWN0aW9uX291dHB1dCgKLQkJCW92OTcyNl9jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCQlncGlvX2ZyZWUob3Y5NzI2X2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9yZXNldCk7Ci0JfQotCWtmcmVlKG92OTcyNl9jdHJsKTsKLQlvdjk3MjZfY3RybCA9IE5VTEw7Ci0JQ0RCRygib3Y5NzI2X3JlbGVhc2UgY29tcGxldGVkXG4iKTsKLQltdXRleF91bmxvY2soJm92OTcyNl9tdXQpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBvdjk3MjZfc2Vuc29yX3Byb2JlKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICppbmZvLAotCQlzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsICpzKQotewotCWludCByYyA9IDA7Ci0KLQlyYyA9IGkyY19hZGRfZHJpdmVyKCZvdjk3MjZfaTJjX2RyaXZlcik7Ci0JaWYgKHJjIDwgMCB8fCBvdjk3MjZfY2xpZW50ID09IE5VTEwpIHsKLQkJcmMgPSAtRU5PVFNVUFA7Ci0JCWdvdG8gcHJvYmVfZmFpbDsKLQl9Ci0JbXNtX2NhbWlvX2Nsa19yYXRlX3NldCgyNDAwMDAwMCk7Ci0JbXNsZWVwKDIwKTsKLQlyYyA9IG92OTcyNl9wcm9iZV9pbml0X3NlbnNvcihpbmZvKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIHByb2JlX2ZhaWw7Ci0KLQlzLT5zX2luaXQgPSBvdjk3MjZfc2Vuc29yX29wZW5faW5pdDsKLQlzLT5zX3JlbGVhc2UgPSBvdjk3MjZfc2Vuc29yX3JlbGVhc2U7Ci0Jcy0+c19jb25maWcgID0gb3Y5NzI2X3NlbnNvcl9jb25maWc7Ci0Jcy0+c19jYW1lcmFfdHlwZSA9IEZST05UX0NBTUVSQV8yRDsKLQlzLT5zX21vdW50X2FuZ2xlID0gaW5mby0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPm1vdW50X2FuZ2xlOwotCW92OTcyNl9wcm9iZV9pbml0X2RvbmUoaW5mbyk7Ci0KLQlyZXR1cm4gcmM7Ci0KLXByb2JlX2ZhaWw6Ci0JQ0RCRygiU0VOU09SIFBST0JFIEZBSUxTIVxuIik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fb3Y5NzI2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIG1zbV9jYW1lcmFfZHJ2X3N0YXJ0KHBkZXYsIG92OTcyNl9zZW5zb3JfcHJvYmUpOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fY2FtZXJhX2RyaXZlciA9IHsKLQkucHJvYmUgPSBfX292OTcyNl9wcm9iZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc21fY2FtZXJhX292OTcyNiIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBvdjk3MjZfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9jYW1lcmFfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQob3Y5NzI2X2luaXQpOwotdm9pZCBvdjk3MjZfZXhpdCh2b2lkKQotewotCWkyY19kZWxfZHJpdmVyKCZvdjk3MjZfaTJjX2RyaXZlcik7Ci19Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiT01OSSBWR0EgQmF5ZXIgc2Vuc29yIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvb3Y5NzI2LmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvb3Y5NzI2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYmExYTguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL292OTcyNi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgT1Y5NzI2X0gKLSNkZWZpbmUgT1Y5NzI2X0gKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLQotLyogMTZiaXQgYWRkcmVzcyAtIDggYml0IGNvbnRleHQgcmVnaXN0ZXIgc3RydWN0dXJlICovCi1zdHJ1Y3QgcmVnX3N0cnVjdF90eXBlIHsKLQl1aW50MTZfdAlyZWdfYWRkcjsKLQl1bnNpZ25lZCBjaGFyCXJlZ192YWw7Ci19OwotCi1lbnVtIG92OTcyNl90ZXN0X21vZGVfdCB7Ci0JVEVTVF9PRkYsCi0JVEVTVF8xLAotCVRFU1RfMiwKLQlURVNUXzMKLX07Ci0KLWVudW0gb3Y5NzI2X3Jlc29sdXRpb25fdCB7Ci0JUVRSX1NJWkUsCi0JRlVMTF9TSVpFLAotCUlOVkFMSURfU0laRQotfTsKLWV4dGVybiBzdHJ1Y3QgcmVnX3N0cnVjdF90eXBlIG92OTcyNl9pbml0X3NldHRpbmdzX2FycmF5W107Ci1leHRlcm4gaW50MzJfdCBvdjk3MjZfYXJyYXlfbGVuZ3RoOwotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9vdjk3MjZfcmVnLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvb3Y5NzI2X3JlZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTZlY2NhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9vdjk3MjZfcmVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSAib3Y5NzI2LmgiCi1zdHJ1Y3QgcmVnX3N0cnVjdF90eXBlIG92OTcyNl9pbml0X3NldHRpbmdzX2FycmF5W10gPSB7Ci0JezB4MDEwMywgMHgwMX0sIC8qIFNPRlRXQVJFX1JFU0VUICovCi0JezB4MzAyNiwgMHgwMH0sIC8qIE9VVFBVVF9TRUxFQ1QwMSAqLwotCXsweDMwMjcsIDB4MDB9LCAvKiBPVVRQVVRfU0VMRUNUMDIgKi8KLQl7MHgzMDAyLCAweGU4fSwgLyogSU9fQ1RSTDAwICovCi0JezB4MzAwNCwgMHgwM30sIC8qIElPX0NUUkwwMSAqLwotCXsweDMwMDUsIDB4ZmZ9LCAvKiBJT19DVFJMMDIgKi8KLQl7MHgzNzAzLCAweDQyfSwKLQl7MHgzNzA0LCAweDEwfSwKLQl7MHgzNzA1LCAweDQ1fSwKLQl7MHgzNjAzLCAweGFhfSwKLQl7MHgzNjMyLCAweDJmfSwKLQl7MHgzNjIwLCAweDY2fSwKLQl7MHgzNjIxLCAweGMwfSwKLQl7MHgwMzQwLCAweDAzfSwgLyogRlJBTUVfTEVOR1RIX0xJTkVTX0hJICovCi0JezB4MDM0MSwgMHhDMX0sIC8qIEZSQU1FX0xFTkdUSF9MSU5FU19MTyAqLwotCXsweDAzNDIsIDB4MDZ9LCAvKiBMSU5FX0xFTkdUSF9QQ0tfSEkgKi8KLQl7MHgwMzQzLCAweDgwfSwgLyogTElORV9MRU5HVEhfUENLX0xPICovCi0JezB4MDIwMiwgMHgwM30sIC8qIENPQVJTRV9JTlRFR1JBVElPTl9USU1FX0hJICovCi0JezB4MDIwMywgMHg0M30sIC8qIENPQVJTRV9JTlRFR1JBVElPTl9USU1FX0xPICovCi0JezB4MzgzMywgMHgwNH0sCi0JezB4MzgzNSwgMHgwMn0sCi0JezB4NDcwMiwgMHgwNH0sCi0JezB4NDcwNCwgMHgwMH0sIC8qIERWUF9DVFJMMDEgKi8KLQl7MHg0NzA2LCAweDA4fSwKLQl7MHg1MDUyLCAweDAxfSwKLQl7MHgzODE5LCAweDZlfSwKLQl7MHgzODE3LCAweDk0fSwKLQl7MHgzYTE4LCAweDAwfSwgLyogQUVDX0dBSU5fQ0VJTElOR19ISSAqLwotCXsweDNhMTksIDB4N2Z9LCAvKiBBRUNfR0FJTl9DRUlMSU5HX0xPICovCi0JezB4NDA0ZSwgMHg3ZX0sCi0JezB4MzYzMSwgMHg1Mn0sCi0JezB4MzYzMywgMHg1MH0sCi0JezB4MzYzMCwgMHhkMn0sCi0JezB4MzYwNCwgMHgwOH0sCi0JezB4MzYwMSwgMHg0MH0sCi0JezB4MzYwMiwgMHgxNH0sCi0JezB4MzYxMCwgMHhhMH0sCi0JezB4MzYxMiwgMHgyMH0sCi0JezB4MDM0YywgMHgwNX0sIC8qIFhfT1VUUFVUX1NJWkVfSEkgKi8KLQl7MHgwMzRkLCAweDEwfSwgLyogWF9PVVRQVVRfU0laRV9MTyAqLwotCXsweDAzNGUsIDB4MDN9LCAvKiBZX09VVFBVVF9TSVpFX0hJICovCi0JezB4MDM0ZiwgMHgyOH0sIC8qIFlfT1VUUFVUX1NJWkVfTE8gKi8KLQl7MHgwMzQwLCAweDAzfSwgLyogRlJBTUVfTEVOR1RIX0xJTkVTX0hJICovCi0JezB4MDM0MSwgMHhDMX0sIC8qIEZSQU1FX0xFTkdUSF9MSU5FU19MTyAqLwotCXsweDAzNDIsIDB4MDZ9LCAvKiBMSU5FX0xFTkdUSF9QQ0tfSEkgKi8KLQl7MHgwMzQzLCAweDgwfSwgLyogTElORV9MRU5HVEhfUENLX0xPICovCi0JezB4MDIwMiwgMHgwM30sIC8qIENPQVJTRV9JTlRFR1JBVElPTl9USU1FX0hJICovCi0JezB4MDIwMywgMHg0M30sIC8qIENPQVJTRV9JTlRFR1JBVElPTl9USU1FX0xPICovCi0JezB4MDMwMywgMHgwMX0sIC8qIFZUX1NZU19DTEtfRElWX0xPICovCi0JezB4MzAwMiwgMHgwMH0sIC8qIElPX0NUUkwwMCAqLwotCXsweDMwMDQsIDB4MDB9LCAvKiBJT19DVFJMMDEgKi8KLQl7MHgzMDA1LCAweDAwfSwgLyogSU9fQ1RSTDAyICovCi0JezB4NDgwMSwgMHgwZn0sIC8qIE1JUElfQ1RSTDAxICovCi0JezB4NDgwMywgMHgwNX0sIC8qIE1JUElfQ1RSTDAzICovCi0JezB4NDYwMSwgMHgxNn0sIC8qIFZGSUZPX1JFQURfQ09OVFJPTCAqLwotCXsweDMwMTQsIDB4MDV9LCAvKiBTQ19DTU1OX01JUEkgLyBTQ19DVFJMMDAgKi8KLQl7MHgzMTA0LCAweDgwfSwKLQl7MHgwMzA1LCAweDA0fSwgLyogUFJFX1BMTF9DTEtfRElWX0xPICovCi0JezB4MDMwNywgMHg2NH0sIC8qIFBMTF9NVUxUSVBMSUVSX0xPICovCi0JezB4MzAwYywgMHgwMn0sCi0JezB4MzAwZCwgMHgyMH0sCi0JezB4MzAwZSwgMHgwMX0sCi0JezB4MzAxMCwgMHgwMX0sCi0JezB4NDYwZSwgMHg4MX0sIC8qIFZGSUZPX0NPTlRST0wwMCAqLwotCXsweDAxMDEsIDB4MDF9LCAvKiBJTUFHRV9PUklFTlRBVElPTiAqLwotCXsweDM3MDcsIDB4MTR9LAotCXsweDM2MjIsIDB4OWZ9LAotCXsweDUwNDcsIDB4M0R9LCAvKiBJU1BfQ1RSTDQ3ICovCi0JezB4NDAwMiwgMHg0NX0sIC8qIEJMQ19DVFJMMDIgKi8KLQl7MHg1MDAwLCAweDA2fSwgLyogSVNQX0NUUkwwICovCi0JezB4NTAwMSwgMHgwMH0sIC8qIElTUF9DVFJMMSAqLwotCXsweDM0MDYsIDB4MDB9LCAvKiBBV0JfTUFOVUFMX0NUUkwgKi8KLQl7MHgzNTAzLCAweDEzfSwgLyogQUVDX0VOQUJMRSAqLwotCXsweDQwMDUsIDB4MTh9LCAvKiBCTENfQ1RSTDA1ICovCi0JezB4NDgzNywgMHgyMX0sCi0JezB4MDEwMCwgMHgwMX0sIC8qIE1PREVfU0VMRUNUICovCi0JezB4M2EwZiwgMHg2NH0sIC8qIEFFQ19DVFJMMEYgKi8KLQl7MHgzYTEwLCAweDU0fSwgLyogQUVDX0NUUkwxMCAqLwotCXsweDNhMTEsIDB4YzJ9LCAvKiBBRUNfQ1RSTDExICovCi0JezB4M2ExYiwgMHg2NH0sIC8qIEFFQ19DVFJMMUIgKi8KLQl7MHgzYTFlLCAweDU0fSwgLyogQUVDX0NUUkwxRSAqLwotCXsweDNhMWEsIDB4MDV9LCAvKiBBRUNfRElGRl9NQVggKi8KLX07Ci1pbnQzMl90IG92OTcyNl9hcnJheV9sZW5ndGggPSBzaXplb2Yob3Y5NzI2X2luaXRfc2V0dGluZ3NfYXJyYXkpIC8KLQlzaXplb2Yob3Y5NzI2X2luaXRfc2V0dGluZ3NfYXJyYXlbMF0pOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvcXNfczVrNGUxLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvcXNfczVrNGUxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZDA5NGQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3FzX3M1azRlMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgyMiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgInFzX3M1azRlMS5oIgotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JU0VOU09SIFJFR0lTVEVSIERFRklORVMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLSNkZWZpbmUgUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQJCTB4MDEwNAotI2RlZmluZSBHUk9VUEVEX1BBUkFNRVRFUl9IT0xEX09GRgkJMHgwMAotI2RlZmluZSBHUk9VUEVEX1BBUkFNRVRFUl9IT0xECQkJMHgwMQotLyogSW50ZWdyYXRpb24gVGltZSAqLwotI2RlZmluZSBSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUUJCTB4MDIwMgotLyogR2FpbiAqLwotI2RlZmluZSBSRUdfR0xPQkFMX0dBSU4JCQkJCTB4MDIwNAotI2RlZmluZSBSRUdfR1JfR0FJTgkJCQkJMHgwMjBFCi0jZGVmaW5lIFJFR19SX0dBSU4JCQkJCTB4MDIxMAotI2RlZmluZSBSRUdfQl9HQUlOCQkJCQkweDAyMTIKLSNkZWZpbmUgUkVHX0dCX0dBSU4JCQkJCTB4MDIxNAotLyogUExMIHJlZ2lzdGVycyAqLwotI2RlZmluZSBSRUdfRlJBTUVfTEVOR1RIX0xJTkVTCQkJMHgwMzQwCi0jZGVmaW5lIFJFR19MSU5FX0xFTkdUSF9QQ0sJCQkJMHgwMzQyCi0vKiBUZXN0IFBhdHRlcm4gKi8KLSNkZWZpbmUgUkVHX1RFU1RfUEFUVEVSTl9NT0RFCQkJMHgwNjAxCi0jZGVmaW5lIFJFR19WQ01fTkVXX0NPREUJCQkJMHgzMEYyCi0jZGVmaW5lIEFGX0FERFIJCQkJCQkJMHgxOAotI2RlZmluZSBCUklER0VfQUREUgkJCQkJCTB4ODAKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkJIFRZUEUgREVDTEFSQVRJT05TCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyogMTZiaXQgYWRkcmVzcyAtIDggYml0IGNvbnRleHQgcmVnaXN0ZXIgc3RydWN0dXJlICovCi0jZGVmaW5lIFE4ICAweDAwMDAwMTAwCi0jZGVmaW5lIFExMCAweDAwMDAwNDAwCi0jZGVmaW5lIFFTX1M1SzRFMV9NQVNURVJfQ0xLX1JBVEUgMjQwMDAwMDAKLSNkZWZpbmUgUVNfUzVLNEUxX09GRlNFVAkJCTgKLQotLyogQUYgVG90YWwgc3RlcHMgcGFyYW1ldGVycyAqLwotI2RlZmluZSBRU19TNUs0RTFfVE9UQUxfU1RFUFNfTkVBUl9UT19GQVIgICAgMzIKLSNkZWZpbmUgUVNfUzVLNEUxX1RPVEFMX1NURVBTXzNEICAgIDMyCi0KLXVpbnQxNl90IHFzX3M1azRlMV9zdGVwX3Bvc2l0aW9uX3RhYmxlW1FTX1M1SzRFMV9UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUisxXTsKLXVpbnQxNl90IHFzX3M1azRlMV9zdGVwX3Bvc2l0aW9uX3RhYmxlX2xlZnRbUVNfUzVLNEUxX1RPVEFMX1NURVBTXzNEKzFdOwotdWludDE2X3QgcXNfczVrNGUxX3N0ZXBfcG9zaXRpb25fdGFibGVfcmlnaHRbUVNfUzVLNEUxX1RPVEFMX1NURVBTXzNEKzFdOwotdWludDE2X3QgcXNfczVrNGUxX25sX3JlZ2lvbl9ib3VuZGFyeTE7Ci11aW50MTZfdCBxc19zNWs0ZTFfbmxfcmVnaW9uX2NvZGVfcGVyX3N0ZXAxID0gMTkwOwotdWludDE2X3QgcXNfczVrNGUxX2xfcmVnaW9uX2NvZGVfcGVyX3N0ZXAgPSA4OwotdWludDE2X3QgcXNfczVrNGUxX2RhbXBpbmdfdGhyZXNob2xkID0gMTA7Ci11aW50MTZfdCBxc19zNWs0ZTFfc3dfZGFtcGluZ190aW1lX3dhaXQgPSA4OwotdWludDE2X3QgcXNfczVrNGUxX2FmX21vZGUgPSA0OwotaW50MTZfdCBxc19zNWs0ZTFfYWZfaW5pdGlhbF9jb2RlID0gMTkwOwotaW50MTZfdCBxc19zNWs0ZTFfYWZfcmlnaHRfYWRqdXN0OwotCi1zdHJ1Y3QgcXNfczVrNGUxX3dvcmtfdCB7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Ci19OwotCi1zdGF0aWMgc3RydWN0IHFzX3M1azRlMV93b3JrX3QgKnFzX3M1azRlMV9zZW5zb3J3Owotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50ICpxc19zNWs0ZTFfY2xpZW50Owotc3RhdGljIGNoYXIgbGVuc19lZXByb21fZGF0YVs4NjRdOwotc3RhdGljIGJvb2wgY2FsaV9kYXRhX3N0YXR1czsKLXN0cnVjdCBxc19zNWs0ZTFfY3RybF90IHsKLQljb25zdCBzdHJ1Y3QgIG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNlbnNvcmRhdGE7Ci0KLQl1aW50MzJfdCBzZW5zb3Jtb2RlOwotCXVpbnQzMl90IGZwc19kaXZpZGVyOy8qIGluaXQgdG8gMSAqIDB4MDAwMDA0MDAgKi8KLQl1aW50MzJfdCBwaWN0X2Zwc19kaXZpZGVyOy8qIGluaXQgdG8gMSAqIDB4MDAwMDA0MDAgKi8KLQl1aW50MTZfdCBmcHM7Ci0KLQl1aW50MTZfdCBjdXJyX2xlbnNfcG9zOwotCXVpbnQxNl90IGN1cnJfc3RlcF9wb3M7Ci0JdWludDE2X3QgbXlfcmVnX2dhaW47Ci0JdWludDMyX3QgbXlfcmVnX2xpbmVfY291bnQ7Ci0JdWludDE2X3QgdG90YWxfbGluZXNfcGVyX2ZyYW1lOwotCi0JZW51bSBxc19zNWs0ZTFfcmVzb2x1dGlvbl90IHByZXZfcmVzOwotCWVudW0gcXNfczVrNGUxX3Jlc29sdXRpb25fdCBwaWN0X3JlczsKLQllbnVtIHFzX3M1azRlMV9yZXNvbHV0aW9uX3QgY3Vycl9yZXM7Ci0JZW51bSBxc19zNWs0ZTFfdGVzdF9tb2RlX3QgIHNldF90ZXN0OwotCWVudW0gcXNfczVrNGUxX2NhbV9tb2RlX3QgY2FtX21vZGU7Ci19OwotCi1zdGF0aWMgdWludDE2X3QgcHJldl9saW5lX2xlbmd0aF9wY2s7Ci1zdGF0aWMgdWludDE2X3QgcHJldl9mcmFtZV9sZW5ndGhfbGluZXM7Ci1zdGF0aWMgdWludDE2X3Qgc25hcF9saW5lX2xlbmd0aF9wY2s7Ci1zdGF0aWMgdWludDE2X3Qgc25hcF9mcmFtZV9sZW5ndGhfbGluZXM7Ci0KLXN0YXRpYyBib29sIENTSV9DT05GSUcsIExFTlNfU0hBREVfQ09ORklHLCBkZWZhdWx0X2xlbnNfc2hhZGU7Ci1zdGF0aWMgc3RydWN0IHFzX3M1azRlMV9jdHJsX3QgKnFzX3M1azRlMV9jdHJsOwotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHFzX3M1azRlMV93YWl0X3F1ZXVlKTsKLURFRklORV9NVVRFWChxc19zNWs0ZTFfbXV0KTsKLQotc3RhdGljIGludCBjYW1fZGVidWdfaW5pdCh2b2lkKTsKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2Jhc2U7Ci0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgaW50IHFzX3M1azRlMV9pMmNfcnhkYXRhKHVuc2lnbmVkIHNob3J0IHNhZGRyLAotCXVuc2lnbmVkIGNoYXIgKnJ4ZGF0YSwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7Ci0JCXsKLQkJCS5hZGRyICA9IHNhZGRyLAotCQkJLmZsYWdzID0gMCwKLQkJCS5sZW4gICA9IDIsCi0JCQkuYnVmICAgPSByeGRhdGEsCi0JCX0sCi0JCXsKLQkJCS5hZGRyICA9IHNhZGRyLAotCQkJLmZsYWdzID0gSTJDX01fUkQsCi0JCQkubGVuICAgPSBsZW5ndGgsCi0JCQkuYnVmICAgPSByeGRhdGEsCi0JCX0sCi0JfTsKLQlpZiAoaTJjX3RyYW5zZmVyKHFzX3M1azRlMV9jbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpIDwgMCkgewotCQlDREJHKCJxc19zNWs0ZTFfaTJjX3J4ZGF0YSBmYWlsZCAweCV4XG4iLCBzYWRkcik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgcXNfczVrNGUxX2kyY190eGRhdGEodW5zaWduZWQgc2hvcnQgc2FkZHIsCi0JCQkJdW5zaWduZWQgY2hhciAqdHhkYXRhLCBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0gewotCQl7Ci0JCQkuYWRkciA9IHNhZGRyLAotCQkJLmZsYWdzID0gMCwKLQkJCS5sZW4gPSBsZW5ndGgsCi0JCQkuYnVmID0gdHhkYXRhLAotCQkgfSwKLQl9OwotCWlmIChpMmNfdHJhbnNmZXIocXNfczVrNGUxX2NsaWVudC0+YWRhcHRlciwgbXNnLCAxKSA8IDApIHsKLQkJQ0RCRygicXNfczVrNGUxX2kyY190eGRhdGEgZmFpbGQgMHgleFxuIiwgc2FkZHIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgcXNfczVrNGUxX2kyY19yZWFkKHVuc2lnbmVkIHNob3J0IHJhZGRyLAotCXVuc2lnbmVkIHNob3J0ICpyZGF0YSwgaW50IHJsZW4pCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JdW5zaWduZWQgY2hhciBidWZbMl07Ci0JaWYgKCFyZGF0YSkKLQkJcmV0dXJuIC1FSU87Ci0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9IChyYWRkciAmIDB4RkYwMCkgPj4gODsKLQlidWZbMV0gPSAocmFkZHIgJiAweDAwRkYpOwotCXJjID0gcXNfczVrNGUxX2kyY19yeGRhdGEocXNfczVrNGUxX2NsaWVudC0+YWRkcj4+MSwgYnVmLCBybGVuKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoInFzX3M1azRlMV9pMmNfcmVhZCAweCV4IGZhaWxlZCFcbiIsIHJhZGRyKTsKLQkJcmV0dXJuIHJjOwotCX0KLQkqcmRhdGEgPSAocmxlbiA9PSAyID8gYnVmWzBdIDw8IDggfCBidWZbMV0gOiBidWZbMF0pOwotCUNEQkcoInFzX3M1azRlMV9pMmNfcmVhZCAweCV4IHZhbCA9IDB4JXghXG4iLCByYWRkciwgKnJkYXRhKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHFzX3M1azRlMV9pMmNfd3JpdGVfd19zZW5zb3IodW5zaWduZWQgc2hvcnQgd2FkZHIsCi0JIHVpbnQxNl90IHdkYXRhKQotewotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCXVuc2lnbmVkIGNoYXIgYnVmWzRdOwotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZbMF0gPSAod2FkZHIgJiAweEZGMDApID4+IDg7Ci0JYnVmWzFdID0gKHdhZGRyICYgMHgwMEZGKTsKLQlidWZbMl0gPSAod2RhdGEgJiAweEZGMDApID4+IDg7Ci0JYnVmWzNdID0gKHdkYXRhICYgMHgwMEZGKTsKLQlDREJHKCJpMmNfd3JpdGVfYiBhZGRyID0gMHgleCwgdmFsID0gMHgleFxuIiwgd2FkZHIsIHdkYXRhKTsKLQlyYyA9IHFzX3M1azRlMV9pMmNfdHhkYXRhKHFzX3M1azRlMV9jbGllbnQtPmFkZHI+PjEsIGJ1ZiwgNCk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJpMmNfd3JpdGVfYiBmYWlsZWQsIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4IVxuIiwKLQkJCXdhZGRyLCB3ZGF0YSk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgcXNfczVrNGUxX2kyY193cml0ZV9iX3NlbnNvcih1bnNpZ25lZCBzaG9ydCB3YWRkciwgdWludDhfdCBiZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gLUVGQVVMVDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlszXTsKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gKHdhZGRyICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlsxXSA9ICh3YWRkciAmIDB4MDBGRik7Ci0JYnVmWzJdID0gYmRhdGE7Ci0JQ0RCRygiaTJjX3dyaXRlX2IgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIHdhZGRyLCBiZGF0YSk7Ci0JcmMgPSBxc19zNWs0ZTFfaTJjX3R4ZGF0YShxc19zNWs0ZTFfY2xpZW50LT5hZGRyPj4xLCBidWYsIDMpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiaTJjX3dyaXRlX2IgZmFpbGVkLCBhZGRyID0gMHgleCwgdmFsID0gMHgleCFcbiIsCi0JCQl3YWRkciwgYmRhdGEpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHFzX3M1azRlMV9pMmNfd3JpdGVfYl90YWJsZShzdHJ1Y3QgcXNfczVrNGUxX2kyY19yZWdfY29uZiBjb25zdAotCQkJCQkgKnJlZ19jb25mX3RibCwgaW50IG51bSkKLXsKLQlpbnQgaTsKLQlpbnQzMl90IHJjID0gLUVJTzsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJcmMgPSBxc19zNWs0ZTFfaTJjX3dyaXRlX2Jfc2Vuc29yKHJlZ19jb25mX3RibC0+d2FkZHIsCi0JCQlyZWdfY29uZl90YmwtPndkYXRhKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCQlyZWdfY29uZl90YmwrKzsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBxc19zNWs0ZTFfaTJjX3dyaXRlX3NlcV9zZW5zb3IodW5zaWduZWQgc2hvcnQgd2FkZHIsCi0JCXVuc2lnbmVkIGNoYXIgKnNlcV9kYXRhLCBpbnQgbGVuKQotewotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCXVuc2lnbmVkIGNoYXIgYnVmW2xlbisyXTsKLQlpbnQgaSA9IDA7Ci0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9ICh3YWRkciAmIDB4RkYwMCkgPj4gODsKLQlidWZbMV0gPSAod2FkZHIgJiAweDAwRkYpOwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJYnVmW2krMl0gPSBzZXFfZGF0YVtpXTsKLQlyYyA9IHFzX3M1azRlMV9pMmNfdHhkYXRhKHFzX3M1azRlMV9jbGllbnQtPmFkZHI+PjEsIGJ1ZiwgbGVuKzIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgYWZfaTJjX3dyaXRlX2Jfc2Vuc29yKHVuc2lnbmVkIHNob3J0IGJhZGRyLCB1aW50OF90IGJkYXRhKQotewotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCXVuc2lnbmVkIGNoYXIgYnVmWzJdOwotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZbMF0gPSBiYWRkcjsKLQlidWZbMV0gPSBiZGF0YTsKLQlDREJHKCJpMmNfd3JpdGVfYiBhZGRyID0gMHgleCwgdmFsID0gMHgleFxuIiwgYmFkZHIsIGJkYXRhKTsKLQlyYyA9IHFzX3M1azRlMV9pMmNfdHhkYXRhKEFGX0FERFI+PjEsIGJ1ZiwgMik7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJpMmNfd3JpdGVfYiBmYWlsZWQsIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4IVxuIiwKLQkJCWJhZGRyLCBiZGF0YSk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgYnJpZGdlX2kyY193cml0ZV93KHVuc2lnbmVkIHNob3J0IHdhZGRyLCB1aW50MTZfdCB3ZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gLUVGQVVMVDsKLQl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gKHdhZGRyICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlsxXSA9ICh3YWRkciAmIDB4MDBGRik7Ci0JYnVmWzJdID0gKHdkYXRhICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlszXSA9ICh3ZGF0YSAmIDB4MDBGRik7Ci0JQ0RCRygiYnJpZGdlX2kyY193cml0ZV93IGFkZHIgPSAweCV4LCB2YWwgPSAweCV4XG4iLCB3YWRkciwgd2RhdGEpOwotCXJjID0gcXNfczVrNGUxX2kyY190eGRhdGEoQlJJREdFX0FERFI+PjEsIGJ1ZiwgNCk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJicmlkZ2VfaTJjX3dyaXRlX3cgZmFpbGVkLCBhZGRyID0gMHgleCwgdmFsID0gMHgleCFcbiIsCi0JCQl3YWRkciwgd2RhdGEpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IGJyaWRnZV9pMmNfcmVhZCh1bnNpZ25lZCBzaG9ydCByYWRkciwKLQl1bnNpZ25lZCBzaG9ydCAqcmRhdGEsIGludCBybGVuKQotewotCWludDMyX3QgcmMgPSAwOwotCXVuc2lnbmVkIGNoYXIgYnVmWzJdOwotCWlmICghcmRhdGEpCi0JCXJldHVybiAtRUlPOwotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZbMF0gPSAocmFkZHIgJiAweEZGMDApID4+IDg7Ci0JYnVmWzFdID0gKHJhZGRyICYgMHgwMEZGKTsKLQlyYyA9IHFzX3M1azRlMV9pMmNfcnhkYXRhKEJSSURHRV9BRERSPj4xLCBidWYsIHJsZW4pOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiYnJpZGdlX2kyY19yZWFkIDB4JXggZmFpbGVkIVxuIiwgcmFkZHIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCSpyZGF0YSA9IChybGVuID09IDIgPyBidWZbMF0gPDwgOCB8IGJ1ZlsxXSA6IGJ1ZlswXSk7Ci0JQ0RCRygiYnJpZGdlX2kyY19yZWFkIDB4JXggdmFsID0gMHgleCFcbiIsIHJhZGRyLCAqcmRhdGEpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgcXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZCh1bnNpZ25lZCBzaG9ydCByYWRkciwKLQl1bnNpZ25lZCBjaGFyICpyZGF0YSwgaW50IHJsZW4pCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JdW5zaWduZWQgc2hvcnQgaTJjYWRkciA9IDB4QTAgPj4gMTsKLQl1bnNpZ25lZCBjaGFyIGJ1ZltybGVuXTsKLQlpbnQgaSA9IDA7Ci0JaWYgKCFyZGF0YSkKLQkJcmV0dXJuIC1FSU87Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gKHJhZGRyICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlsxXSA9IChyYWRkciAmIDB4MDBGRik7Ci0JcmMgPSBxc19zNWs0ZTFfaTJjX3J4ZGF0YShpMmNhZGRyLCBidWYsIHJsZW4pOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygicXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZCAweCV4IGZhaWxlZCFcbiIsIHJhZGRyKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgcmxlbjsgaSsrKSB7Ci0JCXJkYXRhW2ldID0gYnVmW2ldOwotCQlDREJHKCJxc19zNWs0ZTFfZWVwcm9tX2kyY19yZWFkIDB4JXggaW5kZXg6ICVkIHZhbCA9IDB4JXghXG4iLAotCQkJcmFkZHIsIGksIGJ1ZltpXSk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgcXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZF9iKHVuc2lnbmVkIHNob3J0IHJhZGRyLAotCXVuc2lnbmVkIHNob3J0ICpyZGF0YSwgaW50IHJsZW4pCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JdW5zaWduZWQgY2hhciBidWZbMl07Ci0JcmMgPSBxc19zNWs0ZTFfZWVwcm9tX2kyY19yZWFkKHJhZGRyLCAmYnVmWzBdLCBybGVuKTsKLQkqcmRhdGEgPSAocmxlbiA9PSAyID8gYnVmWzBdIDw8IDggfCBidWZbMV0gOiBidWZbMF0pOwotCUNEQkcoInFzX3M1azRlMV9lZXByb21faTJjX3JlYWQgMHgleCB2YWwgPSAweCV4IVxuIiwgcmFkZHIsICpyZGF0YSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBxc19zNWs0ZTFfZ2V0X2NhbGlicmF0aW9uX2RhdGEoCi0Jc3RydWN0IHNlbnNvcl8zZF9jYWxpX2RhdGFfdCAqY2RhdGEpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JY2FsaV9kYXRhX3N0YXR1cyA9IDE7Ci0JcmMgPSBxc19zNWs0ZTFfZWVwcm9tX2kyY19yZWFkKDB4MCwKLQkJJihjZGF0YS0+bGVmdF9wX21hdHJpeFswXVswXVswXSksIDk2KTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGZhaWw7Ci0JcmMgPSBxc19zNWs0ZTFfZWVwcm9tX2kyY19yZWFkKDB4NjAsCi0JCSYoY2RhdGEtPnJpZ2h0X3BfbWF0cml4WzBdWzBdWzBdKSwgOTYpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZmFpbDsKLQlyYyA9IHFzX3M1azRlMV9lZXByb21faTJjX3JlYWQoMHhDMCwgJihjZGF0YS0+c3F1YXJlX2xlblswXSksIDgpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZmFpbDsKLQlyYyA9IHFzX3M1azRlMV9lZXByb21faTJjX3JlYWQoMHhDOCwgJihjZGF0YS0+Zm9jYWxfbGVuWzBdKSwgOCk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBmYWlsOwotCXJjID0gcXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZCgweEQwLCAmKGNkYXRhLT5waXhlbF9waXRjaFswXSksIDgpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZmFpbDsKLQlyYyA9IHFzX3M1azRlMV9lZXByb21faTJjX3JlYWRfYigweDEwMCwgJihjZGF0YS0+bGVmdF9yKSwgMSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBmYWlsOwotCXJjID0gcXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZF9iKDB4MTAxLCAmKGNkYXRhLT5yaWdodF9yKSwgMSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBmYWlsOwotCXJjID0gcXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZF9iKDB4MTAyLCAmKGNkYXRhLT5sZWZ0X2IpLCAxKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGZhaWw7Ci0JcmMgPSBxc19zNWs0ZTFfZWVwcm9tX2kyY19yZWFkX2IoMHgxMDMsICYoY2RhdGEtPnJpZ2h0X2IpLCAxKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGZhaWw7Ci0JcmMgPSBxc19zNWs0ZTFfZWVwcm9tX2kyY19yZWFkX2IoMHgxMDQsICYoY2RhdGEtPmxlZnRfZ2IpLCAxKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGZhaWw7Ci0JcmMgPSBxc19zNWs0ZTFfZWVwcm9tX2kyY19yZWFkX2IoMHgxMDUsICYoY2RhdGEtPnJpZ2h0X2diKSwgMSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBmYWlsOwotCXJjID0gcXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZF9iKDB4MTEwLCAmKGNkYXRhLT5sZWZ0X2FmX2ZhciksIDIpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZmFpbDsKLQlyYyA9IHFzX3M1azRlMV9lZXByb21faTJjX3JlYWRfYigweDExMiwgJihjZGF0YS0+cmlnaHRfYWZfZmFyKSwgMik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBmYWlsOwotCXJjID0gcXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZF9iKDB4MTE0LCAmKGNkYXRhLT5sZWZ0X2FmX21pZCksIDIpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZmFpbDsKLQlyYyA9IHFzX3M1azRlMV9lZXByb21faTJjX3JlYWRfYigweDExNiwgJihjZGF0YS0+cmlnaHRfYWZfbWlkKSwgMik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBmYWlsOwotCXJjID0gcXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZF9iKDB4MTE4LCAmKGNkYXRhLT5sZWZ0X2FmX3Nob3J0KSwgMik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBmYWlsOwotCXJjID0gcXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZF9iKDB4MTFBLCAmKGNkYXRhLT5yaWdodF9hZl9zaG9ydCksIDIpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZmFpbDsKLQlyYyA9IHFzX3M1azRlMV9lZXByb21faTJjX3JlYWRfYigweDExQywgJihjZGF0YS0+bGVmdF9hZl81dW0pLCAyKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGZhaWw7Ci0JcmMgPSBxc19zNWs0ZTFfZWVwcm9tX2kyY19yZWFkX2IoMHgxMUUsICYoY2RhdGEtPnJpZ2h0X2FmXzV1bSksIDIpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZmFpbDsKLQlyYyA9IHFzX3M1azRlMV9lZXByb21faTJjX3JlYWRfYigweDEyMCwgJihjZGF0YS0+bGVmdF9hZl81MHVwKSwgMik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBmYWlsOwotCXJjID0gcXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZF9iKDB4MTIyLCAmKGNkYXRhLT5yaWdodF9hZl81MHVwKSwgMik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBmYWlsOwotCXJjID0gcXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZF9iKDB4MTI0LCAmKGNkYXRhLT5sZWZ0X2FmXzUwZG93biksIDIpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZmFpbDsKLQlyYyA9IHFzX3M1azRlMV9lZXByb21faTJjX3JlYWRfYigweDEyNiwgJihjZGF0YS0+cmlnaHRfYWZfNTBkb3duKSwgMik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBmYWlsOwotCi0JcmV0dXJuIDA7Ci0KLWZhaWw6Ci0JY2FsaV9kYXRhX3N0YXR1cyA9IDA7Ci0JcmV0dXJuIC1FSU87Ci0KLX0KLXN0YXRpYyBpbnQzMl90IHFzX3M1azRlMV93cml0ZV9sZWZ0X2xzYyhjaGFyICpsZWZ0X2xzYywgaW50IHJ0KQotewotCXN0cnVjdCBxc19zNWs0ZTFfaTJjX3JlZ19jb25mICpwdHIgPSAoc3RydWN0IHFzX3M1azRlMV9pMmNfcmVnX2NvbmYgKikKLQkJKHFzX3M1azRlMV9yZWdzLnJlZ19sZW5zICsgcnQpOwotCWJyaWRnZV9pMmNfd3JpdGVfdygweDA2LCAweDAyKTsKLQlpZiAoIUxFTlNfU0hBREVfQ09ORklHKSB7Ci0JCXFzX3M1azRlMV9pMmNfd3JpdGVfYl9zZW5zb3IoMHgzMDk2LCAweDQwKTsKLQkJcXNfczVrNGUxX2kyY193cml0ZV9iX3RhYmxlKHB0ciwgcXNfczVrNGUxX3JlZ3MucmVnX2xlbnNfc2l6ZSk7Ci0JCWlmIChkZWZhdWx0X2xlbnNfc2hhZGUpCi0JCQlxc19zNWs0ZTFfaTJjX3dyaXRlX2JfdGFibGUocXNfczVrNGUxX3JlZ3MuCi0JCQlyZWdfZGVmYXVsdF9sZW5zLCBxc19zNWs0ZTFfcmVncy5yZWdfZGVmYXVsdF9sZW5zX3NpemUpOwotCQllbHNlIHsKLQkJCXFzX3M1azRlMV9pMmNfd3JpdGVfc2VxX3NlbnNvcigweDMyMDAsCi0JCQkJJmxlZnRfbHNjWzBdLCAyMTYpOwotCQkJcXNfczVrNGUxX2kyY193cml0ZV9zZXFfc2Vuc29yKDB4MzJEOCwKLQkJCQkmbGVmdF9sc2NbMjE2XSwgMjE2KTsKLQkJfQotCQlxc19zNWs0ZTFfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MzA5NiwgMHg2MCk7Ci0JCXFzX3M1azRlMV9pMmNfd3JpdGVfYl9zZW5zb3IoMHgzMDk2LCAweDQwKTsKLQl9IGVsc2UKLQkJcXNfczVrNGUxX2kyY193cml0ZV9iX3RhYmxlKHB0ciwgcXNfczVrNGUxX3JlZ3MucmVnX2xlbnNfc2l6ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHFzX3M1azRlMV93cml0ZV9yaWdodF9sc2MoY2hhciAqcmlnaHRfbHNjLCBpbnQgcnQpCi17Ci0Jc3RydWN0IHFzX3M1azRlMV9pMmNfcmVnX2NvbmYgKnB0ciA9IChzdHJ1Y3QgcXNfczVrNGUxX2kyY19yZWdfY29uZiAqKQotCQkocXNfczVrNGUxX3JlZ3MucmVnX2xlbnMgKyBydCk7Ci0JYnJpZGdlX2kyY193cml0ZV93KDB4MDYsIDB4MDEpOwotCWlmICghTEVOU19TSEFERV9DT05GSUcpIHsKLQkJcXNfczVrNGUxX2kyY193cml0ZV9iX3NlbnNvcigweDMwOTYsIDB4NDApOwotCQlxc19zNWs0ZTFfaTJjX3dyaXRlX2JfdGFibGUocHRyLCBxc19zNWs0ZTFfcmVncy5yZWdfbGVuc19zaXplKTsKLQkJaWYgKGRlZmF1bHRfbGVuc19zaGFkZSkKLQkJCXFzX3M1azRlMV9pMmNfd3JpdGVfYl90YWJsZShxc19zNWs0ZTFfcmVncy4KLQkJCXJlZ19kZWZhdWx0X2xlbnMsIHFzX3M1azRlMV9yZWdzLnJlZ19kZWZhdWx0X2xlbnNfc2l6ZSk7Ci0JCWVsc2UgewotCQkJcXNfczVrNGUxX2kyY193cml0ZV9zZXFfc2Vuc29yKDB4MzIwMCwKLQkJCQkmcmlnaHRfbHNjWzBdLCAyMTYpOwotCQkJcXNfczVrNGUxX2kyY193cml0ZV9zZXFfc2Vuc29yKDB4MzJEOCwKLQkJCQkmcmlnaHRfbHNjWzIxNl0sIDIxNik7Ci0JCX0KLQkJcXNfczVrNGUxX2kyY193cml0ZV9iX3NlbnNvcigweDMwOTYsIDB4NjApOwotCQlxc19zNWs0ZTFfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MzA5NiwgMHg0MCk7Ci0JfSBlbHNlCi0JCXFzX3M1azRlMV9pMmNfd3JpdGVfYl90YWJsZShwdHIsIHFzX3M1azRlMV9yZWdzLnJlZ19sZW5zX3NpemUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCBxc19zNWs0ZTFfd3JpdGVfbHNjKGNoYXIgKmxzYywgaW50IHJ0KQotewotCWlmIChxc19zNWs0ZTFfY3RybC0+Y2FtX21vZGUgPT0gTU9ERV8zRCkgewotCQlxc19zNWs0ZTFfd3JpdGVfbGVmdF9sc2MoJmxzY1swXSwgcnQpOwotCQlxc19zNWs0ZTFfd3JpdGVfcmlnaHRfbHNjKCZsc2NbNDMyXSwgcnQpOwotCQlicmlkZ2VfaTJjX3dyaXRlX3coMHgwNiwgMHgwMyk7Ci0JfSBlbHNlIGlmIChxc19zNWs0ZTFfY3RybC0+Y2FtX21vZGUgPT0gTU9ERV8yRF9MRUZUKQotCQlxc19zNWs0ZTFfd3JpdGVfbGVmdF9sc2MoJmxzY1swXSwgcnQpOwotCWVsc2UgaWYgKHFzX3M1azRlMV9jdHJsLT5jYW1fbW9kZSA9PSBNT0RFXzJEX1JJR0hUKQotCQlxc19zNWs0ZTFfd3JpdGVfcmlnaHRfbHNjKCZsc2NbNDMyXSwgcnQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCBxc19zNWs0ZTFfcmVhZF9sZWZ0X2xzYyhjaGFyICpsZWZ0X2xzYykKLXsKLQlxc19zNWs0ZTFfZWVwcm9tX2kyY19yZWFkKDB4MjAwLCAmbGVmdF9sc2NbMF0sIDIxNik7Ci0JcXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZCgweDJEOCwgJmxlZnRfbHNjWzIxNl0sIDIxNik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHFzX3M1azRlMV9yZWFkX3JpZ2h0X2xzYyhjaGFyICpyaWdodF9sc2MpCi17Ci0JcXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZCgweDNCMCwgJnJpZ2h0X2xzY1swXSwgMjE2KTsKLQlxc19zNWs0ZTFfZWVwcm9tX2kyY19yZWFkKDB4NDg4LCAmcmlnaHRfbHNjWzIxNl0sIDIxNik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHFzX3M1azRlMV9yZWFkX2xzYyhjaGFyICpsc2MpCi17Ci0JcXNfczVrNGUxX3JlYWRfbGVmdF9sc2MoJmxzY1swXSk7Ci0JcXNfczVrNGUxX3JlYWRfcmlnaHRfbHNjKCZsc2NbNDMyXSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHFzX3M1azRlMV9icmlkZ2VfcmVzZXQodm9pZCl7Ci0JdW5zaWduZWQgc2hvcnQgUmVnRGF0YSA9IDAsIEdQSU9JblN0YXRlID0gMDsKLQlpbnQzMl90IHJjID0gMDsKLQlyYyA9IGJyaWRnZV9pMmNfd3JpdGVfdygweDUwLCAweDAwKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGJyaWRnZV9mYWlsOwotCXJjID0gYnJpZGdlX2kyY193cml0ZV93KDB4NTMsIDB4MDApOwotCWlmIChyYyA8IDApCi0JCWdvdG8gYnJpZGdlX2ZhaWw7Ci0JbXNsZWVwKDMwKTsKLQlyYyA9IGJyaWRnZV9pMmNfd3JpdGVfdygweDUzLCAweDAxKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGJyaWRnZV9mYWlsOwotCW1zbGVlcCgzMCk7Ci0JcmMgPSBicmlkZ2VfaTJjX3dyaXRlX3coMHgwRSwgMHhGRkZGKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGVycjsKLQlyYyA9IGJyaWRnZV9pMmNfcmVhZCgweDU0LCAmUmVnRGF0YSwgMik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBlcnI7Ci0JcmMgPSBicmlkZ2VfaTJjX3dyaXRlX3coMHg1NCwgKFJlZ0RhdGEgfCAweDEpKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGVycjsKLQltc2xlZXAoMzApOwotCXJjID0gYnJpZGdlX2kyY19yZWFkKDB4NTQsICZSZWdEYXRhLCAyKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGVycjsKLQlyYyA9IGJyaWRnZV9pMmNfd3JpdGVfdygweDU0LCAoUmVnRGF0YSB8IDB4NCkpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZXJyOwotCXJjID0gYnJpZGdlX2kyY19yZWFkKDB4NTUsICZHUElPSW5TdGF0ZSwgMik7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBlcnI7Ci0JcmMgPSBicmlkZ2VfaTJjX3dyaXRlX3coMHg1NSwgKEdQSU9JblN0YXRlIHwgMHgxKSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBlcnI7Ci0JbXNsZWVwKDMwKTsKLQlyYyA9IGJyaWRnZV9pMmNfcmVhZCgweDU1LCAmR1BJT0luU3RhdGUsIDIpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZXJyOwotCXJjID0gYnJpZGdlX2kyY193cml0ZV93KDB4NTUsIChHUElPSW5TdGF0ZSB8IDB4NCkpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZXJyOwotCW1zbGVlcCgzMCk7Ci0JcmMgPSBicmlkZ2VfaTJjX3JlYWQoMHg1NSwgJkdQSU9JblN0YXRlLCAyKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGVycjsKLQlHUElPSW5TdGF0ZSA9ICgoR1BJT0luU3RhdGUgPj4gNCkgJiAweDEpOwotCi0JcmMgPSBicmlkZ2VfaTJjX3JlYWQoMHgwOCwgJkdQSU9JblN0YXRlLCAyKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGVycjsKLQlyYyA9IGJyaWRnZV9pMmNfd3JpdGVfdygweDA4LCBHUElPSW5TdGF0ZSB8IDB4NDAwMCk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBlcnI7Ci0JcmV0dXJuIHJjOwotCi1lcnI6Ci0JYnJpZGdlX2kyY193cml0ZV93KDB4NTMsIDB4MDApOwotCW1zbGVlcCgzMCk7Ci0KLWJyaWRnZV9mYWlsOgotCXJldHVybiByYzsKLQotfQotCi1zdGF0aWMgdm9pZCBxc19zNWs0ZTFfYnJpZGdlX2NvbmZpZyhpbnQgbW9kZSwgaW50IHJ0KQotewotCXVuc2lnbmVkIHNob3J0IFJlZ0RhdGEgPSAwOwotCWlmIChtb2RlID09IE1PREVfM0QpIHsKLQkJYnJpZGdlX2kyY19yZWFkKDB4NTQsICZSZWdEYXRhLCAyKTsKLQkJYnJpZGdlX2kyY193cml0ZV93KDB4NTQsIChSZWdEYXRhIHwgMHgyKSk7Ci0JCWJyaWRnZV9pMmNfd3JpdGVfdygweDU0LCAoUmVnRGF0YSB8IDB4YSkpOwotCQlicmlkZ2VfaTJjX3JlYWQoMHg1NSwgJlJlZ0RhdGEsIDIpOwotCQlicmlkZ2VfaTJjX3dyaXRlX3coMHg1NSwgKFJlZ0RhdGEgfCAweDIpKTsKLQkJYnJpZGdlX2kyY193cml0ZV93KDB4NTUsIChSZWdEYXRhIHwgMHhhKSk7Ci0JCWJyaWRnZV9pMmNfd3JpdGVfdygweDE0LCAweDBDKTsKLQkJbXNsZWVwKDIwKTsKLQkJYnJpZGdlX2kyY193cml0ZV93KDB4MTYsIDB4MDApOwotCQlicmlkZ2VfaTJjX3dyaXRlX3coMHg1MSwgMHgzKTsKLQkJYnJpZGdlX2kyY193cml0ZV93KDB4NTIsIDB4MSk7Ci0JCWJyaWRnZV9pMmNfd3JpdGVfdygweDA2LCAweDAzKTsKLQkJYnJpZGdlX2kyY193cml0ZV93KDB4MDQsIDB4MjAxOCk7Ci0JCWJyaWRnZV9pMmNfd3JpdGVfdygweDUwLCAweDAwKTsKLQl9IGVsc2UgaWYgKG1vZGUgPT0gTU9ERV8yRF9SSUdIVCkgewotCQlicmlkZ2VfaTJjX3JlYWQoMHg1NCwgJlJlZ0RhdGEsIDIpOwotCQlSZWdEYXRhIHw9IDB4MjsKLQkJYnJpZGdlX2kyY193cml0ZV93KDB4NTQsIFJlZ0RhdGEpOwotCQlicmlkZ2VfaTJjX3dyaXRlX3coMHg1NCwgKFJlZ0RhdGEgJiB+KDB4OCkpKTsKLQkJYnJpZGdlX2kyY19yZWFkKDB4NTUsICZSZWdEYXRhLCAyKTsKLQkJUmVnRGF0YSB8PSAweDI7Ci0JCWJyaWRnZV9pMmNfd3JpdGVfdygweDU1LCBSZWdEYXRhKTsKLQkJYnJpZGdlX2kyY193cml0ZV93KDB4NTUsIChSZWdEYXRhICYgfigweDgpKSk7Ci0JCWJyaWRnZV9pMmNfd3JpdGVfdygweDE0LCAweDA0KTsKLQkJbXNsZWVwKDIwKTsKLQkJYnJpZGdlX2kyY193cml0ZV93KDB4NTEsIDB4Myk7Ci0JCWJyaWRnZV9pMmNfd3JpdGVfdygweDA2LCAweDAxKTsKLQkJYnJpZGdlX2kyY193cml0ZV93KDB4MDQsIDB4MjAxOCk7Ci0JCWJyaWRnZV9pMmNfd3JpdGVfdygweDUwLCAweDAxKTsKLQl9IGVsc2UgaWYgKG1vZGUgPT0gTU9ERV8yRF9MRUZUKSB7Ci0JCWJyaWRnZV9pMmNfcmVhZCgweDU0LCAmUmVnRGF0YSwgMik7Ci0JCVJlZ0RhdGEgfD0gMHg4OwotCQlicmlkZ2VfaTJjX3dyaXRlX3coMHg1NCwgUmVnRGF0YSk7Ci0JCWJyaWRnZV9pMmNfd3JpdGVfdygweDU0LCAoUmVnRGF0YSAmIH4oMHgyKSkpOwotCQlicmlkZ2VfaTJjX3JlYWQoMHg1NSwgJlJlZ0RhdGEsIDIpOwotCQlSZWdEYXRhIHw9IDB4ODsKLQkJYnJpZGdlX2kyY193cml0ZV93KDB4NTUsIFJlZ0RhdGEpOwotCQlicmlkZ2VfaTJjX3dyaXRlX3coMHg1NSwgKFJlZ0RhdGEgJiB+KDB4MikpKTsKLQkJYnJpZGdlX2kyY193cml0ZV93KDB4MTQsIDB4MDgpOwotCQltc2xlZXAoMjApOwotCQlicmlkZ2VfaTJjX3dyaXRlX3coMHg1MSwgMHgzKTsKLQkJYnJpZGdlX2kyY193cml0ZV93KDB4MDYsIDB4MDIpOwotCQlicmlkZ2VfaTJjX3dyaXRlX3coMHgwNCwgMHgyMDE4KTsKLQkJYnJpZGdlX2kyY193cml0ZV93KDB4NTAsIDB4MDIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcXNfczVrNGUxX2dyb3VwX2hvbGRfb24odm9pZCkKLXsKLQlxc19zNWs0ZTFfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJCQkJR1JPVVBFRF9QQVJBTUVURVJfSE9MRCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHFzX3M1azRlMV9ncm91cF9ob2xkX29mZih2b2lkKQotewotCXFzX3M1azRlMV9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQkJCQlHUk9VUEVEX1BBUkFNRVRFUl9IT0xEX09GRik7Ci19Ci0KLXN0YXRpYyB2b2lkIHFzX3M1azRlMV9zdGFydF9zdHJlYW0odm9pZCkKLXsKLQlxc19zNWs0ZTFfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MDEwMCwgMHgwMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHFzX3M1azRlMV9zdG9wX3N0cmVhbSh2b2lkKQotewotCXFzX3M1azRlMV9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwMTAwLCAweDAwKTsKLX0KLQotc3RhdGljIHZvaWQgcXNfczVrNGUxX2dldF9waWN0X2Zwcyh1aW50MTZfdCBmcHMsIHVpbnQxNl90ICpwZnBzKQotewotCS8qIGlucHV0IGZwcyBpcyBwcmV2aWV3IGZwcyBpbiBROCBmb3JtYXQgKi8KLQl1aW50MzJfdCBkaXZpZGVyLCBkMSwgZDI7Ci0KLQlkMSA9IHByZXZfZnJhbWVfbGVuZ3RoX2xpbmVzICogMHgwMDAwMDQwMCAvIHNuYXBfZnJhbWVfbGVuZ3RoX2xpbmVzOwotCWQyID0gcHJldl9saW5lX2xlbmd0aF9wY2sgKiAweDAwMDAwNDAwIC8gc25hcF9saW5lX2xlbmd0aF9wY2s7Ci0JZGl2aWRlciA9IGQxICogZDIgLyAweDQwMDsKLQotCS8qVmVyaWZ5IFBDTEsgc2V0dGluZ3MgYW5kIGZyYW1lIHNpemVzLiovCi0JKnBmcHMgPSAodWludDE2X3QpIChmcHMgKiBkaXZpZGVyIC8gMHg0MDApOwotCS8qIDIgaXMgdGhlIHJhdGlvIG9mIG5vLm9mIHNuYXBzaG90IGNoYW5uZWxzCi0JdG8gbnVtYmVyIG9mIHByZXZpZXcgY2hhbm5lbHMgKi8KLX0KLQotc3RhdGljIHVpbnQxNl90IHFzX3M1azRlMV9nZXRfcHJldl9saW5lc19wZih2b2lkKQotewotCi0JcmV0dXJuIHByZXZfZnJhbWVfbGVuZ3RoX2xpbmVzOwotCi19Ci0KLXN0YXRpYyB1aW50MTZfdCBxc19zNWs0ZTFfZ2V0X3ByZXZfcGl4ZWxzX3BsKHZvaWQpCi17Ci0JcmV0dXJuIHByZXZfbGluZV9sZW5ndGhfcGNrOwotCi19Ci0KLXN0YXRpYyB1aW50MTZfdCBxc19zNWs0ZTFfZ2V0X3BpY3RfbGluZXNfcGYodm9pZCkKLXsKLQlyZXR1cm4gc25hcF9mcmFtZV9sZW5ndGhfbGluZXM7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBxc19zNWs0ZTFfZ2V0X3BpY3RfcGl4ZWxzX3BsKHZvaWQpCi17Ci0JcmV0dXJuIHNuYXBfbGluZV9sZW5ndGhfcGNrOwotfQotCi0KLXN0YXRpYyB1aW50MzJfdCBxc19zNWs0ZTFfZ2V0X3BpY3RfbWF4X2V4cF9sYyh2b2lkKQotewotCXJldHVybiBzbmFwX2ZyYW1lX2xlbmd0aF9saW5lcyAgKiAyNDsKLX0KLQotc3RhdGljIGludDMyX3QgcXNfczVrNGUxX3NldF9mcHMoc3RydWN0IGZwc19jZmcgICAqZnBzKQotewotCXVpbnQxNl90IHRvdGFsX2xpbmVzX3Blcl9mcmFtZTsKLQlpbnQzMl90IHJjID0gMDsKLQlxc19zNWs0ZTFfY3RybC0+ZnBzX2RpdmlkZXIgPSBmcHMtPmZwc19kaXY7Ci0JcXNfczVrNGUxX2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIgPSBmcHMtPnBpY3RfZnBzX2RpdjsKLQlpZiAocXNfczVrNGUxX2N0cmwtPnNlbnNvcm1vZGUgPT0gU0VOU09SX1BSRVZJRVdfTU9ERSkgewotCQl0b3RhbF9saW5lc19wZXJfZnJhbWUgPSAodWludDE2X3QpCi0JCSgocHJldl9mcmFtZV9sZW5ndGhfbGluZXMpICogcXNfczVrNGUxX2N0cmwtPmZwc19kaXZpZGVyLzB4NDAwKTsKLQl9IGVsc2UgewotCQl0b3RhbF9saW5lc19wZXJfZnJhbWUgPSAodWludDE2X3QpCi0JCSgoc25hcF9mcmFtZV9sZW5ndGhfbGluZXMpICoKLQkJCXFzX3M1azRlMV9jdHJsLT5waWN0X2Zwc19kaXZpZGVyLzB4NDAwKTsKLQl9Ci0JcXNfczVrNGUxX2dyb3VwX2hvbGRfb24oKTsKLQlyYyA9IHFzX3M1azRlMV9pMmNfd3JpdGVfd19zZW5zb3IoUkVHX0ZSQU1FX0xFTkdUSF9MSU5FUywKLQkJCQkJCQl0b3RhbF9saW5lc19wZXJfZnJhbWUpOwotCXFzX3M1azRlMV9ncm91cF9ob2xkX29mZigpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgcXNfczVrNGUxX3dyaXRlX2V4cF9nYWluKHN0cnVjdCBzZW5zb3JfM2RfZXhwX2NmZyBleHBfY2ZnKQotewotCXVpbnQxNl90IG1heF9sZWdhbF9nYWluID0gMHgwMjAwOwotCXVpbnQzMl90IGxsX3BjaywgZmxfbGluZXM7Ci0JdWludDE2X3QgZ2FpbiA9IGV4cF9jZmcuZ2FpbjsKLQl1aW50MzJfdCBsaW5lID0gZXhwX2NmZy5saW5lOwotCWludDMyX3QgcmMgPSAwOwotCWlmIChnYWluID4gbWF4X2xlZ2FsX2dhaW4pIHsKLQkJQ0RCRygiTWF4IGxlZ2FsIGdhaW4gTGluZTolZFxuIiwgX19MSU5FX18pOwotCQlnYWluID0gbWF4X2xlZ2FsX2dhaW47Ci0JfQotCUNEQkcoInFzX3M1azRlMV93cml0ZV9leHBfZ2FpbiA6IGdhaW4gPSAlZCBsaW5lID0gJWRcbiIsIGdhaW4sIGxpbmUpOwotCi0JaWYgKHFzX3M1azRlMV9jdHJsLT5zZW5zb3Jtb2RlID09IFNFTlNPUl9QUkVWSUVXX01PREUpIHsKLQkJcXNfczVrNGUxX2N0cmwtPm15X3JlZ19nYWluID0gZ2FpbjsKLQkJcXNfczVrNGUxX2N0cmwtPm15X3JlZ19saW5lX2NvdW50ID0gKHVpbnQxNl90KSBsaW5lOwotCQlmbF9saW5lcyA9IHByZXZfZnJhbWVfbGVuZ3RoX2xpbmVzICoKLQkJCXFzX3M1azRlMV9jdHJsLT5mcHNfZGl2aWRlciAvIDB4NDAwOwotCQlsbF9wY2sgPSBwcmV2X2xpbmVfbGVuZ3RoX3BjazsKLQl9IGVsc2UgewotCQlmbF9saW5lcyA9IHNuYXBfZnJhbWVfbGVuZ3RoX2xpbmVzICoKLQkJCXFzX3M1azRlMV9jdHJsLT5waWN0X2Zwc19kaXZpZGVyIC8gMHg0MDA7Ci0JCWxsX3BjayA9IHNuYXBfbGluZV9sZW5ndGhfcGNrOwotCX0KLQlpZiAobGluZSA+IChmbF9saW5lcyAtIFFTX1M1SzRFMV9PRkZTRVQpKQotCQlmbF9saW5lcyA9IGxpbmUgKyBRU19TNUs0RTFfT0ZGU0VUOwotCXFzX3M1azRlMV9ncm91cF9ob2xkX29uKCk7Ci0JcmMgPSBxc19zNWs0ZTFfaTJjX3dyaXRlX3dfc2Vuc29yKFJFR19HTE9CQUxfR0FJTiwgZ2Fpbik7Ci0JcmMgPSBxc19zNWs0ZTFfaTJjX3dyaXRlX3dfc2Vuc29yKFJFR19GUkFNRV9MRU5HVEhfTElORVMsIGZsX2xpbmVzKTsKLQlyYyA9IHFzX3M1azRlMV9pMmNfd3JpdGVfd19zZW5zb3IoUkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FLCBsaW5lKTsKLQlpZiAoKHFzX3M1azRlMV9jdHJsLT5jYW1fbW9kZSA9PSBNT0RFXzNEKSAmJiAoY2FsaV9kYXRhX3N0YXR1cyA9PSAxKSkgewotCQlicmlkZ2VfaTJjX3dyaXRlX3coMHgwNiwgMHgwMSk7Ci0JCXJjID0gcXNfczVrNGUxX2kyY193cml0ZV93X3NlbnNvcihSRUdfR0xPQkFMX0dBSU4sCi0JCQkgZXhwX2NmZy5nYWluX2FkanVzdCk7Ci0JCXJjID0gcXNfczVrNGUxX2kyY193cml0ZV93X3NlbnNvcihSRUdfR1JfR0FJTiwgZXhwX2NmZy5ncl9nYWluKTsKLQkJcmMgPSBxc19zNWs0ZTFfaTJjX3dyaXRlX3dfc2Vuc29yKFJFR19SX0dBSU4sCi0JCQkJZXhwX2NmZy5yX2dhaW4pOwotCQlyYyA9IHFzX3M1azRlMV9pMmNfd3JpdGVfd19zZW5zb3IoUkVHX0JfR0FJTiwKLQkJCQlleHBfY2ZnLmJfZ2Fpbik7Ci0JCXJjID0gcXNfczVrNGUxX2kyY193cml0ZV93X3NlbnNvcihSRUdfR0JfR0FJTiwKLQkJCQlleHBfY2ZnLmdiX2dhaW4pOwotCQlicmlkZ2VfaTJjX3dyaXRlX3coMHgwNiwgMHgwMyk7Ci0JfQotCXFzX3M1azRlMV9ncm91cF9ob2xkX29mZigpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgcXNfczVrNGUxX3NldF9waWN0X2V4cF9nYWluKHN0cnVjdCBzZW5zb3JfM2RfZXhwX2NmZyBleHBfY2ZnKQotewotCWludDMyX3QgcmMgPSAwOwotCXJjID0gcXNfczVrNGUxX3dyaXRlX2V4cF9nYWluKGV4cF9jZmcpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgcXNfczVrNGUxX3dyaXRlX2ZvY3VzX3ZhbHVlKHVpbnQxNl90IGNvZGVfdmFsdWUpCi17Ci0JdWludDhfdCBjb2RlX3ZhbF9tc2IsIGNvZGVfdmFsX2xzYjsKLQlpZiAoKHFzX3M1azRlMV9jdHJsLT5jYW1fbW9kZSA9PSBNT0RFXzJEX0xFRlQpIHx8Ci0JCShxc19zNWs0ZTFfY3RybC0+Y2FtX21vZGUgPT0gTU9ERV8zRCkpIHsKLQkJLyogTGVmdCAqLwotCQlicmlkZ2VfaTJjX3dyaXRlX3coMHgwNiwgMHgwMik7Ci0JCUNEQkcoIiVzOiBMZWZ0IExlbnMgUG9zaXRpb246ICVkXG4iLCBfX2Z1bmNfXywKLQkJCWNvZGVfdmFsdWUpOwotCQljb2RlX3ZhbF9tc2IgPSBjb2RlX3ZhbHVlID4+IDQ7Ci0JCWNvZGVfdmFsX2xzYiA9IChjb2RlX3ZhbHVlICYgMHgwMDBGKSA8PCA0OwotCQljb2RlX3ZhbF9sc2IgfD0gcXNfczVrNGUxX2FmX21vZGU7Ci0JCWlmIChhZl9pMmNfd3JpdGVfYl9zZW5zb3IoY29kZV92YWxfbXNiLCBjb2RlX3ZhbF9sc2IpIDwgMCkgewotCQkJQ0RCRygibW92ZV9mb2N1cyBmYWlsZWQgYXQgbGluZSAlZCAuLi5cbiIsIF9fTElORV9fKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQl9Ci0KLQlpZiAoKHFzX3M1azRlMV9jdHJsLT5jYW1fbW9kZSA9PSBNT0RFXzJEX1JJR0hUKSB8fAotCQkocXNfczVrNGUxX2N0cmwtPmNhbV9tb2RlID09IE1PREVfM0QpKSB7Ci0JCS8qIFJpZ2h0ICovCi0JCWJyaWRnZV9pMmNfd3JpdGVfdygweDA2LCAweDAxKTsKLQkJY29kZV92YWx1ZSArPSBxc19zNWs0ZTFfYWZfcmlnaHRfYWRqdXN0OwotCQlDREJHKCIlczogUmlnaHQgTGVucyBQb3NpdGlvbjogJWRcbiIsIF9fZnVuY19fLAotCQkJY29kZV92YWx1ZSk7Ci0JCWNvZGVfdmFsX21zYiA9IGNvZGVfdmFsdWUgPj4gNDsKLQkJY29kZV92YWxfbHNiID0gKGNvZGVfdmFsdWUgJiAweDAwMEYpIDw8IDQ7Ci0JCWNvZGVfdmFsX2xzYiB8PSBxc19zNWs0ZTFfYWZfbW9kZTsKLQkJaWYgKGFmX2kyY193cml0ZV9iX3NlbnNvcihjb2RlX3ZhbF9tc2IsIGNvZGVfdmFsX2xzYikgPCAwKSB7Ci0JCQlDREJHKCJtb3ZlX2ZvY3VzIGZhaWxlZCBhdCBsaW5lICVkIC4uLlxuIiwgX19MSU5FX18pOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCX0KLQotCWlmIChxc19zNWs0ZTFfY3RybC0+Y2FtX21vZGUgPT0gTU9ERV8zRCkgewotCQkvKiAzRCBNb2RlICovCi0JCWJyaWRnZV9pMmNfd3JpdGVfdygweDA2LCAweDAzKTsKLQl9Ci0JdXNsZWVwKHFzX3M1azRlMV9zd19kYW1waW5nX3RpbWVfd2FpdCo1MCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHFzX3M1azRlMV93cml0ZV8xRF9mb2N1c192YWx1ZSh1aW50MTZfdCBjb2RlX3ZhbHVlKQotewotCXVpbnQ4X3QgY29kZV92YWxfbXNiLCBjb2RlX3ZhbF9sc2I7Ci0JQ0RCRygiJXM6IExlbnMgUG9zaXRpb246ICVkXG4iLCBfX2Z1bmNfXywgY29kZV92YWx1ZSk7Ci0JY29kZV92YWxfbXNiID0gY29kZV92YWx1ZSA+PiA0OwotCWNvZGVfdmFsX2xzYiA9IChjb2RlX3ZhbHVlICYgMHgwMDBGKSA8PCA0OwotCWNvZGVfdmFsX2xzYiB8PSBxc19zNWs0ZTFfYWZfbW9kZTsKLQlpZiAoYWZfaTJjX3dyaXRlX2Jfc2Vuc29yKGNvZGVfdmFsX21zYiwgY29kZV92YWxfbHNiKSA8IDApIHsKLQkJQ0RCRygibW92ZV9mb2N1cyBmYWlsZWQgYXQgbGluZSAlZCAuLi5cbiIsIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQl1c2xlZXAocXNfczVrNGUxX3N3X2RhbXBpbmdfdGltZV93YWl0KjUwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgcXNfczVrNGUxX21vdmVfZm9jdXMoaW50IGRpcmVjdGlvbiwKLQlpbnQzMl90IG51bV9zdGVwcykKLXsKLQlpbnQxNl90IHN0ZXBfZGlyZWN0aW9uLCBhY3R1YWxfc3RlcCwgZGVzdF9sZW5zX3Bvc2l0aW9uLAotCQlkZXN0X3N0ZXBfcG9zaXRpb247Ci0JaW50MTZfdCBtYXhfc3RlcF9wb3N0aW9uID0gUVNfUzVLNEUxX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSOwotCUNEQkcoIkluc2lkZSAlc1xuIiwgX19mdW5jX18pOwotCWlmIChkaXJlY3Rpb24gPT0gTU9WRV9ORUFSKQotCQlzdGVwX2RpcmVjdGlvbiA9IDE7Ci0JZWxzZQotCQlzdGVwX2RpcmVjdGlvbiA9IC0xOwotCi0JYWN0dWFsX3N0ZXAgPSAoaW50MTZfdCkgKHN0ZXBfZGlyZWN0aW9uICogKGludDE2X3QpIG51bV9zdGVwcyk7Ci0JZGVzdF9zdGVwX3Bvc2l0aW9uID0gKGludDE2X3QpIChxc19zNWs0ZTFfY3RybC0+Y3Vycl9zdGVwX3BvcyArCi0JCWFjdHVhbF9zdGVwKTsKLQotCWlmIChxc19zNWs0ZTFfY3RybC0+Y2FtX21vZGUgPT0gTU9ERV8zRCkKLQkJbWF4X3N0ZXBfcG9zdGlvbiA9IFFTX1M1SzRFMV9UT1RBTF9TVEVQU18zRDsKLQotCWlmIChkZXN0X3N0ZXBfcG9zaXRpb24gPiBtYXhfc3RlcF9wb3N0aW9uKQotCQlkZXN0X3N0ZXBfcG9zaXRpb24gPSBtYXhfc3RlcF9wb3N0aW9uOwotCWVsc2UgaWYgKGRlc3Rfc3RlcF9wb3NpdGlvbiA8IDApCi0JCWRlc3Rfc3RlcF9wb3NpdGlvbiA9IDA7Ci0KLQlpZiAoZGVzdF9zdGVwX3Bvc2l0aW9uID09IHFzX3M1azRlMV9jdHJsLT5jdXJyX3N0ZXBfcG9zKSB7Ci0JCUNEQkcoIiVzIGN1ciBhbmQgZGVzdCBwb3MgYXJlIHNhbWVcbiIsIF9fZnVuY19fKTsKLQkJQ0RCRygiJXMgY3VyX3N0ZXBfcG9zOiVkXG4iLCBfX2Z1bmNfXywKLQkJCXFzX3M1azRlMV9jdHJsLT5jdXJyX3N0ZXBfcG9zKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHN0ZXBfZGlyZWN0aW9uIDwgMCkgewotCQlpZiAobnVtX3N0ZXBzID49IDIwKSB7Ci0JCQkvKiBzd2VlcGluZyB0b3dhcmRzIGFsbCB0aGUgd2F5IGluIGluZmluaXR5IGRpcmVjdGlvbiAqLwotCQkJcXNfczVrNGUxX2FmX21vZGUgPSAyOwotCQkJcXNfczVrNGUxX3N3X2RhbXBpbmdfdGltZV93YWl0ID0gODsKLQkJfSBlbHNlIGlmIChudW1fc3RlcHMgPD0gNCkgewotCQkJLyogcmV2ZXJzZSBzZWFyY2ggZHVyaW5nIG1hY3JvIG1vZGUgKi8KLQkJCXFzX3M1azRlMV9hZl9tb2RlID0gNDsKLQkJCXFzX3M1azRlMV9zd19kYW1waW5nX3RpbWVfd2FpdCA9IDE2OwotCQl9IGVsc2UgewotCQkJcXNfczVrNGUxX2FmX21vZGUgPSAzOwotCQkJcXNfczVrNGUxX3N3X2RhbXBpbmdfdGltZV93YWl0ID0gMTI7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBjb2Fyc2Ugc2VhcmNoIHRvd2FyZHMgbWFjcm8gZGlyZWN0aW9uICovCi0JCXFzX3M1azRlMV9hZl9tb2RlID0gNDsKLQkJcXNfczVrNGUxX3N3X2RhbXBpbmdfdGltZV93YWl0ID0gMTY7Ci0JfQotCi0JaWYgKHFzX3M1azRlMV9jdHJsLT5jYW1fbW9kZSA9PSBNT0RFXzNEKSB7Ci0JCS8qIExlZnQgKi8KLQkJYnJpZGdlX2kyY193cml0ZV93KDB4MDYsIDB4MDIpOwotCQlkZXN0X2xlbnNfcG9zaXRpb24gPQotCQkJcXNfczVrNGUxX3N0ZXBfcG9zaXRpb25fdGFibGVfbGVmdFtkZXN0X3N0ZXBfcG9zaXRpb25dOwotCQlpZiAocXNfczVrNGUxX3dyaXRlXzFEX2ZvY3VzX3ZhbHVlKGRlc3RfbGVuc19wb3NpdGlvbikgPCAwKSB7Ci0JCQlDREJHKCJtb3ZlX2ZvY3VzIGZhaWxlZCBhdCBsaW5lICVkIC4uLlxuIiwgX19MSU5FX18pOwotCQkJYnJpZGdlX2kyY193cml0ZV93KDB4MDYsIDB4MDMpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCQkvKiBLZWVwIGxlZnQgc2Vuc29yIGFzIHJlZmVyZW5jZSBhcyBBRiBzdGF0cyBpcyBmcm9tIGxlZnQgKi8KLQkJcXNfczVrNGUxX2N0cmwtPmN1cnJfc3RlcF9wb3MgPSBkZXN0X3N0ZXBfcG9zaXRpb247Ci0JCXFzX3M1azRlMV9jdHJsLT5jdXJyX2xlbnNfcG9zID0gZGVzdF9sZW5zX3Bvc2l0aW9uOwotCi0JCS8qIFJpZ2h0ICovCi0JCWJyaWRnZV9pMmNfd3JpdGVfdygweDA2LCAweDAxKTsKLQkJZGVzdF9sZW5zX3Bvc2l0aW9uID0KLQkJCXFzX3M1azRlMV9zdGVwX3Bvc2l0aW9uX3RhYmxlX3JpZ2h0W2Rlc3Rfc3RlcF9wb3NpdGlvbl07Ci0JCWlmIChxc19zNWs0ZTFfd3JpdGVfMURfZm9jdXNfdmFsdWUoZGVzdF9sZW5zX3Bvc2l0aW9uKSA8IDApIHsKLQkJCUNEQkcoIm1vdmVfZm9jdXMgZmFpbGVkIGF0IGxpbmUgJWQgLi4uXG4iLCBfX0xJTkVfXyk7Ci0JCQlicmlkZ2VfaTJjX3dyaXRlX3coMHgwNiwgMHgwMyk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0KLQkJLyogM0QgTW9kZSAqLwotCQlicmlkZ2VfaTJjX3dyaXRlX3coMHgwNiwgMHgwMyk7Ci0JCXJldHVybiAwOwotCX0KLQotCWRlc3RfbGVuc19wb3NpdGlvbiA9IHFzX3M1azRlMV9zdGVwX3Bvc2l0aW9uX3RhYmxlW2Rlc3Rfc3RlcF9wb3NpdGlvbl07Ci0JQ0RCRygiJXM6IFN0ZXAgUG9zaXRpb246ICVkXG4iLCBfX2Z1bmNfXywgZGVzdF9zdGVwX3Bvc2l0aW9uKTsKLQlpZiAocXNfczVrNGUxX2N0cmwtPmN1cnJfbGVuc19wb3MgIT0gZGVzdF9sZW5zX3Bvc2l0aW9uKSB7Ci0JCWlmIChxc19zNWs0ZTFfd3JpdGVfZm9jdXNfdmFsdWUoZGVzdF9sZW5zX3Bvc2l0aW9uKSA8IDApIHsKLQkJCUNEQkcoIm1vdmVfZm9jdXMgZmFpbGVkIGF0IGxpbmUgJWQgLi4uXG4iLCBfX0xJTkVfXyk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JfQotCi0JcXNfczVrNGUxX2N0cmwtPmN1cnJfc3RlcF9wb3MgPSBkZXN0X3N0ZXBfcG9zaXRpb247Ci0JcXNfczVrNGUxX2N0cmwtPmN1cnJfbGVuc19wb3MgPSBkZXN0X2xlbnNfcG9zaXRpb247Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHFzX3M1azRlMV9zZXRfZGVmYXVsdF9mb2N1cyh1aW50OF90IGFmX3N0ZXApCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JaWYgKHFzX3M1azRlMV9jdHJsLT5jdXJyX3N0ZXBfcG9zKSB7Ci0JCXJjID0gcXNfczVrNGUxX21vdmVfZm9jdXMoTU9WRV9GQVIsCi0JCQlxc19zNWs0ZTFfY3RybC0+Y3Vycl9zdGVwX3Bvcyk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfSBlbHNlIHsKLQkJaWYgKHFzX3M1azRlMV9jdHJsLT5jYW1fbW9kZSA9PSBNT0RFXzNEKSB7Ci0JCQkvKiBMZWZ0ICovCi0JCQlicmlkZ2VfaTJjX3dyaXRlX3coMHgwNiwgMHgwMik7Ci0JCQlyYyA9IHFzX3M1azRlMV93cml0ZV8xRF9mb2N1c192YWx1ZSgKLQkJCQlxc19zNWs0ZTFfc3RlcF9wb3NpdGlvbl90YWJsZV9sZWZ0WzBdKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlicmlkZ2VfaTJjX3dyaXRlX3coMHgwNiwgMHgwMyk7Ci0JCQkJcmV0dXJuIHJjOwotCQkJfQotCi0JCQkvKiBSaWdodCAqLwotCQkJYnJpZGdlX2kyY193cml0ZV93KDB4MDYsIDB4MDEpOwotCQkJcmMgPSBxc19zNWs0ZTFfd3JpdGVfMURfZm9jdXNfdmFsdWUoCi0JCQkJcXNfczVrNGUxX3N0ZXBfcG9zaXRpb25fdGFibGVfcmlnaHRbMF0pOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCWJyaWRnZV9pMmNfd3JpdGVfdygweDA2LCAweDAzKTsKLQkJCQlyZXR1cm4gcmM7Ci0JCQl9Ci0KLQkJCS8qIExlZnQgc2Vuc29yIGlzIHRoZSByZWZlcmVuY2Ugc2Vuc29yIGZvciBBRiBzdGF0cyAqLwotCQkJcXNfczVrNGUxX2N0cmwtPmN1cnJfbGVuc19wb3MgPQotCQkJCXFzX3M1azRlMV9zdGVwX3Bvc2l0aW9uX3RhYmxlX2xlZnRbMF07Ci0KLQkJCS8qIDNEIE1vZGUgKi8KLQkJCWJyaWRnZV9pMmNfd3JpdGVfdygweDA2LCAweDAzKTsKLQkJfSBlbHNlIHsKLQkJCXJjID0gcXNfczVrNGUxX3dyaXRlX2ZvY3VzX3ZhbHVlKAotCQkJCXFzX3M1azRlMV9zdGVwX3Bvc2l0aW9uX3RhYmxlWzBdKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJcXNfczVrNGUxX2N0cmwtPmN1cnJfbGVuc19wb3MgPQotCQkJCXFzX3M1azRlMV9zdGVwX3Bvc2l0aW9uX3RhYmxlWzBdOwotCQl9Ci0JfQotCUNEQkcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHFzX3M1azRlMV8zZF90YWJsZV9pbml0KHZvaWQpCi17Ci0JaW50MTZfdCBhZl9kYXRhID0gMDsKLQl1aW50MTZfdCBzdGVwID0gOCwgc3RlcF9xMiA9IDgsIGFuY2hvcl9wb2ludF9xMjsKLQlpbnQzMl90IHJjID0gMCwgaSwgajsKLQl1aW50MTZfdCBlZXByb21fcmVhZF9hZGRyWzJdWzNdID0ge3sweDExMCwgMHgxMTQsIDB4MTE4fSwKLQkJezB4MTEyLCAweDExNiwgMHgxMUF9IH07Ci0JdWludDE2X3QgKnN0ZXBfcG9zaXRpb25fdGFibGU7Ci0KLQlzdGVwX3Bvc2l0aW9uX3RhYmxlID0gcXNfczVrNGUxX3N0ZXBfcG9zaXRpb25fdGFibGVfbGVmdDsKLQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7Ci0JCXJjID0gcXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZF9iKGVlcHJvbV9yZWFkX2FkZHJbal1bMF0sCi0JCQkmYWZfZGF0YSwgMik7Ci0JCWlmIChyYyA9PSAwKSB7Ci0JCQlDREJHKCIlczogRmFyIGRhdGEgLSAlZFxuIiwgX19mdW5jX18sIGFmX2RhdGEpOwotCQkJc3RlcF9wb3NpdGlvbl90YWJsZVswXSA9IGFmX2RhdGE7Ci0JCX0gZWxzZSB7Ci0JCQlDREJHKCIlczogRUVQUk9NIGRhdGEgcmVhZCBlcnJvclxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcmMgPSBxc19zNWs0ZTFfZWVwcm9tX2kyY19yZWFkX2IoZWVwcm9tX3JlYWRfYWRkcltqXVsxXSwKLQkJCSZhZl9kYXRhLCAyKTsKLQkJaWYgKHJjID09IDApIHsKLQkJCUNEQkcoIiVzOiBNZWRpdW0gZGF0YSAtICVkXG4iLCBfX2Z1bmNfXywgYWZfZGF0YSk7Ci0JCQlzdGVwX3Bvc2l0aW9uX3RhYmxlWzJdID0gYWZfZGF0YTsKLQkJfSBlbHNlIHsKLQkJCUNEQkcoIiVzOiBFRVBST00gZGF0YSByZWFkIGVycm9yXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKgotCQkgKiBVc2luZyB0aGUgMTUwY20gYW5kIDEwMGNtIGNhbGlicmF0aW9uIHZhbHVlcwotCQkgKiBhcyBwZXIgdGhlIExlbnMgY2hhcmFjdGVyaXN0aWNzIGRlcml2ZSBpbnRlcm1lZGlhdGUgc3RlcAotCQkgKi8KLQkJc3RlcF9wb3NpdGlvbl90YWJsZVsxXSA9IHN0ZXBfcG9zaXRpb25fdGFibGVbMF0gKwotCQkJKHN0ZXBfcG9zaXRpb25fdGFibGVbMl0gLSBzdGVwX3Bvc2l0aW9uX3RhYmxlWzBdKS8yOwotCQlDREJHKCIlczogU3RlcCBiZXR3ZWVuIDE1MGNtOjEwMGNtIGlzICVkXG4iLCBfX2Z1bmNfXywKLQkJCXN0ZXBfcG9zaXRpb25fdGFibGVbMV0pOwotCi0JCXJjID0gcXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZF9iKGVlcHJvbV9yZWFkX2FkZHJbal1bMl0sCi0JCQkmYWZfZGF0YSwgMik7Ci0JCWlmIChyYyA9PSAwKSB7Ci0JCQlDREJHKCIlczogU2hvcnQgZGF0YSAtICVkXG4iLCBfX2Z1bmNfXywgYWZfZGF0YSk7Ci0JCQlzdGVwX3Bvc2l0aW9uX3RhYmxlWzZdID0gYWZfZGF0YTsKLQkJfSBlbHNlIHsKLQkJCUNEQkcoIiVzOiBFRVBST00gZGF0YSByZWFkIGVycm9yXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKgotCQkgKiBVc2luZyB0aGUgMTAwY20gYW5kIDUwY20gY2FsaWJyYXRpb24gdmFsdWVzCi0JCSAqIGFzIHBlciB0aGUgTGVucyBjaGFyYWN0ZXJpc3RpY3MgZGVyaXZlCi0JCSAqIGludGVybWVkaWF0ZSBzdGVwcwotCQkgKi8KLQkJc3RlcCA9IChzdGVwX3Bvc2l0aW9uX3RhYmxlWzZdIC0gc3RlcF9wb3NpdGlvbl90YWJsZVsyXSkvNDsKLQotCQkvKgotCQkgKiBJbnRlcnBvbGF0ZSB0aGUgaW50ZXJtZWRpYXRlIHN0ZXBzIGJldHdlZW4gMTAwY20KLQkJICogdG8gNTBjbSBiYXNlZCBvbiBDT0MxLjUKLQkJICovCi0JCXN0ZXBfcG9zaXRpb25fdGFibGVbM10gPSBzdGVwX3Bvc2l0aW9uX3RhYmxlWzJdICsgc3RlcDsKLQkJc3RlcF9wb3NpdGlvbl90YWJsZVs0XSA9IHN0ZXBfcG9zaXRpb25fdGFibGVbM10gKyBzdGVwOwotCQlzdGVwX3Bvc2l0aW9uX3RhYmxlWzVdID0gc3RlcF9wb3NpdGlvbl90YWJsZVs0XSArIHN0ZXA7Ci0KLQkJLyoKLQkJICogRXh0cmFwb2xhdGUgdGhlIHN0ZXBzIHdpdGhpbiA1MGNtIGJhc2VkIG9uCi0JCSAqIE9DMiB0byBjb252ZXJnZSBmYXN0ZXIuIFRoaXMgcmFuZ2UgaXMgYmV5b25kIHRoZSAzRAotCQkgKiBzcGVjaWZpY2F0aW9uIG9mIDUwY20KLQkJICovCi0JCWFuY2hvcl9wb2ludF9xMiA9IHN0ZXBfcG9zaXRpb25fdGFibGVbNl0gPDwgMTsKLQkJc3RlcF9xMiA9IChzdGVwX3Bvc2l0aW9uX3RhYmxlWzZdIC0gc3RlcF9wb3NpdGlvbl90YWJsZVsyXSk7Ci0KLQkJZm9yIChpID0gNzsgaSA8IFFTX1M1SzRFMV9UT1RBTF9TVEVQU18zRDsgaSsrKSB7Ci0JCQlhbmNob3JfcG9pbnRfcTIgKz0gc3RlcF9xMjsKLQkJCXN0ZXBfcG9zaXRpb25fdGFibGVbaV0gPSBhbmNob3JfcG9pbnRfcTIgPj4gMTsKLQkJfQotCQlzdGVwX3Bvc2l0aW9uX3RhYmxlID0gcXNfczVrNGUxX3N0ZXBfcG9zaXRpb25fdGFibGVfcmlnaHQ7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBxc19zNWs0ZTFfaW5pdF9mb2N1cyh2b2lkKQotewotCXVpbnQ4X3QgaTsKLQlpbnQzMl90IHJjID0gMDsKLQlpbnQxNl90IGFmX2Zhcl9kYXRhID0gMDsKLQlxc19zNWs0ZTFfYWZfaW5pdGlhbF9jb2RlID0gMTkwOwotCS8qIFJlYWQgdGhlIGNhbGlicmF0aW9uIGRhdGEgZnJvbSBsZWZ0IGFuZCByaWdodCBzZW5zb3JzIGlmIGF2YWlsYWJsZSAqLwotCXJjID0gcXNfczVrNGUxX2VlcHJvbV9pMmNfcmVhZF9iKDB4MTEwLCAmYWZfZmFyX2RhdGEsIDIpOwotCWlmIChyYyA9PSAwKSB7Ci0JCUNEQkcoIiVzOiBMZWZ0IEZhciBkYXRhIC0gJWRcbiIsIF9fZnVuY19fLCBhZl9mYXJfZGF0YSk7Ci0JCXFzX3M1azRlMV9hZl9pbml0aWFsX2NvZGUgPSBhZl9mYXJfZGF0YTsKLQl9Ci0KLQlyYyA9IHFzX3M1azRlMV9lZXByb21faTJjX3JlYWRfYigweDExMiwgJmFmX2Zhcl9kYXRhLCAyKTsKLQlpZiAocmMgPT0gMCkgewotCQlDREJHKCIlczogUmlnaHQgRmFyIGRhdGEgLSAlZFxuIiwgX19mdW5jX18sIGFmX2Zhcl9kYXRhKTsKLQkJcXNfczVrNGUxX2FmX3JpZ2h0X2FkanVzdCA9IGFmX2Zhcl9kYXRhIC0KLQkJCXFzX3M1azRlMV9hZl9pbml0aWFsX2NvZGU7Ci0JfQotCi0JcXNfczVrNGUxXzNkX3RhYmxlX2luaXQoKTsKLQotCXFzX3M1azRlMV9zdGVwX3Bvc2l0aW9uX3RhYmxlWzBdID0gcXNfczVrNGUxX2FmX2luaXRpYWxfY29kZTsKLQlmb3IgKGkgPSAxOyBpIDw9IFFTX1M1SzRFMV9UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUjsgaSsrKSB7Ci0JCWlmIChpIDw9IHFzX3M1azRlMV9ubF9yZWdpb25fYm91bmRhcnkxKSB7Ci0JCQlxc19zNWs0ZTFfc3RlcF9wb3NpdGlvbl90YWJsZVtpXSA9Ci0JCQkJcXNfczVrNGUxX3N0ZXBfcG9zaXRpb25fdGFibGVbaS0xXQotCQkJCSsgcXNfczVrNGUxX25sX3JlZ2lvbl9jb2RlX3Blcl9zdGVwMTsKLQkJfSBlbHNlIHsKLQkJCXFzX3M1azRlMV9zdGVwX3Bvc2l0aW9uX3RhYmxlW2ldID0KLQkJCQlxc19zNWs0ZTFfc3RlcF9wb3NpdGlvbl90YWJsZVtpLTFdCi0JCQkJKyBxc19zNWs0ZTFfbF9yZWdpb25fY29kZV9wZXJfc3RlcDsKLQkJfQotCi0JCWlmIChxc19zNWs0ZTFfc3RlcF9wb3NpdGlvbl90YWJsZVtpXSA+IDEwMjMpCi0JCQlxc19zNWs0ZTFfc3RlcF9wb3NpdGlvbl90YWJsZVtpXSA9IDEwMjM7Ci0JfQotCXFzX3M1azRlMV9jdHJsLT5jdXJyX3N0ZXBfcG9zID0gMDsKLX0KLQotc3RhdGljIGludDMyX3QgcXNfczVrNGUxX3Rlc3QoZW51bSBxc19zNWs0ZTFfdGVzdF9tb2RlX3QgbW8pCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JaWYgKG1vID09IFRFU1RfT0ZGKQotCQlyZXR1cm4gcmM7Ci0JZWxzZSB7Ci0JCS8qIFJFR18weDMwRDhbNF0gaXMgVEVTQllQRU46IDA6IE5vcm1hbCBPcGVyYXRpb24sCi0JCTE6IEJ5cGFzcyBTaWduYWwgUHJvY2Vzc2luZwotCQlSRUdfMHgzMEQ4WzVdIGlzIEVCRE1BU0s6IDA6Ci0JCU91dHB1dCBFbWJlZGRlZCBkYXRhLCAxOiBObyBvdXRwdXQgZW1iZWRkZWQgZGF0YSAqLwotCQlpZiAocXNfczVrNGUxX2kyY193cml0ZV9iX3NlbnNvcihSRUdfVEVTVF9QQVRURVJOX01PREUsCi0JCQkodWludDhfdCkgbW8pIDwgMCkgewotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgcXNfczVrNGUxX3NlbnNvcl9zZXR0aW5nKGludCB1cGRhdGVfdHlwZSwgaW50IHJ0KQotewotCi0JaW50MzJfdCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfY3NpX3BhcmFtcyBxc19zNWs0ZTFfY3NpX3BhcmFtczsKLQotCXFzX3M1azRlMV9zdG9wX3N0cmVhbSgpOwotCW1zbGVlcCg4MCk7Ci0JYnJpZGdlX2kyY193cml0ZV93KDB4NTMsIDB4MDApOwotCW1zbGVlcCg4MCk7Ci0JaWYgKHVwZGF0ZV90eXBlID09IFJFR19JTklUKSB7Ci0JCUNTSV9DT05GSUcgPSAwOwotCQlMRU5TX1NIQURFX0NPTkZJRyA9IDA7Ci0JCWRlZmF1bHRfbGVuc19zaGFkZSA9IDA7Ci0JCWJyaWRnZV9pMmNfd3JpdGVfdygweDUzLCAweDAxKTsKLQkJbXNsZWVwKDMwKTsKLQkJcXNfczVrNGUxX2JyaWRnZV9jb25maWcocXNfczVrNGUxX2N0cmwtPmNhbV9tb2RlLCBydCk7Ci0JCW1zbGVlcCgzMCk7Ci0JCXFzX3M1azRlMV9pMmNfd3JpdGVfYl90YWJsZShxc19zNWs0ZTFfcmVncy5yZWNfc2V0dGluZ3MsCi0JCQkJcXNfczVrNGUxX3JlZ3MucmVjX3NpemUpOwotCQltc2xlZXAoMzApOwotCX0gZWxzZSBpZiAodXBkYXRlX3R5cGUgPT0gVVBEQVRFX1BFUklPRElDKSB7Ci0JCXFzX3M1azRlMV93cml0ZV9sc2MobGVuc19lZXByb21fZGF0YSwgcnQpOwotCQltc2xlZXAoMTAwKTsKLQkJaWYgKCFDU0lfQ09ORklHKSB7Ci0JCQlpZiAocXNfczVrNGUxX2N0cmwtPmNhbV9tb2RlID09IE1PREVfM0QpIHsKLQkJCQlxc19zNWs0ZTFfY3NpX3BhcmFtcy5sYW5lX2NudCA9IDQ7Ci0JCQkJcXNfczVrNGUxX2NzaV9wYXJhbXMuZGF0YV9mb3JtYXQgPSBDU0lfOEJJVDsKLQkJCX0gZWxzZSB7Ci0JCQkJcXNfczVrNGUxX2NzaV9wYXJhbXMubGFuZV9jbnQgPSAxOwotCQkJCXFzX3M1azRlMV9jc2lfcGFyYW1zLmRhdGFfZm9ybWF0ID0gQ1NJXzEwQklUOwotCQkJfQotCQkJcXNfczVrNGUxX2NzaV9wYXJhbXMubGFuZV9hc3NpZ24gPSAweGU0OwotCQkJcXNfczVrNGUxX2NzaV9wYXJhbXMuZHBjbV9zY2hlbWUgPSAwOwotCQkJcXNfczVrNGUxX2NzaV9wYXJhbXMuc2V0dGxlX2NudCA9IDI4OwotCQkJcmMgPSBtc21fY2FtaW9fY3NpX2NvbmZpZygmcXNfczVrNGUxX2NzaV9wYXJhbXMpOwotCQkJbXNsZWVwKDEwKTsKLQkJCWNhbV9kZWJ1Z19pbml0KCk7Ci0JCQlDU0lfQ09ORklHID0gMTsKLQkJfQotCQlicmlkZ2VfaTJjX3dyaXRlX3coMHg1MywgMHgwMSk7Ci0JCW1zbGVlcCg1MCk7Ci0JCXFzX3M1azRlMV9pMmNfd3JpdGVfYl90YWJsZShxc19zNWs0ZTFfcmVncy5jb25mX2FycmF5W3J0XS5jb25mLAotCQkJcXNfczVrNGUxX3JlZ3MuY29uZl9hcnJheVtydF0uc2l6ZSk7Ci0JCW1zbGVlcCg1MCk7Ci0JCXFzX3M1azRlMV9zdGFydF9zdHJlYW0oKTsKLQkJbXNsZWVwKDgwKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBxc19zNWs0ZTFfdmlkZW9fY29uZmlnKGludCBtb2RlKQotewotCi0JaW50MzJfdCByYyA9IDA7Ci0JLyogY2hhbmdlIHNlbnNvciByZXNvbHV0aW9uIGlmIG5lZWRlZCAqLwotCWlmIChxc19zNWs0ZTFfc2Vuc29yX3NldHRpbmcoVVBEQVRFX1BFUklPRElDLAotCQkJcXNfczVrNGUxX2N0cmwtPnByZXZfcmVzKSA8IDApCi0JCXJldHVybiByYzsKLQlpZiAocXNfczVrNGUxX2N0cmwtPnNldF90ZXN0KSB7Ci0JCWlmIChxc19zNWs0ZTFfdGVzdChxc19zNWs0ZTFfY3RybC0+c2V0X3Rlc3QpIDwgMCkKLQkJCXJldHVybiAgcmM7Ci0JfQotCi0JcXNfczVrNGUxX2N0cmwtPmN1cnJfcmVzID0gcXNfczVrNGUxX2N0cmwtPnByZXZfcmVzOwotCXFzX3M1azRlMV9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHFzX3M1azRlMV9zbmFwc2hvdF9jb25maWcoaW50IG1vZGUpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JLypjaGFuZ2Ugc2Vuc29yIHJlc29sdXRpb24gaWYgbmVlZGVkICovCi0JaWYgKHFzX3M1azRlMV9jdHJsLT5jdXJyX3JlcyAhPSBxc19zNWs0ZTFfY3RybC0+cGljdF9yZXMpIHsKLQkJaWYgKHFzX3M1azRlMV9zZW5zb3Jfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsCi0JCQkJcXNfczVrNGUxX2N0cmwtPnBpY3RfcmVzKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0JcXNfczVrNGUxX2N0cmwtPmN1cnJfcmVzID0gcXNfczVrNGUxX2N0cmwtPnBpY3RfcmVzOwotCXFzX3M1azRlMV9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19IC8qZW5kIG9mIHFzX3M1azRlMV9zbmFwc2hvdF9jb25maWcqLwotCi1zdGF0aWMgaW50MzJfdCBxc19zNWs0ZTFfcmF3X3NuYXBzaG90X2NvbmZpZyhpbnQgbW9kZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQkvKiBjaGFuZ2Ugc2Vuc29yIHJlc29sdXRpb24gaWYgbmVlZGVkICovCi0JaWYgKHFzX3M1azRlMV9jdHJsLT5jdXJyX3JlcyAhPSBxc19zNWs0ZTFfY3RybC0+cGljdF9yZXMpIHsKLQkJaWYgKHFzX3M1azRlMV9zZW5zb3Jfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsCi0JCQkJcXNfczVrNGUxX2N0cmwtPnBpY3RfcmVzKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0JcXNfczVrNGUxX2N0cmwtPmN1cnJfcmVzID0gcXNfczVrNGUxX2N0cmwtPnBpY3RfcmVzOwotCXFzX3M1azRlMV9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19IC8qZW5kIG9mIHFzX3M1azRlMV9yYXdfc25hcHNob3RfY29uZmlnKi8KLQotc3RhdGljIGludDMyX3QgcXNfczVrNGUxX21vZGVfaW5pdChpbnQgbW9kZSwgc3RydWN0IHNlbnNvcl9pbml0X2NmZyBpbml0X2luZm8pCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JaWYgKG1vZGUgIT0gcXNfczVrNGUxX2N0cmwtPmNhbV9tb2RlKSB7Ci0JCXFzX3M1azRlMV9jdHJsLT5wcmV2X3JlcyA9IGluaXRfaW5mby5wcmV2X3JlczsKLQkJcXNfczVrNGUxX2N0cmwtPnBpY3RfcmVzID0gaW5pdF9pbmZvLnBpY3RfcmVzOwotCQlxc19zNWs0ZTFfY3RybC0+Y2FtX21vZGUgPSBtb2RlOwotCi0JCXByZXZfZnJhbWVfbGVuZ3RoX2xpbmVzID0KLQkJKChxc19zNWs0ZTFfcmVncy5jb25mX2FycmF5W3FzX3M1azRlMV9jdHJsLT5wcmV2X3Jlc11cCi0JCQkuY29uZltRU19TNUs0RTFfRlJBTUVfTEVOR1RIX0xJTkVTX0hdLndkYXRhIDw8IDgpCi0JCQl8IHFzX3M1azRlMV9yZWdzLmNvbmZfYXJyYXlbcXNfczVrNGUxX2N0cmwtPnByZXZfcmVzXVwKLQkJCS5jb25mW1FTX1M1SzRFMV9GUkFNRV9MRU5HVEhfTElORVNfTF0ud2RhdGEpOwotCQlwcmV2X2xpbmVfbGVuZ3RoX3BjayA9Ci0JCShxc19zNWs0ZTFfcmVncy5jb25mX2FycmF5W3FzX3M1azRlMV9jdHJsLT5wcmV2X3Jlc11cCi0JCQkuY29uZltRU19TNUs0RTFfTElORV9MRU5HVEhfUENLX0hdLndkYXRhIDw8IDgpCi0JCQl8IHFzX3M1azRlMV9yZWdzLmNvbmZfYXJyYXlbcXNfczVrNGUxX2N0cmwtPnByZXZfcmVzXVwKLQkJCS5jb25mW1FTX1M1SzRFMV9MSU5FX0xFTkdUSF9QQ0tfTF0ud2RhdGE7Ci0JCXNuYXBfZnJhbWVfbGVuZ3RoX2xpbmVzID0KLQkJKHFzX3M1azRlMV9yZWdzLmNvbmZfYXJyYXlbcXNfczVrNGUxX2N0cmwtPnBpY3RfcmVzXVwKLQkJCS5jb25mW1FTX1M1SzRFMV9GUkFNRV9MRU5HVEhfTElORVNfSF0ud2RhdGEgPDwgOCkKLQkJCXwgcXNfczVrNGUxX3JlZ3MuY29uZl9hcnJheVtxc19zNWs0ZTFfY3RybC0+cGljdF9yZXNdXAotCQkJLmNvbmZbUVNfUzVLNEUxX0ZSQU1FX0xFTkdUSF9MSU5FU19MXS53ZGF0YTsKLQkJc25hcF9saW5lX2xlbmd0aF9wY2sgPQotCQkocXNfczVrNGUxX3JlZ3MuY29uZl9hcnJheVtxc19zNWs0ZTFfY3RybC0+cGljdF9yZXNdXAotCQkJLmNvbmZbUVNfUzVLNEUxX0xJTkVfTEVOR1RIX1BDS19IXS53ZGF0YSA8PCA4KQotCQkJfCBxc19zNWs0ZTFfcmVncy5jb25mX2FycmF5W3FzX3M1azRlMV9jdHJsLT5waWN0X3Jlc11cCi0JCQkuY29uZltRU19TNUs0RTFfTElORV9MRU5HVEhfUENLX0xdLndkYXRhOwotCi0JcmMgPSBxc19zNWs0ZTFfc2Vuc29yX3NldHRpbmcoUkVHX0lOSVQsCi0JCXFzX3M1azRlMV9jdHJsLT5wcmV2X3Jlcyk7Ci0JfQotCXJldHVybiByYzsKLX0KLXN0YXRpYyBpbnQzMl90IHFzX3M1azRlMV9zZXRfc2Vuc29yX21vZGUoaW50IG1vZGUsCi0JaW50IHJlcykKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFNFTlNPUl9QUkVWSUVXX01PREU6Ci0JCXFzX3M1azRlMV9jdHJsLT5wcmV2X3JlcyA9IHJlczsKLQkJcmMgPSBxc19zNWs0ZTFfdmlkZW9fY29uZmlnKG1vZGUpOwotCQlicmVhazsKLQljYXNlIFNFTlNPUl9TTkFQU0hPVF9NT0RFOgotCQlxc19zNWs0ZTFfY3RybC0+cGljdF9yZXMgPSByZXM7Ci0JCXJjID0gcXNfczVrNGUxX3NuYXBzaG90X2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfUkFXX1NOQVBTSE9UX01PREU6Ci0JCXFzX3M1azRlMV9jdHJsLT5waWN0X3JlcyA9IHJlczsKLQkJcmMgPSBxc19zNWs0ZTFfcmF3X3NuYXBzaG90X2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBxc19zNWs0ZTFfcG93ZXJfZG93bih2b2lkKQotewotCXFzX3M1azRlMV9zdG9wX3N0cmVhbSgpOwotCW1zbGVlcCgzMCk7Ci0JcXNfczVrNGUxX2FmX21vZGUgPSAyOwotCXFzX3M1azRlMV9hZl9yaWdodF9hZGp1c3QgPSAwOwotCXFzX3M1azRlMV93cml0ZV9mb2N1c192YWx1ZSgwKTsKLQltc2xlZXAoMTAwKTsKLQkvKiBTZXQgQUYgYWN0dXRhdG9yIHRvIFBvd2VyRG93biAqLwotCWFmX2kyY193cml0ZV9iX3NlbnNvcigweDgwLCAwMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcXNfczVrNGUxX3Byb2JlX2luaXRfZG9uZShjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlDREJHKCJwcm9iZSBkb25lXG4iKTsKLQlncGlvX2ZyZWUoZGF0YS0+c2Vuc29yX3Jlc2V0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotCXFzX3M1azRlMV9wcm9iZV9pbml0X3NlbnNvcihjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1aW50MTZfdCBjaGlwaWQgPSAwOwotCUNEQkcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlyYyA9IGdwaW9fcmVxdWVzdChkYXRhLT5zZW5zb3JfcmVzZXQsICJxc19zNWs0ZTEiKTsKLQlDREJHKCIgcXNfczVrNGUxX3Byb2JlX2luaXRfc2Vuc29yXG4iKTsKLQlpZiAoIXJjKSB7Ci0JCUNEQkcoInNlbnNvcl9yZXNldCA9ICVkXG4iLCByYyk7Ci0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCQltc2xlZXAoNTApOwotCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChkYXRhLT5zZW5zb3JfcmVzZXQsIDEpOwotCQltc2xlZXAoMTMpOwotCX0gZWxzZSB7Ci0JCWdvdG8gaW5pdF9wcm9iZV9kb25lOwotCX0KLQltc2xlZXAoNzApOwotCXJjID0gcXNfczVrNGUxX2JyaWRnZV9yZXNldCgpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCXFzX3M1azRlMV9icmlkZ2VfY29uZmlnKE1PREVfM0QsIFJFU19QUkVWSUVXKTsKLQltc2xlZXAoMzApOwotCi0JQ0RCRygiIHFzX3M1azRlMV9wcm9iZV9pbml0X3NlbnNvciBpcyBjYWxsZWRcbiIpOwotCXJjID0gcXNfczVrNGUxX2kyY19yZWFkKDB4MDAwMCwgJmNoaXBpZCwgMik7Ci0JQ0RCRygiSUQ6ICVkXG4iLCBjaGlwaWQpOwotCS8qIDQuIENvbXBhcmUgc2Vuc29yIElEIHRvIFFTX1M1SzRFMSBJRDogKi8KLQlpZiAoY2hpcGlkICE9IDB4NGUxMCkgewotCQlyYyA9IC1FTk9ERVY7Ci0JCUNEQkcoInFzX3M1azRlMV9wcm9iZV9pbml0X3NlbnNvciBmYWlsIGNoaXAgaWQgbWlzbWF0Y2hcbiIpOwotCQlnb3RvIGluaXRfcHJvYmVfZmFpbDsKLQl9Ci0JZ290byBpbml0X3Byb2JlX2RvbmU7Ci1pbml0X3Byb2JlX2ZhaWw6Ci0JQ0RCRygiIHFzX3M1azRlMV9wcm9iZV9pbml0X3NlbnNvciBmYWlsc1xuIik7Ci0JZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoZGF0YS0+c2Vuc29yX3Jlc2V0LCAwKTsKLQlxc19zNWs0ZTFfcHJvYmVfaW5pdF9kb25lKGRhdGEpOwotaW5pdF9wcm9iZV9kb25lOgotCUNEQkcoIiBxc19zNWs0ZTFfcHJvYmVfaW5pdF9zZW5zb3IgZmluaXNoZXNcbiIpOwotCXJldHVybiByYzsKLX0KLS8qIGNhbXNlbnNvcl9xc19zNWs0ZTFfcmVzZXQgKi8KLQotaW50IHFzX3M1azRlMV9zZW5zb3Jfb3Blbl9pbml0KGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCWludDMyX3QgcmMgPSAwOwotCUNEQkcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlDREJHKCJDYWxsaW5nIHFzX3M1azRlMV9zZW5zb3Jfb3Blbl9pbml0XG4iKTsKLQotCXFzX3M1azRlMV9jdHJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHFzX3M1azRlMV9jdHJsX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXFzX3M1azRlMV9jdHJsKSB7Ci0JCUNEQkcoInFzX3M1azRlMV9pbml0IGZhaWxlZCFcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gaW5pdF9kb25lOwotCX0KLQlxc19zNWs0ZTFfY3RybC0+ZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQlxc19zNWs0ZTFfY3RybC0+cGljdF9mcHNfZGl2aWRlciA9IDEgKiAweDAwMDAwNDAwOwotCXFzX3M1azRlMV9jdHJsLT5zZXRfdGVzdCA9IFRFU1RfT0ZGOwotCXFzX3M1azRlMV9jdHJsLT5jYW1fbW9kZSA9IE1PREVfSU5WQUxJRDsKLQotCWlmIChkYXRhKQotCQlxc19zNWs0ZTFfY3RybC0+c2Vuc29yZGF0YSA9IGRhdGE7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJDYWxsaW5nIHFzX3M1azRlMV9zZW5zb3Jfb3Blbl9pbml0IGZhaWwxXG4iKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlDREJHKCIlczogJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JLyogZW5hYmxlIG1jbGsgZmlyc3QgKi8KLQltc21fY2FtaW9fY2xrX3JhdGVfc2V0KFFTX1M1SzRFMV9NQVNURVJfQ0xLX1JBVEUpOwotCXJjID0gcXNfczVrNGUxX3Byb2JlX2luaXRfc2Vuc29yKGRhdGEpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gaW5pdF9mYWlsOwotLypEZWZhdWx0IG1vZGUgaXMgM0QqLwotCW1lbWNweShsZW5zX2VlcHJvbV9kYXRhLCBkYXRhLT5lZXByb21fZGF0YSwgODY0KTsKLQlxc19zNWs0ZTFfY3RybC0+ZnBzID0gMzAqUTg7Ci0JcXNfczVrNGUxX2luaXRfZm9jdXMoKTsKLQlpZiAocmMgPCAwKSB7Ci0JCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JCWdvdG8gaW5pdF9mYWlsOwotCX0gZWxzZQotCQlnb3RvIGluaXRfZG9uZTsKLWluaXRfZmFpbDoKLQlDREJHKCJpbml0X2ZhaWxcbiIpOwotCXFzX3M1azRlMV9wcm9iZV9pbml0X2RvbmUoZGF0YSk7Ci1pbml0X2RvbmU6Ci0JQ0RCRygiaW5pdF9kb25lXG4iKTsKLQlyZXR1cm4gcmM7Ci19IC8qZW5kb2YgcXNfczVrNGUxX3NlbnNvcl9vcGVuX2luaXQqLwotCi1zdGF0aWMgaW50IHFzX3M1azRlMV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCS8qIEluaXRpYWxpemUgdGhlIE1TTV9DQU1JMkMgQ2hpcCAqLwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnFzX3M1azRlMV93YWl0X3F1ZXVlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHFzX3M1azRlMV9pMmNfaWRbXSA9IHsKLQl7InFzX3M1azRlMSIsIDB9LAotCXsgfQotfTsKLQotc3RhdGljIGludCBxc19zNWs0ZTFfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCWludCByYyA9IDA7Ci0JQ0RCRygicXNfczVrNGUxX3Byb2JlIGNhbGxlZCFcbiIpOwotCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKLQkJQ0RCRygiaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkgZmFpbGVkXG4iKTsKLQkJZ290byBwcm9iZV9mYWlsdXJlOwotCX0KLQotCXFzX3M1azRlMV9zZW5zb3J3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHFzX3M1azRlMV93b3JrX3QpLAotCQkgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFxc19zNWs0ZTFfc2Vuc29ydykgewotCQlDREJHKCJremFsbG9jIGZhaWxlZC5cbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBxc19zNWs0ZTFfc2Vuc29ydyk7Ci0JcXNfczVrNGUxX2luaXRfY2xpZW50KGNsaWVudCk7Ci0JcXNfczVrNGUxX2NsaWVudCA9IGNsaWVudDsKLQotCW1zbGVlcCg1MCk7Ci0KLQlDREJHKCJxc19zNWs0ZTFfcHJvYmUgc3VjY2Vzc2VkISByYyA9ICVkXG4iLCByYyk7Ci0JcmV0dXJuIDA7Ci0KLXByb2JlX2ZhaWx1cmU6Ci0JQ0RCRygicXNfczVrNGUxX3Byb2JlIGZhaWxlZCEgcmMgPSAlZFxuIiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBxc19zNWs0ZTFfc2VuZF93Yl9pbmZvKHN0cnVjdCB3Yl9pbmZvX2NmZyAqd2IpCi17Ci0JcmV0dXJuIDA7Ci0KLX0gLyplbmQgb2YgcXNfczVrNGUxX3NuYXBzaG90X2NvbmZpZyovCi0KLXN0YXRpYyBpbnQgX19leGl0IHFzX3M1azRlMV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgcXNfczVrNGUxX3dvcmtfdF90ICpzZW5zb3J3ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JZnJlZV9pcnEoY2xpZW50LT5pcnEsIHNlbnNvcncpOwotCXFzX3M1azRlMV9jbGllbnQgPSBOVUxMOwotCWtmcmVlKHNlbnNvcncpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcXNfczVrNGUxX2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gcXNfczVrNGUxX2kyY19pZCwKLQkucHJvYmUgID0gcXNfczVrNGUxX2kyY19wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3AocXNfczVrNGUxX2kyY19yZW1vdmUpLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInFzX3M1azRlMSIsCi0JfSwKLX07Ci0KLWludCBxc19zNWs0ZTFfM0Rfc2Vuc29yX2NvbmZpZyh2b2lkIF9fdXNlciAqYXJncCkKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2xhcmdlX2RhdGEgY2RhdGE7Ci0JbG9uZyByYzsKLQlpZiAoY29weV9mcm9tX3VzZXIoJmNkYXRhLAotCQkodm9pZCAqKWFyZ3AsCi0JCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2xhcmdlX2RhdGEpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JbXV0ZXhfbG9jaygmcXNfczVrNGUxX211dCk7Ci0JcmMgPSBxc19zNWs0ZTFfZ2V0X2NhbGlicmF0aW9uX2RhdGEKLQkJKCZjZGF0YS5kYXRhLnNlbnNvcl8zZF9jYWxpX2RhdGEpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZmFpbDsKLQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJJmNkYXRhLAotCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9sYXJnZV9kYXRhKSkpCi0JCXJjID0gLUVGQVVMVDsKLWZhaWw6Ci0JbXV0ZXhfdW5sb2NrKCZxc19zNWs0ZTFfbXV0KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxc19zNWs0ZTFfMkRfc2Vuc29yX2NvbmZpZyh2b2lkIF9fdXNlciAqYXJncCkKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhIGNkYXRhOwotCWxvbmcgICByYyA9IDA7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZjZGF0YSwKLQkJKHZvaWQgKilhcmdwLAotCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQltdXRleF9sb2NrKCZxc19zNWs0ZTFfbXV0KTsKLQlDREJHKCJxc19zNWs0ZTFfc2Vuc29yX2NvbmZpZzogY2ZndHlwZSA9ICVkXG4iLAotCWNkYXRhLmNmZ3R5cGUpOwotCQlzd2l0Y2ggKGNkYXRhLmNmZ3R5cGUpIHsKLQkJY2FzZSBDRkdfR0VUX1BJQ1RfRlBTOgotCQkJcXNfczVrNGUxX2dldF9waWN0X2ZwcygKLQkJCQljZGF0YS5jZmcuZ2Zwcy5wcmV2ZnBzLAotCQkJCSYoY2RhdGEuY2ZnLmdmcHMucGljdGZwcykpOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19HRVRfUFJFVl9MX1BGOgotCQkJY2RhdGEuY2ZnLnByZXZsX3BmID0KLQkJCXFzX3M1azRlMV9nZXRfcHJldl9saW5lc19wZigpOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19HRVRfUFJFVl9QX1BMOgotCQkJY2RhdGEuY2ZnLnByZXZwX3BsID0KLQkJCQlxc19zNWs0ZTFfZ2V0X3ByZXZfcGl4ZWxzX3BsKCk7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSZjZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0ZHX0dFVF9QSUNUX0xfUEY6Ci0JCQljZGF0YS5jZmcucGljdGxfcGYgPQotCQkJCXFzX3M1azRlMV9nZXRfcGljdF9saW5lc19wZigpOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19HRVRfUElDVF9QX1BMOgotCQkJY2RhdGEuY2ZnLnBpY3RwX3BsID0KLQkJCQlxc19zNWs0ZTFfZ2V0X3BpY3RfcGl4ZWxzX3BsKCk7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSZjZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0ZHX0dFVF9QSUNUX01BWF9FWFBfTEM6Ci0JCQljZGF0YS5jZmcucGljdF9tYXhfZXhwX2xjID0KLQkJCQlxc19zNWs0ZTFfZ2V0X3BpY3RfbWF4X2V4cF9sYygpOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19TRVRfRlBTOgotCQljYXNlIENGR19TRVRfUElDVF9GUFM6Ci0JCQlyYyA9IHFzX3M1azRlMV9zZXRfZnBzKCYoY2RhdGEuY2ZnLmZwcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfU0VUX0VYUF9HQUlOOgotCQkJcmMgPQotCQkJCXFzX3M1azRlMV93cml0ZV9leHBfZ2FpbigKLQkJCQkJY2RhdGEuY2ZnLnNlbnNvcl8zZF9leHApOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfU0VUX1BJQ1RfRVhQX0dBSU46Ci0JCQlyYyA9Ci0JCQkJcXNfczVrNGUxX3NldF9waWN0X2V4cF9nYWluKAotCQkJCWNkYXRhLmNmZy5zZW5zb3JfM2RfZXhwKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0ZHX1NFVF9NT0RFOgotCQkJcmMgPSBxc19zNWs0ZTFfc2V0X3NlbnNvcl9tb2RlKGNkYXRhLm1vZGUsCi0JCQkJCWNkYXRhLnJzKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0ZHX1BXUl9ET1dOOgotCQkJcmMgPSBxc19zNWs0ZTFfcG93ZXJfZG93bigpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfTU9WRV9GT0NVUzoKLQkJCXJjID0KLQkJCQlxc19zNWs0ZTFfbW92ZV9mb2N1cygKLQkJCQljZGF0YS5jZmcuZm9jdXMuZGlyLAotCQkJCWNkYXRhLmNmZy5mb2N1cy5zdGVwcyk7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19TRVRfREVGQVVMVF9GT0NVUzoKLQkJCXJjID0KLQkJCQlxc19zNWs0ZTFfc2V0X2RlZmF1bHRfZm9jdXMoCi0JCQkJY2RhdGEuY2ZnLmZvY3VzLnN0ZXBzKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0ZHX0dFVF9BRl9NQVhfU1RFUFM6Ci0JCQlpZiAocXNfczVrNGUxX2N0cmwtPmNhbV9tb2RlID09IE1PREVfM0QpCi0JCQkJY2RhdGEubWF4X3N0ZXBzID0gUVNfUzVLNEUxX1RPVEFMX1NURVBTXzNEOwotCQkJZWxzZQotCQkJCWNkYXRhLm1heF9zdGVwcyA9Ci0JCQkJCVFTX1M1SzRFMV9UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUjsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfU0VUX0VGRkVDVDoKLQkJCXJjID0gcXNfczVrNGUxX3NldF9kZWZhdWx0X2ZvY3VzKAotCQkJCWNkYXRhLmNmZy5lZmZlY3QpOwotCQkJYnJlYWs7Ci0KLQotCQljYXNlIENGR19TRU5EX1dCX0lORk86Ci0JCQlyYyA9IHFzX3M1azRlMV9zZW5kX3diX2luZm8oCi0JCQkJJihjZGF0YS5jZmcud2JfaW5mbykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfU0VOU09SX0lOSVQ6Ci0JCQlyYyA9IHFzX3M1azRlMV9tb2RlX2luaXQoY2RhdGEubW9kZSwKLQkJCQkJY2RhdGEuY2ZnLmluaXRfaW5mbyk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCW11dGV4X3VubG9jaygmcXNfczVrNGUxX211dCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxc19zNWs0ZTFfc2Vuc29yX2NvbmZpZyh2b2lkIF9fdXNlciAqYXJncCkKLXsKLQlpbnQgY2ZndHlwZTsKLQlsb25nIHJjOwotCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZndHlwZSwKLQkJKHZvaWQgKilhcmdwLAotCQlzaXplb2YoaW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChjZmd0eXBlICE9IENGR19HRVRfM0RfQ0FMSV9EQVRBKQotCQlyYyA9IHFzX3M1azRlMV8yRF9zZW5zb3JfY29uZmlnKGFyZ3ApOwotCWVsc2UKLQkJcmMgPSBxc19zNWs0ZTFfM0Rfc2Vuc29yX2NvbmZpZyhhcmdwKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcXNfczVrNGUxX3NlbnNvcl9yZWxlYXNlKHZvaWQpCi17Ci0JaW50IHJjID0gLUVCQURGOwotCW11dGV4X2xvY2soJnFzX3M1azRlMV9tdXQpOwotCXFzX3M1azRlMV9wb3dlcl9kb3duKCk7Ci0JYnJpZGdlX2kyY193cml0ZV93KDB4NTMsIDB4MDApOwotCW1zbGVlcCgyMCk7Ci0JZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAocXNfczVrNGUxX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JbXNsZWVwKDUpOwotCWdwaW9fZnJlZShxc19zNWs0ZTFfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3Jlc2V0KTsKLQlrZnJlZShxc19zNWs0ZTFfY3RybCk7Ci0JcXNfczVrNGUxX2N0cmwgPSBOVUxMOwotCUNEQkcoInFzX3M1azRlMV9yZWxlYXNlIGNvbXBsZXRlZFxuIik7Ci0JbXV0ZXhfdW5sb2NrKCZxc19zNWs0ZTFfbXV0KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBxc19zNWs0ZTFfc2Vuc29yX3Byb2JlKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICppbmZvLAotCQlzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsICpzKQotewotCWludCByYyA9IDA7Ci0JcmMgPSBpMmNfYWRkX2RyaXZlcigmcXNfczVrNGUxX2kyY19kcml2ZXIpOwotCWlmIChyYyA8IDAgfHwgcXNfczVrNGUxX2NsaWVudCA9PSBOVUxMKSB7Ci0JCXJjID0gLUVOT1RTVVBQOwotCQlDREJHKCJJMkMgYWRkIGRyaXZlciBmYWlsZWQiKTsKLQkJZ290byBwcm9iZV9mYWlsOwotCX0KLQltc21fY2FtaW9fY2xrX3JhdGVfc2V0KFFTX1M1SzRFMV9NQVNURVJfQ0xLX1JBVEUpOwotCXJjID0gcXNfczVrNGUxX3Byb2JlX2luaXRfc2Vuc29yKGluZm8pOwotCWlmIChyYyA8IDApCi0JCWdvdG8gcHJvYmVfZmFpbDsKLQlxc19zNWs0ZTFfcmVhZF9sc2MoaW5mby0+ZWVwcm9tX2RhdGEpOyAvKkRlZmF1bHQgbW9kZSBpcyAzRCovCi0Jcy0+c19pbml0ID0gcXNfczVrNGUxX3NlbnNvcl9vcGVuX2luaXQ7Ci0Jcy0+c19yZWxlYXNlID0gcXNfczVrNGUxX3NlbnNvcl9yZWxlYXNlOwotCXMtPnNfY29uZmlnICA9IHFzX3M1azRlMV9zZW5zb3JfY29uZmlnOwotCXMtPnNfbW91bnRfYW5nbGUgPSBpbmZvLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+bW91bnRfYW5nbGU7Ci0Jcy0+c19jYW1lcmFfdHlwZSA9IEJBQ0tfQ0FNRVJBXzNEOwotCXMtPnNfdmlkZW9fcGFja2luZyA9IFNJREVfQllfU0lERV9IQUxGOwotCXMtPnNfc25hcF9wYWNraW5nID0gU0lERV9CWV9TSURFX0ZVTEw7Ci0JYnJpZGdlX2kyY193cml0ZV93KDB4NTMsIDB4MDApOwotCW1zbGVlcCgyMCk7Ci0JZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoaW5mby0+c2Vuc29yX3Jlc2V0LCAwKTsKLQlxc19zNWs0ZTFfcHJvYmVfaW5pdF9kb25lKGluZm8pOwotCXJldHVybiByYzsKLQotcHJvYmVfZmFpbDoKLQlDREJHKCJxc19zNWs0ZTFfc2Vuc29yX3Byb2JlOiBTRU5TT1IgUFJPQkUgRkFJTFMhXG4iKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBib29sIHN0cmVhbWluZyA9IDE7Ci0KLXN0YXRpYyBpbnQgcXNfczVrNGUxX2ZvY3VzX3Rlc3Qodm9pZCAqZGF0YSwgdTY0ICp2YWwpCi17Ci0JaW50IGkgPSAwOwotCXFzX3M1azRlMV9zZXRfZGVmYXVsdF9mb2N1cygwKTsKLQotCWZvciAoaSA9IDA7IGkgPCBRU19TNUs0RTFfVE9UQUxfU1RFUFNfTkVBUl9UT19GQVI7IGkrKykgewotCQlxc19zNWs0ZTFfbW92ZV9mb2N1cyhNT1ZFX05FQVIsIDEpOwotCQltc2xlZXAoMjAwMCk7Ci0JfQotCW1zbGVlcCg1MDAwKTsKLQlmb3IgKCA7IGkgPiAwOyBpLS0pIHsKLQkJcXNfczVrNGUxX21vdmVfZm9jdXMoTU9WRV9GQVIsIDEpOwotCQltc2xlZXAoMjAwMCk7Ci0JfQotCXJldHVybiAwOwotfQotCi1ERUZJTkVfU0lNUExFX0FUVFJJQlVURShjYW1fZm9jdXMsIHFzX3M1azRlMV9mb2N1c190ZXN0LAotCQkJTlVMTCwgIiVsbGRcbiIpOwotCi1zdGF0aWMgaW50IHFzX3M1azRlMV9zdGVwX3Rlc3Qodm9pZCAqZGF0YSwgdTY0ICp2YWwpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3Qgc2Vuc29yX2xhcmdlX2RhdGEgY2RhdGE7Ci0JcmMgPSBxc19zNWs0ZTFfZ2V0X2NhbGlicmF0aW9uX2RhdGEKLQkJKCZjZGF0YS5kYXRhLnNlbnNvcl8zZF9jYWxpX2RhdGEpOwotCWlmIChyYyA8IDApCi0JCUNEQkcoIiVzOiBDYWxpYnJhdGlvbiBkYXRhIHJlYWQgZmFpbC5cbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHFzX3M1azRlMV9zZXRfc3RlcCh2b2lkICpkYXRhLCB1NjQgdmFsKQotewotCXFzX3M1azRlMV9sX3JlZ2lvbl9jb2RlX3Blcl9zdGVwID0gdmFsICYgMHhGRjsKLQlxc19zNWs0ZTFfYWZfbW9kZSA9ICh2YWwgPj4gOCkgJiAweEZGOwotCXFzX3M1azRlMV9ubF9yZWdpb25fY29kZV9wZXJfc3RlcDEgPSAodmFsID4+IDE2KSAmIDB4RkZGRjsKLQotCXJldHVybiAwOwotfQotCi1ERUZJTkVfU0lNUExFX0FUVFJJQlVURShjYW1fc3RlcCwgcXNfczVrNGUxX3N0ZXBfdGVzdCwKLQkJCXFzX3M1azRlMV9zZXRfc3RlcCwgIiVsbGRcbiIpOwotCi1zdGF0aWMgaW50IGNhbV9kZWJ1Z19zdHJlYW1fc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmICh2YWwpIHsKLQkJcXNfczVrNGUxX3N0YXJ0X3N0cmVhbSgpOwotCQlzdHJlYW1pbmcgPSAxOwotCX0gZWxzZSB7Ci0JCXFzX3M1azRlMV9zdG9wX3N0cmVhbSgpOwotCQlzdHJlYW1pbmcgPSAwOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBjYW1fZGVidWdfc3RyZWFtX2dldCh2b2lkICpkYXRhLCB1NjQgKnZhbCkKLXsKLQkqdmFsID0gc3RyZWFtaW5nOwotCXJldHVybiAwOwotfQotREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoY2FtX3N0cmVhbSwgY2FtX2RlYnVnX3N0cmVhbV9nZXQsCi0JCQljYW1fZGVidWdfc3RyZWFtX3NldCwgIiVsbHVcbiIpOwotCi1zdGF0aWMgdWludDE2X3QgcXNfczVrNGUxX3N0ZXBfdmFsID0gUVNfUzVLNEUxX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSOwotc3RhdGljIHVpbnQ4X3QgcXNfczVrNGUxX3N0ZXBfZGlyID0gTU9WRV9ORUFSOwotc3RhdGljIGludCBxc19zNWs0ZTFfYWZfc3RlcF9jb25maWcodm9pZCAqZGF0YSwgdTY0IHZhbCkKLXsKLQlxc19zNWs0ZTFfc3RlcF92YWwgPSB2YWwgJiAweEZGRkY7Ci0JcXNfczVrNGUxX3N0ZXBfZGlyID0gKHZhbCA+PiAxNikgJiAweDE7Ci0JQ0RCRygiJXNcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBxc19zNWs0ZTFfYWZfc3RlcCh2b2lkICpkYXRhLCB1NjQgKnZhbCkKLXsKLQlpbnQgaSA9IDA7Ci0JaW50IGRpciA9IE1PVkVfTkVBUjsKLQlDREJHKCIlc1xuIiwgX19mdW5jX18pOwotCXFzX3M1azRlMV9zZXRfZGVmYXVsdF9mb2N1cygwKTsKLQltc2xlZXAoNTAwMCk7Ci0JaWYgKHFzX3M1azRlMV9zdGVwX2RpciA9PSAxKQotCQlkaXIgPSBNT1ZFX0ZBUjsKLQotCWZvciAoaSA9IDA7IGkgPCBxc19zNWs0ZTFfc3RlcF92YWw7IGkgKz0gNCkgewotCQlxc19zNWs0ZTFfbW92ZV9mb2N1cyhkaXIsIDQpOwotCQltc2xlZXAoMTAwMCk7Ci0JfQotCXFzX3M1azRlMV9zZXRfZGVmYXVsdF9mb2N1cygwKTsKLQlyZXR1cm4gMDsKLX0KLQotREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoYWZfc3RlcCwgcXNfczVrNGUxX2FmX3N0ZXAsCi0JCQlxc19zNWs0ZTFfYWZfc3RlcF9jb25maWcsICIlbGx1XG4iKTsKLQotc3RhdGljIGludCBjYW1fZGVidWdfaW5pdCh2b2lkKQotewotCXN0cnVjdCBkZW50cnkgKmNhbV9kaXI7Ci0JZGVidWdmc19iYXNlID0gZGVidWdmc19jcmVhdGVfZGlyKCJzZW5zb3IiLCBOVUxMKTsKLQlpZiAoIWRlYnVnZnNfYmFzZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljYW1fZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJxc19zNWs0ZTEiLCBkZWJ1Z2ZzX2Jhc2UpOwotCWlmICghY2FtX2RpcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoIWRlYnVnZnNfY3JlYXRlX2ZpbGUoImZvY3VzIiwgU19JUlVHTyB8IFNfSVdVU1IsIGNhbV9kaXIsCi0JCQkJCQkJIE5VTEwsICZjYW1fZm9jdXMpKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoIWRlYnVnZnNfY3JlYXRlX2ZpbGUoInN0ZXAiLCBTX0lSVUdPIHwgU19JV1VTUiwgY2FtX2RpciwKLQkJCQkJCQkgTlVMTCwgJmNhbV9zdGVwKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzdHJlYW0iLCBTX0lSVUdPIHwgU19JV1VTUiwgY2FtX2RpciwKLQkJCQkJCQkgTlVMTCwgJmNhbV9zdHJlYW0pKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoIWRlYnVnZnNfY3JlYXRlX2ZpbGUoImFmX3N0ZXAiLCBTX0lSVUdPIHwgU19JV1VTUiwgY2FtX2RpciwKLQkJCQkJCQkgTlVMTCwgJmFmX3N0ZXApKQotCQlyZXR1cm4gLUVOT01FTTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX3FzX3M1azRlMV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBtc21fY2FtZXJhX2Rydl9zdGFydChwZGV2LCBxc19zNWs0ZTFfc2Vuc29yX3Byb2JlKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2NhbWVyYV9kcml2ZXIgPSB7Ci0JLnByb2JlID0gX19xc19zNWs0ZTFfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtX2NhbWVyYV9xc19zNWs0ZTEiLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBxc19zNWs0ZTFfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9jYW1lcmFfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQocXNfczVrNGUxX2luaXQpOwotdm9pZCBxc19zNWs0ZTFfZXhpdCh2b2lkKQotewotCWkyY19kZWxfZHJpdmVyKCZxc19zNWs0ZTFfaTJjX2RyaXZlcik7Ci19Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgNU1QIEJheWVyIHNlbnNvciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9xc19zNWs0ZTEuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9xc19zNWs0ZTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhM2QwYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvcXNfczVrNGUxLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgUVNfUzVLNEUxX0gKLSNkZWZpbmUgUVNfUzVLNEUxX0gKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLWV4dGVybiBzdHJ1Y3QgcXNfczVrNGUxX3JlZyBxc19zNWs0ZTFfcmVnczsKLQotI2RlZmluZSBMRU5TX1NIQURFX1RBQkxFIDE2Ci0KLXN0cnVjdCBxc19zNWs0ZTFfaTJjX3JlZ19jb25mIHsKLQl1bnNpZ25lZCBzaG9ydCB3YWRkcjsKLQl1bnNpZ25lZCBzaG9ydCB3ZGF0YTsKLX07Ci0KLXN0cnVjdCBxc19zNWs0ZTFfaTJjX2NvbmZfYXJyYXkgewotICAgICAgIHN0cnVjdCBxc19zNWs0ZTFfaTJjX3JlZ19jb25mICpjb25mOwotICAgICAgIHVuc2lnbmVkIHNob3J0IHNpemU7Ci19OwotCi1lbnVtIHFzX3M1azRlMV90ZXN0X21vZGVfdCB7Ci0JVEVTVF9PRkYsCi0JVEVTVF8xLAotCVRFU1RfMiwKLQlURVNUXzMKLX07Ci0KLWVudW0gcXNfczVrNGUxX3Jlc29sdXRpb25fdCB7Ci0JUVRSXzJEX1NJWkUsCi0JRlVMTF8yRF9TSVpFLAotCVFUUl8zRF9TSVpFLAotCUZVTExfM0RfU0laRSwKLQlJTlZBTElEX1NJWkUKLX07Ci1lbnVtIHFzX3M1azRlMV9zZXR0aW5nIHsKLQlSRVNfUFJFVklFVywKLQlSRVNfQ0FQVFVSRSwKLQlSRVNfM0RfUFJFVklFVywKLQlSRVNfM0RfQ0FQVFVSRQotfTsKLWVudW0gcXNfczVrNGUxX2NhbV9tb2RlX3QgewotICAgIE1PREVfMkRfUklHSFQsCi0JTU9ERV8yRF9MRUZULAotCU1PREVfM0QsCi0JTU9ERV9JTlZBTElECi19OwotZW51bSBxc19zNWs0ZTFfcmVnX3VwZGF0ZSB7Ci0JLyogU2Vuc29yIGVnaXN0ZXJzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiAqLwotCVJFR19JTklULAotCS8qIFNlbnNvciBlZ2lzdGVycyB0aGF0IG5lZWRzIHBlcmlvZGljIEkyQyB3cml0ZXMgKi8KLQlVUERBVEVfUEVSSU9ESUMsCi0JLyogQWxsIHRoZSBzZW5zb3IgUmVnaXN0ZXJzIHdpbGwgYmUgdXBkYXRlZCAqLwotCVVQREFURV9BTEwsCi0JLyogTm90IHZhbGlkIHVwZGF0ZSAqLwotCVVQREFURV9JTlZBTElECi19OwotCi1lbnVtIHFzX3M1azRlMV9yZWdfbW9kZSB7Ci0JUVNfUzVLNEUxX0ZSQU1FX0xFTkdUSF9MSU5FU19IID0gMSwKLQlRU19TNUs0RTFfRlJBTUVfTEVOR1RIX0xJTkVTX0wsCi0JUVNfUzVLNEUxX0xJTkVfTEVOR1RIX1BDS19ILAotCVFTX1M1SzRFMV9MSU5FX0xFTkdUSF9QQ0tfTCwKLX07Ci0KLXN0cnVjdCBxc19zNWs0ZTFfcmVnIHsKLQljb25zdCBzdHJ1Y3QgcXNfczVrNGUxX2kyY19yZWdfY29uZiAqcmVjX3NldHRpbmdzOwotCWNvbnN0IHVuc2lnbmVkIHNob3J0IHJlY19zaXplOwotCWNvbnN0IHN0cnVjdCBxc19zNWs0ZTFfaTJjX3JlZ19jb25mICpyZWdfcHJldjsKLQljb25zdCB1bnNpZ25lZCBzaG9ydCByZWdfcHJldl9zaXplOwotCWNvbnN0IHN0cnVjdCBxc19zNWs0ZTFfaTJjX3JlZ19jb25mICpyZWdfc25hcDsKLQljb25zdCB1bnNpZ25lZCBzaG9ydCByZWdfc25hcF9zaXplOwotCWNvbnN0IHN0cnVjdCBxc19zNWs0ZTFfaTJjX3JlZ19jb25mICgqcmVnX2xlbnMpW0xFTlNfU0hBREVfVEFCTEVdOwotCWNvbnN0IHVuc2lnbmVkIHNob3J0IHJlZ19sZW5zX3NpemU7Ci0JY29uc3Qgc3RydWN0IHFzX3M1azRlMV9pMmNfcmVnX2NvbmYgKnJlZ19kZWZhdWx0X2xlbnM7Ci0JY29uc3QgdW5zaWduZWQgc2hvcnQgcmVnX2RlZmF1bHRfbGVuc19zaXplOwotCWNvbnN0IHN0cnVjdCBxc19zNWs0ZTFfaTJjX2NvbmZfYXJyYXkgKmNvbmZfYXJyYXk7Ci19OwotI2VuZGlmIC8qIFFTX1M1SzRFMV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvcXNfczVrNGUxX3JlZy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3FzX3M1azRlMV9yZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3MjM0My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvcXNfczVrNGUxX3JlZy5jCisrKyAvZGV2L251bGwKQEAgLTEsODA0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotCi0jaW5jbHVkZSAicXNfczVrNGUxLmgiCi0KLXN0cnVjdCBxc19zNWs0ZTFfaTJjX3JlZ19jb25mIHFzX3M1azRlMV9wcmV2X3NldHRpbmdzXzNkW10gPSB7Ci0JezB4MDEwMCwgMHgwMH0sCi0JLypGcmFtZSBMZW5ndGgqLwotCXsweDAzNDAsIDB4MDR9LAotCXsweDAzNDEsIDB4OTB9LAotCS8qTGluZSBMZW5ndGgqLwotCXsweDAzNDIsIDB4MEF9LAotCXsweDAzNDMsIDB4QjJ9LAotCXsweDMwMzAsIDB4MDZ9LAotCXsweDMwMTcsIDB4QTR9LAotCXsweDMwMUIsIDB4ODh9LAotCXsweDMwQkMsIDB4OTB9LAotCXsweDMwMUMsIDB4MDR9LAotCXsweDAyMDIsIDB4MDR9LAotCXsweDAyMDMsIDB4MTJ9LAotCXsweDAyMDQsIDB4MDB9LAotCXsweDAyMDUsIDB4ODB9LAotCXsweDAzMDYsIDB4MDB9LAotCXsweDAzMDcsIDB4NjB9LAotCXsweDMwQjUsIDB4MDF9LAotCXsweDMwRTIsIDB4MDJ9LC8qbnVtIGxhbmVzWzE6MF0gPSAxKi8KLQl7MHgzMEYxLCAweDYwfSwKLS8qTUlQSSBTaXplIFNldHRpbmcqLwotCXsweDMwQTksIDB4MDJ9LAotCXsweDMwMEUsIDB4RTh9LAotCXsweDAzODcsIDB4MDF9LAotCXsweDAzNDQsIDB4MDF9LAotCXsweDAzNDUsIDB4MTh9LAotCXsweDAzNDgsIDB4MDl9LAotCXsweDAzNDksIDB4MTd9LAotCXsweDAzNDYsIDB4MDF9LAotCXsweDAzNDcsIDB4OTR9LAotCXsweDAzNEEsIDB4MDZ9LAotCXsweDAzNEIsIDB4MTN9LAotCXsweDAzODAsIDB4MDB9LAotCXsweDAzODEsIDB4MDF9LAotCXsweDAzODIsIDB4MDB9LAotCXsweDAzODMsIDB4MDF9LAotCXsweDAzODQsIDB4MDB9LAotCXsweDAzODUsIDB4MDF9LAotCXsweDAzODYsIDB4MDB9LAotCXsweDAzODcsIDB4MDF9LAotCXsweDAzNEMsIDB4MDR9LAotCXsweDAzNEQsIDB4MDB9LAotCXsweDAzNEUsIDB4MDR9LAotCXsweDAzNEYsIDB4ODB9LAotCXsweDMwQkYsIDB4QUF9LAotCXsweDMwQzAsIDB4NDB9LAotCXsweDMwQzgsIDB4MDR9LAotCXsweDMwQzksIDB4MDB9LAotfTsKLQotc3RydWN0IHFzX3M1azRlMV9pMmNfcmVnX2NvbmYgcXNfczVrNGUxX3ByZXZfc2V0dGluZ3NfMmRbXSA9IHsKLQl7MHgwMTAwLCAweDAwfSwKLQl7MHgwMzQwLCAweDAzfSwKLQl7MHgwMzQxLCAweGUwfSwKLQl7MHgwMzQyLCAweDBBfSwKLQl7MHgwMzQzLCAweEIyfSwKLQl7MHgzMDMwLCAweDA2fSwKLQl7MHgzMDFCLCAweDgzfSwKLQl7MHgzMEJDLCAweDk4fSwKLQl7MHgzMDFDLCAweDA0fSwKLQl7MHgwMjAyLCAweDAxfSwKLQl7MHgwMjAzLCAweEZEfSwKLQl7MHgwMjA0LCAweDAwfSwKLQl7MHgwMjA1LCAweDgwfSwKLQl7MHgwMzA2LCAweDAwfSwKLQl7MHgwMzA3LCAweDY0fSwKLQl7MHgzMEI1LCAweDAwfSwKLQl7MHgzMEUyLCAweDAxfSwvKm51bSBsYW5lc1sxOjBdID0gMSovCi0JezB4MzBGMSwgMHhkMH0sCi0JezB4MzBBOSwgMHgwMn0sCi0JezB4MzAwRSwgMHhFQn0sCi0JezB4MDM4NywgMHgwM30sCi0JezB4MDM0NCwgMHgwMH0sCi0JezB4MDM0NSwgMHgwMH0sCi0JezB4MDM0OCwgMHgwQX0sCi0JezB4MDM0OSwgMHgyRn0sCi0JezB4MDM0NiwgMHgwMH0sCi0JezB4MDM0NywgMHgwMH0sCi0JezB4MDM0QSwgMHgwN30sCi0JezB4MDM0QiwgMHhBN30sCi0JezB4MDM4MCwgMHgwMH0sCi0JezB4MDM4MSwgMHgwMX0sCi0JezB4MDM4MiwgMHgwMH0sCi0JezB4MDM4MywgMHgwMX0sCi0JezB4MDM4NCwgMHgwMH0sCi0JezB4MDM4NSwgMHgwMX0sCi0JezB4MDM4NiwgMHgwMH0sCi0JezB4MDM4NywgMHgwM30sCi0JezB4MDM0QywgMHgwNX0sCi0JezB4MDM0RCwgMHgxMH0sCi0JezB4MDM0RSwgMHgwM30sCi0JezB4MDM0RiwgMHhkNH0sCi0JezB4MzBCRiwgMHhBQn0sCi0JezB4MzBDMCwgMHhjMH0sCi0JezB4MzBDOCwgMHgwNn0sCi0JezB4MzBDOSwgMHg1NH0sCi19OwotCi1zdHJ1Y3QgcXNfczVrNGUxX2kyY19yZWdfY29uZiBxc19zNWs0ZTFfc25hcF9zZXR0aW5nc18yZFtdID0gewotCXsweDAxMDAsIDB4MDB9LAotCXsweDAzNDAsIDB4MDd9LAotCXsweDAzNDEsIDB4YjR9LAotCXsweDAzNDIsIDB4MEF9LAotCXsweDAzNDMsIDB4QjJ9LAotCXsweDMwMzAsIDB4MDZ9LCAvKnNodXQgc3RyZWFtaW5nIG9mZiovCi0JezB4MzAwRSwgMHhFOH0sCi0JezB4MzAxQiwgMHg3NX0sCi0JezB4MzAxQywgMHgwNH0sCi0JezB4MzBCQywgMHg5OH0sCi0JezB4MDIwMiwgMHgwNH0sCi0JezB4MDIwMywgMHgxMn0sCi0JezB4MDIwNCwgMHgwMH0sCi0JezB4MDIwNSwgMHg4MH0sCi0JezB4MDMwNiwgMHgwMH0sCi0JezB4MDMwNywgMHg2NH0sCi0JezB4MzBCNSwgMHgwMH0sCi0JezB4MzBFMiwgMHgwMX0sLypudW0gbGFuZXNbMTowXSA9IDEqLwotCXsweDMwRjEsIDB4ZDB9LAotCXsweDMwQTksIDB4MDN9LC8qSG9yaXpvbnRhbCBCaW5uaW5nIE9mZiovCi0JezB4MzAwRSwgMHhFOH0sLypWZXJ0aWNhbCBCaW5uaW5nIE9mZiovCi0JezB4MDM4NywgMHgwMX0sLyp5X29kZF9pbmMqLwotCXsweDAzNEMsIDB4MEF9LC8qeF9vdXRwdXQgc2l6ZSovCi0JezB4MDM0RCwgMHgzMH0sCi0JezB4MDM0RSwgMHgwN30sLyp5X291dHB1dCBzaXplKi8KLQl7MHgwMzRGLCAweEE4fSwKLQl7MHgzMEJGLCAweEFCfSwvKm91dGlmX2VuYWJsZVs3XSwgZGF0YV90eXBlWzU6MF0oMkJoID0gYmF5ZXIgMTBiaXQpKi8KLQl7MHgzMEMwLCAweDg2fSwvKnZpZGVvX29mZnNldFs3OjRdIDMyNjAlMTIqLwotCXsweDMwQzgsIDB4MEN9LC8qdmlkZW9fZGF0YV9sZW5ndGggMzI2MCA9IDI2MDggKiAxLjI1Ki8KLQl7MHgzMEM5LCAweEJDfSwKLQotfTsKLQotc3RydWN0IHFzX3M1azRlMV9pMmNfcmVnX2NvbmYgcXNfczVrNGUxX3NuYXBfc2V0dGluZ3NfM2RbXSA9IHsKLQl7MHgwMTAwLCAweDAwfSwKLQotLyogRnJhbWUgTGVuZ3RoKi8KLQl7MHgwMzQwLCAweDA5fSwKLQl7MHgwMzQxLCAweDIwfSwKLS8qIExpbmUgTGVuZ3RoKi8KLQl7MHgwMzQyLCAweDBBfSwKLQl7MHgwMzQzLCAweEIyfSwKLQl7MHgzMDMwLCAweDA2fSwvKnNodXQgc3RyZWFtaW5nIG9mZiovCi0vKkFuYWxvZyBTZXR0aW5nKi8KLQl7MHgzMDE3LCAweEE0fSwKLQl7MHgzMDFCLCAweDg4fSwKLQl7MHgzMEJDLCAweDkwfSwKLQl7MHgzMDFDLCAweDA0fSwKLS8qSW50ZWdyYXRpb24gc2V0dGluZyAuLi4gKi8KLQl7MHgwMjAyLCAweDA0fSwKLQl7MHgwMjAzLCAweDEyfSwKLQl7MHgwMjA0LCAweDAwfSwKLQl7MHgwMjA1LCAweDgwfSwKLS8qUExMIHNldHRpbmcgLi4uKi8KLQl7MHgwMzA2LCAweDAwfSwKLQl7MHgwMzA3LCAweDYwfSwKLQl7MHgzMEI1LCAweDAxfSwKLQl7MHgzMEUyLCAweDAyfSwvKm51bSBsYW5lc1sxOjBdID0gMSovCi0JezB4MzBGMSwgMHg2MH0sCi0vKk1JUEkgU2l6ZSBTZXR0aW5nKi8KLQl7MHgzMEE5LCAweDAxfSwKLQl7MHgzMDBFLCAweEU4fSwKLQl7MHgwMzg3LCAweDAxfSwKLQl7MHgwMzQ0LCAweDAxfSwvKnhfYWRkcl9zdGFydCovCi0JezB4MDM0NSwgMHgxNH0sCi0JezB4MDM0OCwgMHgwOX0sLyp4X2FkZHJfZW5kKi8KLQl7MHgwMzQ5LCAweDE3fSwKLQl7MHgwMzQ2LCAweDAxfSwvKnlfYWRkcl9zdGFydCovCi0JezB4MDM0NywgMHg5NH0sCi0JezB4MDM0QSwgMHgwNn0sLyp5X2FkZHJfZW5kKi8KLQl7MHgwMzRCLCAweDEzfSwKLQl7MHgwMzgwLCAweDAwfSwvKnhfZXZlbl9pbmMgMSovCi0JezB4MDM4MSwgMHgwMX0sCi0JezB4MDM4MiwgMHgwMH0sLyp4X29kZF9pbmMgMSovCi0JezB4MDM4MywgMHgwMX0sCi0JezB4MDM4NCwgMHgwMH0sLyp5X2V2ZW5faW5jIDEqLwotCXsweDAzODUsIDB4MDF9LAotCXsweDAzODYsIDB4MDB9LC8qeV9vZGRfaW5jIDEqLwotCXsweDAzODcsIDB4MDF9LAotCXsweDAzNEMsIDB4MDh9LC8qeF9vdXRwdXQgc2l6ZSovCi0JezB4MDM0RCwgMHgwMH0sCi0JezB4MDM0RSwgMHgwNH0sLyp5X291dHB1dCBzaXplKi8KLQl7MHgwMzRGLCAweDgwfSwKLQl7MHgzMEJGLCAweEFBfSwvKm91dGlmX2VuYWJsZVs3XSwgZGF0YV90eXBlWzU6MF0oMkJoID0gYmF5ZXIgOGJpdCkqLwotCXsweDMwQzAsIDB4ODB9LC8qdmlkZW9fb2Zmc2V0Wzc6NF0qLwotCXsweDMwQzgsIDB4MDh9LC8qdmlkZW9fZGF0YV9sZW5ndGgqLwotCXsweDMwQzksIDB4MDB9LAotCi19OwotCi1zdHJ1Y3QgcXNfczVrNGUxX2kyY19yZWdfY29uZiBxc19zNWs0ZTFfcmVjb21tZW5kX3NldHRpbmdzW10gPSB7Ci0JezB4MDEwMCwgMHgwMH0sCi0KLQl7MHgzMDMwLCAweDA2fSwvKnNodXQgc3RyZWFtaW5nKi8KLS8qQW5hbG9nIFNldHRpbmcqLwotCXsweDMwMDAsIDB4MDV9LAotCXsweDMwMDEsIDB4MDN9LAotCXsweDMwMDIsIDB4MDh9LAotCXsweDMwMDMsIDB4MDl9LAotCXsweDMwMDQsIDB4MkV9LAotCXsweDMwMDUsIDB4MDZ9LAotCXsweDMwMDYsIDB4MzR9LAotCXsweDMwMDcsIDB4MDB9LAotCXsweDMwMDgsIDB4M0N9LAotCXsweDMwMDksIDB4M0N9LAotCXsweDMwMEEsIDB4Mjh9LAotCXsweDMwMEIsIDB4MDR9LAotCXsweDMwMEMsIDB4MEF9LAotCXsweDMwMEQsIDB4MDJ9LAotCXsweDMwMEYsIDB4ODJ9LAotCXsweDMwMTAsIDB4MDB9LAotCXsweDMwMTEsIDB4NEN9LAotCXsweDMwMTIsIDB4MzB9LAotCXsweDMwMTMsIDB4QzB9LAotCXsweDMwMTQsIDB4MDB9LAotCXsweDMwMTUsIDB4MDB9LAotCXsweDMwMTYsIDB4MkN9LAotCXsweDMwMTcsIDB4OTR9LAotCXsweDMwMTgsIDB4Nzh9LAotCXsweDMwMUQsIDB4RDR9LAotCXsweDMwMjEsIDB4MDJ9LAotCXsweDMwMjIsIDB4MjR9LAotCXsweDMwMjQsIDB4NDB9LAotCXsweDMwMjcsIDB4MDh9LAotCXsweDMwMjksIDB4QzZ9LAotCXsweDMwMkIsIDB4MDF9LAotCXsweDMwRDgsIDB4M0Z9LAotLyogQURMQyBzZXR0aW5nIC4uLiovCi0JezB4MzA3MCwgMHg1Rn0sCi0JezB4MzA3MSwgMHgwMH0sCi0JezB4MzA4MCwgMHgwNH0sCi0JezB4MzA4MSwgMHgzOH0sCi0KLS8qTUlQSSBzZXR0aW5nKi8KLQl7MHgzMEJELCAweDAwfSwvKlNFTF9DQ1BbMF0qLwotCXsweDMwODQsIDB4MTV9LC8qU1lOQyBNb2RlKi8KLQl7MHgzMEJFLCAweDFBfSwvKk1fUENMS0RJVl9BVVRPWzRdLCBNX0RJVl9QQ0xLWzM6MF0qLwotCXsweDMwQzEsIDB4MDF9LC8qcGFjayB2aWRlbyBlbmFibGUgWzBdKi8KLQl7MHgzMEVFLCAweDAyfSwvKkRQSFkgZW5hYmxlIFsxXSovCi0JezB4MzExMSwgMHg4Nn0sLypFbWJlZGRlZCBkYXRhIG9mZiBbNV0qLwotLypGb3IgTUlQSSBUOCBUOSovCi0JezB4MzBFMywgMHgzOH0sCi0JezB4MzBFNCwgMHg0MH0sCi0JezB4MzExMywgMHg3MH0sCi0JezB4MzExNCwgMHg4MH0sCi0JezB4MzExNSwgMHg3Qn0sCi0JezB4MzExNiwgMHhDMH0sCi0JezB4MzBFRSwgMHgxMn0sCi0KLS8qUExMIHNldHRpbmcgLi4uKi8KLQl7MHgwMzA1LCAweDA2fSwKLX07Ci1zdGF0aWMgc3RydWN0IHFzX3M1azRlMV9pMmNfcmVnX2NvbmYgcXNfczVrNGUxX2RlZmF1bHRfbGVuc2hhZGluZ19zZXR0aW5nc1tdID0gewotCi0JezB4MzIwMCwgMHgwMH0sCi0JezB4MzIwMSwgMHg5YX0sCi0JezB4MzIwMiwgMHg1Nn0sCi0JezB4MzIwMywgMHhmIH0sCi0JezB4MzIwNCwgMHhkOH0sCi0JezB4MzIwNSwgMHg5NH0sCi0JezB4MzIwNiwgMHgwIH0sCi0JezB4MzIwNywgMHgxMH0sCi0JezB4MzIwOCwgMHg3MX0sCi0JezB4MzIwOSwgMHgwIH0sCi0JezB4MzIwYSwgMHg5IH0sCi0JezB4MzIwYiwgMHhjMX0sCi0JezB4MzIwYywgMHhmIH0sCi0JezB4MzIwZCwgMHhmMX0sCi0JezB4MzIwZSwgMHgzZH0sCi0JezB4MzIwZiwgMHgwIH0sCi0JezB4MzIxMCwgMHhhIH0sCi0JezB4MzIxMSwgMHg5M30sCi0JezB4MzIxMiwgMHhmIH0sCi0JezB4MzIxMywgMHhjOX0sCi0JezB4MzIxNCwgMHhhMX0sCi0JezB4MzIxNSwgMHgwIH0sCi0JezB4MzIxNiwgMHgxMH0sCi0JezB4MzIxNywgMHg4OX0sCi0JezB4MzIxOCwgMHhmIH0sCi0JezB4MzIxOSwgMHhmYn0sCi0JezB4MzIxYSwgMHhmM30sCi0JezB4MzIxYiwgMHhmIH0sCi0JezB4MzIxYywgMHhmOH0sCi0JezB4MzIxZCwgMHhmY30sCi0JezB4MzIxZSwgMHgwIH0sCi0JezB4MzIxZiwgMHg0IH0sCi0JezB4MzIyMCwgMHhlM30sCi0JezB4MzIyMSwgMHhmIH0sCi0JezB4MzIyMiwgMHhmZX0sCi0JezB4MzIyMywgMHg5NH0sCi0JezB4MzIyNCwgMHgwIH0sCi0JezB4MzIyNSwgMHgyNH0sCi0JezB4MzIyNiwgMHg1OX0sCi0JezB4MzIyNywgMHhmIH0sCi0JezB4MzIyOCwgMHhlOX0sCi0JezB4MzIyOSwgMHg2OH0sCi0JezB4MzIyYSwgMHhmIH0sCi0JezB4MzIyYiwgMHhmYX0sCi0JezB4MzIyYywgMHg3Zn0sCi0JezB4MzIyZCwgMHgwIH0sCi0JezB4MzIyZSwgMHgxM30sCi0JezB4MzIyZiwgMHhlMX0sCi0JezB4MzIzMCwgMHgwIH0sCi0JezB4MzIzMSwgMHgzIH0sCi0JezB4MzIzMiwgMHhiY30sCi0JezB4MzIzMywgMHhmIH0sCi0JezB4MzIzNCwgMHhmMH0sCi0JezB4MzIzNSwgMHhhMX0sCi0JezB4MzIzNiwgMHhmIH0sCi0JezB4MzIzNywgMHhmNH0sCi0JezB4MzIzOCwgMHhjOX0sCi0JezB4MzIzOSwgMHgwIH0sCi0JezB4MzIzYSwgMHgxMX0sCi0JezB4MzIzYiwgMHg0Yn0sCi0JezB4MzIzYywgMHgwIH0sCi0JezB4MzIzZCwgMHgxMn0sCi0JezB4MzIzZSwgMHhjNX0sCi0JezB4MzIzZiwgMHhmIH0sCi0JezB4MzI0MCwgMHhlM30sCi0JezB4MzI0MSwgMHhiIH0sCi0JezB4MzI0MiwgMHhmIH0sCi0JezB4MzI0MywgMHhmOH0sCi0JezB4MzI0NCwgMHg0Zn0sCi0JezB4MzI0NSwgMHgwIH0sCi0JezB4MzI0NiwgMHgxM30sCi0JezB4MzI0NywgMHhhY30sCi0JezB4MzI0OCwgMHgwIH0sCi0JezB4MzI0OSwgMHgwIH0sCi0JezB4MzI0YSwgMHg3Y30sCi0JezB4MzI0YiwgMHhmIH0sCi0JezB4MzI0YywgMHhmZX0sCi0JezB4MzI0ZCwgMHhkZH0sCi0JezB4MzI0ZSwgMHhmIH0sCi0JezB4MzI0ZiwgMHhmMn0sCi0JezB4MzI1MCwgMHg5Nn0sCi0JezB4MzI1MSwgMHgwIH0sCi0JezB4MzI1MiwgMHg4IH0sCi0JezB4MzI1MywgMHhlZn0sCi0JezB4MzI1NCwgMHgwIH0sCi0JezB4MzI1NSwgMHg2IH0sCi0JezB4MzI1NiwgMHhhNH0sCi0JezB4MzI1NywgMHgwIH0sCi0JezB4MzI1OCwgMHgyIH0sCi0JezB4MzI1OSwgMHg0Yn0sCi0JezB4MzI1YSwgMHgwIH0sCi0JezB4MzI1YiwgMHg2IH0sCi0JezB4MzI1YywgMHg4NX0sCi0JezB4MzI1ZCwgMHhmIH0sCi0JezB4MzI1ZSwgMHhmOH0sCi0JezB4MzI1ZiwgMHg2YX0sCi0JezB4MzI2MCwgMHhmIH0sCi0JezB4MzI2MSwgMHhmZH0sCi0JezB4MzI2MiwgMHg3MH0sCi0JezB4MzI2MywgMHgwIH0sCi0JezB4MzI2NCwgMHhkIH0sCi0JezB4MzI2NSwgMHhhOX0sCi0JezB4MzI2NiwgMHhmIH0sCi0JezB4MzI2NywgMHhmZH0sCi0JezB4MzI2OCwgMHhmOH0sCi0JezB4MzI2OSwgMHhmIH0sCi0JezB4MzI2YSwgMHhlY30sCi0JezB4MzI2YiwgMHhmY30sCi0JezB4MzI2YywgMHgwIH0sCi0JezB4MzI2ZCwgMHhhN30sCi0JezB4MzI2ZSwgMHg1IH0sCi0JezB4MzI2ZiwgMHhmIH0sCi0JezB4MzI3MCwgMHhkNn0sCi0JezB4MzI3MSwgMHgxOX0sCi0JezB4MzI3MiwgMHgwIH0sCi0JezB4MzI3MywgMHhhIH0sCi0JezB4MzI3NCwgMHhlOH0sCi0JezB4MzI3NSwgMHgwIH0sCi0JezB4MzI3NiwgMHgxN30sCi0JezB4MzI3NywgMHgxIH0sCi0JezB4MzI3OCwgMHhmIH0sCi0JezB4MzI3OSwgMHhlN30sCi0JezB4MzI3YSwgMHhhMH0sCi0JezB4MzI3YiwgMHgwIH0sCi0JezB4MzI3YywgMHhiIH0sCi0JezB4MzI3ZCwgMHhjM30sCi0JezB4MzI3ZSwgMHhmIH0sCi0JezB4MzI3ZiwgMHhjMH0sCi0JezB4MzI4MCwgMHhlM30sCi0JezB4MzI4MSwgMHgwIH0sCi0JezB4MzI4MiwgMHgxNX0sCi0JezB4MzI4MywgMHg1YX0sCi0JezB4MzI4NCwgMHhmIH0sCi0JezB4MzI4NSwgMHhmOX0sCi0JezB4MzI4NiwgMHhhMH0sCi0JezB4MzI4NywgMHhmIH0sCi0JezB4MzI4OCwgMHhmNH0sCi0JezB4MzI4OSwgMHhjZX0sCi0JezB4MzI4YSwgMHgwIH0sCi0JezB4MzI4YiwgMHhiIH0sCi0JezB4MzI4YywgMHg3Mn0sCi0JezB4MzI4ZCwgMHhmIH0sCi0JezB4MzI4ZSwgMHhmYn0sCi0JezB4MzI4ZiwgMHhiNX0sCi0JezB4MzI5MCwgMHgwIH0sCi0JezB4MzI5MSwgMHgyZn0sCi0JezB4MzI5MiwgMHhiIH0sCi0JezB4MzI5MywgMHhmIH0sCi0JezB4MzI5NCwgMHhkZX0sCi0JezB4MzI5NSwgMHhjMH0sCi0JezB4MzI5NiwgMHgwIH0sCi0JezB4MzI5NywgMHgwIH0sCi0JezB4MzI5OCwgMHg1OH0sCi0JezB4MzI5OSwgMHgwIH0sCi0JezB4MzI5YSwgMHgxYn0sCi0JezB4MzI5YiwgMHg1IH0sCi0JezB4MzI5YywgMHhmIH0sCi0JezB4MzI5ZCwgMHhmOX0sCi0JezB4MzI5ZSwgMHgyM30sCi0JezB4MzI5ZiwgMHhmIH0sCi0JezB4MzJhMCwgMHhmM30sCi0JezB4MzJhMSwgMHg5NH0sCi0JezB4MzJhMiwgMHhmIH0sCi0JezB4MzJhMywgMHhlN30sCi0JezB4MzJhNCwgMHhjMn0sCi0JezB4MzJhNSwgMHgwIH0sCi0JezB4MzJhNiwgMHgxZH0sCi0JezB4MzJhNywgMHhlNX0sCi0JezB4MzJhOCwgMHgwIH0sCi0JezB4MzJhOSwgMHg1IH0sCi0JezB4MzJhYSwgMHhhZn0sCi0JezB4MzJhYiwgMHhmIH0sCi0JezB4MzJhYywgMHhlM30sCi0JezB4MzJhZCwgMHhiN30sCi0JezB4MzJhZSwgMHhmIH0sCi0JezB4MzJhZiwgMHhmOH0sCi0JezB4MzJiMCwgMHgzNH0sCi0JezB4MzJiMSwgMHgwIH0sCi0JezB4MzJiMiwgMHgxY30sCi0JezB4MzJiMywgMHgzZH0sCi0JezB4MzJiNCwgMHgwIH0sCi0JezB4MzJiNSwgMHgxMH0sCi0JezB4MzJiNiwgMHg0YX0sCi0JezB4MzJiNywgMHhmIH0sCi0JezB4MzJiOCwgMHhmYX0sCi0JezB4MzJiOSwgMHg3IH0sCi0JezB4MzJiYSwgMHhmIH0sCi0JezB4MzJiYiwgMHhmZn0sCi0JezB4MzJiYywgMHgxNn0sCi0JezB4MzJiZCwgMHgwIH0sCi0JezB4MzJiZSwgMHg1IH0sCi0JezB4MzJiZiwgMHg0ZX0sCi0JezB4MzJjMCwgMHgwIH0sCi0JezB4MzJjMSwgMHhjIH0sCi0JezB4MzJjMiwgMHgxYn0sCi0JezB4MzJjMywgMHhmIH0sCi0JezB4MzJjNCwgMHhmMX0sCi0JezB4MzJjNSwgMHhkYn0sCi0JezB4MzJjNiwgMHhmIH0sCi0JezB4MzJjNywgMHhmY30sCi0JezB4MzJjOCwgMHhmOH0sCi0JezB4MzJjOSwgMHhmIH0sCi0JezB4MzJjYSwgMHhmNH0sCi0JezB4MzJjYiwgMHhhZH0sCi0JezB4MzJjYywgMHhmIH0sCi0JezB4MzJjZCwgMHhmYn0sCi0JezB4MzJjZSwgMHg1OX0sCi0JezB4MzJjZiwgMHgwIH0sCi0JezB4MzJkMCwgMHg5IH0sCi0JezB4MzJkMSwgMHhmN30sCi0JezB4MzJkMiwgMHgwIH0sCi0JezB4MzJkMywgMHgwIH0sCi0JezB4MzJkNCwgMHhjMX0sCi0JezB4MzJkNSwgMHhmIH0sCi0JezB4MzJkNiwgMHhmNX0sCi0JezB4MzJkNywgMHgzMH0sCi0JezB4MzJkOCwgMHgwIH0sCi0JezB4MzJkOSwgMHg4M30sCi0JezB4MzJkYSwgMHgxZH0sCi0JezB4MzJkYiwgMHhmIH0sCi0JezB4MzJkYywgMHhlM30sCi0JezB4MzJkZCwgMHgzY30sCi0JezB4MzJkZSwgMHgwIH0sCi0JezB4MzJkZiwgMHhhIH0sCi0JezB4MzJlMCwgMHgxMH0sCi0JezB4MzJlMSwgMHgwIH0sCi0JezB4MzJlMiwgMHg3IH0sCi0JezB4MzJlMywgMHg2NX0sCi0JezB4MzJlNCwgMHhmIH0sCi0JezB4MzJlNSwgMHhmZX0sCi0JezB4MzJlNiwgMHg3OX0sCi0JezB4MzJlNywgMHhmIH0sCi0JezB4MzJlOCwgMHhmZH0sCi0JezB4MzJlOSwgMHg1N30sCi0JezB4MzJlYSwgMHhmIH0sCi0JezB4MzJlYiwgMHhkNn0sCi0JezB4MzJlYywgMHg4Zn0sCi0JezB4MzJlZCwgMHgwIH0sCi0JezB4MzJlZSwgMHgzIH0sCi0JezB4MzJlZiwgMHg5M30sCi0JezB4MzJmMCwgMHgwIH0sCi0JezB4MzJmMSwgMHg2IH0sCi0JezB4MzJmMiwgMHhhIH0sCi0JezB4MzJmMywgMHhmIH0sCi0JezB4MzJmNCwgMHhmYX0sCi0JezB4MzJmNSwgMHg2Y30sCi0JezB4MzJmNiwgMHhmIH0sCi0JezB4MzJmNywgMHhmMX0sCi0JezB4MzJmOCwgMHgxZX0sCi0JezB4MzJmOSwgMHgwIH0sCi0JezB4MzJmYSwgMHgxNH0sCi0JezB4MzJmYiwgMHhlN30sCi0JezB4MzJmYywgMHgwIH0sCi0JezB4MzJmZCwgMHgxZn0sCi0JezB4MzJmZSwgMHgyZH0sCi0JezB4MzJmZiwgMHgwIH0sCi0JezB4MzMwMCwgMHg3IH0sCi0JezB4MzMwMSwgMHg1ZX0sCi0JezB4MzMwMiwgMHhmIH0sCi0JezB4MzMwMywgMHhlMH0sCi0JezB4MzMwNCwgMHg1NX0sCi0JezB4MzMwNSwgMHgwIH0sCi0JezB4MzMwNiwgMHgyMH0sCi0JezB4MzMwNywgMHg5M30sCi0JezB4MzMwOCwgMHgwIH0sCi0JezB4MzMwOSwgMHhmIH0sCi0JezB4MzMwYSwgMHgyMH0sCi0JezB4MzMwYiwgMHhmIH0sCi0JezB4MzMwYywgMHhkN30sCi0JezB4MzMwZCwgMHhmNX0sCi0JezB4MzMwZSwgMHhmIH0sCi0JezB4MzMwZiwgMHhlZn0sCi0JezB4MzMxMCwgMHhiOH0sCi0JezB4MzMxMSwgMHhmIH0sCi0JezB4MzMxMiwgMHhmMH0sCi0JezB4MzMxMywgMHgyOX0sCi0JezB4MzMxNCwgMHgwIH0sCi0JezB4MzMxNSwgMHgyN30sCi0JezB4MzMxNiwgMHg1ZX0sCi0JezB4MzMxNywgMHhmIH0sCi0JezB4MzMxOCwgMHhkYX0sCi0JezB4MzMxOSwgMHgxNH0sCi0JezB4MzMxYSwgMHhmIH0sCi0JezB4MzMxYiwgMHhlZn0sCi0JezB4MzMxYywgMHg5M30sCi0JezB4MzMxZCwgMHgwIH0sCi0JezB4MzMxZSwgMHgyY30sCi0JezB4MzMxZiwgMHhkY30sCi0JezB4MzMyMCwgMHgwIH0sCi0JezB4MzMyMSwgMHhlIH0sCi0JezB4MzMyMiwgMHgyZH0sCi0JezB4MzMyMywgMHgwIH0sCi0JezB4MzMyNCwgMHg2IH0sCi0JezB4MzMyNSwgMHhjZn0sCi0JezB4MzMyNiwgMHhmIH0sCi0JezB4MzMyNywgMHhmYn0sCi0JezB4MzMyOCwgMHgyNn0sCi0JezB4MzMyOSwgMHgwIH0sCi0JezB4MzMyYSwgMHgzIH0sCi0JezB4MzMyYiwgMHg1IH0sCi0JezB4MzMyYywgMHgwIH0sCi0JezB4MzMyZCwgMHg2IH0sCi0JezB4MzMyZSwgMHhhNn0sCi0JezB4MzMyZiwgMHhmIH0sCi0JezB4MzMzMCwgMHhmN30sCi0JezB4MzMzMSwgMHg3Yn0sCi0JezB4MzMzMiwgMHhmIH0sCi0JezB4MzMzMywgMHhmOX0sCi0JezB4MzMzNCwgMHhiIH0sCi0JezB4MzMzNSwgMHgwIH0sCi0JezB4MzMzNiwgMHg3IH0sCi0JezB4MzMzNywgMHg1YX0sCi0JezB4MzMzOCwgMHhmIH0sCi0JezB4MzMzOSwgMHhlNH0sCi0JezB4MzMzYSwgMHg3YX0sCi0JezB4MzMzYiwgMHgwIH0sCi0JezB4MzMzYywgMHgxYn0sCi0JezB4MzMzZCwgMHhiMH0sCi0JezB4MzMzZSwgMHgwIH0sCi0JezB4MzMzZiwgMHgyIH0sCi0JezB4MzM0MCwgMHhhN30sCi0JezB4MzM0MSwgMHhmIH0sCi0JezB4MzM0MiwgMHhlOX0sCi0JezB4MzM0MywgMHgzYX0sCi0JezB4MzM0NCwgMHgwIH0sCi0JezB4MzM0NSwgMHg5NX0sCi0JezB4MzM0NiwgMHg0Mn0sCi0JezB4MzM0NywgMHhmIH0sCi0JezB4MzM0OCwgMHhkYX0sCi0JezB4MzM0OSwgMHg0NX0sCi0JezB4MzM0YSwgMHgwIH0sCi0JezB4MzM0YiwgMHgxNn0sCi0JezB4MzM0YywgMHg3YX0sCi0JezB4MzM0ZCwgMHhmIH0sCi0JezB4MzM0ZSwgMHhmYn0sCi0JezB4MzM0ZiwgMHgzMn0sCi0JezB4MzM1MCwgMHgwIH0sCi0JezB4MzM1MSwgMHg2IH0sCi0JezB4MzM1MiwgMHgzNX0sCi0JezB4MzM1MywgMHhmIH0sCi0JezB4MzM1NCwgMHhmY30sCi0JezB4MzM1NSwgMHg4Zn0sCi0JezB4MzM1NiwgMHhmIH0sCi0JezB4MzM1NywgMHhjYX0sCi0JezB4MzM1OCwgMHhkNX0sCi0JezB4MzM1OSwgMHgwIH0sCi0JezB4MzM1YSwgMHgxMX0sCi0JezB4MzM1YiwgMHg1OX0sCi0JezB4MzM1YywgMHhmIH0sCi0JezB4MzM1ZCwgMHhmYX0sCi0JezB4MzM1ZSwgMHhhYX0sCi0JezB4MzM1ZiwgMHhmIH0sCi0JezB4MzM2MCwgMHhmZX0sCi0JezB4MzM2MSwgMHg4NH0sCi0JezB4MzM2MiwgMHhmIH0sCi0JezB4MzM2MywgMHhmNn0sCi0JezB4MzM2NCwgMHg4Zn0sCi0JezB4MzM2NSwgMHgwIH0sCi0JezB4MzM2NiwgMHhiIH0sCi0JezB4MzM2NywgMHg3MH0sCi0JezB4MzM2OCwgMHgwIH0sCi0JezB4MzM2OSwgMHgyNX0sCi0JezB4MzM2YSwgMHg4M30sCi0JezB4MzM2YiwgMHhmIH0sCi0JezB4MzM2YywgMHhlN30sCi0JezB4MzM2ZCwgMHgyN30sCi0JezB4MzM2ZSwgMHhmIH0sCi0JezB4MzM2ZiwgMHhmMX0sCi0JezB4MzM3MCwgMHg3Mn0sCi0JezB4MzM3MSwgMHgwIH0sCi0JezB4MzM3MiwgMHgyMX0sCi0JezB4MzM3MywgMHg2ZH0sCi0JezB4MzM3NCwgMHgwIH0sCi0JezB4MzM3NSwgMHgyIH0sCi0JezB4MzM3NiwgMHhjM30sCi0JezB4MzM3NywgMHhmIH0sCi0JezB4MzM3OCwgMHhlOH0sCi0JezB4MzM3OSwgMHg1YX0sCi0JezB4MzM3YSwgMHhmIH0sCi0JezB4MzM3YiwgMHhmMn0sCi0JezB4MzM3YywgMHg3M30sCi0JezB4MzM3ZCwgMHgwIH0sCi0JezB4MzM3ZSwgMHgxOX0sCi0JezB4MzM3ZiwgMHhhNX0sCi0JezB4MzM4MCwgMHgwIH0sCi0JezB4MzM4MSwgMHgxYX0sCi0JezB4MzM4MiwgMHg4MX0sCi0JezB4MzM4MywgMHhmIH0sCi0JezB4MzM4NCwgMHhkMH0sCi0JezB4MzM4NSwgMHgzMX0sCi0JezB4MzM4NiwgMHhmIH0sCi0JezB4MzM4NywgMHhmYn0sCi0JezB4MzM4OCwgMHhmZn0sCi0JezB4MzM4OSwgMHgwIH0sCi0JezB4MzM4YSwgMHgxZX0sCi0JezB4MzM4YiwgMHhlMX0sCi0JezB4MzM4YywgMHgwIH0sCi0JezB4MzM4ZCwgMHg1IH0sCi0JezB4MzM4ZSwgMHhlMX0sCi0JezB4MzM4ZiwgMHhmIH0sCi0JezB4MzM5MCwgMHhlZX0sCi0JezB4MzM5MSwgMHhlMn0sCi0JezB4MzM5MiwgMHhmIH0sCi0JezB4MzM5MywgMHhmNn0sCi0JezB4MzM5NCwgMHhjZn0sCi0JezB4MzM5NSwgMHgwIH0sCi0JezB4MzM5NiwgMHgxM30sCi0JezB4MzM5NywgMHg4Zn0sCi0JezB4MzM5OCwgMHgwIH0sCi0JezB4MzM5OSwgMHgzIH0sCi0JezB4MzM5YSwgMHg2MX0sCi0JezB4MzM5YiwgMHhmIH0sCi0JezB4MzM5YywgMHhmOH0sCi0JezB4MzM5ZCwgMHhmN30sCi0JezB4MzM5ZSwgMHgwIH0sCi0JezB4MzM5ZiwgMHgwIH0sCi0JezB4MzNhMCwgMHhiNX0sCi0JezB4MzNhMSwgMHgwIH0sCi0JezB4MzNhMiwgMHg1IH0sCi0JezB4MzNhMywgMHg3OH0sCi0JezB4MzNhNCwgMHhmIH0sCi0JezB4MzNhNSwgMHhmNH0sCi0JezB4MzNhNiwgMHg1IH0sCi0JezB4MzNhNywgMHgwIH0sCi0JezB4MzNhOCwgMHhjIH0sCi0JezB4MzNhOSwgMHhlIH0sCi0JezB4MzNhYSwgMHgwIH0sCi0JezB4MzNhYiwgMHgzIH0sCi0JezB4MzNhYywgMHg1M30sCi0JezB4MzNhZCwgMHhmIH0sCi0JezB4MzNhZSwgMHhlY30sCi0JezB4MzNhZiwgMHhiZH0sCi19OwotCi1jb25zdCBzdHJ1Y3QKLXFzX3M1azRlMV9pMmNfcmVnX2NvbmYgcXNfczVrNGUxX2xlbnNoYWRpbmdfc2V0dGluZ3NbNF1bTEVOU19TSEFERV9UQUJMRV0gPSB7Ci0Jey8qMkQgUHJldmlldyovCi0JCXsweDMwOTcsIDB4NTJ9LC8qc2g0Y2hfYmxrX3dpZHRoID0gODIqLwotCQl7MHgzMDk4LCAweDNlfSwvKnNoNGNoX2Jsa19oZWlnaHQgPSA2MiovCi0JCXsweDMwOTksIDB4MDN9LC8qc2g0Y2hfc3RlcF94IG1zYiAoc2g0Y2hfc3RlcF94ID0gNzk5KSovCi0JCXsweDMwOWEsIDB4MWZ9LC8qc2g0Y2hfc3RlcF94IGxzYiovCi0JCXsweDMwOWIsIDB4MDR9LC8qc2g0Y2hfc3RlcF95IG1zYiAoc2g0Y2hfc3RlcF95ID0gMTA1NykqLwotCQl7MHgzMDljLCAweDIxfSwvKnNoNGNoX3N0ZXBfeSBsc2IqLwotCQl7MHgzMDlkLCAweDAwfSwvKnNoNGNoX3N0YXJ0X2Jsa19jbnRfeCA9IDAqLwotCQl7MHgzMDllLCAweDAwfSwvKnNoNGNoX3N0YXJ0X2ludF9jbnRfeCA9IDAqLwotCQl7MHgzMDlmLCAweDAwfSwvKnNoNGNoX3N0YXJ0X2ZyYWNfY250X3ggbXNiICgwKSovCi0JCXsweDMwYTAsIDB4MDB9LC8qc2g0Y2hfc3RhcnRfZnJhY19jbnRfeCBsc2IqLwotCQl7MHgzMGExLCAweDAwfSwvKnNoNGNoX3N0YXJ0X2Jsa19jbnRfeSA9IDAqLwotCQl7MHgzMGEyLCAweDAwfSwvKnNoNGNoX3N0YXJ0X2ludF9jbnRfeSA9IDAqLwotCQl7MHgzMGEzLCAweDAwfSwvKnNoNGNoX3N0YXJ0X2ZyYWNfY250X3kgbXNiICgwKSovCi0JCXsweDMwYTQsIDB4MDB9LC8qc2g0Y2hfc3RhcnRfZnJhY19jbnRfeSBsc2IqLwotCQl7MHgzMGE1LCAweDAxfSwKLQkJezB4MzBhNiwgMHgwMH0sLypnc19wZWRlc3RhbAk9IDY0Ki8KLQl9LAotCXsvKjJEIFNuYXBzaG90Ki8KLQkJezB4MzA5NywgMHg1Mn0sLypzaDRjaF9ibGtfd2lkdGggPSA4MiovCi0JCXsweDMwOTgsIDB4N2J9LC8qc2g0Y2hfYmxrX2hlaWdodCA9IDEyMyovCi0JCXsweDMwOTksIDB4MDN9LC8qc2g0Y2hfc3RlcF94IG1zYiAoc2g0Y2hfc3RlcF94ID0gNzk5KSovCi0JCXsweDMwOWEsIDB4MWZ9LC8qc2g0Y2hfc3RlcF94IGxzYiovCi0JCXsweDMwOWIsIDB4MDJ9LC8qc2g0Y2hfc3RlcF95IG1zYiAoc2g0Y2hfc3RlcF95ID0gNTMzKSovCi0JCXsweDMwOWMsIDB4MTV9LC8qc2g0Y2hfc3RlcF95IGxzYiovCi0JCXsweDMwOWQsIDB4MDB9LC8qc2g0Y2hfc3RhcnRfYmxrX2NudF94ID0gMCovCi0JCXsweDMwOWUsIDB4MDB9LC8qc2g0Y2hfc3RhcnRfaW50X2NudF94ID0gMCovCi0JCXsweDMwOWYsIDB4MDB9LC8qc2g0Y2hfc3RhcnRfZnJhY19jbnRfeCBtc2IgKDApKi8KLQkJezB4MzBhMCwgMHgwMH0sLypzaDRjaF9zdGFydF9mcmFjX2NudF94IGxzYiovCi0JCXsweDMwYTEsIDB4MDB9LC8qc2g0Y2hfc3RhcnRfYmxrX2NudF95ID0gMCovCi0JCXsweDMwYTIsIDB4MDB9LC8qc2g0Y2hfc3RhcnRfaW50X2NudF95ID0gMCovCi0JCXsweDMwYTMsIDB4MDB9LC8qc2g0Y2hfc3RhcnRfZnJhY19jbnRfeSBtc2IgKDApKi8KLQkJezB4MzBhNCwgMHgwMH0sLypzaDRjaF9zdGFydF9mcmFjX2NudF95IGxzYiovCi0JCXsweDMwYTUsIDB4MDF9LAotCQl7MHgzMGE2LCAweDAwfSwvKmdzX3BlZGVzdGFsCT0gNjQqLwotCX0sCi0KLQl7LyozRCBQcmV2aWV3Ki8KLQkJezB4MzA5NywgMHg1Mn0sLypzaDRjaF9ibGtfd2lkdGggPSA4MiovCi0JCXsweDMwOTgsIDB4N2J9LC8qc2g0Y2hfYmxrX2hlaWdodCA9IDEyMyovCi0JCXsweDMwOTksIDB4MDN9LC8qc2g0Y2hfc3RlcF94IG1zYiAoc2g0Y2hfc3RlcF94ID0gNzk5KSovCi0JCXsweDMwOWEsIDB4MWZ9LC8qc2g0Y2hfc3RlcF94IGxzYiovCi0JCXsweDMwOWIsIDB4MDJ9LC8qc2g0Y2hfc3RlcF95IG1zYiAoc2g0Y2hfc3RlcF95ID0gNTMzKSovCi0JCXsweDMwOWMsIDB4MTV9LC8qc2g0Y2hfc3RlcF95IGxzYiovCi0JCXsweDMwOWQsIDB4M2F9LC8qc2g0Y2hfc3RhcnRfYmxrX2NudF94ID0gNTgqLwotCQl7MHgzMDllLCAweDAxfSwvKnNoNGNoX3N0YXJ0X2ludF9jbnRfeCA9IDEqLwotCQl7MHgzMDlmLCAweGI1fSwvKnNoNGNoX3N0YXJ0X2ZyYWNfY250X3ggbXNiICg0NjM0MikqLwotCQl7MHgzMGEwLCAweDA2fSwvKnNoNGNoX3N0YXJ0X2ZyYWNfY250X3ggbHNiKi8KLQkJezB4MzBhMSwgMHgyM30sLypzaDRjaF9zdGFydF9ibGtfY250X3kgPSAzNSovCi0JCXsweDMwYTIsIDB4MDN9LC8qc2g0Y2hfc3RhcnRfaW50X2NudF95ID0gMyovCi0JCXsweDMwYTMsIDB4NDh9LC8qc2g0Y2hfc3RhcnRfZnJhY19jbnRfeSBtc2IgKDQ2MzQyKSovCi0JCXsweDMwYTQsIDB4ZGZ9LC8qc2g0Y2hfc3RhcnRfZnJhY19jbnRfeSBsc2IqLwotCQl7MHgzMGE1LCAweDAxfSwKLQkJezB4MzBhNiwgMHgwMH0sLypnc19wZWRlc3RhbAk9IDY0Ki8KLQl9LAotCi0Jey8qM0QgU25hcHNob3QqLwotCQl7MHgzMDk3LCAweDUyfSwvKnNoNGNoX2Jsa193aWR0aCA9IDgyKi8KLQkJezB4MzA5OCwgMHg3Yn0sLypzaDRjaF9ibGtfaGVpZ2h0ID0gMTIzKi8KLQkJezB4MzA5OSwgMHgwM30sLypzaDRjaF9zdGVwX3ggbXNiIChzaDRjaF9zdGVwX3ggPSA3OTkpKi8KLQkJezB4MzA5YSwgMHgxZn0sLypzaDRjaF9zdGVwX3ggbHNiKi8KLQkJezB4MzA5YiwgMHgwMn0sLypzaDRjaF9zdGVwX3kgbXNiIChzaDRjaF9zdGVwX3kgPSA1MzMpKi8KLQkJezB4MzA5YywgMHgxNX0sLypzaDRjaF9zdGVwX3kgbHNiKi8KLQkJezB4MzA5ZCwgMHgzOH0sLypzaDRjaF9zdGFydF9ibGtfY250X3ggPSA1NiovCi0JCXsweDMwOWUsIDB4MDF9LC8qc2g0Y2hfc3RhcnRfaW50X2NudF94ID0gMSovCi0JCXsweDMwOWYsIDB4YWV9LC8qc2g0Y2hfc3RhcnRfZnJhY19jbnRfeCBtc2IgKDQ0NzQ0KSovCi0JCXsweDMwYTAsIDB4Yzh9LC8qc2g0Y2hfc3RhcnRfZnJhY19jbnRfeCBsc2IqLwotCQl7MHgzMGExLCAweDIzfSwvKnNoNGNoX3N0YXJ0X2Jsa19jbnRfeSA9IDM1Ki8KLQkJezB4MzBhMiwgMHgwM30sLypzaDRjaF9zdGFydF9pbnRfY250X3kgPSAzKi8KLQkJezB4MzBhMywgMHg0OH0sLypzaDRjaF9zdGFydF9mcmFjX2NudF95IG1zYiAoNDQ3NDQpKi8KLQkJezB4MzBhNCwgMHhkZn0sLypzaDRjaF9zdGFydF9mcmFjX2NudF95IGxzYiovCi0JCXsweDMwYTUsIDB4MDF9LAotCQl7MHgzMGE2LCAweDAwfSwvKmdzX3BlZGVzdGFsCT0gNjQqLwotCX0sCi0KLX07Ci0KLXN0cnVjdCBxc19zNWs0ZTFfaTJjX2NvbmZfYXJyYXkgcXNfczVrNGUxX2NvbmZzW10gPSB7Ci0JeyZxc19zNWs0ZTFfcHJldl9zZXR0aW5nc18yZFswXSwgXAotCQlBUlJBWV9TSVpFKHFzX3M1azRlMV9wcmV2X3NldHRpbmdzXzJkKX0sCi0JeyZxc19zNWs0ZTFfc25hcF9zZXR0aW5nc18yZFswXSwgXAotCQlBUlJBWV9TSVpFKHFzX3M1azRlMV9zbmFwX3NldHRpbmdzXzJkKX0sCi0JeyZxc19zNWs0ZTFfcHJldl9zZXR0aW5nc18zZFswXSwgXAotCQlBUlJBWV9TSVpFKHFzX3M1azRlMV9wcmV2X3NldHRpbmdzXzNkKX0sCi0JeyZxc19zNWs0ZTFfc25hcF9zZXR0aW5nc18zZFswXSwgXAotCQlBUlJBWV9TSVpFKHFzX3M1azRlMV9zbmFwX3NldHRpbmdzXzNkKX0sCi19Owotc3RydWN0IHFzX3M1azRlMV9yZWcgcXNfczVrNGUxX3JlZ3MgPSB7Ci0JLnJlY19zZXR0aW5ncyA9ICZxc19zNWs0ZTFfcmVjb21tZW5kX3NldHRpbmdzWzBdLAotCS5yZWNfc2l6ZSA9IEFSUkFZX1NJWkUocXNfczVrNGUxX3JlY29tbWVuZF9zZXR0aW5ncyksCi0JLnJlZ19sZW5zID0gJnFzX3M1azRlMV9sZW5zaGFkaW5nX3NldHRpbmdzWzBdLAotCS5yZWdfbGVuc19zaXplID0gQVJSQVlfU0laRShxc19zNWs0ZTFfbGVuc2hhZGluZ19zZXR0aW5nc1swXSksCi0JLnJlZ19kZWZhdWx0X2xlbnMgPSAmcXNfczVrNGUxX2RlZmF1bHRfbGVuc2hhZGluZ19zZXR0aW5nc1swXSwKLQkucmVnX2RlZmF1bHRfbGVuc19zaXplID0KLQkJQVJSQVlfU0laRShxc19zNWs0ZTFfZGVmYXVsdF9sZW5zaGFkaW5nX3NldHRpbmdzKSwKLQkuY29uZl9hcnJheSA9ICZxc19zNWs0ZTFfY29uZnNbMF0sCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3M1azNlMmZ4LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvczVrM2UyZnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1OTFkOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvczVrM2UyZnguYworKysgL2Rldi9udWxsCkBAIC0xLDEzODcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgInM1azNlMmZ4LmgiCi0KLSNkZWZpbmUgUzVLM0UyRlhfUkVHX01PREVMX0lEICAgMHgwMDAwCi0jZGVmaW5lIFM1SzNFMkZYX01PREVMX0lEICAgICAgIDB4M0UyRgotCi0vKiBQTEwgUmVnaXN0ZXJzICovCi0jZGVmaW5lIFJFR19QUkVfUExMX0NMS19ESVYgICAgICAgICAgIDB4MDMwNQotI2RlZmluZSBSRUdfUExMX01VTFRJUExJRVJfTVNCICAgICAgICAweDAzMDYKLSNkZWZpbmUgUkVHX1BMTF9NVUxUSVBMSUVSX0xTQiAgICAgICAgMHgwMzA3Ci0jZGVmaW5lIFJFR19WVF9QSVhfQ0xLX0RJViAgICAgICAgICAgIDB4MDMwMQotI2RlZmluZSBSRUdfVlRfU1lTX0NMS19ESVYgICAgICAgICAgICAweDAzMDMKLSNkZWZpbmUgUkVHX09QX1BJWF9DTEtfRElWICAgICAgICAgICAgMHgwMzA5Ci0jZGVmaW5lIFJFR19PUF9TWVNfQ0xLX0RJViAgICAgICAgICAgIDB4MDMwQgotCi0vKiBEYXRhIEZvcm1hdCBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgUkVHX0NDUF9EQVRBX0ZPUk1BVF9NU0IgICAgICAgMHgwMTEyCi0jZGVmaW5lIFJFR19DQ1BfREFUQV9GT1JNQVRfTFNCICAgICAgIDB4MDExMwotCi0vKiBPdXRwdXQgU2l6ZSAqLwotI2RlZmluZSBSRUdfWF9PVVRQVVRfU0laRV9NU0IgICAgICAgICAweDAzNEMKLSNkZWZpbmUgUkVHX1hfT1VUUFVUX1NJWkVfTFNCICAgICAgICAgMHgwMzRECi0jZGVmaW5lIFJFR19ZX09VVFBVVF9TSVpFX01TQiAgICAgICAgIDB4MDM0RQotI2RlZmluZSBSRUdfWV9PVVRQVVRfU0laRV9MU0IgICAgICAgICAweDAzNEYKLQotLyogQmlubmluZyAqLwotI2RlZmluZSBSRUdfWF9FVkVOX0lOQyAgICAgICAgICAgICAgICAweDAzODEKLSNkZWZpbmUgUkVHX1hfT0REX0lOQyAgICAgICAgICAgICAgICAgMHgwMzgzCi0jZGVmaW5lIFJFR19ZX0VWRU5fSU5DICAgICAgICAgICAgICAgIDB4MDM4NQotI2RlZmluZSBSRUdfWV9PRERfSU5DICAgICAgICAgICAgICAgICAweDAzODcKLS8qUmVzZXJ2ZWQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgUkVHX0JJTk5JTkdfRU5BQkxFICAgICAgICAgICAgMHgzMDE0Ci0KLS8qIEZyYW1lIEZvdG1hdCAqLwotI2RlZmluZSBSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX01TQiAgICAweDAzNDAKLSNkZWZpbmUgUkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19MU0IgICAgMHgwMzQxCi0jZGVmaW5lIFJFR19MSU5FX0xFTkdUSF9QQ0tfTVNCICAgICAgIDB4MDM0MgotI2RlZmluZSBSRUdfTElORV9MRU5HVEhfUENLX0xTQiAgICAgICAweDAzNDMKLQotLyogTVNSIHNldHRpbmcgKi8KLS8qIFJlc2VydmVkIHJlZ2lzdGVycyAqLwotI2RlZmluZSBSRUdfU0hBREVfQ0xLX0VOQUJMRSAgICAgICAgICAweDMwQUMKLSNkZWZpbmUgUkVHX1NFTF9DQ1AgICAgICAgICAgICAgICAgICAgMHgzMEM0Ci0jZGVmaW5lIFJFR19WUElYICAgICAgICAgICAgICAgICAgICAgIDB4MzAyNAotI2RlZmluZSBSRUdfQ0xBTVBfT04gICAgICAgICAgICAgICAgICAweDMwMTUKLSNkZWZpbmUgUkVHX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgzMDdFCi0KLS8qIENEUyB0aW1pbmcgc2V0dGluZ3MgKi8KLS8qIFJlc2VydmVkIHJlZ2lzdGVycyAqLwotI2RlZmluZSBSRUdfTERfU1RBUlQgICAgICAgICAgICAgICAgICAweDMwMDAKLSNkZWZpbmUgUkVHX0xEX0VORCAgICAgICAgICAgICAgICAgICAgMHgzMDAxCi0jZGVmaW5lIFJFR19TTF9TVEFSVCAgICAgICAgICAgICAgICAgIDB4MzAwMgotI2RlZmluZSBSRUdfU0xfRU5EICAgICAgICAgICAgICAgICAgICAweDMwMDMKLSNkZWZpbmUgUkVHX1JYX1NUQVJUICAgICAgICAgICAgICAgICAgMHgzMDA0Ci0jZGVmaW5lIFJFR19TMV9TVEFSVCAgICAgICAgICAgICAgICAgIDB4MzAwNQotI2RlZmluZSBSRUdfUzFfRU5EICAgICAgICAgICAgICAgICAgICAweDMwMDYKLSNkZWZpbmUgUkVHX1MxU19TVEFSVCAgICAgICAgICAgICAgICAgMHgzMDA3Ci0jZGVmaW5lIFJFR19TMVNfRU5EICAgICAgICAgICAgICAgICAgIDB4MzAwOAotI2RlZmluZSBSRUdfUzNfU1RBUlQgICAgICAgICAgICAgICAgICAweDMwMDkKLSNkZWZpbmUgUkVHX1MzX0VORCAgICAgICAgICAgICAgICAgICAgMHgzMDBBCi0jZGVmaW5lIFJFR19DTVBfRU5fU1RBUlQgICAgICAgICAgICAgIDB4MzAwQgotI2RlZmluZSBSRUdfQ0xQX1NMX1NUQVJUICAgICAgICAgICAgICAweDMwMEMKLSNkZWZpbmUgUkVHX0NMUF9TTF9FTkQgICAgICAgICAgICAgICAgMHgzMDBECi0jZGVmaW5lIFJFR19PRkZfU1RBUlQgICAgICAgICAgICAgICAgIDB4MzAwRQotI2RlZmluZSBSRUdfUk1QX0VOX1NUQVJUICAgICAgICAgICAgICAweDMwMEYKLSNkZWZpbmUgUkVHX1RYX1NUQVJUICAgICAgICAgICAgICAgICAgMHgzMDEwCi0jZGVmaW5lIFJFR19UWF9FTkQgICAgICAgICAgICAgICAgICAgIDB4MzAxMQotI2RlZmluZSBSRUdfU1RYX1dJRFRIICAgICAgICAgICAgICAgICAweDMwMTIKLSNkZWZpbmUgUkVHX1RZUEUxX0FGX0VOQUJMRSAgICAgICAgICAgMHgzMTMwCi0jZGVmaW5lIERSSVZFUl9FTkFCTEVEICAgICAgICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBBVVRPX1NUQVJUX0VOQUJMRUQgICAgICAgICAgICAweDAwMTAKLSNkZWZpbmUgUkVHX05FV19QT1NJVElPTiAgICAgICAgICAgICAgMHgzMTMxCi0jZGVmaW5lIFJFR18zMTUyX1JFU0VSVkVEICAgICAgICAgICAgIDB4MzE1MgotI2RlZmluZSBSRUdfMzE1QV9SRVNFUlZFRCAgICAgICAgICAgICAweDMxNUEKLSNkZWZpbmUgUkVHX0FOQUxPR1VFX0dBSU5fQ09ERV9HTE9CQUxfTVNCIDB4MDIwNAotI2RlZmluZSBSRUdfQU5BTE9HVUVfR0FJTl9DT0RFX0dMT0JBTF9MU0IgMHgwMjA1Ci0jZGVmaW5lIFJFR19GSU5FX0lOVEVHUkFUSU9OX1RJTUUgICAgICAgICAweDAyMDAKLSNkZWZpbmUgUkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FICAgICAgIDB4MDIwMgotI2RlZmluZSBSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfTFNCICAgMHgwMjAzCi0KLS8qIE1vZGUgc2VsZWN0IHJlZ2lzdGVyICovCi0jZGVmaW5lIFM1SzNFMkZYX1JFR19NT0RFX1NFTEVDVCAgICAgIDB4MDEwMAotI2RlZmluZSBTNUszRTJGWF9NT0RFX1NFTEVDVF9TVFJFQU0gICAgIDB4MDEgICAvKiBzdGFydCBzdHJlYW1pbmcgKi8KLSNkZWZpbmUgUzVLM0UyRlhfTU9ERV9TRUxFQ1RfU1dfU1RBTkRCWSAweDAwICAgLyogc29mdHdhcmUgc3RhbmRieSAqLwotI2RlZmluZSBTNUszRTJGWF9SRUdfU09GVFdBUkVfUkVTRVQgICAweDAxMDMKLSNkZWZpbmUgUzVLM0UyRlhfU09GVFdBUkVfUkVTRVQgICAgICAgICAweDAxCi0jZGVmaW5lIFJFR19URVNUX1BBVFRFUk5fTU9ERSAgICAgICAgIDB4MDYwMQotCi1zdHJ1Y3QgcmVnX3N0cnVjdCB7Ci0gIHVpbnQ4X3QgcHJlX3BsbF9jbGtfZGl2OyAgICAgICAgICAgICAgIC8qIDB4MDMwNSAqLwotICB1aW50OF90IHBsbF9tdWx0aXBsaWVyX21zYjsgICAgICAgICAgICAvKiAweDAzMDYgKi8KLSAgdWludDhfdCBwbGxfbXVsdGlwbGllcl9sc2I7ICAgICAgICAgICAgLyogMHgwMzA3ICovCi0gIHVpbnQ4X3QgdnRfcGl4X2Nsa19kaXY7ICAgICAgICAgICAgICAgIC8qIDB4MDMwMSAqLwotICB1aW50OF90IHZ0X3N5c19jbGtfZGl2OyAgICAgICAgICAgICAgICAvKiAweDAzMDMgKi8KLSAgdWludDhfdCBvcF9waXhfY2xrX2RpdjsgICAgICAgICAgICAgICAgLyogMHgwMzA5ICovCi0gIHVpbnQ4X3Qgb3Bfc3lzX2Nsa19kaXY7ICAgICAgICAgICAgICAgIC8qIDB4MDMwQiAqLwotICB1aW50OF90IGNjcF9kYXRhX2Zvcm1hdF9tc2I7ICAgICAgICAgICAvKiAweDAxMTIgKi8KLSAgdWludDhfdCBjY3BfZGF0YV9mb3JtYXRfbHNiOyAgICAgICAgICAgLyogMHgwMTEzICovCi0gIHVpbnQ4X3QgeF9vdXRwdXRfc2l6ZV9tc2I7ICAgICAgICAgICAgIC8qIDB4MDM0QyAqLwotICB1aW50OF90IHhfb3V0cHV0X3NpemVfbHNiOyAgICAgICAgICAgICAvKiAweDAzNEQgKi8KLSAgdWludDhfdCB5X291dHB1dF9zaXplX21zYjsgICAgICAgICAgICAgLyogMHgwMzRFICovCi0gIHVpbnQ4X3QgeV9vdXRwdXRfc2l6ZV9sc2I7ICAgICAgICAgICAgIC8qIDB4MDM0RiAqLwotICB1aW50OF90IHhfZXZlbl9pbmM7ICAgICAgICAgICAgICAgICAgICAvKiAweDAzODEgKi8KLSAgdWludDhfdCB4X29kZF9pbmM7ICAgICAgICAgICAgICAgICAgICAgLyogMHgwMzgzICovCi0gIHVpbnQ4X3QgeV9ldmVuX2luYzsgICAgICAgICAgICAgICAgICAgIC8qIDB4MDM4NSAqLwotICB1aW50OF90IHlfb2RkX2luYzsgICAgICAgICAgICAgICAgICAgICAvKiAweDAzODcgKi8KLSAgdWludDhfdCBiaW5uaW5nX2VuYWJsZTsgICAgICAgICAgICAgICAgLyogMHgzMDE0ICovCi0gIHVpbnQ4X3QgZnJhbWVfbGVuZ3RoX2xpbmVzX21zYjsgICAgICAgIC8qIDB4MDM0MCAqLwotICB1aW50OF90IGZyYW1lX2xlbmd0aF9saW5lc19sc2I7ICAgICAgICAvKiAweDAzNDEgKi8KLSAgdWludDhfdCBsaW5lX2xlbmd0aF9wY2tfbXNiOyAgICAgICAgICAgLyogMHgwMzQyICovCi0gIHVpbnQ4X3QgbGluZV9sZW5ndGhfcGNrX2xzYjsgICAgICAgICAgIC8qIDB4MDM0MyAqLwotICB1aW50OF90IHNoYWRlX2Nsa19lbmFibGUgOyAgICAgICAgICAgICAvKiAweDMwQUMgKi8KLSAgdWludDhfdCBzZWxfY2NwOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgzMEM0ICovCi0gIHVpbnQ4X3QgdnBpeDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MzAyNCAqLwotICB1aW50OF90IGNsYW1wX29uOyAgICAgICAgICAgICAgICAgICAgICAvKiAweDMwMTUgKi8KLSAgdWludDhfdCBvZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgzMDdFICovCi0gIHVpbnQ4X3QgbGRfc3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MzAwMCAqLwotICB1aW50OF90IGxkX2VuZDsgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDMwMDEgKi8KLSAgdWludDhfdCBzbF9zdGFydDsgICAgICAgICAgICAgICAgICAgICAgLyogMHgzMDAyICovCi0gIHVpbnQ4X3Qgc2xfZW5kOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MzAwMyAqLwotICB1aW50OF90IHJ4X3N0YXJ0OyAgICAgICAgICAgICAgICAgICAgICAvKiAweDMwMDQgKi8KLSAgdWludDhfdCBzMV9zdGFydDsgICAgICAgICAgICAgICAgICAgICAgLyogMHgzMDA1ICovCi0gIHVpbnQ4X3QgczFfZW5kOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MzAwNiAqLwotICB1aW50OF90IHMxc19zdGFydDsgICAgICAgICAgICAgICAgICAgICAvKiAweDMwMDcgKi8KLSAgdWludDhfdCBzMXNfZW5kOyAgICAgICAgICAgICAgICAgICAgICAgLyogMHgzMDA4ICovCi0gIHVpbnQ4X3QgczNfc3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MzAwOSAqLwotICB1aW50OF90IHMzX2VuZDsgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDMwMEEgKi8KLSAgdWludDhfdCBjbXBfZW5fc3RhcnQ7ICAgICAgICAgICAgICAgICAgLyogMHgzMDBCICovCi0gIHVpbnQ4X3QgY2xwX3NsX3N0YXJ0OyAgICAgICAgICAgICAgICAgIC8qIDB4MzAwQyAqLwotICB1aW50OF90IGNscF9zbF9lbmQ7ICAgICAgICAgICAgICAgICAgICAvKiAweDMwMEQgKi8KLSAgdWludDhfdCBvZmZfc3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgLyogMHgzMDBFICovCi0gIHVpbnQ4X3Qgcm1wX2VuX3N0YXJ0OyAgICAgICAgICAgICAgICAgIC8qIDB4MzAwRiAqLwotICB1aW50OF90IHR4X3N0YXJ0OyAgICAgICAgICAgICAgICAgICAgICAvKiAweDMwMTAgKi8KLSAgdWludDhfdCB0eF9lbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgzMDExICovCi0gIHVpbnQ4X3Qgc3R4X3dpZHRoOyAgICAgICAgICAgICAgICAgICAgIC8qIDB4MzAxMiAqLwotICB1aW50OF90IHJlZ18zMTUyX3Jlc2VydmVkOyAgICAgICAgICAgICAvKiAweDMxNTIgKi8KLSAgdWludDhfdCByZWdfMzE1QV9yZXNlcnZlZDsgICAgICAgICAgICAgLyogMHgzMTVBICovCi0gIHVpbnQ4X3QgYW5hbG9ndWVfZ2Fpbl9jb2RlX2dsb2JhbF9tc2I7IC8qIDB4MDIwNCAqLwotICB1aW50OF90IGFuYWxvZ3VlX2dhaW5fY29kZV9nbG9iYWxfbHNiOyAvKiAweDAyMDUgKi8KLSAgdWludDhfdCBmaW5lX2ludGVncmF0aW9uX3RpbWU7ICAgICAgICAgLyogMHgwMjAwICovCi0gIHVpbnQ4X3QgY29hcnNlX2ludGVncmF0aW9uX3RpbWU7ICAgICAgIC8qIDB4MDIwMiAqLwotICB1aW50MzJfdCAgc2l6ZV9oOwotICB1aW50MzJfdCAgYmxrX2w7Ci0gIHVpbnQzMl90ICBzaXplX3c7Ci0gIHVpbnQzMl90ICBibGtfcDsKLX07Ci0KLXN0cnVjdCByZWdfc3RydWN0IHM1azNlMmZ4X3JlZ19wYXRbMl0gPSAgewotICB7CS8qIFByZXZpZXcgKi8KLSAgICAweDA2LCAgLyogcHJlX3BsbF9jbGtfZGl2ICAgICAgIFJFRz0weDAzMDUgKi8KLSAgICAweDAwLCAgLyogcGxsX211bHRpcGxpZXJfbXNiICAgIFJFRz0weDAzMDYgKi8KLSAgICAweDg4LCAgLyogcGxsX211bHRpcGxpZXJfbHNiICAgIFJFRz0weDAzMDcgKi8KLSAgICAweDBhLCAgLyogdnRfcGl4X2Nsa19kaXYgICAgICAgIFJFRz0weDAzMDEgKi8KLSAgICAweDAxLCAgLyogdnRfc3lzX2Nsa19kaXYgICAgICAgIFJFRz0weDAzMDMgKi8KLSAgICAweDBhLCAgLyogb3BfcGl4X2Nsa19kaXYgICAgICAgIFJFRz0weDAzMDkgKi8KLSAgICAweDAxLCAgLyogb3Bfc3lzX2Nsa19kaXYgICAgICAgIFJFRz0weDAzMEIgKi8KLSAgICAweDBhLCAgLyogY2NwX2RhdGFfZm9ybWF0X21zYiAgIFJFRz0weDAxMTIgKi8KLSAgICAweDBhLCAgLyogY2NwX2RhdGFfZm9ybWF0X2xzYiAgIFJFRz0weDAxMTMgKi8KLSAgICAweDA1LCAgLyogeF9vdXRwdXRfc2l6ZV9tc2IgICAgIFJFRz0weDAzNEMgKi8KLSAgICAweDEwLCAgLyogeF9vdXRwdXRfc2l6ZV9sc2IgICAgIFJFRz0weDAzNEQgKi8KLSAgICAweDAzLCAgLyogeV9vdXRwdXRfc2l6ZV9tc2IgICAgIFJFRz0weDAzNEUgKi8KLSAgICAweGNjLCAgLyogeV9vdXRwdXRfc2l6ZV9sc2IgICAgIFJFRz0weDAzNEYgKi8KLQotICAgIC8qIGVuYWJsZSBiaW5uaW5nIGZvciBwcmV2aWV3ICovCi0gICAgMHgwMSwgIC8qIHhfZXZlbl9pbmMgICAgICAgICAgICAgUkVHPTB4MDM4MSAqLwotICAgIDB4MDEsICAvKiB4X29kZF9pbmMgICAgICAgICAgICAgIFJFRz0weDAzODMgKi8KLSAgICAweDAxLCAgLyogeV9ldmVuX2luYyAgICAgICAgICAgICBSRUc9MHgwMzg1ICovCi0gICAgMHgwMywgIC8qIHlfb2RkX2luYyAgICAgICAgICAgICAgUkVHPTB4MDM4NyAqLwotICAgIDB4MDYsICAvKiBiaW5uaW5nX2VuYWJsZSAgICAgICAgIFJFRz0weDMwMTQgKi8KLQotICAgIDB4MDMsICAvKiBmcmFtZV9sZW5ndGhfbGluZXNfbXNiICAgICAgICBSRUc9MHgwMzQwICovCi0gICAgMHhkZSwgIC8qIGZyYW1lX2xlbmd0aF9saW5lc19sc2IgICAgICAgIFJFRz0weDAzNDEgKi8KLSAgICAweDBhLCAgLyogbGluZV9sZW5ndGhfcGNrX21zYiAgICAgICAgICAgUkVHPTB4MDM0MiAqLwotICAgIDB4YWMsICAvKiBsaW5lX2xlbmd0aF9wY2tfbHNiICAgICAgICAgICBSRUc9MHgwMzQzICovCi0gICAgMHg4MSwgIC8qIHNoYWRlX2Nsa19lbmFibGUgICAgICAgICAgICAgIFJFRz0weDMwQUMgKi8KLSAgICAweDAxLCAgLyogc2VsX2NjcCAgICAgICAgICAgICAgICAgICAgICAgUkVHPTB4MzBDNCAqLwotICAgIDB4MDQsICAvKiB2cGl4ICAgICAgICAgICAgICAgICAgICAgICAgICBSRUc9MHgzMDI0ICovCi0gICAgMHgwMCwgIC8qIGNsYW1wX29uICAgICAgICAgICAgICAgICAgICAgIFJFRz0weDMwMTUgKi8KLSAgICAweDAyLCAgLyogb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgUkVHPTB4MzA3RSAqLwotICAgIDB4MDMsICAvKiBsZF9zdGFydCAgICAgICAgICAgICAgICAgICAgICBSRUc9MHgzMDAwICovCi0gICAgMHg5YywgIC8qIGxkX2VuZCAgICAgICAgICAgICAgICAgICAgICAgIFJFRz0weDMwMDEgKi8KLSAgICAweDAyLCAgLyogc2xfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgUkVHPTB4MzAwMiAqLwotICAgIDB4OWUsICAvKiBzbF9lbmQgICAgICAgICAgICAgICAgICAgICAgICBSRUc9MHgzMDAzICovCi0gICAgMHgwNSwgIC8qIHJ4X3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgIFJFRz0weDMwMDQgKi8KLSAgICAweDBmLCAgLyogczFfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgUkVHPTB4MzAwNSAqLwotICAgIDB4MjQsICAvKiBzMV9lbmQgICAgICAgICAgICAgICAgICAgICAgICBSRUc9MHgzMDA2ICovCi0gICAgMHg3YywgIC8qIHMxc19zdGFydCAgICAgICAgICAgICAgICAgICAgIFJFRz0weDMwMDcgKi8KLSAgICAweDlhLCAgLyogczFzX2VuZCAgICAgICAgICAgICAgICAgICAgICAgUkVHPTB4MzAwOCAqLwotICAgIDB4MTAsICAvKiBzM19zdGFydCAgICAgICAgICAgICAgICAgICAgICBSRUc9MHgzMDA5ICovCi0gICAgMHgxNCwgIC8qIHMzX2VuZCAgICAgICAgICAgICAgICAgICAgICAgIFJFRz0weDMwMEEgKi8KLSAgICAweDEwLCAgLyogY21wX2VuX3N0YXJ0ICAgICAgICAgICAgICAgICAgUkVHPTB4MzAwQiAqLwotICAgIDB4MDQsICAvKiBjbHBfc2xfc3RhcnQgICAgICAgICAgICAgICAgICBSRUc9MHgzMDBDICovCi0gICAgMHgyNiwgIC8qIGNscF9zbF9lbmQgICAgICAgICAgICAgICAgICAgIFJFRz0weDMwMEQgKi8KLSAgICAweDAyLCAgLyogb2ZmX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgUkVHPTB4MzAwRSAqLwotICAgIDB4MGUsICAvKiBybXBfZW5fc3RhcnQgICAgICAgICAgICAgICAgICBSRUc9MHgzMDBGICovCi0gICAgMHgzMCwgIC8qIHR4X3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgIFJFRz0weDMwMTAgKi8KLSAgICAweDRlLCAgLyogdHhfZW5kICAgICAgICAgICAgICAgICAgICAgICAgUkVHPTB4MzAxMSAqLwotICAgIDB4MUUsICAvKiBzdHhfd2lkdGggICAgICAgICAgICAgICAgICAgICBSRUc9MHgzMDEyICovCi0gICAgMHgwOCwgIC8qIHJlZ18zMTUyX3Jlc2VydmVkICAgICAgICAgICAgIFJFRz0weDMxNTIgKi8KLSAgICAweDEwLCAgLyogcmVnXzMxNUFfcmVzZXJ2ZWQgICAgICAgICAgICAgUkVHPTB4MzE1QSAqLwotICAgIDB4MDAsICAvKiBhbmFsb2d1ZV9nYWluX2NvZGVfZ2xvYmFsX21zYiBSRUc9MHgwMjA0ICovCi0gICAgMHg4MCwgIC8qIGFuYWxvZ3VlX2dhaW5fY29kZV9nbG9iYWxfbHNiIFJFRz0weDAyMDUgKi8KLSAgICAweDAyLCAgLyogZmluZV9pbnRlZ3JhdGlvbl90aW1lICAgICAgICAgUkVHPTB4MDIwMCAqLwotICAgIDB4MDMsICAvKiBjb2Fyc2VfaW50ZWdyYXRpb25fdGltZSAgICAgICBSRUc9MHgwMjAyICovCi0JCTk3MiwKLQkJMTgsCi0JCTEyOTYsCi0JCTE0MzYKLSAgfSwKLSAgeyAvKiBTbmFwc2hvdCAqLwotICAgIDB4MDYsICAvKiBwcmVfcGxsX2Nsa19kaXYgICAgICAgICAgICAgICBSRUc9MHgwMzA1ICovCi0gICAgMHgwMCwgIC8qIHBsbF9tdWx0aXBsaWVyX21zYiAgICAgICAgICAgIFJFRz0weDAzMDYgKi8KLSAgICAweDg4LCAgLyogcGxsX211bHRpcGxpZXJfbHNiICAgICAgICAgICAgUkVHPTB4MDMwNyAqLwotICAgIDB4MGEsICAvKiB2dF9waXhfY2xrX2RpdiAgICAgICAgICAgICAgICBSRUc9MHgwMzAxICovCi0gICAgMHgwMSwgIC8qIHZ0X3N5c19jbGtfZGl2ICAgICAgICAgICAgICAgIFJFRz0weDAzMDMgKi8KLSAgICAweDBhLCAgLyogb3BfcGl4X2Nsa19kaXYgICAgICAgICAgICAgICAgUkVHPTB4MDMwOSAqLwotICAgIDB4MDEsICAvKiBvcF9zeXNfY2xrX2RpdiAgICAgICAgICAgICAgICBSRUc9MHgwMzBCICovCi0gICAgMHgwYSwgIC8qIGNjcF9kYXRhX2Zvcm1hdF9tc2IgICAgICAgICAgIFJFRz0weDAxMTIgKi8KLSAgICAweDBhLCAgLyogY2NwX2RhdGFfZm9ybWF0X2xzYiAgICAgICAgICAgUkVHPTB4MDExMyAqLwotICAgIDB4MGEsICAvKiB4X291dHB1dF9zaXplX21zYiAgICAgICAgICAgICBSRUc9MHgwMzRDICovCi0gICAgMHgzMCwgIC8qIHhfb3V0cHV0X3NpemVfbHNiICAgICAgICAgICAgIFJFRz0weDAzNEQgKi8KLSAgICAweDA3LCAgLyogeV9vdXRwdXRfc2l6ZV9tc2IgICAgICAgICAgICAgUkVHPTB4MDM0RSAqLwotICAgIDB4YTgsICAvKiB5X291dHB1dF9zaXplX2xzYiAgICAgICAgICAgICBSRUc9MHgwMzRGICovCi0KLSAgICAvKiBkaXNhYmxlIGJpbm5pbmcgZm9yIHNuYXBzaG90ICovCi0gICAgMHgwMSwgIC8qIHhfZXZlbl9pbmMgICAgICAgICAgICAgICAgICAgIFJFRz0weDAzODEgKi8KLSAgICAweDAxLCAgLyogeF9vZGRfaW5jICAgICAgICAgICAgICAgICAgICAgUkVHPTB4MDM4MyAqLwotICAgIDB4MDEsICAvKiB5X2V2ZW5faW5jICAgICAgICAgICAgICAgICAgICBSRUc9MHgwMzg1ICovCi0gICAgMHgwMSwgIC8qIHlfb2RkX2luYyAgICAgICAgICAgICAgICAgICAgIFJFRz0weDAzODcgKi8KLSAgICAweDAwLCAgLyogYmlubmluZ19lbmFibGUgICAgICAgICAgICAgICAgUkVHPTB4MzAxNCAqLwotCi0gICAgMHgwNywgIC8qIGZyYW1lX2xlbmd0aF9saW5lc19tc2IgICAgICAgIFJFRz0weDAzNDAgKi8KLSAgICAweGI2LCAgLyogZnJhbWVfbGVuZ3RoX2xpbmVzX2xzYiAgICAgICAgUkVHPTB4MDM0MSAqLwotICAgIDB4MGEsICAvKiBsaW5lX2xlbmd0aF9wY2tfbXNiICAgICAgICAgICBSRUc9MHgwMzQyICovCi0gICAgMHhhYywgIC8qIGxpbmVfbGVuZ3RoX3Bja19sc2IgICAgICAgICAgIFJFRz0weDAzNDMgKi8KLSAgICAweDgxLCAgLyogc2hhZGVfY2xrX2VuYWJsZSAgICAgICAgICAgICAgUkVHPTB4MzBBQyAqLwotICAgIDB4MDEsICAvKiBzZWxfY2NwICAgICAgICAgICAgICAgICAgICAgICBSRUc9MHgzMEM0ICovCi0gICAgMHgwNCwgIC8qIHZwaXggICAgICAgICAgICAgICAgICAgICAgICAgIFJFRz0weDMwMjQgKi8KLSAgICAweDAwLCAgLyogY2xhbXBfb24gICAgICAgICAgICAgICAgICAgICAgUkVHPTB4MzAxNSAqLwotICAgIDB4MDIsICAvKiBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICBSRUc9MHgzMDdFICovCi0gICAgMHgwMywgIC8qIGxkX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgIFJFRz0weDMwMDAgKi8KLSAgICAweDljLCAgLyogbGRfZW5kICAgICAgICAgICAgICAgICAgICAgICAgUkVHPTB4MzAwMSAqLwotICAgIDB4MDIsICAvKiBzbF9zdGFydCAgICAgICAgICAgICAgICAgICAgICBSRUc9MHgzMDAyICovCi0gICAgMHg5ZSwgIC8qIHNsX2VuZCAgICAgICAgICAgICAgICAgICAgICAgIFJFRz0weDMwMDMgKi8KLSAgICAweDA1LCAgLyogcnhfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgUkVHPTB4MzAwNCAqLwotICAgIDB4MGYsICAvKiBzMV9zdGFydCAgICAgICAgICAgICAgICAgICAgICBSRUc9MHgzMDA1ICovCi0gICAgMHgyNCwgIC8qIHMxX2VuZCAgICAgICAgICAgICAgICAgICAgICAgIFJFRz0weDMwMDYgKi8KLSAgICAweDdjLCAgLyogczFzX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgUkVHPTB4MzAwNyAqLwotICAgIDB4OWEsICAvKiBzMXNfZW5kICAgICAgICAgICAgICAgICAgICAgICBSRUc9MHgzMDA4ICovCi0gICAgMHgxMCwgIC8qIHMzX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgIFJFRz0weDMwMDkgKi8KLSAgICAweDE0LCAgLyogczNfZW5kICAgICAgICAgICAgICAgICAgICAgICAgUkVHPTB4MzAwQSAqLwotICAgIDB4MTAsICAvKiBjbXBfZW5fc3RhcnQgICAgICAgICAgICAgICAgICBSRUc9MHgzMDBCICovCi0gICAgMHgwNCwgIC8qIGNscF9zbF9zdGFydCAgICAgICAgICAgICAgICAgIFJFRz0weDMwMEMgKi8KLSAgICAweDI2LCAgLyogY2xwX3NsX2VuZCAgICAgICAgICAgICAgICAgICAgUkVHPTB4MzAwRCAqLwotICAgIDB4MDIsICAvKiBvZmZfc3RhcnQgICAgICAgICAgICAgICAgICAgICBSRUc9MHgzMDBFICovCi0gICAgMHgwZSwgIC8qIHJtcF9lbl9zdGFydCAgICAgICAgICAgICAgICAgIFJFRz0weDMwMEYgKi8KLSAgICAweDMwLCAgLyogdHhfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgUkVHPTB4MzAxMCAqLwotICAgIDB4NGUsICAvKiB0eF9lbmQgICAgICAgICAgICAgICAgICAgICAgICBSRUc9MHgzMDExICovCi0gICAgMHgxRSwgIC8qIHN0eF93aWR0aCAgICAgICAgICAgICAgICAgICAgIFJFRz0weDMwMTIgKi8KLSAgICAweDA4LCAgLyogcmVnXzMxNTJfcmVzZXJ2ZWQgICAgICAgICAgICAgUkVHPTB4MzE1MiAqLwotICAgIDB4MTAsICAvKiByZWdfMzE1QV9yZXNlcnZlZCAgICAgICAgICAgICBSRUc9MHgzMTVBICovCi0gICAgMHgwMCwgIC8qIGFuYWxvZ3VlX2dhaW5fY29kZV9nbG9iYWxfbXNiIFJFRz0weDAyMDQgKi8KLSAgICAweDgwLCAgLyogYW5hbG9ndWVfZ2Fpbl9jb2RlX2dsb2JhbF9sc2IgUkVHPTB4MDIwNSAqLwotICAgIDB4MDIsICAvKiBmaW5lX2ludGVncmF0aW9uX3RpbWUgICAgICAgICBSRUc9MHgwMjAwICovCi0gICAgMHgwMywgIC8qIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lICAgICAgIFJFRz0weDAyMDIgKi8KLQkJMTk2MCwKLQkJMTQsCi0JCTI2MDgsCi0JCTEyNAotCX0KLX07Ci0KLXN0cnVjdCBzNWszZTJmeF93b3JrIHsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKLX07Ci1zdGF0aWMgc3RydWN0IHM1azNlMmZ4X3dvcmsgKnM1azNlMmZ4X3NlbnNvcnc7Ci1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKnM1azNlMmZ4X2NsaWVudDsKLQotc3RydWN0IHM1azNlMmZ4X2N0cmwgewotCWNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzZW5zb3JkYXRhOwotCi0JaW50IHNlbnNvcm1vZGU7Ci0JdWludDMyX3QgZnBzX2RpdmlkZXI7IC8qIGluaXQgdG8gMSAqIDB4MDAwMDA0MDAgKi8KLQl1aW50MzJfdCBwaWN0X2Zwc19kaXZpZGVyOyAvKiBpbml0IHRvIDEgKiAweDAwMDAwNDAwICovCi0KLQl1aW50MTZfdCBjdXJyX2xlbnNfcG9zOwotCXVpbnQxNl90IGluaXRfY3Vycl9sZW5zX3BvczsKLQl1aW50MTZfdCBteV9yZWdfZ2FpbjsKLQl1aW50MzJfdCBteV9yZWdfbGluZV9jb3VudDsKLQotCWVudW0gbXNtX3NfcmVzb2x1dGlvbiBwcmV2X3JlczsKLQllbnVtIG1zbV9zX3Jlc29sdXRpb24gcGljdF9yZXM7Ci0JZW51bSBtc21fc19yZXNvbHV0aW9uIGN1cnJfcmVzOwotCWVudW0gbXNtX3NfdGVzdF9tb2RlICBzZXRfdGVzdDsKLX07Ci0KLXN0cnVjdCBzNWszZTJmeF9pMmNfcmVnX2NvbmYgewotCXVuc2lnbmVkIHNob3J0IHdhZGRyOwotCXVuc2lnbmVkIGNoYXIgIGJkYXRhOwotfTsKLQotc3RhdGljIHN0cnVjdCBzNWszZTJmeF9jdHJsICpzNWszZTJmeF9jdHJsOwotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHM1azNlMmZ4X3dhaXRfcXVldWUpOwotREVGSU5FX01VVEVYKHM1azNlMmZ4X211dGV4KTsKLQotc3RhdGljIGludCBzNWszZTJmeF9pMmNfcnhkYXRhKHVuc2lnbmVkIHNob3J0IHNhZGRyLCB1bnNpZ25lZCBjaGFyICpyeGRhdGEsCi0JaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7Ci0JCXsKLQkJCS5hZGRyICAgPSBzYWRkciwKLQkJCS5mbGFncyA9IDAsCi0JCQkubGVuICAgPSAyLAotCQkJLmJ1ZiAgID0gcnhkYXRhLAotCQl9LAotCQl7Ci0JCQkuYWRkciAgID0gc2FkZHIsCi0JCQkuZmxhZ3MgPSBJMkNfTV9SRCwKLQkJCS5sZW4gICA9IGxlbmd0aCwKLQkJCS5idWYgICA9IHJ4ZGF0YSwKLQkJfSwKLQl9OwotCi0JaWYgKGkyY190cmFuc2ZlcihzNWszZTJmeF9jbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpIDwgMCkgewotCQlDREJHKCJzNWszZTJmeF9pMmNfcnhkYXRhIGZhaWxlZCFcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgczVrM2UyZnhfaTJjX3R4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQl1bnNpZ25lZCBjaGFyICp0eGRhdGEsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGkyY19tc2cgbXNnW10gPSB7Ci0JCXsKLQkJLmFkZHIgID0gc2FkZHIsCi0JCS5mbGFncyA9IDAsCi0JCS5sZW4gPSBsZW5ndGgsCi0JCS5idWYgPSB0eGRhdGEsCi0JCX0sCi0JfTsKLQotCWlmIChpMmNfdHJhbnNmZXIoczVrM2UyZnhfY2xpZW50LT5hZGFwdGVyLCBtc2csIDEpIDwgMCkgewotCQlDREJHKCJzNWszZTJmeF9pMmNfdHhkYXRhIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCBzNWszZTJmeF9pMmNfd3JpdGVfYih1bnNpZ25lZCBzaG9ydCBzYWRkciwgdW5zaWduZWQgc2hvcnQgd2FkZHIsCi0JdW5zaWduZWQgY2hhciBiZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gLUVJTzsKLQl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKLQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZbMF0gPSAod2FkZHIgJiAweEZGMDApPj44OwotCWJ1ZlsxXSA9ICh3YWRkciAmIDB4MDBGRik7Ci0JYnVmWzJdID0gYmRhdGE7Ci0KLQlyYyA9IHM1azNlMmZ4X2kyY190eGRhdGEoc2FkZHIsIGJ1ZiwgMyk7Ci0KLQlpZiAocmMgPCAwKQotCQlDREJHKCJpMmNfd3JpdGVfdyBmYWlsZWQsIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4IVxuIiwKLQkJCXdhZGRyLCBiZGF0YSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHM1azNlMmZ4X2kyY193cml0ZV90YWJsZSgKLQlzdHJ1Y3QgczVrM2UyZnhfaTJjX3JlZ19jb25mICpyZWdfY2ZnX3RibCwgaW50IG51bSkKLXsKLQlpbnQgaTsKLQlpbnQzMl90IHJjID0gLUVJTzsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJcmMgPSBzNWszZTJmeF9pMmNfd3JpdGVfYihzNWszZTJmeF9jbGllbnQtPmFkZHIsCi0JCQlyZWdfY2ZnX3RibC0+d2FkZHIsIHJlZ19jZmdfdGJsLT5iZGF0YSk7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQkJcmVnX2NmZ190YmwrKzsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHM1azNlMmZ4X2kyY19yZWFkX3codW5zaWduZWQgc2hvcnQgc2FkZHIsIHVuc2lnbmVkIHNob3J0IHJhZGRyLAotCXVuc2lnbmVkIHNob3J0ICpyZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKLQotCWlmICghcmRhdGEpCi0JCXJldHVybiAtRUlPOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCi0JYnVmWzBdID0gKHJhZGRyICYgMHhGRjAwKT4+ODsKLQlidWZbMV0gPSAocmFkZHIgJiAweDAwRkYpOwotCi0JcmMgPSBzNWszZTJmeF9pMmNfcnhkYXRhKHNhZGRyLCBidWYsIDIpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCSpyZGF0YSA9IGJ1ZlswXSA8PCA4IHwgYnVmWzFdOwotCi0JaWYgKHJjIDwgMCkKLQkJQ0RCRygiczVrM2UyZnhfaTJjX3JlYWQgZmFpbGVkIVxuIik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgczVrM2UyZnhfcHJvYmVfaW5pdF9kb25lKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCWdwaW9fZnJlZShkYXRhLT5zZW5zb3JfcmVzZXQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHM1azNlMmZ4X3Byb2JlX2luaXRfc2Vuc29yKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCWludDMyX3QgIHJjOwotCXVpbnQxNl90IGNoaXBpZCA9IDA7Ci0KLQlyYyA9IGdwaW9fcmVxdWVzdChkYXRhLT5zZW5zb3JfcmVzZXQsICJzNWszZTJmeCIpOwotCWlmICghcmMpCi0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5zZW5zb3JfcmVzZXQsIDEpOwotCWVsc2UKLQkJZ290byBpbml0X3Byb2JlX2RvbmU7Ci0KLQltZGVsYXkoMjApOwotCi0JQ0RCRygiczVrM2UyZnhfc2Vuc29yX2luaXQoKTogcmVzZXRpbmcgc2Vuc29yLlxuIik7Ci0KLQlyYyA9IHM1azNlMmZ4X2kyY19yZWFkX3coczVrM2UyZnhfY2xpZW50LT5hZGRyLAotCQlTNUszRTJGWF9SRUdfTU9ERUxfSUQsICZjaGlwaWQpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCi0JaWYgKGNoaXBpZCAhPSBTNUszRTJGWF9NT0RFTF9JRCkgewotCQlDREJHKCJTNUszRTJGWCB3cm9uZyBtb2RlbF9pZCA9IDB4JXhcbiIsIGNoaXBpZCk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCi0JZ290byBpbml0X3Byb2JlX2RvbmU7Ci0KLWluaXRfcHJvYmVfZmFpbDoKLQlzNWszZTJmeF9wcm9iZV9pbml0X2RvbmUoZGF0YSk7Ci1pbml0X3Byb2JlX2RvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHM1azNlMmZ4X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JLyogSW5pdGlhbGl6ZSB0aGUgTVNNX0NBTUkyQyBDaGlwICovCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmczVrM2UyZnhfd2FpdF9xdWV1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzNWszZTJmeF9pMmNfaWRbXSA9IHsKLQl7ICJzNWszZTJmeCIsIDB9LAotCXsgfQotfTsKLQotc3RhdGljIGludCBzNWszZTJmeF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJjID0gMDsKLQlDREJHKCJzNWszZTJmeF9wcm9iZSBjYWxsZWQhXG4iKTsKLQotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7Ci0JCUNEQkcoImkyY19jaGVja19mdW5jdGlvbmFsaXR5IGZhaWxlZFxuIik7Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0KLQlzNWszZTJmeF9zZW5zb3J3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHM1azNlMmZ4X3dvcmspLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXM1azNlMmZ4X3NlbnNvcncpIHsKLQkJQ0RCRygia3phbGxvYyBmYWlsZWQuXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIHByb2JlX2ZhaWx1cmU7Ci0JfQotCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgczVrM2UyZnhfc2Vuc29ydyk7Ci0JczVrM2UyZnhfaW5pdF9jbGllbnQoY2xpZW50KTsKLQlzNWszZTJmeF9jbGllbnQgPSBjbGllbnQ7Ci0KLQltZGVsYXkoNTApOwotCi0JQ0RCRygiczVrM2UyZnhfcHJvYmUgc3VjY2Vzc2VkISByYyA9ICVkXG4iLCByYyk7Ci0JcmV0dXJuIDA7Ci0KLXByb2JlX2ZhaWx1cmU6Ci0JQ0RCRygiczVrM2UyZnhfcHJvYmUgZmFpbGVkISByYyA9ICVkXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgczVrM2UyZnhfaTJjX2RyaXZlciA9IHsKLQkuaWRfdGFibGUgPSBzNWszZTJmeF9pMmNfaWQsCi0JLnByb2JlICA9IHM1azNlMmZ4X2kyY19wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3AoczVrM2UyZnhfaTJjX3JlbW92ZSksCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiczVrM2UyZngiLAotCX0sCi19OwotCi1zdGF0aWMgaW50MzJfdCBzNWszZTJmeF90ZXN0KGVudW0gbXNtX3NfdGVzdF9tb2RlIG1vKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JaWYgKG1vID09IFNfVEVTVF9PRkYpCi0JCXJjID0gMDsKLQllbHNlCi0JCXJjID0gczVrM2UyZnhfaTJjX3dyaXRlX2IoczVrM2UyZnhfY2xpZW50LT5hZGRyLAotCQkJUkVHX1RFU1RfUEFUVEVSTl9NT0RFLCAodWludDE2X3QpbW8pOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBzNWszZTJmeF9zZXR0aW5nKGVudW0gbXNtX3NfcmVnX3VwZGF0ZSBydXBkYXRlLAotCWVudW0gbXNtX3Nfc2V0dGluZyBydCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLSAgdWludDE2X3QgbnVtX2xwZXJmOwotCi0Jc3dpdGNoIChydXBkYXRlKSB7Ci0JY2FzZSBTX1VQREFURV9QRVJJT0RJQzoKLQlpZiAocnQgPT0gU19SRVNfUFJFVklFVyB8fCBydCA9PSBTX1JFU19DQVBUVVJFKSB7Ci0KLQkJc3RydWN0IHM1azNlMmZ4X2kyY19yZWdfY29uZiB0YmxfMVtdID0gewotCQkJe1JFR19DQ1BfREFUQV9GT1JNQVRfTVNCLAotCQkJCXM1azNlMmZ4X3JlZ19wYXRbcnRdLmNjcF9kYXRhX2Zvcm1hdF9tc2J9LAotCQkJe1JFR19DQ1BfREFUQV9GT1JNQVRfTFNCLAotCQkJCXM1azNlMmZ4X3JlZ19wYXRbcnRdLmNjcF9kYXRhX2Zvcm1hdF9sc2J9LAotCQkJe1JFR19YX09VVFBVVF9TSVpFX01TQiwKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS54X291dHB1dF9zaXplX21zYn0sCi0JCQl7UkVHX1hfT1VUUFVUX1NJWkVfTFNCLAotCQkJCXM1azNlMmZ4X3JlZ19wYXRbcnRdLnhfb3V0cHV0X3NpemVfbHNifSwKLQkJCXtSRUdfWV9PVVRQVVRfU0laRV9NU0IsCi0JCQkJczVrM2UyZnhfcmVnX3BhdFtydF0ueV9vdXRwdXRfc2l6ZV9tc2J9LAotCQkJe1JFR19ZX09VVFBVVF9TSVpFX0xTQiwKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS55X291dHB1dF9zaXplX2xzYn0sCi0JCQl7UkVHX1hfRVZFTl9JTkMsCi0JCQkJczVrM2UyZnhfcmVnX3BhdFtydF0ueF9ldmVuX2luY30sCi0JCQl7UkVHX1hfT0REX0lOQywKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS54X29kZF9pbmN9LAotCQkJe1JFR19ZX0VWRU5fSU5DLAotCQkJCXM1azNlMmZ4X3JlZ19wYXRbcnRdLnlfZXZlbl9pbmN9LAotCQkJe1JFR19ZX09ERF9JTkMsCi0JCQkJczVrM2UyZnhfcmVnX3BhdFtydF0ueV9vZGRfaW5jfSwKLQkJCXtSRUdfQklOTklOR19FTkFCTEUsCi0JCQkJczVrM2UyZnhfcmVnX3BhdFtydF0uYmlubmluZ19lbmFibGV9LAotCQl9OwotCi0JCXN0cnVjdCBzNWszZTJmeF9pMmNfcmVnX2NvbmYgdGJsXzJbXSA9IHsKLQkJCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX01TQiwgMH0sCi0JCQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19MU0IsIDB9LAotCQkJe1JFR19MSU5FX0xFTkdUSF9QQ0tfTVNCLAotCQkJCXM1azNlMmZ4X3JlZ19wYXRbcnRdLmxpbmVfbGVuZ3RoX3Bja19tc2J9LAotCQkJe1JFR19MSU5FX0xFTkdUSF9QQ0tfTFNCLAotCQkJCXM1azNlMmZ4X3JlZ19wYXRbcnRdLmxpbmVfbGVuZ3RoX3Bja19sc2J9LAotCQkJe1JFR19TSEFERV9DTEtfRU5BQkxFLAotCQkJCXM1azNlMmZ4X3JlZ19wYXRbcnRdLnNoYWRlX2Nsa19lbmFibGV9LAotCQkJe1JFR19TRUxfQ0NQLCBzNWszZTJmeF9yZWdfcGF0W3J0XS5zZWxfY2NwfSwKLQkJCXtSRUdfVlBJWCwgczVrM2UyZnhfcmVnX3BhdFtydF0udnBpeH0sCi0JCQl7UkVHX0NMQU1QX09OLCBzNWszZTJmeF9yZWdfcGF0W3J0XS5jbGFtcF9vbn0sCi0JCQl7UkVHX09GRlNFVCwgczVrM2UyZnhfcmVnX3BhdFtydF0ub2Zmc2V0fSwKLQkJCXtSRUdfTERfU1RBUlQsIHM1azNlMmZ4X3JlZ19wYXRbcnRdLmxkX3N0YXJ0fSwKLQkJCXtSRUdfTERfRU5ELCBzNWszZTJmeF9yZWdfcGF0W3J0XS5sZF9lbmR9LAotCQkJe1JFR19TTF9TVEFSVCwgczVrM2UyZnhfcmVnX3BhdFtydF0uc2xfc3RhcnR9LAotCQkJe1JFR19TTF9FTkQsIHM1azNlMmZ4X3JlZ19wYXRbcnRdLnNsX2VuZH0sCi0JCQl7UkVHX1JYX1NUQVJULCBzNWszZTJmeF9yZWdfcGF0W3J0XS5yeF9zdGFydH0sCi0JCQl7UkVHX1MxX1NUQVJULCBzNWszZTJmeF9yZWdfcGF0W3J0XS5zMV9zdGFydH0sCi0JCQl7UkVHX1MxX0VORCwgczVrM2UyZnhfcmVnX3BhdFtydF0uczFfZW5kfSwKLQkJCXtSRUdfUzFTX1NUQVJULCBzNWszZTJmeF9yZWdfcGF0W3J0XS5zMXNfc3RhcnR9LAotCQkJe1JFR19TMVNfRU5ELCBzNWszZTJmeF9yZWdfcGF0W3J0XS5zMXNfZW5kfSwKLQkJCXtSRUdfUzNfU1RBUlQsIHM1azNlMmZ4X3JlZ19wYXRbcnRdLnMzX3N0YXJ0fSwKLQkJCXtSRUdfUzNfRU5ELCBzNWszZTJmeF9yZWdfcGF0W3J0XS5zM19lbmR9LAotCQkJe1JFR19DTVBfRU5fU1RBUlQsIHM1azNlMmZ4X3JlZ19wYXRbcnRdLmNtcF9lbl9zdGFydH0sCi0JCQl7UkVHX0NMUF9TTF9TVEFSVCwgczVrM2UyZnhfcmVnX3BhdFtydF0uY2xwX3NsX3N0YXJ0fSwKLQkJCXtSRUdfQ0xQX1NMX0VORCwgczVrM2UyZnhfcmVnX3BhdFtydF0uY2xwX3NsX2VuZH0sCi0JCQl7UkVHX09GRl9TVEFSVCwgczVrM2UyZnhfcmVnX3BhdFtydF0ub2ZmX3N0YXJ0fSwKLQkJCXtSRUdfUk1QX0VOX1NUQVJULCBzNWszZTJmeF9yZWdfcGF0W3J0XS5ybXBfZW5fc3RhcnR9LAotCQkJe1JFR19UWF9TVEFSVCwgczVrM2UyZnhfcmVnX3BhdFtydF0udHhfc3RhcnR9LAotCQkJe1JFR19UWF9FTkQsIHM1azNlMmZ4X3JlZ19wYXRbcnRdLnR4X2VuZH0sCi0JCQl7UkVHX1NUWF9XSURUSCwgczVrM2UyZnhfcmVnX3BhdFtydF0uc3R4X3dpZHRofSwKLQkJCXtSRUdfMzE1Ml9SRVNFUlZFRCwKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS5yZWdfMzE1Ml9yZXNlcnZlZH0sCi0JCQl7UkVHXzMxNUFfUkVTRVJWRUQsCi0JCQkJczVrM2UyZnhfcmVnX3BhdFtydF0ucmVnXzMxNUFfcmVzZXJ2ZWR9LAotCQkJe1JFR19BTkFMT0dVRV9HQUlOX0NPREVfR0xPQkFMX01TQiwKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS4KLQkJCQlhbmFsb2d1ZV9nYWluX2NvZGVfZ2xvYmFsX21zYn0sCi0JCQl7UkVHX0FOQUxPR1VFX0dBSU5fQ09ERV9HTE9CQUxfTFNCLAotCQkJCXM1azNlMmZ4X3JlZ19wYXRbcnRdLgotCQkJCWFuYWxvZ3VlX2dhaW5fY29kZV9nbG9iYWxfbHNifSwKLQkJCXtSRUdfRklORV9JTlRFR1JBVElPTl9USU1FLAotCQkJCXM1azNlMmZ4X3JlZ19wYXRbcnRdLmZpbmVfaW50ZWdyYXRpb25fdGltZX0sCi0JCQl7UkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FLAotCQkJCXM1azNlMmZ4X3JlZ19wYXRbcnRdLmNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lfSwKLQkJCXtTNUszRTJGWF9SRUdfTU9ERV9TRUxFQ1QsIFM1SzNFMkZYX01PREVfU0VMRUNUX1NUUkVBTX0sCi0JCX07Ci0KLQkJcmMgPSBzNWszZTJmeF9pMmNfd3JpdGVfdGFibGUoJnRibF8xWzBdLAotCQkJQVJSQVlfU0laRSh0YmxfMSkpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCW51bV9scGVyZiA9ICh1aW50MTZfdCkKLQkJCSgoczVrM2UyZnhfcmVnX3BhdFtydF0uZnJhbWVfbGVuZ3RoX2xpbmVzX21zYiA8PCA4KQotCQkJJiAweEZGMDApCi0JCQkrIHM1azNlMmZ4X3JlZ19wYXRbcnRdLmZyYW1lX2xlbmd0aF9saW5lc19sc2I7Ci0KLQkJbnVtX2xwZXJmID0gbnVtX2xwZXJmICogczVrM2UyZnhfY3RybC0+ZnBzX2RpdmlkZXIgLyAweDA0MDA7Ci0KLQkJdGJsXzJbMF0gPSAoc3RydWN0IHM1azNlMmZ4X2kyY19yZWdfY29uZikKLQkJCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX01TQiwgKG51bV9scGVyZiAmIDB4RkYwMCkgPj4gOH07Ci0JCXRibF8yWzFdID0gKHN0cnVjdCBzNWszZTJmeF9pMmNfcmVnX2NvbmYpCi0JCQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19MU0IsIChudW1fbHBlcmYgJiAweDAwRkYpfTsKLQotCQlyYyA9IHM1azNlMmZ4X2kyY193cml0ZV90YWJsZSgmdGJsXzJbMF0sCi0JCQlBUlJBWV9TSVpFKHRibF8yKSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJbWRlbGF5KDUpOwotCi0JCXJjID0gczVrM2UyZnhfdGVzdChzNWszZTJmeF9jdHJsLT5zZXRfdGVzdCk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JICB9Ci0gICAgYnJlYWs7IC8qIFVQREFURV9QRVJJT0RJQyAqLwotCi0JY2FzZSBTX1JFR19JTklUOgotCWlmIChydCA9PSBTX1JFU19QUkVWSUVXIHx8IHJ0ID09IFNfUkVTX0NBUFRVUkUpIHsKLQotCQlzdHJ1Y3QgczVrM2UyZnhfaTJjX3JlZ19jb25mIHRibF8zW10gPSB7Ci0JCQl7UzVLM0UyRlhfUkVHX1NPRlRXQVJFX1JFU0VULCBTNUszRTJGWF9TT0ZUV0FSRV9SRVNFVH0sCi0JCQl7UzVLM0UyRlhfUkVHX01PREVfU0VMRUNULAotCQkJCVM1SzNFMkZYX01PREVfU0VMRUNUX1NXX1NUQU5EQll9LAotCQkJLyogUExMIHNldHRpbmcgKi8KLQkJCXtSRUdfUFJFX1BMTF9DTEtfRElWLAotCQkJCXM1azNlMmZ4X3JlZ19wYXRbcnRdLnByZV9wbGxfY2xrX2Rpdn0sCi0JCQl7UkVHX1BMTF9NVUxUSVBMSUVSX01TQiwKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS5wbGxfbXVsdGlwbGllcl9tc2J9LAotCQkJe1JFR19QTExfTVVMVElQTElFUl9MU0IsCi0JCQkJczVrM2UyZnhfcmVnX3BhdFtydF0ucGxsX211bHRpcGxpZXJfbHNifSwKLQkJCXtSRUdfVlRfUElYX0NMS19ESVYsCi0JCQkJczVrM2UyZnhfcmVnX3BhdFtydF0udnRfcGl4X2Nsa19kaXZ9LAotCQkJe1JFR19WVF9TWVNfQ0xLX0RJViwKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS52dF9zeXNfY2xrX2Rpdn0sCi0JCQl7UkVHX09QX1BJWF9DTEtfRElWLAotCQkJCXM1azNlMmZ4X3JlZ19wYXRbcnRdLm9wX3BpeF9jbGtfZGl2fSwKLQkJCXtSRUdfT1BfU1lTX0NMS19ESVYsCi0JCQkJczVrM2UyZnhfcmVnX3BhdFtydF0ub3Bfc3lzX2Nsa19kaXZ9LAotCQkJLypEYXRhIEZvcm1hdCAqLwotCQkJe1JFR19DQ1BfREFUQV9GT1JNQVRfTVNCLAotCQkJCXM1azNlMmZ4X3JlZ19wYXRbcnRdLmNjcF9kYXRhX2Zvcm1hdF9tc2J9LAotCQkJe1JFR19DQ1BfREFUQV9GT1JNQVRfTFNCLAotCQkJCXM1azNlMmZ4X3JlZ19wYXRbcnRdLmNjcF9kYXRhX2Zvcm1hdF9sc2J9LAotCQkJLypPdXRwdXQgU2l6ZSAqLwotCQkJe1JFR19YX09VVFBVVF9TSVpFX01TQiwKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS54X291dHB1dF9zaXplX21zYn0sCi0JCQl7UkVHX1hfT1VUUFVUX1NJWkVfTFNCLAotCQkJCXM1azNlMmZ4X3JlZ19wYXRbcnRdLnhfb3V0cHV0X3NpemVfbHNifSwKLQkJCXtSRUdfWV9PVVRQVVRfU0laRV9NU0IsCi0JCQkJczVrM2UyZnhfcmVnX3BhdFtydF0ueV9vdXRwdXRfc2l6ZV9tc2J9LAotCQkJe1JFR19ZX09VVFBVVF9TSVpFX0xTQiwKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS55X291dHB1dF9zaXplX2xzYn0sCi0JCQkvKiBCaW5uaW5nICovCi0JCQl7UkVHX1hfRVZFTl9JTkMsIHM1azNlMmZ4X3JlZ19wYXRbcnRdLnhfZXZlbl9pbmN9LAotCQkJe1JFR19YX09ERF9JTkMsIHM1azNlMmZ4X3JlZ19wYXRbcnRdLnhfb2RkX2luYyB9LAotCQkJe1JFR19ZX0VWRU5fSU5DLCBzNWszZTJmeF9yZWdfcGF0W3J0XS55X2V2ZW5faW5jfSwKLQkJCXtSRUdfWV9PRERfSU5DLCBzNWszZTJmeF9yZWdfcGF0W3J0XS55X29kZF9pbmN9LAotCQkJe1JFR19CSU5OSU5HX0VOQUJMRSwKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS5iaW5uaW5nX2VuYWJsZX0sCi0JCQkvKiBGcmFtZSBmb3JtYXQgKi8KLQkJCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX01TQiwKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS5mcmFtZV9sZW5ndGhfbGluZXNfbXNifSwKLQkJCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0xTQiwKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS5mcmFtZV9sZW5ndGhfbGluZXNfbHNifSwKLQkJCXtSRUdfTElORV9MRU5HVEhfUENLX01TQiwKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS5saW5lX2xlbmd0aF9wY2tfbXNifSwKLQkJCXtSRUdfTElORV9MRU5HVEhfUENLX0xTQiwKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS5saW5lX2xlbmd0aF9wY2tfbHNifSwKLQkJCS8qIE1TUiBzZXR0aW5nICovCi0JCQl7UkVHX1NIQURFX0NMS19FTkFCTEUsCi0JCQkJczVrM2UyZnhfcmVnX3BhdFtydF0uc2hhZGVfY2xrX2VuYWJsZX0sCi0JCQl7UkVHX1NFTF9DQ1AsIHM1azNlMmZ4X3JlZ19wYXRbcnRdLnNlbF9jY3B9LAotCQkJe1JFR19WUElYLCBzNWszZTJmeF9yZWdfcGF0W3J0XS52cGl4fSwKLQkJCXtSRUdfQ0xBTVBfT04sIHM1azNlMmZ4X3JlZ19wYXRbcnRdLmNsYW1wX29ufSwKLQkJCXtSRUdfT0ZGU0VULCBzNWszZTJmeF9yZWdfcGF0W3J0XS5vZmZzZXR9LAotCQkJLyogQ0RTIHRpbWluZyBzZXR0aW5nICovCi0JCQl7UkVHX0xEX1NUQVJULCBzNWszZTJmeF9yZWdfcGF0W3J0XS5sZF9zdGFydH0sCi0JCQl7UkVHX0xEX0VORCwgczVrM2UyZnhfcmVnX3BhdFtydF0ubGRfZW5kfSwKLQkJCXtSRUdfU0xfU1RBUlQsIHM1azNlMmZ4X3JlZ19wYXRbcnRdLnNsX3N0YXJ0fSwKLQkJCXtSRUdfU0xfRU5ELCBzNWszZTJmeF9yZWdfcGF0W3J0XS5zbF9lbmR9LAotCQkJe1JFR19SWF9TVEFSVCwgczVrM2UyZnhfcmVnX3BhdFtydF0ucnhfc3RhcnR9LAotCQkJe1JFR19TMV9TVEFSVCwgczVrM2UyZnhfcmVnX3BhdFtydF0uczFfc3RhcnR9LAotCQkJe1JFR19TMV9FTkQsIHM1azNlMmZ4X3JlZ19wYXRbcnRdLnMxX2VuZH0sCi0JCQl7UkVHX1MxU19TVEFSVCwgczVrM2UyZnhfcmVnX3BhdFtydF0uczFzX3N0YXJ0fSwKLQkJCXtSRUdfUzFTX0VORCwgczVrM2UyZnhfcmVnX3BhdFtydF0uczFzX2VuZH0sCi0JCQl7UkVHX1MzX1NUQVJULCBzNWszZTJmeF9yZWdfcGF0W3J0XS5zM19zdGFydH0sCi0JCQl7UkVHX1MzX0VORCwgczVrM2UyZnhfcmVnX3BhdFtydF0uczNfZW5kfSwKLQkJCXtSRUdfQ01QX0VOX1NUQVJULCBzNWszZTJmeF9yZWdfcGF0W3J0XS5jbXBfZW5fc3RhcnR9LAotCQkJe1JFR19DTFBfU0xfU1RBUlQsIHM1azNlMmZ4X3JlZ19wYXRbcnRdLmNscF9zbF9zdGFydH0sCi0JCQl7UkVHX0NMUF9TTF9FTkQsIHM1azNlMmZ4X3JlZ19wYXRbcnRdLmNscF9zbF9lbmR9LAotCQkJe1JFR19PRkZfU1RBUlQsIHM1azNlMmZ4X3JlZ19wYXRbcnRdLm9mZl9zdGFydH0sCi0JCQl7UkVHX1JNUF9FTl9TVEFSVCwgczVrM2UyZnhfcmVnX3BhdFtydF0ucm1wX2VuX3N0YXJ0fSwKLQkJCXtSRUdfVFhfU1RBUlQsIHM1azNlMmZ4X3JlZ19wYXRbcnRdLnR4X3N0YXJ0fSwKLQkJCXtSRUdfVFhfRU5ELCBzNWszZTJmeF9yZWdfcGF0W3J0XS50eF9lbmR9LAotCQkJe1JFR19TVFhfV0lEVEgsIHM1azNlMmZ4X3JlZ19wYXRbcnRdLnN0eF93aWR0aH0sCi0JCQl7UkVHXzMxNTJfUkVTRVJWRUQsCi0JCQkJczVrM2UyZnhfcmVnX3BhdFtydF0ucmVnXzMxNTJfcmVzZXJ2ZWR9LAotCQkJe1JFR18zMTVBX1JFU0VSVkVELAotCQkJCXM1azNlMmZ4X3JlZ19wYXRbcnRdLnJlZ18zMTVBX3Jlc2VydmVkfSwKLQkJCXtSRUdfQU5BTE9HVUVfR0FJTl9DT0RFX0dMT0JBTF9NU0IsCi0JCQkJczVrM2UyZnhfcmVnX3BhdFtydF0uCi0JCQkJYW5hbG9ndWVfZ2Fpbl9jb2RlX2dsb2JhbF9tc2J9LAotCQkJe1JFR19BTkFMT0dVRV9HQUlOX0NPREVfR0xPQkFMX0xTQiwKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS4KLQkJCQlhbmFsb2d1ZV9nYWluX2NvZGVfZ2xvYmFsX2xzYn0sCi0JCQl7UkVHX0ZJTkVfSU5URUdSQVRJT05fVElNRSwKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS5maW5lX2ludGVncmF0aW9uX3RpbWV9LAotCQkJe1JFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRSwKLQkJCQlzNWszZTJmeF9yZWdfcGF0W3J0XS5jb2Fyc2VfaW50ZWdyYXRpb25fdGltZX0sCi0JCQl7UzVLM0UyRlhfUkVHX01PREVfU0VMRUNULCBTNUszRTJGWF9NT0RFX1NFTEVDVF9TVFJFQU19LAotCQl9OwotCi0JCS8qIHJlc2V0IGZwc19kaXZpZGVyICovCi0JCXM1azNlMmZ4X2N0cmwtPmZwc19kaXZpZGVyID0gMSAqIDB4MDQwMDsKLQkJcmMgPSBzNWszZTJmeF9pMmNfd3JpdGVfdGFibGUoJnRibF8zWzBdLAotCQkJQVJSQVlfU0laRSh0YmxfMykpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCWJyZWFrOyAvKiBjYXNlIFJFR19JTklUOiAqLwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9IC8qIHN3aXRjaCAocnVwZGF0ZSkgKi8KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzNWszZTJmeF9zZW5zb3Jfb3Blbl9pbml0KGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCWludDMyX3QgIHJjOwotCi0JczVrM2UyZnhfY3RybCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzNWszZTJmeF9jdHJsKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzNWszZTJmeF9jdHJsKSB7Ci0JCUNEQkcoInM1azNlMmZ4X2luaXQgZmFpbGVkIVxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBpbml0X2RvbmU7Ci0JfQotCi0JczVrM2UyZnhfY3RybC0+ZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQlzNWszZTJmeF9jdHJsLT5waWN0X2Zwc19kaXZpZGVyID0gMSAqIDB4MDAwMDA0MDA7Ci0JczVrM2UyZnhfY3RybC0+c2V0X3Rlc3QgPSBTX1RFU1RfT0ZGOwotCXM1azNlMmZ4X2N0cmwtPnByZXZfcmVzID0gU19RVFJfU0laRTsKLQlzNWszZTJmeF9jdHJsLT5waWN0X3JlcyA9IFNfRlVMTF9TSVpFOwotCi0JaWYgKGRhdGEpCi0JCXM1azNlMmZ4X2N0cmwtPnNlbnNvcmRhdGEgPSBkYXRhOwotCi0JLyogZW5hYmxlIG1jbGsgZmlyc3QgKi8KLQltc21fY2FtaW9fY2xrX3JhdGVfc2V0KDI0MDAwMDAwKTsKLQltZGVsYXkoMjApOwotCi0JbXNtX2NhbWlvX2NhbWlmX3BhZF9yZWdfcmVzZXQoKTsKLQltZGVsYXkoMjApOwotCi0JcmMgPSBzNWszZTJmeF9wcm9iZV9pbml0X3NlbnNvcihkYXRhKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGluaXRfZmFpbDE7Ci0KLQlpZiAoczVrM2UyZnhfY3RybC0+cHJldl9yZXMgPT0gU19RVFJfU0laRSkKLQkJcmMgPSBzNWszZTJmeF9zZXR0aW5nKFNfUkVHX0lOSVQsIFNfUkVTX1BSRVZJRVcpOwotCWVsc2UKLQkJcmMgPSBzNWszZTJmeF9zZXR0aW5nKFNfUkVHX0lOSVQsIFNfUkVTX0NBUFRVUkUpOwotCi0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJzNWszZTJmeF9zZXR0aW5nIGZhaWxlZC4gcmMgPSAlZFxuIiwgcmMpOwotCQlnb3RvIGluaXRfZmFpbDE7Ci0JfQotCi0JLyogaW5pdGlhbGl6ZSBBRiAqLwotCXJjID0gczVrM2UyZnhfaTJjX3dyaXRlX2IoczVrM2UyZnhfY2xpZW50LT5hZGRyLAotCQkJMHgzMTQ2LCAweDNBKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGluaXRfZmFpbDE7Ci0KLQlyYyA9IHM1azNlMmZ4X2kyY193cml0ZV9iKHM1azNlMmZ4X2NsaWVudC0+YWRkciwKLQkJCTB4MzEzMCwgMHgwMyk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X2ZhaWwxOwotCi0JZ290byBpbml0X2RvbmU7Ci0KLWluaXRfZmFpbDE6Ci0JczVrM2UyZnhfcHJvYmVfaW5pdF9kb25lKGRhdGEpOwotCWtmcmVlKHM1azNlMmZ4X2N0cmwpOwotaW5pdF9kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgczVrM2UyZnhfcG93ZXJfZG93bih2b2lkKQotewotCWludDMyX3QgcmMgPSAwOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzNWszZTJmeF9zZW5zb3JfcmVsZWFzZSh2b2lkKQotewotCWludCByYyA9IC1FQkFERjsKLQotCW11dGV4X2xvY2soJnM1azNlMmZ4X211dGV4KTsKLQotCXM1azNlMmZ4X3Bvd2VyX2Rvd24oKTsKLQotCWdwaW9fZGlyZWN0aW9uX291dHB1dChzNWszZTJmeF9jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcmVzZXQsCi0JCTApOwotCWdwaW9fZnJlZShzNWszZTJmeF9jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcmVzZXQpOwotCi0Ja2ZyZWUoczVrM2UyZnhfY3RybCk7Ci0JczVrM2UyZnhfY3RybCA9IE5VTEw7Ci0KLQlDREJHKCJzNWszZTJmeF9yZWxlYXNlIGNvbXBsZXRlZFxuIik7Ci0KLQltdXRleF91bmxvY2soJnM1azNlMmZ4X211dGV4KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIHM1azNlMmZ4X2dldF9waWN0X2Zwcyh1aW50MTZfdCBmcHMsIHVpbnQxNl90ICpwZnBzKQotewotCS8qIGlucHV0IGZwcyBpcyBwcmV2aWV3IGZwcyBpbiBROCBmb3JtYXQgKi8KLQl1aW50MzJfdCBkaXZpZGVyOyAgIC8qIFExMCAqLwotCi0JZGl2aWRlciA9ICh1aW50MzJfdCkKLQkJKChzNWszZTJmeF9yZWdfcGF0W1NfUkVTX1BSRVZJRVddLnNpemVfaCArCi0JCQlzNWszZTJmeF9yZWdfcGF0W1NfUkVTX1BSRVZJRVddLmJsa19sKSAqCi0JCSAoczVrM2UyZnhfcmVnX3BhdFtTX1JFU19QUkVWSUVXXS5zaXplX3cgKwotCQkJczVrM2UyZnhfcmVnX3BhdFtTX1JFU19QUkVWSUVXXS5ibGtfcCkpICogMHgwMDAwMDQwMCAvCi0JCSgoczVrM2UyZnhfcmVnX3BhdFtTX1JFU19DQVBUVVJFXS5zaXplX2ggKwotCQkJczVrM2UyZnhfcmVnX3BhdFtTX1JFU19DQVBUVVJFXS5ibGtfbCkgKgotCQkgKHM1azNlMmZ4X3JlZ19wYXRbU19SRVNfQ0FQVFVSRV0uc2l6ZV93ICsKLQkJCXM1azNlMmZ4X3JlZ19wYXRbU19SRVNfQ0FQVFVSRV0uYmxrX3ApKTsKLQotCS8qIFZlcmlmeSBQQ0xLIHNldHRpbmdzIGFuZCBmcmFtZSBzaXplcy4gKi8KLQkqcGZwcyA9ICh1aW50MTZfdCkoZnBzICogZGl2aWRlciAvIDB4MDAwMDA0MDApOwotfQotCi1zdGF0aWMgdWludDE2X3QgczVrM2UyZnhfZ2V0X3ByZXZfbGluZXNfcGYodm9pZCkKLXsKLQlyZXR1cm4gczVrM2UyZnhfcmVnX3BhdFtTX1JFU19QUkVWSUVXXS5zaXplX2ggKwotCQlzNWszZTJmeF9yZWdfcGF0W1NfUkVTX1BSRVZJRVddLmJsa19sOwotfQotCi1zdGF0aWMgdWludDE2X3QgczVrM2UyZnhfZ2V0X3ByZXZfcGl4ZWxzX3BsKHZvaWQpCi17Ci0JcmV0dXJuIHM1azNlMmZ4X3JlZ19wYXRbU19SRVNfUFJFVklFV10uc2l6ZV93ICsKLQkJczVrM2UyZnhfcmVnX3BhdFtTX1JFU19QUkVWSUVXXS5ibGtfcDsKLX0KLQotc3RhdGljIHVpbnQxNl90IHM1azNlMmZ4X2dldF9waWN0X2xpbmVzX3BmKHZvaWQpCi17Ci0JcmV0dXJuIHM1azNlMmZ4X3JlZ19wYXRbU19SRVNfQ0FQVFVSRV0uc2l6ZV9oICsKLQkJczVrM2UyZnhfcmVnX3BhdFtTX1JFU19DQVBUVVJFXS5ibGtfbDsKLX0KLQotc3RhdGljIHVpbnQxNl90IHM1azNlMmZ4X2dldF9waWN0X3BpeGVsc19wbCh2b2lkKQotewotCXJldHVybiBzNWszZTJmeF9yZWdfcGF0W1NfUkVTX0NBUFRVUkVdLnNpemVfdyArCi0JCXM1azNlMmZ4X3JlZ19wYXRbU19SRVNfQ0FQVFVSRV0uYmxrX3A7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBzNWszZTJmeF9nZXRfcGljdF9tYXhfZXhwX2xjKHZvaWQpCi17Ci0JdWludDMyX3Qgc25hcHNob3RfbGluZXNfcGVyX2ZyYW1lOwotCi0JaWYgKHM1azNlMmZ4X2N0cmwtPnBpY3RfcmVzID09IFNfUVRSX1NJWkUpCi0JCXNuYXBzaG90X2xpbmVzX3Blcl9mcmFtZSA9Ci0JCXM1azNlMmZ4X3JlZ19wYXRbU19SRVNfUFJFVklFV10uc2l6ZV9oICsKLQkJczVrM2UyZnhfcmVnX3BhdFtTX1JFU19QUkVWSUVXXS5ibGtfbDsKLQllbHNlCi0JCXNuYXBzaG90X2xpbmVzX3Blcl9mcmFtZSA9IDM5NjEgKiAzOwotCi0JcmV0dXJuIHNuYXBzaG90X2xpbmVzX3Blcl9mcmFtZTsKLX0KLQotc3RhdGljIGludDMyX3QgczVrM2UyZnhfc2V0X2ZwcyhzdHJ1Y3QgZnBzX2NmZyAqZnBzKQotewotCS8qIGlucHV0IGlzIG5ldyBmcHMgaW4gUTEwIGZvcm1hdCAqLwotCWludDMyX3QgcmMgPSAwOwotCWVudW0gbXNtX3Nfc2V0dGluZyBzZXR0aW5nOwotCi0JczVrM2UyZnhfY3RybC0+ZnBzX2RpdmlkZXIgPSBmcHMtPmZwc19kaXY7Ci0KLQlpZiAoczVrM2UyZnhfY3RybC0+c2Vuc29ybW9kZSA9PSBTRU5TT1JfUFJFVklFV19NT0RFKQotCQlzZXR0aW5nID0gU19SRVNfUFJFVklFVzsKLQllbHNlCi0JCXNldHRpbmcgPSBTX1JFU19DQVBUVVJFOwotCi0gIHJjID0gczVrM2UyZnhfaTJjX3dyaXRlX2IoczVrM2UyZnhfY2xpZW50LT5hZGRyLAotCQlSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX01TQiwKLQkJKCgoczVrM2UyZnhfcmVnX3BhdFtzZXR0aW5nXS5zaXplX2ggKwotCQkJczVrM2UyZnhfcmVnX3BhdFtzZXR0aW5nXS5ibGtfbCkgKgotCQkJczVrM2UyZnhfY3RybC0+ZnBzX2RpdmlkZXIgLyAweDQwMCkgJiAweEZGMDApID4+IDgpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gc2V0X2Zwc19kb25lOwotCi0gIHJjID0gczVrM2UyZnhfaTJjX3dyaXRlX2IoczVrM2UyZnhfY2xpZW50LT5hZGRyLAotCQlSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0xTQiwKLQkJKCgoczVrM2UyZnhfcmVnX3BhdFtzZXR0aW5nXS5zaXplX2ggKwotCQkJczVrM2UyZnhfcmVnX3BhdFtzZXR0aW5nXS5ibGtfbCkgKgotCQkJczVrM2UyZnhfY3RybC0+ZnBzX2RpdmlkZXIgLyAweDQwMCkgJiAweDAwRkYpKTsKLQotc2V0X2Zwc19kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgczVrM2UyZnhfd3JpdGVfZXhwX2dhaW4odWludDE2X3QgZ2FpbiwgdWludDMyX3QgbGluZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCXVpbnQxNl90IG1heF9sZWdhbF9nYWluID0gMHgwMjAwOwotCXVpbnQzMl90IGxsX3JhdGlvOyAvKiBRMTAgKi8KLQl1aW50MzJfdCBsbF9wY2ssIGZsX2xpbmVzOwotCXVpbnQxNl90IG9mZnNldCA9IDQ7Ci0JdWludDMyX3QgIGdhaW5fbXNiLCBnYWluX2xzYjsKLQl1aW50MzJfdCAgaW50Z190X21zYiwgaW50Z190X2xzYjsKLQl1aW50MzJfdCAgbGxfcGNrX21zYiwgbGxfcGNrX2xzYjsKLQotCXN0cnVjdCBzNWszZTJmeF9pMmNfcmVnX2NvbmYgdGJsWzJdOwotCi0JQ0RCRygiTGluZTolZCBzNWszZTJmeF93cml0ZV9leHBfZ2FpbiBcbiIsIF9fTElORV9fKTsKLQotCWlmIChzNWszZTJmeF9jdHJsLT5zZW5zb3Jtb2RlID09IFNFTlNPUl9QUkVWSUVXX01PREUpIHsKLQotCQlzNWszZTJmeF9jdHJsLT5teV9yZWdfZ2FpbiA9IGdhaW47Ci0JCXM1azNlMmZ4X2N0cmwtPm15X3JlZ19saW5lX2NvdW50ID0gKHVpbnQxNl90KWxpbmU7Ci0KLQkJZmxfbGluZXMgPSBzNWszZTJmeF9yZWdfcGF0W1NfUkVTX1BSRVZJRVddLnNpemVfaCArCi0JCQlzNWszZTJmeF9yZWdfcGF0W1NfUkVTX1BSRVZJRVddLmJsa19sOwotCi0JCWxsX3BjayA9IHM1azNlMmZ4X3JlZ19wYXRbU19SRVNfUFJFVklFV10uc2l6ZV93ICsKLQkJCXM1azNlMmZ4X3JlZ19wYXRbU19SRVNfUFJFVklFV10uYmxrX3A7Ci0KLQl9IGVsc2UgewotCi0JCWZsX2xpbmVzID0gczVrM2UyZnhfcmVnX3BhdFtTX1JFU19DQVBUVVJFXS5zaXplX2ggKwotCQkJczVrM2UyZnhfcmVnX3BhdFtTX1JFU19DQVBUVVJFXS5ibGtfbDsKLQotCQlsbF9wY2sgPSBzNWszZTJmeF9yZWdfcGF0W1NfUkVTX0NBUFRVUkVdLnNpemVfdyArCi0JCQlzNWszZTJmeF9yZWdfcGF0W1NfUkVTX0NBUFRVUkVdLmJsa19wOwotCX0KLQotCWlmIChnYWluID4gbWF4X2xlZ2FsX2dhaW4pCi0JCWdhaW4gPSBtYXhfbGVnYWxfZ2FpbjsKLQotCS8qIGluIFExMCAqLwotCWxpbmUgPSAobGluZSAqIHM1azNlMmZ4X2N0cmwtPmZwc19kaXZpZGVyKTsKLQotCWlmIChmbF9saW5lcyA8IChsaW5lIC8gMHg0MDApKQotCQlsbF9yYXRpbyA9IChsaW5lIC8gKGZsX2xpbmVzIC0gb2Zmc2V0KSk7Ci0JZWxzZQotCQlsbF9yYXRpbyA9IDB4NDAwOwotCi0JLyogdXBkYXRlIGdhaW4gcmVnaXN0ZXJzICovCi0JZ2Fpbl9tc2IgPSAoZ2FpbiAmIDB4RkYwMCkgPj4gODsKLQlnYWluX2xzYiA9IGdhaW4gJiAweDAwRkY7Ci0JdGJsWzBdLndhZGRyID0gUkVHX0FOQUxPR1VFX0dBSU5fQ09ERV9HTE9CQUxfTVNCOwotCXRibFswXS5iZGF0YSA9IGdhaW5fbXNiOwotCXRibFsxXS53YWRkciA9IFJFR19BTkFMT0dVRV9HQUlOX0NPREVfR0xPQkFMX0xTQjsKLQl0YmxbMV0uYmRhdGEgPSBnYWluX2xzYjsKLQlyYyA9IHM1azNlMmZ4X2kyY193cml0ZV90YWJsZSgmdGJsWzBdLCBBUlJBWV9TSVpFKHRibCkpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gd3JpdGVfZ2Fpbl9kb25lOwotCi0JbGxfcGNrID0gbGxfcGNrICogbGxfcmF0aW87Ci0JbGxfcGNrX21zYiA9ICgobGxfcGNrIC8gMHg0MDApICYgMHhGRjAwKSA+PiA4OwotCWxsX3Bja19sc2IgPSAobGxfcGNrIC8gMHg0MDApICYgMHgwMEZGOwotCXRibFswXS53YWRkciA9IFJFR19MSU5FX0xFTkdUSF9QQ0tfTVNCOwotCXRibFswXS5iZGF0YSA9IGxsX3Bja19tc2I7Ci0JdGJsWzFdLndhZGRyID0gUkVHX0xJTkVfTEVOR1RIX1BDS19MU0I7Ci0JdGJsWzFdLmJkYXRhID0gbGxfcGNrX2xzYjsKLQlyYyA9IHM1azNlMmZ4X2kyY193cml0ZV90YWJsZSgmdGJsWzBdLCBBUlJBWV9TSVpFKHRibCkpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gd3JpdGVfZ2Fpbl9kb25lOwotCi0JbGluZSA9IGxpbmUgLyBsbF9yYXRpbzsKLQlpbnRnX3RfbXNiID0gKGxpbmUgJiAweEZGMDApID4+IDg7Ci0JaW50Z190X2xzYiA9IChsaW5lICYgMHgwMEZGKTsKLQl0YmxbMF0ud2FkZHIgPSBSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUU7Ci0JdGJsWzBdLmJkYXRhID0gaW50Z190X21zYjsKLQl0YmxbMV0ud2FkZHIgPSBSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfTFNCOwotCXRibFsxXS5iZGF0YSA9IGludGdfdF9sc2I7Ci0JcmMgPSBzNWszZTJmeF9pMmNfd3JpdGVfdGFibGUoJnRibFswXSwgQVJSQVlfU0laRSh0YmwpKTsKLQotd3JpdGVfZ2Fpbl9kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgczVrM2UyZnhfc2V0X3BpY3RfZXhwX2dhaW4odWludDE2X3QgZ2FpbiwgdWludDMyX3QgbGluZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCUNEQkcoIkxpbmU6JWQgczVrM2UyZnhfc2V0X3BpY3RfZXhwX2dhaW4gXG4iLCBfX0xJTkVfXyk7Ci0KLQlyYyA9Ci0JCXM1azNlMmZ4X3dyaXRlX2V4cF9nYWluKGdhaW4sIGxpbmUpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBzNWszZTJmeF92aWRlb19jb25maWcoaW50IG1vZGUsIGludCByZXMpCi17Ci0JaW50MzJfdCByYzsKLQotCXN3aXRjaCAocmVzKSB7Ci0JY2FzZSBTX1FUUl9TSVpFOgotCQlyYyA9IHM1azNlMmZ4X3NldHRpbmcoU19VUERBVEVfUEVSSU9ESUMsIFNfUkVTX1BSRVZJRVcpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCUNEQkcoInM1azNlMmZ4IHNlbnNvciBjb25maWd1cmF0aW9uIGRvbmUhXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNfRlVMTF9TSVpFOgotCQlyYyA9IHM1azNlMmZ4X3NldHRpbmcoU19VUERBVEVfUEVSSU9ESUMsIFNfUkVTX0NBUFRVUkUpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfSAvKiBzd2l0Y2ggKi8KLQotCXM1azNlMmZ4X2N0cmwtPnByZXZfcmVzID0gcmVzOwotCXM1azNlMmZ4X2N0cmwtPmN1cnJfcmVzID0gcmVzOwotCXM1azNlMmZ4X2N0cmwtPnNlbnNvcm1vZGUgPSBtb2RlOwotCi0JcmMgPQotCQlzNWszZTJmeF93cml0ZV9leHBfZ2FpbihzNWszZTJmeF9jdHJsLT5teV9yZWdfZ2FpbiwKLQkJCXM1azNlMmZ4X2N0cmwtPm15X3JlZ19saW5lX2NvdW50KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgczVrM2UyZnhfc25hcHNob3RfY29uZmlnKGludCBtb2RlKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JcmMgPSBzNWszZTJmeF9zZXR0aW5nKFNfVVBEQVRFX1BFUklPRElDLCBTX1JFU19DQVBUVVJFKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlzNWszZTJmeF9jdHJsLT5jdXJyX3JlcyA9IHM1azNlMmZ4X2N0cmwtPnBpY3RfcmVzOwotCXM1azNlMmZ4X2N0cmwtPnNlbnNvcm1vZGUgPSBtb2RlOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBzNWszZTJmeF9yYXdfc25hcHNob3RfY29uZmlnKGludCBtb2RlKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JcmMgPSBzNWszZTJmeF9zZXR0aW5nKFNfVVBEQVRFX1BFUklPRElDLCBTX1JFU19DQVBUVVJFKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlzNWszZTJmeF9jdHJsLT5jdXJyX3JlcyA9IHM1azNlMmZ4X2N0cmwtPnBpY3RfcmVzOwotCXM1azNlMmZ4X2N0cmwtPnNlbnNvcm1vZGUgPSBtb2RlOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBzNWszZTJmeF9zZXRfc2Vuc29yX21vZGUoaW50IG1vZGUsIGludCByZXMpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFNFTlNPUl9QUkVWSUVXX01PREU6Ci0JCXJjID0gczVrM2UyZnhfdmlkZW9fY29uZmlnKG1vZGUsIHJlcyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTRU5TT1JfU05BUFNIT1RfTU9ERToKLQkJcmMgPSBzNWszZTJmeF9zbmFwc2hvdF9jb25maWcobW9kZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTRU5TT1JfUkFXX1NOQVBTSE9UX01PREU6Ci0JCXJjID0gczVrM2UyZnhfcmF3X3NuYXBzaG90X2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgczVrM2UyZnhfc2V0X2RlZmF1bHRfZm9jdXModm9pZCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotICByYyA9IHM1azNlMmZ4X2kyY193cml0ZV9iKHM1azNlMmZ4X2NsaWVudC0+YWRkciwKLQkJMHgzMTMxLCAwKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLSAgcmMgPSBzNWszZTJmeF9pMmNfd3JpdGVfYihzNWszZTJmeF9jbGllbnQtPmFkZHIsCi0JCTB4MzEzMiwgMCk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JczVrM2UyZnhfY3RybC0+Y3Vycl9sZW5zX3BvcyA9IDA7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHM1azNlMmZ4X21vdmVfZm9jdXMoaW50IGRpcmVjdGlvbiwgaW50MzJfdCBudW1fc3RlcHMpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JaW50MzJfdCBpOwotCWludDE2X3Qgc3RlcF9kaXJlY3Rpb247Ci0JaW50MTZfdCBhY3R1YWxfc3RlcDsKLQlpbnQxNl90IG5leHRfcG9zLCBwb3Nfb2Zmc2V0OwotCWludDE2X3QgaW5pdF9jb2RlID0gNTA7Ci0JdWludDhfdCBuZXh0X3Bvc19tc2IsIG5leHRfcG9zX2xzYjsKLQlpbnQxNl90IHNfbW92ZVs1XTsKLQl1aW50MzJfdCBnYWluOyAvKiBRMTAgZm9ybWF0ICovCi0KLQlpZiAoZGlyZWN0aW9uID09IE1PVkVfTkVBUikKLQkJc3RlcF9kaXJlY3Rpb24gPSAyMDsKLQllbHNlIGlmIChkaXJlY3Rpb24gPT0gTU9WRV9GQVIpCi0JCXN0ZXBfZGlyZWN0aW9uID0gLTIwOwotCWVsc2UgewotCQlDREJHKCJzNWszZTJmeF9tb3ZlX2ZvY3VzIGZhaWxlZCBhdCBsaW5lICVkIC4uLlxuIiwgX19MSU5FX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlhY3R1YWxfc3RlcCA9IHN0ZXBfZGlyZWN0aW9uICogKGludDE2X3QpbnVtX3N0ZXBzOwotCXBvc19vZmZzZXQgPSBpbml0X2NvZGUgKyBzNWszZTJmeF9jdHJsLT5jdXJyX2xlbnNfcG9zOwotCWdhaW4gPSBhY3R1YWxfc3RlcCAqIDB4NDAwIC8gNTsKLQotCWZvciAoaSA9IDA7IGkgPD0gNDsgaSsrKSB7Ci0JCWlmIChhY3R1YWxfc3RlcCA+PSAwKQotCQkJc19tb3ZlW2ldID0gKCgoaSsxKSpnYWluKzB4MjAwKS0oaSpnYWluKzB4MjAwKSkvMHg0MDA7Ci0JCWVsc2UKLQkJCXNfbW92ZVtpXSA9ICgoKGkrMSkqZ2Fpbi0weDIwMCktKGkqZ2Fpbi0weDIwMCkpLzB4NDAwOwotCX0KLQotCS8qIFJpbmcgRGFtcGluZyBDb2RlICovCi0JZm9yIChpID0gMDsgaSA8PSA0OyBpKyspIHsKLQkJbmV4dF9wb3MgPSAoaW50MTZfdCkocG9zX29mZnNldCArIHNfbW92ZVtpXSk7Ci0KLQkJaWYgKG5leHRfcG9zID4gKDczOCArIGluaXRfY29kZSkpCi0JCQluZXh0X3BvcyA9IDczOCArIGluaXRfY29kZTsKLQkJZWxzZSBpZiAobmV4dF9wb3MgPCAwKQotCQkJbmV4dF9wb3MgPSAwOwotCi0JCUNEQkcoIm5leHRfcG9zaXRpb24gaW4gZGFtcGluZyBtb2RlID0gJWRcbiIsIG5leHRfcG9zKTsKLQkJLyogV3JpdGluZyB0aGUgVmFsdWVzIHRvIHRoZSBhY3R1YXRvciAqLwotCQlpZiAobmV4dF9wb3MgPT0gaW5pdF9jb2RlKQotCQkJbmV4dF9wb3MgPSAweDAwOwotCi0JCW5leHRfcG9zX21zYiA9IG5leHRfcG9zID4+IDg7Ci0JCW5leHRfcG9zX2xzYiA9IG5leHRfcG9zICYgMHgwMEZGOwotCi0JCXJjID0gczVrM2UyZnhfaTJjX3dyaXRlX2IoczVrM2UyZnhfY2xpZW50LT5hZGRyLAotCQkJMHgzMTMxLCBuZXh0X3Bvc19tc2IpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0KLQkJcmMgPSBzNWszZTJmeF9pMmNfd3JpdGVfYihzNWszZTJmeF9jbGllbnQtPmFkZHIsCi0JCQkweDMxMzIsIG5leHRfcG9zX2xzYik7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQotCQlwb3Nfb2Zmc2V0ID0gbmV4dF9wb3M7Ci0JCXM1azNlMmZ4X2N0cmwtPmN1cnJfbGVuc19wb3MgPSBwb3Nfb2Zmc2V0IC0gaW5pdF9jb2RlOwotCQlpZiAoaSA8IDQpCi0JCQltZGVsYXkoMyk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHM1azNlMmZ4X3NlbnNvcl9jb25maWcodm9pZCBfX3VzZXIgKmFyZ3ApCi17Ci0Jc3RydWN0IHNlbnNvcl9jZmdfZGF0YSBjZGF0YTsKLQlsb25nICAgcmMgPSAwOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjZGF0YSwKLQkJCSh2b2lkICopYXJncCwKLQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JbXV0ZXhfbG9jaygmczVrM2UyZnhfbXV0ZXgpOwotCi0JQ0RCRygiJXM6IGNmZ3R5cGUgPSAlZFxuIiwgX19mdW5jX18sIGNkYXRhLmNmZ3R5cGUpOwotCXN3aXRjaCAoY2RhdGEuY2ZndHlwZSkgewotCWNhc2UgQ0ZHX0dFVF9QSUNUX0ZQUzoKLQkJczVrM2UyZnhfZ2V0X3BpY3RfZnBzKGNkYXRhLmNmZy5nZnBzLnByZXZmcHMsCi0JCQkmKGNkYXRhLmNmZy5nZnBzLnBpY3RmcHMpKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwgJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfR0VUX1BSRVZfTF9QRjoKLQkJY2RhdGEuY2ZnLnByZXZsX3BmID0gczVrM2UyZnhfZ2V0X3ByZXZfbGluZXNfcGYoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19HRVRfUFJFVl9QX1BMOgotCQljZGF0YS5jZmcucHJldnBfcGwgPSBzNWszZTJmeF9nZXRfcHJldl9waXhlbHNfcGwoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19HRVRfUElDVF9MX1BGOgotCQljZGF0YS5jZmcucGljdGxfcGYgPSBzNWszZTJmeF9nZXRfcGljdF9saW5lc19wZigpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSZjZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX0dFVF9QSUNUX1BfUEw6Ci0JCWNkYXRhLmNmZy5waWN0cF9wbCA9IHM1azNlMmZ4X2dldF9waWN0X3BpeGVsc19wbCgpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSZjZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX0dFVF9QSUNUX01BWF9FWFBfTEM6Ci0JCWNkYXRhLmNmZy5waWN0X21heF9leHBfbGMgPQotCQkJczVrM2UyZnhfZ2V0X3BpY3RfbWF4X2V4cF9sYygpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSZjZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1NFVF9GUFM6Ci0JY2FzZSBDRkdfU0VUX1BJQ1RfRlBTOgotCQlyYyA9IHM1azNlMmZ4X3NldF9mcHMoJihjZGF0YS5jZmcuZnBzKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX0VYUF9HQUlOOgotCQlyYyA9Ci0JCQlzNWszZTJmeF93cml0ZV9leHBfZ2FpbihjZGF0YS5jZmcuZXhwX2dhaW4uZ2FpbiwKLQkJCQljZGF0YS5jZmcuZXhwX2dhaW4ubGluZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX1BJQ1RfRVhQX0dBSU46Ci0JCUNEQkcoIkxpbmU6JWQgQ0ZHX1NFVF9QSUNUX0VYUF9HQUlOIFxuIiwgX19MSU5FX18pOwotCQlyYyA9Ci0JCQlzNWszZTJmeF9zZXRfcGljdF9leHBfZ2FpbigKLQkJCQljZGF0YS5jZmcuZXhwX2dhaW4uZ2FpbiwKLQkJCQljZGF0YS5jZmcuZXhwX2dhaW4ubGluZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX01PREU6Ci0JCXJjID0KLQkJCXM1azNlMmZ4X3NldF9zZW5zb3JfbW9kZSgKLQkJCWNkYXRhLm1vZGUsIGNkYXRhLnJzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19QV1JfRE9XTjoKLQkJcmMgPSBzNWszZTJmeF9wb3dlcl9kb3duKCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfTU9WRV9GT0NVUzoKLQkJcmMgPQotCQkJczVrM2UyZnhfbW92ZV9mb2N1cygKLQkJCWNkYXRhLmNmZy5mb2N1cy5kaXIsCi0JCQljZGF0YS5jZmcuZm9jdXMuc3RlcHMpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1NFVF9ERUZBVUxUX0ZPQ1VTOgotCQlyYyA9Ci0JCQlzNWszZTJmeF9zZXRfZGVmYXVsdF9mb2N1cygpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX0dFVF9BRl9NQVhfU1RFUFM6Ci0JY2FzZSBDRkdfU0VUX0VGRkVDVDoKLQljYXNlIENGR19TRVRfTEVOU19TSEFESU5HOgotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZzNWszZTJmeF9tdXRleCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHM1azNlMmZ4X3NlbnNvcl9wcm9iZShjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqaW5mbywKLQkJc3RydWN0IG1zbV9zZW5zb3JfY3RybCAqcykKLXsKLQlpbnQgcmMgPSAwOwotCi0JcmMgPSBpMmNfYWRkX2RyaXZlcigmczVrM2UyZnhfaTJjX2RyaXZlcik7Ci0JaWYgKHJjIDwgMCB8fCBzNWszZTJmeF9jbGllbnQgPT0gTlVMTCkgewotCQlyYyA9IC1FTk9UU1VQUDsKLQkJZ290byBwcm9iZV9mYWlsOwotCX0KLQotCW1zbV9jYW1pb19jbGtfcmF0ZV9zZXQoMjQwMDAwMDApOwotCW1kZWxheSgyMCk7Ci0KLQlyYyA9IHM1azNlMmZ4X3Byb2JlX2luaXRfc2Vuc29yKGluZm8pOwotCWlmIChyYyA8IDApCi0JCWdvdG8gcHJvYmVfZmFpbDsKLQotCXMtPnNfaW5pdCA9IHM1azNlMmZ4X3NlbnNvcl9vcGVuX2luaXQ7Ci0Jcy0+c19yZWxlYXNlID0gczVrM2UyZnhfc2Vuc29yX3JlbGVhc2U7Ci0Jcy0+c19jb25maWcgID0gczVrM2UyZnhfc2Vuc29yX2NvbmZpZzsKLQlzLT5zX21vdW50X2FuZ2xlICA9IDA7Ci0JczVrM2UyZnhfcHJvYmVfaW5pdF9kb25lKGluZm8pOwotCi0JcmV0dXJuIHJjOwotCi1wcm9iZV9mYWlsOgotCUNEQkcoIlNFTlNPUiBQUk9CRSBGQUlMUyFcbiIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX3M1azNlMmZ4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIG1zbV9jYW1lcmFfZHJ2X3N0YXJ0KHBkZXYsIHM1azNlMmZ4X3NlbnNvcl9wcm9iZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9jYW1lcmFfZHJpdmVyID0gewotCS5wcm9iZSA9IF9fczVrM2UyZnhfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtX2NhbWVyYV9zNWszZTJmeCIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzNWszZTJmeF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX2NhbWVyYV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChzNWszZTJmeF9pbml0KTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3M1azNlMmZ4LmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvczVrM2UyZnguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmNGY4ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvczVrM2UyZnguaAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBDQU1TRU5TT1JfUzVLM0UyRlgKLSNkZWZpbmUgQ0FNU0VOU09SX1M1SzNFMkZYCi0KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci0jZW5kaWYgLyogQ0FNU0VOU09SX1M1SzNFMkZYICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvczVrNGUxLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvczVrNGUxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MjEwM2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3M1azRlMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEwMyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2NhbWVyYS5oPgotI2luY2x1ZGUgInM1azRlMS5oIgotCi0vKiAxNmJpdCBhZGRyZXNzIC0gOCBiaXQgY29udGV4dCByZWdpc3RlciBzdHJ1Y3R1cmUgKi8KLSNkZWZpbmUgUTgJMHgwMDAwMDEwMAotI2RlZmluZSBRMTAJMHgwMDAwMDQwMAotCi0vKiBNQ0xLICovCi0jZGVmaW5lIFM1SzRFMV9NQVNURVJfQ0xLX1JBVEUgMjQwMDAwMDAKLQotLyogQUYgVG90YWwgc3RlcHMgcGFyYW1ldGVycyAqLwotI2RlZmluZSBTNUs0RTFfVE9UQUxfU1RFUFNfTkVBUl9UT19GQVIJMzIKLQotI2RlZmluZSBTNUs0RTFfUkVHX1BSRVZfRlJBTUVfTEVOXzEJMzEKLSNkZWZpbmUgUzVLNEUxX1JFR19QUkVWX0ZSQU1FX0xFTl8yCTMyCi0jZGVmaW5lIFM1SzRFMV9SRUdfUFJFVl9MSU5FX0xFTl8xCTMzCi0jZGVmaW5lIFM1SzRFMV9SRUdfUFJFVl9MSU5FX0xFTl8yCTM0Ci0KLSNkZWZpbmUgUzVLNEUxX1JFR19TTkFQX0ZSQU1FX0xFTl8xCTE1Ci0jZGVmaW5lIFM1SzRFMV9SRUdfU05BUF9GUkFNRV9MRU5fMgkxNgotI2RlZmluZSAgUzVLNEUxX1JFR19TTkFQX0xJTkVfTEVOXzEJMTcKLSNkZWZpbmUgUzVLNEUxX1JFR19TTkFQX0xJTkVfTEVOXzIJMTgKLSNkZWZpbmUgTVNCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIExTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi1zdHJ1Y3QgczVrNGUxX3dvcmtfdCB7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Ci19OwotCi1zdGF0aWMgc3RydWN0IHM1azRlMV93b3JrX3QgKnM1azRlMV9zZW5zb3J3Owotc3RhdGljIHN0cnVjdCBzNWs0ZTFfd29ya190ICpzNWs0ZTFfYWZfc2Vuc29ydzsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqczVrNGUxX2FmX2NsaWVudDsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqczVrNGUxX2NsaWVudDsKLQotc3RydWN0IHM1azRlMV9jdHJsX3QgewotCWNvbnN0IHN0cnVjdCAgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2Vuc29yZGF0YTsKLQotCXVpbnQzMl90IHNlbnNvcm1vZGU7Ci0JdWludDMyX3QgZnBzX2RpdmlkZXI7LyogaW5pdCB0byAxICogMHgwMDAwMDQwMCAqLwotCXVpbnQzMl90IHBpY3RfZnBzX2RpdmlkZXI7LyogaW5pdCB0byAxICogMHgwMDAwMDQwMCAqLwotCXVpbnQxNl90IGZwczsKLQotCXVpbnQxNl90IGN1cnJfbGVuc19wb3M7Ci0JdWludDE2X3QgY3Vycl9zdGVwX3BvczsKLQl1aW50MTZfdCBteV9yZWdfZ2FpbjsKLQl1aW50MzJfdCBteV9yZWdfbGluZV9jb3VudDsKLQl1aW50MTZfdCB0b3RhbF9saW5lc19wZXJfZnJhbWU7Ci0KLQllbnVtIHM1azRlMV9yZXNvbHV0aW9uX3QgcHJldl9yZXM7Ci0JZW51bSBzNWs0ZTFfcmVzb2x1dGlvbl90IHBpY3RfcmVzOwotCWVudW0gczVrNGUxX3Jlc29sdXRpb25fdCBjdXJyX3JlczsKLQllbnVtIHM1azRlMV90ZXN0X21vZGVfdCAgc2V0X3Rlc3Q7Ci19OwotCi1zdGF0aWMgYm9vbCBDU0lfQ09ORklHOwotc3RhdGljIHN0cnVjdCBzNWs0ZTFfY3RybF90ICpzNWs0ZTFfY3RybDsKLQotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHM1azRlMV93YWl0X3F1ZXVlKTsKLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChzNWs0ZTFfYWZfd2FpdF9xdWV1ZSk7Ci1ERUZJTkVfTVVURVgoczVrNGUxX211dCk7Ci0KLXN0YXRpYyB1aW50MTZfdCBwcmV2X2xpbmVfbGVuZ3RoX3BjazsKLXN0YXRpYyB1aW50MTZfdCBwcmV2X2ZyYW1lX2xlbmd0aF9saW5lczsKLXN0YXRpYyB1aW50MTZfdCBzbmFwX2xpbmVfbGVuZ3RoX3BjazsKLXN0YXRpYyB1aW50MTZfdCBzbmFwX2ZyYW1lX2xlbmd0aF9saW5lczsKLQotc3RhdGljIGludCBzNWs0ZTFfaTJjX3J4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQkJdW5zaWduZWQgY2hhciAqcnhkYXRhLCBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKLQkJewotCQkJLmFkZHIgID0gc2FkZHIsCi0JCQkuZmxhZ3MgPSAwLAotCQkJLmxlbiAgID0gMSwKLQkJCS5idWYgICA9IHJ4ZGF0YSwKLQkJfSwKLQkJewotCQkJLmFkZHIgID0gc2FkZHIsCi0JCQkuZmxhZ3MgPSBJMkNfTV9SRCwKLQkJCS5sZW4gICA9IDEsCi0JCQkuYnVmICAgPSByeGRhdGEsCi0JCX0sCi0JfTsKLQlpZiAoaTJjX3RyYW5zZmVyKHM1azRlMV9jbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpIDwgMCkgewotCQlDREJHKCJzNWs0ZTFfaTJjX3J4ZGF0YSBmYWlsZCAweCV4XG4iLCBzYWRkcik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgczVrNGUxX2kyY190eGRhdGEodW5zaWduZWQgc2hvcnQgc2FkZHIsCi0JCXVuc2lnbmVkIGNoYXIgKnR4ZGF0YSwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKLQkJewotCQkJLmFkZHIgPSBzYWRkciwKLQkJCS5mbGFncyA9IDAsCi0JCQkubGVuID0gbGVuZ3RoLAotCQkJLmJ1ZiA9IHR4ZGF0YSwKLQkJfSwKLQl9OwotCWlmIChpMmNfdHJhbnNmZXIoczVrNGUxX2NsaWVudC0+YWRhcHRlciwgbXNnLCAxKSA8IDApIHsKLQkJQ0RCRygiczVrNGUxX2kyY190eGRhdGEgZmFpbGQgMHgleFxuIiwgc2FkZHIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgczVrNGUxX2kyY19yZWFkKHVuc2lnbmVkIHNob3J0IHJhZGRyLAotCQl1bnNpZ25lZCBzaG9ydCAqcmRhdGEsIGludCBybGVuKQotewotCWludDMyX3QgcmMgPSAwOwotCXVuc2lnbmVkIGNoYXIgYnVmWzJdOwotCi0JaWYgKCFyZGF0YSkKLQkJcmV0dXJuIC1FSU87Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gKHJhZGRyICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlsxXSA9IChyYWRkciAmIDB4MDBGRik7Ci0JcmMgPSBzNWs0ZTFfaTJjX3J4ZGF0YShzNWs0ZTFfY2xpZW50LT5hZGRyLCBidWYsIHJsZW4pOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiczVrNGUxX2kyY19yZWFkIDB4JXggZmFpbGVkIVxuIiwgcmFkZHIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCSpyZGF0YSA9IChybGVuID09IDIgPyBidWZbMF0gPDwgOCB8IGJ1ZlsxXSA6IGJ1ZlswXSk7Ci0JQ0RCRygiczVrNGUxX2kyY19yZWFkIDB4JXggdmFsID0gMHgleCFcbiIsIHJhZGRyLCAqcmRhdGEpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBzNWs0ZTFfaTJjX3dyaXRlX2Jfc2Vuc29yKHVuc2lnbmVkIHNob3J0IHdhZGRyLCB1aW50OF90IGJkYXRhKQotewotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCXVuc2lnbmVkIGNoYXIgYnVmWzNdOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9ICh3YWRkciAmIDB4RkYwMCkgPj4gODsKLQlidWZbMV0gPSAod2FkZHIgJiAweDAwRkYpOwotCWJ1ZlsyXSA9IGJkYXRhOwotCUNEQkcoImkyY193cml0ZV9iIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4XG4iLCB3YWRkciwgYmRhdGEpOwotCXJjID0gczVrNGUxX2kyY190eGRhdGEoczVrNGUxX2NsaWVudC0+YWRkciwgYnVmLCAzKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoImkyY193cml0ZV9iIGZhaWxlZCwgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXghXG4iLAotCQkJCXdhZGRyLCBiZGF0YSk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgczVrNGUxX2kyY193cml0ZV9iX3RhYmxlKHN0cnVjdCBzNWs0ZTFfaTJjX3JlZ19jb25mIGNvbnN0Ci0JCSpyZWdfY29uZl90YmwsIGludCBudW0pCi17Ci0JaW50IGk7Ci0JaW50MzJfdCByYyA9IC1FSU87Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJcmMgPSBzNWs0ZTFfaTJjX3dyaXRlX2Jfc2Vuc29yKHJlZ19jb25mX3RibC0+d2FkZHIsCi0JCQkJcmVnX2NvbmZfdGJsLT53ZGF0YSk7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQkJcmVnX2NvbmZfdGJsKys7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgczVrNGUxX2FmX2kyY190eGRhdGEodW5zaWduZWQgc2hvcnQgc2FkZHIsCi0JCXVuc2lnbmVkIGNoYXIgKnR4ZGF0YSwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKLQkJewotCQkJLmFkZHIgPSBzYWRkciwKLQkJCS5mbGFncyA9IDAsCi0JCQkubGVuID0gbGVuZ3RoLAotCQkJLmJ1ZiA9IHR4ZGF0YSwKLQkJfSwKLQl9OwotCWlmIChpMmNfdHJhbnNmZXIoczVrNGUxX2FmX2NsaWVudC0+YWRhcHRlciwgbXNnLCAxKSA8IDApIHsKLQkJcHJfZXJyKCJzNWs0ZTFfYWZfaTJjX3R4ZGF0YSBmYWlsZCAweCV4XG4iLCBzYWRkcik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCBzNWs0ZTFfYWZfaTJjX3dyaXRlX2Jfc2Vuc29yKHVpbnQ4X3Qgd2FkZHIsIHVpbnQ4X3QgYmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IC1FRkFVTFQ7Ci0JdW5zaWduZWQgY2hhciBidWZbMl07Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gd2FkZHI7Ci0JYnVmWzFdID0gYmRhdGE7Ci0JQ0RCRygiaTJjX3dyaXRlX2IgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIHdhZGRyLCBiZGF0YSk7Ci0JcmMgPSBzNWs0ZTFfYWZfaTJjX3R4ZGF0YShzNWs0ZTFfYWZfY2xpZW50LT5hZGRyIDw8IDEsIGJ1ZiwgMik7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoImkyY193cml0ZV9iIGZhaWxlZCwgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXghXG4iLAotCQkJCXdhZGRyLCBiZGF0YSk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgczVrNGUxX3N0YXJ0X3N0cmVhbSh2b2lkKQotewotCXM1azRlMV9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwMTAwLCAweDAxKTsvKiBzdHJlYW1pbmcgb24gKi8KLX0KLQotc3RhdGljIHZvaWQgczVrNGUxX3N0b3Bfc3RyZWFtKHZvaWQpCi17Ci0JczVrNGUxX2kyY193cml0ZV9iX3NlbnNvcigweDAxMDAsIDB4MDApOy8qIHN0cmVhbWluZyBvZmYgKi8KLX0KLQotc3RhdGljIHZvaWQgczVrNGUxX2dyb3VwX2hvbGRfb24odm9pZCkKLXsKLQlzNWs0ZTFfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MDEwNCwgMHgwMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHM1azRlMV9ncm91cF9ob2xkX29mZih2b2lkKQotewotCXM1azRlMV9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwMTA0LCAweDApOwotfQotCi1zdGF0aWMgdm9pZCBzNWs0ZTFfZ2V0X3BpY3RfZnBzKHVpbnQxNl90IGZwcywgdWludDE2X3QgKnBmcHMpCi17Ci0JLyogaW5wdXQgZnBzIGlzIHByZXZpZXcgZnBzIGluIFE4IGZvcm1hdCAqLwotCXVpbnQzMl90IGRpdmlkZXIsIGQxLCBkMjsKLQotCWQxID0gKHByZXZfZnJhbWVfbGVuZ3RoX2xpbmVzICogMHgwMDAwMDQwMCkgLyBzbmFwX2ZyYW1lX2xlbmd0aF9saW5lczsKLQlkMiA9IChwcmV2X2xpbmVfbGVuZ3RoX3BjayAqIDB4MDAwMDA0MDApIC8gc25hcF9saW5lX2xlbmd0aF9wY2s7Ci0JZGl2aWRlciA9IChkMSAqIGQyKSAvIDB4NDAwOwotCi0JLypWZXJpZnkgUENMSyBzZXR0aW5ncyBhbmQgZnJhbWUgc2l6ZXMuKi8KLQkqcGZwcyA9ICh1aW50MTZfdCkgKGZwcyAqIGRpdmlkZXIgLyAweDQwMCk7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBzNWs0ZTFfZ2V0X3ByZXZfbGluZXNfcGYodm9pZCkKLXsKLQlpZiAoczVrNGUxX2N0cmwtPnByZXZfcmVzID09IFFUUl9TSVpFKQotCQlyZXR1cm4gcHJldl9mcmFtZV9sZW5ndGhfbGluZXM7Ci0JZWxzZQotCQlyZXR1cm4gc25hcF9mcmFtZV9sZW5ndGhfbGluZXM7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBzNWs0ZTFfZ2V0X3ByZXZfcGl4ZWxzX3BsKHZvaWQpCi17Ci0JaWYgKHM1azRlMV9jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkKLQkJcmV0dXJuIHByZXZfbGluZV9sZW5ndGhfcGNrOwotCWVsc2UKLQkJcmV0dXJuIHNuYXBfbGluZV9sZW5ndGhfcGNrOwotfQotCi1zdGF0aWMgdWludDE2X3QgczVrNGUxX2dldF9waWN0X2xpbmVzX3BmKHZvaWQpCi17Ci0JaWYgKHM1azRlMV9jdHJsLT5waWN0X3JlcyA9PSBRVFJfU0laRSkKLQkJcmV0dXJuIHByZXZfZnJhbWVfbGVuZ3RoX2xpbmVzOwotCWVsc2UKLQkJcmV0dXJuIHNuYXBfZnJhbWVfbGVuZ3RoX2xpbmVzOwotfQotCi1zdGF0aWMgdWludDE2X3QgczVrNGUxX2dldF9waWN0X3BpeGVsc19wbCh2b2lkKQotewotCWlmIChzNWs0ZTFfY3RybC0+cGljdF9yZXMgPT0gUVRSX1NJWkUpCi0JCXJldHVybiBwcmV2X2xpbmVfbGVuZ3RoX3BjazsKLQllbHNlCi0JCXJldHVybiBzbmFwX2xpbmVfbGVuZ3RoX3BjazsKLX0KLQotc3RhdGljIHVpbnQzMl90IHM1azRlMV9nZXRfcGljdF9tYXhfZXhwX2xjKHZvaWQpCi17Ci0JcmV0dXJuIHNuYXBfZnJhbWVfbGVuZ3RoX2xpbmVzICogMjQ7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHM1azRlMV9zZXRfZnBzKHN0cnVjdCBmcHNfY2ZnICAgKmZwcykKLXsKLQl1aW50MTZfdCB0b3RhbF9saW5lc19wZXJfZnJhbWU7Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlzNWs0ZTFfY3RybC0+ZnBzX2RpdmlkZXIgPSBmcHMtPmZwc19kaXY7Ci0JczVrNGUxX2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIgPSBmcHMtPnBpY3RfZnBzX2RpdjsKLQotCWlmIChzNWs0ZTFfY3RybC0+c2Vuc29ybW9kZSA9PSBTRU5TT1JfUFJFVklFV19NT0RFKSB7Ci0JCXRvdGFsX2xpbmVzX3Blcl9mcmFtZSA9ICh1aW50MTZfdCkKLQkJKChwcmV2X2ZyYW1lX2xlbmd0aF9saW5lcyAqIHM1azRlMV9jdHJsLT5mcHNfZGl2aWRlcikgLyAweDQwMCk7Ci0JfSBlbHNlIHsKLQkJdG90YWxfbGluZXNfcGVyX2ZyYW1lID0gKHVpbnQxNl90KQotCQkoKHNuYXBfZnJhbWVfbGVuZ3RoX2xpbmVzICogczVrNGUxX2N0cmwtPmZwc19kaXZpZGVyKSAvIDB4NDAwKTsKLQl9Ci0KLQlzNWs0ZTFfZ3JvdXBfaG9sZF9vbigpOwotCXJjID0gczVrNGUxX2kyY193cml0ZV9iX3NlbnNvcigweDAzNDAsCi0JCQkoKHRvdGFsX2xpbmVzX3Blcl9mcmFtZSAmIDB4RkYwMCkgPj4gOCkpOwotCXJjID0gczVrNGUxX2kyY193cml0ZV9iX3NlbnNvcigweDAzNDEsCi0JCQkodG90YWxfbGluZXNfcGVyX2ZyYW1lICYgMHgwMEZGKSk7Ci0JczVrNGUxX2dyb3VwX2hvbGRfb2ZmKCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDhfdCBzNWs0ZTFfYnl0ZSh1aW50MTZfdCB3b3JkLCB1aW50OF90IG9mZnNldCkKLXsKLQlyZXR1cm4gd29yZCA+PiAob2Zmc2V0ICogQklUU19QRVJfQllURSk7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHM1azRlMV93cml0ZV9leHBfZ2Fpbih1aW50MTZfdCBnYWluLCB1aW50MzJfdCBsaW5lKQotewotCXVpbnQxNl90IG1heF9sZWdhbF9nYWluID0gMHgwMjAwOwotCWludDMyX3QgcmMgPSAwOwotCXN0YXRpYyB1aW50MzJfdCBmbF9saW5lczsKLQotCWlmIChnYWluID4gbWF4X2xlZ2FsX2dhaW4pIHsKLQkJcHJfZGVidWcoIk1heCBsZWdhbCBnYWluIExpbmU6JWRcbiIsIF9fTElORV9fKTsKLQkJZ2FpbiA9IG1heF9sZWdhbF9nYWluOwotCX0KLQkvKiBBbmFsb2d1ZSBHYWluICovCi0JczVrNGUxX2kyY193cml0ZV9iX3NlbnNvcigweDAyMDQsIHM1azRlMV9ieXRlKGdhaW4sIE1TQikpOwotCXM1azRlMV9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwMjA1LCBzNWs0ZTFfYnl0ZShnYWluLCBMU0IpKTsKLQotCWlmIChsaW5lID4gKHByZXZfZnJhbWVfbGVuZ3RoX2xpbmVzIC0gNCkpIHsKLQkJZmxfbGluZXMgPSBsaW5lKzQ7Ci0JCXM1azRlMV9ncm91cF9ob2xkX29uKCk7Ci0JCXM1azRlMV9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwMzQwLCBzNWs0ZTFfYnl0ZShmbF9saW5lcywgTVNCKSk7Ci0JCXM1azRlMV9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwMzQxLCBzNWs0ZTFfYnl0ZShmbF9saW5lcywgTFNCKSk7Ci0JCS8qIENvYXJzZSBJbnRlZ3JhdGlvbiBUaW1lICovCi0JCXM1azRlMV9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwMjAyLCBzNWs0ZTFfYnl0ZShsaW5lLCBNU0IpKTsKLQkJczVrNGUxX2kyY193cml0ZV9iX3NlbnNvcigweDAyMDMsIHM1azRlMV9ieXRlKGxpbmUsIExTQikpOwotCQlzNWs0ZTFfZ3JvdXBfaG9sZF9vZmYoKTsKLQl9IGVsc2UgaWYgKGxpbmUgPCAoZmxfbGluZXMgLSA0KSkgewotCQlmbF9saW5lcyA9IGxpbmUrNDsKLQkJaWYgKGZsX2xpbmVzIDwgcHJldl9mcmFtZV9sZW5ndGhfbGluZXMpCi0JCQlmbF9saW5lcyA9IHByZXZfZnJhbWVfbGVuZ3RoX2xpbmVzOwotCi0JCXM1azRlMV9ncm91cF9ob2xkX29uKCk7Ci0JCS8qIENvYXJzZSBJbnRlZ3JhdGlvbiBUaW1lICovCi0JCXM1azRlMV9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwMjAyLCBzNWs0ZTFfYnl0ZShsaW5lLCBNU0IpKTsKLQkJczVrNGUxX2kyY193cml0ZV9iX3NlbnNvcigweDAyMDMsIHM1azRlMV9ieXRlKGxpbmUsIExTQikpOwotCQlzNWs0ZTFfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MDM0MCwgczVrNGUxX2J5dGUoZmxfbGluZXMsIE1TQikpOwotCQlzNWs0ZTFfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MDM0MSwgczVrNGUxX2J5dGUoZmxfbGluZXMsIExTQikpOwotCQlzNWs0ZTFfZ3JvdXBfaG9sZF9vZmYoKTsKLQl9IGVsc2UgewotCQlmbF9saW5lcyA9IGxpbmUrNDsKLQkJczVrNGUxX2dyb3VwX2hvbGRfb24oKTsKLQkJLyogQ29hcnNlIEludGVncmF0aW9uIFRpbWUgKi8KLQkJczVrNGUxX2kyY193cml0ZV9iX3NlbnNvcigweDAyMDIsIHM1azRlMV9ieXRlKGxpbmUsIE1TQikpOwotCQlzNWs0ZTFfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MDIwMywgczVrNGUxX2J5dGUobGluZSwgTFNCKSk7Ci0JCXM1azRlMV9ncm91cF9ob2xkX29mZigpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHM1azRlMV9zZXRfcGljdF9leHBfZ2Fpbih1aW50MTZfdCBnYWluLCB1aW50MzJfdCBsaW5lKQotewotCXVpbnQxNl90IG1heF9sZWdhbF9nYWluID0gMHgwMjAwOwotCXVpbnQxNl90IG1pbl9sbF9wY2sgPSAweDBBQjI7Ci0JdWludDMyX3QgbGxfcGNrLCBmbF9saW5lczsKLQl1aW50MzJfdCBsbF9yYXRpbzsKLQlpbnQzMl90IHJjID0gMDsKLQl1aW50OF90IGdhaW5fbXNiLCBnYWluX2xzYjsKLQl1aW50OF90IGludGdfdGltZV9tc2IsIGludGdfdGltZV9sc2I7Ci0JdWludDhfdCBsbF9wY2tfbXNiLCBsbF9wY2tfbHNiOwotCi0JaWYgKGdhaW4gPiBtYXhfbGVnYWxfZ2FpbikgewotCQlwcl9kZWJ1ZygiTWF4IGxlZ2FsIGdhaW4gTGluZTolZFxuIiwgX19MSU5FX18pOwotCQlnYWluID0gbWF4X2xlZ2FsX2dhaW47Ci0JfQotCi0JcHJfZGVidWcoInM1azRlMV93cml0ZV9leHBfZ2FpbiA6IGdhaW4gPSAlZCBsaW5lID0gJWRcbiIsIGdhaW4sIGxpbmUpOwotCWxpbmUgPSAodWludDMyX3QpIChsaW5lICogczVrNGUxX2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIpOwotCWZsX2xpbmVzID0gc25hcF9mcmFtZV9sZW5ndGhfbGluZXM7Ci0JbGxfcGNrID0gc25hcF9saW5lX2xlbmd0aF9wY2s7Ci0KLQlpZiAoZmxfbGluZXMgPCAobGluZSAvIDB4NDAwKSkKLQkJbGxfcmF0aW8gPSAobGluZSAvIChmbF9saW5lcyAtIDQpKTsKLQllbHNlCi0JCWxsX3JhdGlvID0gMHg0MDA7Ci0KLQlsbF9wY2sgPSBsbF9wY2sgKiBsbF9yYXRpbyAvIDB4NDAwOwotCWxpbmUgPSBsaW5lIC8gbGxfcmF0aW87Ci0JaWYgKGxsX3BjayA8IG1pbl9sbF9wY2spCi0JCWxsX3BjayA9IG1pbl9sbF9wY2s7Ci0KLQlnYWluX21zYiA9ICh1aW50OF90KSAoKGdhaW4gJiAweEZGMDApID4+IDgpOwotCWdhaW5fbHNiID0gKHVpbnQ4X3QpIChnYWluICYgMHgwMEZGKTsKLQotCWludGdfdGltZV9tc2IgPSAodWludDhfdCkgKChsaW5lICYgMHhGRjAwKSA+PiA4KTsKLQlpbnRnX3RpbWVfbHNiID0gKHVpbnQ4X3QpIChsaW5lICYgMHgwMEZGKTsKLQotCWxsX3Bja19tc2IgPSAodWludDhfdCkgKChsbF9wY2sgJiAweEZGMDApID4+IDgpOwotCWxsX3Bja19sc2IgPSAodWludDhfdCkgKGxsX3BjayAmIDB4MDBGRik7Ci0KLQlzNWs0ZTFfZ3JvdXBfaG9sZF9vbigpOwotCXM1azRlMV9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwMjA0LCBnYWluX21zYik7IC8qIEFuYWxvZ3VlIEdhaW4gKi8KLQlzNWs0ZTFfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MDIwNSwgZ2Fpbl9sc2IpOwotCi0JczVrNGUxX2kyY193cml0ZV9iX3NlbnNvcigweDAzNDIsIGxsX3Bja19tc2IpOwotCXM1azRlMV9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwMzQzLCBsbF9wY2tfbHNiKTsKLQotCS8qIENvYXJzZSBJbnRlZ3JhdGlvbiBUaW1lICovCi0JczVrNGUxX2kyY193cml0ZV9iX3NlbnNvcigweDAyMDIsIGludGdfdGltZV9tc2IpOwotCXM1azRlMV9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwMjAzLCBpbnRnX3RpbWVfbHNiKTsKLQlzNWs0ZTFfZ3JvdXBfaG9sZF9vZmYoKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgczVrNGUxX21vdmVfZm9jdXMoaW50IGRpcmVjdGlvbiwKLQkJaW50MzJfdCBudW1fc3RlcHMpCi17Ci0JaW50MTZfdCBzdGVwX2RpcmVjdGlvbiwgYWN0dWFsX3N0ZXAsIG5leHRfcG9zaXRpb247Ci0JdWludDhfdCBjb2RlX3ZhbF9tc2IsIGNvZGVfdmFsX2xzYjsKLQotCWlmIChkaXJlY3Rpb24gPT0gTU9WRV9ORUFSKQotCQlzdGVwX2RpcmVjdGlvbiA9IDE2OwotCWVsc2UKLQkJc3RlcF9kaXJlY3Rpb24gPSAtMTY7Ci0KLQlhY3R1YWxfc3RlcCA9IChpbnQxNl90KSAoc3RlcF9kaXJlY3Rpb24gKiBudW1fc3RlcHMpOwotCW5leHRfcG9zaXRpb24gPSAoaW50MTZfdCkgKHM1azRlMV9jdHJsLT5jdXJyX2xlbnNfcG9zICsgYWN0dWFsX3N0ZXApOwotCi0JaWYgKG5leHRfcG9zaXRpb24gPiAxMDIzKQotCQluZXh0X3Bvc2l0aW9uID0gMTAyMzsKLQllbHNlIGlmIChuZXh0X3Bvc2l0aW9uIDwgMCkKLQkJbmV4dF9wb3NpdGlvbiA9IDA7Ci0KLQljb2RlX3ZhbF9tc2IgPSBuZXh0X3Bvc2l0aW9uID4+IDQ7Ci0JY29kZV92YWxfbHNiID0gKG5leHRfcG9zaXRpb24gJiAweDAwMEYpIDw8IDQ7Ci0KLQlpZiAoczVrNGUxX2FmX2kyY193cml0ZV9iX3NlbnNvcihjb2RlX3ZhbF9tc2IsIGNvZGVfdmFsX2xzYikgPCAwKSB7Ci0JCXByX2VycigibW92ZV9mb2N1cyBmYWlsZWQgYXQgbGluZSAlZCAuLi5cbiIsIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlzNWs0ZTFfY3RybC0+Y3Vycl9sZW5zX3BvcyA9IG5leHRfcG9zaXRpb247Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHM1azRlMV9zZXRfZGVmYXVsdF9mb2N1cyh1aW50OF90IGFmX3N0ZXApCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlpZiAoczVrNGUxX2N0cmwtPmN1cnJfc3RlcF9wb3MgIT0gMCkgewotCQlyYyA9IHM1azRlMV9tb3ZlX2ZvY3VzKE1PVkVfRkFSLAotCQkJCXM1azRlMV9jdHJsLT5jdXJyX3N0ZXBfcG9zKTsKLQl9IGVsc2UgewotCQlzNWs0ZTFfYWZfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MDAsIDB4MDApOwotCX0KLQotCXM1azRlMV9jdHJsLT5jdXJyX2xlbnNfcG9zID0gMDsKLQlzNWs0ZTFfY3RybC0+Y3Vycl9zdGVwX3BvcyA9IDA7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHM1azRlMV90ZXN0KGVudW0gczVrNGUxX3Rlc3RfbW9kZV90IG1vKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JaWYgKG1vICE9IFRFU1RfT0ZGKQotCQlyYyA9IHM1azRlMV9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwNjAxLCAodWludDhfdCkgbW8pOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBzNWs0ZTFfcmVzZXRfc2Vuc29yKHZvaWQpCi17Ci0JczVrNGUxX2kyY193cml0ZV9iX3NlbnNvcigweDEwMywgMHgxKTsKLX0KLQotc3RhdGljIGludDMyX3QgczVrNGUxX3NlbnNvcl9zZXR0aW5nKGludCB1cGRhdGVfdHlwZSwgaW50IHJ0KQotewotCi0JaW50MzJfdCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfY3NpX3BhcmFtcyBzNWs0ZTFfY3NpX3BhcmFtczsKLQotCXM1azRlMV9zdG9wX3N0cmVhbSgpOwotCW1zbGVlcCgzMCk7Ci0KLQlpZiAodXBkYXRlX3R5cGUgPT0gUkVHX0lOSVQpIHsKLQkJczVrNGUxX3Jlc2V0X3NlbnNvcigpOwotCQlzNWs0ZTFfaTJjX3dyaXRlX2JfdGFibGUoczVrNGUxX3JlZ3MucmVnX21pcGksCi0JCQkJczVrNGUxX3JlZ3MucmVnX21pcGlfc2l6ZSk7Ci0JCXM1azRlMV9pMmNfd3JpdGVfYl90YWJsZShzNWs0ZTFfcmVncy5yZWNfc2V0dGluZ3MsCi0JCQkJczVrNGUxX3JlZ3MucmVjX3NpemUpOwotCQlzNWs0ZTFfaTJjX3dyaXRlX2JfdGFibGUoczVrNGUxX3JlZ3MucmVnX3BsbF9wLAotCQkJCXM1azRlMV9yZWdzLnJlZ19wbGxfcF9zaXplKTsKLQkJQ1NJX0NPTkZJRyA9IDA7Ci0JfSBlbHNlIGlmICh1cGRhdGVfdHlwZSA9PSBVUERBVEVfUEVSSU9ESUMpIHsKLQkJaWYgKHJ0ID09IFJFU19QUkVWSUVXKQotCQkJczVrNGUxX2kyY193cml0ZV9iX3RhYmxlKHM1azRlMV9yZWdzLnJlZ19wcmV2LAotCQkJCQlzNWs0ZTFfcmVncy5yZWdfcHJldl9zaXplKTsKLQkJZWxzZQotCQkJczVrNGUxX2kyY193cml0ZV9iX3RhYmxlKHM1azRlMV9yZWdzLnJlZ19zbmFwLAotCQkJCQlzNWs0ZTFfcmVncy5yZWdfc25hcF9zaXplKTsKLQkJbXNsZWVwKDIwKTsKLQkJaWYgKCFDU0lfQ09ORklHKSB7Ci0JCQltc21fY2FtaW9fdmZlX2Nsa19yYXRlX3NldCgxOTIwMDAwMDApOwotCQkJczVrNGUxX2NzaV9wYXJhbXMuZGF0YV9mb3JtYXQgPSBDU0lfMTBCSVQ7Ci0JCQlzNWs0ZTFfY3NpX3BhcmFtcy5sYW5lX2NudCA9IDE7Ci0JCQlzNWs0ZTFfY3NpX3BhcmFtcy5sYW5lX2Fzc2lnbiA9IDB4ZTQ7Ci0JCQlzNWs0ZTFfY3NpX3BhcmFtcy5kcGNtX3NjaGVtZSA9IDA7Ci0JCQlzNWs0ZTFfY3NpX3BhcmFtcy5zZXR0bGVfY250ID0gMjQ7Ci0JCQlyYyA9IG1zbV9jYW1pb19jc2lfY29uZmlnKCZzNWs0ZTFfY3NpX3BhcmFtcyk7Ci0JCQltc2xlZXAoMjApOwotCQkJQ1NJX0NPTkZJRyA9IDE7Ci0JCX0KLQkJczVrNGUxX3N0YXJ0X3N0cmVhbSgpOwotCQltc2xlZXAoMzApOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHM1azRlMV92aWRlb19jb25maWcoaW50IG1vZGUpCi17Ci0KLQlpbnQzMl90IHJjID0gMDsKLQlpbnQgcnQ7Ci0JQ0RCRygidmlkZW8gY29uZmlnXG4iKTsKLQkvKiBjaGFuZ2Ugc2Vuc29yIHJlc29sdXRpb24gaWYgbmVlZGVkICovCi0JaWYgKHM1azRlMV9jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkKLQkJcnQgPSBSRVNfUFJFVklFVzsKLQllbHNlCi0JCXJ0ID0gUkVTX0NBUFRVUkU7Ci0JaWYgKHM1azRlMV9zZW5zb3Jfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsIHJ0KSA8IDApCi0JCXJldHVybiByYzsKLQlpZiAoczVrNGUxX2N0cmwtPnNldF90ZXN0KSB7Ci0JCWlmIChzNWs0ZTFfdGVzdChzNWs0ZTFfY3RybC0+c2V0X3Rlc3QpIDwgMCkKLQkJCXJldHVybiAgcmM7Ci0JfQotCi0JczVrNGUxX2N0cmwtPmN1cnJfcmVzID0gczVrNGUxX2N0cmwtPnByZXZfcmVzOwotCXM1azRlMV9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHM1azRlMV9zbmFwc2hvdF9jb25maWcoaW50IG1vZGUpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JaW50IHJ0OwotCi0JLypjaGFuZ2Ugc2Vuc29yIHJlc29sdXRpb24gaWYgbmVlZGVkICovCi0JaWYgKHM1azRlMV9jdHJsLT5jdXJyX3JlcyAhPSBzNWs0ZTFfY3RybC0+cGljdF9yZXMpIHsKLQkJaWYgKHM1azRlMV9jdHJsLT5waWN0X3JlcyA9PSBRVFJfU0laRSkKLQkJCXJ0ID0gUkVTX1BSRVZJRVc7Ci0JCWVsc2UKLQkJCXJ0ID0gUkVTX0NBUFRVUkU7Ci0JCWlmIChzNWs0ZTFfc2Vuc29yX3NldHRpbmcoVVBEQVRFX1BFUklPRElDLCBydCkgPCAwKQotCQkJcmV0dXJuIHJjOwotCX0KLQotCXM1azRlMV9jdHJsLT5jdXJyX3JlcyA9IHM1azRlMV9jdHJsLT5waWN0X3JlczsKLQlzNWs0ZTFfY3RybC0+c2Vuc29ybW9kZSA9IG1vZGU7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBzNWs0ZTFfcmF3X3NuYXBzaG90X2NvbmZpZyhpbnQgbW9kZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlpbnQgcnQ7Ci0KLQkvKiBjaGFuZ2Ugc2Vuc29yIHJlc29sdXRpb24gaWYgbmVlZGVkICovCi0JaWYgKHM1azRlMV9jdHJsLT5jdXJyX3JlcyAhPSBzNWs0ZTFfY3RybC0+cGljdF9yZXMpIHsKLQkJaWYgKHM1azRlMV9jdHJsLT5waWN0X3JlcyA9PSBRVFJfU0laRSkKLQkJCXJ0ID0gUkVTX1BSRVZJRVc7Ci0JCWVsc2UKLQkJCXJ0ID0gUkVTX0NBUFRVUkU7Ci0JCWlmIChzNWs0ZTFfc2Vuc29yX3NldHRpbmcoVVBEQVRFX1BFUklPRElDLCBydCkgPCAwKQotCQkJcmV0dXJuIHJjOwotCX0KLQotCXM1azRlMV9jdHJsLT5jdXJyX3JlcyA9IHM1azRlMV9jdHJsLT5waWN0X3JlczsKLQlzNWs0ZTFfY3RybC0+c2Vuc29ybW9kZSA9IG1vZGU7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBzNWs0ZTFfc2V0X3NlbnNvcl9tb2RlKGludCBtb2RlLAotCQlpbnQgcmVzKQotewotCWludDMyX3QgcmMgPSAwOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBTRU5TT1JfUFJFVklFV19NT0RFOgotCQlyYyA9IHM1azRlMV92aWRlb19jb25maWcobW9kZSk7Ci0JCWJyZWFrOwotCWNhc2UgU0VOU09SX1NOQVBTSE9UX01PREU6Ci0JCXJjID0gczVrNGUxX3NuYXBzaG90X2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfUkFXX1NOQVBTSE9UX01PREU6Ci0JCXJjID0gczVrNGUxX3Jhd19zbmFwc2hvdF9jb25maWcobW9kZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgczVrNGUxX3Bvd2VyX2Rvd24odm9pZCkKLXsKLQlzNWs0ZTFfc3RvcF9zdHJlYW0oKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzNWs0ZTFfcHJvYmVfaW5pdF9kb25lKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCUNEQkcoInByb2JlIGRvbmVcbiIpOwotCWdwaW9fZnJlZShkYXRhLT5zZW5zb3JfcmVzZXQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHM1azRlMV9wcm9iZV9pbml0X3NlbnNvcihjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1aW50MTZfdCByZWdhZGRyZXNzMSA9IDB4MDAwMDsKLQl1aW50MTZfdCByZWdhZGRyZXNzMiA9IDB4MDAwMTsKLQl1aW50MTZfdCBjaGlwaWQxID0gMDsKLQl1aW50MTZfdCBjaGlwaWQyID0gMDsKLQotCUNEQkcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlDREJHKCIgczVrNGUxX3Byb2JlX2luaXRfc2Vuc29yIGlzIGNhbGxlZFxuIik7Ci0KLQlyYyA9IGdwaW9fcmVxdWVzdChkYXRhLT5zZW5zb3JfcmVzZXQsICJzNWs0ZTEiKTsKLQlDREJHKCIgczVrNGUxX3Byb2JlX2luaXRfc2Vuc29yXG4iKTsKLQlpZiAoIXJjKSB7Ci0JCUNEQkcoInNlbnNvcl9yZXNldCA9ICVkXG4iLCByYyk7Ci0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCQltc2xlZXAoNTApOwotCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChkYXRhLT5zZW5zb3JfcmVzZXQsIDEpOwotCQltc2xlZXAoMjApOwotCX0gZWxzZQotCQlnb3RvIGdwaW9fcmVxX2ZhaWw7Ci0KLQltc2xlZXAoMjApOwotCi0JczVrNGUxX2kyY19yZWFkKHJlZ2FkZHJlc3MxLCAmY2hpcGlkMSwgMSk7Ci0JaWYgKGNoaXBpZDEgIT0gMHg0RSkgewotCQlyYyA9IC1FTk9ERVY7Ci0JCUNEQkcoInM1azRlMV9wcm9iZV9pbml0X3NlbnNvciBmYWlsIGNoaXAgaWQgZG9lc25vdCBtYXRjaFxuIik7Ci0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCX0KLQotCXM1azRlMV9pMmNfcmVhZChyZWdhZGRyZXNzMiwgJmNoaXBpZDIgLCAxKTsKLQlpZiAoY2hpcGlkMiAhPSAweDEwKSB7Ci0JCXJjID0gLUVOT0RFVjsKLQkJQ0RCRygiczVrNGUxX3Byb2JlX2luaXRfc2Vuc29yIGZhaWwgY2hpcCBpZCBkb2Vzbm90IG1hdGNoXG4iKTsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCi0JQ0RCRygiSUQ6ICVkXG4iLCBjaGlwaWQxKTsKLQlDREJHKCJJRDogJWRcbiIsIGNoaXBpZDEpOwotCi0JcmV0dXJuIHJjOwotCi1pbml0X3Byb2JlX2ZhaWw6Ci0JQ0RCRygiIHM1azRlMV9wcm9iZV9pbml0X3NlbnNvciBmYWlsc1xuIik7Ci0JZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoZGF0YS0+c2Vuc29yX3Jlc2V0LCAwKTsKLQlzNWs0ZTFfcHJvYmVfaW5pdF9kb25lKGRhdGEpOwotCWlmIChkYXRhLT52Y21fZW5hYmxlKSB7Ci0JCWludCByZXQgPSBncGlvX3JlcXVlc3QoZGF0YS0+dmNtX3B3ZCwgInM1azRlMV9hZiIpOwotCQlpZiAoIXJldCkgewotCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnZjbV9wd2QsIDApOwotCQkJbXNsZWVwKDIwKTsKLQkJCWdwaW9fZnJlZShkYXRhLT52Y21fcHdkKTsKLQkJfQotCX0KLWdwaW9fcmVxX2ZhaWw6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgczVrNGUxX3NlbnNvcl9vcGVuX2luaXQoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlDREJHKCIlczogJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JQ0RCRygiQ2FsbGluZyBzNWs0ZTFfc2Vuc29yX29wZW5faW5pdFxuIik7Ci0KLQlzNWs0ZTFfY3RybCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzNWs0ZTFfY3RybF90KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzNWs0ZTFfY3RybCkgewotCQlDREJHKCJzNWs0ZTFfaW5pdCBmYWlsZWQhXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGluaXRfZG9uZTsKLQl9Ci0JczVrNGUxX2N0cmwtPmZwc19kaXZpZGVyID0gMSAqIDB4MDAwMDA0MDA7Ci0JczVrNGUxX2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQlzNWs0ZTFfY3RybC0+c2V0X3Rlc3QgPSBURVNUX09GRjsKLQlzNWs0ZTFfY3RybC0+cHJldl9yZXMgPSBRVFJfU0laRTsKLQlzNWs0ZTFfY3RybC0+cGljdF9yZXMgPSBGVUxMX1NJWkU7Ci0KLQlpZiAoZGF0YSkKLQkJczVrNGUxX2N0cmwtPnNlbnNvcmRhdGEgPSBkYXRhOwotCi0JcHJldl9mcmFtZV9sZW5ndGhfbGluZXMgPQotCSgoczVrNGUxX3JlZ3MucmVnX3ByZXZbUzVLNEUxX1JFR19QUkVWX0ZSQU1FX0xFTl8xXS53ZGF0YSA8PCA4KSB8Ci0JCXM1azRlMV9yZWdzLnJlZ19wcmV2W1M1SzRFMV9SRUdfUFJFVl9GUkFNRV9MRU5fMl0ud2RhdGEpOwotCi0JcHJldl9saW5lX2xlbmd0aF9wY2sgPQotCShzNWs0ZTFfcmVncy5yZWdfcHJldltTNUs0RTFfUkVHX1BSRVZfTElORV9MRU5fMV0ud2RhdGEgPDwgOCkgfAotCQlzNWs0ZTFfcmVncy5yZWdfcHJldltTNUs0RTFfUkVHX1BSRVZfTElORV9MRU5fMl0ud2RhdGE7Ci0KLQlzbmFwX2ZyYW1lX2xlbmd0aF9saW5lcyA9Ci0JKHM1azRlMV9yZWdzLnJlZ19zbmFwW1M1SzRFMV9SRUdfU05BUF9GUkFNRV9MRU5fMV0ud2RhdGEgPDwgOCkgfAotCQlzNWs0ZTFfcmVncy5yZWdfc25hcFtTNUs0RTFfUkVHX1NOQVBfRlJBTUVfTEVOXzJdLndkYXRhOwotCi0Jc25hcF9saW5lX2xlbmd0aF9wY2sgPQotCShzNWs0ZTFfcmVncy5yZWdfc25hcFtTNUs0RTFfUkVHX1NOQVBfTElORV9MRU5fMV0ud2RhdGEgPDwgOCkgfAotCQlzNWs0ZTFfcmVncy5yZWdfc25hcFtTNUs0RTFfUkVHX1NOQVBfTElORV9MRU5fMV0ud2RhdGE7Ci0KLQkvKiBlbmFibGUgbWNsayBmaXJzdCAqLwotCW1zbV9jYW1pb19jbGtfcmF0ZV9zZXQoUzVLNEUxX01BU1RFUl9DTEtfUkFURSk7Ci0JcmMgPSBzNWs0ZTFfcHJvYmVfaW5pdF9zZW5zb3IoZGF0YSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X2ZhaWw7Ci0KLQlDREJHKCJpbml0IHNldHRpbmdzXG4iKTsKLQlpZiAoczVrNGUxX2N0cmwtPnByZXZfcmVzID09IFFUUl9TSVpFKQotCQlyYyA9IHM1azRlMV9zZW5zb3Jfc2V0dGluZyhSRUdfSU5JVCwgUkVTX1BSRVZJRVcpOwotCWVsc2UKLQkJcmMgPSBzNWs0ZTFfc2Vuc29yX3NldHRpbmcoUkVHX0lOSVQsIFJFU19DQVBUVVJFKTsKLQlzNWs0ZTFfY3RybC0+ZnBzID0gMzAgKiBRODsKLQotCS8qIGVuYWJsZSBBRiBhY3R1YXRvciAqLwotCWlmIChzNWs0ZTFfY3RybC0+c2Vuc29yZGF0YS0+dmNtX2VuYWJsZSkgewotCQlDREJHKCJlbmFibGUgQUYgYWN0dWF0b3IsIGdwaW8gPSAlZFxuIiwKLQkJCSBzNWs0ZTFfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCk7Ci0JCXJjID0gZ3Bpb19yZXF1ZXN0KHM1azRlMV9jdHJsLT5zZW5zb3JkYXRhLT52Y21fcHdkLAotCQkJCQkJInM1azRlMV9hZiIpOwotCQlpZiAoIXJjKQotCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KAotCQkJCXM1azRlMV9jdHJsLT5zZW5zb3JkYXRhLT52Y21fcHdkLAotCQkJCSAxKTsKLQkJZWxzZSB7Ci0JCQlwcl9lcnIoInM1azRlMV9jdHJsIGdwaW8gcmVxdWVzdCBmYWlsZWQhXG4iKTsKLQkJCWdvdG8gaW5pdF9mYWlsOwotCQl9Ci0JCW1zbGVlcCgyMCk7Ci0JCXJjID0gczVrNGUxX3NldF9kZWZhdWx0X2ZvY3VzKDApOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoczVrNGUxX2N0cmwtPnNlbnNvcmRhdGEtPnZjbV9wd2QsCi0JCQkJCQkJCTApOwotCQkJZ3Bpb19mcmVlKHM1azRlMV9jdHJsLT5zZW5zb3JkYXRhLT52Y21fcHdkKTsKLQkJfQotCX0KLQlpZiAocmMgPCAwKQotCQlnb3RvIGluaXRfZmFpbDsKLQllbHNlCi0JCWdvdG8gaW5pdF9kb25lOwotaW5pdF9mYWlsOgotCUNEQkcoImluaXRfZmFpbFxuIik7Ci0JczVrNGUxX3Byb2JlX2luaXRfZG9uZShkYXRhKTsKLWluaXRfZG9uZToKLQlDREJHKCJpbml0X2RvbmVcbiIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzNWs0ZTFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQkvKiBJbml0aWFsaXplIHRoZSBNU01fQ0FNSTJDIENoaXAgKi8KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzNWs0ZTFfd2FpdF9xdWV1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgczVrNGUxX2FmX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JLyogSW5pdGlhbGl6ZSB0aGUgTVNNX0NBTUkyQyBDaGlwICovCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmczVrNGUxX2FmX3dhaXRfcXVldWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgczVrNGUxX2FmX2kyY19pZFtdID0gewotCXsiczVrNGUxX2FmIiwgMH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgaW50IHM1azRlMV9hZl9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCWludCByYyA9IDA7Ci0JQ0RCRygiczVrNGUxX2FmX3Byb2JlIGNhbGxlZCFcbiIpOwotCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKLQkJQ0RCRygiaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkgZmFpbGVkXG4iKTsKLQkJZ290byBwcm9iZV9mYWlsdXJlOwotCX0KLQotCXM1azRlMV9hZl9zZW5zb3J3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHM1azRlMV93b3JrX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXM1azRlMV9hZl9zZW5zb3J3KSB7Ci0JCUNEQkcoImt6YWxsb2MgZmFpbGVkLlxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBwcm9iZV9mYWlsdXJlOwotCX0KLQotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHM1azRlMV9hZl9zZW5zb3J3KTsKLQlzNWs0ZTFfYWZfaW5pdF9jbGllbnQoY2xpZW50KTsKLQlzNWs0ZTFfYWZfY2xpZW50ID0gY2xpZW50OwotCi0JbXNsZWVwKDUwKTsKLQotCUNEQkcoInM1azRlMV9hZl9wcm9iZSBzdWNjZXNzZWQhIHJjID0gJWRcbiIsIHJjKTsKLQlyZXR1cm4gMDsKLQotcHJvYmVfZmFpbHVyZToKLQlDREJHKCJzNWs0ZTFfYWZfcHJvYmUgZmFpbGVkISByYyA9ICVkXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgczVrNGUxX2kyY19pZFtdID0gewotCXsiczVrNGUxIiwgMH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgaW50IHM1azRlMV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCWludCByYyA9IDA7Ci0JQ0RCRygiczVrNGUxX3Byb2JlIGNhbGxlZCFcbiIpOwotCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKLQkJQ0RCRygiaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkgZmFpbGVkXG4iKTsKLQkJZ290byBwcm9iZV9mYWlsdXJlOwotCX0KLQotCXM1azRlMV9zZW5zb3J3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHM1azRlMV93b3JrX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXM1azRlMV9zZW5zb3J3KSB7Ci0JCUNEQkcoImt6YWxsb2MgZmFpbGVkLlxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBwcm9iZV9mYWlsdXJlOwotCX0KLQotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHM1azRlMV9zZW5zb3J3KTsKLQlzNWs0ZTFfaW5pdF9jbGllbnQoY2xpZW50KTsKLQlzNWs0ZTFfY2xpZW50ID0gY2xpZW50OwotCi0JbXNsZWVwKDUwKTsKLQotCUNEQkcoInM1azRlMV9wcm9iZSBzdWNjZXNzZWQhIHJjID0gJWRcbiIsIHJjKTsKLQlyZXR1cm4gMDsKLQotcHJvYmVfZmFpbHVyZToKLQlDREJHKCJzNWs0ZTFfcHJvYmUgZmFpbGVkISByYyA9ICVkXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBzNWs0ZTFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IHM1azRlMV93b3JrX3QgKnNlbnNvcncgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlmcmVlX2lycShjbGllbnQtPmlycSwgc2Vuc29ydyk7Ci0JczVrNGUxX2NsaWVudCA9IE5VTEw7Ci0Ja2ZyZWUoc2Vuc29ydyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IHM1azRlMV9hZl9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgczVrNGUxX3dvcmtfdCAqczVrNGUxX2FmID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JZnJlZV9pcnEoY2xpZW50LT5pcnEsIHM1azRlMV9hZik7Ci0JczVrNGUxX2FmX2NsaWVudCA9IE5VTEw7Ci0Ja2ZyZWUoczVrNGUxX2FmKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHM1azRlMV9pMmNfZHJpdmVyID0gewotCS5pZF90YWJsZSA9IHM1azRlMV9pMmNfaWQsCi0JLnByb2JlICA9IHM1azRlMV9pMmNfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZXhpdF9wKHM1azRlMV9pMmNfcmVtb3ZlKSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJzNWs0ZTEiLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgczVrNGUxX2FmX2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gczVrNGUxX2FmX2kyY19pZCwKLQkucHJvYmUgID0gczVrNGUxX2FmX2kyY19wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3AoczVrNGUxX2FmX2kyY19yZW1vdmUpLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInM1azRlMV9hZiIsCi0JfSwKLX07Ci0KLWludCBzNWs0ZTFfc2Vuc29yX2NvbmZpZyh2b2lkIF9fdXNlciAqYXJncCkKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhIGNkYXRhOwotCWxvbmcgICByYyA9IDA7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZjZGF0YSwKLQkJCQkodm9pZCAqKWFyZ3AsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JbXV0ZXhfbG9jaygmczVrNGUxX211dCk7Ci0JQ0RCRygiczVrNGUxX3NlbnNvcl9jb25maWc6IGNmZ3R5cGUgPSAlZFxuIiwKLQkJCWNkYXRhLmNmZ3R5cGUpOwotCXN3aXRjaCAoY2RhdGEuY2ZndHlwZSkgewotCWNhc2UgQ0ZHX0dFVF9QSUNUX0ZQUzoKLQkJczVrNGUxX2dldF9waWN0X2ZwcygKLQkJCWNkYXRhLmNmZy5nZnBzLnByZXZmcHMsCi0JCQkmKGNkYXRhLmNmZy5nZnBzLnBpY3RmcHMpKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCSZjZGF0YSwKLQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX0dFVF9QUkVWX0xfUEY6Ci0JCWNkYXRhLmNmZy5wcmV2bF9wZiA9Ci0JCQlzNWs0ZTFfZ2V0X3ByZXZfbGluZXNfcGYoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfR0VUX1BSRVZfUF9QTDoKLQkJY2RhdGEuY2ZnLnByZXZwX3BsID0KLQkJCXM1azRlMV9nZXRfcHJldl9waXhlbHNfcGwoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfR0VUX1BJQ1RfTF9QRjoKLQkJY2RhdGEuY2ZnLnBpY3RsX3BmID0KLQkJCXM1azRlMV9nZXRfcGljdF9saW5lc19wZigpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSZjZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQljYXNlIENGR19HRVRfUElDVF9QX1BMOgotCQljZGF0YS5jZmcucGljdHBfcGwgPQotCQkJczVrNGUxX2dldF9waWN0X3BpeGVsc19wbCgpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfR0VUX1BJQ1RfTUFYX0VYUF9MQzoKLQkJY2RhdGEuY2ZnLnBpY3RfbWF4X2V4cF9sYyA9Ci0JCQlzNWs0ZTFfZ2V0X3BpY3RfbWF4X2V4cF9sYygpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSZjZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQljYXNlIENGR19TRVRfRlBTOgotCWNhc2UgQ0ZHX1NFVF9QSUNUX0ZQUzoKLQkJcmMgPSBzNWs0ZTFfc2V0X2ZwcygmKGNkYXRhLmNmZy5mcHMpKTsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX0VYUF9HQUlOOgotCQlyYyA9IHM1azRlMV93cml0ZV9leHBfZ2FpbihjZGF0YS5jZmcuZXhwX2dhaW4uZ2FpbiwKLQkJCQljZGF0YS5jZmcuZXhwX2dhaW4ubGluZSk7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9QSUNUX0VYUF9HQUlOOgotCQlyYyA9IHM1azRlMV9zZXRfcGljdF9leHBfZ2FpbihjZGF0YS5jZmcuZXhwX2dhaW4uZ2FpbiwKLQkJCQljZGF0YS5jZmcuZXhwX2dhaW4ubGluZSk7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX1NFVF9NT0RFOgotCQlyYyA9IHM1azRlMV9zZXRfc2Vuc29yX21vZGUoY2RhdGEubW9kZSwgY2RhdGEucnMpOwotCQlicmVhazsKLQljYXNlIENGR19QV1JfRE9XTjoKLQkJcmMgPSBzNWs0ZTFfcG93ZXJfZG93bigpOwotCQlicmVhazsKLQljYXNlIENGR19NT1ZFX0ZPQ1VTOgotCQlyYyA9IHM1azRlMV9tb3ZlX2ZvY3VzKGNkYXRhLmNmZy5mb2N1cy5kaXIsCi0JCQkJY2RhdGEuY2ZnLmZvY3VzLnN0ZXBzKTsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX0RFRkFVTFRfRk9DVVM6Ci0JCXJjID0gczVrNGUxX3NldF9kZWZhdWx0X2ZvY3VzKGNkYXRhLmNmZy5mb2N1cy5zdGVwcyk7Ci0JCWJyZWFrOwotCWNhc2UgQ0ZHX0dFVF9BRl9NQVhfU1RFUFM6Ci0JCWNkYXRhLm1heF9zdGVwcyA9IFM1SzRFMV9UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUjsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJCSZjZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQljYXNlIENGR19TRVRfRUZGRUNUOgotCQlyYyA9IHM1azRlMV9zZXRfZGVmYXVsdF9mb2N1cyhjZGF0YS5jZmcuZWZmZWN0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZzNWs0ZTFfbXV0KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzNWs0ZTFfc2Vuc29yX3JlbGVhc2Uodm9pZCkKLXsKLQlpbnQgcmMgPSAtRUJBREY7Ci0KLQltdXRleF9sb2NrKCZzNWs0ZTFfbXV0KTsKLQlzNWs0ZTFfcG93ZXJfZG93bigpOwotCW1zbGVlcCgyMCk7Ci0JZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoczVrNGUxX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JdXNsZWVwX3JhbmdlKDUwMDAsIDUxMDApOwotCWdwaW9fZnJlZShzNWs0ZTFfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3Jlc2V0KTsKLQlpZiAoczVrNGUxX2N0cmwtPnNlbnNvcmRhdGEtPnZjbV9lbmFibGUpIHsKLQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoczVrNGUxX2N0cmwtPnNlbnNvcmRhdGEtPnZjbV9wd2QsIDApOwotCQlncGlvX2ZyZWUoczVrNGUxX2N0cmwtPnNlbnNvcmRhdGEtPnZjbV9wd2QpOwotCX0KLQlrZnJlZShzNWs0ZTFfY3RybCk7Ci0JczVrNGUxX2N0cmwgPSBOVUxMOwotCUNEQkcoInM1azRlMV9yZWxlYXNlIGNvbXBsZXRlZFxuIik7Ci0JbXV0ZXhfdW5sb2NrKCZzNWs0ZTFfbXV0KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzNWs0ZTFfc2Vuc29yX3Byb2JlKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICppbmZvLAotCQlzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsICpzKQotewotCWludCByYyA9IDA7Ci0KLQlyYyA9IGkyY19hZGRfZHJpdmVyKCZzNWs0ZTFfaTJjX2RyaXZlcik7Ci0JaWYgKHJjIDwgMCB8fCBzNWs0ZTFfY2xpZW50ID09IE5VTEwpIHsKLQkJcmMgPSAtRU5PVFNVUFA7Ci0JCUNEQkcoIkkyQyBhZGQgZHJpdmVyIGZhaWxlZCIpOwotCQlnb3RvIHByb2JlX2ZhaWxfMTsKLQl9Ci0KLQlyYyA9IGkyY19hZGRfZHJpdmVyKCZzNWs0ZTFfYWZfaTJjX2RyaXZlcik7Ci0JaWYgKHJjIDwgMCB8fCBzNWs0ZTFfYWZfY2xpZW50ID09IE5VTEwpIHsKLQkJcmMgPSAtRU5PVFNVUFA7Ci0JCUNEQkcoIkkyQyBhZGQgZHJpdmVyIGZhaWxlZCIpOwotCQlnb3RvIHByb2JlX2ZhaWxfMjsKLQl9Ci0KLQltc21fY2FtaW9fY2xrX3JhdGVfc2V0KFM1SzRFMV9NQVNURVJfQ0xLX1JBVEUpOwotCi0JcmMgPSBzNWs0ZTFfcHJvYmVfaW5pdF9zZW5zb3IoaW5mbyk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBwcm9iZV9mYWlsXzM7Ci0KLQlzLT5zX2luaXQgPSBzNWs0ZTFfc2Vuc29yX29wZW5faW5pdDsKLQlzLT5zX3JlbGVhc2UgPSBzNWs0ZTFfc2Vuc29yX3JlbGVhc2U7Ci0Jcy0+c19jb25maWcgID0gczVrNGUxX3NlbnNvcl9jb25maWc7Ci0Jcy0+c19tb3VudF9hbmdsZSA9IGluZm8tPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5tb3VudF9hbmdsZTsKLQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChpbmZvLT5zZW5zb3JfcmVzZXQsIDApOwotCXM1azRlMV9wcm9iZV9pbml0X2RvbmUoaW5mbyk7Ci0JLyogS2VlcCB2Y21fcHdkIHRvIE9VVCBMb3cgKi8KLQlpZiAoaW5mby0+dmNtX2VuYWJsZSkgewotCQlyYyA9IGdwaW9fcmVxdWVzdChpbmZvLT52Y21fcHdkLCAiczVrNGUxX2FmIik7Ci0JCWlmICghcmMpIHsKLQkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChpbmZvLT52Y21fcHdkLCAwKTsKLQkJCW1zbGVlcCgyMCk7Ci0JCQlncGlvX2ZyZWUoaW5mby0+dmNtX3B3ZCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHJjOwotCX0KLQlyZXR1cm4gcmM7Ci0KLXByb2JlX2ZhaWxfMzoKLQlpMmNfZGVsX2RyaXZlcigmczVrNGUxX2FmX2kyY19kcml2ZXIpOwotcHJvYmVfZmFpbF8yOgotCWkyY19kZWxfZHJpdmVyKCZzNWs0ZTFfaTJjX2RyaXZlcik7Ci1wcm9iZV9mYWlsXzE6Ci0JQ0RCRygiczVrNGUxX3NlbnNvcl9wcm9iZTogU0VOU09SIFBST0JFIEZBSUxTIVxuIik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzNWs0ZTFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gbXNtX2NhbWVyYV9kcnZfc3RhcnQocGRldiwgczVrNGUxX3NlbnNvcl9wcm9iZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9jYW1lcmFfZHJpdmVyID0gewotCS5wcm9iZSA9IHM1azRlMV9wcm9iZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc21fY2FtZXJhX3M1azRlMSIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzNWs0ZTFfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9jYW1lcmFfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoczVrNGUxX2luaXQpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIDUgTVAgQmF5ZXIgc2Vuc29yIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3M1azRlMS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3M1azRlMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNThiM2YwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zNWs0ZTEuaAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIFM1SzRFMV9ICi0jZGVmaW5lIFM1SzRFMV9ICi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci1leHRlcm4gc3RydWN0IHM1azRlMV9yZWcgczVrNGUxX3JlZ3M7Ci0KLXN0cnVjdCBzNWs0ZTFfaTJjX3JlZ19jb25mIHsKLQl1bnNpZ25lZCBzaG9ydCB3YWRkcjsKLQl1bnNpZ25lZCBzaG9ydCB3ZGF0YTsKLX07Ci0KLWVudW0gczVrNGUxX3Rlc3RfbW9kZV90IHsKLQlURVNUX09GRiwKLQlURVNUXzEsCi0JVEVTVF8yLAotCVRFU1RfMwotfTsKLQotZW51bSBzNWs0ZTFfcmVzb2x1dGlvbl90IHsKLQlRVFJfU0laRSwKLQlGVUxMX1NJWkUsCi0JSU5WQUxJRF9TSVpFCi19OwotZW51bSBzNWs0ZTFfc2V0dGluZyB7Ci0JUkVTX1BSRVZJRVcsCi0JUkVTX0NBUFRVUkUKLX07Ci1lbnVtIHM1azRlMV9yZWdfdXBkYXRlIHsKLQkvKiBTZW5zb3IgZWdpc3RlcnMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uICovCi0JUkVHX0lOSVQsCi0JLyogU2Vuc29yIGVnaXN0ZXJzIHRoYXQgbmVlZHMgcGVyaW9kaWMgSTJDIHdyaXRlcyAqLwotCVVQREFURV9QRVJJT0RJQywKLQkvKiBBbGwgdGhlIHNlbnNvciBSZWdpc3RlcnMgd2lsbCBiZSB1cGRhdGVkICovCi0JVVBEQVRFX0FMTCwKLQkvKiBOb3QgdmFsaWQgdXBkYXRlICovCi0JVVBEQVRFX0lOVkFMSUQKLX07Ci0KLWVudW0gczVrNGUxX3JlZ19wbGwgewotCUUwMTNfVlRfUElYX0NMS19ESVYsCi0JRTAxM19WVF9TWVNfQ0xLX0RJViwKLQlFMDEzX1BSRV9QTExfQ0xLX0RJViwKLQlFMDEzX1BMTF9NVUxUSVBMSUVSLAotCUUwMTNfT1BfUElYX0NMS19ESVYsCi0JRTAxM19PUF9TWVNfQ0xLX0RJVgotfTsKLQotZW51bSBzNWs0ZTFfcmVnX21vZGUgewotCUUwMTNfWF9BRERSX1NUQVJULAotCUUwMTNfWF9BRERSX0VORCwKLQlFMDEzX1lfQUREUl9TVEFSVCwKLQlFMDEzX1lfQUREUl9FTkQsCi0JRTAxM19YX09VVFBVVF9TSVpFLAotCUUwMTNfWV9PVVRQVVRfU0laRSwKLQlFMDEzX0RBVEFQQVRIX1NFTEVDVCwKLQlFMDEzX1JFQURfTU9ERSwKLQlFMDEzX0FOQUxPR19DT05UUk9MNSwKLQlFMDEzX0RBQ19MRF80XzUsCi0JRTAxM19TQ0FMSU5HX01PREUsCi0JRTAxM19TQ0FMRV9NLAotCUUwMTNfTElORV9MRU5HVEhfUENLLAotCUUwMTNfRlJBTUVfTEVOR1RIX0xJTkVTLAotCUUwMTNfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUUsCi0JRTAxM19GSU5FX0lOVEVHUkFUSU9OX1RJTUUsCi0JRTAxM19GSU5FX0NPUlJFQ1RJT04KLX07Ci0KLXN0cnVjdCBzNWs0ZTFfcmVnIHsKLQljb25zdCBzdHJ1Y3QgczVrNGUxX2kyY19yZWdfY29uZiAqcmVnX21pcGk7Ci0JY29uc3QgdW5zaWduZWQgc2hvcnQgcmVnX21pcGlfc2l6ZTsKLQljb25zdCBzdHJ1Y3QgczVrNGUxX2kyY19yZWdfY29uZiAqcmVjX3NldHRpbmdzOwotCWNvbnN0IHVuc2lnbmVkIHNob3J0IHJlY19zaXplOwotCWNvbnN0IHN0cnVjdCBzNWs0ZTFfaTJjX3JlZ19jb25mICpyZWdfcGxsX3A7Ci0JY29uc3QgdW5zaWduZWQgc2hvcnQgcmVnX3BsbF9wX3NpemU7Ci0JY29uc3Qgc3RydWN0IHM1azRlMV9pMmNfcmVnX2NvbmYgKnJlZ19wbGxfczsKLQljb25zdCB1bnNpZ25lZCBzaG9ydCByZWdfcGxsX3Nfc2l6ZTsKLQljb25zdCBzdHJ1Y3QgczVrNGUxX2kyY19yZWdfY29uZiAqcmVnX3ByZXY7Ci0JY29uc3QgdW5zaWduZWQgc2hvcnQgcmVnX3ByZXZfc2l6ZTsKLQljb25zdCBzdHJ1Y3QgczVrNGUxX2kyY19yZWdfY29uZiAqcmVnX3NuYXA7Ci0JY29uc3QgdW5zaWduZWQgc2hvcnQgcmVnX3NuYXBfc2l6ZTsKLX07Ci0jZW5kaWYgLyogUzVLNEUxX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zNWs0ZTFfcmVnLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvczVrNGUxX3JlZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzllZjE3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zNWs0ZTFfcmVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLQotI2luY2x1ZGUgInM1azRlMS5oIgotCi1zdHJ1Y3QgczVrNGUxX2kyY19yZWdfY29uZiBzNWs0ZTFfbWlwaV9zZXR0aW5nc1tdID0gewotCXsweDMwQkQsIDB4MDB9LC8qIFNFTF9DQ1BbMF0gKi8KLQl7MHgzMDg0LCAweDE1fSwvKiBTWU5DIE1vZGUgKi8KLQl7MHgzMEJFLCAweDFBfSwvKiBNX1BDTEtESVZfQVVUT1s0XSwgTV9ESVZfUENMS1szOjBdICovCi0JezB4MzBDMSwgMHgwMX0sLyogcGFjayB2aWRlbyBlbmFibGUgWzBdICovCi0JezB4MzBFRSwgMHgwMn0sLyogRFBIWSBlbmFibGUgWyAxXSAqLwotCXsweDMxMTEsIDB4ODZ9LC8qIEVtYmVkZGVkIGRhdGEgb2ZmIFs1XSAqLwotfTsKLQotLyogUExMIENvbmZpZ3VyYXRpb24gKi8KLXN0cnVjdCBzNWs0ZTFfaTJjX3JlZ19jb25mIHM1azRlMV9wbGxfcHJldmlld19zZXR0aW5nc1tdID0gewotCXsweDAzMDUsIDB4MDR9LAotCXsweDAzMDYsIDB4MDB9LAotCXsweDAzMDcsIDB4NDR9LAotCXsweDMwQjUsIDB4MDB9LAotCXsweDMwRTIsIDB4MDF9LC8qIG51bSBsYW5lc1sxOjBdID0gMiAqLwotCXsweDMwRjEsIDB4QjB9LAotfTsKLQotc3RydWN0IHM1azRlMV9pMmNfcmVnX2NvbmYgczVrNGUxX3BsbF9zbmFwX3NldHRpbmdzW10gPSB7Ci0JezB4MDMwNSwgMHgwNH0sCi0JezB4MDMwNiwgMHgwMH0sCi0JezB4MDMwNywgMHg0NH0sCi0JezB4MzBCNSwgMHgwMH0sCi0JezB4MzBFMiwgMHgwMX0sLyogbnVtIGxhbmVzWzE6MF0gPSAyICovCi0JezB4MzBGMSwgMHhCMH0sCi19OwotCi1zdHJ1Y3QgczVrNGUxX2kyY19yZWdfY29uZiBzNWs0ZTFfcHJldl9zZXR0aW5nc1tdID0gewotCS8qIG91dHB1dCBzaXplICgxMzA0IHggOTgwKSAqLwotCXsweDMwQTksIDB4MDJ9LC8qIEhvcml6b250YWwgQmlubmluZyBPbiAqLwotCXsweDMwMEUsIDB4RUJ9LC8qIFZlcnRpY2FsIEJpbm5pbmcgT24gKi8KLQl7MHgwMzg3LCAweDAzfSwvKiB5X29kZF9pbmMgMDMoMTBiIEFWRykgKi8KLQl7MHgwMzQ0LCAweDAwfSwvKiB4X2FkZHJfc3RhcnQgMCAqLwotCXsweDAzNDUsIDB4MDB9LAotCXsweDAzNDgsIDB4MEF9LC8qIHhfYWRkcl9lbmQgMjYwNyAqLwotCXsweDAzNDksIDB4MkZ9LAotCXsweDAzNDYsIDB4MDB9LC8qIHlfYWRkcl9zdGFydCAwICovCi0JezB4MDM0NywgMHgwMH0sCi0JezB4MDM0QSwgMHgwN30sLyogeV9hZGRyX2VuZCAxOTU5ICovCi0JezB4MDM0QiwgMHhBN30sCi0JezB4MDM4MCwgMHgwMH0sLyogeF9ldmVuX2luYyAxICovCi0JezB4MDM4MSwgMHgwMX0sCi0JezB4MDM4MiwgMHgwMH0sLyogeF9vZGRfaW5jIDEgKi8KLQl7MHgwMzgzLCAweDAxfSwKLQl7MHgwMzg0LCAweDAwfSwvKiB5X2V2ZW5faW5jIDEgKi8KLQl7MHgwMzg1LCAweDAxfSwKLQl7MHgwMzg2LCAweDAwfSwvKiB5X29kZF9pbmMgMyAqLwotCXsweDAzODcsIDB4MDN9LAotCXsweDAzNEMsIDB4MDV9LC8qIHhfb3V0cHV0X3NpemUgMTMwNCAqLwotCXsweDAzNEQsIDB4MTh9LAotCXsweDAzNEUsIDB4MDN9LC8qIHlfb3V0cHV0X3NpemUgOTgwICovCi0JezB4MDM0RiwgMHhkNH0sCi0JezB4MzBCRiwgMHhBQn0sLyogb3V0aWZfZW5hYmxlWzddLCBkYXRhX3R5cGVbNTowXSgyQmggPSBiYXllciAxMGJpdH0gKi8KLQl7MHgzMEMwLCAweEEwfSwvKiB2aWRlb19vZmZzZXRbNzo0XSAzMjYwJTEyICovCi0JezB4MzBDOCwgMHgwNn0sLyogdmlkZW9fZGF0YV9sZW5ndGggMTYwMCA9IDEzMDQgKiAxLjI1ICovCi0JezB4MzBDOSwgMHg1RX0sCi0JLyogVGltaW5nIENvbmZpZ3VyYXRpb24gKi8KLQl7MHgwMjAyLCAweDAzfSwKLQl7MHgwMjAzLCAweDE0fSwKLQl7MHgwMjA0LCAweDAwfSwKLQl7MHgwMjA1LCAweDgwfSwKLQl7MHgwMzQwLCAweDAzfSwvKiBGcmFtZSBMZW5ndGggKi8KLQl7MHgwMzQxLCAweEUwfSwKLQl7MHgwMzQyLCAweDBBfSwvKiAyNzM4ICBMaW5lIExlbmd0aCAqLwotCXsweDAzNDMsIDB4QjJ9LAotfTsKLQotc3RydWN0IHM1azRlMV9pMmNfcmVnX2NvbmYgczVrNGUxX3NuYXBfc2V0dGluZ3NbXSA9IHsKLQkvKk91dHB1dCBTaXplICgyNjA4eDE5NjApKi8KLQl7MHgzMEE5LCAweDAzfSwvKiBIb3Jpem9udGFsIEJpbm5pbmcgT2ZmICovCi0JezB4MzAwRSwgMHhFOH0sLyogVmVydGljYWwgQmlubmluZyBPZmYgKi8KLQl7MHgwMzg3LCAweDAxfSwvKiB5X29kZF9pbmMgKi8KLQl7MHgwMzRDLCAweDBBfSwvKiB4X291dHB1dCBzaXplICovCi0JezB4MDM0RCwgMHgzMH0sCi0JezB4MDM0RSwgMHgwN30sLyogeV9vdXRwdXQgc2l6ZSAqLwotCXsweDAzNEYsIDB4QTh9LAotCXsweDMwQkYsIDB4QUJ9LC8qIG91dGlmX2VuYWJsZVs3XSwgZGF0YV90eXBlWzU6MF0oMkJoID0gYmF5ZXIgMTBiaXR9ICovCi0JezB4MzBDMCwgMHg4MH0sLyogdmlkZW9fb2Zmc2V0Wzc6NF0gMzI2MCUxMiAqLwotCXsweDMwQzgsIDB4MEN9LC8qIHZpZGVvX2RhdGFfbGVuZ3RoIDMyNjAgPSAyNjA4ICogMS4yNSAqLwotCXsweDMwQzksIDB4QkN9LAotCS8qVGltaW5nIGNvbmZpZ3VyYXRpb24qLwotCXsweDAyMDIsIDB4MDZ9LAotCXsweDAyMDMsIDB4Mjh9LAotCXsweDAyMDQsIDB4MDB9LAotCXsweDAyMDUsIDB4ODB9LAotCXsweDAzNDAsIDB4MDd9LC8qIEZyYW1lIExlbmd0aCAqLwotCXsweDAzNDEsIDB4QjR9LAotCXsweDAzNDIsIDB4MEF9LC8qIDI3MzggTGluZSBMZW5ndGggKi8KLQl7MHgwMzQzLCAweEIyfSwKLX07Ci0KLXN0cnVjdCBzNWs0ZTFfaTJjX3JlZ19jb25mIHM1azRlMV9yZWNvbW1lbmRfc2V0dGluZ3NbXSA9IHsKLQkvKkNEUyB0aW1pbmcgc2V0dGluZyAuLi4gKi8KLQl7MHgzMDAwLCAweDA1fSwKLQl7MHgzMDAxLCAweDAzfSwKLQl7MHgzMDAyLCAweDA4fSwKLQl7MHgzMDAzLCAweDBBfSwKLQl7MHgzMDA0LCAweDUwfSwKLQl7MHgzMDA1LCAweDBFfSwKLQl7MHgzMDA2LCAweDVFfSwKLQl7MHgzMDA3LCAweDAwfSwKLQl7MHgzMDA4LCAweDc4fSwKLQl7MHgzMDA5LCAweDc4fSwKLQl7MHgzMDBBLCAweDUwfSwKLQl7MHgzMDBCLCAweDA4fSwKLQl7MHgzMDBDLCAweDE0fSwKLQl7MHgzMDBELCAweDAwfSwKLQl7MHgzMDBFLCAweEU4fSwKLQl7MHgzMDBGLCAweDgyfSwKLQl7MHgzMDFCLCAweDc3fSwKLQotCS8qIENEUyBvcHRpb24gc2V0dGluZyAuLi4gKi8KLQl7MHgzMDEwLCAweDAwfSwKLQl7MHgzMDExLCAweDNBfSwKLQl7MHgzMDI5LCAweDA0fSwKLQl7MHgzMDEyLCAweDMwfSwKLQl7MHgzMDEzLCAweEEwfSwKLQl7MHgzMDE0LCAweDAwfSwKLQl7MHgzMDE1LCAweDAwfSwKLQl7MHgzMDE2LCAweDMwfSwKLQl7MHgzMDE3LCAweDk0fSwKLQl7MHgzMDE4LCAweDcwfSwKLQl7MHgzMDFELCAweEQ0fSwKLQl7MHgzMDIxLCAweDAyfSwKLQl7MHgzMDIyLCAweDI0fSwKLQl7MHgzMDI0LCAweDQwfSwKLQl7MHgzMDI3LCAweDA4fSwKLQotCS8qIFBpeGVsIG9wdGlvbiBzZXR0aW5nIC4uLiAgICovCi0JezB4MzAxQywgMHgwNH0sCi0JezB4MzBEOCwgMHgzRn0sCi0JezB4MzAyQiwgMHgwMX0sCi0KLQl7MHgzMDcwLCAweDVGfSwKLQl7MHgzMDcxLCAweDAwfSwKLQl7MHgzMDgwLCAweDA0fSwKLQl7MHgzMDgxLCAweDM4fSwKLX07Ci0KLXN0cnVjdCBzNWs0ZTFfcmVnIHM1azRlMV9yZWdzID0gewotCS5yZWdfbWlwaSA9ICZzNWs0ZTFfbWlwaV9zZXR0aW5nc1swXSwKLQkucmVnX21pcGlfc2l6ZSA9IEFSUkFZX1NJWkUoczVrNGUxX21pcGlfc2V0dGluZ3MpLAotCS5yZWNfc2V0dGluZ3MgPSAmczVrNGUxX3JlY29tbWVuZF9zZXR0aW5nc1swXSwKLQkucmVjX3NpemUgPSBBUlJBWV9TSVpFKHM1azRlMV9yZWNvbW1lbmRfc2V0dGluZ3MpLAotCS5yZWdfcGxsX3AgPSAmczVrNGUxX3BsbF9wcmV2aWV3X3NldHRpbmdzWzBdLAotCS5yZWdfcGxsX3Bfc2l6ZSA9IEFSUkFZX1NJWkUoczVrNGUxX3BsbF9wcmV2aWV3X3NldHRpbmdzKSwKLQkucmVnX3BsbF9zID0gJnM1azRlMV9wbGxfc25hcF9zZXR0aW5nc1swXSwKLQkucmVnX3BsbF9zX3NpemUgPSBBUlJBWV9TSVpFKHM1azRlMV9wbGxfc25hcF9zZXR0aW5ncyksCi0JLnJlZ19wcmV2ID0gJnM1azRlMV9wcmV2X3NldHRpbmdzWzBdLAotCS5yZWdfcHJldl9zaXplID0gQVJSQVlfU0laRShzNWs0ZTFfcHJldl9zZXR0aW5ncyksCi0JLnJlZ19zbmFwID0gJnM1azRlMV9zbmFwX3NldHRpbmdzWzBdLAotCS5yZWdfc25hcF9zaXplID0gQVJSQVlfU0laRShzNWs0ZTFfc25hcF9zZXR0aW5ncyksCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc0ZTliYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLUdDQ19WRVJTSU9OICAgICAgOj0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChQV0QpL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2ggJChDUk9TU19DT01QSUxFKWdjYykKLUVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MQotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvZWVwcm9tCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvY3NpCi1vYmotJChDT05GSUdfTVNNX0NBTUVSQV9TRU5TT1IpICs9IG1zbV9zZW5zb3JfY29tbW9uLm8gbXNtX3NlbnNvci5vIG1zbV9zZW5zb3JfYmF5ZXIubyBtc21fc2Vuc29yX2luaXQubwotb2JqLSQoQ09ORklHX09WNTY0NykgKz0gb3Y1NjQ3X3Y0bDIubwotb2JqLSQoQ09ORklHX09WODgyNSkgKz0gb3Y4ODI1X3Y0bDIubwotb2JqLSQoQ09ORklHX0lNWDA3NCkgKz0gaW14MDc0X3Y0bDIubwotb2JqLSQoQ09ORklHX1M1SzNMMVlYKSArPSBzNWszbDF5eC5vCi1vYmotJChDT05GSUdfSU1YMTM1KSArPSBpbXgxMzVfdjRsMi5vCi1vYmotJChDT05GSUdfT1YyNzIwKSArPSBvdjI3MjAubwotb2JqLSQoQ09ORklHX01UOU0xMTQpICs9IG10OW0xMTRfdjRsMi5vCi1vYmotJChDT05GSUdfUzVLNEUxKSArPSBzNWs0ZTFfdjRsMi5vCi1vYmotJChDT05GSUdfTVQ5RTAxMykgKz0gbXQ5ZTAxM192NGwyLm8KLW9iai0kKENPTkZJR19XRUJDQU1fT1Y5NzI2KSArPSBvdjk3MjZfdjRsMi5vCi1vYmotJChDT05GSUdfT1Y3NjkyKSArPSBvdjc2OTJfdjRsMi5vCi1vYmotJChDT05GSUdfVlg2OTUzKSArPSB2eDY5NTMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvaW14MDc0X3Y0bDIuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL2lteDA3NF92NGwyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNzU5YTguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvaW14MDc0X3Y0bDIuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1zbV9zZW5zb3IuaCIKLSNkZWZpbmUgU0VOU09SX05BTUUgImlteDA3NCIKLSNkZWZpbmUgUExBVEZPUk1fRFJJVkVSX05BTUUgIm1zbV9jYW1lcmFfaW14MDc0IgotI2RlZmluZSBpbXgwNzRfb2JqIGlteDA3NF8jI29iagotCi1ERUZJTkVfTVVURVgoaW14MDc0X211dCk7Ci1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfY3RybF90IGlteDA3NF9zX2N0cmw7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgaW14MDc0X3N0YXJ0X3NldHRpbmdzW10gPSB7Ci0JezB4MDEwMCwgMHgwMX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIGlteDA3NF9zdG9wX3NldHRpbmdzW10gPSB7Ci0JezB4MDEwMCwgMHgwMH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIGlteDA3NF9ncm91cG9uX3NldHRpbmdzW10gPSB7Ci0JezB4MTA0LCAweDAxfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgaW14MDc0X2dyb3Vwb2ZmX3NldHRpbmdzW10gPSB7Ci0JezB4MTA0LCAweDAwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgaW14MDc0X3ByZXZfc2V0dGluZ3NbXSA9IHsKLQl7MHgwMzA3LCAweDJEfSwgLypwbGxfbXVsdGlwbGllciovCi0JezB4MDM0MCwgMHgwNn0sIC8qZnJhbWVfbGVuZ3RoX2xpbmVzX2hpKi8KLQl7MHgwMzQxLCAweDM0fSwgLypmcmFtZV9sZW5ndGhfbGluZXNfbG8qLwotCXsweDAzNDIsIDB4MTF9LCAvKmxpbmVfbGVuZ3RoX3BjbGtfaGkqLwotCXsweDAzNDMsIDB4Nzh9LCAvKmxpbmVfbGVuZ3RoX3BjbGtfbG8qLwotCXsweDAzNDcsIDB4MDB9LCAvKnlfYWRkcl9zdGFydCovCi0JezB4MDM0YiwgMHgyRn0sIC8qeV9hZGRfZW5kKi8KLQl7MHgwMzRjLCAweDA4fSwgLyp4X291dHB1dF9zaXplX21zYiovCi0JezB4MDM0ZCwgMHgzOH0sIC8qeF9vdXRwdXRfc2l6ZV9sc2IqLwotCXsweDAzNGUsIDB4MDZ9LCAvKnlfb3V0cHV0X3NpemVfbXNiKi8KLQl7MHgwMzRmLCAweDE4fSwgLyp5X291dHB1dF9zaXplX2xzYiovCi0JezB4MDM4MSwgMHgwMX0sIC8qeF9ldmVuX2luYyovCi0JezB4MDM4MywgMHgwM30sIC8qeF9vZGRfaW5jKi8KLQl7MHgwMzg1LCAweDAxfSwgLyp5X2V2ZW5faW5jKi8KLQl7MHgwMzg3LCAweDAzfSwgLyp5X29kZF9pbmMqLwotCXsweDMwMDEsIDB4ODB9LCAvKmhtb2RlYWRkKi8KLQl7MHgzMDE2LCAweDE2fSwgLyp2bW9kZWFkZCovCi0JezB4MzA2OSwgMHgyNH0sIC8qdmFwcGxpbmVwb3Nfc3RhcnQqLwotCXsweDMwNmIsIDB4NTN9LCAvKnZhcHBsaW5lcG9zX2VuZCovCi0JezB4MzA4NiwgMHgwMH0sIC8qc2h1dHRlciovCi0JezB4MzBlOCwgMHg4MH0sIC8qaGFkZGF2ZSovCi0JezB4MzMwMSwgMHg4M30sIC8qbGFuZXNlbCovCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIGlteDA3NF9zbmFwX3NldHRpbmdzW10gPSB7Ci0JezB4MDMwNywgMHgyNn0sIC8qcGxsX211bHRpcGxpZXIqLwotCXsweDAzNDAsIDB4MEN9LCAvKmZyYW1lX2xlbmd0aF9saW5lc19oaSovCi0JezB4MDM0MSwgMHg5MH0sIC8qZnJhbWVfbGVuZ3RoX2xpbmVzX2xvKi8KLQl7MHgwMzQyLCAweDExfSwgLypsaW5lX2xlbmd0aF9wY2xrX2hpKi8KLQl7MHgwMzQzLCAweDc4fSwgLypsaW5lX2xlbmd0aF9wY2xrX2xvKi8KLQl7MHgwMzQ3LCAweDAwfSwgLyp5X2FkZHJfc3RhcnQqLwotCXsweDAzNGIsIDB4MkZ9LCAvKnlfYWRkX2VuZCovCi0JezB4MDM0YywgMHgxMH0sIC8qeF9vdXRwdXRfc2l6ZV9tc2IqLwotCXsweDAzNGQsIDB4NzB9LCAvKnhfb3V0cHV0X3NpemVfbHNiKi8KLQl7MHgwMzRlLCAweDBjfSwgLyp5X291dHB1dF9zaXplX21zYiovCi0JezB4MDM0ZiwgMHgzMH0sIC8qeV9vdXRwdXRfc2l6ZV9sc2IqLwotCXsweDAzODEsIDB4MDF9LCAvKnhfZXZlbl9pbmMqLwotCXsweDAzODMsIDB4MDF9LCAvKnhfb2RkX2luYyovCi0JezB4MDM4NSwgMHgwMX0sIC8qeV9ldmVuX2luYyovCi0JezB4MDM4NywgMHgwMX0sIC8qeV9vZGRfaW5jKi8KLQl7MHgzMDAxLCAweDAwfSwgLypobW9kZWFkZCovCi0JezB4MzAxNiwgMHgwNn0sIC8qdm1vZGVhZGQqLwotCXsweDMwNjksIDB4MjR9LCAvKnZhcHBsaW5lcG9zX3N0YXJ0Ki8KLQl7MHgzMDZiLCAweDUzfSwgLyp2YXBwbGluZXBvc19lbmQqLwotCXsweDMwODYsIDB4MDB9LCAvKnNodXR0ZXIqLwotCXsweDMwZTgsIDB4MDB9LCAvKmhhZGRhdmUqLwotCXsweDMzMDEsIDB4MDN9LCAvKmxhbmVzZWwqLwotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBpbXgwNzRfcmVjb21tZW5kX3NldHRpbmdzW10gPSB7Ci0JezB4MDMwNSwgMHgwMn0sCi0JezB4MzAyYiwgMHg0Qn0sCi0JezB4MzAyNCwgMHgwM30sCi0JezB4MDEwMSwgMHgwMH0sCi0JezB4MzAwYSwgMHg4MH0sCi0JezB4MzAxNCwgMHgwOH0sCi0JezB4MzAxNSwgMHgzN30sCi0JezB4MzAxYywgMHgwMX0sCi0JezB4MzAyYywgMHgwNX0sCi0JezB4MzAzMSwgMHgyNn0sCi0JezB4MzA0MSwgMHg2MH0sCi0JezB4MzA1MSwgMHgyNH0sCi0JezB4MzA1MywgMHgzNH0sCi0JezB4MzA1NywgMHhjMH0sCi0JezB4MzA1YywgMHgwOX0sCi0JezB4MzA1ZCwgMHgwN30sCi0JezB4MzA2MCwgMHgzMH0sCi0JezB4MzA2NSwgMHgwMH0sCi0JezB4MzBhYSwgMHgwOH0sCi0JezB4MzBhYiwgMHgxY30sCi0JezB4MzBiMCwgMHgzMn0sCi0JezB4MzBiMiwgMHg4M30sCi0JezB4MzBkMywgMHgwNH0sCi0JezB4MzEwNiwgMHg3OH0sCi0JezB4MzEwYywgMHg4Mn0sCi0JezB4MzMwNCwgMHgwNX0sCi0JezB4MzMwNSwgMHgwNH0sCi0JezB4MzMwNiwgMHgxMX0sCi0JezB4MzMwNywgMHgwMn0sCi0JezB4MzMwOCwgMHgwY30sCi0JezB4MzMwOSwgMHgwNn0sCi0JezB4MzMwYSwgMHgwOH0sCi0JezB4MzMwYiwgMHgwNH0sCi0JezB4MzMwYywgMHgwOH0sCi0JezB4MzMwZCwgMHgwNn0sCi0JezB4MzMwZiwgMHgwMX0sCi0JezB4MzM4MSwgMHgwMH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2luZm8gaW14MDc0X3N1YmRldl9pbmZvW10gPSB7Ci0JewotCS5jb2RlICAgPSBWNEwyX01CVVNfRk1UX1NCR0dSMTBfMVgxMCwKLQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAotCS5mbXQgICAgPSAxLAotCS5vcmRlciAgICA9IDAsCi0JfSwKLQkvKiBtb3JlIGNhbiBiZSBzdXBwb3J0ZWQsIHRvIGJlIGFkZGVkIGxhdGVyICovCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgaW14MDc0X2luaXRfY29uZltdID0gewotCXsmaW14MDc0X3JlY29tbWVuZF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKGlteDA3NF9yZWNvbW1lbmRfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9Ci19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgaW14MDc0X2NvbmZzW10gPSB7Ci0JeyZpbXgwNzRfc25hcF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKGlteDA3NF9zbmFwX3NldHRpbmdzKSwgMCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLQl7JmlteDA3NF9wcmV2X3NldHRpbmdzWzBdLAotCUFSUkFZX1NJWkUoaW14MDc0X3ByZXZfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX291dHB1dF9pbmZvX3QgaW14MDc0X2RpbWVuc2lvbnNbXSA9IHsKLQl7Ci0JCS54X291dHB1dCA9IDB4MTA3MCwKLQkJLnlfb3V0cHV0ID0gMHhDMzAsCi0JCS5saW5lX2xlbmd0aF9wY2xrID0gMHgxMTc4LAotCQkuZnJhbWVfbGVuZ3RoX2xpbmVzID0gMHhDOTAsCi0JCS52dF9waXhlbF9jbGsgPSAxODI0MDAwMDAsCi0JCS5vcF9waXhlbF9jbGsgPSAxODI0MDAwMDAsCi0JCS5iaW5uaW5nX2ZhY3RvciA9IDEsCi0JfSwKLQl7Ci0JCS54X291dHB1dCA9IDB4ODM4LAotCQkueV9vdXRwdXQgPSAweDYxOCwKLQkJLmxpbmVfbGVuZ3RoX3BjbGsgPSAweDExNzgsCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweDYzNCwKLQkJLnZ0X3BpeGVsX2NsayA9IDIxNjAwMDAwMCwKLQkJLm9wX3BpeGVsX2NsayA9IDEwODAwMDAwMCwKLQkJLmJpbm5pbmdfZmFjdG9yID0gMiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX291dHB1dF9yZWdfYWRkcl90IGlteDA3NF9yZWdfYWRkciA9IHsKLQkueF9vdXRwdXQgPSAweDM0QywKLQkueV9vdXRwdXQgPSAweDM0RSwKLQkubGluZV9sZW5ndGhfcGNsayA9IDB4MzQyLAotCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweDM0MCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9pZF9pbmZvX3QgaW14MDc0X2lkX2luZm8gPSB7Ci0JLnNlbnNvcl9pZF9yZWdfYWRkciA9IDB4MCwKLQkuc2Vuc29yX2lkID0gMHgwMDc0LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2V4cF9nYWluX2luZm9fdCBpbXgwNzRfZXhwX2dhaW5faW5mbyA9IHsKLQkuY29hcnNlX2ludF90aW1lX2FkZHIgPSAweDIwMiwKLQkuZ2xvYmFsX2dhaW5fYWRkciA9IDB4MjA0LAotCS52ZXJ0X29mZnNldCA9IDMsCi19OwotCi1zdGF0aWMgZW51bSBtc21fY2FtZXJhX3ZyZWdfbmFtZV90IGlteDA3NF92ZWdfc2VxW10gPSB7Ci0JQ0FNX1ZESUcsCi0JQ0FNX1ZJTywKLQlDQU1fVkFOQSwKLQlDQU1fVkFGLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGlteDA3NF9pMmNfaWRbXSA9IHsKLQl7U0VOU09SX05BTUUsIChrZXJuZWxfdWxvbmdfdCkmaW14MDc0X3NfY3RybH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaW14MDc0X2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gaW14MDc0X2kyY19pZCwKLQkucHJvYmUgID0gbXNtX3NlbnNvcl9pMmNfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBTRU5TT1JfTkFNRSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgaW14MDc0X3NlbnNvcl9pMmNfY2xpZW50ID0gewotCS5hZGRyX3R5cGUgPSBNU01fQ0FNRVJBX0kyQ19XT1JEX0FERFIsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fc2Vuc29yX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZpbXgwNzRfaTJjX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgaW14MDc0X3N1YmRldl9jb3JlX29wcyA9IHsKLQkuaW9jdGwgPSBtc21fc2Vuc29yX3N1YmRldl9pb2N0bCwKLQkuc19wb3dlciA9IG1zbV9zZW5zb3JfcG93ZXIsCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBpbXgwNzRfc3ViZGV2X3ZpZGVvX29wcyA9IHsKLQkuZW51bV9tYnVzX2ZtdCA9IG1zbV9zZW5zb3JfdjRsMl9lbnVtX2ZtdCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIGlteDA3NF9zdWJkZXZfb3BzID0gewotCS5jb3JlID0gJmlteDA3NF9zdWJkZXZfY29yZV9vcHMsCi0JLnZpZGVvICA9ICZpbXgwNzRfc3ViZGV2X3ZpZGVvX29wcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9mbl90IGlteDA3NF9mdW5jX3RibCA9IHsKLQkuc2Vuc29yX3N0YXJ0X3N0cmVhbSA9IG1zbV9zZW5zb3Jfc3RhcnRfc3RyZWFtLAotCS5zZW5zb3Jfc3RvcF9zdHJlYW0gPSBtc21fc2Vuc29yX3N0b3Bfc3RyZWFtLAotCS5zZW5zb3JfZ3JvdXBfaG9sZF9vbiA9IG1zbV9zZW5zb3JfZ3JvdXBfaG9sZF9vbiwKLQkuc2Vuc29yX2dyb3VwX2hvbGRfb2ZmID0gbXNtX3NlbnNvcl9ncm91cF9ob2xkX29mZiwKLQkuc2Vuc29yX3NldF9mcHMgPSBtc21fc2Vuc29yX3NldF9mcHMsCi0JLnNlbnNvcl93cml0ZV9leHBfZ2FpbiA9IG1zbV9zZW5zb3Jfd3JpdGVfZXhwX2dhaW4xLAotCS5zZW5zb3Jfd3JpdGVfc25hcHNob3RfZXhwX2dhaW4gPSBtc21fc2Vuc29yX3dyaXRlX2V4cF9nYWluMSwKLQkuc2Vuc29yX3NldHRpbmcgPSBtc21fc2Vuc29yX3NldHRpbmcsCi0JLnNlbnNvcl9jc2lfc2V0dGluZyA9IG1zbV9zZW5zb3Jfc2V0dGluZzEsCi0JLnNlbnNvcl9zZXRfc2Vuc29yX21vZGUgPSBtc21fc2Vuc29yX3NldF9zZW5zb3JfbW9kZSwKLQkuc2Vuc29yX21vZGVfaW5pdCA9IG1zbV9zZW5zb3JfbW9kZV9pbml0LAotCS5zZW5zb3JfZ2V0X291dHB1dF9pbmZvID0gbXNtX3NlbnNvcl9nZXRfb3V0cHV0X2luZm8sCi0JLnNlbnNvcl9jb25maWcgPSBtc21fc2Vuc29yX2NvbmZpZywKLQkuc2Vuc29yX3Bvd2VyX3VwID0gbXNtX3NlbnNvcl9wb3dlcl91cCwKLQkuc2Vuc29yX3Bvd2VyX2Rvd24gPSBtc21fc2Vuc29yX3Bvd2VyX2Rvd24sCi0JLnNlbnNvcl9hZGp1c3RfZnJhbWVfbGluZXMgPSBtc21fc2Vuc29yX2FkanVzdF9mcmFtZV9saW5lczEsCi0JLnNlbnNvcl9nZXRfY3NpX3BhcmFtcyA9IG1zbV9zZW5zb3JfZ2V0X2NzaV9wYXJhbXMsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfcmVnX3QgaW14MDc0X3JlZ3MgPSB7Ci0JLmRlZmF1bHRfZGF0YV90eXBlID0gTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBLAotCS5zdGFydF9zdHJlYW1fY29uZiA9IGlteDA3NF9zdGFydF9zZXR0aW5ncywKLQkuc3RhcnRfc3RyZWFtX2NvbmZfc2l6ZSA9IEFSUkFZX1NJWkUoaW14MDc0X3N0YXJ0X3NldHRpbmdzKSwKLQkuc3RvcF9zdHJlYW1fY29uZiA9IGlteDA3NF9zdG9wX3NldHRpbmdzLAotCS5zdG9wX3N0cmVhbV9jb25mX3NpemUgPSBBUlJBWV9TSVpFKGlteDA3NF9zdG9wX3NldHRpbmdzKSwKLQkuZ3JvdXBfaG9sZF9vbl9jb25mID0gaW14MDc0X2dyb3Vwb25fc2V0dGluZ3MsCi0JLmdyb3VwX2hvbGRfb25fY29uZl9zaXplID0gQVJSQVlfU0laRShpbXgwNzRfZ3JvdXBvbl9zZXR0aW5ncyksCi0JLmdyb3VwX2hvbGRfb2ZmX2NvbmYgPSBpbXgwNzRfZ3JvdXBvZmZfc2V0dGluZ3MsCi0JLmdyb3VwX2hvbGRfb2ZmX2NvbmZfc2l6ZSA9Ci0JCUFSUkFZX1NJWkUoaW14MDc0X2dyb3Vwb2ZmX3NldHRpbmdzKSwKLQkuaW5pdF9zZXR0aW5ncyA9ICZpbXgwNzRfaW5pdF9jb25mWzBdLAotCS5pbml0X3NpemUgPSBBUlJBWV9TSVpFKGlteDA3NF9pbml0X2NvbmYpLAotCS5tb2RlX3NldHRpbmdzID0gJmlteDA3NF9jb25mc1swXSwKLQkub3V0cHV0X3NldHRpbmdzID0gJmlteDA3NF9kaW1lbnNpb25zWzBdLAotCS5udW1fY29uZiA9IEFSUkFZX1NJWkUoaW14MDc0X2NvbmZzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgaW14MDc0X3NfY3RybCA9IHsKLQkubXNtX3NlbnNvcl9yZWcgPSAmaW14MDc0X3JlZ3MsCi0JLnNlbnNvcl9pMmNfY2xpZW50ID0gJmlteDA3NF9zZW5zb3JfaTJjX2NsaWVudCwKLQkuc2Vuc29yX2kyY19hZGRyID0gMHgzNCwKLQkudnJlZ19zZXEgPSBpbXgwNzRfdmVnX3NlcSwKLQkubnVtX3ZyZWdfc2VxID0gQVJSQVlfU0laRShpbXgwNzRfdmVnX3NlcSksCi0JLnNlbnNvcl9vdXRwdXRfcmVnX2FkZHIgPSAmaW14MDc0X3JlZ19hZGRyLAotCS5zZW5zb3JfaWRfaW5mbyA9ICZpbXgwNzRfaWRfaW5mbywKLQkuc2Vuc29yX2V4cF9nYWluX2luZm8gPSAmaW14MDc0X2V4cF9nYWluX2luZm8sCi0JLmNhbV9tb2RlID0gTVNNX1NFTlNPUl9NT0RFX0lOVkFMSUQsCi0JLm1zbV9zZW5zb3JfbXV0ZXggPSAmaW14MDc0X211dCwKLQkuc2Vuc29yX2kyY19kcml2ZXIgPSAmaW14MDc0X2kyY19kcml2ZXIsCi0JLnNlbnNvcl92NGwyX3N1YmRldl9pbmZvID0gaW14MDc0X3N1YmRldl9pbmZvLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfaW5mb19zaXplID0gQVJSQVlfU0laRShpbXgwNzRfc3ViZGV2X2luZm8pLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfb3BzID0gJmlteDA3NF9zdWJkZXZfb3BzLAotCS5mdW5jX3RibCA9ICZpbXgwNzRfZnVuY190YmwsCi0JLmNsa19yYXRlID0gTVNNX1NFTlNPUl9NQ0xLXzI0SFosCi19OwotCi1tb2R1bGVfaW5pdChtc21fc2Vuc29yX2luaXRfbW9kdWxlKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU29ueSAxM01QIEJheWVyIHNlbnNvciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL2lteDA5MS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvaW14MDkxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MDkxMzguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvaW14MDkxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2RlZmluZSBJTVgwOTFfU0VOU09SX05BTUUgImlteDA5MSIKLURFRklORV9NU01fTVVURVgoaW14MDkxX211dCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgaW14MDkxX3NfY3RybDsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9pbmZvIGlteDA5MV9zdWJkZXZfaW5mb1tdID0gewotCXsKLQkuY29kZSAgID0gVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzFYMTAsCi0JLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKLQkuZm10ICAgID0gMSwKLQkub3JkZXIgICAgPSAwLAotCX0sCi0JLyogbW9yZSBjYW4gYmUgc3VwcG9ydGVkLCB0byBiZSBhZGRlZCBsYXRlciAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2lkX2luZm9fdCBpbXgwOTFfaWRfaW5mbyA9IHsKLQkuc2Vuc29yX2lkX3JlZ19hZGRyID0gMHgwMDAwLAotCS5zZW5zb3JfaWQgPSAweDAwOTEsCi19OwotCi1zdGF0aWMgZW51bSBtc21fY2FtZXJhX3ZyZWdfbmFtZV90IGlteDA5MV92ZWdfc2VxW10gPSB7Ci0JQ0FNX1ZBTkEsCi0JQ0FNX1ZBRiwKLQlDQU1fVkRJRywKLQlDQU1fVklPLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX3Bvd2VyX3NlcV90IGlteDA5MV9wb3dlcl9zZXFbXSA9IHsKLQl7UkVRVUVTVF9HUElPLCAwfSwKLQl7UkVRVUVTVF9WUkVHLCAwfSwKLQl7RU5BQkxFX1ZSRUcsIDB9LAotCXtFTkFCTEVfR1BJTywgMH0sCi0Je0NPTkZJR19DTEssIDF9LAotCXtDT05GSUdfSTJDX01VWCwgMH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgaW14MDkxX2kyY19pZFtdID0gewotCXtJTVgwOTFfU0VOU09SX05BTUUsIChrZXJuZWxfdWxvbmdfdCkmaW14MDkxX3NfY3RybH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaW14MDkxX2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gaW14MDkxX2kyY19pZCwKLQkucHJvYmUgID0gbXNtX3NlbnNvcl9iYXllcl9pMmNfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBJTVgwOTFfU0VOU09SX05BTUUsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50IGlteDA5MV9zZW5zb3JfaTJjX2NsaWVudCA9IHsKLQkuYWRkcl90eXBlID0gTVNNX0NBTUVSQV9JMkNfV09SRF9BRERSLAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBpbXgwOTFfc3ViZGV2X2NvcmVfb3BzID0gewotCS5pb2N0bCA9IG1zbV9zZW5zb3JfYmF5ZXJfc3ViZGV2X2lvY3RsLAotCS5zX3Bvd2VyID0gbXNtX3NlbnNvcl9iYXllcl9wb3dlciwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIGlteDA5MV9zdWJkZXZfdmlkZW9fb3BzID0gewotCS5lbnVtX21idXNfZm10ID0gbXNtX3NlbnNvcl9iYXllcl92NGwyX2VudW1fZm10LAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgaW14MDkxX3N1YmRldl9vcHMgPSB7Ci0JLmNvcmUgPSAmaW14MDkxX3N1YmRldl9jb3JlX29wcywKLQkudmlkZW8gID0gJmlteDA5MV9zdWJkZXZfdmlkZW9fb3BzLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2ZuX3QgaW14MDkxX2Z1bmNfdGJsID0gewotCS5zZW5zb3JfY29uZmlnID0gbXNtX3NlbnNvcl9iYXllcl9jb25maWcsCi0JLnNlbnNvcl9wb3dlcl91cCA9IG1zbV9zZW5zb3JfYmF5ZXJfcG93ZXJfdXAsCi0JLnNlbnNvcl9wb3dlcl9kb3duID0gbXNtX3NlbnNvcl9iYXllcl9wb3dlcl9kb3duLAotCS5zZW5zb3JfZ2V0X2NzaV9wYXJhbXMgPSBtc21fc2Vuc29yX2JheWVyX2dldF9jc2lfcGFyYW1zLAotCS5zZW5zb3JfcmVhZF9lZXByb20gPSBtc21fc2Vuc29yX2JheWVyX2VlcHJvbV9yZWFkLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCBpbXgwOTFfc19jdHJsID0gewotCS5zZW5zb3JfaTJjX2NsaWVudCA9ICZpbXgwOTFfc2Vuc29yX2kyY19jbGllbnQsCi0JLnNlbnNvcl9pMmNfYWRkciA9IDB4MzQsCi0JLnZyZWdfc2VxID0gaW14MDkxX3ZlZ19zZXEsCi0JLm51bV92cmVnX3NlcSA9IEFSUkFZX1NJWkUoaW14MDkxX3ZlZ19zZXEpLAotCS5wb3dlcl9zZXEgPSAmaW14MDkxX3Bvd2VyX3NlcVswXSwKLQkubnVtX3Bvd2VyX3NlcSA9IEFSUkFZX1NJWkUoaW14MDkxX3Bvd2VyX3NlcSksCi0JLnNlbnNvcl9pZF9pbmZvID0gJmlteDA5MV9pZF9pbmZvLAotCS5tc21fc2Vuc29yX211dGV4ID0gJmlteDA5MV9tdXQsCi0JLnNlbnNvcl92NGwyX3N1YmRldl9pbmZvID0gaW14MDkxX3N1YmRldl9pbmZvLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfaW5mb19zaXplID0gQVJSQVlfU0laRShpbXgwOTFfc3ViZGV2X2luZm8pLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfb3BzID0gJmlteDA5MV9zdWJkZXZfb3BzLAotCS5mdW5jX3RibCA9ICZpbXgwOTFfZnVuY190YmwsCi0JLmNsa19yYXRlID0gTVNNX1NFTlNPUl9NQ0xLXzI0SFosCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvaW14MTM1X3Y0bDIuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL2lteDEzNV92NGwyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZTI5OTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvaW14MTM1X3Y0bDIuYworKysgL2Rldi9udWxsCkBAIC0xLDEyODkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSAibXNtX3NlbnNvci5oIgotI2RlZmluZSBTRU5TT1JfTkFNRSAiaW14MTM1IgotI2RlZmluZSBQTEFURk9STV9EUklWRVJfTkFNRSAibXNtX2NhbWVyYV9pbXgxMzUiCi0jZGVmaW5lIGlteDEzNV9vYmogaW14MTM1XyMjb2JqCi0KLURFRklORV9NVVRFWChpbXgxMzVfbXV0KTsKLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgaW14MTM1X3NfY3RybDsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBpbXgxMzVfc3RhcnRfc2V0dGluZ3NbXSA9IHsKLQl7MHgwMTAwLCAweDAxfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgaW14MTM1X3N0b3Bfc2V0dGluZ3NbXSA9IHsKLQl7MHgwMTAwLCAweDAwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgaW14MTM1X2dyb3Vwb25fc2V0dGluZ3NbXSA9IHsKLQl7MHgxMDQsIDB4MDF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBpbXgxMzVfZ3JvdXBvZmZfc2V0dGluZ3NbXSA9IHsKLQl7MHgxMDQsIDB4MDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBpbXgxMzVfcmVjb21tZW5kX3NldHRpbmdzW10gPSB7Ci0vKiBHbG9iYWwgU2V0dGluZ3MgKi8KLQl7MHgwMTAxLCAweDAwfSwKLQl7MHgwMTA1LCAweDAxfSwKLQl7MHgwMTEwLCAweDAwfSwKLQl7MHgwMjIwLCAweDAxfSwKLQl7MHgzMzAyLCAweDExfSwKLQl7MHgzODMzLCAweDIwfSwKLQl7MHgzODkzLCAweDAwfSwKLQl7MHgzOTA2LCAweDA4fSwKLQl7MHgzOTA3LCAweDAxfSwKLQl7MHgzOTFCLCAweDAxfSwKLQl7MHgzQzA5LCAweDAxfSwKLQl7MHg2MDBBLCAweDAwfSwKLQl7MHgzMDA4LCAweEIwfSwKLQl7MHgzMjBBLCAweDAxfSwKLQl7MHgzMjBELCAweDEwfSwKLQl7MHgzMjE2LCAweDJFfSwKLQl7MHgzMjJDLCAweDAyfSwKLQl7MHgzNDA5LCAweDBDfSwKLQl7MHgzNDBDLCAweDJEfSwKLQl7MHgzNDExLCAweDM5fSwKLQl7MHgzNDE0LCAweDFFfSwKLQl7MHgzNDI3LCAweDA0fSwKLQl7MHgzNDgwLCAweDFFfSwKLQl7MHgzNDg0LCAweDFFfSwKLQl7MHgzNDg4LCAweDFFfSwKLQl7MHgzNDhDLCAweDFFfSwKLQl7MHgzNDkwLCAweDFFfSwKLQl7MHgzNDk0LCAweDFFfSwKLQl7MHgzNTExLCAweDhGfSwKLQl7MHgzNjRGLCAweDJEfSwKLQkvKkRlZmVjdCBDb3JyZWN0aW9uIFJlY29tbWVuZGVkIFNldHRpbmcgKi8KLQl7MHgzODBBLCAweDAwfSwKLQl7MHgzODBCLCAweDAwfSwKLQl7MHg0MTAzLCAweDAwfSwKLQkvKkNvbG9yIEFydGlmYWN0IFJlY29tbWVuZGVkIFNldHRpbmcgKi8KLQl7MHg0MjQzLCAweDlBfSwKLQl7MHg0MzMwLCAweDAxfSwKLQl7MHg0MzMxLCAweDkwfSwKLQl7MHg0MzMyLCAweDAyfSwKLQl7MHg0MzMzLCAweDU4fSwKLQl7MHg0MzM0LCAweDAzfSwKLQl7MHg0MzM1LCAweDIwfSwKLQl7MHg0MzM2LCAweDAzfSwKLQl7MHg0MzM3LCAweDg0fSwKLQl7MHg0MzNDLCAweDAxfSwKLQl7MHg0MzQwLCAweDAyfSwKLQl7MHg0MzQxLCAweDU4fSwKLQl7MHg0MzQyLCAweDAzfSwKLQl7MHg0MzQzLCAweDUyfSwKLQkvKk1vaXLpIHJlZHVjdGlvbiBQYXJhbWV0ZXIgU2V0dGluZwkqLwotCXsweDQzNjQsIDB4MEJ9LAotCXsweDQzNjgsIDB4MDB9LAotCXsweDQzNjksIDB4MEZ9LAotCXsweDQzNkEsIDB4MDN9LAotCXsweDQzNkIsIDB4QTh9LAotCXsweDQzNkMsIDB4MDB9LAotCXsweDQzNkQsIDB4MDB9LAotCXsweDQzNkUsIDB4MDB9LAotCXsweDQzNkYsIDB4MDZ9LAotCS8qQ05SIHBhcmFtZXRlciBzZXR0aW5nCSovCi0JezB4NDI4MSwgMHgyMX0sCi0JezB4NDI4MiwgMHgxOH0sCi0JezB4NDI4MywgMHgwNH0sCi0JezB4NDI4NCwgMHgwOH0sCi0JezB4NDI4NywgMHg3Rn0sCi0JezB4NDI4OCwgMHgwOH0sCi0JezB4NDI4QiwgMHg3Rn0sCi0JezB4NDI4QywgMHgwOH0sCi0JezB4NDI4RiwgMHg3Rn0sCi0JezB4NDI5NywgMHgwMH0sCi0JezB4NDI5OCwgMHg3RX0sCi0JezB4NDI5OSwgMHg3RX0sCi0JezB4NDI5QSwgMHg3RX0sCi0JezB4NDJBNCwgMHhGQn0sCi0JezB4NDJBNSwgMHg3RX0sCi0JezB4NDJBNiwgMHhERn0sCi0JezB4NDJBNywgMHhCN30sCi0JezB4NDJBRiwgMHgwM30sCi0JLypBUk5SIFBhcmFtZXRlciBTZXR0aW5nKi8KLQl7MHg0MjA3LCAweDAzfSwKLQl7MHg0MjE2LCAweDA4fSwKLQl7MHg0MjE3LCAweDA4fSwKLQkvKkRMQyBQYXJhbWV0ZXIgU2V0dGluZyovCi0JezB4NDIxOCwgMHgwMH0sCi0JezB4NDIxQiwgMHgyMH0sCi0JezB4NDIxRiwgMHgwNH0sCi0JezB4NDIyMiwgMHgwMn0sCi0JezB4NDIyMywgMHgyMn0sCi0JezB4NDIyRSwgMHg1NH0sCi0JezB4NDIyRiwgMHhGQn0sCi0JezB4NDIzMCwgMHhGRn0sCi0JezB4NDIzMSwgMHhGRX0sCi0JezB4NDIzMiwgMHhGRn0sCi0JezB4NDIzNSwgMHg1OH0sCi0JezB4NDIzNiwgMHhGN30sCi0JezB4NDIzNywgMHhGRH0sCi0JezB4NDIzOSwgMHg0RX0sCi0JezB4NDIzQSwgMHhGQ30sCi0JezB4NDIzQiwgMHhGRH0sCi0JLypIRFIgU2V0dGluZyovCi0JezB4NDMwMCwgMHgwMH0sCi0JezB4NDMxNiwgMHgxMn0sCi0JezB4NDMxNywgMHgyMn0sCi0JezB4NDMxOCwgMHgwMH0sCi0JezB4NDMxOSwgMHgwMH0sCi0JezB4NDMxQSwgMHgwMH0sCi0JezB4NDMyNCwgMHgwM30sCi0JezB4NDMyNSwgMHgyMH0sCi0JezB4NDMyNiwgMHgwM30sCi0JezB4NDMyNywgMHg4NH0sCi0JezB4NDMyOCwgMHgwM30sCi0JezB4NDMyOSwgMHgyMH0sCi0JezB4NDMyQSwgMHgwM30sCi0JezB4NDMyQiwgMHgyMH0sCi0JezB4NDMyQywgMHgwMX0sCi0JezB4NDMyRCwgMHgwMX0sCi0JezB4NDMzOCwgMHgwMn0sCi0JezB4NDMzOSwgMHgwMH0sCi0JezB4NDMzQSwgMHgwMH0sCi0JezB4NDMzQiwgMHgwMn0sCi0JezB4NDM1QSwgMHgwM30sCi0JezB4NDM1QiwgMHg4NH0sCi0JezB4NDM1RSwgMHgwMX0sCi0JezB4NDM1RiwgMHhGRn0sCi0JezB4NDM2MCwgMHgwMX0sCi0JezB4NDM2MSwgMHhGNH0sCi0JezB4NDM2MiwgMHgwM30sCi0JezB4NDM2MywgMHg4NH0sCi0JezB4NDM3QiwgMHgwMX0sCi0JezB4NDQwMSwgMHgwM30sIC8qMHgzRiovCi0JezB4NDQwMiwgMHhGRn0sCi0JezB4NDQwNCwgMHgxM30sCi0JezB4NDQwNSwgMHgyNn0sCi0JezB4NDQwNiwgMHgwN30sCi0JezB4NDQwOCwgMHgyMH0sCi0JezB4NDQwOSwgMHhFNX0sCi0JezB4NDQwQSwgMHhGQn0sCi0JezB4NDQwQywgMHhGNn0sCi0JezB4NDQwRCwgMHhFQX0sCi0JezB4NDQwRSwgMHgyMH0sCi0JezB4NDQxMCwgMHgwMH0sCi0JezB4NDQxMSwgMHgwMH0sCi0JezB4NDQxMiwgMHgzRn0sCi0JezB4NDQxMywgMHhGRn0sCi0JezB4NDQxNCwgMHgxRn0sCi0JezB4NDQxNSwgMHhGRn0sCi0JezB4NDQxNiwgMHgyMH0sCi0JezB4NDQxNywgMHgwMH0sCi0JezB4NDQxOCwgMHgxRn0sCi0JezB4NDQxOSwgMHhGRn0sCi0JezB4NDQxQSwgMHgyMH0sCi0JezB4NDQxQiwgMHgwMH0sCi0JezB4NDQxRCwgMHg0MH0sCi0JezB4NDQxRSwgMHgxRX0sCi0JezB4NDQxRiwgMHgzOH0sCi0JezB4NDQyMCwgMHgwMX0sCi0JezB4NDQ0NCwgMHgwMH0sCi0JezB4NDQ0NSwgMHgwMH0sCi0JezB4NDQ0NiwgMHgxRH0sCi0JezB4NDQ0NywgMHhGOX0sCi0JezB4NDQ1MiwgMHgwMH0sCi0JezB4NDQ1MywgMHhBMH0sCi0JezB4NDQ1NCwgMHgwOH0sCi0JezB4NDQ1NSwgMHgwMH0sCi0JezB4NDQ1NiwgMHgwRn0sCi0JezB4NDQ1NywgMHhGRn0sCi0JezB4NDQ1OCwgMHgxOH0sCi0JezB4NDQ1OSwgMHgxOH0sCi0JezB4NDQ1QSwgMHgzRn0sCi0JezB4NDQ1QiwgMHgzQX0sCi0JezB4NDQ1QywgMHgwMH0sCi0JezB4NDQ1RCwgMHgyOH0sCi0JezB4NDQ1RSwgMHgwMX0sCi0JezB4NDQ1RiwgMHg5MH0sCi0JezB4NDQ2MCwgMHgwMH0sCi0JezB4NDQ2MSwgMHg2MH0sCi0JezB4NDQ2MiwgMHgwMH0sCi0JezB4NDQ2MywgMHgwMH0sCi0JezB4NDQ2NCwgMHgwMH0sCi0JezB4NDQ2NSwgMHgwMH0sCi0JezB4NDQ2QywgMHgwMH0sCi0JezB4NDQ2RCwgMHgwMH0sCi0JezB4NDQ2RSwgMHgwMH0sCi0JLypMU0MgU2V0dGluZyovCi0JezB4NDUyQSwgMHgwMn0sCi0JLypXaGl0ZSBCYWxhbmNlIFNldHRpbmcgKi8KLQl7MHgwNzEyLCAweDAxfSwKLQl7MHgwNzEzLCAweDAwfSwKLQl7MHgwNzE0LCAweDAxfSwKLQl7MHgwNzE1LCAweDAwfSwKLQl7MHgwNzE2LCAweDAxfSwKLQl7MHgwNzE3LCAweDAwfSwKLQl7MHgwNzE4LCAweDAxfSwKLQl7MHgwNzE5LCAweDAwfSwKLQkvKlNoYWRpbmcgc2V0dGluZyovCi0JezB4NDUwMCwgMHgxRn0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIGlteDEzNV9wcmV2X3NldHRpbmdzW10gPSB7Ci0JLyogQ2xvY2sgU2V0dGluZyAqLwotCXsweDAxMUUsIDB4MTh9LAotCXsweDAxMUYsIDB4MDB9LAotCXsweDAzMDEsIDB4MDV9LAotCXsweDAzMDMsIDB4MDF9LAotCXsweDAzMDUsIDB4MDN9LAotCXsweDAzMDksIDB4MDV9LAotCXsweDAzMEIsIDB4MDJ9LAotCXsweDAzMEMsIDB4MDB9LAotCXsweDAzMEQsIDB4NzF9LAotCXsweDAzMEUsIDB4MDF9LAotCXsweDNBMDYsIDB4MTJ9LAotCS8qIE1vZGUgc2V0dGluZyAqLwotCXsweDAxMDgsIDB4MDN9LAotCXsweDAxMTIsIDB4MEF9LAotCXsweDAxMTMsIDB4MEF9LAotCXsweDAzODEsIDB4MDF9LAotCXsweDAzODMsIDB4MDF9LAotCXsweDAzODUsIDB4MDF9LAotCXsweDAzODcsIDB4MDF9LAotCXsweDAzOTAsIDB4MDF9LAotCXsweDAzOTEsIDB4MjJ9LAotCXsweDAzOTIsIDB4MDB9LAotCXsweDA0MDEsIDB4MDB9LAotCXsweDA0MDQsIDB4MDB9LAotCXsweDA0MDUsIDB4MTB9LAotCXsweDQwODIsIDB4MDF9LAotCXsweDQwODMsIDB4MDF9LAotCXsweDcwMDYsIDB4MDR9LAotCS8qIE9wdGlvbmFsRnVuY3Rpb24gc2V0dGluZyAqLwotCXsweDA3MDAsIDB4MDB9LAotCXsweDNBNjMsIDB4MDB9LAotCXsweDQxMDAsIDB4Rjh9LAotCXsweDQyMDMsIDB4RkZ9LAotCXsweDQzNDQsIDB4MDB9LAotCXsweDQ0MUMsIDB4MDF9LAotCS8qIFNpemUgc2V0dGluZwkqLwotCXsweDAzNDAsIDB4MDZ9LAotCXsweDAzNDEsIDB4MkV9LAotCXsweDAzNDIsIDB4MTF9LAotCXsweDAzNDMsIDB4REN9LAotCXsweDAzNDQsIDB4MDB9LAotCXsweDAzNDUsIDB4MDB9LAotCXsweDAzNDYsIDB4MDB9LAotCXsweDAzNDcsIDB4MDB9LAotCXsweDAzNDgsIDB4MTB9LAotCXsweDAzNDksIDB4NkZ9LAotCXsweDAzNEEsIDB4MEN9LAotCXsweDAzNEIsIDB4MkZ9LAotCXsweDAzNEMsIDB4MDh9LAotCXsweDAzNEQsIDB4Mzh9LAotCXsweDAzNEUsIDB4MDZ9LAotCXsweDAzNEYsIDB4MTh9LAotCXsweDAzNTAsIDB4MDB9LAotCXsweDAzNTEsIDB4MDB9LAotCXsweDAzNTIsIDB4MDB9LAotCXsweDAzNTMsIDB4MDB9LAotCXsweDAzNTQsIDB4MDh9LAotCXsweDAzNTUsIDB4Mzh9LAotCXsweDAzNTYsIDB4MDZ9LAotCXsweDAzNTcsIDB4MTh9LAotCXsweDMwMUQsIDB4MzB9LAotCXsweDMzMTAsIDB4MDh9LAotCXsweDMzMTEsIDB4Mzh9LAotCXsweDMzMTIsIDB4MDZ9LAotCXsweDMzMTMsIDB4MTh9LAotCXsweDMzMUMsIDB4MDB9LAotCXsweDMzMUQsIDB4NTJ9LAotCXsweDQwODQsIDB4MDB9LAotCXsweDQwODUsIDB4MDB9LAotCXsweDQwODYsIDB4MDB9LAotCXsweDQwODcsIDB4MDB9LAotCXsweDQ0MDAsIDB4MDB9LAotCS8qIEdsb2JhbCBUaW1pbmcgU2V0dGluZyAqLwotCXsweDA4MzAsIDB4Njd9LAotCXsweDA4MzEsIDB4Mjd9LAotCXsweDA4MzIsIDB4NDd9LAotCXsweDA4MzMsIDB4Mjd9LAotCXsweDA4MzQsIDB4Mjd9LAotCXsweDA4MzUsIDB4MUZ9LAotCXsweDA4MzYsIDB4ODd9LAotCXsweDA4MzcsIDB4MkZ9LAotCXsweDA4MzksIDB4MUZ9LAotCXsweDA4M0EsIDB4MTd9LAotCXsweDA4M0IsIDB4MDJ9LAotCS8qIEludGVncmF0aW9uIFRpbWUgU2V0dGluZyAqLwotCXsweDAyMDIsIDB4MDZ9LAotCXsweDAyMDMsIDB4MkF9LAotCS8qIEdhaW4gU2V0dGluZwkqLwotCXsweDAyMDUsIDB4MDB9LAotCXsweDAyMEUsIDB4MDF9LAotCXsweDAyMEYsIDB4MDB9LAotCXsweDAyMTAsIDB4MDF9LAotCXsweDAyMTEsIDB4MDB9LAotCXsweDAyMTIsIDB4MDF9LAotCXsweDAyMTMsIDB4MDB9LAotCXsweDAyMTQsIDB4MDF9LAotCXsweDAyMTUsIDB4MDB9LAotCS8qIEhEUiBTZXR0aW5nICovCi0JezB4MDIzMCwgMHgwMH0sCi0JezB4MDIzMSwgMHgwMH0sCi0JezB4MDIzMywgMHgwMH0sCi0JezB4MDIzNCwgMHgwMH0sCi0JezB4MDIzNSwgMHg0MH0sCi0JezB4MDIzOCwgMHgwMH0sCi0JezB4MDIzOSwgMHgwNH0sCi0JezB4MDIzQiwgMHgwMH0sCi0JezB4MDIzQywgMHgwMX0sCi0JezB4MzNCMCwgMHgwNH0sCi0JezB4MzNCMSwgMHgwMH0sCi0JezB4MzNCMywgMHgwMH0sCi0JezB4MzNCNCwgMHgwMH0sCi0JezB4MzgwMCwgMHgwMH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIGlteDEzNV9MU0NUYWJsZV9zZXR0aW5nc1tdID0gewotCXsweDQ4MDAsIDB4MDJ9LAotCXsweDQ4MDEsIDB4Njh9LAotCXsweDQ4MDIsIDB4MDJ9LAotCXsweDQ4MDMsIDB4NGZ9LAotCXsweDQ4MDQsIDB4MDJ9LAotCXsweDQ4MDUsIDB4MTB9LAotCXsweDQ4MDYsIDB4MDF9LAotCXsweDQ4MDcsIDB4ZjN9LAotCXsweDQ4MDgsIDB4MDF9LAotCXsweDQ4MDksIDB4YzN9LAotCXsweDQ4MGEsIDB4MDF9LAotCXsweDQ4MGIsIDB4YjN9LAotCXsweDQ4MGMsIDB4MDF9LAotCXsweDQ4MGQsIDB4OWF9LAotCXsweDQ4MGUsIDB4MDF9LAotCXsweDQ4MGYsIDB4OGV9LAotCXsweDQ4MTAsIDB4MDF9LAotCXsweDQ4MTEsIDB4ODR9LAotCXsweDQ4MTIsIDB4MDF9LAotCXsweDQ4MTMsIDB4N2Z9LAotCXsweDQ4MTQsIDB4MDF9LAotCXsweDQ4MTUsIDB4OTR9LAotCXsweDQ4MTYsIDB4MDF9LAotCXsweDQ4MTcsIDB4OGF9LAotCXsweDQ4MTgsIDB4MDF9LAotCXsweDQ4MTksIDB4Yjd9LAotCXsweDQ4MWEsIDB4MDF9LAotCXsweDQ4MWIsIDB4YTZ9LAotCXsweDQ4MWMsIDB4MDF9LAotCXsweDQ4MWQsIDB4Zjl9LAotCXsweDQ4MWUsIDB4MDF9LAotCXsweDQ4MWYsIDB4ZTJ9LAotCXsweDQ4MjAsIDB4MDJ9LAotCXsweDQ4MjEsIDB4NjJ9LAotCXsweDQ4MjIsIDB4MDJ9LAotCXsweDQ4MjMsIDB4Mzd9LAotCXsweDQ4MjQsIDB4MDJ9LAotCXsweDQ4MjUsIDB4MjZ9LAotCXsweDQ4MjYsIDB4MDJ9LAotCXsweDQ4MjcsIDB4MGN9LAotCXsweDQ4MjgsIDB4MDF9LAotCXsweDQ4MjksIDB4YmJ9LAotCXsweDQ4MmEsIDB4MDF9LAotCXsweDQ4MmIsIDB4YWZ9LAotCXsweDQ4MmMsIDB4MDF9LAotCXsweDQ4MmQsIDB4N2N9LAotCXsweDQ4MmUsIDB4MDF9LAotCXsweDQ4MmYsIDB4NzB9LAotCXsweDQ4MzAsIDB4MDF9LAotCXsweDQ4MzEsIDB4NTB9LAotCXsweDQ4MzIsIDB4MDF9LAotCXsweDQ4MzMsIDB4NGJ9LAotCXsweDQ4MzQsIDB4MDF9LAotCXsweDQ4MzUsIDB4M2V9LAotCXsweDQ4MzYsIDB4MDF9LAotCXsweDQ4MzcsIDB4Mzl9LAotCXsweDQ4MzgsIDB4MDF9LAotCXsweDQ4MzksIDB4NGN9LAotCXsweDQ4M2EsIDB4MDF9LAotCXsweDQ4M2IsIDB4NDV9LAotCXsweDQ4M2MsIDB4MDF9LAotCXsweDQ4M2QsIDB4NzR9LAotCXsweDQ4M2UsIDB4MDF9LAotCXsweDQ4M2YsIDB4NjN9LAotCXsweDQ4NDAsIDB4MDF9LAotCXsweDQ4NDEsIDB4YWV9LAotCXsweDQ4NDIsIDB4MDF9LAotCXsweDQ4NDMsIDB4OTd9LAotCXsweDQ4NDQsIDB4MDJ9LAotCXsweDQ4NDUsIDB4MDd9LAotCXsweDQ4NDYsIDB4MDF9LAotCXsweDQ4NDcsIDB4ZWJ9LAotCXsweDQ4NDgsIDB4MDF9LAotCXsweDQ4NDksIDB4ZjZ9LAotCXsweDQ4NGEsIDB4MDF9LAotCXsweDQ4NGIsIDB4ZGZ9LAotCXsweDQ4NGMsIDB4MDF9LAotCXsweDQ4NGQsIDB4OTN9LAotCXsweDQ4NGUsIDB4MDF9LAotCXsweDQ4NGYsIDB4OGR9LAotCXsweDQ4NTAsIDB4MDF9LAotCXsweDQ4NTEsIDB4NTB9LAotCXsweDQ4NTIsIDB4MDF9LAotCXsweDQ4NTMsIDB4NGJ9LAotCXsweDQ4NTQsIDB4MDF9LAotCXsweDQ4NTUsIDB4MjJ9LAotCXsweDQ4NTYsIDB4MDF9LAotCXsweDQ4NTcsIDB4MjB9LAotCXsweDQ4NTgsIDB4MDF9LAotCXsweDQ4NTksIDB4MTB9LAotCXsweDQ4NWEsIDB4MDF9LAotCXsweDQ4NWIsIDB4MGV9LAotCXsweDQ4NWMsIDB4MDF9LAotCXsweDQ4NWQsIDB4MWR9LAotCXsweDQ4NWUsIDB4MDF9LAotCXsweDQ4NWYsIDB4MTh9LAotCXsweDQ4NjAsIDB4MDF9LAotCXsweDQ4NjEsIDB4NDh9LAotCXsweDQ4NjIsIDB4MDF9LAotCXsweDQ4NjMsIDB4M2Z9LAotCXsweDQ4NjQsIDB4MDF9LAotCXsweDQ4NjUsIDB4ODV9LAotCXsweDQ4NjYsIDB4MDF9LAotCXsweDQ4NjcsIDB4N2J9LAotCXsweDQ4NjgsIDB4MDF9LAotCXsweDQ4NjksIDB4ZDl9LAotCXsweDQ4NmEsIDB4MDF9LAotCXsweDQ4NmIsIDB4YzV9LAotCXsweDQ4NmMsIDB4MDF9LAotCXsweDQ4NmQsIDB4ZGZ9LAotCXsweDQ4NmUsIDB4MDF9LAotCXsweDQ4NmYsIDB4Y2Z9LAotCXsweDQ4NzAsIDB4MDF9LAotCXsweDQ4NzEsIDB4ODd9LAotCXsweDQ4NzIsIDB4MDF9LAotCXsweDQ4NzMsIDB4N2Z9LAotCXsweDQ4NzQsIDB4MDF9LAotCXsweDQ4NzUsIDB4M2R9LAotCXsweDQ4NzYsIDB4MDF9LAotCXsweDQ4NzcsIDB4M2F9LAotCXsweDQ4NzgsIDB4MDF9LAotCXsweDQ4NzksIDB4MTB9LAotCXsweDQ4N2EsIDB4MDF9LAotCXsweDQ4N2IsIDB4MGV9LAotCXsweDQ4N2MsIDB4MDF9LAotCXsweDQ4N2QsIDB4MDB9LAotCXsweDQ4N2UsIDB4MDF9LAotCXsweDQ4N2YsIDB4MDB9LAotCXsweDQ4ODAsIDB4MDF9LAotCXsweDQ4ODEsIDB4MGF9LAotCXsweDQ4ODIsIDB4MDF9LAotCXsweDQ4ODMsIDB4MDd9LAotCXsweDQ4ODQsIDB4MDF9LAotCXsweDQ4ODUsIDB4MzR9LAotCXsweDQ4ODYsIDB4MDF9LAotCXsweDQ4ODcsIDB4MmZ9LAotCXsweDQ4ODgsIDB4MDF9LAotCXsweDQ4ODksIDB4Nzd9LAotCXsweDQ4OGEsIDB4MDF9LAotCXsweDQ4OGIsIDB4Njl9LAotCXsweDQ4OGMsIDB4MDF9LAotCXsweDQ4OGQsIDB4Y2N9LAotCXsweDQ4OGUsIDB4MDF9LAotCXsweDQ4OGYsIDB4Yjl9LAotCXsweDQ4OTAsIDB4MDF9LAotCXsweDQ4OTEsIDB4ZWF9LAotCXsweDQ4OTIsIDB4MDF9LAotCXsweDQ4OTMsIDB4ZGZ9LAotCXsweDQ4OTQsIDB4MDF9LAotCXsweDQ4OTUsIDB4OTN9LAotCXsweDQ4OTYsIDB4MDF9LAotCXsweDQ4OTcsIDB4ODZ9LAotCXsweDQ4OTgsIDB4MDF9LAotCXsweDQ4OTksIDB4NGN9LAotCXsweDQ4OWEsIDB4MDF9LAotCXsweDQ4OWIsIDB4NDh9LAotCXsweDQ4OWMsIDB4MDF9LAotCXsweDQ4OWQsIDB4MjB9LAotCXsweDQ4OWUsIDB4MDF9LAotCXsweDQ4OWYsIDB4MWN9LAotCXsweDQ4YTAsIDB4MDF9LAotCXsweDQ4YTEsIDB4MGR9LAotCXsweDQ4YTIsIDB4MDF9LAotCXsweDQ4YTMsIDB4MDl9LAotCXsweDQ4YTQsIDB4MDF9LAotCXsweDQ4YTUsIDB4MWF9LAotCXsweDQ4YTYsIDB4MDF9LAotCXsweDQ4YTcsIDB4MTV9LAotCXsweDQ4YTgsIDB4MDF9LAotCXsweDQ4YTksIDB4NDN9LAotCXsweDQ4YWEsIDB4MDF9LAotCXsweDQ4YWIsIDB4M2R9LAotCXsweDQ4YWMsIDB4MDF9LAotCXsweDQ4YWQsIDB4ODR9LAotCXsweDQ4YWUsIDB4MDF9LAotCXsweDQ4YWYsIDB4NzV9LAotCXsweDQ4YjAsIDB4MDF9LAotCXsweDQ4YjEsIDB4ZDN9LAotCXsweDQ4YjIsIDB4MDF9LAotCXsweDQ4YjMsIDB4YmZ9LAotCXsweDQ4YjQsIDB4MDJ9LAotCXsweDQ4YjUsIDB4MjN9LAotCXsweDQ4YjYsIDB4MDJ9LAotCXsweDQ4YjcsIDB4MDd9LAotCXsweDQ4YjgsIDB4MDF9LAotCXsweDQ4YjksIDB4YmN9LAotCXsweDQ4YmEsIDB4MDF9LAotCXsweDQ4YmIsIDB4YWN9LAotCXsweDQ4YmMsIDB4MDF9LAotCXsweDQ4YmQsIDB4N2F9LAotCXsweDQ4YmUsIDB4MDF9LAotCXsweDQ4YmYsIDB4NmZ9LAotCXsweDQ4YzAsIDB4MDF9LAotCXsweDQ4YzEsIDB4NGN9LAotCXsweDQ4YzIsIDB4MDF9LAotCXsweDQ4YzMsIDB4NDd9LAotCXsweDQ4YzQsIDB4MDF9LAotCXsweDQ4YzUsIDB4M2R9LAotCXsweDQ4YzYsIDB4MDF9LAotCXsweDQ4YzcsIDB4Mzd9LAotCXsweDQ4YzgsIDB4MDF9LAotCXsweDQ4YzksIDB4NDh9LAotCXsweDQ4Y2EsIDB4MDF9LAotCXsweDQ4Y2IsIDB4NDB9LAotCXsweDQ4Y2MsIDB4MDF9LAotCXsweDQ4Y2QsIDB4NzB9LAotCXsweDQ4Y2UsIDB4MDF9LAotCXsweDQ4Y2YsIDB4NjF9LAotCXsweDQ4ZDAsIDB4MDF9LAotCXsweDQ4ZDEsIDB4YWJ9LAotCXsweDQ4ZDIsIDB4MDF9LAotCXsweDQ4ZDMsIDB4OWF9LAotCXsweDQ4ZDQsIDB4MDJ9LAotCXsweDQ4ZDUsIDB4MDN9LAotCXsweDQ4ZDYsIDB4MDF9LAotCXsweDQ4ZDcsIDB4ZTZ9LAotCXsweDQ4ZDgsIDB4MDJ9LAotCXsweDQ4ZDksIDB4NzF9LAotCXsweDQ4ZGEsIDB4MDJ9LAotCXsweDQ4ZGIsIDB4NGF9LAotCXsweDQ4ZGMsIDB4MDJ9LAotCXsweDQ4ZGQsIDB4MDd9LAotCXsweDQ4ZGUsIDB4MDF9LAotCXsweDQ4ZGYsIDB4ZWZ9LAotCXsweDQ4ZTAsIDB4MDF9LAotCXsweDQ4ZTEsIDB4YmZ9LAotCXsweDQ4ZTIsIDB4MDF9LAotCXsweDQ4ZTMsIDB4YWV9LAotCXsweDQ4ZTQsIDB4MDF9LAotCXsweDQ4ZTUsIDB4OTd9LAotCXsweDQ4ZTYsIDB4MDF9LAotCXsweDQ4ZTcsIDB4ODl9LAotCXsweDQ4ZTgsIDB4MDF9LAotCXsweDQ4ZTksIDB4ODJ9LAotCXsweDQ4ZWEsIDB4MDF9LAotCXsweDQ4ZWIsIDB4N2F9LAotCXsweDQ4ZWMsIDB4MDF9LAotCXsweDQ4ZWQsIDB4OTF9LAotCXsweDQ4ZWUsIDB4MDF9LAotCXsweDQ4ZWYsIDB4ODN9LAotCXsweDQ4ZjAsIDB4MDF9LAotCXsweDQ4ZjEsIDB4Yjd9LAotCXsweDQ4ZjIsIDB4MDF9LAotCXsweDQ4ZjMsIDB4YTl9LAotCXsweDQ4ZjQsIDB4MDF9LAotCXsweDQ4ZjUsIDB4ZjB9LAotCXsweDQ4ZjYsIDB4MDF9LAotCXsweDQ4ZjcsIDB4ZDl9LAotCXsweDQ4ZjgsIDB4MDJ9LAotCXsweDQ4ZjksIDB4NTV9LAotCXsweDQ4ZmEsIDB4MDJ9LAotCXsweDQ4ZmIsIDB4MzJ9LAotCXsweDQ4ZmMsIDB4MDJ9LAotCXsweDQ4ZmQsIDB4NGJ9LAotCXsweDQ4ZmUsIDB4MDJ9LAotCXsweDQ4ZmYsIDB4NGN9LAotCXsweDQ5MDAsIDB4MDF9LAotCXsweDQ5MDEsIDB4ZWN9LAotCXsweDQ5MDIsIDB4MDF9LAotCXsweDQ5MDMsIDB4ZjJ9LAotCXsweDQ5MDQsIDB4MDF9LAotCXsweDQ5MDUsIDB4YjF9LAotCXsweDQ5MDYsIDB4MDF9LAotCXsweDQ5MDcsIDB4Yjd9LAotCXsweDQ5MDgsIDB4MDF9LAotCXsweDQ5MDksIDB4OGF9LAotCXsweDQ5MGEsIDB4MDF9LAotCXsweDQ5MGIsIDB4OGN9LAotCXsweDQ5MGMsIDB4MDF9LAotCXsweDQ5MGQsIDB4N2R9LAotCXsweDQ5MGUsIDB4MDF9LAotCXsweDQ5MGYsIDB4N2R9LAotCXsweDQ5MTAsIDB4MDF9LAotCXsweDQ5MTEsIDB4ODd9LAotCXsweDQ5MTIsIDB4MDF9LAotCXsweDQ5MTMsIDB4ODd9LAotCXsweDQ5MTQsIDB4MDF9LAotCXsweDQ5MTUsIDB4YTh9LAotCXsweDQ5MTYsIDB4MDF9LAotCXsweDQ5MTcsIDB4YTh9LAotCXsweDQ5MTgsIDB4MDF9LAotCXsweDQ5MTksIDB4ZTJ9LAotCXsweDQ5MWEsIDB4MDF9LAotCXsweDQ5MWIsIDB4ZGF9LAotCXsweDQ5MWMsIDB4MDJ9LAotCXsweDQ5MWQsIDB4Mzh9LAotCXsweDQ5MWUsIDB4MDJ9LAotCXsweDQ5MWYsIDB4MzB9LAotCXsweDQ5MjAsIDB4MDJ9LAotCXsweDQ5MjEsIDB4MGF9LAotCXsweDQ5MjIsIDB4MDJ9LAotCXsweDQ5MjMsIDB4MGV9LAotCXsweDQ5MjQsIDB4MDF9LAotCXsweDQ5MjUsIDB4YWV9LAotCXsweDQ5MjYsIDB4MDF9LAotCXsweDQ5MjcsIDB4YWZ9LAotCXsweDQ5MjgsIDB4MDF9LAotCXsweDQ5MjksIDB4NzF9LAotCXsweDQ5MmEsIDB4MDF9LAotCXsweDQ5MmIsIDB4NzR9LAotCXsweDQ5MmMsIDB4MDF9LAotCXsweDQ5MmQsIDB4NGJ9LAotCXsweDQ5MmUsIDB4MDF9LAotCXsweDQ5MmYsIDB4NGF9LAotCXsweDQ5MzAsIDB4MDF9LAotCXsweDQ5MzEsIDB4M2J9LAotCXsweDQ5MzIsIDB4MDF9LAotCXsweDQ5MzMsIDB4M2N9LAotCXsweDQ5MzQsIDB4MDF9LAotCXsweDQ5MzUsIDB4NDZ9LAotCXsweDQ5MzYsIDB4MDF9LAotCXsweDQ5MzcsIDB4NDd9LAotCXsweDQ5MzgsIDB4MDF9LAotCXsweDQ5MzksIDB4Njh9LAotCXsweDQ5M2EsIDB4MDF9LAotCXsweDQ5M2IsIDB4Njh9LAotCXsweDQ5M2MsIDB4MDF9LAotCXsweDQ5M2QsIDB4OWV9LAotCXsweDQ5M2UsIDB4MDF9LAotCXsweDQ5M2YsIDB4YTB9LAotCXsweDQ5NDAsIDB4MDF9LAotCXsweDQ5NDEsIDB4ZjR9LAotCXsweDQ5NDIsIDB4MDF9LAotCXsweDQ5NDMsIDB4ZWN9LAotCXsweDQ5NDQsIDB4MDF9LAotCXsweDQ5NDUsIDB4ZGN9LAotCXsweDQ5NDYsIDB4MDF9LAotCXsweDQ5NDcsIDB4ZTd9LAotCXsweDQ5NDgsIDB4MDF9LAotCXsweDQ5NDksIDB4OGF9LAotCXsweDQ5NGEsIDB4MDF9LAotCXsweDQ5NGIsIDB4OGV9LAotCXsweDQ5NGMsIDB4MDF9LAotCXsweDQ5NGQsIDB4NGJ9LAotCXsweDQ5NGUsIDB4MDF9LAotCXsweDQ5NGYsIDB4NGJ9LAotCXsweDQ5NTAsIDB4MDF9LAotCXsweDQ5NTEsIDB4MWV9LAotCXsweDQ5NTIsIDB4MDF9LAotCXsweDQ5NTMsIDB4MWZ9LAotCXsweDQ5NTQsIDB4MDF9LAotCXsweDQ5NTUsIDB4MGN9LAotCXsweDQ5NTYsIDB4MDF9LAotCXsweDQ5NTcsIDB4MGJ9LAotCXsweDQ5NTgsIDB4MDF9LAotCXsweDQ5NTksIDB4MTh9LAotCXsweDQ5NWEsIDB4MDF9LAotCXsweDQ5NWIsIDB4MTd9LAotCXsweDQ5NWMsIDB4MDF9LAotCXsweDQ5NWQsIDB4NDJ9LAotCXsweDQ5NWUsIDB4MDF9LAotCXsweDQ5NWYsIDB4M2Z9LAotCXsweDQ5NjAsIDB4MDF9LAotCXsweDQ5NjEsIDB4N2J9LAotCXsweDQ5NjIsIDB4MDF9LAotCXsweDQ5NjMsIDB4Nzl9LAotCXsweDQ5NjQsIDB4MDF9LAotCXsweDQ5NjUsIDB4Y2J9LAotCXsweDQ5NjYsIDB4MDF9LAotCXsweDQ5NjcsIDB4YzF9LAotCXsweDQ5NjgsIDB4MDF9LAotCXsweDQ5NjksIDB4ZDR9LAotCXsweDQ5NmEsIDB4MDF9LAotCXsweDQ5NmIsIDB4ZDR9LAotCXsweDQ5NmMsIDB4MDF9LAotCXsweDQ5NmQsIDB4ODB9LAotCXsweDQ5NmUsIDB4MDF9LAotCXsweDQ5NmYsIDB4ODF9LAotCXsweDQ5NzAsIDB4MDF9LAotCXsweDQ5NzEsIDB4M2V9LAotCXsweDQ5NzIsIDB4MDF9LAotCXsweDQ5NzMsIDB4M2F9LAotCXsweDQ5NzQsIDB4MDF9LAotCXsweDQ5NzUsIDB4MTB9LAotCXsweDQ5NzYsIDB4MDF9LAotCXsweDQ5NzcsIDB4MGR9LAotCXsweDQ5NzgsIDB4MDF9LAotCXsweDQ5NzksIDB4MDB9LAotCXsweDQ5N2EsIDB4MDF9LAotCXsweDQ5N2IsIDB4MDB9LAotCXsweDQ5N2MsIDB4MDF9LAotCXsweDQ5N2QsIDB4MDd9LAotCXsweDQ5N2UsIDB4MDF9LAotCXsweDQ5N2YsIDB4MDh9LAotCXsweDQ5ODAsIDB4MDF9LAotCXsweDQ5ODEsIDB4MzR9LAotCXsweDQ5ODIsIDB4MDF9LAotCXsweDQ5ODMsIDB4MzJ9LAotCXsweDQ5ODQsIDB4MDF9LAotCXsweDQ5ODUsIDB4NzJ9LAotCXsweDQ5ODYsIDB4MDF9LAotCXsweDQ5ODcsIDB4NmR9LAotCXsweDQ5ODgsIDB4MDF9LAotCXsweDQ5ODksIDB4YzF9LAotCXsweDQ5OGEsIDB4MDF9LAotCXsweDQ5OGIsIDB4YjZ9LAotCXsweDQ5OGMsIDB4MDF9LAotCXsweDQ5OGQsIDB4ZTF9LAotCXsweDQ5OGUsIDB4MDF9LAotCXsweDQ5OGYsIDB4ZTV9LAotCXsweDQ5OTAsIDB4MDF9LAotCXsweDQ5OTEsIDB4OGR9LAotCXsweDQ5OTIsIDB4MDF9LAotCXsweDQ5OTMsIDB4OGZ9LAotCXsweDQ5OTQsIDB4MDF9LAotCXsweDQ5OTUsIDB4NGN9LAotCXsweDQ5OTYsIDB4MDF9LAotCXsweDQ5OTcsIDB4NGR9LAotCXsweDQ5OTgsIDB4MDF9LAotCXsweDQ5OTksIDB4MWR9LAotCXsweDQ5OWEsIDB4MDF9LAotCXsweDQ5OWIsIDB4MWR9LAotCXsweDQ5OWMsIDB4MDF9LAotCXsweDQ5OWQsIDB4MGJ9LAotCXsweDQ5OWUsIDB4MDF9LAotCXsweDQ5OWYsIDB4MGJ9LAotCXsweDQ5YTAsIDB4MDF9LAotCXsweDQ5YTEsIDB4MTh9LAotCXsweDQ5YTIsIDB4MDF9LAotCXsweDQ5YTMsIDB4MTZ9LAotCXsweDQ5YTQsIDB4MDF9LAotCXsweDQ5YTUsIDB4NDB9LAotCXsweDQ5YTYsIDB4MDF9LAotCXsweDQ5YTcsIDB4M2Z9LAotCXsweDQ5YTgsIDB4MDF9LAotCXsweDQ5YTksIDB4N2N9LAotCXsweDQ5YWEsIDB4MDF9LAotCXsweDQ5YWIsIDB4Nzd9LAotCXsweDQ5YWMsIDB4MDF9LAotCXsweDQ5YWQsIDB4Y2J9LAotCXsweDQ5YWUsIDB4MDF9LAotCXsweDQ5YWYsIDB4Yzh9LAotCXsweDQ5YjAsIDB4MDJ9LAotCXsweDQ5YjEsIDB4MGF9LAotCXsweDQ5YjIsIDB4MDJ9LAotCXsweDQ5YjMsIDB4MGZ9LAotCXsweDQ5YjQsIDB4MDF9LAotCXsweDQ5YjUsIDB4YWR9LAotCXsweDQ5YjYsIDB4MDF9LAotCXsweDQ5YjcsIDB4YWZ9LAotCXsweDQ5YjgsIDB4MDF9LAotCXsweDQ5YjksIDB4NzR9LAotCXsweDQ5YmEsIDB4MDF9LAotCXsweDQ5YmIsIDB4NzN9LAotCXsweDQ5YmMsIDB4MDF9LAotCXsweDQ5YmQsIDB4NDl9LAotCXsweDQ5YmUsIDB4MDF9LAotCXsweDQ5YmYsIDB4NDh9LAotCXsweDQ5YzAsIDB4MDF9LAotCXsweDQ5YzEsIDB4Mzd9LAotCXsweDQ5YzIsIDB4MDF9LAotCXsweDQ5YzMsIDB4Mzd9LAotCXsweDQ5YzQsIDB4MDF9LAotCXsweDQ5YzUsIDB4NDR9LAotCXsweDQ5YzYsIDB4MDF9LAotCXsweDQ5YzcsIDB4M2Z9LAotCXsweDQ5YzgsIDB4MDF9LAotCXsweDQ5YzksIDB4Njh9LAotCXsweDQ5Y2EsIDB4MDF9LAotCXsweDQ5Y2IsIDB4NjV9LAotCXsweDQ5Y2MsIDB4MDF9LAotCXsweDQ5Y2QsIDB4YTJ9LAotCXsweDQ5Y2UsIDB4MDF9LAotCXsweDQ5Y2YsIDB4OWR9LAotCXsweDQ5ZDAsIDB4MDF9LAotCXsweDQ5ZDEsIDB4ZjB9LAotCXsweDQ5ZDIsIDB4MDF9LAotCXsweDQ5ZDMsIDB4ZTZ9LAotCXsweDQ5ZDQsIDB4MDJ9LAotCXsweDQ5ZDUsIDB4NGZ9LAotCXsweDQ5ZDYsIDB4MDJ9LAotCXsweDQ5ZDcsIDB4NGN9LAotCXsweDQ5ZDgsIDB4MDF9LAotCXsweDQ5ZDksIDB4ZjR9LAotCXsweDQ5ZGEsIDB4MDF9LAotCXsweDQ5ZGIsIDB4Zjh9LAotCXsweDQ5ZGMsIDB4MDF9LAotCXsweDQ5ZGQsIDB4YjZ9LAotCXsweDQ5ZGUsIDB4MDF9LAotCXsweDQ5ZGYsIDB4YjR9LAotCXsweDQ5ZTAsIDB4MDF9LAotCXsweDQ5ZTEsIDB4OTB9LAotCXsweDQ5ZTIsIDB4MDF9LAotCXsweDQ5ZTMsIDB4OTF9LAotCXsweDQ5ZTQsIDB4MDF9LAotCXsweDQ5ZTUsIDB4N2Z9LAotCXsweDQ5ZTYsIDB4MDF9LAotCXsweDQ5ZTcsIDB4ODF9LAotCXsweDQ5ZTgsIDB4MDF9LAotCXsweDQ5ZTksIDB4OGF9LAotCXsweDQ5ZWEsIDB4MDF9LAotCXsweDQ5ZWIsIDB4ODh9LAotCXsweDQ5ZWMsIDB4MDF9LAotCXsweDQ5ZWQsIDB4YTh9LAotCXsweDQ5ZWUsIDB4MDF9LAotCXsweDQ5ZWYsIDB4YTl9LAotCXsweDQ5ZjAsIDB4MDF9LAotCXsweDQ5ZjEsIDB4ZGV9LAotCXsweDQ5ZjIsIDB4MDF9LAotCXsweDQ5ZjMsIDB4ZDl9LAotCXsweDQ5ZjQsIDB4MDJ9LAotCXsweDQ5ZjUsIDB4M2J9LAotCXsweDQ5ZjYsIDB4MDJ9LAotCXsweDQ5ZjcsIDB4MzB9LAotCXsweDNBNjMsIDB4MDF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBpbXgxMzVfc25hcF9zZXR0aW5nc1tdID0gewotCS8qIENsb2NrIFNldHRpbmcJKi8KLQl7MHgwMTFFLCAweDE4fSwKLQl7MHgwMTFGLCAweDAwfSwKLQl7MHgwMzAxLCAweDA1fSwKLQl7MHgwMzAzLCAweDAxfSwKLQl7MHgwMzA1LCAweDAzfSwKLQl7MHgwMzA5LCAweDA1fSwKLQl7MHgwMzBCLCAweDAxfSwKLQl7MHgwMzBDLCAweDAwfSwKLQl7MHgwMzBELCAweDYwfSwvKjB4NjQqLwotCXsweDAzMEUsIDB4MDF9LAotCXsweDNBMDYsIDB4MTF9LAotCS8qIE1vZGUgc2V0dGluZyAqLwotCXsweDAxMDgsIDB4MDN9LAotCXsweDAxMTIsIDB4MEF9LAotCXsweDAxMTMsIDB4MEF9LAotCXsweDAzODEsIDB4MDF9LAotCXsweDAzODMsIDB4MDF9LAotCXsweDAzODUsIDB4MDF9LAotCXsweDAzODcsIDB4MDF9LAotCXsweDAzOTAsIDB4MDB9LAotCXsweDAzOTEsIDB4MTF9LAotCXsweDAzOTIsIDB4MDB9LAotCXsweDA0MDEsIDB4MDB9LAotCXsweDA0MDQsIDB4MDB9LAotCXsweDA0MDUsIDB4MTB9LAotCXsweDQwODIsIDB4MDF9LAotCXsweDQwODMsIDB4MDF9LAotCXsweDcwMDYsIDB4MDR9LAotCS8qIE9wdGlvbmFsRnVuY3Rpb24gc2V0dGluZyAqLwotCXsweDA3MDAsIDB4MDB9LAotCXsweDNBNjMsIDB4MDB9LAotCXsweDQxMDAsIDB4Rjh9LAotCXsweDQyMDMsIDB4RkZ9LAotCXsweDQzNDQsIDB4MDB9LAotCXsweDQ0MUMsIDB4MDF9LAotCS8qIFNpemUgc2V0dGluZwkqLwotCXsweDAzNDAsIDB4MEN9LAotCXsweDAzNDEsIDB4NDZ9LAotCXsweDAzNDIsIDB4MTF9LAotCXsweDAzNDMsIDB4REN9LAotCXsweDAzNDQsIDB4MDB9LAotCXsweDAzNDUsIDB4MDB9LAotCXsweDAzNDYsIDB4MDB9LAotCXsweDAzNDcsIDB4MDB9LAotCXsweDAzNDgsIDB4MTB9LAotCXsweDAzNDksIDB4NkZ9LAotCXsweDAzNEEsIDB4MEN9LAotCXsweDAzNEIsIDB4MkZ9LAotCXsweDAzNEMsIDB4MTB9LAotCXsweDAzNEQsIDB4NzB9LAotCXsweDAzNEUsIDB4MEN9LAotCXsweDAzNEYsIDB4MzB9LAotCXsweDAzNTAsIDB4MDB9LAotCXsweDAzNTEsIDB4MDB9LAotCXsweDAzNTIsIDB4MDB9LAotCXsweDAzNTMsIDB4MDB9LAotCXsweDAzNTQsIDB4MTB9LAotCXsweDAzNTUsIDB4NzB9LAotCXsweDAzNTYsIDB4MEN9LAotCXsweDAzNTcsIDB4MzB9LAotCXsweDMwMUQsIDB4MzB9LAotCXsweDMzMTAsIDB4MTB9LAotCXsweDMzMTEsIDB4NzB9LAotCXsweDMzMTIsIDB4MEN9LAotCXsweDMzMTMsIDB4MzB9LAotCXsweDMzMUMsIDB4MDF9LAotCXsweDMzMUQsIDB4Njh9LAotCXsweDQwODQsIDB4MDB9LAotCXsweDQwODUsIDB4MDB9LAotCXsweDQwODYsIDB4MDB9LAotCXsweDQwODcsIDB4MDB9LAotCXsweDQ0MDAsIDB4MDB9LAotCS8qIEdsb2JhbCBUaW1pbmcgU2V0dGluZyAqLwotCXsweDA4MzAsIDB4N0Z9LAotCXsweDA4MzEsIDB4Mzd9LAotCXsweDA4MzIsIDB4NUZ9LAotCXsweDA4MzMsIDB4Mzd9LAotCXsweDA4MzQsIDB4Mzd9LAotCXsweDA4MzUsIDB4M0Z9LAotCXsweDA4MzYsIDB4Qzd9LAotCXsweDA4MzcsIDB4M0Z9LAotCXsweDA4MzksIDB4MUZ9LAotCXsweDA4M0EsIDB4MTd9LAotCXsweDA4M0IsIDB4MDJ9LAotCS8qIEludGVncmF0aW9uIFRpbWUgU2V0dGluZyAqLwotCXsweDAyMDIsIDB4MEN9LAotCXsweDAyMDMsIDB4NDJ9LAotCS8qIEdhaW4gU2V0dGluZwkqLwotCXsweDAyMDUsIDB4MDB9LAotCXsweDAyMEUsIDB4MDF9LAotCXsweDAyMEYsIDB4MDB9LAotCXsweDAyMTAsIDB4MDF9LAotCXsweDAyMTEsIDB4MDB9LAotCXsweDAyMTIsIDB4MDF9LAotCXsweDAyMTMsIDB4MDB9LAotCXsweDAyMTQsIDB4MDF9LAotCXsweDAyMTUsIDB4MDB9LAotCS8qIEhEUiBTZXR0aW5nICovCi0JezB4MDIzMCwgMHgwMH0sCi0JezB4MDIzMSwgMHgwMH0sCi0JezB4MDIzMywgMHgwMH0sCi0JezB4MDIzNCwgMHgwMH0sCi0JezB4MDIzNSwgMHg0MH0sCi0JezB4MDIzOCwgMHgwMH0sCi0JezB4MDIzOSwgMHgwNH0sCi0JezB4MDIzQiwgMHgwMH0sCi0JezB4MDIzQywgMHgwMX0sCi0JezB4MzNCMCwgMHgwNH0sCi0JezB4MzNCMSwgMHgwMH0sCi0JezB4MzNCMywgMHgwMH0sCi0JezB4MzNCNCwgMHgwMH0sCi0JezB4MzgwMCwgMHgwMH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIGlteDEzNV9oZHJfc2V0dGluZ3NbXSA9IHsKLQkvKiBDbG9jayBTZXR0aW5nICovCi0JezB4MDExRSwgMHgxOH0sCi0JezB4MDExRiwgMHgwMH0sCi0JezB4MDMwMSwgMHgwNX0sCi0JezB4MDMwMywgMHgwMX0sCi0JezB4MDMwNSwgMHgwM30sCi0JezB4MDMwOSwgMHgwNX0sCi0JezB4MDMwQiwgMHgwMn0sCi0JezB4MDMwQywgMHgwMH0sCi0JezB4MDMwRCwgMHg3MX0sCi0JezB4MDMwRSwgMHgwMX0sCi0JezB4M0EwNiwgMHgxMn0sCi0JLyogTW9kZSBzZXR0aW5nCSovCi0JezB4MDEwOCwgMHgwM30sCi0JezB4MDExMiwgMHgwRX0sCi0JezB4MDExMywgMHgwQX0sCi0JezB4MDM4MSwgMHgwMX0sCi0JezB4MDM4MywgMHgwMX0sCi0JezB4MDM4NSwgMHgwMX0sCi0JezB4MDM4NywgMHgwMX0sCi0JezB4MDM5MCwgMHgwMH0sCi0JezB4MDM5MSwgMHgxMX0sCi0JezB4MDM5MiwgMHgwMH0sCi0JezB4MDQwMSwgMHgwMH0sCi0JezB4MDQwNCwgMHgwMH0sCi0JezB4MDQwNSwgMHgxMH0sCi0JezB4NDA4MiwgMHgwMX0sCi0JezB4NDA4MywgMHgwMX0sCi0JezB4NzAwNiwgMHgwNH0sCi0JLyogT3B0aW9ubmFsRnVuY3Rpb24gc2V0dGluZyAqLwotCXsweDA3MDAsIDB4MDF9LAotCXsweDNBNjMsIDB4MDB9LAotCXsweDQxMDAsIDB4Rjh9LAotCXsweDQyMDMsIDB4RkZ9LAotCXsweDQzNDQsIDB4MDB9LAotCXsweDQ0MUMsIDB4MDF9LAotCS8qIFNpemUgc2V0dGluZwkqLwotCXsweDAzNDAsIDB4MEN9LAotCXsweDAzNDEsIDB4NDh9LAotCXsweDAzNDIsIDB4MTF9LAotCXsweDAzNDMsIDB4REN9LAotCXsweDAzNDQsIDB4MDB9LAotCXsweDAzNDUsIDB4MDh9LAotCXsweDAzNDYsIDB4MDB9LAotCXsweDAzNDcsIDB4MDB9LAotCXsweDAzNDgsIDB4MTB9LAotCXsweDAzNDksIDB4Njd9LAotCXsweDAzNEEsIDB4MEN9LAotCXsweDAzNEIsIDB4MkZ9LAotCXsweDAzNEMsIDB4MDh9LAotCXsweDAzNEQsIDB4MzB9LAotCXsweDAzNEUsIDB4MDZ9LAotCXsweDAzNEYsIDB4MTh9LAotCXsweDAzNTAsIDB4MDB9LAotCXsweDAzNTEsIDB4MDB9LAotCXsweDAzNTIsIDB4MDB9LAotCXsweDAzNTMsIDB4MDB9LAotCXsweDAzNTQsIDB4MDh9LAotCXsweDAzNTUsIDB4MzB9LAotCXsweDAzNTYsIDB4MDZ9LAotCXsweDAzNTcsIDB4MTh9LAotCXsweDMwMUQsIDB4MzB9LAotCXsweDMzMTAsIDB4MDh9LAotCXsweDMzMTEsIDB4MzB9LAotCXsweDMzMTIsIDB4MDZ9LAotCXsweDMzMTMsIDB4MTh9LAotCXsweDMzMUMsIDB4MDB9LAotCXsweDMzMUQsIDB4MTB9LAotCXsweDQwODQsIDB4MDB9LAotCXsweDQwODUsIDB4MDB9LAotCXsweDQwODYsIDB4MDB9LAotCXsweDQwODcsIDB4MDB9LAotCXsweDQ0MDAsIDB4MDB9LAotCS8qR2xvYmFsIFRpbWluZyBTZXR0aW5nCSovCi0JezB4MDgzMCwgMHg2N30sCi0JezB4MDgzMSwgMHgyN30sCi0JezB4MDgzMiwgMHg0N30sCi0JezB4MDgzMywgMHgyN30sCi0JezB4MDgzNCwgMHgyN30sCi0JezB4MDgzNSwgMHgxRn0sCi0JezB4MDgzNiwgMHg4N30sCi0JezB4MDgzNywgMHgyRn0sCi0JezB4MDgzOSwgMHgxRn0sCi0JezB4MDgzQSwgMHgxN30sCi0JezB4MDgzQiwgMHgwMn0sCi0JLypJbnRlZ3JhdGlvbiBUaW1lIFNldHRpbmcqLwotCXsweDAyMDIsIDB4MEN9LAotCXsweDAyMDMsIDB4NDR9LAotCS8qR2FpbiBTZXR0aW5nICovCi0JezB4MDIwNSwgMHgwMH0sCi0JezB4MDIwRSwgMHgwMX0sCi0JezB4MDIwRiwgMHgwMH0sCi0JezB4MDIxMCwgMHgwMX0sCi0JezB4MDIxMSwgMHgwMH0sCi0JezB4MDIxMiwgMHgwMX0sCi0JezB4MDIxMywgMHgwMH0sCi0JezB4MDIxNCwgMHgwMX0sCi0JezB4MDIxNSwgMHgwMH0sCi0JLyogSERSIFNldHRpbmcgKi8KLQl7MHgwMjMwLCAweDAwfSwKLQl7MHgwMjMxLCAweDAwfSwKLQl7MHgwMjMzLCAweDAwfSwKLQl7MHgwMjM0LCAweDAwfSwKLQl7MHgwMjM1LCAweDQwfSwKLQl7MHgwMjM4LCAweDAxfSwgLypEaXJlY3QgMSAvIEF1dG8gMCovCi0JezB4MDIzOSwgMHgwNH0sCi0JezB4MDIzQiwgMHgwM30sCi0JezB4MDIzQywgMHgwMX0sCi0JezB4MzNCMCwgMHgwOH0sCi0JezB4MzNCMSwgMHgzMH0sCi0JezB4MzNCMywgMHgwMX0sCi0JezB4MzNCNCwgMHgwMH0sCi0JezB4MzgwMCwgMHgwMH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2luZm8gaW14MTM1X3N1YmRldl9pbmZvW10gPSB7Ci0JewotCS5jb2RlCQk9IFY0TDJfTUJVU19GTVRfU0JHR1IxMF8xWDEwLAotCS5jb2xvcnNwYWNlCT0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCi0JLmZtdAkJPSAxLAotCS5vcmRlcgkJPSAwLAotCX0sCi0JLyogbW9yZSBjYW4gYmUgc3VwcG9ydGVkLCB0byBiZSBhZGRlZCBsYXRlciAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5IGlteDEzNV9pbml0X2NvbmZbXSA9IHsKLQl7JmlteDEzNV9yZWNvbW1lbmRfc2V0dGluZ3NbMF0sCi0JQVJSQVlfU0laRShpbXgxMzVfcmVjb21tZW5kX3NldHRpbmdzKSwgMCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLQl7JmlteDEzNV9MU0NUYWJsZV9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKGlteDEzNV9MU0NUYWJsZV9zZXR0aW5ncyksIDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY29uZl9hcnJheSBpbXgxMzVfY29uZnNbXSA9IHsKLQl7JmlteDEzNV9zbmFwX3NldHRpbmdzWzBdLAotCUFSUkFZX1NJWkUoaW14MTM1X3NuYXBfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LAotCXsmaW14MTM1X3ByZXZfc2V0dGluZ3NbMF0sCi0JQVJSQVlfU0laRShpbXgxMzVfcHJldl9zZXR0aW5ncyksIDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sCi0JeyZpbXgxMzVfaGRyX3NldHRpbmdzWzBdLAotCUFSUkFZX1NJWkUoaW14MTM1X2hkcl9zZXR0aW5ncyksIDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3Jfb3V0cHV0X2luZm9fdCBpbXgxMzVfZGltZW5zaW9uc1tdID0gewotCS8qIFJFUzAgc25hcHNob3QoRlVMTCBTSVpFKSAqLwotCXsKLQkJLnhfb3V0cHV0ID0gNDIwOCwKLQkJLnlfb3V0cHV0ID0gMzEyMCwKLQkJLmxpbmVfbGVuZ3RoX3BjbGsgPSA0NTcyLAotCQkuZnJhbWVfbGVuZ3RoX2xpbmVzID0gMzI5MCwKLQkJLnZ0X3BpeGVsX2NsayA9IDM2MDAwMDAwMCwKLQkJLm9wX3BpeGVsX2NsayA9IDMxOTY4MDAwMCwKLQkJLmJpbm5pbmdfZmFjdG9yID0gMSwKLQl9LAotCS8qIFJFUzEgNDozIHByZXZpZXcoMS8ySFYgUVRSIFNJWkUpICovCi0JewotCQkueF9vdXRwdXQgPSAyMTA0LAotCQkueV9vdXRwdXQgPSAxNTYwLAotCQkubGluZV9sZW5ndGhfcGNsayA9IDQ1NzIsCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAxNTgyLAotCQkudnRfcGl4ZWxfY2xrID0gMzYwMDAwMDAwLAotCQkub3BfcGl4ZWxfY2xrID0gMTgwMDAwMDAwLAotCQkuYmlubmluZ19mYWN0b3IgPSAxLAotCX0sCi0JLyogUkVTMiA0OjMgSERSIG1vdmllIG1vZGUgKi8KLQl7Ci0JCS54X291dHB1dCA9IDIwOTYsCi0JCS55X291dHB1dCA9IDE1NjAsCi0JCS5saW5lX2xlbmd0aF9wY2xrID0gNDU3MiwKLQkJLmZyYW1lX2xlbmd0aF9saW5lcyA9IDMyOTAsCi0JCS52dF9waXhlbF9jbGsgPSAzNjAwMDAwMDAsCi0JCS5vcF9waXhlbF9jbGsgPSAxODAwMDAwMDAsCi0JCS5iaW5uaW5nX2ZhY3RvciA9IDEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9vdXRwdXRfcmVnX2FkZHJfdCBpbXgxMzVfcmVnX2FkZHIgPSB7Ci0JLnhfb3V0cHV0ID0gMHgzNEMsCi0JLnlfb3V0cHV0ID0gMHgzNEUsCi0JLmxpbmVfbGVuZ3RoX3BjbGsgPSAweDM0MiwKLQkuZnJhbWVfbGVuZ3RoX2xpbmVzID0gMHgzNDAsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfaWRfaW5mb190IGlteDEzNV9pZF9pbmZvID0gewotCS5zZW5zb3JfaWRfcmVnX2FkZHIgPSAweDAwMDAsCi0JLnNlbnNvcl9pZCA9IDB4MTIxMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9leHBfZ2Fpbl9pbmZvX3QgaW14MTM1X2V4cF9nYWluX2luZm8gPSB7Ci0JLmNvYXJzZV9pbnRfdGltZV9hZGRyID0gMHgyMDIsCi0JLmdsb2JhbF9nYWluX2FkZHIgPSAweDIwNSwKLQkudmVydF9vZmZzZXQgPSA0LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGlteDEzNV9pMmNfaWRbXSA9IHsKLQl7U0VOU09SX05BTUUsIChrZXJuZWxfdWxvbmdfdCkmaW14MTM1X3NfY3RybH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaW14MTM1X2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gaW14MTM1X2kyY19pZCwKLQkucHJvYmUgID0gbXNtX3NlbnNvcl9pMmNfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBTRU5TT1JfTkFNRSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgaW14MTM1X3NlbnNvcl9pMmNfY2xpZW50ID0gewotCS5hZGRyX3R5cGUgPSBNU01fQ0FNRVJBX0kyQ19XT1JEX0FERFIsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fc2Vuc29yX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZpbXgxMzVfaTJjX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgaW14MTM1X3N1YmRldl9jb3JlX29wcyA9IHsKLQkuaW9jdGwgPSBtc21fc2Vuc29yX3N1YmRldl9pb2N0bCwKLQkuc19wb3dlciA9IG1zbV9zZW5zb3JfcG93ZXIsCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBpbXgxMzVfc3ViZGV2X3ZpZGVvX29wcyA9IHsKLQkuZW51bV9tYnVzX2ZtdCA9IG1zbV9zZW5zb3JfdjRsMl9lbnVtX2ZtdCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIGlteDEzNV9zdWJkZXZfb3BzID0gewotCS5jb3JlID0gJmlteDEzNV9zdWJkZXZfY29yZV9vcHMsCi0JLnZpZGVvICA9ICZpbXgxMzVfc3ViZGV2X3ZpZGVvX29wcywKLX07Ci0KLWludDMyX3QgaW14MTM1X3dyaXRlX2V4cF9nYWluKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCQl1aW50MTZfdCBnYWluLCB1aW50MzJfdCBsaW5lKQotewotCXVpbnQzMl90IGZsX2xpbmVzOwotCXVpbnQ4X3Qgb2Zmc2V0OwotCWZsX2xpbmVzID0gc19jdHJsLT5jdXJyX2ZyYW1lX2xlbmd0aF9saW5lczsKLQlmbF9saW5lcyA9IChmbF9saW5lcyAqIHNfY3RybC0+ZnBzX2RpdmlkZXIpIC8gUTEwOwotCW9mZnNldCA9IHNfY3RybC0+c2Vuc29yX2V4cF9nYWluX2luZm8tPnZlcnRfb2Zmc2V0OwotCWlmIChsaW5lID4gKGZsX2xpbmVzIC0gb2Zmc2V0KSkKLQkJZmxfbGluZXMgPSBsaW5lICsgb2Zmc2V0OwotCi0Jc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX2dyb3VwX2hvbGRfb24oc19jdHJsKTsKLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl9vdXRwdXRfcmVnX2FkZHItPmZyYW1lX2xlbmd0aF9saW5lcywgZmxfbGluZXMsCi0JCU1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSk7Ci0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Y29hcnNlX2ludF90aW1lX2FkZHIsIGxpbmUsCi0JCU1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSk7Ci0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Z2xvYmFsX2dhaW5fYWRkciwgZ2FpbiwKLQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQlzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfZ3JvdXBfaG9sZF9vZmYoc19jdHJsKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2ZuX3QgaW14MTM1X2Z1bmNfdGJsID0gewotCS5zZW5zb3Jfc3RhcnRfc3RyZWFtID0gbXNtX3NlbnNvcl9zdGFydF9zdHJlYW0sCi0JLnNlbnNvcl9zdG9wX3N0cmVhbSA9IG1zbV9zZW5zb3Jfc3RvcF9zdHJlYW0sCi0JLnNlbnNvcl9ncm91cF9ob2xkX29uID0gbXNtX3NlbnNvcl9ncm91cF9ob2xkX29uLAotCS5zZW5zb3JfZ3JvdXBfaG9sZF9vZmYgPSBtc21fc2Vuc29yX2dyb3VwX2hvbGRfb2ZmLAotCS5zZW5zb3Jfc2V0X2ZwcyA9IG1zbV9zZW5zb3Jfc2V0X2ZwcywKLQkuc2Vuc29yX3dyaXRlX2V4cF9nYWluID0gaW14MTM1X3dyaXRlX2V4cF9nYWluLAotCS5zZW5zb3Jfd3JpdGVfc25hcHNob3RfZXhwX2dhaW4gPSBpbXgxMzVfd3JpdGVfZXhwX2dhaW4sCi0JLnNlbnNvcl9zZXR0aW5nID0gbXNtX3NlbnNvcl9zZXR0aW5nLAotCS5zZW5zb3JfY3NpX3NldHRpbmcgPSBtc21fc2Vuc29yX3NldHRpbmcxLAotCS5zZW5zb3Jfc2V0X3NlbnNvcl9tb2RlID0gbXNtX3NlbnNvcl9zZXRfc2Vuc29yX21vZGUsCi0JLnNlbnNvcl9tb2RlX2luaXQgPSBtc21fc2Vuc29yX21vZGVfaW5pdCwKLQkuc2Vuc29yX2dldF9vdXRwdXRfaW5mbyA9IG1zbV9zZW5zb3JfZ2V0X291dHB1dF9pbmZvLAotCS5zZW5zb3JfY29uZmlnID0gbXNtX3NlbnNvcl9jb25maWcsCi0JLnNlbnNvcl9wb3dlcl91cCA9IG1zbV9zZW5zb3JfcG93ZXJfdXAsCi0JLnNlbnNvcl9wb3dlcl9kb3duID0gbXNtX3NlbnNvcl9wb3dlcl9kb3duLAotCS5zZW5zb3JfYWRqdXN0X2ZyYW1lX2xpbmVzID0gbXNtX3NlbnNvcl9hZGp1c3RfZnJhbWVfbGluZXMxLAotCS5zZW5zb3JfZ2V0X2NzaV9wYXJhbXMgPSBtc21fc2Vuc29yX2dldF9jc2lfcGFyYW1zLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX3JlZ190IGlteDEzNV9yZWdzID0gewotCS5kZWZhdWx0X2RhdGFfdHlwZSA9IE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSwKLQkuc3RhcnRfc3RyZWFtX2NvbmYgPSBpbXgxMzVfc3RhcnRfc2V0dGluZ3MsCi0JLnN0YXJ0X3N0cmVhbV9jb25mX3NpemUgPSBBUlJBWV9TSVpFKGlteDEzNV9zdGFydF9zZXR0aW5ncyksCi0JLnN0b3Bfc3RyZWFtX2NvbmYgPSBpbXgxMzVfc3RvcF9zZXR0aW5ncywKLQkuc3RvcF9zdHJlYW1fY29uZl9zaXplID0gQVJSQVlfU0laRShpbXgxMzVfc3RvcF9zZXR0aW5ncyksCi0JLmdyb3VwX2hvbGRfb25fY29uZiA9IGlteDEzNV9ncm91cG9uX3NldHRpbmdzLAotCS5ncm91cF9ob2xkX29uX2NvbmZfc2l6ZSA9IEFSUkFZX1NJWkUoaW14MTM1X2dyb3Vwb25fc2V0dGluZ3MpLAotCS5ncm91cF9ob2xkX29mZl9jb25mID0gaW14MTM1X2dyb3Vwb2ZmX3NldHRpbmdzLAotCS5ncm91cF9ob2xkX29mZl9jb25mX3NpemUgPQotCQlBUlJBWV9TSVpFKGlteDEzNV9ncm91cG9mZl9zZXR0aW5ncyksCi0JLmluaXRfc2V0dGluZ3MgPSAmaW14MTM1X2luaXRfY29uZlswXSwKLQkuaW5pdF9zaXplID0gQVJSQVlfU0laRShpbXgxMzVfaW5pdF9jb25mKSwKLQkubW9kZV9zZXR0aW5ncyA9ICZpbXgxMzVfY29uZnNbMF0sCi0JLm91dHB1dF9zZXR0aW5ncyA9ICZpbXgxMzVfZGltZW5zaW9uc1swXSwKLQkubnVtX2NvbmYgPSBBUlJBWV9TSVpFKGlteDEzNV9jb25mcyksCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfY3RybF90IGlteDEzNV9zX2N0cmwgPSB7Ci0JLm1zbV9zZW5zb3JfcmVnID0gJmlteDEzNV9yZWdzLAotCS5zZW5zb3JfaTJjX2NsaWVudCA9ICZpbXgxMzVfc2Vuc29yX2kyY19jbGllbnQsCi0JLnNlbnNvcl9pMmNfYWRkciA9IDB4MjAsCi0JLnNlbnNvcl9vdXRwdXRfcmVnX2FkZHIgPSAmaW14MTM1X3JlZ19hZGRyLAotCS5zZW5zb3JfaWRfaW5mbyA9ICZpbXgxMzVfaWRfaW5mbywKLQkuc2Vuc29yX2V4cF9nYWluX2luZm8gPSAmaW14MTM1X2V4cF9nYWluX2luZm8sCi0JLmNhbV9tb2RlID0gTVNNX1NFTlNPUl9NT0RFX0lOVkFMSUQsCi0JLm1zbV9zZW5zb3JfbXV0ZXggPSAmaW14MTM1X211dCwKLQkuc2Vuc29yX2kyY19kcml2ZXIgPSAmaW14MTM1X2kyY19kcml2ZXIsCi0JLnNlbnNvcl92NGwyX3N1YmRldl9pbmZvID0gaW14MTM1X3N1YmRldl9pbmZvLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfaW5mb19zaXplID0gQVJSQVlfU0laRShpbXgxMzVfc3ViZGV2X2luZm8pLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfb3BzID0gJmlteDEzNV9zdWJkZXZfb3BzLAotCS5mdW5jX3RibCA9ICZpbXgxMzVfZnVuY190YmwsCi0JLmNsa19yYXRlID0gTVNNX1NFTlNPUl9NQ0xLXzI0SFosCi19OwotCi1tb2R1bGVfaW5pdChtc21fc2Vuc29yX2luaXRfbW9kdWxlKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU29ueSAxM01QIEJheWVyIHNlbnNvciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL21zbV9zZW5zb3IuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL21zbV9zZW5zb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmOTYzYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9tc21fc2Vuc29yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTc1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bWFjaC9tc21fYnVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fYnVzX2JvYXJkLmg+Ci0jaW5jbHVkZSAibXNtX3NlbnNvci5oIgotI2luY2x1ZGUgIm1zbV9zZW5zb3JfY29tbW9uLmgiCi0jaW5jbHVkZSAibXNtLmgiCi0jaW5jbHVkZSAibXNtX2lzcGlmLmgiCi0jaW5jbHVkZSAibXNtX2NhbWVyYV9pMmNfbXV4LmgiCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi12b2lkIG1zbV9zZW5zb3JfYWRqdXN0X2ZyYW1lX2xpbmVzMShzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCkKLXsKLQl1aW50MTZfdCBjdXJfbGluZSA9IDA7Ci0JdWludDE2X3QgZXhwX2ZsX2xpbmVzID0gMDsKLQlpZiAoc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mbykgewotCQltc21fY2FtZXJhX2kyY19yZWFkKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCQlzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT5jb2Fyc2VfaW50X3RpbWVfYWRkciwKLQkJCSZjdXJfbGluZSwKLQkJCU1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSk7Ci0JCWV4cF9mbF9saW5lcyA9IGN1cl9saW5lICsKLQkJCXNfY3RybC0+c2Vuc29yX2V4cF9nYWluX2luZm8tPnZlcnRfb2Zmc2V0OwotCQlpZiAoZXhwX2ZsX2xpbmVzID4gc19jdHJsLT5tc21fc2Vuc29yX3JlZy0+Ci0JCQlvdXRwdXRfc2V0dGluZ3Nbc19jdHJsLT5jdXJyX3Jlc10uZnJhbWVfbGVuZ3RoX2xpbmVzKQotCQkJbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCQlzX2N0cmwtPnNlbnNvcl9vdXRwdXRfcmVnX2FkZHItPgotCQkJCWZyYW1lX2xlbmd0aF9saW5lcywKLQkJCQlleHBfZmxfbGluZXMsCi0JCQkJTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBKTsKLQkJQ0RCRygiJXMgY3VyX2ZsX2xpbmVzICVkLCBleHBfZmxfbGluZXMgJWRcbiIsIF9fZnVuY19fLAotCQkJc19jdHJsLT5tc21fc2Vuc29yX3JlZy0+Ci0JCQlvdXRwdXRfc2V0dGluZ3Nbc19jdHJsLT5jdXJyX3Jlc10uZnJhbWVfbGVuZ3RoX2xpbmVzLAotCQkJZXhwX2ZsX2xpbmVzKTsKLQl9Ci0JcmV0dXJuOwotfQotCi12b2lkIG1zbV9zZW5zb3JfYWRqdXN0X2ZyYW1lX2xpbmVzMihzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCkKLXsKLQl1aW50MTZfdCBjdXJfbGluZSA9IDA7Ci0JdWludDE2X3QgZXhwX2ZsX2xpbmVzID0gMDsKLQl1aW50OF90IGludF90aW1lWzNdOwotCWlmIChzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvKSB7Ci0JCW1zbV9jYW1lcmFfaTJjX3JlYWRfc2VxKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCQlzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT5jb2Fyc2VfaW50X3RpbWVfYWRkci0xLAotCQkJJmludF90aW1lWzBdLCAzKTsKLQkJY3VyX2xpbmUgfD0gaW50X3RpbWVbMF0gPDwgMTI7Ci0JCWN1cl9saW5lIHw9IGludF90aW1lWzFdIDw8IDQ7Ci0JCWN1cl9saW5lIHw9IGludF90aW1lWzJdID4+IDQ7Ci0JCWV4cF9mbF9saW5lcyA9IGN1cl9saW5lICsKLQkJCXNfY3RybC0+c2Vuc29yX2V4cF9nYWluX2luZm8tPnZlcnRfb2Zmc2V0OwotCQlpZiAoZXhwX2ZsX2xpbmVzID4gc19jdHJsLT5tc21fc2Vuc29yX3JlZy0+Ci0JCQlvdXRwdXRfc2V0dGluZ3Nbc19jdHJsLT5jdXJyX3Jlc10uZnJhbWVfbGVuZ3RoX2xpbmVzKQotCQkJbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCQlzX2N0cmwtPnNlbnNvcl9vdXRwdXRfcmVnX2FkZHItPgotCQkJCWZyYW1lX2xlbmd0aF9saW5lcywKLQkJCQlleHBfZmxfbGluZXMsCi0JCQkJTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBKTsKLQkJQ0RCRygiJXMgY3VyX2xpbmUgJXggY3VyX2ZsX2xpbmVzICV4LCBleHBfZmxfbGluZXMgJXhcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCWN1cl9saW5lLAotCQkJc19jdHJsLT5tc21fc2Vuc29yX3JlZy0+Ci0JCQlvdXRwdXRfc2V0dGluZ3Nbc19jdHJsLT5jdXJyX3Jlc10uZnJhbWVfbGVuZ3RoX2xpbmVzLAotCQkJZXhwX2ZsX2xpbmVzKTsKLQl9Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBtc21fc2Vuc29yX2RlbGF5X2ZyYW1lcyhzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCkKLXsKLQlsb25nIGZwcyA9IDA7Ci0JdWludDMyX3QgZGVsYXkgPSAwOwotCi0JaWYgKHNfY3RybC0+Y3Vycl9yZXMgPCBNU01fU0VOU09SX0lOVkFMSURfUkVTICYmCi0JCXNfY3RybC0+d2FpdF9udW1fZnJhbWVzID4gMCkgewotCQlmcHMgPSBzX2N0cmwtPm1zbV9zZW5zb3JfcmVnLT4KLQkJCW91dHB1dF9zZXR0aW5nc1tzX2N0cmwtPmN1cnJfcmVzXS52dF9waXhlbF9jbGsgLwotCQkJc19jdHJsLT5jdXJyX2ZyYW1lX2xlbmd0aF9saW5lcyAvCi0JCQlzX2N0cmwtPmN1cnJfbGluZV9sZW5ndGhfcGNsazsKLQkJaWYgKGZwcyA9PSAwKQotCQkJZGVsYXkgPSBzX2N0cmwtPm1pbl9kZWxheTsKLQkJZWxzZQotCQkJZGVsYXkgPSAoMTAwMCAqIHNfY3RybC0+d2FpdF9udW1fZnJhbWVzKSAvIGZwcyAvIFExMDsKLQl9Ci0JQ0RCRygiJXMgZnBzID0gJWxkLCBkZWxheSA9ICVkLCBtaW5fZGVsYXkgJWRcbiIsIF9fZnVuY19fLCBmcHMsCi0JCWRlbGF5LCBzX2N0cmwtPm1pbl9kZWxheSk7Ci0JaWYgKGRlbGF5ID4gc19jdHJsLT5taW5fZGVsYXkpCi0JCW1zbGVlcChkZWxheSk7Ci0JZWxzZSBpZiAoc19jdHJsLT5taW5fZGVsYXkpCi0JCW1zbGVlcChzX2N0cmwtPm1pbl9kZWxheSk7Ci0JcmV0dXJuOwotfQotCi1pbnQzMl90IG1zbV9zZW5zb3Jfd3JpdGVfaW5pdF9zZXR0aW5ncyhzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCkKLXsKLQlpbnQzMl90IHJjOwotCXJjID0gbXNtX3NlbnNvcl93cml0ZV9hbGxfY29uZl9hcnJheSgKLQkJc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5tc21fc2Vuc29yX3JlZy0+aW5pdF9zZXR0aW5ncywKLQkJc19jdHJsLT5tc21fc2Vuc29yX3JlZy0+aW5pdF9zaXplKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludDMyX3QgbXNtX3NlbnNvcl93cml0ZV9yZXNfc2V0dGluZ3Moc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JdWludDE2X3QgcmVzKQotewotCWludDMyX3QgcmM7Ci0JcmMgPSBtc21fc2Vuc29yX3dyaXRlX2NvbmZfYXJyYXkoCi0JCXNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCXNfY3RybC0+bXNtX3NlbnNvcl9yZWctPm1vZGVfc2V0dGluZ3MsIHJlcyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBtc21fc2Vuc29yX3dyaXRlX291dHB1dF9zZXR0aW5ncyhzX2N0cmwsIHJlcyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQzMl90IG1zbV9zZW5zb3Jfd3JpdGVfb3V0cHV0X3NldHRpbmdzKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCXVpbnQxNl90IHJlcykKLXsKLQlpbnQzMl90IHJjID0gLUVGQVVMVDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgZGltX3NldHRpbmdzW10gPSB7Ci0JCXtzX2N0cmwtPnNlbnNvcl9vdXRwdXRfcmVnX2FkZHItPnhfb3V0cHV0LAotCQkJc19jdHJsLT5tc21fc2Vuc29yX3JlZy0+Ci0JCQlvdXRwdXRfc2V0dGluZ3NbcmVzXS54X291dHB1dH0sCi0JCXtzX2N0cmwtPnNlbnNvcl9vdXRwdXRfcmVnX2FkZHItPnlfb3V0cHV0LAotCQkJc19jdHJsLT5tc21fc2Vuc29yX3JlZy0+Ci0JCQlvdXRwdXRfc2V0dGluZ3NbcmVzXS55X291dHB1dH0sCi0JCXtzX2N0cmwtPnNlbnNvcl9vdXRwdXRfcmVnX2FkZHItPmxpbmVfbGVuZ3RoX3BjbGssCi0JCQlzX2N0cmwtPm1zbV9zZW5zb3JfcmVnLT4KLQkJCW91dHB1dF9zZXR0aW5nc1tyZXNdLmxpbmVfbGVuZ3RoX3BjbGt9LAotCQl7c19jdHJsLT5zZW5zb3Jfb3V0cHV0X3JlZ19hZGRyLT5mcmFtZV9sZW5ndGhfbGluZXMsCi0JCQlzX2N0cmwtPm1zbV9zZW5zb3JfcmVnLT4KLQkJCW91dHB1dF9zZXR0aW5nc1tyZXNdLmZyYW1lX2xlbmd0aF9saW5lc30sCi0JfTsKLQotCXJjID0gbXNtX2NhbWVyYV9pMmNfd3JpdGVfdGJsKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsIGRpbV9zZXR0aW5ncywKLQkJQVJSQVlfU0laRShkaW1fc2V0dGluZ3MpLCBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEEpOwotCXJldHVybiByYzsKLX0KLQotdm9pZCBtc21fc2Vuc29yX3N0YXJ0X3N0cmVhbShzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCkKLXsKLQlpZiAoc19jdHJsLT5jdXJyX3JlcyA+PSBzX2N0cmwtPm1zbV9zZW5zb3JfcmVnLT5udW1fY29uZikKLQkJcmV0dXJuOwotCi0JaWYgKHNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9hZGp1c3RfZnJhbWVfbGluZXMpCi0JCXNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9hZGp1c3RfZnJhbWVfbGluZXMoc19jdHJsKTsKLQotCW1zbV9jYW1lcmFfaTJjX3dyaXRlX3RibCgKLQkJc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5tc21fc2Vuc29yX3JlZy0+c3RhcnRfc3RyZWFtX2NvbmYsCi0JCXNfY3RybC0+bXNtX3NlbnNvcl9yZWctPnN0YXJ0X3N0cmVhbV9jb25mX3NpemUsCi0JCXNfY3RybC0+bXNtX3NlbnNvcl9yZWctPmRlZmF1bHRfZGF0YV90eXBlKTsKLQltc2xlZXAoMjApOwotfQotCi12b2lkIG1zbV9zZW5zb3Jfc3RvcF9zdHJlYW0oc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwpCi17Ci0JbXNtX2NhbWVyYV9pMmNfd3JpdGVfdGJsKAotCQlzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPm1zbV9zZW5zb3JfcmVnLT5zdG9wX3N0cmVhbV9jb25mLAotCQlzX2N0cmwtPm1zbV9zZW5zb3JfcmVnLT5zdG9wX3N0cmVhbV9jb25mX3NpemUsCi0JCXNfY3RybC0+bXNtX3NlbnNvcl9yZWctPmRlZmF1bHRfZGF0YV90eXBlKTsKLQltc21fc2Vuc29yX2RlbGF5X2ZyYW1lcyhzX2N0cmwpOwotfQotCi12b2lkIG1zbV9zZW5zb3JfZ3JvdXBfaG9sZF9vbihzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCkKLXsKLQltc21fY2FtZXJhX2kyY193cml0ZV90YmwoCi0JCXNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCXNfY3RybC0+bXNtX3NlbnNvcl9yZWctPmdyb3VwX2hvbGRfb25fY29uZiwKLQkJc19jdHJsLT5tc21fc2Vuc29yX3JlZy0+Z3JvdXBfaG9sZF9vbl9jb25mX3NpemUsCi0JCXNfY3RybC0+bXNtX3NlbnNvcl9yZWctPmRlZmF1bHRfZGF0YV90eXBlKTsKLX0KLQotdm9pZCBtc21fc2Vuc29yX2dyb3VwX2hvbGRfb2ZmKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsKQotewotCW1zbV9jYW1lcmFfaTJjX3dyaXRlX3RibCgKLQkJc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5tc21fc2Vuc29yX3JlZy0+Z3JvdXBfaG9sZF9vZmZfY29uZiwKLQkJc19jdHJsLT5tc21fc2Vuc29yX3JlZy0+Z3JvdXBfaG9sZF9vZmZfY29uZl9zaXplLAotCQlzX2N0cmwtPm1zbV9zZW5zb3JfcmVnLT5kZWZhdWx0X2RhdGFfdHlwZSk7Ci19Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9zZXRfZnBzKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCQkJCQkJc3RydWN0IGZwc19jZmcgKmZwcykKLXsKLQlzX2N0cmwtPmZwc19kaXZpZGVyID0gZnBzLT5mcHNfZGl2OwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludDMyX3QgbXNtX3NlbnNvcl93cml0ZV9leHBfZ2FpbjEoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JCXVpbnQxNl90IGdhaW4sIHVpbnQzMl90IGxpbmUpCi17Ci0JdWludDMyX3QgZmxfbGluZXM7Ci0JdWludDhfdCBvZmZzZXQ7Ci0JZmxfbGluZXMgPSBzX2N0cmwtPmN1cnJfZnJhbWVfbGVuZ3RoX2xpbmVzOwotCWZsX2xpbmVzID0gKGZsX2xpbmVzICogc19jdHJsLT5mcHNfZGl2aWRlcikgLyBRMTA7Ci0Jb2Zmc2V0ID0gc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+dmVydF9vZmZzZXQ7Ci0JaWYgKGxpbmUgPiAoZmxfbGluZXMgLSBvZmZzZXQpKQotCQlmbF9saW5lcyA9IGxpbmUgKyBvZmZzZXQ7Ci0KLQlzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfZ3JvdXBfaG9sZF9vbihzX2N0cmwpOwotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCXNfY3RybC0+c2Vuc29yX291dHB1dF9yZWdfYWRkci0+ZnJhbWVfbGVuZ3RoX2xpbmVzLCBmbF9saW5lcywKLQkJTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBKTsKLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT5jb2Fyc2VfaW50X3RpbWVfYWRkciwgbGluZSwKLQkJTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBKTsKLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT5nbG9iYWxfZ2Fpbl9hZGRyLCBnYWluLAotCQlNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEEpOwotCXNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9ncm91cF9ob2xkX29mZihzX2N0cmwpOwotCXJldHVybiAwOwotfQotCi1pbnQzMl90IG1zbV9zZW5zb3Jfd3JpdGVfZXhwX2dhaW4yKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCQl1aW50MTZfdCBnYWluLCB1aW50MzJfdCBsaW5lKQotewotCXVpbnQzMl90IGZsX2xpbmVzLCBsbF9wY2xrLCBsbF9yYXRpbzsKLQl1aW50OF90IG9mZnNldDsKLQlmbF9saW5lcyA9IHNfY3RybC0+Y3Vycl9mcmFtZV9sZW5ndGhfbGluZXMgKiBzX2N0cmwtPmZwc19kaXZpZGVyIC8gUTEwOwotCWxsX3BjbGsgPSBzX2N0cmwtPmN1cnJfbGluZV9sZW5ndGhfcGNsazsKLQlvZmZzZXQgPSBzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT52ZXJ0X29mZnNldDsKLQlpZiAobGluZSA+IChmbF9saW5lcyAtIG9mZnNldCkpIHsKLQkJbGxfcmF0aW8gPSAobGluZSAqIFExMCkgLyAoZmxfbGluZXMgLSBvZmZzZXQpOwotCQlsbF9wY2xrID0gbGxfcGNsayAqIGxsX3JhdGlvIC8gUTEwOwotCQlsaW5lID0gZmxfbGluZXMgLSBvZmZzZXQ7Ci0JfQotCi0Jc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX2dyb3VwX2hvbGRfb24oc19jdHJsKTsKLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl9vdXRwdXRfcmVnX2FkZHItPmxpbmVfbGVuZ3RoX3BjbGssIGxsX3BjbGssCi0JCU1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSk7Ci0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Y29hcnNlX2ludF90aW1lX2FkZHIsIGxpbmUsCi0JCU1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSk7Ci0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Z2xvYmFsX2dhaW5fYWRkciwgZ2FpbiwKLQkJTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBKTsKLQlzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfZ3JvdXBfaG9sZF9vZmYoc19jdHJsKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50MzJfdCBtc21fc2Vuc29yX3NldHRpbmcxKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCQkJaW50IHVwZGF0ZV90eXBlLCBpbnQgcmVzKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JaWYgKHVwZGF0ZV90eXBlID09IE1TTV9TRU5TT1JfUkVHX0lOSVQpIHsKLQkJQ0RCRygiUmVnaXN0ZXIgSU5JVFxuIik7Ci0JCW1zbV9zZW5zb3JfZW5hYmxlX2RlYnVnZnMoc19jdHJsKTsKLQkJc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX3N0b3Bfc3RyZWFtKHNfY3RybCk7Ci0JCW1zbV9zZW5zb3Jfd3JpdGVfaW5pdF9zZXR0aW5ncyhzX2N0cmwpOwotCX0gZWxzZSBpZiAodXBkYXRlX3R5cGUgPT0gTVNNX1NFTlNPUl9VUERBVEVfUEVSSU9ESUMpIHsKLQkJQ0RCRygiUEVSSU9ESUMgOiAlZFxuIiwgcmVzKTsKLQkJbXNtX3NlbnNvcl93cml0ZV9jb25mX2FycmF5KAotCQkJc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCXNfY3RybC0+bXNtX3NlbnNvcl9yZWctPm1vZGVfc2V0dGluZ3MsIHJlcyk7Ci0JCW1zbGVlcCgzMCk7Ci0JCXY0bDJfc3ViZGV2X25vdGlmeSgmc19jdHJsLT5zZW5zb3JfdjRsMl9zdWJkZXYsCi0JCQlOT1RJRllfUENMS19DSEFOR0UsCi0JCQkmc19jdHJsLT5zZW5zb3JkYXRhLT5wZGF0YS0+aW9jbGsudmZlX2Nsa19yYXRlKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQzMl90IG1zbV9zZW5zb3Jfc2V0dGluZyhzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwKLQkJCWludCB1cGRhdGVfdHlwZSwgaW50IHJlcykKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCWlmICh1cGRhdGVfdHlwZSA9PSBNU01fU0VOU09SX1JFR19JTklUKSB7Ci0JCXNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9zdG9wX3N0cmVhbShzX2N0cmwpOwotCQltc21fc2Vuc29yX3dyaXRlX2luaXRfc2V0dGluZ3Moc19jdHJsKTsKLQl9IGVsc2UgaWYgKHVwZGF0ZV90eXBlID09IE1TTV9TRU5TT1JfVVBEQVRFX1BFUklPRElDKSB7Ci0JCW1zbV9zZW5zb3Jfd3JpdGVfcmVzX3NldHRpbmdzKHNfY3RybCwgcmVzKTsKLQkJdjRsMl9zdWJkZXZfbm90aWZ5KCZzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldiwKLQkJCU5PVElGWV9QQ0xLX0NIQU5HRSwgJnNfY3RybC0+bXNtX3NlbnNvcl9yZWctPgotCQkJb3V0cHV0X3NldHRpbmdzW3Jlc10ub3BfcGl4ZWxfY2xrKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQzMl90IG1zbV9zZW5zb3Jfc2V0X3NlbnNvcl9tb2RlKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCWludCBtb2RlLCBpbnQgcmVzKQotewotCWludDMyX3QgcmMgPSAwOwotCWlmIChzX2N0cmwtPmN1cnJfcmVzICE9IHJlcykgewotCQlzX2N0cmwtPmN1cnJfZnJhbWVfbGVuZ3RoX2xpbmVzID0KLQkJCXNfY3RybC0+bXNtX3NlbnNvcl9yZWctPgotCQkJb3V0cHV0X3NldHRpbmdzW3Jlc10uZnJhbWVfbGVuZ3RoX2xpbmVzOwotCi0JCXNfY3RybC0+Y3Vycl9saW5lX2xlbmd0aF9wY2xrID0KLQkJCXNfY3RybC0+bXNtX3NlbnNvcl9yZWctPgotCQkJb3V0cHV0X3NldHRpbmdzW3Jlc10ubGluZV9sZW5ndGhfcGNsazsKLQotCQlpZiAoc19jdHJsLT5pc19jc2ljIHx8Ci0JCQkhc19jdHJsLT5zZW5zb3JkYXRhLT5jc2lfaWYpCi0JCQlyYyA9IHNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9jc2lfc2V0dGluZyhzX2N0cmwsCi0JCQkJTVNNX1NFTlNPUl9VUERBVEVfUEVSSU9ESUMsIHJlcyk7Ci0JCWVsc2UKLQkJCXJjID0gc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX3NldHRpbmcoc19jdHJsLAotCQkJCU1TTV9TRU5TT1JfVVBEQVRFX1BFUklPRElDLCByZXMpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQlzX2N0cmwtPmN1cnJfcmVzID0gcmVzOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotaW50MzJfdCBtc21fc2Vuc29yX21vZGVfaW5pdChzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwKLQkJCWludCBtb2RlLCBzdHJ1Y3Qgc2Vuc29yX2luaXRfY2ZnICppbml0X2luZm8pCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0Jc19jdHJsLT5mcHNfZGl2aWRlciA9IFExMDsKLQlzX2N0cmwtPmNhbV9tb2RlID0gTVNNX1NFTlNPUl9NT0RFX0lOVkFMSUQ7Ci0KLQlDREJHKCIlczogJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JaWYgKG1vZGUgIT0gc19jdHJsLT5jYW1fbW9kZSkgewotCQlzX2N0cmwtPmN1cnJfcmVzID0gTVNNX1NFTlNPUl9JTlZBTElEX1JFUzsKLQkJc19jdHJsLT5jYW1fbW9kZSA9IG1vZGU7Ci0KLQkJaWYgKHNfY3RybC0+aXNfY3NpYyB8fAotCQkJIXNfY3RybC0+c2Vuc29yZGF0YS0+Y3NpX2lmKQotCQkJcmMgPSBzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfY3NpX3NldHRpbmcoc19jdHJsLAotCQkJCU1TTV9TRU5TT1JfUkVHX0lOSVQsIDApOwotCQllbHNlCi0JCQlyYyA9IHNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9zZXR0aW5nKHNfY3RybCwKLQkJCQlNU01fU0VOU09SX1JFR19JTklULCAwKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQzMl90IG1zbV9zZW5zb3JfZ2V0X291dHB1dF9pbmZvKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCQlzdHJ1Y3Qgc2Vuc29yX291dHB1dF9pbmZvX3QgKnNlbnNvcl9vdXRwdXRfaW5mbykKLXsKLQlpbnQgcmMgPSAwOwotCXNlbnNvcl9vdXRwdXRfaW5mby0+bnVtX2luZm8gPSBzX2N0cmwtPm1zbV9zZW5zb3JfcmVnLT5udW1fY29uZjsKLQlpZiAoY29weV90b191c2VyKCh2b2lkICopc2Vuc29yX291dHB1dF9pbmZvLT5vdXRwdXRfaW5mbywKLQkJc19jdHJsLT5tc21fc2Vuc29yX3JlZy0+b3V0cHV0X3NldHRpbmdzLAotCQlzaXplb2Yoc3RydWN0IG1zbV9zZW5zb3Jfb3V0cHV0X2luZm9fdCkgKgotCQlzX2N0cmwtPm1zbV9zZW5zb3JfcmVnLT5udW1fY29uZikpCi0JCXJjID0gLUVGQVVMVDsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXNtX3NlbnNvcl9yZWxlYXNlKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsKQotewotCUNEQkcoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwotCXNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9zdG9wX3N0cmVhbShzX2N0cmwpOwotCXJldHVybiAwOwotfQotCi1sb25nIG1zbV9zZW5zb3Jfc3ViZGV2X2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwgPSBnZXRfc2N0cmwoc2QpOwotCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWlmIChzX2N0cmwtPnNlbnNvcl9zdGF0ZSA9PSBNU01fU0VOU09SX1BPV0VSX0RPV04pCi0JCXJldHVybiAtRUlOVkFMOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfTVNNX1NFTlNPUl9DRkc6Ci0JCXJldHVybiBzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfY29uZmlnKHNfY3RybCwgYXJncCk7Ci0JY2FzZSBWSURJT0NfTVNNX1NFTlNPUl9SRUxFQVNFOgotCQlyZXR1cm4gbXNtX3NlbnNvcl9yZWxlYXNlKHNfY3RybCk7Ci0JY2FzZSBWSURJT0NfTVNNX1NFTlNPUl9DU0lEX0lORk86IHsKLQkJc3RydWN0IG1zbV9zZW5zb3JfY3NpX2luZm8gKmNzaV9pbmZvID0KLQkJCShzdHJ1Y3QgbXNtX3NlbnNvcl9jc2lfaW5mbyAqKWFyZzsKLQkJc19jdHJsLT5pc19jc2ljID0gY3NpX2luZm8tPmlzX2NzaWM7Ci0JCXJldHVybiAwOwotCX0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCX0KLX0KLQotaW50MzJfdCBtc21fc2Vuc29yX2dldF9jc2lfcGFyYW1zKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCQlzdHJ1Y3QgY3NpX2xhbmVfcGFyYW1zX3QgKnNlbnNvcl9vdXRwdXRfaW5mbykKLXsKLQl1aW50OF90IGluZGV4OwotCXN0cnVjdCBtc21fY2FtZXJhX2NzaV9sYW5lX3BhcmFtcyAqY3NpX2xhbmVfcGFyYW1zID0KLQkJc19jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+Y3NpX2xhbmVfcGFyYW1zOwotCWlmIChjc2lfbGFuZV9wYXJhbXMpIHsKLQkJc2Vuc29yX291dHB1dF9pbmZvLT5jc2lfbGFuZV9hc3NpZ24gPSBjc2lfbGFuZV9wYXJhbXMtPgotCQkJY3NpX2xhbmVfYXNzaWduOwotCQlzZW5zb3Jfb3V0cHV0X2luZm8tPmNzaV9sYW5lX21hc2sgPSBjc2lfbGFuZV9wYXJhbXMtPgotCQkJY3NpX2xhbmVfbWFzazsKLQkJc2Vuc29yX291dHB1dF9pbmZvLT5jc2lfcGh5X3NlbCA9Ci0JCQlzX2N0cmwtPnNlbnNvcmRhdGEtPnBkYXRhLT5jc2lwaHlfY29yZTsKLQl9Ci0Jc2Vuc29yX291dHB1dF9pbmZvLT5jc2lfaWYgPSBzX2N0cmwtPnNlbnNvcmRhdGEtPmNzaV9pZjsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzZW5zb3Jfb3V0cHV0X2luZm8tPmNzaV9pZjsgaW5kZXgrKykKLQkJc2Vuc29yX291dHB1dF9pbmZvLT5jc2lkX2NvcmVbaW5kZXhdID0gc19jdHJsLT5zZW5zb3JkYXRhLT4KLQkJCXBkYXRhW2luZGV4XS5jc2lkX2NvcmU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50MzJfdCBtc21fc2Vuc29yX2NvbmZpZyhzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwgdm9pZCBfX3VzZXIgKmFyZ3ApCi17Ci0Jc3RydWN0IHNlbnNvcl9jZmdfZGF0YSBjZGF0YTsKLQlsb25nICAgcmMgPSAwOwotCWlmIChjb3B5X2Zyb21fdXNlcigmY2RhdGEsCi0JCSh2b2lkICopYXJncCwKLQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JbXV0ZXhfbG9jayhzX2N0cmwtPm1zbV9zZW5zb3JfbXV0ZXgpOwotCUNEQkcoIiVzOiVkICVzIGNmZ3R5cGUgPSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQlzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9uYW1lLCBjZGF0YS5jZmd0eXBlKTsKLQlzd2l0Y2ggKGNkYXRhLmNmZ3R5cGUpIHsKLQkJY2FzZSBDRkdfU0VUX0ZQUzoKLQkJY2FzZSBDRkdfU0VUX1BJQ1RfRlBTOgotCQkJaWYgKHNfY3RybC0+ZnVuY190YmwtPgotCQkJc2Vuc29yX3NldF9mcHMgPT0gTlVMTCkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJjID0gc19jdHJsLT5mdW5jX3RibC0+Ci0JCQkJc2Vuc29yX3NldF9mcHMoCi0JCQkJc19jdHJsLAotCQkJCSYoY2RhdGEuY2ZnLmZwcykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfU0VUX0VYUF9HQUlOOgotCQkJaWYgKHNfY3RybC0+ZnVuY190YmwtPgotCQkJc2Vuc29yX3dyaXRlX2V4cF9nYWluID09IE5VTEwpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyYyA9Ci0JCQkJc19jdHJsLT5mdW5jX3RibC0+Ci0JCQkJc2Vuc29yX3dyaXRlX2V4cF9nYWluKAotCQkJCQlzX2N0cmwsCi0JCQkJCWNkYXRhLmNmZy5leHBfZ2Fpbi5nYWluLAotCQkJCQljZGF0YS5jZmcuZXhwX2dhaW4ubGluZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19TRVRfUElDVF9FWFBfR0FJTjoKLQkJCWlmIChzX2N0cmwtPmZ1bmNfdGJsLT4KLQkJCXNlbnNvcl93cml0ZV9zbmFwc2hvdF9leHBfZ2FpbiA9PSBOVUxMKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcmMgPQotCQkJCXNfY3RybC0+ZnVuY190YmwtPgotCQkJCXNlbnNvcl93cml0ZV9zbmFwc2hvdF9leHBfZ2FpbigKLQkJCQkJc19jdHJsLAotCQkJCQljZGF0YS5jZmcuZXhwX2dhaW4uZ2FpbiwKLQkJCQkJY2RhdGEuY2ZnLmV4cF9nYWluLmxpbmUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfU0VUX01PREU6Ci0JCQlpZiAoc19jdHJsLT5mdW5jX3RibC0+Ci0JCQlzZW5zb3Jfc2V0X3NlbnNvcl9tb2RlID09IE5VTEwpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyYyA9IHNfY3RybC0+ZnVuY190YmwtPgotCQkJCXNlbnNvcl9zZXRfc2Vuc29yX21vZGUoCi0JCQkJCXNfY3RybCwKLQkJCQkJY2RhdGEubW9kZSwKLQkJCQkJY2RhdGEucnMpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfU0VUX0VGRkVDVDoKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0ZHX1NFTlNPUl9JTklUOgotCQkJaWYgKHNfY3RybC0+ZnVuY190YmwtPgotCQkJc2Vuc29yX21vZGVfaW5pdCA9PSBOVUxMKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcmMgPSBzX2N0cmwtPmZ1bmNfdGJsLT4KLQkJCQlzZW5zb3JfbW9kZV9pbml0KAotCQkJCXNfY3RybCwKLQkJCQljZGF0YS5tb2RlLAotCQkJCSYoY2RhdGEuY2ZnLmluaXRfaW5mbykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfR0VUX09VVFBVVF9JTkZPOgotCQkJaWYgKHNfY3RybC0+ZnVuY190YmwtPgotCQkJc2Vuc29yX2dldF9vdXRwdXRfaW5mbyA9PSBOVUxMKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcmMgPSBzX2N0cmwtPmZ1bmNfdGJsLT4KLQkJCQlzZW5zb3JfZ2V0X291dHB1dF9pbmZvKAotCQkJCXNfY3RybCwKLQkJCQkmY2RhdGEuY2ZnLm91dHB1dF9pbmZvKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfU1RBUlRfU1RSRUFNOgotCQkJaWYgKHNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9zdGFydF9zdHJlYW0gPT0gTlVMTCkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9zdGFydF9zdHJlYW0oc19jdHJsKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0ZHX1NUT1BfU1RSRUFNOgotCQkJaWYgKHNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9zdG9wX3N0cmVhbSA9PSBOVUxMKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX3N0b3Bfc3RyZWFtKHNfY3RybCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19HRVRfQ1NJX1BBUkFNUzoKLQkJCWlmIChzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfZ2V0X2NzaV9wYXJhbXMgPT0gTlVMTCkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJjID0gc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX2dldF9jc2lfcGFyYW1zKAotCQkJCXNfY3RybCwKLQkJCQkmY2RhdGEuY2ZnLmNzaV9sYW5lX3BhcmFtcyk7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSZjZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0ZHX1BPV0VSX1VQOgotCQkJcHJfZXJyKCIlcyBjYWxsaW5nIHBvd2VyIHVwXG4iLCBfX2Z1bmNfXyk7Ci0JCQlpZiAoc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX3Bvd2VyX3VwKQotCQkJCXJjID0gc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX3Bvd2VyX3VwKHNfY3RybCk7Ci0JCQllbHNlCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfUE9XRVJfRE9XTjoKLQkJCWlmIChzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfcG93ZXJfZG93bikKLQkJCQlyYyA9IHNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9wb3dlcl9kb3duKAotCQkJCQlzX2N0cmwpOwotCQkJZWxzZQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JbXV0ZXhfdW5sb2NrKHNfY3RybC0+bXNtX3NlbnNvcl9tdXRleCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbV9jbGtfaW5mbyBjYW1fODk2MF9jbGtfaW5mb1tdID0gewotCXsiY2FtX2NsayIsIE1TTV9TRU5TT1JfTUNMS18yNEhafSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbV9jbGtfaW5mbyBjYW1fODk3NF9jbGtfaW5mb1tdID0gewotCXsiY2FtX3NyY19jbGsiLCAxOTIwMDAwMH0sCi0JeyJjYW1fY2xrIiwgLTF9LAotfTsKLQotaW50MzJfdCBtc21fc2Vuc29yX2VuYWJsZV9pMmNfbXV4KHN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mICppMmNfY29uZikKLXsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmkyY19tdXhfc2QgPQotCQlkZXZfZ2V0X2RydmRhdGEoJmkyY19jb25mLT5tdXhfZGV2LT5kZXYpOwotCXY0bDJfc3ViZGV2X2NhbGwoaTJjX211eF9zZCwgY29yZSwgaW9jdGwsCi0JCVZJRElPQ19NU01fSTJDX01VWF9JTklULCBOVUxMKTsKLQl2NGwyX3N1YmRldl9jYWxsKGkyY19tdXhfc2QsIGNvcmUsIGlvY3RsLAotCQlWSURJT0NfTVNNX0kyQ19NVVhfQ0ZHLCAodm9pZCAqKSZpMmNfY29uZi0+aTJjX211eF9tb2RlKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50MzJfdCBtc21fc2Vuc29yX2Rpc2FibGVfaTJjX211eChzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY29uZiAqaTJjX2NvbmYpCi17Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICppMmNfbXV4X3NkID0KLQkJZGV2X2dldF9kcnZkYXRhKCZpMmNfY29uZi0+bXV4X2Rldi0+ZGV2KTsKLQl2NGwyX3N1YmRldl9jYWxsKGkyY19tdXhfc2QsIGNvcmUsIGlvY3RsLAotCQkJCVZJRElPQ19NU01fSTJDX01VWF9SRUxFQVNFLCBOVUxMKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgbXNtX3NlbnNvcl9pbml0X2ZsYXNoX2RhdGEoc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlLAotCXN0cnVjdCAgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2Vuc29yZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1aW50MzJfdCB2YWwgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9mbGFzaF9kYXRhICpmbGFzaF9kYXRhID0gTlVMTDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmZsYXNoX3NyY19ub2RlID0gTlVMTDsKLQotCXNlbnNvcmRhdGEtPmZsYXNoX2RhdGEgPSBremFsbG9jKHNpemVvZigKLQkJc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2ZsYXNoX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNlbnNvcmRhdGEtPmZsYXNoX2RhdGEpIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlmICghb2ZfZ2V0X3Byb3BlcnR5KG9mX25vZGUsICJxY29tLGZsYXNoLXNyYy1pbmRleCIsICZ2YWwpKSB7Ci0JCUNEQkcoIiVzIGZsYXNoIG5vdCBhdmFpbGFibGVcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlmbGFzaF9kYXRhID0gc2Vuc29yZGF0YS0+Zmxhc2hfZGF0YTsKLQotCWZsYXNoX3NyY19ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShvZl9ub2RlLCAicWNvbSxmbGFzaC1zcmMtaW5kZXgiLCAwKTsKLQlpZiAoIWZsYXNoX3NyY19ub2RlKSB7Ci0JCXByX2VycigiJXM6JWQgZmxhc2hfc3JjX25vZGUgTlVMTFxuIiwgX19mdW5jX18sCi0JCQlfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1IxOwotCX0KLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoZmxhc2hfc3JjX25vZGUsICJxY29tLGZsYXNoLXR5cGUiLCAmdmFsKTsKLQlDREJHKCIlcyBxY29tLGZsYXNoLXR5cGUgJWQsIHJjICVkXG4iLCBfX2Z1bmNfXywgdmFsLCByYyk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJZ290byBFUlJPUjI7Ci0JfQotCWZsYXNoX2RhdGEtPmZsYXNoX3R5cGUgPSB2YWw7Ci0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGZsYXNoX3NyY19ub2RlLCAiY2VsbC1pbmRleCIsICZ2YWwpOwotCUNEQkcoIiVzIHFjb20sZmxhc2gtc3JjLWluZGV4ICVkLCByYyAlZFxuIiwgX19mdW5jX18sIHZhbCwgcmMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1IyOwotCX0KLQlmbGFzaF9kYXRhLT5mbGFzaF9zcmNfaW5kZXggPSB2YWw7Ci0KLQlvZl9ub2RlX3B1dChmbGFzaF9zcmNfbm9kZSk7Ci0KLQlyZXR1cm4gcmM7Ci1FUlJPUjI6Ci0Jb2Zfbm9kZV9wdXQoZmxhc2hfc3JjX25vZGUpOwotRVJST1IxOgotCWZsYXNoX2RhdGEtPmZsYXNoX3R5cGUgPSBNU01fQ0FNRVJBX0ZMQVNIX05PTkU7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtc21fc2Vuc29yX2luaXRfdnJlZ19kYXRhKHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSwKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfcGxhdGZvcm1faW5mbyAqcGluZm8pCi17Ci0JaW50MzJfdCByYyA9IDAsIGkgPSAwOwotCXVpbnQzMl90IGNvdW50ID0gMDsKLQl1aW50MzJfdCAqdmFsX2FycmF5ID0gTlVMTDsKLQotCWNvdW50ID0gb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhvZl9ub2RlLCAicWNvbSxjYW0tdnJlZy1uYW1lIik7Ci0JQ0RCRygiJXMgcWNvbSxjYW0tdnJlZy1uYW1lIGNvdW50ICVkXG4iLCBfX2Z1bmNfXywgY291bnQpOwotCi0JaWYgKCFjb3VudCkKLQkJcmV0dXJuIDA7Ci0KLQlwaW5mby0+Y2FtX3ZyZWcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2FtZXJhX3ZyZWdfdCkgKiBjb3VudCwKLQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwaW5mby0+Y2FtX3ZyZWcpIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXBpbmZvLT5udW1fdnJlZyA9IGNvdW50OwotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCXJjID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgob2Zfbm9kZSwKLQkJCSJxY29tLGNhbS12cmVnLW5hbWUiLCBpLCAmcGluZm8tPmNhbV92cmVnW2ldLnJlZ19uYW1lKTsKLQkJQ0RCRygiJXMgcmVnX25hbWVbJWRdID0gJXNcbiIsIF9fZnVuY19fLCBpLAotCQkJcGluZm8tPmNhbV92cmVnW2ldLnJlZ19uYW1lKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlnb3RvIEVSUk9SMTsKLQkJfQotCX0KLQotCXZhbF9hcnJheSA9IGt6YWxsb2Moc2l6ZW9mKHVpbnQzMl90KSAqIGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZhbF9hcnJheSkgewotCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIEVSUk9SMTsKLQl9Ci0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KG9mX25vZGUsICJxY29tLGNhbS12cmVnLXR5cGUiLAotCQl2YWxfYXJyYXksIGNvdW50KTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlnb3RvIEVSUk9SMjsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJcGluZm8tPmNhbV92cmVnW2ldLnR5cGUgPSB2YWxfYXJyYXlbaV07Ci0JCUNEQkcoIiVzIGNhbV92cmVnWyVkXS50eXBlID0gJWRcbiIsIF9fZnVuY19fLCBpLAotCQkJcGluZm8tPmNhbV92cmVnW2ldLnR5cGUpOwotCX0KLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkob2Zfbm9kZSwgInFjb20sY2FtLXZyZWctbWluLXZvbHRhZ2UiLAotCQl2YWxfYXJyYXksIGNvdW50KTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlnb3RvIEVSUk9SMjsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJcGluZm8tPmNhbV92cmVnW2ldLm1pbl92b2x0YWdlID0gdmFsX2FycmF5W2ldOwotCQlDREJHKCIlcyBjYW1fdnJlZ1slZF0ubWluX3ZvbHRhZ2UgPSAlZFxuIiwgX19mdW5jX18sCi0JCQlpLCBwaW5mby0+Y2FtX3ZyZWdbaV0ubWluX3ZvbHRhZ2UpOwotCX0KLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkob2Zfbm9kZSwgInFjb20sY2FtLXZyZWctbWF4LXZvbHRhZ2UiLAotCQl2YWxfYXJyYXksIGNvdW50KTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlnb3RvIEVSUk9SMjsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJcGluZm8tPmNhbV92cmVnW2ldLm1heF92b2x0YWdlID0gdmFsX2FycmF5W2ldOwotCQlDREJHKCIlcyBjYW1fdnJlZ1slZF0ubWF4X3ZvbHRhZ2UgPSAlZFxuIiwgX19mdW5jX18sCi0JCQlpLCBwaW5mby0+Y2FtX3ZyZWdbaV0ubWF4X3ZvbHRhZ2UpOwotCX0KLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkob2Zfbm9kZSwgInFjb20sY2FtLXZyZWctb3AtbW9kZSIsCi0JCXZhbF9hcnJheSwgY291bnQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1IyOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlwaW5mby0+Y2FtX3ZyZWdbaV0ub3BfbW9kZSA9IHZhbF9hcnJheVtpXTsKLQkJQ0RCRygiJXMgY2FtX3ZyZWdbJWRdLm9wX21vZGUgPSAlZFxuIiwgX19mdW5jX18sIGksCi0JCQlwaW5mby0+Y2FtX3ZyZWdbaV0ub3BfbW9kZSk7Ci0JfQotCi0Ja2ZyZWUodmFsX2FycmF5KTsKLQlyZXR1cm4gcmM7Ci1FUlJPUjI6Ci0Ja2ZyZWUodmFsX2FycmF5KTsKLUVSUk9SMToKLQlrZnJlZShwaW5mby0+Y2FtX3ZyZWcpOwotCXBpbmZvLT5udW1fdnJlZyA9IDA7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBtc21fc2Vuc29yX2luaXRfZ3Bpb19jb21tb25fdGJsX2RhdGEoc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlLAotCXN0cnVjdCBtc21fY2FtZXJhX2dwaW9fY29uZiAqZ2NvbmYsIHVpbnQxNl90ICpncGlvX2FycmF5LAotCXVpbnQxNl90IGdwaW9fYXJyYXlfc2l6ZSkKLXsKLQlpbnQzMl90IHJjID0gMCwgaSA9IDA7Ci0JdWludDMyX3QgY291bnQgPSAwOwotCXVpbnQzMl90ICp2YWxfYXJyYXkgPSBOVUxMOwotCi0JaWYgKCFvZl9nZXRfcHJvcGVydHkob2Zfbm9kZSwgInFjb20sZ3Bpby1jb21tb24tdGJsLW51bSIsICZjb3VudCkpCi0JCXJldHVybiAwOwotCi0JY291bnQgLz0gc2l6ZW9mKHVpbnQzMl90KTsKLQlpZiAoIWNvdW50KSB7Ci0JCXByX2VycigiJXMgcWNvbSxncGlvLWNvbW1vbi10YmwtbnVtIDBcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmIChjb3VudCA+IGdwaW9fYXJyYXlfc2l6ZSkgewotCQlwcl9lcnIoIiVzIGdwaW8gY29tbW9uIHRibCBzaXplIGV4Y2VlZHMgZ3BpbyBhcnJheVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JdmFsX2FycmF5ID0ga3phbGxvYyhzaXplb2YodWludDMyX3QpICogY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghdmFsX2FycmF5KSB7Ci0JCXByX2VycigiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlnY29uZi0+Y2FtX2dwaW9fY29tbW9uX3RibCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBncGlvKSAqIGNvdW50LAotCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWdjb25mLT5jYW1fZ3Bpb19jb21tb25fdGJsKSB7Ci0JCXByX2VycigiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gRVJST1IxOwotCX0KLQlnY29uZi0+Y2FtX2dwaW9fY29tbW9uX3RibF9zaXplID0gY291bnQ7Ci0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KG9mX25vZGUsICJxY29tLGdwaW8tY29tbW9uLXRibC1udW0iLAotCQl2YWxfYXJyYXksIGNvdW50KTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlnb3RvIEVSUk9SMjsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJaWYgKHZhbF9hcnJheVtpXSA+PSBncGlvX2FycmF5X3NpemUpIHsKLQkJCXByX2VycigiJXMgZ3BpbyBjb21tb24gdGJsIGluZGV4ICVkIGludmFsaWRcbiIsCi0JCQkJX19mdW5jX18sIHZhbF9hcnJheVtpXSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlnY29uZi0+Y2FtX2dwaW9fY29tbW9uX3RibFtpXS5ncGlvID0gZ3Bpb19hcnJheVt2YWxfYXJyYXlbaV1dOwotCQlDREJHKCIlcyBjYW1fZ3Bpb19jb21tb25fdGJsWyVkXS5ncGlvID0gJWRcbiIsIF9fZnVuY19fLCBpLAotCQkJZ2NvbmYtPmNhbV9ncGlvX2NvbW1vbl90YmxbaV0uZ3Bpbyk7Ci0JfQotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShvZl9ub2RlLCAicWNvbSxncGlvLWNvbW1vbi10YmwtZmxhZ3MiLAotCQl2YWxfYXJyYXksIGNvdW50KTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlnb3RvIEVSUk9SMjsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJZ2NvbmYtPmNhbV9ncGlvX2NvbW1vbl90YmxbaV0uZmxhZ3MgPSB2YWxfYXJyYXlbaV07Ci0JCUNEQkcoIiVzIGNhbV9ncGlvX2NvbW1vbl90YmxbJWRdLmZsYWdzID0gJWxkXG4iLCBfX2Z1bmNfXywgaSwKLQkJCWdjb25mLT5jYW1fZ3Bpb19jb21tb25fdGJsW2ldLmZsYWdzKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KG9mX25vZGUsCi0JCQkicWNvbSxncGlvLWNvbW1vbi10YmwtbGFiZWwiLCBpLAotCQkJJmdjb25mLT5jYW1fZ3Bpb19jb21tb25fdGJsW2ldLmxhYmVsKTsKLQkJQ0RCRygiJXMgY2FtX2dwaW9fY29tbW9uX3RibFslZF0ubGFiZWwgPSAlc1xuIiwgX19mdW5jX18sIGksCi0JCQlnY29uZi0+Y2FtX2dwaW9fY29tbW9uX3RibFtpXS5sYWJlbCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJZ290byBFUlJPUjI7Ci0JCX0KLQl9Ci0KLQlrZnJlZSh2YWxfYXJyYXkpOwotCXJldHVybiByYzsKLQotRVJST1IyOgotCWtmcmVlKGdjb25mLT5jYW1fZ3Bpb19jb21tb25fdGJsKTsKLUVSUk9SMToKLQlrZnJlZSh2YWxfYXJyYXkpOwotCWdjb25mLT5jYW1fZ3Bpb19jb21tb25fdGJsX3NpemUgPSAwOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXNtX3NlbnNvcl9pbml0X2dwaW9fcmVxX3RibF9kYXRhKHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSwKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9ncGlvX2NvbmYgKmdjb25mLCB1aW50MTZfdCAqZ3Bpb19hcnJheSwKLQl1aW50MTZfdCBncGlvX2FycmF5X3NpemUpCi17Ci0JaW50MzJfdCByYyA9IDAsIGkgPSAwOwotCXVpbnQzMl90IGNvdW50ID0gMDsKLQl1aW50MzJfdCAqdmFsX2FycmF5ID0gTlVMTDsKLQotCWlmICghb2ZfZ2V0X3Byb3BlcnR5KG9mX25vZGUsICJxY29tLGdwaW8tcmVxLXRibC1udW0iLCAmY291bnQpKQotCQlyZXR1cm4gMDsKLQotCWNvdW50IC89IHNpemVvZih1aW50MzJfdCk7Ci0JaWYgKCFjb3VudCkgewotCQlwcl9lcnIoIiVzIHFjb20sZ3Bpby1yZXEtdGJsLW51bSAwXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQotCXZhbF9hcnJheSA9IGt6YWxsb2Moc2l6ZW9mKHVpbnQzMl90KSAqIGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZhbF9hcnJheSkgewotCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZ2NvbmYtPmNhbV9ncGlvX3JlcV90YmwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ3BpbykgKiBjb3VudCwKLQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFnY29uZi0+Y2FtX2dwaW9fcmVxX3RibCkgewotCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIEVSUk9SMTsKLQl9Ci0JZ2NvbmYtPmNhbV9ncGlvX3JlcV90Ymxfc2l6ZSA9IGNvdW50OwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShvZl9ub2RlLCAicWNvbSxncGlvLXJlcS10YmwtbnVtIiwKLQkJdmFsX2FycmF5LCBjb3VudCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJZ290byBFUlJPUjI7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWlmICh2YWxfYXJyYXlbaV0gPj0gZ3Bpb19hcnJheV9zaXplKSB7Ci0JCQlwcl9lcnIoIiVzIGdwaW8gcmVxIHRibCBpbmRleCAlZCBpbnZhbGlkXG4iLAotCQkJCV9fZnVuY19fLCB2YWxfYXJyYXlbaV0pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJZ2NvbmYtPmNhbV9ncGlvX3JlcV90YmxbaV0uZ3BpbyA9IGdwaW9fYXJyYXlbdmFsX2FycmF5W2ldXTsKLQkJQ0RCRygiJXMgY2FtX2dwaW9fcmVxX3RibFslZF0uZ3BpbyA9ICVkXG4iLCBfX2Z1bmNfXywgaSwKLQkJCWdjb25mLT5jYW1fZ3Bpb19yZXFfdGJsW2ldLmdwaW8pOwotCX0KLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkob2Zfbm9kZSwgInFjb20sZ3Bpby1yZXEtdGJsLWZsYWdzIiwKLQkJdmFsX2FycmF5LCBjb3VudCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJZ290byBFUlJPUjI7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWdjb25mLT5jYW1fZ3Bpb19yZXFfdGJsW2ldLmZsYWdzID0gdmFsX2FycmF5W2ldOwotCQlDREJHKCIlcyBjYW1fZ3Bpb19yZXFfdGJsWyVkXS5mbGFncyA9ICVsZFxuIiwgX19mdW5jX18sIGksCi0JCQlnY29uZi0+Y2FtX2dwaW9fcmVxX3RibFtpXS5mbGFncyk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChvZl9ub2RlLAotCQkJInFjb20sZ3Bpby1yZXEtdGJsLWxhYmVsIiwgaSwKLQkJCSZnY29uZi0+Y2FtX2dwaW9fcmVxX3RibFtpXS5sYWJlbCk7Ci0JCUNEQkcoIiVzIGNhbV9ncGlvX3JlcV90YmxbJWRdLmxhYmVsID0gJXNcbiIsIF9fZnVuY19fLCBpLAotCQkJZ2NvbmYtPmNhbV9ncGlvX3JlcV90YmxbaV0ubGFiZWwpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJCWdvdG8gRVJST1IyOwotCQl9Ci0JfQotCi0Ja2ZyZWUodmFsX2FycmF5KTsKLQlyZXR1cm4gcmM7Ci0KLUVSUk9SMjoKLQlrZnJlZShnY29uZi0+Y2FtX2dwaW9fcmVxX3RibCk7Ci1FUlJPUjE6Ci0Ja2ZyZWUodmFsX2FycmF5KTsKLQlnY29uZi0+Y2FtX2dwaW9fcmVxX3RibF9zaXplID0gMDsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG1zbV9zZW5zb3JfaW5pdF9ncGlvX3NldF90YmxfZGF0YShzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUsCi0Jc3RydWN0IG1zbV9jYW1lcmFfZ3Bpb19jb25mICpnY29uZiwgdWludDE2X3QgKmdwaW9fYXJyYXksCi0JdWludDE2X3QgZ3Bpb19hcnJheV9zaXplKQotewotCWludDMyX3QgcmMgPSAwLCBpID0gMDsKLQl1aW50MzJfdCBjb3VudCA9IDA7Ci0JdWludDMyX3QgKnZhbF9hcnJheSA9IE5VTEw7Ci0KLQlpZiAoIW9mX2dldF9wcm9wZXJ0eShvZl9ub2RlLCAicWNvbSxncGlvLXNldC10YmwtbnVtIiwgJmNvdW50KSkKLQkJcmV0dXJuIDA7Ci0KLQljb3VudCAvPSBzaXplb2YodWludDMyX3QpOwotCWlmICghY291bnQpIHsKLQkJcHJfZXJyKCIlcyBxY29tLGdwaW8tc2V0LXRibC1udW0gMFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl2YWxfYXJyYXkgPSBremFsbG9jKHNpemVvZih1aW50MzJfdCkgKiBjb3VudCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2YWxfYXJyYXkpIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWdjb25mLT5jYW1fZ3Bpb19zZXRfdGJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9ncGlvX3NldF90YmwpICoKLQkJY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghZ2NvbmYtPmNhbV9ncGlvX3NldF90YmwpIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBFUlJPUjE7Ci0JfQotCWdjb25mLT5jYW1fZ3Bpb19zZXRfdGJsX3NpemUgPSBjb3VudDsKLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkob2Zfbm9kZSwgInFjb20sZ3Bpby1zZXQtdGJsLW51bSIsCi0JCXZhbF9hcnJheSwgY291bnQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1IyOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlpZiAodmFsX2FycmF5W2ldID49IGdwaW9fYXJyYXlfc2l6ZSkgewotCQkJcHJfZXJyKCIlcyBncGlvIHNldCB0YmwgaW5kZXggJWQgaW52YWxpZFxuIiwKLQkJCQlfX2Z1bmNfXywgdmFsX2FycmF5W2ldKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWdjb25mLT5jYW1fZ3Bpb19zZXRfdGJsW2ldLmdwaW8gPSBncGlvX2FycmF5W3ZhbF9hcnJheVtpXV07Ci0JCUNEQkcoIiVzIGNhbV9ncGlvX3NldF90YmxbJWRdLmdwaW8gPSAlZFxuIiwgX19mdW5jX18sIGksCi0JCQlnY29uZi0+Y2FtX2dwaW9fc2V0X3RibFtpXS5ncGlvKTsKLQl9Ci0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KG9mX25vZGUsICJxY29tLGdwaW8tc2V0LXRibC1mbGFncyIsCi0JCXZhbF9hcnJheSwgY291bnQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1IyOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlnY29uZi0+Y2FtX2dwaW9fc2V0X3RibFtpXS5mbGFncyA9IHZhbF9hcnJheVtpXTsKLQkJQ0RCRygiJXMgY2FtX2dwaW9fc2V0X3RibFslZF0uZmxhZ3MgPSAlbGRcbiIsIF9fZnVuY19fLCBpLAotCQkJZ2NvbmYtPmNhbV9ncGlvX3NldF90YmxbaV0uZmxhZ3MpOwotCX0KLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkob2Zfbm9kZSwgInFjb20sZ3Bpby1zZXQtdGJsLWRlbGF5IiwKLQkJdmFsX2FycmF5LCBjb3VudCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJZ290byBFUlJPUjI7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWdjb25mLT5jYW1fZ3Bpb19zZXRfdGJsW2ldLmRlbGF5ID0gdmFsX2FycmF5W2ldOwotCQlDREJHKCIlcyBjYW1fZ3Bpb19zZXRfdGJsWyVkXS5kZWxheSA9ICVkXG4iLCBfX2Z1bmNfXywgaSwKLQkJCWdjb25mLT5jYW1fZ3Bpb19zZXRfdGJsW2ldLmRlbGF5KTsKLQl9Ci0KLQlrZnJlZSh2YWxfYXJyYXkpOwotCXJldHVybiByYzsKLQotRVJST1IyOgotCWtmcmVlKGdjb25mLT5jYW1fZ3Bpb19zZXRfdGJsKTsKLUVSUk9SMToKLQlrZnJlZSh2YWxfYXJyYXkpOwotCWdjb25mLT5jYW1fZ3Bpb19zZXRfdGJsX3NpemUgPSAwOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXNtX3NlbnNvcl9pbml0X2dwaW9fdGxtbV90YmxfZGF0YShzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUsCi0Jc3RydWN0IG1zbV9jYW1lcmFfZ3Bpb19jb25mICpnY29uZiwgdWludDE2X3QgKmdwaW9fYXJyYXksCi0JdWludDE2X3QgZ3Bpb19hcnJheV9zaXplKQotewotCWludDMyX3QgcmMgPSAwLCBpID0gMDsKLQl1aW50MzJfdCBjb3VudCA9IDA7Ci0JdWludDMyX3QgKnZhbF9hcnJheSA9IE5VTEw7Ci0Jc3RydWN0IGdwaW9fdGxtbV9jZmcgKnRsbW1fY2ZnID0gTlVMTDsKLQotCWlmICghb2ZfZ2V0X3Byb3BlcnR5KG9mX25vZGUsICJncGlvX3RsbW1fdGFibGVfbnVtIiwgJmNvdW50KSkKLQkJcmV0dXJuIDA7Ci0KLQljb3VudCAvPSBzaXplb2YodWludDMyX3QpOwotCi0JaWYgKCFjb3VudCkKLQkJcmV0dXJuIDA7Ci0KLQl2YWxfYXJyYXkgPSBremFsbG9jKHNpemVvZih1aW50MzJfdCkgKiBjb3VudCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2YWxfYXJyYXkpIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXRsbW1fY2ZnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGdwaW9fdGxtbV9jZmcpICogY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghdGxtbV9jZmcpIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBFUlJPUjE7Ci0JfQotCi0JZ2NvbmYtPmNhbWVyYV9vZmZfdGFibGUgPSBremFsbG9jKHNpemVvZih1aW50MzJfdCkgKiBjb3VudCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFnY29uZi0+Y2FtZXJhX29mZl90YWJsZSkgewotCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIEVSUk9SMjsKLQl9Ci0JZ2NvbmYtPmNhbWVyYV9vZmZfdGFibGVfc2l6ZSA9IGNvdW50OwotCi0JZ2NvbmYtPmNhbWVyYV9vbl90YWJsZSA9IGt6YWxsb2Moc2l6ZW9mKHVpbnQzMl90KSAqIGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWdjb25mLT5jYW1lcmFfb25fdGFibGUpIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBFUlJPUjM7Ci0JfQotCWdjb25mLT5jYW1lcmFfb25fdGFibGVfc2l6ZSA9IGNvdW50OwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShvZl9ub2RlLCAiZ3Bpb190bG1tX3RhYmxlX251bSIsCi0JCXZhbF9hcnJheSwgY291bnQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1I0OwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlpZiAodmFsX2FycmF5W2ldID49IGdwaW9fYXJyYXlfc2l6ZSkgewotCQkJcHJfZXJyKCIlcyBncGlvIHNldCB0YmwgaW5kZXggJWQgaW52YWxpZFxuIiwKLQkJCQlfX2Z1bmNfXywgdmFsX2FycmF5W2ldKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXRsbW1fY2ZnW2ldLmdwaW8gPSBncGlvX2FycmF5W3ZhbF9hcnJheVtpXV07Ci0JCUNEQkcoIiVzIHRsbW1fY2ZnWyVkXS5ncGlvID0gJWRcbiIsIF9fZnVuY19fLCBpLAotCQkJdGxtbV9jZmdbaV0uZ3Bpbyk7Ci0JfQotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShvZl9ub2RlLCAiZ3Bpb190bG1tX3RhYmxlX2RpciIsCi0JCXZhbF9hcnJheSwgY291bnQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1I0OwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQl0bG1tX2NmZ1tpXS5kaXIgPSB2YWxfYXJyYXlbaV07Ci0JCUNEQkcoIiVzIHRsbW1fY2ZnWyVkXS5kaXIgPSAlZFxuIiwgX19mdW5jX18sIGksCi0JCQl0bG1tX2NmZ1tpXS5kaXIpOwotCX0KLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkob2Zfbm9kZSwgImdwaW9fdGxtbV90YWJsZV9wdWxsIiwKLQkJdmFsX2FycmF5LCBjb3VudCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJZ290byBFUlJPUjQ7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCXRsbW1fY2ZnW2ldLnB1bGwgPSB2YWxfYXJyYXlbaV07Ci0JCUNEQkcoIiVzIHRsbW1fY2ZnWyVkXS5wdWxsID0gJWRcbiIsIF9fZnVuY19fLCBpLAotCQkJdGxtbV9jZmdbaV0ucHVsbCk7Ci0JfQotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShvZl9ub2RlLCAiZ3Bpb190bG1tX3RhYmxlX2RydnN0ciIsCi0JCXZhbF9hcnJheSwgY291bnQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1I0OwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQl0bG1tX2NmZ1tpXS5kcnZzdHIgPSB2YWxfYXJyYXlbaV07Ci0JCUNEQkcoIiVzIHRsbW1fY2ZnWyVkXS5kcnZzdHIgPSAlZFxuIiwgX19mdW5jX18sIGksCi0JCQl0bG1tX2NmZ1tpXS5kcnZzdHIpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWdjb25mLT5jYW1lcmFfb2ZmX3RhYmxlW2ldID0gR1BJT19DRkcodGxtbV9jZmdbaV0uZ3BpbywKLQkJCTAsIHRsbW1fY2ZnW2ldLmRpciwgdGxtbV9jZmdbaV0ucHVsbCwKLQkJCXRsbW1fY2ZnW2ldLmRydnN0cik7Ci0JCWdjb25mLT5jYW1lcmFfb25fdGFibGVbaV0gPSBHUElPX0NGRyh0bG1tX2NmZ1tpXS5ncGlvLAotCQkJMSwgdGxtbV9jZmdbaV0uZGlyLCB0bG1tX2NmZ1tpXS5wdWxsLAotCQkJdGxtbV9jZmdbaV0uZHJ2c3RyKTsKLQl9Ci0KLQlrZnJlZSh0bG1tX2NmZyk7Ci0Ja2ZyZWUodmFsX2FycmF5KTsKLQlyZXR1cm4gcmM7Ci0KLUVSUk9SNDoKLQlrZnJlZShnY29uZi0+Y2FtZXJhX29uX3RhYmxlKTsKLUVSUk9SMzoKLQlrZnJlZShnY29uZi0+Y2FtZXJhX29mZl90YWJsZSk7Ci1FUlJPUjI6Ci0Ja2ZyZWUodGxtbV9jZmcpOwotRVJST1IxOgotCWtmcmVlKHZhbF9hcnJheSk7Ci0JZ2NvbmYtPmNhbWVyYV9vZmZfdGFibGVfc2l6ZSA9IDA7Ci0JZ2NvbmYtPmNhbWVyYV9vbl90YWJsZV9zaXplID0gMDsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG1zbV9zZW5zb3JfaW5pdF9jc2lfZGF0YShzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUsCi0Jc3RydWN0ICBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzZW5zb3JkYXRhKQotewotCWludDMyX3QgcmMgPSAwLCBpID0gMDsKLQl1aW50MzJfdCBjb3VudCA9IDAsIHZhbCA9IDA7Ci0JdWludDMyX3QgKnZhbF9hcnJheSA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX3BsYXRmb3JtX2luZm8gKnBpbmZvID0KLQkJc2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm87Ci0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG9mX25vZGUsICJxY29tLGNzaS1pZiIsICZjb3VudCk7Ci0JQ0RCRygiJXMgcWNvbSxjc2ktaWYgJWQsIHJjICVkXG4iLCBfX2Z1bmNfXywgY291bnQsIHJjKTsKLQlpZiAocmMgPCAwIHx8ICFjb3VudCkKLQkJcmV0dXJuIHJjOwotCXNlbnNvcmRhdGEtPmNzaV9pZiA9IGNvdW50OwotCi0Jc2Vuc29yZGF0YS0+cGRhdGEgPSBremFsbG9jKHNpemVvZigKLQkJc3RydWN0IG1zbV9jYW1lcmFfZGV2aWNlX3BsYXRmb3JtX2RhdGEpICogY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghc2Vuc29yZGF0YS0+cGRhdGEpIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXZhbF9hcnJheSA9IGt6YWxsb2Moc2l6ZW9mKHVpbnQzMl90KSAqIGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZhbF9hcnJheSkgewotCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIEVSUk9SMTsKLQl9Ci0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KG9mX25vZGUsICJxY29tLGNzaWQtY29yZSIsIHZhbF9hcnJheSwKLQkJY291bnQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1IyOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlzZW5zb3JkYXRhLT5wZGF0YVtpXS5jc2lkX2NvcmUgPSB2YWxfYXJyYXlbaV07Ci0JCUNEQkcoIiVzIGNzaV9kYXRhWyVkXS5jc2lkX2NvcmUgPSAlZFxuIiwgX19mdW5jX18sIGksCi0JCQlzZW5zb3JkYXRhLT5wZGF0YVtpXS5jc2lkX2NvcmUpOwotCX0KLQotCXBpbmZvLT5jc2lfbGFuZV9wYXJhbXMgPSBremFsbG9jKAotCQlzaXplb2Yoc3RydWN0IG1zbV9jYW1lcmFfY3NpX2xhbmVfcGFyYW1zKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwaW5mby0+Y3NpX2xhbmVfcGFyYW1zKSB7Ci0JCXByX2VycigiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gRVJST1IyOwotCX0KLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIob2Zfbm9kZSwgInFjb20sY3NpLWxhbmUtYXNzaWduIiwgJnZhbCk7Ci0JQ0RCRygiJXMgcWNvbSxjc2ktbGFuZS1hc3NpZ24gJXgsIHJjICVkXG4iLCBfX2Z1bmNfXywgdmFsLCByYyk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJZ290byBFUlJPUjM7Ci0JfQotCXBpbmZvLT5jc2lfbGFuZV9wYXJhbXMtPmNzaV9sYW5lX2Fzc2lnbiA9IHZhbDsKLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIob2Zfbm9kZSwgInFjb20sY3NpLWxhbmUtbWFzayIsICZ2YWwpOwotCUNEQkcoIiVzIHFjb20sY3NpLWxhbmUtbWFzayAleCwgcmMgJWRcbiIsIF9fZnVuY19fLCB2YWwsIHJjKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlnb3RvIEVSUk9SMzsKLQl9Ci0JcGluZm8tPmNzaV9sYW5lX3BhcmFtcy0+Y3NpX2xhbmVfbWFzayA9IHZhbDsKLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIob2Zfbm9kZSwgInFjb20sY3NpLXBoeS1zZWwiLCAmdmFsKTsKLQlDREJHKCIlcyBxY29tLGNzaS1waHktc2VsICV4LCByYyAlZFxuIiwgX19mdW5jX18sIHZhbCwgcmMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1IzOwotCX0KLQlzZW5zb3JkYXRhLT5wZGF0YS0+Y3NpcGh5X2NvcmUgPSB2YWw7Ci0Ja2ZyZWUodmFsX2FycmF5KTsKLQlyZXR1cm4gcmM7Ci1FUlJPUjM6Ci0Ja2ZyZWUocGluZm8tPmNzaV9sYW5lX3BhcmFtcyk7Ci1FUlJPUjI6Ci0Ja2ZyZWUodmFsX2FycmF5KTsKLUVSUk9SMToKLQlrZnJlZShzZW5zb3JkYXRhLT5wZGF0YSk7Ci0Jc2Vuc29yZGF0YS0+Y3NpX2lmID0gMDsKLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50MzJfdCBtc21fc2Vuc29yX2luaXRfYWN0dWF0b3JfZGF0YShzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUsCi0Jc3RydWN0ICBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzZW5zb3JkYXRhKQotewotCWludDMyX3QgcmMgPSAwOwotCXVpbnQzMl90IHZhbCA9IDA7Ci0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG9mX25vZGUsICJxY29tLGFjdHVhdG9yLWNhbS1uYW1lIiwgJnZhbCk7Ci0JQ0RCRygiJXMgcWNvbSxhY3R1YXRvci1jYW0tbmFtZSAlZCwgcmMgJWRcbiIsIF9fZnVuY19fLCB2YWwsIHJjKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gMDsKLQotCXNlbnNvcmRhdGEtPmFjdHVhdG9yX2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2FjdHVhdG9yX2luZm8pLAotCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXNlbnNvcmRhdGEtPmFjdHVhdG9yX2luZm8pIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBFUlJPUjsKLQl9Ci0KLQlzZW5zb3JkYXRhLT5hY3R1YXRvcl9pbmZvLT5jYW1fbmFtZSA9IHZhbDsKLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIob2Zfbm9kZSwgInFjb20sYWN0dWF0b3ItdmNtLXB3ZCIsICZ2YWwpOwotCUNEQkcoIiVzIHFjb20sYWN0dWF0b3ItdmNtLXB3ZCAlZCwgcmMgJWRcbiIsIF9fZnVuY19fLCB2YWwsIHJjKTsKLQlpZiAoIXJjKQotCQlzZW5zb3JkYXRhLT5hY3R1YXRvcl9pbmZvLT52Y21fcHdkID0gdmFsOwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihvZl9ub2RlLCAicWNvbSxhY3R1YXRvci12Y20tZW5hYmxlIiwgJnZhbCk7Ci0JQ0RCRygiJXMgcWNvbSxhY3R1YXRvci12Y20tZW5hYmxlICVkLCByYyAlZFxuIiwgX19mdW5jX18sIHZhbCwgcmMpOwotCWlmICghcmMpCi0JCXNlbnNvcmRhdGEtPmFjdHVhdG9yX2luZm8tPnZjbV9lbmFibGUgPSB2YWw7Ci0KLQlyZXR1cm4gMDsKLUVSUk9SOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgbXNtX3NlbnNvcl9pbml0X3NlbnNvcl9kYXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0Jc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwpCi17Ci0JaW50MzJfdCByYyA9IDAsIGkgPSAwOwotCXVpbnQzMl90IHZhbCA9IDA7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX3BsYXRmb3JtX2luZm8gKnBpbmZvID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9ncGlvX2NvbmYgKmdjb25mID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2Vuc29yZGF0YSA9IE5VTEw7Ci0JdWludDE2X3QgKmdwaW9fYXJyYXkgPSBOVUxMOwotCXVpbnQxNl90IGdwaW9fYXJyYXlfc2l6ZSA9IDA7Ci0KLQlzX2N0cmwtPnNlbnNvcmRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyksCi0JCUdGUF9LRVJORUwpOwotCWlmICghc19jdHJsLT5zZW5zb3JkYXRhKSB7Ci0JCXByX2VycigiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlzZW5zb3JkYXRhID0gc19jdHJsLT5zZW5zb3JkYXRhOwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhvZl9ub2RlLCAicWNvbSxzZW5zb3ItbmFtZSIsCi0JCSZzZW5zb3JkYXRhLT5zZW5zb3JfbmFtZSk7Ci0JQ0RCRygiJXMgcWNvbSxzZW5zb3ItbmFtZSAlcywgcmMgJWRcbiIsIF9fZnVuY19fLAotCQlzZW5zb3JkYXRhLT5zZW5zb3JfbmFtZSwgcmMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1IxOwotCX0KLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIob2Zfbm9kZSwgInFjb20sY2FtZXJhLXR5cGUiLCAmdmFsKTsKLQlDREJHKCIlcyBxY29tLGNhbWVyYS10eXBlICVkLCByYyAlZFxuIiwgX19mdW5jX18sIHZhbCwgcmMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1IxOwotCX0KLQlzZW5zb3JkYXRhLT5jYW1lcmFfdHlwZSA9IHZhbDsKLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIob2Zfbm9kZSwgInFjb20sc2Vuc29yLXR5cGUiLCAmdmFsKTsKLQlDREJHKCIlcyBxY29tLHNlbnNvci10eXBlICVkLCByYyAlZFxuIiwgX19mdW5jX18sIHZhbCwgcmMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1IxOwotCX0KLQlzZW5zb3JkYXRhLT5zZW5zb3JfdHlwZSA9IHZhbDsKLQotCXJjID0gbXNtX3NlbnNvcl9pbml0X2ZsYXNoX2RhdGEob2Zfbm9kZSwgc2Vuc29yZGF0YSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJZ290byBFUlJPUjE7Ci0JfQotCi0Jc2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8gPSBremFsbG9jKHNpemVvZigKLQkJc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX3BsYXRmb3JtX2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvKSB7Ci0JCXByX2VycigiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gRVJST1IxOwotCX0KLQotCXBpbmZvID0gc2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm87Ci0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG9mX25vZGUsICJxY29tLG1vdW50LWFuZ2xlIiwKLQkJJnBpbmZvLT5tb3VudF9hbmdsZSk7Ci0JQ0RCRygiJXMgcWNvbSxtb3VudC1hbmdsZSAlZCwgcmMgJWRcbiIsIF9fZnVuY19fLCBwaW5mby0+bW91bnRfYW5nbGUsCi0JCXJjKTsKLQlpZiAocmMgPCAwKSB7Ci0JCS8qIFNldCBkZWZhdWx0IG1vdW50IGFuZ2xlICovCi0JCXBpbmZvLT5tb3VudF9hbmdsZSA9IDA7Ci0JCXJjID0gMDsKLQl9Ci0KLQlyYyA9IG1zbV9zZW5zb3JfaW5pdF9jc2lfZGF0YShvZl9ub2RlLCBzZW5zb3JkYXRhKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlnb3RvIEVSUk9SMjsKLQl9Ci0KLQlyYyA9IG1zbV9zZW5zb3JfaW5pdF92cmVnX2RhdGEob2Zfbm9kZSwgcGluZm8pOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1IzOwotCX0KLQotCXBpbmZvLT5ncGlvX2NvbmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2NhbWVyYV9ncGlvX2NvbmYpLAotCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXBpbmZvLT5ncGlvX2NvbmYpIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBFUlJPUjQ7Ci0JfQotCWdjb25mID0gcGluZm8tPmdwaW9fY29uZjsKLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG9mX25vZGUsICJxY29tLGdwaW8tbm8tbXV4IiwKLQkJJmdjb25mLT5ncGlvX25vX211eCk7Ci0JQ0RCRygiJXMgZ2NvbmYtPmdwaW9fbm9fbXV4ICVkLCByYyAlZFxuIiwgX19mdW5jX18sCi0JCWdjb25mLT5ncGlvX25vX211eCwgcmMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWdvdG8gRVJST1I1OwotCX0KLQotCWdwaW9fYXJyYXlfc2l6ZSA9IG9mX2dwaW9fY291bnQob2Zfbm9kZSk7Ci0JQ0RCRygiJXMgZ3BpbyBjb3VudCAlZFxuIiwgX19mdW5jX18sIGdwaW9fYXJyYXlfc2l6ZSk7Ci0KLQlpZiAoZ3Bpb19hcnJheV9zaXplKSB7Ci0JCWdwaW9fYXJyYXkgPSBremFsbG9jKHNpemVvZih1aW50MTZfdCkgKiBncGlvX2FycmF5X3NpemUsCi0JCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCFncGlvX2FycmF5KSB7Ci0JCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJCWdvdG8gRVJST1I1OwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBncGlvX2FycmF5X3NpemU7IGkrKykgewotCQkJZ3Bpb19hcnJheVtpXSA9IG9mX2dldF9ncGlvKG9mX25vZGUsIGkpOwotCQkJQ0RCRygiJXMgZ3Bpb19hcnJheVslZF0gPSAlZFxuIiwgX19mdW5jX18sIGksCi0JCQkJZ3Bpb19hcnJheVtpXSk7Ci0JCX0KLQotCQlyYyA9IG1zbV9zZW5zb3JfaW5pdF9ncGlvX2NvbW1vbl90YmxfZGF0YShvZl9ub2RlLCBnY29uZiwKLQkJCWdwaW9fYXJyYXksIGdwaW9fYXJyYXlfc2l6ZSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJZ290byBFUlJPUjU7Ci0JCX0KLQotCQlyYyA9IG1zbV9zZW5zb3JfaW5pdF9ncGlvX3JlcV90YmxfZGF0YShvZl9ub2RlLCBnY29uZiwKLQkJCWdwaW9fYXJyYXksIGdwaW9fYXJyYXlfc2l6ZSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJZ290byBFUlJPUjY7Ci0JCX0KLQotCQlyYyA9IG1zbV9zZW5zb3JfaW5pdF9ncGlvX3NldF90YmxfZGF0YShvZl9ub2RlLCBnY29uZiwKLQkJCWdwaW9fYXJyYXksIGdwaW9fYXJyYXlfc2l6ZSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJZ290byBFUlJPUjc7Ci0JCX0KLQotCQlyYyA9IG1zbV9zZW5zb3JfaW5pdF9ncGlvX3RsbW1fdGJsX2RhdGEob2Zfbm9kZSwgZ2NvbmYsCi0JCQlncGlvX2FycmF5LCBncGlvX2FycmF5X3NpemUpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJCWdvdG8gRVJST1I4OwotCQl9Ci0JfQotCXJjID0gbXNtX3NlbnNvcl9pbml0X2FjdHVhdG9yX2RhdGEob2Zfbm9kZSwgc2Vuc29yZGF0YSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJZ290byBFUlJPUjk7Ci0JfQotCi0Ja2ZyZWUoZ3Bpb19hcnJheSk7Ci0JcmV0dXJuIHJjOwotCi1FUlJPUjk6Ci0Ja2ZyZWUoc19jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+Z3Bpb19jb25mLT4KLQkJY2FtZXJhX29uX3RhYmxlKTsKLQlrZnJlZShzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5ncGlvX2NvbmYtPgotCQljYW1lcmFfb2ZmX3RhYmxlKTsKLUVSUk9SODoKLQlrZnJlZShzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5ncGlvX2NvbmYtPgotCQljYW1fZ3Bpb19zZXRfdGJsKTsKLUVSUk9SNzoKLQlrZnJlZShzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5ncGlvX2NvbmYtPgotCQljYW1fZ3Bpb19yZXFfdGJsKTsKLUVSUk9SNjoKLQlrZnJlZShzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5ncGlvX2NvbmYtPgotCQljYW1fZ3Bpb19jb21tb25fdGJsKTsKLUVSUk9SNToKLQlrZnJlZShzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5ncGlvX2NvbmYpOwotRVJST1I0OgotCWtmcmVlKHNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmNhbV92cmVnKTsKLUVSUk9SMzoKLQlrZnJlZShzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5jc2lfbGFuZV9wYXJhbXMpOwotCWtmcmVlKHNfY3RybC0+c2Vuc29yZGF0YS0+cGRhdGEpOwotRVJST1IyOgotCWtmcmVlKHNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8pOwotCWtmcmVlKHNfY3RybC0+c2Vuc29yZGF0YS0+Zmxhc2hfZGF0YSk7Ci1FUlJPUjE6Ci0Ja2ZyZWUoc19jdHJsLT5zZW5zb3JkYXRhKTsKLQlrZnJlZShncGlvX2FycmF5KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9mcmVlX3NlbnNvcl9kYXRhKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsKQotewotCWlmICghc19jdHJsLT5wZGV2KQotCQlyZXR1cm4gMDsKLQlrZnJlZShzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5ncGlvX2NvbmYtPgotCQljYW1lcmFfb25fdGFibGUpOwotCWtmcmVlKHNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmdwaW9fY29uZi0+Ci0JCWNhbWVyYV9vZmZfdGFibGUpOwotCWtmcmVlKHNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmdwaW9fY29uZi0+Ci0JCWNhbV9ncGlvX3NldF90YmwpOwotCWtmcmVlKHNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmdwaW9fY29uZi0+Ci0JCWNhbV9ncGlvX3JlcV90YmwpOwotCWtmcmVlKHNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmdwaW9fY29uZi0+Ci0JCWNhbV9ncGlvX2NvbW1vbl90YmwpOwotCWtmcmVlKHNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmdwaW9fY29uZik7Ci0Ja2ZyZWUoc19jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+Y2FtX3ZyZWcpOwotCWtmcmVlKHNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmNzaV9sYW5lX3BhcmFtcyk7Ci0Ja2ZyZWUoc19jdHJsLT5zZW5zb3JkYXRhLT5wZGF0YSk7Ci0Ja2ZyZWUoc19jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mbyk7Ci0Ja2ZyZWUoc19jdHJsLT5zZW5zb3JkYXRhLT5mbGFzaF9kYXRhKTsKLQlrZnJlZShzX2N0cmwtPnNlbnNvcmRhdGEpOwotCXJldHVybiAwOwotfQotCi1pbnQzMl90IG1zbV9zZW5zb3JfcG93ZXJfdXAoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEgPSBzX2N0cmwtPnNlbnNvcmRhdGE7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKLQlpZiAoc19jdHJsLT5zZW5zb3JfZGV2aWNlX3R5cGUgPT0gTVNNX1NFTlNPUl9QTEFURk9STV9ERVZJQ0UpCi0JCWRldiA9ICZzX2N0cmwtPnBkZXYtPmRldjsKLQllbHNlCi0JCWRldiA9ICZzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LT5jbGllbnQtPmRldjsKLQlzX2N0cmwtPnJlZ19wdHIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yICopCi0JCQkqIGRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5udW1fdnJlZywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzX2N0cmwtPnJlZ19wdHIpIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGFsbG9jYXRlIG1lbSBmb3IgcmVndWxhdG9yc1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcmMgPSBtc21fY2FtZXJhX3JlcXVlc3RfZ3Bpb190YWJsZShkYXRhLCAxKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IHJlcXVlc3QgZ3BpbyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byByZXF1ZXN0X2dwaW9fZmFpbGVkOwotCX0KLQotCXJjID0gbXNtX2NhbWVyYV9jb25maWdfdnJlZyhkZXYsCi0JCXNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmNhbV92cmVnLAotCQlzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5udW1fdnJlZywKLQkJc19jdHJsLT52cmVnX3NlcSwKLQkJc19jdHJsLT5udW1fdnJlZ19zZXEsCi0JCXNfY3RybC0+cmVnX3B0ciwgMSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiByZWd1bGF0b3Igb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gY29uZmlnX3ZyZWdfZmFpbGVkOwotCX0KLQotCXJjID0gbXNtX2NhbWVyYV9lbmFibGVfdnJlZyhkZXYsCi0JCXNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmNhbV92cmVnLAotCQlzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5udW1fdnJlZywKLQkJc19jdHJsLT52cmVnX3NlcSwKLQkJc19jdHJsLT5udW1fdnJlZ19zZXEsCi0JCXNfY3RybC0+cmVnX3B0ciwgMSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBlbmFibGUgcmVndWxhdG9yIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVuYWJsZV92cmVnX2ZhaWxlZDsKLQl9Ci0KLQlyYyA9IG1zbV9jYW1lcmFfY29uZmlnX2dwaW9fdGFibGUoZGF0YSwgMSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBjb25maWcgZ3BpbyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBjb25maWdfZ3Bpb19mYWlsZWQ7Ci0JfQotCi0JaWYgKHNfY3RybC0+c2Vuc29yX2RldmljZV90eXBlID09IE1TTV9TRU5TT1JfSTJDX0RFVklDRSkgewotCQlpZiAoc19jdHJsLT5jbGtfcmF0ZSAhPSAwKQotCQkJY2FtXzg5NjBfY2xrX2luZm8tPmNsa19yYXRlID0gc19jdHJsLT5jbGtfcmF0ZTsKLQotCQlyYyA9IG1zbV9jYW1fY2xrX2VuYWJsZShkZXYsIGNhbV84OTYwX2Nsa19pbmZvLAotCQkJc19jdHJsLT5jYW1fY2xrLCBBUlJBWV9TSVpFKGNhbV84OTYwX2Nsa19pbmZvKSwgMSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGNsayBlbmFibGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGVuYWJsZV9jbGtfZmFpbGVkOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmMgPSBtc21fY2FtX2Nsa19lbmFibGUoZGV2LCBjYW1fODk3NF9jbGtfaW5mbywKLQkJCXNfY3RybC0+Y2FtX2NsaywgQVJSQVlfU0laRShjYW1fODk3NF9jbGtfaW5mbyksIDEpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBjbGsgZW5hYmxlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJZ290byBlbmFibGVfY2xrX2ZhaWxlZDsKLQkJfQotCX0KLQotCWlmICghc19jdHJsLT5wb3dlcl9zZXFfZGVsYXkpCi0JCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKLQllbHNlIGlmIChzX2N0cmwtPnBvd2VyX3NlcV9kZWxheSA8IDIwKQotCQl1c2xlZXBfcmFuZ2UoKHNfY3RybC0+cG93ZXJfc2VxX2RlbGF5ICogMTAwMCksCi0JCQkoKHNfY3RybC0+cG93ZXJfc2VxX2RlbGF5ICogMTAwMCkgKyAxMDAwKSk7Ci0JZWxzZQotCQltc2xlZXAoc19jdHJsLT5wb3dlcl9zZXFfZGVsYXkpOwotCi0JaWYgKGRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5leHRfcG93ZXJfY3RybCAhPSBOVUxMKQotCQlkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+ZXh0X3Bvd2VyX2N0cmwoMSk7Ci0KLQlpZiAoZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmkyY19jb25mICYmCi0JCWRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5pMmNfY29uZi0+dXNlX2kyY19tdXgpCi0JCW1zbV9zZW5zb3JfZW5hYmxlX2kyY19tdXgoZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmkyY19jb25mKTsKLQotCWlmIChzX2N0cmwtPnNlbnNvcl9kZXZpY2VfdHlwZSA9PSBNU01fU0VOU09SX1BMQVRGT1JNX0RFVklDRSkgewotCQlyYyA9IG1zbV9zZW5zb3JfY2NpX3V0aWwoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCU1TTV9DQ0lfSU5JVCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgY2NpX2luaXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGNjaV9pbml0X2ZhaWxlZDsKLQkJfQotCX0KLQlzX2N0cmwtPmN1cnJfcmVzID0gTVNNX1NFTlNPUl9JTlZBTElEX1JFUzsKLQlyZXR1cm4gcmM7Ci0KLWNjaV9pbml0X2ZhaWxlZDoKLQlpZiAoZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmkyY19jb25mICYmCi0JCWRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5pMmNfY29uZi0+dXNlX2kyY19tdXgpCi0JCW1zbV9zZW5zb3JfZGlzYWJsZV9pMmNfbXV4KAotCQkJZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmkyY19jb25mKTsKLWVuYWJsZV9jbGtfZmFpbGVkOgotCQltc21fY2FtZXJhX2NvbmZpZ19ncGlvX3RhYmxlKGRhdGEsIDApOwotY29uZmlnX2dwaW9fZmFpbGVkOgotCW1zbV9jYW1lcmFfZW5hYmxlX3ZyZWcoZGV2LAotCQkJc19jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+Y2FtX3ZyZWcsCi0JCQlzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5udW1fdnJlZywKLQkJCXNfY3RybC0+dnJlZ19zZXEsCi0JCQlzX2N0cmwtPm51bV92cmVnX3NlcSwKLQkJCXNfY3RybC0+cmVnX3B0ciwgMCk7Ci0KLWVuYWJsZV92cmVnX2ZhaWxlZDoKLQltc21fY2FtZXJhX2NvbmZpZ192cmVnKGRldiwKLQkJc19jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+Y2FtX3ZyZWcsCi0JCXNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPm51bV92cmVnLAotCQlzX2N0cmwtPnZyZWdfc2VxLAotCQlzX2N0cmwtPm51bV92cmVnX3NlcSwKLQkJc19jdHJsLT5yZWdfcHRyLCAwKTsKLWNvbmZpZ192cmVnX2ZhaWxlZDoKLQltc21fY2FtZXJhX3JlcXVlc3RfZ3Bpb190YWJsZShkYXRhLCAwKTsKLXJlcXVlc3RfZ3Bpb19mYWlsZWQ6Ci0Ja2ZyZWUoc19jdHJsLT5yZWdfcHRyKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9wb3dlcl9kb3duKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsKQotewotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhID0gc19jdHJsLT5zZW5zb3JkYXRhOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IE5VTEw7Ci0JaWYgKHNfY3RybC0+c2Vuc29yX2RldmljZV90eXBlID09IE1TTV9TRU5TT1JfUExBVEZPUk1fREVWSUNFKQotCQlkZXYgPSAmc19jdHJsLT5wZGV2LT5kZXY7Ci0JZWxzZQotCQlkZXYgPSAmc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudC0+Y2xpZW50LT5kZXY7Ci0JaWYgKHNfY3RybC0+c2Vuc29yX2RldmljZV90eXBlID09IE1TTV9TRU5TT1JfUExBVEZPUk1fREVWSUNFKSB7Ci0JCW1zbV9zZW5zb3JfY2NpX3V0aWwoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCU1TTV9DQ0lfUkVMRUFTRSk7Ci0JfQotCi0JaWYgKGRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5pMmNfY29uZiAmJgotCQlkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+aTJjX2NvbmYtPnVzZV9pMmNfbXV4KQotCQltc21fc2Vuc29yX2Rpc2FibGVfaTJjX211eCgKLQkJCWRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5pMmNfY29uZik7Ci0KLQlpZiAoZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmV4dF9wb3dlcl9jdHJsICE9IE5VTEwpCi0JCWRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5leHRfcG93ZXJfY3RybCgwKTsKLQlpZiAoc19jdHJsLT5zZW5zb3JfZGV2aWNlX3R5cGUgPT0gTVNNX1NFTlNPUl9JMkNfREVWSUNFKQotCQltc21fY2FtX2Nsa19lbmFibGUoZGV2LCBjYW1fODk2MF9jbGtfaW5mbywgc19jdHJsLT5jYW1fY2xrLAotCQkJQVJSQVlfU0laRShjYW1fODk2MF9jbGtfaW5mbyksIDApOwotCWVsc2UKLQkJbXNtX2NhbV9jbGtfZW5hYmxlKGRldiwgY2FtXzg5NzRfY2xrX2luZm8sIHNfY3RybC0+Y2FtX2NsaywKLQkJCUFSUkFZX1NJWkUoY2FtXzg5NzRfY2xrX2luZm8pLCAwKTsKLQltc21fY2FtZXJhX2NvbmZpZ19ncGlvX3RhYmxlKGRhdGEsIDApOwotCW1zbV9jYW1lcmFfZW5hYmxlX3ZyZWcoZGV2LAotCQlzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5jYW1fdnJlZywKLQkJc19jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+bnVtX3ZyZWcsCi0JCXNfY3RybC0+dnJlZ19zZXEsCi0JCXNfY3RybC0+bnVtX3ZyZWdfc2VxLAotCQlzX2N0cmwtPnJlZ19wdHIsIDApOwotCW1zbV9jYW1lcmFfY29uZmlnX3ZyZWcoZGV2LAotCQlzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5jYW1fdnJlZywKLQkJc19jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+bnVtX3ZyZWcsCi0JCXNfY3RybC0+dnJlZ19zZXEsCi0JCXNfY3RybC0+bnVtX3ZyZWdfc2VxLAotCQlzX2N0cmwtPnJlZ19wdHIsIDApOwotCW1zbV9jYW1lcmFfcmVxdWVzdF9ncGlvX3RhYmxlKGRhdGEsIDApOwotCWtmcmVlKHNfY3RybC0+cmVnX3B0cik7Ci0Jc19jdHJsLT5jdXJyX3JlcyA9IE1TTV9TRU5TT1JfSU5WQUxJRF9SRVM7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9tYXRjaF9pZChzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1aW50MTZfdCBjaGlwaWQgPSAwOwotCXJjID0gbXNtX2NhbWVyYV9pMmNfcmVhZCgKLQkJCXNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCQlzX2N0cmwtPnNlbnNvcl9pZF9pbmZvLT5zZW5zb3JfaWRfcmVnX2FkZHIsICZjaGlwaWQsCi0JCQlNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEEpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogJXM6IHJlYWQgaWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywKLQkJCXNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX25hbWUpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JQ0RCRygiJXM6IHJlYWQgaWQ6ICV4IGV4cGVjdGVkIGlkICV4OlxuIiwgX19mdW5jX18sIGNoaXBpZCwKLQkJc19jdHJsLT5zZW5zb3JfaWRfaW5mby0+c2Vuc29yX2lkKTsKLQlpZiAoY2hpcGlkICE9IHNfY3RybC0+c2Vuc29yX2lkX2luZm8tPnNlbnNvcl9pZCkgewotCQlwcl9lcnIoIm1zbV9zZW5zb3JfbWF0Y2hfaWQgY2hpcCBpZCBkb2Vzbm90IG1hdGNoXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXJldHVybiByYzsKLX0KLQotaW50MzJfdCBtc21fc2Vuc29yX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsOwotCUNEQkcoIiVzICVzX2kyY19wcm9iZSBjYWxsZWRcbiIsIF9fZnVuY19fLCBjbGllbnQtPm5hbWUpOwotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7Ci0JCXByX2VycigiJXMgJXMgaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkgZmFpbGVkXG4iLAotCQkJX19mdW5jX18sIGNsaWVudC0+bmFtZSk7Ci0JCXJjID0gLUVGQVVMVDsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXNfY3RybCA9IChzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKikoaWQtPmRyaXZlcl9kYXRhKTsKLQlzX2N0cmwtPnNlbnNvcl9kZXZpY2VfdHlwZSA9IE1TTV9TRU5TT1JfSTJDX0RFVklDRTsKLQlpZiAoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCAhPSBOVUxMKSB7Ci0JCXNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQtPmNsaWVudCA9IGNsaWVudDsKLQkJaWYgKHNfY3RybC0+c2Vuc29yX2kyY19hZGRyICE9IDApCi0JCQlzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LT5jbGllbnQtPmFkZHIgPQotCQkJCXNfY3RybC0+c2Vuc29yX2kyY19hZGRyOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXMgJXMgc2Vuc29yX2kyY19jbGllbnQgTlVMTFxuIiwKLQkJCV9fZnVuY19fLCBjbGllbnQtPm5hbWUpOwotCQlyYyA9IC1FRkFVTFQ7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlzX2N0cmwtPnNlbnNvcmRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmIChzX2N0cmwtPnNlbnNvcmRhdGEgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzICVzIE5VTEwgc2Vuc29yIGRhdGFcbiIsIF9fZnVuY19fLCBjbGllbnQtPm5hbWUpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyYyA9IHNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9wb3dlcl91cChzX2N0cmwpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyAlcyBwb3dlciB1cCBmYWlsZWRcbiIsIF9fZnVuY19fLCBjbGllbnQtPm5hbWUpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKHNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9tYXRjaF9pZCkKLQkJcmMgPSBzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfbWF0Y2hfaWQoc19jdHJsKTsKLQllbHNlCi0JCXJjID0gbXNtX3NlbnNvcl9tYXRjaF9pZChzX2N0cmwpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gcHJvYmVfZmFpbDsKLQotCWlmICghc19jdHJsLT53YWl0X251bV9mcmFtZXMpCi0JCXNfY3RybC0+d2FpdF9udW1fZnJhbWVzID0gMSAqIFExMDsKLQotCXByX2VycigiJXMgJXMgcHJvYmUgc3VjY2VlZGVkXG4iLCBfX2Z1bmNfXywgY2xpZW50LT5uYW1lKTsKLQlzbnByaW50ZihzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldi5uYW1lLAotCQlzaXplb2Yoc19jdHJsLT5zZW5zb3JfdjRsMl9zdWJkZXYubmFtZSksICIlcyIsIGlkLT5uYW1lKTsKLQl2NGwyX2kyY19zdWJkZXZfaW5pdCgmc19jdHJsLT5zZW5zb3JfdjRsMl9zdWJkZXYsIGNsaWVudCwKLQkJc19jdHJsLT5zZW5zb3JfdjRsMl9zdWJkZXZfb3BzKTsKLQlzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldi5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKLQltZWRpYV9lbnRpdHlfaW5pdCgmc19jdHJsLT5zZW5zb3JfdjRsMl9zdWJkZXYuZW50aXR5LCAwLCBOVUxMLCAwKTsKLQlzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldi5lbnRpdHkudHlwZSA9IE1FRElBX0VOVF9UX1Y0TDJfU1VCREVWOwotCXNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2LmVudGl0eS5ncm91cF9pZCA9IFNFTlNPUl9ERVY7Ci0Jc19jdHJsLT5zZW5zb3JfdjRsMl9zdWJkZXYuZW50aXR5Lm5hbWUgPQotCQlzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldi5uYW1lOwotCW1zbV9zZW5zb3JfcmVnaXN0ZXIoJnNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2KTsKLQlzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldi5lbnRpdHkucmV2aXNpb24gPQotCQlzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldi5kZXZub2RlLT5udW07Ci0JZ290byBwb3dlcl9kb3duOwotcHJvYmVfZmFpbDoKLQlwcl9lcnIoIiVzICVzX2kyY19wcm9iZSBmYWlsZWRcbiIsIF9fZnVuY19fLCBjbGllbnQtPm5hbWUpOwotcG93ZXJfZG93bjoKLQlpZiAocmMgPiAwKQotCQlyYyA9IDA7Ci0Jc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX3Bvd2VyX2Rvd24oc19jdHJsKTsKLQlzX2N0cmwtPnNlbnNvcl9zdGF0ZSA9IE1TTV9TRU5TT1JfUE9XRVJfRE9XTjsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3NlbnNvcl9zdWJkZXZfbWF0Y2hfY29yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0JaW50IGNvcmVfaW5kZXggPSAoaW50KWRhdGE7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCUNEQkcoIiVzIGNjaSBwZGV2ICVwXG4iLCBfX2Z1bmNfXywgcGRldik7Ci0JaWYgKHBkZXYtPmlkID09IGNvcmVfaW5kZXgpCi0JCXJldHVybiAxOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB2b2lkICpkYXRhKQotewotCWludDMyX3QgcmMgPSAwOwotCXN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsID0gKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqKWRhdGE7Ci0Jc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlcjsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc19jdHJsLT5wZGV2ID0gcGRldjsKLQlDREJHKCIlcyBjYWxsZWQgZGF0YSAlcFxuIiwgX19mdW5jX18sIGRhdGEpOwotCWlmIChwZGV2LT5kZXYub2Zfbm9kZSkgewotCQlyYyA9IG1zbV9zZW5zb3JfaW5pdF9zZW5zb3JfZGF0YShwZGV2LCBzX2N0cmwpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzIGZhaWxlZCBsaW5lICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCXNfY3RybC0+c2Vuc29yX2RldmljZV90eXBlID0gTVNNX1NFTlNPUl9QTEFURk9STV9ERVZJQ0U7Ci0Jc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudC0+Y2NpX2NsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKAotCQlzdHJ1Y3QgbXNtX2NhbWVyYV9jY2lfY2xpZW50KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LT5jY2lfY2xpZW50KSB7Ci0JCXByX2VycigiJXMgZmFpbGVkIGxpbmUgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiByYzsKLQl9Ci0JZHJpdmVyID0gZHJpdmVyX2ZpbmQoTVNNX0NDSV9EUlZfTkFNRSwgJnBsYXRmb3JtX2J1c190eXBlKTsKLQlpZiAoIWRyaXZlcikgewotCQlwcl9lcnIoIiVzIGZhaWxlZCBsaW5lICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JZGV2ID0gZHJpdmVyX2ZpbmRfZGV2aWNlKGRyaXZlciwgTlVMTCwgMCwKLQkJCQltc21fc2Vuc29yX3N1YmRldl9tYXRjaF9jb3JlKTsKLQlpZiAoIWRldikgewotCQlwcl9lcnIoIiVzIGZhaWxlZCBsaW5lICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCXNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQtPmNjaV9jbGllbnQtPmNjaV9zdWJkZXYgPQotCQlkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlDREJHKCIlcyBzZCAlcFxuIiwgX19mdW5jX18sCi0JCXNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQtPmNjaV9jbGllbnQtPmNjaV9zdWJkZXYpOwotCXNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQtPmNjaV9jbGllbnQtPmNjaV9pMmNfbWFzdGVyID0gTUFTVEVSXzA7Ci0Jc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudC0+Y2NpX2NsaWVudC0+c2lkID0KLQkJc19jdHJsLT5zZW5zb3JfaTJjX2FkZHIgPj4gMTsKLQlzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LT5jY2lfY2xpZW50LT5yZXRyaWVzID0gMzsKLQlzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LT5jY2lfY2xpZW50LT5pZF9tYXAgPSAwOwotCWlmICghc19jdHJsLT53YWl0X251bV9mcmFtZXMpCi0JCXNfY3RybC0+d2FpdF9udW1fZnJhbWVzID0gMSAqIFExMDsKLQotCXJjID0gc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX3Bvd2VyX3VwKHNfY3RybCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzICVzIHBvd2VyIHVwIGZhaWxlZFxuIiwgX19mdW5jX18sCi0JCQlwZGV2LT5pZF9lbnRyeS0+bmFtZSk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlpZiAoc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX21hdGNoX2lkKQotCQlyYyA9IHNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9tYXRjaF9pZChzX2N0cmwpOwotCWVsc2UKLQkJcmMgPSBtc21fc2Vuc29yX21hdGNoX2lkKHNfY3RybCk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBwcm9iZV9mYWlsOwotCi0JcHJfZXJyKCIlcyAlcyBwcm9iZSBzdWNjZWVkZWRcbiIsIF9fZnVuY19fLAotCQlzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9uYW1lKTsKLQl2NGwyX3N1YmRldl9pbml0KCZzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldiwKLQkJc19jdHJsLT5zZW5zb3JfdjRsMl9zdWJkZXZfb3BzKTsKLQlzbnByaW50ZihzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldi5uYW1lLAotCQlzaXplb2Yoc19jdHJsLT5zZW5zb3JfdjRsMl9zdWJkZXYubmFtZSksICIlcyIsCi0JCXNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX25hbWUpOwotCXY0bDJfc2V0X3N1YmRldmRhdGEoJnNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2LCBwZGV2KTsKLQltc21fc2Vuc29yX3JlZ2lzdGVyKCZzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldik7Ci0KLQlnb3RvIHBvd2VyX2Rvd247Ci1wcm9iZV9mYWlsOgotCXByX2VycigiJXMgJXMgcHJvYmUgZmFpbGVkXG4iLCBfX2Z1bmNfXywgcGRldi0+aWRfZW50cnktPm5hbWUpOwotcG93ZXJfZG93bjoKLQlzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfcG93ZXJfZG93bihzX2N0cmwpOwotCXJldHVybiByYzsKLX0KLQotaW50MzJfdCBtc21fc2Vuc29yX3Bvd2VyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsID0gZ2V0X3NjdHJsKHNkKTsKLQltdXRleF9sb2NrKHNfY3RybC0+bXNtX3NlbnNvcl9tdXRleCk7Ci0JaWYgKG9uKSB7Ci0JCXJjID0gc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX3Bvd2VyX3VwKHNfY3RybCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6ICVzIHBvd2VyX3VwIGZhaWxlZCByYyA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQlzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9uYW1lLCByYyk7Ci0JCQlzX2N0cmwtPnNlbnNvcl9zdGF0ZSA9IE1TTV9TRU5TT1JfUE9XRVJfRE9XTjsKLQkJfSBlbHNlIHsKLQkJCWlmIChzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfbWF0Y2hfaWQpCi0JCQkJcmMgPSBzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfbWF0Y2hfaWQoc19jdHJsKTsKLQkJCWVsc2UKLQkJCQlyYyA9IG1zbV9zZW5zb3JfbWF0Y2hfaWQoc19jdHJsKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiAlcyBtYXRjaF9pZCBmYWlsZWQgIHJjPSVkXG4iLAotCQkJCQlfX2Z1bmNfXywKLQkJCQkJc19jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfbmFtZSwgcmMpOwotCQkJCWlmIChzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfcG93ZXJfZG93bihzX2N0cmwpCi0JCQkJCTwgMCkKLQkJCQkJcHJfZXJyKCIlczogJXMgcG93ZXJfZG93biBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fLAotCQkJCQlzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9uYW1lKTsKLQkJCQlzX2N0cmwtPnNlbnNvcl9zdGF0ZSA9IE1TTV9TRU5TT1JfUE9XRVJfRE9XTjsKLQkJCX0KLQkJCXNfY3RybC0+c2Vuc29yX3N0YXRlID0gTVNNX1NFTlNPUl9QT1dFUl9VUDsKLQkJfQotCX0gZWxzZSB7Ci0JCXJjID0gc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX3Bvd2VyX2Rvd24oc19jdHJsKTsKLQkJc19jdHJsLT5zZW5zb3Jfc3RhdGUgPSBNU01fU0VOU09SX1BPV0VSX0RPV047Ci0JfQotCW11dGV4X3VubG9jayhzX2N0cmwtPm1zbV9zZW5zb3JfbXV0ZXgpOwotCXJldHVybiByYzsKLX0KLQotaW50MzJfdCBtc21fc2Vuc29yX3Y0bDJfZW51bV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdW5zaWduZWQgaW50IGluZGV4LAotCQkJICAgZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlICpjb2RlKQotewotCXN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsID0gZ2V0X3NjdHJsKHNkKTsKLQotCWlmICgodW5zaWduZWQgaW50KWluZGV4ID49IHNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2X2luZm9fc2l6ZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkqY29kZSA9IHNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2X2luZm9baW5kZXhdLmNvZGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludDMyX3QgbXNtX3NlbnNvcl92NGwyX3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0JaW50IHJjID0gLTEsIGkgPSAwOwotCXN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsID0gZ2V0X3NjdHJsKHNkKTsKLQlzdHJ1Y3QgbXNtX3NlbnNvcl92NGwyX2N0cmxfaW5mb190ICp2NGwyX2N0cmwgPQotCQlzX2N0cmwtPm1zbV9zZW5zb3JfdjRsMl9jdHJsX2luZm87Ci0KLQlDREJHKCIlc1xuIiwgX19mdW5jX18pOwotCUNEQkcoIiVkXG4iLCBjdHJsLT5pZCk7Ci0JaWYgKHY0bDJfY3RybCA9PSBOVUxMKQotCQlyZXR1cm4gcmM7Ci0JZm9yIChpID0gMDsgaSA8IHNfY3RybC0+bnVtX3Y0bDJfY3RybDsgaSsrKSB7Ci0JCWlmICh2NGwyX2N0cmxbaV0uY3RybF9pZCA9PSBjdHJsLT5pZCkgewotCQkJaWYgKHY0bDJfY3RybFtpXS5zX3Y0bDJfY3RybCAhPSBOVUxMKSB7Ci0JCQkJQ0RCRygiXG4gY2FsbGluZyBtc21fc2Vuc29yX3NfY3RybF9ieV9lbnVtXG4iKTsKLQkJCQlyYyA9IHY0bDJfY3RybFtpXS5zX3Y0bDJfY3RybCgKLQkJCQkJc19jdHJsLAotCQkJCQkmc19jdHJsLT5tc21fc2Vuc29yX3Y0bDJfY3RybF9pbmZvW2ldLAotCQkJCQljdHJsLT52YWx1ZSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByYzsKLX0KLQotaW50MzJfdCBtc21fc2Vuc29yX3Y0bDJfcXVlcnlfY3RybCgKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsKQotewotCWludCByYyA9IC0xLCBpID0gMDsKLQlzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCA9Ci0JCShzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKikgc2QtPmRldl9wcml2OwotCi0JQ0RCRygiJXNcbiIsIF9fZnVuY19fKTsKLQlDREJHKCIlcyBpZDogJWRcbiIsIF9fZnVuY19fLCBxY3RybC0+aWQpOwotCi0JaWYgKHNfY3RybC0+bXNtX3NlbnNvcl92NGwyX2N0cmxfaW5mbyA9PSBOVUxMKQotCQlyZXR1cm4gcmM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc19jdHJsLT5udW1fdjRsMl9jdHJsOyBpKyspIHsKLQkJaWYgKHNfY3RybC0+bXNtX3NlbnNvcl92NGwyX2N0cmxfaW5mb1tpXS5jdHJsX2lkID09IHFjdHJsLT5pZCkgewotCQkJcWN0cmwtPm1pbmltdW0gPQotCQkJCXNfY3RybC0+bXNtX3NlbnNvcl92NGwyX2N0cmxfaW5mb1tpXS5taW47Ci0JCQlxY3RybC0+bWF4aW11bSA9Ci0JCQkJc19jdHJsLT5tc21fc2Vuc29yX3Y0bDJfY3RybF9pbmZvW2ldLm1heDsKLQkJCXFjdHJsLT5mbGFncyA9IDE7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9zZW5zb3Jfc19jdHJsX2J5X2VudW0oc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JCXN0cnVjdCBtc21fc2Vuc29yX3Y0bDJfY3RybF9pbmZvX3QgKmN0cmxfaW5mbywgaW50IHZhbHVlKQotewotCWludCByYyA9IDA7Ci0JQ0RCRygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKLQlyYyA9IG1zbV9zZW5zb3Jfd3JpdGVfZW51bV9jb25mX2FycmF5KAotCQlzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQljdHJsX2luZm8tPmVudW1fY2ZnX3NldHRpbmdzLCB2YWx1ZSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9zZW5zb3JfZGVidWdmc19zdHJlYW1fcyh2b2lkICpkYXRhLCB1NjQgdmFsKQotewotCXN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsID0gKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqKSBkYXRhOwotCWlmICh2YWwpCi0JCXNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9zdGFydF9zdHJlYW0oc19jdHJsKTsKLQllbHNlCi0JCXNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9zdG9wX3N0cmVhbShzX2N0cmwpOwotCXJldHVybiAwOwotfQotCi1ERUZJTkVfU0lNUExFX0FUVFJJQlVURShzZW5zb3JfZGVidWdmc19zdHJlYW0sIE5VTEwsCi0JCQltc21fc2Vuc29yX2RlYnVnZnNfc3RyZWFtX3MsICIlbGx1XG4iKTsKLQotc3RhdGljIGludCBtc21fc2Vuc29yX2RlYnVnZnNfdGVzdF9zKHZvaWQgKmRhdGEsIHU2NCB2YWwpCi17Ci0JQ0RCRygidmFsOiAlbGx1XG4iLCB2YWwpOwotCXJldHVybiAwOwotfQotCi1ERUZJTkVfU0lNUExFX0FUVFJJQlVURShzZW5zb3JfZGVidWdmc190ZXN0LCBOVUxMLAotCQkJbXNtX3NlbnNvcl9kZWJ1Z2ZzX3Rlc3RfcywgIiVsbHVcbiIpOwotCi1pbnQgbXNtX3NlbnNvcl9lbmFibGVfZGVidWdmcyhzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCkKLXsKLQlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2Jhc2UsICpzZW5zb3JfZGlyOwotCWRlYnVnZnNfYmFzZSA9IGRlYnVnZnNfY3JlYXRlX2RpcigibXNtX3NlbnNvciIsIE5VTEwpOwotCWlmICghZGVidWdmc19iYXNlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNlbnNvcl9kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIKLQkJKHNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX25hbWUsIGRlYnVnZnNfYmFzZSk7Ci0JaWYgKCFzZW5zb3JfZGlyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmICghZGVidWdmc19jcmVhdGVfZmlsZSgic3RyZWFtIiwgU19JUlVHTyB8IFNfSVdVU1IsIHNlbnNvcl9kaXIsCi0JCQkodm9pZCAqKSBzX2N0cmwsICZzZW5zb3JfZGVidWdmc19zdHJlYW0pKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmICghZGVidWdmc19jcmVhdGVfZmlsZSgidGVzdCIsIFNfSVJVR08gfCBTX0lXVVNSLCBzZW5zb3JfZGlyLAotCQkJKHZvaWQgKikgc19jdHJsLCAmc2Vuc29yX2RlYnVnZnNfdGVzdCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9tc21fc2Vuc29yLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9tc21fc2Vuc29yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNDQxOTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvbXNtX3NlbnNvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgTVNNX1NFTlNPUl9ICi0jZGVmaW5lIE1TTV9TRU5TT1JfSAotCi0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtZWRpYS9tc21fY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KLSNpbmNsdWRlICJtc21fY2FtZXJhX2kyYy5oIgotI2luY2x1ZGUgIm1zbV9jYW1lcmFfZWVwcm9tLmgiCi0jaW5jbHVkZSAibXNtX3NlbnNvcl9jb21tb24uaCIKLQotdm9pZCBtc21fc2Vuc29yX3N0YXJ0X3N0cmVhbShzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCk7Ci12b2lkIG1zbV9zZW5zb3Jfc3RvcF9zdHJlYW0oc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwpOwotdm9pZCBtc21fc2Vuc29yX2dyb3VwX2hvbGRfb24oc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwpOwotdm9pZCBtc21fc2Vuc29yX2dyb3VwX2hvbGRfb2ZmKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsKTsKLQotaW50MzJfdCBtc21fc2Vuc29yX3NldF9mcHMoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JCQlzdHJ1Y3QgZnBzX2NmZyAgICpmcHMpOwotaW50MzJfdCBtc21fc2Vuc29yX3dyaXRlX2V4cF9nYWluMShzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwKLQkJdWludDE2X3QgZ2FpbiwgdWludDMyX3QgbGluZSk7Ci1pbnQzMl90IG1zbV9zZW5zb3Jfd3JpdGVfZXhwX2dhaW4yKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCQl1aW50MTZfdCBnYWluLCB1aW50MzJfdCBsaW5lKTsKLWludDMyX3QgbXNtX3NlbnNvcl9zZXRfc2Vuc29yX21vZGUoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JaW50IG1vZGUsIGludCByZXMpOwotaW50MzJfdCBtc21fc2Vuc29yX21vZGVfaW5pdChzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwKLQkJCWludCBtb2RlLCBzdHJ1Y3Qgc2Vuc29yX2luaXRfY2ZnICppbml0X2luZm8pOwotaW50MzJfdCBtc21fc2Vuc29yX2dldF9vdXRwdXRfaW5mbyhzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKiwKLQkJc3RydWN0IHNlbnNvcl9vdXRwdXRfaW5mb190ICopOwotaW50MzJfdCBtc21fc2Vuc29yX2NvbmZpZyhzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwKLQkJCXZvaWQgX191c2VyICphcmdwKTsKLWludDMyX3QgbXNtX3NlbnNvcl9wb3dlcl91cChzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCk7Ci1pbnQzMl90IG1zbV9zZW5zb3JfcG93ZXJfZG93bihzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCk7Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9tYXRjaF9pZChzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCk7Ci1pbnQgbXNtX3NlbnNvcl9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpOwotCi1pbnQzMl90IG1zbV9zZW5zb3JfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgdm9pZCAqZGF0YSk7Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9wb3dlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgb24pOwotCi1pbnQzMl90IG1zbV9zZW5zb3JfdjRsMl9zX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKTsKLQotaW50MzJfdCBtc21fc2Vuc29yX3Y0bDJfcXVlcnlfY3RybCgKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsKTsKLQotaW50IG1zbV9zZW5zb3Jfc19jdHJsX2J5X2luZGV4KHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCXN0cnVjdCBtc21fc2Vuc29yX3Y0bDJfY3RybF9pbmZvX3QgKmN0cmxfaW5mbywgaW50IHZhbHVlKTsKLQotaW50IG1zbV9zZW5zb3Jfc19jdHJsX2J5X2VudW0oc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JCXN0cnVjdCBtc21fc2Vuc29yX3Y0bDJfY3RybF9pbmZvX3QgKmN0cmxfaW5mbywgaW50IHZhbHVlKTsKLQotaW50IG1zbV9zZW5zb3JfdjRsMl9lbnVtX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1bnNpZ25lZCBpbnQgaW5kZXgsCi0JCQllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgKmNvZGUpOwotCi1pbnQgbXNtX3NlbnNvcl93cml0ZV9pbml0X3NldHRpbmdzKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsKTsKLWludCBtc21fc2Vuc29yX3dyaXRlX3Jlc19zZXR0aW5ncwotCShzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwgdWludDE2X3QgcmVzKTsKLQotaW50MzJfdCBtc21fc2Vuc29yX3dyaXRlX291dHB1dF9zZXR0aW5ncyhzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwKLQl1aW50MTZfdCByZXMpOwotCi12b2lkIG1zbV9zZW5zb3JfYWRqdXN0X2ZyYW1lX2xpbmVzMShzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCk7Ci0KLXZvaWQgbXNtX3NlbnNvcl9hZGp1c3RfZnJhbWVfbGluZXMyKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsKTsKLQotaW50MzJfdCBtc21fc2Vuc29yX3NldHRpbmcoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JCQlpbnQgdXBkYXRlX3R5cGUsIGludCByZXMpOwotCi1pbnQzMl90IG1zbV9zZW5zb3Jfc2V0dGluZzEoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JCQlpbnQgdXBkYXRlX3R5cGUsIGludCByZXMpOwotCi1pbnQgbXNtX3NlbnNvcl9lbmFibGVfZGVidWdmcyhzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCk7Ci0KLWxvbmcgbXNtX3NlbnNvcl9zdWJkZXZfaW9jdGwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9nZXRfY3NpX3BhcmFtcyhzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwKLQkJc3RydWN0IGNzaV9sYW5lX3BhcmFtc190ICpzZW5zb3Jfb3V0cHV0X2luZm8pOwotCi1zdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKmdldF9zY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKTsKLWludDMyX3QgbXNtX3NlbnNvcl9mcmVlX3NlbnNvcl9kYXRhKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsKTsKLQotI2RlZmluZSBWSURJT0NfTVNNX1NFTlNPUl9DRkcgXAotCV9JT1dSKCdWJywgQkFTRV9WSURJT0NfUFJJVkFURSArIDQsIHZvaWQgX191c2VyICopCi0KLSNkZWZpbmUgVklESU9DX01TTV9TRU5TT1JfUkVMRUFTRSBcCi0JX0lPKCdWJywgQkFTRV9WSURJT0NfUFJJVkFURSArIDExKQotCi0jZGVmaW5lIFZJRElPQ19NU01fU0VOU09SX0NTSURfSU5GT1wKLQlfSU9XUignVicsIEJBU0VfVklESU9DX1BSSVZBVEUgKyAxMiwgc3RydWN0IG1zbV9zZW5zb3JfY3NpX2luZm8gKikKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9tc21fc2Vuc29yX2JheWVyLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9tc21fc2Vuc29yX2JheWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZTc4YTguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvbXNtX3NlbnNvcl9iYXllci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTA5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlICJtc21fc2Vuc29yX2JheWVyLmgiCi0jaW5jbHVkZSAibXNtLmgiCi0jaW5jbHVkZSAibXNtX2lzcGlmLmgiCi0jaW5jbHVkZSAibXNtX2NhbWVyYV9pMmNfbXV4LmgiCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1sb25nIG1zbV9zZW5zb3JfYmF5ZXJfc3ViZGV2X2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwgPSBnZXRfc2N0cmwoc2QpOwotCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfTVNNX1NFTlNPUl9DRkc6Ci0JCXJldHVybiBzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfY29uZmlnKHNfY3RybCwgYXJncCk7Ci0JY2FzZSBWSURJT0NfTVNNX1NFTlNPUl9SRUxFQVNFOgotCQlyZXR1cm4gMDsKLQljYXNlIFZJRElPQ19NU01fU0VOU09SX0NTSURfSU5GTzogewotCQlzdHJ1Y3QgbXNtX3NlbnNvcl9jc2lfaW5mbyAqY3NpX2luZm8gPQotCQkJKHN0cnVjdCBtc21fc2Vuc29yX2NzaV9pbmZvICopYXJnOwotCQlzX2N0cmwtPmlzX2NzaWMgPSBjc2lfaW5mby0+aXNfY3NpYzsKLQkJcmV0dXJuIDA7Ci0JfQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JfQotfQotCi1pbnQzMl90IG1zbV9zZW5zb3JfYmF5ZXJfZ2V0X2NzaV9wYXJhbXMoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JCXN0cnVjdCBjc2lfbGFuZV9wYXJhbXNfdCAqc2Vuc29yX291dHB1dF9pbmZvKQotewotCXVpbnQ4X3QgaW5kZXg7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfY3NpX2xhbmVfcGFyYW1zICpjc2lfbGFuZV9wYXJhbXMgPQotCQlzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5jc2lfbGFuZV9wYXJhbXM7Ci0JaWYgKGNzaV9sYW5lX3BhcmFtcykgewotCQlzZW5zb3Jfb3V0cHV0X2luZm8tPmNzaV9sYW5lX2Fzc2lnbiA9IGNzaV9sYW5lX3BhcmFtcy0+Ci0JCQljc2lfbGFuZV9hc3NpZ247Ci0JCXNlbnNvcl9vdXRwdXRfaW5mby0+Y3NpX2xhbmVfbWFzayA9IGNzaV9sYW5lX3BhcmFtcy0+Ci0JCQljc2lfbGFuZV9tYXNrOwotCX0KLQlzZW5zb3Jfb3V0cHV0X2luZm8tPmNzaV9pZiA9IHNfY3RybC0+c2Vuc29yZGF0YS0+Y3NpX2lmOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHNlbnNvcl9vdXRwdXRfaW5mby0+Y3NpX2lmOyBpbmRleCsrKQotCQlzZW5zb3Jfb3V0cHV0X2luZm8tPmNzaWRfY29yZVtpbmRleF0gPSBzX2N0cmwtPnNlbnNvcmRhdGEtPgotCQkJcGRhdGFbaW5kZXhdLmNzaWRfY29yZTsKLQotCXJldHVybiAwOwotfQotCi1pbnQzMl90IG1zbV9zZW5zb3JfYmF5ZXJfY29uZmlnKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCXZvaWQgX191c2VyICphcmdwKQotewotCXN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEgY2RhdGE7Ci0JbG9uZyByYyA9IDA7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZjZGF0YSwKLQkJKHZvaWQgKilhcmdwLAotCQlzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQltdXRleF9sb2NrKHNfY3RybC0+bXNtX3NlbnNvcl9tdXRleCk7Ci0JQ0RCRygiJXM6JWQgJXMgY2ZndHlwZSA9ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCXNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX25hbWUsIGNkYXRhLmNmZ3R5cGUpOwotCXN3aXRjaCAoY2RhdGEuY2ZndHlwZSkgewotCWNhc2UgQ0ZHX1dSSVRFX0kyQ19BUlJBWTogewotCQlzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX3NldHRpbmcgY29uZl9hcnJheTsKLQkJc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19hcnJheSAqcmVncyA9IE5VTEw7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb25mX2FycmF5LAotCQkJKHZvaWQgKiljZGF0YS5jZmcuc2V0dGluZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX3NldHRpbmcpKSkgewotCQkJcHJfZXJyKCIlczolZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJlZ3MgPSBremFsbG9jKGNvbmZfYXJyYXkuc2l6ZSAqIHNpemVvZigKLQkJCXN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfYXJyYXkpLAotCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmICghcmVncykgewotCQkJcHJfZXJyKCIlczolZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihyZWdzLCAodm9pZCAqKWNvbmZfYXJyYXkucmVnX3NldHRpbmcsCi0JCQljb25mX2FycmF5LnNpemUgKiBzaXplb2YoCi0JCQlzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2FycmF5KSkpIHsKLQkJCXByX2VycigiJXM6JWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJa2ZyZWUocmVncyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWNvbmZfYXJyYXkucmVnX3NldHRpbmcgPSByZWdzOwotCQlyYyA9IG1zbV9jYW1lcmFfaTJjX3dyaXRlX2JheWVyX3RhYmxlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCQkmY29uZl9hcnJheSk7Ci0JCWtmcmVlKHJlZ3MpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBDRkdfUkVBRF9JMkNfQVJSQVk6IHsKLQkJc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19zZXR0aW5nIGNvbmZfYXJyYXk7Ci0JCXN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfYXJyYXkgKnJlZ3M7Ci0JCWludCBpbmRleDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbmZfYXJyYXksCi0JCQkJKHZvaWQgKiljZGF0YS5jZmcuc2V0dGluZywKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19zZXR0aW5nKSkpIHsKLQkJCQlwcl9lcnIoIiVzOiVkIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZWdzID0ga3phbGxvYyhjb25mX2FycmF5LnNpemUgKiBzaXplb2YoCi0JCQkJc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19hcnJheSksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmICghcmVncykgewotCQkJcHJfZXJyKCIlczolZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlrZnJlZShyZWdzKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKHJlZ3MsICh2b2lkICopY29uZl9hcnJheS5yZWdfc2V0dGluZywKLQkJCQljb25mX2FycmF5LnNpemUgKiBzaXplb2YoCi0JCQkJc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19hcnJheSkpKSB7Ci0JCQkJcHJfZXJyKCIlczolZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQkJa2ZyZWUocmVncyk7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCXNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQtPmFkZHJfdHlwZSA9IGNvbmZfYXJyYXkuYWRkcl90eXBlOwotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjb25mX2FycmF5LnNpemU7IGluZGV4KyspIHsKLQkJCW1zbV9jYW1lcmFfaTJjX3JlYWQoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCQkJcmVnc1tpbmRleF0ucmVnX2FkZHIsCi0JCQkJCSZyZWdzW2luZGV4XS5yZWdfZGF0YSwKLQkJCQljb25mX2FycmF5LmRhdGFfdHlwZQotCQkJCSk7Ci0JCX0KLQotCQlpZiAoY29weV90b191c2VyKGNvbmZfYXJyYXkucmVnX3NldHRpbmcsCi0JCQlyZWdzLAotCQkJY29uZl9hcnJheS5zaXplICogc2l6ZW9mKAotCQkJc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19hcnJheSkpKSB7Ci0JCQlwcl9lcnIoIiVzOiVkIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJCWtmcmVlKHJlZ3MpOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudC0+YWRkcl90eXBlID0gY29uZl9hcnJheS5hZGRyX3R5cGU7Ci0JCWtmcmVlKHJlZ3MpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBDRkdfUENMS19DSEFOR0U6IHsKLQkJdWludDMyX3QgcGNsayA9IGNkYXRhLmNmZy5wY2xrOwotCQl2NGwyX3N1YmRldl9ub3RpZnkoJnNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2LAotCQkJTk9USUZZX1BDTEtfQ0hBTkdFLCAmcGNsayk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIENGR19HUElPX09QOiB7Ci0JCXN0cnVjdCBtc21fY2FtX2dwaW9fb3BlcmF0aW9uIGdvcDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZnb3AsCi0JCQkodm9pZCAqKWNkYXRhLmNmZy5zZXR0aW5nLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fY2FtX2dwaW9fb3BlcmF0aW9uKSkpIHsKLQkJCXByX2VycigiJXM6JWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQl9Ci0JCXN3aXRjaCAoZ29wLm9wX3R5cGUpIHsKLQkJY2FzZSBHUElPX0dFVF9WQUxVRToKLQkJCWdvcC52YWx1ZSA9IGdwaW9fZ2V0X3ZhbHVlKGdvcC5hZGRyZXNzKTsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKWNkYXRhLmNmZy5zZXR0aW5nLAotCQkJCSZnb3AsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fY2FtX2dwaW9fb3BlcmF0aW9uKSkpIHsKLQkJCQlwcl9lcnIoIiVzOiVkIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBHUElPX1NFVF9WQUxVRToKLQkJCWdwaW9fc2V0X3ZhbHVlKGdvcC5hZGRyZXNzLCBnb3AudmFsdWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR1BJT19TRVRfRElSRUNUSU9OX0lOUFVUOgotCQkJZ3Bpb19kaXJlY3Rpb25faW5wdXQoZ29wLmFkZHJlc3MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR1BJT19TRVRfRElSRUNUSU9OX09VVFBVVDoKLQkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChnb3AuYWRkcmVzcywgZ29wLnZhbHVlKTsKLQkJCWJyZWFrOwotCQljYXNlIEdQSU9fUkVRVUVTVDoKLQkJCWdwaW9fcmVxdWVzdChnb3AuYWRkcmVzcywgZ29wLnRhZyk7Ci0JCQlicmVhazsKLQkJY2FzZSBHUElPX0ZSRUU6Ci0JCQlncGlvX2ZyZWUoZ29wLmFkZHJlc3MpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCi0JCWJyZWFrOwotCX0KLQljYXNlIENGR19HRVRfQ1NJX1BBUkFNUzoKLQkJaWYgKHNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9nZXRfY3NpX3BhcmFtcyA9PSBOVUxMKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IHNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9nZXRfY3NpX3BhcmFtcygKLQkJCXNfY3RybCwKLQkJCSZjZGF0YS5jZmcuY3NpX2xhbmVfcGFyYW1zKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCSZjZGF0YSwKLQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfUE9XRVJfVVA6Ci0JCWlmIChzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfcG93ZXJfdXApCi0JCQlyYyA9IHNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9wb3dlcl91cChzX2N0cmwpOwotCQllbHNlCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfUE9XRVJfRE9XTjoKLQkJaWYgKHNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9wb3dlcl9kb3duKQotCQkJcmMgPSBzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfcG93ZXJfZG93bigKLQkJCQlzX2N0cmwpOwotCQllbHNlCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfQ09ORklHX1ZSRUdfQVJSQVk6IHsKLQkJc3RydWN0IG1zbV9jYW1lcmFfdnJlZ19zZXR0aW5nIHZyZWdfc2V0dGluZzsKLQkJc3RydWN0IGNhbWVyYV92cmVnX3QgKmNhbV92cmVnID0gTlVMTDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnZyZWdfc2V0dGluZywKLQkJCSh2b2lkICopY2RhdGEuY2ZnLnNldHRpbmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9jYW1lcmFfdnJlZ19zZXR0aW5nKSkpIHsKLQkJCXByX2VycigiJXM6JWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQljYW1fdnJlZyA9IGt6YWxsb2ModnJlZ19zZXR0aW5nLm51bV92cmVnICogc2l6ZW9mKAotCQkJc3RydWN0IGNhbWVyYV92cmVnX3QpLAotCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmICghY2FtX3ZyZWcpIHsKLQkJCXByX2VycigiJXM6JWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoY2FtX3ZyZWcsICh2b2lkICopdnJlZ19zZXR0aW5nLmNhbV92cmVnLAotCQkJdnJlZ19zZXR0aW5nLm51bV92cmVnICogc2l6ZW9mKAotCQkJc3RydWN0IGNhbWVyYV92cmVnX3QpKSkgewotCQkJcHJfZXJyKCIlczolZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlrZnJlZShjYW1fdnJlZyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IG1zbV9jYW1lcmFfY29uZmlnX3ZyZWcoCi0JCQkmc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudC0+Y2xpZW50LT5kZXYsCi0JCQljYW1fdnJlZywKLQkJCXZyZWdfc2V0dGluZy5udW1fdnJlZywKLQkJCU5VTEwsCi0JCQkwLAotCQkJc19jdHJsLT5yZWdfcHRyLAotCQkJdnJlZ19zZXR0aW5nLmVuYWJsZSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCWtmcmVlKGNhbV92cmVnKTsKLQkJCXByX2VycigiJXM6IHJlZ3VsYXRvciBvbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmMgPSBtc21fY2FtZXJhX2VuYWJsZV92cmVnKAotCQkJJnNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQtPmNsaWVudC0+ZGV2LAotCQkJY2FtX3ZyZWcsCi0JCQl2cmVnX3NldHRpbmcubnVtX3ZyZWcsCi0JCQlOVUxMLAotCQkJMCwKLQkJCXNfY3RybC0+cmVnX3B0ciwKLQkJCXZyZWdfc2V0dGluZy5lbmFibGUpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlrZnJlZShjYW1fdnJlZyk7Ci0JCQlwcl9lcnIoIiVzOiBlbmFibGUgcmVndWxhdG9yIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJYnJlYWs7Ci0JCX0KLQkJa2ZyZWUoY2FtX3ZyZWcpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBDRkdfQ09ORklHX0NMS19BUlJBWTogewotCQlzdHJ1Y3QgbXNtX2NhbV9jbGtfc2V0dGluZyBjbGtfc2V0dGluZzsKLQkJc3RydWN0IG1zbV9jYW1fY2xrX2luZm8gKmNsa19pbmZvID0gTlVMTDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNsa19zZXR0aW5nLAotCQkJKHZvaWQgKiljZGF0YS5jZmcuc2V0dGluZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2NhbWVyYV92cmVnX3NldHRpbmcpKSkgewotCQkJcHJfZXJyKCIlczolZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWNsa19pbmZvID0ga3phbGxvYyhjbGtfc2V0dGluZy5udW1fY2xrX2luZm8gKiBzaXplb2YoCi0JCQlzdHJ1Y3QgbXNtX2NhbV9jbGtfaW5mbyksCi0JCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCFjbGtfaW5mbykgewotCQkJcHJfZXJyKCIlczolZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihjbGtfaW5mbywgKHZvaWQgKiljbGtfc2V0dGluZy5jbGtfaW5mbywKLQkJCWNsa19zZXR0aW5nLm51bV9jbGtfaW5mbyAqIHNpemVvZigKLQkJCXN0cnVjdCBtc21fY2FtX2Nsa19pbmZvKSkpIHsKLQkJCXByX2VycigiJXM6JWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJa2ZyZWUoY2xrX2luZm8pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmMgPSBtc21fY2FtX2Nsa19lbmFibGUoJnNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQtPmNsaWVudC0+ZGV2LAotCQkJY2xrX2luZm8sIHNfY3RybC0+Y2FtX2NsaywKLQkJCWNsa19zZXR0aW5nLm51bV9jbGtfaW5mbywKLQkJCWNsa19zZXR0aW5nLmVuYWJsZSk7Ci0JCWtmcmVlKGNsa19pbmZvKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQ0ZHX0dFVF9FRVBST01fREFUQTogewotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopY2RhdGEuY2ZnLmVlcHJvbV9kYXRhLmVlcHJvbV9kYXRhLAotCQkJJnNfY3RybC0+ZWVwcm9tX2RhdGEuZGF0YSwgc19jdHJsLT5lZXByb21fZGF0YS5sZW5ndGgpKXsKLQkJCXByX2VycigiJXM6JWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCWNkYXRhLmNmZy5lZXByb21fZGF0YS5pbmRleCA9IHNfY3RybC0+ZWVwcm9tX2RhdGEubGVuZ3RoOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQl9Ci0KLQltdXRleF91bmxvY2soc19jdHJsLT5tc21fc2Vuc29yX211dGV4KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHN0cnVjdCBtc21fY2FtX2Nsa19pbmZvIGNhbV9jbGtfaW5mb1tdID0gewotCXsiY2FtX2NsayIsIE1TTV9TRU5TT1JfTUNMS18yNEhafSwKLX07Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9iYXllcl9lbmFibGVfaTJjX211eChzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY29uZiAqaTJjX2NvbmYpCi17Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICppMmNfbXV4X3NkID0KLQkJZGV2X2dldF9kcnZkYXRhKCZpMmNfY29uZi0+bXV4X2Rldi0+ZGV2KTsKLQl2NGwyX3N1YmRldl9jYWxsKGkyY19tdXhfc2QsIGNvcmUsIGlvY3RsLAotCQlWSURJT0NfTVNNX0kyQ19NVVhfSU5JVCwgTlVMTCk7Ci0JdjRsMl9zdWJkZXZfY2FsbChpMmNfbXV4X3NkLCBjb3JlLCBpb2N0bCwKLQkJVklESU9DX01TTV9JMkNfTVVYX0NGRywgKHZvaWQgKikmaTJjX2NvbmYtPmkyY19tdXhfbW9kZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9iYXllcl9kaXNhYmxlX2kyY19tdXgoc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmYgKmkyY19jb25mKQotewotCXN0cnVjdCB2NGwyX3N1YmRldiAqaTJjX211eF9zZCA9Ci0JCWRldl9nZXRfZHJ2ZGF0YSgmaTJjX2NvbmYtPm11eF9kZXYtPmRldik7Ci0JdjRsMl9zdWJkZXZfY2FsbChpMmNfbXV4X3NkLCBjb3JlLCBpb2N0bCwKLQkJCQlWSURJT0NfTVNNX0kyQ19NVVhfUkVMRUFTRSwgTlVMTCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9wb3dlcl9zZXFfdCBzZW5zb3JfcG93ZXJfc2VxW10gPSB7Ci0Je1JFUVVFU1RfR1BJTywgMH0sCi0Je1JFUVVFU1RfVlJFRywgMH0sCi0Je0VOQUJMRV9WUkVHLCAwfSwKLQl7RU5BQkxFX0dQSU8sIDB9LAotCXtDT05GSUdfQ0xLLCAwfSwKLQl7Q09ORklHX0VYVF9QT1dFUl9DVFJMLCAwfSwKLQl7Q09ORklHX0kyQ19NVVgsIDB9LAotfTsKLQotaW50MzJfdCBtc21fc2Vuc29yX2JheWVyX3Bvd2VyX3VwKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsKQotewotCWludDMyX3QgcmMgPSAwLCBzaXplID0gMCwgaW5kZXggPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhID0gc19jdHJsLT5zZW5zb3JkYXRhOwotCXN0cnVjdCBtc21fY2FtZXJhX3Bvd2VyX3NlcV90ICpwb3dlcl9zZXEgPSBOVUxMOwotCUNEQkcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlpZiAoc19jdHJsLT5wb3dlcl9zZXEpIHsKLQkJcG93ZXJfc2VxID0gc19jdHJsLT5wb3dlcl9zZXE7Ci0JCXNpemUgPSBzX2N0cmwtPm51bV9wb3dlcl9zZXE7Ci0JfSBlbHNlIHsKLQkJcG93ZXJfc2VxID0gJnNlbnNvcl9wb3dlcl9zZXFbMF07Ci0JCXNpemUgPSBBUlJBWV9TSVpFKHNlbnNvcl9wb3dlcl9zZXEpOwotCX0KLQotCXNfY3RybC0+cmVnX3B0ciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3IgKikKLQkJCSogZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPm51bV92cmVnLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNfY3RybC0+cmVnX3B0cikgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgbWVtIGZvciByZWd1bGF0b3JzXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzaXplOyBpbmRleCsrKSB7Ci0JCXN3aXRjaCAocG93ZXJfc2VxW2luZGV4XS5wb3dlcl9jb25maWcpIHsKLQkJY2FzZSBSRVFVRVNUX0dQSU86Ci0JCQlyYyA9IG1zbV9jYW1lcmFfcmVxdWVzdF9ncGlvX3RhYmxlKGRhdGEsIDEpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6IHJlcXVlc3QgZ3BpbyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCQlnb3RvIEVSUk9SOwotCQkJfQotCQkJaWYgKHBvd2VyX3NlcVtpbmRleF0uZGVsYXkpCi0JCQkJdXNsZWVwX3JhbmdlKHBvd2VyX3NlcVtpbmRleF0uZGVsYXkgKiAxMDAwLAotCQkJCQkocG93ZXJfc2VxW2luZGV4XS5kZWxheSAqIDEwMDApICsgMTAwMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBSRVFVRVNUX1ZSRUc6Ci0JCQlyYyA9IG1zbV9jYW1lcmFfY29uZmlnX3ZyZWcoCi0JCQkJJnNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQtPmNsaWVudC0+ZGV2LAotCQkJCXNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPgotCQkJCWNhbV92cmVnLAotCQkJCXNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPgotCQkJCW51bV92cmVnLAotCQkJCXNfY3RybC0+dnJlZ19zZXEsCi0JCQkJc19jdHJsLT5udW1fdnJlZ19zZXEsCi0JCQkJc19jdHJsLT5yZWdfcHRyLCAxKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiByZWd1bGF0b3Igb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJZ290byBFUlJPUjsKLQkJCX0KLQkJCWlmIChwb3dlcl9zZXFbaW5kZXhdLmRlbGF5KQotCQkJCXVzbGVlcF9yYW5nZShwb3dlcl9zZXFbaW5kZXhdLmRlbGF5ICogMTAwMCwKLQkJCQkJKHBvd2VyX3NlcVtpbmRleF0uZGVsYXkgKiAxMDAwKSArIDEwMDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgRU5BQkxFX1ZSRUc6Ci0JCQlyYyA9IG1zbV9jYW1lcmFfZW5hYmxlX3ZyZWcoCi0JCQkJJnNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQtPmNsaWVudC0+ZGV2LAotCQkJCXNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPgotCQkJCWNhbV92cmVnLAotCQkJCXNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPgotCQkJCW51bV92cmVnLAotCQkJCXNfY3RybC0+dnJlZ19zZXEsCi0JCQkJc19jdHJsLT5udW1fdnJlZ19zZXEsCi0JCQkJc19jdHJsLT5yZWdfcHRyLCAxKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBlbmFibGUgcmVndWxhdG9yIGZhaWxlZFxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCWdvdG8gRVJST1I7Ci0JCQl9Ci0JCQlpZiAocG93ZXJfc2VxW2luZGV4XS5kZWxheSkKLQkJCQl1c2xlZXBfcmFuZ2UocG93ZXJfc2VxW2luZGV4XS5kZWxheSAqIDEwMDAsCi0JCQkJCShwb3dlcl9zZXFbaW5kZXhdLmRlbGF5ICogMTAwMCkgKyAxMDAwKTsKLQkJCWJyZWFrOwotCQljYXNlIEVOQUJMRV9HUElPOgotCQkJcmMgPSBtc21fY2FtZXJhX2NvbmZpZ19ncGlvX3RhYmxlKGRhdGEsIDEpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6IGNvbmZpZyBncGlvIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJCWdvdG8gRVJST1I7Ci0JCQl9Ci0JCQlpZiAocG93ZXJfc2VxW2luZGV4XS5kZWxheSkKLQkJCQl1c2xlZXBfcmFuZ2UocG93ZXJfc2VxW2luZGV4XS5kZWxheSAqIDEwMDAsCi0JCQkJCShwb3dlcl9zZXFbaW5kZXhdLmRlbGF5ICogMTAwMCkgKyAxMDAwKTsKLQkJCWJyZWFrOwotCQljYXNlIENPTkZJR19DTEs6Ci0JCQlpZiAoc19jdHJsLT5jbGtfcmF0ZSAhPSAwKQotCQkJCWNhbV9jbGtfaW5mby0+Y2xrX3JhdGUgPSBzX2N0cmwtPmNsa19yYXRlOwotCi0JCQlyYyA9IG1zbV9jYW1fY2xrX2VuYWJsZSgKLQkJCQkmc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudC0+Y2xpZW50LT5kZXYsCi0JCQkJY2FtX2Nsa19pbmZvLCBzX2N0cmwtPmNhbV9jbGssCi0JCQkJQVJSQVlfU0laRShjYW1fY2xrX2luZm8pLCAxKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBjbGsgZW5hYmxlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJCWdvdG8gRVJST1I7Ci0JCQl9Ci0JCQlpZiAocG93ZXJfc2VxW2luZGV4XS5kZWxheSkKLQkJCQl1c2xlZXBfcmFuZ2UocG93ZXJfc2VxW2luZGV4XS5kZWxheSAqIDEwMDAsCi0JCQkJCShwb3dlcl9zZXFbaW5kZXhdLmRlbGF5ICogMTAwMCkgKyAxMDAwKTsKLQkJCWJyZWFrOwotCQljYXNlIENPTkZJR19FWFRfUE9XRVJfQ1RSTDoKLQkJCWlmIChkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+ZXh0X3Bvd2VyX2N0cmwgIT0gTlVMTCkKLQkJCQlkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+ZXh0X3Bvd2VyX2N0cmwoMSk7Ci0JCQlpZiAocG93ZXJfc2VxW2luZGV4XS5kZWxheSkKLQkJCQl1c2xlZXBfcmFuZ2UocG93ZXJfc2VxW2luZGV4XS5kZWxheSAqIDEwMDAsCi0JCQkJCShwb3dlcl9zZXFbaW5kZXhdLmRlbGF5ICogMTAwMCkgKyAxMDAwKTsKLQkJCWJyZWFrOwotCQljYXNlIENPTkZJR19JMkNfTVVYOgotCQkJaWYgKGRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5pMmNfY29uZiAmJgotCQkJCWRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5pMmNfY29uZi0+Ci0JCQkJdXNlX2kyY19tdXgpCi0JCQkJbXNtX3NlbnNvcl9iYXllcl9lbmFibGVfaTJjX211eCgKLQkJCQkJZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmkyY19jb25mKTsKLQkJCWlmIChwb3dlcl9zZXFbaW5kZXhdLmRlbGF5KQotCQkJCXVzbGVlcF9yYW5nZShwb3dlcl9zZXFbaW5kZXhdLmRlbGF5ICogMTAwMCwKLQkJCQkJKHBvd2VyX3NlcVtpbmRleF0uZGVsYXkgKiAxMDAwKSArIDEwMDApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoIiVzIGVycm9yIHBvd2VyIGNvbmZpZyAlZFxuIiwgX19mdW5jX18sCi0JCQkJcG93ZXJfc2VxW2luZGV4XS5wb3dlcl9jb25maWcpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci0KLUVSUk9SOgotCWZvciAoaW5kZXgtLTsgaW5kZXggPj0gMDsgaW5kZXgtLSkgewotCQlzd2l0Y2ggKHBvd2VyX3NlcVtpbmRleF0ucG93ZXJfY29uZmlnKSB7Ci0JCWNhc2UgQ09ORklHX0kyQ19NVVg6Ci0JCQlpZiAoZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmkyY19jb25mICYmCi0JCQkJZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmkyY19jb25mLT4KLQkJCQl1c2VfaTJjX211eCkKLQkJCQltc21fc2Vuc29yX2JheWVyX2Rpc2FibGVfaTJjX211eCgKLQkJCQkJZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPmkyY19jb25mKTsKLQkJCWJyZWFrOwotCQljYXNlIENPTkZJR19FWFRfUE9XRVJfQ1RSTDoKLQkJCWlmIChkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+ZXh0X3Bvd2VyX2N0cmwgIT0gTlVMTCkKLQkJCQlkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+ZXh0X3Bvd2VyX2N0cmwoMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBDT05GSUdfQ0xLOgotCQkJbXNtX2NhbV9jbGtfZW5hYmxlKCZzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LT5jbGllbnQtPgotCQkJCWRldiwgY2FtX2Nsa19pbmZvLCBzX2N0cmwtPmNhbV9jbGssCi0JCQkJQVJSQVlfU0laRShjYW1fY2xrX2luZm8pLCAwKTsKLQkJCWJyZWFrOwotCQljYXNlIEVOQUJMRV9HUElPOgotCQkJbXNtX2NhbWVyYV9jb25maWdfZ3Bpb190YWJsZShkYXRhLCAwKTsKLQkJCWJyZWFrOwotCQljYXNlIEVOQUJMRV9WUkVHOgotCQkJbXNtX2NhbWVyYV9lbmFibGVfdnJlZygmc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudC0+Ci0JCQkJY2xpZW50LT5kZXYsCi0JCQkJc19jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+Ci0JCQkJY2FtX3ZyZWcsCi0JCQkJc19jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+Ci0JCQkJbnVtX3ZyZWcsCi0JCQkJc19jdHJsLT52cmVnX3NlcSwKLQkJCQlzX2N0cmwtPm51bV92cmVnX3NlcSwKLQkJCQlzX2N0cmwtPnJlZ19wdHIsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgUkVRVUVTVF9WUkVHOgotCQkJbXNtX2NhbWVyYV9jb25maWdfdnJlZygmc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudC0+Ci0JCQkJY2xpZW50LT5kZXYsCi0JCQkJc19jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+Ci0JCQkJY2FtX3ZyZWcsCi0JCQkJc19jdHJsLT5zZW5zb3JkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+Ci0JCQkJbnVtX3ZyZWcsCi0JCQkJc19jdHJsLT52cmVnX3NlcSwKLQkJCQlzX2N0cmwtPm51bV92cmVnX3NlcSwKLQkJCQlzX2N0cmwtPnJlZ19wdHIsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgUkVRVUVTVF9HUElPOgotCQkJbXNtX2NhbWVyYV9yZXF1ZXN0X2dwaW9fdGFibGUoZGF0YSwgMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2VycigiJXMgZXJyb3IgcG93ZXIgY29uZmlnICVkXG4iLCBfX2Z1bmNfXywKLQkJCQlwb3dlcl9zZXFbaW5kZXhdLnBvd2VyX2NvbmZpZyk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlrZnJlZShzX2N0cmwtPnJlZ19wdHIpOwotCXJldHVybiByYzsKLX0KLQotaW50MzJfdCBtc21fc2Vuc29yX2JheWVyX3Bvd2VyX2Rvd24oc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwpCi17Ci0JaW50MzJfdCBzaXplID0gMCwgaW5kZXggPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhID0gc19jdHJsLT5zZW5zb3JkYXRhOwotCXN0cnVjdCBtc21fY2FtZXJhX3Bvd2VyX3NlcV90ICpwb3dlcl9zZXEgPSBOVUxMOwotCUNEQkcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoc19jdHJsLT5wb3dlcl9zZXEpIHsKLQkJcG93ZXJfc2VxID0gc19jdHJsLT5wb3dlcl9zZXE7Ci0JCXNpemUgPSBzX2N0cmwtPm51bV9wb3dlcl9zZXE7Ci0JfSBlbHNlIHsKLQkJcG93ZXJfc2VxID0gJnNlbnNvcl9wb3dlcl9zZXFbMF07Ci0JCXNpemUgPSBBUlJBWV9TSVpFKHNlbnNvcl9wb3dlcl9zZXEpOwotCX0KLQotCWZvciAoaW5kZXggPSAoc2l6ZSAtIDEpOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7Ci0JCXN3aXRjaCAocG93ZXJfc2VxW2luZGV4XS5wb3dlcl9jb25maWcpIHsKLQkJY2FzZSBDT05GSUdfSTJDX01VWDoKLQkJCWlmIChkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+aTJjX2NvbmYgJiYKLQkJCQlkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+aTJjX2NvbmYtPgotCQkJCXVzZV9pMmNfbXV4KQotCQkJCW1zbV9zZW5zb3JfYmF5ZXJfZGlzYWJsZV9pMmNfbXV4KAotCQkJCQlkYXRhLT5zZW5zb3JfcGxhdGZvcm1faW5mby0+aTJjX2NvbmYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ09ORklHX0VYVF9QT1dFUl9DVFJMOgotCQkJaWYgKGRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5leHRfcG93ZXJfY3RybCAhPSBOVUxMKQotCQkJCWRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5leHRfcG93ZXJfY3RybCgwKTsKLQkJCWJyZWFrOwotCQljYXNlIENPTkZJR19DTEs6Ci0JCQltc21fY2FtX2Nsa19lbmFibGUoJnNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQtPmNsaWVudC0+Ci0JCQkJZGV2LCBjYW1fY2xrX2luZm8sIHNfY3RybC0+Y2FtX2NsaywKLQkJCQlBUlJBWV9TSVpFKGNhbV9jbGtfaW5mbyksIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgRU5BQkxFX0dQSU86Ci0JCQltc21fY2FtZXJhX2NvbmZpZ19ncGlvX3RhYmxlKGRhdGEsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgRU5BQkxFX1ZSRUc6Ci0JCQltc21fY2FtZXJhX2VuYWJsZV92cmVnKCZzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LT4KLQkJCQljbGllbnQtPmRldiwKLQkJCQlzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT4KLQkJCQljYW1fdnJlZywKLQkJCQlzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT4KLQkJCQludW1fdnJlZywKLQkJCQlzX2N0cmwtPnZyZWdfc2VxLAotCQkJCXNfY3RybC0+bnVtX3ZyZWdfc2VxLAotCQkJCXNfY3RybC0+cmVnX3B0ciwgMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBSRVFVRVNUX1ZSRUc6Ci0JCQltc21fY2FtZXJhX2NvbmZpZ192cmVnKCZzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LT4KLQkJCQljbGllbnQtPmRldiwKLQkJCQlzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT4KLQkJCQljYW1fdnJlZywKLQkJCQlzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT4KLQkJCQludW1fdnJlZywKLQkJCQlzX2N0cmwtPnZyZWdfc2VxLAotCQkJCXNfY3RybC0+bnVtX3ZyZWdfc2VxLAotCQkJCXNfY3RybC0+cmVnX3B0ciwgMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBSRVFVRVNUX0dQSU86Ci0JCQltc21fY2FtZXJhX3JlcXVlc3RfZ3Bpb190YWJsZShkYXRhLCAwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCIlcyBlcnJvciBwb3dlciBjb25maWcgJWRcbiIsIF9fZnVuY19fLAotCQkJCXBvd2VyX3NlcVtpbmRleF0ucG93ZXJfY29uZmlnKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWtmcmVlKHNfY3RybC0+cmVnX3B0cik7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9iYXllcl9tYXRjaF9pZChzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1aW50MTZfdCBjaGlwaWQgPSAwOwotCXJjID0gbXNtX2NhbWVyYV9pMmNfcmVhZCgKLQkJCXNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCQlzX2N0cmwtPnNlbnNvcl9pZF9pbmZvLT5zZW5zb3JfaWRfcmVnX2FkZHIsICZjaGlwaWQsCi0JCQlNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEEpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogJXM6IHJlYWQgaWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywKLQkJCXNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX25hbWUpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JQ0RCRygiJXM6IHJlYWQgaWQ6ICV4IGV4cGVjdGVkIGlkICV4OlxuIiwgX19mdW5jX18sIGNoaXBpZCwKLQkJc19jdHJsLT5zZW5zb3JfaWRfaW5mby0+c2Vuc29yX2lkKTsKLQlpZiAoY2hpcGlkICE9IHNfY3RybC0+c2Vuc29yX2lkX2luZm8tPnNlbnNvcl9pZCkgewotCQlwcl9lcnIoIm1zbV9zZW5zb3JfbWF0Y2hfaWQgY2hpcCBpZCBkb2Vzbm90IG1hdGNoXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXJldHVybiByYzsKLX0KLQotaW50MzJfdCBtc21fc2Vuc29yX2JheWVyX2VlcHJvbV9yZWFkKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsKQotewotCXVpbnQzMl90IHJlZ19hZGRyID0gMDsKLQl1aW50OF90ICpkYXRhID0gc19jdHJsLT5lZXByb21fZGF0YS5kYXRhOwotCXVpbnQzMl90IG51bV9ieXRlID0gMDsKLQlpbnQgcmMgPSAwOwotCXVpbnQzMl90IGkyY19hZGRyOwotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzZW5zb3JfaW5mbyA9IHNfY3RybC0+c2Vuc29yZGF0YTsKLQlpMmNfYWRkciA9IHNlbnNvcl9pbmZvLT5lZXByb21faW5mby0+ZWVwcm9tX2kyY19zbGF2ZV9hZGRyOwotCW51bV9ieXRlID0gc19jdHJsLT5lZXByb21fZGF0YS5sZW5ndGggPSBzZW5zb3JfaW5mby0+ZWVwcm9tX2luZm8tPgotCQllZXByb21fcmVhZF9sZW5ndGg7Ci0JcmVnX2FkZHIgPSBzZW5zb3JfaW5mby0+ZWVwcm9tX2luZm8tPmVlcHJvbV9yZWdfYWRkcjsKLQotCWRhdGEgPSBremFsbG9jKG51bV9ieXRlICogc2l6ZW9mKHVpbnQ4X3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEpIHsKLQkJcHJfZXJyKCIlczolZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJjID0gLUVGQVVMVDsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQtPmNsaWVudC0+YWRkciA9IGkyY19hZGRyOwotCUNEQkcoImVlcHJvbSByZWFkOiBpMmMgYWRkciBpcyAleCBudW0gYnl0ZSAlZCAgcmVnIGFkZHIgJXhcbiIsCi0JCWkyY19hZGRyLCBudW1fYnl0ZSwgcmVnX2FkZHIpOwotCXJjID0gbXNtX2NhbWVyYV9pMmNfcmVhZF9zZXEoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwgcmVnX2FkZHIsIGRhdGEsCi0JCW51bV9ieXRlKTsKLQlzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LT5jbGllbnQtPmFkZHIgPSBzX2N0cmwtPnNlbnNvcl9pMmNfYWRkcjsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9iYXllcl9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybDsKLQlDREJHKCIlcyAlc19pMmNfcHJvYmUgY2FsbGVkXG4iLCBfX2Z1bmNfXywgY2xpZW50LT5uYW1lKTsKLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgewotCQlwcl9lcnIoIiVzICVzIGkyY19jaGVja19mdW5jdGlvbmFsaXR5IGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fLCBjbGllbnQtPm5hbWUpOwotCQlyYyA9IC1FRkFVTFQ7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlzX2N0cmwgPSAoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICopKGlkLT5kcml2ZXJfZGF0YSk7Ci0JaWYgKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQgIT0gTlVMTCkgewotCQlzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LT5jbGllbnQgPSBjbGllbnQ7Ci0JCWlmIChzX2N0cmwtPnNlbnNvcl9pMmNfYWRkciAhPSAwKQotCQkJc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudC0+Y2xpZW50LT5hZGRyID0KLQkJCQlzX2N0cmwtPnNlbnNvcl9pMmNfYWRkcjsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzICVzIHNlbnNvcl9pMmNfY2xpZW50IE5VTExcbiIsCi0JCQlfX2Z1bmNfXywgY2xpZW50LT5uYW1lKTsKLQkJcmMgPSAtRUZBVUxUOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0Jc19jdHJsLT5zZW5zb3JkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpZiAoc19jdHJsLT5zZW5zb3JkYXRhID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlcyAlcyBOVUxMIHNlbnNvciBkYXRhXG4iLCBfX2Z1bmNfXywgY2xpZW50LT5uYW1lKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmMgPSBzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfcG93ZXJfdXAoc19jdHJsKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXMgJXMgcG93ZXIgdXAgZmFpbGVkXG4iLCBfX2Z1bmNfXywgY2xpZW50LT5uYW1lKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmIChzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfbWF0Y2hfaWQpCi0JCXJjID0gc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX21hdGNoX2lkKHNfY3RybCk7Ci0JZWxzZQotCQlyYyA9IG1zbV9zZW5zb3JfYmF5ZXJfbWF0Y2hfaWQoc19jdHJsKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIHByb2JlX2ZhaWw7Ci0KLQlpZiAoIXNfY3RybC0+d2FpdF9udW1fZnJhbWVzKQotCQlzX2N0cmwtPndhaXRfbnVtX2ZyYW1lcyA9IDE7Ci0KLQlwcl9lcnIoIiVzICVzIHByb2JlIHN1Y2NlZWRlZFxuIiwgX19mdW5jX18sIGNsaWVudC0+bmFtZSk7Ci0Jc25wcmludGYoc19jdHJsLT5zZW5zb3JfdjRsMl9zdWJkZXYubmFtZSwKLQkJc2l6ZW9mKHNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2Lm5hbWUpLCAiJXMiLCBpZC0+bmFtZSk7Ci0JdjRsMl9pMmNfc3ViZGV2X2luaXQoJnNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2LCBjbGllbnQsCi0JCXNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2X29wcyk7Ci0Jc19jdHJsLT5zZW5zb3JfdjRsMl9zdWJkZXYuZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7Ci0JbWVkaWFfZW50aXR5X2luaXQoJnNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2LmVudGl0eSwgMCwgTlVMTCwgMCk7Ci0Jc19jdHJsLT5zZW5zb3JfdjRsMl9zdWJkZXYuZW50aXR5LnR5cGUgPSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFVjsKLQlzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldi5lbnRpdHkuZ3JvdXBfaWQgPSBTRU5TT1JfREVWOwotCXNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2LmVudGl0eS5uYW1lID0KLQkJc19jdHJsLT5zZW5zb3JfdjRsMl9zdWJkZXYubmFtZTsKLQltc21fc2Vuc29yX3JlZ2lzdGVyKCZzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldik7Ci0Jc19jdHJsLT5zZW5zb3JfdjRsMl9zdWJkZXYuZW50aXR5LnJldmlzaW9uID0KLQkJc19jdHJsLT5zZW5zb3JfdjRsMl9zdWJkZXYuZGV2bm9kZS0+bnVtOwotCWlmIChzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfcmVhZF9lZXByb20gIT0gTlVMTCkKLQkJc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX3JlYWRfZWVwcm9tKHNfY3RybCk7Ci0JZWxzZQotCQltc21fc2Vuc29yX2JheWVyX2VlcHJvbV9yZWFkKHNfY3RybCk7Ci0JZ290byBwb3dlcl9kb3duOwotcHJvYmVfZmFpbDoKLQlwcl9lcnIoIiVzICVzX2kyY19wcm9iZSBmYWlsZWRcbiIsIF9fZnVuY19fLCBjbGllbnQtPm5hbWUpOwotcG93ZXJfZG93bjoKLQlpZiAocmMgPiAwKQotCQlyYyA9IDA7Ci0Jc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX3Bvd2VyX2Rvd24oc19jdHJsKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9kZWxheV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybDsKLQlDREJHKCIlcyAlc19kZWxheV9pMmNfcHJvYmUgY2FsbGVkXG4iLCBfX2Z1bmNfXywgY2xpZW50LT5uYW1lKTsKLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgewotCQlwcl9lcnIoIiVzICVzIGkyY19jaGVja19mdW5jdGlvbmFsaXR5IGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fLCBjbGllbnQtPm5hbWUpOwotCQlyYyA9IC1FRkFVTFQ7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlzX2N0cmwgPSAoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICopKGlkLT5kcml2ZXJfZGF0YSk7Ci0JaWYgKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQgIT0gTlVMTCkgewotCQlzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LT5jbGllbnQgPSBjbGllbnQ7Ci0JCWlmIChzX2N0cmwtPnNlbnNvcl9pMmNfYWRkciAhPSAwKQotCQkJc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudC0+Y2xpZW50LT5hZGRyID0KLQkJCQlzX2N0cmwtPnNlbnNvcl9pMmNfYWRkcjsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzICVzIHNlbnNvcl9pMmNfY2xpZW50IE5VTExcbiIsCi0JCQlfX2Z1bmNfXywgY2xpZW50LT5uYW1lKTsKLQkJcmMgPSAtRUZBVUxUOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0Jc19jdHJsLT5zZW5zb3JkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpZiAoc19jdHJsLT5zZW5zb3JkYXRhID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlcyAlcyBOVUxMIHNlbnNvciBkYXRhXG4iLCBfX2Z1bmNfXywgY2xpZW50LT5uYW1lKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaWYgKCFzX2N0cmwtPndhaXRfbnVtX2ZyYW1lcykKLQkJc19jdHJsLT53YWl0X251bV9mcmFtZXMgPSAxOwotCi0JcHJfZXJyKCIlcyAlcyBwcm9iZSBzdWNjZWVkZWRcbiIsIF9fZnVuY19fLCBjbGllbnQtPm5hbWUpOwotCXNucHJpbnRmKHNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2Lm5hbWUsCi0JCXNpemVvZihzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldi5uYW1lKSwgIiVzIiwgaWQtPm5hbWUpOwotCXY0bDJfaTJjX3N1YmRldl9pbml0KCZzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldiwgY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldl9vcHMpOwotCXNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2LmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOwotCW1lZGlhX2VudGl0eV9pbml0KCZzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldi5lbnRpdHksIDAsIE5VTEwsIDApOwotCXNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2LmVudGl0eS50eXBlID0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVY7Ci0Jc19jdHJsLT5zZW5zb3JfdjRsMl9zdWJkZXYuZW50aXR5Lmdyb3VwX2lkID0gU0VOU09SX0RFVjsKLQlzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldi5lbnRpdHkubmFtZSA9Ci0JCXNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2Lm5hbWU7Ci0JbXNtX3NlbnNvcl9yZWdpc3Rlcigmc19jdHJsLT5zZW5zb3JfdjRsMl9zdWJkZXYpOwotCXNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2LmVudGl0eS5yZXZpc2lvbiA9Ci0JCXNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2LmRldm5vZGUtPm51bTsKLQlpZiAocmMgPiAwKQotCQlyYyA9IDA7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQzMl90IG1zbV9zZW5zb3JfYmF5ZXJfcG93ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IG9uKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwgPSBnZXRfc2N0cmwoc2QpOwotCW11dGV4X2xvY2soc19jdHJsLT5tc21fc2Vuc29yX211dGV4KTsKLQlpZiAoIW9uKQotCQlyYyA9IHNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9wb3dlcl9kb3duKHNfY3RybCk7Ci0JbXV0ZXhfdW5sb2NrKHNfY3RybC0+bXNtX3NlbnNvcl9tdXRleCk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQzMl90IG1zbV9zZW5zb3JfYmF5ZXJfdjRsMl9lbnVtX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXVuc2lnbmVkIGludCBpbmRleCwgZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlICpjb2RlKQotewotCXN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsID0gZ2V0X3NjdHJsKHNkKTsKLQotCWlmICgodW5zaWduZWQgaW50KWluZGV4ID49IHNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2X2luZm9fc2l6ZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkqY29kZSA9IHNfY3RybC0+c2Vuc29yX3Y0bDJfc3ViZGV2X2luZm9baW5kZXhdLmNvZGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9iYXllcl92NGwyX3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0JaW50IHJjID0gLTEsIGkgPSAwOwotCXN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsID0gZ2V0X3NjdHJsKHNkKTsKLQlzdHJ1Y3QgbXNtX3NlbnNvcl92NGwyX2N0cmxfaW5mb190ICp2NGwyX2N0cmwgPQotCQlzX2N0cmwtPm1zbV9zZW5zb3JfdjRsMl9jdHJsX2luZm87Ci0KLQlDREJHKCIlc1xuIiwgX19mdW5jX18pOwotCUNEQkcoIiVkXG4iLCBjdHJsLT5pZCk7Ci0JaWYgKHY0bDJfY3RybCA9PSBOVUxMKQotCQlyZXR1cm4gcmM7Ci0JZm9yIChpID0gMDsgaSA8IHNfY3RybC0+bnVtX3Y0bDJfY3RybDsgaSsrKSB7Ci0JCWlmICh2NGwyX2N0cmxbaV0uY3RybF9pZCA9PSBjdHJsLT5pZCkgewotCQkJaWYgKHY0bDJfY3RybFtpXS5zX3Y0bDJfY3RybCAhPSBOVUxMKSB7Ci0JCQkJQ0RCRygiXG4gY2FsbGluZyBtc21fc2Vuc29yX3NfY3RybF9ieV9lbnVtXG4iKTsKLQkJCQlyYyA9IHY0bDJfY3RybFtpXS5zX3Y0bDJfY3RybCgKLQkJCQkJc19jdHJsLAotCQkJCQkmc19jdHJsLT5tc21fc2Vuc29yX3Y0bDJfY3RybF9pbmZvW2ldLAotCQkJCQljdHJsLT52YWx1ZSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByYzsKLX0KLQotaW50MzJfdCBtc21fc2Vuc29yX2JheWVyX3Y0bDJfcXVlcnlfY3RybCgKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsKQotewotCWludCByYyA9IC0xLCBpID0gMDsKLQlzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCA9Ci0JCShzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKikgc2QtPmRldl9wcml2OwotCi0JQ0RCRygiJXNcbiIsIF9fZnVuY19fKTsKLQlDREJHKCIlcyBpZDogJWRcbiIsIF9fZnVuY19fLCBxY3RybC0+aWQpOwotCi0JaWYgKHNfY3RybC0+bXNtX3NlbnNvcl92NGwyX2N0cmxfaW5mbyA9PSBOVUxMKQotCQlyZXR1cm4gcmM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc19jdHJsLT5udW1fdjRsMl9jdHJsOyBpKyspIHsKLQkJaWYgKHNfY3RybC0+bXNtX3NlbnNvcl92NGwyX2N0cmxfaW5mb1tpXS5jdHJsX2lkID09IHFjdHJsLT5pZCkgewotCQkJcWN0cmwtPm1pbmltdW0gPQotCQkJCXNfY3RybC0+bXNtX3NlbnNvcl92NGwyX2N0cmxfaW5mb1tpXS5taW47Ci0JCQlxY3RybC0+bWF4aW11bSA9Ci0JCQkJc19jdHJsLT5tc21fc2Vuc29yX3Y0bDJfY3RybF9pbmZvW2ldLm1heDsKLQkJCXFjdHJsLT5mbGFncyA9IDE7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9zZW5zb3JfYmF5ZXJfc19jdHJsX2J5X2VudW0oc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JCXN0cnVjdCBtc21fc2Vuc29yX3Y0bDJfY3RybF9pbmZvX3QgKmN0cmxfaW5mbywgaW50IHZhbHVlKQotewotCWludCByYyA9IDA7Ci0JQ0RCRygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKLQlyYyA9IG1zbV9zZW5zb3Jfd3JpdGVfZW51bV9jb25mX2FycmF5KAotCQlzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQljdHJsX2luZm8tPmVudW1fY2ZnX3NldHRpbmdzLCB2YWx1ZSk7Ci0JcmV0dXJuIHJjOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9tc21fc2Vuc29yX2JheWVyLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9tc21fc2Vuc29yX2JheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NGI3OTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvbXNtX3NlbnNvcl9iYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBNU01fU0VOU09SX0JBWUVSX0gKLSNkZWZpbmUgTVNNX1NFTlNPUl9CQVlFUl9ICi0KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2NhbWVyYS5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+Ci0jaW5jbHVkZSAibXNtX2NhbWVyYV9pMmMuaCIKLSNpbmNsdWRlICJtc21fY2FtZXJhX2VlcHJvbS5oIgotI2luY2x1ZGUgIm1zbV9zZW5zb3JfY29tbW9uLmgiCi0KLXN0cnVjdCBzZW5zb3JfZHJpdmVyX3QgewotCXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKnBsYXRmb3JtX3Bkcml2ZXI7Ci0JaW50MzJfdCAoKnBsYXRmb3JtX3Byb2JlKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKLX07Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9iYXllcl9jb25maWcoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JCQl2b2lkIF9fdXNlciAqYXJncCk7Ci1pbnQzMl90IG1zbV9zZW5zb3JfYmF5ZXJfcG93ZXJfdXAoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwpOwotaW50MzJfdCBtc21fc2Vuc29yX2JheWVyX3Bvd2VyX2Rvd24oc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwpOwotCi1pbnQzMl90IG1zbV9zZW5zb3JfYmF5ZXJfbWF0Y2hfaWQoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwpOwotaW50IG1zbV9zZW5zb3JfYmF5ZXJfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKTsKLWludDMyX3QgbXNtX3NlbnNvcl9kZWxheV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpOwotaW50MzJfdCBtc21fc2Vuc29yX2JheWVyX3Bvd2VyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbik7Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9iYXllcl92NGwyX3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpOwotCi1pbnQzMl90IG1zbV9zZW5zb3JfYmF5ZXJfdjRsMl9xdWVyeV9jdHJsKAotCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwpOwotCi1pbnQgbXNtX3NlbnNvcl9iYXllcl9zX2N0cmxfYnlfZW51bShzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwKLQkJc3RydWN0IG1zbV9zZW5zb3JfdjRsMl9jdHJsX2luZm9fdCAqY3RybF9pbmZvLCBpbnQgdmFsdWUpOwotCi1pbnQgbXNtX3NlbnNvcl9iYXllcl92NGwyX2VudW1fZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHVuc2lnbmVkIGludCBpbmRleCwKLQkJCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSAqY29kZSk7Ci0KLWxvbmcgbXNtX3NlbnNvcl9iYXllcl9zdWJkZXZfaW9jdGwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7Ci0KLWludDMyX3QgbXNtX3NlbnNvcl9iYXllcl9nZXRfY3NpX3BhcmFtcyhzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwKLQkJc3RydWN0IGNzaV9sYW5lX3BhcmFtc190ICpzZW5zb3Jfb3V0cHV0X2luZm8pOwotCi1pbnQzMl90IG1zbV9zZW5zb3JfYmF5ZXJfZWVwcm9tX3JlYWQoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwpOwotCi0jZGVmaW5lIFZJRElPQ19NU01fU0VOU09SX0NGRyBcCi0JX0lPV1IoJ1YnLCBCQVNFX1ZJRElPQ19QUklWQVRFICsgNCwgdm9pZCBfX3VzZXIgKikKLQotI2RlZmluZSBWSURJT0NfTVNNX1NFTlNPUl9SRUxFQVNFIFwKLQlfSU8oJ1YnLCBCQVNFX1ZJRElPQ19QUklWQVRFICsgMTEpCi0KLSNkZWZpbmUgVklESU9DX01TTV9TRU5TT1JfQ1NJRF9JTkZPXAotCV9JT1dSKCdWJywgQkFTRV9WSURJT0NfUFJJVkFURSArIDEyLCBzdHJ1Y3QgbXNtX3NlbnNvcl9jc2lfaW5mbyAqKQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9tc21fc2Vuc29yX2NvbW1vbi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvbXNtX3NlbnNvcl9jb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThkNzhiMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9tc21fc2Vuc29yX2NvbW1vbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgIm1zbV9zZW5zb3JfY29tbW9uLmgiCi0KLXN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqZ2V0X3NjdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG1zbV9zZW5zb3JfY3RybF90LCBzZW5zb3JfdjRsMl9zdWJkZXYpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvbXNtX3NlbnNvcl9jb21tb24uaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL21zbV9zZW5zb3JfY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZjViODMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvbXNtX3NlbnNvcl9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIE1TTV9TRU5TT1JfQ09NTU9OX0gKLSNkZWZpbmUgTVNNX1NFTlNPUl9DT01NT05fSAotCi0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2NhbWVyYS5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+Ci0jaW5jbHVkZSAibXNtX2NhbWVyYV9pMmMuaCIKLSNpbmNsdWRlICJtc21fY2FtZXJhX2VlcHJvbS5oIgotI2RlZmluZSBROCAgMHgwMDAwMDEwMAotI2RlZmluZSBRMTAgMHgwMDAwMDQwMAotCi0jZGVmaW5lIE1TTV9TRU5TT1JfTUNMS184SFogODAwMDAwMAotI2RlZmluZSBNU01fU0VOU09SX01DTEtfMTZIWiAxNjAwMDAwMAotI2RlZmluZSBNU01fU0VOU09SX01DTEtfMjRIWiAyNDAwMDAwMAotCi0jZGVmaW5lIERFRklORV9NU01fTVVURVgobXV0ZXhuYW1lKSBcCi0Jc3RhdGljIHN0cnVjdCBtdXRleCBtdXRleG5hbWUgPSBfX01VVEVYX0lOSVRJQUxJWkVSKG11dGV4bmFtZSkKLQotc3RydWN0IGdwaW9fdGxtbV9jZmcgewotCXVpbnQzMl90IGdwaW87Ci0JdWludDMyX3QgZGlyOwotCXVpbnQzMl90IHB1bGw7Ci0JdWludDMyX3QgZHJ2c3RyOwotfTsKLQotZW51bSBtc21fc2Vuc29yX3JlZ191cGRhdGUgewotCS8qIFNlbnNvciBlZ2lzdGVycyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKi8KLQlNU01fU0VOU09SX1JFR19JTklULAotCS8qIFNlbnNvciBlZ2lzdGVycyB0aGF0IG5lZWRzIHBlcmlvZGljIEkyQyB3cml0ZXMgKi8KLQlNU01fU0VOU09SX1VQREFURV9QRVJJT0RJQywKLQkvKiBBbGwgdGhlIHNlbnNvciBSZWdpc3RlcnMgd2lsbCBiZSB1cGRhdGVkICovCi0JTVNNX1NFTlNPUl9VUERBVEVfQUxMLAotCS8qIE5vdCB2YWxpZCB1cGRhdGUgKi8KLQlNU01fU0VOU09SX1VQREFURV9JTlZBTElECi19OwotCi1lbnVtIG1zbV9zZW5zb3JfY2FtX21vZGVfdCB7Ci0JTVNNX1NFTlNPUl9NT0RFXzJEX1JJR0hULAotCU1TTV9TRU5TT1JfTU9ERV8yRF9MRUZULAotCU1TTV9TRU5TT1JfTU9ERV8zRCwKLQlNU01fU0VOU09SX01PREVfSU5WQUxJRAotfTsKLQotZW51bSBtc21fY2FtZXJhX3Bvd2VyX2NvbmZpZ190IHsKLQlSRVFVRVNUX0dQSU8sCi0JRU5BQkxFX0dQSU8sCi0JUkVRVUVTVF9WUkVHLAotCUVOQUJMRV9WUkVHLAotCUNPTkZJR19DTEssCi0JQ09ORklHX0VYVF9QT1dFUl9DVFJMLAotCUNPTkZJR19JMkNfTVVYLAotfTsKLQotc3RydWN0IG1zbV9jYW1lcmFfcG93ZXJfc2VxX3QgewotCWVudW0gbXNtX2NhbWVyYV9wb3dlcl9jb25maWdfdCBwb3dlcl9jb25maWc7Ci0JdWludDMyX3QgZGVsYXk7Ci19OwotCi1zdHJ1Y3QgbXNtX3NlbnNvcl9pZF9pbmZvX3QgewotCXVpbnQxNl90IHNlbnNvcl9pZF9yZWdfYWRkcjsKLQl1aW50MTZfdCBzZW5zb3JfaWQ7Ci19OwotCi1zdHJ1Y3QgbXNtX3NlbnNvcl9yZWdfdCB7Ci0JZW51bSBtc21fY2FtZXJhX2kyY19kYXRhX3R5cGUgZGVmYXVsdF9kYXRhX3R5cGU7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mICpzdGFydF9zdHJlYW1fY29uZjsKLQl1aW50OF90IHN0YXJ0X3N0cmVhbV9jb25mX3NpemU7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mICpzdG9wX3N0cmVhbV9jb25mOwotCXVpbnQ4X3Qgc3RvcF9zdHJlYW1fY29uZl9zaXplOwotCXN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiAqZ3JvdXBfaG9sZF9vbl9jb25mOwotCXVpbnQ4X3QgZ3JvdXBfaG9sZF9vbl9jb25mX3NpemU7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mICpncm91cF9ob2xkX29mZl9jb25mOwotCXVpbnQ4X3QgZ3JvdXBfaG9sZF9vZmZfY29uZl9zaXplOwotCXN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5ICppbml0X3NldHRpbmdzOwotCXVpbnQ4X3QgaW5pdF9zaXplOwotCXN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5ICptb2RlX3NldHRpbmdzOwotCXN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5ICpub19lZmZlY3Rfc2V0dGluZ3M7Ci0Jc3RydWN0IG1zbV9zZW5zb3Jfb3V0cHV0X2luZm9fdCAqb3V0cHV0X3NldHRpbmdzOwotCXVpbnQ4X3QgbnVtX2NvbmY7Ci19OwotCi1lbnVtIG1zbV9zZW5zb3JfZGV2aWNlX3R5cGVfdCB7Ci0JTVNNX1NFTlNPUl9JMkNfREVWSUNFLAotCU1TTV9TRU5TT1JfUExBVEZPUk1fREVWSUNFLAotfTsKLQotc3RydWN0IHY0bDJfc3ViZGV2X2luZm8gewotCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjb2RlOwotCWVudW0gdjRsMl9jb2xvcnNwYWNlIGNvbG9yc3BhY2U7Ci0JdWludDE2X3QgZm10OwotCXVpbnQxNl90IG9yZGVyOwotfTsKLQotc3RydWN0IG1zbV9zZW5zb3JfY3RybF90OwotCi1zdHJ1Y3QgbXNtX3NlbnNvcl92NGwyX2N0cmxfaW5mb190IHsKLQl1aW50MzJfdCBjdHJsX2lkOwotCWludDE2X3QgbWluOwotCWludDE2X3QgbWF4OwotCWludDE2X3Qgc3RlcDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfZW51bV9jb25mX2FycmF5ICplbnVtX2NmZ19zZXR0aW5nczsKLQlpbnQgKCpzX3Y0bDJfY3RybCkgKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqLAotCQlzdHJ1Y3QgbXNtX3NlbnNvcl92NGwyX2N0cmxfaW5mb190ICosIGludCk7Ci19OwotCi1zdHJ1Y3QgbXNtX3NlbnNvcl9mbl90IHsKLQl2b2lkICgqc2Vuc29yX3N0YXJ0X3N0cmVhbSkgKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqKTsKLQl2b2lkICgqc2Vuc29yX3N0b3Bfc3RyZWFtKSAoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICopOwotCXZvaWQgKCpzZW5zb3JfZ3JvdXBfaG9sZF9vbikgKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqKTsKLQl2b2lkICgqc2Vuc29yX2dyb3VwX2hvbGRfb2ZmKSAoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICopOwotCi0JaW50MzJfdCAoKnNlbnNvcl9zZXRfZnBzKSAoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICosCi0JCQlzdHJ1Y3QgZnBzX2NmZyAqKTsKLQlpbnQzMl90ICgqc2Vuc29yX3dyaXRlX2V4cF9nYWluKSAoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICosCi0JCQl1aW50MTZfdCwgdWludDMyX3QpOwotCWludDMyX3QgKCpzZW5zb3Jfd3JpdGVfc25hcHNob3RfZXhwX2dhaW4pIChzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKiwKLQkJCXVpbnQxNl90LCB1aW50MzJfdCk7Ci0JaW50MzJfdCAoKnNlbnNvcl9zZXR0aW5nKSAoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICosCi0JCQlpbnQgdXBkYXRlX3R5cGUsIGludCBydCk7Ci0JaW50MzJfdCAoKnNlbnNvcl9jc2lfc2V0dGluZykgKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqLAotCQkJaW50IHVwZGF0ZV90eXBlLCBpbnQgcnQpOwotCWludDMyX3QgKCpzZW5zb3Jfc2V0X3NlbnNvcl9tb2RlKQotCQkJKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqLCBpbnQsIGludCk7Ci0JaW50MzJfdCAoKnNlbnNvcl9tb2RlX2luaXQpIChzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKiwKLQkJaW50LCBzdHJ1Y3Qgc2Vuc29yX2luaXRfY2ZnICopOwotCWludDMyX3QgKCpzZW5zb3JfZ2V0X291dHB1dF9pbmZvKSAoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICosCi0JCXN0cnVjdCBzZW5zb3Jfb3V0cHV0X2luZm9fdCAqKTsKLQlpbnQgKCpzZW5zb3JfY29uZmlnKSAoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICosIHZvaWQgX191c2VyICopOwotCWludCAoKnNlbnNvcl9wb3dlcl9kb3duKQotCQkoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICopOwotCWludCAoKnNlbnNvcl9wb3dlcl91cCkgKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqKTsKLQlpbnQzMl90ICgqc2Vuc29yX21hdGNoX2lkKShzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCk7Ci0Jdm9pZCAoKnNlbnNvcl9hZGp1c3RfZnJhbWVfbGluZXMpIChzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCk7Ci0JaW50MzJfdCAoKnNlbnNvcl9nZXRfY3NpX3BhcmFtcykoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICosCi0JCXN0cnVjdCBjc2lfbGFuZV9wYXJhbXNfdCAqKTsKLQlpbnQzMl90ICgqc2Vuc29yX3JlYWRfZWVwcm9tKShzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKik7Ci19OwotCi1zdHJ1Y3QgbXNtX3NlbnNvcl9jc2lfaW5mbyB7Ci0JdWludDhfdCBpc19jc2ljOwotfTsKLQotZW51bSBtc21fc2Vuc29yX3N0YXRlIHsKLQlNU01fU0VOU09SX1BPV0VSX1VQLAotCU1TTV9TRU5TT1JfUE9XRVJfRE9XTiwKLX07Ci0KLXN0cnVjdCBtc21fc2Vuc29yX2VlcHJvbV9kYXRhIHsKLQl1aW50OF90ICpkYXRhOwotCXVpbnQzMl90IGxlbmd0aDsKLX07Ci0KLXN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCB7Ci0Jc3RydWN0ICBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzZW5zb3JkYXRhOwotCXN0cnVjdCBpMmNfY2xpZW50ICptc21fc2Vuc29yX2NsaWVudDsKLQlzdHJ1Y3QgaTJjX2RyaXZlciAqc2Vuc29yX2kyY19kcml2ZXI7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50ICpzZW5zb3JfaTJjX2NsaWVudDsKLQl1aW50MTZfdCBzZW5zb3JfaTJjX2FkZHI7Ci0JZW51bSBtc21fY2FtZXJhX3ZyZWdfbmFtZV90ICp2cmVnX3NlcTsKLQlpbnQgbnVtX3ZyZWdfc2VxOwotCXN0cnVjdCBtc21fY2FtZXJhX3Bvd2VyX3NlcV90ICpwb3dlcl9zZXE7Ci0JaW50IG51bV9wb3dlcl9zZXE7Ci0JZW51bSBtc21fc2Vuc29yX2RldmljZV90eXBlX3Qgc2Vuc29yX2RldmljZV90eXBlOwotCi0Jc3RydWN0IG1zbV9zZW5zb3Jfb3V0cHV0X3JlZ19hZGRyX3QgKnNlbnNvcl9vdXRwdXRfcmVnX2FkZHI7Ci0Jc3RydWN0IG1zbV9zZW5zb3JfaWRfaW5mb190ICpzZW5zb3JfaWRfaW5mbzsKLQlzdHJ1Y3QgbXNtX3NlbnNvcl9leHBfZ2Fpbl9pbmZvX3QgKnNlbnNvcl9leHBfZ2Fpbl9pbmZvOwotCXN0cnVjdCBtc21fc2Vuc29yX3JlZ190ICptc21fc2Vuc29yX3JlZzsKLQlzdHJ1Y3QgbXNtX3NlbnNvcl92NGwyX2N0cmxfaW5mb190ICptc21fc2Vuc29yX3Y0bDJfY3RybF9pbmZvOwotCXVpbnQxNl90IG51bV92NGwyX2N0cmw7Ci0JdWludDhfdCBpc19jc2ljOwotCi0JdWludDE2X3QgY3Vycl9saW5lX2xlbmd0aF9wY2xrOwotCXVpbnQxNl90IGN1cnJfZnJhbWVfbGVuZ3RoX2xpbmVzOwotCi0JdWludDMyX3QgZnBzX2RpdmlkZXI7Ci0JZW51bSBtc21fc2Vuc29yX3Jlc29sdXRpb25fdCBjdXJyX3JlczsKLQllbnVtIG1zbV9zZW5zb3JfY2FtX21vZGVfdCBjYW1fbW9kZTsKLQotCXN0cnVjdCBtdXRleCAqbXNtX3NlbnNvcl9tdXRleDsKLQotCXN0cnVjdCB2NGwyX3N1YmRldiBzZW5zb3JfdjRsMl9zdWJkZXY7Ci0Jc3RydWN0IHY0bDJfc3ViZGV2X2luZm8gKnNlbnNvcl92NGwyX3N1YmRldl9pbmZvOwotCXVpbnQ4X3Qgc2Vuc29yX3Y0bDJfc3ViZGV2X2luZm9fc2l6ZTsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzICpzZW5zb3JfdjRsMl9zdWJkZXZfb3BzOwotCXN0cnVjdCBtc21fc2Vuc29yX2ZuX3QgKmZ1bmNfdGJsOwotCXN0cnVjdCByZWd1bGF0b3IgKipyZWdfcHRyOwotCXN0cnVjdCBjbGsgKmNhbV9jbGtbMl07Ci0JbG9uZyBjbGtfcmF0ZTsKLQllbnVtIG1zbV9zZW5zb3Jfc3RhdGUgc2Vuc29yX3N0YXRlOwotCS8qIE51bWJlciBvZiBmcmFtZXMgdG8gZGVsYXkgYWZ0ZXIgc3RhcnQgLyBzdG9wIHN0cmVhbSBpbiBRMTAgZm9ybWF0LgotCSAgIEluaXRpYWxpemUgdG8gLTEgZm9yIHRoaXMgdmFsdWUgdG8gYmUgaWdub3JlZCAqLwotCWludDE2X3Qgd2FpdF9udW1fZnJhbWVzOwotCS8qIG1pbmltdW0gZGVsYXkgYWZ0ZXIgc3RvcCAvIHN0b3Agc3RyZWFtIGluIG1zICovCi0JdWludDE2X3QgbWluX2RlbGF5OwotCS8qIGRlbGF5IChpbiBtcykgYWZ0ZXIgcG93ZXIgdXAgc2VxdWVuY2UgKi8KLQl1aW50MTZfdCBwb3dlcl9zZXFfZGVsYXk7Ci0Jc3RydWN0IG1zbV9zZW5zb3JfZWVwcm9tX2RhdGEgZWVwcm9tX2RhdGE7Ci19OwotCi1zdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKmdldF9zY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9tc21fc2Vuc29yX2luaXQuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL21zbV9zZW5zb3JfaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzU5Y2YxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL21zbV9zZW5zb3JfaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSAibXNtX3NlbnNvci5oIgotI2luY2x1ZGUgIm1zbS5oIgotI2luY2x1ZGUgIm1zbV9zZW5zb3JfYmF5ZXIuaCIKLSNpbmNsdWRlICJpbXgwOTEuaCIKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyICpzZW5zb3JfaTJjX2RyaXZlcltdID0gewotCS8qIGJhY2sgY2FtZXJhICovCi0JJmlteDA5MV9pMmNfZHJpdmVyLAotCS8qIGZyb250IGNhbWVyYSAqLwotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX3NlbnNvcl9pbml0X21vZHVsZSh2b2lkKQotewotCWludCBpbmRleCA9IDA7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgQVJSQVlfU0laRShzZW5zb3JfaTJjX2RyaXZlcik7IGluZGV4KyspCi0JCWkyY19hZGRfZHJpdmVyKHNlbnNvcl9pMmNfZHJpdmVyW2luZGV4XSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLW1vZHVsZV9pbml0KG1zbV9zZW5zb3JfaW5pdF9tb2R1bGUpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTZW5zb3IgZHJpdmVyIHByb2JlIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9tdDllMDEzX3Y0bDIuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL210OWUwMTNfdjRsMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODliZWJhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL210OWUwMTNfdjRsMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDk2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1zbV9zZW5zb3IuaCIKLSNkZWZpbmUgU0VOU09SX05BTUUgIm10OWUwMTMiCi0jZGVmaW5lIFBMQVRGT1JNX0RSSVZFUl9OQU1FICJtc21fY2FtZXJhX210OWUwMTMiCi0jZGVmaW5lIG10OWUwMTNfb2JqIG10OWUwMTNfIyNvYmoKLQotREVGSU5FX01VVEVYKG10OWUwMTNfbXV0KTsKLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgbXQ5ZTAxM19zX2N0cmw7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgbXQ5ZTAxM19ncm91cG9uX3NldHRpbmdzW10gPSB7Ci0JezB4MDEwNCwgMHgwMX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIG10OWUwMTNfZ3JvdXBvZmZfc2V0dGluZ3NbXSA9IHsKLQl7MHgwMTA0LCAweDAwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgbXQ5ZTAxM19wcmV2X3NldHRpbmdzW10gPSB7Ci0JLypPdXRwdXQgU2l6ZSAoMTYzMngxMjI0KSovCi0JezB4MDM0NCwgMHgwMDA4fSwvKlhfQUREUl9TVEFSVCovCi0JezB4MDM0OCwgMHgwQ0M5fSwvKlhfQUREUl9FTkQqLwotCXsweDAzNDYsIDB4MDAwOH0sLypZX0FERFJfU1RBUlQqLwotCXsweDAzNEEsIDB4MDk5OX0sLypZX0FERFJfRU5EKi8KLQl7MHgwMzRDLCAweDA2NjB9LC8qWF9PVVRQVVRfU0laRSovCi0JezB4MDM0RSwgMHgwNEM4fSwvKllfT1VUUFVUX1NJWkUqLwotCXsweDMwNkUsIDB4RkNCMH0sLypEQVRBUEFUSF9TRUxFQ1QqLwotCXsweDMwNDAsIDB4MDRDM30sLypSRUFEX01PREUqLwotCXsweDMxNzgsIDB4MDAwMH0sLypBTkFMT0dfQ09OVFJPTDUqLwotCXsweDNFRDAsIDB4MUUyNH0sLypEQUNfTERfNF81Ki8KLQl7MHgwNDAwLCAweDAwMDJ9LC8qU0NBTElOR19NT0RFKi8KLQl7MHgwNDA0LCAweDAwMTB9LC8qU0NBTEVfTSovCi0JLypUaW1pbmcgY29uZmlndXJhdGlvbiovCi0JezB4MDM0MiwgMHgxMDE4fSwvKkxJTkVfTEVOR1RIX1BDSyovCi0JezB4MDM0MCwgMHgwNTVCfSwvKkZSQU1FX0xFTkdUSF9MSU5FUyovCi0JezB4MDIwMiwgMHgwNTU3fSwvKkNPQVJTRV9JTlRFR1JBVElPTl9USU1FKi8KLQl7MHgzMDE0LCAweDA4NDZ9LC8qRklORV9JTlRFR1JBVElPTl9USU1FXyovCi0JezB4MzAxMCwgMHgwMTMwfSwvKkZJTkVfQ09SUkVDVElPTiovCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIG10OWUwMTNfc25hcF9zZXR0aW5nc1tdID0gewotCS8qT3V0cHV0IFNpemUgKDMyNjR4MjQ0OCkqLwotCXsweDAzNDQsIDB4MDAwMH0sLypYX0FERFJfU1RBUlQgKi8KLQl7MHgwMzQ4LCAweDBDQ0Z9LC8qWF9BRERSX0VORCovCi0JezB4MDM0NiwgMHgwMDAwfSwvKllfQUREUl9TVEFSVCAqLwotCXsweDAzNEEsIDB4MDk5Rn0sLypZX0FERFJfRU5EKi8KLQl7MHgwMzRDLCAweDBDRDB9LC8qWF9PVVRQVVRfU0laRSovCi0JezB4MDM0RSwgMHgwOUEwfSwvKllfT1VUUFVUX1NJWkUqLwotCXsweDMwNkUsIDB4RkM4MH0sLypEQVRBUEFUSF9TRUxFQ1QqLwotCXsweDMwNDAsIDB4MDA0MX0sLypSRUFEX01PREUqLwotCXsweDMxNzgsIDB4MDAwMH0sLypBTkFMT0dfQ09OVFJPTDUqLwotCXsweDNFRDAsIDB4MUUyNH0sLypEQUNfTERfNF81Ki8KLQl7MHgwNDAwLCAweDAwMDB9LC8qU0NBTElOR19NT0RFKi8KLQl7MHgwNDA0LCAweDAwMTB9LC8qU0NBTEVfTSovCi0JLypUaW1pbmcgY29uZmlndXJhdGlvbiovCi0JezB4MDM0MiwgMHgxM0Y4fSwvKkxJTkVfTEVOR1RIX1BDSyovCi0JezB4MDM0MCwgMHgwQTJGfSwvKkZSQU1FX0xFTkdUSF9MSU5FUyovCi0JezB4MDIwMiwgMHgwQTFGfSwvKkNPQVJTRV9JTlRFR1JBVElPTl9USU1FKi8KLQl7MHgzMDE0LCAweDAzRjZ9LC8qRklORV9JTlRFR1JBVElPTl9USU1FXyAqLwotCXsweDMwMTAsIDB4MDA3OH0sLypGSU5FX0NPUlJFQ1RJT04qLwotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBtdDllMDEzX2hmcjYwX3NldHRpbmdzW10gPSB7Ci0JezB4MDMwMCwgMHgwMDA1fSwvKlZUX1BJWF9DTEtfRElWKi8KLQl7MHgwMzAyLCAweDAwMDF9LC8qVlRfU1lTX0NMS19ESVYqLwotCXsweDAzMDQsIDB4MDAwMn0sLypQUkVfUExMX0NMS19ESVYqLwotCXsweDAzMDYsIDB4MDAyOX0sLypQTExfTVVMVElQTElFUiovCi0JezB4MDMwOCwgMHgwMDBBfSwvKk9QX1BJWF9DTEtfRElWKi8KLQl7MHgwMzBBLCAweDAwMDF9LC8qT1BfU1lTX0NMS19ESVYqLwotCXsweDAzNDQsIDB4MDAwOH0sLypYX0FERFJfU1RBUlQqLwotCXsweDAzNDgsIDB4MDY4NX0sLypYX0FERFJfRU5EKi8KLQl7MHgwMzQ2LCAweDAxM2F9LC8qWV9BRERSX1NUQVJUKi8KLQl7MHgwMzRBLCAweDA1NUJ9LC8qWV9BRERSX0VORCovCi0JezB4MDM0QywgMHgwMzQwfSwvKlhfT1VUUFVUX1NJWkUqLwotCXsweDAzNEUsIDB4MDIxMn0sLypZX09VVFBVVF9TSVpFKi8KLQl7MHgzMDZFLCAweEZDODB9LC8qREFUQVBBVEhfU0VMRUNUKi8KLQl7MHgzMDQwLCAweDAwQzN9LC8qUkVBRF9NT0RFKi8KLQl7MHgzMTc4LCAweDAwMDB9LC8qQU5BTE9HX0NPTlRST0w1Ki8KLQl7MHgzRUQwLCAweDFFMjR9LC8qREFDX0xEXzRfNSovCi0JezB4MDQwMCwgMHgwMDAwfSwvKlNDQUxJTkdfTU9ERSovCi0JezB4MDQwNCwgMHgwMDEwfSwvKlNDQUxFX00qLwotCS8qVGltaW5nIGNvbmZpZ3VyYXRpb24qLwotCXsweDAzNDIsIDB4MDk3MH0sLypMSU5FX0xFTkdUSF9QQ0sqLwotCXsweDAzNDAsIDB4MDJBMX0sLypGUkFNRV9MRU5HVEhfTElORVMqLwotCXsweDAyMDIsIDB4MDJBMX0sLypDT0FSU0VfSU5URUdSQVRJT05fVElNRSovCi0JezB4MzAxNCwgMHgwM0Y2fSwvKkZJTkVfSU5URUdSQVRJT05fVElNRV8qLwotCXsweDMwMTAsIDB4MDA3OH0sLypGSU5FX0NPUlJFQ1RJT04qLwotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBtdDllMDEzX2hmcjkwX3NldHRpbmdzW10gPSB7Ci0JezB4MDMwMCwgMHgwMDA1fSwvKlZUX1BJWF9DTEtfRElWKi8KLQl7MHgwMzAyLCAweDAwMDF9LC8qVlRfU1lTX0NMS19ESVYqLwotCXsweDAzMDQsIDB4MDAwMn0sLypQUkVfUExMX0NMS19ESVYqLwotCXsweDAzMDYsIDB4MDAzRH0sLypQTExfTVVMVElQTElFUiovCi0JezB4MDMwOCwgMHgwMDBBfSwvKk9QX1BJWF9DTEtfRElWKi8KLQl7MHgwMzBBLCAweDAwMDF9LC8qT1BfU1lTX0NMS19ESVYqLwotCXsweDAzNDQsIDB4MDAwOH0sLypYX0FERFJfU1RBUlQqLwotCXsweDAzNDgsIDB4MDY4NX0sLypYX0FERFJfRU5EKi8KLQl7MHgwMzQ2LCAweDAxM2F9LC8qWV9BRERSX1NUQVJUKi8KLQl7MHgwMzRBLCAweDA1NUJ9LC8qWV9BRERSX0VORCovCi0JezB4MDM0QywgMHgwMzQwfSwvKlhfT1VUUFVUX1NJWkUqLwotCXsweDAzNEUsIDB4MDIxMn0sLypZX09VVFBVVF9TSVpFKi8KLQl7MHgzMDZFLCAweEZDODB9LC8qREFUQVBBVEhfU0VMRUNUKi8KLQl7MHgzMDQwLCAweDAwQzN9LC8qUkVBRF9NT0RFKi8KLQl7MHgzMTc4LCAweDAwMDB9LC8qQU5BTE9HX0NPTlRST0w1Ki8KLQl7MHgzRUQwLCAweDFFMjR9LC8qREFDX0xEXzRfNSovCi0JezB4MDQwMCwgMHgwMDAwfSwvKlNDQUxJTkdfTU9ERSovCi0JezB4MDQwNCwgMHgwMDEwfSwvKlNDQUxFX00qLwotCS8qVGltaW5nIGNvbmZpZ3VyYXRpb24qLwotCXsweDAzNDIsIDB4MDk3MH0sLypMSU5FX0xFTkdUSF9QQ0sqLwotCXsweDAzNDAsIDB4MDJBMX0sLypGUkFNRV9MRU5HVEhfTElORVMqLwotCXsweDAyMDIsIDB4MDJBMX0sLypDT0FSU0VfSU5URUdSQVRJT05fVElNRSovCi0JezB4MzAxNCwgMHgwM0Y2fSwvKkZJTkVfSU5URUdSQVRJT05fVElNRV8qLwotCXsweDMwMTAsIDB4MDA3OH0sLypGSU5FX0NPUlJFQ1RJT04qLwotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBtdDllMDEzX2hmcjEyMF9zZXR0aW5nc1tdID0gewotCXsweDAzMDAsIDB4MDAwNX0sLypWVF9QSVhfQ0xLX0RJViovCi0JezB4MDMwMiwgMHgwMDAxfSwvKlZUX1NZU19DTEtfRElWKi8KLQl7MHgwMzA0LCAweDAwMDJ9LC8qUFJFX1BMTF9DTEtfRElWKi8KLQl7MHgwMzA2LCAweDAwNTJ9LC8qUExMX01VTFRJUExJRVIqLwotCXsweDAzMDgsIDB4MDAwQX0sLypPUF9QSVhfQ0xLX0RJViovCi0JezB4MDMwQSwgMHgwMDAxfSwvKk9QX1NZU19DTEtfRElWKi8KLQl7MHgwMzQ0LCAweDAwMDh9LC8qWF9BRERSX1NUQVJUKi8KLQl7MHgwMzQ4LCAweDA2ODV9LC8qWF9BRERSX0VORCovCi0JezB4MDM0NiwgMHgwMTNhfSwvKllfQUREUl9TVEFSVCovCi0JezB4MDM0QSwgMHgwNTVCfSwvKllfQUREUl9FTkQqLwotCXsweDAzNEMsIDB4MDM0MH0sLypYX09VVFBVVF9TSVpFKi8KLQl7MHgwMzRFLCAweDAyMTJ9LC8qWV9PVVRQVVRfU0laRSovCi0JezB4MzA2RSwgMHhGQzgwfSwvKkRBVEFQQVRIX1NFTEVDVCovCi0JezB4MzA0MCwgMHgwMEMzfSwvKlJFQURfTU9ERSovCi0JezB4MzE3OCwgMHgwMDAwfSwvKkFOQUxPR19DT05UUk9MNSovCi0JezB4M0VEMCwgMHgxRTI0fSwvKkRBQ19MRF80XzUqLwotCXsweDA0MDAsIDB4MDAwMH0sLypTQ0FMSU5HX01PREUqLwotCXsweDA0MDQsIDB4MDAxMH0sLypTQ0FMRV9NKi8KLQkvKlRpbWluZyBjb25maWd1cmF0aW9uKi8KLQl7MHgwMzQyLCAweDA5NzB9LC8qTElORV9MRU5HVEhfUENLKi8KLQl7MHgwMzQwLCAweDAyQTF9LC8qRlJBTUVfTEVOR1RIX0xJTkVTKi8KLQl7MHgwMjAyLCAweDAyQTF9LC8qQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUUqLwotCXsweDMwMTQsIDB4MDNGNn0sLypGSU5FX0lOVEVHUkFUSU9OX1RJTUVfKi8KLQl7MHgzMDEwLCAweDAwNzh9LC8qRklORV9DT1JSRUNUSU9OKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgbXQ5ZTAxM19yZWNvbW1lbmRfc2V0dGluZ3NbXSA9IHsKLQkvKkRpc2FibGUgZW1iZWRkZWQgZGF0YSovCi0JezB4MzA2NCwgMHg3ODAwfSwvKlNNSUFfVEVTVCovCi0JLypjb25maWd1cmUgMi1sYW5lIE1JUEkqLwotCXsweDMxQUUsIDB4MDIwMn0sLypTRVJJQUxfRk9STUFUKi8KLQl7MHgzMUI4LCAweDBFM0Z9LC8qTUlQSV9USU1JTkdfMiovCi0JLypzZXQgZGF0YSB0byBSQVcxMCBmb3JtYXQqLwotCXsweDAxMTIsIDB4MEEwQX0sLypDQ1BfREFUQV9GT1JNQVQqLwotCXsweDMwRjAsIDB4ODAwRH0sLypWQ00gQ09OVFJPTCovCi0KLQl7MHgzMDQ0LCAweDA1OTB9LAotCXsweDMwNkUsIDB4RkM4MH0sCi0JezB4MzBCMiwgMHhDMDAwfSwKLQl7MHgzMEQ2LCAweDA4MDB9LAotCXsweDMxNkMsIDB4QjQyRn0sCi0JezB4MzE2RSwgMHg4NjlBfSwKLQl7MHgzMTcwLCAweDIxMEV9LAotCXsweDMxN0EsIDB4MDEwRX0sCi0JezB4MzFFMCwgMHgxRkI5fSwKLQl7MHgzMUU2LCAweDA3RkN9LAotCXsweDM3QzAsIDB4MDAwMH0sCi0JezB4MzdDMiwgMHgwMDAwfSwKLQl7MHgzN0M0LCAweDAwMDB9LAotCXsweDM3QzYsIDB4MDAwMH0sCi0JezB4M0UwMCwgMHgwMDExfSwKLQl7MHgzRTAyLCAweDg4MDF9LAotCXsweDNFMDQsIDB4MjgwMX0sCi0JezB4M0UwNiwgMHg4NDQ5fSwKLQl7MHgzRTA4LCAweDY4NDF9LAotCXsweDNFMEEsIDB4NDAwQ30sCi0JezB4M0UwQywgMHgxMDAxfSwKLQl7MHgzRTBFLCAweDI2MDN9LAotCXsweDNFMTAsIDB4NEI0MX0sCi0JezB4M0UxMiwgMHg0QjI0fSwKLQl7MHgzRTE0LCAweEEzQ0Z9LAotCXsweDNFMTYsIDB4ODgwMn0sCi0JezB4M0UxOCwgMHg4NDAxfSwKLQl7MHgzRTFBLCAweDg2MDF9LAotCXsweDNFMUMsIDB4ODQwMX0sCi0JezB4M0UxRSwgMHg4NDBBfSwKLQl7MHgzRTIwLCAweEZGMDB9LAotCXsweDNFMjIsIDB4ODQwMX0sCi0JezB4M0UyNCwgMHgwMEZGfSwKLQl7MHgzRTI2LCAweDAwODh9LAotCXsweDNFMjgsIDB4MkU4QX0sCi0JezB4M0UzMCwgMHgwMDAwfSwKLQl7MHgzRTMyLCAweDg4MDF9LAotCXsweDNFMzQsIDB4NDAyOX0sCi0JezB4M0UzNiwgMHgwMEZGfSwKLQl7MHgzRTM4LCAweDg0Njl9LAotCXsweDNFM0EsIDB4MDBGRn0sCi0JezB4M0UzQywgMHgyODAxfSwKLQl7MHgzRTNFLCAweDNFMkF9LAotCXsweDNFNDAsIDB4MUMwMX0sCi0JezB4M0U0MiwgMHhGRjg0fSwKLQl7MHgzRTQ0LCAweDg0MDF9LAotCXsweDNFNDYsIDB4MEMwMX0sCi0JezB4M0U0OCwgMHg4NDAxfSwKLQl7MHgzRTRBLCAweDAwRkZ9LAotCXsweDNFNEMsIDB4ODQwMn0sCi0JezB4M0U0RSwgMHg4OTg0fSwKLQl7MHgzRTUwLCAweDY2Mjh9LAotCXsweDNFNTIsIDB4ODM0MH0sCi0JezB4M0U1NCwgMHgwMEZGfSwKLQl7MHgzRTU2LCAweDRBNDJ9LAotCXsweDNFNTgsIDB4MjcwM30sCi0JezB4M0U1QSwgMHg2NzUyfSwKLQl7MHgzRTVDLCAweDNGMkF9LAotCXsweDNFNUUsIDB4ODQ2QX0sCi0JezB4M0U2MCwgMHg0QzAxfSwKLQl7MHgzRTYyLCAweDg0MDF9LAotCXsweDNFNjYsIDB4MzkwMX0sCi0JezB4M0U5MCwgMHgyQzAxfSwKLQl7MHgzRTk4LCAweDJCMDJ9LAotCXsweDNFOTIsIDB4MkEwNH0sCi0JezB4M0U5NCwgMHgyNTA5fSwKLQl7MHgzRTk2LCAweDAwMDB9LAotCXsweDNFOUEsIDB4MjkwNX0sCi0JezB4M0U5QywgMHgwMEZGfSwKLQl7MHgzRUNDLCAweDAwRUJ9LAotCXsweDNFRDAsIDB4MUUyNH0sCi0JezB4M0VENCwgMHhBRkM0fSwKLQl7MHgzRUQ2LCAweDkwOUJ9LAotCXsweDNFRTAsIDB4MjQyNH0sCi0JezB4M0VFMiwgMHg5Nzk3fSwKLQl7MHgzRUU0LCAweEMxMDB9LAotCXsweDNFRTYsIDB4MDU0MH0sCi0JezB4MzE3NCwgMHg4MDAwfSwKLQkvKiBQTEwgc2V0dGluZ3MgKi8KLQl7MHgwMzAwLCAweDAwMDR9LC8qVlRfUElYX0NMS19ESVYqLwotCXsweDAzMDIsIDB4MDAwMX0sLypWVF9TWVNfQ0xLX0RJViovCi0JezB4MDMwNCwgMHgwMDAyfSwvKlBSRV9QTExfQ0xLX0RJViovCi0JezB4MDMwNiwgMHgwMDNBfSwvKlBMTF9NVUxUSVBMSUVSKi8KLQl7MHgwMzA4LCAweDAwMEF9LC8qT1BfUElYX0NMS19ESVYqLwotCXsweDAzMEEsIDB4MDAwMX0sLypPUF9TWVNfQ0xLX0RJViovCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2luZm8gbXQ5ZTAxM19zdWJkZXZfaW5mb1tdID0gewotCXsKLQkuY29kZSAgID0gVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzFYMTAsCi0JLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKLQkuZm10ICAgID0gMSwKLQkub3JkZXIgICAgPSAwLAotCX0sCi0JLyogbW9yZSBjYW4gYmUgc3VwcG9ydGVkLCB0byBiZSBhZGRlZCBsYXRlciAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5IG10OWUwMTNfaW5pdF9jb25mW10gPSB7Ci0JeyZtdDllMDEzX3JlY29tbWVuZF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKG10OWUwMTNfcmVjb21tZW5kX3NldHRpbmdzKSwgMCwgTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBfQotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5IG10OWUwMTNfY29uZnNbXSA9IHsKLQl7Jm10OWUwMTNfc25hcF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKG10OWUwMTNfc25hcF9zZXR0aW5ncyksIDAsIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQX0sCi0JeyZtdDllMDEzX3ByZXZfc2V0dGluZ3NbMF0sCi0JQVJSQVlfU0laRShtdDllMDEzX3ByZXZfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEF9LAotCXsmbXQ5ZTAxM19oZnI2MF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKG10OWUwMTNfaGZyNjBfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEF9LAotCXsmbXQ5ZTAxM19oZnI5MF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKG10OWUwMTNfaGZyOTBfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEF9LAotCXsmbXQ5ZTAxM19oZnIxMjBfc2V0dGluZ3NbMF0sCi0JQVJSQVlfU0laRShtdDllMDEzX2hmcjEyMF9zZXR0aW5ncyksIDAsIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3Jfb3V0cHV0X2luZm9fdCBtdDllMDEzX2RpbWVuc2lvbnNbXSA9IHsKLQl7Ci0JCS54X291dHB1dCA9IDB4Q0QwLAotCQkueV9vdXRwdXQgPSAweDlBMCwKLQkJLmxpbmVfbGVuZ3RoX3BjbGsgPSAweDEzRjgsCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweEEyRiwKLQkJLnZ0X3BpeGVsX2NsayA9IDE3NDAwMDAwMCwKLQkJLm9wX3BpeGVsX2NsayA9IDE3NDAwMDAwMCwKLQkJLmJpbm5pbmdfZmFjdG9yID0gMSwKLQl9LAotCXsKLQkJLnhfb3V0cHV0ID0gMHg2NjAsCi0JCS55X291dHB1dCA9IDB4NEM4LAotCQkubGluZV9sZW5ndGhfcGNsayA9IDB4MTAxOCwKLQkJLmZyYW1lX2xlbmd0aF9saW5lcyA9IDB4NTVCLAotCQkudnRfcGl4ZWxfY2xrID0gMTc0MDAwMDAwLAotCQkub3BfcGl4ZWxfY2xrID0gMTc0MDAwMDAwLAotCQkuYmlubmluZ19mYWN0b3IgPSAxLAotCX0sCi0JewotCQkueF9vdXRwdXQgPSAweDM0MCwKLQkJLnlfb3V0cHV0ID0gMHgyMTIsCi0JCS5saW5lX2xlbmd0aF9wY2xrID0gMHg5NzAsCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweDJBMSwKLQkJLnZ0X3BpeGVsX2NsayA9IDk4NDAwMDAwLAotCQkub3BfcGl4ZWxfY2xrID0gOTg0MDAwMDAsCi0JCS5iaW5uaW5nX2ZhY3RvciA9IDEsCi0JfSwKLQl7Ci0JCS54X291dHB1dCA9IDB4MzQwLAotCQkueV9vdXRwdXQgPSAweDIxMiwKLQkJLmxpbmVfbGVuZ3RoX3BjbGsgPSAweDk3MCwKLQkJLmZyYW1lX2xlbmd0aF9saW5lcyA9IDB4MkExLAotCQkudnRfcGl4ZWxfY2xrID0gMTQ2NDAwMDAwLAotCQkub3BfcGl4ZWxfY2xrID0gMTQ2NDAwMDAwLAotCQkuYmlubmluZ19mYWN0b3IgPSAxLAotCX0sCi0JewotCQkueF9vdXRwdXQgPSAweDM0MCwKLQkJLnlfb3V0cHV0ID0gMHgyMTIsCi0JCS5saW5lX2xlbmd0aF9wY2xrID0gMHg5NzAsCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweDJBMSwKLQkJLnZ0X3BpeGVsX2NsayA9IDE5NjgwMDAwMCwKLQkJLm9wX3BpeGVsX2NsayA9IDE5NjgwMDAwMCwKLQkJLmJpbm5pbmdfZmFjdG9yID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX291dHB1dF9yZWdfYWRkcl90IG10OWUwMTNfcmVnX2FkZHIgPSB7Ci0JLnhfb3V0cHV0ID0gMHgzNEMsCi0JLnlfb3V0cHV0ID0gMHgzNEUsCi0JLmxpbmVfbGVuZ3RoX3BjbGsgPSAweDM0MiwKLQkuZnJhbWVfbGVuZ3RoX2xpbmVzID0gMHgzNDAsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfaWRfaW5mb190IG10OWUwMTNfaWRfaW5mbyA9IHsKLQkuc2Vuc29yX2lkX3JlZ19hZGRyID0gMHgwLAotCS5zZW5zb3JfaWQgPSAweDRCMDAsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfZXhwX2dhaW5faW5mb190IG10OWUwMTNfZXhwX2dhaW5faW5mbyA9IHsKLQkuY29hcnNlX2ludF90aW1lX2FkZHIgPSAweDIwMiwKLQkuZ2xvYmFsX2dhaW5fYWRkciA9IDB4MzA1RSwKLQkudmVydF9vZmZzZXQgPSAwLAotfTsKLQotc3RhdGljIGludDMyX3QgbXQ5ZTAxM193cml0ZV9leHBfZ2FpbihzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwKLQkJdWludDE2X3QgZ2FpbiwgdWludDMyX3QgbGluZSkKLXsKLQl1aW50MzJfdCBmbF9saW5lczsKLQlmbF9saW5lcyA9Ci0JCShzX2N0cmwtPmN1cnJfZnJhbWVfbGVuZ3RoX2xpbmVzICogc19jdHJsLT5mcHNfZGl2aWRlcikgLyBRMTA7Ci0KLQlzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfZ3JvdXBfaG9sZF9vbihzX2N0cmwpOwotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCXNfY3RybC0+c2Vuc29yX2V4cF9nYWluX2luZm8tPmdsb2JhbF9nYWluX2FkZHIsIGdhaW4gfCAweDEwMDAsCi0JCU1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSk7Ci0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Y29hcnNlX2ludF90aW1lX2FkZHIsIGxpbmUsCi0JCU1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSk7Ci0Jc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX2dyb3VwX2hvbGRfb2ZmKHNfY3RybCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IG10OWUwMTNfd3JpdGVfZXhwX3NuYXBzaG90X2dhaW4oc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JCXVpbnQxNl90IGdhaW4sIHVpbnQzMl90IGxpbmUpCi17Ci0JdWludDMyX3QgZmxfbGluZXM7Ci0JZmxfbGluZXMgPQotCQkoc19jdHJsLT5jdXJyX2ZyYW1lX2xlbmd0aF9saW5lcyAqIHNfY3RybC0+ZnBzX2RpdmlkZXIpIC8gUTEwOwotCi0Jc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX2dyb3VwX2hvbGRfb24oc19jdHJsKTsKLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT5nbG9iYWxfZ2Fpbl9hZGRyLCBnYWluIHwgMHgxMDAwLAotCQlNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEEpOwotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCXNfY3RybC0+c2Vuc29yX2V4cF9nYWluX2luZm8tPmNvYXJzZV9pbnRfdGltZV9hZGRyLCBsaW5lLAotCQlNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEEpOwotCXNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9ncm91cF9ob2xkX29mZihzX2N0cmwpOwotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCTB4MzAxQSwgKDB4MDY1Q3wweDIpLCBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEEpOwotCi0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgdm9pZCBtdDllMDEzX3N0YXJ0X3N0cmVhbShzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCkKLXsKLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkweDMwMUEsIDB4ODI1MCwgTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBKTsKLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkweDMwMUEsIDB4ODY1MCwgTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBKTsKLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkweDMwMUEsIDB4ODY1OCwgTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBKTsKLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkweDAxMDQsIDB4MDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJMHgzMDFBLCAweDA2NUMsIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG10OWUwMTNfc3RvcF9zdHJlYW0oc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwpCi17Ci0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJMHgzMDFBLCAweDAwNTgsIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSk7Ci0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJMHgzMDFBLCAweDAwNTAsIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSk7Ci0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJMHgwMTA0LCAweDAxLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbXQ5ZTAxM19pMmNfaWRbXSA9IHsKLQl7U0VOU09SX05BTUUsIChrZXJuZWxfdWxvbmdfdCkmbXQ5ZTAxM19zX2N0cmx9LAotCXsgfQotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG10OWUwMTNfaTJjX2RyaXZlciA9IHsKLQkuaWRfdGFibGUgPSBtdDllMDEzX2kyY19pZCwKLQkucHJvYmUgID0gbXNtX3NlbnNvcl9pMmNfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBTRU5TT1JfTkFNRSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgbXQ5ZTAxM19zZW5zb3JfaTJjX2NsaWVudCA9IHsKLQkuYWRkcl90eXBlID0gTVNNX0NBTUVSQV9JMkNfV09SRF9BRERSLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX3NlbnNvcl9pbml0X21vZHVsZSh2b2lkKQotewotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbXQ5ZTAxM19pMmNfZHJpdmVyKTsKLX0KLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBtdDllMDEzX3N1YmRldl9jb3JlX29wcyA9IHsKLQkuaW9jdGwgPSBtc21fc2Vuc29yX3N1YmRldl9pb2N0bCwKLQkuc19wb3dlciA9IG1zbV9zZW5zb3JfcG93ZXIsCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBtdDllMDEzX3N1YmRldl92aWRlb19vcHMgPSB7Ci0JLmVudW1fbWJ1c19mbXQgPSBtc21fc2Vuc29yX3Y0bDJfZW51bV9mbXQsCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBtdDllMDEzX3N1YmRldl9vcHMgPSB7Ci0JLmNvcmUgPSAmbXQ5ZTAxM19zdWJkZXZfY29yZV9vcHMsCi0JLnZpZGVvICA9ICZtdDllMDEzX3N1YmRldl92aWRlb19vcHMsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfZm5fdCBtdDllMDEzX2Z1bmNfdGJsID0gewotCS5zZW5zb3Jfc3RhcnRfc3RyZWFtID0gbXQ5ZTAxM19zdGFydF9zdHJlYW0sCi0JLnNlbnNvcl9zdG9wX3N0cmVhbSA9IG10OWUwMTNfc3RvcF9zdHJlYW0sCi0JLnNlbnNvcl9ncm91cF9ob2xkX29uID0gbXNtX3NlbnNvcl9ncm91cF9ob2xkX29uLAotCS5zZW5zb3JfZ3JvdXBfaG9sZF9vZmYgPSBtc21fc2Vuc29yX2dyb3VwX2hvbGRfb2ZmLAotCS5zZW5zb3Jfc2V0X2ZwcyA9IG1zbV9zZW5zb3Jfc2V0X2ZwcywKLQkuc2Vuc29yX3dyaXRlX2V4cF9nYWluID0gbXQ5ZTAxM193cml0ZV9leHBfZ2FpbiwKLQkuc2Vuc29yX3dyaXRlX3NuYXBzaG90X2V4cF9nYWluID0gbXQ5ZTAxM193cml0ZV9leHBfc25hcHNob3RfZ2FpbiwKLQkuc2Vuc29yX2NzaV9zZXR0aW5nID0gbXNtX3NlbnNvcl9zZXR0aW5nMSwKLQkuc2Vuc29yX3NldF9zZW5zb3JfbW9kZSA9IG1zbV9zZW5zb3Jfc2V0X3NlbnNvcl9tb2RlLAotCS5zZW5zb3JfbW9kZV9pbml0ID0gbXNtX3NlbnNvcl9tb2RlX2luaXQsCi0JLnNlbnNvcl9nZXRfb3V0cHV0X2luZm8gPSBtc21fc2Vuc29yX2dldF9vdXRwdXRfaW5mbywKLQkuc2Vuc29yX2NvbmZpZyA9IG1zbV9zZW5zb3JfY29uZmlnLAotCS5zZW5zb3JfcG93ZXJfdXAgPSBtc21fc2Vuc29yX3Bvd2VyX3VwLAotCS5zZW5zb3JfcG93ZXJfZG93biA9IG1zbV9zZW5zb3JfcG93ZXJfZG93biwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9yZWdfdCBtdDllMDEzX3JlZ3MgPSB7Ci0JLmRlZmF1bHRfZGF0YV90eXBlID0gTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBLAotCS5ncm91cF9ob2xkX29uX2NvbmYgPSBtdDllMDEzX2dyb3Vwb25fc2V0dGluZ3MsCi0JLmdyb3VwX2hvbGRfb25fY29uZl9zaXplID0gQVJSQVlfU0laRShtdDllMDEzX2dyb3Vwb25fc2V0dGluZ3MpLAotCS5ncm91cF9ob2xkX29mZl9jb25mID0gbXQ5ZTAxM19ncm91cG9mZl9zZXR0aW5ncywKLQkuZ3JvdXBfaG9sZF9vZmZfY29uZl9zaXplID0KLQkJQVJSQVlfU0laRShtdDllMDEzX2dyb3Vwb2ZmX3NldHRpbmdzKSwKLQkuaW5pdF9zZXR0aW5ncyA9ICZtdDllMDEzX2luaXRfY29uZlswXSwKLQkuaW5pdF9zaXplID0gQVJSQVlfU0laRShtdDllMDEzX2luaXRfY29uZiksCi0JLm1vZGVfc2V0dGluZ3MgPSAmbXQ5ZTAxM19jb25mc1swXSwKLQkub3V0cHV0X3NldHRpbmdzID0gJm10OWUwMTNfZGltZW5zaW9uc1swXSwKLQkubnVtX2NvbmYgPSBBUlJBWV9TSVpFKG10OWUwMTNfY29uZnMpLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCBtdDllMDEzX3NfY3RybCA9IHsKLQkubXNtX3NlbnNvcl9yZWcgPSAmbXQ5ZTAxM19yZWdzLAotCS5zZW5zb3JfaTJjX2NsaWVudCA9ICZtdDllMDEzX3NlbnNvcl9pMmNfY2xpZW50LAotCS5zZW5zb3JfaTJjX2FkZHIgPSAweDZDLAotCS5zZW5zb3Jfb3V0cHV0X3JlZ19hZGRyID0gJm10OWUwMTNfcmVnX2FkZHIsCi0JLnNlbnNvcl9pZF9pbmZvID0gJm10OWUwMTNfaWRfaW5mbywKLQkuc2Vuc29yX2V4cF9nYWluX2luZm8gPSAmbXQ5ZTAxM19leHBfZ2Fpbl9pbmZvLAotCS5jYW1fbW9kZSA9IE1TTV9TRU5TT1JfTU9ERV9JTlZBTElELAotCS5tc21fc2Vuc29yX211dGV4ID0gJm10OWUwMTNfbXV0LAotCS5zZW5zb3JfaTJjX2RyaXZlciA9ICZtdDllMDEzX2kyY19kcml2ZXIsCi0JLnNlbnNvcl92NGwyX3N1YmRldl9pbmZvID0gbXQ5ZTAxM19zdWJkZXZfaW5mbywKLQkuc2Vuc29yX3Y0bDJfc3ViZGV2X2luZm9fc2l6ZSA9IEFSUkFZX1NJWkUobXQ5ZTAxM19zdWJkZXZfaW5mbyksCi0JLnNlbnNvcl92NGwyX3N1YmRldl9vcHMgPSAmbXQ5ZTAxM19zdWJkZXZfb3BzLAotCS5mdW5jX3RibCA9ICZtdDllMDEzX2Z1bmNfdGJsLAotCS5jbGtfcmF0ZSA9IE1TTV9TRU5TT1JfTUNMS18yNEhaLAotfTsKLQotbW9kdWxlX2luaXQobXNtX3NlbnNvcl9pbml0X21vZHVsZSk7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkFwdGluYSA4TVAgQmF5ZXIgc2Vuc29yIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL210OW0xMTRfdjRsMi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvbXQ5bTExNF92NGwyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTJmN2IuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvbXQ5bTExNF92NGwyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMyICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSAibXNtX3NlbnNvci5oIgotI2RlZmluZSBTRU5TT1JfTkFNRSAibXQ5bTExNCIKLSNkZWZpbmUgUExBVEZPUk1fRFJJVkVSX05BTUUgIm1zbV9jYW1lcmFfbXQ5bTExNCIKLSNkZWZpbmUgbXQ5bTExNF9vYmogbXQ5bTExNF8jI29iagotCi0vKiBTeXNjdGwgcmVnaXN0ZXJzICovCi0jZGVmaW5lIE1UOU0xMTRfQ09NTUFORF9SRUdJU1RFUiAgICAgICAgICAgICAgICAweDAwODAKLSNkZWZpbmUgTVQ5TTExNF9DT01NQU5EX1JFR0lTVEVSX0FQUExZX1BBVENIICAgICgxIDw8IDApCi0jZGVmaW5lIE1UOU0xMTRfQ09NTUFORF9SRUdJU1RFUl9TRVRfU1RBVEUgICAgICAoMSA8PCAxKQotI2RlZmluZSBNVDlNMTE0X0NPTU1BTkRfUkVHSVNURVJfUkVGUkVTSCAgICAgICAgKDEgPDwgMikKLSNkZWZpbmUgTVQ5TTExNF9DT01NQU5EX1JFR0lTVEVSX1dBSVRfRk9SX0VWRU5UICgxIDw8IDMpCi0jZGVmaW5lIE1UOU0xMTRfQ09NTUFORF9SRUdJU1RFUl9PSyAgICAgICAgICAgICAoMSA8PCAxNSkKLQotREVGSU5FX01VVEVYKG10OW0xMTRfbXV0KTsKLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgbXQ5bTExNF9zX2N0cmw7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgbXQ5bTExNF83MjBwX3NldHRpbmdzW10gPSB7Ci0JezB4ZGMwMCwgMHg1MCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBLCBNU01fQ0FNRVJBX0kyQ19DTURfV1JJVEV9LAotCXtNVDlNMTE0X0NPTU1BTkRfUkVHSVNURVIsIE1UOU0xMTRfQ09NTUFORF9SRUdJU1RFUl9TRVRfU1RBVEUsCi0JCU1TTV9DQU1FUkFfSTJDX1VOU0VUX1dPUkRfTUFTSywgTVNNX0NBTUVSQV9JMkNfQ01EX1BPTEx9LAotCXtNVDlNMTE0X0NPTU1BTkRfUkVHSVNURVIsIChNVDlNMTE0X0NPTU1BTkRfUkVHSVNURVJfT0sgfAotCQlNVDlNMTE0X0NPTU1BTkRfUkVHSVNURVJfU0VUX1NUQVRFKSwgTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBLAotCQlNU01fQ0FNRVJBX0kyQ19DTURfV1JJVEV9LAotCXtNVDlNMTE0X0NPTU1BTkRfUkVHSVNURVIsIE1UOU0xMTRfQ09NTUFORF9SRUdJU1RFUl9TRVRfU1RBVEUsCi0JCU1TTV9DQU1FUkFfSTJDX1VOU0VUX1dPUkRfTUFTSywgTVNNX0NBTUVSQV9JMkNfQ01EX1BPTEx9LAotCXsweERDMDEsIDB4NTIsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSwgTVNNX0NBTUVSQV9JMkNfQ01EX1BPTEx9LAotCi0JezB4MDk4RSwgMCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLQl7MHhDODAwLCAweDAwN0MsfSwvKnlfYWRkcl9zdGFydCA9IDEyNCovCi0JezB4QzgwMiwgMHgwMDA0LH0sLyp4X2FkZHJfc3RhcnQgPSA0Ki8KLQl7MHhDODA0LCAweDAzNTMsfSwvKnlfYWRkcl9lbmQgPSA4NTEqLwotCXsweEM4MDYsIDB4MDUwQix9LC8qeF9hZGRyX2VuZCA9IDEyOTEqLwotCXsweEM4MDgsIDB4MDJEQyx9LC8qcGl4Y2xrID0gNDgwMDAwMDAqLwotCXsweEM4MEEsIDB4NkMwMCx9LC8qcGl4Y2xrID0gNDgwMDAwMDAqLwotCXsweEM4MEMsIDB4MDAwMSx9LC8qcm93X3NwZWVkID0gMSovCi0JezB4QzgwRSwgMHgwMERCLH0sLypmaW5lX2ludGVnX3RpbWVfbWluID0gMjE5Ki8KLQl7MHhDODEwLCAweDA1QkQsfSwvKmZpbmVfaW50ZWdfdGltZV9tYXggPSAxNDY5Ki8KLQl7MHhDODEyLCAweDAzRTgsfSwvKmZyYW1lX2xlbmd0aF9saW5lcyA9IDEwMDAqLwotCXsweEM4MTQsIDB4MDY0MCx9LC8qbGluZV9sZW5ndGhfcGNrID0gMTYwMCovCi0JezB4QzgxNiwgMHgwMDYwLH0sLypmaW5lX2NvcnJlY3Rpb24gPSA5NiovCi0JezB4QzgxOCwgMHgwMkQzLH0sLypjcGlwZV9sYXN0X3JvdyA9IDcyMyovCi0JezB4QzgyNiwgMHgwMDIwLH0sLypyZWdfMF9kYXRhID0gMzIqLwotCXsweEM4MzQsIDB4MDAwMCx9LC8qc2Vuc29yX2NvbnRyb2xfcmVhZF9tb2RlID0gMCovCi0JezB4Qzg1NCwgMHgwMDAwLH0sLypjcm9wX3dpbmRvd194b2Zmc2V0ID0gMCovCi0JezB4Qzg1NiwgMHgwMDAwLH0sLypjcm9wX3dpbmRvd195b2Zmc2V0ID0gMCovCi0JezB4Qzg1OCwgMHgwNTAwLH0sLypjcm9wX3dpbmRvd193aWR0aCA9IDEyODAqLwotCXsweEM4NUEsIDB4MDJEMCx9LC8qY3JvcF93aW5kb3dfaGVpZ2h0ID0gNzIwKi8KLQl7MHhDODVDLCAweDAzLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LCAgLypjcm9wX2Nyb3Btb2RlID0gMyovCi0JezB4Qzg2OCwgMHgwNTAwLH0sLypvdXRwdXRfd2lkdGggPSAxMjgwKi8KLQl7MHhDODZBLCAweDAyRDAsfSwvKm91dHB1dF9oZWlnaHQgPSA3MjAqLwotCXsweEM4NzgsIDB4MDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sICAvKmFldF9hZW1vZGUgPSAwKi8KLQl7MHhDODhDLCAweDFFMDAsfSwvKmFldF9tYXhfZnJhbWVfcmF0ZSA9IDc2ODAqLwotCXsweEM4OEUsIDB4MUUwMCx9LC8qYWV0X21pbl9mcmFtZV9yYXRlID0gNzY4MCovCi0JezB4QzkxNCwgMHgwMDAwLH0sLypzdGF0X2F3Yl93aW5kb3dfeHN0YXJ0ID0gMCovCi0JezB4QzkxNiwgMHgwMDAwLH0sLypzdGF0X2F3Yl93aW5kb3dfeXN0YXJ0ID0gMCovCi0JezB4QzkxOCwgMHgwNEZGLH0sLypzdGF0X2F3Yl93aW5kb3dfeGVuZCA9IDEyNzkqLwotCXsweEM5MUEsIDB4MDJDRix9LC8qc3RhdF9hd2Jfd2luZG93X3llbmQgPSA3MTkqLwotCXsweEM5MUMsIDB4MDAwMCx9LC8qc3RhdF9hZV93aW5kb3dfeHN0YXJ0ID0gMCovCi0JezB4QzkxRSwgMHgwMDAwLH0sLypzdGF0X2FlX3dpbmRvd195c3RhcnQgPSAwKi8KLQl7MHhDOTIwLCAweDAwRkYsfSwvKnN0YXRfYWVfd2luZG93X3hlbmQgPSAyNTUqLwotCXsweEM5MjIsIDB4MDA4Rix9LC8qc3RhdF9hZV93aW5kb3dfeWVuZCA9IDE0MyovCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIG10OW0xMTRfcmVjb21tZW5kX3NldHRpbmdzW10gPSB7Ci0JezB4MzAxQSwgMHgwMjAwLCBNU01fQ0FNRVJBX0kyQ19TRVRfV09SRF9NQVNLfSwKLQl7MHgwOThFLCAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LAotCS8qY2FtX3N5c2N0bF9wbGxfZW5hYmxlID0gMSovCi0JezB4Qzk3RSwgMHgwMSwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLQkvKmNhbV9zeXNjdGxfcGxsX2RpdmlkZXJfbV9uID0gMjg4Ki8KLQl7MHhDOTgwLCAweDAxMjAsfSwKLQkvKmNhbV9zeXNjdGxfcGxsX2RpdmlkZXJfcCA9IDE3OTIqLwotCXsweEM5ODIsIDB4MDcwMCx9LAotCS8qb3V0cHV0X2NvbnRyb2wgPSAzMjc2OSovCi0JezB4Qzk4NCwgMHg4MDAxLH0sCi0JLyptaXBpX3RpbWluZ190X2hzX3plcm8gPSAzODQwKi8KLQl7MHhDOTg4LCAweDBGMDAsfSwKLQkvKm1pcGlfdGltaW5nX3RfaHNfZXhpdF9oc190cmFpbCA9IDI4MjMqLwotCXsweEM5OEEsIDB4MEIwNyx9LAotCS8qbWlwaV90aW1pbmdfdF9jbGtfcG9zdF9jbGtfcHJlID0gMzMyOSovCi0JezB4Qzk4QywgMHgwRDAxLH0sCi0JLyptaXBpX3RpbWluZ190X2Nsa190cmFpbF9jbGtfemVybyA9IDE4MjEqLwotCXsweEM5OEUsIDB4MDcxRCx9LAotCS8qbWlwaV90aW1pbmdfdF9scHggPSA2Ki8KLQl7MHhDOTkwLCAweDAwMDYsfSwKLQkvKm1pcGlfdGltaW5nX2luaXRfdGltaW5nID0gMjU3MiovCi0JezB4Qzk5MiwgMHgwQTBDLH0sCi0JezB4QzgwMCwgMHgwMDdDLH0sLyp5X2FkZHJfc3RhcnQgPSAxMjQqLwotCXsweEM4MDIsIDB4MDAwNCx9LC8qeF9hZGRyX3N0YXJ0ID0gNCovCi0JezB4QzgwNCwgMHgwMzUzLH0sLyp5X2FkZHJfZW5kID0gODUxKi8KLQl7MHhDODA2LCAweDA1MEIsfSwvKnhfYWRkcl9lbmQgPSAxMjkxKi8KLQl7MHhDODA4LCAweDAyREMsfSwvKnBpeGNsayA9IDQ4MDAwMDAwKi8KLQl7MHhDODBBLCAweDZDMDAsfSwvKnBpeGNsayA9IDQ4MDAwMDAwKi8KLQl7MHhDODBDLCAweDAwMDEsfSwvKnJvd19zcGVlZCA9IDEqLwotCXsweEM4MEUsIDB4MDBEQix9LC8qZmluZV9pbnRlZ190aW1lX21pbiA9IDIxOSovCi0JezB4QzgxMCwgMHgwNUJELH0sLypmaW5lX2ludGVnX3RpbWVfbWF4ID0gMTQ2OSovCi0JezB4QzgxMiwgMHgwM0U4LH0sLypmcmFtZV9sZW5ndGhfbGluZXMgPSAxMDAwKi8KLQl7MHhDODE0LCAweDA2NDAsfSwvKmxpbmVfbGVuZ3RoX3BjayA9IDE2MDAqLwotCXsweEM4MTYsIDB4MDA2MCx9LC8qZmluZV9jb3JyZWN0aW9uID0gOTYqLwotCXsweEM4MTgsIDB4MDJEMyx9LC8qY3BpcGVfbGFzdF9yb3cgPSA3MjMqLwotCXsweEM4MjYsIDB4MDAyMCx9LC8qcmVnXzBfZGF0YSA9IDMyKi8KLQl7MHhDODM0LCAweDAwMDAsfSwvKnNlbnNvcl9jb250cm9sX3JlYWRfbW9kZSA9IDAqLwotCXsweEM4NTQsIDB4MDAwMCx9LC8qY3JvcF93aW5kb3dfeG9mZnNldCA9IDAqLwotCXsweEM4NTYsIDB4MDAwMCx9LC8qY3JvcF93aW5kb3dfeW9mZnNldCA9IDAqLwotCXsweEM4NTgsIDB4MDUwMCx9LC8qY3JvcF93aW5kb3dfd2lkdGggPSAxMjgwKi8KLQl7MHhDODVBLCAweDAyRDAsfSwvKmNyb3Bfd2luZG93X2hlaWdodCA9IDcyMCovCi0JezB4Qzg1QywgMHgwMywgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwgIC8qY3JvcF9jcm9wbW9kZSA9IDMqLwotCXsweEM4NjgsIDB4MDUwMCx9LC8qb3V0cHV0X3dpZHRoID0gMTI4MCovCi0JezB4Qzg2QSwgMHgwMkQwLH0sLypvdXRwdXRfaGVpZ2h0ID0gNzIwKi8KLQl7MHhDODc4LCAweDAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LCAgLyphZXRfYWVtb2RlID0gMCovCi0JezB4Qzg4QywgMHgxRTAwLH0sLyphZXRfbWF4X2ZyYW1lX3JhdGUgPSA3NjgwKi8KLQl7MHhDODhFLCAweDFFMDAsfSwvKmFldF9taW5fZnJhbWVfcmF0ZSA9IDc2ODAqLwotCXsweEM5MTQsIDB4MDAwMCx9LC8qc3RhdF9hd2Jfd2luZG93X3hzdGFydCA9IDAqLwotCXsweEM5MTYsIDB4MDAwMCx9LC8qc3RhdF9hd2Jfd2luZG93X3lzdGFydCA9IDAqLwotCXsweEM5MTgsIDB4MDRGRix9LC8qc3RhdF9hd2Jfd2luZG93X3hlbmQgPSAxMjc5Ki8KLQl7MHhDOTFBLCAweDAyQ0YsfSwvKnN0YXRfYXdiX3dpbmRvd195ZW5kID0gNzE5Ki8KLQl7MHhDOTFDLCAweDAwMDAsfSwvKnN0YXRfYWVfd2luZG93X3hzdGFydCA9IDAqLwotCXsweEM5MUUsIDB4MDAwMCx9LC8qc3RhdF9hZV93aW5kb3dfeXN0YXJ0ID0gMCovCi0JezB4QzkyMCwgMHgwMEZGLH0sLypzdGF0X2FlX3dpbmRvd194ZW5kID0gMjU1Ki8KLQl7MHhDOTIyLCAweDAwOEYsfSwvKnN0YXRfYWVfd2luZG93X3llbmQgPSAxNDMqLwotCi0JLypTZW5zb3Igb3B0aW1pemF0aW9uKi8KLQl7MHgzMTZBLCAweDgyNzAsfSwKLQl7MHgzMTZDLCAweDgyNzAsfSwKLQl7MHgzRUQwLCAweDIzMDUsfSwKLQl7MHgzRUQyLCAweDc3Q0YsfSwKLQl7MHgzMTZFLCAweDgyMDIsfSwKLQl7MHgzMTgwLCAweDg3RkYsfSwKLQl7MHgzMEQ0LCAweDYwODAsfSwKLQl7MHhBODAyLCAweDAwMDgsfSwvKkFFX1RSQUNLX01PREUqLwotCXsweDNFMTQsIDB4RkYzOSx9LAotCXsweDA5ODIsIDB4MDAwMSx9LC8qQUNDRVNTX0NUTF9TVEFUKi8KLQl7MHgwOThBLCAweDUwMDAsfSwvKlBIWVNJQ0FMX0FERFJFU1NfQUNDRVNTKi8KLQl7MHhEMDAwLCAweDcwQ0YsfSwKLQl7MHhEMDAyLCAweEZGRkYsfSwKLQl7MHhEMDA0LCAweEM1RDQsfSwKLQl7MHhEMDA2LCAweDkwM0EsfSwKLQl7MHhEMDA4LCAweDIxNDQsfSwKLQl7MHhEMDBBLCAweDBDMDAsfSwKLQl7MHhEMDBDLCAweDIxODYsfSwKLQl7MHhEMDBFLCAweDBGRjMsfSwKLQl7MHhEMDEwLCAweEI4NDQsfSwKLQl7MHhEMDEyLCAweEI5NDgsfSwKLQl7MHhEMDE0LCAweEUwODIsfSwKLQl7MHhEMDE2LCAweDIwQ0MsfSwKLQl7MHhEMDE4LCAweDgwRTIsfSwKLQl7MHhEMDFBLCAweDIxQ0MsfSwKLQl7MHhEMDFDLCAweDgwQTIsfSwKLQl7MHhEMDFFLCAweDIxQ0MsfSwKLQl7MHhEMDIwLCAweDgwRTIsfSwKLQl7MHhEMDIyLCAweEY0MDQsfSwKLQl7MHhEMDI0LCAweEQ4MDEsfSwKLQl7MHhEMDI2LCAweEYwMDMsfSwKLQl7MHhEMDI4LCAweEQ4MDAsfSwKLQl7MHhEMDJBLCAweDdFRTAsfSwKLQl7MHhEMDJDLCAweEMwRjEsfSwKLQl7MHhEMDJFLCAweDA4QkEsfSwKLQl7MHhEMDMwLCAweDA2MDAsfSwKLQl7MHhEMDMyLCAweEMxQTEsfSwKLQl7MHhEMDM0LCAweDc2Q0YsfSwKLQl7MHhEMDM2LCAweEZGRkYsfSwKLQl7MHhEMDM4LCAweEMxMzAsfSwKLQl7MHhEMDNBLCAweDZFMDQsfSwKLQl7MHhEMDNDLCAweEMwNDAsfSwKLQl7MHhEMDNFLCAweDcxQ0YsfSwKLQl7MHhEMDQwLCAweEZGRkYsfSwKLQl7MHhEMDQyLCAweEM3OTAsfSwKLQl7MHhEMDQ0LCAweDgxMDMsfSwKLQl7MHhEMDQ2LCAweDc3Q0YsfSwKLQl7MHhEMDQ4LCAweEZGRkYsfSwKLQl7MHhEMDRBLCAweEM3QzAsfSwKLQl7MHhEMDRDLCAweEUwMDEsfSwKLQl7MHhEMDRFLCAweEExMDMsfSwKLQl7MHhEMDUwLCAweEQ4MDAsfSwKLQl7MHhEMDUyLCAweDBDNkEsfSwKLQl7MHhEMDU0LCAweDA0RTAsfSwKLQl7MHhEMDU2LCAweEI4OUUsfSwKLQl7MHhEMDU4LCAweDc1MDgsfSwKLQl7MHhEMDVBLCAweDhFMUMsfSwKLQl7MHhEMDVDLCAweDA4MDksfSwKLQl7MHhEMDVFLCAweDAxOTEsfSwKLQl7MHhEMDYwLCAweEQ4MDEsfSwKLQl7MHhEMDYyLCAweEFFMUQsfSwKLQl7MHhEMDY0LCAweEU1ODAsfSwKLQl7MHhEMDY2LCAweDIwQ0EsfSwKLQl7MHhEMDY4LCAweDAwMjIsfSwKLQl7MHhEMDZBLCAweDIwQ0YsfSwKLQl7MHhEMDZDLCAweDA1MjIsfSwKLQl7MHhEMDZFLCAweDBDNUMsfSwKLQl7MHhEMDcwLCAweDA0RTIsfSwKLQl7MHhEMDcyLCAweDIxQ0EsfSwKLQl7MHhEMDc0LCAweDAwNjIsfSwKLQl7MHhEMDc2LCAweEU1ODAsfSwKLQl7MHhEMDc4LCAweEQ5MDEsfSwKLQl7MHhEMDdBLCAweDc5QzAsfSwKLQl7MHhEMDdDLCAweEQ4MDAsfSwKLQl7MHhEMDdFLCAweDBCRTYsfSwKLQl7MHhEMDgwLCAweDA0RTAsfSwKLQl7MHhEMDgyLCAweEI4OUUsfSwKLQl7MHhEMDg0LCAweDcwQ0YsfSwKLQl7MHhEMDg2LCAweEZGRkYsfSwKLQl7MHhEMDg4LCAweEM4RDQsfSwKLQl7MHhEMDhBLCAweDkwMDIsfSwKLQl7MHhEMDhDLCAweDA4NTcsfSwKLQl7MHhEMDhFLCAweDAyNUUsfSwKLQl7MHhEMDkwLCAweEZGREMsfSwKLQl7MHhEMDkyLCAweEUwODAsfSwKLQl7MHhEMDk0LCAweDI1Q0MsfSwKLQl7MHhEMDk2LCAweDkwMjIsfSwKLQl7MHhEMDk4LCAweEYyMjUsfSwKLQl7MHhEMDlBLCAweDE3MDAsfSwKLQl7MHhEMDlDLCAweDEwOEEsfSwKLQl7MHhEMDlFLCAweDczQ0YsfSwKLQl7MHhEMEEwLCAweEZGMDAsfSwKLQl7MHhEMEEyLCAweDMxNzQsfSwKLQl7MHhEMEE0LCAweDkzMDcsfSwKLQl7MHhEMEE2LCAweDJBMDQsfSwKLQl7MHhEMEE4LCAweDEwM0UsfSwKLQl7MHhEMEFBLCAweDkzMjgsfSwKLQl7MHhEMEFDLCAweDI5NDIsfSwKLQl7MHhEMEFFLCAweDcxNDAsfSwKLQl7MHhEMEIwLCAweDJBMDQsfSwKLQl7MHhEMEIyLCAweDEwN0UsfSwKLQl7MHhEMEI0LCAweDkzNDksfSwKLQl7MHhEMEI2LCAweDI5NDIsfSwKLQl7MHhEMEI4LCAweDcxNDEsfSwKLQl7MHhEMEJBLCAweDJBMDQsfSwKLQl7MHhEMEJDLCAweDEwQkUsfSwKLQl7MHhEMEJFLCAweDkzNEEsfSwKLQl7MHhEMEMwLCAweDI5NDIsfSwKLQl7MHhEMEMyLCAweDcxNEIsfSwKLQl7MHhEMEM0LCAweDJBMDQsfSwKLQl7MHhEMEM2LCAweDEwQkUsfSwKLQl7MHhEMEM4LCAweDEzMEMsfSwKLQl7MHhEMENBLCAweDAxMEEsfSwKLQl7MHhEMENDLCAweDI5NDIsfSwKLQl7MHhEMENFLCAweDcxNDIsfSwKLQl7MHhEMEQwLCAweDIyNTAsfSwKLQl7MHhEMEQyLCAweDEzQ0EsfSwKLQl7MHhEMEQ0LCAweDFCMEMsfSwKLQl7MHhEMEQ2LCAweDAyODQsfSwKLQl7MHhEMEQ4LCAweEIzMDcsfSwKLQl7MHhEMERBLCAweEIzMjgsfSwKLQl7MHhEMERDLCAweDFCMTIsfSwKLQl7MHhEMERFLCAweDAyQzQsfSwKLQl7MHhEMEUwLCAweEIzNEEsfSwKLQl7MHhEMEUyLCAweEVEODgsfSwKLQl7MHhEMEU0LCAweDcxQ0YsfSwKLQl7MHhEMEU2LCAweEZGMDAsfSwKLQl7MHhEMEU4LCAweDMxNzQsfSwKLQl7MHhEMEVBLCAweDkxMDYsfSwKLQl7MHhEMEVDLCAweEI4OEYsfSwKLQl7MHhEMEVFLCAweEIxMDYsfSwKLQl7MHhEMEYwLCAweDIxMEEsfSwKLQl7MHhEMEYyLCAweDgzNDAsfSwKLQl7MHhEMEY0LCAweEMwMDAsfSwKLQl7MHhEMEY2LCAweDIxQ0EsfSwKLQl7MHhEMEY4LCAweDAwNjIsfSwKLQl7MHhEMEZBLCAweDIwRjAsfSwKLQl7MHhEMEZDLCAweDAwNDAsfSwKLQl7MHhEMEZFLCAweDBCMDIsfSwKLQl7MHhEMTAwLCAweDAzMjAsfSwKLQl7MHhEMTAyLCAweEQ5MDEsfSwKLQl7MHhEMTA0LCAweDA3RjEsfSwKLQl7MHhEMTA2LCAweDA1RTAsfSwKLQl7MHhEMTA4LCAweEMwQTEsfSwKLQl7MHhEMTBBLCAweDc4RTAsfSwKLQl7MHhEMTBDLCAweEMwRjEsfSwKLQl7MHhEMTBFLCAweDcxQ0YsfSwKLQl7MHhEMTEwLCAweEZGRkYsfSwKLQl7MHhEMTEyLCAweEM3QzAsfSwKLQl7MHhEMTE0LCAweEQ4NDAsfSwKLQl7MHhEMTE2LCAweEE5MDAsfSwKLQl7MHhEMTE4LCAweDcxQ0YsfSwKLQl7MHhEMTFBLCAweEZGRkYsfSwKLQl7MHhEMTFDLCAweEQwMkMsfSwKLQl7MHhEMTFFLCAweEQ4MUUsfSwKLQl7MHhEMTIwLCAweDBBNUEsfSwKLQl7MHhEMTIyLCAweDA0RTAsfSwKLQl7MHhEMTI0LCAweERBMDAsfSwKLQl7MHhEMTI2LCAweEQ4MDAsfSwKLQl7MHhEMTI4LCAweEMwRDEsfSwKLQl7MHhEMTJBLCAweDdFRTAsfSwKLQl7MHgwOThFLCAweDAwMDAsfSwKLQotCXsweDA5ODIsIDB4MDAwMSx9LAotCXsweDA5OEEsIDB4NUMxMCx9LAotCXsweERDMTAsIDB4QzBGMSx9LAotCXsweERDMTIsIDB4MENEQSx9LAotCXsweERDMTQsIDB4MDU4MCx9LAotCXsweERDMTYsIDB4NzZDRix9LAotCXsweERDMTgsIDB4RkYwMCx9LAotCXsweERDMUEsIDB4MjE4NCx9LAotCXsweERDMUMsIDB4OTYyNCx9LAotCXsweERDMUUsIDB4MjE4Qyx9LAotCXsweERDMjAsIDB4OEZDMyx9LAotCXsweERDMjIsIDB4NzVDRix9LAotCXsweERDMjQsIDB4RkZGRix9LAotCXsweERDMjYsIDB4RTA1OCx9LAotCXsweERDMjgsIDB4RjY4Nix9LAotCXsweERDMkEsIDB4MTU1MCx9LAotCXsweERDMkMsIDB4MTA4MCx9LAotCXsweERDMkUsIDB4RTAwMSx9LAotCXsweERDMzAsIDB4MUQ1MCx9LAotCXsweERDMzIsIDB4MTAwMix9LAotCXsweERDMzQsIDB4MTU1Mix9LAotCXsweERDMzYsIDB4MTEwMCx9LAotCXsweERDMzgsIDB4NjAzOCx9LAotCXsweERDM0EsIDB4MUQ1Mix9LAotCXsweERDM0MsIDB4MTAwNCx9LAotCXsweERDM0UsIDB4MTU0MCx9LAotCXsweERDNDAsIDB4MTA4MCx9LAotCXsweERDNDIsIDB4MDgxQix9LAotCXsweERDNDQsIDB4MDBEMSx9LAotCXsweERDNDYsIDB4ODUxMix9LAotCXsweERDNDgsIDB4MTAwMCx9LAotCXsweERDNEEsIDB4MDBDMCx9LAotCXsweERDNEMsIDB4NzgyMix9LAotCXsweERDNEUsIDB4MjA4OSx9LAotCXsweERDNTAsIDB4MEZDMSx9LAotCXsweERDNTIsIDB4MjAwOCx9LAotCXsweERDNTQsIDB4MEY4MSx9LAotCXsweERDNTYsIDB4RkZGRix9LAotCXsweERDNTgsIDB4RkY4MCx9LAotCXsweERDNUEsIDB4ODUxMix9LAotCXsweERDNUMsIDB4MTgwMSx9LAotCXsweERDNUUsIDB4MDA1Mix9LAotCXsweERDNjAsIDB4QTUxMix9LAotCXsweERDNjIsIDB4MTU0NCx9LAotCXsweERDNjQsIDB4MTA4MCx9LAotCXsweERDNjYsIDB4Qjg2MSx9LAotCXsweERDNjgsIDB4MjYyRix9LAotCXsweERDNkEsIDB4RjAwNyx9LAotCXsweERDNkMsIDB4MUQ0NCx9LAotCXsweERDNkUsIDB4MTAwMix9LAotCXsweERDNzAsIDB4MjBDQSx9LAotCXsweERDNzIsIDB4MDAyMSx9LAotCXsweERDNzQsIDB4MjBDRix9LAotCXsweERDNzYsIDB4MDRFMSx9LAotCXsweERDNzgsIDB4MDg1MCx9LAotCXsweERDN0EsIDB4MDRBMSx9LAotCXsweERDN0MsIDB4MjFDQSx9LAotCXsweERDN0UsIDB4MDAyMSx9LAotCXsweERDODAsIDB4MTU0Mix9LAotCXsweERDODIsIDB4MTE0MCx9LAotCXsweERDODQsIDB4OEQyQyx9LAotCXsweERDODYsIDB4NjAzOCx9LAotCXsweERDODgsIDB4MUQ0Mix9LAotCXsweERDOEEsIDB4MTAwNCx9LAotCXsweERDOEMsIDB4MTU0Mix9LAotCXsweERDOEUsIDB4MTE0MCx9LAotCXsweERDOTAsIDB4QjYwMSx9LAotCXsweERDOTIsIDB4MDQ2RCx9LAotCXsweERDOTQsIDB4MDU4MCx9LAotCXsweERDOTYsIDB4NzhFMCx9LAotCXsweERDOTgsIDB4RDgwMCx9LAotCXsweERDOUEsIDB4Qjg5Myx9LAotCXsweERDOUMsIDB4MDAyRCx9LAotCXsweERDOUUsIDB4MDRBMCx9LAotCXsweERDQTAsIDB4RDkwMCx9LAotCXsweERDQTIsIDB4NzhFMCx9LAotCXsweERDQTQsIDB4NzJDRix9LAotCXsweERDQTYsIDB4RkZGRix9LAotCXsweERDQTgsIDB4RTA1OCx9LAotCXsweERDQUEsIDB4MjI0MCx9LAotCXsweERDQUMsIDB4MDM0MCx9LAotCXsweERDQUUsIDB4QTIxMix9LAotCXsweERDQjAsIDB4MjA4QSx9LAotCXsweERDQjIsIDB4MEZGRix9LAotCXsweERDQjQsIDB4MUE0Mix9LAotCXsweERDQjYsIDB4MDAwNCx9LAotCXsweERDQjgsIDB4RDgzMCx9LAotCXsweERDQkEsIDB4MUE0NCx9LAotCXsweERDQkMsIDB4MDAwMix9LAotCXsweERDQkUsIDB4RDgwMCx9LAotCXsweERDQzAsIDB4MUE1MCx9LAotCXsweERDQzIsIDB4MDAwMix9LAotCXsweERDQzQsIDB4MUE1Mix9LAotCXsweERDQzYsIDB4MDAwNCx9LAotCXsweERDQzgsIDB4MTI0Mix9LAotCXsweERDQ0EsIDB4MDE0MCx9LAotCXsweERDQ0MsIDB4OEEyQyx9LAotCXsweERDQ0UsIDB4NjAzOCx9LAotCXsweERDRDAsIDB4MUE0Mix9LAotCXsweERDRDIsIDB4MDAwNCx9LAotCXsweERDRDQsIDB4MTI0Mix9LAotCXsweERDRDYsIDB4MDE0MSx9LAotCXsweERDRDgsIDB4NzBDRix9LAotCXsweERDREEsIDB4RkYwMCx9LAotCXsweERDREMsIDB4MjE4NCx9LAotCXsweERDREUsIDB4QjAyMSx9LAotCXsweERDRTAsIDB4RDgwMCx9LAotCXsweERDRTIsIDB4Qjg5Myx9LAotCXsweERDRTQsIDB4MDdFNSx9LAotCXsweERDRTYsIDB4MDQ2MCx9LAotCXsweERDRTgsIDB4RDkwMSx9LAotCXsweERDRUEsIDB4NzhFMCx9LAotCXsweERDRUMsIDB4QzBGMSx9LAotCXsweERDRUUsIDB4MEJGQSx9LAotCXsweERDRjAsIDB4MDVBMCx9LAotCXsweERDRjIsIDB4MjE2Rix9LAotCXsweERDRjQsIDB4MDA0Myx9LAotCXsweERDRjYsIDB4QzFBNCx9LAotCXsweERDRjgsIDB4MjIwQSx9LAotCXsweERDRkEsIDB4MUY4MCx9LAotCXsweERDRkMsIDB4RkZGRix9LAotCXsweERDRkUsIDB4RTA1OCx9LAotCXsweEREMDAsIDB4MjI0MCx9LAotCXsweEREMDIsIDB4MTM0Rix9LAotCXsweEREMDQsIDB4MUE0OCx9LAotCXsweEREMDYsIDB4MTNDMCx9LAotCXsweEREMDgsIDB4MTI0OCx9LAotCXsweEREMEEsIDB4MTAwMix9LAotCXsweEREMEMsIDB4NzBDRix9LAotCXsweEREMEUsIDB4N0ZGRix9LAotCXsweEREMTAsIDB4RkZGRix9LAotCXsweEREMTIsIDB4RTIzMCx9LAotCXsweEREMTQsIDB4QzI0MCx9LAotCXsweEREMTYsIDB4REEwMCx9LAotCXsweEREMTgsIDB4RjAwQyx9LAotCXsweEREMUEsIDB4MTI0OCx9LAotCXsweEREMUMsIDB4MTAwMyx9LAotCXsweEREMUUsIDB4MTMwMSx9LAotCXsweEREMjAsIDB4MDRDQix9LAotCXsweEREMjIsIDB4NzI2MSx9LAotCXsweEREMjQsIDB4MjEwOCx9LAotCXsweEREMjYsIDB4MDA4MSx9LAotCXsweEREMjgsIDB4MjAwOSx9LAotCXsweEREMkEsIDB4MDA4MCx9LAotCXsweEREMkMsIDB4MUE0OCx9LAotCXsweEREMkUsIDB4MTBDMCx9LAotCXsweEREMzAsIDB4MTI0OCx9LAotCXsweEREMzIsIDB4MTAwQix9LAotCXsweEREMzQsIDB4QzMwMCx9LAotCXsweEREMzYsIDB4MEJFNyx9LAotCXsweEREMzgsIDB4OTBDNCx9LAotCXsweEREM0EsIDB4MjEwMix9LAotCXsweEREM0MsIDB4MDAwMyx9LAotCXsweEREM0UsIDB4MjM4Qyx9LAotCXsweERENDAsIDB4OEZDMyx9LAotCXsweERENDIsIDB4RjZDNyx9LAotCXsweERENDQsIDB4REFGRix9LAotCXsweERENDYsIDB4MUEwNSx9LAotCXsweERENDgsIDB4MTA4Mix9LAotCXsweERENEEsIDB4QzI0MSx9LAotCXsweERENEMsIDB4RjAwNSx9LAotCXsweERENEUsIDB4N0E2Rix9LAotCXsweERENTAsIDB4QzI0MSx9LAotCXsweERENTIsIDB4MUEwNSx9LAotCXsweERENTQsIDB4MTBDMix9LAotCXsweERENTYsIDB4MjAwMCx9LAotCXsweERENTgsIDB4ODA0MCx9LAotCXsweERENUEsIDB4REEwMCx9LAotCXsweERENUMsIDB4MjBDMCx9LAotCXsweERENUUsIDB4MDA2NCx9LAotCXsweERENjAsIDB4NzgxQyx9LAotCXsweERENjIsIDB4QzA0Mix9LAotCXsweERENjQsIDB4MUMwRSx9LAotCXsweERENjYsIDB4MzA4Mix9LAotCXsweERENjgsIDB4MUE0OCx9LAotCXsweERENkEsIDB4MTNDMCx9LAotCXsweERENkMsIDB4NzU0OCx9LAotCXsweERENkUsIDB4NzM0OCx9LAotCXsweERENzAsIDB4NzE0OCx9LAotCXsweERENzIsIDB4NzY0OCx9LAotCXsweERENzQsIDB4RjAwMix9LAotCXsweERENzYsIDB4NzYwOCx9LAotCXsweERENzgsIDB4MTI0OCx9LAotCXsweEREN0EsIDB4MTAwMCx9LAotCXsweEREN0MsIDB4MTQwMCx9LAotCXsweEREN0UsIDB4MzAwQix9LAotCXsweEREODAsIDB4MDg0RCx9LAotCXsweEREODIsIDB4MDJDNSx9LAotCXsweEREODQsIDB4MTI0OCx9LAotCXsweEREODYsIDB4MTAwMCx9LAotCXsweEREODgsIDB4RTEwMSx9LAotCXsweEREOEEsIDB4MTAwMSx9LAotCXsweEREOEMsIDB4MDRDQix9LAotCXsweEREOEUsIDB4MUE0OCx9LAotCXsweEREOTAsIDB4MTAwMCx9LAotCXsweEREOTIsIDB4NzM2MSx9LAotCXsweEREOTQsIDB4MTQwOCx9LAotCXsweEREOTYsIDB4MzAwQix9LAotCXsweEREOTgsIDB4MjMwMix9LAotCXsweEREOUEsIDB4MDJDMCx9LAotCXsweEREOUMsIDB4NzgwRCx9LAotCXsweEREOUUsIDB4MjYwNyx9LAotCXsweEREQTAsIDB4OTAzRSx9LAotCXsweEREQTIsIDB4MDdENix9LAotCXsweEREQTQsIDB4RkZFMyx9LAotCXsweEREQTYsIDB4NzkyRix9LAotCXsweEREQTgsIDB4MDlDRix9LAotCXsweEREQUEsIDB4ODE1Mix9LAotCXsweEREQUMsIDB4MTI0OCx9LAotCXsweEREQUUsIDB4MTAwRSx9LAotCXsweEREQjAsIDB4MjQwMCx9LAotCXsweEREQjIsIDB4MzM0Qix9LAotCXsweEREQjQsIDB4RTUwMSx9LAotCXsweEREQjYsIDB4N0VFMix9LAotCXsweEREQjgsIDB4MERCRix9LAotCXsweEREQkEsIDB4OTBGMix9LAotCXsweEREQkMsIDB4MUIwQyx9LAotCXsweEREQkUsIDB4MTM4Mix9LAotCXsweEREQzAsIDB4QzEyMyx9LAotCXsweEREQzIsIDB4MTQwRSx9LAotCXsweEREQzQsIDB4MzA4MCx9LAotCXsweEREQzYsIDB4NzgyMix9LAotCXsweEREQzgsIDB4MUEwNyx9LAotCXsweEREQ0EsIDB4MTAwMix9LAotCXsweEREQ0MsIDB4MTI0Qyx9LAotCXsweEREQ0UsIDB4MTAwMCx9LAotCXsweERERDAsIDB4MTIwQix9LAotCXsweERERDIsIDB4MTA4MSx9LAotCXsweERERDQsIDB4MTIwNyx9LAotCXsweERERDYsIDB4MTA4Myx9LAotCXsweERERDgsIDB4MjE0Mix9LAotCXsweEREREEsIDB4MDA0Qix9LAotCXsweEREREMsIDB4NzgxQix9LAotCXsweEREREUsIDB4MEIyMSx9LAotCXsweERERTAsIDB4MDJFMix9LAotCXsweERERTIsIDB4MUE0Qyx9LAotCXsweERERTQsIDB4MTAwMCx9LAotCXsweERERTYsIDB4RTEwMSx9LAotCXsweERERTgsIDB4MDkxNSx9LAotCXsweERERUEsIDB4MDBDMix9LAotCXsweERERUMsIDB4QzEwMSx9LAotCXsweERERUUsIDB4MTIwNCx9LAotCXsweERERjAsIDB4MTA4Myx9LAotCXsweERERjIsIDB4MDkwRCx9LAotCXsweERERjQsIDB4MDBDMix9LAotCXsweERERjYsIDB4RTAwMSx9LAotCXsweERERjgsIDB4MUE0Qyx9LAotCXsweERERkEsIDB4MTAwMCx9LAotCXsweERERkMsIDB4MUEwNix9LAotCXsweERERkUsIDB4MTAwMix9LAotCXsweERFMDAsIDB4MjM0QSx9LAotCXsweERFMDIsIDB4MTAwMCx9LAotCXsweERFMDQsIDB4NzE2OSx9LAotCXsweERFMDYsIDB4RjAwOCx9LAotCXsweERFMDgsIDB4MjA1Myx9LAotCXsweERFMEEsIDB4MDAwMyx9LAotCXsweERFMEMsIDB4NjE3OSx9LAotCXsweERFMEUsIDB4NzgxQyx9LAotCXsweERFMTAsIDB4MjM0MCx9LAotCXsweERFMTIsIDB4MTA0Qix9LAotCXsweERFMTQsIDB4MTIwMyx9LAotCXsweERFMTYsIDB4MTA4Myx9LAotCXsweERFMTgsIDB4MEJGMSx9LAotCXsweERFMUEsIDB4OTBDMix9LAotCXsweERFMUMsIDB4MTIwMix9LAotCXsweERFMUUsIDB4MTA4MCx9LAotCXsweERFMjAsIDB4MDkxRCx9LAotCXsweERFMjIsIDB4MDAwNCx9LAotCXsweERFMjQsIDB4NzBDRix9LAotCXsweERFMjYsIDB4RkZGRix9LAotCXsweERFMjgsIDB4QzY0NCx9LAotCXsweERFMkEsIDB4ODgxQix9LAotCXsweERFMkMsIDB4RTBCMix9LAotCXsweERFMkUsIDB4RDgzQyx9LAotCXsweERFMzAsIDB4MjBDQSx9LAotCXsweERFMzIsIDB4MENBMix9LAotCXsweERFMzQsIDB4MUEwMSx9LAotCXsweERFMzYsIDB4MTAwMix9LAotCXsweERFMzgsIDB4MUE0Qyx9LAotCXsweERFM0EsIDB4MTA4MCx9LAotCXsweERFM0MsIDB4MDJCOSx9LAotCXsweERFM0UsIDB4MDVBMCx9LAotCXsweERFNDAsIDB4QzBBNCx9LAotCXsweERFNDIsIDB4NzhFMCx9LAotCXsweERFNDQsIDB4QzBGMSx9LAotCXsweERFNDYsIDB4RkY5NSx9LAotCXsweERFNDgsIDB4RDgwMCx9LAotCXsweERFNEEsIDB4NzFDRix9LAotCXsweERFNEMsIDB4RkYwMCx9LAotCXsweERFNEUsIDB4MUZFMCx9LAotCXsweERFNTAsIDB4MTlEMCx9LAotCXsweERFNTIsIDB4MDAxQyx9LAotCXsweERFNTQsIDB4MTlEMSx9LAotCXsweERFNTYsIDB4MDAxQyx9LAotCXsweERFNTgsIDB4NzBDRix9LAotCXsweERFNUEsIDB4RkZGRix9LAotCXsweERFNUMsIDB4RTA1OCx9LAotCXsweERFNUUsIDB4OTAxRix9LAotCXsweERFNjAsIDB4Qjg2MSx9LAotCXsweERFNjIsIDB4MTlEMix9LAotCXsweERFNjQsIDB4MDAxQyx9LAotCXsweERFNjYsIDB4QzBEMSx9LAotCXsweERFNjgsIDB4N0VFMCx9LAotCXsweERFNkEsIDB4NzhFMCx9LAotCXsweERFNkMsIDB4QzBGMSx9LAotCXsweERFNkUsIDB4MEE3QSx9LAotCXsweERFNzAsIDB4MDU4MCx9LAotCXsweERFNzIsIDB4NzBDRix9LAotCXsweERFNzQsIDB4RkZGRix9LAotCXsweERFNzYsIDB4QzVENCx9LAotCXsweERFNzgsIDB4OTA0MSx9LAotCXsweERFN0EsIDB4OTAyMyx9LAotCXsweERFN0MsIDB4NzVDRix9LAotCXsweERFN0UsIDB4RkZGRix9LAotCXsweERFODAsIDB4RTA1OCx9LAotCXsweERFODIsIDB4Nzk0Mix9LAotCXsweERFODQsIDB4Qjk2Nyx9LAotCXsweERFODYsIDB4N0YzMCx9LAotCXsweERFODgsIDB4QjUzRix9LAotCXsweERFOEEsIDB4NzFDRix9LAotCXsweERFOEMsIDB4RkZGRix9LAotCXsweERFOEUsIDB4Qzg0Qyx9LAotCXsweERFOTAsIDB4OTFEMyx9LAotCXsweERFOTIsIDB4MTA4Qix9LAotCXsweERFOTQsIDB4MDA4MSx9LAotCXsweERFOTYsIDB4MjYxNSx9LAotCXsweERFOTgsIDB4MTM4MCx9LAotCXsweERFOUEsIDB4MDkwRix9LAotCXsweERFOUMsIDB4MEM5MSx9LAotCXsweERFOUUsIDB4MEE4RSx9LAotCXsweERFQTAsIDB4MDVBMCx9LAotCXsweERFQTIsIDB4RDkwNix9LAotCXsweERFQTQsIDB4N0UxMCx9LAotCXsweERFQTYsIDB4MjYxNSx9LAotCXsweERFQTgsIDB4MTM4MCx9LAotCXsweERFQUEsIDB4MEE4Mix9LAotCXsweERFQUMsIDB4MDVBMCx9LAotCXsweERFQUUsIDB4RDk2MCx9LAotCXsweERFQjAsIDB4NzkwRix9LAotCXsweERFQjIsIDB4MDkwRCx9LAotCXsweERFQjQsIDB4MDEzMyx9LAotCXsweERFQjYsIDB4QUQwQyx9LAotCXsweERFQjgsIDB4RDkwNCx9LAotCXsweERFQkEsIDB4QUQyQyx9LAotCXsweERFQkMsIDB4NzlFQyx9LAotCXsweERFQkUsIDB4Mjk0MSx9LAotCXsweERFQzAsIDB4NzQwMix9LAotCXsweERFQzIsIDB4NzFDRix9LAotCXsweERFQzQsIDB4RkYwMCx9LAotCXsweERFQzYsIDB4MjE4NCx9LAotCXsweERFQzgsIDB4QjE0Mix9LAotCXsweERFQ0EsIDB4MTkwNix9LAotCXsweERFQ0MsIDB4MEU0NCx9LAotCXsweERFQ0UsIDB4RkZERSx9LAotCXsweERFRDAsIDB4NzBDOSx9LAotCXsweERFRDIsIDB4MEE1QSx9LAotCXsweERFRDQsIDB4MDVBMCx9LAotCXsweERFRDYsIDB4OEQyQyx9LAotCXsweERFRDgsIDB4QUQwQix9LAotCXsweERFREEsIDB4RDgwMCx9LAotCXsweERFREMsIDB4QUQwMSx9LAotCXsweERFREUsIDB4MDIxOSx9LAotCXsweERFRTAsIDB4MDVBMCx9LAotCXsweERFRTIsIDB4QTUxMyx9LAotCXsweERFRTQsIDB4QzBGMSx9LAotCXsweERFRTYsIDB4NzFDRix9LAotCXsweERFRTgsIDB4RkZGRix9LAotCXsweERFRUEsIDB4QzY0NCx9LAotCXsweERFRUMsIDB4QTkxQix9LAotCXsweERFRUUsIDB4RDkwMix9LAotCXsweERFRjAsIDB4NzBDRix9LAotCXsweERFRjIsIDB4RkZGRix9LAotCXsweERFRjQsIDB4Qzg0Qyx9LAotCXsweERFRjYsIDB4MDkzRSx9LAotCXsweERFRjgsIDB4MDNBMCx9LAotCXsweERFRkEsIDB4QTgyNix9LAotCXsweERFRkMsIDB4RkZEQyx9LAotCXsweERFRkUsIDB4RjFCNSx9LAotCXsweERGMDAsIDB4QzBGMSx9LAotCXsweERGMDIsIDB4MDlFQSx9LAotCXsweERGMDQsIDB4MDU4MCx9LAotCXsweERGMDYsIDB4NzVDRix9LAotCXsweERGMDgsIDB4RkZGRix9LAotCXsweERGMEEsIDB4RTA1OCx9LAotCXsweERGMEMsIDB4MTU0MCx9LAotCXsweERGMEUsIDB4MTA4MCx9LAotCXsweERGMTAsIDB4MDhBNyx9LAotCXsweERGMTIsIDB4MDAxMCx9LAotCXsweERGMTQsIDB4OEQwMCx9LAotCXsweERGMTYsIDB4MDgxMyx9LAotCXsweERGMTgsIDB4MDA5RSx9LAotCXsweERGMUEsIDB4MTU0MCx9LAotCXsweERGMUMsIDB4MTA4MSx9LAotCXsweERGMUUsIDB4RTE4MSx9LAotCXsweERGMjAsIDB4MjBDQSx9LAotCXsweERGMjIsIDB4MDBBMSx9LAotCXsweERGMjQsIDB4RjI0Qix9LAotCXsweERGMjYsIDB4MTU0MCx9LAotCXsweERGMjgsIDB4MTA4MSx9LAotCXsweERGMkEsIDB4MDkwRix9LAotCXsweERGMkMsIDB4MDA1MCx9LAotCXsweERGMkUsIDB4MTU0MCx9LAotCXsweERGMzAsIDB4MTA4MSx9LAotCXsweERGMzIsIDB4MDkyNyx9LAotCXsweERGMzQsIDB4MDA5MSx9LAotCXsweERGMzYsIDB4MTU1MCx9LAotCXsweERGMzgsIDB4MTA4MSx9LAotCXsweERGM0EsIDB4REUwMCx9LAotCXsweERGM0MsIDB4QUQyQSx9LAotCXsweERGM0UsIDB4MUQ1MCx9LAotCXsweERGNDAsIDB4MTM4Mix9LAotCXsweERGNDIsIDB4MTU1Mix9LAotCXsweERGNDQsIDB4MTEwMSx9LAotCXsweERGNDYsIDB4MUQ1Mix9LAotCXsweERGNDgsIDB4MTM4NCx9LAotCXsweERGNEEsIDB4QjUyNCx9LAotCXsweERGNEMsIDB4MDgyRCx9LAotCXsweERGNEUsIDB4MDE1Rix9LAotCXsweERGNTAsIDB4RkY1NSx9LAotCXsweERGNTIsIDB4RDgwMyx9LAotCXsweERGNTQsIDB4RjAzMyx9LAotCXsweERGNTYsIDB4MTU0MCx9LAotCXsweERGNTgsIDB4MTA4MSx9LAotCXsweERGNUEsIDB4MDk2Nyx9LAotCXsweERGNUMsIDB4MDBEMSx9LAotCXsweERGNUUsIDB4MTU1MCx9LAotCXsweERGNjAsIDB4MTA4MSx9LAotCXsweERGNjIsIDB4REUwMCx9LAotCXsweERGNjQsIDB4QUQyQSx9LAotCXsweERGNjYsIDB4MUQ1MCx9LAotCXsweERGNjgsIDB4MTM4Mix9LAotCXsweERGNkEsIDB4MTU1Mix9LAotCXsweERGNkMsIDB4MTEwMSx9LAotCXsweERGNkUsIDB4MUQ1Mix9LAotCXsweERGNzAsIDB4MTM4NCx9LAotCXsweERGNzIsIDB4QjUyNCx9LAotCXsweERGNzQsIDB4MDgxMSx9LAotCXsweERGNzYsIDB4MDE5RSx9LAotCXsweERGNzgsIDB4QjhBMCx9LAotCXsweERGN0EsIDB4QUQwMCx9LAotCXsweERGN0MsIDB4RkY0Nyx9LAotCXsweERGN0UsIDB4MUQ0MCx9LAotCXsweERGODAsIDB4MTM4Mix9LAotCXsweERGODIsIDB4RjAxRix9LAotCXsweERGODQsIDB4RkY1QSx9LAotCXsweERGODYsIDB4OEQwMSx9LAotCXsweERGODgsIDB4OEQ0MCx9LAotCXsweERGOEEsIDB4RTgxMix9LAotCXsweERGOEMsIDB4NzFDRix9LAotCXsweERGOEUsIDB4RkZGRix9LAotCXsweERGOTAsIDB4QzY0NCx9LAotCXsweERGOTIsIDB4ODkzQix9LAotCXsweERGOTQsIDB4NzAzMCx9LAotCXsweERGOTYsIDB4MjJEMSx9LAotCXsweERGOTgsIDB4ODA2Mix9LAotCXsweERGOUEsIDB4RjIwQSx9LAotCXsweERGOUMsIDB4MEEwRix9LAotCXsweERGOUUsIDB4MDA5RSx9LAotCXsweERGQTAsIDB4NzFDRix9LAotCXsweERGQTIsIDB4RkZGRix9LAotCXsweERGQTQsIDB4Qzg0Qyx9LAotCXsweERGQTYsIDB4ODkzQix9LAotCXsweERGQTgsIDB4RTkwMix9LAotCXsweERGQUEsIDB4RkZDRix9LAotCXsweERGQUMsIDB4OEQwMCx9LAotCXsweERGQUUsIDB4QjhFNyx9LAotCXsweERGQjAsIDB4MjZDQSx9LAotCXsweERGQjIsIDB4MTAyMix9LAotCXsweERGQjQsIDB4RjVFMix9LAotCXsweERGQjYsIDB4RkYzQyx9LAotCXsweERGQjgsIDB4RDgwMSx9LAotCXsweERGQkEsIDB4MUQ0MCx9LAotCXsweERGQkMsIDB4MTAwMix9LAotCXsweERGQkUsIDB4MDE0MSx9LAotCXsweERGQzAsIDB4MDU4MCx9LAotCXsweERGQzIsIDB4NzhFMCx9LAotCXsweERGQzQsIDB4QzBGMSx9LAotCXsweERGQzYsIDB4QzVFMSx9LAotCXsweERGQzgsIDB4RkYzNCx9LAotCXsweERGQ0EsIDB4REQwMCx9LAotCXsweERGQ0MsIDB4NzBDRix9LAotCXsweERGQ0UsIDB4RkZGRix9LAotCXsweERGRDAsIDB4RTA5MCx9LAotCXsweERGRDIsIDB4QThBOCx9LAotCXsweERGRDQsIDB4RDgwMCx9LAotCXsweERGRDYsIDB4Qjg5Myx9LAotCXsweERGRDgsIDB4MEM4QSx9LAotCXsweERGREEsIDB4MDQ2MCx9LAotCXsweERGREMsIDB4RDkwMSx9LAotCXsweERGREUsIDB4NzFDRix9LAotCXsweERGRTAsIDB4RkZGRix9LAotCXsweERGRTIsIDB4REMxMCx9LAotCXsweERGRTQsIDB4RDgxMyx9LAotCXsweERGRTYsIDB4MEI5Nix9LAotCXsweERGRTgsIDB4MDQ2MCx9LAotCXsweERGRUEsIDB4NzJBOSx9LAotCXsweERGRUMsIDB4MDExOSx9LAotCXsweERGRUUsIDB4MDU4MCx9LAotCXsweERGRjAsIDB4QzBGMSx9LAotCXsweERGRjIsIDB4NzFDRix9LAotCXsweERGRjQsIDB4MDAwMCx9LAotCXsweERGRjYsIDB4NUJBRSx9LAotCXsweERGRjgsIDB4Nzk0MCx9LAotCXsweERGRkEsIDB4RkY5RCx9LAotCXsweERGRkMsIDB4RjEzNSx9LAotCXsweERGRkUsIDB4NzhFMCx9LAotCXsweEUwMDAsIDB4QzBGMSx9LAotCXsweEUwMDIsIDB4NzBDRix9LAotCXsweEUwMDQsIDB4MDAwMCx9LAotCXsweEUwMDYsIDB4NUNCQSx9LAotCXsweEUwMDgsIDB4Nzg0MCx9LAotCXsweEUwMEEsIDB4NzBDRix9LAotCXsweEUwMEMsIDB4RkZGRix9LAotCXsweEUwMEUsIDB4RTA1OCx9LAotCXsweEUwMTAsIDB4ODgwMCx9LAotCXsweEUwMTIsIDB4MDgxNSx9LAotCXsweEUwMTQsIDB4MDAxRSx9LAotCXsweEUwMTYsIDB4NzBDRix9LAotCXsweEUwMTgsIDB4RkZGRix9LAotCXsweEUwMUEsIDB4Qzg0Qyx9LAotCXsweEUwMUMsIDB4ODgxQSx9LAotCXsweEUwMUUsIDB4RTA4MCx9LAotCXsweEUwMjAsIDB4MEVFMCx9LAotCXsweEUwMjIsIDB4RkZDMSx9LAotCXsweEUwMjQsIDB4RjEyMSx9LAotCXsweEUwMjYsIDB4NzhFMCx9LAotCXsweEUwMjgsIDB4QzBGMSx9LAotCXsweEUwMkEsIDB4RDkwMCx9LAotCXsweEUwMkMsIDB4RjAwOSx9LAotCXsweEUwMkUsIDB4NzBDRix9LAotCXsweEUwMzAsIDB4RkZGRix9LAotCXsweEUwMzIsIDB4RTBBQyx9LAotCXsweEUwMzQsIDB4NzgzNSx9LAotCXsweEUwMzYsIDB4ODA0MSx9LAotCXsweEUwMzgsIDB4ODAwMCx9LAotCXsweEUwM0EsIDB4RTEwMix9LAotCXsweEUwM0MsIDB4QTA0MCx9LAotCXsweEUwM0UsIDB4MDlGMyx9LAotCXsweEUwNDAsIDB4ODExNCx9LAotCXsweEUwNDIsIDB4NzFDRix9LAotCXsweEUwNDQsIDB4RkZGRix9LAotCXsweEUwNDYsIDB4RTA1OCx9LAotCXsweEUwNDgsIDB4NzBDRix9LAotCXsweEUwNEEsIDB4RkZGRix9LAotCXsweEUwNEMsIDB4QzU5NCx9LAotCXsweEUwNEUsIDB4QjAzMCx9LAotCXsweEUwNTAsIDB4RkZERCx9LAotCXsweEUwNTIsIDB4RDgwMCx9LAotCXsweEUwNTQsIDB4RjEwOSx9LAotCXsweEUwNTYsIDB4MDAwMCx9LAotCXsweEUwNTgsIDB4MDMwMCx9LAotCXsweEUwNUEsIDB4MDIwNCx9LAotCXsweEUwNUMsIDB4MDcwMCx9LAotCXsweEUwNUUsIDB4MDAwMCx9LAotCXsweEUwNjAsIDB4MDAwMCx9LAotCXsweEUwNjIsIDB4MDAwMCx9LAotCXsweEUwNjQsIDB4MDAwMCx9LAotCXsweEUwNjYsIDB4MDAwMCx9LAotCXsweEUwNjgsIDB4MDAwMCx9LAotCXsweEUwNkEsIDB4MDAwMCx9LAotCXsweEUwNkMsIDB4MDAwMCx9LAotCXsweEUwNkUsIDB4MDAwMCx9LAotCXsweEUwNzAsIDB4MDAwMCx9LAotCXsweEUwNzIsIDB4MDAwMCx9LAotCXsweEUwNzQsIDB4MDAwMCx9LAotCXsweEUwNzYsIDB4MDAwMCx9LAotCXsweEUwNzgsIDB4MDAwMCx9LAotCXsweEUwN0EsIDB4MDAwMCx9LAotCXsweEUwN0MsIDB4MDAwMCx9LAotCXsweEUwN0UsIDB4MDAwMCx9LAotCXsweEUwODAsIDB4MDAwMCx9LAotCXsweEUwODIsIDB4MDAwMCx9LAotCXsweEUwODQsIDB4MDAwMCx9LAotCXsweEUwODYsIDB4MDAwMCx9LAotCXsweEUwODgsIDB4MDAwMCx9LAotCXsweEUwOEEsIDB4MDAwMCx9LAotCXsweEUwOEMsIDB4MDAwMCx9LAotCXsweEUwOEUsIDB4MDAwMCx9LAotCXsweEUwOTAsIDB4MDAwMCx9LAotCXsweEUwOTIsIDB4MDAwMCx9LAotCXsweEUwOTQsIDB4MDAwMCx9LAotCXsweEUwOTYsIDB4MDAwMCx9LAotCXsweEUwOTgsIDB4MDAwMCx9LAotCXsweEUwOUEsIDB4MDAwMCx9LAotCXsweEUwOUMsIDB4MDAwMCx9LAotCXsweEUwOUUsIDB4MDAwMCx9LAotCXsweEUwQTAsIDB4MDAwMCx9LAotCXsweEUwQTIsIDB4MDAwMCx9LAotCXsweEUwQTQsIDB4MDAwMCx9LAotCXsweEUwQTYsIDB4MDAwMCx9LAotCXsweEUwQTgsIDB4MDAwMCx9LAotCXsweEUwQUEsIDB4MDAwMCx9LAotCXsweEUwQUMsIDB4RkZGRix9LAotCXsweEUwQUUsIDB4Q0I2OCx9LAotCXsweEUwQjAsIDB4RkZGRix9LAotCXsweEUwQjIsIDB4REZGMCx9LAotCXsweEUwQjQsIDB4RkZGRix9LAotCXsweEUwQjYsIDB4Q0I2Qyx9LAotCXsweEUwQjgsIDB4RkZGRix9LAotCXsweEUwQkEsIDB4RTAwMCx9LAotCXsweDA5OEUsIDB4MDAwMCx9LAotCi0JLypNSVBJIHNldHRpbmcgZm9yIFNPQzEwNDAqLwotCXsweDNDNUEsIDB4MDAwOSx9LAotCXsweDNDNDQsIDB4MDA4MCx9LC8qTUlQSV9DVVNUT01fU0hPUlRfUEtUKi8KLQotCS8qW1R1bmluZ19zZXR0aW5nc10qLwotCi0JLypbQ0NNXSovCi0JezB4Qzg5MiwgMHgwMjY3LH0sLypDQU1fQVdCX0NDTV9MXzAqLwotCXsweEM4OTQsIDB4RkYxQSx9LC8qQ0FNX0FXQl9DQ01fTF8xKi8KLQl7MHhDODk2LCAweEZGQjMsfSwvKkNBTV9BV0JfQ0NNX0xfMiovCi0JezB4Qzg5OCwgMHhGRjgwLH0sLypDQU1fQVdCX0NDTV9MXzMqLwotCXsweEM4OUEsIDB4MDE2Nix9LC8qQ0FNX0FXQl9DQ01fTF80Ki8KLQl7MHhDODlDLCAweDAwMDMsfSwvKkNBTV9BV0JfQ0NNX0xfNSovCi0JezB4Qzg5RSwgMHhGRjlBLH0sLypDQU1fQVdCX0NDTV9MXzYqLwotCXsweEM4QTAsIDB4RkVCNCx9LC8qQ0FNX0FXQl9DQ01fTF83Ki8KLQl7MHhDOEEyLCAweDAyNEQsfSwvKkNBTV9BV0JfQ0NNX0xfOCovCi0JezB4QzhBNCwgMHgwMUJGLH0sLypDQU1fQVdCX0NDTV9NXzAqLwotCXsweEM4QTYsIDB4RkYwMSx9LC8qQ0FNX0FXQl9DQ01fTV8xKi8KLQl7MHhDOEE4LCAweEZGRjMsfSwvKkNBTV9BV0JfQ0NNX01fMiovCi0JezB4QzhBQSwgMHhGRjc1LH0sLypDQU1fQVdCX0NDTV9NXzMqLwotCXsweEM4QUMsIDB4MDE5OCx9LC8qQ0FNX0FXQl9DQ01fTV80Ki8KLQl7MHhDOEFFLCAweEZGRkQsfSwvKkNBTV9BV0JfQ0NNX01fNSovCi0JezB4QzhCMCwgMHhGRjlBLH0sLypDQU1fQVdCX0NDTV9NXzYqLwotCXsweEM4QjIsIDB4RkVFNyx9LC8qQ0FNX0FXQl9DQ01fTV83Ki8KLQl7MHhDOEI0LCAweDAyQTgsfSwvKkNBTV9BV0JfQ0NNX01fOCovCi0JezB4QzhCNiwgMHgwMUQ5LH0sLypDQU1fQVdCX0NDTV9SXzAqLwotCXsweEM4QjgsIDB4RkYyNix9LC8qQ0FNX0FXQl9DQ01fUl8xKi8KLQl7MHhDOEJBLCAweEZGRjMsfSwvKkNBTV9BV0JfQ0NNX1JfMiovCi0JezB4QzhCQywgMHhGRkIzLH0sLypDQU1fQVdCX0NDTV9SXzMqLwotCXsweEM4QkUsIDB4MDEzMix9LC8qQ0FNX0FXQl9DQ01fUl80Ki8KLQl7MHhDOEMwLCAweEZGRTgsfSwvKkNBTV9BV0JfQ0NNX1JfNSovCi0JezB4QzhDMiwgMHhGRkRBLH0sLypDQU1fQVdCX0NDTV9SXzYqLwotCXsweEM4QzQsIDB4RkVDRCx9LC8qQ0FNX0FXQl9DQ01fUl83Ki8KLQl7MHhDOEM2LCAweDAyQzIsfSwvKkNBTV9BV0JfQ0NNX1JfOCovCi0JezB4QzhDOCwgMHgwMDc1LH0sLypDQU1fQVdCX0NDTV9MX1JHX0dBSU4qLwotCXsweEM4Q0EsIDB4MDExQyx9LC8qQ0FNX0FXQl9DQ01fTF9CR19HQUlOKi8KLQl7MHhDOENDLCAweDAwOUEsfSwvKkNBTV9BV0JfQ0NNX01fUkdfR0FJTiovCi0JezB4QzhDRSwgMHgwMTA1LH0sLypDQU1fQVdCX0NDTV9NX0JHX0dBSU4qLwotCXsweEM4RDAsIDB4MDBBNCx9LC8qQ0FNX0FXQl9DQ01fUl9SR19HQUlOKi8KLQl7MHhDOEQyLCAweDAwQUMsfSwvKkNBTV9BV0JfQ0NNX1JfQkdfR0FJTiovCi0JezB4QzhENCwgMHgwQThDLH0sLypDQU1fQVdCX0NDTV9MX0NURU1QKi8KLQl7MHhDOEQ2LCAweDBGMEEsfSwvKkNBTV9BV0JfQ0NNX01fQ1RFTVAqLwotCXsweEM4RDgsIDB4MTk2NCx9LC8qQ0FNX0FXQl9DQ01fUl9DVEVNUCovCi0KLQkvKltBV0JdKi8KLQl7MHhDOTE0LCAweDAwMDAsfSwvKkNBTV9TVEFUX0FXQl9DTElQX1dJTkRPV19YU1RBUlQqLwotCXsweEM5MTYsIDB4MDAwMCx9LC8qQ0FNX1NUQVRfQVdCX0NMSVBfV0lORE9XX1lTVEFSVCovCi0JezB4QzkxOCwgMHgwNEZGLH0sLypDQU1fU1RBVF9BV0JfQ0xJUF9XSU5ET1dfWEVORCovCi0JezB4QzkxQSwgMHgwMkNGLH0sLypDQU1fU1RBVF9BV0JfQ0xJUF9XSU5ET1dfWUVORCovCi0JezB4QzkwNCwgMHgwMDMzLH0sLypDQU1fQVdCX0FXQl9YU0hJRlRfUFJFX0FESiovCi0JezB4QzkwNiwgMHgwMDQwLH0sLypDQU1fQVdCX0FXQl9ZU0hJRlRfUFJFX0FESiovCi0JezB4QzhGMiwgMHgwMywgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwvKkNBTV9BV0JfQVdCX1hTQ0FMRSovCi0JezB4QzhGMywgMHgwMiwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwvKkNBTV9BV0JfQVdCX1lTQ0FMRSovCi0JezB4QzkwNiwgMHgwMDNDLH0sLypDQU1fQVdCX0FXQl9ZU0hJRlRfUFJFX0FESiovCi0JezB4QzhGNCwgMHgwMDAwLH0sLypDQU1fQVdCX0FXQl9XRUlHSFRTXzAqLwotCXsweEM4RjYsIDB4MDAwMCx9LC8qQ0FNX0FXQl9BV0JfV0VJR0hUU18xKi8KLQl7MHhDOEY4LCAweDAwMDAsfSwvKkNBTV9BV0JfQVdCX1dFSUdIVFNfMiovCi0JezB4QzhGQSwgMHhFNzI0LH0sLypDQU1fQVdCX0FXQl9XRUlHSFRTXzMqLwotCXsweEM4RkMsIDB4MTU4Myx9LC8qQ0FNX0FXQl9BV0JfV0VJR0hUU180Ki8KLQl7MHhDOEZFLCAweDIwNDUsfSwvKkNBTV9BV0JfQVdCX1dFSUdIVFNfNSovCi0JezB4QzkwMCwgMHgwM0ZGLH0sLypDQU1fQVdCX0FXQl9XRUlHSFRTXzYqLwotCXsweEM5MDIsIDB4MDA3Qyx9LC8qQ0FNX0FXQl9BV0JfV0VJR0hUU183Ki8KLQl7MHhDOTBDLCAweDgwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LC8qQ0FNX0FXQl9LX1JfTCovCi0JezB4QzkwRCwgMHg4MCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwvKkNBTV9BV0JfS19HX0wqLwotCXsweEM5MEUsIDB4ODAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sLypDQU1fQVdCX0tfQl9MKi8KLQl7MHhDOTBGLCAweDg4LCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LC8qQ0FNX0FXQl9LX1JfUiovCi0JezB4QzkxMCwgMHg4MCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwvKkNBTV9BV0JfS19HX1IqLwotCXsweEM5MTEsIDB4ODAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sLypDQU1fQVdCX0tfQl9SKi8KLQotCS8qW1N0ZXA3LUNQSVBFX1ByZWZlcmVuY2VdKi8KLQl7MHhDOTI2LCAweDAwMjAsfSwvKkNBTV9MTF9TVEFSVF9CUklHSFRORVNTKi8KLQl7MHhDOTI4LCAweDAwOUEsfSwvKkNBTV9MTF9TVE9QX0JSSUdIVE5FU1MqLwotCXsweEM5NDYsIDB4MDA3MCx9LC8qQ0FNX0xMX1NUQVJUX0dBSU5fTUVUUklDKi8KLQl7MHhDOTQ4LCAweDAwRjMsfSwvKkNBTV9MTF9TVE9QX0dBSU5fTUVUUklDKi8KLQl7MHhDOTUyLCAweDAwMjAsfSwvKkNBTV9MTF9TVEFSVF9UQVJHRVRfTFVNQV9CTSovCi0JezB4Qzk1NCwgMHgwMDlBLH0sLypDQU1fTExfU1RPUF9UQVJHRVRfTFVNQV9CTSovCi0JezB4QzkyQSwgMHg4MCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwvKkNBTV9MTF9TVEFSVF9TQVRVUkFUSU9OKi8KLQl7MHhDOTJCLCAweDRCLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LC8qQ0FNX0xMX0VORF9TQVRVUkFUSU9OKi8KLQl7MHhDOTJDLCAweDAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LC8qQ0FNX0xMX1NUQVJUX0RFU0FUVVJBVElPTiovCi0JezB4QzkyRCwgMHhGRiwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwvKkNBTV9MTF9FTkRfREVTQVRVUkFUSU9OKi8KLQl7MHhDOTJFLCAweDNDLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LC8qQ0FNX0xMX1NUQVJUX0RFTU9TQUlDKi8KLQl7MHhDOTJGLCAweDAyLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LC8qQ0FNX0xMX1NUQVJUX0FQX0dBSU4qLwotCXsweEM5MzAsIDB4MDYsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sLypDQU1fTExfU1RBUlRfQVBfVEhSRVNIKi8KLQl7MHhDOTMxLCAweDY0LCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LC8qQ0FNX0xMX1NUT1BfREVNT1NBSUMqLwotCXsweEM5MzIsIDB4MDEsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sLypDQU1fTExfU1RPUF9BUF9HQUlOKi8KLQl7MHhDOTMzLCAweDBDLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LC8qQ0FNX0xMX1NUT1BfQVBfVEhSRVNIKi8KLQl7MHhDOTM0LCAweDNDLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LC8qQ0FNX0xMX1NUQVJUX05SX1JFRCovCi0JezB4QzkzNSwgMHgzQywgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwvKkNBTV9MTF9TVEFSVF9OUl9HUkVFTiovCi0JezB4QzkzNiwgMHgzQywgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwvKkNBTV9MTF9TVEFSVF9OUl9CTFVFKi8KLQl7MHhDOTM3LCAweDBGLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LC8qQ0FNX0xMX1NUQVJUX05SX1RIUkVTSCovCi0JezB4QzkzOCwgMHg2NCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwvKkNBTV9MTF9TVE9QX05SX1JFRCovCi0JezB4QzkzOSwgMHg2NCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwvKkNBTV9MTF9TVE9QX05SX0dSRUVOKi8KLQl7MHhDOTNBLCAweDY0LCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LC8qQ0FNX0xMX1NUT1BfTlJfQkxVRSovCi0JezB4QzkzQiwgMHgzMiwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwvKkNBTV9MTF9TVE9QX05SX1RIUkVTSCovCi0JezB4QzkzQywgMHgwMDIwLH0sLypDQU1fTExfU1RBUlRfQ09OVFJBU1RfQk0qLwotCXsweEM5M0UsIDB4MDA5QSx9LC8qQ0FNX0xMX1NUT1BfQ09OVFJBU1RfQk0qLwotCXsweEM5NDAsIDB4MDBEQyx9LC8qQ0FNX0xMX0dBTU1BKi8KLQkvKkNBTV9MTF9TVEFSVF9DT05UUkFTVF9HUkFESUVOVCovCi0JezB4Qzk0MiwgMHgzOCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLQkvKkNBTV9MTF9TVE9QX0NPTlRSQVNUX0dSQURJRU5UKi8KLQl7MHhDOTQzLCAweDMwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LAotCXsweEM5NDQsIDB4NTAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sLypDQU1fTExfU1RBUlRfQ09OVFJBU1RfTFVNQSovCi0JezB4Qzk0NSwgMHgxOSwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwvKkNBTV9MTF9TVE9QX0NPTlRSQVNUX0xVTUEqLwotCXsweEM5NEEsIDB4MDIzMCx9LC8qQ0FNX0xMX1NUQVJUX0ZBREVfVE9fQkxBQ0tfTFVNQSovCi0JezB4Qzk0QywgMHgwMDEwLH0sLypDQU1fTExfU1RPUF9GQURFX1RPX0JMQUNLX0xVTUEqLwotCXsweEM5NEUsIDB4MDFDRCx9LC8qQ0FNX0xMX0NMVVNURVJfRENfVEhfQk0qLwotCXsweEM5NTAsIDB4MDUsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sLypDQU1fTExfQ0xVU1RFUl9EQ19HQVRFKi8KLQl7MHhDOTUxLCAweDQwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LC8qQ0FNX0xMX1NVTU1JTkdfU0VOU0lUSVZJVFkqLwotCS8qQ0FNX0FFVF9UQVJHRVRfQVZFUkFHRV9MVU1BX0RBUksqLwotCXsweEM4N0IsIDB4MUIsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sCi0JezB4Qzg3OCwgMHgwRSwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwvKkNBTV9BRVRfQUVNT0RFKi8KLQl7MHhDODkwLCAweDAwODAsfSwvKkNBTV9BRVRfVEFSR0VUX0dBSU4qLwotCXsweEM4ODYsIDB4MDEwMCx9LC8qQ0FNX0FFVF9BRV9NQVhfVklSVF9BR0FJTiovCi0JezB4Qzg3QywgMHgwMDVBLH0sLypDQU1fQUVUX0JMQUNLX0NMSVBQSU5HX1RBUkdFVCovCi0JezB4QjQyQSwgMHgwNSwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwvKkNDTV9ERUxUQV9HQUlOKi8KLQkvKkFFX1RSQUNLX0FFX1RSQUNLSU5HX0RBTVBFTklORyovCi0JezB4QTgwQSwgMHgyMCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLQl7MHgzQzQ0LCAweDAwODAsfSwKLQl7MHgzQzQwLCAweDAwMDQsIE1TTV9DQU1FUkFfSTJDX1VOU0VUX1dPUkRfTUFTS30sCi0JezB4QTgwMiwgMHgwOCwgTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfTUFTS30sCi0JezB4QzkwOCwgMHgwMSwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLQl7MHhDODc5LCAweDAxLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LAotCXsweEM5MDksIDB4MDEsIE1TTV9DQU1FUkFfSTJDX1VOU0VUX0JZVEVfTUFTS30sCi0JezB4QTgwQSwgMHgxOCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLQl7MHhBODBCLCAweDE4LCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LAotCXsweEFDMTYsIDB4MTgsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sCi0JezB4Qzg3OCwgMHgwOCwgTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfTUFTS30sCi0JezB4QkMwMiwgMHgwOCwgTVNNX0NBTUVSQV9JMkNfVU5TRVRfQllURV9NQVNLfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfaW5mbyBtdDltMTE0X3N1YmRldl9pbmZvW10gPSB7Ci0JewotCS5jb2RlICAgPSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOCwKLQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAotCS5mbXQgICAgPSAxLAotCS5vcmRlciAgICA9IDAsCi0JfSwKLQkvKiBtb3JlIGNhbiBiZSBzdXBwb3J0ZWQsIHRvIGJlIGFkZGVkIGxhdGVyICovCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIG10OW0xMTRfY29uZmlnX2NoYW5nZV9zZXR0aW5nc1tdID0gewotCXsweGRjMDAsIDB4MjgsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSwgTVNNX0NBTUVSQV9JMkNfQ01EX1dSSVRFfSwKLQl7TVQ5TTExNF9DT01NQU5EX1JFR0lTVEVSLCBNVDlNMTE0X0NPTU1BTkRfUkVHSVNURVJfU0VUX1NUQVRFLAotCQlNU01fQ0FNRVJBX0kyQ19VTlNFVF9XT1JEX01BU0ssIE1TTV9DQU1FUkFfSTJDX0NNRF9QT0xMfSwKLQl7TVQ5TTExNF9DT01NQU5EX1JFR0lTVEVSLCAoTVQ5TTExNF9DT01NQU5EX1JFR0lTVEVSX09LIHwKLQkJTVQ5TTExNF9DT01NQU5EX1JFR0lTVEVSX1NFVF9TVEFURSksIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSwKLQkJTVNNX0NBTUVSQV9JMkNfQ01EX1dSSVRFfSwKLQl7TVQ5TTExNF9DT01NQU5EX1JFR0lTVEVSLCBNVDlNMTE0X0NPTU1BTkRfUkVHSVNURVJfU0VUX1NUQVRFLAotCQlNU01fQ0FNRVJBX0kyQ19VTlNFVF9XT1JEX01BU0ssIE1TTV9DQU1FUkFfSTJDX0NNRF9QT0xMfSwKLQl7MHhEQzAxLCAweDMxLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LAotfTsKLQotc3RhdGljIHZvaWQgbXQ5bTExNF9zdG9wX3N0cmVhbShzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCkge30KLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5IG10OW0xMTRfaW5pdF9jb25mW10gPSB7Ci0Je210OW0xMTRfcmVjb21tZW5kX3NldHRpbmdzLAotCUFSUkFZX1NJWkUobXQ5bTExNF9yZWNvbW1lbmRfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEF9LAotCXttdDltMTE0X2NvbmZpZ19jaGFuZ2Vfc2V0dGluZ3MsCi0JQVJSQVlfU0laRShtdDltMTE0X2NvbmZpZ19jaGFuZ2Vfc2V0dGluZ3MpLAotCTAsIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgbXQ5bTExNF9jb25mc1tdID0gewotCXttdDltMTE0XzcyMHBfc2V0dGluZ3MsCi0JQVJSQVlfU0laRShtdDltMTE0XzcyMHBfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBtdDltMTE0X3NhdHVyYXRpb25bXVsxXSA9IHsKLQl7ezB4Q0MxMiwgMHgwMH0sfSwKLQl7ezB4Q0MxMiwgMHgxQX0sfSwKLQl7ezB4Q0MxMiwgMHgzNH0sfSwKLQl7ezB4Q0MxMiwgMHg0RX0sfSwKLQl7ezB4Q0MxMiwgMHg2OH0sfSwKLQl7ezB4Q0MxMiwgMHg4MH0sfSwKLQl7ezB4Q0MxMiwgMHg5QX0sfSwKLQl7ezB4Q0MxMiwgMHhCNH0sfSwKLQl7ezB4Q0MxMiwgMHhDRX0sfSwKLQl7ezB4Q0MxMiwgMHhFOH0sfSwKLQl7ezB4Q0MxMiwgMHhGRn0sfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgbXQ5bTExNF9yZWZyZXNoW10gPSB7Ci0Je01UOU0xMTRfQ09NTUFORF9SRUdJU1RFUiwgTVQ5TTExNF9DT01NQU5EX1JFR0lTVEVSX1JFRlJFU0gsCi0JCU1TTV9DQU1FUkFfSTJDX1VOU0VUX1dPUkRfTUFTSywgTVNNX0NBTUVSQV9JMkNfQ01EX1BPTEx9LAotCXtNVDlNMTE0X0NPTU1BTkRfUkVHSVNURVIsIChNVDlNMTE0X0NPTU1BTkRfUkVHSVNURVJfT0sgfAotCQlNVDlNMTE0X0NPTU1BTkRfUkVHSVNURVJfUkVGUkVTSCksIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSwKLQkJTVNNX0NBTUVSQV9JMkNfQ01EX1dSSVRFfSwKLQl7TVQ5TTExNF9DT01NQU5EX1JFR0lTVEVSLCBNVDlNMTE0X0NPTU1BTkRfUkVHSVNURVJfUkVGUkVTSCwKLQkJTVNNX0NBTUVSQV9JMkNfVU5TRVRfV09SRF9NQVNLLCBNU01fQ0FNRVJBX0kyQ19DTURfUE9MTH0sCi0Je01UOU0xMTRfQ09NTUFORF9SRUdJU1RFUiwgTVQ5TTExNF9DT01NQU5EX1JFR0lTVEVSX09LLAotCQlNU01fQ0FNRVJBX0kyQ19TRVRfV09SRF9NQVNLLCBNU01fQ0FNRVJBX0kyQ19DTURfUE9MTH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgbXQ5bTExNF9zYXR1cmF0aW9uX2NvbmZzW11bMl0gPSB7Ci0Je3ttdDltMTE0X3NhdHVyYXRpb25bMF0sCi0JCUFSUkFZX1NJWkUobXQ5bTExNF9zYXR1cmF0aW9uWzBdKSwgMCwgTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBfSwKLQl7bXQ5bTExNF9yZWZyZXNoLAotCQlBUlJBWV9TSVpFKG10OW0xMTRfcmVmcmVzaCksIDAsIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQX0sfSwKLQl7e210OW0xMTRfc2F0dXJhdGlvblsxXSwKLQkJQVJSQVlfU0laRShtdDltMTE0X3NhdHVyYXRpb25bMV0pLCAwLCBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEF9LAotCXttdDltMTE0X3JlZnJlc2gsCi0JCUFSUkFZX1NJWkUobXQ5bTExNF9yZWZyZXNoKSwgMCwgTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBfSx9LAotCXt7bXQ5bTExNF9zYXR1cmF0aW9uWzJdLAotCQlBUlJBWV9TSVpFKG10OW0xMTRfc2F0dXJhdGlvblsyXSksIDAsIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQX0sCi0Je210OW0xMTRfcmVmcmVzaCwKLQkJQVJSQVlfU0laRShtdDltMTE0X3JlZnJlc2gpLCAwLCBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEF9LH0sCi0Je3ttdDltMTE0X3NhdHVyYXRpb25bM10sCi0JCUFSUkFZX1NJWkUobXQ5bTExNF9zYXR1cmF0aW9uWzNdKSwgMCwgTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBfSwKLQl7bXQ5bTExNF9yZWZyZXNoLAotCQlBUlJBWV9TSVpFKG10OW0xMTRfcmVmcmVzaCksIDAsIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQX0sfSwKLQl7e210OW0xMTRfc2F0dXJhdGlvbls0XSwKLQkJQVJSQVlfU0laRShtdDltMTE0X3NhdHVyYXRpb25bNF0pLCAwLCBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEF9LAotCXttdDltMTE0X3JlZnJlc2gsCi0JCUFSUkFZX1NJWkUobXQ5bTExNF9yZWZyZXNoKSwgMCwgTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBfSx9LAotCXt7bXQ5bTExNF9zYXR1cmF0aW9uWzVdLAotCQlBUlJBWV9TSVpFKG10OW0xMTRfc2F0dXJhdGlvbls1XSksIDAsIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQX0sCi0Je210OW0xMTRfcmVmcmVzaCwKLQkJQVJSQVlfU0laRShtdDltMTE0X3JlZnJlc2gpLCAwLCBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEF9LH0sCi0Je3ttdDltMTE0X3NhdHVyYXRpb25bNl0sCi0JCUFSUkFZX1NJWkUobXQ5bTExNF9zYXR1cmF0aW9uWzZdKSwgMCwgTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBfSwKLQl7bXQ5bTExNF9yZWZyZXNoLAotCQlBUlJBWV9TSVpFKG10OW0xMTRfcmVmcmVzaCksIDAsIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQX0sfSwKLQl7e210OW0xMTRfc2F0dXJhdGlvbls3XSwKLQkJQVJSQVlfU0laRShtdDltMTE0X3NhdHVyYXRpb25bN10pLCAwLCBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEF9LAotCXttdDltMTE0X3JlZnJlc2gsCi0JCUFSUkFZX1NJWkUobXQ5bTExNF9yZWZyZXNoKSwgMCwgTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBfSx9LAotCXt7bXQ5bTExNF9zYXR1cmF0aW9uWzhdLAotCQlBUlJBWV9TSVpFKG10OW0xMTRfc2F0dXJhdGlvbls4XSksIDAsIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQX0sCi0Je210OW0xMTRfcmVmcmVzaCwKLQkJQVJSQVlfU0laRShtdDltMTE0X3JlZnJlc2gpLCAwLCBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEF9LH0sCi0Je3ttdDltMTE0X3NhdHVyYXRpb25bOV0sCi0JCUFSUkFZX1NJWkUobXQ5bTExNF9zYXR1cmF0aW9uWzldKSwgMCwgTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBfSwKLQl7bXQ5bTExNF9yZWZyZXNoLAotCQlBUlJBWV9TSVpFKG10OW0xMTRfcmVmcmVzaCksIDAsIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQX0sfSwKLQl7e210OW0xMTRfc2F0dXJhdGlvblsxMF0sCi0JCUFSUkFZX1NJWkUobXQ5bTExNF9zYXR1cmF0aW9uWzEwXSksCi0JCTAsIE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQX0sCi0Je210OW0xMTRfcmVmcmVzaCwKLQkJQVJSQVlfU0laRShtdDltMTE0X3JlZnJlc2gpLCAwLCBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEF9LH0sCi19OwotCi1zdGF0aWMgaW50IG10OW0xMTRfc2F0dXJhdGlvbl9lbnVtX21hcFtdID0gewotCU1TTV9WNEwyX1NBVFVSQVRJT05fTDAsCi0JTVNNX1Y0TDJfU0FUVVJBVElPTl9MMSwKLQlNU01fVjRMMl9TQVRVUkFUSU9OX0wyLAotCU1TTV9WNEwyX1NBVFVSQVRJT05fTDMsCi0JTVNNX1Y0TDJfU0FUVVJBVElPTl9MNCwKLQlNU01fVjRMMl9TQVRVUkFUSU9OX0w1LAotCU1TTV9WNEwyX1NBVFVSQVRJT05fTDYsCi0JTVNNX1Y0TDJfU0FUVVJBVElPTl9MNywKLQlNU01fVjRMMl9TQVRVUkFUSU9OX0w4LAotCU1TTV9WNEwyX1NBVFVSQVRJT05fTDksCi0JTVNNX1Y0TDJfU0FUVVJBVElPTl9MMTAsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2VudW1fY29uZl9hcnJheSBtdDltMTE0X3NhdHVyYXRpb25fZW51bV9jb25mcyA9IHsKLQkuY29uZiA9ICZtdDltMTE0X3NhdHVyYXRpb25fY29uZnNbMF1bMF0sCi0JLmNvbmZfZW51bSA9IG10OW0xMTRfc2F0dXJhdGlvbl9lbnVtX21hcCwKLQkubnVtX2VudW0gPSBBUlJBWV9TSVpFKG10OW0xMTRfc2F0dXJhdGlvbl9lbnVtX21hcCksCi0JLm51bV9pbmRleCA9IEFSUkFZX1NJWkUobXQ5bTExNF9zYXR1cmF0aW9uX2NvbmZzKSwKLQkubnVtX2NvbmYgPSBBUlJBWV9TSVpFKG10OW0xMTRfc2F0dXJhdGlvbl9jb25mc1swXSksCi0JLmRhdGFfdHlwZSA9IE1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSwKLX07Ci0KLXN0cnVjdCBtc21fc2Vuc29yX3Y0bDJfY3RybF9pbmZvX3QgbXQ5bTExNF92NGwyX2N0cmxfaW5mb1tdID0gewotCXsKLQkJLmN0cmxfaWQgPSBWNEwyX0NJRF9TQVRVUkFUSU9OLAotCQkubWluID0gTVNNX1Y0TDJfU0FUVVJBVElPTl9MMCwKLQkJLm1heCA9IE1TTV9WNEwyX1NBVFVSQVRJT05fTDEwLAotCQkuc3RlcCA9IDEsCi0JCS5lbnVtX2NmZ19zZXR0aW5ncyA9ICZtdDltMTE0X3NhdHVyYXRpb25fZW51bV9jb25mcywKLQkJLnNfdjRsMl9jdHJsID0gbXNtX3NlbnNvcl9zX2N0cmxfYnlfZW51bSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX291dHB1dF9pbmZvX3QgbXQ5bTExNF9kaW1lbnNpb25zW10gPSB7Ci0JewotCQkueF9vdXRwdXQgPSAweDUwMCwKLQkJLnlfb3V0cHV0ID0gMHgyRDAsCi0JCS5saW5lX2xlbmd0aF9wY2xrID0gMHg1MDAsCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweDJEMCwKLQkJLnZ0X3BpeGVsX2NsayA9IDQ4MDAwMDAwLAotCQkub3BfcGl4ZWxfY2xrID0gMTI4MDAwMDAwLAotCQkuYmlubmluZ19mYWN0b3IgPSAxLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3Jfb3V0cHV0X3JlZ19hZGRyX3QgbXQ5bTExNF9yZWdfYWRkciA9IHsKLQkueF9vdXRwdXQgPSAweEM4NjgsCi0JLnlfb3V0cHV0ID0gMHhDODZBLAotCS5saW5lX2xlbmd0aF9wY2xrID0gMHhDODY4LAotCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweEM4NkEsCi19OwotCi1zdGF0aWMgZW51bSBtc21fY2FtZXJhX3ZyZWdfbmFtZV90IG10OW0xMTRfdmVnX3NlcVtdID0gewotCUNBTV9WSU8sCi0JQ0FNX1ZESUcsCi0JQ0FNX1ZBTkEsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfaWRfaW5mb190IG10OW0xMTRfaWRfaW5mbyA9IHsKLQkuc2Vuc29yX2lkX3JlZ19hZGRyID0gMHgwLAotCS5zZW5zb3JfaWQgPSAweDI0ODEsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbXQ5bTExNF9pMmNfaWRbXSA9IHsKLQl7U0VOU09SX05BTUUsIChrZXJuZWxfdWxvbmdfdCkmbXQ5bTExNF9zX2N0cmx9LAotCXsgfQotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG10OW0xMTRfaTJjX2RyaXZlciA9IHsKLQkuaWRfdGFibGUgPSBtdDltMTE0X2kyY19pZCwKLQkucHJvYmUgID0gbXNtX3NlbnNvcl9pMmNfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBTRU5TT1JfTkFNRSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgbXQ5bTExNF9zZW5zb3JfaTJjX2NsaWVudCA9IHsKLQkuYWRkcl90eXBlID0gTVNNX0NBTUVSQV9JMkNfV09SRF9BRERSLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXQ5bTExNF9kdF9tYXRjaFtdID0gewotCXsuY29tcGF0aWJsZSA9ICJxY29tLG10OW0xMTQiLCAuZGF0YSA9ICZtdDltMTE0X3NfY3RybH0sCi0Je30KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG10OW0xMTRfZHRfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtdDltMTE0X3BsYXRmb3JtX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJxY29tLG10OW0xMTQiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gbXQ5bTExNF9kdF9tYXRjaCwKLQl9LAotfTsKLQotc3RhdGljIGludDMyX3QgbXQ5bTExNF9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludDMyX3QgcmMgPSAwOwotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwotCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKG10OW0xMTRfZHRfbWF0Y2gsICZwZGV2LT5kZXYpOwotCXJjID0gbXNtX3NlbnNvcl9wbGF0Zm9ybV9wcm9iZShwZGV2LCBtYXRjaC0+ZGF0YSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fc2Vuc29yX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJm10OW0xMTRfcGxhdGZvcm1fZHJpdmVyLAotCQltdDltMTE0X3BsYXRmb3JtX3Byb2JlKTsKLQlpZiAoIXJjKQotCQlyZXR1cm4gcmM7Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZtdDltMTE0X2kyY19kcml2ZXIpOwotfQotCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtc21fc2Vuc29yX2V4aXRfbW9kdWxlKHZvaWQpCi17Ci0JaWYgKG10OW0xMTRfc19jdHJsLnBkZXYpIHsKLQkJbXNtX3NlbnNvcl9mcmVlX3NlbnNvcl9kYXRhKCZtdDltMTE0X3NfY3RybCk7Ci0JCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtdDltMTE0X3BsYXRmb3JtX2RyaXZlcik7Ci0JfSBlbHNlIHsKLQkJaTJjX2RlbF9kcml2ZXIoJm10OW0xMTRfaTJjX2RyaXZlcik7Ci0JfQotCXJldHVybjsKLX0KLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBtdDltMTE0X3N1YmRldl9jb3JlX29wcyA9IHsKLQkuc19jdHJsID0gbXNtX3NlbnNvcl92NGwyX3NfY3RybCwKLQkucXVlcnljdHJsID0gbXNtX3NlbnNvcl92NGwyX3F1ZXJ5X2N0cmwsCi0JLmlvY3RsID0gbXNtX3NlbnNvcl9zdWJkZXZfaW9jdGwsCi0JLnNfcG93ZXIgPSBtc21fc2Vuc29yX3Bvd2VyLAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgbXQ5bTExNF9zdWJkZXZfdmlkZW9fb3BzID0gewotCS5lbnVtX21idXNfZm10ID0gbXNtX3NlbnNvcl92NGwyX2VudW1fZm10LAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgbXQ5bTExNF9zdWJkZXZfb3BzID0gewotCS5jb3JlID0gJm10OW0xMTRfc3ViZGV2X2NvcmVfb3BzLAotCS52aWRlbyAgPSAmbXQ5bTExNF9zdWJkZXZfdmlkZW9fb3BzLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2ZuX3QgbXQ5bTExNF9mdW5jX3RibCA9IHsKLQkuc2Vuc29yX3N0YXJ0X3N0cmVhbSA9IG1zbV9zZW5zb3Jfc3RhcnRfc3RyZWFtLAotCS5zZW5zb3Jfc3RvcF9zdHJlYW0gPSBtdDltMTE0X3N0b3Bfc3RyZWFtLAotCS5zZW5zb3Jfc2V0dGluZyA9IG1zbV9zZW5zb3Jfc2V0dGluZywKLQkuc2Vuc29yX3NldF9zZW5zb3JfbW9kZSA9IG1zbV9zZW5zb3Jfc2V0X3NlbnNvcl9tb2RlLAotCS5zZW5zb3JfbW9kZV9pbml0ID0gbXNtX3NlbnNvcl9tb2RlX2luaXQsCi0JLnNlbnNvcl9nZXRfb3V0cHV0X2luZm8gPSBtc21fc2Vuc29yX2dldF9vdXRwdXRfaW5mbywKLQkuc2Vuc29yX2NvbmZpZyA9IG1zbV9zZW5zb3JfY29uZmlnLAotCS5zZW5zb3JfcG93ZXJfdXAgPSBtc21fc2Vuc29yX3Bvd2VyX3VwLAotCS5zZW5zb3JfcG93ZXJfZG93biA9IG1zbV9zZW5zb3JfcG93ZXJfZG93biwKLQkuc2Vuc29yX2dldF9jc2lfcGFyYW1zID0gbXNtX3NlbnNvcl9nZXRfY3NpX3BhcmFtcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9yZWdfdCBtdDltMTE0X3JlZ3MgPSB7Ci0JLmRlZmF1bHRfZGF0YV90eXBlID0gTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBLAotCS5zdGFydF9zdHJlYW1fY29uZiA9IG10OW0xMTRfY29uZmlnX2NoYW5nZV9zZXR0aW5ncywKLQkuc3RhcnRfc3RyZWFtX2NvbmZfc2l6ZSA9IEFSUkFZX1NJWkUobXQ5bTExNF9jb25maWdfY2hhbmdlX3NldHRpbmdzKSwKLQkuaW5pdF9zZXR0aW5ncyA9ICZtdDltMTE0X2luaXRfY29uZlswXSwKLQkuaW5pdF9zaXplID0gQVJSQVlfU0laRShtdDltMTE0X2luaXRfY29uZiksCi0JLm1vZGVfc2V0dGluZ3MgPSAmbXQ5bTExNF9jb25mc1swXSwKLQkub3V0cHV0X3NldHRpbmdzID0gJm10OW0xMTRfZGltZW5zaW9uc1swXSwKLQkubnVtX2NvbmYgPSBBUlJBWV9TSVpFKG10OW0xMTRfY29uZnMpLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCBtdDltMTE0X3NfY3RybCA9IHsKLQkubXNtX3NlbnNvcl9yZWcgPSAmbXQ5bTExNF9yZWdzLAotCS5tc21fc2Vuc29yX3Y0bDJfY3RybF9pbmZvID0gbXQ5bTExNF92NGwyX2N0cmxfaW5mbywKLQkubnVtX3Y0bDJfY3RybCA9IEFSUkFZX1NJWkUobXQ5bTExNF92NGwyX2N0cmxfaW5mbyksCi0JLnNlbnNvcl9pMmNfY2xpZW50ID0gJm10OW0xMTRfc2Vuc29yX2kyY19jbGllbnQsCi0JLnNlbnNvcl9pMmNfYWRkciA9IDB4OTAsCi0JLnZyZWdfc2VxID0gbXQ5bTExNF92ZWdfc2VxLAotCS5udW1fdnJlZ19zZXEgPSBBUlJBWV9TSVpFKG10OW0xMTRfdmVnX3NlcSksCi0JLnNlbnNvcl9vdXRwdXRfcmVnX2FkZHIgPSAmbXQ5bTExNF9yZWdfYWRkciwKLQkuc2Vuc29yX2lkX2luZm8gPSAmbXQ5bTExNF9pZF9pbmZvLAotCS5jYW1fbW9kZSA9IE1TTV9TRU5TT1JfTU9ERV9JTlZBTElELAotCS5taW5fZGVsYXkgPSAzMCwKLQkucG93ZXJfc2VxX2RlbGF5ID0gNjAsCi0JLm1zbV9zZW5zb3JfbXV0ZXggPSAmbXQ5bTExNF9tdXQsCi0JLnNlbnNvcl9pMmNfZHJpdmVyID0gJm10OW0xMTRfaTJjX2RyaXZlciwKLQkuc2Vuc29yX3Y0bDJfc3ViZGV2X2luZm8gPSBtdDltMTE0X3N1YmRldl9pbmZvLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfaW5mb19zaXplID0gQVJSQVlfU0laRShtdDltMTE0X3N1YmRldl9pbmZvKSwKLQkuc2Vuc29yX3Y0bDJfc3ViZGV2X29wcyA9ICZtdDltMTE0X3N1YmRldl9vcHMsCi0JLmZ1bmNfdGJsID0gJm10OW0xMTRfZnVuY190YmwsCi19OwotCi1tb2R1bGVfaW5pdChtc21fc2Vuc29yX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KG1zbV9zZW5zb3JfZXhpdF9tb2R1bGUpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBcHRpbmEgMS4yNk1QIFlVViBzZW5zb3IgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9vdjI3MjAuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL292MjcyMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTdiZjA3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL292MjcyMC5jCisrKyAvZGV2L251bGwKQEAgLTEsODU2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSAibXNtX3NlbnNvci5oIgotI2luY2x1ZGUgIm92MjcyMC5oIgotI2RlZmluZSBTRU5TT1JfTkFNRSAib3YyNzIwIgotI2RlZmluZSBQTEFURk9STV9EUklWRVJfTkFNRSAibXNtX2NhbWVyYV9vdjI3MjAiCi0jZGVmaW5lIG92MjcyMF9vYmogb3YyNzIwXyMjb2JqCi0KLURFRklORV9NVVRFWChvdjI3MjBfbXV0KTsKLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3Qgb3YyNzIwX3NfY3RybDsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjI3MjBfc3RhcnRfc2V0dGluZ3NbXSA9IHsKLQl7MHgwMTAwLCAweDAxfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3YyNzIwX3N0b3Bfc2V0dGluZ3NbXSA9IHsKLQl7MHgwMTAwLCAweDAwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3YyNzIwX2dyb3Vwb25fc2V0dGluZ3NbXSA9IHsKLQl7MHgzMjA4LCAweDAwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3YyNzIwX2dyb3Vwb2ZmX3NldHRpbmdzW10gPSB7Ci0JezB4MzIwOCwgMHgxMH0sCi0JezB4MzIwOCwgMHhBMH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIG92MjcyMF9wcmV2X3NldHRpbmdzW10gPSB7Ci0JezB4MzgwMCwgMHgwMH0sCi0JezB4MzgwMSwgMHgwMn0sCi0JezB4MzgwMiwgMHgwMH0sCi0JezB4MzgwMywgMHgwMH0sCi0JezB4MzgwNCwgMHgwN30sCi0JezB4MzgwNSwgMHhBMX0sCi0JezB4MzgwNiwgMHgwNH0sCi0JezB4MzgwNywgMHg0N30sCi0JezB4MzgxMCwgMHgwMH0sCi0JezB4MzgxMSwgMHgwOX0sCi0JezB4MzgxMiwgMHgwMH0sCi0JezB4MzgxMywgMHgwMn0sCi0JezB4MzgyMCwgMHg4MH0sCi0JezB4MzgyMSwgMHgwNn0sCi0JezB4MzgxNCwgMHgxMX0sCi0JezB4MzgxNSwgMHgxMX0sCi0JezB4MzYxMiwgMHgwYn0sCi0JezB4MzYxOCwgMHgwNH0sCi0JezB4M2EwOCwgMHgwMX0sCi0JezB4M2EwOSwgMHg1MH0sCi0JezB4M2EwYSwgMHgwMX0sCi0JezB4M2EwYiwgMHgxOH0sCi0JezB4M2EwZCwgMHgwM30sCi0JezB4M2EwZSwgMHgwM30sCi0JezB4NDUyMCwgMHgwMH0sCi0JezB4NDgzNywgMHgxYn0sCi0JezB4MzAwMCwgMHhmZn0sCi0JezB4MzAwMSwgMHhmZn0sCi0JezB4MzAwMiwgMHhmMH0sCi0JezB4MzYwMCwgMHgwOH0sCi0JezB4MzYyMSwgMHhjMH0sCi0JezB4MzYzMiwgMHhkMn0sCi0JezB4MzYzMywgMHgyM30sCi0JezB4MzYzNCwgMHg1NH0sCi0JezB4M2YwMSwgMHgwY30sCi0JezB4NTAwMSwgMHhjMX0sCi0JezB4MzYxNCwgMHhmMH0sCi0JezB4MzYzMCwgMHgyZH0sCi0JezB4MzcwYiwgMHg2Mn0sCi0JezB4MzcwNiwgMHg2MX0sCi0JezB4NDAwMCwgMHgwMn0sCi0JezB4NDAwMiwgMHhjNX0sCi0JezB4NDAwNSwgMHgwOH0sCi0JezB4NDA0ZiwgMHg4NH0sCi0JezB4NDA1MSwgMHgwMH0sCi0JezB4NTAwMCwgMHhjZn0sCi0JezB4M2ExOCwgMHgwMH0sCi0JezB4M2ExOSwgMHg4MH0sCi0JezB4MzUwMywgMHgwM30sCi0JezB4NDUyMSwgMHgwMH0sCi0JezB4NTE4MywgMHhiMH0sCi0JezB4NTE4NCwgMHhiMH0sCi0JezB4NTE4NSwgMHhiMH0sCi0JezB4MzcwYywgMHgwY30sCi0JezB4MzAzNSwgMHgxMH0sCi0JezB4MzAzNiwgMHgxZX0sCi0JezB4MzAzNywgMHgyMX0sCi0JezB4MzAzZSwgMHgxOX0sCi0JezB4MzAzOCwgMHgwNn0sCi0JezB4MzAxOCwgMHgwNH0sCi0JezB4MzAwMCwgMHgwMH0sCi0JezB4MzAwMSwgMHgwMH0sCi0JezB4MzAwMiwgMHgwMH0sCi0JezB4M2EwZiwgMHg0MH0sCi0JezB4M2ExMCwgMHgzOH0sCi0JezB4M2ExYiwgMHg0OH0sCi0JezB4M2ExZSwgMHgzMH0sCi0JezB4M2ExMSwgMHg5MH0sCi0JezB4M2ExZiwgMHgxMH0sCi0JezB4NDgwMCwgMHgyNH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIG92MjcyMF83MjBfc2V0dGluZ3NbXSA9IHsKLQl7MHgzODAwLCAweDAxfSwKLQl7MHgzODAxLCAweDRhfSwKLQl7MHgzODAyLCAweDAwfSwKLQl7MHgzODAzLCAweGJhfSwKLQl7MHgzODA0LCAweDA2fSwKLQl7MHgzODA1LCAweDUxKzMyfSwKLQl7MHgzODA2LCAweDAzfSwKLQl7MHgzODA3LCAweDhkKzI0fSwKLQl7MHgzODEwLCAweDAwfSwKLQl7MHgzODExLCAweDA1fSwKLQl7MHgzODEyLCAweDAwfSwKLQl7MHgzODEzLCAweDAyfSwKLQl7MHgzODIwLCAweDgwfSwKLQl7MHgzODIxLCAweDA2fSwKLQl7MHgzODE0LCAweDExfSwKLQl7MHgzODE1LCAweDExfSwKLQl7MHgzNjEyLCAweDBifSwKLQl7MHgzNjE4LCAweDA0fSwKLQl7MHgzYTA4LCAweDAxfSwKLQl7MHgzYTA5LCAweDUwfSwKLQl7MHgzYTBhLCAweDAxfSwKLQl7MHgzYTBiLCAweDE4fSwKLQl7MHgzYTBkLCAweDAzfSwKLQl7MHgzYTBlLCAweDAzfSwKLQl7MHg0NTIwLCAweDAwfSwKLQl7MHg0ODM3LCAweDFifSwKLQl7MHgzMDAwLCAweGZmfSwKLQl7MHgzMDAxLCAweGZmfSwKLQl7MHgzMDAyLCAweGYwfSwKLQl7MHgzNjAwLCAweDA4fSwKLQl7MHgzNjIxLCAweGMwfSwKLQl7MHgzNjMyLCAweGQyfSwKLQl7MHgzNjMzLCAweDIzfSwKLQl7MHgzNjM0LCAweDU0fSwKLQl7MHgzZjAxLCAweDBjfSwKLQl7MHg1MDAxLCAweGMxfSwKLQl7MHgzNjE0LCAweGYwfSwKLQl7MHgzNjMwLCAweDJkfSwKLQl7MHgzNzBiLCAweDYyfSwKLQl7MHgzNzA2LCAweDYxfSwKLQl7MHg0MDAwLCAweDAyfSwKLQl7MHg0MDAyLCAweGM1fSwKLQl7MHg0MDA1LCAweDA4fSwKLQl7MHg0MDRmLCAweDg0fSwKLQl7MHg0MDUxLCAweDAwfSwKLQl7MHg1MDAwLCAweGZmfSwKLQl7MHgzYTE4LCAweDAwfSwKLQl7MHgzYTE5LCAweDgwfSwKLQl7MHgzNTAzLCAweDEzfSwKLQl7MHg0NTIxLCAweDAwfSwKLQl7MHg1MTgzLCAweGIwfSwKLQl7MHg1MTg0LCAweGIwfSwKLQl7MHg1MTg1LCAweGIwfSwKLQl7MHgzNzBjLCAweDBjfSwKLQl7MHgzMDM1LCAweDEwfSwKLQl7MHgzMDM2LCAweDA0fSwKLQl7MHgzMDM3LCAweDYxfSwKLQl7MHgzMDNlLCAweDE5fSwKLQl7MHgzMDM4LCAweDA2fSwKLQl7MHgzMDE4LCAweDA0fSwKLQl7MHgzMDAwLCAweDAwfSwKLQl7MHgzMDAxLCAweDAwfSwKLQl7MHgzMDAyLCAweDAwfSwKLQl7MHgzYTBmLCAweDQwfSwKLQl7MHgzYTEwLCAweDM4fSwKLQl7MHgzYTFiLCAweDQ4fSwKLQl7MHgzYTFlLCAweDMwfSwKLQl7MHgzYTExLCAweDkwfSwKLQl7MHgzYTFmLCAweDEwfSwKLQl7MHg0ODAwLCAweDI0fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3YyNzIwX3ZnYV9zZXR0aW5nc1tdID0gewotCXsweDM4MDAsIDB4MDB9LAotCXsweDM4MDEsIDB4MGN9LAotCXsweDM4MDIsIDB4MDB9LAotCXsweDM4MDMsIDB4MDJ9LAotCXsweDM4MDQsIDB4MDd9LAotCXsweDM4MDUsIDB4OTcrMzJ9LAotCXsweDM4MDYsIDB4MDR9LAotCXsweDM4MDcsIDB4NDUrMjR9LAotCXsweDM4MTAsIDB4MDB9LAotCXsweDM4MTEsIDB4MDN9LAotCXsweDM4MTIsIDB4MDB9LAotCXsweDM4MTMsIDB4MDN9LAotCXsweDM4MjAsIDB4ODB9LAotCXsweDM4MjEsIDB4MDZ9LAotCXsweDM4MTQsIDB4MTF9LAotCXsweDM4MTUsIDB4MTF9LAotCXsweDM2MTIsIDB4MGJ9LAotCXsweDM2MTgsIDB4MDR9LAotCXsweDNhMDgsIDB4MDF9LAotCXsweDNhMDksIDB4NTB9LAotCXsweDNhMGEsIDB4MDF9LAotCXsweDNhMGIsIDB4MTh9LAotCXsweDNhMGQsIDB4MDN9LAotCXsweDNhMGUsIDB4MDN9LAotCXsweDQ1MjAsIDB4MDB9LAotCXsweDQ4MzcsIDB4MWJ9LAotCXsweDMwMDAsIDB4ZmZ9LAotCXsweDMwMDEsIDB4ZmZ9LAotCXsweDMwMDIsIDB4ZjB9LAotCXsweDM2MDAsIDB4MDh9LAotCXsweDM2MjEsIDB4YzB9LAotCXsweDM2MzIsIDB4ZDJ9LAotCXsweDM2MzMsIDB4MjN9LAotCXsweDM2MzQsIDB4NTR9LAotCXsweDNmMDEsIDB4MGN9LAotCXsweDUwMDEsIDB4YzF9LAotCXsweDM2MTQsIDB4ZjB9LAotCXsweDM2MzAsIDB4MmR9LAotCXsweDM3MGIsIDB4NjJ9LAotCXsweDM3MDYsIDB4NjF9LAotCXsweDQwMDAsIDB4MDJ9LAotCXsweDQwMDIsIDB4YzV9LAotCXsweDQwMDUsIDB4MDh9LAotCXsweDQwNGYsIDB4ODR9LAotCXsweDQwNTEsIDB4MDB9LAotCXsweDUwMDAsIDB4ZmZ9LAotCXsweDNhMTgsIDB4MDB9LAotCXsweDNhMTksIDB4ODB9LAotCXsweDM1MDMsIDB4MTN9LAotCXsweDQ1MjEsIDB4MDB9LAotCXsweDUxODMsIDB4YjB9LAotCXsweDUxODQsIDB4YjB9LAotCXsweDUxODUsIDB4YjB9LAotCXsweDM3MGMsIDB4MGN9LAotCXsweDMwMzUsIDB4MTB9LAotCXsweDMwMzYsIDB4MDR9LAotCXsweDMwMzcsIDB4NjF9LAotCXsweDMwM2UsIDB4MTl9LAotCXsweDMwMzgsIDB4MDZ9LAotCXsweDMwMTgsIDB4MDR9LAotCXsweDMwMDAsIDB4MDB9LAotCXsweDMwMDEsIDB4MDB9LAotCXsweDMwMDIsIDB4MDB9LAotCXsweDNhMGYsIDB4NDB9LAotCXsweDNhMTAsIDB4Mzh9LAotCXsweDNhMWIsIDB4NDh9LAotCXsweDNhMWUsIDB4MzB9LAotCXsweDNhMTEsIDB4OTB9LAotCXsweDNhMWYsIDB4MTB9LAotCXsweDQ4MDAsIDB4MjR9LAotCXsweDM1MDAsIDB4MDB9LAotCXsweDM1MDEsIDB4MTd9LAotCXsweDM1MDIsIDB4ZjB9LAotCXsweDM1MDgsIDB4MDB9LAotCXsweDM1MDksIDB4MjB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjI3MjBfNjBmcHNfc2V0dGluZ3NbXSA9IHsKLQl7MHgzNzE4LCAweDEwfSwKLQl7MHgzNzAyLCAweDE4fSwKLQl7MHgzNzNhLCAweDNjfSwKLQl7MHgzNzE1LCAweDAxfSwKLQl7MHgzNzAzLCAweDFkfSwKLQl7MHgzNzA1LCAweDBifSwKLQl7MHgzNzMwLCAweDFmfSwKLQl7MHgzNzA0LCAweDNmfSwKLQl7MHgzZjA2LCAweDFkfSwKLQl7MHgzNzFjLCAweDAwfSwKLQl7MHgzNzFkLCAweDgzfSwKLQl7MHgzNzFlLCAweDAwfSwKLQl7MHgzNzFmLCAweGI2fSwKLQl7MHgzNzA4LCAweDYzfSwKLQl7MHgzNzA5LCAweDUyfSwKLQl7MHgzODAwLCAweDAxfSwKLQl7MHgzODAxLCAweDQyfSwKLQl7MHgzODAyLCAweDAwfSwKLQl7MHgzODAzLCAweDQwfSwKLQl7MHgzODA0LCAweDA2fSwKLQl7MHgzODA1LCAweDYxfSwKLQl7MHgzODA2LCAweDA0fSwKLQl7MHgzODA3LCAweDA4fSwKLQl7MHgzODA4LCAweDAyfSwKLQl7MHgzODA5LCAweDgwfSwKLQl7MHgzODBhLCAweDAxfSwKLQl7MHgzODBiLCAweGUwfSwKLQl7MHgzODBjLCAweDAzfSwKLQl7MHgzODBkLCAweDBjfSwKLQl7MHgzODBlLCAweDAyfSwKLQl7MHgzODBmLCAweDAwfSwKLQl7MHgzODEwLCAweDAwfSwKLQl7MHgzODExLCAweDBmfSwKLQl7MHgzODEyLCAweDAwfSwKLQl7MHgzODEzLCAweDAyfSwKLQl7MHgzODIwLCAweDgwfSwKLQl7MHgzODIxLCAweDA2fSwKLQl7MHgzODE0LCAweDMxfSwKLQl7MHgzODE1LCAweDMxfSwKLQl7MHgzNjEyLCAweDBifSwKLQl7MHgzNjE4LCAweDA0fSwKLQl7MHgzYTA4LCAweDAyfSwKLQl7MHgzYTA5LCAweDY3fSwKLQl7MHgzYTBhLCAweDAyfSwKLQl7MHgzYTBiLCAweDAwfSwKLQl7MHgzYTBkLCAweDAwfSwKLQl7MHgzYTBlLCAweDAwfSwKLQl7MHg0NTIwLCAweDBhfSwKLQl7MHg0ODM3LCAweDI5fSwKLQl7MHgzMDAwLCAweGZmfSwKLQl7MHgzMDAxLCAweGZmfSwKLQl7MHgzMDAyLCAweGYwfSwKLQl7MHgzNjAwLCAweDA4fSwKLQl7MHgzNjIxLCAweGMwfSwKLQl7MHgzNjMyLCAweGQyfSwKLQl7MHgzNjMzLCAweDIzfSwKLQl7MHgzNjM0LCAweDU0fSwKLQl7MHgzZjAxLCAweDBjfSwKLQl7MHg1MDAxLCAweGMxfSwKLQl7MHgzNjE0LCAweGYwfSwKLQl7MHgzNjMwLCAweDJkfSwKLQl7MHgzNzBiLCAweDYyfSwKLQl7MHgzNzA2LCAweDYxfSwKLQl7MHg0MDAwLCAweDAyfSwKLQl7MHg0MDAyLCAweGM1fSwKLQl7MHg0MDA1LCAweDA4fSwKLQl7MHg0MDRmLCAweDg0fSwKLQl7MHg0MDUxLCAweDAwfSwKLQl7MHg1MDAwLCAweGNmfSwKLQl7MHgzYTE4LCAweDAwfSwKLQl7MHgzYTE5LCAweDgwfSwKLQl7MHgzNTAzLCAweDA3fSwKLQl7MHg0NTIxLCAweDAwfSwKLQl7MHg1MTgzLCAweGIwfSwKLQl7MHg1MTg0LCAweGIwfSwKLQl7MHg1MTg1LCAweGIwfSwKLQl7MHgzNzBjLCAweDBjfSwKLQl7MHgzMDM1LCAweDMwfSwKLQl7MHgzMDM2LCAweDE0fSwKLQl7MHgzMDM3LCAweDIxfSwKLQl7MHgzMDNlLCAweDE5fSwKLQl7MHgzMDM4LCAweDA2fSwKLQl7MHgzMDE4LCAweDA0fSwKLQl7MHgzMDAwLCAweDAwfSwKLQl7MHgzMDAxLCAweDAwfSwKLQl7MHgzMDAyLCAweDAwfSwKLQl7MHgzYTBmLCAweDQwfSwKLQl7MHgzYTEwLCAweDM4fSwKLQl7MHgzYTFiLCAweDQ4fSwKLQl7MHgzYTFlLCAweDMwfSwKLQl7MHgzYTExLCAweDkwfSwKLQl7MHgzYTFmLCAweDEwfSwKLQl7MHgzMDExLCAweDIyfSwKLQl7MHgzYTAwLCAweDU4fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3YyNzIwXzkwZnBzX3NldHRpbmdzW10gPSB7Ci0JezB4MzcxOCwgMHgxMH0sCi0JezB4MzcwMiwgMHgxOH0sCi0JezB4MzczYSwgMHgzY30sCi0JezB4MzcxNSwgMHgwMX0sCi0JezB4MzcwMywgMHgxZH0sCi0JezB4MzcwNSwgMHgwYn0sCi0JezB4MzczMCwgMHgxZn0sCi0JezB4MzcwNCwgMHgzZn0sCi0JezB4M2YwNiwgMHgxZH0sCi0JezB4MzcxYywgMHgwMH0sCi0JezB4MzcxZCwgMHg4M30sCi0JezB4MzcxZSwgMHgwMH0sCi0JezB4MzcxZiwgMHhiNn0sCi0JezB4MzcwOCwgMHg2M30sCi0JezB4MzcwOSwgMHg1Mn0sCi0JezB4MzgwMCwgMHgwMX0sCi0JezB4MzgwMSwgMHg0Mn0sCi0JezB4MzgwMiwgMHgwMH0sCi0JezB4MzgwMywgMHg0MH0sCi0JezB4MzgwNCwgMHgwNn0sCi0JezB4MzgwNSwgMHg2MX0sCi0JezB4MzgwNiwgMHgwNH0sCi0JezB4MzgwNywgMHgwOH0sCi0JezB4MzgwOCwgMHgwMn0sCi0JezB4MzgwOSwgMHg4MH0sCi0JezB4MzgwYSwgMHgwMX0sCi0JezB4MzgwYiwgMHhlMH0sCi0JezB4MzgwYywgMHgwM30sCi0JezB4MzgwZCwgMHgwY30sCi0JezB4MzgwZSwgMHgwMn0sCi0JezB4MzgwZiwgMHgwMH0sCi0JezB4MzgxMCwgMHgwMH0sCi0JezB4MzgxMSwgMHgwZn0sCi0JezB4MzgxMiwgMHgwMH0sCi0JezB4MzgxMywgMHgwMn0sCi0JezB4MzgyMCwgMHg4MH0sCi0JezB4MzgyMSwgMHgwNn0sCi0JezB4MzgxNCwgMHgzMX0sCi0JezB4MzgxNSwgMHgzMX0sCi0JezB4MzYxMiwgMHgwYn0sCi0JezB4MzYxOCwgMHgwNH0sCi0JezB4M2EwOCwgMHgwMn0sCi0JezB4M2EwOSwgMHg2N30sCi0JezB4M2EwYSwgMHgwMn0sCi0JezB4M2EwYiwgMHgwMH0sCi0JezB4M2EwZCwgMHgwMH0sCi0JezB4M2EwZSwgMHgwMH0sCi0JezB4NDUyMCwgMHgwYX0sCi0JezB4NDgzNywgMHgyOX0sCi0JezB4MzAwMCwgMHhmZn0sCi0JezB4MzAwMSwgMHhmZn0sCi0JezB4MzAwMiwgMHhmMH0sCi0JezB4MzYwMCwgMHgwOH0sCi0JezB4MzYyMSwgMHhjMH0sCi0JezB4MzYzMiwgMHhkMn0sCi0JezB4MzYzMywgMHgyM30sCi0JezB4MzYzNCwgMHg1NH0sCi0JezB4M2YwMSwgMHgwY30sCi0JezB4NTAwMSwgMHhjMX0sCi0JezB4MzYxNCwgMHhmMH0sCi0JezB4MzYzMCwgMHgyZH0sCi0JezB4MzcwYiwgMHg2Mn0sCi0JezB4MzcwNiwgMHg2MX0sCi0JezB4NDAwMCwgMHgwMn0sCi0JezB4NDAwMiwgMHhjNX0sCi0JezB4NDAwNSwgMHgwOH0sCi0JezB4NDA0ZiwgMHg4NH0sCi0JezB4NDA1MSwgMHgwMH0sCi0JezB4NTAwMCwgMHhjZn0sCi0JezB4M2ExOCwgMHgwMH0sCi0JezB4M2ExOSwgMHg4MH0sCi0JezB4MzUwMywgMHgwN30sCi0JezB4NDUyMSwgMHgwMH0sCi0JezB4NTE4MywgMHhiMH0sCi0JezB4NTE4NCwgMHhiMH0sCi0JezB4NTE4NSwgMHhiMH0sCi0JezB4MzcwYywgMHgwY30sCi0JezB4MzAzNSwgMHgzMH0sCi0JezB4MzAzNiwgMHgxZX0sCi0JezB4MzAzNywgMHgyMX0sCi0JezB4MzAzZSwgMHgxOX0sCi0JezB4MzAzOCwgMHgwNn0sCi0JezB4MzAxOCwgMHgwNH0sCi0JezB4MzAwMCwgMHgwMH0sCi0JezB4MzAwMSwgMHgwMH0sCi0JezB4MzAwMiwgMHgwMH0sCi0JezB4M2EwZiwgMHg0MH0sCi0JezB4M2ExMCwgMHgzOH0sCi0JezB4M2ExYiwgMHg0OH0sCi0JezB4M2ExZSwgMHgzMH0sCi0JezB4M2ExMSwgMHg5MH0sCi0JezB4M2ExZiwgMHgxMH0sCi0JezB4MzAxMSwgMHgyMn0sCi0JezB4M2EwMCwgMHg1OH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIG92MjcyMF8xMjBmcHNfc2V0dGluZ3NbXSA9IHsKLQl7MHgzNzE4LCAweDEwfSwKLQl7MHgzNzAyLCAweDE4fSwKLQl7MHgzNzNhLCAweDNjfSwKLQl7MHgzNzE1LCAweDAxfSwKLQl7MHgzNzAzLCAweDFkfSwKLQl7MHgzNzA1LCAweDBifSwKLQl7MHgzNzMwLCAweDFmfSwKLQl7MHgzNzA0LCAweDNmfSwKLQl7MHgzZjA2LCAweDFkfSwKLQl7MHgzNzFjLCAweDAwfSwKLQl7MHgzNzFkLCAweDgzfSwKLQl7MHgzNzFlLCAweDAwfSwKLQl7MHgzNzFmLCAweGI2fSwKLQl7MHgzNzA4LCAweDYzfSwKLQl7MHgzNzA5LCAweDUyfSwKLQl7MHgzODAwLCAweDAxfSwKLQl7MHgzODAxLCAweDQyfSwKLQl7MHgzODAyLCAweDAwfSwKLQl7MHgzODAzLCAweDQwfSwKLQl7MHgzODA0LCAweDA2fSwKLQl7MHgzODA1LCAweDYxfSwKLQl7MHgzODA2LCAweDA0fSwKLQl7MHgzODA3LCAweDA4fSwKLQl7MHgzODA4LCAweDAyfSwKLQl7MHgzODA5LCAweDgwfSwKLQl7MHgzODBhLCAweDAxfSwKLQl7MHgzODBiLCAweGUwfSwKLQl7MHgzODBjLCAweDAzfSwKLQl7MHgzODBkLCAweDBjfSwKLQl7MHgzODBlLCAweDAyfSwKLQl7MHgzODBmLCAweDAwfSwKLQl7MHgzODEwLCAweDAwfSwKLQl7MHgzODExLCAweDBmfSwKLQl7MHgzODEyLCAweDAwfSwKLQl7MHgzODEzLCAweDAyfSwKLQl7MHgzODIwLCAweDgwfSwKLQl7MHgzODIxLCAweDA2fSwKLQl7MHgzODE0LCAweDMxfSwKLQl7MHgzODE1LCAweDMxfSwKLQl7MHgzNjEyLCAweDBifSwKLQl7MHgzNjE4LCAweDA0fSwKLQl7MHgzYTA4LCAweDAyfSwKLQl7MHgzYTA5LCAweDY3fSwKLQl7MHgzYTBhLCAweDAyfSwKLQl7MHgzYTBiLCAweDAwfSwKLQl7MHgzYTBkLCAweDAwfSwKLQl7MHgzYTBlLCAweDAwfSwKLQl7MHg0NTIwLCAweDBhfSwKLQl7MHg0ODM3LCAweDI5fSwKLQl7MHgzMDAwLCAweGZmfSwKLQl7MHgzMDAxLCAweGZmfSwKLQl7MHgzMDAyLCAweGYwfSwKLQl7MHgzNjAwLCAweDA4fSwKLQl7MHgzNjIxLCAweGMwfSwKLQl7MHgzNjMyLCAweGQyfSwKLQl7MHgzNjMzLCAweDIzfSwKLQl7MHgzNjM0LCAweDU0fSwKLQl7MHgzZjAxLCAweDBjfSwKLQl7MHg1MDAxLCAweGMxfSwKLQl7MHgzNjE0LCAweGYwfSwKLQl7MHgzNjMwLCAweDJkfSwKLQl7MHgzNzBiLCAweDYyfSwKLQl7MHgzNzA2LCAweDYxfSwKLQl7MHg0MDAwLCAweDAyfSwKLQl7MHg0MDAyLCAweGM1fSwKLQl7MHg0MDA1LCAweDA4fSwKLQl7MHg0MDRmLCAweDg0fSwKLQl7MHg0MDUxLCAweDAwfSwKLQl7MHg1MDAwLCAweGNmfSwKLQl7MHgzYTE4LCAweDAwfSwKLQl7MHgzYTE5LCAweDgwfSwKLQl7MHgzNTAzLCAweDA3fSwKLQl7MHg0NTIxLCAweDAwfSwKLQl7MHg1MTgzLCAweGIwfSwKLQl7MHg1MTg0LCAweGIwfSwKLQl7MHg1MTg1LCAweGIwfSwKLQl7MHgzNzBjLCAweDBjfSwKLQl7MHgzMDM1LCAweDEwfSwKLQl7MHgzMDM2LCAweDE0fSwKLQl7MHgzMDM3LCAweDIxfSwKLQl7MHgzMDNlLCAweDE5fSwKLQl7MHgzMDM4LCAweDA2fSwKLQl7MHgzMDE4LCAweDA0fSwKLQl7MHgzMDAwLCAweDAwfSwKLQl7MHgzMDAxLCAweDAwfSwKLQl7MHgzMDAyLCAweDAwfSwKLQl7MHgzYTBmLCAweDQwfSwKLQl7MHgzYTEwLCAweDM4fSwKLQl7MHgzYTFiLCAweDQ4fSwKLQl7MHgzYTFlLCAweDMwfSwKLQl7MHgzYTExLCAweDkwfSwKLQl7MHgzYTFmLCAweDEwfSwKLQl7MHgzMDExLCAweDIyfSwKLQl7MHgzYTAwLCAweDU4fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3YyNzIwX3JlY29tbWVuZF9zZXR0aW5nc1tdID0gewotCXsweDAxMDMsIDB4MDF9LAotCXsweDM3MTgsIDB4MTB9LAotCXsweDM3MDIsIDB4MjR9LAotCXsweDM3M2EsIDB4NjB9LAotCXsweDM3MTUsIDB4MDF9LAotCXsweDM3MDMsIDB4MmV9LAotCXsweDM3MDUsIDB4MTB9LAotCXsweDM3MzAsIDB4MzB9LAotCXsweDM3MDQsIDB4NjJ9LAotCXsweDNmMDYsIDB4M2F9LAotCXsweDM3MWMsIDB4MDB9LAotCXsweDM3MWQsIDB4YzR9LAotCXsweDM3MWUsIDB4MDF9LAotCXsweDM3MWYsIDB4MGR9LAotCXsweDM3MDgsIDB4NjF9LAotCXsweDM3MDksIDB4MTJ9LAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9pbmZvIG92MjcyMF9zdWJkZXZfaW5mb1tdID0gewotCXsKLQkuY29kZSAgID0gVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzFYMTAsCi0JLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKLQkuZm10ICAgID0gMSwKLQkub3JkZXIgICAgPSAwLAotCX0sCi0JLyogbW9yZSBjYW4gYmUgc3VwcG9ydGVkLCB0byBiZSBhZGRlZCBsYXRlciAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5IG92MjcyMF9pbml0X2NvbmZbXSA9IHsKLQl7Jm92MjcyMF9yZWNvbW1lbmRfc2V0dGluZ3NbMF0sCi0JQVJSQVlfU0laRShvdjI3MjBfcmVjb21tZW5kX3NldHRpbmdzKSwgMCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfQotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5IG92MjcyMF9jb25mc1tdID0gewotCXsmb3YyNzIwX3ByZXZfc2V0dGluZ3NbMF0sCi0JQVJSQVlfU0laRShvdjI3MjBfcHJldl9zZXR0aW5ncyksIDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sCi0JeyZvdjI3MjBfdmdhX3NldHRpbmdzWzBdLAotCUFSUkFZX1NJWkUob3YyNzIwX3ZnYV9zZXR0aW5ncyksIDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sCi0JeyZvdjI3MjBfNzIwX3NldHRpbmdzWzBdLAotCUFSUkFZX1NJWkUob3YyNzIwXzcyMF9zZXR0aW5ncyksIDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sCi0JeyZvdjI3MjBfNjBmcHNfc2V0dGluZ3NbMF0sCi0JQVJSQVlfU0laRShvdjI3MjBfNjBmcHNfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LAotCXsmb3YyNzIwXzkwZnBzX3NldHRpbmdzWzBdLAotCUFSUkFZX1NJWkUob3YyNzIwXzkwZnBzX3NldHRpbmdzKSwgMCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLQl7Jm92MjcyMF8xMjBmcHNfc2V0dGluZ3NbMF0sCi0JQVJSQVlfU0laRShvdjI3MjBfMTIwZnBzX3NldHRpbmdzKSwgMCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9vdXRwdXRfaW5mb190IG92MjcyMF9kaW1lbnNpb25zW10gPSB7Ci0JewotCQkueF9vdXRwdXQgPSAweDc4QywKLQkJLnlfb3V0cHV0ID0gMHg0NDQsCi0JCS5saW5lX2xlbmd0aF9wY2xrID0gMHg4NWMsCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweDQ2MCwKLQkJLnZ0X3BpeGVsX2NsayA9IDcyMDAwMDAwLAotCQkub3BfcGl4ZWxfY2xrID0gNzIwMDAwMDAsCi0JCS5iaW5uaW5nX2ZhY3RvciA9IDEsCi0JfSwKLQl7Ci0JCS54X291dHB1dCA9IDB4NTEwLAotCQkueV9vdXRwdXQgPSAweDI3OCwKLQkJLmxpbmVfbGVuZ3RoX3BjbGsgPSAweDg1YywKLQkJLmZyYW1lX2xlbmd0aF9saW5lcyA9IDB4NDYwLAotCQkudnRfcGl4ZWxfY2xrID0gNzIwMDAwMDAsCi0JCS5vcF9waXhlbF9jbGsgPSA3MjAwMDAwMCwKLQkJLmJpbm5pbmdfZmFjdG9yID0gMSwKLQl9LAotCXsKLQkJLnhfb3V0cHV0ID0gMHgyOTgsCi0JCS55X291dHB1dCA9IDB4MUYyLAotCQkubGluZV9sZW5ndGhfcGNsayA9IDB4ODVjLAotCQkuZnJhbWVfbGVuZ3RoX2xpbmVzID0gMHg0NjAsCi0JCS52dF9waXhlbF9jbGsgPSA3MjAwMDAwMCwKLQkJLm9wX3BpeGVsX2NsayA9IDcyMDAwMDAwLAotCQkuYmlubmluZ19mYWN0b3IgPSAxLAotCX0sCi0JewotCQkueF9vdXRwdXQgPSAweDI4MCwgLyogNjQwICovCi0JCS55X291dHB1dCA9IDB4MUUwLCAvKiA0ODAgKi8KLQkJLmxpbmVfbGVuZ3RoX3BjbGsgPSAweDMwQywgLyogNzgwICovCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweDIwMCwgLyogNTEyICovCi0JCS52dF9waXhlbF9jbGsgPSAyNDAwMDAwMCwKLQkJLm9wX3BpeGVsX2NsayA9IDI0MDAwMDAwLAotCQkuYmlubmluZ19mYWN0b3IgPSAxLAotCX0sCi0JewotCQkueF9vdXRwdXQgPSAweDI4MCwgLyogNjQwICovCi0JCS55X291dHB1dCA9IDB4MUUwLCAvKiA0ODAgKi8KLQkJLmxpbmVfbGVuZ3RoX3BjbGsgPSAweDMwQywgLyogNzgwICovCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweDIwMCwgLyogNTEyICovCi0JCS52dF9waXhlbF9jbGsgPSAzNjAwMDAwMCwKLQkJLm9wX3BpeGVsX2NsayA9IDM2MDAwMDAwLAotCQkuYmlubmluZ19mYWN0b3IgPSAxLAotCX0sCi0JewotCQkueF9vdXRwdXQgPSAweDI4MCwgLyogNjQwICovCi0JCS55X291dHB1dCA9IDB4MUUwLCAvKiA0ODAgKi8KLQkJLmxpbmVfbGVuZ3RoX3BjbGsgPSAweDMwQywgLyogNzgwICovCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweDIwMCwgLyogNTEyICovCi0JCS52dF9waXhlbF9jbGsgPSA0ODAwMDAwMCwKLQkJLm9wX3BpeGVsX2NsayA9IDQ4MDAwMDAwLAotCQkuYmlubmluZ19mYWN0b3IgPSAxLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3Jfb3V0cHV0X3JlZ19hZGRyX3Qgb3YyNzIwX3JlZ19hZGRyID0gewotCS54X291dHB1dCA9IDB4MzgwOCwKLQkueV9vdXRwdXQgPSAweDM4MGEsCi0JLmxpbmVfbGVuZ3RoX3BjbGsgPSAweDM4MGMsCi0JLmZyYW1lX2xlbmd0aF9saW5lcyA9IDB4MzgwZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9pZF9pbmZvX3Qgb3YyNzIwX2lkX2luZm8gPSB7Ci0JLnNlbnNvcl9pZF9yZWdfYWRkciA9IDB4MzAwQSwKLQkuc2Vuc29yX2lkID0gMHgyNzIwLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2V4cF9nYWluX2luZm9fdCBvdjI3MjBfZXhwX2dhaW5faW5mbyA9IHsKLQkuY29hcnNlX2ludF90aW1lX2FkZHIgPSAweDM1MDEsCi0JLmdsb2JhbF9nYWluX2FkZHIgPSAweDM1MDgsCi0JLnZlcnRfb2Zmc2V0ID0gNiwKLX07Ci0KLXN0YXRpYyBlbnVtIG1zbV9jYW1lcmFfdnJlZ19uYW1lX3Qgb3YyNzIwX3ZlZ19zZXFbXSA9IHsKLQlDQU1fVklPLAotCUNBTV9WQU5BLAotCUNBTV9WRElHLAotfTsKLQotc3RhdGljIGludDMyX3Qgb3YyNzIwX3dyaXRlX2V4cF9nYWluKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCQl1aW50MTZfdCBnYWluLCB1aW50MzJfdCBsaW5lKQotewotCXVpbnQzMl90IGZsX2xpbmVzLCBvZmZzZXQ7Ci0JdWludDhfdCBpbnRfdGltZVszXTsKLQlmbF9saW5lcyA9Ci0JCShzX2N0cmwtPmN1cnJfZnJhbWVfbGVuZ3RoX2xpbmVzICogc19jdHJsLT5mcHNfZGl2aWRlcikgLyBRMTA7Ci0Jb2Zmc2V0ID0gc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+dmVydF9vZmZzZXQ7Ci0JaWYgKGxpbmUgPiAoZmxfbGluZXMgLSBvZmZzZXQpKQotCQlmbF9saW5lcyA9IGxpbmUgKyBvZmZzZXQ7Ci0KLQlzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfZ3JvdXBfaG9sZF9vbihzX2N0cmwpOwotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCXNfY3RybC0+c2Vuc29yX291dHB1dF9yZWdfYWRkci0+ZnJhbWVfbGVuZ3RoX2xpbmVzLCBmbF9saW5lcywKLQkJTVNNX0NBTUVSQV9JMkNfV09SRF9EQVRBKTsKLQlpbnRfdGltZVswXSA9IGxpbmUgPj4gMTI7Ci0JaW50X3RpbWVbMV0gPSBsaW5lID4+IDQ7Ci0JaW50X3RpbWVbMl0gPSBsaW5lIDw8IDQ7Ci0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Y29hcnNlX2ludF90aW1lX2FkZHItMSwKLQkJaW50X3RpbWVbMF0sIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Y29hcnNlX2ludF90aW1lX2FkZHIsCi0JCWludF90aW1lWzFdLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCXNfY3RybC0+c2Vuc29yX2V4cF9nYWluX2luZm8tPmNvYXJzZV9pbnRfdGltZV9hZGRyKzEsCi0JCWludF90aW1lWzJdLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCXNfY3RybC0+c2Vuc29yX2V4cF9nYWluX2luZm8tPmdsb2JhbF9nYWluX2FkZHIsIGdhaW4sCi0JCU1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSk7Ci0Jc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX2dyb3VwX2hvbGRfb2ZmKHNfY3RybCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBvdjI3MjBfaTJjX2lkW10gPSB7Ci0Je1NFTlNPUl9OQU1FLCAoa2VybmVsX3Vsb25nX3QpJm92MjcyMF9zX2N0cmx9LAotCXsgfQotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG92MjcyMF9pMmNfZHJpdmVyID0gewotCS5pZF90YWJsZSA9IG92MjcyMF9pMmNfaWQsCi0JLnByb2JlICA9IG1zbV9zZW5zb3JfaTJjX3Byb2JlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gU0VOU09SX05BTUUsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50IG92MjcyMF9zZW5zb3JfaTJjX2NsaWVudCA9IHsKLQkuYWRkcl90eXBlID0gTVNNX0NBTUVSQV9JMkNfV09SRF9BRERSLAotfTsKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvdjI3MjBfZHRfbWF0Y2hbXSA9IHsKLQl7LmNvbXBhdGlibGUgPSAicWNvbSxvdjI3MjAiLCAuZGF0YSA9ICZvdjI3MjBfc19jdHJsfSwKLQl7fQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb3YyNzIwX2R0X21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb3YyNzIwX3BsYXRmb3JtX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJxY29tLG92MjcyMCIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBvdjI3MjBfZHRfbWF0Y2gsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQzMl90IG92MjcyMF9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludDMyX3QgcmMgPSAwOwotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwotCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKG92MjcyMF9kdF9tYXRjaCwgJnBkZXYtPmRldik7Ci0JcmMgPSBtc21fc2Vuc29yX3BsYXRmb3JtX3Byb2JlKHBkZXYsIG1hdGNoLT5kYXRhKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9zZW5zb3JfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlyYyA9IHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmb3YyNzIwX3BsYXRmb3JtX2RyaXZlciwKLQkJb3YyNzIwX3BsYXRmb3JtX3Byb2JlKTsKLQlpZiAoIXJjKQotCQlyZXR1cm4gcmM7Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZvdjI3MjBfaTJjX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtc21fc2Vuc29yX2V4aXRfbW9kdWxlKHZvaWQpCi17Ci0JaWYgKG92MjcyMF9zX2N0cmwucGRldikgewotCQltc21fc2Vuc29yX2ZyZWVfc2Vuc29yX2RhdGEoJm92MjcyMF9zX2N0cmwpOwotCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb3YyNzIwX3BsYXRmb3JtX2RyaXZlcik7Ci0JfSBlbHNlCi0JCWkyY19kZWxfZHJpdmVyKCZvdjI3MjBfaTJjX2RyaXZlcik7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIG92MjcyMF9zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmlvY3RsID0gbXNtX3NlbnNvcl9zdWJkZXZfaW9jdGwsCi0JLnNfcG93ZXIgPSBtc21fc2Vuc29yX3Bvd2VyLAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgb3YyNzIwX3N1YmRldl92aWRlb19vcHMgPSB7Ci0JLmVudW1fbWJ1c19mbXQgPSBtc21fc2Vuc29yX3Y0bDJfZW51bV9mbXQsCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBvdjI3MjBfc3ViZGV2X29wcyA9IHsKLQkuY29yZSA9ICZvdjI3MjBfc3ViZGV2X2NvcmVfb3BzLAotCS52aWRlbyAgPSAmb3YyNzIwX3N1YmRldl92aWRlb19vcHMsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfZm5fdCBvdjI3MjBfZnVuY190YmwgPSB7Ci0JLnNlbnNvcl9zdGFydF9zdHJlYW0gPSBtc21fc2Vuc29yX3N0YXJ0X3N0cmVhbSwKLQkuc2Vuc29yX3N0b3Bfc3RyZWFtID0gbXNtX3NlbnNvcl9zdG9wX3N0cmVhbSwKLQkuc2Vuc29yX2dyb3VwX2hvbGRfb24gPSBtc21fc2Vuc29yX2dyb3VwX2hvbGRfb24sCi0JLnNlbnNvcl9ncm91cF9ob2xkX29mZiA9IG1zbV9zZW5zb3JfZ3JvdXBfaG9sZF9vZmYsCi0JLnNlbnNvcl9zZXRfZnBzID0gbXNtX3NlbnNvcl9zZXRfZnBzLAotCS5zZW5zb3Jfd3JpdGVfZXhwX2dhaW4gPSBvdjI3MjBfd3JpdGVfZXhwX2dhaW4sCi0JLnNlbnNvcl93cml0ZV9zbmFwc2hvdF9leHBfZ2FpbiA9IG92MjcyMF93cml0ZV9leHBfZ2FpbiwKLQkuc2Vuc29yX3NldHRpbmcgPSBtc21fc2Vuc29yX3NldHRpbmcsCi0JLnNlbnNvcl9zZXRfc2Vuc29yX21vZGUgPSBtc21fc2Vuc29yX3NldF9zZW5zb3JfbW9kZSwKLQkuc2Vuc29yX21vZGVfaW5pdCA9IG1zbV9zZW5zb3JfbW9kZV9pbml0LAotCS5zZW5zb3JfZ2V0X291dHB1dF9pbmZvID0gbXNtX3NlbnNvcl9nZXRfb3V0cHV0X2luZm8sCi0JLnNlbnNvcl9jb25maWcgPSBtc21fc2Vuc29yX2NvbmZpZywKLQkuc2Vuc29yX3Bvd2VyX3VwID0gbXNtX3NlbnNvcl9wb3dlcl91cCwKLQkuc2Vuc29yX3Bvd2VyX2Rvd24gPSBtc21fc2Vuc29yX3Bvd2VyX2Rvd24sCi0JLnNlbnNvcl9hZGp1c3RfZnJhbWVfbGluZXMgPSBtc21fc2Vuc29yX2FkanVzdF9mcmFtZV9saW5lczIsCi0JLnNlbnNvcl9nZXRfY3NpX3BhcmFtcyA9IG1zbV9zZW5zb3JfZ2V0X2NzaV9wYXJhbXMsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfcmVnX3Qgb3YyNzIwX3JlZ3MgPSB7Ci0JLmRlZmF1bHRfZGF0YV90eXBlID0gTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBLAotCS5zdGFydF9zdHJlYW1fY29uZiA9IG92MjcyMF9zdGFydF9zZXR0aW5ncywKLQkuc3RhcnRfc3RyZWFtX2NvbmZfc2l6ZSA9IEFSUkFZX1NJWkUob3YyNzIwX3N0YXJ0X3NldHRpbmdzKSwKLQkuc3RvcF9zdHJlYW1fY29uZiA9IG92MjcyMF9zdG9wX3NldHRpbmdzLAotCS5zdG9wX3N0cmVhbV9jb25mX3NpemUgPSBBUlJBWV9TSVpFKG92MjcyMF9zdG9wX3NldHRpbmdzKSwKLQkuZ3JvdXBfaG9sZF9vbl9jb25mID0gb3YyNzIwX2dyb3Vwb25fc2V0dGluZ3MsCi0JLmdyb3VwX2hvbGRfb25fY29uZl9zaXplID0gQVJSQVlfU0laRShvdjI3MjBfZ3JvdXBvbl9zZXR0aW5ncyksCi0JLmdyb3VwX2hvbGRfb2ZmX2NvbmYgPSBvdjI3MjBfZ3JvdXBvZmZfc2V0dGluZ3MsCi0JLmdyb3VwX2hvbGRfb2ZmX2NvbmZfc2l6ZSA9Ci0JCUFSUkFZX1NJWkUob3YyNzIwX2dyb3Vwb2ZmX3NldHRpbmdzKSwKLQkuaW5pdF9zZXR0aW5ncyA9ICZvdjI3MjBfaW5pdF9jb25mWzBdLAotCS5pbml0X3NpemUgPSBBUlJBWV9TSVpFKG92MjcyMF9pbml0X2NvbmYpLAotCS5tb2RlX3NldHRpbmdzID0gJm92MjcyMF9jb25mc1swXSwKLQkub3V0cHV0X3NldHRpbmdzID0gJm92MjcyMF9kaW1lbnNpb25zWzBdLAotCS5udW1fY29uZiA9IEFSUkFZX1NJWkUob3YyNzIwX2NvbmZzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3Qgb3YyNzIwX3NfY3RybCA9IHsKLQkubXNtX3NlbnNvcl9yZWcgPSAmb3YyNzIwX3JlZ3MsCi0JLnNlbnNvcl9pMmNfY2xpZW50ID0gJm92MjcyMF9zZW5zb3JfaTJjX2NsaWVudCwKLQkuc2Vuc29yX2kyY19hZGRyID0gMHg2QywKLQkudnJlZ19zZXEgPSBvdjI3MjBfdmVnX3NlcSwKLQkubnVtX3ZyZWdfc2VxID0gQVJSQVlfU0laRShvdjI3MjBfdmVnX3NlcSksCi0JLnNlbnNvcl9vdXRwdXRfcmVnX2FkZHIgPSAmb3YyNzIwX3JlZ19hZGRyLAotCS5zZW5zb3JfaWRfaW5mbyA9ICZvdjI3MjBfaWRfaW5mbywKLQkuc2Vuc29yX2V4cF9nYWluX2luZm8gPSAmb3YyNzIwX2V4cF9nYWluX2luZm8sCi0JLmNhbV9tb2RlID0gTVNNX1NFTlNPUl9NT0RFX0lOVkFMSUQsCi0JLm1zbV9zZW5zb3JfbXV0ZXggPSAmb3YyNzIwX211dCwKLQkuc2Vuc29yX2kyY19kcml2ZXIgPSAmb3YyNzIwX2kyY19kcml2ZXIsCi0JLnNlbnNvcl92NGwyX3N1YmRldl9pbmZvID0gb3YyNzIwX3N1YmRldl9pbmZvLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfaW5mb19zaXplID0gQVJSQVlfU0laRShvdjI3MjBfc3ViZGV2X2luZm8pLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfb3BzID0gJm92MjcyMF9zdWJkZXZfb3BzLAotCS5mdW5jX3RibCA9ICZvdjI3MjBfZnVuY190YmwsCi0JLmNsa19yYXRlID0gTVNNX1NFTlNPUl9NQ0xLXzI0SFosCi19OwotCi1tb2R1bGVfaW5pdChtc21fc2Vuc29yX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KG1zbV9zZW5zb3JfZXhpdF9tb2R1bGUpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJPbW5pdmlzaW9uIDJNUCBCYXllciBzZW5zb3IgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvb3YyNzIwLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9vdjI3MjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0NzY2Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9vdjI3MjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG92MjcyMF9kcml2ZXI7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL292NTY0N192NGwyLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9vdjU2NDdfdjRsMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjdlNjQ4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL292NTY0N192NGwyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MzEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSAibXNtX3NlbnNvci5oIgotI2luY2x1ZGUgIm1zbS5oIgotI2RlZmluZSBTRU5TT1JfTkFNRSAib3Y1NjQ3IgotI2RlZmluZSBQTEFURk9STV9EUklWRVJfTkFNRSAibXNtX2NhbWVyYV9vdjU2NDciCi0jZGVmaW5lIG92NTY0N19vYmogb3Y1NjQ3XyMjb2JqCi0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3Qgb3Y1NjQ3X3NfY3RybDsKLQotREVGSU5FX01VVEVYKG92NTY0N19tdXQpOwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIG92NTY0N19zdGFydF9zZXR0aW5nc1tdID0gewotCXsweDQyMDIsIDB4MDB9LCAgLyogc3RyZWFtaW5nIG9uICovCi0JezB4MDEwMCwgMHgwMX0sCi0JezB4NDgwMCwgMHgwNH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIG92NTY0N19zdG9wX3NldHRpbmdzW10gPSB7Ci0JezB4NDIwMiwgMHgwZn0sICAvKiBzdHJlYW1pbmcgb2ZmKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3Y1NjQ3X2dyb3Vwb25fc2V0dGluZ3NbXSA9IHsKLQl7MHgzMjA4LCAweDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjU2NDdfZ3JvdXBvZmZfc2V0dGluZ3NbXSA9IHsKLQl7MHgzMjA4LCAweDEwfSwKLQl7MHgzMjA4LCAweGEwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3Y1NjQ3X3ByZXZfc2V0dGluZ3NbXSA9IHsKLQkvKjEyODAqOTYwIFJlZmVyZW5jZSBTZXR0aW5nIDI0TSBNQ0xLIDJsYW5lIDI4ME1icHMvbGFuZSAzMGZwcwotCWZvciBiYWNrIHRvIHByZXZpZXcqLwotCXsweDMwMzUsIDB4MjF9LAotCXsweDMwMzYsIDB4Mzd9LAotCXsweDM4MjEsIDB4MDd9LAotCXsweDM4MjAsIDB4NDF9LAotCXsweDM2MTIsIDB4MDl9LAotCXsweDM2MTgsIDB4MDB9LAotCXsweDM4MGMsIDB4MDd9LAotCXsweDM4MGQsIDB4Njh9LAotCXsweDM4MGUsIDB4MDN9LAotCXsweDM4MGYsIDB4ZDh9LAotCXsweDM4MTQsIDB4MzF9LAotCXsweDM4MTUsIDB4MzF9LAotCXsweDM3MDksIDB4NTJ9LAotCXsweDM4MDgsIDB4MDV9LAotCXsweDM4MDksIDB4MDB9LAotCXsweDM4MGEsIDB4MDN9LAotCXsweDM4MGIsIDB4YzB9LAotCXsweDM4MDAsIDB4MDB9LAotCXsweDM4MDEsIDB4MTh9LAotCXsweDM4MDIsIDB4MDB9LAotCXsweDM4MDMsIDB4MGV9LAotCXsweDM4MDQsIDB4MGF9LAotCXsweDM4MDUsIDB4Mjd9LAotCXsweDM4MDYsIDB4MDd9LAotCXsweDM4MDcsIDB4OTV9LAotCXsweDQwMDQsIDB4MDJ9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjU2NDdfc25hcF9zZXR0aW5nc1tdID0gewotCS8qMjYwOCoxOTUyIFJlZmVyZW5jZSBTZXR0aW5nIDI0TSBNQ0xLIDJsYW5lIDI4ME1icHMvbGFuZSAzMGZwcyovCi0JezB4MzAzNSwgMHgyMX0sCi0JezB4MzAzNiwgMHg0Zn0sCi0JezB4MzgyMSwgMHgwNn0sCi0JezB4MzgyMCwgMHgwMH0sCi0JezB4MzYxMiwgMHgwYn0sCi0JezB4MzYxOCwgMHgwNH0sCi0JezB4MzgwYywgMHgwYX0sCi0JezB4MzgwZCwgMHg4Y30sCi0JezB4MzgwZSwgMHgwN30sCi0JezB4MzgwZiwgMHhiMH0sCi0JezB4MzgxNCwgMHgxMX0sCi0JezB4MzgxNSwgMHgxMX0sCi0JezB4MzcwOSwgMHgxMn0sCi0JezB4MzgwOCwgMHgwYX0sCi0JezB4MzgwOSwgMHgzMH0sCi0JezB4MzgwYSwgMHgwN30sCi0JezB4MzgwYiwgMHhhMH0sCi0JezB4MzgwMCwgMHgwMH0sCi0JezB4MzgwMSwgMHgwNH0sCi0JezB4MzgwMiwgMHgwMH0sCi0JezB4MzgwMywgMHgwMH0sCi0JezB4MzgwNCwgMHgwYX0sCi0JezB4MzgwNSwgMHgzYn0sCi0JezB4MzgwNiwgMHgwN30sCi0JezB4MzgwNywgMHhhM30sCi0JezB4NDAwNCwgMHgwNH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIG92NTY0N192aWRlb182MGZwc19zZXR0aW5nc1tdID0gewotCXsweDMwMzUsIDB4MjF9LAotCXsweDMwMzYsIDB4Mzh9LAotCXsweDM4MjEsIDB4MDd9LAotCXsweDM4MjAsIDB4NDF9LAotCXsweDM2MTIsIDB4NDl9LAotCXsweDM2MTgsIDB4MDB9LAotCXsweDM4MGMsIDB4MDd9LAotCXsweDM4MGQsIDB4MzB9LAotCXsweDM4MGUsIDB4MDF9LAotCXsweDM4MGYsIDB4Zjh9LAotCXsweDM4MTQsIDB4NzF9LAotCXsweDM4MTUsIDB4NzF9LAotCXsweDM3MDksIDB4NTJ9LAotCXsweDM4MDgsIDB4MDJ9LAotCXsweDM4MDksIDB4ODB9LAotCXsweDM4MGEsIDB4MDF9LAotCXsweDM4MGIsIDB4ZTB9LAotCXsweDM4MDAsIDB4MDB9LAotCXsweDM4MDEsIDB4MTB9LAotCXsweDM4MDIsIDB4MDB9LAotCXsweDM4MDMsIDB4MDB9LAotCXsweDM4MDQsIDB4MGF9LAotCXsweDM4MDUsIDB4MmZ9LAotCXsweDM4MDYsIDB4MDd9LAotCXsweDM4MDcsIDB4OWZ9LAotCXsweDQwMDQsIDB4MDJ9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjU2NDdfdmlkZW9fOTBmcHNfc2V0dGluZ3NbXSA9IHsKLQl7MHgzMDM1LCAweDExfSwKLQl7MHgzMDM2LCAweDJhfSwKLQl7MHgzODIxLCAweDA3fSwKLQl7MHgzODIwLCAweDQxfSwKLQl7MHgzNjEyLCAweDQ5fSwKLQl7MHgzNjE4LCAweDAwfSwKLQl7MHgzODBjLCAweDA3fSwKLQl7MHgzODBkLCAweDMwfSwKLQl7MHgzODBlLCAweDAxfSwKLQl7MHgzODBmLCAweGY4fSwKLQl7MHgzODE0LCAweDcxfSwKLQl7MHgzODE1LCAweDcxfSwKLQl7MHgzNzA5LCAweDUyfSwKLQl7MHgzODA4LCAweDAyfSwKLQl7MHgzODA5LCAweDgwfSwKLQl7MHgzODBhLCAweDAxfSwKLQl7MHgzODBiLCAweGUwfSwKLQl7MHgzODAwLCAweDAwfSwKLQl7MHgzODAxLCAweDEwfSwKLQl7MHgzODAyLCAweDAwfSwKLQl7MHgzODAzLCAweDAwfSwKLQl7MHgzODA0LCAweDBhfSwKLQl7MHgzODA1LCAweDJmfSwKLQl7MHgzODA2LCAweDA3fSwKLQl7MHgzODA3LCAweDlmfSwKLQl7MHg0MDA0LCAweDAyfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3Y1NjQ3X3pzbF9zZXR0aW5nc1tdID0gewotCXsweDMwMzUsIDB4MjF9LAotCXsweDMwMzYsIDB4NGZ9LAotCXsweDM4MjEsIDB4MDZ9LAotCXsweDM4MjAsIDB4MDB9LAotCXsweDM2MTIsIDB4MGJ9LAotCXsweDM2MTgsIDB4MDR9LAotCXsweDM4MGMsIDB4MGF9LAotCXsweDM4MGQsIDB4OGN9LAotCXsweDM4MGUsIDB4MDd9LAotCXsweDM4MGYsIDB4YjB9LAotCXsweDM4MTQsIDB4MTF9LAotCXsweDM4MTUsIDB4MTF9LAotCXsweDM3MDksIDB4MTJ9LAotCXsweDM4MDgsIDB4MGF9LAotCXsweDM4MDksIDB4MzB9LAotCXsweDM4MGEsIDB4MDd9LAotCXsweDM4MGIsIDB4YTB9LAotCXsweDM4MDAsIDB4MDB9LAotCXsweDM4MDEsIDB4MDR9LAotCXsweDM4MDIsIDB4MDB9LAotCXsweDM4MDMsIDB4MDB9LAotCXsweDM4MDQsIDB4MGF9LAotCXsweDM4MDUsIDB4M2J9LAotCXsweDM4MDYsIDB4MDd9LAotCXsweDM4MDcsIDB4YTN9LAotCXsweDQwMDQsIDB4MDR9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjU2NDdfcmVjb21tZW5kX3NldHRpbmdzW10gPSB7Ci0JezB4MzAzNSwgMHgxMX0sCi0JezB4MzAzYywgMHgxMX0sCi0JezB4MzcwYywgMHgwM30sCi0JezB4NTAwMCwgMHgwNn0sCi0JezB4NTAwMywgMHgwOH0sCi0JezB4NWEwMCwgMHgwOH0sCi0JezB4MzAwMCwgMHhmZn0sCi0JezB4MzAwMSwgMHhmZn0sCi0JezB4MzAwMiwgMHhmZn0sCi0JezB4MzAxZCwgMHhmMH0sCi0JezB4M2ExOCwgMHgwMH0sCi0JezB4M2ExOSwgMHhmOH0sCi0JezB4M2MwMSwgMHg4MH0sCi0JezB4M2IwNywgMHgwY30sCi0JezB4MzcwOCwgMHg2NH0sCi0JezB4MzYzMCwgMHgyZX0sCi0JezB4MzYzMiwgMHhlMn0sCi0JezB4MzYzMywgMHgyM30sCi0JezB4MzYzNCwgMHg0NH0sCi0JezB4MzYyMCwgMHg2NH0sCi0JezB4MzYyMSwgMHhlMH0sCi0JezB4MzYwMCwgMHgzN30sCi0JezB4MzcwNCwgMHhhMH0sCi0JezB4MzcwMywgMHg1YX0sCi0JezB4MzcxNSwgMHg3OH0sCi0JezB4MzcxNywgMHgwMX0sCi0JezB4MzczMSwgMHgwMn0sCi0JezB4MzcwYiwgMHg2MH0sCi0JezB4MzcwNSwgMHgxYX0sCi0JezB4M2YwNSwgMHgwMn0sCi0JezB4M2YwNiwgMHgxMH0sCi0JezB4M2YwMSwgMHgwYX0sCi0JezB4M2EwOCwgMHgwMX0sCi0JezB4M2EwZiwgMHg1OH0sCi0JezB4M2ExMCwgMHg1MH0sCi0JezB4M2ExYiwgMHg1OH0sCi0JezB4M2ExZSwgMHg1MH0sCi0JezB4M2ExMSwgMHg2MH0sCi0JezB4M2ExZiwgMHgyOH0sCi0JezB4NDAwMSwgMHgwMn0sCi0JezB4NDAwMCwgMHgwOX0sCi0JezB4MzAwMCwgMHgwMH0sCi0JezB4MzAwMSwgMHgwMH0sCi0JezB4MzAwMiwgMHgwMH0sCi0JezB4MzAxNywgMHhlMH0sCi0JezB4MzAxYywgMHhmY30sCi0JezB4MzYzNiwgMHgwNn0sCi0JezB4MzAxNiwgMHgwOH0sCi0JezB4MzgyNywgMHhlY30sCi0JezB4MzAxOCwgMHg0NH0sCi0JezB4MzAzNSwgMHgyMX0sCi0JezB4MzEwNiwgMHhmNX0sCi0JezB4MzAzNCwgMHgxOH0sCi0JezB4MzAxYywgMHhmOH0sCi0JLypsZW5zIHNldHRpbmcqLwotCXsweDUwMDAsIDB4ODZ9LAotCXsweDU4MDAsIDB4MTF9LAotCXsweDU4MDEsIDB4MGN9LAotCXsweDU4MDIsIDB4MGF9LAotCXsweDU4MDMsIDB4MGJ9LAotCXsweDU4MDQsIDB4MGR9LAotCXsweDU4MDUsIDB4MTN9LAotCXsweDU4MDYsIDB4MDl9LAotCXsweDU4MDcsIDB4MDV9LAotCXsweDU4MDgsIDB4MDN9LAotCXsweDU4MDksIDB4MDN9LAotCXsweDU4MGEsIDB4MDZ9LAotCXsweDU4MGIsIDB4MDh9LAotCXsweDU4MGMsIDB4MDV9LAotCXsweDU4MGQsIDB4MDF9LAotCXsweDU4MGUsIDB4MDB9LAotCXsweDU4MGYsIDB4MDB9LAotCXsweDU4MTAsIDB4MDJ9LAotCXsweDU4MTEsIDB4MDZ9LAotCXsweDU4MTIsIDB4MDV9LAotCXsweDU4MTMsIDB4MDF9LAotCXsweDU4MTQsIDB4MDB9LAotCXsweDU4MTUsIDB4MDB9LAotCXsweDU4MTYsIDB4MDJ9LAotCXsweDU4MTcsIDB4MDZ9LAotCXsweDU4MTgsIDB4MDl9LAotCXsweDU4MTksIDB4MDV9LAotCXsweDU4MWEsIDB4MDR9LAotCXsweDU4MWIsIDB4MDR9LAotCXsweDU4MWMsIDB4MDZ9LAotCXsweDU4MWQsIDB4MDl9LAotCXsweDU4MWUsIDB4MTF9LAotCXsweDU4MWYsIDB4MGN9LAotCXsweDU4MjAsIDB4MGJ9LAotCXsweDU4MjEsIDB4MGJ9LAotCXsweDU4MjIsIDB4MGR9LAotCXsweDU4MjMsIDB4MTN9LAotCXsweDU4MjQsIDB4MjJ9LAotCXsweDU4MjUsIDB4MjZ9LAotCXsweDU4MjYsIDB4MjZ9LAotCXsweDU4MjcsIDB4MjR9LAotCXsweDU4MjgsIDB4MjR9LAotCXsweDU4MjksIDB4MjR9LAotCXsweDU4MmEsIDB4MjJ9LAotCXsweDU4MmIsIDB4MjB9LAotCXsweDU4MmMsIDB4MjJ9LAotCXsweDU4MmQsIDB4MjZ9LAotCXsweDU4MmUsIDB4MjJ9LAotCXsweDU4MmYsIDB4MjJ9LAotCXsweDU4MzAsIDB4NDJ9LAotCXsweDU4MzEsIDB4MjJ9LAotCXsweDU4MzIsIDB4MDJ9LAotCXsweDU4MzMsIDB4MjR9LAotCXsweDU4MzQsIDB4MjJ9LAotCXsweDU4MzUsIDB4MjJ9LAotCXsweDU4MzYsIDB4MjJ9LAotCXsweDU4MzcsIDB4MjZ9LAotCXsweDU4MzgsIDB4NDJ9LAotCXsweDU4MzksIDB4MjZ9LAotCXsweDU4M2EsIDB4MDZ9LAotCXsweDU4M2IsIDB4MjZ9LAotCXsweDU4M2MsIDB4MjR9LAotCXsweDU4M2QsIDB4Y2V9LAotCS8qIG1hbnVhbCBBV0IsbWFudWFsIEFFLGNsb3NlIExlbmMsb3BlbiBXQkMqLwotCXsweDM1MDMsIDB4MDN9LCAvKm1hbnVhbCBBRSovCi0JezB4MzUwMSwgMHgxMH0sCi0JezB4MzUwMiwgMHg4MH0sCi0JezB4MzUwYSwgMHgwMH0sCi0JezB4MzUwYiwgMHg3Zn0sCi0JezB4NTAwMSwgMHgwMX0sIC8qbWFudWFsIEFXQiovCi0JezB4NTE4MCwgMHgwOH0sCi0JezB4NTE4NiwgMHgwNH0sCi0JezB4NTE4NywgMHgwMH0sCi0JezB4NTE4OCwgMHgwNH0sCi0JezB4NTE4OSwgMHgwMH0sCi0JezB4NTE4YSwgMHgwNH0sCi0JezB4NTE4YiwgMHgwMH0sCi0JezB4NTAwMCwgMHgwNn0sIC8qTm8gbGVuYyxXQkMgb24qLwotCXsweDQwMDUsIDB4MTh9LAotCXsweDQwNTEsIDB4OGZ9LAotfTsKLQotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgb3Y1NjQ3X2luaXRfY29uZltdID0gewotCXsmb3Y1NjQ3X3JlY29tbWVuZF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKG92NTY0N19yZWNvbW1lbmRfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9Ci19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgb3Y1NjQ3X2NvbmZzW10gPSB7Ci0JeyZvdjU2NDdfc25hcF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKG92NTY0N19zbmFwX3NldHRpbmdzKSwgMCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLQl7Jm92NTY0N19wcmV2X3NldHRpbmdzWzBdLAotCUFSUkFZX1NJWkUob3Y1NjQ3X3ByZXZfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LAotCXsmb3Y1NjQ3X3ZpZGVvXzYwZnBzX3NldHRpbmdzWzBdLAotCUFSUkFZX1NJWkUob3Y1NjQ3X3ZpZGVvXzYwZnBzX3NldHRpbmdzKSwgMCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLQl7Jm92NTY0N192aWRlb185MGZwc19zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKG92NTY0N192aWRlb185MGZwc19zZXR0aW5ncyksIDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sCi0JeyZvdjU2NDdfenNsX3NldHRpbmdzWzBdLAotCUFSUkFZX1NJWkUob3Y1NjQ3X3pzbF9zZXR0aW5ncyksIDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2luZm8gb3Y1NjQ3X3N1YmRldl9pbmZvW10gPSB7Ci0JewotCQkuY29kZSAgID0gVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzFYMTAsCi0JCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCi0JCS5mbXQgICAgPSAxLAotCQkub3JkZXIgICAgPSAwLAotCX0sCi0JLyogbW9yZSBjYW4gYmUgc3VwcG9ydGVkLCB0byBiZSBhZGRlZCBsYXRlciAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX291dHB1dF9pbmZvX3Qgb3Y1NjQ3X2RpbWVuc2lvbnNbXSA9IHsKLQl7IC8qIEZvciBTTkFQU0hPVCAqLwotCQkueF9vdXRwdXQgPSAweEEzMCwgIC8qMjYwOCovICAvKmZvciA1TXAqLwotCQkueV9vdXRwdXQgPSAweDdBMCwgICAvKjE5NTIqLwotCQkubGluZV9sZW5ndGhfcGNsayA9IDB4QThDLAotCQkuZnJhbWVfbGVuZ3RoX2xpbmVzID0gMHg3QjAsCi0JCS52dF9waXhlbF9jbGsgPSA3OTcwNDAwMCwKLQkJLm9wX3BpeGVsX2NsayA9IDE1OTQwODAwMCwKLQkJLmJpbm5pbmdfZmFjdG9yID0gMHgwLAotCX0sCi0JeyAvKiBGb3IgUFJFVklFVyAqLwotCQkueF9vdXRwdXQgPSAweDUwMCwgLyoxMjgwKi8KLQkJLnlfb3V0cHV0ID0gMHgzQzAsIC8qOTYwKi8KLQkJLmxpbmVfbGVuZ3RoX3BjbGsgPSAweDc2OCwKLQkJLmZyYW1lX2xlbmd0aF9saW5lcyA9IDB4M0Q4LAotCQkudnRfcGl4ZWxfY2xrID0gNTU5Njk5MjAsCi0JCS5vcF9waXhlbF9jbGsgPSAxNTk0MDgwMDAsCi0JCS5iaW5uaW5nX2ZhY3RvciA9IDB4MCwKLQl9LAotCXsgLyogRm9yIDYwZnBzICovCi0JCS54X291dHB1dCA9IDB4MjgwLCAgLyo2NDAqLwotCQkueV9vdXRwdXQgPSAweDFFMCwgICAvKjQ4MCovCi0JCS5saW5lX2xlbmd0aF9wY2xrID0gMHg3M0MsCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweDFGOCwKLQkJLnZ0X3BpeGVsX2NsayA9IDU2MDA0NDgwLAotCQkub3BfcGl4ZWxfY2xrID0gMTU5NDA4MDAwLAotCQkuYmlubmluZ19mYWN0b3IgPSAweDAsCi0JfSwKLQl7IC8qIEZvciA5MGZwcyAqLwotCQkueF9vdXRwdXQgPSAweDI4MCwgIC8qNjQwKi8KLQkJLnlfb3V0cHV0ID0gMHgxRTAsICAgLyo0ODAqLwotCQkubGluZV9sZW5ndGhfcGNsayA9IDB4NzNDLAotCQkuZnJhbWVfbGVuZ3RoX2xpbmVzID0gMHgxRjgsCi0JCS52dF9waXhlbF9jbGsgPSA1NjAwNDQ4MCwKLQkJLm9wX3BpeGVsX2NsayA9IDE1OTQwODAwMCwKLQkJLmJpbm5pbmdfZmFjdG9yID0gMHgwLAotCX0sCi0JeyAvKiBGb3IgWlNMICovCi0JCS54X291dHB1dCA9IDB4QTMwLCAgLyoyNjA4Ki8gIC8qZm9yIDVNcCovCi0JCS55X291dHB1dCA9IDB4N0EwLCAgIC8qMTk1MiovCi0JCS5saW5lX2xlbmd0aF9wY2xrID0gMHhBOEMsCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweDdCMCwKLQkJLnZ0X3BpeGVsX2NsayA9IDc5NzA0MDAwLAotCQkub3BfcGl4ZWxfY2xrID0gMTU5NDA4MDAwLAotCQkuYmlubmluZ19mYWN0b3IgPSAweDAsCi0JfSwKLQotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX291dHB1dF9yZWdfYWRkcl90IG92NTY0N19yZWdfYWRkciA9IHsKLQkueF9vdXRwdXQgPSAweDM4MDgsCi0JLnlfb3V0cHV0ID0gMHgzODBBLAotCS5saW5lX2xlbmd0aF9wY2xrID0gMHgzODBDLAotCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweDM4MEUsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfaWRfaW5mb190IG92NTY0N19pZF9pbmZvID0gewotCS5zZW5zb3JfaWRfcmVnX2FkZHIgPSAweDMwMGEsCi0JLnNlbnNvcl9pZCA9IDB4NTY0NywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9leHBfZ2Fpbl9pbmZvX3Qgb3Y1NjQ3X2V4cF9nYWluX2luZm8gPSB7Ci0JLmNvYXJzZV9pbnRfdGltZV9hZGRyID0gMHgzNTAwLAotCS5nbG9iYWxfZ2Fpbl9hZGRyID0gMHgzNTBBLAotCS52ZXJ0X29mZnNldCA9IDQsCi19OwotCi12b2lkIG92NTY0N19zZW5zb3JfcmVzZXRfc3RyZWFtKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsKQotewotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKAotCQlzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkweDEwMywgMHgxLAotCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotfQotCi1zdGF0aWMgaW50MzJfdCBvdjU2NDdfd3JpdGVfcGljdF9leHBfZ2FpbihzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwKLQkJdWludDE2X3QgZ2FpbiwgdWludDMyX3QgbGluZSkKLXsKLQotCXN0YXRpYyB1aW50MTZfdCBtYXhfbGluZSA9IDE5NjQ7Ci0JdWludDhfdCBnYWluX2xzYiwgZ2Fpbl9oc2I7Ci0JdTggaW50Z190aW1lX2hzYiwgaW50Z190aW1lX21zYiwgaW50Z190aW1lX2xzYjsKLQotCWdhaW5fbHNiID0gKHVpbnQ4X3QpIChnYWluKTsKLQlnYWluX2hzYiA9ICh1aW50OF90KSgoZ2FpbiAmIDB4MzAwKT4+OCk7Ci0KLQlDREJHKEtFUk5fRVJSICJzbmFwc2hvdCBleHBvc3VyZSBzZXRpbmcgMHgleCwgMHgleCwgJWQiCi0JCSwgZ2FpbiwgbGluZSwgbGluZSk7Ci0Jc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX2dyb3VwX2hvbGRfb24oc19jdHJsKTsKLQlpZiAobGluZSA+IDE5NjQpIHsKLQkJbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCXNfY3RybC0+c2Vuc29yX291dHB1dF9yZWdfYWRkci0+ZnJhbWVfbGVuZ3RoX2xpbmVzLAotCQkJKHVpbnQ4X3QpKChsaW5lKzQpID4+IDgpLAotCQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQotCQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkJc19jdHJsLT5zZW5zb3Jfb3V0cHV0X3JlZ19hZGRyLT5mcmFtZV9sZW5ndGhfbGluZXMgKyAxLAotCQkJKHVpbnQ4X3QpKChsaW5lKzQpICYgMHgwMEZGKSwKLQkJCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JCW1heF9saW5lID0gbGluZSArIDQ7Ci0JfSBlbHNlIGlmIChtYXhfbGluZSA+IDE5NjgpIHsKLQkJbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCXNfY3RybC0+c2Vuc29yX291dHB1dF9yZWdfYWRkci0+ZnJhbWVfbGVuZ3RoX2xpbmVzLAotCQkJKHVpbnQ4X3QpKDE5NjggPj4gOCksCi0JCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCi0JCSBtc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkJc19jdHJsLT5zZW5zb3Jfb3V0cHV0X3JlZ19hZGRyLT5mcmFtZV9sZW5ndGhfbGluZXMgKyAxLAotCQkJKHVpbnQ4X3QpKDE5NjggJiAweDAwRkYpLAotCQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQkJCW1heF9saW5lID0gMTk2ODsKLQl9Ci0KLQotCWxpbmUgPSBsaW5lPDw0OwotCS8qIG92NTY0NyBuZWVkIHRoaXMgb3BlcmF0aW9uICovCi0JaW50Z190aW1lX2hzYiA9ICh1OCkobGluZT4+MTYpOwotCWludGdfdGltZV9tc2IgPSAodTgpICgobGluZSAmIDB4RkYwMCkgPj4gOCk7Ci0JaW50Z190aW1lX2xzYiA9ICh1OCkgKGxpbmUgJiAweDAwRkYpOwotCi0JLyogRklYTUUgZm9yIEJMQyB0cmlnZ2VyICovCi0JLyogQ29hcnNlIEludGVncmF0aW9uIFRpbWUgKi8KLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT5jb2Fyc2VfaW50X3RpbWVfYWRkciwKLQkJaW50Z190aW1lX2hzYiwKLQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCXNfY3RybC0+c2Vuc29yX2V4cF9nYWluX2luZm8tPmNvYXJzZV9pbnRfdGltZV9hZGRyICsgMSwKLQkJaW50Z190aW1lX21zYiwKLQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCXNfY3RybC0+c2Vuc29yX2V4cF9nYWluX2luZm8tPmNvYXJzZV9pbnRfdGltZV9hZGRyICsgMiwKLQkJaW50Z190aW1lX2xzYiwKLQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQotCS8qIGdhaW4gKi8KLQotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCXNfY3RybC0+c2Vuc29yX2V4cF9nYWluX2luZm8tPmdsb2JhbF9nYWluX2FkZHIsCi0JCWdhaW5faHNiLAotCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCi0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Z2xvYmFsX2dhaW5fYWRkciArIDEsCi0JCWdhaW5fbHNiXjB4MSwKLQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQotCS8qIENvYXJzZSBJbnRlZ3JhdGlvbiBUaW1lICovCi0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Y29hcnNlX2ludF90aW1lX2FkZHIsCi0JCWludGdfdGltZV9oc2IsCi0JCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0KLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT5jb2Fyc2VfaW50X3RpbWVfYWRkciArIDEsCi0JCWludGdfdGltZV9tc2IsCi0JCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0KLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT5jb2Fyc2VfaW50X3RpbWVfYWRkciArIDIsCi0JCWludGdfdGltZV9sc2IsCi0JCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0KLQkvKiBnYWluICovCi0KLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT5nbG9iYWxfZ2Fpbl9hZGRyLAotCQlnYWluX2hzYiwKLQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCXNfY3RybC0+c2Vuc29yX2V4cF9nYWluX2luZm8tPmdsb2JhbF9nYWluX2FkZHIgKyAxLAotCQlnYWluX2xzYiwKLQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQotCi0Jc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX2dyb3VwX2hvbGRfb2ZmKHNfY3RybCk7Ci0JcmV0dXJuIDA7Ci0KLX0KLQotCi1zdGF0aWMgaW50MzJfdCBvdjU2NDdfd3JpdGVfcHJldl9leHBfZ2FpbihzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwKLQkJCQkJCXVpbnQxNl90IGdhaW4sIHVpbnQzMl90IGxpbmUpCi17Ci0JdTggaW50Z190aW1lX2hzYiwgaW50Z190aW1lX21zYiwgaW50Z190aW1lX2xzYjsKLQl1aW50OF90IGdhaW5fbHNiLCBnYWluX2hzYjsKLQl1aW50MzJfdCBmbF9saW5lcyA9IHNfY3RybC0+Y3Vycl9mcmFtZV9sZW5ndGhfbGluZXM7Ci0JdWludDhfdCBvZmZzZXQgPSBzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT52ZXJ0X29mZnNldDsKLQotCUNEQkcoS0VSTl9FUlIgInByZXZpZXcgZXhwb3N1cmUgc2V0dGluZyAweCV4LCAweCV4LCAlZCIsCi0JCSBnYWluLCBsaW5lLCBsaW5lKTsKLQotCWdhaW5fbHNiID0gKHVpbnQ4X3QpIChnYWluKTsKLQlnYWluX2hzYiA9ICh1aW50OF90KSgoZ2FpbiAmIDB4MzAwKT4+OCk7Ci0KLQlmbF9saW5lcyA9IChmbF9saW5lcyAqIHNfY3RybC0+ZnBzX2RpdmlkZXIpIC8gUTEwOwotCi0Jc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX2dyb3VwX2hvbGRfb24oc19jdHJsKTsKLQotCS8qIGFkanVzdCBmcmFtZSByYXRlICovCi0JaWYgKChzX2N0cmwtPmN1cnJfcmVzIDwgTVNNX1NFTlNPUl9SRVNfMikgJiYKLQkJKGxpbmUgPiAoZmxfbGluZXMgLSBvZmZzZXQpKSkKLQkJZmxfbGluZXMgPSBsaW5lICsgb2Zmc2V0OwotCi0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3Jfb3V0cHV0X3JlZ19hZGRyLT5mcmFtZV9sZW5ndGhfbGluZXMsCi0JCSh1aW50OF90KShmbF9saW5lcyA+PiA4KSwKLQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCXNfY3RybC0+c2Vuc29yX291dHB1dF9yZWdfYWRkci0+ZnJhbWVfbGVuZ3RoX2xpbmVzICsgMSwKLQkJKHVpbnQ4X3QpKGZsX2xpbmVzICYgMHgwMEZGKSwKLQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQotCWxpbmUgPSBsaW5lPDw0OwotCS8qIG92NTY0NyBuZWVkIHRoaXMgb3BlcmF0aW9uICovCi0JaW50Z190aW1lX2hzYiA9ICh1OCkobGluZT4+MTYpOwotCWludGdfdGltZV9tc2IgPSAodTgpICgobGluZSAmIDB4RkYwMCkgPj4gOCk7Ci0JaW50Z190aW1lX2xzYiA9ICh1OCkgKGxpbmUgJiAweDAwRkYpOwotCi0KLQkvKiBDb2Fyc2UgSW50ZWdyYXRpb24gVGltZSAqLwotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCXNfY3RybC0+c2Vuc29yX2V4cF9nYWluX2luZm8tPmNvYXJzZV9pbnRfdGltZV9hZGRyLAotCQlpbnRnX3RpbWVfaHNiLAotCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCi0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Y29hcnNlX2ludF90aW1lX2FkZHIgKyAxLAotCQlpbnRnX3RpbWVfbXNiLAotCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCi0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Y29hcnNlX2ludF90aW1lX2FkZHIgKyAyLAotCQlpbnRnX3RpbWVfbHNiLAotCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCi0JLyogZ2FpbiAqLwotCi0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Z2xvYmFsX2dhaW5fYWRkciwKLQkJZ2Fpbl9oc2IsCi0JCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0KLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT5nbG9iYWxfZ2Fpbl9hZGRyICsgMSwKLQkJZ2Fpbl9sc2IsCi0JCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0KLQlzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfZ3JvdXBfaG9sZF9vZmYoc19jdHJsKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgb3Y1NjQ3X2kyY19pZFtdID0gewotCXtTRU5TT1JfTkFNRSwgKGtlcm5lbF91bG9uZ190KSZvdjU2NDdfc19jdHJsfSwKLQl7IH0KLX07Ci1pbnQzMl90IG92NTY0N19zZW5zb3JfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybDsKLQotCXJjID0gbXNtX3NlbnNvcl9pMmNfcHJvYmUoY2xpZW50LCBpZCk7Ci0KLQlpZiAoY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IE5VTEwgc2Vuc29yIGRhdGFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0Jc19jdHJsID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG92NTY0N19pMmNfZHJpdmVyID0gewotCS5pZF90YWJsZSA9IG92NTY0N19pMmNfaWQsCi0JLnByb2JlICA9IG92NTY0N19zZW5zb3JfaTJjX3Byb2JlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gU0VOU09SX05BTUUsCi0JfSwKLX07Ci0KLQotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCBvdjU2NDdfc2Vuc29yX2kyY19jbGllbnQgPSB7Ci0JLmFkZHJfdHlwZSA9IE1TTV9DQU1FUkFfSTJDX1dPUkRfQUREUiwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9zZW5zb3JfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm92NTY0N19pMmNfZHJpdmVyKTsKLX0KLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBvdjU2NDdfc3ViZGV2X2NvcmVfb3BzID0gewotCS5pb2N0bCA9IG1zbV9zZW5zb3Jfc3ViZGV2X2lvY3RsLAotCS5zX3Bvd2VyID0gbXNtX3NlbnNvcl9wb3dlciwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG92NTY0N19zdWJkZXZfdmlkZW9fb3BzID0gewotCS5lbnVtX21idXNfZm10ID0gbXNtX3NlbnNvcl92NGwyX2VudW1fZm10LAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgb3Y1NjQ3X3N1YmRldl9vcHMgPSB7Ci0JLmNvcmUgPSAmb3Y1NjQ3X3N1YmRldl9jb3JlX29wcywKLQkudmlkZW8gID0gJm92NTY0N19zdWJkZXZfdmlkZW9fb3BzLAotfTsKLQotaW50MzJfdCBvdjU2NDdfc2Vuc29yX3Bvd2VyX2Rvd24oc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwpCi17Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmluZm8gPSBOVUxMOwotCXVuc2lnbmVkIHNob3J0IHJkYXRhOwotCWludCByYzsKLQotCWluZm8gPSBzX2N0cmwtPnNlbnNvcmRhdGE7Ci0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJMHg0MjAyLCAweGYsCi0JCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JbXNsZWVwKDIwKTsKLQlyYyA9IG1zbV9jYW1lcmFfaTJjX3JlYWQoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwgMHgzMDE4LAotCQkJJnJkYXRhLCBNU01fQ0FNRVJBX0kyQ19XT1JEX0RBVEEpOwotCUNEQkcoIm92NTY0N19zZW5zb3JfcG93ZXJfZG93bjogJWRcbiIsIHJjKTsKLQlyZGF0YSB8PSAweDE4OwotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCTB4MzAxOCwgcmRhdGEsCi0JCU1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSk7Ci0JbXNsZWVwKDIwKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoaW5mby0+c2Vuc29yX3B3ZCwgMSk7Ci0JdXNsZWVwX3JhbmdlKDUwMDAsIDUxMDApOwotCW1zbV9zZW5zb3JfcG93ZXJfZG93bihzX2N0cmwpOwotCXJldHVybiAwOwotfQotCi1pbnQzMl90IG92NTY0N19zZW5zb3JfcG93ZXJfdXAoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmluZm8gPSBOVUxMOwotCi0JaW5mbyA9IHNfY3RybC0+c2Vuc29yZGF0YTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoaW5mby0+c2Vuc29yX3B3ZCwgMSk7Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGluZm8tPnNlbnNvcl9yZXNldCwgMCk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7Ci0JcmMgPSBtc21fc2Vuc29yX3Bvd2VyX3VwKHNfY3RybCk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCIlczogbXNtX3NlbnNvcl9wb3dlcl91cCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIHR1cm4gb24gbGRvIGFuZCB2cmVnICovCi0KLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoaW5mby0+c2Vuc29yX3B3ZCwgMCk7Ci0JbXNsZWVwKDIwKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoaW5mby0+c2Vuc29yX3Jlc2V0LCAxKTsKLQltc2xlZXAoMjUpOwotCi0JcmV0dXJuIHJjOwotCi19Ci0KLXN0YXRpYyBpbnQzMl90IHZmZV9jbGsgPSAyNjY2NjcwMDA7Ci0KLXN0YXRpYyB2b2lkIG92NTY0N19zdG9wX3N0cmVhbShzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCkKLXsKLQltc21fY2FtZXJhX2kyY193cml0ZV90YmwoCi0JCXNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCXNfY3RybC0+bXNtX3NlbnNvcl9yZWctPnN0b3Bfc3RyZWFtX2NvbmYsCi0JCXNfY3RybC0+bXNtX3NlbnNvcl9yZWctPnN0b3Bfc3RyZWFtX2NvbmZfc2l6ZSwKLQkJc19jdHJsLT5tc21fc2Vuc29yX3JlZy0+ZGVmYXVsdF9kYXRhX3R5cGUpOwotCi0JaWYgKHNfY3RybC0+Y3Vycl9yZXMgPT0gTVNNX1NFTlNPUl9SRVNfRlVMTCkKLQkJbXNsZWVwKDY2KTsKLQllbHNlCi0JCW1zbGVlcCgyNjYpOwotCi0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoCi0JCQlzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkJMHg0ODAwLCAweDI1LAotCQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLX0KLQotaW50MzJfdCBvdjU2NDdfc2Vuc29yX3NldHRpbmcoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JCQlpbnQgdXBkYXRlX3R5cGUsIGludCByZXMpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JaWYgKHVwZGF0ZV90eXBlID09IE1TTV9TRU5TT1JfUkVHX0lOSVQpIHsKLQkJQ0RCRygiUmVnaXN0ZXIgSU5JVFxuIik7Ci0JCXNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9zdG9wX3N0cmVhbShzX2N0cmwpOwotCQltc21fY2FtZXJhX2kyY193cml0ZSgKLQkJCQlzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkJCTB4MTAzLCAweDEsCi0JCQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQkJbXNtX3NlbnNvcl9lbmFibGVfZGVidWdmcyhzX2N0cmwpOwotCQltc21fc2Vuc29yX3dyaXRlX2luaXRfc2V0dGluZ3Moc19jdHJsKTsKLQl9IGVsc2UgaWYgKHVwZGF0ZV90eXBlID09IE1TTV9TRU5TT1JfVVBEQVRFX1BFUklPRElDKSB7Ci0JCUNEQkcoIlBFUklPRElDIDogJWRcbiIsIHJlcyk7Ci0JCW1zbV9zZW5zb3Jfd3JpdGVfY29uZl9hcnJheSgKLQkJCXNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCQlzX2N0cmwtPm1zbV9zZW5zb3JfcmVnLT5tb2RlX3NldHRpbmdzLCByZXMpOwotCQltc2xlZXAoMzApOwotCQltc21fY2FtZXJhX2kyY193cml0ZSgKLQkJCXNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCQkweDEwMCwgMHgxLAotCQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQkJbXNtX2NhbWVyYV9pMmNfd3JpdGUoCi0JCQlzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkJMHg0ODAwLCAweDQsCi0JCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCQltc2xlZXAoMjY2KTsKLQkJaWYgKHJlcyA9PSBNU01fU0VOU09SX1JFU180KQotCQkJdjRsMl9zdWJkZXZfbm90aWZ5KCZzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldiwKLQkJCQkJTk9USUZZX1BDTEtfQ0hBTkdFLAotCQkJCQkmdmZlX2Nsayk7Ci0JfQotCXJldHVybiByYzsKLX0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9mbl90IG92NTY0N19mdW5jX3RibCA9IHsKLQkuc2Vuc29yX3N0YXJ0X3N0cmVhbSA9IG1zbV9zZW5zb3Jfc3RhcnRfc3RyZWFtLAotCS5zZW5zb3Jfc3RvcF9zdHJlYW0gPSBvdjU2NDdfc3RvcF9zdHJlYW0sCi0JLnNlbnNvcl9ncm91cF9ob2xkX29uID0gbXNtX3NlbnNvcl9ncm91cF9ob2xkX29uLAotCS5zZW5zb3JfZ3JvdXBfaG9sZF9vZmYgPSBtc21fc2Vuc29yX2dyb3VwX2hvbGRfb2ZmLAotCS5zZW5zb3Jfc2V0X2ZwcyA9IG1zbV9zZW5zb3Jfc2V0X2ZwcywKLQkuc2Vuc29yX3dyaXRlX2V4cF9nYWluID0gb3Y1NjQ3X3dyaXRlX3ByZXZfZXhwX2dhaW4sCi0JLnNlbnNvcl93cml0ZV9zbmFwc2hvdF9leHBfZ2FpbiA9IG92NTY0N193cml0ZV9waWN0X2V4cF9nYWluLAotCS5zZW5zb3JfY3NpX3NldHRpbmcgPSBvdjU2NDdfc2Vuc29yX3NldHRpbmcsCi0JLnNlbnNvcl9zZXRfc2Vuc29yX21vZGUgPSBtc21fc2Vuc29yX3NldF9zZW5zb3JfbW9kZSwKLQkuc2Vuc29yX21vZGVfaW5pdCA9IG1zbV9zZW5zb3JfbW9kZV9pbml0LAotCS5zZW5zb3JfZ2V0X291dHB1dF9pbmZvID0gbXNtX3NlbnNvcl9nZXRfb3V0cHV0X2luZm8sCi0JLnNlbnNvcl9jb25maWcgPSBtc21fc2Vuc29yX2NvbmZpZywKLQkuc2Vuc29yX3Bvd2VyX3VwID0gb3Y1NjQ3X3NlbnNvcl9wb3dlcl91cCwKLQkuc2Vuc29yX3Bvd2VyX2Rvd24gPSBvdjU2NDdfc2Vuc29yX3Bvd2VyX2Rvd24sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfcmVnX3Qgb3Y1NjQ3X3JlZ3MgPSB7Ci0JLmRlZmF1bHRfZGF0YV90eXBlID0gTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBLAotCS5zdGFydF9zdHJlYW1fY29uZiA9IG92NTY0N19zdGFydF9zZXR0aW5ncywKLQkuc3RhcnRfc3RyZWFtX2NvbmZfc2l6ZSA9IEFSUkFZX1NJWkUob3Y1NjQ3X3N0YXJ0X3NldHRpbmdzKSwKLQkuc3RvcF9zdHJlYW1fY29uZiA9IG92NTY0N19zdG9wX3NldHRpbmdzLAotCS5zdG9wX3N0cmVhbV9jb25mX3NpemUgPSBBUlJBWV9TSVpFKG92NTY0N19zdG9wX3NldHRpbmdzKSwKLQkuZ3JvdXBfaG9sZF9vbl9jb25mID0gb3Y1NjQ3X2dyb3Vwb25fc2V0dGluZ3MsCi0JLmdyb3VwX2hvbGRfb25fY29uZl9zaXplID0gQVJSQVlfU0laRShvdjU2NDdfZ3JvdXBvbl9zZXR0aW5ncyksCi0JLmdyb3VwX2hvbGRfb2ZmX2NvbmYgPSBvdjU2NDdfZ3JvdXBvZmZfc2V0dGluZ3MsCi0JLmdyb3VwX2hvbGRfb2ZmX2NvbmZfc2l6ZSA9Ci0JCUFSUkFZX1NJWkUob3Y1NjQ3X2dyb3Vwb2ZmX3NldHRpbmdzKSwKLQkuaW5pdF9zZXR0aW5ncyA9ICZvdjU2NDdfaW5pdF9jb25mWzBdLAotCS5pbml0X3NpemUgPSBBUlJBWV9TSVpFKG92NTY0N19pbml0X2NvbmYpLAotCS5tb2RlX3NldHRpbmdzID0gJm92NTY0N19jb25mc1swXSwKLQkub3V0cHV0X3NldHRpbmdzID0gJm92NTY0N19kaW1lbnNpb25zWzBdLAotCS5udW1fY29uZiA9IEFSUkFZX1NJWkUob3Y1NjQ3X2NvbmZzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3Qgb3Y1NjQ3X3NfY3RybCA9IHsKLQkubXNtX3NlbnNvcl9yZWcgPSAmb3Y1NjQ3X3JlZ3MsCi0JLnNlbnNvcl9pMmNfY2xpZW50ID0gJm92NTY0N19zZW5zb3JfaTJjX2NsaWVudCwKLQkuc2Vuc29yX2kyY19hZGRyID0gIDB4MzYgPDwgMSAsCi0JLnNlbnNvcl9vdXRwdXRfcmVnX2FkZHIgPSAmb3Y1NjQ3X3JlZ19hZGRyLAotCS5zZW5zb3JfaWRfaW5mbyA9ICZvdjU2NDdfaWRfaW5mbywKLQkuc2Vuc29yX2V4cF9nYWluX2luZm8gPSAmb3Y1NjQ3X2V4cF9nYWluX2luZm8sCi0JLmNhbV9tb2RlID0gTVNNX1NFTlNPUl9NT0RFX0lOVkFMSUQsCi0JLm1zbV9zZW5zb3JfbXV0ZXggPSAmb3Y1NjQ3X211dCwKLQkuc2Vuc29yX2kyY19kcml2ZXIgPSAmb3Y1NjQ3X2kyY19kcml2ZXIsCi0JLnNlbnNvcl92NGwyX3N1YmRldl9pbmZvID0gb3Y1NjQ3X3N1YmRldl9pbmZvLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfaW5mb19zaXplID0gQVJSQVlfU0laRShvdjU2NDdfc3ViZGV2X2luZm8pLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfb3BzID0gJm92NTY0N19zdWJkZXZfb3BzLAotCS5mdW5jX3RibCA9ICZvdjU2NDdfZnVuY190YmwsCi0JLmNsa19yYXRlID0gTVNNX1NFTlNPUl9NQ0xLXzI0SFosCi19OwotCi1tb2R1bGVfaW5pdChtc21fc2Vuc29yX2luaXRfbW9kdWxlKTsKLU1PRFVMRV9ERVNDUklQVElPTigiT21uaXZpc2lvbiBXWEdBIEJheWVyIHNlbnNvciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL292NzY5Ml92NGwyLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9vdjc2OTJfdjRsMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM3OGY4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL292NzY5Ml92NGwyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MjYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSAibXNtX3NlbnNvci5oIgotI2RlZmluZSBTRU5TT1JfTkFNRSAib3Y3NjkyIgotCi1ERUZJTkVfTVVURVgob3Y3NjkyX211dCk7Ci1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfY3RybF90IG92NzY5Ml9zX2N0cmw7Ci0KLXN0YXRpYyBpbnQgZWZmZWN0X3ZhbHVlID0gQ0FNRVJBX0VGRkVDVF9PRkY7Ci1zdGF0aWMgdW5zaWduZWQgaW50IFNBVF9VID0gMHg4MDsgLyogREVGQVVMVCBTQVRVUkFUSU9OIFZBTFVFUyovCi1zdGF0aWMgdW5zaWduZWQgaW50IFNBVF9WID0gMHg4MDsgLyogREVGQVVMVCBTQVRVUkFUSU9OIFZBTFVFUyovCi0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3Y3NjkyX3N0YXJ0X3NldHRpbmdzW10gPSB7Ci0JezB4MGUsIDB4MDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjc2OTJfc3RvcF9zZXR0aW5nc1tdID0gewotCXsweDBlLCAweDA4fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3Y3NjkyX3JlY29tbWVuZF9zZXR0aW5nc1tdID0gewotCXsweDEyLCAweDgwfSwKLQl7MHgwZSwgMHgwOH0sCi0JezB4NjksIDB4NTJ9LAotCXsweDFlLCAweGIzfSwKLQl7MHg0OCwgMHg0Mn0sCi0JezB4ZmYsIDB4MDF9LAotCXsweGFlLCAweGEwfSwKLQl7MHhhOCwgMHgyNn0sCi0JezB4YjQsIDB4YzB9LAotCXsweGI1LCAweDQwfSwKLQl7MHhmZiwgMHgwMH0sCi0JezB4MGMsIDB4MDB9LAotCXsweDYyLCAweDEwfSwKLQl7MHgxMiwgMHgwMH0sCi0JezB4MTcsIDB4NjV9LAotCXsweDE4LCAweGE0fSwKLQl7MHgxOSwgMHgwYX0sCi0JezB4MWEsIDB4ZjZ9LAotCXsweDNlLCAweDMwfSwKLQl7MHg2NCwgMHgwYX0sCi0JezB4ZmYsIDB4MDF9LAotCXsweGI0LCAweGMwfSwKLQl7MHhmZiwgMHgwMH0sCi0JezB4NjcsIDB4MjB9LAotCXsweDgxLCAweDNmfSwKLQl7MHhkMCwgMHg0OH0sCi0JezB4ODIsIDB4MDN9LAotCXsweDcwLCAweDAwfSwKLQl7MHg3MSwgMHgzNH0sCi0JezB4NzQsIDB4Mjh9LAotCXsweDc1LCAweDk4fSwKLQl7MHg3NiwgMHgwMH0sCi0JezB4NzcsIDB4NjR9LAotCXsweDc4LCAweDAxfSwKLQl7MHg3OSwgMHhjMn0sCi0JezB4N2EsIDB4NGV9LAotCXsweDdiLCAweDFmfSwKLQl7MHg3YywgMHgwMH0sCi0JezB4MTEsIDB4MDB9LAotCXsweDIwLCAweDAwfSwKLQl7MHgyMSwgMHgyM30sCi0JezB4NTAsIDB4OWF9LAotCXsweDUxLCAweDgwfSwKLQl7MHg0YywgMHg3ZH0sCi0JezB4ODUsIDB4MTB9LAotCXsweDg2LCAweDAwfSwKLQl7MHg4NywgMHgwMH0sCi0JezB4ODgsIDB4MDB9LAotCXsweDg5LCAweDJhfSwKLQl7MHg4YSwgMHgyNn0sCi0JezB4OGIsIDB4MjJ9LAotCXsweGJiLCAweDdhfSwKLQl7MHhiYywgMHg2OX0sCi0JezB4YmQsIDB4MTF9LAotCXsweGJlLCAweDEzfSwKLQl7MHhiZiwgMHg4MX0sCi0JezB4YzAsIDB4OTZ9LAotCXsweGMxLCAweDFlfSwKLQl7MHhiNywgMHgwNX0sCi0JezB4YjgsIDB4MDl9LAotCXsweGI5LCAweDAwfSwKLQl7MHhiYSwgMHgxOH0sCi0JezB4NWEsIDB4MWZ9LAotCXsweDViLCAweDlmfSwKLQl7MHg1YywgMHg2YX0sCi0JezB4NWQsIDB4NDJ9LAotCXsweDI0LCAweDc4fSwKLQl7MHgyNSwgMHg2OH0sCi0JezB4MjYsIDB4YjN9LAotCXsweGEzLCAweDBifSwKLQl7MHhhNCwgMHgxNX0sCi0JezB4YTUsIDB4MmF9LAotCXsweGE2LCAweDUxfSwKLQl7MHhhNywgMHg2M30sCi0JezB4YTgsIDB4NzR9LAotCXsweGE5LCAweDgzfSwKLQl7MHhhYSwgMHg5MX0sCi0JezB4YWIsIDB4OWV9LAotCXsweGFjLCAweGFhfSwKLQl7MHhhZCwgMHhiZX0sCi0JezB4YWUsIDB4Y2V9LAotCXsweGFmLCAweGU1fSwKLQl7MHhiMCwgMHhmM30sCi0JezB4YjEsIDB4ZmJ9LAotCXsweGIyLCAweDA2fSwKLQl7MHg4YywgMHg1Y30sCi0JezB4OGQsIDB4MTF9LAotCXsweDhlLCAweDEyfSwKLQl7MHg4ZiwgMHgxOX0sCi0JezB4OTAsIDB4NTB9LAotCXsweDkxLCAweDIwfSwKLQl7MHg5MiwgMHg5Nn0sCi0JezB4OTMsIDB4ODB9LAotCXsweDk0LCAweDEzfSwKLQl7MHg5NSwgMHgxYn0sCi0JezB4OTYsIDB4ZmZ9LAotCXsweDk3LCAweDAwfSwKLQl7MHg5OCwgMHgzZH0sCi0JezB4OTksIDB4MzZ9LAotCXsweDlhLCAweDUxfSwKLQl7MHg5YiwgMHg0M30sCi0JezB4OWMsIDB4ZjB9LAotCXsweDlkLCAweGYwfSwKLQl7MHg5ZSwgMHhmMH0sCi0JezB4OWYsIDB4ZmZ9LAotCXsweGEwLCAweDY4fSwKLQl7MHhhMSwgMHg2Mn0sCi0JezB4YTIsIDB4MGV9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjc2OTJfZnVsbF9zZXR0aW5nc1tdID0gewotCXsweGNjLCAweDAyfSwKLQl7MHhjZCwgMHg4MH0sCi0JezB4Y2UsIDB4MDF9LAotCXsweGNmLCAweGUwfSwKLQl7MHhjOCwgMHgwMn0sCi0JezB4YzksIDB4ODB9LAotCXsweGNhLCAweDAxfSwKLQl7MHhjYiwgMHhlMH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2luZm8gb3Y3NjkyX3N1YmRldl9pbmZvW10gPSB7Ci0JewotCQkuY29kZSAgID0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDgsCi0JCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCi0JCS5mbXQgICAgPSAxLAotCQkub3JkZXIgICAgPSAwLAotCX0sCi0JLyogbW9yZSBjYW4gYmUgc3VwcG9ydGVkLCB0byBiZSBhZGRlZCBsYXRlciAqLwotfTsKLQotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgb3Y3NjkyX2luaXRfY29uZltdID0gewotCXsmb3Y3NjkyX3JlY29tbWVuZF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKG92NzY5Ml9yZWNvbW1lbmRfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9Ci19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgb3Y3NjkyX2NvbmZzW10gPSB7Ci0JeyZvdjc2OTJfZnVsbF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKG92NzY5Ml9mdWxsX3NldHRpbmdzKSwgMCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3Y3NjkyX3NhdHVyYXRpb25bXVs0XSA9IHsKLQl7ezB4ODEsIDB4MzMsIDB4MDAsIDB4MDAsIDB4Q0N9LCB7MHhkOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCi0JCXsweGQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKLQkJezB4ZDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDB9LH0sLyogU0FUVVJBVElPTiBMRVZFTDAqLwotCXt7MHg4MSwgMHgzMywgMHgwMCwgMHgwMCwgMHhDQ30sIHsweGQ4LCAweDEwLCAweDAwLCAweDAwLCAweDAwfSwKLQkJezB4ZDksIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDB9LAotCQl7MHhkMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMH0sfSwJLyogU0FUVVJBVElPTiBMRVZFTDEqLwotCXt7MHg4MSwgMHgzMywgMHgwMCwgMHgwMCwgMHhDQ30sIHsweGQ4LCAweDIwLCAweDAwLCAweDAwLCAweDAwfSwKLQkJezB4ZDksIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDB9LAotCQl7MHhkMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMH0sfSwJLyogU0FUVVJBVElPTiBMRVZFTDIqLwotCXt7MHg4MSwgMHgzMywgMHgwMCwgMHgwMCwgMHhDQ30sIHsweGQ4LCAweDMwLCAweDAwLCAweDAwLCAweDAwfSwKLQkJezB4ZDksIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDB9LAotCQl7MHhkMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMH0sfSwJLyogU0FUVVJBVElPTiBMRVZFTDMqLwotCXt7MHg4MSwgMHgzMywgMHgwMCwgMHgwMCwgMHhDQ30sIHsweGQ4LCAweDQwLCAweDAwLCAweDAwLCAweDAwfSwKLQkJezB4ZDksIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDB9LAotCQl7MHhkMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMH0sfSwJLyogU0FUVVJBVElPTiBMRVZFTDQqLwotCXt7MHg4MSwgMHgzMywgMHgwMCwgMHgwMCwgMHhDQ30sIHsweGQ4LCAweDUwLCAweDAwLCAweDAwLCAweDAwfSwKLQkJezB4ZDksIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDB9LAotCQl7MHhkMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMH0sfSwJLyogU0FUVVJBVElPTiBMRVZFTDUqLwotCXt7MHg4MSwgMHgzMywgMHgwMCwgMHgwMCwgMHhDQ30sIHsweGQ4LCAweDYwLCAweDAwLCAweDAwLCAweDAwfSwKLQkJezB4ZDksIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDB9LAotCQl7MHhkMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMH0sfSwJLyogU0FUVVJBVElPTiBMRVZFTDYqLwotCXt7MHg4MSwgMHgzMywgMHgwMCwgMHgwMCwgMHhDQ30sIHsweGQ4LCAweDcwLCAweDAwLCAweDAwLCAweDAwfSwKLQkJezB4ZDksIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDB9LAotCQl7MHhkMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMH0sfSwJLyogU0FUVVJBVElPTiBMRVZFTDcqLwotCXt7MHg4MSwgMHgzMywgMHgwMCwgMHgwMCwgMHhDQ30sIHsweGQ4LCAweDgwLCAweDAwLCAweDAwLCAweDAwfSwKLQkJezB4ZDksIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDB9LAotCQl7MHhkMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMH0sfSwJLyogU0FUVVJBVElPTiBMRVZFTDgqLwotfTsKLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY29uZl9hcnJheSBvdjc2OTJfc2F0dXJhdGlvbl9jb25mc1tdWzFdID0gewotCXt7b3Y3NjkyX3NhdHVyYXRpb25bMF0sIEFSUkFZX1NJWkUob3Y3NjkyX3NhdHVyYXRpb25bMF0pLCAwLAotCQlNU01fQ0FNRVJBX0kyQ19TRVRfQllURV9XUklURV9NQVNLX0RBVEF9LH0sCi0Je3tvdjc2OTJfc2F0dXJhdGlvblsxXSwgQVJSQVlfU0laRShvdjc2OTJfc2F0dXJhdGlvblsxXSksIDAsCi0JCU1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX1dSSVRFX01BU0tfREFUQX0sfSwKLQl7e292NzY5Ml9zYXR1cmF0aW9uWzJdLCBBUlJBWV9TSVpFKG92NzY5Ml9zYXR1cmF0aW9uWzJdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NhdHVyYXRpb25bM10sIEFSUkFZX1NJWkUob3Y3NjkyX3NhdHVyYXRpb25bM10pLCAwLAotCQlNU01fQ0FNRVJBX0kyQ19TRVRfQllURV9XUklURV9NQVNLX0RBVEF9LH0sCi0Je3tvdjc2OTJfc2F0dXJhdGlvbls0XSwgQVJSQVlfU0laRShvdjc2OTJfc2F0dXJhdGlvbls0XSksIDAsCi0JCU1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX1dSSVRFX01BU0tfREFUQX0sfSwKLQl7e292NzY5Ml9zYXR1cmF0aW9uWzVdLCBBUlJBWV9TSVpFKG92NzY5Ml9zYXR1cmF0aW9uWzVdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NhdHVyYXRpb25bNl0sIEFSUkFZX1NJWkUob3Y3NjkyX3NhdHVyYXRpb25bNl0pLCAwLAotCQlNU01fQ0FNRVJBX0kyQ19TRVRfQllURV9XUklURV9NQVNLX0RBVEF9LH0sCi0Je3tvdjc2OTJfc2F0dXJhdGlvbls3XSwgQVJSQVlfU0laRShvdjc2OTJfc2F0dXJhdGlvbls3XSksIDAsCi0JCU1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX1dSSVRFX01BU0tfREFUQX0sfSwKLQl7e292NzY5Ml9zYXR1cmF0aW9uWzhdLCBBUlJBWV9TSVpFKG92NzY5Ml9zYXR1cmF0aW9uWzhdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotfTsKLQotc3RhdGljIGludCBvdjc2OTJfc2F0dXJhdGlvbl9lbnVtX21hcFtdID0gewotCU1TTV9WNEwyX1NBVFVSQVRJT05fTDAsCi0JTVNNX1Y0TDJfU0FUVVJBVElPTl9MMSwKLQlNU01fVjRMMl9TQVRVUkFUSU9OX0wyLAotCU1TTV9WNEwyX1NBVFVSQVRJT05fTDMsCi0JTVNNX1Y0TDJfU0FUVVJBVElPTl9MNCwKLQlNU01fVjRMMl9TQVRVUkFUSU9OX0w1LAotCU1TTV9WNEwyX1NBVFVSQVRJT05fTDYsCi0JTVNNX1Y0TDJfU0FUVVJBVElPTl9MNywKLQlNU01fVjRMMl9TQVRVUkFUSU9OX0w4LAotfTsKLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9vdXRwdXRfaW5mb190IG92NzY5Ml9kaW1lbnNpb25zW10gPSB7Ci0JewotCQkueF9vdXRwdXQgPSAweDI4MCwKLQkJLnlfb3V0cHV0ID0gMHgxRTAsCi0JCS5saW5lX2xlbmd0aF9wY2xrID0gMHgyOTAsCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweDFFQywKLQkJLnZ0X3BpeGVsX2NsayA9IDkyMTYwMDAsCi0JCS5vcF9waXhlbF9jbGsgPSA5MjE2MDAwLAotCQkuYmlubmluZ19mYWN0b3IgPSAxLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2VudW1fY29uZl9hcnJheSBvdjc2OTJfc2F0dXJhdGlvbl9lbnVtX2NvbmZzID0gewotCS5jb25mID0gJm92NzY5Ml9zYXR1cmF0aW9uX2NvbmZzWzBdWzBdLAotCS5jb25mX2VudW0gPSBvdjc2OTJfc2F0dXJhdGlvbl9lbnVtX21hcCwKLQkubnVtX2VudW0gPSBBUlJBWV9TSVpFKG92NzY5Ml9zYXR1cmF0aW9uX2VudW1fbWFwKSwKLQkubnVtX2luZGV4ID0gQVJSQVlfU0laRShvdjc2OTJfc2F0dXJhdGlvbl9jb25mcyksCi0JLm51bV9jb25mID0gQVJSQVlfU0laRShvdjc2OTJfc2F0dXJhdGlvbl9jb25mc1swXSksCi0JLmRhdGFfdHlwZSA9IE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3Y3NjkyX2NvbnRyYXN0W11bMTZdID0gewotCXt7MHhiMiwgMHgyOX0sIHsweGEzLCAweDU1fSwgezB4YTQsIDB4NWJ9LCB7MHhhNSwgMHg2N30sIHsweGE2LCAweDdlfSwKLQkJezB4YTcsIDB4ODl9LCB7MHhhOCwgMHg5M30sIHsweGE5LCAweDljfSwgezB4YWEsIDB4YTR9LAotCQl7MHhhYiwgMHhhY30sIHsweGFjLCAweGIzfSwgezB4YWQsIDB4YmV9LCB7MHhhZSwgMHhjN30sCi0JCXsweGFmLCAweGQ1fSwgezB4YjAsIDB4ZGR9LCB7MHhiMSwgMHhlMX0sfSwJLyogQ09OVFJBU1QgTDAqLwotCXt7MHhiMiwgMHgyMH0sIHsweGEzLCAweDQzfSwgezB4YTQsIDB4NGF9LCB7MHhhNSwgMHg1OH0sIHsweGE2LCAweDczfSwKLQkJezB4YTcsIDB4ODB9LCB7MHhhOCwgMHg4Yn0sIHsweGE5LCAweDk2fSwgezB4YWEsIDB4OWZ9LAotCQl7MHhhYiwgMHhhOH0sIHsweGFjLCAweGIxfSwgezB4YWQsIDB4YmV9LCB7MHhhZSwgMHhjOX0sCi0JCXsweGFmLCAweGQ4fSwgezB4YjAsIDB4ZTJ9LCB7MHhiMSwgMHhlOH0sfSwJLyogQ09OVFJBU1QgTDEqLwotCXt7MHhiMiwgMHgxOH0sIHsweGEzLCAweDMxfSwgezB4YTQsIDB4Mzl9LCB7MHhhNSwgMHg0YX0sIHsweGE2LCAweDY4fSwKLQkJezB4YTcsIDB4Nzd9LCB7MHhhOCwgMHg4NH0sIHsweGE5LCAweDkwfSwgezB4YWEsIDB4OWJ9LAotCQl7MHhhYiwgMHhhNX0sIHsweGFjLCAweGFmfSwgezB4YWQsIDB4YmV9LCB7MHhhZSwgMHhjYX0sCi0JCXsweGFmLCAweGRjfSwgezB4YjAsIDB4ZTd9LCB7MHhiMSwgMHhlZX0sfSwJLyogQ09OVFJBU1QgTDIqLwotCXt7MHhiMiwgMHgxMH0sIHsweGEzLCAweDFmfSwgezB4YTQsIDB4Mjh9LCB7MHhhNSwgMHgzYn0sIHsweGE2LCAweDVkfSwKLQkJezB4YTcsIDB4NmV9LCB7MHhhOCwgMHg3ZH0sIHsweGE5LCAweDhhfSwgezB4YWEsIDB4OTZ9LAotCQl7MHhhYiwgMHhhMn0sIHsweGFjLCAweGFkfSwgezB4YWQsIDB4YmV9LCB7MHhhZSwgMHhjY30sCi0JCXsweGFmLCAweGUwfSwgezB4YjAsIDB4ZWR9LCB7MHhiMSwgMHhmNH0sfSwJLyogQ09OVFJBU1QgTDMqLwotCSB7ezB4YjIsIDB4Nn0sIHsweGEzLCAweGJ9LCB7MHhhNCwgMHgxNX0sIHsweGE1LCAweDJhfSwgezB4YTYsIDB4NTF9LAotCQl7MHhhNywgMHg2M30sIHsweGE4LCAweDc0fSwgezB4YTksIDB4ODN9LCB7MHhhYSwgMHg5MX0sCi0JCXsweGFiLCAweDllfSwgezB4YWMsIDB4YWF9LCB7MHhhZCwgMHhiZX0sIHsweGFlLCAweGNlfSwKLQkJezB4YWYsIDB4ZTV9LCB7MHhiMCwgMHhmM30sIHsweGIxLCAweGZifSx9LAkvKiBDT05UUkFTVCBMNCovCi0Je3sweGIyLCAweGN9LCB7MHhhMywgMHg0fSwgezB4YTQsIDB4Y30sIHsweGE1LCAweDFmfSwgezB4YTYsIDB4NDV9LAotCQl7MHhhNywgMHg1OH0sIHsweGE4LCAweDZifSwgezB4YTksIDB4N2N9LCB7MHhhYSwgMHg4ZH0sCi0JCXsweGFiLCAweDlkfSwgezB4YWMsIDB4YWN9LCB7MHhhZCwgMHhjM30sIHsweGFlLCAweGQyfSwKLQkJezB4YWYsIDB4ZTh9LCB7MHhiMCwgMHhmMn0sIHsweGIxLCAweGY3fSx9LAkvKiBDT05UUkFTVCBMNSovCi0Je3sweGIyLCAweDF9LCB7MHhhMywgMHgyfSwgezB4YTQsIDB4OX0sIHsweGE1LCAweDFhfSwgezB4YTYsIDB4M2V9LAotCQl7MHhhNywgMHg0YX0sIHsweGE4LCAweDU5fSwgezB4YTksIDB4NmF9LCB7MHhhYSwgMHg3OX0sCi0JCXsweGFiLCAweDhlfSwgezB4YWMsIDB4YTR9LCB7MHhhZCwgMHhjMX0sIHsweGFlLCAweGRifSwKLQkJezB4YWYsIDB4ZjR9LCB7MHhiMCwgMHhmZn0sIHsweGIxLCAweGZmfSx9LAkvKiBDT05UUkFTVCBMNiovCi0Je3sweGIyLCAweGN9LCB7MHhhMywgMHg0fSwgezB4YTQsIDB4OH0sIHsweGE1LCAweDE3fSwgezB4YTYsIDB4Mjd9LAotCQl7MHhhNywgMHgzZH0sIHsweGE4LCAweDU0fSwgezB4YTksIDB4NjB9LCB7MHhhYSwgMHg3N30sCi0JCXsweGFiLCAweDg1fSwgezB4YWMsIDB4YTR9LCB7MHhhZCwgMHhjNn0sIHsweGFlLCAweGQyfSwKLQkJezB4YWYsIDB4ZTl9LCB7MHhiMCwgMHhmMH0sIHsweGIxLCAweGY3fSx9LAkvKiBDT05UUkFTVCBMNyovCi0Je3sweGIyLCAweDF9LCB7MHhhMywgMHg0fSwgezB4YTQsIDB4NH0sIHsweGE1LCAweDd9LCB7MHhhNiwgMHhifSwKLQkJezB4YTcsIDB4MTd9LCB7MHhhOCwgMHgyYX0sIHsweGE5LCAweDQxfSwgezB4YWEsIDB4NTl9LAotCQl7MHhhYiwgMHg2Yn0sIHsweGFjLCAweDhifSwgezB4YWQsIDB4YjF9LCB7MHhhZSwgMHhkMn0sCi0JCXsweGFmLCAweGVhfSwgezB4YjAsIDB4ZjR9LCB7MHhiMSwgMHhmZn0sfSwJLyogQ09OVFJBU1QgTDgqLwotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5IG92NzY5Ml9jb250cmFzdF9jb25mc1tdWzFdID0gewotCXt7b3Y3NjkyX2NvbnRyYXN0WzBdLCBBUlJBWV9TSVpFKG92NzY5Ml9jb250cmFzdFswXSksIDAsCi0JCU1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX1dSSVRFX01BU0tfREFUQX0sfSwKLQl7e292NzY5Ml9jb250cmFzdFsxXSwgQVJSQVlfU0laRShvdjc2OTJfY29udHJhc3RbMV0pLCAwLAotCQlNU01fQ0FNRVJBX0kyQ19TRVRfQllURV9XUklURV9NQVNLX0RBVEF9LH0sCi0Je3tvdjc2OTJfY29udHJhc3RbMl0sIEFSUkFZX1NJWkUob3Y3NjkyX2NvbnRyYXN0WzJdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX2NvbnRyYXN0WzNdLCBBUlJBWV9TSVpFKG92NzY5Ml9jb250cmFzdFszXSksIDAsCi0JCU1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX1dSSVRFX01BU0tfREFUQX0sfSwKLQl7e292NzY5Ml9jb250cmFzdFs0XSwgQVJSQVlfU0laRShvdjc2OTJfY29udHJhc3RbNF0pLCAwLAotCQlNU01fQ0FNRVJBX0kyQ19TRVRfQllURV9XUklURV9NQVNLX0RBVEF9LH0sCi0Je3tvdjc2OTJfY29udHJhc3RbNV0sIEFSUkFZX1NJWkUob3Y3NjkyX2NvbnRyYXN0WzVdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX2NvbnRyYXN0WzZdLCBBUlJBWV9TSVpFKG92NzY5Ml9jb250cmFzdFs2XSksIDAsCi0JCU1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX1dSSVRFX01BU0tfREFUQX0sfSwKLQl7e292NzY5Ml9jb250cmFzdFs3XSwgQVJSQVlfU0laRShvdjc2OTJfY29udHJhc3RbN10pLCAwLAotCQlNU01fQ0FNRVJBX0kyQ19TRVRfQllURV9XUklURV9NQVNLX0RBVEF9LH0sCi0Je3tvdjc2OTJfY29udHJhc3RbOF0sIEFSUkFZX1NJWkUob3Y3NjkyX2NvbnRyYXN0WzhdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotfTsKLQotCi1zdGF0aWMgaW50IG92NzY5Ml9jb250cmFzdF9lbnVtX21hcFtdID0gewotCU1TTV9WNEwyX0NPTlRSQVNUX0wwLAotCU1TTV9WNEwyX0NPTlRSQVNUX0wxLAotCU1TTV9WNEwyX0NPTlRSQVNUX0wyLAotCU1TTV9WNEwyX0NPTlRSQVNUX0wzLAotCU1TTV9WNEwyX0NPTlRSQVNUX0w0LAotCU1TTV9WNEwyX0NPTlRSQVNUX0w1LAotCU1TTV9WNEwyX0NPTlRSQVNUX0w2LAotCU1TTV9WNEwyX0NPTlRSQVNUX0w3LAotCU1TTV9WNEwyX0NPTlRSQVNUX0w4LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19lbnVtX2NvbmZfYXJyYXkgb3Y3NjkyX2NvbnRyYXN0X2VudW1fY29uZnMgPSB7Ci0JLmNvbmYgPSAmb3Y3NjkyX2NvbnRyYXN0X2NvbmZzWzBdWzBdLAotCS5jb25mX2VudW0gPSBvdjc2OTJfY29udHJhc3RfZW51bV9tYXAsCi0JLm51bV9lbnVtID0gQVJSQVlfU0laRShvdjc2OTJfY29udHJhc3RfZW51bV9tYXApLAotCS5udW1faW5kZXggPSBBUlJBWV9TSVpFKG92NzY5Ml9jb250cmFzdF9jb25mcyksCi0JLm51bV9jb25mID0gQVJSQVlfU0laRShvdjc2OTJfY29udHJhc3RfY29uZnNbMF0pLAotCS5kYXRhX3R5cGUgPSBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEsCi19Owotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjc2OTJfc2hhcnBuZXNzW11bMl0gPSB7Ci0Je3sweGI0LCAweDIwLCAweDAwLCAweDAwLCAweERGfSwKLQkJezB4YjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTB9LH0sICAgIC8qIFNIQVJQTkVTUyBMRVZFTCAwKi8KLQl7ezB4YjQsIDB4MjAsIDB4MDAsIDB4MDAsIDB4REZ9LAotCQl7MHhiNiwgMHgwMSwgMHgwMCwgMHgwMCwgMHhFMH0sfSwgICAgLyogU0hBUlBORVNTIExFVkVMIDEqLwotCXt7MHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERn0sCi0JCXsweGI2LCAweDAwLCAweDAwLCAweDAwLCAweEUwfSx9LCAgICAvKiBTSEFSUE5FU1MgTEVWRUwgMiovCi0Je3sweGI0LCAweDIwLCAweDAwLCAweDAwLCAweERGfSwKLQkJezB4YjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4RTB9LH0sICAgIC8qIFNIQVJQTkVTUyBMRVZFTCAzKi8KLQl7ezB4YjQsIDB4MjAsIDB4MDAsIDB4MDAsIDB4REZ9LAotCQl7MHhiNiwgMHg5OSwgMHgwMCwgMHgwMCwgMHhFMH0sfSwgICAgLyogU0hBUlBORVNTIExFVkVMIDQqLwotCXt7MHhiNCwgMHgyMCwgMHgwMCwgMHgwMCwgMHhERn0sCi0JCXsweGI2LCAweGNjLCAweDAwLCAweDAwLCAweEUwfSx9LCAgICAvKiBTSEFSUE5FU1MgTEVWRUwgNSovCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgb3Y3NjkyX3NoYXJwbmVzc19jb25mc1tdWzFdID0gewotCXt7b3Y3NjkyX3NoYXJwbmVzc1swXSwgQVJSQVlfU0laRShvdjc2OTJfc2hhcnBuZXNzWzBdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NoYXJwbmVzc1sxXSwgQVJSQVlfU0laRShvdjc2OTJfc2hhcnBuZXNzWzFdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NoYXJwbmVzc1syXSwgQVJSQVlfU0laRShvdjc2OTJfc2hhcnBuZXNzWzJdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NoYXJwbmVzc1szXSwgQVJSQVlfU0laRShvdjc2OTJfc2hhcnBuZXNzWzNdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NoYXJwbmVzc1s0XSwgQVJSQVlfU0laRShvdjc2OTJfc2hhcnBuZXNzWzRdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NoYXJwbmVzc1s1XSwgQVJSQVlfU0laRShvdjc2OTJfc2hhcnBuZXNzWzVdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotfTsKLQotc3RhdGljIGludCBvdjc2OTJfc2hhcnBuZXNzX2VudW1fbWFwW10gPSB7Ci0JTVNNX1Y0TDJfU0hBUlBORVNTX0wwLAotCU1TTV9WNEwyX1NIQVJQTkVTU19MMSwKLQlNU01fVjRMMl9TSEFSUE5FU1NfTDIsCi0JTVNNX1Y0TDJfU0hBUlBORVNTX0wzLAotCU1TTV9WNEwyX1NIQVJQTkVTU19MNCwKLQlNU01fVjRMMl9TSEFSUE5FU1NfTDUsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2VudW1fY29uZl9hcnJheSBvdjc2OTJfc2hhcnBuZXNzX2VudW1fY29uZnMgPSB7Ci0JLmNvbmYgPSAmb3Y3NjkyX3NoYXJwbmVzc19jb25mc1swXVswXSwKLQkuY29uZl9lbnVtID0gb3Y3NjkyX3NoYXJwbmVzc19lbnVtX21hcCwKLQkubnVtX2VudW0gPSBBUlJBWV9TSVpFKG92NzY5Ml9zaGFycG5lc3NfZW51bV9tYXApLAotCS5udW1faW5kZXggPSBBUlJBWV9TSVpFKG92NzY5Ml9zaGFycG5lc3NfY29uZnMpLAotCS5udW1fY29uZiA9IEFSUkFZX1NJWkUob3Y3NjkyX3NoYXJwbmVzc19jb25mc1swXSksCi0JLmRhdGFfdHlwZSA9IE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3Y3NjkyX2V4cG9zdXJlW11bM10gPSB7Ci0Je3sweDI0LCAweDUwfSwgezB4MjUsIDB4NDB9LCB7MHgyNiwgMHhhMn0sfSwgLypFWFBPU1VSRUNPTVBFTlNBVElPTk4yKi8KLQl7ezB4MjQsIDB4NzB9LCB7MHgyNSwgMHg2MH0sIHsweDI2LCAweGEyfSx9LCAvKkVYUE9TVVJFQ09NUEVOU0FUSU9OTjEqLwotCXt7MHgyNCwgMHg4Nn0sIHsweDI1LCAweDc2fSwgezB4MjYsIDB4YjN9LH0sIC8qRVhQT1NVUkVDT01QRU5TQVRJT05EKi8KLQl7ezB4MjQsIDB4YTh9LCB7MHgyNSwgMHhhMH0sIHsweDI2LCAweGM0fSx9LCAvKkVYUE9TVVJFQ09NUEVOU0FUSU9OcDEqLwotCXt7MHgyNCwgMHhjMH0sIHsweDI1LCAweGI4fSwgezB4MjYsIDB4ZTZ9LH0sIC8qRVhQT1NVUkVDT01QRU5TQVRJT05QMiovCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgb3Y3NjkyX2V4cG9zdXJlX2NvbmZzW11bMV0gPSB7Ci0Je3tvdjc2OTJfZXhwb3N1cmVbMF0sIEFSUkFZX1NJWkUob3Y3NjkyX2V4cG9zdXJlWzBdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX2V4cG9zdXJlWzFdLCBBUlJBWV9TSVpFKG92NzY5Ml9leHBvc3VyZVsxXSksIDAsCi0JCU1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX1dSSVRFX01BU0tfREFUQX0sfSwKLQl7e292NzY5Ml9leHBvc3VyZVsyXSwgQVJSQVlfU0laRShvdjc2OTJfZXhwb3N1cmVbMl0pLCAwLAotCQlNU01fQ0FNRVJBX0kyQ19TRVRfQllURV9XUklURV9NQVNLX0RBVEF9LH0sCi0Je3tvdjc2OTJfZXhwb3N1cmVbM10sIEFSUkFZX1NJWkUob3Y3NjkyX2V4cG9zdXJlWzNdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX2V4cG9zdXJlWzRdLCBBUlJBWV9TSVpFKG92NzY5Ml9leHBvc3VyZVs0XSksIDAsCi0JCU1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX1dSSVRFX01BU0tfREFUQX0sfSwKLX07Ci0KLXN0YXRpYyBpbnQgb3Y3NjkyX2V4cG9zdXJlX2VudW1fbWFwW10gPSB7Ci0JTVNNX1Y0TDJfRVhQT1NVUkVfTjIsCi0JTVNNX1Y0TDJfRVhQT1NVUkVfTjEsCi0JTVNNX1Y0TDJfRVhQT1NVUkVfRCwKLQlNU01fVjRMMl9FWFBPU1VSRV9QMSwKLQlNU01fVjRMMl9FWFBPU1VSRV9QMiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfZW51bV9jb25mX2FycmF5IG92NzY5Ml9leHBvc3VyZV9lbnVtX2NvbmZzID0gewotCS5jb25mID0gJm92NzY5Ml9leHBvc3VyZV9jb25mc1swXVswXSwKLQkuY29uZl9lbnVtID0gb3Y3NjkyX2V4cG9zdXJlX2VudW1fbWFwLAotCS5udW1fZW51bSA9IEFSUkFZX1NJWkUob3Y3NjkyX2V4cG9zdXJlX2VudW1fbWFwKSwKLQkubnVtX2luZGV4ID0gQVJSQVlfU0laRShvdjc2OTJfZXhwb3N1cmVfY29uZnMpLAotCS5udW1fY29uZiA9IEFSUkFZX1NJWkUob3Y3NjkyX2V4cG9zdXJlX2NvbmZzWzBdKSwKLQkuZGF0YV90eXBlID0gTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjc2OTJfaXNvW11bMV0gPSB7Ci0Je3sweDE0LCAweDIwLCAweDAwLCAweDAwLCAweDhGfSx9LCAgIC8qSVNPX0FVVE8qLwotCXt7MHgxNCwgMHgyMCwgMHgwMCwgMHgwMCwgMHg4Rn0sfSwgICAvKklTT19ERUJMVVIqLwotCXt7MHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4Rn0sfSwgICAvKklTT18xMDAqLwotCXt7MHgxNCwgMHgxMCwgMHgwMCwgMHgwMCwgMHg4Rn0sfSwgICAvKklTT18yMDAqLwotCXt7MHgxNCwgMHgyMCwgMHgwMCwgMHgwMCwgMHg4Rn0sfSwgICAvKklTT180MDAqLwotCXt7MHgxNCwgMHgzMCwgMHgwMCwgMHgwMCwgMHg4Rn0sfSwgICAvKklTT184MDAqLwotCXt7MHgxNCwgMHg0MCwgMHgwMCwgMHgwMCwgMHg4Rn0sfSwgICAvKklTT18xNjAwKi8KLX07Ci0KLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5IG92NzY5Ml9pc29fY29uZnNbXVsxXSA9IHsKLQl7e292NzY5Ml9pc29bMF0sIEFSUkFZX1NJWkUob3Y3NjkyX2lzb1swXSksICAwLAotCQlNU01fQ0FNRVJBX0kyQ19TRVRfQllURV9XUklURV9NQVNLX0RBVEF9LH0sCi0Je3tvdjc2OTJfaXNvWzFdLCBBUlJBWV9TSVpFKG92NzY5Ml9pc29bMV0pLCAgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX2lzb1syXSwgQVJSQVlfU0laRShvdjc2OTJfaXNvWzJdKSwgIDAsCi0JCU1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX1dSSVRFX01BU0tfREFUQX0sfSwKLQl7e292NzY5Ml9pc29bM10sIEFSUkFZX1NJWkUob3Y3NjkyX2lzb1szXSksICAwLAotCQlNU01fQ0FNRVJBX0kyQ19TRVRfQllURV9XUklURV9NQVNLX0RBVEF9LH0sCi0Je3tvdjc2OTJfaXNvWzRdLCBBUlJBWV9TSVpFKG92NzY5Ml9pc29bNF0pLCAgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX2lzb1s1XSwgQVJSQVlfU0laRShvdjc2OTJfaXNvWzVdKSwgIDAsCi0JCU1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX1dSSVRFX01BU0tfREFUQX0sfSwKLX07Ci0KLXN0YXRpYyBpbnQgb3Y3NjkyX2lzb19lbnVtX21hcFtdID0gewotCU1TTV9WNEwyX0lTT19BVVRPICwKLQlNU01fVjRMMl9JU09fREVCTFVSLAotCU1TTV9WNEwyX0lTT18xMDAsCi0JTVNNX1Y0TDJfSVNPXzIwMCwKLQlNU01fVjRMMl9JU09fNDAwLAotCU1TTV9WNEwyX0lTT184MDAsCi0JTVNNX1Y0TDJfSVNPXzE2MDAsCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfZW51bV9jb25mX2FycmF5IG92NzY5Ml9pc29fZW51bV9jb25mcyA9IHsKLQkuY29uZiA9ICZvdjc2OTJfaXNvX2NvbmZzWzBdWzBdLAotCS5jb25mX2VudW0gPSBvdjc2OTJfaXNvX2VudW1fbWFwLAotCS5udW1fZW51bSA9IEFSUkFZX1NJWkUob3Y3NjkyX2lzb19lbnVtX21hcCksCi0JLm51bV9pbmRleCA9IEFSUkFZX1NJWkUob3Y3NjkyX2lzb19jb25mcyksCi0JLm51bV9jb25mID0gQVJSQVlfU0laRShvdjc2OTJfaXNvX2NvbmZzWzBdKSwKLQkuZGF0YV90eXBlID0gTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjc2OTJfbm9fZWZmZWN0W10gPSB7Ci0JezB4ODEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REZ9LAotCXsweDI4LCAweDAwLH0sCi0JezB4ZDIsIDB4MDAsfSwKLQl7MHhkYSwgMHg4MCx9LAotCXsweGRiLCAweDgwLH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgb3Y3NjkyX25vX2VmZmVjdF9jb25mc1tdID0gewotCXsmb3Y3NjkyX25vX2VmZmVjdFswXSwKLQlBUlJBWV9TSVpFKG92NzY5Ml9ub19lZmZlY3QpLCAwLAotCU1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX1dSSVRFX01BU0tfREFUQX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIG92NzY5Ml9zcGVjaWFsX2VmZmVjdFtdWzVdID0gewotCXt7MHg4MSwgMHgyMCwgMHgwMCwgMHgwMCwgMHhERn0sIHsweDI4LCAweDAwLH0sIHsweGQyLCAweDE4LH0sCi0JCXsweGRhLCAweDgwLH0sIHsweGRiLCAweDgwLH0sfSwJLypmb3Igc3BlY2lhbCBlZmZlY3QgT0ZGKi8KLQl7ezB4ODEsIDB4MjAsIDB4MDAsIDB4MDAsIDB4REZ9LCB7MHgyOCwgMHgwMCx9LCB7MHhkMiwgMHgxOCx9LAotCQl7MHhkYSwgMHg4MCx9LCB7MHhkYiwgMHg4MCx9LH0sCS8qZm9yIHNwZWNpYWwgZWZmZWN0IE1PTk8qLwotCXt7MHg4MSwgMHgyMCwgMHgwMCwgMHgwMCwgMHhERn0sIHsweDI4LCAweDgwLH0sIHsweGQyLCAweDQwLH0sCi0JCXsweGRhLCAweDgwLH0sIHsweGRiLCAweDgwLH0sfSwJLypmb3Igc3BlY2lhbCBlZmVmY3QgTmVnYXRpdmUqLwotCXt7LTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTF9LAotCQl7LTEsIC0xLCAtMSwgLTEsIC0xfSwKLQkJey0xLCAtMSwgLTEsIC0xLCAtMX0sfSwvKlNvbGFyaXplIGlzIG5vdCBzdXBwb3J0ZWQgYnkgc2Vuc29yKi8KLQl7ezB4ODEsIDB4MjAsIDB4MDAsIDB4MDAsIDB4REZ9LCB7MHgyOCwgMHgwMCx9LCB7MHhkMiwgMHgxOCx9LAotCQl7MHhkYSwgMHg0MCx9LCB7MHhkYiwgMHhhMCx9LH0sCS8qZm9yIHNlcGlhKi8KLQl7ey0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xfSwKLQkJey0xLCAtMSwgLTEsIC0xLCAtMX0sCi0JCXstMSwgLTEsIC0xLCAtMSwgLTF9LH0sCQkvKiBQb3N0ZXJhaXplIG5vdCBzdXBwb3J0ZWQgKi8KLQl7ey0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xfSwKLQkJey0xLCAtMSwgLTEsIC0xLCAtMX0sCi0JCXstMSwgLTEsIC0xLCAtMSwgLTF9LH0sCQkvKiBXaGl0ZSBib2FyZCBub3Qgc3VwcG9ydGVkKi8KLQl7ey0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xfSwKLQkJey0xLCAtMSwgLTEsIC0xLCAtMX0sCi0JCXstMSwgLTEsIC0xLCAtMSwgLTF9LH0sCQkvKkJsYWNrYm9hcmQgbm90IHN1cHBvcnRlZCovCi0Je3stMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMX0sCi0JCXstMSwgLTEsIC0xLCAtMSwgLTF9LAotCQl7LTEsIC0xLCAtMSwgLTEsIC0xfSx9LAkJLypBcXVhIG5vdCBzdXBwb3J0ZWQqLwotCXt7LTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTF9LAotCQl7LTEsIC0xLCAtMSwgLTEsIC0xfSwKLQkJey0xLCAtMSwgLTEsIC0xLCAtMX0sfSwJCS8qRW1ib3NzIG5vdCBzdXBwb3J0ZWQgKi8KLQl7ey0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xfSwKLQkJey0xLCAtMSwgLTEsIC0xLCAtMX0sCi0JCXstMSwgLTEsIC0xLCAtMSwgLTF9LH0sCQkvKnNrZXRjaCBub3Qgc3VwcG9ydGVkKi8KLQl7ey0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xfSwKLQkJey0xLCAtMSwgLTEsIC0xLCAtMX0sCi0JCXstMSwgLTEsIC0xLCAtMSwgLTF9LH0sCQkvKk5lb24gbm90IHN1cHBvcnRlZCovCi0Je3stMSwgLTEsIC0xLCAtMSwgLTF9LCB7LTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMX0sCi0JCXstMSwgLTEsIC0xLCAtMSwgLTF9LAotCQl7LTEsIC0xLCAtMSwgLTEsIC0xfSx9LAkJLypNQVggdmFsdWUqLwotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5IG92NzY5Ml9zcGVjaWFsX2VmZmVjdF9jb25mc1tdWzFdID0gewotCXt7b3Y3NjkyX3NwZWNpYWxfZWZmZWN0WzBdLCAgQVJSQVlfU0laRShvdjc2OTJfc3BlY2lhbF9lZmZlY3RbMF0pLCAgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NwZWNpYWxfZWZmZWN0WzFdLCAgQVJSQVlfU0laRShvdjc2OTJfc3BlY2lhbF9lZmZlY3RbMV0pLCAgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NwZWNpYWxfZWZmZWN0WzJdLCAgQVJSQVlfU0laRShvdjc2OTJfc3BlY2lhbF9lZmZlY3RbMl0pLCAgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NwZWNpYWxfZWZmZWN0WzNdLCAgQVJSQVlfU0laRShvdjc2OTJfc3BlY2lhbF9lZmZlY3RbM10pLCAgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NwZWNpYWxfZWZmZWN0WzRdLCAgQVJSQVlfU0laRShvdjc2OTJfc3BlY2lhbF9lZmZlY3RbNF0pLCAgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NwZWNpYWxfZWZmZWN0WzVdLCAgQVJSQVlfU0laRShvdjc2OTJfc3BlY2lhbF9lZmZlY3RbNV0pLCAgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NwZWNpYWxfZWZmZWN0WzZdLCAgQVJSQVlfU0laRShvdjc2OTJfc3BlY2lhbF9lZmZlY3RbNl0pLCAgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NwZWNpYWxfZWZmZWN0WzddLCAgQVJSQVlfU0laRShvdjc2OTJfc3BlY2lhbF9lZmZlY3RbN10pLCAgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NwZWNpYWxfZWZmZWN0WzhdLCAgQVJSQVlfU0laRShvdjc2OTJfc3BlY2lhbF9lZmZlY3RbOF0pLCAgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NwZWNpYWxfZWZmZWN0WzldLCAgQVJSQVlfU0laRShvdjc2OTJfc3BlY2lhbF9lZmZlY3RbOV0pLCAgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NwZWNpYWxfZWZmZWN0WzEwXSwgQVJSQVlfU0laRShvdjc2OTJfc3BlY2lhbF9lZmZlY3RbMTBdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NwZWNpYWxfZWZmZWN0WzExXSwgQVJSQVlfU0laRShvdjc2OTJfc3BlY2lhbF9lZmZlY3RbMTFdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3NwZWNpYWxfZWZmZWN0WzEyXSwgQVJSQVlfU0laRShvdjc2OTJfc3BlY2lhbF9lZmZlY3RbMTJdKSwgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotfTsKLQotc3RhdGljIGludCBvdjc2OTJfc3BlY2lhbF9lZmZlY3RfZW51bV9tYXBbXSA9IHsKLQlNU01fVjRMMl9FRkZFQ1RfT0ZGLAotCU1TTV9WNEwyX0VGRkVDVF9NT05PLAotCU1TTV9WNEwyX0VGRkVDVF9ORUdBVElWRSwKLQlNU01fVjRMMl9FRkZFQ1RfU09MQVJJWkUsCi0JTVNNX1Y0TDJfRUZGRUNUX1NFUElBLAotCU1TTV9WNEwyX0VGRkVDVF9QT1NURVJBSVpFLAotCU1TTV9WNEwyX0VGRkVDVF9XSElURUJPQVJELAotCU1TTV9WNEwyX0VGRkVDVF9CTEFDS0JPQVJELAotCU1TTV9WNEwyX0VGRkVDVF9BUVVBLAotCU1TTV9WNEwyX0VGRkVDVF9FTUJPU1MsCi0JTVNNX1Y0TDJfRUZGRUNUX1NLRVRDSCwKLQlNU01fVjRMMl9FRkZFQ1RfTkVPTiwKLQlNU01fVjRMMl9FRkZFQ1RfTUFYLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19lbnVtX2NvbmZfYXJyYXkKLQkJIG92NzY5Ml9zcGVjaWFsX2VmZmVjdF9lbnVtX2NvbmZzID0gewotCS5jb25mID0gJm92NzY5Ml9zcGVjaWFsX2VmZmVjdF9jb25mc1swXVswXSwKLQkuY29uZl9lbnVtID0gb3Y3NjkyX3NwZWNpYWxfZWZmZWN0X2VudW1fbWFwLAotCS5udW1fZW51bSA9IEFSUkFZX1NJWkUob3Y3NjkyX3NwZWNpYWxfZWZmZWN0X2VudW1fbWFwKSwKLQkubnVtX2luZGV4ID0gQVJSQVlfU0laRShvdjc2OTJfc3BlY2lhbF9lZmZlY3RfY29uZnMpLAotCS5udW1fY29uZiA9IEFSUkFZX1NJWkUob3Y3NjkyX3NwZWNpYWxfZWZmZWN0X2NvbmZzWzBdKSwKLQkuZGF0YV90eXBlID0gTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjc2OTJfYW50aWJhbmRpbmdbXVsyXSA9IHsKLQl7ezB4MTMsIDB4MjAsIDB4MDAsIDB4MDAsIDB4REZ9LAotCQl7MHgxNCwgMHgxNiwgMHgwMCwgMHgwMCwgMHhFOH0sfSwgICAvKkFOVElCQU5ESU5HIDYwSFoqLwotCXt7MHgxMywgMHgyMCwgMHgwMCwgMHgwMCwgMHhERn0sCi0JCXsweDE0LCAweDE3LCAweDAwLCAweDAwLCAweEU4fSx9LCAgIC8qQU5USUJBTkRJTkcgNTBIWiovCi0Je3sweDEzLCAweDIwLCAweDAwLCAweDAwLCAweERGfSwKLQkJezB4MTQsIDB4MTQsIDB4MDAsIDB4MDAsIDB4RTh9LH0sICAgLyogQU5USUJBTkRJTkcgQVVUTyovCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY29uZl9hcnJheSBvdjc2OTJfYW50aWJhbmRpbmdfY29uZnNbXVsxXSA9IHsKLQl7e292NzY5Ml9hbnRpYmFuZGluZ1swXSwgQVJSQVlfU0laRShvdjc2OTJfYW50aWJhbmRpbmdbMF0pLCAgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX2FudGliYW5kaW5nWzFdLCBBUlJBWV9TSVpFKG92NzY5Ml9hbnRpYmFuZGluZ1sxXSksICAwLAotCQlNU01fQ0FNRVJBX0kyQ19TRVRfQllURV9XUklURV9NQVNLX0RBVEF9LH0sCi0Je3tvdjc2OTJfYW50aWJhbmRpbmdbMl0sIEFSUkFZX1NJWkUob3Y3NjkyX2FudGliYW5kaW5nWzJdKSwgIDAsCi0JCU1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX1dSSVRFX01BU0tfREFUQX0sfSwKLX07Ci0KLXN0YXRpYyBpbnQgb3Y3NjkyX2FudGliYW5kaW5nX2VudW1fbWFwW10gPSB7Ci0JTVNNX1Y0TDJfUE9XRVJfTElORV82MEhaLAotCU1TTV9WNEwyX1BPV0VSX0xJTkVfNTBIWiwKLQlNU01fVjRMMl9QT1dFUl9MSU5FX0FVVE8sCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfZW51bV9jb25mX2FycmF5IG92NzY5Ml9hbnRpYmFuZGluZ19lbnVtX2NvbmZzID0gewotCS5jb25mID0gJm92NzY5Ml9hbnRpYmFuZGluZ19jb25mc1swXVswXSwKLQkuY29uZl9lbnVtID0gb3Y3NjkyX2FudGliYW5kaW5nX2VudW1fbWFwLAotCS5udW1fZW51bSA9IEFSUkFZX1NJWkUob3Y3NjkyX2FudGliYW5kaW5nX2VudW1fbWFwKSwKLQkubnVtX2luZGV4ID0gQVJSQVlfU0laRShvdjc2OTJfYW50aWJhbmRpbmdfY29uZnMpLAotCS5udW1fY29uZiA9IEFSUkFZX1NJWkUob3Y3NjkyX2FudGliYW5kaW5nX2NvbmZzWzBdKSwKLQkuZGF0YV90eXBlID0gTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjc2OTJfd2Jfb2VtW11bNF0gPSB7Ci0Je3stMSwgLTEsIC0xLCAtMSAsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTF9LAotCQl7LTEsIC0xLCAtMSwgLTEsIC0xfSx9LC8qV0hJVEVCQUxOQUNFIE9GRiovCi0Je3sweDEzLCAweGY3fSwgezB4MTUsIDB4MDB9LCB7LTEsIC0xLCAtMSwgLTEsIC0xfSwKLQkJey0xLCAtMSwgLTEsIC0xLCAtMX0sfSwgLypXSElURUJBTE5BQ0UgQVVUTyovCi0Je3sweDEzLCAweGY1fSwgezB4MDEsIDB4NTZ9LCB7MHgwMiwgMHg1MH0sCi0JCXsweDE1LCAweDAwfSx9LAkvKldISVRFQkFMTkFDRSBDVVNUT00qLwotCXt7MHgxMywgMHhmNX0sIHsweDAxLCAweDY2fSwgezB4MDIsIDB4NDB9LAotCQl7MHgxNSwgMHgwMH0sfSwJLypJTkNBTkRJU0NFTlQqLwotCXt7LTEsIC0xLCAtMSwgLTEsIC0xfSwgey0xLCAtMSwgLTEsIC0xLCAtMX0sIHstMSwgLTEsIC0xLCAtMSwgLTF9LAotCQl7LTEsIC0xLCAtMSwgLTEsIC0xfSx9LAkvKkZMT1VSRVNFQ1QgTk9UIFNVUFBPUlRFRCAqLwotCXt7MHgxMywgMHhmNX0sIHsweDAxLCAweDQzfSwgezB4MDIsIDB4NWR9LAotCQl7MHgxNSwgMHgwMH0sfSwJLypEQVlMSUdIVCovCi0Je3sweDEzLCAweGY1fSwgezB4MDEsIDB4NDh9LCB7MHgwMiwgMHg2M30sCi0JCXsweDE1LCAweDAwfSx9LAkvKkNMT1VEWSovCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgb3Y3NjkyX3diX29lbV9jb25mc1tdWzFdID0gewotCXt7b3Y3NjkyX3diX29lbVswXSwgQVJSQVlfU0laRShvdjc2OTJfd2Jfb2VtWzBdKSwgIDAsCi0JCU1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX1dSSVRFX01BU0tfREFUQX0sfSwKLQl7e292NzY5Ml93Yl9vZW1bMV0sIEFSUkFZX1NJWkUob3Y3NjkyX3diX29lbVsxXSksICAwLAotCQlNU01fQ0FNRVJBX0kyQ19TRVRfQllURV9XUklURV9NQVNLX0RBVEF9LH0sCi0Je3tvdjc2OTJfd2Jfb2VtWzJdLCBBUlJBWV9TSVpFKG92NzY5Ml93Yl9vZW1bMl0pLCAgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3diX29lbVszXSwgQVJSQVlfU0laRShvdjc2OTJfd2Jfb2VtWzNdKSwgIDAsCi0JCU1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX1dSSVRFX01BU0tfREFUQX0sfSwKLQl7e292NzY5Ml93Yl9vZW1bNF0sIEFSUkFZX1NJWkUob3Y3NjkyX3diX29lbVs0XSksICAwLAotCQlNU01fQ0FNRVJBX0kyQ19TRVRfQllURV9XUklURV9NQVNLX0RBVEF9LH0sCi0Je3tvdjc2OTJfd2Jfb2VtWzVdLCBBUlJBWV9TSVpFKG92NzY5Ml93Yl9vZW1bNV0pLCAgMCwKLQkJTVNNX0NBTUVSQV9JMkNfU0VUX0JZVEVfV1JJVEVfTUFTS19EQVRBfSx9LAotCXt7b3Y3NjkyX3diX29lbVs2XSwgQVJSQVlfU0laRShvdjc2OTJfd2Jfb2VtWzZdKSwgIDAsCi0JCU1TTV9DQU1FUkFfSTJDX1NFVF9CWVRFX1dSSVRFX01BU0tfREFUQX0sfSwKLX07Ci0KLXN0YXRpYyBpbnQgb3Y3NjkyX3diX29lbV9lbnVtX21hcFtdID0gewotCU1TTV9WNEwyX1dCX09GRiwKLQlNU01fVjRMMl9XQl9BVVRPICwKLQlNU01fVjRMMl9XQl9DVVNUT00sCi0JTVNNX1Y0TDJfV0JfSU5DQU5ERVNDRU5ULAotCU1TTV9WNEwyX1dCX0ZMVU9SRVNDRU5ULAotCU1TTV9WNEwyX1dCX0RBWUxJR0hULAotCU1TTV9WNEwyX1dCX0NMT1VEWV9EQVlMSUdIVCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfZW51bV9jb25mX2FycmF5IG92NzY5Ml93Yl9vZW1fZW51bV9jb25mcyA9IHsKLQkuY29uZiA9ICZvdjc2OTJfd2Jfb2VtX2NvbmZzWzBdWzBdLAotCS5jb25mX2VudW0gPSBvdjc2OTJfd2Jfb2VtX2VudW1fbWFwLAotCS5udW1fZW51bSA9IEFSUkFZX1NJWkUob3Y3NjkyX3diX29lbV9lbnVtX21hcCksCi0JLm51bV9pbmRleCA9IEFSUkFZX1NJWkUob3Y3NjkyX3diX29lbV9jb25mcyksCi0JLm51bV9jb25mID0gQVJSQVlfU0laRShvdjc2OTJfd2Jfb2VtX2NvbmZzWzBdKSwKLQkuZGF0YV90eXBlID0gTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBLAotfTsKLQotCi1pbnQgb3Y3NjkyX3NhdHVyYXRpb25fbXNtX3NlbnNvcl9zX2N0cmxfYnlfZW51bSgKLQkJc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JCXN0cnVjdCBtc21fc2Vuc29yX3Y0bDJfY3RybF9pbmZvX3QgKmN0cmxfaW5mbywgaW50IHZhbHVlKQotewotCWludCByYyA9IDA7Ci0JaWYgKGVmZmVjdF92YWx1ZSA9PSBDQU1FUkFfRUZGRUNUX09GRikgewotCQlyYyA9IG1zbV9zZW5zb3Jfd3JpdGVfZW51bV9jb25mX2FycmF5KAotCQkJc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCWN0cmxfaW5mby0+ZW51bV9jZmdfc2V0dGluZ3MsIHZhbHVlKTsKLQl9Ci0JaWYgKHZhbHVlIDw9IE1TTV9WNEwyX1NBVFVSQVRJT05fTDgpCi0JCVNBVF9VID0gU0FUX1YgPSB2YWx1ZSAqIDB4MTA7Ci0JQ0RCRygiLS1DQU1FUkEtLSAlcyAuLi4oRW5kKVxuIiwgX19mdW5jX18pOwotCXJldHVybiByYzsKLX0KLQotCi1pbnQgb3Y3NjkyX2NvbnRyYXN0X21zbV9zZW5zb3Jfc19jdHJsX2J5X2VudW0oCi0JCXN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCQlzdHJ1Y3QgbXNtX3NlbnNvcl92NGwyX2N0cmxfaW5mb190ICpjdHJsX2luZm8sIGludCB2YWx1ZSkKLXsKLQlpbnQgcmMgPSAwOwotCWlmIChlZmZlY3RfdmFsdWUgPT0gQ0FNRVJBX0VGRkVDVF9PRkYpIHsKLQkJcmMgPSBtc21fc2Vuc29yX3dyaXRlX2VudW1fY29uZl9hcnJheSgKLQkJCXNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCQljdHJsX2luZm8tPmVudW1fY2ZnX3NldHRpbmdzLCB2YWx1ZSk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotaW50IG92NzY5Ml9zaGFycG5lc3NfbXNtX3NlbnNvcl9zX2N0cmxfYnlfZW51bSgKLQkJc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JCXN0cnVjdCBtc21fc2Vuc29yX3Y0bDJfY3RybF9pbmZvX3QgKmN0cmxfaW5mbywgaW50IHZhbHVlKQotewotCWludCByYyA9IDA7Ci0JaWYgKGVmZmVjdF92YWx1ZSA9PSBDQU1FUkFfRUZGRUNUX09GRikgewotCQlyYyA9IG1zbV9zZW5zb3Jfd3JpdGVfZW51bV9jb25mX2FycmF5KAotCQkJc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCWN0cmxfaW5mby0+ZW51bV9jZmdfc2V0dGluZ3MsIHZhbHVlKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgb3Y3NjkyX2VmZmVjdF9tc21fc2Vuc29yX3NfY3RybF9ieV9lbnVtKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCQlzdHJ1Y3QgbXNtX3NlbnNvcl92NGwyX2N0cmxfaW5mb190ICpjdHJsX2luZm8sIGludCB2YWx1ZSkKLXsKLQlpbnQgcmMgPSAwOwotCWVmZmVjdF92YWx1ZSA9IHZhbHVlOwotCWlmIChlZmZlY3RfdmFsdWUgPT0gQ0FNRVJBX0VGRkVDVF9PRkYpIHsKLQkJcmMgPSBtc21fc2Vuc29yX3dyaXRlX2NvbmZfYXJyYXkoCi0JCQlzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkJc19jdHJsLT5tc21fc2Vuc29yX3JlZy0+bm9fZWZmZWN0X3NldHRpbmdzLCAwKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJQ0RCRygid3JpdGUgZmFpZWxkXG4iKTsKLQkJCXJldHVybiByYzsKLQkJfQotCQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LCAweGRhLCBTQVRfVSwKLQkJCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsIDB4ZGIsIFNBVF9WLAotCQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQl9IGVsc2UgewotCQlyYyA9IG1zbV9zZW5zb3Jfd3JpdGVfZW51bV9jb25mX2FycmF5KAotCQkJc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCWN0cmxfaW5mby0+ZW51bV9jZmdfc2V0dGluZ3MsIHZhbHVlKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgb3Y3NjkyX2FudGliYW5kaW5nX21zbV9zZW5zb3Jfc19jdHJsX2J5X2VudW0oCi0JCXN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCQlzdHJ1Y3QgbXNtX3NlbnNvcl92NGwyX2N0cmxfaW5mb190ICpjdHJsX2luZm8sIGludCB2YWx1ZSkKLXsKLQlpbnQgcmMgPSAwOwotCQlyZXR1cm4gcmM7Ci19Ci0KLWludCBvdjc2OTJfbXNtX3NlbnNvcl9zX2N0cmxfYnlfZW51bShzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwKLQkJc3RydWN0IG1zbV9zZW5zb3JfdjRsMl9jdHJsX2luZm9fdCAqY3RybF9pbmZvLCBpbnQgdmFsdWUpCi17Ci0JaW50IHJjID0gMDsKLQlyYyA9IG1zbV9zZW5zb3Jfd3JpdGVfZW51bV9jb25mX2FycmF5KAotCQlzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQljdHJsX2luZm8tPmVudW1fY2ZnX3NldHRpbmdzLCB2YWx1ZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJ3cml0ZSBmYWllbGRcbiIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RydWN0IG1zbV9zZW5zb3JfdjRsMl9jdHJsX2luZm9fdCBvdjc2OTJfdjRsMl9jdHJsX2luZm9bXSA9IHsKLQl7Ci0JCS5jdHJsX2lkID0gVjRMMl9DSURfU0FUVVJBVElPTiwKLQkJLm1pbiA9IE1TTV9WNEwyX1NBVFVSQVRJT05fTDAsCi0JCS5tYXggPSBNU01fVjRMMl9TQVRVUkFUSU9OX0w4LAotCQkuc3RlcCA9IDEsCi0JCS5lbnVtX2NmZ19zZXR0aW5ncyA9ICZvdjc2OTJfc2F0dXJhdGlvbl9lbnVtX2NvbmZzLAotCQkuc192NGwyX2N0cmwgPSBvdjc2OTJfc2F0dXJhdGlvbl9tc21fc2Vuc29yX3NfY3RybF9ieV9lbnVtLAotCX0sCi0JewotCQkuY3RybF9pZCA9IFY0TDJfQ0lEX0NPTlRSQVNULAotCQkubWluID0gTVNNX1Y0TDJfQ09OVFJBU1RfTDAsCi0JCS5tYXggPSBNU01fVjRMMl9DT05UUkFTVF9MOCwKLQkJLnN0ZXAgPSAxLAotCQkuZW51bV9jZmdfc2V0dGluZ3MgPSAmb3Y3NjkyX2NvbnRyYXN0X2VudW1fY29uZnMsCi0JCS5zX3Y0bDJfY3RybCA9IG92NzY5Ml9jb250cmFzdF9tc21fc2Vuc29yX3NfY3RybF9ieV9lbnVtLAotCX0sCi0JewotCQkuY3RybF9pZCA9IFY0TDJfQ0lEX1NIQVJQTkVTUywKLQkJLm1pbiA9IE1TTV9WNEwyX1NIQVJQTkVTU19MMCwKLQkJLm1heCA9IE1TTV9WNEwyX1NIQVJQTkVTU19MNSwKLQkJLnN0ZXAgPSAxLAotCQkuZW51bV9jZmdfc2V0dGluZ3MgPSAmb3Y3NjkyX3NoYXJwbmVzc19lbnVtX2NvbmZzLAotCQkuc192NGwyX2N0cmwgPSBvdjc2OTJfc2hhcnBuZXNzX21zbV9zZW5zb3Jfc19jdHJsX2J5X2VudW0sCi0JfSwKLQl7Ci0JCS5jdHJsX2lkID0gVjRMMl9DSURfRVhQT1NVUkUsCi0JCS5taW4gPSBNU01fVjRMMl9FWFBPU1VSRV9OMiwKLQkJLm1heCA9IE1TTV9WNEwyX0VYUE9TVVJFX1AyLAotCQkuc3RlcCA9IDEsCi0JCS5lbnVtX2NmZ19zZXR0aW5ncyA9ICZvdjc2OTJfZXhwb3N1cmVfZW51bV9jb25mcywKLQkJLnNfdjRsMl9jdHJsID0gb3Y3NjkyX21zbV9zZW5zb3Jfc19jdHJsX2J5X2VudW0sCi0JfSwKLQl7Ci0JCS5jdHJsX2lkID0gTVNNX1Y0TDJfUElEX0lTTywKLQkJLm1pbiA9IE1TTV9WNEwyX0lTT19BVVRPLAotCQkubWF4ID0gTVNNX1Y0TDJfSVNPXzE2MDAsCi0JCS5zdGVwID0gMSwKLQkJLmVudW1fY2ZnX3NldHRpbmdzID0gJm92NzY5Ml9pc29fZW51bV9jb25mcywKLQkJLnNfdjRsMl9jdHJsID0gb3Y3NjkyX21zbV9zZW5zb3Jfc19jdHJsX2J5X2VudW0sCi0JfSwKLQl7Ci0JCS5jdHJsX2lkID0gVjRMMl9DSURfU1BFQ0lBTF9FRkZFQ1QsCi0JCS5taW4gPSBNU01fVjRMMl9FRkZFQ1RfT0ZGLAotCQkubWF4ID0gTVNNX1Y0TDJfRUZGRUNUX05FR0FUSVZFLAotCQkuc3RlcCA9IDEsCi0JCS5lbnVtX2NmZ19zZXR0aW5ncyA9ICZvdjc2OTJfc3BlY2lhbF9lZmZlY3RfZW51bV9jb25mcywKLQkJLnNfdjRsMl9jdHJsID0gb3Y3NjkyX2VmZmVjdF9tc21fc2Vuc29yX3NfY3RybF9ieV9lbnVtLAotCX0sCi0JewotCQkuY3RybF9pZCA9IFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZLAotCQkubWluID0gTVNNX1Y0TDJfUE9XRVJfTElORV82MEhaLAotCQkubWF4ID0gTVNNX1Y0TDJfUE9XRVJfTElORV9BVVRPLAotCQkuc3RlcCA9IDEsCi0JCS5lbnVtX2NmZ19zZXR0aW5ncyA9ICZvdjc2OTJfYW50aWJhbmRpbmdfZW51bV9jb25mcywKLQkJLnNfdjRsMl9jdHJsID0gb3Y3NjkyX2FudGliYW5kaW5nX21zbV9zZW5zb3Jfc19jdHJsX2J5X2VudW0sCi0JfSwKLQl7Ci0JCS5jdHJsX2lkID0gVjRMMl9DSURfV0hJVEVfQkFMQU5DRV9URU1QRVJBVFVSRSwKLQkJLm1pbiA9IE1TTV9WNEwyX1dCX09GRiwKLQkJLm1heCA9IE1TTV9WNEwyX1dCX0NMT1VEWV9EQVlMSUdIVCwKLQkJLnN0ZXAgPSAxLAotCQkuZW51bV9jZmdfc2V0dGluZ3MgPSAmb3Y3NjkyX3diX29lbV9lbnVtX2NvbmZzLAotCQkuc192NGwyX2N0cmwgPSBvdjc2OTJfbXNtX3NlbnNvcl9zX2N0cmxfYnlfZW51bSwKLQl9LAotCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3Jfb3V0cHV0X3JlZ19hZGRyX3Qgb3Y3NjkyX3JlZ19hZGRyID0gewotCS54X291dHB1dCA9IDB4Q0MsCi0JLnlfb3V0cHV0ID0gMHhDRSwKLQkubGluZV9sZW5ndGhfcGNsayA9IDB4QzgsCi0JLmZyYW1lX2xlbmd0aF9saW5lcyA9IDB4Q0EsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfaWRfaW5mb190IG92NzY5Ml9pZF9pbmZvID0gewotCS5zZW5zb3JfaWRfcmVnX2FkZHIgPSAweDBBLAotCS5zZW5zb3JfaWQgPSAweDc2OTIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgb3Y3NjkyX2kyY19pZFtdID0gewotCXtTRU5TT1JfTkFNRSwgKGtlcm5lbF91bG9uZ190KSZvdjc2OTJfc19jdHJsfSwKLQl7IH0KLX07Ci0KLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG92NzY5Ml9pMmNfZHJpdmVyID0gewotCS5pZF90YWJsZSA9IG92NzY5Ml9pMmNfaWQsCi0JLnByb2JlICA9IG1zbV9zZW5zb3JfaTJjX3Byb2JlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gU0VOU09SX05BTUUsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50IG92NzY5Ml9zZW5zb3JfaTJjX2NsaWVudCA9IHsKLQkuYWRkcl90eXBlID0gTVNNX0NBTUVSQV9JMkNfQllURV9BRERSLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX3NlbnNvcl9pbml0X21vZHVsZSh2b2lkKQotewotCWludCByYyA9IDA7Ci0JQ0RCRygiT1Y3NjkyXG4iKTsKLQotCXJjID0gaTJjX2FkZF9kcml2ZXIoJm92NzY5Ml9pMmNfZHJpdmVyKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBvdjc2OTJfc3ViZGV2X2NvcmVfb3BzID0gewotCS5zX2N0cmwgPSBtc21fc2Vuc29yX3Y0bDJfc19jdHJsLAotCS5xdWVyeWN0cmwgPSBtc21fc2Vuc29yX3Y0bDJfcXVlcnlfY3RybCwKLQkuaW9jdGwgPSBtc21fc2Vuc29yX3N1YmRldl9pb2N0bCwKLQkuc19wb3dlciA9IG1zbV9zZW5zb3JfcG93ZXIsCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBvdjc2OTJfc3ViZGV2X3ZpZGVvX29wcyA9IHsKLQkuZW51bV9tYnVzX2ZtdCA9IG1zbV9zZW5zb3JfdjRsMl9lbnVtX2ZtdCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG92NzY5Ml9zdWJkZXZfb3BzID0gewotCS5jb3JlID0gJm92NzY5Ml9zdWJkZXZfY29yZV9vcHMsCi0JLnZpZGVvICA9ICZvdjc2OTJfc3ViZGV2X3ZpZGVvX29wcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9mbl90IG92NzY5Ml9mdW5jX3RibCA9IHsKLQkuc2Vuc29yX3N0YXJ0X3N0cmVhbSA9IG1zbV9zZW5zb3Jfc3RhcnRfc3RyZWFtLAotCS5zZW5zb3Jfc3RvcF9zdHJlYW0gPSBtc21fc2Vuc29yX3N0b3Bfc3RyZWFtLAotCS5zZW5zb3JfY3NpX3NldHRpbmcgPSBtc21fc2Vuc29yX3NldHRpbmcxLAotCS5zZW5zb3Jfc2V0X3NlbnNvcl9tb2RlID0gbXNtX3NlbnNvcl9zZXRfc2Vuc29yX21vZGUsCi0JLnNlbnNvcl9tb2RlX2luaXQgPSBtc21fc2Vuc29yX21vZGVfaW5pdCwKLQkuc2Vuc29yX2dldF9vdXRwdXRfaW5mbyA9IG1zbV9zZW5zb3JfZ2V0X291dHB1dF9pbmZvLAotCS5zZW5zb3JfY29uZmlnID0gbXNtX3NlbnNvcl9jb25maWcsCi0JLnNlbnNvcl9wb3dlcl91cCA9IG1zbV9zZW5zb3JfcG93ZXJfdXAsCi0JLnNlbnNvcl9wb3dlcl9kb3duID0gbXNtX3NlbnNvcl9wb3dlcl9kb3duLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX3JlZ190IG92NzY5Ml9yZWdzID0gewotCS5kZWZhdWx0X2RhdGFfdHlwZSA9IE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSwKLQkuc3RhcnRfc3RyZWFtX2NvbmYgPSBvdjc2OTJfc3RhcnRfc2V0dGluZ3MsCi0JLnN0YXJ0X3N0cmVhbV9jb25mX3NpemUgPSBBUlJBWV9TSVpFKG92NzY5Ml9zdGFydF9zZXR0aW5ncyksCi0JLnN0b3Bfc3RyZWFtX2NvbmYgPSBvdjc2OTJfc3RvcF9zZXR0aW5ncywKLQkuc3RvcF9zdHJlYW1fY29uZl9zaXplID0gQVJSQVlfU0laRShvdjc2OTJfc3RvcF9zZXR0aW5ncyksCi0JLmluaXRfc2V0dGluZ3MgPSAmb3Y3NjkyX2luaXRfY29uZlswXSwKLQkuaW5pdF9zaXplID0gQVJSQVlfU0laRShvdjc2OTJfaW5pdF9jb25mKSwKLQkubW9kZV9zZXR0aW5ncyA9ICZvdjc2OTJfY29uZnNbMF0sCi0JLm5vX2VmZmVjdF9zZXR0aW5ncyA9ICZvdjc2OTJfbm9fZWZmZWN0X2NvbmZzWzBdLAotCS5vdXRwdXRfc2V0dGluZ3MgPSAmb3Y3NjkyX2RpbWVuc2lvbnNbMF0sCi0JLm51bV9jb25mID0gQVJSQVlfU0laRShvdjc2OTJfY29uZnMpLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCBvdjc2OTJfc19jdHJsID0gewotCS5tc21fc2Vuc29yX3JlZyA9ICZvdjc2OTJfcmVncywKLQkubXNtX3NlbnNvcl92NGwyX2N0cmxfaW5mbyA9IG92NzY5Ml92NGwyX2N0cmxfaW5mbywKLQkubnVtX3Y0bDJfY3RybCA9IEFSUkFZX1NJWkUob3Y3NjkyX3Y0bDJfY3RybF9pbmZvKSwKLQkuc2Vuc29yX2kyY19jbGllbnQgPSAmb3Y3NjkyX3NlbnNvcl9pMmNfY2xpZW50LAotCS5zZW5zb3JfaTJjX2FkZHIgPSAweDc4LAotCS5zZW5zb3Jfb3V0cHV0X3JlZ19hZGRyID0gJm92NzY5Ml9yZWdfYWRkciwKLQkuc2Vuc29yX2lkX2luZm8gPSAmb3Y3NjkyX2lkX2luZm8sCi0JLmNhbV9tb2RlID0gTVNNX1NFTlNPUl9NT0RFX0lOVkFMSUQsCi0JLm1zbV9zZW5zb3JfbXV0ZXggPSAmb3Y3NjkyX211dCwKLQkuc2Vuc29yX2kyY19kcml2ZXIgPSAmb3Y3NjkyX2kyY19kcml2ZXIsCi0JLnNlbnNvcl92NGwyX3N1YmRldl9pbmZvID0gb3Y3NjkyX3N1YmRldl9pbmZvLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfaW5mb19zaXplID0gQVJSQVlfU0laRShvdjc2OTJfc3ViZGV2X2luZm8pLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfb3BzID0gJm92NzY5Ml9zdWJkZXZfb3BzLAotCS5mdW5jX3RibCA9ICZvdjc2OTJfZnVuY190YmwsCi0JLmNsa19yYXRlID0gTVNNX1NFTlNPUl9NQ0xLXzI0SFosCi19OwotCi1tb2R1bGVfaW5pdChtc21fc2Vuc29yX2luaXRfbW9kdWxlKTsKLU1PRFVMRV9ERVNDUklQVElPTigiT21uaXZpc2lvbiBWR0EgWVVWIHNlbnNvciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL292ODgyNV92NGwyLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9vdjg4MjVfdjRsMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGY0NjE5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL292ODgyNV92NGwyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MzcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSAibXNtX3NlbnNvci5oIgotI2luY2x1ZGUgIm1zbS5oIgotI2RlZmluZSBTRU5TT1JfTkFNRSAib3Y4ODI1IgotI2RlZmluZSBQTEFURk9STV9EUklWRVJfTkFNRSAibXNtX2NhbWVyYV9vdjg4MjUiCi0jZGVmaW5lIG92ODgyNV9vYmogb3Y4ODI1XyMjb2JqCi0KLS8qIFRPIERPIC0gQ3VycmVudGx5IG92NTY0NyB0eXBpY2FsIHZhbHVlcyBhcmUgdXNlZAotICogTmVlZCB0byBnZXQgdGhlIGV4YWN0IHZhbHVlcyAqLwotI2RlZmluZSBPVjg4MjVfUkdfUkFUSU9fVFlQSUNBTF9WQUxVRSA2NCAvKiBSL0cgb2YgdHlwaWNhbCBjYW1lcmEgbW9kdWxlICovCi0jZGVmaW5lIE9WODgyNV9CR19SQVRJT19UWVBJQ0FMX1ZBTFVFIDEwNSAvKiBCL0cgb2YgdHlwaWNhbCBjYW1lcmEgbW9kdWxlICovCi0KLURFRklORV9NVVRFWChvdjg4MjVfbXV0KTsKLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3Qgb3Y4ODI1X3NfY3RybDsKLQotc3RydWN0IG90cF9zdHJ1Y3QgewotCXVpbnQ4X3QgY3VzdG9tZXJfaWQ7Ci0JdWludDhfdCBtb2R1bGVfaW50ZWdyYXRvcl9pZDsKLQl1aW50OF90IGxlbnNfaWQ7Ci0JdWludDhfdCByZ19yYXRpbzsKLQl1aW50OF90IGJnX3JhdGlvOwotCXVpbnQ4X3QgdXNlcl9kYXRhWzVdOwotfSBzdF9vdjg4MjVfb3RwOwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIG92ODgyNV9zdGFydF9zZXR0aW5nc1tdID0gewotCXsweDAxMDAsIDB4MDF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjg4MjVfc3RvcF9zZXR0aW5nc1tdID0gewotCXsweDAxMDAsIDB4MDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjg4MjVfZ3JvdXBvbl9zZXR0aW5nc1tdID0gewotCXsweDMyMDgsIDB4MDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjg4MjVfZ3JvdXBvZmZfc2V0dGluZ3NbXSA9IHsKLQl7MHgzMjA4LCAweDEwfSwKLQl7MHgzMjA4LCAweEEwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3Y4ODI1X3ByZXZfc2V0dGluZ3NbXSA9IHsKLQl7MHgzMDAzLCAweGNlfSwgLypQTExfQ1RSTDAqLwotCXsweDMwMDQsIDB4ZDR9LCAvKlBMTF9DVFJMMSovCi0JezB4MzAwNSwgMHgwMH0sIC8qUExMX0NUUkwyKi8KLQl7MHgzMDA2LCAweDEwfSwgLypQTExfQ1RSTDMqLwotCXsweDMwMDcsIDB4M2J9LCAvKlBMTF9DVFJMNCovCi0JezB4MzAxMSwgMHgwMX0sIC8qTUlQSV9MYW5lXzRfTGFuZSovCi0JezB4MzAxMiwgMHg4MH0sIC8qU0NfUExMIENUUkxfUzAqLwotCXsweDMwMTMsIDB4Mzl9LCAvKlNDX1BMTCBDVFJMX1MxKi8KLQl7MHgzMTA0LCAweDIwfSwgLypTQ0NCX1BMTCovCi0JezB4MzEwNiwgMHgxNX0sIC8qU1JCX0NUUkwqLwotCXsweDM1MDEsIDB4NGV9LCAvKkFFQ19ISUdIKi8KLQl7MHgzNTAyLCAweGEwfSwgLypBRUNfTE9XKi8KLQl7MHgzNTBiLCAweDFmfSwgLypBR0MqLwotCXsweDM2MDAsIDB4MDZ9LCAvKkFOQUNUUkwwKi8KLQl7MHgzNjAxLCAweDM0fSwgLypBTkFDVFJMMSovCi0JezB4MzcwMCwgMHgyMH0sIC8qU0VOQ1RST0wwIFNlbnNvciBjb250cm9sKi8KLQl7MHgzNzAyLCAweDUwfSwgLypTRU5DVFJPTDIgU2Vuc29yIGNvbnRyb2wqLwotCXsweDM3MDMsIDB4Y2N9LCAvKlNFTkNUUk9MMyBTZW5zb3IgY29udHJvbCovCi0JezB4MzcwNCwgMHgxOX0sIC8qU0VOQ1RST0w0IFNlbnNvciBjb250cm9sKi8KLQl7MHgzNzA1LCAweDE0fSwgLypTRU5DVFJPTDUgU2Vuc29yIGNvbnRyb2wqLwotCXsweDM3MDYsIDB4NGJ9LCAvKlNFTkNUUk9MNiBTZW5zb3IgY29udHJvbCovCi0JezB4MzcwNywgMHg2M30sIC8qU0VOQ1RST0w3IFNlbnNvciBjb250cm9sKi8KLQl7MHgzNzA4LCAweDg0fSwgLypTRU5DVFJPTDggU2Vuc29yIGNvbnRyb2wqLwotCXsweDM3MDksIDB4NDB9LCAvKlNFTkNUUk9MOSBTZW5zb3IgY29udHJvbCovCi0JezB4MzcwYSwgMHgxMn0sIC8qU0VOQ1RST0xBIFNlbnNvciBjb250cm9sKi8KLQl7MHgzNzBlLCAweDAwfSwgLypTRU5DVFJPTEUgU2Vuc29yIGNvbnRyb2wqLwotCXsweDM3MTEsIDB4MGZ9LCAvKlNFTkNUUk9MMTEgU2Vuc29yIGNvbnRyb2wqLwotCXsweDM3MTIsIDB4OWN9LCAvKlNFTkNUUk9MMTIgU2Vuc29yIGNvbnRyb2wqLwotCXsweDM3MjQsIDB4MDF9LCAvKlJlc2VydmVkKi8KLQl7MHgzNzI1LCAweDkyfSwgLypSZXNlcnZlZCovCi0JezB4MzcyNiwgMHgwMX0sIC8qUmVzZXJ2ZWQqLwotCXsweDM3MjcsIDB4YTl9LCAvKlJlc2VydmVkKi8KLQl7MHgzODAwLCAweDAwfSwgLypIUyhIUkVGIHN0YXJ0IEhpZ2gpKi8KLQl7MHgzODAxLCAweDAwfSwgLypIUyhIUkVGIHN0YXJ0IExvdykqLwotCXsweDM4MDIsIDB4MDB9LCAvKlZTKFZlcnRpY2FsIHN0YXJ0IEhpZ2gpKi8KLQl7MHgzODAzLCAweDAwfSwgLypWUyhWZXJ0aWNhbCBzdGFydCBMb3cpKi8KLQl7MHgzODA0LCAweDBjfSwgLypIVyA9IDMyOTUqLwotCXsweDM4MDUsIDB4ZGZ9LCAvKkhXKi8KLQl7MHgzODA2LCAweDA5fSwgLypWSCA9IDI0NTkqLwotCXsweDM4MDcsIDB4OWJ9LCAvKlZIKi8KLQl7MHgzODA4LCAweDA2fSwgLypJU1BITyA9IDE2MzIqLwotCXsweDM4MDksIDB4NjB9LCAvKklTUEhPKi8KLQl7MHgzODBhLCAweDA0fSwgLypJU1BWTyA9IDEyMjQqLwotCXsweDM4MGIsIDB4Yzh9LCAvKklTUFZPKi8KLQl7MHgzODBjLCAweDBkfSwgLypIVFMgPSAzNTE2Ki8KLQl7MHgzODBkLCAweGJjfSwgLypIVFMqLwotCXsweDM4MGUsIDB4MDR9LCAvKlZUUyA9IDEyNjQqLwotCXsweDM4MGYsIDB4ZjB9LCAvKlZUUyovCi0JezB4MzgxMCwgMHgwMH0sIC8qSE9GRiA9IDgqLwotCXsweDM4MTEsIDB4MDh9LCAvKkhPRkYqLwotCXsweDM4MTIsIDB4MDB9LCAvKlZPRkYgPSA0Ki8KLQl7MHgzODEzLCAweDA0fSwgLypWT0ZGKi8KLQl7MHgzODE0LCAweDMxfSwgLypYIElOQyovCi0JezB4MzgxNSwgMHgzMX0sIC8qWSBJTkMqLwotCXsweDM4MjAsIDB4ODF9LCAvKlRpbWluZyBSZWcyMDpWZmxpcCovCi0JezB4MzgyMSwgMHgxN30sIC8qVGltaW5nIFJlZzIxOkhtaXJyb3IqLwotCXsweDNmMDAsIDB4MDB9LCAvKlBTUkFNIEN0cmwwKi8KLQl7MHgzZjAxLCAweGZjfSwgLypQU1JBTSBDdHJsMSovCi0JezB4M2YwNSwgMHgxMH0sIC8qUFNSQU0gQ3RybDUqLwotCXsweDQ2MDAsIDB4MDR9LCAvKlZGSUZPIEN0cmwwKi8KLQl7MHg0NjAxLCAweDAwfSwgLypWRklGTyBSZWFkIFNUIEhpZ2gqLwotCXsweDQ2MDIsIDB4MzB9LCAvKlZGSUZPIFJlYWQgU1QgTG93Ki8KLQl7MHg0ODM3LCAweDI4fSwgLypNSVBJIFBDTEsgUEVSSU9EKi8KLQl7MHg1MDY4LCAweDAwfSwgLypIU0NBTEVfQ1RSTCovCi0JezB4NTA2YSwgMHgwMH0sIC8qVlNDQUxFX0NUUkwqLwotCXsweDVjMDAsIDB4ODB9LCAvKlBCTEMgQ1RSTDAwKi8KLQl7MHg1YzAxLCAweDAwfSwgLypQQkxDIENUUkwwMSovCi0JezB4NWMwMiwgMHgwMH0sIC8qUEJMQyBDVFJMMDIqLwotCXsweDVjMDMsIDB4MDB9LCAvKlBCTEMgQ1RSTDAzKi8KLQl7MHg1YzA0LCAweDAwfSwgLypQQkxDIENUUkwwNCovCi0JezB4NWMwOCwgMHgxMH0sIC8qUEJMQyBDVFJMMDgqLwotCXsweDY5MDAsIDB4NjF9LCAvKkNBREMgQ1RSTDAwKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3Y4ODI1X3NuYXBfc2V0dGluZ3NbXSA9IHsKLQl7MHgzMDAzLCAweGNlfSwgLypQTExfQ1RSTDAqLwotCXsweDMwMDQsIDB4ZDh9LCAvKlBMTF9DVFJMMSovCi0JezB4MzAwNSwgMHgwMH0sIC8qUExMX0NUUkwyKi8KLQl7MHgzMDA2LCAweDEwfSwgLypQTExfQ1RSTDMqLwotCXsweDMwMDcsIDB4M2J9LCAvKlBMTF9DVFJMNCovCi0JezB4MzAxMSwgMHgwMX0sIC8qTUlQSV9MYW5lXzRfTGFuZSovCi0JezB4MzAxMiwgMHg4MX0sIC8qU0NfUExMIENUUkxfUzAqLwotCXsweDMwMTMsIDB4Mzl9LCAvKlNDX1BMTCBDVFJMX1MxKi8KLQl7MHgzMTA0LCAweDIwfSwgLypTQ0NCX1BMTCovCi0JezB4MzEwNiwgMHgxMX0sIC8qU1JCX0NUUkwqLwotCXsweDM1MDEsIDB4OWF9LCAvKkFFQ19ISUdIKi8KLQl7MHgzNTAyLCAweGEwfSwgLypBRUNfTE9XKi8KLQl7MHgzNTBiLCAweDFmfSwgLypBR0MqLwotCXsweDM2MDAsIDB4MDd9LCAvKkFOQUNUUkwwKi8KLQl7MHgzNjAxLCAweDMzfSwgLypBTkFDVFJMMSovCi0JezB4MzcwMCwgMHgxMH0sIC8qU0VOQ1RST0wwIFNlbnNvciBjb250cm9sKi8KLQl7MHgzNzAyLCAweDI4fSwgLypTRU5DVFJPTDIgU2Vuc29yIGNvbnRyb2wqLwotCXsweDM3MDMsIDB4NmN9LCAvKlNFTkNUUk9MMyBTZW5zb3IgY29udHJvbCovCi0JezB4MzcwNCwgMHg4ZH0sIC8qU0VOQ1RST0w0IFNlbnNvciBjb250cm9sKi8KLQl7MHgzNzA1LCAweDBhfSwgLypTRU5DVFJPTDUgU2Vuc29yIGNvbnRyb2wqLwotCXsweDM3MDYsIDB4Mjd9LCAvKlNFTkNUUk9MNiBTZW5zb3IgY29udHJvbCovCi0JezB4MzcwNywgMHg2M30sIC8qU0VOQ1RST0w3IFNlbnNvciBjb250cm9sKi8KLQl7MHgzNzA4LCAweDQwfSwgLypTRU5DVFJPTDggU2Vuc29yIGNvbnRyb2wqLwotCXsweDM3MDksIDB4MjB9LCAvKlNFTkNUUk9MOSBTZW5zb3IgY29udHJvbCovCi0JezB4MzcwYSwgMHgxMn0sIC8qU0VOQ1RST0xBIFNlbnNvciBjb250cm9sKi8KLQl7MHgzNzBlLCAweDAwfSwgLypTRU5DVFJPTEUgU2Vuc29yIGNvbnRyb2wqLwotCXsweDM3MTEsIDB4MDd9LCAvKlNFTkNUUk9MMTEgU2Vuc29yIGNvbnRyb2wqLwotCXsweDM3MTIsIDB4NGV9LCAvKlNFTkNUUk9MMTIgU2Vuc29yIGNvbnRyb2wqLwotCXsweDM3MjQsIDB4MDB9LCAvKlJlc2VydmVkKi8KLQl7MHgzNzI1LCAweGQ0fSwgLypSZXNlcnZlZCovCi0JezB4MzcyNiwgMHgwMH0sIC8qUmVzZXJ2ZWQqLwotCXsweDM3MjcsIDB4ZTF9LCAvKlJlc2VydmVkKi8KLQl7MHgzODAwLCAweDAwfSwgLypIUyhIUkVGIHN0YXJ0IEhpZ2gpKi8KLQl7MHgzODAxLCAweDAwfSwgLypIUyhIUkVGIHN0YXJ0IExvdykqLwotCXsweDM4MDIsIDB4MDB9LCAvKlZTKFZlcnRpY2FsIHN0YXJ0IEhnaCkqLwotCXsweDM4MDMsIDB4MDB9LCAvKlZTKFZlcnRpY2FsIHN0YXJ0IExvdykqLwotCXsweDM4MDQsIDB4MGN9LCAvKkhXID0gMzI5NSovCi0JezB4MzgwNSwgMHhkZn0sIC8qSFcqLwotCXsweDM4MDYsIDB4MDl9LCAvKlZIID0gMjQ1OSovCi0JezB4MzgwNywgMHg5Yn0sIC8qVkgqLwotCXsweDM4MDgsIDB4MGN9LCAvKklTUEhPID0gMTYzMiovCi0JezB4MzgwOSwgMHhjMH0sIC8qSVNQSE8qLwotCXsweDM4MGEsIDB4MDl9LCAvKklTUFZPID0gMTIyNCovCi0JezB4MzgwYiwgMHg5MH0sIC8qSVNQVk8qLwotCXsweDM4MGMsIDB4MGV9LCAvKkhUUyA9IDM1MTYqLwotCXsweDM4MGQsIDB4MDB9LCAvKkhUUyovCi0JezB4MzgwZSwgMHgwOX0sIC8qVlRTID0gMTI2NCovCi0JezB4MzgwZiwgMHhiMH0sIC8qVlRTKi8KLQl7MHgzODEwLCAweDAwfSwgLypIT0ZGID0gOCovCi0JezB4MzgxMSwgMHgxMH0sIC8qSE9GRiovCi0JezB4MzgxMiwgMHgwMH0sIC8qVk9GRiA9IDQqLwotCXsweDM4MTMsIDB4MDZ9LCAvKlZPRkYqLwotCXsweDM4MTQsIDB4MTF9LCAvKlggSU5DKi8KLQl7MHgzODE1LCAweDExfSwgLypZIElOQyovCi0JezB4MzgyMCwgMHg4MH0sIC8qVGltaW5nIFJlZzIwOlZmbGlwKi8KLQl7MHgzODIxLCAweDE2fSwgLypUaW1pbmcgUmVnMjE6SG1pcnJvciovCi0JezB4M2YwMCwgMHgwMn0sIC8qUFNSQU0gQ3RybDAqLwotCXsweDNmMDEsIDB4ZmN9LCAvKlBTUkFNIEN0cmwxKi8KLQl7MHgzZjA1LCAweDEwfSwgLypQU1JBTSBDdHJsNSovCi0JezB4NDYwMCwgMHgwNH0sIC8qVkZJRk8gQ3RybDAqLwotCXsweDQ2MDEsIDB4MDB9LCAvKlZGSUZPIFJlYWQgU1QgSGlnaCovCi0JezB4NDYwMiwgMHg3OH0sIC8qVkZJRk8gUmVhZCBTVCBMb3cqLwotCXsweDQ4MzcsIDB4Mjh9LCAvKk1JUEkgUENMSyBQRVJJT0QqLwotCXsweDUwNjgsIDB4MDB9LCAvKkhTQ0FMRV9DVFJMKi8KLQl7MHg1MDZhLCAweDAwfSwgLypWU0NBTEVfQ1RSTCovCi0JezB4NWMwMCwgMHg4MH0sIC8qUEJMQyBDVFJMMDAqLwotCXsweDVjMDEsIDB4MDB9LCAvKlBCTEMgQ1RSTDAxKi8KLQl7MHg1YzAyLCAweDAwfSwgLypQQkxDIENUUkwwMiovCi0JezB4NWMwMywgMHgwMH0sIC8qUEJMQyBDVFJMMDMqLwotCXsweDVjMDQsIDB4MDB9LCAvKlBCTEMgQ1RSTDA0Ki8KLQl7MHg1YzA4LCAweDEwfSwgLypQQkxDIENUUkwwOCovCi0JezB4NjkwMCwgMHg2MX0sIC8qQ0FEQyBDVFJMMDAqLwotfTsKLQotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIG92ODgyNV9yZXNldF9zZXR0aW5nc1tdID0gewotCXsweDAxMDMsIDB4MDF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjg4MjVfcmVjb21tZW5kX3NldHRpbmdzW10gPSB7Ci0JezB4MzAwMCwgMHgxNn0sCi0JezB4MzAwMSwgMHgwMH0sCi0JezB4MzAwMiwgMHg2Y30sCi0JezB4MzAwZCwgMHgwMH0sCi0JezB4MzAxZiwgMHgwOX0sCi0JezB4MzAxMCwgMHgwMH0sCi0JezB4MzAxOCwgMHgwMH0sCi0JezB4MzMwMCwgMHgwMH0sCi0JezB4MzUwMCwgMHgwMH0sCi0JezB4MzUwMywgMHgwN30sCi0JezB4MzUwOSwgMHgwMH0sCi0JezB4MzYwMiwgMHg0Mn0sCi0JezB4MzYwMywgMHg1Y30sCi0JezB4MzYwNCwgMHg5OH0sCi0JezB4MzYwNSwgMHhmNX0sCi0JezB4MzYwOSwgMHhiNH0sCi0JezB4MzYwYSwgMHg3Y30sCi0JezB4MzYwYiwgMHhjOX0sCi0JezB4MzYwYywgMHgwYn0sCi0JezB4MzYxMiwgMHgwMH0sCi0JezB4MzYxMywgMHgwMn0sCi0JezB4MzYxNCwgMHgwZn0sCi0JezB4MzYxNSwgMHgwMH0sCi0JezB4MzYxNiwgMHgwM30sCi0JezB4MzYxNywgMHhhMX0sCi0JezB4MzYxOCwgMHgwMH0sCi0JezB4MzYxOSwgMHgwMH0sCi0JezB4MzYxYSwgMHhCMH0sCi0JezB4MzYxYiwgMHgwNH0sCi0JezB4MzYxYywgMHgwN30sCi0JezB4MzcwMSwgMHg0NH0sCi0JezB4MzcwYiwgMHgwMX0sCi0JezB4MzcwYywgMHg1MH0sCi0JezB4MzcwZCwgMHgwMH0sCi0JezB4MzgxNiwgMHgwMn0sCi0JezB4MzgxNywgMHg0MH0sCi0JezB4MzgxOCwgMHgwMH0sCi0JezB4MzgxOSwgMHg0MH0sCi0JezB4M2IxZiwgMHgwMH0sCi0JezB4M2QwMCwgMHgwMH0sCi0JezB4M2QwMSwgMHgwMH0sCi0JezB4M2QwMiwgMHgwMH0sCi0JezB4M2QwMywgMHgwMH0sCi0JezB4M2QwNCwgMHgwMH0sCi0JezB4M2QwNSwgMHgwMH0sCi0JezB4M2QwNiwgMHgwMH0sCi0JezB4M2QwNywgMHgwMH0sCi0JezB4M2QwOCwgMHgwMH0sCi0JezB4M2QwOSwgMHgwMH0sCi0JezB4M2QwYSwgMHgwMH0sCi0JezB4M2QwYiwgMHgwMH0sCi0JezB4M2QwYywgMHgwMH0sCi0JezB4M2QwZCwgMHgwMH0sCi0JezB4M2QwZSwgMHgwMH0sCi0JezB4M2QwZiwgMHgwMH0sCi0JezB4M2QxMCwgMHgwMH0sCi0JezB4M2QxMSwgMHgwMH0sCi0JezB4M2QxMiwgMHgwMH0sCi0JezB4M2QxMywgMHgwMH0sCi0JezB4M2QxNCwgMHgwMH0sCi0JezB4M2QxNSwgMHgwMH0sCi0JezB4M2QxNiwgMHgwMH0sCi0JezB4M2QxNywgMHgwMH0sCi0JezB4M2QxOCwgMHgwMH0sCi0JezB4M2QxOSwgMHgwMH0sCi0JezB4M2QxYSwgMHgwMH0sCi0JezB4M2QxYiwgMHgwMH0sCi0JezB4M2QxYywgMHgwMH0sCi0JezB4M2QxZCwgMHgwMH0sCi0JezB4M2QxZSwgMHgwMH0sCi0JezB4M2QxZiwgMHgwMH0sCi0JezB4M2Q4MCwgMHgwMH0sCi0JezB4M2Q4MSwgMHgwMH0sCi0JezB4M2Q4NCwgMHgwMH0sCi0JezB4M2YwNiwgMHgwMH0sCi0JezB4M2YwNywgMHgwMH0sCi0JezB4NDAwMCwgMHgyOX0sCi0JezB4NDAwMSwgMHgwMn0sCi0JezB4NDAwMiwgMHg0NX0sCi0JezB4NDAwMywgMHgwOH0sCi0JezB4NDAwNCwgMHgwNH0sCi0JezB4NDAwNSwgMHgxOH0sCi0JezB4NDMwMCwgMHhmZn0sCi0JezB4NDMwMywgMHgwMH0sCi0JezB4NDMwNCwgMHgwOH0sCi0JezB4NDMwNywgMHgwMH0sCi0JezB4NDgwMCwgMHgwNH0sCi0JezB4NDgwMSwgMHgwZn0sCi0JezB4NDg0MywgMHgwMn0sCi0JezB4NTAwMCwgMHgwNn0sCi0JezB4NTAwMSwgMHgwMH0sCi0JezB4NTAwMiwgMHgwMH0sCi0JezB4NTAxZiwgMHgwMH0sCi0JezB4NTc4MCwgMHhmY30sCi0JezB4NWMwNSwgMHgwMH0sCi0JezB4NWMwNiwgMHgwMH0sCi0JezB4NWMwNywgMHg4MH0sCi0JezB4NjcwMCwgMHgwNX0sCi0JezB4NjcwMSwgMHgxOX0sCi0JezB4NjcwMiwgMHhmZH0sCi0JezB4NjcwMywgMHhkN30sCi0JezB4NjcwNCwgMHhmZn0sCi0JezB4NjcwNSwgMHhmZn0sCi0JezB4NjgwMCwgMHgxMH0sCi0JezB4NjgwMSwgMHgwMn0sCi0JezB4NjgwMiwgMHg5MH0sCi0JezB4NjgwMywgMHgxMH0sCi0JezB4NjgwNCwgMHg1OX0sCi0JezB4NjkwMSwgMHgwNH0sCi0JezB4NTgwMCwgMHgwZn0sCi0JezB4NTgwMSwgMHgwZH0sCi0JezB4NTgwMiwgMHgwOX0sCi0JezB4NTgwMywgMHgwYX0sCi0JezB4NTgwNCwgMHgwZH0sCi0JezB4NTgwNSwgMHgxNH0sCi0JezB4NTgwNiwgMHgwYX0sCi0JezB4NTgwNywgMHgwNH0sCi0JezB4NTgwOCwgMHgwM30sCi0JezB4NTgwOSwgMHgwM30sCi0JezB4NTgwYSwgMHgwNX0sCi0JezB4NTgwYiwgMHgwYX0sCi0JezB4NTgwYywgMHgwNX0sCi0JezB4NTgwZCwgMHgwMn0sCi0JezB4NTgwZSwgMHgwMH0sCi0JezB4NTgwZiwgMHgwMH0sCi0JezB4NTgxMCwgMHgwM30sCi0JezB4NTgxMSwgMHgwNX0sCi0JezB4NTgxMiwgMHgwOX0sCi0JezB4NTgxMywgMHgwM30sCi0JezB4NTgxNCwgMHgwMX0sCi0JezB4NTgxNSwgMHgwMX0sCi0JezB4NTgxNiwgMHgwNH0sCi0JezB4NTgxNywgMHgwOX0sCi0JezB4NTgxOCwgMHgwOX0sCi0JezB4NTgxOSwgMHgwOH0sCi0JezB4NTgxYSwgMHgwNn0sCi0JezB4NTgxYiwgMHgwNn0sCi0JezB4NTgxYywgMHgwOH0sCi0JezB4NTgxZCwgMHgwNn0sCi0JezB4NTgxZSwgMHgzM30sCi0JezB4NTgxZiwgMHgxMX0sCi0JezB4NTgyMCwgMHgwZX0sCi0JezB4NTgyMSwgMHgwZn0sCi0JezB4NTgyMiwgMHgxMX0sCi0JezB4NTgyMywgMHgzZn0sCi0JezB4NTgyNCwgMHgwOH0sCi0JezB4NTgyNSwgMHg0Nn0sCi0JezB4NTgyNiwgMHg0Nn0sCi0JezB4NTgyNywgMHg0Nn0sCi0JezB4NTgyOCwgMHg0Nn0sCi0JezB4NTgyOSwgMHg0Nn0sCi0JezB4NTgyYSwgMHg0Mn0sCi0JezB4NTgyYiwgMHg0Mn0sCi0JezB4NTgyYywgMHg0NH0sCi0JezB4NTgyZCwgMHg0Nn0sCi0JezB4NTgyZSwgMHg0Nn0sCi0JezB4NTgyZiwgMHg2MH0sCi0JezB4NTgzMCwgMHg2Mn0sCi0JezB4NTgzMSwgMHg0Mn0sCi0JezB4NTgzMiwgMHg0Nn0sCi0JezB4NTgzMywgMHg0Nn0sCi0JezB4NTgzNCwgMHg0NH0sCi0JezB4NTgzNSwgMHg0NH0sCi0JezB4NTgzNiwgMHg0NH0sCi0JezB4NTgzNywgMHg0OH0sCi0JezB4NTgzOCwgMHgyOH0sCi0JezB4NTgzOSwgMHg0Nn0sCi0JezB4NTgzYSwgMHg0OH0sCi0JezB4NTgzYiwgMHg2OH0sCi0JezB4NTgzYywgMHgyOH0sCi0JezB4NTgzZCwgMHhhZX0sCi0JezB4NTg0MiwgMHgwMH0sCi0JezB4NTg0MywgMHhlZn0sCi0JezB4NTg0NCwgMHgwMX0sCi0JezB4NTg0NSwgMHgzZn0sCi0JezB4NTg0NiwgMHgwMX0sCi0JezB4NTg0NywgMHgzZn0sCi0JezB4NTg0OCwgMHgwMH0sCi0JezB4NTg0OSwgMHhkNX0sCi0JezB4MzUwMywgMHgwN30sCi0JezB4MzUwMCwgMHgwMH0sCi0JezB4MzUwMSwgMHgyN30sCi0JezB4MzUwMiwgMHgwMH0sCi0JezB4MzUwYiwgMHhmZn0sCi0JezB4MzQwMCwgMHgwNH0sCi0JezB4MzQwMSwgMHgwMH0sCi0JezB4MzQwMiwgMHgwNH0sCi0JezB4MzQwMywgMHgwMH0sCi0JezB4MzQwNCwgMHgwNH0sCi0JezB4MzQwNSwgMHgwMH0sCi0JezB4MzQwNiwgMHgwMX0sCi0JezB4NTAwMSwgMHgwMX0sCi0JezB4NTAwMCwgMHg4Nn0sLyogZW5hYmxlIGxlbnMgY29tcGVuc2F0aW9uIGFuZCBkcGMgKi8KLQkvKiBMRU5DIHNldHRpbmcgNzAlICovCi0JezB4NTgwMCwgMHgyMX0sCi0JezB4NTgwMSwgMHgxMH0sCi0JezB4NTgwMiwgMHgwOX0sCi0JezB4NTgwMywgMHgwYX0sCi0JezB4NTgwNCwgMHgwZn0sCi0JezB4NTgwNSwgMHgyM30sCi0JezB4NTgwNiwgMHgwOH0sCi0JezB4NTgwNywgMHgwNH0sCi0JezB4NTgwOCwgMHgwNH0sCi0JezB4NTgwOSwgMHgwNH0sCi0JezB4NTgwYSwgMHgwNH0sCi0JezB4NTgwYiwgMHgwYX0sCi0JezB4NTgwYywgMHgwNH0sCi0JezB4NTgwZCwgMHgwMn0sCi0JezB4NTgwZSwgMHgwMH0sCi0JezB4NTgwZiwgMHgwMH0sCi0JezB4NTgxMCwgMHgwM30sCi0JezB4NTgxMSwgMHgwNn0sCi0JezB4NTgxMiwgMHgwNX0sCi0JezB4NTgxMywgMHgwMn0sCi0JezB4NTgxNCwgMHgwMH0sCi0JezB4NTgxNSwgMHgwMH0sCi0JezB4NTgxNiwgMHgwM30sCi0JezB4NTgxNywgMHgwNn0sCi0JezB4NTgxOCwgMHgwOX0sCi0JezB4NTgxOSwgMHgwNX0sCi0JezB4NTgxYSwgMHgwNH0sCi0JezB4NTgxYiwgMHgwNH0sCi0JezB4NTgxYywgMHgwNX0sCi0JezB4NTgxZCwgMHgwYX0sCi0JezB4NTgxZSwgMHgyNH0sCi0JezB4NTgxZiwgMHgxMX0sCi0JezB4NTgyMCwgMHgwYX0sCi0JezB4NTgyMSwgMHgwYX0sCi0JezB4NTgyMiwgMHgxMH0sCi0JezB4NTgyMywgMHgyN30sCi0JezB4NTgyNCwgMHgyYX0sCi0JezB4NTgyNSwgMHg1OH0sCi0JezB4NTgyNiwgMHgyOH0sCi0JezB4NTgyNywgMHgyOH0sCi0JezB4NTgyOCwgMHgyOH0sCi0JezB4NTgyOSwgMHgyOH0sCi0JezB4NTgyYSwgMHg0Nn0sCi0JezB4NTgyYiwgMHg0NH0sCi0JezB4NTgyYywgMHg0Nn0sCi0JezB4NTgyZCwgMHg0Nn0sCi0JezB4NTgyZSwgMHgyOH0sCi0JezB4NTgyZiwgMHg2Mn0sCi0JezB4NTgzMCwgMHg2MH0sCi0JezB4NTgzMSwgMHg0Mn0sCi0JezB4NTgzMiwgMHgyOH0sCi0JezB4NTgzMywgMHg0OH0sCi0JezB4NTgzNCwgMHg0Nn0sCi0JezB4NTgzNSwgMHg0Nn0sCi0JezB4NTgzNiwgMHgyNn0sCi0JezB4NTgzNywgMHg0Nn0sCi0JezB4NTgzOCwgMHgyOH0sCi0JezB4NTgzOSwgMHg0OH0sCi0JezB4NTgzYSwgMHgyOH0sCi0JezB4NTgzYiwgMHgyOH0sCi0JezB4NTgzYywgMHgyNn0sCi0JezB4NTgzZCwgMHg5ZH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2luZm8gb3Y4ODI1X3N1YmRldl9pbmZvW10gPSB7Ci0JewotCQkuY29kZSAgID0gVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzFYMTAsCi0JCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCi0JCS5mbXQgICAgPSAxLAotCQkub3JkZXIgICAgPSAwLAotCX0sCi0JLyogbW9yZSBjYW4gYmUgc3VwcG9ydGVkLCB0byBiZSBhZGRlZCBsYXRlciAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5IG92ODgyNV9pbml0X2NvbmZbXSA9IHsKLQl7Jm92ODgyNV9yZXNldF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKG92ODgyNV9yZXNldF9zZXR0aW5ncyksIDUwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LAotCXsmb3Y4ODI1X3JlY29tbWVuZF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKG92ODgyNV9yZWNvbW1lbmRfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9Ci19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgb3Y4ODI1X2NvbmZzW10gPSB7Ci0JeyZvdjg4MjVfc25hcF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKG92ODgyNV9zbmFwX3NldHRpbmdzKSwgMCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLQl7Jm92ODgyNV9wcmV2X3NldHRpbmdzWzBdLAotCUFSUkFZX1NJWkUob3Y4ODI1X3ByZXZfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX291dHB1dF9pbmZvX3Qgb3Y4ODI1X2RpbWVuc2lvbnNbXSA9IHsKLQl7Ci0JCS54X291dHB1dCA9IDB4Q0MwLAotCQkueV9vdXRwdXQgPSAweDk5MCwKLQkJLmxpbmVfbGVuZ3RoX3BjbGsgPSAweEUwMCwKLQkJLmZyYW1lX2xlbmd0aF9saW5lcyA9IDB4OUIwLAotCQkudnRfcGl4ZWxfY2xrID0gMTMzNDAwMDAwLAotCQkub3BfcGl4ZWxfY2xrID0gMTc2MDAwMDAwLAotCQkuYmlubmluZ19mYWN0b3IgPSAxLAotCX0sCi0JewotCQkueF9vdXRwdXQgPSAweDY2MCwKLQkJLnlfb3V0cHV0ID0gMHg0QzgsCi0JCS5saW5lX2xlbmd0aF9wY2xrID0gMHg2REUsCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweDUwNSwKLQkJLnZ0X3BpeGVsX2NsayA9IDY2NzAwMDAwLAotCQkub3BfcGl4ZWxfY2xrID0gODgwMDAwMDAsCi0JCS5iaW5uaW5nX2ZhY3RvciA9IDIsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9vdXRwdXRfcmVnX2FkZHJfdCBvdjg4MjVfcmVnX2FkZHIgPSB7Ci0JLnhfb3V0cHV0ID0gMHgzODA4LAotCS55X291dHB1dCA9IDB4MzgwYSwKLQkubGluZV9sZW5ndGhfcGNsayA9IDB4MzgwYywKLQkuZnJhbWVfbGVuZ3RoX2xpbmVzID0gMHgzODBlLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2lkX2luZm9fdCBvdjg4MjVfaWRfaW5mbyA9IHsKLQkuc2Vuc29yX2lkX3JlZ19hZGRyID0gMHgzMDBBLAotCS5zZW5zb3JfaWQgPSAweDg4MjUsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfZXhwX2dhaW5faW5mb190IG92ODgyNV9leHBfZ2Fpbl9pbmZvID0gewotCS5jb2Fyc2VfaW50X3RpbWVfYWRkciA9IDB4MzUwMSwKLQkuZ2xvYmFsX2dhaW5fYWRkciA9IDB4MzUwQSwKLQkudmVydF9vZmZzZXQgPSA2LAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBpbmRleDogaW5kZXggb2Ygb3RwIGdyb3VwLiAoMCwgMSwgMikKLSAqIHJldHVybiB2YWx1ZToKLSAqICAgICAwLCBncm91cCBpbmRleCBpcyBlbXB0eQotICogICAgIDEsIGdyb3VwIGluZGV4IGhhcyBpbnZhbGlkIGRhdGEKLSAqICAgICAyLCBncm91cCBpbmRleCBoYXMgdmFsaWQgZGF0YQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50MTZfdCBvdjg4MjVfY2hlY2tfb3RwX3diKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLCB1aW50MTZfdCBpbmRleCkKLXsKLQl1aW50MTZfdCB0ZW1wLCBpOwotCXVpbnQxNl90IGFkZHJlc3M7Ci0KLQkvKiBjbGVhciBvdHAgYnVmZmVyICovCi0KLQkvKiBzZWxlY3Qgb3RwIGJhbmsgMCAqLwotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsIDB4M2Q4NCwgMHgwOCwKLQkJCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0KLQkvKiBsb2FkIG90cCBpbnRvIGJ1ZmZlciAqLwotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsIDB4M2Q4MSwgMHgwMSwKLQkJCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0KLQkvKiByZWFkIGZyb20gZ3JvdXAgW2luZGV4XSAqLwotCWFkZHJlc3MgPSAweDNkMDUgKyBpbmRleCAqIDk7Ci0JbXNtX2NhbWVyYV9pMmNfcmVhZChzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LCBhZGRyZXNzLCAmdGVtcCwKLQkJCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0KLQkvKiBkaXNhYmxlIG90cCByZWFkICovCi0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwgMHgzZDgxLCAweDAwLAotCQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQotCS8qIGNsZWFyIG90cCBidWZmZXIgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LCAoMHgzZDAwK2kpLAotCQkJCTB4MDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JfQotCi0JaWYgKCF0ZW1wKQotCQlyZXR1cm4gMDsKLQllbHNlIGlmICgoISh0ZW1wICYgMHg4MCkpICYmICh0ZW1wICYgMHg3ZikpCi0JCXJldHVybiAyOwotCWVsc2UKLQkJcmV0dXJuIDE7Ci19Ci0KLXZvaWQgb3Y4ODI1X3JlYWRfb3RwX3diKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCQl1aW50MTZfdCBpbmRleCwgc3RydWN0IG90cF9zdHJ1Y3QgKnBvdHApCi17Ci0JdWludDE2X3QgdGVtcCwgaTsKLQl1aW50MTZfdCBhZGRyZXNzOwotCi0JLyogc2VsZWN0IG90cCBiYW5rIDAgKi8KLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LCAweDNkODQsIDB4MDgsCi0JCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCi0JLyogbG9hZCBvdHAgZGF0YSBpbnRvIGJ1ZmZlciAqLwotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsIDB4M2Q4MSwgMHgwMSwKLQkJCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0KLQkvKiByZWFkIG90cCBkYXRhIGZyb20gMHgzZDAwIC0gMHgzZDFmKi8KLQlhZGRyZXNzID0gMHgzZDA1ICsgaW5kZXggKiA5OwotCi0JbXNtX2NhbWVyYV9pMmNfcmVhZChzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LCBhZGRyZXNzLCAmdGVtcCwKLQkJCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0KLQlwb3RwLT5tb2R1bGVfaW50ZWdyYXRvcl9pZCA9IHRlbXA7Ci0JcG90cC0+Y3VzdG9tZXJfaWQgPSB0ZW1wICYgMHg3ZjsKLQotCW1zbV9jYW1lcmFfaTJjX3JlYWQoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwgKGFkZHJlc3MrMSksICZ0ZW1wLAotCQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQlwb3RwLT5sZW5zX2lkID0gdGVtcDsKLQotCW1zbV9jYW1lcmFfaTJjX3JlYWQoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwgKGFkZHJlc3MrMiksICZ0ZW1wLAotCQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQlwb3RwLT5yZ19yYXRpbyA9IHRlbXA7Ci0KLQltc21fY2FtZXJhX2kyY19yZWFkKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsIChhZGRyZXNzKzMpLCAmdGVtcCwKLQkJCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JcG90cC0+YmdfcmF0aW8gPSB0ZW1wOwotCi0JbXNtX2NhbWVyYV9pMmNfcmVhZChzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LCAoYWRkcmVzcys0KSwgJnRlbXAsCi0JCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCXBvdHAtPnVzZXJfZGF0YVswXSA9IHRlbXA7Ci0KLQltc21fY2FtZXJhX2kyY19yZWFkKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsIChhZGRyZXNzKzUpLCAmdGVtcCwKLQkJCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JcG90cC0+dXNlcl9kYXRhWzFdID0gdGVtcDsKLQotCW1zbV9jYW1lcmFfaTJjX3JlYWQoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwgKGFkZHJlc3MrNiksICZ0ZW1wLAotCQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQlwb3RwLT51c2VyX2RhdGFbMl0gPSB0ZW1wOwotCi0JbXNtX2NhbWVyYV9pMmNfcmVhZChzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LCAoYWRkcmVzcys3KSwgJnRlbXAsCi0JCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCXBvdHAtPnVzZXJfZGF0YVszXSA9IHRlbXA7Ci0KLQltc21fY2FtZXJhX2kyY19yZWFkKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsIChhZGRyZXNzKzgpLCAmdGVtcCwKLQkJCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JcG90cC0+dXNlcl9kYXRhWzRdID0gdGVtcDsKLQotCUNEQkcoIiVzIGN1c3RvbWVyX2lkICA9IDB4JTAyeFxyXG4iLCBfX2Z1bmNfXywgcG90cC0+Y3VzdG9tZXJfaWQpOwotCUNEQkcoIiVzIGxlbnNfaWQgICAgICA9IDB4JTAyeFxyXG4iLCBfX2Z1bmNfXywgcG90cC0+bGVuc19pZCk7Ci0JQ0RCRygiJXMgcmdfcmF0aW8gICAgID0gMHglMDJ4XHJcbiIsIF9fZnVuY19fLCBwb3RwLT5yZ19yYXRpbyk7Ci0JQ0RCRygiJXMgYmdfcmF0aW8gICAgID0gMHglMDJ4XHJcbiIsIF9fZnVuY19fLCBwb3RwLT5iZ19yYXRpbyk7Ci0JQ0RCRygiJXMgdXNlcl9kYXRhWzBdID0gMHglMDJ4XHJcbiIsIF9fZnVuY19fLCBwb3RwLT51c2VyX2RhdGFbMF0pOwotCUNEQkcoIiVzIHVzZXJfZGF0YVsxXSA9IDB4JTAyeFxyXG4iLCBfX2Z1bmNfXywgcG90cC0+dXNlcl9kYXRhWzFdKTsKLQlDREJHKCIlcyB1c2VyX2RhdGFbMl0gPSAweCUwMnhcclxuIiwgX19mdW5jX18sIHBvdHAtPnVzZXJfZGF0YVsyXSk7Ci0JQ0RCRygiJXMgdXNlcl9kYXRhWzNdID0gMHglMDJ4XHJcbiIsIF9fZnVuY19fLCBwb3RwLT51c2VyX2RhdGFbM10pOwotCUNEQkcoIiVzIHVzZXJfZGF0YVs0XSA9IDB4JTAyeFxyXG4iLCBfX2Z1bmNfXywgcG90cC0+dXNlcl9kYXRhWzRdKTsKLQotCS8qIGRpc2FibGUgb3RwIHJlYWQgKi8KLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LCAweDNkODEsIDB4MDAsCi0JCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCi0JLyogY2xlYXIgb3RwIGJ1ZmZlciAqLwotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LCAoMHgzZDAwK2kpLAotCQkJCTB4MDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiByX2dhaW4sIHNlbnNvciByZWQgZ2FpbiBvZiBBV0IsIDB4NDAwID0xCi0gKiBnX2dhaW4sIHNlbnNvciBncmVlbiBnYWluIG9mIEFXQiwgMHg0MDAgPTEKLSAqIGJfZ2Fpbiwgc2Vuc29yIGJsdWUgZ2FpbiBvZiBBV0IsIDB4NDAwID0xCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIG92ODgyNV91cGRhdGVfYXdiX2dhaW4oc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JCXVpbnQxNl90IHJfZ2FpbiwgdWludDE2X3QgZ19nYWluLCB1aW50MTZfdCBiX2dhaW4pCi17Ci0JQ0RCRygiJXMgcl9nYWluID0gMHglMDR4XHJcbiIsIF9fZnVuY19fLCByX2dhaW4pOwotCUNEQkcoIiVzIGdfZ2FpbiA9IDB4JTA0eFxyXG4iLCBfX2Z1bmNfXywgZ19nYWluKTsKLQlDREJHKCIlcyBiX2dhaW4gPSAweCUwNHhcclxuIiwgX19mdW5jX18sIGJfZ2Fpbik7Ci0JaWYgKHJfZ2FpbiA+IDB4NDAwKSB7Ci0JCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsIDB4NTE4NiwKLQkJCQkocl9nYWluPj44KSwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQkJbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwgMHg1MTg3LAotCQkJCShyX2dhaW4mMHhmZiksIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JfQotCWlmIChnX2dhaW4gPiAweDQwMCkgewotCQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LCAweDUxODgsCi0JCQkJKGdfZ2Fpbj4+OCksIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsIDB4NTE4OSwKLQkJCQkoZ19nYWluJjB4ZmYpLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCX0KLQlpZiAoYl9nYWluID4gMHg0MDApIHsKLQkJbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwgMHg1MThhLAotCQkJCShiX2dhaW4+PjgpLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LCAweDUxOGIsCi0JCQkJKGJfZ2FpbiYweGZmKSwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogY2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIE9WODgyNSBpbml0aWFsaXphdGlvbgotICogcmV0dXJuIHZhbHVlOgotICogICAgIDAsIHVwZGF0ZSBzdWNjZXNzCi0gKiAgICAgMSwgbm8gT1RQCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludDE2X3Qgb3Y4ODI1X3VwZGF0ZV9vdHAoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwpCi17Ci0JdWludDE2X3QgaTsKLQl1aW50MTZfdCBvdHBfaW5kZXg7Ci0JdWludDE2X3QgdGVtcDsKLQl1aW50MTZfdCByX2dhaW4sIGdfZ2FpbiwgYl9nYWluLCBnX2dhaW5fciwgZ19nYWluX2I7Ci0KLQkvKiBSL0cgYW5kIEIvRyBvZiBjdXJyZW50IGNhbWVyYSBtb2R1bGUgaXMgcmVhZCBvdXQgZnJvbSBzZW5zb3IgT1RQICovCi0JLyogY2hlY2sgZmlyc3QgT1RQIHdpdGggdmFsaWQgZGF0YSAqLwotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJdGVtcCA9IG92ODgyNV9jaGVja19vdHBfd2Ioc19jdHJsLCBpKTsKLQkJaWYgKHRlbXAgPT0gMikgewotCQkJb3RwX2luZGV4ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChpID09IDMpIHsKLQkJLyogbm8gdmFsaWQgd2IgT1RQIGRhdGEgKi8KLQkJQ0RCRygibm8gdmFsaWQgd2IgT1RQIGRhdGFcclxuIik7Ci0JCXJldHVybiAxOwotCX0KLQlvdjg4MjVfcmVhZF9vdHBfd2Ioc19jdHJsLCBvdHBfaW5kZXgsICZzdF9vdjg4MjVfb3RwKTsKLQkvKiBjYWxjdWxhdGUgZ19nYWluICovCi0JLyogMHg0MDAgPSAxeCBnYWluICovCi0JaWYgKHN0X292ODgyNV9vdHAuYmdfcmF0aW8gPCBPVjg4MjVfQkdfUkFUSU9fVFlQSUNBTF9WQUxVRSkgewotCQlpZiAoc3Rfb3Y4ODI1X290cC5yZ19yYXRpbyA8IE9WODgyNV9SR19SQVRJT19UWVBJQ0FMX1ZBTFVFKSB7Ci0JCQlnX2dhaW4gPSAweDQwMDsKLQkJCWJfZ2FpbiA9IDB4NDAwICoKLQkJCQlPVjg4MjVfQkdfUkFUSU9fVFlQSUNBTF9WQUxVRSAvCi0JCQkJc3Rfb3Y4ODI1X290cC5iZ19yYXRpbzsKLQkJCXJfZ2FpbiA9IDB4NDAwICoKLQkJCQlPVjg4MjVfUkdfUkFUSU9fVFlQSUNBTF9WQUxVRSAvCi0JCQkJc3Rfb3Y4ODI1X290cC5yZ19yYXRpbzsKLQkJfSBlbHNlIHsKLQkJCXJfZ2FpbiA9IDB4NDAwOwotCQkJZ19nYWluID0gMHg0MDAgKgotCQkJCXN0X292ODgyNV9vdHAucmdfcmF0aW8gLwotCQkJCU9WODgyNV9SR19SQVRJT19UWVBJQ0FMX1ZBTFVFOwotCQkJYl9nYWluID0gZ19nYWluICoKLQkJCQlPVjg4MjVfQkdfUkFUSU9fVFlQSUNBTF9WQUxVRSAvCi0JCQkJc3Rfb3Y4ODI1X290cC5iZ19yYXRpbzsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChzdF9vdjg4MjVfb3RwLnJnX3JhdGlvIDwgT1Y4ODI1X1JHX1JBVElPX1RZUElDQUxfVkFMVUUpIHsKLQkJCWJfZ2FpbiA9IDB4NDAwOwotCQkJZ19nYWluID0gMHg0MDAgKgotCQkJCXN0X292ODgyNV9vdHAuYmdfcmF0aW8gLwotCQkJCU9WODgyNV9CR19SQVRJT19UWVBJQ0FMX1ZBTFVFOwotCQkJcl9nYWluID0gZ19nYWluICoKLQkJCQlPVjg4MjVfUkdfUkFUSU9fVFlQSUNBTF9WQUxVRSAvCi0JCQkJc3Rfb3Y4ODI1X290cC5yZ19yYXRpbzsKLQkJfSBlbHNlIHsKLQkJCWdfZ2Fpbl9iID0gMHg0MDAgKgotCQkJCXN0X292ODgyNV9vdHAuYmdfcmF0aW8gLwotCQkJCU9WODgyNV9CR19SQVRJT19UWVBJQ0FMX1ZBTFVFOwotCQkJZ19nYWluX3IgPSAweDQwMCAqCi0JCQkJc3Rfb3Y4ODI1X290cC5yZ19yYXRpbyAvCi0JCQkJT1Y4ODI1X1JHX1JBVElPX1RZUElDQUxfVkFMVUU7Ci0JCQlpZiAoZ19nYWluX2IgPiBnX2dhaW5fcikgewotCQkJCWJfZ2FpbiA9IDB4NDAwOwotCQkJCWdfZ2FpbiA9IGdfZ2Fpbl9iOwotCQkJCXJfZ2FpbiA9IGdfZ2FpbiAqCi0JCQkJCU9WODgyNV9SR19SQVRJT19UWVBJQ0FMX1ZBTFVFIC8KLQkJCQkJc3Rfb3Y4ODI1X290cC5yZ19yYXRpbzsKLQkJCX0gZWxzZSB7Ci0JCQkJcl9nYWluID0gMHg0MDA7Ci0JCQkJZ19nYWluID0gZ19nYWluX3I7Ci0JCQkJYl9nYWluID0gZ19nYWluICoKLQkJCQkJT1Y4ODI1X0JHX1JBVElPX1RZUElDQUxfVkFMVUUgLwotCQkJCQlzdF9vdjg4MjVfb3RwLmJnX3JhdGlvOwotCQkJfQotCQl9Ci0JfQotCW92ODgyNV91cGRhdGVfYXdiX2dhaW4oc19jdHJsLCByX2dhaW4sIGdfZ2FpbiwgYl9nYWluKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3Qgb3Y4ODI1X3dyaXRlX2V4cF9nYWluKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCQl1aW50MTZfdCBnYWluLCB1aW50MzJfdCBsaW5lKQotewotCXVpbnQzMl90IGZsX2xpbmVzLCBvZmZzZXQ7Ci0JdWludDhfdCBpbnRfdGltZVszXTsKLQotCWZsX2xpbmVzID0KLQkJKHNfY3RybC0+Y3Vycl9mcmFtZV9sZW5ndGhfbGluZXMgKiBzX2N0cmwtPmZwc19kaXZpZGVyKSAvIFExMDsKLQlvZmZzZXQgPSBzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT52ZXJ0X29mZnNldDsKLQlpZiAobGluZSA+IChmbF9saW5lcyAtIG9mZnNldCkpCi0JCWZsX2xpbmVzID0gbGluZSArIG9mZnNldDsKLQlDREJHKCJvdjg4MjVfd3JpdGVfZXhwX2dhaW46ICVkICVkICVkXG4iLCBmbF9saW5lcywgZ2FpbiwgbGluZSk7Ci0Jc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX2dyb3VwX2hvbGRfb24oc19jdHJsKTsKLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl9vdXRwdXRfcmVnX2FkZHItPmZyYW1lX2xlbmd0aF9saW5lcywgZmxfbGluZXMsCi0JCU1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSk7Ci0JaW50X3RpbWVbMF0gPSBsaW5lID4+IDEyOwotCWludF90aW1lWzFdID0gbGluZSA+PiA0OwotCWludF90aW1lWzJdID0gbGluZSA8PCA0OwotCW1zbV9jYW1lcmFfaTJjX3dyaXRlX3NlcShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT5jb2Fyc2VfaW50X3RpbWVfYWRkci0xLAotCQkmaW50X3RpbWVbMF0sIDMpOwotCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCXNfY3RybC0+c2Vuc29yX2V4cF9nYWluX2luZm8tPmdsb2JhbF9nYWluX2FkZHIsIGdhaW4sCi0JCU1TTV9DQU1FUkFfSTJDX1dPUkRfREFUQSk7Ci0Jc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX2dyb3VwX2hvbGRfb2ZmKHNfY3RybCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBvdjg4MjVfaTJjX2lkW10gPSB7Ci0Je1NFTlNPUl9OQU1FLCAoa2VybmVsX3Vsb25nX3QpJm92ODgyNV9zX2N0cmx9LAotCXsgfQotfTsKLQotaW50MzJfdCBvdjg4MjVfc2Vuc29yX3Bvd2VyX3VwKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsKQotewotCWludDMyX3QgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICppbmZvID0gTlVMTDsKLQotCWluZm8gPSBzX2N0cmwtPnNlbnNvcmRhdGE7Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGluZm8tPnNlbnNvcl9wd2QsIDApOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChpbmZvLT5zZW5zb3JfcmVzZXQsIDApOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotCXJjID0gbXNtX3NlbnNvcl9wb3dlcl91cChzX2N0cmwpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiJXM6IG1zbV9zZW5zb3JfcG93ZXJfdXAgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByYzsKLQl9Ci0JLyogdHVybiBvbiBsZG8gYW5kIHZyZWcgKi8KLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoaW5mby0+c2Vuc29yX3B3ZCwgMSk7Ci0JbXNsZWVwKDIwKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoaW5mby0+c2Vuc29yX3Jlc2V0LCAxKTsKLQltc2xlZXAoNDApOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG92ODgyNV9pMmNfZHJpdmVyID0gewotCS5pZF90YWJsZSA9IG92ODgyNV9pMmNfaWQsCi0JLnByb2JlICA9IG1zbV9zZW5zb3JfaTJjX3Byb2JlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gU0VOU09SX05BTUUsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY2xpZW50IG92ODgyNV9zZW5zb3JfaTJjX2NsaWVudCA9IHsKLQkuYWRkcl90eXBlID0gTVNNX0NBTUVSQV9JMkNfV09SRF9BRERSLAotfTsKLQotCi0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9zZW5zb3JfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm92ODgyNV9pMmNfZHJpdmVyKTsKLX0KLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBvdjg4MjVfc3ViZGV2X2NvcmVfb3BzID0gewotCS5pb2N0bCA9IG1zbV9zZW5zb3Jfc3ViZGV2X2lvY3RsLAotCS5zX3Bvd2VyID0gbXNtX3NlbnNvcl9wb3dlciwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG92ODgyNV9zdWJkZXZfdmlkZW9fb3BzID0gewotCS5lbnVtX21idXNfZm10ID0gbXNtX3NlbnNvcl92NGwyX2VudW1fZm10LAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgb3Y4ODI1X3N1YmRldl9vcHMgPSB7Ci0JLmNvcmUgPSAmb3Y4ODI1X3N1YmRldl9jb3JlX29wcywKLQkudmlkZW8gID0gJm92ODgyNV9zdWJkZXZfdmlkZW9fb3BzLAotfTsKLQotaW50MzJfdCBvdjg4MjVfc2Vuc29yX3NldHRpbmcoc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JCQlpbnQgdXBkYXRlX3R5cGUsIGludCByZXMpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlpZiAodXBkYXRlX3R5cGUgPT0gTVNNX1NFTlNPUl9SRUdfSU5JVCkgewotCQlDREJHKCJSZWdpc3RlciBJTklUXG4iKTsKLQkJc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX3N0b3Bfc3RyZWFtKHNfY3RybCk7Ci0JCW1zbV9zZW5zb3JfZW5hYmxlX2RlYnVnZnMoc19jdHJsKTsKLQkJbXNtX3NlbnNvcl93cml0ZV9pbml0X3NldHRpbmdzKHNfY3RybCk7Ci0JCUNEQkcoIlVwZGF0ZSBPVFBcbiIpOwotCQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LCAweDEwMCwgMHgxLAotCQkJCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JCW1zbGVlcCg2Nik7Ci0JCW92ODgyNV91cGRhdGVfb3RwKHNfY3RybCk7Ci0JCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwotCQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LCAweDEwMCwgMHgwLAotCQkgIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JfSBlbHNlIGlmICh1cGRhdGVfdHlwZSA9PSBNU01fU0VOU09SX1VQREFURV9QRVJJT0RJQykgewotCQlDREJHKCJQRVJJT0RJQyA6ICVkXG4iLCByZXMpOwotCQltc21fc2Vuc29yX3dyaXRlX2NvbmZfYXJyYXkoCi0JCQlzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkJc19jdHJsLT5tc21fc2Vuc29yX3JlZy0+bW9kZV9zZXR0aW5ncywgcmVzKTsKLQkJbXNsZWVwKDMwKTsKLQkJdjRsMl9zdWJkZXZfbm90aWZ5KCZzX2N0cmwtPnNlbnNvcl92NGwyX3N1YmRldiwKLQkJCU5PVElGWV9QQ0xLX0NIQU5HRSwKLQkJCSZzX2N0cmwtPnNlbnNvcmRhdGEtPnBkYXRhLT5pb2Nsay52ZmVfY2xrX3JhdGUpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9mbl90IG92ODgyNV9mdW5jX3RibCA9IHsKLQkuc2Vuc29yX3N0YXJ0X3N0cmVhbSA9IG1zbV9zZW5zb3Jfc3RhcnRfc3RyZWFtLAotCS5zZW5zb3Jfc3RvcF9zdHJlYW0gPSBtc21fc2Vuc29yX3N0b3Bfc3RyZWFtLAotCS5zZW5zb3JfZ3JvdXBfaG9sZF9vbiA9IG1zbV9zZW5zb3JfZ3JvdXBfaG9sZF9vbiwKLQkuc2Vuc29yX2dyb3VwX2hvbGRfb2ZmID0gbXNtX3NlbnNvcl9ncm91cF9ob2xkX29mZiwKLQkuc2Vuc29yX3NldF9mcHMgPSBtc21fc2Vuc29yX3NldF9mcHMsCi0JLnNlbnNvcl93cml0ZV9leHBfZ2FpbiA9IG92ODgyNV93cml0ZV9leHBfZ2FpbiwKLQkuc2Vuc29yX3dyaXRlX3NuYXBzaG90X2V4cF9nYWluID0gb3Y4ODI1X3dyaXRlX2V4cF9nYWluLAotCS5zZW5zb3JfY3NpX3NldHRpbmcgPSBvdjg4MjVfc2Vuc29yX3NldHRpbmcsCi0JLnNlbnNvcl9zZXRfc2Vuc29yX21vZGUgPSBtc21fc2Vuc29yX3NldF9zZW5zb3JfbW9kZSwKLQkuc2Vuc29yX21vZGVfaW5pdCA9IG1zbV9zZW5zb3JfbW9kZV9pbml0LAotCS5zZW5zb3JfZ2V0X291dHB1dF9pbmZvID0gbXNtX3NlbnNvcl9nZXRfb3V0cHV0X2luZm8sCi0JLnNlbnNvcl9jb25maWcgPSBtc21fc2Vuc29yX2NvbmZpZywKLQkuc2Vuc29yX3Bvd2VyX3VwID0gb3Y4ODI1X3NlbnNvcl9wb3dlcl91cCwKLQkuc2Vuc29yX3Bvd2VyX2Rvd24gPSBtc21fc2Vuc29yX3Bvd2VyX2Rvd24sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfcmVnX3Qgb3Y4ODI1X3JlZ3MgPSB7Ci0JLmRlZmF1bHRfZGF0YV90eXBlID0gTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBLAotCS5zdGFydF9zdHJlYW1fY29uZiA9IG92ODgyNV9zdGFydF9zZXR0aW5ncywKLQkuc3RhcnRfc3RyZWFtX2NvbmZfc2l6ZSA9IEFSUkFZX1NJWkUob3Y4ODI1X3N0YXJ0X3NldHRpbmdzKSwKLQkuc3RvcF9zdHJlYW1fY29uZiA9IG92ODgyNV9zdG9wX3NldHRpbmdzLAotCS5zdG9wX3N0cmVhbV9jb25mX3NpemUgPSBBUlJBWV9TSVpFKG92ODgyNV9zdG9wX3NldHRpbmdzKSwKLQkuZ3JvdXBfaG9sZF9vbl9jb25mID0gb3Y4ODI1X2dyb3Vwb25fc2V0dGluZ3MsCi0JLmdyb3VwX2hvbGRfb25fY29uZl9zaXplID0gQVJSQVlfU0laRShvdjg4MjVfZ3JvdXBvbl9zZXR0aW5ncyksCi0JLmdyb3VwX2hvbGRfb2ZmX2NvbmYgPSBvdjg4MjVfZ3JvdXBvZmZfc2V0dGluZ3MsCi0JLmdyb3VwX2hvbGRfb2ZmX2NvbmZfc2l6ZSA9CUFSUkFZX1NJWkUob3Y4ODI1X2dyb3Vwb2ZmX3NldHRpbmdzKSwKLQkuaW5pdF9zZXR0aW5ncyA9ICZvdjg4MjVfaW5pdF9jb25mWzBdLAotCS5pbml0X3NpemUgPSBBUlJBWV9TSVpFKG92ODgyNV9pbml0X2NvbmYpLAotCS5tb2RlX3NldHRpbmdzID0gJm92ODgyNV9jb25mc1swXSwKLQkub3V0cHV0X3NldHRpbmdzID0gJm92ODgyNV9kaW1lbnNpb25zWzBdLAotCS5udW1fY29uZiA9IEFSUkFZX1NJWkUob3Y4ODI1X2NvbmZzKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3Qgb3Y4ODI1X3NfY3RybCA9IHsKLQkubXNtX3NlbnNvcl9yZWcgPSAmb3Y4ODI1X3JlZ3MsCi0JLnNlbnNvcl9pMmNfY2xpZW50ID0gJm92ODgyNV9zZW5zb3JfaTJjX2NsaWVudCwKLQkuc2Vuc29yX2kyY19hZGRyID0gMHg2QywKLQkuc2Vuc29yX291dHB1dF9yZWdfYWRkciA9ICZvdjg4MjVfcmVnX2FkZHIsCi0JLnNlbnNvcl9pZF9pbmZvID0gJm92ODgyNV9pZF9pbmZvLAotCS5zZW5zb3JfZXhwX2dhaW5faW5mbyA9ICZvdjg4MjVfZXhwX2dhaW5faW5mbywKLQkuY2FtX21vZGUgPSBNU01fU0VOU09SX01PREVfSU5WQUxJRCwKLQkubXNtX3NlbnNvcl9tdXRleCA9ICZvdjg4MjVfbXV0LAotCS5zZW5zb3JfaTJjX2RyaXZlciA9ICZvdjg4MjVfaTJjX2RyaXZlciwKLQkuc2Vuc29yX3Y0bDJfc3ViZGV2X2luZm8gPSBvdjg4MjVfc3ViZGV2X2luZm8sCi0JLnNlbnNvcl92NGwyX3N1YmRldl9pbmZvX3NpemUgPSBBUlJBWV9TSVpFKG92ODgyNV9zdWJkZXZfaW5mbyksCi0JLnNlbnNvcl92NGwyX3N1YmRldl9vcHMgPSAmb3Y4ODI1X3N1YmRldl9vcHMsCi0JLmZ1bmNfdGJsID0gJm92ODgyNV9mdW5jX3RibCwKLX07Ci0KLW1vZHVsZV9pbml0KG1zbV9zZW5zb3JfaW5pdF9tb2R1bGUpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJPbW5pdmlzb24gOE1QIEJheWVyIHNlbnNvciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL292OTcyNl92NGwyLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy9vdjk3MjZfdjRsMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWJkOTU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL292OTcyNl92NGwyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSAibXNtX3NlbnNvci5oIgotI2RlZmluZSBTRU5TT1JfTkFNRSAib3Y5NzI2IgotI2RlZmluZSBQTEFURk9STV9EUklWRVJfTkFNRSAibXNtX2NhbWVyYV9vdjk3MjYiCi0jZGVmaW5lIG92OTcyNl9vYmogb3Y5NzI2XyMjb2JqCi0KLURFRklORV9NVVRFWChvdjk3MjZfbXV0KTsKLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3Qgb3Y5NzI2X3NfY3RybDsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBvdjk3MjZfc3RhcnRfc2V0dGluZ3NbXSA9IHsKLQl7MHgwMTAwLCAweDAxfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3Y5NzI2X3N0b3Bfc2V0dGluZ3NbXSA9IHsKLQl7MHgwMTAwLCAweDAwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3Y5NzI2X2dyb3Vwb25fc2V0dGluZ3NbXSA9IHsKLQl7MHgwMTA0LCAweDAxfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgb3Y5NzI2X2dyb3Vwb2ZmX3NldHRpbmdzW10gPSB7Ci0JezB4MDEwNCwgMHgwMH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIG92OTcyNl9wcmV2X3NldHRpbmdzW10gPSB7Ci19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIG92OTcyNl9yZWNvbW1lbmRfc2V0dGluZ3NbXSA9IHsKLQl7MHgwMTAzLCAweDAxfSwgLyogU09GVFdBUkVfUkVTRVQgKi8KLQl7MHgzMDI2LCAweDAwfSwgLyogT1VUUFVUX1NFTEVDVDAxICovCi0JezB4MzAyNywgMHgwMH0sIC8qIE9VVFBVVF9TRUxFQ1QwMiAqLwotCXsweDMwMDIsIDB4ZTh9LCAvKiBJT19DVFJMMDAgKi8KLQl7MHgzMDA0LCAweDAzfSwgLyogSU9fQ1RSTDAxICovCi0JezB4MzAwNSwgMHhmZn0sIC8qIElPX0NUUkwwMiAqLwotCXsweDM3MDMsIDB4NDJ9LAotCXsweDM3MDQsIDB4MTB9LAotCXsweDM3MDUsIDB4NDV9LAotCXsweDM2MDMsIDB4YWF9LAotCXsweDM2MzIsIDB4MmZ9LAotCXsweDM2MjAsIDB4NjZ9LAotCXsweDM2MjEsIDB4YzB9LAotCXsweDAzNDAsIDB4MDN9LCAvKiBGUkFNRV9MRU5HVEhfTElORVNfSEkgKi8KLQl7MHgwMzQxLCAweEMxfSwgLyogRlJBTUVfTEVOR1RIX0xJTkVTX0xPICovCi0JezB4MDM0MiwgMHgwNn0sIC8qIExJTkVfTEVOR1RIX1BDS19ISSAqLwotCXsweDAzNDMsIDB4ODB9LCAvKiBMSU5FX0xFTkdUSF9QQ0tfTE8gKi8KLQl7MHgwMjAyLCAweDAzfSwgLyogQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfSEkgKi8KLQl7MHgwMjAzLCAweDQzfSwgLyogQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfTE8gKi8KLQl7MHgzODMzLCAweDA0fSwKLQl7MHgzODM1LCAweDAyfSwKLQl7MHg0NzAyLCAweDA0fSwKLQl7MHg0NzA0LCAweDAwfSwgLyogRFZQX0NUUkwwMSAqLwotCXsweDQ3MDYsIDB4MDh9LAotCXsweDUwNTIsIDB4MDF9LAotCXsweDM4MTksIDB4NmV9LAotCXsweDM4MTcsIDB4OTR9LAotCXsweDNhMTgsIDB4MDB9LCAvKiBBRUNfR0FJTl9DRUlMSU5HX0hJICovCi0JezB4M2ExOSwgMHg3Zn0sIC8qIEFFQ19HQUlOX0NFSUxJTkdfTE8gKi8KLQl7MHg0MDRlLCAweDdlfSwKLQl7MHgzNjMxLCAweDUyfSwKLQl7MHgzNjMzLCAweDUwfSwKLQl7MHgzNjMwLCAweGQyfSwKLQl7MHgzNjA0LCAweDA4fSwKLQl7MHgzNjAxLCAweDQwfSwKLQl7MHgzNjAyLCAweDE0fSwKLQl7MHgzNjEwLCAweGEwfSwKLQl7MHgzNjEyLCAweDIwfSwKLQl7MHgwMzRjLCAweDA1fSwgLyogWF9PVVRQVVRfU0laRV9ISSAqLwotCXsweDAzNGQsIDB4MTB9LCAvKiBYX09VVFBVVF9TSVpFX0xPICovCi0JezB4MDM0ZSwgMHgwM30sIC8qIFlfT1VUUFVUX1NJWkVfSEkgKi8KLQl7MHgwMzRmLCAweDI4fSwgLyogWV9PVVRQVVRfU0laRV9MTyAqLwotCXsweDAzNDAsIDB4MDN9LCAvKiBGUkFNRV9MRU5HVEhfTElORVNfSEkgKi8KLQl7MHgwMzQxLCAweEMxfSwgLyogRlJBTUVfTEVOR1RIX0xJTkVTX0xPICovCi0JezB4MDM0MiwgMHgwNn0sIC8qIExJTkVfTEVOR1RIX1BDS19ISSAqLwotCXsweDAzNDMsIDB4ODB9LCAvKiBMSU5FX0xFTkdUSF9QQ0tfTE8gKi8KLQl7MHgwMjAyLCAweDAzfSwgLyogQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfSEkgKi8KLQl7MHgwMjAzLCAweDQzfSwgLyogQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfTE8gKi8KLQl7MHgwMzAzLCAweDAxfSwgLyogVlRfU1lTX0NMS19ESVZfTE8gKi8KLQl7MHgzMDAyLCAweDAwfSwgLyogSU9fQ1RSTDAwICovCi0JezB4MzAwNCwgMHgwMH0sIC8qIElPX0NUUkwwMSAqLwotCXsweDMwMDUsIDB4MDB9LCAvKiBJT19DVFJMMDIgKi8KLQl7MHg0ODAxLCAweDBmfSwgLyogTUlQSV9DVFJMMDEgKi8KLQl7MHg0ODAzLCAweDA1fSwgLyogTUlQSV9DVFJMMDMgKi8KLQl7MHg0NjAxLCAweDE2fSwgLyogVkZJRk9fUkVBRF9DT05UUk9MICovCi0JezB4MzAxNCwgMHgwNX0sIC8qIFNDX0NNTU5fTUlQSSAvIFNDX0NUUkwwMCAqLwotCXsweDMxMDQsIDB4ODB9LAotCXsweDAzMDUsIDB4MDR9LCAvKiBQUkVfUExMX0NMS19ESVZfTE8gKi8KLQl7MHgwMzA3LCAweDY0fSwgLyogUExMX01VTFRJUExJRVJfTE8gKi8KLQl7MHgzMDBjLCAweDAyfSwKLQl7MHgzMDBkLCAweDIwfSwKLQl7MHgzMDBlLCAweDAxfSwKLQl7MHgzMDEwLCAweDAxfSwKLQl7MHg0NjBlLCAweDgxfSwgLyogVkZJRk9fQ09OVFJPTDAwICovCi0JezB4MDEwMSwgMHgwMX0sIC8qIElNQUdFX09SSUVOVEFUSU9OICovCi0JezB4MzcwNywgMHgxNH0sCi0JezB4MzYyMiwgMHg5Zn0sCi0JezB4NTA0NywgMHgzRH0sIC8qIElTUF9DVFJMNDcgKi8KLQl7MHg0MDAyLCAweDQ1fSwgLyogQkxDX0NUUkwwMiAqLwotCXsweDUwMDAsIDB4MDZ9LCAvKiBJU1BfQ1RSTDAgKi8KLQl7MHg1MDAxLCAweDAwfSwgLyogSVNQX0NUUkwxICovCi0JezB4MzQwNiwgMHgwMH0sIC8qIEFXQl9NQU5VQUxfQ1RSTCAqLwotCXsweDM1MDMsIDB4MTN9LCAvKiBBRUNfRU5BQkxFICovCi0JezB4NDAwNSwgMHgxOH0sIC8qIEJMQ19DVFJMMDUgKi8KLQl7MHg0ODM3LCAweDIxfSwKLQl7MHgwMTAwLCAweDAxfSwgLyogTU9ERV9TRUxFQ1QgKi8KLQl7MHgzYTBmLCAweDY0fSwgLyogQUVDX0NUUkwwRiAqLwotCXsweDNhMTAsIDB4NTR9LCAvKiBBRUNfQ1RSTDEwICovCi0JezB4M2ExMSwgMHhjMn0sIC8qIEFFQ19DVFJMMTEgKi8KLQl7MHgzYTFiLCAweDY0fSwgLyogQUVDX0NUUkwxQiAqLwotCXsweDNhMWUsIDB4NTR9LCAvKiBBRUNfQ1RSTDFFICovCi0JezB4M2ExYSwgMHgwNX0sIC8qIEFFQ19ESUZGX01BWCAqLwotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9pbmZvIG92OTcyNl9zdWJkZXZfaW5mb1tdID0gewotCXsKLQkuY29kZSAgID0gVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzFYMTAsCi0JLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKLQkuZm10ICAgID0gMSwKLQkub3JkZXIgICAgPSAwLAotCX0sCi0JLyogbW9yZSBjYW4gYmUgc3VwcG9ydGVkLCB0byBiZSBhZGRlZCBsYXRlciAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5IG92OTcyNl9pbml0X2NvbmZbXSA9IHsKLQl7Jm92OTcyNl9yZWNvbW1lbmRfc2V0dGluZ3NbMF0sCi0JQVJSQVlfU0laRShvdjk3MjZfcmVjb21tZW5kX3NldHRpbmdzKSwgMCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfQotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jb25mX2FycmF5IG92OTcyNl9jb25mc1tdID0gewotCXsmb3Y5NzI2X3ByZXZfc2V0dGluZ3NbMF0sCi0JQVJSQVlfU0laRShvdjk3MjZfcHJldl9zZXR0aW5ncyksIDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3Jfb3V0cHV0X2luZm9fdCBvdjk3MjZfZGltZW5zaW9uc1tdID0gewotCXsKLQkJLnhfb3V0cHV0ID0gMHg1MTAsIC8qIDEyOTYgKi8KLQkJLnlfb3V0cHV0ID0gMHgzMjgsIC8qIDgwOCAqLwotCQkubGluZV9sZW5ndGhfcGNsayA9IDB4NjgwLCAvKiAxNjY0ICovCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweDNDMSwgLyogOTYxICovCi0JCS52dF9waXhlbF9jbGsgPSAzMjAwMDAwMDAsCi0JCS5vcF9waXhlbF9jbGsgPSAzMjAwMDAwMDAsCi0JCS5iaW5uaW5nX2ZhY3RvciA9IDEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9vdXRwdXRfcmVnX2FkZHJfdCBvdjk3MjZfcmVnX2FkZHIgPSB7Ci0JLnhfb3V0cHV0ID0gMHgwMzRjLAotCS55X291dHB1dCA9IDB4MDM0ZSwKLQkubGluZV9sZW5ndGhfcGNsayA9IDB4MDM0MiwKLQkuZnJhbWVfbGVuZ3RoX2xpbmVzID0gMHgwMzQwLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2lkX2luZm9fdCBvdjk3MjZfaWRfaW5mbyA9IHsKLQkuc2Vuc29yX2lkX3JlZ19hZGRyID0gMHgwMDAwLAotCS5zZW5zb3JfaWQgPSAweDk3MjYsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfZXhwX2dhaW5faW5mb190IG92OTcyNl9leHBfZ2Fpbl9pbmZvID0gewotCS5jb2Fyc2VfaW50X3RpbWVfYWRkciA9IDB4MDIwMiwKLQkuZ2xvYmFsX2dhaW5fYWRkciA9IDB4MDIwNCwKLQkudmVydF9vZmZzZXQgPSA2LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG92OTcyNl9pMmNfaWRbXSA9IHsKLQl7U0VOU09SX05BTUUsIChrZXJuZWxfdWxvbmdfdCkmb3Y5NzI2X3NfY3RybH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgb3Y5NzI2X2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gb3Y5NzI2X2kyY19pZCwKLQkucHJvYmUgID0gbXNtX3NlbnNvcl9pMmNfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBTRU5TT1JfTkFNRSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgb3Y5NzI2X3NlbnNvcl9pMmNfY2xpZW50ID0gewotCS5hZGRyX3R5cGUgPSBNU01fQ0FNRVJBX0kyQ19XT1JEX0FERFIsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fc2Vuc29yX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZvdjk3MjZfaTJjX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgb3Y5NzI2X3N1YmRldl9jb3JlX29wcyA9IHsKLQkuaW9jdGwgPSBtc21fc2Vuc29yX3N1YmRldl9pb2N0bCwKLQkuc19wb3dlciA9IG1zbV9zZW5zb3JfcG93ZXIsCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBvdjk3MjZfc3ViZGV2X3ZpZGVvX29wcyA9IHsKLQkuZW51bV9tYnVzX2ZtdCA9IG1zbV9zZW5zb3JfdjRsMl9lbnVtX2ZtdCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG92OTcyNl9zdWJkZXZfb3BzID0gewotCS5jb3JlID0gJm92OTcyNl9zdWJkZXZfY29yZV9vcHMsCi0JLnZpZGVvICA9ICZvdjk3MjZfc3ViZGV2X3ZpZGVvX29wcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9mbl90IG92OTcyNl9mdW5jX3RibCA9IHsKLQkuc2Vuc29yX3N0YXJ0X3N0cmVhbSA9IG1zbV9zZW5zb3Jfc3RhcnRfc3RyZWFtLAotCS5zZW5zb3Jfc3RvcF9zdHJlYW0gPSBtc21fc2Vuc29yX3N0b3Bfc3RyZWFtLAotCS5zZW5zb3JfZ3JvdXBfaG9sZF9vbiA9IG1zbV9zZW5zb3JfZ3JvdXBfaG9sZF9vbiwKLQkuc2Vuc29yX2dyb3VwX2hvbGRfb2ZmID0gbXNtX3NlbnNvcl9ncm91cF9ob2xkX29mZiwKLQkuc2Vuc29yX3NldF9mcHMgPSBtc21fc2Vuc29yX3NldF9mcHMsCi0JLnNlbnNvcl93cml0ZV9leHBfZ2FpbiA9IG1zbV9zZW5zb3Jfd3JpdGVfZXhwX2dhaW4xLAotCS5zZW5zb3Jfd3JpdGVfc25hcHNob3RfZXhwX2dhaW4gPSBtc21fc2Vuc29yX3dyaXRlX2V4cF9nYWluMSwKLQkuc2Vuc29yX2NzaV9zZXR0aW5nID0gbXNtX3NlbnNvcl9zZXR0aW5nMSwKLQkuc2Vuc29yX3NldF9zZW5zb3JfbW9kZSA9IG1zbV9zZW5zb3Jfc2V0X3NlbnNvcl9tb2RlLAotCS5zZW5zb3JfbW9kZV9pbml0ID0gbXNtX3NlbnNvcl9tb2RlX2luaXQsCi0JLnNlbnNvcl9nZXRfb3V0cHV0X2luZm8gPSBtc21fc2Vuc29yX2dldF9vdXRwdXRfaW5mbywKLQkuc2Vuc29yX2NvbmZpZyA9IG1zbV9zZW5zb3JfY29uZmlnLAotCS5zZW5zb3JfcG93ZXJfdXAgPSBtc21fc2Vuc29yX3Bvd2VyX3VwLAotCS5zZW5zb3JfcG93ZXJfZG93biA9IG1zbV9zZW5zb3JfcG93ZXJfZG93biwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9yZWdfdCBvdjk3MjZfcmVncyA9IHsKLQkuZGVmYXVsdF9kYXRhX3R5cGUgPSBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEsCi0JLnN0YXJ0X3N0cmVhbV9jb25mID0gb3Y5NzI2X3N0YXJ0X3NldHRpbmdzLAotCS5zdGFydF9zdHJlYW1fY29uZl9zaXplID0gQVJSQVlfU0laRShvdjk3MjZfc3RhcnRfc2V0dGluZ3MpLAotCS5zdG9wX3N0cmVhbV9jb25mID0gb3Y5NzI2X3N0b3Bfc2V0dGluZ3MsCi0JLnN0b3Bfc3RyZWFtX2NvbmZfc2l6ZSA9IEFSUkFZX1NJWkUob3Y5NzI2X3N0b3Bfc2V0dGluZ3MpLAotCS5ncm91cF9ob2xkX29uX2NvbmYgPSBvdjk3MjZfZ3JvdXBvbl9zZXR0aW5ncywKLQkuZ3JvdXBfaG9sZF9vbl9jb25mX3NpemUgPSBBUlJBWV9TSVpFKG92OTcyNl9ncm91cG9uX3NldHRpbmdzKSwKLQkuZ3JvdXBfaG9sZF9vZmZfY29uZiA9IG92OTcyNl9ncm91cG9mZl9zZXR0aW5ncywKLQkuZ3JvdXBfaG9sZF9vZmZfY29uZl9zaXplID0KLQkJQVJSQVlfU0laRShvdjk3MjZfZ3JvdXBvZmZfc2V0dGluZ3MpLAotCS5pbml0X3NldHRpbmdzID0gJm92OTcyNl9pbml0X2NvbmZbMF0sCi0JLmluaXRfc2l6ZSA9IEFSUkFZX1NJWkUob3Y5NzI2X2luaXRfY29uZiksCi0JLm1vZGVfc2V0dGluZ3MgPSAmb3Y5NzI2X2NvbmZzWzBdLAotCS5vdXRwdXRfc2V0dGluZ3MgPSAmb3Y5NzI2X2RpbWVuc2lvbnNbMF0sCi0JLm51bV9jb25mID0gQVJSQVlfU0laRShvdjk3MjZfY29uZnMpLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCBvdjk3MjZfc19jdHJsID0gewotCS5tc21fc2Vuc29yX3JlZyA9ICZvdjk3MjZfcmVncywKLQkuc2Vuc29yX2kyY19jbGllbnQgPSAmb3Y5NzI2X3NlbnNvcl9pMmNfY2xpZW50LAotCS5zZW5zb3JfaTJjX2FkZHIgPSAweDIwLAotCS5zZW5zb3Jfb3V0cHV0X3JlZ19hZGRyID0gJm92OTcyNl9yZWdfYWRkciwKLQkuc2Vuc29yX2lkX2luZm8gPSAmb3Y5NzI2X2lkX2luZm8sCi0JLnNlbnNvcl9leHBfZ2Fpbl9pbmZvID0gJm92OTcyNl9leHBfZ2Fpbl9pbmZvLAotCS5jYW1fbW9kZSA9IE1TTV9TRU5TT1JfTU9ERV9JTlZBTElELAotCS5tc21fc2Vuc29yX211dGV4ID0gJm92OTcyNl9tdXQsCi0JLnNlbnNvcl9pMmNfZHJpdmVyID0gJm92OTcyNl9pMmNfZHJpdmVyLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfaW5mbyA9IG92OTcyNl9zdWJkZXZfaW5mbywKLQkuc2Vuc29yX3Y0bDJfc3ViZGV2X2luZm9fc2l6ZSA9IEFSUkFZX1NJWkUob3Y5NzI2X3N1YmRldl9pbmZvKSwKLQkuc2Vuc29yX3Y0bDJfc3ViZGV2X29wcyA9ICZvdjk3MjZfc3ViZGV2X29wcywKLQkuZnVuY190YmwgPSAmb3Y5NzI2X2Z1bmNfdGJsLAotCS5jbGtfcmF0ZSA9IE1TTV9TRU5TT1JfTUNMS18yNEhaLAotfTsKLQotbW9kdWxlX2luaXQobXNtX3NlbnNvcl9pbml0X21vZHVsZSk7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk9tbml2aXNpb24gV1hHQSBCYXllciBzZW5zb3IgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvczVrM2wxeXguYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL3M1azNsMXl4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZDYyNWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvczVrM2wxeXguYworKysgL2Rldi9udWxsCkBAIC0xLDc0NyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlICJtc21fc2Vuc29yLmgiCi0jZGVmaW5lIFNFTlNPUl9OQU1FICJzNWszbDF5eCIKLSNkZWZpbmUgUExBVEZPUk1fRFJJVkVSX05BTUUgIm1zbV9jYW1lcmFfczVrM2wxeXgiCi0KLURFRklORV9NVVRFWChzNWszbDF5eF9tdXQpOwotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCBzNWszbDF5eF9zX2N0cmw7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgczVrM2wxeXhfc3RhcnRfc2V0dGluZ3NbXSA9IHsKLQl7MHgwMTAwLCAweDAxfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgczVrM2wxeXhfc3RvcF9zZXR0aW5nc1tdID0gewotCXsweDAxMDAsIDB4MDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBzNWszbDF5eF9ncm91cG9uX3NldHRpbmdzW10gPSB7Ci0JezB4MTA0LCAweDAxfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgczVrM2wxeXhfZ3JvdXBvZmZfc2V0dGluZ3NbXSA9IHsKLQl7MHgxMDQsIDB4MDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBzNWszbDF5eF9zbmFwX3NldHRpbmdzW10gPSB7Ci0JezB4MDUwMSwgMHgwMH0sIC8qIGNvbXByZXNzaW9uX2FsZ29yaXRoaW1fTCgxZCkgKi8KLQl7MHgwMTEyLCAweDBBfSwgLyogQ0NQX2RhdGFfZm9ybWF0X0ggKi8KLQl7MHgwMTEzLCAweDBBfSwgLyogQ0NQX2RhdGFfZm9ybWF0X0wgcmF3OD0wODA4ICxEQ1BNMTAgLS0+OD0gMEEwOCAqLwotCXsweDAzMDYsIDB4MDB9LCAvKiBwbGxfbXVsdGlwbGllciAqLwotCXsweDAzMDcsIDB4QTV9LCAvKiBwbGxfbXVsdGlwbGllciAqLwotCXsweDAyMDIsIDB4MDl9LCAvKiBjb2Fyc2VfaW50ZWdyYXRpb25fdGltZSAqLwotCXsweDAyMDMsIDB4MzJ9LCAvKiBjb2Fyc2VfaW50ZWdyYXRpb25fdGltZSAqLwotCXsweDAzNDAsIDB4MEJ9LCAvKiBmcmFtZV9sZW5ndGhfbGluZXMgKi8KLQl7MHgwMzQxLCAweEVDfSwgLyogZnJhbWVfbGVuZ3RoX2xpbmVzICovCi0JezB4MDM0MiwgMHgxNH0sIC8qIGxpbmVfbGVuZ3RoX3BjayAqLwotCXsweDAzNDMsIDB4RDh9LCAvKiBsaW5lX2xlbmd0aF9wY2sgKi8KLQl7MHgwMzQ0LCAweDAwfSwgLyogeF9hZGRyX3N0YXJ0ICovCi0JezB4MDM0NSwgMHgwOH0sIC8qIHhfYWRkcl9zdGFydCAqLwotCXsweDAzNDYsIDB4MDB9LCAvKiB5X2FkZHJfc3RhcnQgKi8KLQl7MHgwMzQ3LCAweDAwfSwgLyogeV9hZGRyX3N0YXJ0ICovCi0JezB4MDM0OCwgMHgwRn0sIC8qIHhfYWRkcl9lbmQgKi8KLQl7MHgwMzQ5LCAweEE3fSwgLyogeF9hZGRyX2VuZCAqLwotCXsweDAzNEEsIDB4MEJ9LCAvKiB5X2FkZHJfZW5kICovCi0JezB4MDM0QiwgMHhDN30sIC8qIHlfYWRkcl9lbmQgKi8KLQl7MHgwMzRDLCAweDBGfSwgLyogeF9vdXRwdXRfc2l6ZSAqLwotCXsweDAzNEQsIDB4QTB9LCAvKiB4X291dHB1dF9zaXplICovCi0JezB4MDM0RSwgMHgwQn0sIC8qIHlfb3V0cHV0X3NpemUgKi8KLQl7MHgwMzRGLCAweEM4fSwgLyogeV9vdXRwdXRfc2l6ZSAqLwotCXsweDAzODAsIDB4MDB9LCAvKiB4X2V2ZW5faW5jICovCi0JezB4MDM4MSwgMHgwMX0sIC8qIHhfZXZlbl9pbmMgKi8KLQl7MHgwMzgyLCAweDAwfSwgLyogeF9vZGRfaW5jICovCi0JezB4MDM4MywgMHgwMX0sIC8qIHhfb2RkX2luYyAqLwotCXsweDAzODQsIDB4MDB9LCAvKiB5X2V2ZW5faW5jICovCi0JezB4MDM4NSwgMHgwMX0sIC8qIHlfZXZlbl9pbmMgKi8KLQl7MHgwMzg2LCAweDAwfSwgLyogeV9vZGRfaW5jICovCi0JezB4MDM4NywgMHgwMX0sIC8qIHlfb2RkX2luYyAqLwotCXsweDA5MDAsIDB4MDB9LCAvKiBiaW5uaW5nX21vZGUgKi8KLQl7MHgwOTAxLCAweDIyfSwgLyogYmlubmluZ190eXBlICovCi0JezB4MDkwMiwgMHgwMX0sIC8qIGJpbm5pbmdfd2VpZ2h0aW5nICovCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIHM1azNsMXl4X3ByZXZfc2V0dGluZ3NbXSA9IHsKLQl7MHgwNTAxLCAweDAwfSwgLyogY29tcHJlc3Npb25fYWxnb3JpdGhpbV9MKDFkKSAqLwotCXsweDAxMTIsIDB4MEF9LCAvKiBDQ1BfZGF0YV9mb3JtYXRfSCAqLwotCXsweDAxMTMsIDB4MEF9LCAvKiBDQ1BfZGF0YV9mb3JtYXRfTCByYXc4PTA4MDggLERDUE0xMCAtLT44PSAwQTA4ICovCi0JezB4MDMwNiwgMHgwMH0sIC8qIHBsbF9tdWx0aXBsaWVyICovCi0JezB4MDMwNywgMHhBNX0sIC8qIHBsbF9tdWx0aXBsaWVyICovCi0JezB4MDIwMiwgMHgwNn0sIC8qIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lICovCi0JezB4MDIwMywgMHgwMH0sIC8qIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lICovCi0JezB4MDM0MCwgMHgwOX0sIC8qIGZyYW1lX2xlbmd0aF9saW5lcyAqLwotCXsweDAzNDEsIDB4NkN9LCAvKiBmcmFtZV9sZW5ndGhfbGluZXMgKi8KLQl7MHgwMzQyLCAweDExfSwgLyogbGluZV9sZW5ndGhfcGNrICovCi0JezB4MDM0MywgMHg4MH0sIC8qIGxpbmVfbGVuZ3RoX3BjayAqLwotCXsweDAzNDQsIDB4MDB9LCAvKiB4X2FkZHJfc3RhcnQgKi8KLQl7MHgwMzQ1LCAweDE4fSwgLyogeF9hZGRyX3N0YXJ0ICovCi0JezB4MDM0NiwgMHgwMH0sIC8qIHlfYWRkcl9zdGFydCAqLwotCXsweDAzNDcsIDB4MDB9LCAvKiB5X2FkZHJfc3RhcnQgKi8KLQl7MHgwMzQ4LCAweDBGfSwgLyogeF9hZGRyX2VuZCAqLwotCXsweDAzNDksIDB4OTd9LCAvKiB4X2FkZHJfZW5kICovCi0JezB4MDM0QSwgMHgwQn0sIC8qIHlfYWRkcl9lbmQgKi8KLQl7MHgwMzRCLCAweEM3fSwgLyogeV9hZGRyX2VuZCAqLwotCXsweDAzNEMsIDB4MDd9LCAvKiB4X291dHB1dF9zaXplICovCi0JezB4MDM0RCwgMHhDMH0sIC8qIHhfb3V0cHV0X3NpemUgKi8KLQl7MHgwMzRFLCAweDA1fSwgLyogeV9vdXRwdXRfc2l6ZSAqLwotCXsweDAzNEYsIDB4RTR9LCAvKiB5X291dHB1dF9zaXplICovCi0JezB4MDM4MCwgMHgwMH0sIC8qIHhfZXZlbl9pbmMgKi8KLQl7MHgwMzgxLCAweDAxfSwgLyogeF9ldmVuX2luYyAqLwotCXsweDAzODIsIDB4MDB9LCAvKiB4X29kZF9pbmMgKi8KLQl7MHgwMzgzLCAweDAzfSwgLyogeF9vZGRfaW5jICovCi0JezB4MDM4NCwgMHgwMH0sIC8qIHlfZXZlbl9pbmMgKi8KLQl7MHgwMzg1LCAweDAxfSwgLyogeV9ldmVuX2luYyAqLwotCXsweDAzODYsIDB4MDB9LCAvKiB5X29kZF9pbmMgKi8KLQl7MHgwMzg3LCAweDAzfSwgLyogeV9vZGRfaW5jICovCi0JezB4MDkwMCwgMHgwMX0sIC8qIGJpbm5pbmdfbW9kZSAqLwotCXsweDA5MDEsIDB4MjJ9LCAvKiBiaW5uaW5nX3R5cGUgKi8KLQl7MHgwOTAyLCAweDAxfSwgLyogYmlubmluZ193ZWlnaHRpbmcgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgczVrM2wxeXhfdmlkZW9fNjBmcHNfc2V0dGluZ3NbXSA9IHsKLQl7MHgwNTAxLCAweDAwfSwgLyogY29tcHJlc3Npb25fYWxnb3JpdGhpbV9MKDFkKSAqLwotCXsweDAxMTIsIDB4MEF9LCAvKiBDQ1BfZGF0YV9mb3JtYXRfSCAqLwotCXsweDAxMTMsIDB4MEF9LCAvKiBDQ1BfZGF0YV9mb3JtYXRfTCByYXc4PTA4MDggLERDUE0xMCAtLT44PSAwQTA4ICovCi0JezB4MDMwNiwgMHgwMH0sIC8qIHBsbF9tdWx0aXBsaWVyICovCi0JezB4MDMwNywgMHhBNX0sIC8qIHBsbF9tdWx0aXBsaWVyICovCi0JezB4MDIwMiwgMHgwM30sIC8qIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lICovCi0JezB4MDIwMywgMHhEOH0sIC8qIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lICovCi0JezB4MDM0MCwgMHgwM30sIC8qIGZyYW1lX2xlbmd0aF9saW5lcyAqLwotCXsweDAzNDEsIDB4RTB9LCAvKiBmcmFtZV9sZW5ndGhfbGluZXMgKi8KLQl7MHgwMzQyLCAweDE0fSwgLyogbGluZV9sZW5ndGhfcGNrICovCi0JezB4MDM0MywgMHhEOH0sIC8qIGxpbmVfbGVuZ3RoX3BjayAqLwotCXsweDAzNDQsIDB4MDF9LCAvKiB4X2FkZHJfc3RhcnQgKi8KLQl7MHgwMzQ1LCAweDIwfSwgLyogeF9hZGRyX3N0YXJ0ICovCi0JezB4MDM0NiwgMHgwMn0sIC8qIHlfYWRkcl9zdGFydCAqLwotCXsweDAzNDcsIDB4MjR9LCAvKiB5X2FkZHJfc3RhcnQgKi8KLQl7MHgwMzQ4LCAweDBFfSwgLyogeF9hZGRyX2VuZCAqLwotCXsweDAzNDksIDB4QTB9LCAvKiB4X2FkZHJfZW5kICovCi0JezB4MDM0QSwgMHgwOX0sIC8qIHlfYWRkcl9lbmQgKi8KLQl7MHgwMzRCLCAweEE0fSwgLyogeV9hZGRyX2VuZCAqLwotCXsweDAzNEMsIDB4MDN9LCAvKiB4X291dHB1dF9zaXplICovCi0JezB4MDM0RCwgMHg2MH0sIC8qIHhfb3V0cHV0X3NpemUgKi8KLQl7MHgwMzRFLCAweDAxfSwgLyogeV9vdXRwdXRfc2l6ZSAqLwotCXsweDAzNEYsIDB4RTB9LCAvKiB5X291dHB1dF9zaXplICovCi0JezB4MDM4MCwgMHgwMH0sIC8qIHhfZXZlbl9pbmMgKi8KLQl7MHgwMzgxLCAweDAxfSwgLyogeF9ldmVuX2luYyAqLwotCXsweDAzODIsIDB4MDB9LCAvKiB4X29kZF9pbmMgKi8KLQl7MHgwMzgzLCAweDA3fSwgLyogeF9vZGRfaW5jICovCi0JezB4MDM4NCwgMHgwMH0sIC8qIHlfZXZlbl9pbmMgKi8KLQl7MHgwMzg1LCAweDAxfSwgLyogeV9ldmVuX2luYyAqLwotCXsweDAzODYsIDB4MDB9LCAvKiB5X29kZF9pbmMgKi8KLQl7MHgwMzg3LCAweDA3fSwgLyogeV9vZGRfaW5jICovCi0JezB4MDkwMCwgMHgwMX0sIC8qIGJpbm5pbmdfbW9kZSAqLwotCXsweDA5MDEsIDB4NDR9LCAvKiBiaW5uaW5nX3R5cGUgKi8KLQl7MHgwOTAyLCAweDAxfSwgLyogYmlubmluZ193ZWlnaHRpbmcgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgczVrM2wxeXhfdmlkZW9fOTBmcHNfc2V0dGluZ3NbXSA9IHsKLQl7MHgwNTAxLCAweDAwfSwgLyogY29tcHJlc3Npb25fYWxnb3JpdGhpbV9MKDFkKSAqLwotCXsweDAxMTIsIDB4MEF9LCAvKiBDQ1BfZGF0YV9mb3JtYXRfSCAqLwotCXsweDAxMTMsIDB4MEF9LCAvKiBDQ1BfZGF0YV9mb3JtYXRfTCByYXc4PTA4MDggLERDUE0xMCAtLT44PSAwQTA4ICovCi0JezB4MDMwNiwgMHgwMH0sIC8qIHBsbF9tdWx0aXBsaWVyICovCi0JezB4MDMwNywgMHhBNX0sIC8qIHBsbF9tdWx0aXBsaWVyICovCi0JezB4MDIwMiwgMHgwMn0sIC8qIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lICovCi0JezB4MDIwMywgMHg5MH0sIC8qIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lICovCi0JezB4MDM0MCwgMHgwMn0sIC8qIGZyYW1lX2xlbmd0aF9saW5lcyAqLwotCXsweDAzNDEsIDB4OTh9LCAvKiBmcmFtZV9sZW5ndGhfbGluZXMgKi8KLQl7MHgwMzQyLCAweDE0fSwgLyogbGluZV9sZW5ndGhfcGNrICovCi0JezB4MDM0MywgMHhEOH0sIC8qIGxpbmVfbGVuZ3RoX3BjayAqLwotCXsweDAzNDQsIDB4MDF9LCAvKiB4X2FkZHJfc3RhcnQgKi8KLQl7MHgwMzQ1LCAweDIwfSwgLyogeF9hZGRyX3N0YXJ0ICovCi0JezB4MDM0NiwgMHgwMn0sIC8qIHlfYWRkcl9zdGFydCAqLwotCXsweDAzNDcsIDB4MjR9LCAvKiB5X2FkZHJfc3RhcnQgKi8KLQl7MHgwMzQ4LCAweDBFfSwgLyogeF9hZGRyX2VuZCAqLwotCXsweDAzNDksIDB4QTB9LCAvKiB4X2FkZHJfZW5kICovCi0JezB4MDM0QSwgMHgwOX0sIC8qIHlfYWRkcl9lbmQgKi8KLQl7MHgwMzRCLCAweEE0fSwgLyogeV9hZGRyX2VuZCAqLwotCXsweDAzNEMsIDB4MDN9LCAvKiB4X291dHB1dF9zaXplICovCi0JezB4MDM0RCwgMHg2MH0sIC8qIHhfb3V0cHV0X3NpemUgKi8KLQl7MHgwMzRFLCAweDAxfSwgLyogeV9vdXRwdXRfc2l6ZSAqLwotCXsweDAzNEYsIDB4RTB9LCAvKiB5X291dHB1dF9zaXplICovCi0JezB4MDM4MCwgMHgwMH0sIC8qIHhfZXZlbl9pbmMgKi8KLQl7MHgwMzgxLCAweDAxfSwgLyogeF9ldmVuX2luYyAqLwotCXsweDAzODIsIDB4MDB9LCAvKiB4X29kZF9pbmMgKi8KLQl7MHgwMzgzLCAweDA3fSwgLyogeF9vZGRfaW5jICovCi0JezB4MDM4NCwgMHgwMH0sIC8qIHlfZXZlbl9pbmMgKi8KLQl7MHgwMzg1LCAweDAxfSwgLyogeV9ldmVuX2luYyAqLwotCXsweDAzODYsIDB4MDB9LCAvKiB5X29kZF9pbmMgKi8KLQl7MHgwMzg3LCAweDA3fSwgLyogeV9vZGRfaW5jICovCi0JezB4MDkwMCwgMHgwMX0sIC8qIGJpbm5pbmdfbW9kZSAqLwotCXsweDA5MDEsIDB4NDR9LCAvKiBiaW5uaW5nX3R5cGUgKi8KLQl7MHgwOTAyLCAweDAxfSwgLyogYmlubmluZ193ZWlnaHRpbmcgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgczVrM2wxeXhfdmlkZW9fMTIwZnBzX3NldHRpbmdzW10gPSB7Ci0JezB4MDUwMSwgMHgwMH0sIC8qIGNvbXByZXNzaW9uX2FsZ29yaXRoaW1fTCgxZCkgKi8KLQl7MHgwMTEyLCAweDBBfSwgLyogQ0NQX2RhdGFfZm9ybWF0X0ggKi8KLQl7MHgwMTEzLCAweDBBfSwgLyogQ0NQX2RhdGFfZm9ybWF0X0wgcmF3OD0wODA4ICxEQ1BNMTAgLS0+OD0gMEEwOCAqLwotCXsweDAzMDYsIDB4MDB9LCAvKiBwbGxfbXVsdGlwbGllciAqLwotCXsweDAzMDcsIDB4QTV9LCAvKiBwbGxfbXVsdGlwbGllciAqLwotCXsweDAyMDIsIDB4MDF9LCAvKiBjb2Fyc2VfaW50ZWdyYXRpb25fdGltZSAqLwotCXsweDAyMDMsIDB4RkF9LCAvKiBjb2Fyc2VfaW50ZWdyYXRpb25fdGltZSAqLwotCXsweDAzNDAsIDB4MDJ9LCAvKiBmcmFtZV9sZW5ndGhfbGluZXMgKi8KLQl7MHgwMzQxLCAweDAyfSwgLyogZnJhbWVfbGVuZ3RoX2xpbmVzICovCi0JezB4MDM0MiwgMHgxNH0sIC8qIGxpbmVfbGVuZ3RoX3BjayAqLwotCXsweDAzNDMsIDB4RDh9LCAvKiBsaW5lX2xlbmd0aF9wY2sgKi8KLQl7MHgwMzQ0LCAweDAxfSwgLyogeF9hZGRyX3N0YXJ0ICovCi0JezB4MDM0NSwgMHgyMH0sIC8qIHhfYWRkcl9zdGFydCAqLwotCXsweDAzNDYsIDB4MDJ9LCAvKiB5X2FkZHJfc3RhcnQgKi8KLQl7MHgwMzQ3LCAweDI0fSwgLyogeV9hZGRyX3N0YXJ0ICovCi0JezB4MDM0OCwgMHgwRX0sIC8qIHhfYWRkcl9lbmQgKi8KLQl7MHgwMzQ5LCAweEEwfSwgLyogeF9hZGRyX2VuZCAqLwotCXsweDAzNEEsIDB4MDl9LCAvKiB5X2FkZHJfZW5kICovCi0JezB4MDM0QiwgMHhBNH0sIC8qIHlfYWRkcl9lbmQgKi8KLQl7MHgwMzRDLCAweDAzfSwgLyogeF9vdXRwdXRfc2l6ZSAqLwotCXsweDAzNEQsIDB4NjB9LCAvKiB4X291dHB1dF9zaXplICovCi0JezB4MDM0RSwgMHgwMX0sIC8qIHlfb3V0cHV0X3NpemUgKi8KLQl7MHgwMzRGLCAweEUwfSwgLyogeV9vdXRwdXRfc2l6ZSAqLwotCXsweDAzODAsIDB4MDB9LCAvKiB4X2V2ZW5faW5jICovCi0JezB4MDM4MSwgMHgwMX0sIC8qIHhfZXZlbl9pbmMgKi8KLQl7MHgwMzgyLCAweDAwfSwgLyogeF9vZGRfaW5jICovCi0JezB4MDM4MywgMHgwN30sIC8qIHhfb2RkX2luYyAqLwotCXsweDAzODQsIDB4MDB9LCAvKiB5X2V2ZW5faW5jICovCi0JezB4MDM4NSwgMHgwMX0sIC8qIHlfZXZlbl9pbmMgKi8KLQl7MHgwMzg2LCAweDAwfSwgLyogeV9vZGRfaW5jICovCi0JezB4MDM4NywgMHgwN30sIC8qIHlfb2RkX2luYyAqLwotCXsweDA5MDAsIDB4MDF9LCAvKiBiaW5uaW5nX21vZGUgKi8KLQl7MHgwOTAxLCAweDQ0fSwgLyogYmlubmluZ190eXBlICovCi0JezB4MDkwMiwgMHgwMX0sIC8qIGJpbm5pbmdfd2VpZ2h0aW5nICovCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIHM1azNsMXl4X2RwY21fc2V0dGluZ3NbXSA9IHsKLQl7MHgwNTAxLCAweDAxfSwgLyogY29tcHJlc3Npb25fYWxnb3JpdGhpbV9MKDFkKSAqLwotCXsweDAxMTIsIDB4MEF9LCAvKiBDQ1BfZGF0YV9mb3JtYXRfSCAqLwotCXsweDAxMTMsIDB4MDh9LCAvKiBDQ1BfZGF0YV9mb3JtYXRfTCByYXc4PTA4MDggLERDUE0xMCAtLT44PSAwQTA4ICovCi0JezB4MDMwNiwgMHgwMH0sIC8qIHBsbF9tdWx0aXBsaWVyICovCi0JezB4MDMwNywgMHhBMH0sIC8qIHBsbF9tdWx0aXBsaWVyICovCi0JezB4MDIwMiwgMHgwOX0sIC8qIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lICovCi0JezB4MDIwMywgMHgzMn0sIC8qIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lICovCi0JezB4MDM0MCwgMHgwQn0sIC8qIGZyYW1lX2xlbmd0aF9saW5lcyAqLwotCXsweDAzNDEsIDB4RUN9LCAvKiBmcmFtZV9sZW5ndGhfbGluZXMgKi8KLQl7MHgwMzQyLCAweDExfSwgLyogbGluZV9sZW5ndGhfcGNrICovCi0JezB4MDM0MywgMHg4MH0sIC8qIGxpbmVfbGVuZ3RoX3BjayAqLwotCXsweDAzNDQsIDB4MDB9LCAvKiB4X2FkZHJfc3RhcnQgKi8KLQl7MHgwMzQ1LCAweDA4fSwgLyogeF9hZGRyX3N0YXJ0ICovCi0JezB4MDM0NiwgMHgwMH0sIC8qIHlfYWRkcl9zdGFydCAqLwotCXsweDAzNDcsIDB4MDB9LCAvKiB5X2FkZHJfc3RhcnQgKi8KLQl7MHgwMzQ4LCAweDBGfSwgLyogeF9hZGRyX2VuZCAqLwotCXsweDAzNDksIDB4QTd9LCAvKiB4X2FkZHJfZW5kICovCi0JezB4MDM0QSwgMHgwQn0sIC8qIHlfYWRkcl9lbmQgKi8KLQl7MHgwMzRCLCAweEM3fSwgLyogeV9hZGRyX2VuZCAqLwotCXsweDAzNEMsIDB4MEZ9LCAvKiB4X291dHB1dF9zaXplICovCi0JezB4MDM0RCwgMHhBMH0sIC8qIHhfb3V0cHV0X3NpemUgKi8KLQl7MHgwMzRFLCAweDBCfSwgLyogeV9vdXRwdXRfc2l6ZSAqLwotCXsweDAzNEYsIDB4Qzh9LCAvKiB5X291dHB1dF9zaXplICovCi0JezB4MDM4MCwgMHgwMH0sIC8qIHhfZXZlbl9pbmMgKi8KLQl7MHgwMzgxLCAweDAxfSwgLyogeF9ldmVuX2luYyAqLwotCXsweDAzODIsIDB4MDB9LCAvKiB4X29kZF9pbmMgKi8KLQl7MHgwMzgzLCAweDAxfSwgLyogeF9vZGRfaW5jICovCi0JezB4MDM4NCwgMHgwMH0sIC8qIHlfZXZlbl9pbmMgKi8KLQl7MHgwMzg1LCAweDAxfSwgLyogeV9ldmVuX2luYyAqLwotCXsweDAzODYsIDB4MDB9LCAvKiB5X29kZF9pbmMgKi8KLQl7MHgwMzg3LCAweDAxfSwgLyogeV9vZGRfaW5jICovCi0JezB4MDkwMCwgMHgwMH0sIC8qIGJpbm5pbmdfbW9kZSAqLwotCXsweDA5MDEsIDB4MjJ9LCAvKiBiaW5uaW5nX3R5cGUgKi8KLQl7MHgwOTAyLCAweDAxfSwgLyogYmlubmluZ193ZWlnaHRpbmcgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgczVrM2wxeXhfcmVjb21tZW5kX3NldHRpbmdzW10gPSB7Ci0JezB4MDEwMCwgMHgwMH0sCi0JezB4MDEwMywgMHgwMX0sIC8qIHNvZnR3YXJlX3Jlc2V0ICovCi0JezB4MDEwNCwgMHgwMH0sIC8qIGdyb3VwZWRfcGFyYW1ldGVyX2hvbGQgKi8KLQl7MHgwMTE0LCAweDAzfSwgLyogQ1NJX2xhbmVfbW9kZSwgNCBsYW5lIHNldHRpbmcgKi8KLQl7MHgwMTIwLCAweDAwfSwgLyogZ2Fpbl9tb2RlLCBnbG9iYWwgYW5hbG9ndWUgZ2FpbiovCi0JezB4MDEyMSwgMHgwMH0sIC8qIGV4cG9zdXJlX21vZGUsIGdsb2JhbCBleHBvc3VyZSAqLwotCXsweDAxMzYsIDB4MTh9LCAvKiBFeHRjbGtfZnJlcXVlbmN5X21oeiAqLwotCXsweDAxMzcsIDB4MDB9LCAvKiBFeHRjbGtfZnJlcXVlbmN5X21oeiAqLwotCXsweDAyMDAsIDB4MDh9LCAvKiBmaW5lX2ludGVncmF0aW9uX3RpbWUgKi8KLQl7MHgwMjAxLCAweDg4fSwgLyogZmluZV9pbnRlZ3JhdGlvbl90aW1lICovCi0JezB4MDIwNCwgMHgwMH0sIC8qIGFuYWxvZ3VlX2dhaW5fY29kZV9nbG9iYWwgKi8KLQl7MHgwMjA1LCAweDIwfSwgLyogYW5hbG9ndWVfZ2Fpbl9jb2RlX2dsb2JhbCAqLwotCXsweDAyMEUsIDB4MDF9LCAvKiBkaWdpdGFsX2dhaW5fZ3JlZW5SICovCi0JezB4MDIwRiwgMHgwMH0sIC8qIGRpZ2l0YWxfZ2Fpbl9ncmVlblIgKi8KLQl7MHgwMjEwLCAweDAxfSwgLyogZGlnaXRhbF9nYWluX3JlZCAqLwotCXsweDAyMTEsIDB4MDB9LCAvKiBkaWdpdGFsX2dhaW5fcmVkICovCi0JezB4MDIxMiwgMHgwMX0sIC8qIGRpZ2l0YWxfZ2Fpbl9ibHVlICovCi0JezB4MDIxMywgMHgwMH0sIC8qIGRpZ2l0YWxfZ2Fpbl9ibHVlICovCi0JezB4MDIxNCwgMHgwMX0sIC8qIGRpZ2l0YWxfZ2Fpbl9ncmVlbkIgKi8KLQl7MHgwMjE1LCAweDAwfSwgLyogZGlnaXRhbF9nYWluX2dyZWVuQiAqLwotCXsweDAzMDAsIDB4MDB9LCAvKiB2dF9waXhfY2xrX2RpdiAqLwotCXsweDAzMDEsIDB4MDJ9LCAvKiB2dF9waXhfY2xrX2RpdiAqLwotCXsweDAzMDIsIDB4MDB9LCAvKiB2dF9zeXNfY2xrX2RpdiAqLwotCXsweDAzMDMsIDB4MDF9LCAvKiB2dF9zeXNfY2xrX2RpdiAqLwotCXsweDAzMDQsIDB4MDB9LCAvKiBwcmVfcGxsX2Nsa19kaXYgKi8KLQl7MHgwMzA1LCAweDA2fSwgLyogcHJlX3BsbF9jbGtfZGl2ICovCi0JezB4MDMwOCwgMHgwMH0sIC8qIG9wX3BpeF9jbGtfZGl2ICovCi0JezB4MDMwOSwgMHgwMn0sIC8qIG9wX3BpeF9jbGtfZGl2ICovCi0JezB4MDMwQSwgMHgwMH0sIC8qIG9wX3N5c19jbGtfZGl2ICovCi0JezB4MDMwQiwgMHgwMX0sIC8qIG9wX3N5c19jbGtfZGl2ICovCi0JezB4MDgwMCwgMHgwMH0sIC8qIHRjbGtfcG9zdCBmb3IgRC1QSFkgY29udHJvbCAqLwotCXsweDA4MDEsIDB4MDB9LCAvKiB0aHNfcHJlcGFyZSBmb3IgRC1QSFkgY29udHJvbCAqLwotCXsweDA4MDIsIDB4MDB9LCAvKiB0aHNfemVyb19taW4gZm9yIEQtUEhZIGNvbnRyb2wgKi8KLQl7MHgwODAzLCAweDAwfSwgLyogdGhzX3RyYWlsIGZvciBELVBIWSBjb250cm9sICovCi0JezB4MDgwNCwgMHgwMH0sIC8qIHRjbGtfdHJhaWxfbWluIGZvciBELVBIWSBjb250cm9sICovCi0JezB4MDgwNSwgMHgwMH0sIC8qIHRjbGtfcHJlcGFyZSBmb3IgRC1QSFkgY29udHJvbCAqLwotCXsweDA4MDYsIDB4MDB9LCAvKiB0Y2xrX3plcm9femVybyBmb3IgRC1QSFkgY29udHJvbCAqLwotCXsweDA4MDcsIDB4MDB9LCAvKiB0bHB4IGZvciBELVBIWSBjb250cm9sICovCi0JezB4MDgyMCwgMHgwMn0sIC8qIHJlcXVlc3RlZF9saW5rX2JpdF9yYXRlX21icHMgKi8KLQl7MHgwODIxLCAweDk0fSwgLyogcmVxdWVzdGVkX2xpbmtfYml0X3JhdGVfbWJwcyAqLwotCXsweDA4MjIsIDB4MDB9LCAvKiByZXF1ZXN0ZWRfbGlua19iaXRfcmF0ZV9tYnBzICovCi0JezB4MDgyMywgMHgwMH0sIC8qIHJlcXVlc3RlZF9saW5rX2JpdF9yYXRlX21icHMgKi8KLQl7MHgzMDAwLCAweDBBfSwKLQl7MHgzMDAxLCAweEY3fSwKLQl7MHgzMDAyLCAweDBBfSwKLQl7MHgzMDAzLCAweEY3fSwKLQl7MHgzMDA0LCAweDA4fSwKLQl7MHgzMDA1LCAweEY4fSwKLQl7MHgzMDA2LCAweDVCfSwKLQl7MHgzMDA3LCAweDczfSwKLQl7MHgzMDA4LCAweDQ5fSwKLQl7MHgzMDA5LCAweDBDfSwKLQl7MHgzMDBBLCAweEY4fSwKLQl7MHgzMDBCLCAweDRFfSwKLQl7MHgzMDBDLCAweDY0fSwKLQl7MHgzMDBELCAweDVDfSwKLQl7MHgzMDBFLCAweDcxfSwKLQl7MHgzMDBGLCAweDBDfSwKLQl7MHgzMDEwLCAweDZBfSwKLQl7MHgzMDExLCAweDE0fSwKLQl7MHgzMDEyLCAweDE0fSwKLQl7MHgzMDEzLCAweDBDfSwKLQl7MHgzMDE0LCAweDI0fSwKLQl7MHgzMDE1LCAweDRGfSwKLQl7MHgzMDE2LCAweDg2fSwKLQl7MHgzMDE3LCAweDBFfSwKLQl7MHgzMDE4LCAweDJDfSwKLQl7MHgzMDE5LCAweDMwfSwKLQl7MHgzMDFBLCAweDMxfSwKLQl7MHgzMDFCLCAweDMyfSwKLQl7MHgzMDFDLCAweEZGfSwKLQl7MHgzMDFELCAweDMzfSwKLQl7MHgzMDFFLCAweDVDfSwKLQl7MHgzMDFGLCAweEZBfSwKLQl7MHgzMDIwLCAweDM2fSwKLQl7MHgzMDIxLCAweDQ2fSwKLQl7MHgzMDIyLCAweDkyfSwKLQl7MHgzMDIzLCAweEY1fSwKLQl7MHgzMDI0LCAweDZFfSwKLQl7MHgzMDI1LCAweDE5fSwKLQl7MHgzMDI2LCAweDMyfSwKLQl7MHgzMDI3LCAweDRCfSwKLQl7MHgzMDI4LCAweDA0fSwKLQl7MHgzMDI5LCAweDUwfSwKLQl7MHgzMDJBLCAweDBDfSwKLQl7MHgzMDJCLCAweDA0fSwKLQl7MHgzMDJDLCAweEVGfSwKLQl7MHgzMDJELCAweEMxfSwKLQl7MHgzMDJFLCAweDc0fSwKLQl7MHgzMDJGLCAweDQwfSwKLQl7MHgzMDMwLCAweDAwfSwKLQl7MHgzMDMxLCAweDAwfSwKLQl7MHgzMDMyLCAweDAwfSwKLQl7MHgzMDMzLCAweDAwfSwKLQl7MHgzMDM0LCAweDBGfSwKLQl7MHgzMDM1LCAweDAxfSwKLQl7MHgzMDM2LCAweDAwfSwKLQl7MHgzMDM3LCAweDAwfSwKLQl7MHgzMDM4LCAweDg4fSwKLQl7MHgzMDM5LCAweDk4fSwKLQl7MHgzMDNBLCAweDFGfSwKLQl7MHgzMDNCLCAweDAxfSwKLQl7MHgzMDNDLCAweDAwfSwKLQl7MHgzMDNELCAweDAzfSwKLQl7MHgzMDNFLCAweDJGfSwKLQl7MHgzMDNGLCAweDA5fSwKLQl7MHgzMDQwLCAweEZGfSwKLQl7MHgzMDQxLCAweDIyfSwKLQl7MHgzMDQyLCAweDAzfSwKLQl7MHgzMDQzLCAweDAzfSwKLQl7MHgzMDQ0LCAweDIwfSwKLQl7MHgzMDQ1LCAweDEwfSwKLQl7MHgzMDQ2LCAweDEwfSwKLQl7MHgzMDQ3LCAweDA4fSwKLQl7MHgzMDQ4LCAweDEwfSwKLQl7MHgzMDQ5LCAweDAxfSwKLQl7MHgzMDRBLCAweDAwfSwKLQl7MHgzMDRCLCAweDgwfSwKLQl7MHgzMDRDLCAweDgwfSwKLQl7MHgzMDRELCAweDAwfSwKLQl7MHgzMDRFLCAweDAwfSwKLQl7MHgzMDRGLCAweDAwfSwKLQl7MHgzMDUxLCAweDA5fSwKLQl7MHgzMDUyLCAweEM0fSwKLQl7MHgzMDVBLCAweEUwfSwKLQl7MHgzMjNELCAweDA0fSwKLQl7MHgzMjNFLCAweDM4fSwKLQl7MHgzMzA1LCAweEREfSwKLQl7MHgzMDUwLCAweDAxfSwKLQl7MHgzMjAyLCAweDAxfSwKLQl7MHgzMjAzLCAweDAxfSwKLQl7MHgzMjA0LCAweDAxfSwKLQl7MHgzMjA1LCAweDAxfSwKLQl7MHgzMjA2LCAweDAxfSwKLQl7MHgzMjA3LCAweDAxfSwKLQl7MHgzMjBBLCAweDA1fSwKLQl7MHgzMjBCLCAweDIwfSwKLQl7MHgzMjM1LCAweEI3fSwKLQl7MHgzMjRDLCAweDA0fSwKLQl7MHgzMjRBLCAweDA3fSwKLQl7MHgzOTAyLCAweDAxfSwKLQl7MHgzOTE1LCAweDcwfSwKLQl7MHgzOTE2LCAweDgwfSwKLQl7MHgzQTAwLCAweDAxfSwKLQl7MHgzQTA2LCAweDAzfSwKLQl7MHgzQjI5LCAweDAxfSwKLQl7MHgzQzExLCAweDA4fSwKLQl7MHgzQzEyLCAweDdCfSwKLQl7MHgzQzEzLCAweEMwfSwKLQl7MHgzQzE0LCAweDcwfSwKLQl7MHgzQzE1LCAweDgwfSwKLQl7MHgzQzIwLCAweDA0fSwKLQl7MHgzQzIzLCAweDAzfSwKLQl7MHgzQzI0LCAweDAwfSwKLQl7MHgzQzUwLCAweDcyfSwKLQl7MHgzQzUxLCAweDg1fSwKLQl7MHgzQzUzLCAweDQwfSwKLQl7MHgzQzU1LCAweEEwfSwKLQl7MHgzRDAwLCAweDAwfSwKLQl7MHgzRDAxLCAweDAwfSwKLQl7MHgzRDExLCAweDAxfSwKLQl7MHgzNDg2LCAweDA1fSwKLQl7MHgzQjM1LCAweDA2fSwKLQl7MHgzQTA1LCAweDAxfSwKLQl7MHgzQTA3LCAweDJCfSwKLQl7MHgzQTA5LCAweDAxfSwKLQl7MHgzOTQwLCAweEZGfSwKLQl7MHgzMzAwLCAweDAwfSwKLQl7MHgzOTAwLCAweEZGfSwKLQl7MHgzOTE0LCAweDA4fSwKLQl7MHgzQTAxLCAweDBGfSwKLQl7MHgzQTAyLCAweEEwfSwKLQl7MHgzQTAzLCAweDBCfSwKLQl7MHgzQTA0LCAweEM4fSwKLQl7MHgzNzAxLCAweDAwfSwKLQl7MHgzNzAyLCAweDAwfSwKLQl7MHgzNzAzLCAweDAwfSwKLQl7MHgzNzA0LCAweDAwfSwKLQl7MHgwMTAxLCAweDAwfSwgLyogaW1hZ2Vfb3JpZW50YXRpb24sIG1pcnJvciAmIGZsaXAgb2ZmKi8KLQl7MHgwMTA1LCAweDAxfSwgLyogbWFza19jb3JydXB0ZWRfZnJhbWVzICovCi0JezB4MDExMCwgMHgwMH0sIC8qIENTSS0yX2NoYW5uZWxfaWRlbnRpZmllciAqLwotCXsweDM5NDIsIDB4MDF9LCAvKiBbMF0gMTptaXBpLCAwOnB2aSAqLwotCXsweDBCMDAsIDB4MDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBzNWszbDF5eF8xOW1oel9wcmV2X3NldHRpbmdzW10gPSB7Ci0JezB4MDUwMSwgMHgwMH0sIC8qIGNvbXByZXNzaW9uX2FsZ29yaXRoaW1fTCgxZCkgKi8KLQl7MHgwMTEyLCAweDBBfSwgLyogQ0NQX2RhdGFfZm9ybWF0X0ggKi8KLQl7MHgwMTEzLCAweDBBfSwgLyogQ0NQX2RhdGFfZm9ybWF0X0wgcmF3OD0wODA4ICxEQ1BNMTAgLS0+OD0gMEEwOCAqLwotCXsweDAzMDYsIDB4MDB9LCAvKiBwbGxfbXVsdGlwbGllciAqLwotCXsweDAzMDcsIDB4Q0V9LCAvKiBwbGxfbXVsdGlwbGllciAqLwotCXsweDAyMDIsIDB4MDZ9LCAvKiBjb2Fyc2VfaW50ZWdyYXRpb25fdGltZSAqLwotCXsweDAyMDMsIDB4MDB9LCAvKiBjb2Fyc2VfaW50ZWdyYXRpb25fdGltZSAqLwotCXsweDAzNDAsIDB4MDl9LCAvKiBmcmFtZV9sZW5ndGhfbGluZXMgKi8KLQl7MHgwMzQxLCAweDZDfSwgLyogZnJhbWVfbGVuZ3RoX2xpbmVzICovCi0JezB4MDM0MiwgMHgxMX0sIC8qIGxpbmVfbGVuZ3RoX3BjayAqLwotCXsweDAzNDMsIDB4ODB9LCAvKiBsaW5lX2xlbmd0aF9wY2sgKi8KLQl7MHgwMzQ0LCAweDAwfSwgLyogeF9hZGRyX3N0YXJ0ICovCi0JezB4MDM0NSwgMHgxOH0sIC8qIHhfYWRkcl9zdGFydCAqLwotCXsweDAzNDYsIDB4MDB9LCAvKiB5X2FkZHJfc3RhcnQgKi8KLQl7MHgwMzQ3LCAweDAwfSwgLyogeV9hZGRyX3N0YXJ0ICovCi0JezB4MDM0OCwgMHgwRn0sIC8qIHhfYWRkcl9lbmQgKi8KLQl7MHgwMzQ5LCAweDk3fSwgLyogeF9hZGRyX2VuZCAqLwotCXsweDAzNEEsIDB4MEJ9LCAvKiB5X2FkZHJfZW5kICovCi0JezB4MDM0QiwgMHhDN30sIC8qIHlfYWRkcl9lbmQgKi8KLQl7MHgwMzRDLCAweDA3fSwgLyogeF9vdXRwdXRfc2l6ZSAqLwotCXsweDAzNEQsIDB4QzB9LCAvKiB4X291dHB1dF9zaXplICovCi0JezB4MDM0RSwgMHgwNX0sIC8qIHlfb3V0cHV0X3NpemUgKi8KLQl7MHgwMzRGLCAweEU0fSwgLyogeV9vdXRwdXRfc2l6ZSAqLwotCXsweDAzODAsIDB4MDB9LCAvKiB4X2V2ZW5faW5jICovCi0JezB4MDM4MSwgMHgwMX0sIC8qIHhfZXZlbl9pbmMgKi8KLQl7MHgwMzgyLCAweDAwfSwgLyogeF9vZGRfaW5jICovCi0JezB4MDM4MywgMHgwM30sIC8qIHhfb2RkX2luYyAqLwotCXsweDAzODQsIDB4MDB9LCAvKiB5X2V2ZW5faW5jICovCi0JezB4MDM4NSwgMHgwMX0sIC8qIHlfZXZlbl9pbmMgKi8KLQl7MHgwMzg2LCAweDAwfSwgLyogeV9vZGRfaW5jICovCi0JezB4MDM4NywgMHgwM30sIC8qIHlfb2RkX2luYyAqLwotCXsweDA5MDAsIDB4MDF9LCAvKiBiaW5uaW5nX21vZGUgKi8KLQl7MHgwOTAxLCAweDIyfSwgLyogYmlubmluZ190eXBlICovCi0JezB4MDkwMiwgMHgwMX0sIC8qIGJpbm5pbmdfd2VpZ2h0aW5nICovCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2luZm8gczVrM2wxeXhfc3ViZGV2X2luZm9bXSA9IHsKLQl7Ci0JLmNvZGUgICA9IFY0TDJfTUJVU19GTVRfU0JHR1IxMF8xWDEwLAotCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCi0JLmZtdCAgICA9IDEsCi0JLm9yZGVyICAgID0gMCwKLQl9LAotCS8qIG1vcmUgY2FuIGJlIHN1cHBvcnRlZCwgdG8gYmUgYWRkZWQgbGF0ZXIgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY29uZl9hcnJheSBzNWszbDF5eF9pbml0X2NvbmZbXSA9IHsKLQl7JnM1azNsMXl4X3JlY29tbWVuZF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKHM1azNsMXl4X3JlY29tbWVuZF9zZXR0aW5ncyksIDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfY29uZl9hcnJheSBzNWszbDF5eF9jb25mc1tdID0gewotCXsmczVrM2wxeXhfc25hcF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKHM1azNsMXl4X3NuYXBfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LAotCXsmczVrM2wxeXhfcHJldl9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKHM1azNsMXl4X3ByZXZfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LAotCXsmczVrM2wxeXhfdmlkZW9fNjBmcHNfc2V0dGluZ3NbMF0sCi0JQVJSQVlfU0laRShzNWszbDF5eF92aWRlb182MGZwc19zZXR0aW5ncyksIDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sCi0JeyZzNWszbDF5eF92aWRlb185MGZwc19zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKHM1azNsMXl4X3ZpZGVvXzkwZnBzX3NldHRpbmdzKSwgMCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLQl7JnM1azNsMXl4X3ZpZGVvXzEyMGZwc19zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKHM1azNsMXl4X3ZpZGVvXzEyMGZwc19zZXR0aW5ncyksIDAsCi0JCQkJCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sCi0JeyZzNWszbDF5eF9kcGNtX3NldHRpbmdzWzBdLAotCUFSUkFZX1NJWkUoczVrM2wxeXhfZHBjbV9zZXR0aW5ncyksIDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sCi0JeyZzNWszbDF5eF8xOW1oel9wcmV2X3NldHRpbmdzWzBdLAotCUFSUkFZX1NJWkUoczVrM2wxeXhfMTltaHpfcHJldl9zZXR0aW5ncyksIDAsIE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3Jfb3V0cHV0X2luZm9fdCBzNWszbDF5eF9kaW1lbnNpb25zW10gPSB7Ci0JLyogMjAgZnBzIHNuYXBzaG90ICovCi0JewotCQkueF9vdXRwdXQgPSA0MDAwLAotCQkueV9vdXRwdXQgPSAzMDE2LAotCQkubGluZV9sZW5ndGhfcGNsayA9IDUzMzYsCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAzMDUyLAotCQkudnRfcGl4ZWxfY2xrID0gMzMwMDAwMDAwLAotCQkub3BfcGl4ZWxfY2xrID0gMjY0MDAwMDAwLAotCQkuYmlubmluZ19mYWN0b3IgPSAxLAotCX0sCi0JLyogMzAgZnBzIHByZXZpZXcgKi8KLQl7Ci0JCS54X291dHB1dCA9IDE5ODQsCi0JCS55X291dHB1dCA9IDE1MDgsCi0JCS5saW5lX2xlbmd0aF9wY2xrID0gNDQ4MCwKLQkJLmZyYW1lX2xlbmd0aF9saW5lcyA9IDI0MTIsCi0JCS52dF9waXhlbF9jbGsgPSAzMzAwMDAwMDAsCi0JCS5vcF9waXhlbF9jbGsgPSAyNjQwMDAwMDAsCi0JCS5iaW5uaW5nX2ZhY3RvciA9IDEsCi0JfSwKLQkvKiA2MCBmcHMgdmlkZW8gKi8KLQl7Ci0JCS54X291dHB1dCA9IDg2NCwKLQkJLnlfb3V0cHV0ID0gNDgwLAotCQkubGluZV9sZW5ndGhfcGNsayA9IDUzMzYsCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSA5OTIsCi0JCS52dF9waXhlbF9jbGsgPSAzMzAwMDAwMDAsCi0JCS5vcF9waXhlbF9jbGsgPSAyNjQwMDAwMDAsCi0JCS5iaW5uaW5nX2ZhY3RvciA9IDEsCi0JfSwKLQkvKiA5MCBmcHMgdmlkZW8gKi8KLQl7Ci0JCS54X291dHB1dCA9IDg2NCwKLQkJLnlfb3V0cHV0ID0gNDgwLAotCQkubGluZV9sZW5ndGhfcGNsayA9IDUzMzYsCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSA2NjQsCi0JCS52dF9waXhlbF9jbGsgPSAzMzAwMDAwMDAsCi0JCS5vcF9waXhlbF9jbGsgPSAyNjQwMDAwMDAsCi0JCS5iaW5uaW5nX2ZhY3RvciA9IDEsCi0JfSwKLQkvKiAxMjAgZnBzIHZpZGVvICovCi0JewotCQkueF9vdXRwdXQgPSA4NjQsCi0JCS55X291dHB1dCA9IDQ4MCwKLQkJLmxpbmVfbGVuZ3RoX3BjbGsgPSA1MzM2LAotCQkuZnJhbWVfbGVuZ3RoX2xpbmVzID0gNTE0LAotCQkudnRfcGl4ZWxfY2xrID0gMzMwMDAwMDAwLAotCQkub3BfcGl4ZWxfY2xrID0gMjY0MDAwMDAwLAotCQkuYmlubmluZ19mYWN0b3IgPSAxLAotCX0sCi0JLyogMjQgZnBzIHNuYXBzaG90ICovCi0JewotCQkueF9vdXRwdXQgPSA0MDAwLAotCQkueV9vdXRwdXQgPSAzMDE2LAotCQkubGluZV9sZW5ndGhfcGNsayA9IDQ0ODAsCi0JCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAzMDUyLAotCQkudnRfcGl4ZWxfY2xrID0gMzMwMDAwMDAwLAotCQkub3BfcGl4ZWxfY2xrID0gMzIwMDAwMDAwLAotCQkuYmlubmluZ19mYWN0b3IgPSAxLAotCX0sCi0JLyogMzAgZnBzIHByZXZpZXcgd2l0aCAxOS4yIGlucHV0IGNsb2NrKi8KLQl7Ci0JCS54X291dHB1dCA9IDE5ODQsCi0JCS55X291dHB1dCA9IDE1MDgsCi0JCS5saW5lX2xlbmd0aF9wY2xrID0gNDQ4MCwKLQkJLmZyYW1lX2xlbmd0aF9saW5lcyA9IDI0MTIsCi0JCS52dF9waXhlbF9jbGsgPSAzMzAwMDAwMDAsCi0JCS5vcF9waXhlbF9jbGsgPSAyNjQwMDAwMDAsCi0JCS5iaW5uaW5nX2ZhY3RvciA9IDEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9vdXRwdXRfcmVnX2FkZHJfdCBzNWszbDF5eF9yZWdfYWRkciA9IHsKLQkueF9vdXRwdXQgPSAweDM0QywKLQkueV9vdXRwdXQgPSAweDM0RSwKLQkubGluZV9sZW5ndGhfcGNsayA9IDB4MzQyLAotCS5mcmFtZV9sZW5ndGhfbGluZXMgPSAweDM0MCwKLX07Ci0KLXN0YXRpYyBlbnVtIG1zbV9jYW1lcmFfdnJlZ19uYW1lX3QgczVrM2wxeXhfdmVnX3NlcVtdID0gewotCUNBTV9WRElHLAotCUNBTV9WQU5BLAotCUNBTV9WSU8sCi0JQ0FNX1ZBRiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9pZF9pbmZvX3QgczVrM2wxeXhfaWRfaW5mbyA9IHsKLQkuc2Vuc29yX2lkX3JlZ19hZGRyID0gMHgwLAotCS5zZW5zb3JfaWQgPSAweDMxMjEsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfZXhwX2dhaW5faW5mb190IHM1azNsMXl4X2V4cF9nYWluX2luZm8gPSB7Ci0JLmNvYXJzZV9pbnRfdGltZV9hZGRyID0gMHgyMDIsCi0JLmdsb2JhbF9nYWluX2FkZHIgPSAweDIwNCwKLQkudmVydF9vZmZzZXQgPSA4LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHM1azNsMXl4X2kyY19pZFtdID0gewotCXtTRU5TT1JfTkFNRSwgKGtlcm5lbF91bG9uZ190KSZzNWszbDF5eF9zX2N0cmx9LAotCXsgfQotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHM1azNsMXl4X2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gczVrM2wxeXhfaTJjX2lkLAotCS5wcm9iZSAgPSBtc21fc2Vuc29yX2kyY19wcm9iZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9IFNFTlNPUl9OQU1FLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCBzNWszbDF5eF9zZW5zb3JfaTJjX2NsaWVudCA9IHsKLQkuYWRkcl90eXBlID0gTVNNX0NBTUVSQV9JMkNfV09SRF9BRERSLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgczVrM2wxeXhfZHRfbWF0Y2hbXSA9IHsKLQl7LmNvbXBhdGlibGUgPSAicWNvbSxzNWszbDF5eCIsIC5kYXRhID0gJnM1azNsMXl4X3NfY3RybH0sCi0Je30KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHM1azNsMXl4X2R0X21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczVrM2wxeXhfcGxhdGZvcm1fZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInFjb20sczVrM2wxeXgiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gczVrM2wxeXhfZHRfbWF0Y2gsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQzMl90IHM1azNsMXl4X3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7Ci0JbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2UoczVrM2wxeXhfZHRfbWF0Y2gsICZwZGV2LT5kZXYpOwotCXJjID0gbXNtX3NlbnNvcl9wbGF0Zm9ybV9wcm9iZShwZGV2LCBtYXRjaC0+ZGF0YSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fc2Vuc29yX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnM1azNsMXl4X3BsYXRmb3JtX2RyaXZlciwKLQkJczVrM2wxeXhfcGxhdGZvcm1fcHJvYmUpOwotCWlmICghcmMpCi0JCXJldHVybiByYzsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnM1azNsMXl4X2kyY19kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXNtX3NlbnNvcl9leGl0X21vZHVsZSh2b2lkKQotewotCWlmIChzNWszbDF5eF9zX2N0cmwucGRldikgewotCQltc21fc2Vuc29yX2ZyZWVfc2Vuc29yX2RhdGEoJnM1azNsMXl4X3NfY3RybCk7Ci0JCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzNWszbDF5eF9wbGF0Zm9ybV9kcml2ZXIpOwotCX0gZWxzZQotCQlpMmNfZGVsX2RyaXZlcigmczVrM2wxeXhfaTJjX2RyaXZlcik7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHM1azNsMXl4X3N1YmRldl9jb3JlX29wcyA9IHsKLQkuaW9jdGwgPSBtc21fc2Vuc29yX3N1YmRldl9pb2N0bCwKLQkuc19wb3dlciA9IG1zbV9zZW5zb3JfcG93ZXIsCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBzNWszbDF5eF9zdWJkZXZfdmlkZW9fb3BzID0gewotCS5lbnVtX21idXNfZm10ID0gbXNtX3NlbnNvcl92NGwyX2VudW1fZm10LAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgczVrM2wxeXhfc3ViZGV2X29wcyA9IHsKLQkuY29yZSA9ICZzNWszbDF5eF9zdWJkZXZfY29yZV9vcHMsCi0JLnZpZGVvICA9ICZzNWszbDF5eF9zdWJkZXZfdmlkZW9fb3BzLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2ZuX3QgczVrM2wxeXhfZnVuY190YmwgPSB7Ci0JLnNlbnNvcl9zdGFydF9zdHJlYW0gPSBtc21fc2Vuc29yX3N0YXJ0X3N0cmVhbSwKLQkuc2Vuc29yX3N0b3Bfc3RyZWFtID0gbXNtX3NlbnNvcl9zdG9wX3N0cmVhbSwKLQkuc2Vuc29yX2dyb3VwX2hvbGRfb24gPSBtc21fc2Vuc29yX2dyb3VwX2hvbGRfb24sCi0JLnNlbnNvcl9ncm91cF9ob2xkX29mZiA9IG1zbV9zZW5zb3JfZ3JvdXBfaG9sZF9vZmYsCi0JLnNlbnNvcl9zZXRfZnBzID0gbXNtX3NlbnNvcl9zZXRfZnBzLAotCS5zZW5zb3Jfd3JpdGVfZXhwX2dhaW4gPSBtc21fc2Vuc29yX3dyaXRlX2V4cF9nYWluMSwKLQkuc2Vuc29yX3dyaXRlX3NuYXBzaG90X2V4cF9nYWluID0gbXNtX3NlbnNvcl93cml0ZV9leHBfZ2FpbjEsCi0JLnNlbnNvcl9zZXR0aW5nID0gbXNtX3NlbnNvcl9zZXR0aW5nLAotCS5zZW5zb3Jfc2V0X3NlbnNvcl9tb2RlID0gbXNtX3NlbnNvcl9zZXRfc2Vuc29yX21vZGUsCi0JLnNlbnNvcl9tb2RlX2luaXQgPSBtc21fc2Vuc29yX21vZGVfaW5pdCwKLQkuc2Vuc29yX2dldF9vdXRwdXRfaW5mbyA9IG1zbV9zZW5zb3JfZ2V0X291dHB1dF9pbmZvLAotCS5zZW5zb3JfY29uZmlnID0gbXNtX3NlbnNvcl9jb25maWcsCi0JLnNlbnNvcl9wb3dlcl91cCA9IG1zbV9zZW5zb3JfcG93ZXJfdXAsCi0JLnNlbnNvcl9wb3dlcl9kb3duID0gbXNtX3NlbnNvcl9wb3dlcl9kb3duLAotCS5zZW5zb3JfYWRqdXN0X2ZyYW1lX2xpbmVzID0gbXNtX3NlbnNvcl9hZGp1c3RfZnJhbWVfbGluZXMxLAotCS5zZW5zb3JfZ2V0X2NzaV9wYXJhbXMgPSBtc21fc2Vuc29yX2dldF9jc2lfcGFyYW1zLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX3JlZ190IHM1azNsMXl4X3JlZ3MgPSB7Ci0JLmRlZmF1bHRfZGF0YV90eXBlID0gTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBLAotCS5zdGFydF9zdHJlYW1fY29uZiA9IHM1azNsMXl4X3N0YXJ0X3NldHRpbmdzLAotCS5zdGFydF9zdHJlYW1fY29uZl9zaXplID0gQVJSQVlfU0laRShzNWszbDF5eF9zdGFydF9zZXR0aW5ncyksCi0JLnN0b3Bfc3RyZWFtX2NvbmYgPSBzNWszbDF5eF9zdG9wX3NldHRpbmdzLAotCS5zdG9wX3N0cmVhbV9jb25mX3NpemUgPSBBUlJBWV9TSVpFKHM1azNsMXl4X3N0b3Bfc2V0dGluZ3MpLAotCS5ncm91cF9ob2xkX29uX2NvbmYgPSBzNWszbDF5eF9ncm91cG9uX3NldHRpbmdzLAotCS5ncm91cF9ob2xkX29uX2NvbmZfc2l6ZSA9IEFSUkFZX1NJWkUoczVrM2wxeXhfZ3JvdXBvbl9zZXR0aW5ncyksCi0JLmdyb3VwX2hvbGRfb2ZmX2NvbmYgPSBzNWszbDF5eF9ncm91cG9mZl9zZXR0aW5ncywKLQkuZ3JvdXBfaG9sZF9vZmZfY29uZl9zaXplID0KLQkJQVJSQVlfU0laRShzNWszbDF5eF9ncm91cG9mZl9zZXR0aW5ncyksCi0JLmluaXRfc2V0dGluZ3MgPSAmczVrM2wxeXhfaW5pdF9jb25mWzBdLAotCS5pbml0X3NpemUgPSBBUlJBWV9TSVpFKHM1azNsMXl4X2luaXRfY29uZiksCi0JLm1vZGVfc2V0dGluZ3MgPSAmczVrM2wxeXhfY29uZnNbMF0sCi0JLm91dHB1dF9zZXR0aW5ncyA9ICZzNWszbDF5eF9kaW1lbnNpb25zWzBdLAotCS5udW1fY29uZiA9IEFSUkFZX1NJWkUoczVrM2wxeXhfY29uZnMpLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCBzNWszbDF5eF9zX2N0cmwgPSB7Ci0JLm1zbV9zZW5zb3JfcmVnID0gJnM1azNsMXl4X3JlZ3MsCi0JLnNlbnNvcl9pMmNfY2xpZW50ID0gJnM1azNsMXl4X3NlbnNvcl9pMmNfY2xpZW50LAotCS5zZW5zb3JfaTJjX2FkZHIgPSAweDZFLAotCS52cmVnX3NlcSA9IHM1azNsMXl4X3ZlZ19zZXEsCi0JLm51bV92cmVnX3NlcSA9IEFSUkFZX1NJWkUoczVrM2wxeXhfdmVnX3NlcSksCi0JLnNlbnNvcl9vdXRwdXRfcmVnX2FkZHIgPSAmczVrM2wxeXhfcmVnX2FkZHIsCi0JLnNlbnNvcl9pZF9pbmZvID0gJnM1azNsMXl4X2lkX2luZm8sCi0JLnNlbnNvcl9leHBfZ2Fpbl9pbmZvID0gJnM1azNsMXl4X2V4cF9nYWluX2luZm8sCi0JLmNhbV9tb2RlID0gTVNNX1NFTlNPUl9NT0RFX0lOVkFMSUQsCi0JLm1zbV9zZW5zb3JfbXV0ZXggPSAmczVrM2wxeXhfbXV0LAotCS5zZW5zb3JfaTJjX2RyaXZlciA9ICZzNWszbDF5eF9pMmNfZHJpdmVyLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfaW5mbyA9IHM1azNsMXl4X3N1YmRldl9pbmZvLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfaW5mb19zaXplID0gQVJSQVlfU0laRShzNWszbDF5eF9zdWJkZXZfaW5mbyksCi0JLnNlbnNvcl92NGwyX3N1YmRldl9vcHMgPSAmczVrM2wxeXhfc3ViZGV2X29wcywKLQkuZnVuY190YmwgPSAmczVrM2wxeXhfZnVuY190YmwsCi0JLmNsa19yYXRlID0gTVNNX1NFTlNPUl9NQ0xLXzI0SFosCi19OwotCi1tb2R1bGVfaW5pdChtc21fc2Vuc29yX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KG1zbV9zZW5zb3JfZXhpdF9tb2R1bGUpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIDEyTVAgQmF5ZXIgc2Vuc29yIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvczVrNGUxX3Y0bDIuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL3M1azRlMV92NGwyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NWJiMGEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvczVrNGUxX3Y0bDIuYworKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlICJtc21fc2Vuc29yLmgiCi0jZGVmaW5lIFNFTlNPUl9OQU1FICJzNWs0ZTEiCi0jZGVmaW5lIFBMQVRGT1JNX0RSSVZFUl9OQU1FICJtc21fY2FtZXJhX3M1azRlMSIKLSNkZWZpbmUgczVrNGUxX29iaiBzNWs0ZTFfIyNvYmoKLSNkZWZpbmUgTVNCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIExTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi1ERUZJTkVfTVVURVgoczVrNGUxX211dCk7Ci1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfY3RybF90IHM1azRlMV9zX2N0cmw7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgczVrNGUxX3N0YXJ0X3NldHRpbmdzW10gPSB7Ci0JezB4MDEwMCwgMHgwMX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIHM1azRlMV9zdG9wX3NldHRpbmdzW10gPSB7Ci0JezB4MDEwMCwgMHgwMH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIHM1azRlMV9ncm91cG9uX3NldHRpbmdzW10gPSB7Ci0JezB4MDEwNCwgMHgwMX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIHM1azRlMV9ncm91cG9mZl9zZXR0aW5nc1tdID0gewotCXsweDAxMDQsIDB4MDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBzNWs0ZTFfcHJldl9zZXR0aW5nc1tdID0gewotCS8qIG91dHB1dCBzaXplICgxMzA0IHggOTgwKSAqLwotCXsweDMwQTksIDB4MDJ9LC8qIEhvcml6b250YWwgQmlubmluZyBPbiAqLwotCXsweDMwMEUsIDB4RUJ9LC8qIFZlcnRpY2FsIEJpbm5pbmcgT24gKi8KLQl7MHgwMzg3LCAweDAzfSwvKiB5X29kZF9pbmMgMDMoMTBiIEFWRykgKi8KLQl7MHgwMzQ0LCAweDAwfSwvKiB4X2FkZHJfc3RhcnQgMCAqLwotCXsweDAzNDUsIDB4MDB9LAotCXsweDAzNDgsIDB4MEF9LC8qIHhfYWRkcl9lbmQgMjYwNyAqLwotCXsweDAzNDksIDB4MkZ9LAotCXsweDAzNDYsIDB4MDB9LC8qIHlfYWRkcl9zdGFydCAwICovCi0JezB4MDM0NywgMHgwMH0sCi0JezB4MDM0QSwgMHgwN30sLyogeV9hZGRyX2VuZCAxOTU5ICovCi0JezB4MDM0QiwgMHhBN30sCi0JezB4MDM4MCwgMHgwMH0sLyogeF9ldmVuX2luYyAxICovCi0JezB4MDM4MSwgMHgwMX0sCi0JezB4MDM4MiwgMHgwMH0sLyogeF9vZGRfaW5jIDEgKi8KLQl7MHgwMzgzLCAweDAxfSwKLQl7MHgwMzg0LCAweDAwfSwvKiB5X2V2ZW5faW5jIDEgKi8KLQl7MHgwMzg1LCAweDAxfSwKLQl7MHgwMzg2LCAweDAwfSwvKiB5X29kZF9pbmMgMyAqLwotCXsweDAzODcsIDB4MDN9LAotCXsweDAzNEMsIDB4MDV9LC8qIHhfb3V0cHV0X3NpemUgMTMwNCAqLwotCXsweDAzNEQsIDB4MTh9LAotCXsweDAzNEUsIDB4MDN9LC8qIHlfb3V0cHV0X3NpemUgOTgwICovCi0JezB4MDM0RiwgMHhkNH0sCi0JezB4MzBCRiwgMHhBQn0sLyogb3V0aWZfZW5hYmxlWzddLCBkYXRhX3R5cGVbNTowXSgyQmggPSBiYXllciAxMGJpdH0gKi8KLQl7MHgzMEMwLCAweEEwfSwvKiB2aWRlb19vZmZzZXRbNzo0XSAzMjYwJTEyICovCi0JezB4MzBDOCwgMHgwNn0sLyogdmlkZW9fZGF0YV9sZW5ndGggMTYwMCA9IDEzMDQgKiAxLjI1ICovCi0JezB4MzBDOSwgMHg1RX0sCi0JLyogVGltaW5nIENvbmZpZ3VyYXRpb24gKi8KLQl7MHgwMjAyLCAweDAzfSwKLQl7MHgwMjAzLCAweDE0fSwKLQl7MHgwMjA0LCAweDAwfSwKLQl7MHgwMjA1LCAweDgwfSwKLQl7MHgwMzQwLCAweDAzfSwvKiBGcmFtZSBMZW5ndGggKi8KLQl7MHgwMzQxLCAweEUwfSwKLQl7MHgwMzQyLCAweDBBfSwvKiAyNzM4ICBMaW5lIExlbmd0aCAqLwotCXsweDAzNDMsIDB4QjJ9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBzNWs0ZTFfc25hcF9zZXR0aW5nc1tdID0gewotCS8qT3V0cHV0IFNpemUgKDI2MDh4MTk2MCkqLwotCXsweDMwQTksIDB4MDN9LC8qIEhvcml6b250YWwgQmlubmluZyBPZmYgKi8KLQl7MHgzMDBFLCAweEU4fSwvKiBWZXJ0aWNhbCBCaW5uaW5nIE9mZiAqLwotCXsweDAzODcsIDB4MDF9LC8qIHlfb2RkX2luYyAqLwotCXsweDAzNEMsIDB4MEF9LC8qIHhfb3V0cHV0IHNpemUgKi8KLQl7MHgwMzRELCAweDMwfSwKLQl7MHgwMzRFLCAweDA3fSwvKiB5X291dHB1dCBzaXplICovCi0JezB4MDM0RiwgMHhBOH0sCi0JezB4MzBCRiwgMHhBQn0sLyogb3V0aWZfZW5hYmxlWzddLCBkYXRhX3R5cGVbNTowXSgyQmggPSBiYXllciAxMGJpdH0gKi8KLQl7MHgzMEMwLCAweDgwfSwvKiB2aWRlb19vZmZzZXRbNzo0XSAzMjYwJTEyICovCi0JezB4MzBDOCwgMHgwQ30sLyogdmlkZW9fZGF0YV9sZW5ndGggMzI2MCA9IDI2MDggKiAxLjI1ICovCi0JezB4MzBDOSwgMHhCQ30sCi0JLypUaW1pbmcgY29uZmlndXJhdGlvbiovCi0JezB4MDIwMiwgMHgwNn0sCi0JezB4MDIwMywgMHgyOH0sCi0JezB4MDIwNCwgMHgwMH0sCi0JezB4MDIwNSwgMHg4MH0sCi0JezB4MDM0MCwgMHgwN30sLyogRnJhbWUgTGVuZ3RoICovCi0JezB4MDM0MSwgMHhCNH0sCi0JezB4MDM0MiwgMHgwQX0sLyogMjczOCBMaW5lIExlbmd0aCAqLwotCXsweDAzNDMsIDB4QjJ9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiBzNWs0ZTFfcmVjb21tZW5kX3NldHRpbmdzW10gPSB7Ci0JLyogUmVzZXQgc2V0dGluZyAqLwotCXsweDAxMDMsIDB4MDF9LAotCS8qIE1JUEkgc2V0dGluZ3MgKi8KLQl7MHgzMEJELCAweDAwfSwvKiBTRUxfQ0NQWzBdICovCi0JezB4MzA4NCwgMHgxNX0sLyogU1lOQyBNb2RlICovCi0JezB4MzBCRSwgMHgxQX0sLyogTV9QQ0xLRElWX0FVVE9bNF0sIE1fRElWX1BDTEtbMzowXSAqLwotCXsweDMwQzEsIDB4MDF9LC8qIHBhY2sgdmlkZW8gZW5hYmxlIFswXSAqLwotCXsweDMwRUUsIDB4MDJ9LC8qIERQSFkgZW5hYmxlIFsgMV0gKi8KLQl7MHgzMTExLCAweDg2fSwvKiBFbWJlZGRlZCBkYXRhIG9mZiBbNV0gKi8KLQotCS8qIFJFQyBTZXR0aW5ncyAqLwotCS8qQ0RTIHRpbWluZyBzZXR0aW5nIC4uLiAqLwotCXsweDMwMDAsIDB4MDV9LAotCXsweDMwMDEsIDB4MDN9LAotCXsweDMwMDIsIDB4MDh9LAotCXsweDMwMDMsIDB4MEF9LAotCXsweDMwMDQsIDB4NTB9LAotCXsweDMwMDUsIDB4MEV9LAotCXsweDMwMDYsIDB4NUV9LAotCXsweDMwMDcsIDB4MDB9LAotCXsweDMwMDgsIDB4Nzh9LAotCXsweDMwMDksIDB4Nzh9LAotCXsweDMwMEEsIDB4NTB9LAotCXsweDMwMEIsIDB4MDh9LAotCXsweDMwMEMsIDB4MTR9LAotCXsweDMwMEQsIDB4MDB9LAotCXsweDMwMEUsIDB4RTh9LAotCXsweDMwMEYsIDB4ODJ9LAotCXsweDMwMUIsIDB4Nzd9LAotCi0JLyogQ0RTIG9wdGlvbiBzZXR0aW5nIC4uLiAqLwotCXsweDMwMTAsIDB4MDB9LAotCXsweDMwMTEsIDB4M0F9LAotCXsweDMwMjksIDB4MDR9LAotCXsweDMwMTIsIDB4MzB9LAotCXsweDMwMTMsIDB4QTB9LAotCXsweDMwMTQsIDB4MDB9LAotCXsweDMwMTUsIDB4MDB9LAotCXsweDMwMTYsIDB4MzB9LAotCXsweDMwMTcsIDB4OTR9LAotCXsweDMwMTgsIDB4NzB9LAotCXsweDMwMUQsIDB4RDR9LAotCXsweDMwMjEsIDB4MDJ9LAotCXsweDMwMjIsIDB4MjR9LAotCXsweDMwMjQsIDB4NDB9LAotCXsweDMwMjcsIDB4MDh9LAotCi0JLyogUGl4ZWwgb3B0aW9uIHNldHRpbmcgLi4uICAgKi8KLQl7MHgzMDFDLCAweDA0fSwKLQl7MHgzMEQ4LCAweDNGfSwKLQl7MHgzMDJCLCAweDAxfSwKLQotCXsweDMwNzAsIDB4NUZ9LAotCXsweDMwNzEsIDB4MDB9LAotCXsweDMwODAsIDB4MDR9LAotCXsweDMwODEsIDB4Mzh9LAotCi0JLyogUExMIHNldHRpbmdzICovCi0JezB4MDMwNSwgMHgwNH0sCi0JezB4MDMwNiwgMHgwMH0sCi0JezB4MDMwNywgMHg0NH0sCi0JezB4MzBCNSwgMHgwMH0sCi0JezB4MzBFMiwgMHgwMX0sLyogbnVtIGxhbmVzWzE6MF0gPSAyICovCi0JezB4MzBGMSwgMHhCMH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2luZm8gczVrNGUxX3N1YmRldl9pbmZvW10gPSB7Ci0JewotCS5jb2RlICAgPSBWNEwyX01CVVNfRk1UX1NHUkJHMTBfMVgxMCwKLQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAotCS5mbXQgICAgPSAxLAotCS5vcmRlciAgICA9IDAsCi0JfSwKLQkvKiBtb3JlIGNhbiBiZSBzdXBwb3J0ZWQsIHRvIGJlIGFkZGVkIGxhdGVyICovCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgczVrNGUxX2luaXRfY29uZltdID0gewotCXsmczVrNGUxX3JlY29tbWVuZF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKHM1azRlMV9yZWNvbW1lbmRfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9Ci19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgczVrNGUxX2NvbmZzW10gPSB7Ci0JeyZzNWs0ZTFfc25hcF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKHM1azRlMV9zbmFwX3NldHRpbmdzKSwgMCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLQl7JnM1azRlMV9wcmV2X3NldHRpbmdzWzBdLAotCUFSUkFZX1NJWkUoczVrNGUxX3ByZXZfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX291dHB1dF9pbmZvX3QgczVrNGUxX2RpbWVuc2lvbnNbXSA9IHsKLQl7Ci0JCS54X291dHB1dCA9IDB4QTMwLAotCQkueV9vdXRwdXQgPSAweDdBOCwKLQkJLmxpbmVfbGVuZ3RoX3BjbGsgPSAweEFCMiwKLQkJLmZyYW1lX2xlbmd0aF9saW5lcyA9IDB4N0I0LAotCQkudnRfcGl4ZWxfY2xrID0gODE2MDAwMDAsCi0JCS5vcF9waXhlbF9jbGsgPSA4MTYwMDAwMCwKLQkJLmJpbm5pbmdfZmFjdG9yID0gMCwKLQl9LAotCXsKLQkJLnhfb3V0cHV0ID0gMHg1MTgsCi0JCS55X291dHB1dCA9IDB4M0Q0LAotCQkubGluZV9sZW5ndGhfcGNsayA9IDB4QUIyLAotCQkuZnJhbWVfbGVuZ3RoX2xpbmVzID0gMHgzRTAsCi0JCS52dF9waXhlbF9jbGsgPSA4MTYwMDAwMCwKLQkJLm9wX3BpeGVsX2NsayA9IDgxNjAwMDAwLAotCQkuYmlubmluZ19mYWN0b3IgPSAxLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3Jfb3V0cHV0X3JlZ19hZGRyX3QgczVrNGUxX3JlZ19hZGRyID0gewotCS54X291dHB1dCA9IDB4MDM0QywKLQkueV9vdXRwdXQgPSAweDAzNEUsCi0JLmxpbmVfbGVuZ3RoX3BjbGsgPSAweDAzNDIsCi0JLmZyYW1lX2xlbmd0aF9saW5lcyA9IDB4MDM0MCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9pZF9pbmZvX3QgczVrNGUxX2lkX2luZm8gPSB7Ci0JLnNlbnNvcl9pZF9yZWdfYWRkciA9IDB4MDAwMCwKLQkuc2Vuc29yX2lkID0gMHg0RTEwLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2V4cF9nYWluX2luZm9fdCBzNWs0ZTFfZXhwX2dhaW5faW5mbyA9IHsKLQkuY29hcnNlX2ludF90aW1lX2FkZHIgPSAweDAyMDIsCi0JLmdsb2JhbF9nYWluX2FkZHIgPSAweDAyMDQsCi0JLnZlcnRfb2Zmc2V0ID0gNCwKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdWludDhfdCBzNWs0ZTFfYnl0ZSh1aW50MTZfdCB3b3JkLCB1aW50OF90IG9mZnNldCkKLXsKLQlyZXR1cm4gd29yZCA+PiAob2Zmc2V0ICogQklUU19QRVJfQllURSk7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHM1azRlMV93cml0ZV9wcmV2X2V4cF9nYWluKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCQkJCQkJdWludDE2X3QgZ2FpbiwgdWludDMyX3QgbGluZSkKLXsKLQl1aW50MTZfdCBtYXhfbGVnYWxfZ2FpbiA9IDB4MDIwMDsKLQlpbnQzMl90IHJjID0gMDsKLQlzdGF0aWMgdWludDMyX3QgZmxfbGluZXMsIG9mZnNldDsKLQotCXByX2luZm8oInM1azRlMV93cml0ZV9wcmV2X2V4cF9nYWluIDolZCAlZFxuIiwgZ2FpbiwgbGluZSk7Ci0Jb2Zmc2V0ID0gc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+dmVydF9vZmZzZXQ7Ci0JaWYgKGdhaW4gPiBtYXhfbGVnYWxfZ2FpbikgewotCQlDREJHKCJNYXggbGVnYWwgZ2FpbiBMaW5lOiVkXG4iLCBfX0xJTkVfXyk7Ci0JCWdhaW4gPSBtYXhfbGVnYWxfZ2FpbjsKLQl9Ci0KLQkvKiBBbmFsb2d1ZSBHYWluICovCi0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Z2xvYmFsX2dhaW5fYWRkciwKLQkJczVrNGUxX2J5dGUoZ2FpbiwgTVNCKSwKLQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT5nbG9iYWxfZ2Fpbl9hZGRyICsgMSwKLQkJczVrNGUxX2J5dGUoZ2FpbiwgTFNCKSwKLQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQotCWlmIChsaW5lID4gKHNfY3RybC0+Y3Vycl9mcmFtZV9sZW5ndGhfbGluZXMgLSBvZmZzZXQpKSB7Ci0JCWZsX2xpbmVzID0gbGluZSArIG9mZnNldDsKLQkJc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX2dyb3VwX2hvbGRfb24oc19jdHJsKTsKLQkJbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCXNfY3RybC0+c2Vuc29yX291dHB1dF9yZWdfYWRkci0+ZnJhbWVfbGVuZ3RoX2xpbmVzLAotCQkJczVrNGUxX2J5dGUoZmxfbGluZXMsIE1TQiksCi0JCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkJc19jdHJsLT5zZW5zb3Jfb3V0cHV0X3JlZ19hZGRyLT5mcmFtZV9sZW5ndGhfbGluZXMgKyAxLAotCQkJczVrNGUxX2J5dGUoZmxfbGluZXMsIExTQiksCi0JCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCQkvKiBDb2Fyc2UgSW50ZWdyYXRpb24gVGltZSAqLwotCQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Y29hcnNlX2ludF90aW1lX2FkZHIsCi0JCQlzNWs0ZTFfYnl0ZShsaW5lLCBNU0IpLAotCQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQkJbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCXNfY3RybC0+c2Vuc29yX2V4cF9nYWluX2luZm8tPmNvYXJzZV9pbnRfdGltZV9hZGRyICsgMSwKLQkJCXM1azRlMV9ieXRlKGxpbmUsIExTQiksCi0JCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCQlzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfZ3JvdXBfaG9sZF9vZmYoc19jdHJsKTsKLQl9IGVsc2UgaWYgKGxpbmUgPCAoZmxfbGluZXMgLSBvZmZzZXQpKSB7Ci0JCWZsX2xpbmVzID0gbGluZSArIG9mZnNldDsKLQkJaWYgKGZsX2xpbmVzIDwgc19jdHJsLT5jdXJyX2ZyYW1lX2xlbmd0aF9saW5lcykKLQkJCWZsX2xpbmVzID0gc19jdHJsLT5jdXJyX2ZyYW1lX2xlbmd0aF9saW5lczsKLQotCQlzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfZ3JvdXBfaG9sZF9vbihzX2N0cmwpOwotCQkvKiBDb2Fyc2UgSW50ZWdyYXRpb24gVGltZSAqLwotCQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Y29hcnNlX2ludF90aW1lX2FkZHIsCi0JCQlzNWs0ZTFfYnl0ZShsaW5lLCBNU0IpLAotCQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQkJbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCXNfY3RybC0+c2Vuc29yX2V4cF9nYWluX2luZm8tPmNvYXJzZV9pbnRfdGltZV9hZGRyICsgMSwKLQkJCXM1azRlMV9ieXRlKGxpbmUsIExTQiksCi0JCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkJc19jdHJsLT5zZW5zb3Jfb3V0cHV0X3JlZ19hZGRyLT5mcmFtZV9sZW5ndGhfbGluZXMsCi0JCQlzNWs0ZTFfYnl0ZShmbF9saW5lcywgTVNCKSwKLQkJCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JCW1zbV9jYW1lcmFfaTJjX3dyaXRlKHNfY3RybC0+c2Vuc29yX2kyY19jbGllbnQsCi0JCQlzX2N0cmwtPnNlbnNvcl9vdXRwdXRfcmVnX2FkZHItPmZyYW1lX2xlbmd0aF9saW5lcyArIDEsCi0JCQlzNWs0ZTFfYnl0ZShmbF9saW5lcywgTFNCKSwKLQkJCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JCXNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9ncm91cF9ob2xkX29mZihzX2N0cmwpOwotCX0gZWxzZSB7Ci0JCWZsX2xpbmVzID0gbGluZSs0OwotCQlzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfZ3JvdXBfaG9sZF9vbihzX2N0cmwpOwotCQkvKiBDb2Fyc2UgSW50ZWdyYXRpb24gVGltZSAqLwotCQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Y29hcnNlX2ludF90aW1lX2FkZHIsCi0JCQlzNWs0ZTFfYnl0ZShsaW5lLCBNU0IpLAotCQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQkJbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCXNfY3RybC0+c2Vuc29yX2V4cF9nYWluX2luZm8tPmNvYXJzZV9pbnRfdGltZV9hZGRyICsgMSwKLQkJCXM1azRlMV9ieXRlKGxpbmUsIExTQiksCi0JCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCQlzX2N0cmwtPmZ1bmNfdGJsLT5zZW5zb3JfZ3JvdXBfaG9sZF9vZmYoc19jdHJsKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBzNWs0ZTFfd3JpdGVfcGljdF9leHBfZ2FpbihzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwKLQkJdWludDE2X3QgZ2FpbiwgdWludDMyX3QgbGluZSkKLXsKLQl1aW50MTZfdCBtYXhfbGVnYWxfZ2FpbiA9IDB4MDIwMDsKLQl1aW50MTZfdCBtaW5fbGxfcGNrID0gMHgwQUIyOwotCXVpbnQzMl90IGxsX3BjaywgZmxfbGluZXM7Ci0JdWludDMyX3QgbGxfcmF0aW87Ci0JdWludDhfdCBnYWluX21zYiwgZ2Fpbl9sc2I7Ci0JdWludDhfdCBpbnRnX3RpbWVfbXNiLCBpbnRnX3RpbWVfbHNiOwotCXVpbnQ4X3QgbGxfcGNrX21zYiwgbGxfcGNrX2xzYjsKLQotCWlmIChnYWluID4gbWF4X2xlZ2FsX2dhaW4pIHsKLQkJQ0RCRygiTWF4IGxlZ2FsIGdhaW4gTGluZTolZFxuIiwgX19MSU5FX18pOwotCQlnYWluID0gbWF4X2xlZ2FsX2dhaW47Ci0JfQotCi0JcHJfaW5mbygiczVrNGUxX3dyaXRlX2V4cF9nYWluIDogZ2FpbiA9ICVkIGxpbmUgPSAlZFxuIiwgZ2FpbiwgbGluZSk7Ci0JbGluZSA9ICh1aW50MzJfdCkgKGxpbmUgKiBzX2N0cmwtPmZwc19kaXZpZGVyKTsKLQlmbF9saW5lcyA9IHNfY3RybC0+Y3Vycl9mcmFtZV9sZW5ndGhfbGluZXMgKiBzX2N0cmwtPmZwc19kaXZpZGVyIC8gUTEwOwotCWxsX3BjayA9IHNfY3RybC0+Y3Vycl9saW5lX2xlbmd0aF9wY2xrOwotCi0JaWYgKGZsX2xpbmVzIDwgKGxpbmUgLyBRMTApKQotCQlsbF9yYXRpbyA9IChsaW5lIC8gKGZsX2xpbmVzIC0gNCkpOwotCWVsc2UKLQkJbGxfcmF0aW8gPSBRMTA7Ci0KLQlsbF9wY2sgPSBsbF9wY2sgKiBsbF9yYXRpbyAvIFExMDsKLQlsaW5lID0gbGluZSAvIGxsX3JhdGlvOwotCWlmIChsbF9wY2sgPCBtaW5fbGxfcGNrKQotCQlsbF9wY2sgPSBtaW5fbGxfcGNrOwotCi0JZ2Fpbl9tc2IgPSAodWludDhfdCkgKChnYWluICYgMHhGRjAwKSA+PiA4KTsKLQlnYWluX2xzYiA9ICh1aW50OF90KSAoZ2FpbiAmIDB4MDBGRik7Ci0KLQlpbnRnX3RpbWVfbXNiID0gKHVpbnQ4X3QpICgobGluZSAmIDB4RkYwMCkgPj4gOCk7Ci0JaW50Z190aW1lX2xzYiA9ICh1aW50OF90KSAobGluZSAmIDB4MDBGRik7Ci0KLQlsbF9wY2tfbXNiID0gKHVpbnQ4X3QpICgobGxfcGNrICYgMHhGRjAwKSA+PiA4KTsKLQlsbF9wY2tfbHNiID0gKHVpbnQ4X3QpIChsbF9wY2sgJiAweDAwRkYpOwotCi0Jc19jdHJsLT5mdW5jX3RibC0+c2Vuc29yX2dyb3VwX2hvbGRfb24oc19jdHJsKTsKLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT5nbG9iYWxfZ2Fpbl9hZGRyLAotCQlnYWluX21zYiwKLQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl9leHBfZ2Fpbl9pbmZvLT5nbG9iYWxfZ2Fpbl9hZGRyICsgMSwKLQkJZ2Fpbl9sc2IsCi0JCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0KLQltc21fY2FtZXJhX2kyY193cml0ZShzX2N0cmwtPnNlbnNvcl9pMmNfY2xpZW50LAotCQlzX2N0cmwtPnNlbnNvcl9vdXRwdXRfcmVnX2FkZHItPmxpbmVfbGVuZ3RoX3BjbGssCi0JCWxsX3Bja19tc2IsCi0JCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3Jfb3V0cHV0X3JlZ19hZGRyLT5saW5lX2xlbmd0aF9wY2xrICsgMSwKLQkJbGxfcGNrX2xzYiwKLQkJTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBKTsKLQotCS8qIENvYXJzZSBJbnRlZ3JhdGlvbiBUaW1lICovCi0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Y29hcnNlX2ludF90aW1lX2FkZHIsCi0JCWludGdfdGltZV9tc2IsCi0JCU1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSk7Ci0JbXNtX2NhbWVyYV9pMmNfd3JpdGUoc19jdHJsLT5zZW5zb3JfaTJjX2NsaWVudCwKLQkJc19jdHJsLT5zZW5zb3JfZXhwX2dhaW5faW5mby0+Y29hcnNlX2ludF90aW1lX2FkZHIgKyAxLAotCQlpbnRnX3RpbWVfbHNiLAotCQlNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEEpOwotCXNfY3RybC0+ZnVuY190YmwtPnNlbnNvcl9ncm91cF9ob2xkX29mZihzX2N0cmwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludDMyX3QgczVrNGUxX3NlbnNvcl9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc19pbmZvOwotCi0JcmMgPSBtc21fc2Vuc29yX2kyY19wcm9iZShjbGllbnQsIGlkKTsKLQotCXNfaW5mbyA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaWYgKHNfaW5mbyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMgJXMgTlVMTCBzZW5zb3IgZGF0YVxuIiwgX19mdW5jX18sIGNsaWVudC0+bmFtZSk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCWlmIChzX2luZm8tPmFjdHVhdG9yX2luZm8tPnZjbV9lbmFibGUpIHsKLQkJcmMgPSBncGlvX3JlcXVlc3Qoc19pbmZvLT5hY3R1YXRvcl9pbmZvLT52Y21fcHdkLAotCQkJCSJtc21fYWN0dWF0b3IiKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXByX2VycigiJXM6IGdwaW9fcmVxdWVzdDptc21fYWN0dWF0b3IgJWQgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCBzX2luZm8tPmFjdHVhdG9yX2luZm8tPnZjbV9wd2QpOwotCQlyYyA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChzX2luZm8tPmFjdHVhdG9yX2luZm8tPnZjbV9wd2QsIDApOwotCQlpZiAocmMgPCAwKQotCQkJcHJfZXJyKCIlczogZ3Bpbzptc21fYWN0dWF0b3IgJWQgZGlyZWN0aW9uIGNhbid0IGJlIHNldFxuIiwKLQkJCQlfX2Z1bmNfXywgc19pbmZvLT5hY3R1YXRvcl9pbmZvLT52Y21fcHdkKTsKLQkJZ3Bpb19mcmVlKHNfaW5mby0+YWN0dWF0b3JfaW5mby0+dmNtX3B3ZCk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgczVrNGUxX2kyY19pZFtdID0gewotCXtTRU5TT1JfTkFNRSwgKGtlcm5lbF91bG9uZ190KSZzNWs0ZTFfc19jdHJsfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzNWs0ZTFfaTJjX2RyaXZlciA9IHsKLQkuaWRfdGFibGUgPSBzNWs0ZTFfaTJjX2lkLAotCS5wcm9iZSAgPSBzNWs0ZTFfc2Vuc29yX2kyY19wcm9iZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9IFNFTlNPUl9OQU1FLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NsaWVudCBzNWs0ZTFfc2Vuc29yX2kyY19jbGllbnQgPSB7Ci0JLmFkZHJfdHlwZSA9IE1TTV9DQU1FUkFfSTJDX1dPUkRfQUREUiwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9zZW5zb3JfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnM1azRlMV9pMmNfZHJpdmVyKTsKLX0KLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBzNWs0ZTFfc3ViZGV2X2NvcmVfb3BzID0gewotCS5pb2N0bCA9IG1zbV9zZW5zb3Jfc3ViZGV2X2lvY3RsLAotCS5zX3Bvd2VyID0gbXNtX3NlbnNvcl9wb3dlciwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIHM1azRlMV9zdWJkZXZfdmlkZW9fb3BzID0gewotCS5lbnVtX21idXNfZm10ID0gbXNtX3NlbnNvcl92NGwyX2VudW1fZm10LAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgczVrNGUxX3N1YmRldl9vcHMgPSB7Ci0JLmNvcmUgPSAmczVrNGUxX3N1YmRldl9jb3JlX29wcywKLQkudmlkZW8gID0gJnM1azRlMV9zdWJkZXZfdmlkZW9fb3BzLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2ZuX3QgczVrNGUxX2Z1bmNfdGJsID0gewotCS5zZW5zb3Jfc3RhcnRfc3RyZWFtID0gbXNtX3NlbnNvcl9zdGFydF9zdHJlYW0sCi0JLnNlbnNvcl9zdG9wX3N0cmVhbSA9IG1zbV9zZW5zb3Jfc3RvcF9zdHJlYW0sCi0JLnNlbnNvcl9ncm91cF9ob2xkX29uID0gbXNtX3NlbnNvcl9ncm91cF9ob2xkX29uLAotCS5zZW5zb3JfZ3JvdXBfaG9sZF9vZmYgPSBtc21fc2Vuc29yX2dyb3VwX2hvbGRfb2ZmLAotCS5zZW5zb3Jfc2V0X2ZwcyA9IG1zbV9zZW5zb3Jfc2V0X2ZwcywKLQkuc2Vuc29yX3dyaXRlX2V4cF9nYWluID0gczVrNGUxX3dyaXRlX3ByZXZfZXhwX2dhaW4sCi0JLnNlbnNvcl93cml0ZV9zbmFwc2hvdF9leHBfZ2FpbiA9IHM1azRlMV93cml0ZV9waWN0X2V4cF9nYWluLAotCS5zZW5zb3JfY3NpX3NldHRpbmcgPSBtc21fc2Vuc29yX3NldHRpbmcxLAotCS5zZW5zb3Jfc2V0X3NlbnNvcl9tb2RlID0gbXNtX3NlbnNvcl9zZXRfc2Vuc29yX21vZGUsCi0JLnNlbnNvcl9tb2RlX2luaXQgPSBtc21fc2Vuc29yX21vZGVfaW5pdCwKLQkuc2Vuc29yX2dldF9vdXRwdXRfaW5mbyA9IG1zbV9zZW5zb3JfZ2V0X291dHB1dF9pbmZvLAotCS5zZW5zb3JfY29uZmlnID0gbXNtX3NlbnNvcl9jb25maWcsCi0JLnNlbnNvcl9wb3dlcl91cCA9IG1zbV9zZW5zb3JfcG93ZXJfdXAsCi0JLnNlbnNvcl9wb3dlcl9kb3duID0gbXNtX3NlbnNvcl9wb3dlcl9kb3duLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX3JlZ190IHM1azRlMV9yZWdzID0gewotCS5kZWZhdWx0X2RhdGFfdHlwZSA9IE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSwKLQkuc3RhcnRfc3RyZWFtX2NvbmYgPSBzNWs0ZTFfc3RhcnRfc2V0dGluZ3MsCi0JLnN0YXJ0X3N0cmVhbV9jb25mX3NpemUgPSBBUlJBWV9TSVpFKHM1azRlMV9zdGFydF9zZXR0aW5ncyksCi0JLnN0b3Bfc3RyZWFtX2NvbmYgPSBzNWs0ZTFfc3RvcF9zZXR0aW5ncywKLQkuc3RvcF9zdHJlYW1fY29uZl9zaXplID0gQVJSQVlfU0laRShzNWs0ZTFfc3RvcF9zZXR0aW5ncyksCi0JLmdyb3VwX2hvbGRfb25fY29uZiA9IHM1azRlMV9ncm91cG9uX3NldHRpbmdzLAotCS5ncm91cF9ob2xkX29uX2NvbmZfc2l6ZSA9IEFSUkFZX1NJWkUoczVrNGUxX2dyb3Vwb25fc2V0dGluZ3MpLAotCS5ncm91cF9ob2xkX29mZl9jb25mID0gczVrNGUxX2dyb3Vwb2ZmX3NldHRpbmdzLAotCS5ncm91cF9ob2xkX29mZl9jb25mX3NpemUgPQotCQlBUlJBWV9TSVpFKHM1azRlMV9ncm91cG9mZl9zZXR0aW5ncyksCi0JLmluaXRfc2V0dGluZ3MgPSAmczVrNGUxX2luaXRfY29uZlswXSwKLQkuaW5pdF9zaXplID0gQVJSQVlfU0laRShzNWs0ZTFfaW5pdF9jb25mKSwKLQkubW9kZV9zZXR0aW5ncyA9ICZzNWs0ZTFfY29uZnNbMF0sCi0JLm91dHB1dF9zZXR0aW5ncyA9ICZzNWs0ZTFfZGltZW5zaW9uc1swXSwKLQkubnVtX2NvbmYgPSBBUlJBWV9TSVpFKHM1azRlMV9jb25mcyksCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfY3RybF90IHM1azRlMV9zX2N0cmwgPSB7Ci0JLm1zbV9zZW5zb3JfcmVnID0gJnM1azRlMV9yZWdzLAotCS5zZW5zb3JfaTJjX2NsaWVudCA9ICZzNWs0ZTFfc2Vuc29yX2kyY19jbGllbnQsCi0JLnNlbnNvcl9pMmNfYWRkciA9IDB4NkMsCi0JLnNlbnNvcl9vdXRwdXRfcmVnX2FkZHIgPSAmczVrNGUxX3JlZ19hZGRyLAotCS5zZW5zb3JfaWRfaW5mbyA9ICZzNWs0ZTFfaWRfaW5mbywKLQkuc2Vuc29yX2V4cF9nYWluX2luZm8gPSAmczVrNGUxX2V4cF9nYWluX2luZm8sCi0JLmNhbV9tb2RlID0gTVNNX1NFTlNPUl9NT0RFX0lOVkFMSUQsCi0JLm1zbV9zZW5zb3JfbXV0ZXggPSAmczVrNGUxX211dCwKLQkuc2Vuc29yX2kyY19kcml2ZXIgPSAmczVrNGUxX2kyY19kcml2ZXIsCi0JLnNlbnNvcl92NGwyX3N1YmRldl9pbmZvID0gczVrNGUxX3N1YmRldl9pbmZvLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfaW5mb19zaXplID0gQVJSQVlfU0laRShzNWs0ZTFfc3ViZGV2X2luZm8pLAotCS5zZW5zb3JfdjRsMl9zdWJkZXZfb3BzID0gJnM1azRlMV9zdWJkZXZfb3BzLAotCS5mdW5jX3RibCA9ICZzNWs0ZTFfZnVuY190YmwsCi0JLmNsa19yYXRlID0gTVNNX1NFTlNPUl9NQ0xLXzI0SFosCi19OwotCi1tb2R1bGVfaW5pdChtc21fc2Vuc29yX2luaXRfbW9kdWxlKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyA1TVAgQmF5ZXIgc2Vuc29yIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL3Z4Njk1My5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvdng2OTUzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Njc0NjguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvdng2OTUzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDM3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMC0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSAibXNtX3NlbnNvci5oIgotI2luY2x1ZGUgIm1zbS5oIgotI2luY2x1ZGUgInZ4Njk1My5oIgotI2luY2x1ZGUgInZ4Njk1M19yZWcuaCIKLSNkZWZpbmUgU0VOU09SX05BTUUgInZ4Njk1MyIKLSNkZWZpbmUgUExBVEZPUk1fRFJJVkVSX05BTUUgIm1zbV9jYW1lcmFfdng2OTUzIgotI2RlZmluZSB2eDY5NTNfb2JqIHZ4Njk1M18jI29iagotCi1ERUZJTkVfTVVURVgodng2OTUzX211dCk7Ci0KLSN1bmRlZiBDREJHCi0jZGVmaW5lIENEQkcgcHJpbnRrCi0jZGVmaW5lIFJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xECQkJMHgwMTA0Ci0jZGVmaW5lIEdST1VQRURfUEFSQU1FVEVSX0hPTERfT0ZGCQkJMHgwMAotI2RlZmluZSBHUk9VUEVEX1BBUkFNRVRFUl9IT0xECQkJCTB4MDEKLSNkZWZpbmUgUkVHX01PREVfU0VMRUNUCQkJCQkweDAxMDAKLSNkZWZpbmUgTU9ERV9TRUxFQ1RfU1RBTkRCWV9NT0RFCQkJMHgwMAotI2RlZmluZSBNT0RFX1NFTEVDVF9TVFJFQU0JCQkJMHgwMQotLyogSW50ZWdyYXRpb24gVGltZSAqLwotI2RlZmluZSBSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfSEkJCQkweDAyMDIKLSNkZWZpbmUgUkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0xPCQkJMHgwMjAzCi0vKiBHYWluICovCi0jZGVmaW5lIFJFR19BTkFMT0dVRV9HQUlOX0NPREVfR0xPQkFMX0hJCQkweDAyMDQKLSNkZWZpbmUgUkVHX0FOQUxPR1VFX0dBSU5fQ09ERV9HTE9CQUxfTE8JCTB4MDIwNQotLyogRGlnaXRhbCBHYWluICovCi0jZGVmaW5lIFJFR19ESUdJVEFMX0dBSU5fR1JFRU5fUl9ISQkJCTB4MDIwRQotI2RlZmluZSBSRUdfRElHSVRBTF9HQUlOX0dSRUVOX1JfTE8JCQkweDAyMEYKLSNkZWZpbmUgUkVHX0RJR0lUQUxfR0FJTl9SRURfSEkJCQkJMHgwMjEwCi0jZGVmaW5lIFJFR19ESUdJVEFMX0dBSU5fUkVEX0xPCQkJCTB4MDIxMQotI2RlZmluZSBSRUdfRElHSVRBTF9HQUlOX0JMVUVfSEkJCQkweDAyMTIKLSNkZWZpbmUgUkVHX0RJR0lUQUxfR0FJTl9CTFVFX0xPCQkJMHgwMjEzCi0jZGVmaW5lIFJFR19ESUdJVEFMX0dBSU5fR1JFRU5fQl9ISQkJCTB4MDIxNAotI2RlZmluZSBSRUdfRElHSVRBTF9HQUlOX0dSRUVOX0JfTE8JCQkweDAyMTUKLS8qIG91dHB1dCBiaXRzIHNldHRpbmcgKi8KLSNkZWZpbmUgUkVHXzB4MDExMgkJCQkJMHgwMTEyCi0jZGVmaW5lIFJFR18weDAxMTMJCQkJCTB4MDExMwotLyogUExMIHJlZ2lzdGVycyAqLwotI2RlZmluZSBSRUdfVlRfUElYX0NMS19ESVYJCQkJMHgwMzAxCi0jZGVmaW5lIFJFR19QUkVfUExMX0NMS19ESVYJCQkJMHgwMzA1Ci0jZGVmaW5lIFJFR19QTExfTVVMVElQTElFUgkJCQkweDAzMDcKLSNkZWZpbmUgUkVHX09QX1BJWF9DTEtfRElWCQkJCTB4MDMwOQotI2RlZmluZSBSRUdfMHgwMzRjCQkJCQkweDAzNGMKLSNkZWZpbmUgUkVHXzB4MDM0ZAkJCQkJMHgwMzRkCi0jZGVmaW5lIFJFR18weDAzNGUJCQkJCTB4MDM0ZQotI2RlZmluZSBSRUdfMHgwMzRmCQkJCQkweDAzNGYKLSNkZWZpbmUgUkVHXzB4MDM4NwkJCQkJMHgwMzg3Ci0jZGVmaW5lIFJFR18weDAzODMJCQkJCTB4MDM4MwotI2RlZmluZSBSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0hJCQkJMHgwMzQwCi0jZGVmaW5lIFJFR19GUkFNRV9MRU5HVEhfTElORVNfTE8JCQkweDAzNDEKLSNkZWZpbmUgUkVHX0xJTkVfTEVOR1RIX1BDS19ISQkJCQkweDAzNDIKLSNkZWZpbmUgUkVHX0xJTkVfTEVOR1RIX1BDS19MTwkJCQkweDAzNDMKLSNkZWZpbmUgUkVHXzB4MzAzMAkJCQkJMHgzMDMwCi0jZGVmaW5lIFJFR18weDAxMTEJCQkJCTB4MDExMQotI2RlZmluZSBSRUdfMHgwMTM2CQkJCQkweDAxMzYKLSNkZWZpbmUgUkVHXzB4MDEzNwkJCQkJMHgwMTM3Ci0jZGVmaW5lIFJFR18weDBiMDAJCQkJCTB4MGIwMAotI2RlZmluZSBSRUdfMHgzMDAxCQkJCQkweDMwMDEKLSNkZWZpbmUgUkVHXzB4MzAwNAkJCQkJMHgzMDA0Ci0jZGVmaW5lIFJFR18weDMwMDcJCQkJCTB4MzAwNwotI2RlZmluZSBSRUdfMHgzMDFhCQkJCQkweDMwMWEKLSNkZWZpbmUgUkVHXzB4MzEwMQkJCQkJMHgzMTAxCi0jZGVmaW5lIFJFR18weDMzNjQJCQkJCTB4MzM2NAotI2RlZmluZSBSRUdfMHgzMzY1CQkJCQkweDMzNjUKLSNkZWZpbmUgUkVHXzB4MGI4MwkJCQkJMHgwYjgzCi0jZGVmaW5lIFJFR18weDBiODQJCQkJCTB4MGI4NAotI2RlZmluZSBSRUdfMHgwYjg1CQkJCQkweDBiODUKLSNkZWZpbmUgUkVHXzB4MGI4OAkJCQkJMHgwYjg4Ci0jZGVmaW5lIFJFR18weDBiODkJCQkJCTB4MGI4OQotI2RlZmluZSBSRUdfMHgwYjhhCQkJCQkweDBiOGEKLSNkZWZpbmUgUkVHXzB4MzAwNQkJCQkJMHgzMDA1Ci0jZGVmaW5lIFJFR18weDMwMTAJCQkJCTB4MzAxMAotI2RlZmluZSBSRUdfMHgzMDM2CQkJCQkweDMwMzYKLSNkZWZpbmUgUkVHXzB4MzA0MQkJCQkJMHgzMDQxCi0jZGVmaW5lIFJFR18weDBiODAJCQkJCTB4MGI4MAotI2RlZmluZSBSRUdfMHgwOTAwCQkJCQkweDA5MDAKLSNkZWZpbmUgUkVHXzB4MDkwMQkJCQkJMHgwOTAxCi0jZGVmaW5lIFJFR18weDA5MDIJCQkJCTB4MDkwMgotI2RlZmluZSBSRUdfMHgzMDE2CQkJCQkweDMwMTYKLSNkZWZpbmUgUkVHXzB4MzAxZAkJCQkJMHgzMDFkCi0jZGVmaW5lIFJFR18weDMxN2UJCQkJCTB4MzE3ZQotI2RlZmluZSBSRUdfMHgzMTdmCQkJCQkweDMxN2YKLSNkZWZpbmUgUkVHXzB4MzQwMAkJCQkJMHgzNDAwCi0jZGVmaW5lIFJFR18weDMwM2EJCQkJCTB4MzAzYQotI2RlZmluZSBSRUdfMHgxNzE2CQkJCQkweDE3MTYKLSNkZWZpbmUgUkVHXzB4MTcxNwkJCQkJMHgxNzE3Ci0jZGVmaW5lIFJFR18weDE3MTgJCQkJCTB4MTcxOAotI2RlZmluZSBSRUdfMHgxNzE5CQkJCQkweDE3MTkKLSNkZWZpbmUgUkVHXzB4MzAwNgkJCQkJMHgzMDA2Ci0jZGVmaW5lIFJFR18weDMwMWIJCQkJCTB4MzAxYgotI2RlZmluZSBSRUdfMHgzMDk4CQkJCQkweDMwOTgKLSNkZWZpbmUgUkVHXzB4MzA5ZAkJCQkJMHgzMDlkCi0jZGVmaW5lIFJFR18weDMwMTEJCQkJCTB4MzAxMQotI2RlZmluZSBSRUdfMHgzMDM1CQkJCQkweDMwMzUKLSNkZWZpbmUgUkVHXzB4MzA0NQkJCQkJMHgzMDQ1Ci0jZGVmaW5lIFJFR18weDMyMTAJCQkJCTB4MzIxMAotI2RlZmluZQlSRUdfMHgwMTExCQkJCQkweDAxMTEKLSNkZWZpbmUgUkVHXzB4MzQxMAkJCQkJMHgzNDEwCi0jZGVmaW5lIFJFR18weDBiMDYJCQkJCTB4MGIwNgotI2RlZmluZSBSRUdfMHgwYjA3CQkJCQkweDBiMDcKLSNkZWZpbmUgUkVHXzB4MGIwOAkJCQkJMHgwYjA4Ci0jZGVmaW5lIFJFR18weDBiMDkJCQkJCTB4MGIwOQotI2RlZmluZSBSRUdfMHgzNjQwCQkJCQkweDM2NDAKLS8qIFRlc3QgUGF0dGVybiAqLwotI2RlZmluZSBSRUdfVEVTVF9QQVRURVJOX01PREUJCQkJMHgwNjAxCi0vKiAxNmJpdCBhZGRyZXNzIC0gOCBiaXQgY29udGV4dCByZWdpc3RlciBzdHJ1Y3R1cmUgKi8KLSNkZWZpbmUJVlg2OTUzX1NUTTVNMEVET0ZfT0ZGU0VUCTkKLSNkZWZpbmUJUTgJCTB4MDAwMDAxMDAKLSNkZWZpbmUJUTEwCQkweDAwMDAwNDAwCi0jZGVmaW5lCVZYNjk1M19TVE01TTBFRE9GX01BWF9TTkFQU0hPVF9FWFBPU1VSRV9MSU5FX0NPVU5UCTI5MjIKLSNkZWZpbmUJVlg2OTUzX1NUTTVNMEVET0ZfREVGQVVMVF9NQVNURVJfQ0xLX1JBVEUJMjQwMDAwMDAKLSNkZWZpbmUJVlg2OTUzX1NUTTVNMEVET0ZfT1BfUElYRUxfQ0xPQ0tfUkFURQk3OTgwMDAwMAotI2RlZmluZQlWWDY5NTNfU1RNNU0wRURPRl9WVF9QSVhFTF9DTE9DS19SQVRFCTg4NjcwMDAwCi0vKiBGdWxsCVNpemUgKi8KLSNkZWZpbmUJVlg2OTUzX0ZVTExfU0laRV9XSURUSAkyNjA4Ci0jZGVmaW5lCVZYNjk1M19GVUxMX1NJWkVfSEVJR0hUCQkxOTYwCi0jZGVmaW5lCVZYNjk1M19GVUxMX1NJWkVfRFVNTVlfUElYRUxTCTEKLSNkZWZpbmUJVlg2OTUzX0ZVTExfU0laRV9EVU1NWV9MSU5FUwkwCi0vKiBRdWFydGVyIFNpemUJKi8KLSNkZWZpbmUJVlg2OTUzX1FUUl9TSVpFX1dJRFRICTEzMDQKLSNkZWZpbmUJVlg2OTUzX1FUUl9TSVpFX0hFSUdIVAkJOTgwCi0jZGVmaW5lCVZYNjk1M19RVFJfU0laRV9EVU1NWV9QSVhFTFMJMQotI2RlZmluZQlWWDY5NTNfUVRSX1NJWkVfRFVNTVlfTElORVMJCTAKLS8qIEJsYW5raW5nCWFzIG1lYXN1cmVkCW9uIHRoZSBzY29wZSAqLwotLyogRnVsbAlTaXplICovCi0jZGVmaW5lCVZYNjk1M19IUlpfRlVMTF9CTEtfUElYRUxTCTM0OAotI2RlZmluZQlWWDY5NTNfVkVSX0ZVTExfQkxLX0xJTkVTCTQwCi0vKiBRdWFydGVyIFNpemUJKi8KLSNkZWZpbmUJVlg2OTUzX0hSWl9RVFJfQkxLX1BJWEVMUwkxNjI4Ci0jZGVmaW5lCVZYNjk1M19WRVJfUVRSX0JMS19MSU5FUwkyOAotI2RlZmluZQlNQVhfTElORV9MRU5HVEhfUENLCQk4MTkwCi0jZGVmaW5lCU1BWF9GUkFNRV9MRU5HVEhfTElORVMJMTYzODMKLSNkZWZpbmUJVlg2OTUzX1JFVklTSU9OX05VTUJFUl9DVVQyCTB4MTAvKnJldmlzaW9uIG51bWJlcglmb3IJQ3V0Mi4wKi8KLSNkZWZpbmUJVlg2OTUzX1JFVklTSU9OX05VTUJFUl9DVVQzCTB4MjAvKnJldmlzaW9uIG51bWJlcglmb3IJQ3V0My4wKi8KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3Qgdng2OTUzX3NfY3RybDsKLXN0YXRpYyB1aW50MzJfdCBmcHNfZGl2aWRlcjsvKiBpbml0IHRvIDEgKiAweDAwMDAwNDAwICovCi1zdGF0aWMgdWludDE2X3QgZnBzOwotc3RhdGljIHVpbnQ4X3Qgdng2OTUzX3N0bTVtMGVkb2ZfZGVsYXlfbXNlY3Nfc3RkYnk7Ci1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIHZ4Njk1M19zdGFydF9zZXR0aW5nc1tdID0gewotCXsweDAxMDAsIDB4MDF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiB2eDY5NTNfc3RvcF9zZXR0aW5nc1tdID0gewotCXsweDAxMDAsIDB4MDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiB2eDY5NTNfZ3JvdXBvbl9zZXR0aW5nc1tdID0gewotCXsweDAxMDQsIDB4MDF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiB2eDY5NTNfZ3JvdXBvZmZfc2V0dGluZ3NbXSA9IHsKLQl7MHgwMTA0LCAweDAwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgdng2OTUzX3ByZXZfc2V0dGluZ3NbXSA9IHsKLQl7MHgwMjAyLCAweDAzfSwvKlJFRyA9IDB4MDIwMiBjb2Fyc2UgaW50ZWdyYXRpb25fdGltZV9oaSovCi0JezB4MDIwMywgMHhEMH0sLypSRUcgPSAweDAyMDMgY29hcnNlX2ludGVncmF0aW9uX3RpbWVfbG8qLwotCXsweDAyMDUsIDB4QzB9LC8qUkVHID0gMHgwMjA1IGFuYWxvZ3VlX2dhaW5fY29kZV9nbG9iYWwqLwotCXsweDAzNDAsIDB4MDN9LC8qUkVHID0gMHgwMzQwIGZyYW1lX2xlbmd0aF9saW5lc19oaSovCi0JezB4MDM0MSwgMHhmMH0sLypSRUcgPSAweDAzNDEgZnJhbWVfbGVuZ3RoX2xpbmVzX2xvKi8KLQl7MHgwMzQyLCAweDBifSwvKlJFRyA9IDB4MDM0MiAgbGluZV9sZW5ndGhfcGNrX2hpKi8KLQl7MHgwMzQzLCAweDc0fSwvKlJFRyA9IDB4MDM0MyAgbGluZV9sZW5ndGhfcGNrX2xvKi8KLQl7MHgzMDA1LCAweDAzfSwvKlJFRyA9IDB4MzAwNSovCi0JezB4MzAxMCwgMHgwMH0sLypSRUcgPSAweDMwMTAqLwotCXsweDMwMTEsIDB4MDF9LC8qUkVHID0gMHgzMDExKi8KLQl7MHgzMDFhLCAweDZhfSwvKlJFRyA9IDB4MzAxYSovCi0JezB4MzAzNSwgMHgwM30sLypSRUcgPSAweDMwMzUqLwotCXsweDMwMzYsIDB4MmN9LC8qUkVHID0gMHgzMDM2Ki8KLQl7MHgzMDQxLCAweDAwfSwvKlJFRyA9IDB4MzA0MSovCi0JezB4MzA0MiwgMHgyNH0sLypSRUcgPSAweDMwNDIqLwotCXsweDMwNDUsIDB4ODF9LC8qUkVHID0gMHgzMDQ1Ki8KLQl7MHgwYjgwLCAweDAyfSwvKlJFRyA9IDB4MGI4MCBlZG9mIGVzdGltYXRlKi8KLQl7MHgwOTAwLCAweDAxfSwvKlJFRyA9IDB4MDkwMCovCi0JezB4MDkwMSwgMHgyMn0sLypSRUcgPSAweDA5MDEqLwotCXsweDA5MDIsIDB4MDR9LC8qUkVHID0gMHgwOTAyKi8KLQl7MHgwMzgzLCAweDAzfSwvKlJFRyA9IDB4MDM4MyovCi0JezB4MDM4NywgMHgwM30sLypSRUcgPSAweDAzODcqLwotCXsweDAzNGMsIDB4MDV9LC8qUkVHID0gMHgwMzRjKi8KLQl7MHgwMzRkLCAweDE4fSwvKlJFRyA9IDB4MDM0ZCovCi0JezB4MDM0ZSwgMHgwM30sLypSRUcgPSAweDAzNGUqLwotCXsweDAzNGYsIDB4ZDR9LC8qUkVHID0gMHgwMzRmKi8KLQl7MHgxNzE2LCAweDAyfSwvKjB4MTcxNiovCi0JezB4MTcxNywgMHgwNH0sLyoweDE3MTcqLwotCXsweDE3MTgsIDB4MDh9LC8qMHgxNzE4Ki8KLQl7MHgxNzE5LCAweDJjfSwvKjB4MTcxOSovCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIHZ4Njk1M19zbmFwX3NldHRpbmdzW10gPSB7Ci0JezB4MDIwMiwgMHgwN30sLypSRUcgPSAweDAyMDIgY29hcnNlX2ludGVncmF0aW9uX3RpbWVfaGkqLwotCXsweDAyMDMsIDB4MDB9LC8qUkVHID0gMHgwMjAzIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX2xvKi8KLQl7MHgwMjA1LCAweGMwfSwvKlJFRyA9IDB4MDIwNSBhbmFsb2d1ZV9nYWluX2NvZGVfZ2xvYmFsKi8KLQl7MHgwMzQwLCAweDA3fSwvKlJFRyA9IDB4MDM0MCBmcmFtZV9sZW5ndGhfbGluZXNfaGkqLwotCXsweDAzNDEsIDB4ZDB9LC8qUkVHID0gMHgwMzQxIGZyYW1lX2xlbmd0aF9saW5lc19sbyovCi0JezB4MDM0MiwgMHgwYn0sLypSRUcgPSAweDAzNDIgbGluZV9sZW5ndGhfcGNrX2hpKi8KLQl7MHgwMzQzLCAweDhjfSwvKlJFRyA9IDB4MDM0MyBsaW5lX2xlbmd0aF9wY2tfbG8qLwotCXsweDMwMDUsIDB4MDF9LC8qUkVHID0gMHgzMDA1Ki8KLQl7MHgzMDEwLCAweDAwfSwvKlJFRyA9IDB4MzAxMCovCi0JezB4MzAxMSwgMHgwMH0sLypSRUcgPSAweDMwMTEqLwotCXsweDMwMWEsIDB4NTV9LC8qUkVHID0gMHgzMDFhKi8KLQl7MHgzMDM1LCAweDAxfSwvKlJFRyA9IDB4MzAzNSovCi0JezB4MzAzNiwgMHgyM30sLypSRUcgPSAweDMwMzYqLwotCXsweDMwNDEsIDB4MDB9LC8qUkVHID0gMHgzMDQxKi8KLQl7MHgzMDQyLCAweDI0fSwvKlJFRyA9IDB4MzA0MiovCi0JezB4MzA0NSwgMHhiN30sLypSRUcgPSAweDMwNDUqLwotCXsweDBiODAsIDB4MDF9LC8qUkVHID0gMHgwYjgwIGVkb2YgYXBwbGljYXRpb24qLwotCXsweDA5MDAsIDB4MDB9LC8qUkVHID0gMHgwOTAwKi8KLQl7MHgwOTAxLCAweDAwfSwvKlJFRyA9IDB4MDkwMSovCi0JezB4MDkwMiwgMHgwMH0sLypSRUcgPSAweDA5MDIqLwotCXsweDAzODMsIDB4MDF9LC8qUkVHID0gMHgwMzgzKi8KLQl7MHgwMzg3LCAweDAxfSwvKlJFRyA9IDB4MDM4NyovCi0JezB4MDM0YywgMHgwQX0sLypSRUcgPSAweDAzNGMqLwotCXsweDAzNGQsIDB4MzB9LC8qUkVHID0gMHgwMzRkKi8KLQl7MHgwMzRlLCAweDA3fSwvKlJFRyA9IDB4MDM0ZSovCi0JezB4MDM0ZiwgMHhBOH0sLypSRUcgPSAweDAzNGYqLwotCXsweDE3MTYsIDB4MDJ9LC8qMHgxNzE2Ki8KLQl7MHgxNzE3LCAweDBkfSwvKjB4MTcxNyovCi0JezB4MTcxOCwgMHgwN30sLyoweDE3MTgqLwotCXsweDE3MTksIDB4N2R9LC8qMHgxNzE5Ki8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgdng2OTUzX3JlY29tbWVuZF9zZXR0aW5nc1tdID0gewotCXsweDAxMDMsIDB4MDF9LCAvKiBzdGFuZGJ5ICovCi0JezB4MDEwMCwgMHgwMH0sIC8qIHN0b3Agc3RyZWFtaW5nICovCi0JLyogcGF0Y2ggY3V0IDIqLwotCXsweEZCOTQsIDB9LAkvKmludGlhbGlzZSBEYXRhIFhmZXIgU3RhdHVzIHJlZyovCi0JezB4RkI5NSwgMH0sCS8qZ2FpbiAxCSAgKDB4MDApKi8KLQl7MHhGQjk2LCAwfSwJLypnYWluIDEuMDcgICAoMHgxMCkqLwotCXsweEZCOTcsIDB9LAkvKmdhaW4gMS4xNCAgICgweDIwKSovCi0JezB4RkI5OCwgMH0sCS8qZ2FpbiAxLjIzICAgKDB4MzApKi8KLQl7MHhGQjk5LCAwfSwJLypnYWluIDEuMzMgICAoMHg0MCkqLwotCXsweEZCOUEsIDB9LAkvKmdhaW4gMS40NSAgICgweDUwKSovCi0JezB4RkI5QiwgMH0sCS8qZ2FpbiAxLjYgICAgKDB4NjApKi8KLQl7MHhGQjlDLCAwfSwJLypnYWluIDEuNzggICAoMHg3MCkqLwotCXsweEZCOUQsIDJ9LAkvKmdhaW4gMgkgICgweDgwKSovCi0JezB4RkI5RSwgMn0sCS8qZ2FpbiAyLjI5ICAgKDB4OTApKi8KLQl7MHhGQjlGLCAzfSwJLypnYWluIDIuNjcgICAoMHhBMCkqLwotCXsweEZCQTAsIDN9LAkvKmdhaW4gMy4yICAgICgweEIwKSovCi0JezB4RkJBMSwgNH0sCS8qZ2FpbiA0CSAgKDB4QzApKi8KLQl7MHhGQkEyLCA3fSwJLypnYWluIDUuMzMgICAoMHhEMCkqLwotCXsweEZCQTMsIDEwfSwJLypnYWluIDgJICAoMHhFMCkqLwotCXsweEZCQTQsIDExfSwJLypnYWluIDkuMTQgICAoMHhFNCkqLwotCXsweEZCQTUsIDEzfSwJLypnYWluIDEwLjY3ICAoMHhFOCkqLwotCXsweEZCQTYsIDE1fSwJLypnYWluIDEyLjggICAoMHhFQykqLwotCXsweEZCQTcsIDE5fSwJLypnYWluIDE2ICAgICAoMHhGMCkqLwotCXsweEY4MDAsIDB4MTJ9LAotCXsweEY4MDEsIDB4MDZ9LAotCXsweEY4MDIsIDB4Zjd9LAotCXsweEY4MDMsIDB4OTB9LAotCXsweEY4MDQsIDB4MDJ9LAotCXsweEY4MDUsIDB4MDV9LAotCXsweEY4MDYsIDB4ZTB9LAotCXsweEY4MDcsIDB4ZmZ9LAotCXsweEY4MDgsIDB4NjV9LAotCXsweEY4MDksIDB4N2R9LAotCXsweEY4MEEsIDB4NzB9LAotCXsweEY4MEIsIDB4MDN9LAotCXsweEY4MEMsIDB4MDJ9LAotCXsweEY4MEQsIDB4Zjl9LAotCXsweEY4MEUsIDB4MWN9LAotCXsweEY4MEYsIDB4OGZ9LAotCXsweEY4MTAsIDB4N2R9LAotCXsweEY4MTEsIDB4ZTR9LAotCXsweEY4MTIsIDB4ZjV9LAotCXsweEY4MTMsIDB4N2F9LAotCXsweEY4MTQsIDB4NzV9LAotCXsweEY4MTUsIDB4Nzh9LAotCXsweEY4MTYsIDB4MzB9LAotCXsweEY4MTcsIDB4NzV9LAotCXsweEY4MTgsIDB4Nzl9LAotCXsweEY4MTksIDB4NTN9LAotCXsweEY4MUEsIDB4ODV9LAotCXsweEY4MUIsIDB4Nzl9LAotCXsweEY4MUMsIDB4ODJ9LAotCXsweEY4MUQsIDB4ODV9LAotCXsweEY4MUUsIDB4Nzh9LAotCXsweEY4MUYsIDB4ODN9LAotCXsweEY4MjAsIDB4ZTB9LAotCXsweEY4MjEsIDB4YzN9LAotCXsweEY4MjIsIDB4OTV9LAotCXsweEY4MjMsIDB4N2J9LAotCXsweEY4MjQsIDB4ZjB9LAotCXsweEY4MjUsIDB4NzR9LAotCXsweEY4MjYsIDB4MDJ9LAotCXsweEY4MjcsIDB4MjV9LAotCXsweEY4MjgsIDB4Nzl9LAotCXsweEY4MjksIDB4ZjV9LAotCXsweEY4MkEsIDB4Nzl9LAotCXsweEY4MkIsIDB4ZTR9LAotCXsweEY4MkMsIDB4MzV9LAotCXsweEY4MkQsIDB4Nzh9LAotCXsweEY4MkUsIDB4ZjV9LAotCXsweEY4MkYsIDB4Nzh9LAotCXsweEY4MzAsIDB4MDV9LAotCXsweEY4MzEsIDB4N2F9LAotCXsweEY4MzIsIDB4ZTV9LAotCXsweEY4MzMsIDB4N2F9LAotCXsweEY4MzQsIDB4YjR9LAotCXsweEY4MzUsIDB4MDh9LAotCXsweEY4MzYsIDB4ZTN9LAotCXsweEY4MzcsIDB4ZTV9LAotCXsweEY4MzgsIDB4N2R9LAotCXsweEY4MzksIDB4NzB9LAotCXsweEY4M0EsIDB4MDR9LAotCXsweEY4M0IsIDB4ZmZ9LAotCXsweEY4M0MsIDB4MDJ9LAotCXsweEY4M0QsIDB4Zjh9LAotCXsweEY4M0UsIDB4ZTR9LAotCXsweEY4M0YsIDB4ZTV9LAotCXsweEY4NDAsIDB4N2R9LAotCXsweEY4NDEsIDB4YjR9LAotCXsweEY4NDIsIDB4MTB9LAotCXsweEY4NDMsIDB4MDV9LAotCXsweEY4NDQsIDB4N2Z9LAotCXsweEY4NDUsIDB4MDF9LAotCXsweEY4NDYsIDB4MDJ9LAotCXsweEY4NDcsIDB4Zjh9LAotCXsweEY4NDgsIDB4ZTR9LAotCXsweEY4NDksIDB4ZTV9LAotCXsweEY4NEEsIDB4N2R9LAotCXsweEY4NEIsIDB4YjR9LAotCXsweEY4NEMsIDB4MjB9LAotCXsweEY4NEQsIDB4MDV9LAotCXsweEY4NEUsIDB4N2Z9LAotCXsweEY4NEYsIDB4MDJ9LAotCXsweEY4NTAsIDB4MDJ9LAotCXsweEY4NTEsIDB4Zjh9LAotCXsweEY4NTIsIDB4ZTR9LAotCXsweEY4NTMsIDB4ZTV9LAotCXsweEY4NTQsIDB4N2R9LAotCXsweEY4NTUsIDB4YjR9LAotCXsweEY4NTYsIDB4MzB9LAotCXsweEY4NTcsIDB4MDV9LAotCXsweEY4NTgsIDB4N2Z9LAotCXsweEY4NTksIDB4MDN9LAotCXsweEY4NUEsIDB4MDJ9LAotCXsweEY4NUIsIDB4Zjh9LAotCXsweEY4NUMsIDB4ZTR9LAotCXsweEY4NUQsIDB4ZTV9LAotCXsweEY4NUUsIDB4N2R9LAotCXsweEY4NUYsIDB4YjR9LAotCXsweEY4NjAsIDB4NDB9LAotCXsweEY4NjEsIDB4MDR9LAotCXsweEY4NjIsIDB4N2Z9LAotCXsweEY4NjMsIDB4MDR9LAotCXsweEY4NjQsIDB4ODB9LAotCXsweEY4NjUsIDB4N2V9LAotCXsweEY4NjYsIDB4ZTV9LAotCXsweEY4NjcsIDB4N2R9LAotCXsweEY4NjgsIDB4YjR9LAotCXsweEY4NjksIDB4NTB9LAotCXsweEY4NkEsIDB4MDR9LAotCXsweEY4NkIsIDB4N2Z9LAotCXsweEY4NkMsIDB4MDV9LAotCXsweEY4NkQsIDB4ODB9LAotCXsweEY4NkUsIDB4NzV9LAotCXsweEY4NkYsIDB4ZTV9LAotCXsweEY4NzAsIDB4N2R9LAotCXsweEY4NzEsIDB4YjR9LAotCXsweEY4NzIsIDB4NjB9LAotCXsweEY4NzMsIDB4MDR9LAotCXsweEY4NzQsIDB4N2Z9LAotCXsweEY4NzUsIDB4MDZ9LAotCXsweEY4NzYsIDB4ODB9LAotCXsweEY4NzcsIDB4NmN9LAotCXsweEY4NzgsIDB4ZTV9LAotCXsweEY4NzksIDB4N2R9LAotCXsweEY4N0EsIDB4YjR9LAotCXsweEY4N0IsIDB4NzB9LAotCXsweEY4N0MsIDB4MDR9LAotCXsweEY4N0QsIDB4N2Z9LAotCXsweEY4N0UsIDB4MDd9LAotCXsweEY4N0YsIDB4ODB9LAotCXsweEY4ODAsIDB4NjN9LAotCXsweEY4ODEsIDB4ZTV9LAotCXsweEY4ODIsIDB4N2R9LAotCXsweEY4ODMsIDB4YjR9LAotCXsweEY4ODQsIDB4ODB9LAotCXsweEY4ODUsIDB4MDR9LAotCXsweEY4ODYsIDB4N2Z9LAotCXsweEY4ODcsIDB4MDh9LAotCXsweEY4ODgsIDB4ODB9LAotCXsweEY4ODksIDB4NWF9LAotCXsweEY4OEEsIDB4ZTV9LAotCXsweEY4OEIsIDB4N2R9LAotCXsweEY4OEMsIDB4YjR9LAotCXsweEY4OEQsIDB4OTB9LAotCXsweEY4OEUsIDB4MDR9LAotCXsweEY4OEYsIDB4N2Z9LAotCXsweEY4OTAsIDB4MDl9LAotCXsweEY4OTEsIDB4ODB9LAotCXsweEY4OTIsIDB4NTF9LAotCXsweEY4OTMsIDB4ZTV9LAotCXsweEY4OTQsIDB4N2R9LAotCXsweEY4OTUsIDB4YjR9LAotCXsweEY4OTYsIDB4YTB9LAotCXsweEY4OTcsIDB4MDR9LAotCXsweEY4OTgsIDB4N2Z9LAotCXsweEY4OTksIDB4MGF9LAotCXsweEY4OUEsIDB4ODB9LAotCXsweEY4OUIsIDB4NDh9LAotCXsweEY4OUMsIDB4ZTV9LAotCXsweEY4OUQsIDB4N2R9LAotCXsweEY4OUUsIDB4YjR9LAotCXsweEY4OUYsIDB4YjB9LAotCXsweEY4QTAsIDB4MDR9LAotCXsweEY4QTEsIDB4N2Z9LAotCXsweEY4QTIsIDB4MGJ9LAotCXsweEY4QTMsIDB4ODB9LAotCXsweEY4QTQsIDB4M2Z9LAotCXsweEY4QTUsIDB4ZTV9LAotCXsweEY4QTYsIDB4N2R9LAotCXsweEY4QTcsIDB4YjR9LAotCXsweEY4QTgsIDB4YzB9LAotCXsweEY4QTksIDB4MDR9LAotCXsweEY4QUEsIDB4N2Z9LAotCXsweEY4QUIsIDB4MGN9LAotCXsweEY4QUMsIDB4ODB9LAotCXsweEY4QUQsIDB4MzZ9LAotCXsweEY4QUUsIDB4ZTV9LAotCXsweEY4QUYsIDB4N2R9LAotCXsweEY4QjAsIDB4YjR9LAotCXsweEY4QjEsIDB4ZDB9LAotCXsweEY4QjIsIDB4MDR9LAotCXsweEY4QjMsIDB4N2Z9LAotCXsweEY4QjQsIDB4MGR9LAotCXsweEY4QjUsIDB4ODB9LAotCXsweEY4QjYsIDB4MmR9LAotCXsweEY4QjcsIDB4ZTV9LAotCXsweEY4QjgsIDB4N2R9LAotCXsweEY4QjksIDB4YjR9LAotCXsweEY4QkEsIDB4ZTB9LAotCXsweEY4QkIsIDB4MDR9LAotCXsweEY4QkMsIDB4N2Z9LAotCXsweEY4QkQsIDB4MGV9LAotCXsweEY4QkUsIDB4ODB9LAotCXsweEY4QkYsIDB4MjR9LAotCXsweEY4QzAsIDB4ZTV9LAotCXsweEY4QzEsIDB4N2R9LAotCXsweEY4QzIsIDB4YjR9LAotCXsweEY4QzMsIDB4ZTR9LAotCXsweEY4QzQsIDB4MDR9LAotCXsweEY4QzUsIDB4N2Z9LAotCXsweEY4QzYsIDB4MGZ9LAotCXsweEY4QzcsIDB4ODB9LAotCXsweEY4QzgsIDB4MWJ9LAotCXsweEY4QzksIDB4ZTV9LAotCXsweEY4Q0EsIDB4N2R9LAotCXsweEY4Q0IsIDB4YjR9LAotCXsweEY4Q0MsIDB4ZTh9LAotCXsweEY4Q0QsIDB4MDR9LAotCXsweEY4Q0UsIDB4N2Z9LAotCXsweEY4Q0YsIDB4MTB9LAotCXsweEY4RDAsIDB4ODB9LAotCXsweEY4RDEsIDB4MTJ9LAotCXsweEY4RDIsIDB4ZTV9LAotCXsweEY4RDMsIDB4N2R9LAotCXsweEY4RDQsIDB4YjR9LAotCXsweEY4RDUsIDB4ZWN9LAotCXsweEY4RDYsIDB4MDR9LAotCXsweEY4RDcsIDB4N2Z9LAotCXsweEY4RDgsIDB4MTF9LAotCXsweEY4RDksIDB4ODB9LAotCXsweEY4REEsIDB4MDl9LAotCXsweEY4REIsIDB4ZTV9LAotCXsweEY4REMsIDB4N2R9LAotCXsweEY4REQsIDB4N2Z9LAotCXsweEY4REUsIDB4MDB9LAotCXsweEY4REYsIDB4YjR9LAotCXsweEY4RTAsIDB4ZjB9LAotCXsweEY4RTEsIDB4MDJ9LAotCXsweEY4RTIsIDB4N2Z9LAotCXsweEY4RTMsIDB4MTJ9LAotCXsweEY4RTQsIDB4OGZ9LAotCXsweEY4RTUsIDB4N2N9LAotCXsweEY4RTYsIDB4ZWZ9LAotCXsweEY4RTcsIDB4MjR9LAotCXsweEY4RTgsIDB4OTV9LAotCXsweEY4RTksIDB4ZmZ9LAotCXsweEY4RUEsIDB4ZTR9LAotCXsweEY4RUIsIDB4MzR9LAotCXsweEY4RUMsIDB4ZmJ9LAotCXsweEY4RUQsIDB4OGZ9LAotCXsweEY4RUUsIDB4ODJ9LAotCXsweEY4RUYsIDB4ZjV9LAotCXsweEY4RjAsIDB4ODN9LAotCXsweEY4RjEsIDB4ZTR9LAotCXsweEY4RjIsIDB4OTN9LAotCXsweEY4RjMsIDB4ZjV9LAotCXsweEY4RjQsIDB4N2N9LAotCXsweEY4RjUsIDB4ZjV9LAotCXsweEY4RjYsIDB4N2J9LAotCXsweEY4RjcsIDB4ZTR9LAotCXsweEY4RjgsIDB4ZjV9LAotCXsweEY4RjksIDB4N2F9LAotCXsweEY4RkEsIDB4NzV9LAotCXsweEY4RkIsIDB4Nzh9LAotCXsweEY4RkMsIDB4MzB9LAotCXsweEY4RkQsIDB4NzV9LAotCXsweEY4RkUsIDB4Nzl9LAotCXsweEY4RkYsIDB4NTN9LAotCXsweEY5MDAsIDB4ODV9LAotCXsweEY5MDEsIDB4Nzl9LAotCXsweEY5MDIsIDB4ODJ9LAotCXsweEY5MDMsIDB4ODV9LAotCXsweEY5MDQsIDB4Nzh9LAotCXsweEY5MDUsIDB4ODN9LAotCXsweEY5MDYsIDB4ZTB9LAotCXsweEY5MDcsIDB4MjV9LAotCXsweEY5MDgsIDB4N2N9LAotCXsweEY5MDksIDB4ZjB9LAotCXsweEY5MEEsIDB4NzR9LAotCXsweEY5MEIsIDB4MDJ9LAotCXsweEY5MEMsIDB4MjV9LAotCXsweEY5MEQsIDB4Nzl9LAotCXsweEY5MEUsIDB4ZjV9LAotCXsweEY5MEYsIDB4Nzl9LAotCXsweEY5MTAsIDB4ZTR9LAotCXsweEY5MTEsIDB4MzV9LAotCXsweEY5MTIsIDB4Nzh9LAotCXsweEY5MTMsIDB4ZjV9LAotCXsweEY5MTQsIDB4Nzh9LAotCXsweEY5MTUsIDB4MDV9LAotCXsweEY5MTYsIDB4N2F9LAotCXsweEY5MTcsIDB4ZTV9LAotCXsweEY5MTgsIDB4N2F9LAotCXsweEY5MTksIDB4YjR9LAotCXsweEY5MUEsIDB4MDh9LAotCXsweEY5MUIsIDB4ZTR9LAotCXsweEY5MUMsIDB4MDJ9LAotCXsweEY5MUQsIDB4MTh9LAotCXsweEY5MUUsIDB4MzJ9LAotCXsweEY5MUYsIDB4MjJ9LAotCXsweEY5MjAsIDB4ZjB9LAotCXsweEY5MjEsIDB4OTB9LAotCXsweEY5MjIsIDB4YTB9LAotCXsweEY5MjMsIDB4Zjh9LAotCXsweEY5MjQsIDB4ZTB9LAotCXsweEY5MjUsIDB4NzB9LAotCXsweEY5MjYsIDB4MDJ9LAotCXsweEY5MjcsIDB4YTN9LAotCXsweEY5MjgsIDB4ZTB9LAotCXsweEY5MjksIDB4NzB9LAotCXsweEY5MkEsIDB4MGF9LAotCXsweEY5MkIsIDB4OTB9LAotCXsweEY5MkMsIDB4YTF9LAotCXsweEY5MkQsIDB4MTB9LAotCXsweEY5MkUsIDB4ZTB9LAotCXsweEY5MkYsIDB4ZmV9LAotCXsweEY5MzAsIDB4YTN9LAotCXsweEY5MzEsIDB4ZTB9LAotCXsweEY5MzIsIDB4ZmZ9LAotCXsweEY5MzMsIDB4ODB9LAotCXsweEY5MzQsIDB4MDR9LAotCXsweEY5MzUsIDB4N2V9LAotCXsweEY5MzYsIDB4MDB9LAotCXsweEY5MzcsIDB4N2Z9LAotCXsweEY5MzgsIDB4MDB9LAotCXsweEY5MzksIDB4OGV9LAotCXsweEY5M0EsIDB4N2V9LAotCXsweEY5M0IsIDB4OGZ9LAotCXsweEY5M0MsIDB4N2Z9LAotCXsweEY5M0QsIDB4OTB9LAotCXsweEY5M0UsIDB4MzZ9LAotCXsweEY5M0YsIDB4MGR9LAotCXsweEY5NDAsIDB4ZTB9LAotCXsweEY5NDEsIDB4NDR9LAotCXsweEY5NDIsIDB4MDJ9LAotCXsweEY5NDMsIDB4ZjB9LAotCXsweEY5NDQsIDB4OTB9LAotCXsweEY5NDUsIDB4MzZ9LAotCXsweEY5NDYsIDB4MGV9LAotCXsweEY5NDcsIDB4ZTV9LAotCXsweEY5NDgsIDB4N2V9LAotCXsweEY5NDksIDB4ZjB9LAotCXsweEY5NEEsIDB4YTN9LAotCXsweEY5NEIsIDB4ZTV9LAotCXsweEY5NEMsIDB4N2Z9LAotCXsweEY5NEQsIDB4ZjB9LAotCXsweEY5NEUsIDB4ZTV9LAotCXsweEY5NEYsIDB4M2F9LAotCXsweEY5NTAsIDB4NjB9LAotCXsweEY5NTEsIDB4MGN9LAotCXsweEY5NTIsIDB4OTB9LAotCXsweEY5NTMsIDB4MzZ9LAotCXsweEY5NTQsIDB4MDl9LAotCXsweEY5NTUsIDB4ZTB9LAotCXsweEY5NTYsIDB4NzB9LAotCXsweEY5NTcsIDB4MDZ9LAotCXsweEY5NTgsIDB4OTB9LAotCXsweEY5NTksIDB4MzZ9LAotCXsweEY5NUEsIDB4MDh9LAotCXsweEY5NUIsIDB4ZjB9LAotCXsweEY5NUMsIDB4ZjV9LAotCXsweEY5NUQsIDB4M2F9LAotCXsweEY5NUUsIDB4MDJ9LAotCXsweEY5NUYsIDB4MDN9LAotCXsweEY5NjAsIDB4OTR9LAotCXsweEY5NjEsIDB4MjJ9LAotCXsweEY5NjIsIDB4Nzh9LAotCXsweEY5NjMsIDB4MDd9LAotCXsweEY5NjQsIDB4ZTZ9LAotCXsweEY5NjUsIDB4ZDN9LAotCXsweEY5NjYsIDB4OTR9LAotCXsweEY5NjcsIDB4MDB9LAotCXsweEY5NjgsIDB4NDB9LAotCXsweEY5NjksIDB4MTZ9LAotCXsweEY5NkEsIDB4MTZ9LAotCXsweEY5NkIsIDB4ZTZ9LAotCXsweEY5NkMsIDB4OTB9LAotCXsweEY5NkQsIDB4MzB9LAotCXsweEY5NkUsIDB4YTF9LAotCXsweEY5NkYsIDB4ZjB9LAotCXsweEY5NzAsIDB4OTB9LAotCXsweEY5NzEsIDB4NDN9LAotCXsweEY5NzIsIDB4ODN9LAotCXsweEY5NzMsIDB4ZTB9LAotCXsweEY5NzQsIDB4YjR9LAotCXsweEY5NzUsIDB4MDF9LAotCXsweEY5NzYsIDB4MGZ9LAotCXsweEY5NzcsIDB4OTB9LAotCXsweEY5NzgsIDB4NDN9LAotCXsweEY5NzksIDB4ODd9LAotCXsweEY5N0EsIDB4ZTB9LAotCXsweEY5N0IsIDB4YjR9LAotCXsweEY5N0MsIDB4MDF9LAotCXsweEY5N0QsIDB4MDh9LAotCXsweEY5N0UsIDB4ODB9LAotCXsweEY5N0YsIDB4MDB9LAotCXsweEY5ODAsIDB4OTB9LAotCXsweEY5ODEsIDB4MzB9LAotCXsweEY5ODIsIDB4YTB9LAotCXsweEY5ODMsIDB4NzR9LAotCXsweEY5ODQsIDB4MDF9LAotCXsweEY5ODUsIDB4ZjB9LAotCXsweEY5ODYsIDB4MjJ9LAotCXsweEY5ODcsIDB4ZjB9LAotCXsweEY5ODgsIDB4OTB9LAotCXsweEY5ODksIDB4MzV9LAotCXsweEY5OEEsIDB4YmF9LAotCXsweEY5OEIsIDB4ZTB9LAotCXsweEY5OEMsIDB4YjR9LAotCXsweEY5OEQsIDB4MGF9LAotCXsweEY5OEUsIDB4MGR9LAotCXsweEY5OEYsIDB4YTN9LAotCXsweEY5OTAsIDB4ZTB9LAotCXsweEY5OTEsIDB4YjR9LAotCXsweEY5OTIsIDB4MDF9LAotCXsweEY5OTMsIDB4MDh9LAotCXsweEY5OTQsIDB4OTB9LAotCXsweEY5OTUsIDB4ZmJ9LAotCXsweEY5OTYsIDB4OTR9LAotCXsweEY5OTcsIDB4ZTB9LAotCXsweEY5OTgsIDB4OTB9LAotCXsweEY5OTksIDB4MzV9LAotCXsweEY5OUEsIDB4Yjh9LAotCXsweEY5OUIsIDB4ZjB9LAotCXsweEY5OUMsIDB4ZDB9LAotCXsweEY5OUQsIDB4ZDB9LAotCXsweEY5OUUsIDB4ZDB9LAotCXsweEY5OUYsIDB4ODJ9LAotCXsweEY5QTAsIDB4ZDB9LAotCXsweEY5QTEsIDB4ODN9LAotCXsweEY5QTIsIDB4ZDB9LAotCXsweEY5QTMsIDB4ZTB9LAotCXsweEY5QTQsIDB4MzJ9LAotCXsweEY5QTUsIDB4MjJ9LAotCXsweEY5QTYsIDB4ZTV9LAotCXsweEY5QTcsIDB4N2Z9LAotCXsweEY5QTgsIDB4NDV9LAotCXsweEY5QTksIDB4N2V9LAotCXsweEY5QUEsIDB4NjB9LAotCXsweEY5QUIsIDB4MTV9LAotCXsweEY5QUMsIDB4OTB9LAotCXsweEY5QUQsIDB4MDF9LAotCXsweEY5QUUsIDB4MDB9LAotCXsweEY5QUYsIDB4ZTB9LAotCXsweEY5QjAsIDB4NzB9LAotCXsweEY5QjEsIDB4MGZ9LAotCXsweEY5QjIsIDB4OTB9LAotCXsweEY5QjMsIDB4YTB9LAotCXsweEY5QjQsIDB4Zjh9LAotCXsweEY5QjUsIDB4ZTV9LAotCXsweEY5QjYsIDB4N2V9LAotCXsweEY5QjcsIDB4ZjB9LAotCXsweEY5QjgsIDB4YTN9LAotCXsweEY5QjksIDB4ZTV9LAotCXsweEY5QkEsIDB4N2Z9LAotCXsweEY5QkIsIDB4ZjB9LAotCXsweEY5QkMsIDB4ZTR9LAotCXsweEY5QkQsIDB4ZjV9LAotCXsweEY5QkUsIDB4N2V9LAotCXsweEY5QkYsIDB4ZjV9LAotCXsweEY5QzAsIDB4N2Z9LAotCXsweEY5QzEsIDB4MjJ9LAotCXsweEY5QzIsIDB4MDJ9LAotCXsweEY5QzMsIDB4MGV9LAotCXsweEY5QzQsIDB4Nzl9LAotCXsweEY5QzUsIDB4MjJ9LAotCS8qIE9mZnNldHM6Ki8KLQl7MHgzNUM2LCAweDAwfSwvKiBGSURETEVEQVJLQ0FMKi8KLQl7MHgzNUM3LCAweDAwfSwKLQl7MHgzNUM4LCAweDAxfSwvKlNUT1JFRElTVEFOQ0VBVFNUT1BTVFJFQU1JTkcqLwotCXsweDM1QzksIDB4MjB9LAotCXsweDM1Q0EsIDB4MDF9LC8qQlJVQ0VGSVgqLwotCXsweDM1Q0IsIDB4NjJ9LAotCXsweDM1Q0MsIDB4MDF9LC8qRklYREFUQVhGRVJTVEFUVVNSRUcqLwotCXsweDM1Q0QsIDB4ODd9LAotCXsweDM1Q0UsIDB4MDF9LC8qRk9DVVNESVNUQU5DRVVQREFURSovCi0JezB4MzVDRiwgMHhBNn0sCi0JezB4MzVEMCwgMHgwMX0sLypTS0lQRURPRlJFU0VUKi8KLQl7MHgzNUQxLCAweEMyfSwKLQl7MHgzNUQyLCAweDAwfSwKLQl7MHgzNUQzLCAweEZCfSwKLQl7MHgzNUQ0LCAweDAwfSwKLQl7MHgzNUQ1LCAweDk0fSwKLQl7MHgzNUQ2LCAweDAwfSwKLQl7MHgzNUQ3LCAweEZCfSwKLQl7MHgzNUQ4LCAweDAwfSwKLQl7MHgzNUQ5LCAweDk0fSwKLQl7MHgzNURBLCAweDAwfSwKLQl7MHgzNURCLCAweEZCfSwKLQl7MHgzNURDLCAweDAwfSwKLQl7MHgzNURELCAweDk0fSwKLQl7MHgzNURFLCAweDAwfSwKLQl7MHgzNURGLCAweEZCfSwKLQl7MHgzNUUwLCAweDAwfSwKLQl7MHgzNUUxLCAweDk0fSwKLQl7MHgzNUU2LCAweDE4fSwvKiBGSURETEVEQVJLQ0FMKi8KLQl7MHgzNUU3LCAweDJGfSwKLQl7MHgzNUU4LCAweDAzfSwvKiBTVE9SRURJU1RBTkNFQVRTVE9QU1RSRUFNSU5HKi8KLQl7MHgzNUU5LCAweDkzfSwKLQl7MHgzNUVBLCAweDE4fSwvKiBCUlVDRUZJWCovCi0JezB4MzVFQiwgMHg5OX0sCi0JezB4MzVFQywgMHgwMH0sLyogRklYREFUQVhGRVJTVEFUVVNSRUcqLwotCXsweDM1RUQsIDB4QTN9LAotCXsweDM1RUUsIDB4MjF9LC8qIEZPQ1VTRElTVEFOQ0VVUERBVEUqLwotCXsweDM1RUYsIDB4NUJ9LAotCXsweDM1RjAsIDB4MEV9LC8qIFNLSVBFRE9GUkVTRVQqLwotCXsweDM1RjEsIDB4NzR9LAotCXsweDM1RjIsIDB4MDR9LAotCXsweDM1RjMsIDB4NjR9LAotCXsweDM1RjQsIDB4MDR9LAotCXsweDM1RjUsIDB4NjV9LAotCXsweDM1RjYsIDB4MDR9LAotCXsweDM1RjcsIDB4N0J9LAotCXsweDM1RjgsIDB4MDR9LAotCXsweDM1RjksIDB4N0N9LAotCXsweDM1RkEsIDB4MDR9LAotCXsweDM1RkIsIDB4RER9LAotCXsweDM1RkMsIDB4MDR9LAotCXsweDM1RkQsIDB4REV9LAotCXsweDM1RkUsIDB4MDR9LAotCXsweDM1RkYsIDB4RUZ9LAotCXsweDM2MDAsIDB4MDR9LAotCXsweDM2MDEsIDB4RjB9LAotCS8qSnVtcC9EYXRhOiovCi0JezB4MzVDMiwgMHgzRn0sLyogSnVtcCBSZWcqLwotCXsweDM1QzMsIDB4RkZ9LC8qIEp1bXAgUmVnKi8KLQl7MHgzNUM0LCAweDNGfSwvKiBEYXRhIFJlZyovCi0JezB4MzVDNSwgMHhDMH0sLyogRGF0YSBSZWcqLwotCXsweDM1QzAsIDB4MDF9LC8qIEVuYWJsZSovCi0JLyogZW5kIG9mIHBhdGNoIGN1dCAyICovCi0JLyogY29tbW9uIHNldHRpbmdzICovCi0JezB4MDExMiwgMTB9LC8qUkVHID0gMHgwMTEyICwgMTAgYml0ICovCi0JezB4MDExMywgMTB9LC8qUkVHID0gMHgwMTEzKi8KLQl7MHgwMzAxLCA5fSwvKlJFRyA9IDB4MDMwMSB2dF9waXhfY2xrX2RpdiovCi0JezB4MDMwNSwgNH0sLypSRUcgPSAweDAzMDUgcHJlX3BsbF9jbGtfZGl2Ki8KLQl7MHgwMzA3LCAxMzN9LC8qUkVHID0gMHgwMzA3IHBsbF9tdWx0aXBsaWVyKi8KLQl7MHgwMzA5LCAxMH0sLypSRUcgPSAweDAzMDkgb3BfcGl4X2Nsa19kaXYqLwotCXsweDMwMzAsIDB4MDh9LC8qUkVHID0gMHgzMDMwKi8KLQl7MHgwMTExLCAweDAyfSwvKlJFRyA9IDB4MDExMSovCi0JezB4MGIwMCwgMHgwMX0sLypSRUcgPSAweDBiMDAgLGxlbnMgc2hhZGluZyBvZmYgKi8KLQl7MHgzMDAxLCAweDMwfSwvKlJFRyA9IDB4MzAwMSovCi0JezB4MzAwNCwgMHgzM30sLypSRUcgPSAweDMwMDQqLwotCXsweDMwMDcsIDB4MDl9LC8qUkVHID0gMHgzMDA3Ki8KLQl7MHgzMDE2LCAweDFGfSwvKlJFRyA9IDB4MzAxNiovCi0JezB4MzAxZCwgMHgwM30sLypSRUcgPSAweDMwMWQqLwotCXsweDMxN0UsIDB4MTF9LC8qUkVHID0gMHgzMTdFKi8KLQl7MHgzMTdGLCAweDA5fSwvKlJFRyA9IDB4MzE3RiovCi0JezB4MzQwMCwgMHgzOH0sLypSRUcgPSAweDM0MDAqLwotCXsweDBiMDYsIDB4MDB9LC8qUkVHXzB4MGIwNiovCi0JezB4MGIwNywgMHg4MH0sLypSRUdfMHgwYjA3Ki8KLQl7MHgwYjA4LCAweDAxfSwvKlJFR18weDBiMDgqLwotCXsweDBiMDksIDB4NEZ9LC8qUkVHXzB4MGIwOSovCi0JezB4MDEzNiwgMHgxOH0sLypSRUdfMHgwMTM2Ki8KLQl7MHgwMTM3LCAweDAwfSwvKi9SRUdfMHgwMTM3Ki8KLQl7MHgwYjgzLCAweDIwfSwvKlJFRyA9IDB4MGI4MyovCi0JezB4MGI4NCwgMHg5MH0sLypSRUcgPSAweDBiODQqLwotCXsweDBiODUsIDB4MjB9LC8qUkVHID0gMHgwYjg1Ki8KLQl7MHgwYjg4LCAweDgwfSwvKlJFRyA9IDB4MGI4OCovCi0JezB4MGI4OSwgMHgwMH0sLypSRUcgPSAweDBiODkqLwotCXsweDBiOGEsIDB4MDB9LC8qUkVHID0gMHgwYjhhKi8KLQkvKiBlbmQgb2YgY29tbW9uIHNldHRpbmdzICovCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2luZm8gdng2OTUzX3N1YmRldl9pbmZvW10gPSB7Ci0JewotCS5jb2RlICAgPSBWNEwyX01CVVNfRk1UX1NHUkJHMTBfMVgxMCwKLQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAotCS5mbXQgICAgPSAxLAotCS5vcmRlciAgICA9IDAsCi0JfSwKLQkvKiBtb3JlIGNhbiBiZSBzdXBwb3J0ZWQsIHRvIGJlIGFkZGVkIGxhdGVyICovCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgdng2OTUzX2luaXRfY29uZltdID0gewotCXsmdng2OTUzX3JlY29tbWVuZF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKHZ4Njk1M19yZWNvbW1lbmRfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9Ci19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX2NvbmZfYXJyYXkgdng2OTUzX2NvbmZzW10gPSB7Ci0JeyZ2eDY5NTNfc25hcF9zZXR0aW5nc1swXSwKLQlBUlJBWV9TSVpFKHZ4Njk1M19zbmFwX3NldHRpbmdzKSwgMCwgTVNNX0NBTUVSQV9JMkNfQllURV9EQVRBfSwKLQl7JnZ4Njk1M19wcmV2X3NldHRpbmdzWzBdLAotCUFSUkFZX1NJWkUodng2OTUzX3ByZXZfc2V0dGluZ3MpLCAwLCBNU01fQ0FNRVJBX0kyQ19CWVRFX0RBVEF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX291dHB1dF9pbmZvX3Qgdng2OTUzX2RpbWVuc2lvbnNbXSA9IHsKLQl7Ci0JCS54X291dHB1dCA9IDB4QTMwLAotCQkueV9vdXRwdXQgPSAweDdBOCwKLQkJLmxpbmVfbGVuZ3RoX3BjbGsgPSAweEI4QywKLQkJLmZyYW1lX2xlbmd0aF9saW5lcyA9IDB4N0QwLAotCQkudnRfcGl4ZWxfY2xrID0gODg2NjY2NjYsCi0JCS5vcF9waXhlbF9jbGsgPSAxOTIwMDAwMDAsCi0JCS5iaW5uaW5nX2ZhY3RvciA9IDEsCi0JfSwKLQl7Ci0JCS54X291dHB1dCA9IDB4NTE4LAotCQkueV9vdXRwdXQgPSAweDNENCwKLQkJLmxpbmVfbGVuZ3RoX3BjbGsgPSAweEI3NCwKLQkJLmZyYW1lX2xlbmd0aF9saW5lcyA9IDB4M0YwLAotCQkudnRfcGl4ZWxfY2xrID0gODg2NjY2NjYsCi0JCS5vcF9waXhlbF9jbGsgPSAxOTIwMDAwMDAsCi0JCS5iaW5uaW5nX2ZhY3RvciA9IDEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9vdXRwdXRfcmVnX2FkZHJfdCB2eDY5NTNfcmVnX2FkZHIgPSB7Ci0JLnhfb3V0cHV0ID0gMHgwMzRDLAotCS55X291dHB1dCA9IDB4MDM0RSwKLQkubGluZV9sZW5ndGhfcGNsayA9IDB4MDM0MiwKLQkuZnJhbWVfbGVuZ3RoX2xpbmVzID0gMHgwMzQwLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2lkX2luZm9fdCB2eDY5NTNfaWRfaW5mbyA9IHsKLQkuc2Vuc29yX2lkX3JlZ19hZGRyID0gMHgwMDAwLAotCS5zZW5zb3JfaWQgPSAweDAzQjksCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfZXhwX2dhaW5faW5mb190IHZ4Njk1M19leHBfZ2Fpbl9pbmZvID0gewotCS5jb2Fyc2VfaW50X3RpbWVfYWRkciA9IDB4MDIwMiwKLQkuZ2xvYmFsX2dhaW5fYWRkciA9IDB4MDIwNCwKLQkudmVydF9vZmZzZXQgPSA5LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHZ4Njk1M19pMmNfaWRbXSA9IHsKLQl7U0VOU09SX05BTUUsIChrZXJuZWxfdWxvbmdfdCkmdng2OTUzX3NfY3RybH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdng2OTUzX2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gdng2OTUzX2kyY19pZCwKLQkucHJvYmUgID0gbXNtX3NlbnNvcl9pMmNfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBTRU5TT1JfTkFNRSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19jbGllbnQgdng2OTUzX3NlbnNvcl9pMmNfY2xpZW50ID0gewotCS5hZGRyX3R5cGUgPSBNU01fQ0FNRVJBX0kyQ19XT1JEX0FERFIsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fc2Vuc29yX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZ2eDY5NTNfaTJjX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHZ4Njk1M19zZXRfZnBzKHN0cnVjdCBtc21fc2Vuc29yX2N0cmxfdCAqc19jdHJsLAotCXN0cnVjdCBmcHNfY2ZnICpmcHMpIHsKLQlyZXR1cm4gMDsKLX0KLQotaW50MzJfdCB2eDY5NTNfd3JpdGVfZXhwX2dhaW4oc3RydWN0IG1zbV9zZW5zb3JfY3RybF90ICpzX2N0cmwsCi0JdWludDE2X3QgZ2FpbiwgdWludDMyX3QgbGluZSkgewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHZ4Njk1M19zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmlvY3RsID0gbXNtX3NlbnNvcl9zdWJkZXZfaW9jdGwsCi0JLnNfcG93ZXIgPSBtc21fc2Vuc29yX3Bvd2VyLAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgdng2OTUzX3N1YmRldl92aWRlb19vcHMgPSB7Ci0JLmVudW1fbWJ1c19mbXQgPSBtc21fc2Vuc29yX3Y0bDJfZW51bV9mbXQsCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyB2eDY5NTNfc3ViZGV2X29wcyA9IHsKLQkuY29yZSA9ICZ2eDY5NTNfc3ViZGV2X2NvcmVfb3BzLAotCS52aWRlbyAgPSAmdng2OTUzX3N1YmRldl92aWRlb19vcHMsCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIHZ4Njk1M19lZG9mX2VzdGltYXRpb25bXSA9IHsKLQl7UkVHXzB4MGI4MCwgMHgwMn0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIHZ4Njk1M19lZG9mX2FwcGxpY2F0aW9uW10gPSB7Ci0Je1JFR18weDBiODAsIDB4MDF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiB2eDY5NTNfZWRvZl9kZWZhdWx0W10gPSB7Ci0Je1JFR18weDBiODAsIDB4MDB9LAotfTsKLQotc3RhdGljIGludCB2eDY5NTNfZW5hYmxlX2Vkb2YoZW51bSBlZG9mX21vZGVfdCBlZG9mX21vZGUpCi17Ci0JaW50IHJjID0gMDsKLQlpZiAoZWRvZl9tb2RlID09IFZYNjk1M19FRE9GX0VTVElNQVRJT04pIHsKLQkJLyogRURvZiBFc3RpbWF0aW9uIG1vZGUgZm9yIHByZXZpZXcgKi8KLQkJbXNtX2NhbWVyYV9pMmNfd3JpdGVfdGJsKAotCQkJdng2OTUzX3NfY3RybC5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCXZ4Njk1M19lZG9mX2VzdGltYXRpb24sCi0JCQlBUlJBWV9TSVpFKHZ4Njk1M19lZG9mX2VzdGltYXRpb24pLAotCQkJdng2OTUzX3NfY3RybC5tc21fc2Vuc29yX3JlZy0+ZGVmYXVsdF9kYXRhX3R5cGUpOwotCQlDREJHKCJWWDY5NTNfRURPRl9FU1RJTUFUSU9OIik7Ci0JfSBlbHNlIGlmIChlZG9mX21vZGUgPT0gVlg2OTUzX0VET0ZfQVBQTElDQVRJT04pIHsKLQkJLyogRURvZiBBcHBsaWNhdGlvbiBtb2RlIGZvciBDYXB0dXJlICovCi0JCW1zbV9jYW1lcmFfaTJjX3dyaXRlX3RibCgKLQkJCXZ4Njk1M19zX2N0cmwuc2Vuc29yX2kyY19jbGllbnQsCi0JCQl2eDY5NTNfZWRvZl9hcHBsaWNhdGlvbiwKLQkJCUFSUkFZX1NJWkUodng2OTUzX2Vkb2ZfYXBwbGljYXRpb24pLAotCQkJdng2OTUzX3NfY3RybC5tc21fc2Vuc29yX3JlZy0+ZGVmYXVsdF9kYXRhX3R5cGUpOwotCQlDREJHKCJWWDY5NTNfRURPRl9BUFBMSUNBVElPTiIpOwotCX0gZWxzZSB7Ci0JCS8qIEVET0YgZGlzYWJsZWQgKi8KLQkJbXNtX2NhbWVyYV9pMmNfd3JpdGVfdGJsKAotCQkJdng2OTUzX3NfY3RybC5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCXZ4Njk1M19lZG9mX2RlZmF1bHQsCi0JCQlBUlJBWV9TSVpFKHZ4Njk1M19lZG9mX2RlZmF1bHQpLAotCQkJdng2OTUzX3NfY3RybC5tc21fc2Vuc29yX3JlZy0+ZGVmYXVsdF9kYXRhX3R5cGUpOwotCQlDREJHKCJWWDY5NTNfRURPRl9ESVNBQkxFIik7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfY29uZiB2eDY5NTNfc3RhbmRieVtdID0gewotCXsweDEwMywgMHgwMX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIHBhdGNoX3RibF9jdXQyW10gPSB7Ci0JezB4RkI5NCwgMH0sCS8qaW50aWFsaXNlIERhdGEgWGZlciBTdGF0dXMgcmVnKi8KLQl7MHhGQjk1LCAwfSwJLypnYWluIDEJICAoMHgwMCkqLwotCXsweEZCOTYsIDB9LAkvKmdhaW4gMS4wNyAgICgweDEwKSovCi0JezB4RkI5NywgMH0sCS8qZ2FpbiAxLjE0ICAgKDB4MjApKi8KLQl7MHhGQjk4LCAwfSwJLypnYWluIDEuMjMgICAoMHgzMCkqLwotCXsweEZCOTksIDB9LAkvKmdhaW4gMS4zMyAgICgweDQwKSovCi0JezB4RkI5QSwgMH0sCS8qZ2FpbiAxLjQ1ICAgKDB4NTApKi8KLQl7MHhGQjlCLCAwfSwJLypnYWluIDEuNiAgICAoMHg2MCkqLwotCXsweEZCOUMsIDB9LAkvKmdhaW4gMS43OCAgICgweDcwKSovCi0JezB4RkI5RCwgMn0sCS8qZ2FpbiAyCSAgKDB4ODApKi8KLQl7MHhGQjlFLCAyfSwJLypnYWluIDIuMjkgICAoMHg5MCkqLwotCXsweEZCOUYsIDN9LAkvKmdhaW4gMi42NyAgICgweEEwKSovCi0JezB4RkJBMCwgM30sCS8qZ2FpbiAzLjIgICAgKDB4QjApKi8KLQl7MHhGQkExLCA0fSwJLypnYWluIDQJICAoMHhDMCkqLwotCXsweEZCQTIsIDd9LAkvKmdhaW4gNS4zMyAgICgweEQwKSovCi0JezB4RkJBMywgMTB9LAkvKmdhaW4gOAkgICgweEUwKSovCi0JezB4RkJBNCwgMTF9LAkvKmdhaW4gOS4xNCAgICgweEU0KSovCi0JezB4RkJBNSwgMTN9LAkvKmdhaW4gMTAuNjcgICgweEU4KSovCi0JezB4RkJBNiwgMTV9LAkvKmdhaW4gMTIuOCAgICgweEVDKSovCi0JezB4RkJBNywgMTl9LAkvKmdhaW4gMTYgICAgICgweEYwKSovCi0JezB4RjgwMCwgMHgxMn0sCi0JezB4RjgwMSwgMHgwNn0sCi0JezB4RjgwMiwgMHhmN30sCi0JezB4RjgwMywgMHg5MH0sCi0JezB4RjgwNCwgMHgwMn0sCi0JezB4RjgwNSwgMHgwNX0sCi0JezB4RjgwNiwgMHhlMH0sCi0JezB4RjgwNywgMHhmZn0sCi0JezB4RjgwOCwgMHg2NX0sCi0JezB4RjgwOSwgMHg3ZH0sCi0JezB4RjgwQSwgMHg3MH0sCi0JezB4RjgwQiwgMHgwM30sCi0JezB4RjgwQywgMHgwMn0sCi0JezB4RjgwRCwgMHhmOX0sCi0JezB4RjgwRSwgMHgxY30sCi0JezB4RjgwRiwgMHg4Zn0sCi0JezB4RjgxMCwgMHg3ZH0sCi0JezB4RjgxMSwgMHhlNH0sCi0JezB4RjgxMiwgMHhmNX0sCi0JezB4RjgxMywgMHg3YX0sCi0JezB4RjgxNCwgMHg3NX0sCi0JezB4RjgxNSwgMHg3OH0sCi0JezB4RjgxNiwgMHgzMH0sCi0JezB4RjgxNywgMHg3NX0sCi0JezB4RjgxOCwgMHg3OX0sCi0JezB4RjgxOSwgMHg1M30sCi0JezB4RjgxQSwgMHg4NX0sCi0JezB4RjgxQiwgMHg3OX0sCi0JezB4RjgxQywgMHg4Mn0sCi0JezB4RjgxRCwgMHg4NX0sCi0JezB4RjgxRSwgMHg3OH0sCi0JezB4RjgxRiwgMHg4M30sCi0JezB4RjgyMCwgMHhlMH0sCi0JezB4RjgyMSwgMHhjM30sCi0JezB4RjgyMiwgMHg5NX0sCi0JezB4RjgyMywgMHg3Yn0sCi0JezB4RjgyNCwgMHhmMH0sCi0JezB4RjgyNSwgMHg3NH0sCi0JezB4RjgyNiwgMHgwMn0sCi0JezB4RjgyNywgMHgyNX0sCi0JezB4RjgyOCwgMHg3OX0sCi0JezB4RjgyOSwgMHhmNX0sCi0JezB4RjgyQSwgMHg3OX0sCi0JezB4RjgyQiwgMHhlNH0sCi0JezB4RjgyQywgMHgzNX0sCi0JezB4RjgyRCwgMHg3OH0sCi0JezB4RjgyRSwgMHhmNX0sCi0JezB4RjgyRiwgMHg3OH0sCi0JezB4RjgzMCwgMHgwNX0sCi0JezB4RjgzMSwgMHg3YX0sCi0JezB4RjgzMiwgMHhlNX0sCi0JezB4RjgzMywgMHg3YX0sCi0JezB4RjgzNCwgMHhiNH0sCi0JezB4RjgzNSwgMHgwOH0sCi0JezB4RjgzNiwgMHhlM30sCi0JezB4RjgzNywgMHhlNX0sCi0JezB4RjgzOCwgMHg3ZH0sCi0JezB4RjgzOSwgMHg3MH0sCi0JezB4RjgzQSwgMHgwNH0sCi0JezB4RjgzQiwgMHhmZn0sCi0JezB4RjgzQywgMHgwMn0sCi0JezB4RjgzRCwgMHhmOH0sCi0JezB4RjgzRSwgMHhlNH0sCi0JezB4RjgzRiwgMHhlNX0sCi0JezB4Rjg0MCwgMHg3ZH0sCi0JezB4Rjg0MSwgMHhiNH0sCi0JezB4Rjg0MiwgMHgxMH0sCi0JezB4Rjg0MywgMHgwNX0sCi0JezB4Rjg0NCwgMHg3Zn0sCi0JezB4Rjg0NSwgMHgwMX0sCi0JezB4Rjg0NiwgMHgwMn0sCi0JezB4Rjg0NywgMHhmOH0sCi0JezB4Rjg0OCwgMHhlNH0sCi0JezB4Rjg0OSwgMHhlNX0sCi0JezB4Rjg0QSwgMHg3ZH0sCi0JezB4Rjg0QiwgMHhiNH0sCi0JezB4Rjg0QywgMHgyMH0sCi0JezB4Rjg0RCwgMHgwNX0sCi0JezB4Rjg0RSwgMHg3Zn0sCi0JezB4Rjg0RiwgMHgwMn0sCi0JezB4Rjg1MCwgMHgwMn0sCi0JezB4Rjg1MSwgMHhmOH0sCi0JezB4Rjg1MiwgMHhlNH0sCi0JezB4Rjg1MywgMHhlNX0sCi0JezB4Rjg1NCwgMHg3ZH0sCi0JezB4Rjg1NSwgMHhiNH0sCi0JezB4Rjg1NiwgMHgzMH0sCi0JezB4Rjg1NywgMHgwNX0sCi0JezB4Rjg1OCwgMHg3Zn0sCi0JezB4Rjg1OSwgMHgwM30sCi0JezB4Rjg1QSwgMHgwMn0sCi0JezB4Rjg1QiwgMHhmOH0sCi0JezB4Rjg1QywgMHhlNH0sCi0JezB4Rjg1RCwgMHhlNX0sCi0JezB4Rjg1RSwgMHg3ZH0sCi0JezB4Rjg1RiwgMHhiNH0sCi0JezB4Rjg2MCwgMHg0MH0sCi0JezB4Rjg2MSwgMHgwNH0sCi0JezB4Rjg2MiwgMHg3Zn0sCi0JezB4Rjg2MywgMHgwNH0sCi0JezB4Rjg2NCwgMHg4MH0sCi0JezB4Rjg2NSwgMHg3ZX0sCi0JezB4Rjg2NiwgMHhlNX0sCi0JezB4Rjg2NywgMHg3ZH0sCi0JezB4Rjg2OCwgMHhiNH0sCi0JezB4Rjg2OSwgMHg1MH0sCi0JezB4Rjg2QSwgMHgwNH0sCi0JezB4Rjg2QiwgMHg3Zn0sCi0JezB4Rjg2QywgMHgwNX0sCi0JezB4Rjg2RCwgMHg4MH0sCi0JezB4Rjg2RSwgMHg3NX0sCi0JezB4Rjg2RiwgMHhlNX0sCi0JezB4Rjg3MCwgMHg3ZH0sCi0JezB4Rjg3MSwgMHhiNH0sCi0JezB4Rjg3MiwgMHg2MH0sCi0JezB4Rjg3MywgMHgwNH0sCi0JezB4Rjg3NCwgMHg3Zn0sCi0JezB4Rjg3NSwgMHgwNn0sCi0JezB4Rjg3NiwgMHg4MH0sCi0JezB4Rjg3NywgMHg2Y30sCi0JezB4Rjg3OCwgMHhlNX0sCi0JezB4Rjg3OSwgMHg3ZH0sCi0JezB4Rjg3QSwgMHhiNH0sCi0JezB4Rjg3QiwgMHg3MH0sCi0JezB4Rjg3QywgMHgwNH0sCi0JezB4Rjg3RCwgMHg3Zn0sCi0JezB4Rjg3RSwgMHgwN30sCi0JezB4Rjg3RiwgMHg4MH0sCi0JezB4Rjg4MCwgMHg2M30sCi0JezB4Rjg4MSwgMHhlNX0sCi0JezB4Rjg4MiwgMHg3ZH0sCi0JezB4Rjg4MywgMHhiNH0sCi0JezB4Rjg4NCwgMHg4MH0sCi0JezB4Rjg4NSwgMHgwNH0sCi0JezB4Rjg4NiwgMHg3Zn0sCi0JezB4Rjg4NywgMHgwOH0sCi0JezB4Rjg4OCwgMHg4MH0sCi0JezB4Rjg4OSwgMHg1YX0sCi0JezB4Rjg4QSwgMHhlNX0sCi0JezB4Rjg4QiwgMHg3ZH0sCi0JezB4Rjg4QywgMHhiNH0sCi0JezB4Rjg4RCwgMHg5MH0sCi0JezB4Rjg4RSwgMHgwNH0sCi0JezB4Rjg4RiwgMHg3Zn0sCi0JezB4Rjg5MCwgMHgwOX0sCi0JezB4Rjg5MSwgMHg4MH0sCi0JezB4Rjg5MiwgMHg1MX0sCi0JezB4Rjg5MywgMHhlNX0sCi0JezB4Rjg5NCwgMHg3ZH0sCi0JezB4Rjg5NSwgMHhiNH0sCi0JezB4Rjg5NiwgMHhhMH0sCi0JezB4Rjg5NywgMHgwNH0sCi0JezB4Rjg5OCwgMHg3Zn0sCi0JezB4Rjg5OSwgMHgwYX0sCi0JezB4Rjg5QSwgMHg4MH0sCi0JezB4Rjg5QiwgMHg0OH0sCi0JezB4Rjg5QywgMHhlNX0sCi0JezB4Rjg5RCwgMHg3ZH0sCi0JezB4Rjg5RSwgMHhiNH0sCi0JezB4Rjg5RiwgMHhiMH0sCi0JezB4RjhBMCwgMHgwNH0sCi0JezB4RjhBMSwgMHg3Zn0sCi0JezB4RjhBMiwgMHgwYn0sCi0JezB4RjhBMywgMHg4MH0sCi0JezB4RjhBNCwgMHgzZn0sCi0JezB4RjhBNSwgMHhlNX0sCi0JezB4RjhBNiwgMHg3ZH0sCi0JezB4RjhBNywgMHhiNH0sCi0JezB4RjhBOCwgMHhjMH0sCi0JezB4RjhBOSwgMHgwNH0sCi0JezB4RjhBQSwgMHg3Zn0sCi0JezB4RjhBQiwgMHgwY30sCi0JezB4RjhBQywgMHg4MH0sCi0JezB4RjhBRCwgMHgzNn0sCi0JezB4RjhBRSwgMHhlNX0sCi0JezB4RjhBRiwgMHg3ZH0sCi0JezB4RjhCMCwgMHhiNH0sCi0JezB4RjhCMSwgMHhkMH0sCi0JezB4RjhCMiwgMHgwNH0sCi0JezB4RjhCMywgMHg3Zn0sCi0JezB4RjhCNCwgMHgwZH0sCi0JezB4RjhCNSwgMHg4MH0sCi0JezB4RjhCNiwgMHgyZH0sCi0JezB4RjhCNywgMHhlNX0sCi0JezB4RjhCOCwgMHg3ZH0sCi0JezB4RjhCOSwgMHhiNH0sCi0JezB4RjhCQSwgMHhlMH0sCi0JezB4RjhCQiwgMHgwNH0sCi0JezB4RjhCQywgMHg3Zn0sCi0JezB4RjhCRCwgMHgwZX0sCi0JezB4RjhCRSwgMHg4MH0sCi0JezB4RjhCRiwgMHgyNH0sCi0JezB4RjhDMCwgMHhlNX0sCi0JezB4RjhDMSwgMHg3ZH0sCi0JezB4RjhDMiwgMHhiNH0sCi0JezB4RjhDMywgMHhlNH0sCi0JezB4RjhDNCwgMHgwNH0sCi0JezB4RjhDNSwgMHg3Zn0sCi0JezB4RjhDNiwgMHgwZn0sCi0JezB4RjhDNywgMHg4MH0sCi0JezB4RjhDOCwgMHgxYn0sCi0JezB4RjhDOSwgMHhlNX0sCi0JezB4RjhDQSwgMHg3ZH0sCi0JezB4RjhDQiwgMHhiNH0sCi0JezB4RjhDQywgMHhlOH0sCi0JezB4RjhDRCwgMHgwNH0sCi0JezB4RjhDRSwgMHg3Zn0sCi0JezB4RjhDRiwgMHgxMH0sCi0JezB4RjhEMCwgMHg4MH0sCi0JezB4RjhEMSwgMHgxMn0sCi0JezB4RjhEMiwgMHhlNX0sCi0JezB4RjhEMywgMHg3ZH0sCi0JezB4RjhENCwgMHhiNH0sCi0JezB4RjhENSwgMHhlY30sCi0JezB4RjhENiwgMHgwNH0sCi0JezB4RjhENywgMHg3Zn0sCi0JezB4RjhEOCwgMHgxMX0sCi0JezB4RjhEOSwgMHg4MH0sCi0JezB4RjhEQSwgMHgwOX0sCi0JezB4RjhEQiwgMHhlNX0sCi0JezB4RjhEQywgMHg3ZH0sCi0JezB4RjhERCwgMHg3Zn0sCi0JezB4RjhERSwgMHgwMH0sCi0JezB4RjhERiwgMHhiNH0sCi0JezB4RjhFMCwgMHhmMH0sCi0JezB4RjhFMSwgMHgwMn0sCi0JezB4RjhFMiwgMHg3Zn0sCi0JezB4RjhFMywgMHgxMn0sCi0JezB4RjhFNCwgMHg4Zn0sCi0JezB4RjhFNSwgMHg3Y30sCi0JezB4RjhFNiwgMHhlZn0sCi0JezB4RjhFNywgMHgyNH0sCi0JezB4RjhFOCwgMHg5NX0sCi0JezB4RjhFOSwgMHhmZn0sCi0JezB4RjhFQSwgMHhlNH0sCi0JezB4RjhFQiwgMHgzNH0sCi0JezB4RjhFQywgMHhmYn0sCi0JezB4RjhFRCwgMHg4Zn0sCi0JezB4RjhFRSwgMHg4Mn0sCi0JezB4RjhFRiwgMHhmNX0sCi0JezB4RjhGMCwgMHg4M30sCi0JezB4RjhGMSwgMHhlNH0sCi0JezB4RjhGMiwgMHg5M30sCi0JezB4RjhGMywgMHhmNX0sCi0JezB4RjhGNCwgMHg3Y30sCi0JezB4RjhGNSwgMHhmNX0sCi0JezB4RjhGNiwgMHg3Yn0sCi0JezB4RjhGNywgMHhlNH0sCi0JezB4RjhGOCwgMHhmNX0sCi0JezB4RjhGOSwgMHg3YX0sCi0JezB4RjhGQSwgMHg3NX0sCi0JezB4RjhGQiwgMHg3OH0sCi0JezB4RjhGQywgMHgzMH0sCi0JezB4RjhGRCwgMHg3NX0sCi0JezB4RjhGRSwgMHg3OX0sCi0JezB4RjhGRiwgMHg1M30sCi0JezB4RjkwMCwgMHg4NX0sCi0JezB4RjkwMSwgMHg3OX0sCi0JezB4RjkwMiwgMHg4Mn0sCi0JezB4RjkwMywgMHg4NX0sCi0JezB4RjkwNCwgMHg3OH0sCi0JezB4RjkwNSwgMHg4M30sCi0JezB4RjkwNiwgMHhlMH0sCi0JezB4RjkwNywgMHgyNX0sCi0JezB4RjkwOCwgMHg3Y30sCi0JezB4RjkwOSwgMHhmMH0sCi0JezB4RjkwQSwgMHg3NH0sCi0JezB4RjkwQiwgMHgwMn0sCi0JezB4RjkwQywgMHgyNX0sCi0JezB4RjkwRCwgMHg3OX0sCi0JezB4RjkwRSwgMHhmNX0sCi0JezB4RjkwRiwgMHg3OX0sCi0JezB4RjkxMCwgMHhlNH0sCi0JezB4RjkxMSwgMHgzNX0sCi0JezB4RjkxMiwgMHg3OH0sCi0JezB4RjkxMywgMHhmNX0sCi0JezB4RjkxNCwgMHg3OH0sCi0JezB4RjkxNSwgMHgwNX0sCi0JezB4RjkxNiwgMHg3YX0sCi0JezB4RjkxNywgMHhlNX0sCi0JezB4RjkxOCwgMHg3YX0sCi0JezB4RjkxOSwgMHhiNH0sCi0JezB4RjkxQSwgMHgwOH0sCi0JezB4RjkxQiwgMHhlNH0sCi0JezB4RjkxQywgMHgwMn0sCi0JezB4RjkxRCwgMHgxOH0sCi0JezB4RjkxRSwgMHgzMn0sCi0JezB4RjkxRiwgMHgyMn0sCi0JezB4RjkyMCwgMHhmMH0sCi0JezB4RjkyMSwgMHg5MH0sCi0JezB4RjkyMiwgMHhhMH0sCi0JezB4RjkyMywgMHhmOH0sCi0JezB4RjkyNCwgMHhlMH0sCi0JezB4RjkyNSwgMHg3MH0sCi0JezB4RjkyNiwgMHgwMn0sCi0JezB4RjkyNywgMHhhM30sCi0JezB4RjkyOCwgMHhlMH0sCi0JezB4RjkyOSwgMHg3MH0sCi0JezB4RjkyQSwgMHgwYX0sCi0JezB4RjkyQiwgMHg5MH0sCi0JezB4RjkyQywgMHhhMX0sCi0JezB4RjkyRCwgMHgxMH0sCi0JezB4RjkyRSwgMHhlMH0sCi0JezB4RjkyRiwgMHhmZX0sCi0JezB4RjkzMCwgMHhhM30sCi0JezB4RjkzMSwgMHhlMH0sCi0JezB4RjkzMiwgMHhmZn0sCi0JezB4RjkzMywgMHg4MH0sCi0JezB4RjkzNCwgMHgwNH0sCi0JezB4RjkzNSwgMHg3ZX0sCi0JezB4RjkzNiwgMHgwMH0sCi0JezB4RjkzNywgMHg3Zn0sCi0JezB4RjkzOCwgMHgwMH0sCi0JezB4RjkzOSwgMHg4ZX0sCi0JezB4RjkzQSwgMHg3ZX0sCi0JezB4RjkzQiwgMHg4Zn0sCi0JezB4RjkzQywgMHg3Zn0sCi0JezB4RjkzRCwgMHg5MH0sCi0JezB4RjkzRSwgMHgzNn0sCi0JezB4RjkzRiwgMHgwZH0sCi0JezB4Rjk0MCwgMHhlMH0sCi0JezB4Rjk0MSwgMHg0NH0sCi0JezB4Rjk0MiwgMHgwMn0sCi0JezB4Rjk0MywgMHhmMH0sCi0JezB4Rjk0NCwgMHg5MH0sCi0JezB4Rjk0NSwgMHgzNn0sCi0JezB4Rjk0NiwgMHgwZX0sCi0JezB4Rjk0NywgMHhlNX0sCi0JezB4Rjk0OCwgMHg3ZX0sCi0JezB4Rjk0OSwgMHhmMH0sCi0JezB4Rjk0QSwgMHhhM30sCi0JezB4Rjk0QiwgMHhlNX0sCi0JezB4Rjk0QywgMHg3Zn0sCi0JezB4Rjk0RCwgMHhmMH0sCi0JezB4Rjk0RSwgMHhlNX0sCi0JezB4Rjk0RiwgMHgzYX0sCi0JezB4Rjk1MCwgMHg2MH0sCi0JezB4Rjk1MSwgMHgwY30sCi0JezB4Rjk1MiwgMHg5MH0sCi0JezB4Rjk1MywgMHgzNn0sCi0JezB4Rjk1NCwgMHgwOX0sCi0JezB4Rjk1NSwgMHhlMH0sCi0JezB4Rjk1NiwgMHg3MH0sCi0JezB4Rjk1NywgMHgwNn0sCi0JezB4Rjk1OCwgMHg5MH0sCi0JezB4Rjk1OSwgMHgzNn0sCi0JezB4Rjk1QSwgMHgwOH0sCi0JezB4Rjk1QiwgMHhmMH0sCi0JezB4Rjk1QywgMHhmNX0sCi0JezB4Rjk1RCwgMHgzYX0sCi0JezB4Rjk1RSwgMHgwMn0sCi0JezB4Rjk1RiwgMHgwM30sCi0JezB4Rjk2MCwgMHg5NH0sCi0JezB4Rjk2MSwgMHgyMn0sCi0JezB4Rjk2MiwgMHg3OH0sCi0JezB4Rjk2MywgMHgwN30sCi0JezB4Rjk2NCwgMHhlNn0sCi0JezB4Rjk2NSwgMHhkM30sCi0JezB4Rjk2NiwgMHg5NH0sCi0JezB4Rjk2NywgMHgwMH0sCi0JezB4Rjk2OCwgMHg0MH0sCi0JezB4Rjk2OSwgMHgxNn0sCi0JezB4Rjk2QSwgMHgxNn0sCi0JezB4Rjk2QiwgMHhlNn0sCi0JezB4Rjk2QywgMHg5MH0sCi0JezB4Rjk2RCwgMHgzMH0sCi0JezB4Rjk2RSwgMHhhMX0sCi0JezB4Rjk2RiwgMHhmMH0sCi0JezB4Rjk3MCwgMHg5MH0sCi0JezB4Rjk3MSwgMHg0M30sCi0JezB4Rjk3MiwgMHg4M30sCi0JezB4Rjk3MywgMHhlMH0sCi0JezB4Rjk3NCwgMHhiNH0sCi0JezB4Rjk3NSwgMHgwMX0sCi0JezB4Rjk3NiwgMHgwZn0sCi0JezB4Rjk3NywgMHg5MH0sCi0JezB4Rjk3OCwgMHg0M30sCi0JezB4Rjk3OSwgMHg4N30sCi0JezB4Rjk3QSwgMHhlMH0sCi0JezB4Rjk3QiwgMHhiNH0sCi0JezB4Rjk3QywgMHgwMX0sCi0JezB4Rjk3RCwgMHgwOH0sCi0JezB4Rjk3RSwgMHg4MH0sCi0JezB4Rjk3RiwgMHgwMH0sCi0JezB4Rjk4MCwgMHg5MH0sCi0JezB4Rjk4MSwgMHgzMH0sCi0JezB4Rjk4MiwgMHhhMH0sCi0JezB4Rjk4MywgMHg3NH0sCi0JezB4Rjk4NCwgMHgwMX0sCi0JezB4Rjk4NSwgMHhmMH0sCi0JezB4Rjk4NiwgMHgyMn0sCi0JezB4Rjk4NywgMHhmMH0sCi0JezB4Rjk4OCwgMHg5MH0sCi0JezB4Rjk4OSwgMHgzNX0sCi0JezB4Rjk4QSwgMHhiYX0sCi0JezB4Rjk4QiwgMHhlMH0sCi0JezB4Rjk4QywgMHhiNH0sCi0JezB4Rjk4RCwgMHgwYX0sCi0JezB4Rjk4RSwgMHgwZH0sCi0JezB4Rjk4RiwgMHhhM30sCi0JezB4Rjk5MCwgMHhlMH0sCi0JezB4Rjk5MSwgMHhiNH0sCi0JezB4Rjk5MiwgMHgwMX0sCi0JezB4Rjk5MywgMHgwOH0sCi0JezB4Rjk5NCwgMHg5MH0sCi0JezB4Rjk5NSwgMHhmYn0sCi0JezB4Rjk5NiwgMHg5NH0sCi0JezB4Rjk5NywgMHhlMH0sCi0JezB4Rjk5OCwgMHg5MH0sCi0JezB4Rjk5OSwgMHgzNX0sCi0JezB4Rjk5QSwgMHhiOH0sCi0JezB4Rjk5QiwgMHhmMH0sCi0JezB4Rjk5QywgMHhkMH0sCi0JezB4Rjk5RCwgMHhkMH0sCi0JezB4Rjk5RSwgMHhkMH0sCi0JezB4Rjk5RiwgMHg4Mn0sCi0JezB4RjlBMCwgMHhkMH0sCi0JezB4RjlBMSwgMHg4M30sCi0JezB4RjlBMiwgMHhkMH0sCi0JezB4RjlBMywgMHhlMH0sCi0JezB4RjlBNCwgMHgzMn0sCi0JezB4RjlBNSwgMHgyMn0sCi0JezB4RjlBNiwgMHhlNX0sCi0JezB4RjlBNywgMHg3Zn0sCi0JezB4RjlBOCwgMHg0NX0sCi0JezB4RjlBOSwgMHg3ZX0sCi0JezB4RjlBQSwgMHg2MH0sCi0JezB4RjlBQiwgMHgxNX0sCi0JezB4RjlBQywgMHg5MH0sCi0JezB4RjlBRCwgMHgwMX0sCi0JezB4RjlBRSwgMHgwMH0sCi0JezB4RjlBRiwgMHhlMH0sCi0JezB4RjlCMCwgMHg3MH0sCi0JezB4RjlCMSwgMHgwZn0sCi0JezB4RjlCMiwgMHg5MH0sCi0JezB4RjlCMywgMHhhMH0sCi0JezB4RjlCNCwgMHhmOH0sCi0JezB4RjlCNSwgMHhlNX0sCi0JezB4RjlCNiwgMHg3ZX0sCi0JezB4RjlCNywgMHhmMH0sCi0JezB4RjlCOCwgMHhhM30sCi0JezB4RjlCOSwgMHhlNX0sCi0JezB4RjlCQSwgMHg3Zn0sCi0JezB4RjlCQiwgMHhmMH0sCi0JezB4RjlCQywgMHhlNH0sCi0JezB4RjlCRCwgMHhmNX0sCi0JezB4RjlCRSwgMHg3ZX0sCi0JezB4RjlCRiwgMHhmNX0sCi0JezB4RjlDMCwgMHg3Zn0sCi0JezB4RjlDMSwgMHgyMn0sCi0JezB4RjlDMiwgMHgwMn0sCi0JezB4RjlDMywgMHgwZX0sCi0JezB4RjlDNCwgMHg3OX0sCi0JezB4RjlDNSwgMHgyMn0sCi0JLyogT2Zmc2V0czoqLwotCXsweDM1QzYsIDB4MDB9LC8qIEZJRERMRURBUktDQUwqLwotCXsweDM1QzcsIDB4MDB9LAotCXsweDM1QzgsIDB4MDF9LC8qU1RPUkVESVNUQU5DRUFUU1RPUFNUUkVBTUlORyovCi0JezB4MzVDOSwgMHgyMH0sCi0JezB4MzVDQSwgMHgwMX0sLypCUlVDRUZJWCovCi0JezB4MzVDQiwgMHg2Mn0sCi0JezB4MzVDQywgMHgwMX0sLypGSVhEQVRBWEZFUlNUQVRVU1JFRyovCi0JezB4MzVDRCwgMHg4N30sCi0JezB4MzVDRSwgMHgwMX0sLypGT0NVU0RJU1RBTkNFVVBEQVRFKi8KLQl7MHgzNUNGLCAweEE2fSwKLQl7MHgzNUQwLCAweDAxfSwvKlNLSVBFRE9GUkVTRVQqLwotCXsweDM1RDEsIDB4QzJ9LAotCXsweDM1RDIsIDB4MDB9LAotCXsweDM1RDMsIDB4RkJ9LAotCXsweDM1RDQsIDB4MDB9LAotCXsweDM1RDUsIDB4OTR9LAotCXsweDM1RDYsIDB4MDB9LAotCXsweDM1RDcsIDB4RkJ9LAotCXsweDM1RDgsIDB4MDB9LAotCXsweDM1RDksIDB4OTR9LAotCXsweDM1REEsIDB4MDB9LAotCXsweDM1REIsIDB4RkJ9LAotCXsweDM1REMsIDB4MDB9LAotCXsweDM1REQsIDB4OTR9LAotCXsweDM1REUsIDB4MDB9LAotCXsweDM1REYsIDB4RkJ9LAotCXsweDM1RTAsIDB4MDB9LAotCXsweDM1RTEsIDB4OTR9LAotCXsweDM1RTYsIDB4MTh9LC8qIEZJRERMRURBUktDQUwqLwotCXsweDM1RTcsIDB4MkZ9LAotCXsweDM1RTgsIDB4MDN9LC8qIFNUT1JFRElTVEFOQ0VBVFNUT1BTVFJFQU1JTkcqLwotCXsweDM1RTksIDB4OTN9LAotCXsweDM1RUEsIDB4MTh9LC8qIEJSVUNFRklYKi8KLQl7MHgzNUVCLCAweDk5fSwKLQl7MHgzNUVDLCAweDAwfSwvKiBGSVhEQVRBWEZFUlNUQVRVU1JFRyovCi0JezB4MzVFRCwgMHhBM30sCi0JezB4MzVFRSwgMHgyMX0sLyogRk9DVVNESVNUQU5DRVVQREFURSovCi0JezB4MzVFRiwgMHg1Qn0sCi0JezB4MzVGMCwgMHgwRX0sLyogU0tJUEVET0ZSRVNFVCovCi0JezB4MzVGMSwgMHg3NH0sCi0JezB4MzVGMiwgMHgwNH0sCi0JezB4MzVGMywgMHg2NH0sCi0JezB4MzVGNCwgMHgwNH0sCi0JezB4MzVGNSwgMHg2NX0sCi0JezB4MzVGNiwgMHgwNH0sCi0JezB4MzVGNywgMHg3Qn0sCi0JezB4MzVGOCwgMHgwNH0sCi0JezB4MzVGOSwgMHg3Q30sCi0JezB4MzVGQSwgMHgwNH0sCi0JezB4MzVGQiwgMHhERH0sCi0JezB4MzVGQywgMHgwNH0sCi0JezB4MzVGRCwgMHhERX0sCi0JezB4MzVGRSwgMHgwNH0sCi0JezB4MzVGRiwgMHhFRn0sCi0JezB4MzYwMCwgMHgwNH0sCi0JezB4MzYwMSwgMHhGMH0sCi0JLypKdW1wL0RhdGE6Ki8KLQl7MHgzNUMyLCAweDNGfSwvKiBKdW1wIFJlZyovCi0JezB4MzVDMywgMHhGRn0sLyogSnVtcCBSZWcqLwotCXsweDM1QzQsIDB4M0Z9LC8qIERhdGEgUmVnKi8KLQl7MHgzNUM1LCAweEMwfSwvKiBEYXRhIFJlZyovCi0JezB4MzVDMCwgMHgwMX0sLyogRW5hYmxlKi8KLX07Ci1zdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgaW5pdF90YmxbXSA9IHsKLQl7MHgwMTEyLCAxMH0sCi0JezB4MDExMywgMTB9LAotCXsweDAzMDEsIDl9LAotCXsweDAzMDUsIDR9LAotCXsweDAzMDcsIDEzM30sCi0JezB4MDMwOSwgMTB9LAotCXsweDAyMDIsIDB4MDN9LAotCXsweDAyMDMsIDB4ZDB9LAotCXsweDAyMDUsIDB4YzB9LAotCXsweDMwMzAsIDB4MDh9LAotCXsweDAxMTEsIDB4MDJ9LAotCXsweDBiMDAsIDB4MDF9LAotCXsweDMwMDEsIDB4MzB9LAotCXsweDMwMDQsIDB4MzN9LAotCXsweDMwMDcsIDB4MDl9LAotCXsweDMwMTYsIDB4MUZ9LAotCXsweDMwMWQsIDB4MDN9LAotCXsweDMxN2UsIDB4MTF9LAotCXsweDMxN2YsIDB4MDl9LAotCXsweDM0MDAsIDB4Mzh9LAotCXsweDBiMDYsIDB4MDB9LAotCXsweDBiMDcsIDB4ODB9LAotCXsweDBiMDgsIDB4MDF9LAotCXsweDBiMDksIDB4NEZ9LAotCXsweDAxMzYsIDB4MTh9LAotCXsweDAxMzcsIDB4MDB9LAotCXsweDBiODMsIDB4MjB9LAotCXsweDBiODQsIDB4OTB9LAotCXsweDBiODUsIDB4MjB9LAotCXsweDBiODgsIDB4ODB9LAotCXsweDBiODksIDB4MDB9LAotCXsweDBiOGEsIDB4MDB9LAotCXsweDAzNDAsIDB4MDN9LCAgIC8qUkVHID0gMHgwMzQwIGZyYW1lX2xlbmd0aF9saW5lc19oaSovCi0JezB4MDM0MSwgMHhmMH0sICAgLypSRUcgPSAweDAzNDEgZnJhbWVfbGVuZ3RoX2xpbmVzX2xvKi8KLQl7MHgwMzQyLCAweDBifSwgICAvKlJFRyA9IDB4MDM0MiAgbGluZV9sZW5ndGhfcGNrX2hpKi8KLQl7MHgwMzQzLCAweDc0fSwgICAvKlJFRyA9IDB4MDM0MyAgbGluZV9sZW5ndGhfcGNrX2xvKi8KLQl7MHgzMDA1LCAweDAzfSwgICAvKlJFRyA9IDB4MzAwNSovCi0JezB4MzAxMCwgMHgwMH0sICAgLypSRUcgPSAweDMwMTAqLwotCXsweDMwMTEsIDB4MDF9LCAgIC8qUkVHID0gMHgzMDExKi8KLQl7MHgzMDFhLCAweDZhfSwgICAvKlJFRyA9IDB4MzAxYSovCi0JezB4MzAzNSwgMHgwM30sICAgLypSRUcgPSAweDMwMzUqLwotCXsweDMwMzYsIDB4MmN9LCAgIC8qUkVHID0gMHgzMDM2Ki8KLQl7MHgzMDQxLCAweDAwfSwgICAvKlJFRyA9IDB4MzA0MSovCi0JezB4MzA0MiwgMHgyNH0sICAgLypSRUcgPSAweDMwNDIqLwotCXsweDMwNDUsIDB4ODF9LCAgIC8qUkVHID0gMHgzMDQ1Ki8KLQl7MHgwYjgwLCAweDAyfSwgICAvKlJFRyA9IDB4MGI4MCBlZG9mIGVzdGltYXRlKi8KLQl7MHgwOTAwLCAweDAxfSwgICAvKlJFRyA9IDB4MDkwMCovCi0JezB4MDkwMSwgMHgyMn0sICAgLypSRUcgPSAweDA5MDEqLwotCXsweDA5MDIsIDB4MDR9LCAgIC8qUkVHID0gMHgwOTAyKi8KLQl7MHgwMzgzLCAweDAzfSwgICAvKlJFRyA9IDB4MDM4MyovCi0JezB4MDM4NywgMHgwM30sICAgLypSRUcgPSAweDAzODcqLwotCXsweDAzNGMsIDB4MDV9LCAgIC8qUkVHID0gMHgwMzRjKi8KLQl7MHgwMzRkLCAweDE4fSwgICAvKlJFRyA9IDB4MDM0ZCovCi0JezB4MDM0ZSwgMHgwM30sICAgLypSRUcgPSAweDAzNGUqLwotCXsweDAzNGYsIDB4ZDR9LCAgIC8qUkVHID0gMHgwMzRmKi8KLQl7MHgxNzE2LCAweDAyfSwgICAvKjB4MTcxNiovCi0JezB4MTcxNywgMHgwNH0sICAgLyoweDE3MTcqLwotCXsweDE3MTgsIDB4MDh9LCAgIC8qMHgxNzE4Ki8KLQl7MHgxNzE5LCAweDJjfSwgICAvKjB4MTcxOSovCi19OwotCi1zdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX2NvbmYgbW9kZV90YmwxW10gPSB7Ci0Je1JFR18weDAxMTIsIDEwfSwvKlJFRyA9IDB4MDExMiAsIDEwIGJpdCAqLwotCXtSRUdfMHgwMTEzLCAxMH0sLypSRUcgPSAweDAxMTMqLwotCXtSRUdfVlRfUElYX0NMS19ESVYsIDl9LC8qUkVHID0gMHgwMzAxIHZ0X3BpeF9jbGtfZGl2Ki8KLQl7UkVHX1BSRV9QTExfQ0xLX0RJViwgNH0sLypSRUcgPSAweDAzMDUgcHJlX3BsbF9jbGtfZGl2Ki8KLQl7UkVHX1BMTF9NVUxUSVBMSUVSLCAxMzN9LC8qUkVHID0gMHgwMzA3IHBsbF9tdWx0aXBsaWVyKi8KLQl7UkVHX09QX1BJWF9DTEtfRElWLCAxMH0sLypSRUcgPSAweDAzMDkgb3BfcGl4X2Nsa19kaXYqLwotCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0hJLCAweDAzfSwvKlJFRyA9IDB4MDM0MCBmcmFtZV9sZW5ndGhfbGluZXNfaGkqLwotCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0xPLCAweGYwfSwvKlJFRyA9IDB4MDM0MSBmcmFtZV9sZW5ndGhfbGluZXNfbG8qLwotCXtSRUdfTElORV9MRU5HVEhfUENLX0hJLCAweDBifSwgICAvKlJFRyA9IDB4MDM0MiAgbGluZV9sZW5ndGhfcGNrX2hpKi8KLQl7UkVHX0xJTkVfTEVOR1RIX1BDS19MTywgMHg3NH0sICAgLypSRUcgPSAweDAzNDMgIGxpbmVfbGVuZ3RoX3Bja19sbyovCi0Je1JFR18weDMwMDUsIDB4MDN9LCAgIC8qUkVHID0gMHgzMDA1Ki8KLQl7MHgzMDEwLCAweDAwfSwgICAvKlJFRyA9IDB4MzAxMCovCi0Je1JFR18weDMwMTEsIDB4MDF9LCAgIC8qUkVHID0gMHgzMDExKi8KLQl7UkVHXzB4MzAxYSwgMHg2YX0sICAgLypSRUcgPSAweDMwMWEqLwotCXtSRUdfMHgzMDM1LCAweDAzfSwgICAvKlJFRyA9IDB4MzAzNSovCi0Je1JFR18weDMwMzYsIDB4MmN9LCAgIC8qUkVHID0gMHgzMDM2Ki8KLQl7UkVHXzB4MzA0MSwgMHgwMH0sICAgLypSRUcgPSAweDMwNDEqLwotCXsweDMwNDIsIDB4MjR9LCAgIC8qUkVHID0gMHgzMDQyKi8KLQl7UkVHXzB4MzA0NSwgMHg4MX0sICAgLypSRUcgPSAweDMwNDUqLwotCXtSRUdfMHgwYjgwLCAweDAyfSwgICAvKlJFRyA9IDB4MGI4MCBlZG9mIGVzdGltYXRlKi8KLQl7UkVHXzB4MDkwMCwgMHgwMX0sICAgLypSRUcgPSAweDA5MDAqLwotCXtSRUdfMHgwOTAxLCAweDIyfSwgICAvKlJFRyA9IDB4MDkwMSovCi0Je1JFR18weDA5MDIsIDB4MDR9LCAgIC8qUkVHID0gMHgwOTAyKi8KLQl7UkVHXzB4MDM4MywgMHgwM30sICAgLypSRUcgPSAweDAzODMqLwotCXtSRUdfMHgwMzg3LCAweDAzfSwgICAvKlJFRyA9IDB4MDM4NyovCi0Je1JFR18weDAzNGMsIDB4MDV9LCAgIC8qUkVHID0gMHgwMzRjKi8KLQl7UkVHXzB4MDM0ZCwgMHgxOH0sICAgLypSRUcgPSAweDAzNGQqLwotCXtSRUdfMHgwMzRlLCAweDAzfSwgICAvKlJFRyA9IDB4MDM0ZSovCi0Je1JFR18weDAzNGYsIDB4ZDR9LCAgIC8qUkVHID0gMHgwMzRmKi8KLQl7UkVHXzB4MTcxNiwgMHgwMn0sICAgLyoweDE3MTYqLwotCXtSRUdfMHgxNzE3LCAweDA0fSwgICAvKjB4MTcxNyovCi0Je1JFR18weDE3MTgsIDB4MDh9LCAgIC8qMHgxNzE4Ki8KLQl7UkVHXzB4MTcxOSwgMHgyY30sICAgLyoweDE3MTkqLwotfTsKLQotc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIG1vZGVfdGJsMltdID0gewotCXtSRUdfMHgwMTEyLCAxMH0sLypSRUcgPSAweDAxMTIgLCAxMCBiaXQgKi8KLQl7UkVHXzB4MDExMywgMTB9LC8qUkVHID0gMHgwMTEzKi8KLQl7UkVHX1ZUX1BJWF9DTEtfRElWLCA5fSwvKlJFRyA9IDB4MDMwMSB2dF9waXhfY2xrX2RpdiovCi0Je1JFR19QUkVfUExMX0NMS19ESVYsIDR9LC8qUkVHID0gMHgwMzA1IHByZV9wbGxfY2xrX2RpdiovCi0Je1JFR19QTExfTVVMVElQTElFUiwgMTMzfSwvKlJFRyA9IDB4MDMwNyBwbGxfbXVsdGlwbGllciovCi0Je1JFR19PUF9QSVhfQ0xLX0RJViwgMTB9LC8qUkVHID0gMHgwMzA5IG9wX3BpeF9jbGtfZGl2Ki8KLQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19ISSwgMHgwN30sLypSRUcgPSAweDAzNDAgZnJhbWVfbGVuZ3RoX2xpbmVzX2hpKi8KLQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19MTywgMHhkMH0sLypSRUcgPSAweDAzNDEgZnJhbWVfbGVuZ3RoX2xpbmVzX2xvKi8KLQl7UkVHX0xJTkVfTEVOR1RIX1BDS19ISSwgMHgwYn0sLypSRUcgPSAweDAzNDIgbGluZV9sZW5ndGhfcGNrX2hpKi8KLQl7UkVHX0xJTkVfTEVOR1RIX1BDS19MTywgMHg4Y30sLypSRUcgPSAweDAzNDMgbGluZV9sZW5ndGhfcGNrX2xvKi8KLQl7UkVHXzB4MzAwNSwgMHgwMX0sLypSRUcgPSAweDMwMDUqLwotCXsweDMwMTAsIDB4MDB9LC8qUkVHID0gMHgzMDEwKi8KLQl7UkVHXzB4MzAxMSwgMHgwMH0sLypSRUcgPSAweDMwMTEqLwotCXtSRUdfMHgzMDFhLCAweDU1fSwvKlJFRyA9IDB4MzAxYSovCi0Je1JFR18weDMwMzUsIDB4MDF9LC8qUkVHID0gMHgzMDM1Ki8KLQl7UkVHXzB4MzAzNiwgMHgyM30sLypSRUcgPSAweDMwMzYqLwotCXtSRUdfMHgzMDQxLCAweDAwfSwvKlJFRyA9IDB4MzA0MSovCi0JezB4MzA0MiwgMHgyNH0sLypSRUcgPSAweDMwNDIqLwotCXtSRUdfMHgzMDQ1LCAweGI3fSwvKlJFRyA9IDB4MzA0NSovCi0Je1JFR18weDBiODAsIDB4MDF9LC8qUkVHID0gMHgwYjgwIGVkb2YgYXBwbGljYXRpb24qLwotCXtSRUdfMHgwOTAwLCAweDAwfSwvKlJFRyA9IDB4MDkwMCovCi0Je1JFR18weDA5MDEsIDB4MDB9LC8qUkVHID0gMHgwOTAxKi8KLQl7UkVHXzB4MDkwMiwgMHgwMH0sLypSRUcgPSAweDA5MDIqLwotCXtSRUdfMHgwMzgzLCAweDAxfSwvKlJFRyA9IDB4MDM4MyovCi0Je1JFR18weDAzODcsIDB4MDF9LC8qUkVHID0gMHgwMzg3Ki8KLQl7UkVHXzB4MDM0YywgMHgwQX0sLypSRUcgPSAweDAzNGMqLwotCXtSRUdfMHgwMzRkLCAweDMwfSwvKlJFRyA9IDB4MDM0ZCovCi0Je1JFR18weDAzNGUsIDB4MDd9LC8qUkVHID0gMHgwMzRlKi8KLQl7UkVHXzB4MDM0ZiwgMHhBOH0sLypSRUcgPSAweDAzNGYqLwotCXtSRUdfMHgxNzE2LCAweDAyfSwvKjB4MTcxNiovCi0Je1JFR18weDE3MTcsIDB4MGR9LC8qMHgxNzE3Ki8KLQl7UkVHXzB4MTcxOCwgMHgwN30sLyoweDE3MTgqLwotCXtSRUdfMHgxNzE5LCAweDdkfSwvKjB4MTcxOSovCi19OwotCi1zdGF0aWMgaW50MzJfdCB2eDY5NTNfc2Vuc29yX3NldHRpbmcoaW50IHVwZGF0ZV90eXBlLCBpbnQgcnQpCi17Ci0KLQlpbnQzMl90IHJjID0gMDsKLQl1aW50MTZfdCBmcmFtZV9jbnQgPSAwOwotCQlDREJHKCIlcyB1cGRhdGUgdHlwZSA9ICVkLCBydCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHVwZGF0ZV90eXBlLCBydCk7Ci0KLQkJc3dpdGNoICh1cGRhdGVfdHlwZSkgewotCQljYXNlIFJFR19JTklUOgotCQlpZiAocnQgPT0gUkVTX1BSRVZJRVcgfHwgcnQgPT0gUkVTX0NBUFRVUkUpIHsKLQkJCQkJCS8qIHJlc2V0IGZwc19kaXZpZGVyICovCi0JCQlmcHMgPSAzMCAqIFE4OwotCQkJLyogc3RvcCBzdHJlYW1pbmcgKi8KLQotCQkJLyogUmVzZXQgZXZlcnl0aGluZyBmaXJzdCAqLwotCQkJbXNtX2NhbWVyYV9pMmNfd3JpdGVfdGJsKAotCQkJCXZ4Njk1M19zX2N0cmwuc2Vuc29yX2kyY19jbGllbnQsCi0JCQkJdng2OTUzX3N0YW5kYnksCi0JCQkJQVJSQVlfU0laRSh2eDY5NTNfc3RhbmRieSksCi0JCQkJdng2OTUzX3NfY3RybC5tc21fc2Vuc29yX3JlZy0+Ci0JCQkJZGVmYXVsdF9kYXRhX3R5cGUpOwotCi0JCQltc2xlZXAoMjApOwotCi0JCQlDREJHKCJJbml0IHZ4Njk1M19zZW5zb3Jfc2V0dGluZyBzdGFuZGJ5XG4iKTsKLQkJCW1zbV9jYW1lcmFfaTJjX3dyaXRlX3RibCgKLQkJCQl2eDY5NTNfc19jdHJsLnNlbnNvcl9pMmNfY2xpZW50LAotCQkJCXZ4Njk1M19zdG9wX3NldHRpbmdzLAotCQkJCUFSUkFZX1NJWkUodng2OTUzX3N0b3Bfc2V0dGluZ3MpLAotCQkJCXZ4Njk1M19zX2N0cmwubXNtX3NlbnNvcl9yZWctPgotCQkJCWRlZmF1bHRfZGF0YV90eXBlKTsKLQkJCQkvKnZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5Ki8KLQkJCW1zbGVlcCh2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSk7Ci0JCQltc21fY2FtZXJhX2kyY193cml0ZV90YmwoCi0JCQkJdng2OTUzX3NfY3RybC5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCQlwYXRjaF90YmxfY3V0MiwKLQkJCQlBUlJBWV9TSVpFKHBhdGNoX3RibF9jdXQyKSwKLQkJCQl2eDY5NTNfc19jdHJsLm1zbV9zZW5zb3JfcmVnLT4KLQkJCQlkZWZhdWx0X2RhdGFfdHlwZSk7Ci0JCQltc21fY2FtZXJhX2kyY193cml0ZV90YmwoCi0JCQkJdng2OTUzX3NfY3RybC5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCQlpbml0X3RibCwKLQkJCQlBUlJBWV9TSVpFKGluaXRfdGJsKSwKLQkJCQl2eDY5NTNfc19jdHJsLm1zbV9zZW5zb3JfcmVnLT4KLQkJCQlkZWZhdWx0X2RhdGFfdHlwZSk7Ci0JCQltc2xlZXAodng2OTUzX3N0bTVtMGVkb2ZfZGVsYXlfbXNlY3Nfc3RkYnkpOwotCQl9Ci0JCXJldHVybiByYzsKLQkJY2FzZSBVUERBVEVfUEVSSU9ESUM6Ci0JCWlmIChydCA9PSBSRVNfUFJFVklFVyB8fCBydCA9PSBSRVNfQ0FQVFVSRSkgewotCQkJc3RydWN0IG1zbV9jYW1lcmFfaTJjX3JlZ19jb25mIGluaXRfbW9kZV90YmxbXSA9ICB7Ci0JCQl7UkVHXzB4MDExMiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDExMn0sCi0JCQl7UkVHXzB4MDExMywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDExM30sCi0JCQl7UkVHX1ZUX1BJWF9DTEtfRElWLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQl2dF9waXhfY2xrX2Rpdn0sCi0JCQl7UkVHX1BSRV9QTExfQ0xLX0RJViwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJcHJlX3BsbF9jbGtfZGl2fSwKLQkJCXtSRUdfUExMX01VTFRJUExJRVIsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCXBsbF9tdWx0aXBsaWVyfSwKLQkJCXtSRUdfT1BfUElYX0NMS19ESVYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCW9wX3BpeF9jbGtfZGl2fSwKLQkJCXtSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfSEksCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJY29hcnNlX2ludGVncmF0aW9uX3RpbWVfaGl9LAotCQkJe1JFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9MTywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQljb2Fyc2VfaW50ZWdyYXRpb25fdGltZV9sb30sCi0JCQl7UkVHX0FOQUxPR1VFX0dBSU5fQ09ERV9HTE9CQUxfTE8sCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJYW5hbG9ndWVfZ2Fpbl9jb2RlX2dsb2JhbH0sCi0JCQl7UkVHXzB4MzAzMCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAzMH0sCi0JCQkvKiA5NTMgc3BlY2lmaWMgcmVnaXN0ZXJzICovCi0JCQl7UkVHXzB4MDExMSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDExMX0sCi0JCQl7UkVHXzB4MGIwMCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGIwMH0sCi0JCQl7UkVHXzB4MzAwMSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAwMX0sCi0JCQl7UkVHXzB4MzAwNCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAwNH0sCi0JCQl7UkVHXzB4MzAwNywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAwN30sCi0JCQl7UkVHXzB4MzAxNiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAxNn0sCi0JCQl7UkVHXzB4MzAxZCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAxZH0sCi0JCQl7UkVHXzB4MzE3ZSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzE3ZX0sCi0JCQl7UkVHXzB4MzE3ZiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzE3Zn0sCi0JCQl7UkVHXzB4MzQwMCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzQwMH0sCi0JCQl7MHgwYjA2LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjA2fSwKLQkJCS8qU2luZ2xlX2RlZmVjdF9jb3JyZWN0X3dlaWdodCA9IGF1dG8qLwotCQkJezB4MGIwNywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGIwN30sCi0JCQkvKkR5bmFtaWMgY291cGxldCBjb3JyZWN0aW9uIEVOQUJMRUQqLwotCQkJezB4MGIwOCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGIwOH0sCi0JCQkvKkR5bmFtaWMgY291cGxldCBjb3JyZWN0aW9uIHdlaWdodCovCi0JCQl7MHgwYjA5LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjA5fSwKLQkJCS8qIENsb2NrIFNldHVwICovCi0JCQkvKiBUZWxsIHNlbnNvciBleHQgY2xrIGlzIDI0TUh6Ki8KLQkJCXsweDAxMzYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDAxMzZ9LAotCQkJezB4MDEzNywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDEzN30sCi0JCQkvKiBUaGUgd2hpdGUgYmFsYW5jZSBnYWlucyBtdXN0IGJlIHdyaXR0ZW4KLQkJCXRvIHRoZSBzZW5zb3IgZXZlcnkgZnJhbWUuICovCi0JCQkvKiBFZG9mICovCi0JCQl7UkVHXzB4MGI4MywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4M30sCi0JCQl7UkVHXzB4MGI4NCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4NH0sCi0JCQl7MHgwYjg1LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjg1fSwKLQkJCXsweDBiODgsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiODh9LAotCQkJezB4MGI4OSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4OX0sCi0JCQl7UkVHXzB4MGI4YSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4YX0sCi0JCQkvKiBNb2RlIHNwZWNpZmljIHJlZ2lldGVycyAqLwotCQkJe1JFR19GUkFNRV9MRU5HVEhfTElORVNfSEksCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJZnJhbWVfbGVuZ3RoX2xpbmVzX2hpfSwKLQkJCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0xPLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWZyYW1lX2xlbmd0aF9saW5lc19sb30sCi0JCQl7UkVHX0xJTkVfTEVOR1RIX1BDS19ISSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQlsaW5lX2xlbmd0aF9wY2tfaGl9LAotCQkJe1JFR19MSU5FX0xFTkdUSF9QQ0tfTE8sCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJbGluZV9sZW5ndGhfcGNrX2xvfSwKLQkJCXtSRUdfMHgzMDA1LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMDV9LAotCQkJezB4MzAxMCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDEwfSwKLQkJCXtSRUdfMHgzMDExLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMTF9LAotCQkJe1JFR18weDMwMWEsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAxYX0sCi0JCQl7UkVHXzB4MzAzNSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDM1fSwKLQkJCXtSRUdfMHgzMDM2LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMzZ9LAotCQkJe1JFR18weDMwNDEsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzA0MX0sCi0JCQl7MHgzMDQyLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwNDJ9LAotCQkJe1JFR18weDMwNDUsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzA0NX0sCi0JCQkvKkVET0Y6IEVzdGltYXRpb24gc2V0dGluZ3MgZm9yIFByZXZpZXcgbW9kZQotCQkJQXBwbGljYXRpb24gc2V0dGluZ3MgZm9yIGNhcHR1cmUgbW9kZQotCQkJKHN0YW5kYXJkIHNldHRpbmdzIC0gTm90IHR1bmVkKSAqLwotCQkJe1JFR18weDBiODAsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MGI4MH0sCi0JCQl7UkVHXzB4MDkwMCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwOTAwfSwKLQkJCXtSRUdfMHgwOTAxLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDA5MDF9LAotCQkJe1JFR18weDA5MDIsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDkwMn0sCi0JCQl7UkVHXzB4MDM4MywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzgzfSwKLQkJCXtSRUdfMHgwMzg3LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzODd9LAotCQkJLyogQ2hhbmdlIG91dHB1dCBzaXplIC8gZnJhbWUgcmF0ZSAqLwotCQkJe1JFR18weDAzNGMsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM0Y30sCi0JCQl7UkVHXzB4MDM0ZCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzRkfSwKLQkJCXtSRUdfMHgwMzRlLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGV9LAotCQkJe1JFR18weDAzNGYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM0Zn0sCi0JCQl7UkVHXzB4MTcxNiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgxNzE2fSwKLQkJCXtSRUdfMHgxNzE3LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDE3MTd9LAotCQkJe1JFR18weDE3MTgsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MTcxOH0sCi0JCQl7UkVHXzB4MTcxOSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgxNzE5fSwKLQkJCX07Ci0JCQkvKiBzdG9wIHN0cmVhbWluZyAqLwotCQkJbXNsZWVwKDIwKTsKLQotCQkJLyogUmVzZXQgZXZlcnl0aGluZyBmaXJzdCAqLwotCQkJbXNtX2NhbWVyYV9pMmNfd3JpdGVfdGJsKAotCQkJCXZ4Njk1M19zX2N0cmwuc2Vuc29yX2kyY19jbGllbnQsCi0JCQkJdng2OTUzX3N0YW5kYnksCi0JCQkJQVJSQVlfU0laRSh2eDY5NTNfc3RhbmRieSksCi0JCQkJdng2OTUzX3NfY3RybC5tc21fc2Vuc29yX3JlZy0+Ci0JCQkJZGVmYXVsdF9kYXRhX3R5cGUpOwotCi0KLQkJCW1zbGVlcCgyMCk7Ci0KLQkJCW1zbV9jYW1lcmFfaTJjX3dyaXRlX3RibCgKLQkJCQl2eDY5NTNfc19jdHJsLnNlbnNvcl9pMmNfY2xpZW50LAotCQkJCXZ4Njk1M19zdG9wX3NldHRpbmdzLAotCQkJCUFSUkFZX1NJWkUodng2OTUzX3N0b3Bfc2V0dGluZ3MpLAotCQkJCXZ4Njk1M19zX2N0cmwubXNtX3NlbnNvcl9yZWctPgotCQkJCWRlZmF1bHRfZGF0YV90eXBlKTsKLQkJCS8qdng2OTUzX3N0bTVtMGVkb2ZfZGVsYXlfbXNlY3Nfc3RkYnkqLwotCQkJbXNsZWVwKHZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5KTsKLQotCQkJbXNsZWVwKHZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5KTsKLQotCQkJbXNtX2NhbWVyYV9pMmNfd3JpdGVfdGJsKAotCQkJCXZ4Njk1M19zX2N0cmwuc2Vuc29yX2kyY19jbGllbnQsCi0JCQkJcGF0Y2hfdGJsX2N1dDIsCi0JCQkJQVJSQVlfU0laRShwYXRjaF90YmxfY3V0MiksCi0JCQkJdng2OTUzX3NfY3RybC5tc21fc2Vuc29yX3JlZy0+Ci0JCQkJZGVmYXVsdF9kYXRhX3R5cGUpOwotCi0JCQltc21fY2FtZXJhX2kyY193cml0ZV90YmwoCi0JCQkJdng2OTUzX3NfY3RybC5zZW5zb3JfaTJjX2NsaWVudCwKLQkJCQlpbml0X21vZGVfdGJsLAotCQkJCUFSUkFZX1NJWkUoaW5pdF9tb2RlX3RibCksCi0JCQkJdng2OTUzX3NfY3RybC5tc21fc2Vuc29yX3JlZy0+Ci0JCQkJZGVmYXVsdF9kYXRhX3R5cGUpOwotCi0JCQltc2xlZXAodng2OTUzX3N0bTVtMGVkb2ZfZGVsYXlfbXNlY3Nfc3RkYnkpOwotCQkJaWYgKHJ0ID09IFJFU19QUkVWSUVXKSB7Ci0JCQkJQ0RCRygiJXMgd3JpdGUgbW9kZV90YmwgZm9yIHByZXZpZXdcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQltc21fY2FtZXJhX2kyY193cml0ZV90YmwoCi0JCQkJCXZ4Njk1M19zX2N0cmwuc2Vuc29yX2kyY19jbGllbnQsCi0JCQkJCW1vZGVfdGJsMSwKLQkJCQkJQVJSQVlfU0laRShtb2RlX3RibDEpLAotCQkJCQl2eDY5NTNfc19jdHJsLm1zbV9zZW5zb3JfcmVnLT4KLQkJCQkJZGVmYXVsdF9kYXRhX3R5cGUpOwotCQkJfSBlbHNlIGlmIChydCA9PSBSRVNfQ0FQVFVSRSkgewotCQkJCUNEQkcoIiVzIHdyaXRlIG1vZGVfdGJsIGZvciBjYXB0dXJlXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJbXNtX2NhbWVyYV9pMmNfd3JpdGVfdGJsKAotCQkJCQl2eDY5NTNfc19jdHJsLnNlbnNvcl9pMmNfY2xpZW50LAotCQkJCQltb2RlX3RibDIsCi0JCQkJCUFSUkFZX1NJWkUobW9kZV90YmwyKSwKLQkJCQkJdng2OTUzX3NfY3RybC5tc21fc2Vuc29yX3JlZy0+Ci0JCQkJCWRlZmF1bHRfZGF0YV90eXBlKTsKLQkJCX0KLQkJCW1zbGVlcCh2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSk7Ci0KLQkJCS8qIFN0YXJ0IHNlbnNvciBzdHJlYW1pbmcgKi8KLQkJCW1zbV9jYW1lcmFfaTJjX3dyaXRlX3RibCgKLQkJCQl2eDY5NTNfc19jdHJsLnNlbnNvcl9pMmNfY2xpZW50LAotCQkJCXZ4Njk1M19zdGFydF9zZXR0aW5ncywKLQkJCQlBUlJBWV9TSVpFKHZ4Njk1M19zdGFydF9zZXR0aW5ncyksCi0JCQkJdng2OTUzX3NfY3RybC5tc21fc2Vuc29yX3JlZy0+Ci0JCQkJZGVmYXVsdF9kYXRhX3R5cGUpOwotCQkJbXNsZWVwKDIwKTsKLQotCQkJbXNtX2NhbWVyYV9pMmNfcmVhZCgKLQkJCQl2eDY5NTNfc19jdHJsLnNlbnNvcl9pMmNfY2xpZW50LAotCQkJCTB4MDAwNSwKLQkJCQkmZnJhbWVfY250LAotCQkJCU1TTV9DQU1FUkFfSTJDX0JZVEVfQUREUik7Ci0JCQl3aGlsZSAoZnJhbWVfY250ID09IDB4RkYpIHsKLQkJCQltc21fY2FtZXJhX2kyY19yZWFkKAotCQkJCQl2eDY5NTNfc19jdHJsLnNlbnNvcl9pMmNfY2xpZW50LAotCQkJCQkweDAwMDUsCi0JCQkJCSZmcmFtZV9jbnQsCi0JCQkJCU1TTV9DQU1FUkFfSTJDX0JZVEVfQUREUik7Ci0JCQkJQ0RCRygiJXMgZnJhbWVfY250ID0gJWRcbiIsCi0JCQkJCV9fZnVuY19fLCBmcmFtZV9jbnQpOwotCQkJCXVzbGVlcF9yYW5nZSg1MDAwLCAxMDAwMCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCQlkZWZhdWx0OgotCQlyZXR1cm4gcmM7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3Qgdng2OTUzX2luaXRfY29uZmlnKHZvaWQpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JaW50IHJ0OwotCS8qIGNoYW5nZSBzZW5zb3IgcmVzb2x1dGlvbglpZiBuZWVkZWQgKi8KLQlDREJHKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKLQlydCA9IFJFU19QUkVWSUVXOwotCXZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5ID0KLQkJKCgoKDIgKiAxMDAwICogZnBzX2RpdmlkZXIpIC8KLQkJICAgZnBzKSAqIFE4KSAvIFExMCkgKyAxOwotCi0Jdng2OTUzX3NlbnNvcl9zZXR0aW5nKFJFR19JTklULCBydCk7Ci0KLQl2eDY5NTNfZW5hYmxlX2Vkb2YoVlg2OTUzX0VET0ZfRVNUSU1BVElPTik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCB2eDY5NTNfdXBkYXRlX2NvbmZpZyhpbnQgcnQpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JQ0RCRygiJXMgcnQgPSAlZFxuIiwgX19mdW5jX18sIHJ0KTsKLQlpZiAocnQgPT0gTVNNX1NFTlNPUl9SRVNfRlVMTCkKLQkJcnQgPSBSRVNfQ0FQVFVSRTsKLQllbHNlIGlmIChydCA9PSBNU01fU0VOU09SX1JFU19RVFIpCi0JCXJ0ID0gUkVTX1BSRVZJRVc7Ci0KLQl2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSA9IDY3OwotCXZ4Njk1M19zZW5zb3Jfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsIHJ0KTsKLQotCWlmIChydCA9PSBSRVNfUFJFVklFVykKLQkJdng2OTUzX2VuYWJsZV9lZG9mKFZYNjk1M19FRE9GX0VTVElNQVRJT04pOwotCWVsc2UgaWYgKHJ0ID09IFJFU19DQVBUVVJFKQotCQl2eDY5NTNfZW5hYmxlX2Vkb2YoVlg2OTUzX0VET0ZfQVBQTElDQVRJT04pOwotCi0JcmV0dXJuIHJjOwotfSAvKmVuZCBvZiB2eDY5NTNfc25hcHNob3RfY29uZmlnKi8KLQotc3RhdGljIGludDMyX3Qgdng2OTUzX3NldF9zZW5zb3JfbW9kZShzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCwKLQlpbnQgdXBkYXRlX3R5cGUsIGludCBydCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQotCWZwc19kaXZpZGVyID0gMSAqIDB4MDAwMDA0MDA7Ci0JZnBzID0gMzAqUTg7Ci0KLQlzd2l0Y2ggKHVwZGF0ZV90eXBlKSB7Ci0JY2FzZSBNU01fU0VOU09SX1JFR19JTklUOgotCQlyYyA9IHZ4Njk1M19pbml0X2NvbmZpZygpOwotCQlicmVhazsKLQljYXNlIE1TTV9TRU5TT1JfVVBEQVRFX1BFUklPRElDOgotCQlyYyA9IHZ4Njk1M191cGRhdGVfY29uZmlnKHJ0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotc3RhdGljIHN0cnVjdCBtc21fc2Vuc29yX2ZuX3Qgdng2OTUzX2Z1bmNfdGJsID0gewotCS5zZW5zb3Jfc3RhcnRfc3RyZWFtID0gbXNtX3NlbnNvcl9zdGFydF9zdHJlYW0sCi0JLnNlbnNvcl9zdG9wX3N0cmVhbSA9IG1zbV9zZW5zb3Jfc3RvcF9zdHJlYW0sCi0JLnNlbnNvcl9ncm91cF9ob2xkX29uID0gbXNtX3NlbnNvcl9ncm91cF9ob2xkX29uLAotCS5zZW5zb3JfZ3JvdXBfaG9sZF9vZmYgPSBtc21fc2Vuc29yX2dyb3VwX2hvbGRfb2ZmLAotCS5zZW5zb3Jfc2V0X2ZwcyA9IHZ4Njk1M19zZXRfZnBzLAotCS5zZW5zb3Jfd3JpdGVfZXhwX2dhaW4gPSB2eDY5NTNfd3JpdGVfZXhwX2dhaW4sCi0JLnNlbnNvcl93cml0ZV9zbmFwc2hvdF9leHBfZ2FpbiA9IHZ4Njk1M193cml0ZV9leHBfZ2FpbiwKLQkuc2Vuc29yX2NzaV9zZXR0aW5nID0gdng2OTUzX3NldF9zZW5zb3JfbW9kZSwKLQkuc2Vuc29yX3NldF9zZW5zb3JfbW9kZSA9IG1zbV9zZW5zb3Jfc2V0X3NlbnNvcl9tb2RlLAotCS5zZW5zb3JfbW9kZV9pbml0ID0gbXNtX3NlbnNvcl9tb2RlX2luaXQsCi0JLnNlbnNvcl9nZXRfb3V0cHV0X2luZm8gPSBtc21fc2Vuc29yX2dldF9vdXRwdXRfaW5mbywKLQkuc2Vuc29yX2NvbmZpZyA9IG1zbV9zZW5zb3JfY29uZmlnLAotCS5zZW5zb3JfcG93ZXJfdXAgPSBtc21fc2Vuc29yX3Bvd2VyX3VwLAotCS5zZW5zb3JfcG93ZXJfZG93biA9IG1zbV9zZW5zb3JfcG93ZXJfZG93biwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3NlbnNvcl9yZWdfdCB2eDY5NTNfZGF0YV9yZWdzID0gewotCS5kZWZhdWx0X2RhdGFfdHlwZSA9IE1TTV9DQU1FUkFfSTJDX0JZVEVfREFUQSwKLQkuc3RhcnRfc3RyZWFtX2NvbmYgPSB2eDY5NTNfc3RhcnRfc2V0dGluZ3MsCi0JLnN0YXJ0X3N0cmVhbV9jb25mX3NpemUgPSBBUlJBWV9TSVpFKHZ4Njk1M19zdGFydF9zZXR0aW5ncyksCi0JLnN0b3Bfc3RyZWFtX2NvbmYgPSB2eDY5NTNfc3RvcF9zZXR0aW5ncywKLQkuc3RvcF9zdHJlYW1fY29uZl9zaXplID0gQVJSQVlfU0laRSh2eDY5NTNfc3RvcF9zZXR0aW5ncyksCi0JLmdyb3VwX2hvbGRfb25fY29uZiA9IHZ4Njk1M19ncm91cG9uX3NldHRpbmdzLAotCS5ncm91cF9ob2xkX29uX2NvbmZfc2l6ZSA9IEFSUkFZX1NJWkUodng2OTUzX2dyb3Vwb25fc2V0dGluZ3MpLAotCS5ncm91cF9ob2xkX29mZl9jb25mID0gdng2OTUzX2dyb3Vwb2ZmX3NldHRpbmdzLAotCS5ncm91cF9ob2xkX29mZl9jb25mX3NpemUgPQotCQlBUlJBWV9TSVpFKHZ4Njk1M19ncm91cG9mZl9zZXR0aW5ncyksCi0JLmluaXRfc2V0dGluZ3MgPSAmdng2OTUzX2luaXRfY29uZlswXSwKLQkuaW5pdF9zaXplID0gQVJSQVlfU0laRSh2eDY5NTNfaW5pdF9jb25mKSwKLQkubW9kZV9zZXR0aW5ncyA9ICZ2eDY5NTNfY29uZnNbMF0sCi0JLm91dHB1dF9zZXR0aW5ncyA9ICZ2eDY5NTNfZGltZW5zaW9uc1swXSwKLQkubnVtX2NvbmYgPSBBUlJBWV9TSVpFKHZ4Njk1M19jb25mcyksCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9zZW5zb3JfY3RybF90IHZ4Njk1M19zX2N0cmwgPSB7Ci0JLm1zbV9zZW5zb3JfcmVnID0gJnZ4Njk1M19kYXRhX3JlZ3MsCi0JLnNlbnNvcl9pMmNfY2xpZW50ID0gJnZ4Njk1M19zZW5zb3JfaTJjX2NsaWVudCwKLQkuc2Vuc29yX2kyY19hZGRyID0gMHgyMCwKLQkuc2Vuc29yX291dHB1dF9yZWdfYWRkciA9ICZ2eDY5NTNfcmVnX2FkZHIsCi0JLnNlbnNvcl9pZF9pbmZvID0gJnZ4Njk1M19pZF9pbmZvLAotCS5zZW5zb3JfZXhwX2dhaW5faW5mbyA9ICZ2eDY5NTNfZXhwX2dhaW5faW5mbywKLQkuY2FtX21vZGUgPSBNU01fU0VOU09SX01PREVfSU5WQUxJRCwKLQkubXNtX3NlbnNvcl9tdXRleCA9ICZ2eDY5NTNfbXV0LAotCS5zZW5zb3JfaTJjX2RyaXZlciA9ICZ2eDY5NTNfaTJjX2RyaXZlciwKLQkuc2Vuc29yX3Y0bDJfc3ViZGV2X2luZm8gPSB2eDY5NTNfc3ViZGV2X2luZm8sCi0JLnNlbnNvcl92NGwyX3N1YmRldl9pbmZvX3NpemUgPSBBUlJBWV9TSVpFKHZ4Njk1M19zdWJkZXZfaW5mbyksCi0JLnNlbnNvcl92NGwyX3N1YmRldl9vcHMgPSAmdng2OTUzX3N1YmRldl9vcHMsCi0JLmZ1bmNfdGJsID0gJnZ4Njk1M19mdW5jX3RibCwKLQkuY2xrX3JhdGUgPSBNU01fU0VOU09SX01DTEtfMjRIWiwKLX07Ci0KLW1vZHVsZV9pbml0KG1zbV9zZW5zb3JfaW5pdF9tb2R1bGUpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTZW5zb3IgVlg2OTUzIChCQVlFUiA1TSkiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlbnNvcnMvdng2OTUzLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy92eDY5NTMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjMmExOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy92eDY5NTMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgVlg2OTUzX0gKLSNkZWZpbmUgVlg2OTUzX0gKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLXN0cnVjdCByZWdfc3RydWN0X2luaXQgewotCXVpbnQ4X3QgcmVnXzB4MDExMjsgICAgICAvKiAweDAxMTIqLwotCXVpbnQ4X3QgcmVnXzB4MDExMzsgICAgICAvKiAweDAxMTMqLwotCXVpbnQ4X3QgdnRfcGl4X2Nsa19kaXY7ICAvKiAweDAzMDEqLwotCXVpbnQ4X3QgcHJlX3BsbF9jbGtfZGl2OyAvKiAweDAzMDUqLwotCXVpbnQ4X3QgcGxsX211bHRpcGxpZXI7ICAvKiAweDAzMDcqLwotCXVpbnQ4X3Qgb3BfcGl4X2Nsa19kaXY7ICAvKiAweDAzMDkqLwotCXVpbnQ4X3QgcmVnXzB4MzAzMDsgICAgICAvKjB4MzAzMCovCi0JdWludDhfdCByZWdfMHgwMTExOyAgICAgIC8qMHgwMTExKi8KLQl1aW50OF90IHJlZ18weDBiMDA7ICAgICAgLyoweDBiMDAqLwotCXVpbnQ4X3QgcmVnXzB4MzAwMTsgICAgICAvKjB4MzAwMSovCi0JdWludDhfdCByZWdfMHgzMDA0OyAgICAgIC8qMHgzMDA0Ki8KLQl1aW50OF90IHJlZ18weDMwMDc7ICAgICAgLyoweDMwMDcqLwotCXVpbnQ4X3QgcmVnXzB4MzAxNjsgICAgICAvKjB4MzAxNiovCi0JdWludDhfdCByZWdfMHgzMDFkOyAgICAgIC8qMHgzMDFkKi8KLQl1aW50OF90IHJlZ18weDMxN2U7ICAgICAgLyoweDMxN0UqLwotCXVpbnQ4X3QgcmVnXzB4MzE3ZjsgICAgICAvKjB4MzE3RiovCi0JdWludDhfdCByZWdfMHgzNDAwOyAgICAgIC8qMHgzNDAwKi8KLQl1aW50OF90IHJlZ18weDBiMDY7ICAgICAgLyoweDBiMDYqLwotCXVpbnQ4X3QgcmVnXzB4MGIwNzsgICAgICAvKjB4MGIwNyovCi0JdWludDhfdCByZWdfMHgwYjA4OyAgICAgIC8qMHgwYjA4Ki8KLQl1aW50OF90IHJlZ18weDBiMDk7ICAgICAgLyoweDBiMDkqLwotCXVpbnQ4X3QgcmVnXzB4MDEzNjsKLQl1aW50OF90IHJlZ18weDAxMzc7Ci0JLyogRWRvZiAqLwotCXVpbnQ4X3QgcmVnXzB4MGI4MzsgICAgICAvKjB4MGI4MyovCi0JdWludDhfdCByZWdfMHgwYjg0OyAgICAgIC8qMHgwYjg0Ki8KLQl1aW50OF90IHJlZ18weDBiODU7ICAgICAgLyoweDBiODUqLwotCXVpbnQ4X3QgcmVnXzB4MGI4ODsgICAgICAvKjB4MGI4OCovCi0JdWludDhfdCByZWdfMHgwYjg5OyAgICAgIC8qMHgwYjg5Ki8KLQl1aW50OF90IHJlZ18weDBiOGE7ICAgICAgLyoweDBiOGEqLwotCX07Ci1zdHJ1Y3QgcmVnX3N0cnVjdCB7Ci0JdWludDhfdCBjb2Fyc2VfaW50ZWdyYXRpb25fdGltZV9oaTsgLypSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfSEkqLwotCXVpbnQ4X3QgY29hcnNlX2ludGVncmF0aW9uX3RpbWVfbG87IC8qUkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0xPKi8KLQl1aW50OF90IGFuYWxvZ3VlX2dhaW5fY29kZV9nbG9iYWw7Ci0JdWludDhfdCBmcmFtZV9sZW5ndGhfbGluZXNfaGk7IC8qIDB4MDM0MCovCi0JdWludDhfdCBmcmFtZV9sZW5ndGhfbGluZXNfbG87IC8qIDB4MDM0MSovCi0JdWludDhfdCBsaW5lX2xlbmd0aF9wY2tfaGk7ICAgIC8qIDB4MDM0MiovCi0JdWludDhfdCBsaW5lX2xlbmd0aF9wY2tfbG87ICAgIC8qIDB4MDM0MyovCi0JdWludDhfdCByZWdfMHgzMDA1OyAgIC8qIDB4MzAwNSovCi0JdWludDhfdCByZWdfMHgzMDEwOyAgLyogMHgzMDEwKi8KLQl1aW50OF90IHJlZ18weDMwMTE7ICAvKiAweDMwMTEqLwotCXVpbnQ4X3QgcmVnXzB4MzAxYTsgIC8qIDB4MzAxYSovCi0JdWludDhfdCByZWdfMHgzMDM1OyAgLyogMHgzMDM1Ki8KLQl1aW50OF90IHJlZ18weDMwMzY7ICAgLyogMHgzMDM2Ki8KLQl1aW50OF90IHJlZ18weDMwNDE7ICAvKjB4MzA0MSovCi0JdWludDhfdCByZWdfMHgzMDQyOyAgLyoweDMwNDIqLwotCXVpbnQ4X3QgcmVnXzB4MzA0NTsgIC8qMHgzMDQ1Ki8KLQl1aW50OF90IHJlZ18weDBiODA7ICAgLyogMHgwYjgwKi8KLQl1aW50OF90IHJlZ18weDA5MDA7ICAgLyoweDA5MDAqLwotCXVpbnQ4X3QgcmVnXzB4MDkwMTsgICAvKiAweDA5MDEqLwotCXVpbnQ4X3QgcmVnXzB4MDkwMjsgICAvKjB4MDkwMiovCi0JdWludDhfdCByZWdfMHgwMzgzOyAgIC8qMHgwMzgzKi8KLQl1aW50OF90IHJlZ18weDAzODc7ICAgLyogMHgwMzg3Ki8KLQl1aW50OF90IHJlZ18weDAzNGM7ICAgLyogMHgwMzRjKi8KLQl1aW50OF90IHJlZ18weDAzNGQ7ICAgLyoweDAzNGQqLwotCXVpbnQ4X3QgcmVnXzB4MDM0ZTsgICAvKiAweDAzNGUqLwotCXVpbnQ4X3QgcmVnXzB4MDM0ZjsgICAvKiAweDAzNGYqLwotCXVpbnQ4X3QgcmVnXzB4MTcxNjsgLyoweDE3MTYqLwotCXVpbnQ4X3QgcmVnXzB4MTcxNzsgLyoweDE3MTcqLwotCXVpbnQ4X3QgcmVnXzB4MTcxODsgLyoweDE3MTgqLwotCXVpbnQ4X3QgcmVnXzB4MTcxOTsgLyoweDE3MTkqLwotCXVpbnQ4X3QgcmVnXzB4MzIxMDsvKjB4MzIxMCovCi0JdWludDhfdCByZWdfMHgxMTE7IC8qMHgxMTEqLwotCXVpbnQ4X3QgcmVnXzB4MzQxMDsgIC8qMHgzNDEwKi8KLQl1aW50OF90IHJlZ18weDMwOTg7Ci0JdWludDhfdCByZWdfMHgzMDlEOwotCXVpbnQ4X3QgcmVnXzB4MDIwMDsKLQl1aW50OF90IHJlZ18weDAyMDE7Ci0JfTsKLXN0cnVjdCB2eDY5NTNfaTJjX3JlZ19jb25mIHsKLQl1bnNpZ25lZCBzaG9ydCB3YWRkcjsKLQl1bnNpZ25lZCBzaG9ydCB3ZGF0YTsKLX07Ci0KLWVudW0gdng2OTUzX3Rlc3RfbW9kZV90IHsKLQlURVNUX09GRiwKLQlURVNUXzEsCi0JVEVTVF8yLAotCVRFU1RfMwotfTsKLQotZW51bSB2eDY5NTNfcmVzb2x1dGlvbl90IHsKLQlRVFJfU0laRSwKLQlGVUxMX1NJWkUsCi0JSU5WQUxJRF9TSVpFCi19OwotZW51bSB2eDY5NTNfc2V0dGluZyB7Ci0JUkVTX1BSRVZJRVcsCi0JUkVTX0NBUFRVUkUKLX07Ci1lbnVtIG10OXAwMTJfcmVnX3VwZGF0ZSB7Ci0JLyogU2Vuc29yIGVnaXN0ZXJzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiAqLwotCVJFR19JTklULAotCS8qIFNlbnNvciBlZ2lzdGVycyB0aGF0IG5lZWRzIHBlcmlvZGljIEkyQyB3cml0ZXMgKi8KLQlVUERBVEVfUEVSSU9ESUMsCi0JLyogQWxsIHRoZSBzZW5zb3IgUmVnaXN0ZXJzIHdpbGwgYmUgdXBkYXRlZCAqLwotCVVQREFURV9BTEwsCi0JLyogTm90IHZhbGlkIHVwZGF0ZSAqLwotCVVQREFURV9JTlZBTElECi19OwotCi1lbnVtIHNlbnNvcl9yZXZpc2lvbl90IHsKLQlWWDY5NTNfU1RNNU0wRURPRl9DVVRfMSwKLQlWWDY5NTNfU1RNNU0wRURPRl9DVVRfMiwKLQlWWDY5NTNfU1RNNU0wRURPRl9DVVRfMwotfTsKLWVudW0gZWRvZl9tb2RlX3QgewotCVZYNjk1M19FRE9GX0RJU0FCTEUsICAgICAgIC8qIDB4MDAgKi8KLQlWWDY5NTNfRURPRl9BUFBMSUNBVElPTiwgICAvKiAweDAxICovCi0JVlg2OTUzX0VET0ZfRVNUSU1BVElPTiAgICAgLyogMHgwMiAqLwotfTsKLXN0cnVjdCB2eDY5NTNfcmVnIHsKLQljb25zdCBzdHJ1Y3QgcmVnX3N0cnVjdF9pbml0ICAqcmVnX3BhdF9pbml0OwotCWNvbnN0IHN0cnVjdCByZWdfc3RydWN0ICAqcmVnX3BhdDsKLX07Ci0jZW5kaWYgLyogVlg2OTUzX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL3Z4Njk1M19yZWcuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZW5zb3JzL3Z4Njk1M19yZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5OWJlNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycy92eDY5NTNfcmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0KLXN0cnVjdCByZWdfc3RydWN0X2luaXQgdng2OTUzX3JlZ19pbml0WzFdID0gewotCXsKLQkJMTAsCQkJLypSRUcgPSAweDAxMTIgLCAxMCBiaXQgKi8KLQkJMTAsCQkJLypSRUcgPSAweDAxMTMqLwotCQk5LAkJCS8qUkVHID0gMHgwMzAxIHZ0X3BpeF9jbGtfZGl2Ki8KLQkJNCwJCS8qUkVHID0gMHgwMzA1IHByZV9wbGxfY2xrX2RpdiovCi0JCTEzMywJCS8qUkVHID0gMHgwMzA3IHBsbF9tdWx0aXBsaWVyKi8KLQkJMTAsCQkvKlJFRyA9IDB4MDMwOSBvcF9waXhfY2xrX2RpdiovCi0JCTB4MDgsCQkvKlJFRyA9IDB4MzAzMCovCi0JCTB4MDIsCQkvKlJFRyA9IDB4MDExMSovCi0JCTB4MDEsCQkvKlJFRyA9IDB4MGIwMCAsbGVucyBzaGFkaW5nIG9mZiAqLwotCQkweDMwLAkJLypSRUcgPSAweDMwMDEqLwotCQkweDMzLAkJLypSRUcgPSAweDMwMDQqLwotCQkweDA5LAkJLypSRUcgPSAweDMwMDcqLwotCQkweDFGLAkJLypSRUcgPSAweDMwMTYqLwotCQkweDAzLAkJLypSRUcgPSAweDMwMWQqLwotCQkweDExLAkJLypSRUcgPSAweDMxN0UqLwotCQkweDA5LAkJLypSRUcgPSAweDMxN0YqLwotCQkweDM4LAkJLypSRUcgPSAweDM0MDAqLwotCQkweDAwLAkJLypSRUdfMHgwYjA2Ki8KLQkJMHg4MCwJCS8qUkVHXzB4MGIwNyovCi0JCTB4MDEsCQkvKlJFR18weDBiMDgqLwotCQkweDRGLAkJLypSRUdfMHgwYjA5Ki8KLQkJMHgxOCwJCS8qUkVHXzB4MDEzNiovCi0JCTB4MDAsCQkvKi9SRUdfMHgwMTM3Ki8KLQkJMHgyMCwJCS8qUkVHID0gMHgwYjgzKi8KLQkJMHg5MCwJCS8qUkVHID0gMHgwYjg0Ki8KLQkJMHgyMCwJCS8qUkVHID0gMHgwYjg1Ki8KLQkJMHg4MCwJCS8qUkVHID0gMHgwYjg4Ki8KLQkJMHgwMCwJCS8qUkVHID0gMHgwYjg5Ki8KLQkJMHgwMCwJCS8qUkVHID0gMHgwYjhhKi8KLQl9Ci19Owotc3RydWN0IHJlZ19zdHJ1Y3Qgdng2OTUzX3JlZ19wYXRbMl0gPSB7Ci0Jey8qIFByZXZpZXcgKi8KLQkJMHgwMywJLypSRUcgPSAweDAyMDIgY29hcnNlIGludGVncmF0aW9uX3RpbWVfaGkqLwotCQkweGQwLAkvKlJFRyA9IDB4MDIwMyBjb2Fyc2VfaW50ZWdyYXRpb25fdGltZV9sbyovCi0JCTB4YzAsCS8qUkVHID0gMHgwMjA1IGFuYWxvZ3VlX2dhaW5fY29kZV9nbG9iYWwqLwotCQkweDAzLAkvKlJFRyA9IDB4MDM0MCBmcmFtZV9sZW5ndGhfbGluZXNfaGkqLwotCQkweGYwLAkvKlJFRyA9IDB4MDM0MSBmcmFtZV9sZW5ndGhfbGluZXNfbG8qLwotCQkweDBiLAkvKlJFRyA9IDB4MDM0MiAgbGluZV9sZW5ndGhfcGNrX2hpKi8KLQkJMHg3NCwJLypSRUcgPSAweDAzNDMgIGxpbmVfbGVuZ3RoX3Bja19sbyovCi0JCTB4MDMsCS8qUkVHID0gMHgzMDA1Ki8KLQkJMHgwMCwJLypSRUcgPSAweDMwMTAqLwotCQkweDAxLAkvKlJFRyA9IDB4MzAxMSovCi0JCTB4NmEsCS8qUkVHID0gMHgzMDFhKi8KLQkJMHgwMywJLypSRUcgPSAweDMwMzUqLwotCQkweDJjLAkvKlJFRyA9IDB4MzAzNiovCi0JCTB4MDAsCS8qUkVHID0gMHgzMDQxKi8KLQkJMHgyNCwJLypSRUcgPSAweDMwNDIqLwotCQkweDgxLAkvKlJFRyA9IDB4MzA0NSovCi0JCTB4MDIsCS8qUkVHID0gMHgwYjgwIGVkb2YgZXN0aW1hdGUqLwotCQkweDAxLAkvKlJFRyA9IDB4MDkwMCovCi0JCTB4MjIsCS8qUkVHID0gMHgwOTAxKi8KLQkJMHgwNCwJLypSRUcgPSAweDA5MDIqLwotCQkweDAzLAkvKlJFRyA9IDB4MDM4MyovCi0JCTB4MDMsCS8qUkVHID0gMHgwMzg3Ki8KLQkJMHgwNSwJLypSRUcgPSAweDAzNGMqLwotCQkweDE4LAkvKlJFRyA9IDB4MDM0ZCovCi0JCTB4MDMsCS8qUkVHID0gMHgwMzRlKi8KLQkJMHhkNCwJLypSRUcgPSAweDAzNGYqLwotCQkweDAyLAkvKjB4MTcxNiovCi0JCTB4MDQsCS8qMHgxNzE3Ki8KLQkJMHgwOCwJLyoweDE3MTgqLwotCQkweDJjLAkvKjB4MTcxOSovCi0JCTB4MDEsICAgLyoweDMyMTAqLwotCQkweDAyLCAgIC8qMHgxMTEqLwotCQkweDAxLCAgIC8qMHgzNDEwKi8KLQkJMHgwMSwgICAvKjB4MzA5OCovCi0JCTB4MDUsICAgLyoweDMwOUQqLwotCQkweDAyLAotCQkweDA0LAotCX0sCi0JeyAvKiBTbmFwc2hvdCAqLwotCQkweDA3LC8qUkVHID0gMHgwMjAyIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX2hpKi8KLQkJMHgwMCwvKlJFRyA9IDB4MDIwMyBjb2Fyc2VfaW50ZWdyYXRpb25fdGltZV9sbyovCi0JCTB4YzAsLypSRUcgPSAweDAyMDUgYW5hbG9ndWVfZ2Fpbl9jb2RlX2dsb2JhbCovCi0JCTB4MDcsLypSRUcgPSAweDAzNDAgZnJhbWVfbGVuZ3RoX2xpbmVzX2hpKi8KLQkJMHhkMCwvKlJFRyA9IDB4MDM0MSBmcmFtZV9sZW5ndGhfbGluZXNfbG8qLwotCQkweDBiLC8qUkVHID0gMHgwMzQyIGxpbmVfbGVuZ3RoX3Bja19oaSovCi0JCTB4OGMsLypSRUcgPSAweDAzNDMgbGluZV9sZW5ndGhfcGNrX2xvKi8KLQkJMHgwMSwvKlJFRyA9IDB4MzAwNSovCi0JCTB4MDAsLypSRUcgPSAweDMwMTAqLwotCQkweDAwLC8qUkVHID0gMHgzMDExKi8KLQkJMHg1NSwvKlJFRyA9IDB4MzAxYSovCi0JCTB4MDEsLypSRUcgPSAweDMwMzUqLwotCQkweDIzLC8qUkVHID0gMHgzMDM2Ki8KLQkJMHgwMCwvKlJFRyA9IDB4MzA0MSovCi0JCTB4MjQsLypSRUcgPSAweDMwNDIqLwotCQkweGI3LC8qUkVHID0gMHgzMDQ1Ki8KLQkJMHgwMSwvKlJFRyA9IDB4MGI4MCBlZG9mIGFwcGxpY2F0aW9uKi8KLQkJMHgwMCwvKlJFRyA9IDB4MDkwMCovCi0JCTB4MDAsLypSRUcgPSAweDA5MDEqLwotCQkweDAwLC8qUkVHID0gMHgwOTAyKi8KLQkJMHgwMSwvKlJFRyA9IDB4MDM4MyovCi0JCTB4MDEsLypSRUcgPSAweDAzODcqLwotCQkweDBBLC8qUkVHID0gMHgwMzRjKi8KLQkJMHgzMCwvKlJFRyA9IDB4MDM0ZCovCi0JCTB4MDcsLypSRUcgPSAweDAzNGUqLwotCQkweEE4LC8qUkVHID0gMHgwMzRmKi8KLQkJMHgwMiwvKjB4MTcxNiovCi0JCTB4MGQsLyoweDE3MTcqLwotCQkweDA3LC8qMHgxNzE4Ki8KLQkJMHg3ZCwvKjB4MTcxOSovCi0JCTB4MDEsLyoweDMyMTAqLwotCQkweDAyLC8qMHgxMTEqLwotCQkweDAxLC8qMHgzNDEwKi8KLQkJMHgwMSwvKjB4MzA5OCovCi0JCTB4MDUsIC8qMHgzMDlEKi8KLQkJMHgwMiwKLQkJMHgwMCwKLQl9Ci19OwotCi0KLQotc3RydWN0IHZ4Njk1M19yZWcgdng2OTUzX3JlZ3MgPSB7Ci0JLnJlZ19wYXRfaW5pdCA9ICZ2eDY5NTNfcmVnX2luaXRbMF0sCi0JLnJlZ19wYXQgPSAmdng2OTUzX3JlZ19wYXRbMF0sCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlcnZlci9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZXJ2ZXIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NGJlNTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlcnZlci9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLUdDQ19WRVJTSU9OICAgICAgOj0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChQV0QpL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2ggJChDUk9TU19DT01QSUxFKWdjYykKLQotaWZlcSAoJChDT05GSUdfTVNNX0NBTUVSQV9WNEwyKSx5KQotICBFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEKLSAgRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2lvCi0gIEVYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9jc2kKLSAgRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL2VlcHJvbQotICBFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2Vuc29ycwotICBFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvYWN0dWF0b3JzCi0gIG9iai0kKENPTkZJR19NU01fQ0FNRVJBKSAgICs9IG1zbV9jYW1fc2VydmVyLm8KLWVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2VydmVyL21zbV9jYW1fc2VydmVyLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc2VydmVyL21zbV9jYW1fc2VydmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZmJhMzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlcnZlci9tc21fY2FtX3NlcnZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI1OCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgIm1zbV9jYW1fc2VydmVyLmgiCi0jaW5jbHVkZSAibXNtX2NzaWQuaCIKLSNpbmNsdWRlICJtc21fY3NpYy5oIgotI2luY2x1ZGUgIm1zbV9jc2lwaHkuaCIKLSNpbmNsdWRlICJtc21faXNwaWYuaCIKLSNpbmNsdWRlICJtc21fc2Vuc29yLmgiCi0jaW5jbHVkZSAibXNtX2FjdHVhdG9yLmgiCi0jaW5jbHVkZSAibXNtX2NzaV9yZWdpc3Rlci5oIgotCi0jaWZkZWYgQ09ORklHX01TTV9DQU1FUkFfREVCVUcKLSNkZWZpbmUgRChmbXQsIGFyZ3MuLi4pIHByX2RlYnVnKCJtc206ICIgZm10LCAjI2FyZ3MpCi0jZWxzZQotI2RlZmluZSBEKGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBtc21fY2FtX3NlcnZlcl9kZXYgZ19zZXJ2ZXJfZGV2Owotc3RhdGljIHN0cnVjdCBjbGFzcyAqbXNtX2NsYXNzOwotc3RhdGljIGRldl90IG1zbV9kZXZubzsKLQotc3RhdGljIGxvbmcgbXNtX3NlcnZlcl9zZW5kX3Y0bDJfZXZ0KHZvaWQgKmV2dCk7Ci1zdGF0aWMgdm9pZCBtc21fY2FtX3NlcnZlcl9zdWJkZXZfbm90aWZ5KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JdW5zaWduZWQgaW50IG5vdGlmaWNhdGlvbiwgdm9pZCAqYXJnKTsKLQotdm9pZCBtc21fcXVldWVfaW5pdChzdHJ1Y3QgbXNtX2RldmljZV9xdWV1ZSAqcXVldWUsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlzcGluX2xvY2tfaW5pdCgmcXVldWUtPmxvY2spOwotCXF1ZXVlLT5sZW4gPSAwOwotCXF1ZXVlLT5tYXggPSAwOwotCXF1ZXVlLT5uYW1lID0gbmFtZTsKLQlJTklUX0xJU1RfSEVBRCgmcXVldWUtPmxpc3QpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnF1ZXVlLT53YWl0KTsKLX0KLQotdm9pZCBtc21fZW5xdWV1ZShzdHJ1Y3QgbXNtX2RldmljZV9xdWV1ZSAqcXVldWUsCi0JCQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+bG9jaywgZmxhZ3MpOwotCXF1ZXVlLT5sZW4rKzsKLQlpZiAocXVldWUtPmxlbiA+IHF1ZXVlLT5tYXgpIHsKLQkJcXVldWUtPm1heCA9IHF1ZXVlLT5sZW47Ci0JCXByX2luZm8oIiVzOiBxdWV1ZSAlcyBuZXcgbWF4IGlzICVkXG4iLCBfX2Z1bmNfXywKLQkJCXF1ZXVlLT5uYW1lLCBxdWV1ZS0+bWF4KTsKLQl9Ci0JbGlzdF9hZGRfdGFpbChlbnRyeSwgJnF1ZXVlLT5saXN0KTsKLQl3YWtlX3VwKCZxdWV1ZS0+d2FpdCk7Ci0JRCgiJXM6IHdva2UgdXAgJXNcbiIsIF9fZnVuY19fLCBxdWV1ZS0+bmFtZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmxvY2ssIGZsYWdzKTsKLX0KLQotdm9pZCBtc21fZHJhaW5fZXZlbnRxKHN0cnVjdCBtc21fZGV2aWNlX3F1ZXVlICpxdWV1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBtc21fcXVldWVfY21kICpxY21kOwotCXN0cnVjdCBtc21faXNwX2V2ZW50X2N0cmwgKmlzcF9ldmVudDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPmxvY2ssIGZsYWdzKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJnF1ZXVlLT5saXN0KSkgewotCQlxY21kID0gbGlzdF9maXJzdF9lbnRyeSgmcXVldWUtPmxpc3QsCi0JCQlzdHJ1Y3QgbXNtX3F1ZXVlX2NtZCwgbGlzdF9ldmVudGRhdGEpOwotCQlsaXN0X2RlbF9pbml0KCZxY21kLT5saXN0X2V2ZW50ZGF0YSk7Ci0JCWlzcF9ldmVudCA9Ci0JCQkoc3RydWN0IG1zbV9pc3BfZXZlbnRfY3RybCAqKQotCQkJcWNtZC0+Y29tbWFuZDsKLQkJaWYgKGlzcF9ldmVudC0+aXNwX2RhdGEuY3RybC52YWx1ZSAhPSBOVUxMKQotCQkJa2ZyZWUoaXNwX2V2ZW50LT5pc3BfZGF0YS5jdHJsLnZhbHVlKTsKLQkJa2ZyZWUocWNtZC0+Y29tbWFuZCk7Ci0JCWZyZWVfcWNtZChxY21kKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmxvY2ssIGZsYWdzKTsKLX0KLQotaW50MzJfdCBtc21fZmluZF9mcmVlX3F1ZXVlKHZvaWQpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fQUNUSVZFX0NBTUVSQTsgaSsrKSB7Ci0JCXN0cnVjdCBtc21fY2FtX3NlcnZlcl9xdWV1ZSAqcXVldWU7Ci0JCXF1ZXVlID0gJmdfc2VydmVyX2Rldi5zZXJ2ZXJfcXVldWVbaV07Ci0JCWlmICghcXVldWUtPnF1ZXVlX2FjdGl2ZSkKLQkJCXJldHVybiBpOwotCX0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotdm9pZCBtc21fc2V0dXBfdjRsMl9ldmVudF9xdWV1ZShzdHJ1Y3QgdjRsMl9maCAqZXZlbnRIYW5kbGUsCi0Jc3RydWN0IHZpZGVvX2RldmljZSAqcHZkZXYpCi17Ci0JdjRsMl9maF9pbml0KGV2ZW50SGFuZGxlLCBwdmRldik7Ci0JdjRsMl9maF9hZGQoZXZlbnRIYW5kbGUpOwotfQotCi12b2lkIG1zbV9kZXN0cm95X3Y0bDJfZXZlbnRfcXVldWUoc3RydWN0IHY0bDJfZmggKmV2ZW50SGFuZGxlKQotewotCXY0bDJfZmhfZGVsKGV2ZW50SGFuZGxlKTsKLQl2NGwyX2ZoX2V4aXQoZXZlbnRIYW5kbGUpOwotfQotCi1pbnQgbXNtX2NhbV9zZXJ2ZXJfY29uZmlnX2ludGVyZmFjZV9tYXAodTMyIGV4dGVuZGVkbW9kZSwKLQl1aW50MzJfdCBtY3RsX2hhbmRsZSwgaW50IHZub2RlX2lkLCBpbnQgaXNfYmF5ZXJfc2Vuc29yKQotewotCWludCBpID0gMDsKLQlpbnQgcmMgPSAwOwotCWludCBvbGRfaGFuZGxlOwotCWludCBpbnRlcmZhY2U7Ci0KLQlpZiAodm5vZGVfaWQgPj0gTUFYX05VTV9BQ1RJVkVfQ0FNRVJBKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgbXNtX2RldiBub2RlIGlkID0gJWQiLCBfX2Z1bmNfXywgdm5vZGVfaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JRCgiJXM6IGV4dGVuZGVkbW9kZSA9ICVkLCB2bm9kZV9pZCA9ICVkLCBpc19iYXllcl9zZW5zb3IgPSAlZCIsCi0JCV9fZnVuY19fLCBleHRlbmRlZG1vZGUsIHZub2RlX2lkLCBpc19iYXllcl9zZW5zb3IpOwotCXN3aXRjaCAoZXh0ZW5kZWRtb2RlKSB7Ci0JY2FzZSBNU01fVjRMMl9FWFRfQ0FQVFVSRV9NT0RFX1JESToKLQkJaW50ZXJmYWNlID0gUkRJXzA7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9SREkxOgotCQlpbnRlcmZhY2UgPSBSRElfMTsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fVjRMMl9FWFRfQ0FQVFVSRV9NT0RFX1JESTI6Ci0JCWludGVyZmFjZSA9IFJESV8yOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpbnRlcmZhY2UgPSBQSVhfMDsKLQkJYnJlYWs7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IElOVEZfTUFYOyBpKyspIHsKLQkJaWYgKGdfc2VydmVyX2Rldi5pbnRlcmZhY2VfbWFwX3RhYmxlW2ldLmludGVyZmFjZSA9PQotCQkJCQkJCWludGVyZmFjZSkgewotCQkJaWYgKGlzX2JheWVyX3NlbnNvciAmJiBpbnRlcmZhY2UgPT0gUElYXzApIHsKLQkJCQlpZiAoZ19zZXJ2ZXJfZGV2LgotCQkJCQlpbnRlcmZhY2VfbWFwX3RhYmxlW2ldLm1jdGxfaGFuZGxlICYmCi0JCQkJCSFnX3NlcnZlcl9kZXYuaW50ZXJmYWNlX21hcF90YWJsZVtpXS4KLQkJCQkJCWlzX2JheWVyX3NlbnNvcikgewotCQkJCQkvKiBpbiBzaW11bHRhbmVvdXMgY2FtZXJhIHVzZWNhc2UKLQkJCQkJICogU29DIGRvZXMgbm90IHVzZSBQSVggaW50ZXJmYWNlICovCi0JCQkJCWdfc2VydmVyX2Rldi5pbnRlcmZhY2VfbWFwX3RhYmxlW2ldLgotCQkJCQkJbWN0bF9oYW5kbGUgPSAwOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFpc19iYXllcl9zZW5zb3IgJiYgaW50ZXJmYWNlID09IFBJWF8wKSB7Ci0JCQkJaWYgKGdfc2VydmVyX2Rldi4KLQkJCQkJaW50ZXJmYWNlX21hcF90YWJsZVtpXS5tY3RsX2hhbmRsZSAmJgotCQkJCQlnX3NlcnZlcl9kZXYuaW50ZXJmYWNlX21hcF90YWJsZVtpXS4KLQkJCQkJCWlzX2JheWVyX3NlbnNvcikgewotCQkJCQkvKiBJbiBjYXNlIG9mIHNpbXVsdGFuZW91cyBjYW1lcmEsCi0JCQkJCSAqIHRoZSBZVVYgc2Vuc29yIGNvdWxkIHVzZSBQSVgKLQkJCQkJICogaW50ZXJmYWNlIHRvIG9ubHkgcXVldWUgdGhlIHByZXZpZXcKLQkJCQkJICogb3IgdmlkZW8gYnVmZmVycywgYnV0IGRvZXMgbm90Ci0JCQkJCSAqIGV4cGVjdCBhbnkgbm90aWZpY2F0aW9ucyBkaXJlY3RseS4KLQkJCQkJICogKHByZXZpZXcvdmlkZW8gZGF0YSBpcyB1cGRhdGVkIGZyb20KLQkJCQkJICogcG9zdHByb2Nlc3NpbmcgaW4gc3VjaCBzY2VuYXJpbykuCi0JCQkJCSAqIEluIHN1Y2ggY2FzZSwgdGhlcmUgaXMgbm8gbmVlZCB0bwotCQkJCQkgKiB1cGRhdGUgdGhlIG1jdGxfaGFuZGxlIGluIHRoZSBpbnRmCi0JCQkJCSAqIG1hcCB0YWJsZSwgc2luY2UgdGhlIG5vdGlmaWNhdGlvbgotCQkJCQkgKiB3aWxsIG5vdCBiZSBzZW50IGRpcmVjdGx5LiAqLwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW9sZF9oYW5kbGUgPQotCQkJCWdfc2VydmVyX2Rldi5pbnRlcmZhY2VfbWFwX3RhYmxlW2ldLm1jdGxfaGFuZGxlOwotCQkJaWYgKG9sZF9oYW5kbGUgPT0gMCkgewotCQkJCWdfc2VydmVyX2Rldi5pbnRlcmZhY2VfbWFwX3RhYmxlW2ldLm1jdGxfaGFuZGxlCi0JCQkJCT0gbWN0bF9oYW5kbGU7Ci0JCQkJZ19zZXJ2ZXJfZGV2LmludGVyZmFjZV9tYXBfdGFibGVbaV0uCi0JCQkJCWlzX2JheWVyX3NlbnNvciA9IGlzX2JheWVyX3NlbnNvcjsKLQkJCQlnX3NlcnZlcl9kZXYuaW50ZXJmYWNlX21hcF90YWJsZVtpXS52bm9kZV9pZAotCQkJCQk9IHZub2RlX2lkOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWdfc2VydmVyX2Rldi5pbnRlcmZhY2VfbWFwX3RhYmxlW2ldLgotCQkJCQlpc19iYXllcl9zZW5zb3IgJiYKLQkJCQkJKGV4dGVuZGVkbW9kZSA9PQotCQkJCQlNU01fVjRMMl9FWFRfQ0FQVFVSRV9NT0RFX1BSRVZJRVcgfHwKLQkJCQkJZXh0ZW5kZWRtb2RlID09Ci0JCQkJCU1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfVklERU8gfHwKLQkJCQkJZXh0ZW5kZWRtb2RlID09Ci0JCQkJCU1TTV9WNEwyX0VYVF9DQVBUVVJFX01PREVfTUFJTiB8fAotCQkJCQlleHRlbmRlZG1vZGUgPT0KLQkJCQkJTVNNX1Y0TDJfRVhUX0NBUFRVUkVfTU9ERV9USFVNQk5BSUwpKSB7Ci0JCQkJCUQoIiVzOiBTb0Mgc2Vuc29yLCBpbWFnZV9tb2RlID0gJWQiLAotCQkJCQlfX2Z1bmNfXywgZXh0ZW5kZWRtb2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChvbGRfaGFuZGxlICE9IG1jdGxfaGFuZGxlKSB7Ci0JCQkJCXByX2VycigiJXM6IGlmYWNlX21hcFslZF0gaXMgc2V0OiAlZFxuIiwKLQkJCQkJCV9fZnVuY19fLCBpLCBvbGRfaGFuZGxlKTsKLQkJCQkJcmMgPSAtRUlOVkFMOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGkgPT0gSU5URl9NQVgpCi0JCXJjID0gLUVJTlZBTDsKLQlyZXR1cm4gcmM7Ci19Ci0KLXZvaWQgbXNtX2NhbV9zZXJ2ZXJfY2xlYXJfaW50ZXJmYWNlX21hcCh1aW50MzJfdCBtY3RsX2hhbmRsZSkKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgSU5URl9NQVg7IGkrKykKLQkJaWYgKGdfc2VydmVyX2Rldi5pbnRlcmZhY2VfbWFwX3RhYmxlW2ldLgotCQkJbWN0bF9oYW5kbGUgPT0gbWN0bF9oYW5kbGUpCi0JCQlnX3NlcnZlcl9kZXYuaW50ZXJmYWNlX21hcF90YWJsZVtpXS4KLQkJCQltY3RsX2hhbmRsZSA9IDA7Ci19Ci0KLXN0cnVjdCBpb21tdV9kb21haW4gKm1zbV9jYW1fc2VydmVyX2dldF9kb21haW4oKQotewotCXJldHVybiBnX3NlcnZlcl9kZXYuZG9tYWluOwotfQotCi1pbnQgbXNtX2NhbV9zZXJ2ZXJfZ2V0X2RvbWFpbl9udW0oKQotewotCXJldHVybiBnX3NlcnZlcl9kZXYuZG9tYWluX251bTsKLX0KLQotdWludDMyX3QgbXNtX2NhbV9zZXJ2ZXJfZ2V0X21jdGxfaGFuZGxlKHZvaWQpCi17Ci0JdWludDMyX3QgaTsKLQlpZiAoKGdfc2VydmVyX2Rldi5tY3RsX2hhbmRsZV9jbnQgPDwgOCkgPT0gMCkKLQkJZ19zZXJ2ZXJfZGV2Lm1jdGxfaGFuZGxlX2NudCsrOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX0FDVElWRV9DQU1FUkE7IGkrKykgewotCQlpZiAoZ19zZXJ2ZXJfZGV2Lm1jdGxbaV0uaGFuZGxlID09IDApIHsKLQkJCWdfc2VydmVyX2Rldi5tY3RsW2ldLmhhbmRsZSA9Ci0JCQkJKCsrZ19zZXJ2ZXJfZGV2Lm1jdGxfaGFuZGxlX2NudCkgPDwgOCB8IGk7Ci0JCQltZW1zZXQoJmdfc2VydmVyX2Rldi5tY3RsW2ldLm1jdGwsCi0JCQkJMCwgc2l6ZW9mKGdfc2VydmVyX2Rldi5tY3RsW2ldLm1jdGwpKTsKLQkJCXJldHVybiBnX3NlcnZlcl9kZXYubWN0bFtpXS5oYW5kbGU7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgbXNtX2NhbV9zZXJ2ZXJfZnJlZV9tY3RsKHVpbnQzMl90IGhhbmRsZSkKLXsKLQl1aW50MzJfdCBtY3RsX2luZGV4OwotCW1jdGxfaW5kZXggPSBoYW5kbGUgJiAweGZmOwotCWlmICgobWN0bF9pbmRleCA8IE1BWF9OVU1fQUNUSVZFX0NBTUVSQSkgJiYKLQkJKGdfc2VydmVyX2Rldi5tY3RsW21jdGxfaW5kZXhdLmhhbmRsZSA9PSBoYW5kbGUpKQotCQlnX3NlcnZlcl9kZXYubWN0bFttY3RsX2luZGV4XS5oYW5kbGUgPSAwOwotCWVsc2UKLQkJcHJfZXJyKCIlczogaW52YWxpZCBmcmVlIGhhbmRsZVxuIiwgX19mdW5jX18pOwotfQotCi1zdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICptc21fY2FtX3NlcnZlcl9nZXRfbWN0bCh1aW50MzJfdCBoYW5kbGUpCi17Ci0JdWludDMyX3QgbWN0bF9pbmRleDsKLQltY3RsX2luZGV4ID0gaGFuZGxlICYgMHhmZjsKLQlpZiAoKG1jdGxfaW5kZXggPCBNQVhfTlVNX0FDVElWRV9DQU1FUkEpICYmCi0JCShnX3NlcnZlcl9kZXYubWN0bFttY3RsX2luZGV4XS5oYW5kbGUgPT0gaGFuZGxlKSkKLQkJcmV0dXJuICZnX3NlcnZlcl9kZXYubWN0bFttY3RsX2luZGV4XS5tY3RsOwotCXJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyB2b2lkIG1zbV9jYW1fc2VydmVyX3NlbmRfZXJyb3JfZXZ0KAotCQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwgaW50IGV2dF90eXBlKQotewotCXN0cnVjdCB2NGwyX2V2ZW50IHY0bDJfZXY7Ci0JdjRsMl9ldi5pZCA9IDA7Ci0JdjRsMl9ldi50eXBlID0gZXZ0X3R5cGU7Ci0Ja3RpbWVfZ2V0X3RzKCZ2NGwyX2V2LnRpbWVzdGFtcCk7Ci0JdjRsMl9ldmVudF9xdWV1ZShwbWN0bC0+cGNhbV9wdHItPnB2ZGV2LCAmdjRsMl9ldik7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2N0cmxfY21kX2RvbmUodm9pZCAqYXJnKQotewotCXZvaWQgX191c2VyICp1cHRyOwotCXN0cnVjdCBtc21fcXVldWVfY21kICpxY21kOwotCXN0cnVjdCBtc21fY2FtZXJhX3Y0bDJfaW9jdGxfdCAqaW9jdGxfcHRyID0gYXJnOwotCXN0cnVjdCBtc21fY3RybF9jbWQgKmNvbW1hbmQ7Ci0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQotCWNvbW1hbmQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2N0cmxfY21kKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjb21tYW5kKSB7Ci0JCXByX2VycigiJXMgSW5zdWZmaWNpZW50IG1lbW9yeS4gcmV0dXJuIiwgX19mdW5jX18pOwotCQlnb3RvIGNvbW1hbmRfYWxsb2NfZmFpbDsKLQl9Ci0KLQlxY21kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9xdWV1ZV9jbWQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXFjbWQpIHsKLQkJcHJfZXJyKCIlcyBJbnN1ZmZpY2llbnQgbWVtb3J5LiByZXR1cm4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gcWNtZF9hbGxvY19mYWlsOwotCX0KLQotCW11dGV4X2xvY2soJmdfc2VydmVyX2Rldi5zZXJ2ZXJfcXVldWVfbG9jayk7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoY29tbWFuZCwgKHZvaWQgX191c2VyICopaW9jdGxfcHRyLT5pb2N0bF9wdHIsCi0JCQkJCSAgIHNpemVvZihzdHJ1Y3QgbXNtX2N0cmxfY21kKSkpIHsKLQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkLCBzaXplPSVkXG4iLAotCQkJX19mdW5jX18sIHNpemVvZihzdHJ1Y3QgbXNtX2N0cmxfY21kKSk7Ci0JCWdvdG8gY3RybF9jbWRfZG9uZV9lcnJvcjsKLQl9Ci0KLQlpZiAoIWdfc2VydmVyX2Rldi5zZXJ2ZXJfcXVldWVbY29tbWFuZC0+cXVldWVfaWR4XS5xdWV1ZV9hY3RpdmUpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBxdWV1ZVxuIiwgX19mdW5jX18pOwotCQlnb3RvIGN0cmxfY21kX2RvbmVfZXJyb3I7Ci0JfQotCi0JRCgiJXMgcWlkICVkIGV2dGlkICVkICVkXG4iLCBfX2Z1bmNfXywgY29tbWFuZC0+cXVldWVfaWR4LAotCQljb21tYW5kLT5ldnRfaWQsCi0JCWdfc2VydmVyX2Rldi5zZXJ2ZXJfcXVldWVbY29tbWFuZC0+cXVldWVfaWR4XS5ldnRfaWQpOwotCi0JaWYgKGNvbW1hbmQtPmV2dF9pZCAhPQotCQlnX3NlcnZlcl9kZXYuc2VydmVyX3F1ZXVlW2NvbW1hbmQtPnF1ZXVlX2lkeF0uZXZ0X2lkKSB7Ci0JCXByX2VycigiSW52YWxpZCBldmVudCBpZCBmcm9tIHVzZXJzcGFjZVxuIik7Ci0JCWdvdG8gY3RybF9jbWRfZG9uZV9lcnJvcjsKLQl9Ci0KLQlhdG9taWNfc2V0KCZxY21kLT5vbl9oZWFwLCAxKTsKLQl1cHRyID0gY29tbWFuZC0+dmFsdWU7Ci0JcWNtZC0+Y29tbWFuZCA9IGNvbW1hbmQ7Ci0KLQlpZiAoY29tbWFuZC0+bGVuZ3RoID4gMCkgewotCQljb21tYW5kLT52YWx1ZSA9Ci0JCQlnX3NlcnZlcl9kZXYuc2VydmVyX3F1ZXVlW2NvbW1hbmQtPnF1ZXVlX2lkeF0uY3RybF9kYXRhOwotCQlpZiAoY29tbWFuZC0+bGVuZ3RoID4gTUFYX1NFUlZFUl9QQVlMT0FEX0xFTkdUSCkgewotCQkJcHJfZXJyKCIlczogdXNlciBkYXRhICVkIGlzIHRvbyBiaWcgKG1heCAlZClcbiIsCi0JCQkJX19mdW5jX18sIGNvbW1hbmQtPmxlbmd0aCwKLQkJCQltYXhfY29udHJvbF9jb21tYW5kX3NpemUpOwotCQkJZ290byBjdHJsX2NtZF9kb25lX2Vycm9yOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjb21tYW5kLT52YWx1ZSwgdXB0ciwgY29tbWFuZC0+bGVuZ3RoKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkLCBzaXplPSVkXG4iLAotCQkJCV9fZnVuY19fLCBzaXplb2Yoc3RydWN0IG1zbV9jdHJsX2NtZCkpOwotCQkJZ290byBjdHJsX2NtZF9kb25lX2Vycm9yOwotCQl9Ci0JfQotCW1zbV9lbnF1ZXVlKCZnX3NlcnZlcl9kZXYuc2VydmVyX3F1ZXVlCi0JCVtjb21tYW5kLT5xdWV1ZV9pZHhdLmN0cmxfcSwgJnFjbWQtPmxpc3RfY29udHJvbCk7Ci0JbXV0ZXhfdW5sb2NrKCZnX3NlcnZlcl9kZXYuc2VydmVyX3F1ZXVlX2xvY2spOwotCXJldHVybiAwOwotCi1jdHJsX2NtZF9kb25lX2Vycm9yOgotCW11dGV4X3VubG9jaygmZ19zZXJ2ZXJfZGV2LnNlcnZlcl9xdWV1ZV9sb2NrKTsKLQlmcmVlX3FjbWQocWNtZCk7Ci1xY21kX2FsbG9jX2ZhaWw6Ci0Ja2ZyZWUoY29tbWFuZCk7Ci1jb21tYW5kX2FsbG9jX2ZhaWw6Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qIHNlbmQgY29udHJvbCBjb21tYW5kIHRvIGNvbmZpZyBhbmQgd2FpdCBmb3IgcmVzdWx0cyovCi1zdGF0aWMgaW50IG1zbV9zZXJ2ZXJfY29udHJvbChzdHJ1Y3QgbXNtX2NhbV9zZXJ2ZXJfZGV2ICpzZXJ2ZXJfZGV2LAotCQkJCXVpbnQzMl90IGlkLCBzdHJ1Y3QgbXNtX2N0cmxfY21kICpvdXQpCi17Ci0JaW50IHJjID0gMDsKLQl1aW50OF90IHdhaXRfY291bnQ7Ci0Jdm9pZCAqdmFsdWU7Ci0Jc3RydWN0IG1zbV9xdWV1ZV9jbWQgKnJjbWQ7Ci0Jc3RydWN0IG1zbV9xdWV1ZV9jbWQgKmV2ZW50X3FjbWQ7Ci0Jc3RydWN0IG1zbV9jdHJsX2NtZCAqY3RybGNtZDsKLQlzdHJ1Y3QgbXNtX2RldmljZV9xdWV1ZSAqcXVldWUgPQotCQkmc2VydmVyX2Rldi0+c2VydmVyX3F1ZXVlW291dC0+cXVldWVfaWR4XS5jdHJsX3E7Ci0KLQlzdHJ1Y3QgdjRsMl9ldmVudCB2NGwyX2V2dDsKLQlzdHJ1Y3QgbXNtX2lzcF9ldmVudF9jdHJsICppc3BfZXZlbnQ7Ci0Jdm9pZCAqY3RybGNtZF9kYXRhOwotCi0JZXZlbnRfcWNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fcXVldWVfY21kKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFldmVudF9xY21kKSB7Ci0JCXByX2VycigiJXMgSW5zdWZmaWNpZW50IG1lbW9yeS4gcmV0dXJuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXZlbnRfcWNtZF9hbGxvY19mYWlsOwotCX0KLQotCWlzcF9ldmVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21faXNwX2V2ZW50X2N0cmwpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlzcF9ldmVudCkgewotCQlwcl9lcnIoIiVzIEluc3VmZmljaWVudCBtZW1vcnkuIHJldHVybiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGlzcF9ldmVudF9hbGxvY19mYWlsOwotCX0KLQotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JbXV0ZXhfbG9jaygmc2VydmVyX2Rldi0+c2VydmVyX3F1ZXVlX2xvY2spOwotCWlmICgrK3NlcnZlcl9kZXYtPnNlcnZlcl9ldnRfaWQgPT0gMCkKLQkJc2VydmVyX2Rldi0+c2VydmVyX2V2dF9pZCsrOwotCi0JRCgiJXMgcWlkICVkIGV2dGlkICVkXG4iLCBfX2Z1bmNfXywgb3V0LT5xdWV1ZV9pZHgsCi0JCXNlcnZlcl9kZXYtPnNlcnZlcl9ldnRfaWQpOwotCXNlcnZlcl9kZXYtPnNlcnZlcl9xdWV1ZVtvdXQtPnF1ZXVlX2lkeF0uZXZ0X2lkID0KLQkJc2VydmVyX2Rldi0+c2VydmVyX2V2dF9pZDsKLQl2NGwyX2V2dC50eXBlID0gVjRMMl9FVkVOVF9QUklWQVRFX1NUQVJUICsgTVNNX0NBTV9SRVNQX1Y0TDI7Ci0JdjRsMl9ldnQuaWQgPSBpZDsKLQl2NGwyX2V2dC51LmRhdGFbMF0gPSBvdXQtPnF1ZXVlX2lkeDsKLQkvKiBzZXR1cCBldmVudCBvYmplY3QgdG8gdHJhbnNmZXIgdGhlIGNvbW1hbmQ7ICovCi0JaXNwX2V2ZW50LT5yZXNwdHlwZSA9IE1TTV9DQU1fUkVTUF9WNEwyOwotCWlzcF9ldmVudC0+aXNwX2RhdGEuY3RybCA9ICpvdXQ7Ci0JaXNwX2V2ZW50LT5pc3BfZGF0YS5jdHJsLmV2dF9pZCA9IHNlcnZlcl9kZXYtPnNlcnZlcl9ldnRfaWQ7Ci0KLQlpZiAob3V0LT52YWx1ZSAhPSBOVUxMICYmIG91dC0+bGVuZ3RoICE9IDApIHsKLQkJY3RybGNtZF9kYXRhID0ga3phbGxvYyhvdXQtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY3RybGNtZF9kYXRhKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGN0cmxjbWRfYWxsb2NfZmFpbDsKLQkJfQotCQltZW1jcHkoY3RybGNtZF9kYXRhLCBvdXQtPnZhbHVlLCBvdXQtPmxlbmd0aCk7Ci0JCWlzcF9ldmVudC0+aXNwX2RhdGEuY3RybC52YWx1ZSA9IGN0cmxjbWRfZGF0YTsKLQl9Ci0KLQlhdG9taWNfc2V0KCZldmVudF9xY21kLT5vbl9oZWFwLCAxKTsKLQlldmVudF9xY21kLT5jb21tYW5kID0gaXNwX2V2ZW50OwotCi0JbXNtX2VucXVldWUoJnNlcnZlcl9kZXYtPnNlcnZlcl9xdWV1ZVtvdXQtPnF1ZXVlX2lkeF0uZXZlbnREYXRhX3EsCi0JCQkJJmV2ZW50X3FjbWQtPmxpc3RfZXZlbnRkYXRhKTsKLQotCS8qIG5vdyBzZW5kIGNvbW1hbmQgdG8gY29uZmlnIHRocmVhZCBpbiB1c2Vyc3BhY2UsCi0JICogYW5kIHdhaXQgZm9yIHJlc3VsdHMgKi8KLQl2NGwyX2V2ZW50X3F1ZXVlKHNlcnZlcl9kZXYtPnNlcnZlcl9jb21tYW5kX3F1ZXVlLnB2ZGV2LAotCQkJCQkgICZ2NGwyX2V2dCk7Ci0JRCgiJXMgdjRsMl9ldmVudF9xdWV1ZTogdHlwZSA9IDB4JXhcbiIsIF9fZnVuY19fLCB2NGwyX2V2dC50eXBlKTsKLQltdXRleF91bmxvY2soJnNlcnZlcl9kZXYtPnNlcnZlcl9xdWV1ZV9sb2NrKTsKLQotCS8qIHdhaXQgZm9yIGNvbmZpZyByZXR1cm4gc3RhdHVzICovCi0JRCgiV2FpdGluZyBmb3IgY29uZmlnIHN0YXR1c1xuIik7Ci0JLyogd2FpdCBldmVudCBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgc3VnbmFsLAotCSAqIGluIHRoaXMgY2FzZSAtRVJFU1RBUlRTWVMgaXMgcmV0dXJuZWQgYW5kIHJldHJ5IGlzIG5lZWRlZC4KLQkgKiBOb3cgd2Ugb25seSByZXRyeSBvbmNlLiAqLwotCXdhaXRfY291bnQgPSAyOwotCWRvIHsKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChxdWV1ZS0+d2FpdCwKLQkJCSFsaXN0X2VtcHR5X2NhcmVmdWwoJnF1ZXVlLT5saXN0KSwKLQkJCW1zZWNzX3RvX2ppZmZpZXMob3V0LT50aW1lb3V0X21zKSk7Ci0JCXdhaXRfY291bnQtLTsKLQkJaWYgKHJjICE9IC1FUkVTVEFSVFNZUykKLQkJCWJyZWFrOwotCQlEKCIlczogd2FpdF9ldmVudCBpbnRlcnJ1cHRlZCBieSBzaWduYWwsIHJlbWFpbl9jb3VudCA9ICVkIiwKLQkJCV9fZnVuY19fLCB3YWl0X2NvdW50KTsKLQl9IHdoaWxlICh3YWl0X2NvdW50ID4gMCk7Ci0JRCgiV2FpdGluZyBpcyBvdmVyIGZvciBjb25maWcgc3RhdHVzXG4iKTsKLQlpZiAobGlzdF9lbXB0eV9jYXJlZnVsKCZxdWV1ZS0+bGlzdCkpIHsKLQkJaWYgKCFyYykKLQkJCXJjID0gLUVUSU1FRE9VVDsKLQkJaWYgKHJjIDwgMCkgewotCQkJaWYgKCsrc2VydmVyX2Rldi0+c2VydmVyX2V2dF9pZCA9PSAwKQotCQkJCXNlcnZlcl9kZXYtPnNlcnZlcl9ldnRfaWQrKzsKLQkJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0KLQlyY21kID0gbXNtX2RlcXVldWUocXVldWUsIGxpc3RfY29udHJvbCk7Ci0JQlVHX09OKCFyY21kKTsKLQlEKCIlcyBGaW5pc2hlZCBzZXJ2aWNpbmcgaW9jdGxcbiIsIF9fZnVuY19fKTsKLQotCWN0cmxjbWQgPSAoc3RydWN0IG1zbV9jdHJsX2NtZCAqKShyY21kLT5jb21tYW5kKTsKLQl2YWx1ZSA9IG91dC0+dmFsdWU7Ci0JaWYgKGN0cmxjbWQtPmxlbmd0aCA+IDAgJiYgdmFsdWUgIT0gTlVMTCAmJgotCQljdHJsY21kLT5sZW5ndGggPD0gb3V0LT5sZW5ndGgpCi0JCW1lbWNweSh2YWx1ZSwgY3RybGNtZC0+dmFsdWUsIGN0cmxjbWQtPmxlbmd0aCk7Ci0KLQltZW1jcHkob3V0LCBjdHJsY21kLCBzaXplb2Yoc3RydWN0IG1zbV9jdHJsX2NtZCkpOwotCW91dC0+dmFsdWUgPSB2YWx1ZTsKLQotCWtmcmVlKGN0cmxjbWQpOwotCWZyZWVfcWNtZChyY21kKTsKLQlEKCIlczogcmMgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JLyogcmMgaXMgdGhlIHRpbWUgZWxhcHNlZC4KLQkgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZGFlbW9uIGl0c2VsZiB3YXMKLQkgKiBzdWNjZXNzZnVsKGlycmVzcGVjdGl2ZSBvZiB0aGUgaGFuZGxpbmcgb2YgdGhlIGN0cmxjbWQpLgotCSAqIFNvLCBqdXN0IHJlc2V0IHRoZSByYyB0byAwIHRvIGluZGljYXRlIHN1Y2Nlc3MuCi0JICogSXRzIHVwdG8gdGhlIGNhbGxlciB0byBwYXJzZSB0aGUgY3RybGNtZCB0byBjaGVjayB0aGUgc3RhdHVzLiBXZQotCSAqIGRvbnQgbmVlZCB0byBwYXJzZSBpdCBoZXJlLiAqLwotCWlmIChyYyA+PSAwKQotCQlyYyA9IDA7Ci0KLQlyZXR1cm4gcmM7Ci0KLWN0cmxjbWRfYWxsb2NfZmFpbDoKLQlrZnJlZShpc3BfZXZlbnQpOwotaXNwX2V2ZW50X2FsbG9jX2ZhaWw6Ci0Ja2ZyZWUoZXZlbnRfcWNtZCk7Ci1ldmVudF9xY21kX2FsbG9jX2ZhaWw6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX3NlcnZlcl9wcml2YXRlX2dlbmVyYWwoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0sCi0JCXN0cnVjdCBtc21fY2FtZXJhX3Y0bDJfaW9jdGxfdCAqaW9jdGxfcHRyKQotewotCXN0cnVjdCBtc21fY3RybF9jbWQgY3RybGNtZDsKLQl2b2lkICp0ZW1wX2RhdGEgPSBOVUxMOwotCWludCByYzsKLQlpZiAoaW9jdGxfcHRyLT5sZW4gPiAwKSB7Ci0JCXRlbXBfZGF0YSA9IGt6YWxsb2MoaW9jdGxfcHRyLT5sZW4sIEdGUF9LRVJORUwpOwotCQlpZiAoIXRlbXBfZGF0YSkgewotCQkJcHJfZXJyKCIlcyBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGVuZDsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKil0ZW1wX2RhdGEsCi0JCQkodm9pZCBfX3VzZXIgKilpb2N0bF9wdHItPmlvY3RsX3B0ciwKLQkJCWlvY3RsX3B0ci0+bGVuKSkgewotCQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNvcHlfZnJvbV91c2VyX2ZhaWxlZDsKLQkJfQotCX0KLQotCW11dGV4X2xvY2soJnBjYW0tPnZpZF9sb2NrKTsKLQljdHJsY21kLnR5cGUgPSBNU01fVjRMMl9QUklWQVRFX0NNRDsKLQljdHJsY21kLmxlbmd0aCA9IGlvY3RsX3B0ci0+bGVuOwotCWN0cmxjbWQudmFsdWUgPSB0ZW1wX2RhdGE7Ci0JY3RybGNtZC50aW1lb3V0X21zID0gMTAwMDsKLQljdHJsY21kLnN0YXR1cyA9IGlvY3RsX3B0ci0+aWQ7Ci0JY3RybGNtZC52bm9kZV9pZCA9IHBjYW0tPnZub2RlX2lkOwotCWN0cmxjbWQucXVldWVfaWR4ID0gcGNhbS0+c2VydmVyX3F1ZXVlX2lkeDsKLQljdHJsY21kLmNvbmZpZ19pZGVudCA9IGdfc2VydmVyX2Rldi5jb25maWdfaW5mby5jb25maWdfZGV2X2lkWzBdOwotCS8qIHNlbmQgY29tbWFuZCB0byBjb25maWcgdGhyZWFkIGluIHVzZXJzc3BhY2UsIGFuZCBnZXQgcmV0dXJuIHZhbHVlICovCi0JcmMgPSBtc21fc2VydmVyX2NvbnRyb2woJmdfc2VydmVyX2RldiwgMCwgJmN0cmxjbWQpOwotCWlmIChyYyA8IDApCi0JCXByX2VycigiJXM6IHNlbmQgZXZlbnQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JZWxzZSB7Ci0JCWlmIChpb2N0bF9wdHItPmxlbiA+IDApIHsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopaW9jdGxfcHRyLT5pb2N0bF9wdHIsCi0JCQkJKHZvaWQgKil0ZW1wX2RhdGEsCi0JCQkJaW9jdGxfcHRyLT5sZW4pKSB7Ci0JCQkJRVJSX0NPUFlfVE9fVVNFUigpOwotCQkJCXJjID0gLUVGQVVMVDsKLQkJCX0KLQkJfQotCX0KLQltdXRleF91bmxvY2soJnBjYW0tPnZpZF9sb2NrKTsKLQotCWtmcmVlKHRlbXBfZGF0YSk7Ci0JcmV0dXJuIHJjOwotY29weV9mcm9tX3VzZXJfZmFpbGVkOgotCWtmcmVlKHRlbXBfZGF0YSk7Ci1lbmQ6Ci1yZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fc2VydmVyX2dldF9jcm9wKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtLAotCQkJCWludCBpZHgsIHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2N0cmxfY21kIGN0cmxjbWQ7Ci0KLQlCVUdfT04oY3JvcCA9PSBOVUxMKTsKLQotCWN0cmxjbWQudHlwZSA9IE1TTV9WNEwyX0dFVF9DUk9QOwotCWN0cmxjbWQubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCB2NGwyX2Nyb3ApOwotCWN0cmxjbWQudmFsdWUgPSAodm9pZCAqKWNyb3A7Ci0JY3RybGNtZC50aW1lb3V0X21zID0gMTAwMDsKLQljdHJsY21kLnZub2RlX2lkID0gcGNhbS0+dm5vZGVfaWQ7Ci0JY3RybGNtZC5xdWV1ZV9pZHggPSBwY2FtLT5zZXJ2ZXJfcXVldWVfaWR4OwotCWN0cmxjbWQuc3RyZWFtX3R5cGUgPSBwY2FtLT5kZXZfaW5zdFtpZHhdLT5pbWFnZV9tb2RlOwotCWN0cmxjbWQuY29uZmlnX2lkZW50ID0gZ19zZXJ2ZXJfZGV2LmNvbmZpZ19pbmZvLmNvbmZpZ19kZXZfaWRbCi0JCQkJCQlwY2FtLT5zZXJ2ZXJfcXVldWVfaWR4XTsKLQotCS8qIHNlbmQgY29tbWFuZCB0byBjb25maWcgdGhyZWFkIGluIHVzZXJzcGFjZSwgYW5kIGdldCByZXR1cm4gdmFsdWUgKi8KLQlyYyA9IG1zbV9zZXJ2ZXJfY29udHJvbCgmZ19zZXJ2ZXJfZGV2LCAwLCAmY3RybGNtZCk7Ci0JRCgiJXM6IHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qc2VuZCBvcGVuIGNvbW1hbmQgdG8gc2VydmVyKi8KLWludCBtc21fc2VuZF9vcGVuX3NlcnZlcihzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY3RybF9jbWQgY3RybGNtZDsKLQlpbnQgaWR4ID0gcGNhbS0+c2VydmVyX3F1ZXVlX2lkeDsKLQlEKCIlcyBxaWQgJWRcbiIsIF9fZnVuY19fLCBwY2FtLT5zZXJ2ZXJfcXVldWVfaWR4KTsKLQljdHJsY21kLnR5cGUJICAgPSBNU01fVjRMMl9PUEVOOwotCWN0cmxjbWQudGltZW91dF9tcyA9IDEwMDAwOwotCWN0cmxjbWQubGVuZ3RoID0gc3RybmxlbigKLQkJZ19zZXJ2ZXJfZGV2LmNvbmZpZ19pbmZvLmNvbmZpZ19kZXZfbmFtZVtpZHhdLAotCQlNQVhfREVWX05BTUVfTEVOKSsxOwotCWN0cmxjbWQudmFsdWUgPSAoY2hhciAqKWdfc2VydmVyX2Rldi5jb25maWdfaW5mby5jb25maWdfZGV2X25hbWVbaWR4XTsKLQljdHJsY21kLnZub2RlX2lkID0gcGNhbS0+dm5vZGVfaWQ7Ci0JY3RybGNtZC5xdWV1ZV9pZHggPSBwY2FtLT5zZXJ2ZXJfcXVldWVfaWR4OwotCWN0cmxjbWQuY29uZmlnX2lkZW50ID0gZ19zZXJ2ZXJfZGV2LmNvbmZpZ19pbmZvLmNvbmZpZ19kZXZfaWRbaWR4XTsKLQotCS8qIHNlbmQgY29tbWFuZCB0byBjb25maWcgdGhyZWFkIGluIHVzZXJzc3BhY2UsIGFuZCBnZXQgcmV0dXJuIHZhbHVlICovCi0JcmMgPSBtc21fc2VydmVyX2NvbnRyb2woJmdfc2VydmVyX2RldiwgMCwgJmN0cmxjbWQpOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX3NlbmRfY2xvc2Vfc2VydmVyKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jdHJsX2NtZCBjdHJsY21kOwotCUQoIiVzIHFpZCAlZFxuIiwgX19mdW5jX18sIHBjYW0tPnNlcnZlcl9xdWV1ZV9pZHgpOwotCWN0cmxjbWQudHlwZQkgICA9IE1TTV9WNEwyX0NMT1NFOwotCWN0cmxjbWQudGltZW91dF9tcyA9IDEwMDAwOwotCWN0cmxjbWQubGVuZ3RoCSA9IHN0cm5sZW4oZ19zZXJ2ZXJfZGV2LmNvbmZpZ19pbmZvLmNvbmZpZ19kZXZfbmFtZVsKLQkJCQlwY2FtLT5zZXJ2ZXJfcXVldWVfaWR4XSwgTUFYX0RFVl9OQU1FX0xFTikrMTsKLQljdHJsY21kLnZhbHVlICAgID0gKGNoYXIgKilnX3NlcnZlcl9kZXYuY29uZmlnX2luZm8uY29uZmlnX2Rldl9uYW1lWwotCQkJCXBjYW0tPnNlcnZlcl9xdWV1ZV9pZHhdOwotCWN0cmxjbWQudm5vZGVfaWQgPSBwY2FtLT52bm9kZV9pZDsKLQljdHJsY21kLnF1ZXVlX2lkeCA9IHBjYW0tPnNlcnZlcl9xdWV1ZV9pZHg7Ci0JY3RybGNtZC5jb25maWdfaWRlbnQgPSBnX3NlcnZlcl9kZXYuY29uZmlnX2luZm8uY29uZmlnX2Rldl9pZFsKLQkJCQkJCXBjYW0tPnNlcnZlcl9xdWV1ZV9pZHhdOwotCi0JLyogc2VuZCBjb21tYW5kIHRvIGNvbmZpZyB0aHJlYWQgaW4gdXNlcnNzcGFjZSwgYW5kIGdldCByZXR1cm4gdmFsdWUgKi8KLQlyYyA9IG1zbV9zZXJ2ZXJfY29udHJvbCgmZ19zZXJ2ZXJfZGV2LCAwLCAmY3RybGNtZCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fc2VydmVyX3NldF9mbXQoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0sIGludCBpZHgsCi0JCQkJIHN0cnVjdCB2NGwyX2Zvcm1hdCAqcGZtdCkKLXsKLQlpbnQgcmMgPSAwOwotCWludCBpID0gMDsKLQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmcGZtdC0+Zm10LnBpeDsKLQlzdHJ1Y3QgbXNtX2N0cmxfY21kIGN0cmxjbWQ7Ci0Jc3RydWN0IGltZ19wbGFuZV9pbmZvIHBsYW5lX2luZm87Ci0KLQlwbGFuZV9pbmZvLndpZHRoID0gcGl4LT53aWR0aDsKLQlwbGFuZV9pbmZvLmhlaWdodCA9IHBpeC0+aGVpZ2h0OwotCXBsYW5lX2luZm8ucGl4ZWxmb3JtYXQgPSBwaXgtPnBpeGVsZm9ybWF0OwotCXBsYW5lX2luZm8uYnVmZmVyX3R5cGUgPSBwZm10LT50eXBlOwotCXBsYW5lX2luZm8uZXh0X21vZGUgPSBwY2FtLT5kZXZfaW5zdFtpZHhdLT5pbWFnZV9tb2RlOwotCXBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDE7Ci0JcGxhbmVfaW5mby5pbnN0X2hhbmRsZSA9IHBjYW0tPmRldl9pbnN0W2lkeF0tPmluc3RfaGFuZGxlOwotCUQoIiVzOiAlZCwgJWQsIDB4JXhcbiIsIF9fZnVuY19fLAotCQlwZm10LT5mbXQucGl4LndpZHRoLCBwZm10LT5mbXQucGl4LmhlaWdodCwKLQkJcGZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCk7Ci0KLQlpZiAocGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCUQoIiVzLCBBdHRlbnRpb24hIFdyb25nIGJ1Zi10eXBlICVkXG4iLCBfX2Z1bmNfXywgcGZtdC0+dHlwZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGNhbS0+bnVtX2ZtdHM7IGkrKykKLQkJaWYgKHBjYW0tPnVzcl9mbXRzW2ldLmZvdXJjYyA9PSBwaXgtPnBpeGVsZm9ybWF0KQotCQkJYnJlYWs7Ci0JaWYgKGkgPT0gcGNhbS0+bnVtX2ZtdHMpIHsKLQkJcHJfZXJyKCIlczogVXNlciByZXF1ZXN0ZWQgcGl4ZWxmb3JtYXQgJXggbm90IHN1cHBvcnRlZFxuIiwKLQkJCQkJCV9fZnVuY19fLCBwaXgtPnBpeGVsZm9ybWF0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY3RybGNtZC50eXBlICAgICAgID0gTVNNX1Y0TDJfVklEX0NBUF9UWVBFOwotCWN0cmxjbWQubGVuZ3RoICAgICA9IHNpemVvZihzdHJ1Y3QgaW1nX3BsYW5lX2luZm8pOwotCWN0cmxjbWQudmFsdWUgICAgICA9ICh2b2lkICopJnBsYW5lX2luZm87Ci0JY3RybGNtZC50aW1lb3V0X21zID0gMTAwMDA7Ci0JY3RybGNtZC52bm9kZV9pZCAgID0gcGNhbS0+dm5vZGVfaWQ7Ci0JY3RybGNtZC5xdWV1ZV9pZHggPSBwY2FtLT5zZXJ2ZXJfcXVldWVfaWR4OwotCWN0cmxjbWQuY29uZmlnX2lkZW50ID0gZ19zZXJ2ZXJfZGV2LmNvbmZpZ19pbmZvLmNvbmZpZ19kZXZfaWRbMF07Ci0KLQkvKiBzZW5kIGNvbW1hbmQgdG8gY29uZmlnIHRocmVhZCBpbiB1c2Vyc3NwYWNlLCBhbmQgZ2V0IHJldHVybiB2YWx1ZSAqLwotCXJjID0gbXNtX3NlcnZlcl9jb250cm9sKCZnX3NlcnZlcl9kZXYsIDAsICZjdHJsY21kKTsKLQotCWlmIChyYyA+PSAwKSB7Ci0JCXBjYW0tPmRldl9pbnN0W2lkeF0tPnZpZF9mbXQgPSAqcGZtdDsKLQkJcGNhbS0+ZGV2X2luc3RbaWR4XS0+c2Vuc29yX3B4bGNvZGUKLQkJCQkJPSBwY2FtLT51c3JfZm10c1tpXS5weGxjb2RlOwotCQlEKCIlczppbnN0PTB4JXgsaWR4PSVkLHdpZHRoPSVkLGhlaWd0aD0lZFxuIiwKLQkJCSBfX2Z1bmNfXywgKHUzMilwY2FtLT5kZXZfaW5zdFtpZHhdLCBpZHgsCi0JCQkgcGNhbS0+ZGV2X2luc3RbaWR4XS0+dmlkX2ZtdC5mbXQucGl4LndpZHRoLAotCQkJIHBjYW0tPmRldl9pbnN0W2lkeF0tPnZpZF9mbXQuZm10LnBpeC5oZWlnaHQpOwotCQlwY2FtLT5kZXZfaW5zdFtpZHhdLT5wbGFuZV9pbmZvID0gcGxhbmVfaW5mbzsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fc2VydmVyX3NldF9mbXRfbXBsYW5lKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtLCBpbnQgaWR4LAotCQkJCSBzdHJ1Y3QgdjRsMl9mb3JtYXQgKnBmbXQpCi17Ci0JaW50IHJjID0gMDsKLQlpbnQgaSA9IDA7Ci0Jc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeF9tcCA9ICZwZm10LT5mbXQucGl4X21wOwotCXN0cnVjdCBtc21fY3RybF9jbWQgY3RybGNtZDsKLQlzdHJ1Y3QgaW1nX3BsYW5lX2luZm8gcGxhbmVfaW5mbzsKLQotCXBsYW5lX2luZm8ud2lkdGggPSBwaXhfbXAtPndpZHRoOwotCXBsYW5lX2luZm8uaGVpZ2h0ID0gcGl4X21wLT5oZWlnaHQ7Ci0JcGxhbmVfaW5mby5waXhlbGZvcm1hdCA9IHBpeF9tcC0+cGl4ZWxmb3JtYXQ7Ci0JcGxhbmVfaW5mby5idWZmZXJfdHlwZSA9IHBmbXQtPnR5cGU7Ci0JcGxhbmVfaW5mby5leHRfbW9kZSA9IHBjYW0tPmRldl9pbnN0W2lkeF0tPmltYWdlX21vZGU7Ci0JcGxhbmVfaW5mby5udW1fcGxhbmVzID0gcGl4X21wLT5udW1fcGxhbmVzOwotCXBsYW5lX2luZm8uaW5zdF9oYW5kbGUgPSBwY2FtLT5kZXZfaW5zdFtpZHhdLT5pbnN0X2hhbmRsZTsKLQotCWlmIChwbGFuZV9pbmZvLm51bV9wbGFuZXMgPD0gMCB8fAotCQlwbGFuZV9pbmZvLm51bV9wbGFuZXMgPiBWSURFT19NQVhfUExBTkVTKSB7Ci0JCXByX2VycigiJXMgSW52YWxpZCBudW1iZXIgb2YgcGxhbmVzIHNldCAlZCIsIF9fZnVuY19fLAotCQkJCXBsYW5lX2luZm8ubnVtX3BsYW5lcyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlEKCIlczogJWQsICVkLCAweCV4XG4iLCBfX2Z1bmNfXywKLQkJcGZtdC0+Zm10LnBpeF9tcC53aWR0aCwgcGZtdC0+Zm10LnBpeF9tcC5oZWlnaHQsCi0JCXBmbXQtPmZtdC5waXhfbXAucGl4ZWxmb3JtYXQpOwotCi0JaWYgKHBmbXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgewotCQlwcl9lcnIoIiVzLCBBdHRlbnRpb24hIFdyb25nIGJ1Zi10eXBlICVkXG4iLAotCQkJX19mdW5jX18sIHBmbXQtPnR5cGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGNhbS0+bnVtX2ZtdHM7IGkrKykKLQkJaWYgKHBjYW0tPnVzcl9mbXRzW2ldLmZvdXJjYyA9PSBwaXhfbXAtPnBpeGVsZm9ybWF0KQotCQkJYnJlYWs7Ci0JaWYgKGkgPT0gcGNhbS0+bnVtX2ZtdHMpIHsKLQkJcHJfZXJyKCIlczogVXNlciByZXF1ZXN0ZWQgcGl4ZWxmb3JtYXQgJXggbm90IHN1cHBvcnRlZFxuIiwKLQkJCQkJCV9fZnVuY19fLCBwaXhfbXAtPnBpeGVsZm9ybWF0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY3RybGNtZC50eXBlICAgICAgID0gTVNNX1Y0TDJfVklEX0NBUF9UWVBFOwotCWN0cmxjbWQubGVuZ3RoICAgICA9IHNpemVvZihzdHJ1Y3QgaW1nX3BsYW5lX2luZm8pOwotCWN0cmxjbWQudmFsdWUgICAgICA9ICh2b2lkICopJnBsYW5lX2luZm87Ci0JY3RybGNtZC50aW1lb3V0X21zID0gMTAwMDA7Ci0JY3RybGNtZC52bm9kZV9pZCAgID0gcGNhbS0+dm5vZGVfaWQ7Ci0JY3RybGNtZC5xdWV1ZV9pZHggPSBwY2FtLT5zZXJ2ZXJfcXVldWVfaWR4OwotCi0JLyogc2VuZCBjb21tYW5kIHRvIGNvbmZpZyB0aHJlYWQgaW4gdXNlcnNzcGFjZSwgYW5kIGdldCByZXR1cm4gdmFsdWUgKi8KLQlyYyA9IG1zbV9zZXJ2ZXJfY29udHJvbCgmZ19zZXJ2ZXJfZGV2LCAwLCAmY3RybGNtZCk7Ci0JaWYgKHJjID49IDApIHsKLQkJcGNhbS0+ZGV2X2luc3RbaWR4XS0+dmlkX2ZtdCA9ICpwZm10OwotCQlwY2FtLT5kZXZfaW5zdFtpZHhdLT5zZW5zb3JfcHhsY29kZQotCQkJCQk9IHBjYW0tPnVzcl9mbXRzW2ldLnB4bGNvZGU7Ci0JCUQoIiVzOmluc3Q9MHgleCxpZHg9JWQsd2lkdGg9JWQsaGVpZ3RoPSVkXG4iLAotCQkJIF9fZnVuY19fLCAodTMyKXBjYW0tPmRldl9pbnN0W2lkeF0sIGlkeCwKLQkJCSBwY2FtLT5kZXZfaW5zdFtpZHhdLT52aWRfZm10LmZtdC5waXhfbXAud2lkdGgsCi0JCQkgcGNhbS0+ZGV2X2luc3RbaWR4XS0+dmlkX2ZtdC5mbXQucGl4X21wLmhlaWdodCk7Ci0JCXBjYW0tPmRldl9pbnN0W2lkeF0tPnBsYW5lX2luZm8gPSBwbGFuZV9pbmZvOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9zZXJ2ZXJfc3RyZWFtb24oc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0sIGludCBpZHgpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2N0cmxfY21kIGN0cmxjbWQ7Ci0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQljdHJsY21kLnR5cGUJICAgPSBNU01fVjRMMl9TVFJFQU1fT047Ci0JY3RybGNtZC50aW1lb3V0X21zID0gMTAwMDA7Ci0JY3RybGNtZC5sZW5ndGgJID0gMDsKLQljdHJsY21kLnZhbHVlICAgID0gTlVMTDsKLQljdHJsY21kLnN0cmVhbV90eXBlID0gcGNhbS0+ZGV2X2luc3RbaWR4XS0+aW1hZ2VfbW9kZTsKLQljdHJsY21kLnZub2RlX2lkID0gcGNhbS0+dm5vZGVfaWQ7Ci0JY3RybGNtZC5xdWV1ZV9pZHggPSBwY2FtLT5zZXJ2ZXJfcXVldWVfaWR4OwotCWN0cmxjbWQuY29uZmlnX2lkZW50ID0gZ19zZXJ2ZXJfZGV2LmNvbmZpZ19pbmZvLmNvbmZpZ19kZXZfaWRbMF07Ci0KLQotCS8qIHNlbmQgY29tbWFuZCB0byBjb25maWcgdGhyZWFkIGluIHVzZXJzc3BhY2UsIGFuZCBnZXQgcmV0dXJuIHZhbHVlICovCi0JcmMgPSBtc21fc2VydmVyX2NvbnRyb2woJmdfc2VydmVyX2RldiwgMCwgJmN0cmxjbWQpOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX3NlcnZlcl9zdHJlYW1vZmYoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0sIGludCBpZHgpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2N0cmxfY21kIGN0cmxjbWQ7Ci0KLQlEKCIlcywgcGNhbSA9IDB4JXhcbiIsIF9fZnVuY19fLCAodTMyKXBjYW0pOwotCWN0cmxjbWQudHlwZSAgICAgICAgPSBNU01fVjRMMl9TVFJFQU1fT0ZGOwotCWN0cmxjbWQudGltZW91dF9tcyAgPSAxMDAwMDsKLQljdHJsY21kLmxlbmd0aCAgICAgID0gMDsKLQljdHJsY21kLnZhbHVlICAgICAgID0gTlVMTDsKLQljdHJsY21kLnN0cmVhbV90eXBlID0gcGNhbS0+ZGV2X2luc3RbaWR4XS0+aW1hZ2VfbW9kZTsKLQljdHJsY21kLnZub2RlX2lkID0gcGNhbS0+dm5vZGVfaWQ7Ci0JY3RybGNtZC5xdWV1ZV9pZHggPSBwY2FtLT5zZXJ2ZXJfcXVldWVfaWR4OwotCWN0cmxjbWQuY29uZmlnX2lkZW50ID0gZ19zZXJ2ZXJfZGV2LmNvbmZpZ19pbmZvLmNvbmZpZ19kZXZfaWRbMF07Ci0KLQkvKiBzZW5kIGNvbW1hbmQgdG8gY29uZmlnIHRocmVhZCBpbiB1c2Vyc3NwYWNlLCBhbmQgZ2V0IHJldHVybiB2YWx1ZSAqLwotCXJjID0gbXNtX3NlcnZlcl9jb250cm9sKCZnX3NlcnZlcl9kZXYsIDAsICZjdHJsY21kKTsKLQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9zZXJ2ZXJfcHJvY19jdHJsX2NtZChzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSwKLQkJc3RydWN0IG1zbV9jYW1lcmFfdjRsMl9pb2N0bF90ICppb2N0bF9wdHIsIGludCBpc19zZXRfY21kKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jdHJsX2NtZCBjdHJsY21kLCB0bXBfY21kLCAqY21kX3B0cjsKLQl1aW50OF90ICpjdHJsX2RhdGEgPSBOVUxMOwotCXVpbnQzMl90IGNtZF9sZW4gPSBzaXplb2Yoc3RydWN0IG1zbV9jdHJsX2NtZCk7Ci0JdWludDMyX3QgdmFsdWVfbGVuOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXBfY21kLAotCQkodm9pZCBfX3VzZXIgKilpb2N0bF9wdHItPmlvY3RsX3B0ciwgY21kX2xlbikpIHsKLQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkLlxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kOwotCX0KLQl2YWx1ZV9sZW4gPSB0bXBfY21kLmxlbmd0aDsKLQljdHJsX2RhdGEgPSBremFsbG9jKHZhbHVlX2xlbitjbWRfbGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWN0cmxfZGF0YSkgewotCQlwcl9lcnIoIiVzIGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQljbWRfcHRyID0gKHN0cnVjdCBtc21fY3RybF9jbWQgKikgY3RybF9kYXRhOwotCSpjbWRfcHRyID0gdG1wX2NtZDsKLQlpZiAodG1wX2NtZC52YWx1ZSAmJiB0bXBfY21kLmxlbmd0aCA+IDApIHsKLQkJY21kX3B0ci0+dmFsdWUgPSAodm9pZCAqKShjdHJsX2RhdGErY21kX2xlbik7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKWNtZF9wdHItPnZhbHVlLAotCQkJCSAgICh2b2lkIF9fdXNlciAqKXRtcF9jbWQudmFsdWUsCi0JCQkJICAgdmFsdWVfbGVuKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkLlxuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBlbmQ7Ci0JCX0KLQl9IGVsc2UgewotCQljbWRfcHRyLT52YWx1ZSA9IE5VTEw7Ci0JfQotCi0JRCgiJXM6IGNtZCB0eXBlID0gJWQsIHVwMT0weCV4LCB1bGVuMT0lZCwgdXAyPTB4JXgsIHVsZW4yPSVkXG4iLAotCQlfX2Z1bmNfXywgdG1wX2NtZC50eXBlLCAodWludDMyX3QpaW9jdGxfcHRyLT5pb2N0bF9wdHIsIGNtZF9sZW4sCi0JCSh1aW50MzJfdCl0bXBfY21kLnZhbHVlLCB0bXBfY21kLmxlbmd0aCk7Ci0KLQljdHJsY21kLnR5cGUgPSBNU01fVjRMMl9TRVRfQ1RSTF9DTUQ7Ci0JY3RybGNtZC5sZW5ndGggPSBjbWRfbGVuICsgdmFsdWVfbGVuOwotCWN0cmxjbWQudmFsdWUgPSAodm9pZCAqKWN0cmxfZGF0YTsKLQlpZiAodG1wX2NtZC50aW1lb3V0X21zID4gMCkKLQkJY3RybGNtZC50aW1lb3V0X21zID0gdG1wX2NtZC50aW1lb3V0X21zOwotCWVsc2UKLQkJY3RybGNtZC50aW1lb3V0X21zID0gMTAwMDsKLQljdHJsY21kLnZub2RlX2lkID0gcGNhbS0+dm5vZGVfaWQ7Ci0JY3RybGNtZC5xdWV1ZV9pZHggPSBwY2FtLT5zZXJ2ZXJfcXVldWVfaWR4OwotCWN0cmxjbWQuY29uZmlnX2lkZW50ID0gZ19zZXJ2ZXJfZGV2LmNvbmZpZ19pbmZvLmNvbmZpZ19kZXZfaWRbMF07Ci0JLyogc2VuZCBjb21tYW5kIHRvIGNvbmZpZyB0aHJlYWQgaW4gdXNlcnNzcGFjZSwgYW5kIGdldCByZXR1cm4gdmFsdWUgKi8KLQlyYyA9IG1zbV9zZXJ2ZXJfY29udHJvbCgmZ19zZXJ2ZXJfZGV2LCAwLCAmY3RybGNtZCk7Ci0JRCgiJXM6IG1zbV9zZXJ2ZXJfY29udHJvbCByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKLQlpZiAocmMgPT0gMCkgewotCQlpZiAodG1wX2NtZC52YWx1ZSAmJiB0bXBfY21kLmxlbmd0aCA+IDAgJiYKLQkJCWNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKil0bXBfY21kLnZhbHVlLAotCQkJCSh2b2lkICopKGN0cmxfZGF0YStjbWRfbGVuKSwgdG1wX2NtZC5sZW5ndGgpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZmFpbGVkLCBzaXplPSVkXG4iLAotCQkJCV9fZnVuY19fLCB0bXBfY21kLmxlbmd0aCk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCQl0bXBfY21kLnN0YXR1cyA9IGNtZF9wdHItPnN0YXR1cyA9IGN0cmxjbWQuc3RhdHVzOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWlvY3RsX3B0ci0+aW9jdGxfcHRyLAotCQkJKHZvaWQgKiljbWRfcHRyLCBjbWRfbGVuKSkgewotCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZhaWxlZCBpbiBjcHksIHNpemU9JWRcbiIsCi0JCQkJX19mdW5jX18sIGNtZF9sZW4pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBlbmQ7Ci0JCX0KLQl9Ci1lbmQ6Ci0JRCgiJXM6IEVORCwgdHlwZSA9ICVkLCB2YWRkciA9IDB4JXgsIHZsZW4gPSAlZCwgc3RhdHVzID0gJWQsIHJjID0gJWRcbiIsCi0JCV9fZnVuY19fLCB0bXBfY21kLnR5cGUsICh1aW50MzJfdCl0bXBfY21kLnZhbHVlLAotCQl0bXBfY21kLmxlbmd0aCwgdG1wX2NtZC5zdGF0dXMsIHJjKTsKLQlrZnJlZShjdHJsX2RhdGEpOwotCWN0cmxfZGF0YSA9IE5VTEw7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX3NlcnZlcl9zX2N0cmwoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0sCi0JCQkJIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2N0cmxfY21kIGN0cmxjbWQ7Ci0JdWludDhfdCBjdHJsX2RhdGFbbWF4X2NvbnRyb2xfY29tbWFuZF9zaXplXTsKLQotCVdBUk5fT04oY3RybCA9PSBOVUxMKTsKLQlpZiAoY3RybCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMgSW52YWxpZCBjb250cm9sXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW1lbXNldChjdHJsX2RhdGEsIDAsIHNpemVvZihjdHJsX2RhdGEpKTsKLQotCWN0cmxjbWQudHlwZSA9IE1TTV9WNEwyX1NFVF9DVFJMOwotCWN0cmxjbWQubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCB2NGwyX2NvbnRyb2wpOwotCWN0cmxjbWQudmFsdWUgPSAodm9pZCAqKWN0cmxfZGF0YTsKLQltZW1jcHkoY3RybGNtZC52YWx1ZSwgY3RybCwgY3RybGNtZC5sZW5ndGgpOwotCWN0cmxjbWQudGltZW91dF9tcyA9IDEwMDA7Ci0JY3RybGNtZC52bm9kZV9pZCA9IHBjYW0tPnZub2RlX2lkOwotCWN0cmxjbWQucXVldWVfaWR4ID0gcGNhbS0+c2VydmVyX3F1ZXVlX2lkeDsKLQljdHJsY21kLmNvbmZpZ19pZGVudCA9IGdfc2VydmVyX2Rldi5jb25maWdfaW5mby5jb25maWdfZGV2X2lkWzBdOwotCi0JLyogc2VuZCBjb21tYW5kIHRvIGNvbmZpZyB0aHJlYWQgaW4gdXNlcnNzcGFjZSwgYW5kIGdldCByZXR1cm4gdmFsdWUgKi8KLQlyYyA9IG1zbV9zZXJ2ZXJfY29udHJvbCgmZ19zZXJ2ZXJfZGV2LCAwLCAmY3RybGNtZCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fc2VydmVyX2dfY3RybChzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSwKLQkJCQkgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY3RybF9jbWQgY3RybGNtZDsKLQl1aW50OF90IGN0cmxfZGF0YVttYXhfY29udHJvbF9jb21tYW5kX3NpemVdOwotCi0JV0FSTl9PTihjdHJsID09IE5VTEwpOwotCWlmIChjdHJsID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlcyBJbnZhbGlkIGNvbnRyb2xcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbWVtc2V0KGN0cmxfZGF0YSwgMCwgc2l6ZW9mKGN0cmxfZGF0YSkpOwotCi0JY3RybGNtZC50eXBlID0gTVNNX1Y0TDJfR0VUX0NUUkw7Ci0JY3RybGNtZC5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHY0bDJfY29udHJvbCk7Ci0JY3RybGNtZC52YWx1ZSA9ICh2b2lkICopY3RybF9kYXRhOwotCW1lbWNweShjdHJsY21kLnZhbHVlLCBjdHJsLCBjdHJsY21kLmxlbmd0aCk7Ci0JY3RybGNtZC50aW1lb3V0X21zID0gMTAwMDsKLQljdHJsY21kLnZub2RlX2lkID0gcGNhbS0+dm5vZGVfaWQ7Ci0JY3RybGNtZC5xdWV1ZV9pZHggPSBwY2FtLT5zZXJ2ZXJfcXVldWVfaWR4OwotCWN0cmxjbWQuY29uZmlnX2lkZW50ID0gZ19zZXJ2ZXJfZGV2LmNvbmZpZ19pbmZvLmNvbmZpZ19kZXZfaWRbMF07Ci0KLQkvKiBzZW5kIGNvbW1hbmQgdG8gY29uZmlnIHRocmVhZCBpbiB1c2Vyc3NwYWNlLCBhbmQgZ2V0IHJldHVybiB2YWx1ZSAqLwotCXJjID0gbXNtX3NlcnZlcl9jb250cm9sKCZnX3NlcnZlcl9kZXYsIDAsICZjdHJsY21kKTsKLQotCWN0cmwtPnZhbHVlID0gKChzdHJ1Y3QgdjRsMl9jb250cm9sICopY3RybGNtZC52YWx1ZSktPnZhbHVlOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX3NlcnZlcl9xX2N0cmwoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0sCi0JCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnF1ZXJ5Y3RybCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY3RybF9jbWQgY3RybGNtZDsKLQl1aW50OF90IGN0cmxfZGF0YVttYXhfY29udHJvbF9jb21tYW5kX3NpemVdOwotCi0JV0FSTl9PTihxdWVyeWN0cmwgPT0gTlVMTCk7Ci0JbWVtc2V0KGN0cmxfZGF0YSwgMCwgc2l6ZW9mKGN0cmxfZGF0YSkpOwotCi0JY3RybGNtZC50eXBlID0gTVNNX1Y0TDJfUVVFUllfQ1RSTDsKLQljdHJsY21kLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwpOwotCWN0cmxjbWQudmFsdWUgPSAodm9pZCAqKWN0cmxfZGF0YTsKLQltZW1jcHkoY3RybGNtZC52YWx1ZSwgcXVlcnljdHJsLCBjdHJsY21kLmxlbmd0aCk7Ci0JY3RybGNtZC50aW1lb3V0X21zID0gMTAwMDsKLQljdHJsY21kLnZub2RlX2lkID0gcGNhbS0+dm5vZGVfaWQ7Ci0JY3RybGNtZC5xdWV1ZV9pZHggPSBwY2FtLT5zZXJ2ZXJfcXVldWVfaWR4OwotCWN0cmxjbWQuY29uZmlnX2lkZW50ID0gZ19zZXJ2ZXJfZGV2LmNvbmZpZ19pbmZvLmNvbmZpZ19kZXZfaWRbMF07Ci0KLQkvKiBzZW5kIGNvbW1hbmQgdG8gY29uZmlnIHRocmVhZCBpbiB1c2Vyc3BhY2UsIGFuZCBnZXQgcmV0dXJuIHZhbHVlICovCi0JcmMgPSBtc21fc2VydmVyX2NvbnRyb2woJmdfc2VydmVyX2RldiwgMCwgJmN0cmxjbWQpOwotCUQoIiVzOiByYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCi0JaWYgKHJjID49IDApCi0JCW1lbWNweShxdWVyeWN0cmwsIGN0cmxjbWQudmFsdWUsIHNpemVvZihzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwpKTsKLQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9zZXJ2ZXJfZ2V0X2ZtdChzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSwKLQkJIGludCBpZHgsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqcGZtdCkKLXsKLQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmcGZtdC0+Zm10LnBpeDsKLQotCXBpeC0+d2lkdGggICAgICAgID0gcGNhbS0+ZGV2X2luc3RbaWR4XS0+dmlkX2ZtdC5mbXQucGl4LndpZHRoOwotCXBpeC0+aGVpZ2h0ICAgICAgID0gcGNhbS0+ZGV2X2luc3RbaWR4XS0+dmlkX2ZtdC5mbXQucGl4LmhlaWdodDsKLQlwaXgtPmZpZWxkICAgICAgICA9IHBjYW0tPmRldl9pbnN0W2lkeF0tPnZpZF9mbXQuZm10LnBpeC5maWVsZDsKLQlwaXgtPnBpeGVsZm9ybWF0ICA9IHBjYW0tPmRldl9pbnN0W2lkeF0tPnZpZF9mbXQuZm10LnBpeC5waXhlbGZvcm1hdDsKLQlwaXgtPmJ5dGVzcGVybGluZSA9IHBjYW0tPmRldl9pbnN0W2lkeF0tPnZpZF9mbXQuZm10LnBpeC5ieXRlc3BlcmxpbmU7Ci0JcGl4LT5jb2xvcnNwYWNlICAgPSBwY2FtLT5kZXZfaW5zdFtpZHhdLT52aWRfZm10LmZtdC5waXguY29sb3JzcGFjZTsKLQlpZiAocGl4LT5ieXRlc3BlcmxpbmUgPCAwKQotCQlyZXR1cm4gcGl4LT5ieXRlc3BlcmxpbmU7Ci0KLQlwaXgtPnNpemVpbWFnZSAgICA9IHBpeC0+aGVpZ2h0ICogcGl4LT5ieXRlc3BlcmxpbmU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IG1zbV9zZXJ2ZXJfZ2V0X2ZtdF9tcGxhbmUoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0sCi0JCSBpbnQgaWR4LCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKnBmbXQpCi17Ci0JKnBmbXQgPSBwY2FtLT5kZXZfaW5zdFtpZHhdLT52aWRfZm10OwotCXJldHVybiAwOwotfQotCi1pbnQgbXNtX3NlcnZlcl90cnlfZm10KHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtLAotCQkJCSBzdHJ1Y3QgdjRsMl9mb3JtYXQgKnBmbXQpCi17Ci0JaW50IHJjID0gMDsKLQlpbnQgaSA9IDA7Ci0Jc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJnBmbXQtPmZtdC5waXg7Ci0KLQlEKCIlczogMHgleFxuIiwgX19mdW5jX18sIHBpeC0+cGl4ZWxmb3JtYXQpOwotCWlmIChwZm10LT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewotCQlwcl9lcnIoIiVzOiBwZm10LT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSFcbiIsCi0JCQkJCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBjaGVjayBpZiB0aGUgZm9ybWF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIGhvc3Qtc2Vuc29yIGNvbWJvICovCi0JZm9yIChpID0gMDsgaSA8IHBjYW0tPm51bV9mbXRzOyBpKyspIHsKLQkJRCgiJXM6IHVzcl9mbXRzLmZvdXJjYzogMHgleFxuIiwgX19mdW5jX18sCi0JCQlwY2FtLT51c3JfZm10c1tpXS5mb3VyY2MpOwotCQlpZiAocGNhbS0+dXNyX2ZtdHNbaV0uZm91cmNjID09IHBpeC0+cGl4ZWxmb3JtYXQpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaSA9PSBwY2FtLT5udW1fZm10cykgewotCQlwcl9lcnIoIiVzOiBGb3JtYXQgJXggbm90IGZvdW5kXG4iLCBfX2Z1bmNfXywgcGl4LT5waXhlbGZvcm1hdCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fc2VydmVyX3RyeV9mbXRfbXBsYW5lKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtLAotCQkJCSBzdHJ1Y3QgdjRsMl9mb3JtYXQgKnBmbXQpCi17Ci0JaW50IHJjID0gMDsKLQlpbnQgaSA9IDA7Ci0Jc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeF9tcCA9ICZwZm10LT5mbXQucGl4X21wOwotCi0JRCgiJXM6IDB4JXhcbiIsIF9fZnVuY19fLCBwaXhfbXAtPnBpeGVsZm9ybWF0KTsKLQlpZiAocGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7Ci0JCXByX2VycigiJXM6IEluY29ycmVjdCBmb3JtYXQgdHlwZSAlZCAiLAotCQkJX19mdW5jX18sIHBmbXQtPnR5cGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBjaGVjayBpZiB0aGUgZm9ybWF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIGhvc3Qtc2Vuc29yIGNvbWJvICovCi0JZm9yIChpID0gMDsgaSA8IHBjYW0tPm51bV9mbXRzOyBpKyspIHsKLQkJRCgiJXM6IHVzcl9mbXRzLmZvdXJjYzogMHgleFxuIiwgX19mdW5jX18sCi0JCQlwY2FtLT51c3JfZm10c1tpXS5mb3VyY2MpOwotCQlpZiAocGNhbS0+dXNyX2ZtdHNbaV0uZm91cmNjID09IHBpeF9tcC0+cGl4ZWxmb3JtYXQpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaSA9PSBwY2FtLT5udW1fZm10cykgewotCQlwcl9lcnIoIiVzOiBGb3JtYXQgJXggbm90IGZvdW5kXG4iLAotCQkJX19mdW5jX18sIHBpeF9tcC0+cGl4ZWxmb3JtYXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX3NlcnZlcl92NGwyX3N1YnNjcmliZV9ldmVudChzdHJ1Y3QgdjRsMl9maCAqZmgsCi0JCQlzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24gKnN1YikKLXsKLQlpbnQgcmMgPSAwOwotCi0JRCgiJXM6IGZoID0gMHgleCwgdHlwZSA9IDB4JXgiLCBfX2Z1bmNfXywgKHUzMilmaCwgc3ViLT50eXBlKTsKLQlpZiAoc3ViLT50eXBlID09IFY0TDJfRVZFTlRfQUxMKSB7Ci0JCS8qc3ViLT50eXBlID0gTVNNX0lTUF9FVkVOVF9TVEFSVDsqLwotCQlzdWItPnR5cGUgPSBWNEwyX0VWRU5UX1BSSVZBVEVfU1RBUlQgKyBNU01fQ0FNX1JFU1BfQ1RSTDsKLQkJRCgic3ViLT50eXBlIHN0YXJ0ID0gMHgleFxuIiwgc3ViLT50eXBlKTsKLQkJZG8gewotCQkJcmMgPSB2NGwyX2V2ZW50X3N1YnNjcmliZShmaCwgc3ViLCAzMCk7DQotCQkJaWYgKHJjIDwgMCkgewotCQkJCUQoIiVzOiBmYWlsZWQgZm9yIGV2dFR5cGUgPSAweCV4LCByYyA9ICVkXG4iLAotCQkJCQkJX19mdW5jX18sIHN1Yi0+dHlwZSwgcmMpOwotCQkJLyogdW5zdWJzY3JpYmUgYWxsIGV2ZW50cyBoZXJlIGFuZCByZXR1cm4gKi8KLQkJCXN1Yi0+dHlwZSA9IFY0TDJfRVZFTlRfQUxMOwotCQkJdjRsMl9ldmVudF91bnN1YnNjcmliZShmaCwgc3ViKTsKLQkJCXJldHVybiByYzsKLQkJCX0gZWxzZQotCQkJCUQoIiVzOiBzdWJzY3JpYmVkIGV2dFR5cGUgPSAweCV4LCByYyA9ICVkXG4iLAotCQkJCQkJX19mdW5jX18sIHN1Yi0+dHlwZSwgcmMpOwotCQkJc3ViLT50eXBlKys7Ci0JCQlEKCJzdWItPnR5cGUgd2hpbGUgPSAweCV4XG4iLCBzdWItPnR5cGUpOwotCQl9IHdoaWxlIChzdWItPnR5cGUgIT0KLQkJCVY0TDJfRVZFTlRfUFJJVkFURV9TVEFSVCArIE1TTV9TVlJfUkVTUF9NQVgpOwotCX0gZWxzZSB7Ci0JCUQoInN1Yi0+dHlwZSBub3QgVjRMMl9FVkVOVF9BTEwgPSAweCV4XG4iLCBzdWItPnR5cGUpOwotCQlyYyA9IHY0bDJfZXZlbnRfc3Vic2NyaWJlKGZoLCBzdWIsIDMwKTsNCi0JCWlmIChyYyA8IDApCi0JCQlEKCIlczogZmFpbGVkIGZvciBldnRUeXBlID0gMHgleCwgcmMgPSAlZFxuIiwKLQkJCQkJCV9fZnVuY19fLCBzdWItPnR5cGUsIHJjKTsKLQl9Ci0KLQlEKCIlczogcmMgPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fc2VydmVyX3Y0bDJfdW5zdWJzY3JpYmVfZXZlbnQoc3RydWN0IHY0bDJfZmggKmZoLAotCQkJc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgdjRsMl9ldmVudCBldjsKLQotCUQoIiVzOiBmaCA9IDB4JXhcbiIsIF9fZnVuY19fLCAodTMyKWZoKTsKLQotCS8qIFVuZGVxdWV1ZSBhbGwgcGVuZGluZyBldmVudHMgYW5kIGZyZWUgYXNzb2NpYXRlZAotCSAqIG1zbV9pc3BfZXZlbnRfY3RybCAgKi8KLQl3aGlsZSAodjRsMl9ldmVudF9wZW5kaW5nKGZoKSkgewotCQlzdHJ1Y3QgbXNtX2lzcF9ldmVudF9jdHJsICppc3BfZXZlbnQ7Ci0JCXJjID0gdjRsMl9ldmVudF9kZXF1ZXVlKGZoLCAmZXYsIE9fTk9OQkxPQ0spOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXM6IHY0bDJfZXZlbnRfZGVxdWV1ZSBmYWlsZWQgJWQiLAotCQkJCQkJX19mdW5jX18sIHJjKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlzcF9ldmVudCA9IChzdHJ1Y3QgbXNtX2lzcF9ldmVudF9jdHJsICopCi0JCQkoKigodWludDMyX3QgKilldi51LmRhdGEpKTsKLQkJaWYgKGlzcF9ldmVudCkgewotCQkJaWYgKGlzcF9ldmVudC0+aXNwX2RhdGEuaXNwX21zZy5sZW4gIT0gMCAmJgotCQkJCWlzcF9ldmVudC0+aXNwX2RhdGEuaXNwX21zZy5kYXRhICE9IE5VTEwpIHsKLQkJCQlrZnJlZShpc3BfZXZlbnQtPmlzcF9kYXRhLmlzcF9tc2cuZGF0YSk7Ci0JCQkJaXNwX2V2ZW50LT5pc3BfZGF0YS5pc3BfbXNnLmxlbiA9IDA7Ci0JCQkJaXNwX2V2ZW50LT5pc3BfZGF0YS5pc3BfbXNnLmRhdGEgPSBOVUxMOwotCQkJfQotCQkJa2ZyZWUoaXNwX2V2ZW50KTsKLQkJCSooKHVpbnQzMl90ICopZXYudS5kYXRhKSA9IDA7Ci0JCX0KLQl9Ci0KLQlyYyA9IHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUoZmgsIHN1Yik7Ci0JRCgiJXM6IHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKiBvcGVuIGFuIGFjdGl2ZSBjYW1lcmEgc2Vzc2lvbiB0byBtYW5hZ2UgdGhlIHN0cmVhbWluZyBsb2dpYyAqLwotc3RhdGljIGludCBtc21fY2FtX3NlcnZlcl9vcGVuX3Nlc3Npb24oc3RydWN0IG1zbV9jYW1fc2VydmVyX2RldiAqcHMsCi0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0pCi17Ci0JaW50IHJjID0gMDsKLQotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIXBzIHx8ICFwY2FtKSB7Ci0JCXByX2VycigiJXMgTlVMTCBwb2ludGVyIHBhc3NlZCBpbiFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qCi0JICogVGhlIG51bWJlciBvZiBjYW1lcmEgaW5zdGFuY2Ugc2hvdWxkIGJlIGNvbnRyb2xsZWQgYnkgdGhlCi0JICogcmVzb3VyY2UgbWFuYWdlci4gQ3VycmVudGx5IHN1cHBvcnRpbmcgdHdvIGFjdGl2ZSBpbnN0YW5jZXMKLQkgKi8KLQlpZiAoYXRvbWljX3JlYWQoJnBzLT5udW1iZXJfcGNhbV9hY3RpdmUpID4gMSkgewotCQlwcl9lcnIoIiVzIENhbm5vdCBoYXZlIG1vcmUgdGhhbiB0d28gYWN0aXZlIGNhbWVyYSAlZFxuIiwKLQkJCV9fZnVuY19fLCBhdG9taWNfcmVhZCgmcHMtPm51bWJlcl9wY2FtX2FjdGl2ZSkpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JLyogYm9vayBrZWVwaW5nIHRoaXMgY2FtZXJhIHNlc3Npb24qLwotCXBzLT5wY2FtX2FjdGl2ZVtwY2FtLT5zZXJ2ZXJfcXVldWVfaWR4XSA9IHBjYW07Ci0JcHMtPm9wZW5lZF9wY2FtW3BjYW0tPnZub2RlX2lkXSA9IHBjYW07Ci0JYXRvbWljX2luYygmcHMtPm51bWJlcl9wY2FtX2FjdGl2ZSk7Ci0KLQlEKCJjb25maWcgcGNhbSA9IDB4JXBcbiIsIHBjYW0pOwotCi0JLyogaW5pdGlhbGl6YXRpb24gdGhlIG1lZGlhIGNvbnRyb2xsZXIgbW9kdWxlKi8KLQltc21fbWN0bF9pbml0KHBjYW0pOwotCi0JcmV0dXJuIHJjOwotfQotCi0vKiBjbG9zZSBhbiBhY3RpdmUgY2FtZXJhIHNlc3Npb24gdG8gc2VydmVyICovCi1zdGF0aWMgaW50IG1zbV9jYW1fc2VydmVyX2Nsb3NlX3Nlc3Npb24oc3RydWN0IG1zbV9jYW1fc2VydmVyX2RldiAqcHMsCi0Jc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0pCi17Ci0JaW50IGk7Ci0JaW50IHJjID0gMDsKLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKCFwcyB8fCAhcGNhbSkgewotCQlEKCIlcyBOVUxMIHBvaW50ZXIgcGFzc2VkIGluIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JYXRvbWljX2RlYygmcHMtPm51bWJlcl9wY2FtX2FjdGl2ZSk7Ci0JcHMtPnBjYW1fYWN0aXZlW3BjYW0tPnNlcnZlcl9xdWV1ZV9pZHhdID0gTlVMTDsKLQlwcy0+b3BlbmVkX3BjYW1bcGNhbS0+dm5vZGVfaWRdID0gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgSU5URl9NQVg7IGkrKykgewotCQlpZiAocHMtPmludGVyZmFjZV9tYXBfdGFibGVbaV0ubWN0bF9oYW5kbGUgPT0KLQkJCXBjYW0tPm1jdGxfaGFuZGxlKQotCQkJcHMtPmludGVyZmFjZV9tYXBfdGFibGVbaV0ubWN0bF9oYW5kbGUgPSAwOwotCX0KLQltc21fbWN0bF9mcmVlKHBjYW0pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtYXBfaW1lbV9hZGRyZXNzZXMoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqbWN0bCkKLXsKLQlpbnQgcmMgPSAwOwotCXJjID0gbXNtX2lvbW11X21hcF9jb250aWdfYnVmZmVyKAotCQkodW5zaWduZWQgbG9uZylJTUVNX1lfUElOR19PRkZTRVQsIG1jdGwtPmRvbWFpbl9udW0sIDAsCi0JCSgoSU1FTV9ZX1NJWkUgKyBJTUVNX0NCQ1JfU0laRSArIDQwOTUpICYgKH40MDk1KSksCi0JCVNaXzRLLCBJT01NVV9XUklURSB8IElPTU1VX1JFQUQsCi0JCSh1bnNpZ25lZCBsb25nICopJm1jdGwtPnBpbmdfaW1lbV95KTsKLQltY3RsLT5waW5nX2ltZW1fY2JjciA9IG1jdGwtPnBpbmdfaW1lbV95ICsgSU1FTV9ZX1NJWkU7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBwaW5nIGlvbW11IG1hcHBpbmcgcmV0dXJuZWQgZXJyb3IgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQltY3RsLT5waW5nX2ltZW1feSA9IDA7Ci0JCW1jdGwtPnBpbmdfaW1lbV9jYmNyID0gMDsKLQl9Ci0JbXNtX2lvbW11X21hcF9jb250aWdfYnVmZmVyKAotCQkodW5zaWduZWQgbG9uZylJTUVNX1lfUE9OR19PRkZTRVQsIG1jdGwtPmRvbWFpbl9udW0sIDAsCi0JCSgoSU1FTV9ZX1NJWkUgKyBJTUVNX0NCQ1JfU0laRSArIDQwOTUpICYgKH40MDk1KSksCi0JCVNaXzRLLCBJT01NVV9XUklURSB8IElPTU1VX1JFQUQsCi0JCSh1bnNpZ25lZCBsb25nICopJm1jdGwtPnBvbmdfaW1lbV95KTsKLQltY3RsLT5wb25nX2ltZW1fY2JjciA9IG1jdGwtPnBvbmdfaW1lbV95ICsgSU1FTV9ZX1NJWkU7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBwb25nIGlvbW11IG1hcHBpbmcgcmV0dXJuZWQgZXJyb3IgJWRcbiIsCi0JCQkgX19mdW5jX18sIHJjKTsKLQkJbWN0bC0+cG9uZ19pbWVtX3kgPSAwOwotCQltY3RsLT5wb25nX2ltZW1fY2JjciA9IDA7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgdW5tYXBfaW1lbV9hZGRyZXNzZXMoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqbWN0bCkKLXsKLQltc21faW9tbXVfdW5tYXBfY29udGlnX2J1ZmZlcihtY3RsLT5waW5nX2ltZW1feSwKLQkJbWN0bC0+ZG9tYWluX251bSwgMCwKLQkJKChJTUVNX1lfU0laRSArIElNRU1fQ0JDUl9TSVpFICsgNDA5NSkgJiAofjQwOTUpKSk7Ci0JbXNtX2lvbW11X3VubWFwX2NvbnRpZ19idWZmZXIobWN0bC0+cG9uZ19pbWVtX3ksCi0JCW1jdGwtPmRvbWFpbl9udW0sIDAsCi0JCSgoSU1FTV9ZX1NJWkUgKyBJTUVNX0NCQ1JfU0laRSArIDQwOTUpICYgKH40MDk1KSkpOwotCW1jdGwtPnBpbmdfaW1lbV95ID0gMDsKLQltY3RsLT5waW5nX2ltZW1fY2JjciA9IDA7Ci0JbWN0bC0+cG9uZ19pbWVtX3kgPSAwOwotCW1jdGwtPnBvbmdfaW1lbV9jYmNyID0gMDsKLX0KLQotc3RhdGljIGxvbmcgbXNtX2lvY3RsX3NlcnZlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCi0JCWJvb2wgdmFsaWRfcHJpbywgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCWludCByYyA9IC1FSU5WQUw7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfdjRsMl9pb2N0bF90ICppb2N0bF9wdHIgPSBhcmc7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfaW5mbyB0ZW1wX2NhbV9pbmZvOwotCXN0cnVjdCBtc21fY2FtX2NvbmZpZ19kZXZfaW5mbyB0ZW1wX2NvbmZpZ19pbmZvOwotCXN0cnVjdCBtc21fbWN0bF9ub2RlX2luZm8gdGVtcF9tY3RsX2luZm87Ci0JaW50IGk7Ci0KLQlEKCIlczogY21kICVkXG4iLCBfX2Z1bmNfXywgX0lPQ19OUihjbWQpKTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBNU01fQ0FNX1Y0TDJfSU9DVExfR0VUX0NBTUVSQV9JTkZPOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJnRlbXBfY2FtX2luZm8sCi0JCQkJKHZvaWQgX191c2VyICopaW9jdGxfcHRyLT5pb2N0bF9wdHIsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fY2FtZXJhX2luZm8pKSkgewotCQkJcHJfZXJyKCIlcyBDb3B5IGZyb20gdXNlciBmYWlsZWQgZm9yIGNtZCAlZCIsCi0JCQkJX19mdW5jX18sIGNtZCk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IGdfc2VydmVyX2Rldi5jYW1lcmFfaW5mby5udW1fY2FtZXJhczsgaSsrKSB7Ci0JCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKQotCQkJdGVtcF9jYW1faW5mby52aWRlb19kZXZfbmFtZVtpXSwKLQkJCWdfc2VydmVyX2Rldi5jYW1lcmFfaW5mby52aWRlb19kZXZfbmFtZVtpXSwKLQkJCXN0cm5sZW4oZ19zZXJ2ZXJfZGV2LmNhbWVyYV9pbmZvLnZpZGVvX2Rldl9uYW1lW2ldLAotCQkJCU1BWF9ERVZfTkFNRV9MRU4pKSkgewotCQkJCXByX2VycigiJXMgQ29weSB0byB1c2VyIGZhaWxlZCBmb3IgY21kICVkIiwKLQkJCQkJX19mdW5jX18sIGNtZCk7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCXJldHVybiByYzsKLQkJCX0KLQkJCXRlbXBfY2FtX2luZm8uaGFzXzNkX3N1cHBvcnRbaV0gPQotCQkJCWdfc2VydmVyX2Rldi5jYW1lcmFfaW5mby5oYXNfM2Rfc3VwcG9ydFtpXTsKLQkJCXRlbXBfY2FtX2luZm8uaXNfaW50ZXJuYWxfY2FtW2ldID0KLQkJCQlnX3NlcnZlcl9kZXYuY2FtZXJhX2luZm8uaXNfaW50ZXJuYWxfY2FtW2ldOwotCQkJdGVtcF9jYW1faW5mby5zX21vdW50X2FuZ2xlW2ldID0KLQkJCQlnX3NlcnZlcl9kZXYuY2FtZXJhX2luZm8uc19tb3VudF9hbmdsZVtpXTsKLQkJCXRlbXBfY2FtX2luZm8uc2Vuc29yX3R5cGVbaV0gPQotCQkJCWdfc2VydmVyX2Rldi5jYW1lcmFfaW5mby5zZW5zb3JfdHlwZVtpXTsKLQotCQl9Ci0JCXRlbXBfY2FtX2luZm8ubnVtX2NhbWVyYXMgPQotCQkJZ19zZXJ2ZXJfZGV2LmNhbWVyYV9pbmZvLm51bV9jYW1lcmFzOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWlvY3RsX3B0ci0+aW9jdGxfcHRyLAotCQkJJnRlbXBfY2FtX2luZm8sCXNpemVvZihzdHJ1Y3QgbXNtX2NhbWVyYV9pbmZvKSkpIHsKLQkJCXByX2VycigiJXMgQ29weSB0byB1c2VyIGZhaWxlZCBmb3IgY21kICVkIiwKLQkJCQlfX2Z1bmNfXywgY21kKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCXJldHVybiByYzsKLQkJfQotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNX1Y0TDJfSU9DVExfR0VUX0NPTkZJR19JTkZPOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJnRlbXBfY29uZmlnX2luZm8sCi0JCQkodm9pZCBfX3VzZXIgKilpb2N0bF9wdHItPmlvY3RsX3B0ciwKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2NhbV9jb25maWdfZGV2X2luZm8pKSkgewotCQkJcHJfZXJyKCIlcyBDb3B5IGZyb20gdXNlciBmYWlsZWQgZm9yIGNtZCAlZCIsCi0JCQkJX19mdW5jX18sIGNtZCk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQkJZm9yIChpID0gMDsKLQkJIGkgPCBnX3NlcnZlcl9kZXYuY29uZmlnX2luZm8ubnVtX2NvbmZpZ19ub2RlczsgaSsrKSB7Ci0JCQlpZiAoY29weV90b191c2VyKAotCQkJKHZvaWQgX191c2VyICopdGVtcF9jb25maWdfaW5mby5jb25maWdfZGV2X25hbWVbaV0sCi0JCQlnX3NlcnZlcl9kZXYuY29uZmlnX2luZm8uY29uZmlnX2Rldl9uYW1lW2ldLAotCQkJc3RybmxlbihnX3NlcnZlcl9kZXYuY29uZmlnX2luZm8uY29uZmlnX2Rldl9uYW1lW2ldLAotCQkJCU1BWF9ERVZfTkFNRV9MRU4pKSkgewotCQkJCXByX2VycigiJXMgQ29weSB0byB1c2VyIGZhaWxlZCBmb3IgY21kICVkIiwKLQkJCQkJX19mdW5jX18sIGNtZCk7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCXJldHVybiByYzsKLQkJCX0KLQkJfQotCQl0ZW1wX2NvbmZpZ19pbmZvLm51bV9jb25maWdfbm9kZXMgPQotCQkJZ19zZXJ2ZXJfZGV2LmNvbmZpZ19pbmZvLm51bV9jb25maWdfbm9kZXM7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopaW9jdGxfcHRyLT5pb2N0bF9wdHIsCi0JCQkmdGVtcF9jb25maWdfaW5mbywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2NhbV9jb25maWdfZGV2X2luZm8pKSkgewotCQkJcHJfZXJyKCIlcyBDb3B5IHRvIHVzZXIgZmFpbGVkIGZvciBjbWQgJWQiLAotCQkJCV9fZnVuY19fLCBjbWQpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQ0FNX1Y0TDJfSU9DVExfR0VUX01DVExfSU5GTzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0ZW1wX21jdGxfaW5mbywKLQkJCQkodm9pZCBfX3VzZXIgKilpb2N0bF9wdHItPmlvY3RsX3B0ciwKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9tY3RsX25vZGVfaW5mbykpKSB7Ci0JCQlwcl9lcnIoIiVzIENvcHkgZnJvbSB1c2VyIGZhaWxlZCBmb3IgY21kICVkIiwKLQkJCQlfX2Z1bmNfXywgY21kKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCXJldHVybiByYzsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgZ19zZXJ2ZXJfZGV2Lm1jdGxfbm9kZV9pbmZvLm51bV9tY3RsX25vZGVzOwotCQkJCWkrKykgewotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikKLQkJCXRlbXBfbWN0bF9pbmZvLm1jdGxfbm9kZV9uYW1lW2ldLAotCQkJZ19zZXJ2ZXJfZGV2Lm1jdGxfbm9kZV9pbmZvLm1jdGxfbm9kZV9uYW1lW2ldLCBzdHJubGVuKAotCQkJZ19zZXJ2ZXJfZGV2Lm1jdGxfbm9kZV9pbmZvLm1jdGxfbm9kZV9uYW1lW2ldLAotCQkJTUFYX0RFVl9OQU1FX0xFTikpKSB7Ci0JCQkJcHJfZXJyKCIlcyBDb3B5IHRvIHVzZXIgZmFpbGVkIGZvciBjbWQgJWQiLAotCQkJCQlfX2Z1bmNfXywgY21kKTsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJcmV0dXJuIHJjOwotCQkJfQotCQl9Ci0JCXRlbXBfbWN0bF9pbmZvLm51bV9tY3RsX25vZGVzID0KLQkJCWdfc2VydmVyX2Rldi5tY3RsX25vZGVfaW5mby5udW1fbWN0bF9ub2RlczsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilpb2N0bF9wdHItPmlvY3RsX3B0ciwKLQkJCSZ0ZW1wX21jdGxfaW5mbywgc2l6ZW9mKHN0cnVjdCBtc21fbWN0bF9ub2RlX2luZm8pKSkgewotCQkJcHJfZXJyKCIlcyBDb3B5IHRvIHVzZXIgZmFpbGVkIGZvciBjbWQgJWQiLAotCQkJCV9fZnVuY19fLCBjbWQpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCXJjID0gMDsKLQlicmVhazsKLQotCWNhc2UgTVNNX0NBTV9WNEwyX0lPQ1RMX0NUUkxfQ01EX0RPTkU6Ci0JCUQoIiVzOiBNU01fQ0FNX0lPQ1RMX0NUUkxfQ01EX0RPTkVcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSBtc21fY3RybF9jbWRfZG9uZShhcmcpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTV9WNEwyX0lPQ1RMX0dFVF9FVkVOVF9QQVlMT0FEOiB7Ci0JCXN0cnVjdCBtc21fcXVldWVfY21kICpldmVudF9jbWQ7Ci0JCXN0cnVjdCBtc21faXNwX2V2ZW50X2N0cmwgdV9pc3BfZXZlbnQ7Ci0JCXN0cnVjdCBtc21faXNwX2V2ZW50X2N0cmwgKmtfaXNwX2V2ZW50OwotCQlzdHJ1Y3QgbXNtX2RldmljZV9xdWV1ZSAqcXVldWU7Ci0JCXZvaWQgX191c2VyICp1X2N0cmxfdmFsdWUgPSBOVUxMOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnVfaXNwX2V2ZW50LAotCQkJKHZvaWQgX191c2VyICopaW9jdGxfcHRyLT5pb2N0bF9wdHIsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9pc3BfZXZlbnRfY3RybCkpKSB7Ci0JCQlwcl9lcnIoIiVzIENvcHkgZnJvbSB1c2VyIGZhaWxlZCBmb3IgY21kICVkIiwKLQkJCQlfX2Z1bmNfXywgY21kKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCXJldHVybiByYzsKLQkJfQotCi0JCW11dGV4X2xvY2soJmdfc2VydmVyX2Rldi5zZXJ2ZXJfcXVldWVfbG9jayk7Ci0JCWlmICghZ19zZXJ2ZXJfZGV2LnNlcnZlcl9xdWV1ZQotCQkJW3VfaXNwX2V2ZW50LmlzcF9kYXRhLmN0cmwucXVldWVfaWR4XS5xdWV1ZV9hY3RpdmUpIHsKLQkJCXByX2VycigiJXM6IEludmFsaWQgcXVldWVcbiIsIF9fZnVuY19fKTsKLQkJCW11dGV4X3VubG9jaygmZ19zZXJ2ZXJfZGV2LnNlcnZlcl9xdWV1ZV9sb2NrKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCXJldHVybiByYzsKLQkJfQotCQlxdWV1ZSA9ICZnX3NlcnZlcl9kZXYuc2VydmVyX3F1ZXVlCi0JCQlbdV9pc3BfZXZlbnQuaXNwX2RhdGEuY3RybC5xdWV1ZV9pZHhdLmV2ZW50RGF0YV9xOwotCQlldmVudF9jbWQgPSBtc21fZGVxdWV1ZShxdWV1ZSwgbGlzdF9ldmVudGRhdGEpOwotCQlpZiAoIWV2ZW50X2NtZCkgewotCQkJcHJfZXJyKCIlczogTm8gZXZlbnQgcGF5bG9hZFxuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJbXV0ZXhfdW5sb2NrKCZnX3NlcnZlcl9kZXYuc2VydmVyX3F1ZXVlX2xvY2spOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCWtfaXNwX2V2ZW50ID0gKHN0cnVjdCBtc21faXNwX2V2ZW50X2N0cmwgKikKLQkJCQlldmVudF9jbWQtPmNvbW1hbmQ7Ci0JCWZyZWVfcWNtZChldmVudF9jbWQpOwotCi0JCS8qIFNhdmUgdGhlIHBvaW50ZXIgb2YgdGhlIHVzZXIgYWxsb2NhdGVkIGNvbW1hbmQgYnVmZmVyKi8KLQkJdV9jdHJsX3ZhbHVlID0gdV9pc3BfZXZlbnQuaXNwX2RhdGEuY3RybC52YWx1ZTsKLQotCQkvKiBDb3B5IHRoZSBldmVudCBzdHJ1Y3R1cmUgaW50byB1c2VyIHN0cnVjdCovCi0JCXVfaXNwX2V2ZW50ID0gKmtfaXNwX2V2ZW50OwotCi0JCS8qIFJlc3RvcmUgdGhlIHNhdmVkIHBvaW50ZXIgb2YgdGhlIHVzZXIKLQkJICogYWxsb2NhdGVkIGNvbW1hbmQgYnVmZmVyLiAqLwotCQl1X2lzcF9ldmVudC5pc3BfZGF0YS5jdHJsLnZhbHVlID0gdV9jdHJsX3ZhbHVlOwotCi0JCS8qIENvcHkgdGhlIGN0cmwgY21kLCBpZiBwcmVzZW50Ki8KLQkJaWYgKGtfaXNwX2V2ZW50LT5pc3BfZGF0YS5jdHJsLmxlbmd0aCA+IDAgJiYKLQkJCWtfaXNwX2V2ZW50LT5pc3BfZGF0YS5jdHJsLnZhbHVlICE9IE5VTEwpIHsKLQkJCXZvaWQgKmtfY3RybF92YWx1ZSA9Ci0JCQkJa19pc3BfZXZlbnQtPmlzcF9kYXRhLmN0cmwudmFsdWU7Ci0JCQlpZiAoY29weV90b191c2VyKHVfY3RybF92YWx1ZSwga19jdHJsX3ZhbHVlLAotCQkJCSBrX2lzcF9ldmVudC0+aXNwX2RhdGEuY3RybC5sZW5ndGgpKSB7Ci0JCQkJcHJfZXJyKCIlcyBDb3B5IHRvIHVzZXIgZmFpbGVkIGZvciBjbWQgJWQiLAotCQkJCQlfX2Z1bmNfXywgY21kKTsKLQkJCQlrZnJlZShrX2lzcF9ldmVudC0+aXNwX2RhdGEuY3RybC52YWx1ZSk7Ci0JCQkJa2ZyZWUoa19pc3BfZXZlbnQpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQltdXRleF91bmxvY2soJmdfc2VydmVyX2Rldi5zZXJ2ZXJfcXVldWVfbG9jayk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlrZnJlZShrX2lzcF9ldmVudC0+aXNwX2RhdGEuY3RybC52YWx1ZSk7Ci0JCX0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilpb2N0bF9wdHItPmlvY3RsX3B0ciwKLQkJCSZ1X2lzcF9ldmVudCwgc2l6ZW9mKHN0cnVjdCBtc21faXNwX2V2ZW50X2N0cmwpKSkgewotCQkJcHJfZXJyKCIlcyBDb3B5IHRvIHVzZXIgZmFpbGVkIGZvciBjbWQgJWQiLAotCQkJCV9fZnVuY19fLCBjbWQpOwotCQkJa2ZyZWUoa19pc3BfZXZlbnQpOwotCQkJbXV0ZXhfdW5sb2NrKCZnX3NlcnZlcl9kZXYuc2VydmVyX3F1ZXVlX2xvY2spOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCWtmcmVlKGtfaXNwX2V2ZW50KTsKLQkJbXV0ZXhfdW5sb2NrKCZnX3NlcnZlcl9kZXYuc2VydmVyX3F1ZXVlX2xvY2spOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgTVNNX0NBTV9JT0NUTF9TRU5EX0VWRU5UOgotCQlyYyA9IG1zbV9zZXJ2ZXJfc2VuZF92NGwyX2V2dChhcmcpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgSU9DVEwgPSAlZCIsIF9fZnVuY19fLCBjbWQpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9vcGVuX3NlcnZlcihzdHJ1Y3QgZmlsZSAqZnApCi17Ci0JaW50IHJjID0gMDsKLQlEKCIlczogb3BlbiAlc1xuIiwgX19mdW5jX18sIGZwLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSk7Ci0JbXV0ZXhfbG9jaygmZ19zZXJ2ZXJfZGV2LnNlcnZlcl9sb2NrKTsKLQlnX3NlcnZlcl9kZXYudXNlX2NvdW50Kys7Ci0JaWYgKGdfc2VydmVyX2Rldi51c2VfY291bnQgPT0gMSkKLQkJZnAtPnByaXZhdGVfZGF0YSA9Ci0JCQkmZ19zZXJ2ZXJfZGV2LnNlcnZlcl9jb21tYW5kX3F1ZXVlLmV2ZW50SGFuZGxlOwotCW11dGV4X3VubG9jaygmZ19zZXJ2ZXJfZGV2LnNlcnZlcl9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2Nsb3NlX3NlcnZlcihzdHJ1Y3QgZmlsZSAqZnApCi17Ci0Jc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uIHN1YjsKLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCW11dGV4X2xvY2soJmdfc2VydmVyX2Rldi5zZXJ2ZXJfbG9jayk7Ci0JaWYgKGdfc2VydmVyX2Rldi51c2VfY291bnQgPiAwKQotCQlnX3NlcnZlcl9kZXYudXNlX2NvdW50LS07Ci0JbXV0ZXhfdW5sb2NrKCZnX3NlcnZlcl9kZXYuc2VydmVyX2xvY2spOwotCi0JaWYgKGdfc2VydmVyX2Rldi51c2VfY291bnQgPT0gMCkgewotCQlpbnQgaTsKLQkJbXV0ZXhfbG9jaygmZ19zZXJ2ZXJfZGV2LnNlcnZlcl9sb2NrKTsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fQUNUSVZFX0NBTUVSQTsgaSsrKSB7Ci0JCQlpZiAoZ19zZXJ2ZXJfZGV2LnBjYW1fYWN0aXZlW2ldKSB7Ci0JCQkJc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwgPSBOVUxMOwotCi0JCQkJcG1jdGwgPSBtc21fY2FtX3NlcnZlcl9nZXRfbWN0bCgKLQkJCQlnX3NlcnZlcl9kZXYucGNhbV9hY3RpdmVbaV0tPm1jdGxfaGFuZGxlKTsKLQkJCQlpZiAocG1jdGwgJiYgcG1jdGwtPm1jdGxfcmVsZWFzZSkgewotCQkJCQlwbWN0bC0+bWN0bF9yZWxlYXNlKHBtY3RsKTsKLQkJCQkJLypzbyB0aGF0IGl0IGlzbid0IGNsb3NlZCBhZ2FpbiovCi0JCQkJCXBtY3RsLT5tY3RsX3JlbGVhc2UgPSBOVUxMOwotCQkJCX0KLQkJCQlpZiAocG1jdGwpCi0JCQkJCW1zbV9jYW1fc2VydmVyX3NlbmRfZXJyb3JfZXZ0KHBtY3RsLAotCQkJCQkJVjRMMl9FVkVOVF9QUklWQVRFX1NUQVJUICsKLQkJCQkJCU1TTV9DQU1fQVBQX05PVElGWV9FUlJPUl9FVkVOVCk7Ci0JCQl9Ci0JCX0KLQkJc3ViLnR5cGUgPSBWNEwyX0VWRU5UX0FMTDsKLQkJdjRsMl9ldmVudF91bnN1YnNjcmliZSgKLQkJCSZnX3NlcnZlcl9kZXYuc2VydmVyX2NvbW1hbmRfcXVldWUuZXZlbnRIYW5kbGUsICZzdWIpOwotCQltdXRleF91bmxvY2soJmdfc2VydmVyX2Rldi5zZXJ2ZXJfbG9jayk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IG1zbV9wb2xsX3NlcnZlcihzdHJ1Y3QgZmlsZSAqZnAsCi0JCQkJCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlwb2xsX3dhaXQoZnAsCi0JCSAmZ19zZXJ2ZXJfZGV2LnNlcnZlcl9jb21tYW5kX3F1ZXVlLmV2ZW50SGFuZGxlLndhaXQsDQotCQkgd2FpdCk7Ci0JaWYgKHY0bDJfZXZlbnRfcGVuZGluZygmZ19zZXJ2ZXJfZGV2LnNlcnZlcl9jb21tYW5kX3F1ZXVlLmV2ZW50SGFuZGxlKSkKLQkJcmMgfD0gUE9MTFBSSTsKLQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9zZXJ2ZXJfZ2V0X3VzZWNvdW50KHZvaWQpCi17Ci0JcmV0dXJuIGdfc2VydmVyX2Rldi51c2VfY291bnQ7Ci19Ci0KLWludCBtc21fc2VydmVyX3VwZGF0ZV9zZW5zb3JfaW5mbyhzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSwKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2RhdGEpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmICghcGNhbSB8fCAhc2RhdGEpIHsKLQkJcHJfZXJyKCIlcyBJbnB1dCBkYXRhIGlzIG51bGwgIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlnX3NlcnZlcl9kZXYuY2FtZXJhX2luZm8udmlkZW9fZGV2X25hbWUKLQlbZ19zZXJ2ZXJfZGV2LmNhbWVyYV9pbmZvLm51bV9jYW1lcmFzXQotCT0gdmlkZW9fZGV2aWNlX25vZGVfbmFtZShwY2FtLT5wdmRldik7Ci0JRCgiJXMgQ29ubmVjdGVkIHZpZGVvIGRldmljZSAlc1xuIiwgX19mdW5jX18sCi0JCWdfc2VydmVyX2Rldi5jYW1lcmFfaW5mby52aWRlb19kZXZfbmFtZQotCQlbZ19zZXJ2ZXJfZGV2LmNhbWVyYV9pbmZvLm51bV9jYW1lcmFzXSk7Ci0KLQlnX3NlcnZlcl9kZXYuY2FtZXJhX2luZm8uc19tb3VudF9hbmdsZQotCVtnX3NlcnZlcl9kZXYuY2FtZXJhX2luZm8ubnVtX2NhbWVyYXNdCi0JPSBzZGF0YS0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPm1vdW50X2FuZ2xlOwotCi0JZ19zZXJ2ZXJfZGV2LmNhbWVyYV9pbmZvLmlzX2ludGVybmFsX2NhbQotCVtnX3NlcnZlcl9kZXYuY2FtZXJhX2luZm8ubnVtX2NhbWVyYXNdCi0JPSBzZGF0YS0+Y2FtZXJhX3R5cGU7Ci0KLQlnX3NlcnZlcl9kZXYubWN0bF9ub2RlX2luZm8ubWN0bF9ub2RlX25hbWUKLQlbZ19zZXJ2ZXJfZGV2Lm1jdGxfbm9kZV9pbmZvLm51bV9tY3RsX25vZGVzXQotCT0gdmlkZW9fZGV2aWNlX25vZGVfbmFtZShwY2FtLT5tY3RsX25vZGUucHZkZXYpOwotCi0JcHJfaW5mbygiJXMgbWN0bF9ub2RlX25hbWVbJWRdID0gJXNcbiIsIF9fZnVuY19fLAotCQlnX3NlcnZlcl9kZXYubWN0bF9ub2RlX2luZm8ubnVtX21jdGxfbm9kZXMsCi0JCWdfc2VydmVyX2Rldi5tY3RsX25vZGVfaW5mby5tY3RsX25vZGVfbmFtZQotCQlbZ19zZXJ2ZXJfZGV2Lm1jdGxfbm9kZV9pbmZvLm51bV9tY3RsX25vZGVzXSk7Ci0KLQkvKlRlbXBvcmFyeSBzb2x1dGlvbiB0byBzdG9yZSBpbmZvIGluIG1lZGlhIGRldmljZSBzdHJ1Y3R1cmUKLQkgIHVudGlsIHdlIGNhbiBleHBhbmQgbWVkaWEgZGV2aWNlIHN0cnVjdHVyZSB0byBzdXBwb3J0IG1vcmUKLQkgIGRldmljZSBpbmZvKi8KLQlzbnByaW50ZihwY2FtLT5tZWRpYV9kZXYuc2VyaWFsLAotCQkJc2l6ZW9mKHBjYW0tPm1lZGlhX2Rldi5zZXJpYWwpLAotCQkJIiVzLSVkLSVkIiwgUUNBTUVSQV9OQU1FLAotCQkJc2RhdGEtPnNlbnNvcl9wbGF0Zm9ybV9pbmZvLT5tb3VudF9hbmdsZSwKLQkJCXNkYXRhLT5jYW1lcmFfdHlwZSk7Ci0KLQlnX3NlcnZlcl9kZXYuY2FtZXJhX2luZm8ubnVtX2NhbWVyYXMrKzsKLQlnX3NlcnZlcl9kZXYubWN0bF9ub2RlX2luZm8ubnVtX21jdGxfbm9kZXMrKzsKLQotCUQoIiVzIGRvbmUsIHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JRCgiJXMgbnVtYmVyIG9mIHNlbnNvcnMgY29ubmVjdGVkIGlzICVkXG4iLCBfX2Z1bmNfXywKLQkJZ19zZXJ2ZXJfZGV2LmNhbWVyYV9pbmZvLm51bV9jYW1lcmFzKTsKLQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9zZXJ2ZXJfYmVnaW5fc2Vzc2lvbihzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSwKLQlpbnQgc2VydmVyX3FfaWR4KQotewotCWludCByYyA9IC1FSU5WQUwsIGdlc19ldnQ7Ci0Jc3RydWN0IG1zbV9jYW1fc2VydmVyX3F1ZXVlICpxdWV1ZTsKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bDsKLQotCWlmICghcGNhbSkgewotCQlwcl9lcnIoIiVzIHBjYW0gcGFzc2VkIGlzIG51bGwgIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JZ2VzX2V2dCA9IE1TTV9WNEwyX0dFU19DQU1fT1BFTjsKLQlEKCIlcyBzZW5kIGdlc3R1cmUgZXZ0XG4iLCBfX2Z1bmNfXyk7Ci0JbXNtX2NhbV9zZXJ2ZXJfc3ViZGV2X25vdGlmeShnX3NlcnZlcl9kZXYuZ2VzdHVyZV9kZXZpY2UsCi0JCU5PVElGWV9HRVNUVVJFX0NBTV9FVlQsICZnZXNfZXZ0KTsKLQotCXBjYW0tPnNlcnZlcl9xdWV1ZV9pZHggPSBzZXJ2ZXJfcV9pZHg7Ci0JcXVldWUgPSAmZ19zZXJ2ZXJfZGV2LnNlcnZlcl9xdWV1ZVtzZXJ2ZXJfcV9pZHhdOwotCXF1ZXVlLT5jdHJsX2RhdGEgPSBremFsbG9jKHNpemVvZih1aW50OF90KSAqCi0JCQlNQVhfU0VSVkVSX1BBWUxPQURfTEVOR1RILCBHRlBfS0VSTkVMKTsKLQlpZiAocXVldWUtPmN0cmxfZGF0YSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yOwotCX0KLQltc21fcXVldWVfaW5pdCgmcXVldWUtPmN0cmxfcSwgImNvbnRyb2wiKTsKLQltc21fcXVldWVfaW5pdCgmcXVldWUtPmV2ZW50RGF0YV9xLCAiZXZlbnRkYXRhIik7Ci0JcXVldWUtPnF1ZXVlX2FjdGl2ZSA9IDE7Ci0JcmMgPSBtc21fY2FtX3NlcnZlcl9vcGVuX3Nlc3Npb24oJmdfc2VydmVyX2RldiwgcGNhbSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBjYW1fc2VydmVyX29wZW5fc2Vzc2lvbiBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCXBtY3RsID0gbXNtX2NhbV9zZXJ2ZXJfZ2V0X21jdGwocGNhbS0+bWN0bF9oYW5kbGUpOwotCWlmICghcG1jdGwpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBtY3RsIGNvbnRyb2xsZXIiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotI2lmZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0JCXBtY3RsLT5kb21haW4gPSBtc21fY2FtX3NlcnZlcl9nZXRfZG9tYWluKCk7Ci0JCXBtY3RsLT5kb21haW5fbnVtID0gbXNtX2NhbV9zZXJ2ZXJfZ2V0X2RvbWFpbl9udW0oKTsKLSNlbmRpZgotCXJjID0gbWFwX2ltZW1fYWRkcmVzc2VzKHBtY3RsKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXNGYWlsZWQgdG8gbWFwIGltZW0gYWRkcmVzc2VzICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCXJldHVybiByYzsKLWVycm9yOgotCWdlc19ldnQgPSBNU01fVjRMMl9HRVNfQ0FNX0NMT1NFOwotCW1zbV9jYW1fc2VydmVyX3N1YmRldl9ub3RpZnkoZ19zZXJ2ZXJfZGV2Lmdlc3R1cmVfZGV2aWNlLAotCQlOT1RJRllfR0VTVFVSRV9DQU1fRVZULCAmZ2VzX2V2dCk7Ci0KLQlxdWV1ZS0+cXVldWVfYWN0aXZlID0gMDsKLQltc21fZHJhaW5fZXZlbnRxKCZxdWV1ZS0+ZXZlbnREYXRhX3EpOwotCW1zbV9xdWV1ZV9kcmFpbigmcXVldWUtPmN0cmxfcSwgbGlzdF9jb250cm9sKTsKLQlrZnJlZShxdWV1ZS0+Y3RybF9kYXRhKTsKLQlxdWV1ZS0+Y3RybF9kYXRhID0gTlVMTDsKLQlxdWV1ZSA9IE5VTEw7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX3NlcnZlcl9lbmRfc2Vzc2lvbihzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSkKLXsKLQlpbnQgcmMgPSAtRUlOVkFMLCBnZXNfZXZ0OwotCXN0cnVjdCBtc21fY2FtX3NlcnZlcl9xdWV1ZSAqcXVldWU7Ci0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGw7Ci0KLQltdXRleF9sb2NrKCZnX3NlcnZlcl9kZXYuc2VydmVyX3F1ZXVlX2xvY2spOwotCXF1ZXVlID0gJmdfc2VydmVyX2Rldi5zZXJ2ZXJfcXVldWVbcGNhbS0+c2VydmVyX3F1ZXVlX2lkeF07Ci0JcXVldWUtPnF1ZXVlX2FjdGl2ZSA9IDA7Ci0Ja2ZyZWUocXVldWUtPmN0cmxfZGF0YSk7Ci0JcXVldWUtPmN0cmxfZGF0YSA9IE5VTEw7Ci0JbXNtX3F1ZXVlX2RyYWluKCZxdWV1ZS0+Y3RybF9xLCBsaXN0X2NvbnRyb2wpOwotCW1zbV9kcmFpbl9ldmVudHEoJnF1ZXVlLT5ldmVudERhdGFfcSk7Ci0JbXV0ZXhfdW5sb2NrKCZnX3NlcnZlcl9kZXYuc2VydmVyX3F1ZXVlX2xvY2spOwotCi0JcG1jdGwgPSBtc21fY2FtX3NlcnZlcl9nZXRfbWN0bChwY2FtLT5tY3RsX2hhbmRsZSk7Ci0JaWYgKCFwbWN0bCkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIG1jdGwgY29udHJvbGxlciIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXVubWFwX2ltZW1fYWRkcmVzc2VzKHBtY3RsKTsKLQotCXJjID0gbXNtX2NhbV9zZXJ2ZXJfY2xvc2Vfc2Vzc2lvbigmZ19zZXJ2ZXJfZGV2LCBwY2FtKTsKLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoIm1zbV9jYW1fc2VydmVyX2Nsb3NlX3Nlc3Npb24gZmFpbHMgJWRcbiIsIHJjKTsKLQotCWdlc19ldnQgPSBNU01fVjRMMl9HRVNfQ0FNX0NMT1NFOwotCW1zbV9jYW1fc2VydmVyX3N1YmRldl9ub3RpZnkoZ19zZXJ2ZXJfZGV2Lmdlc3R1cmVfZGV2aWNlLAotCQkJTk9USUZZX0dFU1RVUkVfQ0FNX0VWVCwgJmdlc19ldnQpOwotCi0JcmV0dXJuIHJjOwotfQotCi0vKiBJbml0IGEgY29uZmlnIG5vZGUgZm9yIElTUCBjb250cm9sLAotICogd2hpY2ggd2lsbCBjcmVhdGUgYSBjb25maWcgZGV2aWNlICgvZGV2L2NvbmZpZzAvIGFuZCBwbHVnIGluCi0gKiBJU1AncyBvcGVyYXRpb24gInY0bDJfaW9jdGxfb3BzKiIKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBtc21fZm9wc19zZXJ2ZXIgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gID0gbXNtX29wZW5fc2VydmVyLAotCS5wb2xsICA9IG1zbV9wb2xsX3NlcnZlciwKLQkudW5sb2NrZWRfaW9jdGwgPSB2aWRlb19pb2N0bDIsCi0JLnJlbGVhc2UgPSBtc21fY2xvc2Vfc2VydmVyLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyBtc21faW9jdGxfb3BzX3NlcnZlciA9IHsKLQkudmlkaW9jX3N1YnNjcmliZV9ldmVudCA9IG1zbV9zZXJ2ZXJfdjRsMl9zdWJzY3JpYmVfZXZlbnQsCi0JLnZpZGlvY191bnN1YnNjcmliZV9ldmVudCA9IHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUsCi0JLnZpZGlvY19kZWZhdWx0ID0gbXNtX2lvY3RsX3NlcnZlciwKLX07Ci0KLXN0YXRpYyB1aW50MzJfdCBtc21fY2FtZXJhX3NlcnZlcl9maW5kX21jdGwoCi0JCXVuc2lnbmVkIGludCBub3RpZmljYXRpb24sIHZvaWQgKmFyZykKLXsKLQlpbnQgaTsKLQl1aW50MzJfdCBpbnRlcmZhY2U7Ci0Jc3dpdGNoIChub3RpZmljYXRpb24pIHsKLQljYXNlIE5PVElGWV9JU1BfTVNHX0VWVDoKLQkJaWYgKCgoc3RydWN0IGlzcF9tc2dfZXZlbnQgKilhcmcpLT5tc2dfaWQgPT0KLQkJCU1TR19JRF9SREkwX1VQREFURV9BQ0spCi0JCQlpbnRlcmZhY2UgPSBSRElfMDsKLQkJZWxzZSBpZiAoKChzdHJ1Y3QgaXNwX21zZ19ldmVudCAqKWFyZyktPm1zZ19pZCA9PQotCQkJTVNHX0lEX1JESTFfVVBEQVRFX0FDSykKLQkJCWludGVyZmFjZSA9IFJESV8xOwotCQllbHNlCi0JCQlpbnRlcmZhY2UgPSBQSVhfMDsKLQkJYnJlYWs7Ci0JY2FzZSBOT1RJRllfVkZFX01TR19PVVQ6Ci0JCWlmICgoKHN0cnVjdCBpc3BfbXNnX291dHB1dCAqKWFyZyktPm91dHB1dF9pZCA9PQotCQkJCQlNU0dfSURfT1VUUFVUX1RFUlRJQVJZMSkKLQkJCWludGVyZmFjZSA9IFJESV8wOwotCQllbHNlIGlmICgoKHN0cnVjdCBpc3BfbXNnX291dHB1dCAqKWFyZyktPm91dHB1dF9pZCA9PQotCQkJCQkJTVNHX0lEX09VVFBVVF9URVJUSUFSWTIpCi0JCQlpbnRlcmZhY2UgPSBSRElfMTsKLQkJZWxzZQotCQkJaW50ZXJmYWNlID0gUElYXzA7Ci0JCWJyZWFrOwotCWNhc2UgTk9USUZZX1ZGRV9CVUZfRVZUOiB7Ci0JCXN0cnVjdCBtc21fdmZlX3Jlc3AgKnJwOwotCQlzdHJ1Y3QgbXNtX2ZyYW1lX2luZm8gKmZyYW1lX2luZm87Ci0JCXVpbnQ4X3Qgdm5vZGVfaWQ7Ci0KLQkJcnAgPSAoc3RydWN0IG1zbV92ZmVfcmVzcCAqKWFyZzsKLQkJZnJhbWVfaW5mbyA9IHJwLT5ldnRfbXNnLmRhdGE7Ci0JCWlmICghZnJhbWVfaW5mbykgewotCQkJaW50ZXJmYWNlID0gUElYXzA7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoZnJhbWVfaW5mby0+aW5zdF9oYW5kbGUpIHsKLQkJCXZub2RlX2lkID0gR0VUX0RFVklEX01PREUoZnJhbWVfaW5mby0+aW5zdF9oYW5kbGUpOwotCQkJaWYgKHZub2RlX2lkIDwgTUFYX05VTV9BQ1RJVkVfQ0FNRVJBICYmCi0JCQkJZ19zZXJ2ZXJfZGV2Lm9wZW5lZF9wY2FtW3Zub2RlX2lkXSkgewotCQkJCXJldHVybiBnX3NlcnZlcl9kZXYuCi0JCQkJCW9wZW5lZF9wY2FtW3Zub2RlX2lkXS0+bWN0bF9oYW5kbGU7Ci0JCQl9IGVsc2UgewotCQkJCXByX2VycigiJXM6IGNhbm5vdCBmaW5kIG1jdGwgaGFuZGxlIiwgX19mdW5jX18pOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGZyYW1lX2luZm8tPnBhdGggPT0gVkZFX01TR19PVVRQVVRfVEVSVElBUlkxKQotCQkJCWludGVyZmFjZSA9IFJESV8wOwotCQkJZWxzZSBpZiAoZnJhbWVfaW5mby0+cGF0aCA9PSBWRkVfTVNHX09VVFBVVF9URVJUSUFSWTIpCi0JCQkJaW50ZXJmYWNlID0gUkRJXzE7Ci0JCQllbHNlCi0JCQkJaW50ZXJmYWNlID0gUElYXzA7Ci0JCX0KLQkJfQotCQlicmVhazsKLQljYXNlIE5PVElGWV9BWElfUkRJX1NPRl9DT1VOVDogewotCQlzdHJ1Y3QgcmRpX2NvdW50X21zZyAqbXNnID0gKHN0cnVjdCByZGlfY291bnRfbXNnICopYXJnOwotCQlpbnRlcmZhY2UgPSBtc2ctPnJkaV9pbnRlcmZhY2U7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBOT1RJRllfVkZFX01TR19TVEFUUzoKLQljYXNlIE5PVElGWV9WRkVfTVNHX0NPTVBfU1RBVFM6Ci0JY2FzZSBOT1RJRllfVkZFX0NBTUlGX0VSUk9SOgotCWRlZmF1bHQ6Ci0JCWludGVyZmFjZSA9IFBJWF8wOwotCQlicmVhazsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IElOVEZfTUFYOyBpKyspIHsKLQkJaWYgKGludGVyZmFjZSA9PSBnX3NlcnZlcl9kZXYuaW50ZXJmYWNlX21hcF90YWJsZVtpXS5pbnRlcmZhY2UpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPT0gSU5URl9NQVgpIHsKLQkJcHJfZXJyKCIlczogQ2Fubm90IGZpbmQgdmFsaWQgaW50ZXJmYWNlIG1hcFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9IGVsc2UKLQkJcmV0dXJuIGdfc2VydmVyX2Rldi5pbnRlcmZhY2VfbWFwX3RhYmxlW2ldLm1jdGxfaGFuZGxlOwotfQotCi1zdGF0aWMgdm9pZCBtc21fY2FtX3NlcnZlcl9zdWJkZXZfbm90aWZ5KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQkJdW5zaWduZWQgaW50IG5vdGlmaWNhdGlvbiwgdm9pZCAqYXJnKQotewotCWludCByYyA9IC1FSU5WQUw7Ci0JdWludDMyX3QgbWN0bF9oYW5kbGUgPSAwOwotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBfbWN0bCA9IE5VTEw7Ci0JaW50IGlzX2dlc3R1cmVfZXZ0ID0KLQkJKG5vdGlmaWNhdGlvbiA9PSBOT1RJRllfR0VTVFVSRV9FVlQpCi0JCXx8IChub3RpZmljYXRpb24gPT0gTk9USUZZX0dFU1RVUkVfQ0FNX0VWVCk7Ci0KLQlpZiAoIWlzX2dlc3R1cmVfZXZ0KSB7Ci0JCW1jdGxfaGFuZGxlID0gbXNtX2NhbWVyYV9zZXJ2ZXJfZmluZF9tY3RsKG5vdGlmaWNhdGlvbiwgYXJnKTsKLQkJaWYgKG1jdGxfaGFuZGxlIDwgMCkgewotCQkJcHJfZXJyKCIlczogQ291bGRuJ3QgZmluZCBtY3RsIGluc3RhbmNlIVxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCXN3aXRjaCAobm90aWZpY2F0aW9uKSB7Ci0JY2FzZSBOT1RJRllfSVNQX01TR19FVlQ6Ci0JY2FzZSBOT1RJRllfVkZFX01TR19PVVQ6Ci0JY2FzZSBOT1RJRllfVkZFX1BJWF9TT0ZfQ09VTlQ6Ci0JY2FzZSBOT1RJRllfVkZFX01TR19TVEFUUzoKLQljYXNlIE5PVElGWV9WRkVfTVNHX0NPTVBfU1RBVFM6Ci0JY2FzZSBOT1RJRllfVkZFX0JVRl9FVlQ6Ci0JCXBfbWN0bCA9IG1zbV9jYW1fc2VydmVyX2dldF9tY3RsKG1jdGxfaGFuZGxlKTsKLQkJaWYgKHBfbWN0bCAmJiBwX21jdGwtPmlzcF9ub3RpZnkgJiYgcF9tY3RsLT52ZmVfc2RldikKLQkJCXJjID0gcF9tY3RsLT5pc3Bfbm90aWZ5KHBfbWN0bCwKLQkJCQlwX21jdGwtPnZmZV9zZGV2LCBub3RpZmljYXRpb24sIGFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgTk9USUZZX1ZGRV9JUlE6ewotCQlzdHJ1Y3QgbXNtX3ZmZV9jZmdfY21kIGNmZ19jbWQ7Ci0JCXN0cnVjdCBtc21fY2FtdmZlX3BhcmFtcyB2ZmVfcGFyYW1zOwotCQljZmdfY21kLmNtZF90eXBlID0gQ01EX1ZGRV9QUk9DRVNTX0lSUTsKLQkJdmZlX3BhcmFtcy52ZmVfY2ZnID0gJmNmZ19jbWQ7Ci0JCXZmZV9wYXJhbXMuZGF0YSA9IGFyZzsKLQkJcmMgPSB2NGwyX3N1YmRldl9jYWxsKHNkLAotCQkJY29yZSwgaW9jdGwsIDAsICZ2ZmVfcGFyYW1zKTsKLQl9Ci0JCWJyZWFrOwotCWNhc2UgTk9USUZZX0FYSV9JUlE6Ci0JCXJjID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgY29yZSwgaW9jdGwsIFZJRElPQ19NU01fQVhJX0lSUSwgYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBOT1RJRllfQVhJX1JESV9TT0ZfQ09VTlQ6Ci0JCXBfbWN0bCA9IG1zbV9jYW1fc2VydmVyX2dldF9tY3RsKG1jdGxfaGFuZGxlKTsKLQkJaWYgKHBfbWN0bCAmJiBwX21jdGwtPmF4aV9zZGV2KQotCQkJcmMgPSB2NGwyX3N1YmRldl9jYWxsKHBfbWN0bC0+YXhpX3NkZXYsIGNvcmUsIGlvY3RsLAotCQkJCVZJRElPQ19NU01fQVhJX1JESV9DT1VOVF9VUERBVEUsIGFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgTk9USUZZX1BDTEtfQ0hBTkdFOgotCQlwX21jdGwgPSB2NGwyX2dldF9zdWJkZXZfaG9zdGRhdGEoc2QpOwotCQlpZiAocF9tY3RsKSB7Ci0JCQlpZiAocF9tY3RsLT5heGlfc2RldikKLQkJCQlyYyA9IHY0bDJfc3ViZGV2X2NhbGwocF9tY3RsLT5heGlfc2RldiwgdmlkZW8sCi0JCQkJc19jcnlzdGFsX2ZyZXEsICoodWludDMyX3QgKilhcmcsIDApOwotCQkJZWxzZQotCQkJCXJjID0gdjRsMl9zdWJkZXZfY2FsbChwX21jdGwtPnZmZV9zZGV2LCB2aWRlbywKLQkJCQlzX2NyeXN0YWxfZnJlcSwgKih1aW50MzJfdCAqKWFyZywgMCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBOT1RJRllfR0VTVFVSRV9FVlQ6Ci0JCXJjID0gdjRsMl9zdWJkZXZfY2FsbChnX3NlcnZlcl9kZXYuZ2VzdHVyZV9kZXZpY2UsCi0JCQljb3JlLCBpb2N0bCwgVklESU9DX01TTV9HRVNUVVJFX0VWVCwgYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBOT1RJRllfR0VTVFVSRV9DQU1fRVZUOgotCQlyYyA9IHY0bDJfc3ViZGV2X2NhbGwoZ19zZXJ2ZXJfZGV2Lmdlc3R1cmVfZGV2aWNlLAotCQkJY29yZSwgaW9jdGwsIFZJRElPQ19NU01fR0VTVFVSRV9DQU1fRVZULCBhcmcpOwotCQlicmVhazsKLQljYXNlIE5PVElGWV9WRkVfQ0FNSUZfRVJST1I6IHsKLQkJcF9tY3RsID0gbXNtX2NhbV9zZXJ2ZXJfZ2V0X21jdGwobWN0bF9oYW5kbGUpOwotCQlpZiAocF9tY3RsKQotCQkJbXNtX2NhbV9zZXJ2ZXJfc2VuZF9lcnJvcl9ldnQocF9tY3RsLAotCQkJCVY0TDJfRVZFTlRfUFJJVkFURV9TVEFSVCArCi0JCQkJTVNNX0NBTV9BUFBfTk9USUZZX0VSUk9SX0VWRU5UKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybjsKLX0KLQotdm9pZCBtc21fY2FtX3JlbGVhc2Vfc3ViZGV2X25vZGUoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKLXsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7Ci0Jc2QtPmRldm5vZGUgPSBOVUxMOwotCWtmcmVlKHZkZXYpOwotfQotCi0vKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBpcnFfaWR4IGNvcnJlc3BvbmRpbmcKLSAqIHRvIHRoZSBpcnFfbnVtLiAqLwotaW50IGdldF9pcnFfaWR4X2Zyb21faXJxX251bShpbnQgaXJxX251bSkKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgQ0FNRVJBX1NTX0lSUV9NQVg7IGkrKykKLQkJaWYgKGlycV9udW0gPT0gZ19zZXJ2ZXJfZGV2Lmh3X2lycW1hcFtpXS5pcnFfbnVtKQotCQkJcmV0dXJuIGdfc2VydmVyX2Rldi5od19pcnFtYXBbaV0uaXJxX2lkeDsKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2ICAqbXNtX2NhbV9maW5kX3N1YmRldl9ub2RlKAotCXN0cnVjdCB2NGwyX3N1YmRldiAqKnNkX2xpc3QsIHUzMiByZXZpc2lvbl9udW0pCi17Ci0JaW50IGkgPSAwOwotCWZvciAoaSA9IDA7IHNkX2xpc3RbaV0gIT0gTlVMTDsgaSsrKSB7Ci0JCWlmIChzZF9saXN0W2ldLT5lbnRpdHkucmV2aXNpb24gPT0gcmV2aXNpb25fbnVtKSB7Ci0JCQlyZXR1cm4gc2RfbGlzdFtpXTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1pbnQgbXNtX21jdGxfZmluZF9zZW5zb3Jfc3ViZGV2cyhzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwX21jdGwsCi0JdWludDhfdCBjc2lwaHlfY29yZV9pbmRleCwgdWludDhfdCBjc2lkX2NvcmVfaW5kZXgpCi17Ci0JaW50IHJjID0gLUVOT0RFVjsKLQotCXY0bDJfc2V0X3N1YmRldl9ob3N0ZGF0YShwX21jdGwtPnNlbnNvcl9zZGV2LCBwX21jdGwpOwotCi0JcmMgPSBtc21fY3NpX3JlZ2lzdGVyX3N1YmRldnMocF9tY3RsLCBjc2lwaHlfY29yZV9pbmRleCwKLQkJY3NpZF9jb3JlX2luZGV4LCAmZ19zZXJ2ZXJfZGV2KTsKLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgZmluZCBzZW5zb3Igc3ViZGV2c1xuIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX21jdGxfZmluZF9mbGFzaF9zdWJkZXYoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcF9tY3RsLAotCXVpbnQ4X3QgaW5kZXgpCi17Ci0JaWYgKGluZGV4IDwgTUFYX05VTV9GTEFTSF9ERVYpCi0JCXBfbWN0bC0+Zmxhc2hfc2RldiA9IGdfc2VydmVyX2Rldi5mbGFzaF9kZXZpY2VbaW5kZXhdOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgbXNtX2NhbWVyYV9zZXJ2ZXJfcGFyc2VfaXJxKGludCBpcnFfbnVtLCB2b2lkICpkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGlycV9pZHgsIGksIHJjOwotCXUzMiBzdGF0dXMgPSAwOwotCXN0cnVjdCBpbnRyX3RhYmxlX2VudHJ5ICppbmRfaXJxX3RibDsKLQlzdHJ1Y3QgaW50cl90YWJsZV9lbnRyeSAqY29tcF9pcnFfdGJsOwotCWJvb2wgc3ViZGV2X2hhbmRsZWQgPSAwOwotCi0JaXJxX2lkeCA9IGdldF9pcnFfaWR4X2Zyb21faXJxX251bShpcnFfbnVtKTsKLQlpZiAoaXJxX2lkeCA8IDApIHsKLQkJcHJfZXJyKCJzZXJ2ZXJfcGFyc2VfaXJxOiBubyBjbGllbnRzIGZvciBpcnEgIyVkLiByZXR1cm5pbmcgIiwKLQkJCWlycV9udW0pOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmdfc2VydmVyX2Rldi5pbnRyX3RhYmxlX2xvY2ssIGZsYWdzKTsKLQlpbmRfaXJxX3RibCA9ICZnX3NlcnZlcl9kZXYuaXJxX2xrdXBfdGFibGUuaW5kX2ludHJfdGJsWzBdOwotCWNvbXBfaXJxX3RibCA9ICZnX3NlcnZlcl9kZXYuaXJxX2xrdXBfdGFibGUuY29tcF9pbnRyX3RibFswXTsKLQlpZiAoaW5kX2lycV90YmxbaXJxX2lkeF0uaXNfY29tcG9zaXRlKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBjb21wX2lycV90YmxbaXJxX2lkeF0ubnVtX2h3Y29yZTsgaSsrKSB7Ci0JCQlpZiAoY29tcF9pcnFfdGJsW2lycV9pZHhdLnN1YmRldl9saXN0W2ldKSB7Ci0JCQkJcmMgPSB2NGwyX3N1YmRldl9jYWxsKAotCQkJCQljb21wX2lycV90YmxbaXJxX2lkeF0uc3ViZGV2X2xpc3RbaV0sCi0JCQkJCWNvcmUsIGludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmUsCi0JCQkJCXN0YXR1cywgJnN1YmRldl9oYW5kbGVkKTsKLQkJCQlpZiAoKHJjIDwgMCkgfHwgIXN1YmRldl9oYW5kbGVkKSB7Ci0JCQkJCXByX2Vycigic2VydmVyX3BhcnNlX2lycTpFcnJvclxuIgotCQkJCQkJImhhbmRsaW5nIGlycSAlZCByYyA9ICVkIiwKLQkJCQkJCWlycV9udW0sIHJjKTsKLQkJCQkJLyogRGlzcGF0Y2ggdGhlIGlycSB0byB0aGUgcmVtYWluaW5nCi0JCQkJCSAqIHN1YmRldnMgaW4gdGhlIGxpc3QuICovCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCXJjID0gdjRsMl9zdWJkZXZfY2FsbChpbmRfaXJxX3RibFtpcnFfaWR4XS5zdWJkZXZfbGlzdFswXSwKLQkJCWNvcmUsIGludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmUsCi0JCQlzdGF0dXMsICZzdWJkZXZfaGFuZGxlZCk7Ci0JCWlmICgocmMgPCAwKSB8fCAhc3ViZGV2X2hhbmRsZWQpIHsKLQkJCXByX2Vycigic2VydmVyX3BhcnNlX2lycTogRXJyb3IgaGFuZGxpbmcgaXJxICVkIHJjID0gJWQiLAotCQkJCWlycV9udW0sIHJjKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfc2VydmVyX2Rldi5pbnRyX3RhYmxlX2xvY2ssCi0JCQkJZmxhZ3MpOwotCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfc2VydmVyX2Rldi5pbnRyX3RhYmxlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGlycV9pZHggY29ycmVzcG9uZGluZwotICogdG8gdGhlIGNhbWVyYSBod2NvcmUuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIF9vbmx5XwotICogYmUgaW52b2tlZCB3aGVuIHRoZSBJUlEgUm91dGVyIGlzIGNvbmZpZ3VyZWQKLSAqIG5vbi1jb21wb3NpdGUgbW9kZS4gKi8KLWludCBnZXRfaXJxX2lkeF9mcm9tX2NhbWh3X2lkeChpbnQgY2FtX2h3X2lkeCkKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgTVNNX0NBTV9IV19NQVg7IGkrKykKLQkJaWYgKGNhbV9od19pZHggPT0gZ19zZXJ2ZXJfZGV2Lmh3X2lycW1hcFtpXS5jYW1faHdfaWR4KQotCQkJcmV0dXJuIGdfc2VydmVyX2Rldi5od19pcnFtYXBbaV0uaXJxX2lkeDsKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2NvbXBpcnFfc3ViZGV2X2luZm8oCi0Jc3RydWN0IGludHJfdGFibGVfZW50cnkgKmlycV9lbnRyeSwKLQl1aW50MzJfdCBjYW1faHdfbWFzaywgdWludDhfdCBjYW1faHdfaWQsCi0JaW50ICpudW1faHdjb3JlKQotewotCWlmIChjYW1faHdfbWFzayAmICgweDEgPDwgY2FtX2h3X2lkKSkgewotCQkvKiBJZiB0aGUgbWFzayBoYXMgYmVlbiBzZXQgZm9yIHRoaXMgY2FtIGh3Y29yZQotCQkgKiB1cGRhdGUgdGhlIHN1YmRldiBwdHIuLi4uLi4qLwotCQlpcnFfZW50cnktPnN1YmRldl9saXN0W2NhbV9od19pZF0gPQotCQkJZ19zZXJ2ZXJfZGV2LnN1YmRldl90YWJsZVtjYW1faHdfaWRdOwotCQkoKm51bV9od2NvcmUpKys7Ci0JfSBlbHNlIHsKLQkJLyouLi4uZWxzZSwganVzdCBjbGVhciBpdCwgc28gdGhhdCB0aGUgaXJxIHdpbGwKLQkJICogbm90IGJlIGRpc3BhdGNoZWQgdG8gdGhpcyBody4gKi8KLQkJaXJxX2VudHJ5LT5zdWJkZXZfbGlzdFtjYW1faHdfaWRdID0gTlVMTDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3NlcnZlcl91cGRhdGVfY29tcG9zaXRlX2lycV9pbmZvKAotCXN0cnVjdCBpbnRyX3RhYmxlX2VudHJ5ICppcnFfcmVxKQotewotCWludCBudW1faHdjb3JlID0gMCwgcmMgPSAwOwotCXN0cnVjdCBpbnRyX3RhYmxlX2VudHJ5ICpjb21wX2lycV90YmwgPQotCQkmZ19zZXJ2ZXJfZGV2LmlycV9sa3VwX3RhYmxlLmNvbXBfaW50cl90YmxbMF07Ci0KLQljb21wX2lycV90YmxbaXJxX3JlcS0+aXJxX2lkeF0uaXNfY29tcG9zaXRlID0gMTsKLQljb21wX2lycV90YmxbaXJxX3JlcS0+aXJxX2lkeF0uaXJxX3RyaWdnZXJfdHlwZSA9Ci0JCWlycV9yZXEtPmlycV90cmlnZ2VyX3R5cGU7Ci0JY29tcF9pcnFfdGJsW2lycV9yZXEtPmlycV9pZHhdLm51bV9od2NvcmUgPSBpcnFfcmVxLT5udW1faHdjb3JlOwotCi0JdXBkYXRlX2NvbXBpcnFfc3ViZGV2X2luZm8oJmNvbXBfaXJxX3RibFtpcnFfcmVxLT5pcnFfaWR4XSwKLQkJaXJxX3JlcS0+Y2FtX2h3X21hc2ssIE1TTV9DQU1fSFdfTUlDUk8sICZudW1faHdjb3JlKTsKLQotCXVwZGF0ZV9jb21waXJxX3N1YmRldl9pbmZvKCZjb21wX2lycV90YmxbaXJxX3JlcS0+aXJxX2lkeF0sCi0JCWlycV9yZXEtPmNhbV9od19tYXNrLCBNU01fQ0FNX0hXX0NDSSwgJm51bV9od2NvcmUpOwotCi0JdXBkYXRlX2NvbXBpcnFfc3ViZGV2X2luZm8oJmNvbXBfaXJxX3RibFtpcnFfcmVxLT5pcnFfaWR4XSwKLQkJaXJxX3JlcS0+Y2FtX2h3X21hc2ssIE1TTV9DQU1fSFdfQ1NJMCwgJm51bV9od2NvcmUpOwotCi0JdXBkYXRlX2NvbXBpcnFfc3ViZGV2X2luZm8oJmNvbXBfaXJxX3RibFtpcnFfcmVxLT5pcnFfaWR4XSwKLQkJaXJxX3JlcS0+Y2FtX2h3X21hc2ssIE1TTV9DQU1fSFdfQ1NJMSwgJm51bV9od2NvcmUpOwotCi0JdXBkYXRlX2NvbXBpcnFfc3ViZGV2X2luZm8oJmNvbXBfaXJxX3RibFtpcnFfcmVxLT5pcnFfaWR4XSwKLQkJaXJxX3JlcS0+Y2FtX2h3X21hc2ssIE1TTV9DQU1fSFdfQ1NJMiwgJm51bV9od2NvcmUpOwotCi0JdXBkYXRlX2NvbXBpcnFfc3ViZGV2X2luZm8oJmNvbXBfaXJxX3RibFtpcnFfcmVxLT5pcnFfaWR4XSwKLQkJaXJxX3JlcS0+Y2FtX2h3X21hc2ssIE1TTV9DQU1fSFdfQ1NJMywgJm51bV9od2NvcmUpOwotCi0JdXBkYXRlX2NvbXBpcnFfc3ViZGV2X2luZm8oJmNvbXBfaXJxX3RibFtpcnFfcmVxLT5pcnFfaWR4XSwKLQkJaXJxX3JlcS0+Y2FtX2h3X21hc2ssIE1TTV9DQU1fSFdfSVNQSUYsICZudW1faHdjb3JlKTsKLQotCXVwZGF0ZV9jb21waXJxX3N1YmRldl9pbmZvKCZjb21wX2lycV90YmxbaXJxX3JlcS0+aXJxX2lkeF0sCi0JCWlycV9yZXEtPmNhbV9od19tYXNrLCBNU01fQ0FNX0hXX0NQUCwgJm51bV9od2NvcmUpOwotCi0JdXBkYXRlX2NvbXBpcnFfc3ViZGV2X2luZm8oJmNvbXBfaXJxX3RibFtpcnFfcmVxLT5pcnFfaWR4XSwKLQkJaXJxX3JlcS0+Y2FtX2h3X21hc2ssIE1TTV9DQU1fSFdfVkZFMCwgJm51bV9od2NvcmUpOwotCi0JdXBkYXRlX2NvbXBpcnFfc3ViZGV2X2luZm8oJmNvbXBfaXJxX3RibFtpcnFfcmVxLT5pcnFfaWR4XSwKLQkJaXJxX3JlcS0+Y2FtX2h3X21hc2ssIE1TTV9DQU1fSFdfVkZFMSwgJm51bV9od2NvcmUpOwotCi0JdXBkYXRlX2NvbXBpcnFfc3ViZGV2X2luZm8oJmNvbXBfaXJxX3RibFtpcnFfcmVxLT5pcnFfaWR4XSwKLQkJaXJxX3JlcS0+Y2FtX2h3X21hc2ssIE1TTV9DQU1fSFdfSlBFRzAsICZudW1faHdjb3JlKTsKLQotCXVwZGF0ZV9jb21waXJxX3N1YmRldl9pbmZvKCZjb21wX2lycV90YmxbaXJxX3JlcS0+aXJxX2lkeF0sCi0JCWlycV9yZXEtPmNhbV9od19tYXNrLCBNU01fQ0FNX0hXX0pQRUcxLCAmbnVtX2h3Y29yZSk7Ci0KLQl1cGRhdGVfY29tcGlycV9zdWJkZXZfaW5mbygmY29tcF9pcnFfdGJsW2lycV9yZXEtPmlycV9pZHhdLAotCQlpcnFfcmVxLT5jYW1faHdfbWFzaywgTVNNX0NBTV9IV19KUEVHMiwgJm51bV9od2NvcmUpOwotCi0JaWYgKG51bV9od2NvcmUgIT0gaXJxX3JlcS0+bnVtX2h3Y29yZSkgewotCQlwcl93YXJuKCIlcyBNaXNtYXRjaCEhIHJlcXVlc3RlZCBjYW0gaHdjb3JlczogJWQsIE1hc2sgc2V0ICVkIiwKLQkJCV9fZnVuY19fLCBpcnFfcmVxLT5udW1faHdjb3JlLCBudW1faHdjb3JlKTsKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fY2FtX3NlcnZlcl9yZXF1ZXN0X2lycSh2b2lkICphcmcpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBpbnRyX3RhYmxlX2VudHJ5ICppcnFfcmVxID0gIChzdHJ1Y3QgaW50cl90YWJsZV9lbnRyeSAqKWFyZzsKLQlzdHJ1Y3QgaW50cl90YWJsZV9lbnRyeSAqaW5kX2lycV90YmwgPQotCQkmZ19zZXJ2ZXJfZGV2LmlycV9sa3VwX3RhYmxlLmluZF9pbnRyX3RibFswXTsKLQlzdHJ1Y3QgaW50cl90YWJsZV9lbnRyeSAqY29tcF9pcnFfdGJsID0KLQkJJmdfc2VydmVyX2Rldi5pcnFfbGt1cF90YWJsZS5jb21wX2ludHJfdGJsWzBdOwotCi0JaWYgKCFpcnFfcmVxIHx8ICFpcnFfcmVxLT5pcnFfbnVtIHx8ICFpcnFfcmVxLT5udW1faHdjb3JlKSB7Ci0JCXByX2VycigiJXMgSW52YWxpZCBpbnB1dCAiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICghZ19zZXJ2ZXJfZGV2LmlycXJfZGV2aWNlKSB7Ci0JCS8qIFRoaXMgZWl0aGVyIG1lYW5zLCB0aGUgY3VycmVudCB0YXJnZXQgZG9lcyBub3QKLQkJICogaGF2ZSBhIElSUSBSb3V0ZXIgaHcgb3IgdGhlIElSUSBSb3V0ZXIgZGV2aWNlIGlzCi0JCSAqIG5vdCBwcm9iZWQgeWV0LiBUaGUgbGF0dGVyIHNob3VsZCBub3QgaGFwcGVuLgotCQkgKiBJbiBhbnkgY2FzZSwganVzdCByZXR1cm4gYmFjayB3aXRob3V0IHVwZGF0aW5nCi0JCSAqIHRoZSBpbnRlcnJ1cHQgbG9va3VwIHRhYmxlLiAqLwotCQlwcl9pbmZvKCIlcyBJUlEgUm91dGVyIGh3IGlzIG5vdCBwcmVzZW50LiAiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JaWYgKGlycV9yZXEtPmlzX2NvbXBvc2l0ZSkgewotCQlpZiAoaXJxX3JlcS0+aXJxX2lkeCA+PSBDQU1FUkFfU1NfSVJRXzAgJiYKLQkJCQlpcnFfcmVxLT5pcnFfaWR4IDwgQ0FNRVJBX1NTX0lSUV9NQVgpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZnX3NlcnZlcl9kZXYuaW50cl90YWJsZV9sb2NrLCBmbGFncyk7Ci0JCQkvKiBVcGRhdGUgdGhlIGNvbXBvc2l0ZSBpcnEgaW5mb3JtYXRpb24gaW50bwotCQkJICogdGhlIGNvbXBvc2l0ZSBpcnEgbG9va3VwIHRhYmxlLi4uLiAqLwotCQkJaWYgKG1zbV9zZXJ2ZXJfdXBkYXRlX2NvbXBvc2l0ZV9pcnFfaW5mbyhpcnFfcmVxKSkgewotCQkJCXByX2VycigiJXMgSW52YWxpZCBjb25maWd1cmF0aW9uIiwgX19mdW5jX18pOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCi0JCQkJCSZnX3NlcnZlcl9kZXYuaW50cl90YWJsZV9sb2NrLCBmbGFncyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX3NlcnZlcl9kZXYuaW50cl90YWJsZV9sb2NrLAotCQkJCWZsYWdzKTsKLQkJCS8qLi4uYW5kIHRoZW4gdXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5Ci0JCQkgKiBpbiB0aGUgaW5kaXZpZHVhbCBpcnEgbG9va3VwIHRhYmxlIHRvIGluZGljYXRlCi0JCQkgKiB0aGF0IHRoaXMgSVJRIGlzIGEgY29tcG9zaXRlIGlycSBhbmQgbmVlZHMgdG8gYmUKLQkJCSAqIHNlbnQgdG8gbXVsdGlwbGUgc3ViZGV2cy4gKi8KLQkJCWluZF9pcnFfdGJsW2lycV9yZXEtPmlycV9pZHhdLmlzX2NvbXBvc2l0ZSA9IDE7Ci0JCQlyYyA9IHJlcXVlc3RfaXJxKGNvbXBfaXJxX3RibFtpcnFfcmVxLT5pcnFfaWR4XS5pcnFfbnVtLAotCQkJCW1zbV9jYW1lcmFfc2VydmVyX3BhcnNlX2lycSwKLQkJCQlpcnFfcmVxLT5pcnFfdHJpZ2dlcl90eXBlLAotCQkJCWluZF9pcnFfdGJsW2lycV9yZXEtPmlycV9pZHhdLmRldl9uYW1lLAotCQkJCWluZF9pcnFfdGJsW2lycV9yZXEtPmlycV9pZHhdLmRhdGEpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6IHJlcXVlc3RfaXJxIGZhaWxlZCBmb3IgJXNcbiIsCi0JCQkJCV9fZnVuY19fLCBpcnFfcmVxLT5kZXZfbmFtZSk7Ci0JCQkJcmV0dXJuIC1FQlVTWTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXMgSW52YWxpZCBpcnFfaWR4ICVkICIsCi0JCQkJX19mdW5jX18sIGlycV9yZXEtPmlycV9pZHgpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoaXJxX3JlcS0+Y2FtX2h3X2lkeCA+PSBNU01fQ0FNX0hXX01JQ1JPICYmCi0JCQkJaXJxX3JlcS0+Y2FtX2h3X2lkeCA8IE1TTV9DQU1fSFdfTUFYKSB7Ci0JCQkvKiBVcGRhdGUgdGhlIGlycSBpbmZvcm1hdGlvbiBpbnRvCi0JCQkgKiB0aGUgaW5kaXZpZHVhbCBpcnEgbG9va3VwIHRhYmxlLi4uLiAqLwotCQkJaXJxX3JlcS0+aXJxX2lkeCA9Ci0JCQkJZ2V0X2lycV9pZHhfZnJvbV9jYW1od19pZHgoaXJxX3JlcS0+Y2FtX2h3X2lkeCk7Ci0JCQlpZiAoaXJxX3JlcS0+aXJxX2lkeCA8IDApIHsKLQkJCQlwcl9lcnIoIiVzIEludmFsaWQgaHcgaW5kZXggJWQgIiwgX19mdW5jX18sCi0JCQkJCWlycV9yZXEtPmNhbV9od19pZHgpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmdfc2VydmVyX2Rldi5pbnRyX3RhYmxlX2xvY2ssIGZsYWdzKTsKLQkJCS8qIE1ha2Ugc3VyZSB0aGUgY29tcG9zaXRlIGlycSBpcyBub3QgY29uZmlndXJlZCBmb3IKLQkJCSAqIHRoaXMgSVJRIGFscmVhZHkuICovCi0JCQlCVUdfT04oaW5kX2lycV90YmxbaXJxX3JlcS0+aXJxX2lkeF0uaXNfY29tcG9zaXRlKTsKLQotCQkJaW5kX2lycV90YmxbaXJxX3JlcS0+aXJxX2lkeF0gPSAqaXJxX3JlcTsKLQkJCS8qIGlycV9udW0gaXMgc3RvcmVkIGluc2lkZSB0aGUgc2VydmVyJ3MgaHdfaXJxbWFwCi0JCQkgKiBkdXJpbmcgdGhlIGRldmljZSBzdWJkZXZpY2UgcmVnaXN0cmF0aW9uLiAqLwotCQkJaW5kX2lycV90YmxbaXJxX3JlcS0+aXJxX2lkeF0uaXJxX251bSA9Ci0JCQlnX3NlcnZlcl9kZXYuaHdfaXJxbWFwW2lycV9yZXEtPmlycV9pZHhdLmlycV9udW07Ci0KLQkJCS8qLi4uYW5kIGNsZWFyIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZQotCQkJICogY29tcHNvaXRlIGlycSBsb29rdXAgdGFibGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzCi0JCQkgKiBJUlEgd2lsbCBvbmx5IGJlIGRpc3BhdGNoZWQgdG8gc2luZ2xlIHN1YmRldi4gKi8KLQkJCW1lbXNldCgmY29tcF9pcnFfdGJsW2lycV9yZXEtPmlycV9pZHhdLCAwLAotCQkJCQlzaXplb2Yoc3RydWN0IGludHJfdGFibGVfZW50cnkpKTsKLQkJCUQoIiVzIFNhdmluZyBFbnRyeSAlZCAlZCAlZCAlcCIsCi0JCQlfX2Z1bmNfXywKLQkJCWluZF9pcnFfdGJsW2lycV9yZXEtPmlycV9pZHhdLmlycV9udW0sCi0JCQlpbmRfaXJxX3RibFtpcnFfcmVxLT5pcnFfaWR4XS5jYW1faHdfaWR4LAotCQkJaW5kX2lycV90YmxbaXJxX3JlcS0+aXJxX2lkeF0uaXNfY29tcG9zaXRlLAotCQkJaW5kX2lycV90YmxbaXJxX3JlcS0+aXJxX2lkeF0uc3ViZGV2X2xpc3RbMF0pOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX3NlcnZlcl9kZXYuaW50cl90YWJsZV9sb2NrLAotCQkJCWZsYWdzKTsKLQotCQkJcmMgPSByZXF1ZXN0X2lycShpbmRfaXJxX3RibFtpcnFfcmVxLT5pcnFfaWR4XS5pcnFfbnVtLAotCQkJCW1zbV9jYW1lcmFfc2VydmVyX3BhcnNlX2lycSwKLQkJCQlpcnFfcmVxLT5pcnFfdHJpZ2dlcl90eXBlLAotCQkJCWluZF9pcnFfdGJsW2lycV9yZXEtPmlycV9pZHhdLmRldl9uYW1lLAotCQkJCWluZF9pcnFfdGJsW2lycV9yZXEtPmlycV9pZHhdLmRhdGEpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6IHJlcXVlc3RfaXJxIGZhaWxlZCBmb3IgJXNcbiIsCi0JCQkJCV9fZnVuY19fLCBpcnFfcmVxLT5kZXZfbmFtZSk7Ci0JCQkJcmV0dXJuIC1FQlVTWTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXMgSW52YWxpZCBodyBpbmRleCAlZCAiLCBfX2Z1bmNfXywKLQkJCQlpcnFfcmVxLT5jYW1faHdfaWR4KTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCUQoIiVzIFN1Y2Nlc3NmdWxseSByZXF1ZXN0ZWQgZm9yIElSUSBmb3IgZGV2aWNlICVzICIsIF9fZnVuY19fLAotCQlpcnFfcmVxLT5kZXZfbmFtZSk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2NhbV9zZXJ2ZXJfdXBkYXRlX2lycW1hcCgKLQlzdHJ1Y3QgbXNtX2NhbV9zZXJ2ZXJfaXJxbWFwX2VudHJ5ICppcnFtYXBfZW50cnkpCi17Ci0JaWYgKCFpcnFtYXBfZW50cnkgfHwgKGlycW1hcF9lbnRyeS0+aXJxX2lkeCA8IENBTUVSQV9TU19JUlFfMCB8fAotCQlpcnFtYXBfZW50cnktPmlycV9pZHggPj0gQ0FNRVJBX1NTX0lSUV9NQVgpKSB7Ci0JCXByX2VycigiJXMgSW52YWxpZCBpcnFtYXAgZW50cnkgIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZ19zZXJ2ZXJfZGV2Lmh3X2lycW1hcFtpcnFtYXBfZW50cnktPmlycV9pZHhdID0gKmlycW1hcF9lbnRyeTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fY2FtX3NlcnZlcl9yZWdpc3Rlcl9zdWJkZXYoc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiwKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldjsKLQotCWlmICh2NGwyX2RldiA9PSBOVUxMIHx8IHNkID09IE5VTEwgfHwgIXNkLT5uYW1lWzBdKSB7Ci0JCXByX2VycigiJXMgSW52YWxpZCBpbnB1dCAiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJjID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHY0bDJfZGV2LCBzZCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzIHY0bDIgc3ViZGV2IHJlZ2lzdGVyIGZhaWxlZCBmb3IgJXMgcmV0ID0gJWQiLAotCQkJX19mdW5jX18sIHNkLT5uYW1lLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiBSZWdpc3RlciBhIGRldmljZSBub2RlIGZvciBldmVyeSBzdWJkZXYgbWFya2VkIHdpdGggdGhlCi0JICogVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREUgZmxhZy4KLQkgKi8KLQlpZiAoIShzZC0+ZmxhZ3MgJiBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERSkpCi0JCXJldHVybiByYzsKLQotCXZkZXYgPSBremFsbG9jKHNpemVvZigqdmRldiksIEdGUF9LRVJORUwpOwotCWlmICghdmRldikgewotCQlwcl9lcnIoIiVzIE5vdCBlbm91Z2ggbWVtb3J5ICIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGNsZWFuX3VwOwotCX0KLQotCXZpZGVvX3NldF9kcnZkYXRhKHZkZXYsIHNkKTsKLQlzdHJsY3B5KHZkZXYtPm5hbWUsIHNkLT5uYW1lLCBzaXplb2YodmRldi0+bmFtZSkpOwotCXZkZXYtPnY0bDJfZGV2ID0gdjRsMl9kZXY7Ci0JdmRldi0+Zm9wcyA9ICZ2NGwyX3N1YmRldl9mb3BzOwotCXZkZXYtPnJlbGVhc2UgPSBtc21fY2FtX3JlbGVhc2Vfc3ViZGV2X25vZGU7Ci0JcmMgPSBfX3ZpZGVvX3JlZ2lzdGVyX2RldmljZSh2ZGV2LCBWRkxfVFlQRV9TVUJERVYsIC0xLCAxLAotCQkJCQkJICBzZC0+b3duZXIpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyBFcnJvciByZWdpc3RlcmluZyB2aWRlbyBkZXZpY2UgJXMiLCBfX2Z1bmNfXywKLQkJCXNkLT5uYW1lKTsKLQkJa2ZyZWUodmRldik7Ci0JCWdvdG8gY2xlYW5fdXA7Ci0JfQotI2lmIGRlZmluZWQoQ09ORklHX01FRElBX0NPTlRST0xMRVIpCi0Jc2QtPmVudGl0eS5pbmZvLnY0bC5tYWpvciA9IFZJREVPX01BSk9SOwotCXNkLT5lbnRpdHkuaW5mby52NGwubWlub3IgPSB2ZGV2LT5taW5vcjsKLSNlbmRpZgotCXNkLT5kZXZub2RlID0gdmRldjsKLQlyZXR1cm4gMDsKLQotY2xlYW5fdXA6Ci0JaWYgKHNkLT5kZXZub2RlKQotCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShzZC0+ZGV2bm9kZSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9jYW1fc2VydmVyX2ZpbGxfc2Rldl9pcnFudW0oaW50IGNhbV9od19pZHgsCi0JaW50IGlycV9udW0pCi17Ci0JaW50IHJjID0gMCwgaXJxX2lkeDsKLQlpcnFfaWR4ID0gZ2V0X2lycV9pZHhfZnJvbV9jYW1od19pZHgoY2FtX2h3X2lkeCk7Ci0JaWYgKGlycV9pZHggPCAwKSB7Ci0JCXByX2VycigiJXMgSW52YWxpZCBjYW1faHdfaWR4ICVkICIsIF9fZnVuY19fLCBjYW1faHdfaWR4KTsKLQkJcmMgPSAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCWdfc2VydmVyX2Rldi5od19pcnFtYXBbaXJxX2lkeF0uaXJxX251bSA9IGlycV9udW07Ci0JfQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9jYW1fcmVnaXN0ZXJfc3ViZGV2X25vZGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQlzdHJ1Y3QgbXNtX2NhbV9zdWJkZXZfaW5mbyAqc2RfaW5mbykKLXsKLQlpbnQgZXJyID0gMCwgY2FtX2h3X2lkeDsKLQl1aW50OF90IHNkZXZfdHlwZSwgaW5kZXg7Ci0KLQlzZGV2X3R5cGUgPSBzZF9pbmZvLT5zZGV2X3R5cGU7Ci0JaW5kZXggICAgID0gc2RfaW5mby0+c2RfaW5kZXg7Ci0KLQlzd2l0Y2ggKHNkZXZfdHlwZSkgewotCWNhc2UgU0VOU09SX0RFVjoKLQkJaWYgKGluZGV4ID49IE1BWF9OVU1fU0VOU09SX0RFVikgewotCQkJcHJfZXJyKCIlcyBJbnZhbGlkIHNlbnNvciBpZHggJWQiLCBfX2Z1bmNfXywgaW5kZXgpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWdfc2VydmVyX2Rldi5zZW5zb3JfZGV2aWNlW2luZGV4XSA9IHNkOwotCQlicmVhazsKLQotCWNhc2UgQ1NJUEhZX0RFVjoKLQkJaWYgKGluZGV4ID49IE1BWF9OVU1fQ1NJUEhZX0RFVikgewotCQkJcHJfZXJyKCIlcyBJbnZhbGlkIENTSVBIWSBpZHggJWQiLCBfX2Z1bmNfXywgaW5kZXgpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWdfc2VydmVyX2Rldi5jc2lwaHlfZGV2aWNlW2luZGV4XSA9IHNkOwotCQlicmVhazsKLQotCWNhc2UgQ1NJRF9ERVY6Ci0JCWlmIChpbmRleCA+PSBNQVhfTlVNX0NTSURfREVWKSB7Ci0JCQlwcl9lcnIoIiVzIEludmFsaWQgQ1NJRCBpZHggJWQiLCBfX2Z1bmNfXywgaW5kZXgpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhbV9od19pZHggPSBNU01fQ0FNX0hXX0NTSTAgKyBpbmRleDsKLQkJZ19zZXJ2ZXJfZGV2LmNzaWRfZGV2aWNlW2luZGV4XSA9IHNkOwotCQlpZiAoZ19zZXJ2ZXJfZGV2LmlycXJfZGV2aWNlKSB7Ci0JCQlnX3NlcnZlcl9kZXYuc3ViZGV2X3RhYmxlW2NhbV9od19pZHhdID0gc2Q7Ci0JCQllcnIgPSBtc21fY2FtX3NlcnZlcl9maWxsX3NkZXZfaXJxbnVtKGNhbV9od19pZHgsCi0JCQkJc2RfaW5mby0+aXJxX251bSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENTSUNfREVWOgotCQlpZiAoaW5kZXggPj0gTUFYX05VTV9DU0lDX0RFVikgewotCQkJcHJfZXJyKCIlcyBJbnZhbGlkIENTSUMgaWR4ICVkIiwgX19mdW5jX18sIGluZGV4KTsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlnX3NlcnZlcl9kZXYuY3NpY19kZXZpY2VbaW5kZXhdID0gc2Q7Ci0JCWJyZWFrOwotCi0JY2FzZSBJU1BJRl9ERVY6Ci0JCWlmIChpbmRleCA+PSBNQVhfTlVNX0lTUElGX0RFVikgewotCQkJcHJfZXJyKCIlcyBJbnZhbGlkIElTUElGIGlkeCAlZCIsIF9fZnVuY19fLCBpbmRleCk7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FtX2h3X2lkeCA9IE1TTV9DQU1fSFdfSVNQSUYgKyBpbmRleDsKLQkJZ19zZXJ2ZXJfZGV2LmlzcGlmX2RldmljZVtpbmRleF0gPSBzZDsKLQkJaWYgKGdfc2VydmVyX2Rldi5pcnFyX2RldmljZSkgewotCQkJZ19zZXJ2ZXJfZGV2LnN1YmRldl90YWJsZVtjYW1faHdfaWR4XSA9IHNkOwotCQkJZXJyID0gbXNtX2NhbV9zZXJ2ZXJfZmlsbF9zZGV2X2lycW51bShjYW1faHdfaWR4LAotCQkJCXNkX2luZm8tPmlycV9udW0pOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfREVWOgotCQlpZiAoaW5kZXggPj0gTUFYX05VTV9WRkVfREVWKSB7Ci0JCQlwcl9lcnIoIiVzIEludmFsaWQgVkZFIGlkeCAlZCIsIF9fZnVuY19fLCBpbmRleCk7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FtX2h3X2lkeCA9IE1TTV9DQU1fSFdfVkZFMCArIGluZGV4OwotCQlnX3NlcnZlcl9kZXYudmZlX2RldmljZVtpbmRleF0gPSBzZDsKLQkJaWYgKGdfc2VydmVyX2Rldi5pcnFyX2RldmljZSkgewotCQkJZ19zZXJ2ZXJfZGV2LnN1YmRldl90YWJsZVtjYW1faHdfaWR4XSA9IHNkOwotCQkJZXJyID0gbXNtX2NhbV9zZXJ2ZXJfZmlsbF9zZGV2X2lycW51bShjYW1faHdfaWR4LAotCQkJCXNkX2luZm8tPmlycV9udW0pOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWUEVfREVWOgotCQlpZiAoaW5kZXggPj0gTUFYX05VTV9WUEVfREVWKSB7Ci0JCQlwcl9lcnIoIiVzIEludmFsaWQgVlBFIGlkeCAlZCIsIF9fZnVuY19fLCBpbmRleCk7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJZ19zZXJ2ZXJfZGV2LnZwZV9kZXZpY2VbaW5kZXhdID0gc2Q7Ci0JCWJyZWFrOwotCi0JY2FzZSBBWElfREVWOgotCQlpZiAoaW5kZXggPj0gTUFYX05VTV9BWElfREVWKSB7Ci0JCQlwcl9lcnIoIiVzIEludmFsaWQgQVhJIGlkeCAlZCIsIF9fZnVuY19fLCBpbmRleCk7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJZ19zZXJ2ZXJfZGV2LmF4aV9kZXZpY2VbaW5kZXhdID0gc2Q7Ci0JCWJyZWFrOwotCi0JY2FzZSBHRVNUVVJFX0RFVjoKLQkJZ19zZXJ2ZXJfZGV2Lmdlc3R1cmVfZGV2aWNlID0gc2Q7Ci0JCWJyZWFrOwotCi0JY2FzZSBJUlFfUk9VVEVSX0RFVjoKLQkJZ19zZXJ2ZXJfZGV2LmlycXJfZGV2aWNlID0gc2Q7Ci0KLQljYXNlIENQUF9ERVY6Ci0JCWlmIChpbmRleCA+PSBNQVhfTlVNX0NQUF9ERVYpIHsKLQkJCXByX2VycigiJXMgSW52YWxpZCBDUFAgaWR4ICVkIiwgX19mdW5jX18sIGluZGV4KTsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlnX3NlcnZlcl9kZXYuY3BwX2RldmljZVtpbmRleF0gPSBzZDsKLQkJYnJlYWs7Ci0JY2FzZSBDQ0lfREVWOgotCQlnX3NlcnZlcl9kZXYuY2NpX2RldmljZSA9IHNkOwotCQlpZiAoZ19zZXJ2ZXJfZGV2LmlycXJfZGV2aWNlKSB7Ci0JCQlpZiAoaW5kZXggPj0gTUFYX05VTV9DQ0lfREVWKSB7Ci0JCQkJcHJfZXJyKCIlcyBJbnZhbGlkIENDSSBpZHggJWQiLCBfX2Z1bmNfXywKLQkJCQkJaW5kZXgpOwotCQkJCWVyciA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYW1faHdfaWR4ID0gTVNNX0NBTV9IV19DQ0kgKyBpbmRleDsKLQkJCWdfc2VydmVyX2Rldi5zdWJkZXZfdGFibGVbY2FtX2h3X2lkeF0gPSBzZDsKLQkJCWVyciA9IG1zbV9jYW1fc2VydmVyX2ZpbGxfc2Rldl9pcnFudW0oTVNNX0NBTV9IV19DQ0ksCi0JCQkJc2RfaW5mby0+aXJxX251bSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEZMQVNIX0RFVjoKLQkJaWYgKGluZGV4ID49IE1BWF9OVU1fRkxBU0hfREVWKSB7Ci0JCQlwcl9lcnIoIiVzIEludmFsaWQgZmxhc2ggaWR4ICVkIiwgX19mdW5jX18sIGluZGV4KTsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlnX3NlcnZlcl9kZXYuZmxhc2hfZGV2aWNlW2luZGV4XSA9IHNkOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JZXJyID0gbXNtX2NhbV9zZXJ2ZXJfcmVnaXN0ZXJfc3ViZGV2KCZnX3NlcnZlcl9kZXYudjRsMl9kZXYsIHNkKTsKLQlyZXR1cm4gZXJyOwotfQotCi0jaWZkZWYgQ09ORklHX01TTV9JT01NVQotc3RhdGljIGludCBjYW1lcmFfcmVnaXN0ZXJfZG9tYWluKHZvaWQpCi17Ci0Jc3RydWN0IG1zbV9pb3ZhX3BhcnRpdGlvbiBjYW1lcmFfZndfcGFydGl0aW9uID0gewotCQkuc3RhcnQgPSBTWl8xMjhLLAotCQkuc2l6ZSA9IFNaXzJHIC0gU1pfMTI4SywKLQl9OwotCXN0cnVjdCBtc21faW92YV9sYXlvdXQgY2FtZXJhX2Z3X2xheW91dCA9IHsKLQkJLnBhcnRpdGlvbnMgPSAmY2FtZXJhX2Z3X3BhcnRpdGlvbiwKLQkJLm5wYXJ0aXRpb25zID0gMSwKLQkJLmNsaWVudF9uYW1lID0gImNhbWVyYV9pc3AiLAotCQkuZG9tYWluX2ZsYWdzID0gMCwKLQl9OwotCi0JcmV0dXJuIG1zbV9yZWdpc3Rlcl9kb21haW4oJmNhbWVyYV9md19sYXlvdXQpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgbXNtX3NldHVwX3NlcnZlcl9kZXYoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmMgPSAtRU5PREVWLCBpOwotCi0JRCgiJXNcbiIsIF9fZnVuY19fKTsKLQlnX3NlcnZlcl9kZXYuc2VydmVyX3BkZXYgPSBwZGV2OwotCWdfc2VydmVyX2Rldi52NGwyX2Rldi5kZXYgPSAmcGRldi0+ZGV2OwotCWdfc2VydmVyX2Rldi52NGwyX2Rldi5ub3RpZnkgPSBtc21fY2FtX3NlcnZlcl9zdWJkZXZfbm90aWZ5OwotCXJjID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoZ19zZXJ2ZXJfZGV2LnY0bDJfZGV2LmRldiwKLQkJCSZnX3NlcnZlcl9kZXYudjRsMl9kZXYpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZ19zZXJ2ZXJfZGV2LnZpZGVvX2RldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOwotCWlmIChnX3NlcnZlcl9kZXYudmlkZW9fZGV2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdmlkZW9fZGV2aWNlX2FsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0Jc3RybGNweShnX3NlcnZlcl9kZXYudmlkZW9fZGV2LT5uYW1lLCBwZGV2LT5uYW1lLAotCQkJc2l6ZW9mKGdfc2VydmVyX2Rldi52aWRlb19kZXYtPm5hbWUpKTsKLQotCWdfc2VydmVyX2Rldi52aWRlb19kZXYtPnY0bDJfZGV2ID0gJmdfc2VydmVyX2Rldi52NGwyX2RldjsKLQlnX3NlcnZlcl9kZXYudmlkZW9fZGV2LT5mb3BzID0gJm1zbV9mb3BzX3NlcnZlcjsKLQlnX3NlcnZlcl9kZXYudmlkZW9fZGV2LT5pb2N0bF9vcHMgPSAmbXNtX2lvY3RsX29wc19zZXJ2ZXI7Ci0JZ19zZXJ2ZXJfZGV2LnZpZGVvX2Rldi0+cmVsZWFzZSAgID0gdmlkZW9fZGV2aWNlX3JlbGVhc2U7Ci0JZ19zZXJ2ZXJfZGV2LnZpZGVvX2Rldi0+bWlub3IgPSAxMDA7Ci0JZ19zZXJ2ZXJfZGV2LnZpZGVvX2Rldi0+dmZsX3R5cGUgPSBWRkxfVFlQRV9HUkFCQkVSOwotCi0JdmlkZW9fc2V0X2RydmRhdGEoZ19zZXJ2ZXJfZGV2LnZpZGVvX2RldiwgJmdfc2VydmVyX2Rldik7Ci0KLQlzdHJsY3B5KGdfc2VydmVyX2Rldi5tZWRpYV9kZXYubW9kZWwsIFFDQU1FUkFfU0VSVkVSX05BTUUsCi0JCXNpemVvZihnX3NlcnZlcl9kZXYubWVkaWFfZGV2Lm1vZGVsKSk7Ci0JZ19zZXJ2ZXJfZGV2Lm1lZGlhX2Rldi5kZXYgPSAmcGRldi0+ZGV2OwotCXJjID0gbWVkaWFfZGV2aWNlX3JlZ2lzdGVyKCZnX3NlcnZlcl9kZXYubWVkaWFfZGV2KTsKLQlnX3NlcnZlcl9kZXYudjRsMl9kZXYubWRldiA9ICZnX3NlcnZlcl9kZXYubWVkaWFfZGV2OwotCW1lZGlhX2VudGl0eV9pbml0KCZnX3NlcnZlcl9kZXYudmlkZW9fZGV2LT5lbnRpdHksIDAsIE5VTEwsIDApOwotCWdfc2VydmVyX2Rldi52aWRlb19kZXYtPmVudGl0eS50eXBlID0gTUVESUFfRU5UX1RfREVWTk9ERV9WNEw7Ci0JZ19zZXJ2ZXJfZGV2LnZpZGVvX2Rldi0+ZW50aXR5Lmdyb3VwX2lkID0gUUNBTUVSQV9WTk9ERV9HUk9VUF9JRDsKLQotCXJjID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGdfc2VydmVyX2Rldi52aWRlb19kZXYsCi0JCVZGTF9UWVBFX0dSQUJCRVIsIDEwMCk7Ci0KLQlnX3NlcnZlcl9kZXYudmlkZW9fZGV2LT5lbnRpdHkubmFtZSA9Ci0JCXZpZGVvX2RldmljZV9ub2RlX25hbWUoZ19zZXJ2ZXJfZGV2LnZpZGVvX2Rldik7Ci0KLQltdXRleF9pbml0KCZnX3NlcnZlcl9kZXYuc2VydmVyX2xvY2spOwotCW11dGV4X2luaXQoJmdfc2VydmVyX2Rldi5zZXJ2ZXJfcXVldWVfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmdfc2VydmVyX2Rldi5pbnRyX3RhYmxlX2xvY2spOwotCW1lbXNldCgmZ19zZXJ2ZXJfZGV2LmlycV9sa3VwX3RhYmxlLCAwLAotCQkJc2l6ZW9mKHN0cnVjdCBpcnFtZ3JfaW50cl9sa3VwX3RhYmxlKSk7Ci0JZ19zZXJ2ZXJfZGV2LmNhbWVyYV9pbmZvLm51bV9jYW1lcmFzID0gMDsKLQlhdG9taWNfc2V0KCZnX3NlcnZlcl9kZXYubnVtYmVyX3BjYW1fYWN0aXZlLCAwKTsKLQlnX3NlcnZlcl9kZXYuc2VydmVyX2V2dF9pZCA9IDA7Ci0KLQkvKmluaXRpYWxpemUgZmFrZSB2aWRlbyBkZXZpY2UgYW5kIGV2ZW50IHF1ZXVlKi8KLQotCWdfc2VydmVyX2Rldi5zZXJ2ZXJfY29tbWFuZF9xdWV1ZS5wdmRldiA9IGdfc2VydmVyX2Rldi52aWRlb19kZXY7Ci0JbXNtX3NldHVwX3Y0bDJfZXZlbnRfcXVldWUoCi0JCSZnX3NlcnZlcl9kZXYuc2VydmVyX2NvbW1hbmRfcXVldWUuZXZlbnRIYW5kbGUsCi0JCWdfc2VydmVyX2Rldi5zZXJ2ZXJfY29tbWFuZF9xdWV1ZS5wdmRldik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9BQ1RJVkVfQ0FNRVJBOyBpKyspIHsKLQkJc3RydWN0IG1zbV9jYW1fc2VydmVyX3F1ZXVlICpxdWV1ZTsKLQkJcXVldWUgPSAmZ19zZXJ2ZXJfZGV2LnNlcnZlcl9xdWV1ZVtpXTsKLQkJcXVldWUtPnF1ZXVlX2FjdGl2ZSA9IDA7Ci0JCW1zbV9xdWV1ZV9pbml0KCZxdWV1ZS0+Y3RybF9xLCAiY29udHJvbCIpOwotCQltc21fcXVldWVfaW5pdCgmcXVldWUtPmV2ZW50RGF0YV9xLCAiZXZlbnRkYXRhIik7Ci0JCWdfc2VydmVyX2Rldi5wY2FtX2FjdGl2ZVtpXSA9IE5VTEw7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IElOVEZfTUFYOyBpKyspIHsKLQkJZ19zZXJ2ZXJfZGV2LmludGVyZmFjZV9tYXBfdGFibGVbaV0uaW50ZXJmYWNlID0gMHgwMSA8PCBpOwotCQlnX3NlcnZlcl9kZXYuaW50ZXJmYWNlX21hcF90YWJsZVtpXS5tY3RsX2hhbmRsZSA9IDA7Ci0JfQotI2lmZGVmIENPTkZJR19NU01fSU9NTVUKLQlnX3NlcnZlcl9kZXYuZG9tYWluX251bSA9IGNhbWVyYV9yZWdpc3Rlcl9kb21haW4oKTsKLQlpZiAoZ19zZXJ2ZXJfZGV2LmRvbWFpbl9udW0gPCAwKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCByZWdpc3RlciBkb21haW5cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PREVWOwotCQlyZXR1cm4gcmM7Ci0JfQotCWdfc2VydmVyX2Rldi5kb21haW4gPQotCQltc21fZ2V0X2lvbW11X2RvbWFpbihnX3NlcnZlcl9kZXYuZG9tYWluX251bSk7Ci0JaWYgKCFnX3NlcnZlcl9kZXYuZG9tYWluKSB7Ci0JCXByX2VycigiJXM6IGNhbm5vdCBmaW5kIGRvbWFpblxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FTk9ERVY7Ci0JCXJldHVybiByYzsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBsb25nIG1zbV9zZXJ2ZXJfc2VuZF92NGwyX2V2dCh2b2lkICpldnQpCi17Ci0Jc3RydWN0IHY0bDJfZXZlbnQgKnY0bDJfZXYgPSAoc3RydWN0IHY0bDJfZXZlbnQgKilldnQ7Ci0JaW50IHJjID0gMDsKLQotCWlmIChOVUxMID09IGV2dCkgewotCQlwcl9lcnIoIiVzOiBldnQgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlEKCIlczogZXZ0IHR5cGUgMHgleFxuIiwgX19mdW5jX18sIHY0bDJfZXYtPnR5cGUpOwotCWlmICgodjRsMl9ldi0+dHlwZSA+PSBNU01fR0VTX0FQUF9FVlRfTUlOKSAmJgotCQkodjRsMl9ldi0+dHlwZSA8IE1TTV9HRVNfQVBQX0VWVF9NQVgpKSB7Ci0JCW1zbV9jYW1fc2VydmVyX3N1YmRldl9ub3RpZnkoZ19zZXJ2ZXJfZGV2Lmdlc3R1cmVfZGV2aWNlLAotCQkJTk9USUZZX0dFU1RVUkVfRVZULCB2NGwyX2V2KTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGV2dCAlZFxuIiwgX19mdW5jX18sIHY0bDJfZXYtPnR5cGUpOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCUQoIiVzOiBlbmRcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9jYW1fc2VydmVyX29wZW5fbWN0bF9zZXNzaW9uKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtLAotCWludCAqcF9hY3RpdmUpCi17Ci0JaW50IHJjID0gMDsKLQlpbnQgaSA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwgPSBOVUxMOwotCSpwX2FjdGl2ZSA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9BQ1RJVkVfQ0FNRVJBOyBpKyspIHsKLQkJaWYgKE5VTEwgIT0gZ19zZXJ2ZXJfZGV2LnBjYW1fYWN0aXZlW2ldKSB7Ci0JCQlwcl9pbmZvKCIlczogQWN0aXZlIGNhbWVyYSBwcmVzZW50IHJldHVybiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcmMgPSBtc21fY2FtX3NlcnZlcl9vcGVuX3Nlc3Npb24oJmdfc2VydmVyX2RldiwgcGNhbSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBjYW1fc2VydmVyX29wZW5fc2Vzc2lvbiBmYWlsZWQgJWRcbiIsCi0JCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlwbWN0bCA9IG1zbV9jYW1fc2VydmVyX2dldF9tY3RsKHBjYW0tPm1jdGxfaGFuZGxlKTsKLQlpZiAoIXBtY3RsIHx8ICFwbWN0bC0+bWN0bF9vcGVuKSB7Ci0JCUQoIiVzOiBtZWRpYSBjb250b2xsZXIgaXMgbm90IGluaXRlZFxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJcmV0dXJuIHJjOwotCX0KLQotI2lmZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0JCXBtY3RsLT5kb21haW4gPSBtc21fY2FtX3NlcnZlcl9nZXRfZG9tYWluKCk7Ci0JCXBtY3RsLT5kb21haW5fbnVtID0gbXNtX2NhbV9zZXJ2ZXJfZ2V0X2RvbWFpbl9udW0oKTsKLSNlbmRpZgotCi0JRCgiJXM6IGNhbGwgbWN0bF9vcGVuXG4iLCBfX2Z1bmNfXyk7Ci0JcmMgPSBwbWN0bC0+bWN0bF9vcGVuKHBtY3RsLCBNU01fQVBQU19JRF9WNEwyKTsKLQotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogSFcgb3BlbiBmYWlsZWQgcmMgPSAweCV4XG4iLCAgX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlwbWN0bC0+cGNhbV9wdHIgPSBwY2FtOwotCSpwX2FjdGl2ZSA9IDE7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2NhbV9zZXJ2ZXJfY2xvc2VfbWN0bF9zZXNzaW9uKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwgPSBOVUxMOwotCi0JcG1jdGwgPSBtc21fY2FtX3NlcnZlcl9nZXRfbWN0bChwY2FtLT5tY3RsX2hhbmRsZSk7Ci0JaWYgKCFwbWN0bCkgewotCQlEKCIlczogaW52YWxpZCBoYW5kbGVcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKHBtY3RsLT5tY3RsX3JlbGVhc2UpCi0JCXBtY3RsLT5tY3RsX3JlbGVhc2UocG1jdGwpOwotCi0jaWZkZWYgQ09ORklHX01TTV9NVUxUSU1FRElBX1VTRV9JT04KLQlrcmVmX3B1dCgmcG1jdGwtPnJlZmNvdW50LCBtc21fcmVsZWFzZV9pb25fY2xpZW50KTsKLSNlbmRpZgotCi0JcmMgPSBtc21fY2FtX3NlcnZlcl9jbG9zZV9zZXNzaW9uKCZnX3NlcnZlcl9kZXYsIHBjYW0pOwotCWlmIChyYyA8IDApCi0JCXByX2VycigibXNtX2NhbV9zZXJ2ZXJfY2xvc2Vfc2Vzc2lvbiBmYWlscyAlZFxuIiwgcmMpOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX3NlcnZlcl9vcGVuX2NsaWVudChpbnQgKnBfcWlkeCkKLXsKLQlpbnQgcmMgPSAwOwotCWludCBzZXJ2ZXJfcV9pZHggPSAwOwotCXN0cnVjdCBtc21fY2FtX3NlcnZlcl9xdWV1ZSAqcXVldWUgPSBOVUxMOwotCi0JbXV0ZXhfbG9jaygmZ19zZXJ2ZXJfZGV2LnNlcnZlcl9sb2NrKTsKLQlzZXJ2ZXJfcV9pZHggPSBtc21fZmluZF9mcmVlX3F1ZXVlKCk7Ci0JaWYgKHNlcnZlcl9xX2lkeCA8IDApIHsKLQkJbXV0ZXhfdW5sb2NrKCZnX3NlcnZlcl9kZXYuc2VydmVyX2xvY2spOwotCQlyZXR1cm4gc2VydmVyX3FfaWR4OwotCX0KLQotCSpwX3FpZHggPSBzZXJ2ZXJfcV9pZHg7Ci0JcXVldWUgPSAmZ19zZXJ2ZXJfZGV2LnNlcnZlcl9xdWV1ZVtzZXJ2ZXJfcV9pZHhdOwotCXF1ZXVlLT5jdHJsX2RhdGEgPSBremFsbG9jKHNpemVvZih1aW50OF90KSAqCi0JCU1BWF9TRVJWRVJfUEFZTE9BRF9MRU5HVEgsIEdGUF9LRVJORUwpOwotCWlmICghcXVldWUtPmN0cmxfZGF0YSkgewotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgZmluZCBtZW1vcnlcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1zbV9xdWV1ZV9pbml0KCZxdWV1ZS0+Y3RybF9xLCAiY29udHJvbCIpOwotCW1zbV9xdWV1ZV9pbml0KCZxdWV1ZS0+ZXZlbnREYXRhX3EsICJldmVudGRhdGEiKTsKLQlxdWV1ZS0+cXVldWVfYWN0aXZlID0gMTsKLQltdXRleF91bmxvY2soJmdfc2VydmVyX2Rldi5zZXJ2ZXJfbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX3NlcnZlcl9zZW5kX2N0cmwoc3RydWN0IG1zbV9jdHJsX2NtZCAqb3V0LAotCWludCBjdHJsX2lkKQotewotCWludCByYyA9IDA7Ci0Jdm9pZCAqdmFsdWU7Ci0Jc3RydWN0IG1zbV9xdWV1ZV9jbWQgKnJjbWQ7Ci0Jc3RydWN0IG1zbV9xdWV1ZV9jbWQgKmV2ZW50X3FjbWQ7Ci0Jc3RydWN0IG1zbV9jdHJsX2NtZCAqY3RybGNtZDsKLQlzdHJ1Y3QgbXNtX2NhbV9zZXJ2ZXJfZGV2ICpzZXJ2ZXJfZGV2ID0gJmdfc2VydmVyX2RldjsKLQlzdHJ1Y3QgbXNtX2RldmljZV9xdWV1ZSAqcXVldWUgPQotCQkmc2VydmVyX2Rldi0+c2VydmVyX3F1ZXVlW291dC0+cXVldWVfaWR4XS5jdHJsX3E7Ci0KLQlzdHJ1Y3QgdjRsMl9ldmVudCB2NGwyX2V2dDsKLQlzdHJ1Y3QgbXNtX2lzcF9ldmVudF9jdHJsICppc3BfZXZlbnQ7Ci0Jdm9pZCAqY3RybGNtZF9kYXRhOwotCi0JZXZlbnRfcWNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fcXVldWVfY21kKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFldmVudF9xY21kKSB7Ci0JCXByX2VycigiJXMgSW5zdWZmaWNpZW50IG1lbW9yeS4gcmV0dXJuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXZlbnRfcWNtZF9hbGxvY19mYWlsOwotCX0KLQotCWlzcF9ldmVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21faXNwX2V2ZW50X2N0cmwpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlzcF9ldmVudCkgewotCQlwcl9lcnIoIiVzIEluc3VmZmljaWVudCBtZW1vcnkuIHJldHVybiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGlzcF9ldmVudF9hbGxvY19mYWlsOwotCX0KLQotCUQoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JbXV0ZXhfbG9jaygmc2VydmVyX2Rldi0+c2VydmVyX3F1ZXVlX2xvY2spOwotCWlmICgrK3NlcnZlcl9kZXYtPnNlcnZlcl9ldnRfaWQgPT0gMCkKLQkJc2VydmVyX2Rldi0+c2VydmVyX2V2dF9pZCsrOwotCi0JRCgiJXMgcWlkICVkIGV2dGlkICVkXG4iLCBfX2Z1bmNfXywgb3V0LT5xdWV1ZV9pZHgsCi0JCXNlcnZlcl9kZXYtPnNlcnZlcl9ldnRfaWQpOwotCXNlcnZlcl9kZXYtPnNlcnZlcl9xdWV1ZVtvdXQtPnF1ZXVlX2lkeF0uZXZ0X2lkID0KLQkJc2VydmVyX2Rldi0+c2VydmVyX2V2dF9pZDsKLQl2NGwyX2V2dC50eXBlID0gVjRMMl9FVkVOVF9QUklWQVRFX1NUQVJUICsgY3RybF9pZDsKLQl2NGwyX2V2dC5pZCA9IDA7Ci0JdjRsMl9ldnQudS5kYXRhWzBdID0gb3V0LT5xdWV1ZV9pZHg7Ci0JLyogc2V0dXAgZXZlbnQgb2JqZWN0IHRvIHRyYW5zZmVyIHRoZSBjb21tYW5kOyAqLwotCWlzcF9ldmVudC0+cmVzcHR5cGUgPSBNU01fQ0FNX1JFU1BfVjRMMjsKLQlpc3BfZXZlbnQtPmlzcF9kYXRhLmN0cmwgPSAqb3V0OwotCWlzcF9ldmVudC0+aXNwX2RhdGEuY3RybC5ldnRfaWQgPSBzZXJ2ZXJfZGV2LT5zZXJ2ZXJfZXZ0X2lkOwotCi0JaWYgKG91dC0+dmFsdWUgIT0gTlVMTCAmJiBvdXQtPmxlbmd0aCAhPSAwKSB7Ci0JCWN0cmxjbWRfZGF0YSA9IGt6YWxsb2Mob3V0LT5sZW5ndGgsIEdGUF9LRVJORUwpOwotCQlpZiAoIWN0cmxjbWRfZGF0YSkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBjdHJsY21kX2FsbG9jX2ZhaWw7Ci0JCX0KLQkJbWVtY3B5KGN0cmxjbWRfZGF0YSwgb3V0LT52YWx1ZSwgb3V0LT5sZW5ndGgpOwotCQlpc3BfZXZlbnQtPmlzcF9kYXRhLmN0cmwudmFsdWUgPSBjdHJsY21kX2RhdGE7Ci0JfQotCi0JYXRvbWljX3NldCgmZXZlbnRfcWNtZC0+b25faGVhcCwgMSk7Ci0JZXZlbnRfcWNtZC0+Y29tbWFuZCA9IGlzcF9ldmVudDsKLQotCW1zbV9lbnF1ZXVlKCZzZXJ2ZXJfZGV2LT5zZXJ2ZXJfcXVldWVbb3V0LT5xdWV1ZV9pZHhdLmV2ZW50RGF0YV9xLAotCQkJCSZldmVudF9xY21kLT5saXN0X2V2ZW50ZGF0YSk7Ci0KLQkvKiBub3cgc2VuZCBjb21tYW5kIHRvIGNvbmZpZyB0aHJlYWQgaW4gdXNlcnNwYWNlLAotCSAqIGFuZCB3YWl0IGZvciByZXN1bHRzICovCi0JdjRsMl9ldmVudF9xdWV1ZShzZXJ2ZXJfZGV2LT5zZXJ2ZXJfY29tbWFuZF9xdWV1ZS5wdmRldiwKLQkJCQkJICAmdjRsMl9ldnQpOwotCUQoIiVzIHY0bDJfZXZlbnRfcXVldWU6IHR5cGUgPSAweCV4XG4iLCBfX2Z1bmNfXywgdjRsMl9ldnQudHlwZSk7Ci0JbXV0ZXhfdW5sb2NrKCZzZXJ2ZXJfZGV2LT5zZXJ2ZXJfcXVldWVfbG9jayk7Ci0KLQkvKiB3YWl0IGZvciBjb25maWcgcmV0dXJuIHN0YXR1cyAqLwotCUQoIldhaXRpbmcgZm9yIGNvbmZpZyBzdGF0dXNcbiIpOwotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocXVldWUtPndhaXQsCi0JCSFsaXN0X2VtcHR5X2NhcmVmdWwoJnF1ZXVlLT5saXN0KSwKLQkJbXNlY3NfdG9famlmZmllcyhvdXQtPnRpbWVvdXRfbXMpKTsKLQlEKCJXYWl0aW5nIGlzIG92ZXIgZm9yIGNvbmZpZyBzdGF0dXNcbiIpOwotCWlmIChsaXN0X2VtcHR5X2NhcmVmdWwoJnF1ZXVlLT5saXN0KSkgewotCQlpZiAoIXJjKQotCQkJcmMgPSAtRVRJTUVET1VUOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlpZiAoKytzZXJ2ZXJfZGV2LT5zZXJ2ZXJfZXZ0X2lkID09IDApCi0JCQkJc2VydmVyX2Rldi0+c2VydmVyX2V2dF9pZCsrOwotCQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCXJjbWQgPSBtc21fZGVxdWV1ZShxdWV1ZSwgbGlzdF9jb250cm9sKTsKLQlCVUdfT04oIXJjbWQpOwotCUQoIiVzIEZpbmlzaGVkIHNlcnZpY2luZyBpb2N0bFxuIiwgX19mdW5jX18pOwotCi0JY3RybGNtZCA9IChzdHJ1Y3QgbXNtX2N0cmxfY21kICopKHJjbWQtPmNvbW1hbmQpOwotCXZhbHVlID0gb3V0LT52YWx1ZTsKLQlpZiAoY3RybGNtZC0+bGVuZ3RoID4gMCAmJiB2YWx1ZSAhPSBOVUxMICYmCi0JCWN0cmxjbWQtPmxlbmd0aCA8PSBvdXQtPmxlbmd0aCkKLQkJbWVtY3B5KHZhbHVlLCBjdHJsY21kLT52YWx1ZSwgY3RybGNtZC0+bGVuZ3RoKTsKLQotCW1lbWNweShvdXQsIGN0cmxjbWQsIHNpemVvZihzdHJ1Y3QgbXNtX2N0cmxfY21kKSk7Ci0Jb3V0LT52YWx1ZSA9IHZhbHVlOwotCi0Ja2ZyZWUoY3RybGNtZCk7Ci0JZnJlZV9xY21kKHJjbWQpOwotCUQoIiVzOiByYyAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkvKiByYyBpcyB0aGUgdGltZSBlbGFwc2VkLiAqLwotCWlmIChyYyA+PSAwKSB7Ci0JCS8qIFRPRE86IFJlZmFjdG9yIG1zbV9jdHJsX2NtZDo6c3RhdHVzIGZpZWxkICovCi0JCWlmIChvdXQtPnN0YXR1cyA9PSAwKQotCQkJcmMgPSAtMTsKLQkJZWxzZSBpZiAob3V0LT5zdGF0dXMgPT0gMSB8fCBvdXQtPnN0YXR1cyA9PSA0KQotCQkJcmMgPSAwOwotCQllbHNlCi0JCQlyYyA9IC1FSU5WQUw7Ci0JfQotCXJldHVybiByYzsKLQotY3RybGNtZF9hbGxvY19mYWlsOgotCWtmcmVlKGlzcF9ldmVudCk7Ci1pc3BfZXZlbnRfYWxsb2NfZmFpbDoKLQlrZnJlZShldmVudF9xY21kKTsKLWV2ZW50X3FjbWRfYWxsb2NfZmFpbDoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fc2VydmVyX2Nsb3NlX2NsaWVudChpbnQgaWR4KQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1fc2VydmVyX3F1ZXVlICpxdWV1ZSA9IE5VTEw7Ci0JbXV0ZXhfbG9jaygmZ19zZXJ2ZXJfZGV2LnNlcnZlcl9sb2NrKTsKLQlxdWV1ZSA9ICZnX3NlcnZlcl9kZXYuc2VydmVyX3F1ZXVlW2lkeF07Ci0JcXVldWUtPnF1ZXVlX2FjdGl2ZSA9IDA7Ci0Ja2ZyZWUocXVldWUtPmN0cmxfZGF0YSk7Ci0JcXVldWUtPmN0cmxfZGF0YSA9IE5VTEw7Ci0JbXNtX3F1ZXVlX2RyYWluKCZxdWV1ZS0+Y3RybF9xLCBsaXN0X2NvbnRyb2wpOwotCW1zbV9kcmFpbl9ldmVudHEoJnF1ZXVlLT5ldmVudERhdGFfcSk7Ci0JbXV0ZXhfdW5sb2NrKCZnX3NlcnZlcl9kZXYuc2VydmVyX2xvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBtc21fcG9sbF9jb25maWcoc3RydWN0IGZpbGUgKmZwLAotCQkJCQlzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2NhbV9jb25maWdfZGV2ICpjb25maWcgPSBmcC0+cHJpdmF0ZV9kYXRhOwotCWlmIChjb25maWcgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCi0JcG9sbF93YWl0KGZwLAotCSZjb25maWctPmNvbmZpZ19zdGF0X2V2ZW50X3F1ZXVlLmV2ZW50SGFuZGxlLndhaXQsIHdhaXQpOw0KLQlpZiAodjRsMl9ldmVudF9wZW5kaW5nKCZjb25maWctPmNvbmZpZ19zdGF0X2V2ZW50X3F1ZXVlLmV2ZW50SGFuZGxlKSkKLQkJcmMgfD0gUE9MTFBSSTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX29wZW5fY29uZmlnKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmcCkKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IG1zbV9jYW1fY29uZmlnX2RldiAqY29uZmlnX2NhbSA9IGNvbnRhaW5lcl9vZihpbm9kZS0+aV9jZGV2LAotCQlzdHJ1Y3QgbXNtX2NhbV9jb25maWdfZGV2LCBjb25maWdfY2Rldik7Ci0KLQlEKCIlczogb3BlbiAlc1xuIiwgX19mdW5jX18sIGZwLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSk7Ci0KLQlyYyA9IG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZwKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IG5vbnNlZWthYmxlX29wZW4gZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0JY29uZmlnX2NhbS0+dXNlX2NvdW50Kys7Ci0KLQkvKiBhc3N1bWUgdGhlcmUgaXMgb25seSBvbmUgYWN0aXZlIGNhbWVyYSBwb3NzaWJsZSovCi0JY29uZmlnX2NhbS0+cF9tY3RsID0gbXNtX2NhbV9zZXJ2ZXJfZ2V0X21jdGwoCi0JCWdfc2VydmVyX2Rldi5wY2FtX2FjdGl2ZVtjb25maWdfY2FtLT5kZXZfbnVtXS0+bWN0bF9oYW5kbGUpOwotCWlmICghY29uZmlnX2NhbS0+cF9tY3RsKSB7Ci0JCXByX2VycigiJXM6IGNhbm5vdCBmaW5kIG1jdGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JSU5JVF9ITElTVF9IRUFEKCZjb25maWdfY2FtLT5wX21jdGwtPnN0YXRzX2luZm8ucG1lbV9zdGF0c19saXN0KTsKLQlzcGluX2xvY2tfaW5pdCgmY29uZmlnX2NhbS0+cF9tY3RsLT5zdGF0c19pbmZvLnBtZW1fc3RhdHNfc3BpbmxvY2spOwotCi0JY29uZmlnX2NhbS0+cF9tY3RsLT5jb25maWdfZGV2aWNlID0gY29uZmlnX2NhbTsKLSNpZmRlZiBDT05GSUdfTVNNX01VTFRJTUVESUFfVVNFX0lPTgotCWtyZWZfZ2V0KCZjb25maWdfY2FtLT5wX21jdGwtPnJlZmNvdW50KTsKLSNlbmRpZgotCWZwLT5wcml2YXRlX2RhdGEgPSBjb25maWdfY2FtOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fc2V0X21jdGxfc3ViZGV2KHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXN0cnVjdCBtc21fbWN0bF9zZXRfc2Rldl9kYXRhICpzZXRfZGF0YSkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCB2NGwyX3N1YmRldiAqdGVtcF9zZGV2ID0gTlVMTDsKLQlzd2l0Y2ggKHNldF9kYXRhLT5zZGV2X3R5cGUpIHsKLQljYXNlIENTSVBIWV9ERVY6Ci0JCXBtY3RsLT5jc2lwaHlfc2RldiA9IG1zbV9jYW1fZmluZF9zdWJkZXZfbm9kZQotCQkJKCZnX3NlcnZlcl9kZXYuY3NpcGh5X2RldmljZVswXSwgc2V0X2RhdGEtPnJldmlzaW9uKTsKLQkJdGVtcF9zZGV2ID0gcG1jdGwtPmNzaXBoeV9zZGV2OwotCQlicmVhazsKLQljYXNlIENTSURfREVWOgotCQlwbWN0bC0+Y3NpZF9zZGV2ID0gbXNtX2NhbV9maW5kX3N1YmRldl9ub2RlCi0JCQkoJmdfc2VydmVyX2Rldi5jc2lkX2RldmljZVswXSwgc2V0X2RhdGEtPnJldmlzaW9uKTsKLQkJdGVtcF9zZGV2ID0gcG1jdGwtPmNzaWRfc2RldjsKLQkJYnJlYWs7Ci0JY2FzZSBDU0lDX0RFVjoKLQkJcG1jdGwtPmNzaWNfc2RldiA9IG1zbV9jYW1fZmluZF9zdWJkZXZfbm9kZQotCQkJKCZnX3NlcnZlcl9kZXYuY3NpY19kZXZpY2VbMF0sIHNldF9kYXRhLT5yZXZpc2lvbik7Ci0JCXRlbXBfc2RldiA9IHBtY3RsLT5jc2ljX3NkZXY7Ci0JCWJyZWFrOwotCWNhc2UgSVNQSUZfREVWOgotCQlwbWN0bC0+aXNwaWZfc2RldiA9IG1zbV9jYW1fZmluZF9zdWJkZXZfbm9kZQotCQkJKCZnX3NlcnZlcl9kZXYuaXNwaWZfZGV2aWNlWzBdLCBzZXRfZGF0YS0+cmV2aXNpb24pOwotCQl0ZW1wX3NkZXYgPSBwbWN0bC0+aXNwaWZfc2RldjsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfREVWOgotCQlwbWN0bC0+dmZlX3NkZXYgPSBtc21fY2FtX2ZpbmRfc3ViZGV2X25vZGUKLQkJCSgmZ19zZXJ2ZXJfZGV2LnZmZV9kZXZpY2VbMF0sIHNldF9kYXRhLT5yZXZpc2lvbik7Ci0JCXRlbXBfc2RldiA9IHBtY3RsLT52ZmVfc2RldjsKLQkJYnJlYWs7Ci0JY2FzZSBBWElfREVWOgotCQlwbWN0bC0+YXhpX3NkZXYgPSBtc21fY2FtX2ZpbmRfc3ViZGV2X25vZGUKLQkJCSgmZ19zZXJ2ZXJfZGV2LmF4aV9kZXZpY2VbMF0sIHNldF9kYXRhLT5yZXZpc2lvbik7Ci0JCXRlbXBfc2RldiA9IHBtY3RsLT5heGlfc2RldjsKLQkJYnJlYWs7Ci0JY2FzZSBWUEVfREVWOgotCQlwbWN0bC0+dnBlX3NkZXYgPSBtc21fY2FtX2ZpbmRfc3ViZGV2X25vZGUKLQkJCSgmZ19zZXJ2ZXJfZGV2LnZwZV9kZXZpY2VbMF0sIHNldF9kYXRhLT5yZXZpc2lvbik7Ci0JCXRlbXBfc2RldiA9IHBtY3RsLT52cGVfc2RldjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0JaWYgKHRlbXBfc2RldiAhPSBOVUxMKQotCQl2NGwyX3NldF9zdWJkZXZfaG9zdGRhdGEodGVtcF9zZGV2LCBwbWN0bCk7Ci0JZWxzZQotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgZmluZCBzdWJkZXZcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3Vuc2V0X21jdGxfc3ViZGV2KHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXN0cnVjdCBtc21fbWN0bF9zZXRfc2Rldl9kYXRhICpzZXRfZGF0YSkKLXsKLQlpbnQgcmMgPSAwOwotCXN3aXRjaCAoc2V0X2RhdGEtPnNkZXZfdHlwZSkgewotCWNhc2UgQ1NJUEhZX0RFVjoKLQkJcG1jdGwtPmNzaXBoeV9zZGV2ID0gTlVMTDsKLQkJYnJlYWs7Ci0JY2FzZSBDU0lEX0RFVjoKLQkJcG1jdGwtPmNzaWRfc2RldiA9IE5VTEw7Ci0JCWJyZWFrOwotCWNhc2UgQ1NJQ19ERVY6Ci0JCXBtY3RsLT5jc2ljX3NkZXYgPSBOVUxMOwotCQlicmVhazsKLQljYXNlIElTUElGX0RFVjoKLQkJcG1jdGwtPmlzcGlmX3NkZXYgPSBOVUxMOwotCQlicmVhazsKLQljYXNlIFZGRV9ERVY6Ci0JCXBtY3RsLT52ZmVfc2RldiA9IE5VTEw7Ci0JCWJyZWFrOwotCWNhc2UgQVhJX0RFVjoKLQkJcG1jdGwtPmF4aV9zZGV2ID0gTlVMTDsKLQkJYnJlYWs7Ci0JY2FzZSBWUEVfREVWOgotCQlwbWN0bC0+dnBlX3NkZXYgPSBOVUxMOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBsb25nIG1zbV9pb2N0bF9jb25maWcoc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLAotCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCi0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgdjRsMl9ldmVudCBldjsKLQlzdHJ1Y3QgbXNtX2NhbV9jb25maWdfZGV2ICpjb25maWdfY2FtID0gZnAtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24gdGVtcF9zdWI7Ci0KLQlEKCIlczogY21kICVkXG4iLCBfX2Z1bmNfXywgX0lPQ19OUihjbWQpKTsKLQlldi5pZCA9IDA7DQotCi0Jc3dpdGNoIChjbWQpIHsKLQkvKiBtZW1vcnkgbWFuYWdlbWVudCBzaGFsbCBiZSBoYW5kZWxkIGhlcmUqLwotCWNhc2UgTVNNX0NBTV9JT0NUTF9SRUdJU1RFUl9QTUVNOgotCQlyZXR1cm4gbXNtX3JlZ2lzdGVyX3BtZW0oCi0JCQkmY29uZmlnX2NhbS0+cF9tY3RsLT5zdGF0c19pbmZvLnBtZW1fc3RhdHNfbGlzdCwKLQkJCSh2b2lkIF9fdXNlciAqKWFyZywgY29uZmlnX2NhbS0+cF9tY3RsLT5jbGllbnQsCi0JCQljb25maWdfY2FtLT5wX21jdGwtPmRvbWFpbl9udW0pOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0NBTV9JT0NUTF9VTlJFR0lTVEVSX1BNRU06Ci0JCXJldHVybiBtc21fcG1lbV90YWJsZV9kZWwoCi0JCQkmY29uZmlnX2NhbS0+cF9tY3RsLT5zdGF0c19pbmZvLnBtZW1fc3RhdHNfbGlzdCwKLQkJCSh2b2lkIF9fdXNlciAqKWFyZywgY29uZmlnX2NhbS0+cF9tY3RsLT5jbGllbnQsCi0JCQljb25maWdfY2FtLT5wX21jdGwtPmRvbWFpbl9udW0pOwotCQlicmVhazsKLQotCWNhc2UgVklESU9DX1NVQlNDUklCRV9FVkVOVDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0ZW1wX3N1YiwKLQkJCSh2b2lkIF9fdXNlciAqKWFyZywKLQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24pKSkgewotCQkJCXByX2VycigiJXMgY29weV9mcm9tX3VzZXIgZmFpbGVkIGZvciBjbWQgJWQgIiwKLQkJCQkJX19mdW5jX18sIGNtZCk7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCXJldHVybiByYzsKLQkJfQotCQlyYyA9IG1zbV9zZXJ2ZXJfdjRsMl9zdWJzY3JpYmVfZXZlbnQKLQkJCSgmY29uZmlnX2NhbS0+Y29uZmlnX3N0YXRfZXZlbnRfcXVldWUuZXZlbnRIYW5kbGUsCi0JCQkJICZ0ZW1wX3N1Yik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGNhbV92NGwyX3N1YnNjcmliZV9ldmVudCBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVklESU9DX1VOU1VCU0NSSUJFX0VWRU5UOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJnRlbXBfc3ViLCAodm9pZCBfX3VzZXIgKilhcmcsCi0JCQkgIHNpemVvZihzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24pKSkgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCXJjID0gbXNtX3NlcnZlcl92NGwyX3Vuc3Vic2NyaWJlX2V2ZW50Ci0JCQkoJmNvbmZpZ19jYW0tPmNvbmZpZ19zdGF0X2V2ZW50X3F1ZXVlLmV2ZW50SGFuZGxlLAotCQkJICZ0ZW1wX3N1Yik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGNhbV92NGwyX3Vuc3Vic2NyaWJlX2V2ZW50IGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURJT0NfRFFFVkVOVDogewotCQl2b2lkIF9fdXNlciAqdV9tc2dfdmFsdWUgPSBOVUxMLCAqdXNlcl9wdHIgPSBOVUxMOwotCQlzdHJ1Y3QgbXNtX2lzcF9ldmVudF9jdHJsIHVfaXNwX2V2ZW50OwotCQlzdHJ1Y3QgbXNtX2lzcF9ldmVudF9jdHJsICprX2lzcF9ldmVudDsKLQotCQkvKiBGaXJzdCwgY29weSB0aGUgdjRsMiBldmVudCBzdHJ1Y3R1cmUgZnJvbSB1c2Vyc3BhY2UgKi8KLQkJRCgiJXM6IFZJRElPQ19EUUVWRU5UXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZXYsICh2b2lkIF9fdXNlciAqKWFyZywKLQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfZXZlbnQpKSkKLQkJCWJyZWFrOwotCQkvKiBOZXh0LCBnZXQgdGhlIHBvaW50ZXIgdG8gZXZlbnRfY3RybCBzdHJ1Y3R1cmUKLQkJICogZW1iZWRkZWQgaW5zaWRlIHRoZSB2NGwyX2V2ZW50LnUuZGF0YSBhcnJheS4gKi8KLQkJdXNlcl9wdHIgPSAodm9pZCBfX3VzZXIgKikoKigodWludDMyX3QgKilldi51LmRhdGEpKTsKLQotCQkvKiBOZXh0LCBjb3B5IHRoZSB1c2Vyc3BhY2UgZXZlbnQgY3RybCBzdHJ1Y3R1cmUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJnVfaXNwX2V2ZW50LCB1c2VyX3B0ciwKLQkJCQkgICBzaXplb2Yoc3RydWN0IG1zbV9pc3BfZXZlbnRfY3RybCkpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBTYXZlIHRoZSBwb2ludGVyIG9mIHRoZSB1c2VyIGFsbG9jYXRlZCBjb21tYW5kIGJ1ZmZlciovCi0JCXVfbXNnX3ZhbHVlID0gdV9pc3BfZXZlbnQuaXNwX2RhdGEuaXNwX21zZy5kYXRhOwotCi0JCS8qIERlcXVldWUgdGhlIGV2ZW50IHF1ZXVlZCBpbnRvIHRoZSB2NGwyIHF1ZXVlKi8KLQkJcmMgPSB2NGwyX2V2ZW50X2RlcXVldWUoCi0JCQkmY29uZmlnX2NhbS0+Y29uZmlnX3N0YXRfZXZlbnRfcXVldWUuZXZlbnRIYW5kbGUsCi0JCQkmZXYsIGZwLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2Vycigibm8gcGVuZGluZyBldmVudHM/Iik7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBVc2Uga19pc3BfZXZlbnQgdG8gcG9pbnQgdG8gdGhlIGV2ZW50X2N0cmwgc3RydWN0dXJlCi0JCSAqIGVtYmVkZGVkIGluc2lkZSB2NGwyX2V2ZW50LnUuZGF0YSAqLwotCQlrX2lzcF9ldmVudCA9IChzdHJ1Y3QgbXNtX2lzcF9ldmVudF9jdHJsICopCi0JCQkJKCooKHVpbnQzMl90ICopZXYudS5kYXRhKSk7Ci0JCS8qIENvcHkgdGhlIGV2ZW50IHN0cnVjdHVyZSBpbnRvIHVzZXIgc3RydWN0LiAqLwotCQl1X2lzcF9ldmVudCA9ICprX2lzcF9ldmVudDsKLQkJaWYgKGV2LnR5cGUgIT0gKFY0TDJfRVZFTlRfUFJJVkFURV9TVEFSVCArCi0JCQkJTVNNX0NBTV9SRVNQX0RJVl9GUkFNRV9FVlRfTVNHKSAmJgotCQkJCWV2LnR5cGUgIT0gKFY0TDJfRVZFTlRfUFJJVkFURV9TVEFSVCArCi0JCQkJTVNNX0NBTV9SRVNQX01DVExfUFBfRVZFTlQpKSB7Ci0KLQkJCS8qIFJlc3RvcmUgdGhlIHNhdmVkIHBvaW50ZXIgb2YgdGhlCi0JCQkgKiB1c2VyIGFsbG9jYXRlZCBjb21tYW5kIGJ1ZmZlci4gKi8KLQkJCXVfaXNwX2V2ZW50LmlzcF9kYXRhLmlzcF9tc2cuZGF0YSA9IHVfbXNnX3ZhbHVlOwotCi0JCQlpZiAoZXYudHlwZSA9PSAoVjRMMl9FVkVOVF9QUklWQVRFX1NUQVJUICsKLQkJCQkJTVNNX0NBTV9SRVNQX1NUQVRfRVZUX01TRykpIHsKLQkJCQlpZiAoa19pc3BfZXZlbnQtPmlzcF9kYXRhLmlzcF9tc2cubGVuID4gMCkgewotCQkJCQl2b2lkICprX21zZ192YWx1ZSA9Ci0JCQkJCWtfaXNwX2V2ZW50LT5pc3BfZGF0YS5pc3BfbXNnLmRhdGE7Ci0JCQkJCWlmIChjb3B5X3RvX3VzZXIodV9tc2dfdmFsdWUsCi0JCQkJCQkJa19tc2dfdmFsdWUsCi0JCQkJCSBrX2lzcF9ldmVudC0+aXNwX2RhdGEuaXNwX21zZy5sZW4pKSB7Ci0JCQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlrZnJlZShrX21zZ192YWx1ZSk7Ci0JCQkJCWtfbXNnX3ZhbHVlID0gTlVMTDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLyogQ29weSB0aGUgZXZlbnQgY3RybCBzdHJ1Y3R1cmUgYmFjawotCQkgKiBpbnRvIHVzZXIncyBzdHJ1Y3R1cmUuICovCi0JCWlmIChjb3B5X3RvX3VzZXIodXNlcl9wdHIsCi0JCQkJKHZvaWQgKikmdV9pc3BfZXZlbnQsIHNpemVvZigKLQkJCQlzdHJ1Y3QgbXNtX2lzcF9ldmVudF9jdHJsKSkpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWtmcmVlKGtfaXNwX2V2ZW50KTsKLQkJa19pc3BfZXZlbnQgPSBOVUxMOwotCi0JCS8qIENvcHkgdGhlIHY0bDJfZXZlbnQgc3RydWN0dXJlIGJhY2sgdG8gdGhlIHVzZXIqLwotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmV2LAotCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9ldmVudCkpKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9DQU1fSU9DVExfVjRMMl9FVlRfTk9USUZZOgotCQlyYyA9IG1zbV92NGwyX2V2dF9ub3RpZnkoY29uZmlnX2NhbS0+cF9tY3RsLCBjbWQsIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQ0FNX0lPQ1RMX1NFVF9NQ1RMX1NERVY6ewotCQlzdHJ1Y3QgbXNtX21jdGxfc2V0X3NkZXZfZGF0YSBzZXRfZGF0YTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZXRfZGF0YSwgKHZvaWQgX191c2VyICopYXJnLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fbWN0bF9zZXRfc2Rldl9kYXRhKSkpIHsKLQkJCUVSUl9DT1BZX0ZST01fVVNFUigpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmMgPSBtc21fc2V0X21jdGxfc3ViZGV2KGNvbmZpZ19jYW0tPnBfbWN0bCwgJnNldF9kYXRhKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBNU01fQ0FNX0lPQ1RMX1VOU0VUX01DVExfU0RFVjp7Ci0JCXN0cnVjdCBtc21fbWN0bF9zZXRfc2Rldl9kYXRhIHNldF9kYXRhOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNldF9kYXRhLCAodm9pZCBfX3VzZXIgKilhcmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9tY3RsX3NldF9zZGV2X2RhdGEpKSkgewotCQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IG1zbV91bnNldF9tY3RsX3N1YmRldihjb25maWdfY2FtLT5wX21jdGwsICZzZXRfZGF0YSk7Ci0JCWJyZWFrOwotCX0KLQotCWRlZmF1bHQ6ewotCQkvKiBGb3IgdGhlIHJlc3Qgb2YgY29uZmlnIGNvbW1hbmQsIGZvcndhcmQgdG8gbWVkaWEgY29udHJvbGxlciovCi0JCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBfbWN0bCA9IGNvbmZpZ19jYW0tPnBfbWN0bDsKLQkJaWYgKHBfbWN0bCAmJiBwX21jdGwtPm1jdGxfY21kKSB7Ci0JCQlyYyA9IGNvbmZpZ19jYW0tPnBfbWN0bC0+bWN0bF9jbWQocF9tY3RsLCBjbWQsIGFyZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlwcl9lcnIoIiVzOiBtZWRpYSBjb250cm9sbGVyIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJfQotCi0JCWJyZWFrOwotCX0gLyogZW5kIG9mIGRlZmF1bHQqLwotCX0gLyogZW5kIG9mIHN3aXRjaCovCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9jbG9zZV9jb25maWcoc3RydWN0IGlub2RlICpub2RlLCBzdHJ1Y3QgZmlsZSAqZikKLXsKLQlzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24gc3ViOwotCXN0cnVjdCBtc21fY2FtX2NvbmZpZ19kZXYgKmNvbmZpZ19jYW0gPSBmLT5wcml2YXRlX2RhdGE7Ci0KLSNpZmRlZiBDT05GSUdfTVNNX01VTFRJTUVESUFfVVNFX0lPTgotCUQoIiVzIERlY3JlbWVudGluZyByZWYgY291bnQgb2YgY29uZmlnIG5vZGUgIiwgX19mdW5jX18pOwotCWtyZWZfcHV0KCZjb25maWdfY2FtLT5wX21jdGwtPnJlZmNvdW50LCBtc21fcmVsZWFzZV9pb25fY2xpZW50KTsKLSNlbmRpZgotCXN1Yi50eXBlID0gVjRMMl9FVkVOVF9BTEw7Ci0JbXNtX3NlcnZlcl92NGwyX3Vuc3Vic2NyaWJlX2V2ZW50KAotCQkmY29uZmlnX2NhbS0+Y29uZmlnX3N0YXRfZXZlbnRfcXVldWUuZXZlbnRIYW5kbGUsCi0JCSZzdWIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtc21fZm9wc19jb25maWcgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gID0gbXNtX29wZW5fY29uZmlnLAotCS5wb2xsICA9IG1zbV9wb2xsX2NvbmZpZywKLQkudW5sb2NrZWRfaW9jdGwgPSBtc21faW9jdGxfY29uZmlnLAotCS5yZWxlYXNlID0gbXNtX2Nsb3NlX2NvbmZpZywKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3NldHVwX2NvbmZpZ19kZXYoaW50IG5vZGUsIGNoYXIgKmRldmljZV9uYW1lKQotewotCWludCByYyA9IC1FTk9ERVY7Ci0Jc3RydWN0IGRldmljZSAqZGV2aWNlX2NvbmZpZzsKLQlpbnQgZGV2X251bSA9IG5vZGU7Ci0JZGV2X3QgZGV2bm87Ci0Jc3RydWN0IG1zbV9jYW1fY29uZmlnX2RldiAqY29uZmlnX2NhbTsKLQotCWNvbmZpZ19jYW0gPSBremFsbG9jKHNpemVvZigqY29uZmlnX2NhbSksIEdGUF9LRVJORUwpOwotCWlmICghY29uZmlnX2NhbSkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb25maWdfZGV2aWNlXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlEKCIlc1xuIiwgX19mdW5jX18pOwotCi0JZGV2bm8gPSBNS0RFVihNQUpPUihtc21fZGV2bm8pLCBkZXZfbnVtKzEpOwotCWRldmljZV9jb25maWcgPSBkZXZpY2VfY3JlYXRlKG1zbV9jbGFzcywgTlVMTCwgZGV2bm8sIE5VTEwsICIlcyVkIiwKLQkJZGV2aWNlX25hbWUsIGRldl9udW0pOwotCi0JaWYgKElTX0VSUihkZXZpY2VfY29uZmlnKSkgewotCQlyYyA9IFBUUl9FUlIoZGV2aWNlX2NvbmZpZyk7Ci0JCXByX2VycigiJXM6IGVycm9yIGNyZWF0aW5nIGRldmljZTogJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCWdvdG8gY29uZmlnX3NldHVwX2ZhaWw7Ci0JfQotCi0JY2Rldl9pbml0KCZjb25maWdfY2FtLT5jb25maWdfY2RldiwgJm1zbV9mb3BzX2NvbmZpZyk7Ci0JY29uZmlnX2NhbS0+Y29uZmlnX2NkZXYub3duZXIgPSBUSElTX01PRFVMRTsKLQotCXJjID0gY2Rldl9hZGQoJmNvbmZpZ19jYW0tPmNvbmZpZ19jZGV2LCBkZXZubywgMSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBlcnJvciBhZGRpbmcgY2RldjogJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCWRldmljZV9kZXN0cm95KG1zbV9jbGFzcywgZGV2bm8pOwotCQlnb3RvIGNvbmZpZ19zZXR1cF9mYWlsOwotCX0KLQlnX3NlcnZlcl9kZXYuY29uZmlnX2luZm8uY29uZmlnX2Rldl9uYW1lW2Rldl9udW1dID0KLQkJZGV2X25hbWUoZGV2aWNlX2NvbmZpZyk7Ci0JRCgiJXMgQ29ubmVjdGVkIGNvbmZpZyBkZXZpY2UgJXNcbiIsIF9fZnVuY19fLAotCQlnX3NlcnZlcl9kZXYuY29uZmlnX2luZm8uY29uZmlnX2Rldl9uYW1lW2Rldl9udW1dKTsKLQlnX3NlcnZlcl9kZXYuY29uZmlnX2luZm8uY29uZmlnX2Rldl9pZFtkZXZfbnVtXSA9Ci0JCWRldl9udW07Ci0KLQljb25maWdfY2FtLT5jb25maWdfc3RhdF9ldmVudF9xdWV1ZS5wdmRldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOwotCWlmIChjb25maWdfY2FtLT5jb25maWdfc3RhdF9ldmVudF9xdWV1ZS5wdmRldiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHZpZGVvX2RldmljZV9hbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBjb25maWdfc2V0dXBfZmFpbDsKLQl9Ci0KLQkvKiB2NGwyX2ZoIHN1cHBvcnQgKi8KLQlzcGluX2xvY2tfaW5pdCgmY29uZmlnX2NhbS0+Y29uZmlnX3N0YXRfZXZlbnRfcXVldWUucHZkZXYtPmZoX2xvY2spOwotCUlOSVRfTElTVF9IRUFEKCZjb25maWdfY2FtLT5jb25maWdfc3RhdF9ldmVudF9xdWV1ZS5wdmRldi0+ZmhfbGlzdCk7Ci0JbXNtX3NldHVwX3Y0bDJfZXZlbnRfcXVldWUoCi0JCSZjb25maWdfY2FtLT5jb25maWdfc3RhdF9ldmVudF9xdWV1ZS5ldmVudEhhbmRsZSwKLQkJY29uZmlnX2NhbS0+Y29uZmlnX3N0YXRfZXZlbnRfcXVldWUucHZkZXYpOwotCWNvbmZpZ19jYW0tPmRldl9udW0gPSBkZXZfbnVtOwotCi0JcmV0dXJuIHJjOwotCi1jb25maWdfc2V0dXBfZmFpbDoKLQlrZnJlZShjb25maWdfY2FtKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IG1zbV9jYW1lcmFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmMgPSAwLCBpOwotCW1lbXNldCgmZ19zZXJ2ZXJfZGV2LCAwLCBzaXplb2Yoc3RydWN0IG1zbV9jYW1fc2VydmVyX2RldikpOwotCS8qZm9yIG5vdyBqdXN0IGNyZWF0ZSB0d28gY29uZmlnIG5vZGVzCi0JICBwdXQgbG9naWMgaGVyZSBsYXRlciB0byBrbm93IGhvdyBtYW55IGNvbmZpZ3MgdG8gY3JlYXRlKi8KLQlnX3NlcnZlcl9kZXYuY29uZmlnX2luZm8ubnVtX2NvbmZpZ19ub2RlcyA9IDI7Ci0KLQlpZiAoIW1zbV9jbGFzcykgewotCQlyYyA9IGFsbG9jX2NocmRldl9yZWdpb24oJm1zbV9kZXZubywgMCwKLQkJZ19zZXJ2ZXJfZGV2LmNvbmZpZ19pbmZvLm51bV9jb25maWdfbm9kZXMrMSwgIm1zbV9jYW1lcmEiKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGNocmRldjogJWRcbiIsIF9fZnVuY19fLAotCQkJcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0KLQkJbXNtX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAibXNtX2NhbWVyYSIpOwotCQlpZiAoSVNfRVJSKG1zbV9jbGFzcykpIHsKLQkJCXJjID0gUFRSX0VSUihtc21fY2xhc3MpOwotCQkJcHJfZXJyKCIlczogY3JlYXRlIGRldmljZSBjbGFzcyBmYWlsZWQ6ICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCUQoImNyZWF0aW5nIHNlcnZlciBhbmQgY29uZmlnIG5vZGVzXG4iKTsKLQlyYyA9IG1zbV9zZXR1cF9zZXJ2ZXJfZGV2KHBkZXYpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGNyZWF0ZSBzZXJ2ZXIgZGV2OiAlZFxuIiwgX19mdW5jX18sCi0JCXJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBnX3NlcnZlcl9kZXYuY29uZmlnX2luZm8ubnVtX2NvbmZpZ19ub2RlczsgaSsrKSB7Ci0JCXJjID0gbXNtX3NldHVwX2NvbmZpZ19kZXYoaSwgImNvbmZpZyIpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOmZhaWxlZCB0byBjcmVhdGUgY29uZmlnIGRldjogJWRcbiIsCi0JCQkgX19mdW5jX18sIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX2V4aXQgbXNtX2NhbWVyYV9leGl0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9jYW1fc2VydmVyX2R0X21hdGNoW10gPSB7Ci0Jey5jb21wYXRpYmxlID0gInFjb20sY2FtX3NlcnZlciJ9LAotfQotCi1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fY2FtX3NlcnZlcl9kdF9tYXRjaCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9jYW1fc2VydmVyX2RyaXZlciA9IHsKLQkucHJvYmUgPSBtc21fY2FtZXJhX3Byb2JlLAotCS5yZW1vdmUgPSBtc21fY2FtZXJhX2V4aXQsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtX2NhbV9zZXJ2ZXIiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gbXNtX2NhbV9zZXJ2ZXJfZHRfbWF0Y2gsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9jYW1fc2VydmVyX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fY2FtX3NlcnZlcl9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXNtX2NhbV9zZXJ2ZXJfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fY2FtX3NlcnZlcl9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChtc21fY2FtX3NlcnZlcl9pbml0KTsKLW1vZHVsZV9leGl0KG1zbV9jYW1fc2VydmVyX2V4aXQpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJtc20gY2FtZXJhIHNlcnZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlcnZlci9tc21fY2FtX3NlcnZlci5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NlcnZlci9tc21fY2FtX3NlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTA4MzBlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZXJ2ZXIvbXNtX2NhbV9zZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfTVNNX0NBTV9TRVJWRVJfSAotI2RlZmluZSBfTVNNX0NBTV9TRVJWRVJfSAotCi0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlICIuLi9tc20uaCIKLQotdWludDMyX3QgbXNtX2NhbV9zZXJ2ZXJfZ2V0X21jdGxfaGFuZGxlKHZvaWQpOwotc3RydWN0IGlvbW11X2RvbWFpbiAqbXNtX2NhbV9zZXJ2ZXJfZ2V0X2RvbWFpbih2b2lkKTsKLWludCBtc21fY2FtX3NlcnZlcl9nZXRfZG9tYWluX251bSh2b2lkKTsKLXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKm1zbV9jYW1fc2VydmVyX2dldF9tY3RsKHVpbnQzMl90IGhhbmRsZSk7Ci12b2lkIG1zbV9jYW1fc2VydmVyX2ZyZWVfbWN0bCh1aW50MzJfdCBoYW5kbGUpOwotLyogU2VydmVyIHNlc3Npb24gY29udHJvbCBBUElzICovCi1pbnQgbXNtX3NlcnZlcl9iZWdpbl9zZXNzaW9uKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtLAotCWludCBzZXJ2ZXJfcV9pZHgpOwotaW50IG1zbV9zZXJ2ZXJfZW5kX3Nlc3Npb24oc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0pOwotaW50IG1zbV9zZW5kX29wZW5fc2VydmVyKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtKTsKLWludCBtc21fc2VuZF9jbG9zZV9zZXJ2ZXIoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0pOwotaW50IG1zbV9zZXJ2ZXJfdXBkYXRlX3NlbnNvcl9pbmZvKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtLAotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzZGF0YSk7Ci0vKiBTZXJ2ZXIgY2FtZXJhIGNvbnRyb2wgQVBJcyAqLwotaW50IG1zbV9zZXJ2ZXJfc3RyZWFtb24oc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0sIGludCBpZHgpOwotaW50IG1zbV9zZXJ2ZXJfc3RyZWFtb2ZmKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtLCBpbnQgaWR4KTsKLWludCBtc21fc2VydmVyX2dldF91c2Vjb3VudCh2b2lkKTsKLWludDMyX3QgbXNtX2ZpbmRfZnJlZV9xdWV1ZSh2b2lkKTsKLWludCBtc21fc2VydmVyX3Byb2NfY3RybF9jbWQoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0sCi0Jc3RydWN0IG1zbV9jYW1lcmFfdjRsMl9pb2N0bF90ICppb2N0bF9wdHIsIGludCBpc19zZXRfY21kKTsKLWludCBtc21fc2VydmVyX3ByaXZhdGVfZ2VuZXJhbChzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSwKLQlzdHJ1Y3QgbXNtX2NhbWVyYV92NGwyX2lvY3RsX3QgKmlvY3RsX3B0cik7Ci1pbnQgbXNtX3NlcnZlcl9zX2N0cmwoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0sCi0Jc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCk7Ci1pbnQgbXNtX3NlcnZlcl9nX2N0cmwoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0sCi0Jc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCk7Ci1pbnQgbXNtX3NlcnZlcl9xX2N0cmwoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0sCi0Jc3RydWN0IHY0bDJfcXVlcnljdHJsICpxdWVyeWN0cmwpOwotaW50IG1zbV9zZXJ2ZXJfc2V0X2ZtdChzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSwgaW50IGlkeCwKLQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKnBmbXQpOwotaW50IG1zbV9zZXJ2ZXJfc2V0X2ZtdF9tcGxhbmUoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0sIGludCBpZHgsCi0Jc3RydWN0IHY0bDJfZm9ybWF0ICpwZm10KTsKLWludCBtc21fc2VydmVyX2dldF9mbXQoc3RydWN0IG1zbV9jYW1fdjRsMl9kZXZpY2UgKnBjYW0sCi0JaW50IGlkeCwgc3RydWN0IHY0bDJfZm9ybWF0ICpwZm10KTsKLWludCBtc21fc2VydmVyX2dldF9mbXRfbXBsYW5lKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtLAotCWludCBpZHgsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqcGZtdCk7Ci1pbnQgbXNtX3NlcnZlcl90cnlfZm10KHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtLAotCXN0cnVjdCB2NGwyX2Zvcm1hdCAqcGZtdCk7Ci1pbnQgbXNtX3NlcnZlcl90cnlfZm10X21wbGFuZShzdHJ1Y3QgbXNtX2NhbV92NGwyX2RldmljZSAqcGNhbSwKLQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKnBmbXQpOwotaW50IG1zbV9zZXJ2ZXJfdjRsMl9zdWJzY3JpYmVfZXZlbnQoc3RydWN0IHY0bDJfZmggKmZoLAotCXN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiAqc3ViKTsKLWludCBtc21fc2VydmVyX3Y0bDJfdW5zdWJzY3JpYmVfZXZlbnQoc3RydWN0IHY0bDJfZmggKmZoLAotCXN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiAqc3ViKTsKLWludCBtc21fc2VydmVyX2dldF9jcm9wKHN0cnVjdCBtc21fY2FtX3Y0bDJfZGV2aWNlICpwY2FtLAotCWludCBpZHgsIHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApOwotaW50IG1zbV9jYW1fc2VydmVyX3JlcXVlc3RfaXJxKHZvaWQgKmFyZyk7Ci1pbnQgbXNtX2NhbV9zZXJ2ZXJfdXBkYXRlX2lycW1hcCgKLQlzdHJ1Y3QgbXNtX2NhbV9zZXJ2ZXJfaXJxbWFwX2VudHJ5ICplbnRyeSk7Ci1pbnQgbXNtX2NhbV9zZXJ2ZXJfY29uZmlnX2ludGVyZmFjZV9tYXAodTMyIGV4dGVuZGVkbW9kZSwKLQl1aW50MzJfdCBtY3RsX2hhbmRsZSwgaW50IHZub2RlX2lkLCBpbnQgaXNfYmF5ZXJfc2Vuc29yKTsKLSNlbmRpZiAvKiBfTVNNX0NBTV9TRVJWRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3NuMTJtMHB6LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc24xMm0wcHouYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjZDczMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc24xMm0wcHouYworKysgL2Rldi9udWxsCkBAIC0xLDE4NTEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9tc21fY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSAic24xMm0wcHouaCIKLQotCi0jZGVmaW5lCVE4CQkJCQkweDAwMDAwMTAwCi0jZGVmaW5lCVJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xECQkweDAxMDQKLSNkZWZpbmUJR1JPVVBFRF9QQVJBTUVURVJfSE9MRF9PRkYJCTB4MDAKLSNkZWZpbmUJR1JPVVBFRF9QQVJBTUVURVJfSE9MRAkJCTB4MDEKLSNkZWZpbmUJUkVHX01PREVfU0VMRUNUCQkJCTB4MDEwMAotI2RlZmluZQlNT0RFX1NFTEVDVF9TVEFOREJZX01PREUJCTB4MDAKLSNkZWZpbmUJTU9ERV9TRUxFQ1RfU1RSRUFNCQkJMHgwMQotCi0vKiBJbnRlZ3JhdGlvbiBUaW1lICovCi0jZGVmaW5lCVJFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9NU0IJCTB4MDIwMgotI2RlZmluZQlSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfTFNCCQkweDAyMDMKLQotLyogR2FpbiAqLwotI2RlZmluZQlSRUdfQU5BTE9HVUVfR0FJTl9DT0RFX0dMT0JBTF9NU0IJMHgwMjA0Ci0jZGVmaW5lCVJFR19BTkFMT0dVRV9HQUlOX0NPREVfR0xPQkFMX0xTQgkweDAyMDUKLQotLyogUExMIFJlZ2lzdGVyIERlZmluZXMgKi8KLSNkZWZpbmUJUkVHX1BMTF9NVUxUSVBMSUVSCQkJMHgwMzA3Ci0jZGVmaW5lCVJFR18weDMwMkIJCQkJMHgzMDJCCi0KLS8qIE1JUEkgRW5hYmxlIFNldHRpbmdzICovCi0jZGVmaW5lCVJFR18weDMwRTUJCQkJMHgzMEU1Ci0jZGVmaW5lCVJFR18weDMzMDAJCQkJMHgzMzAwCi0KLS8qIEdsb2JhbCBTZXR0aW5nICovCi0jZGVmaW5lCVJFR19JTUFHRV9PUklFTlRBVElPTgkJCTB4MDEwMQotCi0jZGVmaW5lCVJFR18weDMwMEEJCQkJMHgzMDBBCi0jZGVmaW5lCVJFR18weDMwMTQJCQkJMHgzMDE0Ci0jZGVmaW5lCVJFR18weDMwMTUJCQkJMHgzMDE1Ci0jZGVmaW5lCVJFR18weDMwMTcJCQkJMHgzMDE3Ci0jZGVmaW5lCVJFR18weDMwMUMJCQkJMHgzMDFDCi0jZGVmaW5lCVJFR18weDMwMzEJCQkJMHgzMDMxCi0jZGVmaW5lCVJFR18weDMwNDAJCQkJMHgzMDQwCi0jZGVmaW5lCVJFR18weDMwNDEJCQkJMHgzMDQxCi0jZGVmaW5lCVJFR18weDMwNTEJCQkJMHgzMDUxCi0jZGVmaW5lCVJFR18weDMwNTMJCQkJMHgzMDUzCi0jZGVmaW5lCVJFR18weDMwNTUJCQkJMHgzMDU1Ci0jZGVmaW5lCVJFR18weDMwNTcJCQkJMHgzMDU3Ci0jZGVmaW5lCVJFR18weDMwNjAJCQkJMHgzMDYwCi0jZGVmaW5lCVJFR18weDMwNjUJCQkJMHgzMDY1Ci0jZGVmaW5lCVJFR18weDMwQUEJCQkJMHgzMEFBCi0jZGVmaW5lCVJFR18weDMwQUIJCQkJMHgzMEFCCi0jZGVmaW5lCVJFR18weDMwQjAJCQkJMHgzMEIwCi0jZGVmaW5lCVJFR18weDMwQjIJCQkJMHgzMEIyCi0jZGVmaW5lCVJFR18weDMwRDMJCQkJMHgzMEQzCi0KLSNkZWZpbmUJUkVHXzB4MzEwNgkJCQkweDMxMDYKLSNkZWZpbmUJUkVHXzB4MzEwOAkJCQkweDMxMDgKLSNkZWZpbmUJUkVHXzB4MzEwQQkJCQkweDMxMEEKLSNkZWZpbmUJUkVHXzB4MzEwQwkJCQkweDMxMEMKLSNkZWZpbmUJUkVHXzB4MzEwRQkJCQkweDMxMEUKLSNkZWZpbmUJUkVHXzB4MzEyNgkJCQkweDMxMjYKLSNkZWZpbmUJUkVHXzB4MzEyRQkJCQkweDMxMkUKLSNkZWZpbmUJUkVHXzB4MzEzQwkJCQkweDMxM0MKLSNkZWZpbmUJUkVHXzB4MzEzRQkJCQkweDMxM0UKLSNkZWZpbmUJUkVHXzB4MzE0MAkJCQkweDMxNDAKLSNkZWZpbmUJUkVHXzB4MzE0MgkJCQkweDMxNDIKLSNkZWZpbmUJUkVHXzB4MzE0NAkJCQkweDMxNDQKLSNkZWZpbmUJUkVHXzB4MzE0OAkJCQkweDMxNDgKLSNkZWZpbmUJUkVHXzB4MzE0QQkJCQkweDMxNEEKLSNkZWZpbmUJUkVHXzB4MzE2NgkJCQkweDMxNjYKLSNkZWZpbmUJUkVHXzB4MzE2OAkJCQkweDMxNjgKLSNkZWZpbmUJUkVHXzB4MzE2RgkJCQkweDMxNkYKLSNkZWZpbmUJUkVHXzB4MzE3MQkJCQkweDMxNzEKLSNkZWZpbmUJUkVHXzB4MzE3MwkJCQkweDMxNzMKLSNkZWZpbmUJUkVHXzB4MzE3NQkJCQkweDMxNzUKLSNkZWZpbmUJUkVHXzB4MzE3NwkJCQkweDMxNzcKLSNkZWZpbmUJUkVHXzB4MzE3OQkJCQkweDMxNzkKLSNkZWZpbmUJUkVHXzB4MzE3QgkJCQkweDMxN0IKLSNkZWZpbmUJUkVHXzB4MzE3RAkJCQkweDMxN0QKLSNkZWZpbmUJUkVHXzB4MzE3RgkJCTB4MzE3RgotI2RlZmluZQlSRUdfMHgzMTgxCQkJMHgzMTgxCi0jZGVmaW5lCVJFR18weDMxODQJCQkweDMxODQKLSNkZWZpbmUJUkVHXzB4MzE4NQkJCTB4MzE4NQotI2RlZmluZQlSRUdfMHgzMTg3CQkJMHgzMTg3Ci0KLSNkZWZpbmUJUkVHXzB4MzFBNAkJCTB4MzFBNAotI2RlZmluZQlSRUdfMHgzMUE2CQkJMHgzMUE2Ci0jZGVmaW5lCVJFR18weDMxQUMJCQkweDMxQUMKLSNkZWZpbmUJUkVHXzB4MzFBRQkJCTB4MzFBRQotI2RlZmluZQlSRUdfMHgzMUI0CQkJMHgzMUI0Ci0jZGVmaW5lCVJFR18weDMxQjYJCQkweDMxQjYKLQotI2RlZmluZQlSRUdfMHgzMjU0CQkJMHgzMjU0Ci0jZGVmaW5lCVJFR18weDMyNTYJCQkweDMyNTYKLSNkZWZpbmUJUkVHXzB4MzI1OAkJCTB4MzI1OAotI2RlZmluZQlSRUdfMHgzMjVBCQkJMHgzMjVBCi0jZGVmaW5lCVJFR18weDMyNjAJCQkweDMyNjAKLSNkZWZpbmUJUkVHXzB4MzI2MgkJCTB4MzI2MgotCi0KLSNkZWZpbmUJUkVHXzB4MzMwNAkJCTB4MzMwNAotI2RlZmluZQlSRUdfMHgzMzA1CQkJMHgzMzA1Ci0jZGVmaW5lCVJFR18weDMzMDYJCQkweDMzMDYKLSNkZWZpbmUJUkVHXzB4MzMwNwkJCTB4MzMwNwotI2RlZmluZQlSRUdfMHgzMzA4CQkJMHgzMzA4Ci0jZGVmaW5lCVJFR18weDMzMDkJCQkweDMzMDkKLSNkZWZpbmUJUkVHXzB4MzMwQQkJCTB4MzMwQQotI2RlZmluZQlSRUdfMHgzMzBCCQkJMHgzMzBCCi0jZGVmaW5lCVJFR18weDMzMEMJCQkweDMzMEMKLSNkZWZpbmUJUkVHXzB4MzMwRAkJCTB4MzMwRAotCi0vKiBNb2RlIFNldHRpbmcgKi8KLSNkZWZpbmUJUkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19NU0IJMHgwMzQwCi0jZGVmaW5lCVJFR19GUkFNRV9MRU5HVEhfTElORVNfTFNCCTB4MDM0MQotI2RlZmluZQlSRUdfTElORV9MRU5HVEhfUENLX01TQgkJMHgwMzQyCi0jZGVmaW5lCVJFR19MSU5FX0xFTkdUSF9QQ0tfTFNCCQkweDAzNDMKLSNkZWZpbmUJUkVHX1hfT1VUUFVUX1NJWkVfTVNCCQkweDAzNEMKLSNkZWZpbmUJUkVHX1hfT1VUUFVUX1NJWkVfTFNCCQkweDAzNEQKLSNkZWZpbmUJUkVHX1lfT1VUUFVUX1NJWkVfTVNCCQkweDAzNEUKLSNkZWZpbmUJUkVHX1lfT1VUUFVUX1NJWkVfTFNCCQkweDAzNEYKLSNkZWZpbmUJUkVHX1hfRVZFTl9JTkNfTFNCCQkweDAzODEKLSNkZWZpbmUJUkVHX1hfT0REX0lOQ19MU0IJCTB4MDM4MwotI2RlZmluZQlSRUdfWV9FVkVOX0lOQ19MU0IJCTB4MDM4NQotI2RlZmluZQlSRUdfWV9PRERfSU5DX0xTQgkJMHgwMzg3Ci0jZGVmaW5lCVJFR18weDMwMTYJCQkweDMwMTYKLSNkZWZpbmUJUkVHXzB4MzBFOAkJCTB4MzBFOAotI2RlZmluZQlSRUdfMHgzMzAxCQkJMHgzMzAxCi0vKiBmb3IgMTIwZnBzIHN1cHBvcnQgKi8KLSNkZWZpbmUJUkVHXzB4MDM0NAkJCTB4MDM0NAotI2RlZmluZQlSRUdfMHgwMzQ1CQkJMHgwMzQ1Ci0jZGVmaW5lCVJFR18weDAzNDYJCQkweDAzNDYKLSNkZWZpbmUJUkVHXzB4MDM0NwkJCTB4MDM0NwotI2RlZmluZQlSRUdfMHgwMzQ4CQkJMHgwMzQ4Ci0jZGVmaW5lCVJFR18weDAzNDkJCQkweDAzNDkKLSNkZWZpbmUJUkVHXzB4MDM0QQkJCTB4MDM0QQotI2RlZmluZQlSRUdfMHgwMzRCCQkJMHgwMzRCCi0KLS8qIFRlc3QgUGF0dGVybiAqLwotI2RlZmluZQlSRUdfMHgzMEQ4CQkJMHgzMEQ4Ci0jZGVmaW5lCVJFR19URVNUX1BBVFRFUk5fTU9ERQkJMHgwNjAxCi0KLS8qIFNvbGlkIENvbG9yIFRlc3QgUGF0dGVybiAqLwotI2RlZmluZQlSRUdfVEVTVF9EQVRBX1JFRF9NU0IJCTB4MDYwMwotI2RlZmluZQlSRUdfVEVTVF9EQVRBX1JFRF9MU0IJCTB4MDYwMwotI2RlZmluZQlSRUdfVEVTVF9EQVRBX0dSRUVOUl9NU0IJMHgwNjA0Ci0jZGVmaW5lCVJFR19URVNUX0RBVEFfR1JFRU5SX0xTQgkweDA2MDUKLSNkZWZpbmUJUkVHX1RFU1RfREFUQV9CTFVFX01TQgkJMHgwNjA2Ci0jZGVmaW5lCVJFR19URVNUX0RBVEFfQkxVRV9MU0IJCTB4MDYwNwotI2RlZmluZQlSRUdfVEVTVF9EQVRBX0dSRUVOQl9NU0IJMHgwNjA4Ci0jZGVmaW5lCVJFR19URVNUX0RBVEFfR1JFRU5CX0xTQgkweDA2MDkKLSNkZWZpbmUJU04xMk0wUFpfQUZfSTJDX1NMQVZFX0lECTB4RTQKLSNkZWZpbmUJU04xMk0wUFpfU1RFUFNfTkVBUl9UT19DTE9TRVNUX0lORgk0MgotI2RlZmluZQlTTjEyTTBQWl9UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUgk0MgotCi0KLS8qIFRZUEUgREVDTEFSQVRJT05TICovCi0KLQotZW51bSBtaXBpX2NvbmZpZ190eXBlIHsKLQlJVTA2MEZfU04xMk0wUFpfU1RNSVBJRDAxLAotCUlVMDYwRl9TTjEyTTBQWl9TVE1JUElEMDIKLX07Ci0KLWVudW0gc24xMm0wcHpfdGVzdF9tb2RlX3QgewotCVRFU1RfT0ZGLAotCVRFU1RfMSwKLQlURVNUXzIsCi0JVEVTVF8zCi19OwotCi1lbnVtIHNuMTJtMHB6X3Jlc29sdXRpb25fdCB7Ci0JUVRSX1NJWkUsCi0JRlVMTF9TSVpFLAotCUlOVkFMSURfU0laRSwKLQlRVkdBX1NJWkUsCi19OwotCi1lbnVtIHNuMTJtMHB6X3NldHRpbmcgewotCVJFU19QUkVWSUVXLAotCVJFU19DQVBUVVJFLAotCVJFU19WSURFT18xMjBGUFMsCi19OwotCi1lbnVtIG10OXAwMTJfcmVnX3VwZGF0ZSB7Ci0JLyogU2Vuc29yIGVnaXN0ZXJzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiAqLwotCVJFR19JTklULAotCS8qIFNlbnNvciBlZ2lzdGVycyB0aGF0IG5lZWRzIHBlcmlvZGljIEkyQyB3cml0ZXMgKi8KLQlVUERBVEVfUEVSSU9ESUMsCi0JLyogQWxsIHRoZSBzZW5zb3IgUmVnaXN0ZXJzIHdpbGwgYmUgdXBkYXRlZCAqLwotCVVQREFURV9BTEwsCi0JLyogTm90IHZhbGlkIHVwZGF0ZSAqLwotCVVQREFURV9JTlZBTElECi19OwotCi0vKiA4MTZ4NjEyLCAyNE1IeiBNQ0xLIDk2TUh6IFBDTEsgKi8KLSNkZWZpbmUJSVUwNjBGX1NOMTJNMFBaX09GRlNFVAkJCTMKLS8qIFRpbWUgaW4gbWlsaXNlY3MgZm9yIHdhaXRpbmcgZm9yIHRoZSBzZW5zb3IgdG8gcmVzZXQuKi8KLSNkZWZpbmUJU04xMk0wUFpfUkVTRVRfREVMQVlfTVNFQ1MJCTY2Ci0jZGVmaW5lCVNOMTJNMFBaX1dJRFRICQkJCTQwMzIKLSNkZWZpbmUJU04xMk0wUFpfSEVJR0hUCQkJCTMwMjQKLSNkZWZpbmUJU04xMk0wUFpfRlVMTF9TSVpFX1dJRFRICQk0MDMyCi0jZGVmaW5lCVNOMTJNMFBaX0ZVTExfU0laRV9IRUlHSFQJCTMwMjQKLSNkZWZpbmUJU04xMk0wUFpfSFJaX0ZVTExfQkxLX1BJWEVMUwkJMTc2Ci0jZGVmaW5lCVNOMTJNMFBaX1ZFUl9GVUxMX0JMS19MSU5FUwkJNTAKLSNkZWZpbmUJU04xMk0wUFpfUVRSX1NJWkVfV0lEVEgJCQkyMDE2Ci0jZGVmaW5lCVNOMTJNMFBaX1FUUl9TSVpFX0hFSUdIVAkJMTUxMgotI2RlZmluZQlTTjEyTTBQWl9IUlpfUVRSX0JMS19QSVhFTFMJCTIxOTIKLSNkZWZpbmUJU04xMk0wUFpfVkVSX1FUUl9CTEtfTElORVMJCTI2Ci0KLS8qIDEyMGZwcyBtb2RlICovCi0jZGVmaW5lCVNOMTJNMFBaX1FWR0FfU0laRV9XSURUSAkJNDAzMgotI2RlZmluZQlTTjEyTTBQWl9RVkdBX1NJWkVfSEVJR0hUCQkyNDkKLSNkZWZpbmUJU04xMk0wUFpfSFJaX1FWR0FfQkxLX1BJWEVMUwkJMTc2Ci0jZGVmaW5lCVNOMTJNMFBaX1ZFUl9RVkdBX0JMS19MSU5FUwkJOQotI2RlZmluZQlTTjEyTTBQWl9ERUZBVUxUX0NMT0NLX1JBVEUJCTI0MDAwMDAwCi0KLXN0YXRpYyB1aW50MzJfdCBJVTA2MEZfU04xMk0wUFpfREVMQVlfTVNFQ1MgPSAzMDsKLXN0YXRpYyBlbnVtIG1pcGlfY29uZmlnX3R5cGUgbWlwaV9jb25maWcgPSBJVTA2MEZfU04xMk0wUFpfU1RNSVBJRDAyOwotLyogQUYgVHVuaW5nIFBhcmFtZXRlcnMgKi8KLXN0YXRpYyBpbnQxNl90IGVuYWJsZV9zaW5nbGVfRDAyX2xhbmU7Ci1zdGF0aWMgaW50MTZfdCBmdWxsc2l6ZV9jcm9wcGVkX2F0XzhtcDsKLQotc3RydWN0IHNuMTJtMHB6X3dvcmtfdCB7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Ci19OwotCi1zdGF0aWMgc3RydWN0IHNuMTJtMHB6X3dvcmtfdCAqc24xMm0wcHpfc2Vuc29ydzsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqc24xMm0wcHpfY2xpZW50OwotCi1zdHJ1Y3Qgc24xMm0wcHpfY3RybF90IHsKLQljb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2Vuc29yZGF0YTsKLQl1aW50MzJfdCBzZW5zb3Jtb2RlOwotCXVpbnQzMl90IGZwc19kaXZpZGVyOy8qIGluaXQgdG8gMSAqIDB4MDAwMDA0MDAgKi8KLQl1aW50MzJfdCBwaWN0X2Zwc19kaXZpZGVyOy8qIGluaXQgdG8gMSAqIDB4MDAwMDA0MDAgKi8KLQl1aW50MTZfdCBmcHM7Ci0JaW50MTZfdCBjdXJyX2xlbnNfcG9zOwotCXVpbnQxNl90IGN1cnJfc3RlcF9wb3M7Ci0JdWludDE2X3QgbXlfcmVnX2dhaW47Ci0JdWludDMyX3QgbXlfcmVnX2xpbmVfY291bnQ7Ci0JdWludDE2X3QgdG90YWxfbGluZXNfcGVyX2ZyYW1lOwotCWVudW0gc24xMm0wcHpfcmVzb2x1dGlvbl90IHByZXZfcmVzOwotCWVudW0gc24xMm0wcHpfcmVzb2x1dGlvbl90IHBpY3RfcmVzOwotCWVudW0gc24xMm0wcHpfcmVzb2x1dGlvbl90IGN1cnJfcmVzOwotCWVudW0gc24xMm0wcHpfdGVzdF9tb2RlX3QgIHNldF90ZXN0OwotCXVuc2lnbmVkIHNob3J0IGltZ2FkZHI7Ci19OwotCi1zdGF0aWMgc3RydWN0IHNuMTJtMHB6X2N0cmxfdCAqc24xMm0wcHpfY3RybDsKLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChzbjEybTBwel93YWl0X3F1ZXVlKTsKLURFRklORV9NVVRFWChzbjEybTBwel9tdXQpOwotCi0KLXN0YXRpYyBpbnQgc24xMm0wcHpfaTJjX3J4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQl1bnNpZ25lZCBjaGFyICpyeGRhdGEsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGkyY19tc2cgbXNnc1tdID0gewotCQl7Ci0JCQkuYWRkciAgPSBzYWRkciwKLQkJCS5mbGFncyA9IDAsCi0JCQkubGVuICAgPSAyLAotCQkJLmJ1ZiAgID0gcnhkYXRhLAotCQl9LAotCQl7Ci0JCQkuYWRkciAgPSBzYWRkciwKLQkJCS5mbGFncyA9IEkyQ19NX1JELAotCQkJLmxlbiAgID0gMiwKLQkJCS5idWYgICA9IHJ4ZGF0YSwKLQkJfSwKLQl9OwotCi0JaWYgKGkyY190cmFuc2ZlcihzbjEybTBwel9jbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpIDwgMCkgewotCQlDREJHKCJzbjEybTBwel9pMmNfcnhkYXRhIGZhaWxlZCEiKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50MzJfdCBzbjEybTBwel9pMmNfdHhkYXRhKHVuc2lnbmVkIHNob3J0IHNhZGRyLAotCQkJCXVuc2lnbmVkIGNoYXIgKnR4ZGF0YSwgaW50IGxlbmd0aCkKLXsKLQotCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0gewotCQl7Ci0JCQkuYWRkciAgPSBzYWRkciwKLQkJCS5mbGFncyA9IDAsCi0JCQkubGVuCSA9IGxlbmd0aCwKLQkJCS5idWYJID0gdHhkYXRhLAotCQl9LAotCX07Ci0KLQlpZiAoaTJjX3RyYW5zZmVyKHNuMTJtMHB6X2NsaWVudC0+YWRhcHRlciwgbXNnLCAxKSA8IDApIHsKLQkJQ0RCRygic24xMm0wcHpfaTJjX3R4ZGF0YSBmYWlsZCAweCV4Iiwgc24xMm0wcHpfY2xpZW50LT5hZGRyKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHNuMTJtMHB6X2kyY19yZWFkKHVuc2lnbmVkIHNob3J0IHJhZGRyLAotCQkJCXVuc2lnbmVkIHNob3J0ICpyZGF0YSwgaW50IHJsZW4pCi17Ci0JaW50MzJfdCByYzsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKLQlpZiAoIXJkYXRhKQotCQlyZXR1cm4gLUVJTzsKLQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQotCWJ1ZlswXSA9IChyYWRkciAmIDB4RkYwMCkgPj4gODsKLQlidWZbMV0gPSAocmFkZHIgJiAweDAwRkYpOwotCi0JcmMgPSBzbjEybTBwel9pMmNfcnhkYXRhKHNuMTJtMHB6X2NsaWVudC0+YWRkciwgYnVmLCBybGVuKTsKLQotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygic24xMm0wcHpfaTJjX3JlYWQgMHgleCBmYWlsZWQhIiwgcmFkZHIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JKnJkYXRhID0gKHJsZW4gPT0gMiA/IGJ1ZlswXSA8PCA4IHwgYnVmWzFdIDogYnVmWzBdKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3Qgc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKHVuc2lnbmVkIHNob3J0IHdhZGRyLCB1aW50OF90IGJkYXRhKQotewotCWludDMyX3QgcmM7Ci0JdW5zaWduZWQgY2hhciBidWZbM107Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gKHdhZGRyICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlsxXSA9ICh3YWRkciAmIDB4MDBGRik7Ci0JYnVmWzJdID0gYmRhdGE7Ci0JdWRlbGF5KDkwKTsKLQlDREJHKCJpMmNfd3JpdGVfYiBhZGRyID0gJXgsIHZhbCA9ICV4XG4iLCB3YWRkciwgYmRhdGEpOwotCXJjID0gc24xMm0wcHpfaTJjX3R4ZGF0YShzbjEybTBwel9jbGllbnQtPmFkZHIsIGJ1ZiwgMyk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoImkyY193cml0ZV9iIGZhaWxlZCwgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXghIiwKLQkJCXdhZGRyLCBiZGF0YSk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MTZfdCBzbjEybTBwel9pMmNfd3JpdGVfYl9hZih1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQkJCQl1bnNpZ25lZCBzaG9ydCBiYWRkciwgdW5zaWduZWQgc2hvcnQgYmRhdGEpCi17Ci0JaW50MTZfdCByYzsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKLQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZbMF0gPSBiYWRkcjsKLQlidWZbMV0gPSBiZGF0YTsKLQlyYyA9IHNuMTJtMHB6X2kyY190eGRhdGEoc2FkZHIsIGJ1ZiwgMik7Ci0KLQlpZiAocmMgPCAwKQotCQlDREJHKCJpMmNfd3JpdGUgZmFpbGVkLCBzYWRkciA9IDB4JXggYWRkciA9IDB4JXgsIHZhbCA9MHgleCEiLAotCQkJc2FkZHIsIGJhZGRyLCBiZGF0YSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHNuMTJtMHB6X2kyY193cml0ZV9ieXRlX2JyaWRnZSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQkJCQl1bnNpZ25lZCBzaG9ydCB3YWRkciwgdWludDhfdCBiZGF0YSkKLXsKLQlpbnQzMl90IHJjOwotCXVuc2lnbmVkIGNoYXIgYnVmWzNdOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9ICh3YWRkciAmIDB4RkYwMCkgPj4gODsKLQlidWZbMV0gPSAod2FkZHIgJiAweDAwRkYpOwotCWJ1ZlsyXSA9IGJkYXRhOwotCi0JQ0RCRygiaTJjX3dyaXRlX2IgYWRkciA9ICV4LCB2YWwgPSAleCIsIHdhZGRyLCBiZGF0YSk7Ci0JcmMgPSBzbjEybTBwel9pMmNfdHhkYXRhKHNhZGRyLCBidWYsIDMpOwotCi0JaWYgKHJjIDwgMCkKLQkJQ0RCRygiaTJjX3dyaXRlX2IgZmFpbGVkLCBhZGRyID0gMHgleCwgdmFsID0gMHgleCEiLAotCQkJd2FkZHIsIGJkYXRhKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3Qgc24xMm0wcHpfc3RtaXBpZDAxX2NvbmZpZyh2b2lkKQotewotCWludDMyX3QgcmMgPSAwOwotCS8qIEluaXRpYXRlIEkyQyBmb3IgRDAxOiAqLwotCS8qIE1JUEkgQnJpZGdlIGNvbmZpZ3VyYXRpb24gKi8KLQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2J5dGVfYnJpZGdlKDB4Mjg+PjEsIDB4MDAwMiwgMHgxOSkgPCAwKQotCQlyZXR1cm4gcmM7IC8qIGVuYWJsZSBjbG9jayBsYW5lKi8KLQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2J5dGVfYnJpZGdlKDB4Mjg+PjEsIDB4MDAwMywgMHgwMCkgPCAwKQotCQlyZXR1cm4gcmM7Ci0JaWYgKHNuMTJtMHB6X2kyY193cml0ZV9ieXRlX2JyaWRnZSgweDI4Pj4xLCAweDAwMDQsIDB4M0UpIDwgMCkKLQkJcmV0dXJuIHJjOyAvKiBtaXBpIG1vZGUgY2xvY2sqLwotCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYnl0ZV9icmlkZ2UoMHgyOD4+MSwgMHgwMDA1LCAweDAxKSA8IDApCi0JCXJldHVybiByYzsgLyogZW5hYmxlIGRhdGEgbGluZSovCi0JaWYgKHNuMTJtMHB6X2kyY193cml0ZV9ieXRlX2JyaWRnZSgweDI4Pj4xLCAweDAwMDYsIDB4MEYpIDwgMCkKLQkJcmV0dXJuIHJjOyAvKiBtaXBpIG1vZGUgZGF0YSAweDAxKi8KLQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2J5dGVfYnJpZGdlKDB4Mjg+PjEsIDB4MDAwOSwgMHgwMCkgPCAwKQotCQlyZXR1cm4gcmM7IC8qIERhdGFfTGFuZTFfUmVnMSovCi0JaWYgKHNuMTJtMHB6X2kyY193cml0ZV9ieXRlX2JyaWRnZSgweDI4Pj4xLCAweDAwMEQsIDB4OTIpIDwgMCkKLQkJcmV0dXJuIHJjOyAvKiBDQ1BSeFJlZ2lzdGVycyovCi0JaWYgKHNuMTJtMHB6X2kyY193cml0ZV9ieXRlX2JyaWRnZSgweDI4Pj4xLCAweDAwMEUsIDB4MjgpIDwgMCkKLQkJcmV0dXJuIHJjOyAvKiAxMCBiaXRzIGZvciBwaXhlbCB3aWR0aCBpbnB1dCBmb3IgQ0NQIHJ4LiovCi0JaWYgKHNuMTJtMHB6X2kyY193cml0ZV9ieXRlX2JyaWRnZSgweDI4Pj4xLCAweDAwMTQsIDB4QzApIDwgMCkKLQkJcmV0dXJuIHJjOyAvKiBubyBieXBhc3MsIG5vIGRlY29tcCwgMUxhbmUgU3lzdGVtLENTSXN0cmVhbWluZyovCi0JaWYgKHNuMTJtMHB6X2kyY193cml0ZV9ieXRlX2JyaWRnZSgweDI4Pj4xLCAweDAwMTUsIDB4NDgpIDwgMCkKLQkJcmV0dXJuIHJjOyAvKiBNb2RlQ29udHJvbFJlZ2lzdGVycy0tIERvbid0IHJlc2V0IGVycm9yIGZsYWcqLwotCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYnl0ZV9icmlkZ2UoMHgyOD4+MSwgMHgwMDE3LCAweDJCKSA8IDApCi0JCXJldHVybiByYzsgLyogRGF0YV9JRF9ScmVnKi8KLQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2J5dGVfYnJpZGdlKDB4Mjg+PjEsIDB4MDAxOCwgMHgyQikgPCAwKQotCQlyZXR1cm4gcmM7IC8qIERhdGFfSURfUnJlZ19lbWIqLwotCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYnl0ZV9icmlkZ2UoMHgyOD4+MSwgMHgwMDE5LCAweDBDKSA8IDApCi0JCXJldHVybiByYzsKLQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2J5dGVfYnJpZGdlKDB4Mjg+PjEsIDB4MDAxRSwgMHgwQSkgPCAwKQotCQlyZXR1cm4gcmM7Ci0JaWYgKHNuMTJtMHB6X2kyY193cml0ZV9ieXRlX2JyaWRnZSgweDI4Pj4xLCAweDAwMUYsIDB4MEEpIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIHJjOwotfQotc3RhdGljIGludDMyX3Qgc24xMm0wcHpfc3RtaXBpZDAyX2NvbmZpZyh2b2lkKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JLyogTWFpbiBDYW1lcmEgQ2xvY2sgTGFuZSAxIChDTEhQMSwgQ0xLTjEpKi8KLQkvKiBFbmFibGUgQ2xvY2sgTGFuZSAxIChDTEhQMSwgQ0xLTjEpLCAweDE1IGZvciA0MDBNSHogKi8KLQlpZiAoZW5hYmxlX3NpbmdsZV9EMDJfbGFuZSkgewotCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2J5dGVfYnJpZGdlKDB4Mjg+PjEsIDB4MDAwMiwgMHgxOSkgPCAwKQotCQkJcmV0dXJuIHJjOwotCQkvKiBNYWluIENhbWVyYSBEYXRhIExhbmUgMS4xIChEQVRBMlAxLCBEQVRBMk4xKSAqLwotCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2J5dGVfYnJpZGdlKDB4Mjg+PjEsIDB4MDAwOSwgMHgwMCkgPCAwKQotCQkJcmV0dXJuIHJjOy8qIEVuYWJsZSBEYXRhIExhbmUgMS4yIChEQVRBMlAxLCBEQVRBMk4xKSAqLwotCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2J5dGVfYnJpZGdlKDB4Mjg+PjEsIDB4MDAwQSwgMHgwMCkgPCAwKQotCQkJcmV0dXJuIHJjOyAvKkNTSU1vZGUgb24gRGF0YSBMYW5lMS4yKERBVEEyUDEsREFUQTJOMSkqLwotCQkvKiBNb2RlIENvbnRyb2wgKi8KLQkJLyogRW5hYmxlIHNpbmdsZSBsYW5lIGZvciBxdHIgcHJldmlldyAqLwotCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2J5dGVfYnJpZGdlKDB4Mjg+PjEsIDB4MDAxNCwgMHhDMCkgPCAwKQotCQkJcmV0dXJuIHJjOyAvKnNldCAweEMwIC0gbGVmdCBqdXN0aWZpZWQgb24gdXBwZXIgYml0cykqLwotCQkvKiBiaXQgMSBzZXQgdG8gMCBpLmUuIDEgbGFuZSBzeXN0ZW0gZm9yIHF0ciBzaXplIHByZXZpZXcgKi8KLQl9IGVsc2UgewotCQlpZiAoc24xMm0wcHpfY3RybC0+cHJldl9yZXMgPT0gUVZHQV9TSVpFKSB7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2J5dGVfYnJpZGdlKDB4Mjg+PjEsCi0JCQkJMHgwMDAyLCAweDE5KSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQl9IGVsc2UgewotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9ieXRlX2JyaWRnZSgweDI4Pj4xLAotCQkJCTB4MDAwMiwgMHgyMSkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJfQotCQkvKiBNYWluIENhbWVyYSBEYXRhIExhbmUgMS4xIChEQVRBMlAxLCBEQVRBMk4xKSAqLwotCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2J5dGVfYnJpZGdlKDB4Mjg+PjEsIDB4MDAwOSwgMHgwMSkgPCAwKQotCQkJcmV0dXJuIHJjOyAvKiBFbmFibGUgRGF0YSBMYW5lIDEuMiAoREFUQTJQMSwgREFUQTJOMSkgKi8KLQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9ieXRlX2JyaWRnZSgweDI4Pj4xLCAweDAwMEEsIDB4MDEpIDwgMCkKLQkJCXJldHVybiByYzsgLyogQ1NJIE1vZGUgRGF0YSBMYW5lMS4yKERBVEEyUDEsIERBVEEyTjEpKi8KLQotCQkvKiBNb2RlIENvbnRyb2wgKi8KLQkJLyogRW5hYmxlIHR3byBsYW5lcyBmb3IgZnVsbCBzaXplIHByZXZpZXcvIHNuYXBzaG90ICovCi0JCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYnl0ZV9icmlkZ2UoMHgyOD4+MSwgMHgwMDE0LCAweEMyKSA8IDApCi0JCQlyZXR1cm4gcmM7IC8qIE5vIGRlY29tcHJlc3Npb24sIENTSSBkdWFsIGxhbmUgKi8KLQl9Ci0KLQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2J5dGVfYnJpZGdlKDB4Mjg+PjEsIDB4MDAwNCwgMHgxRSkgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQkvKiBNYWluIENhbWVyYSBEYXRhIExhbmUgMS4xIChEQVRBMVAxLCBEQVRBMU4xKSAqLwotCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYnl0ZV9icmlkZ2UoMHgyOD4+MSwgMHgwMDA1LCAweDAzKSA8IDApCi0JCXJldHVybiByYzsgLyogRW5hYmxlIERhdGEgTGFuZSAxLjEgKERBVEExUDEsIERBVEExTjEpICovCi0JaWYgKHNuMTJtMHB6X2kyY193cml0ZV9ieXRlX2JyaWRnZSgweDI4Pj4xLCAweDAwMDYsIDB4MGYpIDwgMCkKLQkJcmV0dXJuIHJjOyAvKiBDU0kgTW9kZSBvbiBEYXRhIExhbmUgMS4xIChEQVRBMVAxLCBEQVRBMU4xKSAqLwotCi0JLyogVHJpc3RhdGVkIE91dHB1dCwgY29udGludW91cyBjbG9jaywgKi8KLQkvKnBvbGFyaXR5IG9mIGNsb2NrIGlzIGludmVydGVkIGFuZCBzeW5jIHNpZ25hbHMgbm90IGludmVydGVkKi8KLQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2J5dGVfYnJpZGdlKDB4Mjg+PjEsIDB4MDAxNSwgMHgwOCkgPCAwKQotCQlyZXR1cm4gcmM7Ci0JaWYgKHNuMTJtMHB6X2kyY193cml0ZV9ieXRlX2JyaWRnZSgweDI4Pj4xLCAweDAwMzYsIDB4MjApIDwgMCkKLQkJcmV0dXJuIHJjOyAvKiBFbmFibGUgY29tcGVuc2F0aW9uIG1hY3JvLCBtYWluIGNhbWVyYSAqLwotCi0JLyogRGF0YSB0eXBlOiAweDJCIFJhdyAxMCAqLwotCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYnl0ZV9icmlkZ2UoMHgyOD4+MSwgMHgwMDE3LCAweDJCKSA8IDApCi0JCXJldHVybiByYzsKLQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2J5dGVfYnJpZGdlKDB4Mjg+PjEsIDB4MDAxOCwgMHgyQikgPCAwKQotCQlyZXR1cm4gcmM7IC8qIERhdGEgdHlwZSBvZiBlbWJlZGRlZCBkYXRhOiAweDJCIFJhdyAxMCAqLwotCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYnl0ZV9icmlkZ2UoMHgyOD4+MSwgMHgwMDE5LCAweDBDKSA8IDApCi0JCXJldHVybiByYzsgLyogRGF0YSB0eXBlIGFuZCBwaXhlbCB3aWR0aCBwcm9ncmFtbWVkIDB4MEMqLwotCi0JLyogRGVjb21wcmVzc2lvbiBNb2RlICovCi0KLQkvKiBQaXhlbCBXaWR0aCBhbmQgRGVjb21wcmVzc2lvbiBPTi9PRkYgKi8KLQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2J5dGVfYnJpZGdlKDB4Mjg+PjEsIDB4MDAxRSwgMHgwQSkgPCAwKQotCQlyZXR1cm4gcmM7IC8qIEltYWdlIGRhdGEgbm90IGNvbXByZXNzZWQ6IDB4MEEgZm9yIDEwIGJpdHMgKi8KLQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2J5dGVfYnJpZGdlKDB4Mjg+PjEsIDB4MDAxRiwgMHgwQSkgPCAwKQotCQlyZXR1cm4gcmM7IC8qIEVtYmVkZGVkIGRhdGEgbm90IGNvbXByZXNzZWQ6IDB4MEEgZm9yIDEwIGJpdHMgKi8KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQxNl90IHNuMTJtMHB6X2FmX2luaXQodm9pZCkKLXsKLQlpbnQxNl90IHJjOwotCS8qIEluaXRpYWxpemUgd2F2ZWZvcm0gKi8KLQlyYyA9IHNuMTJtMHB6X2kyY193cml0ZV9iX2FmKFNOMTJNMFBaX0FGX0kyQ19TTEFWRV9JRCA+PiAxLCAweDAxLCAweEE5KTsKLQotCXJjID0gc24xMm0wcHpfaTJjX3dyaXRlX2JfYWYoU04xMk0wUFpfQUZfSTJDX1NMQVZFX0lEID4+IDEsIDB4MDIsIDB4RDIpOwotCi0JcmMgPSBzbjEybTBwel9pMmNfd3JpdGVfYl9hZihTTjEyTTBQWl9BRl9JMkNfU0xBVkVfSUQgPj4gMSwgMHgwMywgMHgwQyk7Ci0KLQlyYyA9IHNuMTJtMHB6X2kyY193cml0ZV9iX2FmKFNOMTJNMFBaX0FGX0kyQ19TTEFWRV9JRCA+PiAxLCAweDA0LCAweDE0KTsKLQotCXJjID0gc24xMm0wcHpfaTJjX3dyaXRlX2JfYWYoU04xMk0wUFpfQUZfSTJDX1NMQVZFX0lEID4+IDEsIDB4MDUsIDB4QjYpOwotCi0JcmMgPSBzbjEybTBwel9pMmNfd3JpdGVfYl9hZihTTjEyTTBQWl9BRl9JMkNfU0xBVkVfSUQgPj4gMSwgMHgwNiwgMHg0Rik7Ci0KLQlyYyA9IHNuMTJtMHB6X2kyY193cml0ZV9iX2FmKFNOMTJNMFBaX0FGX0kyQ19TTEFWRV9JRCA+PiAxLCAweDA3LCAweDAwKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3Qgc24xMm0wcHpfbW92ZV9mb2N1cyhpbnQgZGlyZWN0aW9uLAotCWludDMyX3QgbnVtX3N0ZXBzKQotewotCWludDhfdCBzdGVwX2RpcmVjdGlvbiwgZGVzdF9zdGVwX3Bvc2l0aW9uLCBiaXRfbWFzazsKLQlpbnQzMl90IHJjID0gMDsKLQl1aW50MTZfdCBzbjEybTBwel9sX3JlZ2lvbl9jb2RlX3Blcl9zdGVwID0gMzsKLQotCWlmIChudW1fc3RlcHMgPT0gMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGRpcmVjdGlvbiA9PSBNT1ZFX05FQVIpIHsKLQkJc3RlcF9kaXJlY3Rpb24gPSAxOwotCQliaXRfbWFzayA9IDB4ODA7Ci0JfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gTU9WRV9GQVIpIHsKLQkJc3RlcF9kaXJlY3Rpb24gPSAtMTsKLQkJYml0X21hc2sgPSAweDAwOwotCX0gZWxzZSB7Ci0JCUNEQkcoInNuMTJtMHB6X21vdmVfZm9jdXM6IElsbGVnYWwgZm9jdXMgZGlyZWN0aW9uIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRlc3Rfc3RlcF9wb3NpdGlvbiA9IHNuMTJtMHB6X2N0cmwtPmN1cnJfc3RlcF9wb3MgKwotCQkoc3RlcF9kaXJlY3Rpb24gKiBudW1fc3RlcHMpOwotCi0JaWYgKGRlc3Rfc3RlcF9wb3NpdGlvbiA8IDApCi0JCWRlc3Rfc3RlcF9wb3NpdGlvbiA9IDA7Ci0JZWxzZSBpZiAoZGVzdF9zdGVwX3Bvc2l0aW9uID4gU04xMk0wUFpfVE9UQUxfU1RFUFNfTkVBUl9UT19GQVIpCi0JCWRlc3Rfc3RlcF9wb3NpdGlvbiA9IFNOMTJNMFBaX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSOwotCi0JcmMgPSBzbjEybTBwel9pMmNfd3JpdGVfYl9hZihTTjEyTTBQWl9BRl9JMkNfU0xBVkVfSUQgPj4gMSwgMHgwMCwKLQkJKChudW1fc3RlcHMgKiBzbjEybTBwel9sX3JlZ2lvbl9jb2RlX3Blcl9zdGVwKSB8IGJpdF9tYXNrKSk7Ci0KLQlzbjEybTBwel9jdHJsLT5jdXJyX3N0ZXBfcG9zID0gZGVzdF9zdGVwX3Bvc2l0aW9uOwotCi0JcmV0dXJuIHJjOwotfQotc3RhdGljIGludDMyX3Qgc24xMm0wcHpfc2V0X2RlZmF1bHRfZm9jdXModWludDhfdCBhZl9zdGVwKQotewotCWludDMyX3QgcmM7Ci0KLQkvKiBJbml0aWFsaXplIHRvIGluZmluaXR5ICovCi0KLQlyYyA9IHNuMTJtMHB6X2kyY193cml0ZV9iX2FmKFNOMTJNMFBaX0FGX0kyQ19TTEFWRV9JRCA+PiAxLCAweDAwLCAweDdGKTsKLQotCXJjID0gc24xMm0wcHpfaTJjX3dyaXRlX2JfYWYoU04xMk0wUFpfQUZfSTJDX1NMQVZFX0lEID4+IDEsIDB4MDAsIDB4N0YpOwotCi0Jc24xMm0wcHpfY3RybC0+Y3Vycl9zdGVwX3BvcyA9IDA7Ci0KLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgdm9pZCBzbjEybTBwel9nZXRfcGljdF9mcHModWludDE2X3QgZnBzLCB1aW50MTZfdCAqcGZwcykKLXsKLQkvKiBpbnB1dCBmcHMgaXMgcHJldmlldyBmcHMgaW4gUTggZm9ybWF0ICovCi0JdWludDE2X3QgcHJldmlld19mcmFtZV9sZW5ndGhfbGluZXMsIHNuYXBzaG90X2ZyYW1lX2xlbmd0aF9saW5lczsKLQl1aW50MTZfdCBwcmV2aWV3X2xpbmVfbGVuZ3RoX3Bjaywgc25hcHNob3RfbGluZV9sZW5ndGhfcGNrOwotCXVpbnQzMl90IGRpdmlkZXIsIHBjbGtfbXVsdCwgZDEsIGQyOwotCi0JLyogVG90YWwgZnJhbWVfbGVuZ3RoX2xpbmVzIGFuZCBsaW5lX2xlbmd0aF9wY2sgZm9yIHByZXZpZXcgKi8KLQlDREJHKCJzbjEybTBwel9nZXRfcGljdF9mcHMgcHJldl9yZXMgJWQiLCBzbjEybTBwel9jdHJsLT5wcmV2X3Jlcyk7Ci0JaWYgKHNuMTJtMHB6X2N0cmwtPnByZXZfcmVzID09IFFWR0FfU0laRSkgewotCQlwcmV2aWV3X2ZyYW1lX2xlbmd0aF9saW5lcyA9IFNOMTJNMFBaX1FWR0FfU0laRV9IRUlHSFQgKwotCQkJU04xMk0wUFpfVkVSX1FWR0FfQkxLX0xJTkVTOwotCQlwcmV2aWV3X2xpbmVfbGVuZ3RoX3BjayA9IFNOMTJNMFBaX1FWR0FfU0laRV9XSURUSCArCi0JCQlTTjEyTTBQWl9IUlpfUVZHQV9CTEtfUElYRUxTOwotCX0gZWxzZSB7Ci0JCXByZXZpZXdfZnJhbWVfbGVuZ3RoX2xpbmVzID0gU04xMk0wUFpfUVRSX1NJWkVfSEVJR0hUICsKLQkJCVNOMTJNMFBaX1ZFUl9RVFJfQkxLX0xJTkVTOwotCQlwcmV2aWV3X2xpbmVfbGVuZ3RoX3BjayA9IFNOMTJNMFBaX1FUUl9TSVpFX1dJRFRIICsKLQkJCVNOMTJNMFBaX0hSWl9RVFJfQkxLX1BJWEVMUzsKLQl9Ci0JLyogVG90YWwgZnJhbWVfbGVuZ3RoX2xpbmVzIGFuZCBsaW5lX2xlbmd0aF9wY2sgZm9yIHNuYXBzaG90ICovCi0Jc25hcHNob3RfZnJhbWVfbGVuZ3RoX2xpbmVzID0gU04xMk0wUFpfRlVMTF9TSVpFX0hFSUdIVAotCQkJCSsgU04xMk0wUFpfSFJaX0ZVTExfQkxLX1BJWEVMUzsKLQlzbmFwc2hvdF9saW5lX2xlbmd0aF9wY2sgPSBTTjEyTTBQWl9GVUxMX1NJWkVfV0lEVEgKLQkJCQkrIFNOMTJNMFBaX0hSWl9GVUxMX0JMS19QSVhFTFM7Ci0JZDEgPSBwcmV2aWV3X2ZyYW1lX2xlbmd0aF9saW5lcyAqCi0JCQkJMHgwMDAwMDQwMCAvIHNuYXBzaG90X2ZyYW1lX2xlbmd0aF9saW5lczsKLQlkMiA9IHByZXZpZXdfbGluZV9sZW5ndGhfcGNrICoKLQkJCQkweDAwMDAwNDAwL3NuYXBzaG90X2xpbmVfbGVuZ3RoX3BjazsKLQlkaXZpZGVyID0gZDEgKiBkMiAvIDB4NDAwOwotCXBjbGtfbXVsdCA9Ci0JCSh1aW50MzJfdCkKLQkJKHNuMTJtMHB6X3JlZ3MucmVnX3BhdFtSRVNfQ0FQVFVSRV0ucGxsX211bHRpcGxpZXJfbHNiICoKLQkJMHg0MDApIC8gKHVpbnQzMl90KQotCQlzbjEybTBwel9yZWdzLnJlZ19wYXRbUkVTX1BSRVZJRVddLnBsbF9tdWx0aXBsaWVyX2xzYjsKLQkqcGZwcyA9ICh1aW50MTZfdCkgKCgoZnBzICogZGl2aWRlcikgLyAweDQwMCAqIHBjbGtfbXVsdCkgLyAweDQwMCk7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBzbjEybTBwel9nZXRfcHJldl9saW5lc19wZih2b2lkKQotewotCWlmIChzbjEybTBwel9jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkKLQkJcmV0dXJuIFNOMTJNMFBaX1FUUl9TSVpFX0hFSUdIVCArCi0JCQlTTjEyTTBQWl9WRVJfUVRSX0JMS19MSU5FUzsKLQllbHNlIGlmIChzbjEybTBwel9jdHJsLT5wcmV2X3JlcyA9PSBRVkdBX1NJWkUpCi0JCXJldHVybiBTTjEyTTBQWl9RVkdBX1NJWkVfSEVJR0hUICsKLQkJCVNOMTJNMFBaX1ZFUl9RVkdBX0JMS19MSU5FUzsKLQotCWVsc2UKLQkJcmV0dXJuIFNOMTJNMFBaX0ZVTExfU0laRV9IRUlHSFQgKwotCQkJU04xMk0wUFpfVkVSX0ZVTExfQkxLX0xJTkVTOwotfQotCi1zdGF0aWMgdWludDE2X3Qgc24xMm0wcHpfZ2V0X3ByZXZfcGl4ZWxzX3BsKHZvaWQpCi17Ci0JaWYgKHNuMTJtMHB6X2N0cmwtPnByZXZfcmVzID09IFFUUl9TSVpFKQotCQlyZXR1cm4gU04xMk0wUFpfUVRSX1NJWkVfV0lEVEggKwotCQkJU04xMk0wUFpfSFJaX1FUUl9CTEtfUElYRUxTOwotCWVsc2UKLQkJcmV0dXJuIFNOMTJNMFBaX0ZVTExfU0laRV9XSURUSCArCi0JCQlTTjEyTTBQWl9IUlpfRlVMTF9CTEtfUElYRUxTOwotfQotCi1zdGF0aWMgdWludDE2X3Qgc24xMm0wcHpfZ2V0X3BpY3RfbGluZXNfcGYodm9pZCkKLXsKLQlpZiAoc24xMm0wcHpfY3RybC0+cGljdF9yZXMgPT0gUVRSX1NJWkUpCi0JCXJldHVybiBTTjEyTTBQWl9RVFJfU0laRV9IRUlHSFQgKwotCQkJU04xMk0wUFpfVkVSX1FUUl9CTEtfTElORVM7Ci0JZWxzZQotCQlyZXR1cm4gU04xMk0wUFpfRlVMTF9TSVpFX0hFSUdIVCArCi0JCQlTTjEyTTBQWl9WRVJfRlVMTF9CTEtfTElORVM7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBzbjEybTBwel9nZXRfcGljdF9waXhlbHNfcGwodm9pZCkKLXsKLQlpZiAoc24xMm0wcHpfY3RybC0+cGljdF9yZXMgPT0gUVRSX1NJWkUpCi0JCXJldHVybiBTTjEyTTBQWl9RVFJfU0laRV9XSURUSCArCi0JCQlTTjEyTTBQWl9IUlpfUVRSX0JMS19QSVhFTFM7Ci0JZWxzZQotCQlyZXR1cm4gU04xMk0wUFpfRlVMTF9TSVpFX1dJRFRIICsKLQkJCVNOMTJNMFBaX0hSWl9GVUxMX0JMS19QSVhFTFM7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBzbjEybTBwel9nZXRfcGljdF9tYXhfZXhwX2xjKHZvaWQpCi17Ci0JaWYgKHNuMTJtMHB6X2N0cmwtPnBpY3RfcmVzID09IFFUUl9TSVpFKQotCQlyZXR1cm4gKFNOMTJNMFBaX1FUUl9TSVpFX0hFSUdIVCArCi0JCQlTTjEyTTBQWl9WRVJfUVRSX0JMS19MSU5FUykgKiAyNDsKLQllbHNlCi0JCXJldHVybiAoU04xMk0wUFpfRlVMTF9TSVpFX0hFSUdIVCArCi0JCQlTTjEyTTBQWl9WRVJfRlVMTF9CTEtfTElORVMpICogMjQ7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHNuMTJtMHB6X3NldF9mcHMoc3RydWN0IGZwc19jZmcJKmZwcykKLXsKLQl1aW50MTZfdCB0b3RhbF9saW5lc19wZXJfZnJhbWU7Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQl0b3RhbF9saW5lc19wZXJfZnJhbWUgPSAodWludDE2X3QpKChTTjEyTTBQWl9RVFJfU0laRV9IRUlHSFQgKwotCQkJCVNOMTJNMFBaX1ZFUl9RVFJfQkxLX0xJTkVTKSAqCi0JCQkJc24xMm0wcHpfY3RybC0+ZnBzX2RpdmlkZXIgLyAweDQwMCk7Ci0KLQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19GUkFNRV9MRU5HVEhfTElORVNfTVNCLAotCQkJCSgodG90YWxfbGluZXNfcGVyX2ZyYW1lICYgMHhGRjAwKSA+PiA4KSkgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19GUkFNRV9MRU5HVEhfTElORVNfTFNCLAotCQkJCSh0b3RhbF9saW5lc19wZXJfZnJhbWUgJiAweDAwRkYpKSA8IDApCi0JCXJldHVybiByYzsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3Qgc24xMm0wcHpfd3JpdGVfZXhwX2dhaW4odWludDE2X3QgZ2FpbiwgdWludDMyX3QgbGluZSkKLXsKLQlzdGF0aWMgdWludDE2X3QgbWF4X2xlZ2FsX2dhaW4gPSAweDAwRTA7Ci0JdWludDhfdCBnYWluX21zYiwgZ2Fpbl9sc2I7Ci0JdWludDhfdCBpbnRnX3RpbWVfbXNiLCBpbnRnX3RpbWVfbHNiOwotCXVpbnQ4X3QgbGluZV9sZW5ndGhfcGNrX21zYiwgbGluZV9sZW5ndGhfcGNrX2xzYjsKLQl1aW50MTZfdCBsaW5lX2xlbmd0aF9wY2ssIGZyYW1lX2xlbmd0aF9saW5lcywgdGVtcF9saW5lczsKLQl1aW50MzJfdCBsaW5lX2xlbmd0aF9yYXRpbyA9IDEgKiBRODsKLQlpbnQzMl90IHJjID0gMDsKLQlDREJHKCJzbjEybTBwel93cml0ZV9leHBfZ2FpbiA6IGdhaW4gPSAlZCBsaW5lID0gJWQiLCBnYWluLCBsaW5lKTsKLQotCWlmIChzbjEybTBwel9jdHJsLT5zZW5zb3Jtb2RlICE9IFNFTlNPUl9TTkFQU0hPVF9NT0RFKSB7Ci0JCWlmIChzbjEybTBwel9jdHJsLT5wcmV2X3JlcyA9PSBRVkdBX1NJWkUpIHsKLQkJCWZyYW1lX2xlbmd0aF9saW5lcyA9IFNOMTJNMFBaX1FWR0FfU0laRV9IRUlHSFQgKwotCQkJCQkJU04xMk0wUFpfVkVSX1FWR0FfQkxLX0xJTkVTOwotCQkJbGluZV9sZW5ndGhfcGNrID0gU04xMk0wUFpfUVZHQV9TSVpFX1dJRFRIICsKLQkJCQkJCVNOMTJNMFBaX0hSWl9RVkdBX0JMS19QSVhFTFM7Ci0JCQlpZiAobGluZSA+IChmcmFtZV9sZW5ndGhfbGluZXMgLQotCQkJCQlJVTA2MEZfU04xMk0wUFpfT0ZGU0VUKSkKLQkJCQlsaW5lID0gZnJhbWVfbGVuZ3RoX2xpbmVzIC0KLQkJCQkJCUlVMDYwRl9TTjEyTTBQWl9PRkZTRVQ7Ci0JCQlzbjEybTBwel9jdHJsLT5mcHMgPSAodWludDE2X3QpICgxMjAgKiBROCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc24xMm0wcHpfY3RybC0+Y3Vycl9yZXMgID09IFFUUl9TSVpFKSB7Ci0JCQkJZnJhbWVfbGVuZ3RoX2xpbmVzID0gU04xMk0wUFpfUVRSX1NJWkVfSEVJR0hUICsKLQkJCQkJCVNOMTJNMFBaX1ZFUl9RVFJfQkxLX0xJTkVTOwotCQkJCWxpbmVfbGVuZ3RoX3BjayA9IFNOMTJNMFBaX1FUUl9TSVpFX1dJRFRIICsKLQkJCQkJCVNOMTJNMFBaX0hSWl9RVFJfQkxLX1BJWEVMUzsKLQkJCX0gZWxzZSB7Ci0JCQkJZnJhbWVfbGVuZ3RoX2xpbmVzID0gU04xMk0wUFpfSEVJR0hUICsKLQkJCQkJCVNOMTJNMFBaX1ZFUl9GVUxMX0JMS19MSU5FUzsKLQkJCQlsaW5lX2xlbmd0aF9wY2sgPSBTTjEyTTBQWl9XSURUSCArCi0JCQkJCQlTTjEyTTBQWl9IUlpfRlVMTF9CTEtfUElYRUxTOwotCQkJfQotCQkJaWYgKGxpbmUgPiAoZnJhbWVfbGVuZ3RoX2xpbmVzIC0KLQkJCQkJCUlVMDYwRl9TTjEyTTBQWl9PRkZTRVQpKQotCQkJCXNuMTJtMHB6X2N0cmwtPmZwcyA9ICh1aW50MTZfdCkgKDMwICogUTggKgotCQkJKGZyYW1lX2xlbmd0aF9saW5lcyAtIElVMDYwRl9TTjEyTTBQWl9PRkZTRVQpIC8gbGluZSk7Ci0JCQllbHNlCi0JCQkJc24xMm0wcHpfY3RybC0+ZnBzID0gKHVpbnQxNl90KSAoMzAgKiBROCk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoc24xMm0wcHpfY3RybC0+Y3Vycl9yZXMgID09IFFUUl9TSVpFKSB7Ci0JCQlmcmFtZV9sZW5ndGhfbGluZXMgPSBTTjEyTTBQWl9RVFJfU0laRV9IRUlHSFQgKwotCQkJCQkJU04xMk0wUFpfVkVSX1FUUl9CTEtfTElORVM7Ci0JCQlsaW5lX2xlbmd0aF9wY2sgPSBTTjEyTTBQWl9RVFJfU0laRV9XSURUSCArCi0JCQkJCQlTTjEyTTBQWl9IUlpfUVRSX0JMS19QSVhFTFM7Ci0JCX0gZWxzZSB7Ci0JCQlmcmFtZV9sZW5ndGhfbGluZXMgPSBTTjEyTTBQWl9IRUlHSFQgKwotCQkJCQkJU04xMk0wUFpfVkVSX0ZVTExfQkxLX0xJTkVTOwotCQkJbGluZV9sZW5ndGhfcGNrID0gU04xMk0wUFpfV0lEVEggKwotCQkJCQkJU04xMk0wUFpfSFJaX0ZVTExfQkxLX1BJWEVMUzsKLQkJfQotCX0KLQlpZiAoZ2FpbiA+IG1heF9sZWdhbF9nYWluKQotCQkvKiByYW5nZTogMCB0byAyMjQgKi8KLQkJZ2FpbiA9IG1heF9sZWdhbF9nYWluOwotCXRlbXBfbGluZXMgPSBsaW5lOwotCS8qIGNhbGN1bGF0ZSBsaW5lX2xlbmd0aF9yYXRpbyAqLwotCWlmIChsaW5lID4gKGZyYW1lX2xlbmd0aF9saW5lcyAtIElVMDYwRl9TTjEyTTBQWl9PRkZTRVQpKSB7Ci0JCWxpbmVfbGVuZ3RoX3JhdGlvID0gKGxpbmUgKiBROCkgLyAoZnJhbWVfbGVuZ3RoX2xpbmVzIC0KLQkJCQkJSVUwNjBGX1NOMTJNMFBaX09GRlNFVCk7Ci0JCXRlbXBfbGluZXMgPSBmcmFtZV9sZW5ndGhfbGluZXMgLSBJVTA2MEZfU04xMk0wUFpfT0ZGU0VUOwotCQlpZiAobGluZV9sZW5ndGhfcmF0aW8gPT0gMCkKLQkJCWxpbmVfbGVuZ3RoX3JhdGlvID0gMSAqIFE4OwotCX0gZWxzZQotCQlsaW5lX2xlbmd0aF9yYXRpbyA9IDEgKiBRODsKLQotCWxpbmUgPSAodWludDMyX3QpIChsaW5lICogc24xMm0wcHpfY3RybC0+ZnBzX2RpdmlkZXIvMHg0MDApOwotCi0JLyogdXBkYXRlIGdhaW4gcmVnaXN0ZXJzICovCi0JZ2Fpbl9tc2IgPSAodWludDhfdCkgKChnYWluICYgMHhGRjAwKSA+PiA4KTsKLQlnYWluX2xzYiA9ICh1aW50OF90KSAoZ2FpbiAmIDB4MDBGRik7Ci0KLQkvKiBsaW5lYXIgQUZSIGhvcml6b250YWwgc3RyZXRjaCAqLwotCWxpbmVfbGVuZ3RoX3BjayA9ICh1aW50MTZfdCkgKGxpbmVfbGVuZ3RoX3BjayAqIGxpbmVfbGVuZ3RoX3JhdGlvIC8gUTgpOwotCWxpbmVfbGVuZ3RoX3Bja19tc2IgPSAodWludDhfdCkgKChsaW5lX2xlbmd0aF9wY2sgJiAweEZGMDApID4+IDgpOwotCWxpbmVfbGVuZ3RoX3Bja19sc2IgPSAodWludDhfdCkgKGxpbmVfbGVuZ3RoX3BjayAmIDB4MDBGRik7Ci0KLQkvKiB1cGRhdGUgbGluZSBjb3VudCByZWdpc3RlcnMgKi8KLQlpbnRnX3RpbWVfbXNiID0gKHVpbnQ4X3QpICgodGVtcF9saW5lcyAmIDB4RkYwMCkgPj4gOCk7Ci0JaW50Z190aW1lX2xzYiA9ICh1aW50OF90KSAodGVtcF9saW5lcyAmIDB4MDBGRik7Ci0KLQotCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQlHUk9VUEVEX1BBUkFNRVRFUl9IT0xEKSA8IDApCi0JCXJldHVybiByYzsKLQotCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0FOQUxPR1VFX0dBSU5fQ09ERV9HTE9CQUxfTVNCLAotCQkJZ2Fpbl9tc2IpIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfQU5BTE9HVUVfR0FJTl9DT0RFX0dMT0JBTF9MU0IsCi0JCQlnYWluX2xzYikgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19MSU5FX0xFTkdUSF9QQ0tfTVNCLAotCQkJbGluZV9sZW5ndGhfcGNrX21zYikgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19MSU5FX0xFTkdUSF9QQ0tfTFNCLAotCQkJbGluZV9sZW5ndGhfcGNrX2xzYikgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9NU0IsCi0JCQlpbnRnX3RpbWVfbXNiKSA8IDApCi0JCXJldHVybiByYzsKLQotCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0xTQiwKLQkJCWludGdfdGltZV9sc2IpIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCUdST1VQRURfUEFSQU1FVEVSX0hPTERfT0ZGKSA8IDApCi0JCXJldHVybiByYzsKLQotCXJldHVybiByYzsKLX0KLQotCi1zdGF0aWMgaW50MzJfdCBzbjEybTBwel9zZXRfcGljdF9leHBfZ2Fpbih1aW50MTZfdCBnYWluLCB1aW50MzJfdCBsaW5lKQotewotCWludDMyX3QgcmM7Ci0JcmMgPSBzbjEybTBwel93cml0ZV9leHBfZ2FpbihnYWluLCBsaW5lKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHNuMTJtMHB6X3Rlc3QoZW51bSBzbjEybTBwel90ZXN0X21vZGVfdCBtbykKLXsKLQl1aW50OF90IHRlc3RfZGF0YV92YWxfbXNiID0gMHgwNzsKLQl1aW50OF90IHRlc3RfZGF0YV92YWxfbHNiID0gMHhGRjsKLQlpbnQzMl90IHJjID0gMDsKLQlpZiAobW8gPT0gVEVTVF9PRkYpCi0JCXJldHVybiByYzsKLQllbHNlIHsKLQkJLyogUkVHXzB4MzBEOFs0XSBpcyBURVNCWVBFTjogMDogTm9ybWFsIE9wZXJhdGlvbiwKLQkJIDE6IEJ5cGFzcyBTaWduYWwgUHJvY2Vzc2luZy4gUkVHXzB4MzBEOFs1XSBpcyBFQkRNQVNLOgotCQkgMDogT3V0cHV0IEVtYmVkZGVkIGRhdGEsIDE6IE5vIG91dHB1dCBlbWJlZGRlZCBkYXRhICovCi0KLQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMEQ4LCAweDEwKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfVEVTVF9QQVRURVJOX01PREUsCi0JCQkodWludDhfdCkgbW8pIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQkvKiBTb2xpZCBDb2xvciBUZXN0IFBhdHRlcm4gKi8KLQotCQlpZiAobW8gPT0gVEVTVF8xKSB7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19URVNUX0RBVEFfUkVEX01TQiwKLQkJCQl0ZXN0X2RhdGFfdmFsX21zYikgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX1RFU1RfREFUQV9SRURfTFNCLAotCQkJCXRlc3RfZGF0YV92YWxfbHNiKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcigKLQkJCQkJCVJFR19URVNUX0RBVEFfR1JFRU5SX01TQiwKLQkJCQkJCXRlc3RfZGF0YV92YWxfbXNiKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcigKLQkJCQkJCVJFR19URVNUX0RBVEFfR1JFRU5SX0xTQiwKLQkJCQkJCXRlc3RfZGF0YV92YWxfbHNiKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfVEVTVF9EQVRBX0JMVUVfTVNCLAotCQkJCXRlc3RfZGF0YV92YWxfbXNiKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfVEVTVF9EQVRBX0JMVUVfTFNCLAotCQkJCXRlc3RfZGF0YV92YWxfbHNiKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcigKLQkJCQkJCVJFR19URVNUX0RBVEFfR1JFRU5CX01TQiwKLQkJCQkJCXRlc3RfZGF0YV92YWxfbXNiKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcigKLQkJCQkJCVJFR19URVNUX0RBVEFfR1JFRU5CX0xTQiwKLQkJCQkJCXRlc3RfZGF0YV92YWxfbHNiKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQl9Ci0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHNuMTJtMHB6X3Jlc2V0KHZvaWQpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JLyogcmVnaXN0ZXIgMHgwMDAyIGlzIFBvcnQgMiwgQ0FNX1hDTFJPICovCi0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHNuMTJtMHB6X2N0cmwtPgotCQlzZW5zb3JkYXRhLT5zZW5zb3JfcmVzZXQsCi0JCTApOwotCW1zbGVlcCg1MCk7Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHNuMTJtMHB6X2N0cmwtPgotCQlzZW5zb3JkYXRhLT5zZW5zb3JfcmVzZXQsCi0JCTEpOwotCW1zbGVlcCgxMyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCBzbjEybTBwel9zZW5zb3Jfc2V0dGluZyhpbnQgdXBkYXRlX3R5cGUsIGludCBydCkKLXsKLQl1aW50MTZfdCB0b3RhbF9saW5lc19wZXJfZnJhbWU7Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlzd2l0Y2ggKHVwZGF0ZV90eXBlKSB7Ci0JY2FzZSBVUERBVEVfUEVSSU9ESUM6Ci0JCS8qIFB1dCBTZW5zb3IgaW50byBzb2Z3YXJlIHN0YW5kYnkgbW9kZQkqLwotCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19NT0RFX1NFTEVDVCwKLQkJCQlNT0RFX1NFTEVDVF9TVEFOREJZX01PREUpIDwgIDApCi0JCQlyZXR1cm4gcmM7Ci0JCW1zbGVlcCg1KTsKLQkJLyogSGFyZHdhcmUgcmVzZXQgRDAyLCBsYW5lIGNvbmZpZyBiZXR3ZWVuIGZ1bGwgc2l6ZS9xdHIgc2l6ZSovCi0JCXJjID0gc24xMm0wcHpfcmVzZXQoKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlpZiAoc24xMm0wcHpfc3RtaXBpZDAyX2NvbmZpZygpIDwgMCkKLQkJCXJldHVybiByYzsKLQljYXNlIFJFR19JTklUOgotCQlpZiAocnQgPT0gUkVTX1BSRVZJRVcgfHwgcnQgPT0gUkVTX0NBUFRVUkUKLQkJCQl8fCBydCA9PSBSRVNfVklERU9fMTIwRlBTKSB7Ci0JCQkvKiByZXNldCBmcHNfZGl2aWRlciAqLwotCQkJc24xMm0wcHpfY3RybC0+ZnBzX2RpdmlkZXIgPSAxICogMHg0MDA7Ci0KLQkJCS8qIFBMTCBzZXR0aW5ncyAqLwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfUExMX01VTFRJUExJRVIsCi0JCQlzbjEybTBwel9yZWdzLnJlZ19wYXRbcnRdLnBsbF9tdWx0aXBsaWVyX2xzYikgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzAyQiwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDJCKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQkvKiBNSVBJIEVuYWJsZSBTZXR0aW5ncyAqLwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMEU1LAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMwRTUpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzMwMCwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMzAwKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQkvKiBHbG9iYWwgU2V0dGluZyAqLwotCQkJaWYgKAotCQkJCXNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcigKLQkJCQlSRUdfSU1BR0VfT1JJRU5UQVRJT04sCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0uaW1hZ2Vfb3JpZW50KSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKAotCQkJCXNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcigKLQkJCQlSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfTVNCLAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdFtydF0uY29hcnNlX2ludGVnX3RpbWVfbXNiKQotCQkJCTwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoCi0JCQkJc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKAotCQkJCVJFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9MU0IsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0W3J0XS5jb2Fyc2VfaW50ZWdfdGltZV9sc2IpCi0JCQkJIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMwMEEsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAwQSkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzAxNCwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDE0KSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMDE1LAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMwMTUpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMwMTcsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAxNykgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzAxQywKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDFDKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMDMxLAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMwMzEpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMwNDAsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzA0MCkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzA0MSwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDQxKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMDUxLAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMwNTEpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMwNTMsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzA1MykgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzA1NSwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDU1KSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMDU3LAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMwNTcpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMwNjAsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzA2MCkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzA2NSwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDY1KSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMEFBLAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMwQUEpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMwQUIsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzBBQikgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzBCMCwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMEIwKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMEIyLAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMwQjIpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzBEMywKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMEQzKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMEQ4LAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMwRDgpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzEwNiwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMTA2KSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMTA4LAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMxMDgpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMxMEEsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzEwQSkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzEwQywKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMTBDKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMTBFLAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMxMEUpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMxMjYsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzEyNikgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzEyRSwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMTJFKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMTNDLAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMxM0MpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMxM0UsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzEzRSkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzE0MCwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMTQwKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMTQyLAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMxNDIpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMxNDQsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzE0NCkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzE0OCwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMTQ4KSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMTRBLAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMxNEEpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMxNjYsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzE2NikgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzE2OCwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMTY4KSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMTZGLAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMxNkYpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMxNzEsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzE3MSkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzE3MywKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMTczKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMTc1LAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMxNzUpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMxNzcsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzE3NykgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzE3OSwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMTc5KSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMTdCLAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMxN0IpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMxN0QsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzE3RCkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzE3RiwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMTdGKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMTgxLAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMxODEpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMxODQsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzE4NCkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzE4NSwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMTg1KSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMTg3LAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMxODcpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzFBNCwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMUE0KSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMUE2LAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMxQTYpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMxQUMsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzFBQykgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzFBRSwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMUFFKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMUI0LAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMxQjQpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMxQjYsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzFCNikgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMjU0LAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMyNTQpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMyNTYsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzI1NikgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzI1OCwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMjU4KSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMjVBLAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMyNUEpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMyNjAsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzI2MCkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzI2MiwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMjYyKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0KLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzMwNCwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMzA0KSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMzA1LAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMzMDUpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMzMDYsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzMwNikgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzMwNywKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMzA3KSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMzA4LAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMzMDgpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMzMDksCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzMwOSkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzMwQSwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMzBBKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMzBCLAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMzMEIpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMzMEMsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzMwQykgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzMwRCwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMzBEKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQkvKiBNb2RlIHNldHRpbmcgKi8KLQkJCS8qIFVwZGF0ZSByZWdpc3RlcnMgd2l0aCBjb3JyZWN0Ci0JCQkJIGZyYW1lX2xlbmd0aF9saW5lIHZhbHVlIGZvciBBRlIgKi8KLQkJCXRvdGFsX2xpbmVzX3Blcl9mcmFtZSA9ICh1aW50MTZfdCkoCi0JCQkoc24xMm0wcHpfcmVncy5yZWdfcGF0W3J0XS5mcmFtZV9sZW5ndGhfbGluZXNfbXNiIDw8IDgpCi0JCQkmIDB4RkYwMCkgKwotCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0W3J0XS5mcmFtZV9sZW5ndGhfbGluZXNfbHNiOwotCQkJdG90YWxfbGluZXNfcGVyX2ZyYW1lID0gdG90YWxfbGluZXNfcGVyX2ZyYW1lICoKLQkJCQkJc24xMm0wcHpfY3RybC0+ZnBzX2RpdmlkZXIgLyAweDQwMDsKLQotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcigKLQkJCQkJUkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19NU0IsCi0JCQkJCSh0b3RhbF9saW5lc19wZXJfZnJhbWUgJiAweEZGMDApID4+IDgpCi0JCQkJCTwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKAotCQkJCQlSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0xTQiwKLQkJCQkJKHRvdGFsX2xpbmVzX3Blcl9mcmFtZSAmIDB4MDBGRikpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0xJTkVfTEVOR1RIX1BDS19NU0IsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0W3J0XS5saW5lX2xlbmd0aF9wY2tfbXNiKSA8Ci0JCQkJMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19MSU5FX0xFTkdUSF9QQ0tfTFNCLAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdFtydF0ubGluZV9sZW5ndGhfcGNrX2xzYikgPAotCQkJCTApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfWF9PVVRQVVRfU0laRV9NU0IsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0W3J0XS54X291dHB1dF9zaXplX21zYikgPAotCQkJCTApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfWF9PVVRQVVRfU0laRV9MU0IsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0W3J0XS54X291dHB1dF9zaXplX2xzYikgPAotCQkJCTApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfWV9PVVRQVVRfU0laRV9NU0IsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0W3J0XS55X291dHB1dF9zaXplX21zYikgPAotCQkJCTApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfWV9PVVRQVVRfU0laRV9MU0IsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0W3J0XS55X291dHB1dF9zaXplX2xzYikgPAotCQkJCTApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfWF9FVkVOX0lOQ19MU0IsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0W3J0XS54X2V2ZW5faW5jX2xzYikgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX1hfT0REX0lOQ19MU0IsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0W3J0XS54X29kZF9pbmNfbHNiKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfWV9FVkVOX0lOQ19MU0IsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0W3J0XS55X2V2ZW5faW5jX2xzYikgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX1lfT0REX0lOQ19MU0IsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0W3J0XS55X29kZF9pbmNfbHNiKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgzMDE2LAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAxNikgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MzBFOCwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwRTgpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDMzMDEsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMzAxKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDAzNDQsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzQ0KSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgwMzQ1LAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM0NSkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MDM0NiwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNDYpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDAzNDcsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzQ3KSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgwMzQ4LAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM0OCkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MDM0OSwKLQkJCQlzbjEybTBwel9yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNDkpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDAzNEEsCi0JCQkJc24xMm0wcHpfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzRBKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgwMzRCLAotCQkJCXNuMTJtMHB6X3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM0QikgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJaWYgKChydCA9PSBSRVNfQ0FQVFVSRSkgJiYgZnVsbHNpemVfY3JvcHBlZF9hdF84bXApIHsKLQkJCQkvKiB4IGFkZHJlc3MgZW5kICovCi0JCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcigweDAzNDgsCi0JCQkJCQkJCTB4MEMpIDwgMCkKLQkJCQkJcmV0dXJuIHJjOwotCQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwMzQ5LAotCQkJCQkJCQkweDBDRikgPCAwKQotCQkJCQlyZXR1cm4gcmM7Ci0JCQkJLyogeSBhZGRyZXNzIGVuZCAqLwotCQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoMHgwMzRBLAotCQkJCQkJCQkweDA5KSA8IDApCi0JCQkJCXJldHVybiByYzsKLQkJCQlpZiAoc24xMm0wcHpfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MDM0QiwKLQkJCQkJCQkJMHg5RikgPCAwKQotCQkJCQlyZXR1cm4gcmM7Ci0JCQl9Ci0KLQkJCWlmIChtaXBpX2NvbmZpZyA9PSBJVTA2MEZfU04xMk0wUFpfU1RNSVBJRDAxKSB7Ci0JCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcigKLQkJCQkJCVJFR19QTExfTVVMVElQTElFUiwgMHg0MykgPCAwKQotCQkJCQlyZXR1cm4gcmM7Ci0JCQkJaWYgKHJ0ID09IFJFU19DQVBUVVJFKSB7Ci0JCQkJCWlmIChzbjEybTBwel9pMmNfd3JpdGVfYl9zZW5zb3IoCi0JCQkJCQlSRUdfMHgzMzAxLCAweDAxKSA8IDApCi0JCQkJCQlyZXR1cm4gcmM7Ci0JCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcigKLQkJCQkJCVJFR18weDMwMTcsIDB4RTApIDwgMCkKLQkJCQkJcmV0dXJuIHJjOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHNuMTJtMHB6X2kyY193cml0ZV9iX3NlbnNvcihSRUdfTU9ERV9TRUxFQ1QsCi0JCQkJCQlNT0RFX1NFTEVDVF9TVFJFQU0pIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCW1zbGVlcChJVTA2MEZfU04xMk0wUFpfREVMQVlfTVNFQ1MpOwotCi0JCQlpZiAoc24xMm0wcHpfdGVzdChzbjEybTBwel9jdHJsLT5zZXRfdGVzdCkgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJaWYgKG1pcGlfY29uZmlnID09IElVMDYwRl9TTjEyTTBQWl9TVE1JUElEMDIpCi0JCQkJQ0RCRygiJXMsJWQiLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIHJjOwotCQl9Ci19Ci0KLQotc3RhdGljIGludDMyX3Qgc24xMm0wcHpfdmlkZW9fY29uZmlnKGludCBtb2RlKQotewotCi0JaW50MzJfdCByYyA9IDA7Ci0JaW50IHJ0OwotCi0KLQlpZiAobW9kZSA9PSBTRU5TT1JfSEZSXzEyMEZQU19NT0RFKQotCQlzbjEybTBwel9jdHJsLT5wcmV2X3JlcyA9IFFWR0FfU0laRTsKLQotCS8qIGNoYW5nZSBzZW5zb3IgcmVzb2x1dGlvbiBpZiBuZWVkZWQgKi8KLQlpZiAoc24xMm0wcHpfY3RybC0+Y3Vycl9yZXMgIT0gc24xMm0wcHpfY3RybC0+cHJldl9yZXMpIHsKLQkJaWYgKHNuMTJtMHB6X2N0cmwtPnByZXZfcmVzID09IFFUUl9TSVpFKSB7Ci0JCQlydCA9IFJFU19QUkVWSUVXOwotCQkJSVUwNjBGX1NOMTJNMFBaX0RFTEFZX01TRUNTID0gMzU7IC8qbWVhc3VyZWQgb24gc2NvcGUqLwotCQkJZW5hYmxlX3NpbmdsZV9EMDJfbGFuZSA9IDE7Ci0JCX0gZWxzZSBpZiAoc24xMm0wcHpfY3RybC0+cHJldl9yZXMgPT0gUVZHQV9TSVpFKSB7Ci0JCQlydCA9IFJFU19WSURFT18xMjBGUFM7Ci0JCQlJVTA2MEZfU04xMk0wUFpfREVMQVlfTVNFQ1MgPSAzNTsgLyptZWFzdXJlZCBvbiBzY29wZSovCi0JCQllbmFibGVfc2luZ2xlX0QwMl9sYW5lID0gMDsKLQkJfSBlbHNlIHsKLQkJCXJ0ID0gUkVTX0NBUFRVUkU7Ci0JCQllbmFibGVfc2luZ2xlX0QwMl9sYW5lID0gMDsKLQkJfQotCi0JCWlmIChzbjEybTBwel9zZW5zb3Jfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsIHJ0KSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0Jc24xMm0wcHpfY3RybC0+Y3Vycl9yZXMgPSBzbjEybTBwel9jdHJsLT5wcmV2X3JlczsKLQlzbjEybTBwel9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQotCXJldHVybiByYzsKLX0KLXN0YXRpYyBpbnQzMl90IHNuMTJtMHB6X3NuYXBzaG90X2NvbmZpZyhpbnQgbW9kZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlpbnQgcnQ7Ci0JLyogY2hhbmdlIHNlbnNvciByZXNvbHV0aW9uIGlmIG5lZWRlZCAqLwotCWlmIChzbjEybTBwel9jdHJsLT5jdXJyX3JlcyAhPSBzbjEybTBwel9jdHJsLT5waWN0X3JlcykgewotCQlpZiAoc24xMm0wcHpfY3RybC0+cGljdF9yZXMgPT0gUVRSX1NJWkUpIHsKLQkJCXJ0ID0gUkVTX1BSRVZJRVc7Ci0JCQllbmFibGVfc2luZ2xlX0QwMl9sYW5lID0gMTsKLQkJfSBlbHNlIHsKLQkJCXJ0ID0gUkVTX0NBUFRVUkU7Ci0JCQlJVTA2MEZfU04xMk0wUFpfREVMQVlfTVNFQ1MgPSAxMDA7LyptZWFzdXJlZCBvbiBzY29wZSovCi0JCQllbmFibGVfc2luZ2xlX0QwMl9sYW5lID0gMDsKLQkJfQotCi0JCWlmIChzbjEybTBwel9zZW5zb3Jfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsIHJ0KSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0Jc24xMm0wcHpfY3RybC0+Y3Vycl9yZXMgPSBzbjEybTBwel9jdHJsLT5waWN0X3JlczsKLQlzbjEybTBwel9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHNuMTJtMHB6X3Jhd19zbmFwc2hvdF9jb25maWcoaW50IG1vZGUpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JaW50IHJ0OwotCS8qIGNoYW5nZSBzZW5zb3IgcmVzb2x1dGlvbiBpZiBuZWVkZWQgKi8KLQlpZiAoc24xMm0wcHpfY3RybC0+Y3Vycl9yZXMgIT0gc24xMm0wcHpfY3RybC0+cGljdF9yZXMpIHsKLQkJaWYgKHNuMTJtMHB6X2N0cmwtPnBpY3RfcmVzID09IFFUUl9TSVpFKSB7Ci0JCQlydCA9IFJFU19QUkVWSUVXOwotCQkJZW5hYmxlX3NpbmdsZV9EMDJfbGFuZSA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlydCA9IFJFU19DQVBUVVJFOwotCQkJSVUwNjBGX1NOMTJNMFBaX0RFTEFZX01TRUNTID0gMTAwOy8qbWVhc3VyZWQgb24gc2NvcGUqLwotCQkJZW5hYmxlX3NpbmdsZV9EMDJfbGFuZSA9IDA7Ci0JCX0KLQkJaWYgKHNuMTJtMHB6X3NlbnNvcl9zZXR0aW5nKFVQREFURV9QRVJJT0RJQywgcnQpIDwgMCkKLQkJCXJldHVybiByYzsKLQkJfQotCXNuMTJtMHB6X2N0cmwtPmN1cnJfcmVzID0gc24xMm0wcHpfY3RybC0+cGljdF9yZXM7Ci0Jc24xMm0wcHpfY3RybC0+c2Vuc29ybW9kZSA9IG1vZGU7Ci0JcmV0dXJuIHJjOwotfQotc3RhdGljIGludDMyX3Qgc24xMm0wcHpfc2V0X3NlbnNvcl9tb2RlKGludCAgbW9kZSwKLQlpbnQgIHJlcykKLXsKLQlpbnQzMl90IHJjOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBTRU5TT1JfUFJFVklFV19NT0RFOgotCWNhc2UgU0VOU09SX0hGUl8xMjBGUFNfTU9ERToKLQkJcmMgPSBzbjEybTBwel92aWRlb19jb25maWcobW9kZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTRU5TT1JfU05BUFNIT1RfTU9ERToKLQkJcmMgPSBzbjEybTBwel9zbmFwc2hvdF9jb25maWcobW9kZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTRU5TT1JfUkFXX1NOQVBTSE9UX01PREU6Ci0JCXJjID0gc24xMm0wcHpfcmF3X3NuYXBzaG90X2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHNuMTJtMHB6X3Bvd2VyX2Rvd24odm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IHNuMTJtMHB6X3Byb2JlX2luaXRfZG9uZShjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQotCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCWdwaW9fZnJlZShkYXRhLT5zZW5zb3JfcmVzZXQpOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT52Y21fcHdkLCAwKTsKLQlncGlvX2ZyZWUoZGF0YS0+dmNtX3B3ZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc24xMm0wcHpfcHJvYmVfaW5pdF9zZW5zb3IoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JaW50MzJfdCByYzsKLQl1bnNpZ25lZCBzaG9ydCBjaGlwaWRsLCBjaGlwaWRoOwotCUNEQkcoIlJlcXVlc3RpbmcgZ3BpbyIpOwotCXJjID0gZ3Bpb19yZXF1ZXN0KGRhdGEtPnNlbnNvcl9yZXNldCwgInNuMTJtMHB6Iik7Ci0JQ0RCRygiIHNuMTJtMHB6X3Byb2JlX2luaXRfc2Vuc29yIik7Ci0JaWYgKCFyYykgewotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+c2Vuc29yX3Jlc2V0LCAwKTsKLQkJbXNsZWVwKDIwKTsKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnNlbnNvcl9yZXNldCwgMSk7Ci0JCW1zbGVlcCgxMyk7Ci0JfSBlbHNlIHsKLQkJZ290byBpbml0X3Byb2JlX2RvbmU7Ci0JfQotCUNEQkcoIlJlcXVlc3Rpb24gZ3BpbyIpOwotCXJjID0gZ3Bpb19yZXF1ZXN0KGRhdGEtPnZjbV9wd2QsICJzbjEybTBweiIpOwotCUNEQkcoIiBzbjEybTBwel9wcm9iZV9pbml0X3NlbnNvciIpOwotCi0JaWYgKCFyYykgewotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+dmNtX3B3ZCwgMCk7Ci0JCW1zbGVlcCgyMCk7Ci0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT52Y21fcHdkLCAxKTsKLQkJbXNsZWVwKDEzKTsKLQl9IGVsc2UgewotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+c2Vuc29yX3Jlc2V0LCAwKTsKLQkJZ3Bpb19mcmVlKGRhdGEtPnNlbnNvcl9yZXNldCk7Ci0JCWdvdG8gaW5pdF9wcm9iZV9kb25lOwotCX0KLQotCW1zbGVlcCgyMCk7Ci0KLQkvKiAzLiBSZWFkIHNlbnNvciBNb2RlbCBJRDogKi8KLQlyYyA9IHNuMTJtMHB6X2kyY19yZWFkKDB4MDAwMCwgJmNoaXBpZGgsIDEpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiIHNuMTJtMHB6X3Byb2JlX2luaXRfc2Vuc29yMyIpOwotCQlnb3RvIGluaXRfcHJvYmVfZmFpbDsKLQl9Ci0JcmMgPSBzbjEybTBwel9pMmNfcmVhZCgweDAwMDEsICZjaGlwaWRsLCAxKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIiBzbjEybTBwel9wcm9iZV9pbml0X3NlbnNvcjQiKTsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCi0JLyogNC4gQ29tcGFyZSBzZW5zb3IgSUQgdG8gU04xMk0wUFogSUQ6ICovCi0JaWYgKGNoaXBpZGggIT0gMHgwMCB8fCBjaGlwaWRsICE9IDB4NjApIHsKLQkJcmMgPSAtRU5PREVWOwotCQlDREJHKCJzbjEybTBwel9wcm9iZV9pbml0X3NlbnNvciBmYWlsIGNoaXAgaWQgZG9lc25vdCBtYXRjaCIpOwotCQlnb3RvIGluaXRfcHJvYmVfZmFpbDsKLQl9Ci0KLQltc2xlZXAoU04xMk0wUFpfUkVTRVRfREVMQVlfTVNFQ1MpOwotCi0JZ290byBpbml0X3Byb2JlX2RvbmU7Ci0KLWluaXRfcHJvYmVfZmFpbDoKLQlDREJHKCIgc24xMm0wcHpfcHJvYmVfaW5pdF9zZW5zb3IgZmFpbHMiKTsKLQlzbjEybTBwel9wcm9iZV9pbml0X2RvbmUoZGF0YSk7Ci0KLWluaXRfcHJvYmVfZG9uZToKLQlDREJHKCIgc24xMm0wcHpfcHJvYmVfaW5pdF9zZW5zb3IgZmluaXNoZXMiKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBzbjEybTBwel9zZW5zb3Jfb3Blbl9pbml0KGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCWludDMyX3QgcmMgPSAwOwotCUNEQkcoIkNhbGxpbmcgc24xMm0wcHpfc2Vuc29yX29wZW5faW5pdCIpOwotCi0Jc24xMm0wcHpfY3RybCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbjEybTBwel9jdHJsX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNuMTJtMHB6X2N0cmwpIHsKLQkJQ0RCRygic24xMm0wcHpfaW5pdCBmYWlsZWQhIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBpbml0X2RvbmU7Ci0JfQotCi0Jc24xMm0wcHpfY3RybC0+ZnBzX2RpdmlkZXIgICAgICA9IDEgKiAweDAwMDAwNDAwOwotCXNuMTJtMHB6X2N0cmwtPnBpY3RfZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQlzbjEybTBwel9jdHJsLT5zZXRfdGVzdCA9IFRFU1RfT0ZGOwotCXNuMTJtMHB6X2N0cmwtPnByZXZfcmVzID0gUVRSX1NJWkU7Ci0Jc24xMm0wcHpfY3RybC0+cGljdF9yZXMgPSBGVUxMX1NJWkU7Ci0Jc24xMm0wcHpfY3RybC0+Y3Vycl9yZXMgPSBJTlZBTElEX1NJWkU7Ci0JaWYgKGRhdGEpCi0JCXNuMTJtMHB6X2N0cmwtPnNlbnNvcmRhdGEgPSBkYXRhOwotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JLyogZW5hYmxlIG1jbGsgZmlyc3QgKi8KLQltc21fY2FtaW9fY2xrX3JhdGVfc2V0KFNOMTJNMFBaX0RFRkFVTFRfQ0xPQ0tfUkFURSk7Ci0JbXNsZWVwKDIwKTsKLQltc21fY2FtaW9fY2FtaWZfcGFkX3JlZ19yZXNldCgpOwotCW1zbGVlcCgyMCk7Ci0JQ0RCRygiQ2FsbGluZyBzbjEybTBwel9zZW5zb3Jfb3Blbl9pbml0Iik7Ci0JcmMgPSBzbjEybTBwel9wcm9iZV9pbml0X3NlbnNvcihkYXRhKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gaW5pdF9mYWlsOwotCS8qIHNlbmQgcmVzZXQgc2lnbmFsICovCi0JaWYgKG1pcGlfY29uZmlnID09IElVMDYwRl9TTjEyTTBQWl9TVE1JUElEMDEpIHsKLQkJaWYgKHNuMTJtMHB6X3N0bWlwaWQwMV9jb25maWcoKSA8IDApIHsKLQkJCUNEQkcoIkNhbGxpbmcgc24xMm0wcHpfc2Vuc29yX29wZW5faW5pdCBmYWlsIik7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoc24xMm0wcHpfY3RybC0+cHJldl9yZXMgID09IFFUUl9TSVpFKQotCQkJZW5hYmxlX3NpbmdsZV9EMDJfbGFuZSA9IDE7Ci0JCWVsc2UgLyogRlVMTF9TSVpFICovCi0JCQllbmFibGVfc2luZ2xlX0QwMl9sYW5lID0gMDsKLQotCQlpZiAoc24xMm0wcHpfc3RtaXBpZDAyX2NvbmZpZygpIDwgMCkgewotCQkJQ0RCRygiQ2FsbGluZyBzbjEybTBwel9zZW5zb3Jfb3Blbl9pbml0IGZhaWwiKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCi0JaWYgKHNuMTJtMHB6X2N0cmwtPnByZXZfcmVzID09IFFUUl9TSVpFKSB7Ci0JCWlmIChzbjEybTBwel9zZW5zb3Jfc2V0dGluZyhSRUdfSU5JVCwgUkVTX1BSRVZJRVcpIDwgMCkKLQkJCXJldHVybiByYzsKLQl9IGVsc2UgaWYgKHNuMTJtMHB6X2N0cmwtPnByZXZfcmVzID09IFFWR0FfU0laRSkgewotCQlpZiAoc24xMm0wcHpfc2Vuc29yX3NldHRpbmcoUkVHX0lOSVQsIFJFU19WSURFT18xMjBGUFMpIDwgMCkKLQkJCXJldHVybiByYzsKLQl9IGVsc2UgewotCQlpZiAoc24xMm0wcHpfc2Vuc29yX3NldHRpbmcoUkVHX0lOSVQsIFJFU19DQVBUVVJFKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKHNuMTJtMHB6X2FmX2luaXQoKSA8IDApCi0JCXJldHVybiByYzsKLQlzbjEybTBwel9jdHJsLT5mcHMgPSAzMCpRODsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGluaXRfZmFpbDsKLQllbHNlCi0JCWdvdG8gaW5pdF9kb25lOwotaW5pdF9mYWlsOgotCUNEQkcoIiBpbml0X2ZhaWwiKTsKLQlzbjEybTBwel9wcm9iZV9pbml0X2RvbmUoZGF0YSk7Ci0Ja2ZyZWUoc24xMm0wcHpfY3RybCk7Ci1pbml0X2RvbmU6Ci0JQ0RCRygiaW5pdF9kb25lIik7Ci0JcmV0dXJuIHJjOwotfQotc3RhdGljIGludCBfX2RldmluaXQgc24xMm0wcHpfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQkvKiBJbml0aWFsaXplIHRoZSBNU01fQ0FNSTJDIENoaXAgKi8KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzbjEybTBwel93YWl0X3F1ZXVlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHNuMTJtMHB6X2kyY19pZFtdID0gewotCXsgInNuMTJtMHB6IiwgMH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzbjEybTBwel9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJjID0gMDsKLQlDREJHKCJzbjEybTBwel9wcm9iZSBjYWxsZWQhIik7Ci0KLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgewotCQlDREJHKCJpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eSBmYWlsZWQiKTsKLQkJZ290byBwcm9iZV9mYWlsdXJlOwotCX0KLQotCXNuMTJtMHB6X3NlbnNvcncgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc24xMm0wcHpfd29ya190KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzbjEybTBwel9zZW5zb3J3KSB7Ci0JCUNEQkcoImt6YWxsb2MgZmFpbGVkIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBwcm9iZV9mYWlsdXJlOwotCX0KLQotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHNuMTJtMHB6X3NlbnNvcncpOwotCXNuMTJtMHB6X2luaXRfY2xpZW50KGNsaWVudCk7Ci0Jc24xMm0wcHpfY2xpZW50ID0gY2xpZW50OwotCi0JbXNsZWVwKDUwKTsKLQotCUNEQkcoInNuMTJtMHB6X3Byb2JlIHN1Y2Nlc3NlZCEgcmMgPSAlZCIsIHJjKTsKLQlyZXR1cm4gMDsKLQotcHJvYmVfZmFpbHVyZToKLQlDREJHKCJzbjEybTBwel9wcm9iZSBmYWlsZWQhIHJjID0gJWQiLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fZXhpdCBzbjEybTBwel9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3Qgc24xMm0wcHpfd29ya190X3QgKnNlbnNvcncgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlmcmVlX2lycShjbGllbnQtPmlycSwgc2Vuc29ydyk7Ci0Jc24xMm0wcHpfY2xpZW50ID0gTlVMTDsKLQlrZnJlZShzZW5zb3J3KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHNuMTJtMHB6X2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gc24xMm0wcHpfaTJjX2lkLAotCS5wcm9iZQk9IHNuMTJtMHB6X2kyY19wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3Aoc24xMm0wcHpfaTJjX3JlbW92ZSksCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAic24xMm0wcHoiLAotCX0sCi19OwotCi1pbnQgc24xMm0wcHpfc2Vuc29yX2NvbmZpZyh2b2lkIF9fdXNlciAqYXJncCkKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhIGNkYXRhOwotCWludDMyX3QgcmMgPSAwOwotCWlmIChjb3B5X2Zyb21fdXNlcigmY2RhdGEsCi0JCQkJKHZvaWQgKilhcmdwLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JbXV0ZXhfbG9jaygmc24xMm0wcHpfbXV0KTsKLQotCUNEQkcoInNuMTJtMHB6X3NlbnNvcl9jb25maWc6IGNmZ3R5cGUgPSAlZCIsCi0JCWNkYXRhLmNmZ3R5cGUpOwotCXN3aXRjaCAoY2RhdGEuY2ZndHlwZSkgewotCWNhc2UgQ0ZHX0dFVF9QSUNUX0ZQUzoKLQkJc24xMm0wcHpfZ2V0X3BpY3RfZnBzKGNkYXRhLmNmZy5nZnBzLnByZXZmcHMsCi0JCQkJCSYoY2RhdGEuY2ZnLmdmcHMucGljdGZwcykpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJJmNkYXRhLAotCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19HRVRfUFJFVl9MX1BGOgotCQljZGF0YS5jZmcucHJldmxfcGYgPQotCQkJc24xMm0wcHpfZ2V0X3ByZXZfbGluZXNfcGYoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCSZjZGF0YSwKLQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfR0VUX1BSRVZfUF9QTDoKLQkJY2RhdGEuY2ZnLnByZXZwX3BsID0KLQkJCXNuMTJtMHB6X2dldF9wcmV2X3BpeGVsc19wbCgpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJJmNkYXRhLAotCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19HRVRfUElDVF9MX1BGOgotCQljZGF0YS5jZmcucGljdGxfcGYgPQotCQkJc24xMm0wcHpfZ2V0X3BpY3RfbGluZXNfcGYoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCSZjZGF0YSwKLQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfR0VUX1BJQ1RfUF9QTDoKLQkJY2RhdGEuY2ZnLnBpY3RwX3BsID0KLQkJCXNuMTJtMHB6X2dldF9waWN0X3BpeGVsc19wbCgpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJJmNkYXRhLAotCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19HRVRfUElDVF9NQVhfRVhQX0xDOgotCQljZGF0YS5jZmcucGljdF9tYXhfZXhwX2xjID0KLQkJCXNuMTJtMHB6X2dldF9waWN0X21heF9leHBfbGMoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCSZjZGF0YSwKLQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfU0VUX0ZQUzoKLQljYXNlIENGR19TRVRfUElDVF9GUFM6Ci0JCXJjID0gc24xMm0wcHpfc2V0X2ZwcygmKGNkYXRhLmNmZy5mcHMpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfRVhQX0dBSU46Ci0JCXJjID0KLQkJCXNuMTJtMHB6X3dyaXRlX2V4cF9nYWluKAotCQkJCWNkYXRhLmNmZy5leHBfZ2Fpbi5nYWluLAotCQkJCWNkYXRhLmNmZy5leHBfZ2Fpbi5saW5lKTsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX1BJQ1RfRVhQX0dBSU46Ci0JCXJjID0KLQkJCXNuMTJtMHB6X3NldF9waWN0X2V4cF9nYWluKAotCQkJCWNkYXRhLmNmZy5leHBfZ2Fpbi5nYWluLAotCQkJCWNkYXRhLmNmZy5leHBfZ2Fpbi5saW5lKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfTU9ERToKLQkJcmMgPSBzbjEybTBwel9zZXRfc2Vuc29yX21vZGUoY2RhdGEubW9kZSwKLQkJCQkJY2RhdGEucnMpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1BXUl9ET1dOOgotCQlyYyA9IHNuMTJtMHB6X3Bvd2VyX2Rvd24oKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19NT1ZFX0ZPQ1VTOgotCQlyYyA9IHNuMTJtMHB6X21vdmVfZm9jdXMoY2RhdGEuY2ZnLmZvY3VzLmRpciwKLQkJCQkJY2RhdGEuY2ZnLmZvY3VzLnN0ZXBzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfREVGQVVMVF9GT0NVUzoKLQkJcmMgPSBzbjEybTBwel9zZXRfZGVmYXVsdF9mb2N1cyhjZGF0YS5jZmcuZm9jdXMuc3RlcHMpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1NFVF9FRkZFQ1Q6Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBDRkdfU0VUX0xFTlNfU0hBRElORzoKLQkJcmMgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCX0KLQotCW11dGV4X3VubG9jaygmc24xMm0wcHpfbXV0KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzbjEybTBwel9zZW5zb3JfcmVsZWFzZSh2b2lkKQotewotCWludCByYyA9IC1FQkFERjsKLQotCW11dGV4X2xvY2soJnNuMTJtMHB6X211dCk7Ci0KLQlzbjEybTBwel9wb3dlcl9kb3duKCk7Ci0KLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoc24xMm0wcHpfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3Jlc2V0LAotCQkwKTsKLQlncGlvX2ZyZWUoc24xMm0wcHpfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3Jlc2V0KTsKLQotCWdwaW9fZGlyZWN0aW9uX291dHB1dChzbjEybTBwel9jdHJsLT5zZW5zb3JkYXRhLT52Y21fcHdkLAotCQkwKTsKLQlncGlvX2ZyZWUoc24xMm0wcHpfY3RybC0+c2Vuc29yZGF0YS0+dmNtX3B3ZCk7Ci0KLQlrZnJlZShzbjEybTBwel9jdHJsKTsKLQlzbjEybTBwel9jdHJsID0gTlVMTDsKLQotCUNEQkcoInNuMTJtMHB6X3JlbGVhc2UgY29tcGxldGVkIik7Ci0KLQotCW11dGV4X3VubG9jaygmc24xMm0wcHpfbXV0KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzbjEybTBwel9zZW5zb3JfcHJvYmUoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmluZm8sCi0JCXN0cnVjdCBtc21fc2Vuc29yX2N0cmwgKnMpCi17Ci0JaW50IHJjOwotCi0JcmMgPSBpMmNfYWRkX2RyaXZlcigmc24xMm0wcHpfaTJjX2RyaXZlcik7Ci0JaWYgKHJjIDwgMCB8fCBzbjEybTBwel9jbGllbnQgPT0gTlVMTCkgewotCQlyYyA9IC1FTk9UU1VQUDsKLQkJZ290byBwcm9iZV9mYWlsOwotCX0KLQotCW1zbV9jYW1pb19jbGtfcmF0ZV9zZXQoU04xMk0wUFpfREVGQVVMVF9DTE9DS19SQVRFKTsKLQltc2xlZXAoMjApOwotCi0JcmMgPSBzbjEybTBwel9wcm9iZV9pbml0X3NlbnNvcihpbmZvKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIHByb2JlX2ZhaWw7Ci0KLQlzLT5zX2luaXQgPSBzbjEybTBwel9zZW5zb3Jfb3Blbl9pbml0OwotCXMtPnNfcmVsZWFzZSA9IHNuMTJtMHB6X3NlbnNvcl9yZWxlYXNlOwotCXMtPnNfY29uZmlnICA9IHNuMTJtMHB6X3NlbnNvcl9jb25maWc7Ci0Jcy0+c19tb3VudF9hbmdsZSAgPSAwOwotCXNuMTJtMHB6X3Byb2JlX2luaXRfZG9uZShpbmZvKTsKLQotCXJldHVybiByYzsKLQotcHJvYmVfZmFpbDoKLQlDREJHKCJTRU5TT1IgUFJPQkUgRkFJTFMhIik7Ci0JaTJjX2RlbF9kcml2ZXIoJnNuMTJtMHB6X2kyY19kcml2ZXIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX3NuMTJtMHB6X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIG1zbV9jYW1lcmFfZHJ2X3N0YXJ0KHBkZXYsIHNuMTJtMHB6X3NlbnNvcl9wcm9iZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9jYW1lcmFfZHJpdmVyID0gewotCS5wcm9iZSA9IF9fc24xMm0wcHpfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtX2NhbWVyYV9zbjEybTBweiIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzbjEybTBwel9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX2NhbWVyYV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChzbjEybTBwel9pbml0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJTb255IDEyTSBNUCBCYXllciBzZW5zb3IgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc24xMm0wcHouaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zbjEybTBwei5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2QzMzQ2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zbjEybTBwei5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLQotLyogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2lmbmRlZiBTTjEyTTBQWl9ICi0jZGVmaW5lIFNOMTJNMFBaX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci1leHRlcm4gc3RydWN0IHNuMTJtMHB6X3JlZyBzbjEybTBwel9yZWdzOyAvKiBmcm9tIG10OXQwMTNfcmVnLmMgKi8KLXN0cnVjdCByZWdfc3RydWN0ewotCXVpbnQ4X3QgcGxsX211bHRpcGxpZXJfbHNiOyAgICAgICAgICAgIC8qIDB4MDMwNyovCi0JdWludDhfdCBjb2Fyc2VfaW50ZWdfdGltZV9tc2I7ICAgLyogMHgwMjAyKi8KLQl1aW50OF90IGNvYXJzZV9pbnRlZ190aW1lX2xzYjsgICAvKiAweDAyMDMqLwotCXVpbnQ4X3QgZnJhbWVfbGVuZ3RoX2xpbmVzX21zYjsgICAgICAgIC8qIDB4MDM0MCovCi0JdWludDhfdCBmcmFtZV9sZW5ndGhfbGluZXNfbHNiOyAgICAgICAgLyogMHgwMzQxKi8KLQl1aW50OF90IGxpbmVfbGVuZ3RoX3Bja19tc2I7ICAgICAgICAgICAvKiAweDAzNDIqLwotCXVpbnQ4X3QgbGluZV9sZW5ndGhfcGNrX2xzYjsgICAgICAgICAgIC8qIDB4MDM0MyovCi0JdWludDhfdCB4X291dHB1dF9zaXplX21zYjsgICAgICAgICAgICAgLyogMHgwMzRDKi8KLQl1aW50OF90IHhfb3V0cHV0X3NpemVfbHNiOyAgICAgICAgICAgICAvKiAweDAzNEQqLwotCXVpbnQ4X3QgeV9vdXRwdXRfc2l6ZV9tc2I7ICAgICAgICAgICAgIC8qIDB4MDM0RSovCi0JdWludDhfdCB5X291dHB1dF9zaXplX2xzYjsgICAgICAgICAgICAgLyogMHgwMzRGKi8KLQl1aW50OF90IHhfZXZlbl9pbmNfbHNiOyAgICAgICAgICAgICAgICAvKiAweDAzODEqLwotCXVpbnQ4X3QgeF9vZGRfaW5jX2xzYjsgICAgICAgICAgICAgICAgIC8qIDB4MDM4MyovCi0JdWludDhfdCB5X2V2ZW5faW5jX2xzYjsgICAgICAgICAgICAgICAgLyogMHgwMzg1Ki8KLQl1aW50OF90IHlfb2RkX2luY19sc2I7ICAgICAgICAgICAgICAgICAvKiAweDAzODcqLwotCXVpbnQ4X3QgcmVnXzB4MzAxNjsgICAgICAgICAgICAgICAgICAgIC8qIDB4MzAxNiBWTU9ERUFERCovCi0JdWludDhfdCByZWdfMHgzMEU4OyAgICAgICAgICAgICAgICAgICAgLyogMHgzMEU4IEhBRERBVkUqLwotCXVpbnQ4X3QgcmVnXzB4MzMwMTsgICAgICAgICAgICAgICAgICAgIC8qIDB4MzMwMSBSR0xBTkVTRUwqLwotCS8qYWRkZWQgZm9yIDEyMGZwcyBzdXBwb3J0ICovCi0JdWludDhfdCByZWdfMHgwMzQ0OwotCXVpbnQ4X3QgcmVnXzB4MDM0NTsKLQl1aW50OF90IHJlZ18weDAzNDY7Ci0JdWludDhfdCByZWdfMHgwMzQ3OwotCXVpbnQ4X3QgcmVnXzB4MDM0ODsKLQl1aW50OF90IHJlZ18weDAzNDk7Ci0JdWludDhfdCByZWdfMHgwMzRBOwotCXVpbnQ4X3QgcmVnXzB4MDM0QjsKLX07Ci1zdHJ1Y3QgcmVnX3N0cnVjdF9pbml0ewotCXVpbnQ4X3QgcmVnXzB4MzAyQjsvKiAweDMwMkIqLwotCi0JdWludDhfdCByZWdfMHgzMEU1Oy8qIDB4MzBFNSovCi0JdWludDhfdCByZWdfMHgzMzAwOyAgIC8qIDB4MzMwMCovCi0KLQl1aW50OF90IGltYWdlX29yaWVudDsgICAvKiAweDAxMDEqLwotCi0JdWludDhfdCByZWdfMHgzMDBBOyAgIC8qIDB4MzAwQSovCi0JdWludDhfdCByZWdfMHgzMDE0OyAgIC8qIDB4MzAxNCovCi0JdWludDhfdCByZWdfMHgzMDE1OyAgIC8qIDB4MzAxNSovCi0JdWludDhfdCByZWdfMHgzMDE3OyAgIC8qIDB4MzAxNyovCi0JdWludDhfdCByZWdfMHgzMDFDOyAgIC8qIDB4MzAxQyovCi0JdWludDhfdCByZWdfMHgzMDMxOyAgIC8qIDB4MzAzMSovCi0JdWludDhfdCByZWdfMHgzMDQwOyAgIC8qIDB4MzA0MCovCi0JdWludDhfdCByZWdfMHgzMDQxOyAgIC8qIDB4MzA0MSovCi0JdWludDhfdCByZWdfMHgzMDUxOyAgIC8qIDB4MzA1MSovCi0JdWludDhfdCByZWdfMHgzMDUzOyAgIC8qIDB4MzA1MyovCi0JdWludDhfdCByZWdfMHgzMDU1OyAgIC8qIDB4MzA1NSovCi0JdWludDhfdCByZWdfMHgzMDU3OyAgIC8qIDB4MzA1NyovCi0JdWludDhfdCByZWdfMHgzMDYwOyAgIC8qIDB4MzA2MCovCi0JdWludDhfdCByZWdfMHgzMDY1OyAgIC8qIDB4MzA2NSovCi0JdWludDhfdCByZWdfMHgzMEFBOyAgIC8qIDB4MzBBQSovCi0JdWludDhfdCByZWdfMHgzMEFCOyAgIC8qIDB4MzBBQiovCi0JdWludDhfdCByZWdfMHgzMEIwOyAgIC8qIDB4MzBCMCovCi0JdWludDhfdCByZWdfMHgzMEIyOyAgIC8qIDB4MzBCMiovCi0KLQl1aW50OF90IHJlZ18weDMwRDM7ICAgLyogMFgzMEQzKi8KLQl1aW50OF90IHJlZ18weDMwRDg7ICAgLyogMFgzMEQ4Ki8KLQotCXVpbnQ4X3QgcmVnXzB4MzEwNjsgICAvKiAweDMxMDYqLwotCXVpbnQ4X3QgcmVnXzB4MzEwODsgICAvKiAweDMxMDgqLwotCXVpbnQ4X3QgcmVnXzB4MzEwQTsgICAvKiAweDMxMEEqLwotCXVpbnQ4X3QgcmVnXzB4MzEwQzsgICAvKiAweDMxMEMqLwotCXVpbnQ4X3QgcmVnXzB4MzEwRTsgICAvKiAweDMxMEUqLwotCXVpbnQ4X3QgcmVnXzB4MzEyNjsgICAvKiAweDMxMjYqLwotCXVpbnQ4X3QgcmVnXzB4MzEyRTsgICAvKiAweDMxMkUqLwotCXVpbnQ4X3QgcmVnXzB4MzEzQzsgICAvKiAweDMxM0MqLwotCXVpbnQ4X3QgcmVnXzB4MzEzRTsgICAvKiAweDMxM0UqLwotCXVpbnQ4X3QgcmVnXzB4MzE0MDsgICAvKiAweDMxNDAqLwotCXVpbnQ4X3QgcmVnXzB4MzE0MjsgICAvKiAweDMxNDIqLwotCXVpbnQ4X3QgcmVnXzB4MzE0NDsgICAvKiAweDMxNDQqLwotCXVpbnQ4X3QgcmVnXzB4MzE0ODsgICAvKiAweDMxNDgqLwotCXVpbnQ4X3QgcmVnXzB4MzE0QTsgICAvKiAweDMxNEEqLwotCXVpbnQ4X3QgcmVnXzB4MzE2NjsgICAvKiAweDMxNjYqLwotCXVpbnQ4X3QgcmVnXzB4MzE2ODsgICAvKiAweDMxNjgqLwotCXVpbnQ4X3QgcmVnXzB4MzE2RjsgICAvKiAweDMxNkYqLwotCXVpbnQ4X3QgcmVnXzB4MzE3MTsgICAvKiAweDMxNzEqLwotCXVpbnQ4X3QgcmVnXzB4MzE3MzsgICAvKiAweDMxNzMqLwotCXVpbnQ4X3QgcmVnXzB4MzE3NTsgICAvKiAweDMxNzUqLwotCXVpbnQ4X3QgcmVnXzB4MzE3NzsgICAvKiAweDMxNzcqLwotCXVpbnQ4X3QgcmVnXzB4MzE3OTsgICAvKiAweDMxNzkqLwotCXVpbnQ4X3QgcmVnXzB4MzE3QjsgICAvKiAweDMxN0IqLwotCXVpbnQ4X3QgcmVnXzB4MzE3RDsgICAvKiAweDMxN0QqLwotCXVpbnQ4X3QgcmVnXzB4MzE3RjsgICAvKiAweDMxN0YqLwotCXVpbnQ4X3QgcmVnXzB4MzE4MTsgICAvKiAweDMxODEqLwotCXVpbnQ4X3QgcmVnXzB4MzE4NDsgICAvKiAweDMxODQqLwotCXVpbnQ4X3QgcmVnXzB4MzE4NTsgICAvKiAweDMxODUqLwotCXVpbnQ4X3QgcmVnXzB4MzE4NzsgICAvKiAweDMxODcqLwotCi0JdWludDhfdCByZWdfMHgzMUE0OyAgIC8qIDB4MzFBNCovCi0JdWludDhfdCByZWdfMHgzMUE2OyAgIC8qIDB4MzFBNiovCi0JdWludDhfdCByZWdfMHgzMUFDOyAgIC8qIDB4MzFBQyovCi0JdWludDhfdCByZWdfMHgzMUFFOyAgIC8qIDB4MzFBRSovCi0JdWludDhfdCByZWdfMHgzMUI0OyAgIC8qIDB4MzFCNCovCi0JdWludDhfdCByZWdfMHgzMUI2OyAgIC8qIDB4MzFCNiovCi0KLQl1aW50OF90IHJlZ18weDMyNTQ7ICAgLyogMHgzMjU0Ki8KLQl1aW50OF90IHJlZ18weDMyNTY7ICAgLyogMHgzMjU2Ki8KLQl1aW50OF90IHJlZ18weDMyNTg7ICAgLyogMHgzMjU4Ki8KLQl1aW50OF90IHJlZ18weDMyNUE7ICAgLyogMHgzMjVBKi8KLQl1aW50OF90IHJlZ18weDMyNjA7ICAgLyogMHgzMjYwKi8KLQl1aW50OF90IHJlZ18weDMyNjI7ICAgLyogMHgzMjYyKi8KLQotCXVpbnQ4X3QgcmVnXzB4MzMwNDsgICAvKiAweDMzMDQqLwotCXVpbnQ4X3QgcmVnXzB4MzMwNTsgICAvKiAweDMzMDUqLwotCXVpbnQ4X3QgcmVnXzB4MzMwNjsgICAvKiAweDMzMDYqLwotCXVpbnQ4X3QgcmVnXzB4MzMwNzsgICAvKiAweDMzMDcqLwotCXVpbnQ4X3QgcmVnXzB4MzMwODsgICAvKiAweDMzMDgqLwotCXVpbnQ4X3QgcmVnXzB4MzMwOTsgICAvKiAweDMzMDkqLwotCXVpbnQ4X3QgcmVnXzB4MzMwQTsgICAvKiAweDMzMEEqLwotCXVpbnQ4X3QgcmVnXzB4MzMwQjsgICAvKiAweDMzMEIqLwotCXVpbnQ4X3QgcmVnXzB4MzMwQzsgICAvKiAweDMzMEMqLwotCXVpbnQ4X3QgcmVnXzB4MzMwRDsgICAvKiAweDMzMEQqLwotCi19Owotc3RydWN0IHNuMTJtMHB6X3JlZ3sKLQljb25zdCBzdHJ1Y3QgcmVnX3N0cnVjdCAgKnJlZ19wYXQ7Ci0JY29uc3Qgc3RydWN0IHJlZ19zdHJ1Y3RfaW5pdCAgKnJlZ19wYXRfaW5pdDsKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zbjEybTBwel9yZWcuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zbjEybTBwel9yZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwNmQ5OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvc24xMm0wcHpfcmVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSAic24xMm0wcHouaCIKLS8qIEluaXRpYWxpc2F0aW9uIHNldHRpbmdzICovCi0KLWNvbnN0IHN0cnVjdCByZWdfc3RydWN0X2luaXQgaXUwNjBmX3JlZ19wYXRfaW5pdFsxXSA9IHt7Ci0JLyogUExMIHNldHRpbmcgKi8KLQkweDRCLCAvKiByZWcgMHgzMDJCKi8KLQkvKiBNSVBJIEVuYWJsZSBTZXR0aW5nICovCi0JMHgwNCwgLyogcmVnIDB4MzBFNSovCi0JMHgwMCwgLyogcmVnIDB4MzMwMCovCi0JLyogR2xvYmFsIFNldHRpbmcgKi8KLQkweDAwLCAvKiBpbWFnZV9vcmllbnRhdGlvbiovCi0JMHg4MCwgLyogcmVnIDB4MzAwQSovCi0JMHgwOCwgLyogcmVnIDB4MzAxNCovCi0JMHgzNywgLyogcmVnIDB4MzAxNSovCi0JMHg2MCwgLyogcmVnIDB4MzAxNyovCi0JMHgwMSwgLyogcmVnIDB4MzAxQyovCi0JMHgyOCwgLyogcmVnIDB4MzAzMSovCi0JMHgwMCwgLyogcmVnIDB4MzA0MCovCi0JMHg2MCwgLyogcmVnIDB4MzA0MSovCi0JMHgyNCwgLyogcmVnIDB4MzA1MSovCi0JMHgzNCwgLyogcmVnIDB4MzA1MyovCi0JMHgzQiwgLyogcmVnIDB4MzA1NSovCi0JMHhDMCwgLyogcmVnIDB4MzA1NyovCi0JMHgzMCwgLyogcmVnIDB4MzA2MCovCi0JMHgwMCwgLyogcmVnIDB4MzA2NSovCi0JMHg4OCwgLyogcmVnIDB4MzBBQSovCi0JMHgxQywgLyogcmVnIDB4MzBBQiovCi0JMHgzMiwgLyogcmVnIDB4MzBCMCovCi0JMHg4MywgLyogcmVnIDB4MzBCMiovCi0JMHgwNCwgLyogcmVnIDB4MzBEMyovCi0JMHhDMCwgLyogcmVnIDB4MzBEOCovCi0JMHg1MCwgLyogcmVnIDB4MzEwNiovCi0JMHhBNSwgLyogcmVnIDB4MzEwOCovCi0JMHhBOSwgLyogcmVnIDB4MzEwQSovCi0JMHgwQywgLyogcmVnIDB4MzEwQyovCi0JMHg1NSwgLyogcmVnIDB4MzEwRSovCi0JMHhDQywgLyogcmVnIDB4MzEyNiovCi0JMHg4MywgLyogcmVnIDB4MzEyRSovCi0JMHhDNywgLyogcmVnIDB4MzEzQyovCi0JMHgwNywgLyogcmVnIDB4MzEzRSovCi0JMHgzMiwgLyogcmVnIDB4MzE0MCovCi0JMHgzNSwgLyogcmVnIDB4MzE0MiovCi0JMHgzNSwgLyogcmVnIDB4MzE0NCovCi0JMHg3MywgLyogcmVnIDB4MzE0OCovCi0JMHg4MCwgLyogcmVnIDB4MzE0QSovCi0JMHhCRSwgLyogcmVnIDB4MzE2NiovCi0JMHhCRCwgLyogcmVnIDB4MzE2OCovCi0JMHg4MiwgLyogcmVnIDB4MzE2RiovCi0JMHhCQywgLyogcmVnIDB4MzE3MSovCi0JMHg4MiwgLyogcmVnIDB4MzE3MyovCi0JMHhCQywgLyogcmVnIDB4MzE3NSovCi0JMHgwQywgLyogcmVnIDB4MzE3NyovCi0JMHgyQywgLyogcmVnIDB4MzE3OSovCi0JMHg4MywgLyogcmVnIDB4MzE3QiovCi0JMHhBRiwgLyogcmVnIDB4MzE3RCovCi0JMHg4MywgLyogcmVnIDB4MzE3RiovCi0JMHhBRiwgLyogcmVnIDB4MzE4MSovCi0JMHgwNiwgLyogcmVnIDB4MzE4NCovCi0JMHhCQSwgLyogcmVnIDB4MzE4NSovCi0JMHhCRSwgLyogcmVnIDB4MzE4NyovCi0JMHhEOCwgLyogcmVnIDB4MzFBNCovCi0JMHgxNywgLyogcmVnIDB4MzFBNiovCi0JMHhDRiwgLyogcmVnIDB4MzFBQyovCi0JMHhGMSwgLyogcmVnIDB4MzFBRSovCi0JMHhEOCwgLyogcmVnIDB4MzFCNCovCi0JMHgxNywgLyogcmVnIDB4MzFCNiovCi0JMHgwOSwgLyogcmVnIDB4MzI1NCAqLwotCTB4QzUsIC8qIHJlZyAweDMyNTYgKi8KLQkweDg0LCAvKiByZWcgMHgzMjU4ICovCi0JMHg2QywgLyogcmVnIDB4MzI1QSAqLwotCTB4MEIsIC8qIHJlZyAweDMyNjAgKi8KLQkweDA5LCAvKiByZWcgMHgzMjYyICovCi0JMHgwNSwgLyogcmVnIDB4MzMwNCovCi0JMHgwNCwgLyogcmVnIDB4MzMwNSovCi0JMHgxNSwgLyogcmVnIDB4MzMwNiovCi0JMHgwMywgLyogcmVnIDB4MzMwNyovCi0JMHgxMywgLyogcmVnIDB4MzMwOCovCi0JMHgwNSwgLyogcmVnIDB4MzMwOSovCi0JMHgwQiwgLyogcmVnIDB4MzMwQSovCi0JMHgwNCwgLyogcmVnIDB4MzMwQiovCi0JMHgwQiwgLyogcmVnIDB4MzMwQyovCi0JMHgwNiAgLyogcmVnIDB4MzMwRCovCi19Ci19OwotCi0vKiBQcmV2aWV3IC8gU25hcHNob3QgcmVnaXN0ZXIgc2V0dGluZ3MgKi8KLWNvbnN0IHN0cnVjdCByZWdfc3RydWN0IGl1MDYwZl9yZWdfcGF0WzNdID0gewotCXsgLyogUHJldmlldyAqLwotCQkweDIyLCAvKjB4MWIqLyAvKiBmcHMqLwotCi0JCS8qIEdsb2JhbCBTZXR0aW5nICovCi0JCTB4MDEsIC8qIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX21zYiovCi0JCTB4RkYsIC8qIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX2xzYiovCi0KLQkJLyogTW9kZSBTZXR0aW5nICovCi0JCS8qIFY6IDEvMiBWLWFkZGl0aW9uICgxLDMpLAotCQlIOiAxLzIgSC1hdmVyYWdpbmcgKDEsMykgKi8KLQotCQkweDA2LCAvKiBmcmFtZV9sZW5ndGhfbGluZXNfbXNiICAgICAweDAzNDAqLwotCQkweDAyLCAvKiBmcmFtZV9sZW5ndGhfbGluZXNfbHNiICAgICAweDAzNDEqLwotCQkweDEwLCAvKiBsaW5lX2xlbmd0aF9wY2tfbXNiICAgICAgICAweDAzNDIqLwotCQkweDcwLCAvKiBsaW5lX2xlbmd0aF9wY2tfbHNiICAgICAgICAweDAzNDMqLwotCQkweDA3LCAvKiB4X291dHB1dF9zaXplX21zYiAgICAgICAgICAweDAzNEMqLwotCQkweGUwLCAvKiB4X291dHB1dF9zaXplX2xzYiAgICAgICAgICAweDAzNEQqLwotCQkweDA1LCAvKiB5X291dHB1dF9zaXplX21zYiAgICAgICAgICAweDAzNEUqLwotCQkweGU4LCAvKiB5X291dHB1dF9zaXplX2xzYiAgICAgICAgICAweDAzNEYqLwotCQkweDAxLCAvKiB4X2V2ZW5faW5jX2xzYiAgICAgICAgICAgICAweDAzODEqLwotCQkweDAzLCAvKiB4X29kZF9pbmNfbHNiICAgICAgICAgICAgICAweDAzODMqLwotCQkweDAxLCAvKiB5X2V2ZW5faW5jX2xzYiAgICAgICAgICAgICAweDAzODUqLwotCQkweDAzLCAvKiB5X29kZF9pbmNfbHNiICAgICAgICAgICAgICAweDAzODcqLwotCQkweDQ2LCAvKiByZWcgMHgzMDE2IFZNT0RFQUREICAgICAgICAweDMwMTYqLwotCQkweDg2LCAvKiByZWcgMHgzMEU4IEhBRERBVkUgICAgICAgICAweDMwRTgqLwotCQkweDAxLCAvKiByZWcgMHgzMzAxIFJHTEFORVNFTCAgICAgICAweDMzMDEqLwotCi0JCTB4MDAsICAvKiAweDAzNDQgKi8KLQkJMHgwMCwgIC8qIDB4MDM0NSAqLwotCQkweDAwLCAgLyogMHgwMzQ2ICovCi0JCTB4MDAsICAvKiAweDAzNDcgKi8KLQkJMHgwRiwgIC8qIDB4MDM0OCAqLwotCQkweEJGLCAgLyogMHgwMzQ5ICovCi0JCTB4MEIsICAvKiAweDAzNEEgKi8KLQkJMHhDRiwgIC8qIDB4MDM0QiAqLwotCX0sCi0JeyAvKiBTbmFwc2hvdCAqLwotCQkweDE0LCAvKiBwbGxfbXVsdGlwbGllcl9sc2IgICAgLy8gMjAvMTAgZnBzKi8KLQkJLyogMHgxNCBmb3IgcGNsayA5Nk1IeiBhdCA3LjUgZnBzICovCi0KLQkJLyogR2xvYmFsIFNldHRpbmcgKi8KLQkJMHgwQiwgLyogY29hcnNlX2ludGVncmF0aW9uX3RpbWVfbXNiKi8KLQkJMHhGRiwgLyogY29hcnNlX2ludGVncmF0aW9uX3RpbWVfbHNiKi8KLQotCQkvKiBNb2RlIFNldHRpbmcgKi8KLQkJLyogRnVsbCAqLwotCQkweDBDLC8qZnJhbWVfbGVuZ3RoX2xpbmVzX21zYiAweDAzNDAqLwotCQkweDAyLC8qZnJhbWVfbGVuZ3RoX2xpbmVzX2xzYiAweDAzNDEqLwotCQkweDEwLC8qbGluZV9sZW5ndGhfcGNrX21zYiAweDAzNDIqLwotCQkweDcwLC8qIGxpbmVfbGVuZ3RoX3Bja19sc2IgMHgwMzQzKi8KLQkJMHgwRiwvKiB4X291dHB1dF9zaXplX21zYiAgIDB4MDM0QyovCi0JCTB4QzAsIC8qIHhfb3V0cHV0X3NpemVfbHNiICAweDAzNEQqLwotCQkweDBCLCAvKiB5X291dHB1dF9zaXplX21zYiAgMHgwMzRFKi8KLQkJMHhEMCwgLyogeV9vdXRwdXRfc2l6ZV9sc2IgIDB4MDM0RiovCi0JCTB4MDEsIC8qIHhfZXZlbl9pbmNfbHNiICAgICAweDAzODEqLwotCQkweDAxLCAvKiB4X29kZF9pbmNfbHNiICAgICAgMHgwMzgzKi8KLQkJMHgwMSwgLyogeV9ldmVuX2luY19sc2IgICAgICAgICAgICAgICAgICAgICAweDAzODUqLwotCQkweDAxLCAvKiB5X29kZF9pbmNfbHNiICAgICAgICAgICAgICAgICAgICAgIDB4MDM4NyovCi0JCTB4MDYsIC8qIHJlZyAweDMwMTYgVk1PREVBREQgICAgICAgICAgICAgICAgMHgzMDE2Ki8KLQkJMHgwNiwgLyogcmVnIDB4MzBFOCBIQUREQVZFICAgICAgICAgICAgICAgICAweDMwRTgqLwotCQkweDAwLCAvKiByZWcgMHgzMzAxIFJHTEFORVNFTCAgICAgICAgICAgICAgIDB4MzMwMSovCi0KLQkJMHgwMCwgIC8qIDB4MDM0NCAqLwotCQkweDAwLCAgLyogMHgwMzQ1ICovCi0JCTB4MDAsICAvKiAweDAzNDYgKi8KLQkJMHgwMCwgIC8qIDB4MDM0NyAqLwotCQkweDBGLCAgLyogMHgwMzQ4ICovCi0JCTB4QkYsICAvKiAweDAzNDkgKi8KLQkJMHgwQiwgIC8qIDB4MDM0QSAqLwotCQkweENGLCAgLyogMHgwMzRCICovCi0JfSwKLQkvKiAxMjAgZnBzIHNldHRpbmdzICovCi0JewotCQkweDFCLCAvKjB4MUIgZnBzKi8KLQkJLyogR2xvYmFsIFNldHRpbmcgKi8KLQkJMHgwMCwgLyogY29hcnNlX2ludGVncmF0aW9uX3RpbWVfbXNiKi8KLQkJMHhGRSwgLyogY29hcnNlX2ludGVncmF0aW9uX3RpbWVfbHNiKi8KLQotCQkvKiBNb2RlIFNldHRpbmcgKi8KLQkJLyogVjogMS84IFYtYWRkaXRpb24gKDksNyksCi0JCUg6IEZ1bGwgKi8KLQotCQkweDAxLCAvKiBmcmFtZV9sZW5ndGhfbGluZXNfbXNiICAgICAweDAzNDAqLwotCQkweDAxLCAvKiBmcmFtZV9sZW5ndGhfbGluZXNfbHNiICAgICAweDAzNDEqLwotCQkweDEwLCAvKiBsaW5lX2xlbmd0aF9wY2tfbXNiICAgICAgICAweDAzNDIqLwotCQkweDcwLCAvKiBsaW5lX2xlbmd0aF9wY2tfbHNiICAgICAgICAweDAzNDMqLwotCQkweDBmLCAvKiB4X291dHB1dF9zaXplX21zYiAgICAgICAgICAweDAzNEMqLwotCQkweGMwLCAvKiB4X291dHB1dF9zaXplX2xzYiAgICAgICAgICAweDAzNEQqLwotCQkweDAwLCAvKiB5X291dHB1dF9zaXplX21zYiAgICAgICAgICAweDAzNEUqLwotCQkweEY4LCAvKiB5X291dHB1dF9zaXplX2xzYiAgICAgICAgICAweDAzNEYqLwotCQkweDAxLCAvKiB4X2V2ZW5faW5jX2xzYiAgICAgICAgICAgICAweDAzODEqLwotCQkweDAxLCAvKiB4X29kZF9pbmNfbHNiICAgICAgICAgICAgICAweDAzODMqLwotCQkweDA5LCAvKiB5X2V2ZW5faW5jX2xzYiAgICAgICAgICAgICAweDAzODUqLwotCQkweDA3LCAvKiB5X29kZF9pbmNfbHNiICAgICAgICAgICAgICAweDAzODcqLwotCQkweDQ2LCAvKiByZWcgMHgzMDE2IFZNT0RFQUREICAgICAgICAweDMwMTYqLwotCQkweDg2LCAvKiByZWcgMHgzMEU4IEhBRERBVkUgICAgICAgICAweDMwRTgqLwotCQkweDAwLCAvKiByZWcgMHgzMzAxIFJHTEFORVNFTCAgICAgICAweDMzMDEqLwotCQkvKiBhZGQgZm9yIDEyMGZwcyBzdXBwb3J0ICovCi0JCTB4MDAsIC8qIDB4MDM0NCovCi0JCTB4MDAsIC8qIDB4MDM0NSovCi0JCTB4MDIsIC8qIDB4MDM0NiovCi0JCTB4MTAsIC8qIDB4MDM0NyovCi0JCTB4MEYsIC8qIDB4MDM0OCovCi0JCTB4QkYsIC8qIDB4MDM0OSovCi0JCTB4MDksIC8qIDB4MDM0QSovCi0JCTB4Q0YsIC8qIDB4MDM0QiovCi0JfQotfTsKLXN0cnVjdCBzbjEybTBwel9yZWcgc24xMm0wcHpfcmVncyA9IHsKLQkucmVnX3BhdCA9ICZpdTA2MGZfcmVnX3BhdFswXSwKLQkucmVnX3BhdF9pbml0ID0gJml1MDYwZl9yZWdfcGF0X2luaXRbMF0sCi19OwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmI2ODAxLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmI2ODAxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MTZhMWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZiNjgwMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYxNiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9tc21fY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlICJ2YjY4MDEuaCIKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JU0VOU09SIFJFR0lTVEVSIERFRklORVMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWVudW0gewotCVJFR19IT0xEID0gMHgwMTA0LAotCVJFTEVBU0VfSE9MRCA9IDB4MDAwMCwKLQlIT0xEID0gMHgwMDAxLAotCVNUQU5EQllfTU9ERSA9IDB4MDAwMCwKLQlSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUUgPSAweDAyMDIsCi0JUkVHX0FOQUxPR1VFX0dBSU5fQ09ERV9HTE9CQUwgPSAweDAyMDQsCi0JUkVHX1JBTVBfU0NBTEUgPSAweDMxMTYsCi0JUkVHX1BPV0VSX01BTl9FTkFCTEVfMyA9IDB4MzE0MiwKLQlSRUdfUE9XRVJfTUFOX0VOQUJMRV80ID0gMHgzMTQzLAotCVJFR19QT1dFUl9NQU5fRU5BQkxFXzUgPSAweDMxNDQsCi0JUkVHX0NDUDJfREFUQV9GT1JNQVQgPSAweDAxMTIsCi0JUkVHX1BSRV9QTExfQ0xLX0RJViA9IDB4MDMwNCwKLQlSRUdfUExMX01VTFRJUExJRVIgPSAweDAzMDYsCi0JUkVHX1ZUX1NZU19DTEtfRElWID0gMHgwMzAyLAotCVJFR19WVF9QSVhfQ0xLX0RJViA9IDB4MDMwMCwKLQlSRUdfT1BfU1lTX0NMS19ESVYgPSAweDAzMEEsCi0JUkVHX09QX1BJWF9DTEtfRElWID0gMHgwMzA4LAotCVJFR19WVF9MSU5FX0xFTkdUSF9QQ0sgPSAweDAzNDIsCi0JUkVHX1hfT1VUUFVUX1NJWkUgPSAweDAzNEMsCi0JUkVHX1lfT1VUUFVUX1NJWkUgPSAweDAzNEUsCi0JUkVHX1hfT0REX0lOQyA9IDB4MDM4MiwKLQlSRUdfWV9PRERfSU5DID0gMHgwMzg2LAotCVJFR19WVF9GUkFNRV9MRU5HVEhfTElORVMgPSAweDAzNDAsCi0JUkVHX0FOQUxPR19USU1JTkdfTU9ERVNfMiA9IDB4MzExMywKLQlSRUdfQlJVQ0VfRU5BQkxFID0gMHgzN0IwLAotCVJFR19PUF9DT0RFUl9TWU5DX0NMS19TRVRVUCA9IDB4MzQwMCwKLQlSRUdfT1BfQ09ERVJfRU5BQkxFID0gMHgzNDAxLAotCVJFR19PUF9DT0RFUl9TTE9XX1BBRF9FTiA9IDB4MzQwMiwKLQlSRUdfT1BfQ09ERVJfQVVUT19TVEFSVFVQID0gMHgzNDE0LAotCVJFR19TQ1lUSEVfRU5BQkxFID0gMHgzMjA0LAotCVJFR19TQ1lUSEVfV0VJR0hUID0gMHgzMjA2LAotCVJFR19GUkFNRV9DT1VOVCA9IDB4MDAwNSwKLQlSRUdfTU9ERV9TRUxFQ1QgPSAweDAxMDAsCi0JUkVHX0NDUDJfQ0hBTk5FTF9JREVOVElGSUVSID0gMHgwMTEwLAotCVJFR19DQ1AyX1NJR05BTExJTkdfTU9ERSA9IDB4MDExMSwKLQlSRUdfQlRMX0xFVkVMX1NFVFVQID0gMHgzMTFCLAotCVJFR19PUF9DT0RFUl9BVVRPTUFUSUNfTU9ERV9FTkFCTEUgPSAweDM0MDMsCi0JUkVHX1BMTF9DVFJMID0gMHgzODAxLAotCVJFR19WQ01fREFDX0NPREUgPSAweDM4NjAsCi0JUkVHX1ZDTV9EQUNfU1RST0JFID0gMHgzODY4LAotCVJFR19WQ01fREFDX0VOQUJMRSA9IDB4Mzg2QywKLQlSRUdfTlZNX1QxX0FERFJfMDAgPSAweDM2MDAsCi0JUkVHX05WTV9UMV9BRERSXzAxID0gMHgzNjAxLAotCVJFR19OVk1fVDFfQUREUl8wMiA9IDB4MzYwMiwKLQlSRUdfTlZNX1QxX0FERFJfMDMgPSAweDM2MDMsCi0JUkVHX05WTV9UMV9BRERSXzA0ID0gMHgzNjA0LAotCVJFR19OVk1fVDFfQUREUl8wNSA9IDB4MzYwNSwKLQlSRUdfTlZNX1QxX0FERFJfMDYgPSAweDM2MDYsCi0JUkVHX05WTV9UMV9BRERSXzA3ID0gMHgzNjA3LAotCVJFR19OVk1fVDFfQUREUl8wOCA9IDB4MzYwOCwKLQlSRUdfTlZNX1QxX0FERFJfMDkgPSAweDM2MDksCi0JUkVHX05WTV9UMV9BRERSXzBBID0gMHgzNjBBLAotCVJFR19OVk1fVDFfQUREUl8wQiA9IDB4MzYwQiwKLQlSRUdfTlZNX1QxX0FERFJfMEMgPSAweDM2MEMsCi0JUkVHX05WTV9UMV9BRERSXzBEID0gMHgzNjBELAotCVJFR19OVk1fVDFfQUREUl8wRSA9IDB4MzYwRSwKLQlSRUdfTlZNX1QxX0FERFJfMEYgPSAweDM2MEYsCi0JUkVHX05WTV9UMV9BRERSXzEwID0gMHgzNjEwLAotCVJFR19OVk1fVDFfQUREUl8xMSA9IDB4MzYxMSwKLQlSRUdfTlZNX1QxX0FERFJfMTIgPSAweDM2MTIsCi0JUkVHX05WTV9UMV9BRERSXzEzID0gMHgzNjEzLAotCVJFR19OVk1fQ1RSTCA9IDB4MzY4MCwKLQlSRUdfTlZNX1BETiA9IDB4MzY4MSwKLQlSRUdfTlZNX1BVTFNFX1dJRFRIID0gMHgzNjhCLAotfTsKLQotI2RlZmluZSBWQjY4MDFfTElORVNfUEVSX0ZSQU1FX1BSRVZJRVcgICA4MDAKLSNkZWZpbmUgVkI2ODAxX0xJTkVTX1BFUl9GUkFNRV9TTkFQU0hPVCAxNjAwCi0jZGVmaW5lIFZCNjgwMV9QSVhFTFNfUEVSX0xJTkVfUFJFVklFVyAgMjUwMAotI2RlZmluZSBWQjY4MDFfUElYRUxTX1BFUl9MSU5FX1NOQVBTSE9UIDI1MDAKLQotLyogQUYgY29uc3RhbnQgKi8KLSNkZWZpbmUgVkI2ODAxX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSICAgIDI1Ci0jZGVmaW5lIFZCNjgwMV9TVEVQU19ORUFSX1RPX0NMT1NFU1RfSU5GICAyNQotCi0vKiBmb3IgMzAgZnBzIHByZXZpZXcgKi8KLSNkZWZpbmUgVkI2ODAxX0RFRkFVTFRfQ0xPQ0tfUkFURSAgICAxMjAwMDAwMAotCi1lbnVtIHZiNjgwMV90ZXN0X21vZGVfdCB7Ci0JVEVTVF9PRkYsCi0JVEVTVF8xLAotCVRFU1RfMiwKLQlURVNUXzMKLX07Ci0KLWVudW0gdmI2ODAxX3Jlc29sdXRpb25fdCB7Ci0JUVRSX1NJWkUsCi0JRlVMTF9TSVpFLAotCUlOVkFMSURfU0laRQotfTsKLQotZW51bSB2YjY4MDFfc2V0dGluZ190IHsKLQlSRVNfUFJFVklFVywKLQlSRVNfQ0FQVFVSRQotfTsKLQotc3RydWN0IHZiNjgwMV93b3JrX3QgewotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotfTsKLQotc3RydWN0IHNlbnNvcl9keW5hbWljX3BhcmFtc190IHsKLQl1aW50MTZfdCBwcmV2aWV3X3BpeGVsc1BlckxpbmU7Ci0JdWludDE2X3QgcHJldmlld19saW5lc1BlckZyYW1lOwotCXVpbnQxNl90IHNuYXBzaG90X3BpeGVsc1BlckxpbmU7Ci0JdWludDE2X3Qgc25hcHNob3RfbGluZXNQZXJGcmFtZTsKLQl1aW50OF90IHNuYXBzaG90X2NoYW5nZWRfZnBzOwotCXVpbnQzMl90IHBjbGs7Ci19OwotCi1zdHJ1Y3QgdmI2ODAxX3NlbnNvcl9pbmZvIHsKLQkvKiBTZW5zb3IgQ29uZmlndXJhdGlvbiBJbnB1dCBQYXJhbWV0ZXJzICovCi0JdWludDMyX3QgZXh0X2Nsa19mcmVxX21oejsKLQl1aW50MzJfdCB0YXJnZXRfZnJhbWVfcmF0ZV9mcHM7Ci0JdWludDMyX3QgdGFyZ2V0X3Z0X3BpeF9jbGtfZnJlcV9taHo7Ci0JdWludDMyX3Qgc3ViX3NhbXBsaW5nX2ZhY3RvcjsKLQl1aW50MzJfdCBhbmFsb2dfYmlubmluZ19hbGxvd2VkOwotCXVpbnQzMl90IHJhd19tb2RlOwotCXVpbnQzMl90IGNhcHR1cmVfbW9kZTsKLQotCS8qIEltYWdlIFJlYWRvdXQgUmVnaXN0ZXJzICovCi0JdWludDMyX3QgeF9vZGRfaW5jOwkvKiB4IHBpeGVsIGFycmF5IGFkZHJlc3Npbmcgb2RkIGluY3JlbWVudCAqLwotCXVpbnQzMl90IHlfb2RkX2luYzsJLyogeSBwaXhlbCBhcnJheSBhZGRyZXNzaW5nIG9kZCBpbmNyZW1lbnQgKi8KLQl1aW50MzJfdCB4X291dHB1dF9zaXplOwkvKiB3aWR0aCBvZiBvdXRwdXQgaW1hZ2UgICovCi0JdWludDMyX3QgeV9vdXRwdXRfc2l6ZTsJLyogaGVpZ2h0IG9mIG91dHB1dCBpbWFnZSAqLwotCi0JLyogRGVjbGFyZSBkYXRhIGZvcm1hdCAqLwotCXVpbnQzMl90IGNjcDJfZGF0YV9mb3JtYXQ7Ci0KLQkvKiBDbG9jayBUcmVlIFJlZ2lzdGVycyAqLwotCXVpbnQzMl90IHByZV9wbGxfY2xrX2RpdjsKLQl1aW50MzJfdCBwbGxfbXVsdGlwbGllcjsKLQl1aW50MzJfdCB2dF9zeXNfY2xrX2RpdjsKLQl1aW50MzJfdCB2dF9waXhfY2xrX2RpdjsKLQl1aW50MzJfdCBvcF9zeXNfY2xrX2RpdjsKLQl1aW50MzJfdCBvcF9waXhfY2xrX2RpdjsKLQotCS8qIFZpZGVvIFRpbWluZyBSZWdpc3RlcnMgKi8KLQl1aW50MzJfdCB2dF9saW5lX2xlbmd0aF9wY2s7Ci0JdWludDMyX3QgdnRfZnJhbWVfbGVuZ3RoX2xpbmVzOwotCi0JLyogQW5hbG9ndWUgQmlubmluZyBSZWdpc3RlcnMgKi8KLQl1aW50OF90IHZ0aW1pbmdfbWFqb3I7Ci0JdWludDhfdCBhbmFsb2dfdGltaW5nX21vZGVzXzQ7Ci0KLQkvKiBGaW5lIChwaXhlbCkgSW50ZWdyYXRpb24gVGltZSBSZWdpc3RlcnMgKi8KLQl1aW50MzJfdCBmaW5lX2ludGVncmF0aW9uX3RpbWU7Ci0KLQkvKiBDb2Fyc2UgKGxpbmVzKSBJbnRlZ3JhdGlvbiBUaW1lIExpbWl0IFJlZ2lzdGVycyAqLwotCXVpbnQzMl90IGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX21heDsKLQotCS8qIENvYXJzZSAobGluZXMpIEludGVncmF0aW9uIFRpbWl0IFJlZ2lzdGVyICgxNi1iaXQpICovCi0JdWludDMyX3QgY29hcnNlX2ludGVncmF0aW9uX3RpbWU7Ci0KLQkvKiBBbmFsb2d1ZSBHYWluIENvZGUgR2xvYmFsIFJlZ2lzdGVycyAqLwotCXVpbnQzMl90IGFuYWxvZ3VlX2dhaW5fY29kZV9nbG9iYWw7Ci0KLQkvKiBEaWdpdGFsIEdhaW4gQ29kZSBSZWdpc3RlcnMgKi8KLQl1aW50MzJfdCBkaWdpdGFsX2dhaW5fY29kZTsKLQotCS8qIE92ZXJhbGwgZ2FpbiAoYW5hbG9ndWUgJiBkaWdpdGFsKSBjb2RlCi0JICogTm90ZSB0aGF0IHRoaXMgaXMgbm90IGEgcmVhbCByZWdpc3RlciBidXQganVzdAotCSAqIGFuIGFic3RyYWN0aW9uIGZvciB0aGUgY29tYmluYXRpb24gb2YgYW5hbG9ndWUKLQkgKiBhbmQgZGlnaXRhbCBnYWluICovCi0JdWludDMyX3QgZ2Fpbl9jb2RlOwotCi0JLyogRk1UIFRlc3QgSW5mb3JtYXRpb24gKi8KLQl1aW50MzJfdCBwYXNzX2ZhaWw7Ci0JdWludDMyX3QgZGF5OwotCXVpbnQzMl90IG1vbnRoOwotCXVpbnQzMl90IHllYXI7Ci0JdWludDMyX3QgdGVzdGVyOwotCXVpbnQzMl90IHBhcnRfbnVtYmVyOwotCi0JLyogQXV0b2ZvY3VzIGNvbnRyb2xzICovCi0JdWludDMyX3QgdmNtX2RhY19jb2RlOwotCWludCB2Y21fbWF4X2RhY19jb2RlX3N0ZXA7Ci0JaW50IHZjbV9wcm9wb3J0aW9uYWxfZmFjdG9yOwotCWludCB2Y21fZGFjX2NvZGVfc3BhY2luZ19tczsKLQotCS8qIFZDTSBOVk0gQ2hhcmFjdGVyaXNhdGlvbiBJbmZvcm1hdGlvbiAqLwotCXVpbnQzMl90IHZjbV9kYWNfY29kZV9pbmZpbml0eV9kbjsKLQl1aW50MzJfdCB2Y21fZGFjX2NvZGVfbWFjcm9fdXA7Ci0JdWludDMyX3QgdmNtX2RhY19jb2RlX3VwX2RuX2RlbHRhOwotCi0JLyogSW50ZXJuYWwgVmFyaWFibGVzICovCi0JdWludDMyX3QgbWluX3Z0X2ZyYW1lX2xlbmd0aF9saW5lczsKLX07Ci0KLXN0cnVjdCB2YjY4MDFfd29ya190ICp2YjY4MDFfc2Vuc29ydzsKLXN0cnVjdCBpMmNfY2xpZW50ICp2YjY4MDFfY2xpZW50OwotCi1zdHJ1Y3QgdmI2ODAxX2N0cmxfdCB7Ci0JY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNlbnNvcmRhdGE7Ci0KLQlpbnQgc2Vuc29ybW9kZTsKLQl1aW50MzJfdCBmYWN0b3JfZnBzOwkvKiBpbml0IHRvIDEgKiAweDAwMDAwNDAwICovCi0JdWludDE2X3QgY3Vycl9mcHM7Ci0JdWludDE2X3QgbWF4X2ZwczsKLQlpbnQ4X3QgcGljdF9leHBfdXBkYXRlOwotCWludDhfdCByZWR1Y2VsOwotCXVpbnQxNl90IGN1cnJfbGVuc19wb3M7Ci0JdWludDE2X3QgaW5pdF9jdXJyX2xlbnNfcG9zOwotCWVudW0gdmI2ODAxX3Jlc29sdXRpb25fdCBwcmV2X3JlczsKLQllbnVtIHZiNjgwMV9yZXNvbHV0aW9uX3QgcGljdF9yZXM7Ci0JZW51bSB2YjY4MDFfcmVzb2x1dGlvbl90IGN1cnJfcmVzOwotCWVudW0gdmI2ODAxX3Rlc3RfbW9kZV90IHNldF90ZXN0OwotCi0Jc3RydWN0IHZiNjgwMV9zZW5zb3JfaW5mbyBzX2luZm87Ci0Jc3RydWN0IHNlbnNvcl9keW5hbWljX3BhcmFtc190IHNfZHluYW1pY19wYXJhbXM7Ci19OwotCi1zdGF0aWMgc3RydWN0IHZiNjgwMV9jdHJsX3QgKnZiNjgwMV9jdHJsOwotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHZiNjgwMV93YWl0X3F1ZXVlKTsKLURFRklORV9NVVRFWCh2YjY4MDFfbXV0KTsKLQotc3RhdGljIGludCB2YjY4MDFfaTJjX3J4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQkJCSAgICAgdW5zaWduZWQgY2hhciAqcnhkYXRhLCBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKLQkJewotCQkJLmFkZHIgPSBzYWRkciwKLQkJCS5mbGFncyA9IDAsCi0JCQkubGVuID0gMiwKLQkJCS5idWYgPSByeGRhdGEsCi0JCX0sCi0JCXsKLQkJCS5hZGRyID0gc2FkZHIsCi0JCQkuZmxhZ3MgPSBJMkNfTV9SRCwKLQkJCS5sZW4gPSAyLAotCQkJLmJ1ZiA9IHJ4ZGF0YSwKLQkJfSwKLQl9OwotCi0JaWYgKGkyY190cmFuc2Zlcih2YjY4MDFfY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAyKSA8IDApIHsKLQkJQ0RCRygidmI2ODAxX2kyY19yeGRhdGEgZmFpbGVkIVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCB2YjY4MDFfaTJjX3JlYWQodW5zaWduZWQgc2hvcnQgcmFkZHIsCi0JCQkgICAgICAgdW5zaWduZWQgc2hvcnQgKnJkYXRhLCBpbnQgcmxlbikKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKLQotCWlmICghcmRhdGEpCi0JCXJldHVybiAtRUlPOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCi0JYnVmWzBdID0gKHJhZGRyICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlsxXSA9IChyYWRkciAmIDB4MDBGRik7Ci0KLQlyYyA9IHZiNjgwMV9pMmNfcnhkYXRhKHZiNjgwMV9jbGllbnQtPmFkZHIsIGJ1Ziwgcmxlbik7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoInZiNjgwMV9pMmNfcmVhZCAweCV4IGZhaWxlZCFcbiIsIHJhZGRyKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCSpyZGF0YSA9IChybGVuID09IDIgPyBidWZbMF0gPDwgOCB8IGJ1ZlsxXSA6IGJ1ZlswXSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHZiNjgwMV9pMmNfcmVhZF90YWJsZShzdHJ1Y3QgdmI2ODAxX2kyY19yZWdfY29uZl90ICpyZWdzLAotCQkJCSAgICAgaW50IGl0ZW1zKQotewotCWludCBpOwotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCi0JZm9yIChpID0gMDsgaSA8IGl0ZW1zOyBpKyspIHsKLQkJdW5zaWduZWQgc2hvcnQgKmJ1ZiA9Ci0JCSAgICByZWdzLT5kbGVuID09IERfTEVOX0JZVEUgPwotCQkgICAgKHVuc2lnbmVkIHNob3J0ICopJnJlZ3MtPmJkYXRhIDoKLQkJICAgICh1bnNpZ25lZCBzaG9ydCAqKSZyZWdzLT53ZGF0YTsKLQkJcmMgPSB2YjY4MDFfaTJjX3JlYWQocmVncy0+d2FkZHIsIGJ1ZiwgcmVncy0+ZGxlbiArIDEpOwotCi0JCWlmIChyYyA8IDApIHsKLQkJCUNEQkcoInZiNjgwMV9pMmNfcmVhZF90YWJsZSBGYWlsZWQhISFcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZWdzKys7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCB2YjY4MDFfaTJjX3R4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQkJCQkgdW5zaWduZWQgY2hhciAqdHhkYXRhLCBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0gewotCQl7Ci0JCQkuYWRkciA9IHNhZGRyLAotCQkJLmZsYWdzID0gMCwKLQkJCS5sZW4gPSBsZW5ndGgsCi0JCQkuYnVmID0gdHhkYXRhLAotCQl9LAotCX07Ci0KLQlpZiAoaTJjX3RyYW5zZmVyKHZiNjgwMV9jbGllbnQtPmFkYXB0ZXIsIG1zZywgMSkgPCAwKSB7Ci0JCUNEQkcoInZiNjgwMV9pMmNfdHhkYXRhIGZhaWxkIDB4JXhcbiIsIHZiNjgwMV9jbGllbnQtPmFkZHIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgdmI2ODAxX2kyY193cml0ZV9iKHVuc2lnbmVkIHNob3J0IHdhZGRyLCB1aW50OF90IGJkYXRhKQotewotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCXVuc2lnbmVkIGNoYXIgYnVmWzNdOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9ICh3YWRkciAmIDB4RkYwMCkgPj4gODsKLQlidWZbMV0gPSAod2FkZHIgJiAweDAwRkYpOwotCWJ1ZlsyXSA9IGJkYXRhOwotCi0JQ0RCRygiaTJjX3dyaXRlX2IgYWRkciA9ICVkLCB2YWwgPSAlZFxuIiwgd2FkZHIsIGJkYXRhKTsKLQlyYyA9IHZiNjgwMV9pMmNfdHhkYXRhKHZiNjgwMV9jbGllbnQtPmFkZHIsIGJ1ZiwgMyk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoImkyY193cml0ZV9iIGZhaWxlZCwgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXghXG4iLAotCQkgICAgIHdhZGRyLCBiZGF0YSk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCB2YjY4MDFfaTJjX3dyaXRlX3codW5zaWduZWQgc2hvcnQgd2FkZHIsIHVuc2lnbmVkIHNob3J0IHdkYXRhKQotewotCWludDMyX3QgcmMgPSAtRUZBVUxUOwotCXVuc2lnbmVkIGNoYXIgYnVmWzRdOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9ICh3YWRkciAmIDB4RkYwMCkgPj4gODsKLQlidWZbMV0gPSAod2FkZHIgJiAweDAwRkYpOwotCWJ1ZlsyXSA9ICh3ZGF0YSAmIDB4RkYwMCkgPj4gODsKLQlidWZbM10gPSAod2RhdGEgJiAweDAwRkYpOwotCi0JQ0RCRygiaTJjX3dyaXRlX3cgYWRkciA9ICVkLCB2YWwgPSAlZCwgYnVmWzJdID0gMHgleCwgYnVmWzNdID0gMHgleFxuIiwKLQkgICAgIHdhZGRyLCB3ZGF0YSwgYnVmWzJdLCBidWZbM10pOwotCi0JcmMgPSB2YjY4MDFfaTJjX3R4ZGF0YSh2YjY4MDFfY2xpZW50LT5hZGRyLCBidWYsIDQpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiaTJjX3dyaXRlX3cgZmFpbGVkLCBhZGRyID0gMHgleCwgdmFsID0gMHgleCFcbiIsCi0JCSAgICAgd2FkZHIsIHdkYXRhKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHZiNjgwMV9pMmNfd3JpdGVfdGFibGUoc3RydWN0IHZiNjgwMV9pMmNfcmVnX2NvbmZfdCAqcmVncywKLQkJCQkgICAgICBpbnQgaXRlbXMpCi17Ci0JaW50IGk7Ci0JaW50MzJfdCByYyA9IC1FRkFVTFQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaXRlbXM7IGkrKykgewotCQlyYyA9ICgocmVncy0+ZGxlbiA9PSBEX0xFTl9CWVRFKSA/Ci0JCSAgICAgIHZiNjgwMV9pMmNfd3JpdGVfYihyZWdzLT53YWRkciwgcmVncy0+YmRhdGEpIDoKLQkJICAgICAgdmI2ODAxX2kyY193cml0ZV93KHJlZ3MtPndhZGRyLCByZWdzLT53ZGF0YSkpOwotCi0JCWlmIChyYyA8IDApIHsKLQkJCUNEQkcoInZiNjgwMV9pMmNfd3JpdGVfdGFibGUgRmFpbGVkISEhXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmVncysrOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgdmI2ODAxX3Jlc2V0KGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCWludCByYzsKLQotCXJjID0gZ3Bpb19yZXF1ZXN0KGRhdGEtPnNlbnNvcl9yZXNldCwgInZiNjgwMSIpOwotCWlmICghcmMpIHsKLQkJQ0RCRygic2Vuc29yX3Jlc2V0IFNVY2NlZWRlZFxuIik7Ci0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCQltZGVsYXkoNTApOwotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+c2Vuc29yX3Jlc2V0LCAxKTsKLQkJbWRlbGF5KDEzKTsKLQl9IGVsc2UKLQkJQ0RCRygic2Vuc29yX3Jlc2V0IEZBaWxlZFxuIik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHZiNjgwMV9zZXRfZGVmYXVsdF9mb2N1cyh2b2lkKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JLyogRklYTUU6IERlZmF1bHQgZm9jdXMgbm90IHN1cHBvcnRlZCAqLwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCB2YjY4MDFfZ2V0X3BpY3RfZnBzKHVpbnQxNl90IGZwcywgdWludDE2X3QgKnBmcHMpCi17Ci0JLyogaW5wdXQgZnBzIGlzIHByZXZpZXcgZnBzIGluIFE4IGZvcm1hdCAqLwotCXVpbnQzMl90IGRpdmlkZXI7IC8qUTEwICovCi0JdWludDMyX3QgcGNsa19tdWx0OyAvKlExMCAqLwotCXVpbnQzMl90IGQxOwotCXVpbnQzMl90IGQyOwotCi0JZDEgPQotCQkodWludDMyX3QpKAotCQkodmI2ODAxX2N0cmwtPnNfZHluYW1pY19wYXJhbXMucHJldmlld19saW5lc1BlckZyYW1lICoKLQkJMHgwMDAwMDQwMCkgLwotCQl2YjY4MDFfY3RybC0+c19keW5hbWljX3BhcmFtcy5zbmFwc2hvdF9saW5lc1BlckZyYW1lKTsKLQotCWQyID0KLQkJKHVpbnQzMl90KSgKLQkJKHZiNjgwMV9jdHJsLT5zX2R5bmFtaWNfcGFyYW1zLnByZXZpZXdfcGl4ZWxzUGVyTGluZSAqCi0JCTB4MDAwMDA0MDApIC8KLQkJdmI2ODAxX2N0cmwtPnNfZHluYW1pY19wYXJhbXMuc25hcHNob3RfcGl4ZWxzUGVyTGluZSk7Ci0KLQotCWRpdmlkZXIgPSAodWludDMyX3QpIChkMSAqIGQyKSAvIDB4MDAwMDA0MDA7Ci0KLQlwY2xrX211bHQgPSAoNDggKiAweDQwMCkgLyA2MDsKLQotCS8qIFZlcmlmeSBQQ0xLIHNldHRpbmdzIGFuZCBmcmFtZSBzaXplcy4gKi8KLQkqcGZwcyA9ICh1aW50MTZfdCkoKCgoZnBzICogcGNsa19tdWx0KSAvIDB4MDAwMDA0MDApICogZGl2aWRlcikvCi0JCQkJMHgwMDAwMDQwMCk7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCB2YjY4MDFfZ2V0X3ByZXZfbGluZXNfcGYodm9pZCkKLXsKLQlpZiAodmI2ODAxX2N0cmwtPnByZXZfcmVzID09IFFUUl9TSVpFKQotCQlyZXR1cm4gdmI2ODAxX2N0cmwtPnNfZHluYW1pY19wYXJhbXMucHJldmlld19saW5lc1BlckZyYW1lOwotCWVsc2UKLQkJcmV0dXJuIHZiNjgwMV9jdHJsLT5zX2R5bmFtaWNfcGFyYW1zLnNuYXBzaG90X2xpbmVzUGVyRnJhbWU7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCB2YjY4MDFfZ2V0X3ByZXZfcGl4ZWxzX3BsKHZvaWQpCi17Ci0JaWYgKHZiNjgwMV9jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkKLQkJcmV0dXJuIHZiNjgwMV9jdHJsLT5zX2R5bmFtaWNfcGFyYW1zLnByZXZpZXdfcGl4ZWxzUGVyTGluZTsKLQllbHNlCi0JCXJldHVybiB2YjY4MDFfY3RybC0+c19keW5hbWljX3BhcmFtcy5zbmFwc2hvdF9waXhlbHNQZXJMaW5lOwotfQotCi1zdGF0aWMgdWludDE2X3QgdmI2ODAxX2dldF9waWN0X2xpbmVzX3BmKHZvaWQpCi17Ci0JcmV0dXJuIHZiNjgwMV9jdHJsLT5zX2R5bmFtaWNfcGFyYW1zLnNuYXBzaG90X2xpbmVzUGVyRnJhbWU7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCB2YjY4MDFfZ2V0X3BpY3RfcGl4ZWxzX3BsKHZvaWQpCi17Ci0JcmV0dXJuIHZiNjgwMV9jdHJsLT5zX2R5bmFtaWNfcGFyYW1zLnNuYXBzaG90X3BpeGVsc1BlckxpbmU7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCB2YjY4MDFfZ2V0X3BpY3RfbWF4X2V4cF9sYyh2b2lkKQotewotCXVpbnQxNl90IHNuYXBzaG90X2xpbmVzX3Blcl9mcmFtZTsKLQotCWlmICh2YjY4MDFfY3RybC0+cGljdF9yZXMgPT0gUVRSX1NJWkUpIHsKLQkJc25hcHNob3RfbGluZXNfcGVyX2ZyYW1lID0KLQkJICAgIHZiNjgwMV9jdHJsLT5zX2R5bmFtaWNfcGFyYW1zLnByZXZpZXdfbGluZXNQZXJGcmFtZSAtIDM7Ci0JfSBlbHNlIHsKLQkJc25hcHNob3RfbGluZXNfcGVyX2ZyYW1lID0KLQkJICAgIHZiNjgwMV9jdHJsLT5zX2R5bmFtaWNfcGFyYW1zLnNuYXBzaG90X2xpbmVzUGVyRnJhbWUgLSAzOwotCX0KLQotCXJldHVybiBzbmFwc2hvdF9saW5lc19wZXJfZnJhbWU7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHZiNjgwMV9zZXRfZnBzKHN0cnVjdCBmcHNfY2ZnICpmcHMpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQkvKiBpbnB1dCBpcyBuZXcgZnBzIGluIFE4IGZvcm1hdCAqLwotCXN3aXRjaCAoZnBzLT5mcHNfZGl2KSB7Ci0JY2FzZSA3NjgwOgkJLyogMzAgKiBROCAqLwotCQl2YjY4MDFfY3RybC0+ZmFjdG9yX2ZwcyA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSAzODQwOgkJLyogMTUgKiBROCAqLwotCQl2YjY4MDFfY3RybC0+ZmFjdG9yX2ZwcyA9IDI7Ci0JCWJyZWFrOwotCi0JY2FzZSAyNTYwOgkJLyogMTAgKiBROCAqLwotCQl2YjY4MDFfY3RybC0+ZmFjdG9yX2ZwcyA9IDM7Ci0JCWJyZWFrOwotCi0JY2FzZSAxOTIwOgkJLyogNy41ICogUTggKi8KLQkJdmI2ODAxX2N0cmwtPmZhY3Rvcl9mcHMgPSA0OwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVOT0RFVjsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCB2YjY4MDFfd3JpdGVfZXhwX2dhaW4odWludDE2X3QgZ2FpbiwgdWludDMyX3QgbGluZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1aW50MTZfdCBscGY7Ci0KLQlpZiAodmI2ODAxX2N0cmwtPmN1cnJfcmVzID09IFNFTlNPUl9GVUxMX1NJWkUpCi0JCWxwZiA9IFZCNjgwMV9MSU5FU19QRVJfRlJBTUVfU05BUFNIT1Q7Ci0JZWxzZQotCQlscGYgPSBWQjY4MDFfTElORVNfUEVSX0ZSQU1FX1BSRVZJRVc7Ci0KLQkvKiBob2xkICovCi0JcmMgPSB2YjY4MDFfaTJjX3dyaXRlX3coUkVHX0hPTEQsIEhPTEQpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZXhwX2dhaW5fZG9uZTsKLQotCWlmICgodmI2ODAxX2N0cmwtPmN1cnJfZnBzIDwKLQkgICAgIHZiNjgwMV9jdHJsLT5tYXhfZnBzIC8gdmI2ODAxX2N0cmwtPmZhY3Rvcl9mcHMpICYmCi0JICAgICghdmI2ODAxX2N0cmwtPnBpY3RfZXhwX3VwZGF0ZSkpIHsKLQotCQlpZiAodmI2ODAxX2N0cmwtPnJlZHVjZWwpIHsKLQotCQkJcmMgPSB2YjY4MDFfaTJjX3dyaXRlX3coUkVHX1ZUX0ZSQU1FX0xFTkdUSF9MSU5FUywKLQkJCQkJCWxwZiAqIHZiNjgwMV9jdHJsLT5mYWN0b3JfZnBzKTsKLQotCQkJdmI2ODAxX2N0cmwtPmN1cnJfZnBzID0KLQkJCSAgICB2YjY4MDFfY3RybC0+bWF4X2ZwcyAvIHZiNjgwMV9jdHJsLT5mYWN0b3JfZnBzOwotCi0JCX0gZWxzZSBpZiAoIXZiNjgwMV9jdHJsLT5yZWR1Y2VsKSB7Ci0KLQkJCXJjID0gdmI2ODAxX2kyY193cml0ZV93KFJFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRSwKLQkJCQkJCWxpbmUgKiB2YjY4MDFfY3RybC0+ZmFjdG9yX2Zwcyk7Ci0KLQkJCXZiNjgwMV9jdHJsLT5yZWR1Y2VsID0gMTsKLQkJfQotCX0gZWxzZSBpZiAoKHZiNjgwMV9jdHJsLT5jdXJyX2ZwcyA+Ci0JCSAgICB2YjY4MDFfY3RybC0+bWF4X2ZwcyAvIHZiNjgwMV9jdHJsLT5mYWN0b3JfZnBzKSAmJgotCQkgICAoIXZiNjgwMV9jdHJsLT5waWN0X2V4cF91cGRhdGUpKSB7Ci0KLQkJcmMgPSB2YjY4MDFfaTJjX3dyaXRlX3coUkVHX1ZUX0ZSQU1FX0xFTkdUSF9MSU5FUywKLQkJCQkJbHBmICogdmI2ODAxX2N0cmwtPmZhY3Rvcl9mcHMpOwotCi0JCXZiNjgwMV9jdHJsLT5jdXJyX2ZwcyA9Ci0JCSAgICB2YjY4MDFfY3RybC0+bWF4X2ZwcyAvIHZiNjgwMV9jdHJsLT5mYWN0b3JfZnBzOwotCi0JfSBlbHNlIHsKLQkJLyogYW5hbG9ndWVfZ2Fpbl9jb2RlX2dsb2JhbCAqLwotCQlyYyA9IHZiNjgwMV9pMmNfd3JpdGVfdyhSRUdfQU5BTE9HVUVfR0FJTl9DT0RFX0dMT0JBTCwgZ2Fpbik7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGV4cF9nYWluX2RvbmU7Ci0KLQkJLyogY29hcnNlX2ludGVncmF0aW9uX3RpbWUgKi8KLQkJcmMgPSB2YjY4MDFfaTJjX3dyaXRlX3coUkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FLAotCQkJCQlsaW5lICogdmI2ODAxX2N0cmwtPmZhY3Rvcl9mcHMpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBleHBfZ2Fpbl9kb25lOwotCi0JCXZiNjgwMV9jdHJsLT5waWN0X2V4cF91cGRhdGUgPSAxOwotCX0KLQotCXJjID0gdmI2ODAxX2kyY193cml0ZV93KFJFR19IT0xELCBSRUxFQVNFX0hPTEQpOwotCi1leHBfZ2Fpbl9kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgdmI2ODAxX3NldF9waWN0X2V4cF9nYWluKHVpbnQxNl90IGdhaW4sIHVpbnQzMl90IGxpbmUpCi17Ci0JdmI2ODAxX2N0cmwtPnBpY3RfZXhwX3VwZGF0ZSA9IDE7Ci0JcmV0dXJuIHZiNjgwMV93cml0ZV9leHBfZ2FpbihnYWluLCBsaW5lKTsKLX0KLQotc3RhdGljIGludDMyX3QgdmI2ODAxX3Bvd2VyX2Rvd24odm9pZCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlyYyA9IHZiNjgwMV9pMmNfd3JpdGVfYihSRUdfTlZNX1BETiwgMCk7Ci0KLQltZGVsYXkoNSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCB2YjY4MDFfZ29fdG9fcG9zaXRpb24odWludDMyX3QgdGFyZ2V0X3ZjbV9kYWNfY29kZSwKLQkJCQkgICAgIHN0cnVjdCB2YjY4MDFfc2Vuc29yX2luZm8gKnBzKQotewotCS8qIFByaW9yIHRvIHJ1bm5pbmcgdGhpcyBmdW5jdGlvbiB0aGUgZm9sbG93aW5nIHZhbHVlcyBtdXN0Ci0JICogYmUgaW5pdGlhbGlzZWQgaW4gdGhlIHNlbnNvciBkYXRhIHN0cnVjdHVyZSwgUFMKLQkgKiBwcy0+dmNtX2RhY19jb2RlCi0JICogcHMtPnZjbV9tYXhfZGFjX2NvZGVfc3RlcAotCSAqIHBzLT52Y21fZGFjX2NvZGVfc3BhY2luZ19tcyAqLwotCi0JaW50MzJfdCByYyA9IDA7Ci0KLQlwcy0+dmNtX2RhY19jb2RlID0gdGFyZ2V0X3ZjbV9kYWNfY29kZTsKLQotCS8qIFJlc3RvcmUgU3Ryb2JlIHRvIHplcm8gc3RhdGUgKi8KLQlyYyA9IHZiNjgwMV9pMmNfd3JpdGVfYihSRUdfVkNNX0RBQ19TVFJPQkUsIDB4MDApOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCS8qIFdyaXRlIDktYml0IFZDTSBEQUMgQ29kZSAqLwotCXJjID0gdmI2ODAxX2kyY193cml0ZV93KFJFR19WQ01fREFDX0NPREUsIHBzLT52Y21fZGFjX2NvZGUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCS8qIEdlbmVyYXRlIGEgcmlzaW5nIGVkZ2Ugb24gdGhlIGRhY19zdHJvYmUgdG8gbGF0Y2gKLQkgKiBuZXcgREFDIHZhbHVlICovCi0KLQlyYyA9IHZiNjgwMV9pMmNfd3JpdGVfdyhSRUdfVkNNX0RBQ19TVFJPQkUsIDB4MDEpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCB2YjY4MDFfbW92ZV9mb2N1cyhpbnQgZGlyZWN0aW9uLCBpbnQzMl90IG51bV9zdGVwcykKLXsKLQlpbnQxNl90IHN0ZXBfZGlyZWN0aW9uOwotCWludDE2X3QgYWN0dWFsX3N0ZXA7Ci0JaW50MTZfdCBuZXh0X3Bvc2l0aW9uOwotCXVpbnQzMl90IHN0ZXBfc2l6ZTsKLQlpbnQxNl90IHNtYWxsX21vdmVbNF07Ci0JdWludDE2X3QgaTsKLQlpbnQzMl90IHJjID0gMDsKLQotCXN0ZXBfc2l6ZSA9ICh2YjY4MDFfY3RybC0+c19pbmZvLnZjbV9kYWNfY29kZV9tYWNyb191cCAtCi0JCSAgICAgdmI2ODAxX2N0cmwtPnNfaW5mby52Y21fZGFjX2NvZGVfaW5maW5pdHlfZG4pIC8KLQkgICAgVkI2ODAxX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSOwotCi0JaWYgKG51bV9zdGVwcyA+IFZCNjgwMV9UT1RBTF9TVEVQU19ORUFSX1RPX0ZBUikKLQkJbnVtX3N0ZXBzID0gVkI2ODAxX1RPVEFMX1NURVBTX05FQVJfVE9fRkFSOwotCWVsc2UgaWYgKG51bV9zdGVwcyA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChkaXJlY3Rpb24gPT0gTU9WRV9ORUFSKQotCQlzdGVwX2RpcmVjdGlvbiA9IDQ7Ci0JZWxzZSBpZiAoZGlyZWN0aW9uID09IE1PVkVfRkFSKQotCQlzdGVwX2RpcmVjdGlvbiA9IC00OwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBuZWVkIHRvIGRlY2lkZSBhYm91dCBkZWZhdWx0IHBvc2l0aW9uIGFuZCBwb3dlciBzdXBwbGllZAotCSAqIGF0IHN0YXJ0IHVwIGFuZCByZXNldCAqLwotCWlmICh2YjY4MDFfY3RybC0+Y3Vycl9sZW5zX3BvcyA8IHZiNjgwMV9jdHJsLT5pbml0X2N1cnJfbGVuc19wb3MpCi0JCXZiNjgwMV9jdHJsLT5jdXJyX2xlbnNfcG9zID0gdmI2ODAxX2N0cmwtPmluaXRfY3Vycl9sZW5zX3BvczsKLQotCWFjdHVhbF9zdGVwID0gKHN0ZXBfZGlyZWN0aW9uICogbnVtX3N0ZXBzKTsKLQotCW5leHRfcG9zaXRpb24gPSB2YjY4MDFfY3RybC0+Y3Vycl9sZW5zX3BvczsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJaWYgKGFjdHVhbF9zdGVwID49IDApCi0JCQlzbWFsbF9tb3ZlW2ldID0KLQkJCSAgICAoaSArIDEpICogYWN0dWFsX3N0ZXAgLyA0IC0gaSAqIGFjdHVhbF9zdGVwIC8gNDsKLQotCQlpZiAoYWN0dWFsX3N0ZXAgPCAwKQotCQkJc21hbGxfbW92ZVtpXSA9Ci0JCQkgICAgKGkgKyAxKSAqIGFjdHVhbF9zdGVwIC8gNCAtIGkgKiBhY3R1YWxfc3RlcCAvIDQ7Ci0JfQotCi0JaWYgKG5leHRfcG9zaXRpb24gPiA1MTEpCi0JCW5leHRfcG9zaXRpb24gPSA1MTE7Ci0JZWxzZSBpZiAobmV4dF9wb3NpdGlvbiA8IDApCi0JCW5leHRfcG9zaXRpb24gPSAwOwotCi0JLyogZm9yIGRhbXBpbmcgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCW5leHRfcG9zaXRpb24gPQotCQkgICAgKGludDE2X3QpICh2YjY4MDFfY3RybC0+Y3Vycl9sZW5zX3BvcyArIHNtYWxsX21vdmVbaV0pOwotCi0JCS8qIFdyaXRpbmcgdGhlIGRpZ2l0YWwgY29kZSBmb3IgY3VycmVudCB0byB0aGUgYWN0dWF0b3IgKi8KLQkJQ0RCRygibmV4dF9wb3NpdGlvbiBpbiBkYW1waW5nIG1vZGUgPSAlZFxuIiwgbmV4dF9wb3NpdGlvbik7Ci0KLQkJcmMgPSB2YjY4MDFfZ29fdG9fcG9zaXRpb24obmV4dF9wb3NpdGlvbiwgJnZiNjgwMV9jdHJsLT5zX2luZm8pOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlDREJHKCJnb190b19wb3NpdGlvbiBGYWlsZWQhISFcbiIpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0KLQkJdmI2ODAxX2N0cmwtPmN1cnJfbGVuc19wb3MgPSBuZXh0X3Bvc2l0aW9uOwotCQlpZiAoaSA8IDMpCi0JCQltZGVsYXkoNSk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHZiNjgwMV9yZWFkX252bV9kYXRhKHN0cnVjdCB2YjY4MDFfc2Vuc29yX2luZm8gKnBzKQotewotCS8qICstLS0tLS0tLSstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKwotCSAqIHwgSW5kZXggfCBOVk0gfCBOVk0gfCBOYW1lIHwgRGVzY3JpcHRpb24gfAotCSAqIHwgfCBBZGRyIHwgQnl0ZSB8IHwgfAotCSAqICstLS0tLS0tLSstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKwotCSAqIHwgMHgzNjAwIHwgMCB8IDMgfCBudm1fdDFfYWRkcl8wMCB8IHtQRlsyOjBdOkRheVs0OjBdfSB8Ci0JICogfCAweDM2MDEgfCAwIHwgMiB8IG52bV90MV9hZGRyXzAxIHwge01vbnRoWzM6MF06WWVhclszOjBdfSB8Ci0JICogfCAweDM2MDIgfCAwIHwgMSB8IG52bV90MV9hZGRyXzAyIHwgVGVzdGVyWzc6MF0gfAotCSAqIHwgMHgzNjAzIHwgMCB8IDAgfCBudm1fdDFfYWRkcl8wMyB8IFBhcnRbMTU6OF0gfAotCSAqICstLS0tLS0tLSstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKwotCSAqIHwgMHgzNjA0IHwgMSB8IDMgfCBudm1fdDFfYWRkcl8wNCB8IFBhcnRbNzowXSB8Ci0JICogfCAweDM2MDUgfCAxIHwgMiB8IG52bV90MV9hZGRyXzA1IHwgU3RhcnRXUE1bNzowXSB8Ci0JICogfCAweDM2MDYgfCAxIHwgMSB8IG52bV90MV9hZGRyXzA2IHwgSW5maW5pdHlbNzowXSB8Ci0JICogfCAweDM2MDcgfCAxIHwgMCB8IG52bV90MV9hZGRyXzA3IHwgTWFjcm9bNzowXSB8Ci0JICogKy0tLS0tLS0tKy0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rCi0JICogfCAweDM2MDggfCAyIHwgMyB8IG52bV90MV9hZGRyXzA4IHwgUmVzZXJ2ZWQgfAotCSAqIHwgMHgzNjA5IHwgMiB8IDIgfCBudm1fdDFfYWRkcl8wOSB8IFJlc2VydmVkIHwKLQkgKiB8IDB4MzYwQSB8IDIgfCAxIHwgbnZtX3QxX2FkZHJfMEEgfCBVcERvd25bNzowXSB8Ci0JICogfCAweDM2MEIgfCAyIHwgMCB8IG52bV90MV9hZGRyXzBCIHwgUmVzZXJ2ZWQgfAotCSAqICstLS0tLS0tLSstLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKwotCSAqIHwgMHgzNjBDIHwgMyB8IDMgfCBudm1fdDFfYWRkcl8wQyB8IFJlc2VydmVkIHwKLQkgKiB8IDB4MzYwRCB8IDMgfCAyIHwgbnZtX3QxX2FkZHJfMEQgfCBSZXNlcnZlZCB8Ci0JICogfCAweDM2MEUgfCAzIHwgMSB8IG52bV90MV9hZGRyXzBFIHwgUmVzZXJ2ZWQgfAotCSAqIHwgMHgzNjBGIHwgMyB8IDAgfCBudm1fdDFfYWRkcl8wRiB8IFJlc2VydmVkIHwKLQkgKiArLS0tLS0tLS0rLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKLQkgKiB8IDB4MzYxMCB8IDQgfCAzIHwgbnZtX3QxX2FkZHJfMTAgfCBSZXNlcnZlZCB8Ci0JICogfCAweDM2MTEgfCA0IHwgMiB8IG52bV90MV9hZGRyXzExIHwgUmVzZXJ2ZWQgfAotCSAqIHwgMHgzNjEyIHwgNCB8IDEgfCBudm1fdDFfYWRkcl8xMiB8IFJlc2VydmVkIHwKLQkgKiB8IDB4MzYxMyB8IDQgfCAwIHwgbnZtX3QxX2FkZHJfMTMgfCBSZXNlcnZlZCB8Ci0JICogKy0tLS0tLS0tKy0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rKi8KLQotCWludDMyX3QgcmM7Ci0Jc3RydWN0IHZiNjgwMV9pMmNfcmVnX2NvbmZfdCBycmVnW10gPSB7Ci0JCXtSRUdfTlZNX1QxX0FERFJfMDAsIDAsIDAsIERfTEVOX0JZVEV9LAotCQl7UkVHX05WTV9UMV9BRERSXzAxLCAwLCAwLCBEX0xFTl9CWVRFfSwKLQkJe1JFR19OVk1fVDFfQUREUl8wMiwgMCwgMCwgRF9MRU5fQllURX0sCi0JCXtSRUdfTlZNX1QxX0FERFJfMDMsIDAsIDAsIERfTEVOX0JZVEV9LAotCQl7UkVHX05WTV9UMV9BRERSXzA0LCAwLCAwLCBEX0xFTl9CWVRFfSwKLQkJe1JFR19OVk1fVDFfQUREUl8wNSwgMCwgMCwgRF9MRU5fQllURX0sCi0JCXtSRUdfTlZNX1QxX0FERFJfMDYsIDAsIDAsIERfTEVOX0JZVEV9LAotCQl7UkVHX05WTV9UMV9BRERSXzA3LCAwLCAwLCBEX0xFTl9CWVRFfSwKLQkJe1JFR19OVk1fVDFfQUREUl8wOCwgMCwgMCwgRF9MRU5fQllURX0sCi0JCXtSRUdfTlZNX1QxX0FERFJfMDksIDAsIDAsIERfTEVOX0JZVEV9LAotCQl7UkVHX05WTV9UMV9BRERSXzBBLCAwLCAwLCBEX0xFTl9CWVRFfSwKLQkJe1JFR19OVk1fVDFfQUREUl8wQiwgMCwgMCwgRF9MRU5fQllURX0sCi0JCXtSRUdfTlZNX1QxX0FERFJfMEMsIDAsIDAsIERfTEVOX0JZVEV9LAotCQl7UkVHX05WTV9UMV9BRERSXzBELCAwLCAwLCBEX0xFTl9CWVRFfSwKLQkJe1JFR19OVk1fVDFfQUREUl8wRSwgMCwgMCwgRF9MRU5fQllURX0sCi0JCXtSRUdfTlZNX1QxX0FERFJfMEYsIDAsIDAsIERfTEVOX0JZVEV9LAotCQl7UkVHX05WTV9UMV9BRERSXzEwLCAwLCAwLCBEX0xFTl9CWVRFfSwKLQkJe1JFR19OVk1fVDFfQUREUl8xMSwgMCwgMCwgRF9MRU5fQllURX0sCi0JCXtSRUdfTlZNX1QxX0FERFJfMTIsIDAsIDAsIERfTEVOX0JZVEV9LAotCQl7UkVHX05WTV9UMV9BRERSXzEzLCAwLCAwLCBEX0xFTl9CWVRFfSwKLQl9OwotCi0Jc3RydWN0IHZiNjgwMV9pMmNfcmVnX2NvbmZfdCB3cmVnW10gPSB7Ci0JCS8qIEVuYWJsZSBOVk0gZm9yIERpcmVjdCBSZWFkaW5nICovCi0JCXtSRUdfTlZNX0NUUkwsIDAsIDIsIERfTEVOX0JZVEV9LAotCi0JCS8qIFBvd2VyIHVwIE5WTSAqLwotCQl7UkVHX05WTV9QRE4sIDAsIDEsIERfTEVOX0JZVEV9LAotCX07Ci0KLQlyYyA9IHZiNjgwMV9pMmNfd3JpdGVfdGFibGUod3JlZywgQVJSQVlfU0laRSh3cmVnKSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJJMkMgV3JpdGUgVGFibGUgRkFJTEVEISEhXG4iKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIE5WTSBSZWFkIFB1bHNlIFdpZHRoCi0JICogPT09PT09PT09PT09PT09PT09PT0KLQkgKiBudm1fcHVsc2Vfd2lkdGhfdXMgPSBudm1fcHVsc2Vfd2lkdGhfZXh0X2NsayAvIGV4dF9jbGtfZnJlcV9taHoKLQkgKiBWYWxpZCBSYW5nZSBmb3IgUmVhZCBQdWxzZSBXaWR0aCA9IDQwMG5zIC0+IDMuMHVzCi0JICogTWluIGV4dF9jbGtfZnJlcV9taHogPSA2TUh6ICA9PiAzLjAgKiAgNiAgPSAxOAotCSAqIE1heCBleHRfY2xrX2ZyZXFfbWh6ID0gMjdNSHogPT4gMC40ICogMjcgPSAxMC44Ci0JICogQ2hvb3NlIDE1IGFzIGEgY29tbW9uIHZhbHVlCi0JICogIC0gMTUgLyAgNi4wID0gMi41MDAwdXMKLQkgKiAgLSAxNSAvIDEyLjAgPSAxLjI1MDB1cwotCSAqICAtIDE1IC8gMjcuMCA9IDAuNTU1NXVzICovCi0JcmMgPSB2YjY4MDFfaTJjX3dyaXRlX3coUkVHX05WTV9QVUxTRV9XSURUSCwgMTUpOwotCWlmIChyYyA8IDApIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gbnZfc2h1dGRvd247Ci0JfQotCi0JcmMgPSB2YjY4MDFfaTJjX3JlYWRfdGFibGUocnJlZywgQVJSQVlfU0laRShycmVnKSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJJMkMgUmVhZCBUYWJsZSBGQUlMRUQhISFcbiIpOwotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBudl9zaHV0ZG93bjsKLQl9Ci0KLQkvKiBEZWNvZGUgYW5kIFNhdmUgRk1UIEluZm8gKi8KLQlwcy0+cGFzc19mYWlsID0gKHJyZWdbMF0uYmRhdGEgJiAweDAwRTApID4+IDU7Ci0JcHMtPmRheSA9IChycmVnWzBdLmJkYXRhICYgMHgwMDFGKTsKLQlwcy0+bW9udGggPSAocnJlZ1sxXS5iZGF0YSAmIDB4MDBGMCkgPj4gNDsKLQlwcy0+eWVhciA9IChycmVnWzFdLmJkYXRhICYgMHgwMDBGKSArIDIwMDA7Ci0JcHMtPnRlc3RlciA9IHJyZWdbMl0uYmRhdGE7Ci0JcHMtPnBhcnRfbnVtYmVyID0gKHJyZWdbM10uYmRhdGEgPDwgOCkgKyBycmVnWzRdLmJkYXRhOwotCi0JLyogRGVjb2RlIGFuZCBTYXZlIFZDTSBEYWMgVmFsdWVzIGluIGRhdGEgc3RydWN0dXJlICovCi0JcHMtPnZjbV9kYWNfY29kZV9pbmZpbml0eV9kbiA9IHJyZWdbNl0uYmRhdGE7Ci0JcHMtPnZjbV9kYWNfY29kZV9tYWNyb191cCA9IHJyZWdbN10uYmRhdGEgPDwgMTsKLQlwcy0+dmNtX2RhY19jb2RlX3VwX2RuX2RlbHRhID0gcnJlZ1sxMF0uYmRhdGE7Ci0KLW52X3NodXRkb3duOgotCS8qIFBvd2VyIERvd24gTlZNIHRvIGV4dGVuZCBsaWZlIHRpbWUgKi8KLQlyYyA9IHZiNjgwMV9pMmNfd3JpdGVfYihSRUdfTlZNX1BETiwgMCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgdmI2ODAxX2NvbmZpZ19zZW5zb3IoaW50MzJfdCBleHRfY2xrX2ZyZXFfbWh6LAotCQkJCWludDMyX3QgdGFyZ2V0X2ZyYW1lX3JhdGVfZnBzLAotCQkJCWludDMyX3QgdGFyZ2V0X3Z0X3BpeF9jbGtfZnJlcV9taHosCi0JCQkJdWludDMyX3Qgc3ViX3NhbXBsaW5nX2ZhY3RvciwKLQkJCQl1aW50MzJfdCBhbmFsb2dfYmlubmluZ19hbGxvd2VkLAotCQkJCXVpbnQzMl90IHJhd19tb2RlLCBpbnQgY2FwdHVyZV9tb2RlLAotCQkJCWVudW0gdmI2ODAxX3Jlc29sdXRpb25fdCByZXMpCi17Ci0JdWludDMyX3QgcmM7Ci0JLyogZXh0X2Nsa19mcmVxX21oeiAgICAgID0gNi4wIC0+IDI3LjAgTUh6Ci0JICogdGFyZ2V0X2ZyYW1lX3JhdGVfZnBzICA9IDE1IGZwcwotCSAqIHRhcmdldF92dF9waXhfY2xrX2ZyZXFfbWh6ID0gMjQuMCAtPiA2NC4wTUh6Ci0JICogc3ViX3NhbXBsaW5nIGZhY3RvciAgID0gMSwgMiwgMywgb3IgNAotCSAqIHJhd19tb2RlIGZhY3RvciAgICAgICA9IDEwCi0JICoKLQkgKiBjYXB0dXJlX21vZGUsIDAgPSBDQ1AxCi0JICogY2FwdHVyZV9tb2RlLCAxID0gQ0NQMgotCSAqIGNhcHR1cmVfbW9kZSwgMiA9IDEwLWJpdCBwYXJhbGxlbCArIGhzeW5jICsgdnN5bmMgKi8KLQotCS8qIERlY2xhcmUgZGF0YSBmb3JtYXQgKi8KLQl1aW50MzJfdCBjY3AyX2RhdGFfZm9ybWF0ID0gMHgwQTBBOwotCi0JLyogIERlY2xhcmUgY2xvY2sgdHJlZSB2YXJpYWJsZXMgKi8KLQlpbnQzMl90IG1pbl9wbGxfaXBfZnJlcV9taHogPSA2OwotCWludDMyX3QgbWF4X3BsbF9vcF9mcmVxX21oeiA9IDY0MDsKLQl1aW50MzJfdCBwcmVfcGxsX2Nsa19kaXYgPSAxOwotCWludDMyX3QgcGxsX2lwX2ZyZXFfbWh6ID0gNjsKLQl1aW50MzJfdCBwbGxfbXVsdGlwbGllciA9IDEwMDsKLQlpbnQzMl90IHBsbF9vcF9mcmVxX21oeiA9IDYwMDsKLQl1aW50MzJfdCB2dF9zeXNfY2xrX2RpdiA9IDE7Ci0JaW50MzJfdCB2dF9zeXNfY2xrX2ZyZXFfbWh6ID0gNjAwOwotCXVpbnQzMl90IHZ0X3BpeF9jbGtfZGl2ID0gMTA7Ci0JaW50MzJfdCB2dF9waXhfY2xrX2ZyZXFfbWh6ID0gNjA7Ci0JdWludDMyX3Qgb3Bfc3lzX2Nsa19kaXYgPSAxOwotCWludDMyX3Qgb3Bfc3lzX2Nsa19mcmVxX21oeiA9IDYwOwotCXVpbnQzMl90IG9wX3BpeF9jbGtfZGl2ID0gMTA7Ci0JaW50MzJfdCBvcF9waXhfY2xrX2ZyZXFfbWh6ID0gNjA7Ci0KLQkvKiBEZWNsYXJlIHBpeGVsIGFycmF5IGFuZCBmcmFtZSB0aW1pbmcgdmFyaWFibGVzICovCi0JdWludDMyX3QgeF9waXhlbF9hcnJheSA9IDIwNjQ7Ci0JdWludDMyX3QgeV9waXhlbF9hcnJheSA9IDE1NDQ7Ci0JdWludDMyX3QgeF9ldmVuX2luYyA9IDE7Ci0JdWludDMyX3QgeF9vZGRfaW5jID0gMTsKLQl1aW50MzJfdCB5X2V2ZW5faW5jID0gMTsKLQl1aW50MzJfdCB5X29kZF9pbmMgPSAxOwotCXVpbnQzMl90IHhfb3V0cHV0X3NpemUgPSAyMDY0OwotCXVpbnQzMl90IHlfb3V0cHV0X3NpemUgPSAxNTQ0OwotCXVpbnQzMl90IGFkZGl0aW9uYWxfcm93cyA9IDI7Ci0JdWludDMyX3QgbWluX3Z0X2ZyYW1lX2JsYW5raW5nX2xpbmVzID0gMTY7Ci0JdWludDMyX3QgdnRfbGluZV9sZW5ndGhfcGNrID0gMjUwMDsKLQl1aW50MzJfdCB2dF9saW5lX2xlbmd0aF91cyA9IDA7Ci0JdWludDMyX3QgbWluX3Z0X2ZyYW1lX2xlbmd0aF9saW5lcyA9IDE1NjI7Ci0JdWludDMyX3QgdnRfZnJhbWVfbGVuZ3RoX2xpbmVzID0gMTYwMDsKLQl1aW50MzJfdCB0YXJnZXRfdnRfZnJhbWVfbGVuZ3RoX21zOwkvKiAyMDAgKiAweDAwMDEwMDAgLyAzOyAqLwotCXVpbnQzMl90IHZ0X2ZyYW1lX2xlbmd0aF9tczsJLyogMjAwICogMHgwMDAxMDAwIC8gMzsgKi8KLQl1aW50MzJfdCBmcmFtZV9yYXRlX2ZwcyA9IDE1OwotCi0JLyogQ29hcnNlIGludGVyZ3JhdGlvbiB0aW1lICovCi0JdWludDMyX3QgY29hcnNlX2ludGVncmF0aW9uX3RpbWUgPSAxNTk3OwotCXVpbnQzMl90IGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX21heF9tYXJnaW4gPSAzOwotCXVpbnQxNl90IGZyYW1lX2NvdW50OwotCWludCB0aW1lb3V0OwotCi0Jc3RydWN0IHZiNjgwMV9zZW5zb3JfaW5mbyAqcGluZm8gPSAmdmI2ODAxX2N0cmwtPnNfaW5mbzsKLQotCXN0cnVjdCB2YjY4MDFfaTJjX3JlZ19jb25mX3QgcnJlZ1tdID0gewotCQl7UkVHX1BSRV9QTExfQ0xLX0RJViwgMCwgMCwgRF9MRU5fV09SRH0sCi0JCXtSRUdfUExMX01VTFRJUExJRVIsIDAsIDAsIERfTEVOX1dPUkR9LAotCQl7UkVHX1ZUX1NZU19DTEtfRElWLCAwLCAwLCBEX0xFTl9XT1JEfSwKLQkJe1JFR19WVF9QSVhfQ0xLX0RJViwgMCwgMCwgRF9MRU5fV09SRH0sCi0JCXtSRUdfT1BfU1lTX0NMS19ESVYsIDAsIDAsIERfTEVOX1dPUkR9LAotCQl7UkVHX09QX1BJWF9DTEtfRElWLCAwLCAwLCBEX0xFTl9XT1JEfSwKLQkJe1JFR19GUkFNRV9DT1VOVCwgMCwgMCwgRF9MRU5fQllURX0sCi0JfTsKLQotCXN0cnVjdCB2YjY4MDFfaTJjX3JlZ19jb25mX3Qgd3JlZzJbXSA9IHsKLQkJe1JFR19QT1dFUl9NQU5fRU5BQkxFXzMsIDAsIDk1LCBEX0xFTl9CWVRFfSwKLQkJe1JFR19QT1dFUl9NQU5fRU5BQkxFXzQsIDAsIDE0MiwgRF9MRU5fQllURX0sCi0JCXtSRUdfUE9XRVJfTUFOX0VOQUJMRV81LCAwLCA3LCBEX0xFTl9CWVRFfSwKLQl9OwotCi0JLyogVklERU8gVElNSU5HIENBTENVTEFUSU9OUwotCSAqID09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotCS8qIFBpeGVsIEFycmF5IFNpemUgKi8KLQl4X3BpeGVsX2FycmF5ID0gMjA2NDsKLQl5X3BpeGVsX2FycmF5ID0gMTU0NDsKLQotCS8qIHNldCBjdXJyZW50IHJlc29sdXRpb24gKi8KLQl2YjY4MDFfY3RybC0+Y3Vycl9yZXMgPSByZXM7Ci0KLQkvKiBBbmFsb2d1ZSBiaW5uaW5nIHNldHVwICovCi0JaWYgKHBpbmZvLT5hbmFsb2dfYmlubmluZ19hbGxvd2VkID4gMCAmJgotCSAgICBwaW5mby0+c3ViX3NhbXBsaW5nX2ZhY3RvciA9PSA0KSB7Ci0KLQkJcGluZm8tPnZ0aW1pbmdfbWFqb3IgPSAxOwotCQlwaW5mby0+YW5hbG9nX3RpbWluZ19tb2Rlc180ID0gMzI7Ci0JfSBlbHNlIGlmIChwaW5mby0+YW5hbG9nX2Jpbm5pbmdfYWxsb3dlZCA+IDAgJiYKLQkJICAgcGluZm8tPnN1Yl9zYW1wbGluZ19mYWN0b3IgPT0gMikgewotCi0JCXBpbmZvLT52dGltaW5nX21ham9yID0gMTsKLQkJcGluZm8tPmFuYWxvZ190aW1pbmdfbW9kZXNfNCA9IDA7Ci0JfSBlbHNlIHsKLQotCQlwaW5mby0+dnRpbWluZ19tYWpvciA9IDA7Ci0JCXBpbmZvLT5hbmFsb2dfdGltaW5nX21vZGVzXzQgPSAwOwotCX0KLQotCS8qIFN1Yi1TYW1wbGluZyBYICYgWSBPZGQgSW5jcmVtZW50czogdmFsaWQgdmFsdWVzIDEsIDMsIDUsIDcgKi8KLQl4X2V2ZW5faW5jID0gMTsKLQl5X2V2ZW5faW5jID0gMTsKLQl4X29kZF9pbmMgPSAoc3ViX3NhbXBsaW5nX2ZhY3RvciA8PCAxKSAtIHhfZXZlbl9pbmM7Ci0JeV9vZGRfaW5jID0gKHN1Yl9zYW1wbGluZ19mYWN0b3IgPDwgMSkgLSB5X2V2ZW5faW5jOwotCi0JLyogT3V0cHV0IGltYWdlIHNpemUKLQkgKiBNdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDIgLSByb3VuZCBkb3duICovCi0JeF9vdXRwdXRfc2l6ZSA9ICgoeF9waXhlbF9hcnJheSAvIHN1Yl9zYW1wbGluZ19mYWN0b3IpID4+IDEpIDw8IDE7Ci0JeV9vdXRwdXRfc2l6ZSA9ICgoeV9waXhlbF9hcnJheSAvIHN1Yl9zYW1wbGluZ19mYWN0b3IpID4+IDEpIDw8IDE7Ci0KLQkvKiBPdXRwdXQgZGF0YSBmb3JtYXQgKi8KLQljY3AyX2RhdGFfZm9ybWF0ID0gKHJhd19tb2RlIDw8IDgpICsgcmF3X21vZGU7Ci0KLQkvKiBQcmUgUExMIGNsb2NrIGRpdmlkZXIgOiB2YWxpZCB2YWx1ZXMgMSwgMiBvciA0Ci0JICogVGhlIDFzdCBzdGVwIGlzIHRvIGVuc3VyZSB0aGF0IFBMTCBpbnB1dCBmcmVxdWVuY3kgaXMgYXMgY2xvc2UKLQkgKiBhcyBwb3NzaWJsZSB0byB0aGUgbWluIGFsbG93ZWQgUExMIGlucHV0IGZyZXF1ZW5jeS4KLQkgKiBUaGlzIHlpZWxkcyB0aGUgc21hbGxlc3Qgc3RlcCBzaXplIGluIHRoZSBQTEwgb3V0cHV0IGZyZXF1ZW5jeS4gKi8KLQlwcmVfcGxsX2Nsa19kaXYgPQotCSAgICAoKGludCkoZXh0X2Nsa19mcmVxX21oeiAvIG1pbl9wbGxfaXBfZnJlcV9taHopID4+IDEpIDw8IDE7Ci0JaWYgKHByZV9wbGxfY2xrX2RpdiA8IDIpCi0JCXByZV9wbGxfY2xrX2RpdiA9IDE7Ci0KLQlwbGxfaXBfZnJlcV9taHogPSBleHRfY2xrX2ZyZXFfbWh6IC8gcHJlX3BsbF9jbGtfZGl2OwotCi0JLyogVmlkZW8gVGltaW5nIFN5c3RlbSBDbG9jayBkaXZpZGVyOiB2YWxpZCB2YWx1ZXMgMSwgMiwgNAotCSAqIE5vdyBuZWVkIHRvIHdvcmsgYmFja3dhcmRzIHRocm91Z2ggdGhlIGNsb2NrIHRyZWUgdG8gZGV0ZXJtaW5lIHRoZQotCSAqIDFzdCBwYXNzIGVzdGltYXRlcyBmb3IgdnRfc3lzX2Nsa19mcmVxX21oeiBhbmQgdGhlbiB0aGUgUExMIG91dHB1dAotCSAqIGZyZXF1ZW5jeS4qLwotCXZ0X3N5c19jbGtfZnJlcV9taHogPSB2dF9waXhfY2xrX2RpdiAqIHRhcmdldF92dF9waXhfY2xrX2ZyZXFfbWh6OwotCXZ0X3N5c19jbGtfZGl2ID0gbWF4X3BsbF9vcF9mcmVxX21oeiAvIHZ0X3N5c19jbGtfZnJlcV9taHo7Ci0JaWYgKHZ0X3N5c19jbGtfZGl2IDwgMikKLQkJdnRfc3lzX2Nsa19kaXYgPSAxOwotCi0JLyogUExMIE11bGl0cGxpZXI6IG1pbiAsIG1heCAxMDYgKi8KLQlwbGxfb3BfZnJlcV9taHogPSB2dF9zeXNfY2xrX2RpdiAqIHZ0X3N5c19jbGtfZnJlcV9taHo7Ci0JcGxsX211bHRpcGxpZXIgPSAocGxsX29wX2ZyZXFfbWh6ICogMHgwMDAxMDAwKSAvIHBsbF9pcF9mcmVxX21oejsKLQotCS8qIENhbGN1bGF0ZSB0aGUgYWN1dGFsIHBsbCBvdXRwdXQgZnJlcXVlbmN5Ci0JICogLSB0aGUgcGxsX211bHRpcGxpZXIgY2FsY3VsYXRpb24gaW50cm9kdWNlcyBhIHF1YW50aXNhdGlvbiBlcnJvcgotCSAqICAgZHVlIHRoZSBpbnRlZ2VyIG5hdHVyZSBvZiB0aGUgcGxsIG11bHRpcGxpZXIgKi8KLQlwbGxfb3BfZnJlcV9taHogPSAocGxsX2lwX2ZyZXFfbWh6ICogcGxsX211bHRpcGxpZXIpIC8gMHgwMDAxMDAwOwotCi0JLyogUmUtY2FsY3VsYXRlIHZpZGVvIHRpbWluZyBjbG9jayBmcmVxdWVuY2llcyBiYXNlZAotCSAqIG9uIGFjdHVhbCBQTEwgZnJlcSAqLwotCXZ0X3N5c19jbGtfZnJlcV9taHogPSBwbGxfb3BfZnJlcV9taHogLyB2dF9zeXNfY2xrX2RpdjsKLQl2dF9waXhfY2xrX2ZyZXFfbWh6ID0gKCh2dF9zeXNfY2xrX2ZyZXFfbWh6ICogMHgwMDAxMDAwKSAvCi0JCQkJdnRfcGl4X2Nsa19kaXYpLzB4MDAwMTAwMDsKLQotCS8qIE91dHB1dCBTeXN0ZW0gQ2xvY2sgRGl2aWRlcjogdmFsaWQgdmFsdWUgMSwgMiwgNCwgNiwgOAotCSAqIG9wX3N5c19jbGtfZGl2ID0gdnRfc3lzX2Nsa19kaXY7Ki8KLQlvcF9zeXNfY2xrX2RpdiA9ICh2dF9zeXNfY2xrX2RpdiAqIHN1Yl9zYW1wbGluZ19mYWN0b3IpOwotCWlmIChvcF9zeXNfY2xrX2RpdiA8IDIpCi0JCW9wX3N5c19jbGtfZGl2ID0gMTsKLQotCS8qIENhbGN1bGF0ZSBvdXRwdXQgdGltaW5nIGNsb2NrIGZyZXF1ZW5jaWVzICovCi0Jb3Bfc3lzX2Nsa19mcmVxX21oeiA9IHBsbF9vcF9mcmVxX21oeiAvIG9wX3N5c19jbGtfZGl2OwotCW9wX3BpeF9jbGtfZnJlcV9taHogPQotCSAgICAob3Bfc3lzX2Nsa19mcmVxX21oeiAqIDB4MDAwMTAwMCkgLyAob3BfcGl4X2Nsa19kaXYgKiAweDAwMDEwMDApOwotCi0JLyogTGluZSBsZW5ndGggaW4gcGl4ZWxzIGFuZCB1cyAqLwotCXZ0X2xpbmVfbGVuZ3RoX3BjayA9IDI1MDA7Ci0JdnRfbGluZV9sZW5ndGhfdXMgPQotCSAgICB2dF9saW5lX2xlbmd0aF9wY2sgKiAweDAwMDEwMDAgLyB2dF9waXhfY2xrX2ZyZXFfbWh6OwotCi0JLyogVGFyZ2V0IHZ0X2ZyYW1lX2xlbmd0aF9tcyAqLwotCXRhcmdldF92dF9mcmFtZV9sZW5ndGhfbXMgPSAoMTAwMCAqIDB4MDAwMTAwMCAvIHRhcmdldF9mcmFtZV9yYXRlX2Zwcyk7Ci0KLQkvKiBGcmFtZSBsZW5ndGggaW4gbGluZXMgKi8KLQltaW5fdnRfZnJhbWVfbGVuZ3RoX2xpbmVzID0KLQkgICAgYWRkaXRpb25hbF9yb3dzICsgeV9vdXRwdXRfc2l6ZSArIG1pbl92dF9mcmFtZV9ibGFua2luZ19saW5lczsKLQotCXZ0X2ZyYW1lX2xlbmd0aF9saW5lcyA9Ci0JICAgICgoMTAwMCAqIHRhcmdldF92dF9mcmFtZV9sZW5ndGhfbXMpIC8gdnRfbGluZV9sZW5ndGhfdXMpOwotCi0JaWYgKHZ0X2ZyYW1lX2xlbmd0aF9saW5lcyA8PSBtaW5fdnRfZnJhbWVfbGVuZ3RoX2xpbmVzKQotCQl2dF9mcmFtZV9sZW5ndGhfbGluZXMgPSBtaW5fdnRfZnJhbWVfbGVuZ3RoX2xpbmVzOwotCi0JLyogQ2FsY3VhdGUgdGhlIGFjdHVhbCBmcmFtZSBsZW5ndGggaW4gbXMgKi8KLQl2dF9mcmFtZV9sZW5ndGhfbXMgPSAodnRfZnJhbWVfbGVuZ3RoX2xpbmVzICogdnRfbGluZV9sZW5ndGhfdXMgLyAxMDAwKTsKLQotCS8qIEZyYW1lIFJhdGUgaW4gZnBzICovCi0JZnJhbWVfcmF0ZV9mcHMgPSAoMTAwMCAqIDB4MDAwMTAwMCAvIHZ0X2ZyYW1lX2xlbmd0aF9tcyk7Ci0KLQkvKiBTZXQgY29hcnNlIGludGVncmF0aW9uIHRvIG1heCAqLwotCWNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lID0KLQkgICAgdnRfZnJhbWVfbGVuZ3RoX2xpbmVzIC0gY29hcnNlX2ludGVncmF0aW9uX3RpbWVfbWF4X21hcmdpbjsKLQotCUNEQkcoIlNFTlNPUiBWSURFTyBUSU1JTkcgU1VNTUFSWTpcbiIpOwotCUNEQkcoIiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKLQlDREJHKCJleHRfY2xrX2ZyZXFfbWh6ICAgICAgPSAlZFxuIiwgZXh0X2Nsa19mcmVxX21oeik7Ci0JQ0RCRygicHJlX3BsbF9jbGtfZGl2ICAgICAgID0gJWRcbiIsIHByZV9wbGxfY2xrX2Rpdik7Ci0JQ0RCRygicGxsX2lwX2ZyZXFfbWh6ICAgICAgID0gJWRcbiIsIHBsbF9pcF9mcmVxX21oeik7Ci0JQ0RCRygicGxsX211bHRpcGxpZXIgICAgICAgID0gJWRcbiIsIHBsbF9tdWx0aXBsaWVyKTsKLQlDREJHKCJwbGxfb3BfZnJlcV9taHogICAgICAgPSAlZFxuIiwgcGxsX29wX2ZyZXFfbWh6KTsKLQlDREJHKCJ2dF9zeXNfY2xrX2RpdiAgICAgICAgPSAlZFxuIiwgdnRfc3lzX2Nsa19kaXYpOwotCUNEQkcoInZ0X3N5c19jbGtfZnJlcV9taHogICA9ICVkXG4iLCB2dF9zeXNfY2xrX2ZyZXFfbWh6KTsKLQlDREJHKCJ2dF9waXhfY2xrX2RpdiAgICAgICAgPSAlZFxuIiwgdnRfcGl4X2Nsa19kaXYpOwotCUNEQkcoInZ0X3BpeF9jbGtfZnJlcV9taHogICA9ICVkXG4iLCB2dF9waXhfY2xrX2ZyZXFfbWh6KTsKLQlDREJHKCJvcF9zeXNfY2xrX2RpdiAgICAgICAgPSAlZFxuIiwgb3Bfc3lzX2Nsa19kaXYpOwotCUNEQkcoIm9wX3N5c19jbGtfZnJlcV9taHogICA9ICVkXG4iLCBvcF9zeXNfY2xrX2ZyZXFfbWh6KTsKLQlDREJHKCJvcF9waXhfY2xrX2RpdiAgICAgICAgPSAlZFxuIiwgb3BfcGl4X2Nsa19kaXYpOwotCUNEQkcoIm9wX3BpeF9jbGtfZnJlcV9taHogICA9ICVkXG4iLCBvcF9waXhfY2xrX2ZyZXFfbWh6KTsKLQlDREJHKCJ2dF9saW5lX2xlbmd0aF9wY2sgICAgPSAlZFxuIiwgdnRfbGluZV9sZW5ndGhfcGNrKTsKLQlDREJHKCJ2dF9saW5lX2xlbmd0aF91cyAgICAgPSAlZFxuIiwgdnRfbGluZV9sZW5ndGhfdXMvMHgwMDAxMDAwKTsKLQlDREJHKCJ2dF9mcmFtZV9sZW5ndGhfbGluZXMgPSAlZFxuIiwgdnRfZnJhbWVfbGVuZ3RoX2xpbmVzKTsKLQlDREJHKCJ2dF9mcmFtZV9sZW5ndGhfbXMgICAgPSAlZFxuIiwgdnRfZnJhbWVfbGVuZ3RoX21zLzB4MDAwMTAwMCk7Ci0JQ0RCRygiZnJhbWVfcmF0ZV9mcHMgICAgICAgID0gJWRcbiIsIGZyYW1lX3JhdGVfZnBzKTsKLQlDREJHKCJjY3AyX2RhdGFfZm9ybWF0ID0gJWRcbiIsIGNjcDJfZGF0YV9mb3JtYXQpOwotCUNEQkcoInhfb3V0cHV0X3NpemUgPSAlZFxuIiwgeF9vdXRwdXRfc2l6ZSk7Ci0JQ0RCRygieV9vdXRwdXRfc2l6ZSA9ICVkXG4iLCB5X291dHB1dF9zaXplKTsKLQlDREJHKCJ4X29kZF9pbmMgPSAlZFxuIiwgeF9vZGRfaW5jKTsKLQlDREJHKCJ5X29kZF9pbmMgPSAlZFxuIiwgeV9vZGRfaW5jKTsKLQlDREJHKCIodnRfZnJhbWVfbGVuZ3RoX2xpbmVzICogZnJhbWVfcmF0ZV9mYWN0b3IgKSA9ICVkXG4iLAotCSAgICAodnRfZnJhbWVfbGVuZ3RoX2xpbmVzICogdmI2ODAxX2N0cmwtPmZhY3Rvcl9mcHMpKTsKLQlDREJHKCJjb2Fyc2VfaW50ZWdyYXRpb25fdGltZSA9ICVkXG4iLCBjb2Fyc2VfaW50ZWdyYXRpb25fdGltZSk7Ci0JQ0RCRygicGluZm8tPnZjbV9kYWNfY29kZSA9ICVkXG4iLCBwaW5mby0+dmNtX2RhY19jb2RlKTsKLQlDREJHKCJjYXB0dXJlX21vZGUgPSAlZFxuIiwgY2FwdHVyZV9tb2RlKTsKLQotCS8qIFJFLUNPTkZJR1VSRSBTRU5TT1IgV0lUSCBORVcgVElNSU5HUwotCSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCSAqIEVudGVyIFNvZnR3YXJlIFN0YW5kYnkgTW9kZSAqLwotCXJjID0gdmI2ODAxX2kyY193cml0ZV9iKFJFR19NT0RFX1NFTEVDVCwgMCk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJJMkMgdmI2ODAxX2kyY193cml0ZV9iIEZBSUxFRCEhIVxuIik7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiBXYWl0IDEwMG1zICovCi0JbWRlbGF5KDEwMCk7Ci0KLQlpZiAoY2FwdHVyZV9tb2RlID09IDApIHsKLQotCQlyYyA9IHZiNjgwMV9pMmNfd3JpdGVfYihSRUdfQ0NQMl9DSEFOTkVMX0lERU5USUZJRVIsIDApOwotCQlyYyA9IHZiNjgwMV9pMmNfd3JpdGVfYihSRUdfQ0NQMl9TSUdOQUxMSU5HX01PREUsIDApOwotCX0gZWxzZSBpZiAoY2FwdHVyZV9tb2RlID09IDEpIHsKLQotCQlyYyA9IHZiNjgwMV9pMmNfd3JpdGVfYihSRUdfQ0NQMl9DSEFOTkVMX0lERU5USUZJRVIsIDApOwotCQlyYyA9IHZiNjgwMV9pMmNfd3JpdGVfYihSRUdfQ0NQMl9TSUdOQUxMSU5HX01PREUsIDEpOwotCX0KLQotCXsKLQkJc3RydWN0IHZiNjgwMV9pMmNfcmVnX2NvbmZfdCB3cmVnW10gPSB7Ci0JCQkvKiBSZS1jb25maWd1cmUgU2Vuc29yICovCi0JCQl7UkVHX0NDUDJfREFUQV9GT1JNQVQsIGNjcDJfZGF0YV9mb3JtYXQsIDAsCi0JCQkgRF9MRU5fV09SRH0sCi0JCQl7UkVHX0FOQUxPR1VFX0dBSU5fQ09ERV9HTE9CQUwsIDEyOCwgMCwgRF9MRU5fV09SRH0sCi0JCQl7UkVHX1BSRV9QTExfQ0xLX0RJViwgcHJlX3BsbF9jbGtfZGl2LCAwLCBEX0xFTl9XT1JEfSwKLQkJCXtSRUdfVlRfU1lTX0NMS19ESVYsIHZ0X3N5c19jbGtfZGl2LCAwLCBEX0xFTl9XT1JEfSwKLQkJCXtSRUdfVlRfUElYX0NMS19ESVYsIHZ0X3BpeF9jbGtfZGl2LCAwLCBEX0xFTl9XT1JEfSwKLQkJCXtSRUdfT1BfU1lTX0NMS19ESVYsIHZ0X3N5c19jbGtfZGl2LCAwLCBEX0xFTl9XT1JEfSwKLQkJCXtSRUdfT1BfUElYX0NMS19ESVYsIHZ0X3BpeF9jbGtfZGl2LCAwLCBEX0xFTl9XT1JEfSwKLQkJCXtSRUdfVlRfTElORV9MRU5HVEhfUENLLCB2dF9saW5lX2xlbmd0aF9wY2ssIDAsCi0JCQkgRF9MRU5fV09SRH0sCi0JCQl7UkVHX1hfT1VUUFVUX1NJWkUsIHhfb3V0cHV0X3NpemUsIDAsIERfTEVOX1dPUkR9LAotCQkJe1JFR19ZX09VVFBVVF9TSVpFLCB5X291dHB1dF9zaXplLCAwLCBEX0xFTl9XT1JEfSwKLQkJCXtSRUdfWF9PRERfSU5DLCB4X29kZF9pbmMsIDAsIERfTEVOX1dPUkR9LAotCQkJe1JFR19ZX09ERF9JTkMsIHlfb2RkX2luYywgMCwgRF9MRU5fV09SRH0sCi0JCQl7UkVHX1ZUX0ZSQU1FX0xFTkdUSF9MSU5FUywKLQkJCSB2dF9mcmFtZV9sZW5ndGhfbGluZXMgKiB2YjY4MDFfY3RybC0+ZmFjdG9yX2ZwcywgMCwKLQkJCSBEX0xFTl9XT1JEfSwKLQkJCXtSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUUsCi0JCQkgY29hcnNlX2ludGVncmF0aW9uX3RpbWUsIDAsIERfTEVOX1dPUkR9LAotCQkJLyogQW5hbG9ndWUgU2V0dGluZ3MgKi8KLQkJCXtSRUdfQU5BTE9HX1RJTUlOR19NT0RFU18yLCAwLCAxMzIsIERfTEVOX0JZVEV9LAotCQkJe1JFR19SQU1QX1NDQUxFLCAwLCA1LCBEX0xFTl9CWVRFfSwKLQkJCXtSRUdfQlRMX0xFVkVMX1NFVFVQLCAwLCAxMSwgRF9MRU5fQllURX0sCi0JCQkvKiBFbmFibGUgRGVmZWN0IENvcnJlY3Rpb24gKi8KLQkJCXtSRUdfU0NZVEhFX0VOQUJMRSwgMCwgMSwgRF9MRU5fQllURX0sCi0JCQl7UkVHX1NDWVRIRV9XRUlHSFQsIDAsIDE2LCBEX0xFTl9CWVRFfSwKLQkJCXtSRUdfQlJVQ0VfRU5BQkxFLCAwLCAxLCBEX0xFTl9CWVRFfSwKLQkJCS8qIEF1dG8gRm9jdXMgQ29uZmlndXJhdGlvbgotCQkJICogUGxlYXNlIG5vdGUgdGhhdCB0aGUgREFDIENvZGUgaXMgYSB3cml0dGVuIGFzIGEKLQkJCSAqIDE2LWJpdCB2YWx1ZSAwID0gaW5maW5pdHkgKG5vIERBQyBjdXJyZW50KSAqLwotCQkJe1JFR19WQ01fREFDX0NPREUsIHBpbmZvLT52Y21fZGFjX2NvZGUsIDAsIERfTEVOX1dPUkR9LAotCQkJe1JFR19WQ01fREFDX1NUUk9CRSwgMCwgMCwgRF9MRU5fQllURX0sCi0JCQl7UkVHX1ZDTV9EQUNfRU5BQkxFLCAwLCAxLCBEX0xFTl9CWVRFfSwKLQkJfTsKLQotCQlyYyA9IHZiNjgwMV9pMmNfd3JpdGVfdGFibGUod3JlZywgQVJSQVlfU0laRSh3cmVnKSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCUNEQkcoIkkyQyBXcml0ZSBUYWJsZSBGQUlMRUQhISFcbiIpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCS8qIFBhcmFsbGVsIEludGVyZmFjZSBDb25maWd1cmF0aW9uICovCi0JaWYgKGNhcHR1cmVfbW9kZSA+PSAyKSB7Ci0JCXN0cnVjdCB2YjY4MDFfaTJjX3JlZ19jb25mX3Qgd3JlZzFbXSA9IHsKLQkJCXtSRUdfT1BfQ09ERVJfU1lOQ19DTEtfU0VUVVAsIDAsIDE1LCBEX0xFTl9CWVRFfSwKLQkJCXtSRUdfT1BfQ09ERVJfRU5BQkxFLCAwLCAzLCBEX0xFTl9CWVRFfSwKLQkJCXtSRUdfT1BfQ09ERVJfU0xPV19QQURfRU4sIDAsIDEsIERfTEVOX0JZVEV9LAotCQkJe1JFR19PUF9DT0RFUl9BVVRPTUFUSUNfTU9ERV9FTkFCTEUsIDAsIDMsIERfTEVOX0JZVEV9LAotCQkJe1JFR19PUF9DT0RFUl9BVVRPX1NUQVJUVVAsIDAsIDIsIERfTEVOX0JZVEV9LAotCQl9OwotCi0JCXJjID0gdmI2ODAxX2kyY193cml0ZV90YWJsZSh3cmVnMSwgQVJSQVlfU0laRSh3cmVnMSkpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlDREJHKCJJMkMgV3JpdGUgVGFibGUgRkFJTEVEISEhXG4iKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCS8qIEVudGVyIFN0cmVhbWluZyBNb2RlICovCi0JcmMgPSB2YjY4MDFfaTJjX3dyaXRlX2IoUkVHX01PREVfU0VMRUNULCAxKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIkkyQyBXcml0ZSBUYWJsZSBGQUlMRUQhISFcbiIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JLyogV2FpdCB1bnRpbCB0aGUgc2Vuc29yIHN0YXJ0cyBzdHJlYW1pbmcKLQkgKiBQb2xsIHVudGlsIHRoZSByZXBvcnRlZCBmcmFtZV9jb3VudCB2YWx1ZSBpcyAhPSAweEZGICovCi0JZnJhbWVfY291bnQgPSAweEZGOwotCXRpbWVvdXQgPSAyMDAwOwotCXdoaWxlIChmcmFtZV9jb3VudCA9PSAweEZGICYmIHRpbWVvdXQgPiAwKSB7Ci0JCXJjID0gdmI2ODAxX2kyY19yZWFkKFJFR19GUkFNRV9DT1VOVCwgJmZyYW1lX2NvdW50LCAxKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlDREJHKCJSRUdfRlJBTUVfQ09VTlQgID0gMHgleFxuIiwgZnJhbWVfY291bnQpOwotCQl0aW1lb3V0LS07Ci0JfQotCi0JLyogUG9zdCBTdHJlYW1pbmcgQ29uZmlndXJhdGlvbiAqLwotCi0JcmMgPSB2YjY4MDFfaTJjX3dyaXRlX3RhYmxlKHdyZWcyLCBBUlJBWV9TSVpFKHdyZWcyKSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJJMkMgV3JpdGUgVGFibGUgRkFJTEVEISEhXG4iKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXJjID0gdmI2ODAxX2kyY19yZWFkX3RhYmxlKHJyZWcsIEFSUkFZX1NJWkUocnJlZykpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiSTJDIFJlYWQgVGFibGUgRkFJTEVEISEhXG4iKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCUNEQkcoIlJFR19QUkVfUExMX0NMS19ESVYgPSAweCV4XG4iLCBycmVnWzBdLndkYXRhKTsKLQlDREJHKCJSRUdfUExMX01VTFRJUExJRVIgID0gMHgleFxuIiwgcnJlZ1sxXS53ZGF0YSk7Ci0JQ0RCRygiUkVHX1ZUX1NZU19DTEtfRElWICA9IDB4JXhcbiIsIHJyZWdbMl0ud2RhdGEpOwotCUNEQkcoIlJFR19WVF9QSVhfQ0xLX0RJViAgPSAweCV4XG4iLCBycmVnWzNdLndkYXRhKTsKLQlDREJHKCJSRUdfT1BfU1lTX0NMS19ESVYgID0gMHgleFxuIiwgcnJlZ1s0XS53ZGF0YSk7Ci0JQ0RCRygiUkVHX09QX1BJWF9DTEtfRElWICA9IDB4JXhcbiIsIHJyZWdbNV0ud2RhdGEpOwotCUNEQkcoIlJFR19GUkFNRV9DT1VOVCAgPSAweCV4XG4iLCBycmVnWzZdLmJkYXRhKTsKLQotCW1kZWxheSg1MCk7Ci0JZnJhbWVfY291bnQgPSAwOwotCXJjID0gdmI2ODAxX2kyY19yZWFkKFJFR19GUkFNRV9DT1VOVCwgJmZyYW1lX2NvdW50LCAxKTsKLQlDREJHKCJSRUdfRlJBTUVfQ09VTlQxICA9IDB4JXhcbiIsIGZyYW1lX2NvdW50KTsKLQotCW1kZWxheSgxNTApOwotCWZyYW1lX2NvdW50ID0gMDsKLQlyYyA9IHZiNjgwMV9pMmNfcmVhZChSRUdfRlJBTUVfQ09VTlQsICZmcmFtZV9jb3VudCwgMSk7Ci0JQ0RCRygiUkVHX0ZSQU1FX0NPVU5UMiAgPSAweCV4XG4iLCBmcmFtZV9jb3VudCk7Ci0KLQltZGVsYXkoMTAwKTsKLQlmcmFtZV9jb3VudCA9IDA7Ci0JcmMgPSB2YjY4MDFfaTJjX3JlYWQoUkVHX0ZSQU1FX0NPVU5ULCAmZnJhbWVfY291bnQsIDEpOwotCUNEQkcoIlJFR19GUkFNRV9DT1VOVDMgID0gMHgleFxuIiwgZnJhbWVfY291bnQpOwotCi0JbWRlbGF5KDI1MCk7Ci0JZnJhbWVfY291bnQgPSAwOwotCXJjID0gdmI2ODAxX2kyY19yZWFkKFJFR19GUkFNRV9DT1VOVCwgJmZyYW1lX2NvdW50LCAxKTsKLQlDREJHKCJSRUdfRlJBTUVfQ09VTlQ0ICA9IDB4JXhcbiIsIGZyYW1lX2NvdW50KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB2YjY4MDFfc2Vuc29yX2luaXRfZG9uZShjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+c2Vuc29yX3Jlc2V0LCAwKTsKLQlncGlvX2ZyZWUoZGF0YS0+c2Vuc29yX3Jlc2V0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2YjY4MDFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQkvKiBJbml0aWFsaXplIHRoZSBNU01fQ0FNSTJDIENoaXAgKi8KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2YjY4MDFfd2FpdF9xdWV1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHZiNjgwMV92aWRlb19jb25maWcoaW50IG1vZGUsIGludCByZXMpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQl2YjY4MDFfY3RybC0+cHJldl9yZXMgPSByZXM7Ci0JdmI2ODAxX2N0cmwtPmN1cnJfcmVzID0gcmVzOwotCXZiNjgwMV9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQotCXJjID0gdmI2ODAxX2NvbmZpZ19zZW5zb3IoMTIsIDMwLCA2MCwgMiwgMSwgMTAsIDIsIFJFU19QUkVWSUVXKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IHZiNjgwMV9pMmNfcmVhZChSRUdfVlRfTElORV9MRU5HVEhfUENLLAotCQkJICAgICAmdmI2ODAxX2N0cmwtPnNfZHluYW1pY19wYXJhbXMuCi0JCQkgICAgIHByZXZpZXdfcGl4ZWxzUGVyTGluZSwgMik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSB2YjY4MDFfaTJjX3JlYWQoUkVHX1ZUX0xJTkVfTEVOR1RIX1BDSywKLQkJCSAgICAgJnZiNjgwMV9jdHJsLT5zX2R5bmFtaWNfcGFyYW1zLgotCQkJICAgICBwcmV2aWV3X2xpbmVzUGVyRnJhbWUsIDIpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCB2YjY4MDFfc25hcHNob3RfY29uZmlnKGludCBtb2RlLCBpbnQgcmVzKQotewotCWludDMyX3QgcmMgPSAwOwotCi0JdmI2ODAxX2N0cmwtPmN1cnJfcmVzID0gdmI2ODAxX2N0cmwtPnBpY3RfcmVzOwotCXZiNjgwMV9jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQotCXJjID0gdmI2ODAxX2NvbmZpZ19zZW5zb3IoMTIsIDEyLCA0OCwgMSwgMSwgMTAsIDIsIFJFU19DQVBUVVJFKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IHZiNjgwMV9pMmNfcmVhZChSRUdfVlRfTElORV9MRU5HVEhfUENLLAotCQkJICAgICAmdmI2ODAxX2N0cmwtPnNfZHluYW1pY19wYXJhbXMuCi0JCQkgICAgIHNuYXBzaG90X3BpeGVsc1BlckxpbmUsIDIpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJjID0gdmI2ODAxX2kyY19yZWFkKFJFR19WVF9MSU5FX0xFTkdUSF9QQ0ssCi0JCQkgICAgICZ2YjY4MDFfY3RybC0+c19keW5hbWljX3BhcmFtcy4KLQkJCSAgICAgc25hcHNob3RfbGluZXNQZXJGcmFtZSwgMik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHZiNjgwMV9zZXRfc2Vuc29yX21vZGUoaW50IG1vZGUsIGludCByZXMpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFNFTlNPUl9QUkVWSUVXX01PREU6Ci0JCXJjID0gdmI2ODAxX3ZpZGVvX2NvbmZpZyhtb2RlLCByZXMpOwotCQlicmVhazsKLQotCWNhc2UgU0VOU09SX1NOQVBTSE9UX01PREU6Ci0JY2FzZSBTRU5TT1JfUkFXX1NOQVBTSE9UX01PREU6Ci0JCXJjID0gdmI2ODAxX3NuYXBzaG90X2NvbmZpZyhtb2RlLCByZXMpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgdmI2ODAxX3NlbnNvcl9jb25maWcodm9pZCBfX3VzZXIgKmFyZ3ApCi17Ci0Jc3RydWN0IHNlbnNvcl9jZmdfZGF0YSBjZGF0YTsKLQlsb25nIHJjID0gMDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmY2RhdGEsCi0JCQkgICAodm9pZCAqKWFyZ3AsIHNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JbXV0ZXhfbG9jaygmdmI2ODAxX211dCk7Ci0KLQlDREJHKCJ2YjY4MDFfc2Vuc29yX2NvbmZpZywgY2ZndHlwZSA9ICVkXG4iLCBjZGF0YS5jZmd0eXBlKTsKLQotCXN3aXRjaCAoY2RhdGEuY2ZndHlwZSkgewotCWNhc2UgQ0ZHX0dFVF9QSUNUX0ZQUzoKLQkJdmI2ODAxX2dldF9waWN0X2ZwcyhjZGF0YS5jZmcuZ2Zwcy5wcmV2ZnBzLAotCQkJCSAgICAmKGNkYXRhLmNmZy5nZnBzLnBpY3RmcHMpKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkgJmNkYXRhLCBzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX0dFVF9QUkVWX0xfUEY6Ci0JCWNkYXRhLmNmZy5wcmV2bF9wZiA9IHZiNjgwMV9nZXRfcHJldl9saW5lc19wZigpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSAmY2RhdGEsIHNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfR0VUX1BSRVZfUF9QTDoKLQkJY2RhdGEuY2ZnLnByZXZwX3BsID0gdmI2ODAxX2dldF9wcmV2X3BpeGVsc19wbCgpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmdwLAotCQkJCSAmY2RhdGEsIHNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDRkdfR0VUX1BJQ1RfTF9QRjoKLQkJY2RhdGEuY2ZnLnBpY3RsX3BmID0gdmI2ODAxX2dldF9waWN0X2xpbmVzX3BmKCk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJICZjZGF0YSwgc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19HRVRfUElDVF9QX1BMOgotCQljZGF0YS5jZmcucGljdHBfcGwgPSB2YjY4MDFfZ2V0X3BpY3RfcGl4ZWxzX3BsKCk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJICZjZGF0YSwgc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19HRVRfUElDVF9NQVhfRVhQX0xDOgotCQljZGF0YS5jZmcucGljdF9tYXhfZXhwX2xjID0gdmI2ODAxX2dldF9waWN0X21heF9leHBfbGMoKTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkgJmNkYXRhLCBzaXplb2Yoc3RydWN0IHNlbnNvcl9jZmdfZGF0YSkpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1NFVF9GUFM6Ci0JY2FzZSBDRkdfU0VUX1BJQ1RfRlBTOgotCQlyYyA9IHZiNjgwMV9zZXRfZnBzKCYoY2RhdGEuY2ZnLmZwcykpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX1NFVF9FWFBfR0FJTjoKLQkJcmMgPSB2YjY4MDFfd3JpdGVfZXhwX2dhaW4oY2RhdGEuY2ZnLmV4cF9nYWluLmdhaW4sCi0JCQkJCSAgIGNkYXRhLmNmZy5leHBfZ2Fpbi5saW5lKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfUElDVF9FWFBfR0FJTjoKLQkJcmMgPSB2YjY4MDFfc2V0X3BpY3RfZXhwX2dhaW4oY2RhdGEuY2ZnLmV4cF9nYWluLmdhaW4sCi0JCQkJCSAgICAgIGNkYXRhLmNmZy5leHBfZ2Fpbi5saW5lKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfTU9ERToKLQkJcmMgPSB2YjY4MDFfc2V0X3NlbnNvcl9tb2RlKGNkYXRhLm1vZGUsIGNkYXRhLnJzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19QV1JfRE9XTjoKLQkJcmMgPSB2YjY4MDFfcG93ZXJfZG93bigpOwotCQlicmVhazsKLQotCWNhc2UgQ0ZHX01PVkVfRk9DVVM6Ci0JCXJjID0gdmI2ODAxX21vdmVfZm9jdXMoY2RhdGEuY2ZnLmZvY3VzLmRpciwKLQkJCQkgICAgICAgY2RhdGEuY2ZnLmZvY3VzLnN0ZXBzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENGR19TRVRfREVGQVVMVF9GT0NVUzoKLQkJcmMgPSB2YjY4MDFfc2V0X2RlZmF1bHRfZm9jdXMoKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCX0KLQotCW11dGV4X3VubG9jaygmdmI2ODAxX211dCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgdmI2ODAxX3NlbnNvcl9yZWxlYXNlKHZvaWQpCi17Ci0JaW50IHJjID0gLUVCQURGOwotCi0JbXV0ZXhfbG9jaygmdmI2ODAxX211dCk7Ci0KLQl2YjY4MDFfcG93ZXJfZG93bigpOwotCXZiNjgwMV9zZW5zb3JfaW5pdF9kb25lKHZiNjgwMV9jdHJsLT5zZW5zb3JkYXRhKTsKLQlrZnJlZSh2YjY4MDFfY3RybCk7Ci0JbXV0ZXhfdW5sb2NrKCZ2YjY4MDFfbXV0KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB2YjY4MDFfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCWludCByYyA9IDA7Ci0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKLQkJcmMgPSAtRU5PVFNVUFA7Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0KLQl2YjY4MDFfc2Vuc29ydyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2YjY4MDFfd29ya190KSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIXZiNjgwMV9zZW5zb3J3KSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBwcm9iZV9mYWlsdXJlOwotCX0KLQotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHZiNjgwMV9zZW5zb3J3KTsKLQl2YjY4MDFfaW5pdF9jbGllbnQoY2xpZW50KTsKLQl2YjY4MDFfY2xpZW50ID0gY2xpZW50OwotCXZiNjgwMV9jbGllbnQtPmFkZHIgPSB2YjY4MDFfY2xpZW50LT5hZGRyID4+IDE7Ci0KLQlyZXR1cm4gMDsKLQotcHJvYmVfZmFpbHVyZToKLQlpZiAodmI2ODAxX3NlbnNvcncgIT0gTlVMTCkgewotCQlrZnJlZSh2YjY4MDFfc2Vuc29ydyk7Ci0JCXZiNjgwMV9zZW5zb3J3ID0gTlVMTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fZXhpdCB2YjY4MDFfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCB2YjY4MDFfd29ya190ICpzZW5zb3J3ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JZnJlZV9pcnEoY2xpZW50LT5pcnEsIHNlbnNvcncpOwotCXZiNjgwMV9jbGllbnQgPSBOVUxMOwotCWtmcmVlKHNlbnNvcncpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdmI2ODAxX2kyY19pZFtdID0gewotCXsidmI2ODAxIiwgMH0sCi0Je30KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB2YjY4MDFfaTJjX2RyaXZlciA9IHsKLQkuaWRfdGFibGUgPSB2YjY4MDFfaTJjX2lkLAotCS5wcm9iZSA9IHZiNjgwMV9pMmNfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZXhpdF9wKHZiNjgwMV9pMmNfcmVtb3ZlKSwKLQkuZHJpdmVyID0gewotCQkgICAubmFtZSA9ICJ2YjY4MDEiLAotCQkgICB9LAotfTsKLQotc3RhdGljIGludCB2YjY4MDFfcHJvYmVfaW5pdF9zZW5zb3IoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JaW50IHJjOwotCi0Jc3RydWN0IHZiNjgwMV9pMmNfcmVnX2NvbmZfdCBycmVnW10gPSB7Ci0JCXsweDAwMDAsIDAsIDAsIERfTEVOX0JZVEV9LAotCQl7MHgwMDAxLCAwLCAwLCBEX0xFTl9CWVRFfSwKLQl9OwotCi0JcmMgPSB2YjY4MDFfcmVzZXQoZGF0YSk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpbml0X3Byb2JlX2RvbmU7Ci0KLQltZGVsYXkoMjApOwotCi0JcmMgPSB2YjY4MDFfaTJjX3JlYWRfdGFibGUocnJlZywgQVJSQVlfU0laRShycmVnKSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCJJMkMgUmVhZCBUYWJsZSBGQUlMRUQhISFcbiIpOwotCQlnb3RvIGluaXRfcHJvYmVfZmFpbDsKLQl9Ci0KLQkvKiA0LiBDb21wYXJlIHNlbnNvciBJRCB0byBWQjY4MDEgSUQ6ICovCi0JaWYgKHJyZWdbMF0uYmRhdGEgIT0gMHgwMyB8fCBycmVnWzFdLmJkYXRhICE9IDB4NTMpIHsKLQkJQ0RCRygidmI2ODAxX3NlbnNvcl9pbml0OiBzZW5zb3IgSUQgZG9uJ3QgbWF0Y2ghXG4iKTsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCi0JZ290byBpbml0X3Byb2JlX2RvbmU7Ci0KLWluaXRfcHJvYmVfZmFpbDoKLQl2YjY4MDFfc2Vuc29yX2luaXRfZG9uZShkYXRhKTsKLWluaXRfcHJvYmVfZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCB2YjY4MDFfc2Vuc29yX29wZW5faW5pdChjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlpbnQzMl90IHJjOwotCXN0cnVjdCB2YjY4MDFfaTJjX3JlZ19jb25mX3Qgd3JlZ1tdID0gewotCQl7UkVHX01PREVfU0VMRUNULCAwLCBTVEFOREJZX01PREUsIERfTEVOX0JZVEV9LAotCQl7MHgwMTEzLCAwLCAweDBBLCBEX0xFTl9CWVRFfSwKLQl9OwotCi0JdmI2ODAxX2N0cmwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmI2ODAxX2N0cmxfdCksIEdGUF9LRVJORUwpOwotCWlmICghdmI2ODAxX2N0cmwpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG9wZW5faW5pdF9mYWlsMTsKLQl9Ci0KLQl2YjY4MDFfY3RybC0+ZmFjdG9yX2ZwcyA9IDEgLyoqIDB4MDAwMDA0MDAqLyA7Ci0JdmI2ODAxX2N0cmwtPmN1cnJfZnBzID0gNzY4MDsgLyogMzAgKiBROCAqLyA7Ci0JdmI2ODAxX2N0cmwtPm1heF9mcHMgPSA3NjgwOyAvKiAzMCAqIFE4ICovIDsKLQl2YjY4MDFfY3RybC0+cGljdF9leHBfdXBkYXRlID0gMDsgLyogMzAgKiBROCAqLyA7Ci0JdmI2ODAxX2N0cmwtPnJlZHVjZWwgPSAwOyAvKiAzMCAqIFE4ICovIDsKLQotCXZiNjgwMV9jdHJsLT5zZXRfdGVzdCA9IFRFU1RfT0ZGOwotCXZiNjgwMV9jdHJsLT5wcmV2X3JlcyA9IFFUUl9TSVpFOwotCXZiNjgwMV9jdHJsLT5waWN0X3JlcyA9IEZVTExfU0laRTsKLQotCXZiNjgwMV9jdHJsLT5zX2R5bmFtaWNfcGFyYW1zLnByZXZpZXdfbGluZXNQZXJGcmFtZSA9Ci0JICAgIFZCNjgwMV9MSU5FU19QRVJfRlJBTUVfUFJFVklFVzsKLQl2YjY4MDFfY3RybC0+c19keW5hbWljX3BhcmFtcy5wcmV2aWV3X3BpeGVsc1BlckxpbmUgPQotCSAgICBWQjY4MDFfUElYRUxTX1BFUl9MSU5FX1BSRVZJRVc7Ci0JdmI2ODAxX2N0cmwtPnNfZHluYW1pY19wYXJhbXMuc25hcHNob3RfbGluZXNQZXJGcmFtZSA9Ci0JICAgIFZCNjgwMV9MSU5FU19QRVJfRlJBTUVfU05BUFNIT1Q7Ci0JdmI2ODAxX2N0cmwtPnNfZHluYW1pY19wYXJhbXMuc25hcHNob3RfcGl4ZWxzUGVyTGluZSA9Ci0JICAgIFZCNjgwMV9QSVhFTFNfUEVSX0xJTkVfU05BUFNIT1Q7Ci0KLQlpZiAoZGF0YSkKLQkJdmI2ODAxX2N0cmwtPnNlbnNvcmRhdGEgPSBkYXRhOwotCi0JLyogZW5hYmxlIG1jbGsgZmlyc3QgKi8KLQltc21fY2FtaW9fY2xrX3JhdGVfc2V0KFZCNjgwMV9ERUZBVUxUX0NMT0NLX1JBVEUpOwotCW1kZWxheSgyMCk7Ci0KLQlyYyA9IHZiNjgwMV9yZXNldChkYXRhKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIG9wZW5faW5pdF9mYWlsMTsKLQotCXJjID0gdmI2ODAxX2kyY193cml0ZV90YWJsZSh3cmVnLCBBUlJBWV9TSVpFKHdyZWcpKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIkkyQyBXcml0ZSBUYWJsZSBGQUlMRUQhISFcbiIpOwotCQlnb3RvIG9wZW5faW5pdF9mYWlsMjsKLQl9Ci0KLQlyYyA9IHZiNjgwMV9yZWFkX252bV9kYXRhKCZ2YjY4MDFfY3RybC0+c19pbmZvKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoInZiNjgwMV9yZWFkX252bV9kYXRhIEZBSUxFRCEhIVxuIik7Ci0JCWdvdG8gb3Blbl9pbml0X2ZhaWwyOwotCX0KLQltZGVsYXkoNjYpOwotCi0JcmMgPSB2YjY4MDFfY29uZmlnX3NlbnNvcigxMiwgMzAsIDYwLCAyLCAxLCAxMCwgMiwgUkVTX1BSRVZJRVcpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gb3Blbl9pbml0X2ZhaWwyOwotCi0JZ290byBvcGVuX2luaXRfZG9uZTsKLQotb3Blbl9pbml0X2ZhaWwyOgotCXZiNjgwMV9zZW5zb3JfaW5pdF9kb25lKGRhdGEpOwotb3Blbl9pbml0X2ZhaWwxOgotCWtmcmVlKHZiNjgwMV9jdHJsKTsKLW9wZW5faW5pdF9kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB2YjY4MDFfc2Vuc29yX3Byb2JlKGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICppbmZvLAotCQkJICAgICAgIHN0cnVjdCBtc21fc2Vuc29yX2N0cmwgKnMpCi17Ci0JaW50IHJjID0gaTJjX2FkZF9kcml2ZXIoJnZiNjgwMV9pMmNfZHJpdmVyKTsKLQlpZiAocmMgPCAwIHx8IHZiNjgwMV9jbGllbnQgPT0gTlVMTCkgewotCQlyYyA9IC1FTk9UU1VQUDsKLQkJZ290byBwcm9iZV9kb25lOwotCX0KLQotCS8qIGVuYWJsZSBtY2xrIGZpcnN0ICovCi0JbXNtX2NhbWlvX2Nsa19yYXRlX3NldChWQjY4MDFfREVGQVVMVF9DTE9DS19SQVRFKTsKLQltZGVsYXkoMjApOwotCi0JcmMgPSB2YjY4MDFfcHJvYmVfaW5pdF9zZW5zb3IoaW5mbyk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBwcm9iZV9kb25lOwotCi0Jcy0+c19pbml0ID0gdmI2ODAxX3NlbnNvcl9vcGVuX2luaXQ7Ci0Jcy0+c19yZWxlYXNlID0gdmI2ODAxX3NlbnNvcl9yZWxlYXNlOwotCXMtPnNfY29uZmlnID0gdmI2ODAxX3NlbnNvcl9jb25maWc7Ci0Jcy0+c19tb3VudF9hbmdsZSAgPSAwOwotCXZiNjgwMV9zZW5zb3JfaW5pdF9kb25lKGluZm8pOwotCi1wcm9iZV9kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX3ZiNjgwMV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBtc21fY2FtZXJhX2Rydl9zdGFydChwZGV2LCB2YjY4MDFfc2Vuc29yX3Byb2JlKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2NhbWVyYV9kcml2ZXIgPSB7Ci0JLnByb2JlID0gX192YjY4MDFfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJICAgLm5hbWUgPSAibXNtX2NhbWVyYV92YjY4MDEiLAotCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKLQkJICAgfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHZiNjgwMV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX2NhbWVyYV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdCh2YjY4MDFfaW5pdCk7Ci12b2lkIHZiNjgwMV9leGl0KHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJnZiNjgwMV9pMmNfZHJpdmVyKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92YjY4MDEuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92YjY4MDEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4ODQyYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmI2ODAxLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBWQjY4MDFfSAotI2RlZmluZSBWQjY4MDFfSAotCi0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotCi1leHRlcm4gc3RydWN0IHZiNjgwMV9yZWdfdCB2YjY4MDFfcmVnczsJLyogZnJvbSB2YjY4MDFfcmVnLmMgKi8KLQotc3RydWN0IHJlZ19zdHJ1Y3QgewotCXVpbnQxNl90IHZ0X3BpeF9jbGtfZGl2OwkvKiAgMHgwMzAwICovCi0JdWludDE2X3QgdnRfc3lzX2Nsa19kaXY7CS8qICAweDAzMDIgKi8KLQl1aW50MTZfdCBwcmVfcGxsX2Nsa19kaXY7CS8qICAweDAzMDQgKi8KLQl1aW50MTZfdCBwbGxfbXVsdGlwbGllcjsJLyogIDB4MDMwNiAqLwotCXVpbnQxNl90IG9wX3BpeF9jbGtfZGl2OwkvKiAgMHgwMzA4ICovCi0JdWludDE2X3Qgb3Bfc3lzX2Nsa19kaXY7CS8qICAweDAzMEEgKi8KLQl1aW50MTZfdCBzY2FsZV9tOwkvKiAgMHgwNDA0ICovCi0JdWludDE2X3Qgcm93X3NwZWVkOwkvKiAgMHgzMDE2ICovCi0JdWludDE2X3QgeF9hZGRyX3N0YXJ0OwkvKiAgMHgzMDA0ICovCi0JdWludDE2X3QgeF9hZGRyX2VuZDsJLyogIDB4MzAwOCAqLwotCXVpbnQxNl90IHlfYWRkcl9zdGFydDsJLyogIDB4MzAwMiAqLwotCXVpbnQxNl90IHlfYWRkcl9lbmQ7CS8qICAweDMwMDYgKi8KLQl1aW50MTZfdCByZWFkX21vZGU7CS8qICAweDMwNDAgKi8KLQl1aW50MTZfdCB4X291dHB1dF9zaXplOwkvKiAgMHgwMzRDICovCi0JdWludDE2X3QgeV9vdXRwdXRfc2l6ZTsJLyogIDB4MDM0RSAqLwotCXVpbnQxNl90IGxpbmVfbGVuZ3RoX3BjazsJLyogIDB4MzAwQyAqLwotCXVpbnQxNl90IGZyYW1lX2xlbmd0aF9saW5lczsJLyogIDB4MzAwQSAqLwotCXVpbnQxNl90IGNvYXJzZV9pbnRfdGltZTsJLyogIDB4MzAxMiAqLwotCXVpbnQxNl90IGZpbmVfaW50X3RpbWU7CS8qICAweDMwMTQgKi8KLX07Ci0KLWVudW0gaTJjX2RhdGFfbGVuIHsKLQlEX0xFTl9CWVRFLAotCURfTEVOX1dPUkQKLX07Ci0KLXN0cnVjdCB2YjY4MDFfaTJjX3JlZ19jb25mX3QgewotCXVuc2lnbmVkIHNob3J0IHdhZGRyOwotCXVuc2lnbmVkIHNob3J0IHdkYXRhOwotCXVpbnQ4X3QgYmRhdGE7Ci0JZW51bSBpMmNfZGF0YV9sZW4gZGxlbjsKLX07Ci0KLXN0cnVjdCB2YjY4MDFfcmVnX3QgewotCXN0cnVjdCByZWdfc3RydWN0IGNvbnN0ICpyZWdfcGF0OwotCXVpbnQxNl90IHJlZ19wYXRfc2l6ZTsKLQlzdHJ1Y3QgdmI2ODAxX2kyY19yZWdfY29uZl90IGNvbnN0ICp0dGJsOwotCXVpbnQxNl90IHR0Ymxfc2l6ZTsKLQlzdHJ1Y3QgdmI2ODAxX2kyY19yZWdfY29uZl90IGNvbnN0ICpsY3RibDsKLQl1aW50MTZfdCBsY3RibF9zaXplOwotCXN0cnVjdCB2YjY4MDFfaTJjX3JlZ19jb25mX3QgY29uc3QgKnJmdGJsOwotCXVpbnQxNl90IHJmdGJsX3NpemU7Ci19OwotCi0jZW5kaWYgLyogVkI2ODAxX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQxMDc1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1HQ0NfVkVSU0lPTiAgICAgIDo9ICQoc2hlbGwgJChDT05GSUdfU0hFTEwpICQoUFdEKS9zY3JpcHRzL2djYy12ZXJzaW9uLnNoICQoQ1JPU1NfQ09NUElMRSlnY2MpCi1jY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEKLWNjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS9zZXJ2ZXIKLWlmZXEgKCQoR0NDX1ZFUlNJT04pLDA0MDQpCi1DRkxBR1NfUkVNT1ZFX21zbV92ZmU4eC5vID0gLVdmcmFtZS1sYXJnZXItdGhhbj0xMDI0Ci1lbmRpZgotaWZlcSAoJChDT05GSUdfTVNNX0NBTUVSQV9WNEwyKSx5KQotICBvYmotJChDT05GSUdfQVJDSF9NU003WDI3QSkgKz0gbXNtX3ZmZTd4MjdhX3Y0bDIubwotICBvYmotJChDT05GSUdfQVJDSF9NU004WDYwKSArPSBtc21fdmZlMzFfdjRsMi5vCi0gIG9iai0kKENPTkZJR19BUkNIX01TTTdYMzApICs9IG1zbV92ZmUzMV92NGwyLm8KLWVsc2UKLSAgb2JqLSQoQ09ORklHX0FSQ0hfTVNNN1gyN0EpICs9IG1zbV92ZmU3eDI3YS5vCi0gIG9iai0kKENPTkZJR19BUkNIX01TTThYNjApICs9IG1zbV92ZmUzMS5vCi0gIG9iai0kKENPTkZJR19BUkNIX01TTTdYMzApICs9IG1zbV92ZmUzMS5vCi1lbmRpZgotb2JqLSQoQ09ORklHX0FSQ0hfTVNNX0FSTTExKSArPSBtc21fdmZlN3gubwotb2JqLSQoQ09ORklHX0FSQ0hfUVNEOFg1MCkgKz0gbXNtX3ZmZTh4Lm8gbXNtX3ZmZTh4X3Byb2Mubwotb2JqLSQoQ09ORklHX0FSQ0hfTVNNODk2MCkgKz0gbXNtX3ZmZTMyLm8KLW9iai0kKENPTkZJR19BUkNIX01TTTg5NzQpICs9IG1zbV92ZmU0MC5vCi1vYmotJChDT05GSUdfTVNNX0NBTUVSQV9WNEwyKSArPSBtc21fdmZlX3N0YXRzX2J1Zi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmUzMS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlMzEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5MjA4NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmUzMS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAxMiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2lycXMuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLQotI2luY2x1ZGUgIm1zbV92ZmUzMS5oIgotI2luY2x1ZGUgIm1zbV92cGUxLmgiCi1hdG9taWNfdCBpcnFfY250OwotCi1zdGF0aWMgc3RydWN0IHZmZTMxX2N0cmxfdHlwZSAqdmZlMzFfY3RybDsKLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbWVyYV9pb19jbGsgY2FtaW9fY2xrOwotc3RhdGljIHZvaWQgKnZmZV9zeW5jZGF0YTsKLXN0YXRpYyB2b2lkIHZmZTMxX3NlbmRfbXNnX25vX3BheWxvYWQoZW51bSBWRkUzMV9NRVNTQUdFX0lEIGlkKTsKLXN0YXRpYyB2b2lkIHZmZTMxX3Jlc2V0X2hpc3RfY2ZnKHZvaWQpOwotCi1zdHJ1Y3QgdmZlMzFfaXNyX3F1ZXVlX2NtZCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgdmZlSW50ZXJydXB0U3RhdHVzMDsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHZmZUludGVycnVwdFN0YXR1czE7Ci0JdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZmVQaW5nUG9uZ1N0YXR1czsKLQlzdHJ1Y3QgdmZlX2ZyYW1lX2FzZl9pbmZvICAgICAgICAgIHZmZUFzZkZyYW1lSW5mbzsKLQlzdHJ1Y3QgdmZlX2ZyYW1lX2JwY19pbmZvICAgICAgICAgIHZmZUJwY0ZyYW1lSW5mbzsKLQlzdHJ1Y3QgdmZlX21zZ19jYW1pZl9zdGF0dXMgICAgICAgIHZmZUNhbWlmU3RhdHVzTG9jYWw7Ci19OwotCi1zdGF0aWMgc3RydWN0IHZmZTMxX2NtZF90eXBlIHZmZTMxX2NtZFtdID0gewotLyogMCovCXtWMzFfRFVNTVlfMH0sCi0JCXtWMzFfU0VUX0NMS30sCi0JCXtWMzFfUkVTRVR9LAotCQl7VjMxX1NUQVJUfSwKLQkJe1YzMV9URVNUX0dFTl9TVEFSVH0sCi0vKiA1Ki8Je1YzMV9PUEVSQVRJT05fQ0ZHLCBWMzFfT1BFUkFUSU9OX0NGR19MRU59LAotCQl7VjMxX0FYSV9PVVRfQ0ZHLCBWMzFfQVhJX09VVF9MRU4sIFYzMV9BWElfT1VUX09GRiwgMHhGRn0sCi0JCXtWMzFfQ0FNSUZfQ0ZHLCBWMzFfQ0FNSUZfTEVOLCBWMzFfQ0FNSUZfT0ZGLCAweEZGfSwKLQkJe1YzMV9BWElfSU5QVVRfQ0ZHfSwKLQkJe1YzMV9CTEFDS19MRVZFTF9DRkcsIFYzMV9CTEFDS19MRVZFTF9MRU4sIFYzMV9CTEFDS19MRVZFTF9PRkYsCi0JCTB4RkZ9LAotLyoxMCovICB7VjMxX1JPTExfT0ZGX0NGRywgVjMxX1JPTExfT0ZGX0NGR19MRU4sIFYzMV9ST0xMX09GRl9DRkdfT0ZGLAotCQkweEZGfSwKLQkJe1YzMV9ERU1VWF9DRkcsIFYzMV9ERU1VWF9MRU4sIFYzMV9ERU1VWF9PRkYsIDB4RkZ9LAotCQl7VjMxX0RFTU9TQUlDXzBfQ0ZHLCBWMzFfREVNT1NBSUNfMF9MRU4sIFYzMV9ERU1PU0FJQ18wX09GRiwKLQkJMHhGRn0sCi0JCXtWMzFfREVNT1NBSUNfMV9DRkcsIFYzMV9ERU1PU0FJQ18xX0xFTiwgVjMxX0RFTU9TQUlDXzFfT0ZGLAotCQkweEZGfSwKLQkJe1YzMV9ERU1PU0FJQ18yX0NGRywgVjMxX0RFTU9TQUlDXzJfTEVOLCBWMzFfREVNT1NBSUNfMl9PRkYsCi0JCTB4RkZ9LAotLyoxNSovCXtWMzFfRk9WX0NGRywgVjMxX0ZPVl9MRU4sIFYzMV9GT1ZfT0ZGLCAweEZGfSwKLQkJe1YzMV9NQUlOX1NDQUxFUl9DRkcsIFYzMV9NQUlOX1NDQUxFUl9MRU4sIFYzMV9NQUlOX1NDQUxFUl9PRkYsCi0JCTB4RkZ9LAotCQl7VjMxX1dCX0NGRywgVjMxX1dCX0xFTiwgVjMxX1dCX09GRiwgMHhGRn0sCi0JCXtWMzFfQ09MT1JfQ09SX0NGRywgVjMxX0NPTE9SX0NPUl9MRU4sIFYzMV9DT0xPUl9DT1JfT0ZGLCAweEZGfSwKLQkJe1YzMV9SR0JfR19DRkcsIFYzMV9SR0JfR19MRU4sIFYzMV9SR0JfR19PRkYsIDB4RkZ9LAotLyoyMCovCXtWMzFfTEFfQ0ZHLCBWMzFfTEFfTEVOLCBWMzFfTEFfT0ZGLCAweEZGIH0sCi0JCXtWMzFfQ0hST01BX0VOX0NGRywgVjMxX0NIUk9NQV9FTl9MRU4sIFYzMV9DSFJPTUFfRU5fT0ZGLCAweEZGfSwKLQkJe1YzMV9DSFJPTUFfU1VQX0NGRywgVjMxX0NIUk9NQV9TVVBfTEVOLCBWMzFfQ0hST01BX1NVUF9PRkYsCi0JCTB4RkZ9LAotCQl7VjMxX01DRV9DRkcsIFYzMV9NQ0VfTEVOLCBWMzFfTUNFX09GRiwgMHhGRn0sCi0JCXtWMzFfU0tfRU5IQU5fQ0ZHLCBWMzFfU0NFX0xFTiwgVjMxX1NDRV9PRkYsIDB4RkZ9LAotLyoyNSovCXtWMzFfQVNGX0NGRywgVjMxX0FTRl9MRU4sIFYzMV9BU0ZfT0ZGLCAweEZGfSwKLQkJe1YzMV9TMllfQ0ZHLCBWMzFfUzJZX0xFTiwgVjMxX1MyWV9PRkYsIDB4RkZ9LAotCQl7VjMxX1MyQ2JDcl9DRkcsIFYzMV9TMkNiQ3JfTEVOLCBWMzFfUzJDYkNyX09GRiwgMHhGRn0sCi0JCXtWMzFfQ0hST01BX1NVQlNfQ0ZHLCBWMzFfQ0hST01BX1NVQlNfTEVOLCBWMzFfQ0hST01BX1NVQlNfT0ZGLAotCQkweEZGfSwKLQkJe1YzMV9PVVRfQ0xBTVBfQ0ZHLCBWMzFfT1VUX0NMQU1QX0xFTiwgVjMxX09VVF9DTEFNUF9PRkYsCi0JCTB4RkZ9LAotLyozMCovCXtWMzFfRlJBTUVfU0tJUF9DRkcsIFYzMV9GUkFNRV9TS0lQX0xFTiwgVjMxX0ZSQU1FX1NLSVBfT0ZGLAotCQkweEZGfSwKLQkJe1YzMV9EVU1NWV8xfSwKLQkJe1YzMV9EVU1NWV8yfSwKLQkJe1YzMV9EVU1NWV8zfSwKLQkJe1YzMV9VUERBVEV9LAotLyozNSovCXtWMzFfQkxfTFZMX1VQREFURSwgVjMxX0JMQUNLX0xFVkVMX0xFTiwgVjMxX0JMQUNLX0xFVkVMX09GRiwKLQkJMHhGRn0sCi0JCXtWMzFfREVNVVhfVVBEQVRFLCBWMzFfREVNVVhfTEVOLCBWMzFfREVNVVhfT0ZGLCAweEZGfSwKLQkJe1YzMV9ERU1PU0FJQ18xX1VQREFURSwgVjMxX0RFTU9TQUlDXzFfTEVOLCBWMzFfREVNT1NBSUNfMV9PRkYsCi0JCTB4RkZ9LAotCQl7VjMxX0RFTU9TQUlDXzJfVVBEQVRFLCBWMzFfREVNT1NBSUNfMl9MRU4sIFYzMV9ERU1PU0FJQ18yX09GRiwKLQkJMHhGRn0sCi0JCXtWMzFfRk9WX1VQREFURSwgVjMxX0ZPVl9MRU4sIFYzMV9GT1ZfT0ZGLCAweEZGfSwKLS8qNDAqLwl7VjMxX01BSU5fU0NBTEVSX1VQREFURSwgVjMxX01BSU5fU0NBTEVSX0xFTiwgVjMxX01BSU5fU0NBTEVSX09GRiwKLQkJMHhGRn0sCi0JCXtWMzFfV0JfVVBEQVRFLCBWMzFfV0JfTEVOLCBWMzFfV0JfT0ZGLCAweEZGfSwKLQkJe1YzMV9DT0xPUl9DT1JfVVBEQVRFLCBWMzFfQ09MT1JfQ09SX0xFTiwgVjMxX0NPTE9SX0NPUl9PRkYsCi0JCTB4RkZ9LAotCQl7VjMxX1JHQl9HX1VQREFURSwgVjMxX1JHQl9HX0xFTiwgVjMxX0NIUk9NQV9FTl9PRkYsIDB4RkZ9LAotCQl7VjMxX0xBX1VQREFURSwgVjMxX0xBX0xFTiwgVjMxX0xBX09GRiwgMHhGRiB9LAotLyo0NSovCXtWMzFfQ0hST01BX0VOX1VQREFURSwgVjMxX0NIUk9NQV9FTl9MRU4sIFYzMV9DSFJPTUFfRU5fT0ZGLAotCQkweEZGfSwKLQkJe1YzMV9DSFJPTUFfU1VQX1VQREFURSwgVjMxX0NIUk9NQV9TVVBfTEVOLCBWMzFfQ0hST01BX1NVUF9PRkYsCi0JCTB4RkZ9LAotCQl7VjMxX01DRV9VUERBVEUsIFYzMV9NQ0VfTEVOLCBWMzFfTUNFX09GRiwgMHhGRn0sCi0JCXtWMzFfU0tfRU5IQU5fVVBEQVRFLCBWMzFfU0NFX0xFTiwgVjMxX1NDRV9PRkYsIDB4RkZ9LAotCQl7VjMxX1MyQ2JDcl9VUERBVEUsIFYzMV9TMkNiQ3JfTEVOLCBWMzFfUzJDYkNyX09GRiwgMHhGRn0sCi0vKjUwKi8Je1YzMV9TMllfVVBEQVRFLCBWMzFfUzJZX0xFTiwgVjMxX1MyWV9PRkYsIDB4RkZ9LAotCQl7VjMxX0FTRl9VUERBVEUsIFYzMV9BU0ZfVVBEQVRFX0xFTiwgVjMxX0FTRl9PRkYsIDB4RkZ9LAotCQl7VjMxX0ZSQU1FX1NLSVBfVVBEQVRFfSwKLQkJe1YzMV9DQU1JRl9GUkFNRV9VUERBVEV9LAotCQl7VjMxX1NUQVRTX0FGX1VQREFURSwgVjMxX1NUQVRTX0FGX0xFTiwgVjMxX1NUQVRTX0FGX09GRn0sCi0vKjU1Ki8Je1YzMV9TVEFUU19BRV9VUERBVEUsIFYzMV9TVEFUU19BRV9MRU4sIFYzMV9TVEFUU19BRV9PRkZ9LAotCQl7VjMxX1NUQVRTX0FXQl9VUERBVEUsIFYzMV9TVEFUU19BV0JfTEVOLCBWMzFfU1RBVFNfQVdCX09GRn0sCi0JCXtWMzFfU1RBVFNfUlNfVVBEQVRFLCBWMzFfU1RBVFNfUlNfTEVOLCBWMzFfU1RBVFNfUlNfT0ZGfSwKLQkJe1YzMV9TVEFUU19DU19VUERBVEUsIFYzMV9TVEFUU19DU19MRU4sIFYzMV9TVEFUU19DU19PRkZ9LAotCQl7VjMxX1NUQVRTX1NLSU5fVVBEQVRFfSwKLS8qNjAqLwl7VjMxX1NUQVRTX0lISVNUX1VQREFURSwgVjMxX1NUQVRTX0lISVNUX0xFTiwgVjMxX1NUQVRTX0lISVNUX09GRn0sCi0JCXtWMzFfRFVNTVlfNH0sCi0JCXtWMzFfRVBPQ0gxX0FDS30sCi0JCXtWMzFfRVBPQ0gyX0FDS30sCi0JCXtWMzFfU1RBUlRfUkVDT1JESU5HfSwKLS8qNjUqLwl7VjMxX1NUT1BfUkVDT1JESU5HfSwKLQkJe1YzMV9EVU1NWV81fSwKLQkJe1YzMV9EVU1NWV82fSwKLQkJe1YzMV9DQVBUVVJFLCBWMzFfQ0FQVFVSRV9MRU4sIDB4RkZ9LAotCQl7VjMxX0RVTU1ZXzd9LAotLyo3MCovCXtWMzFfU1RPUH0sCi0JCXtWMzFfR0VUX0hXX1ZFUlNJT059LAotCQl7VjMxX0dFVF9GUkFNRV9TS0lQX0NPVU5UU30sCi0JCXtWMzFfT1VUUFVUMV9CVUZGRVJfRU5RfSwKLQkJe1YzMV9PVVRQVVQyX0JVRkZFUl9FTlF9LAotLyo3NSovCXtWMzFfT1VUUFVUM19CVUZGRVJfRU5RfSwKLQkJe1YzMV9KUEVHX09VVF9CVUZfRU5RfSwKLQkJe1YzMV9SQVdfT1VUX0JVRl9FTlF9LAotCQl7VjMxX1JBV19JTl9CVUZfRU5RfSwKLQkJe1YzMV9TVEFUU19BRl9FTlF9LAotLyo4MCovCXtWMzFfU1RBVFNfQUVfRU5RfSwKLQkJe1YzMV9TVEFUU19BV0JfRU5RfSwKLQkJe1YzMV9TVEFUU19SU19FTlF9LAotCQl7VjMxX1NUQVRTX0NTX0VOUX0sCi0JCXtWMzFfU1RBVFNfU0tJTl9FTlF9LAotLyo4NSovCXtWMzFfU1RBVFNfSUhJU1RfRU5RfSwKLQkJe1YzMV9EVU1NWV84fSwKLQkJe1YzMV9KUEVHX0VOQ19DRkd9LAotCQl7VjMxX0RVTU1ZXzl9LAotCQl7VjMxX1NUQVRTX0FGX1NUQVJULCBWMzFfU1RBVFNfQUZfTEVOLCBWMzFfU1RBVFNfQUZfT0ZGfSwKLS8qOTAqLwl7VjMxX1NUQVRTX0FGX1NUT1B9LAotCQl7VjMxX1NUQVRTX0FFX1NUQVJULCBWMzFfU1RBVFNfQUVfTEVOLCBWMzFfU1RBVFNfQUVfT0ZGfSwKLQkJe1YzMV9TVEFUU19BRV9TVE9QfSwKLQkJe1YzMV9TVEFUU19BV0JfU1RBUlQsIFYzMV9TVEFUU19BV0JfTEVOLCBWMzFfU1RBVFNfQVdCX09GRn0sCi0JCXtWMzFfU1RBVFNfQVdCX1NUT1B9LAotLyo5NSovCXtWMzFfU1RBVFNfUlNfU1RBUlQsIFYzMV9TVEFUU19SU19MRU4sIFYzMV9TVEFUU19SU19PRkZ9LAotCQl7VjMxX1NUQVRTX1JTX1NUT1B9LAotCQl7VjMxX1NUQVRTX0NTX1NUQVJULCBWMzFfU1RBVFNfQ1NfTEVOLCBWMzFfU1RBVFNfQ1NfT0ZGfSwKLQkJe1YzMV9TVEFUU19DU19TVE9QfSwKLQkJe1YzMV9TVEFUU19TS0lOX1NUQVJUfSwKLS8qMTAwKi8Je1YzMV9TVEFUU19TS0lOX1NUT1B9LAotCQl7VjMxX1NUQVRTX0lISVNUX1NUQVJULAotCQlWMzFfU1RBVFNfSUhJU1RfTEVOLCBWMzFfU1RBVFNfSUhJU1RfT0ZGfSwKLQkJe1YzMV9TVEFUU19JSElTVF9TVE9QfSwKLQkJe1YzMV9EVU1NWV8xMH0sCi0JCXtWMzFfU1lOQ19USU1FUl9TRVRUSU5HLCBWMzFfU1lOQ19USU1FUl9MRU4sCi0JCQlWMzFfU1lOQ19USU1FUl9PRkZ9LAotLyoxMDUqLwl7VjMxX0FTWU5DX1RJTUVSX1NFVFRJTkcsIFYzMV9BU1lOQ19USU1FUl9MRU4sIFYzMV9BU1lOQ19USU1FUl9PRkZ9LAotCQl7VjMxX0xJVkVTSE9UfSwKLQkJe1YzMV9aU0wsIFYzMV9DQVBUVVJFX0xFTiwgMHhGRn0sCi0JCXtWMzFfU1RFUkVPQ0FNfSwKLQkJe1YzMV9MQV9TRVRVUH0sCi0vKjExMCovCXtWMzFfWEJBUl9DRkcsIFYzMV9YQkFSX0NGR19MRU4sIFYzMV9YQkFSX0NGR19PRkZ9LAotLyoxMTEqLwl7VjMxX0VaVFVORV9DRkcsIFYzMV9FWlRVTkVfQ0ZHX0xFTiwgVjMxX0VaVFVORV9DRkdfT0ZGfSwKLX07Ci0KLXVpbnQzMl90IHZmZTMxX0FYSV9XTV9DRkdbXSA9IHsKLQkweDAwMDAwMDRDLAotCTB4MDAwMDAwNjQsCi0JMHgwMDAwMDA3QywKLQkweDAwMDAwMDk0LAotCTB4MDAwMDAwQUMsCi0JMHgwMDAwMDBDNCwKLQkweDAwMDAwMERDLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnZmZTMxX2dlbmVyYWxfY21kW10gPSB7Ci0JIkRVTU1ZXzAiLCAgLyogMCAqLwotCSJTRVRfQ0xLIiwKLQkiUkVTRVQiLAotCSJTVEFSVCIsCi0JIlRFU1RfR0VOX1NUQVJUIiwKLQkiT1BFUkFUSU9OX0NGRyIsICAvKiA1ICovCi0JIkFYSV9PVVRfQ0ZHIiwKLQkiQ0FNSUZfQ0ZHIiwKLQkiQVhJX0lOUFVUX0NGRyIsCi0JIkJMQUNLX0xFVkVMX0NGRyIsCi0JIlJPTExfT0ZGX0NGRyIsICAvKiAxMCAqLwotCSJERU1VWF9DRkciLAotCSJERU1PU0FJQ18wX0NGRyIsICAvKiBnZW5lcmFsICovCi0JIkRFTU9TQUlDXzFfQ0ZHIiwgIC8qIEFCRiAgICAgKi8KLQkiREVNT1NBSUNfMl9DRkciLCAgLyogQlBDICAgICAqLwotCSJGT1ZfQ0ZHIiwgIC8qIDE1ICAqLwotCSJNQUlOX1NDQUxFUl9DRkciLAotCSJXQl9DRkciLAotCSJDT0xPUl9DT1JfQ0ZHIiwKLQkiUkdCX0dfQ0ZHIiwKLQkiTEFfQ0ZHIiwgIC8qIDIwICovCi0JIkNIUk9NQV9FTl9DRkciLAotCSJDSFJPTUFfU1VQX0NGRyIsCi0JIk1DRV9DRkciLAotCSJTS19FTkhBTl9DRkciLAotCSJBU0ZfQ0ZHIiwgIC8qIDI1ICovCi0JIlMyWV9DRkciLAotCSJTMkNiQ3JfQ0ZHIiwKLQkiQ0hST01BX1NVQlNfQ0ZHIiwKLQkiT1VUX0NMQU1QX0NGRyIsCi0JIkZSQU1FX1NLSVBfQ0ZHIiwgIC8qIDMwICovCi0JIkRVTU1ZXzEiLAotCSJEVU1NWV8yIiwKLQkiRFVNTVlfMyIsCi0JIlVQREFURSIsCi0JIkJMX0xWTF9VUERBVEUiLCAgLyogMzUgKi8KLQkiREVNVVhfVVBEQVRFIiwKLQkiREVNT1NBSUNfMV9VUERBVEUiLCAgLyogQlBDICovCi0JIkRFTU9TQUlDXzJfVVBEQVRFIiwgIC8qIEFCRiAqLwotCSJGT1ZfVVBEQVRFIiwKLQkiTUFJTl9TQ0FMRVJfVVBEQVRFIiwgIC8qIDQwICovCi0JIldCX1VQREFURSIsCi0JIkNPTE9SX0NPUl9VUERBVEUiLAotCSJSR0JfR19VUERBVEUiLAotCSJMQV9VUERBVEUiLAotCSJDSFJPTUFfRU5fVVBEQVRFIiwgIC8qIDQ1ICovCi0JIkNIUk9NQV9TVVBfVVBEQVRFIiwKLQkiTUNFX1VQREFURSIsCi0JIlNLX0VOSEFOX1VQREFURSIsCi0JIlMyQ2JDcl9VUERBVEUiLAotCSJTMllfVVBEQVRFIiwgIC8qIDUwICovCi0JIkFTRl9VUERBVEUiLAotCSJGUkFNRV9TS0lQX1VQREFURSIsCi0JIkNBTUlGX0ZSQU1FX1VQREFURSIsCi0JIlNUQVRTX0FGX1VQREFURSIsCi0JIlNUQVRTX0FFX1VQREFURSIsICAvKiA1NSAqLwotCSJTVEFUU19BV0JfVVBEQVRFIiwKLQkiU1RBVFNfUlNfVVBEQVRFIiwKLQkiU1RBVFNfQ1NfVVBEQVRFIiwKLQkiU1RBVFNfU0tJTl9VUERBVEUiLAotCSJTVEFUU19JSElTVF9VUERBVEUiLCAgLyogNjAgKi8KLQkiRFVNTVlfNCIsCi0JIkVQT0NIMV9BQ0siLAotCSJFUE9DSDJfQUNLIiwKLQkiU1RBUlRfUkVDT1JESU5HIiwKLQkiU1RPUF9SRUNPUkRJTkciLCAgLyogNjUgKi8KLQkiRFVNTVlfNSIsCi0JIkRVTU1ZXzYiLAotCSJDQVBUVVJFIiwKLQkiRFVNTVlfNyIsCi0JIlNUT1AiLCAgLyogNzAgKi8KLQkiR0VUX0hXX1ZFUlNJT04iLAotCSJHRVRfRlJBTUVfU0tJUF9DT1VOVFMiLAotCSJPVVRQVVQxX0JVRkZFUl9FTlEiLAotCSJPVVRQVVQyX0JVRkZFUl9FTlEiLAotCSJPVVRQVVQzX0JVRkZFUl9FTlEiLCAgLyogNzUgKi8KLQkiSlBFR19PVVRfQlVGX0VOUSIsCi0JIlJBV19PVVRfQlVGX0VOUSIsCi0JIlJBV19JTl9CVUZfRU5RIiwKLQkiU1RBVFNfQUZfRU5RIiwKLQkiU1RBVFNfQUVfRU5RIiwgIC8qIDgwICovCi0JIlNUQVRTX0FXQl9FTlEiLAotCSJTVEFUU19SU19FTlEiLAotCSJTVEFUU19DU19FTlEiLAotCSJTVEFUU19TS0lOX0VOUSIsCi0JIlNUQVRTX0lISVNUX0VOUSIsICAvKiA4NSAqLwotCSJEVU1NWV84IiwKLQkiSlBFR19FTkNfQ0ZHIiwKLQkiRFVNTVlfOSIsCi0JIlNUQVRTX0FGX1NUQVJUIiwKLQkiU1RBVFNfQUZfU1RPUCIsICAvKiA5MCAqLwotCSJTVEFUU19BRV9TVEFSVCIsCi0JIlNUQVRTX0FFX1NUT1AiLAotCSJTVEFUU19BV0JfU1RBUlQiLAotCSJTVEFUU19BV0JfU1RPUCIsCi0JIlNUQVRTX1JTX1NUQVJUIiwgIC8qIDk1ICovCi0JIlNUQVRTX1JTX1NUT1AiLAotCSJTVEFUU19DU19TVEFSVCIsCi0JIlNUQVRTX0NTX1NUT1AiLAotCSJTVEFUU19TS0lOX1NUQVJUIiwKLQkiU1RBVFNfU0tJTl9TVE9QIiwgIC8qIDEwMCAqLwotCSJTVEFUU19JSElTVF9TVEFSVCIsCi0JIlNUQVRTX0lISVNUX1NUT1AiLAotCSJEVU1NWV8xMCIsCi0JIlNZTkNfVElNRVJfU0VUVElORyIsCi0JIkFTWU5DX1RJTUVSX1NFVFRJTkciLCAgLyogMTA1ICovCi0JIlYzMV9MSVZFU0hPVCIsCi0JIlYzMV9aU0wiLAotCSJWMzFfU1RFUkVPQ0FNIiwKLQkiVjMxX0xBX1NFVFVQIiwKLQkiVjMxX1hCQVJfQ0ZHIiwKLX07Ci0KLXN0YXRpYyB2b2lkIHZmZV9hZGRyX2NvbnZlcnQoc3RydWN0IG1zbV92ZmVfcGh5X2luZm8gKnBpbmZvLAotCWVudW0gdmZlX3Jlc3BfbXNnIHR5cGUsIHZvaWQgKmRhdGEsIHZvaWQgKipleHQsIGludDMyX3QgKmVsZW4pCi17Ci0JdWludDhfdCBvdXRpZDsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIFZGRV9NU0dfT1VUUFVUX1Q6Ci0JY2FzZSBWRkVfTVNHX09VVFBVVF9QOgotCWNhc2UgVkZFX01TR19PVVRQVVRfUzoKLQljYXNlIFZGRV9NU0dfT1VUUFVUX1Y6Ci0JewotCQlwaW5mby0+b3V0cHV0X2lkID0KLQkJCSgoc3RydWN0IHZmZV9tZXNzYWdlICopZGF0YSktPl91Lm1zZ091dC5vdXRwdXRfaWQ7Ci0KLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgVkZFX01TR19PVVRQVVRfUDoKLQkJCW91dGlkID0gT1VUUFVUX1RZUEVfUDsKLQkJCWJyZWFrOwotCQljYXNlIFZGRV9NU0dfT1VUUFVUX1Y6Ci0JCQlvdXRpZCA9IE9VVFBVVF9UWVBFX1Y7Ci0JCQlicmVhazsKLQkJY2FzZSBWRkVfTVNHX09VVFBVVF9UOgotCQkJb3V0aWQgPSBPVVRQVVRfVFlQRV9UOwotCQkJYnJlYWs7Ci0JCWNhc2UgVkZFX01TR19PVVRQVVRfUzoKLQkJCW91dGlkID0gT1VUUFVUX1RZUEVfUzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJb3V0aWQgPSAweGZmOwotCQkJYnJlYWs7Ci0JCX0KLQkJcGluZm8tPm91dHB1dF9pZCA9IG91dGlkOwotCQlwaW5mby0+cDBfcGh5ID0KLQkJCSgoc3RydWN0IHZmZV9tZXNzYWdlICopZGF0YSktPl91Lm1zZ091dC5wMF9hZGRyOwotCQlwaW5mby0+cDFfcGh5ID0KLQkJCSgoc3RydWN0IHZmZV9tZXNzYWdlICopZGF0YSktPl91Lm1zZ091dC5wMV9hZGRyOwotCQlwaW5mby0+cDJfcGh5ID0KLQkJCSgoc3RydWN0IHZmZV9tZXNzYWdlICopZGF0YSktPl91Lm1zZ091dC5wMl9hZGRyOwotCi0JCXBpbmZvLT5mcmFtZV9pZCA9Ci0JCSgoc3RydWN0IHZmZV9tZXNzYWdlICopZGF0YSktPl91Lm1zZ091dC5mcmFtZUNvdW50ZXI7Ci0KLQkJKChzdHJ1Y3QgdmZlX21zZ19vdXRwdXQgKikodmZlMzFfY3RybC0+ZXh0ZGF0YSkpLT5icGNJbmZvID0KLQkJKChzdHJ1Y3QgdmZlX21lc3NhZ2UgKilkYXRhKS0+X3UubXNnT3V0LmJwY0luZm87Ci0JCSgoc3RydWN0IHZmZV9tc2dfb3V0cHV0ICopKHZmZTMxX2N0cmwtPmV4dGRhdGEpKS0+YXNmSW5mbyA9Ci0JCSgoc3RydWN0IHZmZV9tZXNzYWdlICopZGF0YSktPl91Lm1zZ091dC5hc2ZJbmZvOwotCQkoKHN0cnVjdCB2ZmVfbXNnX291dHB1dCAqKSh2ZmUzMV9jdHJsLT5leHRkYXRhKSktPmZyYW1lQ291bnRlciA9Ci0JCSgoc3RydWN0IHZmZV9tZXNzYWdlICopZGF0YSktPl91Lm1zZ091dC5mcmFtZUNvdW50ZXI7Ci0JCSpleHQgID0gdmZlMzFfY3RybC0+ZXh0ZGF0YTsKLQkJKmVsZW4gPSB2ZmUzMV9jdHJsLT5leHRsZW47Ci0JfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0gLyogc3dpdGNoICovCi19Ci0KLQotc3RhdGljIHZvaWQgdmZlMzFfcHJvY19vcHMoZW51bSBWRkUzMV9NRVNTQUdFX0lEIGlkLCB2b2lkICptc2csIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IG1zbV92ZmVfcmVzcCAqcnA7Ci0KLQlycCA9IHZmZTMxX2N0cmwtPnJlc3AtPnZmZV9hbGxvYyhzaXplb2Yoc3RydWN0IG1zbV92ZmVfcmVzcCksCi0JCXZmZTMxX2N0cmwtPnN5bmNkYXRhLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXJwKSB7Ci0JCUNEQkcoInJwOiBjYW5ub3QgYWxsb2NhdGUgYnVmZmVyXG4iKTsKLQkJcmV0dXJuOwotCX0KLQlDREJHKCJ2ZmUzMV9wcm9jX29wcywgbXNnSWQgPSAlZFxuIiwgaWQpOwotCXJwLT5ldnRfbXNnLnR5cGUgICA9IE1TTV9DQU1FUkFfTVNHOwotCXJwLT5ldnRfbXNnLm1zZ19pZCA9IGlkOwotCXJwLT5ldnRfbXNnLmxlbiAgICA9IGxlbjsKLQlycC0+ZXZ0X21zZy5kYXRhICAgPSBtc2c7Ci0KLQlzd2l0Y2ggKHJwLT5ldnRfbXNnLm1zZ19pZCkgewotCWNhc2UgTVNHX0lEX1NOQVBTSE9UX0RPTkU6Ci0JCXJwLT50eXBlID0gVkZFX01TR19TTkFQU0hPVDsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TR19JRF9PVVRQVVRfUDoKLQkJcnAtPnR5cGUgPSBWRkVfTVNHX09VVFBVVF9QOwotCQl2ZmVfYWRkcl9jb252ZXJ0KCYocnAtPnBoeSksIFZGRV9NU0dfT1VUUFVUX1AsCi0JCQlycC0+ZXZ0X21zZy5kYXRhLCAmKHJwLT5leHRkYXRhKSwKLQkJCSYocnAtPmV4dGxlbikpOwotCQlicmVhazsKLQotCWNhc2UgTVNHX0lEX09VVFBVVF9UOgotCQlycC0+dHlwZSA9IFZGRV9NU0dfT1VUUFVUX1Q7Ci0JCXZmZV9hZGRyX2NvbnZlcnQoJihycC0+cGh5KSwgVkZFX01TR19PVVRQVVRfVCwKLQkJCXJwLT5ldnRfbXNnLmRhdGEsICYocnAtPmV4dGRhdGEpLAotCQkJJihycC0+ZXh0bGVuKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU0dfSURfT1VUUFVUX1M6Ci0JCXJwLT50eXBlID0gVkZFX01TR19PVVRQVVRfUzsKLQkJdmZlX2FkZHJfY29udmVydCgmKHJwLT5waHkpLCBWRkVfTVNHX09VVFBVVF9TLAotCQkJcnAtPmV2dF9tc2cuZGF0YSwgJihycC0+ZXh0ZGF0YSksCi0JCQkmKHJwLT5leHRsZW4pKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TR19JRF9PVVRQVVRfVjoKLQkJcnAtPnR5cGUgPSBWRkVfTVNHX09VVFBVVF9WOwotCQl2ZmVfYWRkcl9jb252ZXJ0KCYocnAtPnBoeSksIFZGRV9NU0dfT1VUUFVUX1YsCi0JCQlycC0+ZXZ0X21zZy5kYXRhLCAmKHJwLT5leHRkYXRhKSwKLQkJCSYocnAtPmV4dGxlbikpOwotCQlicmVhazsKLQotCWNhc2UgTVNHX0lEX0NPTU1PTjoKLQkJcnAtPnR5cGUgPSBWRkVfTVNHX0NPTU1PTjsKLQkJcnAtPnN0YXRzX21zZy5zdGF0dXNfYml0cyA9ICgoc3RydWN0IHZmZV9tZXNzYWdlICopCi0JCQlycC0+ZXZ0X21zZy5kYXRhKS0+X3UubXNnU3RhdHMuc3RhdHVzX2JpdHM7Ci0JCXJwLT5zdGF0c19tc2cuZnJhbWVfaWQgPSAoKHN0cnVjdCB2ZmVfbWVzc2FnZSAqKQotCQkJcnAtPmV2dF9tc2cuZGF0YSktPl91Lm1zZ1N0YXRzLmZyYW1lQ291bnRlcjsKLQotCQlycC0+c3RhdHNfbXNnLmFlY19idWZmID0gKChzdHJ1Y3QgdmZlX21lc3NhZ2UgKikKLQkJCXJwLT5ldnRfbXNnLmRhdGEpLT5fdS5tc2dTdGF0cy5idWZmLmFlYzsKLQkJcnAtPnN0YXRzX21zZy5hd2JfYnVmZiA9ICgoc3RydWN0IHZmZV9tZXNzYWdlICopCi0JCQlycC0+ZXZ0X21zZy5kYXRhKS0+X3UubXNnU3RhdHMuYnVmZi5hd2I7Ci0JCXJwLT5zdGF0c19tc2cuYWZfYnVmZiA9ICgoc3RydWN0IHZmZV9tZXNzYWdlICopCi0JCQlycC0+ZXZ0X21zZy5kYXRhKS0+X3UubXNnU3RhdHMuYnVmZi5hZjsKLQkJcnAtPnN0YXRzX21zZy5paGlzdF9idWZmID0gKChzdHJ1Y3QgdmZlX21lc3NhZ2UgKikKLQkJCXJwLT5ldnRfbXNnLmRhdGEpLT5fdS5tc2dTdGF0cy5idWZmLmloaXN0OwotCQlycC0+c3RhdHNfbXNnLnJzX2J1ZmYgPSAoKHN0cnVjdCB2ZmVfbWVzc2FnZSAqKQotCQkJcnAtPmV2dF9tc2cuZGF0YSktPl91Lm1zZ1N0YXRzLmJ1ZmYucnM7Ci0JCXJwLT5zdGF0c19tc2cuY3NfYnVmZiA9ICgoc3RydWN0IHZmZV9tZXNzYWdlICopCi0JCQlycC0+ZXZ0X21zZy5kYXRhKS0+X3UubXNnU3RhdHMuYnVmZi5jczsKLQkJcnAtPnN0YXRzX21zZy5hd2JfeW1pbiA9ICgoc3RydWN0IHZmZV9tZXNzYWdlICopCi0JCQlycC0+ZXZ0X21zZy5kYXRhKS0+X3UubXNnU3RhdHMuYnVmZi5hd2JfeW1pbjsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TR19JRF9TWU5DX1RJTUVSMF9ET05FOgotCQlycC0+dHlwZSA9IFZGRV9NU0dfU1lOQ19USU1FUjA7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU0dfSURfU1lOQ19USU1FUjFfRE9ORToKLQkJcnAtPnR5cGUgPSBWRkVfTVNHX1NZTkNfVElNRVIxOwotCQlicmVhazsKLQotCWNhc2UgTVNHX0lEX1NZTkNfVElNRVIyX0RPTkU6Ci0JCXJwLT50eXBlID0gVkZFX01TR19TWU5DX1RJTUVSMjsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlycC0+dHlwZSA9IFZGRV9NU0dfR0VORVJBTDsKLQkJYnJlYWs7Ci0JfQotCi0JLyogc2F2ZSB0aGUgZnJhbWUgaWQuKi8KLQlycC0+ZXZ0X21zZy5mcmFtZV9pZCA9IHJwLT5waHkuZnJhbWVfaWQ7Ci0KLQl2ZmUzMV9jdHJsLT5yZXNwLT52ZmVfcmVzcChycCwgTVNNX0NBTV9RX1ZGRV9NU0csIHZmZTMxX2N0cmwtPnN5bmNkYXRhLAotCQlHRlBfQVRPTUlDKTsKLX0KLQotc3RhdGljIHZvaWQgdmZlX3NlbmRfb3V0bXNnKHVpbnQ4X3QgbXNnaWQsIHVpbnQzMl90IHAwX2FkZHIsCi0JdWludDMyX3QgcDFfYWRkciwgdWludDMyX3QgcDJfYWRkcikKLXsKLQlzdHJ1Y3QgdmZlX21lc3NhZ2UgbXNnOwotCXVpbnQ4X3Qgb3V0aWQ7Ci0KLQltc2cuX2QgPSBtc2dpZDsgICAvKiBub3cgdGhlIG91dHB1dCBtb2RlIGlzIHJlZHVuZG5hdC4gKi8KLQltc2cuX3UubXNnT3V0LmZyYW1lQ291bnRlciA9IHZmZTMxX2N0cmwtPnZmZUZyYW1lSWQ7Ci0KLQlzd2l0Y2ggKG1zZ2lkKSB7Ci0JY2FzZSBNU0dfSURfT1VUUFVUX1A6Ci0JCW91dGlkID0gT1VUUFVUX1RZUEVfUDsKLQkJYnJlYWs7Ci0JY2FzZSBNU0dfSURfT1VUUFVUX1Y6Ci0JCW91dGlkID0gT1VUUFVUX1RZUEVfVjsKLQkJYnJlYWs7Ci0JY2FzZSBNU0dfSURfT1VUUFVUX1Q6Ci0JCW91dGlkID0gT1VUUFVUX1RZUEVfVDsKLQkJYnJlYWs7Ci0JY2FzZSBNU0dfSURfT1VUUFVUX1M6Ci0JCW91dGlkID0gT1VUUFVUX1RZUEVfUzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJb3V0aWQgPSAweGZmOyAgLyogLTEgZm9yIGVycm9yIGNvbmRpdGlvbi4qLwotCQlicmVhazsKLQl9Ci0JbXNnLl91Lm1zZ091dC5vdXRwdXRfaWQgICA9IG1zZ2lkOwotCW1zZy5fdS5tc2dPdXQucDBfYWRkciAgICAgPSBwMF9hZGRyOwotCW1zZy5fdS5tc2dPdXQucDFfYWRkciAgICAgPSBwMV9hZGRyOwotCW1zZy5fdS5tc2dPdXQucDJfYWRkciAgICAgPSBwMl9hZGRyOwotCUNEQkcoIiVzIHAyX2FkZHIgPSAweCV4XG4iLCBfX2Z1bmNfXywgcDJfYWRkcik7Ci0JdmZlMzFfcHJvY19vcHMobXNnaWQsICZtc2csIHNpemVvZihzdHJ1Y3QgdmZlX21lc3NhZ2UpKTsKLQlyZXR1cm47Ci19Ci1zdGF0aWMgaW50IHZmZTMxX2VuYWJsZShzdHJ1Y3QgY2FtZXJhX2VuYWJsZV9jbWQgKmVuYWJsZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfc3RvcCh2b2lkKQotewotCWF0b21pY19zZXQoJnZmZTMxX2N0cmwtPnZzdGF0ZSwgMCk7Ci0JYXRvbWljX3NldCgmdmZlMzFfY3RybC0+c3RvcF9hY2tfcGVuZGluZywgMSk7Ci0KLQkvKiBpbiBlaXRoZXIgY29udGludW91cyBvciBzbmFwc2hvdCBtb2RlLCBzdG9wIGNvbW1hbmQgY2FuIGJlIGlzc3VlZAotCSAqIGF0IGFueSB0aW1lLiBzdG9wIGNhbWlmIGltbWVkaWF0ZWx5LiAqLwotCW1zbV9jYW1lcmFfaW9fd19tYihDQU1JRl9DT01NQU5EX1NUT1BfSU1NRURJQVRFTFksCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQ0FNSUZfQ09NTUFORCk7Ci0KLQkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzLiAgKi8KLQltc21fY2FtZXJhX2lvX3coVkZFX0RJU0FCTEVfQUxMX0lSUVMsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX01BU0tfMCk7Ci0JbXNtX2NhbWVyYV9pb193KFZGRV9ESVNBQkxFX0FMTF9JUlFTLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9NQVNLXzEpOwotCi0JLyogY2xlYXIgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyovCi0JbXNtX2NhbWVyYV9pb193KFZGRV9DTEVBUl9BTExfSVJRUywKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ0xFQVJfMCk7Ci0JbXNtX2NhbWVyYV9pb193KFZGRV9DTEVBUl9BTExfSVJRUywKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ0xFQVJfMSk7Ci0JLyogRW5zdXJlIHRoZSB3cml0ZSBvcmRlciB3aGlsZSB3cml0aW5nCi0JdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdXNpbmcgdGhlIGJhcnJpZXIgKi8KLQltc21fY2FtZXJhX2lvX3dfbWIoMSwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ01EKTsKLQotCS8qIG5vdyBlbmFibGUgb25seSBoYWx0X2lycSAmIHJlc2V0X2lycSAqLwotCW1zbV9jYW1lcmFfaW9fdygweGYwMDAwMDAwLCAgICAgICAgICAvKiB0aGlzIGlzIGZvciBhc3luYyB0aW1lci4gKi8KLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfTUFTS18wKTsKLQltc21fY2FtZXJhX2lvX3coVkZFX0lNQVNLX0FYSV9IQUxULAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9NQVNLXzEpOwotCi0JLyogdGhlbiBhcHBseSBheGkgaGFsdCBjb21tYW5kLiAqLwotCW1zbV9jYW1lcmFfaW9fd19tYihBWElfSEFMVCwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9BWElfQ01EKTsKLX0KLQotc3RhdGljIGludCB2ZmUzMV9kaXNhYmxlKHN0cnVjdCBjYW1lcmFfZW5hYmxlX2NtZCAqZW5hYmxlLAotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQltc21fY2FtaW9fc2V0X3BlcmZfbHZsKFNfRVhJVCk7Ci0JbXNtX2NhbWlvX2Rpc2FibGUoZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZmUzMV9hZGRfZnJlZV9idWYyKHN0cnVjdCB2ZmUzMV9vdXRwdXRfY2ggKm91dGNoLAotCXVpbnQzMl90IHBhZGRyLCB1aW50MzJfdCBwMF9vZmYsIHVpbnQzMl90IHAxX29mZiwgdWludDMyX3QgcDJfb2ZmKQotewotCXN0cnVjdCB2ZmUzMV9mcmVlX2J1ZiAqZnJlZV9idWYgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCWZyZWVfYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZmZTMxX2ZyZWVfYnVmKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFmcmVlX2J1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmb3V0Y2gtPmZyZWVfYnVmX2xvY2ssIGZsYWdzKTsKLQlmcmVlX2J1Zi0+cGFkZHIgPSBwYWRkcjsKLQlmcmVlX2J1Zi0+cGxhbmFyMF9vZmYgPSBwMF9vZmY7Ci0JZnJlZV9idWYtPnBsYW5hcjFfb2ZmID0gcDFfb2ZmOwotCWZyZWVfYnVmLT5wbGFuYXIyX29mZiA9IHAyX29mZjsKLQlsaXN0X2FkZF90YWlsKCZmcmVlX2J1Zi0+bm9kZSwgJm91dGNoLT5mcmVlX2J1Zl9oZWFkKTsKLQotCUNEQkcoIiVzOiBmcmVlX2J1ZiBwYWRkciA9IDB4JXgsIHlfb2ZmID0gJWQsIGNiY3Jfb2ZmID0gJWRcbiIsCi0JCV9fZnVuY19fLCBmcmVlX2J1Zi0+cGFkZHIsIGZyZWVfYnVmLT5wbGFuYXIwX29mZiwKLQkJZnJlZV9idWYtPnBsYW5hcjFfb2ZmKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvdXRjaC0+ZnJlZV9idWZfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIHZmZTMxX2FkZF9mcmVlX2J1ZihvdXRjaCwgcmVncHRyKSBcCi0JdmZlMzFfYWRkX2ZyZWVfYnVmMihvdXRjaCwgcmVncHRyLT5wYWRkciwgXAotCXJlZ3B0ci0+aW5mby5wbGFuYXIwX29mZiwJXAotCXJlZ3B0ci0+aW5mby5wbGFuYXIxX29mZiwJXAotCXJlZ3B0ci0+aW5mby5wbGFuYXIyX29mZikKLQotI2RlZmluZSB2ZmUzMV9mcmVlX2J1Zl9hdmFpbGFibGUob3V0Y2gpIFwKLQkoIWxpc3RfZW1wdHkoJm91dGNoLmZyZWVfYnVmX2hlYWQpKQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB2ZmUzMV9mcmVlX2J1ZiAqdmZlMzFfZ2V0X2ZyZWVfYnVmKAotCXN0cnVjdCB2ZmUzMV9vdXRwdXRfY2ggKm91dGNoKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXN0cnVjdCB2ZmUzMV9mcmVlX2J1ZiAqZnJlZV9idWYgPSBOVUxMOwotCXNwaW5fbG9ja19pcnFzYXZlKCZvdXRjaC0+ZnJlZV9idWZfbG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmb3V0Y2gtPmZyZWVfYnVmX2hlYWQpKSB7Ci0JCWZyZWVfYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmb3V0Y2gtPmZyZWVfYnVmX2hlYWQsCi0JCQlzdHJ1Y3QgdmZlMzFfZnJlZV9idWYsIG5vZGUpOwotCQlpZiAoZnJlZV9idWYpCi0JCQlsaXN0X2RlbF9pbml0KCZmcmVlX2J1Zi0+bm9kZSk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm91dGNoLT5mcmVlX2J1Zl9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGZyZWVfYnVmOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdmZlMzFfcmVzZXRfZnJlZV9idWZfcXVldWUoCi0Jc3RydWN0IHZmZTMxX291dHB1dF9jaCAqb3V0Y2gpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0Jc3RydWN0IHZmZTMxX2ZyZWVfYnVmICpmcmVlX2J1ZiA9IE5VTEw7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJm91dGNoLT5mcmVlX2J1Zl9sb2NrLCBmbGFncyk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZvdXRjaC0+ZnJlZV9idWZfaGVhZCkpIHsKLQkJZnJlZV9idWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZvdXRjaC0+ZnJlZV9idWZfaGVhZCwKLQkJCXN0cnVjdCB2ZmUzMV9mcmVlX2J1Ziwgbm9kZSk7Ci0JCWlmIChmcmVlX2J1ZikgewotCQkJbGlzdF9kZWxfaW5pdCgmZnJlZV9idWYtPm5vZGUpOwotCQkJa2ZyZWUoZnJlZV9idWYpOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm91dGNoLT5mcmVlX2J1Zl9sb2NrLCBmbGFncyk7Ci19Ci0KLSNkZWZpbmUgdmZlMzFfaW5pdF9mcmVlX2J1Zl9xdWV1ZSgpIGRvIHsJXAotCUlOSVRfTElTVF9IRUFEKCZ2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuZnJlZV9idWZfaGVhZCk7CVwKLQlJTklUX0xJU1RfSEVBRCgmdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmZyZWVfYnVmX2hlYWQpOwlcCi0JSU5JVF9MSVNUX0hFQUQoJnZmZTMxX2N0cmwtPm91dHBhdGgub3V0Mi5mcmVlX2J1Zl9oZWFkKTsJXAotCXNwaW5fbG9ja19pbml0KCZ2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuZnJlZV9idWZfbG9jayk7CVwKLQlzcGluX2xvY2tfaW5pdCgmdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmZyZWVfYnVmX2xvY2spOwlcCi0Jc3Bpbl9sb2NrX2luaXQoJnZmZTMxX2N0cmwtPm91dHBhdGgub3V0Mi5mcmVlX2J1Zl9sb2NrKTsJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSB2ZmUzMV9yZXNldF9mcmVlX2J1Zl9xdWV1ZV9hbGwoKSBkbyB7CVwKLQl2ZmUzMV9yZXNldF9mcmVlX2J1Zl9xdWV1ZSgmdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwKTsJXAotCXZmZTMxX3Jlc2V0X2ZyZWVfYnVmX3F1ZXVlKCZ2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEpOwlcCi0JdmZlMzFfcmVzZXRfZnJlZV9idWZfcXVldWUoJnZmZTMxX2N0cmwtPm91dHBhdGgub3V0Mik7CVwKLX0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbnQgdmZlMzFfY29uZmlnX2F4aShpbnQgbW9kZSwgc3RydWN0IGF4aWRhdGEgKmFkLCB1aW50MzJfdCAqYW8pCi17Ci0JaW50IGk7Ci0JdWludDMyX3QgKnAsICpwMSwgKnAyLCAqcDM7Ci0JaW50MzJfdCAqY2hfaW5mbzsKLQlzdHJ1Y3QgdmZlMzFfb3V0cHV0X2NoICpvdXRwMSwgKm91dHAyLCAqb3V0cDM7Ci0Jc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiAqcmVncDEgPSBOVUxMOwotCXN0cnVjdCBtc21fcG1lbV9yZWdpb24gKnJlZ3AyID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uICpyZWdwMyA9IE5VTEw7Ci0JaW50IHJldDsKLQlzdHJ1Y3QgbXNtX3N5bmMqIHBfc3luYyA9IChzdHJ1Y3QgbXNtX3N5bmMgKil2ZmVfc3luY2RhdGE7Ci0KLQlvdXRwMSA9IE5VTEw7Ci0Jb3V0cDIgPSBOVUxMOwotCW91dHAzID0gTlVMTDsKLQotCXAgPSBhbyArIDI7Ci0KLQkvKiBVcGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgd3JpdGUgbWFzdGVycyBmb3IgZWFjaCBvdXRwdXQqLwotCWNoX2luZm8gPSBhbyArIFYzMV9BWElfQ0ZHX0xFTjsKLQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwID0gMHgwMDAwRkZGRiAmICpjaF9pbmZvOwotCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDEgPSAweDAwMDBGRkZGICYgKCpjaF9pbmZvKysgPj4gMTYpOwotCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDIgPSAweDAwMDBGRkZGICYgKmNoX2luZm8rKzsKLQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwID0gMHgwMDAwRkZGRiAmICpjaF9pbmZvOwotCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDEgPSAweDAwMDBGRkZGICYgKCpjaF9pbmZvKysgPj4gMTYpOwotCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDIgPSAweDAwMDBGRkZGICYgKmNoX2luZm8rKzsKLQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDIuY2gwID0gMHgwMDAwRkZGRiAmICpjaF9pbmZvOwotCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0Mi5jaDEgPSAweDAwMDBGRkZGICYgKCpjaF9pbmZvKysgPj4gMTYpOwotCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0Mi5jaDIgPSAweDAwMDBGRkZGICYgKmNoX2luZm8rKzsKLQotCUNEQkcoInZmZTMxX2NvbmZpZ19heGk6IG1vZGUgPSAlZCwgYnVmbnVtMSA9ICVkLCBidWZudW0yID0gJWQiCi0JCSJidWZudW0zID0gJWQiLCBtb2RlLCBhZC0+YnVmbnVtMSwgYWQtPmJ1Zm51bTIsIGFkLT5idWZudW0zKTsKLQotCXN3aXRjaCAobW9kZSkgewotCi0JY2FzZSBPVVRQVVRfMjogewotCQlpZiAoYWQtPmJ1Zm51bTIgIT0gMykKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZWdwMSA9ICYoYWQtPnJlZ2lvblthZC0+YnVmbnVtMV0pOwotCQlvdXRwMSA9ICYodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwKTsKLQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSB8PSBWRkUzMV9PVVRQVVRfTU9ERV9QVDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCQlwMSA9IGFvICsgNiArIGk7ICAgIC8qIHdtMCBmb3IgeSAgKi8KLQkJCSpwMSA9IChyZWdwMS0+cGFkZHIgKyByZWdwMS0+aW5mby5wbGFuYXIwX29mZik7Ci0KLQkJCXAxID0gYW8gKyAxMiArIGk7ICAvKiB3bTEgZm9yIGNiY3IgKi8KLQkJCSpwMSA9IChyZWdwMS0+cGFkZHIgKyByZWdwMS0+aW5mby5wbGFuYXIxX29mZik7Ci0JCQlyZWdwMSsrOwotCQl9Ci0JCXJldCA9IHZmZTMxX2FkZF9mcmVlX2J1ZihvdXRwMSwgcmVncDEpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgT1VUUFVUXzFfQU5EXzI6Ci0JCS8qIHVzZSB3bTAmIDQgZm9yIHRodW1ibmFpbCwgd20xJjUgZm9yIG1haW4gaW1hZ2UuKi8KLQkJaWYgKChhZC0+YnVmbnVtMSA8IDEpIHx8IChhZC0+YnVmbnVtMiA8IDEpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgfD0KLQkJCVZGRTMxX09VVFBVVF9NT0RFX1M7ICAvKiBtYWluIGltYWdlLiovCi0JCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgfD0KLQkJCVZGRTMxX09VVFBVVF9NT0RFX1BUOyAgLyogdGh1bWJuYWlsLiAqLwotCi0JCS8qIHRoaXMgaXMgdGh1bWJuYWlsIGJ1ZmZlci4gKi8KLQkJcmVncDEgPSAmKGFkLT5yZWdpb25bYWQtPmJ1Zm51bTEtMV0pOwotCQkvKiB0aGlzIGlzIG1haW4gaW1hZ2UgYnVmZmVyLiAqLwotCQlyZWdwMiA9ICYoYWQtPnJlZ2lvblthZC0+YnVmbnVtMSthZC0+YnVmbnVtMi0xXSk7Ci0KLQkJb3V0cDEgPSAmKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MCk7Ci0JCW91dHAyID0gJih2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEpOyAvKiBzbmFwc2hvdCAqLwotCi0JCS8qICBQYXJzZSB0aGUgYnVmZmVycyEhISAqLwotCQlpZiAoYWQtPmJ1Zm51bTIgPT0gMSkgewkvKiBhc3N1bWluZyBidWZudW0xID0gYnVmbnVtMiAqLwotCQkJcDEgPSBhbyArIDY7ICAgLyogd20wIHBpbmcgKi8KLQkJCSpwMSsrID0gKHJlZ3AxLT5wYWRkciArIHJlZ3AxLT5pbmZvLnBsYW5hcjBfb2ZmKTsKLQotCQkJLyogdGhpcyBpcyB0byBkdXBsaWNhdGUgcGluZyBhZGRyZXNzIHRvIHBvbmcuKi8KLQkJCSpwMSA9IChyZWdwMS0+cGFkZHIgKyByZWdwMS0+aW5mby5wbGFuYXIwX29mZik7Ci0KLQkJCXAxID0gYW8gKyAzMDsgIC8qIHdtNCBwaW5nICovCi0JCQkqcDErKyA9IChyZWdwMS0+cGFkZHIgKyByZWdwMS0+aW5mby5wbGFuYXIxX29mZik7Ci0JCQlDREJHKCIlczogcmVncDEtPmluZm8uY2Jjcl9vZmYgPSAweCV4XG4iLCBfX2Z1bmNfXywKLQkJCQkJCSByZWdwMS0+aW5mby5wbGFuYXIxX29mZik7Ci0KLQkJCS8qIHRoaXMgaXMgdG8gZHVwbGljYXRlIHBpbmcgYWRkcmVzcyB0byBwb25nLiovCi0JCQkqcDEgPSAocmVncDEtPnBhZGRyICsgcmVncDEtPmluZm8ucGxhbmFyMV9vZmYpOwotCi0JCQlwMSA9IGFvICsgMTI7ICAgLyogd20xIHBpbmcgKi8KLQkJCSpwMSsrID0gKHJlZ3AyLT5wYWRkciArIHJlZ3AyLT5pbmZvLnBsYW5hcjBfb2ZmKTsKLQotCQkJLyogcG9uZyA9IHBpbmcsKi8KLQkJCSpwMSA9IChyZWdwMi0+cGFkZHIgKyByZWdwMi0+aW5mby5wbGFuYXIwX29mZik7Ci0KLQkJCXAxID0gYW8gKyAzNjsgIC8qIHdtNSAqLwotCQkJKnAxKysgPSAocmVncDItPnBhZGRyICsgcmVncDItPmluZm8ucGxhbmFyMV9vZmYpOwotCQkJQ0RCRygiJXM6IHJlZ3AyLT5pbmZvLmNiY3Jfb2ZmID0gMHgleFxuIiwgX19mdW5jX18sCi0JCQkJCQkgcmVncDItPmluZm8ucGxhbmFyMV9vZmYpOwotCi0JCQkvKiBwb25nID0gcGluZywqLwotCQkJKnAxID0gKHJlZ3AyLT5wYWRkciArIHJlZ3AyLT5pbmZvLnBsYW5hcjFfb2ZmKTsKLQkJfSBlbHNlIHsgLyogbW9yZSB0aGFuIG9uZSBzbmFwc2hvdCAqLwotCQkJLyogZmlyc3QgZmlsbCBwaW5nICYgcG9uZyAqLwotCQkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQkJCXAxID0gYW8gKyA2ICsgaTsgICAgLyogd20wIGZvciB5ICAqLwotCQkJCSpwMSA9IChyZWdwMS0+cGFkZHIgKyByZWdwMS0+aW5mby5wbGFuYXIwX29mZik7Ci0JCQkJcDEgPSBhbyArIDMwICsgaTsgIC8qIHdtNCBmb3IgY2JjciAqLwotCQkJCSpwMSA9IChyZWdwMS0+cGFkZHIgKyByZWdwMS0+aW5mby5wbGFuYXIxX29mZik7Ci0JCQkJcmVncDEtLTsKLQkJCX0KLQotCQkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQkJCXAyID0gYW8gKyAxMiArIGk7ICAgIC8qIHdtMSBmb3IgeSAgKi8KLQkJCQkqcDIgPSAocmVncDItPnBhZGRyICsgcmVncDItPmluZm8ucGxhbmFyMF9vZmYpOwotCQkJCXAyID0gYW8gKyAzNiArIGk7ICAvKiB3bTUgZm9yIGNiY3IgKi8KLQkJCQkqcDIgPSAocmVncDItPnBhZGRyICsgcmVncDItPmluZm8ucGxhbmFyMV9vZmYpOwotCQkJCXJlZ3AyLS07Ci0JCQl9Ci0KLQkJCWZvciAoaSA9IDI7IGkgPCBhZC0+YnVmbnVtMTsgaSsrKSB7Ci0JCQkJcmV0ID0gdmZlMzFfYWRkX2ZyZWVfYnVmKG91dHAxLCByZWdwMSk7Ci0JCQkJaWYgKHJldCA8IDApCi0JCQkJCXJldHVybiByZXQ7Ci0JCQkJcmVncDEtLTsKLQkJCX0KLQotCQkJZm9yIChpID0gMjsgaSA8IGFkLT5idWZudW0yOyBpKyspIHsKLQkJCQlyZXQgPSB2ZmUzMV9hZGRfZnJlZV9idWYob3V0cDIsIHJlZ3AyKTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJcmV0dXJuIHJldDsKLQkJCQlyZWdwMi0tOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBPVVRQVVRfMV8yX0FORF8zOgotCQlDREJHKCIlczogT1VUUFVUXzFfMl9BTkRfMyIsIF9fZnVuY19fKTsKLQkJQ0RCRygiJXM6ICVkICVkICVkIiwgX19mdW5jX18sIGFkLT5idWZudW0xLCBhZC0+YnVmbnVtMiwKLQkJCWFkLT5idWZudW0zKTsKLQkJLyogdXNlIHdtMCYgNCBmb3IgcG9zdHZpZXcsIHdtMSY1IGZvciBwcmV2aWV3LiovCi0JCS8qIHVzZSB3bTImIDYgZm9yIG1haW4gaW1nICovCi0JCWlmICgoYWQtPmJ1Zm51bTEgPCAxKSB8fCAoYWQtPmJ1Zm51bTIgPCAxKSB8fCAoYWQtPmJ1Zm51bTMgPCAxKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkUzMV9PVVRQVVRfTU9ERV9TOyAgLyogbWFpbiBpbWFnZS4qLwotCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkUzMV9PVVRQVVRfTU9ERV9QOyAgLyogcHJldmlldy4gKi8KLQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSB8PQotCQkJVkZFMzFfT1VUUFVUX01PREVfVDsgIC8qIHRodW1ibmFpbC4gKi8KLQotCQkvKiB0aGlzIGlzIHByZXZpZXcgYnVmZmVyLiAqLwotCQlyZWdwMSA9ICYoYWQtPnJlZ2lvblswXSk7Ci0JCS8qIHRoaXMgaXMgdGh1bWJuYWlsIGJ1ZmZlci4gKi8KLQkJcmVncDIgPSAmKGFkLT5yZWdpb25bYWQtPmJ1Zm51bTFdKTsKLQkJLyogdGhpcyBpcyBtYWluIGltYWdlIGJ1ZmZlci4gKi8KLQkJcmVncDMgPSAmKGFkLT5yZWdpb25bYWQtPmJ1Zm51bTErYWQtPmJ1Zm51bTJdKTsKLQkJb3V0cDEgPSAmKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MCk7Ci0JCW91dHAyID0gJih2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEpOwotCQlvdXRwMyA9ICYodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyKTsKLQotCQkvKiAgUGFyc2UgdGhlIGJ1ZmZlcnMhISEgKi8KLQkJLyogZmlyc3QgZmlsbCBwaW5nICYgcG9uZyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCQlwMSA9IGFvICsgNiArIGk7ICAgIC8qIHdtMCBmb3IgeSAgKi8KLQkJCSpwMSA9IChyZWdwMS0+cGFkZHIgKyByZWdwMS0+aW5mby5wbGFuYXIwX29mZik7Ci0JCQlwMSA9IGFvICsgMzAgKyBpOyAgLyogd200IGZvciBjYmNyICovCi0JCQkqcDEgPSAocmVncDEtPnBhZGRyICsgcmVncDEtPmluZm8ucGxhbmFyMV9vZmYpOwotCQkJcmVncDErKzsKLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJCXAyID0gYW8gKyAxMiArIGk7ICAgIC8qIHdtMSBmb3IgeSAgKi8KLQkJCSpwMiA9IChyZWdwMi0+cGFkZHIgKyByZWdwMi0+aW5mby5wbGFuYXIwX29mZik7Ci0JCQlwMiA9IGFvICsgMzYgKyBpOyAgLyogd201IGZvciBjYmNyICovCi0JCQkqcDIgPSAocmVncDItPnBhZGRyICsgcmVncDItPmluZm8ucGxhbmFyMV9vZmYpOwotCQkJcmVncDIrKzsKLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJCXAzID0gYW8gKyAxOCArIGk7ICAgIC8qIHdtMiBmb3IgeSAgKi8KLQkJCSpwMyA9IChyZWdwMy0+cGFkZHIgKyByZWdwMy0+aW5mby5wbGFuYXIwX29mZik7Ci0JCQlwMyA9IGFvICsgNDIgKyBpOyAgLyogd202IGZvciBjYmNyICovCi0JCQkqcDMgPSAocmVncDMtPnBhZGRyICsgcmVncDMtPmluZm8ucGxhbmFyMV9vZmYpOwotCQkJcmVncDMrKzsKLQkJfQotCi0JCWZvciAoaSA9IDI7IGkgPCBhZC0+YnVmbnVtMTsgaSsrKSB7Ci0JCQlyZXQgPSB2ZmUzMV9hZGRfZnJlZV9idWYob3V0cDEsIHJlZ3AxKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQ7Ci0JCQlyZWdwMSsrOwotCQl9Ci0KLQkJZm9yIChpID0gMjsgaSA8IGFkLT5idWZudW0yOyBpKyspIHsKLQkJCXJldCA9IHZmZTMxX2FkZF9mcmVlX2J1ZihvdXRwMiwgcmVncDIpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKLQkJCXJlZ3AyKys7Ci0JCX0KLQotCQlmb3IgKGkgPSAyOyBpIDwgYWQtPmJ1Zm51bTM7IGkrKykgewotCQkJcmV0ID0gdmZlMzFfYWRkX2ZyZWVfYnVmKG91dHAzLCByZWdwMyk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OwotCQkJcmVncDMrKzsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgT1VUUFVUX1pTTF9BTExfQ0hOTFM6Ci0JCUNEQkcoIiVzOiBPVVRQVVRfWlNMX0FMTF9DSE5MUyIsIF9fZnVuY19fKTsKLQkJQ0RCRygiJXM6ICVkICVkICVkIiwgX19mdW5jX18sIGFkLT5idWZudW0xLCBhZC0+YnVmbnVtMiwKLQkJCWFkLT5idWZudW0zKTsKLQkJLyogdXNlIHdtMCYgNCBmb3IgcG9zdHZpZXcsIHdtMSY1IGZvciBwcmV2aWV3LiovCi0JCS8qIHVzZSB3bTImIDYgZm9yIG1haW4gaW1nICovCi0JCWlmICgoYWQtPmJ1Zm51bTEgPCAxKSB8fCAoYWQtPmJ1Zm51bTIgPCAxKSB8fCAoYWQtPmJ1Zm51bTMgPCAxKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkUzMV9PVVRQVVRfTU9ERV9TOyAgLyogbWFpbiBpbWFnZS4qLwotCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkUzMV9PVVRQVVRfTU9ERV9QX0FMTF9DSE5MUzsgIC8qIHByZXZpZXcuICovCi0JCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgfD0KLQkJCVZGRTMxX09VVFBVVF9NT0RFX1Q7ICAvKiB0aHVtYm5haWwuICovCi0KLQkJLyogdGhpcyBpcyBwcmV2aWV3IGJ1ZmZlci4gKi8KLQkJcmVncDEgPSAmKGFkLT5yZWdpb25bMF0pOwotCQkvKiB0aGlzIGlzIHRodW1ibmFpbCBidWZmZXIuICovCi0JCXJlZ3AyID0gJihhZC0+cmVnaW9uW2FkLT5idWZudW0xXSk7Ci0JCS8qIHRoaXMgaXMgbWFpbiBpbWFnZSBidWZmZXIuICovCi0JCXJlZ3AzID0gJihhZC0+cmVnaW9uW2FkLT5idWZudW0xK2FkLT5idWZudW0yXSk7Ci0JCW91dHAxID0gJih2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDApOwotCQlvdXRwMiA9ICYodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxKTsKLQkJb3V0cDMgPSAmKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0Mik7Ci0KLQkJLyogIFBhcnNlIHRoZSBidWZmZXJzISEhICovCi0JCS8qIGZpcnN0IGZpbGwgcGluZyAmIHBvbmcgKi8KLQkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQkJcDEgPSBhbyArIDYgKyBpOyAgICAvKiB3bTAgZm9yIHkgICovCi0JCQkqcDEgPSAocmVncDItPnBhZGRyICsgcmVncDItPmluZm8ucGxhbmFyMF9vZmYpOwotCQkJcDEgPSBhbyArIDEyICsgaTsgIC8qIHdtMSBmb3IgY2JjciAqLwotCQkJKnAxID0gKHJlZ3AyLT5wYWRkciArIHJlZ3AyLT5pbmZvLnBsYW5hcjFfb2ZmKTsKLQkJCXJlZ3AyKys7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCQlwMiA9IGFvICsgMzAgKyBpOyAgICAvKiB3bTQgZm9yIHkgICovCi0JCQkqcDIgPSAocmVncDEtPnBhZGRyICsgcmVncDEtPmluZm8ucGxhbmFyMF9vZmYpOwotCQkJcDIgPSBhbyArIDM2ICsgaTsgIC8qIHdtNSBmb3IgY2JjciAqLwotCQkJKnAyID0gKHJlZ3AxLT5wYWRkciArIHJlZ3AxLT5pbmZvLnBsYW5hcjFfb2ZmKTsKLQkJCXAyID0gYW8gKyA0MiArIGk7ICAvKiB3bTUgZm9yIGNiY3IgKi8KLQkJCSpwMiA9IChyZWdwMS0+cGFkZHIgKyByZWdwMS0+aW5mby5wbGFuYXIyX29mZik7Ci0JCQlyZWdwMSsrOwotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQkJcDMgPSBhbyArIDE4ICsgaTsgICAgLyogd20yIGZvciB5ICAqLwotCQkJKnAzID0gKHJlZ3AzLT5wYWRkciArIHJlZ3AzLT5pbmZvLnBsYW5hcjBfb2ZmKTsKLQkJCXAzID0gYW8gKyAyNCArIGk7ICAvKiB3bTMgZm9yIGNiY3IgKi8KLQkJCSpwMyA9IChyZWdwMy0+cGFkZHIgKyByZWdwMy0+aW5mby5wbGFuYXIxX29mZik7Ci0JCQlyZWdwMysrOwotCQl9Ci0JCWZvciAoaSA9IDI7IGkgPCBhZC0+YnVmbnVtMTsgaSsrKSB7Ci0JCQlyZXQgPSB2ZmUzMV9hZGRfZnJlZV9idWYob3V0cDEsIHJlZ3AxKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQ7Ci0JCQlyZWdwMSsrOwotCQl9Ci0KLQkJZm9yIChpID0gMjsgaSA8IGFkLT5idWZudW0yOyBpKyspIHsKLQkJCXJldCA9IHZmZTMxX2FkZF9mcmVlX2J1ZihvdXRwMiwgcmVncDIpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKLQkJCXJlZ3AyKys7Ci0JCX0KLQotCQlmb3IgKGkgPSAyOyBpIDwgYWQtPmJ1Zm51bTM7IGkrKykgewotCQkJcmV0ID0gdmZlMzFfYWRkX2ZyZWVfYnVmKG91dHAzLCByZWdwMyk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OwotCQkJcmVncDMrKzsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgT1VUUFVUXzFfQU5EXzM6IHsKLQkJLyogdXNlIHdtMCY0IGZvciBwcmV2aWV3LCB3bTEmNSBmb3IgdmlkZW8uKi8KLQkJaWYgKChhZC0+YnVmbnVtMSA8IDIpIHx8IChhZC0+YnVmbnVtMiA8IDIpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLSNpZmRlZiBDT05GSUdfTVNNX0NBTUVSQV9WNEwyCi0JCSpwKysgPSAweDE7ICAgIC8qIHhiYXIgY2ZnMCAqLwotCQkqcCA9IDB4MWEwMzsgICAgLyogeGJhciBjZmcxICovCi0jZW5kaWYKLQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSB8PQotCQkJVkZFMzFfT1VUUFVUX01PREVfVjsgIC8qIHZpZGVvKi8KLQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSB8PQotCQkJVkZFMzFfT1VUUFVUX01PREVfUFQ7ICAvKiBwcmV2aWV3ICovCi0KLQkJcmVncDEgPSAmKGFkLT5yZWdpb25bMF0pOyAvKiB0aGlzIGlzIHByZXZpZXcgYnVmZmVyLiAqLwotCQlyZWdwMiA9ICYoYWQtPnJlZ2lvblthZC0+YnVmbnVtMV0pOy8qIHRoaXMgaXMgdmlkZW8gYnVmZmVyLiAqLwotCQlvdXRwMSA9ICYodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwKTsgLyogcHJldmlldyAqLwotCQlvdXRwMiA9ICYodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyKTsgLyogdmlkZW8gKi8KLQotCi0JCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJCXAxID0gYW8gKyA2ICsgaTsgICAgLyogd20wIGZvciB5ICAqLwotCQkJKnAxID0gKHJlZ3AxLT5wYWRkciArIHJlZ3AxLT5pbmZvLnBsYW5hcjBfb2ZmKTsKLQotCQkJcDEgPSBhbyArIDMwICsgaTsgIC8qIHdtNCBmb3IgY2JjciAqLwotCQkJKnAxID0gKHJlZ3AxLT5wYWRkciArIHJlZ3AxLT5pbmZvLnBsYW5hcjFfb2ZmKTsKLQkJCXJlZ3AxKys7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCQlwMiA9IGFvICsgMTIgKyBpOyAgICAvKiB3bTEgZm9yIHkgICovCi0JCQkqcDIgPSAocmVncDItPnBhZGRyICsgcmVncDItPmluZm8ucGxhbmFyMF9vZmYpOwotCi0JCQlwMiA9IGFvICsgMzYgKyBpOyAgLyogd201IGZvciBjYmNyICovCi0JCQkqcDIgPSAocmVncDItPnBhZGRyICsgcmVncDItPmluZm8ucGxhbmFyMV9vZmYpOwotCQkJcmVncDIrKzsKLQkJfQotCQlmb3IgKGkgPSAyOyBpIDwgYWQtPmJ1Zm51bTE7IGkrKykgewotCQkJcmV0ID0gdmZlMzFfYWRkX2ZyZWVfYnVmKG91dHAxLCByZWdwMSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OwotCQkJcmVncDErKzsKLQkJfQotCi0JCWZvciAoaSA9IDI7IGkgPCBhZC0+YnVmbnVtMjsgaSsrKSB7Ci0JCQlyZXQgPSB2ZmUzMV9hZGRfZnJlZV9idWYob3V0cDIsIHJlZ3AyKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQ7Ci0JCQlyZWdwMisrOwotCQl9Ci0JfQotCQlicmVhazsKLQotCWNhc2UgT1VUUFVUX1ZJREVPX0FMTF9DSE5MUzogewotCQkvKiB1c2Ugd20wJjQgZm9yIHByZXZpZXcsIHdtMSY1IGZvciB2aWRlby4qLwotCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkUzMV9PVVRQVVRfTU9ERV9WOyAgLyogdmlkZW8qLwotCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkUzMV9PVVRQVVRfTU9ERV9QX0FMTF9DSE5MUzsKLQkJcmVncDEgPSAmKGFkLT5yZWdpb25bMF0pOwotCQlyZWdwMiA9ICYoYWQtPnJlZ2lvblthZC0+YnVmbnVtMV0pOwotCQlvdXRwMSA9ICYodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwKTsKLQkJb3V0cDIgPSAmKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0Mik7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQkJcDEgPSBhbyArIDYgKyBpOyAgICAvKiB3bTAgZm9yIHkgICovCi0JCQkqcDEgPSAocmVncDEtPnBhZGRyICsgcmVncDEtPmluZm8ucGxhbmFyMF9vZmYpOwotCi0JCQlwMSA9IGFvICsgMTIgKyBpOyAgLyogd20xIGZvciBjYmNyICovCi0JCQkqcDEgPSAocmVncDEtPnBhZGRyICsgcmVncDEtPmluZm8ucGxhbmFyMV9vZmYpOwotCi0JCQlwMSA9IGFvICsgMTggKyBpOyAgLyogd20yIGZvciBjYmNyICovCi0JCQkqcDEgPSAocmVncDEtPnBhZGRyICsgcmVncDEtPmluZm8ucGxhbmFyMl9vZmYpOwotCQkJcmVncDErKzsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCQlwMiA9IGFvICsgMzAgKyBpOyAgICAvKiB3bTQgZm9yIHkgICovCi0JCQkqcDIgPSAocmVncDItPnBhZGRyICsgcmVncDItPmluZm8ucGxhbmFyMF9vZmYpOwotCi0JCQlwMiA9IGFvICsgMzYgKyBpOyAgLyogd201IGZvciBjYmNyICovCi0JCQkqcDIgPSAocmVncDItPnBhZGRyICsgcmVncDItPmluZm8ucGxhbmFyMV9vZmYpOwotCQkJcmVncDIrKzsKLQkJfQotCQlmb3IgKGkgPSAyOyBpIDwgYWQtPmJ1Zm51bTE7IGkrKykgewotCQkJcmV0ID0gdmZlMzFfYWRkX2ZyZWVfYnVmKG91dHAxLCByZWdwMSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OwotCQkJcmVncDErKzsKLQkJfQotCQlmb3IgKGkgPSAyOyBpIDwgYWQtPmJ1Zm51bTI7IGkrKykgewotCQkJcmV0ID0gdmZlMzFfYWRkX2ZyZWVfYnVmKG91dHAyLCByZWdwMik7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OwotCQkJcmVncDIrKzsKLQkJfQotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENBTUlGX1RPX0FYSV9WSUFfT1VUUFVUXzI6IHsgIC8qIHVzZSB3bTAgb25seSAqLwotCQlpZiAoYWQtPmJ1Zm51bTIgPCAxKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCUNEQkcoImNvbmZpZyBheGkgZm9yIHJhdyBzbmFwc2hvdC5cbiIpOwotCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwID0gMDsgLyogcmF3ICovCi0JCXJlZ3AxID0gJihhZC0+cmVnaW9uW2FkLT5idWZudW0xXSk7Ci0JCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgfD0gVkZFMzFfT1VUUFVUX01PREVfUzsKLQkJcDEgPSBhbyArIDY7ICAgIC8qIHdtMCBmb3IgeSAgKi8KLQkJKnAxID0gKHJlZ3AxLT5wYWRkciArIHJlZ3AxLT5pbmZvLnBsYW5hcjBfb2ZmKTsKLQkJaWYgKHBfc3luYy0+c3RlcmVvY2FtX2VuYWJsZWQpCi0JCQlwX3N5bmMtPnN0ZXJlb19zdGF0ZSA9IFNURVJFT19SQVdfU05BUF9JRExFOwotCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgdmZlMzFfY21kW1YzMV9BWElfT1VUX0NGR10ub2Zmc2V0LAotCQlhbywgdmZlMzFfY21kW1YzMV9BWElfT1VUX0NGR10ubGVuZ3RoIC0gVjMxX0FYSV9DSF9JTkZfTEVOKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9yZXNldF9pbnRlcm5hbF92YXJpYWJsZXModm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXZmZTMxX2N0cmwtPnZmZUltYXNrQ29tcG9zaXRlUGFja2VkID0gMDsKLQkvKiBzdGF0ZSBjb250cm9sIHZhcmlhYmxlcyAqLwotCXZmZTMxX2N0cmwtPnN0YXJ0X2Fja19wZW5kaW5nID0gRkFMU0U7Ci0JYXRvbWljX3NldCgmaXJxX2NudCwgMCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMzFfY3RybC0+eGJhcl9sb2NrLCBmbGFncyk7Ci0JdmZlMzFfY3RybC0+eGJhcl91cGRhdGVfcGVuZGluZyA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzFfY3RybC0+eGJhcl9sb2NrLCBmbGFncyk7Ci0KLQlhdG9taWNfc2V0KCZ2ZmUzMV9jdHJsLT5zdG9wX2Fja19wZW5kaW5nLCAwKTsKLQlhdG9taWNfc2V0KCZ2ZmUzMV9jdHJsLT52c3RhdGUsIDApOwotCi0JdmZlMzFfY3RybC0+YWVjX2Fja19wZW5kaW5nID0gRkFMU0U7Ci0JdmZlMzFfY3RybC0+YWZfYWNrX3BlbmRpbmcgPSBGQUxTRTsKLQl2ZmUzMV9jdHJsLT5hd2JfYWNrX3BlbmRpbmcgPSBGQUxTRTsKLQl2ZmUzMV9jdHJsLT5paGlzdF9hY2tfcGVuZGluZyA9IEZBTFNFOwotCXZmZTMxX2N0cmwtPnJzX2Fja19wZW5kaW5nID0gRkFMU0U7Ci0JdmZlMzFfY3RybC0+Y3NfYWNrX3BlbmRpbmcgPSBGQUxTRTsKLQotCXZmZTMxX2N0cmwtPnJlc2V0X2Fja19wZW5kaW5nICA9IEZBTFNFOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnVwZGF0ZV9hY2tfbG9jaywgZmxhZ3MpOwotCXZmZTMxX2N0cmwtPnVwZGF0ZV9hY2tfcGVuZGluZyA9IEZBTFNFOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnVwZGF0ZV9hY2tfbG9jaywgZmxhZ3MpOwotCi0JdmZlMzFfY3RybC0+cmVjb3JkaW5nX3N0YXRlID0gVkZFX1JFQ19TVEFURV9JRExFOwotCi0JLyogMCBmb3IgY29udGludW91cyBtb2RlLCAxIGZvciBzbmFwc2hvdCBtb2RlICovCi0JdmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUgPSBWRkVfTU9ERV9PRl9PUEVSQVRJT05fQ09OVElOVU9VUzsKLQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlID0gMDsKLQl2ZmUzMV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudCA9IDA7Ci0KLQkvKiB0aGlzIGlzIHVuc2lnbmVkIDMyIGJpdCBpbnRlZ2VyLiAqLwotCXZmZTMxX2N0cmwtPnZmZUZyYW1lSWQgPSAwOwotCi0JdmZlMzFfY3RybC0+b3V0cHV0MVBhdHRlcm4gPSAweGZmZmZmZmZmOwotCXZmZTMxX2N0cmwtPm91dHB1dDFQZXJpb2QgID0gMzE7Ci0JdmZlMzFfY3RybC0+b3V0cHV0MlBhdHRlcm4gPSAweGZmZmZmZmZmOwotCXZmZTMxX2N0cmwtPm91dHB1dDJQZXJpb2QgID0gMzE7Ci0JdmZlMzFfY3RybC0+dmZlRnJhbWVTa2lwQ291bnQgICA9IDA7Ci0JdmZlMzFfY3RybC0+dmZlRnJhbWVTa2lwUGVyaW9kICA9IDMxOwotCi0JLyogU3RhdHMgY29udHJvbCB2YXJpYWJsZXMuICovCi0JbWVtc2V0KCYodmZlMzFfY3RybC0+YWZTdGF0c0NvbnRyb2wpLCAwLAotCQlzaXplb2Yoc3RydWN0IHZmZV9zdGF0c19jb250cm9sKSk7Ci0KLQltZW1zZXQoJih2ZmUzMV9jdHJsLT5hd2JTdGF0c0NvbnRyb2wpLCAwLAotCQlzaXplb2Yoc3RydWN0IHZmZV9zdGF0c19jb250cm9sKSk7Ci0KLQltZW1zZXQoJih2ZmUzMV9jdHJsLT5hZWNTdGF0c0NvbnRyb2wpLCAwLAotCQlzaXplb2Yoc3RydWN0IHZmZV9zdGF0c19jb250cm9sKSk7Ci0KLQltZW1zZXQoJih2ZmUzMV9jdHJsLT5paGlzdFN0YXRzQ29udHJvbCksIDAsCi0JCXNpemVvZihzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wpKTsKLQotCW1lbXNldCgmKHZmZTMxX2N0cmwtPnJzU3RhdHNDb250cm9sKSwgMCwKLQkJc2l6ZW9mKHN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCkpOwotCi0JbWVtc2V0KCYodmZlMzFfY3RybC0+Y3NTdGF0c0NvbnRyb2wpLCAwLAotCQlzaXplb2Yoc3RydWN0IHZmZV9zdGF0c19jb250cm9sKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3Jlc2V0KHZvaWQpCi17Ci0JdWludDMyX3QgdmZlX3ZlcnNpb247Ci0JdmZlMzFfcmVzZXRfZnJlZV9idWZfcXVldWVfYWxsKCk7Ci0JdmZlMzFfcmVzZXRfaW50ZXJuYWxfdmFyaWFibGVzKCk7Ci0KLQl2ZmUzMV9yZXNldF9oaXN0X2NmZygpOwotCXZmZV92ZXJzaW9uID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UpOwotCUNEQkcoInZmZV92ZXJzaW9uID0gMHgleFxuIiwgdmZlX3ZlcnNpb24pOwotCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMuICB2ZmVJbWFza0xvY2FsIGlzIGFsc28gcmVzZXQgdG8gMAotCSogdG8gYmVnaW4gd2l0aC4gKi8KLQltc21fY2FtZXJhX2lvX3coVkZFX0RJU0FCTEVfQUxMX0lSUVMsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX01BU0tfMCk7Ci0KLQltc21fY2FtZXJhX2lvX3coVkZFX0RJU0FCTEVfQUxMX0lSUVMsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX01BU0tfMSk7Ci0KLQkvKiBjbGVhciBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzKi8KLQltc21fY2FtZXJhX2lvX3coVkZFX0NMRUFSX0FMTF9JUlFTLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DTEVBUl8wKTsKLQltc21fY2FtZXJhX2lvX3coVkZFX0NMRUFSX0FMTF9JUlFTLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DTEVBUl8xKTsKLQotCS8qIEVuc3VyZSB0aGUgd3JpdGUgb3JkZXIgd2hpbGUgd3JpdGluZwotCXRvIHRoZSBjb21tYW5kIHJlZ2lzdGVyIHVzaW5nIHRoZSBiYXJyaWVyICovCi0JbXNtX2NhbWVyYV9pb193X21iKDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NNRCk7Ci0KLQkvKiBlbmFibGUgcmVzZXRfYWNrIGludGVycnVwdC4gICovCi0JbXNtX2NhbWVyYV9pb193KFZGRV9JTUFTS19SRVNFVCwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfTUFTS18xKTsKLQotCS8qIFdyaXRlIHRvIFZGRV9HTE9CQUxfUkVTRVRfQ01EIHRvIHJlc2V0IHRoZSB2ZmUgaGFyZHdhcmUuIE9uY2UgcmVzZXQKLQkgKiBpcyBkb25lLCBoYXJkd2FyZSBpbnRlcnJ1cHQgd2lsbCBiZSBnZW5lcmF0ZWQuICBWRkUgaXN0IHByb2Nlc3NlcwotCSAqIHRoZSBpbnRlcnJ1cHQgdG8gY29tcGxldGUgdGhlIGZ1bmN0aW9uIGNhbGwuICBOb3RlIHRoYXQgdGhlIHJlc2V0Ci0JICogZnVuY3Rpb24gaXMgc3luY2hyb25vdXMuICovCi0KLQkvKiBFbnN1cmUgdGhlIHdyaXRlIG9yZGVyIHdoaWxlIHdyaXRpbmcKLQl0byB0aGUgY29tbWFuZCByZWdpc3RlciB1c2luZyB0aGUgYmFycmllciAqLwotCW1zbV9jYW1lcmFfaW9fd19tYihWRkVfUkVTRVRfVVBPTl9SRVNFVF9DTUQsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfR0xPQkFMX1JFU0VUKTsKLX0KLQotc3RhdGljIGludCB2ZmUzMV9vcGVyYXRpb25fY29uZmlnKHVpbnQzMl90ICpjbWQpCi17Ci0JdWludDMyX3QgKnAgPSBjbWQ7Ci0KLQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9ICpwOwotCXZwZV9jdHJsLT5wYWRfMmtfYm9vbCA9ICh2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmIDEpID8KLQkJRkFMU0UgOiBUUlVFOwotCi0JdmZlMzFfY3RybC0+c3RhdHNfY29tcCA9ICooKytwKTsKLQl2ZmUzMV9jdHJsLT5oZnJfbW9kZSA9ICooKytwKTsKLQotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQ0ZHX09GRik7Ci0JbXNtX2NhbWVyYV9pb193KCooKytwKSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQltc21fY2FtZXJhX2lvX3coKigrK3ApLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX1JFQUxJR05fQlVGKTsKLQltc21fY2FtZXJhX2lvX3coKigrK3ApLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0NIUk9NQV9VUCk7Ci0JbXNtX2NhbWVyYV9pb193KCooKytwKSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9TVEFUU19DRkcpOwotCXdtYigpOwotCXJldHVybiAwOwotfQotc3RhdGljIHVpbnQzMl90IHZmZV9zdGF0c19hd2JfYnVmX2luaXQoc3RydWN0IHZmZV9jbWRfc3RhdHNfYnVmICppbikKLXsKLQl1aW50MzJfdCAqcHRyID0gaW4tPnN0YXRzQnVmOwotCXVpbnQzMl90IGFkZHI7Ci0KLQlhZGRyID0gcHRyWzBdOwotCW1zbV9jYW1lcmFfaW9fdyhhZGRyLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19TVEFUU19BV0JfV1JfUElOR19BRERSKTsKLQlhZGRyID0gcHRyWzFdOwotCW1zbV9jYW1lcmFfaW9fdyhhZGRyLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19TVEFUU19BV0JfV1JfUE9OR19BRERSKTsKLQl2ZmUzMV9jdHJsLT5hd2JTdGF0c0NvbnRyb2wubmV4dEZyYW1lQWRkckJ1ZiA9IGluLT5zdGF0c0J1ZlsyXTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdWludDMyX3QgdmZlX3N0YXRzX2FlY19idWZfaW5pdChzdHJ1Y3QgdmZlX2NtZF9zdGF0c19idWYgKmluKQotewotCXVpbnQzMl90ICpwdHIgPSBpbi0+c3RhdHNCdWY7Ci0JdWludDMyX3QgYWRkcjsKLQotCWFkZHIgPSBwdHJbMF07Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX0FFQ19XUl9QSU5HX0FERFIpOwotCWFkZHIgPSBwdHJbMV07Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX0FFQ19XUl9QT05HX0FERFIpOwotCi0JdmZlMzFfY3RybC0+YWVjU3RhdHNDb250cm9sLm5leHRGcmFtZUFkZHJCdWYgPSBpbi0+c3RhdHNCdWZbMl07Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCB2ZmVfc3RhdHNfYWZfYnVmX2luaXQoc3RydWN0IHZmZV9jbWRfc3RhdHNfYnVmICppbikKLXsKLQl1aW50MzJfdCAqcHRyID0gaW4tPnN0YXRzQnVmOwotCXVpbnQzMl90IGFkZHI7Ci0KLQlhZGRyID0gcHRyWzBdOwotCW1zbV9jYW1lcmFfaW9fdyhhZGRyLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19TVEFUU19BRl9XUl9QSU5HX0FERFIpOwotCWFkZHIgPSBwdHJbMV07Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX0FGX1dSX1BPTkdfQUREUik7Ci0KLQl2ZmUzMV9jdHJsLT5hZlN0YXRzQ29udHJvbC5uZXh0RnJhbWVBZGRyQnVmID0gaW4tPnN0YXRzQnVmWzJdOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdWludDMyX3QgdmZlX3N0YXRzX2loaXN0X2J1Zl9pbml0KHN0cnVjdCB2ZmVfY21kX3N0YXRzX2J1ZiAqaW4pCi17Ci0JdWludDMyX3QgKnB0ciA9IGluLT5zdGF0c0J1ZjsKLQl1aW50MzJfdCBhZGRyOwotCi0JYWRkciA9IHB0clswXTsKLQltc21fY2FtZXJhX2lvX3coYWRkciwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfSElTVF9XUl9QSU5HX0FERFIpOwotCWFkZHIgPSBwdHJbMV07Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX0hJU1RfV1JfUE9OR19BRERSKTsKLQotCXZmZTMxX2N0cmwtPmloaXN0U3RhdHNDb250cm9sLm5leHRGcmFtZUFkZHJCdWYgPSBpbi0+c3RhdHNCdWZbMl07Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCB2ZmVfc3RhdHNfcnNfYnVmX2luaXQoc3RydWN0IHZmZV9jbWRfc3RhdHNfYnVmICppbikKLXsKLQl1aW50MzJfdCAqcHRyID0gaW4tPnN0YXRzQnVmOwotCXVpbnQzMl90IGFkZHI7Ci0KLQlhZGRyID0gcHRyWzBdOwotCW1zbV9jYW1lcmFfaW9fdyhhZGRyLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19TVEFUU19SU19XUl9QSU5HX0FERFIpOwotCWFkZHIgPSBwdHJbMV07Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX1JTX1dSX1BPTkdfQUREUik7Ci0KLQl2ZmUzMV9jdHJsLT5yc1N0YXRzQ29udHJvbC5uZXh0RnJhbWVBZGRyQnVmID0gaW4tPnN0YXRzQnVmWzJdOwotCXJldHVybiAwOwotfQotc3RhdGljIHVpbnQzMl90IHZmZV9zdGF0c19jc19idWZfaW5pdChzdHJ1Y3QgdmZlX2NtZF9zdGF0c19idWYgKmluKQotewotCXVpbnQzMl90ICpwdHIgPSBpbi0+c3RhdHNCdWY7Ci0JdWludDMyX3QgYWRkcjsKLQotCWFkZHIgPSBwdHJbMF07Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX0NTX1dSX1BJTkdfQUREUik7Ci0JYWRkciA9IHB0clsxXTsKLQltc21fY2FtZXJhX2lvX3coYWRkciwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfQ1NfV1JfUE9OR19BRERSKTsKLQotCXZmZTMxX2N0cmwtPmNzU3RhdHNDb250cm9sLm5leHRGcmFtZUFkZHJCdWYgPSBpbi0+c3RhdHNCdWZbMl07Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3N0YXJ0X2NvbW1vbih2b2lkKQotewotCXVpbnQzMl90IGlycV9tYXNrID0gMHgwMEUwMDAyMTsKLQl2ZmUzMV9jdHJsLT5zdGFydF9hY2tfcGVuZGluZyA9IFRSVUU7Ci0JQ0RCRygiVkZFIG9wZXJ0YWlvbiBtb2RlID0gMHgleCwgb3V0cHV0IG1vZGUgPSAweCV4XG4iLAotCQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSwgdmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSk7Ci0JLyogRW5hYmxlIElSUSBmb3IgY29tcCBzdGF0cywgSW1hZ2UgbWFzdGVyLCBTT0YgJiBSZWcgVXBkYXRlKi8KLQlpZiAodmZlMzFfY3RybC0+c3RhdHNfY29tcCkKLQkJaXJxX21hc2sgfD0gMHgwMTAwMDAwMDsKLQllbHNlIC8qIEVuYWJsZSBJUlEgZm9yIEltYWdlIG1hc3RlcnMsIEFGIHN0YXRzLCBTT0YgJiBSZWcgVXBkYXRlICovCi0JCWlycV9tYXNrIHw9IDB4MDAwMDQwMDA7Ci0KLQkvKiBFbmFibGUgRU9GIGZvciB2aWRlbyBtb2RlICovCi0JaWYgKFZGRV9NT0RFX09GX09QRVJBVElPTl9WSURFTyA9PSB2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSkKLQkJaXJxX21hc2sgfD0gMHg0OwotCi0JbXNtX2NhbWVyYV9pb193KGlycV9tYXNrLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9NQVNLXzApOwotCi0JbXNtX2NhbWVyYV9pb193KFZGRV9JTUFTS19SRVNFVCwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfTUFTS18xKTsKLQkvKiBlbmFibGUgb3V0IG9mIG9yZGVyIG9wdGlvbiAqLwotCW1zbV9jYW1lcmFfaW9fdygweDgwMDAwMDAwLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0FYSV9DRkcpOwotCS8qIGVuYWJsZSBwZXJmb3JtYW5jZSBtb25pdG9yICovCi0JbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1BNX0NGRyk7Ci0JbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1BNX0NNRCk7Ci0KLQotCW1zbV9jYW1lcmFfaW9fZHVtcCh2ZmUzMV9jdHJsLT52ZmViYXNlLCAweDYwMCk7Ci0KLQkvKiBFbnN1cmUgdGhlIHdyaXRlIG9yZGVyIHdoaWxlIHdyaXRpbmcKLQl0byB0aGUgY29tbWFuZCByZWdpc3RlciB1c2luZyB0aGUgYmFycmllciAqLwotCW1zbV9jYW1lcmFfaW9fd19tYigxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX1JFR19VUERBVEVfQ01EKTsKLQltc21fY2FtZXJhX2lvX3coMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9DQU1JRl9DT01NQU5EKTsKLQl3bWIoKTsKLQotCWF0b21pY19zZXQoJnZmZTMxX2N0cmwtPnZzdGF0ZSwgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlMzFfc3RhcnRfcmVjb3JkaW5nKHZvaWQpCi17Ci0JbXNtX2NhbWlvX3NldF9wZXJmX2x2bChTX1ZJREVPKTsKLQl1c2xlZXAoMTAwMCk7Ci0JdmZlMzFfY3RybC0+cmVjb3JkaW5nX3N0YXRlID0gVkZFX1JFQ19TVEFURV9TVEFSVF9SRVFVRVNURUQ7Ci0JbXNtX2NhbWVyYV9pb193X21iKDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkVHX1VQREFURV9DTUQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZmZTMxX3N0b3BfcmVjb3JkaW5nKHZvaWQpCi17Ci0JdmZlMzFfY3RybC0+cmVjb3JkaW5nX3N0YXRlID0gVkZFX1JFQ19TVEFURV9TVE9QX1JFUVVFU1RFRDsKLQltc21fY2FtZXJhX2lvX3dfbWIoMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9SRUdfVVBEQVRFX0NNRCk7Ci0JbXNtX2NhbWlvX3NldF9wZXJmX2x2bChTX1BSRVZJRVcpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9saXZlc2hvdCh2b2lkKQotewotCXN0cnVjdCBtc21fc3luYyogcF9zeW5jID0gKHN0cnVjdCBtc21fc3luYyAqKXZmZV9zeW5jZGF0YTsKLQlpZiAocF9zeW5jKQotCQlwX3N5bmMtPmxpdmVzaG90X2VuYWJsZWQgPSB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9zdGVyZW9jYW0odWludDMyX3QgZW5hYmxlKQotewotCXN0cnVjdCBtc21fc3luYyogcF9zeW5jID0gKHN0cnVjdCBtc21fc3luYyAqKXZmZV9zeW5jZGF0YTsKLQlpZiAocF9zeW5jKSB7Ci0JCUNEQkcoIiVzOiBFbmFibGUgU3RlcmVvQ2FtICVkISEhXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKLQkJcF9zeW5jLT5zdGVyZW9jYW1fZW5hYmxlZCA9IGVuYWJsZTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgdmZlMzFfenNsKHZvaWQpCi17Ci0JdWludDMyX3QgaXJxX2NvbXBfbWFzayA9IDA7Ci0JLyogY2FwdHVyZSBjb21tYW5kIGlzIHZhbGlkIGZvciBib3RoIGlkbGUgYW5kIGFjdGl2ZSBzdGF0ZS4gKi8KLQlpcnFfY29tcF9tYXNrCT0KLQkJbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NPTVBfTUFTSyk7Ci0KLQlDREJHKCIlczpvcCBtb2RlICVkIE8vUCBNb2RlICVkXG4iLCBfX2Z1bmNfXywKLQkJdmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUsIHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUpOwotCWlmICgodmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0gVkZFX01PREVfT0ZfT1BFUkFUSU9OX1pTTCkpIHsKLQkJaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJiBWRkUzMV9PVVRQVVRfTU9ERV9QKSB7Ci0JCQlpcnFfY29tcF9tYXNrIHw9Ci0JCQkJKCgweDEgPDwgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDApKSB8Ci0JCQkJKDB4MSA8PCAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMSkpKTsKLQkJfSBlbHNlIGlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCQlWRkUzMV9PVVRQVVRfTU9ERV9QX0FMTF9DSE5MUykgewotCQkJaXJxX2NvbXBfbWFzayB8PSAoMHgxIDw8IHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDAgfAotCQkJCTB4MSA8PCB2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxIHwKLQkJCQkweDEgPDwgdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMik7Ci0JCX0KLQkJaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJiBWRkUzMV9PVVRQVVRfTU9ERV9UKSB7Ci0JCQlpcnFfY29tcF9tYXNrIHw9Ci0JCQkJKCgweDEgPDwgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDAgKyA4KSkgfAotCQkJCSgweDEgPDwgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDEgKyA4KSkpOwotCQl9Ci0JCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYgVkZFMzFfT1VUUFVUX01PREVfUykgewotCQkJaXJxX2NvbXBfbWFzayB8PQotCQkJKCgweDEgPDwgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0Mi5jaDAgKyA4KSkgfAotCQkJKDB4MSA8PCAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmNoMSArIDgpKSk7Ci0JCX0KLQkJaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJiBWRkUzMV9PVVRQVVRfTU9ERV9QKSB7Ci0JCQltc21fY2FtZXJhX2lvX3coMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwXSk7Ci0JCQltc21fY2FtZXJhX2lvX3coMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxXSk7Ci0JCX0gZWxzZSBpZiAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCQkJVkZFMzFfT1VUUFVUX01PREVfUF9BTExfQ0hOTFMpIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDBdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDFdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDJdKTsKLQkJfQotCQlpZiAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmIFZGRTMxX09VVFBVVF9NT0RFX1QpIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDBdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDFdKTsKLQkJfQotCQlpZiAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmIFZGRTMxX09VVFBVVF9NT0RFX1MpIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0Mi5jaDBdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0Mi5jaDFdKTsKLQkJfQotCX0KLQltc21fY2FtZXJhX2lvX3coaXJxX2NvbXBfbWFzaywgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ09NUF9NQVNLKTsKLQl2ZmUzMV9zdGFydF9jb21tb24oKTsKLQltc21fY2FtaW9fc2V0X3BlcmZfbHZsKFNfWlNMKTsKLQl1c2xlZXAoMTAwMCk7Ci0JLyogZm9yIGRlYnVnICovCi0JbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyAweDE4Qyk7Ci0JbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyAweDE4OCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlMzFfY2FwdHVyZSh1aW50MzJfdCBudW1fZnJhbWVzX2NhcHR1cmUpCi17Ci0JdWludDMyX3QgaXJxX2NvbXBfbWFzayA9IDA7Ci0Jc3RydWN0IG1zbV9zeW5jKiBwX3N5bmMgPSAoc3RydWN0IG1zbV9zeW5jICopdmZlX3N5bmNkYXRhOwotCi0JLyogY2FwdHVyZSBjb21tYW5kIGlzIHZhbGlkIGZvciBib3RoIGlkbGUgYW5kIGFjdGl2ZSBzdGF0ZS4gKi8KLQl2ZmUzMV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudCA9IG51bV9mcmFtZXNfY2FwdHVyZTsKLQlpZiAocF9zeW5jKSB7Ci0JCXBfc3luYy0+c25hcF9jb3VudCA9IG51bV9mcmFtZXNfY2FwdHVyZTsKLQkJcF9zeW5jLT50aHVtYl9jb3VudCA9IG51bV9mcmFtZXNfY2FwdHVyZTsKLQl9Ci0KLQlpcnFfY29tcF9tYXNrCT0KLQkJbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NPTVBfTUFTSyk7Ci0KLQlpZiAoKHZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCSBWRkVfTU9ERV9PRl9PUEVSQVRJT05fU05BUFNIT1QpIHx8Ci0JCSh2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkgVkZFX01PREVfT0ZfT1BFUkFUSU9OX1pTTCkpewotCQlpZiAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmIFZGRTMxX09VVFBVVF9NT0RFX1BUKSB7Ci0JCQlpcnFfY29tcF9tYXNrIHw9Ci0JCQkJKCgweDEgPDwgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDAgKyA4KSkgfAotCQkJCSgweDEgPDwgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDEgKyA4KSkpOwotCQl9Ci0JCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYgVkZFMzFfT1VUUFVUX01PREVfUykgewotCQkJaXJxX2NvbXBfbWFzayB8PQotCQkJKCgweDEgPDwgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDAgKyA4KSkgfAotCQkJKDB4MSA8PCAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSArIDgpKSk7Ci0JCX0KLQkJaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJiBWRkUzMV9PVVRQVVRfTU9ERV9QVCkgewotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMV0pOwotCQl9Ci0JCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYgVkZFMzFfT1VUUFVUX01PREVfUykgewotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMV0pOwotCQl9Ci0JfSBlbHNlIHsgIC8qIHRoaXMgaXMgcmF3IHNuYXBzaG90IG1vZGUuICovCi0JCUNEQkcoImNvbmZpZyB0aGUgY29tcCBpbWFzayBmb3IgcmF3IHNuYXBzaG90IG1vZGUuXG4iKTsKLQkJaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJiBWRkUzMV9PVVRQVVRfTU9ERV9TKSB7Ci0JCQlpcnFfY29tcF9tYXNrIHw9Ci0JCQkoMHgxIDw8ICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwICsgOCkpOwotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMF0pOwotCQl9Ci0JfQotCW1zbV9jYW1lcmFfaW9fdyhpcnFfY29tcF9tYXNrLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DT01QX01BU0spOwotCWlmIChwX3N5bmMtPnN0ZXJlb2NhbV9lbmFibGVkKQotCQltc21fY2FtaW9fc2V0X3BlcmZfbHZsKFNfU1RFUkVPX0NBUFRVUkUpOwotCWVsc2UKLQkJbXNtX2NhbWlvX3NldF9wZXJmX2x2bChTX0NBUFRVUkUpOwotCi0JdXNsZWVwKDEwMDApOwotCXZmZTMxX3N0YXJ0X2NvbW1vbigpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZmZTMxX3N0YXJ0KHZvaWQpCi17Ci0JdWludDMyX3QgaXJxX2NvbXBfbWFzayA9IDA7Ci0Jc3RydWN0IG1zbV9zeW5jKiBwX3N5bmMgPSAoc3RydWN0IG1zbV9zeW5jICopdmZlX3N5bmNkYXRhOwotCS8qIHN0YXJ0IGNvbW1hbmQgbm93IGlzIG9ubHkgZ29vZCBmb3IgY29udGludW91cyBtb2RlLiAqLwotCWlmICgodmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUgIT0gVkZFX01PREVfT0ZfT1BFUkFUSU9OX0NPTlRJTlVPVVMpICYmCi0JCSh2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSAhPSBWRkVfTU9ERV9PRl9PUEVSQVRJT05fVklERU8pKQotCQlyZXR1cm4gMDsKLQlpcnFfY29tcF9tYXNrID0KLQkJbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NPTVBfTUFTSyk7Ci0KLQlpZiAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmIFZGRTMxX09VVFBVVF9NT0RFX1BUKSB7Ci0JCWlycV9jb21wX21hc2sgfD0gKDB4MSA8PCB2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwIHwKLQkJCTB4MSA8PCB2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxKTsKLQkJCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gyID49IDApCi0JCQkJaXJxX2NvbXBfbWFzayB8PQotCQkJCQkoMHgxIDw8IHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDAgfAotCQkJCQkweDEgPDwgdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMSB8Ci0JCQkJCTB4MSA8PCB2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gyKTsKLQl9IGVsc2UgaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQlWRkUzMV9PVVRQVVRfTU9ERV9QX0FMTF9DSE5MUykgewotCQkJaXJxX2NvbXBfbWFzayB8PSAoMHgxIDw8IHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDAgfAotCQkJCTB4MSA8PCB2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxIHwKLQkJCQkweDEgPDwgdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMik7Ci0JfQotCi0JaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJiBWRkUzMV9PVVRQVVRfTU9ERV9WKSB7Ci0JCWlycV9jb21wX21hc2sgfD0gKDB4MSA8PCAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmNoMCArIDE2KXwKLQkJCTB4MSA8PCAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmNoMSArIDE2KSk7Ci0JfQotCi0JbXNtX2NhbWVyYV9pb193KGlycV9jb21wX21hc2ssIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NPTVBfTUFTSyk7Ci0KLQotCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYgVkZFMzFfT1VUUFVUX01PREVfUFQpIHsKLQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwXSk7Ci0JCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMV0pOwotCQlpZiAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMiA+PSAwKQotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gyXSk7Ci0JfSBlbHNlIGlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJVkZFMzFfT1VUUFVUX01PREVfUF9BTExfQ0hOTFMpIHsKLQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwXSk7Ci0JCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMV0pOwotCQltc21fY2FtZXJhX2lvX3coMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDJdKTsKLQl9Ci0KLQlpZiAocF9zeW5jLT5zdGVyZW9jYW1fZW5hYmxlZCkKLQkJbXNtX2NhbWlvX3NldF9wZXJmX2x2bChTX1NURVJFT19WSURFTyk7Ci0JZWxzZQotCQltc21fY2FtaW9fc2V0X3BlcmZfbHZsKFNfUFJFVklFVyk7Ci0KLQl1c2xlZXAoMTAwMCk7Ci0JdmZlMzFfc3RhcnRfY29tbW9uKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3VwZGF0ZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JQ0RCRygidmZlMzFfdXBkYXRlXG4iKTsKLQotCWlmICh2ZmUzMV9jdHJsLT51cGRhdGVfZ2FtbWEpIHsKLQkJaWYgKCFtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9HQU1NQV9DRkdfT0ZGKSkKLQkJCW1zbV9jYW1lcmFfaW9fdyg3LAotCQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UrVjMxX0dBTU1BX0NGR19PRkYpOwotCQllbHNlCi0JCQltc21fY2FtZXJhX2lvX3coMCwKLQkJCQl2ZmUzMV9jdHJsLT52ZmViYXNlK1YzMV9HQU1NQV9DRkdfT0ZGKTsKLQkJdmZlMzFfY3RybC0+dXBkYXRlX2dhbW1hID0gZmFsc2U7Ci0JfQotCWlmICh2ZmUzMV9jdHJsLT51cGRhdGVfbHVtYSkgewotCQlpZiAoIW1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX0xVTUFfQ0ZHX09GRikpCi0JCQltc21fY2FtZXJhX2lvX3coMSwKLQkJCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX0xVTUFfQ0ZHX09GRik7Ci0JCWVsc2UKLQkJCW1zbV9jYW1lcmFfaW9fdygwLAotCQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWMzFfTFVNQV9DRkdfT0ZGKTsKLQkJdmZlMzFfY3RybC0+dXBkYXRlX2x1bWEgPSBmYWxzZTsKLQl9Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnVwZGF0ZV9hY2tfbG9jaywgZmxhZ3MpOwotCXZmZTMxX2N0cmwtPnVwZGF0ZV9hY2tfcGVuZGluZyA9IFRSVUU7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzFfY3RybC0+dXBkYXRlX2Fja19sb2NrLCBmbGFncyk7Ci0JLyogRW5zdXJlIHRoZSB3cml0ZSBvcmRlciB3aGlsZSB3cml0aW5nCi0JdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdXNpbmcgdGhlIGJhcnJpZXIgKi8KLQltc21fY2FtZXJhX2lvX3dfbWIoMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9SRUdfVVBEQVRFX0NNRCk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9zeW5jX3RpbWVyX3N0b3Aodm9pZCkKLXsKLQl1aW50MzJfdCB2YWx1ZSA9IDA7Ci0JdmZlMzFfY3RybC0+c3luY190aW1lcl9zdGF0ZSA9IDA7Ci0JaWYgKHZmZTMxX2N0cmwtPnN5bmNfdGltZXJfbnVtYmVyID09IDApCi0JCXZhbHVlID0gMHgxMDAwMDsKLQllbHNlIGlmICh2ZmUzMV9jdHJsLT5zeW5jX3RpbWVyX251bWJlciA9PSAxKQotCQl2YWx1ZSA9IDB4MjAwMDA7Ci0JZWxzZSBpZiAodmZlMzFfY3RybC0+c3luY190aW1lcl9udW1iZXIgPT0gMikKLQkJdmFsdWUgPSAweDQwMDAwOwotCi0JLyogVGltZXIgU3RvcCAqLwotCW1zbV9jYW1lcmFfaW9fd19tYih2YWx1ZSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9TWU5DX1RJTUVSX09GRik7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3N5bmNfdGltZXJfc3RhcnQoY29uc3QgdWludDMyX3QgKnRibCkKLXsKLQkvKiBzZXQgYml0IDggZm9yIGF1dG8gaW5jcmVtZW50LiAqLwotCXVpbnQzMl90IHZhbHVlID0gMTsKLQl1aW50MzJfdCB2YWw7Ci0KLQl2ZmUzMV9jdHJsLT5zeW5jX3RpbWVyX3N0YXRlID0gKnRibCsrOwotCXZmZTMxX2N0cmwtPnN5bmNfdGltZXJfcmVwZWF0X2NvdW50ID0gKnRibCsrOwotCXZmZTMxX2N0cmwtPnN5bmNfdGltZXJfbnVtYmVyID0gKnRibCsrOwotCUNEQkcoIiVzIHRpbWVyX3N0YXRlICVkLCByZXBlYXRfY250ICVkIHRpbWVyIG51bWJlciAlZFxuIiwKLQkJIF9fZnVuY19fLCB2ZmUzMV9jdHJsLT5zeW5jX3RpbWVyX3N0YXRlLAotCQkgdmZlMzFfY3RybC0+c3luY190aW1lcl9yZXBlYXRfY291bnQsCi0JCSB2ZmUzMV9jdHJsLT5zeW5jX3RpbWVyX251bWJlcik7Ci0KLQlpZiAodmZlMzFfY3RybC0+c3luY190aW1lcl9zdGF0ZSkgeyAvKiBTdGFydCBUaW1lciAqLwotCQl2YWx1ZSA9IHZhbHVlIDw8IHZmZTMxX2N0cmwtPnN5bmNfdGltZXJfbnVtYmVyOwotCX0gZWxzZSB7IC8qIFN0b3AgVGltZXIgKi8KLQkJQ0RCRygiRmFpbGVkIHRvIFN0YXJ0IHRpbWVyXG4iKTsKLQkJIHJldHVybjsKLQl9Ci0KLQkvKiBUaW1lciBTdGFydCAqLwotCW1zbV9jYW1lcmFfaW9fdyh2YWx1ZSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9TWU5DX1RJTUVSX09GRik7Ci0JLyogU3luYyBUaW1lciBMaW5lIFN0YXJ0ICovCi0JdmFsdWUgPSAqdGJsKys7Ci0JbXNtX2NhbWVyYV9pb193KHZhbHVlLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX1NZTkNfVElNRVJfT0ZGICsKLQkJNCArICgodmZlMzFfY3RybC0+c3luY190aW1lcl9udW1iZXIpICogMTIpKTsKLQkvKiBTeW5jIFRpbWVyIFBpeGVsIFN0YXJ0ICovCi0JdmFsdWUgPSAqdGJsKys7Ci0JbXNtX2NhbWVyYV9pb193KHZhbHVlLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX1NZTkNfVElNRVJfT0ZGICsKLQkJCSA4ICsgKCh2ZmUzMV9jdHJsLT5zeW5jX3RpbWVyX251bWJlcikgKiAxMikpOwotCS8qIFN5bmMgVGltZXIgUGl4ZWwgRHVyYXRpb24gKi8KLQl2YWx1ZSA9ICp0YmwrKzsKLQl2YWwgPSBjYW1pb19jbGsudmZlX2Nsa19yYXRlIC8gMTAwMDA7Ci0JdmFsID0gMTAwMDAwMDAgLyB2YWw7Ci0JdmFsID0gdmFsdWUgKiAxMDAwMCAvIHZhbDsKLQlDREJHKCIlczogUGl4ZWwgQ2xrIEN5Y2xlcyEhISAlZFxuIiwgX19mdW5jX18sIHZhbCk7Ci0JbXNtX2NhbWVyYV9pb193KHZhbCwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9TWU5DX1RJTUVSX09GRiArCi0JCTEyICsgKCh2ZmUzMV9jdHJsLT5zeW5jX3RpbWVyX251bWJlcikgKiAxMikpOwotCS8qIFRpbWVyMCBBY3RpdmUgSGlnaC9MT1cgKi8KLQl2YWx1ZSA9ICp0YmwrKzsKLQltc21fY2FtZXJhX2lvX3codmFsdWUsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWMzFfU1lOQ19USU1FUl9QT0xBUklUWV9PRkYpOwotCS8qIFNlbGVjdHMgc3luYyB0aW1lciAwIG91dHB1dCB0byBkcml2ZSBvbnRvIHRpbWVyMSBwb3J0ICovCi0JdmFsdWUgPSAwOwotCW1zbV9jYW1lcmFfaW9fdyh2YWx1ZSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9USU1FUl9TRUxFQ1RfT0ZGKTsKLQl3bWIoKTsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfcHJvZ3JhbV9kbWlfY2ZnKGVudW0gVkZFMzFfRE1JX1JBTV9TRUwgYmFua1NlbCkKLXsKLQkvKiBzZXQgYml0IDggZm9yIGF1dG8gaW5jcmVtZW50LiAqLwotCXVpbnQzMl90IHZhbHVlID0gVkZFX0RNSV9DRkdfREVGQVVMVDsKLQl2YWx1ZSArPSAodWludDMyX3QpYmFua1NlbDsKLQotCW1zbV9jYW1lcmFfaW9fd19tYih2YWx1ZSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfQ0ZHKTsKLQkvKiBieSBkZWZhdWx0LCBhbHdheXMgc3RhcnRzIHdpdGggb2Zmc2V0IDAuKi8KLQltc21fY2FtZXJhX2lvX3coMCwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfQUREUik7Ci0Jd21iKCk7Ci19Ci1zdGF0aWMgdm9pZCB2ZmUzMV93cml0ZV9nYW1tYV9jZmcoZW51bSBWRkUzMV9ETUlfUkFNX1NFTCBjaGFubmVsX3NlbCwKLQkJCQkJCWNvbnN0IHVpbnQzMl90ICp0YmwpCi17Ci0JaW50IGk7Ci0JdWludDMyX3QgdmFsdWUsIHZhbHVlMSwgdmFsdWUyOwotCXZmZTMxX3Byb2dyYW1fZG1pX2NmZyhjaGFubmVsX3NlbCk7Ci0JLyogZm9yIGxvb3AgZm9yIGV4dHJhY3RpbmcgaW5pdCB0YWJsZS4gKi8KLQlmb3IgKGkgPSAwIDsgaSA8IChWRkUzMV9HQU1NQV9OVU1fRU5UUklFUy8yKSA7IGkrKykgewotCQl2YWx1ZSA9ICp0YmwrKzsKLQkJdmFsdWUxID0gdmFsdWUgJiAweDAwMDBGRkZGOwotCQl2YWx1ZTIgPSAodmFsdWUgJiAweEZGRkYwMDAwKT4+MTY7Ci0JCW1zbV9jYW1lcmFfaW9fdygodmFsdWUxKSwKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0RBVEFfTE8pOwotCQltc21fY2FtZXJhX2lvX3coKHZhbHVlMiksCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0RNSV9EQVRBX0xPKTsKLQl9Ci0JdmZlMzFfcHJvZ3JhbV9kbWlfY2ZnKE5PX01FTV9TRUxFQ1RFRCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3Jlc2V0X2hpc3RfY2ZnKCkKLXsKLQl1aW50MzJfdCBpOwotCXVpbnQzMl90IHZhbHVlID0gMDsKLQotCXZmZTMxX3Byb2dyYW1fZG1pX2NmZyhTVEFUU19ISVNUX1JBTSk7Ci0JZm9yIChpID0gMCA7IGkgPCBWRkUzMV9ISVNUX1RBQkxFX0xFTkdUSCA7IGkrKykKLQkJbXNtX2NhbWVyYV9pb193KHZhbHVlLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0RNSV9EQVRBX0xPKTsKLQl2ZmUzMV9wcm9ncmFtX2RtaV9jZmcoTk9fTUVNX1NFTEVDVEVEKTsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfd3JpdGVfbGFfY2ZnKGVudW0gVkZFMzFfRE1JX1JBTV9TRUwgY2hhbm5lbF9zZWwsCi0JCQkJCQljb25zdCB1aW50MzJfdCAqdGJsKQotewotCXVpbnQzMl90IGk7Ci0JdWludDMyX3QgdmFsdWUsIHZhbHVlMSwgdmFsdWUyOwotCi0JdmZlMzFfcHJvZ3JhbV9kbWlfY2ZnKGNoYW5uZWxfc2VsKTsKLQkvKiBmb3IgbG9vcCBmb3IgZXh0cmFjdGluZyBpbml0IHRhYmxlLiAqLwotCWZvciAoaSA9IDAgOyBpIDwgKFZGRTMxX0xBX1RBQkxFX0xFTkdUSC8yKSA7IGkrKykgewotCQl2YWx1ZSA9ICp0YmwrKzsKLQkJdmFsdWUxID0gdmFsdWUgJiAweDAwMDBGRkZGOwotCQl2YWx1ZTIgPSAodmFsdWUgJiAweEZGRkYwMDAwKT4+MTY7Ci0JCW1zbV9jYW1lcmFfaW9fdygodmFsdWUxKSwKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0RBVEFfTE8pOwotCQltc21fY2FtZXJhX2lvX3coKHZhbHVlMiksCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0RNSV9EQVRBX0xPKTsKLQl9Ci0JdmZlMzFfcHJvZ3JhbV9kbWlfY2ZnKE5PX01FTV9TRUxFQ1RFRCk7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlMzFfcHJvY19nZW5lcmFsKHN0cnVjdCBtc21fdmZlMzFfY21kICpjbWQpCi17Ci0JaW50IGkgLCByYyA9IDA7Ci0JdWludDMyX3Qgb2xkX3ZhbCA9IDAgLCBuZXdfdmFsID0gMDsKLQl1aW50MzJfdCAqY21kcCA9IE5VTEw7Ci0JdWludDMyX3QgKmNtZHBfbG9jYWwgPSBOVUxMOwotCXVpbnQzMl90IHNuYXBzaG90X2NudCA9IDA7Ci0JdWludDMyX3Qgc3RlcmVvX2NhbV9lbmFibGUgPSAwOwotCXN0cnVjdCBtc21fc3luYyogcF9zeW5jID0gKHN0cnVjdCBtc21fc3luYyAqKXZmZV9zeW5jZGF0YTsKLQotCUNEQkcoInZmZTMxX3Byb2NfZ2VuZXJhbDogY21kSUQgPSAlcywgbGVuZ3RoID0gJWRcbiIsCi0JCXZmZTMxX2dlbmVyYWxfY21kW2NtZC0+aWRdLCBjbWQtPmxlbmd0aCk7Ci0Jc3dpdGNoIChjbWQtPmlkKSB7Ci0JY2FzZSBWMzFfUkVTRVQ6Ci0JCXByX2luZm8oInZmZTMxX3Byb2NfZ2VuZXJhbDogY21kSUQgPSAlc1xuIiwKLQkJCXZmZTMxX2dlbmVyYWxfY21kW2NtZC0+aWRdKTsKLQkJdmZlMzFfcmVzZXQoKTsKLQkJYnJlYWs7Ci0JY2FzZSBWMzFfU1RBUlQ6Ci0JCXByX2luZm8oInZmZTMxX3Byb2NfZ2VuZXJhbDogY21kSUQgPSAlc1xuIiwKLQkJCXZmZTMxX2dlbmVyYWxfY21kW2NtZC0+aWRdKTsKLQkJcmMgPSB2ZmUzMV9zdGFydCgpOwotCQlicmVhazsKLQljYXNlIFYzMV9VUERBVEU6Ci0JCXZmZTMxX3VwZGF0ZSgpOwotCQlicmVhazsKLQljYXNlIFYzMV9aU0w6Ci0JCXByX2luZm8oInZmZTMxX3Byb2NfZ2VuZXJhbDogY21kSUQgPSAlc1xuIiwKLQkJCXZmZTMxX2dlbmVyYWxfY21kW2NtZC0+aWRdKTsKLQkJdmZlMzFfenNsKCk7Ci0JCWJyZWFrOwotCWNhc2UgVjMxX0NBUFRVUkU6Ci0JCXByX2luZm8oInZmZTMxX3Byb2NfZ2VuZXJhbDogY21kSUQgPSAlc1xuIiwKLQkJCXZmZTMxX2dlbmVyYWxfY21kW2NtZC0+aWRdKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzbmFwc2hvdF9jbnQsICh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCQlzaXplb2YodWludDMyX3QpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlyYyA9IHZmZTMxX2NhcHR1cmUoc25hcHNob3RfY250KTsKLQkJYnJlYWs7Ci0JY2FzZSBWMzFfU1RBUlRfUkVDT1JESU5HOgotCQlwcl9pbmZvKCJ2ZmUzMV9wcm9jX2dlbmVyYWw6IGNtZElEID0gJXNcbiIsCi0JCQl2ZmUzMV9nZW5lcmFsX2NtZFtjbWQtPmlkXSk7Ci0JCXJjID0gdmZlMzFfc3RhcnRfcmVjb3JkaW5nKCk7Ci0JCWlmIChwX3N5bmMtPnN0ZXJlb2NhbV9lbmFibGVkKQotCQkJcF9zeW5jLT5zdGVyZW9fc3RhdGUgPSBTVEVSRU9fVklERU9fQUNUSVZFOwotCQlicmVhazsKLQljYXNlIFYzMV9TVE9QX1JFQ09SRElORzoKLQkJcHJfaW5mbygidmZlMzFfcHJvY19nZW5lcmFsOiBjbWRJRCA9ICVzXG4iLAotCQkJdmZlMzFfZ2VuZXJhbF9jbWRbY21kLT5pZF0pOwotCQlyYyA9IHZmZTMxX3N0b3BfcmVjb3JkaW5nKCk7Ci0JCWlmIChwX3N5bmMtPnN0ZXJlb2NhbV9lbmFibGVkKQotCQkJcF9zeW5jLT5zdGVyZW9fc3RhdGUgPSBTVEVSRU9fVklERU9fSURMRTsKLQkJYnJlYWs7Ci0JY2FzZSBWMzFfT1BFUkFUSU9OX0NGRzogewotCQlpZiAoY21kLT5sZW5ndGggIT0gVjMxX09QRVJBVElPTl9DRkdfTEVOKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHAgPSBrbWFsbG9jKFYzMV9PUEVSQVRJT05fQ0ZHX0xFTiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJVjMxX09QRVJBVElPTl9DRkdfTEVOKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlyYyA9IHZmZTMxX29wZXJhdGlvbl9jb25maWcoY21kcCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFYzMV9TVEFUU19BRV9TVEFSVDogewotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgfD0gQUVfRU5BQkxFX01BU0s7Ci0JCW1zbV9jYW1lcmFfaW9fdyhvbGRfdmFsLAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgdmZlMzFfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJY21kcCwgKHZmZTMxX2NtZFtjbWQtPmlkXS5sZW5ndGgpKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFYzMV9TVEFUU19BRl9TVEFSVDogewotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgfD0gQUZfRU5BQkxFX01BU0s7Ci0JCW1zbV9jYW1lcmFfaW9fdyhvbGRfdmFsLAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgdmZlMzFfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJY21kcCwgKHZmZTMxX2NtZFtjbWQtPmlkXS5sZW5ndGgpKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFYzMV9TVEFUU19BV0JfU1RBUlQ6IHsKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlvbGRfdmFsIHw9IEFXQl9FTkFCTEVfTUFTSzsKLQkJbXNtX2NhbWVyYV9pb193KG9sZF92YWwsCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyB2ZmUzMV9jbWRbY21kLT5pZF0ub2Zmc2V0LAotCQkJY21kcCwgKHZmZTMxX2NtZFtjbWQtPmlkXS5sZW5ndGgpKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVjMxX1NUQVRTX0lISVNUX1NUQVJUOiB7Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJb2xkX3ZhbCB8PSBJSElTVF9FTkFCTEVfTUFTSzsKLQkJbXNtX2NhbWVyYV9pb193KG9sZF92YWwsCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyB2ZmUzMV9jbWRbY21kLT5pZF0ub2Zmc2V0LAotCQkJY21kcCwgKHZmZTMxX2NtZFtjbWQtPmlkXS5sZW5ndGgpKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVjMxX1hCQVJfQ0ZHOiB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMzFfY3RybC0+eGJhcl9sb2NrLCBmbGFncyk7Ci0JCWlmICgoY21kLT5sZW5ndGggIT0gVjMxX1hCQVJfQ0ZHX0xFTikKLQkJCXx8IHZmZTMxX2N0cmwtPnhiYXJfdXBkYXRlX3BlbmRpbmcpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnhiYXJfbG9jaywgZmxhZ3MpOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMV9jdHJsLT54YmFyX2xvY2ssIGZsYWdzKTsKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnhiYXJfbG9jaywgZmxhZ3MpOwotCQl2ZmUzMV9jdHJsLT54YmFyX2NmZ1swXSA9ICpjbWRwOwotCQl2ZmUzMV9jdHJsLT54YmFyX2NmZ1sxXSA9ICooY21kcCsxKTsKLQkJdmZlMzFfY3RybC0+eGJhcl91cGRhdGVfcGVuZGluZyA9IDE7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnhiYXJfbG9jaywgZmxhZ3MpOwotCQlDREJHKCIlczogeGJhcjAgMHgleCB4YmFyMSAweCV4IiwgX19mdW5jX18sCi0JCQl2ZmUzMV9jdHJsLT54YmFyX2NmZ1swXSwKLQkJCXZmZTMxX2N0cmwtPnhiYXJfY2ZnWzFdKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVjMxX1NUQVRTX1JTX1NUQVJUOiB7Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIHZmZTMxX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwLCAodmZlMzFfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWMzFfU1RBVFNfQ1NfU1RBUlQ6IHsKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgdmZlMzFfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHAsICh2ZmUzMV9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFYzMV9NQ0VfVVBEQVRFOgotCWNhc2UgVjMxX01DRV9DRkc6ewotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCS8qIEluY3JlbWVudGluZyB3aXRoIDQgc28gYXMgdG8gcG9pbnQgdG8gdGhlIDJuZCBSZWdpc3RlciBhcwotCQl0aGUgMm5kIHJlZ2lzdGVyIGhhcyB0aGUgbWNlX2VuYWJsZSBiaXQgKi8KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCQkJCVYzMV9DSFJPTUFfU1VQX09GRiArIDQpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0JCW5ld192YWwgPSAqY21kcF9sb2NhbDsKLQkJb2xkX3ZhbCAmPSBNQ0VfRU5fTUFTSzsKLQkJbmV3X3ZhbCA9IG5ld192YWwgfCBvbGRfdmFsOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWMzFfQ0hST01BX1NVUF9PRkYgKyA0LAotCQkJJm5ld192YWwsIDQpOwotCQljbWRwX2xvY2FsICs9IDE7Ci0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCQkJCVYzMV9DSFJPTUFfU1VQX09GRiArIDgpOwotCQluZXdfdmFsID0gKmNtZHBfbG9jYWw7Ci0JCW9sZF92YWwgJj0gTUNFX1FfS19NQVNLOwotCQluZXdfdmFsID0gbmV3X3ZhbCB8IG9sZF92YWw7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9DSFJPTUFfU1VQX09GRiArIDgsCi0JCQkmbmV3X3ZhbCwgNCk7Ci0JCWNtZHBfbG9jYWwgKz0gMTsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgdmZlMzFfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHBfbG9jYWwsICh2ZmUzMV9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWMzFfREVNT1NBSUNfMl9VUERBVEU6IC8qIDM4IEJQQyB1cGRhdGUgICAqLwotCWNhc2UgVjMxX0RFTU9TQUlDXzJfQ0ZHOiB7ICAvKiAxNCBCUEMgY29uZmlnICAgKi8KLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0JCW5ld192YWwgPSAqY21kcF9sb2NhbDsKLQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWMzFfREVNT1NBSUNfMF9PRkYpOwotCQlvbGRfdmFsICY9IEJQQ19NQVNLOwotCi0JCW5ld192YWwgPSBuZXdfdmFsIHwgb2xkX3ZhbDsKLQkJKmNtZHBfbG9jYWwgPSBuZXdfdmFsOwotCQltc21fY2FtZXJhX2lvX21lbWNweSh2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX0RFTU9TQUlDXzBfT0ZGLAotCQkJCQljbWRwX2xvY2FsLCA0KTsKLQkJY21kcF9sb2NhbCArPSAxOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyB2ZmUzMV9jbWRbY21kLT5pZF0ub2Zmc2V0LAotCQkJY21kcF9sb2NhbCwgKHZmZTMxX2NtZFtjbWQtPmlkXS5sZW5ndGgpKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFYzMV9ERU1PU0FJQ18xX1VQREFURTovKiAzNyBBQkYgdXBkYXRlICAqLwotCWNhc2UgVjMxX0RFTU9TQUlDXzFfQ0ZHOiB7IC8qIDEzIEFCRiBjb25maWcgICovCi0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQluZXdfdmFsID0gKmNtZHBfbG9jYWw7Ci0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX0RFTU9TQUlDXzBfT0ZGKTsKLQkJb2xkX3ZhbCAmPSBBQkZfTUFTSzsKLQkJbmV3X3ZhbCA9IG5ld192YWwgfCBvbGRfdmFsOwotCQkqY21kcF9sb2NhbCA9IG5ld192YWw7Ci0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkodmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9ERU1PU0FJQ18wX09GRiwKLQkJICAgIGNtZHBfbG9jYWwsIDQpOwotCi0JCWNtZHBfbG9jYWwgKz0gMTsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgdmZlMzFfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHBfbG9jYWwsICh2ZmUzMV9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWMzFfUk9MTF9PRkZfQ0ZHOiB7Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpICwgY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyB2ZmUzMV9jbWRbY21kLT5pZF0ub2Zmc2V0LAotCQljbWRwX2xvY2FsLCAxNik7Ci0JCWNtZHBfbG9jYWwgKz0gNDsKLQkJdmZlMzFfcHJvZ3JhbV9kbWlfY2ZnKFJPTExPRkZfUkFNKTsKLQkJLyogZm9yIGxvb3AgZm9yIGV4dHJjdGluZyBpbml0IHRhYmxlLiAqLwotCQlmb3IgKGkgPSAwIDsgaSA8IChWRkUzMV9ST0xMX09GRl9JTklUX1RBQkxFX1NJWkUgKiAyKSA7IGkrKykgewotCQkJbXNtX2NhbWVyYV9pb193KCpjbWRwX2xvY2FsICwKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0RBVEFfTE8pOwotCQkJY21kcF9sb2NhbCsrOwotCQl9Ci0JCUNEQkcoImRvbmUgd3JpdGluZyBpbml0IHRhYmxlXG4iKTsKLQkJLyogYnkgZGVmYXVsdCwgYWx3YXlzIHN0YXJ0cyB3aXRoIG9mZnNldCAwLiAqLwotCQltc21fY2FtZXJhX2lvX3coTEVOU19ST0xMX09GRl9ERUxUQV9UQUJMRV9PRkZTRVQsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0FERFIpOwotCQkvKiBmb3IgbG9vcCBmb3IgZXh0cmFjdGluZyBkZWx0YSB0YWJsZS4gKi8KLQkJZm9yIChpID0gMCA7IGkgPCAoVkZFMzFfUk9MTF9PRkZfREVMVEFfVEFCTEVfU0laRSAqIDIpIDsgaSsrKSB7Ci0JCQltc21fY2FtZXJhX2lvX3coKmNtZHBfbG9jYWwsCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0RNSV9EQVRBX0xPKTsKLQkJCWNtZHBfbG9jYWwrKzsKLQkJfQotCQl2ZmUzMV9wcm9ncmFtX2RtaV9jZmcoTk9fTUVNX1NFTEVDVEVEKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVjMxX0xBX0NGRzp7Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0KLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJLyogU2VsZWN0IEJhbmsgMCovCi0JCSpjbWRwID0gMDsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgdmZlMzFfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHAsICh2ZmUzMV9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCWNtZHAgKz0gMTsKLQkJdmZlMzFfd3JpdGVfbGFfY2ZnKExVTUFfQURBUFRfTFVUX1JBTV9CQU5LMCAsIGNtZHApOwotCQljbWRwIC09IDE7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFYzMV9MQV9VUERBVEU6IHsKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWMzFfTFVNQV9DRkdfT0ZGKTsKLQkJY21kcCArPSAxOwotCQlpZiAob2xkX3ZhbCAhPSAweDApCi0JCQl2ZmUzMV93cml0ZV9sYV9jZmcoTFVNQV9BREFQVF9MVVRfUkFNX0JBTkswICwgY21kcCk7Ci0JCWVsc2UKLQkJCXZmZTMxX3dyaXRlX2xhX2NmZyhMVU1BX0FEQVBUX0xVVF9SQU1fQkFOSzEgLCBjbWRwKTsKLQkJdmZlMzFfY3RybC0+dXBkYXRlX2x1bWEgPSB0cnVlOwotCQljbWRwIC09IDE7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFYzMV9TS19FTkhBTl9DRkc6Ci0JY2FzZSBWMzFfU0tfRU5IQU5fVVBEQVRFOnsKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkodmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9TQ0VfT0ZGLAotCQkJCWNtZHAsIFYzMV9TQ0VfTEVOKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVjMxX0xJVkVTSE9UOgotCQl2ZmUzMV9saXZlc2hvdCgpOwotCQlicmVhazsKLQotCWNhc2UgVjMxX1NURVJFT0NBTToKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzdGVyZW9fY2FtX2VuYWJsZSwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwgc2l6ZW9mKHVpbnQzMl90KSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJdmZlMzFfc3RlcmVvY2FtKHN0ZXJlb19jYW1fZW5hYmxlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFYzMV9SR0JfR19DRkc6IHsKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJLyogU2VsZWN0IEJhbmsgMCovCi0JCSpjbWRwID0gMDsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkodmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9SR0JfR19PRkYsCi0JCQkJY21kcCwgNCk7Ci0JCWNtZHAgKz0gMTsKLQkJdmZlMzFfd3JpdGVfZ2FtbWFfY2ZnKFJHQkxVVF9DSFhfQkFOSzAsIGNtZHApOwotCQljbWRwIC09IDE7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFYzMV9SR0JfR19VUERBVEU6IHsKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsICh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWMzFfR0FNTUFfQ0ZHX09GRik7Ci0JCWNtZHAgKz0gMTsKLQotCQlpZiAoIW9sZF92YWwpIHsKLQkJCXZmZTMxX3dyaXRlX2dhbW1hX2NmZyhSR0JMVVRfQ0hYX0JBTksxLCBjbWRwKTsKLQkJfSBlbHNlIHsKLQkJCXZmZTMxX3dyaXRlX2dhbW1hX2NmZyhSR0JMVVRfQ0hYX0JBTkswLCBjbWRwKTsKLQkJCX0KLQkJdmZlMzFfY3RybC0+dXBkYXRlX2dhbW1hID0gdHJ1ZTsKLQkJY21kcCAtPSAxOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWMzFfU1RBVFNfQVdCX1NUT1A6IHsKLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlvbGRfdmFsICY9IH5BV0JfRU5BQkxFX01BU0s7Ci0JCW1zbV9jYW1lcmFfaW9fdyhvbGRfdmFsLAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFYzMV9TVEFUU19BRV9TVE9QOiB7Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJb2xkX3ZhbCAmPSB+QUVfRU5BQkxFX01BU0s7Ci0JCW1zbV9jYW1lcmFfaW9fdyhvbGRfdmFsLAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFYzMV9TVEFUU19BRl9TVE9QOiB7Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJb2xkX3ZhbCAmPSB+QUZfRU5BQkxFX01BU0s7Ci0JCW1zbV9jYW1lcmFfaW9fdyhvbGRfdmFsLAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVjMxX1NUQVRTX0lISVNUX1NUT1A6IHsKLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlvbGRfdmFsICY9IH5JSElTVF9FTkFCTEVfTUFTSzsKLQkJbXNtX2NhbWVyYV9pb193KG9sZF92YWwsCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWMzFfU1RBVFNfUlNfU1RPUDogewotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgJj0gflJTX0VOQUJMRV9NQVNLOwotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFYzMV9TVEFUU19DU19TVE9QOiB7Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJb2xkX3ZhbCAmPSB+Q1NfRU5BQkxFX01BU0s7Ci0JCW1zbV9jYW1lcmFfaW9fdyhvbGRfdmFsLAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFYzMV9TVE9QOgotCQlwcl9pbmZvKCJ2ZmUzMV9wcm9jX2dlbmVyYWw6IGNtZElEID0gJXNcbiIsCi0JCQl2ZmUzMV9nZW5lcmFsX2NtZFtjbWQtPmlkXSk7Ci0JCXZmZTMxX3N0b3AoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFYzMV9TWU5DX1RJTUVSX1NFVFRJTkc6Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLCAodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJdmZlMzFfc3luY190aW1lcl9zdGFydChjbWRwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFYzMV9FWlRVTkVfQ0ZHOiB7Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCSpjbWRwICY9IH5TVEFUU19FTkFCTEVfTUFTSzsKLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlvbGRfdmFsICY9IFNUQVRTX0VOQUJMRV9NQVNLOwotCQkqY21kcCB8PSBvbGRfdmFsOwotCi0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIHZmZTMxX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwLCAodmZlMzFfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDogewotCQlpZiAoY21kLT5sZW5ndGggIT0gdmZlMzFfY21kW2NtZC0+aWRdLmxlbmd0aCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWNtZHAgPSBrbWFsbG9jKHZmZTMxX2NtZFtjbWQtPmlkXS5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwgKHZvaWQgX191c2VyICopY21kLT52YWx1ZSwKLQkJCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCXByX2VycigiJXMgY29weSBmcm9tIHVzZXIgZmFpbGVkIGZvciBjbWQgJWQiLAotCQkJCV9fZnVuY19fLCBjbWQtPmlkKTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgdmZlMzFfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHAsICh2ZmUzMV9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JfQotCWJyZWFrOwotCi0JfQotCi1wcm9jX2dlbmVyYWxfZG9uZToKLQlrZnJlZShjbWRwKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfc3RhdHNfYWZfYWNrKHN0cnVjdCB2ZmVfY21kX3N0YXRzX2FjayAqcEFjaykKLXsKLQl2ZmUzMV9jdHJsLT5hZlN0YXRzQ29udHJvbC5uZXh0RnJhbWVBZGRyQnVmID0gcEFjay0+bmV4dFN0YXRzQnVmOwotCXZmZTMxX2N0cmwtPmFmX2Fja19wZW5kaW5nID0gRkFMU0U7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3N0YXRzX2F3Yl9hY2soc3RydWN0IHZmZV9jbWRfc3RhdHNfYWNrICpwQWNrKQotewotCXZmZTMxX2N0cmwtPmF3YlN0YXRzQ29udHJvbC5uZXh0RnJhbWVBZGRyQnVmID0gcEFjay0+bmV4dFN0YXRzQnVmOwotCXZmZTMxX2N0cmwtPmF3Yl9hY2tfcGVuZGluZyA9IEZBTFNFOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9zdGF0c19hZWNfYWNrKHN0cnVjdCB2ZmVfY21kX3N0YXRzX2FjayAqcEFjaykKLXsKLQl2ZmUzMV9jdHJsLT5hZWNTdGF0c0NvbnRyb2wubmV4dEZyYW1lQWRkckJ1ZiA9IHBBY2stPm5leHRTdGF0c0J1ZjsKLQl2ZmUzMV9jdHJsLT5hZWNfYWNrX3BlbmRpbmcgPSBGQUxTRTsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfc3RhdHNfaWhpc3RfYWNrKHN0cnVjdCB2ZmVfY21kX3N0YXRzX2FjayAqcEFjaykKLXsKLQl2ZmUzMV9jdHJsLT5paGlzdFN0YXRzQ29udHJvbC5uZXh0RnJhbWVBZGRyQnVmID0gcEFjay0+bmV4dFN0YXRzQnVmOwotCXZmZTMxX2N0cmwtPmloaXN0X2Fja19wZW5kaW5nID0gRkFMU0U7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3N0YXRzX3JzX2FjayhzdHJ1Y3QgdmZlX2NtZF9zdGF0c19hY2sgKnBBY2spCi17Ci0JdmZlMzFfY3RybC0+cnNTdGF0c0NvbnRyb2wubmV4dEZyYW1lQWRkckJ1ZiA9IHBBY2stPm5leHRTdGF0c0J1ZjsKLQl2ZmUzMV9jdHJsLT5yc19hY2tfcGVuZGluZyA9IEZBTFNFOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9zdGF0c19jc19hY2soc3RydWN0IHZmZV9jbWRfc3RhdHNfYWNrICpwQWNrKQotewotCXZmZTMxX2N0cmwtPmNzU3RhdHNDb250cm9sLm5leHRGcmFtZUFkZHJCdWYgPSBwQWNrLT5uZXh0U3RhdHNCdWY7Ci0JdmZlMzFfY3RybC0+Y3NfYWNrX3BlbmRpbmcgPSBGQUxTRTsKLX0KLQotc3RhdGljIGludCB2ZmUzMV9jb25maWcoc3RydWN0IG1zbV92ZmVfY2ZnX2NtZCAqY21kLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBtc21fdmZlMzFfY21kIHZmZWNtZDsKLQotCWxvbmcgcmMgPSAwOwotCXVpbnQzMl90IGkgPSAwOwotCXN0cnVjdCB2ZmVfY21kX3N0YXRzX2J1ZiAqc2NmZyA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiAgICpyZWdwdHIgPSBOVUxMOwotCXN0cnVjdCB2ZmVfY21kX3N0YXRzX2FjayAqc2FjayA9IE5VTEw7Ci0KLQlpZiAoY21kLT5jbWRfdHlwZSAhPSBDTURfRlJBTUVfQlVGX1JFTEVBU0UgJiYKLQkJY21kLT5jbWRfdHlwZSAhPSBDTURfU05BUF9CVUZfUkVMRUFTRSAmJgotCQljbWQtPmNtZF90eXBlICE9IENNRF9TVEFUU19BRUNfQlVGX1JFTEVBU0UgJiYKLQkJY21kLT5jbWRfdHlwZSAhPSBDTURfU1RBVFNfQVdCX0JVRl9SRUxFQVNFICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX0lISVNUX0JVRl9SRUxFQVNFICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX1JTX0JVRl9SRUxFQVNFICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX0NTX0JVRl9SRUxFQVNFICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX0FGX0JVRl9SRUxFQVNFKSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdmZlY21kLAotCQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCQlzaXplb2YodmZlY21kKSkpIHsKLQkJCXByX2VycigiJXMgJWQ6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19mdW5jX18sCi0JCQkJX19MSU5FX18pOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9IGVsc2UgewotCS8qIGhlcmUgZWl0aCBzdGF0cyByZWxlYXNlIG9yIGZyYW1lIHJlbGVhc2UuICovCi0JCWlmIChjbWQtPmNtZF90eXBlICE9IENNRF9GUkFNRV9CVUZfUkVMRUFTRSAmJgotCQkJY21kLT5jbWRfdHlwZSAhPSBDTURfU05BUF9CVUZfUkVMRUFTRSkgewotCQkJLyogdGhlbiBtdXN0IGJlIHN0YXRzIHJlbGVhc2UuICovCi0JCQlpZiAoIWRhdGEpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJc2FjayA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZmVfY21kX3N0YXRzX2FjayksCi0JCQkJR0ZQX0FUT01JQyk7Ci0JCQkJaWYgKCFzYWNrKQotCQkJCQlyZXR1cm4gLUVOT01FTTsKLQotCQkJCXNhY2stPm5leHRTdGF0c0J1ZiA9ICoodWludDMyX3QgKilkYXRhOwotCQkJfQotCX0KLQotCUNEQkcoIiVzOiBjbWRUeXBlID0gJWRcbiIsIF9fZnVuY19fLCBjbWQtPmNtZF90eXBlKTsKLQotCWlmICgoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfQUZfRU5BQkxFKSB8fAotCQkoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfQVdCX0VOQUJMRSkgfHwKLQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0lISVNUX0VOQUJMRSkgfHwKLQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX1JTX0VOQUJMRSkgfHwKLQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0NTX0VOQUJMRSkgfHwKLQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0FFQ19FTkFCTEUpKSB7Ci0JCXN0cnVjdCBheGlkYXRhICpheGlkOwotCQlheGlkID0gZGF0YTsKLQkJaWYgKCFheGlkKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHZmZTMxX2NvbmZpZ19kb25lOwotCQl9Ci0KLQkJc2NmZyA9Ci0JCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmZlX2NtZF9zdGF0c19idWYpLAotCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIXNjZmcpIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gdmZlMzFfY29uZmlnX2RvbmU7Ci0JCX0KLQkJcmVncHRyID0gYXhpZC0+cmVnaW9uOwotCQlpZiAoYXhpZC0+YnVmbnVtMSA+IDApIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBheGlkLT5idWZudW0xOyBpKyspIHsKLQkJCQlzY2ZnLT5zdGF0c0J1ZltpXSA9Ci0JCQkJCSh1aW50MzJfdCkocmVncHRyLT5wYWRkcik7Ci0JCQkJcmVncHRyKys7Ci0JCQl9Ci0JCX0KLQkJLyogaW5kaXZpZHVhbCAqLwotCQlzd2l0Y2ggKGNtZC0+Y21kX3R5cGUpIHsKLQkJY2FzZSBDTURfU1RBVFNfQUVDX0VOQUJMRToKLQkJCXJjID0gdmZlX3N0YXRzX2FlY19idWZfaW5pdChzY2ZnKTsKLQkJCWJyZWFrOwotCQljYXNlIENNRF9TVEFUU19BRl9FTkFCTEU6Ci0JCQlyYyA9IHZmZV9zdGF0c19hZl9idWZfaW5pdChzY2ZnKTsKLQkJCWJyZWFrOwotCQljYXNlIENNRF9TVEFUU19BV0JfRU5BQkxFOgotCQkJcmMgPSB2ZmVfc3RhdHNfYXdiX2J1Zl9pbml0KHNjZmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01EX1NUQVRTX0lISVNUX0VOQUJMRToKLQkJCXJjID0gdmZlX3N0YXRzX2loaXN0X2J1Zl9pbml0KHNjZmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01EX1NUQVRTX1JTX0VOQUJMRToKLQkJCXJjID0gdmZlX3N0YXRzX3JzX2J1Zl9pbml0KHNjZmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01EX1NUQVRTX0NTX0VOQUJMRToKLQkJCXJjID0gdmZlX3N0YXRzX2NzX2J1Zl9pbml0KHNjZmcpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlzd2l0Y2ggKGNtZC0+Y21kX3R5cGUpIHsKLQljYXNlIENNRF9HRU5FUkFMOgotCQlyYyA9IHZmZTMxX3Byb2NfZ2VuZXJhbCgmdmZlY21kKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9GUkFNRV9CVUZfUkVMRUFTRTogewotCQlzdHJ1Y3QgbXNtX2ZyYW1lICpiOwotCQl1bnNpZ25lZCBsb25nIHA7Ci0JCWludCByZXQ7Ci0JCXN0cnVjdCB2ZmUzMV9vdXRwdXRfY2ggKm91dGNoID0gTlVMTDsKLQkJaWYgKCFkYXRhKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWIgPSAoc3RydWN0IG1zbV9mcmFtZSAqKShjbWQtPnZhbHVlKTsKLQkJcCA9ICoodW5zaWduZWQgbG9uZyAqKWRhdGE7Ci0KLQkJQ0RCRygiQ01EX0ZSQU1FX0JVRl9SRUxFQVNFIGItPnBhdGggPSAlZFxuIiwgYi0+cGF0aCk7Ci0KLQkJaWYgKGItPnBhdGggJiBPVVRQVVRfVFlQRV9QKSB7Ci0JCQlDREJHKCJDTURfRlJBTUVfQlVGX1JFTEVBU0UgZ290IGZyZWUgYnVmZmVyXG4iKTsKLQkJCW91dGNoID0gJnZmZTMxX2N0cmwtPm91dHBhdGgub3V0MDsKLQkJfSBlbHNlIGlmIChiLT5wYXRoICYgT1VUUFVUX1RZUEVfUykgewotCQkJb3V0Y2ggPSAmdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxOwotCQl9IGVsc2UgaWYgKGItPnBhdGggJiBPVVRQVVRfVFlQRV9WKSB7Ci0JCQlvdXRjaCA9ICZ2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDI7Ci0JCX0gZWxzZSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJldCA9IHZmZTMxX2FkZF9mcmVlX2J1ZjIob3V0Y2gsIHAsIGItPnBsYW5hcjBfb2ZmLAotCQkJYi0+cGxhbmFyMV9vZmYsIGItPnBsYW5hcjJfb2ZmKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQlicmVhazsKLQl9Ci0KLQljYXNlIENNRF9TTkFQX0JVRl9SRUxFQVNFOiB7Ci0JCXN0cnVjdCBtc21fZnJhbWUgKmI7Ci0JCXVuc2lnbmVkIGxvbmcgcDsKLQkJaW50IHJldDsKLQkJc3RydWN0IHZmZTMxX291dHB1dF9jaCAqb3V0Y2ggPSBOVUxMOwotCQlpZiAoIWRhdGEpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQliID0gKHN0cnVjdCBtc21fZnJhbWUgKikoY21kLT52YWx1ZSk7Ci0JCXAgPSAqKHVuc2lnbmVkIGxvbmcgKilkYXRhOwotCi0JCUNEQkcoIkNNRF9QSUNfQlVGX1JFTEVBU0UgYi0+cGF0aCA9ICVkXG4iLCBiLT5wYXRoKTsKLQotCQlpZiAoYi0+cGF0aCAmIE9VVFBVVF9UWVBFX1QpIHsKLQkJCUNEQkcoIkNNRF9GUkFNRV9CVUZfUkVMRUFTRSBnb3QgZnJlZSBidWZmZXJcbiIpOwotCQkJb3V0Y2ggPSAmdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxOwotCQl9IGVsc2UgaWYgKGItPnBhdGggJiBPVVRQVVRfVFlQRV9TKSB7Ci0JCQlvdXRjaCA9ICZ2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDI7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJcmV0ID0gdmZlMzFfYWRkX2ZyZWVfYnVmMihvdXRjaCwgcCwgYi0+cGxhbmFyMF9vZmYsCi0JCQliLT5wbGFuYXIxX29mZiwJYi0+cGxhbmFyMl9vZmYpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgQ01EX1NUQVRTX0FFQ19CVUZfUkVMRUFTRToKLQkJdmZlMzFfc3RhdHNfYWVjX2FjayhzYWNrKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9TVEFUU19BRl9CVUZfUkVMRUFTRToKLQkJdmZlMzFfc3RhdHNfYWZfYWNrKHNhY2spOwotCQlicmVhazsKLQotCWNhc2UgQ01EX1NUQVRTX0FXQl9CVUZfUkVMRUFTRToKLQkJdmZlMzFfc3RhdHNfYXdiX2FjayhzYWNrKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9TVEFUU19JSElTVF9CVUZfUkVMRUFTRToKLQkJdmZlMzFfc3RhdHNfaWhpc3RfYWNrKHNhY2spOwotCQlicmVhazsKLQotCWNhc2UgQ01EX1NUQVRTX1JTX0JVRl9SRUxFQVNFOgotCQl2ZmUzMV9zdGF0c19yc19hY2soc2Fjayk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDTURfU1RBVFNfQ1NfQlVGX1JFTEVBU0U6Ci0JCXZmZTMxX3N0YXRzX2NzX2FjayhzYWNrKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9BWElfQ0ZHX1BSRVZJRVc6IHsKLQkJc3RydWN0IGF4aWRhdGEgKmF4aWQ7Ci0JCXVpbnQzMl90ICpheGlvID0gTlVMTDsKLQkJYXhpZCA9IGRhdGE7Ci0JCWlmICghYXhpZCkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXhpbyA9Ci0JCQlrbWFsbG9jKHZmZTMxX2NtZFtWMzFfQVhJX09VVF9DRkddLmxlbmd0aCwKLQkJCQlHRlBfQVRPTUlDKTsKLQkJaWYgKCFheGlvKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihheGlvLCAodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQl2ZmUzMV9jbWRbVjMxX0FYSV9PVVRfQ0ZHXS5sZW5ndGgpKSB7Ci0JCQlrZnJlZShheGlvKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXZmZTMxX2NvbmZpZ19heGkoT1VUUFVUXzIsIGF4aWQsIGF4aW8pOwotCQlrZnJlZShheGlvKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBDTURfUkFXX1BJQ1RfQVhJX0NGRzogewotCQlzdHJ1Y3QgYXhpZGF0YSAqYXhpZDsKLQkJdWludDMyX3QgKmF4aW8gPSBOVUxMOwotCQlheGlkID0gZGF0YTsKLQkJaWYgKCFheGlkKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlheGlvID0KLQkJCWttYWxsb2ModmZlMzFfY21kW1YzMV9BWElfT1VUX0NGR10ubGVuZ3RoLAotCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIWF4aW8pIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXZmZTMxX2NtZFtWMzFfQVhJX09VVF9DRkddLmxlbmd0aCkpIHsKLQkJCWtmcmVlKGF4aW8pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJdmZlMzFfY29uZmlnX2F4aShDQU1JRl9UT19BWElfVklBX09VVFBVVF8yLCBheGlkLCBheGlvKTsKLQkJa2ZyZWUoYXhpbyk7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgQ01EX0FYSV9DRkdfU05BUDogewotCQlzdHJ1Y3QgYXhpZGF0YSAqYXhpZDsKLQkJdWludDMyX3QgKmF4aW8gPSBOVUxMOwotCQlDREJHKCIlcywgQ01EX0FYSV9DRkdfU05BUFxuIiwgX19mdW5jX18pOwotCQlheGlkID0gZGF0YTsKLQkJaWYgKCFheGlkKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWF4aW8gPQotCQkJa21hbGxvYyh2ZmUzMV9jbWRbVjMxX0FYSV9PVVRfQ0ZHXS5sZW5ndGgsCi0JCQkJR0ZQX0FUT01JQyk7Ci0JCWlmICghYXhpbykgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoYXhpbywgKHZvaWQgX191c2VyICopKHZmZWNtZC52YWx1ZSksCi0JCQkJdmZlMzFfY21kW1YzMV9BWElfT1VUX0NGR10ubGVuZ3RoKSkgewotCQkJa2ZyZWUoYXhpbyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQl2ZmUzMV9jb25maWdfYXhpKE9VVFBVVF8xX0FORF8yLCBheGlkLCBheGlvKTsKLQkJa2ZyZWUoYXhpbyk7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgQ01EX0FYSV9DRkdfWlNMOiB7Ci0JCXN0cnVjdCBheGlkYXRhICpheGlkOwotCQl1aW50MzJfdCAqYXhpbyA9IE5VTEw7Ci0JCUNEQkcoIiVzLCBDTURfQVhJX0NGR19aU0xcbiIsIF9fZnVuY19fKTsKLQkJYXhpZCA9IGRhdGE7Ci0JCWlmICghYXhpZCkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlheGlvID0KLQkJCWttYWxsb2ModmZlMzFfY21kW1YzMV9BWElfT1VUX0NGR10ubGVuZ3RoLAotCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIWF4aW8pIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXZmZTMxX2NtZFtWMzFfQVhJX09VVF9DRkddLmxlbmd0aCkpIHsKLQkJCWtmcmVlKGF4aW8pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJdmZlMzFfY29uZmlnX2F4aShPVVRQVVRfMV8yX0FORF8zLCBheGlkLCBheGlvKTsKLQkJa2ZyZWUoYXhpbyk7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgQ01EX0FYSV9DRkdfWlNMX0FMTF9DSE5MUzogewotCQlzdHJ1Y3QgYXhpZGF0YSAqYXhpZDsKLQkJdWludDMyX3QgKmF4aW87Ci0JCUNEQkcoIiVzLCBDTURfQVhJX0NGR19aU0xcbiIsIF9fZnVuY19fKTsKLQkJYXhpZCA9IGRhdGE7Ci0JCWlmICghYXhpZCkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlheGlvID0KLQkJCWttYWxsb2ModmZlMzFfY21kW1YzMV9BWElfT1VUX0NGR10ubGVuZ3RoLAotCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIWF4aW8pIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXZmZTMxX2NtZFtWMzFfQVhJX09VVF9DRkddLmxlbmd0aCkpIHsKLQkJCWtmcmVlKGF4aW8pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJdmZlMzFfY29uZmlnX2F4aShPVVRQVVRfWlNMX0FMTF9DSE5MUywgYXhpZCwgYXhpbyk7Ci0JCWtmcmVlKGF4aW8pOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9BWElfQ0ZHX1ZJREVPOiB7Ci0JCXN0cnVjdCBheGlkYXRhICpheGlkOwotCQl1aW50MzJfdCAqYXhpbyA9IE5VTEw7Ci0JCWF4aWQgPSBkYXRhOwotCQlpZiAoIWF4aWQpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYXhpbyA9Ci0JCQlrbWFsbG9jKHZmZTMxX2NtZFtWMzFfQVhJX09VVF9DRkddLmxlbmd0aCwKLQkJCQlHRlBfQVRPTUlDKTsKLQkJaWYgKCFheGlvKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihheGlvLCAodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQl2ZmUzMV9jbWRbVjMxX0FYSV9PVVRfQ0ZHXS5sZW5ndGgpKSB7Ci0JCQlrZnJlZShheGlvKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXZmZTMxX2NvbmZpZ19heGkoT1VUUFVUXzFfQU5EXzMsIGF4aWQsIGF4aW8pOwotCQlrZnJlZShheGlvKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBDTURfQVhJX0NGR19WSURFT19BTExfQ0hOTFM6IHsKLQkJc3RydWN0IGF4aWRhdGEgKmF4aWQ7Ci0JCXVpbnQzMl90ICpheGlvID0gTlVMTDsKLQkJYXhpZCA9IGRhdGE7Ci0JCWlmICghYXhpZCkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlheGlvID0KLQkJCWttYWxsb2ModmZlMzFfY21kW1YzMV9BWElfT1VUX0NGR10ubGVuZ3RoLAotCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIWF4aW8pIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXZmZTMxX2NtZFtWMzFfQVhJX09VVF9DRkddLmxlbmd0aCkpIHsKLQkJCWtmcmVlKGF4aW8pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJdmZlMzFfY29uZmlnX2F4aShPVVRQVVRfVklERU9fQUxMX0NITkxTLCBheGlkLCBheGlvKTsKLQkJa2ZyZWUoYXhpbyk7Ci0JCWJyZWFrOwotCX0KLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLXZmZTMxX2NvbmZpZ19kb25lOgotCWtmcmVlKHNjZmcpOwotCWtmcmVlKHNhY2spOwotCUNEQkcoIiVzIGRvbmU6IHJjID0gJWRcbiIsIF9fZnVuY19fLCAoaW50KSByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9zZW5kX21zZ19ub19wYXlsb2FkKGVudW0gVkZFMzFfTUVTU0FHRV9JRCBpZCkKLXsKLQlzdHJ1Y3QgdmZlX21lc3NhZ2UgbXNnOwotCi0JQ0RCRygidmZlMzFfc2VuZF9tc2dfbm9fcGF5bG9hZFxuIik7Ci0JbXNnLl9kID0gaWQ7Ci0JdmZlMzFfcHJvY19vcHMoaWQsICZtc2csIDApOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9wcm9jZXNzX3JlZ191cGRhdGVfaXJxKHZvaWQpCi17Ci0JdWludDMyX3QgIHRlbXAsIG9sZF92YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpZiAodmZlMzFfY3RybC0+cmVjb3JkaW5nX3N0YXRlID09IFZGRV9SRUNfU1RBVEVfU1RBUlRfUkVRVUVTVEVEKSB7Ci0JCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYgVkZFMzFfT1VUUFVUX01PREVfVikgewotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmNoMV0pOwotCQl9Ci0JCXZmZTMxX2N0cmwtPnJlY29yZGluZ19zdGF0ZSA9IFZGRV9SRUNfU1RBVEVfU1RBUlRFRDsKLQkJaWYgKHZwZV9jdHJsLT5kaXNfZW4pIHsKLQkJCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJCW9sZF92YWwgfD0gUlNfQ1NfRU5BQkxFX01BU0s7Ci0JCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQl9Ci0JCW1zbV9jYW1lcmFfaW9fd19tYigxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX1JFR19VUERBVEVfQ01EKTsKLQkJQ0RCRygic3RhcnQgdmlkZW8gdHJpZ2dlcmVkIC5cbiIpOwotCX0gZWxzZSBpZiAodmZlMzFfY3RybC0+cmVjb3JkaW5nX3N0YXRlCi0JCQk9PSBWRkVfUkVDX1NUQVRFX1NUT1BfUkVRVUVTVEVEKSB7Ci0JCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYgVkZFMzFfT1VUUFVUX01PREVfVikgewotCQkJbXNtX2NhbWVyYV9pb193KDAsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDAsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmNoMV0pOwotCQl9Ci0KLQkJLypkaXNhYmxlIHJzJiBjcyB3aGVuIHN0b3AgcmVjb3JkaW5nLiAqLwotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgJj0gKH5SU19DU19FTkFCTEVfTUFTSyk7Ci0JCW1zbV9jYW1lcmFfaW9fdyhvbGRfdmFsLAotCQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCUNEQkcoInN0b3AgdmlkZW8gdHJpZ2dlcmVkXG4iKTsKLQl9Ci0JaWYgKHZmZTMxX2N0cmwtPnN0YXJ0X2Fja19wZW5kaW5nID09IFRSVUUpIHsKLQkJdmZlMzFfc2VuZF9tc2dfbm9fcGF5bG9hZChNU0dfSURfU1RBUlRfQUNLKTsKLQkJdmZlMzFfY3RybC0+c3RhcnRfYWNrX3BlbmRpbmcgPSBGQUxTRTsKLQl9IGVsc2UgewotCQlpZiAodmZlMzFfY3RybC0+cmVjb3JkaW5nX3N0YXRlID09Ci0JCQlWRkVfUkVDX1NUQVRFX1NUT1BfUkVRVUVTVEVEKSB7Ci0JCQl2ZmUzMV9jdHJsLT5yZWNvcmRpbmdfc3RhdGUgPSBWRkVfUkVDX1NUQVRFX1NUT1BQRUQ7Ci0JCQltc21fY2FtZXJhX2lvX3dfbWIoMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQkJCQlWRkVfUkVHX1VQREFURV9DTUQpOwotCQl9IGVsc2UgaWYgKHZmZTMxX2N0cmwtPnJlY29yZGluZ19zdGF0ZSA9PQotCQkJVkZFX1JFQ19TVEFURV9TVE9QUEVEKSB7Ci0JCQlDREJHKCJzZW50IHN0b3AgdmlkZW8gcmVjIEFDSyIpOwotCQkJdmZlMzFfc2VuZF9tc2dfbm9fcGF5bG9hZChNU0dfSURfU1RPUF9SRUNfQUNLKTsKLQkJCXZmZTMxX2N0cmwtPnJlY29yZGluZ19zdGF0ZSA9IFZGRV9SRUNfU1RBVEVfSURMRTsKLQkJfQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMzFfY3RybC0+dXBkYXRlX2Fja19sb2NrLCBmbGFncyk7Ci0JCWlmICh2ZmUzMV9jdHJsLT51cGRhdGVfYWNrX3BlbmRpbmcgPT0gVFJVRSkgewotCQkJdmZlMzFfY3RybC0+dXBkYXRlX2Fja19wZW5kaW5nID0gRkFMU0U7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAotCQkJCSZ2ZmUzMV9jdHJsLT51cGRhdGVfYWNrX2xvY2ssIGZsYWdzKTsKLQkJCXZmZTMxX3NlbmRfbXNnX25vX3BheWxvYWQoTVNHX0lEX1VQREFURV9BQ0spOwotCQl9IGVsc2UgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKLQkJCQkmdmZlMzFfY3RybC0+dXBkYXRlX2Fja19sb2NrLCBmbGFncyk7Ci0JCX0KLQl9Ci0JLyogaW4gc25hcHNob3QgbW9kZSAqLwotCWlmICh2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQlWRkVfTU9ERV9PRl9PUEVSQVRJT05fU05BUFNIT1QpIHsKLQkJLyogbGF0ZXIgd2UgbmVlZCB0byBhZGQgY2hlY2sgZm9yIGxpdmUgc25hcHNob3QgbW9kZS4gKi8KLQotCQlpZiAodmZlMzFfY3RybC0+dmZlX2NhcHR1cmVfY291bnQpCi0JCQl2ZmUzMV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudC0tOwotCQkvKiBpZiBsYXN0IGZyYW1lIHRvIGJlIGNhcHR1cmVkOiAqLwotCQlpZiAodmZlMzFfY3RybC0+dmZlX2NhcHR1cmVfY291bnQgPT0gMCkgewotCQkJLyogc3RvcCB0aGUgYnVzIG91dHB1dDogIHdyaXRlIG1hc3RlciBlbmFibGUgPSAwKi8KLQkJCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCQkJVkZFMzFfT1VUUFVUX01PREVfUFQpIHsKLQkJCQltc21fY2FtZXJhX2lvX3coMCwgdmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQkJCXZmZTMxX0FYSV9XTV9DRkdbCi0JCQkJCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwXSk7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDAsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPgotCQkJCQkJb3V0cGF0aC5vdXQwLmNoMV0pOwotCQkJfQotCQkJaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQkJCQlWRkUzMV9PVVRQVVRfTU9ERV9TKSB7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDAsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPgotCQkJCQkJb3V0cGF0aC5vdXQxLmNoMF0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT4KLQkJCQkJCW91dHBhdGgub3V0MS5jaDFdKTsKLQkJCX0KLQotCQkJLyogRW5zdXJlIHRoZSB3cml0ZSBvcmRlciB3aGlsZSB3cml0aW5nCi0JCQl0byB0aGUgY29tbWFuZCByZWdpc3RlciB1c2luZyB0aGUgYmFycmllciAqLwotCQkJbXNtX2NhbWVyYV9pb193X21iKENBTUlGX0NPTU1BTkRfU1RPUF9BVF9GUkFNRV9CT1VOREFSWSwKLQkJCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0NBTUlGX0NPTU1BTkQpOwotCi0JCQkvKiBFbnN1cmUgdGhlIHJlYWQgb3JkZXIgd2hpbGUgcmVhZGluZwotCQkJdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdXNpbmcgdGhlIGJhcnJpZXIgKi8KLQkJCXRlbXAgPSBtc21fY2FtZXJhX2lvX3JfbWIodmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX0NBTUlGX0NPTU1BTkQpOwotCQl9Ci0JCS8qIHRoZW4gZG8gcmVnX3VwZGF0ZS4gKi8KLQkJbXNtX2NhbWVyYV9pb193X21iKDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX1JFR19VUERBVEVfQ01EKTsKLQl9IC8qIGlmIHNuYXBzaG90IG1vZGUuICovCi19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3NldF9kZWZhdWx0X3JlZ192YWx1ZXModm9pZCkKLXsKLQltc21fY2FtZXJhX2lvX3coMHg4MDAwODAsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfREVNVVhfR0FJTl8wKTsKLQltc21fY2FtZXJhX2lvX3coMHg4MDAwODAsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfREVNVVhfR0FJTl8xKTsKLQltc21fY2FtZXJhX2lvX3coMHhGRkZGRiwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9DR0NfT1ZFUlJJREUpOwotCi0JLyogZGVmYXVsdCBmcmFtZSBkcm9wIHBlcmlvZCBhbmQgcGF0dGVybiAqLwotCW1zbV9jYW1lcmFfaW9fdygweDFmLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0ZSQU1FRFJPUF9FTkNfWV9DRkcpOwotCW1zbV9jYW1lcmFfaW9fdygweDFmLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0ZSQU1FRFJPUF9FTkNfQ0JDUl9DRkcpOwotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGRkZGLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0ZSQU1FRFJPUF9FTkNfWV9QQVRURVJOKTsKLQltc21fY2FtZXJhX2lvX3coMHhGRkZGRkZGRiwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9GUkFNRURST1BfRU5DX0NCQ1JfUEFUVEVSTik7Ci0JbXNtX2NhbWVyYV9pb193KDB4MWYsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfRlJBTUVEUk9QX1ZJRVdfWSk7Ci0JbXNtX2NhbWVyYV9pb193KDB4MWYsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfRlJBTUVEUk9QX1ZJRVdfQ0JDUik7Ci0JbXNtX2NhbWVyYV9pb193KDB4RkZGRkZGRkYsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfRlJBTUVEUk9QX1ZJRVdfWV9QQVRURVJOKTsKLQltc21fY2FtZXJhX2lvX3coMHhGRkZGRkZGRiwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9GUkFNRURST1BfVklFV19DQkNSX1BBVFRFUk4pOwotCW1zbV9jYW1lcmFfaW9fdygwLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0NMQU1QX01JTik7Ci0JbXNtX2NhbWVyYV9pb193KDB4RkZGRkZGLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0NMQU1QX01BWCk7Ci0KLQkvKiBzdGF0cyBVQiBjb25maWcgKi8KLQltc21fY2FtZXJhX2lvX3coMHgzOTgwMDA3LAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19TVEFUU19BRUNfVUJfQ0ZHKTsKLQltc21fY2FtZXJhX2lvX3coMHgzQTAwMDA3LAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19TVEFUU19BRl9VQl9DRkcpOwotCW1zbV9jYW1lcmFfaW9fdygweDNBODAwMEYsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX0FXQl9VQl9DRkcpOwotCW1zbV9jYW1lcmFfaW9fdygweDNCODAwMDcsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX1JTX1VCX0NGRyk7Ci0JbXNtX2NhbWVyYV9pb193KDB4M0MwMDAxRiwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfQ1NfVUJfQ0ZHKTsKLQltc21fY2FtZXJhX2lvX3coMHgzRTAwMDFGLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19TVEFUU19ISVNUX1VCX0NGRyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3Byb2Nlc3NfcmVzZXRfaXJxKHZvaWQpCi17Ci0JYXRvbWljX3NldCgmdmZlMzFfY3RybC0+dnN0YXRlLCAwKTsKLQl2ZmUzMV9jdHJsLT53aGlsZV9zdG9wcGluZ19tYXNrID0gVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HXzE7Ci0JaWYgKGF0b21pY19yZWFkKCZ2ZmUzMV9jdHJsLT5zdG9wX2Fja19wZW5kaW5nKSkgewotCQkvKiB0aGlzIGlzIGZyb20gdGhlIHN0b3AgY29tbWFuZC4gKi8KLQkJYXRvbWljX3NldCgmdmZlMzFfY3RybC0+c3RvcF9hY2tfcGVuZGluZywgMCk7Ci0JCXZmZTMxX3NlbmRfbXNnX25vX3BheWxvYWQoTVNHX0lEX1NUT1BfQUNLKTsKLQl9IGVsc2UgewotCQkvKiB0aGlzIGlzIGZyb20gcmVzZXQgY29tbWFuZC4gKi8KLQkJdmZlMzFfc2V0X2RlZmF1bHRfcmVnX3ZhbHVlcygpOwotCi0JCS8qIHJlbG9hZCBhbGwgd3JpdGUgbWFzdGVycy4gKGZyYW1lICYgbGluZSkqLwotCQltc21fY2FtZXJhX2lvX3dfbWIoMHg3RkZGLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19DTUQpOwotCQl2ZmUzMV9zZW5kX21zZ19ub19wYXlsb2FkKE1TR19JRF9SRVNFVF9BQ0spOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9wcm9jZXNzX2F4aV9oYWx0X2lycSh2b2lkKQotewotCS8qIEVuc3VyZSB0aGUgd3JpdGUgb3JkZXIgd2hpbGUgd3JpdGluZwotCXRvIHRoZSBjb21tYW5kIHJlZ2lzdGVyIHVzaW5nIHRoZSBiYXJyaWVyICovCi0JbXNtX2NhbWVyYV9pb193X21iKEFYSV9IQUxUX0NMRUFSLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0FYSV9DTUQpOwotCXZmZTMxX2N0cmwtPndoaWxlX3N0b3BwaW5nX21hc2sgPSBWRkVfSU1BU0tfUkVTRVQ7Ci0KLQkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzLiAgKi8KLQltc21fY2FtZXJhX2lvX3coVkZFX0RJU0FCTEVfQUxMX0lSUVMsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX01BU0tfMCk7Ci0JbXNtX2NhbWVyYV9pb193KFZGRV9ESVNBQkxFX0FMTF9JUlFTLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9NQVNLXzEpOwotCi0JLyogY2xlYXIgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyovCi0JbXNtX2NhbWVyYV9pb193KFZGRV9DTEVBUl9BTExfSVJRUywKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ0xFQVJfMCk7Ci0JbXNtX2NhbWVyYV9pb193KFZGRV9DTEVBUl9BTExfSVJRUywKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ0xFQVJfMSk7Ci0JLyogRW5zdXJlIHRoZSB3cml0ZSBvcmRlciB3aGlsZSB3cml0aW5nCi0JdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdXNpbmcgdGhlIGJhcnJpZXIgKi8KLQltc21fY2FtZXJhX2lvX3dfbWIoMSwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ01EKTsKLQotCS8qIG5vdyBlbmFibGUgb25seSBoYWx0X2lycSAmIHJlc2V0X2lycSAqLwotCW1zbV9jYW1lcmFfaW9fdygweGYwMDAwMDAwLCAgICAgICAgICAvKiB0aGlzIGlzIGZvciBhc3luYyB0aW1lci4gKi8KLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfTUFTS18wKTsKLQltc21fY2FtZXJhX2lvX3coVkZFX0lNQVNLX1JFU0VULAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9NQVNLXzEpOwotCi0JLyogRW5zdXJlIHRoZSB3cml0ZSBvcmRlciB3aGlsZSB3cml0aW5nCi0JdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdXNpbmcgdGhlIGJhcnJpZXIgKi8KLQlDREJHKCIlczogYWJvdXQgdG8gcmVzZXQgdmZlLi4uXG4iLCBfX2Z1bmNfXyk7Ci0JbXNtX2NhbWVyYV9pb193X21iKFZGRV9SRVNFVF9VUE9OX1NUT1BfQ01ELAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0dMT0JBTF9SRVNFVCk7Ci0KLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfcHJvY2Vzc19jYW1pZl9zb2ZfaXJxKHZvaWQpCi17Ci0JdWludDMyX3QgIHRlbXA7Ci0KLQkvKiBpbiByYXcgc25hcHNob3QgbW9kZSAqLwotCWlmICh2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQlWRkVfTU9ERV9PRl9PUEVSQVRJT05fUkFXX1NOQVBTSE9UKSB7Ci0JCWlmICh2ZmUzMV9jdHJsLT5zdGFydF9hY2tfcGVuZGluZykgewotCQkJdmZlMzFfc2VuZF9tc2dfbm9fcGF5bG9hZChNU0dfSURfU1RBUlRfQUNLKTsKLQkJCXZmZTMxX2N0cmwtPnN0YXJ0X2Fja19wZW5kaW5nID0gRkFMU0U7Ci0JCX0KLQkJaWYgKHZmZTMxX2N0cmwtPnZmZV9jYXB0dXJlX2NvdW50KQotCQkJdmZlMzFfY3RybC0+dmZlX2NhcHR1cmVfY291bnQtLTsKLQkJLyogaWYgbGFzdCBmcmFtZSB0byBiZSBjYXB0dXJlZDogKi8KLQkJaWYgKHZmZTMxX2N0cmwtPnZmZV9jYXB0dXJlX2NvdW50ID09IDApIHsKLQkJCS8qIEVuc3VyZSB0aGUgd3JpdGUgb3JkZXIgd2hpbGUgd3JpdGluZwotCQkJdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdXNpbmcgdGhlIGJhcnJpZXIgKi8KLQkJCW1zbV9jYW1lcmFfaW9fd19tYihDQU1JRl9DT01NQU5EX1NUT1BfQVRfRlJBTUVfQk9VTkRBUlksCi0JCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9DQU1JRl9DT01NQU5EKTsKLQkJCXRlbXAgPSBtc21fY2FtZXJhX2lvX3JfbWIodmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX0NBTUlGX0NPTU1BTkQpOwotCQl9Ci0JfSAvKiBpZiByYXcgc25hcHNob3QgbW9kZS4gKi8KLQotCWlmICgodmZlMzFfY3RybC0+aGZyX21vZGUgIT0gSEZSX01PREVfT0ZGKSAmJgotCQkodmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0gVkZFX01PREVfT0ZfT1BFUkFUSU9OX1ZJREVPKSAmJgotCQkodmZlMzFfY3RybC0+dmZlRnJhbWVJZCAlIHZmZTMxX2N0cmwtPmhmcl9tb2RlICE9IDApKSB7Ci0JCXZmZTMxX2N0cmwtPnZmZUZyYW1lSWQrKzsKLQkJQ0RCRygiU2tpcCB0aGUgU09GIG5vdGlmaWNhdGlvbiB3aGVuIEhGUiBlbmFibGVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQl2ZmUzMV9zZW5kX21zZ19ub19wYXlsb2FkKE1TR19JRF9TT0ZfQUNLKTsKLQl2ZmUzMV9jdHJsLT52ZmVGcmFtZUlkKys7Ci0JQ0RCRygiY2FtaWZfc29mX2lycSwgZnJhbWVJZCA9ICVkXG4iLCB2ZmUzMV9jdHJsLT52ZmVGcmFtZUlkKTsKLQotCWlmICh2ZmUzMV9jdHJsLT5zeW5jX3RpbWVyX3N0YXRlKSB7Ci0JCWlmICh2ZmUzMV9jdHJsLT5zeW5jX3RpbWVyX3JlcGVhdF9jb3VudCA9PSAwKQotCQkJdmZlMzFfc3luY190aW1lcl9zdG9wKCk7Ci0JCWVsc2UKLQkJdmZlMzFfY3RybC0+c3luY190aW1lcl9yZXBlYXRfY291bnQtLTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3Byb2Nlc3NfZXJyb3JfaXJxKHVpbnQzMl90IGVyclN0YXR1cykKLXsKLQl1aW50MzJfdCBjYW1pZlN0YXR1cywgcmVhZF92YWw7Ci0JdWludDMyX3QgKnRlbXA7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfQ0FNSUZfRVJST1IpIHsKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IGNhbWlmIGVycm9yc1xuIik7Ci0JCXRlbXAgPSAodWludDMyX3QgKikodmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9DQU1JRl9TVEFUVVMpOwotCQljYW1pZlN0YXR1cyA9IG1zbV9jYW1lcmFfaW9fcih0ZW1wKTsKLQkJcHJfZXJyKCJjYW1pZlN0YXR1cyAgPSAweCV4XG4iLCBjYW1pZlN0YXR1cyk7Ci0JCXZmZTMxX3NlbmRfbXNnX25vX3BheWxvYWQoTVNHX0lEX0NBTUlGX0VSUk9SKTsKLQl9Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfU1RBVFNfQ1NfT1ZXUikKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IHN0YXRzIGNzIG92ZXJ3cml0ZVxuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfU1RBVFNfSUhJU1RfT1ZXUikKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IHN0YXRzIGloaXN0IG92ZXJ3cml0ZVxuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfUkVBTElHTl9CVUZfWV9PVkZMKQotCQlwcl9lcnIoInZmZTMxX2lycTogcmVhbGlnbiBidWcgWSBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfUkVBTElHTl9CVUZfQ0JfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IHJlYWxpZ24gYnVnIENCIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMV9JTUFTS19SRUFMSUdOX0JVRl9DUl9PVkZMKQotCQlwcl9lcnIoInZmZTMxX2lycTogcmVhbGlnbiBidWcgQ1Igb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMxX0lNQVNLX1ZJT0xBVElPTikKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IHZpb2xhdGlvbiBpbnRlcnJ1cHRcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMxX0lNQVNLX0lNR19NQVNUXzBfQlVTX09WRkwpCi0JCXByX2VycigidmZlMzFfaXJxOiBpbWFnZSBtYXN0ZXIgMCBidXMgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMxX0lNQVNLX0lNR19NQVNUXzFfQlVTX09WRkwpCi0JCXByX2VycigidmZlMzFfaXJxOiBpbWFnZSBtYXN0ZXIgMSBidXMgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMxX0lNQVNLX0lNR19NQVNUXzJfQlVTX09WRkwpCi0JCXByX2VycigidmZlMzFfaXJxOiBpbWFnZSBtYXN0ZXIgMiBidXMgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMxX0lNQVNLX0lNR19NQVNUXzNfQlVTX09WRkwpCi0JCXByX2VycigidmZlMzFfaXJxOiBpbWFnZSBtYXN0ZXIgMyBidXMgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMxX0lNQVNLX0lNR19NQVNUXzRfQlVTX09WRkwpCi0JCXByX2VycigidmZlMzFfaXJxOiBpbWFnZSBtYXN0ZXIgNCBidXMgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMxX0lNQVNLX0lNR19NQVNUXzVfQlVTX09WRkwpCi0JCXByX2VycigidmZlMzFfaXJxOiBpbWFnZSBtYXN0ZXIgNSBidXMgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMxX0lNQVNLX0lNR19NQVNUXzZfQlVTX09WRkwpCi0JCXByX2VycigidmZlMzFfaXJxOiBpbWFnZSBtYXN0ZXIgNiBidXMgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMxX0lNQVNLX1NUQVRTX0FFX0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTMxX2lycTogYWUgc3RhdHMgYnVzIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMV9JTUFTS19TVEFUU19BRl9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IGFmIHN0YXRzIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfU1RBVFNfQVdCX0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTMxX2lycTogYXdiIHN0YXRzIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfU1RBVFNfUlNfQlVTX09WRkwpCi0JCXByX2VycigidmZlMzFfaXJxOiBycyBzdGF0cyBidXMgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMxX0lNQVNLX1NUQVRTX0NTX0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTMxX2lycTogY3Mgc3RhdHMgYnVzIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMV9JTUFTS19TVEFUU19JSElTVF9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IGloaXN0IHN0YXRzIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfU1RBVFNfU0tJTl9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IHNraW4gc3RhdHMgYnVzIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMV9JTUFTS19BWElfRVJST1IpIHsKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IGF4aSBlcnJvclxuIik7Ci0JCS8qIHJlYWQgc3RhdHVzIHRvbyB3aGVuIG92ZXJmbG93IGhhcHBlbnMuKi8KLQkJcmVhZF92YWwgPSBtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfQlVTX1BJTkdfUE9OR19TVEFUVVMpOwotCQlwcl9kZWJ1ZygiVkZFX0JVU19QSU5HX1BPTkdfU1RBVFVTID0gMHgleFxuIiwgcmVhZF92YWwpOwotCQlyZWFkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfT1BFUkFUSU9OX1NUQVRVUyk7Ci0JCXByX2RlYnVnKCJWRkVfQlVTX09QRVJBVElPTl9TVEFUVVMgPSAweCV4XG4iLCByZWFkX3ZhbCk7Ci0JCXJlYWRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0JVU19JTUFHRV9NQVNURVJfMF9XUl9QTV9TVEFUU18wKTsKLQkJcHJfZGVidWcoIlZGRV9CVVNfSU1BR0VfTUFTVEVSXzBfV1JfUE1fU1RBVFNfMCA9IDB4JXhcbiIsCi0JCQlyZWFkX3ZhbCk7Ci0JCXJlYWRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0JVU19JTUFHRV9NQVNURVJfMF9XUl9QTV9TVEFUU18xKTsKLQkJcHJfZGVidWcoIlZGRV9CVVNfSU1BR0VfTUFTVEVSXzBfV1JfUE1fU1RBVFNfMSA9IDB4JXhcbiIsCi0JCQlyZWFkX3ZhbCk7Ci0JCXJlYWRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0FYSV9TVEFUVVMpOwotCQlwcl9kZWJ1ZygiVkZFX0FYSV9TVEFUVVMgPSAweCV4XG4iLCByZWFkX3ZhbCk7Ci0JfQotfQotCi0jZGVmaW5lIFZGRTMxX0FYSV9PRkZTRVQgMHgwMDUwCi0jZGVmaW5lIHZmZTMxX2dldF9jaF9waW5nX2FkZHIoY2huKSBcCi0JKG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsgMHgwMDUwICsgMHgxOCAqIChjaG4pKSkKLSNkZWZpbmUgdmZlMzFfZ2V0X2NoX3BvbmdfYWRkcihjaG4pIFwKLQkobXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyAweDAwNTAgKyAweDE4ICogKGNobikgKyA0KSkKLSNkZWZpbmUgdmZlMzFfZ2V0X2NoX2FkZHIocGluZ19wb25nLCBjaG4pIFwKLQkoKChwaW5nX3BvbmcpICYgKDEgPDwgKGNobikpKSA9PSAwID8gXAotCXZmZTMxX2dldF9jaF9wb25nX2FkZHIoY2huKSA6IHZmZTMxX2dldF9jaF9waW5nX2FkZHIoY2huKSkKLQotI2RlZmluZSB2ZmUzMV9wdXRfY2hfcGluZ19hZGRyKGNobiwgYWRkcikgXAotCShtc21fY2FtZXJhX2lvX3coKGFkZHIpLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgMHgwMDUwICsgMHgxOCAqIChjaG4pKSkKLSNkZWZpbmUgdmZlMzFfcHV0X2NoX3BvbmdfYWRkcihjaG4sIGFkZHIpIFwKLQkobXNtX2NhbWVyYV9pb193KChhZGRyKSwgXAotCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyAweDAwNTAgKyAweDE4ICogKGNobikgKyA0KSkKLSNkZWZpbmUgdmZlMzFfcHV0X2NoX2FkZHIocGluZ19wb25nLCBjaG4sIGFkZHIpIFwKLQkoKChwaW5nX3BvbmcpICYgKDEgPDwgKGNobikpKSA9PSAwID8gICBcCi0JdmZlMzFfcHV0X2NoX3BvbmdfYWRkcigoY2huKSwgKGFkZHIpKSA6IFwKLQl2ZmUzMV9wdXRfY2hfcGluZ19hZGRyKChjaG4pLCAoYWRkcikpKQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9wcm9jZXNzX291dHB1dF9wYXRoX2lycV8wKHVpbnQzMl90IHBpbmdfcG9uZykKLXsKLQl1aW50MzJfdCBwMF9hZGRyLCBwMV9hZGRyLCBwMl9hZGRyOwotI2lmZGVmIENPTkZJR19NU01fQ0FNRVJBX1Y0TDIKLQl1aW50MzJfdCBweWFkZHJfcGluZywgcGNiY3JhZGRyX3BpbmcsIHB5YWRkcl9wb25nLCBwY2JjcmFkZHJfcG9uZzsKLSNlbmRpZgotCXN0cnVjdCB2ZmUzMV9mcmVlX2J1ZiAqZnJlZV9idWYgPSBOVUxMOwotCS8qIHdlIHJlbmRlciBmcmFtZXMgaW4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCTEuIENvbnRpbnVvdXMgbW9kZSBhbmQgdGhlIGZyZWUgYnVmZmVyIGlzIGF2YWlhbGFibGUuCi0JKi8KLQlpZiAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCVZGRTMxX09VVFBVVF9NT0RFX1BfQUxMX0NITkxTKSB7Ci0JCWlmICghKCgocGluZ19wb25nICYgUElOR1BPTkdfTE9XRVIpID09IFBJTkdQT05HX0xPV0VSKSB8fAotCQkJKChwaW5nX3BvbmcgJiBQSU5HUE9OR19MT1dFUikgPT0gMHgwKSkpIHsKLQkJCXByX2VycigiIElycV8yIC0gc2tpcCB0aGUgZnJhbWUgcHBfc3RhdHVzIGlzIG5vdCBwcm9wZXIiCi0JCQkJIlBQX3N0YXR1cyA9IDB4JXhcbiIsIHBpbmdfcG9uZyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JZnJlZV9idWYgPSB2ZmUzMV9nZXRfZnJlZV9idWYoJnZmZTMxX2N0cmwtPm91dHBhdGgub3V0MCk7Ci0KLQlpZiAoZnJlZV9idWYpIHsKLQkJLyogWSBjaGFubmVsICovCi0JCXAwX2FkZHIgPSB2ZmUzMV9nZXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwKTsKLQkJLyogQ2hyb21hIGNoYW5uZWwgKi8KLQkJcDFfYWRkciA9IHZmZTMxX2dldF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDEpOwotCQlpZiAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCQlWRkUzMV9PVVRQVVRfTU9ERV9QX0FMTF9DSE5MUykgewotCQkJcDJfYWRkciA9IHZmZTMxX2dldF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gyKTsKLQkJfSBlbHNlIHsKLQkJCXAyX2FkZHIgPSBwMF9hZGRyOwotCQl9Ci0JCUNEQkcoIk91dHB1dCBwYXRoIDAsIHAwX2FkZHIgPSAweCV4LCBwMV9hZGRyID0gMHgleCwiCi0JCQkgInAyX2FkZHIgPSAweCV4XG4iLCBwMF9hZGRyLCBwMV9hZGRyLCBwMl9hZGRyKTsKLQkJLyogWSBjaGFubmVsICovCi0JCXZmZTMxX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDAsCi0JCQlmcmVlX2J1Zi0+cGFkZHIgKyBmcmVlX2J1Zi0+cGxhbmFyMF9vZmYpOwotCQkvKiBDaHJvbWEgY2hhbm5lbCAqLwotCQl2ZmUzMV9wdXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxLAotCQkJZnJlZV9idWYtPnBhZGRyICsgZnJlZV9idWYtPnBsYW5hcjFfb2ZmKTsKLQkJaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQkJVkZFMzFfT1VUUFVUX01PREVfUF9BTExfQ0hOTFMpCi0JCQl2ZmUzMV9wdXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMiwKLQkJCWZyZWVfYnVmLT5wYWRkciArIGZyZWVfYnVmLT5wbGFuYXIyX29mZik7Ci0JCQlrZnJlZShmcmVlX2J1Zik7Ci0JCQkvKiBpZiBjb250aW51b3VzIG1vZGUsIGZvciBkaXNwbGF5LiAocHJldmlldykgKi8KLQkJCXZmZV9zZW5kX291dG1zZyhNU0dfSURfT1VUUFVUX1AsICBwMF9hZGRyLCBwMV9hZGRyLAotCQkJCXAyX2FkZHIpOwotCX0gZWxzZSB7Ci0JCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5mcmFtZV9kcm9wX2NudCsrOwotCQlwcl93YXJuaW5nKCJwYXRoX2lycV8wIC0gbm8gZnJlZSBidWZmZXIhXG4iKTsKLSNpZmRlZiBDT05GSUdfTVNNX0NBTUVSQV9WNEwyCi0JCXByX2luZm8oIlN3YXBwaW5nIHBpbmcgYW5kIHBvbmdcbiIpOwotCi0JCS8qZ2V0IGFkZHJlc3NlcyovCi0JCS8qIFkgY2hhbm5lbCAqLwotCQlweWFkZHJfcGluZyA9IHZmZTMxX2dldF9jaF9waW5nX2FkZHIoCi0JCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwKTsKLQkJLyogQ2hyb21hIGNoYW5uZWwgKi8KLQkJcGNiY3JhZGRyX3BpbmcgPSB2ZmUzMV9nZXRfY2hfcGluZ19hZGRyKAotCQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMSk7Ci0JCS8qIFkgY2hhbm5lbCAqLwotCQlweWFkZHJfcG9uZyA9IHZmZTMxX2dldF9jaF9wb25nX2FkZHIoCi0JCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwKTsKLQkJLyogQ2hyb21hIGNoYW5uZWwgKi8KLQkJcGNiY3JhZGRyX3BvbmcgPSB2ZmUzMV9nZXRfY2hfcG9uZ19hZGRyKAotCQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMSk7Ci0KLQkJQ0RCRygicGluZyA9IDB4JXAsIHBvbmcgPSAweCVwXG4iLCAodm9pZCAqKXB5YWRkcl9waW5nLAotCQkJKHZvaWQgKilweWFkZHJfcG9uZyk7Ci0JCUNEQkcoInBpbmdfY2JjciA9IDB4JXAsIHBvbmdfY2JjciA9IDB4JXBcbiIsCi0JCQkodm9pZCAqKXBjYmNyYWRkcl9waW5nLCAodm9pZCAqKXBjYmNyYWRkcl9wb25nKTsKLQotCQkvKnB1dCBhZGRyZXNzZXMqLwotCQkvKiBTV0FQIHkgY2hhbm5lbCovCi0JCXZmZTMxX3B1dF9jaF9waW5nX2FkZHIodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMCwKLQkJCXB5YWRkcl9wb25nKTsKLQkJdmZlMzFfcHV0X2NoX3BvbmdfYWRkcih2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwLAotCQkJcHlhZGRyX3BpbmcpOwotCQkvKiBTV0FQIGNocm9tYSBjaGFubmVsKi8KLQkJdmZlMzFfcHV0X2NoX3BpbmdfYWRkcih2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxLAotCQkJcGNiY3JhZGRyX3BvbmcpOwotCQl2ZmUzMV9wdXRfY2hfcG9uZ19hZGRyKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDEsCi0JCQlwY2JjcmFkZHJfcGluZyk7Ci0JCUNEQkcoImFmdGVyIHN3YXA6IHBpbmcgPSAweCVwLCBwb25nID0gMHglcFxuIiwKLQkJCSh2b2lkICopcHlhZGRyX3BvbmcsICh2b2lkICopcHlhZGRyX3BpbmcpOwotI2VuZGlmCi0JfQotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9wcm9jZXNzX3NuYXBzaG90X2ZyYW1lKHVpbnQzMl90IHBpbmdfcG9uZykKLXsKLQl1aW50MzJfdCBwMF9hZGRyLCBwMV9hZGRyOwotCXN0cnVjdCB2ZmUzMV9mcmVlX2J1ZiAqZnJlZV9idWYgPSBOVUxMOwotCS8qIFkgY2hhbm5lbC0gTWFpbiBJbWFnZSAqLwotCXAwX2FkZHIgPSB2ZmUzMV9nZXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDApOwotCS8qIENocm9tYSBjaGFubmVsIC0gVE4gSW1hZ2UgKi8KLQlwMV9hZGRyID0gdmZlMzFfZ2V0X2NoX2FkZHIocGluZ19wb25nLAotCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxKTsKLQotCWZyZWVfYnVmID0gdmZlMzFfZ2V0X2ZyZWVfYnVmKCZ2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEpOwotCUNEQkcoIiVzOiBzbmFwc2hvdCBtYWluLCBwMF9hZGRyID0gMHgleCwgcDFfYWRkciA9IDB4JXhcbiIsCi0JCV9fZnVuY19fLCBwMF9hZGRyLCBwMV9hZGRyKTsKLQlpZiAoZnJlZV9idWYpIHsKLQkJLyogWSBjaGFubmVsICovCi0JCXZmZTMxX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDAsCi0JCQlmcmVlX2J1Zi0+cGFkZHIgKyBmcmVlX2J1Zi0+cGxhbmFyMF9vZmYpOwotCQkvKiBDaHJvbWEgY2hhbm5lbCAqLwotCQl2ZmUzMV9wdXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxLAotCQkJZnJlZV9idWYtPnBhZGRyICsgZnJlZV9idWYtPnBsYW5hcjFfb2ZmKTsKLQkJa2ZyZWUoZnJlZV9idWYpOwotCX0KLQl2ZmVfc2VuZF9vdXRtc2coTVNHX0lEX09VVFBVVF9TLCBwMF9hZGRyLCBwMV9hZGRyLCBwMF9hZGRyKTsKLQotCS8qIFkgY2hhbm5lbC0gVE4gSW1hZ2UgKi8KLQlwMF9hZGRyID0gdmZlMzFfZ2V0X2NoX2FkZHIocGluZ19wb25nLAotCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwKTsKLQkvKiBDaHJvbWEgY2hhbm5lbCAtIFROIEltYWdlICovCi0JcDFfYWRkciA9IHZmZTMxX2dldF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMSk7Ci0KLQlmcmVlX2J1ZiA9IHZmZTMxX2dldF9mcmVlX2J1ZigmdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwKTsKLQlDREJHKCIlczogc25hcHNob3QgVE4sIHAwX2FkZHIgPSAweCV4LCBwMV9hZGRyID0gMHgleFxuIiwKLQkJX19mdW5jX18sIHAwX2FkZHIsIHAxX2FkZHIpOwotCWlmIChmcmVlX2J1ZikgewotCQkvKiBZIGNoYW5uZWwgKi8KLQkJdmZlMzFfcHV0X2NoX2FkZHIocGluZ19wb25nLAotCQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMCwKLQkJCWZyZWVfYnVmLT5wYWRkciArIGZyZWVfYnVmLT5wbGFuYXIwX29mZik7Ci0JCS8qIENocm9tYSBjaGFubmVsICovCi0JCXZmZTMxX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDEsCi0JCQlmcmVlX2J1Zi0+cGFkZHIgKyBmcmVlX2J1Zi0+cGxhbmFyMV9vZmYpOwotCQlrZnJlZShmcmVlX2J1Zik7Ci0JfQotCi0JdmZlX3NlbmRfb3V0bXNnKE1TR19JRF9PVVRQVVRfVCwgcDBfYWRkciwgcDFfYWRkciwgcDBfYWRkcik7Ci0KLQkvKiBpbiBzbmFwc2hvdCBtb2RlIGlmIGRvbmUgdGhlbiBzZW5kCi0JCXNuYXBzaG90IGRvbmUgbWVzc2FnZSAqLwotCWlmICh2ZmUzMV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudCA9PSAwKSB7Ci0JCXZmZTMxX3NlbmRfbXNnX25vX3BheWxvYWQoTVNHX0lEX1NOQVBTSE9UX0RPTkUpOwotCQkvKiBFbnN1cmUgdGhlIHdyaXRlIG9yZGVyIHdoaWxlIHdyaXRpbmcKLQkJCXRvIHRoZSBjbWQgcmVnaXN0ZXIgdXNpbmcgYmFycmllciAqLwotCQltc21fY2FtZXJhX2lvX3dfbWIoQ0FNSUZfQ09NTUFORF9TVE9QX0lNTUVESUFURUxZLAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfQ0FNSUZfQ09NTUFORCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9wcm9jZXNzX3Jhd19zbmFwc2hvdF9mcmFtZSh1aW50MzJfdCBwaW5nX3BvbmcpCi17Ci0JdWludDMyX3QgcHlhZGRyLCBwY2JjcmFkZHI7Ci0Jc3RydWN0IHZmZTMxX2ZyZWVfYnVmICpmcmVlX2J1ZiA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9zeW5jKiBwX3N5bmMgPSAoc3RydWN0IG1zbV9zeW5jICopdmZlX3N5bmNkYXRhOwotCi0JaWYgKHBfc3luYy0+c3RlcmVvY2FtX2VuYWJsZWQpCi0JCXBfc3luYy0+c3RlcmVvX3N0YXRlID0gU1RFUkVPX1JBV19TTkFQX1NUQVJURUQ7Ci0KLQkvKiBZIGNoYW5uZWwtIE1haW4gSW1hZ2UgKi8KLQlweWFkZHIgPSB2ZmUzMV9nZXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDApOwotCS8qIENocm9tYSBjaGFubmVsIC0gTWFpbiBJbWFnZSAqLwotCXBjYmNyYWRkciA9IHZmZTMxX2dldF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSk7Ci0KLQlmcmVlX2J1ZiA9IHZmZTMxX2dldF9mcmVlX2J1ZigmdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxKTsKLQlDREJHKCIlczogc25hcHNob3QgcmF3LCBweWFkZHIgPSAweCV4LCBwY2JjcmFkZHIgPSAweCV4XG4iLAotCQlfX2Z1bmNfXywgcHlhZGRyLCBwY2JjcmFkZHIpOwotCWlmIChmcmVlX2J1ZikgewotCQkvKiBZIGNoYW5uZWwgKi8KLQkJdmZlMzFfcHV0X2NoX2FkZHIocGluZ19wb25nLAotCQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMCwKLQkJCWZyZWVfYnVmLT5wYWRkciArIGZyZWVfYnVmLT5wbGFuYXIwX29mZik7Ci0JCS8qIENocm9tYSBjaGFubmVsICovCi0JCXZmZTMxX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDEsCi0JCQlmcmVlX2J1Zi0+cGFkZHIgKyBmcmVlX2J1Zi0+cGxhbmFyMV9vZmYpOwotCQlrZnJlZShmcmVlX2J1Zik7Ci0JfQotCSB2ZmVfc2VuZF9vdXRtc2coTVNHX0lEX09VVFBVVF9TLCBweWFkZHIsIHBjYmNyYWRkciwgMCk7Ci0KLQkvKiBpbiBzbmFwc2hvdCBtb2RlIGlmIGRvbmUgdGhlbiBzZW5kCi0JCXNuYXBzaG90IGRvbmUgbWVzc2FnZSAqLwotCWlmICh2ZmUzMV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudCA9PSAwKSB7Ci0JCXZmZTMxX3NlbmRfbXNnX25vX3BheWxvYWQoTVNHX0lEX1NOQVBTSE9UX0RPTkUpOwotCQkvKiBFbnN1cmUgdGhlIHdyaXRlIG9yZGVyIHdoaWxlIHdyaXRpbmcKLQkJdG8gdGhlIGNtZCByZWdpc3RlciB1c2luZyBiYXJyaWVyICovCi0JCW1zbV9jYW1lcmFfaW9fd19tYihDQU1JRl9DT01NQU5EX1NUT1BfSU1NRURJQVRFTFksCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9DQU1JRl9DT01NQU5EKTsKLQl9Ci19Ci1zdGF0aWMgdm9pZCB2ZmUzMV9wcm9jZXNzX3pzbF9mcmFtZSh1aW50MzJfdCBwaW5nX3BvbmcpCi17Ci0JdWludDMyX3QgcDBfYWRkciwgcDFfYWRkcjsKLQlzdHJ1Y3QgdmZlMzFfZnJlZV9idWYgKmZyZWVfYnVmID0gTlVMTDsKLQkvKiBZIGNoYW5uZWwtIE1haW4gSW1hZ2UgKi8KLQlwMF9hZGRyID0gdmZlMzFfZ2V0X2NoX2FkZHIocGluZ19wb25nLAotCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDIuY2gwKTsKLQkvKiBDaHJvbWEgY2hhbm5lbCAtIE1haW4gSW1hZ2UgKi8KLQlwMV9hZGRyID0gdmZlMzFfZ2V0X2NoX2FkZHIocGluZ19wb25nLAotCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDIuY2gxKTsKLQotCWZyZWVfYnVmID0gdmZlMzFfZ2V0X2ZyZWVfYnVmKCZ2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDIpOwotCUNEQkcoIiVzOiBzbmFwc2hvdCBtYWluLCBweWFkZHIgPSAweCV4LCBwY2JjcmFkZHIgPSAweCV4XG4iLAotCQlfX2Z1bmNfXywgcDBfYWRkciwgcDFfYWRkcik7Ci0JaWYgKGZyZWVfYnVmKSB7Ci0JCS8qIFkgY2hhbm5lbCAqLwotCQl2ZmUzMV9wdXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDIuY2gwLAotCQkJZnJlZV9idWYtPnBhZGRyICsgZnJlZV9idWYtPnBsYW5hcjBfb2ZmKTsKLQkJLyogQ2hyb21hIGNoYW5uZWwgKi8KLQkJdmZlMzFfcHV0X2NoX2FkZHIocGluZ19wb25nLAotCQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmNoMSwKLQkJCWZyZWVfYnVmLT5wYWRkciArIGZyZWVfYnVmLT5wbGFuYXIxX29mZik7Ci0JCWtmcmVlKGZyZWVfYnVmKTsKLQl9Ci0JIHZmZV9zZW5kX291dG1zZyhNU0dfSURfT1VUUFVUX1MsIHAwX2FkZHIsIHAxX2FkZHIsIHAwX2FkZHIpOwotCi0JLyogWSBjaGFubmVsLSBUTiBJbWFnZSAqLwotCXAwX2FkZHIgPSB2ZmUzMV9nZXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDApOwotCS8qIENocm9tYSBjaGFubmVsIC0gVE4gSW1hZ2UgKi8KLQlwMV9hZGRyID0gdmZlMzFfZ2V0X2NoX2FkZHIocGluZ19wb25nLAotCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxKTsKLQotCWZyZWVfYnVmID0gdmZlMzFfZ2V0X2ZyZWVfYnVmKCZ2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEpOwotCUNEQkcoIiVzOiBzbmFwc2hvdCBUTiwgcHlhZGRyID0gMHgleCwgcGNiY3JhZGRyID0gMHgleFxuIiwKLQkJX19mdW5jX18sIHAwX2FkZHIsIHAxX2FkZHIpOwotCWlmIChmcmVlX2J1ZikgewotCQkvKiBZIGNoYW5uZWwgKi8KLQkJdmZlMzFfcHV0X2NoX2FkZHIocGluZ19wb25nLAotCQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMCwKLQkJCWZyZWVfYnVmLT5wYWRkciArIGZyZWVfYnVmLT5wbGFuYXIwX29mZik7Ci0JCS8qIENocm9tYSBjaGFubmVsICovCi0JCXZmZTMxX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDEsCi0JCQlmcmVlX2J1Zi0+cGFkZHIgKyBmcmVlX2J1Zi0+cGxhbmFyMV9vZmYpOwotCQlrZnJlZShmcmVlX2J1Zik7Ci0JfQotCi0JdmZlX3NlbmRfb3V0bXNnKE1TR19JRF9PVVRQVVRfVCwgcDBfYWRkciwgcDFfYWRkciwgcDBfYWRkcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3Byb2Nlc3Nfb3V0cHV0X3BhdGhfaXJxXzEodWludDMyX3QgcGluZ19wb25nKQotewotCi0jaWZkZWYgQ09ORklHX01TTV9DQU1FUkFfVjRMMgotCXVpbnQzMl90IHB5YWRkcl9waW5nLCBwY2JjcmFkZHJfcGluZywgcHlhZGRyX3BvbmcsIHBjYmNyYWRkcl9wb25nOwotI2VuZGlmCi0JQ0RCRygiJXMsIG9wZXJhdGlvbl9tb2RlID0gJWQsIGNhcF9jbnQgPSAlZFxuIiwgX19mdW5jX18sCi0JCXZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlLCB2ZmUzMV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudCk7Ci0KLQkvKiBJbiBTbmFwc2hvdCBtb2RlICovCi0JaWYgKChWRkVfTU9ERV9PRl9PUEVSQVRJT05fU05BUFNIT1QgPT0gdmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUpCi0JCSYmICgodmZlMzFfY3RybC0+dmZlX2NhcHR1cmVfY291bnQgPD0gMSkKLQkJfHwgKHZmZTMxX2ZyZWVfYnVmX2F2YWlsYWJsZSh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDApICYmCi0JCXZmZTMxX2ZyZWVfYnVmX2F2YWlsYWJsZSh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEpKSkpIHsKLQkJdmZlMzFfcHJvY2Vzc19zbmFwc2hvdF9mcmFtZShwaW5nX3BvbmcpOwotCX0gZWxzZSBpZiAoKFZGRV9NT0RFX09GX09QRVJBVElPTl9SQVdfU05BUFNIT1QgPT0KLQkJdmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUpICYmCi0JCSgodmZlMzFfY3RybC0+dmZlX2NhcHR1cmVfY291bnQgPD0gMSkgfHwKLQkJdmZlMzFfZnJlZV9idWZfYXZhaWxhYmxlKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MSkpKSB7Ci0JCXZmZTMxX3Byb2Nlc3NfcmF3X3NuYXBzaG90X2ZyYW1lKHBpbmdfcG9uZyk7Ci0JfSBlbHNlIGlmICgoVkZFX01PREVfT0ZfT1BFUkFUSU9OX1pTTCA9PSB2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSkKLQkJJiYgKHZmZTMxX2ZyZWVfYnVmX2F2YWlsYWJsZSh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEpCi0JCSYmIHZmZTMxX2ZyZWVfYnVmX2F2YWlsYWJsZSh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDIpKSkgewotCQl2ZmUzMV9wcm9jZXNzX3pzbF9mcmFtZShwaW5nX3BvbmcpOwotCX0gZWxzZSB7Ci0JCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5mcmFtZV9kcm9wX2NudCsrOwotCQlwcl9pbmZvKCJwYXRoX2lycV8xIC0gbm8gZnJlZSBidWZmZXIhXG4iKTsKLSNpZmRlZiBDT05GSUdfTVNNX0NBTUVSQV9WNEwyCi0JCXByX2luZm8oIlN3YXBwaW5nIHBpbmcgYW5kIHBvbmdcbiIpOwotCi0JCS8qZ2V0IGFkZHJlc3NlcyovCi0JCS8qIFkgY2hhbm5lbCAqLwotCQlweWFkZHJfcGluZyA9IHZmZTMxX2dldF9jaF9waW5nX2FkZHIoCi0JCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwKTsKLQkJLyogQ2hyb21hIGNoYW5uZWwgKi8KLQkJcGNiY3JhZGRyX3BpbmcgPSB2ZmUzMV9nZXRfY2hfcGluZ19hZGRyKAotCQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSk7Ci0JCS8qIFkgY2hhbm5lbCAqLwotCQlweWFkZHJfcG9uZyA9IHZmZTMxX2dldF9jaF9wb25nX2FkZHIoCi0JCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwKTsKLQkJLyogQ2hyb21hIGNoYW5uZWwgKi8KLQkJcGNiY3JhZGRyX3BvbmcgPSB2ZmUzMV9nZXRfY2hfcG9uZ19hZGRyKAotCQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSk7Ci0KLQkJQ0RCRygicGluZyA9IDB4JXAsIHBvbmcgPSAweCVwXG4iLCAodm9pZCAqKXB5YWRkcl9waW5nLAotCQkJKHZvaWQgKilweWFkZHJfcG9uZyk7Ci0JCUNEQkcoInBpbmdfY2JjciA9IDB4JXAsIHBvbmdfY2JjciA9IDB4JXBcbiIsCi0JCQkodm9pZCAqKXBjYmNyYWRkcl9waW5nLCAodm9pZCAqKXBjYmNyYWRkcl9wb25nKTsKLQotCQkvKnB1dCBhZGRyZXNzZXMqLwotCQkvKiBTV0FQIHkgY2hhbm5lbCovCi0JCXZmZTMxX3B1dF9jaF9waW5nX2FkZHIodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMCwKLQkJCXB5YWRkcl9wb25nKTsKLQkJdmZlMzFfcHV0X2NoX3BvbmdfYWRkcih2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwLAotCQkJcHlhZGRyX3BpbmcpOwotCQkvKiBTV0FQIGNocm9tYSBjaGFubmVsKi8KLQkJdmZlMzFfcHV0X2NoX3BpbmdfYWRkcih2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxLAotCQkJcGNiY3JhZGRyX3BvbmcpOwotCQl2ZmUzMV9wdXRfY2hfcG9uZ19hZGRyKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDEsCi0JCQlwY2JjcmFkZHJfcGluZyk7Ci0JCUNEQkcoImFmdGVyIHN3YXA6IHBpbmcgPSAweCVwLCBwb25nID0gMHglcFxuIiwKLQkJCSh2b2lkICopcHlhZGRyX3BvbmcsICh2b2lkICopcHlhZGRyX3BpbmcpOwotI2VuZGlmCi0JfQotCi19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3Byb2Nlc3Nfb3V0cHV0X3BhdGhfaXJxXzIodWludDMyX3QgcGluZ19wb25nKQotewotCXVpbnQzMl90IHAwX2FkZHIsIHAxX2FkZHIsIHAyX2FkZHI7Ci0Jc3RydWN0IHZmZTMxX2ZyZWVfYnVmICpmcmVlX2J1ZiA9IE5VTEw7Ci0KLSNpZmRlZiBDT05GSUdfTVNNX0NBTUVSQV9WNEwyCi0JdWludDMyX3QgcHlhZGRyX3BpbmcsIHBjYmNyYWRkcl9waW5nLCBweWFkZHJfcG9uZywgcGNiY3JhZGRyX3Bvbmc7Ci0jZW5kaWYKLQkvKiB3ZSByZW5kZXIgZnJhbWVzIGluIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQkxLiBDb250aW51b3VzIG1vZGUgYW5kIHRoZSBmcmVlIGJ1ZmZlciBpcyBhdmFpYWxhYmxlLgotCSovCi0JQ0RCRygiJXMsIG9wZXJhdGlvbl9tb2RlID0gJWQsIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywKLQkJdmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUsCi0JCXZmZTMxX2N0cmwtPnJlY29yZGluZ19zdGF0ZSk7Ci0JLyogRW5zdXJlIHRoYXQgYm90aCB3bTEgYW5kIHdtNSBwaW5nIGFuZCBwb25nIGJ1ZmZlcnMgYXJlIGFjdGl2ZSovCi0JaWYgKCEoKChwaW5nX3BvbmcgJiAweDIyKSA9PSAweDIyKSB8fAotCQkoKHBpbmdfcG9uZyAmIDB4MjIpID09IDB4MCkpKSB7Ci0JCXByX2VycigiIElycV8yIC0gc2tpcCB0aGUgZnJhbWUgcHBfc3RhdHVzIGlzIG5vdCBwcm9wZXIiCi0JCQkiUFBfc3RhdHVzID0gMHgleFxuIiwgcGluZ19wb25nKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoKHZmZTMxX2N0cmwtPnJlY29yZGluZ19zdGF0ZSA9PSBWRkVfUkVDX1NUQVRFX1NUT1BfUkVRVUVTVEVEKQotCQl8fCAodmZlMzFfY3RybC0+cmVjb3JkaW5nX3N0YXRlID09IFZGRV9SRUNfU1RBVEVfU1RPUFBFRCkpIHsKLQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmZyYW1lX2Ryb3BfY250Kys7Ci0JCXByX3dhcm5pbmcoInBhdGhfaXJxXzIgLSByZWNvcmRpbmcgc3RvcHBlZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlmcmVlX2J1ZiA9IHZmZTMxX2dldF9mcmVlX2J1ZigmdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyKTsKLQotCWlmIChmcmVlX2J1ZikgewotCQkvKiBZIGNoYW5uZWwgKi8KLQkJcDBfYWRkciA9IHZmZTMxX2dldF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0Mi5jaDApOwotCQkvKiBDaHJvbWEgY2hhbm5lbCAqLwotCQlwMV9hZGRyID0gdmZlMzFfZ2V0X2NoX2FkZHIocGluZ19wb25nLAotCQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmNoMSk7Ci0JCXAyX2FkZHIgPSBwMF9hZGRyOwotCQlDREJHKCJ2aWRlbyBvdXRwdXQsIHB5YWRkciA9IDB4JXgsIHBjYmNyYWRkciA9IDB4JXhcbiIsCi0JCQlwMF9hZGRyLCBwMV9hZGRyKTsKLQotCQkvKiBZIGNoYW5uZWwgKi8KLQkJdmZlMzFfcHV0X2NoX2FkZHIocGluZ19wb25nLAotCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDIuY2gwLAotCQlmcmVlX2J1Zi0+cGFkZHIgKyBmcmVlX2J1Zi0+cGxhbmFyMF9vZmYpOwotCQkvKiBDaHJvbWEgY2hhbm5lbCAqLwotCQl2ZmUzMV9wdXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0Mi5jaDEsCi0JCWZyZWVfYnVmLT5wYWRkciArIGZyZWVfYnVmLT5wbGFuYXIxX29mZik7Ci0JCWtmcmVlKGZyZWVfYnVmKTsKLQkJdmZlX3NlbmRfb3V0bXNnKE1TR19JRF9PVVRQVVRfViwgcDBfYWRkciwgcDFfYWRkciwgcDJfYWRkcik7Ci0JfSBlbHNlIHsKLQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmZyYW1lX2Ryb3BfY250Kys7Ci0JCXByX3dhcm5pbmcoInBhdGhfaXJxXzIgLSBubyBmcmVlIGJ1ZmZlciFcbiIpOwotCi0jaWZkZWYgQ09ORklHX01TTV9DQU1FUkFfVjRMMgotCQlwcl9pbmZvKCJTd2FwcGluZyBwaW5nIGFuZCBwb25nXG4iKTsKLQotCQkvKmdldCBhZGRyZXNzZXMqLwotCQkvKiBZIGNoYW5uZWwgKi8KLQkJcHlhZGRyX3BpbmcgPSB2ZmUzMV9nZXRfY2hfcGluZ19hZGRyKAotCQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmNoMCk7Ci0JCS8qIENocm9tYSBjaGFubmVsICovCi0JCXBjYmNyYWRkcl9waW5nID0gdmZlMzFfZ2V0X2NoX3BpbmdfYWRkcigKLQkJCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0Mi5jaDEpOwotCQkvKiBZIGNoYW5uZWwgKi8KLQkJcHlhZGRyX3BvbmcgPSB2ZmUzMV9nZXRfY2hfcG9uZ19hZGRyKAotCQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmNoMCk7Ci0JCS8qIENocm9tYSBjaGFubmVsICovCi0JCXBjYmNyYWRkcl9wb25nID0gdmZlMzFfZ2V0X2NoX3BvbmdfYWRkcigKLQkJCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0Mi5jaDEpOwotCi0JCUNEQkcoInBpbmcgPSAweCVwLCBwb25nID0gMHglcFxuIiwgKHZvaWQgKilweWFkZHJfcGluZywKLQkJCSh2b2lkICopcHlhZGRyX3BvbmcpOwotCQlDREJHKCJwaW5nX2NiY3IgPSAweCVwLCBwb25nX2NiY3IgPSAweCVwXG4iLAotCQkJKHZvaWQgKilwY2JjcmFkZHJfcGluZywgKHZvaWQgKilwY2JjcmFkZHJfcG9uZyk7Ci0KLQkJLypwdXQgYWRkcmVzc2VzKi8KLQkJLyogU1dBUCB5IGNoYW5uZWwqLwotCQl2ZmUzMV9wdXRfY2hfcGluZ19hZGRyKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0Mi5jaDAsCi0JCQlweWFkZHJfcG9uZyk7Ci0JCXZmZTMxX3B1dF9jaF9wb25nX2FkZHIodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmNoMCwKLQkJCXB5YWRkcl9waW5nKTsKLQkJLyogU1dBUCBjaHJvbWEgY2hhbm5lbCovCi0JCXZmZTMxX3B1dF9jaF9waW5nX2FkZHIodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmNoMSwKLQkJCXBjYmNyYWRkcl9wb25nKTsKLQkJdmZlMzFfcHV0X2NoX3BvbmdfYWRkcih2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDIuY2gxLAotCQkJcGNiY3JhZGRyX3BpbmcpOwotCQlDREJHKCJhZnRlciBzd2FwOiBwaW5nID0gMHglcCwgcG9uZyA9IDB4JXBcbiIsCi0JCQkodm9pZCAqKXB5YWRkcl9wb25nLCAodm9pZCAqKXB5YWRkcl9waW5nKTsKLSNlbmRpZgotCX0KLX0KLQotCi1zdGF0aWMgdWludDMyX3QgIHZmZTMxX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbih1aW50MzJfdCBzdGF0c051bSwKLQkJCQkJCXVpbnQzMl90IG5ld0FkZHIpIHsKLQotCXVpbnQzMl90IHBpbmdwb25nU3RhdHVzOwotCXVpbnQzMl90IHJldHVybkFkZHI7Ci0JdWludDMyX3QgcGluZ3BvbmdBZGRyOwotCi0JLyogbXVzdCBiZSAwPXBpbmcsIDE9cG9uZyAqLwotCXBpbmdwb25nU3RhdHVzID0KLQkJKChtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9CVVNfUElOR19QT05HX1NUQVRVUykpCi0JJiAoKHVpbnQzMl90KSgxPDwoc3RhdHNOdW0gKyA3KSkpKSA+PiAoc3RhdHNOdW0gKyA3KTsKLQkvKiBzdGF0cyBiaXRzIHN0YXJ0cyBhdCA3ICovCi0JQ0RCRygic3RhdHNOdW0gJWQsIHBpbmdwb25nU3RhdHVzICVkXG4iLCBzdGF0c051bSwgcGluZ3BvbmdTdGF0dXMpOwotCXBpbmdwb25nQWRkciA9Ci0JCSgodWludDMyX3QpKHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCVZGRV9CVVNfU1RBVFNfUElOR19QT05HX0JBU0UpKSArCi0JCQkJKDMqc3RhdHNOdW0pKjQgKyAoMS1waW5ncG9uZ1N0YXR1cykqNDsKLQlyZXR1cm5BZGRyID0gbXNtX2NhbWVyYV9pb19yKCh1aW50MzJfdCAqKXBpbmdwb25nQWRkcik7Ci0JbXNtX2NhbWVyYV9pb193KG5ld0FkZHIsICh1aW50MzJfdCAqKXBpbmdwb25nQWRkcik7Ci0JcmV0dXJuIHJldHVybkFkZHI7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9zZW5kX3N0YXRzX21zZyh2b2lkKQotewotCXN0cnVjdCAgdmZlX21lc3NhZ2UgbXNnOwotCXVpbnQzMl90IHRlbXA7Ci0KLQkvKiBmaWxsIG1lc3NhZ2Ugd2l0aCByaWdodCBjb250ZW50LiAqLwotCW1zZy5fdS5tc2dTdGF0cy5mcmFtZUNvdW50ZXIgPSB2ZmUzMV9jdHJsLT52ZmVGcmFtZUlkOwotCW1zZy5fdS5tc2dTdGF0cy5zdGF0dXNfYml0cyA9IHZmZTMxX2N0cmwtPnN0YXR1c19iaXRzOwotCW1zZy5fZCA9IE1TR19JRF9DT01NT047Ci0KLQltc2cuX3UubXNnU3RhdHMuYnVmZi5hZWMgPSB2ZmUzMV9jdHJsLT5hZWNTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXI7Ci0JbXNnLl91Lm1zZ1N0YXRzLmJ1ZmYuYXdiID0gdmZlMzFfY3RybC0+YXdiU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyOwotCW1zZy5fdS5tc2dTdGF0cy5idWZmLmFmID0gdmZlMzFfY3RybC0+YWZTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXI7Ci0KLQltc2cuX3UubXNnU3RhdHMuYnVmZi5paGlzdCA9IHZmZTMxX2N0cmwtPmloaXN0U3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyOwotCW1zZy5fdS5tc2dTdGF0cy5idWZmLnJzID0gdmZlMzFfY3RybC0+cnNTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXI7Ci0JbXNnLl91Lm1zZ1N0YXRzLmJ1ZmYuY3MgPSB2ZmUzMV9jdHJsLT5jc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlcjsKLQotCXRlbXAgPSBtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9TVEFUU19BV0JfU0dXX0NGRyk7Ci0JbXNnLl91Lm1zZ1N0YXRzLmJ1ZmYuYXdiX3ltaW4gPSAoMHhGRjAwICYgdGVtcCkgPj4gODsKLQotCXZmZTMxX3Byb2Nfb3BzKG1zZy5fZCwKLQkJJm1zZywgc2l6ZW9mKHN0cnVjdCB2ZmVfbWVzc2FnZSkpOwotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfcHJvY2Vzc19zdGF0cyh2b2lkKQotewotCWludDMyX3QgcHJvY2Vzc19zdGF0cyA9IGZhbHNlOwotCi0JQ0RCRygiJXMsIHN0YXRzID0gMHgleFxuIiwgX19mdW5jX18sIHZmZTMxX2N0cmwtPnN0YXR1c19iaXRzKTsKLQotCWlmICh2ZmUzMV9jdHJsLT5zdGF0dXNfYml0cyAmIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19BRUMpIHsKLQkJaWYgKCF2ZmUzMV9jdHJsLT5hZWNfYWNrX3BlbmRpbmcpIHsKLQkJCXZmZTMxX2N0cmwtPmFlY19hY2tfcGVuZGluZyA9IFRSVUU7Ci0JCQl2ZmUzMV9jdHJsLT5hZWNTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPQotCQkJCXZmZTMxX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbihzdGF0c0FlTnVtLAotCQkJCXZmZTMxX2N0cmwtPmFlY1N0YXRzQ29udHJvbC5uZXh0RnJhbWVBZGRyQnVmKTsKLQkJCXByb2Nlc3Nfc3RhdHMgPSB0cnVlOwotCQl9IGVsc2V7Ci0JCQl2ZmUzMV9jdHJsLT5hZWNTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCQkJdmZlMzFfY3RybC0+YWVjU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQrKzsKLQkJfQotCX0gZWxzZSB7Ci0JCXZmZTMxX2N0cmwtPmFlY1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JfQotCi0JaWYgKHZmZTMxX2N0cmwtPnN0YXR1c19iaXRzICYgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0FXQikgewotCQlpZiAoIXZmZTMxX2N0cmwtPmF3Yl9hY2tfcGVuZGluZykgewotCQkJdmZlMzFfY3RybC0+YXdiX2Fja19wZW5kaW5nID0gVFJVRTsKLQkJCXZmZTMxX2N0cmwtPmF3YlN0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9Ci0JCQkJdmZlMzFfcHJvY2Vzc19zdGF0c19pcnFfY29tbW9uKHN0YXRzQXdiTnVtLAotCQkJCXZmZTMxX2N0cmwtPmF3YlN0YXRzQ29udHJvbC5uZXh0RnJhbWVBZGRyQnVmKTsKLQkJCXByb2Nlc3Nfc3RhdHMgPSB0cnVlOwotCQl9IGVsc2V7Ci0JCQl2ZmUzMV9jdHJsLT5hd2JTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCsrOwotCQkJdmZlMzFfY3RybC0+YXdiU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCXZmZTMxX2N0cmwtPmF3YlN0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JfQotCi0KLQlpZiAodmZlMzFfY3RybC0+c3RhdHVzX2JpdHMgJiBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQUYpIHsKLQkJaWYgKCF2ZmUzMV9jdHJsLT5hZl9hY2tfcGVuZGluZykgewotCQkJdmZlMzFfY3RybC0+YWZfYWNrX3BlbmRpbmcgPSBUUlVFOwotCQkJdmZlMzFfY3RybC0+YWZTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPQotCQkJCXZmZTMxX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbihzdGF0c0FmTnVtLAotCQkJCXZmZTMxX2N0cmwtPmFmU3RhdHNDb250cm9sLm5leHRGcmFtZUFkZHJCdWYpOwotCQkJcHJvY2Vzc19zdGF0cyA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQl2ZmUzMV9jdHJsLT5hZlN0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JCQl2ZmUzMV9jdHJsLT5hZlN0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCX0KLQl9IGVsc2UgewotCQl2ZmUzMV9jdHJsLT5hZlN0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JfQotCi0JaWYgKHZmZTMxX2N0cmwtPnN0YXR1c19iaXRzICYgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0lISVNUKSB7Ci0JCWlmICghdmZlMzFfY3RybC0+aWhpc3RfYWNrX3BlbmRpbmcpIHsKLQkJCXZmZTMxX2N0cmwtPmloaXN0X2Fja19wZW5kaW5nID0gVFJVRTsKLQkJCXZmZTMxX2N0cmwtPmloaXN0U3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCQl2ZmUzMV9wcm9jZXNzX3N0YXRzX2lycV9jb21tb24oc3RhdHNJaGlzdE51bSwKLQkJCQl2ZmUzMV9jdHJsLT5paGlzdFN0YXRzQ29udHJvbC5uZXh0RnJhbWVBZGRyQnVmKTsKLQkJCXByb2Nlc3Nfc3RhdHMgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJdmZlMzFfY3RybC0+aWhpc3RTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCsrOwotCQkJdmZlMzFfY3RybC0+aWhpc3RTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJdmZlMzFfY3RybC0+aWhpc3RTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCX0KLQotCWlmICh2ZmUzMV9jdHJsLT5zdGF0dXNfYml0cyAmIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19SUykgewotCQlpZiAoIXZmZTMxX2N0cmwtPnJzX2Fja19wZW5kaW5nKSB7Ci0JCQl2ZmUzMV9jdHJsLT5yc19hY2tfcGVuZGluZyA9IFRSVUU7Ci0JCQl2ZmUzMV9jdHJsLT5yc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9Ci0JCQkJdmZlMzFfcHJvY2Vzc19zdGF0c19pcnFfY29tbW9uKHN0YXRzUnNOdW0sCi0JCQkJdmZlMzFfY3RybC0+cnNTdGF0c0NvbnRyb2wubmV4dEZyYW1lQWRkckJ1Zik7Ci0JCQlwcm9jZXNzX3N0YXRzID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXZmZTMxX2N0cmwtPnJzU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQrKzsKLQkJCXZmZTMxX2N0cmwtPnJzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCXZmZTMxX2N0cmwtPnJzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0gMDsKLQl9Ci0KLQotCWlmICh2ZmUzMV9jdHJsLT5zdGF0dXNfYml0cyAmIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19DUykgewotCQlpZiAoIXZmZTMxX2N0cmwtPmNzX2Fja19wZW5kaW5nKSB7Ci0JCQl2ZmUzMV9jdHJsLT5jc19hY2tfcGVuZGluZyA9IFRSVUU7Ci0JCQl2ZmUzMV9jdHJsLT5jc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9Ci0JCQkJdmZlMzFfcHJvY2Vzc19zdGF0c19pcnFfY29tbW9uKHN0YXRzQ3NOdW0sCi0JCQkJdmZlMzFfY3RybC0+Y3NTdGF0c0NvbnRyb2wubmV4dEZyYW1lQWRkckJ1Zik7Ci0JCQlwcm9jZXNzX3N0YXRzID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXZmZTMxX2N0cmwtPmNzU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQrKzsKLQkJCXZmZTMxX2N0cmwtPmNzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCXZmZTMxX2N0cmwtPmNzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0gMDsKLQl9Ci0KLQlpZiAocHJvY2Vzc19zdGF0cykKLQkJdmZlX3NlbmRfc3RhdHNfbXNnKCk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3Byb2Nlc3Nfc3RhdHNfaXJxKHVpbnQzMl90ICppcnFzdGF0dXMpCi17Ci0JLyogU3Vic2FtcGxlIHRoZSBzdGF0cyBhY2NvcmRpbmcgdG8gdGhlIGhmciBzcGVlZCovCi0JaWYgKCh2ZmUzMV9jdHJsLT5oZnJfbW9kZSAhPSBIRlJfTU9ERV9PRkYpICYmCi0JCSh2ZmUzMV9jdHJsLT52ZmVGcmFtZUlkICUgdmZlMzFfY3RybC0+aGZyX21vZGUgIT0gMCkpIHsKLQkJQ0RCRygiU2tpcCB0aGUgc3RhdHMgd2hlbiBIRlIgZW5hYmxlZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQl2ZmUzMV9jdHJsLT5zdGF0dXNfYml0cyA9IFZGRV9DT01fU1RBVFVTICYgKmlycXN0YXR1czsKLQl2ZmUzMV9wcm9jZXNzX3N0YXRzKCk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9kb190YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3RydWN0IHZmZTMxX2lzcl9xdWV1ZV9jbWQgKnFjbWQgPSBOVUxMOwotCi0JQ0RCRygiPT09IHZmZTMxX2RvX3Rhc2tsZXQgc3RhcnQgPT09IFxuIik7Ci0KLQl3aGlsZSAoYXRvbWljX3JlYWQoJmlycV9jbnQpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMV9jdHJsLT50YXNrbGV0X2xvY2ssIGZsYWdzKTsKLQkJcWNtZCA9IGxpc3RfZmlyc3RfZW50cnkoJnZmZTMxX2N0cmwtPnRhc2tsZXRfcSwKLQkJCXN0cnVjdCB2ZmUzMV9pc3JfcXVldWVfY21kLCBsaXN0KTsKLQkJYXRvbWljX3N1YigxLCAmaXJxX2NudCk7Ci0KLQkJaWYgKCFxY21kKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMV9jdHJsLT50YXNrbGV0X2xvY2ssCi0JCQkJZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJbGlzdF9kZWwoJnFjbWQtPmxpc3QpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMV9jdHJsLT50YXNrbGV0X2xvY2ssCi0JCQlmbGFncyk7Ci0KLQkJLyogaW50ZXJydXB0IHRvIGJlIHByb2Nlc3NlZCwgICpxY21kIGhhcyB0aGUgcGF5bG9hZC4gICovCi0JCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCVZGRV9JUlFfU1RBVFVTMF9SRUdfVVBEQVRFX01BU0spIHsKLQkJCUNEQkcoImlycSByZWdVcGRhdGVJcnFcbiIpOwotCQkJdmZlMzFfcHJvY2Vzc19yZWdfdXBkYXRlX2lycSgpOwotCQl9Ci0KLQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czEgJgotCQkJVkZFX0lNQVNLX1JFU0VUKSB7Ci0JCQlDREJHKCJpcnEgcmVzZXRBY2tJcnFcbiIpOwotCQkJdmZlMzFfcHJvY2Vzc19yZXNldF9pcnEoKTsKLQkJfQotCi0KLQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czEgJgotCQkJVkZFX0lNQVNLX0FYSV9IQUxUKSB7Ci0JCQlDREJHKCJpcnEgYXhpIGhhbHQgaXJxXG4iKTsKLQkJCXZmZTMxX3Byb2Nlc3NfYXhpX2hhbHRfaXJxKCk7Ci0JCX0KLQotCQlpZiAoYXRvbWljX3JlYWQoJnZmZTMxX2N0cmwtPnZzdGF0ZSkpIHsKLQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMxICYKLQkJCQkJVkZFMzFfSU1BU0tfRVJST1JfT05MWV8xKSB7Ci0JCQkJcHJfZXJyKCJpcnEJZXJyb3JJcnFcbiIpOwotCQkJCXZmZTMxX3Byb2Nlc3NfZXJyb3JfaXJxKAotCQkJCQlxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMxICYKLQkJCQkJVkZFMzFfSU1BU0tfRVJST1JfT05MWV8xKTsKLQkJCX0KLQotCQkJLyogaXJxcyBiZWxvdyBhcmUgb25seSB2YWxpZCB3aGVuIGluIGFjdGl2ZSBzdGF0ZS4gKi8KLQkJCS8qIG5leHQsIGNoZWNrIG91dHB1dCBwYXRoIHJlbGF0ZWQgaW50ZXJydXB0cy4gKi8KLQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQlWRkVfSVJRX1NUQVRVUzBfSU1BR0VfQ09NUE9TSVRfRE9ORTBfTUFTSykgewotCQkJCUNEQkcoIkltYWdlIGNvbXBvc2l0ZSBkb25lIDAgaXJxIG9jY3VyZWQuXG4iKTsKLQkJCQl2ZmUzMV9wcm9jZXNzX291dHB1dF9wYXRoX2lycV8wKAotCQkJCQlxY21kLT52ZmVQaW5nUG9uZ1N0YXR1cyk7Ci0JCQl9Ci0KLQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQlWRkVfSVJRX1NUQVRVUzBfSU1BR0VfQ09NUE9TSVRfRE9ORTFfTUFTSykgewotCQkJCUNEQkcoIkltYWdlIGNvbXBvc2l0ZSBkb25lIDEgaXJxIG9jY3VyZWQuXG4iKTsKLQkJCQl2ZmUzMV9wcm9jZXNzX291dHB1dF9wYXRoX2lycV8xKAotCQkJCQlxY21kLT52ZmVQaW5nUG9uZ1N0YXR1cyk7Ci0JCQl9Ci0KLQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQlWRkVfSVJRX1NUQVRVUzBfSU1BR0VfQ09NUE9TSVRfRE9ORTJfTUFTSykgewotCQkJCUNEQkcoIkltYWdlIGNvbXBvc2l0ZSBkb25lIDIgaXJxIG9jY3VyZWQuXG4iKTsKLQkJCQl2ZmUzMV9wcm9jZXNzX291dHB1dF9wYXRoX2lycV8yKAotCQkJCQlxY21kLT52ZmVQaW5nUG9uZ1N0YXR1cyk7Ci0JCQl9Ci0KLQkJCS8qIHRoZW4gcHJvY2VzcyBzdGF0cyBpcnEuICovCi0JCQlpZiAodmZlMzFfY3RybC0+c3RhdHNfY29tcCkgewotCQkJCS8qIHByb2Nlc3Mgc3RhdHMgY29tYiBpbnRlcnJ1cHQuICovCi0JCQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czAgJgotCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQ09NUE9TSVRfTUFTSykgewotCQkJCQlDREJHKCJTdGF0cyBjb21wb3NpdGUgaXJxIG9jY3VyZWQuXG4iKTsKLQkJCQkJdmZlMzFfcHJvY2Vzc19zdGF0c19pcnEoCi0JCQkJCQkmcWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvKiBwcm9jZXNzIGluZGl2aWR1YWwgc3RhdHMgaW50ZXJydXB0LiAqLwotCQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQkJCVZGRV9DT01fU1RBVFVTKSB7Ci0JCQkJCUNEQkcoIlZGRSBzdGF0cyBvY2N1cmVkLlxuIik7Ci0JCQkJCXZmZTMxX3Byb2Nlc3Nfc3RhdHNfaXJxKAotCQkJCQkJJnFjbWQtPnZmZUludGVycnVwdFN0YXR1czApOwotCQkJCX0KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1lOQ19USU1FUjApIHsKLQkJCQkJQ0RCRygiU1lOQ19USU1FUiAwIGlycSBvY2N1cmVkLlxuIik7Ci0JCQkJCXZmZTMxX3NlbmRfbXNnX25vX3BheWxvYWQoCi0JCQkJCQlNU0dfSURfU1lOQ19USU1FUjBfRE9ORSk7Ci0JCQkJfQotCQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQkJCVZGRV9JUlFfU1RBVFVTMF9TWU5DX1RJTUVSMSkgewotCQkJCQlDREJHKCJTWU5DX1RJTUVSIDEgaXJxIG9jY3VyZWQuXG4iKTsKLQkJCQkJdmZlMzFfc2VuZF9tc2dfbm9fcGF5bG9hZCgKLQkJCQkJCU1TR19JRF9TWU5DX1RJTUVSMV9ET05FKTsKLQkJCQl9Ci0JCQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czAgJgotCQkJCQkJVkZFX0lSUV9TVEFUVVMwX1NZTkNfVElNRVIyKSB7Ci0JCQkJCUNEQkcoIlNZTkNfVElNRVIgMiBpcnEgb2NjdXJlZC5cbiIpOwotCQkJCQl2ZmUzMV9zZW5kX21zZ19ub19wYXlsb2FkKAotCQkJCQkJTVNHX0lEX1NZTkNfVElNRVIyX0RPTkUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJVkZFX0lSUV9TVEFUVVMwX0NBTUlGX1NPRl9NQVNLKSB7Ci0JCQlDREJHKCJpcnEJY2FtaWZTb2ZJcnFcbiIpOwotCQkJdmZlMzFfcHJvY2Vzc19jYW1pZl9zb2ZfaXJxKCk7Ci0JCX0KLQkJa2ZyZWUocWNtZCk7Ci0JfQotCUNEQkcoIj09PSB2ZmUzMV9kb190YXNrbGV0IGVuZCA9PT0gXG4iKTsKLX0KLQotREVDTEFSRV9UQVNLTEVUKHZmZTMxX3Rhc2tsZXQsIHZmZTMxX2RvX3Rhc2tsZXQsIDApOwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgdmZlMzFfcGFyc2VfaXJxKGludCBpcnFfbnVtLCB2b2lkICpkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHZmZTMxX2lycV9zdGF0dXMgaXJxOwotCXN0cnVjdCB2ZmUzMV9pc3JfcXVldWVfY21kICpxY21kOwotCXVpbnQzMl90ICp2YWw7Ci0JQ0RCRygidmZlX3BhcnNlX2lycVxuIik7Ci0JbWVtc2V0KCZpcnEsIDAsIHNpemVvZihzdHJ1Y3QgdmZlMzFfaXJxX3N0YXR1cykpOwotCi0JdmFsID0gKHVpbnQzMl90ICopKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX1NUQVRVU18wKTsKLQlpcnEudmZlSXJxU3RhdHVzMCA9IG1zbV9jYW1lcmFfaW9fcih2YWwpOwotCi0JdmFsID0gKHVpbnQzMl90ICopKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX1NUQVRVU18xKTsKLQlpcnEudmZlSXJxU3RhdHVzMSA9IG1zbV9jYW1lcmFfaW9fcih2YWwpOwotCi0JaWYgKGlycS52ZmVJcnFTdGF0dXMxICYgVkZFX0lNQVNLX0FYSV9IQUxUKSB7Ci0JCW1zbV9jYW1lcmFfaW9fdyhWRkVfSU1BU0tfUkVTRVQsCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9NQVNLXzEpOwotCQltc21fY2FtZXJhX2lvX3dfbWIoQVhJX0hBTFRfQ0xFQVIsCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0FYSV9DTUQpOwotCX0KLQotCXZhbCA9ICh1aW50MzJfdCAqKSh2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0NBTUlGX1NUQVRVUyk7Ci0JaXJxLmNhbWlmU3RhdHVzID0gbXNtX2NhbWVyYV9pb19yKHZhbCk7Ci0JQ0RCRygiY2FtaWZTdGF0dXMgID0gMHgleFxuIiwgaXJxLmNhbWlmU3RhdHVzKTsKLQotCXZhbCA9ICh1aW50MzJfdCAqKSh2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19QSU5HX1BPTkdfU1RBVFVTKTsKLQlpcnEudmZlUGluZ1BvbmdTdGF0dXMgPSBtc21fY2FtZXJhX2lvX3IodmFsKTsKLQotCS8qIGNsZWFyIHRoZSBwZW5kaW5nIGludGVycnVwdCBvZiB0aGUgc2FtZSBraW5kLiovCi0JbXNtX2NhbWVyYV9pb193KGlycS52ZmVJcnFTdGF0dXMwLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DTEVBUl8wKTsKLQltc21fY2FtZXJhX2lvX3coaXJxLnZmZUlycVN0YXR1czEsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NMRUFSXzEpOwotCi0JLyogRW5zdXJlIHRoZSB3cml0ZSBvcmRlciB3aGlsZSB3cml0aW5nCi0JdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdXNpbmcgdGhlIGJhcnJpZXIgKi8KLQltc21fY2FtZXJhX2lvX3dfbWIoMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ01EKTsKLQotCWlmICgoaXJxLnZmZUlycVN0YXR1czAgPT0gMCkgJiYgKGlycS52ZmVJcnFTdGF0dXMxID09IDApKSB7Ci0JCUNEQkcoInZmZV9wYXJzZV9pcnE6IHZmZUlycVN0YXR1czAgJiAxIGFyZSBib3RoIDAhXG4iKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCXFjbWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmZlMzFfaXNyX3F1ZXVlX2NtZCksCi0JCUdGUF9BVE9NSUMpOwotCWlmICghcWNtZCkgewotCQlwcl9lcnIoInZmZV9wYXJzZV9pcnE6IHFjbWQgbWFsbG9jIGZhaWxlZCFcbiIpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZ2ZmUzMV9jdHJsLT5zdG9wX2Fja19wZW5kaW5nKSkgewotCQlpcnEudmZlSXJxU3RhdHVzMCAmPSBWRkVfSU1BU0tfV0hJTEVfU1RPUFBJTkdfMDsKLQkJaXJxLnZmZUlycVN0YXR1czEgJj0gdmZlMzFfY3RybC0+d2hpbGVfc3RvcHBpbmdfbWFzazsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMzFfY3RybC0+eGJhcl9sb2NrLCBmbGFncyk7Ci0JaWYgKChpcnEudmZlSXJxU3RhdHVzMCAmCi0JCVZGRV9JUlFfU1RBVFVTMF9DQU1JRl9FT0ZfTUFTSykgJiYKLQkJdmZlMzFfY3RybC0+eGJhcl91cGRhdGVfcGVuZGluZykgewotCQlDREJHKCJpcnEgY2FtaWZFb2ZJcnFcbiIpOwotCQltc21fY2FtZXJhX2lvX21lbWNweSh2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX1hCQVJfQ0ZHX09GRiwKLQkJCSh2b2lkICopdmZlMzFfY3RybC0+eGJhcl9jZmcsIFYzMV9YQkFSX0NGR19MRU4pOwotCQl2ZmUzMV9jdHJsLT54YmFyX3VwZGF0ZV9wZW5kaW5nID0gMDsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzFfY3RybC0+eGJhcl9sb2NrLCBmbGFncyk7Ci0JQ0RCRygidmZlX3BhcnNlX2lycTogSXJxX3N0YXR1czAgPSAweCV4LCBJcnFfc3RhdHVzMSA9IDB4JXguXG4iLAotCQlpcnEudmZlSXJxU3RhdHVzMCwgaXJxLnZmZUlycVN0YXR1czEpOwotCi0JcWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCA9IGlycS52ZmVJcnFTdGF0dXMwOwotCXFjbWQtPnZmZUludGVycnVwdFN0YXR1czEgPSBpcnEudmZlSXJxU3RhdHVzMTsKLQlxY21kLT52ZmVQaW5nUG9uZ1N0YXR1cyA9IGlycS52ZmVQaW5nUG9uZ1N0YXR1czsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMV9jdHJsLT50YXNrbGV0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZxY21kLT5saXN0LCAmdmZlMzFfY3RybC0+dGFza2xldF9xKTsKLQotCWF0b21pY19hZGQoMSwgJmlycV9jbnQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnRhc2tsZXRfbG9jaywgZmxhZ3MpOwotCXRhc2tsZXRfc2NoZWR1bGUoJnZmZTMxX3Rhc2tsZXQpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfcmVsZWFzZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCByZXNvdXJjZQkqdmZlbWVtLCAqdmZlaW87Ci0KLQl2ZmUzMV9yZXNldF9mcmVlX2J1Zl9xdWV1ZV9hbGwoKTsKLQlDREJHKCIlcywgZnJlZV9pcnFcbiIsIF9fZnVuY19fKTsKLQlmcmVlX2lycSh2ZmUzMV9jdHJsLT52ZmVpcnEsIDApOwotCXRhc2tsZXRfa2lsbCgmdmZlMzFfdGFza2xldCk7Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmlycV9jbnQpKQotCQlwcl93YXJuaW5nKCIlcywgV2FybmluZyBJUlEgQ291bnQgbm90IFpFUk9cbiIsIF9fZnVuY19fKTsKLQotCXZmZW1lbSA9IHZmZTMxX2N0cmwtPnZmZW1lbTsKLQl2ZmVpbyAgPSB2ZmUzMV9jdHJsLT52ZmVpbzsKLQotCW1zbV92cGVfcmVsZWFzZSgpOwotCi0Ja2ZyZWUodmZlMzFfY3RybC0+ZXh0ZGF0YSk7Ci0JaW91bm1hcCh2ZmUzMV9jdHJsLT52ZmViYXNlKTsKLQlrZnJlZSh2ZmUzMV9jdHJsKTsKLQl2ZmUzMV9jdHJsID0gTlVMTDsKLQlyZWxlYXNlX21lbV9yZWdpb24odmZlbWVtLT5zdGFydCwgKHZmZW1lbS0+ZW5kIC0gdmZlbWVtLT5zdGFydCkgKyAxKTsKLQlDREJHKCIlcywgbXNtX2NhbWlvX2Rpc2FibGVcbiIsIF9fZnVuY19fKTsKLQltc21fY2FtaW9fZGlzYWJsZShwZGV2KTsKLQltc21fY2FtaW9fc2V0X3BlcmZfbHZsKFNfRVhJVCk7Ci0KLQl2ZmVfc3luY2RhdGEgPSBOVUxMOwotfQotCi1zdGF0aWMgaW50IHZmZTMxX3Jlc291cmNlX2luaXQoc3RydWN0IG1zbV92ZmVfY2FsbGJhY2sgKnByZXNwLAotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHZvaWQgKnNkYXRhKQotewotCXN0cnVjdCByZXNvdXJjZQkqdmZlbWVtLCAqdmZlaXJxLCAqdmZlaW87Ci0JaW50IHJjOwotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzX2luZm87Ci0Jc19pbmZvID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQlwZGV2LT5yZXNvdXJjZSA9IHNfaW5mby0+cmVzb3VyY2U7Ci0JcGRldi0+bnVtX3Jlc291cmNlcyA9IHNfaW5mby0+bnVtX3Jlc291cmNlczsKLQotCXZmZW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCF2ZmVtZW0pIHsKLQkJcHJfZXJyKCIlczogbm8gbWVtIHJlc291cmNlP1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQl2ZmVpcnEgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOwotCWlmICghdmZlaXJxKSB7Ci0JCXByX2VycigiJXM6IG5vIGlycSByZXNvdXJjZT9cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JdmZlaW8gPSByZXF1ZXN0X21lbV9yZWdpb24odmZlbWVtLT5zdGFydCwKLQkJcmVzb3VyY2Vfc2l6ZSh2ZmVtZW0pLCBwZGV2LT5uYW1lKTsKLQlpZiAoIXZmZWlvKSB7Ci0JCXByX2VycigiJXM6IFZGRSByZWdpb24gYWxyZWFkeSBjbGFpbWVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JdmZlMzFfY3RybCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZmUzMV9jdHJsX3R5cGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZmZTMxX2N0cmwpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGNtZF9pbml0X2ZhaWxlZDE7Ci0JfQotCi0JdmZlMzFfY3RybC0+dmZlaXJxID0gdmZlaXJxLT5zdGFydDsKLQotCXZmZTMxX2N0cmwtPnZmZWJhc2UgPQotCQlpb3JlbWFwKHZmZW1lbS0+c3RhcnQsICh2ZmVtZW0tPmVuZCAtIHZmZW1lbS0+c3RhcnQpICsgMSk7Ci0JaWYgKCF2ZmUzMV9jdHJsLT52ZmViYXNlKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJcHJfZXJyKCIlczogdmZlIGlvcmVtYXAgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gY21kX2luaXRfZmFpbGVkMjsKLQl9Ci0KLQlpZiAocHJlc3AgJiYgcHJlc3AtPnZmZV9yZXNwKQotCQl2ZmUzMV9jdHJsLT5yZXNwID0gcHJlc3A7Ci0JZWxzZSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBjbWRfaW5pdF9mYWlsZWQzOwotCX0KLQotCXZmZTMxX2N0cmwtPmV4dGRhdGEgPQotCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmZlMzFfZnJhbWVfZXh0cmEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZmZTMxX2N0cmwtPmV4dGRhdGEpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGNtZF9pbml0X2ZhaWxlZDM7Ci0JfQotCi0JdmZlMzFfY3RybC0+ZXh0bGVuID0gc2l6ZW9mKHN0cnVjdCB2ZmUzMV9mcmFtZV9leHRyYSk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmdmZlMzFfY3RybC0+aW9fbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnZmZTMxX2N0cmwtPnVwZGF0ZV9hY2tfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnZmZTMxX2N0cmwtPnRhc2tsZXRfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnZmZTMxX2N0cmwtPnhiYXJfbG9jayk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmdmZlMzFfY3RybC0+dGFza2xldF9xKTsKLQl2ZmUzMV9pbml0X2ZyZWVfYnVmX3F1ZXVlKCk7Ci0KLQl2ZmUzMV9jdHJsLT5zeW5jZGF0YSA9IHNkYXRhOwotCXZmZTMxX2N0cmwtPnZmZW1lbSA9IHZmZW1lbTsKLQl2ZmUzMV9jdHJsLT52ZmVpbyAgPSB2ZmVpbzsKLQl2ZmUzMV9jdHJsLT51cGRhdGVfZ2FtbWEgPSBmYWxzZTsKLQl2ZmUzMV9jdHJsLT51cGRhdGVfbHVtYSA9IGZhbHNlOwotCXZmZTMxX2N0cmwtPnNfaW5mbyA9IHNfaW5mbzsKLQl2ZmUzMV9jdHJsLT5zdGF0c19jb21wID0gMDsKLQl2ZmUzMV9jdHJsLT5oZnJfbW9kZSA9IEhGUl9NT0RFX09GRjsKLQlyZXR1cm4gMDsKLQotY21kX2luaXRfZmFpbGVkMzoKLQlmcmVlX2lycSh2ZmUzMV9jdHJsLT52ZmVpcnEsIDApOwotCWlvdW5tYXAodmZlMzFfY3RybC0+dmZlYmFzZSk7Ci1jbWRfaW5pdF9mYWlsZWQyOgotCWtmcmVlKHZmZTMxX2N0cmwpOwotY21kX2luaXRfZmFpbGVkMToKLQlyZWxlYXNlX21lbV9yZWdpb24odmZlbWVtLT5zdGFydCwgKHZmZW1lbS0+ZW5kIC0gdmZlbWVtLT5zdGFydCkgKyAxKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlMzFfaW5pdChzdHJ1Y3QgbXNtX3ZmZV9jYWxsYmFjayAqcHJlc3AsCi0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzaW5mbyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBtc21fY2FtZXJhX2RldmljZV9wbGF0Zm9ybV9kYXRhICpjYW1kZXYgPSBzaW5mby0+cGRhdGE7Ci0KLQljYW1pb19jbGsgPSBjYW1kZXYtPmlvY2xrOwotCi0JcmMgPSB2ZmUzMV9yZXNvdXJjZV9pbml0KHByZXNwLCBwZGV2LCB2ZmVfc3luY2RhdGEpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQkvKiBCcmluZyB1cCBhbGwgdGhlIHJlcXVpcmVkIEdQSU9zIGFuZCBDbG9ja3MgKi8KLQlyYyA9IG1zbV9jYW1pb19lbmFibGUocGRldik7Ci0JbXNtX2NhbWlvX3NldF9wZXJmX2x2bChTX0lOSVQpOwotCWlmIChtc21fdnBlX29wZW4oKSA8IDApCi0JCUNEQkcoIiVzOiB2cGVfb3BlbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQotCS8qIFRPIERPOiBOZWVkIHRvIHJlbGVhc2UgdGhlIFZGRSByZXNvdXJjZXMgKi8KLQlyYyA9IHJlcXVlc3RfaXJxKHZmZTMxX2N0cmwtPnZmZWlycSwgdmZlMzFfcGFyc2VfaXJxLAotCQkJSVJRRl9UUklHR0VSX1JJU0lORywgInZmZSIsIDApOwotCi0JcmV0dXJuIHJjOwotfQotCi12b2lkIG1zbV9jYW12ZmVfZm5faW5pdChzdHJ1Y3QgbXNtX2NhbXZmZV9mbiAqZnB0ciwgdm9pZCAqZGF0YSkKLXsKLQlmcHRyLT52ZmVfaW5pdCAgICA9IHZmZTMxX2luaXQ7Ci0JZnB0ci0+dmZlX2VuYWJsZSAgPSB2ZmUzMV9lbmFibGU7Ci0JZnB0ci0+dmZlX2NvbmZpZyAgPSB2ZmUzMV9jb25maWc7Ci0JZnB0ci0+dmZlX2Rpc2FibGUgPSB2ZmUzMV9kaXNhYmxlOwotCWZwdHItPnZmZV9yZWxlYXNlID0gdmZlMzFfcmVsZWFzZTsKLQlmcHRyLT52ZmVfc3RvcCA9IHZmZTMxX3N0b3A7Ci0JdmZlX3N5bmNkYXRhID0gZGF0YTsKLX0KLQotdm9pZCBtc21fY2FtdnBlX2ZuX2luaXQoc3RydWN0IG1zbV9jYW12cGVfZm4gKmZwdHIsIHZvaWQgKmRhdGEpCi17Ci0JZnB0ci0+dnBlX3JlZwkJPSBtc21fdnBlX3JlZzsKLQlmcHRyLT5zZW5kX2ZyYW1lX3RvX3ZwZQk9IG1zbV9zZW5kX2ZyYW1lX3RvX3ZwZTsKLQlmcHRyLT52cGVfY29uZmlnCT0gbXNtX3ZwZV9jb25maWc7Ci0JZnB0ci0+dnBlX2NmZ191cGRhdGUJPSBtc21fdnBlX2NmZ191cGRhdGU7Ci0JZnB0ci0+ZGlzCQk9ICYodnBlX2N0cmwtPmRpc19lbik7Ci0JZnB0ci0+dnBlX2NmZ19vZmZzZXQgPSBtc21fdnBlX29mZnNldF91cGRhdGU7Ci0JdnBlX2N0cmwtPnN5bmNkYXRhID0gZGF0YTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTMxLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmUzMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTFhOGQ0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTMxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTE5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMC0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9fTVNNX1ZGRTMxX0hfXwotI2RlZmluZSBfX01TTV9WRkUzMV9IX18KLQotI2RlZmluZSBUUlVFICAxCi0jZGVmaW5lIEZBTFNFIDAKLQotLyogYXQgc3RhcnQgb2YgY2FtaWYsICBiaXQgMTowID0gMHgwMTplbmFibGUKLSAqIGltYWdlIGRhdGEgY2FwdHVyZSBhdCBmcmFtZSBib3VuZGFyeS4gKi8KLSNkZWZpbmUgQ0FNSUZfQ09NTUFORF9TVEFSVCAgMHgwMDAwMDAwNQotCi0vKiBiaXQgMj0gMHgxOmNsZWFyIHRoZSBDQU1JRl9TVEFUVVMgcmVnaXN0ZXIKLSAqIHZhbHVlLiAqLwotI2RlZmluZSBDQU1JRl9DT01NQU5EX0NMRUFSICAweDAwMDAwMDA0Ci0KLS8qIGF0IHN0b3Agb2YgdmZlIHBpcGVsaW5lLCBmb3Igbm93IGl0IGlzIGFzc3VtZWQKLSAqIHRoYXQgY2FtaWYgd2lsbCBzdG9wIGF0IGFueSB0aW1lLiBCaXQgMTowID0gMHgxMDoKLSAqIGRpc2FibGUgaW1hZ2UgZGF0YSBjYXB0dXJlIGltbWVkaWF0ZWx5LiAqLwotI2RlZmluZSBDQU1JRl9DT01NQU5EX1NUT1BfSU1NRURJQVRFTFkgIDB4MDAwMDAwMDIKLQotLyogYXQgc3RvcCBvZiB2ZmUgcGlwZWxpbmUsIGZvciBub3cgaXQgaXMgYXNzdW1lZAotICogdGhhdCBjYW1pZiB3aWxsIHN0b3AgYXQgYW55IHRpbWUuIEJpdCAxOjAgPSAweDAwOgotICogZGlzYWJsZSBpbWFnZSBkYXRhIGNhcHR1cmUgYXQgZnJhbWUgYm91bmRhcnkgKi8KLSNkZWZpbmUgQ0FNSUZfQ09NTUFORF9TVE9QX0FUX0ZSQU1FX0JPVU5EQVJZICAweDAwMDAwMDAwCi0KLS8qIHRvIGhhbHQgYXhpIGJyaWRnZSAqLwotI2RlZmluZSBBWElfSEFMVCAgMHgwMDAwMDAwMQotCi0vKiBjbGVhciB0aGUgaGFsdCBiaXQuICovCi0jZGVmaW5lIEFYSV9IQUxUX0NMRUFSICAweDAwMDAwMDAwCi0KLS8qIGNsZWFyIGF4aV9oYWx0X2lycSAqLwotI2RlZmluZSBNQVNLX0FYSV9IQUxUX0lSUQkweEZGN0ZGRkZGCi0KLS8qIHJlc2V0IHRoZSBwaXBlbGluZSB3aGVuIHN0b3AgY29tbWFuZCBpcyBpc3N1ZWQuCi0gKiAod2l0aG91dCByZXNldCB0aGUgcmVnaXN0ZXIuKSBiaXQgMjYtMzEgPSAwLAotICogZG9tYWluIHJlc2V0LCBiaXQgMC05ID0gMSBmb3IgbW9kdWxlIHJlc2V0LCBleGNlcHQKLSAqIHJlZ2lzdGVyIG1vZHVsZS4gKi8KLSNkZWZpbmUgVkZFX1JFU0VUX1VQT05fU1RPUF9DTUQgIDB4MDAwMDAzZWYKLQotLyogcmVzZXQgdGhlIHBpcGVsaW5lIHdoZW4gcmVzZXQgY29tbWFuZC4KLSAqIGJpdCAyNi0zMSA9IDAsIGRvbWFpbiByZXNldCwgYml0IDAtOSA9IDEgZm9yIG1vZHVsZSByZXNldC4gKi8KLSNkZWZpbmUgVkZFX1JFU0VUX1VQT05fUkVTRVRfQ01EICAweDAwMDAwM2ZmCi0KLS8qIGJpdCA1IGlzIGZvciBheGkgc3RhdHVzIGlkbGUgb3IgYnVzeS4KLSAqIDEgPSAgaGFsdGVkLCAgMCA9IGJ1c3kgKi8KLSNkZWZpbmUgQVhJX1NUQVRVU19CVVNZX01BU0sgMHgwMDAwMDAyMAotCi0vKiBiaXQgMCAmIGJpdCAxID0gMSwgYm90aCB5IGFuZCBjYmNyIGlycXMgbmVlZCB0byBiZSBwcmVzZW50Ci0gKiBmb3IgZnJhbWUgZG9uZSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgVkZFX0NPTVBfSVJRX0JPVEhfWV9DQkNSIDMKLQotLyogYml0IDEgPSAxLCBvbmx5IGNiY3IgaXJxIHRyaWdnZXJzIGZyYW1lIGRvbmUgaW50ZXJydXB0ICovCi0jZGVmaW5lIFZGRV9DT01QX0lSUV9DQkNSX09OTFkgMgotCi0vKiBiaXQgMCA9IDEsIG9ubHkgeSBpcnEgdHJpZ2dlcnMgZnJhbWUgZG9uZSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgVkZFX0NPTVBfSVJRX1lfT05MWSAxCi0KLS8qIGJpdCAwID0gMSwgUE0gZ287ICAgYml0MSA9IDEsIFBNIHN0b3AgKi8KLSNkZWZpbmUgVkZFX1BFUkZPUk1BTkNFX01PTklUT1JfR08gICAweDAwMDAwMDAxCi0jZGVmaW5lIFZGRV9QRVJGT1JNQU5DRV9NT05JVE9SX1NUT1AgMHgwMDAwMDAwMgotCi0vKiBiaXQgMCA9IDEsIHRlc3QgZ2VuIGdvOyAgIGJpdDEgPSAxLCB0ZXN0IGdlbiBzdG9wICovCi0jZGVmaW5lIFZGRV9URVNUX0dFTl9HTyAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgVkZFX1RFU1RfR0VOX1NUT1AgMHgwMDAwMDAwMgotCi0vKiB0aGUgY2hyb21hIGlzIGFzc3VtZWQgdG8gYmUgaW50ZXJwb2xhdGVkIGJldHdlZW4KLSAqIHRoZSBsdW1hIHNhbXBsZXMuICBKUEVHIDQ6MjoyICovCi0jZGVmaW5lIFZGRV9DSFJPTUFfVVBTQU1QTEVfSU5URVJQT0xBVEVEIDAKLQotLyogY29uc3RhbnRzIGZvciBpcnEgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFZGRV9ESVNBQkxFX0FMTF9JUlFTIDAKLS8qIGJpdCA9MSBpcyB0byBjbGVhciB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gVkZFX0lSUV9TVEFUVVMuICAqLwotI2RlZmluZSBWRkVfQ0xFQVJfQUxMX0lSUVMgICAweGZmZmZmZmZmCi0KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX0NBTUlGX1NPRl9NQVNLICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfQ0FNSUZfRU9GX01BU0sgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9SRUdfVVBEQVRFX01BU0sgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX0lNQUdFX0NPTVBPU0lUX0RPTkUwX01BU0sgMHgwMDIwMDAwMAotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfSU1BR0VfQ09NUE9TSVRfRE9ORTFfTUFTSyAweDAwNDAwMDAwCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9JTUFHRV9DT01QT1NJVF9ET05FMl9NQVNLIDB4MDA4MDAwMDAKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMxX1JFU0VUX0FYSV9IQUxUX0FDS19NQVNLICAgMHgwMDgwMDAwMAotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQ09NUE9TSVRfTUFTSyAgICAgICAweDAxMDAwMDAwCi0KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0FFQyAgICAgMHgyMDAwICAvKiBiaXQgMTMgKi8KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0FGICAgICAgMHg0MDAwICAvKiBiaXQgMTQgKi8KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0FXQiAgICAgMHg4MDAwICAvKiBiaXQgMTUgKi8KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX1JTICAgICAgMHgxMDAwMCAgLyogYml0IDE2ICovCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19DUyAgICAgIDB4MjAwMDAgIC8qIGJpdCAxNyAqLwotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfSUhJU1QgICAweDQwMDAwICAvKiBiaXQgMTggKi8KLQotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfU1lOQ19USU1FUjAgICAweDIwMDAwMDAgIC8qIGJpdCAyNSAqLwotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfU1lOQ19USU1FUjEgICAweDQwMDAwMDAgIC8qIGJpdCAyNiAqLwotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfU1lOQ19USU1FUjIgICAweDgwMDAwMDAgIC8qIGJpdCAyNyAqLwotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfQVNZTkNfVElNRVIwICAweDEwMDAwMDAwICAvKiBiaXQgMjggKi8KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX0FTWU5DX1RJTUVSMSAgMHgyMDAwMDAwMCAgLyogYml0IDI5ICovCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9BU1lOQ19USU1FUjIgIDB4NDAwMDAwMDAgIC8qIGJpdCAzMCAqLwotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfQVNZTkNfVElNRVIzICAweDgwMDAwMDAwICAvKiBiaXQgMzEgKi8KLQotLyogaW1hc2sgZm9yIHdoaWxlIHdhaXRpbmcgZm9yIHN0b3AgYWNrLCAgZHJpdmVyIGhhcyBhbHJlYWR5Ci0gKiByZXF1ZXN0ZWQgc3RvcCwgd2FpdGluZyBmb3IgcmVzZXQgaXJxLCBhbmQgYXN5bmMgdGltZXIgaXJxLgotICogRm9yIGlycV9zdGF0dXNfMCwgYml0IDI4LTMxIGFyZSBmb3IgYXN5bmMgdGltZXIuIEZvcgotICogaXJxX3N0YXR1c18xLCBiaXQgMjIgZm9yIHJlc2V0IGlycSwgYml0IDIzIGZvciBheGlfaGFsdF9hY2sKLSAgIGlycSAqLwotI2RlZmluZSBWRkVfSU1BU0tfV0hJTEVfU1RPUFBJTkdfMCAgMHhGMDAwMDAwMAotI2RlZmluZSBWRkVfSU1BU0tfV0hJTEVfU1RPUFBJTkdfMSAgMHgwMEMwMDAwMAotI2RlZmluZSBWRkVfSU1BU0tfUkVTRVQgICAgICAgICAgICAgMHgwMDQwMDAwMAotI2RlZmluZSBWRkVfSU1BU0tfQVhJX0hBTFQgICAgICAgICAgMHgwMDgwMDAwMAotCi0KLS8qIG5vIGVycm9yIGlycSBpbiBtYXNrIDAgKi8KLSNkZWZpbmUgVkZFX0lNQVNLX0VSUk9SX09OTFlfMCAgMHgwCi0vKiB3aGVuIG5vcm1hbCBjYXNlLCBkb24ndCB3YW50IHRvIGJsb2NrIGVycm9yIHN0YXR1cy4gKi8KLS8qIGJpdCAwLTIxIGFyZSBlcnJvciBpcnEgYml0cyAqLwotI2RlZmluZSBWRkVfSU1BU0tfRVJST1JfT05MWV8xICAweDAwM2ZmZmZmCi0KLS8qIEZvciBCUEMgYml0IDAsYml0IDEyLTE3IGFuZCBiaXQgMjYgLTIwIGFyZSBzZXQgdG8gemVybyBhbmQgb3RoZXIncyAxICovCi0jZGVmaW5lIEJQQ19NQVNLIDB4RjgwQzBGRkUKLQotLyogRm9yIEJQQyBiaXQgMSBhbmQgMiBhcmUgc2V0IHRvIHplcm8gYW5kIG90aGVyJ3MgMSAqLwotI2RlZmluZSBBQkZfTUFTSyAweEZGRkZGRkY5Ci0KLS8qIEZvciBNQ0UgZW5hYmxlIGJpdCAyOCBzZXQgdG8gemVybyBhbmQgb3RoZXIncyAxICovCi0jZGVmaW5lIE1DRV9FTl9NQVNLIDB4RUZGRkZGRkYKLQotLyogRm9yIE1DRSBRX0sgYml0IDI4IHRvIDMxIHNldCB0byB6ZXJvIGFuZCBvdGhlcidzIDEgKi8KLSNkZWZpbmUgTUNFX1FfS19NQVNLIDB4MEZGRkZGRkYKLQotI2RlZmluZSBBV0JfRU5BQkxFX01BU0sgMHgwMDAwMDA4MCAgICAgLyogYml0IDcgKi8KLSNkZWZpbmUgQUZfRU5BQkxFX01BU0sgMHgwMDAwMDA0MCAgICAgIC8qIGJpdCA2ICovCi0jZGVmaW5lIEFFX0VOQUJMRV9NQVNLIDB4MDAwMDAwMjAgICAgICAvKiBiaXQgNSAqLwotI2RlZmluZSBJSElTVF9FTkFCTEVfTUFTSyAweDAwMDA4MDAwICAgLyogYml0IDE1ICovCi0jZGVmaW5lIFJTX0VOQUJMRV9NQVNLIDB4MDAwMDAxMDAgICAgICAvKiBiaXQgOCAgKi8KLSNkZWZpbmUgQ1NfRU5BQkxFX01BU0sgMHgwMDAwMDIwMCAgICAgIC8qIGJpdCA5ICAqLwotI2RlZmluZSBSU19DU19FTkFCTEVfTUFTSyAweDAwMDAwMzAwICAgLyogYml0IDgsOSAgKi8KLSNkZWZpbmUgU1RBVFNfRU5BQkxFX01BU0sgMHgwMDA0ODNFMCAgIC8qIGJpdCAxOCwxNSw5LDgsNyw2LDUqLwotCi0jZGVmaW5lIFZGRV9SRUdfVVBEQVRFX1RSSUdHRVIgICAgICAgICAgIDEKLSNkZWZpbmUgVkZFX1BNX0JVRl9NQVhfQ05UX01BU0sgICAgICAgICAgMHhGRgotI2RlZmluZSBWRkVfRE1JX0NGR19ERUZBVUxUICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIExFTlNfUk9MTF9PRkZfREVMVEFfVEFCTEVfT0ZGU0VUIDMyCi0jZGVmaW5lIFZGRV9BRV9QSU5HUE9OR19TVEFUVVNfQklUICAgICAgIDB4ODAKLSNkZWZpbmUgVkZFX0FGX1BJTkdQT05HX1NUQVRVU19CSVQgICAgICAgMHgxMDAKLSNkZWZpbmUgVkZFX0FXQl9QSU5HUE9OR19TVEFUVVNfQklUICAgICAgMHgyMDAKLSNkZWZpbmUgUElOR1BPTkdfTE9XRVIgICAgICAgICAgICAgICAgICAgMHg3Ci0KLSNkZWZpbmUgSEZSX01PREVfT0ZGIDEKLQotZW51bSBWRkUzMV9ETUlfUkFNX1NFTCB7Ci0JIE5PX01FTV9TRUxFQ1RFRCAgICAgICAgICA9IDAsCi0JIFJPTExPRkZfUkFNICAgICAgICAgICAgICA9IDB4MSwKLQkgUkdCTFVUX1JBTV9DSDBfQkFOSzAgICAgID0gMHgyLAotCSBSR0JMVVRfUkFNX0NIMF9CQU5LMSAgICAgPSAweDMsCi0JIFJHQkxVVF9SQU1fQ0gxX0JBTkswICAgICA9IDB4NCwKLQkgUkdCTFVUX1JBTV9DSDFfQkFOSzEgICAgID0gMHg1LAotCSBSR0JMVVRfUkFNX0NIMl9CQU5LMCAgICAgPSAweDYsCi0JIFJHQkxVVF9SQU1fQ0gyX0JBTksxICAgICA9IDB4NywKLQkgU1RBVFNfSElTVF9SQU0gICAgICAgICAgID0gMHg4LAotCSBSR0JMVVRfQ0hYX0JBTkswICAgICAgICAgPSAweDksCi0JIFJHQkxVVF9DSFhfQkFOSzEgICAgICAgICA9IDB4YSwKLQkgTFVNQV9BREFQVF9MVVRfUkFNX0JBTkswID0gMHhiLAotCSBMVU1BX0FEQVBUX0xVVF9SQU1fQkFOSzEgPSAweGMKLX07Ci0KLWVudW0gIFZGRV9TVEFURSB7Ci0JVkZFX1NUQVRFX0lETEUsCi0JVkZFX1NUQVRFX0FDVElWRQotfTsKLQotZW51bSAgdmZlX3JlY29yZGluZ19zdGF0ZSB7Ci0JVkZFX1JFQ19TVEFURV9JRExFLAotCVZGRV9SRUNfU1RBVEVfU1RBUlRfUkVRVUVTVEVELAotCVZGRV9SRUNfU1RBVEVfU1RBUlRFRCwKLQlWRkVfUkVDX1NUQVRFX1NUT1BfUkVRVUVTVEVELAotCVZGRV9SRUNfU1RBVEVfU1RPUFBFRCwKLX07Ci0KLSNkZWZpbmUgVjMxX0RVTU1ZXzAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFYzMV9TRVRfQ0xLICAgICAgICAgICAgICAgMQotI2RlZmluZSBWMzFfUkVTRVQgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgVjMxX1NUQVJUICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFYzMV9URVNUX0dFTl9TVEFSVCAgICAgICAgNAotI2RlZmluZSBWMzFfT1BFUkFUSU9OX0NGRyAgICAgICAgIDUKLSNkZWZpbmUgVjMxX0FYSV9PVVRfQ0ZHICAgICAgICAgICA2Ci0jZGVmaW5lIFYzMV9DQU1JRl9DRkcgICAgICAgICAgICAgNwotI2RlZmluZSBWMzFfQVhJX0lOUFVUX0NGRyAgICAgICAgIDgKLSNkZWZpbmUgVjMxX0JMQUNLX0xFVkVMX0NGRyAgICAgICA5Ci0jZGVmaW5lIFYzMV9ST0xMX09GRl9DRkcgICAgICAgICAgMTAKLSNkZWZpbmUgVjMxX0RFTVVYX0NGRyAgICAgICAgICAgICAxMQotI2RlZmluZSBWMzFfREVNT1NBSUNfMF9DRkcgICAgICAgIDEyIC8qIGdlbmVyYWwgKi8KLSNkZWZpbmUgVjMxX0RFTU9TQUlDXzFfQ0ZHICAgICAgICAxMyAvKiBBQkYgICAgICovCi0jZGVmaW5lIFYzMV9ERU1PU0FJQ18yX0NGRyAgICAgICAgMTQgLyogQlBDICAgICAqLwotI2RlZmluZSBWMzFfRk9WX0NGRyAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIFYzMV9NQUlOX1NDQUxFUl9DRkcgICAgICAgMTYKLSNkZWZpbmUgVjMxX1dCX0NGRyAgICAgICAgICAgICAgICAxNwotI2RlZmluZSBWMzFfQ09MT1JfQ09SX0NGRyAgICAgICAgIDE4Ci0jZGVmaW5lIFYzMV9SR0JfR19DRkcgICAgICAgICAgICAgMTkKLSNkZWZpbmUgVjMxX0xBX0NGRyAgICAgICAgICAgICAgICAyMAotI2RlZmluZSBWMzFfQ0hST01BX0VOX0NGRyAgICAgICAgIDIxCi0jZGVmaW5lIFYzMV9DSFJPTUFfU1VQX0NGRyAgICAgICAgMjIKLSNkZWZpbmUgVjMxX01DRV9DRkcgICAgICAgICAgICAgICAyMwotI2RlZmluZSBWMzFfU0tfRU5IQU5fQ0ZHICAgICAgICAgIDI0Ci0jZGVmaW5lIFYzMV9BU0ZfQ0ZHICAgICAgICAgICAgICAgMjUKLSNkZWZpbmUgVjMxX1MyWV9DRkcgICAgICAgICAgICAgICAyNgotI2RlZmluZSBWMzFfUzJDYkNyX0NGRyAgICAgICAgICAgIDI3Ci0jZGVmaW5lIFYzMV9DSFJPTUFfU1VCU19DRkcgICAgICAgMjgKLSNkZWZpbmUgVjMxX09VVF9DTEFNUF9DRkcgICAgICAgICAyOQotI2RlZmluZSBWMzFfRlJBTUVfU0tJUF9DRkcgICAgICAgIDMwCi0jZGVmaW5lIFYzMV9EVU1NWV8xICAgICAgICAgICAgICAgMzEKLSNkZWZpbmUgVjMxX0RVTU1ZXzIgICAgICAgICAgICAgICAzMgotI2RlZmluZSBWMzFfRFVNTVlfMyAgICAgICAgICAgICAgIDMzCi0jZGVmaW5lIFYzMV9VUERBVEUgICAgICAgICAgICAgICAgMzQKLSNkZWZpbmUgVjMxX0JMX0xWTF9VUERBVEUgICAgICAgICAzNQotI2RlZmluZSBWMzFfREVNVVhfVVBEQVRFICAgICAgICAgIDM2Ci0jZGVmaW5lIFYzMV9ERU1PU0FJQ18xX1VQREFURSAgICAgMzcgLyogQlBDICovCi0jZGVmaW5lIFYzMV9ERU1PU0FJQ18yX1VQREFURSAgICAgMzggLyogQUJGICovCi0jZGVmaW5lIFYzMV9GT1ZfVVBEQVRFICAgICAgICAgICAgMzkKLSNkZWZpbmUgVjMxX01BSU5fU0NBTEVSX1VQREFURSAgICA0MAotI2RlZmluZSBWMzFfV0JfVVBEQVRFICAgICAgICAgICAgIDQxCi0jZGVmaW5lIFYzMV9DT0xPUl9DT1JfVVBEQVRFICAgICAgNDIKLSNkZWZpbmUgVjMxX1JHQl9HX1VQREFURSAgICAgICAgICA0MwotI2RlZmluZSBWMzFfTEFfVVBEQVRFICAgICAgICAgICAgIDQ0Ci0jZGVmaW5lIFYzMV9DSFJPTUFfRU5fVVBEQVRFICAgICAgNDUKLSNkZWZpbmUgVjMxX0NIUk9NQV9TVVBfVVBEQVRFICAgICA0NgotI2RlZmluZSBWMzFfTUNFX1VQREFURSAgICAgICAgICAgIDQ3Ci0jZGVmaW5lIFYzMV9TS19FTkhBTl9VUERBVEUgICAgICAgNDgKLSNkZWZpbmUgVjMxX1MyQ2JDcl9VUERBVEUgICAgICAgICA0OQotI2RlZmluZSBWMzFfUzJZX1VQREFURSAgICAgICAgICAgIDUwCi0jZGVmaW5lIFYzMV9BU0ZfVVBEQVRFICAgICAgICAgICAgNTEKLSNkZWZpbmUgVjMxX0ZSQU1FX1NLSVBfVVBEQVRFICAgICA1MgotI2RlZmluZSBWMzFfQ0FNSUZfRlJBTUVfVVBEQVRFICAgIDUzCi0jZGVmaW5lIFYzMV9TVEFUU19BRl9VUERBVEUgICAgICAgNTQKLSNkZWZpbmUgVjMxX1NUQVRTX0FFX1VQREFURSAgICAgICA1NQotI2RlZmluZSBWMzFfU1RBVFNfQVdCX1VQREFURSAgICAgIDU2Ci0jZGVmaW5lIFYzMV9TVEFUU19SU19VUERBVEUgICAgICAgNTcKLSNkZWZpbmUgVjMxX1NUQVRTX0NTX1VQREFURSAgICAgICA1OAotI2RlZmluZSBWMzFfU1RBVFNfU0tJTl9VUERBVEUgICAgIDU5Ci0jZGVmaW5lIFYzMV9TVEFUU19JSElTVF9VUERBVEUgICAgNjAKLSNkZWZpbmUgVjMxX0RVTU1ZXzQgICAgICAgICAgICAgICA2MQotI2RlZmluZSBWMzFfRVBPQ0gxX0FDSyAgICAgICAgICAgIDYyCi0jZGVmaW5lIFYzMV9FUE9DSDJfQUNLICAgICAgICAgICAgNjMKLSNkZWZpbmUgVjMxX1NUQVJUX1JFQ09SRElORyAgICAgICA2NAotI2RlZmluZSBWMzFfU1RPUF9SRUNPUkRJTkcgICAgICAgIDY1Ci0jZGVmaW5lIFYzMV9EVU1NWV81ICAgICAgICAgICAgICAgNjYKLSNkZWZpbmUgVjMxX0RVTU1ZXzYgICAgICAgICAgICAgICA2NwotI2RlZmluZSBWMzFfQ0FQVFVSRSAgICAgICAgICAgICAgIDY4Ci0jZGVmaW5lIFYzMV9EVU1NWV83ICAgICAgICAgICAgICAgNjkKLSNkZWZpbmUgVjMxX1NUT1AgICAgICAgICAgICAgICAgICA3MAotI2RlZmluZSBWMzFfR0VUX0hXX1ZFUlNJT04gICAgICAgIDcxCi0jZGVmaW5lIFYzMV9HRVRfRlJBTUVfU0tJUF9DT1VOVFMgNzIKLSNkZWZpbmUgVjMxX09VVFBVVDFfQlVGRkVSX0VOUSAgICA3MwotI2RlZmluZSBWMzFfT1VUUFVUMl9CVUZGRVJfRU5RICAgIDc0Ci0jZGVmaW5lIFYzMV9PVVRQVVQzX0JVRkZFUl9FTlEgICAgNzUKLSNkZWZpbmUgVjMxX0pQRUdfT1VUX0JVRl9FTlEgICAgICA3NgotI2RlZmluZSBWMzFfUkFXX09VVF9CVUZfRU5RICAgICAgIDc3Ci0jZGVmaW5lIFYzMV9SQVdfSU5fQlVGX0VOUSAgICAgICAgNzgKLSNkZWZpbmUgVjMxX1NUQVRTX0FGX0VOUSAgICAgICAgICA3OQotI2RlZmluZSBWMzFfU1RBVFNfQUVfRU5RICAgICAgICAgIDgwCi0jZGVmaW5lIFYzMV9TVEFUU19BV0JfRU5RICAgICAgICAgODEKLSNkZWZpbmUgVjMxX1NUQVRTX1JTX0VOUSAgICAgICAgICA4MgotI2RlZmluZSBWMzFfU1RBVFNfQ1NfRU5RICAgICAgICAgIDgzCi0jZGVmaW5lIFYzMV9TVEFUU19TS0lOX0VOUSAgICAgICAgODQKLSNkZWZpbmUgVjMxX1NUQVRTX0lISVNUX0VOUSAgICAgICA4NQotI2RlZmluZSBWMzFfRFVNTVlfOCAgICAgICAgICAgICAgIDg2Ci0jZGVmaW5lIFYzMV9KUEVHX0VOQ19DRkcgICAgICAgICAgODcKLSNkZWZpbmUgVjMxX0RVTU1ZXzkgICAgICAgICAgICAgICA4OAotI2RlZmluZSBWMzFfU1RBVFNfQUZfU1RBUlQgICAgICAgIDg5Ci0jZGVmaW5lIFYzMV9TVEFUU19BRl9TVE9QICAgICAgICAgOTAKLSNkZWZpbmUgVjMxX1NUQVRTX0FFX1NUQVJUICAgICAgICA5MQotI2RlZmluZSBWMzFfU1RBVFNfQUVfU1RPUCAgICAgICAgIDkyCi0jZGVmaW5lIFYzMV9TVEFUU19BV0JfU1RBUlQgICAgICAgOTMKLSNkZWZpbmUgVjMxX1NUQVRTX0FXQl9TVE9QICAgICAgICA5NAotI2RlZmluZSBWMzFfU1RBVFNfUlNfU1RBUlQgICAgICAgIDk1Ci0jZGVmaW5lIFYzMV9TVEFUU19SU19TVE9QICAgICAgICAgOTYKLSNkZWZpbmUgVjMxX1NUQVRTX0NTX1NUQVJUICAgICAgICA5NwotI2RlZmluZSBWMzFfU1RBVFNfQ1NfU1RPUCAgICAgICAgIDk4Ci0jZGVmaW5lIFYzMV9TVEFUU19TS0lOX1NUQVJUICAgICAgOTkKLSNkZWZpbmUgVjMxX1NUQVRTX1NLSU5fU1RPUCAgICAgICAxMDAKLSNkZWZpbmUgVjMxX1NUQVRTX0lISVNUX1NUQVJUICAgICAxMDEKLSNkZWZpbmUgVjMxX1NUQVRTX0lISVNUX1NUT1AgICAgICAxMDIKLSNkZWZpbmUgVjMxX0RVTU1ZXzEwICAgICAgICAgICAgICAxMDMKLSNkZWZpbmUgVjMxX1NZTkNfVElNRVJfU0VUVElORyAgICAxMDQKLSNkZWZpbmUgVjMxX0FTWU5DX1RJTUVSX1NFVFRJTkcgICAxMDUKLSNkZWZpbmUgVjMxX0xJVkVTSE9UICAgICAgICAgICAgICAxMDYKLSNkZWZpbmUgVjMxX1pTTCAgICAgICAgICAgICAgICAgICAxMDcKLSNkZWZpbmUgVjMxX1NURVJFT0NBTSAgICAgICAgICAgICAxMDgKLSNkZWZpbmUgVjMxX0xBX1NFVFVQICAgICAgICAgICAgICAxMDkKLSNkZWZpbmUgVjMxX1hCQVJfQ0ZHICAgICAgICAgICAgICAxMTAKLSNkZWZpbmUgVjMxX0VaVFVORV9DRkcgICAgICAgICAgICAxMTEKLQotI2RlZmluZSBWMzFfQ0FNSUZfT0ZGICAgICAgICAgICAgIDB4MDAwMDAxRTQKLSNkZWZpbmUgVjMxX0NBTUlGX0xFTiAgICAgICAgICAgICAzMgotCi0jZGVmaW5lIFYzMV9ERU1VWF9PRkYgICAgICAgICAgICAgMHgwMDAwMDI4NAotI2RlZmluZSBWMzFfREVNVVhfTEVOICAgICAgICAgICAgIDIwCi0KLSNkZWZpbmUgVjMxX0RFTU9TQUlDXzBfT0ZGICAgICAgICAweDAwMDAwMjk4Ci0jZGVmaW5lIFYzMV9ERU1PU0FJQ18wX0xFTiAgICAgICAgNAotLyogQUJGICAgICAqLwotI2RlZmluZSBWMzFfREVNT1NBSUNfMV9PRkYgICAgICAgIDB4MDAwMDAyQTQKLSNkZWZpbmUgVjMxX0RFTU9TQUlDXzFfTEVOICAgICAgICAxODAKLS8qIEJQQyAgICAgKi8KLSNkZWZpbmUgVjMxX0RFTU9TQUlDXzJfT0ZGICAgICAgICAweDAwMDAwMjlDCi0jZGVmaW5lIFYzMV9ERU1PU0FJQ18yX0xFTiAgICAgICAgOAotCi0vKiBnYW1tYSBWRkVfTFVUX0JBTktfU0VMKi8KLSNkZWZpbmUgVjMxX0dBTU1BX0NGR19PRkYgICAgICAgICAweDAwMDAwM0JDCi0jZGVmaW5lIFYzMV9MVU1BX0NGR19PRkYgICAgICAgICAgMHgwMDAwMDNDMAotCi0jZGVmaW5lIFYzMV9PVVRfQ0xBTVBfT0ZGICAgICAgICAgMHgwMDAwMDUyNAotI2RlZmluZSBWMzFfT1VUX0NMQU1QX0xFTiAgICAgICAgIDgKLQotI2RlZmluZSBWMzFfT1BFUkFUSU9OX0NGR19MRU4gICAgIDMyCi0KLSNkZWZpbmUgVjMxX0FYSV9PVVRfT0ZGICAgICAgICAgICAweDAwMDAwMDM4Ci0jZGVmaW5lIFYzMV9BWElfT1VUX0xFTiAgICAgICAgICAgMjIwCi0jZGVmaW5lIFYzMV9BWElfQ0hfSU5GX0xFTiAgICAgICAgMzIKLSNkZWZpbmUgVjMxX0FYSV9DRkdfTEVOICAgICAgICAgICA0NwotCi0jZGVmaW5lIFYzMV9GUkFNRV9TS0lQX09GRiAgICAgICAgMHgwMDAwMDUwNAotI2RlZmluZSBWMzFfRlJBTUVfU0tJUF9MRU4gICAgICAgIDMyCi0KLSNkZWZpbmUgVjMxX0NIUk9NQV9TVUJTX09GRiAgICAgICAweDAwMDAwNEY4Ci0jZGVmaW5lIFYzMV9DSFJPTUFfU1VCU19MRU4gICAgICAgMTIKLQotI2RlZmluZSBWMzFfRk9WX09GRiAgICAgICAgICAgMHgwMDAwMDM2MAotI2RlZmluZSBWMzFfRk9WX0xFTiAgICAgICAgICAgOAotCi0jZGVmaW5lIFYzMV9NQUlOX1NDQUxFUl9PRkYgMHgwMDAwMDM2OAotI2RlZmluZSBWMzFfTUFJTl9TQ0FMRVJfTEVOIDI4Ci0KLSNkZWZpbmUgVjMxX1MyWV9PRkYgMHgwMDAwMDREMAotI2RlZmluZSBWMzFfUzJZX0xFTiAyMAotCi0jZGVmaW5lIFYzMV9TMkNiQ3JfT0ZGIDB4MDAwMDA0RTQKLSNkZWZpbmUgVjMxX1MyQ2JDcl9MRU4gMjAKLQotI2RlZmluZSBWMzFfQ0hST01BX0VOX09GRiAweDAwMDAwM0M0Ci0jZGVmaW5lIFYzMV9DSFJPTUFfRU5fTEVOIDM2Ci0KLSNkZWZpbmUgVjMxX1NZTkNfVElNRVJfT0ZGICAgICAgMHgwMDAwMDIwQwotI2RlZmluZSBWMzFfU1lOQ19USU1FUl9QT0xBUklUWV9PRkYgMHgwMDAwMDIzNAotI2RlZmluZSBWMzFfVElNRVJfU0VMRUNUX09GRiAgICAgICAgMHgwMDAwMDI1QwotI2RlZmluZSBWMzFfU1lOQ19USU1FUl9MRU4gMjgKLQotI2RlZmluZSBWMzFfQVNZTkNfVElNRVJfT0ZGIDB4MDAwMDAyMzgKLSNkZWZpbmUgVjMxX0FTWU5DX1RJTUVSX0xFTiAyOAotCi0jZGVmaW5lIFYzMV9CTEFDS19MRVZFTF9PRkYgMHgwMDAwMDI2NAotI2RlZmluZSBWMzFfQkxBQ0tfTEVWRUxfTEVOIDE2Ci0KLSNkZWZpbmUgVjMxX1JPTExfT0ZGX0NGR19PRkYgMHgwMDAwMDI3NAotI2RlZmluZSBWMzFfUk9MTF9PRkZfQ0ZHX0xFTiAxNgotCi0jZGVmaW5lIFYzMV9DT0xPUl9DT1JfT0ZGIDB4MDAwMDAzODgKLSNkZWZpbmUgVjMxX0NPTE9SX0NPUl9MRU4gNTIKLQotI2RlZmluZSBWMzFfV0JfT0ZGIDB4MDAwMDAzODQKLSNkZWZpbmUgVjMxX1dCX0xFTiA0Ci0KLSNkZWZpbmUgVjMxX1JHQl9HX09GRiAweDAwMDAwM0JDCi0jZGVmaW5lIFYzMV9SR0JfR19MRU4gNAotCi0jZGVmaW5lIFYzMV9MQV9PRkYgMHgwMDAwMDNDMAotI2RlZmluZSBWMzFfTEFfTEVOIDQKLQotI2RlZmluZSBWMzFfU0NFX09GRiAweDAwMDAwNDE4Ci0jZGVmaW5lIFYzMV9TQ0VfTEVOIDEzNgotCi0jZGVmaW5lIFYzMV9DSFJPTUFfU1VQX09GRiAweDAwMDAwM0U4Ci0jZGVmaW5lIFYzMV9DSFJPTUFfU1VQX0xFTiAxMgotCi0jZGVmaW5lIFYzMV9NQ0VfT0ZGIDB4MDAwMDAzRjQKLSNkZWZpbmUgVjMxX01DRV9MRU4gMzYKLSNkZWZpbmUgVjMxX1NUQVRTX0FGX09GRiAweDAwMDAwNTNjCi0jZGVmaW5lIFYzMV9TVEFUU19BRl9MRU4gMTYKLQotI2RlZmluZSBWMzFfU1RBVFNfQUVfT0ZGIDB4MDAwMDA1MzQKLSNkZWZpbmUgVjMxX1NUQVRTX0FFX0xFTiA4Ci0KLSNkZWZpbmUgVjMxX1NUQVRTX0FXQl9PRkYgMHgwMDAwMDU0YwotI2RlZmluZSBWMzFfU1RBVFNfQVdCX0xFTiAzMgotCi0jZGVmaW5lIFYzMV9TVEFUU19JSElTVF9PRkYgMHgwMDAwMDU3YwotI2RlZmluZSBWMzFfU1RBVFNfSUhJU1RfTEVOIDgKLQotI2RlZmluZSBWMzFfU1RBVFNfUlNfT0ZGIDB4MDAwMDA1NmMKLSNkZWZpbmUgVjMxX1NUQVRTX1JTX0xFTiA4Ci0KLSNkZWZpbmUgVjMxX1NUQVRTX0NTX09GRiAweDAwMDAwNTc0Ci0jZGVmaW5lIFYzMV9TVEFUU19DU19MRU4gOAotCi0jZGVmaW5lIFYzMV9YQkFSX0NGR19PRkYgMHgwMDAwMDA0MAotI2RlZmluZSBWMzFfWEJBUl9DRkdfTEVOIDgKLQotI2RlZmluZSBWMzFfRVpUVU5FX0NGR19PRkYgMHgwMDAwMDAxMAotI2RlZmluZSBWMzFfRVpUVU5FX0NGR19MRU4gNAotCi0jZGVmaW5lIFYzMV9BU0ZfT0ZGIDB4MDAwMDA0QTAKLSNkZWZpbmUgVjMxX0FTRl9MRU4gNDgKLSNkZWZpbmUgVjMxX0FTRl9VUERBVEVfTEVOIDM2Ci0KLSNkZWZpbmUgVjMxX0NBUFRVUkVfTEVOIDQKLQotc3RydWN0IHZmZV9jbWRfaHdfdmVyc2lvbiB7Ci0JdWludDMyX3QgbWlub3JWZXJzaW9uOwotCXVpbnQzMl90IG1ham9yVmVyc2lvbjsKLQl1aW50MzJfdCBjb3JlVmVyc2lvbjsKLX07Ci0KLWVudW0gVkZFX0FYSV9PVVRQVVRfTU9ERSB7Ci0JVkZFX0FYSV9PVVRQVVRfTU9ERV9PdXRwdXQxLAotCVZGRV9BWElfT1VUUFVUX01PREVfT3V0cHV0MiwKLQlWRkVfQVhJX09VVFBVVF9NT0RFX091dHB1dDFBbmRPdXRwdXQyLAotCVZGRV9BWElfT1VUUFVUX01PREVfQ0FNSUZUb0FYSVZpYU91dHB1dDIsCi0JVkZFX0FYSV9PVVRQVVRfTU9ERV9PdXRwdXQyQW5kQ0FNSUZUb0FYSVZpYU91dHB1dDEsCi0JVkZFX0FYSV9PVVRQVVRfTU9ERV9PdXRwdXQxQW5kQ0FNSUZUb0FYSVZpYU91dHB1dDIsCi0JVkZFX0FYSV9MQVNUX09VVFBVVF9NT0RFX0VOVU0KLX07Ci0KLWVudW0gVkZFX1JBV19XUl9QQVRIX1NFTCB7Ci0JVkZFX1JBV19PVVRQVVRfRElTQUJMRUQsCi0JVkZFX1JBV19PVVRQVVRfRU5DX0NCQ1JfUEFUSCwKLQlWRkVfUkFXX09VVFBVVF9WSUVXX0NCQ1JfUEFUSCwKLQlWRkVfUkFXX09VVFBVVF9QQVRIX0lOVkFMSUQKLX07Ci0KLQotI2RlZmluZSBWRkVfQVhJX09VVFBVVF9CVVJTVF9MRU5HVEggICAgIDQKLSNkZWZpbmUgVkZFX01BWF9OVU1fRlJBR01FTlRTX1BFUl9GUkFNRSA0Ci0jZGVmaW5lIFZGRV9BWElfT1VUUFVUX0NGR19GUkFNRV9DT1VOVCAgMwotCi1zdHJ1Y3QgdmZlX2NtZHNfcGVyX3dyaXRlX21hc3RlciB7Ci0JdWludDE2X3QgaW1hZ2VXaWR0aDsKLQl1aW50MTZfdCBpbWFnZUhlaWdodDsKLQl1aW50MTZfdCBvdXRSb3dDb3VudDsKLQl1aW50MTZfdCBvdXRSb3dJbmNyZW1lbnQ7Ci0JdWludDMyX3Qgb3V0RnJhZ21lbnRzW1ZGRV9BWElfT1VUUFVUX0NGR19GUkFNRV9DT1VOVF0KLQkJW1ZGRV9NQVhfTlVNX0ZSQUdNRU5UU19QRVJfRlJBTUVdOwotfTsKLQotc3RydWN0IHZmZV9jbWRzX2F4aV9wZXJfb3V0cHV0X3BhdGggewotCXVpbnQ4X3QgZnJhZ21lbnRDb3VudDsKLQlzdHJ1Y3QgdmZlX2NtZHNfcGVyX3dyaXRlX21hc3RlciBmaXJzdFdNOwotCXN0cnVjdCB2ZmVfY21kc19wZXJfd3JpdGVfbWFzdGVyIHNlY29uZFdNOwotfTsKLQotZW51bSBWRkVfQVhJX0JVUlNUX0xFTkdUSCB7Ci0JVkZFX0FYSV9CVVJTVF9MRU5HVEhfSVNfMiAgPSAyLAotCVZGRV9BWElfQlVSU1RfTEVOR1RIX0lTXzQgID0gNCwKLQlWRkVfQVhJX0JVUlNUX0xFTkdUSF9JU184ICA9IDgsCi0JVkZFX0FYSV9CVVJTVF9MRU5HVEhfSVNfMTYgPSAxNgotfTsKLQotCi1zdHJ1Y3QgdmZlX2NtZF9mb3ZfY3JvcF9jb25maWcgewotCXVpbnQ4X3QgZW5hYmxlOwotCXVpbnQxNl90IGZpcnN0UGl4ZWw7Ci0JdWludDE2X3QgbGFzdFBpeGVsOwotCXVpbnQxNl90IGZpcnN0TGluZTsKLQl1aW50MTZfdCBsYXN0TGluZTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kc19tYWluX3NjYWxlcl9zdHJpcGVfaW5pdCB7Ci0JdWludDE2X3QgTU5Db3VudGVySW5pdDsKLQl1aW50MTZfdCBwaGFzZUluaXQ7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZHNfc2NhbGVyX29uZV9kaW1lbnNpb24gewotCXVpbnQ4X3QgIGVuYWJsZTsKLQl1aW50MTZfdCBpbnB1dFNpemU7Ci0JdWludDE2X3Qgb3V0cHV0U2l6ZTsKLQl1aW50MzJfdCBwaGFzZU11bHRpcGxpY2F0aW9uRmFjdG9yOwotCXVpbnQ4X3QgIGludGVycG9sYXRpb25SZXNvbHV0aW9uOwotfTsKLQotc3RydWN0IHZmZV9jbWRfbWFpbl9zY2FsZXJfY29uZmlnIHsKLQl1aW50OF90IGVuYWJsZTsKLQlzdHJ1Y3QgdmZlX2NtZHNfc2NhbGVyX29uZV9kaW1lbnNpb24gICAgaGNvbmZpZzsKLQlzdHJ1Y3QgdmZlX2NtZHNfc2NhbGVyX29uZV9kaW1lbnNpb24gICAgdmNvbmZpZzsKLQlzdHJ1Y3QgdmZlX2NtZHNfbWFpbl9zY2FsZXJfc3RyaXBlX2luaXQgTU5Jbml0SDsKLQlzdHJ1Y3QgdmZlX2NtZHNfbWFpbl9zY2FsZXJfc3RyaXBlX2luaXQgTU5Jbml0VjsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX3NjYWxlcjJfY29uZmlnIHsKLQl1aW50OF90IGVuYWJsZTsKLQlzdHJ1Y3QgdmZlX2NtZHNfc2NhbGVyX29uZV9kaW1lbnNpb24gaGNvbmZpZzsKLQlzdHJ1Y3QgdmZlX2NtZHNfc2NhbGVyX29uZV9kaW1lbnNpb24gdmNvbmZpZzsKLX07Ci0KLQotc3RydWN0IHZmZV9jbWRfZnJhbWVfc2tpcF91cGRhdGUgewotCXVpbnQzMl90IG91dHB1dDFQYXR0ZXJuOwotCXVpbnQzMl90IG91dHB1dDJQYXR0ZXJuOwotfTsKLQotc3RydWN0IHZmZV9jbWRfb3V0cHV0X2NsYW1wX2NvbmZpZyB7Ci0JdWludDhfdCBtaW5DaDA7Ci0JdWludDhfdCBtaW5DaDE7Ci0JdWludDhfdCBtaW5DaDI7Ci0JdWludDhfdCBtYXhDaDA7Ci0JdWludDhfdCBtYXhDaDE7Ci0JdWludDhfdCBtYXhDaDI7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9jaHJvbWFfc3Vic2FtcGxlX2NvbmZpZyB7Ci0JdWludDhfdCBlbmFibGU7Ci0JdWludDhfdCBjcm9wRW5hYmxlOwotCXVpbnQ4X3QgdnN1YlNhbXBsZUVuYWJsZTsKLQl1aW50OF90IGhzdWJTYW1wbGVFbmFibGU7Ci0JdWludDhfdCB2Q29zaXRlZDsKLQl1aW50OF90IGhDb3NpdGVkOwotCXVpbnQ4X3QgdkNvc2l0ZWRQaGFzZTsKLQl1aW50OF90IGhDb3NpdGVkUGhhc2U7Ci0JdWludDE2X3QgY3JvcFdpZHRoRmlyc3RQaXhlbDsKLQl1aW50MTZfdCBjcm9wV2lkdGhMYXN0UGl4ZWw7Ci0JdWludDE2X3QgY3JvcEhlaWdodEZpcnN0TGluZTsKLQl1aW50MTZfdCBjcm9wSGVpZ2h0TGFzdExpbmU7Ci19OwotCi1lbnVtIFZGRV9TVEFSVF9JTlBVVF9TT1VSQ0UgewotCVZGRV9TVEFSVF9JTlBVVF9TT1VSQ0VfQ0FNSUYsCi0JVkZFX1NUQVJUX0lOUFVUX1NPVVJDRV9URVNUR0VOLAotCVZGRV9TVEFSVF9JTlBVVF9TT1VSQ0VfQVhJLAotCVZGRV9TVEFSVF9JTlBVVF9TT1VSQ0VfSU5WQUxJRAotfTsKLQotZW51bSBWRkVfU1RBUlRfUElYRUxfUEFUVEVSTiB7Ci0JVkZFX0JBWUVSX1JHUkdSRywKLQlWRkVfQkFZRVJfR1JHUkdSLAotCVZGRV9CQVlFUl9CR0JHQkcsCi0JVkZFX0JBWUVSX0dCR0JHQiwKLQlWRkVfWVVWX1lDYllDciwKLQlWRkVfWVVWX1lDcllDYiwKLQlWRkVfWVVWX0NiWUNyWSwKLQlWRkVfWVVWX0NyWUNiWQotfTsKLQotZW51bSBWRkVfQlVTX1JEX0lOUFVUX1BJWEVMX1BBVFRFUk4gewotCVZGRV9CQVlFUl9SQVcsCi0JVkZFX1lVVl9JTlRFUkxFQVZFRCwKLQlWRkVfWVVWX1BTRVVET19QTEFOQVJfWSwKLQlWRkVfWVVWX1BTRVVET19QTEFOQVJfQ0JDUgotfTsKLQotZW51bSBWRkVfWVVWX0lOUFVUX0NPU0lUSU5HX01PREUgewotCVZGRV9ZVVZfQ09TSVRFRCwKLQlWRkVfWVVWX0lOVEVSUE9MQVRFRAotfTsKLQotCi0vKiAxMyoxICAqLwotI2RlZmluZSBWRkUzMV9ST0xMX09GRl9JTklUX1RBQkxFX1NJWkUgIDEzCi0vKiAxMyoxNiAqLwotI2RlZmluZSBWRkUzMV9ST0xMX09GRl9ERUxUQV9UQUJMRV9TSVpFIDIwOAotCi0jZGVmaW5lIFZGRTMxX0dBTU1BX05VTV9FTlRSSUVTICA2NAotCi0jZGVmaW5lIFZGRTMxX0xBX1RBQkxFX0xFTkdUSCAgICA2NAotCi0jZGVmaW5lIFZGRTMxX0hJU1RfVEFCTEVfTEVOR1RIICAyNTYKLQotc3RydWN0IHZmZV9jbWRzX2RlbW9zYWljX2FiZiB7Ci0JdWludDhfdCAgIGVuYWJsZTsKLQl1aW50OF90ICAgZm9yY2VPbjsKLQl1aW50OF90ICAgc2hpZnQ7Ci0JdWludDE2X3QgIGxwVGhyZXNob2xkOwotCXVpbnQxNl90ICBtYXg7Ci0JdWludDE2X3QgIG1pbjsKLQl1aW50OF90ICAgcmF0aW87Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZHNfZGVtb3NhaWNfYnBjIHsKLQl1aW50OF90ICAgZW5hYmxlOwotCXVpbnQxNl90ICBmbWF4VGhyZXNob2xkOwotCXVpbnQxNl90ICBmbWluVGhyZXNob2xkOwotCXVpbnQxNl90ICByZWREaWZmVGhyZXNob2xkOwotCXVpbnQxNl90ICBibHVlRGlmZlRocmVzaG9sZDsKLQl1aW50MTZfdCAgZ3JlZW5EaWZmVGhyZXNob2xkOwotfTsKLQotc3RydWN0IHZmZV9jbWRfZGVtb3NhaWNfY29uZmlnIHsKLQl1aW50OF90ICAgZW5hYmxlOwotCXVpbnQ4X3QgICBzbG9wZVNoaWZ0OwotCXN0cnVjdCB2ZmVfY21kc19kZW1vc2FpY19hYmYgYWJmQ29uZmlnOwotCXN0cnVjdCB2ZmVfY21kc19kZW1vc2FpY19icGMgYnBjQ29uZmlnOwotfTsKLQotc3RydWN0IHZmZV9jbWRfZGVtb3NhaWNfYnBjX3VwZGF0ZSB7Ci0Jc3RydWN0IHZmZV9jbWRzX2RlbW9zYWljX2JwYyBicGNVcGRhdGU7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9kZW1vc2FpY19hYmZfdXBkYXRlIHsKLQlzdHJ1Y3QgdmZlX2NtZHNfZGVtb3NhaWNfYWJmIGFiZlVwZGF0ZTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX3doaXRlX2JhbGFuY2VfY29uZmlnIHsKLQl1aW50OF90ICBlbmFibGU7Ci0JdWludDE2X3QgY2gyR2FpbjsKLQl1aW50MTZfdCBjaDFHYWluOwotCXVpbnQxNl90IGNoMEdhaW47Ci19OwotCi1lbnVtIFZGRV9DT0xPUl9DT1JSRUNUSU9OX0NPRUZfUUZBQ1RPUiB7Ci0JQ09FRl9JU19RN19TSUdORUQsCi0JQ09FRl9JU19ROF9TSUdORUQsCi0JQ09FRl9JU19ROV9TSUdORUQsCi0JQ09FRl9JU19RMTBfU0lHTkVECi19OwotCi1zdHJ1Y3QgdmZlX2NtZF9jb2xvcl9jb3JyZWN0aW9uX2NvbmZpZyB7Ci0JdWludDhfdCAgICAgZW5hYmxlOwotCWVudW0gVkZFX0NPTE9SX0NPUlJFQ1RJT05fQ09FRl9RRkFDVE9SIGNvZWZRRmFjdG9yOwotCWludDE2X3QgIEMwOwotCWludDE2X3QgIEMxOwotCWludDE2X3QgIEMyOwotCWludDE2X3QgIEMzOwotCWludDE2X3QgIEM0OwotCWludDE2X3QgIEM1OwotCWludDE2X3QgIEM2OwotCWludDE2X3QgIEM3OwotCWludDE2X3QgIEM4OwotCWludDE2X3QgIEswOwotCWludDE2X3QgIEsxOwotCWludDE2X3QgIEsyOwotfTsKLQotI2RlZmluZSBWRkVfTEFfVEFCTEVfTEVOR1RIIDY0Ci0KLXN0cnVjdCB2ZmVfY21kX2xhX2NvbmZpZyB7Ci0JdWludDhfdCBlbmFibGU7Ci0JaW50MTZfdCB0YWJsZVtWRkVfTEFfVEFCTEVfTEVOR1RIXTsKLX07Ci0KLSNkZWZpbmUgVkZFX0dBTU1BX1RBQkxFX0xFTkdUSCAyNTYKLWVudW0gVkZFX1JHQl9HQU1NQV9UQUJMRV9TRUxFQ1QgewotCVJHQl9HQU1NQV9DSDBfU0VMRUNURUQsCi0JUkdCX0dBTU1BX0NIMV9TRUxFQ1RFRCwKLQlSR0JfR0FNTUFfQ0gyX1NFTEVDVEVELAotCVJHQl9HQU1NQV9DSDBfQ0gxX1NFTEVDVEVELAotCVJHQl9HQU1NQV9DSDBfQ0gyX1NFTEVDVEVELAotCVJHQl9HQU1NQV9DSDFfQ0gyX1NFTEVDVEVELAotCVJHQl9HQU1NQV9DSDBfQ0gxX0NIMl9TRUxFQ1RFRAotfTsKLQotc3RydWN0IHZmZV9jbWRfcmdiX2dhbW1hX2NvbmZpZyB7Ci0JdWludDhfdCBlbmFibGU7Ci0JZW51bSBWRkVfUkdCX0dBTU1BX1RBQkxFX1NFTEVDVCBjaGFubmVsU2VsZWN0OwotCWludDE2X3QgdGFibGVbVkZFX0dBTU1BX1RBQkxFX0xFTkdUSF07Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9jaHJvbWFfZW5oYW5fY29uZmlnIHsKLQl1aW50OF90ICBlbmFibGU7Ci0JaW50MTZfdCBhbTsKLQlpbnQxNl90IGFwOwotCWludDE2X3QgYm07Ci0JaW50MTZfdCBicDsKLQlpbnQxNl90IGNtOwotCWludDE2X3QgY3A7Ci0JaW50MTZfdCBkbTsKLQlpbnQxNl90IGRwOwotCWludDE2X3Qga2NyOwotCWludDE2X3Qga2NiOwotCWludDE2X3QgUkdCdG9ZQ29udmVyc2lvblYwOwotCWludDE2X3QgUkdCdG9ZQ29udmVyc2lvblYxOwotCWludDE2X3QgUkdCdG9ZQ29udmVyc2lvblYyOwotCXVpbnQ4X3QgUkdCdG9ZQ29udmVyc2lvbk9mZnNldDsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX2Nocm9tYV9zdXBwcmVzc2lvbl9jb25maWcgewotCXVpbnQ4X3QgZW5hYmxlOwotCXVpbnQ4X3QgbTE7Ci0JdWludDhfdCBtMzsKLQl1aW50OF90IG4xOwotCXVpbnQ4X3QgbjM7Ci0JdWludDhfdCBubjE7Ci0JdWludDhfdCBtbTE7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9hc2ZfY29uZmlnIHsKLQl1aW50OF90IGVuYWJsZTsKLQl1aW50OF90IHNtb290aEZpbHRlckVuYWJsZWQ7Ci0JdWludDhfdCBzaGFycE1vZGU7Ci0JdWludDhfdCBzbW9vdGhDb2VmQ2VudGVyOwotCXVpbnQ4X3Qgc21vb3RoQ29lZlN1cnI7Ci0JdWludDhfdCBub3JtYWxpemVGYWN0b3I7Ci0JdWludDhfdCBzaGFycEsxOwotCXVpbnQ4X3Qgc2hhcnBLMjsKLQl1aW50OF90IHNoYXJwVGhyZXNoRTE7Ci0JaW50OF90IHNoYXJwVGhyZXNoRTI7Ci0JaW50OF90IHNoYXJwVGhyZXNoRTM7Ci0JaW50OF90IHNoYXJwVGhyZXNoRTQ7Ci0JaW50OF90IHNoYXJwVGhyZXNoRTU7Ci0JaW50OF90IGZpbHRlcjFDb2VmZmljaWVudHNbOV07Ci0JaW50OF90IGZpbHRlcjJDb2VmZmljaWVudHNbOV07Ci0JdWludDhfdCAgY3JvcEVuYWJsZTsKLQl1aW50MTZfdCBjcm9wRmlyc3RQaXhlbDsKLQl1aW50MTZfdCBjcm9wTGFzdFBpeGVsOwotCXVpbnQxNl90IGNyb3BGaXJzdExpbmU7Ci0JdWludDE2X3QgY3JvcExhc3RMaW5lOwotfTsKLQotc3RydWN0IHZmZV9jbWRfYXNmX3VwZGF0ZSB7Ci0JdWludDhfdCBlbmFibGU7Ci0JdWludDhfdCBzbW9vdGhGaWx0ZXJFbmFibGVkOwotCXVpbnQ4X3Qgc2hhcnBNb2RlOwotCXVpbnQ4X3Qgc21vb3RoQ29lZkNlbnRlcjsKLQl1aW50OF90IHNtb290aENvZWZTdXJyOwotCXVpbnQ4X3Qgbm9ybWFsaXplRmFjdG9yOwotCXVpbnQ4X3Qgc2hhcnBLMTsKLQl1aW50OF90IHNoYXJwSzI7Ci0JdWludDhfdCBzaGFycFRocmVzaEUxOwotCWludDhfdCAgc2hhcnBUaHJlc2hFMjsKLQlpbnQ4X3QgIHNoYXJwVGhyZXNoRTM7Ci0JaW50OF90ICBzaGFycFRocmVzaEU0OwotCWludDhfdCAgc2hhcnBUaHJlc2hFNTsKLQlpbnQ4X3QgIGZpbHRlcjFDb2VmZmljaWVudHNbOV07Ci0JaW50OF90ICBmaWx0ZXIyQ29lZmZpY2llbnRzWzldOwotCXVpbnQ4X3QgY3JvcEVuYWJsZTsKLX07Ci0KLWVudW0gVkZFX1RFU1RfR0VOX1NZTkNfRURHRSB7Ci0JVkZFX1RFU1RfR0VOX1NZTkNfRURHRV9BY3RpdmVIaWdoLAotCVZGRV9URVNUX0dFTl9TWU5DX0VER0VfQWN0aXZlTG93Ci19OwotCi0KLXN0cnVjdCB2ZmVfY21kX2J1c19wbV9zdGFydCB7Ci0JdWludDhfdCBvdXRwdXQyWVdyUG1FbmFibGU7Ci0JdWludDhfdCBvdXRwdXQyQ2JjcldyUG1FbmFibGU7Ci0JdWludDhfdCBvdXRwdXQxWVdyUG1FbmFibGU7Ci0JdWludDhfdCBvdXRwdXQxQ2JjcldyUG1FbmFibGU7Ci19OwotCi1zdHJ1Y3QgIHZmZV9mcmFtZV9za2lwX2NvdW50cyB7Ci0JdWludDMyX3QgIHRvdGFsRnJhbWVDb3VudDsKLQl1aW50MzJfdCAgb3V0cHV0MUNvdW50OwotCXVpbnQzMl90ICBvdXRwdXQyQ291bnQ7Ci19OwotCi1lbnVtIFZGRV9BWElfUkRfVU5QQUNLX0hCSV9TRUwgewotCVZGRV9BWElfUkRfSEJJXzMyX0NMT0NLX0NZQ0xFUywKLQlWRkVfQVhJX1JEX0hCSV82NF9DTE9DS19DWUNMRVMsCi0JVkZFX0FYSV9SRF9IQklfMTI4X0NMT0NLX0NZQ0xFUywKLQlWRkVfQVhJX1JEX0hCSV8yNTZfQ0xPQ0tfQ1lDTEVTLAotCVZGRV9BWElfUkRfSEJJXzUxMl9DTE9DS19DWUNMRVMsCi0JVkZFX0FYSV9SRF9IQklfMTAyNF9DTE9DS19DWUNMRVMsCi0JVkZFX0FYSV9SRF9IQklfMjA0OF9DTE9DS19DWUNMRVMsCi0JVkZFX0FYSV9SRF9IQklfNDA5Nl9DTE9DS19DWUNMRVMKLX07Ci0KLWVudW0gVkZFMzFfTUVTU0FHRV9JRCB7Ci0JTVNHX0lEX1JFU0VUX0FDSywgLyogMCAqLwotCU1TR19JRF9TVEFSVF9BQ0ssCi0JTVNHX0lEX1NUT1BfQUNLLAotCU1TR19JRF9VUERBVEVfQUNLLAotCU1TR19JRF9PVVRQVVRfUCwKLQlNU0dfSURfT1VUUFVUX1QsCi0JTVNHX0lEX09VVFBVVF9TLAotCU1TR19JRF9PVVRQVVRfViwKLQlNU0dfSURfU05BUFNIT1RfRE9ORSwKLQlNU0dfSURfQ09NTU9OLAotCU1TR19JRF9FUE9DSDEsIC8qIDEwICovCi0JTVNHX0lEX0VQT0NIMiwKLQlNU0dfSURfU1lOQ19USU1FUjBfRE9ORSwKLQlNU0dfSURfU1lOQ19USU1FUjFfRE9ORSwKLQlNU0dfSURfU1lOQ19USU1FUjJfRE9ORSwKLQlNU0dfSURfQVNZTkNfVElNRVIwX0RPTkUsCi0JTVNHX0lEX0FTWU5DX1RJTUVSMV9ET05FLAotCU1TR19JRF9BU1lOQ19USU1FUjJfRE9ORSwKLQlNU0dfSURfQVNZTkNfVElNRVIzX0RPTkUsCi0JTVNHX0lEX0FFX09WRVJGTE9XLAotCU1TR19JRF9BRl9PVkVSRkxPVywgLyogMjAgKi8KLQlNU0dfSURfQVdCX09WRVJGTE9XLAotCU1TR19JRF9SU19PVkVSRkxPVywKLQlNU0dfSURfQ1NfT1ZFUkZMT1csCi0JTVNHX0lEX0lISVNUX09WRVJGTE9XLAotCU1TR19JRF9TS0lOX09WRVJGTE9XLAotCU1TR19JRF9BWElfRVJST1IsCi0JTVNHX0lEX0NBTUlGX09WRVJGTE9XLAotCU1TR19JRF9WSU9MQVRJT04sCi0JTVNHX0lEX0NBTUlGX0VSUk9SLAotCU1TR19JRF9CVVNfT1ZFUkZMT1csIC8qIDMwICovCi0JTVNHX0lEX1NPRl9BQ0ssCi0JTVNHX0lEX1NUT1BfUkVDX0FDSywKLX07Ci0KLXN0cnVjdCBzdGF0c19idWZmZXIgewotCXVpbnQ4X3QgYXdiX3ltaW47Ci0JdWludDMyX3QgYWVjOwotCXVpbnQzMl90IGF3YjsKLQl1aW50MzJfdCBhZjsKLQl1aW50MzJfdCBpaGlzdDsKLQl1aW50MzJfdCByczsKLQl1aW50MzJfdCBjczsKLQl1aW50MzJfdCBza2luOwotfTsKLQotc3RydWN0IHZmZV9tc2dfc3RhdHMgewotCXN0cnVjdCBzdGF0c19idWZmZXIgYnVmZjsKLQl1aW50MzJfdCAgICBmcmFtZUNvdW50ZXI7Ci0JdWludDMyX3QgICAgc3RhdHVzX2JpdHM7Ci19OwotCi0KLXN0cnVjdCB2ZmVfZnJhbWVfYnBjX2luZm8gewotCXVpbnQzMl90IGdyZWVuRGVmZWN0UGl4ZWxDb3VudDsKLQl1aW50MzJfdCByZWRCbHVlRGVmZWN0UGl4ZWxDb3VudDsKLX07Ci0KLXN0cnVjdCB2ZmVfZnJhbWVfYXNmX2luZm8gewotCXVpbnQzMl90ICBhc2ZNYXhFZGdlOwotCXVpbnQzMl90ICBhc2ZIYmlDb3VudDsKLX07Ci0KLXN0cnVjdCB2ZmVfbXNnX2NhbWlmX3N0YXR1cyB7Ci0JdWludDhfdCAgY2FtaWZTdGF0ZTsKLQl1aW50MzJfdCBwaXhlbENvdW50OwotCXVpbnQzMl90IGxpbmVDb3VudDsKLX07Ci0KLQotc3RydWN0IHZmZTMxX2lycV9zdGF0dXMgewotCXVpbnQzMl90IHZmZUlycVN0YXR1czA7Ci0JdWludDMyX3QgdmZlSXJxU3RhdHVzMTsKLQl1aW50MzJfdCBjYW1pZlN0YXR1czsKLQl1aW50MzJfdCBkZW1vc2FpY1N0YXR1czsKLQl1aW50MzJfdCBhc2ZNYXhFZGdlOwotCXVpbnQzMl90IHZmZVBpbmdQb25nU3RhdHVzOwotfTsKLQotc3RydWN0IHZmZV9tc2dfb3V0cHV0IHsKLQl1aW50OF90ICAgb3V0cHV0X2lkOwotCXVpbnQzMl90ICBwMF9hZGRyOwotCXVpbnQzMl90ICBwMV9hZGRyOwotCXVpbnQzMl90ICBwMl9hZGRyOwotCXN0cnVjdCB2ZmVfZnJhbWVfYnBjX2luZm8gYnBjSW5mbzsKLQlzdHJ1Y3QgdmZlX2ZyYW1lX2FzZl9pbmZvIGFzZkluZm87Ci0JdWludDMyX3QgIGZyYW1lQ291bnRlcjsKLX07Ci0KLXN0cnVjdCB2ZmVfbWVzc2FnZSB7Ci0JZW51bSBWRkUzMV9NRVNTQUdFX0lEIF9kOwotCXVuaW9uIHsKLQkJc3RydWN0IHZmZV9tc2dfb3V0cHV0ICAgICAgICAgICAgICBtc2dPdXQ7Ci0JCXN0cnVjdCB2ZmVfbXNnX3N0YXRzICAgICAgICAgICAgICAgbXNnU3RhdHM7Ci0JCXN0cnVjdCB2ZmVfbXNnX2NhbWlmX3N0YXR1cyAgICAgICAgbXNnQ2FtaWZFcnJvcjsKLSAgIH0gX3U7Ci19OwotCi0vKiBOZXcgb25lIGZvciA3eDMwICovCi1zdHJ1Y3QgbXNtX3ZmZTMxX2NtZCB7Ci0JaW50MzJfdCAgaWQ7Ci0JdWludDE2X3QgbGVuZ3RoOwotCXZvaWQgICAgICp2YWx1ZTsKLX07Ci0KLSNkZWZpbmUgVjMxX1BSRVZJRVdfQVhJX0ZMQUcgIDB4MDAwMDAwMDEKLSNkZWZpbmUgVjMxX1NOQVBTSE9UX0FYSV9GTEFHICgweDAwMDAwMDAxPDwxKQotCi1zdHJ1Y3QgdmZlMzFfY21kX3R5cGUgewotCXVpbnQxNl90IGlkOwotCXVpbnQzMl90IGxlbmd0aDsKLQl1aW50MzJfdCBvZmZzZXQ7Ci0JdWludDMyX3QgZmxhZzsKLX07Ci0KLXN0cnVjdCB2ZmUzMV9mcmVlX2J1ZiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBub2RlOwotCXVpbnQzMl90IHBhZGRyOwotCXVpbnQzMl90IHBsYW5hcjBfb2ZmOwotCXVpbnQzMl90IHBsYW5hcjFfb2ZmOwotCXVpbnQzMl90IHBsYW5hcjJfb2ZmOwotCXVpbnQzMl90IGNiY3Jfb2ZmOwotfTsKLQotc3RydWN0IHZmZTMxX291dHB1dF9jaCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmcmVlX2J1Zl9oZWFkOwotCXNwaW5sb2NrX3QgZnJlZV9idWZfbG9jazsKLQl1aW50MTZfdCBvdXRwdXRfZm10OwotCWludDhfdCBjaDA7Ci0JaW50OF90IGNoMTsKLQlpbnQ4X3QgY2gyOwotCXVpbnQzMl90ICBmcmFtZV9kcm9wX2NudDsKLX07Ci0KLS8qIG5vIGVycm9yIGlycSBpbiBtYXNrIDAgKi8KLSNkZWZpbmUgVkZFMzFfSU1BU0tfRVJST1JfT05MWV8wICAweDAKLS8qIHdoZW4gbm9ybWFsIGNhc2UsIGRvbid0IHdhbnQgdG8gYmxvY2sgZXJyb3Igc3RhdHVzLiAqLwotLyogYml0IDAtMjEgYXJlIGVycm9yIGlycSBiaXRzICovCi0jZGVmaW5lIFZGRTMxX0lNQVNLX0VSUk9SX09OTFlfMSAgICAgICAgICAgICAgIDB4MDAzRkZGRkYKLSNkZWZpbmUgVkZFMzFfSU1BU0tfQ0FNSUZfRVJST1IgICAgICAgICAgICAgICAoMHgwMDAwMDAwMTw8MCkKLSNkZWZpbmUgVkZFMzFfSU1BU0tfU1RBVFNfQ1NfT1ZXUiAgICAgICAgICAgICAoMHgwMDAwMDAwMTw8MSkKLSNkZWZpbmUgVkZFMzFfSU1BU0tfU1RBVFNfSUhJU1RfT1ZXUiAgICAgICAgICAoMHgwMDAwMDAwMTw8MikKLSNkZWZpbmUgVkZFMzFfSU1BU0tfUkVBTElHTl9CVUZfWV9PVkZMICAgICAgICAoMHgwMDAwMDAwMTw8MykKLSNkZWZpbmUgVkZFMzFfSU1BU0tfUkVBTElHTl9CVUZfQ0JfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8NCkKLSNkZWZpbmUgVkZFMzFfSU1BU0tfUkVBTElHTl9CVUZfQ1JfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8NSkKLSNkZWZpbmUgVkZFMzFfSU1BU0tfVklPTEFUSU9OICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMTw8NikKLSNkZWZpbmUgVkZFMzFfSU1BU0tfSU1HX01BU1RfMF9CVVNfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8NykKLSNkZWZpbmUgVkZFMzFfSU1BU0tfSU1HX01BU1RfMV9CVVNfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8OCkKLSNkZWZpbmUgVkZFMzFfSU1BU0tfSU1HX01BU1RfMl9CVVNfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8OSkKLSNkZWZpbmUgVkZFMzFfSU1BU0tfSU1HX01BU1RfM19CVVNfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8MTApCi0jZGVmaW5lIFZGRTMxX0lNQVNLX0lNR19NQVNUXzRfQlVTX09WRkwgICAgICAgKDB4MDAwMDAwMDE8PDExKQotI2RlZmluZSBWRkUzMV9JTUFTS19JTUdfTUFTVF81X0JVU19PVkZMICAgICAgICgweDAwMDAwMDAxPDwxMikKLSNkZWZpbmUgVkZFMzFfSU1BU0tfSU1HX01BU1RfNl9CVVNfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8MTMpCi0jZGVmaW5lIFZGRTMxX0lNQVNLX1NUQVRTX0FFX0JVU19PVkZMICAgICAgICAgKDB4MDAwMDAwMDE8PDE0KQotI2RlZmluZSBWRkUzMV9JTUFTS19TVEFUU19BRl9CVVNfT1ZGTCAgICAgICAgICgweDAwMDAwMDAxPDwxNSkKLSNkZWZpbmUgVkZFMzFfSU1BU0tfU1RBVFNfQVdCX0JVU19PVkZMICAgICAgICAoMHgwMDAwMDAwMTw8MTYpCi0jZGVmaW5lIFZGRTMxX0lNQVNLX1NUQVRTX1JTX0JVU19PVkZMICAgICAgICAgKDB4MDAwMDAwMDE8PDE3KQotI2RlZmluZSBWRkUzMV9JTUFTS19TVEFUU19DU19CVVNfT1ZGTCAgICAgICAgICgweDAwMDAwMDAxPDwxOCkKLSNkZWZpbmUgVkZFMzFfSU1BU0tfU1RBVFNfSUhJU1RfQlVTX09WRkwgICAgICAoMHgwMDAwMDAwMTw8MTkpCi0jZGVmaW5lIFZGRTMxX0lNQVNLX1NUQVRTX1NLSU5fQlVTX09WRkwgICAgICAgKDB4MDAwMDAwMDE8PDIwKQotI2RlZmluZSBWRkUzMV9JTUFTS19BWElfRVJST1IgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxPDwyMSkKLQotI2RlZmluZSBWRkVfQ09NX1NUQVRVUyAweDAwMEZFMDAwCi0KLXN0cnVjdCB2ZmUzMV9vdXRwdXRfcGF0aCB7Ci0JdWludDE2X3Qgb3V0cHV0X21vZGU7ICAgICAvKiBiaXRtYXNrICAqLwotCi0Jc3RydWN0IHZmZTMxX291dHB1dF9jaCBvdXQwOyAvKiBwcmV2aWV3IGFuZCB0aHVtYm5haWwgKi8KLQlzdHJ1Y3QgdmZlMzFfb3V0cHV0X2NoIG91dDE7IC8qIHNuYXBzaG90ICovCi0Jc3RydWN0IHZmZTMxX291dHB1dF9jaCBvdXQyOyAvKiB2aWRlbyAgICAqLwotfTsKLQotc3RydWN0IHZmZTMxX2ZyYW1lX2V4dHJhIHsKLQl1aW50MzJfdCBncmVlbkRlZmVjdFBpeGVsQ291bnQ7Ci0JdWludDMyX3QgcmVkQmx1ZURlZmVjdFBpeGVsQ291bnQ7Ci0KLQl1aW50MzJfdCAgYXNmTWF4RWRnZTsKLQl1aW50MzJfdCAgYXNmSGJpQ291bnQ7Ci0KLQl1aW50MzJfdCB5V3JQbVN0YXRzMDsKLQl1aW50MzJfdCB5V3JQbVN0YXRzMTsKLQl1aW50MzJfdCBjYmNyV3JQbVN0YXRzMDsKLQl1aW50MzJfdCBjYmNyV3JQbVN0YXRzMTsKLQotCXVpbnQzMl90ICBmcmFtZUNvdW50ZXI7Ci19OwotCi0jZGVmaW5lIFZGRV9ESVNBQkxFX0FMTF9JUlFTICAgICAgICAgICAgIDAKLSNkZWZpbmUgVkZFX0NMRUFSX0FMTF9JUlFTICAgICAgICAgICAgICAgMHhmZmZmZmZmZgotCi0jZGVmaW5lIFZGRV9HTE9CQUxfUkVTRVQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgVkZFX0NHQ19PVkVSUklERSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQwotI2RlZmluZSBWRkVfTU9EVUxFX0NGRyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIFZGRV9DRkdfT0ZGICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTQKLSNkZWZpbmUgVkZFX0lSUV9DTUQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOAotI2RlZmluZSBWRkVfSVJRX01BU0tfMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFDCi0jZGVmaW5lIFZGRV9JUlFfTUFTS18xICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgVkZFX0lSUV9DTEVBUl8wICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyNAotI2RlZmluZSBWRkVfSVJRX0NMRUFSXzEgICAgICAgICAgICAgICAgICAweDAwMDAwMDI4Ci0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTXzAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMkMKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVNfMSAgICAgICAgICAgICAgICAgMHgwMDAwMDAzMAotI2RlZmluZSBWRkVfSVJRX0NPTVBfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMDM0Ci0jZGVmaW5lIFZGRV9CVVNfQ01EICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzgKLSNkZWZpbmUgVkZFX0JVU19QSU5HX1BPTkdfU1RBVFVTICAgICAgICAgMHgwMDAwMDE4MAotI2RlZmluZSBWRkVfQlVTX09QRVJBVElPTl9TVEFUVVMgICAgICAgICAweDAwMDAwMTg0Ci0KLSNkZWZpbmUgVkZFX0JVU19JTUFHRV9NQVNURVJfMF9XUl9QTV9TVEFUU18wICAgICAgICAweDAwMDAwMTkwCi0jZGVmaW5lIFZGRV9CVVNfSU1BR0VfTUFTVEVSXzBfV1JfUE1fU1RBVFNfMSAgICAgICAgMHgwMDAwMDE5NAotCi0jZGVmaW5lIFZGRV9BWElfQ01EICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxRDgKLSNkZWZpbmUgVkZFX0FYSV9TVEFUVVMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDFEQwotI2RlZmluZSBWRkVfQlVTX1NUQVRTX1BJTkdfUE9OR19CQVNFICAgICAweDAwMDAwMEY0Ci0KLSNkZWZpbmUgVkZFX0JVU19TVEFUU19BRUNfV1JfUElOR19BRERSICAgMHgwMDAwMDBGNAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0FFQ19XUl9QT05HX0FERFIgICAweDAwMDAwMEY4Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQUVDX1VCX0NGRyAgICAgICAgIDB4MDAwMDAwRkMKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19BRl9XUl9QSU5HX0FERFIgICAgMHgwMDAwMDEwMAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0FGX1dSX1BPTkdfQUREUiAgICAweDAwMDAwMTA0Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQUZfVUJfQ0ZHICAgICAgICAgIDB4MDAwMDAxMDgKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19BV0JfV1JfUElOR19BRERSICAgMHgwMDAwMDEwQwotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0FXQl9XUl9QT05HX0FERFIgICAweDAwMDAwMTEwCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQVdCX1VCX0NGRyAgICAgICAgIDB4MDAwMDAxMTQKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19SU19XUl9QSU5HX0FERFIgICAgMHgwMDAwMDExOAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX1JTX1dSX1BPTkdfQUREUiAgICAweDAwMDAwMTFDCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfUlNfVUJfQ0ZHICAgICAgICAgIDB4MDAwMDAxMjAKLQotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0NTX1dSX1BJTkdfQUREUiAgICAweDAwMDAwMTI0Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQ1NfV1JfUE9OR19BRERSICAgIDB4MDAwMDAxMjgKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19DU19VQl9DRkcgICAgICAgICAgMHgwMDAwMDEyQwotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0hJU1RfV1JfUElOR19BRERSICAweDAwMDAwMTMwCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfSElTVF9XUl9QT05HX0FERFIgIDB4MDAwMDAxMzQKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19ISVNUX1VCX0NGRyAgICAgICAgMHgwMDAwMDEzOAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX1NLSU5fV1JfUElOR19BRERSICAweDAwMDAwMTNDCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfU0tJTl9XUl9QT05HX0FERFIgIDB4MDAwMDAxNDAKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19TS0lOX1VCX0NGRyAgICAgICAgMHgwMDAwMDE0NAotI2RlZmluZSBWRkVfQlVTX1BNX0NNRCAgICAgICAgICAgICAgICAgICAweDAwMDAwMTg4Ci0jZGVmaW5lIFZGRV9CVVNfUE1fQ0ZHICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxOEMKLSNkZWZpbmUgVkZFX0NBTUlGX0NPTU1BTkQgICAgICAgICAgICAgICAgMHgwMDAwMDFFMAotI2RlZmluZSBWRkVfQ0FNSUZfU1RBVFVTICAgICAgICAgICAgICAgICAweDAwMDAwMjA0Ci0jZGVmaW5lIFZGRV9SRUdfVVBEQVRFX0NNRCAgICAgICAgICAgICAgIDB4MDAwMDAyNjAKLSNkZWZpbmUgVkZFX0RFTVVYX0dBSU5fMCAgICAgICAgICAgICAgICAgMHgwMDAwMDI4OAotI2RlZmluZSBWRkVfREVNVVhfR0FJTl8xICAgICAgICAgICAgICAgICAweDAwMDAwMjhDCi0jZGVmaW5lIFZGRV9DSFJPTUFfVVAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzNUMKLSNkZWZpbmUgVkZFX0ZSQU1FRFJPUF9FTkNfWV9DRkcgICAgICAgICAgMHgwMDAwMDUwNAotI2RlZmluZSBWRkVfRlJBTUVEUk9QX0VOQ19DQkNSX0NGRyAgICAgICAweDAwMDAwNTA4Ci0jZGVmaW5lIFZGRV9GUkFNRURST1BfRU5DX1lfUEFUVEVSTiAgICAgIDB4MDAwMDA1MEMKLSNkZWZpbmUgVkZFX0ZSQU1FRFJPUF9FTkNfQ0JDUl9QQVRURVJOICAgMHgwMDAwMDUxMAotI2RlZmluZSBWRkVfRlJBTUVEUk9QX1ZJRVdfWSAgICAgICAgICAgICAweDAwMDAwNTE0Ci0jZGVmaW5lIFZGRV9GUkFNRURST1BfVklFV19DQkNSICAgICAgICAgIDB4MDAwMDA1MTgKLSNkZWZpbmUgVkZFX0ZSQU1FRFJPUF9WSUVXX1lfUEFUVEVSTiAgICAgMHgwMDAwMDUxQwotI2RlZmluZSBWRkVfRlJBTUVEUk9QX1ZJRVdfQ0JDUl9QQVRURVJOICAweDAwMDAwNTIwCi0jZGVmaW5lIFZGRV9DTEFNUF9NQVggICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MjQKLSNkZWZpbmUgVkZFX0NMQU1QX01JTiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUyOAotI2RlZmluZSBWRkVfUkVBTElHTl9CVUYgICAgICAgICAgICAgICAgICAweDAwMDAwNTJDCi0jZGVmaW5lIFZGRV9TVEFUU19DRkcgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MzAKLSNkZWZpbmUgVkZFX1NUQVRTX0FXQl9TR1dfQ0ZHICAgICAgICAgICAgMHgwMDAwMDU1NAotI2RlZmluZSBWRkVfRE1JX0NGRyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTk4Ci0jZGVmaW5lIFZGRV9ETUlfQUREUiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1OUMKLSNkZWZpbmUgVkZFX0RNSV9EQVRBX0xPICAgICAgICAgICAgICAgICAgMHgwMDAwMDVBNAotI2RlZmluZSBWRkVfQVhJX0NGRyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjAwCi0KLXN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCB7Ci0JdWludDhfdCAgYWNrUGVuZGluZzsKLQl1aW50MzJfdCBuZXh0RnJhbWVBZGRyQnVmOwotCXVpbnQzMl90IGRyb3BwZWRTdGF0c0ZyYW1lQ291bnQ7Ci0JdWludDMyX3QgYnVmVG9SZW5kZXI7Ci19OwotCi1zdHJ1Y3QgdmZlMzFfY3RybF90eXBlIHsKLQl1aW50MTZfdCBvcGVyYXRpb25fbW9kZTsgICAgIC8qIHN0cmVhbWluZyBvciBzbmFwc2hvdCAqLwotCXN0cnVjdCB2ZmUzMV9vdXRwdXRfcGF0aCBvdXRwYXRoOwotCi0JdWludDMyX3QgdmZlSW1hc2tDb21wb3NpdGVQYWNrZWQ7Ci0KLQlzcGlubG9ja190ICB1cGRhdGVfYWNrX2xvY2s7Ci0Jc3BpbmxvY2tfdCAgaW9fbG9jazsKLQotCWludDhfdCBhZWNfYWNrX3BlbmRpbmc7Ci0JaW50OF90IGF3Yl9hY2tfcGVuZGluZzsKLQlpbnQ4X3QgYWZfYWNrX3BlbmRpbmc7Ci0JaW50OF90IGloaXN0X2Fja19wZW5kaW5nOwotCWludDhfdCByc19hY2tfcGVuZGluZzsKLQlpbnQ4X3QgY3NfYWNrX3BlbmRpbmc7Ci0KLQlzdHJ1Y3QgbXNtX3ZmZV9jYWxsYmFjayAqcmVzcDsKLQl1aW50MzJfdCBleHRsZW47Ci0Jdm9pZCAqZXh0ZGF0YTsKLQotCWludDhfdCBzdGFydF9hY2tfcGVuZGluZzsKLQlhdG9taWNfdCBzdG9wX2Fja19wZW5kaW5nOwotCWludDhfdCByZXNldF9hY2tfcGVuZGluZzsKLQlpbnQ4X3QgdXBkYXRlX2Fja19wZW5kaW5nOwotCWVudW0gdmZlX3JlY29yZGluZ19zdGF0ZSByZWNvcmRpbmdfc3RhdGU7Ci0JaW50OF90IG91dHB1dDBfYXZhaWxhYmxlOwotCWludDhfdCBvdXRwdXQxX2F2YWlsYWJsZTsKLQlpbnQ4X3QgdXBkYXRlX2dhbW1hOwotCWludDhfdCB1cGRhdGVfbHVtYTsKLQlzcGlubG9ja190ICB0YXNrbGV0X2xvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCB0YXNrbGV0X3E7Ci0JaW50IHZmZWlycTsKLQl2b2lkIF9faW9tZW0gKnZmZWJhc2U7Ci0Jdm9pZCAqc3luY2RhdGE7Ci0KLQlzdHJ1Y3QgcmVzb3VyY2UJKnZmZW1lbTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnZmZWlvOwotCi0JdWludDMyX3Qgc3RhdHNfY29tcDsKLQl1aW50MzJfdCBoZnJfbW9kZTsKLQlhdG9taWNfdCB2c3RhdGU7Ci0JdWludDMyX3QgdmZlX2NhcHR1cmVfY291bnQ7Ci0JdWludDMyX3Qgc3luY190aW1lcl9yZXBlYXRfY291bnQ7Ci0JdWludDMyX3Qgc3luY190aW1lcl9zdGF0ZTsKLQl1aW50MzJfdCBzeW5jX3RpbWVyX251bWJlcjsKLQotCXVpbnQzMl90IHZmZUZyYW1lSWQ7Ci0JdWludDMyX3Qgb3V0cHV0MVBhdHRlcm47Ci0JdWludDMyX3Qgb3V0cHV0MVBlcmlvZDsKLQl1aW50MzJfdCBvdXRwdXQyUGF0dGVybjsKLQl1aW50MzJfdCBvdXRwdXQyUGVyaW9kOwotCXVpbnQzMl90IHZmZUZyYW1lU2tpcENvdW50OwotCXVpbnQzMl90IHZmZUZyYW1lU2tpcFBlcmlvZDsKLQl1aW50MzJfdCBzdGF0dXNfYml0czsKLQlzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wgYWZTdGF0c0NvbnRyb2w7Ci0Jc3RydWN0IHZmZV9zdGF0c19jb250cm9sIGF3YlN0YXRzQ29udHJvbDsKLQlzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wgYWVjU3RhdHNDb250cm9sOwotCXN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCBpaGlzdFN0YXRzQ29udHJvbDsKLQlzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wgcnNTdGF0c0NvbnRyb2w7Ci0Jc3RydWN0IHZmZV9zdGF0c19jb250cm9sIGNzU3RhdHNDb250cm9sOwotCXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpzX2luZm87Ci0Jc3RydWN0IHZmZV9tZXNzYWdlIHZNc2dIb2xkX1NuYXA7Ci0Jc3RydWN0IHZmZV9tZXNzYWdlIHZNc2dIb2xkX1RodW1iOwotCWludDhfdCB4YmFyX3VwZGF0ZV9wZW5kaW5nOwotCXVpbnQzMl90IHhiYXJfY2ZnWzJdOwotCXNwaW5sb2NrX3QgeGJhcl9sb2NrOwotCXVpbnQzMl90IHdoaWxlX3N0b3BwaW5nX21hc2s7Ci19OwotCi0jZGVmaW5lIHN0YXRzQWVOdW0gICAgICAwCi0jZGVmaW5lIHN0YXRzQWZOdW0gICAgICAxCi0jZGVmaW5lIHN0YXRzQXdiTnVtICAgICAyCi0jZGVmaW5lIHN0YXRzUnNOdW0gICAgICAzCi0jZGVmaW5lIHN0YXRzQ3NOdW0gICAgICA0Ci0jZGVmaW5lIHN0YXRzSWhpc3ROdW0gICA1Ci0jZGVmaW5lIHN0YXRzU2tpbk51bSAgICA2Ci0KLXN0cnVjdCB2ZmVfY21kX3N0YXRzX2Fja3sKLSAgdWludDMyX3QgIG5leHRTdGF0c0J1ZjsKLX07Ci0KLSNkZWZpbmUgVkZFX1NUQVRTX0JVRkZFUl9DT1VOVCAgICAgICAgICAgIDMKLQotc3RydWN0IHZmZV9jbWRfc3RhdHNfYnVmewotICAgdWludDMyX3Qgc3RhdHNCdWZbVkZFX1NUQVRTX0JVRkZFUl9DT1VOVF07Ci19OwotI2VuZGlmIC8qIF9fTVNNX1ZGRTMxX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlMzFfdjRsMi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlMzFfdjRsMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGRkZDRiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTMxX3Y0bDIuYworKysgL2Rldi9udWxsCkBAIC0xLDQyNDEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxtYWNoL2Nsay5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9pc3AuaD4KLQotI2luY2x1ZGUgIm1zbS5oIgotI2luY2x1ZGUgIm1zbV92ZmUzMV92NGwyLmgiCi0KLWF0b21pY190IGlycV9jbnQ7Ci0KLSNkZWZpbmUgQlVGRl9TSVpFXzEyOCAxMjgKLQotI2RlZmluZSBWRkUzMV9BWElfT0ZGU0VUIDB4MDA1MAotI2RlZmluZSB2ZmUzMV9nZXRfY2hfcGluZ19hZGRyKGNobikgXAotCShtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArIDB4MDA1MCArIDB4MTggKiAoY2huKSkpCi0jZGVmaW5lIHZmZTMxX2dldF9jaF9wb25nX2FkZHIoY2huKSBcCi0JKG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsgMHgwMDUwICsgMHgxOCAqIChjaG4pICsgNCkpCi0jZGVmaW5lIHZmZTMxX2dldF9jaF9hZGRyKHBpbmdfcG9uZywgY2huKSBcCi0JKCgocGluZ19wb25nKSAmICgxIDw8IChjaG4pKSkgPT0gMCA/IFwKLQl2ZmUzMV9nZXRfY2hfcG9uZ19hZGRyKGNobikgOiB2ZmUzMV9nZXRfY2hfcGluZ19hZGRyKGNobikpCi0KLSNkZWZpbmUgdmZlMzFfcHV0X2NoX3BpbmdfYWRkcihjaG4sIGFkZHIpIFwKLQkobXNtX2NhbWVyYV9pb193KChhZGRyKSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIDB4MDA1MCArIDB4MTggKiAoY2huKSkpCi0jZGVmaW5lIHZmZTMxX3B1dF9jaF9wb25nX2FkZHIoY2huLCBhZGRyKSBcCi0JKG1zbV9jYW1lcmFfaW9fdygoYWRkciksIFwKLQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgMHgwMDUwICsgMHgxOCAqIChjaG4pICsgNCkpCi0jZGVmaW5lIHZmZTMxX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywgY2huLCBhZGRyKSBcCi0JKCgocGluZ19wb25nKSAmICgxIDw8IChjaG4pKSkgPT0gMCA/ICAgXAotCXZmZTMxX3B1dF9jaF9wb25nX2FkZHIoKGNobiksIChhZGRyKSkgOiBcCi0JdmZlMzFfcHV0X2NoX3BpbmdfYWRkcigoY2huKSwgKGFkZHIpKSkKLQotI2RlZmluZSBWRkVfQ0xLX1JBVEUJMTUzNjAwMDAwCi0jZGVmaW5lIENBTUlGX0NGR19STVNLICAgICAgICAgICAgIDB4MWZmZmZmCi0KLXN0YXRpYyBzdHJ1Y3QgdmZlMzFfY3RybF90eXBlICp2ZmUzMV9jdHJsOwotc3RhdGljIHVpbnQzMl90IHZmZV9jbGtfcmF0ZTsKLQotc3RydWN0IHZmZTMxX2lzcl9xdWV1ZV9jbWQgewotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQl1aW50MzJfdAkJdmZlSW50ZXJydXB0U3RhdHVzMDsKLQl1aW50MzJfdAkJdmZlSW50ZXJydXB0U3RhdHVzMTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdmZlMzFfY21kX3R5cGUgdmZlMzFfY21kW10gPSB7Ci0vKiAwKi8Je1ZGRV9DTURfRFVNTVlfMH0sCi0JCXtWRkVfQ01EX1NFVF9DTEt9LAotCQl7VkZFX0NNRF9SRVNFVH0sCi0JCXtWRkVfQ01EX1NUQVJUfSwKLQkJe1ZGRV9DTURfVEVTVF9HRU5fU1RBUlR9LAotLyogNSovCXtWRkVfQ01EX09QRVJBVElPTl9DRkcsIFYzMV9PUEVSQVRJT05fQ0ZHX0xFTn0sCi0JCXtWRkVfQ01EX0FYSV9PVVRfQ0ZHLCBWMzFfQVhJX09VVF9MRU4sIFYzMV9BWElfT1VUX09GRiwgMHhGRn0sCi0JCXtWRkVfQ01EX0NBTUlGX0NGRywgVjMxX0NBTUlGX0xFTiwgVjMxX0NBTUlGX09GRiwgMHhGRn0sCi0JCXtWRkVfQ01EX0FYSV9JTlBVVF9DRkd9LAotCQl7VkZFX0NNRF9CTEFDS19MRVZFTF9DRkcsIFYzMV9CTEFDS19MRVZFTF9MRU4sCi0JCVYzMV9CTEFDS19MRVZFTF9PRkYsCi0JCTB4RkZ9LAotLyoxMCovICB7VkZFX0NNRF9NRVNIX1JPTExfT0ZGX0NGRywgVjMxX01FU0hfUk9MTF9PRkZfQ0ZHX0xFTiwKLQkJVjMxX01FU0hfUk9MTF9PRkZfQ0ZHX09GRiwgMHhGRn0sCi0JCXtWRkVfQ01EX0RFTVVYX0NGRywgVjMxX0RFTVVYX0xFTiwgVjMxX0RFTVVYX09GRiwgMHhGRn0sCi0JCXtWRkVfQ01EX0ZPVl9DRkcsIFYzMV9GT1ZfTEVOLCBWMzFfRk9WX09GRiwgMHhGRn0sCi0JCXtWRkVfQ01EX01BSU5fU0NBTEVSX0NGRywgVjMxX01BSU5fU0NBTEVSX0xFTiwKLQkJVjMxX01BSU5fU0NBTEVSX09GRiwgMHhGRn0sCi0JCXtWRkVfQ01EX1dCX0NGRywgVjMxX1dCX0xFTiwgVjMxX1dCX09GRiwgMHhGRn0sCi0vKjE1Ki8Je1ZGRV9DTURfQ09MT1JfQ09SX0NGRywgVjMxX0NPTE9SX0NPUl9MRU4sIFYzMV9DT0xPUl9DT1JfT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfUkdCX0dfQ0ZHLCBWMzFfUkdCX0dfTEVOLCBWMzFfUkdCX0dfT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfTEFfQ0ZHLCBWMzFfTEFfTEVOLCBWMzFfTEFfT0ZGLCAweEZGIH0sCi0JCXtWRkVfQ01EX0NIUk9NQV9FTl9DRkcsIFYzMV9DSFJPTUFfRU5fTEVOLCBWMzFfQ0hST01BX0VOX09GRiwKLQkJMHhGRn0sCi0JCXtWRkVfQ01EX0NIUk9NQV9TVVBfQ0ZHLCBWMzFfQ0hST01BX1NVUF9MRU4sIFYzMV9DSFJPTUFfU1VQX09GRiwKLQkJMHhGRn0sCi0vKjIwKi8Je1ZGRV9DTURfTUNFX0NGRywgVjMxX01DRV9MRU4sIFYzMV9NQ0VfT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfU0tfRU5IQU5fQ0ZHLCBWMzFfU0NFX0xFTiwgVjMxX1NDRV9PRkYsIDB4RkZ9LAotCQl7VkZFX0NNRF9BU0ZfQ0ZHLCBWMzFfQVNGX0xFTiwgVjMxX0FTRl9PRkYsIDB4RkZ9LAotCQl7VkZFX0NNRF9TMllfQ0ZHLCBWMzFfUzJZX0xFTiwgVjMxX1MyWV9PRkYsIDB4RkZ9LAotCQl7VkZFX0NNRF9TMkNiQ3JfQ0ZHLCBWMzFfUzJDYkNyX0xFTiwgVjMxX1MyQ2JDcl9PRkYsIDB4RkZ9LAotLyoyNSovCXtWRkVfQ01EX0NIUk9NQV9TVUJTX0NGRywgVjMxX0NIUk9NQV9TVUJTX0xFTiwgVjMxX0NIUk9NQV9TVUJTX09GRiwKLQkJMHhGRn0sCi0JCXtWRkVfQ01EX09VVF9DTEFNUF9DRkcsIFYzMV9PVVRfQ0xBTVBfTEVOLCBWMzFfT1VUX0NMQU1QX09GRiwKLQkJMHhGRn0sCi0JCXtWRkVfQ01EX0ZSQU1FX1NLSVBfQ0ZHLCBWMzFfRlJBTUVfU0tJUF9MRU4sIFYzMV9GUkFNRV9TS0lQX09GRiwKLQkJMHhGRn0sCi0JCXtWRkVfQ01EX0RVTU1ZXzF9LAotCQl7VkZFX0NNRF9EVU1NWV8yfSwKLS8qMzAqLwl7VkZFX0NNRF9EVU1NWV8zfSwKLQkJe1ZGRV9DTURfVVBEQVRFfSwKLQkJe1ZGRV9DTURfQkxfTFZMX1VQREFURSwgVjMxX0JMQUNLX0xFVkVMX0xFTiwKLQkJVjMxX0JMQUNLX0xFVkVMX09GRiwgMHhGRn0sCi0JCXtWRkVfQ01EX0RFTVVYX1VQREFURSwgVjMxX0RFTVVYX0xFTiwgVjMxX0RFTVVYX09GRiwgMHhGRn0sCi0JCXtWRkVfQ01EX0ZPVl9VUERBVEUsIFYzMV9GT1ZfTEVOLCBWMzFfRk9WX09GRiwgMHhGRn0sCi0vKjM1Ki8Je1ZGRV9DTURfTUFJTl9TQ0FMRVJfVVBEQVRFLCBWMzFfTUFJTl9TQ0FMRVJfTEVOLCBWMzFfTUFJTl9TQ0FMRVJfT0ZGLAotCQkweEZGfSwKLQkJe1ZGRV9DTURfV0JfVVBEQVRFLCBWMzFfV0JfTEVOLCBWMzFfV0JfT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfQ09MT1JfQ09SX1VQREFURSwgVjMxX0NPTE9SX0NPUl9MRU4sIFYzMV9DT0xPUl9DT1JfT0ZGLAotCQkweEZGfSwKLQkJe1ZGRV9DTURfUkdCX0dfVVBEQVRFLCBWMzFfUkdCX0dfTEVOLCBWMzFfQ0hST01BX0VOX09GRiwgMHhGRn0sCi0JCXtWRkVfQ01EX0xBX1VQREFURSwgVjMxX0xBX0xFTiwgVjMxX0xBX09GRiwgMHhGRiB9LAotLyo0MCovCXtWRkVfQ01EX0NIUk9NQV9FTl9VUERBVEUsIFYzMV9DSFJPTUFfRU5fTEVOLCBWMzFfQ0hST01BX0VOX09GRiwKLQkJMHhGRn0sCi0JCXtWRkVfQ01EX0NIUk9NQV9TVVBfVVBEQVRFLCBWMzFfQ0hST01BX1NVUF9MRU4sCi0JCVYzMV9DSFJPTUFfU1VQX09GRiwgMHhGRn0sCi0JCXtWRkVfQ01EX01DRV9VUERBVEUsIFYzMV9NQ0VfTEVOLCBWMzFfTUNFX09GRiwgMHhGRn0sCi0JCXtWRkVfQ01EX1NLX0VOSEFOX1VQREFURSwgVjMxX1NDRV9MRU4sIFYzMV9TQ0VfT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfUzJDYkNyX1VQREFURSwgVjMxX1MyQ2JDcl9MRU4sIFYzMV9TMkNiQ3JfT0ZGLCAweEZGfSwKLS8qNDUqLwl7VkZFX0NNRF9TMllfVVBEQVRFLCBWMzFfUzJZX0xFTiwgVjMxX1MyWV9PRkYsIDB4RkZ9LAotCQl7VkZFX0NNRF9BU0ZfVVBEQVRFLCBWMzFfQVNGX1VQREFURV9MRU4sIFYzMV9BU0ZfT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfRlJBTUVfU0tJUF9VUERBVEV9LAotCQl7VkZFX0NNRF9DQU1JRl9GUkFNRV9VUERBVEV9LAotCQl7VkZFX0NNRF9TVEFUU19BRl9VUERBVEUsIFYzMV9TVEFUU19BRl9MRU4sIFYzMV9TVEFUU19BRl9PRkZ9LAotLyo1MCovCXtWRkVfQ01EX1NUQVRTX0FFX1VQREFURSwgVjMxX1NUQVRTX0FFX0xFTiwgVjMxX1NUQVRTX0FFX09GRn0sCi0JCXtWRkVfQ01EX1NUQVRTX0FXQl9VUERBVEUsIFYzMV9TVEFUU19BV0JfTEVOLAotCQlWMzFfU1RBVFNfQVdCX09GRn0sCi0JCXtWRkVfQ01EX1NUQVRTX1JTX1VQREFURSwgVjMxX1NUQVRTX1JTX0xFTiwgVjMxX1NUQVRTX1JTX09GRn0sCi0JCXtWRkVfQ01EX1NUQVRTX0NTX1VQREFURSwgVjMxX1NUQVRTX0NTX0xFTiwgVjMxX1NUQVRTX0NTX09GRn0sCi0JCXtWRkVfQ01EX1NUQVRTX1NLSU5fVVBEQVRFfSwKLS8qNTUqLwl7VkZFX0NNRF9TVEFUU19JSElTVF9VUERBVEUsIFYzMV9TVEFUU19JSElTVF9MRU4sIFYzMV9TVEFUU19JSElTVF9PRkZ9LAotCQl7VkZFX0NNRF9EVU1NWV80fSwKLQkJe1ZGRV9DTURfRVBPQ0gxX0FDS30sCi0JCXtWRkVfQ01EX0VQT0NIMl9BQ0t9LAotCQl7VkZFX0NNRF9TVEFSVF9SRUNPUkRJTkd9LAotLyo2MCovCXtWRkVfQ01EX1NUT1BfUkVDT1JESU5HfSwKLQkJe1ZGRV9DTURfRFVNTVlfNX0sCi0JCXtWRkVfQ01EX0RVTU1ZXzZ9LAotCQl7VkZFX0NNRF9DQVBUVVJFLCBWMzFfQ0FQVFVSRV9MRU4sIDB4RkZ9LAotCQl7VkZFX0NNRF9EVU1NWV83fSwKLS8qNjUqLwl7VkZFX0NNRF9TVE9QfSwKLQkJe1ZGRV9DTURfR0VUX0hXX1ZFUlNJT04sIFYzMV9HRVRfSFdfVkVSU0lPTl9MRU4sCi0JCVYzMV9HRVRfSFdfVkVSU0lPTl9PRkZ9LAotCQl7VkZFX0NNRF9HRVRfRlJBTUVfU0tJUF9DT1VOVFN9LAotCQl7VkZFX0NNRF9PVVRQVVQxX0JVRkZFUl9FTlF9LAotCQl7VkZFX0NNRF9PVVRQVVQyX0JVRkZFUl9FTlF9LAotLyo3MCovCXtWRkVfQ01EX09VVFBVVDNfQlVGRkVSX0VOUX0sCi0JCXtWRkVfQ01EX0pQRUdfT1VUX0JVRl9FTlF9LAotCQl7VkZFX0NNRF9SQVdfT1VUX0JVRl9FTlF9LAotCQl7VkZFX0NNRF9SQVdfSU5fQlVGX0VOUX0sCi0JCXtWRkVfQ01EX1NUQVRTX0FGX0VOUX0sCi0vKjc1Ki8Je1ZGRV9DTURfU1RBVFNfQUVfRU5RfSwKLQkJe1ZGRV9DTURfU1RBVFNfQVdCX0VOUX0sCi0JCXtWRkVfQ01EX1NUQVRTX1JTX0VOUX0sCi0JCXtWRkVfQ01EX1NUQVRTX0NTX0VOUX0sCi0JCXtWRkVfQ01EX1NUQVRTX1NLSU5fRU5RfSwKLS8qODAqLwl7VkZFX0NNRF9TVEFUU19JSElTVF9FTlF9LAotCQl7VkZFX0NNRF9EVU1NWV84fSwKLQkJe1ZGRV9DTURfSlBFR19FTkNfQ0ZHfSwKLQkJe1ZGRV9DTURfRFVNTVlfOX0sCi0JCXtWRkVfQ01EX1NUQVRTX0FGX1NUQVJULCBWMzFfU1RBVFNfQUZfTEVOLCBWMzFfU1RBVFNfQUZfT0ZGfSwKLS8qODUqLwl7VkZFX0NNRF9TVEFUU19BRl9TVE9QfSwKLQkJe1ZGRV9DTURfU1RBVFNfQUVfU1RBUlQsIFYzMV9TVEFUU19BRV9MRU4sIFYzMV9TVEFUU19BRV9PRkZ9LAotCQl7VkZFX0NNRF9TVEFUU19BRV9TVE9QfSwKLQkJe1ZGRV9DTURfU1RBVFNfQVdCX1NUQVJULCBWMzFfU1RBVFNfQVdCX0xFTiwgVjMxX1NUQVRTX0FXQl9PRkZ9LAotCQl7VkZFX0NNRF9TVEFUU19BV0JfU1RPUH0sCi0vKjkwKi8Je1ZGRV9DTURfU1RBVFNfUlNfU1RBUlQsIFYzMV9TVEFUU19SU19MRU4sIFYzMV9TVEFUU19SU19PRkZ9LAotCQl7VkZFX0NNRF9TVEFUU19SU19TVE9QfSwKLQkJe1ZGRV9DTURfU1RBVFNfQ1NfU1RBUlQsIFYzMV9TVEFUU19DU19MRU4sIFYzMV9TVEFUU19DU19PRkZ9LAotCQl7VkZFX0NNRF9TVEFUU19DU19TVE9QfSwKLQkJe1ZGRV9DTURfU1RBVFNfU0tJTl9TVEFSVH0sCi0vKjk1Ki8Je1ZGRV9DTURfU1RBVFNfU0tJTl9TVE9QfSwKLQkJe1ZGRV9DTURfU1RBVFNfSUhJU1RfU1RBUlQsCi0JCVYzMV9TVEFUU19JSElTVF9MRU4sIFYzMV9TVEFUU19JSElTVF9PRkZ9LAotCQl7VkZFX0NNRF9TVEFUU19JSElTVF9TVE9QfSwKLQkJe1ZGRV9DTURfRFVNTVlfMTB9LAotCQl7VkZFX0NNRF9TWU5DX1RJTUVSX1NFVFRJTkcsIFYzMV9TWU5DX1RJTUVSX0xFTiwKLQkJCVYzMV9TWU5DX1RJTUVSX09GRn0sCi0vKjEwMCovCXtWRkVfQ01EX0FTWU5DX1RJTUVSX1NFVFRJTkcsIFYzMV9BU1lOQ19USU1FUl9MRU4sIFYzMV9BU1lOQ19USU1FUl9PRkZ9LAotCQl7VkZFX0NNRF9MSVZFU0hPVH0sCi0JCXtWRkVfQ01EX0xBX1NFVFVQfSwKLQkJe1ZGRV9DTURfTElORUFSSVpBVElPTl9DRkd9LAotCQl7VkZFX0NNRF9ERU1PU0FJQ1YzfSwKLS8qMTA1Ki8Je1ZGRV9DTURfREVNT1NBSUNWM19BQkNDX0NGR30sCi0Je1ZGRV9DTURfREVNT1NBSUNWM19EQkNDX0NGR30sCi0JCXtWRkVfQ01EX0RFTU9TQUlDVjNfREJQQ19DRkcsIFYzMV9ERU1PU0FJQ1YzX0RCUENfTEVOLAotCQkJVjMxX0RFTU9TQUlDVjNfREJQQ19DRkdfT0ZGfSwKLQkJe1ZGRV9DTURfREVNT1NBSUNWM19BQkZfQ0ZHLCBWMzFfREVNT1NBSUNWM19BQkZfTEVOLAotCQkJVjMxX0RFTU9TQUlDVjNfQUJGX09GRn0sCi0JCXtWRkVfQ01EX0RFTU9TQUlDVjNfQUJDQ19VUERBVEV9LAotLyoxMTAqLwl7VkZFX0NNRF9ERU1PU0FJQ1YzX0RCQ0NfVVBEQVRFfSwKLQkJe1ZGRV9DTURfREVNT1NBSUNWM19EQlBDX1VQREFURSwgVjMxX0RFTU9TQUlDVjNfREJQQ19MRU4sCi0JCQlWMzFfREVNT1NBSUNWM19EQlBDX0NGR19PRkZ9LAotCQl7VkZFX0NNRF9YQkFSX0NGR30sCi0JCXtWRkVfQ01EX01PRFVMRV9DRkcsIFYzMV9NT0RVTEVfQ0ZHX0xFTiwgVjMxX01PRFVMRV9DRkdfT0ZGfSwKLQkJe1ZGRV9DTURfWlNMfSwKLS8qMTE1Ki8Je1ZGRV9DTURfTElORUFSSVpBVElPTl9VUERBVEV9LAotCQl7VkZFX0NNRF9ERU1PU0FJQ1YzX0FCRl9VUERBVEUsIFYzMV9ERU1PU0FJQ1YzX0FCRl9MRU4sCi0JCQlWMzFfREVNT1NBSUNWM19BQkZfT0ZGfSwKLQkJe1ZGRV9DTURfQ0xGX0NGR30sCi0JCXtWRkVfQ01EX0NMRl9MVU1BX1VQREFURX0sCi0JCXtWRkVfQ01EX0NMRl9DSFJPTUFfVVBEQVRFfSwKLS8qMTIwKi8ge1ZGRV9DTURfUENBX1JPTExfT0ZGX0NGR30sCi0JCXtWRkVfQ01EX1BDQV9ST0xMX09GRl9VUERBVEV9LAotCQl7VkZFX0NNRF9HRVRfUkVHX0RVTVB9LAotCQl7VkZFX0NNRF9HRVRfTElORUFSSVpBVE9OX1RBQkxFfSwKLQkJe1ZGRV9DTURfR0VUX01FU0hfUk9MTE9GRl9UQUJMRX0sCi0vKjEyNSovIHtWRkVfQ01EX0dFVF9QQ0FfUk9MTE9GRl9UQUJMRX0sCi0JCXtWRkVfQ01EX0dFVF9SR0JfR19UQUJMRX0sCi0JCXtWRkVfQ01EX0dFVF9MQV9UQUJMRX0sCi0JCXtWRkVfQ01EX0RFTU9TQUlDVjNfVVBEQVRFfSwKLX07Ci0KLXVpbnQzMl90IHZmZTMxX0FYSV9XTV9DRkdbXSA9IHsKLQkweDAwMDAwMDRDLAotCTB4MDAwMDAwNjQsCi0JMHgwMDAwMDA3QywKLQkweDAwMDAwMDk0LAotCTB4MDAwMDAwQUMsCi0JMHgwMDAwMDBDNCwKLQkweDAwMDAwMERDLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2ZmUzMV9nZW5lcmFsX2NtZFtdID0gewotCSJEVU1NWV8wIiwgIC8qIDAgKi8KLQkiU0VUX0NMSyIsCi0JIlJFU0VUIiwKLQkiU1RBUlQiLAotCSJURVNUX0dFTl9TVEFSVCIsCi0JIk9QRVJBVElPTl9DRkciLCAgLyogNSAqLwotCSJBWElfT1VUX0NGRyIsCi0JIkNBTUlGX0NGRyIsCi0JIkFYSV9JTlBVVF9DRkciLAotCSJCTEFDS19MRVZFTF9DRkciLAotCSJST0xMX09GRl9DRkciLCAgLyogMTAgKi8KLQkiREVNVVhfQ0ZHIiwKLQkiRk9WX0NGRyIsCi0JIk1BSU5fU0NBTEVSX0NGRyIsCi0JIldCX0NGRyIsCi0JIkNPTE9SX0NPUl9DRkciLCAvKiAxNSAqLwotCSJSR0JfR19DRkciLAotCSJMQV9DRkciLAotCSJDSFJPTUFfRU5fQ0ZHIiwKLQkiQ0hST01BX1NVUF9DRkciLAotCSJNQ0VfQ0ZHIiwgLyogMjAgKi8KLQkiU0tfRU5IQU5fQ0ZHIiwKLQkiQVNGX0NGRyIsCi0JIlMyWV9DRkciLAotCSJTMkNiQ3JfQ0ZHIiwKLQkiQ0hST01BX1NVQlNfQ0ZHIiwgIC8qIDI1ICovCi0JIk9VVF9DTEFNUF9DRkciLAotCSJGUkFNRV9TS0lQX0NGRyIsCi0JIkRVTU1ZXzEiLAotCSJEVU1NWV8yIiwKLQkiRFVNTVlfMyIsICAvKiAzMCAqLwotCSJVUERBVEUiLAotCSJCTF9MVkxfVVBEQVRFIiwKLQkiREVNVVhfVVBEQVRFIiwKLQkiRk9WX1VQREFURSIsCi0JIk1BSU5fU0NBTEVSX1VQREFURSIsICAvKiAzNSAqLwotCSJXQl9VUERBVEUiLAotCSJDT0xPUl9DT1JfVVBEQVRFIiwKLQkiUkdCX0dfVVBEQVRFIiwKLQkiTEFfVVBEQVRFIiwKLQkiQ0hST01BX0VOX1VQREFURSIsICAvKiA0MCAqLwotCSJDSFJPTUFfU1VQX1VQREFURSIsCi0JIk1DRV9VUERBVEUiLAotCSJTS19FTkhBTl9VUERBVEUiLAotCSJTMkNiQ3JfVVBEQVRFIiwKLQkiUzJZX1VQREFURSIsICAvKiA0NSAqLwotCSJBU0ZfVVBEQVRFIiwKLQkiRlJBTUVfU0tJUF9VUERBVEUiLAotCSJDQU1JRl9GUkFNRV9VUERBVEUiLAotCSJTVEFUU19BRl9VUERBVEUiLAotCSJTVEFUU19BRV9VUERBVEUiLCAgLyogNTAgKi8KLQkiU1RBVFNfQVdCX1VQREFURSIsCi0JIlNUQVRTX1JTX1VQREFURSIsCi0JIlNUQVRTX0NTX1VQREFURSIsCi0JIlNUQVRTX1NLSU5fVVBEQVRFIiwKLQkiU1RBVFNfSUhJU1RfVVBEQVRFIiwgIC8qIDU1ICovCi0JIkRVTU1ZXzQiLAotCSJFUE9DSDFfQUNLIiwKLQkiRVBPQ0gyX0FDSyIsCi0JIlNUQVJUX1JFQ09SRElORyIsCi0JIlNUT1BfUkVDT1JESU5HIiwgIC8qIDYwICovCi0JIkRVTU1ZXzUiLAotCSJEVU1NWV82IiwKLQkiQ0FQVFVSRSIsCi0JIkRVTU1ZXzciLAotCSJTVE9QIiwgIC8qIDY1ICovCi0JIkdFVF9IV19WRVJTSU9OIiwKLQkiR0VUX0ZSQU1FX1NLSVBfQ09VTlRTIiwKLQkiT1VUUFVUMV9CVUZGRVJfRU5RIiwKLQkiT1VUUFVUMl9CVUZGRVJfRU5RIiwKLQkiT1VUUFVUM19CVUZGRVJfRU5RIiwgIC8qIDcwICovCi0JIkpQRUdfT1VUX0JVRl9FTlEiLAotCSJSQVdfT1VUX0JVRl9FTlEiLAotCSJSQVdfSU5fQlVGX0VOUSIsCi0JIlNUQVRTX0FGX0VOUSIsCi0JIlNUQVRTX0FFX0VOUSIsICAvKiA3NSAqLwotCSJTVEFUU19BV0JfRU5RIiwKLQkiU1RBVFNfUlNfRU5RIiwKLQkiU1RBVFNfQ1NfRU5RIiwKLQkiU1RBVFNfU0tJTl9FTlEiLAotCSJTVEFUU19JSElTVF9FTlEiLCAgLyogODAgKi8KLQkiRFVNTVlfOCIsCi0JIkpQRUdfRU5DX0NGRyIsCi0JIkRVTU1ZXzkiLAotCSJTVEFUU19BRl9TVEFSVCIsCi0JIlNUQVRTX0FGX1NUT1AiLCAgLyogODUgKi8KLQkiU1RBVFNfQUVfU1RBUlQiLAotCSJTVEFUU19BRV9TVE9QIiwKLQkiU1RBVFNfQVdCX1NUQVJUIiwKLQkiU1RBVFNfQVdCX1NUT1AiLAotCSJTVEFUU19SU19TVEFSVCIsICAvKiA5MCAqLwotCSJTVEFUU19SU19TVE9QIiwKLQkiU1RBVFNfQ1NfU1RBUlQiLAotCSJTVEFUU19DU19TVE9QIiwKLQkiU1RBVFNfU0tJTl9TVEFSVCIsCi0JIlNUQVRTX1NLSU5fU1RPUCIsICAvKiA5NSAqLwotCSJTVEFUU19JSElTVF9TVEFSVCIsCi0JIlNUQVRTX0lISVNUX1NUT1AiLAotCSJEVU1NWV8xMCIsCi0JIlNZTkNfVElNRVJfU0VUVElORyIsCi0JIkFTWU5DX1RJTUVSX1NFVFRJTkciLCAgLyogMTAwICovCi0JIkxJVkVTSE9UIiwKLQkiTEFfU0VUVVAiLAotCSJMSU5FQVJJWkFUSU9OX0NGRyIsCi0JIkRFTU9TQUlDVjMiLAotCSJERU1PU0FJQ1YzX0FCQ0NfQ0ZHIiwgLyogMTA1ICovCi0JIkRFTU9TQUlDVjNfREJDQ19DRkciLAotCSJERU1PU0FJQ1YzX0RCUENfQ0ZHIiwKLQkiREVNT1NBSUNWM19BQkZfQ0ZHIiwKLQkiREVNT1NBSUNWM19BQkNDX1VQREFURSIsCi0JIkRFTU9TQUlDVjNfREJDQ19VUERBVEUiLCAvKiAxMTAgKi8KLQkiREVNT1NBSUNWM19EQlBDX1VQREFURSIsCi0JIlhCQVJfQ0ZHIiwKLQkiRVpUVU5FX0NGRyIsCi0JIlYzMV9aU0wiLAotCSJMSU5FQVJJWkFUSU9OX1VQREFURSIsIC8qMTE1Ki8KLQkiREVNT1NBSUNWM19BQkZfVVBEQVRFIiwKLQkiQ0xGX0NGRyIsCi0JIkNMRl9MVU1BX1VQREFURSIsCi0JIkNMRl9DSFJPTUFfVVBEQVRFIiwKLQkiUENBX1JPTExfT0ZGX0NGRyIsIC8qMTIwKi8KLQkiUENBX1JPTExfT0ZGX1VQREFURSIsCi0JIkdFVF9SRUdfRFVNUCIsCi0JIkdFVF9MSU5FQVJJWkFUT05fVEFCTEUiLAotCSJHRVRfTUVTSF9ST0xMT0ZGX1RBQkxFIiwKLQkiR0VUX1BDQV9ST0xMT0ZGX1RBQkxFIiwgLyoxMjUqLwotCSJHRVRfUkdCX0dfVEFCTEUiLAotCSJHRVRfTEFfVEFCTEUiLAotCSJERU1PU0FJQ1YzX1VQREFURSIsCi19OwotCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZmZTMxX3N0YXRzX2RxYnVmKGVudW0gbXNtX3N0YXRzX2VudW1fdHlwZSBzdGF0c190eXBlKQotewotCXN0cnVjdCBtc21fc3RhdHNfbWV0YV9idWYgKmJ1ZiA9IE5VTEw7Ci0JaW50IHJjID0gMDsKLQlyYyA9IHZmZTMxX2N0cmwtPnN0YXRzX29wcy5kcWJ1Zih2ZmUzMV9jdHJsLT5zdGF0c19vcHMuc3RhdHNfY3RybCwKLQkJCXN0YXRzX3R5cGUsICZidWYpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiJXM6IGRxIHN0YXRzIGJ1ZiAodHlwZSA9ICVkKSBlcnIgPSAlZCIsCi0JCQlfX2Z1bmNfXywgc3RhdHNfdHlwZSwgcmMpOwotCQlyZXR1cm4gMEw7Ci0JfQotCXJldHVybiBidWYtPnBhZGRyOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2ZmUzMV9zdGF0c19mbHVzaF9lbnF1ZXVlKAotCWVudW0gbXNtX3N0YXRzX2VudW1fdHlwZSBzdGF0c190eXBlKQotewotCXN0cnVjdCBtc21fc3RhdHNfYnVmcSAqYnVmcSA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9zdGF0c19tZXRhX2J1ZiAqc3RhdHNfYnVmID0gTlVMTDsKLQlpbnQgcmMgPSAwOwotCWludCBpOwotCS8qCi0JICogUGFzc2luZyBOVUxMIGZvciBpb24gY2xpZW50IGFzIHRoZSBidWZmZXJzIGFyZSBhbHJlYWR5Ci0JICogbWFwcGVkIGF0IHRoaXMgc3RhZ2UsIGNsaWVudCBpcyBub3QgcmVxdWlyZWQsIGZsdXNoIGFsbAotCSAqIHRoZSBidWZmZXJzLCBhbmQgYnVmZmVycyBtb3ZlIHRvIFBSRVBBUkUgc3RhdGUKLQkgKi8KLQotCXJjID0gdmZlMzFfY3RybC0+c3RhdHNfb3BzLmJ1ZnFfZmx1c2goCi0JCQl2ZmUzMV9jdHJsLT5zdGF0c19vcHMuc3RhdHNfY3RybCwgc3RhdHNfdHlwZSwgTlVMTCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBkcSBzdGF0cyBidWYgKHR5cGUgPSAlZCkgZXJyID0gJWQiLAotCQkJX19mdW5jX18sIHN0YXRzX3R5cGUsIHJjKTsKLQkJcmV0dXJuIDBMOwotCX0KLQotCS8qIFF1ZXVlIGFsbCB0aGUgYnVmZmVycyBiYWNrIHRvIFFVRVVFRCBzdGF0ZSAqLwotCWJ1ZnEgPSB2ZmUzMV9jdHJsLT5zdGF0c19jdHJsLmJ1ZnFbc3RhdHNfdHlwZV07Ci0JZm9yIChpID0gMDsgaSA8IGJ1ZnEtPm51bV9idWZzOyBpKyspIHsKLQkJc3RhdHNfYnVmID0gJmJ1ZnEtPmJ1ZnNbaV07Ci0JCXJjID0gdmZlMzFfY3RybC0+c3RhdHNfb3BzLmVucXVldWVfYnVmKAotCQkJCXZmZTMxX2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsLAotCQkJCSYoc3RhdHNfYnVmLT5pbmZvKSwgTlVMTCwgLTEpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBkcSBzdGF0cyBidWYgKHR5cGUgPSAlZCkgZXJyID0gJWQiLAotCQkJCV9fZnVuY19fLCBzdGF0c190eXBlLCByYyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0JcmV0dXJuIDBMOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2ZmUzMV9zdGF0c191bnJlZ2J1ZigKLQlzdHJ1Y3QgbXNtX3N0YXRzX3JlcWJ1ZiAqcmVxX2J1ZiwgaW50IGRvbWFpbl9udW0pCi17Ci0JaW50IGkgPSAwLCByYyA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmVxX2J1Zi0+bnVtX2J1ZjsgaSsrKSB7Ci0JCXJjID0gdmZlMzFfY3RybC0+c3RhdHNfb3BzLmJ1Zl91bnByZXBhcmUoCi0JCQl2ZmUzMV9jdHJsLT5zdGF0c19vcHMuc3RhdHNfY3RybCwKLQkJCXJlcV9idWYtPnN0YXRzX3R5cGUsIGksCi0JCQl2ZmUzMV9jdHJsLT5zdGF0c19vcHMuY2xpZW50LCBkb21haW5fbnVtKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogdW5yZWcgc3RhdHMgYnVmICh0eXBlID0gJWQpIGVyciA9ICVkIiwKLQkJCQlfX2Z1bmNfXywgcmVxX2J1Zi0+c3RhdHNfdHlwZSwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0JcmV0dXJuIDBMOwotfQotCi1zdGF0aWMgaW50IHZmZV9zdGF0c19hd2JfYnVmX2luaXQoCi0Jc3RydWN0IHZmZV9jbWRfc3RhdHNfYnVmICppbikKLXsKLQl1aW50MzJfdCBhZGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMzFfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JYWRkciA9ICh1aW50MzJfdCl2ZmUzMV9zdGF0c19kcWJ1ZihNU01fU1RBVFNfVFlQRV9BV0IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBhd2IgcGluZyBidWYgZnJvbSBmcmVlIGJ1ZiBxdWV1ZSIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1zbV9jYW1lcmFfaW9fdyhhZGRyLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19TVEFUU19BV0JfV1JfUElOR19BRERSKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMzFfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JYWRkciA9ICh1aW50MzJfdCl2ZmUzMV9zdGF0c19kcWJ1ZihNU01fU1RBVFNfVFlQRV9BV0IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBhd2IgcGluZyBidWYgZnJvbSBmcmVlIGJ1ZiBxdWV1ZSIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1zbV9jYW1lcmFfaW9fdyhhZGRyLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19TVEFUU19BV0JfV1JfUE9OR19BRERSKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZmVfc3RhdHNfYWVjX2J1Zl9pbml0KAotCXN0cnVjdCB2ZmVfY21kX3N0YXRzX2J1ZiAqaW4pCi17Ci0JdWludDMyX3QgYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzFfc3RhdHNfZHFidWYoTVNNX1NUQVRTX1RZUEVfQUVDKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMV9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWFkZHIpIHsKLQkJcHJfZXJyKCIlczogZHEgYWVjIHBpbmcgYnVmIGZyb20gZnJlZSBidWYgcXVldWUiLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1NUQVRTX0FFQ19XUl9QSU5HX0FERFIpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMV9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlhZGRyID0gKHVpbnQzMl90KXZmZTMxX3N0YXRzX2RxYnVmKE1TTV9TVEFUU19UWVBFX0FFQyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzFfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhZGRyKSB7Ci0JCXByX2VycigiJXM6IGRxIGFlYyBwb25nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1zbV9jYW1lcmFfaW9fdyhhZGRyLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJVkZFX0JVU19TVEFUU19BRUNfV1JfUE9OR19BRERSKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZmVfc3RhdHNfYWZfYnVmX2luaXQoCi0Jc3RydWN0IHZmZV9jbWRfc3RhdHNfYnVmICppbikKLXsKLQl1aW50MzJfdCBhZGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJjID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMV9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlyYyA9IHZmZTMxX3N0YXRzX2ZsdXNoX2VucXVldWUoTVNNX1NUQVRTX1RZUEVfQUYpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogZHEgc3RhdHMgYnVmIGVyciA9ICVkIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JYWRkciA9ICh1aW50MzJfdCl2ZmUzMV9zdGF0c19kcWJ1ZihNU01fU1RBVFNfVFlQRV9BRik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzFfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhZGRyKSB7Ci0JCXByX2VycigiJXM6IGRxIGFmIHBpbmcgYnVmIGZyb20gZnJlZSBidWYgcXVldWUiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltc21fY2FtZXJhX2lvX3coYWRkciwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfQUZfV1JfUElOR19BRERSKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMzFfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JYWRkciA9ICh1aW50MzJfdCl2ZmUzMV9zdGF0c19kcWJ1ZihNU01fU1RBVFNfVFlQRV9BRik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzFfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhZGRyKSB7Ci0JCXByX2VycigiJXM6IGRxIGFmIHBvbmcgYnVmIGZyb20gZnJlZSBidWYgcXVldWUiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltc21fY2FtZXJhX2lvX3coYWRkciwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfQUZfV1JfUE9OR19BRERSKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZmVfc3RhdHNfaWhpc3RfYnVmX2luaXQoCi0Jc3RydWN0IHZmZV9jbWRfc3RhdHNfYnVmICppbikKLXsKLQl1aW50MzJfdCBhZGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzFfc3RhdHNfZHFidWYoTVNNX1NUQVRTX1RZUEVfSUhJU1QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBpaGlzdCBwaW5nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1zbV9jYW1lcmFfaW9fdyhhZGRyLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19TVEFUU19ISVNUX1dSX1BJTkdfQUREUik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzFfc3RhdHNfZHFidWYoTVNNX1NUQVRTX1RZUEVfSUhJU1QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBpaGlzdCBwb25nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX0hJU1RfV1JfUE9OR19BRERSKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZmVfc3RhdHNfcnNfYnVmX2luaXQoc3RydWN0IHZmZV9jbWRfc3RhdHNfYnVmICppbikKLXsKLQl1aW50MzJfdCBhZGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzFfc3RhdHNfZHFidWYoTVNNX1NUQVRTX1RZUEVfUlMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBycyBwaW5nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX1JTX1dSX1BJTkdfQUREUik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzFfc3RhdHNfZHFidWYoTVNNX1NUQVRTX1RZUEVfUlMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBycyBwb25nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX1JTX1dSX1BPTkdfQUREUik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlX3N0YXRzX2NzX2J1Zl9pbml0KHN0cnVjdCB2ZmVfY21kX3N0YXRzX2J1ZiAqaW4pCi17Ci0JdWludDMyX3QgYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzFfc3RhdHNfZHFidWYoTVNNX1NUQVRTX1RZUEVfQ1MpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBjcyBwaW5nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX0NTX1dSX1BJTkdfQUREUik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzFfc3RhdHNfZHFidWYoTVNNX1NUQVRTX1RZUEVfQ1MpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBjcyBwb25nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX0NTX1dSX1BPTkdfQUREUik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3N0b3Aodm9pZCkKLXsKLQl1aW50OF90ICBheGlCdXN5RmxhZyA9IHRydWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWF0b21pY19zZXQoJnZmZTMxX2N0cmwtPnZzdGF0ZSwgMCk7Ci0KLQkvKiBmb3IgcmVzZXQgaHcgbW9kdWxlcywgYW5kIHNlbmQgbXNnIHdoZW4gcmVzZXRfaXJxIGNvbWVzLiovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnN0b3BfZmxhZ19sb2NrLCBmbGFncyk7Ci0JdmZlMzFfY3RybC0+c3RvcF9hY2tfcGVuZGluZyA9IFRSVUU7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzFfY3RybC0+c3RvcF9mbGFnX2xvY2ssIGZsYWdzKTsKLQotCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMuICAqLwotCW1zbV9jYW1lcmFfaW9fdyhWRkVfRElTQUJMRV9BTExfSVJRUywKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfTUFTS18wKTsKLQltc21fY2FtZXJhX2lvX3coVkZFX0RJU0FCTEVfQUxMX0lSUVMsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX01BU0tfMSk7Ci0KLQkvKiBjbGVhciBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzKi8KLQltc21fY2FtZXJhX2lvX3coVkZFX0NMRUFSX0FMTF9JUlFTLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DTEVBUl8wKTsKLQltc21fY2FtZXJhX2lvX3coVkZFX0NMRUFSX0FMTF9JUlFTLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DTEVBUl8xKTsKLQkvKiBFbnN1cmUgdGhlIHdyaXRlIG9yZGVyIHdoaWxlIHdyaXRpbmcKLQl0byB0aGUgY29tbWFuZCByZWdpc3RlciB1c2luZyB0aGUgYmFycmllciAqLwotCW1zbV9jYW1lcmFfaW9fd19tYigxLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DTUQpOwotCi0JLyogaW4gZWl0aGVyIGNvbnRpbnVvdXMgb3Igc25hcHNob3QgbW9kZSwgc3RvcCBjb21tYW5kIGNhbiBiZSBpc3N1ZWQKLQkgKiBhdCBhbnkgdGltZS4gc3RvcCBjYW1pZiBpbW1lZGlhdGVseS4gKi8KLQltc21fY2FtZXJhX2lvX3dfbWIoQ0FNSUZfQ09NTUFORF9TVE9QX0lNTUVESUFURUxZLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0NBTUlGX0NPTU1BTkQpOwotCS8qIGF4aSBoYWx0IGNvbW1hbmQuICovCi0JbXNtX2NhbWVyYV9pb193KEFYSV9IQUxULAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0FYSV9DTUQpOwotCXdtYigpOwotCXdoaWxlIChheGlCdXN5RmxhZykgewotCQlpZiAobXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQVhJX1NUQVRVUykgJiAweDEpCi0JCQlheGlCdXN5RmxhZyA9IGZhbHNlOwotCX0KLQkvKiBFbnN1cmUgdGhlIHdyaXRlIG9yZGVyIHdoaWxlIHdyaXRpbmcKLQl0byB0aGUgY29tbWFuZCByZWdpc3RlciB1c2luZyB0aGUgYmFycmllciAqLwotCW1zbV9jYW1lcmFfaW9fd19tYihBWElfSEFMVF9DTEVBUiwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9BWElfQ01EKTsKLQotCS8qIG5vdyBlbmFibGUgb25seSBoYWx0X2lycSAmIHJlc2V0X2lycSAqLwotCW1zbV9jYW1lcmFfaW9fdygweGYwMDAwMDAwLCAgICAgICAgICAvKiB0aGlzIGlzIGZvciBhc3luYyB0aW1lci4gKi8KLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfTUFTS18wKTsKLQltc21fY2FtZXJhX2lvX3coVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HXzEsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX01BU0tfMSk7Ci0KLQltc21fY2FtZXJhX2lvX3dfbWIoVkZFX1JFU0VUX1VQT05fU1RPUF9DTUQsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfR0xPQkFMX1JFU0VUKTsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfc3ViZGV2X25vdGlmeShpbnQgaWQsIGludCBwYXRoLCB1aW50MzJfdCBpbnN0X2hhbmRsZSkKLXsKLQlzdHJ1Y3QgbXNtX3ZmZV9yZXNwIHJwOwotCXN0cnVjdCBtc21fZnJhbWVfaW5mbyBmcmFtZV9pbmZvOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnNkX25vdGlmeV9sb2NrLCBmbGFncyk7Ci0JbWVtc2V0KCZycCwgMCwgc2l6ZW9mKHN0cnVjdCBtc21fdmZlX3Jlc3ApKTsKLQlDREJHKCJ2ZmUzMV9zdWJkZXZfbm90aWZ5IDogbXNnSWQgPSAlZFxuIiwgaWQpOwotCXJwLmV2dF9tc2cudHlwZSAgID0gTVNNX0NBTUVSQV9NU0c7Ci0JZnJhbWVfaW5mby5pbnN0X2hhbmRsZSA9IGluc3RfaGFuZGxlOwotCWZyYW1lX2luZm8ucGF0aCA9IHBhdGg7Ci0JcnAuZXZ0X21zZy5kYXRhID0gJmZyYW1lX2luZm87Ci0JcnAudHlwZQkgICA9IGlkOwotCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlMzFfY3RybC0+c3ViZGV2LCBOT1RJRllfVkZFX0JVRl9FVlQsICZycCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzFfY3RybC0+c2Rfbm90aWZ5X2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCB2ZmUzMV9jb25maWdfYXhpKGludCBtb2RlLCB1aW50MzJfdCAqYW8pCi17Ci0JdWludDMyX3QgKmNoX2luZm87Ci0JdWludDMyX3QgKmF4aV9jZmcgPSBhbyArIFYzMV9BWElfUkVTRVJWRUQ7Ci0JdWludDMyX3QgYnVzX2NtZCA9ICpheGlfY2ZnOwotCWludCBpOwotCi0JLyogVXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIHdyaXRlIG1hc3RlcnMgZm9yIGVhY2ggb3V0cHV0Ki8KLQljaF9pbmZvID0gYXhpX2NmZyArIFYzMV9BWElfQ0ZHX0xFTjsKLQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwID0gMHgwMDAwRkZGRiAmICpjaF9pbmZvOwotCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDEgPSAweDAwMDBGRkZGICYgKCpjaF9pbmZvKysgPj4gMTYpOwotCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDIgPSAweDAwMDBGRkZGICYgKmNoX2luZm8rKzsKLQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuaW5zdF9oYW5kbGUgPSAqY2hfaW5mbysrOwotCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDAgPSAweDAwMDBGRkZGICYgKmNoX2luZm87Ci0JdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSA9IDB4MDAwMEZGRkYgJiAoKmNoX2luZm8rKyA+PiAxNik7Ci0JdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMiA9IDB4MDAwMEZGRkYgJiAqY2hfaW5mbysrOwotCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5pbnN0X2hhbmRsZSA9ICpjaF9pbmZvKys7Ci0JdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmNoMCA9IDB4MDAwMEZGRkYgJiAqY2hfaW5mbzsKLQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDIuY2gxID0gMHgwMDAwRkZGRiAmICgqY2hfaW5mbysrID4+IDE2KTsKLQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDIuY2gyID0gMHgwMDAwRkZGRiAmICpjaF9pbmZvKys7Ci0JdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQyLmluc3RfaGFuZGxlID0gKmNoX2luZm8rKzsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgT1VUUFVUX1BSSU06Ci0JCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgPQotCQkJVkZFMzFfT1VUUFVUX01PREVfUFJJTUFSWTsKLQkJYnJlYWs7Ci0JY2FzZSBPVVRQVVRfUFJJTV9BTExfQ0hOTFM6Ci0JCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgPQotCQkJVkZFMzFfT1VUUFVUX01PREVfUFJJTUFSWV9BTExfQ0hOTFM7Ci0JCWJyZWFrOwotCWNhc2UgT1VUUFVUX1BSSU18T1VUUFVUX1NFQzoKLQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSA9Ci0JCQlWRkUzMV9PVVRQVVRfTU9ERV9QUklNQVJZOwotCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkUzMV9PVVRQVVRfTU9ERV9TRUNPTkRBUlk7Ci0JCWJyZWFrOwotCWNhc2UgT1VUUFVUX1BSSU18T1VUUFVUX1NFQ19BTExfQ0hOTFM6Ci0JCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgPQotCQkJVkZFMzFfT1VUUFVUX01PREVfUFJJTUFSWTsKLQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSB8PQotCQkJVkZFMzFfT1VUUFVUX01PREVfU0VDT05EQVJZX0FMTF9DSE5MUzsKLQkJYnJlYWs7Ci0JY2FzZSBPVVRQVVRfUFJJTV9BTExfQ0hOTFN8T1VUUFVUX1NFQzoKLQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSA9Ci0JCQlWRkUzMV9PVVRQVVRfTU9ERV9QUklNQVJZX0FMTF9DSE5MUzsKLQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSB8PQotCQkJVkZFMzFfT1VUUFVUX01PREVfU0VDT05EQVJZOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzIEludmFsaWQgQVhJIG1vZGUgJWQgIiwgX19mdW5jX18sIG1vZGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlheGlfY2ZnKys7Ci0JbXNtX2NhbWVyYV9pb19tZW1jcHkodmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCXZmZTMxX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5vZmZzZXQsIGF4aV9jZmcsCi0JCVYzMV9BWElfQlVTX0NGR19MRU4pOwotCWF4aV9jZmcgKz0gVjMxX0FYSV9CVVNfQ0ZHX0xFTi80OwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZmZTMxX0FYSV9XTV9DRkcpOyBpKyspIHsKLQkJbXNtX2NhbWVyYV9pb193KCpheGlfY2ZnLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlK3ZmZTMxX0FYSV9XTV9DRkdbaV0pOwotCQlheGlfY2ZnICs9IDM7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSt2ZmUzMV9BWElfV01fQ0ZHW2ldKzEyLAotCQkJCQkJCWF4aV9jZmcsIDEyKTsKLQkJYXhpX2NmZyArPSAzOwotCX0KLQltc21fY2FtZXJhX2lvX3coYnVzX2NtZCwgdmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQkJCVYzMV9BWElfQlVTX0NNRF9PRkYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3Jlc2V0X2ludGVybmFsX3ZhcmlhYmxlcyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdmZlMzFfY3RybC0+dmZlSW1hc2tDb21wb3NpdGVQYWNrZWQgPSAwOwotCS8qIHN0YXRlIGNvbnRyb2wgdmFyaWFibGVzICovCi0JdmZlMzFfY3RybC0+c3RhcnRfYWNrX3BlbmRpbmcgPSBGQUxTRTsKLQlhdG9taWNfc2V0KCZpcnFfY250LCAwKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMV9jdHJsLT5zdG9wX2ZsYWdfbG9jaywgZmxhZ3MpOwotCXZmZTMxX2N0cmwtPnN0b3BfYWNrX3BlbmRpbmcgID0gRkFMU0U7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzFfY3RybC0+c3RvcF9mbGFnX2xvY2ssIGZsYWdzKTsKLQotCXZmZTMxX2N0cmwtPnJlc2V0X2Fja19wZW5kaW5nICA9IEZBTFNFOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnVwZGF0ZV9hY2tfbG9jaywgZmxhZ3MpOwotCXZmZTMxX2N0cmwtPnVwZGF0ZV9hY2tfcGVuZGluZyA9IEZBTFNFOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnVwZGF0ZV9hY2tfbG9jaywgZmxhZ3MpOwotCi0JdmZlMzFfY3RybC0+cmVjb3JkaW5nX3N0YXRlID0gVkZFX1NUQVRFX0lETEU7Ci0JdmZlMzFfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPSBWRkVfU1RBVEVfSURMRTsKLQotCWF0b21pY19zZXQoJnZmZTMxX2N0cmwtPnZzdGF0ZSwgMCk7Ci0KLQkvKiAwIGZvciBjb250aW51b3VzIG1vZGUsIDEgZm9yIHNuYXBzaG90IG1vZGUgKi8KLQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9IDA7Ci0JdmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSA9IDA7Ci0JdmZlMzFfY3RybC0+dmZlX2NhcHR1cmVfY291bnQgPSAwOwotCi0JLyogdGhpcyBpcyB1bnNpZ25lZCAzMiBiaXQgaW50ZWdlci4gKi8KLQl2ZmUzMV9jdHJsLT52ZmVGcmFtZUlkID0gMDsKLQkvKiBTdGF0cyBjb250cm9sIHZhcmlhYmxlcy4gKi8KLQltZW1zZXQoJih2ZmUzMV9jdHJsLT5hZlN0YXRzQ29udHJvbCksIDAsCi0JCXNpemVvZihzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wpKTsKLQotCW1lbXNldCgmKHZmZTMxX2N0cmwtPmF3YlN0YXRzQ29udHJvbCksIDAsCi0JCXNpemVvZihzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wpKTsKLQotCW1lbXNldCgmKHZmZTMxX2N0cmwtPmFlY1N0YXRzQ29udHJvbCksIDAsCi0JCXNpemVvZihzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wpKTsKLQotCW1lbXNldCgmKHZmZTMxX2N0cmwtPmloaXN0U3RhdHNDb250cm9sKSwgMCwKLQkJc2l6ZW9mKHN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCkpOwotCi0JbWVtc2V0KCYodmZlMzFfY3RybC0+cnNTdGF0c0NvbnRyb2wpLCAwLAotCQlzaXplb2Yoc3RydWN0IHZmZV9zdGF0c19jb250cm9sKSk7Ci0KLQltZW1zZXQoJih2ZmUzMV9jdHJsLT5jc1N0YXRzQ29udHJvbCksIDAsCi0JCXNpemVvZihzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wpKTsKLQotCXZmZTMxX2N0cmwtPmZyYW1lX3NraXBfY250ID0gMzE7Ci0JdmZlMzFfY3RybC0+ZnJhbWVfc2tpcF9wYXR0ZXJuID0gMHhmZmZmZmZmZjsKLQl2ZmUzMV9jdHJsLT5zbmFwc2hvdF9mcmFtZV9jbnQgPSAwOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9yZXNldCh2b2lkKQotewotCXZmZTMxX3Jlc2V0X2ludGVybmFsX3ZhcmlhYmxlcygpOwotCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMuICB2ZmVJbWFza0xvY2FsIGlzIGFsc28gcmVzZXQgdG8gMAotCSogdG8gYmVnaW4gd2l0aC4gKi8KLQltc21fY2FtZXJhX2lvX3coVkZFX0RJU0FCTEVfQUxMX0lSUVMsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX01BU0tfMCk7Ci0KLQltc21fY2FtZXJhX2lvX3coVkZFX0RJU0FCTEVfQUxMX0lSUVMsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX01BU0tfMSk7Ci0KLQkvKiBjbGVhciBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzKi8KLQltc21fY2FtZXJhX2lvX3coVkZFX0NMRUFSX0FMTF9JUlFTLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DTEVBUl8wKTsKLQltc21fY2FtZXJhX2lvX3coVkZFX0NMRUFSX0FMTF9JUlFTLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DTEVBUl8xKTsKLQotCS8qIEVuc3VyZSB0aGUgd3JpdGUgb3JkZXIgd2hpbGUgd3JpdGluZwotCXRvIHRoZSBjb21tYW5kIHJlZ2lzdGVyIHVzaW5nIHRoZSBiYXJyaWVyICovCi0JbXNtX2NhbWVyYV9pb193X21iKDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NNRCk7Ci0KLQkvKiBlbmFibGUgcmVzZXRfYWNrIGludGVycnVwdC4gICovCi0JbXNtX2NhbWVyYV9pb193KFZGRV9JTUFTS19XSElMRV9TVE9QUElOR18xLAotCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX01BU0tfMSk7Ci0KLQkvKiBXcml0ZSB0byBWRkVfR0xPQkFMX1JFU0VUX0NNRCB0byByZXNldCB0aGUgdmZlIGhhcmR3YXJlLiBPbmNlIHJlc2V0Ci0JICogaXMgZG9uZSwgaGFyZHdhcmUgaW50ZXJydXB0IHdpbGwgYmUgZ2VuZXJhdGVkLiAgVkZFIGlzdCBwcm9jZXNzZXMKLQkgKiB0aGUgaW50ZXJydXB0IHRvIGNvbXBsZXRlIHRoZSBmdW5jdGlvbiBjYWxsLiAgTm90ZSB0aGF0IHRoZSByZXNldAotCSAqIGZ1bmN0aW9uIGlzIHN5bmNocm9ub3VzLiAqLwotCi0JLyogRW5zdXJlIHRoZSB3cml0ZSBvcmRlciB3aGlsZSB3cml0aW5nCi0JdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdXNpbmcgdGhlIGJhcnJpZXIgKi8KLQltc21fY2FtZXJhX2lvX3dfbWIoVkZFX1JFU0VUX1VQT05fUkVTRVRfQ01ELAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0dMT0JBTF9SRVNFVCk7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlMzFfb3BlcmF0aW9uX2NvbmZpZyh1aW50MzJfdCAqY21kKQotewotCXVpbnQzMl90ICpwID0gY21kOwotCi0JdmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUgPSAqcDsKLQl2ZmUzMV9jdHJsLT5zdGF0c19jb21wID0gKigrK3ApOwotCXZmZTMxX2N0cmwtPmhmcl9tb2RlID0gKigrK3ApOwotCi0JbXNtX2NhbWVyYV9pb193KCooKytwKSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9DRkcpOwotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JbXNtX2NhbWVyYV9pb193KCooKytwKSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9SRUFMSUdOX0JVRik7Ci0JbXNtX2NhbWVyYV9pb193KCooKytwKSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9DSFJPTUFfVVApOwotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfU1RBVFNfQ0ZHKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2NhbWVyYV9pb19kdW1wMih2b2lkIF9faW9tZW0gKmFkZHIsIGludCBzaXplKQotewotCWNoYXIgbGluZV9zdHJbQlVGRl9TSVpFXzEyOF0sICpwX3N0cjsKLQlpbnQgaTsKLQl1MzIgKnAgPSAodTMyICopIGFkZHI7Ci0JdTMyIGRhdGE7Ci0JQ0RCRygiJXM6ICVwICVkXG4iLCBfX2Z1bmNfXywgYWRkciwgc2l6ZSk7Ci0JbGluZV9zdHJbMF0gPSAnXDAnOwotCXBfc3RyID0gbGluZV9zdHI7Ci0JZm9yIChpID0gMDsgaSA8IHNpemUvNDsgaSsrKSB7Ci0JCWlmIChpICUgNCA9PSAwKSB7Ci0JCQlzbnByaW50ZihwX3N0ciwgMTIsICIlMDh4OiAiLCAodTMyKSBwKTsKLQkJCXBfc3RyICs9IDEwOwotCQl9Ci0JCWRhdGEgPSByZWFkbF9yZWxheGVkKHArKyk7Ci0JCXNucHJpbnRmKHBfc3RyLCAxMiwgIiUwOHggIiwgZGF0YSk7Ci0JCXBfc3RyICs9IDk7Ci0JCWlmICgoaSArIDEpICUgNCA9PSAwKSB7Ci0JCQlDREJHKCIlc1xuIiwgbGluZV9zdHIpOwotCQkJbGluZV9zdHJbMF0gPSAnXDAnOwotCQkJcF9zdHIgPSBsaW5lX3N0cjsKLQkJfQotCX0KLQlpZiAobGluZV9zdHJbMF0gIT0gJ1wwJykKLQkJQ0RCRygiJXNcbiIsIGxpbmVfc3RyKTsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfc3RhcnRfY29tbW9uKHZvaWQpCi17Ci0JdWludDMyX3QgaXJxX21hc2sgPSAweDAwRTAwMDIxOwotCXZmZTMxX2N0cmwtPnN0YXJ0X2Fja19wZW5kaW5nID0gVFJVRTsKLQlDREJHKCJWRkUgb3BlcnRhaW9uIG1vZGUgPSAweCV4LCBvdXRwdXQgbW9kZSA9IDB4JXhcbiIsCi0JCXZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlLCB2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlKTsKLQlpZiAodmZlMzFfY3RybC0+c3RhdHNfY29tcCkKLQkJaXJxX21hc2sgfD0gVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0NPTVBPU0lUX01BU0s7Ci0JZWxzZQotCQlpcnFfbWFzayB8PSAweDAwMEZFMDAwOwotCi0JbXNtX2NhbWVyYV9pb193KGlycV9tYXNrLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9NQVNLXzApOwotCW1zbV9jYW1lcmFfaW9fdyhWRkVfSU1BU0tfV0hJTEVfU1RPUFBJTkdfMSwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfTUFTS18xKTsKLQotCS8qIEVuc3VyZSB0aGUgd3JpdGUgb3JkZXIgd2hpbGUgd3JpdGluZwotCXRvIHRoZSBjb21tYW5kIHJlZ2lzdGVyIHVzaW5nIHRoZSBiYXJyaWVyICovCi0JbXNtX2NhbWVyYV9pb193X21iKDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkVHX1VQREFURV9DTUQpOwotCW1zbV9jYW1lcmFfaW9fd19tYigxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0NBTUlGX0NPTU1BTkQpOwotCi0JbXNtX2NhbWVyYV9pb19kdW1wMih2ZmUzMV9jdHJsLT52ZmViYXNlLCB2ZmUzMV9jdHJsLT5yZWdpc3Rlcl90b3RhbCo0KTsKLQlhdG9taWNfc2V0KCZ2ZmUzMV9jdHJsLT52c3RhdGUsIDEpOwotfQotCi1zdGF0aWMgaW50IHZmZTMxX3N0YXJ0X3JlY29yZGluZyhzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCkKLXsKLQltc21fY2FtaW9fYnVzX3NjYWxlX2NmZygKLQkJcG1jdGwtPnNkYXRhLT5wZGF0YS0+Y2FtX2J1c19zY2FsZV90YWJsZSwgU19WSURFTyk7Ci0JdmZlMzFfY3RybC0+cmVjb3JkaW5nX3N0YXRlID0gVkZFX1NUQVRFX1NUQVJUX1JFUVVFU1RFRDsKLQltc21fY2FtZXJhX2lvX3dfbWIoMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9SRUdfVVBEQVRFX0NNRCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlMzFfc3RvcF9yZWNvcmRpbmcoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwpCi17Ci0JdmZlMzFfY3RybC0+cmVjb3JkaW5nX3N0YXRlID0gVkZFX1NUQVRFX1NUT1BfUkVRVUVTVEVEOwotCW1zbV9jYW1lcmFfaW9fd19tYigxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX1JFR19VUERBVEVfQ01EKTsKLQltc21fY2FtaW9fYnVzX3NjYWxlX2NmZygKLQkJcG1jdGwtPnNkYXRhLT5wZGF0YS0+Y2FtX2J1c19zY2FsZV90YWJsZSwgU19QUkVWSUVXKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfc3RhcnRfbGl2ZXNob3Qoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwpCi17Ci0JLyogSGFyZGNvZGUgMSBsaXZlIHNuYXBzaG90IGZvciBub3cuICovCi0JdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNhcHR1cmVfY250ID0gMTsKLQl2ZmUzMV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudCA9IHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jYXB0dXJlX2NudDsKLQotCXZmZTMxX2N0cmwtPmxpdmVzaG90X3N0YXRlID0gVkZFX1NUQVRFX1NUQVJUX1JFUVVFU1RFRDsKLQltc21fY2FtZXJhX2lvX3dfbWIoMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9SRUdfVVBEQVRFX0NNRCk7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlMzFfenNsKHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsKQotewotCXVpbnQzMl90IGlycV9jb21wX21hc2sgPSAwOwotCS8qIGNhcHR1cmUgY29tbWFuZCBpcyB2YWxpZCBmb3IgYm90aCBpZGxlIGFuZCBhY3RpdmUgc3RhdGUuICovCi0JaXJxX2NvbXBfbWFzawk9Ci0JCW1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DT01QX01BU0spOwotCi0JQ0RCRygiJXM6b3AgbW9kZSAlZCBPL1AgTW9kZSAlZFxuIiwgX19mdW5jX18sCi0JCXZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlLCB2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlKTsKLQotCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYgVkZFMzFfT1VUUFVUX01PREVfUFJJTUFSWSkgewotCQlpcnFfY29tcF9tYXNrIHw9ICgoMHgxIDw8ICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwKSkgfAotCQkJKDB4MSA8PCAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMSkpKTsKLQl9IGVsc2UgaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQlWRkUzMV9PVVRQVVRfTU9ERV9QUklNQVJZX0FMTF9DSE5MUykgewotCQlpcnFfY29tcF9tYXNrIHw9ICgoMHgxIDw8ICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwKSkgfAotCQkJKDB4MSA8PCAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMSkpIHwKLQkJCSgweDEgPDwgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDIpKSk7Ci0JfQotCi0JaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJiBWRkUzMV9PVVRQVVRfTU9ERV9TRUNPTkRBUlkpIHsKLQkJaXJxX2NvbXBfbWFzayB8PSAoKDB4MSA8PCAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMCArIDgpKSB8Ci0JCQkoMHgxIDw8ICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxICsgOCkpKTsKLQl9IGVsc2UgaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQlWRkUzMV9PVVRQVVRfTU9ERV9TRUNPTkRBUllfQUxMX0NITkxTKSB7Ci0JCWlycV9jb21wX21hc2sgfD0gKCgweDEgPDwgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDAgKyA4KSkgfAotCQkJKDB4MSA8PCAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSArIDgpKSB8Ci0JCQkoMHgxIDw8ICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gyICsgOCkpKTsKLQl9Ci0KLQlpZiAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmIFZGRTMxX09VVFBVVF9NT0RFX1BSSU1BUlkpIHsKLQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwXSk7Ci0JCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMV0pOwotCX0gZWxzZSBpZiAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCVZGRTMxX09VVFBVVF9NT0RFX1BSSU1BUllfQUxMX0NITkxTKSB7Ci0JCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMF0pOwotCQltc21fY2FtZXJhX2lvX3coMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDFdKTsKLQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gyXSk7Ci0JfQotCi0JaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJiBWRkUzMV9PVVRQVVRfTU9ERV9TRUNPTkRBUlkpIHsKLQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwXSk7Ci0JCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMV0pOwotCX0gZWxzZSBpZiAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCVZGRTMxX09VVFBVVF9NT0RFX1NFQ09OREFSWV9BTExfQ0hOTFMpIHsKLQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwXSk7Ci0JCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMV0pOwotCQltc21fY2FtZXJhX2lvX3coMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDJdKTsKLQl9Ci0KLQltc21fY2FtZXJhX2lvX3coaXJxX2NvbXBfbWFzaywgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ09NUF9NQVNLKTsKLQl2ZmUzMV9zdGFydF9jb21tb24oKTsKLQltc21fY2FtaW9fYnVzX3NjYWxlX2NmZygKLQkJcG1jdGwtPnNkYXRhLT5wZGF0YS0+Y2FtX2J1c19zY2FsZV90YWJsZSwgU19aU0wpOwotCi0JbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyAweDE4Qyk7Ci0JbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyAweDE4OCk7Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50IHZmZTMxX2NhcHR1cmVfcmF3KAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXVpbnQzMl90IG51bV9mcmFtZXNfY2FwdHVyZSkKLXsKLQl1aW50MzJfdCBpcnFfY29tcF9tYXNrID0gMDsKLQotCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jYXB0dXJlX2NudCA9IG51bV9mcmFtZXNfY2FwdHVyZTsKLQl2ZmUzMV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudCA9IG51bV9mcmFtZXNfY2FwdHVyZTsKLQotCWlycV9jb21wX21hc2sgPQotCQltc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ09NUF9NQVNLKTsKLQotCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYgVkZFMzFfT1VUUFVUX01PREVfUFJJTUFSWSkgewotCQlpcnFfY29tcF9tYXNrIHw9ICgweDEgPDwgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDApKTsKLQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwXSk7Ci0JfQotCi0JbXNtX2NhbWVyYV9pb193KGlycV9jb21wX21hc2ssIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NPTVBfTUFTSyk7Ci0JbXNtX2NhbWlvX2J1c19zY2FsZV9jZmcoCi0JCXBtY3RsLT5zZGF0YS0+cGRhdGEtPmNhbV9idXNfc2NhbGVfdGFibGUsIFNfQ0FQVFVSRSk7Ci0JdmZlMzFfc3RhcnRfY29tbW9uKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlMzFfY2FwdHVyZSgKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQl1aW50MzJfdCBudW1fZnJhbWVzX2NhcHR1cmUpCi17Ci0JdWludDMyX3QgaXJxX2NvbXBfbWFzayA9IDA7Ci0JLyogY2FwdHVyZSBjb21tYW5kIGlzIHZhbGlkIGZvciBib3RoIGlkbGUgYW5kIGFjdGl2ZSBzdGF0ZS4gKi8KLQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2FwdHVyZV9jbnQgPSBudW1fZnJhbWVzX2NhcHR1cmU7Ci0JaWYgKHZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09IFZGRV9PVVRQVVRTX01BSU5fQU5EX1RIVU1CIHx8Ci0JCXZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09IFZGRV9PVVRQVVRTX1RIVU1CX0FORF9NQUlOIHx8Ci0JCXZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09IFZGRV9PVVRQVVRTX0pQRUdfQU5EX1RIVU1CIHx8Ci0JCXZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09IFZGRV9PVVRQVVRTX1RIVU1CX0FORF9KUEVHKSB7Ci0JCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jYXB0dXJlX2NudCA9Ci0JCQludW1fZnJhbWVzX2NhcHR1cmU7Ci0JfQotCi0JdmZlMzFfY3RybC0+dmZlX2NhcHR1cmVfY291bnQgPSBudW1fZnJhbWVzX2NhcHR1cmU7Ci0JaXJxX2NvbXBfbWFzayA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DT01QX01BU0spOwotCi0JaWYgKHZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09IFZGRV9PVVRQVVRTX01BSU5fQU5EX1RIVU1CIHx8Ci0JCXZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09IFZGRV9PVVRQVVRTX0pQRUdfQU5EX1RIVU1CIHx8Ci0JCXZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09IFZGRV9PVVRQVVRTX1RIVU1CX0FORF9NQUlOKSB7Ci0JCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTMxX09VVFBVVF9NT0RFX1BSSU1BUlkpIHsKLQkJCWlycV9jb21wX21hc2sgfD0gKDB4MSA8PCB2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwIHwKLQkJCQkweDEgPDwgdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMSk7Ci0JCX0KLQkJaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQkJVkZFMzFfT1VUUFVUX01PREVfU0VDT05EQVJZKSB7Ci0JCQlpcnFfY29tcF9tYXNrIHw9Ci0JCQkJKDB4MSA8PCAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMCArIDgpIHwKLQkJCQkweDEgPDwgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDEgKyA4KSk7Ci0JCX0KLQkJaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQkJVkZFMzFfT1VUUFVUX01PREVfUFJJTUFSWSkgewotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMV0pOwotCQl9Ci0JCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTMxX09VVFBVVF9NT0RFX1NFQ09OREFSWSkgewotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMV0pOwotCQl9Ci0JfQotCi0JdmZlMzFfY3RybC0+dmZlX2NhcHR1cmVfY291bnQgPSBudW1fZnJhbWVzX2NhcHR1cmU7Ci0KLQltc21fY2FtZXJhX2lvX3coaXJxX2NvbXBfbWFzaywgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ09NUF9NQVNLKTsKLQltc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ09NUF9NQVNLKTsKLQltc21fY2FtaW9fYnVzX3NjYWxlX2NmZygKLQkJcG1jdGwtPnNkYXRhLT5wZGF0YS0+Y2FtX2J1c19zY2FsZV90YWJsZSwgU19DQVBUVVJFKTsKLQotCXZmZTMxX3N0YXJ0X2NvbW1vbigpOwotCS8qIGZvciBkZWJ1ZyAqLwotCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgMHgxOEMpOwotCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgMHgxODgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZmZTMxX3N0YXJ0KHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsKQotewotCXVpbnQzMl90IGlycV9jb21wX21hc2sgPSAwOwotCi0JaXJxX2NvbXBfbWFzawk9Ci0JCW1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DT01QX01BU0spOwotCi0JaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJiBWRkUzMV9PVVRQVVRfTU9ERV9QUklNQVJZKSB7Ci0JCWlycV9jb21wX21hc2sgfD0gKDB4MSA8PCB2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwIHwKLQkJCTB4MSA8PCB2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxKTsKLQl9IGVsc2UgaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQlWRkUzMV9PVVRQVVRfTU9ERV9QUklNQVJZX0FMTF9DSE5MUykgewotCQlpcnFfY29tcF9tYXNrIHw9ICgweDEgPDwgdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMCB8Ci0JCQkweDEgPDwgdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMSB8Ci0JCQkweDEgPDwgdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMik7Ci0JfQotCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYgVkZFMzFfT1VUUFVUX01PREVfU0VDT05EQVJZKSB7Ci0JCWlycV9jb21wX21hc2sgfD0gKDB4MSA8PCAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMCArIDgpIHwKLQkJCTB4MSA8PCAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSArIDgpKTsKLQl9IGVsc2UgaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQlWRkUzMV9PVVRQVVRfTU9ERV9TRUNPTkRBUllfQUxMX0NITkxTKSB7Ci0JCWlycV9jb21wX21hc2sgfD0gKDB4MSA8PCAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMCArIDgpIHwKLQkJCTB4MSA8PCAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSArIDgpIHwKLQkJCTB4MSA8PCAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMiArIDgpKTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGlycV9jb21wX21hc2ssIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NPTVBfTUFTSyk7Ci0KLQlzd2l0Y2ggKHZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlKSB7Ci0JY2FzZSBWRkVfT1VUUFVUU19QUkVWSUVXOgotCWNhc2UgVkZFX09VVFBVVFNfUFJFVklFV19BTkRfVklERU86Ci0JCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTMxX09VVFBVVF9NT0RFX1BSSU1BUlkpIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxXSk7Ci0JCX0gZWxzZSBpZiAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCQlWRkUzMV9PVVRQVVRfTU9ERV9QUklNQVJZX0FMTF9DSE5MUykgewotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwXSk7Ci0JCQltc21fY2FtZXJhX2lvX3coMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDFdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMl0pOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTMxX09VVFBVVF9NT0RFX1NFQ09OREFSWSkgewotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwXSk7Ci0JCQltc21fY2FtZXJhX2lvX3coMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDFdKTsKLQkJfSBlbHNlIGlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTMxX09VVFBVVF9NT0RFX1NFQ09OREFSWV9BTExfQ0hOTFMpIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxXSk7Ci0JCQltc21fY2FtZXJhX2lvX3coMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDJdKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JbXNtX2NhbWlvX2J1c19zY2FsZV9jZmcoCi0JCXBtY3RsLT5zZGF0YS0+cGRhdGEtPmNhbV9idXNfc2NhbGVfdGFibGUsIFNfUFJFVklFVyk7Ci0JdmZlMzFfc3RhcnRfY29tbW9uKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3VwZGF0ZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAodmZlMzFfY3RybC0+dXBkYXRlX2xhKSB7Ci0JCWlmICghbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWMzFfTEFfT0ZGKSkKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX0xBX09GRik7Ci0JCWVsc2UKLQkJCW1zbV9jYW1lcmFfaW9fdygwLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX0xBX09GRik7Ci0JCXZmZTMxX2N0cmwtPnVwZGF0ZV9sYSA9IGZhbHNlOwotCX0KLQotCWlmICh2ZmUzMV9jdHJsLT51cGRhdGVfZ2FtbWEpIHsKLQkJaWYgKCFtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9SR0JfR19PRkYpKQotCQkJbXNtX2NhbWVyYV9pb193KDcsIHZmZTMxX2N0cmwtPnZmZWJhc2UrVjMxX1JHQl9HX09GRik7Ci0JCWVsc2UKLQkJCW1zbV9jYW1lcmFfaW9fdygwLCB2ZmUzMV9jdHJsLT52ZmViYXNlK1YzMV9SR0JfR19PRkYpOwotCQl2ZmUzMV9jdHJsLT51cGRhdGVfZ2FtbWEgPSBmYWxzZTsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMzFfY3RybC0+dXBkYXRlX2Fja19sb2NrLCBmbGFncyk7Ci0JdmZlMzFfY3RybC0+dXBkYXRlX2Fja19wZW5kaW5nID0gVFJVRTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMV9jdHJsLT51cGRhdGVfYWNrX2xvY2ssIGZsYWdzKTsKLQkvKiBFbnN1cmUgdGhlIHdyaXRlIG9yZGVyIHdoaWxlIHdyaXRpbmcKLQl0byB0aGUgY29tbWFuZCByZWdpc3RlciB1c2luZyB0aGUgYmFycmllciAqLwotCW1zbV9jYW1lcmFfaW9fd19tYigxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX1JFR19VUERBVEVfQ01EKTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3N5bmNfdGltZXJfc3RvcCh2b2lkKQotewotCXVpbnQzMl90IHZhbHVlID0gMDsKLQl2ZmUzMV9jdHJsLT5zeW5jX3RpbWVyX3N0YXRlID0gMDsKLQlpZiAodmZlMzFfY3RybC0+c3luY190aW1lcl9udW1iZXIgPT0gMCkKLQkJdmFsdWUgPSAweDEwMDAwOwotCWVsc2UgaWYgKHZmZTMxX2N0cmwtPnN5bmNfdGltZXJfbnVtYmVyID09IDEpCi0JCXZhbHVlID0gMHgyMDAwMDsKLQllbHNlIGlmICh2ZmUzMV9jdHJsLT5zeW5jX3RpbWVyX251bWJlciA9PSAyKQotCQl2YWx1ZSA9IDB4NDAwMDA7Ci0KLQkvKiBUaW1lciBTdG9wICovCi0JbXNtX2NhbWVyYV9pb193KHZhbHVlLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX1NZTkNfVElNRVJfT0ZGKTsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfc3luY190aW1lcl9zdGFydChjb25zdCB1aW50MzJfdCAqdGJsKQotewotCS8qIHNldCBiaXQgOCBmb3IgYXV0byBpbmNyZW1lbnQuICovCi0JdWludDMyX3QgdmFsdWUgPSAxOwotCXVpbnQzMl90IHZhbDsKLQotCXZmZTMxX2N0cmwtPnN5bmNfdGltZXJfc3RhdGUgPSAqdGJsKys7Ci0JdmZlMzFfY3RybC0+c3luY190aW1lcl9yZXBlYXRfY291bnQgPSAqdGJsKys7Ci0JdmZlMzFfY3RybC0+c3luY190aW1lcl9udW1iZXIgPSAqdGJsKys7Ci0JQ0RCRygiJXMgdGltZXJfc3RhdGUgJWQsIHJlcGVhdF9jbnQgJWQgdGltZXIgbnVtYmVyICVkXG4iLAotCQkgX19mdW5jX18sIHZmZTMxX2N0cmwtPnN5bmNfdGltZXJfc3RhdGUsCi0JCSB2ZmUzMV9jdHJsLT5zeW5jX3RpbWVyX3JlcGVhdF9jb3VudCwKLQkJIHZmZTMxX2N0cmwtPnN5bmNfdGltZXJfbnVtYmVyKTsKLQotCWlmICh2ZmUzMV9jdHJsLT5zeW5jX3RpbWVyX3N0YXRlKSB7IC8qIFN0YXJ0IFRpbWVyICovCi0JCXZhbHVlID0gdmFsdWUgPDwgdmZlMzFfY3RybC0+c3luY190aW1lcl9udW1iZXI7Ci0JfSBlbHNlIHsgLyogU3RvcCBUaW1lciAqLwotCQlDREJHKCJGYWlsZWQgdG8gU3RhcnQgdGltZXJcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogVGltZXIgU3RhcnQgKi8KLQltc21fY2FtZXJhX2lvX3codmFsdWUsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWMzFfU1lOQ19USU1FUl9PRkYpOwotCS8qIFN5bmMgVGltZXIgTGluZSBTdGFydCAqLwotCXZhbHVlID0gKnRibCsrOwotCW1zbV9jYW1lcmFfaW9fdyh2YWx1ZSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9TWU5DX1RJTUVSX09GRiArCi0JCTQgKyAoKHZmZTMxX2N0cmwtPnN5bmNfdGltZXJfbnVtYmVyKSAqIDEyKSk7Ci0JLyogU3luYyBUaW1lciBQaXhlbCBTdGFydCAqLwotCXZhbHVlID0gKnRibCsrOwotCW1zbV9jYW1lcmFfaW9fdyh2YWx1ZSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9TWU5DX1RJTUVSX09GRiArCi0JCSA4ICsgKCh2ZmUzMV9jdHJsLT5zeW5jX3RpbWVyX251bWJlcikgKiAxMikpOwotCS8qIFN5bmMgVGltZXIgUGl4ZWwgRHVyYXRpb24gKi8KLQl2YWx1ZSA9ICp0YmwrKzsKLQl2YWwgPSB2ZmVfY2xrX3JhdGUgLyAxMDAwMDsKLQl2YWwgPSAxMDAwMDAwMCAvIHZhbDsKLQl2YWwgPSB2YWx1ZSAqIDEwMDAwIC8gdmFsOwotCUNEQkcoIiVzOiBQaXhlbCBDbGsgQ3ljbGVzISEhICVkXG4iLCBfX2Z1bmNfXywgdmFsKTsKLQltc21fY2FtZXJhX2lvX3codmFsLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX1NZTkNfVElNRVJfT0ZGICsKLQkJMTIgKyAoKHZmZTMxX2N0cmwtPnN5bmNfdGltZXJfbnVtYmVyKSAqIDEyKSk7Ci0JLyogVGltZXIwIEFjdGl2ZSBIaWdoL0xPVyAqLwotCXZhbHVlID0gKnRibCsrOwotCW1zbV9jYW1lcmFfaW9fdyh2YWx1ZSwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9TWU5DX1RJTUVSX1BPTEFSSVRZX09GRik7Ci0JLyogU2VsZWN0cyBzeW5jIHRpbWVyIDAgb3V0cHV0IHRvIGRyaXZlIG9udG8gdGltZXIxIHBvcnQgKi8KLQl2YWx1ZSA9IDA7Ci0JbXNtX2NhbWVyYV9pb193KHZhbHVlLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX1RJTUVSX1NFTEVDVF9PRkYpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9wcm9ncmFtX2RtaV9jZmcoZW51bSBWRkUzMV9ETUlfUkFNX1NFTCBiYW5rU2VsKQotewotCS8qIHNldCBiaXQgOCBmb3IgYXV0byBpbmNyZW1lbnQuICovCi0JdWludDMyX3QgdmFsdWUgPSBWRkVfRE1JX0NGR19ERUZBVUxUOwotCXZhbHVlICs9ICh1aW50MzJfdCliYW5rU2VsOwotCUNEQkcoIiVzOiBiYW5rc2VsID0gJWRcbiIsIF9fZnVuY19fLCBiYW5rU2VsKTsKLQotCW1zbV9jYW1lcmFfaW9fdyh2YWx1ZSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfQ0ZHKTsKLQkvKiBieSBkZWZhdWx0LCBhbHdheXMgc3RhcnRzIHdpdGggb2Zmc2V0IDAuKi8KLQltc21fY2FtZXJhX2lvX3coMCwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfQUREUik7Ci19Ci1zdGF0aWMgdm9pZCB2ZmUzMV93cml0ZV9nYW1tYV9jZmcoZW51bSBWRkUzMV9ETUlfUkFNX1NFTCBjaGFubmVsX3NlbCwKLQkJCQkJCWNvbnN0IHVpbnQzMl90ICp0YmwpCi17Ci0JaW50IGk7Ci0JdWludDMyX3QgdmFsdWUsIHZhbHVlMSwgdmFsdWUyOwotCXZmZTMxX3Byb2dyYW1fZG1pX2NmZyhjaGFubmVsX3NlbCk7Ci0JZm9yIChpID0gMCA7IGkgPCAoVkZFMzFfR0FNTUFfTlVNX0VOVFJJRVMvMikgOyBpKyspIHsKLQkJdmFsdWUgPSAqdGJsKys7Ci0JCXZhbHVlMSA9IHZhbHVlICYgMHgwMDAwRkZGRjsKLQkJdmFsdWUyID0gKHZhbHVlICYgMHhGRkZGMDAwMCk+PjE2OwotCQltc21fY2FtZXJhX2lvX3coKHZhbHVlMSksCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0RNSV9EQVRBX0xPKTsKLQkJbXNtX2NhbWVyYV9pb193KCh2YWx1ZTIpLAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfREFUQV9MTyk7Ci0JfQotCXZmZTMxX3Byb2dyYW1fZG1pX2NmZyhOT19NRU1fU0VMRUNURUQpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9yZWFkX2dhbW1hX2NmZyhlbnVtIFZGRTMxX0RNSV9SQU1fU0VMIGNoYW5uZWxfc2VsLAotCXVpbnQzMl90ICp0YmwpCi17Ci0JaW50IGk7Ci0JdmZlMzFfcHJvZ3JhbV9kbWlfY2ZnKGNoYW5uZWxfc2VsKTsKLQlDREJHKCIlczogR2FtbWEgdGFibGUgY2hhbm5lbDogJWRcbiIsIF9fZnVuY19fLCBjaGFubmVsX3NlbCk7Ci0JZm9yIChpID0gMCA7IGkgPCBWRkUzMV9HQU1NQV9OVU1fRU5UUklFUyA7IGkrKykgewotCQkqdGJsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0RBVEFfTE8pOwotCQlDREJHKCIlczogJTA4eFxuIiwgX19mdW5jX18sICp0YmwpOwotCQl0YmwrKzsKLQl9Ci0JdmZlMzFfcHJvZ3JhbV9kbWlfY2ZnKE5PX01FTV9TRUxFQ1RFRCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3dyaXRlX2xhX2NmZyhlbnVtIFZGRTMxX0RNSV9SQU1fU0VMIGNoYW5uZWxfc2VsLAotCQkJCQkJY29uc3QgdWludDMyX3QgKnRibCkKLXsKLQl1aW50MzJfdCBpOwotCXVpbnQzMl90IHZhbHVlLCB2YWx1ZTEsIHZhbHVlMjsKLQotCXZmZTMxX3Byb2dyYW1fZG1pX2NmZyhjaGFubmVsX3NlbCk7Ci0JZm9yIChpID0gMCA7IGkgPCAoVkZFMzFfTEFfVEFCTEVfTEVOR1RILzIpIDsgaSsrKSB7Ci0JCXZhbHVlID0gKnRibCsrOwotCQl2YWx1ZTEgPSB2YWx1ZSAmIDB4MDAwMEZGRkY7Ci0JCXZhbHVlMiA9ICh2YWx1ZSAmIDB4RkZGRjAwMDApPj4xNjsKLQkJbXNtX2NhbWVyYV9pb193KCh2YWx1ZTEpLAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfREFUQV9MTyk7Ci0JCW1zbV9jYW1lcmFfaW9fdygodmFsdWUyKSwKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0RBVEFfTE8pOwotCX0KLQl2ZmUzMV9wcm9ncmFtX2RtaV9jZmcoTk9fTUVNX1NFTEVDVEVEKTsKLX0KLQotc3RhdGljIHN0cnVjdCB2ZmUzMV9vdXRwdXRfY2ggKnZmZTMxX2dldF9jaChpbnQgcGF0aCkKLXsKLQlzdHJ1Y3QgdmZlMzFfb3V0cHV0X2NoICpjaCA9IE5VTEw7Ci0KLQlpZiAocGF0aCA9PSBWRkVfTVNHX09VVFBVVF9QUklNQVJZKQotCQljaCA9ICZ2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDA7Ci0JZWxzZSBpZiAocGF0aCA9PSBWRkVfTVNHX09VVFBVVF9TRUNPTkRBUlkpCi0JCWNoID0gJnZmZTMxX2N0cmwtPm91dHBhdGgub3V0MTsKLQllbHNlCi0JCXByX2VycigiJXM6IEludmFsaWQgcGF0aCAlZFxuIiwgX19mdW5jX18sIHBhdGgpOwotCi0JQlVHX09OKGNoID09IE5VTEwpOwotCXJldHVybiBjaDsKLX0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2ZyZWVfYnVmICp2ZmUzMV9jaGVja19mcmVlX2J1ZmZlcihpbnQgaWQsIGludCBwYXRoKQotewotCXN0cnVjdCB2ZmUzMV9vdXRwdXRfY2ggKm91dGNoID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmICpiID0gTlVMTDsKLQl1aW50MzJfdCBpbnN0X2hhbmRsZSA9IDA7Ci0KLQlpZiAocGF0aCA9PSBWRkVfTVNHX09VVFBVVF9QUklNQVJZKQotCQlpbnN0X2hhbmRsZSA9IHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5pbnN0X2hhbmRsZTsKLQllbHNlCi0JCWluc3RfaGFuZGxlID0gdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmluc3RfaGFuZGxlOwotCi0JdmZlMzFfc3ViZGV2X25vdGlmeShpZCwgcGF0aCwgaW5zdF9oYW5kbGUpOwotCW91dGNoID0gdmZlMzFfZ2V0X2NoKHBhdGgpOwotCWlmIChvdXRjaC0+ZnJlZV9idWYuY2hfcGFkZHJbMF0pCi0JCWIgPSAmb3V0Y2gtPmZyZWVfYnVmOwotCXJldHVybiBiOwotfQotc3RhdGljIGludCB2ZmUzMV9jb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycyhpbnQgaWQsIGludCBwYXRoKQotewotCXN0cnVjdCB2ZmUzMV9vdXRwdXRfY2ggKm91dGNoID0gTlVMTDsKLQlpbnQgcmMgPSAwOwotCXVpbnQzMl90IGluc3RfaGFuZGxlID0gMDsKLQotCWlmIChwYXRoID09IFZGRV9NU0dfT1VUUFVUX1BSSU1BUlkpCi0JCWluc3RfaGFuZGxlID0gdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmluc3RfaGFuZGxlOwotCWVsc2UKLQkJaW5zdF9oYW5kbGUgPSB2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuaW5zdF9oYW5kbGU7Ci0KLQl2ZmUzMV9zdWJkZXZfbm90aWZ5KGlkLCBwYXRoLCBpbnN0X2hhbmRsZSk7Ci0Jb3V0Y2ggPSB2ZmUzMV9nZXRfY2gocGF0aCk7Ci0JaWYgKG91dGNoLT5waW5nLmNoX3BhZGRyWzBdICYmIG91dGNoLT5wb25nLmNoX3BhZGRyWzBdKSB7Ci0JCS8qIENvbmZpZ3VyZSBQcmV2aWV3IFBpbmcgUG9uZyAqLwotCQlDREJHKCIlcyBDb25maWd1cmUgcGluZy9wb25nIGFkZHJlc3MgZm9yICVkIiwKLQkJCV9fZnVuY19fLCBwYXRoKTsKLQkJdmZlMzFfcHV0X2NoX3BpbmdfYWRkcihvdXRjaC0+Y2gwLAotCQkJb3V0Y2gtPnBpbmcuY2hfcGFkZHJbMF0pOwotCQl2ZmUzMV9wdXRfY2hfcG9uZ19hZGRyKG91dGNoLT5jaDAsCi0JCQlvdXRjaC0+cG9uZy5jaF9wYWRkclswXSk7Ci0KLQkJaWYgKHZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlICE9Ci0JCQlWRkVfT1VUUFVUU19SQVcpIHsKLQkJCXZmZTMxX3B1dF9jaF9waW5nX2FkZHIob3V0Y2gtPmNoMSwKLQkJCQlvdXRjaC0+cGluZy5jaF9wYWRkclsxXSk7Ci0JCQl2ZmUzMV9wdXRfY2hfcG9uZ19hZGRyKG91dGNoLT5jaDEsCi0JCQkJb3V0Y2gtPnBvbmcuY2hfcGFkZHJbMV0pOwotCQl9Ci0KLQkJaWYgKG91dGNoLT5waW5nLm51bV9wbGFuZXMgPiAyKQotCQkJdmZlMzFfcHV0X2NoX3BpbmdfYWRkcihvdXRjaC0+Y2gyLAotCQkJCW91dGNoLT5waW5nLmNoX3BhZGRyWzJdKTsKLQkJaWYgKG91dGNoLT5wb25nLm51bV9wbGFuZXMgPiAyKQotCQkJdmZlMzFfcHV0X2NoX3BvbmdfYWRkcihvdXRjaC0+Y2gyLAotCQkJCW91dGNoLT5wb25nLmNoX3BhZGRyWzJdKTsKLQotCQkvKiBhdm9pZCBzdGFsZSBpbmZvICovCi0JCW1lbXNldCgmb3V0Y2gtPnBpbmcsIDAsIHNpemVvZihzdHJ1Y3QgbXNtX2ZyZWVfYnVmKSk7Ci0JCW1lbXNldCgmb3V0Y2gtPnBvbmcsIDAsIHNpemVvZihzdHJ1Y3QgbXNtX2ZyZWVfYnVmKSk7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlcyBwaW5nL3BvbmcgYWRkciBpcyBudWxsISEiLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9zZW5kX2lzcF9tc2coc3RydWN0IHZmZTMxX2N0cmxfdHlwZSAqdmN0cmwsCi0JdWludDMyX3QgaXNwX21zZ19pZCkKLXsKLQlzdHJ1Y3QgaXNwX21zZ19ldmVudCBpc3BfbXNnX2V2dDsKLQotCWlzcF9tc2dfZXZ0Lm1zZ19pZCA9IGlzcF9tc2dfaWQ7Ci0JaXNwX21zZ19ldnQuc29mX2NvdW50ID0gdmZlMzFfY3RybC0+dmZlRnJhbWVJZDsKLQl2NGwyX3N1YmRldl9ub3RpZnkoJnZjdHJsLT5zdWJkZXYsCi0JCU5PVElGWV9JU1BfTVNHX0VWVCwgKHZvaWQgKikmaXNwX21zZ19ldnQpOwotfQotCi1zdGF0aWMgaW50IHZmZTMxX3Byb2NfZ2VuZXJhbCgKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQlzdHJ1Y3QgbXNtX2lzcF9jbWQgKmNtZCkKLXsKLQlpbnQgaSAsIHJjID0gMDsKLQl1aW50MzJfdCBvbGRfdmFsID0gMCAsIG5ld192YWwgPSAwOwotCXVpbnQzMl90ICpjbWRwID0gTlVMTDsKLQl1aW50MzJfdCAqY21kcF9sb2NhbCA9IE5VTEw7Ci0JdWludDMyX3Qgc25hcHNob3RfY250ID0gMDsKLQl1aW50MzJfdCB0ZW1wMSA9IDAsIHRlbXAyID0gMDsKLQotCUNEQkcoInZmZTMxX3Byb2NfZ2VuZXJhbDogY21kSUQgPSAlcywgbGVuZ3RoID0gJWRcbiIsCi0JCXZmZTMxX2dlbmVyYWxfY21kW2NtZC0+aWRdLCBjbWQtPmxlbmd0aCk7Ci0Jc3dpdGNoIChjbWQtPmlkKSB7Ci0JY2FzZSBWRkVfQ01EX1JFU0VUOgotCQlwcl9pbmZvKCJ2ZmUzMV9wcm9jX2dlbmVyYWw6IGNtZElEID0gJXNcbiIsCi0JCQl2ZmUzMV9nZW5lcmFsX2NtZFtjbWQtPmlkXSk7Ci0JCXZmZTMxX3Jlc2V0KCk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9TVEFSVDoKLQkJcHJfaW5mbygidmZlMzFfcHJvY19nZW5lcmFsOiBjbWRJRCA9ICVzXG4iLAotCQkJdmZlMzFfZ2VuZXJhbF9jbWRbY21kLT5pZF0pOwotCQlpZiAoKHZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQkJVkZFX09VVFBVVFNfUFJFVklFV19BTkRfVklERU8pIHx8Ci0JCQkodmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0KLQkJCQlWRkVfT1VUUFVUU19QUkVWSUVXKSkKLQkJCS8qIENvbmZpZ3VyZSBwcmltYXJ5IGNoYW5uZWwgKi8KLQkJCXJjID0gdmZlMzFfY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoCi0JCQkJVkZFX01TR19TVEFSVCwgVkZFX01TR19PVVRQVVRfUFJJTUFSWSk7Ci0JCWVsc2UKLQkJCS8qIENvbmZpZ3VyZSBzZWNvbmRhcnkgY2hhbm5lbCAqLwotCQkJcmMgPSB2ZmUzMV9jb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycygKLQkJCQlWRkVfTVNHX1NUQVJULCBWRkVfTVNHX09VVFBVVF9TRUNPTkRBUlkpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzIGVycm9yIGNvbmZpZ3VyaW5nIHBpbmdwb25nIGJ1ZmZlcnMiCi0JCQkJIiBmb3IgcHJldmlldyIsIF9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJcmMgPSB2ZmUzMV9zdGFydChwbWN0bCk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9VUERBVEU6Ci0JCXZmZTMxX3VwZGF0ZSgpOwotCQlicmVhazsKLQljYXNlIFZGRV9DTURfQ0FQVFVSRV9SQVc6Ci0JCXByX2luZm8oIiVzOiBjbWRJRCA9IFZGRV9DTURfQ0FQVFVSRV9SQVdcbiIsIF9fZnVuY19fKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzbmFwc2hvdF9jbnQsICh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCXNpemVvZih1aW50MzJfdCkpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCXJjID0gdmZlMzFfY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoVkZFX01TR19DQVBUVVJFLAotCQkJVkZFX01TR19PVVRQVVRfUFJJTUFSWSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgZXJyb3IgY29uZmlndXJpbmcgcGluZ3BvbmcgYnVmZmVycyIKLQkJCQkiIGZvciBzbmFwc2hvdCIsIF9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJcmMgPSB2ZmUzMV9jYXB0dXJlX3JhdyhwbWN0bCwgc25hcHNob3RfY250KTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX0NBUFRVUkU6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmc25hcHNob3RfY250LCAodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQlzaXplb2YodWludDMyX3QpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCi0JCWlmICh2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PSBWRkVfT1VUUFVUU19KUEVHX0FORF9USFVNQiB8fAotCQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PSBWRkVfT1VUUFVUU19USFVNQl9BTkRfSlBFRykgewotCQkJaWYgKHNuYXBzaG90X2NudCAhPSAxKSB7Ci0JCQkJcHJfZXJyKCJvbmx5IHN1cHBvcnQgMSBpbmxpbmUgc25hcHNob3RcbiIpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQkJfQotCQkJLyogQ29uZmlndXJlIHByaW1hcnkgY2hhbm5lbCBmb3IgSlBFRyAqLwotCQkJcmMgPSB2ZmUzMV9jb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycygKLQkJCQlWRkVfTVNHX0pQRUdfQ0FQVFVSRSwKLQkJCQlWRkVfTVNHX09VVFBVVF9QUklNQVJZKTsKLQkJfSBlbHNlIHsKLQkJCS8qIENvbmZpZ3VyZSBwcmltYXJ5IGNoYW5uZWwgKi8KLQkJCXJjID0gdmZlMzFfY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoCi0JCQkJVkZFX01TR19DQVBUVVJFLAotCQkJCVZGRV9NU0dfT1VUUFVUX1BSSU1BUlkpOwotCQl9Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgZXJyb3IgY29uZmlndXJpbmcgcGluZ3BvbmcgYnVmZmVycyIKLQkJCQkiIGZvciBwcmltYXJ5IG91dHB1dCIsIF9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJLyogQ29uZmlndXJlIHNlY29uZGFyeSBjaGFubmVsICovCi0JCXJjID0gdmZlMzFfY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoVkZFX01TR19DQVBUVVJFLAotCQkJVkZFX01TR19PVVRQVVRfU0VDT05EQVJZKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlcyBlcnJvciBjb25maWd1cmluZyBwaW5ncG9uZyBidWZmZXJzIgotCQkJCSIgZm9yIHNlY29uZGFyeSBvdXRwdXQiLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCXJjID0gdmZlMzFfY2FwdHVyZShwbWN0bCwgc25hcHNob3RfY250KTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX1NUQVJUX1JFQ09SRElORzoKLQkJcHJfaW5mbygidmZlMzFfcHJvY19nZW5lcmFsOiBjbWRJRCA9ICVzXG4iLAotCQkJdmZlMzFfZ2VuZXJhbF9jbWRbY21kLT5pZF0pOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnRlbXAxLCAodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQkJc2l6ZW9mKHVpbnQzMl90KSkpIHsKLQkJCXByX2VycigiJXMgRXJyb3IgY29weWluZyBpbnN0X2hhbmRsZSBmb3IgcmVjb3JkaW5nXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKHZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQlWRkVfT1VUUFVUU19QUkVWSUVXX0FORF9WSURFTykgewotCQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmluc3RfaGFuZGxlID0gdGVtcDE7Ci0JCQlyYyA9IHZmZTMxX2NvbmZpZ3VyZV9waW5ncG9uZ19idWZmZXJzKAotCQkJCVZGRV9NU0dfU1RBUlRfUkVDT1JESU5HLAotCQkJCVZGRV9NU0dfT1VUUFVUX1NFQ09OREFSWSk7Ci0JCX0gZWxzZSBpZiAodmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0KLQkJCVZGRV9PVVRQVVRTX1ZJREVPX0FORF9QUkVWSUVXKSB7Ci0JCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuaW5zdF9oYW5kbGUgPSB0ZW1wMTsKLQkJCXJjID0gdmZlMzFfY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoCi0JCQkJVkZFX01TR19TVEFSVF9SRUNPUkRJTkcsCi0JCQkJVkZFX01TR19PVVRQVVRfUFJJTUFSWSk7Ci0JCX0KLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlcyBlcnJvciBjb25maWd1cmluZyBwaW5ncG9uZyBidWZmZXJzIgotCQkJCSIgZm9yIHZpZGVvIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlyYyA9IHZmZTMxX3N0YXJ0X3JlY29yZGluZyhwbWN0bCk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9TVE9QX1JFQ09SRElORzoKLQkJcHJfaW5mbygidmZlMzFfcHJvY19nZW5lcmFsOiBjbWRJRCA9ICVzXG4iLAotCQkJdmZlMzFfZ2VuZXJhbF9jbWRbY21kLT5pZF0pOwotCQlyYyA9IHZmZTMxX3N0b3BfcmVjb3JkaW5nKHBtY3RsKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX09QRVJBVElPTl9DRkc6Ci0JCWlmIChjbWQtPmxlbmd0aCAhPSBWMzFfT1BFUkFUSU9OX0NGR19MRU4pIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGttYWxsb2MoVjMxX09QRVJBVElPTl9DRkdfTEVOLCBHRlBfQVRPTUlDKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQlWMzFfT1BFUkFUSU9OX0NGR19MRU4pKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCXJjID0gdmZlMzFfb3BlcmF0aW9uX2NvbmZpZyhjbWRwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfU1RBVFNfQUVfU1RBUlQ6Ci0JCXJjID0gdmZlX3N0YXRzX2FlY19idWZfaW5pdChOVUxMKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogY2Fubm90IGNvbmZpZyBwaW5nL3BvbmcgYWRkcmVzcyBvZiBBRUMiLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlvbGRfdmFsIHw9IEFFX0JHX0VOQUJMRV9NQVNLOwotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIHZmZTMxX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCWNtZHAsICh2ZmUzMV9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9TVEFUU19BRl9TVEFSVDoKLQkJcmMgPSB2ZmVfc3RhdHNfYWZfYnVmX2luaXQoTlVMTCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGNhbm5vdCBjb25maWcgcGluZy9wb25nIGFkZHJlc3Mgb2YgQUYiLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlvbGRfdmFsIHw9IEFGX0JGX0VOQUJMRV9NQVNLOwotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIHZmZTMxX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCWNtZHAsICh2ZmUzMV9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9TVEFUU19BV0JfU1RBUlQ6Ci0JCXJjID0gdmZlX3N0YXRzX2F3Yl9idWZfaW5pdChOVUxMKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogY2Fubm90IGNvbmZpZyBwaW5nL3BvbmcgYWRkcmVzcyBvZiBBV0IiLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlvbGRfdmFsIHw9IEFXQl9FTkFCTEVfTUFTSzsKLQkJbXNtX2NhbWVyYV9pb193KG9sZF92YWwsCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyB2ZmUzMV9jbWRbY21kLT5pZF0ub2Zmc2V0LAotCQkJY21kcCwgKHZmZTMxX2NtZFtjbWQtPmlkXS5sZW5ndGgpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfU1RBVFNfSUhJU1RfU1RBUlQ6Ci0JCXJjID0gdmZlX3N0YXRzX2loaXN0X2J1Zl9pbml0KE5VTEwpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBjYW5ub3QgY29uZmlnIHBpbmcvcG9uZyBhZGRyZXNzIG9mIElISVNUIiwKLQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlvbGRfdmFsIHw9IElISVNUX0VOQUJMRV9NQVNLOwotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIHZmZTMxX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwLCAodmZlMzFfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9TVEFUU19SU19TVEFSVDoKLQkJcmMgPSB2ZmVfc3RhdHNfcnNfYnVmX2luaXQoTlVMTCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGNhbm5vdCBjb25maWcgcGluZy9wb25nIGFkZHJlc3Mgb2YgUlMiLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgdmZlMzFfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHAsICh2ZmUzMV9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX1NUQVRTX0NTX1NUQVJUOgotCQlyYyA9IHZmZV9zdGF0c19jc19idWZfaW5pdChOVUxMKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogY2Fubm90IGNvbmZpZyBwaW5nL3BvbmcgYWRkcmVzcyBvZiBDUyIsCi0JCQkJX19mdW5jX18pOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyB2ZmUzMV9jbWRbY21kLT5pZF0ub2Zmc2V0LAotCQkJY21kcCwgKHZmZTMxX2NtZFtjbWQtPmlkXS5sZW5ndGgpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfTUNFX1VQREFURToKLQljYXNlIFZGRV9DTURfTUNFX0NGRzoKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQkvKiBJbmNyZW1lbnRpbmcgd2l0aCA0IHNvIGFzIHRvIHBvaW50IHRvIHRoZSAybmQgUmVnaXN0ZXIgYXMKLQkJdGhlIDJuZCByZWdpc3RlciBoYXMgdGhlIG1jZV9lbmFibGUgYml0ICovCi0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQlWMzFfQ0hST01BX1NVUF9PRkYgKyA0KTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQluZXdfdmFsID0gKmNtZHBfbG9jYWw7Ci0JCW9sZF92YWwgJj0gTUNFX0VOX01BU0s7Ci0JCW5ld192YWwgPSBuZXdfdmFsIHwgb2xkX3ZhbDsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX0NIUk9NQV9TVVBfT0ZGICsgNCwKLQkJCSZuZXdfdmFsLCA0KTsKLQkJY21kcF9sb2NhbCArPSAxOwotCi0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQlWMzFfQ0hST01BX1NVUF9PRkYgKyA4KTsKLQkJbmV3X3ZhbCA9ICpjbWRwX2xvY2FsOwotCQlvbGRfdmFsICY9IE1DRV9RX0tfTUFTSzsKLQkJbmV3X3ZhbCA9IG5ld192YWwgfCBvbGRfdmFsOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWMzFfQ0hST01BX1NVUF9PRkYgKyA4LAotCQkJJm5ld192YWwsIDQpOwotCQljbWRwX2xvY2FsICs9IDE7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIHZmZTMxX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwX2xvY2FsLCAodmZlMzFfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQlicmVhazsKLQljYXNlIFZGRV9DTURfQ0hST01BX1NVUF9VUERBVEU6Ci0JY2FzZSBWRkVfQ01EX0NIUk9NQV9TVVBfQ0ZHOgotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwX2xvY2FsID0gY21kcDsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkodmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9DSFJPTUFfU1VQX09GRiwKLQkJCWNtZHBfbG9jYWwsIDQpOwotCi0JCWNtZHBfbG9jYWwgKz0gMTsKLQkJbmV3X3ZhbCA9ICpjbWRwX2xvY2FsOwotCQkvKiBJbmNyZW1lbnRpbmcgd2l0aCA0IHNvIGFzIHRvIHBvaW50IHRvIHRoZSAybmQgUmVnaXN0ZXIgYXMKLQkJICogdGhlIDJuZCByZWdpc3RlciBoYXMgdGhlIG1jZV9lbmFibGUgYml0Ci0JCSAqLwotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJVjMxX0NIUk9NQV9TVVBfT0ZGICsgNCk7Ci0JCW9sZF92YWwgJj0gfk1DRV9FTl9NQVNLOwotCQluZXdfdmFsID0gbmV3X3ZhbCB8IG9sZF92YWw7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9DSFJPTUFfU1VQX09GRiArIDQsCi0JCQkmbmV3X3ZhbCwgNCk7Ci0JCWNtZHBfbG9jYWwgKz0gMTsKLQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJVjMxX0NIUk9NQV9TVVBfT0ZGICsgOCk7Ci0JCW5ld192YWwgPSAqY21kcF9sb2NhbDsKLQkJb2xkX3ZhbCAmPSB+TUNFX1FfS19NQVNLOwotCQluZXdfdmFsID0gbmV3X3ZhbCB8IG9sZF92YWw7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9DSFJPTUFfU1VQX09GRiArIDgsCi0JCQkmbmV3X3ZhbCwgNCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX01FU0hfUk9MTF9PRkZfQ0ZHOgotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSAsIGNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwX2xvY2FsID0gY21kcDsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgdmZlMzFfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHBfbG9jYWwsIDE2KTsKLQkJY21kcF9sb2NhbCArPSA0OwotCQl2ZmUzMV9wcm9ncmFtX2RtaV9jZmcoUk9MTE9GRl9SQU0pOwotCQkvKiBmb3IgbG9vcCBmb3IgZXh0cmN0aW5nIGluaXQgdGFibGUuICovCi0JCWZvciAoaSA9IDA7IGkgPCAoVjMxX01FU0hfUk9MTF9PRkZfSU5JVF9UQUJMRV9TSVpFICogMik7IGkrKykgewotCQkJbXNtX2NhbWVyYV9pb193KCpjbWRwX2xvY2FsICwKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0RBVEFfTE8pOwotCQkJY21kcF9sb2NhbCsrOwotCQl9Ci0JCUNEQkcoImRvbmUgd3JpdGluZyBpbml0IHRhYmxlXG4iKTsKLQkJLyogYnkgZGVmYXVsdCwgYWx3YXlzIHN0YXJ0cyB3aXRoIG9mZnNldCAwLiAqLwotCQltc21fY2FtZXJhX2lvX3coVjMxX01FU0hfUk9MTF9PRkZfREVMVEFfVEFCTEVfT0ZGU0VULAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0RNSV9BRERSKTsKLQkJLyogZm9yIGxvb3AgZm9yIGV4dHJhY3RpbmcgZGVsdGEgdGFibGUuICovCi0JCWZvciAoaSA9IDA7IGkgPCAoVjMxX01FU0hfUk9MTF9PRkZfREVMVEFfVEFCTEVfU0laRSAqIDIpOyBpKyspIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygqY21kcF9sb2NhbCwKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0RBVEFfTE8pOwotCQkJY21kcF9sb2NhbCsrOwotCQl9Ci0JCXZmZTMxX3Byb2dyYW1fZG1pX2NmZyhOT19NRU1fU0VMRUNURUQpOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9HRVRfTUVTSF9ST0xMT0ZGX1RBQkxFOgotCQl0ZW1wMSA9IHNpemVvZih1aW50MzJfdCkgKiAoKFYzMV9NRVNIX1JPTExfT0ZGX0lOSVRfVEFCTEVfU0laRSAqCi0JCQkyKSArIChWMzFfTUVTSF9ST0xMX09GRl9ERUxUQV9UQUJMRV9TSVpFICogMikpOwotCQlpZiAoY21kLT5sZW5ndGggIT0gdGVtcDEpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGt6YWxsb2ModGVtcDEsIEdGUF9LRVJORUwpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0JCXZmZTMxX3Byb2dyYW1fZG1pX2NmZyhST0xMT0ZGX1JBTSk7Ci0JCUNEQkcoIiVzOiBNZXNoIFJvbGxvZmYgaW5pdCBUYWJsZVxuIiwgX19mdW5jX18pOwotCQlmb3IgKGkgPSAwOyBpIDwgKFYzMV9NRVNIX1JPTExfT0ZGX0lOSVRfVEFCTEVfU0laRSAqIDIpOyBpKyspIHsKLQkJCSpjbWRwX2xvY2FsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0RNSV9EQVRBX0xPKTsKLQkJCUNEQkcoIiVzOiAlMDh4XG4iLCBfX2Z1bmNfXywgKmNtZHBfbG9jYWwpOwotCQkJY21kcF9sb2NhbCsrOwotCQl9Ci0JCW1zbV9jYW1lcmFfaW9fdyhWMzFfTUVTSF9ST0xMX09GRl9ERUxUQV9UQUJMRV9PRkZTRVQsCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0RNSV9BRERSKTsKLQkJQ0RCRygiJXM6IE1lc2ggUm9sbG9mZiBEZWx0YSBUYWJsZVxuIiwgX19mdW5jX18pOwotCQlmb3IgKGkgPSAwOyBpIDwgKFYzMV9NRVNIX1JPTExfT0ZGX0RFTFRBX1RBQkxFX1NJWkUgKiAyKTsgaSsrKSB7Ci0JCQkqY21kcF9sb2NhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfREFUQV9MTyk7Ci0JCQlDREJHKCIlczogJTA4eFxuIiwgX19mdW5jX18sICpjbWRwX2xvY2FsKTsKLQkJCWNtZHBfbG9jYWwrKzsKLQkJfQotCQlDREJHKCJkb25lIHJlYWRpbmcgZGVsdGEgdGFibGVcbiIpOwotCQl2ZmUzMV9wcm9ncmFtX2RtaV9jZmcoTk9fTUVNX1NFTEVDVEVEKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksIGNtZHAsCi0JCQl0ZW1wMSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX0xBX0NGRzoKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwX2xvY2FsID0gY21kcDsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgdmZlMzFfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHBfbG9jYWwsICh2ZmUzMV9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0KLQkJY21kcF9sb2NhbCArPSAxOwotCQl2ZmUzMV93cml0ZV9sYV9jZmcoTFVNQV9BREFQVF9MVVRfUkFNX0JBTkswLCBjbWRwX2xvY2FsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfTEFfVVBEQVRFOgotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0KLQkJY21kcF9sb2NhbCA9IGNtZHAgKyAxOwotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWMzFfTEFfT0ZGKTsKLQkJaWYgKG9sZF92YWwgIT0gMHgwKQotCQkJdmZlMzFfd3JpdGVfbGFfY2ZnKExVTUFfQURBUFRfTFVUX1JBTV9CQU5LMCwKLQkJCQljbWRwX2xvY2FsKTsKLQkJZWxzZQotCQkJdmZlMzFfd3JpdGVfbGFfY2ZnKExVTUFfQURBUFRfTFVUX1JBTV9CQU5LMSwKLQkJCQljbWRwX2xvY2FsKTsKLQkJdmZlMzFfY3RybC0+dXBkYXRlX2xhID0gdHJ1ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfR0VUX0xBX1RBQkxFOgotCQl0ZW1wMSA9IHNpemVvZih1aW50MzJfdCkgKiBWRkUzMV9MQV9UQUJMRV9MRU5HVEggLyAyOwotCQlpZiAoY21kLT5sZW5ndGggIT0gdGVtcDEpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGt6YWxsb2ModGVtcDEsIEdGUF9LRVJORUwpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0JCWlmIChtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9MQV9PRkYpKQotCQkJdmZlMzFfcHJvZ3JhbV9kbWlfY2ZnKExVTUFfQURBUFRfTFVUX1JBTV9CQU5LMSk7Ci0JCWVsc2UKLQkJCXZmZTMxX3Byb2dyYW1fZG1pX2NmZyhMVU1BX0FEQVBUX0xVVF9SQU1fQkFOSzApOwotCQlmb3IgKGkgPSAwIDsgaSA8IChWRkUzMV9MQV9UQUJMRV9MRU5HVEggLyAyKSA7IGkrKykgewotCQkJKmNtZHBfbG9jYWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0RBVEFfTE8pOwotCQkJKmNtZHBfbG9jYWwgfD0gKG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCQlWRkVfRE1JX0RBVEFfTE8pKSA8PCAxNjsKLQkJCWNtZHBfbG9jYWwrKzsKLQkJfQotCQl2ZmUzMV9wcm9ncmFtX2RtaV9jZmcoTk9fTUVNX1NFTEVDVEVEKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksIGNtZHAsCi0JCQl0ZW1wMSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX1NLX0VOSEFOX0NGRzoKLQljYXNlIFZGRV9DTURfU0tfRU5IQU5fVVBEQVRFOgotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQltc21fY2FtZXJhX2lvX21lbWNweSh2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX1NDRV9PRkYsCi0JCQljbWRwLCBWMzFfU0NFX0xFTik7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0xJVkVTSE9UOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJnRlbXAxLCAodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQkJc2l6ZW9mKHVpbnQzMl90KSkpIHsKLQkJCXByX2VycigiJXMgRXJyb3IgY29weWluZyBpbnN0X2hhbmRsZSBmb3IgbGl2ZXNob3QgIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5pbnN0X2hhbmRsZSA9IHRlbXAxOwotCQkvKiBDb25maWd1cmUgcHJpbWFyeSBjaGFubmVsICovCi0JCXJjID0gdmZlMzFfY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoVkZFX01TR19DQVBUVVJFLAotCQkJVkZFX01TR19PVVRQVVRfUFJJTUFSWSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgZXJyb3IgY29uZmlndXJpbmcgcGluZ3BvbmcgYnVmZmVycyIKLQkJCQkiIGZvciBwcmltYXJ5IG91dHB1dCIsIF9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJdmZlMzFfc3RhcnRfbGl2ZXNob3QocG1jdGwpOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9ERU1PU0FJQ1YzOgotCQlpZiAoY21kLT5sZW5ndGggIT0gVjMxX0RFTU9TQUlDVjNfTEVOKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQluZXdfdmFsID0gKmNtZHBfbG9jYWw7Ci0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX0RFTU9TQUlDVjNfT0ZGKTsKLQkJb2xkX3ZhbCAmPSBERU1PU0FJQ19NQVNLOwotCQluZXdfdmFsID0gbmV3X3ZhbCB8IG9sZF92YWw7Ci0JCSpjbWRwX2xvY2FsID0gbmV3X3ZhbDsKLQotCQltc21fY2FtZXJhX2lvX21lbWNweSh2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX0RFTU9TQUlDVjNfT0ZGLAotCQkJY21kcF9sb2NhbCwgVjMxX0RFTU9TQUlDVjNfTEVOKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfREVNT1NBSUNWM19VUERBVEU6Ci0JCWlmIChjbWQtPmxlbmd0aCAhPQotCQkJVjMxX0RFTU9TQUlDVjNfTEVOICogVjMxX0RFTU9TQUlDVjNfVVBfUkVHX0NOVCkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwX2xvY2FsID0gY21kcDsKLQkJbmV3X3ZhbCA9ICpjbWRwX2xvY2FsOwotCi0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9ERU1PU0FJQ1YzX09GRik7Ci0JCW9sZF92YWwgJj0gREVNT1NBSUNfTUFTSzsKLQkJbmV3X3ZhbCA9IG5ld192YWwgfCBvbGRfdmFsOwotCQkqY21kcF9sb2NhbCA9IG5ld192YWw7Ci0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkodmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9ERU1PU0FJQ1YzX09GRiwKLQkJCWNtZHBfbG9jYWwsIFYzMV9ERU1PU0FJQ1YzX0xFTik7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfREVNT1NBSUNWM19BQkNDX0NGRzoKLQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9ERU1PU0FJQ1YzX0FCRl9VUERBVEU6LyogMTE2IEFCRiB1cGRhdGUgICovCi0JY2FzZSBWRkVfQ01EX0RFTU9TQUlDVjNfQUJGX0NGRzogLyogMTA4IEFCRiBjb25maWcgICovCi0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQluZXdfdmFsID0gKmNtZHBfbG9jYWw7Ci0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX0RFTU9TQUlDVjNfT0ZGKTsKLQkJb2xkX3ZhbCAmPSBBQkZfTUFTSzsKLQkJbmV3X3ZhbCA9IG5ld192YWwgfCBvbGRfdmFsOwotCQkqY21kcF9sb2NhbCA9IG5ld192YWw7Ci0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkodmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9ERU1PU0FJQ1YzX09GRiwKLQkJICAgIGNtZHBfbG9jYWwsIDQpOwotCi0JCWNtZHBfbG9jYWwgKz0gMTsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgdmZlMzFfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHBfbG9jYWwsICh2ZmUzMV9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0RFTU9TQUlDVjNfREJDQ19DRkc6Ci0JY2FzZSBWRkVfQ01EX0RFTU9TQUlDVjNfREJDQ19VUERBVEU6Ci0JCXJldHVybiAtRUlOVkFMOwotCi0JY2FzZSBWRkVfQ01EX0RFTU9TQUlDVjNfREJQQ19DRkc6Ci0JY2FzZSBWRkVfQ01EX0RFTU9TQUlDVjNfREJQQ19VUERBVEU6Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQluZXdfdmFsID0gKmNtZHBfbG9jYWw7Ci0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX0RFTU9TQUlDVjNfT0ZGKTsKLQkJb2xkX3ZhbCAmPSBCUENfTUFTSzsKLQotCQluZXdfdmFsID0gbmV3X3ZhbCB8IG9sZF92YWw7Ci0JCSpjbWRwX2xvY2FsID0gbmV3X3ZhbDsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkodmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9ERU1PU0FJQ1YzX09GRiwKLQkJCQkJY21kcF9sb2NhbCwgVjMxX0RFTU9TQUlDVjNfTEVOKTsKLQkJY21kcF9sb2NhbCArPSAxOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWMzFfREVNT1NBSUNWM19EQlBDX0NGR19PRkYsCi0JCQljbWRwX2xvY2FsLCBWMzFfREVNT1NBSUNWM19EQlBDX0xFTik7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX1JHQl9HX0NGRzoKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkodmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9SR0JfR19PRkYsCi0JCQljbWRwLCA0KTsKLQkJY21kcCArPSAxOwotCi0JCXZmZTMxX3dyaXRlX2dhbW1hX2NmZyhSR0JMVVRfUkFNX0NIMF9CQU5LMCwgY21kcCk7Ci0JCXZmZTMxX3dyaXRlX2dhbW1hX2NmZyhSR0JMVVRfUkFNX0NIMV9CQU5LMCwgY21kcCk7Ci0JCXZmZTMxX3dyaXRlX2dhbW1hX2NmZyhSR0JMVVRfUkFNX0NIMl9CQU5LMCwgY21kcCk7Ci0JCWNtZHAgLT0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfUkdCX0dfVVBEQVRFOgotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwgKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsgVjMxX1JHQl9HX09GRik7Ci0JCWNtZHAgKz0gMTsKLQkJaWYgKG9sZF92YWwgIT0gMHgwKSB7Ci0JCQl2ZmUzMV93cml0ZV9nYW1tYV9jZmcoUkdCTFVUX1JBTV9DSDBfQkFOSzAsIGNtZHApOwotCQkJdmZlMzFfd3JpdGVfZ2FtbWFfY2ZnKFJHQkxVVF9SQU1fQ0gxX0JBTkswLCBjbWRwKTsKLQkJCXZmZTMxX3dyaXRlX2dhbW1hX2NmZyhSR0JMVVRfUkFNX0NIMl9CQU5LMCwgY21kcCk7Ci0JCX0gZWxzZSB7Ci0JCQl2ZmUzMV93cml0ZV9nYW1tYV9jZmcoUkdCTFVUX1JBTV9DSDBfQkFOSzEsIGNtZHApOwotCQkJdmZlMzFfd3JpdGVfZ2FtbWFfY2ZnKFJHQkxVVF9SQU1fQ0gxX0JBTksxLCBjbWRwKTsKLQkJCXZmZTMxX3dyaXRlX2dhbW1hX2NmZyhSR0JMVVRfUkFNX0NIMl9CQU5LMSwgY21kcCk7Ci0JCX0KLQkJdmZlMzFfY3RybC0+dXBkYXRlX2dhbW1hID0gVFJVRTsKLQkJY21kcCAtPSAxOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9HRVRfUkdCX0dfVEFCTEU6Ci0JCXRlbXAxID0gc2l6ZW9mKHVpbnQzMl90KSAqIFZGRTMxX0dBTU1BX05VTV9FTlRSSUVTICogMzsKLQkJaWYgKGNtZC0+bGVuZ3RoICE9IHRlbXAxKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHAgPSBremFsbG9jKHRlbXAxLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCi0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArIFYzMV9SR0JfR19PRkYpOwotCQl0ZW1wMiA9IG9sZF92YWwgPyBSR0JMVVRfUkFNX0NIMF9CQU5LMSA6Ci0JCQlSR0JMVVRfUkFNX0NIMF9CQU5LMDsKLQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQkJdmZlMzFfcmVhZF9nYW1tYV9jZmcodGVtcDIsCi0JCQkJY21kcF9sb2NhbCArIChWRkUzMV9HQU1NQV9OVU1fRU5UUklFUyAqIGkpKTsKLQkJCXRlbXAyICs9IDI7Ci0JCX0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksIGNtZHAsCi0JCQl0ZW1wMSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfU1RBVFNfQVdCX1NUT1A6Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJb2xkX3ZhbCAmPSB+QVdCX0VOQUJMRV9NQVNLOwotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9TVEFUU19BRV9TVE9QOgotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgJj0gfkFFX0JHX0VOQUJMRV9NQVNLOwotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9TVEFUU19BRl9TVE9QOgotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgJj0gfkFGX0JGX0VOQUJMRV9NQVNLOwotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCXJjID0gdmZlMzFfc3RhdHNfZmx1c2hfZW5xdWV1ZShNU01fU1RBVFNfVFlQRV9BRik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGRxIHN0YXRzIGJ1ZiBlcnIgPSAlZCIsCi0JCQkJICAgX19mdW5jX18sIHJjKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX1NUQVRTX0lISVNUX1NUT1A6Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJb2xkX3ZhbCAmPSB+SUhJU1RfRU5BQkxFX01BU0s7Ci0JCW1zbV9jYW1lcmFfaW9fdyhvbGRfdmFsLAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfU1RBVFNfUlNfU1RPUDoKLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlvbGRfdmFsICY9IH5SU19FTkFCTEVfTUFTSzsKLQkJbXNtX2NhbWVyYV9pb193KG9sZF92YWwsCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9TVEFUU19DU19TVE9QOgotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgJj0gfkNTX0VOQUJMRV9NQVNLOwotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX1NUT1A6Ci0JCXByX2luZm8oInZmZTMxX3Byb2NfZ2VuZXJhbDogY21kSUQgPSAlc1xuIiwKLQkJCXZmZTMxX2dlbmVyYWxfY21kW2NtZC0+aWRdKTsKLQkJdmZlMzFfc3RvcCgpOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9TWU5DX1RJTUVSX1NFVFRJTkc6Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLCAodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJdmZlMzFfc3luY190aW1lcl9zdGFydChjbWRwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfTU9EVUxFX0NGRzoKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJKmNtZHAgJj0gflNUQVRTX0VOQUJMRV9NQVNLOwotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgJj0gU1RBVFNfRU5BQkxFX01BU0s7Ci0JCSpjbWRwIHw9IG9sZF92YWw7Ci0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgdmZlMzFfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHAsICh2ZmUzMV9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX1pTTDoKLQkJcmMgPSB2ZmUzMV9jb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycyhWRkVfTVNHX1NUQVJULAotCQkJVkZFX01TR19PVVRQVVRfUFJJTUFSWSk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQlyYyA9IHZmZTMxX2NvbmZpZ3VyZV9waW5ncG9uZ19idWZmZXJzKFZGRV9NU0dfU1RBUlQsCi0JCQlWRkVfTVNHX09VVFBVVF9TRUNPTkRBUlkpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQotCQlyYyA9IHZmZTMxX3pzbChwbWN0bCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0FTRl9DRkc6Ci0JY2FzZSBWRkVfQ01EX0FTRl9VUERBVEU6Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLCAodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgdmZlMzFfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHAsICh2ZmUzMV9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCWNtZHBfbG9jYWwgPSBjbWRwICsgVjMxX0FTRl9MRU4vNDsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfR0VUX0hXX1ZFUlNJT046Ci0JCWlmIChjbWQtPmxlbmd0aCAhPSBWMzFfR0VUX0hXX1ZFUlNJT05fTEVOKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHAgPSBrbWFsbG9jKFYzMV9HRVRfSFdfVkVSU0lPTl9MRU4sIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJKmNtZHAgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQkJdmZlMzFfY3RybC0+dmZlYmFzZStWMzFfR0VUX0hXX1ZFUlNJT05fT0ZGKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksIGNtZHAsCi0JCQlWMzFfR0VUX0hXX1ZFUlNJT05fTEVOKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlicmVhazsKLQljYXNlIFZGRV9DTURfR0VUX1JFR19EVU1QOgotCQl0ZW1wMSA9IHNpemVvZih1aW50MzJfdCkgKiB2ZmUzMV9jdHJsLT5yZWdpc3Rlcl90b3RhbDsKLQkJaWYgKGNtZC0+bGVuZ3RoICE9IHRlbXAxKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHAgPSBrbWFsbG9jKHRlbXAxLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCW1zbV9jYW1lcmFfaW9fZHVtcCgKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UsIHZmZTMxX2N0cmwtPnJlZ2lzdGVyX3RvdGFsKjQpOwotCQlDREJHKCIlczogJXAgJXAgJWRcbiIsIF9fZnVuY19fLCAodm9pZCAqKWNtZHAsCi0JCQl2ZmUzMV9jdHJsLT52ZmViYXNlLCB0ZW1wMSk7Ci0JCW1lbWNweV9mcm9taW8oKHZvaWQgKiljbWRwLCB2ZmUzMV9jdHJsLT52ZmViYXNlLCB0ZW1wMSk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLCBjbWRwLCB0ZW1wMSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX0ZSQU1FX1NLSVBfQ0ZHOgotCQlpZiAoY21kLT5sZW5ndGggIT0gdmZlMzFfY21kW2NtZC0+aWRdLmxlbmd0aCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWNtZHAgPSBrbWFsbG9jKHZmZTMxX2NtZFtjbWQtPmlkXS5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwgKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIHZmZTMxX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwLCAodmZlMzFfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQl2ZmUzMV9jdHJsLT5mcmFtZV9za2lwX2NudCA9ICgodWludDMyX3QpCi0JCQkqY21kcCAmIFZGRV9GUkFNRV9TS0lQX1BFUklPRF9NQVNLKSArIDE7Ci0JCXZmZTMxX2N0cmwtPmZyYW1lX3NraXBfcGF0dGVybiA9ICh1aW50MzJfdCkoKihjbWRwICsgMikpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpZiAoY21kLT5sZW5ndGggIT0gdmZlMzFfY21kW2NtZC0+aWRdLmxlbmd0aCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWNtZHAgPSBrbWFsbG9jKHZmZTMxX2NtZFtjbWQtPmlkXS5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwgKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIHZmZTMxX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwLCAodmZlMzFfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQlicmVhazsKLQotCX0KLQotcHJvY19nZW5lcmFsX2RvbmU6Ci0Ja2ZyZWUoY21kcCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB2ZmUzMV9yZWFkX2lycV9zdGF0dXMoc3RydWN0IHZmZTMxX2lycV9zdGF0dXMgKm91dCkKLXsKLQl1aW50MzJfdCAqdGVtcDsKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yoc3RydWN0IHZmZTMxX2lycV9zdGF0dXMpKTsKLQl0ZW1wID0gKHVpbnQzMl90ICopKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX1NUQVRVU18wKTsKLQlvdXQtPnZmZUlycVN0YXR1czAgPSBtc21fY2FtZXJhX2lvX3IodGVtcCk7Ci0KLQl0ZW1wID0gKHVpbnQzMl90ICopKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX1NUQVRVU18xKTsKLQlvdXQtPnZmZUlycVN0YXR1czEgPSBtc21fY2FtZXJhX2lvX3IodGVtcCk7Ci0KLQl0ZW1wID0gKHVpbnQzMl90ICopKHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQ0FNSUZfU1RBVFVTKTsKLQlvdXQtPmNhbWlmU3RhdHVzID0gbXNtX2NhbWVyYV9pb19yKHRlbXApOwotCUNEQkcoImNhbWlmU3RhdHVzICA9IDB4JXhcbiIsIG91dC0+Y2FtaWZTdGF0dXMpOwotCi0JLyogY2xlYXIgdGhlIHBlbmRpbmcgaW50ZXJydXB0IG9mIHRoZSBzYW1lIGtpbmQuKi8KLQltc21fY2FtZXJhX2lvX3cob3V0LT52ZmVJcnFTdGF0dXMwLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DTEVBUl8wKTsKLQltc21fY2FtZXJhX2lvX3cob3V0LT52ZmVJcnFTdGF0dXMxLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DTEVBUl8xKTsKLQotCS8qIEVuc3VyZSB0aGUgd3JpdGUgb3JkZXIgd2hpbGUgd3JpdGluZwotCXRvIHRoZSBjb21tYW5kIHJlZ2lzdGVyIHVzaW5nIHRoZSBiYXJyaWVyICovCi0JbXNtX2NhbWVyYV9pb193X21iKDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NNRCk7Ci0KLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfcHJvY2Vzc19yZWdfdXBkYXRlX2lycSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAodmZlMzFfY3RybC0+cmVjb3JkaW5nX3N0YXRlID09IFZGRV9TVEFURV9TVEFSVF9SRVFVRVNURUQpIHsKLQkJaWYgKHZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQlWRkVfT1VUUFVUU19WSURFT19BTkRfUFJFVklFVykgewotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwXSk7Ci0JCQltc21fY2FtZXJhX2lvX3coMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDFdKTsKLQkJfSBlbHNlIGlmICh2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJVkZFX09VVFBVVFNfUFJFVklFV19BTkRfVklERU8pIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxXSk7Ci0JCX0KLQkJdmZlMzFfY3RybC0+cmVjb3JkaW5nX3N0YXRlID0gVkZFX1NUQVRFX1NUQVJURUQ7Ci0JCW1zbV9jYW1lcmFfaW9fd19tYigxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX1JFR19VUERBVEVfQ01EKTsKLQkJQ0RCRygic3RhcnQgdmlkZW8gdHJpZ2dlcmVkIC5cbiIpOwotCX0gZWxzZSBpZiAodmZlMzFfY3RybC0+cmVjb3JkaW5nX3N0YXRlID09Ci0JCVZGRV9TVEFURV9TVE9QX1JFUVVFU1RFRCkgewotCQlpZiAodmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0KLQkJCVZGRV9PVVRQVVRTX1ZJREVPX0FORF9QUkVWSUVXKSB7Ci0JCQltc21fY2FtZXJhX2lvX3coMCwgdmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDBdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygwLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMV0pOwotCQl9IGVsc2UgaWYgKHZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQlWRkVfT1VUUFVUU19QUkVWSUVXX0FORF9WSURFTykgewotCQkJbXNtX2NhbWVyYV9pb193KDAsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwXSk7Ci0JCQltc21fY2FtZXJhX2lvX3coMCwgdmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDFdKTsKLQkJfQotCQlDREJHKCJzdG9wIHZpZGVvIHRyaWdnZXJlZCAuXG4iKTsKLQl9Ci0KLQlpZiAodmZlMzFfY3RybC0+c3RhcnRfYWNrX3BlbmRpbmcgPT0gVFJVRSkgewotCQl2ZmUzMV9zZW5kX2lzcF9tc2codmZlMzFfY3RybCwgTVNHX0lEX1NUQVJUX0FDSyk7Ci0JCXZmZTMxX2N0cmwtPnN0YXJ0X2Fja19wZW5kaW5nID0gRkFMU0U7Ci0JfSBlbHNlIHsKLQkJaWYgKHZmZTMxX2N0cmwtPnJlY29yZGluZ19zdGF0ZSA9PQotCQkJVkZFX1NUQVRFX1NUT1BfUkVRVUVTVEVEKSB7Ci0JCQl2ZmUzMV9jdHJsLT5yZWNvcmRpbmdfc3RhdGUgPSBWRkVfU1RBVEVfU1RPUFBFRDsKLQkJCS8qIHJlcXVlc3QgYSByZWcgdXBkYXRlIGFuZCBzZW5kIFNUT1BfUkVDX0FDSwotCQkJICogd2hlbiB3ZSBwcm9jZXNzIHRoZSBuZXh0IHJlZyB1cGRhdGUgaXJxLgotCQkJICovCi0JCQltc21fY2FtZXJhX2lvX3dfbWIoMSwKLQkJCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkVHX1VQREFURV9DTUQpOwotCQl9IGVsc2UgaWYgKHZmZTMxX2N0cmwtPnJlY29yZGluZ19zdGF0ZSA9PQotCQkJVkZFX1NUQVRFX1NUT1BQRUQpIHsKLQkJCXZmZTMxX3NlbmRfaXNwX21zZyh2ZmUzMV9jdHJsLCBNU0dfSURfU1RPUF9SRUNfQUNLKTsKLQkJCXZmZTMxX2N0cmwtPnJlY29yZGluZ19zdGF0ZSA9IFZGRV9TVEFURV9JRExFOwotCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMV9jdHJsLT51cGRhdGVfYWNrX2xvY2ssIGZsYWdzKTsKLQkJaWYgKHZmZTMxX2N0cmwtPnVwZGF0ZV9hY2tfcGVuZGluZyA9PSBUUlVFKSB7Ci0JCQl2ZmUzMV9jdHJsLT51cGRhdGVfYWNrX3BlbmRpbmcgPSBGQUxTRTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCi0JCQkJJnZmZTMxX2N0cmwtPnVwZGF0ZV9hY2tfbG9jaywgZmxhZ3MpOwotCQkJdmZlMzFfc2VuZF9pc3BfbXNnKHZmZTMxX2N0cmwsIE1TR19JRF9VUERBVEVfQUNLKTsKLQkJfSBlbHNlIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCi0JCQkJJnZmZTMxX2N0cmwtPnVwZGF0ZV9hY2tfbG9jaywgZmxhZ3MpOwotCQl9Ci0JfQotCi0JaWYgKHZmZTMxX2N0cmwtPmxpdmVzaG90X3N0YXRlID09IFZGRV9TVEFURV9TVEFSVF9SRVFVRVNURUQpIHsKLQkJcHJfaW5mbygiJXMgZW5hYmxpbmcgbGl2ZXNob3Qgb3V0cHV0XG4iLCBfX2Z1bmNfXyk7Ci0JCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTMxX09VVFBVVF9NT0RFX1BSSU1BUlkpIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMxX0FYSV9XTV9DRkdbdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxXSk7Ci0JCQl2ZmUzMV9jdHJsLT5saXZlc2hvdF9zdGF0ZSA9IFZGRV9TVEFURV9TVEFSVEVEOwotCQl9Ci0JfQotCi0JaWYgKHZmZTMxX2N0cmwtPmxpdmVzaG90X3N0YXRlID09IFZGRV9TVEFURV9TVEFSVEVEKSB7Ci0JCXZmZTMxX2N0cmwtPnZmZV9jYXB0dXJlX2NvdW50LS07Ci0JCWlmICghdmZlMzFfY3RybC0+dmZlX2NhcHR1cmVfY291bnQpCi0JCQl2ZmUzMV9jdHJsLT5saXZlc2hvdF9zdGF0ZSA9IFZGRV9TVEFURV9TVE9QX1JFUVVFU1RFRDsKLQkJbXNtX2NhbWVyYV9pb193X21iKDEsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkVHX1VQREFURV9DTUQpOwotCX0gZWxzZSBpZiAodmZlMzFfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPT0gVkZFX1NUQVRFX1NUT1BfUkVRVUVTVEVEKSB7Ci0JCUNEQkcoIiVzOiBkaXNhYmxpbmcgbGl2ZXNob3Qgb3V0cHV0XG4iLCBfX2Z1bmNfXyk7Ci0JCWlmICh2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTMxX09VVFBVVF9NT0RFX1BSSU1BUlkpIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygwLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDBdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygwLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmUzMV9BWElfV01fQ0ZHW3ZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDFdKTsKLQkJCXZmZTMxX2N0cmwtPmxpdmVzaG90X3N0YXRlID0gVkZFX1NUQVRFX1NUT1BQRUQ7Ci0JCQltc21fY2FtZXJhX2lvX3dfbWIoMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX1JFR19VUERBVEVfQ01EKTsKLQkJfQotCX0gZWxzZSBpZiAodmZlMzFfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPT0gVkZFX1NUQVRFX1NUT1BQRUQpIHsKLQkJdmZlMzFfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPSBWRkVfU1RBVEVfSURMRTsKLQl9Ci0KLQlpZiAoKHZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09IFZGRV9PVVRQVVRTX1RIVU1CX0FORF9NQUlOKSB8fAotCQkodmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0gVkZFX09VVFBVVFNfTUFJTl9BTkRfVEhVTUIpIHx8Ci0JCSh2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PSBWRkVfT1VUUFVUU19USFVNQl9BTkRfSlBFRykgfHwKLQkJKHZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09IFZGRV9PVVRQVVRTX0pQRUdfQU5EX1RIVU1CKSkgewotCQkvKiBpbiBzbmFwc2hvdCBtb2RlICovCi0JCS8qIGxhdGVyIHdlIG5lZWQgdG8gYWRkIGNoZWNrIGZvciBsaXZlIHNuYXBzaG90IG1vZGUuICovCi0JCWlmICh2ZmUzMV9jdHJsLT5mcmFtZV9za2lwX3BhdHRlcm4gJiAoMHgxIDw8Ci0JCQkodmZlMzFfY3RybC0+c25hcHNob3RfZnJhbWVfY250ICUKLQkJCQl2ZmUzMV9jdHJsLT5mcmFtZV9za2lwX2NudCkpKSB7Ci0JCQkvKiBpZiBsYXN0IGZyYW1lIHRvIGJlIGNhcHR1cmVkOiAqLwotCQkJaWYgKHZmZTMxX2N0cmwtPnZmZV9jYXB0dXJlX2NvdW50ID09IDApIHsKLQkJCQkvKiBzdG9wIHRoZSBidXMgb3V0cHV0OndyaXRlIG1hc3RlciBlbmFibGUgPSAwKi8KLQkJCQlpZiAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCQkJCVZGRTMxX09VVFBVVF9NT0RFX1BSSU1BUlkpIHsKLQkJCQkJbXNtX2NhbWVyYV9pb193KDAsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT4KLQkJCQkJCW91dHBhdGgub3V0MC5jaDBdKTsKLQkJCQkJbXNtX2NhbWVyYV9pb193KDAsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT4KLQkJCQkJCW91dHBhdGgub3V0MC5jaDFdKTsKLQkJCQl9Ci0JCQkJaWYgKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQkJCQlWRkUzMV9PVVRQVVRfTU9ERV9TRUNPTkRBUlkpIHsKLQkJCQkJbXNtX2NhbWVyYV9pb193KDAsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT4KLQkJCQkJCW91dHBhdGgub3V0MS5jaDBdKTsKLQkJCQkJbXNtX2NhbWVyYV9pb193KDAsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJCQkJdmZlMzFfQVhJX1dNX0NGR1t2ZmUzMV9jdHJsLT4KLQkJCQkJCW91dHBhdGgub3V0MS5jaDFdKTsKLQkJCQl9Ci0JCQkJbXNtX2NhbWVyYV9pb193X21iCi0JCQkJKENBTUlGX0NPTU1BTkRfU1RPUF9BVF9GUkFNRV9CT1VOREFSWSwKLQkJCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0NBTUlGX0NPTU1BTkQpOwotCQkJCXZmZTMxX2N0cmwtPnNuYXBzaG90X2ZyYW1lX2NudCA9IC0xOwotCQkJCXZmZTMxX2N0cmwtPmZyYW1lX3NraXBfY250ID0gMzE7Ci0JCQkJdmZlMzFfY3RybC0+ZnJhbWVfc2tpcF9wYXR0ZXJuID0gMHhmZmZmZmZmZjsKLQkJCX0gLyppZiBzbmFwc2hvdCBjb3VudCBpcyAwKi8KLQkJfSAvKmlmIGZyYW1lIGlzIG5vdCBiZWluZyBkcm9wcGVkKi8KLQkJLyogdGhlbiBkbyByZWdfdXBkYXRlLiAqLwotCQltc21fY2FtZXJhX2lvX3coMSwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9SRUdfVVBEQVRFX0NNRCk7Ci0JfSAvKiBpZiBzbmFwc2hvdCBtb2RlLiAqLwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9zZXRfZGVmYXVsdF9yZWdfdmFsdWVzKHZvaWQpCi17Ci0JbXNtX2NhbWVyYV9pb193KDB4ODAwMDgwLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0RFTVVYX0dBSU5fMCk7Ci0JbXNtX2NhbWVyYV9pb193KDB4ODAwMDgwLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0RFTVVYX0dBSU5fMSk7Ci0JLyogV2hhdCB2YWx1ZSBzaG91bGQgd2UgcHJvZ3JhbSBDR0NfT1ZFUlJJREUgdG8/ICovCi0JbXNtX2NhbWVyYV9pb193KDB4RkZGRkYsIHZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQ0dDX09WRVJSSURFKTsKLQotCS8qIGRlZmF1bHQgZnJhbWUgZHJvcCBwZXJpb2QgYW5kIHBhdHRlcm4gKi8KLQltc21fY2FtZXJhX2lvX3coMHgxZiwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9GUkFNRURST1BfRU5DX1lfQ0ZHKTsKLQltc21fY2FtZXJhX2lvX3coMHgxZiwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9GUkFNRURST1BfRU5DX0NCQ1JfQ0ZHKTsKLQltc21fY2FtZXJhX2lvX3coMHhGRkZGRkZGRiwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9GUkFNRURST1BfRU5DX1lfUEFUVEVSTik7Ci0JbXNtX2NhbWVyYV9pb193KDB4RkZGRkZGRkYsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfRlJBTUVEUk9QX0VOQ19DQkNSX1BBVFRFUk4pOwotCW1zbV9jYW1lcmFfaW9fdygweDFmLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0ZSQU1FRFJPUF9WSUVXX1kpOwotCW1zbV9jYW1lcmFfaW9fdygweDFmLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0ZSQU1FRFJPUF9WSUVXX0NCQ1IpOwotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGRkZGLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0ZSQU1FRFJPUF9WSUVXX1lfUEFUVEVSTik7Ci0JbXNtX2NhbWVyYV9pb193KDB4RkZGRkZGRkYsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfRlJBTUVEUk9QX1ZJRVdfQ0JDUl9QQVRURVJOKTsKLQltc21fY2FtZXJhX2lvX3coMCwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9DTEFNUF9NSU4pOwotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGRiwgdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9DTEFNUF9NQVgpOwotCi0JLyogc3RhdHMgVUIgY29uZmlnICovCi0JbXNtX2NhbWVyYV9pb193KDB4Mzk4MDAwNywKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfQUVDX1VCX0NGRyk7Ci0JbXNtX2NhbWVyYV9pb193KDB4M0EwMDAwNywKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfQUZfVUJfQ0ZHKTsKLQltc21fY2FtZXJhX2lvX3coMHgzQTgwMDBGLAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19TVEFUU19BV0JfVUJfQ0ZHKTsKLQltc21fY2FtZXJhX2lvX3coMHgzQjgwMDA3LAotCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19TVEFUU19SU19VQl9DRkcpOwotCW1zbV9jYW1lcmFfaW9fdygweDNDMDAwMUYsCi0JCXZmZTMxX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX0NTX1VCX0NGRyk7Ci0JbXNtX2NhbWVyYV9pb193KDB4M0UwMDAxRiwKLQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfSElTVF9VQl9DRkcpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9wcm9jZXNzX3Jlc2V0X2lycSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlhdG9taWNfc2V0KCZ2ZmUzMV9jdHJsLT52c3RhdGUsIDApOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnN0b3BfZmxhZ19sb2NrLCBmbGFncyk7Ci0JaWYgKHZmZTMxX2N0cmwtPnN0b3BfYWNrX3BlbmRpbmcpIHsKLQkJdmZlMzFfY3RybC0+c3RvcF9hY2tfcGVuZGluZyA9IEZBTFNFOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMV9jdHJsLT5zdG9wX2ZsYWdfbG9jaywgZmxhZ3MpOwotCQl2ZmUzMV9zZW5kX2lzcF9tc2codmZlMzFfY3RybCwgTVNHX0lEX1NUT1BfQUNLKTsKLQl9IGVsc2UgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMV9jdHJsLT5zdG9wX2ZsYWdfbG9jaywgZmxhZ3MpOwotCQkvKiB0aGlzIGlzIGZyb20gcmVzZXQgY29tbWFuZC4gKi8KLQkJdmZlMzFfc2V0X2RlZmF1bHRfcmVnX3ZhbHVlcygpOwotCi0JCS8qIHJlbG9hZCBhbGwgd3JpdGUgbWFzdGVycy4gKGZyYW1lICYgbGluZSkqLwotCQltc21fY2FtZXJhX2lvX3coMHg3RkZGLCB2ZmUzMV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19DTUQpOwotCQl2ZmUzMV9zZW5kX2lzcF9tc2codmZlMzFfY3RybCwgTVNHX0lEX1JFU0VUX0FDSyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9wcm9jZXNzX2NhbWlmX3NvZl9pcnEodm9pZCkKLXsKLQlpZiAodmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0KLQkJVkZFX09VVFBVVFNfUkFXKSB7Ci0JCWlmICh2ZmUzMV9jdHJsLT5zdGFydF9hY2tfcGVuZGluZykgewotCQkJdmZlMzFfc2VuZF9pc3BfbXNnKHZmZTMxX2N0cmwsIE1TR19JRF9TVEFSVF9BQ0spOwotCQkJdmZlMzFfY3RybC0+c3RhcnRfYWNrX3BlbmRpbmcgPSBGQUxTRTsKLQkJfQotCQl2ZmUzMV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudC0tOwotCQkvKiBpZiBsYXN0IGZyYW1lIHRvIGJlIGNhcHR1cmVkOiAqLwotCQlpZiAodmZlMzFfY3RybC0+dmZlX2NhcHR1cmVfY291bnQgPT0gMCkgewotCQkJLyogRW5zdXJlIHRoZSB3cml0ZSBvcmRlciB3aGlsZSB3cml0aW5nCi0JCQkgdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdXNpbmcgdGhlIGJhcnJpZXIgKi8KLQkJCW1zbV9jYW1lcmFfaW9fd19tYihDQU1JRl9DT01NQU5EX1NUT1BfQVRfRlJBTUVfQk9VTkRBUlksCi0JCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9DQU1JRl9DT01NQU5EKTsKLQkJfQotCX0gLyogaWYgcmF3IHNuYXBzaG90IG1vZGUuICovCi0JaWYgKCh2ZmUzMV9jdHJsLT5oZnJfbW9kZSAhPSBIRlJfTU9ERV9PRkYpICYmCi0JCSh2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PSBWRkVfTU9ERV9PRl9PUEVSQVRJT05fVklERU8pICYmCi0JCSh2ZmUzMV9jdHJsLT52ZmVGcmFtZUlkICUgdmZlMzFfY3RybC0+aGZyX21vZGUgIT0gMCkpIHsKLQkJdmZlMzFfY3RybC0+dmZlRnJhbWVJZCsrOwotCQlDREJHKCJTa2lwIHRoZSBTT0Ygbm90aWZpY2F0aW9uIHdoZW4gSEZSIGVuYWJsZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCXZmZTMxX2N0cmwtPnZmZUZyYW1lSWQrKzsKLQl2ZmUzMV9zZW5kX2lzcF9tc2codmZlMzFfY3RybCwgTVNHX0lEX1NPRl9BQ0spOwotCUNEQkcoImNhbWlmX3NvZl9pcnEsIGZyYW1lSWQgPSAlZFxuIiwgdmZlMzFfY3RybC0+dmZlRnJhbWVJZCk7Ci0KLQlpZiAodmZlMzFfY3RybC0+c3luY190aW1lcl9zdGF0ZSkgewotCQlpZiAodmZlMzFfY3RybC0+c3luY190aW1lcl9yZXBlYXRfY291bnQgPT0gMCkKLQkJCXZmZTMxX3N5bmNfdGltZXJfc3RvcCgpOwotCQllbHNlCi0JCQl2ZmUzMV9jdHJsLT5zeW5jX3RpbWVyX3JlcGVhdF9jb3VudC0tOwotCX0KLQlpZiAoKHZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09IFZGRV9PVVRQVVRTX1RIVU1CX0FORF9NQUlOKSB8fAotCQkodmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0gVkZFX09VVFBVVFNfTUFJTl9BTkRfVEhVTUIpIHx8Ci0JCSh2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PSBWRkVfT1VUUFVUU19USFVNQl9BTkRfSlBFRykgfHwKLQkJKHZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09IFZGRV9PVVRQVVRTX0pQRUdfQU5EX1RIVU1CKSkgewotCQlpZiAodmZlMzFfY3RybC0+ZnJhbWVfc2tpcF9wYXR0ZXJuICYgKDB4MSA8PAotCQkJKHZmZTMxX2N0cmwtPnNuYXBzaG90X2ZyYW1lX2NudCAlCi0JCQkJdmZlMzFfY3RybC0+ZnJhbWVfc2tpcF9jbnQpKSkgewotCQkJdmZlMzFfY3RybC0+dmZlX2NhcHR1cmVfY291bnQtLTsKLQkJfQotCQl2ZmUzMV9jdHJsLT5zbmFwc2hvdF9mcmFtZV9jbnQrKzsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3Byb2Nlc3NfZXJyb3JfaXJxKHVpbnQzMl90IGVyclN0YXR1cykKLXsKLQl1aW50MzJfdCByZWdfdmFsdWUsIHJlYWRfdmFsOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMxX0lNQVNLX0NBTUlGX0VSUk9SKSB7Ci0JCXByX2VycigidmZlMzFfaXJxOiBjYW1pZiBlcnJvcnNcbiIpOwotCQlyZWdfdmFsdWUgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQkJdmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9DQU1JRl9TVEFUVVMpOwotCQlwcl9lcnIoImNhbWlmU3RhdHVzICA9IDB4JXhcbiIsIHJlZ192YWx1ZSk7Ci0JCXZmZTMxX3NlbmRfaXNwX21zZyh2ZmUzMV9jdHJsLCBNU0dfSURfQ0FNSUZfRVJST1IpOwotCX0KLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMV9JTUFTS19TVEFUU19DU19PVldSKQotCQlwcl9lcnIoInZmZTMxX2lycTogc3RhdHMgY3Mgb3ZlcndyaXRlXG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMV9JTUFTS19TVEFUU19JSElTVF9PVldSKQotCQlwcl9lcnIoInZmZTMxX2lycTogc3RhdHMgaWhpc3Qgb3ZlcndyaXRlXG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMV9JTUFTS19SRUFMSUdOX0JVRl9ZX09WRkwpCi0JCXByX2VycigidmZlMzFfaXJxOiByZWFsaWduIGJ1ZyBZIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMV9JTUFTS19SRUFMSUdOX0JVRl9DQl9PVkZMKQotCQlwcl9lcnIoInZmZTMxX2lycTogcmVhbGlnbiBidWcgQ0Igb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMxX0lNQVNLX1JFQUxJR05fQlVGX0NSX09WRkwpCi0JCXByX2VycigidmZlMzFfaXJxOiByZWFsaWduIGJ1ZyBDUiBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfVklPTEFUSU9OKQotCQlwcl9lcnIoInZmZTMxX2lycTogdmlvbGF0aW9uIGludGVycnVwdFxuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfSU1HX01BU1RfMF9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IGltYWdlIG1hc3RlciAwIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfSU1HX01BU1RfMV9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IGltYWdlIG1hc3RlciAxIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfSU1HX01BU1RfMl9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IGltYWdlIG1hc3RlciAyIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfSU1HX01BU1RfM19CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IGltYWdlIG1hc3RlciAzIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfSU1HX01BU1RfNF9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IGltYWdlIG1hc3RlciA0IGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfSU1HX01BU1RfNV9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IGltYWdlIG1hc3RlciA1IGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfSU1HX01BU1RfNl9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IGltYWdlIG1hc3RlciA2IGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfU1RBVFNfQUVfQkdfQlVTX09WRkwpCi0JCXByX2VycigidmZlMzFfaXJxOiBhZS9iZyBzdGF0cyBidXMgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMxX0lNQVNLX1NUQVRTX0FGX0JGX0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTMxX2lycTogYWYvYmYgc3RhdHMgYnVzIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMV9JTUFTS19TVEFUU19BV0JfQlVTX09WRkwpCi0JCXByX2VycigidmZlMzFfaXJxOiBhd2Igc3RhdHMgYnVzIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMV9JTUFTS19TVEFUU19SU19CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMV9pcnE6IHJzIHN0YXRzIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzFfSU1BU0tfU1RBVFNfQ1NfQlVTX09WRkwpCi0JCXByX2VycigidmZlMzFfaXJxOiBjcyBzdGF0cyBidXMgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMxX0lNQVNLX1NUQVRTX0lISVNUX0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTMxX2lycTogaWhpc3Qgc3RhdHMgYnVzIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMV9JTUFTS19TVEFUU19TS0lOX0JISVNUX0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTMxX2lycTogc2tpbi9iaGlzdCBzdGF0cyBidXMgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMxX0lNQVNLX0FYSV9FUlJPUikgewotCQlwcl9lcnIoInZmZTMxX2lycTogYXhpIGVycm9yXG4iKTsKLQkJLyogcmVhZCBzdGF0dXMgdG9vIHdoZW4gb3ZlcmZsb3cgaGFwcGVucy4qLwotCQlyZWFkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfUElOR19QT05HX1NUQVRVUyk7Ci0JCXByX2RlYnVnKCJWRkVfQlVTX1BJTkdfUE9OR19TVEFUVVMgPSAweCV4XG4iLCByZWFkX3ZhbCk7Ci0JCXJlYWRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0JVU19PUEVSQVRJT05fU1RBVFVTKTsKLQkJcHJfZGVidWcoIlZGRV9CVVNfT1BFUkFUSU9OX1NUQVRVUyA9IDB4JXhcbiIsIHJlYWRfdmFsKTsKLQkJcmVhZF92YWwgPSBtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfQlVTX0lNQUdFX01BU1RFUl8wX1dSX1BNX1NUQVRTXzApOwotCQlwcl9kZWJ1ZygiVkZFX0JVU19JTUFHRV9NQVNURVJfMF9XUl9QTV9TVEFUU18wID0gMHgleFxuIiwKLQkJCXJlYWRfdmFsKTsKLQkJcmVhZF92YWwgPSBtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfQlVTX0lNQUdFX01BU1RFUl8wX1dSX1BNX1NUQVRTXzEpOwotCQlwcl9kZWJ1ZygiVkZFX0JVU19JTUFHRV9NQVNURVJfMF9XUl9QTV9TVEFUU18xID0gMHgleFxuIiwKLQkJCXJlYWRfdmFsKTsKLQkJcmVhZF92YWwgPSBtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfQVhJX1NUQVRVUyk7Ci0JCXByX2RlYnVnKCJWRkVfQVhJX1NUQVRVUyA9IDB4JXhcbiIsIHJlYWRfdmFsKTsKLQl9Ci19Ci1zdGF0aWMgdm9pZCB2ZmVfc2VuZF9vdXRtc2coc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdWludDhfdCBtc2dpZCwKLQl1aW50MzJfdCBjaDBfcGFkZHIsIHVpbnQzMl90IGNoMV9wYWRkciwKLQl1aW50MzJfdCBjaDJfcGFkZHIsIHVpbnQzMl90IGluc3RfaGFuZGxlKQotewotCXN0cnVjdCBpc3BfbXNnX291dHB1dCBtc2c7Ci0KLQltc2cub3V0cHV0X2lkCQk9IG1zZ2lkOwotCW1zZy5idWYuaW5zdF9oYW5kbGUJPSBpbnN0X2hhbmRsZTsKLQltc2cuYnVmLmNoX3BhZGRyWzBdCT0gY2gwX3BhZGRyOwotCW1zZy5idWYuY2hfcGFkZHJbMV0JPSBjaDFfcGFkZHI7Ci0JbXNnLmJ1Zi5jaF9wYWRkclsyXQk9IGNoMl9wYWRkcjsKLQltc2cuZnJhbWVDb3VudGVyCT0gdmZlMzFfY3RybC0+dmZlRnJhbWVJZDsKLQotCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlMzFfY3RybC0+c3ViZGV2LAotCQlOT1RJRllfVkZFX01TR19PVVQsICZtc2cpOwotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfcHJvY2Vzc19vdXRwdXRfcGF0aF9pcnFfMCh2b2lkKQotewotCXVpbnQzMl90IHBpbmdfcG9uZzsKLQl1aW50MzJfdCBjaDBfcGFkZHIsIGNoMV9wYWRkciwgY2gyX3BhZGRyOwotCXVpbnQ4X3Qgb3V0X2Jvb2wgPSAwOwotCXN0cnVjdCBtc21fZnJlZV9idWYgKmZyZWVfYnVmID0gTlVMTDsKLQotCWZyZWVfYnVmID0gdmZlMzFfY2hlY2tfZnJlZV9idWZmZXIoVkZFX01TR19PVVRQVVRfSVJRLAotCQlWRkVfTVNHX09VVFBVVF9QUklNQVJZKTsKLQotCS8qIHdlIHJlbmRlciBmcmFtZXMgaW4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCSAqIDEuIENvbnRpbnVvdXMgbW9kZSBhbmQgdGhlIGZyZWUgYnVmZmVyIGlzIGF2YWlhbGFibGUuCi0JICogMi4gSW4gc25hcHNob3Qgc2hvdCBtb2RlLCBmcmVlIGJ1ZmZlciBpcyBub3QgYWx3YXlzIGF2YWlsYWJsZS4KLQkgKiB3aGVuIHBlbmRpbmcgc25hcHNob3QgY291bnQgaXMgPD0xLCAgdGhlbiBubyBuZWVkIHRvIHVzZQotCSAqIGZyZWUgYnVmZmVyLgotCSAqLwotCW91dF9ib29sID0gKCh2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PSBWRkVfT1VUUFVUU19USFVNQl9BTkRfTUFJTiB8fAotCQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PSBWRkVfT1VUUFVUU19NQUlOX0FORF9USFVNQiB8fAotCQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PSBWRkVfT1VUUFVUU19USFVNQl9BTkRfSlBFRyB8fAotCQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PSBWRkVfT1VUUFVUU19KUEVHX0FORF9USFVNQiB8fAotCQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PSBWRkVfT1VUUFVUU19SQVcgfHwKLQkJdmZlMzFfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPT0gVkZFX1NUQVRFX1NUQVJURUQgfHwKLQkJdmZlMzFfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPT0gVkZFX1NUQVRFX1NUT1BfUkVRVUVTVEVEIHx8Ci0JCXZmZTMxX2N0cmwtPmxpdmVzaG90X3N0YXRlID09IFZGRV9TVEFURV9TVE9QUEVEKSAmJgotCQkodmZlMzFfY3RybC0+dmZlX2NhcHR1cmVfY291bnQgPD0gMSkpIHx8IGZyZWVfYnVmOwotCi0JaWYgKG91dF9ib29sKSB7Ci0JCXBpbmdfcG9uZyA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfUElOR19QT05HX1NUQVRVUyk7Ci0KLQkJLyogQ2hhbm5lbCAwKi8KLQkJY2gwX3BhZGRyID0gdmZlMzFfZ2V0X2NoX2FkZHIocGluZ19wb25nLAotCQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQwLmNoMCk7Ci0JCS8qIENoYW5uZWwgMSovCi0JCWNoMV9wYWRkciA9IHZmZTMxX2dldF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jaDEpOwotCQkvKiBDaGFubmVsIDIqLwotCQljaDJfcGFkZHIgPSB2ZmUzMV9nZXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gyKTsKLQotCQlDREJHKCJvdXRwdXQgcGF0aCAwLCBjaDAgPSAweCV4LCBjaDEgPSAweCV4LCBjaDIgPSAweCV4XG4iLAotCQkJY2gwX3BhZGRyLCBjaDFfcGFkZHIsIGNoMl9wYWRkcik7Ci0JCWlmIChmcmVlX2J1ZikgewotCQkJLyogWSBjaGFubmVsICovCi0JCQl2ZmUzMV9wdXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwLAotCQkJZnJlZV9idWYtPmNoX3BhZGRyWzBdKTsKLQkJCS8qIENocm9tYSBjaGFubmVsICovCi0JCQl2ZmUzMV9wdXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxLAotCQkJZnJlZV9idWYtPmNoX3BhZGRyWzFdKTsKLQkJCWlmIChmcmVlX2J1Zi0+bnVtX3BsYW5lcyA+IDIpCi0JCQkJdmZlMzFfcHV0X2NoX2FkZHIocGluZ19wb25nLAotCQkJCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2gyLAotCQkJCQlmcmVlX2J1Zi0+Y2hfcGFkZHJbMl0pOwotCQl9Ci0JCWlmICh2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9NQUlOIHx8Ci0JCQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJCVZGRV9PVVRQVVRTX01BSU5fQU5EX1RIVU1CIHx8Ci0JCQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9KUEVHIHx8Ci0JCQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJCVZGRV9PVVRQVVRTX0pQRUdfQU5EX1RIVU1CIHx8Ci0JCQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJCVZGRV9PVVRQVVRTX1JBVyB8fAotCQkJdmZlMzFfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPT0gVkZFX1NUQVRFX1NUT1BQRUQpCi0JCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuY2FwdHVyZV9jbnQtLTsKLQotCQl2ZmVfc2VuZF9vdXRtc2coJnZmZTMxX2N0cmwtPnN1YmRldiwKLQkJCU1TR19JRF9PVVRQVVRfUFJJTUFSWSwgY2gwX3BhZGRyLAotCQkJY2gxX3BhZGRyLCBjaDJfcGFkZHIsCi0JCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuaW5zdF9oYW5kbGUpOwotCi0JCWlmICh2ZmUzMV9jdHJsLT5saXZlc2hvdF9zdGF0ZSA9PSBWRkVfU1RBVEVfU1RPUFBFRCkKLQkJCXZmZTMxX2N0cmwtPmxpdmVzaG90X3N0YXRlID0gVkZFX1NUQVRFX0lETEU7Ci0KLQl9IGVsc2UgewotCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDAuZnJhbWVfZHJvcF9jbnQrKzsKLQkJQ0RCRygicGF0aF9pcnFfMCAtIG5vIGZyZWUgYnVmZmVyIVxuIik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9wcm9jZXNzX291dHB1dF9wYXRoX2lycV8xKHZvaWQpCi17Ci0JdWludDMyX3QgcGluZ19wb25nOwotCXVpbnQzMl90IGNoMF9wYWRkciwgY2gxX3BhZGRyLCBjaDJfcGFkZHI7Ci0JLyogdGhpcyBtdXN0IGJlIHNuYXBzaG90IG1haW4gaW1hZ2Ugb3V0cHV0LiAqLwotCXVpbnQ4X3Qgb3V0X2Jvb2wgPSAwOwotCXN0cnVjdCBtc21fZnJlZV9idWYgKmZyZWVfYnVmID0gTlVMTDsKLQotCWZyZWVfYnVmID0gdmZlMzFfY2hlY2tfZnJlZV9idWZmZXIoVkZFX01TR19PVVRQVVRfSVJRLAotCQlWRkVfTVNHX09VVFBVVF9TRUNPTkRBUlkpOwotCW91dF9ib29sID0gKCh2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9NQUlOIHx8Ci0JCQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJCVZGRV9PVVRQVVRTX01BSU5fQU5EX1RIVU1CIHx8Ci0JCQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJCVZGRV9PVVRQVVRTX1JBVyB8fAotCQkJdmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0KLQkJCQlWRkVfT1VUUFVUU19KUEVHX0FORF9USFVNQikgJiYKLQkJCSh2ZmUzMV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudCA8PSAxKSkgfHwgZnJlZV9idWY7Ci0KLQlpZiAob3V0X2Jvb2wpIHsKLQkJcGluZ19wb25nID0gbXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0JVU19QSU5HX1BPTkdfU1RBVFVTKTsKLQotCQkvKiBZIGNoYW5uZWwgKi8KLQkJY2gwX3BhZGRyID0gdmZlMzFfZ2V0X2NoX2FkZHIocGluZ19wb25nLAotCQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNoMCk7Ci0JCS8qIENocm9tYSBjaGFubmVsICovCi0JCWNoMV9wYWRkciA9IHZmZTMxX2dldF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDEpOwotCQljaDJfcGFkZHIgPSB2ZmUzMV9nZXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuY2gyKTsKLQotCQlwcl9kZWJ1ZygiJXMgY2gwID0gMHgleCwgY2gxID0gMHgleCwgY2gyID0gMHgleFxuIiwKLQkJCV9fZnVuY19fLCBjaDBfcGFkZHIsIGNoMV9wYWRkciwgY2gyX3BhZGRyKTsKLQkJaWYgKGZyZWVfYnVmKSB7Ci0JCQkvKiBZIGNoYW5uZWwgKi8KLQkJCXZmZTMxX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDAsCi0JCQlmcmVlX2J1Zi0+Y2hfcGFkZHJbMF0pOwotCQkJLyogQ2hyb21hIGNoYW5uZWwgKi8KLQkJCXZmZTMxX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDEsCi0JCQlmcmVlX2J1Zi0+Y2hfcGFkZHJbMV0pOwotCQkJaWYgKGZyZWVfYnVmLT5udW1fcGxhbmVzID4gMikKLQkJCQl2ZmUzMV9wdXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQkJCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5jaDIsCi0JCQkJCWZyZWVfYnVmLT5jaF9wYWRkclsyXSk7Ci0JCX0KLQkJaWYgKHZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQkJVkZFX09VVFBVVFNfVEhVTUJfQU5EX01BSU4gfHwKLQkJCXZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQkJVkZFX09VVFBVVFNfTUFJTl9BTkRfVEhVTUIgfHwKLQkJCXZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQkJVkZFX09VVFBVVFNfUkFXIHx8Ci0JCQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJCVZGRV9PVVRQVVRTX0pQRUdfQU5EX1RIVU1CKQotCQkJdmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLmNhcHR1cmVfY250LS07Ci0KLQkJdmZlX3NlbmRfb3V0bXNnKCZ2ZmUzMV9jdHJsLT5zdWJkZXYsCi0JCQlNU0dfSURfT1VUUFVUX1NFQ09OREFSWSwgY2gwX3BhZGRyLAotCQkJY2gxX3BhZGRyLCBjaDJfcGFkZHIsCi0JCQl2ZmUzMV9jdHJsLT5vdXRwYXRoLm91dDEuaW5zdF9oYW5kbGUpOwotCX0gZWxzZSB7Ci0JCXZmZTMxX2N0cmwtPm91dHBhdGgub3V0MS5mcmFtZV9kcm9wX2NudCsrOwotCQlDREJHKCJwYXRoX2lycV8xIC0gbm8gZnJlZSBidWZmZXIhXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCAgdmZlMzFfcHJvY2Vzc19zdGF0c19pcnFfY29tbW9uKHVpbnQzMl90IHN0YXRzTnVtLAotCXVpbnQzMl90IG5ld0FkZHIpCi17Ci0KLQl1aW50MzJfdCBwaW5ncG9uZ1N0YXR1czsKLQl1aW50MzJfdCByZXR1cm5BZGRyOwotCXVpbnQzMl90IHBpbmdwb25nQWRkcjsKLQotCS8qIG11c3QgYmUgMD1waW5nLCAxPXBvbmcgKi8KLQlwaW5ncG9uZ1N0YXR1cyA9Ci0JCSgobXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1BJTkdfUE9OR19TVEFUVVMpKQotCQkmICgodWludDMyX3QpKDE8PChzdGF0c051bSArIDcpKSkpID4+IChzdGF0c051bSArIDcpOwotCS8qIHN0YXRzIGJpdHMgc3RhcnRzIGF0IDcgKi8KLQlDREJHKCJzdGF0c051bSAlZCwgcGluZ3BvbmdTdGF0dXMgJWRcbiIsIHN0YXRzTnVtLCBwaW5ncG9uZ1N0YXR1cyk7Ci0JcGluZ3BvbmdBZGRyID0KLQkJKCh1aW50MzJfdCkodmZlMzFfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9CVVNfU1RBVFNfUElOR19QT05HX0JBU0UpKSArCi0JCSgzKnN0YXRzTnVtKSo0ICsgKDEtcGluZ3BvbmdTdGF0dXMpKjQ7Ci0JcmV0dXJuQWRkciA9IG1zbV9jYW1lcmFfaW9fcigodWludDMyX3QgKilwaW5ncG9uZ0FkZHIpOwotCW1zbV9jYW1lcmFfaW9fdyhuZXdBZGRyLCAodWludDMyX3QgKilwaW5ncG9uZ0FkZHIpOwotCXJldHVybiByZXR1cm5BZGRyOwotfQotCi1zdGF0aWMgdm9pZAotdmZlX3NlbmRfc3RhdHNfbXNnKHVpbnQzMl90IGJ1ZkFkZHJlc3MsIHVpbnQzMl90IHN0YXRzTnVtKQotewotCWludCByYyA9IDA7Ci0Jdm9pZCAqdmFkZHIgPSBOVUxMOwotCS8qIGZpbGwgbWVzc2FnZSB3aXRoIHJpZ2h0IGNvbnRlbnQuICovCi0JLyogQHRvZG8gVGhpcyBpcyBjYXVzaW5nIGlzc3VlcywgbmVlZCBmdXJ0aGVyIGludmVzdGlnYXRlICovCi0JLyogc3Bpbl9sb2NrX2lycXNhdmUoJmN0cmwtPnN0YXRlX2xvY2ssIGZsYWdzKTsgKi8KLQlzdHJ1Y3QgaXNwX21zZ19zdGF0cyBtc2dTdGF0czsKLQltc2dTdGF0cy5mcmFtZUNvdW50ZXIgPSB2ZmUzMV9jdHJsLT52ZmVGcmFtZUlkOwotCW1zZ1N0YXRzLmJ1ZmZlciA9IGJ1ZkFkZHJlc3M7Ci0KLQlzd2l0Y2ggKHN0YXRzTnVtKSB7Ci0JY2FzZSBTVEFUU19BRV9OVU06ewotCQltc2dTdGF0cy5pZCA9IE1TR19JRF9TVEFUU19BRUM7Ci0JCXJjID0gdmZlMzFfY3RybC0+c3RhdHNfb3BzLmRpc3BhdGNoKAotCQkJCXZmZTMxX2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsLAotCQkJCU1TTV9TVEFUU19UWVBFX0FFQywJYnVmQWRkcmVzcywKLQkJCQkmbXNnU3RhdHMuYnVmX2lkeCwgJnZhZGRyLCAmbXNnU3RhdHMuZmQsCi0JCQkJdmZlMzFfY3RybC0+c3RhdHNfb3BzLmNsaWVudCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTVEFUU19BRl9OVU06ewotCQltc2dTdGF0cy5pZCA9IE1TR19JRF9TVEFUU19BRjsKLQkJcmMgPSB2ZmUzMV9jdHJsLT5zdGF0c19vcHMuZGlzcGF0Y2goCi0JCQkJdmZlMzFfY3RybC0+c3RhdHNfb3BzLnN0YXRzX2N0cmwsCi0JCQkJTVNNX1NUQVRTX1RZUEVfQUYsIGJ1ZkFkZHJlc3MsCi0JCQkJJm1zZ1N0YXRzLmJ1Zl9pZHgsICZ2YWRkciwgJm1zZ1N0YXRzLmZkLAotCQkJCXZmZTMxX2N0cmwtPnN0YXRzX29wcy5jbGllbnQpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU1RBVFNfQVdCX05VTTogewotCQltc2dTdGF0cy5pZCA9IE1TR19JRF9TVEFUU19BV0I7Ci0JCXJjID0gdmZlMzFfY3RybC0+c3RhdHNfb3BzLmRpc3BhdGNoKAotCQkJCXZmZTMxX2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsLAotCQkJCU1TTV9TVEFUU19UWVBFX0FXQiwgYnVmQWRkcmVzcywKLQkJCQkmbXNnU3RhdHMuYnVmX2lkeCwgJnZhZGRyLCAmbXNnU3RhdHMuZmQsCi0JCQkJdmZlMzFfY3RybC0+c3RhdHNfb3BzLmNsaWVudCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFNUQVRTX0lISVNUX05VTTogewotCQltc2dTdGF0cy5pZCA9IE1TR19JRF9TVEFUU19JSElTVDsKLQkJcmMgPSB2ZmUzMV9jdHJsLT5zdGF0c19vcHMuZGlzcGF0Y2goCi0JCQkJdmZlMzFfY3RybC0+c3RhdHNfb3BzLnN0YXRzX2N0cmwsCi0JCQkJTVNNX1NUQVRTX1RZUEVfSUhJU1QsIGJ1ZkFkZHJlc3MsCi0JCQkJJm1zZ1N0YXRzLmJ1Zl9pZHgsICZ2YWRkciwgJm1zZ1N0YXRzLmZkLAotCQkJCXZmZTMxX2N0cmwtPnN0YXRzX29wcy5jbGllbnQpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU1RBVFNfUlNfTlVNOiB7Ci0JCW1zZ1N0YXRzLmlkID0gTVNHX0lEX1NUQVRTX1JTOwotCQlyYyA9IHZmZTMxX2N0cmwtPnN0YXRzX29wcy5kaXNwYXRjaCgKLQkJCQl2ZmUzMV9jdHJsLT5zdGF0c19vcHMuc3RhdHNfY3RybCwKLQkJCQlNU01fU1RBVFNfVFlQRV9SUywgYnVmQWRkcmVzcywKLQkJCQkmbXNnU3RhdHMuYnVmX2lkeCwgJnZhZGRyLCAmbXNnU3RhdHMuZmQsCi0JCQkJdmZlMzFfY3RybC0+c3RhdHNfb3BzLmNsaWVudCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTVEFUU19DU19OVU06IHsKLQkJbXNnU3RhdHMuaWQgPSBNU0dfSURfU1RBVFNfQ1M7Ci0JCXJjID0gdmZlMzFfY3RybC0+c3RhdHNfb3BzLmRpc3BhdGNoKAotCQkJCXZmZTMxX2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsLAotCQkJCU1TTV9TVEFUU19UWVBFX0NTLCBidWZBZGRyZXNzLAotCQkJCSZtc2dTdGF0cy5idWZfaWR4LCAmdmFkZHIsICZtc2dTdGF0cy5mZCwKLQkJCQl2ZmUzMV9jdHJsLT5zdGF0c19vcHMuY2xpZW50KTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWdvdG8gc3RhdHNfZG9uZTsKLQl9Ci0JaWYgKHJjID09IDApIHsKLQkJbXNnU3RhdHMuYnVmZmVyID0gKHVpbnQzMl90KXZhZGRyOwotCQl2NGwyX3N1YmRldl9ub3RpZnkoJnZmZTMxX2N0cmwtPnN1YmRldiwKLQkJCU5PVElGWV9WRkVfTVNHX1NUQVRTLCAmbXNnU3RhdHMpOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IHBhZGRyIHRvIGlkeCBtYXBwaW5nIGVycm9yLCBzdGF0c19pZCA9ICVkLFxuIgotCQkJInBhZGRyID0gMHglZFxuIiwgX19mdW5jX18sCi0JCQkgbXNnU3RhdHMuaWQsIG1zZ1N0YXRzLmJ1ZmZlcik7Ci0JfQotc3RhdHNfZG9uZToKLQkvKiBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHJsLT5zdGF0ZV9sb2NrLCBmbGFncyk7ICovCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfc2VuZF9jb21wX3N0YXRzX21zZyh1aW50MzJfdCBzdGF0dXNfYml0cykKLXsKLQlzdHJ1Y3QgbXNtX3N0YXRzX2J1ZiBtc2dTdGF0czsKLQl1aW50MzJfdCB0ZW1wOwotCi0JbXNnU3RhdHMuZnJhbWVfaWQgPSB2ZmUzMV9jdHJsLT52ZmVGcmFtZUlkOwotCW1zZ1N0YXRzLnN0YXR1c19iaXRzID0gc3RhdHVzX2JpdHM7Ci0KLQltc2dTdGF0cy5hZWMuYnVmZiA9IHZmZTMxX2N0cmwtPmFlY1N0YXRzQ29udHJvbC5idWZUb1JlbmRlcjsKLQltc2dTdGF0cy5hd2IuYnVmZiA9IHZmZTMxX2N0cmwtPmF3YlN0YXRzQ29udHJvbC5idWZUb1JlbmRlcjsKLQltc2dTdGF0cy5hZi5idWZmID0gdmZlMzFfY3RybC0+YWZTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXI7Ci0KLQltc2dTdGF0cy5paGlzdC5idWZmID0gdmZlMzFfY3RybC0+aWhpc3RTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXI7Ci0JbXNnU3RhdHMucnMuYnVmZiA9IHZmZTMxX2N0cmwtPnJzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyOwotCW1zZ1N0YXRzLmNzLmJ1ZmYgPSB2ZmUzMV9jdHJsLT5jc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlcjsKLQotCXRlbXAgPSBtc21fY2FtZXJhX2lvX3IodmZlMzFfY3RybC0+dmZlYmFzZSArIFZGRV9TVEFUU19BV0JfU0dXX0NGRyk7Ci0JbXNnU3RhdHMuYXdiX3ltaW4gPSAoMHhGRjAwICYgdGVtcCkgPj4gODsKLQotCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlMzFfY3RybC0+c3ViZGV2LAotCQlOT1RJRllfVkZFX01TR19DT01QX1NUQVRTLCAmbXNnU3RhdHMpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9wcm9jZXNzX3N0YXRzX2FlX2lycSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdWludDMyX3QgYWRkcjsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMzFfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JYWRkciA9ICh1aW50MzJfdCl2ZmUzMV9zdGF0c19kcWJ1ZihNU01fU1RBVFNfVFlQRV9BRUMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmIChhZGRyKSB7Ci0JCXZmZTMxX2N0cmwtPmFlY1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9Ci0JCQl2ZmUzMV9wcm9jZXNzX3N0YXRzX2lycV9jb21tb24oU1RBVFNfQUVfTlVNLAotCQkJYWRkcik7Ci0KLQkJdmZlX3NlbmRfc3RhdHNfbXNnKHZmZTMxX2N0cmwtPmFlY1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciwKLQkJCVNUQVRTX0FFX05VTSk7Ci0JfSBlbHNlewotCQl2ZmUzMV9jdHJsLT5hZWNTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCsrOwotCQlDREJHKCIlczogZHJvcHBlZFN0YXRzRnJhbWVDb3VudCA9ICVkIiwgX19mdW5jX18sCi0JCQl2ZmUzMV9jdHJsLT5hZWNTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9wcm9jZXNzX3N0YXRzX2F3Yl9pcnEodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IGFkZHI7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzFfc3RhdHNfZHFidWYoTVNNX1NUQVRTX1RZUEVfQVdCKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMV9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoYWRkcikgewotCQl2ZmUzMV9jdHJsLT5hd2JTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPQotCQkJdmZlMzFfcHJvY2Vzc19zdGF0c19pcnFfY29tbW9uKFNUQVRTX0FXQl9OVU0sCi0JCQlhZGRyKTsKLQotCQl2ZmVfc2VuZF9zdGF0c19tc2codmZlMzFfY3RybC0+YXdiU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyLAotCQkJU1RBVFNfQVdCX05VTSk7Ci0JfSBlbHNlewotCQl2ZmUzMV9jdHJsLT5hd2JTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCsrOwotCQlDREJHKCIlczogZHJvcHBlZFN0YXRzRnJhbWVDb3VudCA9ICVkIiwgX19mdW5jX18sCi0JCQl2ZmUzMV9jdHJsLT5hd2JTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMV9wcm9jZXNzX3N0YXRzX2FmX2lycSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdWludDMyX3QgYWRkcjsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMzFfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JYWRkciA9ICh1aW50MzJfdCl2ZmUzMV9zdGF0c19kcWJ1ZihNU01fU1RBVFNfVFlQRV9BRik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzFfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKGFkZHIpIHsKLQkJdmZlMzFfY3RybC0+YWZTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPQotCQkJdmZlMzFfcHJvY2Vzc19zdGF0c19pcnFfY29tbW9uKFNUQVRTX0FGX05VTSwKLQkJCWFkZHIpOwotCi0JCXZmZV9zZW5kX3N0YXRzX21zZyh2ZmUzMV9jdHJsLT5hZlN0YXRzQ29udHJvbC5idWZUb1JlbmRlciwKLQkJCVNUQVRTX0FGX05VTSk7Ci0JfSBlbHNlewotCQl2ZmUzMV9jdHJsLT5hZlN0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCUNEQkcoIiVzOiBkcm9wcGVkU3RhdHNGcmFtZUNvdW50ID0gJWQiLCBfX2Z1bmNfXywKLQkJCXZmZTMxX2N0cmwtPmFmU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfcHJvY2Vzc19zdGF0c19paGlzdF9pcnEodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IGFkZHI7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzFfc3RhdHNfZHFidWYoTVNNX1NUQVRTX1RZUEVfSUhJU1QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmIChhZGRyKSB7Ci0JCXZmZTMxX2N0cmwtPmloaXN0U3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCSAgdmZlMzFfcHJvY2Vzc19zdGF0c19pcnFfY29tbW9uKFNUQVRTX0lISVNUX05VTSwKLQkJCQlhZGRyKTsKLQkJdmZlX3NlbmRfc3RhdHNfbXNnKHZmZTMxX2N0cmwtPmloaXN0U3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyLAotCQkJICBTVEFUU19JSElTVF9OVU0pOwotCX0gZWxzZSB7Ci0JCXZmZTMxX2N0cmwtPmloaXN0U3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQrKzsKLQkJQ0RCRygiJXM6IGRyb3BwZWRTdGF0c0ZyYW1lQ291bnQgPSAlZCIsIF9fZnVuY19fLAotCQkJIHZmZTMxX2N0cmwtPmloaXN0U3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfcHJvY2Vzc19zdGF0c19yc19pcnEodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IGFkZHI7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzFfc3RhdHNfZHFidWYoTVNNX1NUQVRTX1RZUEVfUlMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmIChhZGRyKSB7Ci0JCXZmZTMxX2N0cmwtPnJzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCXZmZTMxX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbihTVEFUU19SU19OVU0sCi0JCQlhZGRyKTsKLQkJdmZlX3NlbmRfc3RhdHNfbXNnKHZmZTMxX2N0cmwtPnJzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyLAotCQkJU1RBVFNfUlNfTlVNKTsKLQl9IGVsc2UgewotCQl2ZmUzMV9jdHJsLT5yc1N0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCUNEQkcoIiVzOiBkcm9wcGVkU3RhdHNGcmFtZUNvdW50ID0gJWQiLCBfX2Z1bmNfXywKLQkJCXZmZTMxX2N0cmwtPnJzU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfcHJvY2Vzc19zdGF0c19jc19pcnEodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IGFkZHI7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzFfc3RhdHNfZHFidWYoTVNNX1NUQVRTX1RZUEVfQ1MpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmIChhZGRyKSB7Ci0JCXZmZTMxX2N0cmwtPmNzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCXZmZTMxX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbihTVEFUU19DU19OVU0sCi0JCQkJYWRkcik7Ci0JCQl2ZmVfc2VuZF9zdGF0c19tc2coCi0JCQkJdmZlMzFfY3RybC0+Y3NTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIsCi0JCQkJU1RBVFNfQ1NfTlVNKTsKLQl9IGVsc2UgewotCQl2ZmUzMV9jdHJsLT5jc1N0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCUNEQkcoIiVzOiBkcm9wcGVkU3RhdHNGcmFtZUNvdW50ID0gJWQiLCBfX2Z1bmNfXywKLQkJCXZmZTMxX2N0cmwtPmNzU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfcHJvY2Vzc19zdGF0cyh1aW50MzJfdCBzdGF0dXNfYml0cykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludDMyX3QgcHJvY2Vzc19zdGF0cyA9IGZhbHNlOwotCXVpbnQzMl90IGFkZHI7Ci0JQ0RCRygiJXMsIHN0YXRzID0gMHgleFxuIiwgX19mdW5jX18sIHN0YXR1c19iaXRzKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMV9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoc3RhdHVzX2JpdHMgJiBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQUVDKSB7Ci0JCWFkZHIgPSAodWludDMyX3QpdmZlMzFfc3RhdHNfZHFidWYoTVNNX1NUQVRTX1RZUEVfQUVDKTsKLQkJaWYgKGFkZHIpIHsKLQkJCXZmZTMxX2N0cmwtPmFlY1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9Ci0JCQkJdmZlMzFfcHJvY2Vzc19zdGF0c19pcnFfY29tbW9uKFNUQVRTX0FFX05VTSwKLQkJCQlhZGRyKTsKLQkJCXByb2Nlc3Nfc3RhdHMgPSB0cnVlOwotCQl9IGVsc2V7Ci0JCQl2ZmUzMV9jdHJsLT5hZWNTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCQkJdmZlMzFfY3RybC0+YWVjU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQrKzsKLQkJfQotCX0gZWxzZSB7Ci0JCXZmZTMxX2N0cmwtPmFlY1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JfQotCi0JaWYgKHN0YXR1c19iaXRzICYgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0FXQikgewotCQlhZGRyID0gKHVpbnQzMl90KXZmZTMxX3N0YXRzX2RxYnVmKE1TTV9TVEFUU19UWVBFX0FXQik7Ci0JCWlmIChhZGRyKSB7Ci0JCQl2ZmUzMV9jdHJsLT5hd2JTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPQotCQkJCXZmZTMxX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbihTVEFUU19BV0JfTlVNLAotCQkJCWFkZHIpOwotCQkJcHJvY2Vzc19zdGF0cyA9IHRydWU7Ci0JCX0gZWxzZXsKLQkJCXZmZTMxX2N0cmwtPmF3YlN0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCQl2ZmUzMV9jdHJsLT5hd2JTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJdmZlMzFfY3RybC0+YXdiU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0gMDsKLQl9Ci0KLQotCWlmIChzdGF0dXNfYml0cyAmIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19BRikgewotCQlhZGRyID0gKHVpbnQzMl90KXZmZTMxX3N0YXRzX2RxYnVmKE1TTV9TVEFUU19UWVBFX0FGKTsKLQkJaWYgKGFkZHIpIHsKLQkJCXZmZTMxX2N0cmwtPmFmU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCQl2ZmUzMV9wcm9jZXNzX3N0YXRzX2lycV9jb21tb24oU1RBVFNfQUZfTlVNLAotCQkJCWFkZHIpOwotCQkJcHJvY2Vzc19zdGF0cyA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQl2ZmUzMV9jdHJsLT5hZlN0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JCQl2ZmUzMV9jdHJsLT5hZlN0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCX0KLQl9IGVsc2UgewotCQl2ZmUzMV9jdHJsLT5hZlN0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JfQotCi0JaWYgKHN0YXR1c19iaXRzICYgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0lISVNUKSB7Ci0JCWFkZHIgPSAodWludDMyX3QpdmZlMzFfc3RhdHNfZHFidWYoTVNNX1NUQVRTX1RZUEVfSUhJU1QpOwotCQlpZiAoYWRkcikgewotCQkJdmZlMzFfY3RybC0+aWhpc3RTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPQotCQkJCXZmZTMxX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbihTVEFUU19JSElTVF9OVU0sCi0JCQkJYWRkcik7Ci0JCQlwcm9jZXNzX3N0YXRzID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXZmZTMxX2N0cmwtPmloaXN0U3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQrKzsKLQkJCXZmZTMxX2N0cmwtPmloaXN0U3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCXZmZTMxX2N0cmwtPmloaXN0U3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0gMDsKLQl9Ci0KLQlpZiAoc3RhdHVzX2JpdHMgJiBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfUlMpIHsKLQkJYWRkciA9ICh1aW50MzJfdCl2ZmUzMV9zdGF0c19kcWJ1ZihNU01fU1RBVFNfVFlQRV9SUyk7Ci0JCWlmICghYWRkcikgewotCQkJdmZlMzFfY3RybC0+cnNTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPQotCQkJCXZmZTMxX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbihTVEFUU19SU19OVU0sCi0JCQkJYWRkcik7Ci0JCQlwcm9jZXNzX3N0YXRzID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXZmZTMxX2N0cmwtPnJzU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQrKzsKLQkJCXZmZTMxX2N0cmwtPnJzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCXZmZTMxX2N0cmwtPnJzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0gMDsKLQl9Ci0KLQotCWlmIChzdGF0dXNfYml0cyAmIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19DUykgewotCQlhZGRyID0gKHVpbnQzMl90KXZmZTMxX3N0YXRzX2RxYnVmKE1TTV9TVEFUU19UWVBFX0NTKTsKLQkJaWYgKGFkZHIpIHsKLQkJCXZmZTMxX2N0cmwtPmNzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCQl2ZmUzMV9wcm9jZXNzX3N0YXRzX2lycV9jb21tb24oU1RBVFNfQ1NfTlVNLAotCQkJCWFkZHIpOwotCQkJcHJvY2Vzc19zdGF0cyA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQl2ZmUzMV9jdHJsLT5jc1N0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCQl2ZmUzMV9jdHJsLT5jc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JCX0KLQl9IGVsc2UgewotCQl2ZmUzMV9jdHJsLT5jc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzFfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKHByb2Nlc3Nfc3RhdHMpCi0JCXZmZV9zZW5kX2NvbXBfc3RhdHNfbXNnKHN0YXR1c19iaXRzKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIGxvbmcgdmZlX3N0YXRzX2J1ZnFfc3ViX2lvY3RsKHN0cnVjdCBtc21fdmZlX2NmZ19jbWQgKmNtZCwKLQl2b2lkICppb25fY2xpZW50LCBpbnQgZG9tYWluX251bSkKLXsKLQlsb25nIHJjID0gMDsKLQlzd2l0Y2ggKGNtZC0+Y21kX3R5cGUpIHsKLQljYXNlIFZGRV9DTURfU1RBVFNfUkVRQlVGOgotCQlpZiAoIXZmZTMxX2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsKSB7Ci0JCQkvKiBzdGF0c19jdHJsIGhhcyBub3QgYmVlbiBpbml0IHlldCAqLwotCQkJcmMgPSBtc21fc3RhdHNfYnVmX29wc19pbml0KCZ2ZmUzMV9jdHJsLT5zdGF0c19jdHJsLAotCQkJCQkoc3RydWN0IGlvbl9jbGllbnQgKilpb25fY2xpZW50LAotCQkJCQkmdmZlMzFfY3RybC0+c3RhdHNfb3BzKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogY2Fubm90IGluaXQgc3RhdHMgb3BzIiwgX19mdW5jX18pOwotCQkJZ290byBlbmQ7Ci0JCX0KLQkJcmMgPSB2ZmUzMV9jdHJsLT5zdGF0c19vcHMuc3RhdHNfY3RybF9pbml0KAotCQkJCSZ2ZmUzMV9jdHJsLT5zdGF0c19jdHJsKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogY2Fubm90IGluaXQgc3RhdHNfY3RybCBvcHMiLCBfX2Z1bmNfXyk7Ci0JCQltZW1zZXQoJnZmZTMxX2N0cmwtPnN0YXRzX29wcywgMCwKLQkJCQlzaXplb2YodmZlMzFfY3RybC0+c3RhdHNfb3BzKSk7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCQlpZiAoc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfcmVxYnVmKSAhPSBjbWQtPmxlbmd0aCkgewotCQkJLyogZXJyb3IuIHRoZSBsZW5ndGggbm90IG1hdGNoICovCi0JCQlwcl9lcnIoIiVzOiBzdGF0cyByZXFidWYgaW5wdXQgc2l6ZSA9ICVkLFxuIgotCQkJCSJzdHJ1Y3Qgc2l6ZSA9ICVkLCBtaXMgbWF0Y2hcbiIsCi0JCQkJIF9fZnVuY19fLCBjbWQtPmxlbmd0aCwKLQkJCQkgc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfcmVxYnVmKSk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCX0KLQlyYyA9IHZmZTMxX2N0cmwtPnN0YXRzX29wcy5yZXFidWYoJnZmZTMxX2N0cmwtPnN0YXRzX2N0cmwsCi0JCQkoc3RydWN0IG1zbV9zdGF0c19yZXFidWYgKiljbWQtPnZhbHVlLAotCQkJdmZlMzFfY3RybC0+c3RhdHNfb3BzLmNsaWVudCk7Ci0JYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX1NUQVRTX0VOUVVFVUVCVUY6Ci0JCWlmIChzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19idWZfaW5mbykgIT0gY21kLT5sZW5ndGgpIHsKLQkJCS8qIGVycm9yLiB0aGUgbGVuZ3RoIG5vdCBtYXRjaCAqLwotCQkJcHJfZXJyKCIlczogc3RhdHMgZW5xdWV1ZWJ1ZiBpbnB1dCBzaXplID0gJWQsXG4iCi0JCQkJInN0cnVjdCBzaXplID0gJWQsIG1pcyBtYXRjaFxuIiwKLQkJCQlfX2Z1bmNfXywgY21kLT5sZW5ndGgsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfYnVmX2luZm8pKTsKLQkJCXJjID0gLUVJTlZBTCA7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCQlyYyA9IHZmZTMxX2N0cmwtPnN0YXRzX29wcy5lbnF1ZXVlX2J1ZigmdmZlMzFfY3RybC0+c3RhdHNfY3RybCwKLQkJCQkoc3RydWN0IG1zbV9zdGF0c19idWZfaW5mbyAqKWNtZC0+dmFsdWUsCi0JCQkJdmZlMzFfY3RybC0+c3RhdHNfb3BzLmNsaWVudCwgZG9tYWluX251bSk7Ci0JYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX1NUQVRTX0ZMVVNIX0JVRlE6IHsKLQkJc3RydWN0IG1zbV9zdGF0c19mbHVzaF9idWZxICpmbHVzaF9yZXEgPSBOVUxMOwotCQlmbHVzaF9yZXEgPSAoc3RydWN0IG1zbV9zdGF0c19mbHVzaF9idWZxICopY21kLT52YWx1ZTsKLQkJaWYgKHNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX2ZsdXNoX2J1ZnEpICE9IGNtZC0+bGVuZ3RoKSB7Ci0JCQkvKiBlcnJvci4gdGhlIGxlbmd0aCBub3QgbWF0Y2ggKi8KLQkJCXByX2VycigiJXM6IHN0YXRzIGZsdXNoIHF1ZXVlIGlucHV0IHNpemUgPSAlZCxcbiIKLQkJCQkic3RydWN0IHNpemUgPSAlZCwgbWl0Y2ggbWF0Y2hcbiIsCi0JCQkJX19mdW5jX18sIGNtZC0+bGVuZ3RoLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX2ZsdXNoX2J1ZnEpKTsKLQkJCXJjID0gLUVJTlZBTCA7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCQlyYyA9IHZmZTMxX2N0cmwtPnN0YXRzX29wcy5idWZxX2ZsdXNoKCZ2ZmUzMV9jdHJsLT5zdGF0c19jdHJsLAotCQkJCShlbnVtIG1zbV9zdGF0c19lbnVtX3R5cGUpZmx1c2hfcmVxLT5zdGF0c190eXBlLAotCQkJCXZmZTMxX2N0cmwtPnN0YXRzX29wcy5jbGllbnQpOwotCX0KLQlicmVhazsKLQljYXNlIFZGRV9DTURfU1RBVFNfVU5SRUdCVUY6Ci0JewotCQlzdHJ1Y3QgbXNtX3N0YXRzX3JlcWJ1ZiAqcmVxX2J1ZiA9IE5VTEw7Ci0JCXJlcV9idWYgPSAoc3RydWN0IG1zbV9zdGF0c19yZXFidWYgKiljbWQtPnZhbHVlOwotCQlpZiAoc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfcmVxYnVmKSAhPSBjbWQtPmxlbmd0aCkgewotCQkJLyogZXJyb3IuIHRoZSBsZW5ndGggbm90IG1hdGNoICovCi0JCQlwcl9lcnIoIiVzOiBzdGF0cyByZXFidWYgaW5wdXQgc2l6ZSA9ICVkLFxuIgotCQkJCSJzdHJ1Y3Qgc2l6ZSA9ICVkLCBtaXRjaCBtYXRjaFxuIiwKLQkJCQkgX19mdW5jX18sIGNtZC0+bGVuZ3RoLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX3JlcWJ1ZikpOwotCQkJcmMgPSAtRUlOVkFMIDsKLQkJCWdvdG8gZW5kOwotCQl9Ci0JCXJjID0gdmZlMzFfc3RhdHNfdW5yZWdidWYocmVxX2J1ZiwgZG9tYWluX251bSk7Ci0JfQotCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLTE7Ci0JCXByX2VycigiJXM6IGNtZF90eXBlICVkIG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXywKLQkJCWNtZC0+Y21kX3R5cGUpOwotCWJyZWFrOwotCX0KLWVuZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMxX3Byb2Nlc3Nfc3RhdHNfaXJxKHVpbnQzMl90ICppcnFzdGF0dXMpCi17Ci0JdWludDMyX3Qgc3RhdHVzX2JpdHMgPSBWRkVfQ09NX1NUQVRVUyAmICppcnFzdGF0dXM7Ci0KLQlpZiAoKHZmZTMxX2N0cmwtPmhmcl9tb2RlICE9IEhGUl9NT0RFX09GRikgJiYKLQkJKHZmZTMxX2N0cmwtPnZmZUZyYW1lSWQgJSB2ZmUzMV9jdHJsLT5oZnJfbW9kZSAhPSAwKSkgewotCQlDREJHKCJTa2lwIHRoZSBzdGF0cyB3aGVuIEhGUiBlbmFibGVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXZmZTMxX3Byb2Nlc3Nfc3RhdHMoc3RhdHVzX2JpdHMpOwotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzFfZG9fdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXN0cnVjdCB2ZmUzMV9pc3JfcXVldWVfY21kICpxY21kID0gTlVMTDsKLQotCUNEQkcoIj09PSB2ZmUzMV9kb190YXNrbGV0IHN0YXJ0ID09PVxuIik7Ci0KLQl3aGlsZSAoYXRvbWljX3JlYWQoJmlycV9jbnQpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMV9jdHJsLT50YXNrbGV0X2xvY2ssIGZsYWdzKTsKLQkJcWNtZCA9IGxpc3RfZmlyc3RfZW50cnkoJnZmZTMxX2N0cmwtPnRhc2tsZXRfcSwKLQkJCXN0cnVjdCB2ZmUzMV9pc3JfcXVldWVfY21kLCBsaXN0KTsKLQkJYXRvbWljX3N1YigxLCAmaXJxX2NudCk7Ci0KLQkJaWYgKCFxY21kKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMV9jdHJsLT50YXNrbGV0X2xvY2ssCi0JCQkJZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJbGlzdF9kZWwoJnFjbWQtPmxpc3QpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMV9jdHJsLT50YXNrbGV0X2xvY2ssCi0JCQlmbGFncyk7Ci0KLQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czAgJgotCQkJVkZFX0lSUV9TVEFUVVMwX0NBTUlGX1NPRl9NQVNLKSB7Ci0JCQlDREJHKCJpcnEJY2FtaWZTb2ZJcnFcbiIpOwotCQkJdmZlMzFfcHJvY2Vzc19jYW1pZl9zb2ZfaXJxKCk7Ci0JCX0KLQkJLyogaW50ZXJydXB0IHRvIGJlIHByb2Nlc3NlZCwgICpxY21kIGhhcyB0aGUgcGF5bG9hZC4gICovCi0JCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCVZGRV9JUlFfU1RBVFVTMF9SRUdfVVBEQVRFX01BU0spIHsKLQkJCUNEQkcoImlycQlyZWdVcGRhdGVJcnFcbiIpOwotCQkJdmZlMzFfcHJvY2Vzc19yZWdfdXBkYXRlX2lycSgpOwotCQl9Ci0KLQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czEgJgotCQkJVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HXzEpIHsKLQkJCUNEQkcoImlycQlyZXNldEFja0lycVxuIik7Ci0JCQl2ZmUzMV9wcm9jZXNzX3Jlc2V0X2lycSgpOwotCQl9Ci0KLQkJaWYgKGF0b21pY19yZWFkKCZ2ZmUzMV9jdHJsLT52c3RhdGUpKSB7Ci0JCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMSAmCi0JCQkJVkZFMzFfSU1BU0tfRVJST1JfT05MWV8xKSB7Ci0JCQkJcHJfZXJyKCJpcnEJZXJyb3JJcnFcbiIpOwotCQkJCXZmZTMxX3Byb2Nlc3NfZXJyb3JfaXJxKAotCQkJCQlxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMxICYKLQkJCQkJVkZFMzFfSU1BU0tfRVJST1JfT05MWV8xKTsKLQkJCX0KLQkJCS8qIG5leHQsIGNoZWNrIG91dHB1dCBwYXRoIHJlbGF0ZWQgaW50ZXJydXB0cy4gKi8KLQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQlWRkVfSVJRX1NUQVRVUzBfSU1BR0VfQ09NUE9TSVRfRE9ORTBfTUFTSykgewotCQkJCUNEQkcoIkltYWdlIGNvbXBvc2l0ZSBkb25lIDAgaXJxIG9jY3VyZWQuXG4iKTsKLQkJCQl2ZmUzMV9wcm9jZXNzX291dHB1dF9wYXRoX2lycV8wKCk7Ci0JCQl9Ci0JCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJVkZFX0lSUV9TVEFUVVMwX0lNQUdFX0NPTVBPU0lUX0RPTkUxX01BU0spIHsKLQkJCQlDREJHKCJJbWFnZSBjb21wb3NpdGUgZG9uZSAxIGlycSBvY2N1cmVkLlxuIik7Ci0JCQkJdmZlMzFfcHJvY2Vzc19vdXRwdXRfcGF0aF9pcnFfMSgpOwotCQkJfQotCQkJLyogaW4gc25hcHNob3QgbW9kZSBpZiBkb25lIHRoZW4gc2VuZAotCQkJc25hcHNob3QgZG9uZSBtZXNzYWdlICovCi0JCQlpZiAodmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0KLQkJCQkJVkZFX09VVFBVVFNfVEhVTUJfQU5EX01BSU4gfHwKLQkJCQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJCQlWRkVfT1VUUFVUU19NQUlOX0FORF9USFVNQiB8fAotCQkJCXZmZTMxX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQkJCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9KUEVHIHx8Ci0JCQkJdmZlMzFfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0KLQkJCQkJVkZFX09VVFBVVFNfSlBFR19BTkRfVEhVTUIgfHwKLQkJCQl2ZmUzMV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJCQlWRkVfT1VUUFVUU19SQVcpIHsKLQkJCQlpZiAoKHZmZTMxX2N0cmwtPm91dHBhdGgub3V0MC5jYXB0dXJlX2NudCA9PSAwKQotCQkJCQkmJiAodmZlMzFfY3RybC0+b3V0cGF0aC5vdXQxLgotCQkJCQljYXB0dXJlX2NudCA9PSAwKSkgewotCQkJCQltc21fY2FtZXJhX2lvX3dfbWIoCi0JCQkJCQlDQU1JRl9DT01NQU5EX1NUT1BfSU1NRURJQVRFTFksCi0JCQkJCQl2ZmUzMV9jdHJsLT52ZmViYXNlICsKLQkJCQkJCVZGRV9DQU1JRl9DT01NQU5EKTsKLQkJCQkJdmZlMzFfc2VuZF9pc3BfbXNnKHZmZTMxX2N0cmwsCi0JCQkJCQlNU0dfSURfU05BUFNIT1RfRE9ORSk7Ci0JCQkJfQotCQkJfQotCQkJLyogdGhlbiBwcm9jZXNzIHN0YXRzIGlycS4gKi8KLQkJCWlmICh2ZmUzMV9jdHJsLT5zdGF0c19jb21wKSB7Ci0JCQkJLyogcHJvY2VzcyBzdGF0cyBjb21iIGludGVycnVwdC4gKi8KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCVZGRV9JUlFfU1RBVFVTMF9TVEFUU19DT01QT1NJVF9NQVNLKSB7Ci0JCQkJCUNEQkcoIlN0YXRzIGNvbXBvc2l0ZSBpcnEgb2NjdXJlZC5cbiIpOwotCQkJCQl2ZmUzMV9wcm9jZXNzX3N0YXRzX2lycSgKLQkJCQkJCSZxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qIHByb2Nlc3MgaW5kaXZpZHVhbCBzdGF0cyBpbnRlcnJ1cHQuICovCi0JCQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czAgJgotCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQUVDKSB7Ci0JCQkJCUNEQkcoIlN0YXRzIEFFQyBpcnEgb2NjdXJlZC5cbiIpOwotCQkJCQl2ZmUzMV9wcm9jZXNzX3N0YXRzX2FlX2lycSgpOwotCQkJCX0KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCVZGRV9JUlFfU1RBVFVTMF9TVEFUU19BV0IpIHsKLQkJCQkJQ0RCRygiU3RhdHMgQVdCIGlycSBvY2N1cmVkLlxuIik7Ci0JCQkJCXZmZTMxX3Byb2Nlc3Nfc3RhdHNfYXdiX2lycSgpOwotCQkJCX0KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCVZGRV9JUlFfU1RBVFVTMF9TVEFUU19BRikgewotCQkJCQlDREJHKCJTdGF0cyBBRiBpcnEgb2NjdXJlZC5cbiIpOwotCQkJCQl2ZmUzMV9wcm9jZXNzX3N0YXRzX2FmX2lycSgpOwotCQkJCX0KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCVZGRV9JUlFfU1RBVFVTMF9TVEFUU19JSElTVCkgewotCQkJCQlDREJHKCJTdGF0cyBJSElTVCBpcnEgb2NjdXJlZC5cbiIpOwotCQkJCQl2ZmUzMV9wcm9jZXNzX3N0YXRzX2loaXN0X2lycSgpOwotCQkJCX0KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCVZGRV9JUlFfU1RBVFVTMF9TVEFUU19SUykgewotCQkJCQlDREJHKCJTdGF0cyBSUyBpcnEgb2NjdXJlZC5cbiIpOwotCQkJCQl2ZmUzMV9wcm9jZXNzX3N0YXRzX3JzX2lycSgpOwotCQkJCX0KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCVZGRV9JUlFfU1RBVFVTMF9TVEFUU19DUykgewotCQkJCQlDREJHKCJTdGF0cyBDUyBpcnEgb2NjdXJlZC5cbiIpOwotCQkJCQl2ZmUzMV9wcm9jZXNzX3N0YXRzX2NzX2lycSgpOwotCQkJCX0KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCVZGRV9JUlFfU1RBVFVTMF9TWU5DX1RJTUVSMCkgewotCQkJCQlDREJHKCJTWU5DX1RJTUVSIDAgaXJxIG9jY3VyZWQuXG4iKTsKLQkJCQkJdmZlMzFfc2VuZF9pc3BfbXNnKHZmZTMxX2N0cmwsCi0JCQkJCQlNU0dfSURfU1lOQ19USU1FUjBfRE9ORSk7Ci0JCQkJfQotCQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQkJVkZFX0lSUV9TVEFUVVMwX1NZTkNfVElNRVIxKSB7Ci0JCQkJCUNEQkcoIlNZTkNfVElNRVIgMSBpcnEgb2NjdXJlZC5cbiIpOwotCQkJCQl2ZmUzMV9zZW5kX2lzcF9tc2codmZlMzFfY3RybCwKLQkJCQkJCU1TR19JRF9TWU5DX1RJTUVSMV9ET05FKTsKLQkJCQl9Ci0JCQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czAgJgotCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1lOQ19USU1FUjIpIHsKLQkJCQkJQ0RCRygiU1lOQ19USU1FUiAyIGlycSBvY2N1cmVkLlxuIik7Ci0JCQkJCXZmZTMxX3NlbmRfaXNwX21zZyh2ZmUzMV9jdHJsLAotCQkJCQkJTVNHX0lEX1NZTkNfVElNRVIyX0RPTkUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlrZnJlZShxY21kKTsKLQl9Ci0JQ0RCRygiPT09IHZmZTMxX2RvX3Rhc2tsZXQgZW5kID09PVxuIik7Ci19Ci0KLURFQ0xBUkVfVEFTS0xFVCh2ZmUzMV90YXNrbGV0LCB2ZmUzMV9kb190YXNrbGV0LCAwKTsKLQotc3RhdGljIGlycXJldHVybl90IHZmZTMxX3BhcnNlX2lycShpbnQgaXJxX251bSwgdm9pZCAqZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCB2ZmUzMV9pcnFfc3RhdHVzIGlycTsKLQlzdHJ1Y3QgdmZlMzFfaXNyX3F1ZXVlX2NtZCAqcWNtZDsKLQotCUNEQkcoInZmZV9wYXJzZV9pcnFcbiIpOwotCi0JdmZlMzFfcmVhZF9pcnFfc3RhdHVzKCZpcnEpOwotCi0JaWYgKChpcnEudmZlSXJxU3RhdHVzMCA9PSAwKSAmJiAoaXJxLnZmZUlycVN0YXR1czEgPT0gMCkpIHsKLQkJQ0RCRygidmZlX3BhcnNlX2lycTogdmZlSXJxU3RhdHVzMCAmIDEgYXJlIGJvdGggMCFcbiIpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JcWNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZmUzMV9pc3JfcXVldWVfY21kKSwKLQkJR0ZQX0FUT01JQyk7Ci0JaWYgKCFxY21kKSB7Ci0JCXByX2VycigidmZlX3BhcnNlX2lycTogcWNtZCBtYWxsb2MgZmFpbGVkIVxuIik7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMzFfY3RybC0+c3RvcF9mbGFnX2xvY2ssIGZsYWdzKTsKLQlpZiAodmZlMzFfY3RybC0+c3RvcF9hY2tfcGVuZGluZykgewotCQlpcnEudmZlSXJxU3RhdHVzMCAmPSBWRkVfSU1BU0tfV0hJTEVfU1RPUFBJTkdfMDsKLQkJaXJxLnZmZUlycVN0YXR1czEgJj0gVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HXzE7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMxX2N0cmwtPnN0b3BfZmxhZ19sb2NrLCBmbGFncyk7Ci0KLQlDREJHKCJ2ZmVfcGFyc2VfaXJxOiBJcnFfc3RhdHVzMCA9IDB4JXgsIElycV9zdGF0dXMxID0gMHgleC5cbiIsCi0JCWlycS52ZmVJcnFTdGF0dXMwLCBpcnEudmZlSXJxU3RhdHVzMSk7Ci0KLQlxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwID0gaXJxLnZmZUlycVN0YXR1czA7Ci0JcWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMSA9IGlycS52ZmVJcnFTdGF0dXMxOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMxX2N0cmwtPnRhc2tsZXRfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJnFjbWQtPmxpc3QsICZ2ZmUzMV9jdHJsLT50YXNrbGV0X3EpOwotCi0JYXRvbWljX2FkZCgxLCAmaXJxX2NudCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzFfY3RybC0+dGFza2xldF9sb2NrLCBmbGFncyk7Ci0JdGFza2xldF9zY2hlZHVsZSgmdmZlMzFfdGFza2xldCk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgbG9uZyBtc21fdmZlX3N1YmRldl9pb2N0bChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCQkJdW5zaWduZWQgaW50IHN1YmRldl9jbWQsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCA9Ci0JCShzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICopdjRsMl9nZXRfc3ViZGV2X2hvc3RkYXRhKHNkKTsKLQlzdHJ1Y3QgbXNtX2lzcF9jbWQgdmZlY21kOwotCXN0cnVjdCBtc21fY2FtdmZlX3BhcmFtcyAqdmZlX3BhcmFtczsKLQlzdHJ1Y3QgbXNtX3ZmZV9jZmdfY21kICpjbWQ7Ci0Jdm9pZCAqZGF0YTsKLQotCWxvbmcgcmMgPSAwOwotCXN0cnVjdCB2ZmVfY21kX3N0YXRzX2J1ZiAqc2NmZyA9IE5VTEw7Ci0Jc3RydWN0IHZmZV9jbWRfc3RhdHNfYWNrICpzYWNrID0gTlVMTDsKLQotCWlmIChzdWJkZXZfY21kID09IFZJRElPQ19NU01fVkZFX0lOSVQpIHsKLQkJQ0RCRygiJXMgaW5pdFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gbXNtX3ZmZV9zdWJkZXZfaW5pdChzZCk7Ci0JfSBlbHNlIGlmIChzdWJkZXZfY21kID09IFZJRElPQ19NU01fVkZFX1JFTEVBU0UpIHsKLQkJbXNtX3ZmZV9zdWJkZXZfcmVsZWFzZShzZCk7Ci0JCXJldHVybiAwOwotCX0KLQl2ZmVfcGFyYW1zID0gKHN0cnVjdCBtc21fY2FtdmZlX3BhcmFtcyAqKWFyZzsKLQljbWQgPSB2ZmVfcGFyYW1zLT52ZmVfY2ZnOwotCWRhdGEgPSB2ZmVfcGFyYW1zLT5kYXRhOwotCi0Jc3dpdGNoIChjbWQtPmNtZF90eXBlKSB7Ci0JY2FzZSBWRkVfQ01EX1NUQVRTX1JFUUJVRjoKLQljYXNlIFZGRV9DTURfU1RBVFNfRU5RVUVVRUJVRjoKLQljYXNlIFZGRV9DTURfU1RBVFNfRkxVU0hfQlVGUToKLQljYXNlIFZGRV9DTURfU1RBVFNfVU5SRUdCVUY6Ci0JCS8qIGZvciBlYXN5IHBvcnRpbmcgcHV0IGluIG9uZSBlbnZlbG9wZSAqLwotCQlyYyA9IHZmZV9zdGF0c19idWZxX3N1Yl9pb2N0bChjbWQsIHZmZV9wYXJhbXMtPmRhdGEsCi0JCQlwbWN0bC0+ZG9tYWluX251bSk7Ci0JCXJldHVybiByYzsKLQlkZWZhdWx0OgotCQlpZiAoY21kLT5jbWRfdHlwZSAhPSBDTURfQ09ORklHX1BJTkdfQUREUiAmJgotCQkJY21kLT5jbWRfdHlwZSAhPSBDTURfQ09ORklHX1BPTkdfQUREUiAmJgotCQkJY21kLT5jbWRfdHlwZSAhPSBDTURfQ09ORklHX0ZSRUVfQlVGX0FERFIgJiYKLQkJCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX0FFQ19CVUZfUkVMRUFTRSAmJgotCQkJY21kLT5jbWRfdHlwZSAhPSBDTURfU1RBVFNfQVdCX0JVRl9SRUxFQVNFICYmCi0JCQljbWQtPmNtZF90eXBlICE9IENNRF9TVEFUU19JSElTVF9CVUZfUkVMRUFTRSAmJgotCQkJY21kLT5jbWRfdHlwZSAhPSBDTURfU1RBVFNfUlNfQlVGX1JFTEVBU0UgJiYKLQkJCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX0NTX0JVRl9SRUxFQVNFICYmCi0JCQljbWQtPmNtZF90eXBlICE9IENNRF9TVEFUU19BRl9CVUZfUkVMRUFTRSkgewotCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmdmZlY21kLAotCQkJCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQkJCXNpemVvZih2ZmVjbWQpKSkgewotCQkJCQkJcHJfZXJyKCIlcyAlZDogY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLAotCQkJCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQl9IGVsc2UgewotCQkJLyogaGVyZSBlaXRoIHN0YXRzIHJlbGVhc2Ugb3IgZnJhbWUgcmVsZWFzZS4gKi8KLQkJCWlmIChjbWQtPmNtZF90eXBlICE9IENNRF9DT05GSUdfUElOR19BRERSICYmCi0JCQkJY21kLT5jbWRfdHlwZSAhPSBDTURfQ09ORklHX1BPTkdfQUREUiAmJgotCQkJCWNtZC0+Y21kX3R5cGUgIT0gQ01EX0NPTkZJR19GUkVFX0JVRl9BRERSKSB7Ci0JCQkJLyogdGhlbiBtdXN0IGJlIHN0YXRzIHJlbGVhc2UuICovCi0JCQkJaWYgKCFkYXRhKSB7Ci0JCQkJCXByX2VycigiJXM6IGRhdGEgPSBOVUxMLCIgXAotCQkJCQkJImNtZC0+Y21kX3R5cGUgPSAlZFxuIiwKLQkJCQkJCV9fZnVuY19fLCBjbWQtPmNtZF90eXBlKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCXNhY2sgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmZlX2NtZF9zdGF0c19hY2spLAotCQkJCQkJCUdGUF9BVE9NSUMpOwotCQkJCWlmICghc2FjaykgewotCQkJCQlwcl9lcnIoIiVzOiBubyBtZW0gZm9yIiBcCi0JCQkJCQkiY21kLT5jbWRfdHlwZSA9ICVkXG4iLAotCQkJCQkJX19mdW5jX18sIGNtZC0+Y21kX3R5cGUpOwotCQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCQl9Ci0KLQkJCQlzYWNrLT5uZXh0U3RhdHNCdWYgPSAqKHVpbnQzMl90ICopZGF0YTsKLQkJCX0KLQkJfQotCi0JCUNEQkcoIiVzOiBjbWRUeXBlID0gJWRcbiIsIF9fZnVuY19fLCBjbWQtPmNtZF90eXBlKTsKLQotCQlpZiAoKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0FGX0VOQUJMRSkgICAgfHwKLQkJCShjbWQtPmNtZF90eXBlID09IENNRF9TVEFUU19BV0JfRU5BQkxFKSAgIHx8Ci0JCQkoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfSUhJU1RfRU5BQkxFKSB8fAotCQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX1JTX0VOQUJMRSkgICAgfHwKLQkJCShjbWQtPmNtZF90eXBlID09IENNRF9TVEFUU19DU19FTkFCTEUpICAgIHx8Ci0JCQkoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfQUVDX0VOQUJMRSkpIHsKLQkJCXNjZmcgPSBOVUxMOwotCQkJZ290byB2ZmUzMV9jb25maWdfZG9uZTsKLQkJfQotCQlzd2l0Y2ggKGNtZC0+Y21kX3R5cGUpIHsKLQkJY2FzZSBDTURfR0VORVJBTDogewotCQkJcmMgPSB2ZmUzMV9wcm9jX2dlbmVyYWwocG1jdGwsICZ2ZmVjbWQpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgQ01EX0NPTkZJR19QSU5HX0FERFI6IHsKLQkJCWludCBwYXRoID0gKigoaW50ICopY21kLT52YWx1ZSk7Ci0JCQlzdHJ1Y3QgdmZlMzFfb3V0cHV0X2NoICpvdXRjaCA9IHZmZTMxX2dldF9jaChwYXRoKTsKLQkJCW91dGNoLT5waW5nID0gKigoc3RydWN0IG1zbV9mcmVlX2J1ZiAqKWRhdGEpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfQ09ORklHX1BPTkdfQUREUjogewotCQkJaW50IHBhdGggPSAqKChpbnQgKiljbWQtPnZhbHVlKTsKLQkJCXN0cnVjdCB2ZmUzMV9vdXRwdXRfY2ggKm91dGNoID0gdmZlMzFfZ2V0X2NoKHBhdGgpOwotCQkJb3V0Y2gtPnBvbmcgPSAqKChzdHJ1Y3QgbXNtX2ZyZWVfYnVmICopZGF0YSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIENNRF9DT05GSUdfRlJFRV9CVUZfQUREUjogewotCQkJaW50IHBhdGggPSAqKChpbnQgKiljbWQtPnZhbHVlKTsKLQkJCXN0cnVjdCB2ZmUzMV9vdXRwdXRfY2ggKm91dGNoID0gdmZlMzFfZ2V0X2NoKHBhdGgpOwotCQkJb3V0Y2gtPmZyZWVfYnVmID0gKigoc3RydWN0IG1zbV9mcmVlX2J1ZiAqKWRhdGEpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfU05BUF9CVUZfUkVMRUFTRToKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX0FYSV9DRkdfUFJJTTogewotCQkJdWludDMyX3QgKmF4aW8gPSBOVUxMOwotCQkJYXhpbyA9IGttYWxsb2ModmZlMzFfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCwKLQkJCQlHRlBfQVRPTUlDKTsKLQkJCWlmICghYXhpbykgewotCQkJCXJjID0gLUVOT01FTTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXZmZTMxX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgpKSB7Ci0JCQkJa2ZyZWUoYXhpbyk7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJdmZlMzFfY29uZmlnX2F4aShPVVRQVVRfUFJJTSwgYXhpbyk7Ci0JCQlrZnJlZShheGlvKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX0FYSV9DRkdfUFJJTV9BTExfQ0hOTFM6IHsKLQkJCXVpbnQzMl90ICpheGlvID0gTlVMTDsKLQkJCWF4aW8gPSBrbWFsbG9jKHZmZTMxX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgsCi0JCQkJCUdGUF9BVE9NSUMpOwotCQkJaWYgKCFheGlvKSB7Ci0JCQkJcmMgPSAtRU5PTUVNOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoY29weV9mcm9tX3VzZXIoYXhpbywgKHZvaWQgX191c2VyICopKHZmZWNtZC52YWx1ZSksCi0JCQkJdmZlMzFfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCkpIHsKLQkJCQlrZnJlZShheGlvKTsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl2ZmUzMV9jb25maWdfYXhpKE9VVFBVVF9QUklNX0FMTF9DSE5MUywgYXhpbyk7Ci0JCQlrZnJlZShheGlvKTsKLQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfQVhJX0NGR19QUklNfENNRF9BWElfQ0ZHX1NFQzogewotCQkJdWludDMyX3QgKmF4aW8gPSBOVUxMOwotCQkJYXhpbyA9IGttYWxsb2ModmZlMzFfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCwKLQkJCQkJR0ZQX0FUT01JQyk7Ci0JCQlpZiAoIWF4aW8pIHsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChjb3B5X2Zyb21fdXNlcihheGlvLCAodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQl2ZmUzMV9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ubGVuZ3RoKSkgewotCQkJCWtmcmVlKGF4aW8pOwotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXZmZTMxX2NvbmZpZ19heGkoT1VUUFVUX1BSSU18T1VUUFVUX1NFQywgYXhpbyk7Ci0JCQlrZnJlZShheGlvKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX0FYSV9DRkdfUFJJTXxDTURfQVhJX0NGR19TRUNfQUxMX0NITkxTOiB7Ci0JCQl1aW50MzJfdCAqYXhpbyA9IE5VTEw7Ci0JCQlheGlvID0ga21hbGxvYyh2ZmUzMV9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ubGVuZ3RoLAotCQkJCQlHRlBfQVRPTUlDKTsKLQkJCWlmICghYXhpbykgewotCQkJCXJjID0gLUVOT01FTTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXZmZTMxX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgpKSB7Ci0JCQkJa2ZyZWUoYXhpbyk7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJdmZlMzFfY29uZmlnX2F4aQotCQkJCShPVVRQVVRfUFJJTXxPVVRQVVRfU0VDX0FMTF9DSE5MUywgYXhpbyk7Ci0JCQlrZnJlZShheGlvKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX0FYSV9DRkdfUFJJTV9BTExfQ0hOTFN8Q01EX0FYSV9DRkdfU0VDOiB7Ci0JCQl1aW50MzJfdCAqYXhpbyA9IE5VTEw7Ci0JCQlheGlvID0ga21hbGxvYyh2ZmUzMV9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ubGVuZ3RoLAotCQkJCUdGUF9BVE9NSUMpOwotCQkJaWYgKCFheGlvKSB7Ci0JCQkJcmMgPSAtRU5PTUVNOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoY29weV9mcm9tX3VzZXIoYXhpbywgKHZvaWQgX191c2VyICopKHZmZWNtZC52YWx1ZSksCi0JCQkJdmZlMzFfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCkpIHsKLQkJCQlrZnJlZShheGlvKTsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl2ZmUzMV9jb25maWdfYXhpCi0JCQkJKE9VVFBVVF9QUklNX0FMTF9DSE5MU3xPVVRQVVRfU0VDLCBheGlvKTsKLQkJCWtmcmVlKGF4aW8pOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfQVhJX0NGR19QUklNX0FMTF9DSE5MU3xDTURfQVhJX0NGR19TRUNfQUxMX0NITkxTOiB7Ci0JCQlwcl9lcnIoIiVzIEludmFsaWQvVW5zdXBwb3J0ZWQgQVhJIGNvbmZpZ3VyYXRpb24gJXgiLAotCQkJCV9fZnVuY19fLCBjbWQtPmNtZF90eXBlKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX0FYSV9TVEFSVDoKLQkJCS8qIE5vIG5lZWQgdG8gZGVjb3VwbGUgQVhJL1ZGRSBmb3IgVkZFMy4xKi8KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX0FYSV9TVE9QOgotCQkJLyogTm8gbmVlZCB0byBkZWNvdXBsZSBBWEkvVkZFIGZvciBWRkUzLjEqLwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfQVhJX1JFU0VUOgotCQkJLyogTm8gbmVlZCB0byBkZWNvdXBsZSBBWEkvVkZFIGZvciBWRkUzLjEqLwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXByX2VycigiJXMgVW5zdXBwb3J0ZWQgQVhJIGNvbmZpZ3VyYXRpb24gJXggIiwgX19mdW5jX18sCi0JCQkJY21kLT5jbWRfdHlwZSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLXZmZTMxX2NvbmZpZ19kb25lOgotCWtmcmVlKHNjZmcpOwotCWtmcmVlKHNhY2spOwotCUNEQkcoIiVzIGRvbmU6IHJjID0gJWRcbiIsIF9fZnVuY19fLCAoaW50KSByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV92ZmVfc3ViZGV2X3NfY3J5c3RhbF9mcmVxKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JdTMyIGZyZXEsIHUzMiBmbGFncykKLXsKLQlpbnQgcmMgPSAwOwotCWludCByb3VuZF9yYXRlOwotCi0Jcm91bmRfcmF0ZSA9IGNsa19yb3VuZF9yYXRlKHZmZTMxX2N0cmwtPnZmZV9jbGtbMF0sIGZyZXEpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogY2xrX3JvdW5kX3JhdGUgZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXZmZV9jbGtfcmF0ZSA9IHJvdW5kX3JhdGU7Ci0JcmMgPSBjbGtfc2V0X3JhdGUodmZlMzFfY3RybC0+dmZlX2Nsa1swXSwgcm91bmRfcmF0ZSk7Ci0JaWYgKHJjIDwgMCkKLQkJcHJfZXJyKCIlczogY2xrX3NldF9yYXRlIGZhaWxlZCAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG1zbV92ZmVfc3ViZGV2X3ZpZGVvX29wcyA9IHsKLQkuc19jcnlzdGFsX2ZyZXEgPSBtc21fdmZlX3N1YmRldl9zX2NyeXN0YWxfZnJlcSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbXNtX3ZmZV9zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmlvY3RsID0gbXNtX3ZmZV9zdWJkZXZfaW9jdGwsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBtc21fdmZlX3N1YmRldl9vcHMgPSB7Ci0JLmNvcmUgPSAmbXNtX3ZmZV9zdWJkZXZfY29yZV9vcHMsCi0JLnZpZGVvID0gJm1zbV92ZmVfc3ViZGV2X3ZpZGVvX29wcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbV9jbGtfaW5mbyB2ZmVfY2xrX2luZm9bXSA9IHsKLQl7InZmZV9jbGsiLCBWRkVfQ0xLX1JBVEV9LAotCXsidmZlX3BjbGsiLCAtMX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1fY2xrX2luZm8gdmZlX2NhbWlmX2Nsa19pbmZvW10gPSB7Ci0JeyJjYW1pZl9wYWRfcGNsayIsIC0xfSwKLQl7InZmZV9jYW1pZl9jbGsiLCAtMX0sCi19OwotCi1zdGF0aWMgdm9pZCBtc21fdmZlX2NhbWlvX2Nsa19zZWwoZW51bSBtc21fY2FtaW9fY2xrX3NyY190eXBlIHNyY3R5cGUpCi17Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKLQotCWNsayA9IHZmZTMxX2N0cmwtPnZmZV9jbGtbMF07Ci0KLQlpZiAoY2xrICE9IE5VTEwpIHsKLQkJc3dpdGNoIChzcmN0eXBlKSB7Ci0JCWNhc2UgTVNNX0NBTUlPX0NMS19TUkNfSU5URVJOQUw6Ci0JCQljbGtfc2V0X2ZsYWdzKGNsaywgMHgwMDAwMDEwMCA8PCAxKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTVNNX0NBTUlPX0NMS19TUkNfRVhURVJOQUw6Ci0JCQljbGtfc2V0X2ZsYWdzKGNsaywgMHgwMDAwMDEwMCk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV92ZmVfY2FtaWZfcGFkX3JlZ19yZXNldCh2b2lkKQotewotCXVpbnQzMl90IHJlZzsKLQotCW1zbV92ZmVfY2FtaW9fY2xrX3NlbChNU01fQ0FNSU9fQ0xLX1NSQ19JTlRFUk5BTCk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxNTAwMCk7Ci0KLQlyZWcgPSAobXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPmNhbWlmYmFzZSkpICYgQ0FNSUZfQ0ZHX1JNU0s7Ci0JcmVnIHw9IDB4MzsKLQltc21fY2FtZXJhX2lvX3cocmVnLCB2ZmUzMV9jdHJsLT5jYW1pZmJhc2UpOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTUwMDApOwotCi0JcmVnID0gKG1zbV9jYW1lcmFfaW9fcih2ZmUzMV9jdHJsLT5jYW1pZmJhc2UpKSAmIENBTUlGX0NGR19STVNLOwotCXJlZyB8PSAweDEwOwotCW1zbV9jYW1lcmFfaW9fdyhyZWcsIHZmZTMxX2N0cmwtPmNhbWlmYmFzZSk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxNTAwMCk7Ci0KLQlyZWcgPSAobXNtX2NhbWVyYV9pb19yKHZmZTMxX2N0cmwtPmNhbWlmYmFzZSkpICYgQ0FNSUZfQ0ZHX1JNU0s7Ci0JLyogTmVlZCB0byBiZSB1bmludmVydGVkKi8KLQlyZWcgJj0gMHgwMzsKLQltc21fY2FtZXJhX2lvX3cocmVnLCB2ZmUzMV9jdHJsLT5jYW1pZmJhc2UpOwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTUwMDApOwotfQotCi1pbnQgbXNtX3ZmZV9zdWJkZXZfaW5pdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqbWN0bDsKLQltY3RsID0gdjRsMl9nZXRfc3ViZGV2X2hvc3RkYXRhKHNkKTsKLQlpZiAobWN0bCA9PSBOVUxMKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBtY3RsX2ZhaWxlZDsKLQl9Ci0KLQlzcGluX2xvY2tfaW5pdCgmdmZlMzFfY3RybC0+c3RvcF9mbGFnX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZ2ZmUzMV9jdHJsLT5zdGF0ZV9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmdmZlMzFfY3RybC0+c3RhdHNfYnVmcV9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmdmZlMzFfY3RybC0+aW9fbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnZmZTMxX2N0cmwtPnVwZGF0ZV9hY2tfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnZmZTMxX2N0cmwtPnRhc2tsZXRfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnZmZTMxX2N0cmwtPnNkX25vdGlmeV9sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmdmZlMzFfY3RybC0+dGFza2xldF9xKTsKLQotCW1lbXNldCgmdmZlMzFfY3RybC0+c3RhdHNfY3RybCwgMCwgc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfYnVmcV9jdHJsKSk7Ci0JbWVtc2V0KCZ2ZmUzMV9jdHJsLT5zdGF0c19vcHMsIDAsIHNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX29wcykpOwotCi0JdmZlMzFfY3RybC0+dXBkYXRlX2xpbmVhciA9IGZhbHNlOwotCXZmZTMxX2N0cmwtPnVwZGF0ZV9yb2xsb2ZmID0gZmFsc2U7Ci0JdmZlMzFfY3RybC0+dXBkYXRlX2xhID0gZmFsc2U7Ci0JdmZlMzFfY3RybC0+dXBkYXRlX2dhbW1hID0gZmFsc2U7Ci0JdmZlMzFfY3RybC0+aGZyX21vZGUgPSBIRlJfTU9ERV9PRkY7Ci0KLQl2ZmUzMV9jdHJsLT52ZmViYXNlID0gaW9yZW1hcCh2ZmUzMV9jdHJsLT52ZmVtZW0tPnN0YXJ0LAotCQlyZXNvdXJjZV9zaXplKHZmZTMxX2N0cmwtPnZmZW1lbSkpOwotCWlmICghdmZlMzFfY3RybC0+dmZlYmFzZSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCXByX2VycigiJXM6IHZmZSBpb3JlbWFwIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIHZmZV9yZW1hcF9mYWlsZWQ7Ci0JfQotCWlmICghbWN0bC0+c2RhdGEtPmNzaV9pZikgewotCQl2ZmUzMV9jdHJsLT5jYW1pZmJhc2UgPSBpb3JlbWFwKHZmZTMxX2N0cmwtPmNhbWlmbWVtLT5zdGFydCwKLQkJCXJlc291cmNlX3NpemUodmZlMzFfY3RybC0+Y2FtaWZtZW0pKTsKLQkJaWYgKCF2ZmUzMV9jdHJsLT5jYW1pZmJhc2UpIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCXByX2VycigiJXM6IGNhbWlmIGlvcmVtYXAgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGNhbWlmX3JlbWFwX2ZhaWxlZDsKLQkJfQotCX0KLQotCWlmICh2ZmUzMV9jdHJsLT5mc192ZmUpIHsKLQkJcmMgPSByZWd1bGF0b3JfZW5hYmxlKHZmZTMxX2N0cmwtPmZzX3ZmZSk7Ci0JCWlmIChyYykgewotCQkJcHJfZXJyKCIlczogUmVndWxhdG9yIEZTX1ZGRSBlbmFibGUgZmFpbGVkXG4iLAotCQkJCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gdmZlX2ZzX2ZhaWxlZDsKLQkJfQotCX0KLQotCXJjID0gbXNtX2NhbV9jbGtfZW5hYmxlKCZ2ZmUzMV9jdHJsLT5wZGV2LT5kZXYsIHZmZV9jbGtfaW5mbywKLQkJdmZlMzFfY3RybC0+dmZlX2NsaywgQVJSQVlfU0laRSh2ZmVfY2xrX2luZm8pLCAxKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIHZmZV9jbGtfZW5hYmxlX2ZhaWxlZDsKLQotCWlmICghbWN0bC0+c2RhdGEtPmNzaV9pZikgewotCQlyYyA9IG1zbV9jYW1fY2xrX2VuYWJsZSgmdmZlMzFfY3RybC0+cGRldi0+ZGV2LAotCQkJdmZlX2NhbWlmX2Nsa19pbmZvLAotCQkJdmZlMzFfY3RybC0+dmZlX2NhbWlmX2NsaywKLQkJCUFSUkFZX1NJWkUodmZlX2NhbWlmX2Nsa19pbmZvKSwgMSk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIHZmZV9jYW1pZl9jbGtfZW5hYmxlX2ZhaWxlZDsKLQkJbXNtX3ZmZV9jYW1pZl9wYWRfcmVnX3Jlc2V0KCk7Ci0JfQotCi0jaWZkZWYgQ09ORklHX01TTV9JT01NVQotCXJjID0gaW9tbXVfYXR0YWNoX2RldmljZShtY3RsLT5kb21haW4sIHZmZTMxX2N0cmwtPmlvbW11X2N0eF9pbWd3cik7Ci0JaWYgKHJjIDwgMCkgewotCQlyYyA9IC1FTk9ERVY7Ci0JCXByX2VycigiJXM6IERldmljZSBhdHRhY2ggZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZGV2aWNlX2ltZ3dyX2F0dGFjaF9mYWlsZWQ7Ci0JfQotCXJjID0gaW9tbXVfYXR0YWNoX2RldmljZShtY3RsLT5kb21haW4sIHZmZTMxX2N0cmwtPmlvbW11X2N0eF9taXNjKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXJjID0gLUVOT0RFVjsKLQkJcHJfZXJyKCIlczogRGV2aWNlIGF0dGFjaCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBkZXZpY2VfbWlzY19hdHRhY2hfZmFpbGVkOwotCX0KLSNlbmRpZgotCi0JbXNtX2NhbWlvX2J1c19zY2FsZV9jZmcoCi0JCW1jdGwtPnNkYXRhLT5wZGF0YS0+Y2FtX2J1c19zY2FsZV90YWJsZSwgU19JTklUKTsKLQltc21fY2FtaW9fYnVzX3NjYWxlX2NmZygKLQkJbWN0bC0+c2RhdGEtPnBkYXRhLT5jYW1fYnVzX3NjYWxlX3RhYmxlLCBTX1BSRVZJRVcpOwotCXZmZTMxX2N0cmwtPnJlZ2lzdGVyX3RvdGFsID0gVkZFMzFfUkVHSVNURVJfVE9UQUw7Ci0KLQllbmFibGVfaXJxKHZmZTMxX2N0cmwtPnZmZWlycS0+c3RhcnQpOwotCi0JcmV0dXJuIHJjOwotCi0jaWZkZWYgQ09ORklHX01TTV9JT01NVQotZGV2aWNlX21pc2NfYXR0YWNoX2ZhaWxlZDoKLQlpb21tdV9kZXRhY2hfZGV2aWNlKG1jdGwtPmRvbWFpbiwgdmZlMzFfY3RybC0+aW9tbXVfY3R4X2ltZ3dyKTsKLWRldmljZV9pbWd3cl9hdHRhY2hfZmFpbGVkOgotI2VuZGlmCi0JaWYgKCFtY3RsLT5zZGF0YS0+Y3NpX2lmKQotCQltc21fY2FtX2Nsa19lbmFibGUoJnZmZTMxX2N0cmwtPnBkZXYtPmRldiwKLQkJCXZmZV9jYW1pZl9jbGtfaW5mbywKLQkJCXZmZTMxX2N0cmwtPnZmZV9jYW1pZl9jbGssCi0JCQlBUlJBWV9TSVpFKHZmZV9jYW1pZl9jbGtfaW5mbyksIDApOwotdmZlX2NhbWlmX2Nsa19lbmFibGVfZmFpbGVkOgotCW1zbV9jYW1fY2xrX2VuYWJsZSgmdmZlMzFfY3RybC0+cGRldi0+ZGV2LCB2ZmVfY2xrX2luZm8sCi0JCXZmZTMxX2N0cmwtPnZmZV9jbGssIEFSUkFZX1NJWkUodmZlX2Nsa19pbmZvKSwgMCk7Ci12ZmVfY2xrX2VuYWJsZV9mYWlsZWQ6Ci0JcmVndWxhdG9yX2Rpc2FibGUodmZlMzFfY3RybC0+ZnNfdmZlKTsKLXZmZV9mc19mYWlsZWQ6Ci0JaWYgKCFtY3RsLT5zZGF0YS0+Y3NpX2lmKQotCQlpb3VubWFwKHZmZTMxX2N0cmwtPmNhbWlmYmFzZSk7Ci1jYW1pZl9yZW1hcF9mYWlsZWQ6Ci0JaW91bm1hcCh2ZmUzMV9jdHJsLT52ZmViYXNlKTsKLXZmZV9yZW1hcF9mYWlsZWQ6Ci1tY3RsX2ZhaWxlZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXZvaWQgbXNtX3ZmZV9zdWJkZXZfcmVsZWFzZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQotewotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsID0KLQkJKHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKil2NGwyX2dldF9zdWJkZXZfaG9zdGRhdGEoc2QpOwotCWRpc2FibGVfaXJxKHZmZTMxX2N0cmwtPnZmZWlycS0+c3RhcnQpOwotCXRhc2tsZXRfa2lsbCgmdmZlMzFfdGFza2xldCk7Ci0KLSNpZmRlZiBDT05GSUdfTVNNX0lPTU1VCi0JaW9tbXVfZGV0YWNoX2RldmljZShwbWN0bC0+ZG9tYWluLCB2ZmUzMV9jdHJsLT5pb21tdV9jdHhfbWlzYyk7Ci0JaW9tbXVfZGV0YWNoX2RldmljZShwbWN0bC0+ZG9tYWluLCB2ZmUzMV9jdHJsLT5pb21tdV9jdHhfaW1nd3IpOwotI2VuZGlmCi0KLQlpZiAoIXBtY3RsLT5zZGF0YS0+Y3NpX2lmKQotCQltc21fY2FtX2Nsa19lbmFibGUoJnZmZTMxX2N0cmwtPnBkZXYtPmRldiwKLQkJCXZmZV9jYW1pZl9jbGtfaW5mbywKLQkJCXZmZTMxX2N0cmwtPnZmZV9jYW1pZl9jbGssCi0JCQlBUlJBWV9TSVpFKHZmZV9jYW1pZl9jbGtfaW5mbyksIDApOwotCi0JbXNtX2NhbV9jbGtfZW5hYmxlKCZ2ZmUzMV9jdHJsLT5wZGV2LT5kZXYsIHZmZV9jbGtfaW5mbywKLQkJdmZlMzFfY3RybC0+dmZlX2NsaywgQVJSQVlfU0laRSh2ZmVfY2xrX2luZm8pLCAwKTsKLQotCWlmICh2ZmUzMV9jdHJsLT5mc192ZmUpCi0JCXJlZ3VsYXRvcl9kaXNhYmxlKHZmZTMxX2N0cmwtPmZzX3ZmZSk7Ci0KLQlDREJHKCIlcyBSZWxlYXNpbmcgcmVzb3VyY2VzXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKCFwbWN0bC0+c2RhdGEtPmNzaV9pZikKLQkJaW91bm1hcCh2ZmUzMV9jdHJsLT5jYW1pZmJhc2UpOwotCWlvdW5tYXAodmZlMzFfY3RybC0+dmZlYmFzZSk7Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmlycV9jbnQpKQotCQlwcl93YXJuaW5nKCIlcywgV2FybmluZyBJUlEgQ291bnQgbm90IFpFUk9cbiIsIF9fZnVuY19fKTsKLQotCW1zbV9jYW1pb19idXNfc2NhbGVfY2ZnKAotCQlwbWN0bC0+c2RhdGEtPnBkYXRhLT5jYW1fYnVzX3NjYWxlX3RhYmxlLCBTX0VYSVQpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2ludGVybmFsX29wcyBtc21fdmZlX2ludGVybmFsX29wczsKLQotc3RhdGljIGludCBfX2RldmluaXQgdmZlMzFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtX3N1YmRldl9pbmZvIHNkX2luZm87Ci0KLQlDREJHKCIlczogZGV2aWNlIGlkID0gJWRcbiIsIF9fZnVuY19fLCBwZGV2LT5pZCk7Ci0KLQl2ZmUzMV9jdHJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZmZTMxX2N0cmxfdHlwZSksIEdGUF9LRVJORUwpOwotCWlmICghdmZlMzFfY3RybCkgewotCQlwcl9lcnIoIiVzOiBubyBlbm91Z2ggbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXY0bDJfc3ViZGV2X2luaXQoJnZmZTMxX2N0cmwtPnN1YmRldiwgJm1zbV92ZmVfc3ViZGV2X29wcyk7Ci0JdmZlMzFfY3RybC0+c3ViZGV2LmludGVybmFsX29wcyA9ICZtc21fdmZlX2ludGVybmFsX29wczsKLQl2ZmUzMV9jdHJsLT5zdWJkZXYuZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7Ci0Jc25wcmludGYodmZlMzFfY3RybC0+c3ViZGV2Lm5hbWUsCi0JCQkgc2l6ZW9mKHZmZTMxX2N0cmwtPnN1YmRldi5uYW1lKSwgInZmZTMuMSIpOwotCXY0bDJfc2V0X3N1YmRldmRhdGEoJnZmZTMxX2N0cmwtPnN1YmRldiwgdmZlMzFfY3RybCk7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJnZmZTMxX2N0cmwtPnN1YmRldik7Ci0KLQl2ZmUzMV9jdHJsLT52ZmVtZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsCi0JCUlPUkVTT1VSQ0VfTUVNLCAibXNtX3ZmZSIpOwotCWlmICghdmZlMzFfY3RybC0+dmZlbWVtKSB7Ci0JCXByX2VycigiJXM6IG5vIG1lbSByZXNvdXJjZT9cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIHZmZTMxX25vX3Jlc291cmNlOwotCX0KLQl2ZmUzMV9jdHJsLT52ZmVpcnEgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsCi0JCUlPUkVTT1VSQ0VfSVJRLCAibXNtX3ZmZSIpOwotCWlmICghdmZlMzFfY3RybC0+dmZlaXJxKSB7Ci0JCXByX2VycigiJXM6IG5vIGlycSByZXNvdXJjZT9cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIHZmZTMxX25vX3Jlc291cmNlOwotCX0KLQl2ZmUzMV9jdHJsLT5jYW1pZm1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKLQkJSU9SRVNPVVJDRV9NRU0sICJtc21fY2FtaWYiKTsKLQlpZiAoIXZmZTMxX2N0cmwtPmNhbWlmbWVtKQotCQlwcl9lcnIoIiVzOiBjYW1pZiBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQl2ZmUzMV9jdHJsLT52ZmVpbyA9IHJlcXVlc3RfbWVtX3JlZ2lvbih2ZmUzMV9jdHJsLT52ZmVtZW0tPnN0YXJ0LAotCQlyZXNvdXJjZV9zaXplKHZmZTMxX2N0cmwtPnZmZW1lbSksIHBkZXYtPm5hbWUpOwotCWlmICghdmZlMzFfY3RybC0+dmZlaW8pIHsKLQkJcHJfZXJyKCIlczogbm8gdmFsaWQgbWVtIHJlZ2lvblxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FQlVTWTsKLQkJZ290byB2ZmUzMV9ub19yZXNvdXJjZTsKLQl9Ci0KLQlpZiAodmZlMzFfY3RybC0+Y2FtaWZtZW0pIHsKLQkJdmZlMzFfY3RybC0+Y2FtaWZpbyA9IHJlcXVlc3RfbWVtX3JlZ2lvbigKLQkJCXZmZTMxX2N0cmwtPmNhbWlmbWVtLT5zdGFydCwKLQkJCXJlc291cmNlX3NpemUodmZlMzFfY3RybC0+Y2FtaWZtZW0pLCBwZGV2LT5uYW1lKTsKLQkJaWYgKCF2ZmUzMV9jdHJsLT5jYW1pZmlvKSB7Ci0JCQlyZWxlYXNlX21lbV9yZWdpb24odmZlMzFfY3RybC0+dmZlbWVtLT5zdGFydCwKLQkJCQlyZXNvdXJjZV9zaXplKHZmZTMxX2N0cmwtPnZmZW1lbSkpOwotCQkJcHJfZXJyKCIlczogbm8gdmFsaWQgbWVtIHJlZ2lvblxuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIHZmZTMxX25vX3Jlc291cmNlOwotCQl9Ci0JfQotCi0JcmMgPSByZXF1ZXN0X2lycSh2ZmUzMV9jdHJsLT52ZmVpcnEtPnN0YXJ0LCB2ZmUzMV9wYXJzZV9pcnEsCi0JCUlSUUZfVFJJR0dFUl9SSVNJTkcsICJ2ZmUiLCAwKTsKLQlpZiAocmMgPCAwKSB7Ci0JCWlmICh2ZmUzMV9jdHJsLT5jYW1pZm1lbSkgewotCQkJcmVsZWFzZV9tZW1fcmVnaW9uKHZmZTMxX2N0cmwtPmNhbWlmbWVtLT5zdGFydCwKLQkJCQlyZXNvdXJjZV9zaXplKHZmZTMxX2N0cmwtPmNhbWlmbWVtKSk7Ci0JCX0KLQkJcmVsZWFzZV9tZW1fcmVnaW9uKHZmZTMxX2N0cmwtPnZmZW1lbS0+c3RhcnQsCi0JCQlyZXNvdXJjZV9zaXplKHZmZTMxX2N0cmwtPnZmZW1lbSkpOwotCQlwcl9lcnIoIiVzOiBpcnEgcmVxdWVzdCBmYWlsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIHZmZTMxX25vX3Jlc291cmNlOwotCX0KLQotCWRpc2FibGVfaXJxKHZmZTMxX2N0cmwtPnZmZWlycS0+c3RhcnQpOwotCi0jaWZkZWYgQ09ORklHX01TTV9JT01NVQotCS8qZ2V0IGRldmljZSBjb250ZXh0IGZvciBJT01NVSovCi0JdmZlMzFfY3RybC0+aW9tbXVfY3R4X2ltZ3dyID0KLQkJbXNtX2lvbW11X2dldF9jdHgoInZmZV9pbWd3ciIpOyAvKnJlLWNvbmZpcm0qLwotCXZmZTMxX2N0cmwtPmlvbW11X2N0eF9taXNjID0KLQkJbXNtX2lvbW11X2dldF9jdHgoInZmZV9taXNjIik7IC8qcmUtY29uZmlybSovCi0JaWYgKCF2ZmUzMV9jdHJsLT5pb21tdV9jdHhfaW1nd3IgfHwgIXZmZTMxX2N0cmwtPmlvbW11X2N0eF9taXNjKSB7Ci0JCWlmICh2ZmUzMV9jdHJsLT5jYW1pZm1lbSkgewotCQkJcmVsZWFzZV9tZW1fcmVnaW9uKHZmZTMxX2N0cmwtPmNhbWlmbWVtLT5zdGFydCwKLQkJCQlyZXNvdXJjZV9zaXplKHZmZTMxX2N0cmwtPmNhbWlmbWVtKSk7Ci0JCX0KLQkJcmVsZWFzZV9tZW1fcmVnaW9uKHZmZTMxX2N0cmwtPnZmZW1lbS0+c3RhcnQsCi0JCQlyZXNvdXJjZV9zaXplKHZmZTMxX2N0cmwtPnZmZW1lbSkpOwotCQlwcl9lcnIoIiVzOiBObyBpb21tdSBmdyBjb250ZXh0IGZvdW5kXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byB2ZmUzMV9ub19yZXNvdXJjZTsKLQl9Ci0jZW5kaWYKLQotCXZmZTMxX2N0cmwtPnBkZXYgPSBwZGV2OwotCXZmZTMxX2N0cmwtPmZzX3ZmZSA9IHJlZ3VsYXRvcl9nZXQoJnZmZTMxX2N0cmwtPnBkZXYtPmRldiwgInZkZCIpOwotCWlmIChJU19FUlIodmZlMzFfY3RybC0+ZnNfdmZlKSkgewotCQlwcl9lcnIoIiVzOiBSZWd1bGF0b3IgZ2V0IGZhaWxlZCAlbGRcbiIsIF9fZnVuY19fLAotCQkJUFRSX0VSUih2ZmUzMV9jdHJsLT5mc192ZmUpKTsKLQkJdmZlMzFfY3RybC0+ZnNfdmZlID0gTlVMTDsKLQl9Ci0KLQlzZF9pbmZvLnNkZXZfdHlwZSA9IFZGRV9ERVY7Ci0Jc2RfaW5mby5zZF9pbmRleCA9IDA7Ci0Jc2RfaW5mby5pcnFfbnVtID0gdmZlMzFfY3RybC0+dmZlaXJxLT5zdGFydDsKLQltc21fY2FtX3JlZ2lzdGVyX3N1YmRldl9ub2RlKCZ2ZmUzMV9jdHJsLT5zdWJkZXYsICZzZF9pbmZvKTsKLQotCW1lZGlhX2VudGl0eV9pbml0KCZ2ZmUzMV9jdHJsLT5zdWJkZXYuZW50aXR5LCAwLCBOVUxMLCAwKTsKLQl2ZmUzMV9jdHJsLT5zdWJkZXYuZW50aXR5LnR5cGUgPSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFVjsKLQl2ZmUzMV9jdHJsLT5zdWJkZXYuZW50aXR5Lmdyb3VwX2lkID0gVkZFX0RFVjsKLQl2ZmUzMV9jdHJsLT5zdWJkZXYuZW50aXR5Lm5hbWUgPSBwZGV2LT5uYW1lOwotCXZmZTMxX2N0cmwtPnN1YmRldi5lbnRpdHkucmV2aXNpb24gPSB2ZmUzMV9jdHJsLT5zdWJkZXYuZGV2bm9kZS0+bnVtOwotCXJldHVybiAwOwotCi12ZmUzMV9ub19yZXNvdXJjZToKLQlrZnJlZSh2ZmUzMV9jdHJsKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdmZlMzFfZHJpdmVyID0gewotCS5wcm9iZSA9IHZmZTMxX3Byb2JlLAotCS5kcml2ZXIgPSB7Ci0JLm5hbWUgPSBNU01fVkZFX0RSVl9OQU1FLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fdmZlMzFfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ2ZmUzMV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXNtX3ZmZTMxX2V4aXRfbW9kdWxlKHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnZmZTMxX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KG1zbV92ZmUzMV9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChtc21fdmZlMzFfZXhpdF9tb2R1bGUpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJWRkUgMy4xIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlMzFfdjRsMi5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlMzFfdjRsMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWE4MDc4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTMxX3Y0bDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX01TTV9WRkUzMV9WNEwyX0hfXwotI2RlZmluZSBfX01TTV9WRkUzMV9WNEwyX0hfXwotCi0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSAibXNtX3ZmZV9zdGF0c19idWYuaCIKLQotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUgMQotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgMAotI2VuZGlmCi0KLS8qIFRoaXMgZGVmaW5lcyB0b3RhbCBudW1iZXIgcmVnaXN0ZXJzIGluIFZGRS4KLSAqIEVhY2ggcmVnaXN0ZXIgaXMgNCBieXRlcyBzbyB0byBnZXQgdGhlIHJhbmdlLAotICogbXVsdGlwbHkgdGhpcyBudW1iZXIgd2l0aCA0LiAqLwotI2RlZmluZSBWRkUzMV9SRUdJU1RFUl9UT1RBTCAweDAwMDAwMTdGCi0KLS8qIGF0IHN0YXJ0IG9mIGNhbWlmLCAgYml0IDE6MCA9IDB4MDE6ZW5hYmxlCi0gKiBpbWFnZSBkYXRhIGNhcHR1cmUgYXQgZnJhbWUgYm91bmRhcnkuICovCi0jZGVmaW5lIENBTUlGX0NPTU1BTkRfU1RBUlQgIDB4MDAwMDAwMDUKLQotLyogYml0IDI9IDB4MTpjbGVhciB0aGUgQ0FNSUZfU1RBVFVTIHJlZ2lzdGVyCi0gKiB2YWx1ZS4gKi8KLSNkZWZpbmUgQ0FNSUZfQ09NTUFORF9DTEVBUiAgMHgwMDAwMDAwNAotCi0vKiBhdCBzdG9wIG9mIHZmZSBwaXBlbGluZSwgZm9yIG5vdyBpdCBpcyBhc3N1bWVkCi0gKiB0aGF0IGNhbWlmIHdpbGwgc3RvcCBhdCBhbnkgdGltZS4gQml0IDE6MCA9IDB4MTA6Ci0gKiBkaXNhYmxlIGltYWdlIGRhdGEgY2FwdHVyZSBpbW1lZGlhdGVseS4gKi8KLSNkZWZpbmUgQ0FNSUZfQ09NTUFORF9TVE9QX0lNTUVESUFURUxZICAweDAwMDAwMDAyCi0KLS8qIGF0IHN0b3Agb2YgdmZlIHBpcGVsaW5lLCBmb3Igbm93IGl0IGlzIGFzc3VtZWQKLSAqIHRoYXQgY2FtaWYgd2lsbCBzdG9wIGF0IGFueSB0aW1lLiBCaXQgMTowID0gMHgwMDoKLSAqIGRpc2FibGUgaW1hZ2UgZGF0YSBjYXB0dXJlIGF0IGZyYW1lIGJvdW5kYXJ5ICovCi0jZGVmaW5lIENBTUlGX0NPTU1BTkRfU1RPUF9BVF9GUkFNRV9CT1VOREFSWSAgMHgwMDAwMDAwMAotCi0vKiB0byBoYWx0IGF4aSBicmlkZ2UgKi8KLSNkZWZpbmUgQVhJX0hBTFQgIDB4MDAwMDAwMDEKLQotLyogY2xlYXIgdGhlIGhhbHQgYml0LiAqLwotI2RlZmluZSBBWElfSEFMVF9DTEVBUiAgMHgwMDAwMDAwMAotCi0vKiBjbGVhciBheGlfaGFsdF9pcnEgKi8KLSNkZWZpbmUgTUFTS19BWElfSEFMVF9JUlEJMHhGRjdGRkZGRgotCi0vKiByZXNldCB0aGUgcGlwZWxpbmUgd2hlbiBzdG9wIGNvbW1hbmQgaXMgaXNzdWVkLgotICogKHdpdGhvdXQgcmVzZXQgdGhlIHJlZ2lzdGVyLikgYml0IDI2LTMxID0gMCwKLSAqIGRvbWFpbiByZXNldCwgYml0IDAtOSA9IDEgZm9yIG1vZHVsZSByZXNldCwgZXhjZXB0Ci0gKiByZWdpc3RlciBtb2R1bGUuICovCi0jZGVmaW5lIFZGRV9SRVNFVF9VUE9OX1NUT1BfQ01EICAweDAwMDAwM2VmCi0KLS8qIHJlc2V0IHRoZSBwaXBlbGluZSB3aGVuIHJlc2V0IGNvbW1hbmQuCi0gKiBiaXQgMjYtMzEgPSAwLCBkb21haW4gcmVzZXQsIGJpdCAwLTkgPSAxIGZvciBtb2R1bGUgcmVzZXQuICovCi0jZGVmaW5lIFZGRV9SRVNFVF9VUE9OX1JFU0VUX0NNRCAgMHgwMDAwMDNmZgotCi0vKiBiaXQgNSBpcyBmb3IgYXhpIHN0YXR1cyBpZGxlIG9yIGJ1c3kuCi0gKiAxID0gIGhhbHRlZCwgIDAgPSBidXN5ICovCi0jZGVmaW5lIEFYSV9TVEFUVVNfQlVTWV9NQVNLIDB4MDAwMDAwMjAKLQotLyogYml0IDAgJiBiaXQgMSA9IDEsIGJvdGggeSBhbmQgY2JjciBpcnFzIG5lZWQgdG8gYmUgcHJlc2VudAotICogZm9yIGZyYW1lIGRvbmUgaW50ZXJydXB0ICovCi0jZGVmaW5lIFZGRV9DT01QX0lSUV9CT1RIX1lfQ0JDUiAzCi0KLS8qIGJpdCAxID0gMSwgb25seSBjYmNyIGlycSB0cmlnZ2VycyBmcmFtZSBkb25lIGludGVycnVwdCAqLwotI2RlZmluZSBWRkVfQ09NUF9JUlFfQ0JDUl9PTkxZIDIKLQotLyogYml0IDAgPSAxLCBvbmx5IHkgaXJxIHRyaWdnZXJzIGZyYW1lIGRvbmUgaW50ZXJydXB0ICovCi0jZGVmaW5lIFZGRV9DT01QX0lSUV9ZX09OTFkgMQotCi0vKiBiaXQgMCA9IDEsIFBNIGdvOyAgIGJpdDEgPSAxLCBQTSBzdG9wICovCi0jZGVmaW5lIFZGRV9QRVJGT1JNQU5DRV9NT05JVE9SX0dPICAgMHgwMDAwMDAwMQotI2RlZmluZSBWRkVfUEVSRk9STUFOQ0VfTU9OSVRPUl9TVE9QIDB4MDAwMDAwMDIKLQotLyogYml0IDAgPSAxLCB0ZXN0IGdlbiBnbzsgICBiaXQxID0gMSwgdGVzdCBnZW4gc3RvcCAqLwotI2RlZmluZSBWRkVfVEVTVF9HRU5fR08gICAweDAwMDAwMDAxCi0jZGVmaW5lIFZGRV9URVNUX0dFTl9TVE9QIDB4MDAwMDAwMDIKLQotLyogdGhlIGNocm9tYSBpcyBhc3N1bWVkIHRvIGJlIGludGVycG9sYXRlZCBiZXR3ZWVuCi0gKiB0aGUgbHVtYSBzYW1wbGVzLiAgSlBFRyA0OjI6MiAqLwotI2RlZmluZSBWRkVfQ0hST01BX1VQU0FNUExFX0lOVEVSUE9MQVRFRCAwCi0KLS8qIGNvbnN0YW50cyBmb3IgaXJxIHJlZ2lzdGVycyAqLwotI2RlZmluZSBWRkVfRElTQUJMRV9BTExfSVJRUyAwCi0vKiBiaXQgPTEgaXMgdG8gY2xlYXIgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGluIFZGRV9JUlFfU1RBVFVTLiAgKi8KLSNkZWZpbmUgVkZFX0NMRUFSX0FMTF9JUlFTICAgMHhmZmZmZmZmZgotCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9DQU1JRl9TT0ZfTUFTSyAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX0NBTUlGX0VPRl9NQVNLICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfUkVHX1VQREFURV9NQVNLICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9JTUFHRV9DT01QT1NJVF9ET05FMF9NQVNLIDB4MDAyMDAwMDAKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX0lNQUdFX0NPTVBPU0lUX0RPTkUxX01BU0sgMHgwMDQwMDAwMAotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfSU1BR0VfQ09NUE9TSVRfRE9ORTJfTUFTSyAweDAwODAwMDAwCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMV9SRVNFVF9BWElfSEFMVF9BQ0tfTUFTSyAgIDB4MDA4MDAwMDAKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0NPTVBPU0lUX01BU0sgICAgICAgMHgwMTAwMDAwMAotCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19BRUMgICAgIDB4MjAwMCAgLyogYml0IDEzICovCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19BRiAgICAgIDB4NDAwMCAgLyogYml0IDE0ICovCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19BV0IgICAgIDB4ODAwMCAgLyogYml0IDE1ICovCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19SUyAgICAgIDB4MTAwMDAgIC8qIGJpdCAxNiAqLwotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQ1MgICAgICAweDIwMDAwICAvKiBiaXQgMTcgKi8KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0lISVNUICAgMHg0MDAwMCAgLyogYml0IDE4ICovCi0KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NZTkNfVElNRVIwICAgMHgyMDAwMDAwICAvKiBiaXQgMjUgKi8KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NZTkNfVElNRVIxICAgMHg0MDAwMDAwICAvKiBiaXQgMjYgKi8KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NZTkNfVElNRVIyICAgMHg4MDAwMDAwICAvKiBiaXQgMjcgKi8KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX0FTWU5DX1RJTUVSMCAgMHgxMDAwMDAwMCAgLyogYml0IDI4ICovCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9BU1lOQ19USU1FUjEgIDB4MjAwMDAwMDAgIC8qIGJpdCAyOSAqLwotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfQVNZTkNfVElNRVIyICAweDQwMDAwMDAwICAvKiBiaXQgMzAgKi8KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX0FTWU5DX1RJTUVSMyAgMHg4MDAwMDAwMCAgLyogYml0IDMxICovCi0KLS8qIGltYXNrIGZvciB3aGlsZSB3YWl0aW5nIGZvciBzdG9wIGFjaywgIGRyaXZlciBoYXMgYWxyZWFkeQotICogcmVxdWVzdGVkIHN0b3AsIHdhaXRpbmcgZm9yIHJlc2V0IGlycSwgYW5kIGFzeW5jIHRpbWVyIGlycS4KLSAqIEZvciBpcnFfc3RhdHVzXzAsIGJpdCAyOC0zMSBhcmUgZm9yIGFzeW5jIHRpbWVyLiBGb3IKLSAqIGlycV9zdGF0dXNfMSwgYml0IDIyIGZvciByZXNldCBpcnEsIGJpdCAyMyBmb3IgYXhpX2hhbHRfYWNrCi0gICBpcnEgKi8KLSNkZWZpbmUgVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HXzAgIDB4RjAwMDAwMDAKLSNkZWZpbmUgVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HXzEgIDB4MDBDMDAwMDAKLSNkZWZpbmUgVkZFX0lNQVNLX1JFU0VUICAgICAgICAgICAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgVkZFX0lNQVNLX0FYSV9IQUxUICAgICAgICAgIDB4MDA4MDAwMDAKLQotCi0vKiBubyBlcnJvciBpcnEgaW4gbWFzayAwICovCi0jZGVmaW5lIFZGRV9JTUFTS19FUlJPUl9PTkxZXzAgIDB4MAotLyogd2hlbiBub3JtYWwgY2FzZSwgZG9uJ3Qgd2FudCB0byBibG9jayBlcnJvciBzdGF0dXMuICovCi0vKiBiaXQgMC0yMSBhcmUgZXJyb3IgaXJxIGJpdHMgKi8KLSNkZWZpbmUgVkZFX0lNQVNLX0VSUk9SX09OTFlfMSAgMHgwMDNmZmZmZgotCi0vKiBGb3IgQlBDIGJpdCAwLGJpdCAxMi0xNyBhbmQgYml0IDI2IC0yMCBhcmUgc2V0IHRvIHplcm8gYW5kIG90aGVyJ3MgMSAqLwotI2RlZmluZSBCUENfTUFTSyAweEY4MEMwRkZFCi0KLS8qIEZvciBCUEMgYml0IDEgYW5kIDIgYXJlIHNldCB0byB6ZXJvIGFuZCBvdGhlcidzIDEgKi8KLSNkZWZpbmUgQUJGX01BU0sgMHhGRkZGRkZGOQotCi0vKiBGb3IgREJQQyBiaXQgMCBpcyBzZXQgdG8gemVybyBhbmQgb3RoZXIncyAxICovCi0jZGVmaW5lIERCUENfTUFTSyAweEZGRkZGRkZFCi0KLS8qIEZvciBEQkNDIGJpdCAxIGlzIHNldCB0byB6ZXJvIGFuZCBvdGhlcidzIDEgKi8KLSNkZWZpbmUgREJDQ19NQVNLIDB4RkZGRkZGRkQKLQotLyogRm9yIERCUEMvQUJGL0RCQ0MvQUJDQyBiaXRzIGFyZSBzZXQgdG8gMSBhbGwgb3RoZXJzIDAgKi8KLSNkZWZpbmUgREVNT1NBSUNfTUFTSyAweDhGRkZGRkZGCi0vKiBGb3IgTUNFIGVuYWJsZSBiaXQgMjggc2V0IHRvIHplcm8gYW5kIG90aGVyJ3MgMSAqLwotI2RlZmluZSBNQ0VfRU5fTUFTSyAweEVGRkZGRkZGCi0KLS8qIEZvciBNQ0UgUV9LIGJpdCAyOCB0byAzMSBzZXQgdG8gemVybyBhbmQgb3RoZXIncyAxICovCi0jZGVmaW5lIE1DRV9RX0tfTUFTSyAweDBGRkZGRkZGCi0KLSNkZWZpbmUgQUVfQkdfRU5BQkxFX01BU0sgMHgwMDAwMDAyMCAgICAgIC8qIGJpdCA1ICovCi0jZGVmaW5lIEFGX0JGX0VOQUJMRV9NQVNLIDB4MDAwMDAwNDAgICAgICAvKiBiaXQgNiAqLwotI2RlZmluZSBBV0JfRU5BQkxFX01BU0sgMHgwMDAwMDA4MCAgICAgLyogYml0IDcgKi8KLQotI2RlZmluZSBSU19FTkFCTEVfTUFTSyAweDAwMDAwMTAwICAgICAgLyogYml0IDggICovCi0jZGVmaW5lIENTX0VOQUJMRV9NQVNLIDB4MDAwMDAyMDAgICAgICAvKiBiaXQgOSAgKi8KLSNkZWZpbmUgUlNfQ1NfRU5BQkxFX01BU0sgMHgwMDAwMDMwMCAgIC8qIGJpdCA4LDkgICovCi0jZGVmaW5lIElISVNUX0VOQUJMRV9NQVNLIDB4MDAwMDgwMDAgICAvKiBiaXQgMTUgKi8KLSNkZWZpbmUgU1RBVFNfRU5BQkxFX01BU0sgMHgwMDA0ODNFMCAgIC8qIGJpdCAxOCwxNSw5LDgsNyw2LDUqLwotCi0jZGVmaW5lIFZGRV9SRUdfVVBEQVRFX1RSSUdHRVIgICAgICAgICAgIDEKLSNkZWZpbmUgVkZFX1BNX0JVRl9NQVhfQ05UX01BU0sgICAgICAgICAgMHhGRgotI2RlZmluZSBWRkVfRE1JX0NGR19ERUZBVUxUICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIFZGRV9BRV9QSU5HUE9OR19TVEFUVVNfQklUICAgICAgIDB4ODAKLSNkZWZpbmUgVkZFX0FGX1BJTkdQT05HX1NUQVRVU19CSVQgICAgICAgMHgxMDAKLSNkZWZpbmUgVkZFX0FXQl9QSU5HUE9OR19TVEFUVVNfQklUICAgICAgMHgyMDAKLQotI2RlZmluZSBIRlJfTU9ERV9PRkYgMQotI2RlZmluZSBWRkVfRlJBTUVfU0tJUF9QRVJJT0RfTUFTSyAweDAwMDAwMDFGIC8qYml0cyAwIC00Ki8KLQotZW51bSBWRkUzMV9ETUlfUkFNX1NFTCB7Ci0JIE5PX01FTV9TRUxFQ1RFRCAgICAgICAgICA9IDAsCi0JIFJPTExPRkZfUkFNICAgICAgICAgICAgICA9IDB4MSwKLQkgUkdCTFVUX1JBTV9DSDBfQkFOSzAgICAgID0gMHgyLAotCSBSR0JMVVRfUkFNX0NIMF9CQU5LMSAgICAgPSAweDMsCi0JIFJHQkxVVF9SQU1fQ0gxX0JBTkswICAgICA9IDB4NCwKLQkgUkdCTFVUX1JBTV9DSDFfQkFOSzEgICAgID0gMHg1LAotCSBSR0JMVVRfUkFNX0NIMl9CQU5LMCAgICAgPSAweDYsCi0JIFJHQkxVVF9SQU1fQ0gyX0JBTksxICAgICA9IDB4NywKLQkgU1RBVFNfSElTVF9SQU0gICAgICAgICAgID0gMHg4LAotCSBSR0JMVVRfQ0hYX0JBTkswICAgICAgICAgPSAweDksCi0JIFJHQkxVVF9DSFhfQkFOSzEgICAgICAgICA9IDB4YSwKLQkgTFVNQV9BREFQVF9MVVRfUkFNX0JBTkswID0gMHhiLAotCSBMVU1BX0FEQVBUX0xVVF9SQU1fQkFOSzEgPSAweGMKLX07Ci0KLWVudW0gdmZlX291dHB1dF9zdGF0ZSB7Ci0JVkZFX1NUQVRFX0lETEUsCi0JVkZFX1NUQVRFX1NUQVJUX1JFUVVFU1RFRCwKLQlWRkVfU1RBVEVfU1RBUlRFRCwKLQlWRkVfU1RBVEVfU1RPUF9SRVFVRVNURUQsCi0JVkZFX1NUQVRFX1NUT1BQRUQsCi19OwotCi0jZGVmaW5lIFYzMV9DQU1JRl9PRkYgICAgICAgICAgICAgMHgwMDAwMDFFNAotI2RlZmluZSBWMzFfQ0FNSUZfTEVOICAgICAgICAgICAgIDMyCi0KLSNkZWZpbmUgVjMxX0RFTVVYX09GRiAgICAgICAgICAgICAweDAwMDAwMjg0Ci0jZGVmaW5lIFYzMV9ERU1VWF9MRU4gICAgICAgICAgICAgMjAKLQotI2RlZmluZSBWMzFfREVNT1NBSUNWM19VUF9SRUdfQ05UIDUKLQotI2RlZmluZSBWMzFfT1VUX0NMQU1QX09GRiAgICAgICAgIDB4MDAwMDA1MjQKLSNkZWZpbmUgVjMxX09VVF9DTEFNUF9MRU4gICAgICAgICA4Ci0KLSNkZWZpbmUgVjMxX09QRVJBVElPTl9DRkdfTEVOICAgICAzMgotCi0jZGVmaW5lIFYzMV9BWElfQlVTX0NNRF9PRkYgICAgICAgMHgwMDAwMDAzOAotI2RlZmluZSBWMzFfQVhJX09VVF9PRkYgICAgICAgICAgIDB4MDAwMDAwM0MKLSNkZWZpbmUgVjMxX0FYSV9PVVRfTEVOICAgICAgICAgICAyNDAKLSNkZWZpbmUgVjMxX0FYSV9DRkdfTEVOICAgICAgICAgICA0NwotI2RlZmluZSBWMzFfQVhJX1JFU0VSVkVEICAgICAgICAgICAgMQotI2RlZmluZSBWMzFfQVhJX1JFU0VSVkVEX0xFTiAgICAgICAgNAotI2RlZmluZSBWMzFfQVhJX0JVU19DRkdfTEVOICAgICAgIDE2Ci0KLSNkZWZpbmUgVjMxX0ZSQU1FX1NLSVBfT0ZGICAgICAgICAweDAwMDAwNTA0Ci0jZGVmaW5lIFYzMV9GUkFNRV9TS0lQX0xFTiAgICAgICAgMzIKLQotI2RlZmluZSBWMzFfQ0hST01BX1NVQlNfT0ZGICAgICAgIDB4MDAwMDA0RjgKLSNkZWZpbmUgVjMxX0NIUk9NQV9TVUJTX0xFTiAgICAgICAxMgotCi0jZGVmaW5lIFYzMV9GT1ZfT0ZGICAgICAgICAgICAweDAwMDAwMzYwCi0jZGVmaW5lIFYzMV9GT1ZfTEVOICAgICAgICAgICA4Ci0KLSNkZWZpbmUgVjMxX01BSU5fU0NBTEVSX09GRiAweDAwMDAwMzY4Ci0jZGVmaW5lIFYzMV9NQUlOX1NDQUxFUl9MRU4gMjgKLQotI2RlZmluZSBWMzFfUzJZX09GRiAweDAwMDAwNEQwCi0jZGVmaW5lIFYzMV9TMllfTEVOIDIwCi0KLSNkZWZpbmUgVjMxX1MyQ2JDcl9PRkYgMHgwMDAwMDRFNAotI2RlZmluZSBWMzFfUzJDYkNyX0xFTiAyMAotCi0jZGVmaW5lIFYzMV9DSFJPTUFfRU5fT0ZGIDB4MDAwMDAzQzQKLSNkZWZpbmUgVjMxX0NIUk9NQV9FTl9MRU4gMzYKLQotI2RlZmluZSBWMzFfU1lOQ19USU1FUl9PRkYgICAgICAweDAwMDAwMjBDCi0jZGVmaW5lIFYzMV9TWU5DX1RJTUVSX1BPTEFSSVRZX09GRiAweDAwMDAwMjM0Ci0jZGVmaW5lIFYzMV9USU1FUl9TRUxFQ1RfT0ZGICAgICAgICAweDAwMDAwMjVDCi0jZGVmaW5lIFYzMV9TWU5DX1RJTUVSX0xFTiAyOAotCi0jZGVmaW5lIFYzMV9BU1lOQ19USU1FUl9PRkYgMHgwMDAwMDIzOAotI2RlZmluZSBWMzFfQVNZTkNfVElNRVJfTEVOIDI4Ci0KLSNkZWZpbmUgVjMxX0JMQUNLX0xFVkVMX09GRiAweDAwMDAwMjY0Ci0jZGVmaW5lIFYzMV9CTEFDS19MRVZFTF9MRU4gMTYKLQotI2RlZmluZSBWMzFfTUVTSF9ST0xMX09GRl9DRkdfT0ZGICAgICAgICAgICAgIDB4MDAwMDAyNzQKLSNkZWZpbmUgVjMxX01FU0hfUk9MTF9PRkZfQ0ZHX0xFTiAgICAgICAgICAgICAxNgotI2RlZmluZSBWMzFfTUVTSF9ST0xMX09GRl9JTklUX1RBQkxFX1NJWkUgICAgIDEzCi0jZGVmaW5lIFYzMV9NRVNIX1JPTExfT0ZGX0RFTFRBX1RBQkxFX1NJWkUgICAgMjA4Ci0jZGVmaW5lIFYzMV9NRVNIX1JPTExfT0ZGX0RFTFRBX1RBQkxFX09GRlNFVCAgMzIKLQotI2RlZmluZSBWMzFfQ09MT1JfQ09SX09GRiAweDAwMDAwMzg4Ci0jZGVmaW5lIFYzMV9DT0xPUl9DT1JfTEVOIDUyCi0KLSNkZWZpbmUgVjMxX1dCX09GRiAweDAwMDAwMzg0Ci0jZGVmaW5lIFYzMV9XQl9MRU4gNAotCi0jZGVmaW5lIFYzMV9SR0JfR19PRkYgMHgwMDAwMDNCQwotI2RlZmluZSBWMzFfUkdCX0dfTEVOIDQKLQotI2RlZmluZSBWMzFfTEFfT0ZGIDB4MDAwMDAzQzAKLSNkZWZpbmUgVjMxX0xBX0xFTiA0Ci0KLSNkZWZpbmUgVjMxX1NDRV9PRkYgMHgwMDAwMDQxOAotI2RlZmluZSBWMzFfU0NFX0xFTiAxMzYKLQotI2RlZmluZSBWMzFfQ0hST01BX1NVUF9PRkYgMHgwMDAwMDNFOAotI2RlZmluZSBWMzFfQ0hST01BX1NVUF9MRU4gMTIKLQotI2RlZmluZSBWMzFfTUNFX09GRiAweDAwMDAwM0Y0Ci0jZGVmaW5lIFYzMV9NQ0VfTEVOIDM2Ci0jZGVmaW5lIFYzMV9TVEFUU19BRl9PRkYgMHgwMDAwMDUzYwotI2RlZmluZSBWMzFfU1RBVFNfQUZfTEVOIDE2Ci0KLSNkZWZpbmUgVjMxX1NUQVRTX0FFX09GRiAweDAwMDAwNTM0Ci0jZGVmaW5lIFYzMV9TVEFUU19BRV9MRU4gOAotCi0jZGVmaW5lIFYzMV9TVEFUU19BV0JfT0ZGIDB4MDAwMDA1NGMKLSNkZWZpbmUgVjMxX1NUQVRTX0FXQl9MRU4gMzIKLQotI2RlZmluZSBWMzFfU1RBVFNfSUhJU1RfT0ZGIDB4MDAwMDA1N2MKLSNkZWZpbmUgVjMxX1NUQVRTX0lISVNUX0xFTiA4Ci0KLSNkZWZpbmUgVjMxX1NUQVRTX1JTX09GRiAweDAwMDAwNTZjCi0jZGVmaW5lIFYzMV9TVEFUU19SU19MRU4gOAotCi0jZGVmaW5lIFYzMV9TVEFUU19DU19PRkYgMHgwMDAwMDU3NAotI2RlZmluZSBWMzFfU1RBVFNfQ1NfTEVOIDgKLQotI2RlZmluZSBWMzFfQVNGX09GRiAweDAwMDAwNEEwCi0jZGVmaW5lIFYzMV9BU0ZfTEVOIDQ4Ci0jZGVmaW5lIFYzMV9BU0ZfVVBEQVRFX0xFTiAzNgotI2RlZmluZSBWMzFfQ0FQVFVSRV9MRU4gNAotI2RlZmluZSBWMzFfR0VUX0hXX1ZFUlNJT05fT0ZGIDAKLSNkZWZpbmUgVjMxX0dFVF9IV19WRVJTSU9OX0xFTiA0Ci0jZGVmaW5lIFYzMV9ERU1PU0FJQ1YzX09GRiAweDAwMDAwMjk4Ci0jZGVmaW5lIFYzMV9ERU1PU0FJQ1YzX0xFTiA0Ci0vKiBCUEMgICAgICovCi0jZGVmaW5lIFYzMV9ERU1PU0FJQ1YzX0RCUENfQ0ZHX09GRiAgMHgwMDAwMDI5QwotI2RlZmluZSBWMzFfREVNT1NBSUNWM19EQlBDX0xFTiA4Ci0jZGVmaW5lIFYzMV9YQkFSX0NGR19PRkYgMHgwMDAwMDA0MAotLyogQUJGICAgICAqLwotI2RlZmluZSBWMzFfREVNT1NBSUNWM19BQkZfT0ZGIDB4MDAwMDAyQTQKLSNkZWZpbmUgVjMxX0RFTU9TQUlDVjNfQUJGX0xFTiAxODAKLSNkZWZpbmUgVjMxX1hCQVJfQ0ZHX0xFTiA4Ci0KLSNkZWZpbmUgVjMxX01PRFVMRV9DRkdfT0ZGIDB4MDAwMDAwMTAKLSNkZWZpbmUgVjMxX01PRFVMRV9DRkdfTEVOIDQKLSNkZWZpbmUgVjMxX0VaVFVORV9DRkdfT0ZGIDB4MDAwMDAwMTAKLSNkZWZpbmUgVjMxX0VaVFVORV9DRkdfTEVOIDQKLQotc3RydWN0IHZmZV9jbWRfaHdfdmVyc2lvbiB7Ci0JdWludDMyX3QgbWlub3JWZXJzaW9uOwotCXVpbnQzMl90IG1ham9yVmVyc2lvbjsKLQl1aW50MzJfdCBjb3JlVmVyc2lvbjsKLX07Ci0KLWVudW0gVkZFX0FYSV9PVVRQVVRfTU9ERSB7Ci0JVkZFX0FYSV9PVVRQVVRfTU9ERV9PdXRwdXQxLAotCVZGRV9BWElfT1VUUFVUX01PREVfT3V0cHV0MiwKLQlWRkVfQVhJX09VVFBVVF9NT0RFX091dHB1dDFBbmRPdXRwdXQyLAotCVZGRV9BWElfT1VUUFVUX01PREVfQ0FNSUZUb0FYSVZpYU91dHB1dDIsCi0JVkZFX0FYSV9PVVRQVVRfTU9ERV9PdXRwdXQyQW5kQ0FNSUZUb0FYSVZpYU91dHB1dDEsCi0JVkZFX0FYSV9PVVRQVVRfTU9ERV9PdXRwdXQxQW5kQ0FNSUZUb0FYSVZpYU91dHB1dDIsCi0JVkZFX0FYSV9MQVNUX09VVFBVVF9NT0RFX0VOVU0KLX07Ci0KLWVudW0gVkZFX1JBV19XUl9QQVRIX1NFTCB7Ci0JVkZFX1JBV19PVVRQVVRfRElTQUJMRUQsCi0JVkZFX1JBV19PVVRQVVRfRU5DX0NCQ1JfUEFUSCwKLQlWRkVfUkFXX09VVFBVVF9WSUVXX0NCQ1JfUEFUSCwKLQlWRkVfUkFXX09VVFBVVF9QQVRIX0lOVkFMSUQKLX07Ci0KLSNkZWZpbmUgVkZFX0FYSV9PVVRQVVRfQlVSU1RfTEVOR1RIICAgICA0Ci0jZGVmaW5lIFZGRV9NQVhfTlVNX0ZSQUdNRU5UU19QRVJfRlJBTUUgNAotI2RlZmluZSBWRkVfQVhJX09VVFBVVF9DRkdfRlJBTUVfQ09VTlQgIDMKLQotc3RydWN0IHZmZV9jbWRzX3Blcl93cml0ZV9tYXN0ZXIgewotCXVpbnQxNl90IGltYWdlV2lkdGg7Ci0JdWludDE2X3QgaW1hZ2VIZWlnaHQ7Ci0JdWludDE2X3Qgb3V0Um93Q291bnQ7Ci0JdWludDE2X3Qgb3V0Um93SW5jcmVtZW50OwotCXVpbnQzMl90IG91dEZyYWdtZW50c1tWRkVfQVhJX09VVFBVVF9DRkdfRlJBTUVfQ09VTlRdCi0JCVtWRkVfTUFYX05VTV9GUkFHTUVOVFNfUEVSX0ZSQU1FXTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kc19heGlfcGVyX291dHB1dF9wYXRoIHsKLQl1aW50OF90IGZyYWdtZW50Q291bnQ7Ci0Jc3RydWN0IHZmZV9jbWRzX3Blcl93cml0ZV9tYXN0ZXIgZmlyc3RXTTsKLQlzdHJ1Y3QgdmZlX2NtZHNfcGVyX3dyaXRlX21hc3RlciBzZWNvbmRXTTsKLX07Ci0KLWVudW0gVkZFX0FYSV9CVVJTVF9MRU5HVEggewotCVZGRV9BWElfQlVSU1RfTEVOR1RIX0lTXzIgID0gMiwKLQlWRkVfQVhJX0JVUlNUX0xFTkdUSF9JU180ICA9IDQsCi0JVkZFX0FYSV9CVVJTVF9MRU5HVEhfSVNfOCAgPSA4LAotCVZGRV9BWElfQlVSU1RfTEVOR1RIX0lTXzE2ID0gMTYKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX2Zvdl9jcm9wX2NvbmZpZyB7Ci0JdWludDhfdCBlbmFibGU7Ci0JdWludDE2X3QgZmlyc3RQaXhlbDsKLQl1aW50MTZfdCBsYXN0UGl4ZWw7Ci0JdWludDE2X3QgZmlyc3RMaW5lOwotCXVpbnQxNl90IGxhc3RMaW5lOwotfTsKLQotc3RydWN0IHZmZV9jbWRzX21haW5fc2NhbGVyX3N0cmlwZV9pbml0IHsKLQl1aW50MTZfdCBNTkNvdW50ZXJJbml0OwotCXVpbnQxNl90IHBoYXNlSW5pdDsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kc19zY2FsZXJfb25lX2RpbWVuc2lvbiB7Ci0JdWludDhfdCAgZW5hYmxlOwotCXVpbnQxNl90IGlucHV0U2l6ZTsKLQl1aW50MTZfdCBvdXRwdXRTaXplOwotCXVpbnQzMl90IHBoYXNlTXVsdGlwbGljYXRpb25GYWN0b3I7Ci0JdWludDhfdCAgaW50ZXJwb2xhdGlvblJlc29sdXRpb247Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9tYWluX3NjYWxlcl9jb25maWcgewotCXVpbnQ4X3QgZW5hYmxlOwotCXN0cnVjdCB2ZmVfY21kc19zY2FsZXJfb25lX2RpbWVuc2lvbiAgICBoY29uZmlnOwotCXN0cnVjdCB2ZmVfY21kc19zY2FsZXJfb25lX2RpbWVuc2lvbiAgICB2Y29uZmlnOwotCXN0cnVjdCB2ZmVfY21kc19tYWluX3NjYWxlcl9zdHJpcGVfaW5pdCBNTkluaXRIOwotCXN0cnVjdCB2ZmVfY21kc19tYWluX3NjYWxlcl9zdHJpcGVfaW5pdCBNTkluaXRWOwotfTsKLQotc3RydWN0IHZmZV9jbWRfc2NhbGVyMl9jb25maWcgewotCXVpbnQ4X3QgZW5hYmxlOwotCXN0cnVjdCB2ZmVfY21kc19zY2FsZXJfb25lX2RpbWVuc2lvbiBoY29uZmlnOwotCXN0cnVjdCB2ZmVfY21kc19zY2FsZXJfb25lX2RpbWVuc2lvbiB2Y29uZmlnOwotfTsKLQotCi1zdHJ1Y3QgdmZlX2NtZF9mcmFtZV9za2lwX3VwZGF0ZSB7Ci0JdWludDMyX3Qgb3V0cHV0MVBhdHRlcm47Ci0JdWludDMyX3Qgb3V0cHV0MlBhdHRlcm47Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9vdXRwdXRfY2xhbXBfY29uZmlnIHsKLQl1aW50OF90IG1pbkNoMDsKLQl1aW50OF90IG1pbkNoMTsKLQl1aW50OF90IG1pbkNoMjsKLQl1aW50OF90IG1heENoMDsKLQl1aW50OF90IG1heENoMTsKLQl1aW50OF90IG1heENoMjsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX2Nocm9tYV9zdWJzYW1wbGVfY29uZmlnIHsKLQl1aW50OF90IGVuYWJsZTsKLQl1aW50OF90IGNyb3BFbmFibGU7Ci0JdWludDhfdCB2c3ViU2FtcGxlRW5hYmxlOwotCXVpbnQ4X3QgaHN1YlNhbXBsZUVuYWJsZTsKLQl1aW50OF90IHZDb3NpdGVkOwotCXVpbnQ4X3QgaENvc2l0ZWQ7Ci0JdWludDhfdCB2Q29zaXRlZFBoYXNlOwotCXVpbnQ4X3QgaENvc2l0ZWRQaGFzZTsKLQl1aW50MTZfdCBjcm9wV2lkdGhGaXJzdFBpeGVsOwotCXVpbnQxNl90IGNyb3BXaWR0aExhc3RQaXhlbDsKLQl1aW50MTZfdCBjcm9wSGVpZ2h0Rmlyc3RMaW5lOwotCXVpbnQxNl90IGNyb3BIZWlnaHRMYXN0TGluZTsKLX07Ci0KLWVudW0gVkZFX1NUQVJUX1BJWEVMX1BBVFRFUk4gewotCVZGRV9CQVlFUl9SR1JHUkcsCi0JVkZFX0JBWUVSX0dSR1JHUiwKLQlWRkVfQkFZRVJfQkdCR0JHLAotCVZGRV9CQVlFUl9HQkdCR0IsCi0JVkZFX1lVVl9ZQ2JZQ3IsCi0JVkZFX1lVVl9ZQ3JZQ2IsCi0JVkZFX1lVVl9DYllDclksCi0JVkZFX1lVVl9DcllDYlkKLX07Ci0KLWVudW0gVkZFX0JVU19SRF9JTlBVVF9QSVhFTF9QQVRURVJOIHsKLQlWRkVfQkFZRVJfUkFXLAotCVZGRV9ZVVZfSU5URVJMRUFWRUQsCi0JVkZFX1lVVl9QU0VVRE9fUExBTkFSX1ksCi0JVkZFX1lVVl9QU0VVRE9fUExBTkFSX0NCQ1IKLX07Ci0KLWVudW0gVkZFX1lVVl9JTlBVVF9DT1NJVElOR19NT0RFIHsKLQlWRkVfWVVWX0NPU0lURUQsCi0JVkZFX1lVVl9JTlRFUlBPTEFURUQKLX07Ci0KLSNkZWZpbmUgVkZFMzFfR0FNTUFfTlVNX0VOVFJJRVMgIDY0Ci0KLSNkZWZpbmUgVkZFMzFfTEFfVEFCTEVfTEVOR1RIICAgIDY0Ci0KLSNkZWZpbmUgVkZFMzFfSElTVF9UQUJMRV9MRU5HVEggIDI1NgotCi1zdHJ1Y3QgdmZlX2NtZHNfZGVtb3NhaWNfYWJmIHsKLQl1aW50OF90ICAgZW5hYmxlOwotCXVpbnQ4X3QgICBmb3JjZU9uOwotCXVpbnQ4X3QgICBzaGlmdDsKLQl1aW50MTZfdCAgbHBUaHJlc2hvbGQ7Ci0JdWludDE2X3QgIG1heDsKLQl1aW50MTZfdCAgbWluOwotCXVpbnQ4X3QgICByYXRpbzsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kc19kZW1vc2FpY19icGMgewotCXVpbnQ4X3QgICBlbmFibGU7Ci0JdWludDE2X3QgIGZtYXhUaHJlc2hvbGQ7Ci0JdWludDE2X3QgIGZtaW5UaHJlc2hvbGQ7Ci0JdWludDE2X3QgIHJlZERpZmZUaHJlc2hvbGQ7Ci0JdWludDE2X3QgIGJsdWVEaWZmVGhyZXNob2xkOwotCXVpbnQxNl90ICBncmVlbkRpZmZUaHJlc2hvbGQ7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9kZW1vc2FpY19jb25maWcgewotCXVpbnQ4X3QgICBlbmFibGU7Ci0JdWludDhfdCAgIHNsb3BlU2hpZnQ7Ci0Jc3RydWN0IHZmZV9jbWRzX2RlbW9zYWljX2FiZiBhYmZDb25maWc7Ci0Jc3RydWN0IHZmZV9jbWRzX2RlbW9zYWljX2JwYyBicGNDb25maWc7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9kZW1vc2FpY19icGNfdXBkYXRlIHsKLQlzdHJ1Y3QgdmZlX2NtZHNfZGVtb3NhaWNfYnBjIGJwY1VwZGF0ZTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX2RlbW9zYWljX2FiZl91cGRhdGUgewotCXN0cnVjdCB2ZmVfY21kc19kZW1vc2FpY19hYmYgYWJmVXBkYXRlOwotfTsKLQotc3RydWN0IHZmZV9jbWRfd2hpdGVfYmFsYW5jZV9jb25maWcgewotCXVpbnQ4X3QgIGVuYWJsZTsKLQl1aW50MTZfdCBjaDJHYWluOwotCXVpbnQxNl90IGNoMUdhaW47Ci0JdWludDE2X3QgY2gwR2FpbjsKLX07Ci0KLWVudW0gVkZFX0NPTE9SX0NPUlJFQ1RJT05fQ09FRl9RRkFDVE9SIHsKLQlDT0VGX0lTX1E3X1NJR05FRCwKLQlDT0VGX0lTX1E4X1NJR05FRCwKLQlDT0VGX0lTX1E5X1NJR05FRCwKLQlDT0VGX0lTX1ExMF9TSUdORUQKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX2NvbG9yX2NvcnJlY3Rpb25fY29uZmlnIHsKLQl1aW50OF90ICAgICBlbmFibGU7Ci0JZW51bSBWRkVfQ09MT1JfQ09SUkVDVElPTl9DT0VGX1FGQUNUT1IgY29lZlFGYWN0b3I7Ci0JaW50MTZfdCAgQzA7Ci0JaW50MTZfdCAgQzE7Ci0JaW50MTZfdCAgQzI7Ci0JaW50MTZfdCAgQzM7Ci0JaW50MTZfdCAgQzQ7Ci0JaW50MTZfdCAgQzU7Ci0JaW50MTZfdCAgQzY7Ci0JaW50MTZfdCAgQzc7Ci0JaW50MTZfdCAgQzg7Ci0JaW50MTZfdCAgSzA7Ci0JaW50MTZfdCAgSzE7Ci0JaW50MTZfdCAgSzI7Ci19OwotCi0jZGVmaW5lIFZGRV9MQV9UQUJMRV9MRU5HVEggNjQKLQotc3RydWN0IHZmZV9jbWRfbGFfY29uZmlnIHsKLQl1aW50OF90IGVuYWJsZTsKLQlpbnQxNl90IHRhYmxlW1ZGRV9MQV9UQUJMRV9MRU5HVEhdOwotfTsKLQotI2RlZmluZSBWRkVfR0FNTUFfVEFCTEVfTEVOR1RIIDI1NgotZW51bSBWRkVfUkdCX0dBTU1BX1RBQkxFX1NFTEVDVCB7Ci0JUkdCX0dBTU1BX0NIMF9TRUxFQ1RFRCwKLQlSR0JfR0FNTUFfQ0gxX1NFTEVDVEVELAotCVJHQl9HQU1NQV9DSDJfU0VMRUNURUQsCi0JUkdCX0dBTU1BX0NIMF9DSDFfU0VMRUNURUQsCi0JUkdCX0dBTU1BX0NIMF9DSDJfU0VMRUNURUQsCi0JUkdCX0dBTU1BX0NIMV9DSDJfU0VMRUNURUQsCi0JUkdCX0dBTU1BX0NIMF9DSDFfQ0gyX1NFTEVDVEVECi19OwotCi1zdHJ1Y3QgdmZlX2NtZF9yZ2JfZ2FtbWFfY29uZmlnIHsKLQl1aW50OF90IGVuYWJsZTsKLQllbnVtIFZGRV9SR0JfR0FNTUFfVEFCTEVfU0VMRUNUIGNoYW5uZWxTZWxlY3Q7Ci0JaW50MTZfdCB0YWJsZVtWRkVfR0FNTUFfVEFCTEVfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX2Nocm9tYV9lbmhhbl9jb25maWcgewotCXVpbnQ4X3QgIGVuYWJsZTsKLQlpbnQxNl90IGFtOwotCWludDE2X3QgYXA7Ci0JaW50MTZfdCBibTsKLQlpbnQxNl90IGJwOwotCWludDE2X3QgY207Ci0JaW50MTZfdCBjcDsKLQlpbnQxNl90IGRtOwotCWludDE2X3QgZHA7Ci0JaW50MTZfdCBrY3I7Ci0JaW50MTZfdCBrY2I7Ci0JaW50MTZfdCBSR0J0b1lDb252ZXJzaW9uVjA7Ci0JaW50MTZfdCBSR0J0b1lDb252ZXJzaW9uVjE7Ci0JaW50MTZfdCBSR0J0b1lDb252ZXJzaW9uVjI7Ci0JdWludDhfdCBSR0J0b1lDb252ZXJzaW9uT2Zmc2V0OwotfTsKLQotc3RydWN0IHZmZV9jbWRfY2hyb21hX3N1cHByZXNzaW9uX2NvbmZpZyB7Ci0JdWludDhfdCBlbmFibGU7Ci0JdWludDhfdCBtMTsKLQl1aW50OF90IG0zOwotCXVpbnQ4X3QgbjE7Ci0JdWludDhfdCBuMzsKLQl1aW50OF90IG5uMTsKLQl1aW50OF90IG1tMTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX2FzZl9jb25maWcgewotCXVpbnQ4X3QgZW5hYmxlOwotCXVpbnQ4X3Qgc21vb3RoRmlsdGVyRW5hYmxlZDsKLQl1aW50OF90IHNoYXJwTW9kZTsKLQl1aW50OF90IHNtb290aENvZWZDZW50ZXI7Ci0JdWludDhfdCBzbW9vdGhDb2VmU3VycjsKLQl1aW50OF90IG5vcm1hbGl6ZUZhY3RvcjsKLQl1aW50OF90IHNoYXJwSzE7Ci0JdWludDhfdCBzaGFycEsyOwotCXVpbnQ4X3Qgc2hhcnBUaHJlc2hFMTsKLQlpbnQ4X3Qgc2hhcnBUaHJlc2hFMjsKLQlpbnQ4X3Qgc2hhcnBUaHJlc2hFMzsKLQlpbnQ4X3Qgc2hhcnBUaHJlc2hFNDsKLQlpbnQ4X3Qgc2hhcnBUaHJlc2hFNTsKLQlpbnQ4X3QgZmlsdGVyMUNvZWZmaWNpZW50c1s5XTsKLQlpbnQ4X3QgZmlsdGVyMkNvZWZmaWNpZW50c1s5XTsKLQl1aW50OF90ICBjcm9wRW5hYmxlOwotCXVpbnQxNl90IGNyb3BGaXJzdFBpeGVsOwotCXVpbnQxNl90IGNyb3BMYXN0UGl4ZWw7Ci0JdWludDE2X3QgY3JvcEZpcnN0TGluZTsKLQl1aW50MTZfdCBjcm9wTGFzdExpbmU7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9hc2ZfdXBkYXRlIHsKLQl1aW50OF90IGVuYWJsZTsKLQl1aW50OF90IHNtb290aEZpbHRlckVuYWJsZWQ7Ci0JdWludDhfdCBzaGFycE1vZGU7Ci0JdWludDhfdCBzbW9vdGhDb2VmQ2VudGVyOwotCXVpbnQ4X3Qgc21vb3RoQ29lZlN1cnI7Ci0JdWludDhfdCBub3JtYWxpemVGYWN0b3I7Ci0JdWludDhfdCBzaGFycEsxOwotCXVpbnQ4X3Qgc2hhcnBLMjsKLQl1aW50OF90IHNoYXJwVGhyZXNoRTE7Ci0JaW50OF90ICBzaGFycFRocmVzaEUyOwotCWludDhfdCAgc2hhcnBUaHJlc2hFMzsKLQlpbnQ4X3QgIHNoYXJwVGhyZXNoRTQ7Ci0JaW50OF90ICBzaGFycFRocmVzaEU1OwotCWludDhfdCAgZmlsdGVyMUNvZWZmaWNpZW50c1s5XTsKLQlpbnQ4X3QgIGZpbHRlcjJDb2VmZmljaWVudHNbOV07Ci0JdWludDhfdCBjcm9wRW5hYmxlOwotfTsKLQotZW51bSBWRkVfVEVTVF9HRU5fU1lOQ19FREdFIHsKLQlWRkVfVEVTVF9HRU5fU1lOQ19FREdFX0FjdGl2ZUhpZ2gsCi0JVkZFX1RFU1RfR0VOX1NZTkNfRURHRV9BY3RpdmVMb3cKLX07Ci0KLQotc3RydWN0IHZmZV9jbWRfYnVzX3BtX3N0YXJ0IHsKLQl1aW50OF90IG91dHB1dDJZV3JQbUVuYWJsZTsKLQl1aW50OF90IG91dHB1dDJDYmNyV3JQbUVuYWJsZTsKLQl1aW50OF90IG91dHB1dDFZV3JQbUVuYWJsZTsKLQl1aW50OF90IG91dHB1dDFDYmNyV3JQbUVuYWJsZTsKLX07Ci0KLXN0cnVjdCAgdmZlX2ZyYW1lX3NraXBfY291bnRzIHsKLQl1aW50MzJfdCAgdG90YWxGcmFtZUNvdW50OwotCXVpbnQzMl90ICBvdXRwdXQxQ291bnQ7Ci0JdWludDMyX3QgIG91dHB1dDJDb3VudDsKLX07Ci0KLWVudW0gVkZFX0FYSV9SRF9VTlBBQ0tfSEJJX1NFTCB7Ci0JVkZFX0FYSV9SRF9IQklfMzJfQ0xPQ0tfQ1lDTEVTLAotCVZGRV9BWElfUkRfSEJJXzY0X0NMT0NLX0NZQ0xFUywKLQlWRkVfQVhJX1JEX0hCSV8xMjhfQ0xPQ0tfQ1lDTEVTLAotCVZGRV9BWElfUkRfSEJJXzI1Nl9DTE9DS19DWUNMRVMsCi0JVkZFX0FYSV9SRF9IQklfNTEyX0NMT0NLX0NZQ0xFUywKLQlWRkVfQVhJX1JEX0hCSV8xMDI0X0NMT0NLX0NZQ0xFUywKLQlWRkVfQVhJX1JEX0hCSV8yMDQ4X0NMT0NLX0NZQ0xFUywKLQlWRkVfQVhJX1JEX0hCSV80MDk2X0NMT0NLX0NZQ0xFUwotfTsKLQotc3RydWN0IHZmZV9mcmFtZV9icGNfaW5mbyB7Ci0JdWludDMyX3QgZ3JlZW5EZWZlY3RQaXhlbENvdW50OwotCXVpbnQzMl90IHJlZEJsdWVEZWZlY3RQaXhlbENvdW50OwotfTsKLQotc3RydWN0IHZmZV9mcmFtZV9hc2ZfaW5mbyB7Ci0JdWludDMyX3QgIGFzZk1heEVkZ2U7Ci0JdWludDMyX3QgIGFzZkhiaUNvdW50OwotfTsKLQotc3RydWN0IHZmZV9tc2dfY2FtaWZfc3RhdHVzIHsKLQl1aW50OF90ICBjYW1pZlN0YXRlOwotCXVpbnQzMl90IHBpeGVsQ291bnQ7Ci0JdWludDMyX3QgbGluZUNvdW50OwotfTsKLQotc3RydWN0IHZmZTMxX2lycV9zdGF0dXMgewotCXVpbnQzMl90IHZmZUlycVN0YXR1czA7Ci0JdWludDMyX3QgdmZlSXJxU3RhdHVzMTsKLQl1aW50MzJfdCBjYW1pZlN0YXR1czsKLQl1aW50MzJfdCBkZW1vc2FpY1N0YXR1czsKLQl1aW50MzJfdCBhc2ZNYXhFZGdlOwotfTsKLQotI2RlZmluZSBWMzFfUFJFVklFV19BWElfRkxBRyAgMHgwMDAwMDAwMQotI2RlZmluZSBWMzFfU05BUFNIT1RfQVhJX0ZMQUcgKDB4MDAwMDAwMDE8PDEpCi0KLXN0cnVjdCB2ZmUzMV9jbWRfdHlwZSB7Ci0JdWludDE2X3QgaWQ7Ci0JdWludDMyX3QgbGVuZ3RoOwotCXVpbnQzMl90IG9mZnNldDsKLQl1aW50MzJfdCBmbGFnOwotfTsKLQotc3RydWN0IHZmZTMxX2ZyZWVfYnVmIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7Ci0JdWludDMyX3QgcGFkZHI7Ci0JdWludDMyX3QgeV9vZmY7Ci0JdWludDMyX3QgY2Jjcl9vZmY7Ci19OwotCi1zdHJ1Y3QgdmZlMzFfb3V0cHV0X2NoIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfYnVmX3F1ZXVlOwotCXNwaW5sb2NrX3QgZnJlZV9idWZfbG9jazsKLQl1aW50MzJfdCBpbnN0X2hhbmRsZTsKLQlpbnQ4X3QgY2gwOwotCWludDhfdCBjaDE7Ci0JaW50OF90IGNoMjsKLQl1aW50MzJfdCAgY2FwdHVyZV9jbnQ7Ci0JdWludDMyX3QgIGZyYW1lX2Ryb3BfY250OwotCXN0cnVjdCBtc21fZnJlZV9idWYgcGluZzsKLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmIHBvbmc7Ci0Jc3RydWN0IG1zbV9mcmVlX2J1ZiBmcmVlX2J1ZjsKLX07Ci0KLS8qIG5vIGVycm9yIGlycSBpbiBtYXNrIDAgKi8KLSNkZWZpbmUgVkZFMzFfSU1BU0tfRVJST1JfT05MWV8wICAweDAKLS8qIHdoZW4gbm9ybWFsIGNhc2UsIGRvbid0IHdhbnQgdG8gYmxvY2sgZXJyb3Igc3RhdHVzLiAqLwotLyogYml0IDAtMjEgYXJlIGVycm9yIGlycSBiaXRzICovCi0jZGVmaW5lIFZGRTMxX0lNQVNLX0VSUk9SX09OTFlfMSAgICAgICAgICAgICAgIDB4MDAzRkZGRkYKLSNkZWZpbmUgVkZFMzFfSU1BU0tfQ0FNSUZfRVJST1IgICAgICAgICAgICAgICAoMHgwMDAwMDAwMTw8MCkKLSNkZWZpbmUgVkZFMzFfSU1BU0tfU1RBVFNfQ1NfT1ZXUiAgICAgICAgICAgICAoMHgwMDAwMDAwMTw8MSkKLSNkZWZpbmUgVkZFMzFfSU1BU0tfU1RBVFNfSUhJU1RfT1ZXUiAgICAgICAgICAoMHgwMDAwMDAwMTw8MikKLSNkZWZpbmUgVkZFMzFfSU1BU0tfUkVBTElHTl9CVUZfWV9PVkZMICAgICAgICAoMHgwMDAwMDAwMTw8MykKLSNkZWZpbmUgVkZFMzFfSU1BU0tfUkVBTElHTl9CVUZfQ0JfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8NCkKLSNkZWZpbmUgVkZFMzFfSU1BU0tfUkVBTElHTl9CVUZfQ1JfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8NSkKLSNkZWZpbmUgVkZFMzFfSU1BU0tfVklPTEFUSU9OICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMTw8NikKLSNkZWZpbmUgVkZFMzFfSU1BU0tfSU1HX01BU1RfMF9CVVNfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8NykKLSNkZWZpbmUgVkZFMzFfSU1BU0tfSU1HX01BU1RfMV9CVVNfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8OCkKLSNkZWZpbmUgVkZFMzFfSU1BU0tfSU1HX01BU1RfMl9CVVNfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8OSkKLSNkZWZpbmUgVkZFMzFfSU1BU0tfSU1HX01BU1RfM19CVVNfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8MTApCi0jZGVmaW5lIFZGRTMxX0lNQVNLX0lNR19NQVNUXzRfQlVTX09WRkwgICAgICAgKDB4MDAwMDAwMDE8PDExKQotI2RlZmluZSBWRkUzMV9JTUFTS19JTUdfTUFTVF81X0JVU19PVkZMICAgICAgICgweDAwMDAwMDAxPDwxMikKLSNkZWZpbmUgVkZFMzFfSU1BU0tfSU1HX01BU1RfNl9CVVNfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8MTMpCi0jZGVmaW5lIFZGRTMxX0lNQVNLX1NUQVRTX0FFX0JHX0JVU19PVkZMICAgICAgICAgKDB4MDAwMDAwMDE8PDE0KQotI2RlZmluZSBWRkUzMV9JTUFTS19TVEFUU19BRl9CRl9CVVNfT1ZGTCAgICAgICAgICgweDAwMDAwMDAxPDwxNSkKLSNkZWZpbmUgVkZFMzFfSU1BU0tfU1RBVFNfQVdCX0JVU19PVkZMICAgICAgICAoMHgwMDAwMDAwMTw8MTYpCi0jZGVmaW5lIFZGRTMxX0lNQVNLX1NUQVRTX1JTX0JVU19PVkZMICAgICAgICAgKDB4MDAwMDAwMDE8PDE3KQotI2RlZmluZSBWRkUzMV9JTUFTS19TVEFUU19DU19CVVNfT1ZGTCAgICAgICAgICgweDAwMDAwMDAxPDwxOCkKLSNkZWZpbmUgVkZFMzFfSU1BU0tfU1RBVFNfSUhJU1RfQlVTX09WRkwgICAgICAoMHgwMDAwMDAwMTw8MTkpCi0jZGVmaW5lIFZGRTMxX0lNQVNLX1NUQVRTX1NLSU5fQkhJU1RfQlVTX09WRkwgICAgICAgKDB4MDAwMDAwMDE8PDIwKQotI2RlZmluZSBWRkUzMV9JTUFTS19BWElfRVJST1IgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxPDwyMSkKLQotI2RlZmluZSBWRkVfQ09NX1NUQVRVUyAweDAwMEZFMDAwCi0KLXN0cnVjdCB2ZmUzMV9vdXRwdXRfcGF0aCB7Ci0JdWludDE2X3Qgb3V0cHV0X21vZGU7ICAgICAvKiBiaXRtYXNrICAqLwotCi0Jc3RydWN0IHZmZTMxX291dHB1dF9jaCBvdXQwOyAvKiBwcmV2aWV3IGFuZCB0aHVtYm5haWwgKi8KLQlzdHJ1Y3QgdmZlMzFfb3V0cHV0X2NoIG91dDE7IC8qIHNuYXBzaG90ICovCi0Jc3RydWN0IHZmZTMxX291dHB1dF9jaCBvdXQyOyAvKiB2aWRlbyAgICAqLwotfTsKLQotc3RydWN0IHZmZTMxX2ZyYW1lX2V4dHJhIHsKLQl1aW50MzJfdCBncmVlbkRlZmVjdFBpeGVsQ291bnQ7Ci0JdWludDMyX3QgcmVkQmx1ZURlZmVjdFBpeGVsQ291bnQ7Ci0KLQl1aW50MzJfdCAgYXNmTWF4RWRnZTsKLQl1aW50MzJfdCAgYXNmSGJpQ291bnQ7Ci0KLQl1aW50MzJfdCB5V3JQbVN0YXRzMDsKLQl1aW50MzJfdCB5V3JQbVN0YXRzMTsKLQl1aW50MzJfdCBjYmNyV3JQbVN0YXRzMDsKLQl1aW50MzJfdCBjYmNyV3JQbVN0YXRzMTsKLQotCXVpbnQzMl90ICBmcmFtZUNvdW50ZXI7Ci19OwotCi0jZGVmaW5lIFZGRV9ESVNBQkxFX0FMTF9JUlFTICAgICAgICAgICAgIDAKLSNkZWZpbmUgVkZFX0NMRUFSX0FMTF9JUlFTICAgICAgICAgICAgICAgMHhmZmZmZmZmZgotCi0jZGVmaW5lIFZGRV9IV19WRVJTSU9OCQkJCQkgMHgwMDAwMDAwMAotI2RlZmluZSBWRkVfR0xPQkFMX1JFU0VUICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFZGRV9NT0RVTEVfUkVTRVQJCQkJIDB4MDAwMDAwMDgKLSNkZWZpbmUgVkZFX0NHQ19PVkVSUklERSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQwotI2RlZmluZSBWRkVfTU9EVUxFX0NGRyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIFZGRV9DRkcJCQkJIDB4MDAwMDAwMTQKLSNkZWZpbmUgVkZFX0lSUV9DTUQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOAotI2RlZmluZSBWRkVfSVJRX01BU0tfMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFDCi0jZGVmaW5lIFZGRV9JUlFfTUFTS18xICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgVkZFX0lSUV9DTEVBUl8wICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyNAotI2RlZmluZSBWRkVfSVJRX0NMRUFSXzEgICAgICAgICAgICAgICAgICAweDAwMDAwMDI4Ci0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTXzAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMkMKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVNfMSAgICAgICAgICAgICAgICAgMHgwMDAwMDAzMAotI2RlZmluZSBWRkVfSVJRX0NPTVBfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMDM0Ci0jZGVmaW5lIFZGRV9CVVNfQ01EICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzgKLSNkZWZpbmUgVkZFX0JVU19QSU5HX1BPTkdfU1RBVFVTICAgICAgICAgMHgwMDAwMDE4MAotI2RlZmluZSBWRkVfQlVTX09QRVJBVElPTl9TVEFUVVMgICAgICAgICAweDAwMDAwMTg0Ci0KLSNkZWZpbmUgVkZFX0JVU19JTUFHRV9NQVNURVJfMF9XUl9QTV9TVEFUU18wICAgICAgICAweDAwMDAwMTkwCi0jZGVmaW5lIFZGRV9CVVNfSU1BR0VfTUFTVEVSXzBfV1JfUE1fU1RBVFNfMSAgICAgICAgMHgwMDAwMDE5NAotCi0jZGVmaW5lIFZGRV9BWElfQ01EICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxRDgKLSNkZWZpbmUgVkZFX0FYSV9TVEFUVVMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDFEQwotI2RlZmluZSBWRkVfQlVTX1NUQVRTX1BJTkdfUE9OR19CQVNFICAgICAweDAwMDAwMEY0Ci0KLSNkZWZpbmUgVkZFX0JVU19TVEFUU19BRUNfV1JfUElOR19BRERSICAgMHgwMDAwMDBGNAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0FFQ19XUl9QT05HX0FERFIgICAweDAwMDAwMEY4Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQUVDX1VCX0NGRyAgICAgICAgIDB4MDAwMDAwRkMKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19BRl9XUl9QSU5HX0FERFIgICAgMHgwMDAwMDEwMAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0FGX1dSX1BPTkdfQUREUiAgICAweDAwMDAwMTA0Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQUZfVUJfQ0ZHICAgICAgICAgIDB4MDAwMDAxMDgKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19BV0JfV1JfUElOR19BRERSICAgMHgwMDAwMDEwQwotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0FXQl9XUl9QT05HX0FERFIgICAweDAwMDAwMTEwCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQVdCX1VCX0NGRyAgICAgICAgIDB4MDAwMDAxMTQKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19SU19XUl9QSU5HX0FERFIgICAgMHgwMDAwMDExOAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX1JTX1dSX1BPTkdfQUREUiAgICAweDAwMDAwMTFDCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfUlNfVUJfQ0ZHICAgICAgICAgIDB4MDAwMDAxMjAKLQotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0NTX1dSX1BJTkdfQUREUiAgICAweDAwMDAwMTI0Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQ1NfV1JfUE9OR19BRERSICAgIDB4MDAwMDAxMjgKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19DU19VQl9DRkcgICAgICAgICAgMHgwMDAwMDEyQwotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0hJU1RfV1JfUElOR19BRERSICAweDAwMDAwMTMwCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfSElTVF9XUl9QT05HX0FERFIgIDB4MDAwMDAxMzQKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19ISVNUX1VCX0NGRyAgICAgICAgMHgwMDAwMDEzOAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX1NLSU5fV1JfUElOR19BRERSICAweDAwMDAwMTNDCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfU0tJTl9XUl9QT05HX0FERFIgIDB4MDAwMDAxNDAKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19TS0lOX1VCX0NGRyAgICAgICAgMHgwMDAwMDE0NAotI2RlZmluZSBWRkVfQlVTX1BNX0NNRCAgICAgICAgICAgICAgICAgICAweDAwMDAwMTg4Ci0jZGVmaW5lIFZGRV9CVVNfUE1fQ0ZHICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxOEMKLSNkZWZpbmUgVkZFX0NBTUlGX0NPTU1BTkQgICAgICAgICAgICAgICAgMHgwMDAwMDFFMAotI2RlZmluZSBWRkVfQ0FNSUZfU1RBVFVTICAgICAgICAgICAgICAgICAweDAwMDAwMjA0Ci0jZGVmaW5lIFZGRV9SRUdfVVBEQVRFX0NNRCAgICAgICAgICAgICAgIDB4MDAwMDAyNjAKLSNkZWZpbmUgVkZFX0RFTVVYX0dBSU5fMCAgICAgICAgICAgICAgICAgMHgwMDAwMDI4OAotI2RlZmluZSBWRkVfREVNVVhfR0FJTl8xICAgICAgICAgICAgICAgICAweDAwMDAwMjhDCi0jZGVmaW5lIFZGRV9DSFJPTUFfVVAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzNUMKLSNkZWZpbmUgVkZFX0ZSQU1FRFJPUF9FTkNfWV9DRkcgICAgICAgICAgMHgwMDAwMDUwNAotI2RlZmluZSBWRkVfRlJBTUVEUk9QX0VOQ19DQkNSX0NGRyAgICAgICAweDAwMDAwNTA4Ci0jZGVmaW5lIFZGRV9GUkFNRURST1BfRU5DX1lfUEFUVEVSTiAgICAgIDB4MDAwMDA1MEMKLSNkZWZpbmUgVkZFX0ZSQU1FRFJPUF9FTkNfQ0JDUl9QQVRURVJOICAgMHgwMDAwMDUxMAotI2RlZmluZSBWRkVfRlJBTUVEUk9QX1ZJRVdfWSAgICAgICAgICAgICAweDAwMDAwNTE0Ci0jZGVmaW5lIFZGRV9GUkFNRURST1BfVklFV19DQkNSICAgICAgICAgIDB4MDAwMDA1MTgKLSNkZWZpbmUgVkZFX0ZSQU1FRFJPUF9WSUVXX1lfUEFUVEVSTiAgICAgMHgwMDAwMDUxQwotI2RlZmluZSBWRkVfRlJBTUVEUk9QX1ZJRVdfQ0JDUl9QQVRURVJOICAweDAwMDAwNTIwCi0jZGVmaW5lIFZGRV9DTEFNUF9NQVggICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MjQKLSNkZWZpbmUgVkZFX0NMQU1QX01JTiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUyOAotI2RlZmluZSBWRkVfUkVBTElHTl9CVUYgICAgICAgICAgICAgICAgICAweDAwMDAwNTJDCi0jZGVmaW5lIFZGRV9TVEFUU19DRkcgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MzAKLSNkZWZpbmUgVkZFX1NUQVRTX0FXQl9TR1dfQ0ZHICAgICAgICAgICAgMHgwMDAwMDU1NAotI2RlZmluZSBWRkVfRE1JX0NGRyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTk4Ci0jZGVmaW5lIFZGRV9ETUlfQUREUiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1OUMKLSNkZWZpbmUgVkZFX0RNSV9EQVRBX0xPICAgICAgICAgICAgICAgICAgMHgwMDAwMDVBNAotI2RlZmluZSBWRkVfQVhJX0NGRyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjAwCi0KLSNkZWZpbmUgVkZFMzFfT1VUUFVUX01PREVfUFQJCUJJVCgwKQotI2RlZmluZSBWRkUzMV9PVVRQVVRfTU9ERV9TCQkJQklUKDEpCi0jZGVmaW5lIFZGRTMxX09VVFBVVF9NT0RFX1YJCQlCSVQoMikKLSNkZWZpbmUgVkZFMzFfT1VUUFVUX01PREVfUAkJCUJJVCgzKQotI2RlZmluZSBWRkUzMV9PVVRQVVRfTU9ERV9UCQkJQklUKDQpCi0jZGVmaW5lIFZGRTMxX09VVFBVVF9NT0RFX1BfQUxMX0NITkxTCQlCSVQoNSkKLSNkZWZpbmUgVkZFMzFfT1VUUFVUX01PREVfUFJJTUFSWQkJQklUKDYpCi0jZGVmaW5lIFZGRTMxX09VVFBVVF9NT0RFX1BSSU1BUllfQUxMX0NITkxTCUJJVCg3KQotI2RlZmluZSBWRkUzMV9PVVRQVVRfTU9ERV9TRUNPTkRBUlkJCUJJVCg4KQotI2RlZmluZSBWRkUzMV9PVVRQVVRfTU9ERV9TRUNPTkRBUllfQUxMX0NITkxTCUJJVCg5KQotc3RydWN0IHZmZV9zdGF0c19jb250cm9sIHsKLQl1aW50OF90ICBhY2tQZW5kaW5nOwotCXVpbnQzMl90IG5leHRGcmFtZUFkZHJCdWY7Ci0JdWludDMyX3QgZHJvcHBlZFN0YXRzRnJhbWVDb3VudDsKLQl1aW50MzJfdCBidWZUb1JlbmRlcjsKLX07Ci0KLXN0cnVjdCB2ZmUzMV9jdHJsX3R5cGUgewotCXVpbnQxNl90IG9wZXJhdGlvbl9tb2RlOyAgICAgLyogc3RyZWFtaW5nIG9yIHNuYXBzaG90ICovCi0Jc3RydWN0IHZmZTMxX291dHB1dF9wYXRoIG91dHBhdGg7Ci0KLQl1aW50MzJfdCB2ZmVJbWFza0NvbXBvc2l0ZVBhY2tlZDsKLQotCXNwaW5sb2NrX3QgIHN0b3BfZmxhZ19sb2NrOwotCXNwaW5sb2NrX3QgIHVwZGF0ZV9hY2tfbG9jazsKLQlzcGlubG9ja190ICBzdGF0ZV9sb2NrOwotCXNwaW5sb2NrX3QgIGlvX2xvY2s7Ci0Jc3BpbmxvY2tfdCAgc3RhdHNfYnVmcV9sb2NrOwotCi0JdWludDMyX3QgZXh0bGVuOwotCXZvaWQgKmV4dGRhdGE7Ci0KLQlpbnQ4X3Qgc3RhcnRfYWNrX3BlbmRpbmc7Ci0JaW50OF90IHN0b3BfYWNrX3BlbmRpbmc7Ci0JaW50OF90IHJlc2V0X2Fja19wZW5kaW5nOwotCWludDhfdCB1cGRhdGVfYWNrX3BlbmRpbmc7Ci0JZW51bSB2ZmVfb3V0cHV0X3N0YXRlIHJlY29yZGluZ19zdGF0ZTsKLQlpbnQ4X3QgdXBkYXRlX2xpbmVhcjsKLQlpbnQ4X3QgdXBkYXRlX3JvbGxvZmY7Ci0JaW50OF90IHVwZGF0ZV9sYTsKLQlpbnQ4X3QgdXBkYXRlX2dhbW1hOwotCWVudW0gdmZlX291dHB1dF9zdGF0ZSBsaXZlc2hvdF9zdGF0ZTsKLQotCXNwaW5sb2NrX3QgIHRhc2tsZXRfbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHRhc2tsZXRfcTsKLQl2b2lkIF9faW9tZW0gKnZmZWJhc2U7Ci0Jdm9pZCBfX2lvbWVtICpjYW1pZmJhc2U7Ci0Jdm9pZCAqc3luY2RhdGE7Ci0JdWludDMyX3QgcmVnaXN0ZXJfdG90YWw7Ci0KLQlzdHJ1Y3QgcmVzb3VyY2UJKnZmZW1lbTsKLQlzdHJ1Y3QgcmVzb3VyY2UJKmNhbWlmbWVtOwotCXN0cnVjdCByZXNvdXJjZSAqdmZlaW87Ci0Jc3RydWN0IHJlc291cmNlICpjYW1pZmlvOwotCXN0cnVjdCByZXNvdXJjZSAqdmZlaXJxOwotCXN0cnVjdCByZWd1bGF0b3IgKmZzX3ZmZTsKLQotCXVpbnQzMl90IHN0YXRzX2NvbXA7Ci0JYXRvbWljX3QgdnN0YXRlOwotCXVpbnQzMl90IHZmZV9jYXB0dXJlX2NvdW50OwotCXVpbnQzMl90IHN5bmNfdGltZXJfcmVwZWF0X2NvdW50OwotCXVpbnQzMl90IHN5bmNfdGltZXJfc3RhdGU7Ci0JdWludDMyX3Qgc3luY190aW1lcl9udW1iZXI7Ci0KLQl1aW50MzJfdCB2ZmVGcmFtZUlkOwotCXVpbnQzMl90IG91dHB1dDFQYXR0ZXJuOwotCXVpbnQzMl90IG91dHB1dDFQZXJpb2Q7Ci0JdWludDMyX3Qgb3V0cHV0MlBhdHRlcm47Ci0JdWludDMyX3Qgb3V0cHV0MlBlcmlvZDsKLQl1aW50MzJfdCB2ZmVGcmFtZVNraXBDb3VudDsKLQl1aW50MzJfdCB2ZmVGcmFtZVNraXBQZXJpb2Q7Ci0Jc3RydWN0IHZmZV9zdGF0c19jb250cm9sIGFmU3RhdHNDb250cm9sOwotCXN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCBhd2JTdGF0c0NvbnRyb2w7Ci0Jc3RydWN0IHZmZV9zdGF0c19jb250cm9sIGFlY1N0YXRzQ29udHJvbDsKLQlzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wgaWhpc3RTdGF0c0NvbnRyb2w7Ci0Jc3RydWN0IHZmZV9zdGF0c19jb250cm9sIHJzU3RhdHNDb250cm9sOwotCXN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCBjc1N0YXRzQ29udHJvbDsKLQotCS8qIHY0bDIgc3ViZGV2ICovCi0Jc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXN0cnVjdCBjbGsgKnZmZV9jbGtbNV07Ci0Jc3RydWN0IGNsayAqdmZlX2NhbWlmX2Nsa1syXTsKLQlzcGlubG9ja190ICBzZF9ub3RpZnlfbG9jazsKLQl1aW50MzJfdCBoZnJfbW9kZTsKLQl1aW50MzJfdCBmcmFtZV9za2lwX2NudDsKLQl1aW50MzJfdCBmcmFtZV9za2lwX3BhdHRlcm47Ci0JdWludDMyX3Qgc25hcHNob3RfZnJhbWVfY250OwotCXN0cnVjdCBtc21fc3RhdHNfYnVmcV9jdHJsIHN0YXRzX2N0cmw7Ci0Jc3RydWN0IG1zbV9zdGF0c19vcHMgc3RhdHNfb3BzOwotCXN0cnVjdCBkZXZpY2UgKmlvbW11X2N0eF9pbWd3cjsKLQlzdHJ1Y3QgZGV2aWNlICppb21tdV9jdHhfbWlzYzsKLX07Ci0KLWVudW0gVkZFMzFfU1RBVFNfTlVNIHsKLQlTVEFUU19BRV9OVU0sCi0JU1RBVFNfQUZfTlVNLAotCVNUQVRTX0FXQl9OVU0sCi0JU1RBVFNfUlNfTlVNLAotCVNUQVRTX0NTX05VTSwKLQlTVEFUU19JSElTVF9OVU0sCi0JU1RBVFNfU0tJTl9OVU0sCi0JU1RBVFNfTUFYX05VTSwKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX3N0YXRzX2FjayB7Ci0JdWludDMyX3QgIG5leHRTdGF0c0J1ZjsKLX07Ci0KLSNkZWZpbmUgVkZFX1NUQVRTX0JVRkZFUl9DT1VOVCAgICAgICAgICAgIDMKLQotc3RydWN0IHZmZV9jbWRfc3RhdHNfYnVmIHsKLQl1aW50MzJfdCBzdGF0c0J1ZltWRkVfU1RBVFNfQlVGRkVSX0NPVU5UXTsKLX07Ci0jZW5kaWYgLyogX19NU01fVkZFMzFfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmUzMi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3MDE3MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmUzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjc4MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9pc3AuaD4KLQotI2luY2x1ZGUgIm1zbS5oIgotI2luY2x1ZGUgIm1zbV9jYW1fc2VydmVyLmgiCi0jaW5jbHVkZSAibXNtX3ZmZTMyLmgiCi0KLWF0b21pY190IGlycV9jbnQ7Ci0KLSNkZWZpbmUgVkZFMzJfQVhJX09GRlNFVCAweDAwNTAKLSNkZWZpbmUgdmZlMzJfZ2V0X2NoX3BpbmdfYWRkcihiYXNlLCBjaG4pIFwKLQkobXNtX2NhbWVyYV9pb19yKChiYXNlKSArIDB4MDA1MCArIDB4MTggKiAoY2huKSkpCi0jZGVmaW5lIHZmZTMyX2dldF9jaF9wb25nX2FkZHIoYmFzZSwgY2huKSBcCi0JKG1zbV9jYW1lcmFfaW9fcigoYmFzZSkgKyAweDAwNTAgKyAweDE4ICogKGNobikgKyA0KSkKLSNkZWZpbmUgdmZlMzJfZ2V0X2NoX2FkZHIocGluZ19wb25nLCBiYXNlLCBjaG4pIFwKLQkoKCgocGluZ19wb25nKSAmICgxIDw8IChjaG4pKSkgPT0gMCkgPyBcCi0JKHZmZTMyX2dldF9jaF9wb25nX2FkZHIoKGJhc2UpLCBjaG4pKSA6IFwKLQkodmZlMzJfZ2V0X2NoX3BpbmdfYWRkcigoYmFzZSksIGNobikpKQotCi0jZGVmaW5lIHZmZTMyX3B1dF9jaF9waW5nX2FkZHIoYmFzZSwgY2huLCBhZGRyKSBcCi0JKG1zbV9jYW1lcmFfaW9fdygoYWRkciksIChiYXNlKSArIDB4MDA1MCArIDB4MTggKiAoY2huKSkpCi0jZGVmaW5lIHZmZTMyX3B1dF9jaF9wb25nX2FkZHIoYmFzZSwgY2huLCBhZGRyKSBcCi0JKG1zbV9jYW1lcmFfaW9fdygoYWRkciksIChiYXNlKSArIDB4MDA1MCArIDB4MTggKiAoY2huKSArIDQpKQotI2RlZmluZSB2ZmUzMl9wdXRfY2hfYWRkcihwaW5nX3BvbmcsIGJhc2UsIGNobiwgYWRkcikgXAotCSgoKHBpbmdfcG9uZykgJiAoMSA8PCAoY2huKSkpID09IDAgPyAgIFwKLQl2ZmUzMl9wdXRfY2hfcG9uZ19hZGRyKChiYXNlKSwgKGNobiksIChhZGRyKSkgOiBcCi0JdmZlMzJfcHV0X2NoX3BpbmdfYWRkcigoYmFzZSksIChjaG4pLCAoYWRkcikpKQotCi1zdGF0aWMgdWludDMyX3QgdmZlX2Nsa19yYXRlOwotc3RhdGljIHZvaWQgdmZlMzJfc2VuZF9pc3BfbXNnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JdWludDMyX3QgdmZlRnJhbWVJZCwgdWludDMyX3QgaXNwX21zZ19pZCk7Ci0KLQotc3RydWN0IHZmZTMyX2lzcl9xdWV1ZV9jbWQgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHZmZUludGVycnVwdFN0YXR1czA7Ci0JdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZmVJbnRlcnJ1cHRTdGF0dXMxOwotfTsKLQotc3RhdGljIHN0cnVjdCB2ZmUzMl9jbWRfdHlwZSB2ZmUzMl9jbWRbXSA9IHsKLS8qIDAqLwl7VkZFX0NNRF9EVU1NWV8wfSwKLQkJe1ZGRV9DTURfU0VUX0NMS30sCi0JCXtWRkVfQ01EX1JFU0VUfSwKLQkJe1ZGRV9DTURfU1RBUlR9LAotCQl7VkZFX0NNRF9URVNUX0dFTl9TVEFSVH0sCi0vKiA1Ki8Je1ZGRV9DTURfT1BFUkFUSU9OX0NGRywgVjMyX09QRVJBVElPTl9DRkdfTEVOfSwKLQkJe1ZGRV9DTURfQVhJX09VVF9DRkcsIFYzMl9BWElfT1VUX0xFTiwgVjMyX0FYSV9PVVRfT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfQ0FNSUZfQ0ZHLCBWMzJfQ0FNSUZfTEVOLCBWMzJfQ0FNSUZfT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfQVhJX0lOUFVUX0NGR30sCi0JCXtWRkVfQ01EX0JMQUNLX0xFVkVMX0NGRywgVjMyX0JMQUNLX0xFVkVMX0xFTiwKLQkJVjMyX0JMQUNLX0xFVkVMX09GRiwKLQkJMHhGRn0sCi0vKjEwKi8gIHtWRkVfQ01EX01FU0hfUk9MTF9PRkZfQ0ZHLCBWMzJfTUVTSF9ST0xMX09GRl9DRkdfTEVOLAotCQlWMzJfTUVTSF9ST0xMX09GRl9DRkdfT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfREVNVVhfQ0ZHLCBWMzJfREVNVVhfTEVOLCBWMzJfREVNVVhfT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfRk9WX0NGRywgVjMyX0ZPVl9MRU4sIFYzMl9GT1ZfT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfTUFJTl9TQ0FMRVJfQ0ZHLCBWMzJfTUFJTl9TQ0FMRVJfTEVOLAotCQlWMzJfTUFJTl9TQ0FMRVJfT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfV0JfQ0ZHLCBWMzJfV0JfTEVOLCBWMzJfV0JfT0ZGLCAweEZGfSwKLS8qMTUqLwl7VkZFX0NNRF9DT0xPUl9DT1JfQ0ZHLCBWMzJfQ09MT1JfQ09SX0xFTiwgVjMyX0NPTE9SX0NPUl9PRkYsIDB4RkZ9LAotCQl7VkZFX0NNRF9SR0JfR19DRkcsIFYzMl9SR0JfR19MRU4sIFYzMl9SR0JfR19PRkYsIDB4RkZ9LAotCQl7VkZFX0NNRF9MQV9DRkcsIFYzMl9MQV9MRU4sIFYzMl9MQV9PRkYsIDB4RkYgfSwKLQkJe1ZGRV9DTURfQ0hST01BX0VOX0NGRywgVjMyX0NIUk9NQV9FTl9MRU4sIFYzMl9DSFJPTUFfRU5fT0ZGLAotCQkweEZGfSwKLQkJe1ZGRV9DTURfQ0hST01BX1NVUF9DRkcsIFYzMl9DSFJPTUFfU1VQX0xFTiwgVjMyX0NIUk9NQV9TVVBfT0ZGLAotCQkweEZGfSwKLS8qMjAqLwl7VkZFX0NNRF9NQ0VfQ0ZHLCBWMzJfTUNFX0xFTiwgVjMyX01DRV9PRkYsIDB4RkZ9LAotCQl7VkZFX0NNRF9TS19FTkhBTl9DRkcsIFYzMl9TQ0VfTEVOLCBWMzJfU0NFX09GRiwgMHhGRn0sCi0JCXtWRkVfQ01EX0FTRl9DRkcsIFYzMl9BU0ZfTEVOLCBWMzJfQVNGX09GRiwgMHhGRn0sCi0JCXtWRkVfQ01EX1MyWV9DRkcsIFYzMl9TMllfTEVOLCBWMzJfUzJZX09GRiwgMHhGRn0sCi0JCXtWRkVfQ01EX1MyQ2JDcl9DRkcsIFYzMl9TMkNiQ3JfTEVOLCBWMzJfUzJDYkNyX09GRiwgMHhGRn0sCi0vKjI1Ki8Je1ZGRV9DTURfQ0hST01BX1NVQlNfQ0ZHLCBWMzJfQ0hST01BX1NVQlNfTEVOLCBWMzJfQ0hST01BX1NVQlNfT0ZGLAotCQkweEZGfSwKLQkJe1ZGRV9DTURfT1VUX0NMQU1QX0NGRywgVjMyX09VVF9DTEFNUF9MRU4sIFYzMl9PVVRfQ0xBTVBfT0ZGLAotCQkweEZGfSwKLQkJe1ZGRV9DTURfRlJBTUVfU0tJUF9DRkcsIFYzMl9GUkFNRV9TS0lQX0xFTiwgVjMyX0ZSQU1FX1NLSVBfT0ZGLAotCQkweEZGfSwKLQkJe1ZGRV9DTURfRFVNTVlfMX0sCi0JCXtWRkVfQ01EX0RVTU1ZXzJ9LAotLyozMCovCXtWRkVfQ01EX0RVTU1ZXzN9LAotCQl7VkZFX0NNRF9VUERBVEV9LAotCQl7VkZFX0NNRF9CTF9MVkxfVVBEQVRFLCBWMzJfQkxBQ0tfTEVWRUxfTEVOLAotCQlWMzJfQkxBQ0tfTEVWRUxfT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfREVNVVhfVVBEQVRFLCBWMzJfREVNVVhfTEVOLCBWMzJfREVNVVhfT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfRk9WX1VQREFURSwgVjMyX0ZPVl9MRU4sIFYzMl9GT1ZfT0ZGLCAweEZGfSwKLS8qMzUqLwl7VkZFX0NNRF9NQUlOX1NDQUxFUl9VUERBVEUsIFYzMl9NQUlOX1NDQUxFUl9MRU4sIFYzMl9NQUlOX1NDQUxFUl9PRkYsCi0JCTB4RkZ9LAotCQl7VkZFX0NNRF9XQl9VUERBVEUsIFYzMl9XQl9MRU4sIFYzMl9XQl9PRkYsIDB4RkZ9LAotCQl7VkZFX0NNRF9DT0xPUl9DT1JfVVBEQVRFLCBWMzJfQ09MT1JfQ09SX0xFTiwgVjMyX0NPTE9SX0NPUl9PRkYsCi0JCTB4RkZ9LAotCQl7VkZFX0NNRF9SR0JfR19VUERBVEUsIFYzMl9SR0JfR19MRU4sIFYzMl9DSFJPTUFfRU5fT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfTEFfVVBEQVRFLCBWMzJfTEFfTEVOLCBWMzJfTEFfT0ZGLCAweEZGIH0sCi0vKjQwKi8Je1ZGRV9DTURfQ0hST01BX0VOX1VQREFURSwgVjMyX0NIUk9NQV9FTl9MRU4sIFYzMl9DSFJPTUFfRU5fT0ZGLAotCQkweEZGfSwKLQkJe1ZGRV9DTURfQ0hST01BX1NVUF9VUERBVEUsIFYzMl9DSFJPTUFfU1VQX0xFTiwKLQkJVjMyX0NIUk9NQV9TVVBfT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfTUNFX1VQREFURSwgVjMyX01DRV9MRU4sIFYzMl9NQ0VfT0ZGLCAweEZGfSwKLQkJe1ZGRV9DTURfU0tfRU5IQU5fVVBEQVRFLCBWMzJfU0NFX0xFTiwgVjMyX1NDRV9PRkYsIDB4RkZ9LAotCQl7VkZFX0NNRF9TMkNiQ3JfVVBEQVRFLCBWMzJfUzJDYkNyX0xFTiwgVjMyX1MyQ2JDcl9PRkYsIDB4RkZ9LAotLyo0NSovCXtWRkVfQ01EX1MyWV9VUERBVEUsIFYzMl9TMllfTEVOLCBWMzJfUzJZX09GRiwgMHhGRn0sCi0JCXtWRkVfQ01EX0FTRl9VUERBVEUsIFYzMl9BU0ZfVVBEQVRFX0xFTiwgVjMyX0FTRl9PRkYsIDB4RkZ9LAotCQl7VkZFX0NNRF9GUkFNRV9TS0lQX1VQREFURX0sCi0JCXtWRkVfQ01EX0NBTUlGX0ZSQU1FX1VQREFURX0sCi0JCXtWRkVfQ01EX1NUQVRTX0FGX1VQREFURSwgVjMyX1NUQVRTX0FGX0xFTiwgVjMyX1NUQVRTX0FGX09GRn0sCi0vKjUwKi8Je1ZGRV9DTURfU1RBVFNfQUVfVVBEQVRFLCBWMzJfU1RBVFNfQUVfTEVOLCBWMzJfU1RBVFNfQUVfT0ZGfSwKLQkJe1ZGRV9DTURfU1RBVFNfQVdCX1VQREFURSwgVjMyX1NUQVRTX0FXQl9MRU4sCi0JCVYzMl9TVEFUU19BV0JfT0ZGfSwKLQkJe1ZGRV9DTURfU1RBVFNfUlNfVVBEQVRFLCBWMzJfU1RBVFNfUlNfTEVOLCBWMzJfU1RBVFNfUlNfT0ZGfSwKLQkJe1ZGRV9DTURfU1RBVFNfQ1NfVVBEQVRFLCBWMzJfU1RBVFNfQ1NfTEVOLCBWMzJfU1RBVFNfQ1NfT0ZGfSwKLQkJe1ZGRV9DTURfU1RBVFNfU0tJTl9VUERBVEV9LAotLyo1NSovCXtWRkVfQ01EX1NUQVRTX0lISVNUX1VQREFURSwgVjMyX1NUQVRTX0lISVNUX0xFTiwgVjMyX1NUQVRTX0lISVNUX09GRn0sCi0JCXtWRkVfQ01EX0RVTU1ZXzR9LAotCQl7VkZFX0NNRF9FUE9DSDFfQUNLfSwKLQkJe1ZGRV9DTURfRVBPQ0gyX0FDS30sCi0JCXtWRkVfQ01EX1NUQVJUX1JFQ09SRElOR30sCi0vKjYwKi8Je1ZGRV9DTURfU1RPUF9SRUNPUkRJTkd9LAotCQl7VkZFX0NNRF9EVU1NWV81fSwKLQkJe1ZGRV9DTURfRFVNTVlfNn0sCi0JCXtWRkVfQ01EX0NBUFRVUkUsIFYzMl9DQVBUVVJFX0xFTiwgMHhGRn0sCi0JCXtWRkVfQ01EX0RVTU1ZXzd9LAotLyo2NSovCXtWRkVfQ01EX1NUT1B9LAotCQl7VkZFX0NNRF9HRVRfSFdfVkVSU0lPTiwgVjMyX0dFVF9IV19WRVJTSU9OX0xFTiwKLQkJVjMyX0dFVF9IV19WRVJTSU9OX09GRn0sCi0JCXtWRkVfQ01EX0dFVF9GUkFNRV9TS0lQX0NPVU5UU30sCi0JCXtWRkVfQ01EX09VVFBVVDFfQlVGRkVSX0VOUX0sCi0JCXtWRkVfQ01EX09VVFBVVDJfQlVGRkVSX0VOUX0sCi0vKjcwKi8Je1ZGRV9DTURfT1VUUFVUM19CVUZGRVJfRU5RfSwKLQkJe1ZGRV9DTURfSlBFR19PVVRfQlVGX0VOUX0sCi0JCXtWRkVfQ01EX1JBV19PVVRfQlVGX0VOUX0sCi0JCXtWRkVfQ01EX1JBV19JTl9CVUZfRU5RfSwKLQkJe1ZGRV9DTURfU1RBVFNfQUZfRU5RfSwKLS8qNzUqLwl7VkZFX0NNRF9TVEFUU19BRV9FTlF9LAotCQl7VkZFX0NNRF9TVEFUU19BV0JfRU5RfSwKLQkJe1ZGRV9DTURfU1RBVFNfUlNfRU5RfSwKLQkJe1ZGRV9DTURfU1RBVFNfQ1NfRU5RfSwKLQkJe1ZGRV9DTURfU1RBVFNfU0tJTl9FTlF9LAotLyo4MCovCXtWRkVfQ01EX1NUQVRTX0lISVNUX0VOUX0sCi0JCXtWRkVfQ01EX0RVTU1ZXzh9LAotCQl7VkZFX0NNRF9KUEVHX0VOQ19DRkd9LAotCQl7VkZFX0NNRF9EVU1NWV85fSwKLQkJe1ZGRV9DTURfU1RBVFNfQUZfU1RBUlQsIFYzMl9TVEFUU19BRl9MRU4sIFYzMl9TVEFUU19BRl9PRkZ9LAotLyo4NSovCXtWRkVfQ01EX1NUQVRTX0FGX1NUT1B9LAotCQl7VkZFX0NNRF9TVEFUU19BRV9TVEFSVCwgVjMyX1NUQVRTX0FFX0xFTiwgVjMyX1NUQVRTX0FFX09GRn0sCi0JCXtWRkVfQ01EX1NUQVRTX0FFX1NUT1B9LAotCQl7VkZFX0NNRF9TVEFUU19BV0JfU1RBUlQsIFYzMl9TVEFUU19BV0JfTEVOLCBWMzJfU1RBVFNfQVdCX09GRn0sCi0JCXtWRkVfQ01EX1NUQVRTX0FXQl9TVE9QfSwKLS8qOTAqLwl7VkZFX0NNRF9TVEFUU19SU19TVEFSVCwgVjMyX1NUQVRTX1JTX0xFTiwgVjMyX1NUQVRTX1JTX09GRn0sCi0JCXtWRkVfQ01EX1NUQVRTX1JTX1NUT1B9LAotCQl7VkZFX0NNRF9TVEFUU19DU19TVEFSVCwgVjMyX1NUQVRTX0NTX0xFTiwgVjMyX1NUQVRTX0NTX09GRn0sCi0JCXtWRkVfQ01EX1NUQVRTX0NTX1NUT1B9LAotCQl7VkZFX0NNRF9TVEFUU19TS0lOX1NUQVJUfSwKLS8qOTUqLwl7VkZFX0NNRF9TVEFUU19TS0lOX1NUT1B9LAotCQl7VkZFX0NNRF9TVEFUU19JSElTVF9TVEFSVCwKLQkJVjMyX1NUQVRTX0lISVNUX0xFTiwgVjMyX1NUQVRTX0lISVNUX09GRn0sCi0JCXtWRkVfQ01EX1NUQVRTX0lISVNUX1NUT1B9LAotCQl7VkZFX0NNRF9EVU1NWV8xMH0sCi0JCXtWRkVfQ01EX1NZTkNfVElNRVJfU0VUVElORywgVjMyX1NZTkNfVElNRVJfTEVOLAotCQkJVjMyX1NZTkNfVElNRVJfT0ZGfSwKLS8qMTAwKi8Je1ZGRV9DTURfQVNZTkNfVElNRVJfU0VUVElORywgVjMyX0FTWU5DX1RJTUVSX0xFTiwgVjMyX0FTWU5DX1RJTUVSX09GRn0sCi0JCXtWRkVfQ01EX0xJVkVTSE9UfSwKLQkJe1ZGRV9DTURfTEFfU0VUVVB9LAotCQl7VkZFX0NNRF9MSU5FQVJJWkFUSU9OX0NGRywgVjMyX0xJTkVBUklaQVRJT05fTEVOMSwKLQkJCVYzMl9MSU5FQVJJWkFUSU9OX09GRjF9LAotCQl7VkZFX0NNRF9ERU1PU0FJQ1YzfSwKLS8qMTA1Ki8Je1ZGRV9DTURfREVNT1NBSUNWM19BQkNDX0NGR30sCi0JCXtWRkVfQ01EX0RFTU9TQUlDVjNfREJDQ19DRkcsIFYzMl9ERU1PU0FJQ1YzX0RCQ0NfTEVOLAotCQkJVjMyX0RFTU9TQUlDVjNfREJDQ19PRkZ9LAotCQl7VkZFX0NNRF9ERU1PU0FJQ1YzX0RCUENfQ0ZHfSwKLQkJe1ZGRV9DTURfREVNT1NBSUNWM19BQkZfQ0ZHLCBWMzJfREVNT1NBSUNWM19BQkZfTEVOLAotCQkJVjMyX0RFTU9TQUlDVjNfQUJGX09GRn0sCi0JCXtWRkVfQ01EX0RFTU9TQUlDVjNfQUJDQ19VUERBVEV9LAotLyoxMTAqLwl7VkZFX0NNRF9ERU1PU0FJQ1YzX0RCQ0NfVVBEQVRFLCBWMzJfREVNT1NBSUNWM19EQkNDX0xFTiwKLQkJCVYzMl9ERU1PU0FJQ1YzX0RCQ0NfT0ZGfSwKLQkJe1ZGRV9DTURfREVNT1NBSUNWM19EQlBDX1VQREFURX0sCi0JCXtWRkVfQ01EX1hCQVJfQ0ZHfSwKLQkJe1ZGRV9DTURfTU9EVUxFX0NGRywgVjMyX01PRFVMRV9DRkdfTEVOLCBWMzJfTU9EVUxFX0NGR19PRkZ9LAotCQl7VkZFX0NNRF9aU0x9LAotLyoxMTUqLwl7VkZFX0NNRF9MSU5FQVJJWkFUSU9OX1VQREFURSwgVjMyX0xJTkVBUklaQVRJT05fTEVOMSwKLQkJCVYzMl9MSU5FQVJJWkFUSU9OX09GRjF9LAotCQl7VkZFX0NNRF9ERU1PU0FJQ1YzX0FCRl9VUERBVEUsIFYzMl9ERU1PU0FJQ1YzX0FCRl9MRU4sCi0JCQlWMzJfREVNT1NBSUNWM19BQkZfT0ZGfSwKLQkJe1ZGRV9DTURfQ0xGX0NGRywgVjMyX0NMRl9DRkdfTEVOLCBWMzJfQ0xGX0NGR19PRkZ9LAotCQl7VkZFX0NNRF9DTEZfTFVNQV9VUERBVEUsIFYzMl9DTEZfTFVNQV9VUERBVEVfTEVOLAotCQkJVjMyX0NMRl9MVU1BX1VQREFURV9PRkZ9LAotCQl7VkZFX0NNRF9DTEZfQ0hST01BX1VQREFURSwgVjMyX0NMRl9DSFJPTUFfVVBEQVRFX0xFTiwKLQkJCVYzMl9DTEZfQ0hST01BX1VQREFURV9PRkZ9LAotLyoxMjAqLyB7VkZFX0NNRF9QQ0FfUk9MTF9PRkZfQ0ZHfSwKLQkJe1ZGRV9DTURfUENBX1JPTExfT0ZGX1VQREFURX0sCi0JCXtWRkVfQ01EX0dFVF9SRUdfRFVNUH0sCi0JCXtWRkVfQ01EX0dFVF9MSU5FQVJJWkFUT05fVEFCTEV9LAotCQl7VkZFX0NNRF9HRVRfTUVTSF9ST0xMT0ZGX1RBQkxFfSwKLS8qMTI1Ki8ge1ZGRV9DTURfR0VUX1BDQV9ST0xMT0ZGX1RBQkxFfSwKLQkJe1ZGRV9DTURfR0VUX1JHQl9HX1RBQkxFfSwKLQkJe1ZGRV9DTURfR0VUX0xBX1RBQkxFfSwKLQkJe1ZGRV9DTURfREVNT1NBSUNWM19VUERBVEV9LAotCQl7VkZFX0NNRF9BQ1RJVkVfUkVHSU9OX0NGR30sCi0vKjEzMCovIHtWRkVfQ01EX0NPTE9SX1BST0NFU1NJTkdfQ09ORklHfSwKLQkJe1ZGRV9DTURfU1RBVFNfV0JfQUVDX0NPTkZJR30sCi0JCXtWRkVfQ01EX1NUQVRTX1dCX0FFQ19VUERBVEV9LAotCQl7VkZFX0NNRF9ZX0dBTU1BX0NPTkZJR30sCi0JCXtWRkVfQ01EX1NDQUxFX09VVFBVVDFfQ09ORklHfSwKLS8qMTM1Ki8ge1ZGRV9DTURfU0NBTEVfT1VUUFVUMl9DT05GSUd9LAotCQl7VkZFX0NNRF9DQVBUVVJFX1JBV30sCi0JCXtWRkVfQ01EX1NUT1BfTElWRVNIT1R9LAotCQl7VkZFX0NNRF9SRUNPTkZJR19WRkV9LAotCQl7VkZFX0NNRF9TVEFUU19SRVFCVUZ9LAotLyoxNDAqLwl7VkZFX0NNRF9TVEFUU19FTlFVRVVFQlVGfSwKLQkJe1ZGRV9DTURfU1RBVFNfRkxVU0hfQlVGUX0sCi0JCXtWRkVfQ01EX1NUQVRTX1VOUkVHQlVGfSwKLQkJe1ZGRV9DTURfU1RBVFNfQkdfU1RBUlQsIFYzMl9TVEFUU19CR19MRU4sIFYzMl9TVEFUU19CR19PRkZ9LAotCQl7VkZFX0NNRF9TVEFUU19CR19TVE9QfSwKLQkJe1ZGRV9DTURfU1RBVFNfQkZfU1RBUlQsIFYzMl9TVEFUU19CRl9MRU4sIFYzMl9TVEFUU19CRl9PRkZ9LAotLyoxNDUqLyB7VkZFX0NNRF9TVEFUU19CRl9TVE9QfSwKLQkJe1ZGRV9DTURfU1RBVFNfQkhJU1RfU1RBUlQsIFYzMl9TVEFUU19CSElTVF9MRU4sCi0JCQlWMzJfU1RBVFNfQkhJU1RfT0ZGfSwKLS8qMTQ3Ki8Je1ZGRV9DTURfU1RBVFNfQkhJU1RfU1RPUH0sCi19OwotCi11aW50MzJfdCB2ZmUzMl9BWElfV01fQ0ZHW10gPSB7Ci0JMHgwMDAwMDA0QywKLQkweDAwMDAwMDY0LAotCTB4MDAwMDAwN0MsCi0JMHgwMDAwMDA5NCwKLQkweDAwMDAwMEFDLAotCTB4MDAwMDAwQzQsCi0JMHgwMDAwMDBEQywKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmZlMzJfZ2VuZXJhbF9jbWRbXSA9IHsKLQkiRFVNTVlfMCIsICAvKiAwICovCi0JIlNFVF9DTEsiLAotCSJSRVNFVCIsCi0JIlNUQVJUIiwKLQkiVEVTVF9HRU5fU1RBUlQiLAotCSJPUEVSQVRJT05fQ0ZHIiwgIC8qIDUgKi8KLQkiQVhJX09VVF9DRkciLAotCSJDQU1JRl9DRkciLAotCSJBWElfSU5QVVRfQ0ZHIiwKLQkiQkxBQ0tfTEVWRUxfQ0ZHIiwKLQkiUk9MTF9PRkZfQ0ZHIiwgIC8qIDEwICovCi0JIkRFTVVYX0NGRyIsCi0JIkZPVl9DRkciLAotCSJNQUlOX1NDQUxFUl9DRkciLAotCSJXQl9DRkciLAotCSJDT0xPUl9DT1JfQ0ZHIiwgLyogMTUgKi8KLQkiUkdCX0dfQ0ZHIiwKLQkiTEFfQ0ZHIiwKLQkiQ0hST01BX0VOX0NGRyIsCi0JIkNIUk9NQV9TVVBfQ0ZHIiwKLQkiTUNFX0NGRyIsIC8qIDIwICovCi0JIlNLX0VOSEFOX0NGRyIsCi0JIkFTRl9DRkciLAotCSJTMllfQ0ZHIiwKLQkiUzJDYkNyX0NGRyIsCi0JIkNIUk9NQV9TVUJTX0NGRyIsICAvKiAyNSAqLwotCSJPVVRfQ0xBTVBfQ0ZHIiwKLQkiRlJBTUVfU0tJUF9DRkciLAotCSJEVU1NWV8xIiwKLQkiRFVNTVlfMiIsCi0JIkRVTU1ZXzMiLCAgLyogMzAgKi8KLQkiVVBEQVRFIiwKLQkiQkxfTFZMX1VQREFURSIsCi0JIkRFTVVYX1VQREFURSIsCi0JIkZPVl9VUERBVEUiLAotCSJNQUlOX1NDQUxFUl9VUERBVEUiLCAgLyogMzUgKi8KLQkiV0JfVVBEQVRFIiwKLQkiQ09MT1JfQ09SX1VQREFURSIsCi0JIlJHQl9HX1VQREFURSIsCi0JIkxBX1VQREFURSIsCi0JIkNIUk9NQV9FTl9VUERBVEUiLCAgLyogNDAgKi8KLQkiQ0hST01BX1NVUF9VUERBVEUiLAotCSJNQ0VfVVBEQVRFIiwKLQkiU0tfRU5IQU5fVVBEQVRFIiwKLQkiUzJDYkNyX1VQREFURSIsCi0JIlMyWV9VUERBVEUiLCAgLyogNDUgKi8KLQkiQVNGX1VQREFURSIsCi0JIkZSQU1FX1NLSVBfVVBEQVRFIiwKLQkiQ0FNSUZfRlJBTUVfVVBEQVRFIiwKLQkiU1RBVFNfQUZfVVBEQVRFIiwKLQkiU1RBVFNfQUVfVVBEQVRFIiwgIC8qIDUwICovCi0JIlNUQVRTX0FXQl9VUERBVEUiLAotCSJTVEFUU19SU19VUERBVEUiLAotCSJTVEFUU19DU19VUERBVEUiLAotCSJTVEFUU19TS0lOX1VQREFURSIsCi0JIlNUQVRTX0lISVNUX1VQREFURSIsICAvKiA1NSAqLwotCSJEVU1NWV80IiwKLQkiRVBPQ0gxX0FDSyIsCi0JIkVQT0NIMl9BQ0siLAotCSJTVEFSVF9SRUNPUkRJTkciLAotCSJTVE9QX1JFQ09SRElORyIsICAvKiA2MCAqLwotCSJEVU1NWV81IiwKLQkiRFVNTVlfNiIsCi0JIkNBUFRVUkUiLAotCSJEVU1NWV83IiwKLQkiU1RPUCIsICAvKiA2NSAqLwotCSJHRVRfSFdfVkVSU0lPTiIsCi0JIkdFVF9GUkFNRV9TS0lQX0NPVU5UUyIsCi0JIk9VVFBVVDFfQlVGRkVSX0VOUSIsCi0JIk9VVFBVVDJfQlVGRkVSX0VOUSIsCi0JIk9VVFBVVDNfQlVGRkVSX0VOUSIsICAvKiA3MCAqLwotCSJKUEVHX09VVF9CVUZfRU5RIiwKLQkiUkFXX09VVF9CVUZfRU5RIiwKLQkiUkFXX0lOX0JVRl9FTlEiLAotCSJTVEFUU19BRl9FTlEiLAotCSJTVEFUU19BRV9FTlEiLCAgLyogNzUgKi8KLQkiU1RBVFNfQVdCX0VOUSIsCi0JIlNUQVRTX1JTX0VOUSIsCi0JIlNUQVRTX0NTX0VOUSIsCi0JIlNUQVRTX1NLSU5fRU5RIiwKLQkiU1RBVFNfSUhJU1RfRU5RIiwgIC8qIDgwICovCi0JIkRVTU1ZXzgiLAotCSJKUEVHX0VOQ19DRkciLAotCSJEVU1NWV85IiwKLQkiU1RBVFNfQUZfU1RBUlQiLAotCSJTVEFUU19BRl9TVE9QIiwgIC8qIDg1ICovCi0JIlNUQVRTX0FFX1NUQVJUIiwKLQkiU1RBVFNfQUVfU1RPUCIsCi0JIlNUQVRTX0FXQl9TVEFSVCIsCi0JIlNUQVRTX0FXQl9TVE9QIiwKLQkiU1RBVFNfUlNfU1RBUlQiLCAgLyogOTAgKi8KLQkiU1RBVFNfUlNfU1RPUCIsCi0JIlNUQVRTX0NTX1NUQVJUIiwKLQkiU1RBVFNfQ1NfU1RPUCIsCi0JIlNUQVRTX1NLSU5fU1RBUlQiLAotCSJTVEFUU19TS0lOX1NUT1AiLCAgLyogOTUgKi8KLQkiU1RBVFNfSUhJU1RfU1RBUlQiLAotCSJTVEFUU19JSElTVF9TVE9QIiwKLQkiRFVNTVlfMTAiLAotCSJTWU5DX1RJTUVSX1NFVFRJTkciLAotCSJBU1lOQ19USU1FUl9TRVRUSU5HIiwgIC8qIDEwMCAqLwotCSJMSVZFU0hPVCIsCi0JIkxBX1NFVFVQIiwKLQkiTElORUFSSVpBVElPTl9DRkciLAotCSJERU1PU0FJQ1YzIiwKLQkiREVNT1NBSUNWM19BQkNDX0NGRyIsIC8qIDEwNSAqLwotCSJERU1PU0FJQ1YzX0RCQ0NfQ0ZHIiwKLQkiREVNT1NBSUNWM19EQlBDX0NGRyIsCi0JIkRFTU9TQUlDVjNfQUJGX0NGRyIsCi0JIkRFTU9TQUlDVjNfQUJDQ19VUERBVEUiLAotCSJERU1PU0FJQ1YzX0RCQ0NfVVBEQVRFIiwgLyogMTEwICovCi0JIkRFTU9TQUlDVjNfREJQQ19VUERBVEUiLAotCSJYQkFSX0NGRyIsCi0JIkVaVFVORV9DRkciLAotCSJWMzJfWlNMIiwKLQkiTElORUFSSVpBVElPTl9VUERBVEUiLCAvKjExNSovCi0JIkRFTU9TQUlDVjNfQUJGX1VQREFURSIsCi0JIkNMRl9DRkciLAotCSJDTEZfTFVNQV9VUERBVEUiLAotCSJDTEZfQ0hST01BX1VQREFURSIsCi0JIlBDQV9ST0xMX09GRl9DRkciLCAvKjEyMCovCi0JIlBDQV9ST0xMX09GRl9VUERBVEUiLAotCSJHRVRfUkVHX0RVTVAiLAotCSJHRVRfTElORUFSSVpBVE9OX1RBQkxFIiwKLQkiR0VUX01FU0hfUk9MTE9GRl9UQUJMRSIsCi0JIkdFVF9QQ0FfUk9MTE9GRl9UQUJMRSIsIC8qMTI1Ki8KLQkiR0VUX1JHQl9HX1RBQkxFIiwKLQkiR0VUX0xBX1RBQkxFIiwKLQkiREVNT1NBSUNWM19VUERBVEUiLAotCSJEVU1NWV8xMSIsCi0JIkRVTU1ZXzEyIiwgLyoxMzAqLwotCSJEVU1NWV8xMyIsCi0JIkRVTU1ZXzE0IiwKLQkiRFVNTVlfMTUiLAotCSJEVU1NWV8xNiIsCi0JIkRVTU1ZXzE3IiwgLyoxMzUqLwotCSJEVU1NWV8xOCIsCi0JIkRVTU1ZXzE5IiwKLQkiRFVNTVlfMjAiLAotCSJTVEFUU19SRVFCVUYiLAotCSJTVEFUU19FTlFVRVVFQlVGIiwgLyoxNDAqLwotCSJTVEFUU19GTFVTSF9CVUZRIiwKLQkiU1RBVFNfVU5SRUdCVUYiLAotCSJTVEFUU19CR19TVEFSVCIsCi0JIlNUQVRTX0JHX1NUT1AiLAotCSJTVEFUU19CRl9TVEFSVCIsIC8qMTQ1Ki8KLQkiU1RBVFNfQkZfU1RPUCIsCi0JIlNUQVRTX0JISVNUX1NUQVJUIiwKLQkiU1RBVFNfQkhJU1RfU1RPUCIsCi0JIlJFU0VUXzIiLAotfTsKLQotdWludDhfdCB2ZmUzMl91c2VfYmF5ZXJfc3RhdHMoc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQlpZiAodmZlMzJfY3RybC0+dmVyX251bS5tYWluID49IDQpIHsKLQkJLyogVkZFIDQgb3IgYWJvdmUgdXNlcyBiYXllciBzdGF0cyAqLwotCQlyZXR1cm4gVFJVRTsKLQl9IGVsc2UgewotCQlyZXR1cm4gRkFMU0U7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBheGlfZW5hYmxlX3dtX2lycShzdHJ1Y3QgdmZlX3NoYXJlX2N0cmxfdCAqc2hhcmVfY3RybCkKLXsKLQl1aW50MzJfdCBpcnFfbWFzaywgaXJxX2NvbXBfbWFzayA9IDA7Ci0JdWludDE2X3QgdmZlX291dHB1dF9tb2RlID0KLQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCQl+KFZGRTMyX09VVFBVVF9NT0RFX1RFUlRJQVJZMXwKLQkJCVZGRTMyX09VVFBVVF9NT0RFX1RFUlRJQVJZMik7Ci0KLQlpZiAodmZlX291dHB1dF9tb2RlKQotCQlpcnFfY29tcF9tYXNrID0KLQkJbXNtX2NhbWVyYV9pb19yKHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0lSUV9DT01QX01BU0spOwotCWlycV9tYXNrID0gbXNtX2NhbWVyYV9pb19yKHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCVZGRV9JUlFfTUFTS18wKTsKLQotCWlmIChzaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTMyX09VVFBVVF9NT0RFX1BSSU1BUlkpIHsKLQkJaWYgKHNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSA9PSBWRkVfT1VUUFVUU19SQVcpCi0JCQlpcnFfY29tcF9tYXNrIHw9ICgKLQkJCQkweDEgPDwgc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMCk7Ci0JCWVsc2UKLQkJCWlycV9jb21wX21hc2sgfD0gKAotCQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwIHwKLQkJCQkweDEgPDwgc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMSk7Ci0JCWlycV9tYXNrIHw9IFZGRV9JUlFfU1RBVFVTMF9JTUFHRV9DT01QT1NJVF9ET05FMF9NQVNLOwotCX0gZWxzZSBpZiAoc2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCQkgICBWRkUzMl9PVVRQVVRfTU9ERV9QUklNQVJZX0FMTF9DSE5MUykgewotCQlpcnFfY29tcF9tYXNrIHw9ICgKLQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwIHwKLQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxIHwKLQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gyKTsKLQkJaXJxX21hc2sgfD0gVkZFX0lSUV9TVEFUVVMwX0lNQUdFX0NPTVBPU0lUX0RPTkUwX01BU0s7Ci0JfQotCWlmIChzaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTMyX09VVFBVVF9NT0RFX1NFQ09OREFSWSkgewotCQlpcnFfY29tcF9tYXNrIHw9ICgKLQkJCTB4MSA8PCAoc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMCArIDgpIHwKLQkJCTB4MSA8PCAoc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSArIDgpKTsKLQkJaXJxX21hc2sgfD0gVkZFX0lSUV9TVEFUVVMwX0lNQUdFX0NPTVBPU0lUX0RPTkUxX01BU0s7Ci0JfSBlbHNlIGlmIChzaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTMyX09VVFBVVF9NT0RFX1NFQ09OREFSWV9BTExfQ0hOTFMpIHsKLQkJaXJxX2NvbXBfbWFzayB8PSAoCi0JCQkweDEgPDwgKHNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDAgKyA4KSB8Ci0JCQkweDEgPDwgKHNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDEgKyA4KSB8Ci0JCQkweDEgPDwgKHNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDIgKyA4KSk7Ci0JCWlycV9tYXNrIHw9IFZGRV9JUlFfU1RBVFVTMF9JTUFHRV9DT01QT1NJVF9ET05FMV9NQVNLOwotCX0KLQotCWlmIChzaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkxKSB7Ci0JCWlycV9tYXNrIHw9ICgweDEgPDwgKHNoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5jaDAgKwotCQkJVkZFX1dNX09GRlNFVCkpOwotCX0KLQotCWlmIChzaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkyKSB7Ci0JCWlycV9tYXNrIHw9ICgweDEgPDwgKHNoYXJlX2N0cmwtPm91dHBhdGgub3V0My5jaDAgKwotCQkJVkZFX1dNX09GRlNFVCkpOwotCX0KLQotCW1zbV9jYW1lcmFfaW9fdyhpcnFfbWFzaywgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfSVJRX01BU0tfMCk7Ci0JaWYgKHZmZV9vdXRwdXRfbW9kZSkKLQkJbXNtX2NhbWVyYV9pb193KGlycV9jb21wX21hc2ssCi0JCQlzaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DT01QX01BU0spOwotfQotCi1zdGF0aWMgdm9pZCBheGlfZGlzYWJsZV93bV9pcnEoc3RydWN0IHZmZV9zaGFyZV9jdHJsX3QgKnNoYXJlX2N0cmwsCi0JdWludDE2X3Qgb3V0cHV0X21vZGUpCi17Ci0JdWludDMyX3QgaXJxX21hc2ssIGlycV9jb21wX21hc2sgPSAwOwotCXVpbnQxNl90IHZmZV9vdXRwdXRfbW9kZSA9Ci0JCW91dHB1dF9tb2RlICYKLQkJCX4oVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkxfAotCQkJVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkyKTsKLQlpZiAodmZlX291dHB1dF9tb2RlKQotCQlpcnFfY29tcF9tYXNrID0KLQkJbXNtX2NhbWVyYV9pb19yKHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0lSUV9DT01QX01BU0spOwotCWlycV9tYXNrID0gbXNtX2NhbWVyYV9pb19yKHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCVZGRV9JUlFfTUFTS18wKTsKLQotCWlmIChvdXRwdXRfbW9kZSAmCi0JCQlWRkUzMl9PVVRQVVRfTU9ERV9QUklNQVJZKSB7Ci0JCWlycV9jb21wX21hc2sgJj0gfigKLQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwIHwKLQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxKTsKLQkJaXJxX21hc2sgJj0gflZGRV9JUlFfU1RBVFVTMF9JTUFHRV9DT01QT1NJVF9ET05FMF9NQVNLOwotCX0gZWxzZSBpZiAob3V0cHV0X21vZGUgJgotCQkJICAgVkZFMzJfT1VUUFVUX01PREVfUFJJTUFSWV9BTExfQ0hOTFMpIHsKLQkJaXJxX2NvbXBfbWFzayAmPSB+KAotCQkJMHgxIDw8IHNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDAgfAotCQkJMHgxIDw8IHNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDEgfAotCQkJMHgxIDw8IHNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDIpOwotCQlpcnFfbWFzayAmPSB+VkZFX0lSUV9TVEFUVVMwX0lNQUdFX0NPTVBPU0lUX0RPTkUwX01BU0s7Ci0JfQotCWlmIChvdXRwdXRfbW9kZSAmCi0JCQlWRkUzMl9PVVRQVVRfTU9ERV9TRUNPTkRBUlkpIHsKLQkJaXJxX2NvbXBfbWFzayAmPSB+KAotCQkJMHgxIDw8IChzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwICsgOCkgfAotCQkJMHgxIDw8IChzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxICsgOCkpOwotCQlpcnFfbWFzayAmPSB+VkZFX0lSUV9TVEFUVVMwX0lNQUdFX0NPTVBPU0lUX0RPTkUxX01BU0s7Ci0JfSBlbHNlIGlmIChvdXRwdXRfbW9kZSAmCi0JCQlWRkUzMl9PVVRQVVRfTU9ERV9TRUNPTkRBUllfQUxMX0NITkxTKSB7Ci0JCWlycV9jb21wX21hc2sgJj0gfigKLQkJCTB4MSA8PCAoc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMCArIDgpIHwKLQkJCTB4MSA8PCAoc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSArIDgpIHwKLQkJCTB4MSA8PCAoc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMiArIDgpKTsKLQkJaXJxX21hc2sgJj0gflZGRV9JUlFfU1RBVFVTMF9JTUFHRV9DT01QT1NJVF9ET05FMV9NQVNLOwotCX0KLQlpZiAob3V0cHV0X21vZGUgJgotCQkJVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkxKSB7Ci0JCQlpcnFfbWFzayAmPSB+KDB4MSA8PCAoc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmNoMCArCi0JCQkJVkZFX1dNX09GRlNFVCkpOwotCX0KLQlpZiAob3V0cHV0X21vZGUgJgotCQlWRkUzMl9PVVRQVVRfTU9ERV9URVJUSUFSWTIpIHsKLQkJaXJxX21hc2sgJj0gfigweDEgPDwgKHNoYXJlX2N0cmwtPm91dHBhdGgub3V0My5jaDAgKwotCQkJVkZFX1dNX09GRlNFVCkpOwotCX0KLQltc21fY2FtZXJhX2lvX3coaXJxX21hc2ssIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCVZGRV9JUlFfTUFTS18wKTsKLQlpZiAodmZlX291dHB1dF9tb2RlKQotCQltc21fY2FtZXJhX2lvX3coaXJxX2NvbXBfbWFzaywKLQkJCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NPTVBfTUFTSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF4aV9lbmFibGVfaXJxKHN0cnVjdCB2ZmVfc2hhcmVfY3RybF90ICpzaGFyZV9jdHJsKQotewotCXVpbnQzMl90IGlycV9tYXNrLCBpcnFfbWFzazE7Ci0JdWludDMyX3QgdmZlX21vZGUgPQotCQlzaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgJiB+KFZGRV9PVVRQVVRTX1JESTB8Ci0JCQlWRkVfT1VUUFVUU19SREkxKTsKLQotCWlmIChzaGFyZV9jdHJsLT5heGlfcmVmX2NudCA9PSAxKSB7Ci0JCWlycV9tYXNrMSA9Ci0JCQltc21fY2FtZXJhX2lvX3Ioc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX0lSUV9NQVNLXzEpOwotCi0JCWlycV9tYXNrMSB8PSBWRkVfSU1BU0tfV0hJTEVfU1RPUFBJTkdfMTsKLQkJCW1zbV9jYW1lcmFfaW9fdyhpcnFfbWFzazEsIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCVZGRV9JUlFfTUFTS18xKTsKLQl9Ci0KLQlpZiAoc2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYgKFZGRV9PVVRQVVRTX1JESTB8VkZFX09VVFBVVFNfUkRJMSkpIHsKLQkJaXJxX21hc2sxID0KLQkJCW1zbV9jYW1lcmFfaW9fcihzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQlWRkVfSVJRX01BU0tfMSk7Ci0KLQkJaWYgKHNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmIFZGRV9PVVRQVVRTX1JESTApCi0JCQlpcnFfbWFzazEgfD0gVkZFX0lSUV9TVEFUVVMxX1JESTBfUkVHX1VQREFURV9NQVNLOwotCi0JCWlmIChzaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgJiBWRkVfT1VUUFVUU19SREkxKQotCQkJaXJxX21hc2sxIHw9IFZGRV9JUlFfU1RBVFVTMV9SREkxX1JFR19VUERBVEVfTUFTSzsKLQotCQltc21fY2FtZXJhX2lvX3coaXJxX21hc2sxLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9JUlFfTUFTS18xKTsKLQl9Ci0KLQlpZiAodmZlX21vZGUpIHsKLQkJaXJxX21hc2sgPQotCQltc21fY2FtZXJhX2lvX3Ioc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfSVJRX01BU0tfMCk7Ci0JCWlycV9tYXNrIHw9IDB4MDAwMDAwMjE7Ci0JCWlmIChzaGFyZV9jdHJsLT5zdGF0c19jb21wKQotCQkJaXJxX21hc2sgfD0gVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0NPTVBPU0lUX01BU0s7Ci0JCWVsc2UKLQkJCWlycV9tYXNrIHw9IDB4MDAwRkUwMDA7Ci0JCW1zbV9jYW1lcmFfaW9fdyhpcnFfbWFzaywgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfSVJRX01BU0tfMCk7Ci0JCWF0b21pY19zZXQoJnNoYXJlX2N0cmwtPnZzdGF0ZSwgMSk7Ci0JfQotCWF0b21pY19zZXQoJnNoYXJlX2N0cmwtPmhhbmRsZV9jb21tb25faXJxLCAxKTsKLX0KLQotc3RhdGljIHZvaWQgYXhpX2NsZWFyX2FsbF9pbnRlcnJ1cHRzKHN0cnVjdCB2ZmVfc2hhcmVfY3RybF90ICpzaGFyZV9jdHJsKQotewotCWF0b21pY19zZXQoJnNoYXJlX2N0cmwtPmhhbmRsZV9jb21tb25faXJxLCAwKTsKLQltc21fY2FtZXJhX2lvX3coVkZFX0RJU0FCTEVfQUxMX0lSUVMsCi0JCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX01BU0tfMCk7Ci0JbXNtX2NhbWVyYV9pb193KFZGRV9ESVNBQkxFX0FMTF9JUlFTLAotCQlzaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9NQVNLXzEpOwotCi0JLyogY2xlYXIgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyovCi0JbXNtX2NhbWVyYV9pb193KFZGRV9DTEVBUl9BTExfSVJRUywKLQkJc2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ0xFQVJfMCk7Ci0JbXNtX2NhbWVyYV9pb193KFZGRV9DTEVBUl9BTExfSVJRUywKLQkJc2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ0xFQVJfMSk7Ci0JLyogRW5zdXJlIHRoZSB3cml0ZSBvcmRlciB3aGlsZSB3cml0aW5nCi0JKnRvIHRoZSBjb21tYW5kIHJlZ2lzdGVyIHVzaW5nIHRoZSBiYXJyaWVyICovCi0JbXNtX2NhbWVyYV9pb193X21iKDEsCi0JCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NNRCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF4aV9kaXNhYmxlX2lycShzdHJ1Y3QgdmZlX3NoYXJlX2N0cmxfdCAqc2hhcmVfY3RybCwKLQl1aW50MzJfdCBtb2RlKQotewotCi0JLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cy4gICovCi0KLQl1aW50MzJfdCBpcnFfbWFzayA9IDAsIGlycV9tYXNrMSA9IDAsIGNsZWFyX21hc2sxID0gMDsKLQl1aW50MzJfdCB2ZmVfbW9kZSA9Ci0JCShtb2RlICYgfihWRkVfT1VUUFVUU19SREkwfAotCQkJVkZFX09VVFBVVFNfUkRJMSkpOwotCi0JaWYgKG1vZGUgJiAoVkZFX09VVFBVVFNfUkRJMHxWRkVfT1VUUFVUU19SREkxKSkgewotCQlpcnFfbWFzazEgPQotCQkJbXNtX2NhbWVyYV9pb19yKHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCVZGRV9JUlFfTUFTS18xKTsKLQotCQlpZiAobW9kZSAmIFZGRV9PVVRQVVRTX1JESTApIHsKLQkJCWlycV9tYXNrMSAmPSB+KFZGRV9JUlFfU1RBVFVTMV9SREkwX1JFR19VUERBVEVfTUFTSyk7Ci0JCQljbGVhcl9tYXNrMSB8PSBWRkVfSVJRX1NUQVRVUzFfUkRJMF9SRUdfVVBEQVRFX01BU0s7Ci0JCX0KLQotCQlpZiAobW9kZSAmIFZGRV9PVVRQVVRTX1JESTEpIHsKLQkJCWlycV9tYXNrMSAmPSB+KFZGRV9JUlFfU1RBVFVTMV9SREkxX1JFR19VUERBVEVfTUFTSyk7Ci0JCQljbGVhcl9tYXNrMSB8PSBWRkVfSVJRX1NUQVRVUzFfUkRJMV9SRUdfVVBEQVRFX01BU0s7Ci0JCX0KLQotCQltc21fY2FtZXJhX2lvX3coaXJxX21hc2sxLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9JUlFfTUFTS18xKTsKLQkJbXNtX2NhbWVyYV9pb193KGNsZWFyX21hc2sxLAotCQkJc2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ0xFQVJfMSk7Ci0JfQotCi0JaWYgKHZmZV9tb2RlKSB7Ci0JCWF0b21pY19zZXQoJnNoYXJlX2N0cmwtPnZzdGF0ZSwgMCk7Ci0JCWlycV9tYXNrID0KLQkJbXNtX2NhbWVyYV9pb19yKHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0lSUV9NQVNLXzApOwotCQlpcnFfbWFzayAmPSB+KDB4MDAwMDAwMjEpOwotCQlpZiAoc2hhcmVfY3RybC0+c3RhdHNfY29tcCkKLQkJCWlycV9tYXNrICY9IH4oVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0NPTVBPU0lUX01BU0spOwotCQllbHNlCi0JCQlpcnFfbWFzayAmPSB+MHgwMDBGRTAwMDsKLQkJbXNtX2NhbWVyYV9pb193KGlycV9tYXNrLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9JUlFfTUFTS18wKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3N0b3Aoc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQotCS8qIGluIGVpdGhlciBjb250aW51b3VzIG9yIHNuYXBzaG90IG1vZGUsIHN0b3AgY29tbWFuZCBjYW4gYmUgaXNzdWVkCi0JICogYXQgYW55IHRpbWUuIHN0b3AgY2FtaWYgaW1tZWRpYXRlbHkuICovCi0JaWYgKCF2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5kdWFsX2VuYWJsZWQpCi0JCW1zbV9jYW1lcmFfaW9fd19tYihDQU1JRl9DT01NQU5EX1NUT1BfSU1NRURJQVRFTFksCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0NBTUlGX0NPTU1BTkQpOwotCWVsc2UKLQkJbXNtX2NhbWVyYV9pb193KENBTUlGX0NPTU1BTkRfU1RPUF9BVF9GUkFNRV9CT1VOREFSWSwKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfQ0FNSUZfQ09NTUFORCk7Ci0JdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJj0KLQkJKFZGRV9PVVRQVVRTX1JESTB8VkZFX09VVFBVVFNfUkRJMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3N1YmRldl9ub3RpZnkoaW50IGlkLCBpbnQgcGF0aCwgdWludDMyX3QgaW5zdF9oYW5kbGUsCi0Jc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHZmZV9zaGFyZV9jdHJsX3QgKnNoYXJlX2N0cmwpCi17Ci0Jc3RydWN0IG1zbV92ZmVfcmVzcCBycDsKLQlzdHJ1Y3QgbXNtX2ZyYW1lX2luZm8gZnJhbWVfaW5mbzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2hhcmVfY3RybC0+c2Rfbm90aWZ5X2xvY2ssIGZsYWdzKTsKLQlDREJHKCJ2ZmUzMl9zdWJkZXZfbm90aWZ5IDogbXNnSWQgPSAlZFxuIiwgaWQpOwotCW1lbXNldCgmcnAsIDAsIHNpemVvZihzdHJ1Y3QgbXNtX3ZmZV9yZXNwKSk7Ci0JcnAuZXZ0X21zZy50eXBlICAgPSBNU01fQ0FNRVJBX01TRzsKLQlmcmFtZV9pbmZvLmluc3RfaGFuZGxlID0gaW5zdF9oYW5kbGU7Ci0JZnJhbWVfaW5mby5wYXRoID0gcGF0aDsKLQlycC5ldnRfbXNnLmRhdGEgPSAmZnJhbWVfaW5mbzsKLQlycC50eXBlCSAgID0gaWQ7Ci0JdjRsMl9zdWJkZXZfbm90aWZ5KHNkLCBOT1RJRllfVkZFX0JVRl9FVlQsICZycCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2hhcmVfY3RybC0+c2Rfbm90aWZ5X2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCB2ZmUzMl9jb25maWdfYXhpKAotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCwgaW50IG1vZGUsIHVpbnQzMl90ICphbykKLXsKLQl1aW50MzJfdCAqY2hfaW5mbzsKLQl1aW50MzJfdCAqYXhpX2NmZyA9IGFvK1YzMl9BWElfQlVTX0ZNVF9PRkY7Ci0JaW50IHZmZV9tb2RlID0gKG1vZGUgJiB+KE9VVFBVVF9URVJUMXxPVVRQVVRfVEVSVDIpKTsKLQl1aW50MzJfdCBidXNfY21kID0gKmF4aV9jZmc7Ci0JaW50IGk7Ci0KLQkvKiBVcGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgd3JpdGUgbWFzdGVycyBmb3IgZWFjaCBvdXRwdXQqLwotCWNoX2luZm8gPSBheGlfY2ZnICsgVjMyX0FYSV9DRkdfTEVOOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwID0gMHgwMDAwRkZGRiAmICpjaF9pbmZvOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxID0KLQkJMHgwMDAwRkZGRiAmICgqY2hfaW5mbysrID4+IDE2KTsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMiA9IDB4MDAwMEZGRkYgJiAqY2hfaW5mbysrOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuaW5zdF9oYW5kbGUgPSAqY2hfaW5mbysrOwotCi0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDAgPSAweDAwMDBGRkZGICYgKmNoX2luZm87Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDEgPQotCQkweDAwMDBGRkZGICYgKCpjaF9pbmZvKysgPj4gMTYpOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gyID0gMHgwMDAwRkZGRiAmICpjaF9pbmZvKys7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5pbnN0X2hhbmRsZSA9ICpjaF9pbmZvKys7Ci0KLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmNoMCA9IDB4MDAwMEZGRkYgJiAqY2hfaW5mbzsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmNoMSA9Ci0JCTB4MDAwMEZGRkYgJiAoKmNoX2luZm8rKyA+PiAxNik7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5jaDIgPSAweDAwMDBGRkZGICYgKmNoX2luZm8rKzsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmluc3RfaGFuZGxlID0gKmNoX2luZm8rKzsKLQotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDMuY2gwID0gMHgwMDAwRkZGRiAmICpjaF9pbmZvOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDMuY2gxID0KLQkJMHgwMDAwRkZGRiAmICgqY2hfaW5mbysrID4+IDE2KTsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQzLmNoMiA9IDB4MDAwMEZGRkYgJiAqY2hfaW5mbysrOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDMuaW5zdF9oYW5kbGUgPSAqY2hfaW5mbysrOwotCi0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgPSAwOwotCi0JaWYgKG1vZGUgJiBPVVRQVVRfVEVSVDEpCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkUzMl9PVVRQVVRfTU9ERV9URVJUSUFSWTE7Ci0JaWYgKG1vZGUgJiBPVVRQVVRfVEVSVDIpCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkUzMl9PVVRQVVRfTU9ERV9URVJUSUFSWTI7Ci0JaWYgKG1vZGUgPT0gT1VUUFVUX1RFUlQxIHx8IG1vZGUgPT0gT1VUUFVUX1RFUlQxCi0JCXx8IG1vZGUgPT0gKE9VVFBVVF9URVJUMXxPVVRQVVRfVEVSVDIpKQotCQkJZ290byBidXNfY2ZnOwotCi0Jc3dpdGNoICh2ZmVfbW9kZSkgewotCWNhc2UgT1VUUFVUX1BSSU06Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkUzMl9PVVRQVVRfTU9ERV9QUklNQVJZOwotCQlicmVhazsKLQljYXNlIE9VVFBVVF9QUklNX0FMTF9DSE5MUzoKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgfD0KLQkJCVZGRTMyX09VVFBVVF9NT0RFX1BSSU1BUllfQUxMX0NITkxTOwotCQlicmVhazsKLQljYXNlIE9VVFBVVF9QUklNfE9VVFBVVF9TRUM6Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkUzMl9PVVRQVVRfTU9ERV9QUklNQVJZOwotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSB8PQotCQkJVkZFMzJfT1VUUFVUX01PREVfU0VDT05EQVJZOwotCQlicmVhazsKLQljYXNlIE9VVFBVVF9QUklNfE9VVFBVVF9TRUNfQUxMX0NITkxTOgotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSB8PQotCQkJVkZFMzJfT1VUUFVUX01PREVfUFJJTUFSWTsKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgfD0KLQkJCVZGRTMyX09VVFBVVF9NT0RFX1NFQ09OREFSWV9BTExfQ0hOTFM7Ci0JCWJyZWFrOwotCWNhc2UgT1VUUFVUX1BSSU1fQUxMX0NITkxTfE9VVFBVVF9TRUM6Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkUzMl9PVVRQVVRfTU9ERV9QUklNQVJZX0FMTF9DSE5MUzsKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgfD0KLQkJCVZGRTMyX09VVFBVVF9NT0RFX1NFQ09OREFSWTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlcyBJbnZhbGlkIEFYSSBtb2RlICVkICIsIF9fZnVuY19fLCBtb2RlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi1idXNfY2ZnOgotCW1zbV9jYW1lcmFfaW9fdygqYW8sIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJVkZFX0JVU19JT19GT1JNQVRfQ0ZHKTsKLQlheGlfY2ZnKys7Ci0JbXNtX2NhbWVyYV9pb19tZW1jcHkoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQl2ZmUzMl9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ub2Zmc2V0LCBheGlfY2ZnLAotCQlWMzJfQVhJX0JVU19DRkdfTEVOKTsKLQlheGlfY2ZnICs9IFYzMl9BWElfQlVTX0NGR19MRU4vNDsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2ZmUzMl9BWElfV01fQ0ZHKTsgaSsrKSB7Ci0JCWF4aV9jZmcgKz0gMzsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSt2ZmUzMl9BWElfV01fQ0ZHW2ldKzEyLAotCQkJCQkJCQlheGlfY2ZnLCAxMik7Ci0JCWF4aV9jZmcgKz0gMzsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGJ1c19jbWQsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJVjMyX0FYSV9CVVNfQ01EX09GRik7Ci0JbXNtX2NhbWVyYV9pb193KCpjaF9pbmZvKyssCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX1BJWEVMX0lGX0NGRyk7Ci0JaWYgKG1zbV9jYW1lcmFfaW9fcihheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVYzMl9HRVRfSFdfVkVSU0lPTl9PRkYpID09Ci0JCVZGRTMzX0hXX05VTUJFUikgewotCQltc21fY2FtZXJhX2lvX3coKmNoX2luZm8rKywKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX1JESTBfQ0ZHKTsKLQkJbXNtX2NhbWVyYV9pb193KCpjaF9pbmZvKyssCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9SREkxX0NGRyk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBheGlfcmVzZXRfaW50ZXJuYWxfdmFyaWFibGVzKAotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCwKLQlzdHJ1Y3QgbXNtX2NhbWVyYV92ZmVfcGFyYW1zX3QgdmZlX3BhcmFtcykKLXsKLQlpZiAodmZlX3BhcmFtcy5vcGVyYXRpb25fbW9kZSAmIFZGRV9PVVRQVVRTX1JESTApIHsKLQkJYXRvbWljX3NldCgmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTBfdXBkYXRlX2Fja19wZW5kaW5nLCAwKTsKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTBfY2FwdHVyZV9jb3VudCA9IC0xOwotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmNhcHR1cmVfY250ID0gLTE7Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZGkwRnJhbWVJZCA9IDA7Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICY9Ci0JCQl+VkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkxOwotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJj0KLQkJCX4oVkZFX09VVFBVVFNfUkRJMCk7Ci0JfQotCi0JaWYgKHZmZV9wYXJhbXMub3BlcmF0aW9uX21vZGUgJiBWRkVfT1VUUFVUU19SREkxKSB7Ci0JCWF0b21pY19zZXQoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZGkxX3VwZGF0ZV9hY2tfcGVuZGluZywgMCk7Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZGkxX2NhcHR1cmVfY291bnQgPSAtMTsKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0My5jYXB0dXJlX2NudCA9IC0xOwotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+cmRpMUZyYW1lSWQgPSAwOwotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+Y29tcF9vdXRwdXRfbW9kZSAmPQotCQkJflZGRTMyX09VVFBVVF9NT0RFX1RFUlRJQVJZMjsKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICY9Ci0JCQl+KFZGRV9PVVRQVVRTX1JESTEpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXhpX2dsb2JhbF9yZXNldF9pbnRlcm5hbF92YXJpYWJsZXMoCi0Jc3RydWN0IGF4aV9jdHJsX3QgKmF4aV9jdHJsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JLyogc3RhdGUgY29udHJvbCB2YXJpYWJsZXMgKi8KLQlheGlfY3RybC0+c2hhcmVfY3RybC0+c3RhcnRfYWNrX3BlbmRpbmcgPSBGQUxTRTsKLQlhdG9taWNfc2V0KCZpcnFfY250LCAwKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZheGlfY3RybC0+c2hhcmVfY3RybC0+c3RvcF9mbGFnX2xvY2ssIGZsYWdzKTsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+c3RvcF9hY2tfcGVuZGluZyAgPSBGQUxTRTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZheGlfY3RybC0+c2hhcmVfY3RybC0+c3RvcF9mbGFnX2xvY2ssIGZsYWdzKTsKLQotCWluaXRfY29tcGxldGlvbigmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJlc2V0X2NvbXBsZXRlKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZheGlfY3RybC0+c2hhcmVfY3RybC0+dXBkYXRlX2Fja19sb2NrLCBmbGFncyk7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnVwZGF0ZV9hY2tfcGVuZGluZyA9IEZBTFNFOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT51cGRhdGVfYWNrX2xvY2ssIGZsYWdzKTsKLQotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZWNvcmRpbmdfc3RhdGUgPSBWRkVfU1RBVEVfSURMRTsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPSBWRkVfU1RBVEVfSURMRTsKLQotCWF0b21pY19zZXQoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT52c3RhdGUsIDApOwotCWF0b21pY19zZXQoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT5oYW5kbGVfY29tbW9uX2lycSwgMCk7Ci0JYXRvbWljX3NldCgmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnBpeDBfdXBkYXRlX2Fja19wZW5kaW5nLCAwKTsKLQlhdG9taWNfc2V0KCZheGlfY3RybC0+c2hhcmVfY3RybC0+cmRpMF91cGRhdGVfYWNrX3BlbmRpbmcsIDApOwotCWF0b21pY19zZXQoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZGkxX3VwZGF0ZV9hY2tfcGVuZGluZywgMCk7Ci0JYXRvbWljX3NldCgmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTJfdXBkYXRlX2Fja19wZW5kaW5nLCAwKTsKLQotCS8qIDAgZm9yIGNvbnRpbnVvdXMgbW9kZSwgMSBmb3Igc25hcHNob3QgbW9kZSAqLwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9IDA7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSA9IDA7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgPSAwOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlID0gMDsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlX2NhcHR1cmVfY291bnQgPSAwOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZGkwX2NhcHR1cmVfY291bnQgPSAtMTsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+cmRpMV9jYXB0dXJlX2NvdW50ID0gLTE7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jYXB0dXJlX2NudCA9IC0xOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2FwdHVyZV9jbnQgPSAtMTsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmNhcHR1cmVfY250ID0gLTE7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0My5jYXB0dXJlX2NudCA9IC0xOwotCi0JLyogdGhpcyBpcyB1bnNpZ25lZCAzMiBiaXQgaW50ZWdlci4gKi8KLQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlRnJhbWVJZCA9IDA7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTBGcmFtZUlkID0gMDsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+cmRpMUZyYW1lSWQgPSAwOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZGkyRnJhbWVJZCA9IDA7Ci19Ci0KLQotc3RhdGljIHZvaWQgdmZlMzJfcHJvZ3JhbV9kbWlfY2ZnKAotCWVudW0gVkZFMzJfRE1JX1JBTV9TRUwgYmFua1NlbCwKLQlzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmUzMl9jdHJsKQotewotCS8qIHNldCBiaXQgOCBmb3IgYXV0byBpbmNyZW1lbnQuICovCi0JdWludDMyX3QgdmFsdWUgPSBWRkVfRE1JX0NGR19ERUZBVUxUOwotCXZhbHVlICs9ICh1aW50MzJfdCliYW5rU2VsOwotCUNEQkcoIiVzOiBiYW5rc2VsID0gJWRcbiIsIF9fZnVuY19fLCBiYW5rU2VsKTsKLQotCW1zbV9jYW1lcmFfaW9fdyh2YWx1ZSwgdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9ETUlfQ0ZHKTsKLQkvKiBieSBkZWZhdWx0LCBhbHdheXMgc3RhcnRzIHdpdGggb2Zmc2V0IDAuKi8KLQltc21fY2FtZXJhX2lvX3coMCwgdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9ETUlfQUREUik7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3Jlc2V0X2RtaV90YWJsZXMoCi0Jc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQlpbnQgaSA9IDA7Ci0KLQkvKiBSZXNldCBIaXN0b2dyYW0gTFVUcyAqLwotCUNEQkcoIlJlc2V0IEJheWVyIGhpc3RvZ3JhbSBMVVQgOiAwXG4iKTsKLQl2ZmUzMl9wcm9ncmFtX2RtaV9jZmcoU1RBVFNfQkhJU1RfUkFNMCwgdmZlMzJfY3RybCk7Ci0JLyogTG9vcCBmb3IgY29uZmlndXJpbmcgTFVUICovCi0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCW1zbV9jYW1lcmFfaW9fdygwLCB2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9ETUlfREFUQV9ISSk7Ci0JCW1zbV9jYW1lcmFfaW9fdygwLCB2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9ETUlfREFUQV9MTyk7Ci0JfQotCXZmZTMyX3Byb2dyYW1fZG1pX2NmZyhOT19NRU1fU0VMRUNURUQsIHZmZTMyX2N0cmwpOwotCi0JQ0RCRygiUmVzZXQgQmF5ZXIgSGlzdG9ncmFtIExVVDogMVxuIik7Ci0JdmZlMzJfcHJvZ3JhbV9kbWlfY2ZnKFNUQVRTX0JISVNUX1JBTTEsIHZmZTMyX2N0cmwpOwotCS8qIExvb3AgZm9yIGNvbmZpZ3VyaW5nIExVVCAqLwotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotCQltc21fY2FtZXJhX2lvX3coMCwgdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfRE1JX0RBVEFfSEkpOwotCQltc21fY2FtZXJhX2lvX3coMCwgdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfRE1JX0RBVEFfTE8pOwotCX0KLQl2ZmUzMl9wcm9ncmFtX2RtaV9jZmcoTk9fTUVNX1NFTEVDVEVELCB2ZmUzMl9jdHJsKTsKLQotCUNEQkcoIlJlc2V0IElIaXN0b2dyYW0gTFVUXG4iKTsKLQl2ZmUzMl9wcm9ncmFtX2RtaV9jZmcoU1RBVFNfSUhJU1RfUkFNLCB2ZmUzMl9jdHJsKTsKLQkvKiBMb29wIGZvciBjb25maWd1cmluZyBMVVQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQkJbXNtX2NhbWVyYV9pb193KDAsIHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0RNSV9EQVRBX0hJKTsKLQkJbXNtX2NhbWVyYV9pb193KDAsIHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0RNSV9EQVRBX0xPKTsKLQl9Ci0JdmZlMzJfcHJvZ3JhbV9kbWlfY2ZnKE5PX01FTV9TRUxFQ1RFRCwgdmZlMzJfY3RybCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3NldF9kZWZhdWx0X3JlZ192YWx1ZXMoCi0Jc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQltc21fY2FtZXJhX2lvX3coMHg4MDAwODAsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfREVNVVhfR0FJTl8wKTsKLQltc21fY2FtZXJhX2lvX3coMHg4MDAwODAsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfREVNVVhfR0FJTl8xKTsKLQkvKiBXaGF0IHZhbHVlIHNob3VsZCB3ZSBwcm9ncmFtIENHQ19PVkVSUklERSB0bz8gKi8KLQltc21fY2FtZXJhX2lvX3coMHhGRkZGRiwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9DR0NfT1ZFUlJJREUpOwotCi0JLyogZGVmYXVsdCBmcmFtZSBkcm9wIHBlcmlvZCBhbmQgcGF0dGVybiAqLwotCW1zbV9jYW1lcmFfaW9fdygweDFmLAotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0ZSQU1FRFJPUF9FTkNfWV9DRkcpOwotCW1zbV9jYW1lcmFfaW9fdygweDFmLAotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0ZSQU1FRFJPUF9FTkNfQ0JDUl9DRkcpOwotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGRkZGLAotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0ZSQU1FRFJPUF9FTkNfWV9QQVRURVJOKTsKLQltc21fY2FtZXJhX2lvX3coMHhGRkZGRkZGRiwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9GUkFNRURST1BfRU5DX0NCQ1JfUEFUVEVSTik7Ci0JbXNtX2NhbWVyYV9pb193KDB4MWYsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfRlJBTUVEUk9QX1ZJRVdfWSk7Ci0JbXNtX2NhbWVyYV9pb193KDB4MWYsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfRlJBTUVEUk9QX1ZJRVdfQ0JDUik7Ci0JbXNtX2NhbWVyYV9pb193KDB4RkZGRkZGRkYsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfRlJBTUVEUk9QX1ZJRVdfWV9QQVRURVJOKTsKLQltc21fY2FtZXJhX2lvX3coMHhGRkZGRkZGRiwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9GUkFNRURST1BfVklFV19DQkNSX1BBVFRFUk4pOwotCW1zbV9jYW1lcmFfaW9fdygwLCB2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0NMQU1QX01JTik7Ci0JbXNtX2NhbWVyYV9pb193KDB4RkZGRkZGLAotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0NMQU1QX01BWCk7Ci0KLQkvKiBzdGF0cyBVQiBjb25maWcgKi8KLQlDREJHKCIlczogVXNlIGJheWVyIHN0YXRzID0gJWRcbiIsIF9fZnVuY19fLAotCQkgdmZlMzJfdXNlX2JheWVyX3N0YXRzKHZmZTMyX2N0cmwpKTsKLQlpZiAoIXZmZTMyX3VzZV9iYXllcl9zdGF0cyh2ZmUzMl9jdHJsKSkgewotCQltc21fY2FtZXJhX2lvX3coMHgzOTgwMDA3LAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX0JVU19TVEFUU19BRUNfQkdfVUJfQ0ZHKTsKLQkJbXNtX2NhbWVyYV9pb193KDB4M0EwMDAwNywKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCVZGRV9CVVNfU1RBVFNfQUZfQkZfVUJfQ0ZHKTsKLQkJbXNtX2NhbWVyYV9pb193KDB4M0E4MDAwRiwKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCVZGRV9CVVNfU1RBVFNfQVdCX1VCX0NGRyk7Ci0JCW1zbV9jYW1lcmFfaW9fdygweDNCODAwMDcsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQlWRkVfQlVTX1NUQVRTX1JTX1VCX0NGRyk7Ci0JCW1zbV9jYW1lcmFfaW9fdygweDNDMDAwMUYsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQlWRkVfQlVTX1NUQVRTX0NTX1VCX0NGRyk7Ci0JCW1zbV9jYW1lcmFfaW9fdygweDNFMDAwMUYsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQlWRkVfQlVTX1NUQVRTX0hJU1RfVUJfQ0ZHKTsKLQl9IGVsc2UgewotCQltc21fY2FtZXJhX2lvX3coMHgzNTAwMDFGLAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX0JVU19TVEFUU19ISVNUX1VCX0NGRyk7Ci0JCW1zbV9jYW1lcmFfaW9fdygweDM3MDAwMkYsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQlWRkVfQlVTX1NUQVRTX0FFQ19CR19VQl9DRkcpOwotCQltc21fY2FtZXJhX2lvX3coMHgzQTAwMDJGLAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX0JVU19TVEFUU19BRl9CRl9VQl9DRkcpOwotCQltc21fY2FtZXJhX2lvX3coMHgzRDAwMDA3LAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX0JVU19TVEFUU19SU19VQl9DRkcpOwotCQltc21fY2FtZXJhX2lvX3coMHgzRDgwMDFGLAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX0JVU19TVEFUU19DU19VQl9DRkcpOwotCQltc21fY2FtZXJhX2lvX3coMHgzRjgwMDA3LAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX0JVU19TVEFUU19TS0lOX0JISVNUX1VCX0NGRyk7Ci0JfQotCXZmZTMyX3Jlc2V0X2RtaV90YWJsZXModmZlMzJfY3RybCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3Jlc2V0X2ludGVybmFsX3ZhcmlhYmxlcygKLQlzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmUzMl9jdHJsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnVwZGF0ZV9hY2tfbG9jaywKLQkJZmxhZ3MpOwotCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnVwZGF0ZV9hY2tfcGVuZGluZyA9IEZBTFNFOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnVwZGF0ZV9hY2tfbG9jaywKLQkJZmxhZ3MpOwotCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZV9jYXB0dXJlX2NvdW50ID0gMDsKLQkvKiB0aGlzIGlzIHVuc2lnbmVkIDMyIGJpdCBpbnRlZ2VyLiAqLwotCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZUZyYW1lSWQgPSAwOwotCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnVwZGF0ZV9jb3VudGVyID0gMDsKLQotCS8qIFN0YXRzIGNvbnRyb2wgdmFyaWFibGVzLiAqLwotCW1lbXNldCgmKHZmZTMyX2N0cmwtPmFmYmZTdGF0c0NvbnRyb2wpLCAwLAotCQlzaXplb2Yoc3RydWN0IHZmZV9zdGF0c19jb250cm9sKSk7Ci0KLQltZW1zZXQoJih2ZmUzMl9jdHJsLT5hd2JTdGF0c0NvbnRyb2wpLCAwLAotCQlzaXplb2Yoc3RydWN0IHZmZV9zdGF0c19jb250cm9sKSk7Ci0KLQltZW1zZXQoJih2ZmUzMl9jdHJsLT5hZWNiZ1N0YXRzQ29udHJvbCksIDAsCi0JCXNpemVvZihzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wpKTsKLQotCW1lbXNldCgmKHZmZTMyX2N0cmwtPmJoaXN0U3RhdHNDb250cm9sKSwgMCwKLQkJc2l6ZW9mKHN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCkpOwotCi0JbWVtc2V0KCYodmZlMzJfY3RybC0+aWhpc3RTdGF0c0NvbnRyb2wpLCAwLAotCQlzaXplb2Yoc3RydWN0IHZmZV9zdGF0c19jb250cm9sKSk7Ci0KLQltZW1zZXQoJih2ZmUzMl9jdHJsLT5yc1N0YXRzQ29udHJvbCksIDAsCi0JCXNpemVvZihzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wpKTsKLQotCW1lbXNldCgmKHZmZTMyX2N0cmwtPmNzU3RhdHNDb250cm9sKSwgMCwKLQkJc2l6ZW9mKHN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCkpOwotCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jYXB0dXJlX2NudCA9IC0xOwotCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jYXB0dXJlX2NudCA9IC0xOwotCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnJlY29yZGluZ19zdGF0ZSA9IFZGRV9TVEFURV9JRExFOwotCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPmxpdmVzaG90X3N0YXRlID0gVkZFX1NUQVRFX0lETEU7Ci0KLQlhdG9taWNfc2V0KCZ2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52c3RhdGUsIDApOwotCWF0b21pY19zZXQoJnZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnBpeDBfdXBkYXRlX2Fja19wZW5kaW5nLCAwKTsKLQotCXZmZTMyX2N0cmwtPmZyYW1lX3NraXBfY250ID0gMzE7Ci0JdmZlMzJfY3RybC0+ZnJhbWVfc2tpcF9wYXR0ZXJuID0gMHhmZmZmZmZmZjsKLQl2ZmUzMl9jdHJsLT5zbmFwc2hvdF9mcmFtZV9jbnQgPSAwOwotCXZmZTMyX3NldF9kZWZhdWx0X3JlZ192YWx1ZXModmZlMzJfY3RybCk7Ci19Ci0KLQotc3RhdGljIGludCB2ZmUzMl9yZXNldChzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmUzMl9jdHJsKQotewotCXVpbnQzMl90IGlycV9tYXNrMSwgaXJxX21hc2s7Ci0JYXRvbWljX3NldCgmdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dnN0YXRlLCAwKTsKLQltc21fY2FtZXJhX2lvX3coVkZFX01PRFVMRV9SRVNFVF9DTUQsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX1JFU0VUKTsKLQltc21fY2FtZXJhX2lvX3coMCwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfUkVTRVQpOwotCi0JaXJxX21hc2sgPQotCQltc21fY2FtZXJhX2lvX3IodmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfSVJRX01BU0tfMCk7Ci0JaXJxX21hc2sgJj0gfigweDAwMEZFMDIxfFZGRV9JUlFfU1RBVFVTMF9TVEFUU19DT01QT1NJVF9NQVNLKTsKLQotCW1zbV9jYW1lcmFfaW9fdyhpcnFfbWFzaywgdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9JUlFfTUFTS18wKTsKLQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmPQotCQkoVkZFX09VVFBVVFNfUkRJMHxWRkVfT1VUUFVUU19SREkxKTsKLQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICY9Ci0JCQkoVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkxfAotCQkJVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkyKTsKLQotCS8qIGVuYWJsZSByZXNldF9hY2sgaW50ZXJydXB0LiAgKi8KLQlpcnFfbWFzazEgPSBtc21fY2FtZXJhX2lvX3IoCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX01BU0tfMSk7Ci0JaXJxX21hc2sxIHw9IFZGRV9JTUFTS19XSElMRV9TVE9QUElOR18xOwotCW1zbV9jYW1lcmFfaW9fdyhpcnFfbWFzazEsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX01BU0tfMSk7Ci0JbXNtX2NhbWVyYV9pb193X21iKFZGRV9PTkxZX1JFU0VUX0NNRCwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9HTE9CQUxfUkVTRVQpOwotCi0JcmV0dXJuIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgKLQkJCSZ2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5yZXNldF9jb21wbGV0ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXhpX3Jlc2V0KHN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCwKLQlzdHJ1Y3QgbXNtX2NhbWVyYV92ZmVfcGFyYW1zX3QgdmZlX3BhcmFtcykKLXsKLQlpbnQgcmMgPSAwOwotCWlmICh2ZmVfcGFyYW1zLnNraXBfcmVzZXQpIHsKLQkJYXhpX3Jlc2V0X2ludGVybmFsX3ZhcmlhYmxlcyhheGlfY3RybCwgdmZlX3BhcmFtcyk7Ci0JCXJldHVybiByYzsKLQl9Ci0JYXhpX2dsb2JhbF9yZXNldF9pbnRlcm5hbF92YXJpYWJsZXMoYXhpX2N0cmwpOwotCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMuICB2ZmVJbWFza0xvY2FsIGlzIGFsc28gcmVzZXQgdG8gMAotCSogdG8gYmVnaW4gd2l0aC4gKi8KLQltc21fY2FtZXJhX2lvX3coVkZFX0RJU0FCTEVfQUxMX0lSUVMsCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9NQVNLXzApOwotCi0JbXNtX2NhbWVyYV9pb193KFZGRV9ESVNBQkxFX0FMTF9JUlFTLAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfTUFTS18xKTsKLQotCS8qIGNsZWFyIGFsbCBwZW5kaW5nIGludGVycnVwdHMqLwotCW1zbV9jYW1lcmFfaW9fdyhWRkVfQ0xFQVJfQUxMX0lSUVMsCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DTEVBUl8wKTsKLQltc21fY2FtZXJhX2lvX3coVkZFX0NMRUFSX0FMTF9JUlFTLAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ0xFQVJfMSk7Ci0KLQkvKiBFbnN1cmUgdGhlIHdyaXRlIG9yZGVyIHdoaWxlIHdyaXRpbmcKLQl0byB0aGUgY29tbWFuZCByZWdpc3RlciB1c2luZyB0aGUgYmFycmllciAqLwotCW1zbV9jYW1lcmFfaW9fd19tYigxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ01EKTsKLQotCS8qIGVuYWJsZSByZXNldF9hY2sgaW50ZXJydXB0LiAgKi8KLQltc21fY2FtZXJhX2lvX3coVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HXzEsCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9NQVNLXzEpOwotCi0JLyogV3JpdGUgdG8gVkZFX0dMT0JBTF9SRVNFVF9DTUQgdG8gcmVzZXQgdGhlIHZmZSBoYXJkd2FyZS4gT25jZSByZXNldAotCSAqIGlzIGRvbmUsIGhhcmR3YXJlIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZC4gIFZGRSBpc3QgcHJvY2Vzc2VzCi0JICogdGhlIGludGVycnVwdCB0byBjb21wbGV0ZSB0aGUgZnVuY3Rpb24gY2FsbC4gIE5vdGUgdGhhdCB0aGUgcmVzZXQKLQkgKiBmdW5jdGlvbiBpcyBzeW5jaHJvbm91cy4gKi8KLQotCS8qIEVuc3VyZSB0aGUgd3JpdGUgb3JkZXIgd2hpbGUgd3JpdGluZwotCXRvIHRoZSBjb21tYW5kIHJlZ2lzdGVyIHVzaW5nIHRoZSBiYXJyaWVyICovCi0JbXNtX2NhbWVyYV9pb193X21iKFZGRV9SRVNFVF9VUE9OX1JFU0VUX0NNRCwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfR0xPQkFMX1JFU0VUKTsKLQotCXJldHVybiB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoCi0JCQkmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJlc2V0X2NvbXBsZXRlKTsKLX0KLQotc3RhdGljIGludCB2ZmUzMl9vcGVyYXRpb25fY29uZmlnKHVpbnQzMl90ICpjbWQsCi0JCQlzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmUzMl9jdHJsKQotewotCXVpbnQzMl90ICpwID0gY21kOwotCi0JdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+c3RhdHNfY29tcCA9ICooKytwKTsKLQl2ZmUzMl9jdHJsLT5oZnJfbW9kZSA9ICooKytwKTsKLQotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfQ0ZHKTsKLQltc21fY2FtZXJhX2lvX3coKigrK3ApLAotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkVBTElHTl9CVUYpOwotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfQ0hST01BX1VQKTsKLQltc21fY2FtZXJhX2lvX3coKigrK3ApLAotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX1NUQVRTX0NGRyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZmZTMyX3N0YXRzX2RxYnVmKHN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwsCi0JZW51bSBtc21fc3RhdHNfZW51bV90eXBlIHN0YXRzX3R5cGUpCi17Ci0Jc3RydWN0IG1zbV9zdGF0c19tZXRhX2J1ZiAqYnVmID0gTlVMTDsKLQlpbnQgcmMgPSAwOwotCXJjID0gdmZlMzJfY3RybC0+c3RhdHNfb3BzLmRxYnVmKAotCQkJdmZlMzJfY3RybC0+c3RhdHNfb3BzLnN0YXRzX2N0cmwsIHN0YXRzX3R5cGUsICZidWYpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiJXM6IGRxIHN0YXRzIGJ1ZiAodHlwZSA9ICVkKSBlcnIgPSAlZCIsCi0JCQlfX2Z1bmNfXywgc3RhdHNfdHlwZSwgcmMpOwotCQlyZXR1cm4gMEw7Ci0JfQotCXJldHVybiBidWYtPnBhZGRyOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2ZmUzMl9zdGF0c19mbHVzaF9lbnF1ZXVlKAotCXN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwsCi0JZW51bSBtc21fc3RhdHNfZW51bV90eXBlIHN0YXRzX3R5cGUpCi17Ci0Jc3RydWN0IG1zbV9zdGF0c19idWZxICpidWZxID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX3N0YXRzX21ldGFfYnVmICpzdGF0c19idWYgPSBOVUxMOwotCWludCByYyA9IDA7Ci0JaW50IGk7Ci0KLQkvKgotCSAqIFBhc3NpbmcgTlVMTCBmb3IgaW9uIGNsaWVudCBhcyB0aGUgYnVmZmVycyBhcmUgYWxyZWFkeQotCSAqIG1hcHBlZCBhdCB0aGlzIHN0YWdlLCBjbGllbnQgaXMgbm90IHJlcXVpcmVkLCBmbHVzaCBhbGwKLQkgKiB0aGUgYnVmZmVycywgYW5kIGJ1ZmZlcnMgbW92ZSB0byBQUkVQQVJFIHN0YXRlCi0JICovCi0KLQlyYyA9IHZmZTMyX2N0cmwtPnN0YXRzX29wcy5idWZxX2ZsdXNoKAotCQkJdmZlMzJfY3RybC0+c3RhdHNfb3BzLnN0YXRzX2N0cmwsIHN0YXRzX3R5cGUsIE5VTEwpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogZHEgc3RhdHMgYnVmICh0eXBlID0gJWQpIGVyciA9ICVkIiwKLQkJCV9fZnVuY19fLCBzdGF0c190eXBlLCByYyk7Ci0JCXJldHVybiAwTDsKLQl9Ci0JLyogUXVldWUgYWxsIHRoZSBidWZmZXJzIGJhY2sgdG8gUVVFVUVEIHN0YXRlICovCi0JYnVmcSA9IHZmZTMyX2N0cmwtPnN0YXRzX2N0cmwuYnVmcVtzdGF0c190eXBlXTsKLQlmb3IgKGkgPSAwOyBpIDwgYnVmcS0+bnVtX2J1ZnM7IGkrKykgewotCQlzdGF0c19idWYgPSAmYnVmcS0+YnVmc1tpXTsKLQkJcmMgPSB2ZmUzMl9jdHJsLT5zdGF0c19vcHMuZW5xdWV1ZV9idWYoCi0JCQkJdmZlMzJfY3RybC0+c3RhdHNfb3BzLnN0YXRzX2N0cmwsCi0JCQkJJihzdGF0c19idWYtPmluZm8pLCBOVUxMLCAtMSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGRxIHN0YXRzIGJ1ZiAodHlwZSA9ICVkKSBlcnIgPSAlZCIsCi0JCQkJIF9fZnVuY19fLCBzdGF0c190eXBlLCByYyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0JcmV0dXJuIDBMOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZmZTMyX3N0YXRzX3VucmVnYnVmKAotCXN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwsCi0Jc3RydWN0IG1zbV9zdGF0c19yZXFidWYgKnJlcV9idWYsIGludCBkb21haW5fbnVtKQotewotCWludCBpID0gMCwgcmMgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IHJlcV9idWYtPm51bV9idWY7IGkrKykgewotCQlyYyA9IHZmZTMyX2N0cmwtPnN0YXRzX29wcy5idWZfdW5wcmVwYXJlKAotCQkJdmZlMzJfY3RybC0+c3RhdHNfb3BzLnN0YXRzX2N0cmwsCi0JCQlyZXFfYnVmLT5zdGF0c190eXBlLCBpLAotCQkJdmZlMzJfY3RybC0+c3RhdHNfb3BzLmNsaWVudCwgZG9tYWluX251bSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IHVucmVnIHN0YXRzIGJ1ZiAodHlwZSA9ICVkKSBlcnIgPSAlZCIsCi0JCQkJX19mdW5jX18sIHJlcV9idWYtPnN0YXRzX3R5cGUsIHJjKTsKLQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCXJldHVybiAwTDsKLX0KLXN0YXRpYyBpbnQgdmZlX3N0YXRzX2F3Yl9idWZfaW5pdCgKLQlzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmUzMl9jdHJsLAotCXN0cnVjdCB2ZmVfY21kX3N0YXRzX2J1ZiAqaW4pCi17Ci0JdWludDMyX3QgYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzJfc3RhdHNfZHFidWYodmZlMzJfY3RybCwgTVNNX1NUQVRTX1RZUEVfQVdCKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMl9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWFkZHIpIHsKLQkJcHJfZXJyKCIlczogZHEgYXdiIHBpbmcgYnVmIGZyb20gZnJlZSBidWYgcXVldWUiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltc21fY2FtZXJhX2lvX3coYWRkciwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9CVVNfU1RBVFNfQVdCX1dSX1BJTkdfQUREUik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzJfc3RhdHNfZHFidWYodmZlMzJfY3RybCwgTVNNX1NUQVRTX1RZUEVfQVdCKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMl9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWFkZHIpIHsKLQkJcHJfZXJyKCIlczogZHEgYXdiIHBpbmcgYnVmIGZyb20gZnJlZSBidWYgcXVldWUiLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1NUQVRTX0FXQl9XUl9QT05HX0FERFIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdWludDMyX3QgdmZlX3N0YXRzX2FlY19iZ19idWZfaW5pdCgKLQlzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmUzMl9jdHJsKQotewotCXVpbnQzMl90IGFkZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50MzJfdCBzdGF0c190eXBlOwotCi0Jc3RhdHNfdHlwZSA9Ci0JCSghdmZlMzJfdXNlX2JheWVyX3N0YXRzKHZmZTMyX2N0cmwpKSA/IE1TTV9TVEFUU19UWVBFX0FFQwotCQkJOiBNU01fU1RBVFNfVFlQRV9CRzsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMzJfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JYWRkciA9ICh1aW50MzJfdCl2ZmUzMl9zdGF0c19kcWJ1Zih2ZmUzMl9jdHJsLCBzdGF0c190eXBlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMl9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWFkZHIpIHsKLQkJcHJfZXJyKCIlczogZHEgYWVjIHBpbmcgYnVmIGZyb20gZnJlZSBidWYgcXVldWUiLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1NUQVRTX0FFQ19CR19XUl9QSU5HX0FERFIpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMl9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlhZGRyID0gKHVpbnQzMl90KXZmZTMyX3N0YXRzX2RxYnVmKHZmZTMyX2N0cmwsIHN0YXRzX3R5cGUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBhZWMgcG9uZyBidWYgZnJvbSBmcmVlIGJ1ZiBxdWV1ZSIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltc21fY2FtZXJhX2lvX3coYWRkciwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9CVVNfU1RBVFNfQUVDX0JHX1dSX1BPTkdfQUREUik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlX3N0YXRzX2FmX2JmX2J1Zl9pbml0KAotCXN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwpCi17Ci0JdWludDMyX3QgYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByYyA9IDA7Ci0KLQl1aW50MzJfdCBzdGF0c190eXBlOwotCXN0YXRzX3R5cGUgPQotCQkoIXZmZTMyX3VzZV9iYXllcl9zdGF0cyh2ZmUzMl9jdHJsKSkgPyBNU01fU1RBVFNfVFlQRV9BRgotCQkJOiBNU01fU1RBVFNfVFlQRV9CRjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMl9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlyYyA9IHZmZTMyX3N0YXRzX2ZsdXNoX2VucXVldWUodmZlMzJfY3RybCwgc3RhdHNfdHlwZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBkcSBzdGF0cyBidWYgZXJyID0gJWQiLAotCQkJICAgX19mdW5jX18sIHJjKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzJfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhZGRyID0gKHVpbnQzMl90KXZmZTMyX3N0YXRzX2RxYnVmKHZmZTMyX2N0cmwsIHN0YXRzX3R5cGUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBhZiBwaW5nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1NUQVRTX0FGX0JGX1dSX1BJTkdfQUREUik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzJfc3RhdHNfZHFidWYodmZlMzJfY3RybCwgc3RhdHNfdHlwZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzJfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhZGRyKSB7Ci0JCXByX2VycigiJXM6IGRxIGFmIHBvbmcgYnVmIGZyb20gZnJlZSBidWYgcXVldWUiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltc21fY2FtZXJhX2lvX3coYWRkciwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9CVVNfU1RBVFNfQUZfQkZfV1JfUE9OR19BRERSKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVpbnQzMl90IHZmZV9zdGF0c19iaGlzdF9idWZfaW5pdCgKLQlzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmUzMl9jdHJsKQotewotCXVpbnQzMl90IGFkZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMl9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlhZGRyID0gKHVpbnQzMl90KXZmZTMyX3N0YXRzX2RxYnVmKHZmZTMyX2N0cmwsIE1TTV9TVEFUU19UWVBFX0JISVNUKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMl9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWFkZHIpIHsKLQkJcHJfZXJyKCIlczogZHEgaWhpc3QgcGluZyBidWYgZnJvbSBmcmVlIGJ1ZiBxdWV1ZSIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltc21fY2FtZXJhX2lvX3coYWRkciwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9CVVNfU1RBVFNfU0tJTl9CSElTVF9XUl9QSU5HX0FERFIpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMl9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlhZGRyID0gKHVpbnQzMl90KXZmZTMyX3N0YXRzX2RxYnVmKHZmZTMyX2N0cmwsIE1TTV9TVEFUU19UWVBFX0JISVNUKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMl9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWFkZHIpIHsKLQkJcHJfZXJyKCIlczogZHEgaWhpc3QgcG9uZyBidWYgZnJvbSBmcmVlIGJ1ZiBxdWV1ZSIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltc21fY2FtZXJhX2lvX3coYWRkciwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9CVVNfU1RBVFNfU0tJTl9CSElTVF9XUl9QT05HX0FERFIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlX3N0YXRzX2loaXN0X2J1Zl9pbml0KAotCXN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwpCi17Ci0JdWludDMyX3QgYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzJfc3RhdHNfZHFidWYodmZlMzJfY3RybCwgTVNNX1NUQVRTX1RZUEVfSUhJU1QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBpaGlzdCBwaW5nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1zbV9jYW1lcmFfaW9fdyhhZGRyLAotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJVkZFX0JVU19TVEFUU19ISVNUX1dSX1BJTkdfQUREUik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzJfc3RhdHNfZHFidWYodmZlMzJfY3RybCwgTVNNX1NUQVRTX1RZUEVfSUhJU1QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBpaGlzdCBwb25nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1zbV9jYW1lcmFfaW9fdyhhZGRyLAotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJVkZFX0JVU19TVEFUU19ISVNUX1dSX1BPTkdfQUREUik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZmVfc3RhdHNfcnNfYnVmX2luaXQoCi0Jc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQl1aW50MzJfdCBhZGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMzJfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JYWRkciA9ICh1aW50MzJfdCl2ZmUzMl9zdGF0c19kcWJ1Zih2ZmUzMl9jdHJsLCBNU01fU1RBVFNfVFlQRV9SUyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzJfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhZGRyKSB7Ci0JCXByX2VycigiJXM6IGRxIHJzIHBpbmcgYnVmIGZyb20gZnJlZSBidWYgcXVldWUiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltc21fY2FtZXJhX2lvX3coYWRkciwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9CVVNfU1RBVFNfUlNfV1JfUElOR19BRERSKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMzJfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JYWRkciA9ICh1aW50MzJfdCl2ZmUzMl9zdGF0c19kcWJ1Zih2ZmUzMl9jdHJsLCBNU01fU1RBVFNfVFlQRV9SUyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzJfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhZGRyKSB7Ci0JCXByX2VycigiJXM6IGRxIHJzIHBvbmcgYnVmIGZyb20gZnJlZSBidWYgcXVldWUiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltc21fY2FtZXJhX2lvX3coYWRkciwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9CVVNfU1RBVFNfUlNfV1JfUE9OR19BRERSKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZmVfc3RhdHNfY3NfYnVmX2luaXQoCi0Jc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQl1aW50MzJfdCBhZGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzJfc3RhdHNfZHFidWYodmZlMzJfY3RybCwgTVNNX1NUQVRTX1RZUEVfQ1MpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBjcyBwaW5nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1NUQVRTX0NTX1dSX1BJTkdfQUREUik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzJfc3RhdHNfZHFidWYodmZlMzJfY3RybCwgTVNNX1NUQVRTX1RZUEVfQ1MpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBjcyBwb25nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1NUQVRTX0NTX1dSX1BPTkdfQUREUik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3N0YXJ0X2NvbW1vbihzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmUzMl9jdHJsKQotewotCUNEQkcoIlZGRSBvcGVydGFpb24gbW9kZSA9IDB4JXgsIG91dHB1dCBtb2RlID0gMHgleFxuIiwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUpOwotCW1zbV9jYW1lcmFfaW9fd19tYigxLCB2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJVkZFX0NBTUlGX0NPTU1BTkQpOwotCW1zbV9jYW1lcmFfaW9fd19tYihWRkVfQVhJX0NGR19NQVNLLAotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0FYSV9DRkcpOwotfQotCi1zdGF0aWMgaW50IHZmZTMyX3N0YXJ0X3JlY29yZGluZygKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQlzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmUzMl9jdHJsKQotewotCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnJlY29yZGluZ19zdGF0ZSA9IFZGRV9TVEFURV9TVEFSVF9SRVFVRVNURUQ7Ci0JbXNtX2NhbWVyYV9pb193X21iKDEsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkVHX1VQREFURV9DTUQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZmZTMyX3N0b3BfcmVjb3JkaW5nKAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwpCi17Ci0JdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+cmVjb3JkaW5nX3N0YXRlID0gVkZFX1NUQVRFX1NUT1BfUkVRVUVTVEVEOwotCW1zbV9jYW1lcmFfaW9fd19tYigxLAotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX1JFR19VUERBVEVfQ01EKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzJfc3RhcnRfbGl2ZXNob3QoCi0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwsCi0Jc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQkvKiBIYXJkY29kZSAxIGxpdmUgc25hcHNob3QgZm9yIG5vdy4gKi8KLQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2FwdHVyZV9jbnQgPSAxOwotCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZV9jYXB0dXJlX2NvdW50ID0KLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNhcHR1cmVfY250OwotCi0JdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPSBWRkVfU1RBVEVfU1RBUlRfUkVRVUVTVEVEOwotCW1zbV9jYW1lcmFfaW9fd19tYigxLCB2ZmUzMl9jdHJsLT4KLQkJc2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9SRUdfVVBEQVRFX0NNRCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3N0b3BfbGl2ZXNob3QoCi0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwsCi0Jc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5saXZlc2hvdF9zdGF0ZSA9IFZGRV9TVEFURV9TVE9QX1JFUVVFU1RFRDsKLQltc21fY2FtZXJhX2lvX3dfbWIoMSwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9SRUdfVVBEQVRFX0NNRCk7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlMzJfenNsKAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwpCi17Ci0JdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+c3RhcnRfYWNrX3BlbmRpbmcgPSBUUlVFOwotCXZmZTMyX3N0YXJ0X2NvbW1vbih2ZmUzMl9jdHJsKTsKLQotCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgMHgxOEMpOwotCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgMHgxODgpOwotCXJldHVybiAwOwotfQotc3RhdGljIGludCB2ZmUzMl9jYXB0dXJlX3JhdygKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQlzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmUzMl9jdHJsLAotCXVpbnQzMl90IG51bV9mcmFtZXNfY2FwdHVyZSkKLXsKLQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2FwdHVyZV9jbnQgPSBudW1fZnJhbWVzX2NhcHR1cmU7Ci0JdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlX2NhcHR1cmVfY291bnQgPSBudW1fZnJhbWVzX2NhcHR1cmU7Ci0JdmZlMzJfc3RhcnRfY29tbW9uKHZmZTMyX2N0cmwpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZmZTMyX2NhcHR1cmUoCi0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwsCi0JdWludDMyX3QgbnVtX2ZyYW1lc19jYXB0dXJlLAotCXN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwpCi17Ci0JLyogY2FwdHVyZSBjb21tYW5kIGlzIHZhbGlkIGZvciBib3RoIGlkbGUgYW5kIGFjdGl2ZSBzdGF0ZS4gKi8KLQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2FwdHVyZV9jbnQgPSBudW1fZnJhbWVzX2NhcHR1cmU7Ci0JaWYgKHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSA9PQotCQkJVkZFX09VVFBVVFNfTUFJTl9BTkRfVEhVTUIgfHwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlID09Ci0JCQlWRkVfT1VUUFVUU19USFVNQl9BTkRfTUFJTiB8fAotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgPT0KLQkJCVZGRV9PVVRQVVRTX0pQRUdfQU5EX1RIVU1CIHx8Ci0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSA9PQotCQkJVkZFX09VVFBVVFNfVEhVTUJfQU5EX0pQRUcpIHsKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNhcHR1cmVfY250ID0KLQkJCW51bV9mcmFtZXNfY2FwdHVyZTsKLQl9Ci0KLQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudCA9IG51bV9mcmFtZXNfY2FwdHVyZTsKLQotCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZV9jYXB0dXJlX2NvdW50ID0gbnVtX2ZyYW1lc19jYXB0dXJlOwotCi0JdmZlMzJfc3RhcnRfY29tbW9uKHZmZTMyX2N0cmwpOwotCS8qIGZvciBkZWJ1ZyAqLwotCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgMHgxOEMpOwotCW1zbV9jYW1lcmFfaW9fdygxLCB2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgMHgxODgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZmZTMyX3N0YXJ0KAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwpCi17Ci0JdmZlMzJfc3RhcnRfY29tbW9uKHZmZTMyX2N0cmwpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMl91cGRhdGUoc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IHZhbHVlID0gMDsKLQlpZiAodmZlMzJfY3RybC0+dXBkYXRlX2xpbmVhcikgewotCQlpZiAoIW1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVjMyX0xJTkVBUklaQVRJT05fT0ZGMSkpCi0JCQltc21fY2FtZXJhX2lvX3coMSwKLQkJCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQlWMzJfTElORUFSSVpBVElPTl9PRkYxKTsKLQkJZWxzZQotCQkJbXNtX2NhbWVyYV9pb193KDAsCi0JCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVjMyX0xJTkVBUklaQVRJT05fT0ZGMSk7Ci0JCXZmZTMyX2N0cmwtPnVwZGF0ZV9saW5lYXIgPSBmYWxzZTsKLQl9Ci0KLQlpZiAodmZlMzJfY3RybC0+dXBkYXRlX3JvbGxvZmYpIHsKLQkJdmFsdWUgPSBtc21fY2FtZXJhX2lvX3IodmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWMzNfUENBX1JPTExfT0ZGX0NGR19PRkYxKTsKLQkJdmFsdWUgXj0gVjMzX1BDQV9ST0xMX09GRl9MVVRfQkFOS19TRUxfTUFTSzsKLQkJbXNtX2NhbWVyYV9pb193KHZhbHVlLCB2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVYzM19QQ0FfUk9MTF9PRkZfQ0ZHX09GRjEpOwotCQl2ZmUzMl9jdHJsLT51cGRhdGVfcm9sbG9mZiA9IGZhbHNlOwotCX0KLQotCWlmICh2ZmUzMl9jdHJsLT51cGRhdGVfbGEpIHsKLQkJaWYgKCFtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjMyX0xBX09GRikpCi0JCQltc21fY2FtZXJhX2lvX3coMSwKLQkJCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjMyX0xBX09GRik7Ci0JCWVsc2UKLQkJCW1zbV9jYW1lcmFfaW9fdygwLAotCQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWMzJfTEFfT0ZGKTsKLQkJdmZlMzJfY3RybC0+dXBkYXRlX2xhID0gZmFsc2U7Ci0JfQotCi0JaWYgKHZmZTMyX2N0cmwtPnVwZGF0ZV9nYW1tYSkgewotCQl2YWx1ZSA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWMzJfUkdCX0dfT0ZGKTsKLQkJdmFsdWUgXj0gVjMyX0dBTU1BX0xVVF9CQU5LX1NFTF9NQVNLOwotCQltc21fY2FtZXJhX2lvX3codmFsdWUsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjMyX1JHQl9HX09GRik7Ci0JCXZmZTMyX2N0cmwtPnVwZGF0ZV9nYW1tYSA9IGZhbHNlOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT51cGRhdGVfYWNrX2xvY2ssIGZsYWdzKTsKLQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT51cGRhdGVfYWNrX3BlbmRpbmcgPSBUUlVFOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnVwZGF0ZV9hY2tfbG9jaywgZmxhZ3MpOwotCS8qIEVuc3VyZSB0aGUgd3JpdGUgb3JkZXIgd2hpbGUgd3JpdGluZwotCXRvIHRoZSBjb21tYW5kIHJlZ2lzdGVyIHVzaW5nIHRoZSBiYXJyaWVyICovCi0JbXNtX2NhbWVyYV9pb193X21iKDEsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkVHX1VQREFURV9DTUQpOwotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzJfc3luY190aW1lcl9zdG9wKHN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwpCi17Ci0JdWludDMyX3QgdmFsdWUgPSAwOwotCXZmZTMyX2N0cmwtPnN5bmNfdGltZXJfc3RhdGUgPSAwOwotCWlmICh2ZmUzMl9jdHJsLT5zeW5jX3RpbWVyX251bWJlciA9PSAwKQotCQl2YWx1ZSA9IDB4MTAwMDA7Ci0JZWxzZSBpZiAodmZlMzJfY3RybC0+c3luY190aW1lcl9udW1iZXIgPT0gMSkKLQkJdmFsdWUgPSAweDIwMDAwOwotCWVsc2UgaWYgKHZmZTMyX2N0cmwtPnN5bmNfdGltZXJfbnVtYmVyID09IDIpCi0JCXZhbHVlID0gMHg0MDAwMDsKLQotCS8qIFRpbWVyIFN0b3AgKi8KLQltc21fY2FtZXJhX2lvX3codmFsdWUsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWMzJfU1lOQ19USU1FUl9PRkYpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMl9zeW5jX3RpbWVyX3N0YXJ0KAotCWNvbnN0IHVpbnQzMl90ICp0YmwsCi0Jc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQkvKiBzZXQgYml0IDggZm9yIGF1dG8gaW5jcmVtZW50LiAqLwotCXVpbnQzMl90IHZhbHVlID0gMTsKLQl1aW50MzJfdCB2YWw7Ci0KLQl2ZmUzMl9jdHJsLT5zeW5jX3RpbWVyX3N0YXRlID0gKnRibCsrOwotCXZmZTMyX2N0cmwtPnN5bmNfdGltZXJfcmVwZWF0X2NvdW50ID0gKnRibCsrOwotCXZmZTMyX2N0cmwtPnN5bmNfdGltZXJfbnVtYmVyID0gKnRibCsrOwotCUNEQkcoIiVzIHRpbWVyX3N0YXRlICVkLCByZXBlYXRfY250ICVkIHRpbWVyIG51bWJlciAlZFxuIiwKLQkJIF9fZnVuY19fLCB2ZmUzMl9jdHJsLT5zeW5jX3RpbWVyX3N0YXRlLAotCQkgdmZlMzJfY3RybC0+c3luY190aW1lcl9yZXBlYXRfY291bnQsCi0JCSB2ZmUzMl9jdHJsLT5zeW5jX3RpbWVyX251bWJlcik7Ci0KLQlpZiAodmZlMzJfY3RybC0+c3luY190aW1lcl9zdGF0ZSkgeyAvKiBTdGFydCBUaW1lciAqLwotCQl2YWx1ZSA9IHZhbHVlIDw8IHZmZTMyX2N0cmwtPnN5bmNfdGltZXJfbnVtYmVyOwotCX0gZWxzZSB7IC8qIFN0b3AgVGltZXIgKi8KLQkJQ0RCRygiRmFpbGVkIHRvIFN0YXJ0IHRpbWVyXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFRpbWVyIFN0YXJ0ICovCi0JbXNtX2NhbWVyYV9pb193KHZhbHVlLAotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjMyX1NZTkNfVElNRVJfT0ZGKTsKLQkvKiBTeW5jIFRpbWVyIExpbmUgU3RhcnQgKi8KLQl2YWx1ZSA9ICp0YmwrKzsKLQltc21fY2FtZXJhX2lvX3codmFsdWUsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWMzJfU1lOQ19USU1FUl9PRkYgKwotCQk0ICsgKCh2ZmUzMl9jdHJsLT5zeW5jX3RpbWVyX251bWJlcikgKiAxMikpOwotCS8qIFN5bmMgVGltZXIgUGl4ZWwgU3RhcnQgKi8KLQl2YWx1ZSA9ICp0YmwrKzsKLQltc21fY2FtZXJhX2lvX3codmFsdWUsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjMyX1NZTkNfVElNRVJfT0ZGICsKLQkJCSA4ICsgKCh2ZmUzMl9jdHJsLT5zeW5jX3RpbWVyX251bWJlcikgKiAxMikpOwotCS8qIFN5bmMgVGltZXIgUGl4ZWwgRHVyYXRpb24gKi8KLQl2YWx1ZSA9ICp0YmwrKzsKLQl2YWwgPSB2ZmVfY2xrX3JhdGUgLyAxMDAwMDsKLQl2YWwgPSAxMDAwMDAwMCAvIHZhbDsKLQl2YWwgPSB2YWx1ZSAqIDEwMDAwIC8gdmFsOwotCUNEQkcoIiVzOiBQaXhlbCBDbGsgQ3ljbGVzISEhICVkXG4iLCBfX2Z1bmNfXywgdmFsKTsKLQltc21fY2FtZXJhX2lvX3codmFsLAotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjMyX1NZTkNfVElNRVJfT0ZGICsKLQkJMTIgKyAoKHZmZTMyX2N0cmwtPnN5bmNfdGltZXJfbnVtYmVyKSAqIDEyKSk7Ci0JLyogVGltZXIwIEFjdGl2ZSBIaWdoL0xPVyAqLwotCXZhbHVlID0gKnRibCsrOwotCW1zbV9jYW1lcmFfaW9fdyh2YWx1ZSwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFYzMl9TWU5DX1RJTUVSX1BPTEFSSVRZX09GRik7Ci0JLyogU2VsZWN0cyBzeW5jIHRpbWVyIDAgb3V0cHV0IHRvIGRyaXZlIG9udG8gdGltZXIxIHBvcnQgKi8KLQl2YWx1ZSA9IDA7Ci0JbXNtX2NhbWVyYV9pb193KHZhbHVlLAotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjMyX1RJTUVSX1NFTEVDVF9PRkYpOwotfQotCi0KLXN0YXRpYyB2b2lkIHZmZTMyX3dyaXRlX2dhbW1hX2NmZygKLQllbnVtIFZGRTMyX0RNSV9SQU1fU0VMIGNoYW5uZWxfc2VsLAotCWNvbnN0IHVpbnQzMl90ICp0YmwsCi0Jc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQlpbnQgaTsKLQl1aW50MzJfdCB2YWx1ZSwgdmFsdWUxLCB2YWx1ZTI7Ci0JdmZlMzJfcHJvZ3JhbV9kbWlfY2ZnKGNoYW5uZWxfc2VsLCB2ZmUzMl9jdHJsKTsKLQlmb3IgKGkgPSAwIDsgaSA8IChWRkUzMl9HQU1NQV9OVU1fRU5UUklFUy8yKSA7IGkrKykgewotCQl2YWx1ZSA9ICp0YmwrKzsKLQkJdmFsdWUxID0gdmFsdWUgJiAweDAwMDBGRkZGOwotCQl2YWx1ZTIgPSAodmFsdWUgJiAweEZGRkYwMDAwKT4+MTY7Ci0JCW1zbV9jYW1lcmFfaW9fdygodmFsdWUxKSwKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0RBVEFfTE8pOwotCQltc21fY2FtZXJhX2lvX3coKHZhbHVlMiksCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0RNSV9EQVRBX0xPKTsKLQl9Ci0JdmZlMzJfcHJvZ3JhbV9kbWlfY2ZnKE5PX01FTV9TRUxFQ1RFRCwgdmZlMzJfY3RybCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3JlYWRfZ2FtbWFfY2ZnKAotCWVudW0gVkZFMzJfRE1JX1JBTV9TRUwgY2hhbm5lbF9zZWwsCi0JdWludDMyX3QgKnRibCwKLQlzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmUzMl9jdHJsKQotewotCWludCBpOwotCXZmZTMyX3Byb2dyYW1fZG1pX2NmZyhjaGFubmVsX3NlbCwgdmZlMzJfY3RybCk7Ci0JQ0RCRygiJXM6IEdhbW1hIHRhYmxlIGNoYW5uZWw6ICVkXG4iLCBfX2Z1bmNfXywgY2hhbm5lbF9zZWwpOwotCWZvciAoaSA9IDAgOyBpIDwgVkZFMzJfR0FNTUFfTlVNX0VOVFJJRVMgOyBpKyspIHsKLQkJKnRibCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0RBVEFfTE8pOwotCQlDREJHKCIlczogJTA4eFxuIiwgX19mdW5jX18sICp0YmwpOwotCQl0YmwrKzsKLQl9Ci0JdmZlMzJfcHJvZ3JhbV9kbWlfY2ZnKE5PX01FTV9TRUxFQ1RFRCwgdmZlMzJfY3RybCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3dyaXRlX2xhX2NmZygKLQllbnVtIFZGRTMyX0RNSV9SQU1fU0VMIGNoYW5uZWxfc2VsLAotCWNvbnN0IHVpbnQzMl90ICp0YmwsCi0Jc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQl1aW50MzJfdCBpOwotCXVpbnQzMl90IHZhbHVlLCB2YWx1ZTEsIHZhbHVlMjsKLQotCXZmZTMyX3Byb2dyYW1fZG1pX2NmZyhjaGFubmVsX3NlbCwgdmZlMzJfY3RybCk7Ci0JZm9yIChpID0gMCA7IGkgPCAoVkZFMzJfTEFfVEFCTEVfTEVOR1RILzIpIDsgaSsrKSB7Ci0JCXZhbHVlID0gKnRibCsrOwotCQl2YWx1ZTEgPSB2YWx1ZSAmIDB4MDAwMEZGRkY7Ci0JCXZhbHVlMiA9ICh2YWx1ZSAmIDB4RkZGRjAwMDApPj4xNjsKLQkJbXNtX2NhbWVyYV9pb193KCh2YWx1ZTEpLAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfREFUQV9MTyk7Ci0JCW1zbV9jYW1lcmFfaW9fdygodmFsdWUyKSwKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0RBVEFfTE8pOwotCX0KLQl2ZmUzMl9wcm9ncmFtX2RtaV9jZmcoTk9fTUVNX1NFTEVDVEVELCB2ZmUzMl9jdHJsKTsKLX0KLQotc3RhdGljIHN0cnVjdCB2ZmUzMl9vdXRwdXRfY2ggKnZmZTMyX2dldF9jaCgKLQlpbnQgcGF0aCwgc3RydWN0IHZmZV9zaGFyZV9jdHJsX3QgKnNoYXJlX2N0cmwpCi17Ci0Jc3RydWN0IHZmZTMyX291dHB1dF9jaCAqY2ggPSBOVUxMOwotCi0JaWYgKHBhdGggPT0gVkZFX01TR19PVVRQVVRfUFJJTUFSWSkKLQkJY2ggPSAmc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwOwotCWVsc2UgaWYgKHBhdGggPT0gVkZFX01TR19PVVRQVVRfU0VDT05EQVJZKQotCQljaCA9ICZzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDE7Ci0JZWxzZSBpZiAocGF0aCA9PSBWRkVfTVNHX09VVFBVVF9URVJUSUFSWTEpCi0JCWNoID0gJnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MjsKLQllbHNlIGlmIChwYXRoID09IFZGRV9NU0dfT1VUUFVUX1RFUlRJQVJZMikKLQkJY2ggPSAmc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQzOwotCWVsc2UKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXRoICVkXG4iLCBfX2Z1bmNfXywKLQkJCXBhdGgpOwotCi0JQlVHX09OKGNoID09IE5VTEwpOwotCXJldHVybiBjaDsKLX0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2ZyZWVfYnVmICp2ZmUzMl9jaGVja19mcmVlX2J1ZmZlcigKLQlpbnQgaWQsIGludCBwYXRoLCBzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwpCi17Ci0Jc3RydWN0IHZmZTMyX291dHB1dF9jaCAqb3V0Y2ggPSBOVUxMOwotCXN0cnVjdCBtc21fZnJlZV9idWYgKmIgPSBOVUxMOwotCXVpbnQzMl90IGluc3RfaGFuZGxlID0gMDsKLQotCWlmIChwYXRoID09IFZGRV9NU0dfT1VUUFVUX1BSSU1BUlkpCi0JCWluc3RfaGFuZGxlID0gYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5pbnN0X2hhbmRsZTsKLQllbHNlIGlmIChwYXRoID09IFZGRV9NU0dfT1VUUFVUX1NFQ09OREFSWSkKLQkJaW5zdF9oYW5kbGUgPSBheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmluc3RfaGFuZGxlOwotCWVsc2UgaWYgKHBhdGggPT0gVkZFX01TR19PVVRQVVRfVEVSVElBUlkxKQotCQlpbnN0X2hhbmRsZSA9IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDIuaW5zdF9oYW5kbGU7Ci0JZWxzZSBpZiAocGF0aCA9PSBWRkVfTVNHX09VVFBVVF9URVJUSUFSWTIpCi0JCWluc3RfaGFuZGxlID0gYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0My5pbnN0X2hhbmRsZTsKLQotCXZmZTMyX3N1YmRldl9ub3RpZnkoaWQsIHBhdGgsIGluc3RfaGFuZGxlLAotCQkmYXhpX2N0cmwtPnN1YmRldiwgYXhpX2N0cmwtPnNoYXJlX2N0cmwpOwotCW91dGNoID0gdmZlMzJfZ2V0X2NoKHBhdGgsIGF4aV9jdHJsLT5zaGFyZV9jdHJsKTsKLQlpZiAob3V0Y2gtPmZyZWVfYnVmLmNoX3BhZGRyWzBdKQotCQliID0gJm91dGNoLT5mcmVlX2J1ZjsKLQlyZXR1cm4gYjsKLX0KLXN0YXRpYyBpbnQgY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoCi0JaW50IGlkLCBpbnQgcGF0aCwgc3RydWN0IGF4aV9jdHJsX3QgKmF4aV9jdHJsKQotewotCXN0cnVjdCB2ZmUzMl9vdXRwdXRfY2ggKm91dGNoID0gTlVMTDsKLQlpbnQgcmMgPSAwOwotCXVpbnQzMl90IGluc3RfaGFuZGxlID0gMDsKLQlpZiAocGF0aCA9PSBWRkVfTVNHX09VVFBVVF9QUklNQVJZKQotCQlpbnN0X2hhbmRsZSA9IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuaW5zdF9oYW5kbGU7Ci0JZWxzZSBpZiAocGF0aCA9PSBWRkVfTVNHX09VVFBVVF9TRUNPTkRBUlkpCi0JCWluc3RfaGFuZGxlID0gYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5pbnN0X2hhbmRsZTsKLQllbHNlIGlmIChwYXRoID09IFZGRV9NU0dfT1VUUFVUX1RFUlRJQVJZMSkKLQkJaW5zdF9oYW5kbGUgPSBheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmluc3RfaGFuZGxlOwotCWVsc2UgaWYgKHBhdGggPT0gVkZFX01TR19PVVRQVVRfVEVSVElBUlkyKQotCQlpbnN0X2hhbmRsZSA9IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDMuaW5zdF9oYW5kbGU7Ci0KLQl2ZmUzMl9zdWJkZXZfbm90aWZ5KGlkLCBwYXRoLCBpbnN0X2hhbmRsZSwKLQkJJmF4aV9jdHJsLT5zdWJkZXYsIGF4aV9jdHJsLT5zaGFyZV9jdHJsKTsKLQlvdXRjaCA9IHZmZTMyX2dldF9jaChwYXRoLCBheGlfY3RybC0+c2hhcmVfY3RybCk7Ci0JaWYgKG91dGNoLT5waW5nLmNoX3BhZGRyWzBdICYmIG91dGNoLT5wb25nLmNoX3BhZGRyWzBdKSB7Ci0JCS8qIENvbmZpZ3VyZSBQcmV2aWV3IFBpbmcgUG9uZyAqLwotCQlwcl9pbmZvKCIlcyBDb25maWd1cmUgcGluZy9wb25nIGFkZHJlc3MgZm9yICVkIiwKLQkJCQkJCV9fZnVuY19fLCBwYXRoKTsKLQkJdmZlMzJfcHV0X2NoX3BpbmdfYWRkcigKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLCBvdXRjaC0+Y2gwLAotCQkJb3V0Y2gtPnBpbmcuY2hfcGFkZHJbMF0pOwotCQl2ZmUzMl9wdXRfY2hfcG9uZ19hZGRyKAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsIG91dGNoLT5jaDAsCi0JCQlvdXRjaC0+cG9uZy5jaF9wYWRkclswXSk7Ci0KLQkJaWYgKChheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICE9Ci0JCQlWRkVfT1VUUFVUU19SQVcpICYmIChwYXRoICE9IFZGRV9NU0dfT1VUUFVUX1RFUlRJQVJZMSkKLQkJCSYmIChwYXRoICE9IFZGRV9NU0dfT1VUUFVUX1RFUlRJQVJZMikpIHsKLQkJCXZmZTMyX3B1dF9jaF9waW5nX2FkZHIoCi0JCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsIG91dGNoLT5jaDEsCi0JCQkJb3V0Y2gtPnBpbmcuY2hfcGFkZHJbMV0pOwotCQkJdmZlMzJfcHV0X2NoX3BvbmdfYWRkcigKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwgb3V0Y2gtPmNoMSwKLQkJCQlvdXRjaC0+cG9uZy5jaF9wYWRkclsxXSk7Ci0JCX0KLQotCQlpZiAob3V0Y2gtPnBpbmcubnVtX3BsYW5lcyA+IDIpCi0JCQl2ZmUzMl9wdXRfY2hfcGluZ19hZGRyKAotCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLCBvdXRjaC0+Y2gyLAotCQkJCW91dGNoLT5waW5nLmNoX3BhZGRyWzJdKTsKLQkJaWYgKG91dGNoLT5wb25nLm51bV9wbGFuZXMgPiAyKQotCQkJdmZlMzJfcHV0X2NoX3BvbmdfYWRkcigKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwgb3V0Y2gtPmNoMiwKLQkJCQlvdXRjaC0+cG9uZy5jaF9wYWRkclsyXSk7Ci0KLQkJLyogYXZvaWQgc3RhbGUgaW5mbyAqLwotCQltZW1zZXQoJm91dGNoLT5waW5nLCAwLCBzaXplb2Yoc3RydWN0IG1zbV9mcmVlX2J1ZikpOwotCQltZW1zZXQoJm91dGNoLT5wb25nLCAwLCBzaXplb2Yoc3RydWN0IG1zbV9mcmVlX2J1ZikpOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXMgcGluZy9wb25nIGFkZHIgaXMgbnVsbCEhIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzJfd3JpdGVfbGluZWFyX2NmZygKLQllbnVtIFZGRTMyX0RNSV9SQU1fU0VMIGNoYW5uZWxfc2VsLAotCWNvbnN0IHVpbnQzMl90ICp0YmwsIHN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwpCi17Ci0JdWludDMyX3QgaTsKLQotCXZmZTMyX3Byb2dyYW1fZG1pX2NmZyhjaGFubmVsX3NlbCwgdmZlMzJfY3RybCk7Ci0JLyogZm9yIGxvb3AgZm9yIGNvbmZpZ3VyaW5nIExVVC4gKi8KLQlmb3IgKGkgPSAwIDsgaSA8IFZGRTMyX0xJTkVBUklaQVRPTl9UQUJMRV9MRU5HVEggOyBpKyspIHsKLQkJbXNtX2NhbWVyYV9pb193KCp0YmwsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0RNSV9EQVRBX0xPKTsKLQkJdGJsKys7Ci0JfQotCUNEQkcoImRvbmUgd3JpdGluZyB0byBsaW5lYXJpemF0aW9uIHRhYmxlXG4iKTsKLQl2ZmUzMl9wcm9ncmFtX2RtaV9jZmcoTk9fTUVNX1NFTEVDVEVELCB2ZmUzMl9jdHJsKTsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzJfc2VuZF9pc3BfbXNnKAotCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JdWludDMyX3QgdmZlRnJhbWVJZCwKLQl1aW50MzJfdCBpc3BfbXNnX2lkKQotewotCXN0cnVjdCBpc3BfbXNnX2V2ZW50IGlzcF9tc2dfZXZ0OwotCi0JaXNwX21zZ19ldnQubXNnX2lkID0gaXNwX21zZ19pZDsKLQlpc3BfbXNnX2V2dC5zb2ZfY291bnQgPSB2ZmVGcmFtZUlkOwotCXY0bDJfc3ViZGV2X25vdGlmeShzZCwKLQkJCU5PVElGWV9JU1BfTVNHX0VWVCwKLQkJCSh2b2lkICopJmlzcF9tc2dfZXZ0KTsKLX0KLQotc3RhdGljIGludCB2ZmUzMl9wcm9jX2dlbmVyYWwoCi0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwsCi0Jc3RydWN0IG1zbV9pc3BfY21kICpjbWQsCi0Jc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQlpbnQgaSAsIHJjID0gMDsKLQl1aW50MzJfdCBvbGRfdmFsID0gMCAsIG5ld192YWwgPSAwLCBtb2R1bGVfdmFsID0gMDsKLQl1aW50MzJfdCAqY21kcCA9IE5VTEw7Ci0JdWludDMyX3QgKmNtZHBfbG9jYWwgPSBOVUxMOwotCXVpbnQzMl90IHNuYXBzaG90X2NudCA9IDA7Ci0JdWludDMyX3QgdGVtcDEgPSAwLCB0ZW1wMiA9IDA7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfdmZlX3BhcmFtc190IHZmZV9wYXJhbXM7Ci0KLQlDREJHKCJ2ZmUzMl9wcm9jX2dlbmVyYWw6IGNtZElEID0gJXMsIGxlbmd0aCA9ICVkXG4iLAotCQl2ZmUzMl9nZW5lcmFsX2NtZFtjbWQtPmlkXSwgY21kLT5sZW5ndGgpOwotCXN3aXRjaCAoY21kLT5pZCkgewotCWNhc2UgVkZFX0NNRF9SRVNFVDoKLQkJcHJfaW5mbygidmZlMzJfcHJvY19nZW5lcmFsOiBjbWRJRCA9ICVzXG4iLAotCQkJdmZlMzJfZ2VuZXJhbF9jbWRbY21kLT5pZF0pOwotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmVfcmVzZXRfZmxhZyA9IHRydWU7Ci0JCXZmZTMyX3Jlc2V0KHZmZTMyX2N0cmwpOwotCQlicmVhazsKLQljYXNlIFZGRV9DTURfU1RBUlQ6Ci0JCXByX2luZm8oInZmZTMyX3Byb2NfZ2VuZXJhbDogY21kSUQgPSAlc1xuIiwKLQkJCXZmZTMyX2dlbmVyYWxfY21kW2NtZC0+aWRdKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZmVfcGFyYW1zLAotCQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9jYW1lcmFfdmZlX3BhcmFtc190KSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSA9Ci0JCQl2ZmVfcGFyYW1zLm9wZXJhdGlvbl9tb2RlOwotCi0JCXJjID0gdmZlMzJfc3RhcnQocG1jdGwsIHZmZTMyX2N0cmwpOwotCQlicmVhazsKLQljYXNlIFZGRV9DTURfVVBEQVRFOgotCQl2ZmUzMl91cGRhdGUodmZlMzJfY3RybCk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9DQVBUVVJFX1JBVzoKLQkJcHJfaW5mbygiJXM6IGNtZElEID0gVkZFX0NNRF9DQVBUVVJFX1JBV1xuIiwgX19mdW5jX18pOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnZmZV9wYXJhbXMsCi0JCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2NhbWVyYV92ZmVfcGFyYW1zX3QpKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0KLQkJc25hcHNob3RfY250ID0gdmZlX3BhcmFtcy5jYXB0dXJlX2NvdW50OwotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgPQotCQkJdmZlX3BhcmFtcy5vcGVyYXRpb25fbW9kZTsKLQkJcmMgPSB2ZmUzMl9jYXB0dXJlX3JhdyhwbWN0bCwgdmZlMzJfY3RybCwgc25hcHNob3RfY250KTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX0NBUFRVUkU6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdmZlX3BhcmFtcywKLQkJCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fY2FtZXJhX3ZmZV9wYXJhbXNfdCkpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQotCQlzbmFwc2hvdF9jbnQgPSB2ZmVfcGFyYW1zLmNhcHR1cmVfY291bnQ7Ci0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSA9Ci0JCQl2ZmVfcGFyYW1zLm9wZXJhdGlvbl9tb2RlOwotCi0JCXJjID0gdmZlMzJfY2FwdHVyZShwbWN0bCwgc25hcHNob3RfY250LCB2ZmUzMl9jdHJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX1NUQVJUX1JFQ09SRElORzoKLQkJcHJfaW5mbygidmZlMzJfcHJvY19nZW5lcmFsOiBjbWRJRCA9ICVzXG4iLAotCQkJdmZlMzJfZ2VuZXJhbF9jbWRbY21kLT5pZF0pOwotCQlyYyA9IHZmZTMyX3N0YXJ0X3JlY29yZGluZyhwbWN0bCwgdmZlMzJfY3RybCk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9TVE9QX1JFQ09SRElORzoKLQkJcHJfaW5mbygidmZlMzJfcHJvY19nZW5lcmFsOiBjbWRJRCA9ICVzXG4iLAotCQkJdmZlMzJfZ2VuZXJhbF9jbWRbY21kLT5pZF0pOwotCQlyYyA9IHZmZTMyX3N0b3BfcmVjb3JkaW5nKHBtY3RsLCB2ZmUzMl9jdHJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX09QRVJBVElPTl9DRkc6IHsKLQkJaWYgKGNtZC0+bGVuZ3RoICE9IFYzMl9PUEVSQVRJT05fQ0ZHX0xFTikgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwID0ga21hbGxvYyhWMzJfT1BFUkFUSU9OX0NGR19MRU4sIEdGUF9BVE9NSUMpOwotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCVYzMl9PUEVSQVRJT05fQ0ZHX0xFTikpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJcmMgPSB2ZmUzMl9vcGVyYXRpb25fY29uZmlnKGNtZHAsIHZmZTMyX2N0cmwpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX1NUQVRTX0FFX1NUQVJUOiB7Ci0JCWlmICh2ZmUzMl91c2VfYmF5ZXJfc3RhdHModmZlMzJfY3RybCkpIHsKLQkJCS8qIEVycm9yICovCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCXJjID0gdmZlX3N0YXRzX2FlY19iZ19idWZfaW5pdCh2ZmUzMl9jdHJsKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogY2Fubm90IGNvbmZpZyBwaW5nL3BvbmcgYWRkcmVzcyBvZiBBRUMiLAotCQkJCSBfX2Z1bmNfXyk7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlvbGRfdmFsIHw9IEFFX0JHX0VOQUJMRV9NQVNLOwotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmUzMl9jbWRbY21kLT5pZF0ub2Zmc2V0LAotCQkJY21kcCwgKHZmZTMyX2NtZFtjbWQtPmlkXS5sZW5ndGgpKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFZGRV9DTURfU1RBVFNfQUZfU1RBUlQ6IHsKLQkJaWYgKHZmZTMyX3VzZV9iYXllcl9zdGF0cyh2ZmUzMl9jdHJsKSkgewotCQkJLyogRXJyb3IgKi8KLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJcmMgPSB2ZmVfc3RhdHNfYWZfYmZfYnVmX2luaXQodmZlMzJfY3RybCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGNhbm5vdCBjb25maWcgcGluZy9wb25nIGFkZHJlc3Mgb2YgQUYiLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9NT0RVTEVfQ0ZHKTsKLQkJb2xkX3ZhbCB8PSBBRl9CRl9FTkFCTEVfTUFTSzsKLQkJbXNtX2NhbWVyYV9pb193KG9sZF92YWwsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzJfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHAsICh2ZmUzMl9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX1NUQVRTX0FXQl9TVEFSVDogewotCQlpZiAodmZlMzJfdXNlX2JheWVyX3N0YXRzKHZmZTMyX2N0cmwpKSB7Ci0JCQkvKiBFcnJvciAqLwotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlyYyA9IHZmZV9zdGF0c19hd2JfYnVmX2luaXQodmZlMzJfY3RybCwgTlVMTCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGNhbm5vdCBjb25maWcgcGluZy9wb25nIGFkZHJlc3Mgb2YgQVdCIiwKLQkJCQkgX19mdW5jX18pOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJb2xkX3ZhbCB8PSBBV0JfRU5BQkxFX01BU0s7Ci0JCW1zbV9jYW1lcmFfaW9fdyhvbGRfdmFsLAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMyX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwLCAodmZlMzJfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX1NUQVRTX0lISVNUX1NUQVJUOiB7Ci0JCXJjID0gdmZlX3N0YXRzX2loaXN0X2J1Zl9pbml0KHZmZTMyX2N0cmwpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBjYW5ub3QgY29uZmlnIHBpbmcvcG9uZyBhZGRyZXNzIG9mIElISVNUIiwKLQkJCQkgX19mdW5jX18pOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJb2xkX3ZhbCB8PSBJSElTVF9FTkFCTEVfTUFTSzsKLQkJbXNtX2NhbWVyYV9pb193KG9sZF92YWwsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzJfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHAsICh2ZmUzMl9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQotCWNhc2UgVkZFX0NNRF9TVEFUU19SU19TVEFSVDogewotCQlyYyA9IHZmZV9zdGF0c19yc19idWZfaW5pdCh2ZmUzMl9jdHJsKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogY2Fubm90IGNvbmZpZyBwaW5nL3BvbmcgYWRkcmVzcyBvZiBSUyIsCi0JCQkJX19mdW5jX18pOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzJfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHAsICh2ZmUzMl9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfU1RBVFNfQ1NfU1RBUlQ6IHsKLQkJcmMgPSB2ZmVfc3RhdHNfY3NfYnVmX2luaXQodmZlMzJfY3RybCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGNhbm5vdCBjb25maWcgcGluZy9wb25nIGFkZHJlc3Mgb2YgQ1MiLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMyX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwLCAodmZlMzJfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX1NUQVRTX0JHX1NUQVJUOgotCWNhc2UgVkZFX0NNRF9TVEFUU19CRl9TVEFSVDoKLQljYXNlIFZGRV9DTURfU1RBVFNfQkhJU1RfU1RBUlQ6IHsKLQkJaWYgKCF2ZmUzMl91c2VfYmF5ZXJfc3RhdHModmZlMzJfY3RybCkpIHsKLQkJCS8qIEVycm9yICovCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX1NUQVRTX0NGRyk7Ci0JCW1vZHVsZV92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlpZiAoVkZFX0NNRF9TVEFUU19CR19TVEFSVCA9PSBjbWQtPmlkKSB7Ci0JCQltb2R1bGVfdmFsIHw9IEFFX0JHX0VOQUJMRV9NQVNLOwotCQkJb2xkX3ZhbCB8PSBTVEFUU19CR19FTkFCTEVfTUFTSzsKLQkJCXJjID0gdmZlX3N0YXRzX2FlY19iZ19idWZfaW5pdCh2ZmUzMl9jdHJsKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBjYW5ub3QgY29uZmlnIHBpbmcvcG9uZyBhZGRyZXNzIG9mIENTIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoVkZFX0NNRF9TVEFUU19CRl9TVEFSVCA9PSBjbWQtPmlkKSB7Ci0JCQltb2R1bGVfdmFsIHw9IEFGX0JGX0VOQUJMRV9NQVNLOwotCQkJb2xkX3ZhbCB8PSBTVEFUU19CRl9FTkFCTEVfTUFTSzsKLQkJCXJjID0gdmZlX3N0YXRzX2FmX2JmX2J1Zl9pbml0KHZmZTMyX2N0cmwpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6IGNhbm5vdCBjb25maWcgcGluZy9wb25nIGFkZHJlc3Mgb2YgQ1MiLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW1vZHVsZV92YWwgfD0gU0tJTl9CSElTVF9FTkFCTEVfTUFTSzsKLQkJCW9sZF92YWwgfD0gU1RBVFNfQkhJU1RfRU5BQkxFX01BU0s7Ci0JCQlyYyA9IHZmZV9zdGF0c19iaGlzdF9idWZfaW5pdCh2ZmUzMl9jdHJsKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBjYW5ub3QgY29uZmlnIHBpbmcvcG9uZyBhZGRyZXNzIG9mIENTIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCQl9Ci0JCX0KLQkJbXNtX2NhbWVyYV9pb193KG9sZF92YWwsIHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX1NUQVRTX0NGRyk7Ci0JCW1zbV9jYW1lcmFfaW9fdyhtb2R1bGVfdmFsLAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzJfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHAsICh2ZmUzMl9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX01DRV9VUERBVEU6Ci0JY2FzZSBWRkVfQ01EX01DRV9DRkc6ewotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCS8qIEluY3JlbWVudGluZyB3aXRoIDQgc28gYXMgdG8gcG9pbnQgdG8gdGhlIDJuZCBSZWdpc3RlciBhcwotCQl0aGUgMm5kIHJlZ2lzdGVyIGhhcyB0aGUgbWNlX2VuYWJsZSBiaXQgKi8KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVYzMl9DSFJPTUFfU1VQX09GRiArIDQpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0JCW5ld192YWwgPSAqY21kcF9sb2NhbDsKLQkJb2xkX3ZhbCAmPSBNQ0VfRU5fTUFTSzsKLQkJbmV3X3ZhbCA9IG5ld192YWwgfCBvbGRfdmFsOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVjMyX0NIUk9NQV9TVVBfT0ZGICsgNCwgJm5ld192YWwsIDQpOwotCQljbWRwX2xvY2FsICs9IDE7Ci0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVYzMl9DSFJPTUFfU1VQX09GRiArIDgpOwotCQluZXdfdmFsID0gKmNtZHBfbG9jYWw7Ci0JCW9sZF92YWwgJj0gTUNFX1FfS19NQVNLOwotCQluZXdfdmFsID0gbmV3X3ZhbCB8IG9sZF92YWw7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWMzJfQ0hST01BX1NVUF9PRkYgKyA4LCAmbmV3X3ZhbCwgNCk7Ci0JCWNtZHBfbG9jYWwgKz0gMTsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMyX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwX2xvY2FsLCAodmZlMzJfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9DSFJPTUFfU1VQX1VQREFURToKLQljYXNlIFZGRV9DTURfQ0hST01BX1NVUF9DRkc6ewotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwX2xvY2FsID0gY21kcDsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkodmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWMzJfQ0hST01BX1NVUF9PRkYsIGNtZHBfbG9jYWwsIDQpOwotCi0JCWNtZHBfbG9jYWwgKz0gMTsKLQkJbmV3X3ZhbCA9ICpjbWRwX2xvY2FsOwotCQkvKiBJbmNyZW1lbnRpbmcgd2l0aCA0IHNvIGFzIHRvIHBvaW50IHRvIHRoZSAybmQgUmVnaXN0ZXIgYXMKLQkJICogdGhlIDJuZCByZWdpc3RlciBoYXMgdGhlIG1jZV9lbmFibGUgYml0Ci0JCSAqLwotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVjMyX0NIUk9NQV9TVVBfT0ZGICsgNCk7Ci0JCW9sZF92YWwgJj0gfk1DRV9FTl9NQVNLOwotCQluZXdfdmFsID0gbmV3X3ZhbCB8IG9sZF92YWw7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWMzJfQ0hST01BX1NVUF9PRkYgKyA0LCAmbmV3X3ZhbCwgNCk7Ci0JCWNtZHBfbG9jYWwgKz0gMTsKLQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVjMyX0NIUk9NQV9TVVBfT0ZGICsgOCk7Ci0JCW5ld192YWwgPSAqY21kcF9sb2NhbDsKLQkJb2xkX3ZhbCAmPSB+TUNFX1FfS19NQVNLOwotCQluZXdfdmFsID0gbmV3X3ZhbCB8IG9sZF92YWw7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWMzJfQ0hST01BX1NVUF9PRkYgKyA4LCAmbmV3X3ZhbCwgNCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX0JMQUNLX0xFVkVMX0NGRzoKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCi0JY2FzZSBWRkVfQ01EX01FU0hfUk9MTF9PRkZfQ0ZHOiB7Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpICwgY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzJfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHBfbG9jYWwsIDE2KTsKLQkJY21kcF9sb2NhbCArPSA0OwotCQl2ZmUzMl9wcm9ncmFtX2RtaV9jZmcoUk9MTE9GRl9SQU0wX0JBTkswLCB2ZmUzMl9jdHJsKTsKLQkJLyogZm9yIGxvb3AgZm9yIGV4dHJjdGluZyBpbml0IHRhYmxlLiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgKFYzMl9NRVNIX1JPTExfT0ZGX0lOSVRfVEFCTEVfU0laRSAqIDIpOyBpKyspIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygqY21kcF9sb2NhbCAsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0RNSV9EQVRBX0xPKTsKLQkJCWNtZHBfbG9jYWwrKzsKLQkJfQotCQlDREJHKCJkb25lIHdyaXRpbmcgaW5pdCB0YWJsZVxuIik7Ci0JCS8qIGJ5IGRlZmF1bHQsIGFsd2F5cyBzdGFydHMgd2l0aCBvZmZzZXQgMC4gKi8KLQkJbXNtX2NhbWVyYV9pb193KFYzMl9NRVNIX1JPTExfT0ZGX0RFTFRBX1RBQkxFX09GRlNFVCwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfQUREUik7Ci0JCS8qIGZvciBsb29wIGZvciBleHRyYWN0aW5nIGRlbHRhIHRhYmxlLiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgKFYzMl9NRVNIX1JPTExfT0ZGX0RFTFRBX1RBQkxFX1NJWkUgKiAyKTsgaSsrKSB7Ci0JCQltc21fY2FtZXJhX2lvX3coKmNtZHBfbG9jYWwsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0RNSV9EQVRBX0xPKTsKLQkJCWNtZHBfbG9jYWwrKzsKLQkJfQotCQl2ZmUzMl9wcm9ncmFtX2RtaV9jZmcoTk9fTUVNX1NFTEVDVEVELCB2ZmUzMl9jdHJsKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9HRVRfTUVTSF9ST0xMT0ZGX1RBQkxFOgotCQl0ZW1wMSA9IHNpemVvZih1aW50MzJfdCkgKiAoKFYzMl9NRVNIX1JPTExfT0ZGX0lOSVRfVEFCTEVfU0laRSAqCi0JCQkyKSArIChWMzJfTUVTSF9ST0xMX09GRl9ERUxUQV9UQUJMRV9TSVpFICogMikpOwotCQlpZiAoY21kLT5sZW5ndGggIT0gdGVtcDEpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGt6YWxsb2ModGVtcDEsIEdGUF9LRVJORUwpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0JCXZmZTMyX3Byb2dyYW1fZG1pX2NmZyhST0xMT0ZGX1JBTTBfQkFOSzAsIHZmZTMyX2N0cmwpOwotCQlDREJHKCIlczogTWVzaCBSb2xsb2ZmIGluaXQgVGFibGVcbiIsIF9fZnVuY19fKTsKLQkJZm9yIChpID0gMDsgaSA8IChWMzJfTUVTSF9ST0xMX09GRl9JTklUX1RBQkxFX1NJWkUgKiAyKTsgaSsrKSB7Ci0JCQkqY21kcF9sb2NhbCA9Ci0JCQkJbXNtX2NhbWVyYV9pb19yKAotCQkJCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJVkZFX0RNSV9EQVRBX0xPKTsKLQkJCUNEQkcoIiVzOiAlMDh4XG4iLCBfX2Z1bmNfXywgKmNtZHBfbG9jYWwpOwotCQkJY21kcF9sb2NhbCsrOwotCQl9Ci0JCW1zbV9jYW1lcmFfaW9fdyhWMzJfTUVTSF9ST0xMX09GRl9ERUxUQV9UQUJMRV9PRkZTRVQsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0RNSV9BRERSKTsKLQkJQ0RCRygiJXM6IE1lc2ggUm9sbG9mZiBEZWx0YSBUYWJsZVxuIiwgX19mdW5jX18pOwotCQlmb3IgKGkgPSAwOyBpIDwgKFYzMl9NRVNIX1JPTExfT0ZGX0RFTFRBX1RBQkxFX1NJWkUgKiAyKTsgaSsrKSB7Ci0JCQkqY21kcF9sb2NhbCA9Ci0JCQkJbXNtX2NhbWVyYV9pb19yKAotCQkJCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJVkZFX0RNSV9EQVRBX0xPKTsKLQkJCUNEQkcoIiVzOiAlMDh4XG4iLCBfX2Z1bmNfXywgKmNtZHBfbG9jYWwpOwotCQkJY21kcF9sb2NhbCsrOwotCQl9Ci0JCUNEQkcoImRvbmUgcmVhZGluZyBkZWx0YSB0YWJsZVxuIik7Ci0JCXZmZTMyX3Byb2dyYW1fZG1pX2NmZyhOT19NRU1fU0VMRUNURUQsIHZmZTMyX2N0cmwpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwgY21kcCwKLQkJCXRlbXAxKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlicmVhazsKLQljYXNlIFZGRV9DTURfTEFfQ0ZHOgotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlMzJfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHBfbG9jYWwsICh2ZmUzMl9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0KLQkJY21kcF9sb2NhbCArPSAxOwotCQl2ZmUzMl93cml0ZV9sYV9jZmcoTFVNQV9BREFQVF9MVVRfUkFNX0JBTkswLAotCQkJCQkJICAgY21kcF9sb2NhbCwgdmZlMzJfY3RybCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0xBX1VQREFURTogewotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0KLQkJY21kcF9sb2NhbCA9IGNtZHAgKyAxOwotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFYzMl9MQV9PRkYpOwotCQlpZiAob2xkX3ZhbCAhPSAweDApCi0JCQl2ZmUzMl93cml0ZV9sYV9jZmcoTFVNQV9BREFQVF9MVVRfUkFNX0JBTkswLAotCQkJCWNtZHBfbG9jYWwsIHZmZTMyX2N0cmwpOwotCQllbHNlCi0JCQl2ZmUzMl93cml0ZV9sYV9jZmcoTFVNQV9BREFQVF9MVVRfUkFNX0JBTksxLAotCQkJCWNtZHBfbG9jYWwsIHZmZTMyX2N0cmwpOwotCQl9Ci0JCXZmZTMyX2N0cmwtPnVwZGF0ZV9sYSA9IHRydWU7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0dFVF9MQV9UQUJMRToKLQkJdGVtcDEgPSBzaXplb2YodWludDMyX3QpICogVkZFMzJfTEFfVEFCTEVfTEVOR1RIIC8gMjsKLQkJaWYgKGNtZC0+bGVuZ3RoICE9IHRlbXAxKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHAgPSBremFsbG9jKHRlbXAxLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQlpZiAobXNtX2NhbWVyYV9pb19yKHZmZTMyX2N0cmwtPgotCQkJCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWMzJfTEFfT0ZGKSkKLQkJCXZmZTMyX3Byb2dyYW1fZG1pX2NmZyhMVU1BX0FEQVBUX0xVVF9SQU1fQkFOSzEsCi0JCQkJCQl2ZmUzMl9jdHJsKTsKLQkJZWxzZQotCQkJdmZlMzJfcHJvZ3JhbV9kbWlfY2ZnKExVTUFfQURBUFRfTFVUX1JBTV9CQU5LMCwKLQkJCQkJCXZmZTMyX2N0cmwpOwotCQlmb3IgKGkgPSAwIDsgaSA8IChWRkUzMl9MQV9UQUJMRV9MRU5HVEggLyAyKSA7IGkrKykgewotCQkJKmNtZHBfbG9jYWwgPQotCQkJCW1zbV9jYW1lcmFfaW9fcigKLQkJCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJCVZGRV9ETUlfREFUQV9MTyk7Ci0JCQkqY21kcF9sb2NhbCB8PSAobXNtX2NhbWVyYV9pb19yKAotCQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCVZGRV9ETUlfREFUQV9MTykpIDw8IDE2OwotCQkJY21kcF9sb2NhbCsrOwotCQl9Ci0JCXZmZTMyX3Byb2dyYW1fZG1pX2NmZyhOT19NRU1fU0VMRUNURUQsIHZmZTMyX2N0cmwpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwgY21kcCwKLQkJCXRlbXAxKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlicmVhazsKLQljYXNlIFZGRV9DTURfU0tfRU5IQU5fQ0ZHOgotCWNhc2UgVkZFX0NNRF9TS19FTkhBTl9VUERBVEU6ewotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWMzJfU0NFX09GRiwKLQkJCWNtZHAsIFYzMl9TQ0VfTEVOKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9MSVZFU0hPVDoKLQkJLyogQ29uZmlndXJlIHByaW1hcnkgY2hhbm5lbCAqLwotCQl2ZmUzMl9zdGFydF9saXZlc2hvdChwbWN0bCwgdmZlMzJfY3RybCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0xJTkVBUklaQVRJT05fQ0ZHOgotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwgKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVjMyX0xJTkVBUklaQVRJT05fT0ZGMSwKLQkJCWNtZHBfbG9jYWwsIFYzMl9MSU5FQVJJWkFUSU9OX0xFTjEpOwotCQljbWRwX2xvY2FsICs9IDQ7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWMzJfTElORUFSSVpBVElPTl9PRkYyLAotCQkJY21kcF9sb2NhbCwgVjMyX0xJTkVBUklaQVRJT05fTEVOMik7Ci0KLQkJY21kcF9sb2NhbCA9IGNtZHAgKyAxNzsKLQkJdmZlMzJfd3JpdGVfbGluZWFyX2NmZyhCTEFDS19MVVRfUkFNX0JBTkswLAotCQkJCQljbWRwX2xvY2FsLCB2ZmUzMl9jdHJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfTElORUFSSVpBVElPTl9VUERBVEU6Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLCAodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0JCWNtZHBfbG9jYWwrKzsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVYzMl9MSU5FQVJJWkFUSU9OX09GRjEgKyA0LAotCQkJY21kcF9sb2NhbCwgKFYzMl9MSU5FQVJJWkFUSU9OX0xFTjEgLSA0KSk7Ci0JCWNtZHBfbG9jYWwgKz0gMzsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVYzMl9MSU5FQVJJWkFUSU9OX09GRjIsCi0JCQljbWRwX2xvY2FsLCBWMzJfTElORUFSSVpBVElPTl9MRU4yKTsKLQkJY21kcF9sb2NhbCA9IGNtZHAgKyAxNzsKLQkJLypleHRyYWN0aW5nIHRoZSBiYW5rIHNlbGVjdCovCi0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVjMyX0xJTkVBUklaQVRJT05fT0ZGMSk7Ci0KLQkJaWYgKG9sZF92YWwgIT0gMHgwKQotCQkJdmZlMzJfd3JpdGVfbGluZWFyX2NmZyhCTEFDS19MVVRfUkFNX0JBTkswLAotCQkJCQkJY21kcF9sb2NhbCwgdmZlMzJfY3RybCk7Ci0JCWVsc2UKLQkJCXZmZTMyX3dyaXRlX2xpbmVhcl9jZmcoQkxBQ0tfTFVUX1JBTV9CQU5LMSwKLQkJCQkJCWNtZHBfbG9jYWwsIHZmZTMyX2N0cmwpOwotCQl2ZmUzMl9jdHJsLT51cGRhdGVfbGluZWFyID0gdHJ1ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfR0VUX0xJTkVBUklaQVRPTl9UQUJMRToKLQkJdGVtcDEgPSBzaXplb2YodWludDMyX3QpICogVkZFMzJfTElORUFSSVpBVE9OX1RBQkxFX0xFTkdUSDsKLQkJaWYgKGNtZC0+bGVuZ3RoICE9IHRlbXAxKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHAgPSBremFsbG9jKHRlbXAxLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQlpZiAobXNtX2NhbWVyYV9pb19yKAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWMzJfTElORUFSSVpBVElPTl9PRkYxKSkKLQkJCXZmZTMyX3Byb2dyYW1fZG1pX2NmZyhCTEFDS19MVVRfUkFNX0JBTksxLCB2ZmUzMl9jdHJsKTsKLQkJZWxzZQotCQkJdmZlMzJfcHJvZ3JhbV9kbWlfY2ZnKEJMQUNLX0xVVF9SQU1fQkFOSzAsIHZmZTMyX2N0cmwpOwotCQlDREJHKCIlczogTGluZWFyaXphdGlvbiBUYWJsZVxuIiwgX19mdW5jX18pOwotCQlmb3IgKGkgPSAwIDsgaSA8IFZGRTMyX0xJTkVBUklaQVRPTl9UQUJMRV9MRU5HVEggOyBpKyspIHsKLQkJCSpjbWRwX2xvY2FsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCVZGRV9ETUlfREFUQV9MTyk7Ci0JCQlDREJHKCIlczogJTA4eFxuIiwgX19mdW5jX18sICpjbWRwX2xvY2FsKTsKLQkJCWNtZHBfbG9jYWwrKzsKLQkJfQotCQl2ZmUzMl9wcm9ncmFtX2RtaV9jZmcoTk9fTUVNX1NFTEVDVEVELCB2ZmUzMl9jdHJsKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksIGNtZHAsCi0JCQl0ZW1wMSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX0RFTU9TQUlDVjM6Ci0JCWlmIChjbWQtPmxlbmd0aCAhPQotCQkJVjMyX0RFTU9TQUlDVjNfMF9MRU4rVjMyX0RFTU9TQUlDVjNfMV9MRU4pIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0JCW5ld192YWwgPSAqY21kcF9sb2NhbDsKLQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFYzMl9ERU1PU0FJQ1YzXzBfT0ZGKTsKLQkJb2xkX3ZhbCAmPSBERU1PU0FJQ19NQVNLOwotCQluZXdfdmFsID0gbmV3X3ZhbCB8IG9sZF92YWw7Ci0JCSpjbWRwX2xvY2FsID0gbmV3X3ZhbDsKLQotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWMzJfREVNT1NBSUNWM18wX09GRiwKLQkJCWNtZHBfbG9jYWwsIFYzMl9ERU1PU0FJQ1YzXzBfTEVOKTsKLQkJY21kcF9sb2NhbCArPSAxOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWMzJfREVNT1NBSUNWM18xX09GRiwKLQkJCWNtZHBfbG9jYWwsIFYzMl9ERU1PU0FJQ1YzXzFfTEVOKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfREVNT1NBSUNWM19VUERBVEU6Ci0JCWlmIChjbWQtPmxlbmd0aCAhPQotCQkJVjMyX0RFTU9TQUlDVjNfMF9MRU4gKiBWMzJfREVNT1NBSUNWM19VUF9SRUdfQ05UKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQluZXdfdmFsID0gKmNtZHBfbG9jYWw7Ci0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWMzJfREVNT1NBSUNWM18wX09GRik7Ci0JCW9sZF92YWwgJj0gREVNT1NBSUNfTUFTSzsKLQkJbmV3X3ZhbCA9IG5ld192YWwgfCBvbGRfdmFsOwotCQkqY21kcF9sb2NhbCA9IG5ld192YWw7Ci0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjMyX0RFTU9TQUlDVjNfMF9PRkYsCi0JCQljbWRwX2xvY2FsLCBWMzJfREVNT1NBSUNWM18wX0xFTik7Ci0JCS8qIEFzIHRoZSBhZGRyZXNzIHNwYWNlIGlzIG5vdCBjb250aWd1b3VzIGluY3JlbWVudCBieSAyCi0JCSAqIGJlZm9yZSBjb3B5aW5nIHRvIG5leHQgYWRkcmVzcyBzcGFjZSAqLwotCQljbWRwX2xvY2FsICs9IDE7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFYzMl9ERU1PU0FJQ1YzXzFfT0ZGLAotCQkJY21kcF9sb2NhbCwgMiAqIFYzMl9ERU1PU0FJQ1YzXzBfTEVOKTsKLQkJLyogQXMgdGhlIGFkZHJlc3Mgc3BhY2UgaXMgbm90IGNvbnRpZ3VvdXMgaW5jcmVtZW50IGJ5IDIKLQkJICogYmVmb3JlIGNvcHlpbmcgdG8gbmV4dCBhZGRyZXNzIHNwYWNlICovCi0JCWNtZHBfbG9jYWwgKz0gMjsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjMyX0RFTU9TQUlDVjNfMl9PRkYsCi0JCQljbWRwX2xvY2FsLCAyICogVjMyX0RFTU9TQUlDVjNfMF9MRU4pOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9ERU1PU0FJQ1YzX0FCQ0NfQ0ZHOgotCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0RFTU9TQUlDVjNfQUJGX1VQREFURTovKiAxMTYgQUJGIHVwZGF0ZSAgKi8KLQljYXNlIFZGRV9DTURfREVNT1NBSUNWM19BQkZfQ0ZHOiB7IC8qIDEwOCBBQkYgY29uZmlnICAqLwotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwX2xvY2FsID0gY21kcDsKLQkJbmV3X3ZhbCA9ICpjbWRwX2xvY2FsOwotCi0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjMyX0RFTU9TQUlDVjNfMF9PRkYpOwotCQlvbGRfdmFsICY9IEFCRl9NQVNLOwotCQluZXdfdmFsID0gbmV3X3ZhbCB8IG9sZF92YWw7Ci0JCSpjbWRwX2xvY2FsID0gbmV3X3ZhbDsKLQotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWMzJfREVNT1NBSUNWM18wX09GRiwKLQkJCWNtZHBfbG9jYWwsIDQpOwotCi0JCWNtZHBfbG9jYWwgKz0gMTsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMyX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwX2xvY2FsLCAodmZlMzJfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0RFTU9TQUlDVjNfREJDQ19DRkc6Ci0JY2FzZSBWRkVfQ01EX0RFTU9TQUlDVjNfREJDQ19VUERBVEU6Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQluZXdfdmFsID0gKmNtZHBfbG9jYWw7Ci0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWMzJfREVNT1NBSUNWM18wX09GRik7Ci0JCW9sZF92YWwgJj0gREJDQ19NQVNLOwotCi0JCW5ld192YWwgPSBuZXdfdmFsIHwgb2xkX3ZhbDsKLQkJKmNtZHBfbG9jYWwgPSBuZXdfdmFsOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWMzJfREVNT1NBSUNWM18wX09GRiwKLQkJCWNtZHBfbG9jYWwsIDQpOwotCQljbWRwX2xvY2FsICs9IDE7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmUzMl9jbWRbY21kLT5pZF0ub2Zmc2V0LAotCQkJY21kcF9sb2NhbCwgKHZmZTMyX2NtZFtjbWQtPmlkXS5sZW5ndGgpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfREVNT1NBSUNWM19EQlBDX0NGRzoKLQljYXNlIFZGRV9DTURfREVNT1NBSUNWM19EQlBDX1VQREFURToKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0JCW5ld192YWwgPSAqY21kcF9sb2NhbDsKLQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFYzMl9ERU1PU0FJQ1YzXzBfT0ZGKTsKLQkJb2xkX3ZhbCAmPSBEQlBDX01BU0s7Ci0KLQkJbmV3X3ZhbCA9IG5ld192YWwgfCBvbGRfdmFsOwotCQkqY21kcF9sb2NhbCA9IG5ld192YWw7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVjMyX0RFTU9TQUlDVjNfMF9PRkYsCi0JCQljbWRwX2xvY2FsLCBWMzJfREVNT1NBSUNWM19MRU4pOwotCQljbWRwX2xvY2FsICs9IDE7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVjMyX0RFTU9TQUlDVjNfREJQQ19DRkdfT0ZGLAotCQkJY21kcF9sb2NhbCwgVjMyX0RFTU9TQUlDVjNfREJQQ19MRU4pOwotCQljbWRwX2xvY2FsICs9IDE7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVjMyX0RFTU9TQUlDVjNfREJQQ19DRkdfT0ZGMCwKLQkJCWNtZHBfbG9jYWwsIFYzMl9ERU1PU0FJQ1YzX0RCUENfTEVOKTsKLQkJY21kcF9sb2NhbCArPSAxOwotCQltc21fY2FtZXJhX2lvX21lbWNweSh2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVYzMl9ERU1PU0FJQ1YzX0RCUENfQ0ZHX09GRjEsCi0JCQljbWRwX2xvY2FsLCBWMzJfREVNT1NBSUNWM19EQlBDX0xFTik7Ci0JCWNtZHBfbG9jYWwgKz0gMTsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkodmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWMzJfREVNT1NBSUNWM19EQlBDX0NGR19PRkYyLAotCQkJY21kcF9sb2NhbCwgVjMyX0RFTU9TQUlDVjNfREJQQ19MRU4pOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9SR0JfR19DRkc6IHsKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjMyX1JHQl9HX09GRiwKLQkJCWNtZHAsIDQpOwotCQljbWRwICs9IDE7Ci0KLQkJdmZlMzJfd3JpdGVfZ2FtbWFfY2ZnKFJHQkxVVF9SQU1fQ0gwX0JBTkswLCBjbWRwLCB2ZmUzMl9jdHJsKTsKLQkJdmZlMzJfd3JpdGVfZ2FtbWFfY2ZnKFJHQkxVVF9SQU1fQ0gxX0JBTkswLCBjbWRwLCB2ZmUzMl9jdHJsKTsKLQkJdmZlMzJfd3JpdGVfZ2FtbWFfY2ZnKFJHQkxVVF9SQU1fQ0gyX0JBTkswLCBjbWRwLCB2ZmUzMl9jdHJsKTsKLQkJfQotCSAgICBjbWRwIC09IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX1JHQl9HX1VQREFURTogewotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwgKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWMzJfUkdCX0dfT0ZGKTsKLQkJY21kcCArPSAxOwotCQlpZiAob2xkX3ZhbCAhPSAweDApIHsKLQkJCXZmZTMyX3dyaXRlX2dhbW1hX2NmZygKLQkJCQlSR0JMVVRfUkFNX0NIMF9CQU5LMCwgY21kcCwgdmZlMzJfY3RybCk7Ci0JCQl2ZmUzMl93cml0ZV9nYW1tYV9jZmcoCi0JCQkJUkdCTFVUX1JBTV9DSDFfQkFOSzAsIGNtZHAsIHZmZTMyX2N0cmwpOwotCQkJdmZlMzJfd3JpdGVfZ2FtbWFfY2ZnKAotCQkJCVJHQkxVVF9SQU1fQ0gyX0JBTkswLCBjbWRwLCB2ZmUzMl9jdHJsKTsKLQkJfSBlbHNlIHsKLQkJCXZmZTMyX3dyaXRlX2dhbW1hX2NmZygKLQkJCQlSR0JMVVRfUkFNX0NIMF9CQU5LMSwgY21kcCwgdmZlMzJfY3RybCk7Ci0JCQl2ZmUzMl93cml0ZV9nYW1tYV9jZmcoCi0JCQkJUkdCTFVUX1JBTV9DSDFfQkFOSzEsIGNtZHAsIHZmZTMyX2N0cmwpOwotCQkJdmZlMzJfd3JpdGVfZ2FtbWFfY2ZnKAotCQkJCVJHQkxVVF9SQU1fQ0gyX0JBTksxLCBjbWRwLCB2ZmUzMl9jdHJsKTsKLQkJfQotCQl9Ci0JCXZmZTMyX2N0cmwtPnVwZGF0ZV9nYW1tYSA9IFRSVUU7Ci0JCWNtZHAgLT0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfR0VUX1JHQl9HX1RBQkxFOgotCQl0ZW1wMSA9IHNpemVvZih1aW50MzJfdCkgKiBWRkUzMl9HQU1NQV9OVU1fRU5UUklFUyAqIDM7Ci0JCWlmIChjbWQtPmxlbmd0aCAhPSB0ZW1wMSkgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwID0ga3phbGxvYyh0ZW1wMSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwX2xvY2FsID0gY21kcDsKLQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFYzMl9SR0JfR19PRkYpOwotCQl0ZW1wMiA9IG9sZF92YWwgPyBSR0JMVVRfUkFNX0NIMF9CQU5LMSA6Ci0JCQlSR0JMVVRfUkFNX0NIMF9CQU5LMDsKLQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQkJdmZlMzJfcmVhZF9nYW1tYV9jZmcodGVtcDIsCi0JCQkJY21kcF9sb2NhbCArIChWRkUzMl9HQU1NQV9OVU1fRU5UUklFUyAqIGkpLAotCQkJCXZmZTMyX2N0cmwpOwotCQkJdGVtcDIgKz0gMjsKLQkJfQotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwgY21kcCwKLQkJCXRlbXAxKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9TVEFUU19BV0JfU1RPUDogewotCQlpZiAodmZlMzJfdXNlX2JheWVyX3N0YXRzKHZmZTMyX2N0cmwpKSB7Ci0JCQkvKiBFcnJvciAqLwotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJb2xkX3ZhbCAmPSB+QVdCX0VOQUJMRV9NQVNLOwotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX1NUQVRTX0FFX1NUT1A6IHsKLQkJaWYgKHZmZTMyX3VzZV9iYXllcl9zdGF0cyh2ZmUzMl9jdHJsKSkgewotCQkJLyogRXJyb3IgKi8KLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgJj0gfkFFX0JHX0VOQUJMRV9NQVNLOwotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX1NUQVRTX0FGX1NUT1A6IHsKLQkJaWYgKHZmZTMyX3VzZV9iYXllcl9zdGF0cyh2ZmUzMl9jdHJsKSkgewotCQkJLyogRXJyb3IgKi8KLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgJj0gfkFGX0JGX0VOQUJMRV9NQVNLOwotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfU1RBVFNfSUhJU1RfU1RPUDogewotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJb2xkX3ZhbCAmPSB+SUhJU1RfRU5BQkxFX01BU0s7Ci0JCW1zbV9jYW1lcmFfaW9fdyhvbGRfdmFsLAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9TVEFUU19SU19TVE9QOiB7Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlvbGRfdmFsICY9IH5SU19FTkFCTEVfTUFTSzsKLQkJbXNtX2NhbWVyYV9pb193KG9sZF92YWwsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX1NUQVRTX0NTX1NUT1A6IHsKLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgJj0gfkNTX0VOQUJMRV9NQVNLOwotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfU1RBVFNfQkdfU1RPUDoKLQljYXNlIFZGRV9DTURfU1RBVFNfQkZfU1RPUDoKLQljYXNlIFZGRV9DTURfU1RBVFNfQkhJU1RfU1RPUDogewotCQlpZiAoIXZmZTMyX3VzZV9iYXllcl9zdGF0cyh2ZmUzMl9jdHJsKSkgewotCQkJLyogRXJyb3IgKi8KLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfU1RBVFNfQ0ZHKTsKLQkJaWYgKFZGRV9DTURfU1RBVFNfQkdfU1RPUCA9PSBjbWQtPmlkKQotCQkJb2xkX3ZhbCAmPSB+U1RBVFNfQkdfRU5BQkxFX01BU0s7Ci0JCWVsc2UgaWYgKFZGRV9DTURfU1RBVFNfQkZfU1RPUCA9PSBjbWQtPmlkKQotCQkJb2xkX3ZhbCAmPSB+U1RBVFNfQkZfRU5BQkxFX01BU0s7Ci0JCWVsc2UKLQkJCW9sZF92YWwgJj0gflNUQVRTX0JISVNUX0VOQUJMRV9NQVNLOwotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfU1RBVFNfQ0ZHKTsKLQkJaWYgKFZGRV9DTURfU1RBVFNfQkZfU1RPUCA9PSBjbWQtPmlkKSB7Ci0JCQlyYyA9IHZmZTMyX3N0YXRzX2ZsdXNoX2VucXVldWUodmZlMzJfY3RybCwKLQkJCQkJTVNNX1NUQVRTX1RZUEVfQkYpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6IGRxIHN0YXRzIGJ1ZiBlcnIgPSAlZCIsCi0JCQkJCSAgIF9fZnVuY19fLCByYyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCX0KLQkJfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9TVE9QOgotCQlwcl9pbmZvKCJ2ZmUzMl9wcm9jX2dlbmVyYWw6IGNtZElEID0gJXNcbiIsCi0JCQl2ZmUzMl9nZW5lcmFsX2NtZFtjbWQtPmlkXSk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdmZlX3BhcmFtcywKLQkJCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fY2FtZXJhX3ZmZV9wYXJhbXNfdCkpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQotCQl2ZmUzMl9zdG9wKHZmZTMyX2N0cmwpOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9TWU5DX1RJTUVSX1NFVFRJTkc6Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLCAodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJdmZlMzJfc3luY190aW1lcl9zdGFydChjbWRwLCB2ZmUzMl9jdHJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfTU9EVUxFX0NGRzogewotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQkqY21kcCAmPSB+U1RBVFNfRU5BQkxFX01BU0s7Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlvbGRfdmFsICY9IFNUQVRTX0VOQUJMRV9NQVNLOwotCQkqY21kcCB8PSBvbGRfdmFsOwotCi0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmUzMl9jbWRbY21kLT5pZF0ub2Zmc2V0LAotCQkJY21kcCwgKHZmZTMyX2NtZFtjbWQtPmlkXS5sZW5ndGgpKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9aU0w6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdmZlX3BhcmFtcywKLQkJCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fY2FtZXJhX3ZmZV9wYXJhbXNfdCkpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgPQotCQkJdmZlX3BhcmFtcy5vcGVyYXRpb25fbW9kZTsKLQotCQlyYyA9IHZmZTMyX3pzbChwbWN0bCwgdmZlMzJfY3RybCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0FTRl9DRkc6Ci0JY2FzZSBWRkVfQ01EX0FTRl9VUERBVEU6Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLCAodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMyX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwLCAodmZlMzJfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQljbWRwX2xvY2FsID0gY21kcCArIFYzMl9BU0ZfTEVOLzQ7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWMzJfQVNGX1NQRUNJQUxfRUZYX0NGR19PRkYsCi0JCQljbWRwX2xvY2FsLCBWMzJfQVNGX1NQRUNJQUxfRUZYX0NGR19MRU4pOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9QQ0FfUk9MTF9PRkZfQ0ZHOgotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSAsIGNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCi0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCi0JCXRlbXAxID0gKmNtZHBfbG9jYWw7Ci0JCWNtZHBfbG9jYWwrKzsKLQotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVjMzX1BDQV9ST0xMX09GRl9DRkdfT0ZGMSwKLQkJCWNtZHBfbG9jYWwsIFYzM19QQ0FfUk9MTF9PRkZfQ0ZHX0xFTjEpOwotCQljbWRwX2xvY2FsICs9IDQ7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWMzNfUENBX1JPTExfT0ZGX0NGR19PRkYyLAotCQkJY21kcF9sb2NhbCwgVjMzX1BDQV9ST0xMX09GRl9DRkdfTEVOMik7Ci0KLQkJY21kcF9sb2NhbCArPSAzOwotCQlDREJHKCIlczogc3RhcnQgd3JpdGluZyBSb2xsT2ZmIFJhbTAgdGFibGVcbiIsIF9fZnVuY19fKTsKLQkJdmZlMzJfcHJvZ3JhbV9kbWlfY2ZnKFJPTExPRkZfUkFNMF9CQU5LMCwgdmZlMzJfY3RybCk7Ci0JCW1zbV9jYW1lcmFfaW9fdyh0ZW1wMSwKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0FERFIpOwotCQlmb3IgKGkgPSAwIDsgaSA8IFYzM19QQ0FfUk9MTF9PRkZfVEFCTEVfU0laRSA7IGkrKykgewotCQkJbXNtX2NhbWVyYV9pb193KCooY21kcF9sb2NhbCArIDEpLAotCQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCVZGRTMzX0RNSV9EQVRBX0hJKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygqY21kcF9sb2NhbCwKLQkJCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQlWRkUzM19ETUlfREFUQV9MTyk7Ci0JCQljbWRwX2xvY2FsICs9IDI7Ci0JCX0KLQkJQ0RCRygiJXM6IGVuZCB3cml0aW5nIFJvbGxPZmYgUmFtMCB0YWJsZVxuIiwgX19mdW5jX18pOwotCi0JCUNEQkcoIiVzOiBzdGFydCB3cml0aW5nIFJvbGxPZmYgUmFtMSB0YWJsZVxuIiwgX19mdW5jX18pOwotCQl2ZmUzMl9wcm9ncmFtX2RtaV9jZmcoUk9MTE9GRl9SQU0xX0JBTkswLCB2ZmUzMl9jdHJsKTsKLQkJbXNtX2NhbWVyYV9pb193KHRlbXAxLAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfQUREUik7Ci0JCWZvciAoaSA9IDAgOyBpIDwgVjMzX1BDQV9ST0xMX09GRl9UQUJMRV9TSVpFIDsgaSsrKSB7Ci0JCQltc21fY2FtZXJhX2lvX3coKmNtZHBfbG9jYWwsCi0JCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFMzNfRE1JX0RBVEFfTE8pOwotCQkJY21kcF9sb2NhbCArPSAyOwotCQl9Ci0JCUNEQkcoIiVzOiBlbmQgd3JpdGluZyBSb2xsT2ZmIFJhbTEgdGFibGVcbiIsIF9fZnVuY19fKTsKLQotCQl2ZmUzMl9wcm9ncmFtX2RtaV9jZmcoTk9fTUVNX1NFTEVDVEVELCB2ZmUzMl9jdHJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfUENBX1JPTExfT0ZGX1VQREFURToKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksIGNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCi0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCi0JCXRlbXAxID0gKmNtZHBfbG9jYWw7Ci0JCWNtZHBfbG9jYWwgKz0gODsKLQotCQl0ZW1wMiA9IG1zbV9jYW1lcmFfaW9fcih2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVYzM19QQ0FfUk9MTF9PRkZfQ0ZHX09GRjEpCi0JCQkmIFYzM19QQ0FfUk9MTF9PRkZfTFVUX0JBTktfU0VMX01BU0s7Ci0KLQkJQ0RCRygiJXM6IHN0YXJ0IHdyaXRpbmcgUm9sbE9mZiBSYW0wIHRhYmxlXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmICh0ZW1wMikKLQkJCXZmZTMyX3Byb2dyYW1fZG1pX2NmZyhST0xMT0ZGX1JBTTBfQkFOSzAsIHZmZTMyX2N0cmwpOwotCQllbHNlCi0JCQl2ZmUzMl9wcm9ncmFtX2RtaV9jZmcoUk9MTE9GRl9SQU0wX0JBTksxLCB2ZmUzMl9jdHJsKTsKLQotCQltc21fY2FtZXJhX2lvX3codGVtcDEsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0RNSV9BRERSKTsKLQkJZm9yIChpID0gMCA7IGkgPCBWMzNfUENBX1JPTExfT0ZGX1RBQkxFX1NJWkUgOyBpKyspIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygqKGNtZHBfbG9jYWwgKyAxKSwKLQkJCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQlWRkUzM19ETUlfREFUQV9ISSk7Ci0JCQltc21fY2FtZXJhX2lvX3coKmNtZHBfbG9jYWwsCi0JCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFMzNfRE1JX0RBVEFfTE8pOwotCQkJY21kcF9sb2NhbCArPSAyOwotCQl9Ci0JCUNEQkcoIiVzOiBlbmQgd3JpdGluZyBSb2xsT2ZmIFJhbTAgdGFibGVcbiIsIF9fZnVuY19fKTsKLQotCQlDREJHKCIlczogc3RhcnQgd3JpdGluZyBSb2xsT2ZmIFJhbTEgdGFibGVcbiIsIF9fZnVuY19fKTsKLQkJaWYgKHRlbXAyKQotCQkJdmZlMzJfcHJvZ3JhbV9kbWlfY2ZnKFJPTExPRkZfUkFNMV9CQU5LMCwgdmZlMzJfY3RybCk7Ci0JCWVsc2UKLQkJCXZmZTMyX3Byb2dyYW1fZG1pX2NmZyhST0xMT0ZGX1JBTTFfQkFOSzEsIHZmZTMyX2N0cmwpOwotCi0JCW1zbV9jYW1lcmFfaW9fdyh0ZW1wMSwKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0FERFIpOwotCQlmb3IgKGkgPSAwIDsgaSA8IFYzM19QQ0FfUk9MTF9PRkZfVEFCTEVfU0laRSA7IGkrKykgewotCQkJbXNtX2NhbWVyYV9pb193KCpjbWRwX2xvY2FsLAotCQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCVZGRTMzX0RNSV9EQVRBX0xPKTsKLQkJCWNtZHBfbG9jYWwgKz0gMjsKLQkJfQotCQlDREJHKCIlczogZW5kIHdyaXRpbmcgUm9sbE9mZiBSYW0xIHRhYmxlXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJdmZlMzJfcHJvZ3JhbV9kbWlfY2ZnKE5PX01FTV9TRUxFQ1RFRCwgdmZlMzJfY3RybCk7Ci0JCXZmZTMyX2N0cmwtPnVwZGF0ZV9yb2xsb2ZmID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX0dFVF9QQ0FfUk9MTE9GRl9UQUJMRToKLQkJdGVtcDEgPSBzaXplb2YodWludDY0X3QpICogVjMzX1BDQV9ST0xMX09GRl9UQUJMRV9TSVpFICogMjsKLQkJaWYgKGNtZC0+bGVuZ3RoICE9IHRlbXAxKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHAgPSBremFsbG9jKHRlbXAxLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVjMzX1BDQV9ST0xMX09GRl9DRkdfT0ZGMSkgJgotCQkJVjMzX1BDQV9ST0xMX09GRl9MVVRfQkFOS19TRUxfTUFTSzsKLQotCQlpZiAob2xkX3ZhbCkKLQkJCXZmZTMyX3Byb2dyYW1fZG1pX2NmZyhST0xMT0ZGX1JBTTBfQkFOSzEsIHZmZTMyX2N0cmwpOwotCQllbHNlCi0JCQl2ZmUzMl9wcm9ncmFtX2RtaV9jZmcoUk9MTE9GRl9SQU0wX0JBTkswLCB2ZmUzMl9jdHJsKTsKLQotCQlDREJHKCIlczogUENBIFJvbGxvZmYgUmFtMFxuIiwgX19mdW5jX18pOwotCQlmb3IgKGkgPSAwIDsgaSA8IFYzM19QQ0FfUk9MTF9PRkZfVEFCTEVfU0laRSAqIDI7IGkrKykgewotCQkJdGVtcDIgPSAoaSA9PSAoVjMzX1BDQV9ST0xMX09GRl9UQUJMRV9TSVpFKSk7Ci0JCQlpZiAob2xkX3ZhbCAmJiB0ZW1wMikKLQkJCQl2ZmUzMl9wcm9ncmFtX2RtaV9jZmcoUk9MTE9GRl9SQU0xX0JBTksxLAotCQkJCXZmZTMyX2N0cmwpOwotCQkJZWxzZSBpZiAoIW9sZF92YWwgJiYgdGVtcDIpCi0JCQkJdmZlMzJfcHJvZ3JhbV9kbWlfY2ZnKFJPTExPRkZfUkFNMV9CQU5LMCwKLQkJCQl2ZmUzMl9jdHJsKTsKLQotCQkJKmNtZHBfbG9jYWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFMzNfRE1JX0RBVEFfTE8pOwotCQkJKihjbWRwX2xvY2FsICsgMSkgPQotCQkJCW1zbV9jYW1lcmFfaW9fcigKLQkJCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQlWRkUzM19ETUlfREFUQV9ISSk7Ci0JCQlDREJHKCIlczogJTA4eCUwOHhcbiIsIF9fZnVuY19fLAotCQkJCSooY21kcF9sb2NhbCArIDEpLCAqY21kcF9sb2NhbCk7Ci0JCQljbWRwX2xvY2FsICs9IDI7Ci0JCX0KLQkJdmZlMzJfcHJvZ3JhbV9kbWlfY2ZnKE5PX01FTV9TRUxFQ1RFRCwgdmZlMzJfY3RybCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLCBjbWRwLAotCQkJdGVtcDEpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9HRVRfSFdfVkVSU0lPTjoKLQkJaWYgKGNtZC0+bGVuZ3RoICE9IFYzMl9HRVRfSFdfVkVSU0lPTl9MRU4pIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGttYWxsb2MoVjMyX0dFVF9IV19WRVJTSU9OX0xFTiwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQkqY21kcCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UrVjMyX0dFVF9IV19WRVJTSU9OX09GRik7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLCBjbWRwLAotCQkJVjMyX0dFVF9IV19WRVJTSU9OX0xFTikpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX0dFVF9SRUdfRFVNUDoKLQkJdGVtcDEgPSBzaXplb2YodWludDMyX3QpICoKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnJlZ2lzdGVyX3RvdGFsOwotCQlpZiAoY21kLT5sZW5ndGggIT0gdGVtcDEpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGttYWxsb2ModGVtcDEsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJbXNtX2NhbWVyYV9pb19kdW1wKHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5yZWdpc3Rlcl90b3RhbCo0KTsKLQkJQ0RCRygiJXM6ICVwICVwICVkXG4iLCBfX2Z1bmNfXywgKHZvaWQgKiljbWRwLAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwgdGVtcDEpOwotCQltZW1jcHlfZnJvbWlvKCh2b2lkICopY21kcCwKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsIHRlbXAxKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksIGNtZHAsIHRlbXAxKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlicmVhazsKLQljYXNlIFZGRV9DTURfRlJBTUVfU0tJUF9DRkc6Ci0JCWlmIChjbWQtPmxlbmd0aCAhPSB2ZmUzMl9jbWRbY21kLT5pZF0ubGVuZ3RoKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJY21kcCA9IGttYWxsb2ModmZlMzJfY21kW2NtZC0+aWRdLmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigoY21kcCksICh2b2lkIF9fdXNlciAqKWNtZC0+dmFsdWUsCi0JCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlwcl9lcnIoIiVzIGNvcHkgZnJvbSB1c2VyIGZhaWxlZCBmb3IgY21kICVkIiwKLQkJCQlfX2Z1bmNfXywgY21kLT5pZCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmUzMl9jbWRbY21kLT5pZF0ub2Zmc2V0LAotCQkJY21kcCwgKHZmZTMyX2NtZFtjbWQtPmlkXS5sZW5ndGgpKTsKLQkJdmZlMzJfY3RybC0+ZnJhbWVfc2tpcF9jbnQgPSAoKHVpbnQzMl90KQotCQkJKmNtZHAgJiBWRkVfRlJBTUVfU0tJUF9QRVJJT0RfTUFTSykgKyAxOwotCQl2ZmUzMl9jdHJsLT5mcmFtZV9za2lwX3BhdHRlcm4gPSAodWludDMyX3QpKCooY21kcCArIDIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX1NUT1BfTElWRVNIT1Q6Ci0JCUNEQkcoIiVzIFN0b3BwaW5nIGxpdmVzaG90ICIsIF9fZnVuY19fKTsKLQkJdmZlMzJfc3RvcF9saXZlc2hvdChwbWN0bCwgdmZlMzJfY3RybCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWlmIChjbWQtPmxlbmd0aCAhPSB2ZmUzMl9jbWRbY21kLT5pZF0ubGVuZ3RoKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJY21kcCA9IGttYWxsb2ModmZlMzJfY21kW2NtZC0+aWRdLmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigoY21kcCksICh2b2lkIF9fdXNlciAqKWNtZC0+dmFsdWUsCi0JCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlwcl9lcnIoIiVzIGNvcHkgZnJvbSB1c2VyIGZhaWxlZCBmb3IgY21kICVkIiwKLQkJCQlfX2Z1bmNfXywgY21kLT5pZCk7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmUzMl9jbWRbY21kLT5pZF0ub2Zmc2V0LAotCQkJY21kcCwgKHZmZTMyX2NtZFtjbWQtPmlkXS5sZW5ndGgpKTsKLQkJYnJlYWs7Ci0KLQl9Ci0KLXByb2NfZ2VuZXJhbF9kb25lOgotCWtmcmVlKGNtZHApOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdmZlMzJfcmVhZF9pcnFfc3RhdHVzKAotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCwgc3RydWN0IHZmZTMyX2lycV9zdGF0dXMgKm91dCkKLXsKLQl1aW50MzJfdCAqdGVtcDsKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yoc3RydWN0IHZmZTMyX2lycV9zdGF0dXMpKTsKLQl0ZW1wID0gKHVpbnQzMl90ICopKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9TVEFUVVNfMCk7Ci0Jb3V0LT52ZmVJcnFTdGF0dXMwID0gbXNtX2NhbWVyYV9pb19yKHRlbXApOwotCi0JdGVtcCA9ICh1aW50MzJfdCAqKShheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfU1RBVFVTXzEpOwotCW91dC0+dmZlSXJxU3RhdHVzMSA9IG1zbV9jYW1lcmFfaW9fcih0ZW1wKTsKLQotCXRlbXAgPSAodWludDMyX3QgKikoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfQ0FNSUZfU1RBVFVTKTsKLQlvdXQtPmNhbWlmU3RhdHVzID0gbXNtX2NhbWVyYV9pb19yKHRlbXApOwotCUNEQkcoImNhbWlmU3RhdHVzICA9IDB4JXhcbiIsIG91dC0+Y2FtaWZTdGF0dXMpOwotCi0JLyogY2xlYXIgdGhlIHBlbmRpbmcgaW50ZXJydXB0IG9mIHRoZSBzYW1lIGtpbmQuKi8KLQltc21fY2FtZXJhX2lvX3cob3V0LT52ZmVJcnFTdGF0dXMwLAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ0xFQVJfMCk7Ci0JbXNtX2NhbWVyYV9pb193KG91dC0+dmZlSXJxU3RhdHVzMSwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NMRUFSXzEpOwotCi0JLyogRW5zdXJlIHRoZSB3cml0ZSBvcmRlciB3aGlsZSB3cml0aW5nCi0JdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdXNpbmcgdGhlIGJhcnJpZXIgKi8KLQltc21fY2FtZXJhX2lvX3dfbWIoMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NNRCk7Ci0KLX0KLQotdm9pZCBheGlfc3RvcF9waXgoc3RydWN0IHZmZV9zaGFyZV9jdHJsX3QgKnNoYXJlX2N0cmwsCi0JdWludDMyX3QgdmZlX21vZGUsIHVpbnQ4X3QgY21kX3R5cGUpCi17Ci0JdWludDMyX3QgcmVnX3VwZGF0ZSA9IDB4MTsKLQlzd2l0Y2ggKGNtZF90eXBlKSB7Ci0JY2FzZSBBWElfQ01EX1JBV19DQVBUVVJFOgotCQltc21fY2FtZXJhX2lvX3coMCwgc2hhcmVfY3RybC0+dmZlYmFzZQotCQkJKyB2ZmUzMl9BWElfV01fQ0ZHW3NoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDBdKTsKLQkJYnJlYWs7Ci0JY2FzZSBBWElfQ01EX1BSRVZJRVc6IHsKLQkJc3dpdGNoICh2ZmVfbW9kZSkgewotCQljYXNlIFZGRV9PVVRQVVRTX1BSRVZJRVc6Ci0JCWNhc2UgVkZFX09VVFBVVFNfUFJFVklFV19BTkRfVklERU86Ci0JCQlpZiAoc2hhcmVfY3RybC0+Y29tcF9vdXRwdXRfbW9kZSAmCi0JCQkJVkZFMzJfT1VUUFVUX01PREVfUFJJTUFSWSkgewotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlMzJfQVhJX1dNX0NGR1tzaGFyZV9jdHJsLT4KLQkJCQkJb3V0cGF0aC5vdXQwLmNoMF0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlMzJfQVhJX1dNX0NGR1tzaGFyZV9jdHJsLT4KLQkJCQkJb3V0cGF0aC5vdXQwLmNoMV0pOwotCQkJfSBlbHNlIGlmIChzaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICYKLQkJCQkJVkZFMzJfT1VUUFVUX01PREVfUFJJTUFSWV9BTExfQ0hOTFMpIHsKLQkJCQltc21fY2FtZXJhX2lvX3coMCwgc2hhcmVfY3RybC0+dmZlYmFzZQotCQkJCQkrIHZmZTMyX0FYSV9XTV9DRkdbc2hhcmVfY3RybC0+Ci0JCQkJCW91dHBhdGgub3V0MC5jaDBdKTsKLQkJCQltc21fY2FtZXJhX2lvX3coMCwgc2hhcmVfY3RybC0+dmZlYmFzZQotCQkJCQkrIHZmZTMyX0FYSV9XTV9DRkdbc2hhcmVfY3RybC0+Ci0JCQkJCW91dHBhdGgub3V0MC5jaDFdKTsKLQkJCQltc21fY2FtZXJhX2lvX3coMCwgc2hhcmVfY3RybC0+dmZlYmFzZQotCQkJCQkrIHZmZTMyX0FYSV9XTV9DRkdbc2hhcmVfY3RybC0+Ci0JCQkJCW91dHBhdGgub3V0MC5jaDJdKTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWYgKHNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgJgotCQkJCVZGRTMyX09VVFBVVF9NT0RFX1NFQ09OREFSWSkgewotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlMzJfQVhJX1dNX0NGR1tzaGFyZV9jdHJsLT4KLQkJCQkJb3V0cGF0aC5vdXQxLmNoMF0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlMzJfQVhJX1dNX0NGR1tzaGFyZV9jdHJsLT4KLQkJCQkJb3V0cGF0aC5vdXQxLmNoMV0pOwotCQkJfSBlbHNlIGlmIChzaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICYKLQkJCQlWRkUzMl9PVVRQVVRfTU9ERV9TRUNPTkRBUllfQUxMX0NITkxTKSB7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UKLQkJCQkJKyB2ZmUzMl9BWElfV01fQ0ZHW3NoYXJlX2N0cmwtPgotCQkJCQlvdXRwYXRoLm91dDEuY2gwXSk7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UKLQkJCQkJKyB2ZmUzMl9BWElfV01fQ0ZHW3NoYXJlX2N0cmwtPgotCQkJCQlvdXRwYXRoLm91dDEuY2gxXSk7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UKLQkJCQkJKyB2ZmUzMl9BWElfV01fQ0ZHW3NoYXJlX2N0cmwtPgotCQkJCQlvdXRwYXRoLm91dDEuY2gyXSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJCX0KLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpZiAoc2hhcmVfY3RybC0+Y29tcF9vdXRwdXRfbW9kZSAmCi0JCQlWRkUzMl9PVVRQVVRfTU9ERV9QUklNQVJZKSB7Ci0JCQltc21fY2FtZXJhX2lvX3coMCwgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlMzJfQVhJX1dNX0NGR1tzaGFyZV9jdHJsLT4KLQkJCQlvdXRwYXRoLm91dDAuY2gwXSk7Ci0JCQltc21fY2FtZXJhX2lvX3coMCwgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlMzJfQVhJX1dNX0NGR1tzaGFyZV9jdHJsLT4KLQkJCQlvdXRwYXRoLm91dDAuY2gxXSk7Ci0JCX0gZWxzZSBpZiAoc2hhcmVfY3RybC0+Y29tcF9vdXRwdXRfbW9kZSAmCi0JCQkJVkZFMzJfT1VUUFVUX01PREVfUFJJTUFSWV9BTExfQ0hOTFMpIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmUzMl9BWElfV01fQ0ZHW3NoYXJlX2N0cmwtPgotCQkJCW91dHBhdGgub3V0MC5jaDBdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmUzMl9BWElfV01fQ0ZHW3NoYXJlX2N0cmwtPgotCQkJCW91dHBhdGgub3V0MC5jaDFdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmUzMl9BWElfV01fQ0ZHW3NoYXJlX2N0cmwtPgotCQkJCW91dHBhdGgub3V0MC5jaDJdKTsKLQkJfQotCi0JCWlmIChzaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICYKLQkJCVZGRTMyX09VVFBVVF9NT0RFX1NFQ09OREFSWSkgewotCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMyX0FYSV9XTV9DRkdbc2hhcmVfY3RybC0+Ci0JCQkJb3V0cGF0aC5vdXQxLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMyX0FYSV9XTV9DRkdbc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMV0pOwotCQl9IGVsc2UgaWYgKHNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgJgotCQkJVkZFMzJfT1VUUFVUX01PREVfU0VDT05EQVJZX0FMTF9DSE5MUykgewotCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMyX0FYSV9XTV9DRkdbc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMyX0FYSV9XTV9DRkdbc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMV0pOwotCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMyX0FYSV9XTV9DRkdbc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMl0pOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCW1zbV9jYW1lcmFfaW9fd19tYihyZWdfdXBkYXRlLAotCQlzaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX1JFR19VUERBVEVfQ01EKTsKLX0KLQotdm9pZCBheGlfc3RvcF9yZGkwKHN0cnVjdCB2ZmVfc2hhcmVfY3RybF90ICpzaGFyZV9jdHJsKQotewotCXVpbnQzMl90IHJlZ191cGRhdGUgPSAweDI7Ci0JbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQl2ZmUzMl9BWElfV01fQ0ZHW3NoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5jaDBdKTsKLQltc21fY2FtZXJhX2lvX3dfbWIocmVnX3VwZGF0ZSwKLQkJc2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9SRUdfVVBEQVRFX0NNRCk7Ci19Ci0KLXZvaWQgYXhpX3N0b3BfcmRpMShzdHJ1Y3QgdmZlX3NoYXJlX2N0cmxfdCAqc2hhcmVfY3RybCkKLXsKLQl1aW50MzJfdCByZWdfdXBkYXRlID0gMHg0OwotCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJdmZlMzJfQVhJX1dNX0NGR1tzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDMuY2gwXSk7Ci0JbXNtX2NhbWVyYV9pb193X21iKHJlZ191cGRhdGUsCi0JCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkVHX1VQREFURV9DTUQpOwotfQotCi12b2lkIGF4aV9zdG9wX3Byb2Nlc3Moc3RydWN0IHZmZV9zaGFyZV9jdHJsX3QgKnNoYXJlX2N0cmwpCi17Ci0JdWludDMyX3QgdmZlX21vZGUgPQotCXNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmIH4oVkZFX09VVFBVVFNfUkRJMHwKLQkJVkZFX09VVFBVVFNfUkRJMSk7Ci0KLQlpZiAoc2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYgVkZFX09VVFBVVFNfUkRJMCkgewotCQlheGlfc3RvcF9yZGkwKHNoYXJlX2N0cmwpOwotCQlheGlfZGlzYWJsZV93bV9pcnEoc2hhcmVfY3RybCwKLQkJCVZGRTMyX09VVFBVVF9NT0RFX1RFUlRJQVJZMSk7Ci0JCXNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgJj0gflZGRTMyX09VVFBVVF9NT0RFX1RFUlRJQVJZMTsKLQkJc2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJj0KLQkJCX4oVkZFX09VVFBVVFNfUkRJMCk7Ci0JfQotCWlmIChzaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgJiBWRkVfT1VUUFVUU19SREkxKSB7Ci0JCWF4aV9zdG9wX3JkaTEoc2hhcmVfY3RybCk7Ci0JCWF4aV9kaXNhYmxlX3dtX2lycShzaGFyZV9jdHJsLAotCQkJVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkyKTsKLQkJc2hhcmVfY3RybC0+Y29tcF9vdXRwdXRfbW9kZSAmPSB+VkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkyOwotCQlzaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmPQotCQkJfihWRkVfT1VUUFVUU19SREkxKTsKLQl9Ci0JaWYgKHZmZV9tb2RlKSB7Ci0JCXVpbnQxNl90IG1vZGUgPSBzaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICYKLQkJCX4oVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkxfAotCQkJVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkyKTsKLQkJYXhpX3N0b3BfcGl4KHNoYXJlX2N0cmwsIHZmZV9tb2RlLCBzaGFyZV9jdHJsLT5jbWRfdHlwZSk7Ci0JCWF4aV9kaXNhYmxlX3dtX2lycShzaGFyZV9jdHJsLCBtb2RlKTsKLQkJc2hhcmVfY3RybC0+Y29tcF9vdXRwdXRfbW9kZSAmPQotCQkJCShWRkUzMl9PVVRQVVRfTU9ERV9URVJUSUFSWTF8Ci0JCQkJVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkyKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3Byb2Nlc3NfcmVnX3VwZGF0ZV9pcnEoCi0JCXN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgdmZlX3NoYXJlX2N0cmxfdCAqc2hhcmVfY3RybCA9IHZmZTMyX2N0cmwtPnNoYXJlX2N0cmw7Ci0JaWYgKGF0b21pY19yZWFkKAotCQkmc2hhcmVfY3RybC0+cGl4MF91cGRhdGVfYWNrX3BlbmRpbmcpID09IDIpIHsKLQkJdWludDMyX3QgdmZlX21vZGUgPQotCQkJCXNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYgfihWRkVfT1VUUFVUU19SREkwfAotCQkJCQlWRkVfT1VUUFVUU19SREkxKTsKLQotCQlpZiAoc2hhcmVfY3RybC0+ZHVhbF9lbmFibGVkICYmICFzaGFyZV9jdHJsLT51cGRhdGVfY291bnRlcikgewotCQkJYXhpX3N0b3BfcGl4KHNoYXJlX2N0cmwsIHZmZV9tb2RlLAotCQkJCXNoYXJlX2N0cmwtPmNtZF90eXBlKTsKLQkJCXNoYXJlX2N0cmwtPnVwZGF0ZV9jb3VudGVyKys7Ci0JCX0gZWxzZSB7Ci0JCQl1aW50MTZfdCBvdXRwdXRfbW9kZSA9Ci0JCQkJc2hhcmVfY3RybC0+Y29tcF9vdXRwdXRfbW9kZSAmCi0JCQkJfihWRkUzMl9PVVRQVVRfTU9ERV9URVJUSUFSWTF8Ci0JCQkJVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkyKTsKLQkJCXNoYXJlX2N0cmwtPnVwZGF0ZV9jb3VudGVyID0gMDsKLQkJCWlmICghc2hhcmVfY3RybC0+ZHVhbF9lbmFibGVkKQotCQkJCWF4aV9zdG9wX3BpeChzaGFyZV9jdHJsLCB2ZmVfbW9kZSwKLQkJCQkJc2hhcmVfY3RybC0+Y21kX3R5cGUpOwotCQkJYXhpX2Rpc2FibGVfd21faXJxKHNoYXJlX2N0cmwsIG91dHB1dF9tb2RlKTsKLQkJCWF4aV9kaXNhYmxlX2lycShzaGFyZV9jdHJsLCB2ZmVfbW9kZSk7Ci0JCQlhdG9taWNfc2V0KCZzaGFyZV9jdHJsLT5waXgwX3VwZGF0ZV9hY2tfcGVuZGluZywgMCk7Ci0JCQltc21fY2FtZXJhX2lvX3dfbWIoCi0JCQkJCUNBTUlGX0NPTU1BTkRfU1RPUF9BVF9GUkFNRV9CT1VOREFSWSwKLQkJCQkJc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJCVZGRV9DQU1JRl9DT01NQU5EKTsKLQkJCXZmZTMyX3NlbmRfaXNwX21zZygmdmZlMzJfY3RybC0+c3ViZGV2LAotCQkJCXNoYXJlX2N0cmwtPnZmZUZyYW1lSWQsCi0JCQkJTVNHX0lEX1BJWDBfVVBEQVRFX0FDSyk7Ci0JCQlzaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICY9Ci0JCQkJKFZGRTMyX09VVFBVVF9NT0RFX1RFUlRJQVJZMXwKLQkJCQlWRkUzMl9PVVRQVVRfTU9ERV9URVJUSUFSWTIpOwotCQl9Ci0JfSAgZWxzZSB7Ci0JCWlmIChzaGFyZV9jdHJsLT5yZWNvcmRpbmdfc3RhdGUgPT0gVkZFX1NUQVRFX1NUQVJUX1JFUVVFU1RFRCkgewotCQkJaWYgKHNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCQkJVkZFX09VVFBVVFNfVklERU9fQU5EX1BSRVZJRVcpIHsKLQkJCQltc21fY2FtZXJhX2lvX3coKAotCQkJCQkweDEgPDwgc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMCB8Ci0JCQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxKSwKLQkJCQkJc2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfQ01EKTsKLQkJCQltc21fY2FtZXJhX2lvX3coMSwKLQkJCQkJc2hhcmVfY3RybC0+dmZlYmFzZSArIHZmZTMyX0FYSV9XTV9DRkdbCi0JCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDBdKTsKLQkJCQltc21fY2FtZXJhX2lvX3coMSwKLQkJCQkJc2hhcmVfY3RybC0+dmZlYmFzZSArIHZmZTMyX0FYSV9XTV9DRkdbCi0JCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDFdKTsKLQkJCX0gZWxzZSBpZiAoc2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCQlWRkVfT1VUUFVUU19QUkVWSUVXX0FORF9WSURFTykgewotCQkJCW1zbV9jYW1lcmFfaW9fdygoCi0JCQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwIHwKLQkJCQkJMHgxIDw8IHNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDEpLAotCQkJCQlzaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19DTUQpOwotCQkJCW1zbV9jYW1lcmFfaW9fdygxLAotCQkJCQlzaGFyZV9jdHJsLT52ZmViYXNlICsgdmZlMzJfQVhJX1dNX0NGR1sKLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMF0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygxLAotCQkJCQlzaGFyZV9jdHJsLT52ZmViYXNlICsgdmZlMzJfQVhJX1dNX0NGR1sKLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMV0pOwotCQkJfQotCQkJc2hhcmVfY3RybC0+cmVjb3JkaW5nX3N0YXRlID0gVkZFX1NUQVRFX1NUQVJURUQ7Ci0JCQltc21fY2FtZXJhX2lvX3dfbWIoMSwKLQkJCQlzaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX1JFR19VUERBVEVfQ01EKTsKLQkJCUNEQkcoInN0YXJ0IHZpZGVvIHRyaWdnZXJlZCAuXG4iKTsKLQkJfSBlbHNlIGlmIChzaGFyZV9jdHJsLT5yZWNvcmRpbmdfc3RhdGUgPT0KLQkJCQkJVkZFX1NUQVRFX1NUT1BfUkVRVUVTVEVEKSB7Ci0JCQlpZiAoc2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCQlWRkVfT1VUUFVUU19WSURFT19BTkRfUFJFVklFVykgewotCQkJCW1zbV9jYW1lcmFfaW9fdygwLAotCQkJCQlzaGFyZV9jdHJsLT52ZmViYXNlICsgdmZlMzJfQVhJX1dNX0NGR1sKLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMF0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygwLAotCQkJCQlzaGFyZV9jdHJsLT52ZmViYXNlICsgdmZlMzJfQVhJX1dNX0NGR1sKLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMV0pOwotCQkJfSBlbHNlIGlmIChzaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmCi0JCQkJCVZGRV9PVVRQVVRTX1BSRVZJRVdfQU5EX1ZJREVPKSB7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDAsCi0JCQkJCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyB2ZmUzMl9BWElfV01fQ0ZHWwotCQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwXSk7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDAsCi0JCQkJCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyB2ZmUzMl9BWElfV01fQ0ZHWwotCQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxXSk7Ci0JCQl9Ci0JCQlDREJHKCJzdG9wIHZpZGVvIHRyaWdnZXJlZCAuXG4iKTsKLQkJfQotCi0JCWlmIChhdG9taWNfY21weGNoZygKLQkJJnNoYXJlX2N0cmwtPnBpeDBfdXBkYXRlX2Fja19wZW5kaW5nLCAxLCAwKSA9PSAxKSB7Ci0JCQlzaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlIHw9Ci0JCQkJKHNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUKLQkJCQkmIH4oVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkxfAotCQkJCQlWRkUzMl9PVVRQVVRfTU9ERV9URVJUSUFSWTIpKTsKLQkJCXZmZTMyX3NlbmRfaXNwX21zZygmdmZlMzJfY3RybC0+c3ViZGV2LAotCQkJCXNoYXJlX2N0cmwtPnZmZUZyYW1lSWQsIE1TR19JRF9QSVgwX1VQREFURV9BQ0spOwotCQl9IGVsc2UgewotCQkJaWYgKHNoYXJlX2N0cmwtPnJlY29yZGluZ19zdGF0ZSA9PQotCQkJCQkJVkZFX1NUQVRFX1NUT1BfUkVRVUVTVEVEKSB7Ci0JCQkJc2hhcmVfY3RybC0+cmVjb3JkaW5nX3N0YXRlID0gVkZFX1NUQVRFX1NUT1BQRUQ7Ci0JCQkJLyogcmVxdWVzdCBhIHJlZyB1cGRhdGUgYW5kIHNlbmQgU1RPUF9SRUNfQUNLCi0JCQkJICogd2hlbiB3ZSBwcm9jZXNzIHRoZSBuZXh0IHJlZyB1cGRhdGUgaXJxLgotCQkJCSAqLwotCQkJCW1zbV9jYW1lcmFfaW9fd19tYigxLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJCQlWRkVfUkVHX1VQREFURV9DTUQpOwotCQkJfSBlbHNlIGlmIChzaGFyZV9jdHJsLT5yZWNvcmRpbmdfc3RhdGUgPT0KLQkJCQkJCVZGRV9TVEFURV9TVE9QUEVEKSB7Ci0JCQkJdmZlMzJfc2VuZF9pc3BfbXNnKCZ2ZmUzMl9jdHJsLT5zdWJkZXYsCi0JCQkJCXNoYXJlX2N0cmwtPnZmZUZyYW1lSWQsCi0JCQkJCU1TR19JRF9TVE9QX1JFQ19BQ0spOwotCQkJCXNoYXJlX2N0cmwtPnJlY29yZGluZ19zdGF0ZSA9IFZGRV9TVEFURV9JRExFOwotCQkJfQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoCi0JCQkJJnNoYXJlX2N0cmwtPnVwZGF0ZV9hY2tfbG9jaywKLQkJCQlmbGFncyk7Ci0JCQlpZiAoc2hhcmVfY3RybC0+dXBkYXRlX2Fja19wZW5kaW5nID09IFRSVUUpIHsKLQkJCQlzaGFyZV9jdHJsLT51cGRhdGVfYWNrX3BlbmRpbmcgPSBGQUxTRTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAotCQkJCQkmc2hhcmVfY3RybC0+dXBkYXRlX2Fja19sb2NrLCBmbGFncyk7Ci0JCQkJdmZlMzJfc2VuZF9pc3BfbXNnKCZ2ZmUzMl9jdHJsLT5zdWJkZXYsCi0JCQkJCXNoYXJlX2N0cmwtPnZmZUZyYW1lSWQsCi0JCQkJCU1TR19JRF9VUERBVEVfQUNLKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKLQkJCQkJJnNoYXJlX2N0cmwtPnVwZGF0ZV9hY2tfbG9jaywgZmxhZ3MpOwotCQkJfQotCQl9Ci0KLQkJc3dpdGNoIChzaGFyZV9jdHJsLT5saXZlc2hvdF9zdGF0ZSkgewotCQljYXNlIFZGRV9TVEFURV9TVEFSVF9SRVFVRVNURUQ6Ci0JCQlDREJHKCIlcyBlbmFibGluZyBsaXZlc2hvdCBvdXRwdXRcbiIsIF9fZnVuY19fKTsKLQkJCWlmIChzaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICYKLQkJCQkJCVZGRTMyX09VVFBVVF9NT0RFX1BSSU1BUlkpIHsKLQkJCQltc21fY2FtZXJhX2lvX3coKAotCQkJCQkweDEgPDwgc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMCB8Ci0JCQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxKSwKLQkJCQkJc2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfQ01EKTsKLQkJCQltc21fY2FtZXJhX2lvX3coMSwgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJCXZmZTMyX0FYSV9XTV9DRkdbCi0JCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDBdKTsKLQkJCQltc21fY2FtZXJhX2lvX3coMSwgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJCXZmZTMyX0FYSV9XTV9DRkdbCi0JCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDFdKTsKLQotCQkJCXNoYXJlX2N0cmwtPmxpdmVzaG90X3N0YXRlID0KLQkJCQkJVkZFX1NUQVRFX1NUQVJURUQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBWRkVfU1RBVEVfU1RBUlRFRDoKLQkJCXNoYXJlX2N0cmwtPnZmZV9jYXB0dXJlX2NvdW50LS07Ci0JCQlpZiAoIXNoYXJlX2N0cmwtPnZmZV9jYXB0dXJlX2NvdW50ICYmCi0JCQkJKHNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgJgotCQkJCQlWRkUzMl9PVVRQVVRfTU9ERV9QUklNQVJZKSkgewotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJdmZlMzJfQVhJX1dNX0NGR1sKLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMF0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJdmZlMzJfQVhJX1dNX0NGR1sKLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMV0pOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgVkZFX1NUQVRFX1NUT1BfUkVRVUVTVEVEOgotCQkJaWYgKHNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgJgotCQkJCQlWRkUzMl9PVVRQVVRfTU9ERV9QUklNQVJZKSB7Ci0JCQkJLyogU3RvcCByZXF1ZXN0ZWQsIHN0b3Agd3JpdGUgbWFzdGVycywgYW5kCi0JCQkJICogdHJpZ2dlciBSRUdfVVBEQVRFLiBTZW5kIFNUT1BfTFNfQUNLIGluCi0JCQkJICogbmV4dCByZWcgdXBkYXRlLiAqLwotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJdmZlMzJfQVhJX1dNX0NGR1sKLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMF0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJdmZlMzJfQVhJX1dNX0NGR1sKLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMV0pOwotCi0JCQkJc2hhcmVfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPSBWRkVfU1RBVEVfU1RPUFBFRDsKLQkJCQltc21fY2FtZXJhX2lvX3dfbWIoMSwgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJCVZGRV9SRUdfVVBEQVRFX0NNRCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBWRkVfU1RBVEVfU1RPUFBFRDoKLQkJCUNEQkcoIiVzIFNlbmRpbmcgU1RPUF9MUyBBQ0tcbiIsIF9fZnVuY19fKTsKLQkJCXZmZTMyX3NlbmRfaXNwX21zZygmdmZlMzJfY3RybC0+c3ViZGV2LAotCQkJCXNoYXJlX2N0cmwtPnZmZUZyYW1lSWQsIE1TR19JRF9TVE9QX0xTX0FDSyk7Ci0JCQlzaGFyZV9jdHJsLT5saXZlc2hvdF9zdGF0ZSA9IFZGRV9TVEFURV9JRExFOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmICgoc2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJiBWRkVfT1VUUFVUU19USFVNQl9BTkRfTUFJTikgfHwKLQkJCShzaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmCi0JCQkJVkZFX09VVFBVVFNfTUFJTl9BTkRfVEhVTUIpIHx8Ci0JCQkoc2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9KUEVHKSB8fAotCQkJKHNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19KUEVHX0FORF9USFVNQikpIHsKLQkJCS8qIGluIHNuYXBzaG90IG1vZGUgKi8KLQkJCS8qIGxhdGVyIHdlIG5lZWQgdG8gYWRkIGNoZWNrIGZvciBsaXZlIHNuYXBzaG90IG1vZGUuICovCi0JCQlpZiAodmZlMzJfY3RybC0+ZnJhbWVfc2tpcF9wYXR0ZXJuICYgKDB4MSA8PAotCQkJCSh2ZmUzMl9jdHJsLT5zbmFwc2hvdF9mcmFtZV9jbnQgJQotCQkJCQl2ZmUzMl9jdHJsLT5mcmFtZV9za2lwX2NudCkpKSB7Ci0JCQkJc2hhcmVfY3RybC0+dmZlX2NhcHR1cmVfY291bnQtLTsKLQkJCQkvKiBpZiBsYXN0IGZyYW1lIHRvIGJlIGNhcHR1cmVkOiAqLwotCQkJCWlmIChzaGFyZV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudCA9PSAwKSB7Ci0JCQkJCS8qIHN0b3AgdGhlIGJ1cyBvdXRwdXQ6ICovCi0JCQkJCXVpbnQzMl90IHZmZV9tb2RlID0KLQkJCQkJCXNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCQkJCQl+KFZGRV9PVVRQVVRTX1JESTB8Ci0JCQkJCQkJVkZFX09VVFBVVFNfUkRJMSk7Ci0JCQkJCWF4aV9zdG9wX3BpeChzaGFyZV9jdHJsLCB2ZmVfbW9kZSwKLQkJCQkJCUFYSV9DTURfQ0FQVFVSRSk7Ci0JCQkJCW1zbV9jYW1lcmFfaW9fd19tYgotCQkJCQkoQ0FNSUZfQ09NTUFORF9TVE9QX0FUX0ZSQU1FX0JPVU5EQVJZLAotCQkJCQlzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJVkZFX0NBTUlGX0NPTU1BTkQpOwotCQkJCQl2ZmUzMl9jdHJsLT5zbmFwc2hvdF9mcmFtZV9jbnQgPSAtMTsKLQkJCQkJdmZlMzJfY3RybC0+ZnJhbWVfc2tpcF9jbnQgPSAzMTsKLQkJCQkJdmZlMzJfY3RybC0+ZnJhbWVfc2tpcF9wYXR0ZXJuID0KLQkJCQkJCQkJMHhmZmZmZmZmZjsKLQkJCQl9IC8qaWYgc25hcHNob3QgY291bnQgaXMgMCovCi0JCQl9IC8qaWYgZnJhbWUgaXMgbm90IGJlaW5nIGRyb3BwZWQqLwotCQkJdmZlMzJfY3RybC0+c25hcHNob3RfZnJhbWVfY250Kys7Ci0JCQkvKiB0aGVuIGRvIHJlZ191cGRhdGUuICovCi0JCQltc21fY2FtZXJhX2lvX3coMSwKLQkJCQlzaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX1JFR19VUERBVEVfQ01EKTsKLQkJfSAvKiBpZiBzbmFwc2hvdCBtb2RlLiAqLwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlMzJfcHJvY2Vzc19yZGkwX3JlZ191cGRhdGVfaXJxKAotCXN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwpCi17Ci0JaWYgKGF0b21pY19jbXB4Y2hnKAotCQkmdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+cmRpMF91cGRhdGVfYWNrX3BlbmRpbmcsIDEsIDApID09IDEpIHsKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+Y29tcF9vdXRwdXRfbW9kZSB8PQotCQkJVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkxOwotCQl2ZmUzMl9zZW5kX2lzcF9tc2coJnZmZTMyX2N0cmwtPnN1YmRldiwKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTBGcmFtZUlkLAotCQkJTVNHX0lEX1JESTBfVVBEQVRFX0FDSyk7Ci0JfQotCi0JaWYgKChhdG9taWNfcmVhZCgKLQkJJnZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTBfdXBkYXRlX2Fja19wZW5kaW5nKSA9PSAyKQotCQl8fCAodmZlMzJfY3RybC0+c2hhcmVfY3RybC0+cmRpMF9jYXB0dXJlX2NvdW50ID09IDApKSB7Ci0JCWF4aV9kaXNhYmxlX3dtX2lycSh2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLAotCQkJVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkxKTsKLQkJYXhpX2Rpc2FibGVfaXJxKHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwsIFZGRV9PVVRQVVRTX1JESTApOwotCQlhdG9taWNfc2V0KCZ2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5yZGkwX3VwZGF0ZV9hY2tfcGVuZGluZywgMCk7Ci0JCXZmZTMyX3NlbmRfaXNwX21zZygmdmZlMzJfY3RybC0+c3ViZGV2LAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+cmRpMEZyYW1lSWQsCi0JCQlNU0dfSURfUkRJMF9VUERBVEVfQUNLKTsKLQotCQlpZiAodmZlMzJfY3RybC0+c2hhcmVfY3RybC0+cmRpMF9jYXB0dXJlX2NvdW50ID09IDApCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5yZGkwX2NhcHR1cmVfY291bnQgPSAtMTsKLQkJaWYgKHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5jYXB0dXJlX2NudAotCQkJPT0gMCkKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5jYXB0dXJlX2NudCA9IC0xOwotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICY9Ci0JCQl+VkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkxOwotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmPQotCQkJfihWRkVfT1VUUFVUU19SREkwKTsKLQl9Ci0KLQlpZiAodmZlMzJfY3RybC0+c2hhcmVfY3RybC0+cmRpMF9jYXB0dXJlX2NvdW50ID4gMCkgewotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5yZGkwX2NhcHR1cmVfY291bnQtLTsKLQkJaWYgKCF2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5yZGkwX2NhcHR1cmVfY291bnQpCi0JCQlheGlfc3RvcF9yZGkwKHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlMzJfcHJvY2Vzc19yZGkxX3JlZ191cGRhdGVfaXJxKAotCXN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwpCi17Ci0KLQlpZiAoYXRvbWljX2NtcHhjaGcoCi0JCSZ2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5yZGkxX3VwZGF0ZV9hY2tfcGVuZGluZywgMSwgMCkKLQkJCQk9PSAxKSB7Ci0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgfD0KLQkJCVZGRTMyX09VVFBVVF9NT0RFX1RFUlRJQVJZMjsKLQkJdmZlMzJfc2VuZF9pc3BfbXNnKCZ2ZmUzMl9jdHJsLT5zdWJkZXYsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5yZGkxRnJhbWVJZCwKLQkJCU1TR19JRF9SREkxX1VQREFURV9BQ0spOwotCX0KLQotCWlmICgoYXRvbWljX3JlYWQoCi0JCSZ2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5yZGkxX3VwZGF0ZV9hY2tfcGVuZGluZykgPT0gMikKLQkJfHwgKHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTFfY2FwdHVyZV9jb3VudCA9PSAwKSkgewotCQlheGlfZGlzYWJsZV93bV9pcnEodmZlMzJfY3RybC0+c2hhcmVfY3RybCwKLQkJCVZGRTMyX09VVFBVVF9NT0RFX1RFUlRJQVJZMik7Ci0JCWF4aV9kaXNhYmxlX2lycSh2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLCBWRkVfT1VUUFVUU19SREkxKTsKLQkJYXRvbWljX3NldCgmdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+cmRpMV91cGRhdGVfYWNrX3BlbmRpbmcsIDApOwotCQl2ZmUzMl9zZW5kX2lzcF9tc2coJnZmZTMyX2N0cmwtPnN1YmRldiwKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTFGcmFtZUlkLAotCQkJTVNHX0lEX1JESTFfVVBEQVRFX0FDSyk7Ci0KLQkJaWYgKHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTFfY2FwdHVyZV9jb3VudCA9PSAwKQotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+cmRpMV9jYXB0dXJlX2NvdW50ID0gLTE7Ci0JCWlmICh2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDMuY2FwdHVyZV9jbnQKLQkJCT09IDApCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDMuY2FwdHVyZV9jbnQgPSAtMTsKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+Y29tcF9vdXRwdXRfbW9kZSAmPQotCQkJflZGRTMyX09VVFBVVF9NT0RFX1RFUlRJQVJZMjsKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJj0KLQkJCX4oVkZFX09VVFBVVFNfUkRJMSk7Ci0JfQotCi0JaWYgKHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTFfY2FwdHVyZV9jb3VudCA+IDApIHsKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+cmRpMV9jYXB0dXJlX2NvdW50LS07Ci0JCWlmICghdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+cmRpMV9jYXB0dXJlX2NvdW50KQotCQkJYXhpX3N0b3BfcmRpMSh2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3Byb2Nlc3NfcmVzZXRfaXJxKAotCQlzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmUzMl9jdHJsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlhdG9taWNfc2V0KCZ2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52c3RhdGUsIDApOwotCWF0b21pY19zZXQoJnZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPmhhbmRsZV9jb21tb25faXJxLCAwKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5zdG9wX2ZsYWdfbG9jaywgZmxhZ3MpOwotCWlmICh2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5zdG9wX2Fja19wZW5kaW5nKSB7Ci0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnN0b3BfYWNrX3BlbmRpbmcgPSBGQUxTRTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKLQkJCSZ2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5zdG9wX2ZsYWdfbG9jaywgZmxhZ3MpOwotCQlpZiAodmZlMzJfY3RybC0+c2hhcmVfY3RybC0+c3luY19hYm9ydCkKLQkJCWNvbXBsZXRlKCZ2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5yZXNldF9jb21wbGV0ZSk7Ci0JCWVsc2UKLQkJCXZmZTMyX3NlbmRfaXNwX21zZygmdmZlMzJfY3RybC0+c3ViZGV2LAotCQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZUZyYW1lSWQsCi0JCQkJTVNHX0lEX1NUT1BfQUNLKTsKLQl9IGVsc2UgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAotCQkJJnZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnN0b3BfZmxhZ19sb2NrLCBmbGFncyk7Ci0JCS8qIHRoaXMgaXMgZnJvbSByZXNldCBjb21tYW5kLiAqLwotCQl2ZmUzMl9yZXNldF9pbnRlcm5hbF92YXJpYWJsZXModmZlMzJfY3RybCk7Ci0JCWlmICh2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmVfcmVzZXRfZmxhZykgewotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlX3Jlc2V0X2ZsYWcgPSBmYWxzZTsKLQkJCW1zbV9jYW1lcmFfaW9fdygweDdGODAsCi0JCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfQ01EKTsKLQkJfSBlbHNlIHsKLQkJCS8qIHJlbG9hZCBhbGwgd3JpdGUgbWFzdGVycy4gKGZyYW1lICYgbGluZSkqLwotCQkJbXNtX2NhbWVyYV9pb193KDB4N0ZGRiwKLQkJCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19DTUQpOwotCQl9Ci0JCWNvbXBsZXRlKCZ2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5yZXNldF9jb21wbGV0ZSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMl9wcm9jZXNzX2NhbWlmX3NvZl9pcnEoCi0JCXN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwpCi17Ci0JaWYgKHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCVZGRV9PVVRQVVRTX1JBVykgewotCQlpZiAoYXRvbWljX2NtcHhjaGcoCi0JCQkmdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+cGl4MF91cGRhdGVfYWNrX3BlbmRpbmcsCi0JCQkJCTEsIDApID09IDEpIHsKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgfD0KLQkJCQkodmZlMzJfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZQotCQkJCSYgfihWRkUzMl9PVVRQVVRfTU9ERV9URVJUSUFSWTF8Ci0JCQkJVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkyKSk7Ci0JCQl2ZmUzMl9zZW5kX2lzcF9tc2coJnZmZTMyX2N0cmwtPnN1YmRldiwKLQkJCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmVGcmFtZUlkLAotCQkJCU1TR19JRF9QSVgwX1VQREFURV9BQ0spOwotCQl9Ci0KLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlX2NhcHR1cmVfY291bnQtLTsKLQkJLyogaWYgbGFzdCBmcmFtZSB0byBiZSBjYXB0dXJlZDogKi8KLQkJaWYgKHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZV9jYXB0dXJlX2NvdW50ID09IDApIHsKLQkJCS8qIEVuc3VyZSB0aGUgd3JpdGUgb3JkZXIgd2hpbGUgd3JpdGluZwotCQkJIHRvIHRoZSBjb21tYW5kIHJlZ2lzdGVyIHVzaW5nIHRoZSBiYXJyaWVyICovCi0JCQltc21fY2FtZXJhX2lvX3dfbWIoQ0FNSUZfQ09NTUFORF9TVE9QX0FUX0ZSQU1FX0JPVU5EQVJZLAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9DQU1JRl9DT01NQU5EKTsKLQkJfQotCX0gLyogaWYgcmF3IHNuYXBzaG90IG1vZGUuICovCi0JaWYgKCh2ZmUzMl9jdHJsLT5oZnJfbW9kZSAhPSBIRlJfTU9ERV9PRkYpICYmCi0JCSh2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJVkZFX01PREVfT0ZfT1BFUkFUSU9OX1ZJREVPKSAmJgotCQkodmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlRnJhbWVJZCAlCi0JCQl2ZmUzMl9jdHJsLT5oZnJfbW9kZSAhPSAwKSkgewotCQlpZiAodmZlMzJfY3RybC0+dmZlX3NvZl9jb3VudF9lbmFibGUpCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmVGcmFtZUlkKys7Ci0JCUNEQkcoIlNraXAgdGhlIFNPRiBub3RpZmljYXRpb24gd2hlbiBIRlIgZW5hYmxlZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHZmZTMyX2N0cmwtPnZmZV9zb2ZfY291bnRfZW5hYmxlKQotCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmVGcmFtZUlkKys7Ci0KLQl2ZmUzMl9zZW5kX2lzcF9tc2coJnZmZTMyX2N0cmwtPnN1YmRldiwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlRnJhbWVJZCwgTVNHX0lEX1NPRl9BQ0spOwotCUNEQkcoImNhbWlmX3NvZl9pcnEsIGZyYW1lSWQgPSAlZFxuIiwKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlRnJhbWVJZCk7Ci0KLQlpZiAodmZlMzJfY3RybC0+c3luY190aW1lcl9zdGF0ZSkgewotCQlpZiAodmZlMzJfY3RybC0+c3luY190aW1lcl9yZXBlYXRfY291bnQgPT0gMCkKLQkJCXZmZTMyX3N5bmNfdGltZXJfc3RvcCh2ZmUzMl9jdHJsKTsKLQkJZWxzZQotCQkJdmZlMzJfY3RybC0+c3luY190aW1lcl9yZXBlYXRfY291bnQtLTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3Byb2Nlc3NfZXJyb3JfaXJxKAotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCwgdWludDMyX3QgZXJyU3RhdHVzKQotewotCXVpbnQzMl90IHJlZ192YWx1ZTsKLQlpZiAoZXJyU3RhdHVzICYgVkZFMzJfSU1BU0tfVklPTEFUSU9OKSB7Ci0JCXByX2VycigidmZlMzJfaXJxOiB2aW9sYXRpb24gaW50ZXJydXB0XG4iKTsKLQkJcmVnX3ZhbHVlID0gbXNtX2NhbWVyYV9pb19yKAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfVklPTEFUSU9OX1NUQVRVUyk7Ci0JCXByX2VycigiJXM6IHZpb2xhdGlvblN0YXR1cyAgPSAweCV4XG4iLCBfX2Z1bmNfXywgcmVnX3ZhbHVlKTsKLQl9Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzJfSU1BU0tfQ0FNSUZfRVJST1IpIHsKLQkJcHJfZXJyKCJ2ZmUzMl9pcnE6IGNhbWlmIGVycm9yc1xuIik7Ci0JCXJlZ192YWx1ZSA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0NBTUlGX1NUQVRVUyk7Ci0JCXY0bDJfc3ViZGV2X25vdGlmeSgmYXhpX2N0cmwtPnN1YmRldiwKLQkJCU5PVElGWV9WRkVfQ0FNSUZfRVJST1IsICh2b2lkICopTlVMTCk7Ci0JCXByX2VycigiY2FtaWZTdGF0dXMgID0gMHgleFxuIiwgcmVnX3ZhbHVlKTsKLQkJdmZlMzJfc2VuZF9pc3BfbXNnKCZheGlfY3RybC0+c3ViZGV2LAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZUZyYW1lSWQsIE1TR19JRF9DQU1JRl9FUlJPUik7Ci0JfQotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMyX0lNQVNLX0JISVNUX09WV1IpCi0JCXByX2VycigidmZlMzJfaXJxOiBzdGF0cyBiaGlzdCBvdmVyd3JpdGVcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMyX0lNQVNLX1NUQVRTX0NTX09WV1IpCi0JCXByX2VycigidmZlMzJfaXJxOiBzdGF0cyBjcyBvdmVyd3JpdGVcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMyX0lNQVNLX1NUQVRTX0lISVNUX09WV1IpCi0JCXByX2VycigidmZlMzJfaXJxOiBzdGF0cyBpaGlzdCBvdmVyd3JpdGVcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMyX0lNQVNLX1JFQUxJR05fQlVGX1lfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMl9pcnE6IHJlYWxpZ24gYnVnIFkgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMyX0lNQVNLX1JFQUxJR05fQlVGX0NCX09WRkwpCi0JCXByX2VycigidmZlMzJfaXJxOiByZWFsaWduIGJ1ZyBDQiBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzJfSU1BU0tfUkVBTElHTl9CVUZfQ1JfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMl9pcnE6IHJlYWxpZ24gYnVnIENSIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMl9JTUFTS19TVEFUU19BRV9CR19CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMl9pcnE6IGFlL2JnIHN0YXRzIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzJfSU1BU0tfU1RBVFNfQUZfQkZfQlVTX09WRkwpCi0JCXByX2VycigidmZlMzJfaXJxOiBhZi9iZiBzdGF0cyBidXMgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMyX0lNQVNLX1NUQVRTX0FXQl9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMl9pcnE6IGF3YiBzdGF0cyBidXMgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMyX0lNQVNLX1NUQVRTX1JTX0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTMyX2lycTogcnMgc3RhdHMgYnVzIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMl9JTUFTS19TVEFUU19DU19CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmUzMl9pcnE6IGNzIHN0YXRzIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFMzJfSU1BU0tfU1RBVFNfSUhJU1RfQlVTX09WRkwpCi0JCXByX2VycigidmZlMzJfaXJxOiBpaGlzdCBzdGF0cyBidXMgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTMyX0lNQVNLX1NUQVRTX1NLSU5fQkhJU1RfQlVTX09WRkwpCi0JCXByX2VycigidmZlMzJfaXJxOiBza2luL2JoaXN0IHN0YXRzIGJ1cyBvdmVyZmxvd1xuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3Byb2Nlc3NfY29tbW9uX2Vycm9yX2lycSgKLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwsIHVpbnQzMl90IGVyclN0YXR1cykKLXsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMl9JTUFTS19JTUdfTUFTVF8wX0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTMyX2lycTogaW1hZ2UgbWFzdGVyIDAgYnVzIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMl9JTUFTS19JTUdfTUFTVF8xX0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTMyX2lycTogaW1hZ2UgbWFzdGVyIDEgYnVzIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMl9JTUFTS19JTUdfTUFTVF8yX0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTMyX2lycTogaW1hZ2UgbWFzdGVyIDIgYnVzIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMl9JTUFTS19JTUdfTUFTVF8zX0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTMyX2lycTogaW1hZ2UgbWFzdGVyIDMgYnVzIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMl9JTUFTS19JTUdfTUFTVF80X0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTMyX2lycTogaW1hZ2UgbWFzdGVyIDQgYnVzIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMl9JTUFTS19JTUdfTUFTVF81X0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTMyX2lycTogaW1hZ2UgbWFzdGVyIDUgYnVzIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMl9JTUFTS19JTUdfTUFTVF82X0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTMyX2lycTogaW1hZ2UgbWFzdGVyIDYgYnVzIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkUzMl9JTUFTS19BWElfRVJST1IpCi0JCXByX2VycigidmZlMzJfaXJxOiBheGkgZXJyb3JcbiIpOwotfQotCi0KLXN0YXRpYyB2b2lkIHZmZV9zZW5kX291dG1zZygKLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwsIHVpbnQ4X3QgbXNnaWQsCi0JdWludDMyX3QgY2gwX3BhZGRyLCB1aW50MzJfdCBjaDFfcGFkZHIsCi0JdWludDMyX3QgY2gyX3BhZGRyLCB1aW50MzJfdCBpbnN0X2hhbmRsZSkKLXsKLQlzdHJ1Y3QgaXNwX21zZ19vdXRwdXQgbXNnOwotCi0JbXNnLm91dHB1dF9pZCA9IG1zZ2lkOwotCW1zZy5idWYuaW5zdF9oYW5kbGUgPSBpbnN0X2hhbmRsZTsKLQltc2cuYnVmLmNoX3BhZGRyWzBdCT0gY2gwX3BhZGRyOwotCW1zZy5idWYuY2hfcGFkZHJbMV0JPSBjaDFfcGFkZHI7Ci0JbXNnLmJ1Zi5jaF9wYWRkclsyXQk9IGNoMl9wYWRkcjsKLQlzd2l0Y2ggKG1zZ2lkKSB7Ci0JY2FzZSBNU0dfSURfT1VUUFVUX1RFUlRJQVJZMToKLQkJbXNnLmZyYW1lQ291bnRlciA9IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZGkwRnJhbWVJZDsKLQkJYnJlYWs7Ci0JY2FzZSBNU0dfSURfT1VUUFVUX1RFUlRJQVJZMjoKLQkJbXNnLmZyYW1lQ291bnRlciA9IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZGkxRnJhbWVJZDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJbXNnLmZyYW1lQ291bnRlciA9IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmVGcmFtZUlkOwotCQlicmVhazsKLQl9Ci0KLQl2NGwyX3N1YmRldl9ub3RpZnkoJmF4aV9jdHJsLT5zdWJkZXYsCi0JCQlOT1RJRllfVkZFX01TR19PVVQsCi0JCQkmbXNnKTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3Byb2Nlc3Nfb3V0cHV0X3BhdGhfaXJxXzAoCi0Jc3RydWN0IGF4aV9jdHJsX3QgKmF4aV9jdHJsKQotewotCXVpbnQzMl90IHBpbmdfcG9uZzsKLQl1aW50MzJfdCBjaDBfcGFkZHIsIGNoMV9wYWRkciwgY2gyX3BhZGRyOwotCXVpbnQ4X3Qgb3V0X2Jvb2wgPSAwOwotCXN0cnVjdCBtc21fZnJlZV9idWYgKmZyZWVfYnVmID0gTlVMTDsKLQlmcmVlX2J1ZiA9IHZmZTMyX2NoZWNrX2ZyZWVfYnVmZmVyKFZGRV9NU0dfT1VUUFVUX0lSUSwKLQkJVkZFX01TR19PVVRQVVRfUFJJTUFSWSwgYXhpX2N0cmwpOwotCi0JLyogd2UgcmVuZGVyIGZyYW1lcyBpbiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0JMS4gQ29udGludW91cyBtb2RlIGFuZCB0aGUgZnJlZSBidWZmZXIgaXMgYXZhaWFsYWJsZS4KLQkyLiBJbiBzbmFwc2hvdCBzaG90IG1vZGUsIGZyZWUgYnVmZmVyIGlzIG5vdCBhbHdheXMgYXZhaWxhYmxlLgotCXdoZW4gcGVuZGluZyBzbmFwc2hvdCBjb3VudCBpcyA8PTEsICB0aGVuIG5vIG5lZWQgdG8gdXNlCi0JZnJlZSBidWZmZXIuCi0JKi8KLQlvdXRfYm9vbCA9ICgKLQkJKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmCi0JCQlWRkVfT1VUUFVUU19USFVNQl9BTkRfTUFJTiB8fAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJVkZFX09VVFBVVFNfTUFJTl9BTkRfVEhVTUIgfHwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9KUEVHIHx8Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmCi0JCQlWRkVfT1VUUFVUU19KUEVHX0FORF9USFVNQiB8fAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJVkZFX09VVFBVVFNfUkFXIHx8Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5saXZlc2hvdF9zdGF0ZSA9PQotCQkJVkZFX1NUQVRFX1NUQVJURUQgfHwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmxpdmVzaG90X3N0YXRlID09Ci0JCQlWRkVfU1RBVEVfU1RPUF9SRVFVRVNURUQgfHwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmxpdmVzaG90X3N0YXRlID09Ci0JCQlWRkVfU1RBVEVfU1RPUFBFRCkgJiYKLQkJKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudCA8PSAxKSkgfHwKLQkJCWZyZWVfYnVmOwotCi0JaWYgKG91dF9ib29sKSB7Ci0JCXBpbmdfcG9uZyA9IG1zbV9jYW1lcmFfaW9fcihheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfQlVTX1BJTkdfUE9OR19TVEFUVVMpOwotCi0JCS8qIENoYW5uZWwgMCovCi0JCWNoMF9wYWRkciA9IHZmZTMyX2dldF9jaF9hZGRyKAotCQkJcGluZ19wb25nLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwKTsKLQkJLyogQ2hhbm5lbCAxKi8KLQkJY2gxX3BhZGRyID0gdmZlMzJfZ2V0X2NoX2FkZHIoCi0JCQlwaW5nX3BvbmcsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDEpOwotCQkvKiBDaGFubmVsIDIqLwotCQljaDJfcGFkZHIgPSB2ZmUzMl9nZXRfY2hfYWRkcigKLQkJCXBpbmdfcG9uZywgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMik7Ci0KLQkJQ0RCRygib3V0cHV0IHBhdGggMCwgY2gwID0gMHgleCwgY2gxID0gMHgleCwgY2gyID0gMHgleFxuIiwKLQkJCWNoMF9wYWRkciwgY2gxX3BhZGRyLCBjaDJfcGFkZHIpOwotCQlpZiAoZnJlZV9idWYpIHsKLQkJCS8qIFkgY2hhbm5lbCAqLwotCQkJdmZlMzJfcHV0X2NoX2FkZHIocGluZ19wb25nLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMCwKLQkJCWZyZWVfYnVmLT5jaF9wYWRkclswXSk7Ci0JCQkvKiBDaHJvbWEgY2hhbm5lbCAqLwotCQkJdmZlMzJfcHV0X2NoX2FkZHIocGluZ19wb25nLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMSwKLQkJCWZyZWVfYnVmLT5jaF9wYWRkclsxXSk7Ci0JCQlpZiAoZnJlZV9idWYtPm51bV9wbGFuZXMgPiAyKQotCQkJCXZmZTMyX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsCi0JCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gyLAotCQkJCQlmcmVlX2J1Zi0+Y2hfcGFkZHJbMl0pOwotCQl9Ci0JCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9NQUlOIHx8Ci0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX01BSU5fQU5EX1RIVU1CIHx8Ci0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9KUEVHIHx8Ci0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX0pQRUdfQU5EX1RIVU1CIHx8Ci0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX1JBVyB8fAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmxpdmVzaG90X3N0YXRlID09Ci0JCQkJVkZFX1NUQVRFX1NUT1BQRUQpCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNhcHR1cmVfY250LS07Ci0KLQkJdmZlX3NlbmRfb3V0bXNnKGF4aV9jdHJsLAotCQkJTVNHX0lEX09VVFBVVF9QUklNQVJZLCBjaDBfcGFkZHIsCi0JCQljaDFfcGFkZHIsIGNoMl9wYWRkciwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuaW5zdF9oYW5kbGUpOwotCi0JfSBlbHNlIHsKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5mcmFtZV9kcm9wX2NudCsrOwotCQlDREJHKCJwYXRoX2lycV8wIC0gbm8gZnJlZSBidWZmZXIhXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3Byb2Nlc3Nfb3V0cHV0X3BhdGhfaXJxXzEoCi0Jc3RydWN0IGF4aV9jdHJsX3QgKmF4aV9jdHJsKQotewotCXVpbnQzMl90IHBpbmdfcG9uZzsKLQl1aW50MzJfdCBjaDBfcGFkZHIsIGNoMV9wYWRkciwgY2gyX3BhZGRyOwotCS8qIHRoaXMgbXVzdCBiZSBzbmFwc2hvdCBtYWluIGltYWdlIG91dHB1dC4gKi8KLQl1aW50OF90IG91dF9ib29sID0gMDsKLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmICpmcmVlX2J1ZiA9IE5VTEw7Ci0KLQlmcmVlX2J1ZiA9IHZmZTMyX2NoZWNrX2ZyZWVfYnVmZmVyKFZGRV9NU0dfT1VUUFVUX0lSUSwKLQkJVkZFX01TR19PVVRQVVRfU0VDT05EQVJZLCBheGlfY3RybCk7Ci0Jb3V0X2Jvb2wgPSAoKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmCi0JCQkJVkZFX09VVFBVVFNfVEhVTUJfQU5EX01BSU4gfHwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmCi0JCQkJVkZFX09VVFBVVFNfTUFJTl9BTkRfVEhVTUIgfHwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmCi0JCQkJVkZFX09VVFBVVFNfUkFXIHx8Ci0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX0pQRUdfQU5EX1RIVU1CKSAmJgotCQkJKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudCA8PSAxKSkgfHwKLQkJCQlmcmVlX2J1ZjsKLQotCWlmIChvdXRfYm9vbCkgewotCQlwaW5nX3BvbmcgPSBtc21fY2FtZXJhX2lvX3IoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0JVU19QSU5HX1BPTkdfU1RBVFVTKTsKLQotCQkvKiBZIGNoYW5uZWwgKi8KLQkJY2gwX3BhZGRyID0gdmZlMzJfZ2V0X2NoX2FkZHIocGluZ19wb25nLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMCk7Ci0JCS8qIENocm9tYSBjaGFubmVsICovCi0JCWNoMV9wYWRkciA9IHZmZTMyX2dldF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDEpOwotCQljaDJfcGFkZHIgPSB2ZmUzMl9nZXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gyKTsKLQotCQlDREJHKCIlcyBjaDAgPSAweCV4LCBjaDEgPSAweCV4LCBjaDIgPSAweCV4XG4iLAotCQkJX19mdW5jX18sIGNoMF9wYWRkciwgY2gxX3BhZGRyLCBjaDJfcGFkZHIpOwotCQlpZiAoZnJlZV9idWYpIHsKLQkJCS8qIFkgY2hhbm5lbCAqLwotCQkJdmZlMzJfcHV0X2NoX2FkZHIocGluZ19wb25nLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMCwKLQkJCWZyZWVfYnVmLT5jaF9wYWRkclswXSk7Ci0JCQkvKiBDaHJvbWEgY2hhbm5lbCAqLwotCQkJdmZlMzJfcHV0X2NoX2FkZHIocGluZ19wb25nLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSwKLQkJCWZyZWVfYnVmLT5jaF9wYWRkclsxXSk7Ci0JCQlpZiAoZnJlZV9idWYtPm51bV9wbGFuZXMgPiAyKQotCQkJCXZmZTMyX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsCi0JCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gyLAotCQkJCQlmcmVlX2J1Zi0+Y2hfcGFkZHJbMl0pOwotCQl9Ci0JCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9NQUlOIHx8Ci0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX01BSU5fQU5EX1RIVU1CIHx8Ci0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX1JBVyB8fAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19KUEVHX0FORF9USFVNQikKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2FwdHVyZV9jbnQtLTsKLQotCQl2ZmVfc2VuZF9vdXRtc2coYXhpX2N0cmwsCi0JCQlNU0dfSURfT1VUUFVUX1NFQ09OREFSWSwgY2gwX3BhZGRyLAotCQkJY2gxX3BhZGRyLCBjaDJfcGFkZHIsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmluc3RfaGFuZGxlKTsKLQotCX0gZWxzZSB7Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuZnJhbWVfZHJvcF9jbnQrKzsKLQkJQ0RCRygicGF0aF9pcnFfMSAtIG5vIGZyZWUgYnVmZmVyIVxuIik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMl9wcm9jZXNzX291dHB1dF9wYXRoX2lycV9yZGkwKAotCQkJc3RydWN0IGF4aV9jdHJsX3QgKmF4aV9jdHJsKQotewotCXVpbnQzMl90IHBpbmdfcG9uZzsKLQl1aW50MzJfdCBjaDBfcGFkZHIgPSAwOwotCS8qIHRoaXMgbXVzdCBiZSByZGkgaW1hZ2Ugb3V0cHV0LiAqLwotCXN0cnVjdCBtc21fZnJlZV9idWYgKmZyZWVfYnVmID0gTlVMTDsKLQkvKlJESTAqLwotCUNEQkcoInJkaTAgb3V0IGlycVxuIik7Ci0JaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmIFZGRV9PVVRQVVRTX1JESTApIHsKLQkJZnJlZV9idWYgPSB2ZmUzMl9jaGVja19mcmVlX2J1ZmZlcihWRkVfTVNHX09VVFBVVF9JUlEsCi0JCQlWRkVfTVNHX09VVFBVVF9URVJUSUFSWTEsIGF4aV9jdHJsKTsKLQkJaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDIuY2FwdHVyZV9jbnQgPiAwIHx8Ci0JCQkJCQkJZnJlZV9idWYpIHsKLQkJCXBpbmdfcG9uZyA9IG1zbV9jYW1lcmFfaW9fcihheGlfY3RybC0+Ci0JCQkJc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX0JVU19QSU5HX1BPTkdfU1RBVFVTKTsKLQotCQkJLyogWSBvbmx5IGNoYW5uZWwgKi8KLQkJCWNoMF9wYWRkciA9IHZmZTMyX2dldF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmNoMCk7Ci0KLQkJCXByX2RlYnVnKCIlcyBjaDAgPSAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBjaDBfcGFkZHIpOwotCi0JCQlpZiAoZnJlZV9idWYpCi0JCQkJdmZlMzJfcHV0X2NoX2FkZHIocGluZ19wb25nLAotCQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5jaDAsCi0JCQkJCWZyZWVfYnVmLT5jaF9wYWRkclswXSk7Ci0JCQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5jYXB0dXJlX2NudCA9PSAxKQotCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT4KLQkJCQkJb3V0cGF0aC5vdXQyLmNhcHR1cmVfY250ID0gMDsKLQotCQkJdmZlX3NlbmRfb3V0bXNnKGF4aV9jdHJsLAotCQkJCU1TR19JRF9PVVRQVVRfVEVSVElBUlkxLCBjaDBfcGFkZHIsCi0JCQkJMCwgMCwKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmluc3RfaGFuZGxlKTsKLQotCQl9IGVsc2UgewotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5mcmFtZV9kcm9wX2NudCsrOwotCQkJcHJfZXJyKCJwYXRoX2lycV8yIGlycSAtIG5vIGZyZWUgYnVmZmVyIGZvciByZGkwIVxuIik7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3Byb2Nlc3Nfb3V0cHV0X3BhdGhfaXJxX3JkaTEoCi0Jc3RydWN0IGF4aV9jdHJsX3QgKmF4aV9jdHJsKQotewotCXVpbnQzMl90IHBpbmdfcG9uZzsKLQl1aW50MzJfdCBjaDBfcGFkZHIgPSAwOwotCS8qIHRoaXMgbXVzdCBiZSByZGkgaW1hZ2Ugb3V0cHV0LiAqLwotCXN0cnVjdCBtc21fZnJlZV9idWYgKmZyZWVfYnVmID0gTlVMTDsKLQkvKlJESTEqLwotCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJiBWRkVfT1VUUFVUU19SREkxKSB7Ci0JCWZyZWVfYnVmID0gdmZlMzJfY2hlY2tfZnJlZV9idWZmZXIoVkZFX01TR19PVVRQVVRfSVJRLAotCQkJVkZFX01TR19PVVRQVVRfVEVSVElBUlkyLCBheGlfY3RybCk7Ci0JCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQzLmNhcHR1cmVfY250ID4gMCB8fAotCQkJCQkJCWZyZWVfYnVmKSB7Ci0JCQlwaW5nX3BvbmcgPSBtc21fY2FtZXJhX2lvX3IoYXhpX2N0cmwtPgotCQkJCXNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCVZGRV9CVVNfUElOR19QT05HX1NUQVRVUyk7Ci0KLQkJCS8qIFkgY2hhbm5lbCAqLwotCQkJY2gwX3BhZGRyID0gdmZlMzJfZ2V0X2NoX2FkZHIocGluZ19wb25nLAotCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLAotCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDMuY2gwKTsKLQkJCXByX2RlYnVnKCIlcyBjaDAgPSAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBjaDBfcGFkZHIpOwotCi0JCQlpZiAoZnJlZV9idWYpCi0JCQkJdmZlMzJfcHV0X2NoX2FkZHIocGluZ19wb25nLAotCQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0My5jaDAsCi0JCQkJCWZyZWVfYnVmLT5jaF9wYWRkclswXSk7Ci0JCQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPgotCQkJCQlvdXRwYXRoLm91dDMuY2FwdHVyZV9jbnQgPT0gMSkKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+Ci0JCQkJb3V0cGF0aC5vdXQzLmNhcHR1cmVfY250ID0gMDsKLQotCQkJdmZlX3NlbmRfb3V0bXNnKGF4aV9jdHJsLAotCQkJCU1TR19JRF9PVVRQVVRfVEVSVElBUlkyLCBjaDBfcGFkZHIsCi0JCQkJMCwgMCwKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQzLmluc3RfaGFuZGxlKTsKLQkJfSBlbHNlIHsKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDMuZnJhbWVfZHJvcF9jbnQrKzsKLQkJCXByX2VycigicGF0aF9pcnEgaXJxIC0gbm8gZnJlZSBidWZmZXIgZm9yIHJkaTEhXG4iKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHVpbnQzMl90ICB2ZmUzMl9wcm9jZXNzX3N0YXRzX2lycV9jb21tb24oCi0Jc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCwKLQl1aW50MzJfdCBzdGF0c051bSwgdWludDMyX3QgbmV3QWRkcikKLXsKLQl1aW50MzJfdCBwaW5ncG9uZ1N0YXR1czsKLQl1aW50MzJfdCByZXR1cm5BZGRyOwotCXVpbnQzMl90IHBpbmdwb25nQWRkcjsKLQotCS8qIG11c3QgYmUgMD1waW5nLCAxPXBvbmcgKi8KLQlwaW5ncG9uZ1N0YXR1cyA9Ci0JCSgobXNtX2NhbWVyYV9pb19yKHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1BJTkdfUE9OR19TVEFUVVMpKQotCSYgKCh1aW50MzJfdCkoMTw8KHN0YXRzTnVtICsgNykpKSkgPj4gKHN0YXRzTnVtICsgNyk7Ci0JLyogc3RhdHMgYml0cyBzdGFydHMgYXQgNyAqLwotCUNEQkcoInN0YXRzTnVtICVkLCBwaW5ncG9uZ1N0YXR1cyAlZFxuIiwgc3RhdHNOdW0sIHBpbmdwb25nU3RhdHVzKTsKLQlwaW5ncG9uZ0FkZHIgPQotCQkoKHVpbnQzMl90KSh2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQlWRkVfQlVTX1NUQVRTX1BJTkdfUE9OR19CQVNFKSkgKwotCQkJCSgzKnN0YXRzTnVtKSo0ICsgKDEtcGluZ3BvbmdTdGF0dXMpKjQ7Ci0JcmV0dXJuQWRkciA9IG1zbV9jYW1lcmFfaW9fcigodWludDMyX3QgKilwaW5ncG9uZ0FkZHIpOwotCW1zbV9jYW1lcmFfaW9fdyhuZXdBZGRyLCAodWludDMyX3QgKilwaW5ncG9uZ0FkZHIpOwotCXJldHVybiByZXR1cm5BZGRyOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfc2VuZF9zdGF0c19tc2coCi0Jc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCwKLQl1aW50MzJfdCBidWZBZGRyZXNzLCB1aW50MzJfdCBzdGF0c051bSkKLXsKLQlpbnQgcmMgPSAwOwotCXZvaWQgKnZhZGRyID0gTlVMTDsKLQkvKiBmaWxsIG1lc3NhZ2Ugd2l0aCByaWdodCBjb250ZW50LiAqLwotCS8qIEB0b2RvIFRoaXMgaXMgY2F1c2luZyBpc3N1ZXMsIG5lZWQgZnVydGhlciBpbnZlc3RpZ2F0ZSAqLwotCS8qIHNwaW5fbG9ja19pcnFzYXZlKCZjdHJsLT5zdGF0ZV9sb2NrLCBmbGFncyk7ICovCi0Jc3RydWN0IGlzcF9tc2dfc3RhdHMgbXNnU3RhdHM7Ci0JdWludDMyX3Qgc3RhdHNfdHlwZTsKLQltc2dTdGF0cy5mcmFtZUNvdW50ZXIgPSB2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmVGcmFtZUlkOwotCWlmICh2ZmUzMl9jdHJsLT5zaW11bHRhbmVvdXNfc29mX3N0YXQpCi0JCW1zZ1N0YXRzLmZyYW1lQ291bnRlci0tOwotCW1zZ1N0YXRzLmJ1ZmZlciA9IGJ1ZkFkZHJlc3M7Ci0Jc3dpdGNoIChzdGF0c051bSkgewotCWNhc2Ugc3RhdHNBZU51bTp7Ci0JCW1zZ1N0YXRzLmlkID0KLQkJCSghdmZlMzJfdXNlX2JheWVyX3N0YXRzKHZmZTMyX2N0cmwpKSA/IE1TR19JRF9TVEFUU19BRUMKLQkJCQk6IE1TR19JRF9TVEFUU19CRzsKLQkJc3RhdHNfdHlwZSA9Ci0JCQkoIXZmZTMyX3VzZV9iYXllcl9zdGF0cyh2ZmUzMl9jdHJsKSkgPwotCQkJCU1TTV9TVEFUU19UWVBFX0FFQyA6IE1TTV9TVEFUU19UWVBFX0JHOwotCQlyYyA9IHZmZTMyX2N0cmwtPnN0YXRzX29wcy5kaXNwYXRjaCgKLQkJCQl2ZmUzMl9jdHJsLT5zdGF0c19vcHMuc3RhdHNfY3RybCwKLQkJCQlzdGF0c190eXBlLCBidWZBZGRyZXNzLAotCQkJCSZtc2dTdGF0cy5idWZfaWR4LCAmdmFkZHIsICZtc2dTdGF0cy5mZCwKLQkJCQl2ZmUzMl9jdHJsLT5zdGF0c19vcHMuY2xpZW50KTsKLQkJfQotCQlicmVhazsKLQljYXNlIHN0YXRzQWZOdW06ewotCQltc2dTdGF0cy5pZCA9Ci0JCQkoIXZmZTMyX3VzZV9iYXllcl9zdGF0cyh2ZmUzMl9jdHJsKSkgPyBNU0dfSURfU1RBVFNfQUYKLQkJCQk6IE1TR19JRF9TVEFUU19CRjsKLQkJc3RhdHNfdHlwZSA9Ci0JCQkoIXZmZTMyX3VzZV9iYXllcl9zdGF0cyh2ZmUzMl9jdHJsKSkgPyBNU01fU1RBVFNfVFlQRV9BRgotCQkJCTogTVNNX1NUQVRTX1RZUEVfQkY7Ci0JCXJjID0gdmZlMzJfY3RybC0+c3RhdHNfb3BzLmRpc3BhdGNoKAotCQkJCXZmZTMyX2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsLAotCQkJCXN0YXRzX3R5cGUsIGJ1ZkFkZHJlc3MsCi0JCQkJJm1zZ1N0YXRzLmJ1Zl9pZHgsICZ2YWRkciwgJm1zZ1N0YXRzLmZkLAotCQkJCXZmZTMyX2N0cmwtPnN0YXRzX29wcy5jbGllbnQpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2Ugc3RhdHNBd2JOdW06IHsKLQkJbXNnU3RhdHMuaWQgPSBNU0dfSURfU1RBVFNfQVdCOwotCQlyYyA9IHZmZTMyX2N0cmwtPnN0YXRzX29wcy5kaXNwYXRjaCgKLQkJCQl2ZmUzMl9jdHJsLT5zdGF0c19vcHMuc3RhdHNfY3RybCwKLQkJCQlNU01fU1RBVFNfVFlQRV9BV0IsIGJ1ZkFkZHJlc3MsCi0JCQkJJm1zZ1N0YXRzLmJ1Zl9pZHgsICZ2YWRkciwgJm1zZ1N0YXRzLmZkLAotCQkJCXZmZTMyX2N0cmwtPnN0YXRzX29wcy5jbGllbnQpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBzdGF0c0loaXN0TnVtOiB7Ci0JCW1zZ1N0YXRzLmlkID0gTVNHX0lEX1NUQVRTX0lISVNUOwotCQlyYyA9IHZmZTMyX2N0cmwtPnN0YXRzX29wcy5kaXNwYXRjaCgKLQkJCQl2ZmUzMl9jdHJsLT5zdGF0c19vcHMuc3RhdHNfY3RybCwKLQkJCQlNU01fU1RBVFNfVFlQRV9JSElTVCwgYnVmQWRkcmVzcywKLQkJCQkmbXNnU3RhdHMuYnVmX2lkeCwgJnZhZGRyLCAmbXNnU3RhdHMuZmQsCi0JCQkJdmZlMzJfY3RybC0+c3RhdHNfb3BzLmNsaWVudCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBzdGF0c1JzTnVtOiB7Ci0JCW1zZ1N0YXRzLmlkID0gTVNHX0lEX1NUQVRTX1JTOwotCQlyYyA9IHZmZTMyX2N0cmwtPnN0YXRzX29wcy5kaXNwYXRjaCgKLQkJCQl2ZmUzMl9jdHJsLT5zdGF0c19vcHMuc3RhdHNfY3RybCwKLQkJCQlNU01fU1RBVFNfVFlQRV9SUywgYnVmQWRkcmVzcywKLQkJCQkmbXNnU3RhdHMuYnVmX2lkeCwgJnZhZGRyLCAmbXNnU3RhdHMuZmQsCi0JCQkJdmZlMzJfY3RybC0+c3RhdHNfb3BzLmNsaWVudCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBzdGF0c0NzTnVtOiB7Ci0JCW1zZ1N0YXRzLmlkID0gTVNHX0lEX1NUQVRTX0NTOwotCQlyYyA9IHZmZTMyX2N0cmwtPnN0YXRzX29wcy5kaXNwYXRjaCgKLQkJCQl2ZmUzMl9jdHJsLT5zdGF0c19vcHMuc3RhdHNfY3RybCwKLQkJCQlNU01fU1RBVFNfVFlQRV9DUywgYnVmQWRkcmVzcywKLQkJCQkmbXNnU3RhdHMuYnVmX2lkeCwgJnZhZGRyLCAmbXNnU3RhdHMuZmQsCi0JCQkJdmZlMzJfY3RybC0+c3RhdHNfb3BzLmNsaWVudCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBzdGF0c1NraW5OdW06IHsKLQkJbXNnU3RhdHMuaWQgPSBNU0dfSURfU1RBVFNfQkhJU1Q7Ci0JCXJjID0gdmZlMzJfY3RybC0+c3RhdHNfb3BzLmRpc3BhdGNoKAotCQkJCXZmZTMyX2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsLAotCQkJCU1TTV9TVEFUU19UWVBFX0JISVNULCBidWZBZGRyZXNzLAotCQkJCSZtc2dTdGF0cy5idWZfaWR4LCAmdmFkZHIsICZtc2dTdGF0cy5mZCwKLQkJCQl2ZmUzMl9jdHJsLT5zdGF0c19vcHMuY2xpZW50KTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWdvdG8gc3RhdHNfZG9uZTsKLQl9Ci0JaWYgKHJjID09IDApIHsKLQkJbXNnU3RhdHMuYnVmZmVyID0gKHVpbnQzMl90KXZhZGRyOwotCQl2NGwyX3N1YmRldl9ub3RpZnkoJnZmZTMyX2N0cmwtPnN1YmRldiwKLQkJCU5PVElGWV9WRkVfTVNHX1NUQVRTLAotCQkJJm1zZ1N0YXRzKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBwYWRkciB0byBpZHggbWFwcGluZyBlcnJvciwgc3RhdHNfaWQgPSAlZCwgcGFkZHIgPSAweCVkIiwKLQkJCSBfX2Z1bmNfXywgbXNnU3RhdHMuaWQsIG1zZ1N0YXRzLmJ1ZmZlcik7Ci0JfQotc3RhdHNfZG9uZToKLQkvKiBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHJsLT5zdGF0ZV9sb2NrLCBmbGFncyk7ICovCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfc2VuZF9jb21wX3N0YXRzX21zZygKLQlzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmUzMl9jdHJsLCB1aW50MzJfdCBzdGF0dXNfYml0cykKLXsKLQlzdHJ1Y3QgbXNtX3N0YXRzX2J1ZiBtc2dTdGF0czsKLQl1aW50MzJfdCB0ZW1wOwotCi0JbXNnU3RhdHMuZnJhbWVfaWQgPSB2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmVGcmFtZUlkOwotCWlmICh2ZmUzMl9jdHJsLT5zaW11bHRhbmVvdXNfc29mX3N0YXQpCi0JCW1zZ1N0YXRzLmZyYW1lX2lkLS07Ci0KLQltc2dTdGF0cy5zdGF0dXNfYml0cyA9IHN0YXR1c19iaXRzOwotCi0JbXNnU3RhdHMuYWVjLmJ1ZmYgPSB2ZmUzMl9jdHJsLT5hZWNiZ1N0YXRzQ29udHJvbC5idWZUb1JlbmRlcjsKLQltc2dTdGF0cy5hd2IuYnVmZiA9IHZmZTMyX2N0cmwtPmF3YlN0YXRzQ29udHJvbC5idWZUb1JlbmRlcjsKLQltc2dTdGF0cy5hZi5idWZmID0gdmZlMzJfY3RybC0+YWZiZlN0YXRzQ29udHJvbC5idWZUb1JlbmRlcjsKLQotCW1zZ1N0YXRzLmloaXN0LmJ1ZmYgPSB2ZmUzMl9jdHJsLT5paGlzdFN0YXRzQ29udHJvbC5idWZUb1JlbmRlcjsKLQltc2dTdGF0cy5ycy5idWZmID0gdmZlMzJfY3RybC0+cnNTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXI7Ci0JbXNnU3RhdHMuY3MuYnVmZiA9IHZmZTMyX2N0cmwtPmNzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyOwotCi0JdGVtcCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9TVEFUU19BV0JfU0dXX0NGRyk7Ci0JbXNnU3RhdHMuYXdiX3ltaW4gPSAoMHhGRjAwICYgdGVtcCkgPj4gODsKLQotCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlMzJfY3RybC0+c3ViZGV2LAotCQkJCU5PVElGWV9WRkVfTVNHX0NPTVBfU1RBVFMsCi0JCQkJJm1zZ1N0YXRzKTsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzJfcHJvY2Vzc19zdGF0c19hZV9iZ19pcnEoc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IGFkZHI7Ci0JdWludDMyX3Qgc3RhdHNfdHlwZTsKLQlzdGF0c190eXBlID0KLQkJKCF2ZmUzMl91c2VfYmF5ZXJfc3RhdHModmZlMzJfY3RybCkpID8gTVNNX1NUQVRTX1RZUEVfQUVDCi0JCQk6IE1TTV9TVEFUU19UWVBFX0JHOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMl9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlhZGRyID0gKHVpbnQzMl90KXZmZTMyX3N0YXRzX2RxYnVmKHZmZTMyX2N0cmwsIHN0YXRzX3R5cGUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmIChhZGRyKSB7Ci0JCXZmZTMyX2N0cmwtPmFlY2JnU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCXZmZTMyX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbih2ZmUzMl9jdHJsLCBzdGF0c0FlTnVtLAotCQkJYWRkcik7Ci0KLQkJdmZlX3NlbmRfc3RhdHNfbXNnKHZmZTMyX2N0cmwsCi0JCQl2ZmUzMl9jdHJsLT5hZWNiZ1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciwgc3RhdHNBZU51bSk7Ci0JfSBlbHNlewotCQl2ZmUzMl9jdHJsLT5hZWNiZ1N0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCUNEQkcoIiVzOiBkcm9wcGVkU3RhdHNGcmFtZUNvdW50ID0gJWQiLCBfX2Z1bmNfXywKLQkJCXZmZTMyX2N0cmwtPmFlY2JnU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlMzJfcHJvY2Vzc19zdGF0c19hd2JfaXJxKHN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50MzJfdCBhZGRyOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMl9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlhZGRyID0gKHVpbnQzMl90KXZmZTMyX3N0YXRzX2RxYnVmKHZmZTMyX2N0cmwsIE1TTV9TVEFUU19UWVBFX0FXQik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMzJfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKGFkZHIpIHsKLQkJdmZlMzJfY3RybC0+YXdiU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCXZmZTMyX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbih2ZmUzMl9jdHJsLCBzdGF0c0F3Yk51bSwKLQkJCWFkZHIpOwotCi0JCXZmZV9zZW5kX3N0YXRzX21zZyh2ZmUzMl9jdHJsLAotCQkJdmZlMzJfY3RybC0+YXdiU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyLCBzdGF0c0F3Yk51bSk7Ci0JfSBlbHNlewotCQl2ZmUzMl9jdHJsLT5hd2JTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCsrOwotCQlDREJHKCIlczogZHJvcHBlZFN0YXRzRnJhbWVDb3VudCA9ICVkIiwgX19mdW5jX18sCi0JCQl2ZmUzMl9jdHJsLT5hd2JTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB2ZmUzMl9wcm9jZXNzX3N0YXRzX2FmX2JmX2lycShzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmUzMl9jdHJsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdWludDMyX3QgYWRkcjsKLQl1aW50MzJfdCBzdGF0c190eXBlOwotCXN0YXRzX3R5cGUgPQotCQkoIXZmZTMyX3VzZV9iYXllcl9zdGF0cyh2ZmUzMl9jdHJsKSkgPyBNU01fU1RBVFNfVFlQRV9BRgotCQkJOiBNU01fU1RBVFNfVFlQRV9CRjsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMzJfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JYWRkciA9ICh1aW50MzJfdCl2ZmUzMl9zdGF0c19kcWJ1Zih2ZmUzMl9jdHJsLCBzdGF0c190eXBlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMl9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoYWRkcikgewotCQl2ZmUzMl9jdHJsLT5hZmJmU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCXZmZTMyX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbih2ZmUzMl9jdHJsLCBzdGF0c0FmTnVtLAotCQkJYWRkcik7Ci0KLQkJdmZlX3NlbmRfc3RhdHNfbXNnKHZmZTMyX2N0cmwsCi0JCQl2ZmUzMl9jdHJsLT5hZmJmU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyLCBzdGF0c0FmTnVtKTsKLQl9IGVsc2V7Ci0JCXZmZTMyX2N0cmwtPmFmYmZTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCsrOwotCQlDREJHKCIlczogZHJvcHBlZFN0YXRzRnJhbWVDb3VudCA9ICVkIiwgX19mdW5jX18sCi0JCQl2ZmUzMl9jdHJsLT5hZmJmU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlMzJfcHJvY2Vzc19zdGF0c19iaGlzdF9pcnEoc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IGFkZHI7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzJfc3RhdHNfZHFidWYodmZlMzJfY3RybCwgTVNNX1NUQVRTX1RZUEVfQkhJU1QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmIChhZGRyKSB7Ci0JCXZmZTMyX2N0cmwtPmJoaXN0U3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCXZmZTMyX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbih2ZmUzMl9jdHJsLAotCQkJCXN0YXRzU2tpbk51bSwgYWRkcik7Ci0KLQkJdmZlX3NlbmRfc3RhdHNfbXNnKHZmZTMyX2N0cmwsCi0JCQl2ZmUzMl9jdHJsLT5iaGlzdFN0YXRzQ29udHJvbC5idWZUb1JlbmRlciwKLQkJCXN0YXRzU2tpbk51bSk7Ci0JfSBlbHNlewotCQl2ZmUzMl9jdHJsLT5iaGlzdFN0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCUNEQkcoIiVzOiBkcm9wcGVkU3RhdHNGcmFtZUNvdW50ID0gJWQiLCBfX2Z1bmNfXywKLQkJCXZmZTMyX2N0cmwtPmJoaXN0U3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlMzJfcHJvY2Vzc19zdGF0c19paGlzdF9pcnEoc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IGFkZHI7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzJfc3RhdHNfZHFidWYodmZlMzJfY3RybCwgTVNNX1NUQVRTX1RZUEVfSUhJU1QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmIChhZGRyKSB7Ci0JCXZmZTMyX2N0cmwtPmloaXN0U3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCXZmZTMyX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbigKLQkJCXZmZTMyX2N0cmwsIHN0YXRzSWhpc3ROdW0sIGFkZHIpOwotCi0JCXZmZV9zZW5kX3N0YXRzX21zZyh2ZmUzMl9jdHJsLAotCQkJdmZlMzJfY3RybC0+aWhpc3RTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIsCi0JCQlzdGF0c0loaXN0TnVtKTsKLQl9IGVsc2UgewotCQl2ZmUzMl9jdHJsLT5paGlzdFN0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCUNEQkcoIiVzOiBkcm9wcGVkU3RhdHNGcmFtZUNvdW50ID0gJWQiLCBfX2Z1bmNfXywKLQkJCXZmZTMyX2N0cmwtPmloaXN0U3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlMzJfcHJvY2Vzc19zdGF0c19yc19pcnEoc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IGFkZHI7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlMzJfc3RhdHNfZHFidWYodmZlMzJfY3RybCwgTVNNX1NUQVRTX1RZUEVfUlMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmIChhZGRyKSB7Ci0JCXZmZTMyX2N0cmwtPnJzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCXZmZTMyX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbih2ZmUzMl9jdHJsLCBzdGF0c1JzTnVtLAotCQkJYWRkcik7Ci0KLQkJdmZlX3NlbmRfc3RhdHNfbXNnKHZmZTMyX2N0cmwsCi0JCQl2ZmUzMl9jdHJsLT5yc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciwgc3RhdHNSc051bSk7Ci0JfSBlbHNlIHsKLQkJdmZlMzJfY3RybC0+cnNTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCsrOwotCQlDREJHKCIlczogZHJvcHBlZFN0YXRzRnJhbWVDb3VudCA9ICVkIiwgX19mdW5jX18sCi0JCQl2ZmUzMl9jdHJsLT5yc1N0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3Byb2Nlc3Nfc3RhdHNfY3NfaXJxKHN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50MzJfdCBhZGRyOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUzMl9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlhZGRyID0gKHVpbnQzMl90KXZmZTMyX3N0YXRzX2RxYnVmKHZmZTMyX2N0cmwsIE1TTV9TVEFUU19UWVBFX0NTKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUzMl9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoYWRkcikgewotCQl2ZmUzMl9jdHJsLT5jc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9Ci0JCQl2ZmUzMl9wcm9jZXNzX3N0YXRzX2lycV9jb21tb24odmZlMzJfY3RybCwgc3RhdHNDc051bSwKLQkJCWFkZHIpOwotCi0JCQl2ZmVfc2VuZF9zdGF0c19tc2codmZlMzJfY3RybCwKLQkJCQl2ZmUzMl9jdHJsLT5jc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciwKLQkJCQlzdGF0c0NzTnVtKTsKLQl9IGVsc2UgewotCQl2ZmUzMl9jdHJsLT5jc1N0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCUNEQkcoIiVzOiBkcm9wcGVkU3RhdHNGcmFtZUNvdW50ID0gJWQiLCBfX2Z1bmNfXywKLQkJCXZmZTMyX2N0cmwtPmNzU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlMzJfcHJvY2Vzc19zdGF0cyhzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmUzMl9jdHJsLAotCXVpbnQzMl90IHN0YXR1c19iaXRzKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50MzJfdCBwcm9jZXNzX3N0YXRzID0gZmFsc2U7Ci0JdWludDMyX3QgYWRkcjsKLQl1aW50MzJfdCBzdGF0c190eXBlOwotCi0JQ0RCRygiJXMsIHN0YXRzID0gMHgleFxuIiwgX19mdW5jX18sIHN0YXR1c19iaXRzKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMzJfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0Jc3RhdHNfdHlwZSA9Ci0JCSghdmZlMzJfdXNlX2JheWVyX3N0YXRzKHZmZTMyX2N0cmwpKSA/IE1TTV9TVEFUU19UWVBFX0FFQwotCQkJOiBNU01fU1RBVFNfVFlQRV9CRzsKLQotCWlmIChzdGF0dXNfYml0cyAmIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19BRUNfQkcpIHsKLQkJYWRkciA9ICh1aW50MzJfdCl2ZmUzMl9zdGF0c19kcWJ1Zih2ZmUzMl9jdHJsLAotCQkJCXN0YXRzX3R5cGUpOwotCQlpZiAoYWRkcikgewotCQkJdmZlMzJfY3RybC0+YWVjYmdTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPQotCQkJCXZmZTMyX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbigKLQkJCQl2ZmUzMl9jdHJsLCBzdGF0c0FlTnVtLAlhZGRyKTsKLQkJCXByb2Nlc3Nfc3RhdHMgPSB0cnVlOwotCQl9IGVsc2V7Ci0JCQl2ZmUzMl9jdHJsLT5hZWNiZ1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JCQl2ZmUzMl9jdHJsLT5hZWNiZ1N0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCX0KLQl9IGVsc2UgewotCQl2ZmUzMl9jdHJsLT5hZWNiZ1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JfQotCi0JaWYgKHN0YXR1c19iaXRzICYgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0FXQikgewotCQlhZGRyID0gKHVpbnQzMl90KXZmZTMyX3N0YXRzX2RxYnVmKHZmZTMyX2N0cmwsCi0JCQlNU01fU1RBVFNfVFlQRV9BV0IpOwotCQlpZiAoYWRkcikgewotCQkJdmZlMzJfY3RybC0+YXdiU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCQl2ZmUzMl9wcm9jZXNzX3N0YXRzX2lycV9jb21tb24oCi0JCQkJdmZlMzJfY3RybCwgc3RhdHNBd2JOdW0sCi0JCQkJYWRkcik7Ci0JCQlwcm9jZXNzX3N0YXRzID0gdHJ1ZTsKLQkJfSBlbHNlewotCQkJdmZlMzJfY3RybC0+YXdiU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQrKzsKLQkJCXZmZTMyX2N0cmwtPmF3YlN0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JCX0KLQl9IGVsc2UgewotCQl2ZmUzMl9jdHJsLT5hd2JTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCX0KLQotCXN0YXRzX3R5cGUgPQotCQkoIXZmZTMyX3VzZV9iYXllcl9zdGF0cyh2ZmUzMl9jdHJsKSkgPyBNU01fU1RBVFNfVFlQRV9BRgotCQkJOiBNU01fU1RBVFNfVFlQRV9CRjsKLQlpZiAoc3RhdHVzX2JpdHMgJiBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQUZfQkYpIHsKLQkJYWRkciA9ICh1aW50MzJfdCl2ZmUzMl9zdGF0c19kcWJ1Zih2ZmUzMl9jdHJsLAotCQkJCQlzdGF0c190eXBlKTsKLQkJaWYgKGFkZHIpIHsKLQkJCXZmZTMyX2N0cmwtPmFmYmZTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPQotCQkJCXZmZTMyX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbigKLQkJCQl2ZmUzMl9jdHJsLCBzdGF0c0FmTnVtLAotCQkJCWFkZHIpOwotCQkJcHJvY2Vzc19zdGF0cyA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQl2ZmUzMl9jdHJsLT5hZmJmU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0gMDsKLQkJCXZmZTMyX2N0cmwtPmFmYmZTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCsrOwotCQl9Ci0JfSBlbHNlIHsKLQkJdmZlMzJfY3RybC0+YWZiZlN0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JfQotCi0JaWYgKHN0YXR1c19iaXRzICYgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0lISVNUKSB7Ci0JCWFkZHIgPSAodWludDMyX3QpdmZlMzJfc3RhdHNfZHFidWYodmZlMzJfY3RybCwKLQkJCQkJTVNNX1NUQVRTX1RZUEVfSUhJU1QpOwotCQlpZiAoYWRkcikgewotCQkJdmZlMzJfY3RybC0+aWhpc3RTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPQotCQkJCXZmZTMyX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbigKLQkJCQl2ZmUzMl9jdHJsLCBzdGF0c0loaXN0TnVtLAotCQkJCWFkZHIpOwotCQkJcHJvY2Vzc19zdGF0cyA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQl2ZmUzMl9jdHJsLT5paGlzdFN0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCQl2ZmUzMl9jdHJsLT5paGlzdFN0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JCX0KLQl9IGVsc2UgewotCQl2ZmUzMl9jdHJsLT5paGlzdFN0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JfQotCi0JaWYgKHN0YXR1c19iaXRzICYgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX1JTKSB7Ci0JCWFkZHIgPSAodWludDMyX3QpdmZlMzJfc3RhdHNfZHFidWYodmZlMzJfY3RybCwKLQkJCQkJTVNNX1NUQVRTX1RZUEVfUlMpOwotCQlpZiAoYWRkcikgewotCQkJdmZlMzJfY3RybC0+cnNTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPQotCQkJCXZmZTMyX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbigKLQkJCQl2ZmUzMl9jdHJsLCBzdGF0c1JzTnVtLAotCQkJCWFkZHIpOwotCQkJcHJvY2Vzc19zdGF0cyA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQl2ZmUzMl9jdHJsLT5yc1N0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCQl2ZmUzMl9jdHJsLT5yc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JCX0KLQl9IGVsc2UgewotCQl2ZmUzMl9jdHJsLT5yc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JfQotCi0JaWYgKHN0YXR1c19iaXRzICYgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0NTKSB7Ci0JCWFkZHIgPSAodWludDMyX3QpdmZlMzJfc3RhdHNfZHFidWYodmZlMzJfY3RybCwKLQkJCQkJTVNNX1NUQVRTX1RZUEVfQ1MpOwotCQlpZiAoYWRkcikgewotCQkJdmZlMzJfY3RybC0+Y3NTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPQotCQkJCXZmZTMyX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbigKLQkJCQl2ZmUzMl9jdHJsLCBzdGF0c0NzTnVtLAotCQkJCWFkZHIpOwotCQkJcHJvY2Vzc19zdGF0cyA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQl2ZmUzMl9jdHJsLT5jc1N0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCQl2ZmUzMl9jdHJsLT5jc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JCX0KLQl9IGVsc2UgewotCQl2ZmUzMl9jdHJsLT5jc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmIChwcm9jZXNzX3N0YXRzKQotCQl2ZmVfc2VuZF9jb21wX3N0YXRzX21zZyh2ZmUzMl9jdHJsLCBzdGF0dXNfYml0cyk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTMyX3Byb2Nlc3Nfc3RhdHNfaXJxKAotCXN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwsIHVpbnQzMl90IGlycXN0YXR1cykKLXsKLQl1aW50MzJfdCBzdGF0dXNfYml0cyA9IFZGRV9DT01fU1RBVFVTICYgaXJxc3RhdHVzOwotCWlmICgodmZlMzJfY3RybC0+aGZyX21vZGUgIT0gSEZSX01PREVfT0ZGKSAmJgotCQkodmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlRnJhbWVJZCAlCi0JCSB2ZmUzMl9jdHJsLT5oZnJfbW9kZSAhPSAwKSkgewotCQlDREJHKCJTa2lwIHRoZSBzdGF0cyB3aGVuIEhGUiBlbmFibGVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXZmZTMyX3Byb2Nlc3Nfc3RhdHModmZlMzJfY3RybCwgc3RhdHVzX2JpdHMpOwotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgdmZlMzJfcHJvY2Vzc19pcnEoCi0Jc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCwgdWludDMyX3QgaXJxc3RhdHVzKQotewotCWlmIChpcnFzdGF0dXMgJgotCQlWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQ09NUE9TSVRfTUFTSykgewotCQl2ZmUzMl9wcm9jZXNzX3N0YXRzX2lycSh2ZmUzMl9jdHJsLCBpcnFzdGF0dXMpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3dpdGNoIChpcnFzdGF0dXMpIHsKLQljYXNlIFZGRV9JUlFfU1RBVFVTMF9DQU1JRl9TT0ZfTUFTSzoKLQkJQ0RCRygiaXJxCWNhbWlmU29mSXJxXG4iKTsKLQkJdmZlMzJfcHJvY2Vzc19jYW1pZl9zb2ZfaXJxKHZmZTMyX2N0cmwpOwotCQlicmVhazsKLQljYXNlIFZGRV9JUlFfU1RBVFVTMF9SRUdfVVBEQVRFX01BU0s6Ci0JCUNEQkcoImlycQlyZWdVcGRhdGVJcnFcbiIpOwotCQl2ZmUzMl9wcm9jZXNzX3JlZ191cGRhdGVfaXJxKHZmZTMyX2N0cmwpOwotCQlicmVhazsKLQljYXNlIFZGRV9JUlFfU1RBVFVTMV9SREkwX1JFR19VUERBVEU6Ci0JCUNEQkcoImlycQlyZGkwIHJlZ1VwZGF0ZUlycVxuIik7Ci0JCXZmZTMyX3Byb2Nlc3NfcmRpMF9yZWdfdXBkYXRlX2lycSh2ZmUzMl9jdHJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfSVJRX1NUQVRVUzFfUkRJMV9SRUdfVVBEQVRFOgotCQlDREJHKCJpcnEJcmRpMSByZWdVcGRhdGVJcnFcbiIpOwotCQl2ZmUzMl9wcm9jZXNzX3JkaTFfcmVnX3VwZGF0ZV9pcnEodmZlMzJfY3RybCk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HXzE6Ci0JCUNEQkcoImlycQlyZXNldEFja0lycVxuIik7Ci0JCXZmZTMyX3Byb2Nlc3NfcmVzZXRfaXJxKHZmZTMyX2N0cmwpOwotCQlicmVhazsKLQljYXNlIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19BRUNfQkc6Ci0JCUNEQkcoIlN0YXRzIEFFQyBpcnEgb2NjdXJlZC5cbiIpOwotCQl2ZmUzMl9wcm9jZXNzX3N0YXRzX2FlX2JnX2lycSh2ZmUzMl9jdHJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQVdCOgotCQlDREJHKCJTdGF0cyBBV0IgaXJxIG9jY3VyZWQuXG4iKTsKLQkJdmZlMzJfcHJvY2Vzc19zdGF0c19hd2JfaXJxKHZmZTMyX2N0cmwpOwotCQlicmVhazsKLQljYXNlIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19BRl9CRjoKLQkJQ0RCRygiU3RhdHMgQUYgaXJxIG9jY3VyZWQuXG4iKTsKLQkJdmZlMzJfcHJvY2Vzc19zdGF0c19hZl9iZl9pcnEodmZlMzJfY3RybCk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX1NLX0JISVNUOgotCQlDREJHKCJTdGF0cyBCSElTVCBpcnEgb2NjdXJlZC5cbiIpOwotCQl2ZmUzMl9wcm9jZXNzX3N0YXRzX2JoaXN0X2lycSh2ZmUzMl9jdHJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfSUhJU1Q6Ci0JCUNEQkcoIlN0YXRzIElISVNUIGlycSBvY2N1cmVkLlxuIik7Ci0JCXZmZTMyX3Byb2Nlc3Nfc3RhdHNfaWhpc3RfaXJxKHZmZTMyX2N0cmwpOwotCQlicmVhazsKLQljYXNlIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19SUzoKLQkJQ0RCRygiU3RhdHMgUlMgaXJxIG9jY3VyZWQuXG4iKTsKLQkJdmZlMzJfcHJvY2Vzc19zdGF0c19yc19pcnEodmZlMzJfY3RybCk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0NTOgotCQlDREJHKCJTdGF0cyBDUyBpcnEgb2NjdXJlZC5cbiIpOwotCQl2ZmUzMl9wcm9jZXNzX3N0YXRzX2NzX2lycSh2ZmUzMl9jdHJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfSVJRX1NUQVRVUzBfU1lOQ19USU1FUjA6Ci0JCUNEQkcoIlNZTkNfVElNRVIgMCBpcnEgb2NjdXJlZC5cbiIpOwotCQl2ZmUzMl9zZW5kX2lzcF9tc2coJnZmZTMyX2N0cmwtPnN1YmRldiwKLQkJCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZUZyYW1lSWQsCi0JCQlNU0dfSURfU1lOQ19USU1FUjBfRE9ORSk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0lSUV9TVEFUVVMwX1NZTkNfVElNRVIxOgotCQlDREJHKCJTWU5DX1RJTUVSIDEgaXJxIG9jY3VyZWQuXG4iKTsKLQkJdmZlMzJfc2VuZF9pc3BfbXNnKCZ2ZmUzMl9jdHJsLT5zdWJkZXYsCi0JCQl2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsLT52ZmVGcmFtZUlkLAotCQkJTVNHX0lEX1NZTkNfVElNRVIxX0RPTkUpOwotCQlicmVhazsKLQljYXNlIFZGRV9JUlFfU1RBVFVTMF9TWU5DX1RJTUVSMjoKLQkJQ0RCRygiU1lOQ19USU1FUiAyIGlycSBvY2N1cmVkLlxuIik7Ci0JCXZmZTMyX3NlbmRfaXNwX21zZygmdmZlMzJfY3RybC0+c3ViZGV2LAotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlRnJhbWVJZCwKLQkJCU1TR19JRF9TWU5DX1RJTUVSMl9ET05FKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCJJbnZhbGlkIElSUSBzdGF0dXNcbiIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXhpMzJfZG9fdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwgPSAoc3RydWN0IGF4aV9jdHJsX3QgKilkYXRhOwotCXN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmwgPSBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlMzJfY3RybDsKLQlzdHJ1Y3QgdmZlMzJfaXNyX3F1ZXVlX2NtZCAqcWNtZCA9IE5VTEw7Ci0JaW50IHN0YXRfaW50ZXJydXB0OwotCi0JQ0RCRygiPT09IGF4aTMyX2RvX3Rhc2tsZXQgc3RhcnQgPT09XG4iKTsKLQotCXdoaWxlIChhdG9taWNfcmVhZCgmaXJxX2NudCkpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF4aV9jdHJsLT50YXNrbGV0X2xvY2ssIGZsYWdzKTsKLQkJcWNtZCA9IGxpc3RfZmlyc3RfZW50cnkoJmF4aV9jdHJsLT50YXNrbGV0X3EsCi0JCQlzdHJ1Y3QgdmZlMzJfaXNyX3F1ZXVlX2NtZCwgbGlzdCk7Ci0JCWF0b21pY19zdWIoMSwgJmlycV9jbnQpOwotCi0JCWlmICghcWNtZCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXhpX2N0cmwtPnRhc2tsZXRfbG9jaywKLQkJCQlmbGFncyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlsaXN0X2RlbCgmcWNtZC0+bGlzdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF4aV9jdHJsLT50YXNrbGV0X2xvY2ssCi0JCQlmbGFncyk7Ci0KLQkJaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5zdGF0c19jb21wKSB7Ci0JCQlzdGF0X2ludGVycnVwdCA9IChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQkJVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0NPTVBPU0lUX01BU0spOwotCQl9IGVsc2UgewotCQkJc3RhdF9pbnRlcnJ1cHQgPQotCQkJCShxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQkJVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0FFQ19CRykgfAotCQkJCShxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQkJVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0FXQikgfAotCQkJCShxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQkJVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0FGX0JGKSB8Ci0JCQkJKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czAgJgotCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1RBVFNfSUhJU1QpIHwKLQkJCQkocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCVZGRV9JUlFfU1RBVFVTMF9TVEFUU19SUykgfAotCQkJCShxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQkJVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0NTKTsKLQkJfQotCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJVkZFX0lSUV9TVEFUVVMwX0NBTUlGX1NPRl9NQVNLKSB7Ci0JCQlpZiAoc3RhdF9pbnRlcnJ1cHQpCi0JCQkJdmZlMzJfY3RybC0+c2ltdWx0YW5lb3VzX3NvZl9zdGF0ID0gMTsKLQkJCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlMzJfY3RybC0+c3ViZGV2LAotCQkJCU5PVElGWV9WRkVfSVJRLAotCQkJCSh2b2lkICopVkZFX0lSUV9TVEFUVVMwX0NBTUlGX1NPRl9NQVNLKTsKLQkJfQotCi0JCS8qIGludGVycnVwdCB0byBiZSBwcm9jZXNzZWQsICAqcWNtZCBoYXMgdGhlIHBheWxvYWQuICAqLwotCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJVkZFX0lSUV9TVEFUVVMwX1JFR19VUERBVEVfTUFTSykKLQkJCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlMzJfY3RybC0+c3ViZGV2LAotCQkJCU5PVElGWV9WRkVfSVJRLAotCQkJCSh2b2lkICopVkZFX0lSUV9TVEFUVVMwX1JFR19VUERBVEVfTUFTSyk7Ci0KLQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czEgJgotCQkJCVZGRV9JUlFfU1RBVFVTMV9SREkwX1JFR19VUERBVEVfTUFTSykKLQkJCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlMzJfY3RybC0+c3ViZGV2LAotCQkJCU5PVElGWV9WRkVfSVJRLAotCQkJCSh2b2lkICopVkZFX0lSUV9TVEFUVVMxX1JESTBfUkVHX1VQREFURSk7Ci0KLQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czEgJgotCQkJCVZGRV9JUlFfU1RBVFVTMV9SREkxX1JFR19VUERBVEVfTUFTSykKLQkJCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlMzJfY3RybC0+c3ViZGV2LAotCQkJCU5PVElGWV9WRkVfSVJRLAotCQkJCSh2b2lkICopVkZFX0lSUV9TVEFUVVMxX1JESTFfUkVHX1VQREFURSk7Ci0KLQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czEgJgotCQkJCVZGRV9JTUFTS19XSElMRV9TVE9QUElOR18xKQotCQkJdjRsMl9zdWJkZXZfbm90aWZ5KCZ2ZmUzMl9jdHJsLT5zdWJkZXYsCi0JCQkJTk9USUZZX1ZGRV9JUlEsCi0JCQkJKHZvaWQgKilWRkVfSU1BU0tfV0hJTEVfU1RPUFBJTkdfMSk7Ci0KLQkJaWYgKGF0b21pY19yZWFkKCZheGlfY3RybC0+c2hhcmVfY3RybC0+aGFuZGxlX2NvbW1vbl9pcnEpKSB7Ci0JCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMSAmCi0JCQkJCVZGRTMyX0lNQVNLX0NPTU1PTl9FUlJPUl9PTkxZXzEpIHsKLQkJCQlwcl9lcnIoImlycQllcnJvcklycVxuIik7Ci0JCQkJdmZlMzJfcHJvY2Vzc19jb21tb25fZXJyb3JfaXJxKAotCQkJCQlheGlfY3RybCwKLQkJCQkJcWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMSAmCi0JCQkJCVZGRTMyX0lNQVNLX0NPTU1PTl9FUlJPUl9PTkxZXzEpOwotCQkJfQotCi0JCQl2NGwyX3N1YmRldl9ub3RpZnkoJmF4aV9jdHJsLT5zdWJkZXYsCi0JCQkJTk9USUZZX0FYSV9JUlEsCi0JCQkJKHZvaWQgKilxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwKTsKLQkJfQotCi0JCWlmIChhdG9taWNfcmVhZCgmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZzdGF0ZSkpIHsKLQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMxICYKLQkJCQkJVkZFMzJfSU1BU0tfVkZFX0VSUk9SX09OTFlfMSkgewotCQkJCXByX2VycigiaXJxCWVycm9ySXJxXG4iKTsKLQkJCQl2ZmUzMl9wcm9jZXNzX2Vycm9yX2lycSgKLQkJCQkJYXhpX2N0cmwsCi0JCQkJCXFjbWQtPnZmZUludGVycnVwdFN0YXR1czEgJgotCQkJCQlWRkUzMl9JTUFTS19WRkVfRVJST1JfT05MWV8xKTsKLQkJCX0KLQotCQkJLyogdGhlbiBwcm9jZXNzIHN0YXRzIGlycS4gKi8KLQkJCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+c3RhdHNfY29tcCkgewotCQkJCS8qIHByb2Nlc3Mgc3RhdHMgY29tYiBpbnRlcnJ1cHQuICovCi0JCQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czAgJgotCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQ09NUE9TSVRfTUFTSykgewotCQkJCQlDREJHKCJTdGF0cyBjb21wb3NpdGUgaXJxIG9jY3VyZWQuXG4iKTsKLQkJCQkJdjRsMl9zdWJkZXZfbm90aWZ5KCZ2ZmUzMl9jdHJsLT5zdWJkZXYsCi0JCQkJCU5PVElGWV9WRkVfSVJRLAotCQkJCQkodm9pZCAqKXFjbWQtPnZmZUludGVycnVwdFN0YXR1czApOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLyogcHJvY2VzcyBpbmRpdmlkdWFsIHN0YXRzIGludGVycnVwdC4gKi8KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQUVDX0JHKQotCQkJCQl2NGwyX3N1YmRldl9ub3RpZnkoJnZmZTMyX2N0cmwtPnN1YmRldiwKLQkJCQkJTk9USUZZX1ZGRV9JUlEsCi0JCQkJCSh2b2lkICopVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0FFQ19CRyk7Ci0KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQVdCKQotCQkJCQl2NGwyX3N1YmRldl9ub3RpZnkoJnZmZTMyX2N0cmwtPnN1YmRldiwKLQkJCQkJTk9USUZZX1ZGRV9JUlEsCi0JCQkJCSh2b2lkICopVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0FXQik7Ci0KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQUZfQkYpCi0JCQkJCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlMzJfY3RybC0+c3ViZGV2LAotCQkJCQlOT1RJRllfVkZFX0lSUSwKLQkJCQkJKHZvaWQgKilWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQUZfQkYpOwotCQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQkJCVZGRV9JUlFfU1RBVFVTMF9TVEFUU19TS19CSElTVCkKLQkJCQkJdjRsMl9zdWJkZXZfbm90aWZ5KCZ2ZmUzMl9jdHJsLT5zdWJkZXYsCi0JCQkJCU5PVElGWV9WRkVfSVJRLAotCQkJCQkodm9pZCAqKVZGRV9JUlFfU1RBVFVTMF9TVEFUU19TS19CSElTVCk7Ci0KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1RBVFNfSUhJU1QpCi0JCQkJCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlMzJfY3RybC0+c3ViZGV2LAotCQkJCQlOT1RJRllfVkZFX0lSUSwKLQkJCQkJKHZvaWQgKilWRkVfSVJRX1NUQVRVUzBfU1RBVFNfSUhJU1QpOwotCi0JCQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czAgJgotCQkJCQkJVkZFX0lSUV9TVEFUVVMwX1NUQVRTX1JTKQotCQkJCQl2NGwyX3N1YmRldl9ub3RpZnkoJnZmZTMyX2N0cmwtPnN1YmRldiwKLQkJCQkJTk9USUZZX1ZGRV9JUlEsCi0JCQkJCSh2b2lkICopVkZFX0lSUV9TVEFUVVMwX1NUQVRTX1JTKTsKLQotCQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQkJCVZGRV9JUlFfU1RBVFVTMF9TVEFUU19DUykKLQkJCQkJdjRsMl9zdWJkZXZfbm90aWZ5KCZ2ZmUzMl9jdHJsLT5zdWJkZXYsCi0JCQkJCU5PVElGWV9WRkVfSVJRLAotCQkJCQkodm9pZCAqKVZGRV9JUlFfU1RBVFVTMF9TVEFUU19DUyk7Ci0KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1lOQ19USU1FUjApCi0JCQkJCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlMzJfY3RybC0+c3ViZGV2LAotCQkJCQlOT1RJRllfVkZFX0lSUSwKLQkJCQkJKHZvaWQgKilWRkVfSVJRX1NUQVRVUzBfU1lOQ19USU1FUjApOwotCi0JCQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czAgJgotCQkJCQkJVkZFX0lSUV9TVEFUVVMwX1NZTkNfVElNRVIxKQotCQkJCQl2NGwyX3N1YmRldl9ub3RpZnkoJnZmZTMyX2N0cmwtPnN1YmRldiwKLQkJCQkJTk9USUZZX1ZGRV9JUlEsCi0JCQkJCSh2b2lkICopVkZFX0lSUV9TVEFUVVMwX1NZTkNfVElNRVIxKTsKLQotCQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQkJCVZGRV9JUlFfU1RBVFVTMF9TWU5DX1RJTUVSMikKLQkJCQkJdjRsMl9zdWJkZXZfbm90aWZ5KCZ2ZmUzMl9jdHJsLT5zdWJkZXYsCi0JCQkJCU5PVElGWV9WRkVfSVJRLAotCQkJCQkodm9pZCAqKVZGRV9JUlFfU1RBVFVTMF9TWU5DX1RJTUVSMik7Ci0JCQl9Ci0JCX0KLQkJdmZlMzJfY3RybC0+c2ltdWx0YW5lb3VzX3NvZl9zdGF0ID0gMDsKLQkJa2ZyZWUocWNtZCk7Ci0JfQotCUNEQkcoIj09PSBheGkzMl9kb190YXNrbGV0IGVuZCA9PT1cbiIpOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgdmZlMzJfcGFyc2VfaXJxKGludCBpcnFfbnVtLCB2b2lkICpkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHZmZTMyX2lycV9zdGF0dXMgaXJxOwotCXN0cnVjdCB2ZmUzMl9pc3JfcXVldWVfY21kICpxY21kOwotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCA9IGRhdGE7Ci0KLQlDREJHKCJ2ZmVfcGFyc2VfaXJxXG4iKTsKLQotCXZmZTMyX3JlYWRfaXJxX3N0YXR1cyhheGlfY3RybCwgJmlycSk7Ci0KLQlpZiAoKGlycS52ZmVJcnFTdGF0dXMwID09IDApICYmIChpcnEudmZlSXJxU3RhdHVzMSA9PSAwKSkgewotCQlDREJHKCJ2ZmVfcGFyc2VfaXJxOiB2ZmVJcnFTdGF0dXMwICYgMSBhcmUgYm90aCAwIVxuIik7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlxY21kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZmZTMyX2lzcl9xdWV1ZV9jbWQpLAotCQlHRlBfQVRPTUlDKTsKLQlpZiAoIXFjbWQpIHsKLQkJcHJfZXJyKCJ2ZmVfcGFyc2VfaXJxOiBxY21kIG1hbGxvYyBmYWlsZWQhXG4iKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZheGlfY3RybC0+c2hhcmVfY3RybC0+c3RvcF9mbGFnX2xvY2ssIGZsYWdzKTsKLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnN0b3BfYWNrX3BlbmRpbmcpIHsKLQkJaXJxLnZmZUlycVN0YXR1czAgJj0gVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HXzA7Ci0JCWlycS52ZmVJcnFTdGF0dXMxICY9IFZGRV9JTUFTS19XSElMRV9TVE9QUElOR18xOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZheGlfY3RybC0+c2hhcmVfY3RybC0+c3RvcF9mbGFnX2xvY2ssIGZsYWdzKTsKLQotCUNEQkcoInZmZV9wYXJzZV9pcnE6IElycV9zdGF0dXMwID0gMHgleCwgSXJxX3N0YXR1czEgPSAweCV4LlxuIiwKLQkJaXJxLnZmZUlycVN0YXR1czAsIGlycS52ZmVJcnFTdGF0dXMxKTsKLQotCXFjbWQtPnZmZUludGVycnVwdFN0YXR1czAgPSBpcnEudmZlSXJxU3RhdHVzMDsKLQlxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMxID0gaXJxLnZmZUlycVN0YXR1czE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXhpX2N0cmwtPnRhc2tsZXRfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJnFjbWQtPmxpc3QsICZheGlfY3RybC0+dGFza2xldF9xKTsKLQotCWF0b21pY19hZGQoMSwgJmlycV9jbnQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF4aV9jdHJsLT50YXNrbGV0X2xvY2ssIGZsYWdzKTsKLQl0YXNrbGV0X3NjaGVkdWxlKCZheGlfY3RybC0+dmZlMzJfdGFza2xldCk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1pbnQgbXNtX2F4aV9zdWJkZXZfaXNyX3JvdXRpbmUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQl1MzIgc3RhdHVzLCBib29sICpoYW5kbGVkKQotewotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCWlycXJldHVybl90IHJldDsKLQlwcl9pbmZvKCIlcyBFICIsIF9fZnVuY19fKTsKLQlyZXQgPSB2ZmUzMl9wYXJzZV9pcnEoYXhpX2N0cmwtPnZmZWlycS0+c3RhcnQsIGF4aV9jdHJsKTsKLQkqaGFuZGxlZCA9IFRSVUU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIHZmZV9zdGF0c19idWZxX3N1Yl9pb2N0bCgKLQlzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmVfY3RybCwKLQlzdHJ1Y3QgbXNtX3ZmZV9jZmdfY21kICpjbWQsIHZvaWQgKmlvbl9jbGllbnQsIGludCBkb21haW5fbnVtKQotewotCWxvbmcgcmMgPSAwOwotCXN3aXRjaCAoY21kLT5jbWRfdHlwZSkgewotCWNhc2UgVkZFX0NNRF9TVEFUU19SRVFCVUY6Ci0JaWYgKCF2ZmVfY3RybC0+c3RhdHNfb3BzLnN0YXRzX2N0cmwpIHsKLQkJLyogc3RhdHNfY3RybCBoYXMgbm90IGJlZW4gaW5pdCB5ZXQgKi8KLQkJcmMgPSBtc21fc3RhdHNfYnVmX29wc19pbml0KCZ2ZmVfY3RybC0+c3RhdHNfY3RybCwKLQkJCQkoc3RydWN0IGlvbl9jbGllbnQgKilpb25fY2xpZW50LAotCQkJCSZ2ZmVfY3RybC0+c3RhdHNfb3BzKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogY2Fubm90IGluaXQgc3RhdHMgb3BzIiwgX19mdW5jX18pOwotCQkJZ290byBlbmQ7Ci0JCX0KLQkJcmMgPSB2ZmVfY3RybC0+c3RhdHNfb3BzLnN0YXRzX2N0cmxfaW5pdCgmdmZlX2N0cmwtPnN0YXRzX2N0cmwpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBjYW5ub3QgaW5pdCBzdGF0c19jdHJsIG9wcyIsIF9fZnVuY19fKTsKLQkJCW1lbXNldCgmdmZlX2N0cmwtPnN0YXRzX29wcywgMCwKLQkJCQlzaXplb2YodmZlX2N0cmwtPnN0YXRzX29wcykpOwotCQkJZ290byBlbmQ7Ci0JCX0KLQkJaWYgKHNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX3JlcWJ1ZikgIT0gY21kLT5sZW5ndGgpIHsKLQkJCS8qIGVycm9yLiB0aGUgbGVuZ3RoIG5vdCBtYXRjaCAqLwotCQkJcHJfZXJyKCIlczogc3RhdHMgcmVxYnVmIGlucHV0IHNpemUgPSAlZCxcbiIKLQkJCQkic3RydWN0IHNpemUgPSAlZCwgbWl0Y2ggbWF0Y2hcbiIsCi0JCQkJIF9fZnVuY19fLCBjbWQtPmxlbmd0aCwKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19yZXFidWYpKTsKLQkJCXJjID0gLUVJTlZBTCA7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCX0KLQlyYyA9IHZmZV9jdHJsLT5zdGF0c19vcHMucmVxYnVmKAotCQkJJnZmZV9jdHJsLT5zdGF0c19jdHJsLAotCQkJKHN0cnVjdCBtc21fc3RhdHNfcmVxYnVmICopY21kLT52YWx1ZSwKLQkJCXZmZV9jdHJsLT5zdGF0c19vcHMuY2xpZW50KTsKLQlicmVhazsKLQljYXNlIFZGRV9DTURfU1RBVFNfRU5RVUVVRUJVRjoKLQlpZiAoc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfYnVmX2luZm8pICE9IGNtZC0+bGVuZ3RoKSB7Ci0JCS8qIGVycm9yLiB0aGUgbGVuZ3RoIG5vdCBtYXRjaCAqLwotCQlwcl9lcnIoIiVzOiBzdGF0cyBlbnF1ZXVlYnVmIGlucHV0IHNpemUgPSAlZCxcbiIKLQkJCSJzdHJ1Y3Qgc2l6ZSA9ICVkLCBtaXRjaCBtYXRjaFxuIiwKLQkJCSBfX2Z1bmNfXywgY21kLT5sZW5ndGgsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19idWZfaW5mbykpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBlbmQ7Ci0JfQotCXJjID0gdmZlX2N0cmwtPnN0YXRzX29wcy5lbnF1ZXVlX2J1ZigKLQkJCSZ2ZmVfY3RybC0+c3RhdHNfY3RybCwKLQkJCShzdHJ1Y3QgbXNtX3N0YXRzX2J1Zl9pbmZvICopY21kLT52YWx1ZSwKLQkJCXZmZV9jdHJsLT5zdGF0c19vcHMuY2xpZW50LCBkb21haW5fbnVtKTsKLQlicmVhazsKLQljYXNlIFZGRV9DTURfU1RBVFNfRkxVU0hfQlVGUToKLQl7Ci0JCXN0cnVjdCBtc21fc3RhdHNfZmx1c2hfYnVmcSAqZmx1c2hfcmVxID0gTlVMTDsKLQkJZmx1c2hfcmVxID0gKHN0cnVjdCBtc21fc3RhdHNfZmx1c2hfYnVmcSAqKWNtZC0+dmFsdWU7Ci0JCWlmIChzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19mbHVzaF9idWZxKSAhPSBjbWQtPmxlbmd0aCkgewotCQkJLyogZXJyb3IuIHRoZSBsZW5ndGggbm90IG1hdGNoICovCi0JCQlwcl9lcnIoIiVzOiBzdGF0cyBmbHVzaCBxdWV1ZSBpbnB1dCBzaXplID0gJWQsXG4iCi0JCQkJInN0cnVjdCBzaXplID0gJWQsIG1pdGNoIG1hdGNoXG4iLAotCQkJCV9fZnVuY19fLCBjbWQtPmxlbmd0aCwKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19mbHVzaF9idWZxKSk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVuZDsKLQl9Ci0JcmMgPSB2ZmVfY3RybC0+c3RhdHNfb3BzLmJ1ZnFfZmx1c2goCi0JCQkmdmZlX2N0cmwtPnN0YXRzX2N0cmwsCi0JCQkoZW51bSBtc21fc3RhdHNfZW51bV90eXBlKWZsdXNoX3JlcS0+c3RhdHNfdHlwZSwKLQkJCXZmZV9jdHJsLT5zdGF0c19vcHMuY2xpZW50KTsKLQl9Ci0JYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX1NUQVRTX1VOUkVHQlVGOgotCXsKLQkJc3RydWN0IG1zbV9zdGF0c19yZXFidWYgKnJlcV9idWYgPSBOVUxMOwotCQlyZXFfYnVmID0gKHN0cnVjdCBtc21fc3RhdHNfcmVxYnVmICopY21kLT52YWx1ZTsKLQkJaWYgKHNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX3JlcWJ1ZikgIT0gY21kLT5sZW5ndGgpIHsKLQkJCS8qIGVycm9yLiB0aGUgbGVuZ3RoIG5vdCBtYXRjaCAqLwotCQkJcHJfZXJyKCIlczogc3RhdHMgcmVxYnVmIGlucHV0IHNpemUgPSAlZCxcbiIKLQkJCQkic3RydWN0IHNpemUgPSAlZCwgbWl0Y2ggbWF0Y2hcbiIsCi0JCQkJIF9fZnVuY19fLCBjbWQtPmxlbmd0aCwKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19yZXFidWYpKTsKLQkJCXJjID0gLUVJTlZBTCA7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCQlyYyA9IHZmZTMyX3N0YXRzX3VucmVnYnVmKHZmZV9jdHJsLCByZXFfYnVmLCBkb21haW5fbnVtKTsKLQl9Ci0JYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtMTsKLQkJcHJfZXJyKCIlczogY21kX3R5cGUgJWQgbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fLAotCQkJY21kLT5jbWRfdHlwZSk7Ci0JYnJlYWs7Ci0JfQotZW5kOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgbXNtX3ZmZV9zdWJkZXZfaW9jdGwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQkJCXVuc2lnbmVkIGludCBzdWJkZXZfY21kLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwgPQotCQkoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqKXY0bDJfZ2V0X3N1YmRldl9ob3N0ZGF0YShzZCk7Ci0Jc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCA9Ci0JCShzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICopdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IG1zbV9pc3BfY21kIHZmZWNtZDsKLQlzdHJ1Y3QgbXNtX2NhbXZmZV9wYXJhbXMgKnZmZV9wYXJhbXM7Ci0Jc3RydWN0IG1zbV92ZmVfY2ZnX2NtZCAqY21kOwotCXZvaWQgKmRhdGE7Ci0KLQlsb25nIHJjID0gMDsKLQlzdHJ1Y3QgdmZlX2NtZF9zdGF0c19idWYgKnNjZmcgPSBOVUxMOwotCXN0cnVjdCB2ZmVfY21kX3N0YXRzX2FjayAqc2FjayA9IE5VTEw7Ci0KLQlpZiAoIXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UpIHsKLQkJcHJfZXJyKCIlczogYmFzZSBhZGRyZXNzIHVubWFwcGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCUNEQkcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKHN1YmRldl9jbWQgPT0gVklESU9DX01TTV9WRkVfSU5JVCkgewotCQlDREJHKCIlcyBpbml0XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBtc21fdmZlX3N1YmRldl9pbml0KHNkKTsKLQl9IGVsc2UgaWYgKHN1YmRldl9jbWQgPT0gVklESU9DX01TTV9WRkVfUkVMRUFTRSkgewotCQltc21fdmZlX3N1YmRldl9yZWxlYXNlKHNkKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXZmZV9wYXJhbXMgPSAoc3RydWN0IG1zbV9jYW12ZmVfcGFyYW1zICopYXJnOwotCWNtZCA9IHZmZV9wYXJhbXMtPnZmZV9jZmc7Ci0JZGF0YSA9IHZmZV9wYXJhbXMtPmRhdGE7Ci0Jc3dpdGNoIChjbWQtPmNtZF90eXBlKSB7Ci0JY2FzZSBDTURfVkZFX1BST0NFU1NfSVJROgotCQl2ZmUzMl9wcm9jZXNzX2lycSh2ZmUzMl9jdHJsLCAodWludDMyX3QpIGRhdGEpOwotCQlyZXR1cm4gcmM7Ci0JY2FzZSBWRkVfQ01EX1NUQVRTX1JFUUJVRjoKLQljYXNlIFZGRV9DTURfU1RBVFNfRU5RVUVVRUJVRjoKLQljYXNlIFZGRV9DTURfU1RBVFNfRkxVU0hfQlVGUToKLQljYXNlIFZGRV9DTURfU1RBVFNfVU5SRUdCVUY6Ci0JCS8qIGZvciBlYXN5IHBvcnRpbmcgcHV0IGluIG9uZSBlbnZlbG9wZSAqLwotCQlyYyA9IHZmZV9zdGF0c19idWZxX3N1Yl9pb2N0bCh2ZmUzMl9jdHJsLAotCQkJCWNtZCwgdmZlX3BhcmFtcy0+ZGF0YSwgcG1jdGwtPmRvbWFpbl9udW0pOwotCQlyZXR1cm4gcmM7Ci0JZGVmYXVsdDoKLQkJaWYgKGNtZC0+Y21kX3R5cGUgIT0gQ01EX0NPTkZJR19QSU5HX0FERFIgJiYKLQkJY21kLT5jbWRfdHlwZSAhPSBDTURfQ09ORklHX1BPTkdfQUREUiAmJgotCQljbWQtPmNtZF90eXBlICE9IENNRF9DT05GSUdfRlJFRV9CVUZfQUREUiAmJgotCQljbWQtPmNtZF90eXBlICE9IENNRF9TVEFUU19BRUNfQlVGX1JFTEVBU0UgJiYKLQkJY21kLT5jbWRfdHlwZSAhPSBDTURfU1RBVFNfQVdCX0JVRl9SRUxFQVNFICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX0lISVNUX0JVRl9SRUxFQVNFICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX1JTX0JVRl9SRUxFQVNFICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX0NTX0JVRl9SRUxFQVNFICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX0FGX0JVRl9SRUxFQVNFICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX0JHX0JVRl9SRUxFQVNFICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX0JGX0JVRl9SRUxFQVNFICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX0JISVNUX0JVRl9SRUxFQVNFICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1ZGRV9QSVhfU09GX0NPVU5UX1VQREFURSAmJgotCQljbWQtPmNtZF90eXBlICE9IENNRF9WRkVfQ09VTlRfUElYX1NPRl9FTkFCTEUpIHsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmdmZlY21kLAotCQkJCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQkJCXNpemVvZih2ZmVjbWQpKSkgewotCQkJCXByX2VycigiJXMgJWQ6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwKLQkJCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIGhlcmUgZWl0aCBzdGF0cyByZWxlYXNlIG9yIGZyYW1lIHJlbGVhc2UuICovCi0JCQlpZiAoY21kLT5jbWRfdHlwZSAhPSBDTURfQ09ORklHX1BJTkdfQUREUiAmJgotCQkJCWNtZC0+Y21kX3R5cGUgIT0gQ01EX0NPTkZJR19QT05HX0FERFIgJiYKLQkJCQljbWQtPmNtZF90eXBlICE9IENNRF9DT05GSUdfRlJFRV9CVUZfQUREUikgewotCQkJCS8qIHRoZW4gbXVzdCBiZSBzdGF0cyByZWxlYXNlLiAqLwotCQkJCWlmICghZGF0YSkgewotCQkJCQlwcl9lcnIoIiVzOiBkYXRhID0gTlVMTCwgY21kLT5jbWRfdHlwZSA9ICVkIiwKLQkJCQkJCV9fZnVuY19fLCBjbWQtPmNtZF90eXBlKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCXNhY2sgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmZlX2NtZF9zdGF0c19hY2spLAotCQkJCQkJCUdGUF9BVE9NSUMpOwotCQkJCWlmICghc2FjaykgewotCQkJCQlwcl9lcnIoIiVzOiBubyBtZW0gZm9yIGNtZC0+Y21kX3R5cGUgPSAlZCIsCi0JCQkJCSBfX2Z1bmNfXywgY21kLT5jbWRfdHlwZSk7Ci0JCQkJCXJldHVybiAtRU5PTUVNOwotCQkJCX0KLQkJCQlzYWNrLT5uZXh0U3RhdHNCdWYgPSAqKHVpbnQzMl90ICopZGF0YTsKLQkJCX0KLQkJfQotCX0KLQotCUNEQkcoIiVzOiBjbWRUeXBlID0gJWRcbiIsIF9fZnVuY19fLCBjbWQtPmNtZF90eXBlKTsKLQotCWlmICgoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfQUZfRU5BQkxFKSAgICB8fAotCQkoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfQVdCX0VOQUJMRSkgICB8fAotCQkoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfSUhJU1RfRU5BQkxFKSB8fAotCQkoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfUlNfRU5BQkxFKSAgICB8fAotCQkoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfQ1NfRU5BQkxFKSAgICB8fAotCQkoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfQUVDX0VOQUJMRSkgICB8fAotCQkoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfQkdfRU5BQkxFKSAgICB8fAotCQkoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfQkZfRU5BQkxFKSAgICB8fAotCQkoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfQkhJU1RfRU5BQkxFKSkgewotCQlzdHJ1Y3QgYXhpZGF0YSAqYXhpZDsKLQkJYXhpZCA9IGRhdGE7Ci0JCWlmICghYXhpZCkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byB2ZmUzMl9jb25maWdfZG9uZTsKLQkJfQotCQlDREJHKCIlczogY21kVHlwZSA9ICVkXG4iLCBfX2Z1bmNfXywgY21kLT5jbWRfdHlwZSk7Ci0KLQkJaWYgKChjbWQtPmNtZF90eXBlID09IENNRF9TVEFUU19BRl9FTkFCTEUpICAgIHx8Ci0JCQkoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfQVdCX0VOQUJMRSkgICB8fAotCQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0lISVNUX0VOQUJMRSkgfHwKLQkJCShjbWQtPmNtZF90eXBlID09IENNRF9TVEFUU19SU19FTkFCTEUpICAgIHx8Ci0JCQkoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfQ1NfRU5BQkxFKSAgICB8fAotCQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0FFQ19FTkFCTEUpKSB7Ci0JCQkJc2NmZyA9IE5VTEw7Ci0JCQkJLyogaW5kaXZpZHVhbCAqLwotCQkJCWdvdG8gdmZlMzJfY29uZmlnX2RvbmU7Ci0JCX0KLQkJc3dpdGNoIChjbWQtPmNtZF90eXBlKSB7Ci0JCWNhc2UgQ01EX1NUQVRTX0FFQ19FTkFCTEU6Ci0JCWNhc2UgQ01EX1NUQVRTX0JHX0VOQUJMRToKLQkJY2FzZSBDTURfU1RBVFNfQkZfRU5BQkxFOgotCQljYXNlIENNRF9TVEFUU19CSElTVF9FTkFCTEU6Ci0JCWNhc2UgQ01EX1NUQVRTX0FXQl9FTkFCTEU6Ci0JCWNhc2UgQ01EX1NUQVRTX0lISVNUX0VOQUJMRToKLQkJY2FzZSBDTURfU1RBVFNfUlNfRU5BQkxFOgotCQljYXNlIENNRF9TVEFUU19DU19FTkFCTEU6Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoIiVzIFVuc3VwcG9ydGVkIGNtZCB0eXBlICVkIiwKLQkJCQlfX2Z1bmNfXywgY21kLT5jbWRfdHlwZSk7Ci0JCQlicmVhazsKLQkJfQotCQlnb3RvIHZmZTMyX2NvbmZpZ19kb25lOwotCX0KLQlzd2l0Y2ggKGNtZC0+Y21kX3R5cGUpIHsKLQljYXNlIENNRF9HRU5FUkFMOgotCQlyYyA9IHZmZTMyX3Byb2NfZ2VuZXJhbChwbWN0bCwgJnZmZWNtZCwgdmZlMzJfY3RybCk7Ci0JYnJlYWs7Ci0JY2FzZSBDTURfVkZFX0NPVU5UX1BJWF9TT0ZfRU5BQkxFOiB7Ci0JCWludCBlbmFibGUgPSAqKChpbnQgKiljbWQtPnZhbHVlKTsKLQkJaWYgKGVuYWJsZSkKLQkJCXZmZTMyX2N0cmwtPnZmZV9zb2ZfY291bnRfZW5hYmxlID0gVFJVRTsKLQkJZWxzZQotCQkJdmZlMzJfY3RybC0+dmZlX3NvZl9jb3VudF9lbmFibGUgPSBmYWxzZTsKLQl9Ci0JYnJlYWs7Ci0JY2FzZSBDTURfVkZFX1BJWF9TT0ZfQ09VTlRfVVBEQVRFOgotCQlpZiAoIXZmZTMyX2N0cmwtPnZmZV9zb2ZfY291bnRfZW5hYmxlKQotCQkJdmZlMzJfY3RybC0+c2hhcmVfY3RybC0+dmZlRnJhbWVJZCA9Ci0JCQkqKCh1aW50MzJfdCAqKXZmZV9wYXJhbXMtPmRhdGEpOwotCWJyZWFrOwotCWNhc2UgQ01EX0NPTkZJR19QSU5HX0FERFI6IHsKLQkJaW50IHBhdGggPSAqKChpbnQgKiljbWQtPnZhbHVlKTsKLQkJc3RydWN0IHZmZTMyX291dHB1dF9jaCAqb3V0Y2ggPQotCQkJdmZlMzJfZ2V0X2NoKHBhdGgsIHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwpOwotCQlvdXRjaC0+cGluZyA9ICooKHN0cnVjdCBtc21fZnJlZV9idWYgKilkYXRhKTsKLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIENNRF9DT05GSUdfUE9OR19BRERSOiB7Ci0JCWludCBwYXRoID0gKigoaW50ICopY21kLT52YWx1ZSk7Ci0JCXN0cnVjdCB2ZmUzMl9vdXRwdXRfY2ggKm91dGNoID0KLQkJCXZmZTMyX2dldF9jaChwYXRoLCB2ZmUzMl9jdHJsLT5zaGFyZV9jdHJsKTsKLQkJb3V0Y2gtPnBvbmcgPSAqKChzdHJ1Y3QgbXNtX2ZyZWVfYnVmICopZGF0YSk7Ci0JfQotCWJyZWFrOwotCi0JY2FzZSBDTURfQ09ORklHX0ZSRUVfQlVGX0FERFI6IHsKLQkJaW50IHBhdGggPSAqKChpbnQgKiljbWQtPnZhbHVlKTsKLQkJc3RydWN0IHZmZTMyX291dHB1dF9jaCAqb3V0Y2ggPQotCQkJdmZlMzJfZ2V0X2NoKHBhdGgsIHZmZTMyX2N0cmwtPnNoYXJlX2N0cmwpOwotCQlvdXRjaC0+ZnJlZV9idWYgPSAqKChzdHJ1Y3QgbXNtX2ZyZWVfYnVmICopZGF0YSk7Ci0JfQotCWJyZWFrOwotCi0JY2FzZSBDTURfU05BUF9CVUZfUkVMRUFTRToKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzIFVuc3VwcG9ydGVkIEFYSSBjb25maWd1cmF0aW9uICV4ICIsIF9fZnVuY19fLAotCQkJY21kLT5jbWRfdHlwZSk7Ci0JYnJlYWs7Ci0JfQotdmZlMzJfY29uZmlnX2RvbmU6Ci0Ja2ZyZWUoc2NmZyk7Ci0Ja2ZyZWUoc2Fjayk7Ci0JQ0RCRygiJXMgZG9uZTogcmMgPSAlZFxuIiwgX19mdW5jX18sIChpbnQpIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbV9jbGtfaW5mbyB2ZmUzMl9jbGtfaW5mb1tdID0gewotCXsidmZlX2NsayIsIDIyODU3MDAwMH0sCi0JeyJ2ZmVfcGNsayIsIC0xfSwKLQl7ImNzaV92ZmVfY2xrIiwgLTF9LAotfTsKLQotc3RhdGljIGludCBtc21fYXhpX3N1YmRldl9zX2NyeXN0YWxfZnJlcShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCQkJCQkJdTMyIGZyZXEsIHUzMiBmbGFncykKLXsKLQlpbnQgcmMgPSAwOwotCWludCByb3VuZF9yYXRlOwotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCi0JaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5kdWFsX2VuYWJsZWQpCi0JCXJldHVybiByYzsKLQotCXJvdW5kX3JhdGUgPSBjbGtfcm91bmRfcmF0ZShheGlfY3RybC0+dmZlX2Nsa1swXSwgZnJlcSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBjbGtfcm91bmRfcmF0ZSBmYWlsZWQgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQl2ZmVfY2xrX3JhdGUgPSByb3VuZF9yYXRlOwotCXJjID0gY2xrX3NldF9yYXRlKGF4aV9jdHJsLT52ZmVfY2xrWzBdLCByb3VuZF9yYXRlKTsKLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoIiVzOiBjbGtfc2V0X3JhdGUgZmFpbGVkICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmMpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIG1zbV92ZmVfc3ViZGV2X2NvcmVfb3BzID0gewotCS5pb2N0bCA9IG1zbV92ZmVfc3ViZGV2X2lvY3RsLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgbXNtX3ZmZV9zdWJkZXZfb3BzID0gewotCS5jb3JlID0gJm1zbV92ZmVfc3ViZGV2X2NvcmVfb3BzLAotfTsKLQotaW50IG1zbV9heGlfc3ViZGV2X2luaXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQl1aW50OF90IGR1YWxfZW5hYmxlZCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKm1jdGwgPQotCQl2NGwyX2dldF9zdWJkZXZfaG9zdGRhdGEoc2QpOwotCWlmIChtY3RsID09IE5VTEwpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG1jdGxfZmFpbGVkOwotCX0KLQotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5heGlfcmVmX2NudCsrOwotCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+YXhpX3JlZl9jbnQgPiAxKQotCQlyZXR1cm4gcmM7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmR1YWxfZW5hYmxlZCA9IGR1YWxfZW5hYmxlZDsKLQlzcGluX2xvY2tfaW5pdCgmYXhpX2N0cmwtPnRhc2tsZXRfbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF4aV9jdHJsLT50YXNrbGV0X3EpOwotCXNwaW5fbG9ja19pbml0KCZheGlfY3RybC0+c2hhcmVfY3RybC0+c2Rfbm90aWZ5X2xvY2spOwotCi0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgPSBpb3JlbWFwKGF4aV9jdHJsLT52ZmVtZW0tPnN0YXJ0LAotCQlyZXNvdXJjZV9zaXplKGF4aV9jdHJsLT52ZmVtZW0pKTsKLQlpZiAoIWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJcHJfZXJyKCIlczogdmZlIGlvcmVtYXAgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gcmVtYXBfZmFpbGVkOwotCX0KLQotCWlmIChheGlfY3RybC0+ZnNfdmZlKSB7Ci0JCXJjID0gcmVndWxhdG9yX2VuYWJsZShheGlfY3RybC0+ZnNfdmZlKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcl9lcnIoIiVzOiBSZWd1bGF0b3IgZW5hYmxlIGZhaWxlZFxuIiwJX19mdW5jX18pOwotCQkJZ290byBmc19mYWlsZWQ7Ci0JCX0KLQl9Ci0KLQlyYyA9IG1zbV9jYW1fY2xrX2VuYWJsZSgmYXhpX2N0cmwtPnBkZXYtPmRldiwgdmZlMzJfY2xrX2luZm8sCi0JCQlheGlfY3RybC0+dmZlX2NsaywgQVJSQVlfU0laRSh2ZmUzMl9jbGtfaW5mbyksIDEpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gY2xrX2VuYWJsZV9mYWlsZWQ7Ci0KLSNpZmRlZiBDT05GSUdfTVNNX0lPTU1VCi0JcmMgPSBpb21tdV9hdHRhY2hfZGV2aWNlKG1jdGwtPmRvbWFpbiwgYXhpX2N0cmwtPmlvbW11X2N0eF9pbWd3cik7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBpbWd3ciBhdHRhY2ggZmFpbGVkIHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBkZXZpY2VfaW1nd3JfYXR0YWNoX2ZhaWxlZDsKLQl9Ci0JcmMgPSBpb21tdV9hdHRhY2hfZGV2aWNlKG1jdGwtPmRvbWFpbiwgYXhpX2N0cmwtPmlvbW11X2N0eF9taXNjKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IG1pc2MgYXR0YWNoIGZhaWxlZCByYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gZGV2aWNlX21pc2NfYXR0YWNoX2ZhaWxlZDsKLQl9Ci0jZW5kaWYKLQotCW1zbV9jYW1pb19idXNfc2NhbGVfY2ZnKAotCQltY3RsLT5zZGF0YS0+cGRhdGEtPmNhbV9idXNfc2NhbGVfdGFibGUsIFNfSU5JVCk7Ci0KLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmR1YWxfZW5hYmxlZCkKLQkJbXNtX2NhbWlvX2J1c19zY2FsZV9jZmcoCi0JCQltY3RsLT5zZGF0YS0+cGRhdGEtPmNhbV9idXNfc2NhbGVfdGFibGUsIFNfRFVBTCk7Ci0JZWxzZQotCQltc21fY2FtaW9fYnVzX3NjYWxlX2NmZygKLQkJCW1jdGwtPnNkYXRhLT5wZGF0YS0+Y2FtX2J1c19zY2FsZV90YWJsZSwgU19QUkVWSUVXKTsKLQotCWlmIChtc21fY2FtZXJhX2lvX3IoCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjMyX0dFVF9IV19WRVJTSU9OX09GRikgPT0KLQkJVkZFMzJfSFdfTlVNQkVSKQotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+cmVnaXN0ZXJfdG90YWwgPSBWRkUzMl9SRUdJU1RFUl9UT1RBTDsKLQllbHNlCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZWdpc3Rlcl90b3RhbCA9IFZGRTMzX1JFR0lTVEVSX1RPVEFMOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT5zdG9wX2ZsYWdfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT51cGRhdGVfYWNrX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZheGlfY3RybC0+c2hhcmVfY3RybC0+c3RhcnRfYWNrX2xvY2spOwotCi0JZW5hYmxlX2lycShheGlfY3RybC0+dmZlaXJxLT5zdGFydCk7Ci0KLQlyZXR1cm4gcmM7Ci0KLSNpZmRlZiBDT05GSUdfTVNNX0lPTU1VCi1kZXZpY2VfbWlzY19hdHRhY2hfZmFpbGVkOgotCWlvbW11X2RldGFjaF9kZXZpY2UobWN0bC0+ZG9tYWluLCBheGlfY3RybC0+aW9tbXVfY3R4X2ltZ3dyKTsKLWRldmljZV9pbWd3cl9hdHRhY2hfZmFpbGVkOgotI2VuZGlmCi0JbXNtX2NhbV9jbGtfZW5hYmxlKCZheGlfY3RybC0+cGRldi0+ZGV2LCB2ZmUzMl9jbGtfaW5mbywKLQkJCWF4aV9jdHJsLT52ZmVfY2xrLCBBUlJBWV9TSVpFKHZmZTMyX2Nsa19pbmZvKSwgMCk7Ci1jbGtfZW5hYmxlX2ZhaWxlZDoKLQlpZiAoYXhpX2N0cmwtPmZzX3ZmZSkKLQkJcmVndWxhdG9yX2Rpc2FibGUoYXhpX2N0cmwtPmZzX3ZmZSk7Ci1mc19mYWlsZWQ6Ci0JaW91bm1hcChheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSk7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgPSBOVUxMOwotcmVtYXBfZmFpbGVkOgotbWN0bF9mYWlsZWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX3ZmZV9zdWJkZXZfaW5pdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybCA9Ci0JCShzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICopdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmdmZlMzJfY3RybC0+c3RhdGVfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnZmZTMyX2N0cmwtPnN0YXRzX2J1ZnFfbG9jayk7Ci0KLQl2ZmUzMl9jdHJsLT51cGRhdGVfbGluZWFyID0gZmFsc2U7Ci0JdmZlMzJfY3RybC0+dXBkYXRlX3JvbGxvZmYgPSBmYWxzZTsKLQl2ZmUzMl9jdHJsLT51cGRhdGVfbGEgPSBmYWxzZTsKLQl2ZmUzMl9jdHJsLT51cGRhdGVfZ2FtbWEgPSBmYWxzZTsKLQl2ZmUzMl9jdHJsLT52ZmVfc29mX2NvdW50X2VuYWJsZSA9IGZhbHNlOwotCXZmZTMyX2N0cmwtPmhmcl9tb2RlID0gSEZSX01PREVfT0ZGOwotCi0JbWVtc2V0KCZ2ZmUzMl9jdHJsLT5zdGF0c19jdHJsLCAwLAotCQlzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19idWZxX2N0cmwpKTsKLQltZW1zZXQoJnZmZTMyX2N0cmwtPnN0YXRzX29wcywgMCwgc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfb3BzKSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXZvaWQgbXNtX2F4aV9zdWJkZXZfcmVsZWFzZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQotewotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsID0KLQkJdjRsMl9nZXRfc3ViZGV2X2hvc3RkYXRhKHNkKTsKLQotCWlmICghYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UpIHsKLQkJcHJfZXJyKCIlczogYmFzZSBhZGRyZXNzIHVubWFwcGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlheGlfY3RybC0+c2hhcmVfY3RybC0+YXhpX3JlZl9jbnQtLTsKLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmF4aV9yZWZfY250ID4gMCkKLQkJcmV0dXJuOwotCi0JYXhpX2NsZWFyX2FsbF9pbnRlcnJ1cHRzKGF4aV9jdHJsLT5zaGFyZV9jdHJsKTsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+ZHVhbF9lbmFibGVkID0gMDsKLQlkaXNhYmxlX2lycShheGlfY3RybC0+dmZlaXJxLT5zdGFydCk7Ci0JdGFza2xldF9raWxsKCZheGlfY3RybC0+dmZlMzJfdGFza2xldCk7Ci0jaWZkZWYgQ09ORklHX01TTV9JT01NVQotCWlvbW11X2RldGFjaF9kZXZpY2UocG1jdGwtPmRvbWFpbiwgYXhpX2N0cmwtPmlvbW11X2N0eF9taXNjKTsKLQlpb21tdV9kZXRhY2hfZGV2aWNlKHBtY3RsLT5kb21haW4sIGF4aV9jdHJsLT5pb21tdV9jdHhfaW1nd3IpOwotI2VuZGlmCi0JbXNtX2NhbV9jbGtfZW5hYmxlKCZheGlfY3RybC0+cGRldi0+ZGV2LCB2ZmUzMl9jbGtfaW5mbywKLQkJCWF4aV9jdHJsLT52ZmVfY2xrLCBBUlJBWV9TSVpFKHZmZTMyX2Nsa19pbmZvKSwgMCk7Ci0JaWYgKGF4aV9jdHJsLT5mc192ZmUpCi0JCXJlZ3VsYXRvcl9kaXNhYmxlKGF4aV9jdHJsLT5mc192ZmUpOwotCi0JaW91bm1hcChheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSk7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgPSBOVUxMOwotCi0JaWYgKGF0b21pY19yZWFkKCZpcnFfY250KSkKLQkJcHJfd2FybmluZygiJXMsIFdhcm5pbmcgSVJRIENvdW50IG5vdCBaRVJPXG4iLCBfX2Z1bmNfXyk7Ci0KLQltc21fY2FtaW9fYnVzX3NjYWxlX2NmZygKLQkJcG1jdGwtPnNkYXRhLT5wZGF0YS0+Y2FtX2J1c19zY2FsZV90YWJsZSwgU19FWElUKTsKLQotfQotCi12b2lkIG1zbV92ZmVfc3ViZGV2X3JlbGVhc2Uoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKLXsKLQlzdHJ1Y3QgdmZlMzJfY3RybF90eXBlICp2ZmUzMl9jdHJsID0KLQkJKHN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKil2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlDREJHKCJ2ZmUgc3ViZGV2IHJlbGVhc2UgJXBcbiIsCi0JCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UpOwotfQotCi12b2lkIGF4aV9hYm9ydChzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwpCi17Ci0JdWludDhfdCAgYXhpX2J1c3lfZmxhZyA9IHRydWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQkvKiBheGkgaGFsdCBjb21tYW5kLiAqLwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT5zdG9wX2ZsYWdfbG9jaywgZmxhZ3MpOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5zdG9wX2Fja19wZW5kaW5nICA9IFRSVUU7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnN0b3BfZmxhZ19sb2NrLCBmbGFncyk7Ci0JbXNtX2NhbWVyYV9pb193KEFYSV9IQUxULAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9BWElfQ01EKTsKLQl3bWIoKTsKLQl3aGlsZSAoYXhpX2J1c3lfZmxhZykgewotCQlpZiAobXNtX2NhbWVyYV9pb19yKAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfQVhJX1NUQVRVUykgJiAweDEpCi0JCQlheGlfYnVzeV9mbGFnID0gZmFsc2U7Ci0JfQotCS8qIEVuc3VyZSB0aGUgd3JpdGUgb3JkZXIgd2hpbGUgd3JpdGluZwotCSogdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdXNpbmcgdGhlIGJhcnJpZXIgKi8KLQltc21fY2FtZXJhX2lvX3dfbWIoQVhJX0hBTFRfQ0xFQVIsCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0FYSV9DTUQpOwotCi0JLyogYWZ0ZXIgYXhpIGhhbHQsIHRoZW4gb2sgdG8gYXBwbHkgZ2xvYmFsIHJlc2V0LgotCSogZW5hYmxlIHJlc2V0X2FjayBhbmQgYXN5bmMgdGltZXIgaW50ZXJydXB0IG9ubHkgd2hpbGUKLQkqIHN0b3BwaW5nIHRoZSBwaXBlbGluZS4qLwotCW1zbV9jYW1lcmFfaW9fdygweGYwMDAwMDAwLAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfTUFTS18wKTsKLQltc21fY2FtZXJhX2lvX3coVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HXzEsCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9NQVNLXzEpOwotCi0JLyogRW5zdXJlIHRoZSB3cml0ZSBvcmRlciB3aGlsZSB3cml0aW5nCi0JKiB0byB0aGUgY29tbWFuZCByZWdpc3RlciB1c2luZyB0aGUgYmFycmllciAqLwotCW1zbV9jYW1lcmFfaW9fd19tYihWRkVfUkVTRVRfVVBPTl9TVE9QX0NNRCwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfR0xPQkFMX1JFU0VUKTsKLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnN5bmNfYWJvcnQpCi0JCXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgKLQkJCSZheGlfY3RybC0+c2hhcmVfY3RybC0+cmVzZXRfY29tcGxldGUpOwotfQotCi1pbnQgYXhpX2NvbmZpZ19idWZmZXJzKHN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCwKLQlzdHJ1Y3QgbXNtX2NhbWVyYV92ZmVfcGFyYW1zX3QgdmZlX3BhcmFtcykKLXsKLQl1aW50MTZfdCB2ZmVfbW9kZSA9IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUKLQkJCSYgfihWRkVfT1VUUFVUU19SREkwfFZGRV9PVVRQVVRTX1JESTEpOwotCWludCByYyA9IDA7Ci0Jc3dpdGNoICh2ZmVfcGFyYW1zLmNtZF90eXBlKSB7Ci0JY2FzZSBBWElfQ01EX1BSRVZJRVc6Ci0JCWlmICh2ZmVfbW9kZSkgewotCQkJaWYgKChheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19QUkVWSUVXX0FORF9WSURFTykgfHwKLQkJCQkoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmCi0JCQkJVkZFX09VVFBVVFNfUFJFVklFVykpCi0JCQkJLyogQ29uZmlndXJlIHByaW1hcnkgY2hhbm5lbCAqLwotCQkJCXJjID0gY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoCi0JCQkJCVZGRV9NU0dfU1RBUlQsCi0JCQkJCVZGRV9NU0dfT1VUUFVUX1BSSU1BUlksCi0JCQkJCWF4aV9jdHJsKTsKLQkJCWVsc2UKLQkJCS8qIENvbmZpZ3VyZSBzZWNvbmRhcnkgY2hhbm5lbCAqLwotCQkJCXJjID0gY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoCi0JCQkJCVZGRV9NU0dfU1RBUlQsCi0JCQkJCVZGRV9NU0dfT1VUUFVUX1NFQ09OREFSWSwKLQkJCQkJYXhpX2N0cmwpOwotCQl9Ci0JCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19SREkwKQotCQkJcmMgPSBjb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycygKLQkJCQlWRkVfTVNHX1NUQVJULCBWRkVfTVNHX09VVFBVVF9URVJUSUFSWTEsCi0JCQkJYXhpX2N0cmwpOwotCQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmCi0JCQkJVkZFX09VVFBVVFNfUkRJMSkKLQkJCXJjID0gY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoCi0JCQkJVkZFX01TR19TVEFSVCwgVkZFX01TR19PVVRQVVRfVEVSVElBUlkyLAotCQkJCWF4aV9jdHJsKTsKLQotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzIGVycm9yIGNvbmZpZ3VyaW5nIHBpbmdwb25nIGJ1ZmZlcnMgZm9yIHByZXZpZXciLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBWElfQ01EX1JBV19DQVBUVVJFOgotCQlyYyA9IGNvbmZpZ3VyZV9waW5ncG9uZ19idWZmZXJzKAotCQkJVkZFX01TR19DQVBUVVJFLCBWRkVfTVNHX09VVFBVVF9QUklNQVJZLAotCQkJYXhpX2N0cmwpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzIGVycm9yIGNvbmZpZ3VyaW5nIHBpbmdwb25nIGJ1ZmZlcnMgZm9yIHNuYXBzaG90IiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGNvbmZpZ19kb25lOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVhJX0NNRF9aU0w6Ci0JCXJjID0gY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoVkZFX01TR19TVEFSVCwKLQkJCVZGRV9NU0dfT1VUUFVUX1BSSU1BUlksIGF4aV9jdHJsKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCXJjID0gY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoVkZFX01TR19TVEFSVCwKLQkJCVZGRV9NU0dfT1VUUFVUX1NFQ09OREFSWSwgYXhpX2N0cmwpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBjb25maWdfZG9uZTsKLQkJYnJlYWs7Ci0JY2FzZSBBWElfQ01EX1JFQ09SRDoKLQkJaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgJgotCQkJVkZFX09VVFBVVFNfUFJFVklFV19BTkRfVklERU8pIHsKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuaW5zdF9oYW5kbGUgPQotCQkJCXZmZV9wYXJhbXMuaW5zdF9oYW5kbGU7Ci0JCQlyYyA9IGNvbmZpZ3VyZV9waW5ncG9uZ19idWZmZXJzKAotCQkJCVZGRV9NU0dfU1RBUlRfUkVDT1JESU5HLAotCQkJCVZGRV9NU0dfT1VUUFVUX1NFQ09OREFSWSwKLQkJCQlheGlfY3RybCk7Ci0JCX0gZWxzZSBpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmCi0JCQlWRkVfT1VUUFVUU19WSURFT19BTkRfUFJFVklFVykgewotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5pbnN0X2hhbmRsZSA9Ci0JCQkJdmZlX3BhcmFtcy5pbnN0X2hhbmRsZTsKLQkJCXJjID0gY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoCi0JCQkJVkZFX01TR19TVEFSVF9SRUNPUkRJTkcsCi0JCQkJVkZFX01TR19PVVRQVVRfUFJJTUFSWSwKLQkJCQlheGlfY3RybCk7Ci0JCX0KLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlcyBlcnJvciBjb25maWd1cmluZyBwaW5ncG9uZyBidWZmZXJzIGZvciB2aWRlbyIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCQlicmVhazsKLQljYXNlIEFYSV9DTURfTElWRVNIT1Q6Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuaW5zdF9oYW5kbGUgPQotCQkJdmZlX3BhcmFtcy5pbnN0X2hhbmRsZTsKLQkJcmMgPSBjb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycyhWRkVfTVNHX0NBUFRVUkUsCi0JCQkJCVZGRV9NU0dfT1VUUFVUX1BSSU1BUlksIGF4aV9jdHJsKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlcyBlcnJvciBjb25maWd1cmluZyBwaW5ncG9uZyBidWZmZXJzIGZvciBwcmltYXJ5IG91dHB1dCIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCQlicmVhazsKLQljYXNlIEFYSV9DTURfQ0FQVFVSRToKLQkJaWYgKHZmZV9tb2RlKSB7Ci0JCQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSA9PQotCQkJCVZGRV9PVVRQVVRTX0pQRUdfQU5EX1RIVU1CIHx8Ci0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlID09Ci0JCQkJVkZFX09VVFBVVFNfVEhVTUJfQU5EX0pQRUcpIHsKLQotCQkJCS8qIENvbmZpZ3VyZSBwcmltYXJ5IGNoYW5uZWwgZm9yIEpQRUcgKi8KLQkJCQlyYyA9IGNvbmZpZ3VyZV9waW5ncG9uZ19idWZmZXJzKAotCQkJCQlWRkVfTVNHX0pQRUdfQ0FQVFVSRSwKLQkJCQkJVkZFX01TR19PVVRQVVRfUFJJTUFSWSwKLQkJCQkJYXhpX2N0cmwpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBDb25maWd1cmUgcHJpbWFyeSBjaGFubmVsICovCi0JCQkJcmMgPSBjb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycygKLQkJCQkJVkZFX01TR19DQVBUVVJFLAotCQkJCQlWRkVfTVNHX09VVFBVVF9QUklNQVJZLAotCQkJCQlheGlfY3RybCk7Ci0JCQl9Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlcyBlcnJvciBjb25maWd1cmluZyBwaW5ncG9uZyBidWZmZXJzIGZvciBwcmltYXJ5IG91dHB1dCIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJZ290byBjb25maWdfZG9uZTsKLQkJCX0KLQkJCS8qIENvbmZpZ3VyZSBzZWNvbmRhcnkgY2hhbm5lbCAqLwotCQkJcmMgPSBjb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycygKLQkJCQkJVkZFX01TR19DQVBUVVJFLAotCQkJCQlWRkVfTVNHX09VVFBVVF9TRUNPTkRBUlksCi0JCQkJCWF4aV9jdHJsKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzIGVycm9yIGNvbmZpZ3VyaW5nIHBpbmdwb25nIGJ1ZmZlcnMgZm9yIHNlY29uZGFyeSBvdXRwdXQiLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmCi0JCQkJVkZFX09VVFBVVFNfUkRJMCkKLQkJCXJjID0gY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoCi0JCQkJVkZFX01TR19DQVBUVVJFLCBWRkVfTVNHX09VVFBVVF9URVJUSUFSWTEsCi0JCQkJYXhpX2N0cmwpOwotCQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmCi0JCQkJVkZFX09VVFBVVFNfUkRJMSkKLQkJCXJjID0gY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoCi0JCQkJVkZFX01TR19DQVBUVVJFLCBWRkVfTVNHX09VVFBVVF9URVJUSUFSWTIsCi0JCQkJYXhpX2N0cmwpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCi0JfQotY29uZmlnX2RvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi12b2lkIGF4aV9zdGFydChzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwsIHN0cnVjdCBtc21fY2FtZXJhX3ZmZV9wYXJhbXNfdCB2ZmVfcGFyYW1zKQotewotCWludCByYyA9IDAsIGJ1c192ZWN0b3JfaWR4ID0gMDsKLQl1aW50MzJfdCByZWdfdXBkYXRlID0gMDsKLQl1aW50MzJfdCB2ZmVfbW9kZSA9Ci0JCShheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYKLQkJfihWRkVfT1VUUFVUU19SREkwfFZGRV9PVVRQVVRTX1JESTEpKTsKLQlyYyA9IGF4aV9jb25maWdfYnVmZmVycyhheGlfY3RybCwgdmZlX3BhcmFtcyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoICh2ZmVfcGFyYW1zLmNtZF90eXBlKSB7Ci0JY2FzZSBBWElfQ01EX1BSRVZJRVc6Ci0JCWlmICghYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmR1YWxfZW5hYmxlZCkKLQkJCW1zbV9jYW1pb19idXNfc2NhbGVfY2ZnKAotCQkJcG1jdGwtPnNkYXRhLT5wZGF0YS0+Y2FtX2J1c19zY2FsZV90YWJsZSwgU19QUkVWSUVXKTsKLQkJYnJlYWs7Ci0JY2FzZSBBWElfQ01EX0NBUFRVUkU6Ci0JY2FzZSBBWElfQ01EX1JBV19DQVBUVVJFOgotCQlpZiAoIWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5kdWFsX2VuYWJsZWQpCi0JCQltc21fY2FtaW9fYnVzX3NjYWxlX2NmZygKLQkJCXBtY3RsLT5zZGF0YS0+cGRhdGEtPmNhbV9idXNfc2NhbGVfdGFibGUsIFNfQ0FQVFVSRSk7Ci0JCWJyZWFrOwotCWNhc2UgQVhJX0NNRF9SRUNPUkQ6Ci0JCWlmIChjcHVfaXNfbXNtODkzMCgpIHx8IGNwdV9pc19tc204OTMwYWEoKSB8fAotCQkJY3B1X2lzX21zbTg5MzBhYigpKSB7Ci0JCQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmCi0JCQkJVkZFX09VVFBVVFNfUFJFVklFV19BTkRfVklERU8KLQkJCXx8IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX1ZJREVPX0FORF9QUkVWSUVXKQotCQkJCWJ1c192ZWN0b3JfaWR4ID0gU19WSURFTzsKLQkJCWVsc2UKLQkJCQlidXNfdmVjdG9yX2lkeCA9IFNfQURWX1ZJREVPOwotCQl9IGVsc2UgewotCQkJYnVzX3ZlY3Rvcl9pZHggPSBTX1ZJREVPOwotCQl9Ci0JCWlmICghYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmR1YWxfZW5hYmxlZCkKLQkJCW1zbV9jYW1pb19idXNfc2NhbGVfY2ZnKAotCQkJcG1jdGwtPnNkYXRhLT5wZGF0YS0+Y2FtX2J1c19zY2FsZV90YWJsZSwKLQkJCWJ1c192ZWN0b3JfaWR4KTsKLQkJcmV0dXJuOwotCWNhc2UgQVhJX0NNRF9aU0w6Ci0JCWlmICghYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmR1YWxfZW5hYmxlZCkKLQkJCW1zbV9jYW1pb19idXNfc2NhbGVfY2ZnKAotCQkJcG1jdGwtPnNkYXRhLT5wZGF0YS0+Y2FtX2J1c19zY2FsZV90YWJsZSwgU19aU0wpOwotCQlicmVhazsKLQljYXNlIEFYSV9DTURfTElWRVNIT1Q6Ci0JCWlmICghYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmR1YWxfZW5hYmxlZCkKLQkJCW1zbV9jYW1pb19idXNfc2NhbGVfY2ZnKAotCQkJcG1jdGwtPnNkYXRhLT5wZGF0YS0+Y2FtX2J1c19zY2FsZV90YWJsZSwgU19MSVZFU0hPVCk7Ci0JCXJldHVybjsKLQlkZWZhdWx0OgotCQlyZXR1cm47Ci0JfQotCWF4aV9lbmFibGVfd21faXJxKGF4aV9jdHJsLT5zaGFyZV9jdHJsKTsKLQotCXN3aXRjaCAodmZlX3BhcmFtcy5jbWRfdHlwZSkgewotCWNhc2UgQVhJX0NNRF9SQVdfQ0FQVFVSRToKLQkJbXNtX2NhbWVyYV9pb193KCgKLQkJCTB4MSA8PCBheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMCksCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfQ01EKTsKLQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkrIHZmZTMyX0FYSV9XTV9DRkdbYXhpX2N0cmwtPgotCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMF0pOwotCQlicmVhazsKLQljYXNlIEFYSV9DTURfUFJFVklFVzogewotCQlzd2l0Y2ggKHZmZV9tb2RlKSB7Ci0JCWNhc2UgVkZFX09VVFBVVFNfUFJFVklFVzoKLQkJY2FzZSBWRkVfT1VUUFVUU19QUkVWSUVXX0FORF9WSURFTzoKLQkJCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCQkJVkZFMzJfT1VUUFVUX01PREVfUFJJTUFSWSkgewotCQkJCW1zbV9jYW1lcmFfaW9fdygoCi0JCQkJCTB4MSA8PCBheGlfY3RybC0+c2hhcmVfY3RybC0+Ci0JCQkJCQkJb3V0cGF0aC5vdXQwLmNoMCB8Ci0JCQkJCTB4MSA8PCBheGlfY3RybC0+c2hhcmVfY3RybC0+Ci0JCQkJCQkJb3V0cGF0aC5vdXQwLmNoMSksCi0JCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJCQlWRkVfQlVTX0NNRCk7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlMzJfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDBdKTsKLQkJCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UKLQkJCQkJKyB2ZmUzMl9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMV0pOwotCi0KLQkJCX0gZWxzZSBpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQkJCQlWRkUzMl9PVVRQVVRfTU9ERV9QUklNQVJZX0FMTF9DSE5MUykgewotCQkJCW1zbV9jYW1lcmFfaW9fdygoCi0JCQkJCTB4MSA8PCBheGlfY3RybC0+c2hhcmVfY3RybC0+Ci0JCQkJCQkJb3V0cGF0aC5vdXQwLmNoMCB8Ci0JCQkJCTB4MSA8PCBheGlfY3RybC0+c2hhcmVfY3RybC0+Ci0JCQkJCQkJb3V0cGF0aC5vdXQwLmNoMSB8Ci0JCQkJCTB4MSA8PCBheGlfY3RybC0+c2hhcmVfY3RybC0+Ci0JCQkJCQkJb3V0cGF0aC5vdXQwLmNoMiksCi0JCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJCQlWRkVfQlVTX0NNRCk7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlMzJfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDBdKTsKLQkJCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UKLQkJCQkJKyB2ZmUzMl9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMV0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZQotCQkJCQkrIHZmZTMyX0FYSV9XTV9DRkdbYXhpX2N0cmwtPgotCQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gyXSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCQkJVkZFMzJfT1VUUFVUX01PREVfU0VDT05EQVJZKSB7Ci0JCQkJbXNtX2NhbWVyYV9pb193KCgKLQkJCQkJMHgxIDw8IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT4KLQkJCQkJCW91dHBhdGgub3V0MS5jaDAgfAotCQkJCQkweDEgPDwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPgotCQkJCQkJb3V0cGF0aC5vdXQxLmNoMSksCi0JCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJCVZGRV9CVVNfQ01EKTsKLQkJCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UKLQkJCQkJKyB2ZmUzMl9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMF0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZQotCQkJCQkrIHZmZTMyX0FYSV9XTV9DRkdbYXhpX2N0cmwtPgotCQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxXSk7Ci0JCQl9IGVsc2UgaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCQlWRkUzMl9PVVRQVVRfTU9ERV9TRUNPTkRBUllfQUxMX0NITkxTKSB7Ci0JCQkJbXNtX2NhbWVyYV9pb193KCgKLQkJCQkJMHgxIDw8IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT4KLQkJCQkJCQlvdXRwYXRoLm91dDEuY2gwIHwKLQkJCQkJMHgxIDw8IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT4KLQkJCQkJCQlvdXRwYXRoLm91dDEuY2gxIHwKLQkJCQkJMHgxIDw8IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT4KLQkJCQkJCQlvdXRwYXRoLm91dDEuY2gyKSwKLQkJCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCQkJCVZGRV9CVVNfQ01EKTsKLQkJCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UKLQkJCQkJKyB2ZmUzMl9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMF0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZQotCQkJCQkrIHZmZTMyX0FYSV9XTV9DRkdbYXhpX2N0cmwtPgotCQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxXSk7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlMzJfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDJdKTsKLQkJCX0KLQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCQlWRkUzMl9PVVRQVVRfTU9ERV9QUklNQVJZKSB7Ci0JCQltc21fY2FtZXJhX2lvX3coKAotCQkJCTB4MSA8PCBheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMCB8Ci0JCQkJMHgxIDw8IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxKSwKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfQ01EKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlMzJfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmUzMl9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxXSk7Ci0JCX0gZWxzZSBpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQkJCVZGRTMyX09VVFBVVF9NT0RFX1BSSU1BUllfQUxMX0NITkxTKSB7Ci0JCQltc21fY2FtZXJhX2lvX3coKAotCQkJCTB4MSA8PCBheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMCB8Ci0JCQkJMHgxIDw8IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxIHwKLQkJCQkweDEgPDwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDIpLAotCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19DTUQpOwotCQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmUzMl9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwXSk7Ci0JCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMyX0FYSV9XTV9DRkdbYXhpX2N0cmwtPgotCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDFdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlMzJfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMl0pOwotCQl9Ci0KLQkJaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTMyX09VVFBVVF9NT0RFX1NFQ09OREFSWSkgewotCQkJbXNtX2NhbWVyYV9pb193KCgKLQkJCQkweDEgPDwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDAgfAotCQkJCTB4MSA8PCBheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSksCi0JCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX0NNRCk7Ci0JCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMyX0FYSV9XTV9DRkdbYXhpX2N0cmwtPgotCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDBdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlMzJfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMV0pOwotCQl9IGVsc2UgaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTMyX09VVFBVVF9NT0RFX1NFQ09OREFSWV9BTExfQ0hOTFMpIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygoCi0JCQkJMHgxIDw8IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwIHwKLQkJCQkweDEgPDwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDEgfAotCQkJCTB4MSA8PCBheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMiksCi0JCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX0NNRCk7Ci0JCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTMyX0FYSV9XTV9DRkdbYXhpX2N0cmwtPgotCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDBdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlMzJfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMV0pOwotCQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmUzMl9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gyXSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYgVkZFX09VVFBVVFNfUkRJMCkgewotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmNhcHR1cmVfY250ID0KLQkJCQkJCXZmZV9wYXJhbXMuY2FwdHVyZV9jb3VudDsKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTBfY2FwdHVyZV9jb3VudCA9Ci0JCQkJCQl2ZmVfcGFyYW1zLmNhcHR1cmVfY291bnQ7Ci0JCW1zbV9jYW1lcmFfaW9fdygoCi0JCQkJMHgxIDw8IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDIuY2gwKSwKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfQ01EKTsKLQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMyX0FYSV9XTV9DRkdbYXhpX2N0cmwtPnNoYXJlX2N0cmwtPgotCQkJb3V0cGF0aC5vdXQyLmNoMF0pOwotCX0KLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmIFZGRV9PVVRQVVRTX1JESTEpIHsKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0My5jYXB0dXJlX2NudCA9Ci0JCQkJCQl2ZmVfcGFyYW1zLmNhcHR1cmVfY291bnQ7Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZGkxX2NhcHR1cmVfY291bnQgPQotCQkJCQkJdmZlX3BhcmFtcy5jYXB0dXJlX2NvdW50OwotCQltc21fY2FtZXJhX2lvX3coKAotCQkJCTB4MSA8PCBheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQzLmNoMCksCi0JCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX0NNRCk7Ci0JCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmUzMl9BWElfV01fQ0ZHW2F4aV9jdHJsLT5zaGFyZV9jdHJsLT4KLQkJCW91dHBhdGgub3V0My5jaDBdKTsKLQl9Ci0KLQlheGlfZW5hYmxlX2lycShheGlfY3RybC0+c2hhcmVfY3RybCk7Ci0KLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmIFZGRV9PVVRQVVRTX1JESTApIHsKLQkJaWYgKCFhdG9taWNfY21weGNoZygKLQkJCSZheGlfY3RybC0+c2hhcmVfY3RybC0+cmRpMF91cGRhdGVfYWNrX3BlbmRpbmcsCi0JCQkJMCwgMSkpCi0JCQlyZWdfdXBkYXRlIHw9IDB4MjsKLQl9Ci0JaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgJiBWRkVfT1VUUFVUU19SREkxKSB7Ci0JCWlmICghYXRvbWljX2NtcHhjaGcoCi0JCQkmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTFfdXBkYXRlX2Fja19wZW5kaW5nLAotCQkJCTAsIDEpKQotCQkJcmVnX3VwZGF0ZSB8PSAweDQ7Ci0JfQotCi0JaWYgKHZmZV9tb2RlKSB7Ci0JCWlmICghYXRvbWljX2NtcHhjaGcoCi0JCQkmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnBpeDBfdXBkYXRlX2Fja19wZW5kaW5nLAotCQkJCTAsIDEpKQotCQkJcmVnX3VwZGF0ZSB8PSAweDE7Ci0JfQotCi0JbXNtX2NhbWVyYV9pb193X21iKHJlZ191cGRhdGUsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfUkVHX1VQREFURV9DTUQpOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSB8PQotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlOwotfQotCi12b2lkIGF4aV9zdG9wKHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCwgc3RydWN0IG1zbV9jYW1lcmFfdmZlX3BhcmFtc190IHZmZV9wYXJhbXMpCi17Ci0JdWludDMyX3QgcmVnX3VwZGF0ZSA9IDA7Ci0JdWludDMyX3QgdmZlX21vZGUgPQotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgJiB+KFZGRV9PVVRQVVRTX1JESTB8Ci0JCVZGRV9PVVRQVVRTX1JESTEpOwotCWludCBidXNfdmVjdG9yX2lkeCA9IDA7Ci0KLQlzd2l0Y2ggKHZmZV9wYXJhbXMuY21kX3R5cGUpIHsKLQljYXNlIEFYSV9DTURfUFJFVklFVzoKLQljYXNlIEFYSV9DTURfQ0FQVFVSRToKLQljYXNlIEFYSV9DTURfUkFXX0NBUFRVUkU6Ci0JY2FzZSBBWElfQ01EX1pTTDoKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmNtZF90eXBlID0gdmZlX3BhcmFtcy5jbWRfdHlwZTsKLQkJYnJlYWs7Ci0JY2FzZSBBWElfQ01EX1JFQ09SRDoKLQkJaWYgKCFheGlfY3RybC0+c2hhcmVfY3RybC0+ZHVhbF9lbmFibGVkKQotCQkJbXNtX2NhbWlvX2J1c19zY2FsZV9jZmcoCi0JCQlwbWN0bC0+c2RhdGEtPnBkYXRhLT5jYW1fYnVzX3NjYWxlX3RhYmxlLCBTX1BSRVZJRVcpOwotCQlyZXR1cm47Ci0JY2FzZSBBWElfQ01EX0xJVkVTSE9UOgotCQlpZiAoIWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5kdWFsX2VuYWJsZWQpIHsKLQkJCWJ1c192ZWN0b3JfaWR4ID0gU19WSURFTzsKLQotCQkJaWYgKGNwdV9pc19tc204OTMwKCkgfHwgY3B1X2lzX21zbTg5MzBhYSgpIHx8Ci0JCQkJY3B1X2lzX21zbTg5MzBhYigpKQotCQkJCWJ1c192ZWN0b3JfaWR4ID0gU19BRFZfVklERU87Ci0KLQkJCW1zbV9jYW1pb19idXNfc2NhbGVfY2ZnKAotCQkJcG1jdGwtPnNkYXRhLT5wZGF0YS0+Y2FtX2J1c19zY2FsZV90YWJsZSwKLQkJCWJ1c192ZWN0b3JfaWR4KTsKLQkJfQotCQlyZXR1cm47Ci0JZGVmYXVsdDoKLQkJcmV0dXJuOwotCX0KLQotCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+c3RvcF9pbW1lZGlhdGVseSkgewotCQlheGlfZGlzYWJsZV9pcnEoYXhpX2N0cmwtPnNoYXJlX2N0cmwsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlKTsKLQkJYXhpX3N0b3BfcHJvY2VzcyhheGlfY3RybC0+c2hhcmVfY3RybCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmIFZGRV9PVVRQVVRTX1JESTApIHsKLQkJbXNtX2NhbWVyYV9pb193KDAsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTMyX0FYSV9XTV9DRkdbYXhpX2N0cmwtPnNoYXJlX2N0cmwtPgotCQkJCW91dHBhdGgub3V0Mi5jaDBdKTsKLQkJaWYgKCFhdG9taWNfY21weGNoZygKLQkJCSZheGlfY3RybC0+c2hhcmVfY3RybC0+cmRpMF91cGRhdGVfYWNrX3BlbmRpbmcsCi0JCQkJMCwgMikpCi0JCQlyZWdfdXBkYXRlIHw9IDB4MjsKLQl9Ci0JaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgJiBWRkVfT1VUUFVUU19SREkxKSB7Ci0JCW1zbV9jYW1lcmFfaW9fdygwLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmUzMl9BWElfV01fQ0ZHW2F4aV9jdHJsLT5zaGFyZV9jdHJsLT4KLQkJCQlvdXRwYXRoLm91dDMuY2gwXSk7Ci0JCWlmICghYXRvbWljX2NtcHhjaGcoCi0JCQkmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTFfdXBkYXRlX2Fja19wZW5kaW5nLAotCQkJCTAsIDIpKQotCQkJcmVnX3VwZGF0ZSB8PSAweDQ7Ci0JfQotCWlmICh2ZmVfbW9kZSkgewotCQlpZiAoIWF0b21pY19jbXB4Y2hnKAotCQkJJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT5waXgwX3VwZGF0ZV9hY2tfcGVuZGluZywKLQkJCQkwLCAyKSkKLQkJCXJlZ191cGRhdGUgfD0gMHgxOwotCX0KLQltc21fY2FtZXJhX2lvX3dfbWIocmVnX3VwZGF0ZSwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkVHX1VQREFURV9DTUQpOwotfQotCi1zdGF0aWMgaW50IG1zbV9heGlfY29uZmlnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHZvaWQgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IG1zbV92ZmVfY2ZnX2NtZCBjZmdjbWQ7Ci0Jc3RydWN0IG1zbV9pc3BfY21kIHZmZWNtZDsKLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCA9Ci0JCShzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICopdjRsMl9nZXRfc3ViZGV2X2hvc3RkYXRhKHNkKTsKLQlpbnQgcmMgPSAwLCB2ZmVfY21kX3R5cGUgPSAwLCByZGlfbW9kZSA9IDA7Ci0KLQlpZiAoIWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlKSB7Ci0JCXByX2VycigiJXM6IGJhc2UgYWRkcmVzcyB1bm1hcHBlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JbWVtc2V0KCZjZmdjbWQsIDAsIHNpemVvZihzdHJ1Y3QgbXNtX3ZmZV9jZmdfY21kKSk7Ci0JaWYgKE5VTEwgIT0gYXJnKSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnY21kLCBhcmcsIHNpemVvZihjZmdjbWQpKSkgewotCQkJRVJSX0NPUFlfRlJPTV9VU0VSKCk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCX0KLQltZW1zZXQoJnZmZWNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBtc21faXNwX2NtZCkpOwotCWlmIChOVUxMICE9IGNmZ2NtZC52YWx1ZSkgewotCQlpZiAoY29weV9mcm9tX3VzZXIoJnZmZWNtZCwKLQkJCQkodm9pZCBfX3VzZXIgKikoY2ZnY21kLnZhbHVlKSwKLQkJCQlzaXplb2YodmZlY21kKSkpIHsKLQkJCXByX2VycigiJXMgJWQ6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19mdW5jX18sCi0JCQkJX19MSU5FX18pOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0KLQl2ZmVfY21kX3R5cGUgPSAoY2ZnY21kLmNtZF90eXBlICYgfihDTURfQVhJX0NGR19URVJUMXwKLQkJQ01EX0FYSV9DRkdfVEVSVDIpKTsKLQlzd2l0Y2ggKGNmZ2NtZC5jbWRfdHlwZSkgewotCWNhc2UgQ01EX0FYSV9DRkdfVEVSVDE6ewotCQl1aW50MzJfdCAqYXhpbyA9IE5VTEw7Ci0JCWF4aW8gPSBrbWFsbG9jKHZmZTMyX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgsCi0JCQkJR0ZQX0FUT01JQyk7Ci0JCWlmICghYXhpbykgewotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoYXhpbywgKHZvaWQgX191c2VyICopKHZmZWNtZC52YWx1ZSksCi0JCQkJdmZlMzJfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCkpIHsKLQkJCWtmcmVlKGF4aW8pOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJdmZlMzJfY29uZmlnX2F4aShheGlfY3RybCwgT1VUUFVUX1RFUlQxLCBheGlvKTsKLQkJa2ZyZWUoYXhpbyk7Ci0JCXJldHVybiByYzsKLQkJfQotCWNhc2UgQ01EX0FYSV9DRkdfVEVSVDI6ewotCQl1aW50MzJfdCAqYXhpbyA9IE5VTEw7Ci0JCWF4aW8gPSBrbWFsbG9jKHZmZTMyX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgsCi0JCQkJR0ZQX0FUT01JQyk7Ci0JCWlmICghYXhpbykKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihheGlvLCAodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQl2ZmUzMl9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ubGVuZ3RoKSkgewotCQkJa2ZyZWUoYXhpbyk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQl2ZmUzMl9jb25maWdfYXhpKGF4aV9jdHJsLCBPVVRQVVRfVEVSVDIsIGF4aW8pOwotCQlrZnJlZShheGlvKTsKLQkJcmV0dXJuIHJjOwotCQl9Ci0JY2FzZSBDTURfQVhJX0NGR19URVJUMXxDTURfQVhJX0NGR19URVJUMjp7Ci0JCXVpbnQzMl90ICpheGlvID0gTlVMTDsKLQkJYXhpbyA9IGttYWxsb2ModmZlMzJfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCwKLQkJCQlHRlBfQVRPTUlDKTsKLQkJaWYgKCFheGlvKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXZmZTMyX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgpKSB7Ci0JCQlrZnJlZShheGlvKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCXZmZTMyX2NvbmZpZ19heGkoYXhpX2N0cmwsIE9VVFBVVF9URVJUMXxPVVRQVVRfVEVSVDIsIGF4aW8pOwotCQlrZnJlZShheGlvKTsKLQkJcmV0dXJuIHJjOwotCQl9Ci0JZGVmYXVsdDoKLQkJaWYgKGNmZ2NtZC5jbWRfdHlwZSAmIENNRF9BWElfQ0ZHX1RFUlQxKQotCQkJcmRpX21vZGUgfD0gT1VUUFVUX1RFUlQxOwotCQlpZiAoY2ZnY21kLmNtZF90eXBlICYgQ01EX0FYSV9DRkdfVEVSVDIpCi0JCQlyZGlfbW9kZSB8PSBPVVRQVVRfVEVSVDI7Ci0JfQotCXN3aXRjaCAodmZlX2NtZF90eXBlKSB7Ci0JY2FzZSBDTURfQVhJX0NGR19QUklNOiB7Ci0JCXVpbnQzMl90ICpheGlvID0gTlVMTDsKLQkJYXhpbyA9IGttYWxsb2ModmZlMzJfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCwKLQkJCQlHRlBfQVRPTUlDKTsKLQkJaWYgKCFheGlvKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihheGlvLCAodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQl2ZmUzMl9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ubGVuZ3RoKSkgewotCQkJa2ZyZWUoYXhpbyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQl2ZmUzMl9jb25maWdfYXhpKGF4aV9jdHJsLCByZGlfbW9kZXxPVVRQVVRfUFJJTSwgYXhpbyk7Ci0JCWtmcmVlKGF4aW8pOwotCQlicmVhazsKLQkJfQotCWNhc2UgQ01EX0FYSV9DRkdfUFJJTV9BTExfQ0hOTFM6IHsKLQkJdWludDMyX3QgKmF4aW8gPSBOVUxMOwotCQlheGlvID0ga21hbGxvYyh2ZmUzMl9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ubGVuZ3RoLAotCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIWF4aW8pIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXZmZTMyX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgpKSB7Ci0JCQlrZnJlZShheGlvKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXZmZTMyX2NvbmZpZ19heGkoYXhpX2N0cmwsIHJkaV9tb2RlfE9VVFBVVF9QUklNX0FMTF9DSE5MUywKLQkJCWF4aW8pOwotCQlrZnJlZShheGlvKTsKLQkJYnJlYWs7Ci0JCX0KLQljYXNlIENNRF9BWElfQ0ZHX1BSSU18Q01EX0FYSV9DRkdfU0VDOiB7Ci0JCXVpbnQzMl90ICpheGlvID0gTlVMTDsKLQkJYXhpbyA9IGttYWxsb2ModmZlMzJfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCwKLQkJCQlHRlBfQVRPTUlDKTsKLQkJaWYgKCFheGlvKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihheGlvLCAodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQl2ZmUzMl9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ubGVuZ3RoKSkgewotCQkJa2ZyZWUoYXhpbyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQl2ZmUzMl9jb25maWdfYXhpKGF4aV9jdHJsLAotCQkJcmRpX21vZGV8T1VUUFVUX1BSSU18T1VUUFVUX1NFQywgYXhpbyk7Ci0JCWtmcmVlKGF4aW8pOwotCQlicmVhazsKLQkJfQotCWNhc2UgQ01EX0FYSV9DRkdfUFJJTXxDTURfQVhJX0NGR19TRUNfQUxMX0NITkxTOiB7Ci0JCXVpbnQzMl90ICpheGlvID0gTlVMTDsKLQkJYXhpbyA9IGttYWxsb2ModmZlMzJfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCwKLQkJCQlHRlBfQVRPTUlDKTsKLQkJaWYgKCFheGlvKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihheGlvLCAodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQl2ZmUzMl9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ubGVuZ3RoKSkgewotCQkJa2ZyZWUoYXhpbyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQl2ZmUzMl9jb25maWdfYXhpKGF4aV9jdHJsLAotCQkJcmRpX21vZGV8T1VUUFVUX1BSSU18T1VUUFVUX1NFQ19BTExfQ0hOTFMsIGF4aW8pOwotCQlrZnJlZShheGlvKTsKLQkJYnJlYWs7Ci0JCX0KLQljYXNlIENNRF9BWElfQ0ZHX1BSSU1fQUxMX0NITkxTfENNRF9BWElfQ0ZHX1NFQzogewotCQl1aW50MzJfdCAqYXhpbyA9IE5VTEw7Ci0JCWF4aW8gPSBrbWFsbG9jKHZmZTMyX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgsCi0JCQkJR0ZQX0FUT01JQyk7Ci0JCWlmICghYXhpbykgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoYXhpbywgKHZvaWQgX191c2VyICopKHZmZWNtZC52YWx1ZSksCi0JCQkJdmZlMzJfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCkpIHsKLQkJCWtmcmVlKGF4aW8pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJdmZlMzJfY29uZmlnX2F4aShheGlfY3RybCwKLQkJCXJkaV9tb2RlfE9VVFBVVF9QUklNX0FMTF9DSE5MU3xPVVRQVVRfU0VDLCBheGlvKTsKLQkJa2ZyZWUoYXhpbyk7Ci0JCWJyZWFrOwotCQl9Ci0KLQljYXNlIENNRF9BWElfQ0ZHX1BSSU1fQUxMX0NITkxTfENNRF9BWElfQ0ZHX1NFQ19BTExfQ0hOTFM6Ci0JCXByX2VycigiJXMgSW52YWxpZC9VbnN1cHBvcnRlZCBBWEkgY29uZmlndXJhdGlvbiAleCIsCi0JCQlfX2Z1bmNfXywgY2ZnY21kLmNtZF90eXBlKTsKLQkJYnJlYWs7Ci0JY2FzZSBDTURfQVhJX1NUQVJUOiB7Ci0JCXN0cnVjdCBtc21fY2FtZXJhX3ZmZV9wYXJhbXNfdCB2ZmVfcGFyYW1zOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnZmZV9wYXJhbXMsCi0JCQkJKHZvaWQgX191c2VyICopKHZmZWNtZC52YWx1ZSksCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fY2FtZXJhX3ZmZV9wYXJhbXNfdCkpKSB7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSA9Ci0JCQl2ZmVfcGFyYW1zLm9wZXJhdGlvbl9tb2RlOwotCQlheGlfc3RhcnQocG1jdGwsIGF4aV9jdHJsLCB2ZmVfcGFyYW1zKTsKLQkJfQotCQlicmVhazsKLQljYXNlIENNRF9BWElfU1RPUDogewotCQlzdHJ1Y3QgbXNtX2NhbWVyYV92ZmVfcGFyYW1zX3QgdmZlX3BhcmFtczsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZmVfcGFyYW1zLAotCQkJCSh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2NhbWVyYV92ZmVfcGFyYW1zX3QpKSkgewotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgPQotCQkJdmZlX3BhcmFtcy5vcGVyYXRpb25fbW9kZTsKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnN0b3BfaW1tZWRpYXRlbHkgPQotCQkJdmZlX3BhcmFtcy5zdG9wX2ltbWVkaWF0ZWx5OwotCQlheGlfc3RvcChwbWN0bCwgYXhpX2N0cmwsIHZmZV9wYXJhbXMpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ01EX0FYSV9SRVNFVDogewotCQlzdHJ1Y3QgbXNtX2NhbWVyYV92ZmVfcGFyYW1zX3QgdmZlX3BhcmFtczsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZmVfcGFyYW1zLAotCQkJCSh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2NhbWVyYV92ZmVfcGFyYW1zX3QpKSkgewotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWF4aV9yZXNldChheGlfY3RybCwgdmZlX3BhcmFtcyk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDTURfQVhJX0FCT1JUOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT5zeW5jX2Fib3J0LAotCQkJCSh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXNpemVvZih1aW50OF90KSkpIHsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlheGlfYWJvcnQoYXhpX2N0cmwpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzIFVuc3VwcG9ydGVkIEFYSSBjb25maWd1cmF0aW9uICV4ICIsIF9fZnVuY19fLAotCQkJY2ZnY21kLmNtZF90eXBlKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2F4aV9wcm9jZXNzX2lycShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IGF4aV9jdHJsX3QgKmF4aV9jdHJsID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0JdWludDMyX3QgaXJxc3RhdHVzID0gKHVpbnQzMl90KSBhcmc7Ci0KLQlpZiAoIWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlKSB7Ci0JCXByX2VycigiJXM6IGJhc2UgYWRkcmVzcyB1bm1hcHBlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JLyogbmV4dCwgY2hlY2sgb3V0cHV0IHBhdGggcmVsYXRlZCBpbnRlcnJ1cHRzLiAqLwotCWlmIChpcnFzdGF0dXMgJgotCQlWRkVfSVJRX1NUQVRVUzBfSU1BR0VfQ09NUE9TSVRfRE9ORTBfTUFTSykgewotCQlDREJHKCJJbWFnZSBjb21wb3NpdGUgZG9uZSAwIGlycSBvY2N1cmVkLlxuIik7Ci0JCXZmZTMyX3Byb2Nlc3Nfb3V0cHV0X3BhdGhfaXJxXzAoYXhpX2N0cmwpOwotCX0KLQlpZiAoaXJxc3RhdHVzICYKLQkJVkZFX0lSUV9TVEFUVVMwX0lNQUdFX0NPTVBPU0lUX0RPTkUxX01BU0spIHsKLQkJQ0RCRygiSW1hZ2UgY29tcG9zaXRlIGRvbmUgMSBpcnEgb2NjdXJlZC5cbiIpOwotCQl2ZmUzMl9wcm9jZXNzX291dHB1dF9wYXRoX2lycV8xKGF4aV9jdHJsKTsKLQl9Ci0KLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgJgotCQlWRkUzMl9PVVRQVVRfTU9ERV9URVJUSUFSWTEpCi0JCWlmIChpcnFzdGF0dXMgJiAoMHgxIDw8IChheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmNoMAotCQkJKyBWRkVfV01fT0ZGU0VUKSkpCi0JCQl2ZmUzMl9wcm9jZXNzX291dHB1dF9wYXRoX2lycV9yZGkwKGF4aV9jdHJsKTsKLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgJgotCQlWRkUzMl9PVVRQVVRfTU9ERV9URVJUSUFSWTIpCi0JCWlmIChpcnFzdGF0dXMgJiAoMHgxIDw8IChheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQzLmNoMAotCQkJKyBWRkVfV01fT0ZGU0VUKSkpCi0JCQl2ZmUzMl9wcm9jZXNzX291dHB1dF9wYXRoX2lycV9yZGkxKGF4aV9jdHJsKTsKLQotCS8qIGluIHNuYXBzaG90IG1vZGUgaWYgZG9uZSB0aGVuIHNlbmQKLQlzbmFwc2hvdCBkb25lIG1lc3NhZ2UgKi8KLQlpZiAoCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmCi0JCQlWRkVfT1VUUFVUU19USFVNQl9BTkRfTUFJTiB8fAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJVkZFX09VVFBVVFNfTUFJTl9BTkRfVEhVTUIgfHwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9KUEVHIHx8Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmCi0JCQlWRkVfT1VUUFVUU19KUEVHX0FORF9USFVNQiB8fAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJVkZFX09VVFBVVFNfUkFXKSB7Ci0JCWlmICgoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jYXB0dXJlX2NudCA9PSAwKQotCQkJCSYmIChheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLgotCQkJCWNhcHR1cmVfY250ID09IDApKSB7Ci0JCQl1aW50MzJfdCBtb2RlID0KLQkJCQkoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCQl+KFZGRV9PVVRQVVRTX1JESTB8VkZFX09VVFBVVFNfUkRJMSkpOwotCQkJdWludDE2X3Qgb3V0cHV0X21vZGUgPQotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgJgotCQkJCX4oVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkxfAotCQkJCVZGRTMyX09VVFBVVF9NT0RFX1RFUlRJQVJZMik7Ci0JCQlpZiAoIWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5kdWFsX2VuYWJsZWQpCi0JCQkJbXNtX2NhbWVyYV9pb193X21iKAotCQkJCQlDQU1JRl9DT01NQU5EX1NUT1BfSU1NRURJQVRFTFksCi0JCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJVkZFX0NBTUlGX0NPTU1BTkQpOwotCQkJYXhpX2Rpc2FibGVfd21faXJxKGF4aV9jdHJsLT5zaGFyZV9jdHJsLCBvdXRwdXRfbW9kZSk7Ci0JCQlheGlfZGlzYWJsZV9pcnEoYXhpX2N0cmwtPnNoYXJlX2N0cmwsIG1vZGUpOwotCQkJdmZlMzJfc2VuZF9pc3BfbXNnKCZheGlfY3RybC0+c3ViZGV2LAotCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmVGcmFtZUlkLAotCQkJCU1TR19JRF9QSVgwX1VQREFURV9BQ0spOwotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC4KLQkJCQljYXB0dXJlX2NudCA9IC0xOwotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS4KLQkJCQljYXB0dXJlX2NudCA9IC0xOwotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgJj0KLQkJCQkoVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkxfAotCQkJCVZGRTMyX09VVFBVVF9NT0RFX1RFUlRJQVJZMik7Ci0JCX0KLQl9Ci0KLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5jYXB0dXJlX2NudCA9PSAwKSB7Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICY9Ci0JCQkJflZGRTMyX09VVFBVVF9NT0RFX1RFUlRJQVJZMTsKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5jYXB0dXJlX2NudCA9IC0xOwotCX0KLQotCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQzLmNhcHR1cmVfY250ID09IDApIHsKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgJj0KLQkJCQl+VkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkyOwotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQzLmNhcHR1cmVfY250ID0gLTE7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1zbV9heGlfYnVmX2NmZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2b2lkIF9fdXNlciAqYXJnKQotewotCXN0cnVjdCBtc21fY2FtdmZlX3BhcmFtcyAqdmZlX3BhcmFtcyA9Ci0JCShzdHJ1Y3QgbXNtX2NhbXZmZV9wYXJhbXMgKilhcmc7Ci0Jc3RydWN0IG1zbV92ZmVfY2ZnX2NtZCAqY21kID0gdmZlX3BhcmFtcy0+dmZlX2NmZzsKLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQl2b2lkICpkYXRhID0gdmZlX3BhcmFtcy0+ZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSkgewotCQlwcl9lcnIoIiVzOiBiYXNlIGFkZHJlc3MgdW5tYXBwZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0Jc3dpdGNoIChjbWQtPmNtZF90eXBlKSB7Ci0JY2FzZSBDTURfQ09ORklHX1BJTkdfQUREUjogewotCQlpbnQgcGF0aCA9ICooKGludCAqKWNtZC0+dmFsdWUpOwotCQlzdHJ1Y3QgdmZlMzJfb3V0cHV0X2NoICpvdXRjaCA9Ci0JCQl2ZmUzMl9nZXRfY2gocGF0aCwgYXhpX2N0cmwtPnNoYXJlX2N0cmwpOwotCQlvdXRjaC0+cGluZyA9ICooKHN0cnVjdCBtc21fZnJlZV9idWYgKilkYXRhKTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBDTURfQ09ORklHX1BPTkdfQUREUjogewotCQlpbnQgcGF0aCA9ICooKGludCAqKWNtZC0+dmFsdWUpOwotCQlzdHJ1Y3QgdmZlMzJfb3V0cHV0X2NoICpvdXRjaCA9Ci0JCQl2ZmUzMl9nZXRfY2gocGF0aCwgYXhpX2N0cmwtPnNoYXJlX2N0cmwpOwotCQlvdXRjaC0+cG9uZyA9ICooKHN0cnVjdCBtc21fZnJlZV9idWYgKilkYXRhKTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBDTURfQ09ORklHX0ZSRUVfQlVGX0FERFI6IHsKLQkJaW50IHBhdGggPSAqKChpbnQgKiljbWQtPnZhbHVlKTsKLQkJc3RydWN0IHZmZTMyX291dHB1dF9jaCAqb3V0Y2ggPQotCQkJdmZlMzJfZ2V0X2NoKHBhdGgsIGF4aV9jdHJsLT5zaGFyZV9jdHJsKTsKLQkJb3V0Y2gtPmZyZWVfYnVmID0gKigoc3RydWN0IG1zbV9mcmVlX2J1ZiAqKWRhdGEpOwotCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlcyBVbnN1cHBvcnRlZCBBWEkgQnVmIGNvbmZpZyAleCAiLCBfX2Z1bmNfXywKLQkJCWNtZC0+Y21kX3R5cGUpOwotCX0KLQlyZXR1cm4gcmM7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2ludGVybmFsX29wcyBtc21fdmZlX2ludGVybmFsX29wczsKLQotc3RhdGljIGxvbmcgbXNtX2F4aV9zdWJkZXZfaW9jdGwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlpbnQgcmMgPSAtRU5PSU9DVExDTUQ7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFZJRElPQ19NU01fQVhJX0lOSVQ6IHsKLQkJdWludDhfdCBkdWFsX2VuYWJsZWQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZHVhbF9lbmFibGVkLAotCQkJCSh2b2lkIF9fdXNlciAqKShhcmcpLAotCQkJCXNpemVvZih1aW50OF90KSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmMgPSBtc21fYXhpX3N1YmRldl9pbml0KHNkLCBkdWFsX2VuYWJsZWQpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVklESU9DX01TTV9BWElfQ0ZHOgotCQlyYyA9IG1zbV9heGlfY29uZmlnKHNkLCBhcmcpOwotCQlicmVhazsKLQljYXNlIFZJRElPQ19NU01fQVhJX0lSUToKLQkJbXNtX2F4aV9wcm9jZXNzX2lycShzZCwgYXJnKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQljYXNlIFZJRElPQ19NU01fQVhJX0JVRl9DRkc6Ci0JCW1zbV9heGlfYnVmX2NmZyhzZCwgYXJnKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQljYXNlIFZJRElPQ19NU01fQVhJX1JFTEVBU0U6Ci0JCW1zbV9heGlfc3ViZGV2X3JlbGVhc2Uoc2QpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgVklESU9DX01TTV9BWElfUkRJX0NPVU5UX1VQREFURTogewotCQlzdHJ1Y3QgcmRpX2NvdW50X21zZyAqbXNnID0gKHN0cnVjdCByZGlfY291bnRfbXNnICopYXJnOwotCQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQkJc3dpdGNoIChtc2ctPnJkaV9pbnRlcmZhY2UpIHsKLQkJY2FzZSBSRElfMDoKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZGkwRnJhbWVJZCA9IG1zZy0+Y291bnQ7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBSRElfMToKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZGkxRnJhbWVJZCA9IG1zZy0+Y291bnQ7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBSRElfMjoKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZGkyRnJhbWVJZCA9IG1zZy0+Y291bnQ7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2VycigiJXM6IEluY29ycmVjdCBpbnRlcmZhY2Ugc2VudFxuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGNvbW1hbmQgJWQgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXywKLQkJCQkJCV9JT0NfTlIoY21kKSk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbXNtX2F4aV9zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmlvY3RsID0gbXNtX2F4aV9zdWJkZXZfaW9jdGwsCi0JLmludGVycnVwdF9zZXJ2aWNlX3JvdXRpbmUgPSBtc21fYXhpX3N1YmRldl9pc3Jfcm91dGluZSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG1zbV9heGlfc3ViZGV2X3ZpZGVvX29wcyA9IHsKLQkuc19jcnlzdGFsX2ZyZXEgPSBtc21fYXhpX3N1YmRldl9zX2NyeXN0YWxfZnJlcSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG1zbV9heGlfc3ViZGV2X29wcyA9IHsKLQkuY29yZSA9ICZtc21fYXhpX3N1YmRldl9jb3JlX29wcywKLQkudmlkZW8gPSAmbXNtX2F4aV9zdWJkZXZfdmlkZW9fb3BzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgbXNtX2F4aV9pbnRlcm5hbF9vcHM7Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHZmZTMyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmw7Ci0Jc3RydWN0IHZmZTMyX2N0cmxfdHlwZSAqdmZlMzJfY3RybDsKLQlzdHJ1Y3QgdmZlX3NoYXJlX2N0cmxfdCAqc2hhcmVfY3RybDsKLQlzdHJ1Y3QgaW50cl90YWJsZV9lbnRyeSBpcnFfcmVxOwotCXN0cnVjdCBtc21fY2FtX3N1YmRldl9pbmZvIHNkX2luZm87Ci0KLQlDREJHKCIlczogZGV2aWNlIGlkID0gJWRcbiIsIF9fZnVuY19fLCBwZGV2LT5pZCk7Ci0KLQlzaGFyZV9jdHJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZmZV9zaGFyZV9jdHJsX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNoYXJlX2N0cmwpIHsKLQkJcHJfZXJyKCIlczogbm8gZW5vdWdoIG1lbW9yeVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlheGlfY3RybCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBheGlfY3RybF90KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFheGlfY3RybCkgewotCQlwcl9lcnIoIiVzOiBubyBlbm91Z2ggbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCWtmcmVlKHNoYXJlX2N0cmwpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQl2ZmUzMl9jdHJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZmZTMyX2N0cmxfdHlwZSksIEdGUF9LRVJORUwpOwotCWlmICghdmZlMzJfY3RybCkgewotCQlwcl9lcnIoIiVzOiBubyBlbm91Z2ggbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCWtmcmVlKHNoYXJlX2N0cmwpOwotCQlrZnJlZShheGlfY3RybCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXNoYXJlX2N0cmwtPmF4aV9jdHJsID0gYXhpX2N0cmw7Ci0Jc2hhcmVfY3RybC0+dmZlMzJfY3RybCA9IHZmZTMyX2N0cmw7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwgPSBzaGFyZV9jdHJsOwotCXZmZTMyX2N0cmwtPnNoYXJlX2N0cmwgPSBzaGFyZV9jdHJsOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5heGlfcmVmX2NudCA9IDA7Ci0JdjRsMl9zdWJkZXZfaW5pdCgmYXhpX2N0cmwtPnN1YmRldiwgJm1zbV9heGlfc3ViZGV2X29wcyk7Ci0JYXhpX2N0cmwtPnN1YmRldi5pbnRlcm5hbF9vcHMgPSAmbXNtX2F4aV9pbnRlcm5hbF9vcHM7Ci0JYXhpX2N0cmwtPnN1YmRldi5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKLQlzbnByaW50ZihheGlfY3RybC0+c3ViZGV2Lm5hbWUsCi0JCQkgc2l6ZW9mKGF4aV9jdHJsLT5zdWJkZXYubmFtZSksICJheGkiKTsKLQl2NGwyX3NldF9zdWJkZXZkYXRhKCZheGlfY3RybC0+c3ViZGV2LCBheGlfY3RybCk7Ci0JYXhpX2N0cmwtPnBkZXYgPSBwZGV2OwotCi0Jc2RfaW5mby5zZGV2X3R5cGUgPSBBWElfREVWOwotCXNkX2luZm8uc2RfaW5kZXggPSAwOwotCXNkX2luZm8uaXJxX251bSA9IDA7Ci0JbXNtX2NhbV9yZWdpc3Rlcl9zdWJkZXZfbm9kZSgmYXhpX2N0cmwtPnN1YmRldiwgJnNkX2luZm8pOwotCi0JbWVkaWFfZW50aXR5X2luaXQoJmF4aV9jdHJsLT5zdWJkZXYuZW50aXR5LCAwLCBOVUxMLCAwKTsKLQlheGlfY3RybC0+c3ViZGV2LmVudGl0eS50eXBlID0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVY7Ci0JYXhpX2N0cmwtPnN1YmRldi5lbnRpdHkuZ3JvdXBfaWQgPSBBWElfREVWOwotCWF4aV9jdHJsLT5zdWJkZXYuZW50aXR5Lm5hbWUgPSBwZGV2LT5uYW1lOwotCWF4aV9jdHJsLT5zdWJkZXYuZW50aXR5LnJldmlzaW9uID0gYXhpX2N0cmwtPnN1YmRldi5kZXZub2RlLT5udW07Ci0KLQl2NGwyX3N1YmRldl9pbml0KCZ2ZmUzMl9jdHJsLT5zdWJkZXYsICZtc21fdmZlX3N1YmRldl9vcHMpOwotCXZmZTMyX2N0cmwtPnN1YmRldi5pbnRlcm5hbF9vcHMgPSAmbXNtX3ZmZV9pbnRlcm5hbF9vcHM7Ci0JdmZlMzJfY3RybC0+c3ViZGV2LmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOwotCXNucHJpbnRmKHZmZTMyX2N0cmwtPnN1YmRldi5uYW1lLAotCQkJIHNpemVvZih2ZmUzMl9jdHJsLT5zdWJkZXYubmFtZSksICJ2ZmUzLjIiKTsKLQl2NGwyX3NldF9zdWJkZXZkYXRhKCZ2ZmUzMl9jdHJsLT5zdWJkZXYsIHZmZTMyX2N0cmwpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsICZ2ZmUzMl9jdHJsLT5zdWJkZXYpOwotCi0JYXhpX2N0cmwtPnZmZW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKLQkJCQkJSU9SRVNPVVJDRV9NRU0sICJ2ZmUzMiIpOwotCWlmICghYXhpX2N0cmwtPnZmZW1lbSkgewotCQlwcl9lcnIoIiVzOiBubyBtZW0gcmVzb3VyY2U/XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byB2ZmUzMl9ub19yZXNvdXJjZTsKLQl9Ci0JYXhpX2N0cmwtPnZmZWlycSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKLQkJCQkJSU9SRVNPVVJDRV9JUlEsICJ2ZmUzMiIpOwotCWlmICghYXhpX2N0cmwtPnZmZWlycSkgewotCQlwcl9lcnIoIiVzOiBubyBpcnEgcmVzb3VyY2U/XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byB2ZmUzMl9ub19yZXNvdXJjZTsKLQl9Ci0KLQlheGlfY3RybC0+dmZlaW8gPSByZXF1ZXN0X21lbV9yZWdpb24oYXhpX2N0cmwtPnZmZW1lbS0+c3RhcnQsCi0JCXJlc291cmNlX3NpemUoYXhpX2N0cmwtPnZmZW1lbSksIHBkZXYtPm5hbWUpOwotCWlmICghYXhpX2N0cmwtPnZmZWlvKSB7Ci0JCXByX2VycigiJXM6IG5vIHZhbGlkIG1lbSByZWdpb25cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gdmZlMzJfbm9fcmVzb3VyY2U7Ci0JfQotCi0JYXhpX2N0cmwtPmZzX3ZmZSA9IHJlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgInZkZCIpOwotCWlmIChJU19FUlIoYXhpX2N0cmwtPmZzX3ZmZSkpIHsKLQkJcHJfZXJyKCIlczogUmVndWxhdG9yIGdldCBmYWlsZWQgJWxkXG4iLCBfX2Z1bmNfXywKLQkJCVBUUl9FUlIoYXhpX2N0cmwtPmZzX3ZmZSkpOwotCQlheGlfY3RybC0+ZnNfdmZlID0gTlVMTDsKLQl9Ci0KLQkvKiBSZWdpc3RlciBzdWJkZXYgbm9kZSBiZWZvcmUgcmVxdWVzdGluZyBpcnEgc2luY2UKLQkgKiBpcnFfbnVtIGlzIG5lZWRlZCBieSBtc21fY2FtX3NlcnZlciAqLwotCXNkX2luZm8uc2Rldl90eXBlID0gVkZFX0RFVjsKLQlzZF9pbmZvLnNkX2luZGV4ID0gMDsKLQlzZF9pbmZvLmlycV9udW0gPSBheGlfY3RybC0+dmZlaXJxLT5zdGFydDsKLQltc21fY2FtX3JlZ2lzdGVyX3N1YmRldl9ub2RlKCZ2ZmUzMl9jdHJsLT5zdWJkZXYsICZzZF9pbmZvKTsKLQotCW1lZGlhX2VudGl0eV9pbml0KCZ2ZmUzMl9jdHJsLT5zdWJkZXYuZW50aXR5LCAwLCBOVUxMLCAwKTsKLQl2ZmUzMl9jdHJsLT5zdWJkZXYuZW50aXR5LnR5cGUgPSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFVjsKLQl2ZmUzMl9jdHJsLT5zdWJkZXYuZW50aXR5Lmdyb3VwX2lkID0gVkZFX0RFVjsKLQl2ZmUzMl9jdHJsLT5zdWJkZXYuZW50aXR5Lm5hbWUgPSBwZGV2LT5uYW1lOwotCXZmZTMyX2N0cmwtPnN1YmRldi5lbnRpdHkucmV2aXNpb24gPSB2ZmUzMl9jdHJsLT5zdWJkZXYuZGV2bm9kZS0+bnVtOwotCi0JLyogUmVxdWVzdCBmb3IgdGhpcyBkZXZpY2UgaXJxIGZyb20gdGhlIGNhbWVyYSBzZXJ2ZXIuIElmIHRoZQotCSAqIElSUSBSb3V0ZXIgaXMgcHJlc2VudCBvbiB0aGlzIHRhcmdldCwgdGhlIGludGVycnVwdCB3aWxsIGJlCi0JICogaGFuZGxlZCBieSB0aGUgY2FtZXJhIHNlcnZlciBhbmQgdGhlIGludGVycnVwdCBzZXJ2aWNlCi0JICogcm91dGluZSBjYWxsZWQuIElmIHRoZSByZXF1ZXN0X2lycSBjYWxsIHJldHVybnMgRU5YSU8sIHRoZW4KLQkgKiB0aGUgSVJRIFJvdXRlciBoYXJkd2FyZSBpcyBub3QgcHJlc2VudCBvbiB0aGlzIHRhcmdldC4gV2UKLQkgKiBoYXZlIHRvIHJlcXVlc3QgZm9yIHRoZSBpcnEgb3Vyc2VsdmVzIGFuZCByZWdpc3RlciB0aGUKLQkgKiBhcHByb3ByaWF0ZSBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KLQlpcnFfcmVxLmNhbV9od19pZHggICAgICAgPSBNU01fQ0FNX0hXX1ZGRTA7Ci0JaXJxX3JlcS5kZXZfbmFtZSAgICAgICAgID0gInZmZSI7Ci0JaXJxX3JlcS5pcnFfaWR4ICAgICAgICAgID0gQ0FNRVJBX1NTX0lSUV84OwotCWlycV9yZXEuaXJxX251bSAgICAgICAgICA9IGF4aV9jdHJsLT52ZmVpcnEtPnN0YXJ0OwotCWlycV9yZXEuaXNfY29tcG9zaXRlICAgICA9IDA7Ci0JaXJxX3JlcS5pcnFfdHJpZ2dlcl90eXBlID0gSVJRRl9UUklHR0VSX1JJU0lORzsKLQlpcnFfcmVxLm51bV9od2NvcmUgICAgICAgPSAxOwotCWlycV9yZXEuc3ViZGV2X2xpc3RbMF0gICA9ICZheGlfY3RybC0+c3ViZGV2OwotCWlycV9yZXEuZGF0YSAgICAgICAgICAgICA9ICh2b2lkICopYXhpX2N0cmw7Ci0JcmMgPSBtc21fY2FtX3NlcnZlcl9yZXF1ZXN0X2lycSgmaXJxX3JlcSk7Ci0JaWYgKHJjID09IC1FTlhJTykgewotCQkvKiBJUlEgUm91dGVyIGhhcmR3YXJlIGlzIG5vdCBwcmVzZW50IG9uIHRoaXMgaGFyZHdhcmUuCi0JCSAqIFJlcXVlc3QgZm9yIHRoZSBJUlEgYW5kIHJlZ2lzdGVyIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KLQkJcmMgPSByZXF1ZXN0X2lycShheGlfY3RybC0+dmZlaXJxLT5zdGFydCwgdmZlMzJfcGFyc2VfaXJxLAotCQkJSVJRRl9UUklHR0VSX1JJU0lORywgInZmZSIsIGF4aV9jdHJsKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGF4aV9jdHJsLT52ZmVtZW0tPnN0YXJ0LAotCQkJCXJlc291cmNlX3NpemUoYXhpX2N0cmwtPnZmZW1lbSkpOwotCQkJcHJfZXJyKCIlczogaXJxIHJlcXVlc3QgZmFpbFxuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIHZmZTMyX25vX3Jlc291cmNlOwotCQl9Ci0JCWRpc2FibGVfaXJxKGF4aV9jdHJsLT52ZmVpcnEtPnN0YXJ0KTsKLQl9IGVsc2UgaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzIEVycm9yIHJlZ2lzdGVyaW5nIGlycSAiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gdmZlMzJfbm9fcmVzb3VyY2U7Ci0JfQotCi0jaWZkZWYgQ09ORklHX01TTV9JT01NVQotCS8qZ2V0IGRldmljZSBjb250ZXh0IGZvciBJT01NVSovCi0JYXhpX2N0cmwtPmlvbW11X2N0eF9pbWd3ciA9Ci0JCW1zbV9pb21tdV9nZXRfY3R4KCJ2ZmVfaW1nd3IiKTsgLypyZS1jb25maXJtKi8KLQlheGlfY3RybC0+aW9tbXVfY3R4X21pc2MgPQotCQltc21faW9tbXVfZ2V0X2N0eCgidmZlX21pc2MiKTsgLypyZS1jb25maXJtKi8KLQlpZiAoIWF4aV9jdHJsLT5pb21tdV9jdHhfaW1nd3IgfHwgIWF4aV9jdHJsLT5pb21tdV9jdHhfbWlzYykgewotCQlyZWxlYXNlX21lbV9yZWdpb24oYXhpX2N0cmwtPnZmZW1lbS0+c3RhcnQsCi0JCQlyZXNvdXJjZV9zaXplKGF4aV9jdHJsLT52ZmVtZW0pKTsKLQkJcHJfZXJyKCIlczogTm8gaW9tbXUgZncgY29udGV4dCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gdmZlMzJfbm9fcmVzb3VyY2U7Ci0JfQotI2VuZGlmCi0KLQl0YXNrbGV0X2luaXQoJmF4aV9jdHJsLT52ZmUzMl90YXNrbGV0LAotCQlheGkzMl9kb190YXNrbGV0LCAodW5zaWduZWQgbG9uZylheGlfY3RybCk7Ci0KLQl2ZmUzMl9jdHJsLT5wZGV2ID0gcGRldjsKLQkvKmRpc2FibGUgYmF5ZXIgc3RhdHMgYnkgZGVmYXVsdCovCi0JdmZlMzJfY3RybC0+dmVyX251bS5tYWluID0gMDsKLQlyZXR1cm4gMDsKLQotdmZlMzJfbm9fcmVzb3VyY2U6Ci0Ja2ZyZWUodmZlMzJfY3RybCk7Ci0Ja2ZyZWUoYXhpX2N0cmwpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB2ZmUzMl9kcml2ZXIgPSB7Ci0JLnByb2JlID0gdmZlMzJfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBNU01fVkZFX0RSVl9OQU1FLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX3ZmZTMyX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdmZlMzJfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG1zbV92ZmUzMl9leGl0X21vZHVsZSh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2ZmUzMl9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChtc21fdmZlMzJfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQobXNtX3ZmZTMyX2V4aXRfbW9kdWxlKTsKLU1PRFVMRV9ERVNDUklQVElPTigiVkZFIDMuMiBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTMyLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmUzMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTRlMGJkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19NU01fVkZFMzJfSF9fCi0jZGVmaW5lIF9fTVNNX1ZGRTMyX0hfXwotCi0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSAibXNtX3ZmZV9zdGF0c19idWYuaCIKLQotI2RlZmluZSBUUlVFICAxCi0jZGVmaW5lIEZBTFNFIDAKLQotI2RlZmluZSBWRkUzMl9IV19OVU1CRVIgMHgzMDMwQgotI2RlZmluZSBWRkUzM19IV19OVU1CRVIgMHgzMDQwOAotCi0vKiBUaGlzIGRlZmluZXMgdG90YWwgbnVtYmVyIHJlZ2lzdGVycyBpbiBWRkUuCi0gKiBFYWNoIHJlZ2lzdGVyIGlzIDQgYnl0ZXMgc28gdG8gZ2V0IHRoZSByYW5nZSwKLSAqIG11bHRpcGx5IHRoaXMgbnVtYmVyIHdpdGggNC4gKi8KLSNkZWZpbmUgVkZFMzJfUkVHSVNURVJfVE9UQUwgMHgwMDAwMDFDRAotI2RlZmluZSBWRkUzM19SRUdJU1RFUl9UT1RBTCAweDAwMDAwMUVFCi0KLS8qIGF0IHN0YXJ0IG9mIGNhbWlmLCAgYml0IDE6MCA9IDB4MDE6ZW5hYmxlCi0gKiBpbWFnZSBkYXRhIGNhcHR1cmUgYXQgZnJhbWUgYm91bmRhcnkuICovCi0jZGVmaW5lIENBTUlGX0NPTU1BTkRfU1RBUlQgIDB4MDAwMDAwMDUKLQotLyogYml0IDI9IDB4MTpjbGVhciB0aGUgQ0FNSUZfU1RBVFVTIHJlZ2lzdGVyCi0gKiB2YWx1ZS4gKi8KLSNkZWZpbmUgQ0FNSUZfQ09NTUFORF9DTEVBUiAgMHgwMDAwMDAwNAotCi0vKiBhdCBzdG9wIG9mIHZmZSBwaXBlbGluZSwgZm9yIG5vdyBpdCBpcyBhc3N1bWVkCi0gKiB0aGF0IGNhbWlmIHdpbGwgc3RvcCBhdCBhbnkgdGltZS4gQml0IDE6MCA9IDB4MTA6Ci0gKiBkaXNhYmxlIGltYWdlIGRhdGEgY2FwdHVyZSBpbW1lZGlhdGVseS4gKi8KLSNkZWZpbmUgQ0FNSUZfQ09NTUFORF9TVE9QX0lNTUVESUFURUxZICAweDAwMDAwMDAyCi0KLS8qIGF0IHN0b3Agb2YgdmZlIHBpcGVsaW5lLCBmb3Igbm93IGl0IGlzIGFzc3VtZWQKLSAqIHRoYXQgY2FtaWYgd2lsbCBzdG9wIGF0IGFueSB0aW1lLiBCaXQgMTowID0gMHgwMDoKLSAqIGRpc2FibGUgaW1hZ2UgZGF0YSBjYXB0dXJlIGF0IGZyYW1lIGJvdW5kYXJ5ICovCi0jZGVmaW5lIENBTUlGX0NPTU1BTkRfU1RPUF9BVF9GUkFNRV9CT1VOREFSWSAgMHgwMDAwMDAwMAotCi0vKiB0byBoYWx0IGF4aSBicmlkZ2UgKi8KLSNkZWZpbmUgQVhJX0hBTFQgIDB4MDAwMDAwMDEKLQotLyogY2xlYXIgdGhlIGhhbHQgYml0LiAqLwotI2RlZmluZSBBWElfSEFMVF9DTEVBUiAgMHgwMDAwMDAwMAotCi0vKiByZXNldCB0aGUgcGlwZWxpbmUgd2hlbiBzdG9wIGNvbW1hbmQgaXMgaXNzdWVkLgotICogKHdpdGhvdXQgcmVzZXQgdGhlIHJlZ2lzdGVyLikgYml0IDI2LTMyID0gMCwKLSAqIGRvbWFpbiByZXNldCwgYml0IDAtOSA9IDEgZm9yIG1vZHVsZSByZXNldCwgZXhjZXB0Ci0gKiByZWdpc3RlciBtb2R1bGUuICovCi0jZGVmaW5lIFZGRV9SRVNFVF9VUE9OX1NUT1BfQ01EICAweDAwMDAwM2VmCi0KLS8qIHJlc2V0IHRoZSBwaXBlbGluZSB3aGVuIHJlc2V0IGNvbW1hbmQuCi0gKiBiaXQgMjYtMzIgPSAwLCBkb21haW4gcmVzZXQsIGJpdCAwLTkgPSAxIGZvciBtb2R1bGUgcmVzZXQuICovCi0jZGVmaW5lIFZGRV9SRVNFVF9VUE9OX1JFU0VUX0NNRCAgMHgwMDAwMDNmZgotCi0vKiByZXNldCB0aGUgdmZlIG9ubHkgd2hlbiByZXNldCBjb21tYW5kKi8KLSNkZWZpbmUgVkZFX09OTFlfUkVTRVRfQ01EICAweDAwMDAwMDAyCi0KLS8qVmZlIG1vZHVsZSByZXNldCBjb21tYW5kKi8KLSNkZWZpbmUgVkZFX01PRFVMRV9SRVNFVF9DTUQgMHgwN2ZmZmZmZgotCi0vKiBiaXQgNSBpcyBmb3IgYXhpIHN0YXR1cyBpZGxlIG9yIGJ1c3kuCi0gKiAxID0gIGhhbHRlZCwgIDAgPSBidXN5ICovCi0jZGVmaW5lIEFYSV9TVEFUVVNfQlVTWV9NQVNLIDB4MDAwMDAwMjAKLQotLyogYml0IDAgJiBiaXQgMSA9IDEsIGJvdGggeSBhbmQgY2JjciBpcnFzIG5lZWQgdG8gYmUgcHJlc2VudAotICogZm9yIGZyYW1lIGRvbmUgaW50ZXJydXB0ICovCi0jZGVmaW5lIFZGRV9DT01QX0lSUV9CT1RIX1lfQ0JDUiAzCi0KLS8qIGJpdCAxID0gMSwgb25seSBjYmNyIGlycSB0cmlnZ2VycyBmcmFtZSBkb25lIGludGVycnVwdCAqLwotI2RlZmluZSBWRkVfQ09NUF9JUlFfQ0JDUl9PTkxZIDIKLQotLyogYml0IDAgPSAxLCBvbmx5IHkgaXJxIHRyaWdnZXJzIGZyYW1lIGRvbmUgaW50ZXJydXB0ICovCi0jZGVmaW5lIFZGRV9DT01QX0lSUV9ZX09OTFkgMQotCi0vKiBiaXQgMCA9IDEsIFBNIGdvOyAgIGJpdDEgPSAxLCBQTSBzdG9wICovCi0jZGVmaW5lIFZGRV9QRVJGT1JNQU5DRV9NT05JVE9SX0dPICAgMHgwMDAwMDAwMQotI2RlZmluZSBWRkVfUEVSRk9STUFOQ0VfTU9OSVRPUl9TVE9QIDB4MDAwMDAwMDIKLQotLyogYml0IDAgPSAxLCB0ZXN0IGdlbiBnbzsgICBiaXQxID0gMSwgdGVzdCBnZW4gc3RvcCAqLwotI2RlZmluZSBWRkVfVEVTVF9HRU5fR08gICAweDAwMDAwMDAxCi0jZGVmaW5lIFZGRV9URVNUX0dFTl9TVE9QIDB4MDAwMDAwMDIKLQotLyogdGhlIGNocm9tYSBpcyBhc3N1bWVkIHRvIGJlIGludGVycG9sYXRlZCBiZXR3ZWVuCi0gKiB0aGUgbHVtYSBzYW1wbGVzLiAgSlBFRyA0OjI6MiAqLwotI2RlZmluZSBWRkVfQ0hST01BX1VQU0FNUExFX0lOVEVSUE9MQVRFRCAwCi0KLS8qIHdtIGJpdCBvZmZzZXQgZm9yIElSUSBNQVNLIGFuZCBJUlEgU1RBVFVTIHJlZ2lzdGVyICovCi0jZGVmaW5lIFZGRV9XTV9PRkZTRVQgNgotCi0vKiBjb25zdGFudHMgZm9yIGlycSByZWdpc3RlcnMgKi8KLSNkZWZpbmUgVkZFX0RJU0FCTEVfQUxMX0lSUVMgMAotLyogYml0ID0xIGlzIHRvIGNsZWFyIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiBWRkVfSVJRX1NUQVRVUy4gICovCi0jZGVmaW5lIFZGRV9DTEVBUl9BTExfSVJRUyAgIDB4ZmZmZmZmZmYKLQotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfQ0FNSUZfU09GX01BU0sgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9SRUdfVVBEQVRFX01BU0sgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX0lNQUdFX0NPTVBPU0lUX0RPTkUwX01BU0sgMHgwMDIwMDAwMAotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfSU1BR0VfQ09NUE9TSVRfRE9ORTFfTUFTSyAweDAwNDAwMDAwCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9JTUFHRV9DT01QT1NJVF9ET05FMl9NQVNLIDB4MDA4MDAwMDAKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMxX1JFU0VUX0FYSV9IQUxUX0FDS19NQVNLICAgMHgwMDgwMDAwMAotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQ09NUE9TSVRfTUFTSyAgICAgICAweDAxMDAwMDAwCi0KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0FFQ19CRyAgICAweDIwMDAgIC8qIGJpdCAxMyAqLwotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQUZfQkYgICAgIDB4NDAwMCAgLyogYml0IDE0ICovCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19BV0IgICAgICAgMHg4MDAwICAvKiBiaXQgMTUgKi8KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX1JTICAgICAgICAweDEwMDAwICAvKiBiaXQgMTYgKi8KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0NTICAgICAgICAweDIwMDAwICAvKiBiaXQgMTcgKi8KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0lISVNUICAgICAweDQwMDAwICAvKiBiaXQgMTggKi8KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX1NLX0JISVNUICAweDgwMDAwIC8qIGJpdCAxOSAqLwotCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9TWU5DX1RJTUVSMCAgIDB4MjAwMDAwMCAgLyogYml0IDI1ICovCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9TWU5DX1RJTUVSMSAgIDB4NDAwMDAwMCAgLyogYml0IDI2ICovCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9TWU5DX1RJTUVSMiAgIDB4ODAwMDAwMCAgLyogYml0IDI3ICovCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9BU1lOQ19USU1FUjAgIDB4MTAwMDAwMDAgIC8qIGJpdCAyOCAqLwotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfQVNZTkNfVElNRVIxICAweDIwMDAwMDAwICAvKiBiaXQgMjkgKi8KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX0FTWU5DX1RJTUVSMiAgMHg0MDAwMDAwMCAgLyogYml0IDMwICovCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9BU1lOQ19USU1FUjMgIDB4ODAwMDAwMDAgIC8qIGJpdCAzMiAqLwotCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMV9SREkwX1JFR19VUERBVEVfTUFTSyAgMHg0MDAwMDAwIC8qYml0IDI2Ki8KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMxX1JESTFfUkVHX1VQREFURV9NQVNLICAweDgwMDAwMDAgLypiaXQgMjcqLwotCi0vKlRPRE9zIHRoZSBpcnEgc3RhdHVzIHBhc3NlZCBmcm9tIGF4aSB0byB2ZmUgaXJxIGhhbmRsZXIgZG9lcyBub3QgYWNjb3VudAotKiBmb3IgMiBpcnEgc3RhdHVzIHJlZ2lzdGVycy4gU28gYmVsb3cgbWFjcm8gaXMgYWRkZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuCi0qIHNhbWUgYml0IHNldCBvbiBib3RoIGlycSBzdGF0dXMgcmVnaXN0ZXJzLiBUaGlzIHdpbCBiZSBmaXhlZCBsYXRlciBieSBwYXNzaW5nCi0qZW50aXJlIHBheWxvYWQgdG8gdmZlIGlycSBoYW5kbGVyIGFuZCBwYXJzaW5nIHRoZXJlIGluc3RlYWQgb2YgcGFzc2luZyBqdXN0IHRoZQotKnN0YXR1cyBiaXQqLwotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzFfUkRJMF9SRUdfVVBEQVRFICAweDg0MDAwMDAwIC8qYml0IDI2Ki8KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMxX1JESTFfUkVHX1VQREFURSAgMHg4ODAwMDAwMCAvKmJpdCAyNyovCi0KLS8qIGltYXNrIGZvciB3aGlsZSB3YWl0aW5nIGZvciBzdG9wIGFjaywgIGRyaXZlciBoYXMgYWxyZWFkeQotICogcmVxdWVzdGVkIHN0b3AsIHdhaXRpbmcgZm9yIHJlc2V0IGlycSwgYW5kIGFzeW5jIHRpbWVyIGlycS4KLSAqIEZvciBpcnFfc3RhdHVzXzAsIGJpdCAyOC0zMiBhcmUgZm9yIGFzeW5jIHRpbWVyLiBGb3IKLSAqIGlycV9zdGF0dXNfMSwgYml0IDIyIGZvciByZXNldCBpcnEsIGJpdCAyMyBmb3IgYXhpX2hhbHRfYWNrCi0gICBpcnEgKi8KLSNkZWZpbmUgVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HXzAgIDB4RjAwMDAwMDAKLSNkZWZpbmUgVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HXzEgIDB4MDA4MDAwMDAKLQotLyogbm8gZXJyb3IgaXJxIGluIG1hc2sgMCAqLwotI2RlZmluZSBWRkVfSU1BU0tfRVJST1JfT05MWV8wICAweDAKLS8qIHdoZW4gbm9ybWFsIGNhc2UsIGRvbid0IHdhbnQgdG8gYmxvY2sgZXJyb3Igc3RhdHVzLiAqLwotLyogYml0IDAtMjEgYXJlIGVycm9yIGlycSBiaXRzICovCi0jZGVmaW5lIFZGRV9JTUFTS19FUlJPUl9PTkxZXzEgIDB4MDAzZmZmZmYKLQotLyogRm9yIEJQQyBiaXQgMCxiaXQgMTItMTcgYW5kIGJpdCAyNiAtMjAgYXJlIHNldCB0byB6ZXJvIGFuZCBvdGhlcidzIDEgKi8KLSNkZWZpbmUgQlBDX01BU0sgMHhGODBDMEZGRQotCi0vKiBGb3IgQUJGIGJpdCA0IGlzIHNldCB0byB6ZXJvIGFuZCBvdGhlcidzIDEgKi8KLSNkZWZpbmUgQUJGX01BU0sgMHhGRkZGRkZGNwotCi0KLS8qIEZvciBEQlBDIGJpdCAwIGlzIHNldCB0byB6ZXJvIGFuZCBvdGhlcidzIDEgKi8KLSNkZWZpbmUgREJQQ19NQVNLIDB4RkZGRkZGRkUKLQotLyogRm9yIERCUEMgYml0IDEgaXMgc2V0IHRvIHplcm8gYW5kIG90aGVyJ3MgMSAqLwotI2RlZmluZSBEQkNDX01BU0sgMHhGRkZGRkZGRAotCi0vKiBGb3IgREJQQy9BQkYvREJDQy9BQkNDIGJpdHMgYXJlIHNldCB0byAxIGFsbCBvdGhlcnMgMCAqLwotI2RlZmluZSBERU1PU0FJQ19NQVNLIDB4RgotCi0vKiBGb3IgTUNFIGVuYWJsZSBiaXQgMjggc2V0IHRvIHplcm8gYW5kIG90aGVyJ3MgMSAqLwotI2RlZmluZSBNQ0VfRU5fTUFTSyAweEVGRkZGRkZGCi0KLS8qIEZvciBNQ0UgUV9LIGJpdCAyOCB0byAzMiBzZXQgdG8gemVybyBhbmQgb3RoZXIncyAxICovCi0jZGVmaW5lIE1DRV9RX0tfTUFTSyAweDBGRkZGRkZGCi0KLSNkZWZpbmUgQUVfQkdfRU5BQkxFX01BU0sgMHgwMDAwMDAyMCAgICAgIC8qIGJpdCA1ICovCi0jZGVmaW5lIEFGX0JGX0VOQUJMRV9NQVNLIDB4MDAwMDAwNDAgICAgICAvKiBiaXQgNiAqLwotI2RlZmluZSBBV0JfRU5BQkxFX01BU0sgMHgwMDAwMDA4MCAgICAgLyogYml0IDcgKi8KLSNkZWZpbmUgUlNfRU5BQkxFX01BU0sgMHgwMDAwMDEwMCAgICAgIC8qIGJpdCA4ICAqLwotI2RlZmluZSBDU19FTkFCTEVfTUFTSyAweDAwMDAwMjAwICAgICAgLyogYml0IDkgICovCi0jZGVmaW5lIFJTX0NTX0VOQUJMRV9NQVNLIDB4MDAwMDAzMDAgICAvKiBiaXQgOCw5ICAqLwotI2RlZmluZSBDTEZfRU5BQkxFX01BU0sgMHgwMDAwMjAwMCAgICAgLyogYml0IDEzICovCi0jZGVmaW5lIElISVNUX0VOQUJMRV9NQVNLIDB4MDAwMTAwMDAgICAvKiBiaXQgMTYgKi8KLSNkZWZpbmUgU0tJTl9CSElTVF9FTkFCTEVfTUFTSyAweDAwMDgwMDAwIC8qIGJpdCAxOSAqLwotI2RlZmluZSBTVEFUU19FTkFCTEVfTUFTSyAweDAwMDkwM0UwICAgLyogYml0IDE5LDE2LDksOCw3LDYsNSovCi0KLSNkZWZpbmUgU1RBVFNfQkdfRU5BQkxFX01BU0sgICAgIDB4MDAwMDAwMDIgLyogYml0IDEgKi8KLSNkZWZpbmUgU1RBVFNfQkZfRU5BQkxFX01BU0sgICAgIDB4MDAwMDAwMDQgLyogYml0IDIgKi8KLSNkZWZpbmUgU1RBVFNfQkhJU1RfRU5BQkxFX01BU0sgIDB4MDAwMDAwMDggLyogYml0IDMgKi8KLQotI2RlZmluZSBWRkVfUkVHX1VQREFURV9UUklHR0VSICAgICAgICAgICAxCi0jZGVmaW5lIFZGRV9QTV9CVUZfTUFYX0NOVF9NQVNLICAgICAgICAgIDB4RkYKLSNkZWZpbmUgVkZFX0RNSV9DRkdfREVGQVVMVCAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBWRkVfQUVfUElOR1BPTkdfU1RBVFVTX0JJVCAgICAgICAweDgwCi0jZGVmaW5lIFZGRV9BRl9QSU5HUE9OR19TVEFUVVNfQklUICAgICAgIDB4MTAwCi0jZGVmaW5lIFZGRV9BV0JfUElOR1BPTkdfU1RBVFVTX0JJVCAgICAgIDB4MjAwCi0KLSNkZWZpbmUgSEZSX01PREVfT0ZGIDEKLSNkZWZpbmUgVkZFX0ZSQU1FX1NLSVBfUEVSSU9EX01BU0sgMHgwMDAwMDAxRiAvKmJpdHMgMCAtNCovCi0KLWVudW0gVkZFMzJfRE1JX1JBTV9TRUwgewotCU5PX01FTV9TRUxFQ1RFRCAgICAgICAgICA9IDAsCi0JQkxBQ0tfTFVUX1JBTV9CQU5LMCAgICAgID0gMHgxLAotCUJMQUNLX0xVVF9SQU1fQkFOSzEgICAgICA9IDB4MiwKLQlST0xMT0ZGX1JBTTBfQkFOSzAgICAgICAgPSAweDMsCi0JREVNT1NBSUNfTFVUX1JBTV9CQU5LMCAgID0gMHg0LAotCURFTU9TQUlDX0xVVF9SQU1fQkFOSzEgICA9IDB4NSwKLQlTVEFUU19CSElTVF9SQU0wICAgICAgICAgPSAweDYsCi0JU1RBVFNfQkhJU1RfUkFNMSAgICAgICAgID0gMHg3LAotCVJHQkxVVF9SQU1fQ0gwX0JBTkswICAgICA9IDB4OCwKLQlSR0JMVVRfUkFNX0NIMF9CQU5LMSAgICAgPSAweDksCi0JUkdCTFVUX1JBTV9DSDFfQkFOSzAgICAgID0gMHhhLAotCVJHQkxVVF9SQU1fQ0gxX0JBTksxICAgICA9IDB4YiwKLQlSR0JMVVRfUkFNX0NIMl9CQU5LMCAgICAgPSAweGMsCi0JUkdCTFVUX1JBTV9DSDJfQkFOSzEgICAgID0gMHhkLAotCVJHQkxVVF9DSFhfQkFOSzAgICAgICAgICA9IDB4ZSwKLQlSR0JMVVRfQ0hYX0JBTksxICAgICAgICAgPSAweGYsCi0JU1RBVFNfSUhJU1RfUkFNICAgICAgICAgID0gMHgxMCwKLQlMVU1BX0FEQVBUX0xVVF9SQU1fQkFOSzAgPSAweDExLAotCUxVTUFfQURBUFRfTFVUX1JBTV9CQU5LMSA9IDB4MTIsCi0JUk9MTE9GRl9SQU0xX0JBTkswICAgICAgID0gMHgxMywKLQlST0xMT0ZGX1JBTTBfQkFOSzEgICAgICAgPSAweDE0LAotCVJPTExPRkZfUkFNMV9CQU5LMSAgICAgICA9IDB4MTUsCi19OwotCi1lbnVtIHZmZV9vdXRwdXRfc3RhdGUgewotCVZGRV9TVEFURV9JRExFLAotCVZGRV9TVEFURV9TVEFSVF9SRVFVRVNURUQsCi0JVkZFX1NUQVRFX1NUQVJURUQsCi0JVkZFX1NUQVRFX1NUT1BfUkVRVUVTVEVELAotCVZGRV9TVEFURV9TVE9QUEVELAotfTsKLQotI2RlZmluZSBWMzJfQ0FNSUZfT0ZGICAgICAgICAgICAgIDB4MDAwMDAxRTQKLSNkZWZpbmUgVjMyX0NBTUlGX0xFTiAgICAgICAgICAgICAzMgotCi0jZGVmaW5lIFYzMl9ERU1VWF9PRkYgICAgICAgICAgICAgMHgwMDAwMDI4NAotI2RlZmluZSBWMzJfREVNVVhfTEVOICAgICAgICAgICAgIDIwCi0KLSNkZWZpbmUgVjMyX0RFTU9TQUlDVjNfMF9PRkYgICAgICAweDAwMDAwMjk4Ci0jZGVmaW5lIFYzMl9ERU1PU0FJQ1YzXzBfTEVOICAgICAgNAotI2RlZmluZSBWMzJfREVNT1NBSUNWM18xX09GRiAgICAgIDB4MDAwMDA2MUMKLSNkZWZpbmUgVjMyX0RFTU9TQUlDVjNfMV9MRU4gICAgICA4OAotI2RlZmluZSBWMzJfREVNT1NBSUNWM18yX09GRiAgICAgIDB4MDAwMDA2NkMKLSNkZWZpbmUgVjMyX0RFTU9TQUlDVjNfVVBfUkVHX0NOVCA1Ci0vKiBCUEMgICAgICovCi0jZGVmaW5lIFYzMl9ERU1PU0FJQ18yX09GRiAgICAgICAgMHgwMDAwMDI5QwotI2RlZmluZSBWMzJfREVNT1NBSUNfMl9MRU4gICAgICAgIDgKLQotI2RlZmluZSBWMzJfT1VUX0NMQU1QX09GRiAgICAgICAgIDB4MDAwMDA1MjQKLSNkZWZpbmUgVjMyX09VVF9DTEFNUF9MRU4gICAgICAgICA4Ci0KLSNkZWZpbmUgVjMyX09QRVJBVElPTl9DRkdfTEVOICAgICAzMgotCi0jZGVmaW5lIFYzMl9BWElfQlVTX0NNRF9PRkYgICAgICAgMHgwMDAwMDAzOAotI2RlZmluZSBWMzJfQVhJX09VVF9PRkYgICAgICAgICAgIDB4MDAwMDAwM0MKLSNkZWZpbmUgVjMyX0FYSV9PVVRfTEVOICAgICAgICAgICAyNTIKLSNkZWZpbmUgVjMyX0FYSV9DRkdfTEVOICAgICAgICAgICA0NwotI2RlZmluZSBWMzJfQVhJX0JVU19GTVRfT0ZGICAgICAgIDEKLSNkZWZpbmUgVjMyX0FYSV9CVVNfRk1UX0xFTiAgICAgICA0Ci0jZGVmaW5lIFYzMl9BWElfQlVTX0NGR19MRU4gICAgICAgMTYKLQotI2RlZmluZSBWMzJfRlJBTUVfU0tJUF9PRkYgICAgICAgIDB4MDAwMDA1MDQKLSNkZWZpbmUgVjMyX0ZSQU1FX1NLSVBfTEVOICAgICAgICAzMgotCi0jZGVmaW5lIFYzMl9DSFJPTUFfU1VCU19PRkYgICAgICAgMHgwMDAwMDRGOAotI2RlZmluZSBWMzJfQ0hST01BX1NVQlNfTEVOICAgICAgIDEyCi0KLSNkZWZpbmUgVjMyX0ZPVl9PRkYgICAgICAgICAgIDB4MDAwMDAzNjAKLSNkZWZpbmUgVjMyX0ZPVl9MRU4gICAgICAgICAgIDgKLQotI2RlZmluZSBWMzJfTUFJTl9TQ0FMRVJfT0ZGIDB4MDAwMDAzNjgKLSNkZWZpbmUgVjMyX01BSU5fU0NBTEVSX0xFTiAyOAotCi0jZGVmaW5lIFYzMl9TMllfT0ZGIDB4MDAwMDA0RDAKLSNkZWZpbmUgVjMyX1MyWV9MRU4gMjAKLQotI2RlZmluZSBWMzJfUzJDYkNyX09GRiAweDAwMDAwNEU0Ci0jZGVmaW5lIFYzMl9TMkNiQ3JfTEVOIDIwCi0KLSNkZWZpbmUgVjMyX0NIUk9NQV9FTl9PRkYgMHgwMDAwMDNDNAotI2RlZmluZSBWMzJfQ0hST01BX0VOX0xFTiAzNgotCi0jZGVmaW5lIFYzMl9TWU5DX1RJTUVSX09GRiAgICAgIDB4MDAwMDAyMEMKLSNkZWZpbmUgVjMyX1NZTkNfVElNRVJfUE9MQVJJVFlfT0ZGIDB4MDAwMDAyMzQKLSNkZWZpbmUgVjMyX1RJTUVSX1NFTEVDVF9PRkYgICAgICAgIDB4MDAwMDAyNUMKLSNkZWZpbmUgVjMyX1NZTkNfVElNRVJfTEVOIDI4Ci0KLSNkZWZpbmUgVjMyX0FTWU5DX1RJTUVSX09GRiAweDAwMDAwMjM4Ci0jZGVmaW5lIFYzMl9BU1lOQ19USU1FUl9MRU4gMjgKLQotI2RlZmluZSBWMzJfQkxBQ0tfTEVWRUxfT0ZGIDB4MDAwMDAyNjQKLSNkZWZpbmUgVjMyX0JMQUNLX0xFVkVMX0xFTiAxNgotCi0jZGVmaW5lIFYzMl9NRVNIX1JPTExfT0ZGX0NGR19PRkYgICAgICAgICAgICAgMHgwMDAwMDI3NAotI2RlZmluZSBWMzJfTUVTSF9ST0xMX09GRl9DRkdfTEVOICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIFYzMl9NRVNIX1JPTExfT0ZGX0lOSVRfVEFCTEVfU0laRSAgICAgMTMKLSNkZWZpbmUgVjMyX01FU0hfUk9MTF9PRkZfREVMVEFfVEFCTEVfU0laRSAgICAyMDgKLSNkZWZpbmUgVjMyX01FU0hfUk9MTF9PRkZfREVMVEFfVEFCTEVfT0ZGU0VUICAzMgotI2RlZmluZSBWMzJfR0FNTUFfTFVUX0JBTktfU0VMX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDcKLQotI2RlZmluZSBWMzNfUENBX1JPTExfT0ZGX0NGR19MRU4xICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIFYzM19QQ0FfUk9MTF9PRkZfQ0ZHX09GRjEgICAgICAgICAgICAgMHgwMDAwMDI3NAotI2RlZmluZSBWMzNfUENBX1JPTExfT0ZGX0NGR19MRU4yICAgICAgICAgICAgIDEyCi0jZGVmaW5lIFYzM19QQ0FfUk9MTF9PRkZfQ0ZHX09GRjIgICAgICAgICAgICAgMHgwMDAwMDdBOAotI2RlZmluZSBWMzNfUENBX1JPTExfT0ZGX1RBQkxFX1NJWkUgICAgICAgICAgICgxNyArICgxMyo0KSkKLSNkZWZpbmUgVjMzX1BDQV9ST0xMX09GRl9MVVRfQkFOS19TRUxfTUFTSyAgICAweDAwMDEwMDAwCi0KLSNkZWZpbmUgVjMyX0NPTE9SX0NPUl9PRkYgMHgwMDAwMDM4OAotI2RlZmluZSBWMzJfQ09MT1JfQ09SX0xFTiA1MgotCi0jZGVmaW5lIFYzMl9XQl9PRkYgMHgwMDAwMDM4NAotI2RlZmluZSBWMzJfV0JfTEVOIDQKLQotI2RlZmluZSBWMzJfUkdCX0dfT0ZGIDB4MDAwMDAzQkMKLSNkZWZpbmUgVjMyX1JHQl9HX0xFTiA0Ci0KLSNkZWZpbmUgVjMyX0xBX09GRiAweDAwMDAwM0MwCi0jZGVmaW5lIFYzMl9MQV9MRU4gNAotCi0jZGVmaW5lIFYzMl9TQ0VfT0ZGIDB4MDAwMDA0MTgKLSNkZWZpbmUgVjMyX1NDRV9MRU4gMTM2Ci0KLSNkZWZpbmUgVjMyX0NIUk9NQV9TVVBfT0ZGIDB4MDAwMDAzRTgKLSNkZWZpbmUgVjMyX0NIUk9NQV9TVVBfTEVOIDEyCi0KLSNkZWZpbmUgVjMyX01DRV9PRkYgMHgwMDAwMDNGNAotI2RlZmluZSBWMzJfTUNFX0xFTiAzNgotI2RlZmluZSBWMzJfU1RBVFNfQUZfT0ZGIDB4MDAwMDA1M2MKLSNkZWZpbmUgVjMyX1NUQVRTX0FGX0xFTiAxNgotCi0jZGVmaW5lIFYzMl9TVEFUU19BRV9PRkYgMHgwMDAwMDUzNAotI2RlZmluZSBWMzJfU1RBVFNfQUVfTEVOIDgKLQotI2RlZmluZSBWMzJfU1RBVFNfQVdCX09GRiAweDAwMDAwNTRjCi0jZGVmaW5lIFYzMl9TVEFUU19BV0JfTEVOIDMyCi0KLSNkZWZpbmUgVjMyX1NUQVRTX0lISVNUX09GRiAweDAwMDAwNTdjCi0jZGVmaW5lIFYzMl9TVEFUU19JSElTVF9MRU4gOAotCi0jZGVmaW5lIFYzMl9TVEFUU19SU19PRkYgMHgwMDAwMDU2YwotI2RlZmluZSBWMzJfU1RBVFNfUlNfTEVOIDgKLQotI2RlZmluZSBWMzJfU1RBVFNfQ1NfT0ZGIDB4MDAwMDA1NzQKLSNkZWZpbmUgVjMyX1NUQVRTX0NTX0xFTiA4Ci0KLQotI2RlZmluZSBWMzJfQVNGX09GRiAweDAwMDAwNEEwCi0jZGVmaW5lIFYzMl9BU0ZfTEVOIDQ4Ci0jZGVmaW5lIFYzMl9BU0ZfVVBEQVRFX0xFTiAzNgotCi0jZGVmaW5lIFYzMl9DQVBUVVJFX0xFTiA0Ci0KLSNkZWZpbmUgVjMyX0dFVF9IV19WRVJTSU9OX09GRiAwCi0jZGVmaW5lIFYzMl9HRVRfSFdfVkVSU0lPTl9MRU4gNAotCi0jZGVmaW5lIFYzMl9MSU5FQVJJWkFUSU9OX09GRjEgMHgwMDAwMDI2NAotI2RlZmluZSBWMzJfTElORUFSSVpBVElPTl9MRU4xIDE2Ci0KLSNkZWZpbmUgVjMyX0xJTkVBUklaQVRJT05fT0ZGMiAweDAwMDAwNjdDCi0jZGVmaW5lIFYzMl9MSU5FQVJJWkFUSU9OX0xFTjIgNTIKLQotI2RlZmluZSBWMzJfREVNT1NBSUNWM19PRkYgMHgwMDAwMDI5OAotI2RlZmluZSBWMzJfREVNT1NBSUNWM19MRU4gNAotCi0jZGVmaW5lIFYzMl9ERU1PU0FJQ1YzX0RCUENfQ0ZHX09GRiAgMHgwMDAwMDI5QwotI2RlZmluZSBWMzJfREVNT1NBSUNWM19EQlBDX0xFTiA0Ci0KLSNkZWZpbmUgVjMyX0RFTU9TQUlDVjNfREJQQ19DRkdfT0ZGMCAweDAwMDAwMmEwCi0jZGVmaW5lIFYzMl9ERU1PU0FJQ1YzX0RCUENfQ0ZHX09GRjEgMHgwMDAwMDYwNAotI2RlZmluZSBWMzJfREVNT1NBSUNWM19EQlBDX0NGR19PRkYyIDB4MDAwMDA2MDgKLQotI2RlZmluZSBWMzJfREVNT1NBSUNWM19EQkNDX09GRiAweDAwMDAwNjBDCi0jZGVmaW5lIFYzMl9ERU1PU0FJQ1YzX0RCQ0NfTEVOIDE2Ci0KLSNkZWZpbmUgVjMyX0RFTU9TQUlDVjNfQUJGX09GRiAweDAwMDAwMkE0Ci0jZGVmaW5lIFYzMl9ERU1PU0FJQ1YzX0FCRl9MRU4gMTgwCi0KLSNkZWZpbmUgVjMyX01PRFVMRV9DRkdfT0ZGIDB4MDAwMDAwMTAKLSNkZWZpbmUgVjMyX01PRFVMRV9DRkdfTEVOIDQKLQotI2RlZmluZSBWMzJfQVNGX1NQRUNJQUxfRUZYX0NGR19PRkYgMHgwMDAwMDVGQwotI2RlZmluZSBWMzJfQVNGX1NQRUNJQUxfRUZYX0NGR19MRU4gNAotCi0jZGVmaW5lIFYzMl9DTEZfQ0ZHX09GRiAweDAwMDAwNkIwCi0jZGVmaW5lIFYzMl9DTEZfQ0ZHX0xFTiA3MgotCi0jZGVmaW5lIFYzMl9DTEZfTFVNQV9VUERBVEVfT0ZGIDB4MDAwMDA2QjQKLSNkZWZpbmUgVjMyX0NMRl9MVU1BX1VQREFURV9MRU4gNjAKLQotI2RlZmluZSBWMzJfQ0xGX0NIUk9NQV9VUERBVEVfT0ZGIDB4MDAwMDA2RjAKLSNkZWZpbmUgVjMyX0NMRl9DSFJPTUFfVVBEQVRFX0xFTiA4Ci0KLSNkZWZpbmUgVjMyX1NUQVRTX0JHX09GRiAweDAwMDAwNzAwCi0jZGVmaW5lIFYzMl9TVEFUU19CR19MRU4gMTIKLQotI2RlZmluZSBWMzJfU1RBVFNfQkZfT0ZGIDB4MDAwMDA3MGMKLSNkZWZpbmUgVjMyX1NUQVRTX0JGX0xFTiAyNAotCi0jZGVmaW5lIFYzMl9TVEFUU19CSElTVF9PRkYgMHgwMDAwMDcyNAotI2RlZmluZSBWMzJfU1RBVFNfQkhJU1RfTEVOIDgKLQotc3RydWN0IHZmZV9jbWRfaHdfdmVyc2lvbiB7Ci0JdWludDMyX3QgbWlub3JWZXJzaW9uOwotCXVpbnQzMl90IG1ham9yVmVyc2lvbjsKLQl1aW50MzJfdCBjb3JlVmVyc2lvbjsKLX07Ci0KLWVudW0gVkZFX0FYSV9PVVRQVVRfTU9ERSB7Ci0JVkZFX0FYSV9PVVRQVVRfTU9ERV9PdXRwdXQxLAotCVZGRV9BWElfT1VUUFVUX01PREVfT3V0cHV0MiwKLQlWRkVfQVhJX09VVFBVVF9NT0RFX091dHB1dDFBbmRPdXRwdXQyLAotCVZGRV9BWElfT1VUUFVUX01PREVfQ0FNSUZUb0FYSVZpYU91dHB1dDIsCi0JVkZFX0FYSV9PVVRQVVRfTU9ERV9PdXRwdXQyQW5kQ0FNSUZUb0FYSVZpYU91dHB1dDEsCi0JVkZFX0FYSV9PVVRQVVRfTU9ERV9PdXRwdXQxQW5kQ0FNSUZUb0FYSVZpYU91dHB1dDIsCi0JVkZFX0FYSV9MQVNUX09VVFBVVF9NT0RFX0VOVU0KLX07Ci0KLWVudW0gVkZFX1JBV19XUl9QQVRIX1NFTCB7Ci0JVkZFX1JBV19PVVRQVVRfRElTQUJMRUQsCi0JVkZFX1JBV19PVVRQVVRfRU5DX0NCQ1JfUEFUSCwKLQlWRkVfUkFXX09VVFBVVF9WSUVXX0NCQ1JfUEFUSCwKLQlWRkVfUkFXX09VVFBVVF9QQVRIX0lOVkFMSUQKLX07Ci0KLQotI2RlZmluZSBWRkVfQVhJX09VVFBVVF9CVVJTVF9MRU5HVEggICAgIDQKLSNkZWZpbmUgVkZFX01BWF9OVU1fRlJBR01FTlRTX1BFUl9GUkFNRSA0Ci0jZGVmaW5lIFZGRV9BWElfT1VUUFVUX0NGR19GUkFNRV9DT1VOVCAgMwotCi1zdHJ1Y3QgdmZlX2NtZHNfcGVyX3dyaXRlX21hc3RlciB7Ci0JdWludDE2X3QgaW1hZ2VXaWR0aDsKLQl1aW50MTZfdCBpbWFnZUhlaWdodDsKLQl1aW50MTZfdCBvdXRSb3dDb3VudDsKLQl1aW50MTZfdCBvdXRSb3dJbmNyZW1lbnQ7Ci0JdWludDMyX3Qgb3V0RnJhZ21lbnRzW1ZGRV9BWElfT1VUUFVUX0NGR19GUkFNRV9DT1VOVF0KLQkJW1ZGRV9NQVhfTlVNX0ZSQUdNRU5UU19QRVJfRlJBTUVdOwotfTsKLQotc3RydWN0IHZmZV9jbWRzX2F4aV9wZXJfb3V0cHV0X3BhdGggewotCXVpbnQ4X3QgZnJhZ21lbnRDb3VudDsKLQlzdHJ1Y3QgdmZlX2NtZHNfcGVyX3dyaXRlX21hc3RlciBmaXJzdFdNOwotCXN0cnVjdCB2ZmVfY21kc19wZXJfd3JpdGVfbWFzdGVyIHNlY29uZFdNOwotfTsKLQotZW51bSBWRkVfQVhJX0JVUlNUX0xFTkdUSCB7Ci0JVkZFX0FYSV9CVVJTVF9MRU5HVEhfSVNfMiAgPSAyLAotCVZGRV9BWElfQlVSU1RfTEVOR1RIX0lTXzQgID0gNCwKLQlWRkVfQVhJX0JVUlNUX0xFTkdUSF9JU184ICA9IDgsCi0JVkZFX0FYSV9CVVJTVF9MRU5HVEhfSVNfMTYgPSAxNgotfTsKLQotCi1zdHJ1Y3QgdmZlX2NtZF9mb3ZfY3JvcF9jb25maWcgewotCXVpbnQ4X3QgZW5hYmxlOwotCXVpbnQxNl90IGZpcnN0UGl4ZWw7Ci0JdWludDE2X3QgbGFzdFBpeGVsOwotCXVpbnQxNl90IGZpcnN0TGluZTsKLQl1aW50MTZfdCBsYXN0TGluZTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kc19tYWluX3NjYWxlcl9zdHJpcGVfaW5pdCB7Ci0JdWludDE2X3QgTU5Db3VudGVySW5pdDsKLQl1aW50MTZfdCBwaGFzZUluaXQ7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZHNfc2NhbGVyX29uZV9kaW1lbnNpb24gewotCXVpbnQ4X3QgIGVuYWJsZTsKLQl1aW50MTZfdCBpbnB1dFNpemU7Ci0JdWludDE2X3Qgb3V0cHV0U2l6ZTsKLQl1aW50MzJfdCBwaGFzZU11bHRpcGxpY2F0aW9uRmFjdG9yOwotCXVpbnQ4X3QgIGludGVycG9sYXRpb25SZXNvbHV0aW9uOwotfTsKLQotc3RydWN0IHZmZV9jbWRfbWFpbl9zY2FsZXJfY29uZmlnIHsKLQl1aW50OF90IGVuYWJsZTsKLQlzdHJ1Y3QgdmZlX2NtZHNfc2NhbGVyX29uZV9kaW1lbnNpb24gICAgaGNvbmZpZzsKLQlzdHJ1Y3QgdmZlX2NtZHNfc2NhbGVyX29uZV9kaW1lbnNpb24gICAgdmNvbmZpZzsKLQlzdHJ1Y3QgdmZlX2NtZHNfbWFpbl9zY2FsZXJfc3RyaXBlX2luaXQgTU5Jbml0SDsKLQlzdHJ1Y3QgdmZlX2NtZHNfbWFpbl9zY2FsZXJfc3RyaXBlX2luaXQgTU5Jbml0VjsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX3NjYWxlcjJfY29uZmlnIHsKLQl1aW50OF90IGVuYWJsZTsKLQlzdHJ1Y3QgdmZlX2NtZHNfc2NhbGVyX29uZV9kaW1lbnNpb24gaGNvbmZpZzsKLQlzdHJ1Y3QgdmZlX2NtZHNfc2NhbGVyX29uZV9kaW1lbnNpb24gdmNvbmZpZzsKLX07Ci0KLQotc3RydWN0IHZmZV9jbWRfZnJhbWVfc2tpcF91cGRhdGUgewotCXVpbnQzMl90IG91dHB1dDFQYXR0ZXJuOwotCXVpbnQzMl90IG91dHB1dDJQYXR0ZXJuOwotfTsKLQotc3RydWN0IHZmZV9jbWRfb3V0cHV0X2NsYW1wX2NvbmZpZyB7Ci0JdWludDhfdCBtaW5DaDA7Ci0JdWludDhfdCBtaW5DaDE7Ci0JdWludDhfdCBtaW5DaDI7Ci0JdWludDhfdCBtYXhDaDA7Ci0JdWludDhfdCBtYXhDaDE7Ci0JdWludDhfdCBtYXhDaDI7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9jaHJvbWFfc3Vic2FtcGxlX2NvbmZpZyB7Ci0JdWludDhfdCBlbmFibGU7Ci0JdWludDhfdCBjcm9wRW5hYmxlOwotCXVpbnQ4X3QgdnN1YlNhbXBsZUVuYWJsZTsKLQl1aW50OF90IGhzdWJTYW1wbGVFbmFibGU7Ci0JdWludDhfdCB2Q29zaXRlZDsKLQl1aW50OF90IGhDb3NpdGVkOwotCXVpbnQ4X3QgdkNvc2l0ZWRQaGFzZTsKLQl1aW50OF90IGhDb3NpdGVkUGhhc2U7Ci0JdWludDE2X3QgY3JvcFdpZHRoRmlyc3RQaXhlbDsKLQl1aW50MTZfdCBjcm9wV2lkdGhMYXN0UGl4ZWw7Ci0JdWludDE2X3QgY3JvcEhlaWdodEZpcnN0TGluZTsKLQl1aW50MTZfdCBjcm9wSGVpZ2h0TGFzdExpbmU7Ci19OwotCi1lbnVtIFZGRV9TVEFSVF9QSVhFTF9QQVRURVJOIHsKLQlWRkVfQkFZRVJfUkdSR1JHLAotCVZGRV9CQVlFUl9HUkdSR1IsCi0JVkZFX0JBWUVSX0JHQkdCRywKLQlWRkVfQkFZRVJfR0JHQkdCLAotCVZGRV9ZVVZfWUNiWUNyLAotCVZGRV9ZVVZfWUNyWUNiLAotCVZGRV9ZVVZfQ2JZQ3JZLAotCVZGRV9ZVVZfQ3JZQ2JZCi19OwotCi1lbnVtIFZGRV9CVVNfUkRfSU5QVVRfUElYRUxfUEFUVEVSTiB7Ci0JVkZFX0JBWUVSX1JBVywKLQlWRkVfWVVWX0lOVEVSTEVBVkVELAotCVZGRV9ZVVZfUFNFVURPX1BMQU5BUl9ZLAotCVZGRV9ZVVZfUFNFVURPX1BMQU5BUl9DQkNSCi19OwotCi1lbnVtIFZGRV9ZVVZfSU5QVVRfQ09TSVRJTkdfTU9ERSB7Ci0JVkZFX1lVVl9DT1NJVEVELAotCVZGRV9ZVVZfSU5URVJQT0xBVEVECi19OwotCi0jZGVmaW5lIFZGRTMyX0dBTU1BX05VTV9FTlRSSUVTICA2NAotCi0jZGVmaW5lIFZGRTMyX0xBX1RBQkxFX0xFTkdUSCAgICA2NAotCi0jZGVmaW5lIFZGRTMyX0xJTkVBUklaQVRPTl9UQUJMRV9MRU5HVEggICAgMzYKLQotc3RydWN0IHZmZV9jbWRzX2RlbW9zYWljX2FiZiB7Ci0JdWludDhfdCAgIGVuYWJsZTsKLQl1aW50OF90ICAgZm9yY2VPbjsKLQl1aW50OF90ICAgc2hpZnQ7Ci0JdWludDE2X3QgIGxwVGhyZXNob2xkOwotCXVpbnQxNl90ICBtYXg7Ci0JdWludDE2X3QgIG1pbjsKLQl1aW50OF90ICAgcmF0aW87Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZHNfZGVtb3NhaWNfYnBjIHsKLQl1aW50OF90ICAgZW5hYmxlOwotCXVpbnQxNl90ICBmbWF4VGhyZXNob2xkOwotCXVpbnQxNl90ICBmbWluVGhyZXNob2xkOwotCXVpbnQxNl90ICByZWREaWZmVGhyZXNob2xkOwotCXVpbnQxNl90ICBibHVlRGlmZlRocmVzaG9sZDsKLQl1aW50MTZfdCAgZ3JlZW5EaWZmVGhyZXNob2xkOwotfTsKLQotc3RydWN0IHZmZV9jbWRfZGVtb3NhaWNfY29uZmlnIHsKLQl1aW50OF90ICAgZW5hYmxlOwotCXVpbnQ4X3QgICBzbG9wZVNoaWZ0OwotCXN0cnVjdCB2ZmVfY21kc19kZW1vc2FpY19hYmYgYWJmQ29uZmlnOwotCXN0cnVjdCB2ZmVfY21kc19kZW1vc2FpY19icGMgYnBjQ29uZmlnOwotfTsKLQotc3RydWN0IHZmZV9jbWRfZGVtb3NhaWNfYnBjX3VwZGF0ZSB7Ci0Jc3RydWN0IHZmZV9jbWRzX2RlbW9zYWljX2JwYyBicGNVcGRhdGU7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9kZW1vc2FpY19hYmZfdXBkYXRlIHsKLQlzdHJ1Y3QgdmZlX2NtZHNfZGVtb3NhaWNfYWJmIGFiZlVwZGF0ZTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX3doaXRlX2JhbGFuY2VfY29uZmlnIHsKLQl1aW50OF90ICBlbmFibGU7Ci0JdWludDE2X3QgY2gyR2FpbjsKLQl1aW50MTZfdCBjaDFHYWluOwotCXVpbnQxNl90IGNoMEdhaW47Ci19OwotCi1lbnVtIFZGRV9DT0xPUl9DT1JSRUNUSU9OX0NPRUZfUUZBQ1RPUiB7Ci0JQ09FRl9JU19RN19TSUdORUQsCi0JQ09FRl9JU19ROF9TSUdORUQsCi0JQ09FRl9JU19ROV9TSUdORUQsCi0JQ09FRl9JU19RMTBfU0lHTkVECi19OwotCi1zdHJ1Y3QgdmZlX2NtZF9jb2xvcl9jb3JyZWN0aW9uX2NvbmZpZyB7Ci0JdWludDhfdCAgICAgZW5hYmxlOwotCWVudW0gVkZFX0NPTE9SX0NPUlJFQ1RJT05fQ09FRl9RRkFDVE9SIGNvZWZRRmFjdG9yOwotCWludDE2X3QgIEMwOwotCWludDE2X3QgIEMxOwotCWludDE2X3QgIEMyOwotCWludDE2X3QgIEMzOwotCWludDE2X3QgIEM0OwotCWludDE2X3QgIEM1OwotCWludDE2X3QgIEM2OwotCWludDE2X3QgIEM3OwotCWludDE2X3QgIEM4OwotCWludDE2X3QgIEswOwotCWludDE2X3QgIEsxOwotCWludDE2X3QgIEsyOwotfTsKLQotI2RlZmluZSBWRkVfTEFfVEFCTEVfTEVOR1RIIDY0Ci0KLXN0cnVjdCB2ZmVfY21kX2xhX2NvbmZpZyB7Ci0JdWludDhfdCBlbmFibGU7Ci0JaW50MTZfdCB0YWJsZVtWRkVfTEFfVEFCTEVfTEVOR1RIXTsKLX07Ci0KLSNkZWZpbmUgVkZFX0dBTU1BX1RBQkxFX0xFTkdUSCAyNTYKLWVudW0gVkZFX1JHQl9HQU1NQV9UQUJMRV9TRUxFQ1QgewotCVJHQl9HQU1NQV9DSDBfU0VMRUNURUQsCi0JUkdCX0dBTU1BX0NIMV9TRUxFQ1RFRCwKLQlSR0JfR0FNTUFfQ0gyX1NFTEVDVEVELAotCVJHQl9HQU1NQV9DSDBfQ0gxX1NFTEVDVEVELAotCVJHQl9HQU1NQV9DSDBfQ0gyX1NFTEVDVEVELAotCVJHQl9HQU1NQV9DSDFfQ0gyX1NFTEVDVEVELAotCVJHQl9HQU1NQV9DSDBfQ0gxX0NIMl9TRUxFQ1RFRAotfTsKLQotc3RydWN0IHZmZV9jbWRfcmdiX2dhbW1hX2NvbmZpZyB7Ci0JdWludDhfdCBlbmFibGU7Ci0JZW51bSBWRkVfUkdCX0dBTU1BX1RBQkxFX1NFTEVDVCBjaGFubmVsU2VsZWN0OwotCWludDE2X3QgdGFibGVbVkZFX0dBTU1BX1RBQkxFX0xFTkdUSF07Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9jaHJvbWFfZW5oYW5fY29uZmlnIHsKLQl1aW50OF90ICBlbmFibGU7Ci0JaW50MTZfdCBhbTsKLQlpbnQxNl90IGFwOwotCWludDE2X3QgYm07Ci0JaW50MTZfdCBicDsKLQlpbnQxNl90IGNtOwotCWludDE2X3QgY3A7Ci0JaW50MTZfdCBkbTsKLQlpbnQxNl90IGRwOwotCWludDE2X3Qga2NyOwotCWludDE2X3Qga2NiOwotCWludDE2X3QgUkdCdG9ZQ29udmVyc2lvblYwOwotCWludDE2X3QgUkdCdG9ZQ29udmVyc2lvblYxOwotCWludDE2X3QgUkdCdG9ZQ29udmVyc2lvblYyOwotCXVpbnQ4X3QgUkdCdG9ZQ29udmVyc2lvbk9mZnNldDsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX2Nocm9tYV9zdXBwcmVzc2lvbl9jb25maWcgewotCXVpbnQ4X3QgZW5hYmxlOwotCXVpbnQ4X3QgbTE7Ci0JdWludDhfdCBtMzsKLQl1aW50OF90IG4xOwotCXVpbnQ4X3QgbjM7Ci0JdWludDhfdCBubjE7Ci0JdWludDhfdCBtbTE7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9hc2ZfY29uZmlnIHsKLQl1aW50OF90IGVuYWJsZTsKLQl1aW50OF90IHNtb290aEZpbHRlckVuYWJsZWQ7Ci0JdWludDhfdCBzaGFycE1vZGU7Ci0JdWludDhfdCBzbW9vdGhDb2VmQ2VudGVyOwotCXVpbnQ4X3Qgc21vb3RoQ29lZlN1cnI7Ci0JdWludDhfdCBub3JtYWxpemVGYWN0b3I7Ci0JdWludDhfdCBzaGFycEsxOwotCXVpbnQ4X3Qgc2hhcnBLMjsKLQl1aW50OF90IHNoYXJwVGhyZXNoRTE7Ci0JaW50OF90IHNoYXJwVGhyZXNoRTI7Ci0JaW50OF90IHNoYXJwVGhyZXNoRTM7Ci0JaW50OF90IHNoYXJwVGhyZXNoRTQ7Ci0JaW50OF90IHNoYXJwVGhyZXNoRTU7Ci0JaW50OF90IGZpbHRlcjFDb2VmZmljaWVudHNbOV07Ci0JaW50OF90IGZpbHRlcjJDb2VmZmljaWVudHNbOV07Ci0JdWludDhfdCAgY3JvcEVuYWJsZTsKLQl1aW50MTZfdCBjcm9wRmlyc3RQaXhlbDsKLQl1aW50MTZfdCBjcm9wTGFzdFBpeGVsOwotCXVpbnQxNl90IGNyb3BGaXJzdExpbmU7Ci0JdWludDE2X3QgY3JvcExhc3RMaW5lOwotfTsKLQotc3RydWN0IHZmZV9jbWRfYXNmX3VwZGF0ZSB7Ci0JdWludDhfdCBlbmFibGU7Ci0JdWludDhfdCBzbW9vdGhGaWx0ZXJFbmFibGVkOwotCXVpbnQ4X3Qgc2hhcnBNb2RlOwotCXVpbnQ4X3Qgc21vb3RoQ29lZkNlbnRlcjsKLQl1aW50OF90IHNtb290aENvZWZTdXJyOwotCXVpbnQ4X3Qgbm9ybWFsaXplRmFjdG9yOwotCXVpbnQ4X3Qgc2hhcnBLMTsKLQl1aW50OF90IHNoYXJwSzI7Ci0JdWludDhfdCBzaGFycFRocmVzaEUxOwotCWludDhfdCAgc2hhcnBUaHJlc2hFMjsKLQlpbnQ4X3QgIHNoYXJwVGhyZXNoRTM7Ci0JaW50OF90ICBzaGFycFRocmVzaEU0OwotCWludDhfdCAgc2hhcnBUaHJlc2hFNTsKLQlpbnQ4X3QgIGZpbHRlcjFDb2VmZmljaWVudHNbOV07Ci0JaW50OF90ICBmaWx0ZXIyQ29lZmZpY2llbnRzWzldOwotCXVpbnQ4X3QgY3JvcEVuYWJsZTsKLX07Ci0KLWVudW0gVkZFX1RFU1RfR0VOX1NZTkNfRURHRSB7Ci0JVkZFX1RFU1RfR0VOX1NZTkNfRURHRV9BY3RpdmVIaWdoLAotCVZGRV9URVNUX0dFTl9TWU5DX0VER0VfQWN0aXZlTG93Ci19OwotCi0KLXN0cnVjdCB2ZmVfY21kX2J1c19wbV9zdGFydCB7Ci0JdWludDhfdCBvdXRwdXQyWVdyUG1FbmFibGU7Ci0JdWludDhfdCBvdXRwdXQyQ2JjcldyUG1FbmFibGU7Ci0JdWludDhfdCBvdXRwdXQxWVdyUG1FbmFibGU7Ci0JdWludDhfdCBvdXRwdXQxQ2JjcldyUG1FbmFibGU7Ci19OwotCi1zdHJ1Y3QgIHZmZV9mcmFtZV9za2lwX2NvdW50cyB7Ci0JdWludDMyX3QgIHRvdGFsRnJhbWVDb3VudDsKLQl1aW50MzJfdCAgb3V0cHV0MUNvdW50OwotCXVpbnQzMl90ICBvdXRwdXQyQ291bnQ7Ci19OwotCi1lbnVtIFZGRV9BWElfUkRfVU5QQUNLX0hCSV9TRUwgewotCVZGRV9BWElfUkRfSEJJXzMyX0NMT0NLX0NZQ0xFUywKLQlWRkVfQVhJX1JEX0hCSV82NF9DTE9DS19DWUNMRVMsCi0JVkZFX0FYSV9SRF9IQklfMTI4X0NMT0NLX0NZQ0xFUywKLQlWRkVfQVhJX1JEX0hCSV8yNTZfQ0xPQ0tfQ1lDTEVTLAotCVZGRV9BWElfUkRfSEJJXzUxMl9DTE9DS19DWUNMRVMsCi0JVkZFX0FYSV9SRF9IQklfMTAyNF9DTE9DS19DWUNMRVMsCi0JVkZFX0FYSV9SRF9IQklfMjA0OF9DTE9DS19DWUNMRVMsCi0JVkZFX0FYSV9SRF9IQklfNDA5Nl9DTE9DS19DWUNMRVMKLX07Ci0KLXN0cnVjdCB2ZmVfZnJhbWVfYnBjX2luZm8gewotCXVpbnQzMl90IGdyZWVuRGVmZWN0UGl4ZWxDb3VudDsKLQl1aW50MzJfdCByZWRCbHVlRGVmZWN0UGl4ZWxDb3VudDsKLX07Ci0KLXN0cnVjdCB2ZmVfZnJhbWVfYXNmX2luZm8gewotCXVpbnQzMl90ICBhc2ZNYXhFZGdlOwotCXVpbnQzMl90ICBhc2ZIYmlDb3VudDsKLX07Ci0KLXN0cnVjdCB2ZmVfbXNnX2NhbWlmX3N0YXR1cyB7Ci0JdWludDhfdCAgY2FtaWZTdGF0ZTsKLQl1aW50MzJfdCBwaXhlbENvdW50OwotCXVpbnQzMl90IGxpbmVDb3VudDsKLX07Ci0KLXN0cnVjdCB2ZmUzMl9pcnFfc3RhdHVzIHsKLQl1aW50MzJfdCB2ZmVJcnFTdGF0dXMwOwotCXVpbnQzMl90IHZmZUlycVN0YXR1czE7Ci0JdWludDMyX3QgY2FtaWZTdGF0dXM7Ci0JdWludDMyX3QgZGVtb3NhaWNTdGF0dXM7Ci0JdWludDMyX3QgYXNmTWF4RWRnZTsKLX07Ci0KLSNkZWZpbmUgVjMyX1BSRVZJRVdfQVhJX0ZMQUcgIDB4MDAwMDAwMDEKLSNkZWZpbmUgVjMyX1NOQVBTSE9UX0FYSV9GTEFHICgweDAwMDAwMDAxPDwxKQotCi1zdHJ1Y3QgdmZlMzJfY21kX3R5cGUgewotCXVpbnQxNl90IGlkOwotCXVpbnQzMl90IGxlbmd0aDsKLQl1aW50MzJfdCBvZmZzZXQ7Ci0JdWludDMyX3QgZmxhZzsKLX07Ci0KLXN0cnVjdCB2ZmUzMl9mcmVlX2J1ZiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBub2RlOwotCXVpbnQzMl90IHBhZGRyOwotCXVpbnQzMl90IHlfb2ZmOwotCXVpbnQzMl90IGNiY3Jfb2ZmOwotfTsKLQotc3RydWN0IHZmZTMyX291dHB1dF9jaCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmcmVlX2J1Zl9xdWV1ZTsKLQlzcGlubG9ja190IGZyZWVfYnVmX2xvY2s7Ci0JdWludDMyX3QgaW5zdF9oYW5kbGU7Ci0JaW50OF90IGNoMDsKLQlpbnQ4X3QgY2gxOwotCWludDhfdCBjaDI7Ci0JaW50MzJfdCAgY2FwdHVyZV9jbnQ7Ci0JdWludDMyX3QgIGZyYW1lX2Ryb3BfY250OwotCXN0cnVjdCBtc21fZnJlZV9idWYgcGluZzsKLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmIHBvbmc7Ci0Jc3RydWN0IG1zbV9mcmVlX2J1ZiBmcmVlX2J1ZjsKLX07Ci0KLS8qIG5vIGVycm9yIGlycSBpbiBtYXNrIDAgKi8KLSNkZWZpbmUgVkZFMzJfSU1BU0tfRVJST1JfT05MWV8wICAweDAKLS8qIHdoZW4gbm9ybWFsIGNhc2UsIGRvbid0IHdhbnQgdG8gYmxvY2sgZXJyb3Igc3RhdHVzLiAqLwotLyogYml0IDAtMjEgYXJlIGVycm9yIGlycSBiaXRzICovCi0jZGVmaW5lIFZGRTMyX0lNQVNLX0NPTU1PTl9FUlJPUl9PTkxZXzEgICAgICAgMHgwMDQwN0YwMAotI2RlZmluZSBWRkUzMl9JTUFTS19WRkVfRVJST1JfT05MWV8xICAgICAgICAgIDB4MDAxRjgwRkYKLSNkZWZpbmUgVkZFMzJfSU1BU0tfQ0FNSUZfRVJST1IgICAgICAgICAgICAgICAoMHgwMDAwMDAwMTw8MCkKLSNkZWZpbmUgVkZFMzJfSU1BU0tfQkhJU1RfT1ZXUiAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMTw8MSkKLSNkZWZpbmUgVkZFMzJfSU1BU0tfU1RBVFNfQ1NfT1ZXUiAgICAgICAgICAgICAoMHgwMDAwMDAwMTw8MikKLSNkZWZpbmUgVkZFMzJfSU1BU0tfU1RBVFNfSUhJU1RfT1ZXUiAgICAgICAgICAoMHgwMDAwMDAwMTw8MykKLSNkZWZpbmUgVkZFMzJfSU1BU0tfUkVBTElHTl9CVUZfWV9PVkZMICAgICAgICAoMHgwMDAwMDAwMTw8NCkKLSNkZWZpbmUgVkZFMzJfSU1BU0tfUkVBTElHTl9CVUZfQ0JfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8NSkKLSNkZWZpbmUgVkZFMzJfSU1BU0tfUkVBTElHTl9CVUZfQ1JfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8NikKLSNkZWZpbmUgVkZFMzJfSU1BU0tfVklPTEFUSU9OICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMTw8NykKLSNkZWZpbmUgVkZFMzJfSU1BU0tfSU1HX01BU1RfMF9CVVNfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8OCkKLSNkZWZpbmUgVkZFMzJfSU1BU0tfSU1HX01BU1RfMV9CVVNfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8OSkKLSNkZWZpbmUgVkZFMzJfSU1BU0tfSU1HX01BU1RfMl9CVVNfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8MTApCi0jZGVmaW5lIFZGRTMyX0lNQVNLX0lNR19NQVNUXzNfQlVTX09WRkwgICAgICAgKDB4MDAwMDAwMDE8PDExKQotI2RlZmluZSBWRkUzMl9JTUFTS19JTUdfTUFTVF80X0JVU19PVkZMICAgICAgICgweDAwMDAwMDAxPDwxMikKLSNkZWZpbmUgVkZFMzJfSU1BU0tfSU1HX01BU1RfNV9CVVNfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8MTMpCi0jZGVmaW5lIFZGRTMyX0lNQVNLX0lNR19NQVNUXzZfQlVTX09WRkwgICAgICAgKDB4MDAwMDAwMDE8PDE0KQotI2RlZmluZSBWRkUzMl9JTUFTS19TVEFUU19BRV9CR19CVVNfT1ZGTCAgICAgICgweDAwMDAwMDAxPDwxNSkKLSNkZWZpbmUgVkZFMzJfSU1BU0tfU1RBVFNfQUZfQkZfQlVTX09WRkwgICAgICAoMHgwMDAwMDAwMTw8MTYpCi0jZGVmaW5lIFZGRTMyX0lNQVNLX1NUQVRTX0FXQl9CVVNfT1ZGTCAgICAgICAgKDB4MDAwMDAwMDE8PDE3KQotI2RlZmluZSBWRkUzMl9JTUFTS19TVEFUU19SU19CVVNfT1ZGTCAgICAgICAgICgweDAwMDAwMDAxPDwxOCkKLSNkZWZpbmUgVkZFMzJfSU1BU0tfU1RBVFNfQ1NfQlVTX09WRkwgICAgICAgICAoMHgwMDAwMDAwMTw8MTkpCi0jZGVmaW5lIFZGRTMyX0lNQVNLX1NUQVRTX0lISVNUX0JVU19PVkZMICAgICAgKDB4MDAwMDAwMDE8PDIwKQotI2RlZmluZSBWRkUzMl9JTUFTS19TVEFUU19TS0lOX0JISVNUX0JVU19PVkZMICgweDAwMDAwMDAxPDwyMSkKLSNkZWZpbmUgVkZFMzJfSU1BU0tfQVhJX0VSUk9SICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMTw8MjIpCi0KLSNkZWZpbmUgVkZFX0NPTV9TVEFUVVMgMHgwMDBGRTAwMAotCi1zdHJ1Y3QgdmZlMzJfb3V0cHV0X3BhdGggewotCXVpbnQxNl90IG91dHB1dF9tb2RlOyAgICAgLyogYml0bWFzayAgKi8KLQotCXN0cnVjdCB2ZmUzMl9vdXRwdXRfY2ggb3V0MDsgLyogcHJldmlldyBhbmQgdGh1bWJuYWlsICovCi0Jc3RydWN0IHZmZTMyX291dHB1dF9jaCBvdXQxOyAvKiBzbmFwc2hvdCAqLwotCXN0cnVjdCB2ZmUzMl9vdXRwdXRfY2ggb3V0MjsgLyogcmRpMCAgICAqLwotCXN0cnVjdCB2ZmUzMl9vdXRwdXRfY2ggb3V0MzsgLyogcmRpMDEgICAqLwotfTsKLQotc3RydWN0IHZmZTMyX2ZyYW1lX2V4dHJhIHsKLQl1aW50MzJfdCBncmVlbkRlZmVjdFBpeGVsQ291bnQ7Ci0JdWludDMyX3QgcmVkQmx1ZURlZmVjdFBpeGVsQ291bnQ7Ci0KLQl1aW50MzJfdCAgYXNmTWF4RWRnZTsKLQl1aW50MzJfdCAgYXNmSGJpQ291bnQ7Ci0KLQl1aW50MzJfdCB5V3JQbVN0YXRzMDsKLQl1aW50MzJfdCB5V3JQbVN0YXRzMTsKLQl1aW50MzJfdCBjYmNyV3JQbVN0YXRzMDsKLQl1aW50MzJfdCBjYmNyV3JQbVN0YXRzMTsKLQotCXVpbnQzMl90ICBmcmFtZUNvdW50ZXI7Ci19OwotCi0jZGVmaW5lIFZGRV9ESVNBQkxFX0FMTF9JUlFTICAgICAgICAgICAgMAotI2RlZmluZSBWRkVfQ0xFQVJfQUxMX0lSUVMgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKLQotI2RlZmluZSBWRkVfSFdfVkVSU0lPTgkJCTB4MDAwMDAwMDAKLSNkZWZpbmUgVkZFX0dMT0JBTF9SRVNFVCAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFZGRV9NT0RVTEVfUkVTRVQJCTB4MDAwMDAwMDgKLSNkZWZpbmUgVkZFX0NHQ19PVkVSUklERSAgICAgICAgICAgICAgICAweDAwMDAwMDBDCi0jZGVmaW5lIFZGRV9NT0RVTEVfQ0ZHICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBWRkVfQ0ZHCQkJCTB4MDAwMDAwMTQKLSNkZWZpbmUgVkZFX0lSUV9DTUQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE4Ci0jZGVmaW5lIFZGRV9JUlFfTUFTS18wICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxQwotI2RlZmluZSBWRkVfSVJRX01BU0tfMSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgVkZFX0lSUV9DTEVBUl8wICAgICAgICAgICAgICAgICAweDAwMDAwMDI0Ci0jZGVmaW5lIFZGRV9JUlFfQ0xFQVJfMSAgICAgICAgICAgICAgICAgMHgwMDAwMDAyOAotI2RlZmluZSBWRkVfSVJRX1NUQVRVU18wICAgICAgICAgICAgICAgIDB4MDAwMDAwMkMKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVNfMSAgICAgICAgICAgICAgICAweDAwMDAwMDMwCi0jZGVmaW5lIFZGRV9JUlFfQ09NUF9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDAzNAotI2RlZmluZSBWRkVfQlVTX0NNRCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzgKLSNkZWZpbmUgVkZFX0JVU19QSU5HX1BPTkdfU1RBVFVTICAgICAgICAweDAwMDAwMTgwCi0jZGVmaW5lIFZGRV9BWElfQ01EICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDFEOAotI2RlZmluZSBWRkVfQVhJX1NUQVRVUyAgICAgICAgMHgwMDAwMDFEQwotI2RlZmluZSBWRkVfQlVTX1NUQVRTX1BJTkdfUE9OR19CQVNFICAgIDB4MDAwMDAwRjQKLQotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0FFQ19CR19XUl9QSU5HX0FERFIgICAgMHgwMDAwMDBGNAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0FFQ19CR19XUl9QT05HX0FERFIgICAgMHgwMDAwMDBGOAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0FFQ19CR19VQl9DRkcgICAgICAgICAgMHgwMDAwMDBGQwotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0FGX0JGX1dSX1BJTkdfQUREUiAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0FGX0JGX1dSX1BPTkdfQUREUiAgICAgMHgwMDAwMDEwNAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0FGX0JGX1VCX0NGRyAgICAgICAgICAgMHgwMDAwMDEwOAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0FXQl9XUl9QSU5HX0FERFIgICAgMHgwMDAwMDEwQwotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0FXQl9XUl9QT05HX0FERFIgICAgMHgwMDAwMDExMAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0FXQl9VQl9DRkcgICAgICAgICAgMHgwMDAwMDExNAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX1JTX1dSX1BJTkdfQUREUiAgICAweDAwMDAwMTE4Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfUlNfV1JfUE9OR19BRERSICAgIDB4MDAwMDAxMUMKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19SU19VQl9DRkcgICAgICAgICAgMHgwMDAwMDEyMAotCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQ1NfV1JfUElOR19BRERSICAgIDB4MDAwMDAxMjQKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19DU19XUl9QT05HX0FERFIgICAgMHgwMDAwMDEyOAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0NTX1VCX0NGRyAgICAgICAgICAweDAwMDAwMTJDCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfSElTVF9XUl9QSU5HX0FERFIgICAweDAwMDAwMTMwCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfSElTVF9XUl9QT05HX0FERFIgICAweDAwMDAwMTM0Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfSElTVF9VQl9DRkcgICAgICAgICAgMHgwMDAwMDEzOAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX1NLSU5fQkhJU1RfV1JfUElOR19BRERSICAgIDB4MDAwMDAxM0MKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19TS0lOX0JISVNUX1dSX1BPTkdfQUREUiAgICAweDAwMDAwMTQwCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfU0tJTl9CSElTVF9VQl9DRkcgICAgICAgICAgMHgwMDAwMDE0NAotI2RlZmluZSBWRkVfQ0FNSUZfQ09NTUFORCAgICAgICAgICAgICAgIDB4MDAwMDAxRTAKLSNkZWZpbmUgVkZFX0NBTUlGX1NUQVRVUyAgICAgICAgICAgICAgICAweDAwMDAwMjA0Ci0jZGVmaW5lIFZGRV9SRUdfVVBEQVRFX0NNRCAgICAgICAgICAgICAgMHgwMDAwMDI2MAotI2RlZmluZSBWRkVfREVNVVhfR0FJTl8wICAgICAgICAgICAgICAgIDB4MDAwMDAyODgKLSNkZWZpbmUgVkZFX0RFTVVYX0dBSU5fMSAgICAgICAgICAgICAgICAweDAwMDAwMjhDCi0jZGVmaW5lIFZGRV9DSFJPTUFfVVAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDM1QwotI2RlZmluZSBWRkVfRlJBTUVEUk9QX0VOQ19ZX0NGRyAgICAgICAgIDB4MDAwMDA1MDQKLSNkZWZpbmUgVkZFX0ZSQU1FRFJPUF9FTkNfQ0JDUl9DRkcgICAgICAweDAwMDAwNTA4Ci0jZGVmaW5lIFZGRV9GUkFNRURST1BfRU5DX1lfUEFUVEVSTiAgICAgMHgwMDAwMDUwQwotI2RlZmluZSBWRkVfRlJBTUVEUk9QX0VOQ19DQkNSX1BBVFRFUk4gIDB4MDAwMDA1MTAKLSNkZWZpbmUgVkZFX0ZSQU1FRFJPUF9WSUVXX1kgICAgICAgICAgICAweDAwMDAwNTE0Ci0jZGVmaW5lIFZGRV9GUkFNRURST1BfVklFV19DQkNSICAgICAgICAgMHgwMDAwMDUxOAotI2RlZmluZSBWRkVfRlJBTUVEUk9QX1ZJRVdfWV9QQVRURVJOICAgIDB4MDAwMDA1MUMKLSNkZWZpbmUgVkZFX0ZSQU1FRFJPUF9WSUVXX0NCQ1JfUEFUVEVSTiAweDAwMDAwNTIwCi0jZGVmaW5lIFZGRV9DTEFNUF9NQVggICAgICAgICAgICAgICAgICAgMHgwMDAwMDUyNAotI2RlZmluZSBWRkVfQ0xBTVBfTUlOICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MjgKLSNkZWZpbmUgVkZFX1JFQUxJR05fQlVGICAgICAgICAgICAgICAgICAweDAwMDAwNTJDCi0jZGVmaW5lIFZGRV9TVEFUU19DRkcgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUzMAotI2RlZmluZSBWRkVfU1RBVFNfQVdCX1NHV19DRkcgICAgICAgICAgIDB4MDAwMDA1NTQKLSNkZWZpbmUgVkZFX0RNSV9DRkcgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTk4Ci0jZGVmaW5lIFZGRV9ETUlfQUREUiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU5QwotI2RlZmluZSBWRkVfRE1JX0RBVEFfSEkgICAgICAgICAgICAgICAgIDB4MDAwMDA1QTAKLSNkZWZpbmUgVkZFX0RNSV9EQVRBX0xPICAgICAgICAgICAgICAgICAweDAwMDAwNUE0Ci0jZGVmaW5lIFZGRV9BWElfQ0ZHICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYwMAotI2RlZmluZSBWRkVfQlVTX0lPX0ZPUk1BVF9DRkcgICAgICAgICAgIDB4MDAwMDA2RjgKLSNkZWZpbmUgVkZFX1BJWEVMX0lGX0NGRyAgICAgICAgICAgICAgICAweDAwMDAwNkZDCi0jZGVmaW5lIFZGRV9SREkwX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDczNAotI2RlZmluZSBWRkVfUkRJMV9DRkcgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3QTQKLQotI2RlZmluZSBWRkVfVklPTEFUSU9OX1NUQVRVUyAgICAgICAgICAgIDB4MDAwMDA3QjQKLQotI2RlZmluZSBWRkUzM19ETUlfREFUQV9ISSAgICAgICAgICAgICAgIDB4MDAwMDA1QTAKLSNkZWZpbmUgVkZFMzNfRE1JX0RBVEFfTE8gICAgICAgICAgICAgICAweDAwMDAwNUE0Ci0KLSNkZWZpbmUgVkZFX0FYSV9DRkdfTUFTSyAgICAgICAgICAgICAgICAweEZGRkZGRkZGCi0KLSNkZWZpbmUgVkZFMzJfT1VUUFVUX01PREVfUFQJCQlCSVQoMCkKLSNkZWZpbmUgVkZFMzJfT1VUUFVUX01PREVfUwkJCUJJVCgxKQotI2RlZmluZSBWRkUzMl9PVVRQVVRfTU9ERV9WCQkJQklUKDIpCi0jZGVmaW5lIFZGRTMyX09VVFBVVF9NT0RFX1AJCQlCSVQoMykKLSNkZWZpbmUgVkZFMzJfT1VUUFVUX01PREVfVAkJCUJJVCg0KQotI2RlZmluZSBWRkUzMl9PVVRQVVRfTU9ERV9QX0FMTF9DSE5MUwkJQklUKDUpCi0jZGVmaW5lIFZGRTMyX09VVFBVVF9NT0RFX1BSSU1BUlkJCUJJVCg2KQotI2RlZmluZSBWRkUzMl9PVVRQVVRfTU9ERV9QUklNQVJZX0FMTF9DSE5MUwlCSVQoNykKLSNkZWZpbmUgVkZFMzJfT1VUUFVUX01PREVfU0VDT05EQVJZCQlCSVQoOCkKLSNkZWZpbmUgVkZFMzJfT1VUUFVUX01PREVfU0VDT05EQVJZX0FMTF9DSE5MUwlCSVQoOSkKLSNkZWZpbmUgVkZFMzJfT1VUUFVUX01PREVfVEVSVElBUlkxCQlCSVQoMTApCi0jZGVmaW5lIFZGRTMyX09VVFBVVF9NT0RFX1RFUlRJQVJZMgkJQklUKDExKQotCi1zdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wgewotCXVpbnQzMl90IGRyb3BwZWRTdGF0c0ZyYW1lQ291bnQ7Ci0JdWludDMyX3QgYnVmVG9SZW5kZXI7Ci19Owotc3RydWN0IGF4aV9jdHJsX3Q7Ci1zdHJ1Y3QgdmZlMzJfY3RybF90eXBlOwotCi1zdHJ1Y3QgdmZlX3NoYXJlX2N0cmxfdCB7Ci0Jdm9pZCBfX2lvbWVtICp2ZmViYXNlOwotCXVpbnQzMl90IHJlZ2lzdGVyX3RvdGFsOwotCi0JYXRvbWljX3QgdnN0YXRlOwotCWF0b21pY190IGhhbmRsZV9jb21tb25faXJxOwotCXVpbnQzMl90IHZmZUZyYW1lSWQ7Ci0JdWludDMyX3QgcmRpMEZyYW1lSWQ7Ci0JdWludDMyX3QgcmRpMUZyYW1lSWQ7Ci0JdWludDMyX3QgcmRpMkZyYW1lSWQ7Ci0JdWludDMyX3Qgc3RhdHNfY29tcDsKLQlzcGlubG9ja190ICBzZF9ub3RpZnlfbG9jazsKLQlzcGlubG9ja190ICBzdG9wX2ZsYWdfbG9jazsKLQlpbnQ4X3Qgc3RvcF9hY2tfcGVuZGluZzsKLQllbnVtIHZmZV9vdXRwdXRfc3RhdGUgbGl2ZXNob3Rfc3RhdGU7Ci0JdWludDMyX3QgdmZlX2NhcHR1cmVfY291bnQ7Ci0JaW50MzJfdCByZGkwX2NhcHR1cmVfY291bnQ7Ci0JaW50MzJfdCByZGkxX2NhcHR1cmVfY291bnQ7Ci0JdWludDhfdCB1cGRhdGVfY291bnRlcjsKLQotCXVpbnQzMl90IG9wZXJhdGlvbl9tb2RlOyAgICAgLyogc3RyZWFtaW5nIG9yIHNuYXBzaG90ICovCi0JdWludDMyX3QgY3VycmVudF9tb2RlOwotCXN0cnVjdCB2ZmUzMl9vdXRwdXRfcGF0aCBvdXRwYXRoOwotCi0JdWludDE2X3QgcG9ydF9pbmZvOwotCXVpbnQ4X3Qgc3RvcF9pbW1lZGlhdGVseTsKLQl1aW50OF90IHN5bmNfYWJvcnQ7Ci0JdWludDE2X3QgY21kX3R5cGU7Ci0JdWludDhfdCB2ZmVfcmVzZXRfZmxhZzsKLQl1aW50OF90IGR1YWxfZW5hYmxlZDsKLQotCXVpbnQ4X3QgYXhpX3JlZl9jbnQ7Ci0JdWludDE2X3QgY29tcF9vdXRwdXRfbW9kZTsKLQotCXN0cnVjdCBjb21wbGV0aW9uIHJlc2V0X2NvbXBsZXRlOwotCi0Jc3BpbmxvY2tfdCAgdXBkYXRlX2Fja19sb2NrOwotCXNwaW5sb2NrX3QgIHN0YXJ0X2Fja19sb2NrOwotCi0Jc3RydWN0IGF4aV9jdHJsX3QgKmF4aV9jdHJsOwotCXN0cnVjdCB2ZmUzMl9jdHJsX3R5cGUgKnZmZTMyX2N0cmw7Ci0JaW50OF90IHN0YXJ0X2Fja19wZW5kaW5nOwotCWludDhfdCB1cGRhdGVfYWNrX3BlbmRpbmc7Ci0JZW51bSB2ZmVfb3V0cHV0X3N0YXRlIHJlY29yZGluZ19zdGF0ZTsKLQotCWF0b21pY190IHBpeDBfdXBkYXRlX2Fja19wZW5kaW5nOwotCWF0b21pY190IHJkaTBfdXBkYXRlX2Fja19wZW5kaW5nOwotCWF0b21pY190IHJkaTFfdXBkYXRlX2Fja19wZW5kaW5nOwotCWF0b21pY190IHJkaTJfdXBkYXRlX2Fja19wZW5kaW5nOwotCi19OwotCi1zdHJ1Y3QgYXhpX2N0cmxfdCB7Ci0Jc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXN0cnVjdCByZXNvdXJjZSAqdmZlaXJxOwotCXNwaW5sb2NrX3QgIHRhc2tsZXRfbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHRhc2tsZXRfcTsKLQotCXZvaWQgKnN5bmNkYXRhOwotCi0Jc3RydWN0IHJlc291cmNlCSp2ZmVtZW07Ci0Jc3RydWN0IHJlc291cmNlICp2ZmVpbzsKLQlzdHJ1Y3QgcmVndWxhdG9yICpmc192ZmU7Ci0Jc3RydWN0IGNsayAqdmZlX2Nsa1szXTsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdmZlMzJfdGFza2xldDsKLQlzdHJ1Y3QgdmZlX3NoYXJlX2N0cmxfdCAqc2hhcmVfY3RybDsKLQlzdHJ1Y3QgZGV2aWNlICppb21tdV9jdHhfaW1nd3I7Ci0Jc3RydWN0IGRldmljZSAqaW9tbXVfY3R4X21pc2M7Ci19OwotCi1zdHJ1Y3QgdmZlMzJfY3RybF90eXBlIHsKLQlzcGlubG9ja190ICBzdGF0ZV9sb2NrOwotCXNwaW5sb2NrX3QgIHN0YXRzX2J1ZnFfbG9jazsKLQl1aW50MzJfdCBleHRsZW47Ci0Jdm9pZCAqZXh0ZGF0YTsKLQotCWludDhfdCB2ZmVfc29mX2NvdW50X2VuYWJsZTsKLQlpbnQ4X3QgdXBkYXRlX2xpbmVhcjsKLQlpbnQ4X3QgdXBkYXRlX3JvbGxvZmY7Ci0JaW50OF90IHVwZGF0ZV9sYTsKLQlpbnQ4X3QgdXBkYXRlX2dhbW1hOwotCi0Jc3RydWN0IHZmZV9zaGFyZV9jdHJsX3QgKnNoYXJlX2N0cmw7Ci0KLQl1aW50MzJfdCBzeW5jX3RpbWVyX3JlcGVhdF9jb3VudDsKLQl1aW50MzJfdCBzeW5jX3RpbWVyX3N0YXRlOwotCXVpbnQzMl90IHN5bmNfdGltZXJfbnVtYmVyOwotCi0Jc3RydWN0IG1zbV92ZXJfbnVtX2luZm8gdmVyX251bTsKLQlzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wgYWZiZlN0YXRzQ29udHJvbDsKLQlzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wgYXdiU3RhdHNDb250cm9sOwotCXN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCBhZWNiZ1N0YXRzQ29udHJvbDsKLQlzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wgaWhpc3RTdGF0c0NvbnRyb2w7Ci0Jc3RydWN0IHZmZV9zdGF0c19jb250cm9sIHJzU3RhdHNDb250cm9sOwotCXN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCBjc1N0YXRzQ29udHJvbDsKLQlzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wgYmhpc3RTdGF0c0NvbnRyb2w7Ci0KLQkvKiB2NGwyIHN1YmRldiAqLwotCXN0cnVjdCB2NGwyX3N1YmRldiBzdWJkZXY7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKLQl1aW50MzJfdCBoZnJfbW9kZTsKLQl1aW50MzJfdCBmcmFtZV9za2lwX2NudDsKLQl1aW50MzJfdCBmcmFtZV9za2lwX3BhdHRlcm47Ci0JdWludDMyX3Qgc25hcHNob3RfZnJhbWVfY250OwotCXN0cnVjdCBtc21fc3RhdHNfYnVmcV9jdHJsIHN0YXRzX2N0cmw7Ci0Jc3RydWN0IG1zbV9zdGF0c19vcHMgc3RhdHNfb3BzOwotCi0JdWludDMyX3Qgc2ltdWx0YW5lb3VzX3NvZl9zdGF0OwotfTsKLQotI2RlZmluZSBzdGF0c0FlTnVtICAgICAgMAotI2RlZmluZSBzdGF0c0FmTnVtICAgICAgMQotI2RlZmluZSBzdGF0c0F3Yk51bSAgICAgMgotI2RlZmluZSBzdGF0c1JzTnVtICAgICAgMwotI2RlZmluZSBzdGF0c0NzTnVtICAgICAgNAotI2RlZmluZSBzdGF0c0loaXN0TnVtICAgNQotI2RlZmluZSBzdGF0c1NraW5OdW0gICAgNgotCi1zdHJ1Y3QgdmZlX2NtZF9zdGF0c19hY2sgewotCXVpbnQzMl90ICBuZXh0U3RhdHNCdWY7Ci19OwotCi0jZGVmaW5lIFZGRV9TVEFUU19CVUZGRVJfQ09VTlQgICAgICAgICAgICAzCi0KLXN0cnVjdCB2ZmVfY21kX3N0YXRzX2J1ZiB7Ci0JdWludDMyX3Qgc3RhdHNCdWZbVkZFX1NUQVRTX0JVRkZFUl9DT1VOVF07Ci19OwotCi0jZW5kaWYgLyogX19NU01fVkZFMzJfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmU0MC5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlNDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5NmE3OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmU0MC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQ3OCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9pc3AuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9idXMuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9idXNfYm9hcmQuaD4KLQotI2luY2x1ZGUgIm1zbS5oIgotI2luY2x1ZGUgIm1zbV9jYW1fc2VydmVyLmgiCi0jaW5jbHVkZSAibXNtX3ZmZTQwLmgiCi0KLWF0b21pY190IGlycV9jbnQ7Ci0KLSNkZWZpbmUgVkZFX1dNX0NGR19CQVNFIDB4MDA3MAotI2RlZmluZSBWRkVfV01fQ0ZHX0xFTiAweDAwMjQKLQotI2RlZmluZSB2ZmU0MF9nZXRfY2hfcGluZ19hZGRyKGJhc2UsIGNobikgXAotCShtc21fY2FtZXJhX2lvX3IoKGJhc2UpICsgVkZFX1dNX0NGR19CQVNFICsgVkZFX1dNX0NGR19MRU4gKiAoY2huKSkpCi0jZGVmaW5lIHZmZTQwX2dldF9jaF9wb25nX2FkZHIoYmFzZSwgY2huKSBcCi0JKG1zbV9jYW1lcmFfaW9fcigoYmFzZSkgKyBWRkVfV01fQ0ZHX0JBU0UgKyBWRkVfV01fQ0ZHX0xFTiAqIChjaG4pICsgNCkpCi0jZGVmaW5lIHZmZTQwX2dldF9jaF9hZGRyKHBpbmdfcG9uZywgYmFzZSwgY2huKSBcCi0JKCgoKHBpbmdfcG9uZykgJiAoMSA8PCAoY2huKSkpID09IDApID8gXAotCSh2ZmU0MF9nZXRfY2hfcG9uZ19hZGRyKChiYXNlKSwgY2huKSkgOiBcCi0JKHZmZTQwX2dldF9jaF9waW5nX2FkZHIoKGJhc2UpLCBjaG4pKSkKLQotI2RlZmluZSB2ZmU0MF9wdXRfY2hfcGluZ19hZGRyKGJhc2UsIGNobiwgYWRkcikgXAotCShtc21fY2FtZXJhX2lvX3coKGFkZHIpLCBcCi0JKGJhc2UpICsgVkZFX1dNX0NGR19CQVNFICsgVkZFX1dNX0NGR19MRU4gKiAoY2huKSkpCi0jZGVmaW5lIHZmZTQwX3B1dF9jaF9wb25nX2FkZHIoYmFzZSwgY2huLCBhZGRyKSBcCi0JKG1zbV9jYW1lcmFfaW9fdygoYWRkciksIFwKLQkoYmFzZSkgKyBWRkVfV01fQ0ZHX0JBU0UgKyBWRkVfV01fQ0ZHX0xFTiAqIChjaG4pICsgNCkpCi0jZGVmaW5lIHZmZTQwX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywgYmFzZSwgY2huLCBhZGRyKSBcCi0JKCgocGluZ19wb25nKSAmICgxIDw8IChjaG4pKSkgPT0gMCA/ICAgXAotCXZmZTQwX3B1dF9jaF9wb25nX2FkZHIoKGJhc2UpLCAoY2huKSwgKGFkZHIpKSA6IFwKLQl2ZmU0MF9wdXRfY2hfcGluZ19hZGRyKChiYXNlKSwgKGNobiksIChhZGRyKSkpCi0KLXN0YXRpYyB1aW50MzJfdCB2ZmVfY2xrX3JhdGU7Ci1zdGF0aWMgdm9pZCB2ZmU0MF9zZW5kX2lzcF9tc2coc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQl1aW50MzJfdCB2ZmVGcmFtZUlkLCB1aW50MzJfdCBpc3BfbXNnX2lkKTsKLQotCi1zdHJ1Y3QgdmZlNDBfaXNyX3F1ZXVlX2NtZCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgdmZlSW50ZXJydXB0U3RhdHVzMDsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHZmZUludGVycnVwdFN0YXR1czE7Ci19OwotCi1zdGF0aWMgc3RydWN0IHZmZTQwX2NtZF90eXBlIHZmZTQwX2NtZFtdID0gewotCVsxXSA9IHtWRkVfQ01EX1NFVF9DTEt9LAotCVsyXSA9IHtWRkVfQ01EX1JFU0VUfSwKLQlbM10gPSB7VkZFX0NNRF9TVEFSVH0sCi0JWzRdID0ge1ZGRV9DTURfVEVTVF9HRU5fU1RBUlR9LAotCVs1XSA9IHtWRkVfQ01EX09QRVJBVElPTl9DRkcsIFY0MF9PUEVSQVRJT05fQ0ZHX0xFTn0sCi0JWzZdID0ge1ZGRV9DTURfQVhJX09VVF9DRkcsIFY0MF9BWElfT1VUX0xFTiwgVjQwX0FYSV9CVVNfQ01EX09GRiwgMHhGRn0sCi0JWzddID0ge1ZGRV9DTURfQ0FNSUZfQ0ZHLCBWNDBfQ0FNSUZfTEVOLCBWNDBfQ0FNSUZfT0ZGLCAweEZGfSwKLQlbOF0gPSB7VkZFX0NNRF9BWElfSU5QVVRfQ0ZHfSwKLQlbOV0gPSB7VkZFX0NNRF9CTEFDS19MRVZFTF9DRkd9LAotCVsxMF0gPSB7VkZFX0NNRF9NRVNIX1JPTExfT0ZGX0NGRywgVjQwX01FU0hfUk9MTF9PRkZfQ0ZHX0xFTiwKLQkJVjQwX01FU0hfUk9MTF9PRkZfQ0ZHX09GRiwgMHhGRn0sCi0JWzExXSA9IHtWRkVfQ01EX0RFTVVYX0NGRywgVjQwX0RFTVVYX0xFTiwgVjQwX0RFTVVYX09GRiwgMHhGRn0sCi0JWzEyXSA9IHtWRkVfQ01EX0ZPVl9DRkd9LAotCVsxM10gPSB7VkZFX0NNRF9NQUlOX1NDQUxFUl9DRkd9LAotCVsxNF0gPSB7VkZFX0NNRF9XQl9DRkcsIFY0MF9XQl9MRU4sIFY0MF9XQl9PRkYsIDB4RkZ9LAotCVsxNV0gPSB7VkZFX0NNRF9DT0xPUl9DT1JfQ0ZHLCBWNDBfQ09MT1JfQ09SX0xFTiwKLQkJVjQwX0NPTE9SX0NPUl9PRkYsIDB4RkZ9LAotCVsxNl0gPSB7VkZFX0NNRF9SR0JfR19DRkcsIFY0MF9SR0JfR19MRU4sIFY0MF9SR0JfR19PRkYsIDB4RkZ9LAotCVsxN10gPSB7VkZFX0NNRF9MQV9DRkcsIFY0MF9MQV9MRU4sIFY0MF9MQV9PRkYsIDB4RkYgfSwKLQlbMThdID0ge1ZGRV9DTURfQ0hST01BX0VOX0NGRywgVjQwX0NIUk9NQV9FTl9MRU4sIFY0MF9DSFJPTUFfRU5fT0ZGLAotCQkweEZGfSwKLQlbMTldID0ge1ZGRV9DTURfQ0hST01BX1NVUF9DRkcsIFY0MF9DSFJPTUFfU1VQX0xFTiwKLQkJVjQwX0NIUk9NQV9TVVBfT0ZGLCAweEZGfSwKLQlbMjBdID0ge1ZGRV9DTURfTUNFX0NGRywgVjQwX01DRV9MRU4sIFY0MF9NQ0VfT0ZGLCAweEZGfSwKLQlbMjFdID0ge1ZGRV9DTURfU0tfRU5IQU5fQ0ZHLCBWNDBfU0NFX0xFTiwgVjQwX1NDRV9PRkYsIDB4RkZ9LAotCVsyMl0gPSB7VkZFX0NNRF9BU0ZfQ0ZHLCBWNDBfQVNGX0xFTiwgVjQwX0FTRl9PRkYsIDB4RkZ9LAotCVsyM10gPSB7VkZFX0NNRF9TMllfQ0ZHfSwKLQlbMjRdID0ge1ZGRV9DTURfUzJDYkNyX0NGR30sCi0JWzI1XSA9IHtWRkVfQ01EX0NIUk9NQV9TVUJTX0NGR30sCi0JWzI2XSA9IHtWRkVfQ01EX09VVF9DTEFNUF9DRkcsIFY0MF9PVVRfQ0xBTVBfTEVOLCBWNDBfT1VUX0NMQU1QX09GRiwKLQkJMHhGRn0sCi0JWzI3XSA9IHtWRkVfQ01EX0ZSQU1FX1NLSVBfQ0ZHfSwKLQlbMzFdID0ge1ZGRV9DTURfVVBEQVRFfSwKLQlbMzJdID0ge1ZGRV9DTURfQkxfTFZMX1VQREFURX0sCi0JWzMzXSA9IHtWRkVfQ01EX0RFTVVYX1VQREFURSwgVjQwX0RFTVVYX0xFTiwgVjQwX0RFTVVYX09GRiwgMHhGRn0sCi0JWzM0XSA9IHtWRkVfQ01EX0ZPVl9VUERBVEV9LAotCVszNV0gPSB7VkZFX0NNRF9NQUlOX1NDQUxFUl9VUERBVEV9LAotCVszNl0gPSB7VkZFX0NNRF9XQl9VUERBVEUsIFY0MF9XQl9MRU4sIFY0MF9XQl9PRkYsIDB4RkZ9LAotCVszN10gPSB7VkZFX0NNRF9DT0xPUl9DT1JfVVBEQVRFLCBWNDBfQ09MT1JfQ09SX0xFTiwKLQkJVjQwX0NPTE9SX0NPUl9PRkYsIDB4RkZ9LAotCVszOF0gPSB7VkZFX0NNRF9SR0JfR19VUERBVEUsIFY0MF9SR0JfR19MRU4sIFY0MF9DSFJPTUFfRU5fT0ZGLCAweEZGfSwKLQlbMzldID0ge1ZGRV9DTURfTEFfVVBEQVRFLCBWNDBfTEFfTEVOLCBWNDBfTEFfT0ZGLCAweEZGIH0sCi0JWzQwXSA9IHtWRkVfQ01EX0NIUk9NQV9FTl9VUERBVEUsIFY0MF9DSFJPTUFfRU5fTEVOLAotCQlWNDBfQ0hST01BX0VOX09GRiwgMHhGRn0sCi0JWzQxXSA9IHtWRkVfQ01EX0NIUk9NQV9TVVBfVVBEQVRFLCBWNDBfQ0hST01BX1NVUF9MRU4sCi0JCVY0MF9DSFJPTUFfU1VQX09GRiwgMHhGRn0sCi0JWzQyXSA9IHtWRkVfQ01EX01DRV9VUERBVEUsIFY0MF9NQ0VfTEVOLCBWNDBfTUNFX09GRiwgMHhGRn0sCi0JWzQzXSA9IHtWRkVfQ01EX1NLX0VOSEFOX1VQREFURSwgVjQwX1NDRV9MRU4sIFY0MF9TQ0VfT0ZGLCAweEZGfSwKLQlbNDRdID0ge1ZGRV9DTURfUzJDYkNyX1VQREFURX0sCi0JWzQ1XSA9IHtWRkVfQ01EX1MyWV9VUERBVEV9LAotCVs0Nl0gPSB7VkZFX0NNRF9BU0ZfVVBEQVRFLCBWNDBfQVNGX1VQREFURV9MRU4sIFY0MF9BU0ZfT0ZGLCAweEZGfSwKLQlbNDddID0ge1ZGRV9DTURfRlJBTUVfU0tJUF9VUERBVEV9LAotCVs0OF0gPSB7VkZFX0NNRF9DQU1JRl9GUkFNRV9VUERBVEV9LAotCVs0OV0gPSB7VkZFX0NNRF9TVEFUU19BRl9VUERBVEV9LAotCVs1MF0gPSB7VkZFX0NNRF9TVEFUU19BRV9VUERBVEV9LAotCVs1MV0gPSB7VkZFX0NNRF9TVEFUU19BV0JfVVBEQVRFLCBWNDBfU1RBVFNfQVdCX0xFTiwKLQkJVjQwX1NUQVRTX0FXQl9PRkZ9LAotCVs1Ml0gPSB7VkZFX0NNRF9TVEFUU19SU19VUERBVEUsIFY0MF9TVEFUU19SU19MRU4sIFY0MF9TVEFUU19SU19PRkZ9LAotCVs1M10gPSB7VkZFX0NNRF9TVEFUU19DU19VUERBVEUsIFY0MF9TVEFUU19DU19MRU4sIFY0MF9TVEFUU19DU19PRkZ9LAotCVs1NF0gPSB7VkZFX0NNRF9TVEFUU19TS0lOX1VQREFURX0sCi0JWzU1XSA9IHtWRkVfQ01EX1NUQVRTX0lISVNUX1VQREFURSwgVjQwX1NUQVRTX0lISVNUX0xFTiwKLQkJVjQwX1NUQVRTX0lISVNUX09GRn0sCi0JWzU3XSA9IHtWRkVfQ01EX0VQT0NIMV9BQ0t9LAotCVs1OF0gPSB7VkZFX0NNRF9FUE9DSDJfQUNLfSwKLQlbNTldID0ge1ZGRV9DTURfU1RBUlRfUkVDT1JESU5HfSwKLQlbNjBdID0ge1ZGRV9DTURfU1RPUF9SRUNPUkRJTkd9LAotCVs2M10gPSB7VkZFX0NNRF9DQVBUVVJFLCBWNDBfQ0FQVFVSRV9MRU4sIDB4RkZ9LAotCVs2NV0gPSB7VkZFX0NNRF9TVE9QfSwKLQlbNjZdID0ge1ZGRV9DTURfR0VUX0hXX1ZFUlNJT04sIFY0MF9HRVRfSFdfVkVSU0lPTl9MRU4sCi0JCVY0MF9HRVRfSFdfVkVSU0lPTl9PRkZ9LAotCVs2N10gPSB7VkZFX0NNRF9HRVRfRlJBTUVfU0tJUF9DT1VOVFN9LAotCVs2OF0gPSB7VkZFX0NNRF9PVVRQVVQxX0JVRkZFUl9FTlF9LAotCVs2OV0gPSB7VkZFX0NNRF9PVVRQVVQyX0JVRkZFUl9FTlF9LAotCVs3MF0gPSB7VkZFX0NNRF9PVVRQVVQzX0JVRkZFUl9FTlF9LAotCVs3MV0gPSB7VkZFX0NNRF9KUEVHX09VVF9CVUZfRU5RfSwKLQlbNzJdID0ge1ZGRV9DTURfUkFXX09VVF9CVUZfRU5RfSwKLQlbNzNdID0ge1ZGRV9DTURfUkFXX0lOX0JVRl9FTlF9LAotCVs3NF0gPSB7VkZFX0NNRF9TVEFUU19BRl9FTlF9LAotCVs3NV0gPSB7VkZFX0NNRF9TVEFUU19BRV9FTlF9LAotCVs3Nl0gPSB7VkZFX0NNRF9TVEFUU19BV0JfRU5RfSwKLQlbNzddID0ge1ZGRV9DTURfU1RBVFNfUlNfRU5RfSwKLQlbNzhdID0ge1ZGRV9DTURfU1RBVFNfQ1NfRU5RfSwKLQlbNzldID0ge1ZGRV9DTURfU1RBVFNfU0tJTl9FTlF9LAotCVs4MF0gPSB7VkZFX0NNRF9TVEFUU19JSElTVF9FTlF9LAotCVs4Ml0gPSB7VkZFX0NNRF9KUEVHX0VOQ19DRkd9LAotCVs4NF0gPSB7VkZFX0NNRF9TVEFUU19BRl9TVEFSVH0sCi0JWzg1XSA9IHtWRkVfQ01EX1NUQVRTX0FGX1NUT1B9LAotCVs4Nl0gPSB7VkZFX0NNRF9TVEFUU19BRV9TVEFSVH0sCi0JWzg3XSA9IHtWRkVfQ01EX1NUQVRTX0FFX1NUT1B9LAotCVs4OF0gPSB7VkZFX0NNRF9TVEFUU19BV0JfU1RBUlQsIFY0MF9TVEFUU19BV0JfTEVOLCBWNDBfU1RBVFNfQVdCX09GRn0sCi0JWzg5XSA9IHtWRkVfQ01EX1NUQVRTX0FXQl9TVE9QfSwKLQlbOTBdID0ge1ZGRV9DTURfU1RBVFNfUlNfU1RBUlQsIFY0MF9TVEFUU19SU19MRU4sIFY0MF9TVEFUU19SU19PRkZ9LAotCVs5MV0gPSB7VkZFX0NNRF9TVEFUU19SU19TVE9QfSwKLQlbOTJdID0ge1ZGRV9DTURfU1RBVFNfQ1NfU1RBUlQsIFY0MF9TVEFUU19DU19MRU4sIFY0MF9TVEFUU19DU19PRkZ9LAotCVs5M10gPSB7VkZFX0NNRF9TVEFUU19DU19TVE9QfSwKLQlbOTRdID0ge1ZGRV9DTURfU1RBVFNfU0tJTl9TVEFSVH0sCi0JWzk1XSA9IHtWRkVfQ01EX1NUQVRTX1NLSU5fU1RPUH0sCi0JWzk2XSA9IHtWRkVfQ01EX1NUQVRTX0lISVNUX1NUQVJULAotCQlWNDBfU1RBVFNfSUhJU1RfTEVOLCBWNDBfU1RBVFNfSUhJU1RfT0ZGfSwKLQlbOTddID0ge1ZGRV9DTURfU1RBVFNfSUhJU1RfU1RPUH0sCi0JWzk5XSA9IHtWRkVfQ01EX1NZTkNfVElNRVJfU0VUVElORywgVjQwX1NZTkNfVElNRVJfTEVOLAotCQkJVjQwX1NZTkNfVElNRVJfT0ZGfSwKLQlbMTAwXSA9IHtWRkVfQ01EX0FTWU5DX1RJTUVSX1NFVFRJTkcsIFY0MF9BU1lOQ19USU1FUl9MRU4sCi0JCVY0MF9BU1lOQ19USU1FUl9PRkZ9LAotCVsxMDFdID0ge1ZGRV9DTURfTElWRVNIT1R9LAotCVsxMDJdID0ge1ZGRV9DTURfTEFfU0VUVVB9LAotCVsxMDNdID0ge1ZGRV9DTURfTElORUFSSVpBVElPTl9DRkcsIFY0MF9MSU5FQVJJWkFUSU9OX0xFTjEsCi0JCQlWNDBfTElORUFSSVpBVElPTl9PRkYxfSwKLQlbMTA0XSA9IHtWRkVfQ01EX0RFTU9TQUlDVjN9LAotCVsxMDVdID0ge1ZGRV9DTURfREVNT1NBSUNWM19BQkNDX0NGR30sCi0JWzEwNl0gPSB7VkZFX0NNRF9ERU1PU0FJQ1YzX0RCQ0NfQ0ZHLCBWNDBfREVNT1NBSUNWM19EQkNDX0xFTiwKLQkJCVY0MF9ERU1PU0FJQ1YzX0RCQ0NfT0ZGfSwKLQlbMTA3XSA9IHtWRkVfQ01EX0RFTU9TQUlDVjNfREJQQ19DRkd9LAotCVsxMDhdID0ge1ZGRV9DTURfREVNT1NBSUNWM19BQkZfQ0ZHLCBWNDBfREVNT1NBSUNWM19BQkZfTEVOLAotCQkJVjQwX0RFTU9TQUlDVjNfQUJGX09GRn0sCi0JWzEwOV0gPSB7VkZFX0NNRF9ERU1PU0FJQ1YzX0FCQ0NfVVBEQVRFfSwKLQlbMTEwXSA9IHtWRkVfQ01EX0RFTU9TQUlDVjNfREJDQ19VUERBVEUsIFY0MF9ERU1PU0FJQ1YzX0RCQ0NfTEVOLAotCQkJVjQwX0RFTU9TQUlDVjNfREJDQ19PRkZ9LAotCVsxMTFdID0ge1ZGRV9DTURfREVNT1NBSUNWM19EQlBDX1VQREFURX0sCi0JWzExMl0gPSB7VkZFX0NNRF9YQkFSX0NGR30sCi0JWzExM10gPSB7VkZFX0NNRF9NT0RVTEVfQ0ZHLCBWNDBfTU9EVUxFX0NGR19MRU4sIFY0MF9NT0RVTEVfQ0ZHX09GRn0sCi0JWzExNF0gPSB7VkZFX0NNRF9aU0x9LAotCVsxMTVdID0ge1ZGRV9DTURfTElORUFSSVpBVElPTl9VUERBVEUsIFY0MF9MSU5FQVJJWkFUSU9OX0xFTjEsCi0JCQlWNDBfTElORUFSSVpBVElPTl9PRkYxfSwKLQlbMTE2XSA9IHtWRkVfQ01EX0RFTU9TQUlDVjNfQUJGX1VQREFURSwgVjQwX0RFTU9TQUlDVjNfQUJGX0xFTiwKLQkJCVY0MF9ERU1PU0FJQ1YzX0FCRl9PRkZ9LAotCVsxMTddID0ge1ZGRV9DTURfQ0xGX0NGRywgVjQwX0NMRl9DRkdfTEVOLCBWNDBfQ0xGX0NGR19PRkZ9LAotCVsxMThdID0ge1ZGRV9DTURfQ0xGX0xVTUFfVVBEQVRFLCBWNDBfQ0xGX0xVTUFfVVBEQVRFX0xFTiwKLQkJCVY0MF9DTEZfTFVNQV9VUERBVEVfT0ZGfSwKLQlbMTE5XSA9IHtWRkVfQ01EX0NMRl9DSFJPTUFfVVBEQVRFLCBWNDBfQ0xGX0NIUk9NQV9VUERBVEVfTEVOLAotCQkJVjQwX0NMRl9DSFJPTUFfVVBEQVRFX09GRn0sCi0JWzEyMF0gPSB7VkZFX0NNRF9QQ0FfUk9MTF9PRkZfQ0ZHfSwKLQlbMTIxXSA9IHtWRkVfQ01EX1BDQV9ST0xMX09GRl9VUERBVEV9LAotCVsxMjJdID0ge1ZGRV9DTURfR0VUX1JFR19EVU1QfSwKLQlbMTIzXSA9IHtWRkVfQ01EX0dFVF9MSU5FQVJJWkFUT05fVEFCTEV9LAotCVsxMjRdID0ge1ZGRV9DTURfR0VUX01FU0hfUk9MTE9GRl9UQUJMRX0sCi0JWzEyNV0gPSB7VkZFX0NNRF9HRVRfUENBX1JPTExPRkZfVEFCTEV9LAotCVsxMjZdID0ge1ZGRV9DTURfR0VUX1JHQl9HX1RBQkxFfSwKLQlbMTI3XSA9IHtWRkVfQ01EX0dFVF9MQV9UQUJMRX0sCi0JWzEyOF0gPSB7VkZFX0NNRF9ERU1PU0FJQ1YzX1VQREFURX0sCi0JWzEyOV0gPSB7VkZFX0NNRF9BQ1RJVkVfUkVHSU9OX0NGR30sCi0JWzEzMF0gPSB7VkZFX0NNRF9DT0xPUl9QUk9DRVNTSU5HX0NPTkZJR30sCi0JWzEzMV0gPSB7VkZFX0NNRF9TVEFUU19XQl9BRUNfQ09ORklHfSwKLQlbMTMyXSA9IHtWRkVfQ01EX1NUQVRTX1dCX0FFQ19VUERBVEV9LAotCVsxMzNdID0ge1ZGRV9DTURfWV9HQU1NQV9DT05GSUd9LAotCVsxMzRdID0ge1ZGRV9DTURfU0NBTEVfT1VUUFVUMV9DT05GSUd9LAotCVsxMzVdID0ge1ZGRV9DTURfU0NBTEVfT1VUUFVUMl9DT05GSUd9LAotCVsxMzZdID0ge1ZGRV9DTURfQ0FQVFVSRV9SQVd9LAotCVsxMzddID0ge1ZGRV9DTURfU1RPUF9MSVZFU0hPVH0sCi0JWzEzOF0gPSB7VkZFX0NNRF9SRUNPTkZJR19WRkV9LAotCVsxMzldID0ge1ZGRV9DTURfU1RBVFNfUkVRQlVGfSwKLQlbMTQwXSA9IHtWRkVfQ01EX1NUQVRTX0VOUVVFVUVCVUZ9LAotCVsxNDFdID0ge1ZGRV9DTURfU1RBVFNfRkxVU0hfQlVGUX0sCi0JWzE0Ml0gPSB7VkZFX0NNRF9TVEFUU19VTlJFR0JVRn0sCi0JWzE0M10gPSB7VkZFX0NNRF9TVEFUU19CR19TVEFSVCwgVjQwX1NUQVRTX0JHX0xFTiwgVjQwX1NUQVRTX0JHX09GRn0sCi0JWzE0NF0gPSB7VkZFX0NNRF9TVEFUU19CR19TVE9QfSwKLQlbMTQ1XSA9IHtWRkVfQ01EX1NUQVRTX0JGX1NUQVJULCBWNDBfU1RBVFNfQkZfTEVOLCBWNDBfU1RBVFNfQkZfT0ZGfSwKLQlbMTQ2XSA9IHtWRkVfQ01EX1NUQVRTX0JGX1NUT1B9LAotCVsxNDddID0ge1ZGRV9DTURfU1RBVFNfQkhJU1RfU1RBUlQsIFY0MF9TVEFUU19CSElTVF9MRU4sCi0JCQlWNDBfU1RBVFNfQkhJU1RfT0ZGfSwKLQlbMTQ4XSA9IHtWRkVfQ01EX1NUQVRTX0JISVNUX1NUT1B9LAotCVsxNDldID0ge1ZGRV9DTURfUkVTRVRfMn0sCi0JWzE1MF0gPSB7VkZFX0NNRF9GT1ZfRU5DX0NGRywgVjQwX0ZPVl9FTkNfTEVOLAotCQlWNDBfRk9WX0VOQ19PRkYsIDB4RkZ9LAotCVsxNTFdID0ge1ZGRV9DTURfRk9WX1ZJRVdfQ0ZHLCBWNDBfRk9WX1ZJRVdfTEVOLAotCQlWNDBfRk9WX1ZJRVdfT0ZGLCAweEZGfSwKLQlbMTUyXSA9IHtWRkVfQ01EX0ZPVl9FTkNfVVBEQVRFLCBWNDBfRk9WX0VOQ19MRU4sCi0JCVY0MF9GT1ZfRU5DX09GRiwgMHhGRn0sCi0JWzE1M10gPSB7VkZFX0NNRF9GT1ZfVklFV19VUERBVEUsIFY0MF9GT1ZfVklFV19MRU4sCi0JCVY0MF9GT1ZfVklFV19PRkYsIDB4RkZ9LAotCVsxNTRdID0ge1ZGRV9DTURfU0NBTEVSX0VOQ19DRkcsIFY0MF9TQ0FMRVJfRU5DX0xFTiwKLQkJVjQwX1NDQUxFUl9FTkNfT0ZGLCAweEZGfSwKLQlbMTU1XSA9IHtWRkVfQ01EX1NDQUxFUl9WSUVXX0NGRywgVjQwX1NDQUxFUl9WSUVXX0xFTiwKLQkJVjQwX1NDQUxFUl9WSUVXX09GRiwgMHhGRn0sCi0JWzE1Nl0gPSB7VkZFX0NNRF9TQ0FMRVJfRU5DX1VQREFURSwgVjQwX1NDQUxFUl9FTkNfTEVOLAotCQlWNDBfU0NBTEVSX0VOQ19PRkYsIDB4RkZ9LAotCVsxNTddID0ge1ZGRV9DTURfU0NBTEVSX1ZJRVdfVVBEQVRFLCBWNDBfU0NBTEVSX1ZJRVdfTEVOLAotCQlWNDBfU0NBTEVSX1ZJRVdfT0ZGLCAweEZGfSwKLQlbMTU4XSA9IHtWRkVfQ01EX0NPTE9SWEZPUk1fRU5DX0NGRywgVjQwX0NPTE9SWEZPUk1fRU5DX0NGR19MRU4sCi0JCVY0MF9DT0xPUlhGT1JNX0VOQ19DRkdfT0ZGLCAweEZGfSwKLQlbMTU5XSA9IHtWRkVfQ01EX0NPTE9SWEZPUk1fVklFV19DRkcsIFY0MF9DT0xPUlhGT1JNX1ZJRVdfQ0ZHX0xFTiwKLQkJVjQwX0NPTE9SWEZPUk1fVklFV19DRkdfT0ZGfSwKLQlbMTYwXSA9IHtWRkVfQ01EX0NPTE9SWEZPUk1fRU5DX1VQREFURSwgVjQwX0NPTE9SWEZPUk1fRU5DX0NGR19MRU4sCi0JCVY0MF9DT0xPUlhGT1JNX0VOQ19DRkdfT0ZGLCAweEZGfSwKLQlbMTYxXSA9IHtWRkVfQ01EX0NPTE9SWEZPUk1fVklFV19VUERBVEUsIFY0MF9DT0xPUlhGT1JNX1ZJRVdfQ0ZHX0xFTiwKLQkJVjQwX0NPTE9SWEZPUk1fVklFV19DRkdfT0ZGLCAweEZGfSwKLQlbMTYzXSA9IHtWRkVfQ01EX1NUQVRTX0JFX1NUQVJULCBWNDBfU1RBVFNfQkVfTEVOLCBWNDBfU1RBVFNfQkVfT0ZGfSwKLQlbMTY0XSA9IHtWRkVfQ01EX1NUQVRTX0JFX1NUT1B9LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQzMl90IHZmZTQwX0FYSV9XTV9DRkdbXSA9IHsKLQkweDAwMDAwMDZDLAotCTB4MDAwMDAwOTAsCi0JMHgwMDAwMDBCNCwKLQkweDAwMDAwMEQ4LAotCTB4MDAwMDAwRkMsCi0JMHgwMDAwMDEyMCwKLQkweDAwMDAwMTQ0LAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2ZmU0MF9nZW5lcmFsX2NtZFtdID0gewotCVsxXSA9ICJTRVRfQ0xLIiwKLQlbMl0gPSAiUkVTRVQiLAotCVszXSA9ICJTVEFSVCIsCi0JWzRdID0gIlRFU1RfR0VOX1NUQVJUIiwKLQlbNV0gPSAiT1BFUkFUSU9OX0NGRyIsICAvKiA1ICovCi0JWzZdID0gIkFYSV9PVVRfQ0ZHIiwKLQlbN10gPSAiQ0FNSUZfQ0ZHIiwKLQlbOF0gPSAiQVhJX0lOUFVUX0NGRyIsCi0JWzldID0gIkJMQUNLX0xFVkVMX0NGRyIsCi0JWzEwXSA9ICJST0xMX09GRl9DRkciLCAgLyogMTAgKi8KLQlbMTFdID0gIkRFTVVYX0NGRyIsCi0JWzEyXSA9ICJGT1ZfQ0ZHIiwKLQlbMTNdID0gIk1BSU5fU0NBTEVSX0NGRyIsCi0JWzE0XSA9ICJXQl9DRkciLAotCVsxNV0gPSAiQ09MT1JfQ09SX0NGRyIsIC8qIDE1ICovCi0JWzE2XSA9ICJSR0JfR19DRkciLAotCVsxN10gPSAiTEFfQ0ZHIiwKLQlbMThdID0gIkNIUk9NQV9FTl9DRkciLAotCVsxOV0gPSAiQ0hST01BX1NVUF9DRkciLAotCVsyMF0gPSAiTUNFX0NGRyIsIC8qIDIwICovCi0JWzIxXSA9ICJTS19FTkhBTl9DRkciLAotCVsyMl0gPSAiQVNGX0NGRyIsCi0JWzIzXSA9ICJTMllfQ0ZHIiwKLQlbMjRdID0gIlMyQ2JDcl9DRkciLAotCVsyNV0gPSAiQ0hST01BX1NVQlNfQ0ZHIiwgIC8qIDI1ICovCi0JWzI2XSA9ICJPVVRfQ0xBTVBfQ0ZHIiwKLQlbMjddID0gIkZSQU1FX1NLSVBfQ0ZHIiwKLQlbMzFdID0gIlVQREFURSIsCi0JWzMyXSA9ICJCTF9MVkxfVVBEQVRFIiwKLQlbMzNdID0gIkRFTVVYX1VQREFURSIsCi0JWzM0XSA9ICJGT1ZfVVBEQVRFIiwKLQlbMzVdID0gIk1BSU5fU0NBTEVSX1VQREFURSIsICAvKiAzNSAqLwotCVszNl0gPSAiV0JfVVBEQVRFIiwKLQlbMzddID0gIkNPTE9SX0NPUl9VUERBVEUiLAotCVszOF0gPSAiUkdCX0dfVVBEQVRFIiwKLQlbMzldID0gIkxBX1VQREFURSIsCi0JWzQwXSA9ICJDSFJPTUFfRU5fVVBEQVRFIiwgIC8qIDQwICovCi0JWzQxXSA9ICJDSFJPTUFfU1VQX1VQREFURSIsCi0JWzQyXSA9ICJNQ0VfVVBEQVRFIiwKLQlbNDNdID0gIlNLX0VOSEFOX1VQREFURSIsCi0JWzQ0XSA9ICJTMkNiQ3JfVVBEQVRFIiwKLQlbNDVdID0gIlMyWV9VUERBVEUiLCAgLyogNDUgKi8KLQlbNDZdID0gIkFTRl9VUERBVEUiLAotCVs0N10gPSAiRlJBTUVfU0tJUF9VUERBVEUiLAotCVs0OF0gPSAiQ0FNSUZfRlJBTUVfVVBEQVRFIiwKLQlbNDldID0gIlNUQVRTX0FGX1VQREFURSIsCi0JWzUwXSA9ICJTVEFUU19BRV9VUERBVEUiLCAgLyogNTAgKi8KLQlbNTFdID0gIlNUQVRTX0FXQl9VUERBVEUiLAotCVs1Ml0gPSAiU1RBVFNfUlNfVVBEQVRFIiwKLQlbNTNdID0gIlNUQVRTX0NTX1VQREFURSIsCi0JWzU0XSA9ICJTVEFUU19TS0lOX1VQREFURSIsCi0JWzU1XSA9ICJTVEFUU19JSElTVF9VUERBVEUiLCAgLyogNTUgKi8KLQlbNTddID0gIkVQT0NIMV9BQ0siLAotCVs1OF0gPSAiRVBPQ0gyX0FDSyIsCi0JWzU5XSA9ICJTVEFSVF9SRUNPUkRJTkciLAotCVs2MF0gPSAiU1RPUF9SRUNPUkRJTkciLCAgLyogNjAgKi8KLQlbNjNdID0gIkNBUFRVUkUiLAotCVs2NV0gPSAiU1RPUCIsICAvKiA2NSAqLwotCVs2Nl0gPSAiR0VUX0hXX1ZFUlNJT04iLAotCVs2N10gPSAiR0VUX0ZSQU1FX1NLSVBfQ09VTlRTIiwKLQlbNjhdID0gIk9VVFBVVDFfQlVGRkVSX0VOUSIsCi0JWzY5XSA9ICJPVVRQVVQyX0JVRkZFUl9FTlEiLAotCVs3MF0gPSAiT1VUUFVUM19CVUZGRVJfRU5RIiwgIC8qIDcwICovCi0JWzcxXSA9ICJKUEVHX09VVF9CVUZfRU5RIiwKLQlbNzJdID0gIlJBV19PVVRfQlVGX0VOUSIsCi0JWzczXSA9ICJSQVdfSU5fQlVGX0VOUSIsCi0JWzc0XSA9ICJTVEFUU19BRl9FTlEiLAotCVs3NV0gPSAiU1RBVFNfQUVfRU5RIiwgIC8qIDc1ICovCi0JWzc2XSA9ICJTVEFUU19BV0JfRU5RIiwKLQlbNzddID0gIlNUQVRTX1JTX0VOUSIsCi0JWzc4XSA9ICJTVEFUU19DU19FTlEiLAotCVs3OV0gPSAiU1RBVFNfU0tJTl9FTlEiLAotCVs4MF0gPSAiU1RBVFNfSUhJU1RfRU5RIiwgIC8qIDgwICovCi0JWzgyXSA9ICJKUEVHX0VOQ19DRkciLAotCVs4NF0gPSAiU1RBVFNfQUZfU1RBUlQiLAotCVs4NV0gPSAiU1RBVFNfQUZfU1RPUCIsICAvKiA4NSAqLwotCVs4Nl0gPSAiU1RBVFNfQUVfU1RBUlQiLAotCVs4N10gPSAiU1RBVFNfQUVfU1RPUCIsCi0JWzg4XSA9ICJTVEFUU19BV0JfU1RBUlQiLAotCVs4OV0gPSAiU1RBVFNfQVdCX1NUT1AiLAotCVs5MF0gPSAiU1RBVFNfUlNfU1RBUlQiLCAgLyogOTAgKi8KLQlbOTFdID0gIlNUQVRTX1JTX1NUT1AiLAotCVs5Ml0gPSAiU1RBVFNfQ1NfU1RBUlQiLAotCVs5M10gPSAiU1RBVFNfQ1NfU1RPUCIsCi0JWzk0XSA9ICJTVEFUU19TS0lOX1NUQVJUIiwKLQlbOTVdID0gIlNUQVRTX1NLSU5fU1RPUCIsICAvKiA5NSAqLwotCVs5Nl0gPSAiU1RBVFNfSUhJU1RfU1RBUlQiLAotCVs5N10gPSAiU1RBVFNfSUhJU1RfU1RPUCIsCi0JWzk5XSA9ICJTWU5DX1RJTUVSX1NFVFRJTkciLAotCVsxMDBdID0gIkFTWU5DX1RJTUVSX1NFVFRJTkciLCAgLyogMTAwICovCi0JWzEwMV0gPSAiTElWRVNIT1QiLAotCVsxMDJdID0gIkxBX1NFVFVQIiwKLQlbMTAzXSA9ICJMSU5FQVJJWkFUSU9OX0NGRyIsCi0JWzEwNF0gPSAiREVNT1NBSUNWMyIsCi0JWzEwNV0gPSAiREVNT1NBSUNWM19BQkNDX0NGRyIsIC8qIDEwNSAqLwotCVsxMDZdID0gIkRFTU9TQUlDVjNfREJDQ19DRkciLAotCVsxMDddID0gIkRFTU9TQUlDVjNfREJQQ19DRkciLAotCVsxMDhdID0gIkRFTU9TQUlDVjNfQUJGX0NGRyIsCi0JWzEwOV0gPSAiREVNT1NBSUNWM19BQkNDX1VQREFURSIsCi0JWzExMF0gPSAiREVNT1NBSUNWM19EQkNDX1VQREFURSIsIC8qIDExMCAqLwotCVsxMTFdID0gIkRFTU9TQUlDVjNfREJQQ19VUERBVEUiLAotCVsxMTJdID0gIlhCQVJfQ0ZHIiwKLQlbMTEzXSA9ICJFWlRVTkVfQ0ZHIiwKLQlbMTE0XSA9ICJWNDBfWlNMIiwKLQlbMTE1XSA9ICJMSU5FQVJJWkFUSU9OX1VQREFURSIsIC8qMTE1Ki8KLQlbMTE2XSA9ICJERU1PU0FJQ1YzX0FCRl9VUERBVEUiLAotCVsxMTddID0gIkNMRl9DRkciLAotCVsxMThdID0gIkNMRl9MVU1BX1VQREFURSIsCi0JWzExOV0gPSAiQ0xGX0NIUk9NQV9VUERBVEUiLAotCVsxMjBdID0gIlBDQV9ST0xMX09GRl9DRkciLCAvKjEyMCovCi0JWzEyMV0gPSAiUENBX1JPTExfT0ZGX1VQREFURSIsCi0JWzEyMl0gPSAiR0VUX1JFR19EVU1QIiwKLQlbMTIzXSA9ICJHRVRfTElORUFSSVpBVE9OX1RBQkxFIiwKLQlbMTI0XSA9ICJHRVRfTUVTSF9ST0xMT0ZGX1RBQkxFIiwKLQlbMTI1XSA9ICJHRVRfUENBX1JPTExPRkZfVEFCTEUiLCAvKjEyNSovCi0JWzEyNl0gPSAiR0VUX1JHQl9HX1RBQkxFIiwKLQlbMTI3XSA9ICJHRVRfTEFfVEFCTEUiLAotCVsxMjhdID0gIkRFTU9TQUlDVjNfVVBEQVRFIiwKLQlbMTM5XSA9ICJTVEFUU19SRVFCVUYiLAotCVsxNDBdID0gIlNUQVRTX0VOUVVFVUVCVUYiLCAvKjE0MCovCi0JWzE0MV0gPSAiU1RBVFNfRkxVU0hfQlVGUSIsCi0JWzE0Ml0gPSAiU1RBVFNfVU5SRUdCVUYiLAotCVsxNDNdID0gIlNUQVRTX0JHX1NUQVJUIiwKLQlbMTQ0XSA9ICJTVEFUU19CR19TVE9QIiwKLQlbMTQ1XSA9ICJTVEFUU19CRl9TVEFSVCIsIC8qMTQ1Ki8KLQlbMTQ2XSA9ICJTVEFUU19CRl9TVE9QIiwKLQlbMTQ3XSA9ICJTVEFUU19CSElTVF9TVEFSVCIsCi0JWzE0OF0gPSAiU1RBVFNfQkhJU1RfU1RPUCIsCi0JWzE0OV0gPSAiUkVTRVRfMiIsCi19OwotCi0vKlRlbXBvcmFyeSB1c2UgZml4ZWQgYnVzIHZlY3RvcnMgaW4gVkZFICovCi1zdGF0aWMgc3RydWN0IG1zbV9idXNfdmVjdG9ycyB2ZmVfaW5pdF92ZWN0b3JzW10gPSB7Ci0JewotCQkuc3JjID0gTVNNX0JVU19NQVNURVJfVkZFLAotCQkuZHN0ID0gTVNNX0JVU19TTEFWRV9FQklfQ0gwLAotCQkuYWIgID0gMCwKLQkJLmliICA9IDAsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2J1c192ZWN0b3JzIHZmZV9wcmV2aWV3X3ZlY3RvcnNbXSA9IHsKLQl7Ci0JCS5zcmMgPSBNU01fQlVTX01BU1RFUl9WRkUsCi0JCS5kc3QgPSBNU01fQlVTX1NMQVZFX0VCSV9DSDAsCi0JCS5hYiAgPSAyNzY0ODAwMCwKLQkJLmliICA9IDExMDU5MjAwMCwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtc21fYnVzX3ZlY3RvcnMgdmZlX3ZpZGVvX3ZlY3RvcnNbXSA9IHsKLQl7Ci0JCS5zcmMgPSBNU01fQlVTX01BU1RFUl9WRkUsCi0JCS5kc3QgPSBNU01fQlVTX1NMQVZFX0VCSV9DSDAsCi0JCS5hYiAgPSAyNzQ0MDY0MDAsCi0JCS5pYiAgPSA2MTcxMDMzNjAsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2J1c192ZWN0b3JzIHZmZV9saXZlc2hvdF92ZWN0b3JzW10gPSB7Ci0JewotCQkuc3JjID0gTVNNX0JVU19NQVNURVJfVkZFLAotCQkuZHN0ID0gTVNNX0JVU19TTEFWRV9FQklfQ0gwLAotCQkuYWIgID0gMzQ4MTkyMDAwLAotCQkuaWIgID0gNjE3MTAzMzYwLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9idXNfdmVjdG9ycyB2ZmVfc25hcHNob3RfdmVjdG9yc1tdID0gewotCXsKLQkJLnNyYyA9IE1TTV9CVVNfTUFTVEVSX1ZGRSwKLQkJLmRzdCA9IE1TTV9CVVNfU0xBVkVfRUJJX0NIMCwKLQkJLmFiICA9IDI3NDQyMzY4MCwKLQkJLmliICA9IDEwOTc2OTQ3MjAsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2J1c192ZWN0b3JzIHZmZV96c2xfdmVjdG9yc1tdID0gewotCXsKLQkJLnNyYyA9IE1TTV9CVVNfTUFTVEVSX1ZGRSwKLQkJLmRzdCA9IE1TTV9CVVNfU0xBVkVfRUJJX0NIMCwKLQkJLmFiICA9IDMwMjA3MTY4MCwKLQkJLmliICA9IDEyMDgyODY3MjAsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2J1c19wYXRocyB2ZmVfYnVzX2NsaWVudF9jb25maWdbXSA9IHsKLQl7Ci0JCUFSUkFZX1NJWkUodmZlX2luaXRfdmVjdG9ycyksCi0JCXZmZV9pbml0X3ZlY3RvcnMsCi0JfSwKLQl7Ci0JCUFSUkFZX1NJWkUodmZlX3ByZXZpZXdfdmVjdG9ycyksCi0JCXZmZV9wcmV2aWV3X3ZlY3RvcnMsCi0JfSwKLQl7Ci0JCUFSUkFZX1NJWkUodmZlX3ZpZGVvX3ZlY3RvcnMpLAotCQl2ZmVfdmlkZW9fdmVjdG9ycywKLQl9LAotCXsKLQkJQVJSQVlfU0laRSh2ZmVfc25hcHNob3RfdmVjdG9ycyksCi0JCXZmZV9zbmFwc2hvdF92ZWN0b3JzLAotCX0sCi0JewotCQlBUlJBWV9TSVpFKHZmZV96c2xfdmVjdG9ycyksCi0JCXZmZV96c2xfdmVjdG9ycywKLQl9LAotCXsKLQkJQVJSQVlfU0laRSh2ZmVfbGl2ZXNob3RfdmVjdG9ycyksCi0JCXZmZV9saXZlc2hvdF92ZWN0b3JzLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9idXNfc2NhbGVfcGRhdGEgdmZlX2J1c19jbGllbnRfcGRhdGEgPSB7Ci0JCXZmZV9idXNfY2xpZW50X2NvbmZpZywKLQkJQVJSQVlfU0laRSh2ZmVfYnVzX2NsaWVudF9jb25maWcpLAotCQkubmFtZSA9ICJtc21fY2FtZXJhX3ZmZSIsCi19OwotCi11aW50OF90IHZmZTQwX3VzZV9iYXllcl9zdGF0cyhzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsKQotewotCWlmICh2ZmU0MF9jdHJsLT52ZXJfbnVtLm1haW4gPj0gNCkgewotCQkvKiBWRkUgNCBvciBhYm92ZSB1c2VzIGJheWVyIHN0YXRzICovCi0JCXJldHVybiBUUlVFOwotCX0gZWxzZSB7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGF4aV9lbmFibGVfaXJxKHN0cnVjdCB2ZmVfc2hhcmVfY3RybF90ICpzaGFyZV9jdHJsKQotewotCXVpbnQzMl90IGlycV9tYXNrOwotCXVpbnQxNl90IHZmZV9vcGVyYXRpb25fbW9kZSA9Ci0JCXNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmIH4oVkZFX09VVFBVVFNfUkRJMHwKLQkJCVZGRV9PVVRQVVRTX1JESTEpOwotCWlycV9tYXNrID0KLQkJbXNtX2NhbWVyYV9pb19yKHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0lSUV9NQVNLXzApOwotCi0JaXJxX21hc2sgfD0gVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HXzA7Ci0KLQlpZiAoc2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYgVkZFX09VVFBVVFNfUkRJMCkKLQkJaXJxX21hc2sgfD0gVkZFX0lSUV9TVEFUVVMwX1JESTBfUkVHX1VQREFURV9NQVNLOwotCi0JaWYgKHNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmIFZGRV9PVVRQVVRTX1JESTEpCi0JCWlycV9tYXNrIHw9IFZGRV9JUlFfU1RBVFVTMF9SREkxX1JFR19VUERBVEVfTUFTSzsKLQotCW1zbV9jYW1lcmFfaW9fdyhpcnFfbWFzaywgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9JUlFfTUFTS18wKTsKLQotCWlmICh2ZmVfb3BlcmF0aW9uX21vZGUpIHsKLQkJaXJxX21hc2sgPQotCQltc21fY2FtZXJhX2lvX3Ioc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfSVJRX01BU0tfMCk7Ci0JCWlycV9tYXNrIHw9IDB4MDAwMDAwMjE7Ci0JCWlmIChzaGFyZV9jdHJsLT5zdGF0c19jb21wKQotCQkJaXJxX21hc2sgfD0gVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0NPTVBPU0lUX01BU0tfMDsKLQkJZWxzZQotCQkJaXJxX21hc2sgfD0gMHgwMEZGMDAwMDsKLQkJbXNtX2NhbWVyYV9pb193KGlycV9tYXNrLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9JUlFfTUFTS18wKTsKLQkJYXRvbWljX3NldCgmc2hhcmVfY3RybC0+dnN0YXRlLCAxKTsKLQl9Ci0JYXRvbWljX3NldCgmc2hhcmVfY3RybC0+aGFuZGxlX2NvbW1vbl9pcnEsIDEpOwotfQotCi1zdGF0aWMgdm9pZCBheGlfZGlzYWJsZV9pcnEoc3RydWN0IHZmZV9zaGFyZV9jdHJsX3QgKnNoYXJlX2N0cmwpCi17Ci0KLQkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzLiAgKi8KLQotCXVpbnQzMl90IGlycV9tYXNrID0gMDsKLQl1aW50MTZfdCB2ZmVfb3BlcmF0aW9uX21vZGUgPQotCQlzaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgJiB+KFZGRV9PVVRQVVRTX1JESTB8Ci0JCQlWRkVfT1VUUFVUU19SREkxKTsKLQotCWlmIChzaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgJiBWRkVfT1VUUFVUU19SREkwKSB7Ci0JCWlycV9tYXNrID0KLQkJbXNtX2NhbWVyYV9pb19yKHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0lSUV9NQVNLXzApOwotCQlpcnFfbWFzayAmPSB+KFZGRV9JUlFfU1RBVFVTMF9SREkwX1JFR19VUERBVEVfTUFTSyk7Ci0JCW1zbV9jYW1lcmFfaW9fdyhpcnFfbWFzaywgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfSVJRX01BU0tfMCk7Ci0JCW1zbV9jYW1lcmFfaW9fdyhWRkVfSVJRX1NUQVRVUzBfUkRJMF9SRUdfVVBEQVRFX01BU0ssCi0JCQlzaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DTEVBUl8wKTsKLQl9Ci0JaWYgKHNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmIFZGRV9PVVRQVVRTX1JESTEpIHsKLQkJaXJxX21hc2sgPQotCQltc21fY2FtZXJhX2lvX3Ioc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfSVJRX01BU0tfMCk7Ci0JCWlycV9tYXNrICY9IH4oVkZFX0lSUV9TVEFUVVMwX1JESTFfUkVHX1VQREFURV9NQVNLKTsKLQkJbXNtX2NhbWVyYV9pb193KGlycV9tYXNrLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9JUlFfTUFTS18wKTsKLQkJbXNtX2NhbWVyYV9pb193KFZGRV9JUlFfU1RBVFVTMF9SREkxX1JFR19VUERBVEVfTUFTSywKLQkJCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NMRUFSXzApOwotCX0KLQlpZiAodmZlX29wZXJhdGlvbl9tb2RlKSB7Ci0JCWF0b21pY19zZXQoJnNoYXJlX2N0cmwtPnZzdGF0ZSwgMCk7Ci0JCWlycV9tYXNrID0KLQkJbXNtX2NhbWVyYV9pb19yKHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0lSUV9NQVNLXzApOwotCQlpcnFfbWFzayAmPSB+KDB4MDAwMDAwMTEpOwotCQlpZiAoc2hhcmVfY3RybC0+c3RhdHNfY29tcCkKLQkJCWlycV9tYXNrICY9IH4oVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0NPTVBPU0lUX01BU0tfMCk7Ci0JCWVsc2UKLQkJCWlycV9tYXNrICY9IH4weDAwRkYwMDAwOwotCQltc21fY2FtZXJhX2lvX3coaXJxX21hc2ssIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0lSUV9NQVNLXzApOwotCX0KLQotfQotCi1zdGF0aWMgdm9pZCB2ZmU0MF9zdG9wKHN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0KLQkvKiBpbiBlaXRoZXIgY29udGludW91cyBvciBzbmFwc2hvdCBtb2RlLCBzdG9wIGNvbW1hbmQgY2FuIGJlIGlzc3VlZAotCSAqIGF0IGFueSB0aW1lLiBzdG9wIGNhbWlmIGltbWVkaWF0ZWx5LiAqLwotCW1zbV9jYW1lcmFfaW9fdyhDQU1JRl9DT01NQU5EX1NUT1BfSU1NRURJQVRFTFksCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfQ0FNSUZfQ09NTUFORCk7Ci0JdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJj0KLQkJfih2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUpOwotCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTQwX3N1YmRldl9ub3RpZnkoaW50IGlkLCBpbnQgcGF0aCwgdWludDMyX3QgaW5zdF9oYW5kbGUsCi0Jc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHZmZV9zaGFyZV9jdHJsX3QgKnNoYXJlX2N0cmwpCi17Ci0Jc3RydWN0IG1zbV92ZmVfcmVzcCBycDsKLQlzdHJ1Y3QgbXNtX2ZyYW1lX2luZm8gZnJhbWVfaW5mbzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2hhcmVfY3RybC0+c2Rfbm90aWZ5X2xvY2ssIGZsYWdzKTsKLQlDREJHKCJ2ZmU0MF9zdWJkZXZfbm90aWZ5IDogbXNnSWQgPSAlZFxuIiwgaWQpOwotCW1lbXNldCgmcnAsIDAsIHNpemVvZihzdHJ1Y3QgbXNtX3ZmZV9yZXNwKSk7Ci0JcnAuZXZ0X21zZy50eXBlICAgPSBNU01fQ0FNRVJBX01TRzsKLQlmcmFtZV9pbmZvLmluc3RfaGFuZGxlID0gaW5zdF9oYW5kbGU7Ci0JZnJhbWVfaW5mby5wYXRoID0gcGF0aDsKLQlycC5ldnRfbXNnLmRhdGEgPSAmZnJhbWVfaW5mbzsKLQlycC50eXBlCSAgID0gaWQ7Ci0JdjRsMl9zdWJkZXZfbm90aWZ5KHNkLCBOT1RJRllfVkZFX0JVRl9FVlQsICZycCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2hhcmVfY3RybC0+c2Rfbm90aWZ5X2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCB2ZmU0MF9jb25maWdfYXhpKAotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCwgaW50IG1vZGUsIHVpbnQzMl90ICphbykKLXsKLQl1aW50MzJfdCAqY2hfaW5mbzsKLQl1aW50MzJfdCAqYXhpX2NmZyA9IGFvOwotCWludCB2ZmVfbW9kZSA9IChtb2RlICYgfihPVVRQVVRfVEVSVDF8T1VUUFVUX1RFUlQyKSk7Ci0KLQkvKiBVcGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgd3JpdGUgbWFzdGVycyBmb3IgZWFjaCBvdXRwdXQqLwotCWNoX2luZm8gPSBheGlfY2ZnICsgVjQwX0FYSV9DRkdfTEVOOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwID0gMHgwMDAwRkZGRiAmICpjaF9pbmZvOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxID0KLQkJMHgwMDAwRkZGRiAmICgqY2hfaW5mbysrID4+IDE2KTsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMiA9IDB4MDAwMEZGRkYgJiAqY2hfaW5mbysrOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuaW5zdF9oYW5kbGUgPSAqY2hfaW5mbysrOwotCi0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDAgPSAweDAwMDBGRkZGICYgKmNoX2luZm87Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDEgPQotCQkweDAwMDBGRkZGICYgKCpjaF9pbmZvKysgPj4gMTYpOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gyID0gMHgwMDAwRkZGRiAmICpjaF9pbmZvKys7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5pbnN0X2hhbmRsZSA9ICpjaF9pbmZvKys7Ci0KLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmNoMCA9IDB4MDAwMEZGRkYgJiAqY2hfaW5mbzsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmNoMSA9Ci0JCTB4MDAwMEZGRkYgJiAoKmNoX2luZm8rKyA+PiAxNik7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5jaDIgPSAweDAwMDBGRkZGICYgKmNoX2luZm8rKzsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmluc3RfaGFuZGxlID0gKmNoX2luZm8rKzsKLQotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDMuY2gwID0gMHgwMDAwRkZGRiAmICpjaF9pbmZvOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDMuY2gxID0KLQkJMHgwMDAwRkZGRiAmICgqY2hfaW5mbysrID4+IDE2KTsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQzLmNoMiA9IDB4MDAwMEZGRkYgJiAqY2hfaW5mbysrOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDMuaW5zdF9oYW5kbGUgPSAqY2hfaW5mbysrOwotCi0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgPSAwOwotCi0JaWYgKG1vZGUgJiBPVVRQVVRfVEVSVDEpCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkU0MF9PVVRQVVRfTU9ERV9URVJUSUFSWTE7Ci0JaWYgKG1vZGUgJiBPVVRQVVRfVEVSVDIpCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkU0MF9PVVRQVVRfTU9ERV9URVJUSUFSWTI7Ci0JaWYgKG1vZGUgPT0gT1VUUFVUX1RFUlQxIHx8IG1vZGUgPT0gT1VUUFVUX1RFUlQxCi0JCXx8IG1vZGUgPT0gKE9VVFBVVF9URVJUMXxPVVRQVVRfVEVSVDIpKQotCQkJZ290byBidXNfY2ZnOwotCi0Jc3dpdGNoICh2ZmVfbW9kZSkgewotCWNhc2UgT1VUUFVUX1BSSU06Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZOwotCQlicmVhazsKLQljYXNlIE9VVFBVVF9QUklNX0FMTF9DSE5MUzoKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgfD0KLQkJCVZGRTQwX09VVFBVVF9NT0RFX1BSSU1BUllfQUxMX0NITkxTOwotCQlicmVhazsKLQljYXNlIE9VVFBVVF9QUklNfE9VVFBVVF9TRUM6Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZOwotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSB8PQotCQkJVkZFNDBfT1VUUFVUX01PREVfU0VDT05EQVJZOwotCQlicmVhazsKLQljYXNlIE9VVFBVVF9QUklNfE9VVFBVVF9TRUNfQUxMX0NITkxTOgotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSB8PQotCQkJVkZFNDBfT1VUUFVUX01PREVfUFJJTUFSWTsKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgfD0KLQkJCVZGRTQwX09VVFBVVF9NT0RFX1NFQ09OREFSWV9BTExfQ0hOTFM7Ci0JCWJyZWFrOwotCWNhc2UgT1VUUFVUX1BSSU1fQUxMX0NITkxTfE9VVFBVVF9TRUM6Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZX0FMTF9DSE5MUzsKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgfD0KLQkJCVZGRTQwX09VVFBVVF9NT0RFX1NFQ09OREFSWTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlcyBJbnZhbGlkIEFYSSBtb2RlICVkICIsIF9fZnVuY19fLCBtb2RlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi1idXNfY2ZnOgotCW1zbV9jYW1lcmFfaW9fbWVtY3B5KGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJdmZlNDBfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLm9mZnNldCwgYXhpX2NmZywKLQkJVjQwX0FYSV9CVVNfQ0ZHX0xFTik7Ci0JbXNtX2NhbWVyYV9pb193KCpjaF9pbmZvKyssCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX1JESTBfQ0ZHKTsKLQltc21fY2FtZXJhX2lvX3coKmNoX2luZm8rKywKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkRJMV9DRkcpOwotCW1zbV9jYW1lcmFfaW9fdygqY2hfaW5mbysrLAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9SREkyX0NGRyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF4aV9yZXNldF9pbnRlcm5hbF92YXJpYWJsZXMoCi0Jc3RydWN0IGF4aV9jdHJsX3QgKmF4aV9jdHJsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JLyogc3RhdGUgY29udHJvbCB2YXJpYWJsZXMgKi8KLQlheGlfY3RybC0+c2hhcmVfY3RybC0+c3RhcnRfYWNrX3BlbmRpbmcgPSBGQUxTRTsKLQlhdG9taWNfc2V0KCZpcnFfY250LCAwKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZheGlfY3RybC0+c2hhcmVfY3RybC0+c3RvcF9mbGFnX2xvY2ssIGZsYWdzKTsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+c3RvcF9hY2tfcGVuZGluZyAgPSBGQUxTRTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZheGlfY3RybC0+c2hhcmVfY3RybC0+c3RvcF9mbGFnX2xvY2ssIGZsYWdzKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZheGlfY3RybC0+c2hhcmVfY3RybC0+dXBkYXRlX2Fja19sb2NrLCBmbGFncyk7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnVwZGF0ZV9hY2tfcGVuZGluZyA9IEZBTFNFOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT51cGRhdGVfYWNrX2xvY2ssIGZsYWdzKTsKLQotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZWNvcmRpbmdfc3RhdGUgPSBWRkVfU1RBVEVfSURMRTsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPSBWRkVfU1RBVEVfSURMRTsKLQotCWF0b21pY19zZXQoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT52c3RhdGUsIDApOwotCWF0b21pY19zZXQoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT5oYW5kbGVfY29tbW9uX2lycSwgMCk7Ci0JYXRvbWljX3NldCgmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnBpeDBfdXBkYXRlX2Fja19wZW5kaW5nLCAwKTsKLQlhdG9taWNfc2V0KCZheGlfY3RybC0+c2hhcmVfY3RybC0+cmRpMF91cGRhdGVfYWNrX3BlbmRpbmcsIDApOwotCWF0b21pY19zZXQoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZGkxX3VwZGF0ZV9hY2tfcGVuZGluZywgMCk7Ci0JYXRvbWljX3NldCgmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTJfdXBkYXRlX2Fja19wZW5kaW5nLCAwKTsKLQotCS8qIDAgZm9yIGNvbnRpbnVvdXMgbW9kZSwgMSBmb3Igc25hcHNob3QgbW9kZSAqLwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9IDA7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSA9IDA7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgPSAwOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlID0gMDsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlX2NhcHR1cmVfY291bnQgPSAwOwotCi0JLyogdGhpcyBpcyB1bnNpZ25lZCAzMiBiaXQgaW50ZWdlci4gKi8KLQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlRnJhbWVJZCA9IDA7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTBGcmFtZUlkID0gMDsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+cmRpMUZyYW1lSWQgPSAwOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZGkyRnJhbWVJZCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTQwX3Byb2dyYW1fZG1pX2NmZygKLQllbnVtIFZGRTQwX0RNSV9SQU1fU0VMIGJhbmtTZWwsCi0Jc3RydWN0IHZmZTQwX2N0cmxfdHlwZSAqdmZlNDBfY3RybCkKLXsKLQkvKiBzZXQgYml0IDggZm9yIGF1dG8gaW5jcmVtZW50LiAqLwotCXVpbnQzMl90IHZhbHVlID0gVkZFX0RNSV9DRkdfREVGQVVMVDsKLQl2YWx1ZSArPSAodWludDMyX3QpYmFua1NlbDsKLQlDREJHKCIlczogYmFua3NlbCA9ICVkXG4iLCBfX2Z1bmNfXywgYmFua1NlbCk7Ci0KLQltc21fY2FtZXJhX2lvX3codmFsdWUsIHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfRE1JX0NGRyk7Ci0JLyogYnkgZGVmYXVsdCwgYWx3YXlzIHN0YXJ0cyB3aXRoIG9mZnNldCAwLiovCi0JbXNtX2NhbWVyYV9pb193KDAsIHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfRE1JX0FERFIpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmU0MF9yZXNldF9kbWlfdGFibGVzKAotCXN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JaW50IGkgPSAwOwotCi0JLyogUmVzZXQgSGlzdG9ncmFtIExVVHMgKi8KLQlDREJHKCJSZXNldCBCYXllciBoaXN0b2dyYW0gTFVUIDogMFxuIik7Ci0JdmZlNDBfcHJvZ3JhbV9kbWlfY2ZnKFNUQVRTX0JISVNUX1JBTTAsIHZmZTQwX2N0cmwpOwotCS8qIExvb3AgZm9yIGNvbmZpZ3VyaW5nIExVVCAqLwotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotCQltc21fY2FtZXJhX2lvX3coMCwgdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfRE1JX0RBVEFfSEkpOwotCQltc21fY2FtZXJhX2lvX3coMCwgdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfRE1JX0RBVEFfTE8pOwotCX0KLQl2ZmU0MF9wcm9ncmFtX2RtaV9jZmcoTk9fTUVNX1NFTEVDVEVELCB2ZmU0MF9jdHJsKTsKLQotCUNEQkcoIlJlc2V0IEJheWVyIEhpc3RvZ3JhbSBMVVQ6IDFcbiIpOwotCXZmZTQwX3Byb2dyYW1fZG1pX2NmZyhTVEFUU19CSElTVF9SQU0xLCB2ZmU0MF9jdHJsKTsKLQkvKiBMb29wIGZvciBjb25maWd1cmluZyBMVVQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQkJbXNtX2NhbWVyYV9pb193KDAsIHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0RNSV9EQVRBX0hJKTsKLQkJbXNtX2NhbWVyYV9pb193KDAsIHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0RNSV9EQVRBX0xPKTsKLQl9Ci0JdmZlNDBfcHJvZ3JhbV9kbWlfY2ZnKE5PX01FTV9TRUxFQ1RFRCwgdmZlNDBfY3RybCk7Ci0KLQlDREJHKCJSZXNldCBJSGlzdG9ncmFtIExVVFxuIik7Ci0JdmZlNDBfcHJvZ3JhbV9kbWlfY2ZnKFNUQVRTX0lISVNUX1JBTSwgdmZlNDBfY3RybCk7Ci0JLyogTG9vcCBmb3IgY29uZmlndXJpbmcgTFVUICovCi0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCW1zbV9jYW1lcmFfaW9fdygwLCB2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9ETUlfREFUQV9ISSk7Ci0JCW1zbV9jYW1lcmFfaW9fdygwLCB2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9ETUlfREFUQV9MTyk7Ci0JfQotCXZmZTQwX3Byb2dyYW1fZG1pX2NmZyhOT19NRU1fU0VMRUNURUQsIHZmZTQwX2N0cmwpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmU0MF9zZXRfZGVmYXVsdF9yZWdfdmFsdWVzKAotCXN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JbXNtX2NhbWVyYV9pb193KDB4ODAwMDgwLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0RFTVVYX0dBSU5fMCk7Ci0JbXNtX2NhbWVyYV9pb193KDB4ODAwMDgwLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0RFTVVYX0dBSU5fMSk7Ci0JbXNtX2NhbWVyYV9pb193KDB4MTk4RkZGRkYsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfQ0dDX09WRVJSSURFKTsKLQotCW1zbV9jYW1lcmFfaW9fdygwLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0NMQU1QX0VOQ19NSU4pOwotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGRiwKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9DTEFNUF9FTkNfTUFYKTsKLQltc21fY2FtZXJhX2lvX3coMCwKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9DTEFNUF9WSUVXX01JTik7Ci0JbXNtX2NhbWVyYV9pb193KDB4RkZGRkZGLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0NMQU1QX1ZJRVdfTUFYKTsKLQotCS8qIHN0YXRzIFVCIGNvbmZpZyAqLwotCUNEQkcoIiVzOiBVc2UgYmF5ZXIgc3RhdHMgPSAlZFxuIiwgX19mdW5jX18sCi0JCSB2ZmU0MF91c2VfYmF5ZXJfc3RhdHModmZlNDBfY3RybCkpOwotCi0JbXNtX2NhbWVyYV9pb193KDB4ODJGODAwMDcsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0JVU19TVEFUU19SU19XUl9VQl9DRkcpOwotCW1zbV9jYW1lcmFfaW9fdygweDgzMDAwMDBGLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfU1RBVFNfQ1NfV1JfVUJfQ0ZHKTsKLQotCW1zbV9jYW1lcmFfaW9fdygweDgzMTAwMDNGLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfU1RBVFNfQkdfV1JfVUJfQ0ZHKTsKLQltc21fY2FtZXJhX2lvX3coMHg4MzUwMDAzRiwKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfQlVTX1NUQVRTX0JFX1dSX1VCX0NGRyk7Ci0JbXNtX2NhbWVyYV9pb193KDB4ODM5MDAwM0YsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0JVU19TVEFUU19CRl9XUl9VQl9DRkcpOwotCi0JbXNtX2NhbWVyYV9pb193KDB4ODNEMDAwMEYsCi0JdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfQlVTX1NUQVRTX0hJU1RfV1JfVUJfQ0ZHKTsKLQltc21fY2FtZXJhX2lvX3coMHg4M0UwMDAwRiwKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfQlVTX1NUQVRTX1NLSU5fV1JfVUJfQ0ZHKTsKLQotCW1zbV9jYW1lcmFfaW9fdygweDgzRjAwMDBGLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfU1RBVFNfQVdCX1dSX1VCX0NGRyk7Ci0KLQkvKiBzdGF0cyBmcmFtZSBzdWJzYW1wbGUgY29uZmlnKi8KLQltc21fY2FtZXJhX2lvX3coMHhGRkZGRkZGRiwKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfQlVTX1NUQVRTX0hJU1RfV1JfRlJBTUVEUk9QX1BBVFRFUk4pOwotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGRkZGLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfU1RBVFNfQkdfV1JfRlJBTUVEUk9QX1BBVFRFUk4pOwotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGRkZGLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfU1RBVFNfQkVfV1JfRlJBTUVEUk9QX1BBVFRFUk4pOwotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGRkZGLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfU1RBVFNfQkZfV1JfRlJBTUVEUk9QX1BBVFRFUk4pOwotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGRkZGLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfU1RBVFNfUlNfV1JfRlJBTUVEUk9QX1BBVFRFUk4pOwotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGRkZGLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfU1RBVFNfQ1NfV1JfRlJBTUVEUk9QX1BBVFRFUk4pOwotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGRkZGLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfU1RBVFNfU0tJTl9XUl9GUkFNRURST1BfUEFUVEVSTik7Ci0JbXNtX2NhbWVyYV9pb193KDB4RkZGRkZGRkYsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0JVU19TVEFUU19BV0JfV1JfRlJBTUVEUk9QX1BBVFRFUk4pOwotCi0JLyogc3RhdHMgaXJxIHN1YnNhbXBsZSBjb25maWcqLwotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGRkZGLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfU1RBVFNfSElTVF9XUl9JUlFfU1VCU0FNUExFX1BBVFRFUk4pOwotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGRkZGLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfU1RBVFNfQkdfV1JfSVJRX1NVQlNBTVBMRV9QQVRURVJOKTsKLQltc21fY2FtZXJhX2lvX3coMHhGRkZGRkZGRiwKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfQlVTX1NUQVRTX0JFX1dSX0lSUV9TVUJTQU1QTEVfUEFUVEVSTik7Ci0JbXNtX2NhbWVyYV9pb193KDB4RkZGRkZGRkYsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0JVU19TVEFUU19CRl9XUl9JUlFfU1VCU0FNUExFX1BBVFRFUk4pOwotCW1zbV9jYW1lcmFfaW9fdygweEZGRkZGRkZGLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfU1RBVFNfUlNfV1JfSVJRX1NVQlNBTVBMRV9QQVRURVJOKTsKLQltc21fY2FtZXJhX2lvX3coMHhGRkZGRkZGRiwKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfQlVTX1NUQVRTX0NTX1dSX0lSUV9TVUJTQU1QTEVfUEFUVEVSTik7Ci0JbXNtX2NhbWVyYV9pb193KDB4RkZGRkZGRkYsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0JVU19TVEFUU19TS0lOX1dSX0lSUV9TVUJTQU1QTEVfUEFUVEVSTik7Ci0JbXNtX2NhbWVyYV9pb193KDB4RkZGRkZGRkYsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0JVU19TVEFUU19BV0JfV1JfSVJRX1NVQlNBTVBMRV9QQVRURVJOKTsKLQotCXZmZTQwX3Jlc2V0X2RtaV90YWJsZXModmZlNDBfY3RybCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTQwX3Jlc2V0X2ludGVybmFsX3ZhcmlhYmxlcygKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsKQotewotCS8qIFN0YXRzIGNvbnRyb2wgdmFyaWFibGVzLiAqLwotCW1lbXNldCgmKHZmZTQwX2N0cmwtPmJmU3RhdHNDb250cm9sKSwgMCwKLQkJc2l6ZW9mKHN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCkpOwotCi0JbWVtc2V0KCYodmZlNDBfY3RybC0+YXdiU3RhdHNDb250cm9sKSwgMCwKLQkJc2l6ZW9mKHN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCkpOwotCi0JbWVtc2V0KCYodmZlNDBfY3RybC0+YmdTdGF0c0NvbnRyb2wpLCAwLAotCQlzaXplb2Yoc3RydWN0IHZmZV9zdGF0c19jb250cm9sKSk7Ci0KLQltZW1zZXQoJih2ZmU0MF9jdHJsLT5iZVN0YXRzQ29udHJvbCksIDAsCi0JCXNpemVvZihzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wpKTsKLQotCW1lbXNldCgmKHZmZTQwX2N0cmwtPmJoaXN0U3RhdHNDb250cm9sKSwgMCwKLQkJc2l6ZW9mKHN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCkpOwotCi0JbWVtc2V0KCYodmZlNDBfY3RybC0+aWhpc3RTdGF0c0NvbnRyb2wpLCAwLAotCQlzaXplb2Yoc3RydWN0IHZmZV9zdGF0c19jb250cm9sKSk7Ci0KLQltZW1zZXQoJih2ZmU0MF9jdHJsLT5yc1N0YXRzQ29udHJvbCksIDAsCi0JCXNpemVvZihzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wpKTsKLQotCW1lbXNldCgmKHZmZTQwX2N0cmwtPmNzU3RhdHNDb250cm9sKSwgMCwKLQkJc2l6ZW9mKHN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCkpOwotCi0JdmZlNDBfY3RybC0+ZnJhbWVfc2tpcF9jbnQgPSAzMTsKLQl2ZmU0MF9jdHJsLT5mcmFtZV9za2lwX3BhdHRlcm4gPSAweGZmZmZmZmZmOwotCXZmZTQwX2N0cmwtPnNuYXBzaG90X2ZyYW1lX2NudCA9IDA7Ci0JdmZlNDBfc2V0X2RlZmF1bHRfcmVnX3ZhbHVlcyh2ZmU0MF9jdHJsKTsKLX0KLQotc3RhdGljIGludCB2ZmU0MF9yZXNldChzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsKQotewotCXVpbnQzMl90IGlycV9tYXNrOwotCWF0b21pY19zZXQoJnZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZzdGF0ZSwgMCk7Ci0JbXNtX2NhbWVyYV9pb193KFZGRV9NT0RVTEVfUkVTRVRfQ01ELAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9SRVNFVCk7Ci0JbXNtX2NhbWVyYV9pb193KDAsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX1JFU0VUKTsKLQotCWlycV9tYXNrID0KLQkJbXNtX2NhbWVyYV9pb19yKHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0lSUV9NQVNLXzApOwotCWlycV9tYXNrICY9IH4oMHgwMEZGMDAxMXxWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQ09NUE9TSVRfTUFTS18wKTsKLQotCS8qIGVuYWJsZSByZXNldF9hY2sgaW50ZXJydXB0LiAgKi8KLQlpcnFfbWFzayB8PSBWRkVfSU1BU0tfV0hJTEVfU1RPUFBJTkdfMDsKLQltc21fY2FtZXJhX2lvX3coaXJxX21hc2ssIHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfSVJRX01BU0tfMCk7Ci0KLQltc21fY2FtZXJhX2lvX3dfbWIoVkZFX09OTFlfUkVTRVRfQ01ELAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0dMT0JBTF9SRVNFVCk7Ci0KLQlyZXR1cm4gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKAotCQkJJnZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnJlc2V0X2NvbXBsZXRlKTsKLX0KLQotc3RhdGljIGludCBheGlfcmVzZXQoc3RydWN0IGF4aV9jdHJsX3QgKmF4aV9jdHJsKQotewotCWF4aV9yZXNldF9pbnRlcm5hbF92YXJpYWJsZXMoYXhpX2N0cmwpOwotCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMuICB2ZmVJbWFza0xvY2FsIGlzIGFsc28gcmVzZXQgdG8gMAotCSogdG8gYmVnaW4gd2l0aC4gKi8KLQltc21fY2FtZXJhX2lvX3coVkZFX0RJU0FCTEVfQUxMX0lSUVMsCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9NQVNLXzApOwotCi0JbXNtX2NhbWVyYV9pb193KFZGRV9ESVNBQkxFX0FMTF9JUlFTLAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfTUFTS18xKTsKLQotCS8qIGNsZWFyIGFsbCBwZW5kaW5nIGludGVycnVwdHMqLwotCW1zbV9jYW1lcmFfaW9fdyhWRkVfQ0xFQVJfQUxMX0lSUTAsCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DTEVBUl8wKTsKLQltc21fY2FtZXJhX2lvX3coVkZFX0NMRUFSX0FMTF9JUlExLAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ0xFQVJfMSk7Ci0KLQkvKiBFbnN1cmUgdGhlIHdyaXRlIG9yZGVyIHdoaWxlIHdyaXRpbmcKLQl0byB0aGUgY29tbWFuZCByZWdpc3RlciB1c2luZyB0aGUgYmFycmllciAqLwotCW1zbV9jYW1lcmFfaW9fd19tYigxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ01EKTsKLQotCS8qIGVuYWJsZSByZXNldF9hY2sgaW50ZXJydXB0LiAgKi8KLQltc21fY2FtZXJhX2lvX3coVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HXzAsCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9NQVNLXzApOwotCi0JLyogV3JpdGUgdG8gVkZFX0dMT0JBTF9SRVNFVF9DTUQgdG8gcmVzZXQgdGhlIHZmZSBoYXJkd2FyZS4gT25jZSByZXNldAotCSAqIGlzIGRvbmUsIGhhcmR3YXJlIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZC4gIFZGRSBpc3QgcHJvY2Vzc2VzCi0JICogdGhlIGludGVycnVwdCB0byBjb21wbGV0ZSB0aGUgZnVuY3Rpb24gY2FsbC4gIE5vdGUgdGhhdCB0aGUgcmVzZXQKLQkgKiBmdW5jdGlvbiBpcyBzeW5jaHJvbm91cy4gKi8KLQotCS8qIEVuc3VyZSB0aGUgd3JpdGUgb3JkZXIgd2hpbGUgd3JpdGluZwotCXRvIHRoZSBjb21tYW5kIHJlZ2lzdGVyIHVzaW5nIHRoZSBiYXJyaWVyICovCi0JbXNtX2NhbWVyYV9pb193X21iKFZGRV9SRVNFVF9VUE9OX1JFU0VUX0NNRCwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfR0xPQkFMX1JFU0VUKTsKLQotCXJldHVybiB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoCi0JCQkmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJlc2V0X2NvbXBsZXRlKTsKLX0KLQotc3RhdGljIGludCB2ZmU0MF9vcGVyYXRpb25fY29uZmlnKHVpbnQzMl90ICpjbWQsCi0JCQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsKQotewotCXVpbnQzMl90ICpwID0gY21kOwotCi0JdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+c3RhdHNfY29tcCA9ICooKytwKTsKLQl2ZmU0MF9jdHJsLT5oZnJfbW9kZSA9ICooKytwKTsKLQotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfQ0ZHKTsKLQltc21fY2FtZXJhX2lvX3coKigrK3ApLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkVBTElHTl9CVUYpOwotCW1zbV9jYW1lcmFfaW9fdygqKCsrcCksCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfQ0hST01BX1VQKTsKLQltc21fY2FtZXJhX2lvX3coKigrK3ApLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX1NUQVRTX0NGRyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZmZTQwX3N0YXRzX2RxYnVmKHN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwsCi0JZW51bSBtc21fc3RhdHNfZW51bV90eXBlIHN0YXRzX3R5cGUpCi17Ci0Jc3RydWN0IG1zbV9zdGF0c19tZXRhX2J1ZiAqYnVmID0gTlVMTDsKLQlpbnQgcmMgPSAwOwotCXJjID0gdmZlNDBfY3RybC0+c3RhdHNfb3BzLmRxYnVmKAotCQkJdmZlNDBfY3RybC0+c3RhdHNfb3BzLnN0YXRzX2N0cmwsIHN0YXRzX3R5cGUsICZidWYpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogZHEgc3RhdHMgYnVmICh0eXBlID0gJWQpIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHN0YXRzX3R5cGUsIHJjKTsKLQkJcmV0dXJuIDBMOwotCX0KLQlyZXR1cm4gYnVmLT5wYWRkcjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgdmZlNDBfc3RhdHNfZmx1c2hfZW5xdWV1ZSgKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsLAotCWVudW0gbXNtX3N0YXRzX2VudW1fdHlwZSBzdGF0c190eXBlKQotewotCXN0cnVjdCBtc21fc3RhdHNfYnVmcSAqYnVmcSA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9zdGF0c19tZXRhX2J1ZiAqc3RhdHNfYnVmID0gTlVMTDsKLQlpbnQgcmMgPSAwOwotCWludCBpOwotCi0JLyoKLQkgKiBQYXNzaW5nIE5VTEwgZm9yIGlvbiBjbGllbnQgYXMgdGhlIGJ1ZmZlcnMgYXJlIGFscmVhZHkKLQkgKiBtYXBwZWQgYXQgdGhpcyBzdGFnZSwgY2xpZW50IGlzIG5vdCByZXF1aXJlZCwgZmx1c2ggYWxsCi0JICogdGhlIGJ1ZmZlcnMsIGFuZCBidWZmZXJzIG1vdmUgdG8gUFJFUEFSRSBzdGF0ZQotCSAqLwotCi0JcmMgPSB2ZmU0MF9jdHJsLT5zdGF0c19vcHMuYnVmcV9mbHVzaCgKLQkJCXZmZTQwX2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsLCBzdGF0c190eXBlLCBOVUxMKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IGRxIHN0YXRzIGJ1ZiAodHlwZSA9ICVkKSBlcnIgPSAlZCIsCi0JCQlfX2Z1bmNfXywgc3RhdHNfdHlwZSwgcmMpOwotCQlyZXR1cm4gMEw7Ci0JfQotCS8qIFF1ZXVlIGFsbCB0aGUgYnVmZmVycyBiYWNrIHRvIFFVRVVFRCBzdGF0ZSAqLwotCWJ1ZnEgPSB2ZmU0MF9jdHJsLT5zdGF0c19jdHJsLmJ1ZnFbc3RhdHNfdHlwZV07Ci0JZm9yIChpID0gMDsgaSA8IGJ1ZnEtPm51bV9idWZzOyBpKyspIHsKLQkJc3RhdHNfYnVmID0gJmJ1ZnEtPmJ1ZnNbaV07Ci0JCXJjID0gdmZlNDBfY3RybC0+c3RhdHNfb3BzLmVucXVldWVfYnVmKAotCQkJCXZmZTQwX2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsLAotCQkJCSYoc3RhdHNfYnVmLT5pbmZvKSwgTlVMTCwgLTEpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBkcSBzdGF0cyBidWYgKHR5cGUgPSAlZCkgZXJyID0gJWQiLAotCQkJCSBfX2Z1bmNfXywgc3RhdHNfdHlwZSwgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCXJldHVybiAwTDsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2ZmU0MF9zdGF0c191bnJlZ2J1ZigKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsLAotCXN0cnVjdCBtc21fc3RhdHNfcmVxYnVmICpyZXFfYnVmLCBpbnQgZG9tYWluX251bSkKLXsKLQlpbnQgaSA9IDAsIHJjID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCByZXFfYnVmLT5udW1fYnVmOyBpKyspIHsKLQkJcmMgPSB2ZmU0MF9jdHJsLT5zdGF0c19vcHMuYnVmX3VucHJlcGFyZSgKLQkJCXZmZTQwX2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsLAotCQkJcmVxX2J1Zi0+c3RhdHNfdHlwZSwgaSwKLQkJCXZmZTQwX2N0cmwtPnN0YXRzX29wcy5jbGllbnQsIGRvbWFpbl9udW0pOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiB1bnJlZyBzdGF0cyBidWYgKHR5cGUgPSAlZCkgZXJyID0gJWQiLAotCQkJCV9fZnVuY19fLCByZXFfYnVmLT5zdGF0c190eXBlLCByYyk7Ci0JCXJldHVybiByYzsKLQkJfQotCX0KLQlyZXR1cm4gMEw7Ci19Ci1zdGF0aWMgaW50IHZmZV9zdGF0c19hd2JfYnVmX2luaXQoCi0Jc3RydWN0IHZmZTQwX2N0cmxfdHlwZSAqdmZlNDBfY3RybCwKLQlzdHJ1Y3QgdmZlX2NtZF9zdGF0c19idWYgKmluKQotewotCXVpbnQzMl90IGFkZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlNDBfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JYWRkciA9ICh1aW50MzJfdCl2ZmU0MF9zdGF0c19kcWJ1Zih2ZmU0MF9jdHJsLCBNU01fU1RBVFNfVFlQRV9BV0IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBhd2IgcGluZyBidWYgZnJvbSBmcmVlIGJ1ZiBxdWV1ZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1NUQVRTX0FXQl9XUl9QSU5HX0FERFIpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlhZGRyID0gKHVpbnQzMl90KXZmZTQwX3N0YXRzX2RxYnVmKHZmZTQwX2N0cmwsIE1TTV9TVEFUU19UWVBFX0FXQik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlNDBfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhZGRyKSB7Ci0JCXByX2VycigiJXM6IGRxIGF3YiBwaW5nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1NUQVRTX0FXQl9XUl9QT05HX0FERFIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdWludDMyX3QgdmZlX3N0YXRzX2JlX2J1Zl9pbml0KAotCXN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JdWludDMyX3QgYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IHN0YXRzX3R5cGU7Ci0KLQlzdGF0c190eXBlID0gTVNNX1NUQVRTX1RZUEVfQkU7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlNDBfc3RhdHNfZHFidWYodmZlNDBfY3RybCwgc3RhdHNfdHlwZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlNDBfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhZGRyKSB7Ci0JCXByX2VycigiJXM6IGRxIEJFIHBpbmcgYnVmIGZyb20gZnJlZSBidWYgcXVldWVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltc21fY2FtZXJhX2lvX3coYWRkciwKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9CVVNfU1RBVFNfQkVfV1JfUElOR19BRERSKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlNDBfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JYWRkciA9ICh1aW50MzJfdCl2ZmU0MF9zdGF0c19kcWJ1Zih2ZmU0MF9jdHJsLCBzdGF0c190eXBlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWFkZHIpIHsKLQkJcHJfZXJyKCIlczogZHEgQkUgcG9uZyBidWYgZnJvbSBmcmVlIGJ1ZiBxdWV1ZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1zbV9jYW1lcmFfaW9fdyhhZGRyLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJVkZFX0JVU19TVEFUU19CRV9XUl9QT05HX0FERFIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdWludDMyX3QgdmZlX3N0YXRzX2JnX2J1Zl9pbml0KAotCXN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JdWludDMyX3QgYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IHN0YXRzX3R5cGU7Ci0KLQlzdGF0c190eXBlID0gTVNNX1NUQVRTX1RZUEVfQkc7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlNDBfc3RhdHNfZHFidWYodmZlNDBfY3RybCwgc3RhdHNfdHlwZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlNDBfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhZGRyKSB7Ci0JCXByX2VycigiJXM6IGRxIGFlYy9CZyBwaW5nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1NUQVRTX0JHX1dSX1BJTkdfQUREUik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlNDBfc3RhdHNfZHFidWYodmZlNDBfY3RybCwgc3RhdHNfdHlwZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlNDBfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhZGRyKSB7Ci0JCXByX2VycigiJXM6IGRxIGFlYy9CZyBwb25nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1NUQVRTX0JHX1dSX1BPTkdfQUREUik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlX3N0YXRzX2JmX2J1Zl9pbml0KAotCXN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JdWludDMyX3QgYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByYyA9IDA7Ci0KLQl1aW50MzJfdCBzdGF0c190eXBlOwotCXN0YXRzX3R5cGUgPSBNU01fU1RBVFNfVFlQRV9CRjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlyYyA9IHZmZTQwX3N0YXRzX2ZsdXNoX2VucXVldWUodmZlNDBfY3RybCwgc3RhdHNfdHlwZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBkcSBzdGF0cyBidWYgZXJyID0gJWQiLAotCQkJICAgX19mdW5jX18sIHJjKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlNDBfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhZGRyID0gKHVpbnQzMl90KXZmZTQwX3N0YXRzX2RxYnVmKHZmZTQwX2N0cmwsIHN0YXRzX3R5cGUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBhZiBwaW5nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1NUQVRTX0JGX1dSX1BJTkdfQUREUik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlNDBfc3RhdHNfZHFidWYodmZlNDBfY3RybCwgc3RhdHNfdHlwZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlNDBfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhZGRyKSB7Ci0JCXByX2VycigiJXM6IGRxIGFmIHBvbmcgYnVmIGZyb20gZnJlZSBidWYgcXVldWUiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltc21fY2FtZXJhX2lvX3coYWRkciwKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9CVVNfU1RBVFNfQkZfV1JfUE9OR19BRERSKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVpbnQzMl90IHZmZV9zdGF0c19iaGlzdF9idWZfaW5pdCgKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsKQotewotCXVpbnQzMl90IGFkZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlNDBfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JYWRkciA9ICh1aW50MzJfdCl2ZmU0MF9zdGF0c19kcWJ1Zih2ZmU0MF9jdHJsLCBNU01fU1RBVFNfVFlQRV9CSElTVCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlNDBfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhZGRyKSB7Ci0JCXByX2VycigiJXM6IGRxIGloaXN0IHBpbmcgYnVmIGZyb20gZnJlZSBidWYgcXVldWUiLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1NUQVRTX1NLSU5fV1JfUElOR19BRERSKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlNDBfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JYWRkciA9ICh1aW50MzJfdCl2ZmU0MF9zdGF0c19kcWJ1Zih2ZmU0MF9jdHJsLCBNU01fU1RBVFNfVFlQRV9CSElTVCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlNDBfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFhZGRyKSB7Ci0JCXByX2VycigiJXM6IGRxIGloaXN0IHBvbmcgYnVmIGZyb20gZnJlZSBidWYgcXVldWUiLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1NUQVRTX1NLSU5fV1JfUE9OR19BRERSKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZmZV9zdGF0c19paGlzdF9idWZfaW5pdCgKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsKQotewotCXVpbnQzMl90IGFkZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlhZGRyID0gKHVpbnQzMl90KXZmZTQwX3N0YXRzX2RxYnVmKHZmZTQwX2N0cmwsIE1TTV9TVEFUU19UWVBFX0lISVNUKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWFkZHIpIHsKLQkJcHJfZXJyKCIlczogZHEgaWhpc3QgcGluZyBidWYgZnJvbSBmcmVlIGJ1ZiBxdWV1ZSIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltc21fY2FtZXJhX2lvX3coYWRkciwKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9CVVNfU1RBVFNfSElTVF9XUl9QSU5HX0FERFIpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlhZGRyID0gKHVpbnQzMl90KXZmZTQwX3N0YXRzX2RxYnVmKHZmZTQwX2N0cmwsIE1TTV9TVEFUU19UWVBFX0lISVNUKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWFkZHIpIHsKLQkJcHJfZXJyKCIlczogZHEgSWhpc3QgcG9uZyBidWYgZnJvbSBmcmVlIGJ1ZiBxdWV1ZSIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltc21fY2FtZXJhX2lvX3coYWRkciwKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9CVVNfU1RBVFNfSElTVF9XUl9QT05HX0FERFIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlX3N0YXRzX3JzX2J1Zl9pbml0KAotCXN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JdWludDMyX3QgYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlNDBfc3RhdHNfZHFidWYodmZlNDBfY3RybCwgTVNNX1NUQVRTX1RZUEVfUlMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBycyBwaW5nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1NUQVRTX1JTX1dSX1BJTkdfQUREUik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlNDBfc3RhdHNfZHFidWYodmZlNDBfY3RybCwgTVNNX1NUQVRTX1RZUEVfUlMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBkcSBycyBwb25nIGJ1ZiBmcm9tIGZyZWUgYnVmIHF1ZXVlIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193KGFkZHIsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfQlVTX1NUQVRTX1JTX1dSX1BPTkdfQUREUik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlX3N0YXRzX2NzX2J1Zl9pbml0KAotCXN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JdWludDMyX3QgYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlhZGRyID0gKHVpbnQzMl90KXZmZTQwX3N0YXRzX2RxYnVmKHZmZTQwX2N0cmwsIE1TTV9TVEFUU19UWVBFX0NTKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWFkZHIpIHsKLQkJcHJfZXJyKCIlczogZHEgY3MgcGluZyBidWYgZnJvbSBmcmVlIGJ1ZiBxdWV1ZSIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1zbV9jYW1lcmFfaW9fdyhhZGRyLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJVkZFX0JVU19TVEFUU19DU19XUl9QSU5HX0FERFIpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlhZGRyID0gKHVpbnQzMl90KXZmZTQwX3N0YXRzX2RxYnVmKHZmZTQwX2N0cmwsIE1TTV9TVEFUU19UWVBFX0NTKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWFkZHIpIHsKLQkJcHJfZXJyKCIlczogZHEgY3MgcG9uZyBidWYgZnJvbSBmcmVlIGJ1ZiBxdWV1ZSIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1zbV9jYW1lcmFfaW9fdyhhZGRyLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJVkZFX0JVU19TVEFUU19DU19XUl9QT05HX0FERFIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB2ZmU0MF9jZmdfcW9zX3Bhcm1zKHN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0Jdm9pZCBfX2lvbWVtICp2ZmViYXNlID0gdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZTsKLQltc21fY2FtZXJhX2lvX3coMHhBQUFBQUFBQSwgdmZlYmFzZSArIFZGRV8wX0JVU19CREdfUU9TX0NGR18wKTsKLQltc21fY2FtZXJhX2lvX3coMHhBQUFBQUFBQSwgdmZlYmFzZSArIFZGRV8wX0JVU19CREdfUU9TX0NGR18xKTsKLQltc21fY2FtZXJhX2lvX3coMHhBQUFBQUFBQSwgdmZlYmFzZSArIFZGRV8wX0JVU19CREdfUU9TX0NGR18yKTsKLQltc21fY2FtZXJhX2lvX3coMHhBQUFBQUFBQSwgdmZlYmFzZSArIFZGRV8wX0JVU19CREdfUU9TX0NGR18zKTsKLQltc21fY2FtZXJhX2lvX3coMHhBQUFBQUFBQSwgdmZlYmFzZSArIFZGRV8wX0JVU19CREdfUU9TX0NGR180KTsKLQltc21fY2FtZXJhX2lvX3coMHhBQUFBQUFBQSwgdmZlYmFzZSArIFZGRV8wX0JVU19CREdfUU9TX0NGR181KTsKLQltc21fY2FtZXJhX2lvX3coMHhBQUFBQUFBQSwgdmZlYmFzZSArIFZGRV8wX0JVU19CREdfUU9TX0NGR182KTsKLQltc21fY2FtZXJhX2lvX3coMHgwMDAyQUFBQSwgdmZlYmFzZSArIFZGRV8wX0JVU19CREdfUU9TX0NGR183KTsKLX0KLQotc3RhdGljIHZvaWQgdmZlNDBfc3RhcnRfY29tbW9uKHN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JdWludDE2X3QgdmZlX29wZXJhdGlvbl9tb2RlID0KLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYgfihWRkVfT1VUUFVUU19SREkwfAotCQkJVkZFX09VVFBVVFNfUkRJMSk7Ci0JQ0RCRygiVkZFIG9wZXJ0YWlvbiBtb2RlID0gMHgleCwgb3V0cHV0IG1vZGUgPSAweCV4XG4iLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUpOwotCi0JdmZlNDBfY2ZnX3Fvc19wYXJtcyh2ZmU0MF9jdHJsKTsKLQotCW1zbV9jYW1lcmFfaW9fd19tYigweDEsCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9SRUdfVVBEQVRFX0NNRCk7Ci0KLQltc21fY2FtZXJhX2lvX3dfbWIoMHgwMDAwM2ZmZiwKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVjQwX0FYSV9CVVNfQ01EX09GRik7Ci0JbXNtX2NhbWVyYV9pb193X21iKDEsCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVY0MF9CVVNfUE1fQ01EKTsKLQlpZiAodmZlX29wZXJhdGlvbl9tb2RlKSB7Ci0JCW1zbV9jYW1lcmFfaW9fd19tYigxLCB2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9DQU1JRl9DT01NQU5EKTsKLQl9Ci0KLX0KLQotc3RhdGljIGludCB2ZmU0MF9zdGFydF9yZWNvcmRpbmcoCi0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwsCi0Jc3RydWN0IHZmZTQwX2N0cmxfdHlwZSAqdmZlNDBfY3RybCkKLXsKLQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT5yZWNvcmRpbmdfc3RhdGUgPSBWRkVfU1RBVEVfU1RBUlRfUkVRVUVTVEVEOwotCW1zbV9jYW1lcmFfaW9fd19tYigxLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX1JFR19VUERBVEVfQ01EKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZmU0MF9zdG9wX3JlY29yZGluZygKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsKQotewotCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnJlY29yZGluZ19zdGF0ZSA9IFZGRV9TVEFURV9TVE9QX1JFUVVFU1RFRDsKLQltc21fY2FtZXJhX2lvX3dfbWIoMSwKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9SRUdfVVBEQVRFX0NNRCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTQwX3N0YXJ0X2xpdmVzaG90KAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JLyogSGFyZGNvZGUgMSBsaXZlIHNuYXBzaG90IGZvciBub3cuICovCi0JdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNhcHR1cmVfY250ID0gMTsKLQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudCA9Ci0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jYXB0dXJlX2NudDsKLQotCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPmxpdmVzaG90X3N0YXRlID0gVkZFX1NUQVRFX1NUQVJUX1JFUVVFU1RFRDsKLQltc21fY2FtZXJhX2lvX3dfbWIoMSwgdmZlNDBfY3RybC0+Ci0JCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkVHX1VQREFURV9DTUQpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmU0MF9zdG9wX2xpdmVzaG90KAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPSBWRkVfU1RBVEVfU1RPUF9SRVFVRVNURUQ7Ci0JbXNtX2NhbWVyYV9pb193X21iKDEsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkVHX1VQREFURV9DTUQpOwotfQotCi1zdGF0aWMgaW50IHZmZTQwX3pzbCgKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsKQotewotCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnN0YXJ0X2Fja19wZW5kaW5nID0gVFJVRTsKLQl2ZmU0MF9zdGFydF9jb21tb24odmZlNDBfY3RybCk7Ci0KLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbnQgdmZlNDBfY2FwdHVyZV9yYXcoCi0Jc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwsCi0Jc3RydWN0IHZmZTQwX2N0cmxfdHlwZSAqdmZlNDBfY3RybCwKLQl1aW50MzJfdCBudW1fZnJhbWVzX2NhcHR1cmUpCi17Ci0JdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNhcHR1cmVfY250ID0gbnVtX2ZyYW1lc19jYXB0dXJlOwotCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZV9jYXB0dXJlX2NvdW50ID0gbnVtX2ZyYW1lc19jYXB0dXJlOwotCXZmZTQwX3N0YXJ0X2NvbW1vbih2ZmU0MF9jdHJsKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZmU0MF9jYXB0dXJlKAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXVpbnQzMl90IG51bV9mcmFtZXNfY2FwdHVyZSwKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsKQotewotCS8qIGNhcHR1cmUgY29tbWFuZCBpcyB2YWxpZCBmb3IgYm90aCBpZGxlIGFuZCBhY3RpdmUgc3RhdGUuICovCi0JdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNhcHR1cmVfY250ID0gbnVtX2ZyYW1lc19jYXB0dXJlOwotCWlmICh2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgPT0KLQkJCVZGRV9PVVRQVVRTX01BSU5fQU5EX1RIVU1CIHx8Ci0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSA9PQotCQkJVkZFX09VVFBVVFNfVEhVTUJfQU5EX01BSU4gfHwKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlID09Ci0JCQlWRkVfT1VUUFVUU19KUEVHX0FORF9USFVNQiB8fAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgPT0KLQkJCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9KUEVHKSB7Ci0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jYXB0dXJlX2NudCA9Ci0JCQludW1fZnJhbWVzX2NhcHR1cmU7Ci0JfQotCi0JdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlX2NhcHR1cmVfY291bnQgPSBudW1fZnJhbWVzX2NhcHR1cmU7Ci0KLQotCXZmZTQwX3N0YXJ0X2NvbW1vbih2ZmU0MF9jdHJsKTsKLQkvKiBmb3IgZGVidWcgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZmU0MF9zdGFydCgKLQlzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsKQotewotCXZmZTQwX3N0YXJ0X2NvbW1vbih2ZmU0MF9jdHJsKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdmZlNDBfdXBkYXRlKHN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50MzJfdCB2YWx1ZSA9IDA7Ci0JaWYgKHZmZTQwX2N0cmwtPnVwZGF0ZV9saW5lYXIpIHsKLQkJaWYgKCFtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVY0MF9MSU5FQVJJWkFUSU9OX09GRjEpKQotCQkJbXNtX2NhbWVyYV9pb193KDEsCi0JCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVjQwX0xJTkVBUklaQVRJT05fT0ZGMSk7Ci0JCWVsc2UKLQkJCW1zbV9jYW1lcmFfaW9fdygwLAotCQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCVY0MF9MSU5FQVJJWkFUSU9OX09GRjEpOwotCQl2ZmU0MF9jdHJsLT51cGRhdGVfbGluZWFyID0gZmFsc2U7Ci0JfQotCi0JaWYgKHZmZTQwX2N0cmwtPnVwZGF0ZV9sYSkgewotCQlpZiAoIW1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWNDBfTEFfT0ZGKSkKLQkJCW1zbV9jYW1lcmFfaW9fdygxLAotCQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWNDBfTEFfT0ZGKTsKLQkJZWxzZQotCQkJbXNtX2NhbWVyYV9pb193KDAsCi0JCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFY0MF9MQV9PRkYpOwotCQl2ZmU0MF9jdHJsLT51cGRhdGVfbGEgPSBmYWxzZTsKLQl9Ci0KLQlpZiAodmZlNDBfY3RybC0+dXBkYXRlX2dhbW1hKSB7Ci0JCXZhbHVlID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFY0MF9SR0JfR19PRkYpOwotCQl2YWx1ZSBePSBWNDBfR0FNTUFfTFVUX0JBTktfU0VMX01BU0s7Ci0JCW1zbV9jYW1lcmFfaW9fdyh2YWx1ZSwKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWNDBfUkdCX0dfT0ZGKTsKLQkJdmZlNDBfY3RybC0+dXBkYXRlX2dhbW1hID0gZmFsc2U7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnVwZGF0ZV9hY2tfbG9jaywgZmxhZ3MpOwotCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnVwZGF0ZV9hY2tfcGVuZGluZyA9IFRSVUU7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dXBkYXRlX2Fja19sb2NrLCBmbGFncyk7Ci0JLyogRW5zdXJlIHRoZSB3cml0ZSBvcmRlciB3aGlsZSB3cml0aW5nCi0JdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdXNpbmcgdGhlIGJhcnJpZXIgKi8KLQltc21fY2FtZXJhX2lvX3dfbWIoMSwKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9SRUdfVVBEQVRFX0NNRCk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCB2ZmU0MF9zeW5jX3RpbWVyX3N0b3Aoc3RydWN0IHZmZTQwX2N0cmxfdHlwZSAqdmZlNDBfY3RybCkKLXsKLQl1aW50MzJfdCB2YWx1ZSA9IDA7Ci0JdmZlNDBfY3RybC0+c3luY190aW1lcl9zdGF0ZSA9IDA7Ci0JaWYgKHZmZTQwX2N0cmwtPnN5bmNfdGltZXJfbnVtYmVyID09IDApCi0JCXZhbHVlID0gMHgxMDAwMDsKLQllbHNlIGlmICh2ZmU0MF9jdHJsLT5zeW5jX3RpbWVyX251bWJlciA9PSAxKQotCQl2YWx1ZSA9IDB4MjAwMDA7Ci0JZWxzZSBpZiAodmZlNDBfY3RybC0+c3luY190aW1lcl9udW1iZXIgPT0gMikKLQkJdmFsdWUgPSAweDQwMDAwOwotCi0JLyogVGltZXIgU3RvcCAqLwotCW1zbV9jYW1lcmFfaW9fdyh2YWx1ZSwKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFY0MF9TWU5DX1RJTUVSX09GRik7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTQwX3N5bmNfdGltZXJfc3RhcnQoCi0JY29uc3QgdWludDMyX3QgKnRibCwKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsKQotewotCS8qIHNldCBiaXQgOCBmb3IgYXV0byBpbmNyZW1lbnQuICovCi0JdWludDMyX3QgdmFsdWUgPSAxOwotCXVpbnQzMl90IHZhbDsKLQotCXZmZTQwX2N0cmwtPnN5bmNfdGltZXJfc3RhdGUgPSAqdGJsKys7Ci0JdmZlNDBfY3RybC0+c3luY190aW1lcl9yZXBlYXRfY291bnQgPSAqdGJsKys7Ci0JdmZlNDBfY3RybC0+c3luY190aW1lcl9udW1iZXIgPSAqdGJsKys7Ci0JQ0RCRygiJXMgdGltZXJfc3RhdGUgJWQsIHJlcGVhdF9jbnQgJWQgdGltZXIgbnVtYmVyICVkXG4iLAotCQkgX19mdW5jX18sIHZmZTQwX2N0cmwtPnN5bmNfdGltZXJfc3RhdGUsCi0JCSB2ZmU0MF9jdHJsLT5zeW5jX3RpbWVyX3JlcGVhdF9jb3VudCwKLQkJIHZmZTQwX2N0cmwtPnN5bmNfdGltZXJfbnVtYmVyKTsKLQotCWlmICh2ZmU0MF9jdHJsLT5zeW5jX3RpbWVyX3N0YXRlKSB7IC8qIFN0YXJ0IFRpbWVyICovCi0JCXZhbHVlID0gdmFsdWUgPDwgdmZlNDBfY3RybC0+c3luY190aW1lcl9udW1iZXI7Ci0JfSBlbHNlIHsgLyogU3RvcCBUaW1lciAqLwotCQlDREJHKCJGYWlsZWQgdG8gU3RhcnQgdGltZXJcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogVGltZXIgU3RhcnQgKi8KLQltc21fY2FtZXJhX2lvX3codmFsdWUsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWNDBfU1lOQ19USU1FUl9PRkYpOwotCS8qIFN5bmMgVGltZXIgTGluZSBTdGFydCAqLwotCXZhbHVlID0gKnRibCsrOwotCW1zbV9jYW1lcmFfaW9fdyh2YWx1ZSwKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFY0MF9TWU5DX1RJTUVSX09GRiArCi0JCTQgKyAoKHZmZTQwX2N0cmwtPnN5bmNfdGltZXJfbnVtYmVyKSAqIDEyKSk7Ci0JLyogU3luYyBUaW1lciBQaXhlbCBTdGFydCAqLwotCXZhbHVlID0gKnRibCsrOwotCW1zbV9jYW1lcmFfaW9fdyh2YWx1ZSwKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWNDBfU1lOQ19USU1FUl9PRkYgKwotCQkJIDggKyAoKHZmZTQwX2N0cmwtPnN5bmNfdGltZXJfbnVtYmVyKSAqIDEyKSk7Ci0JLyogU3luYyBUaW1lciBQaXhlbCBEdXJhdGlvbiAqLwotCXZhbHVlID0gKnRibCsrOwotCXZhbCA9IHZmZV9jbGtfcmF0ZSAvIDEwMDAwOwotCXZhbCA9IDEwMDAwMDAwIC8gdmFsOwotCXZhbCA9IHZhbHVlICogMTAwMDAgLyB2YWw7Ci0JQ0RCRygiJXM6IFBpeGVsIENsayBDeWNsZXMhISEgJWRcbiIsIF9fZnVuY19fLCB2YWwpOwotCW1zbV9jYW1lcmFfaW9fdyh2YWwsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWNDBfU1lOQ19USU1FUl9PRkYgKwotCQkxMiArICgodmZlNDBfY3RybC0+c3luY190aW1lcl9udW1iZXIpICogMTIpKTsKLQkvKiBUaW1lcjAgQWN0aXZlIEhpZ2gvTE9XICovCi0JdmFsdWUgPSAqdGJsKys7Ci0JbXNtX2NhbWVyYV9pb193KHZhbHVlLAotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjQwX1NZTkNfVElNRVJfUE9MQVJJVFlfT0ZGKTsKLQkvKiBTZWxlY3RzIHN5bmMgdGltZXIgMCBvdXRwdXQgdG8gZHJpdmUgb250byB0aW1lcjEgcG9ydCAqLwotCXZhbHVlID0gMDsKLQltc21fY2FtZXJhX2lvX3codmFsdWUsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWNDBfVElNRVJfU0VMRUNUX09GRik7Ci19Ci0KLQotc3RhdGljIHZvaWQgdmZlNDBfd3JpdGVfZ2FtbWFfY2ZnKAotCWVudW0gVkZFNDBfRE1JX1JBTV9TRUwgY2hhbm5lbF9zZWwsCi0JY29uc3QgdWludDMyX3QgKnRibCwKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsKQotewotCWludCBpOwotCXVpbnQzMl90IHZhbHVlLCB2YWx1ZTEsIHZhbHVlMjsKLQl2ZmU0MF9wcm9ncmFtX2RtaV9jZmcoY2hhbm5lbF9zZWwsIHZmZTQwX2N0cmwpOwotCWZvciAoaSA9IDAgOyBpIDwgKFZGRTQwX0dBTU1BX05VTV9FTlRSSUVTLzIpIDsgaSsrKSB7Ci0JCXZhbHVlID0gKnRibCsrOwotCQl2YWx1ZTEgPSB2YWx1ZSAmIDB4MDAwMEZGRkY7Ci0JCXZhbHVlMiA9ICh2YWx1ZSAmIDB4RkZGRjAwMDApPj4xNjsKLQkJbXNtX2NhbWVyYV9pb193KCh2YWx1ZTEpLAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfREFUQV9MTyk7Ci0JCW1zbV9jYW1lcmFfaW9fdygodmFsdWUyKSwKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0RBVEFfTE8pOwotCX0KLQl2ZmU0MF9wcm9ncmFtX2RtaV9jZmcoTk9fTUVNX1NFTEVDVEVELCB2ZmU0MF9jdHJsKTsKLX0KLQotc3RhdGljIHZvaWQgdmZlNDBfcmVhZF9nYW1tYV9jZmcoCi0JZW51bSBWRkU0MF9ETUlfUkFNX1NFTCBjaGFubmVsX3NlbCwKLQl1aW50MzJfdCAqdGJsLAotCXN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JaW50IGk7Ci0JdmZlNDBfcHJvZ3JhbV9kbWlfY2ZnKGNoYW5uZWxfc2VsLCB2ZmU0MF9jdHJsKTsKLQlDREJHKCIlczogR2FtbWEgdGFibGUgY2hhbm5lbDogJWRcbiIsIF9fZnVuY19fLCBjaGFubmVsX3NlbCk7Ci0JZm9yIChpID0gMCA7IGkgPCBWRkU0MF9HQU1NQV9OVU1fRU5UUklFUyA7IGkrKykgewotCQkqdGJsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfREFUQV9MTyk7Ci0JCUNEQkcoIiVzOiAlMDh4XG4iLCBfX2Z1bmNfXywgKnRibCk7Ci0JCXRibCsrOwotCX0KLQl2ZmU0MF9wcm9ncmFtX2RtaV9jZmcoTk9fTUVNX1NFTEVDVEVELCB2ZmU0MF9jdHJsKTsKLX0KLQotc3RhdGljIHZvaWQgdmZlNDBfd3JpdGVfbGFfY2ZnKAotCWVudW0gVkZFNDBfRE1JX1JBTV9TRUwgY2hhbm5lbF9zZWwsCi0JY29uc3QgdWludDMyX3QgKnRibCwKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsKQotewotCXVpbnQzMl90IGk7Ci0JdWludDMyX3QgdmFsdWUsIHZhbHVlMSwgdmFsdWUyOwotCi0JdmZlNDBfcHJvZ3JhbV9kbWlfY2ZnKGNoYW5uZWxfc2VsLCB2ZmU0MF9jdHJsKTsKLQlmb3IgKGkgPSAwIDsgaSA8IChWRkU0MF9MQV9UQUJMRV9MRU5HVEgvMikgOyBpKyspIHsKLQkJdmFsdWUgPSAqdGJsKys7Ci0JCXZhbHVlMSA9IHZhbHVlICYgMHgwMDAwRkZGRjsKLQkJdmFsdWUyID0gKHZhbHVlICYgMHhGRkZGMDAwMCk+PjE2OwotCQltc21fY2FtZXJhX2lvX3coKHZhbHVlMSksCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0RNSV9EQVRBX0xPKTsKLQkJbXNtX2NhbWVyYV9pb193KCh2YWx1ZTIpLAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfREFUQV9MTyk7Ci0JfQotCXZmZTQwX3Byb2dyYW1fZG1pX2NmZyhOT19NRU1fU0VMRUNURUQsIHZmZTQwX2N0cmwpOwotfQotCi1zdGF0aWMgc3RydWN0IHZmZTQwX291dHB1dF9jaCAqdmZlNDBfZ2V0X2NoKAotCWludCBwYXRoLCBzdHJ1Y3QgdmZlX3NoYXJlX2N0cmxfdCAqc2hhcmVfY3RybCkKLXsKLQlzdHJ1Y3QgdmZlNDBfb3V0cHV0X2NoICpjaCA9IE5VTEw7Ci0KLQlpZiAocGF0aCA9PSBWRkVfTVNHX09VVFBVVF9QUklNQVJZKQotCQljaCA9ICZzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDA7Ci0JZWxzZSBpZiAocGF0aCA9PSBWRkVfTVNHX09VVFBVVF9TRUNPTkRBUlkpCi0JCWNoID0gJnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MTsKLQllbHNlIGlmIChwYXRoID09IFZGRV9NU0dfT1VUUFVUX1RFUlRJQVJZMSkKLQkJY2ggPSAmc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyOwotCWVsc2UgaWYgKHBhdGggPT0gVkZFX01TR19PVVRQVVRfVEVSVElBUlkyKQotCQljaCA9ICZzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDM7Ci0JZWxzZQotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhdGggJWRcbiIsIF9fZnVuY19fLAotCQkJcGF0aCk7Ci0KLQlCVUdfT04oY2ggPT0gTlVMTCk7Ci0JcmV0dXJuIGNoOwotfQotc3RhdGljIHN0cnVjdCBtc21fZnJlZV9idWYgKnZmZTQwX2NoZWNrX2ZyZWVfYnVmZmVyKAotCWludCBpZCwgaW50IHBhdGgsIHN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCkKLXsKLQlzdHJ1Y3QgdmZlNDBfb3V0cHV0X2NoICpvdXRjaCA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9mcmVlX2J1ZiAqYiA9IE5VTEw7Ci0JdWludDMyX3QgaW5zdF9oYW5kbGUgPSAwOwotCi0JaWYgKHBhdGggPT0gVkZFX01TR19PVVRQVVRfUFJJTUFSWSkKLQkJaW5zdF9oYW5kbGUgPSBheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmluc3RfaGFuZGxlOwotCWVsc2UgaWYgKHBhdGggPT0gVkZFX01TR19PVVRQVVRfU0VDT05EQVJZKQotCQlpbnN0X2hhbmRsZSA9IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuaW5zdF9oYW5kbGU7Ci0JZWxzZSBpZiAocGF0aCA9PSBWRkVfTVNHX09VVFBVVF9URVJUSUFSWTEpCi0JCWluc3RfaGFuZGxlID0gYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5pbnN0X2hhbmRsZTsKLQllbHNlIGlmIChwYXRoID09IFZGRV9NU0dfT1VUUFVUX1RFUlRJQVJZMikKLQkJaW5zdF9oYW5kbGUgPSBheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQzLmluc3RfaGFuZGxlOwotCi0JdmZlNDBfc3ViZGV2X25vdGlmeShpZCwgcGF0aCwgaW5zdF9oYW5kbGUsCi0JCSZheGlfY3RybC0+c3ViZGV2LCBheGlfY3RybC0+c2hhcmVfY3RybCk7Ci0Jb3V0Y2ggPSB2ZmU0MF9nZXRfY2gocGF0aCwgYXhpX2N0cmwtPnNoYXJlX2N0cmwpOwotCWlmIChvdXRjaC0+ZnJlZV9idWYuY2hfcGFkZHJbMF0pCi0JCWIgPSAmb3V0Y2gtPmZyZWVfYnVmOwotCXJldHVybiBiOwotfQotc3RhdGljIGludCBjb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycygKLQlpbnQgaWQsIGludCBwYXRoLCBzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwpCi17Ci0Jc3RydWN0IHZmZTQwX291dHB1dF9jaCAqb3V0Y2ggPSBOVUxMOwotCWludCByYyA9IDA7Ci0JdWludDMyX3QgaW5zdF9oYW5kbGUgPSAwOwotCWlmIChwYXRoID09IFZGRV9NU0dfT1VUUFVUX1BSSU1BUlkpCi0JCWluc3RfaGFuZGxlID0gYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5pbnN0X2hhbmRsZTsKLQllbHNlIGlmIChwYXRoID09IFZGRV9NU0dfT1VUUFVUX1NFQ09OREFSWSkKLQkJaW5zdF9oYW5kbGUgPSBheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmluc3RfaGFuZGxlOwotCWVsc2UgaWYgKHBhdGggPT0gVkZFX01TR19PVVRQVVRfVEVSVElBUlkxKQotCQlpbnN0X2hhbmRsZSA9IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDIuaW5zdF9oYW5kbGU7Ci0JZWxzZSBpZiAocGF0aCA9PSBWRkVfTVNHX09VVFBVVF9URVJUSUFSWTIpCi0JCWluc3RfaGFuZGxlID0gYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0My5pbnN0X2hhbmRsZTsKLQotCXZmZTQwX3N1YmRldl9ub3RpZnkoaWQsIHBhdGgsIGluc3RfaGFuZGxlLAotCQkmYXhpX2N0cmwtPnN1YmRldiwgYXhpX2N0cmwtPnNoYXJlX2N0cmwpOwotCW91dGNoID0gdmZlNDBfZ2V0X2NoKHBhdGgsIGF4aV9jdHJsLT5zaGFyZV9jdHJsKTsKLQlpZiAob3V0Y2gtPnBpbmcuY2hfcGFkZHJbMF0gJiYgb3V0Y2gtPnBvbmcuY2hfcGFkZHJbMF0pIHsKLQkJLyogQ29uZmlndXJlIFByZXZpZXcgUGluZyBQb25nICovCi0JCXByX2luZm8oIiVzIENvbmZpZ3VyZSBwaW5nL3BvbmcgYWRkcmVzcyBmb3IgJWRcbiIsCi0JCQkJCQlfX2Z1bmNfXywgcGF0aCk7Ci0JCXZmZTQwX3B1dF9jaF9waW5nX2FkZHIoCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwgb3V0Y2gtPmNoMCwKLQkJCW91dGNoLT5waW5nLmNoX3BhZGRyWzBdKTsKLQkJdmZlNDBfcHV0X2NoX3BvbmdfYWRkcigKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLCBvdXRjaC0+Y2gwLAotCQkJb3V0Y2gtPnBvbmcuY2hfcGFkZHJbMF0pOwotCi0JCWlmICgoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAhPQotCQkJVkZFX09VVFBVVFNfUkFXKSAmJiAocGF0aCAhPSBWRkVfTVNHX09VVFBVVF9URVJUSUFSWTEpCi0JCQkmJiAocGF0aCAhPSBWRkVfTVNHX09VVFBVVF9URVJUSUFSWTIpKSB7Ci0JCQl2ZmU0MF9wdXRfY2hfcGluZ19hZGRyKAotCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLCBvdXRjaC0+Y2gxLAotCQkJCW91dGNoLT5waW5nLmNoX3BhZGRyWzFdKTsKLQkJCXZmZTQwX3B1dF9jaF9wb25nX2FkZHIoCi0JCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsIG91dGNoLT5jaDEsCi0JCQkJb3V0Y2gtPnBvbmcuY2hfcGFkZHJbMV0pOwotCQl9Ci0KLQkJaWYgKG91dGNoLT5waW5nLm51bV9wbGFuZXMgPiAyKQotCQkJdmZlNDBfcHV0X2NoX3BpbmdfYWRkcigKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwgb3V0Y2gtPmNoMiwKLQkJCQlvdXRjaC0+cGluZy5jaF9wYWRkclsyXSk7Ci0JCWlmIChvdXRjaC0+cG9uZy5udW1fcGxhbmVzID4gMikKLQkJCXZmZTQwX3B1dF9jaF9wb25nX2FkZHIoCi0JCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsIG91dGNoLT5jaDIsCi0JCQkJb3V0Y2gtPnBvbmcuY2hfcGFkZHJbMl0pOwotCi0JCS8qIGF2b2lkIHN0YWxlIGluZm8gKi8KLQkJbWVtc2V0KCZvdXRjaC0+cGluZywgMCwgc2l6ZW9mKHN0cnVjdCBtc21fZnJlZV9idWYpKTsKLQkJbWVtc2V0KCZvdXRjaC0+cG9uZywgMCwgc2l6ZW9mKHN0cnVjdCBtc21fZnJlZV9idWYpKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzIHBpbmcvcG9uZyBhZGRyIGlzIG51bGwhISIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTQwX3dyaXRlX2xpbmVhcl9jZmcoCi0JZW51bSBWRkU0MF9ETUlfUkFNX1NFTCBjaGFubmVsX3NlbCwKLQljb25zdCB1aW50MzJfdCAqdGJsLCBzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsKQotewotCXVpbnQzMl90IGk7Ci0KLQl2ZmU0MF9wcm9ncmFtX2RtaV9jZmcoY2hhbm5lbF9zZWwsIHZmZTQwX2N0cmwpOwotCS8qIGZvciBsb29wIGZvciBjb25maWd1cmluZyBMVVQuICovCi0JZm9yIChpID0gMCA7IGkgPCBWRkU0MF9MSU5FQVJJWkFUT05fVEFCTEVfTEVOR1RIIDsgaSsrKSB7Ci0JCW1zbV9jYW1lcmFfaW9fdygqdGJsLAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfREFUQV9MTyk7Ci0JCXRibCsrOwotCX0KLQlDREJHKCJkb25lIHdyaXRpbmcgdG8gbGluZWFyaXphdGlvbiB0YWJsZVxuIik7Ci0JdmZlNDBfcHJvZ3JhbV9kbWlfY2ZnKE5PX01FTV9TRUxFQ1RFRCwgdmZlNDBfY3RybCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTQwX3NlbmRfaXNwX21zZygKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXVpbnQzMl90IHZmZUZyYW1lSWQsCi0JdWludDMyX3QgaXNwX21zZ19pZCkKLXsKLQlzdHJ1Y3QgaXNwX21zZ19ldmVudCBpc3BfbXNnX2V2dDsKLQotCWlzcF9tc2dfZXZ0Lm1zZ19pZCA9IGlzcF9tc2dfaWQ7Ci0JaXNwX21zZ19ldnQuc29mX2NvdW50ID0gdmZlRnJhbWVJZDsKLQl2NGwyX3N1YmRldl9ub3RpZnkoc2QsCi0JCQlOT1RJRllfSVNQX01TR19FVlQsCi0JCQkodm9pZCAqKSZpc3BfbXNnX2V2dCk7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlNDBfcHJvY19nZW5lcmFsKAotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsLAotCXN0cnVjdCBtc21faXNwX2NtZCAqY21kLAotCXN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JaW50IGkgLCByYyA9IDA7Ci0JdWludDMyX3Qgb2xkX3ZhbCA9IDAgLCBuZXdfdmFsID0gMCwgbW9kdWxlX3ZhbCA9IDA7Ci0JdWludDMyX3QgKmNtZHAgPSBOVUxMOwotCXVpbnQzMl90ICpjbWRwX2xvY2FsID0gTlVMTDsKLQl1aW50MzJfdCBzbmFwc2hvdF9jbnQgPSAwOwotCXVpbnQzMl90IHRlbXAxID0gMCwgdGVtcDIgPSAwOwotCXN0cnVjdCBtc21fY2FtZXJhX3ZmZV9wYXJhbXNfdCB2ZmVfcGFyYW1zOwotCi0JQ0RCRygidmZlNDBfcHJvY19nZW5lcmFsOiBjbWRJRCA9ICVzLCBsZW5ndGggPSAlZFxuIiwKLQkJdmZlNDBfZ2VuZXJhbF9jbWRbY21kLT5pZF0sIGNtZC0+bGVuZ3RoKTsKLQlzd2l0Y2ggKGNtZC0+aWQpIHsKLQljYXNlIFZGRV9DTURfUkVTRVQ6Ci0JCXByX2luZm8oInZmZTQwX3Byb2NfZ2VuZXJhbDogY21kSUQgPSAlc1xuIiwKLQkJCXZmZTQwX2dlbmVyYWxfY21kW2NtZC0+aWRdKTsKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlX3Jlc2V0X2ZsYWcgPSB0cnVlOwotCQl2ZmU0MF9yZXNldCh2ZmU0MF9jdHJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX1NUQVJUOgotCQlwcl9pbmZvKCJ2ZmU0MF9wcm9jX2dlbmVyYWw6IGNtZElEID0gJXNcbiIsCi0JCQl2ZmU0MF9nZW5lcmFsX2NtZFtjbWQtPmlkXSk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdmZlX3BhcmFtcywKLQkJCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fY2FtZXJhX3ZmZV9wYXJhbXNfdCkpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgPQotCQkJdmZlX3BhcmFtcy5vcGVyYXRpb25fbW9kZTsKLQotCQlyYyA9IHZmZTQwX3N0YXJ0KHBtY3RsLCB2ZmU0MF9jdHJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX1VQREFURToKLQkJdmZlNDBfdXBkYXRlKHZmZTQwX2N0cmwpOwotCQlicmVhazsKLQljYXNlIFZGRV9DTURfQ0FQVFVSRV9SQVc6Ci0JCXByX2luZm8oIiVzOiBjbWRJRCA9IFZGRV9DTURfQ0FQVFVSRV9SQVdcbiIsIF9fZnVuY19fKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZmVfcGFyYW1zLAotCQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9jYW1lcmFfdmZlX3BhcmFtc190KSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCi0JCXNuYXBzaG90X2NudCA9IHZmZV9wYXJhbXMuY2FwdHVyZV9jb3VudDsKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlID0KLQkJCXZmZV9wYXJhbXMub3BlcmF0aW9uX21vZGU7Ci0JCXJjID0gdmZlNDBfY2FwdHVyZV9yYXcocG1jdGwsIHZmZTQwX2N0cmwsIHNuYXBzaG90X2NudCk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9DQVBUVVJFOgotCQlwcl9pbmZvKCIlczogY21kSUQgPSBWRkVfQ01EX0NBUFRVUkVcbiIsIF9fZnVuY19fKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZmVfcGFyYW1zLAotCQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9jYW1lcmFfdmZlX3BhcmFtc190KSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCi0JCXNuYXBzaG90X2NudCA9IHZmZV9wYXJhbXMuY2FwdHVyZV9jb3VudDsKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlID0KLQkJCXZmZV9wYXJhbXMub3BlcmF0aW9uX21vZGU7Ci0KLQkJcmMgPSB2ZmU0MF9jYXB0dXJlKHBtY3RsLCBzbmFwc2hvdF9jbnQsIHZmZTQwX2N0cmwpOwotCQlicmVhazsKLQljYXNlIFZGRV9DTURfU1RBUlRfUkVDT1JESU5HOgotCQlwcl9pbmZvKCJ2ZmU0MF9wcm9jX2dlbmVyYWw6IGNtZElEID0gJXNcbiIsCi0JCQl2ZmU0MF9nZW5lcmFsX2NtZFtjbWQtPmlkXSk7Ci0JCXJjID0gdmZlNDBfc3RhcnRfcmVjb3JkaW5nKHBtY3RsLCB2ZmU0MF9jdHJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX1NUT1BfUkVDT1JESU5HOgotCQlwcl9pbmZvKCJ2ZmU0MF9wcm9jX2dlbmVyYWw6IGNtZElEID0gJXNcbiIsCi0JCQl2ZmU0MF9nZW5lcmFsX2NtZFtjbWQtPmlkXSk7Ci0JCXJjID0gdmZlNDBfc3RvcF9yZWNvcmRpbmcocG1jdGwsIHZmZTQwX2N0cmwpOwotCQlicmVhazsKLQljYXNlIFZGRV9DTURfT1BFUkFUSU9OX0NGRzogewotCQlpZiAoY21kLT5sZW5ndGggIT0gVjQwX09QRVJBVElPTl9DRkdfTEVOKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHAgPSBrbWFsbG9jKFY0MF9PUEVSQVRJT05fQ0ZHX0xFTiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJVjQwX09QRVJBVElPTl9DRkdfTEVOKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlyYyA9IHZmZTQwX29wZXJhdGlvbl9jb25maWcoY21kcCwgdmZlNDBfY3RybCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfU1RBVFNfQUVfU1RBUlQ6IHsKLQkJaWYgKHZmZTQwX3VzZV9iYXllcl9zdGF0cyh2ZmU0MF9jdHJsKSkgewotCQkJLyogRXJyb3IgKi8KLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJcmMgPSB2ZmVfc3RhdHNfYmdfYnVmX2luaXQodmZlNDBfY3RybCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGNhbm5vdCBjb25maWcgcGluZy9wb25nIGFkZHJlc3Mgb2YgQUVDIiwKLQkJCQkgX19mdW5jX18pOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJb2xkX3ZhbCB8PSBCR19FTkFCTEVfTUFTSzsKLQkJbXNtX2NhbWVyYV9pb193KG9sZF92YWwsCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlNDBfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHAsICh2ZmU0MF9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX1NUQVRTX0FGX1NUQVJUOiB7Ci0JCWlmICh2ZmU0MF91c2VfYmF5ZXJfc3RhdHModmZlNDBfY3RybCkpIHsKLQkJCS8qIEVycm9yICovCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCXJjID0gdmZlX3N0YXRzX2JmX2J1Zl9pbml0KHZmZTQwX2N0cmwpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBjYW5ub3QgY29uZmlnIHBpbmcvcG9uZyBhZGRyZXNzIG9mIEFGIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IodmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgfD0gQkZfRU5BQkxFX01BU0s7Ci0JCW1zbV9jYW1lcmFfaW9fdyhvbGRfdmFsLAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTQwX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwLCAodmZlNDBfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9TVEFUU19BV0JfU1RBUlQ6IHsKLQkJcmMgPSB2ZmVfc3RhdHNfYXdiX2J1Zl9pbml0KHZmZTQwX2N0cmwsIE5VTEwpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBjYW5ub3QgY29uZmlnIHBpbmcvcG9uZyBhZGRyZXNzIG9mIEFXQiIsCi0JCQkJIF9fZnVuY19fKTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgfD0gQVdCX0VOQUJMRV9NQVNLOwotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmU0MF9jbWRbY21kLT5pZF0ub2Zmc2V0LAotCQkJY21kcCwgKHZmZTQwX2NtZFtjbWQtPmlkXS5sZW5ndGgpKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9TVEFUU19JSElTVF9TVEFSVDogewotCQlyYyA9IHZmZV9zdGF0c19paGlzdF9idWZfaW5pdCh2ZmU0MF9jdHJsKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogY2Fubm90IGNvbmZpZyBwaW5nL3BvbmcgYWRkcmVzcyBvZiBJSElTVCIsCi0JCQkJIF9fZnVuY19fKTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgfD0gSUhJU1RfRU5BQkxFX01BU0s7Ci0JCW1zbV9jYW1lcmFfaW9fdyhvbGRfdmFsLAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTQwX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwLCAodmZlNDBfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQl9Ci0JCWJyZWFrOwotCi0KLQljYXNlIFZGRV9DTURfU1RBVFNfUlNfU1RBUlQ6IHsKLQkJcmMgPSB2ZmVfc3RhdHNfcnNfYnVmX2luaXQodmZlNDBfY3RybCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGNhbm5vdCBjb25maWcgcGluZy9wb25nIGFkZHJlc3Mgb2YgUlMiLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTQwX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwLCAodmZlNDBfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX1NUQVRTX0NTX1NUQVJUOiB7Ci0JCXJjID0gdmZlX3N0YXRzX2NzX2J1Zl9pbml0KHZmZTQwX2N0cmwpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBjYW5ub3QgY29uZmlnIHBpbmcvcG9uZyBhZGRyZXNzIG9mIENTIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmU0MF9jbWRbY21kLT5pZF0ub2Zmc2V0LAotCQkJY21kcCwgKHZmZTQwX2NtZFtjbWQtPmlkXS5sZW5ndGgpKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9TVEFUU19CR19TVEFSVDoKLQljYXNlIFZGRV9DTURfU1RBVFNfQkVfU1RBUlQ6Ci0JY2FzZSBWRkVfQ01EX1NUQVRTX0JGX1NUQVJUOgotCWNhc2UgVkZFX0NNRF9TVEFUU19CSElTVF9TVEFSVDogewotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9TVEFUU19DRkcpOwotCQltb2R1bGVfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQotCQlpZiAoVkZFX0NNRF9TVEFUU19CRV9TVEFSVCA9PSBjbWQtPmlkKSB7Ci0JCQltb2R1bGVfdmFsIHw9IEJFX0VOQUJMRV9NQVNLOwotCQkJcmMgPSB2ZmVfc3RhdHNfYmVfYnVmX2luaXQodmZlNDBfY3RybCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczogY2Fubm90IGNvbmZpZyBwaW5nL3BvbmcgYWRkcmVzcyBvZiBCRyIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQkJfQotCQl9IGVsc2UgaWYgKFZGRV9DTURfU1RBVFNfQkdfU1RBUlQgPT0gY21kLT5pZCkgewotCQkJbW9kdWxlX3ZhbCB8PSBCR19FTkFCTEVfTUFTSzsKLQkJCXJjID0gdmZlX3N0YXRzX2JnX2J1Zl9pbml0KHZmZTQwX2N0cmwpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6IGNhbm5vdCBjb25maWcgcGluZy9wb25nIGFkZHJlc3Mgb2YgQkciLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJCX0KLQkJfSBlbHNlIGlmIChWRkVfQ01EX1NUQVRTX0JGX1NUQVJUID09IGNtZC0+aWQpIHsKLQkJCW1vZHVsZV92YWwgfD0gQkZfRU5BQkxFX01BU0s7Ci0JCQlyYyA9IHZmZV9zdGF0c19iZl9idWZfaW5pdCh2ZmU0MF9jdHJsKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBjYW5ub3QgY29uZmlnIHBpbmcvcG9uZyBhZGRyZXNzIG9mIEJGIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQltb2R1bGVfdmFsIHw9IEJISVNUX0VOQUJMRV9NQVNLOwotCQkJb2xkX3ZhbCB8PSBTVEFUU19CSElTVF9FTkFCTEVfTUFTSzsKLQkJCXJjID0gdmZlX3N0YXRzX2JoaXN0X2J1Zl9pbml0KHZmZTQwX2N0cmwpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6IGNhbm5vdCBjb25maWcgcGluZy9wb25nIGFkZHJlc3Mgb2YgQkhpc3QiLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJCX0KLQkJfQotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwgdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfU1RBVFNfQ0ZHKTsKLQkJbXNtX2NhbWVyYV9pb193KG1vZHVsZV92YWwsCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmU0MF9jbWRbY21kLT5pZF0ub2Zmc2V0LAotCQkJY21kcCwgKHZmZTQwX2NtZFtjbWQtPmlkXS5sZW5ndGgpKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFZGRV9DTURfTUNFX1VQREFURToKLQljYXNlIFZGRV9DTURfTUNFX0NGRzp7Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJLyogSW5jcmVtZW50aW5nIHdpdGggNCBzbyBhcyB0byBwb2ludCB0byB0aGUgMm5kIFJlZ2lzdGVyIGFzCi0JCXRoZSAybmQgcmVnaXN0ZXIgaGFzIHRoZSBtY2VfZW5hYmxlIGJpdCAqLwotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVjQwX0NIUk9NQV9TVVBfT0ZGICsgNCk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwX2xvY2FsID0gY21kcDsKLQkJbmV3X3ZhbCA9ICpjbWRwX2xvY2FsOwotCQlvbGRfdmFsICY9IE1DRV9FTl9NQVNLOwotCQluZXdfdmFsID0gbmV3X3ZhbCB8IG9sZF92YWw7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWNDBfQ0hST01BX1NVUF9PRkYgKyA0LCAmbmV3X3ZhbCwgNCk7Ci0JCWNtZHBfbG9jYWwgKz0gMTsKLQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVjQwX0NIUk9NQV9TVVBfT0ZGICsgOCk7Ci0JCW5ld192YWwgPSAqY21kcF9sb2NhbDsKLQkJb2xkX3ZhbCAmPSBNQ0VfUV9LX01BU0s7Ci0JCW5ld192YWwgPSBuZXdfdmFsIHwgb2xkX3ZhbDsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVY0MF9DSFJPTUFfU1VQX09GRiArIDgsICZuZXdfdmFsLCA0KTsKLQkJY21kcF9sb2NhbCArPSAxOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlNDBfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHBfbG9jYWwsICh2ZmU0MF9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX0NIUk9NQV9TVVBfVVBEQVRFOgotCWNhc2UgVkZFX0NNRF9DSFJPTUFfU1VQX0NGRzp7Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQltc21fY2FtZXJhX2lvX21lbWNweSh2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVY0MF9DSFJPTUFfU1VQX09GRiwgY21kcF9sb2NhbCwgNCk7Ci0KLQkJY21kcF9sb2NhbCArPSAxOwotCQluZXdfdmFsID0gKmNtZHBfbG9jYWw7Ci0JCS8qIEluY3JlbWVudGluZyB3aXRoIDQgc28gYXMgdG8gcG9pbnQgdG8gdGhlIDJuZCBSZWdpc3RlciBhcwotCQkgKiB0aGUgMm5kIHJlZ2lzdGVyIGhhcyB0aGUgbWNlX2VuYWJsZSBiaXQKLQkJICovCi0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IodmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWNDBfQ0hST01BX1NVUF9PRkYgKyA0KTsKLQkJb2xkX3ZhbCAmPSB+TUNFX0VOX01BU0s7Ci0JCW5ld192YWwgPSBuZXdfdmFsIHwgb2xkX3ZhbDsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVY0MF9DSFJPTUFfU1VQX09GRiArIDQsICZuZXdfdmFsLCA0KTsKLQkJY21kcF9sb2NhbCArPSAxOwotCi0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IodmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWNDBfQ0hST01BX1NVUF9PRkYgKyA4KTsKLQkJbmV3X3ZhbCA9ICpjbWRwX2xvY2FsOwotCQlvbGRfdmFsICY9IH5NQ0VfUV9LX01BU0s7Ci0JCW5ld192YWwgPSBuZXdfdmFsIHwgb2xkX3ZhbDsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVY0MF9DSFJPTUFfU1VQX09GRiArIDgsICZuZXdfdmFsLCA0KTsKLQkJfQotCQlicmVhazsKLQljYXNlIFZGRV9DTURfQkxBQ0tfTEVWRUxfQ0ZHOgotCQlyYyA9IC1FRkFVTFQ7Ci0JCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0KLQljYXNlIFZGRV9DTURfTUVTSF9ST0xMX09GRl9DRkc6IHsKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSkgLCBjbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmU0MF9jbWRbY21kLT5pZF0ub2Zmc2V0LAotCQkJY21kcF9sb2NhbCwgVjQwX01FU0hfUk9MTF9PRkZfQ0ZHX0xFTik7Ci0JCWNtZHBfbG9jYWwgKz0gOTsKLQkJdmZlNDBfcHJvZ3JhbV9kbWlfY2ZnKFJPTExPRkZfUkFNMF9CQU5LMCwgdmZlNDBfY3RybCk7Ci0JCS8qIGZvciBsb29wIGZvciBleHRyY3RpbmcgdGFibGUuICovCi0JCWZvciAoaSA9IDA7IGkgPCAoVjQwX01FU0hfUk9MTF9PRkZfVEFCTEVfU0laRSAqIDIpOyBpKyspIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygqY21kcF9sb2NhbCwKLQkJCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQlWRkVfRE1JX0RBVEFfTE8pOwotCQkJY21kcF9sb2NhbCsrOwotCQl9Ci0JCUNEQkcoImRvbmUgd3JpdGluZyBtZXNoIHRhYmxlXG4iKTsKLQkJdmZlNDBfcHJvZ3JhbV9kbWlfY2ZnKE5PX01FTV9TRUxFQ1RFRCwgdmZlNDBfY3RybCk7Ci0JfQotCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9HRVRfTUVTSF9ST0xMT0ZGX1RBQkxFOgotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9MQV9DRkc6Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0KLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmU0MF9jbWRbY21kLT5pZF0ub2Zmc2V0LAotCQkJY21kcF9sb2NhbCwgKHZmZTQwX2NtZFtjbWQtPmlkXS5sZW5ndGgpKTsKLQotCQljbWRwX2xvY2FsICs9IDE7Ci0JCXZmZTQwX3dyaXRlX2xhX2NmZyhMVU1BX0FEQVBUX0xVVF9SQU1fQkFOSzAsCi0JCQkJCQkgICBjbWRwX2xvY2FsLCB2ZmU0MF9jdHJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfTEFfVVBEQVRFOiB7Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0KLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQotCQljbWRwX2xvY2FsID0gY21kcCArIDE7Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjQwX0xBX09GRik7Ci0JCWlmIChvbGRfdmFsICE9IDB4MCkKLQkJCXZmZTQwX3dyaXRlX2xhX2NmZyhMVU1BX0FEQVBUX0xVVF9SQU1fQkFOSzAsCi0JCQkJY21kcF9sb2NhbCwgdmZlNDBfY3RybCk7Ci0JCWVsc2UKLQkJCXZmZTQwX3dyaXRlX2xhX2NmZyhMVU1BX0FEQVBUX0xVVF9SQU1fQkFOSzEsCi0JCQkJY21kcF9sb2NhbCwgdmZlNDBfY3RybCk7Ci0JCX0KLQkJdmZlNDBfY3RybC0+dXBkYXRlX2xhID0gdHJ1ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfR0VUX0xBX1RBQkxFOgotCQl0ZW1wMSA9IHNpemVvZih1aW50MzJfdCkgKiBWRkU0MF9MQV9UQUJMRV9MRU5HVEggLyAyOwotCQlpZiAoY21kLT5sZW5ndGggIT0gdGVtcDEpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGt6YWxsb2ModGVtcDEsIEdGUF9LRVJORUwpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0JCWlmIChtc21fY2FtZXJhX2lvX3IodmZlNDBfY3RybC0+Ci0JCQkJc2hhcmVfY3RybC0+dmZlYmFzZSArIFY0MF9MQV9PRkYpKQotCQkJdmZlNDBfcHJvZ3JhbV9kbWlfY2ZnKExVTUFfQURBUFRfTFVUX1JBTV9CQU5LMSwKLQkJCQkJCXZmZTQwX2N0cmwpOwotCQllbHNlCi0JCQl2ZmU0MF9wcm9ncmFtX2RtaV9jZmcoTFVNQV9BREFQVF9MVVRfUkFNX0JBTkswLAotCQkJCQkJdmZlNDBfY3RybCk7Ci0JCWZvciAoaSA9IDAgOyBpIDwgKFZGRTQwX0xBX1RBQkxFX0xFTkdUSCAvIDIpIDsgaSsrKSB7Ci0JCQkqY21kcF9sb2NhbCA9Ci0JCQkJbXNtX2NhbWVyYV9pb19yKAotCQkJCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJVkZFX0RNSV9EQVRBX0xPKTsKLQkJCSpjbWRwX2xvY2FsIHw9IChtc21fY2FtZXJhX2lvX3IoCi0JCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX0RNSV9EQVRBX0xPKSkgPDwgMTY7Ci0JCQljbWRwX2xvY2FsKys7Ci0JCX0KLQkJdmZlNDBfcHJvZ3JhbV9kbWlfY2ZnKE5PX01FTV9TRUxFQ1RFRCwgdmZlNDBfY3RybCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLCBjbWRwLAotCQkJdGVtcDEpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9TS19FTkhBTl9DRkc6Ci0JY2FzZSBWRkVfQ01EX1NLX0VOSEFOX1VQREFURTp7Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFY0MF9TQ0VfT0ZGLAotCQkJY21kcCwgVjQwX1NDRV9MRU4pOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0xJVkVTSE9UOgotCQkvKiBDb25maWd1cmUgcHJpbWFyeSBjaGFubmVsICovCi0JCXZmZTQwX3N0YXJ0X2xpdmVzaG90KHBtY3RsLCB2ZmU0MF9jdHJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfTElORUFSSVpBVElPTl9DRkc6Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLCAodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWNDBfTElORUFSSVpBVElPTl9PRkYxLAotCQkJY21kcF9sb2NhbCwgVjQwX0xJTkVBUklaQVRJT05fTEVOMSk7Ci0JCWNtZHBfbG9jYWwgPSBjbWRwICsgMTc7Ci0JCXZmZTQwX3dyaXRlX2xpbmVhcl9jZmcoQkxBQ0tfTFVUX1JBTV9CQU5LMCwKLQkJCQkJY21kcF9sb2NhbCwgdmZlNDBfY3RybCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0xJTkVBUklaQVRJT05fVVBEQVRFOgotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwgKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQljbWRwX2xvY2FsKys7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWNDBfTElORUFSSVpBVElPTl9PRkYxICsgNCwKLQkJCWNtZHBfbG9jYWwsIChWNDBfTElORUFSSVpBVElPTl9MRU4xIC0gNCkpOwotCQljbWRwX2xvY2FsID0gY21kcCArIDE3OwotCQkvKmV4dHJhY3RpbmcgdGhlIGJhbmsgc2VsZWN0Ki8KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQlWNDBfTElORUFSSVpBVElPTl9PRkYxKTsKLQotCQlpZiAob2xkX3ZhbCAhPSAweDApCi0JCQl2ZmU0MF93cml0ZV9saW5lYXJfY2ZnKEJMQUNLX0xVVF9SQU1fQkFOSzAsCi0JCQkJCQljbWRwX2xvY2FsLCB2ZmU0MF9jdHJsKTsKLQkJZWxzZQotCQkJdmZlNDBfd3JpdGVfbGluZWFyX2NmZyhCTEFDS19MVVRfUkFNX0JBTksxLAotCQkJCQkJY21kcF9sb2NhbCwgdmZlNDBfY3RybCk7Ci0JCXZmZTQwX2N0cmwtPnVwZGF0ZV9saW5lYXIgPSB0cnVlOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9HRVRfTElORUFSSVpBVE9OX1RBQkxFOgotCQl0ZW1wMSA9IHNpemVvZih1aW50MzJfdCkgKiBWRkU0MF9MSU5FQVJJWkFUT05fVEFCTEVfTEVOR1RIOwotCQlpZiAoY21kLT5sZW5ndGggIT0gdGVtcDEpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGt6YWxsb2ModGVtcDEsIEdGUF9LRVJORUwpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0JCWlmIChtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVY0MF9MSU5FQVJJWkFUSU9OX09GRjEpKQotCQkJdmZlNDBfcHJvZ3JhbV9kbWlfY2ZnKEJMQUNLX0xVVF9SQU1fQkFOSzEsIHZmZTQwX2N0cmwpOwotCQllbHNlCi0JCQl2ZmU0MF9wcm9ncmFtX2RtaV9jZmcoQkxBQ0tfTFVUX1JBTV9CQU5LMCwgdmZlNDBfY3RybCk7Ci0JCUNEQkcoIiVzOiBMaW5lYXJpemF0aW9uIFRhYmxlXG4iLCBfX2Z1bmNfXyk7Ci0JCWZvciAoaSA9IDAgOyBpIDwgVkZFNDBfTElORUFSSVpBVE9OX1RBQkxFX0xFTkdUSCA7IGkrKykgewotCQkJKmNtZHBfbG9jYWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX0RNSV9EQVRBX0xPKTsKLQkJCUNEQkcoIiVzOiAlMDh4XG4iLCBfX2Z1bmNfXywgKmNtZHBfbG9jYWwpOwotCQkJY21kcF9sb2NhbCsrOwotCQl9Ci0JCXZmZTQwX3Byb2dyYW1fZG1pX2NmZyhOT19NRU1fU0VMRUNURUQsIHZmZTQwX2N0cmwpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwgY21kcCwKLQkJCXRlbXAxKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlicmVhazsKLQljYXNlIFZGRV9DTURfREVNT1NBSUNWMzoKLQkJaWYgKGNtZC0+bGVuZ3RoICE9Ci0JCQlWNDBfREVNT1NBSUNWM18wX0xFTitWNDBfREVNT1NBSUNWM18xX0xFTikgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwX2xvY2FsID0gY21kcDsKLQkJbmV3X3ZhbCA9ICpjbWRwX2xvY2FsOwotCi0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjQwX0RFTU9TQUlDVjNfMF9PRkYpOwotCQlvbGRfdmFsICY9IERFTU9TQUlDX01BU0s7Ci0JCW5ld192YWwgPSBuZXdfdmFsIHwgb2xkX3ZhbDsKLQkJKmNtZHBfbG9jYWwgPSBuZXdfdmFsOwotCi0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFY0MF9ERU1PU0FJQ1YzXzBfT0ZGLAotCQkJY21kcF9sb2NhbCwgVjQwX0RFTU9TQUlDVjNfMF9MRU4pOwotCQljbWRwX2xvY2FsICs9IDE7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFY0MF9ERU1PU0FJQ1YzXzFfT0ZGLAotCQkJY21kcF9sb2NhbCwgVjQwX0RFTU9TQUlDVjNfMV9MRU4pOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9ERU1PU0FJQ1YzX1VQREFURToKLQkJaWYgKGNtZC0+bGVuZ3RoICE9Ci0JCQlWNDBfREVNT1NBSUNWM18wX0xFTiAqIFY0MF9ERU1PU0FJQ1YzX1VQX1JFR19DTlQpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0JCW5ld192YWwgPSAqY21kcF9sb2NhbDsKLQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFY0MF9ERU1PU0FJQ1YzXzBfT0ZGKTsKLQkJb2xkX3ZhbCAmPSBERU1PU0FJQ19NQVNLOwotCQluZXdfdmFsID0gbmV3X3ZhbCB8IG9sZF92YWw7Ci0JCSpjbWRwX2xvY2FsID0gbmV3X3ZhbDsKLQotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWNDBfREVNT1NBSUNWM18wX09GRiwKLQkJCWNtZHBfbG9jYWwsIFY0MF9ERU1PU0FJQ1YzXzBfTEVOKTsKLQkJLyogQXMgdGhlIGFkZHJlc3Mgc3BhY2UgaXMgbm90IGNvbnRpZ3VvdXMgaW5jcmVtZW50IGJ5IDIKLQkJICogYmVmb3JlIGNvcHlpbmcgdG8gbmV4dCBhZGRyZXNzIHNwYWNlICovCi0JCWNtZHBfbG9jYWwgKz0gMTsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjQwX0RFTU9TQUlDVjNfMV9PRkYsCi0JCQljbWRwX2xvY2FsLCAyICogVjQwX0RFTU9TQUlDVjNfMF9MRU4pOwotCQkvKiBBcyB0aGUgYWRkcmVzcyBzcGFjZSBpcyBub3QgY29udGlndW91cyBpbmNyZW1lbnQgYnkgMgotCQkgKiBiZWZvcmUgY29weWluZyB0byBuZXh0IGFkZHJlc3Mgc3BhY2UgKi8KLQkJY21kcF9sb2NhbCArPSAyOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWNDBfREVNT1NBSUNWM18yX09GRiwKLQkJCWNtZHBfbG9jYWwsIDIgKiBWNDBfREVNT1NBSUNWM18wX0xFTik7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0RFTU9TQUlDVjNfQUJDQ19DRkc6Ci0JCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfREVNT1NBSUNWM19BQkZfVVBEQVRFOi8qIDExNiBBQkYgdXBkYXRlICAqLwotCWNhc2UgVkZFX0NNRF9ERU1PU0FJQ1YzX0FCRl9DRkc6IHsgLyogMTA4IEFCRiBjb25maWcgICovCi0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWNtZHBfbG9jYWwgPSBjbWRwOwotCQluZXdfdmFsID0gKmNtZHBfbG9jYWw7Ci0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWNDBfREVNT1NBSUNWM18wX09GRik7Ci0JCW9sZF92YWwgJj0gQUJGX01BU0s7Ci0JCW5ld192YWwgPSBuZXdfdmFsIHwgb2xkX3ZhbDsKLQkJKmNtZHBfbG9jYWwgPSBuZXdfdmFsOwotCi0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFY0MF9ERU1PU0FJQ1YzXzBfT0ZGLAotCQkJY21kcF9sb2NhbCwgNCk7Ci0KLQkJY21kcF9sb2NhbCArPSAxOwotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlNDBfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHBfbG9jYWwsICh2ZmU0MF9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfREVNT1NBSUNWM19EQkNDX0NGRzoKLQljYXNlIFZGRV9DTURfREVNT1NBSUNWM19EQkNDX1VQREFURToKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsCi0JCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0JCW5ld192YWwgPSAqY21kcF9sb2NhbDsKLQotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFY0MF9ERU1PU0FJQ1YzXzBfT0ZGKTsKLQkJb2xkX3ZhbCAmPSBEQkNDX01BU0s7Ci0KLQkJbmV3X3ZhbCA9IG5ld192YWwgfCBvbGRfdmFsOwotCQkqY21kcF9sb2NhbCA9IG5ld192YWw7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFY0MF9ERU1PU0FJQ1YzXzBfT0ZGLAotCQkJY21kcF9sb2NhbCwgNCk7Ci0JCWNtZHBfbG9jYWwgKz0gMTsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTQwX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwX2xvY2FsLCAodmZlNDBfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9ERU1PU0FJQ1YzX0RCUENfQ0ZHOgotCWNhc2UgVkZFX0NNRF9ERU1PU0FJQ1YzX0RCUENfVVBEQVRFOgotCQljbWRwID0ga21hbGxvYyhjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kcCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwX2xvY2FsID0gY21kcDsKLQkJbmV3X3ZhbCA9ICpjbWRwX2xvY2FsOwotCi0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjQwX0RFTU9TQUlDVjNfMF9PRkYpOwotCQlvbGRfdmFsICY9IERCUENfTUFTSzsKLQotCQluZXdfdmFsID0gbmV3X3ZhbCB8IG9sZF92YWw7Ci0JCSpjbWRwX2xvY2FsID0gbmV3X3ZhbDsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkodmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWNDBfREVNT1NBSUNWM18wX09GRiwKLQkJCWNtZHBfbG9jYWwsIFY0MF9ERU1PU0FJQ1YzXzBfTEVOKTsKLQkJY21kcF9sb2NhbCArPSAxOwotCQltc21fY2FtZXJhX2lvX21lbWNweSh2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVY0MF9ERU1PU0FJQ1YzX0RCUENfQ0ZHX09GRiwKLQkJCWNtZHBfbG9jYWwsIFY0MF9ERU1PU0FJQ1YzX0RCUENfTEVOKTsKLQkJY21kcF9sb2NhbCArPSAxOwotCQltc21fY2FtZXJhX2lvX21lbWNweSh2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVY0MF9ERU1PU0FJQ1YzX0RCUENfQ0ZHX09GRjAsCi0JCQljbWRwX2xvY2FsLCBWNDBfREVNT1NBSUNWM19EQlBDX0xFTik7Ci0JCWNtZHBfbG9jYWwgKz0gMTsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkodmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWNDBfREVNT1NBSUNWM19EQlBDX0NGR19PRkYxLAotCQkJY21kcF9sb2NhbCwgVjQwX0RFTU9TQUlDVjNfREJQQ19MRU4pOwotCQljbWRwX2xvY2FsICs9IDE7Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVjQwX0RFTU9TQUlDVjNfREJQQ19DRkdfT0ZGMiwKLQkJCWNtZHBfbG9jYWwsIFY0MF9ERU1PU0FJQ1YzX0RCUENfTEVOKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfUkdCX0dfQ0ZHOiB7Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCW1zbV9jYW1lcmFfaW9fbWVtY3B5KAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFY0MF9SR0JfR19PRkYsCi0JCQljbWRwLCA0KTsKLQkJY21kcCArPSAxOwotCi0JCXZmZTQwX3dyaXRlX2dhbW1hX2NmZyhSR0JMVVRfUkFNX0NIMF9CQU5LMCwgY21kcCwgdmZlNDBfY3RybCk7Ci0JCXZmZTQwX3dyaXRlX2dhbW1hX2NmZyhSR0JMVVRfUkFNX0NIMV9CQU5LMCwgY21kcCwgdmZlNDBfY3RybCk7Ci0JCXZmZTQwX3dyaXRlX2dhbW1hX2NmZyhSR0JMVVRfUkFNX0NIMl9CQU5LMCwgY21kcCwgdmZlNDBfY3RybCk7Ci0JCX0KLQkgICAgY21kcCAtPSAxOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9SR0JfR19VUERBVEU6IHsKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsICh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCi0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVjQwX1JHQl9HX09GRik7Ci0JCWNtZHAgKz0gMTsKLQkJaWYgKG9sZF92YWwgIT0gMHgwKSB7Ci0JCQl2ZmU0MF93cml0ZV9nYW1tYV9jZmcoCi0JCQkJUkdCTFVUX1JBTV9DSDBfQkFOSzAsIGNtZHAsIHZmZTQwX2N0cmwpOwotCQkJdmZlNDBfd3JpdGVfZ2FtbWFfY2ZnKAotCQkJCVJHQkxVVF9SQU1fQ0gxX0JBTkswLCBjbWRwLCB2ZmU0MF9jdHJsKTsKLQkJCXZmZTQwX3dyaXRlX2dhbW1hX2NmZygKLQkJCQlSR0JMVVRfUkFNX0NIMl9CQU5LMCwgY21kcCwgdmZlNDBfY3RybCk7Ci0JCX0gZWxzZSB7Ci0JCQl2ZmU0MF93cml0ZV9nYW1tYV9jZmcoCi0JCQkJUkdCTFVUX1JBTV9DSDBfQkFOSzEsIGNtZHAsIHZmZTQwX2N0cmwpOwotCQkJdmZlNDBfd3JpdGVfZ2FtbWFfY2ZnKAotCQkJCVJHQkxVVF9SQU1fQ0gxX0JBTksxLCBjbWRwLCB2ZmU0MF9jdHJsKTsKLQkJCXZmZTQwX3dyaXRlX2dhbW1hX2NmZygKLQkJCQlSR0JMVVRfUkFNX0NIMl9CQU5LMSwgY21kcCwgdmZlNDBfY3RybCk7Ci0JCX0KLQkJfQotCQl2ZmU0MF9jdHJsLT51cGRhdGVfZ2FtbWEgPSBUUlVFOwotCQljbWRwIC09IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0dFVF9SR0JfR19UQUJMRToKLQkJdGVtcDEgPSBzaXplb2YodWludDMyX3QpICogVkZFNDBfR0FNTUFfTlVNX0VOVFJJRVMgKiAzOwotCQlpZiAoY21kLT5sZW5ndGggIT0gdGVtcDEpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcCA9IGt6YWxsb2ModGVtcDEsIEdGUF9LRVJORUwpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJY21kcF9sb2NhbCA9IGNtZHA7Ci0KLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWNDBfUkdCX0dfT0ZGKTsKLQkJdGVtcDIgPSBvbGRfdmFsID8gUkdCTFVUX1JBTV9DSDBfQkFOSzEgOgotCQkJUkdCTFVUX1JBTV9DSDBfQkFOSzA7Ci0JCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCXZmZTQwX3JlYWRfZ2FtbWFfY2ZnKHRlbXAyLAotCQkJCWNtZHBfbG9jYWwgKyAoVkZFNDBfR0FNTUFfTlVNX0VOVFJJRVMgKiBpKSwKLQkJCQl2ZmU0MF9jdHJsKTsKLQkJCXRlbXAyICs9IDI7Ci0JCX0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksIGNtZHAsCi0JCQl0ZW1wMSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfU1RBVFNfQVdCX1NUT1A6IHsKLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgJj0gfkFXQl9FTkFCTEVfTUFTSzsKLQkJbXNtX2NhbWVyYV9pb193KG9sZF92YWwsCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9TVEFUU19CR19TVE9QOiB7Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlvbGRfdmFsICY9IH5CR19FTkFCTEVfTUFTSzsKLQkJbXNtX2NhbWVyYV9pb193KG9sZF92YWwsCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9TVEFUU19CRl9TVE9QOiB7Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlvbGRfdmFsICY9IH5CRl9FTkFCTEVfTUFTSzsKLQkJbXNtX2NhbWVyYV9pb193KG9sZF92YWwsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0KLQkJcmMgPSB2ZmU0MF9zdGF0c19mbHVzaF9lbnF1ZXVlKHZmZTQwX2N0cmwsCi0JCQkJTVNNX1NUQVRTX1RZUEVfQkYpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBkcSBzdGF0cyBidWYgZXJyID0gJWQiLAotCQkJCSAgIF9fZnVuY19fLCByYyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9TVEFUU19CRV9TVE9QOiB7Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlvbGRfdmFsICY9IH5CRV9FTkFCTEVfTUFTSzsKLQkJbXNtX2NhbWVyYV9pb193KG9sZF92YWwsCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX1NUQVRTX0lISVNUX1NUT1A6IHsKLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgJj0gfklISVNUX0VOQUJMRV9NQVNLOwotCQltc21fY2FtZXJhX2lvX3cob2xkX3ZhbCwKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfU1RBVFNfUlNfU1RPUDogewotCQlvbGRfdmFsID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJb2xkX3ZhbCAmPSB+UlNfRU5BQkxFX01BU0s7Ci0JCW1zbV9jYW1lcmFfaW9fdyhvbGRfdmFsLAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9TVEFUU19DU19TVE9QOiB7Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQlvbGRfdmFsICY9IH5DU19FTkFCTEVfTUFTSzsKLQkJbXNtX2NhbWVyYV9pb193KG9sZF92YWwsCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX01PRFVMRV9DRkcpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX1NUQVRTX0JISVNUX1NUT1A6IHsKLQkJaWYgKCF2ZmU0MF91c2VfYmF5ZXJfc3RhdHModmZlNDBfY3RybCkpIHsKLQkJCS8qIEVycm9yICovCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCW9sZF92YWwgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX1NUQVRTX0NGRyk7Ci0KLQkJaWYgKFZGRV9DTURfU1RBVFNfQkhJU1RfU1RPUCA9PSBjbWQtPmlkKQotCQkJb2xkX3ZhbCAmPSB+U1RBVFNfQkhJU1RfRU5BQkxFX01BU0s7Ci0KLQkJbXNtX2NhbWVyYV9pb193KG9sZF92YWwsCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX1NUQVRTX0NGRyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfU1RPUDoKLQkJcHJfaW5mbygidmZlNDBfcHJvY19nZW5lcmFsOiBjbWRJRCA9ICVzXG4iLAotCQkJdmZlNDBfZ2VuZXJhbF9jbWRbY21kLT5pZF0pOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnZmZV9wYXJhbXMsCi0JCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2NhbWVyYV92ZmVfcGFyYW1zX3QpKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0KLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlID0KLQkJCXZmZV9wYXJhbXMub3BlcmF0aW9uX21vZGU7Ci0JCXZmZTQwX3N0b3AodmZlNDBfY3RybCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX1NZTkNfVElNRVJfU0VUVElORzoKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsICh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQl2ZmU0MF9zeW5jX3RpbWVyX3N0YXJ0KGNtZHAsIHZmZTQwX2N0cmwpOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9NT0RVTEVfQ0ZHOiB7Ci0JCWNtZHAgPSBrbWFsbG9jKGNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjbWRwLAotCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJY21kLT5sZW5ndGgpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCSpjbWRwICY9IH5TVEFUU19FTkFCTEVfTUFTSzsKLQkJb2xkX3ZhbCA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfTU9EVUxFX0NGRyk7Ci0JCW9sZF92YWwgJj0gU1RBVFNfRU5BQkxFX01BU0s7Ci0JCSpjbWRwIHw9IG9sZF92YWw7Ci0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTQwX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwLCAodmZlNDBfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX1pTTDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZmVfcGFyYW1zLAotCQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9jYW1lcmFfdmZlX3BhcmFtc190KSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSA9Ci0JCQl2ZmVfcGFyYW1zLm9wZXJhdGlvbl9tb2RlOwotCi0JCXJjID0gdmZlNDBfenNsKHBtY3RsLCB2ZmU0MF9jdHJsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfQVNGX0NGRzoKLQljYXNlIFZGRV9DTURfQVNGX1VQREFURToKLQkJY21kcCA9IGttYWxsb2MoY21kLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZHApIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZHAsICh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwKLQkJCWNtZC0+bGVuZ3RoKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQltc21fY2FtZXJhX2lvX21lbWNweSgKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlNDBfY21kW2NtZC0+aWRdLm9mZnNldCwKLQkJCWNtZHAsICh2ZmU0MF9jbWRbY21kLT5pZF0ubGVuZ3RoKSk7Ci0JCWNtZHBfbG9jYWwgPSBjbWRwICsgVjQwX0FTRl9MRU4vNDsKLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVY0MF9BU0ZfU1BFQ0lBTF9FRlhfQ0ZHX09GRiwKLQkJCWNtZHBfbG9jYWwsIFY0MF9BU0ZfU1BFQ0lBTF9FRlhfQ0ZHX0xFTik7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0dFVF9IV19WRVJTSU9OOgotCQlpZiAoY21kLT5sZW5ndGggIT0gVjQwX0dFVF9IV19WRVJTSU9OX0xFTikgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwID0ga21hbGxvYyhWNDBfR0VUX0hXX1ZFUlNJT05fTEVOLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCSpjbWRwID0gbXNtX2NhbWVyYV9pb19yKAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZStWNDBfR0VUX0hXX1ZFUlNJT05fT0ZGKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksIGNtZHAsCi0JCQlWNDBfR0VUX0hXX1ZFUlNJT05fTEVOKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQlicmVhazsKLQljYXNlIFZGRV9DTURfR0VUX1JFR19EVU1QOgotCQl0ZW1wMSA9IHNpemVvZih1aW50MzJfdCkgKgotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+cmVnaXN0ZXJfdG90YWw7Ci0JCWlmIChjbWQtPmxlbmd0aCAhPSB0ZW1wMSkgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQljbWRwID0ga21hbGxvYyh0ZW1wMSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kcCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBwcm9jX2dlbmVyYWxfZG9uZTsKLQkJfQotCQltc21fY2FtZXJhX2lvX2R1bXAodmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnJlZ2lzdGVyX3RvdGFsKjQpOwotCQlDREJHKCIlczogJXAgJXAgJWRcbiIsIF9fZnVuY19fLCAodm9pZCAqKWNtZHAsCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLCB0ZW1wMSk7Ci0JCW1lbWNweV9mcm9taW8oKHZvaWQgKiljbWRwLAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwgdGVtcDEpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwgY21kcCwgdGVtcDEpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9GUkFNRV9TS0lQX0NGRzoKLQkJaWYgKGNtZC0+bGVuZ3RoICE9IHZmZTQwX2NtZFtjbWQtPmlkXS5sZW5ndGgpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQljbWRwID0ga21hbGxvYyh2ZmU0MF9jbWRbY21kLT5pZF0ubGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKChjbWRwKSwgKHZvaWQgX191c2VyICopY21kLT52YWx1ZSwKLQkJCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCXByX2VycigiJXMgY29weSBmcm9tIHVzZXIgZmFpbGVkIGZvciBjbWQgJWQiLAotCQkJCV9fZnVuY19fLCBjbWQtPmlkKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTQwX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwLCAodmZlNDBfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQl2ZmU0MF9jdHJsLT5mcmFtZV9za2lwX2NudCA9ICgodWludDMyX3QpCi0JCQkqY21kcCAmIFZGRV9GUkFNRV9TS0lQX1BFUklPRF9NQVNLKSArIDE7Ci0JCXZmZTQwX2N0cmwtPmZyYW1lX3NraXBfcGF0dGVybiA9ICh1aW50MzJfdCkoKihjbWRwICsgMikpOwotCQlicmVhazsKLQljYXNlIFZGRV9DTURfU1RPUF9MSVZFU0hPVDoKLQkJQ0RCRygiJXMgU3RvcHBpbmcgbGl2ZXNob3QgIiwgX19mdW5jX18pOwotCQl2ZmU0MF9zdG9wX2xpdmVzaG90KHBtY3RsLCB2ZmU0MF9jdHJsKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaWYgKGNtZC0+bGVuZ3RoICE9IHZmZTQwX2NtZFtjbWQtPmlkXS5sZW5ndGgpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQljbWRwID0ga21hbGxvYyh2ZmU0MF9jbWRbY21kLT5pZF0ubGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRwKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHByb2NfZ2VuZXJhbF9kb25lOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKChjbWRwKSwgKHZvaWQgX191c2VyICopY21kLT52YWx1ZSwKLQkJCQljbWQtPmxlbmd0aCkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCXByX2VycigiJXMgY29weSBmcm9tIHVzZXIgZmFpbGVkIGZvciBjbWQgJWQiLAotCQkJCV9fZnVuY19fLCBjbWQtPmlkKTsKLQkJCWdvdG8gcHJvY19nZW5lcmFsX2RvbmU7Ci0JCX0KLQkJbXNtX2NhbWVyYV9pb19tZW1jcHkoCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCXZmZTQwX2NtZFtjbWQtPmlkXS5vZmZzZXQsCi0JCQljbWRwLCAodmZlNDBfY21kW2NtZC0+aWRdLmxlbmd0aCkpOwotCQlicmVhazsKLQotCX0KLQotcHJvY19nZW5lcmFsX2RvbmU6Ci0Ja2ZyZWUoY21kcCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB2ZmU0MF9yZWFkX2lycV9zdGF0dXMoCi0Jc3RydWN0IGF4aV9jdHJsX3QgKmF4aV9jdHJsLCBzdHJ1Y3QgdmZlNDBfaXJxX3N0YXR1cyAqb3V0KQotewotCXVpbnQzMl90ICp0ZW1wOwotCW1lbXNldChvdXQsIDAsIHNpemVvZihzdHJ1Y3QgdmZlNDBfaXJxX3N0YXR1cykpOwotCXRlbXAgPSAodWludDMyX3QgKikoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX1NUQVRVU18wKTsKLQlvdXQtPnZmZUlycVN0YXR1czAgPSBtc21fY2FtZXJhX2lvX3IodGVtcCk7Ci0KLQl0ZW1wID0gKHVpbnQzMl90ICopKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9TVEFUVVNfMSk7Ci0Jb3V0LT52ZmVJcnFTdGF0dXMxID0gbXNtX2NhbWVyYV9pb19yKHRlbXApOwotCi0JdGVtcCA9ICh1aW50MzJfdCAqKShheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9DQU1JRl9TVEFUVVMpOwotCW91dC0+Y2FtaWZTdGF0dXMgPSBtc21fY2FtZXJhX2lvX3IodGVtcCk7Ci0JQ0RCRygiY2FtaWZTdGF0dXMgID0gMHgleFxuIiwgb3V0LT5jYW1pZlN0YXR1cyk7Ci0KLQkvKiBjbGVhciB0aGUgcGVuZGluZyBpbnRlcnJ1cHQgb2YgdGhlIHNhbWUga2luZC4qLwotCW1zbV9jYW1lcmFfaW9fdyhvdXQtPnZmZUlycVN0YXR1czAsCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DTEVBUl8wKTsKLQltc21fY2FtZXJhX2lvX3cob3V0LT52ZmVJcnFTdGF0dXMxLAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ0xFQVJfMSk7Ci0KLQkvKiBFbnN1cmUgdGhlIHdyaXRlIG9yZGVyIHdoaWxlIHdyaXRpbmcKLQl0byB0aGUgY29tbWFuZCByZWdpc3RlciB1c2luZyB0aGUgYmFycmllciAqLwotCW1zbV9jYW1lcmFfaW9fd19tYigxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ01EKTsKLQotfQotCi12b2lkIGF4aV9zdG9wX3BpeChzdHJ1Y3QgdmZlX3NoYXJlX2N0cmxfdCAqc2hhcmVfY3RybCkKLXsKLQl1aW50MzJfdCBvcGVyYXRpb25fbW9kZSA9Ci0Jc2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYgfihWRkVfT1VUUFVUU19SREkwfAotCQlWRkVfT1VUUFVUU19SREkxKTsKLQl1aW50MzJfdCBpcnFfY29tcF9tYXNrLCBpcnFfbWFzazsKLQl1aW50MzJfdCByZWdfdXBkYXRlID0gMHgxOwotCi0JaXJxX2NvbXBfbWFzayA9Ci0JCW1zbV9jYW1lcmFfaW9fcihzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9JUlFfQ09NUF9NQVNLKTsKLQlpcnFfbWFzayA9IG1zbV9jYW1lcmFfaW9fcihzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9JUlFfTUFTS18wKTsKLQotCXN3aXRjaCAoc2hhcmVfY3RybC0+Y21kX3R5cGUpIHsKLQljYXNlIEFYSV9DTURfUFJFVklFVzogewotCQlzd2l0Y2ggKG9wZXJhdGlvbl9tb2RlKSB7Ci0JCWNhc2UgVkZFX09VVFBVVFNfUFJFVklFVzoKLQkJY2FzZSBWRkVfT1VUUFVUU19QUkVWSUVXX0FORF9WSURFTzoKLQkJCWlmIChzaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICYKLQkJCQlWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZKSB7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UKLQkJCQkJKyB2ZmU0MF9BWElfV01fQ0ZHW3NoYXJlX2N0cmwtPgotCQkJCQlvdXRwYXRoLm91dDAuY2gwXSk7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UKLQkJCQkJKyB2ZmU0MF9BWElfV01fQ0ZHW3NoYXJlX2N0cmwtPgotCQkJCQlvdXRwYXRoLm91dDAuY2gxXSk7Ci0JCQkJaXJxX2NvbXBfbWFzayAmPSB+KAotCQkJCQkweDEgPDwgc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMCB8Ci0JCQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxKTsKLQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQkJCVZGRTQwX09VVFBVVF9NT0RFX1BSSU1BUlk7Ci0JCQl9IGVsc2UgaWYgKHNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgJgotCQkJCQlWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZX0FMTF9DSE5MUykgewotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlNDBfQVhJX1dNX0NGR1tzaGFyZV9jdHJsLT4KLQkJCQkJb3V0cGF0aC5vdXQwLmNoMF0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlNDBfQVhJX1dNX0NGR1tzaGFyZV9jdHJsLT4KLQkJCQkJb3V0cGF0aC5vdXQwLmNoMV0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlNDBfQVhJX1dNX0NGR1tzaGFyZV9jdHJsLT4KLQkJCQkJb3V0cGF0aC5vdXQwLmNoMl0pOwotCQkJCWlycV9jb21wX21hc2sgJj0gfigKLQkJCQkJMHgxIDw8IHNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDAgfAotCQkJCQkweDEgPDwgc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMSB8Ci0JCQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gyKTsKLQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQkJCVZGRTQwX09VVFBVVF9NT0RFX1BSSU1BUllfQUxMX0NITkxTOwotCQkJfQotCQkJaXJxX21hc2sgJj0gflZGRV9JUlFfU1RBVFVTMF9JTUFHRV9DT01QT1NJVF9ET05FMF9NQVNLOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoc2hhcmVfY3RybC0+Y29tcF9vdXRwdXRfbW9kZSAmCi0JCQkJVkZFNDBfT1VUUFVUX01PREVfU0VDT05EQVJZKSB7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UKLQkJCQkJKyB2ZmU0MF9BWElfV01fQ0ZHW3NoYXJlX2N0cmwtPgotCQkJCQlvdXRwYXRoLm91dDEuY2gwXSk7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UKLQkJCQkJKyB2ZmU0MF9BWElfV01fQ0ZHW3NoYXJlX2N0cmwtPgotCQkJCQlvdXRwYXRoLm91dDEuY2gxXSk7Ci0JCQkJaXJxX2NvbXBfbWFzayAmPSB+KAotCQkJCQkweDEgPDwgc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMCB8Ci0JCQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxKTsKLQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQkJCVZGRTQwX09VVFBVVF9NT0RFX1NFQ09OREFSWTsKLQkJCX0gZWxzZSBpZiAoc2hhcmVfY3RybC0+Y29tcF9vdXRwdXRfbW9kZSAmCi0JCQkJVkZFNDBfT1VUUFVUX01PREVfU0VDT05EQVJZX0FMTF9DSE5MUykgewotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlNDBfQVhJX1dNX0NGR1tzaGFyZV9jdHJsLT4KLQkJCQkJb3V0cGF0aC5vdXQxLmNoMF0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlNDBfQVhJX1dNX0NGR1tzaGFyZV9jdHJsLT4KLQkJCQkJb3V0cGF0aC5vdXQxLmNoMV0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlNDBfQVhJX1dNX0NGR1tzaGFyZV9jdHJsLT4KLQkJCQkJb3V0cGF0aC5vdXQxLmNoMl0pOwotCQkJCWlycV9jb21wX21hc2sgJj0gfigKLQkJCQkJMHgxIDw8IHNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDAgfAotCQkJCQkweDEgPDwgc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSB8Ci0JCQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gyKTsKLQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQkJCVZGRTQwX09VVFBVVF9NT0RFX1NFQ09OREFSWV9BTExfQ0hOTFM7Ci0JCQl9Ci0JCQlpcnFfbWFzayAmPSB+VkZFX0lSUV9TVEFUVVMwX0lNQUdFX0NPTVBPU0lUX0RPTkUxX01BU0s7Ci0JCQlicmVhazsKLQkJCX0KLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpZiAoc2hhcmVfY3RybC0+Y29tcF9vdXRwdXRfbW9kZSAmCi0JCQlWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZKSB7Ci0JCQltc21fY2FtZXJhX2lvX3coMCwgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlNDBfQVhJX1dNX0NGR1tzaGFyZV9jdHJsLT4KLQkJCQlvdXRwYXRoLm91dDAuY2gwXSk7Ci0JCQltc21fY2FtZXJhX2lvX3coMCwgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlNDBfQVhJX1dNX0NGR1tzaGFyZV9jdHJsLT4KLQkJCQlvdXRwYXRoLm91dDAuY2gxXSk7Ci0JCQlpcnFfY29tcF9tYXNrICY9IH4oCi0JCQkJMHgxIDw8IHNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDAgfAotCQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxKTsKLQkJCWlycV9tYXNrICY9IH5WRkVfSVJRX1NUQVRVUzBfSU1BR0VfQ09NUE9TSVRfRE9ORTBfTUFTSzsKLQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgfD0KLQkJCQkJVkZFNDBfT1VUUFVUX01PREVfUFJJTUFSWTsKLQkJfSBlbHNlIGlmIChzaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICYKLQkJCQlWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZX0FMTF9DSE5MUykgewotCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTQwX0FYSV9XTV9DRkdbc2hhcmVfY3RybC0+Ci0JCQkJb3V0cGF0aC5vdXQwLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTQwX0FYSV9XTV9DRkdbc2hhcmVfY3RybC0+Ci0JCQkJb3V0cGF0aC5vdXQwLmNoMV0pOwotCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTQwX0FYSV9XTV9DRkdbc2hhcmVfY3RybC0+Ci0JCQkJb3V0cGF0aC5vdXQwLmNoMl0pOwotCQkJaXJxX2NvbXBfbWFzayAmPSB+KAotCQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwIHwKLQkJCQkweDEgPDwgc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMSB8Ci0JCQkJMHgxIDw8IHNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDIpOwotCQkJaXJxX21hc2sgJj0gflZGRV9JUlFfU1RBVFVTMF9JTUFHRV9DT01QT1NJVF9ET05FMF9NQVNLOwotCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSB8PQotCQkJCQlWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZX0FMTF9DSE5MUzsKLQkJfQotCi0JCWlmIChzaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICYKLQkJCVZGRTQwX09VVFBVVF9NT0RFX1NFQ09OREFSWSkgewotCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTQwX0FYSV9XTV9DRkdbc2hhcmVfY3RybC0+Ci0JCQkJb3V0cGF0aC5vdXQxLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTQwX0FYSV9XTV9DRkdbc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMV0pOwotCQkJaXJxX2NvbXBfbWFzayAmPSB+KAotCQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwIHwKLQkJCQkweDEgPDwgc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSk7Ci0JCQlpcnFfbWFzayAmPSB+VkZFX0lSUV9TVEFUVVMwX0lNQUdFX0NPTVBPU0lUX0RPTkUxX01BU0s7Ci0JCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQkJCVZGRTQwX09VVFBVVF9NT0RFX1NFQ09OREFSWTsKLQkJfSBlbHNlIGlmIChzaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICYKLQkJCVZGRTQwX09VVFBVVF9NT0RFX1NFQ09OREFSWV9BTExfQ0hOTFMpIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmU0MF9BWElfV01fQ0ZHW3NoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDBdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmU0MF9BWElfV01fQ0ZHW3NoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDFdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmU0MF9BWElfV01fQ0ZHW3NoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDJdKTsKLQkJCWlycV9jb21wX21hc2sgJj0gfigKLQkJCQkweDEgPDwgc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMCB8Ci0JCQkJMHgxIDw8IHNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDEgfAotCQkJCTB4MSA8PCBzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gyKTsKLQkJCWlycV9tYXNrICY9IH5WRkVfSVJRX1NUQVRVUzBfSU1BR0VfQ09NUE9TSVRfRE9ORTFfTUFTSzsKLQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgfD0KLQkJCQkJVkZFNDBfT1VUUFVUX01PREVfU0VDT05EQVJZX0FMTF9DSE5MUzsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQltc21fY2FtZXJhX2lvX3dfbWIocmVnX3VwZGF0ZSwKLQkJc2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9SRUdfVVBEQVRFX0NNRCk7Ci0JbXNtX2NhbWVyYV9pb193KGlycV9jb21wX21hc2ssCi0JCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NPTVBfTUFTSyk7Ci0JbXNtX2NhbWVyYV9pb193KGlycV9tYXNrLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9JUlFfTUFTS18wKTsKLX0KLQotdm9pZCBheGlfc3RvcF9yZGkwKHN0cnVjdCB2ZmVfc2hhcmVfY3RybF90ICpzaGFyZV9jdHJsKQotewotCXVpbnQzMl90IHJlZ191cGRhdGUgPSAweDI7Ci0JdWludDMyX3QgaXJxX21hc2s7Ci0JaXJxX21hc2sgPSBtc21fY2FtZXJhX2lvX3Ioc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfSVJRX01BU0tfMCk7Ci0KLQlpZiAoc2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYgVkZFX09VVFBVVFNfUkRJMCkgewotCQltc21fY2FtZXJhX2lvX3coMCwgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmU0MF9BWElfV01fQ0ZHW3NoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5jaDBdKTsKLQkJaXJxX21hc2sgJj0gfigweDEgPDwgKHNoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5jaDAgKwotCQkJCVZGRV9XTV9PRkZTRVQpKTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193X21iKHJlZ191cGRhdGUsCi0JCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkVHX1VQREFURV9DTUQpOwotCW1zbV9jYW1lcmFfaW9fdyhpcnFfbWFzaywgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfSVJRX01BU0tfMCk7Ci19Ci0KLXZvaWQgYXhpX3N0b3BfcmRpMShzdHJ1Y3QgdmZlX3NoYXJlX2N0cmxfdCAqc2hhcmVfY3RybCkKLXsKLQl1aW50MzJfdCByZWdfdXBkYXRlID0gMHg0OwotCXVpbnQzMl90IGlycV9tYXNrOwotCWlycV9tYXNrID0gbXNtX2NhbWVyYV9pb19yKHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0lSUV9NQVNLXzApOwotCi0JaWYgKHNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmIFZGRV9PVVRQVVRTX1JESTEpIHsKLQkJbXNtX2NhbWVyYV9pb193KDEsIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJdmZlNDBfQVhJX1dNX0NGR1tzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDMuY2gwXSk7Ci0JCWlycV9tYXNrICY9IH4oMHgxIDw8IChzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDMuY2gwICsKLQkJCVZGRV9XTV9PRkZTRVQpKTsKLQl9Ci0JbXNtX2NhbWVyYV9pb193X21iKHJlZ191cGRhdGUsCi0JCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkVHX1VQREFURV9DTUQpOwotCW1zbV9jYW1lcmFfaW9fdyhpcnFfbWFzaywgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfSVJRX01BU0tfMCk7Ci19Ci0KLXZvaWQgYXhpX3N0b3BfcHJvY2VzcyhzdHJ1Y3QgdmZlX3NoYXJlX2N0cmxfdCAqc2hhcmVfY3RybCkKLXsKLQl1aW50MzJfdCBvcGVyYXRpb25fbW9kZSA9Ci0Jc2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYgfihWRkVfT1VUUFVUU19SREkwfAotCQlWRkVfT1VUUFVUU19SREkxKTsKLQotCWlmIChzaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgJiBWRkVfT1VUUFVUU19SREkwKSB7Ci0JCWF4aV9zdG9wX3JkaTAoc2hhcmVfY3RybCk7Ci0JCXNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgJj0gflZGRTQwX09VVFBVVF9NT0RFX1RFUlRJQVJZMTsKLQl9Ci0JaWYgKHNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmIFZGRV9PVVRQVVRTX1JESTEpIHsKLQkJYXhpX3N0b3BfcmRpMShzaGFyZV9jdHJsKTsKLQkJc2hhcmVfY3RybC0+Y29tcF9vdXRwdXRfbW9kZSAmPSB+VkZFNDBfT1VUUFVUX01PREVfVEVSVElBUlkyOwotCX0KLQlpZiAob3BlcmF0aW9uX21vZGUpIHsKLQkJYXhpX3N0b3BfcGl4KHNoYXJlX2N0cmwpOwotCQlzaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICY9Ci0JCQkJfihzaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTQwX3Byb2Nlc3NfcmVnX3VwZGF0ZV9pcnEoCi0JCXN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgdmZlX3NoYXJlX2N0cmxfdCAqc2hhcmVfY3RybCA9IHZmZTQwX2N0cmwtPnNoYXJlX2N0cmw7Ci0KLQlpZiAoYXRvbWljX2NtcHhjaGcoCi0JCSZzaGFyZV9jdHJsLT5waXgwX3VwZGF0ZV9hY2tfcGVuZGluZywgMiwgMCkgPT0gMikgewotCQlheGlfc3RvcF9waXgoc2hhcmVfY3RybCk7Ci0JCW1zbV9jYW1lcmFfaW9fd19tYigKLQkJCQlDQU1JRl9DT01NQU5EX1NUT1BfQVRfRlJBTUVfQk9VTkRBUlksCi0JCQkJc2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9DQU1JRl9DT01NQU5EKTsKLQkJYXhpX2Rpc2FibGVfaXJxKHNoYXJlX2N0cmwpOwotCQl2ZmU0MF9zZW5kX2lzcF9tc2coJnZmZTQwX2N0cmwtPnN1YmRldiwKLQkJCXNoYXJlX2N0cmwtPnZmZUZyYW1lSWQsCi0JCQlNU0dfSURfUElYMF9VUERBVEVfQUNLKTsKLQkJc2hhcmVfY3RybC0+Y29tcF9vdXRwdXRfbW9kZSAmPQotCQkJCX4oc2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSk7Ci0JCXNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmPQotCQkJKFZGRV9PVVRQVVRTX1JESTB8VkZFX09VVFBVVFNfUkRJMCk7Ci0JfSAgZWxzZSB7Ci0JCWlmIChzaGFyZV9jdHJsLT5yZWNvcmRpbmdfc3RhdGUgPT0gVkZFX1NUQVRFX1NUQVJUX1JFUVVFU1RFRCkgewotCQkJaWYgKHNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19WSURFT19BTkRfUFJFVklFVykgewotCQkJCW1zbV9jYW1lcmFfaW9fdygxLAotCQkJCQlzaGFyZV9jdHJsLT52ZmViYXNlICsgdmZlNDBfQVhJX1dNX0NGR1sKLQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwXSk7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDEsCi0JCQkJCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyB2ZmU0MF9BWElfV01fQ0ZHWwotCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDFdKTsKLQkJCX0gZWxzZSBpZiAoc2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX1BSRVZJRVdfQU5EX1ZJREVPKSB7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDEsCi0JCQkJCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyB2ZmU0MF9BWElfV01fQ0ZHWwotCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDBdKTsKLQkJCQltc21fY2FtZXJhX2lvX3coMSwKLQkJCQkJc2hhcmVfY3RybC0+dmZlYmFzZSArIHZmZTQwX0FYSV9XTV9DRkdbCi0JCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMV0pOwotCQl9Ci0JCQlzaGFyZV9jdHJsLT5yZWNvcmRpbmdfc3RhdGUgPSBWRkVfU1RBVEVfU1RBUlRFRDsKLQkJbXNtX2NhbWVyYV9pb193X21iKDEsCi0JCQkJc2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9SRUdfVVBEQVRFX0NNRCk7Ci0JCUNEQkcoInN0YXJ0IHZpZGVvIHRyaWdnZXJlZCAuXG4iKTsKLQkJfSBlbHNlIGlmIChzaGFyZV9jdHJsLT5yZWNvcmRpbmdfc3RhdGUgPT0KLQkJCVZGRV9TVEFURV9TVE9QX1JFUVVFU1RFRCkgewotCQkJaWYgKHNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19WSURFT19BTkRfUFJFVklFVykgewotCQkJCW1zbV9jYW1lcmFfaW9fdygwLAotCQkJCQlzaGFyZV9jdHJsLT52ZmViYXNlICsgdmZlNDBfQVhJX1dNX0NGR1sKLQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwXSk7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDAsCi0JCQkJCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyB2ZmU0MF9BWElfV01fQ0ZHWwotCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDFdKTsKLQkJCX0gZWxzZSBpZiAoc2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX1BSRVZJRVdfQU5EX1ZJREVPKSB7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDAsCi0JCQkJCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyB2ZmU0MF9BWElfV01fQ0ZHWwotCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDBdKTsKLQkJCQltc21fY2FtZXJhX2lvX3coMCwKLQkJCQkJc2hhcmVfY3RybC0+dmZlYmFzZSArIHZmZTQwX0FYSV9XTV9DRkdbCi0JCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMV0pOwotCQl9Ci0JCUNEQkcoInN0b3AgdmlkZW8gdHJpZ2dlcmVkIC5cbiIpOwotCX0KLQotCQlpZiAoYXRvbWljX2NtcHhjaGcoCi0JCQkmc2hhcmVfY3RybC0+cGl4MF91cGRhdGVfYWNrX3BlbmRpbmcsIDEsIDApID09IDEpIHsKLQkJCXNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgfD0KLQkJCQkoc2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZQotCQkJCSYgfihWRkU0MF9PVVRQVVRfTU9ERV9URVJUSUFSWTF8Ci0JCQkJCVZGRTQwX09VVFBVVF9NT0RFX1RFUlRJQVJZMikpOwotCQl2ZmU0MF9zZW5kX2lzcF9tc2coJnZmZTQwX2N0cmwtPnN1YmRldiwKLQkJCQlzaGFyZV9jdHJsLT52ZmVGcmFtZUlkLCBNU0dfSURfUElYMF9VUERBVEVfQUNLKTsKLQkJCXNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmPQotCQkJCShWRkVfT1VUUFVUU19SREkwfFZGRV9PVVRQVVRTX1JESTApOwotCX0gZWxzZSB7Ci0JCWlmIChzaGFyZV9jdHJsLT5yZWNvcmRpbmdfc3RhdGUgPT0KLQkJCVZGRV9TVEFURV9TVE9QX1JFUVVFU1RFRCkgewotCQkJCXNoYXJlX2N0cmwtPnJlY29yZGluZ19zdGF0ZSA9IFZGRV9TVEFURV9TVE9QUEVEOwotCQkJLyogcmVxdWVzdCBhIHJlZyB1cGRhdGUgYW5kIHNlbmQgU1RPUF9SRUNfQUNLCi0JCQkgKiB3aGVuIHdlIHByb2Nlc3MgdGhlIG5leHQgcmVnIHVwZGF0ZSBpcnEuCi0JCQkgKi8KLQkJCW1zbV9jYW1lcmFfaW9fd19tYigxLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJCVZGRV9SRUdfVVBEQVRFX0NNRCk7Ci0JCX0gZWxzZSBpZiAoc2hhcmVfY3RybC0+cmVjb3JkaW5nX3N0YXRlID09Ci0JCQkJCVZGRV9TVEFURV9TVE9QUEVEKSB7Ci0JCQl2ZmU0MF9zZW5kX2lzcF9tc2coJnZmZTQwX2N0cmwtPnN1YmRldiwKLQkJCQkJc2hhcmVfY3RybC0+dmZlRnJhbWVJZCwKLQkJCQlNU0dfSURfU1RPUF9SRUNfQUNLKTsKLQkJCQlzaGFyZV9jdHJsLT5yZWNvcmRpbmdfc3RhdGUgPSBWRkVfU1RBVEVfSURMRTsKLQkJfQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2hhcmVfY3RybC0+dXBkYXRlX2Fja19sb2NrLCBmbGFncyk7Ci0JCWlmIChzaGFyZV9jdHJsLT51cGRhdGVfYWNrX3BlbmRpbmcgPT0gVFJVRSkgewotCQkJc2hhcmVfY3RybC0+dXBkYXRlX2Fja19wZW5kaW5nID0gRkFMU0U7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAotCQkJCSZzaGFyZV9jdHJsLT51cGRhdGVfYWNrX2xvY2ssIGZsYWdzKTsKLQkJCXZmZTQwX3NlbmRfaXNwX21zZygmdmZlNDBfY3RybC0+c3ViZGV2LAotCQkJCXNoYXJlX2N0cmwtPnZmZUZyYW1lSWQsIE1TR19JRF9VUERBVEVfQUNLKTsKLQkJfSBlbHNlIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCi0JCQkJCSZzaGFyZV9jdHJsLT51cGRhdGVfYWNrX2xvY2ssIGZsYWdzKTsKLQkJfQotCX0KLQotCXN3aXRjaCAoc2hhcmVfY3RybC0+bGl2ZXNob3Rfc3RhdGUpIHsKLQljYXNlIFZGRV9TVEFURV9TVEFSVF9SRVFVRVNURUQ6Ci0JCUNEQkcoIiVzIGVuYWJsaW5nIGxpdmVzaG90IG91dHB1dFxuIiwgX19mdW5jX18pOwotCQkJaWYgKHNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgJgotCQkJVkZFNDBfT1VUUFVUX01PREVfUFJJTUFSWSkgewotCQkJCW1zbV9jYW1lcmFfaW9fdygxLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJdmZlNDBfQVhJX1dNX0NGR1sKLQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwXSk7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDEsIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCQl2ZmU0MF9BWElfV01fQ0ZHWwotCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDFdKTsKLQotCQkJCXNoYXJlX2N0cmwtPmxpdmVzaG90X3N0YXRlID0KLQkJCQlWRkVfU1RBVEVfU1RBUlRFRDsKLQkJCQltc21fY2FtZXJhX2lvX3dfbWIoMSwgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX1JFR19VUERBVEVfQ01EKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFZGRV9TVEFURV9TVEFSVEVEOgotCQlDREJHKCIlcyBkaXNhYmxpbmcgbGl2ZXNob3Qgb3V0cHV0XG4iLCBfX2Z1bmNfXyk7Ci0JCWlmIChzaGFyZV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudCA+PSAxKSB7Ci0JCQlpZiAoc2hhcmVfY3RybC0+dmZlX2NhcHR1cmVfY291bnQgPT0gMSAmJgotCQkJCShzaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICYKLQkJCQlWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZKSkgewotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJdmZlNDBfQVhJX1dNX0NGR1sKLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMF0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygwLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJdmZlNDBfQVhJX1dNX0NGR1sKLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMV0pOwotCQkJCW1zbV9jYW1lcmFfaW9fd19tYigxLCBzaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQkJVkZFX1JFR19VUERBVEVfQ01EKTsKLQkJCX0KLQkJCXNoYXJlX2N0cmwtPnZmZV9jYXB0dXJlX2NvdW50LS07Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRkVfU1RBVEVfU1RPUF9SRVFVRVNURUQ6Ci0JCUNEQkcoIiVzIGRpc2FibGluZyBsaXZlc2hvdCBvdXRwdXQgZnJvbSBzdHJlYW0gb2ZmXG4iLAotCQkJX19mdW5jX18pOwotCQlpZiAoc2hhcmVfY3RybC0+Y29tcF9vdXRwdXRfbW9kZSAmCi0JCQlWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZKSB7Ci0JCQkvKiBTdG9wIHJlcXVlc3RlZCwgc3RvcCB3cml0ZSBtYXN0ZXJzLCBhbmQKLQkJCSAqIHRyaWdnZXIgUkVHX1VQREFURS4gU2VuZCBTVE9QX0xTX0FDSyBpbgotCQkJICogbmV4dCByZWcgdXBkYXRlLiAqLwotCQkJbXNtX2NhbWVyYV9pb193KDAsIHNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTQwX0FYSV9XTV9DRkdbCi0JCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwXSk7Ci0JCQltc21fY2FtZXJhX2lvX3coMCwgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlNDBfQVhJX1dNX0NGR1sKLQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDFdKTsKLQkJCXNoYXJlX2N0cmwtPmxpdmVzaG90X3N0YXRlID0gVkZFX1NUQVRFX1NUT1BQRUQ7Ci0JCQltc21fY2FtZXJhX2lvX3dfbWIoMSwgc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX1JFR19VUERBVEVfQ01EKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFZGRV9TVEFURV9TVE9QUEVEOgotCQlDREJHKCIlcyBTZW5kaW5nIFNUT1BfTFMgQUNLXG4iLCBfX2Z1bmNfXyk7Ci0JCXZmZTQwX3NlbmRfaXNwX21zZygmdmZlNDBfY3RybC0+c3ViZGV2LAotCQkJc2hhcmVfY3RybC0+dmZlRnJhbWVJZCwgTVNHX0lEX1NUT1BfTFNfQUNLKTsKLQkJCXNoYXJlX2N0cmwtPmxpdmVzaG90X3N0YXRlID0gVkZFX1NUQVRFX0lETEU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmICgoc2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJiBWRkVfT1VUUFVUU19USFVNQl9BTkRfTUFJTikgfHwKLQkJKHNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJVkZFX09VVFBVVFNfTUFJTl9BTkRfVEhVTUIpIHx8Ci0JCShzaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmCi0JCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9KUEVHKSB8fAotCQkoc2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQlWRkVfT1VUUFVUU19KUEVHX0FORF9USFVNQikpIHsKLQkJLyogaW4gc25hcHNob3QgbW9kZSAqLwotCQkvKiBsYXRlciB3ZSBuZWVkIHRvIGFkZCBjaGVjayBmb3IgbGl2ZSBzbmFwc2hvdCBtb2RlLiAqLwotCQlpZiAodmZlNDBfY3RybC0+ZnJhbWVfc2tpcF9wYXR0ZXJuICYgKDB4MSA8PAotCQkJKHZmZTQwX2N0cmwtPnNuYXBzaG90X2ZyYW1lX2NudCAlCi0JCQkJdmZlNDBfY3RybC0+ZnJhbWVfc2tpcF9jbnQpKSkgewotCQkJCXNoYXJlX2N0cmwtPnZmZV9jYXB0dXJlX2NvdW50LS07Ci0JCQkvKiBpZiBsYXN0IGZyYW1lIHRvIGJlIGNhcHR1cmVkOiAqLwotCQkJCWlmIChzaGFyZV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudCA9PSAwKSB7Ci0JCQkJCS8qIHN0b3AgdGhlIGJ1cyBvdXRwdXQ6ICovCi0JCQkJCWlmIChzaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlCi0JCQkJCSYgVkZFNDBfT1VUUFVUX01PREVfUFJJTUFSWSkgewotCQkJCQkJbXNtX2NhbWVyYV9pb193KDAsCi0JCQkJCQkJc2hhcmVfY3RybC0+dmZlYmFzZSsKLQkJCQkJCQl2ZmU0MF9BWElfV01fQ0ZHWwotCQkJCQkJCXNoYXJlX2N0cmwtPgotCQkJCQkJCW91dHBhdGgub3V0MC5jaDBdKTsKLQkJCQkJCW1zbV9jYW1lcmFfaW9fdygwLAotCQkJCQkJCXNoYXJlX2N0cmwtPnZmZWJhc2UrCi0JCQkJCQkJdmZlNDBfQVhJX1dNX0NGR1sKLQkJCQkJCQlzaGFyZV9jdHJsLT4KLQkJCQkJCQlvdXRwYXRoLm91dDAuY2gxXSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgJgotCQkJCQkJVkZFNDBfT1VUUFVUX01PREVfU0VDT05EQVJZKSB7Ci0JCQkJCQltc21fY2FtZXJhX2lvX3coMCwKLQkJCQkJCQlzaGFyZV9jdHJsLT52ZmViYXNlKwotCQkJCQkJCXZmZTQwX0FYSV9XTV9DRkdbCi0JCQkJCQkJc2hhcmVfY3RybC0+Ci0JCQkJCQkJb3V0cGF0aC5vdXQxLmNoMF0pOwotCQkJCQkJbXNtX2NhbWVyYV9pb193KDAsCi0JCQkJCQkJc2hhcmVfY3RybC0+dmZlYmFzZSsKLQkJCQkJCQl2ZmU0MF9BWElfV01fQ0ZHWwotCQkJCQkJCXNoYXJlX2N0cmwtPgotCQkJCQkJCW91dHBhdGgub3V0MS5jaDFdKTsKLQkJCQl9Ci0JCQkJbXNtX2NhbWVyYV9pb193X21iCi0JCQkJKENBTUlGX0NPTU1BTkRfU1RPUF9BVF9GUkFNRV9CT1VOREFSWSwKLQkJCQkJc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJCVZGRV9DQU1JRl9DT01NQU5EKTsKLQkJCQl2ZmU0MF9jdHJsLT5zbmFwc2hvdF9mcmFtZV9jbnQgPSAtMTsKLQkJCQl2ZmU0MF9jdHJsLT5mcmFtZV9za2lwX2NudCA9IDMxOwotCQkJCXZmZTQwX2N0cmwtPmZyYW1lX3NraXBfcGF0dGVybiA9IDB4ZmZmZmZmZmY7Ci0JCQl9IC8qaWYgc25hcHNob3QgY291bnQgaXMgMCovCi0JCX0gLyppZiBmcmFtZSBpcyBub3QgYmVpbmcgZHJvcHBlZCovCi0JCXZmZTQwX2N0cmwtPnNuYXBzaG90X2ZyYW1lX2NudCsrOwotCQkvKiB0aGVuIGRvIHJlZ191cGRhdGUuICovCi0JCW1zbV9jYW1lcmFfaW9fdygxLAotCQkJCXNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkVHX1VQREFURV9DTUQpOwotCX0gLyogaWYgc25hcHNob3QgbW9kZS4gKi8KLX0KLX0KLQotc3RhdGljIHZvaWQgdmZlNDBfcHJvY2Vzc19yZGkwX3JlZ191cGRhdGVfaXJxKAotCXN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JaWYgKGF0b21pY19jbXB4Y2hnKAotCQkmdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+cmRpMF91cGRhdGVfYWNrX3BlbmRpbmcsIDIsIDApID09IDIpIHsKLQkJYXhpX3N0b3BfcmRpMCh2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsKTsKLQkJYXhpX2Rpc2FibGVfaXJxKHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwpOwotCQl2ZmU0MF9zZW5kX2lzcF9tc2coJnZmZTQwX2N0cmwtPnN1YmRldiwKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZUZyYW1lSWQsCi0JCQlNU0dfSURfUkRJMF9VUERBVEVfQUNLKTsKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+Y29tcF9vdXRwdXRfbW9kZSAmPQotCQkJflZGRTQwX09VVFBVVF9NT0RFX1RFUlRJQVJZMTsKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICY9Ci0JCQl+KFZGRV9PVVRQVVRTX1JESTApOwotCX0KLQotCWlmIChhdG9taWNfY21weGNoZygKLQkJJnZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTBfdXBkYXRlX2Fja19wZW5kaW5nLCAxLCAwKSA9PSAxKSB7Ci0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgfD0KLQkJCVZGRTQwX09VVFBVVF9NT0RFX1RFUlRJQVJZMTsKLQkJdmZlNDBfc2VuZF9pc3BfbXNnKCZ2ZmU0MF9jdHJsLT5zdWJkZXYsCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmVGcmFtZUlkLAotCQkJTVNHX0lEX1JESTBfVVBEQVRFX0FDSyk7Ci0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmPQotCQkJfihWRkVfT1VUUFVUU19SREkwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTQwX3Byb2Nlc3NfcmRpMV9yZWdfdXBkYXRlX2lycSgKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsKQotewotCWlmIChhdG9taWNfY21weGNoZygKLQkJJnZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTFfdXBkYXRlX2Fja19wZW5kaW5nLCAyLCAwKSA9PSAyKSB7Ci0JCWF4aV9zdG9wX3JkaTEodmZlNDBfY3RybC0+c2hhcmVfY3RybCk7Ci0JCWF4aV9kaXNhYmxlX2lycSh2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsKTsKLQkJdmZlNDBfc2VuZF9pc3BfbXNnKCZ2ZmU0MF9jdHJsLT5zdWJkZXYsCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmVGcmFtZUlkLAotCQkJTVNHX0lEX1JESTFfVVBEQVRFX0FDSyk7Ci0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICY9Ci0JCQkJflZGRTQwX09VVFBVVF9NT0RFX1RFUlRJQVJZMjsKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICY9Ci0JCQl+KFZGRV9PVVRQVVRTX1JESTEpOwotCX0KLQotCWlmIChhdG9taWNfY21weGNoZygKLQkJJnZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTFfdXBkYXRlX2Fja19wZW5kaW5nLCAxLCAwKSA9PSAxKSB7Ci0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPmNvbXBfb3V0cHV0X21vZGUgfD0KLQkJCVZGRTQwX09VVFBVVF9NT0RFX1RFUlRJQVJZMjsKLQkJdmZlNDBfc2VuZF9pc3BfbXNnKCZ2ZmU0MF9jdHJsLT5zdWJkZXYsCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmVGcmFtZUlkLAotCQkJTVNHX0lEX1JESTFfVVBEQVRFX0FDSyk7Ci0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmPQotCQkJfihWRkVfT1VUUFVUU19SREkxKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTQwX3Byb2Nlc3NfcmVzZXRfaXJxKAotCQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlhdG9taWNfc2V0KCZ2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52c3RhdGUsIDApOwotCWF0b21pY19zZXQoJnZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPmhhbmRsZV9jb21tb25faXJxLCAwKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT5zdG9wX2ZsYWdfbG9jaywgZmxhZ3MpOwotCWlmICh2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT5zdG9wX2Fja19wZW5kaW5nKSB7Ci0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnN0b3BfYWNrX3BlbmRpbmcgPSBGQUxTRTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKLQkJCSZ2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT5zdG9wX2ZsYWdfbG9jaywgZmxhZ3MpOwotCQlpZiAodmZlNDBfY3RybC0+c2hhcmVfY3RybC0+c3luY19hYm9ydCkKLQkJCWNvbXBsZXRlKCZ2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT5yZXNldF9jb21wbGV0ZSk7Ci0JCWVsc2UKLQkJdmZlNDBfc2VuZF9pc3BfbXNnKCZ2ZmU0MF9jdHJsLT5zdWJkZXYsCi0JCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlRnJhbWVJZCwKLQkJCQlNU0dfSURfU1RPUF9BQ0spOwotCX0gZWxzZSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCi0JCQkmdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+c3RvcF9mbGFnX2xvY2ssIGZsYWdzKTsKLQkJLyogdGhpcyBpcyBmcm9tIHJlc2V0IGNvbW1hbmQuICovCi0JCXZmZTQwX3Jlc2V0X2ludGVybmFsX3ZhcmlhYmxlcyh2ZmU0MF9jdHJsKTsKLQkJaWYgKHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZV9yZXNldF9mbGFnKSB7Ci0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmVfcmVzZXRfZmxhZyA9IGZhbHNlOwotCQkJbXNtX2NhbWVyYV9pb193KDB4RkYwMCwKLQkJCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0JVU19DTUQpOwotCQl9IGVsc2UgewotCQkvKiByZWxvYWQgYWxsIHdyaXRlIG1hc3RlcnMuIChmcmFtZSAmIGxpbmUpKi8KLQkJbXNtX2NhbWVyYV9pb193KDB4RkY3RiwKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX0NNRCk7Ci0JCX0KLQkJY29tcGxldGUoJnZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnJlc2V0X2NvbXBsZXRlKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTQwX3Byb2Nlc3NfY2FtaWZfc29mX2lycSgKLQkJc3RydWN0IHZmZTQwX2N0cmxfdHlwZSAqdmZlNDBfY3RybCkKLXsKLQlpZiAodmZlNDBfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQlWRkVfT1VUUFVUU19SQVcpIHsKLQkJaWYgKHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnN0YXJ0X2Fja19wZW5kaW5nKQotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+c3RhcnRfYWNrX3BlbmRpbmcgPSBGQUxTRTsKLQotCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmVfY2FwdHVyZV9jb3VudC0tOwotCQkvKiBpZiBsYXN0IGZyYW1lIHRvIGJlIGNhcHR1cmVkOiAqLwotCQlpZiAodmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlX2NhcHR1cmVfY291bnQgPT0gMCkgewotCQkJLyogRW5zdXJlIHRoZSB3cml0ZSBvcmRlciB3aGlsZSB3cml0aW5nCi0JCQkgdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdXNpbmcgdGhlIGJhcnJpZXIgKi8KLQkJCW1zbV9jYW1lcmFfaW9fd19tYihDQU1JRl9DT01NQU5EX1NUT1BfQVRfRlJBTUVfQk9VTkRBUlksCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0NBTUlGX0NPTU1BTkQpOwotCQl9Ci0JfSAvKiBpZiByYXcgc25hcHNob3QgbW9kZS4gKi8KLQlpZiAoKHZmZTQwX2N0cmwtPmhmcl9tb2RlICE9IEhGUl9NT0RFX09GRikgJiYKLQkJKHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQlWRkVfTU9ERV9PRl9PUEVSQVRJT05fVklERU8pICYmCi0JCSh2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmVGcmFtZUlkICUKLQkJCXZmZTQwX2N0cmwtPmhmcl9tb2RlICE9IDApKSB7Ci0JCWlmICh2ZmU0MF9jdHJsLT52ZmVfc29mX2NvdW50X2VuYWJsZSkKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZUZyYW1lSWQrKzsKLQkJQ0RCRygiU2tpcCB0aGUgU09GIG5vdGlmaWNhdGlvbiB3aGVuIEhGUiBlbmFibGVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICh2ZmU0MF9jdHJsLT52ZmVfc29mX2NvdW50X2VuYWJsZSkKLQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlRnJhbWVJZCsrOwotCi0JdmZlNDBfc2VuZF9pc3BfbXNnKCZ2ZmU0MF9jdHJsLT5zdWJkZXYsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZUZyYW1lSWQsIE1TR19JRF9TT0ZfQUNLKTsKLQlDREJHKCJjYW1pZl9zb2ZfaXJxLCBmcmFtZUlkID0gJWRcbiIsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZUZyYW1lSWQpOwotCi0JaWYgKHZmZTQwX2N0cmwtPnN5bmNfdGltZXJfc3RhdGUpIHsKLQkJaWYgKHZmZTQwX2N0cmwtPnN5bmNfdGltZXJfcmVwZWF0X2NvdW50ID09IDApCi0JCQl2ZmU0MF9zeW5jX3RpbWVyX3N0b3AodmZlNDBfY3RybCk7Ci0JCWVsc2UKLQkJCXZmZTQwX2N0cmwtPnN5bmNfdGltZXJfcmVwZWF0X2NvdW50LS07Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB2ZmU0MF9wcm9jZXNzX2Vycm9yX2lycSgKLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwsIHVpbnQzMl90IGVyclN0YXR1cykKLXsKLQl1aW50MzJfdCByZWdfdmFsdWU7Ci0JaWYgKGVyclN0YXR1cyAmIFZGRTQwX0lNQVNLX1ZJT0xBVElPTikgewotCQlwcl9lcnIoInZmZTQwX2lycTogdmlvbGF0aW9uIGludGVycnVwdFxuIik7Ci0JCXJlZ192YWx1ZSA9IG1zbV9jYW1lcmFfaW9fcigKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX1ZJT0xBVElPTl9TVEFUVVMpOwotCQlwcl9lcnIoIiVzOiB2aW9sYXRpb25TdGF0dXMgID0gMHgleFxuIiwgX19mdW5jX18sIHJlZ192YWx1ZSk7Ci0JfQotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTQwX0lNQVNLX0NBTUlGX0VSUk9SKSB7Ci0JCXByX2VycigidmZlNDBfaXJxOiBjYW1pZiBlcnJvcnNcbiIpOwotCQlyZWdfdmFsdWUgPSBtc21fY2FtZXJhX2lvX3IoCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9DQU1JRl9TVEFUVVMpOwotCQl2NGwyX3N1YmRldl9ub3RpZnkoJmF4aV9jdHJsLT5zdWJkZXYsCi0JCQlOT1RJRllfVkZFX0NBTUlGX0VSUk9SLCAodm9pZCAqKU5VTEwpOwotCQlwcl9lcnIoImNhbWlmU3RhdHVzICA9IDB4JXhcbiIsIHJlZ192YWx1ZSk7Ci0JCXZmZTQwX3NlbmRfaXNwX21zZygmYXhpX2N0cmwtPnN1YmRldiwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmVGcmFtZUlkLCBNU0dfSURfQ0FNSUZfRVJST1IpOwotCX0KLQotCWlmIChlcnJTdGF0dXMgJiBWRkU0MF9JTUFTS19CSElTVF9PVldSKQotCQlwcl9lcnIoInZmZTQwX2lycTogc3RhdHMgYmhpc3Qgb3ZlcndyaXRlXG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkU0MF9JTUFTS19TVEFUU19DU19PVldSKQotCQlwcl9lcnIoInZmZTQwX2lycTogc3RhdHMgY3Mgb3ZlcndyaXRlXG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkU0MF9JTUFTS19TVEFUU19JSElTVF9PVldSKQotCQlwcl9lcnIoInZmZTQwX2lycTogc3RhdHMgaWhpc3Qgb3ZlcndyaXRlXG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkU0MF9JTUFTS19SRUFMSUdOX0JVRl9ZX09WRkwpCi0JCXByX2VycigidmZlNDBfaXJxOiByZWFsaWduIGJ1ZyBZIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkU0MF9JTUFTS19SRUFMSUdOX0JVRl9DQl9PVkZMKQotCQlwcl9lcnIoInZmZTQwX2lycTogcmVhbGlnbiBidWcgQ0Igb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTQwX0lNQVNLX1JFQUxJR05fQlVGX0NSX09WRkwpCi0JCXByX2VycigidmZlNDBfaXJxOiByZWFsaWduIGJ1ZyBDUiBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFNDBfSU1BU0tfU1RBVFNfQkVfQlVTX09WRkwpCi0JCXByX2VycigidmZlNDBfaXJxOiBiZSBzdGF0cyBidXMgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTQwX0lNQVNLX1NUQVRTX0JHX0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTQwX2lycTogYmcgc3RhdHMgYnVzIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkU0MF9JTUFTS19TVEFUU19CRl9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmU0MF9pcnE6IGJmIHN0YXRzIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFNDBfSU1BU0tfU1RBVFNfQVdCX0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTQwX2lycTogYXdiIHN0YXRzIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFNDBfSU1BU0tfU1RBVFNfUlNfQlVTX09WRkwpCi0JCXByX2VycigidmZlNDBfaXJxOiBycyBzdGF0cyBidXMgb3ZlcmZsb3dcbiIpOwotCi0JaWYgKGVyclN0YXR1cyAmIFZGRTQwX0lNQVNLX1NUQVRTX0NTX0JVU19PVkZMKQotCQlwcl9lcnIoInZmZTQwX2lycTogY3Mgc3RhdHMgYnVzIG92ZXJmbG93XG4iKTsKLQotCWlmIChlcnJTdGF0dXMgJiBWRkU0MF9JTUFTS19TVEFUU19JSElTVF9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmU0MF9pcnE6IGloaXN0IHN0YXRzIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFNDBfSU1BU0tfU1RBVFNfU0tJTl9CSElTVF9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmU0MF9pcnE6IHNraW4vYmhpc3Qgc3RhdHMgYnVzIG92ZXJmbG93XG4iKTsKLX0KLQotc3RhdGljIHZvaWQgdmZlNDBfcHJvY2Vzc19jb21tb25fZXJyb3JfaXJxKAotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCwgdWludDMyX3QgZXJyU3RhdHVzKQotewotCWlmIChlcnJTdGF0dXMgJiBWRkU0MF9JTUFTS19CVVNfQkRHX0hBTFRfQUNLKQotCQlwcl9lcnIoInZmZTQwX2lycTogQlVTIEJERyBIQUxUIEFDS1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFNDBfSU1BU0tfSU1HX01BU1RfMF9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmU0MF9pcnE6IGltYWdlIG1hc3RlciAwIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFNDBfSU1BU0tfSU1HX01BU1RfMV9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmU0MF9pcnE6IGltYWdlIG1hc3RlciAxIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFNDBfSU1BU0tfSU1HX01BU1RfMl9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmU0MF9pcnE6IGltYWdlIG1hc3RlciAyIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFNDBfSU1BU0tfSU1HX01BU1RfM19CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmU0MF9pcnE6IGltYWdlIG1hc3RlciAzIGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFNDBfSU1BU0tfSU1HX01BU1RfNF9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmU0MF9pcnE6IGltYWdlIG1hc3RlciA0IGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFNDBfSU1BU0tfSU1HX01BU1RfNV9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmU0MF9pcnE6IGltYWdlIG1hc3RlciA1IGJ1cyBvdmVyZmxvd1xuIik7Ci0KLQlpZiAoZXJyU3RhdHVzICYgVkZFNDBfSU1BU0tfSU1HX01BU1RfNl9CVVNfT1ZGTCkKLQkJcHJfZXJyKCJ2ZmU0MF9pcnE6IGltYWdlIG1hc3RlciA2IGJ1cyBvdmVyZmxvd1xuIik7Ci0KLX0KLQotc3RhdGljIHZvaWQgdmZlX3NlbmRfb3V0bXNnKAotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCwgdWludDhfdCBtc2dpZCwKLQl1aW50MzJfdCBjaDBfcGFkZHIsIHVpbnQzMl90IGNoMV9wYWRkciwKLQl1aW50MzJfdCBjaDJfcGFkZHIsIHVpbnQzMl90IGluc3RfaGFuZGxlKQotewotCXN0cnVjdCBpc3BfbXNnX291dHB1dCBtc2c7Ci0KLQltc2cub3V0cHV0X2lkID0gbXNnaWQ7Ci0JbXNnLmJ1Zi5pbnN0X2hhbmRsZSA9IGluc3RfaGFuZGxlOwotCW1zZy5idWYuY2hfcGFkZHJbMF0JPSBjaDBfcGFkZHI7Ci0JbXNnLmJ1Zi5jaF9wYWRkclsxXQk9IGNoMV9wYWRkcjsKLQltc2cuYnVmLmNoX3BhZGRyWzJdCT0gY2gyX3BhZGRyOwotCXN3aXRjaCAobXNnaWQpIHsKLQljYXNlIE1TR19JRF9PVVRQVVRfVEVSVElBUlkxOgotCQltc2cuZnJhbWVDb3VudGVyID0gYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTBGcmFtZUlkOwotCQlicmVhazsKLQljYXNlIE1TR19JRF9PVVRQVVRfVEVSVElBUlkyOgotCQltc2cuZnJhbWVDb3VudGVyID0gYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTFGcmFtZUlkOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQltc2cuZnJhbWVDb3VudGVyID0gYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZUZyYW1lSWQ7Ci0JCWJyZWFrOwotCX0KLQotCXY0bDJfc3ViZGV2X25vdGlmeSgmYXhpX2N0cmwtPnN1YmRldiwKLQkJCU5PVElGWV9WRkVfTVNHX09VVCwKLQkJCSZtc2cpOwotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgdmZlNDBfcHJvY2Vzc19vdXRwdXRfcGF0aF9pcnFfMCgKLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwpCi17Ci0JdWludDMyX3QgcGluZ19wb25nOwotCXVpbnQzMl90IGNoMF9wYWRkciwgY2gxX3BhZGRyLCBjaDJfcGFkZHI7Ci0JdWludDhfdCBvdXRfYm9vbCA9IDA7Ci0Jc3RydWN0IG1zbV9mcmVlX2J1ZiAqZnJlZV9idWYgPSBOVUxMOwotCi0JZnJlZV9idWYgPSB2ZmU0MF9jaGVja19mcmVlX2J1ZmZlcihWRkVfTVNHX09VVFBVVF9JUlEsCi0JCVZGRV9NU0dfT1VUUFVUX1BSSU1BUlksIGF4aV9jdHJsKTsKLQotCS8qIHdlIHJlbmRlciBmcmFtZXMgaW4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCTEuIENvbnRpbnVvdXMgbW9kZSBhbmQgdGhlIGZyZWUgYnVmZmVyIGlzIGF2YWlhbGFibGUuCi0JMi4gSW4gc25hcHNob3Qgc2hvdCBtb2RlLCBmcmVlIGJ1ZmZlciBpcyBub3QgYWx3YXlzIGF2YWlsYWJsZS4KLQl3aGVuIHBlbmRpbmcgc25hcHNob3QgY291bnQgaXMgPD0xLCAgdGhlbiBubyBuZWVkIHRvIHVzZQotCWZyZWUgYnVmZmVyLgotCSovCi0Jb3V0X2Jvb2wgPSAoCi0JCShheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJVkZFX09VVFBVVFNfVEhVTUJfQU5EX01BSU4gfHwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCVZGRV9PVVRQVVRTX01BSU5fQU5EX1RIVU1CIHx8Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmCi0JCQlWRkVfT1VUUFVUU19USFVNQl9BTkRfSlBFRyB8fAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJVkZFX09VVFBVVFNfSlBFR19BTkRfVEhVTUIgfHwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCVZGRV9PVVRQVVRTX1JBVyB8fAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPT0KLQkJCVZGRV9TVEFURV9TVEFSVEVEIHx8Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5saXZlc2hvdF9zdGF0ZSA9PQotCQkJVkZFX1NUQVRFX1NUT1BfUkVRVUVTVEVEIHx8Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5saXZlc2hvdF9zdGF0ZSA9PQotCQkJVkZFX1NUQVRFX1NUT1BQRUQpICYmCi0JCShheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlX2NhcHR1cmVfY291bnQgPD0gMSkpIHx8Ci0JCQlmcmVlX2J1ZjsKLQotCWlmIChvdXRfYm9vbCkgewotCQlwaW5nX3BvbmcgPSBtc21fY2FtZXJhX2lvX3IoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0JVU19QSU5HX1BPTkdfU1RBVFVTKTsKLQotCQkvKiBDaGFubmVsIDAqLwotCQljaDBfcGFkZHIgPSB2ZmU0MF9nZXRfY2hfYWRkcigKLQkJCXBpbmdfcG9uZywgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMCk7Ci0JCS8qIENoYW5uZWwgMSovCi0JCWNoMV9wYWRkciA9IHZmZTQwX2dldF9jaF9hZGRyKAotCQkJcGluZ19wb25nLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxKTsKLQkJLyogQ2hhbm5lbCAyKi8KLQkJY2gyX3BhZGRyID0gdmZlNDBfZ2V0X2NoX2FkZHIoCi0JCQlwaW5nX3BvbmcsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDIpOwotCi0JCUNEQkcoIm91dHB1dCBwYXRoIDAsIGNoMCA9IDB4JXgsIGNoMSA9IDB4JXgsIGNoMiA9IDB4JXhcbiIsCi0JCQljaDBfcGFkZHIsIGNoMV9wYWRkciwgY2gyX3BhZGRyKTsKLQkJaWYgKGZyZWVfYnVmKSB7Ci0JCQkvKiBZIGNoYW5uZWwgKi8KLQkJCXZmZTQwX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDAsCi0JCQlmcmVlX2J1Zi0+Y2hfcGFkZHJbMF0pOwotCQkJLyogQ2hyb21hIGNoYW5uZWwgKi8KLQkJCXZmZTQwX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDEsCi0JCQlmcmVlX2J1Zi0+Y2hfcGFkZHJbMV0pOwotCQkJaWYgKGZyZWVfYnVmLT5udW1fcGxhbmVzID4gMikKLQkJCQl2ZmU0MF9wdXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLAotCQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMiwKLQkJCQkJZnJlZV9idWYtPmNoX3BhZGRyWzJdKTsKLQkJfQotCQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19USFVNQl9BTkRfTUFJTiB8fAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19NQUlOX0FORF9USFVNQiB8fAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19USFVNQl9BTkRfSlBFRyB8fAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19KUEVHX0FORF9USFVNQiB8fAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19SQVcgfHwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5saXZlc2hvdF9zdGF0ZSA9PQotCQkJCVZGRV9TVEFURV9TVE9QUEVEKQotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jYXB0dXJlX2NudC0tOwotCi0JCXZmZV9zZW5kX291dG1zZyhheGlfY3RybCwKLQkJCU1TR19JRF9PVVRQVVRfUFJJTUFSWSwgY2gwX3BhZGRyLAotCQkJY2gxX3BhZGRyLCBjaDJfcGFkZHIsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmluc3RfaGFuZGxlKTsKLQotCX0gZWxzZSB7Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuZnJhbWVfZHJvcF9jbnQrKzsKLQkJQ0RCRygicGF0aF9pcnFfMCAtIG5vIGZyZWUgYnVmZmVyIVxuIik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB2ZmU0MF9wcm9jZXNzX291dHB1dF9wYXRoX2lycV8xKAotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCkKLXsKLQl1aW50MzJfdCBwaW5nX3Bvbmc7Ci0JdWludDMyX3QgY2gwX3BhZGRyLCBjaDFfcGFkZHIsIGNoMl9wYWRkcjsKLQkvKiB0aGlzIG11c3QgYmUgc25hcHNob3QgbWFpbiBpbWFnZSBvdXRwdXQuICovCi0JdWludDhfdCBvdXRfYm9vbCA9IDA7Ci0Jc3RydWN0IG1zbV9mcmVlX2J1ZiAqZnJlZV9idWYgPSBOVUxMOwotCi0JZnJlZV9idWYgPSB2ZmU0MF9jaGVja19mcmVlX2J1ZmZlcihWRkVfTVNHX09VVFBVVF9JUlEsCi0JCVZGRV9NU0dfT1VUUFVUX1NFQ09OREFSWSwgYXhpX2N0cmwpOwotCW91dF9ib29sID0gKChheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9NQUlOIHx8Ci0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX01BSU5fQU5EX1RIVU1CIHx8Ci0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX1JBVyB8fAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19KUEVHX0FORF9USFVNQikgJiYKLQkJCShheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlX2NhcHR1cmVfY291bnQgPD0gMSkpIHx8Ci0JCQkJZnJlZV9idWY7Ci0KLQlpZiAob3V0X2Jvb2wpIHsKLQkJcGluZ19wb25nID0gbXNtX2NhbWVyYV9pb19yKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfUElOR19QT05HX1NUQVRVUyk7Ci0KLQkJLyogWSBjaGFubmVsICovCi0JCWNoMF9wYWRkciA9IHZmZTQwX2dldF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDApOwotCQkvKiBDaHJvbWEgY2hhbm5lbCAqLwotCQljaDFfcGFkZHIgPSB2ZmU0MF9nZXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxKTsKLQkJY2gyX3BhZGRyID0gdmZlNDBfZ2V0X2NoX2FkZHIocGluZ19wb25nLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMik7Ci0KLQkJQ0RCRygiJXMgY2gwID0gMHgleCwgY2gxID0gMHgleCwgY2gyID0gMHgleFxuIiwKLQkJCV9fZnVuY19fLCBjaDBfcGFkZHIsIGNoMV9wYWRkciwgY2gyX3BhZGRyKTsKLQkJaWYgKGZyZWVfYnVmKSB7Ci0JCQkvKiBZIGNoYW5uZWwgKi8KLQkJCXZmZTQwX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDAsCi0JCQlmcmVlX2J1Zi0+Y2hfcGFkZHJbMF0pOwotCQkJLyogQ2hyb21hIGNoYW5uZWwgKi8KLQkJCXZmZTQwX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDEsCi0JCQlmcmVlX2J1Zi0+Y2hfcGFkZHJbMV0pOwotCQkJaWYgKGZyZWVfYnVmLT5udW1fcGxhbmVzID4gMikKLQkJCQl2ZmU0MF9wdXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLAotCQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMiwKLQkJCQkJZnJlZV9idWYtPmNoX3BhZGRyWzJdKTsKLQkJfQotCQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19USFVNQl9BTkRfTUFJTiB8fAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19NQUlOX0FORF9USFVNQiB8fAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19SQVcgfHwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmCi0JCQkJVkZFX09VVFBVVFNfSlBFR19BTkRfVEhVTUIpCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNhcHR1cmVfY250LS07Ci0KLQkJdmZlX3NlbmRfb3V0bXNnKGF4aV9jdHJsLAotCQkJTVNHX0lEX09VVFBVVF9TRUNPTkRBUlksIGNoMF9wYWRkciwKLQkJCWNoMV9wYWRkciwgY2gyX3BhZGRyLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5pbnN0X2hhbmRsZSk7Ci0KLQl9IGVsc2UgewotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmZyYW1lX2Ryb3BfY250Kys7Ci0JCUNEQkcoInBhdGhfaXJxXzEgLSBubyBmcmVlIGJ1ZmZlciFcbiIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlNDBfcHJvY2Vzc19vdXRwdXRfcGF0aF9pcnFfcmRpMCgKLQkJCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCkKLXsKLQl1aW50MzJfdCBwaW5nX3Bvbmc7Ci0JdWludDMyX3QgY2gwX3BhZGRyID0gMDsKLQkvKiB0aGlzIG11c3QgYmUgcmRpIGltYWdlIG91dHB1dC4gKi8KLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmICpmcmVlX2J1ZiA9IE5VTEw7Ci0JLypSREkwKi8KLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYgVkZFX09VVFBVVFNfUkRJMCkgewotCQlmcmVlX2J1ZiA9IHZmZTQwX2NoZWNrX2ZyZWVfYnVmZmVyKFZGRV9NU0dfT1VUUFVUX0lSUSwKLQkJCVZGRV9NU0dfT1VUUFVUX1RFUlRJQVJZMSwgYXhpX2N0cmwpOwotCQlpZiAoZnJlZV9idWYpIHsKLQkJCXBpbmdfcG9uZyA9IG1zbV9jYW1lcmFfaW9fcihheGlfY3RybC0+Ci0JCQkJc2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX0JVU19QSU5HX1BPTkdfU1RBVFVTKTsKLQotCQkJLyogWSBvbmx5IGNoYW5uZWwgKi8KLQkJCWNoMF9wYWRkciA9IHZmZTQwX2dldF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmNoMCk7Ci0KLQkJCXByX2RlYnVnKCIlcyBjaDAgPSAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBjaDBfcGFkZHIpOwotCi0JCQkvKiBZIGNoYW5uZWwgKi8KLQkJCXZmZTQwX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmNoMCwKLQkJCQlmcmVlX2J1Zi0+Y2hfcGFkZHJbMF0pOwotCi0JCQl2ZmVfc2VuZF9vdXRtc2coYXhpX2N0cmwsCi0JCQkJTVNHX0lEX09VVFBVVF9URVJUSUFSWTEsIGNoMF9wYWRkciwKLQkJCQkwLCAwLAotCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDIuaW5zdF9oYW5kbGUpOwotCi0JCX0gZWxzZSB7Ci0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmZyYW1lX2Ryb3BfY250Kys7Ci0JCQlwcl9lcnIoInBhdGhfaXJxXzIgaXJxIC0gbm8gZnJlZSBidWZmZXIgZm9yIHJkaTAhXG4iKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlNDBfcHJvY2Vzc19vdXRwdXRfcGF0aF9pcnFfcmRpMSgKLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwpCi17Ci0JdWludDMyX3QgcGluZ19wb25nOwotCXVpbnQzMl90IGNoMF9wYWRkciA9IDA7Ci0JLyogdGhpcyBtdXN0IGJlIHJkaSBpbWFnZSBvdXRwdXQuICovCi0Jc3RydWN0IG1zbV9mcmVlX2J1ZiAqZnJlZV9idWYgPSBOVUxMOwotCS8qUkRJMSovCi0JaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmIFZGRV9PVVRQVVRTX1JESTEpIHsKLQkJZnJlZV9idWYgPSB2ZmU0MF9jaGVja19mcmVlX2J1ZmZlcihWRkVfTVNHX09VVFBVVF9JUlEsCi0JCQlWRkVfTVNHX09VVFBVVF9URVJUSUFSWTIsIGF4aV9jdHJsKTsKLQkJaWYgKGZyZWVfYnVmKSB7Ci0JCQlwaW5nX3BvbmcgPSBtc21fY2FtZXJhX2lvX3IoYXhpX2N0cmwtPgotCQkJCXNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCVZGRV9CVVNfUElOR19QT05HX1NUQVRVUyk7Ci0KLQkJCS8qIFkgY2hhbm5lbCAqLwotCQkJY2gwX3BhZGRyID0gdmZlNDBfZ2V0X2NoX2FkZHIocGluZ19wb25nLAotCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLAotCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDMuY2gwKTsKLQkJCXByX2RlYnVnKCIlcyBjaDAgPSAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBjaDBfcGFkZHIpOwotCi0JCQkvKiBZIGNoYW5uZWwgKi8KLQkJCXZmZTQwX3B1dF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQzLmNoMCwKLQkJCQlmcmVlX2J1Zi0+Y2hfcGFkZHJbMF0pOwotCi0JCQl2ZmVfc2VuZF9vdXRtc2coYXhpX2N0cmwsCi0JCQkJTVNHX0lEX09VVFBVVF9URVJUSUFSWTIsIGNoMF9wYWRkciwKLQkJCQkwLCAwLAotCQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDMuaW5zdF9oYW5kbGUpOwotCQl9IGVsc2UgewotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0My5mcmFtZV9kcm9wX2NudCsrOwotCQkJcHJfZXJyKCJwYXRoX2lycSBpcnEgLSBubyBmcmVlIGJ1ZmZlciBmb3IgcmRpMSFcbiIpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdWludDMyX3QgIHZmZTQwX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbigKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsLAotCXVpbnQzMl90IHN0YXRzTnVtLCB1aW50MzJfdCBuZXdBZGRyKQotewotCXVpbnQzMl90IHBpbmdwb25nU3RhdHVzOwotCXVpbnQzMl90IHJldHVybkFkZHI7Ci0JdWludDMyX3QgcGluZ3BvbmdBZGRyOwotCi0JLyogbXVzdCBiZSAwPXBpbmcsIDE9cG9uZyAqLwotCXBpbmdwb25nU3RhdHVzID0KLQkJKChtc21fY2FtZXJhX2lvX3IodmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9CVVNfUElOR19QT05HX1NUQVRVUykpCi0JJiAoKHVpbnQzMl90KSgxPDwoc3RhdHNOdW0gKyA3KSkpKSA+PiAoc3RhdHNOdW0gKyA3KTsKLQkvKiBzdGF0cyBiaXRzIHN0YXJ0cyBhdCA3ICovCi0JQ0RCRygiJXM6c3RhdHNOdW0gJWQsIHBpbmdwb25nU3RhdHVzICVkXG4iLCBfX2Z1bmNfXywKLQkJIHN0YXRzTnVtLCBwaW5ncG9uZ1N0YXR1cyk7Ci0JcGluZ3BvbmdBZGRyID0KLQkJKCh1aW50MzJfdCkodmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX0JVU19TVEFUU19QSU5HX1BPTkdfQkFTRSkpICsKLQkJCQkoVkZFX1NUQVRTX0JVU19SRUdfTlVNKnN0YXRzTnVtKSo0ICsKLQkJCQkoMS1waW5ncG9uZ1N0YXR1cykqNDsKLQlyZXR1cm5BZGRyID0gbXNtX2NhbWVyYV9pb19yKCh1aW50MzJfdCAqKXBpbmdwb25nQWRkcik7Ci0JbXNtX2NhbWVyYV9pb193KG5ld0FkZHIsICh1aW50MzJfdCAqKXBpbmdwb25nQWRkcik7Ci0JcmV0dXJuIHJldHVybkFkZHI7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9zZW5kX3N0YXRzX21zZygKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsLAotCXVpbnQzMl90IGJ1ZkFkZHJlc3MsIHVpbnQzMl90IHN0YXRzTnVtKQotewotCWludCByYyA9IDA7Ci0Jdm9pZCAqdmFkZHIgPSBOVUxMOwotCS8qIGZpbGwgbWVzc2FnZSB3aXRoIHJpZ2h0IGNvbnRlbnQuICovCi0JLyogQHRvZG8gVGhpcyBpcyBjYXVzaW5nIGlzc3VlcywgbmVlZCBmdXJ0aGVyIGludmVzdGlnYXRlICovCi0JLyogc3Bpbl9sb2NrX2lycXNhdmUoJmN0cmwtPnN0YXRlX2xvY2ssIGZsYWdzKTsgKi8KLQlzdHJ1Y3QgaXNwX21zZ19zdGF0cyBtc2dTdGF0czsKLQl1aW50MzJfdCBzdGF0c190eXBlOwotCW1zZ1N0YXRzLmZyYW1lQ291bnRlciA9IHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZUZyYW1lSWQ7Ci0JaWYgKHZmZTQwX2N0cmwtPnNpbXVsdGFuZW91c19zb2Zfc3RhdCkKLQkJbXNnU3RhdHMuZnJhbWVDb3VudGVyLS07Ci0JbXNnU3RhdHMuYnVmZmVyID0gYnVmQWRkcmVzczsKLQlzd2l0Y2ggKHN0YXRzTnVtKSB7Ci0JY2FzZSBzdGF0c0JnTnVtOnsKLQkJbXNnU3RhdHMuaWQgPSBNU0dfSURfU1RBVFNfQkc7Ci0JCXN0YXRzX3R5cGUgPSBNU01fU1RBVFNfVFlQRV9CRzsKLQkJcmMgPSB2ZmU0MF9jdHJsLT5zdGF0c19vcHMuZGlzcGF0Y2goCi0JCQkJdmZlNDBfY3RybC0+c3RhdHNfb3BzLnN0YXRzX2N0cmwsCi0JCQkJc3RhdHNfdHlwZSwgYnVmQWRkcmVzcywKLQkJCQkmbXNnU3RhdHMuYnVmX2lkeCwgJnZhZGRyLCAmbXNnU3RhdHMuZmQsCi0JCQkJdmZlNDBfY3RybC0+c3RhdHNfb3BzLmNsaWVudCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBzdGF0c0JlTnVtOnsKLQkJbXNnU3RhdHMuaWQgPSBNU0dfSURfU1RBVFNfQkU7Ci0JCXN0YXRzX3R5cGUgPSBNU01fU1RBVFNfVFlQRV9CRTsKLQkJcmMgPSB2ZmU0MF9jdHJsLT5zdGF0c19vcHMuZGlzcGF0Y2goCi0JCQkJdmZlNDBfY3RybC0+c3RhdHNfb3BzLnN0YXRzX2N0cmwsCi0JCQkJc3RhdHNfdHlwZSwgYnVmQWRkcmVzcywKLQkJCQkmbXNnU3RhdHMuYnVmX2lkeCwgJnZhZGRyLCAmbXNnU3RhdHMuZmQsCi0JCQkJdmZlNDBfY3RybC0+c3RhdHNfb3BzLmNsaWVudCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBzdGF0c0JmTnVtOnsKLQkJbXNnU3RhdHMuaWQgPSBNU0dfSURfU1RBVFNfQkY7Ci0JCXN0YXRzX3R5cGUgPSAgTVNNX1NUQVRTX1RZUEVfQkY7Ci0JCXJjID0gdmZlNDBfY3RybC0+c3RhdHNfb3BzLmRpc3BhdGNoKAotCQkJCXZmZTQwX2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsLAotCQkJCXN0YXRzX3R5cGUsIGJ1ZkFkZHJlc3MsCi0JCQkJJm1zZ1N0YXRzLmJ1Zl9pZHgsICZ2YWRkciwgJm1zZ1N0YXRzLmZkLAotCQkJCXZmZTQwX2N0cmwtPnN0YXRzX29wcy5jbGllbnQpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2Ugc3RhdHNBd2JOdW06IHsKLQkJbXNnU3RhdHMuaWQgPSBNU0dfSURfU1RBVFNfQVdCOwotCQlyYyA9IHZmZTQwX2N0cmwtPnN0YXRzX29wcy5kaXNwYXRjaCgKLQkJCQl2ZmU0MF9jdHJsLT5zdGF0c19vcHMuc3RhdHNfY3RybCwKLQkJCQlNU01fU1RBVFNfVFlQRV9BV0IsIGJ1ZkFkZHJlc3MsCi0JCQkJJm1zZ1N0YXRzLmJ1Zl9pZHgsICZ2YWRkciwgJm1zZ1N0YXRzLmZkLAotCQkJCXZmZTQwX2N0cmwtPnN0YXRzX29wcy5jbGllbnQpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBzdGF0c0loaXN0TnVtOiB7Ci0JCW1zZ1N0YXRzLmlkID0gTVNHX0lEX1NUQVRTX0lISVNUOwotCQlyYyA9IHZmZTQwX2N0cmwtPnN0YXRzX29wcy5kaXNwYXRjaCgKLQkJCQl2ZmU0MF9jdHJsLT5zdGF0c19vcHMuc3RhdHNfY3RybCwKLQkJCQlNU01fU1RBVFNfVFlQRV9JSElTVCwgYnVmQWRkcmVzcywKLQkJCQkmbXNnU3RhdHMuYnVmX2lkeCwgJnZhZGRyLCAmbXNnU3RhdHMuZmQsCi0JCQkJdmZlNDBfY3RybC0+c3RhdHNfb3BzLmNsaWVudCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBzdGF0c1JzTnVtOiB7Ci0JCW1zZ1N0YXRzLmlkID0gTVNHX0lEX1NUQVRTX1JTOwotCQlyYyA9IHZmZTQwX2N0cmwtPnN0YXRzX29wcy5kaXNwYXRjaCgKLQkJCQl2ZmU0MF9jdHJsLT5zdGF0c19vcHMuc3RhdHNfY3RybCwKLQkJCQlNU01fU1RBVFNfVFlQRV9SUywgYnVmQWRkcmVzcywKLQkJCQkmbXNnU3RhdHMuYnVmX2lkeCwgJnZhZGRyLCAmbXNnU3RhdHMuZmQsCi0JCQkJdmZlNDBfY3RybC0+c3RhdHNfb3BzLmNsaWVudCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBzdGF0c0NzTnVtOiB7Ci0JCW1zZ1N0YXRzLmlkID0gTVNHX0lEX1NUQVRTX0NTOwotCQlyYyA9IHZmZTQwX2N0cmwtPnN0YXRzX29wcy5kaXNwYXRjaCgKLQkJCQl2ZmU0MF9jdHJsLT5zdGF0c19vcHMuc3RhdHNfY3RybCwKLQkJCQlNU01fU1RBVFNfVFlQRV9DUywgYnVmQWRkcmVzcywKLQkJCQkmbXNnU3RhdHMuYnVmX2lkeCwgJnZhZGRyLCAmbXNnU3RhdHMuZmQsCi0JCQkJdmZlNDBfY3RybC0+c3RhdHNfb3BzLmNsaWVudCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBzdGF0c1NraW5OdW06IHsKLQkJbXNnU3RhdHMuaWQgPSBNU0dfSURfU1RBVFNfQkhJU1Q7Ci0JCXJjID0gdmZlNDBfY3RybC0+c3RhdHNfb3BzLmRpc3BhdGNoKAotCQkJCXZmZTQwX2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsLAotCQkJCU1TTV9TVEFUU19UWVBFX0JISVNULCBidWZBZGRyZXNzLAotCQkJCSZtc2dTdGF0cy5idWZfaWR4LCAmdmFkZHIsICZtc2dTdGF0cy5mZCwKLQkJCQl2ZmU0MF9jdHJsLT5zdGF0c19vcHMuY2xpZW50KTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWdvdG8gc3RhdHNfZG9uZTsKLQl9Ci0JaWYgKHJjID09IDApIHsKLQkJbXNnU3RhdHMuYnVmZmVyID0gKHVpbnQzMl90KXZhZGRyOwotCQl2NGwyX3N1YmRldl9ub3RpZnkoJnZmZTQwX2N0cmwtPnN1YmRldiwKLQkJCU5PVElGWV9WRkVfTVNHX1NUQVRTLAotCQkJJm1zZ1N0YXRzKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBwYWRkciB0byBpZHggbWFwcGluZyBlcnJvciwgc3RhdHNfaWQgPSAlZCwgcGFkZHIgPSAweCVkIiwKLQkJCSBfX2Z1bmNfXywgbXNnU3RhdHMuaWQsIG1zZ1N0YXRzLmJ1ZmZlcik7Ci0JfQotc3RhdHNfZG9uZToKLQkvKiBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHJsLT5zdGF0ZV9sb2NrLCBmbGFncyk7ICovCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfc2VuZF9jb21wX3N0YXRzX21zZygKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsLCB1aW50MzJfdCBzdGF0dXNfYml0cykKLXsKLQlzdHJ1Y3QgbXNtX3N0YXRzX2J1ZiBtc2dTdGF0czsKLQl1aW50MzJfdCB0ZW1wOwotCi0JbXNnU3RhdHMuZnJhbWVfaWQgPSB2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmVGcmFtZUlkOwotCWlmICh2ZmU0MF9jdHJsLT5zaW11bHRhbmVvdXNfc29mX3N0YXQpCi0JCW1zZ1N0YXRzLmZyYW1lX2lkLS07Ci0KLQltc2dTdGF0cy5zdGF0dXNfYml0cyA9IHN0YXR1c19iaXRzOwotCi0JbXNnU3RhdHMuYWVjLmJ1ZmYgPSB2ZmU0MF9jdHJsLT5iZ1N0YXRzQ29udHJvbC5idWZUb1JlbmRlcjsKLQltc2dTdGF0cy5hd2IuYnVmZiA9IHZmZTQwX2N0cmwtPmF3YlN0YXRzQ29udHJvbC5idWZUb1JlbmRlcjsKLQltc2dTdGF0cy5hZi5idWZmID0gdmZlNDBfY3RybC0+YmZTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXI7Ci0KLQltc2dTdGF0cy5paGlzdC5idWZmID0gdmZlNDBfY3RybC0+aWhpc3RTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXI7Ci0JbXNnU3RhdHMucnMuYnVmZiA9IHZmZTQwX2N0cmwtPnJzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyOwotCW1zZ1N0YXRzLmNzLmJ1ZmYgPSB2ZmU0MF9jdHJsLT5jc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlcjsKLQotCXRlbXAgPSBtc21fY2FtZXJhX2lvX3IoCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfU1RBVFNfQVdCX1NHV19DRkcpOwotCW1zZ1N0YXRzLmF3Yl95bWluID0gKDB4RkYwMCAmIHRlbXApID4+IDg7Ci0KLQl2NGwyX3N1YmRldl9ub3RpZnkoJnZmZTQwX2N0cmwtPnN1YmRldiwKLQkJCQlOT1RJRllfVkZFX01TR19DT01QX1NUQVRTLAotCQkJCSZtc2dTdGF0cyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTQwX3Byb2Nlc3Nfc3RhdHNfYmVfaXJxKHN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50MzJfdCBhZGRyOwotCXVpbnQzMl90IHN0YXRzX3R5cGU7Ci0Jc3RhdHNfdHlwZSA9IE1TTV9TVEFUU19UWVBFX0JFOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlhZGRyID0gKHVpbnQzMl90KXZmZTQwX3N0YXRzX2RxYnVmKHZmZTQwX2N0cmwsIHN0YXRzX3R5cGUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmIChhZGRyKSB7Ci0JCXZmZTQwX2N0cmwtPmJlU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCXZmZTQwX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbih2ZmU0MF9jdHJsLCBzdGF0c0JlTnVtLAotCQkJYWRkcik7Ci0KLQkJdmZlX3NlbmRfc3RhdHNfbXNnKHZmZTQwX2N0cmwsCi0JCQl2ZmU0MF9jdHJsLT5iZVN0YXRzQ29udHJvbC5idWZUb1JlbmRlciwgc3RhdHNCZU51bSk7Ci0JfSBlbHNlewotCQl2ZmU0MF9jdHJsLT5iZVN0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCUNEQkcoIiVzOiBkcm9wcGVkU3RhdHNGcmFtZUNvdW50ID0gJWQiLCBfX2Z1bmNfXywKLQkJCXZmZTQwX2N0cmwtPmJlU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlNDBfcHJvY2Vzc19zdGF0c19iZ19pcnEoc3RydWN0IHZmZTQwX2N0cmxfdHlwZSAqdmZlNDBfY3RybCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IGFkZHI7Ci0JdWludDMyX3Qgc3RhdHNfdHlwZTsKLQlzdGF0c190eXBlID0gTVNNX1NUQVRTX1RZUEVfQkc7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlNDBfc3RhdHNfZHFidWYodmZlNDBfY3RybCwgc3RhdHNfdHlwZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlNDBfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0JaWYgKGFkZHIpIHsKLQkJdmZlNDBfY3RybC0+YmdTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPQotCQkJdmZlNDBfcHJvY2Vzc19zdGF0c19pcnFfY29tbW9uKHZmZTQwX2N0cmwsIHN0YXRzQmdOdW0sCi0JCQlhZGRyKTsKLQotCQl2ZmVfc2VuZF9zdGF0c19tc2codmZlNDBfY3RybCwKLQkJCXZmZTQwX2N0cmwtPmJnU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyLCBzdGF0c0JnTnVtKTsKLQl9IGVsc2V7Ci0JCXZmZTQwX2N0cmwtPmJnU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQrKzsKLQkJQ0RCRygiJXM6IGRyb3BwZWRTdGF0c0ZyYW1lQ291bnQgPSAlZCIsIF9fZnVuY19fLAotCQkJdmZlNDBfY3RybC0+YmdTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB2ZmU0MF9wcm9jZXNzX3N0YXRzX2F3Yl9pcnEoc3RydWN0IHZmZTQwX2N0cmxfdHlwZSAqdmZlNDBfY3RybCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IGFkZHI7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlNDBfc3RhdHNfZHFidWYodmZlNDBfY3RybCwgTVNNX1NUQVRTX1RZUEVfQVdCKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoYWRkcikgewotCQl2ZmU0MF9jdHJsLT5hd2JTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPQotCQkJdmZlNDBfcHJvY2Vzc19zdGF0c19pcnFfY29tbW9uKHZmZTQwX2N0cmwsIHN0YXRzQXdiTnVtLAotCQkJYWRkcik7Ci0KLQkJdmZlX3NlbmRfc3RhdHNfbXNnKHZmZTQwX2N0cmwsCi0JCQl2ZmU0MF9jdHJsLT5hd2JTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIsIHN0YXRzQXdiTnVtKTsKLQl9IGVsc2V7Ci0JCXZmZTQwX2N0cmwtPmF3YlN0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCUNEQkcoIiVzOiBkcm9wcGVkU3RhdHNGcmFtZUNvdW50ID0gJWQiLCBfX2Z1bmNfXywKLQkJCXZmZTQwX2N0cmwtPmF3YlN0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTQwX3Byb2Nlc3Nfc3RhdHNfYmZfaXJxKHN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50MzJfdCBhZGRyOwotCXVpbnQzMl90IHN0YXRzX3R5cGU7Ci0Jc3RhdHNfdHlwZSA9IE1TTV9TVEFUU19UWVBFX0JGOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlhZGRyID0gKHVpbnQzMl90KXZmZTQwX3N0YXRzX2RxYnVmKHZmZTQwX2N0cmwsIHN0YXRzX3R5cGUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmIChhZGRyKSB7Ci0JCXZmZTQwX2N0cmwtPmJmU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCXZmZTQwX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbih2ZmU0MF9jdHJsLCBzdGF0c0JmTnVtLAotCQkJYWRkcik7Ci0KLQkJdmZlX3NlbmRfc3RhdHNfbXNnKHZmZTQwX2N0cmwsCi0JCQl2ZmU0MF9jdHJsLT5iZlN0YXRzQ29udHJvbC5idWZUb1JlbmRlciwgc3RhdHNCZk51bSk7Ci0JfSBlbHNlewotCQl2ZmU0MF9jdHJsLT5iZlN0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCUNEQkcoIiVzOiBkcm9wcGVkU3RhdHNGcmFtZUNvdW50ID0gJWQiLCBfX2Z1bmNfXywKLQkJCXZmZTQwX2N0cmwtPmJmU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlNDBfcHJvY2Vzc19zdGF0c19iaGlzdF9pcnEoc3RydWN0IHZmZTQwX2N0cmxfdHlwZSAqdmZlNDBfY3RybCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IGFkZHI7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlNDBfc3RhdHNfZHFidWYodmZlNDBfY3RybCwgTVNNX1NUQVRTX1RZUEVfQkhJU1QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmIChhZGRyKSB7Ci0JCXZmZTQwX2N0cmwtPmJoaXN0U3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCXZmZTQwX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbih2ZmU0MF9jdHJsLAotCQkJCXN0YXRzU2tpbk51bSwgYWRkcik7Ci0KLQkJdmZlX3NlbmRfc3RhdHNfbXNnKHZmZTQwX2N0cmwsCi0JCQl2ZmU0MF9jdHJsLT5iaGlzdFN0YXRzQ29udHJvbC5idWZUb1JlbmRlciwKLQkJCXN0YXRzU2tpbk51bSk7Ci0JfSBlbHNlewotCQl2ZmU0MF9jdHJsLT5iaGlzdFN0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCUNEQkcoIiVzOiBkcm9wcGVkU3RhdHNGcmFtZUNvdW50ID0gJWQiLCBfX2Z1bmNfXywKLQkJCXZmZTQwX2N0cmwtPmJoaXN0U3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlNDBfcHJvY2Vzc19zdGF0c19paGlzdF9pcnEoc3RydWN0IHZmZTQwX2N0cmxfdHlwZSAqdmZlNDBfY3RybCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IGFkZHI7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlNDBfc3RhdHNfZHFidWYodmZlNDBfY3RybCwgTVNNX1NUQVRTX1RZUEVfSUhJU1QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmIChhZGRyKSB7Ci0JCXZmZTQwX2N0cmwtPmloaXN0U3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCXZmZTQwX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbigKLQkJCXZmZTQwX2N0cmwsIHN0YXRzSWhpc3ROdW0sIGFkZHIpOwotCi0JCXZmZV9zZW5kX3N0YXRzX21zZyh2ZmU0MF9jdHJsLAotCQkJdmZlNDBfY3RybC0+aWhpc3RTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIsCi0JCQlzdGF0c0loaXN0TnVtKTsKLQl9IGVsc2UgewotCQl2ZmU0MF9jdHJsLT5paGlzdFN0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCUNEQkcoIiVzOiBkcm9wcGVkU3RhdHNGcmFtZUNvdW50ID0gJWQiLCBfX2Z1bmNfXywKLQkJCXZmZTQwX2N0cmwtPmloaXN0U3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlNDBfcHJvY2Vzc19zdGF0c19yc19pcnEoc3RydWN0IHZmZTQwX2N0cmxfdHlwZSAqdmZlNDBfY3RybCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IGFkZHI7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWFkZHIgPSAodWludDMyX3QpdmZlNDBfc3RhdHNfZHFidWYodmZlNDBfY3RybCwgTVNNX1NUQVRTX1RZUEVfUlMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTQwX2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCWlmIChhZGRyKSB7Ci0JCXZmZTQwX2N0cmwtPnJzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCXZmZTQwX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbih2ZmU0MF9jdHJsLCBzdGF0c1JzTnVtLAotCQkJYWRkcik7Ci0KLQkJdmZlX3NlbmRfc3RhdHNfbXNnKHZmZTQwX2N0cmwsCi0JCQl2ZmU0MF9jdHJsLT5yc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciwgc3RhdHNSc051bSk7Ci0JfSBlbHNlIHsKLQkJdmZlNDBfY3RybC0+cnNTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCsrOwotCQlDREJHKCIlczogZHJvcHBlZFN0YXRzRnJhbWVDb3VudCA9ICVkIiwgX19mdW5jX18sCi0JCQl2ZmU0MF9jdHJsLT5yc1N0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTQwX3Byb2Nlc3Nfc3RhdHNfY3NfaXJxKHN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50MzJfdCBhZGRyOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlhZGRyID0gKHVpbnQzMl90KXZmZTQwX3N0YXRzX2RxYnVmKHZmZTQwX2N0cmwsIE1TTV9TVEFUU19UWVBFX0NTKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAoYWRkcikgewotCQl2ZmU0MF9jdHJsLT5jc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9Ci0JCQl2ZmU0MF9wcm9jZXNzX3N0YXRzX2lycV9jb21tb24odmZlNDBfY3RybCwgc3RhdHNDc051bSwKLQkJCWFkZHIpOwotCi0JCQl2ZmVfc2VuZF9zdGF0c19tc2codmZlNDBfY3RybCwKLQkJCQl2ZmU0MF9jdHJsLT5jc1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciwKLQkJCQlzdGF0c0NzTnVtKTsKLQl9IGVsc2UgewotCQl2ZmU0MF9jdHJsLT5jc1N0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCUNEQkcoIiVzOiBkcm9wcGVkU3RhdHNGcmFtZUNvdW50ID0gJWQiLCBfX2Z1bmNfXywKLQkJCXZmZTQwX2N0cmwtPmNzU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlNDBfcHJvY2Vzc19zdGF0cyhzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsLAotCXVpbnQzMl90IHN0YXR1c19iaXRzKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50MzJfdCBwcm9jZXNzX3N0YXRzID0gZmFsc2U7Ci0JdWludDMyX3QgYWRkcjsKLQl1aW50MzJfdCBzdGF0c190eXBlOwotCi0JQ0RCRygiJXMsIHN0YXRzID0gMHgleFxuIiwgX19mdW5jX18sIHN0YXR1c19iaXRzKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlNDBfY3RybC0+c3RhdHNfYnVmcV9sb2NrLCBmbGFncyk7Ci0KLQlzdGF0c190eXBlID0gTVNNX1NUQVRTX1RZUEVfQkU7Ci0JaWYgKHN0YXR1c19iaXRzICYgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0JFKSB7Ci0JCWFkZHIgPSAodWludDMyX3QpdmZlNDBfc3RhdHNfZHFidWYodmZlNDBfY3RybCwKLQkJCQlzdGF0c190eXBlKTsKLQkJaWYgKGFkZHIpIHsKLQkJCXZmZTQwX2N0cmwtPmJlU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCQl2ZmU0MF9wcm9jZXNzX3N0YXRzX2lycV9jb21tb24oCi0JCQkJdmZlNDBfY3RybCwgc3RhdHNCZU51bSwgYWRkcik7Ci0JCQlwcm9jZXNzX3N0YXRzID0gdHJ1ZTsKLQkJfSBlbHNlewotCQkJdmZlNDBfY3RybC0+YmVTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCQkJdmZlNDBfY3RybC0+YmVTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCsrOwotCQl9Ci0JfSBlbHNlIHsKLQkJdmZlNDBfY3RybC0+YmVTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCX0KLQotCXN0YXRzX3R5cGUgPSBNU01fU1RBVFNfVFlQRV9CRzsKLQlpZiAoc3RhdHVzX2JpdHMgJiBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQkcpIHsKLQkJYWRkciA9ICh1aW50MzJfdCl2ZmU0MF9zdGF0c19kcWJ1Zih2ZmU0MF9jdHJsLAotCQkJCXN0YXRzX3R5cGUpOwotCQlpZiAoYWRkcikgewotCQkJdmZlNDBfY3RybC0+YmdTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPQotCQkJCXZmZTQwX3Byb2Nlc3Nfc3RhdHNfaXJxX2NvbW1vbigKLQkJCQl2ZmU0MF9jdHJsLCBzdGF0c0JnTnVtLCBhZGRyKTsKLQkJCXByb2Nlc3Nfc3RhdHMgPSB0cnVlOwotCQl9IGVsc2V7Ci0JCQl2ZmU0MF9jdHJsLT5iZ1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JCQl2ZmU0MF9jdHJsLT5iZ1N0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci0JCX0KLQl9IGVsc2UgewotCQl2ZmU0MF9jdHJsLT5iZ1N0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JfQotCi0JaWYgKHN0YXR1c19iaXRzICYgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0FXQikgewotCQlhZGRyID0gKHVpbnQzMl90KXZmZTQwX3N0YXRzX2RxYnVmKHZmZTQwX2N0cmwsCi0JCQlNU01fU1RBVFNfVFlQRV9BV0IpOwotCQlpZiAoYWRkcikgewotCQkJdmZlNDBfY3RybC0+YXdiU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCQl2ZmU0MF9wcm9jZXNzX3N0YXRzX2lycV9jb21tb24oCi0JCQkJdmZlNDBfY3RybCwgc3RhdHNBd2JOdW0sCi0JCQkJYWRkcik7Ci0JCQlwcm9jZXNzX3N0YXRzID0gdHJ1ZTsKLQkJfSBlbHNlewotCQkJdmZlNDBfY3RybC0+YXdiU3RhdHNDb250cm9sLmRyb3BwZWRTdGF0c0ZyYW1lQ291bnQrKzsKLQkJCXZmZTQwX2N0cmwtPmF3YlN0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9IDA7Ci0JCX0KLQl9IGVsc2UgewotCQl2ZmU0MF9jdHJsLT5hd2JTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCX0KLQotCXN0YXRzX3R5cGUgPSBNU01fU1RBVFNfVFlQRV9CRjsKLQlpZiAoc3RhdHVzX2JpdHMgJiBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQkYpIHsKLQkJYWRkciA9ICh1aW50MzJfdCl2ZmU0MF9zdGF0c19kcWJ1Zih2ZmU0MF9jdHJsLAotCQkJCQlzdGF0c190eXBlKTsKLQkJaWYgKGFkZHIpIHsKLQkJCXZmZTQwX2N0cmwtPmJmU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCQl2ZmU0MF9wcm9jZXNzX3N0YXRzX2lycV9jb21tb24oCi0JCQkJdmZlNDBfY3RybCwgc3RhdHNCZk51bSwKLQkJCQlhZGRyKTsKLQkJCXByb2Nlc3Nfc3RhdHMgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJdmZlNDBfY3RybC0+YmZTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCQkJdmZlNDBfY3RybC0+YmZTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCsrOwotCQl9Ci0JfSBlbHNlIHsKLQkJdmZlNDBfY3RybC0+YmZTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCX0KLQotCWlmIChzdGF0dXNfYml0cyAmIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19JSElTVCkgewotCQlhZGRyID0gKHVpbnQzMl90KXZmZTQwX3N0YXRzX2RxYnVmKHZmZTQwX2N0cmwsCi0JCQkJCU1TTV9TVEFUU19UWVBFX0lISVNUKTsKLQkJaWYgKGFkZHIpIHsKLQkJCXZmZTQwX2N0cmwtPmloaXN0U3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCQl2ZmU0MF9wcm9jZXNzX3N0YXRzX2lycV9jb21tb24oCi0JCQkJdmZlNDBfY3RybCwgc3RhdHNJaGlzdE51bSwKLQkJCQlhZGRyKTsKLQkJCXByb2Nlc3Nfc3RhdHMgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJdmZlNDBfY3RybC0+aWhpc3RTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCsrOwotCQkJdmZlNDBfY3RybC0+aWhpc3RTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJdmZlNDBfY3RybC0+aWhpc3RTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCX0KLQotCWlmIChzdGF0dXNfYml0cyAmIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19SUykgewotCQlhZGRyID0gKHVpbnQzMl90KXZmZTQwX3N0YXRzX2RxYnVmKHZmZTQwX2N0cmwsCi0JCQkJCU1TTV9TVEFUU19UWVBFX1JTKTsKLQkJaWYgKGFkZHIpIHsKLQkJCXZmZTQwX2N0cmwtPnJzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCQl2ZmU0MF9wcm9jZXNzX3N0YXRzX2lycV9jb21tb24oCi0JCQkJdmZlNDBfY3RybCwgc3RhdHNSc051bSwKLQkJCQlhZGRyKTsKLQkJCXByb2Nlc3Nfc3RhdHMgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJdmZlNDBfY3RybC0+cnNTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCsrOwotCQkJdmZlNDBfY3RybC0+cnNTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJdmZlNDBfY3RybC0+cnNTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCX0KLQotCWlmIChzdGF0dXNfYml0cyAmIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19DUykgewotCQlhZGRyID0gKHVpbnQzMl90KXZmZTQwX3N0YXRzX2RxYnVmKHZmZTQwX2N0cmwsCi0JCQkJCU1TTV9TVEFUU19UWVBFX0NTKTsKLQkJaWYgKGFkZHIpIHsKLQkJCXZmZTQwX2N0cmwtPmNzU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyID0KLQkJCQl2ZmU0MF9wcm9jZXNzX3N0YXRzX2lycV9jb21tb24oCi0JCQkJdmZlNDBfY3RybCwgc3RhdHNDc051bSwKLQkJCQlhZGRyKTsKLQkJCXByb2Nlc3Nfc3RhdHMgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJdmZlNDBfY3RybC0+Y3NTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCsrOwotCQkJdmZlNDBfY3RybC0+Y3NTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJdmZlNDBfY3RybC0+Y3NTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPSAwOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQlpZiAocHJvY2Vzc19zdGF0cykKLQkJdmZlX3NlbmRfY29tcF9zdGF0c19tc2codmZlNDBfY3RybCwgc3RhdHVzX2JpdHMpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCB2ZmU0MF9wcm9jZXNzX3N0YXRzX2lycSgKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsLCB1aW50MzJfdCBpcnFzdGF0dXMpCi17Ci0JdWludDMyX3Qgc3RhdHVzX2JpdHMgPSBWRkVfQ09NX1NUQVRVUyAmIGlycXN0YXR1czsKLQlpZiAoKHZmZTQwX2N0cmwtPmhmcl9tb2RlICE9IEhGUl9NT0RFX09GRikgJiYKLQkJKHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZUZyYW1lSWQgJQotCQkgdmZlNDBfY3RybC0+aGZyX21vZGUgIT0gMCkpIHsKLQkJQ0RCRygiU2tpcCB0aGUgc3RhdHMgd2hlbiBIRlIgZW5hYmxlZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQl2ZmU0MF9wcm9jZXNzX3N0YXRzKHZmZTQwX2N0cmwsIHN0YXR1c19iaXRzKTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTQwX3Byb2Nlc3NfaXJxKAotCXN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwsIHVpbnQzMl90IGlycXN0YXR1cykKLXsKLQlpZiAoaXJxc3RhdHVzICYKLQkJVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0NPTVBPU0lUX01BU0tfMCkgewotCQl2ZmU0MF9wcm9jZXNzX3N0YXRzX2lycSh2ZmU0MF9jdHJsLCBpcnFzdGF0dXMpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3dpdGNoIChpcnFzdGF0dXMpIHsKLQljYXNlIFZGRV9JUlFfU1RBVFVTMF9DQU1JRl9TT0ZfTUFTSzoKLQkJQ0RCRygiaXJxCWNhbWlmU29mSXJxXG4iKTsKLQkJdmZlNDBfcHJvY2Vzc19jYW1pZl9zb2ZfaXJxKHZmZTQwX2N0cmwpOwotCQlicmVhazsKLQljYXNlIFZGRV9JUlFfU1RBVFVTMF9SRUdfVVBEQVRFX01BU0s6Ci0JCUNEQkcoImlycQlyZWdVcGRhdGVJcnFcbiIpOwotCQl2ZmU0MF9wcm9jZXNzX3JlZ191cGRhdGVfaXJxKHZmZTQwX2N0cmwpOwotCQlicmVhazsKLQljYXNlIFZGRV9JUlFfU1RBVFVTMF9SREkwX1JFR19VUERBVEU6Ci0JCUNEQkcoImlycQlyZGkwIHJlZ1VwZGF0ZUlycVxuIik7Ci0JCXZmZTQwX3Byb2Nlc3NfcmRpMF9yZWdfdXBkYXRlX2lycSh2ZmU0MF9jdHJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfSVJRX1NUQVRVUzBfUkRJMV9SRUdfVVBEQVRFOgotCQlDREJHKCJpcnEJcmRpMSByZWdVcGRhdGVJcnFcbiIpOwotCQl2ZmU0MF9wcm9jZXNzX3JkaTFfcmVnX3VwZGF0ZV9pcnEodmZlNDBfY3RybCk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HXzA6Ci0JCUNEQkcoImlycQlyZXNldEFja0lycVxuIik7Ci0JCXZmZTQwX3Byb2Nlc3NfcmVzZXRfaXJxKHZmZTQwX2N0cmwpOwotCQlicmVhazsKLQljYXNlIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19CRzoKLQkJQ0RCRygiU3RhdHMgQkcgaXJxIG9jY3VyZWQuXG4iKTsKLQkJdmZlNDBfcHJvY2Vzc19zdGF0c19iZ19pcnEodmZlNDBfY3RybCk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0JFOgotCQlDREJHKCJTdGF0cyBCRSBpcnEgb2NjdXJlZC5cbiIpOwotCQl2ZmU0MF9wcm9jZXNzX3N0YXRzX2JlX2lycSh2ZmU0MF9jdHJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQkY6Ci0JCUNEQkcoIlN0YXRzIEJGIGlycSBvY2N1cmVkLlxuIik7Ci0JCXZmZTQwX3Byb2Nlc3Nfc3RhdHNfYmZfaXJxKHZmZTQwX2N0cmwpOwotCQlicmVhazsKLQljYXNlIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19BV0I6Ci0JCUNEQkcoIlN0YXRzIEFXQiBpcnEgb2NjdXJlZC5cbiIpOwotCQl2ZmU0MF9wcm9jZXNzX3N0YXRzX2F3Yl9pcnEodmZlNDBfY3RybCk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX1NLSU5fQkhJU1Q6Ci0JCUNEQkcoIlN0YXRzIEJISVNUIGlycSBvY2N1cmVkLlxuIik7Ci0JCXZmZTQwX3Byb2Nlc3Nfc3RhdHNfYmhpc3RfaXJxKHZmZTQwX2N0cmwpOwotCQlicmVhazsKLQljYXNlIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19JSElTVDoKLQkJQ0RCRygiU3RhdHMgSUhJU1QgaXJxIG9jY3VyZWQuXG4iKTsKLQkJdmZlNDBfcHJvY2Vzc19zdGF0c19paGlzdF9pcnEodmZlNDBfY3RybCk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX1JTOgotCQlDREJHKCJTdGF0cyBSUyBpcnEgb2NjdXJlZC5cbiIpOwotCQl2ZmU0MF9wcm9jZXNzX3N0YXRzX3JzX2lycSh2ZmU0MF9jdHJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQ1M6Ci0JCUNEQkcoIlN0YXRzIENTIGlycSBvY2N1cmVkLlxuIik7Ci0JCXZmZTQwX3Byb2Nlc3Nfc3RhdHNfY3NfaXJxKHZmZTQwX2N0cmwpOwotCQlicmVhazsKLQljYXNlIFZGRV9JUlFfU1RBVFVTMV9TWU5DX1RJTUVSMDoKLQkJQ0RCRygiU1lOQ19USU1FUiAwIGlycSBvY2N1cmVkLlxuIik7Ci0JCXZmZTQwX3NlbmRfaXNwX21zZygmdmZlNDBfY3RybC0+c3ViZGV2LAotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlRnJhbWVJZCwKLQkJCU1TR19JRF9TWU5DX1RJTUVSMF9ET05FKTsKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfSVJRX1NUQVRVUzFfU1lOQ19USU1FUjE6Ci0JCUNEQkcoIlNZTkNfVElNRVIgMSBpcnEgb2NjdXJlZC5cbiIpOwotCQl2ZmU0MF9zZW5kX2lzcF9tc2coJnZmZTQwX2N0cmwtPnN1YmRldiwKLQkJCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZUZyYW1lSWQsCi0JCQlNU0dfSURfU1lOQ19USU1FUjFfRE9ORSk7Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0lSUV9TVEFUVVMxX1NZTkNfVElNRVIyOgotCQlDREJHKCJTWU5DX1RJTUVSIDIgaXJxIG9jY3VyZWQuXG4iKTsKLQkJdmZlNDBfc2VuZF9pc3BfbXNnKCZ2ZmU0MF9jdHJsLT5zdWJkZXYsCi0JCQl2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmVGcmFtZUlkLAotCQkJTVNHX0lEX1NZTkNfVElNRVIyX0RPTkUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIkludmFsaWQgSVJRIHN0YXR1c1xuIik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBheGk0MF9kb190YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCA9IChzdHJ1Y3QgYXhpX2N0cmxfdCAqKWRhdGE7Ci0Jc3RydWN0IHZmZTQwX2N0cmxfdHlwZSAqdmZlNDBfY3RybCA9IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmU0MF9jdHJsOwotCXN0cnVjdCB2ZmU0MF9pc3JfcXVldWVfY21kICpxY21kID0gTlVMTDsKLQlpbnQgc3RhdF9pbnRlcnJ1cHQ7Ci0KLQlDREJHKCI9PT0gYXhpNDBfZG9fdGFza2xldCBzdGFydCA9PT1cbiIpOwotCi0Jd2hpbGUgKGF0b21pY19yZWFkKCZpcnFfY250KSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXhpX2N0cmwtPnRhc2tsZXRfbG9jaywgZmxhZ3MpOwotCQlxY21kID0gbGlzdF9maXJzdF9lbnRyeSgmYXhpX2N0cmwtPnRhc2tsZXRfcSwKLQkJCXN0cnVjdCB2ZmU0MF9pc3JfcXVldWVfY21kLCBsaXN0KTsKLQkJYXRvbWljX3N1YigxLCAmaXJxX2NudCk7Ci0KLQkJaWYgKCFxY21kKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZheGlfY3RybC0+dGFza2xldF9sb2NrLAotCQkJCWZsYWdzKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWxpc3RfZGVsKCZxY21kLT5saXN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXhpX2N0cmwtPnRhc2tsZXRfbG9jaywKLQkJCWZsYWdzKTsKLQotCQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnN0YXRzX2NvbXApIHsKLQkJCXN0YXRfaW50ZXJydXB0ID0gKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czAgJgotCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQ09NUE9TSVRfTUFTS18wKTsKLQkJfSBlbHNlIHsKLQkJCXN0YXRfaW50ZXJydXB0ID0KLQkJCQkocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCVZGRV9JUlFfU1RBVFVTMF9TVEFUU19CRykgfAotCQkJCShxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQkJVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0JFKSB8Ci0JCQkJKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czAgJgotCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQVdCKSB8Ci0JCQkJKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czAgJgotCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQkYpIHwKLQkJCQkocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCVZGRV9JUlFfU1RBVFVTMF9TVEFUU19JSElTVCkgfAotCQkJCShxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQkJVkZFX0lSUV9TVEFUVVMwX1NUQVRTX1JTKSB8Ci0JCQkJKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czAgJgotCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQ1MpOwotCQl9Ci0JCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQlWRkVfSVJRX1NUQVRVUzBfQ0FNSUZfU09GX01BU0spIHsKLQkJCWlmIChzdGF0X2ludGVycnVwdCkKLQkJCQl2ZmU0MF9jdHJsLT5zaW11bHRhbmVvdXNfc29mX3N0YXQgPSAxOwotCQkJdjRsMl9zdWJkZXZfbm90aWZ5KCZ2ZmU0MF9jdHJsLT5zdWJkZXYsCi0JCQkJTk9USUZZX1ZGRV9JUlEsCi0JCQkJKHZvaWQgKilWRkVfSVJRX1NUQVRVUzBfQ0FNSUZfU09GX01BU0spOwotCQl9Ci0KLQkJLyogaW50ZXJydXB0IHRvIGJlIHByb2Nlc3NlZCwgICpxY21kIGhhcyB0aGUgcGF5bG9hZC4gICovCi0JCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQlWRkVfSVJRX1NUQVRVUzBfUkVHX1VQREFURV9NQVNLKQotCQkJdjRsMl9zdWJkZXZfbm90aWZ5KCZ2ZmU0MF9jdHJsLT5zdWJkZXYsCi0JCQkJTk9USUZZX1ZGRV9JUlEsCi0JCQkJKHZvaWQgKilWRkVfSVJRX1NUQVRVUzBfUkVHX1VQREFURV9NQVNLKTsKLQotCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMSAmCi0JCQkJVkZFX0lSUV9TVEFUVVMwX1JESTBfUkVHX1VQREFURV9NQVNLKQotCQkJdjRsMl9zdWJkZXZfbm90aWZ5KCZ2ZmU0MF9jdHJsLT5zdWJkZXYsCi0JCQkJTk9USUZZX1ZGRV9JUlEsCi0JCQkJKHZvaWQgKilWRkVfSVJRX1NUQVRVUzBfUkRJMF9SRUdfVVBEQVRFKTsKLQotCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMSAmCi0JCQkJVkZFX0lSUV9TVEFUVVMwX1JESTFfUkVHX1VQREFURV9NQVNLKQotCQkJdjRsMl9zdWJkZXZfbm90aWZ5KCZ2ZmU0MF9jdHJsLT5zdWJkZXYsCi0JCQkJTk9USUZZX1ZGRV9JUlEsCi0JCQkJKHZvaWQgKilWRkVfSVJRX1NUQVRVUzBfUkRJMV9SRUdfVVBEQVRFKTsKLQotCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HXzApCi0JCQl2NGwyX3N1YmRldl9ub3RpZnkoJnZmZTQwX2N0cmwtPnN1YmRldiwKLQkJCQlOT1RJRllfVkZFX0lSUSwKLQkJCQkodm9pZCAqKVZGRV9JTUFTS19XSElMRV9TVE9QUElOR18wKTsKLQotCQlpZiAoYXRvbWljX3JlYWQoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT5oYW5kbGVfY29tbW9uX2lycSkpIHsKLQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMxICYKLQkJCQkJVkZFNDBfSU1BU0tfQ09NTU9OX0VSUk9SX09OTFlfMSkgewotCQkJCXByX2VycigiaXJxCWVycm9ySXJxXG4iKTsKLQkJCQl2ZmU0MF9wcm9jZXNzX2NvbW1vbl9lcnJvcl9pcnEoCi0JCQkJCWF4aV9jdHJsLAotCQkJCQlxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMxICYKLQkJCQkJVkZFNDBfSU1BU0tfQ09NTU9OX0VSUk9SX09OTFlfMSk7Ci0JCQl9Ci0KLQkJCXY0bDJfc3ViZGV2X25vdGlmeSgmYXhpX2N0cmwtPnN1YmRldiwKLQkJCQlOT1RJRllfQVhJX0lSUSwKLQkJCQkodm9pZCAqKXFjbWQtPnZmZUludGVycnVwdFN0YXR1czApOwotCQl9Ci0KLQkJaWYgKGF0b21pY19yZWFkKCZheGlfY3RybC0+c2hhcmVfY3RybC0+dnN0YXRlKSkgewotCQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czEgJgotCQkJCQlWRkU0MF9JTUFTS19WRkVfRVJST1JfT05MWV8xKSB7Ci0JCQkJcHJfZXJyKCJpcnEJZXJyb3JJcnFcbiIpOwotCQkJCXZmZTQwX3Byb2Nlc3NfZXJyb3JfaXJxKAotCQkJCQlheGlfY3RybCwKLQkJCQkJcWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMSAmCi0JCQkJCVZGRTQwX0lNQVNLX1ZGRV9FUlJPUl9PTkxZXzEpOwotCQkJfQotCi0JCQkvKiB0aGVuIHByb2Nlc3Mgc3RhdHMgaXJxLiAqLwotCQkJaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5zdGF0c19jb21wKSB7Ci0JCQkJLyogcHJvY2VzcyBzdGF0cyBjb21iIGludGVycnVwdC4gKi8KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCVZGRV9JUlFfU1RBVFVTMF9TVEFUU19DT01QT1NJVF9NQVNLXzApIHsKLQkJCQkJQ0RCRygiU3RhdHMgY29tcG9zaXRlIGlycSBvY2N1cmVkLlxuIik7Ci0JCQkJCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlNDBfY3RybC0+c3ViZGV2LAotCQkJCQlOT1RJRllfVkZFX0lSUSwKLQkJCQkJKHZvaWQgKilxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qIHByb2Nlc3MgaW5kaXZpZHVhbCBzdGF0cyBpbnRlcnJ1cHQuICovCi0JCQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czAgJgotCQkJCQkJVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0JHKQotCQkJCQl2NGwyX3N1YmRldl9ub3RpZnkoJnZmZTQwX2N0cmwtPnN1YmRldiwKLQkJCQkJTk9USUZZX1ZGRV9JUlEsCi0JCQkJCSh2b2lkICopVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0JHKTsKLQotCQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQkJCVZGRV9JUlFfU1RBVFVTMF9TVEFUU19CRSkKLQkJCQkJdjRsMl9zdWJkZXZfbm90aWZ5KCZ2ZmU0MF9jdHJsLT5zdWJkZXYsCi0JCQkJCU5PVElGWV9WRkVfSVJRLAotCQkJCQkodm9pZCAqKVZGRV9JUlFfU1RBVFVTMF9TVEFUU19CRSk7Ci0KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQVdCKQotCQkJCQl2NGwyX3N1YmRldl9ub3RpZnkoJnZmZTQwX2N0cmwtPnN1YmRldiwKLQkJCQkJTk9USUZZX1ZGRV9JUlEsCi0JCQkJCSh2b2lkICopVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0FXQik7Ci0KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQkYpCi0JCQkJCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlNDBfY3RybC0+c3ViZGV2LAotCQkJCQlOT1RJRllfVkZFX0lSUSwKLQkJCQkJKHZvaWQgKilWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQkYpOwotCQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQkJVkZFX0lSUV9TVEFUVVMwX1NUQVRTX1NLSU5fQkhJU1QpCi0JCQkJCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlNDBfY3RybC0+c3ViZGV2LAotCQkJCQlOT1RJRllfVkZFX0lSUSwKLQkJCQkJKHZvaWQgKikKLQkJCQkJVkZFX0lSUV9TVEFUVVMwX1NUQVRTX1NLSU5fQkhJU1QpOwotCi0JCQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czAgJgotCQkJCQkJVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0lISVNUKQotCQkJCQl2NGwyX3N1YmRldl9ub3RpZnkoJnZmZTQwX2N0cmwtPnN1YmRldiwKLQkJCQkJTk9USUZZX1ZGRV9JUlEsCi0JCQkJCSh2b2lkICopVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0lISVNUKTsKLQotCQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwICYKLQkJCQkJCVZGRV9JUlFfU1RBVFVTMF9TVEFUU19SUykKLQkJCQkJdjRsMl9zdWJkZXZfbm90aWZ5KCZ2ZmU0MF9jdHJsLT5zdWJkZXYsCi0JCQkJCU5PVElGWV9WRkVfSVJRLAotCQkJCQkodm9pZCAqKVZGRV9JUlFfU1RBVFVTMF9TVEFUU19SUyk7Ci0KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMCAmCi0JCQkJCQlWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQ1MpCi0JCQkJCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlNDBfY3RybC0+c3ViZGV2LAotCQkJCQlOT1RJRllfVkZFX0lSUSwKLQkJCQkJKHZvaWQgKilWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQ1MpOwotCi0JCQkJaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1czEgJgotCQkJCQkJVkZFX0lSUV9TVEFUVVMxX1NZTkNfVElNRVIwKQotCQkJCQl2NGwyX3N1YmRldl9ub3RpZnkoJnZmZTQwX2N0cmwtPnN1YmRldiwKLQkJCQkJTk9USUZZX1ZGRV9JUlEsCi0JCQkJCSh2b2lkICopVkZFX0lSUV9TVEFUVVMxX1NZTkNfVElNRVIwKTsKLQotCQkJCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMxICYKLQkJCQkJCVZGRV9JUlFfU1RBVFVTMV9TWU5DX1RJTUVSMSkKLQkJCQkJdjRsMl9zdWJkZXZfbm90aWZ5KCZ2ZmU0MF9jdHJsLT5zdWJkZXYsCi0JCQkJCU5PVElGWV9WRkVfSVJRLAotCQkJCQkodm9pZCAqKVZGRV9JUlFfU1RBVFVTMV9TWU5DX1RJTUVSMSk7Ci0KLQkJCQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMSAmCi0JCQkJCQlWRkVfSVJRX1NUQVRVUzFfU1lOQ19USU1FUjIpCi0JCQkJCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlNDBfY3RybC0+c3ViZGV2LAotCQkJCQlOT1RJRllfVkZFX0lSUSwKLQkJCQkJKHZvaWQgKilWRkVfSVJRX1NUQVRVUzFfU1lOQ19USU1FUjIpOwotCQkJfQotCQl9Ci0JCXZmZTQwX2N0cmwtPnNpbXVsdGFuZW91c19zb2Zfc3RhdCA9IDA7Ci0JCWtmcmVlKHFjbWQpOwotCX0KLQlDREJHKCI9PT0gYXhpNDBfZG9fdGFza2xldCBlbmQgPT09XG4iKTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHZmZTQwX3BhcnNlX2lycShpbnQgaXJxX251bSwgdm9pZCAqZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCB2ZmU0MF9pcnFfc3RhdHVzIGlycTsKLQlzdHJ1Y3QgdmZlNDBfaXNyX3F1ZXVlX2NtZCAqcWNtZDsKLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwgPSBkYXRhOwotCi0JQ0RCRygidmZlX3BhcnNlX2lycVxuIik7Ci0KLQl2ZmU0MF9yZWFkX2lycV9zdGF0dXMoYXhpX2N0cmwsICZpcnEpOwotCi0JaWYgKChpcnEudmZlSXJxU3RhdHVzMCA9PSAwKSAmJiAoaXJxLnZmZUlycVN0YXR1czEgPT0gMCkpIHsKLQkJQ0RCRygidmZlX3BhcnNlX2lycTogdmZlSXJxU3RhdHVzMCAmIDEgYXJlIGJvdGggMCFcbiIpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JcWNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZmU0MF9pc3JfcXVldWVfY21kKSwKLQkJR0ZQX0FUT01JQyk7Ci0JaWYgKCFxY21kKSB7Ci0JCXByX2VycigidmZlX3BhcnNlX2lycTogcWNtZCBtYWxsb2MgZmFpbGVkIVxuIik7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnN0b3BfZmxhZ19sb2NrLCBmbGFncyk7Ci0JaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5zdG9wX2Fja19wZW5kaW5nKSB7Ci0JCWlycS52ZmVJcnFTdGF0dXMwICY9IFZGRV9JTUFTS19XSElMRV9TVE9QUElOR18wOwotCQlpcnEudmZlSXJxU3RhdHVzMSAmPSBWRkVfSU1BU0tfV0hJTEVfU1RPUFBJTkdfMTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnN0b3BfZmxhZ19sb2NrLCBmbGFncyk7Ci0KLQlDREJHKCJ2ZmVfcGFyc2VfaXJxOiBJcnFfc3RhdHVzMCA9IDB4JXgsIElycV9zdGF0dXMxID0gMHgleC5cbiIsCi0JCWlycS52ZmVJcnFTdGF0dXMwLCBpcnEudmZlSXJxU3RhdHVzMSk7Ci0KLQlxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMwID0gaXJxLnZmZUlycVN0YXR1czA7Ci0JcWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzMSA9IGlycS52ZmVJcnFTdGF0dXMxOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF4aV9jdHJsLT50YXNrbGV0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZxY21kLT5saXN0LCAmYXhpX2N0cmwtPnRhc2tsZXRfcSk7Ci0KLQlhdG9taWNfYWRkKDEsICZpcnFfY250KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZheGlfY3RybC0+dGFza2xldF9sb2NrLCBmbGFncyk7Ci0JdGFza2xldF9zY2hlZHVsZSgmYXhpX2N0cmwtPnZmZTQwX3Rhc2tsZXQpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotaW50IG1zbV9heGlfc3ViZGV2X2lzcl9yb3V0aW5lKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JdTMyIHN0YXR1cywgYm9vbCAqaGFuZGxlZCkKLXsKLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlpcnFyZXR1cm5fdCByZXQ7Ci0JQ0RCRygiJXMgRSAiLCBfX2Z1bmNfXyk7Ci0JcmV0ID0gdmZlNDBfcGFyc2VfaXJxKGF4aV9jdHJsLT52ZmVpcnEtPnN0YXJ0LCBheGlfY3RybCk7Ci0JKmhhbmRsZWQgPSBUUlVFOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgbG9uZyB2ZmVfc3RhdHNfYnVmcV9zdWJfaW9jdGwoCi0Jc3RydWN0IHZmZTQwX2N0cmxfdHlwZSAqdmZlX2N0cmwsCi0Jc3RydWN0IG1zbV92ZmVfY2ZnX2NtZCAqY21kLCB2b2lkICppb25fY2xpZW50LCBpbnQgZG9tYWluX251bSkKLXsKLQlsb25nIHJjID0gMDsKLQlzd2l0Y2ggKGNtZC0+Y21kX3R5cGUpIHsKLQljYXNlIFZGRV9DTURfU1RBVFNfUkVRQlVGOgotCWlmICghdmZlX2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsKSB7Ci0JCS8qIHN0YXRzX2N0cmwgaGFzIG5vdCBiZWVuIGluaXQgeWV0ICovCi0JCXJjID0gbXNtX3N0YXRzX2J1Zl9vcHNfaW5pdCgmdmZlX2N0cmwtPnN0YXRzX2N0cmwsCi0JCQkJKHN0cnVjdCBpb25fY2xpZW50ICopaW9uX2NsaWVudCwKLQkJCQkmdmZlX2N0cmwtPnN0YXRzX29wcyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGNhbm5vdCBpbml0IHN0YXRzIG9wcyIsIF9fZnVuY19fKTsKLQkJCWdvdG8gZW5kOwotCQl9Ci0JCXJjID0gdmZlX2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsX2luaXQoJnZmZV9jdHJsLT5zdGF0c19jdHJsKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogY2Fubm90IGluaXQgc3RhdHNfY3RybCBvcHMiLCBfX2Z1bmNfXyk7Ci0JCQltZW1zZXQoJnZmZV9jdHJsLT5zdGF0c19vcHMsIDAsCi0JCQkJc2l6ZW9mKHZmZV9jdHJsLT5zdGF0c19vcHMpKTsKLQkJCWdvdG8gZW5kOwotCQl9Ci0JCWlmIChzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19yZXFidWYpICE9IGNtZC0+bGVuZ3RoKSB7Ci0JCQkvKiBlcnJvci4gdGhlIGxlbmd0aCBub3QgbWF0Y2ggKi8KLQkJCXByX2VycigiJXM6IHN0YXRzIHJlcWJ1ZiBpbnB1dCBzaXplID0gJWQsXG4iCi0JCQkJInN0cnVjdCBzaXplID0gJWQsIG1pdGNoIG1hdGNoXG4iLAotCQkJCSBfX2Z1bmNfXywgY21kLT5sZW5ndGgsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfcmVxYnVmKSk7Ci0JCQlyYyA9IC1FSU5WQUwgOwotCQkJZ290byBlbmQ7Ci0JCX0KLQl9Ci0JcmMgPSB2ZmVfY3RybC0+c3RhdHNfb3BzLnJlcWJ1ZigKLQkJCSZ2ZmVfY3RybC0+c3RhdHNfY3RybCwKLQkJCShzdHJ1Y3QgbXNtX3N0YXRzX3JlcWJ1ZiAqKWNtZC0+dmFsdWUsCi0JCQl2ZmVfY3RybC0+c3RhdHNfb3BzLmNsaWVudCk7Ci0JYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX1NUQVRTX0VOUVVFVUVCVUY6Ci0JaWYgKHNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX2J1Zl9pbmZvKSAhPSBjbWQtPmxlbmd0aCkgewotCQkvKiBlcnJvci4gdGhlIGxlbmd0aCBub3QgbWF0Y2ggKi8KLQkJcHJfZXJyKCIlczogc3RhdHMgZW5xdWV1ZWJ1ZiBpbnB1dCBzaXplID0gJWQsXG4iCi0JCQkic3RydWN0IHNpemUgPSAlZCwgbWl0Y2ggbWF0Y2hcbiIsCi0JCQkgX19mdW5jX18sIGNtZC0+bGVuZ3RoLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfYnVmX2luZm8pKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gZW5kOwotCX0KLQlyYyA9IHZmZV9jdHJsLT5zdGF0c19vcHMuZW5xdWV1ZV9idWYoCi0JCQkmdmZlX2N0cmwtPnN0YXRzX2N0cmwsCi0JCQkoc3RydWN0IG1zbV9zdGF0c19idWZfaW5mbyAqKWNtZC0+dmFsdWUsCi0JCQl2ZmVfY3RybC0+c3RhdHNfb3BzLmNsaWVudCwgZG9tYWluX251bSk7Ci0JYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX1NUQVRTX0ZMVVNIX0JVRlE6Ci0JewotCQlzdHJ1Y3QgbXNtX3N0YXRzX2ZsdXNoX2J1ZnEgKmZsdXNoX3JlcSA9IE5VTEw7Ci0JCWZsdXNoX3JlcSA9IChzdHJ1Y3QgbXNtX3N0YXRzX2ZsdXNoX2J1ZnEgKiljbWQtPnZhbHVlOwotCQlpZiAoc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfZmx1c2hfYnVmcSkgIT0gY21kLT5sZW5ndGgpIHsKLQkJCS8qIGVycm9yLiB0aGUgbGVuZ3RoIG5vdCBtYXRjaCAqLwotCQkJcHJfZXJyKCIlczogc3RhdHMgZmx1c2ggcXVldWUgaW5wdXQgc2l6ZSA9ICVkLFxuIgotCQkJCSJzdHJ1Y3Qgc2l6ZSA9ICVkLCBtaXRjaCBtYXRjaFxuIiwKLQkJCQlfX2Z1bmNfXywgY21kLT5sZW5ndGgsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfZmx1c2hfYnVmcSkpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBlbmQ7Ci0JfQotCXJjID0gdmZlX2N0cmwtPnN0YXRzX29wcy5idWZxX2ZsdXNoKAotCQkJJnZmZV9jdHJsLT5zdGF0c19jdHJsLAotCQkJKGVudW0gbXNtX3N0YXRzX2VudW1fdHlwZSlmbHVzaF9yZXEtPnN0YXRzX3R5cGUsCi0JCQl2ZmVfY3RybC0+c3RhdHNfb3BzLmNsaWVudCk7Ci0JfQotCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9TVEFUU19VTlJFR0JVRjoKLQl7Ci0JCXN0cnVjdCBtc21fc3RhdHNfcmVxYnVmICpyZXFfYnVmID0gTlVMTDsKLQkJcmVxX2J1ZiA9IChzdHJ1Y3QgbXNtX3N0YXRzX3JlcWJ1ZiAqKWNtZC0+dmFsdWU7Ci0JCWlmIChzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19yZXFidWYpICE9IGNtZC0+bGVuZ3RoKSB7Ci0JCQkvKiBlcnJvci4gdGhlIGxlbmd0aCBub3QgbWF0Y2ggKi8KLQkJCXByX2VycigiJXM6IHN0YXRzIHJlcWJ1ZiBpbnB1dCBzaXplID0gJWQsXG4iCi0JCQkJInN0cnVjdCBzaXplID0gJWQsIG1pdGNoIG1hdGNoXG4iLAotCQkJCSBfX2Z1bmNfXywgY21kLT5sZW5ndGgsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfcmVxYnVmKSk7Ci0JCQlyYyA9IC1FSU5WQUwgOwotCQkJZ290byBlbmQ7Ci0JCX0KLQkJcmMgPSB2ZmU0MF9zdGF0c191bnJlZ2J1Zih2ZmVfY3RybCwgcmVxX2J1ZiwgZG9tYWluX251bSk7Ci0JfQotCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLTE7Ci0JCXByX2VycigiJXM6IGNtZF90eXBlICVkIG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXywKLQkJCWNtZC0+Y21kX3R5cGUpOwotCWJyZWFrOwotCX0KLWVuZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBsb25nIG1zbV92ZmVfc3ViZGV2X2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQl1bnNpZ25lZCBpbnQgc3ViZGV2X2NtZCwgdm9pZCAqYXJnKQotewotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsID0KLQkJKHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKil2NGwyX2dldF9zdWJkZXZfaG9zdGRhdGEoc2QpOwotCXN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwgPQotCQkoc3RydWN0IHZmZTQwX2N0cmxfdHlwZSAqKXY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBtc21faXNwX2NtZCB2ZmVjbWQ7Ci0Jc3RydWN0IG1zbV9jYW12ZmVfcGFyYW1zICp2ZmVfcGFyYW1zOwotCXN0cnVjdCBtc21fdmZlX2NmZ19jbWQgKmNtZDsKLQl2b2lkICpkYXRhOwotCi0JbG9uZyByYyA9IDA7Ci0Jc3RydWN0IHZmZV9jbWRfc3RhdHNfYnVmICpzY2ZnID0gTlVMTDsKLQlzdHJ1Y3QgdmZlX2NtZF9zdGF0c19hY2sgKnNhY2sgPSBOVUxMOwotCi0JaWYgKCF2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlKSB7Ci0JCXByX2VycigiJXM6IGJhc2UgYWRkcmVzcyB1bm1hcHBlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlDREJHKCIlc1xuIiwgX19mdW5jX18pOwotCWlmIChzdWJkZXZfY21kID09IFZJRElPQ19NU01fVkZFX0lOSVQpIHsKLQkJQ0RCRygiJXMgaW5pdFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gbXNtX3ZmZV9zdWJkZXZfaW5pdChzZCk7Ci0JfSBlbHNlIGlmIChzdWJkZXZfY21kID09IFZJRElPQ19NU01fVkZFX1JFTEVBU0UpIHsKLQkJbXNtX3ZmZV9zdWJkZXZfcmVsZWFzZShzZCk7Ci0JCXJldHVybiAwOwotCX0KLQl2ZmVfcGFyYW1zID0gKHN0cnVjdCBtc21fY2FtdmZlX3BhcmFtcyAqKWFyZzsKLQljbWQgPSB2ZmVfcGFyYW1zLT52ZmVfY2ZnOwotCWRhdGEgPSB2ZmVfcGFyYW1zLT5kYXRhOwotCXN3aXRjaCAoY21kLT5jbWRfdHlwZSkgewotCWNhc2UgQ01EX1ZGRV9QUk9DRVNTX0lSUToKLQkJdmZlNDBfcHJvY2Vzc19pcnEodmZlNDBfY3RybCwgKHVpbnQzMl90KSBkYXRhKTsKLQkJcmV0dXJuIHJjOwotCWNhc2UgVkZFX0NNRF9TVEFUU19SRVFCVUY6Ci0JY2FzZSBWRkVfQ01EX1NUQVRTX0VOUVVFVUVCVUY6Ci0JY2FzZSBWRkVfQ01EX1NUQVRTX0ZMVVNIX0JVRlE6Ci0JY2FzZSBWRkVfQ01EX1NUQVRTX1VOUkVHQlVGOgotCQkvKiBmb3IgZWFzeSBwb3J0aW5nIHB1dCBpbiBvbmUgZW52ZWxvcGUgKi8KLQkJcmMgPSB2ZmVfc3RhdHNfYnVmcV9zdWJfaW9jdGwodmZlNDBfY3RybCwKLQkJCQljbWQsIHZmZV9wYXJhbXMtPmRhdGEsIHBtY3RsLT5kb21haW5fbnVtKTsKLQkJcmV0dXJuIHJjOwotCWRlZmF1bHQ6Ci0JCWlmIChjbWQtPmNtZF90eXBlICE9IENNRF9DT05GSUdfUElOR19BRERSICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX0NPTkZJR19QT05HX0FERFIgJiYKLQkJY21kLT5jbWRfdHlwZSAhPSBDTURfQ09ORklHX0ZSRUVfQlVGX0FERFIgJiYKLQkJY21kLT5jbWRfdHlwZSAhPSBDTURfU1RBVFNfQUVDX0JVRl9SRUxFQVNFICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX0FXQl9CVUZfUkVMRUFTRSAmJgotCQljbWQtPmNtZF90eXBlICE9IENNRF9TVEFUU19JSElTVF9CVUZfUkVMRUFTRSAmJgotCQljbWQtPmNtZF90eXBlICE9IENNRF9TVEFUU19SU19CVUZfUkVMRUFTRSAmJgotCQljbWQtPmNtZF90eXBlICE9IENNRF9TVEFUU19DU19CVUZfUkVMRUFTRSAmJgotCQljbWQtPmNtZF90eXBlICE9IENNRF9TVEFUU19BRl9CVUZfUkVMRUFTRSAmJgotCQljbWQtPmNtZF90eXBlICE9IENNRF9TVEFUU19CR19CVUZfUkVMRUFTRSAmJgotCQljbWQtPmNtZF90eXBlICE9IENNRF9TVEFUU19CRV9CVUZfUkVMRUFTRSAmJgotCQljbWQtPmNtZF90eXBlICE9IENNRF9TVEFUU19CRl9CVUZfUkVMRUFTRSAmJgotCQljbWQtPmNtZF90eXBlICE9IENNRF9TVEFUU19CSElTVF9CVUZfUkVMRUFTRSAmJgotCQljbWQtPmNtZF90eXBlICE9IENNRF9WRkVfUElYX1NPRl9DT1VOVF9VUERBVEUgJiYKLQkJY21kLT5jbWRfdHlwZSAhPSBDTURfVkZFX0NPVU5UX1BJWF9TT0ZfRU5BQkxFKSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJnZmZWNtZCwKLQkJCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJCQlzaXplb2YodmZlY21kKSkpIHsKLQkJCQlwcl9lcnIoIiVzICVkOiBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBoZXJlIGVpdGggc3RhdHMgcmVsZWFzZSBvciBmcmFtZSByZWxlYXNlLiAqLwotCQkJaWYgKGNtZC0+Y21kX3R5cGUgIT0gQ01EX0NPTkZJR19QSU5HX0FERFIgJiYKLQkJCQljbWQtPmNtZF90eXBlICE9IENNRF9DT05GSUdfUE9OR19BRERSICYmCi0JCQkJY21kLT5jbWRfdHlwZSAhPSBDTURfQ09ORklHX0ZSRUVfQlVGX0FERFIpIHsKLQkJCQkvKiB0aGVuIG11c3QgYmUgc3RhdHMgcmVsZWFzZS4gKi8KLQkJCQlpZiAoIWRhdGEpIHsKLQkJCQkJcHJfZXJyKCIlczogZGF0YSA9IE5VTEwsIGNtZC0+Y21kX3R5cGUgPSAlZCIsCi0JCQkJCQlfX2Z1bmNfXywgY21kLT5jbWRfdHlwZSk7Ci0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlzYWNrID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZmZV9jbWRfc3RhdHNfYWNrKSwKLQkJCQkJCQlHRlBfQVRPTUlDKTsKLQkJCQlpZiAoIXNhY2spIHsKLQkJCQkJcHJfZXJyKCIlczogbm8gbWVtIGZvciBjbWQtPmNtZF90eXBlID0gJWQiLAotCQkJCQkgX19mdW5jX18sIGNtZC0+Y21kX3R5cGUpOwotCQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCQl9Ci0JCQkJc2Fjay0+bmV4dFN0YXRzQnVmID0gKih1aW50MzJfdCAqKWRhdGE7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlDREJHKCIlczogY21kVHlwZSA9ICVkXG4iLCBfX2Z1bmNfXywgY21kLT5jbWRfdHlwZSk7Ci0KLQlpZiAoKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0FGX0VOQUJMRSkgICAgfHwKLQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0FXQl9FTkFCTEUpICAgfHwKLQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0lISVNUX0VOQUJMRSkgfHwKLQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX1JTX0VOQUJMRSkgICAgfHwKLQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0NTX0VOQUJMRSkgICAgfHwKLQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0FFQ19FTkFCTEUpICAgfHwKLQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0JHX0VOQUJMRSkgICAgfHwKLQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0JFX0VOQUJMRSkgICAgfHwKLQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0JGX0VOQUJMRSkgICAgfHwKLQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0JISVNUX0VOQUJMRSkpIHsKLQkJc3RydWN0IGF4aWRhdGEgKmF4aWQ7Ci0JCWF4aWQgPSBkYXRhOwotCQlpZiAoIWF4aWQpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gdmZlNDBfY29uZmlnX2RvbmU7Ci0JCX0KLQkJQ0RCRygiJXM6IGNtZFR5cGUgPSAlZFxuIiwgX19mdW5jX18sIGNtZC0+Y21kX3R5cGUpOwotCi0JCWlmICgoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfQUZfRU5BQkxFKSAgICB8fAotCQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0FXQl9FTkFCTEUpICAgfHwKLQkJCShjbWQtPmNtZF90eXBlID09IENNRF9TVEFUU19JSElTVF9FTkFCTEUpIHx8Ci0JCQkoY21kLT5jbWRfdHlwZSA9PSBDTURfU1RBVFNfUlNfRU5BQkxFKSAgICB8fAotCQkJKGNtZC0+Y21kX3R5cGUgPT0gQ01EX1NUQVRTX0NTX0VOQUJMRSkgICAgfHwKLQkJCShjbWQtPmNtZF90eXBlID09IENNRF9TVEFUU19BRUNfRU5BQkxFKSkgewotCQkJCXNjZmcgPSBOVUxMOwotCQkJCS8qIGluZGl2aWR1YWwgKi8KLQkJCQlnb3RvIHZmZTQwX2NvbmZpZ19kb25lOwotCQl9Ci0JCXN3aXRjaCAoY21kLT5jbWRfdHlwZSkgewotCQljYXNlIENNRF9TVEFUU19BRUNfRU5BQkxFOgotCQljYXNlIENNRF9TVEFUU19CR19FTkFCTEU6Ci0JCWNhc2UgQ01EX1NUQVRTX0JFX0VOQUJMRToKLQkJY2FzZSBDTURfU1RBVFNfQkZfRU5BQkxFOgotCQljYXNlIENNRF9TVEFUU19CSElTVF9FTkFCTEU6Ci0JCWNhc2UgQ01EX1NUQVRTX0FXQl9FTkFCTEU6Ci0JCWNhc2UgQ01EX1NUQVRTX0lISVNUX0VOQUJMRToKLQkJY2FzZSBDTURfU1RBVFNfUlNfRU5BQkxFOgotCQljYXNlIENNRF9TVEFUU19DU19FTkFCTEU6Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoIiVzIFVuc3VwcG9ydGVkIGNtZCB0eXBlICVkIiwKLQkJCQlfX2Z1bmNfXywgY21kLT5jbWRfdHlwZSk7Ci0JCQlicmVhazsKLQkJfQotCQlnb3RvIHZmZTQwX2NvbmZpZ19kb25lOwotCX0KLQlzd2l0Y2ggKGNtZC0+Y21kX3R5cGUpIHsKLQljYXNlIENNRF9HRU5FUkFMOgotCQlyYyA9IHZmZTQwX3Byb2NfZ2VuZXJhbChwbWN0bCwgJnZmZWNtZCwgdmZlNDBfY3RybCk7Ci0JYnJlYWs7Ci0JY2FzZSBDTURfVkZFX0NPVU5UX1BJWF9TT0ZfRU5BQkxFOiB7Ci0JCWludCBlbmFibGUgPSAqKChpbnQgKiljbWQtPnZhbHVlKTsKLQkJaWYgKGVuYWJsZSkKLQkJCXZmZTQwX2N0cmwtPnZmZV9zb2ZfY291bnRfZW5hYmxlID0gVFJVRTsKLQkJZWxzZQotCQkJdmZlNDBfY3RybC0+dmZlX3NvZl9jb3VudF9lbmFibGUgPSBmYWxzZTsKLQl9Ci0JYnJlYWs7Ci0JY2FzZSBDTURfVkZFX1BJWF9TT0ZfQ09VTlRfVVBEQVRFOgotCQlpZiAoIXZmZTQwX2N0cmwtPnZmZV9zb2ZfY291bnRfZW5hYmxlKQotCQkJdmZlNDBfY3RybC0+c2hhcmVfY3RybC0+dmZlRnJhbWVJZCA9Ci0JCQkqKCh1aW50MzJfdCAqKXZmZV9wYXJhbXMtPmRhdGEpOwotCWJyZWFrOwotCWNhc2UgQ01EX0NPTkZJR19QSU5HX0FERFI6IHsKLQkJaW50IHBhdGggPSAqKChpbnQgKiljbWQtPnZhbHVlKTsKLQkJc3RydWN0IHZmZTQwX291dHB1dF9jaCAqb3V0Y2ggPQotCQkJdmZlNDBfZ2V0X2NoKHBhdGgsIHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwpOwotCQlvdXRjaC0+cGluZyA9ICooKHN0cnVjdCBtc21fZnJlZV9idWYgKilkYXRhKTsKLQl9Ci0JYnJlYWs7Ci0KLQljYXNlIENNRF9DT05GSUdfUE9OR19BRERSOiB7Ci0JCWludCBwYXRoID0gKigoaW50ICopY21kLT52YWx1ZSk7Ci0JCXN0cnVjdCB2ZmU0MF9vdXRwdXRfY2ggKm91dGNoID0KLQkJCXZmZTQwX2dldF9jaChwYXRoLCB2ZmU0MF9jdHJsLT5zaGFyZV9jdHJsKTsKLQkJb3V0Y2gtPnBvbmcgPSAqKChzdHJ1Y3QgbXNtX2ZyZWVfYnVmICopZGF0YSk7Ci0JfQotCWJyZWFrOwotCi0JY2FzZSBDTURfQ09ORklHX0ZSRUVfQlVGX0FERFI6IHsKLQkJaW50IHBhdGggPSAqKChpbnQgKiljbWQtPnZhbHVlKTsKLQkJc3RydWN0IHZmZTQwX291dHB1dF9jaCAqb3V0Y2ggPQotCQkJdmZlNDBfZ2V0X2NoKHBhdGgsIHZmZTQwX2N0cmwtPnNoYXJlX2N0cmwpOwotCQlvdXRjaC0+ZnJlZV9idWYgPSAqKChzdHJ1Y3QgbXNtX2ZyZWVfYnVmICopZGF0YSk7Ci0JfQotCWJyZWFrOwotCi0JY2FzZSBDTURfU05BUF9CVUZfUkVMRUFTRToKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzIFVuc3VwcG9ydGVkIEFYSSBjb25maWd1cmF0aW9uICV4ICIsIF9fZnVuY19fLAotCQkJY21kLT5jbWRfdHlwZSk7Ci0JYnJlYWs7Ci0JfQotdmZlNDBfY29uZmlnX2RvbmU6Ci0Ja2ZyZWUoc2NmZyk7Ci0Ja2ZyZWUoc2Fjayk7Ci0JQ0RCRygiJXMgZG9uZTogcmMgPSAlZFxuIiwgX19mdW5jX18sIChpbnQpIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbV9jbGtfaW5mbyB2ZmU0MF9jbGtfaW5mb1tdID0gewotCXsiY2Ftc3NfdG9wX2FoYl9jbGsiLCAtMX0sCi0JeyJ2ZmVfY2xrX3NyYyIsIDI2NjY3MDAwMH0sCi0JeyJjYW1zc192ZmVfdmZlX2NsayIsIC0xfSwKLQl7ImNhbXNzX2NzaV92ZmVfY2xrIiwgLTF9LAotCXsiaWZhY2VfY2xrIiwgLTF9LAotCXsiYnVzX2NsayIsIC0xfSwKLQl7ImFsdF9idXNfY2xrIiwgLTF9LAotfTsKLQotc3RhdGljIGludCBtc21fYXhpX3N1YmRldl9zX2NyeXN0YWxfZnJlcShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCQkJCQkJdTMyIGZyZXEsIHUzMiBmbGFncykKLXsKLQlpbnQgcmMgPSAwOwotCWludCByb3VuZF9yYXRlOwotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCi0Jcm91bmRfcmF0ZSA9IGNsa19yb3VuZF9yYXRlKGF4aV9jdHJsLT52ZmVfY2xrWzFdLCBmcmVxKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNsa19yb3VuZF9yYXRlIGZhaWxlZCAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXZmZV9jbGtfcmF0ZSA9IHJvdW5kX3JhdGU7Ci0JcmMgPSBjbGtfc2V0X3JhdGUoYXhpX2N0cmwtPnZmZV9jbGtbMV0sIHJvdW5kX3JhdGUpOwotCWlmIChyYyA8IDApCi0JCXByX2VycigiJXM6IGNsa19zZXRfcmF0ZSBmYWlsZWQgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByYyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbXNtX3ZmZV9zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmlvY3RsID0gbXNtX3ZmZV9zdWJkZXZfaW9jdGwsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBtc21fdmZlX3N1YmRldl9vcHMgPSB7Ci0JLmNvcmUgPSAmbXNtX3ZmZV9zdWJkZXZfY29yZV9vcHMsCi19OwotCi1zdGF0aWMgdm9pZCBtc21fdmZlNDBfaW5pdF92YmlmX3Bhcm1zKHZvaWQgX19pb21lbSAqdmZlX3ZiaWZfYmFzZSkKLXsKLQltc21fY2FtZXJhX2lvX3coMHgxLAotCQl2ZmVfdmJpZl9iYXNlICsgVkZFNDBfVkJJRl9DTEtPTik7Ci0JbXNtX2NhbWVyYV9pb193KDB4MDEwMTAxMDEsCi0JCXZmZV92YmlmX2Jhc2UgKyBWRkU0MF9WQklGX0lOX1JEX0xJTV9DT05GMCk7Ci0JbXNtX2NhbWVyYV9pb193KDB4MDEwMTAxMDEsCi0JCXZmZV92YmlmX2Jhc2UgKyBWRkU0MF9WQklGX0lOX1JEX0xJTV9DT05GMSk7Ci0JbXNtX2NhbWVyYV9pb193KDB4MTAwMTAxMTAsCi0JCXZmZV92YmlmX2Jhc2UgKyBWRkU0MF9WQklGX0lOX1JEX0xJTV9DT05GMik7Ci0JbXNtX2NhbWVyYV9pb193KDB4MTAxMDEwMTAsCi0JCXZmZV92YmlmX2Jhc2UgKyBWRkU0MF9WQklGX0lOX1dSX0xJTV9DT05GMCk7Ci0JbXNtX2NhbWVyYV9pb193KDB4MTAxMDEwMTAsCi0JCXZmZV92YmlmX2Jhc2UgKyBWRkU0MF9WQklGX0lOX1dSX0xJTV9DT05GMSk7Ci0JbXNtX2NhbWVyYV9pb193KDB4MTAxMDEwMTAsCi0JCXZmZV92YmlmX2Jhc2UgKyBWRkU0MF9WQklGX0lOX1dSX0xJTV9DT05GMik7Ci0JbXNtX2NhbWVyYV9pb193KDB4MDAwMDEwMTAsCi0JCXZmZV92YmlmX2Jhc2UgKyBWRkU0MF9WQklGX09VVF9SRF9MSU1fQ09ORjApOwotCW1zbV9jYW1lcmFfaW9fdygweDAwMDAxMDEwLAotCQl2ZmVfdmJpZl9iYXNlICsgVkZFNDBfVkJJRl9PVVRfV1JfTElNX0NPTkYwKTsKLQltc21fY2FtZXJhX2lvX3coMHgwMDAwMDcwNywKLQkJdmZlX3ZiaWZfYmFzZSArIFZGRTQwX1ZCSUZfRERSX09VVF9NQVhfQlVSU1QpOwotCW1zbV9jYW1lcmFfaW9fdygweDAwMDAwNzA3LAotCQl2ZmVfdmJpZl9iYXNlICsgVkZFNDBfVkJJRl9PQ01FTV9PVVRfTUFYX0JVUlNUKTsKLQltc21fY2FtZXJhX2lvX3coMHgwMDAwMDAzMCwKLQkJdmZlX3ZiaWZfYmFzZSArIFZGRTQwX1ZCSUZfQVJCX0NUTCk7Ci0JbXNtX2NhbWVyYV9pb193KDB4MDQyMTA4NDIsCi0JCXZmZV92YmlmX2Jhc2UgKyBWRkU0MF9WQklGX0REUl9BUkJfQ09ORjApOwotCW1zbV9jYW1lcmFfaW9fdygweDA0MjEwODQyLAotCQl2ZmVfdmJpZl9iYXNlICsgVkZFNDBfVkJJRl9ERFJfQVJCX0NPTkYxKTsKLQltc21fY2FtZXJhX2lvX3coMHgwMDAwMDAwMSwKLQkJdmZlX3ZiaWZfYmFzZSArIFZGRTQwX1ZCSUZfUk9VTkRfUk9CSU5fUU9TX0FSQik7Ci0JbXNtX2NhbWVyYV9pb193KDB4MjIyMjIyMjIsCi0JCXZmZV92YmlmX2Jhc2UgKyBWRkU0MF9WQklGX09VVF9BWElfQU1FTVRZUEVfQ09ORjApOwotCW1zbV9jYW1lcmFfaW9fdygweDAwMDAyMjIyLAotCQl2ZmVfdmJpZl9iYXNlICsgVkZFNDBfVkJJRl9PVVRfQVhJX0FNRU1UWVBFX0NPTkYxKTsKLQltc21fY2FtZXJhX2lvX3coMHgwMDAwMEZGRiwKLQkJdmZlX3ZiaWZfYmFzZSArIFZGRTQwX1ZCSUZfT1VUX0FYSV9BT09PX0VOKTsKLQltc21fY2FtZXJhX2lvX3coMHgwRkZGMEZGRiwKLQkJdmZlX3ZiaWZfYmFzZSArIFZGRTQwX1ZCSUZfT1VUX0FYSV9BT09PKTsKLX0KLQotaW50IG1zbV9heGlfc3ViZGV2X2luaXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKm1jdGw7Ci0JbWN0bCA9IHY0bDJfZ2V0X3N1YmRldl9ob3N0ZGF0YShzZCk7Ci0JaWYgKG1jdGwgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBtY3RsIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG1jdGxfZmFpbGVkOwotCX0KLQlheGlfY3RybC0+c2hhcmVfY3RybC0+YXhpX3JlZl9jbnQrKzsKLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmF4aV9yZWZfY250ID4gMSkKLQkJcmV0dXJuIHJjOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmF4aV9jdHJsLT50YXNrbGV0X2xvY2spOwotCUlOSVRfTElTVF9IRUFEKCZheGlfY3RybC0+dGFza2xldF9xKTsKLQlzcGluX2xvY2tfaW5pdCgmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnNkX25vdGlmeV9sb2NrKTsKLQotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlID0gaW9yZW1hcChheGlfY3RybC0+dmZlbWVtLT5zdGFydCwKLQkJcmVzb3VyY2Vfc2l6ZShheGlfY3RybC0+dmZlbWVtKSk7Ci0JaWYgKCFheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCXByX2VycigiJXM6IHZmZSBpb3JlbWFwIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIHJlbWFwX2ZhaWxlZDsKLQl9Ci0KLQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlX3ZiaWZfYmFzZSA9Ci0JCWlvcmVtYXAoYXhpX2N0cmwtPnZmZV92YmlmX21lbS0+c3RhcnQsCi0JCQlyZXNvdXJjZV9zaXplKGF4aV9jdHJsLT52ZmVfdmJpZl9tZW0pKTsKLQlpZiAoIWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmVfdmJpZl9iYXNlKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJcHJfZXJyKCIlczogdmZlIGlvcmVtYXAgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gcmVtYXBfZmFpbGVkOwotCX0KLQotCWlmIChheGlfY3RybC0+ZnNfdmZlKSB7Ci0JCXJjID0gcmVndWxhdG9yX2VuYWJsZShheGlfY3RybC0+ZnNfdmZlKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcl9lcnIoIiVzOiBSZWd1bGF0b3IgZW5hYmxlIGZhaWxlZFxuIiwJX19mdW5jX18pOwotCQkJZ290byBmc19mYWlsZWQ7Ci0JCX0KLQl9Ci0KLQlyYyA9IG1zbV9jYW1fY2xrX2VuYWJsZSgmYXhpX2N0cmwtPnBkZXYtPmRldiwgdmZlNDBfY2xrX2luZm8sCi0JCQlheGlfY3RybC0+dmZlX2NsaywgQVJSQVlfU0laRSh2ZmU0MF9jbGtfaW5mbyksIDEpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gY2xrX2VuYWJsZV9mYWlsZWQ7Ci0KLQlheGlfY3RybC0+YnVzX3BlcmZfY2xpZW50ID0KLQkJbXNtX2J1c19zY2FsZV9yZWdpc3Rlcl9jbGllbnQoJnZmZV9idXNfY2xpZW50X3BkYXRhKTsKLQlpZiAoIWF4aV9jdHJsLT5idXNfcGVyZl9jbGllbnQpIHsKLQkJcHJfZXJyKCIlczogUmVnaXN0cmF0aW9uIEZhaWxlZCFcbiIsIF9fZnVuY19fKTsKLQkJYXhpX2N0cmwtPmJ1c19wZXJmX2NsaWVudCA9IDA7Ci0JCWdvdG8gYnVzX3NjYWxlX3JlZ2lzdGVyX2ZhaWxlZDsKLQl9Ci0KLQltc21fY2FtZXJhX2J1c19zY2FsZV9jZmcoYXhpX2N0cmwtPmJ1c19wZXJmX2NsaWVudCwgU19QUkVWSUVXKTsKLQotCXJjID0gaW9tbXVfYXR0YWNoX2RldmljZShtY3RsLT5kb21haW4sIGF4aV9jdHJsLT5pb21tdV9jdHgpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogaW1nd3IgYXR0YWNoIGZhaWxlZCByYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gZGV2aWNlX2ltZ3dyX2F0dGFjaF9mYWlsZWQ7Ci0JfQotCi0JbXNtX3ZmZTQwX2luaXRfdmJpZl9wYXJtcyhheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlX3ZiaWZfYmFzZSk7Ci0KLQlheGlfY3RybC0+c2hhcmVfY3RybC0+cmVnaXN0ZXJfdG90YWwgPSBWRkU0MF9SRUdJU1RFUl9UT1RBTDsKLQotCXNwaW5fbG9ja19pbml0KCZheGlfY3RybC0+c2hhcmVfY3RybC0+c3RvcF9mbGFnX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZheGlfY3RybC0+c2hhcmVfY3RybC0+dXBkYXRlX2Fja19sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnN0YXJ0X2Fja19sb2NrKTsKLQlpbml0X2NvbXBsZXRpb24oJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZXNldF9jb21wbGV0ZSk7Ci0KLQlpZiAoIWF4aV9jdHJsLT51c2VfaXJxX3JvdXRlcikKLQkJZW5hYmxlX2lycShheGlfY3RybC0+dmZlaXJxLT5zdGFydCk7Ci0KLQlyZXR1cm4gcmM7Ci0KLWJ1c19zY2FsZV9yZWdpc3Rlcl9mYWlsZWQ6Ci0JbXNtX2NhbV9jbGtfZW5hYmxlKCZheGlfY3RybC0+cGRldi0+ZGV2LCB2ZmU0MF9jbGtfaW5mbywKLQkJYXhpX2N0cmwtPnZmZV9jbGssIEFSUkFZX1NJWkUodmZlNDBfY2xrX2luZm8pLCAwKTsKLWNsa19lbmFibGVfZmFpbGVkOgotCWlmIChheGlfY3RybC0+ZnNfdmZlKQotCQlyZWd1bGF0b3JfZGlzYWJsZShheGlfY3RybC0+ZnNfdmZlKTsKLWZzX2ZhaWxlZDoKLQlpb3VubWFwKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlKTsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSA9IE5VTEw7Ci1yZW1hcF9mYWlsZWQ6Ci0JaW9tbXVfZGV0YWNoX2RldmljZShtY3RsLT5kb21haW4sIGF4aV9jdHJsLT5pb21tdV9jdHgpOwotZGV2aWNlX2ltZ3dyX2F0dGFjaF9mYWlsZWQ6Ci0JaWYgKCFheGlfY3RybC0+dXNlX2lycV9yb3V0ZXIpCi0JCWRpc2FibGVfaXJxKGF4aV9jdHJsLT52ZmVpcnEtPnN0YXJ0KTsKLW1jdGxfZmFpbGVkOgotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV92ZmVfc3ViZGV2X2luaXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKnZmZTQwX2N0cmwgPQotCQkoc3RydWN0IHZmZTQwX2N0cmxfdHlwZSAqKXY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCi0Jc3Bpbl9sb2NrX2luaXQoJnZmZTQwX2N0cmwtPnN0YXRlX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZ2ZmU0MF9jdHJsLT5zdGF0c19idWZxX2xvY2spOwotCi0JdmZlNDBfY3RybC0+dXBkYXRlX2xpbmVhciA9IGZhbHNlOwotCXZmZTQwX2N0cmwtPnVwZGF0ZV9yb2xsb2ZmID0gZmFsc2U7Ci0JdmZlNDBfY3RybC0+dXBkYXRlX2xhID0gZmFsc2U7Ci0JdmZlNDBfY3RybC0+dXBkYXRlX2dhbW1hID0gZmFsc2U7Ci0JdmZlNDBfY3RybC0+dmZlX3NvZl9jb3VudF9lbmFibGUgPSB0cnVlOwotCXZmZTQwX2N0cmwtPmhmcl9tb2RlID0gSEZSX01PREVfT0ZGOwotCi0JbWVtc2V0KCZ2ZmU0MF9jdHJsLT5zdGF0c19jdHJsLCAwLAotCQkgICBzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19idWZxX2N0cmwpKTsKLQltZW1zZXQoJnZmZTQwX2N0cmwtPnN0YXRzX29wcywgMCwgc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfb3BzKSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXZvaWQgbXNtX2F4aV9zdWJkZXZfcmVsZWFzZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQotewotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsID0KLQkJKHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKil2NGwyX2dldF9zdWJkZXZfaG9zdGRhdGEoc2QpOwotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCWlmICghYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UpIHsKLQkJcHJfZXJyKCIlczogYmFzZSBhZGRyZXNzIHVubWFwcGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlDREJHKCIlcywgZnJlZV9pcnFcbiIsIF9fZnVuY19fKTsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+YXhpX3JlZl9jbnQtLTsKLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmF4aV9yZWZfY250ID4gMCkKLQkJcmV0dXJuOwotCWlmICghYXhpX2N0cmwtPnVzZV9pcnFfcm91dGVyKQotCQlkaXNhYmxlX2lycShheGlfY3RybC0+dmZlaXJxLT5zdGFydCk7Ci0JdGFza2xldF9raWxsKCZheGlfY3RybC0+dmZlNDBfdGFza2xldCk7Ci0KLQlpb21tdV9kZXRhY2hfZGV2aWNlKHBtY3RsLT5kb21haW4sIGF4aV9jdHJsLT5pb21tdV9jdHgpOwotCi0JbXNtX2NhbV9jbGtfZW5hYmxlKCZheGlfY3RybC0+cGRldi0+ZGV2LCB2ZmU0MF9jbGtfaW5mbywKLQkJCWF4aV9jdHJsLT52ZmVfY2xrLCBBUlJBWV9TSVpFKHZmZTQwX2Nsa19pbmZvKSwgMCk7Ci0JaWYgKGF4aV9jdHJsLT5mc192ZmUpCi0JCXJlZ3VsYXRvcl9kaXNhYmxlKGF4aV9jdHJsLT5mc192ZmUpOwotCi0JaW91bm1hcChheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSk7Ci0JaW91bm1hcChheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlX3ZiaWZfYmFzZSk7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgPSBOVUxMOwotCi0JaWYgKGF0b21pY19yZWFkKCZpcnFfY250KSkKLQkJcHJfd2FybmluZygiJXMsIFdhcm5pbmcgSVJRIENvdW50IG5vdCBaRVJPXG4iLCBfX2Z1bmNfXyk7Ci0KLQltc21fY2FtZXJhX2J1c19zY2FsZV9jZmcoYXhpX2N0cmwtPmJ1c19wZXJmX2NsaWVudCwgU19FWElUKTsKLQlheGlfY3RybC0+YnVzX3BlcmZfY2xpZW50ID0gMDsKLQotCW1zbV92ZmVfc3ViZGV2X3JlbGVhc2UoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmU0MF9jdHJsLT5zdWJkZXYpOwotfQotCi12b2lkIG1zbV92ZmVfc3ViZGV2X3JlbGVhc2Uoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKLXsKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsID0KLQkJKHN0cnVjdCB2ZmU0MF9jdHJsX3R5cGUgKil2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlDREJHKCJ2ZmUgc3ViZGV2IHJlbGVhc2UgJXBcbiIsCi0JCXZmZTQwX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UpOwotfQotCi12b2lkIGF4aV9hYm9ydChzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwpCi17Ci0JdWludDhfdCAgYXhpX2J1c3lfZmxhZyA9IHRydWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQkvKiBheGkgaGFsdCBjb21tYW5kLiAqLwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT5zdG9wX2ZsYWdfbG9jaywgZmxhZ3MpOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5zdG9wX2Fja19wZW5kaW5nICA9IFRSVUU7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnN0b3BfZmxhZ19sb2NrLCBmbGFncyk7Ci0JbXNtX2NhbWVyYV9pb193KEFYSV9IQUxULAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9BWElfQ01EKTsKLQl3bWIoKTsKLQl3aGlsZSAoYXhpX2J1c3lfZmxhZykgewotCQlpZiAobXNtX2NhbWVyYV9pb19yKAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfQVhJX1NUQVRVUykgJiAweDEpCi0JCQlheGlfYnVzeV9mbGFnID0gZmFsc2U7Ci0JfQotCS8qIEVuc3VyZSB0aGUgd3JpdGUgb3JkZXIgd2hpbGUgd3JpdGluZwotCSogdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdXNpbmcgdGhlIGJhcnJpZXIgKi8KLQltc21fY2FtZXJhX2lvX3dfbWIoQVhJX0hBTFRfQ0xFQVIsCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0FYSV9DTUQpOwotCi0JLyogYWZ0ZXIgYXhpIGhhbHQsIHRoZW4gb2sgdG8gYXBwbHkgZ2xvYmFsIHJlc2V0LgotCSogZW5hYmxlIHJlc2V0X2FjayBhbmQgYXN5bmMgdGltZXIgaW50ZXJydXB0IG9ubHkgd2hpbGUKLQkqIHN0b3BwaW5nIHRoZSBwaXBlbGluZS4qLwotCW1zbV9jYW1lcmFfaW9fdygweDgwMDAwMDAwLAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfTUFTS18wKTsKLQltc21fY2FtZXJhX2lvX3coMHhGMDAwMDAwMCwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX01BU0tfMSk7Ci0KLQkvKiBFbnN1cmUgdGhlIHdyaXRlIG9yZGVyIHdoaWxlIHdyaXRpbmcKLQkqIHRvIHRoZSBjb21tYW5kIHJlZ2lzdGVyIHVzaW5nIHRoZSBiYXJyaWVyICovCi0JbXNtX2NhbWVyYV9pb193X21iKFZGRV9SRVNFVF9VUE9OX1NUT1BfQ01ELAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9HTE9CQUxfUkVTRVQpOwotCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+c3luY19hYm9ydCkKLQkJd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKAotCQkJJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZXNldF9jb21wbGV0ZSk7Ci19Ci0KLWludCBheGlfY29uZmlnX2J1ZmZlcnMoc3RydWN0IGF4aV9jdHJsX3QgKmF4aV9jdHJsLAotCXN0cnVjdCBtc21fY2FtZXJhX3ZmZV9wYXJhbXNfdCB2ZmVfcGFyYW1zKQotewotCXVpbnQxNl90IHZmZV9tb2RlID0gYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZQotCQkJJiB+KFZGRV9PVVRQVVRTX1JESTB8VkZFX09VVFBVVFNfUkRJMSk7Ci0JaW50IHJjID0gMDsKLQlzd2l0Y2ggKHZmZV9wYXJhbXMuY21kX3R5cGUpIHsKLQljYXNlIEFYSV9DTURfUFJFVklFVzoKLQkJaWYgKHZmZV9tb2RlKSB7Ci0JCQlpZiAoKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX1BSRVZJRVdfQU5EX1ZJREVPKSB8fAotCQkJCShheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19QUkVWSUVXKSkKLQkJCQkvKiBDb25maWd1cmUgcHJpbWFyeSBjaGFubmVsICovCi0JCQkJcmMgPSBjb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycygKLQkJCQkJVkZFX01TR19TVEFSVCwKLQkJCQkJVkZFX01TR19PVVRQVVRfUFJJTUFSWSwKLQkJCQkJYXhpX2N0cmwpOwotCQkJZWxzZQotCQkJLyogQ29uZmlndXJlIHNlY29uZGFyeSBjaGFubmVsICovCi0JCQkJcmMgPSBjb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycygKLQkJCQkJVkZFX01TR19TVEFSVCwKLQkJCQkJVkZFX01TR19PVVRQVVRfU0VDT05EQVJZLAotCQkJCQlheGlfY3RybCk7Ci0JCX0KLQkJaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgJgotCQkJCVZGRV9PVVRQVVRTX1JESTApCi0JCQlyYyA9IGNvbmZpZ3VyZV9waW5ncG9uZ19idWZmZXJzKAotCQkJCVZGRV9NU0dfU1RBUlQsIFZGRV9NU0dfT1VUUFVUX1RFUlRJQVJZMSwKLQkJCQlheGlfY3RybCk7Ci0JCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYKLQkJCQlWRkVfT1VUUFVUU19SREkxKQotCQkJcmMgPSBjb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycygKLQkJCQlWRkVfTVNHX1NUQVJULCBWRkVfTVNHX09VVFBVVF9URVJUSUFSWTIsCi0JCQkJYXhpX2N0cmwpOwotCi0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgZXJyb3IgY29uZmlndXJpbmcgcGluZ3BvbmcgYnVmZmVycyBmb3IgcHJldmlldyIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCQlicmVhazsKLQljYXNlIEFYSV9DTURfUkFXX0NBUFRVUkU6Ci0JCXJjID0gY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoCi0JCQlWRkVfTVNHX0NBUFRVUkUsIFZGRV9NU0dfT1VUUFVUX1BSSU1BUlksCi0JCQlheGlfY3RybCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgZXJyb3IgY29uZmlndXJpbmcgcGluZ3BvbmcgYnVmZmVycyBmb3Igc25hcHNob3QiLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBWElfQ01EX1pTTDoKLQkJcmMgPSBjb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycyhWRkVfTVNHX1NUQVJULAotCQkJVkZFX01TR19PVVRQVVRfUFJJTUFSWSwgYXhpX2N0cmwpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBjb25maWdfZG9uZTsKLQkJcmMgPSBjb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycyhWRkVfTVNHX1NUQVJULAotCQkJVkZFX01TR19PVVRQVVRfU0VDT05EQVJZLCBheGlfY3RybCk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIGNvbmZpZ19kb25lOwotCQlicmVhazsKLQljYXNlIEFYSV9DTURfUkVDT1JEOgotCQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmCi0JCQlWRkVfT1VUUFVUU19QUkVWSUVXX0FORF9WSURFTykgewotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5pbnN0X2hhbmRsZSA9Ci0JCQkJdmZlX3BhcmFtcy5pbnN0X2hhbmRsZTsKLQkJCXJjID0gY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoCi0JCQkJVkZFX01TR19TVEFSVF9SRUNPUkRJTkcsCi0JCQkJVkZFX01TR19PVVRQVVRfU0VDT05EQVJZLAotCQkJCWF4aV9jdHJsKTsKLQkJfSBlbHNlIGlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYKLQkJCVZGRV9PVVRQVVRTX1ZJREVPX0FORF9QUkVWSUVXKSB7Ci0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmluc3RfaGFuZGxlID0KLQkJCQl2ZmVfcGFyYW1zLmluc3RfaGFuZGxlOwotCQkJcmMgPSBjb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycygKLQkJCQlWRkVfTVNHX1NUQVJUX1JFQ09SRElORywKLQkJCQlWRkVfTVNHX09VVFBVVF9QUklNQVJZLAotCQkJCWF4aV9jdHJsKTsKLQkJfQotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzIGVycm9yIGNvbmZpZ3VyaW5nIHBpbmdwb25nIGJ1ZmZlcnMgZm9yIHZpZGVvIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGNvbmZpZ19kb25lOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVhJX0NNRF9MSVZFU0hPVDoKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5pbnN0X2hhbmRsZSA9Ci0JCQl2ZmVfcGFyYW1zLmluc3RfaGFuZGxlOwotCQlyYyA9IGNvbmZpZ3VyZV9waW5ncG9uZ19idWZmZXJzKFZGRV9NU0dfQ0FQVFVSRSwKLQkJCQkJVkZFX01TR19PVVRQVVRfUFJJTUFSWSwgYXhpX2N0cmwpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzIGVycm9yIGNvbmZpZ3VyaW5nIHBpbmdwb25nIGJ1ZmZlcnMgZm9yIHByaW1hcnkgb3V0cHV0IiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGNvbmZpZ19kb25lOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVhJX0NNRF9DQVBUVVJFOgotCQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSA9PQotCQkJVkZFX09VVFBVVFNfSlBFR19BTkRfVEhVTUIgfHwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSA9PQotCQkJVkZFX09VVFBVVFNfVEhVTUJfQU5EX0pQRUcpIHsKLQotCQkJLyogQ29uZmlndXJlIHByaW1hcnkgY2hhbm5lbCBmb3IgSlBFRyAqLwotCQkJcmMgPSBjb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycygKLQkJCQlWRkVfTVNHX0pQRUdfQ0FQVFVSRSwKLQkJCQlWRkVfTVNHX09VVFBVVF9QUklNQVJZLAotCQkJCWF4aV9jdHJsKTsKLQkJfSBlbHNlIHsKLQkJCS8qIENvbmZpZ3VyZSBwcmltYXJ5IGNoYW5uZWwgKi8KLQkJCXJjID0gY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoCi0JCQkJVkZFX01TR19DQVBUVVJFLAotCQkJCVZGRV9NU0dfT1VUUFVUX1BSSU1BUlksCi0JCQkJYXhpX2N0cmwpOwotCQl9Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgZXJyb3IgY29uZmlndXJpbmcgcGluZ3BvbmcgYnVmZmVycyBmb3IgcHJpbWFyeSBvdXRwdXQiLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQkJLyogQ29uZmlndXJlIHNlY29uZGFyeSBjaGFubmVsICovCi0JCXJjID0gY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoCi0JCQkJVkZFX01TR19DQVBUVVJFLCBWRkVfTVNHX09VVFBVVF9TRUNPTkRBUlksCi0JCQkJYXhpX2N0cmwpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzIGVycm9yIGNvbmZpZ3VyaW5nIHBpbmdwb25nIGJ1ZmZlcnMgZm9yIHNlY29uZGFyeSBvdXRwdXQiLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQotCX0KLWNvbmZpZ19kb25lOgotCXJldHVybiByYzsKLX0KLQotdm9pZCBheGlfc3RhcnQoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqcG1jdGwsCi0Jc3RydWN0IGF4aV9jdHJsX3QgKmF4aV9jdHJsLCBzdHJ1Y3QgbXNtX2NhbWVyYV92ZmVfcGFyYW1zX3QgdmZlX3BhcmFtcykKLXsKLQl1aW50MzJfdCBpcnFfY29tcF9tYXNrID0gMCwgaXJxX21hc2sgPSAwOwotCWludCByYyA9IDA7Ci0JdWludDMyX3QgcmVnX3VwZGF0ZSA9IDA7Ci0JdWludDE2X3Qgb3BlcmF0aW9uX21vZGUgPQotCQkoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmCi0JCX4oVkZFX09VVFBVVFNfUkRJMHxWRkVfT1VUUFVUU19SREkxKSk7Ci0JcmMgPSBheGlfY29uZmlnX2J1ZmZlcnMoYXhpX2N0cmwsIHZmZV9wYXJhbXMpOwotCWlmIChyYyA8IDApCi0JCXJldHVybjsKLQotCXN3aXRjaCAodmZlX3BhcmFtcy5jbWRfdHlwZSkgewotCWNhc2UgQVhJX0NNRF9QUkVWSUVXOgotCQltc21fY2FtZXJhX2J1c19zY2FsZV9jZmcoYXhpX2N0cmwtPmJ1c19wZXJmX2NsaWVudCwgU19QUkVWSUVXKTsKLQkJYnJlYWs7Ci0JY2FzZSBBWElfQ01EX0NBUFRVUkU6Ci0JY2FzZSBBWElfQ01EX1JBV19DQVBUVVJFOgotCQltc21fY2FtZXJhX2J1c19zY2FsZV9jZmcoYXhpX2N0cmwtPmJ1c19wZXJmX2NsaWVudCwgU19DQVBUVVJFKTsKLQkJYnJlYWs7Ci0JY2FzZSBBWElfQ01EX1JFQ09SRDoKLQkJbXNtX2NhbWVyYV9idXNfc2NhbGVfY2ZnKGF4aV9jdHJsLT5idXNfcGVyZl9jbGllbnQsIFNfVklERU8pOwotCQlyZXR1cm47Ci0JY2FzZSBBWElfQ01EX1pTTDoKLQkJbXNtX2NhbWVyYV9idXNfc2NhbGVfY2ZnKGF4aV9jdHJsLT5idXNfcGVyZl9jbGllbnQsIFNfWlNMKTsKLQkJYnJlYWs7Ci0JY2FzZSBBWElfQ01EX0xJVkVTSE9UOgotCQltc21fY2FtZXJhX2J1c19zY2FsZV9jZmcoYXhpX2N0cmwtPmJ1c19wZXJmX2NsaWVudCwgU19MSVZFU0hPVCk7Ci0JCXJldHVybjsKLQlkZWZhdWx0OgotCQlyZXR1cm47Ci0JfQotCi0JaXJxX2NvbXBfbWFzayA9Ci0JCW1zbV9jYW1lcmFfaW9fcihheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfSVJRX0NPTVBfTUFTSyk7Ci0JaXJxX21hc2sgPSBtc21fY2FtZXJhX2lvX3IoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJVkZFX0lSUV9NQVNLXzApOwotCi0JaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTQwX09VVFBVVF9NT0RFX1BSSU1BUlkpIHsKLQkJaWYgKHZmZV9wYXJhbXMuY21kX3R5cGUgPT0gQVhJX0NNRF9SQVdfQ0FQVFVSRSkgewotCQkJaXJxX2NvbXBfbWFzayB8PQotCQkJCTB4MSA8PCBheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMDsKLQkJfSBlbHNlIHsKLQkJCWlycV9jb21wX21hc2sgfD0gKAotCQkJCTB4MSA8PCBheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMCB8Ci0JCQkJMHgxIDw8IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxKTsKLQkJfQotCQlpcnFfbWFzayB8PSBWRkVfSVJRX1NUQVRVUzBfSU1BR0VfQ09NUE9TSVRfRE9ORTBfTUFTSzsKLQl9IGVsc2UgaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCSAgIFZGRTQwX09VVFBVVF9NT0RFX1BSSU1BUllfQUxMX0NITkxTKSB7Ci0JCWlycV9jb21wX21hc2sgfD0gKAotCQkJMHgxIDw8IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwIHwKLQkJCTB4MSA8PCBheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMSB8Ci0JCQkweDEgPDwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDIpOwotCQlpcnFfbWFzayB8PSBWRkVfSVJRX1NUQVRVUzBfSU1BR0VfQ09NUE9TSVRfRE9ORTBfTUFTSzsKLQl9Ci0JaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTQwX09VVFBVVF9NT0RFX1NFQ09OREFSWSkgewotCQlpcnFfY29tcF9tYXNrIHw9ICgKLQkJCTB4MSA8PCAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDAgKyA4KSB8Ci0JCQkweDEgPDwgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxICsgOCkpOwotCQlpcnFfbWFzayB8PSBWRkVfSVJRX1NUQVRVUzBfSU1BR0VfQ09NUE9TSVRfRE9ORTFfTUFTSzsKLQl9IGVsc2UgaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTQwX09VVFBVVF9NT0RFX1NFQ09OREFSWV9BTExfQ0hOTFMpIHsKLQkJaXJxX2NvbXBfbWFzayB8PSAoCi0JCQkweDEgPDwgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwICsgOCkgfAotCQkJMHgxIDw8IChheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSArIDgpIHwKLQkJCTB4MSA8PCAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDIgKyA4KSk7Ci0JCWlycV9tYXNrIHw9IFZGRV9JUlFfU1RBVFVTMF9JTUFHRV9DT01QT1NJVF9ET05FMV9NQVNLOwotCX0KLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQlWRkU0MF9PVVRQVVRfTU9ERV9URVJUSUFSWTEpIHsKLQkJaXJxX21hc2sgfD0gKDB4MSA8PCAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5jaDAgKwotCQkJVkZFX1dNX09GRlNFVCkpOwotCX0KLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQlWRkU0MF9PVVRQVVRfTU9ERV9URVJUSUFSWTIpIHsKLQkJaXJxX21hc2sgfD0gKDB4MSA8PCAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0My5jaDAgKwotCQkJVkZFX1dNX09GRlNFVCkpOwotCX0KLQotCW1zbV9jYW1lcmFfaW9fdyhpcnFfY29tcF9tYXNrLAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ09NUF9NQVNLKTsKLQltc21fY2FtZXJhX2lvX3coaXJxX21hc2ssIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9JUlFfTUFTS18wKTsKLQotCXN3aXRjaCAodmZlX3BhcmFtcy5jbWRfdHlwZSkgewotCWNhc2UgQVhJX0NNRF9QUkVWSUVXOiB7Ci0JCXN3aXRjaCAob3BlcmF0aW9uX21vZGUpIHsKLQkJY2FzZSBWRkVfT1VUUFVUU19QUkVWSUVXOgotCQljYXNlIFZGRV9PVVRQVVRTX1BSRVZJRVdfQU5EX1ZJREVPOgotCQkJaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCQlWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZKSB7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlNDBfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDBdKTsKLQkJCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UKLQkJCQkJKyB2ZmU0MF9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMV0pOwotCQkJfSBlbHNlIGlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCQkJCVZGRTQwX09VVFBVVF9NT0RFX1BSSU1BUllfQUxMX0NITkxTKSB7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlNDBfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDBdKTsKLQkJCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UKLQkJCQkJKyB2ZmU0MF9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMV0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZQotCQkJCQkrIHZmZTQwX0FYSV9XTV9DRkdbYXhpX2N0cmwtPgotCQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gyXSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCQkJVkZFNDBfT1VUUFVUX01PREVfU0VDT05EQVJZKSB7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlNDBfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDBdKTsKLQkJCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UKLQkJCQkJKyB2ZmU0MF9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMV0pOwotCQkJfSBlbHNlIGlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCQkJVkZFNDBfT1VUUFVUX01PREVfU0VDT05EQVJZX0FMTF9DSE5MUykgewotCQkJCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZQotCQkJCQkrIHZmZTQwX0FYSV9XTV9DRkdbYXhpX2N0cmwtPgotCQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwXSk7Ci0JCQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlCi0JCQkJCSsgdmZlNDBfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDFdKTsKLQkJCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UKLQkJCQkJKyB2ZmU0MF9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMl0pOwotCQkJfQotCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTQwX09VVFBVVF9NT0RFX1BSSU1BUlkpIHsKLQkJCWlmICh2ZmVfcGFyYW1zLmNtZF90eXBlID09IEFYSV9DTURfUkFXX0NBUFRVUkUpIHsKLQkJCQltc21fY2FtZXJhX2lvX3coMSwKLQkJCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCQl2ZmU0MF9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMF0pOwotCQkJfSBlbHNlIHsKLQkJCQltc21fY2FtZXJhX2lvX3coMSwKLQkJCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCQl2ZmU0MF9BWElfV01fQ0ZHW2F4aV9jdHJsCi0JCQkJCS0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMF0pOwotCQkJCW1zbV9jYW1lcmFfaW9fdygxLAotCQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJCXZmZTQwX0FYSV9XTV9DRkdbYXhpX2N0cmwtPgotCQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxXSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQkJCVZGRTQwX09VVFBVVF9NT0RFX1BSSU1BUllfQUxMX0NITkxTKSB7Ci0JCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTQwX0FYSV9XTV9DRkdbYXhpX2N0cmwtPgotCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDBdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlNDBfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMV0pOwotCQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmU0MF9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gyXSk7Ci0JCX0KLQotCQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQkJVkZFNDBfT1VUUFVUX01PREVfU0VDT05EQVJZKSB7Ci0JCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTQwX0FYSV9XTV9DRkdbYXhpX2N0cmwtPgotCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDBdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlNDBfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMV0pOwotCQl9IGVsc2UgaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCVZGRTQwX09VVFBVVF9NT0RFX1NFQ09OREFSWV9BTExfQ0hOTFMpIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlNDBfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmU0MF9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxXSk7Ci0JCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTQwX0FYSV9XTV9DRkdbYXhpX2N0cmwtPgotCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDJdKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmIFZGRV9PVVRQVVRTX1JESTApCi0JCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmU0MF9BWElfV01fQ0ZHW2F4aV9jdHJsLT5zaGFyZV9jdHJsLT4KLQkJCW91dHBhdGgub3V0Mi5jaDBdKTsKLQlpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmN1cnJlbnRfbW9kZSAmIFZGRV9PVVRQVVRTX1JESTEpCi0JCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQl2ZmU0MF9BWElfV01fQ0ZHW2F4aV9jdHJsLT5zaGFyZV9jdHJsLT4KLQkJCW91dHBhdGgub3V0My5jaDBdKTsKLQotCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYgVkZFX09VVFBVVFNfUkRJMCkgewotCQlpcnFfbWFzayB8PSBWRkVfSVJRX1NUQVRVUzBfUkRJMF9SRUdfVVBEQVRFX01BU0s7Ci0JCWlmICghYXRvbWljX2NtcHhjaGcoCi0JCQkmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTBfdXBkYXRlX2Fja19wZW5kaW5nLAotCQkJCTAsIDEpKQotCQkJcmVnX3VwZGF0ZSB8PSAweDI7Ci0JfQotCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYgVkZFX09VVFBVVFNfUkRJMSkgewotCQlpcnFfbWFzayB8PSBWRkVfSVJRX1NUQVRVUzBfUkRJMV9SRUdfVVBEQVRFX01BU0s7Ci0JCWlmICghYXRvbWljX2NtcHhjaGcoCi0JCQkmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTFfdXBkYXRlX2Fja19wZW5kaW5nLAotCQkJCTAsIDEpKQotCQkJcmVnX3VwZGF0ZSB8PSAweDQ7Ci0JfQotCW1zbV9jYW1lcmFfaW9fdyhpcnFfbWFzaywgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWRkVfSVJRX01BU0tfMCk7Ci0JaWYgKG9wZXJhdGlvbl9tb2RlKSB7Ci0JCWlmICghYXRvbWljX2NtcHhjaGcoCi0JCQkmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnBpeDBfdXBkYXRlX2Fja19wZW5kaW5nLAotCQkJCTAsIDEpKQotCQkJcmVnX3VwZGF0ZSB8PSAweDE7Ci0JfQotCi0JbXNtX2NhbWVyYV9pb193X21iKHJlZ191cGRhdGUsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfUkVHX1VQREFURV9DTUQpOwotCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSB8PQotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlOwotCWF4aV9lbmFibGVfaXJxKGF4aV9jdHJsLT5zaGFyZV9jdHJsKTsKLX0KLQotdm9pZCBheGlfc3RvcChzdHJ1Y3QgbXNtX2NhbV9tZWRpYV9jb250cm9sbGVyICpwbWN0bCwKLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwsIHN0cnVjdCBtc21fY2FtZXJhX3ZmZV9wYXJhbXNfdCB2ZmVfcGFyYW1zKQotewotCXVpbnQzMl90IHJlZ191cGRhdGUgPSAwOwotCXVpbnQzMl90IG9wZXJhdGlvbl9tb2RlID0KLQlheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYgfihWRkVfT1VUUFVUU19SREkwfAotCQlWRkVfT1VUUFVUU19SREkxKTsKLQotCXN3aXRjaCAodmZlX3BhcmFtcy5jbWRfdHlwZSkgewotCWNhc2UgQVhJX0NNRF9QUkVWSUVXOgotCWNhc2UgQVhJX0NNRF9DQVBUVVJFOgotCWNhc2UgQVhJX0NNRF9SQVdfQ0FQVFVSRToKLQljYXNlIEFYSV9DTURfWlNMOgotCQlicmVhazsKLQljYXNlIEFYSV9DTURfUkVDT1JEOgotCQltc21fY2FtZXJhX2J1c19zY2FsZV9jZmcoYXhpX2N0cmwtPmJ1c19wZXJmX2NsaWVudCwgU19QUkVWSUVXKTsKLQkJcmV0dXJuOwotCWNhc2UgQVhJX0NNRF9MSVZFU0hPVDoKLQkJbXNtX2NhbWVyYV9idXNfc2NhbGVfY2ZnKGF4aV9jdHJsLT5idXNfcGVyZl9jbGllbnQsIFNfVklERU8pOwotCQlyZXR1cm47Ci0JZGVmYXVsdDoKLQkJcmV0dXJuOwotCX0KLQotCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+c3RvcF9pbW1lZGlhdGVseSkgewotCQlheGlfZGlzYWJsZV9pcnEoYXhpX2N0cmwtPnNoYXJlX2N0cmwpOwotCQlheGlfc3RvcF9wcm9jZXNzKGF4aV9jdHJsLT5zaGFyZV9jdHJsKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlICYgVkZFX09VVFBVVFNfUkRJMCkgewotCQlpZiAoIWF0b21pY19jbXB4Y2hnKAotCQkJJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT5yZGkwX3VwZGF0ZV9hY2tfcGVuZGluZywgMCwgMikpCi0JCQlyZWdfdXBkYXRlIHw9IDB4MjsKLQl9Ci0JaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgJiBWRkVfT1VUUFVUU19SREkxKSB7Ci0JCWlmICghYXRvbWljX2NtcHhjaGcoCi0JCQkmYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTFfdXBkYXRlX2Fja19wZW5kaW5nLCAwLCAyKSkKLQkJCXJlZ191cGRhdGUgfD0gMHg0OwotCX0KLQlpZiAob3BlcmF0aW9uX21vZGUpIHsKLQkJaWYgKCFhdG9taWNfY21weGNoZygKLQkJCSZheGlfY3RybC0+c2hhcmVfY3RybC0+cGl4MF91cGRhdGVfYWNrX3BlbmRpbmcsIDAsIDIpKQotCQkJcmVnX3VwZGF0ZSB8PSAweDE7Ci0JfQotCW1zbV9jYW1lcmFfaW9fd19tYihyZWdfdXBkYXRlLAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9SRUdfVVBEQVRFX0NNRCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2F4aV9jb25maWcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlzdHJ1Y3QgbXNtX3ZmZV9jZmdfY21kIGNmZ2NtZDsKLQlzdHJ1Y3QgbXNtX2lzcF9jbWQgdmZlY21kOwotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsID0KLQkJKHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKil2NGwyX2dldF9zdWJkZXZfaG9zdGRhdGEoc2QpOwotCWludCByYyA9IDAsIHZmZV9jbWRfdHlwZSA9IDAsIHJkaV9tb2RlID0gMDsKLQotCWlmICghYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UpIHsKLQkJcHJfZXJyKCIlczogYmFzZSBhZGRyZXNzIHVubWFwcGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQltZW1zZXQoJmNmZ2NtZCwgMCwgc2l6ZW9mKHN0cnVjdCBtc21fdmZlX2NmZ19jbWQpKTsKLQlpZiAoTlVMTCAhPSBhcmcpIHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmdjbWQsIGFyZywgc2l6ZW9mKGNmZ2NtZCkpKSB7Ci0JCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfQotCW1lbXNldCgmdmZlY21kLCAwLCBzaXplb2Yoc3RydWN0IG1zbV9pc3BfY21kKSk7Ci0JaWYgKE5VTEwgIT0gY2ZnY21kLnZhbHVlKSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdmZlY21kLAotCQkJCSh2b2lkIF9fdXNlciAqKShjZmdjbWQudmFsdWUpLAotCQkJCXNpemVvZih2ZmVjbWQpKSkgewotCQkJcHJfZXJyKCIlcyAlZDogY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXywKLQkJCQlfX0xJTkVfXyk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCX0KLQotCXZmZV9jbWRfdHlwZSA9IChjZmdjbWQuY21kX3R5cGUgJiB+KENNRF9BWElfQ0ZHX1RFUlQxfAotCQlDTURfQVhJX0NGR19URVJUMikpOwotCXN3aXRjaCAoY2ZnY21kLmNtZF90eXBlKSB7Ci0JY2FzZSBDTURfQVhJX0NGR19URVJUMTp7Ci0JCXVpbnQzMl90ICpheGlvID0gTlVMTDsKLQkJYXhpbyA9IGttYWxsb2ModmZlNDBfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCwKLQkJCQlHRlBfQVRPTUlDKTsKLQkJaWYgKCFheGlvKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXZmZTQwX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgpKSB7Ci0JCQlrZnJlZShheGlvKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCXZmZTQwX2NvbmZpZ19heGkoYXhpX2N0cmwsIE9VVFBVVF9URVJUMSwgYXhpbyk7Ci0JCWtmcmVlKGF4aW8pOwotCQlyZXR1cm4gcmM7Ci0JCX0KLQljYXNlIENNRF9BWElfQ0ZHX1RFUlQyOnsKLQkJdWludDMyX3QgKmF4aW8gPSBOVUxMOwotCQlheGlvID0ga21hbGxvYyh2ZmU0MF9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ubGVuZ3RoLAotCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIWF4aW8pCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoYXhpbywgKHZvaWQgX191c2VyICopKHZmZWNtZC52YWx1ZSksCi0JCQkJdmZlNDBfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCkpIHsKLQkJCWtmcmVlKGF4aW8pOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJdmZlNDBfY29uZmlnX2F4aShheGlfY3RybCwgT1VUUFVUX1RFUlQyLCBheGlvKTsKLQkJa2ZyZWUoYXhpbyk7Ci0JCXJldHVybiByYzsKLQkJfQotCWNhc2UgQ01EX0FYSV9DRkdfVEVSVDF8Q01EX0FYSV9DRkdfVEVSVDI6ewotCQl1aW50MzJfdCAqYXhpbyA9IE5VTEw7Ci0JCWF4aW8gPSBrbWFsbG9jKHZmZTQwX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgsCi0JCQkJR0ZQX0FUT01JQyk7Ci0JCWlmICghYXhpbykKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihheGlvLCAodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQl2ZmU0MF9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ubGVuZ3RoKSkgewotCQkJa2ZyZWUoYXhpbyk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQl2ZmU0MF9jb25maWdfYXhpKGF4aV9jdHJsLCBPVVRQVVRfVEVSVDF8T1VUUFVUX1RFUlQyLCBheGlvKTsKLQkJa2ZyZWUoYXhpbyk7Ci0JCXJldHVybiByYzsKLQkJfQotCWRlZmF1bHQ6Ci0JCWlmIChjZmdjbWQuY21kX3R5cGUgJiBDTURfQVhJX0NGR19URVJUMSkKLQkJCXJkaV9tb2RlIHw9IE9VVFBVVF9URVJUMTsKLQkJaWYgKGNmZ2NtZC5jbWRfdHlwZSAmIENNRF9BWElfQ0ZHX1RFUlQyKQotCQkJcmRpX21vZGUgfD0gT1VUUFVUX1RFUlQyOwotCX0KLQlzd2l0Y2ggKHZmZV9jbWRfdHlwZSkgewotCWNhc2UgQ01EX0FYSV9DRkdfUFJJTTogewotCQl1aW50MzJfdCAqYXhpbyA9IE5VTEw7Ci0JCWF4aW8gPSBrbWFsbG9jKHZmZTQwX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgsCi0JCQkJR0ZQX0FUT01JQyk7Ci0JCWlmICghYXhpbykgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoYXhpbywgKHZvaWQgX191c2VyICopKHZmZWNtZC52YWx1ZSksCi0JCQkJdmZlNDBfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCkpIHsKLQkJCWtmcmVlKGF4aW8pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJdmZlNDBfY29uZmlnX2F4aShheGlfY3RybCwgcmRpX21vZGV8T1VUUFVUX1BSSU0sIGF4aW8pOwotCQlrZnJlZShheGlvKTsKLQkJYnJlYWs7Ci0JCX0KLQljYXNlIENNRF9BWElfQ0ZHX1BSSU1fQUxMX0NITkxTOiB7Ci0JCXVpbnQzMl90ICpheGlvID0gTlVMTDsKLQkJYXhpbyA9IGttYWxsb2ModmZlNDBfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCwKLQkJCQlHRlBfQVRPTUlDKTsKLQkJaWYgKCFheGlvKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihheGlvLCAodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQl2ZmU0MF9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ubGVuZ3RoKSkgewotCQkJa2ZyZWUoYXhpbyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQl2ZmU0MF9jb25maWdfYXhpKGF4aV9jdHJsLCByZGlfbW9kZXxPVVRQVVRfUFJJTV9BTExfQ0hOTFMsCi0JCQlheGlvKTsKLQkJa2ZyZWUoYXhpbyk7Ci0JCWJyZWFrOwotCQl9Ci0JY2FzZSBDTURfQVhJX0NGR19QUklNfENNRF9BWElfQ0ZHX1NFQzogewotCQl1aW50MzJfdCAqYXhpbyA9IE5VTEw7Ci0JCWF4aW8gPSBrbWFsbG9jKHZmZTQwX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgsCi0JCQkJR0ZQX0FUT01JQyk7Ci0JCWlmICghYXhpbykgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoYXhpbywgKHZvaWQgX191c2VyICopKHZmZWNtZC52YWx1ZSksCi0JCQkJdmZlNDBfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCkpIHsKLQkJCWtmcmVlKGF4aW8pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJdmZlNDBfY29uZmlnX2F4aShheGlfY3RybCwKLQkJCXJkaV9tb2RlfE9VVFBVVF9QUklNfE9VVFBVVF9TRUMsIGF4aW8pOwotCQlrZnJlZShheGlvKTsKLQkJYnJlYWs7Ci0JCX0KLQljYXNlIENNRF9BWElfQ0ZHX1BSSU18Q01EX0FYSV9DRkdfU0VDX0FMTF9DSE5MUzogewotCQl1aW50MzJfdCAqYXhpbyA9IE5VTEw7Ci0JCWF4aW8gPSBrbWFsbG9jKHZmZTQwX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgsCi0JCQkJR0ZQX0FUT01JQyk7Ci0JCWlmICghYXhpbykgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoYXhpbywgKHZvaWQgX191c2VyICopKHZmZWNtZC52YWx1ZSksCi0JCQkJdmZlNDBfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCkpIHsKLQkJCWtmcmVlKGF4aW8pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJdmZlNDBfY29uZmlnX2F4aShheGlfY3RybCwKLQkJCXJkaV9tb2RlfE9VVFBVVF9QUklNfE9VVFBVVF9TRUNfQUxMX0NITkxTLCBheGlvKTsKLQkJa2ZyZWUoYXhpbyk7Ci0JCWJyZWFrOwotCQl9Ci0JY2FzZSBDTURfQVhJX0NGR19QUklNX0FMTF9DSE5MU3xDTURfQVhJX0NGR19TRUM6IHsKLQkJdWludDMyX3QgKmF4aW8gPSBOVUxMOwotCQlheGlvID0ga21hbGxvYyh2ZmU0MF9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ubGVuZ3RoLAotCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIWF4aW8pIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXZmZTQwX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgpKSB7Ci0JCQlrZnJlZShheGlvKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXZmZTQwX2NvbmZpZ19heGkoYXhpX2N0cmwsCi0JCQlyZGlfbW9kZXxPVVRQVVRfUFJJTV9BTExfQ0hOTFN8T1VUUFVUX1NFQywgYXhpbyk7Ci0JCWtmcmVlKGF4aW8pOwotCQlicmVhazsKLQkJfQotCi0JY2FzZSBDTURfQVhJX0NGR19QUklNX0FMTF9DSE5MU3xDTURfQVhJX0NGR19TRUNfQUxMX0NITkxTOgotCQlwcl9lcnIoIiVzIEludmFsaWQvVW5zdXBwb3J0ZWQgQVhJIGNvbmZpZ3VyYXRpb24gJXgiLAotCQkJX19mdW5jX18sIGNmZ2NtZC5jbWRfdHlwZSk7Ci0JCWJyZWFrOwotCWNhc2UgQ01EX0FYSV9TVEFSVDogewotCQlzdHJ1Y3QgbXNtX2NhbWVyYV92ZmVfcGFyYW1zX3QgdmZlX3BhcmFtczsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZmVfcGFyYW1zLAotCQkJCSh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2NhbWVyYV92ZmVfcGFyYW1zX3QpKSkgewotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jdXJyZW50X21vZGUgPQotCQkJdmZlX3BhcmFtcy5vcGVyYXRpb25fbW9kZTsKLQkJYXhpX3N0YXJ0KHBtY3RsLCBheGlfY3RybCwgdmZlX3BhcmFtcyk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDTURfQVhJX1NUT1A6IHsKLQkJc3RydWN0IG1zbV9jYW1lcmFfdmZlX3BhcmFtc190IHZmZV9wYXJhbXM7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdmZlX3BhcmFtcywKLQkJCQkodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9jYW1lcmFfdmZlX3BhcmFtc190KSkpIHsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+Y3VycmVudF9tb2RlID0KLQkJCXZmZV9wYXJhbXMub3BlcmF0aW9uX21vZGU7Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5zdG9wX2ltbWVkaWF0ZWx5ID0KLQkJCXZmZV9wYXJhbXMuc3RvcF9pbW1lZGlhdGVseTsKLQkJYXhpX3N0b3AocG1jdGwsIGF4aV9jdHJsLCB2ZmVfcGFyYW1zKTsKLQkJfQotCQlicmVhazsKLQljYXNlIENNRF9BWElfUkVTRVQ6Ci0JCWF4aV9yZXNldChheGlfY3RybCk7Ci0JCWJyZWFrOwotCWNhc2UgQ01EX0FYSV9BQk9SVDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZheGlfY3RybC0+c2hhcmVfY3RybC0+c3luY19hYm9ydCwKLQkJCQkodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQlzaXplb2YodWludDhfdCkpKSB7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJYXhpX2Fib3J0KGF4aV9jdHJsKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlcyBVbnN1cHBvcnRlZCBBWEkgY29uZmlndXJhdGlvbiAleCAiLCBfX2Z1bmNfXywKLQkJCWNmZ2NtZC5jbWRfdHlwZSk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9heGlfcHJvY2Vzc19pcnEoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdm9pZCAqYXJnKQotewotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXVpbnQzMl90IGlycXN0YXR1cyA9ICh1aW50MzJfdCkgYXJnOwotCi0JaWYgKCFheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSkgewotCQlwcl9lcnIoIiVzOiBiYXNlIGFkZHJlc3MgdW5tYXBwZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIG5leHQsIGNoZWNrIG91dHB1dCBwYXRoIHJlbGF0ZWQgaW50ZXJydXB0cy4gKi8KLQlpZiAoaXJxc3RhdHVzICYKLQkJVkZFX0lSUV9TVEFUVVMwX0lNQUdFX0NPTVBPU0lUX0RPTkUwX01BU0spIHsKLQkJQ0RCRygiSW1hZ2UgY29tcG9zaXRlIGRvbmUgMCBpcnEgb2NjdXJlZC5cbiIpOwotCQl2ZmU0MF9wcm9jZXNzX291dHB1dF9wYXRoX2lycV8wKGF4aV9jdHJsKTsKLQl9Ci0JaWYgKGlycXN0YXR1cyAmCi0JCVZGRV9JUlFfU1RBVFVTMF9JTUFHRV9DT01QT1NJVF9ET05FMV9NQVNLKSB7Ci0JCUNEQkcoIkltYWdlIGNvbXBvc2l0ZSBkb25lIDEgaXJxIG9jY3VyZWQuXG4iKTsKLQkJdmZlNDBfcHJvY2Vzc19vdXRwdXRfcGF0aF9pcnFfMShheGlfY3RybCk7Ci0JfQotCi0JaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICYKLQkJVkZFNDBfT1VUUFVUX01PREVfVEVSVElBUlkxKQotCQlpZiAoaXJxc3RhdHVzICYgKDB4MSA8PCAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5jaDAKLQkJCSsgVkZFX1dNX09GRlNFVCkpKQotCQkJdmZlNDBfcHJvY2Vzc19vdXRwdXRfcGF0aF9pcnFfcmRpMChheGlfY3RybCk7Ci0JaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5jb21wX291dHB1dF9tb2RlICYKLQkJVkZFNDBfT1VUUFVUX01PREVfVEVSVElBUlkyKQotCQlpZiAoaXJxc3RhdHVzICYgKDB4MSA8PCAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0My5jaDAKLQkJCSsgVkZFX1dNX09GRlNFVCkpKQotCQkJdmZlNDBfcHJvY2Vzc19vdXRwdXRfcGF0aF9pcnFfcmRpMShheGlfY3RybCk7Ci0KLQkvKiBpbiBzbmFwc2hvdCBtb2RlIGlmIGRvbmUgdGhlbiBzZW5kCi0Jc25hcHNob3QgZG9uZSBtZXNzYWdlICovCi0JaWYgKAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJVkZFX09VVFBVVFNfVEhVTUJfQU5EX01BSU4gfHwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCVZGRV9PVVRQVVRTX01BSU5fQU5EX1RIVU1CIHx8Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSAmCi0JCQlWRkVfT1VUUFVUU19USFVNQl9BTkRfSlBFRyB8fAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgJgotCQkJVkZFX09VVFBVVFNfSlBFR19BTkRfVEhVTUIgfHwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlICYKLQkJCVZGRV9PVVRQVVRTX1JBVykgewotCQlpZiAoKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2FwdHVyZV9jbnQgPT0gMCkKLQkJCQkmJiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS4KLQkJCQljYXB0dXJlX2NudCA9PSAwKSkgewotCQkJbXNtX2NhbWVyYV9pb193X21iKAotCQkJCUNBTUlGX0NPTU1BTkRfU1RPUF9JTU1FRElBVEVMWSwKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJVkZFX0NBTUlGX0NPTU1BTkQpOwotCQkJYXhpX2Rpc2FibGVfaXJxKGF4aV9jdHJsLT5zaGFyZV9jdHJsKTsKLQkJCXZmZTQwX3NlbmRfaXNwX21zZygmYXhpX2N0cmwtPnN1YmRldiwKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlRnJhbWVJZCwKLQkJCQlNU0dfSURfUElYMF9VUERBVEVfQUNLKTsKLQkJCXZmZTQwX3NlbmRfaXNwX21zZygmYXhpX2N0cmwtPnN1YmRldiwKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlRnJhbWVJZCwKLQkJCQlNU0dfSURfU05BUFNIT1RfRE9ORSk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2F4aV9idWZfY2ZnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHZvaWQgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IG1zbV9jYW12ZmVfcGFyYW1zICp2ZmVfcGFyYW1zID0KLQkJKHN0cnVjdCBtc21fY2FtdmZlX3BhcmFtcyAqKWFyZzsKLQlzdHJ1Y3QgbXNtX3ZmZV9jZmdfY21kICpjbWQgPSB2ZmVfcGFyYW1zLT52ZmVfY2ZnOwotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXZvaWQgKmRhdGEgPSB2ZmVfcGFyYW1zLT5kYXRhOwotCWludCByYyA9IDA7Ci0KLQlpZiAoIWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlKSB7Ci0JCXByX2VycigiJXM6IGJhc2UgYWRkcmVzcyB1bm1hcHBlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlzd2l0Y2ggKGNtZC0+Y21kX3R5cGUpIHsKLQljYXNlIENNRF9DT05GSUdfUElOR19BRERSOiB7Ci0JCWludCBwYXRoID0gKigoaW50ICopY21kLT52YWx1ZSk7Ci0JCXN0cnVjdCB2ZmU0MF9vdXRwdXRfY2ggKm91dGNoID0KLQkJCXZmZTQwX2dldF9jaChwYXRoLCBheGlfY3RybC0+c2hhcmVfY3RybCk7Ci0JCW91dGNoLT5waW5nID0gKigoc3RydWN0IG1zbV9mcmVlX2J1ZiAqKWRhdGEpOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9DT05GSUdfUE9OR19BRERSOiB7Ci0JCWludCBwYXRoID0gKigoaW50ICopY21kLT52YWx1ZSk7Ci0JCXN0cnVjdCB2ZmU0MF9vdXRwdXRfY2ggKm91dGNoID0KLQkJCXZmZTQwX2dldF9jaChwYXRoLCBheGlfY3RybC0+c2hhcmVfY3RybCk7Ci0JCW91dGNoLT5wb25nID0gKigoc3RydWN0IG1zbV9mcmVlX2J1ZiAqKWRhdGEpOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9DT05GSUdfRlJFRV9CVUZfQUREUjogewotCQlpbnQgcGF0aCA9ICooKGludCAqKWNtZC0+dmFsdWUpOwotCQlzdHJ1Y3QgdmZlNDBfb3V0cHV0X2NoICpvdXRjaCA9Ci0JCQl2ZmU0MF9nZXRfY2gocGF0aCwgYXhpX2N0cmwtPnNoYXJlX2N0cmwpOwotCQlvdXRjaC0+ZnJlZV9idWYgPSAqKChzdHJ1Y3QgbXNtX2ZyZWVfYnVmICopZGF0YSk7Ci0JfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzIFVuc3VwcG9ydGVkIEFYSSBCdWYgY29uZmlnICV4ICIsIF9fZnVuY19fLAotCQkJY21kLT5jbWRfdHlwZSk7Ci0JfQotCXJldHVybiByYzsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfaW50ZXJuYWxfb3BzIG1zbV92ZmVfaW50ZXJuYWxfb3BzOwotCi1zdGF0aWMgbG9uZyBtc21fYXhpX3N1YmRldl9pb2N0bChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCQkJdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCWludCByYyA9IC1FTk9JT0NUTENNRDsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVklESU9DX01TTV9BWElfSU5JVDoKLQkJcmMgPSBtc21fYXhpX3N1YmRldl9pbml0KHNkKTsKLQkJYnJlYWs7Ci0JY2FzZSBWSURJT0NfTVNNX0FYSV9DRkc6Ci0JCXJjID0gbXNtX2F4aV9jb25maWcoc2QsIGFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgVklESU9DX01TTV9BWElfSVJROgotCQltc21fYXhpX3Byb2Nlc3NfaXJxKHNkLCBhcmcpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgVklESU9DX01TTV9BWElfQlVGX0NGRzoKLQkJbXNtX2F4aV9idWZfY2ZnKHNkLCBhcmcpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgVklESU9DX01TTV9BWElfUkVMRUFTRToKLQkJbXNtX2F4aV9zdWJkZXZfcmVsZWFzZShzZCk7Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBWSURJT0NfTVNNX0FYSV9SRElfQ09VTlRfVVBEQVRFOiB7Ci0JCXN0cnVjdCByZGlfY291bnRfbXNnICptc2cgPSAoc3RydWN0IHJkaV9jb3VudF9tc2cgKilhcmc7Ci0JCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCQlzd2l0Y2ggKG1zZy0+cmRpX2ludGVyZmFjZSkgewotCQljYXNlIFJESV8wOgotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTBGcmFtZUlkID0gbXNnLT5jb3VudDsKLQkJCXJjID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIFJESV8xOgotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTFGcmFtZUlkID0gbXNnLT5jb3VudDsKLQkJCXJjID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIFJESV8yOgotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJkaTJGcmFtZUlkID0gbXNnLT5jb3VudDsKLQkJCXJjID0gMDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCIlczogSW5jb3JyZWN0IGludGVyZmFjZSBzZW50XG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogY29tbWFuZCAlZCBub3QgZm91bmRcbiIsIF9fZnVuY19fLAotCQkJCQkJX0lPQ19OUihjbWQpKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBtc21fYXhpX3N1YmRldl9jb3JlX29wcyA9IHsKLQkuaW9jdGwgPSBtc21fYXhpX3N1YmRldl9pb2N0bCwKLQkuaW50ZXJydXB0X3NlcnZpY2Vfcm91dGluZSA9IG1zbV9heGlfc3ViZGV2X2lzcl9yb3V0aW5lLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgbXNtX2F4aV9zdWJkZXZfdmlkZW9fb3BzID0gewotCS5zX2NyeXN0YWxfZnJlcSA9IG1zbV9heGlfc3ViZGV2X3NfY3J5c3RhbF9mcmVxLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgbXNtX2F4aV9zdWJkZXZfb3BzID0gewotCS5jb3JlID0gJm1zbV9heGlfc3ViZGV2X2NvcmVfb3BzLAotCS52aWRlbyA9ICZtc21fYXhpX3N1YmRldl92aWRlb19vcHMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2ludGVybmFsX29wcyBtc21fYXhpX2ludGVybmFsX29wczsKLQotc3RhdGljIGludCBfX2RldmluaXQgdmZlNDBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybDsKLQlzdHJ1Y3QgdmZlNDBfY3RybF90eXBlICp2ZmU0MF9jdHJsOwotCXN0cnVjdCB2ZmVfc2hhcmVfY3RybF90ICpzaGFyZV9jdHJsOwotCXN0cnVjdCBpbnRyX3RhYmxlX2VudHJ5IGlycV9yZXE7Ci0Jc3RydWN0IG1zbV9jYW1fc3ViZGV2X2luZm8gc2RfaW5mbzsKLQlDREJHKCIlczogZGV2aWNlIGlkID0gJWRcbiIsIF9fZnVuY19fLCBwZGV2LT5pZCk7Ci0KLQlzaGFyZV9jdHJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZmZV9zaGFyZV9jdHJsX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNoYXJlX2N0cmwpIHsKLQkJcHJfZXJyKCIlczogbm8gZW5vdWdoIG1lbW9yeVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlheGlfY3RybCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBheGlfY3RybF90KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFheGlfY3RybCkgewotCQlwcl9lcnIoIiVzOiBubyBlbm91Z2ggbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCWtmcmVlKHNoYXJlX2N0cmwpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQl2ZmU0MF9jdHJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZmZTQwX2N0cmxfdHlwZSksIEdGUF9LRVJORUwpOwotCWlmICghdmZlNDBfY3RybCkgewotCQlwcl9lcnIoIiVzOiBubyBlbm91Z2ggbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCWtmcmVlKHNoYXJlX2N0cmwpOwotCQlrZnJlZShheGlfY3RybCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlmIChwZGV2LT5kZXYub2Zfbm9kZSkKLQkJb2ZfcHJvcGVydHlfcmVhZF91MzIoKCZwZGV2LT5kZXYpLT5vZl9ub2RlLAotCQkJImNlbGwtaW5kZXgiLCAmcGRldi0+aWQpOwotCi0Jc2hhcmVfY3RybC0+YXhpX2N0cmwgPSBheGlfY3RybDsKLQlzaGFyZV9jdHJsLT52ZmU0MF9jdHJsID0gdmZlNDBfY3RybDsKLQlheGlfY3RybC0+c2hhcmVfY3RybCA9IHNoYXJlX2N0cmw7Ci0JdmZlNDBfY3RybC0+c2hhcmVfY3RybCA9IHNoYXJlX2N0cmw7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmF4aV9yZWZfY250ID0gMDsKLQl2NGwyX3N1YmRldl9pbml0KCZheGlfY3RybC0+c3ViZGV2LCAmbXNtX2F4aV9zdWJkZXZfb3BzKTsKLQlheGlfY3RybC0+c3ViZGV2LmludGVybmFsX29wcyA9ICZtc21fYXhpX2ludGVybmFsX29wczsKLQlheGlfY3RybC0+c3ViZGV2LmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOwotCXNucHJpbnRmKGF4aV9jdHJsLT5zdWJkZXYubmFtZSwKLQkJCSBzaXplb2YoYXhpX2N0cmwtPnN1YmRldi5uYW1lKSwgImF4aSIpOwotCXY0bDJfc2V0X3N1YmRldmRhdGEoJmF4aV9jdHJsLT5zdWJkZXYsIGF4aV9jdHJsKTsKLQlheGlfY3RybC0+cGRldiA9IHBkZXY7Ci0KLQlzZF9pbmZvLnNkZXZfdHlwZSA9IEFYSV9ERVY7Ci0Jc2RfaW5mby5zZF9pbmRleCA9IHBkZXYtPmlkOwotCXNkX2luZm8uaXJxX251bSA9IDA7Ci0JbXNtX2NhbV9yZWdpc3Rlcl9zdWJkZXZfbm9kZSgmYXhpX2N0cmwtPnN1YmRldiwgJnNkX2luZm8pOwotCi0JbWVkaWFfZW50aXR5X2luaXQoJmF4aV9jdHJsLT5zdWJkZXYuZW50aXR5LCAwLCBOVUxMLCAwKTsKLQlheGlfY3RybC0+c3ViZGV2LmVudGl0eS50eXBlID0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVY7Ci0JYXhpX2N0cmwtPnN1YmRldi5lbnRpdHkuZ3JvdXBfaWQgPSBBWElfREVWOwotCWF4aV9jdHJsLT5zdWJkZXYuZW50aXR5Lm5hbWUgPSBwZGV2LT5uYW1lOwotCWF4aV9jdHJsLT5zdWJkZXYuZW50aXR5LnJldmlzaW9uID0gYXhpX2N0cmwtPnN1YmRldi5kZXZub2RlLT5udW07Ci0KLQl2NGwyX3N1YmRldl9pbml0KCZ2ZmU0MF9jdHJsLT5zdWJkZXYsICZtc21fdmZlX3N1YmRldl9vcHMpOwotCXZmZTQwX2N0cmwtPnN1YmRldi5pbnRlcm5hbF9vcHMgPSAmbXNtX3ZmZV9pbnRlcm5hbF9vcHM7Ci0JdmZlNDBfY3RybC0+c3ViZGV2LmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOwotCXNucHJpbnRmKHZmZTQwX2N0cmwtPnN1YmRldi5uYW1lLAotCQkJIHNpemVvZih2ZmU0MF9jdHJsLT5zdWJkZXYubmFtZSksICJ2ZmU0LjAiKTsKLQl2NGwyX3NldF9zdWJkZXZkYXRhKCZ2ZmU0MF9jdHJsLT5zdWJkZXYsIHZmZTQwX2N0cmwpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsICZ2ZmU0MF9jdHJsLT5zdWJkZXYpOwotCi0JYXhpX2N0cmwtPnZmZW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKLQkJCQkJSU9SRVNPVVJDRV9NRU0sICJ2ZmUiKTsKLQlpZiAoIWF4aV9jdHJsLT52ZmVtZW0pIHsKLQkJcHJfZXJyKCIlczogbm8gbWVtIHJlc291cmNlP1xuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gdmZlNDBfbm9fcmVzb3VyY2U7Ci0JfQotCi0JYXhpX2N0cmwtPnZmZV92YmlmX21lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKLQkJCQkJSU9SRVNPVVJDRV9NRU0sICJ2ZmVfdmJpZiIpOwotCWlmICghYXhpX2N0cmwtPnZmZV92YmlmX21lbSkgewotCQlwcl9lcnIoIiVzOiBubyBtZW0gcmVzb3VyY2U/XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byB2ZmU0MF9ub19yZXNvdXJjZTsKLQl9Ci0KLQlheGlfY3RybC0+dmZlaXJxID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LAotCQkJCQlJT1JFU09VUkNFX0lSUSwgInZmZSIpOwotCWlmICghYXhpX2N0cmwtPnZmZWlycSkgewotCQlwcl9lcnIoIiVzOiBubyBpcnEgcmVzb3VyY2U/XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byB2ZmU0MF9ub19yZXNvdXJjZTsKLQl9Ci0KLQlheGlfY3RybC0+dmZlaW8gPSByZXF1ZXN0X21lbV9yZWdpb24oYXhpX2N0cmwtPnZmZW1lbS0+c3RhcnQsCi0JCXJlc291cmNlX3NpemUoYXhpX2N0cmwtPnZmZW1lbSksIHBkZXYtPm5hbWUpOwotCWlmICghYXhpX2N0cmwtPnZmZWlvKSB7Ci0JCXByX2VycigiJXM6IG5vIHZhbGlkIG1lbSByZWdpb25cbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gdmZlNDBfbm9fcmVzb3VyY2U7Ci0JfQotCi0JYXhpX2N0cmwtPmZzX3ZmZSA9IHJlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgInZkZCIpOwotCWlmIChJU19FUlIoYXhpX2N0cmwtPmZzX3ZmZSkpIHsKLQkJcHJfZXJyKCIlczogUmVndWxhdG9yIGdldCBmYWlsZWQgJWxkXG4iLCBfX2Z1bmNfXywKLQkJCVBUUl9FUlIoYXhpX2N0cmwtPmZzX3ZmZSkpOwotCQlheGlfY3RybC0+ZnNfdmZlID0gTlVMTDsKLQl9Ci0KLQkvKiBSZWdpc3RlciBzdWJkZXYgbm9kZSBiZWZvcmUgcmVxdWVzdGluZyBpcnEgc2luY2UKLQkgKiBpcnFfbnVtIGlzIG5lZWRlZCBieSBtc21fY2FtX3NlcnZlciAqLwotCXNkX2luZm8uc2Rldl90eXBlID0gVkZFX0RFVjsKLQlzZF9pbmZvLnNkX2luZGV4ID0gcGRldi0+aWQ7Ci0Jc2RfaW5mby5pcnFfbnVtID0gYXhpX2N0cmwtPnZmZWlycS0+c3RhcnQ7Ci0JbXNtX2NhbV9yZWdpc3Rlcl9zdWJkZXZfbm9kZSgmdmZlNDBfY3RybC0+c3ViZGV2LCAmc2RfaW5mbyk7Ci0KLQltZWRpYV9lbnRpdHlfaW5pdCgmdmZlNDBfY3RybC0+c3ViZGV2LmVudGl0eSwgMCwgTlVMTCwgMCk7Ci0JdmZlNDBfY3RybC0+c3ViZGV2LmVudGl0eS50eXBlID0gTUVESUFfRU5UX1RfVjRMMl9TVUJERVY7Ci0JdmZlNDBfY3RybC0+c3ViZGV2LmVudGl0eS5ncm91cF9pZCA9IFZGRV9ERVY7Ci0JdmZlNDBfY3RybC0+c3ViZGV2LmVudGl0eS5uYW1lID0gcGRldi0+bmFtZTsKLQl2ZmU0MF9jdHJsLT5zdWJkZXYuZW50aXR5LnJldmlzaW9uID0gdmZlNDBfY3RybC0+c3ViZGV2LmRldm5vZGUtPm51bTsKLQotCS8qIFJlcXVlc3QgZm9yIHRoaXMgZGV2aWNlIGlycSBmcm9tIHRoZSBjYW1lcmEgc2VydmVyLiBJZiB0aGUKLQkgKiBJUlEgUm91dGVyIGlzIHByZXNlbnQgb24gdGhpcyB0YXJnZXQsIHRoZSBpbnRlcnJ1cHQgd2lsbCBiZQotCSAqIGhhbmRsZWQgYnkgdGhlIGNhbWVyYSBzZXJ2ZXIgYW5kIHRoZSBpbnRlcnJ1cHQgc2VydmljZQotCSAqIHJvdXRpbmUgY2FsbGVkLiBJZiB0aGUgcmVxdWVzdF9pcnEgY2FsbCByZXR1cm5zIEVOWElPLCB0aGVuCi0JICogdGhlIElSUSBSb3V0ZXIgaGFyZHdhcmUgaXMgbm90IHByZXNlbnQgb24gdGhpcyB0YXJnZXQuIFdlCi0JICogaGF2ZSB0byByZXF1ZXN0IGZvciB0aGUgaXJxIG91cnNlbHZlcyBhbmQgcmVnaXN0ZXIgdGhlCi0JICogYXBwcm9wcmlhdGUgaW50ZXJydXB0IGhhbmRsZXIuICovCi0JYXhpX2N0cmwtPnVzZV9pcnFfcm91dGVyID0gdHJ1ZTsKLQlpcnFfcmVxLmNhbV9od19pZHggICAgICAgPSBNU01fQ0FNX0hXX1ZGRTAgKyBwZGV2LT5pZDsKLQlpcnFfcmVxLmRldl9uYW1lICAgICAgICAgPSAidmZlIjsKLQlpcnFfcmVxLmlycV9pZHggICAgICAgICAgPSBDQU1FUkFfU1NfSVJRXzg7Ci0JaXJxX3JlcS5pcnFfbnVtICAgICAgICAgID0gYXhpX2N0cmwtPnZmZWlycS0+c3RhcnQ7Ci0JaXJxX3JlcS5pc19jb21wb3NpdGUgICAgID0gMDsKLQlpcnFfcmVxLmlycV90cmlnZ2VyX3R5cGUgPSBJUlFGX1RSSUdHRVJfUklTSU5HOwotCWlycV9yZXEubnVtX2h3Y29yZSAgICAgICA9IDE7Ci0JaXJxX3JlcS5zdWJkZXZfbGlzdFswXSAgID0gJmF4aV9jdHJsLT5zdWJkZXY7Ci0JaXJxX3JlcS5kYXRhICAgICAgICAgICAgID0gKHZvaWQgKilheGlfY3RybDsKLQlyYyA9IG1zbV9jYW1fc2VydmVyX3JlcXVlc3RfaXJxKCZpcnFfcmVxKTsKLQlpZiAocmMgPT0gLUVOWElPKSB7Ci0JCS8qIElSUSBSb3V0ZXIgaGFyZHdhcmUgaXMgbm90IHByZXNlbnQgb24gdGhpcyBoYXJkd2FyZS4KLQkJICogUmVxdWVzdCBmb3IgdGhlIElSUSBhbmQgcmVnaXN0ZXIgdGhlIGludGVycnVwdCBoYW5kbGVyLiAqLwotCQlheGlfY3RybC0+dXNlX2lycV9yb3V0ZXIgPSBmYWxzZTsKLQkJcmMgPSByZXF1ZXN0X2lycShheGlfY3RybC0+dmZlaXJxLT5zdGFydCwgdmZlNDBfcGFyc2VfaXJxLAotCQkJSVJRRl9UUklHR0VSX1JJU0lORywgInZmZSIsIGF4aV9jdHJsKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGF4aV9jdHJsLT52ZmVtZW0tPnN0YXJ0LAotCQkJCXJlc291cmNlX3NpemUoYXhpX2N0cmwtPnZmZW1lbSkpOwotCQkJcHJfZXJyKCIlczogaXJxIHJlcXVlc3QgZmFpbFxuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUJVU1k7Ci0JCQlnb3RvIHZmZTQwX25vX3Jlc291cmNlOwotCQl9Ci0JCWRpc2FibGVfaXJxKGF4aV9jdHJsLT52ZmVpcnEtPnN0YXJ0KTsKLQl9IGVsc2UgaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzIEVycm9yIHJlZ2lzdGVyaW5nIGlycSAiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gdmZlNDBfbm9fcmVzb3VyY2U7Ci0JfQotCi0JLypnZXQgZGV2aWNlIGNvbnRleHQgZm9yIElPTU1VKi8KLQlpZiAocGRldi0+aWQgPT0gMCkKLQkJYXhpX2N0cmwtPmlvbW11X2N0eCA9IG1zbV9pb21tdV9nZXRfY3R4KCJ2ZmUwIik7Ci0JZWxzZSBpZiAocGRldi0+aWQgPT0gMSkKLQkJYXhpX2N0cmwtPmlvbW11X2N0eCA9IG1zbV9pb21tdV9nZXRfY3R4KCJ2ZmUxIik7Ci0JaWYgKCFheGlfY3RybC0+aW9tbXVfY3R4KSB7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihheGlfY3RybC0+dmZlbWVtLT5zdGFydCwKLQkJCXJlc291cmNlX3NpemUoYXhpX2N0cmwtPnZmZW1lbSkpOwotCQlwcl9lcnIoIiVzOiBObyBpb21tdSBmdyBjb250ZXh0IGZvdW5kXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byB2ZmU0MF9ub19yZXNvdXJjZTsKLQl9Ci0KLQl0YXNrbGV0X2luaXQoJmF4aV9jdHJsLT52ZmU0MF90YXNrbGV0LAotCQlheGk0MF9kb190YXNrbGV0LCAodW5zaWduZWQgbG9uZylheGlfY3RybCk7Ci0KLQl2ZmU0MF9jdHJsLT5wZGV2ID0gcGRldjsKLQkvKmVuYWJsZSBiYXllciBzdGF0cyBieSBkZWZhdWx0Ki8KLQl2ZmU0MF9jdHJsLT52ZXJfbnVtLm1haW4gPSA0OwotCi0JcmV0dXJuIDA7Ci0KLXZmZTQwX25vX3Jlc291cmNlOgotCWtmcmVlKHZmZTQwX2N0cmwpOwotCWtmcmVlKGF4aV9jdHJsKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX3ZmZV9kdF9tYXRjaFtdID0gewotCXsuY29tcGF0aWJsZSA9ICJxY29tLHZmZTQwIn0sCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fdmZlX2R0X21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdmZlNDBfZHJpdmVyID0gewotCS5wcm9iZSA9IHZmZTQwX3Byb2JlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gTVNNX1ZGRV9EUlZfTkFNRSwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG1zbV92ZmVfZHRfbWF0Y2gsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV92ZmU0MF9pbml0X21vZHVsZSh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnZmZTQwX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtc21fdmZlNDBfZXhpdF9tb2R1bGUodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdmZlNDBfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQobXNtX3ZmZTQwX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KG1zbV92ZmU0MF9leGl0X21vZHVsZSk7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlZGRSA0LjAgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmU0MC5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlNDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzMjIwMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmU0MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX01TTV9WRkU0MF9IX18KLSNkZWZpbmUgX19NU01fVkZFNDBfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlICJtc21fdmZlX3N0YXRzX2J1Zi5oIgotCi0jZGVmaW5lIFRSVUUgIDEKLSNkZWZpbmUgRkFMU0UgMAotCi0jZGVmaW5lIFZGRTQwX0hXX05VTUJFUiAweDEwMDAwMDE1Ci0KLS8qIFRoaXMgZGVmaW5lcyB0b3RhbCBudW1iZXIgcmVnaXN0ZXJzIGluIFZGRS4KLSAqIEVhY2ggcmVnaXN0ZXIgaXMgNCBieXRlcyBzbyB0byBnZXQgdGhlIHJhbmdlLAotICogbXVsdGlwbHkgdGhpcyBudW1iZXIgd2l0aCA0LiAqLwotI2RlZmluZSBWRkU0MF9SRUdJU1RFUl9UT1RBTCAweDAwMDAwMzIwCi0KLS8qIGF0IHN0b3Agb2YgdmZlIHBpcGVsaW5lLCBmb3Igbm93IGl0IGlzIGFzc3VtZWQKLSAqIHRoYXQgY2FtaWYgd2lsbCBzdG9wIGF0IGFueSB0aW1lLiBCaXQgMTowID0gMHgxMDoKLSAqIGRpc2FibGUgaW1hZ2UgZGF0YSBjYXB0dXJlIGltbWVkaWF0ZWx5LiAqLwotI2RlZmluZSBDQU1JRl9DT01NQU5EX1NUT1BfSU1NRURJQVRFTFkgIDB4MDAwMDAwMDIKLQotLyogYXQgc3RvcCBvZiB2ZmUgcGlwZWxpbmUsIGZvciBub3cgaXQgaXMgYXNzdW1lZAotICogdGhhdCBjYW1pZiB3aWxsIHN0b3AgYXQgYW55IHRpbWUuIEJpdCAxOjAgPSAweDAwOgotICogZGlzYWJsZSBpbWFnZSBkYXRhIGNhcHR1cmUgYXQgZnJhbWUgYm91bmRhcnkgKi8KLSNkZWZpbmUgQ0FNSUZfQ09NTUFORF9TVE9QX0FUX0ZSQU1FX0JPVU5EQVJZICAweDAwMDAwMDAwCi0KLS8qIHRvIGhhbHQgYXhpIGJyaWRnZSAqLwotI2RlZmluZSBBWElfSEFMVCAgMHgwMDAwMDAwMQotCi0vKiBjbGVhciB0aGUgaGFsdCBiaXQuICovCi0jZGVmaW5lIEFYSV9IQUxUX0NMRUFSICAweDAwMDAwMDAwCi0KLS8qIHJlc2V0IHRoZSBwaXBlbGluZSB3aGVuIHN0b3AgY29tbWFuZCBpcyBpc3N1ZWQuCi0gKiAod2l0aG91dCByZXNldCB0aGUgcmVnaXN0ZXIuKSBiaXQgMjYtMzIgPSAwLAotICogZG9tYWluIHJlc2V0LCBiaXQgMC05ID0gMSBmb3IgbW9kdWxlIHJlc2V0LCBleGNlcHQKLSAqIHJlZ2lzdGVyIG1vZHVsZS4gKi8KLSNkZWZpbmUgVkZFX1JFU0VUX1VQT05fU1RPUF9DTUQgIDB4MDAwMDAzZWYKLQotLyogcmVzZXQgdGhlIHBpcGVsaW5lIHdoZW4gcmVzZXQgY29tbWFuZC4KLSAqIGJpdCAyNi0zMiA9IDAsIGRvbWFpbiByZXNldCwgYml0IDAtOSA9IDEgZm9yIG1vZHVsZSByZXNldC4gKi8KLSNkZWZpbmUgVkZFX1JFU0VUX1VQT05fUkVTRVRfQ01EICAweDAwMDAwM2ZmCi0KLS8qIHJlc2V0IHRoZSB2ZmUgb25seSB3aGVuIHJlc2V0IGNvbW1hbmQqLwotI2RlZmluZSBWRkVfT05MWV9SRVNFVF9DTUQgIDB4MDAwMDAwMDIKLQotLypWZmUgbW9kdWxlIHJlc2V0IGNvbW1hbmQqLwotI2RlZmluZSBWRkVfTU9EVUxFX1JFU0VUX0NNRCAweDA3ZmZmZmZmCi0KLS8qIHdtIGJpdCBvZmZzZXQgZm9yIElSUSBNQVNLIGFuZCBJUlEgU1RBVFVTIHJlZ2lzdGVyICovCi0jZGVmaW5lIFZGRV9XTV9PRkZTRVQgNgotCi0vKiBjb25zdGFudHMgZm9yIGlycSByZWdpc3RlcnMgKi8KLSNkZWZpbmUgVkZFX0RJU0FCTEVfQUxMX0lSUVMgMAotLyogYml0ID0xIGlzIHRvIGNsZWFyIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiBWRkVfSVJRX1NUQVRVUy4gICovCi0jZGVmaW5lIFZGRV9DTEVBUl9BTExfSVJRMCAgIDB4ZmZmZjdmZmYKLSNkZWZpbmUgVkZFX0NMRUFSX0FMTF9JUlExICAgMHhmZmZmZmZmZgotCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9DQU1JRl9TT0ZfTUFTSyAgICAgICAgICAgICgweDAwMDAwMDAxPDwwKQotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfUkVHX1VQREFURV9NQVNLICAgICAgICAgICAoMHgwMDAwMDAwMTw8NCkKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1JESTBfUkVHX1VQREFURV9NQVNLICAgICAgKDB4MDAwMDAwMDE8PDUpCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9SREkxX1JFR19VUERBVEVfTUFTSyAgICAgICgweDAwMDAwMDAxPDw2KQotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfUkRJMl9SRUdfVVBEQVRFX01BU0sgICAgICAoMHgwMDAwMDAwMTw8NykKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0JFICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDE8PDE2KQotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQkcgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMTw8MTcpCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19CRiAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxPDwxOCkKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0FXQiAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDE8PDE5KQotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfUlMgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMTw8MjApCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9TVEFUU19DUyAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxPDwyMSkKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0lISVNUICAgICAgICAgICAgICAgKDB4MDAwMDAwMDE8PDIyKQotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfU0tJTl9CSElTVCAgICAgICAgICAoMHgwMDAwMDAwMTw8MjMpCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9JTUFHRV9DT01QT1NJVF9ET05FMF9NQVNLICgweDAwMDAwMDAxPDwyNSkKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX0lNQUdFX0NPTVBPU0lUX0RPTkUxX01BU0sgKDB4MDAwMDAwMDE8PDI2KQotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfSU1BR0VfQ09NUE9TSVRfRE9ORTJfTUFTSyAoMHgwMDAwMDAwMTw8MjcpCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9JTUFHRV9DT01QT1NJVF9ET05FM19NQVNLICgweDAwMDAwMDAxPDwyOCkKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1NUQVRTX0NPTVBPU0lUX01BU0tfMCAgICAgKDB4MDAwMDAwMDE8PDI5KQotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzBfU1RBVFNfQ09NUE9TSVRfTUFTS18xICAgICAoMHgwMDAwMDAwMTw8MzApCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9SRVNFVF9BWElfSEFMVF9BQ0tfTUFTSyAgICgweDAwMDAwMDAxPDwzMSkKLQotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzFfU1lOQ19USU1FUjAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMTw8MjUpCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMV9TWU5DX1RJTUVSMSAgICAgICAgICAgICAgICgweDAwMDAwMDAxPDwyNikKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMxX1NZTkNfVElNRVIyICAgICAgICAgICAgICAgKDB4MDAwMDAwMDE8PDI3KQotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzFfQVNZTkNfVElNRVIwICAgICAgICAgICAgICAoMHgwMDAwMDAwMTw8MjgpCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMV9BU1lOQ19USU1FUjEgICAgICAgICAgICAgICgweDAwMDAwMDAxPDwyOSkKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMxX0FTWU5DX1RJTUVSMiAgICAgICAgICAgICAgKDB4MDAwMDAwMDE8PDMwKQotI2RlZmluZSBWRkVfSVJRX1NUQVRVUzFfQVNZTkNfVElNRVIzICAgICAgICAgICAgICAoMHgwMDAwMDAwMTw8MzEpCi0KLS8qVE9ET3MgdGhlIGlycSBzdGF0dXMgcGFzc2VkIGZyb20gYXhpIHRvIHZmZSBpcnEgaGFuZGxlciBkb2VzIG5vdCBhY2NvdW50Ci0qIGZvciAyIGlycSBzdGF0dXMgcmVnaXN0ZXJzLiBTbyBiZWxvdyBtYWNybyBpcyBhZGRlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4KLSogc2FtZSBiaXQgc2V0IG9uIGJvdGggaXJxIHN0YXR1cyByZWdpc3RlcnMuIFRoaXMgd2lsIGJlIGZpeGVkIGxhdGVyIGJ5IHBhc3NpbmcKLSplbnRpcmUgcGF5bG9hZCB0byB2ZmUgaXJxIGhhbmRsZXIgYW5kIHBhcnNpbmcgdGhlcmUgaW5zdGVhZCBvZiBwYXNzaW5nIGp1c3QgdGhlCi0qc3RhdHVzIGJpdCovCi0KLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVMwX1JESTBfUkVHX1VQREFURSAgVkZFX0lSUV9TVEFUVVMwX1JESTBfUkVHX1VQREFURV9NQVNLCi0jZGVmaW5lIFZGRV9JUlFfU1RBVFVTMF9SREkxX1JFR19VUERBVEUgIFZGRV9JUlFfU1RBVFVTMF9SREkxX1JFR19VUERBVEVfTUFTSwotCi0vKiBpbWFzayBmb3Igd2hpbGUgd2FpdGluZyBmb3Igc3RvcCBhY2ssICBkcml2ZXIgaGFzIGFscmVhZHkKLSAqIHJlcXVlc3RlZCBzdG9wLCB3YWl0aW5nIGZvciByZXNldCBpcnEsIGFuZCBhc3luYyB0aW1lciBpcnEuCi0gKiBGb3IgaXJxX3N0YXR1c18xLCBiaXQgMjgtMzIgYXJlIGZvciBhc3luYyB0aW1lci4gRm9yCi0gKiBpcnFfc3RhdHVzXzAsIGJpdCAzMSBmb3IgcmVzZXQgaXJxLCBiaXQgMjMgZm9yIGF4aV9oYWx0X2FjawotICAgaXJxICovCi0jZGVmaW5lIFZGRV9JTUFTS19XSElMRV9TVE9QUElOR18wICAweDgwMDAwMDAwCi0jZGVmaW5lIFZGRV9JTUFTS19XSElMRV9TVE9QUElOR18xICAweEYwMDAwMDAwCi0KLS8qIEZvciBBQkYgYml0IDQgaXMgc2V0IHRvIHplcm8gYW5kIG90aGVyJ3MgMSAqLwotI2RlZmluZSBBQkZfTUFTSyAweEZGRkZGRkY3Ci0KLS8qIEZvciBEQlBDIGJpdCAwIGlzIHNldCB0byB6ZXJvIGFuZCBvdGhlcidzIDEgKi8KLSNkZWZpbmUgREJQQ19NQVNLIDB4RkZGRkZGRkUKLQotLyogRm9yIERCUEMgYml0IDEgaXMgc2V0IHRvIHplcm8gYW5kIG90aGVyJ3MgMSAqLwotI2RlZmluZSBEQkNDX01BU0sgMHhGRkZGRkZGRAotCi0vKiBGb3IgREJQQy9BQkYvREJDQy9BQkNDIGJpdHMgYXJlIHNldCB0byAxIGFsbCBvdGhlcnMgMCAqLwotI2RlZmluZSBERU1PU0FJQ19NQVNLIDB4RgotCi0vKiBGb3IgTUNFIGVuYWJsZSBiaXQgMjggc2V0IHRvIHplcm8gYW5kIG90aGVyJ3MgMSAqLwotI2RlZmluZSBNQ0VfRU5fTUFTSyAweEVGRkZGRkZGCi0KLS8qIEZvciBNQ0UgUV9LIGJpdCAyOCB0byAzMiBzZXQgdG8gemVybyBhbmQgb3RoZXIncyAxICovCi0jZGVmaW5lIE1DRV9RX0tfTUFTSyAweDBGRkZGRkZGCi0KLSNkZWZpbmUgQkVfRU5BQkxFX01BU0sgICAgKDB4MDAwMDAwMDE8PDUpCi0jZGVmaW5lIEJHX0VOQUJMRV9NQVNLICAgICgweDAwMDAwMDAxPDw2KQotI2RlZmluZSBCRl9FTkFCTEVfTUFTSyAgICAoMHgwMDAwMDAwMTw8NykKLSNkZWZpbmUgQVdCX0VOQUJMRV9NQVNLICAgKDB4MDAwMDAwMDE8PDgpCi0jZGVmaW5lIFJTX0VOQUJMRV9NQVNLICAgICgweDAwMDAwMDAxPDw5KQotI2RlZmluZSBDU19FTkFCTEVfTUFTSyAgICAoMHgwMDAwMDAwMTw8MTApCi0jZGVmaW5lIENMRl9FTkFCTEVfTUFTSyAgICgweDAwMDAwMDAxPDwxMikKLSNkZWZpbmUgSUhJU1RfRU5BQkxFX01BU0sgKDB4MDAwMDAwMDE8PDE1KQotI2RlZmluZSBCSElTVF9FTkFCTEVfTUFTSyAoMHgwMDAwMDAwMTw8MTgpCi0jZGVmaW5lIFJTX0NTX0VOQUJMRV9NQVNLIChSU19FTkFCTEVfTUFTS3xDU19FTkFCTEVfTUFTSykKLSNkZWZpbmUgU1RBVFNfRU5BQkxFX01BU0sgMHgwMDA0ODdFMCAgIC8qIGJpdCAxOCwxNSwxMCw5LDgsNyw2LDUqLwotCi0jZGVmaW5lIFNUQVRTX0JISVNUX0VOQUJMRV9NQVNLICgweDAwMDAwMDAxPDwxKQotCi0jZGVmaW5lIFZGRV9ETUlfQ0ZHX0RFRkFVTFQgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLQotI2RlZmluZSBIRlJfTU9ERV9PRkYgMQotI2RlZmluZSBWRkVfRlJBTUVfU0tJUF9QRVJJT0RfTUFTSyAweDAwMDAwMDFGIC8qYml0cyAwIC00Ki8KLQotZW51bSBWRkU0MF9ETUlfUkFNX1NFTCB7Ci0JTk9fTUVNX1NFTEVDVEVEICAgICAgICAgID0gMCwKLQlCTEFDS19MVVRfUkFNX0JBTkswICAgICAgPSAweDEsCi0JQkxBQ0tfTFVUX1JBTV9CQU5LMSAgICAgID0gMHgyLAotCVJPTExPRkZfUkFNMF9CQU5LMCAgICAgICA9IDB4MywKLQlST0xMT0ZGX1JBTTBfQkFOSzEgICAgICAgPSAweDQsCi0JREVNT1NBSUNfTFVUX1JBTV9CQU5LMCAgID0gMHg1LAotCURFTU9TQUlDX0xVVF9SQU1fQkFOSzEgICA9IDB4NiwKLQlTVEFUU19CSElTVF9SQU0wICAgICAgICAgPSAweDcsCi0JU1RBVFNfQkhJU1RfUkFNMSAgICAgICAgID0gMHg4LAotCVJHQkxVVF9SQU1fQ0gwX0JBTkswICAgICA9IDB4OSwKLQlSR0JMVVRfUkFNX0NIMF9CQU5LMSAgICAgPSAweGEsCi0JUkdCTFVUX1JBTV9DSDFfQkFOSzAgICAgID0gMHhiLAotCVJHQkxVVF9SQU1fQ0gxX0JBTksxICAgICA9IDB4YywKLQlSR0JMVVRfUkFNX0NIMl9CQU5LMCAgICAgPSAweGQsCi0JUkdCTFVUX1JBTV9DSDJfQkFOSzEgICAgID0gMHhlLAotCVJHQkxVVF9DSFhfQkFOSzAgICAgICAgICA9IDB4ZiwKLQlSR0JMVVRfQ0hYX0JBTksxICAgICAgICAgPSAweDEwLAotCVNUQVRTX0lISVNUX1JBTSAgICAgICAgICA9IDB4MTEsCi0JTFVNQV9BREFQVF9MVVRfUkFNX0JBTkswID0gMHgxMiwKLQlMVU1BX0FEQVBUX0xVVF9SQU1fQkFOSzEgPSAweDEzLAotfTsKLQotZW51bSB2ZmVfb3V0cHV0X3N0YXRlIHsKLQlWRkVfU1RBVEVfSURMRSwKLQlWRkVfU1RBVEVfU1RBUlRfUkVRVUVTVEVELAotCVZGRV9TVEFURV9TVEFSVEVELAotCVZGRV9TVEFURV9TVE9QX1JFUVVFU1RFRCwKLQlWRkVfU1RBVEVfU1RPUFBFRCwKLX07Ci0KLSNkZWZpbmUgVjQwX0NBTUlGX09GRiAgICAgICAgICAgICAweDAwMDAwMkY4Ci0jZGVmaW5lIFY0MF9DQU1JRl9MRU4gICAgICAgICAgICAgMzYKLQotI2RlZmluZSBWNDBfREVNVVhfT0ZGICAgICAgICAgICAgIDB4MDAwMDA0MjQKLSNkZWZpbmUgVjQwX0RFTVVYX0xFTiAgICAgICAgICAgICAyOAotCi0jZGVmaW5lIFY0MF9ERU1PU0FJQ1YzXzBfT0ZGICAgICAgMHgwMDAwMDQ0MAotI2RlZmluZSBWNDBfREVNT1NBSUNWM18wX0xFTiAgICAgIDQKLSNkZWZpbmUgVjQwX0RFTU9TQUlDVjNfMV9PRkYgICAgICAweDAwMDAwNTE4Ci0jZGVmaW5lIFY0MF9ERU1PU0FJQ1YzXzFfTEVOICAgICAgODgKLSNkZWZpbmUgVjQwX0RFTU9TQUlDVjNfMl9PRkYgICAgICAweDAwMDAwNTY4Ci0jZGVmaW5lIFY0MF9ERU1PU0FJQ1YzX1VQX1JFR19DTlQgNQotCi0jZGVmaW5lIFY0MF9PVVRfQ0xBTVBfT0ZGICAgICAgICAgMHgwMDAwMDg3NAotI2RlZmluZSBWNDBfT1VUX0NMQU1QX0xFTiAgICAgICAgIDE2Ci0KLSNkZWZpbmUgVjQwX09QRVJBVElPTl9DRkdfTEVOICAgICAzMgotCi0jZGVmaW5lIFY0MF9BWElfQlVTX0NNRF9PRkYgICAgICAgMHgwMDAwMDA0QwotI2RlZmluZSBWNDBfQVhJX0JVU19DRkdfTEVOICAgICAgIDI4NAotI2RlZmluZSBWNDBfQVhJX09VVF9MRU4gICAgICAgICAgIDM0NAotI2RlZmluZSBWNDBfQVhJX0NGR19MRU4gICAgICAgICAgIDcxCi0KLSNkZWZpbmUgVjQwX0JVU19QTV9DTUQgICAgICAgICAgICAweDAwMDAwMjcwCi0jZGVmaW5lIFY0MF9GT1ZfRU5DX09GRiAgICAgICAgICAgMHgwMDAwMDg1NAotI2RlZmluZSBWNDBfRk9WX0VOQ19MRU4gICAgICAgICAgIDE2Ci0jZGVmaW5lIFY0MF9GT1ZfVklFV19PRkYgICAgICAgICAgMHgwMDAwMDg2NAotI2RlZmluZSBWNDBfRk9WX1ZJRVdfTEVOICAgICAgICAgIDE2Ci0KLSNkZWZpbmUgVjQwX1NDQUxFUl9FTkNfT0ZGIDB4MDAwMDA3NUMKLSNkZWZpbmUgVjQwX1NDQUxFUl9FTkNfTEVOIDcyCi0KLSNkZWZpbmUgVjQwX1NDQUxFUl9WSUVXX09GRiAweDAwMDAwN0E0Ci0jZGVmaW5lIFY0MF9TQ0FMRVJfVklFV19MRU4gNzIKLQotI2RlZmluZSBWNDBfQ09MT1JYRk9STV9FTkNfQ0ZHX09GRiAweDAwMDAwNzFDCi0jZGVmaW5lIFY0MF9DT0xPUlhGT1JNX0VOQ19DRkdfTEVOIDMyCi0KLSNkZWZpbmUgVjQwX0NPTE9SWEZPUk1fVklFV19DRkdfT0ZGIDB4MDAwMDA3M0MKLSNkZWZpbmUgVjQwX0NPTE9SWEZPUk1fVklFV19DRkdfTEVOIDMyCi0KLSNkZWZpbmUgVjQwX0NIUk9NQV9FTl9PRkYgMHgwMDAwMDY0MAotI2RlZmluZSBWNDBfQ0hST01BX0VOX0xFTiAzNgotCi0jZGVmaW5lIFY0MF9TWU5DX1RJTUVSX09GRiAgICAgIDB4MDAwMDAzMjQKLSNkZWZpbmUgVjQwX1NZTkNfVElNRVJfUE9MQVJJVFlfT0ZGIDB4MDAwMDAzNEMKLSNkZWZpbmUgVjQwX1RJTUVSX1NFTEVDVF9PRkYgICAgICAgIDB4MDAwMDAzNzQKLSNkZWZpbmUgVjQwX1NZTkNfVElNRVJfTEVOIDI4Ci0KLSNkZWZpbmUgVjQwX0FTWU5DX1RJTUVSX09GRiAweDAwMDAwMzUwCi0jZGVmaW5lIFY0MF9BU1lOQ19USU1FUl9MRU4gMjgKLQotLyogdXNlIDEweDEzIG1lc2ggdGFibGUgaW4gdmZlNDAqLwotI2RlZmluZSBWNDBfTUVTSF9ST0xMX09GRl9DRkdfT0ZGICAgICAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgVjQwX01FU0hfUk9MTF9PRkZfQ0ZHX0xFTiAgICAgICAgICAgICAzNgotI2RlZmluZSBWNDBfTUVTSF9ST0xMX09GRl9UQUJMRV9TSVpFICAgICAgICAgIDEzMAotCi0jZGVmaW5lIFY0MF9DT0xPUl9DT1JfT0ZGIDB4MDAwMDA1RDAKLSNkZWZpbmUgVjQwX0NPTE9SX0NPUl9MRU4gNTIKLQotI2RlZmluZSBWNDBfV0JfT0ZGIDB4MDAwMDA1ODAKLSNkZWZpbmUgVjQwX1dCX0xFTiA0Ci0KLSNkZWZpbmUgVjQwX1JHQl9HX09GRiAweDAwMDAwNjM4Ci0jZGVmaW5lIFY0MF9SR0JfR19MRU4gNAotI2RlZmluZSBWNDBfR0FNTUFfTFVUX0JBTktfU0VMX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDcKLQotI2RlZmluZSBWNDBfTEFfT0ZGIDB4MDAwMDA2M0MKLSNkZWZpbmUgVjQwX0xBX0xFTiA0Ci0KLSNkZWZpbmUgVjQwX1NDRV9PRkYgMHgwMDAwMDY5NAotI2RlZmluZSBWNDBfU0NFX0xFTiAxMzYKLQotI2RlZmluZSBWNDBfQ0hST01BX1NVUF9PRkYgMHgwMDAwMDY2NAotI2RlZmluZSBWNDBfQ0hST01BX1NVUF9MRU4gMTIKLQotI2RlZmluZSBWNDBfTUNFX09GRiAweDAwMDAwNjcwCi0jZGVmaW5lIFY0MF9NQ0VfTEVOIDM2Ci0KLSNkZWZpbmUgVjQwX1NUQVRTX0JFX09GRiAweDAwMDAwODhDCi0jZGVmaW5lIFY0MF9TVEFUU19CRV9MRU4gMTIKLQotI2RlZmluZSBWNDBfU1RBVFNfQkdfT0ZGIDB4MDAwMDA4OTgKLSNkZWZpbmUgVjQwX1NUQVRTX0JHX0xFTiAxMgotCi0jZGVmaW5lIFY0MF9TVEFUU19CRl9PRkYgMHgwMDAwMDhBNAotI2RlZmluZSBWNDBfU1RBVFNfQkZfTEVOIDI0Ci0KLSNkZWZpbmUgVjQwX1NUQVRTX0JISVNUX09GRiAweDAwMDAwOEJDCi0jZGVmaW5lIFY0MF9TVEFUU19CSElTVF9MRU4gOAotCi0jZGVmaW5lIFY0MF9TVEFUU19BV0JfT0ZGIDB4MDAwMDA4QzQKLSNkZWZpbmUgVjQwX1NUQVRTX0FXQl9MRU4gMzIKLQotI2RlZmluZSBWNDBfU1RBVFNfUlNfT0ZGIDB4MDAwMDA4RTQKLSNkZWZpbmUgVjQwX1NUQVRTX1JTX0xFTiA4Ci0KLSNkZWZpbmUgVjQwX1NUQVRTX0NTX09GRiAweDAwMDAwOEVDCi0jZGVmaW5lIFY0MF9TVEFUU19DU19MRU4gOAotCi0jZGVmaW5lIFY0MF9TVEFUU19JSElTVF9PRkYgMHgwMDAwMDhGNAotI2RlZmluZSBWNDBfU1RBVFNfSUhJU1RfTEVOIDgKLQotI2RlZmluZSBWNDBfU1RBVFNfU0tJTl9PRkYgMHgwMDAwMDhGQwotI2RlZmluZSBWNDBfU1RBVFNfU0tJTl9MRU4gMjAKLQotI2RlZmluZSBWNDBfQVNGX09GRiAweDAwMDAwN0VDCi0jZGVmaW5lIFY0MF9BU0ZfTEVOIDQ4Ci0jZGVmaW5lIFY0MF9BU0ZfVVBEQVRFX0xFTiAzNgotCi0jZGVmaW5lIFY0MF9DQVBUVVJFX0xFTiA0Ci0KLSNkZWZpbmUgVjQwX0dFVF9IV19WRVJTSU9OX09GRiAwCi0jZGVmaW5lIFY0MF9HRVRfSFdfVkVSU0lPTl9MRU4gNAotCi0jZGVmaW5lIFY0MF9MSU5FQVJJWkFUSU9OX09GRjEgMHgwMDAwMDM3QwotI2RlZmluZSBWNDBfTElORUFSSVpBVElPTl9MRU4xIDY4Ci0KLSNkZWZpbmUgVjQwX0RFTU9TQUlDVjNfREJQQ19DRkdfT0ZGICAweDAwMDAwNDQ0Ci0jZGVmaW5lIFY0MF9ERU1PU0FJQ1YzX0RCUENfTEVOIDQKLQotI2RlZmluZSBWNDBfREVNT1NBSUNWM19EQlBDX0NGR19PRkYwIDB4MDAwMDA0NDgKLSNkZWZpbmUgVjQwX0RFTU9TQUlDVjNfREJQQ19DRkdfT0ZGMSAweDAwMDAwNDRDCi0jZGVmaW5lIFY0MF9ERU1PU0FJQ1YzX0RCUENfQ0ZHX09GRjIgMHgwMDAwMDQ1MAotCi0jZGVmaW5lIFY0MF9ERU1PU0FJQ1YzX0RCQ0NfT0ZGIDB4MDAwMDA0NTQKLSNkZWZpbmUgVjQwX0RFTU9TQUlDVjNfREJDQ19MRU4gMTYKLQotI2RlZmluZSBWNDBfREVNT1NBSUNWM19BQkZfT0ZGIDB4MDAwMDA0NjQKLSNkZWZpbmUgVjQwX0RFTU9TQUlDVjNfQUJGX0xFTiAxODAKLQotI2RlZmluZSBWNDBfTU9EVUxFX0NGR19PRkYgMHgwMDAwMDAxOAotI2RlZmluZSBWNDBfTU9EVUxFX0NGR19MRU4gNAotCi0jZGVmaW5lIFY0MF9BU0ZfU1BFQ0lBTF9FRlhfQ0ZHX09GRiAweDAwMDAwODFDCi0jZGVmaW5lIFY0MF9BU0ZfU1BFQ0lBTF9FRlhfQ0ZHX0xFTiA0Ci0KLSNkZWZpbmUgVjQwX0NMRl9DRkdfT0ZGIDB4MDAwMDA1ODgKLSNkZWZpbmUgVjQwX0NMRl9DRkdfTEVOIDcyCi0KLSNkZWZpbmUgVjQwX0NMRl9MVU1BX1VQREFURV9PRkYgMHgwMDAwMDU4QwotI2RlZmluZSBWNDBfQ0xGX0xVTUFfVVBEQVRFX0xFTiA2MAotCi0jZGVmaW5lIFY0MF9DTEZfQ0hST01BX1VQREFURV9PRkYgMHgwMDAwMDVDOAotI2RlZmluZSBWNDBfQ0xGX0NIUk9NQV9VUERBVEVfTEVOIDgKLQotI2RlZmluZSBWRkU0MF9HQU1NQV9OVU1fRU5UUklFUyAgNjQKLQotI2RlZmluZSBWRkU0MF9MQV9UQUJMRV9MRU5HVEggICAgNjQKLQotI2RlZmluZSBWRkU0MF9MSU5FQVJJWkFUT05fVEFCTEVfTEVOR1RIICAgIDM2Ci0KLXN0cnVjdCB2ZmVfY21kX2h3X3ZlcnNpb24gewotCXVpbnQzMl90IG1pbm9yVmVyc2lvbjsKLQl1aW50MzJfdCBtYWpvclZlcnNpb247Ci0JdWludDMyX3QgY29yZVZlcnNpb247Ci19OwotCi1lbnVtIFZGRV9BWElfT1VUUFVUX01PREUgewotCVZGRV9BWElfT1VUUFVUX01PREVfT3V0cHV0MSwKLQlWRkVfQVhJX09VVFBVVF9NT0RFX091dHB1dDIsCi0JVkZFX0FYSV9PVVRQVVRfTU9ERV9PdXRwdXQxQW5kT3V0cHV0MiwKLQlWRkVfQVhJX09VVFBVVF9NT0RFX0NBTUlGVG9BWElWaWFPdXRwdXQyLAotCVZGRV9BWElfT1VUUFVUX01PREVfT3V0cHV0MkFuZENBTUlGVG9BWElWaWFPdXRwdXQxLAotCVZGRV9BWElfT1VUUFVUX01PREVfT3V0cHV0MUFuZENBTUlGVG9BWElWaWFPdXRwdXQyLAotCVZGRV9BWElfTEFTVF9PVVRQVVRfTU9ERV9FTlVNCi19OwotCi1lbnVtIFZGRV9SQVdfV1JfUEFUSF9TRUwgewotCVZGRV9SQVdfT1VUUFVUX0RJU0FCTEVELAotCVZGRV9SQVdfT1VUUFVUX0VOQ19DQkNSX1BBVEgsCi0JVkZFX1JBV19PVVRQVVRfVklFV19DQkNSX1BBVEgsCi0JVkZFX1JBV19PVVRQVVRfUEFUSF9JTlZBTElECi19OwotCi0KLSNkZWZpbmUgVkZFX0FYSV9PVVRQVVRfQlVSU1RfTEVOR1RIICAgICA0Ci0jZGVmaW5lIFZGRV9NQVhfTlVNX0ZSQUdNRU5UU19QRVJfRlJBTUUgNAotI2RlZmluZSBWRkVfQVhJX09VVFBVVF9DRkdfRlJBTUVfQ09VTlQgIDMKLQotc3RydWN0IHZmZV9jbWRzX3Blcl93cml0ZV9tYXN0ZXIgewotCXVpbnQxNl90IGltYWdlV2lkdGg7Ci0JdWludDE2X3QgaW1hZ2VIZWlnaHQ7Ci0JdWludDE2X3Qgb3V0Um93Q291bnQ7Ci0JdWludDE2X3Qgb3V0Um93SW5jcmVtZW50OwotCXVpbnQzMl90IG91dEZyYWdtZW50c1tWRkVfQVhJX09VVFBVVF9DRkdfRlJBTUVfQ09VTlRdCi0JCVtWRkVfTUFYX05VTV9GUkFHTUVOVFNfUEVSX0ZSQU1FXTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kc19heGlfcGVyX291dHB1dF9wYXRoIHsKLQl1aW50OF90IGZyYWdtZW50Q291bnQ7Ci0Jc3RydWN0IHZmZV9jbWRzX3Blcl93cml0ZV9tYXN0ZXIgZmlyc3RXTTsKLQlzdHJ1Y3QgdmZlX2NtZHNfcGVyX3dyaXRlX21hc3RlciBzZWNvbmRXTTsKLX07Ci0KLWVudW0gVkZFX0FYSV9CVVJTVF9MRU5HVEggewotCVZGRV9BWElfQlVSU1RfTEVOR1RIX0lTXzIgID0gMiwKLQlWRkVfQVhJX0JVUlNUX0xFTkdUSF9JU180ICA9IDQsCi0JVkZFX0FYSV9CVVJTVF9MRU5HVEhfSVNfOCAgPSA4LAotCVZGRV9BWElfQlVSU1RfTEVOR1RIX0lTXzE2ID0gMTYKLX07Ci0KLQotc3RydWN0IHZmZV9jbWRfZm92X2Nyb3BfY29uZmlnIHsKLQl1aW50OF90IGVuYWJsZTsKLQl1aW50MTZfdCBmaXJzdFBpeGVsOwotCXVpbnQxNl90IGxhc3RQaXhlbDsKLQl1aW50MTZfdCBmaXJzdExpbmU7Ci0JdWludDE2X3QgbGFzdExpbmU7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZHNfbWFpbl9zY2FsZXJfc3RyaXBlX2luaXQgewotCXVpbnQxNl90IE1OQ291bnRlckluaXQ7Ci0JdWludDE2X3QgcGhhc2VJbml0OwotfTsKLQotc3RydWN0IHZmZV9jbWRzX3NjYWxlcl9vbmVfZGltZW5zaW9uIHsKLQl1aW50OF90ICBlbmFibGU7Ci0JdWludDE2X3QgaW5wdXRTaXplOwotCXVpbnQxNl90IG91dHB1dFNpemU7Ci0JdWludDMyX3QgcGhhc2VNdWx0aXBsaWNhdGlvbkZhY3RvcjsKLQl1aW50OF90ICBpbnRlcnBvbGF0aW9uUmVzb2x1dGlvbjsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX21haW5fc2NhbGVyX2NvbmZpZyB7Ci0JdWludDhfdCBlbmFibGU7Ci0Jc3RydWN0IHZmZV9jbWRzX3NjYWxlcl9vbmVfZGltZW5zaW9uICAgIGhjb25maWc7Ci0Jc3RydWN0IHZmZV9jbWRzX3NjYWxlcl9vbmVfZGltZW5zaW9uICAgIHZjb25maWc7Ci0Jc3RydWN0IHZmZV9jbWRzX21haW5fc2NhbGVyX3N0cmlwZV9pbml0IE1OSW5pdEg7Ci0Jc3RydWN0IHZmZV9jbWRzX21haW5fc2NhbGVyX3N0cmlwZV9pbml0IE1OSW5pdFY7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9zY2FsZXIyX2NvbmZpZyB7Ci0JdWludDhfdCBlbmFibGU7Ci0Jc3RydWN0IHZmZV9jbWRzX3NjYWxlcl9vbmVfZGltZW5zaW9uIGhjb25maWc7Ci0Jc3RydWN0IHZmZV9jbWRzX3NjYWxlcl9vbmVfZGltZW5zaW9uIHZjb25maWc7Ci19OwotCi0KLXN0cnVjdCB2ZmVfY21kX2ZyYW1lX3NraXBfdXBkYXRlIHsKLQl1aW50MzJfdCBvdXRwdXQxUGF0dGVybjsKLQl1aW50MzJfdCBvdXRwdXQyUGF0dGVybjsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX291dHB1dF9jbGFtcF9jb25maWcgewotCXVpbnQ4X3QgbWluQ2gwOwotCXVpbnQ4X3QgbWluQ2gxOwotCXVpbnQ4X3QgbWluQ2gyOwotCXVpbnQ4X3QgbWF4Q2gwOwotCXVpbnQ4X3QgbWF4Q2gxOwotCXVpbnQ4X3QgbWF4Q2gyOwotfTsKLQotc3RydWN0IHZmZV9jbWRfY2hyb21hX3N1YnNhbXBsZV9jb25maWcgewotCXVpbnQ4X3QgZW5hYmxlOwotCXVpbnQ4X3QgY3JvcEVuYWJsZTsKLQl1aW50OF90IHZzdWJTYW1wbGVFbmFibGU7Ci0JdWludDhfdCBoc3ViU2FtcGxlRW5hYmxlOwotCXVpbnQ4X3QgdkNvc2l0ZWQ7Ci0JdWludDhfdCBoQ29zaXRlZDsKLQl1aW50OF90IHZDb3NpdGVkUGhhc2U7Ci0JdWludDhfdCBoQ29zaXRlZFBoYXNlOwotCXVpbnQxNl90IGNyb3BXaWR0aEZpcnN0UGl4ZWw7Ci0JdWludDE2X3QgY3JvcFdpZHRoTGFzdFBpeGVsOwotCXVpbnQxNl90IGNyb3BIZWlnaHRGaXJzdExpbmU7Ci0JdWludDE2X3QgY3JvcEhlaWdodExhc3RMaW5lOwotfTsKLQotZW51bSBWRkVfU1RBUlRfUElYRUxfUEFUVEVSTiB7Ci0JVkZFX0JBWUVSX1JHUkdSRywKLQlWRkVfQkFZRVJfR1JHUkdSLAotCVZGRV9CQVlFUl9CR0JHQkcsCi0JVkZFX0JBWUVSX0dCR0JHQiwKLQlWRkVfWVVWX1lDYllDciwKLQlWRkVfWVVWX1lDcllDYiwKLQlWRkVfWVVWX0NiWUNyWSwKLQlWRkVfWVVWX0NyWUNiWQotfTsKLQotZW51bSBWRkVfQlVTX1JEX0lOUFVUX1BJWEVMX1BBVFRFUk4gewotCVZGRV9CQVlFUl9SQVcsCi0JVkZFX1lVVl9JTlRFUkxFQVZFRCwKLQlWRkVfWVVWX1BTRVVET19QTEFOQVJfWSwKLQlWRkVfWVVWX1BTRVVET19QTEFOQVJfQ0JDUgotfTsKLQotZW51bSBWRkVfWVVWX0lOUFVUX0NPU0lUSU5HX01PREUgewotCVZGRV9ZVVZfQ09TSVRFRCwKLQlWRkVfWVVWX0lOVEVSUE9MQVRFRAotfTsKLQotc3RydWN0IHZmZV9jbWRzX2RlbW9zYWljX2FiZiB7Ci0JdWludDhfdCAgIGVuYWJsZTsKLQl1aW50OF90ICAgZm9yY2VPbjsKLQl1aW50OF90ICAgc2hpZnQ7Ci0JdWludDE2X3QgIGxwVGhyZXNob2xkOwotCXVpbnQxNl90ICBtYXg7Ci0JdWludDE2X3QgIG1pbjsKLQl1aW50OF90ICAgcmF0aW87Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZHNfZGVtb3NhaWNfYnBjIHsKLQl1aW50OF90ICAgZW5hYmxlOwotCXVpbnQxNl90ICBmbWF4VGhyZXNob2xkOwotCXVpbnQxNl90ICBmbWluVGhyZXNob2xkOwotCXVpbnQxNl90ICByZWREaWZmVGhyZXNob2xkOwotCXVpbnQxNl90ICBibHVlRGlmZlRocmVzaG9sZDsKLQl1aW50MTZfdCAgZ3JlZW5EaWZmVGhyZXNob2xkOwotfTsKLQotc3RydWN0IHZmZV9jbWRfZGVtb3NhaWNfY29uZmlnIHsKLQl1aW50OF90ICAgZW5hYmxlOwotCXVpbnQ4X3QgICBzbG9wZVNoaWZ0OwotCXN0cnVjdCB2ZmVfY21kc19kZW1vc2FpY19hYmYgYWJmQ29uZmlnOwotCXN0cnVjdCB2ZmVfY21kc19kZW1vc2FpY19icGMgYnBjQ29uZmlnOwotfTsKLQotc3RydWN0IHZmZV9jbWRfZGVtb3NhaWNfYnBjX3VwZGF0ZSB7Ci0Jc3RydWN0IHZmZV9jbWRzX2RlbW9zYWljX2JwYyBicGNVcGRhdGU7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9kZW1vc2FpY19hYmZfdXBkYXRlIHsKLQlzdHJ1Y3QgdmZlX2NtZHNfZGVtb3NhaWNfYWJmIGFiZlVwZGF0ZTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX3doaXRlX2JhbGFuY2VfY29uZmlnIHsKLQl1aW50OF90ICBlbmFibGU7Ci0JdWludDE2X3QgY2gyR2FpbjsKLQl1aW50MTZfdCBjaDFHYWluOwotCXVpbnQxNl90IGNoMEdhaW47Ci19OwotCi1lbnVtIFZGRV9DT0xPUl9DT1JSRUNUSU9OX0NPRUZfUUZBQ1RPUiB7Ci0JQ09FRl9JU19RN19TSUdORUQsCi0JQ09FRl9JU19ROF9TSUdORUQsCi0JQ09FRl9JU19ROV9TSUdORUQsCi0JQ09FRl9JU19RMTBfU0lHTkVECi19OwotCi1zdHJ1Y3QgdmZlX2NtZF9jb2xvcl9jb3JyZWN0aW9uX2NvbmZpZyB7Ci0JdWludDhfdCAgICAgZW5hYmxlOwotCWVudW0gVkZFX0NPTE9SX0NPUlJFQ1RJT05fQ09FRl9RRkFDVE9SIGNvZWZRRmFjdG9yOwotCWludDE2X3QgIEMwOwotCWludDE2X3QgIEMxOwotCWludDE2X3QgIEMyOwotCWludDE2X3QgIEMzOwotCWludDE2X3QgIEM0OwotCWludDE2X3QgIEM1OwotCWludDE2X3QgIEM2OwotCWludDE2X3QgIEM3OwotCWludDE2X3QgIEM4OwotCWludDE2X3QgIEswOwotCWludDE2X3QgIEsxOwotCWludDE2X3QgIEsyOwotfTsKLQotI2RlZmluZSBWRkVfTEFfVEFCTEVfTEVOR1RIIDY0Ci0KLXN0cnVjdCB2ZmVfY21kX2xhX2NvbmZpZyB7Ci0JdWludDhfdCBlbmFibGU7Ci0JaW50MTZfdCB0YWJsZVtWRkVfTEFfVEFCTEVfTEVOR1RIXTsKLX07Ci0KLSNkZWZpbmUgVkZFX0dBTU1BX1RBQkxFX0xFTkdUSCAyNTYKLWVudW0gVkZFX1JHQl9HQU1NQV9UQUJMRV9TRUxFQ1QgewotCVJHQl9HQU1NQV9DSDBfU0VMRUNURUQsCi0JUkdCX0dBTU1BX0NIMV9TRUxFQ1RFRCwKLQlSR0JfR0FNTUFfQ0gyX1NFTEVDVEVELAotCVJHQl9HQU1NQV9DSDBfQ0gxX1NFTEVDVEVELAotCVJHQl9HQU1NQV9DSDBfQ0gyX1NFTEVDVEVELAotCVJHQl9HQU1NQV9DSDFfQ0gyX1NFTEVDVEVELAotCVJHQl9HQU1NQV9DSDBfQ0gxX0NIMl9TRUxFQ1RFRAotfTsKLQotc3RydWN0IHZmZV9jbWRfcmdiX2dhbW1hX2NvbmZpZyB7Ci0JdWludDhfdCBlbmFibGU7Ci0JZW51bSBWRkVfUkdCX0dBTU1BX1RBQkxFX1NFTEVDVCBjaGFubmVsU2VsZWN0OwotCWludDE2X3QgdGFibGVbVkZFX0dBTU1BX1RBQkxFX0xFTkdUSF07Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9jaHJvbWFfZW5oYW5fY29uZmlnIHsKLQl1aW50OF90ICBlbmFibGU7Ci0JaW50MTZfdCBhbTsKLQlpbnQxNl90IGFwOwotCWludDE2X3QgYm07Ci0JaW50MTZfdCBicDsKLQlpbnQxNl90IGNtOwotCWludDE2X3QgY3A7Ci0JaW50MTZfdCBkbTsKLQlpbnQxNl90IGRwOwotCWludDE2X3Qga2NyOwotCWludDE2X3Qga2NiOwotCWludDE2X3QgUkdCdG9ZQ29udmVyc2lvblYwOwotCWludDE2X3QgUkdCdG9ZQ29udmVyc2lvblYxOwotCWludDE2X3QgUkdCdG9ZQ29udmVyc2lvblYyOwotCXVpbnQ4X3QgUkdCdG9ZQ29udmVyc2lvbk9mZnNldDsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX2Nocm9tYV9zdXBwcmVzc2lvbl9jb25maWcgewotCXVpbnQ4X3QgZW5hYmxlOwotCXVpbnQ4X3QgbTE7Ci0JdWludDhfdCBtMzsKLQl1aW50OF90IG4xOwotCXVpbnQ4X3QgbjM7Ci0JdWludDhfdCBubjE7Ci0JdWludDhfdCBtbTE7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9hc2ZfY29uZmlnIHsKLQl1aW50OF90IGVuYWJsZTsKLQl1aW50OF90IHNtb290aEZpbHRlckVuYWJsZWQ7Ci0JdWludDhfdCBzaGFycE1vZGU7Ci0JdWludDhfdCBzbW9vdGhDb2VmQ2VudGVyOwotCXVpbnQ4X3Qgc21vb3RoQ29lZlN1cnI7Ci0JdWludDhfdCBub3JtYWxpemVGYWN0b3I7Ci0JdWludDhfdCBzaGFycEsxOwotCXVpbnQ4X3Qgc2hhcnBLMjsKLQl1aW50OF90IHNoYXJwVGhyZXNoRTE7Ci0JaW50OF90IHNoYXJwVGhyZXNoRTI7Ci0JaW50OF90IHNoYXJwVGhyZXNoRTM7Ci0JaW50OF90IHNoYXJwVGhyZXNoRTQ7Ci0JaW50OF90IHNoYXJwVGhyZXNoRTU7Ci0JaW50OF90IGZpbHRlcjFDb2VmZmljaWVudHNbOV07Ci0JaW50OF90IGZpbHRlcjJDb2VmZmljaWVudHNbOV07Ci0JdWludDhfdCAgY3JvcEVuYWJsZTsKLQl1aW50MTZfdCBjcm9wRmlyc3RQaXhlbDsKLQl1aW50MTZfdCBjcm9wTGFzdFBpeGVsOwotCXVpbnQxNl90IGNyb3BGaXJzdExpbmU7Ci0JdWludDE2X3QgY3JvcExhc3RMaW5lOwotfTsKLQotc3RydWN0IHZmZV9jbWRfYXNmX3VwZGF0ZSB7Ci0JdWludDhfdCBlbmFibGU7Ci0JdWludDhfdCBzbW9vdGhGaWx0ZXJFbmFibGVkOwotCXVpbnQ4X3Qgc2hhcnBNb2RlOwotCXVpbnQ4X3Qgc21vb3RoQ29lZkNlbnRlcjsKLQl1aW50OF90IHNtb290aENvZWZTdXJyOwotCXVpbnQ4X3Qgbm9ybWFsaXplRmFjdG9yOwotCXVpbnQ4X3Qgc2hhcnBLMTsKLQl1aW50OF90IHNoYXJwSzI7Ci0JdWludDhfdCBzaGFycFRocmVzaEUxOwotCWludDhfdCAgc2hhcnBUaHJlc2hFMjsKLQlpbnQ4X3QgIHNoYXJwVGhyZXNoRTM7Ci0JaW50OF90ICBzaGFycFRocmVzaEU0OwotCWludDhfdCAgc2hhcnBUaHJlc2hFNTsKLQlpbnQ4X3QgIGZpbHRlcjFDb2VmZmljaWVudHNbOV07Ci0JaW50OF90ICBmaWx0ZXIyQ29lZmZpY2llbnRzWzldOwotCXVpbnQ4X3QgY3JvcEVuYWJsZTsKLX07Ci0KLWVudW0gVkZFX1RFU1RfR0VOX1NZTkNfRURHRSB7Ci0JVkZFX1RFU1RfR0VOX1NZTkNfRURHRV9BY3RpdmVIaWdoLAotCVZGRV9URVNUX0dFTl9TWU5DX0VER0VfQWN0aXZlTG93Ci19OwotCi0KLXN0cnVjdCB2ZmVfY21kX2J1c19wbV9zdGFydCB7Ci0JdWludDhfdCBvdXRwdXQyWVdyUG1FbmFibGU7Ci0JdWludDhfdCBvdXRwdXQyQ2JjcldyUG1FbmFibGU7Ci0JdWludDhfdCBvdXRwdXQxWVdyUG1FbmFibGU7Ci0JdWludDhfdCBvdXRwdXQxQ2JjcldyUG1FbmFibGU7Ci19OwotCi1zdHJ1Y3QgIHZmZV9mcmFtZV9za2lwX2NvdW50cyB7Ci0JdWludDMyX3QgIHRvdGFsRnJhbWVDb3VudDsKLQl1aW50MzJfdCAgb3V0cHV0MUNvdW50OwotCXVpbnQzMl90ICBvdXRwdXQyQ291bnQ7Ci19OwotCi1lbnVtIFZGRV9BWElfUkRfVU5QQUNLX0hCSV9TRUwgewotCVZGRV9BWElfUkRfSEJJXzMyX0NMT0NLX0NZQ0xFUywKLQlWRkVfQVhJX1JEX0hCSV82NF9DTE9DS19DWUNMRVMsCi0JVkZFX0FYSV9SRF9IQklfMTI4X0NMT0NLX0NZQ0xFUywKLQlWRkVfQVhJX1JEX0hCSV8yNTZfQ0xPQ0tfQ1lDTEVTLAotCVZGRV9BWElfUkRfSEJJXzUxMl9DTE9DS19DWUNMRVMsCi0JVkZFX0FYSV9SRF9IQklfMTAyNF9DTE9DS19DWUNMRVMsCi0JVkZFX0FYSV9SRF9IQklfMjA0OF9DTE9DS19DWUNMRVMsCi0JVkZFX0FYSV9SRF9IQklfNDA5Nl9DTE9DS19DWUNMRVMKLX07Ci0KLXN0cnVjdCB2ZmVfZnJhbWVfYnBjX2luZm8gewotCXVpbnQzMl90IGdyZWVuRGVmZWN0UGl4ZWxDb3VudDsKLQl1aW50MzJfdCByZWRCbHVlRGVmZWN0UGl4ZWxDb3VudDsKLX07Ci0KLXN0cnVjdCB2ZmVfZnJhbWVfYXNmX2luZm8gewotCXVpbnQzMl90ICBhc2ZNYXhFZGdlOwotCXVpbnQzMl90ICBhc2ZIYmlDb3VudDsKLX07Ci0KLXN0cnVjdCB2ZmVfbXNnX2NhbWlmX3N0YXR1cyB7Ci0JdWludDhfdCAgY2FtaWZTdGF0ZTsKLQl1aW50MzJfdCBwaXhlbENvdW50OwotCXVpbnQzMl90IGxpbmVDb3VudDsKLX07Ci0KLXN0cnVjdCB2ZmU0MF9pcnFfc3RhdHVzIHsKLQl1aW50MzJfdCB2ZmVJcnFTdGF0dXMwOwotCXVpbnQzMl90IHZmZUlycVN0YXR1czE7Ci0JdWludDMyX3QgY2FtaWZTdGF0dXM7Ci0JdWludDMyX3QgZGVtb3NhaWNTdGF0dXM7Ci0JdWludDMyX3QgYXNmTWF4RWRnZTsKLX07Ci0KLSNkZWZpbmUgVjQwX1BSRVZJRVdfQVhJX0ZMQUcgIDB4MDAwMDAwMDEKLSNkZWZpbmUgVjQwX1NOQVBTSE9UX0FYSV9GTEFHICgweDAwMDAwMDAxPDwxKQotCi1zdHJ1Y3QgdmZlNDBfY21kX3R5cGUgewotCXVpbnQxNl90IGlkOwotCXVpbnQzMl90IGxlbmd0aDsKLQl1aW50MzJfdCBvZmZzZXQ7Ci0JdWludDMyX3QgZmxhZzsKLX07Ci0KLXN0cnVjdCB2ZmU0MF9mcmVlX2J1ZiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBub2RlOwotCXVpbnQzMl90IHBhZGRyOwotCXVpbnQzMl90IHlfb2ZmOwotCXVpbnQzMl90IGNiY3Jfb2ZmOwotfTsKLQotc3RydWN0IHZmZTQwX291dHB1dF9jaCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmcmVlX2J1Zl9xdWV1ZTsKLQlzcGlubG9ja190IGZyZWVfYnVmX2xvY2s7Ci0JdWludDMyX3QgaW5zdF9oYW5kbGU7Ci0JaW50OF90IGNoMDsKLQlpbnQ4X3QgY2gxOwotCWludDhfdCBjaDI7Ci0JdWludDMyX3QgIGNhcHR1cmVfY250OwotCXVpbnQzMl90ICBmcmFtZV9kcm9wX2NudDsKLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmIHBpbmc7Ci0Jc3RydWN0IG1zbV9mcmVlX2J1ZiBwb25nOwotCXN0cnVjdCBtc21fZnJlZV9idWYgZnJlZV9idWY7Ci19OwotCi0vKiBubyBlcnJvciBpcnEgaW4gbWFzayAwICovCi0jZGVmaW5lIFZGRTQwX0lNQVNLX0VSUk9SX09OTFlfMCAgMHgwCi0vKiB3aGVuIG5vcm1hbCBjYXNlLCBkb24ndCB3YW50IHRvIGJsb2NrIGVycm9yIHN0YXR1cy4gKi8KLS8qIGJpdCAwLTIxIGFyZSBlcnJvciBpcnEgYml0cyAqLwotI2RlZmluZSBWRkU0MF9JTUFTS19DT01NT05fRVJST1JfT05MWV8xICAgICAgIDB4MDAwMEZGMDAKLSNkZWZpbmUgVkZFNDBfSU1BU0tfVkZFX0VSUk9SX09OTFlfMSAgICAgICAgICAweDAwRkYwMUZGCi0jZGVmaW5lIFZGRTQwX0lNQVNLX0NBTUlGX0VSUk9SICAgICAgICAgICAgICAgKDB4MDAwMDAwMDE8PDApCi0jZGVmaW5lIFZGRTQwX0lNQVNLX0JISVNUX09WV1IgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDE8PDEpCi0jZGVmaW5lIFZGRTQwX0lNQVNLX1NUQVRTX0NTX09WV1IgICAgICAgICAgICAgKDB4MDAwMDAwMDE8PDIpCi0jZGVmaW5lIFZGRTQwX0lNQVNLX1NUQVRTX0lISVNUX09WV1IgICAgICAgICAgKDB4MDAwMDAwMDE8PDMpCi0jZGVmaW5lIFZGRTQwX0lNQVNLX1JFQUxJR05fQlVGX1lfT1ZGTCAgICAgICAgKDB4MDAwMDAwMDE8PDQpCi0jZGVmaW5lIFZGRTQwX0lNQVNLX1JFQUxJR05fQlVGX0NCX09WRkwgICAgICAgKDB4MDAwMDAwMDE8PDUpCi0jZGVmaW5lIFZGRTQwX0lNQVNLX1JFQUxJR05fQlVGX0NSX09WRkwgICAgICAgKDB4MDAwMDAwMDE8PDYpCi0jZGVmaW5lIFZGRTQwX0lNQVNLX1ZJT0xBVElPTiAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDE8PDcpCi0jZGVmaW5lIFZGRTQwX0lNQVNLX0JVU19CREdfSEFMVF9BQ0sgICAgICAgICAgKDB4MDAwMDAwMDE8PDgpCi0jZGVmaW5lIFZGRTQwX0lNQVNLX0lNR19NQVNUXzBfQlVTX09WRkwgICAgICAgKDB4MDAwMDAwMDE8PDkpCi0jZGVmaW5lIFZGRTQwX0lNQVNLX0lNR19NQVNUXzFfQlVTX09WRkwgICAgICAgKDB4MDAwMDAwMDE8PDEwKQotI2RlZmluZSBWRkU0MF9JTUFTS19JTUdfTUFTVF8yX0JVU19PVkZMICAgICAgICgweDAwMDAwMDAxPDwxMSkKLSNkZWZpbmUgVkZFNDBfSU1BU0tfSU1HX01BU1RfM19CVVNfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8MTIpCi0jZGVmaW5lIFZGRTQwX0lNQVNLX0lNR19NQVNUXzRfQlVTX09WRkwgICAgICAgKDB4MDAwMDAwMDE8PDEzKQotI2RlZmluZSBWRkU0MF9JTUFTS19JTUdfTUFTVF81X0JVU19PVkZMICAgICAgICgweDAwMDAwMDAxPDwxNCkKLSNkZWZpbmUgVkZFNDBfSU1BU0tfSU1HX01BU1RfNl9CVVNfT1ZGTCAgICAgICAoMHgwMDAwMDAwMTw8MTUpCi0jZGVmaW5lIFZGRTQwX0lNQVNLX1NUQVRTX0JFX0JVU19PVkZMICAgICAgICAgKDB4MDAwMDAwMDE8PDE2KQotI2RlZmluZSBWRkU0MF9JTUFTS19TVEFUU19CR19CVVNfT1ZGTCAgICAgICAgICgweDAwMDAwMDAxPDwxNykKLSNkZWZpbmUgVkZFNDBfSU1BU0tfU1RBVFNfQkZfQlVTX09WRkwgICAgICAgICAoMHgwMDAwMDAwMTw8MTgpCi0jZGVmaW5lIFZGRTQwX0lNQVNLX1NUQVRTX0FXQl9CVVNfT1ZGTCAgICAgICAgKDB4MDAwMDAwMDE8PDE5KQotI2RlZmluZSBWRkU0MF9JTUFTS19TVEFUU19SU19CVVNfT1ZGTCAgICAgICAgICgweDAwMDAwMDAxPDwxMCkKLSNkZWZpbmUgVkZFNDBfSU1BU0tfU1RBVFNfQ1NfQlVTX09WRkwgICAgICAgICAoMHgwMDAwMDAwMTw8MjEpCi0jZGVmaW5lIFZGRTQwX0lNQVNLX1NUQVRTX0lISVNUX0JVU19PVkZMICAgICAgKDB4MDAwMDAwMDE8PDIyKQotI2RlZmluZSBWRkU0MF9JTUFTS19TVEFUU19TS0lOX0JISVNUX0JVU19PVkZMICgweDAwMDAwMDAxPDwyMykKLQotI2RlZmluZSBWRkVfQ09NX1NUQVRVUyAweDAwMEZFMDAwCi0KLXN0cnVjdCB2ZmU0MF9vdXRwdXRfcGF0aCB7Ci0JdWludDE2X3Qgb3V0cHV0X21vZGU7ICAgICAvKiBiaXRtYXNrICAqLwotCi0Jc3RydWN0IHZmZTQwX291dHB1dF9jaCBvdXQwOyAvKiBwcmV2aWV3IGFuZCB0aHVtYm5haWwgKi8KLQlzdHJ1Y3QgdmZlNDBfb3V0cHV0X2NoIG91dDE7IC8qIHNuYXBzaG90ICovCi0Jc3RydWN0IHZmZTQwX291dHB1dF9jaCBvdXQyOyAvKiByZGkwICAgICovCi0Jc3RydWN0IHZmZTQwX291dHB1dF9jaCBvdXQzOyAvKiByZGkwMSAgICovCi19OwotCi1zdHJ1Y3QgdmZlNDBfZnJhbWVfZXh0cmEgewotCXVpbnQzMl90IGdyZWVuRGVmZWN0UGl4ZWxDb3VudDsKLQl1aW50MzJfdCByZWRCbHVlRGVmZWN0UGl4ZWxDb3VudDsKLQotCXVpbnQzMl90ICBhc2ZNYXhFZGdlOwotCXVpbnQzMl90ICBhc2ZIYmlDb3VudDsKLQotCXVpbnQzMl90IHlXclBtU3RhdHMwOwotCXVpbnQzMl90IHlXclBtU3RhdHMxOwotCXVpbnQzMl90IGNiY3JXclBtU3RhdHMwOwotCXVpbnQzMl90IGNiY3JXclBtU3RhdHMxOwotCi0JdWludDMyX3QgIGZyYW1lQ291bnRlcjsKLX07Ci0KLSNkZWZpbmUgVkZFX0hXX1ZFUlNJT04JCQkweDAwMDAwMDAwCi0jZGVmaW5lIFZGRV9HTE9CQUxfUkVTRVQgICAgICAgICAgICAgICAgMHgwMDAwMDAwQwotI2RlZmluZSBWRkVfTU9EVUxFX1JFU0VUICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgVkZFX0NHQ19PVkVSUklERSAgICAgICAgICAgICAgICAweDAwMDAwMDE0Ci0jZGVmaW5lIFZGRV9NT0RVTEVfQ0ZHICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOAotI2RlZmluZSBWRkVfQ0ZHCQkJCSAgICAgICAgICAgIDB4MDAwMDAwMUMKLSNkZWZpbmUgVkZFX0lSUV9DTUQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDI0Ci0jZGVmaW5lIFZGRV9JUlFfTUFTS18wICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyOAotI2RlZmluZSBWRkVfSVJRX01BU0tfMSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMkMKLSNkZWZpbmUgVkZFX0lSUV9DTEVBUl8wICAgICAgICAgICAgICAgICAweDAwMDAwMDMwCi0jZGVmaW5lIFZGRV9JUlFfQ0xFQVJfMSAgICAgICAgICAgICAgICAgMHgwMDAwMDAzNAotI2RlZmluZSBWRkVfSVJRX1NUQVRVU18wICAgICAgICAgICAgICAgIDB4MDAwMDAwMzgKLSNkZWZpbmUgVkZFX0lSUV9TVEFUVVNfMSAgICAgICAgICAgICAgICAweDAwMDAwMDNDCi0jZGVmaW5lIFZGRV9JUlFfQ09NUF9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBWRkVfQlVTX0NNRCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNEMKLSNkZWZpbmUgVkZFX0JVU19QSU5HX1BPTkdfU1RBVFVTICAgICAgICAweDAwMDAwMjY4Ci0jZGVmaW5lIFZGRV9BWElfQ01EICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDJDMAotI2RlZmluZSBWRkVfQVhJX1NUQVRVUyAgICAgICAgICAgICAgICAgIDB4MDAwMDAyRTQKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19QSU5HX1BPTkdfQkFTRSAgICAweDAwMDAwMTY4Ci0KLSNkZWZpbmUgVkZFX0JVU19TVEFUU19CRV9XUl9QSU5HX0FERFIgICAgMHgwMDAwMDE2OAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0JFX1dSX1BPTkdfQUREUiAgICAweDAwMDAwMTZDCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQkVfV1JfQUREUl9DRkcgICAgMHgwMDAwMDE3MAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0JFX1dSX1VCX0NGRyAgICAgICAgICAweDAwMDAwMTc0Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQkVfV1JfRlJBTUVEUk9QX1BBVFRFUk4gIDB4MDAwMDAxNzgKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19CRV9XUl9JUlFfU1VCU0FNUExFX1BBVFRFUk4gMHgwMDAwMDE3QwotCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQkdfV1JfUElOR19BRERSICAgICAweDAwMDAwMTgwCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQkdfV1JfUE9OR19BRERSICAgICAweDAwMDAwMTg0Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQkdfV1JfQUREUl9DRkcgICAgICAweDAwMDAwMTg4Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQkdfV1JfVUJfQ0ZHICAgICAgICAweDAwMDAwMThDCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQkdfV1JfRlJBTUVEUk9QX1BBVFRFUk4gMHgwMDAwMDE5MAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0JHX1dSX0lSUV9TVUJTQU1QTEVfUEFUVEVSTiAweDAwMDAwMTk0Ci0KLSNkZWZpbmUgVkZFX0JVU19TVEFUU19CRl9XUl9QSU5HX0FERFIgICAgIDB4MDAwMDAxOTgKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19CRl9XUl9QT05HX0FERFIgICAgIDB4MDAwMDAxOUMKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19CRl9XUl9BRERSX0NGRyAgICAgIDB4MDAwMDAxQTAKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19CRl9XUl9VQl9DRkcgICAgICAgIDB4MDAwMDAxQTQKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19CRl9XUl9GUkFNRURST1BfUEFUVEVSTiAgMHgwMDAwMDFBOAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0JGX1dSX0lSUV9TVUJTQU1QTEVfUEFUVEVSTiAgMHgwMDAwMDFBQwotCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQVdCX1dSX1BJTkdfQUREUiAgICAweDAwMDAwMUIwCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQVdCX1dSX1BPTkdfQUREUiAgICAweDAwMDAwMUI0Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQVdCX1dSX0FERFJfQ0ZHICAgICAweDAwMDAwMUI4Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQVdCX1dSX1VCX0NGRyAgICAgICAweDAwMDAwMUJDCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQVdCX1dSX0ZSQU1FRFJPUF9QQVRURVJOICAweDAwMDAwMUMwCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQVdCX1dSX0lSUV9TVUJTQU1QTEVfUEFUVEVSTiAgMHgwMDAwMDFDNAotCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfUlNfV1JfUElOR19BRERSICAgICAweDAwMDAwMUM4Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfUlNfV1JfUE9OR19BRERSICAgICAweDAwMDAwMUNDCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfUlNfV1JfQUREUl9DRkcgICAgICAweDAwMDAwMUQwCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfUlNfV1JfVUJfQ0ZHICAgIDB4MDAwMDAxRDQKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19SU19XUl9GUkFNRURST1BfUEFUVEVSTiAgICAgIDB4MDAwMDAxRDgKLSNkZWZpbmUgVkZFX0JVU19TVEFUU19SU19XUl9JUlFfU1VCU0FNUExFX1BBVFRFUk4gIDB4MDAwMDAxREMKLQotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0NTX1dSX1BJTkdfQUREUiAgICAgMHgwMDAwMDFFMAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0NTX1dSX1BPTkdfQUREUiAgICAgMHgwMDAwMDFFNAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0NTX1dSX0FERFJfQ0ZHICAgICAgMHgwMDAwMDFFOAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0NTX1dSX1VCX0NGRyAgICAgICAgMHgwMDAwMDFFQwotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0NTX1dSX0ZSQU1FRFJPUF9QQVRURVJOICAgICAweDAwMDAwMUYwCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfQ1NfV1JfSVJRX1NVQlNBTVBMRV9QQVRURVJOIDB4MDAwMDAxRjQKLQotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0hJU1RfV1JfUElOR19BRERSICAgMHgwMDAwMDFGOAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0hJU1RfV1JfUE9OR19BRERSICAgMHgwMDAwMDFGQwotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0hJU1RfV1JfQUREUl9DRkcgICAgMHgwMDAwMDIwMAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0hJU1RfV1JfVUJfQ0ZHICAgICAgMHgwMDAwMDIwNAotI2RlZmluZSBWRkVfQlVTX1NUQVRTX0hJU1RfV1JfRlJBTUVEUk9QX1BBVFRFUk4gICAgICAweDAwMDAwMjA4Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfSElTVF9XUl9JUlFfU1VCU0FNUExFX1BBVFRFUk4gIDB4MDAwMDAyMEMKLQotCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfU0tJTl9XUl9QSU5HX0FERFIgICAweDAwMDAwMjEwCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfU0tJTl9XUl9QT05HX0FERFIgICAweDAwMDAwMjE0Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfU0tJTl9XUl9BRERSX0NGRyAgICAweDAwMDAwMjE4Ci0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfU0tJTl9XUl9VQl9DRkcgICAgICAweDAwMDAwMjFDCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfU0tJTl9XUl9GUkFNRURST1BfUEFUVEVSTiAgICAgICAweDAwMDAwMjIwCi0jZGVmaW5lIFZGRV9CVVNfU1RBVFNfU0tJTl9XUl9JUlFfU1VCU0FNUExFX1BBVFRFUk4gICAweDAwMDAwMjI0Ci0KLSNkZWZpbmUgVkZFXzBfQlVTX0JER19RT1NfQ0ZHXzAgICAgIDB4MDAwMDAyQzQKLSNkZWZpbmUgVkZFXzBfQlVTX0JER19RT1NfQ0ZHXzEgICAgIDB4MDAwMDAyQzgKLSNkZWZpbmUgVkZFXzBfQlVTX0JER19RT1NfQ0ZHXzIgICAgIDB4MDAwMDAyQ0MKLSNkZWZpbmUgVkZFXzBfQlVTX0JER19RT1NfQ0ZHXzMgICAgIDB4MDAwMDAyRDAKLSNkZWZpbmUgVkZFXzBfQlVTX0JER19RT1NfQ0ZHXzQgICAgIDB4MDAwMDAyRDQKLSNkZWZpbmUgVkZFXzBfQlVTX0JER19RT1NfQ0ZHXzUgICAgIDB4MDAwMDAyRDgKLSNkZWZpbmUgVkZFXzBfQlVTX0JER19RT1NfQ0ZHXzYgICAgIDB4MDAwMDAyREMKLSNkZWZpbmUgVkZFXzBfQlVTX0JER19RT1NfQ0ZHXzcgICAgIDB4MDAwMDAyRTAKLQotI2RlZmluZSBWRkVfQ0FNSUZfQ09NTUFORCAgICAgICAgICAgICAgIDB4MDAwMDAyRjQKLSNkZWZpbmUgVkZFX0NBTUlGX1NUQVRVUyAgICAgICAgICAgICAgICAweDAwMDAwMzFDCi0jZGVmaW5lIFZGRV9SRUdfVVBEQVRFX0NNRCAgICAgICAgICAgICAgMHgwMDAwMDM3OAotI2RlZmluZSBWRkVfREVNVVhfR0FJTl8wICAgICAgICAgICAgICAgIDB4MDAwMDA0MjgKLSNkZWZpbmUgVkZFX0RFTVVYX0dBSU5fMSAgICAgICAgICAgICAgICAweDAwMDAwNDJDCi0jZGVmaW5lIFZGRV9DSFJPTUFfVVAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDU3QwotCi0jZGVmaW5lIFZGRV9DTEFNUF9FTkNfTUFYICAgICAgICAgICAgICAgMHgwMDAwMDg3NAotI2RlZmluZSBWRkVfQ0xBTVBfRU5DX01JTiAgICAgICAgICAgICAgIDB4MDAwMDA4NzgKLSNkZWZpbmUgVkZFX0NMQU1QX1ZJRVdfTUFYICAgICAgICAgICAgICAweDAwMDAwODdDCi0jZGVmaW5lIFZGRV9DTEFNUF9WSUVXX01JTiAgICAgICAgICAgICAgMHgwMDAwMDg4MAotCi0jZGVmaW5lIFZGRV9SRUFMSUdOX0JVRiAgICAgICAgICAgICAgICAgMHgwMDAwMDg4NAotI2RlZmluZSBWRkVfU1RBVFNfQ0ZHICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4ODgKLSNkZWZpbmUgVkZFX1NUQVRTX0FXQl9TR1dfQ0ZHICAgICAgICAgICAweDAwMDAwOENDCi0jZGVmaW5lIFZGRV9ETUlfQ0ZHICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDkxMAotI2RlZmluZSBWRkVfRE1JX0FERFIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA5MTQKLSNkZWZpbmUgVkZFX0RNSV9EQVRBX0hJICAgICAgICAgICAgICAgICAweDAwMDAwOTE4Ci0jZGVmaW5lIFZGRV9ETUlfREFUQV9MTyAgICAgICAgICAgICAgICAgMHgwMDAwMDkxQwotI2RlZmluZSBWRkVfQlVTX0lPX0ZPUk1BVF9DRkcgICAgICAgICAgIDB4MDAwMDAwNTQKLSNkZWZpbmUgVkZFX1JESTBfQ0ZHICAgICAgICAgICAgICAgICAgICAweDAwMDAwMkU4Ci0jZGVmaW5lIFZGRV9SREkxX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDJFQwotI2RlZmluZSBWRkVfUkRJMl9DRkcgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyRjAKLQotI2RlZmluZSBWRkVfVklPTEFUSU9OX1NUQVRVUyAgICAgICAgICAgIDB4MDAwMDAwNDgKLQotI2RlZmluZSBWRkU0MF9ETUlfREFUQV9ISSAgICAgICAgICAgICAgIDB4MDAwMDA5MTgKLSNkZWZpbmUgVkZFNDBfRE1JX0RBVEFfTE8gICAgICAgICAgICAgICAweDAwMDAwOTFDCi0KLSNkZWZpbmUgVkZFNDBfT1VUUFVUX01PREVfUFQJCQlCSVQoMCkKLSNkZWZpbmUgVkZFNDBfT1VUUFVUX01PREVfUwkJCUJJVCgxKQotI2RlZmluZSBWRkU0MF9PVVRQVVRfTU9ERV9WCQkJQklUKDIpCi0jZGVmaW5lIFZGRTQwX09VVFBVVF9NT0RFX1AJCQlCSVQoMykKLSNkZWZpbmUgVkZFNDBfT1VUUFVUX01PREVfVAkJCUJJVCg0KQotI2RlZmluZSBWRkU0MF9PVVRQVVRfTU9ERV9QX0FMTF9DSE5MUwkJQklUKDUpCi0jZGVmaW5lIFZGRTQwX09VVFBVVF9NT0RFX1BSSU1BUlkJCUJJVCg2KQotI2RlZmluZSBWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZX0FMTF9DSE5MUwlCSVQoNykKLSNkZWZpbmUgVkZFNDBfT1VUUFVUX01PREVfU0VDT05EQVJZCQlCSVQoOCkKLSNkZWZpbmUgVkZFNDBfT1VUUFVUX01PREVfU0VDT05EQVJZX0FMTF9DSE5MUwlCSVQoOSkKLSNkZWZpbmUgVkZFNDBfT1VUUFVUX01PREVfVEVSVElBUlkxCQlCSVQoMTApCi0jZGVmaW5lIFZGRTQwX09VVFBVVF9NT0RFX1RFUlRJQVJZMgkJQklUKDExKQotCi0jZGVmaW5lIFZGRTQwX1ZCSUZfQ0xLT04JCQkJCTB4NAotI2RlZmluZSBWRkU0MF9WQklGX0lOX1JEX0xJTV9DT05GMAkJCTB4QjAKLSNkZWZpbmUgVkZFNDBfVkJJRl9JTl9SRF9MSU1fQ09ORjEJCQkweEI0Ci0jZGVmaW5lIFZGRTQwX1ZCSUZfSU5fUkRfTElNX0NPTkYyCQkJMHhCOAotI2RlZmluZSBWRkU0MF9WQklGX0lOX1dSX0xJTV9DT05GMAkJCTB4QzAKLSNkZWZpbmUgVkZFNDBfVkJJRl9JTl9XUl9MSU1fQ09ORjEJCQkweEM0Ci0jZGVmaW5lIFZGRTQwX1ZCSUZfSU5fV1JfTElNX0NPTkYyCQkJMHhDOAotI2RlZmluZSBWRkU0MF9WQklGX09VVF9SRF9MSU1fQ09ORjAJCQkweEQwCi0jZGVmaW5lIFZGRTQwX1ZCSUZfT1VUX1dSX0xJTV9DT05GMAkJCTB4RDQKLSNkZWZpbmUgVkZFNDBfVkJJRl9ERFJfT1VUX01BWF9CVVJTVAkJMHhEOAotI2RlZmluZSBWRkU0MF9WQklGX09DTUVNX09VVF9NQVhfQlVSU1QJCTB4REMKLSNkZWZpbmUgVkZFNDBfVkJJRl9BUkJfQ1RMCQkJCQkweEYwCi0jZGVmaW5lIFZGRTQwX1ZCSUZfRERSX0FSQl9DT05GMAkJCTB4RjQKLSNkZWZpbmUgVkZFNDBfVkJJRl9ERFJfQVJCX0NPTkYxCQkJMHhGOAotI2RlZmluZSBWRkU0MF9WQklGX1JPVU5EX1JPQklOX1FPU19BUkIJCTB4MTI0Ci0jZGVmaW5lIFZGRTQwX1ZCSUZfT1VUX0FYSV9BTUVNVFlQRV9DT05GMAkweDE2MAotI2RlZmluZSBWRkU0MF9WQklGX09VVF9BWElfQU1FTVRZUEVfQ09ORjEJMHgxNjQKLSNkZWZpbmUgVkZFNDBfVkJJRl9PVVRfQVhJX0FPT09fRU4JCQkweDE3OAotI2RlZmluZSBWRkU0MF9WQklGX09VVF9BWElfQU9PTwkJCQkweDE3QwotCi1zdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wgewotCXVpbnQzMl90IGRyb3BwZWRTdGF0c0ZyYW1lQ291bnQ7Ci0JdWludDMyX3QgYnVmVG9SZW5kZXI7Ci19Owotc3RydWN0IGF4aV9jdHJsX3Q7Ci1zdHJ1Y3QgdmZlNDBfY3RybF90eXBlOwotCi1zdHJ1Y3QgdmZlX3NoYXJlX2N0cmxfdCB7Ci0Jdm9pZCBfX2lvbWVtICp2ZmViYXNlOwotCXZvaWQgX19pb21lbSAqdmZlX3ZiaWZfYmFzZTsKLQl1aW50MzJfdCByZWdpc3Rlcl90b3RhbDsKLQotCWF0b21pY190IHZzdGF0ZTsKLQlhdG9taWNfdCBoYW5kbGVfY29tbW9uX2lycTsKLQl1aW50MzJfdCB2ZmVGcmFtZUlkOwotCXVpbnQzMl90IHJkaTBGcmFtZUlkOwotCXVpbnQzMl90IHJkaTFGcmFtZUlkOwotCXVpbnQzMl90IHJkaTJGcmFtZUlkOwotCXVpbnQzMl90IHN0YXRzX2NvbXA7Ci0Jc3BpbmxvY2tfdCAgc2Rfbm90aWZ5X2xvY2s7Ci0Jc3BpbmxvY2tfdCAgc3RvcF9mbGFnX2xvY2s7Ci0JaW50OF90IHN0b3BfYWNrX3BlbmRpbmc7Ci0JZW51bSB2ZmVfb3V0cHV0X3N0YXRlIGxpdmVzaG90X3N0YXRlOwotCXVpbnQzMl90IHZmZV9jYXB0dXJlX2NvdW50OwotCi0JdWludDMyX3Qgb3BlcmF0aW9uX21vZGU7ICAgICAvKiBzdHJlYW1pbmcgb3Igc25hcHNob3QgKi8KLQl1aW50MzJfdCBjdXJyZW50X21vZGU7Ci0Jc3RydWN0IHZmZTQwX291dHB1dF9wYXRoIG91dHBhdGg7Ci0KLQl1aW50MTZfdCBwb3J0X2luZm87Ci0JdWludDhfdCBzdG9wX2ltbWVkaWF0ZWx5OwotCXVpbnQ4X3Qgc3luY19hYm9ydDsKLQl1aW50MTZfdCBjbWRfdHlwZTsKLQl1aW50OF90IHZmZV9yZXNldF9mbGFnOwotCi0JdWludDhfdCBheGlfcmVmX2NudDsKLQl1aW50MTZfdCBjb21wX291dHB1dF9tb2RlOwotCi0Jc3RydWN0IGNvbXBsZXRpb24gcmVzZXRfY29tcGxldGU7Ci0KLQlzcGlubG9ja190ICB1cGRhdGVfYWNrX2xvY2s7Ci0Jc3BpbmxvY2tfdCAgc3RhcnRfYWNrX2xvY2s7Ci0KLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmw7Ci0Jc3RydWN0IHZmZTQwX2N0cmxfdHlwZSAqdmZlNDBfY3RybDsKLQlpbnQ4X3Qgc3RhcnRfYWNrX3BlbmRpbmc7Ci0JaW50OF90IHVwZGF0ZV9hY2tfcGVuZGluZzsKLQllbnVtIHZmZV9vdXRwdXRfc3RhdGUgcmVjb3JkaW5nX3N0YXRlOwotCi0JYXRvbWljX3QgcGl4MF91cGRhdGVfYWNrX3BlbmRpbmc7Ci0JYXRvbWljX3QgcmRpMF91cGRhdGVfYWNrX3BlbmRpbmc7Ci0JYXRvbWljX3QgcmRpMV91cGRhdGVfYWNrX3BlbmRpbmc7Ci0JYXRvbWljX3QgcmRpMl91cGRhdGVfYWNrX3BlbmRpbmc7Ci19OwotCi1zdHJ1Y3QgYXhpX2N0cmxfdCB7Ci0Jc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXN0cnVjdCByZXNvdXJjZSAqdmZlaXJxOwotCXNwaW5sb2NrX3QgIHRhc2tsZXRfbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHRhc2tsZXRfcTsKLQotCXZvaWQgKnN5bmNkYXRhOwotCi0Jc3RydWN0IHJlc291cmNlCSp2ZmVtZW07Ci0Jc3RydWN0IHJlc291cmNlCSp2ZmVfdmJpZl9tZW07Ci0Jc3RydWN0IHJlc291cmNlICp2ZmVpbzsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnZmZV92YmlmX2lvOwotCXN0cnVjdCByZWd1bGF0b3IgKmZzX3ZmZTsKLQlzdHJ1Y3QgY2xrICp2ZmVfY2xrWzddOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB2ZmU0MF90YXNrbGV0OwotCXN0cnVjdCB2ZmVfc2hhcmVfY3RybF90ICpzaGFyZV9jdHJsOwotCXN0cnVjdCBkZXZpY2UgKmlvbW11X2N0eDsKLQl1aW50MzJfdCBidXNfcGVyZl9jbGllbnQ7Ci0JdWludDMyX3QgdXNlX2lycV9yb3V0ZXI7Ci19OwotCi1zdHJ1Y3QgdmZlNDBfY3RybF90eXBlIHsKLQlzcGlubG9ja190ICBzdGF0ZV9sb2NrOwotCXNwaW5sb2NrX3QgIHN0YXRzX2J1ZnFfbG9jazsKLQl1aW50MzJfdCBleHRsZW47Ci0Jdm9pZCAqZXh0ZGF0YTsKLQotCWludDhfdCB2ZmVfc29mX2NvdW50X2VuYWJsZTsKLQlpbnQ4X3QgdXBkYXRlX2xpbmVhcjsKLQlpbnQ4X3QgdXBkYXRlX3JvbGxvZmY7Ci0JaW50OF90IHVwZGF0ZV9sYTsKLQlpbnQ4X3QgdXBkYXRlX2dhbW1hOwotCi0Jc3RydWN0IHZmZV9zaGFyZV9jdHJsX3QgKnNoYXJlX2N0cmw7Ci0KLQl1aW50MzJfdCBzeW5jX3RpbWVyX3JlcGVhdF9jb3VudDsKLQl1aW50MzJfdCBzeW5jX3RpbWVyX3N0YXRlOwotCXVpbnQzMl90IHN5bmNfdGltZXJfbnVtYmVyOwotCi0Jc3RydWN0IG1zbV92ZXJfbnVtX2luZm8gdmVyX251bTsKLQlzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wgYmVTdGF0c0NvbnRyb2w7Ci0Jc3RydWN0IHZmZV9zdGF0c19jb250cm9sIGJmU3RhdHNDb250cm9sOwotCXN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCBhd2JTdGF0c0NvbnRyb2w7Ci0Jc3RydWN0IHZmZV9zdGF0c19jb250cm9sIGJnU3RhdHNDb250cm9sOwotCXN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCBpaGlzdFN0YXRzQ29udHJvbDsKLQlzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wgcnNTdGF0c0NvbnRyb2w7Ci0Jc3RydWN0IHZmZV9zdGF0c19jb250cm9sIGNzU3RhdHNDb250cm9sOwotCXN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCBiaGlzdFN0YXRzQ29udHJvbDsKLQotCS8qIHY0bDIgc3ViZGV2ICovCi0Jc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXVpbnQzMl90IGhmcl9tb2RlOwotCXVpbnQzMl90IGZyYW1lX3NraXBfY250OwotCXVpbnQzMl90IGZyYW1lX3NraXBfcGF0dGVybjsKLQl1aW50MzJfdCBzbmFwc2hvdF9mcmFtZV9jbnQ7Ci0Jc3RydWN0IG1zbV9zdGF0c19idWZxX2N0cmwgc3RhdHNfY3RybDsKLQlzdHJ1Y3QgbXNtX3N0YXRzX29wcyBzdGF0c19vcHM7Ci0KLQl1aW50MzJfdCBzaW11bHRhbmVvdXNfc29mX3N0YXQ7Ci19OwotCi0jZGVmaW5lIHN0YXRzQmVOdW0gICAgICAwCi0jZGVmaW5lIHN0YXRzQmdOdW0gICAgICAxCi0jZGVmaW5lIHN0YXRzQmZOdW0gICAgICAyCi0jZGVmaW5lIHN0YXRzQXdiTnVtICAgICAzCi0jZGVmaW5lIHN0YXRzUnNOdW0gICAgICA0Ci0jZGVmaW5lIHN0YXRzQ3NOdW0gICAgICA1Ci0jZGVmaW5lIHN0YXRzSWhpc3ROdW0gICA2Ci0jZGVmaW5lIHN0YXRzU2tpbk51bSAgICA3Ci0KLSNkZWZpbmUgVkZFX1NUQVRTX0JVU19SRUdfTlVNICA2Ci0KLXN0cnVjdCB2ZmVfY21kX3N0YXRzX2FjayB7Ci0JdWludDMyX3QgIG5leHRTdGF0c0J1ZjsKLX07Ci0KLSNkZWZpbmUgVkZFX1NUQVRTX0JVRkZFUl9DT1VOVCAgICAgICAgICAgIDMKLQotc3RydWN0IHZmZV9jbWRfc3RhdHNfYnVmIHsKLQl1aW50MzJfdCBzdGF0c0J1ZltWRkVfU1RBVFNfQlVGRkVSX0NPVU5UXTsKLX07Ci0KLSNlbmRpZiAvKiBfX01TTV9WRkU0MF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTQwX2F4aS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlNDBfYXhpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YTIxOWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlNDBfYXhpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MjQgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvYXRvbWljLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2lzcC5oPgotCi0jaW5jbHVkZSAibXNtLmgiCi0jaW5jbHVkZSAibXNtX3ZmZTQwLmgiCi0KLXN0YXRpYyBpbnQgbXNtX2F4aV9zdWJkZXZfc19jcnlzdGFsX2ZyZXEoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQkJCQkJCXUzMiBmcmVxLCB1MzIgZmxhZ3MpCi17Ci0JaW50IHJjID0gMDsKLQlpbnQgcm91bmRfcmF0ZTsKLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQotCXJvdW5kX3JhdGUgPSBjbGtfcm91bmRfcmF0ZShheGlfY3RybC0+dmZlX2Nsa1swXSwgZnJlcSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBjbGtfcm91bmRfcmF0ZSBmYWlsZWQgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlX2Nsa19yYXRlID0gcm91bmRfcmF0ZTsKLQlyYyA9IGNsa19zZXRfcmF0ZShheGlfY3RybC0+dmZlX2Nsa1swXSwgcm91bmRfcmF0ZSk7Ci0JaWYgKHJjIDwgMCkKLQkJcHJfZXJyKCIlczogY2xrX3NldF9yYXRlIGZhaWxlZCAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJjKTsKLQotCXJldHVybiByYzsKLX0KLQotdm9pZCBheGlfc3RhcnQoc3RydWN0IGF4aV9jdHJsX3QgKmF4aV9jdHJsKQotewotCXN3aXRjaCAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlKSB7Ci0JY2FzZSBWRkVfT1VUUFVUU19QUkVWSUVXOgotCWNhc2UgVkZFX09VVFBVVFNfUFJFVklFV19BTkRfVklERU86Ci0JCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCQlWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZKSB7Ci0JCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTQwX0FYSV9XTV9DRkdbYXhpX2N0cmwtPgotCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDBdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlNDBfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMV0pOwotCQl9IGVsc2UgaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlICYKLQkJCQlWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZX0FMTF9DSE5MUykgewotCQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmU0MF9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwXSk7Ci0JCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTQwX0FYSV9XTV9DRkdbYXhpX2N0cmwtPgotCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDFdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlNDBfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMl0pOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSAmCi0JCQlWRkU0MF9PVVRQVVRfTU9ERV9TRUNPTkRBUlkpIHsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlNDBfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMF0pOwotCQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmU0MF9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxXSk7Ci0JCX0gZWxzZSBpZiAoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgJgotCQkJVkZFNDBfT1VUUFVUX01PREVfU0VDT05EQVJZX0FMTF9DSE5MUykgewotCQkJbXNtX2NhbWVyYV9pb193KDEsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCQl2ZmU0MF9BWElfV01fQ0ZHW2F4aV9jdHJsLT4KLQkJCQlzaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwXSk7Ci0JCQltc21fY2FtZXJhX2lvX3coMSwgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCXZmZTQwX0FYSV9XTV9DRkdbYXhpX2N0cmwtPgotCQkJCXNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDFdKTsKLQkJCW1zbV9jYW1lcmFfaW9fdygxLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQkJdmZlNDBfQVhJX1dNX0NGR1theGlfY3RybC0+Ci0JCQkJc2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMl0pOwotCQl9Ci0JCWJyZWFrOwotCX0KLX0KLQotdm9pZCBheGlfc3RvcChzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwpCi17Ci0JdWludDhfdCAgYXhpQnVzeUZsYWcgPSB0cnVlOwotCS8qIGF4aSBoYWx0IGNvbW1hbmQuICovCi0JbXNtX2NhbWVyYV9pb193KEFYSV9IQUxULAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9BWElfQ01EKTsKLQl3bWIoKTsKLQl3aGlsZSAoYXhpQnVzeUZsYWcpIHsKLQkJaWYgKG1zbV9jYW1lcmFfaW9fcigKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0FYSV9TVEFUVVMpICYgMHgxKQotCQkJYXhpQnVzeUZsYWcgPSBmYWxzZTsKLQl9Ci0JLyogRW5zdXJlIHRoZSB3cml0ZSBvcmRlciB3aGlsZSB3cml0aW5nCi0JdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdXNpbmcgdGhlIGJhcnJpZXIgKi8KLQltc21fY2FtZXJhX2lvX3dfbWIoQVhJX0hBTFRfQ0xFQVIsCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0FYSV9DTUQpOwotCi0JLyogYWZ0ZXIgYXhpIGhhbHQsIHRoZW4gb2sgdG8gYXBwbHkgZ2xvYmFsIHJlc2V0LiAqLwotCS8qIGVuYWJsZSByZXNldF9hY2sgYW5kIGFzeW5jIHRpbWVyIGludGVycnVwdCBvbmx5IHdoaWxlCi0Jc3RvcHBpbmcgdGhlIHBpcGVsaW5lLiovCi0JbXNtX2NhbWVyYV9pb193KDB4ZjAwMDAwMDAsCi0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsgVkZFX0lSUV9NQVNLXzApOwotCW1zbV9jYW1lcmFfaW9fdyhWRkVfSU1BU0tfV0hJTEVfU1RPUFBJTkdfMSwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX01BU0tfMSk7Ci0KLQkvKiBFbnN1cmUgdGhlIHdyaXRlIG9yZGVyIHdoaWxlIHdyaXRpbmcKLQl0byB0aGUgY29tbWFuZCByZWdpc3RlciB1c2luZyB0aGUgYmFycmllciAqLwotCW1zbV9jYW1lcmFfaW9fd19tYihWRkVfUkVTRVRfVVBPTl9TVE9QX0NNRCwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfR0xPQkFMX1JFU0VUKTsKLX0KLQotc3RhdGljIGludCB2ZmU0MF9jb25maWdfYXhpKAotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCwgaW50IG1vZGUsIHVpbnQzMl90ICphbykKLXsKLQl1aW50MzJfdCAqY2hfaW5mbzsKLQl1aW50MzJfdCAqYXhpX2NmZyA9IGFvOwotCi0JLyogVXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIHdyaXRlIG1hc3RlcnMgZm9yIGVhY2ggb3V0cHV0Ki8KLQljaF9pbmZvID0gYXhpX2NmZyArIFY0MF9BWElfQ0ZHX0xFTjsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMCA9IDB4MDAwMEZGRkYgJiAqY2hfaW5mbzsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMSA9Ci0JCTB4MDAwMEZGRkYgJiAoKmNoX2luZm8rKyA+PiAxNik7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDIgPSAweDAwMDBGRkZGICYgKmNoX2luZm87Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5pbWFnZV9tb2RlID0KLQkJMHgwMDAwRkZGRiAmICgqY2hfaW5mbysrID4+IDE2KTsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMCA9IDB4MDAwMEZGRkYgJiAqY2hfaW5mbzsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSA9Ci0JCTB4MDAwMEZGRkYgJiAoKmNoX2luZm8rKyA+PiAxNik7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDIgPSAweDAwMDBGRkZGICYgKmNoX2luZm87Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5pbWFnZV9tb2RlID0KLQkJMHgwMDAwRkZGRiAmICgqY2hfaW5mbysrID4+IDE2KTsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmNoMCA9IDB4MDAwMEZGRkYgJiAqY2hfaW5mbzsKLQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQyLmNoMSA9Ci0JCTB4MDAwMEZGRkYgJiAoKmNoX2luZm8rKyA+PiAxNik7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0Mi5jaDIgPSAweDAwMDBGRkZGICYgKmNoX2luZm8rKzsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgT1VUUFVUX1BSSU06Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlID0KLQkJCVZGRTQwX09VVFBVVF9NT0RFX1BSSU1BUlk7Ci0JCWJyZWFrOwotCWNhc2UgT1VUUFVUX1BSSU1fQUxMX0NITkxTOgotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSA9Ci0JCQlWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZX0FMTF9DSE5MUzsKLQkJYnJlYWs7Ci0JY2FzZSBPVVRQVVRfUFJJTXxPVVRQVVRfU0VDOgotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSA9Ci0JCQlWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZOwotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSB8PQotCQkJVkZFNDBfT1VUUFVUX01PREVfU0VDT05EQVJZOwotCQlicmVhazsKLQljYXNlIE9VVFBVVF9QUklNfE9VVFBVVF9TRUNfQUxMX0NITkxTOgotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSA9Ci0JCQlWRkU0MF9PVVRQVVRfTU9ERV9QUklNQVJZOwotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXRwdXRfbW9kZSB8PQotCQkJVkZFNDBfT1VUUFVUX01PREVfU0VDT05EQVJZX0FMTF9DSE5MUzsKLQkJYnJlYWs7Ci0JY2FzZSBPVVRQVVRfUFJJTV9BTExfQ0hOTFN8T1VUUFVUX1NFQzoKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0cHV0X21vZGUgPQotCQkJVkZFNDBfT1VUUFVUX01PREVfUFJJTUFSWV9BTExfQ0hOTFM7Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dHB1dF9tb2RlIHw9Ci0JCQlWRkU0MF9PVVRQVVRfTU9ERV9TRUNPTkRBUlk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXMgSW52YWxpZCBBWEkgbW9kZSAlZCAiLCBfX2Z1bmNfXywgbW9kZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQltc21fY2FtZXJhX2lvX3coKmFvLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCVZGRV9CVVNfSU9fRk9STUFUX0NGRyk7Ci0JbXNtX2NhbWVyYV9pb19tZW1jcHkoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQl2ZmU0MF9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ub2Zmc2V0LCBheGlfY2ZnLAotCQl2ZmU0MF9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ubGVuZ3RoIC0gVjQwX0FYSV9DSF9JTkZfTEVOKTsKLQltc21fY2FtZXJhX2lvX3coKmNoX2luZm8rKywKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkRJMF9DRkcpOwotCWlmIChtc21fY2FtZXJhX2lvX3IoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQlWNDBfR0VUX0hXX1ZFUlNJT05fT0ZGKSA9PQotCQlWRkU0MF9IV19OVU1CRVIpIHsKLQkJbXNtX2NhbWVyYV9pb193KCpjaF9pbmZvKyssCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArIFZGRV9SREkxX0NGRyk7Ci0JCW1zbV9jYW1lcmFfaW9fdygqY2hfaW5mbysrLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKyBWRkVfUkRJMl9DRkcpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fYXhpX2NvbmZpZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2b2lkIF9fdXNlciAqYXJnKQotewotCXN0cnVjdCBtc21fdmZlX2NmZ19jbWQgY2ZnY21kOwotCXN0cnVjdCBtc21faXNwX2NtZCB2ZmVjbWQ7Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQotCWlmICghYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UpIHsKLQkJcHJfZXJyKCIlczogYmFzZSBhZGRyZXNzIHVubWFwcGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQlpZiAoTlVMTCAhPSBhcmcpIHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmdjbWQsIGFyZywgc2l6ZW9mKGNmZ2NtZCkpKSB7Ci0JCQlFUlJfQ09QWV9GUk9NX1VTRVIoKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfQotCWlmIChOVUxMICE9IGNmZ2NtZC52YWx1ZSkgewotCQlpZiAoY29weV9mcm9tX3VzZXIoJnZmZWNtZCwKLQkJCQkodm9pZCBfX3VzZXIgKikoY2ZnY21kLnZhbHVlKSwKLQkJCQlzaXplb2YodmZlY21kKSkpIHsKLQkJCXByX2VycigiJXMgJWQ6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19mdW5jX18sCi0JCQkJX19MSU5FX18pOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0KLQlzd2l0Y2ggKGNmZ2NtZC5jbWRfdHlwZSkgewotCWNhc2UgQ01EX0FYSV9DRkdfUFJJTTogewotCQl1aW50MzJfdCAqYXhpbyA9IE5VTEw7Ci0JCWF4aW8gPSBrbWFsbG9jKHZmZTQwX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgsCi0JCQkJR0ZQX0FUT01JQyk7Ci0JCWlmICghYXhpbykgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoYXhpbywgKHZvaWQgX191c2VyICopKHZmZWNtZC52YWx1ZSksCi0JCQkJdmZlNDBfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCkpIHsKLQkJCWtmcmVlKGF4aW8pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJdmZlNDBfY29uZmlnX2F4aShheGlfY3RybCwgT1VUUFVUX1BSSU0sIGF4aW8pOwotCQlrZnJlZShheGlvKTsKLQl9Ci0JCWJyZWFrOwotCWNhc2UgQ01EX0FYSV9DRkdfUFJJTV9BTExfQ0hOTFM6IHsKLQkJdWludDMyX3QgKmF4aW8gPSBOVUxMOwotCQlheGlvID0ga21hbGxvYyh2ZmU0MF9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ubGVuZ3RoLAotCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIWF4aW8pIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXZmZTQwX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgpKSB7Ci0JCQlrZnJlZShheGlvKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXZmZTQwX2NvbmZpZ19heGkoYXhpX2N0cmwsIE9VVFBVVF9QUklNX0FMTF9DSE5MUywgYXhpbyk7Ci0JCWtmcmVlKGF4aW8pOwotCX0KLQkJYnJlYWs7Ci0JY2FzZSBDTURfQVhJX0NGR19QUklNfENNRF9BWElfQ0ZHX1NFQzogewotCQl1aW50MzJfdCAqYXhpbyA9IE5VTEw7Ci0JCWF4aW8gPSBrbWFsbG9jKHZmZTQwX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgsCi0JCQkJR0ZQX0FUT01JQyk7Ci0JCWlmICghYXhpbykgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoYXhpbywgKHZvaWQgX191c2VyICopKHZmZWNtZC52YWx1ZSksCi0JCQkJdmZlNDBfY21kW1ZGRV9DTURfQVhJX09VVF9DRkddLmxlbmd0aCkpIHsKLQkJCWtmcmVlKGF4aW8pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJdmZlNDBfY29uZmlnX2F4aShheGlfY3RybCwgT1VUUFVUX1BSSU18T1VUUFVUX1NFQywgYXhpbyk7Ci0JCWtmcmVlKGF4aW8pOwotCX0KLQkJYnJlYWs7Ci0JY2FzZSBDTURfQVhJX0NGR19QUklNfENNRF9BWElfQ0ZHX1NFQ19BTExfQ0hOTFM6IHsKLQkJdWludDMyX3QgKmF4aW8gPSBOVUxMOwotCQlheGlvID0ga21hbGxvYyh2ZmU0MF9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ubGVuZ3RoLAotCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIWF4aW8pIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXZmZTQwX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgpKSB7Ci0JCQlrZnJlZShheGlvKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXZmZTQwX2NvbmZpZ19heGkoYXhpX2N0cmwsCi0JCQlPVVRQVVRfUFJJTXxPVVRQVVRfU0VDX0FMTF9DSE5MUywgYXhpbyk7Ci0JCWtmcmVlKGF4aW8pOwotCX0KLQkJYnJlYWs7Ci0JY2FzZSBDTURfQVhJX0NGR19QUklNX0FMTF9DSE5MU3xDTURfQVhJX0NGR19TRUM6IHsKLQkJdWludDMyX3QgKmF4aW8gPSBOVUxMOwotCQlheGlvID0ga21hbGxvYyh2ZmU0MF9jbWRbVkZFX0NNRF9BWElfT1VUX0NGR10ubGVuZ3RoLAotCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIWF4aW8pIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXZmZTQwX2NtZFtWRkVfQ01EX0FYSV9PVVRfQ0ZHXS5sZW5ndGgpKSB7Ci0JCQlrZnJlZShheGlvKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXZmZTQwX2NvbmZpZ19heGkoYXhpX2N0cmwsCi0JCQlPVVRQVVRfUFJJTV9BTExfQ0hOTFN8T1VUUFVUX1NFQywgYXhpbyk7Ci0JCWtmcmVlKGF4aW8pOwotCX0KLQkJYnJlYWs7Ci0JY2FzZSBDTURfQVhJX0NGR19QUklNX0FMTF9DSE5MU3xDTURfQVhJX0NGR19TRUNfQUxMX0NITkxTOgotCQlwcl9lcnIoIiVzIEludmFsaWQvVW5zdXBwb3J0ZWQgQVhJIGNvbmZpZ3VyYXRpb24gJXgiLAotCQkJX19mdW5jX18sIGNmZ2NtZC5jbWRfdHlwZSk7Ci0JCWJyZWFrOwotCWNhc2UgQ01EX0FYSV9TVEFSVDoKLQkJYXhpX3N0YXJ0KGF4aV9jdHJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBDTURfQVhJX1NUT1A6Ci0JCWF4aV9zdG9wKGF4aV9jdHJsKTsKLQkJYnJlYWs7Ci0JY2FzZSBDTURfQVhJX1JFU0VUOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzIFVuc3VwcG9ydGVkIEFYSSBjb25maWd1cmF0aW9uICV4ICIsIF9fZnVuY19fLAotCQkJY2ZnY21kLmNtZF90eXBlKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHN0cnVjdCBtc21fZnJlZV9idWYgKnZmZTQwX2NoZWNrX2ZyZWVfYnVmZmVyKAotCWludCBpZCwgaW50IHBhdGgsIHN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCkKLXsKLQlzdHJ1Y3QgdmZlNDBfb3V0cHV0X2NoICpvdXRjaCA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9mcmVlX2J1ZiAqYiA9IE5VTEw7Ci0JdWludDMyX3QgaW1hZ2VfbW9kZSA9IDA7Ci0KLQlpZiAocGF0aCA9PSBWRkVfTVNHX09VVFBVVF9QUklNQVJZKQotCQlpbWFnZV9tb2RlID0gYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5pbWFnZV9tb2RlOwotCWVsc2UKLQkJaW1hZ2VfbW9kZSA9IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuaW1hZ2VfbW9kZTsKLQotCXZmZTQwX3N1YmRldl9ub3RpZnkoaWQsIHBhdGgsIGltYWdlX21vZGUsCi0JCSZheGlfY3RybC0+c3ViZGV2LCBheGlfY3RybC0+c2hhcmVfY3RybCk7Ci0Jb3V0Y2ggPSB2ZmU0MF9nZXRfY2gocGF0aCwgYXhpX2N0cmwtPnNoYXJlX2N0cmwpOwotCWlmIChvdXRjaC0+ZnJlZV9idWYuY2hfcGFkZHJbMF0pCi0JCWIgPSAmb3V0Y2gtPmZyZWVfYnVmOwotCXJldHVybiBiOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfc2VuZF9vdXRtc2coCi0Jc3RydWN0IGF4aV9jdHJsX3QgKmF4aV9jdHJsLCB1aW50OF90IG1zZ2lkLAotCXVpbnQzMl90IGNoMF9wYWRkciwgdWludDMyX3QgY2gxX3BhZGRyLAotCXVpbnQzMl90IGNoMl9wYWRkciwgdWludDMyX3QgaW1hZ2VfbW9kZSkKLXsKLQlzdHJ1Y3QgaXNwX21zZ19vdXRwdXQgbXNnOwotCi0JbXNnLm91dHB1dF9pZCA9IG1zZ2lkOwotCW1zZy5idWYuaW1hZ2VfbW9kZSA9IGltYWdlX21vZGU7Ci0JbXNnLmJ1Zi5jaF9wYWRkclswXQk9IGNoMF9wYWRkcjsKLQltc2cuYnVmLmNoX3BhZGRyWzFdCT0gY2gxX3BhZGRyOwotCW1zZy5idWYuY2hfcGFkZHJbMl0JPSBjaDJfcGFkZHI7Ci0JbXNnLmZyYW1lQ291bnRlciA9IGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmVGcmFtZUlkOwotCi0JdjRsMl9zdWJkZXZfbm90aWZ5KCZheGlfY3RybC0+c3ViZGV2LAotCQkJTk9USUZZX1ZGRV9NU0dfT1VULAotCQkJJm1zZyk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCB2ZmU0MF9wcm9jZXNzX291dHB1dF9wYXRoX2lycV8wKAotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCkKLXsKLQl1aW50MzJfdCBwaW5nX3Bvbmc7Ci0JdWludDMyX3QgY2gwX3BhZGRyLCBjaDFfcGFkZHIsIGNoMl9wYWRkcjsKLQl1aW50OF90IG91dF9ib29sID0gMDsKLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmICpmcmVlX2J1ZiA9IE5VTEw7Ci0KLQlmcmVlX2J1ZiA9IHZmZTQwX2NoZWNrX2ZyZWVfYnVmZmVyKFZGRV9NU0dfT1VUUFVUX0lSUSwKLQkJVkZFX01TR19PVVRQVVRfUFJJTUFSWSwgYXhpX2N0cmwpOwotCi0JLyogd2UgcmVuZGVyIGZyYW1lcyBpbiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0JMS4gQ29udGludW91cyBtb2RlIGFuZCB0aGUgZnJlZSBidWZmZXIgaXMgYXZhaWFsYWJsZS4KLQkyLiBJbiBzbmFwc2hvdCBzaG90IG1vZGUsIGZyZWUgYnVmZmVyIGlzIG5vdCBhbHdheXMgYXZhaWxhYmxlLgotCXdoZW4gcGVuZGluZyBzbmFwc2hvdCBjb3VudCBpcyA8PTEsICB0aGVuIG5vIG5lZWQgdG8gdXNlCi0JZnJlZSBidWZmZXIuCi0JKi8KLQlvdXRfYm9vbCA9ICgKLQkJKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJVkZFX09VVFBVVFNfVEhVTUJfQU5EX01BSU4gfHwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQlWRkVfT1VUUFVUU19NQUlOX0FORF9USFVNQiB8fAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0KLQkJCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9KUEVHIHx8Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJVkZFX09VVFBVVFNfSlBFR19BTkRfVEhVTUIgfHwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQlWRkVfT1VUUFVUU19SQVcgfHwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPmxpdmVzaG90X3N0YXRlID09Ci0JCQlWRkVfU1RBVEVfU1RBUlRFRCB8fAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPT0KLQkJCVZGRV9TVEFURV9TVE9QX1JFUVVFU1RFRCB8fAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPT0KLQkJCVZGRV9TVEFURV9TVE9QUEVEKSAmJgotCQkoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZV9jYXB0dXJlX2NvdW50IDw9IDEpKSB8fAotCQkJZnJlZV9idWY7Ci0KLQlpZiAob3V0X2Jvb2wpIHsKLQkJcGluZ19wb25nID0gbXNtX2NhbWVyYV9pb19yKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlICsKLQkJCVZGRV9CVVNfUElOR19QT05HX1NUQVRVUyk7Ci0KLQkJLyogQ2hhbm5lbCAwKi8KLQkJY2gwX3BhZGRyID0gdmZlNDBfZ2V0X2NoX2FkZHIoCi0JCQlwaW5nX3BvbmcsIGF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDApOwotCQkvKiBDaGFubmVsIDEqLwotCQljaDFfcGFkZHIgPSB2ZmU0MF9nZXRfY2hfYWRkcigKLQkJCXBpbmdfcG9uZywgYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNoMSk7Ci0JCS8qIENoYW5uZWwgMiovCi0JCWNoMl9wYWRkciA9IHZmZTQwX2dldF9jaF9hZGRyKAotCQkJcGluZ19wb25nLCBheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gyKTsKLQotCQlDREJHKCJvdXRwdXQgcGF0aCAwLCBjaDAgPSAweCV4LCBjaDEgPSAweCV4LCBjaDIgPSAweCV4XG4iLAotCQkJY2gwX3BhZGRyLCBjaDFfcGFkZHIsIGNoMl9wYWRkcik7Ci0JCWlmIChmcmVlX2J1ZikgewotCQkJLyogWSBjaGFubmVsICovCi0JCQl2ZmU0MF9wdXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gwLAotCQkJZnJlZV9idWYtPmNoX3BhZGRyWzBdKTsKLQkJCS8qIENocm9tYSBjaGFubmVsICovCi0JCQl2ZmU0MF9wdXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuY2gxLAotCQkJZnJlZV9idWYtPmNoX3BhZGRyWzFdKTsKLQkJCWlmIChmcmVlX2J1Zi0+bnVtX3BsYW5lcyA+IDIpCi0JCQkJdmZlNDBfcHV0X2NoX2FkZHIocGluZ19wb25nLAotCQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jaDIsCi0JCQkJCWZyZWVfYnVmLT5jaF9wYWRkclsyXSk7Ci0JCX0KLQkJaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9NQUlOIHx8Ci0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0KLQkJCQlWRkVfT1VUUFVUU19NQUlOX0FORF9USFVNQiB8fAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQkJVkZFX09VVFBVVFNfVEhVTUJfQU5EX0pQRUcgfHwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJCVZGRV9PVVRQVVRTX0pQRUdfQU5EX1RIVU1CIHx8Ci0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0KLQkJCQlWRkVfT1VUUFVUU19SQVcgfHwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5saXZlc2hvdF9zdGF0ZSA9PQotCQkJCVZGRV9TVEFURV9TVE9QUEVEKQotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MC5jYXB0dXJlX2NudC0tOwotCi0JCXZmZV9zZW5kX291dG1zZyhheGlfY3RybCwKLQkJCU1TR19JRF9PVVRQVVRfUFJJTUFSWSwgY2gwX3BhZGRyLAotCQkJY2gxX3BhZGRyLCBjaDJfcGFkZHIsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmltYWdlX21vZGUpOwotCi0JCWlmIChheGlfY3RybC0+c2hhcmVfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPT0gVkZFX1NUQVRFX1NUT1BQRUQpCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+bGl2ZXNob3Rfc3RhdGUgPSBWRkVfU1RBVEVfSURMRTsKLQotCX0gZWxzZSB7Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDAuZnJhbWVfZHJvcF9jbnQrKzsKLQkJQ0RCRygicGF0aF9pcnFfMCAtIG5vIGZyZWUgYnVmZmVyIVxuIik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB2ZmU0MF9wcm9jZXNzX291dHB1dF9wYXRoX2lycV8xKAotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCkKLXsKLQl1aW50MzJfdCBwaW5nX3Bvbmc7Ci0JdWludDMyX3QgY2gwX3BhZGRyLCBjaDFfcGFkZHIsIGNoMl9wYWRkcjsKLQkvKiB0aGlzIG11c3QgYmUgc25hcHNob3QgbWFpbiBpbWFnZSBvdXRwdXQuICovCi0JdWludDhfdCBvdXRfYm9vbCA9IDA7Ci0Jc3RydWN0IG1zbV9mcmVlX2J1ZiAqZnJlZV9idWYgPSBOVUxMOwotCi0JZnJlZV9idWYgPSB2ZmU0MF9jaGVja19mcmVlX2J1ZmZlcihWRkVfTVNHX09VVFBVVF9JUlEsCi0JCVZGRV9NU0dfT1VUUFVUX1NFQ09OREFSWSwgYXhpX2N0cmwpOwotCW91dF9ib29sID0gKChheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0KLQkJCQlWRkVfT1VUUFVUU19USFVNQl9BTkRfTUFJTiB8fAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQkJVkZFX09VVFBVVFNfTUFJTl9BTkRfVEhVTUIgfHwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJCVZGRV9PVVRQVVRTX1JBVyB8fAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQkJVkZFX09VVFBVVFNfSlBFR19BTkRfVEhVTUIpICYmCi0JCQkoYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZV9jYXB0dXJlX2NvdW50IDw9IDEpKSB8fAotCQkJCWZyZWVfYnVmOwotCi0JaWYgKG91dF9ib29sKSB7Ci0JCXBpbmdfcG9uZyA9IG1zbV9jYW1lcmFfaW9fcihheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSArCi0JCQlWRkVfQlVTX1BJTkdfUE9OR19TVEFUVVMpOwotCi0JCS8qIFkgY2hhbm5lbCAqLwotCQljaDBfcGFkZHIgPSB2ZmU0MF9nZXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwKTsKLQkJLyogQ2hyb21hIGNoYW5uZWwgKi8KLQkJY2gxX3BhZGRyID0gdmZlNDBfZ2V0X2NoX2FkZHIocGluZ19wb25nLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmNoMSk7Ci0JCWNoMl9wYWRkciA9IHZmZTQwX2dldF9jaF9hZGRyKHBpbmdfcG9uZywKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlLAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDIpOwotCi0JCUNEQkcoIiVzIGNoMCA9IDB4JXgsIGNoMSA9IDB4JXgsIGNoMiA9IDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgY2gwX3BhZGRyLCBjaDFfcGFkZHIsIGNoMl9wYWRkcik7Ci0JCWlmIChmcmVlX2J1ZikgewotCQkJLyogWSBjaGFubmVsICovCi0JCQl2ZmU0MF9wdXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gwLAotCQkJZnJlZV9idWYtPmNoX3BhZGRyWzBdKTsKLQkJCS8qIENocm9tYSBjaGFubmVsICovCi0JCQl2ZmU0MF9wdXRfY2hfYWRkcihwaW5nX3BvbmcsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2gxLAotCQkJZnJlZV9idWYtPmNoX3BhZGRyWzFdKTsKLQkJCWlmIChmcmVlX2J1Zi0+bnVtX3BsYW5lcyA+IDIpCi0JCQkJdmZlNDBfcHV0X2NoX2FkZHIocGluZ19wb25nLAotCQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSwKLQkJCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5jaDIsCi0JCQkJCWZyZWVfYnVmLT5jaF9wYWRkclsyXSk7Ci0JCX0KLQkJaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9NQUlOIHx8Ci0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0KLQkJCQlWRkVfT1VUUFVUU19NQUlOX0FORF9USFVNQiB8fAotCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQkJVkZFX09VVFBVVFNfUkFXIHx8Ci0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0KLQkJCQlWRkVfT1VUUFVUU19KUEVHX0FORF9USFVNQikKLQkJCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuY2FwdHVyZV9jbnQtLTsKLQotCQl2ZmVfc2VuZF9vdXRtc2coYXhpX2N0cmwsCi0JCQlNU0dfSURfT1VUUFVUX1NFQ09OREFSWSwgY2gwX3BhZGRyLAotCQkJY2gxX3BhZGRyLCBjaDJfcGFkZHIsCi0JCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQxLmltYWdlX21vZGUpOwotCi0JfSBlbHNlIHsKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm91dHBhdGgub3V0MS5mcmFtZV9kcm9wX2NudCsrOwotCQlDREJHKCJwYXRoX2lycV8xIC0gbm8gZnJlZSBidWZmZXIhXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9heGlfcHJvY2Vzc19pcnEoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdm9pZCAqYXJnKQotewotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXVpbnQzMl90IGlycXN0YXR1cyA9ICh1aW50MzJfdCkgYXJnOwotCi0JaWYgKCFheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSkgewotCQlwcl9lcnIoIiVzOiBiYXNlIGFkZHJlc3MgdW5tYXBwZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQkvKiBuZXh0LCBjaGVjayBvdXRwdXQgcGF0aCByZWxhdGVkIGludGVycnVwdHMuICovCi0JaWYgKGlycXN0YXR1cyAmCi0JCVZGRV9JUlFfU1RBVFVTMF9JTUFHRV9DT01QT1NJVF9ET05FMF9NQVNLKSB7Ci0JCUNEQkcoIkltYWdlIGNvbXBvc2l0ZSBkb25lIDAgaXJxIG9jY3VyZWQuXG4iKTsKLQkJdmZlNDBfcHJvY2Vzc19vdXRwdXRfcGF0aF9pcnFfMChheGlfY3RybCk7Ci0JfQotCWlmIChpcnFzdGF0dXMgJgotCQlWRkVfSVJRX1NUQVRVUzBfSU1BR0VfQ09NUE9TSVRfRE9ORTFfTUFTSykgewotCQlDREJHKCJJbWFnZSBjb21wb3NpdGUgZG9uZSAxIGlycSBvY2N1cmVkLlxuIik7Ci0JCXZmZTQwX3Byb2Nlc3Nfb3V0cHV0X3BhdGhfaXJxXzEoYXhpX2N0cmwpOwotCX0KLQkvKiBpbiBzbmFwc2hvdCBtb2RlIGlmIGRvbmUgdGhlbiBzZW5kCi0Jc25hcHNob3QgZG9uZSBtZXNzYWdlICovCi0JaWYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJVkZFX09VVFBVVFNfVEhVTUJfQU5EX01BSU4gfHwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQlWRkVfT1VUUFVUU19NQUlOX0FORF9USFVNQiB8fAotCQlheGlfY3RybC0+c2hhcmVfY3RybC0+b3BlcmF0aW9uX21vZGUgPT0KLQkJCVZGRV9PVVRQVVRTX1RIVU1CX0FORF9KUEVHIHx8Ci0JCWF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vcGVyYXRpb25fbW9kZSA9PQotCQkJVkZFX09VVFBVVFNfSlBFR19BTkRfVEhVTUIgfHwKLQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPm9wZXJhdGlvbl9tb2RlID09Ci0JCQlWRkVfT1VUUFVUU19SQVcpIHsKLQkJaWYgKChheGlfY3RybC0+c2hhcmVfY3RybC0+b3V0cGF0aC5vdXQwLmNhcHR1cmVfY250ID09IDApCi0JCQkJJiYgKGF4aV9jdHJsLT5zaGFyZV9jdHJsLT5vdXRwYXRoLm91dDEuCi0JCQkJY2FwdHVyZV9jbnQgPT0gMCkpIHsKLQkJCW1zbV9jYW1lcmFfaW9fd19tYigKLQkJCQlDQU1JRl9DT01NQU5EX1NUT1BfSU1NRURJQVRFTFksCi0JCQkJYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgKwotCQkJCVZGRV9DQU1JRl9DT01NQU5EKTsKLQkJCXZmZTQwX3NlbmRfaXNwX21zZygmYXhpX2N0cmwtPnN1YmRldiwKLQkJCQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlRnJhbWVJZCwKLQkJCQlNU0dfSURfU05BUFNIT1RfRE9ORSk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2F4aV9idWZfY2ZnKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHZvaWQgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IG1zbV9jYW12ZmVfcGFyYW1zICp2ZmVfcGFyYW1zID0KLQkJKHN0cnVjdCBtc21fY2FtdmZlX3BhcmFtcyAqKWFyZzsKLQlzdHJ1Y3QgbXNtX3ZmZV9jZmdfY21kICpjbWQgPSB2ZmVfcGFyYW1zLT52ZmVfY2ZnOwotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXZvaWQgKmRhdGEgPSB2ZmVfcGFyYW1zLT5kYXRhOwotCWludCByYyA9IDA7Ci0KLQlpZiAoIWF4aV9jdHJsLT5zaGFyZV9jdHJsLT52ZmViYXNlKSB7Ci0JCXByX2VycigiJXM6IGJhc2UgYWRkcmVzcyB1bm1hcHBlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlzd2l0Y2ggKGNtZC0+Y21kX3R5cGUpIHsKLQljYXNlIENNRF9DT05GSUdfUElOR19BRERSOiB7Ci0JCWludCBwYXRoID0gKigoaW50ICopY21kLT52YWx1ZSk7Ci0JCXN0cnVjdCB2ZmU0MF9vdXRwdXRfY2ggKm91dGNoID0KLQkJCXZmZTQwX2dldF9jaChwYXRoLCBheGlfY3RybC0+c2hhcmVfY3RybCk7Ci0JCW91dGNoLT5waW5nID0gKigoc3RydWN0IG1zbV9mcmVlX2J1ZiAqKWRhdGEpOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9DT05GSUdfUE9OR19BRERSOiB7Ci0JCWludCBwYXRoID0gKigoaW50ICopY21kLT52YWx1ZSk7Ci0JCXN0cnVjdCB2ZmU0MF9vdXRwdXRfY2ggKm91dGNoID0KLQkJCXZmZTQwX2dldF9jaChwYXRoLCBheGlfY3RybC0+c2hhcmVfY3RybCk7Ci0JCW91dGNoLT5wb25nID0gKigoc3RydWN0IG1zbV9mcmVlX2J1ZiAqKWRhdGEpOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9DT05GSUdfRlJFRV9CVUZfQUREUjogewotCQlpbnQgcGF0aCA9ICooKGludCAqKWNtZC0+dmFsdWUpOwotCQlzdHJ1Y3QgdmZlNDBfb3V0cHV0X2NoICpvdXRjaCA9Ci0JCQl2ZmU0MF9nZXRfY2gocGF0aCwgYXhpX2N0cmwtPnNoYXJlX2N0cmwpOwotCQlvdXRjaC0+ZnJlZV9idWYgPSAqKChzdHJ1Y3QgbXNtX2ZyZWVfYnVmICopZGF0YSk7Ci0JfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzIFVuc3VwcG9ydGVkIEFYSSBCdWYgY29uZmlnICV4ICIsIF9fZnVuY19fLAotCQkJY21kLT5jbWRfdHlwZSk7Ci0JfQotCXJldHVybiByYzsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2NhbV9jbGtfaW5mbyB2ZmU0MF9jbGtfaW5mb1tdID0gewotCXsidmZlX2Nsa19zcmMiLCAyNjY2NzAwMDB9LAotCXsiY2Ftc3NfdmZlX3ZmZV9jbGsiLCAtMX0sCi0JeyJjYW1zc19jc2lfdmZlX2NsayIsIC0xfSwKLQl7InRvcF9jbGsiLCAtMX0sCi0JeyJpZmFjZV9jbGsiLCAtMX0sCi0JeyJidXNfY2xrIiwgLTF9LAotfTsKLQotaW50IG1zbV9heGlfc3ViZGV2X2luaXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQkJCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKm1jdGwpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYXhpX2N0cmxfdCAqYXhpX2N0cmwgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQl2NGwyX3NldF9zdWJkZXZfaG9zdGRhdGEoc2QsIG1jdGwpOwotCXNwaW5fbG9ja19pbml0KCZheGlfY3RybC0+dGFza2xldF9sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmYXhpX2N0cmwtPnRhc2tsZXRfcSk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmF4aV9jdHJsLT5zaGFyZV9jdHJsLT5zZF9ub3RpZnlfbG9jayk7Ci0KLQlheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSA9IGlvcmVtYXAoYXhpX2N0cmwtPnZmZW1lbS0+c3RhcnQsCi0JCXJlc291cmNlX3NpemUoYXhpX2N0cmwtPnZmZW1lbSkpOwotCWlmICghYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlwcl9lcnIoIiVzOiB2ZmUgaW9yZW1hcCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byByZW1hcF9mYWlsZWQ7Ci0JfQotCi0JaWYgKGF4aV9jdHJsLT5mc192ZmUgPT0gTlVMTCkgewotCQlheGlfY3RybC0+ZnNfdmZlID0KLQkJCXJlZ3VsYXRvcl9nZXQoJmF4aV9jdHJsLT5wZGV2LT5kZXYsICJ2ZGQiKTsKLQkJaWYgKElTX0VSUihheGlfY3RybC0+ZnNfdmZlKSkgewotCQkJcHJfZXJyKCIlczogUmVndWxhdG9yIEZTX1ZGRSBnZXQgZmFpbGVkICVsZFxuIiwKLQkJCQlfX2Z1bmNfXywgUFRSX0VSUihheGlfY3RybC0+ZnNfdmZlKSk7Ci0JCQlheGlfY3RybC0+ZnNfdmZlID0gTlVMTDsKLQkJCWdvdG8gZnNfZmFpbGVkOwotCQl9IGVsc2UgaWYgKHJlZ3VsYXRvcl9lbmFibGUoYXhpX2N0cmwtPmZzX3ZmZSkpIHsKLQkJCXByX2VycigiJXM6IFJlZ3VsYXRvciBGU19WRkUgZW5hYmxlIGZhaWxlZFxuIiwKLQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZWd1bGF0b3JfcHV0KGF4aV9jdHJsLT5mc192ZmUpOwotCQkJYXhpX2N0cmwtPmZzX3ZmZSA9IE5VTEw7Ci0JCQlnb3RvIGZzX2ZhaWxlZDsKLQkJfQotCX0KLQlyYyA9IG1zbV9jYW1fY2xrX2VuYWJsZSgmYXhpX2N0cmwtPnBkZXYtPmRldiwgdmZlNDBfY2xrX2luZm8sCi0JCQlheGlfY3RybC0+dmZlX2NsaywgQVJSQVlfU0laRSh2ZmU0MF9jbGtfaW5mbyksIDEpOwotCWlmIChyYyA8IDApCi0JCQlnb3RvIGNsa19lbmFibGVfZmFpbGVkOwotCi0JbXNtX2NhbWlvX2J1c19zY2FsZV9jZmcoCi0JCW1jdGwtPnNkYXRhLT5wZGF0YS0+Y2FtX2J1c19zY2FsZV90YWJsZSwgU19JTklUKTsKLQltc21fY2FtaW9fYnVzX3NjYWxlX2NmZygKLQkJbWN0bC0+c2RhdGEtPnBkYXRhLT5jYW1fYnVzX3NjYWxlX3RhYmxlLCBTX1BSRVZJRVcpOwotCi0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnJlZ2lzdGVyX3RvdGFsID0gVkZFNDBfUkVHSVNURVJfVE9UQUw7Ci0KLQllbmFibGVfaXJxKGF4aV9jdHJsLT52ZmVpcnEtPnN0YXJ0KTsKLQotCXJldHVybiByYzsKLWNsa19lbmFibGVfZmFpbGVkOgotCXJlZ3VsYXRvcl9kaXNhYmxlKGF4aV9jdHJsLT5mc192ZmUpOwotCXJlZ3VsYXRvcl9wdXQoYXhpX2N0cmwtPmZzX3ZmZSk7Ci0JYXhpX2N0cmwtPmZzX3ZmZSA9IE5VTEw7Ci1mc19mYWlsZWQ6Ci0JaW91bm1hcChheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSk7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgPSBOVUxMOwotcmVtYXBfZmFpbGVkOgotCWRpc2FibGVfaXJxKGF4aV9jdHJsLT52ZmVpcnEtPnN0YXJ0KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXZvaWQgbXNtX2F4aV9zdWJkZXZfcmVsZWFzZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQotewotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKnBtY3RsID0KLQkJKHN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKil2NGwyX2dldF9zdWJkZXZfaG9zdGRhdGEoc2QpOwotCXN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCWlmICghYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UpIHsKLQkJcHJfZXJyKCIlczogYmFzZSBhZGRyZXNzIHVubWFwcGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlDREJHKCIlcywgZnJlZV9pcnFcbiIsIF9fZnVuY19fKTsKLQlkaXNhYmxlX2lycShheGlfY3RybC0+dmZlaXJxLT5zdGFydCk7Ci0JdGFza2xldF9raWxsKCZheGlfY3RybC0+dmZlNDBfdGFza2xldCk7Ci0JbXNtX2NhbV9jbGtfZW5hYmxlKCZheGlfY3RybC0+cGRldi0+ZGV2LCB2ZmU0MF9jbGtfaW5mbywKLQkJYXhpX2N0cmwtPnZmZV9jbGssIEFSUkFZX1NJWkUodmZlNDBfY2xrX2luZm8pLCAwKTsKLQotCWlmIChheGlfY3RybC0+ZnNfdmZlKSB7Ci0JCXJlZ3VsYXRvcl9kaXNhYmxlKGF4aV9jdHJsLT5mc192ZmUpOwotCQlyZWd1bGF0b3JfcHV0KGF4aV9jdHJsLT5mc192ZmUpOwotCQlheGlfY3RybC0+ZnNfdmZlID0gTlVMTDsKLQl9Ci0JaW91bm1hcChheGlfY3RybC0+c2hhcmVfY3RybC0+dmZlYmFzZSk7Ci0JYXhpX2N0cmwtPnNoYXJlX2N0cmwtPnZmZWJhc2UgPSBOVUxMOwotCi0JaWYgKGF0b21pY19yZWFkKCZheGlfY3RybC0+c2hhcmVfY3RybC0+aXJxX2NudCkpCi0JCXByX3dhcm5pbmcoIiVzLCBXYXJuaW5nIElSUSBDb3VudCBub3QgWkVST1xuIiwgX19mdW5jX18pOwotCi0JbXNtX2NhbWlvX2J1c19zY2FsZV9jZmcoCi0JCXBtY3RsLT5zZGF0YS0+cGRhdGEtPmNhbV9idXNfc2NhbGVfdGFibGUsIFNfRVhJVCk7Ci19Ci0KLXN0YXRpYyBsb25nIG1zbV9heGlfc3ViZGV2X2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0JaW50IHJjID0gLUVOT0lPQ1RMQ01EOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfTVNNX0FYSV9JTklUOgotCQlyYyA9IG1zbV9heGlfc3ViZGV2X2luaXQoc2QsCi0JCQkoc3RydWN0IG1zbV9jYW1fbWVkaWFfY29udHJvbGxlciAqKWFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgVklESU9DX01TTV9BWElfQ0ZHOgotCQlyYyA9IG1zbV9heGlfY29uZmlnKHNkLCBhcmcpOwotCQlicmVhazsKLQljYXNlIFZJRElPQ19NU01fQVhJX0lSUToKLQkJbXNtX2F4aV9wcm9jZXNzX2lycShzZCwgYXJnKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQljYXNlIFZJRElPQ19NU01fQVhJX0JVRl9DRkc6Ci0JCW1zbV9heGlfYnVmX2NmZyhzZCwgYXJnKTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQljYXNlIFZJRElPQ19NU01fQVhJX1JFTEVBU0U6Ci0JCW1zbV9heGlfc3ViZGV2X3JlbGVhc2Uoc2QpOwotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGNvbW1hbmQgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBtc21fYXhpX3N1YmRldl9jb3JlX29wcyA9IHsKLQkuaW9jdGwgPSBtc21fYXhpX3N1YmRldl9pb2N0bCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG1zbV9heGlfc3ViZGV2X3ZpZGVvX29wcyA9IHsKLQkuc19jcnlzdGFsX2ZyZXEgPSBtc21fYXhpX3N1YmRldl9zX2NyeXN0YWxfZnJlcSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG1zbV9heGlfc3ViZGV2X29wcyA9IHsKLQkuY29yZSA9ICZtc21fYXhpX3N1YmRldl9jb3JlX29wcywKLQkudmlkZW8gPSAmbXNtX2F4aV9zdWJkZXZfdmlkZW9fb3BzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgbXNtX2F4aV9pbnRlcm5hbF9vcHM7Ci0KLXZvaWQgdmZlNDBfYXhpX3Byb2JlKHN0cnVjdCBheGlfY3RybF90ICpheGlfY3RybCkKLXsKLQlzdHJ1Y3QgbXNtX2NhbV9zdWJkZXZfaW5mbyBzZF9pbmZvOwotCXY0bDJfc3ViZGV2X2luaXQoJmF4aV9jdHJsLT5zdWJkZXYsICZtc21fYXhpX3N1YmRldl9vcHMpOwotCWF4aV9jdHJsLT5zdWJkZXYuaW50ZXJuYWxfb3BzID0gJm1zbV9heGlfaW50ZXJuYWxfb3BzOwotCWF4aV9jdHJsLT5zdWJkZXYuZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7Ci0Jc25wcmludGYoYXhpX2N0cmwtPnN1YmRldi5uYW1lLAotCQkJIHNpemVvZihheGlfY3RybC0+c3ViZGV2Lm5hbWUpLCAiYXhpIik7Ci0JdjRsMl9zZXRfc3ViZGV2ZGF0YSgmYXhpX2N0cmwtPnN1YmRldiwgYXhpX2N0cmwpOwotCi0Jc2RfaW5mby5zZGV2X3R5cGUgPSBBWElfREVWOwotCXNkX2luZm8uc2RfaW5kZXggPSBheGlfY3RybC0+cGRldi0+aWQ7Ci0Jc2RfaW5mby5pcnFfbnVtID0gMDsKLQltc21fY2FtX3JlZ2lzdGVyX3N1YmRldl9ub2RlKCZheGlfY3RybC0+c3ViZGV2LCAmc2RfaW5mbyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmU3eC5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlN3guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlYzU0Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmU3eC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzg2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxtYWNoL21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bWFjaC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlICJtc21fdmZlN3guaCIKLSNpbmNsdWRlIDxsaW51eC9wbV9xb3MuaD4KLQotI2RlZmluZSBRRFNQX0NNRFFVRVVFIDI1Ci0KLSNkZWZpbmUgVkZFX1JFU0VUX0NNRCAwCi0jZGVmaW5lIFZGRV9TVEFSVF9DTUQgMQotI2RlZmluZSBWRkVfU1RPUF9DTUQgIDIKLSNkZWZpbmUgVkZFX0ZSQU1FX0FDSyAyMAotI2RlZmluZSBTVEFUU19BRl9BQ0sgIDIxCi0jZGVmaW5lIFNUQVRTX1dFX0FDSyAgMjIKLQotI2RlZmluZSBNU0dfU1RPUF9BQ0sgIDEKLSNkZWZpbmUgTVNHX1NOQVBTSE9UICAyCi0jZGVmaW5lIE1TR19PVVRQVVQxICAgNgotI2RlZmluZSBNU0dfT1VUUFVUMiAgIDcKLSNkZWZpbmUgTVNHX1NUQVRTX0FGICA4Ci0jZGVmaW5lIE1TR19TVEFUU19XRSAgOQotI2RlZmluZSBNU0dfT1VUUFVUX1MgIDEwCi0jZGVmaW5lIE1TR19PVVRQVVRfVCAgMTEKLQotI2RlZmluZSBWRkVfQURTUF9FVkVOVCAweEZGRkYKLSNkZWZpbmUgU05BUFNIT1RfTUFTS19NT0RFIDB4MDAwMDAwMDIKLSNkZWZpbmUgTVNNX0FYSV9RT1NfUFJFVklFVwkxOTIwMDAKLSNkZWZpbmUgTVNNX0FYSV9RT1NfU05BUFNIT1QJMTkyMDAwCi0KLQotc3RhdGljIHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKnFjYW1fbW9kOwotc3RhdGljIHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKnZmZV9tb2Q7Ci1zdGF0aWMgc3RydWN0IG1zbV92ZmVfY2FsbGJhY2sgKnJlc3A7Ci1zdGF0aWMgdm9pZCAqZXh0ZGF0YTsKLXN0YXRpYyB1aW50MzJfdCBleHRsZW47Ci0KLXN0cnVjdCBtdXRleCB2ZmVfbG9jazsKLXN0YXRpYyB2b2lkICAgICAqdmZlX3N5bmNkYXRhOwotc3RhdGljIHVpbnQ4X3QgdmZlc3RvcHBlZDsKLXN0YXRpYyB1aW50MzJfdCB2ZmV0YXNrX3N0YXRlOwotc3RhdGljIGludCBjbnQ7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3RvcF9ldmVudCBzdG9wZXZlbnQ7Ci0KLXVuc2lnbmVkIGxvbmcgcGFkZHJfc195OwotdW5zaWduZWQgbG9uZyBwYWRkcl9zX2NiY3I7Ci11bnNpZ25lZCBsb25nIHBhZGRyX3RfeTsKLXVuc2lnbmVkIGxvbmcgcGFkZHJfdF9jYmNyOwotCi1zdGF0aWMgdm9pZCB2ZmVfN3hfY29udmVydChzdHJ1Y3QgbXNtX3ZmZV9waHlfaW5mbyAqcGluZm8sCi0JCWVudW0gdmZlX3Jlc3BfbXNnIHR5cGUsCi0JCXZvaWQgKmRhdGEsIHZvaWQgKipleHQsIGludDMyX3QgKmVsZW4pCi17Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBWRkVfTVNHX09VVFBVVF9QOiB7Ci0JCXBpbmZvLT5wMF9waHkgPSAoKHN0cnVjdCB2ZmVfZW5kZnJhbWUgKilkYXRhKS0+eV9hZGRyZXNzOwotCQlwaW5mby0+cDFfcGh5ID0KLQkJCSgoc3RydWN0IHZmZV9lbmRmcmFtZSAqKWRhdGEpLT5jYmNyX2FkZHJlc3M7Ci0JCXBpbmZvLT5wMl9waHkgPSBwaW5mby0+cDBfcGh5OwotCQlwaW5mby0+b3V0cHV0X2lkID0gT1VUUFVUX1RZUEVfUDsKLQotCQlDREJHKCJ2ZmVfN3hfY29udmVydCwgeV9waHkgPSAweCV4LCBjYmNyX3BoeSA9IDB4JXhcbiIsCi0JCQkJIHBpbmZvLT5wMF9waHksIHBpbmZvLT5wMV9waHkpOwotCi0JCSgoc3RydWN0IHZmZV9mcmFtZV9leHRyYSAqKWV4dGRhdGEpLT5ibF9ldmVuY29sID0KLQkJKChzdHJ1Y3QgdmZlX2VuZGZyYW1lICopZGF0YSktPmJsYWNrbGV2ZWxldmVuY29sdW1uOwotCi0JCSgoc3RydWN0IHZmZV9mcmFtZV9leHRyYSAqKWV4dGRhdGEpLT5ibF9vZGRjb2wgPQotCQkoKHN0cnVjdCB2ZmVfZW5kZnJhbWUgKilkYXRhKS0+YmxhY2tsZXZlbG9kZGNvbHVtbjsKLQotCQkoKHN0cnVjdCB2ZmVfZnJhbWVfZXh0cmEgKilleHRkYXRhKS0+Z19kZWZfcF9jbnQgPQotCQkoKHN0cnVjdCB2ZmVfZW5kZnJhbWUgKilkYXRhKS0+Z3JlZW5kZWZlY3RwaXhlbGNvdW50OwotCi0JCSgoc3RydWN0IHZmZV9mcmFtZV9leHRyYSAqKWV4dGRhdGEpLT5yX2JfZGVmX3BfY250ID0KLQkJKChzdHJ1Y3QgdmZlX2VuZGZyYW1lICopZGF0YSktPnJlZGJsdWVkZWZlY3RwaXhlbGNvdW50OwotCi0JCSpleHQgID0gZXh0ZGF0YTsKLQkJKmVsZW4gPSBleHRsZW47Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVkZFX01TR19PVVRQVVRfUzogewotCQlwaW5mby0+cDBfcGh5ID0gcGFkZHJfc195OwotCQlwaW5mby0+cDFfcGh5ID0gcGFkZHJfc19jYmNyOwotCQlwaW5mby0+cDJfcGh5ID0gcGluZm8tPnAwX3BoeTsKLQkJcGluZm8tPm91dHB1dF9pZCA9IE9VVFBVVF9UWVBFX1M7Ci0JCUNEQkcoInZmZV83eF9jb252ZXJ0OiB5X3BoeSA9IDB4JXggY2Jjcl9waHkgPSAweCV4XG4iLAotCQkJCQlwaW5mby0+cDBfcGh5LCBwaW5mby0+cDFfcGh5KTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfTVNHX09VVFBVVF9UOiB7Ci0JCXBpbmZvLT5wMF9waHkgPSBwYWRkcl90X3k7Ci0JCXBpbmZvLT5wMV9waHkgPSBwYWRkcl90X2NiY3I7Ci0JCXBpbmZvLT5wMl9waHkgPSBwaW5mby0+cDBfcGh5OwotCQlwaW5mby0+b3V0cHV0X2lkID0gT1VUUFVUX1RZUEVfVDsKLQkJQ0RCRygidmZlXzd4X2NvbnZlcnQ6IHlfcGh5ID0gMHgleCBjYmNyX3BoeSA9IDB4JXhcbiIsCi0JCQkJCXBpbmZvLT5wMF9waHksIHBpbmZvLT5wMV9waHkpOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9NU0dfU1RBVFNfQUY6Ci0JY2FzZSBWRkVfTVNHX1NUQVRTX1dFOgotCQlwaW5mby0+c2J1Zl9waHkgPSAqKHVpbnQzMl90ICopZGF0YTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9IC8qIHN3aXRjaCAqLwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfN3hfb3BzKHZvaWQgKmRyaXZlcl9kYXRhLCB1bnNpZ25lZCBpZCwgc2l6ZV90IGxlbiwKLQkJdm9pZCAoKmdldGV2ZW50KSh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXVpbnQzMl90IGV2dF9idWZbM107Ci0Jc3RydWN0IG1zbV92ZmVfcmVzcCAqcnA7Ci0Jdm9pZCAqZGF0YTsKLQlDREJHKCIlczppZD0lZFxuIiwgX19mdW5jX18sIGlkKTsKLQotCWxlbiA9IChpZCA9PSBWRkVfQURTUF9FVkVOVCkgPyAwIDogbGVuOwotCWRhdGEgPSByZXNwLT52ZmVfYWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fdmZlX3Jlc3ApICsgbGVuLAotCQl2ZmVfc3luY2RhdGEsICBHRlBfQVRPTUlDKTsKLQotCWlmICghZGF0YSkgewotCQlwcl9lcnIoIiVzOiBycDogY2Fubm90IGFsbG9jYXRlIGJ1ZmZlclxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCXJwID0gKHN0cnVjdCBtc21fdmZlX3Jlc3AgKilkYXRhOwotCXJwLT5ldnRfbXNnLmxlbiA9IGxlbjsKLQotCWlmIChpZCA9PSBWRkVfQURTUF9FVkVOVCkgewotCQkvKiBldmVudCAqLwotCQlycC0+dHlwZSAgICAgICAgICAgPSBWRkVfRVZFTlQ7Ci0JCXJwLT5ldnRfbXNnLnR5cGUgICA9IE1TTV9DQU1FUkFfRVZUOwotCQlnZXRldmVudChldnRfYnVmLCBzaXplb2YoZXZ0X2J1ZikpOwotCQlycC0+ZXZ0X21zZy5tc2dfaWQgPSBldnRfYnVmWzBdOwotCUNEQkcoIiVzOmV2ZW50Om1zZ19pZD0lZFxuIiwgX19mdW5jX18sIHJwLT5ldnRfbXNnLm1zZ19pZCk7Ci0JCXJlc3AtPnZmZV9yZXNwKHJwLCBNU01fQ0FNX1FfVkZFX0VWVCwgdmZlX3N5bmNkYXRhLAotCQlHRlBfQVRPTUlDKTsKLQl9IGVsc2UgewotCQkvKiBtZXNzYWdlcyAqLwotCQlycC0+ZXZ0X21zZy50eXBlICAgPSBNU01fQ0FNRVJBX01TRzsKLQkJcnAtPmV2dF9tc2cubXNnX2lkID0gaWQ7Ci0JCXJwLT5ldnRfbXNnLmRhdGEgPSBycCArIDE7Ci0JCWdldGV2ZW50KHJwLT5ldnRfbXNnLmRhdGEsIGxlbik7Ci0JQ0RCRygiJXM6bWVzc2FnZXM6bXNnX2lkPSVkXG4iLCBfX2Z1bmNfXywgcnAtPmV2dF9tc2cubXNnX2lkKTsKLQotCQlzd2l0Y2ggKHJwLT5ldnRfbXNnLm1zZ19pZCkgewotCQljYXNlIE1TR19TTkFQU0hPVDoKLQkJCXVwZGF0ZV9heGlfcW9zKE1TTV9BWElfUU9TX1BSRVZJRVcpOwotCQkJdmZlXzd4X29wcyhkcml2ZXJfZGF0YSwgTVNHX09VVFBVVF9TLCBsZW4sIGdldGV2ZW50KTsKLQkJCXZmZV83eF9vcHMoZHJpdmVyX2RhdGEsIE1TR19PVVRQVVRfVCwgbGVuLCBnZXRldmVudCk7Ci0JCQlycC0+dHlwZSA9IFZGRV9NU0dfU05BUFNIT1Q7Ci0JCQlicmVhazsKLQotCQljYXNlIE1TR19PVVRQVVRfUzoKLQkJCXJwLT50eXBlID0gVkZFX01TR19PVVRQVVRfUzsKLQkJCXZmZV83eF9jb252ZXJ0KCYocnAtPnBoeSksIFZGRV9NU0dfT1VUUFVUX1MsCi0JCQkJcnAtPmV2dF9tc2cuZGF0YSwgJihycC0+ZXh0ZGF0YSksCi0JCQkJJihycC0+ZXh0bGVuKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1TR19PVVRQVVRfVDoKLQkJCXJwLT50eXBlID0gVkZFX01TR19PVVRQVVRfVDsKLQkJCXZmZV83eF9jb252ZXJ0KCYocnAtPnBoeSksIFZGRV9NU0dfT1VUUFVUX1QsCi0JCQkJcnAtPmV2dF9tc2cuZGF0YSwgJihycC0+ZXh0ZGF0YSksCi0JCQkJJihycC0+ZXh0bGVuKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1TR19PVVRQVVQxOgotCQljYXNlIE1TR19PVVRQVVQyOgotCQkJcnAtPnR5cGUgPSBWRkVfTVNHX09VVFBVVF9QOwotCQkJdmZlXzd4X2NvbnZlcnQoJihycC0+cGh5KSwgVkZFX01TR19PVVRQVVRfUCwKLQkJCQlycC0+ZXZ0X21zZy5kYXRhLCAmKHJwLT5leHRkYXRhKSwKLQkJCQkmKHJwLT5leHRsZW4pKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTVNHX1NUQVRTX0FGOgotCQkJcnAtPnR5cGUgPSBWRkVfTVNHX1NUQVRTX0FGOwotCQkJdmZlXzd4X2NvbnZlcnQoJihycC0+cGh5KSwgVkZFX01TR19TVEFUU19BRiwKLQkJCQkJcnAtPmV2dF9tc2cuZGF0YSwgTlVMTCwgTlVMTCk7Ci0JCQlicmVhazsKLQotCQljYXNlIE1TR19TVEFUU19XRToKLQkJCXJwLT50eXBlID0gVkZFX01TR19TVEFUU19XRTsKLQkJCXZmZV83eF9jb252ZXJ0KCYocnAtPnBoeSksIFZGRV9NU0dfU1RBVFNfV0UsCi0JCQkJCXJwLT5ldnRfbXNnLmRhdGEsIE5VTEwsIE5VTEwpOwotCi0JCQlDREJHKCJNU0dfU1RBVFNfV0U6IHBoeSA9IDB4JXhcbiIsIHJwLT5waHkuc2J1Zl9waHkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNU0dfU1RPUF9BQ0s6Ci0JCQlycC0+dHlwZSA9IFZGRV9NU0dfR0VORVJBTDsKLQkJCXN0b3BldmVudC5zdGF0ZSA9IDE7Ci0JCQl3YWtlX3VwKCZzdG9wZXZlbnQud2FpdCk7Ci0JCQlicmVhazsKLQotCi0JCWRlZmF1bHQ6Ci0JCQlycC0+dHlwZSA9IFZGRV9NU0dfR0VORVJBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCXJlc3AtPnZmZV9yZXNwKHJwLCBNU01fQ0FNX1FfVkZFX01TRywgdmZlX3N5bmNkYXRhLCBHRlBfQVRPTUlDKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2Fkc3Bfb3BzIHZmZV83eF9zeW5jID0gewotCS5ldmVudCA9IHZmZV83eF9vcHMsCi19OwotCi1zdGF0aWMgaW50IHZmZV83eF9lbmFibGUoc3RydWN0IGNhbWVyYV9lbmFibGVfY21kICplbmFibGUpCi17Ci0JaW50IHJjID0gLUVGQVVMVDsKLQotCWlmICghc3RyY21wKGVuYWJsZS0+bmFtZSwgIlFDQU1UQVNLIikpCi0JCXJjID0gbXNtX2Fkc3BfZW5hYmxlKHFjYW1fbW9kKTsKLQllbHNlIGlmICghc3RyY21wKGVuYWJsZS0+bmFtZSwgIlZGRVRBU0siKSkgewotCQlyYyA9IG1zbV9hZHNwX2VuYWJsZSh2ZmVfbW9kKTsKLQkJdmZldGFza19zdGF0ZSA9IDE7Ci0JfQotCi0JaWYgKCFjbnQpIHsKLQkJYWRkX2F4aV9xb3MoKTsKLQkJY250Kys7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB2ZmVfN3hfZGlzYWJsZShzdHJ1Y3QgY2FtZXJhX2VuYWJsZV9jbWQgKmVuYWJsZSwKLQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2IF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQotewotCWludCByYyA9IC1FRkFVTFQ7Ci0KLQlpZiAoIXN0cmNtcChlbmFibGUtPm5hbWUsICJRQ0FNVEFTSyIpKQotCQlyYyA9IG1zbV9hZHNwX2Rpc2FibGUocWNhbV9tb2QpOwotCWVsc2UgaWYgKCFzdHJjbXAoZW5hYmxlLT5uYW1lLCAiVkZFVEFTSyIpKSB7Ci0JCXJjID0gbXNtX2Fkc3BfZGlzYWJsZSh2ZmVfbW9kKTsKLQkJdmZldGFza19zdGF0ZSA9IDA7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHZmZV83eF9zdG9wKHZvaWQpCi17Ci0JaW50IHJjID0gMDsKLQl1aW50MzJfdCBzdG9wY21kID0gVkZFX1NUT1BfQ01EOwotCXJjID0gbXNtX2Fkc3Bfd3JpdGUodmZlX21vZCwgUURTUF9DTURRVUVVRSwKLQkJCQkmc3RvcGNtZCwgc2l6ZW9mKHVpbnQzMl90KSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCIlczolZDogZmFpbGVkIHJjID0gJWQgXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXN0b3BldmVudC5zdGF0ZSA9IDA7Ci0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoc3RvcGV2ZW50LndhaXQsCi0JCXN0b3BldmVudC5zdGF0ZSAhPSAwLAotCQltc2Vjc190b19qaWZmaWVzKHN0b3BldmVudC50aW1lb3V0KSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV83eF9yZWxlYXNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JbXV0ZXhfbG9jaygmdmZlX2xvY2spOwotCXZmZV9zeW5jZGF0YSA9IE5VTEw7Ci0JbXV0ZXhfdW5sb2NrKCZ2ZmVfbG9jayk7Ci0KLQlpZiAoIXZmZXN0b3BwZWQpIHsKLQkJQ0RCRygiJXM6JWQ6Q2FsbGluZyB2ZmVfN3hfc3RvcCgpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQl2ZmVfN3hfc3RvcCgpOwotCX0gZWxzZQotCQl2ZmVzdG9wcGVkID0gMDsKLQotCW1zbV9hZHNwX2Rpc2FibGUocWNhbV9tb2QpOwotCW1zbV9hZHNwX2Rpc2FibGUodmZlX21vZCk7Ci0JdmZldGFza19zdGF0ZSA9IDA7Ci0KLQltc21fYWRzcF9wdXQocWNhbV9tb2QpOwotCW1zbV9hZHNwX3B1dCh2ZmVfbW9kKTsKLQotCW1zbV9jYW1pb19kaXNhYmxlKHBkZXYpOwotCi0Ja2ZyZWUoZXh0ZGF0YSk7Ci0JZXh0bGVuID0gMDsKLQotCS8qIFJlbGVhc2UgQVhJICovCi0JcmVsZWFzZV9heGlfcW9zKCk7Ci0JY250ID0gMDsKLX0KLQotc3RhdGljIGludCB2ZmVfN3hfaW5pdChzdHJ1Y3QgbXNtX3ZmZV9jYWxsYmFjayAqcHJlc3AsCi0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCWludCByYyA9IDA7Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdG9wZXZlbnQud2FpdCk7Ci0Jc3RvcGV2ZW50LnRpbWVvdXQgPSAyMDA7Ci0Jc3RvcGV2ZW50LnN0YXRlID0gMDsKLQotCWlmIChwcmVzcCAmJiBwcmVzcC0+dmZlX3Jlc3ApCi0JCXJlc3AgPSBwcmVzcDsKLQllbHNlCi0JCXJldHVybiAtRUZBVUxUOwotCi0JLyogQnJpbmcgdXAgYWxsIHRoZSByZXF1aXJlZCBHUElPcyBhbmQgQ2xvY2tzICovCi0JcmMgPSBtc21fY2FtaW9fZW5hYmxlKGRldik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCW1zbV9jYW1pb19jYW1pZl9wYWRfcmVnX3Jlc2V0KCk7Ci0KLQlleHRsZW4gPSBzaXplb2Yoc3RydWN0IHZmZV9mcmFtZV9leHRyYSk7Ci0KLQlleHRkYXRhID0KLQkJa21hbGxvYyhleHRsZW4sIEdGUF9BVE9NSUMpOwotCWlmICghZXh0ZGF0YSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gaW5pdF9mYWlsOwotCX0KLQotCXJjID0gbXNtX2Fkc3BfZ2V0KCJRQ0FNVEFTSyIsICZxY2FtX21vZCwgJnZmZV83eF9zeW5jLCBOVUxMKTsKLQlpZiAocmMpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZ2V0X3FjYW1fZmFpbDsKLQl9Ci0KLQlyYyA9IG1zbV9hZHNwX2dldCgiVkZFVEFTSyIsICZ2ZmVfbW9kLCAmdmZlXzd4X3N5bmMsIE5VTEwpOwotCWlmIChyYykgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBnZXRfdmZlX2ZhaWw7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWdldF92ZmVfZmFpbDoKLQltc21fYWRzcF9wdXQocWNhbV9tb2QpOwotZ2V0X3FjYW1fZmFpbDoKLQlrZnJlZShleHRkYXRhKTsKLWluaXRfZmFpbDoKLQlleHRsZW4gPSAwOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB2ZmVfN3hfY29uZmlnX2F4aShpbnQgbW9kZSwKLQlzdHJ1Y3QgYXhpZGF0YSAqYWQsIHN0cnVjdCBheGlvdXQgKmFvKQotewotCXN0cnVjdCBtc21fcG1lbV9yZWdpb24gKnJlZ3B0cjsKLQl1bnNpZ25lZCBsb25nICpicHRyOwotCWludCAgICBjbnQ7Ci0KLQlpbnQgcmMgPSAwOwotCi0JaWYgKG1vZGUgPT0gT1VUUFVUXzEgfHwgbW9kZSA9PSBPVVRQVVRfMV9BTkRfMikgewotCQlyZWdwdHIgPSBhZC0+cmVnaW9uOwotCi0JCUNEQkcoImJ1Zm51bTEgPSAlZFxuIiwgYWQtPmJ1Zm51bTEpOwotCQlpZiAobW9kZSA9PSBPVVRQVVRfMV9BTkRfMikgewotCQkJcGFkZHJfdF95ID0gcmVncHRyLT5wYWRkciArIHJlZ3B0ci0+aW5mby5wbGFuYXIwX29mZjsKLQkJCXBhZGRyX3RfY2JjciA9IHJlZ3B0ci0+cGFkZHIgKyByZWdwdHItPmluZm8ucGxhbmFyMV9vZmY7Ci0JCX0KLQotCQlDREJHKCJjb25maWdfYXhpMTogTzEsIHBoeSA9IDB4JWx4LCB5X29mZiA9ICVkLCBjYmNyX29mZiA9JWRcbiIsCi0JCQlyZWdwdHItPnBhZGRyLCByZWdwdHItPmluZm8ucGxhbmFyMF9vZmYsCi0JCQlyZWdwdHItPmluZm8ucGxhbmFyMV9vZmYpOwotCi0JCWJwdHIgPSAmYW8tPm91dHB1dDFidWZmZXIxX3lfcGh5OwotCQlmb3IgKGNudCA9IDA7IGNudCA8IGFkLT5idWZudW0xOyBjbnQrKykgewotCQkJKmJwdHIgPSByZWdwdHItPnBhZGRyICsgcmVncHRyLT5pbmZvLnBsYW5hcjBfb2ZmOwotCQkJYnB0cisrOwotCQkJKmJwdHIgPSByZWdwdHItPnBhZGRyICsgcmVncHRyLT5pbmZvLnBsYW5hcjFfb2ZmOwotCi0JCQlicHRyKys7Ci0JCQlyZWdwdHIrKzsKLQkJfQotCi0JCXJlZ3B0ci0tOwotCQlmb3IgKGNudCA9IDA7IGNudCA8ICg4IC0gYWQtPmJ1Zm51bTEpOyBjbnQrKykgewotCQkJKmJwdHIgPSByZWdwdHItPnBhZGRyICsgcmVncHRyLT5pbmZvLnBsYW5hcjBfb2ZmOwotCQkJYnB0cisrOwotCQkJKmJwdHIgPSByZWdwdHItPnBhZGRyICsgcmVncHRyLT5pbmZvLnBsYW5hcjFfb2ZmOwotCQkJYnB0cisrOwotCQl9Ci0JfSAvKiBpZiBPVVRQVVQxIG9yIEJvdGggKi8KLQotCWlmIChtb2RlID09IE9VVFBVVF8yIHx8IG1vZGUgPT0gT1VUUFVUXzFfQU5EXzIpIHsKLQkJcmVncHRyID0gJihhZC0+cmVnaW9uW2FkLT5idWZudW0xXSk7Ci0KLQkJQ0RCRygiYnVmbnVtMiA9ICVkXG4iLCBhZC0+YnVmbnVtMik7Ci0JCXBhZGRyX3NfeSA9IHJlZ3B0ci0+cGFkZHIgKyAgcmVncHRyLT5pbmZvLnBsYW5hcjBfb2ZmOwotCQlwYWRkcl9zX2NiY3IgPSByZWdwdHItPnBhZGRyICsgIHJlZ3B0ci0+aW5mby5wbGFuYXIxX29mZjsKLQkJQ0RCRygiY29uZmlnX2F4aTI6IE8yLCBwaHkgPSAweCVseCwgeV9vZmYgPSAlZCwgY2Jjcl9vZmYgPSVkXG4iLAotCQkJcmVncHRyLT5wYWRkciwgcmVncHRyLT5pbmZvLnBsYW5hcjBfb2ZmLAotCQkJcmVncHRyLT5pbmZvLnBsYW5hcjFfb2ZmKTsKLQotCQlicHRyID0gJmFvLT5vdXRwdXQyYnVmZmVyMV95X3BoeTsKLQkJZm9yIChjbnQgPSAwOyBjbnQgPCBhZC0+YnVmbnVtMjsgY250KyspIHsKLQkJCSpicHRyID0gcmVncHRyLT5wYWRkciArIHJlZ3B0ci0+aW5mby5wbGFuYXIwX29mZjsKLQkJCWJwdHIrKzsKLQkJCSpicHRyID0gcmVncHRyLT5wYWRkciArIHJlZ3B0ci0+aW5mby5wbGFuYXIxX29mZjsKLQotCQkJYnB0cisrOwotCQkJcmVncHRyKys7Ci0JCX0KLQotCQlyZWdwdHItLTsKLQkJZm9yIChjbnQgPSAwOyBjbnQgPCAoOCAtIGFkLT5idWZudW0yKTsgY250KyspIHsKLQkJCSpicHRyID0gcmVncHRyLT5wYWRkciArIHJlZ3B0ci0+aW5mby5wbGFuYXIwX29mZjsKLQkJCWJwdHIrKzsKLQkJCSpicHRyID0gcmVncHRyLT5wYWRkciArIHJlZ3B0ci0+aW5mby5wbGFuYXIxX29mZjsKLQkJCWJwdHIrKzsKLQkJfQotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB2ZmVfN3hfY29uZmlnKHN0cnVjdCBtc21fdmZlX2NmZ19jbWQgKmNtZCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uICpyZWdwdHI7Ci0JdW5zaWduZWQgY2hhciBidWZbMjU2XTsKLQotCXN0cnVjdCB2ZmVfc3RhdHNfYWNrIHNhY2s7Ci0Jc3RydWN0IGF4aWRhdGEgKmF4aWQ7Ci0JdWludDMyX3QgaSwgb3BfbW9kZTsKLQl1aW50MzJfdCAqX21vZGU7Ci0KLQlzdHJ1Y3QgdmZlX3N0YXRzX3dlX2NmZyAqc2NmZyA9IE5VTEw7Ci0Jc3RydWN0IHZmZV9zdGF0c19hZl9jZmcgKnNmY2ZnID0gTlVMTDsKLQotCXN0cnVjdCBheGlvdXQgKmF4aW8gPSBOVUxMOwotCXZvaWQgICAqY21kX2RhdGEgPSBOVUxMOwotCXZvaWQgICAqY21kX2RhdGFfYWxsb2MgPSBOVUxMOwotCWxvbmcgcmMgPSAwOwotCXN0cnVjdCBtc21fdmZlX2NvbW1hbmRfN2sgKnZmZWNtZDsKLQotCXZmZWNtZCA9Ci0JCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX3ZmZV9jb21tYW5kXzdrKSwKLQkJCQlHRlBfQVRPTUlDKTsKLQlpZiAoIXZmZWNtZCkgewotCQlwcl9lcnIoInZmZWNtZCBhbGxvYyBmYWlsZWQhXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JaWYgKGNtZC0+Y21kX3R5cGUgIT0gQ01EX0ZSQU1FX0JVRl9SRUxFQVNFICYmCi0JICAgIGNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX0JVRl9SRUxFQVNFICYmCi0JICAgIGNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX0FGX0JVRl9SRUxFQVNFKSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcih2ZmVjbWQsCi0JCQkJKHZvaWQgX191c2VyICopKGNtZC0+dmFsdWUpLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX3ZmZV9jb21tYW5kXzdrKSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQl9Ci0KLQlzd2l0Y2ggKGNtZC0+Y21kX3R5cGUpIHsKLQljYXNlIENNRF9TVEFUU19BRUNfQVdCX0VOQUJMRToKLQljYXNlIENNRF9TVEFUU19BWElfQ0ZHOiB7Ci0JCWF4aWQgPSBkYXRhOwotCQlpZiAoIWF4aWQpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQotCQlzY2ZnID0KLQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZmVfc3RhdHNfd2VfY2ZnKSwKLQkJCQlHRlBfQVRPTUlDKTsKLQkJaWYgKCFzY2ZnKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGNvbmZpZ19mYWlsdXJlOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKHNjZmcsCi0JCQkJCSh2b2lkIF9fdXNlciAqKSh2ZmVjbWQtPnZhbHVlKSwKLQkJCQkJdmZlY21kLT5sZW5ndGgpKSB7Ci0KLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQotCQlDREJHKCJTVEFUU19FTkFCTEU6IGJ1Zm51bSA9ICVkLCBlbmFibGluZyA9ICVkXG4iLAotCQkJYXhpZC0+YnVmbnVtMSwgc2NmZy0+d2JfZXhwc3RhdHNlbmFibGUpOwotCi0JCWlmIChheGlkLT5idWZudW0xID4gMCkgewotCQkJcmVncHRyID0gYXhpZC0+cmVnaW9uOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgYXhpZC0+YnVmbnVtMTsgaSsrKSB7Ci0KLQkJCQlDREJHKCJTVEFUU19FTkFCTEUsIHBoeSA9IDB4JWx4XG4iLAotCQkJCQlyZWdwdHItPnBhZGRyKTsKLQotCQkJCXNjZmctPndiX2V4cHN0YXRvdXRwdXRidWZmZXJbaV0gPQotCQkJCQkodm9pZCAqKXJlZ3B0ci0+cGFkZHI7Ci0JCQkJcmVncHRyKys7Ci0JCQl9Ci0KLQkJCWNtZF9kYXRhID0gc2NmZzsKLQotCQl9IGVsc2UgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9TVEFUU19BRl9FTkFCTEU6Ci0JY2FzZSBDTURfU1RBVFNfQUZfQVhJX0NGRzogewotCQlheGlkID0gZGF0YTsKLQkJaWYgKCFheGlkKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNvbmZpZ19mYWlsdXJlOwotCQl9Ci0KLQkJc2ZjZmcgPQotCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHZmZV9zdGF0c19hZl9jZmcpLAotCQkJCUdGUF9BVE9NSUMpOwotCi0JCWlmICghc2ZjZmcpIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoc2ZjZmcsCi0JCQkJCSh2b2lkIF9fdXNlciAqKSh2ZmVjbWQtPnZhbHVlKSwKLQkJCQkJdmZlY21kLT5sZW5ndGgpKSB7Ci0KLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQotCQlDREJHKCJBRl9FTkFCTEU6IGJ1Zm51bSA9ICVkLCBlbmFibGluZyA9ICVkXG4iLAotCQkJYXhpZC0+YnVmbnVtMSwgc2ZjZmctPmFmX2VuYWJsZSk7Ci0KLQkJaWYgKGF4aWQtPmJ1Zm51bTEgPiAwKSB7Ci0JCQlyZWdwdHIgPSAmYXhpZC0+cmVnaW9uWzBdOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgYXhpZC0+YnVmbnVtMTsgaSsrKSB7Ci0KLQkJCQlDREJHKCJTVEFUU19FTkFCTEUsIHBoeSA9IDB4JWx4XG4iLAotCQkJCQlyZWdwdHItPnBhZGRyKTsKLQotCQkJCXNmY2ZnLT5hZl9vdXRidWZbaV0gPQotCQkJCQkodm9pZCAqKXJlZ3B0ci0+cGFkZHI7Ci0KLQkJCQlyZWdwdHIrKzsKLQkJCX0KLQotCQkJY21kX2RhdGEgPSBzZmNmZzsKLQotCQl9IGVsc2UgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9GUkFNRV9CVUZfUkVMRUFTRTogewotCQlzdHJ1Y3QgbXNtX2ZyYW1lICpiOwotCQl1bnNpZ25lZCBsb25nIHA7Ci0JCXN0cnVjdCB2ZmVfb3V0cHV0YWNrIGZhY2s7Ci0JCWlmICghZGF0YSkgIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQotCQliID0gKHN0cnVjdCBtc21fZnJhbWUgKikoY21kLT52YWx1ZSk7Ci0JCXAgPSAqKHVuc2lnbmVkIGxvbmcgKilkYXRhOwotCi0JCWZhY2suaGVhZGVyID0gVkZFX0ZSQU1FX0FDSzsKLQotCQlmYWNrLm91dHB1dDJuZXd5YnVmZmVyYWRkcmVzcyA9Ci0JCQkodm9pZCAqKShwICsgYi0+cGxhbmFyMF9vZmYpOwotCi0JCWZhY2sub3V0cHV0Mm5ld2NiY3JidWZmZXJhZGRyZXNzID0KLQkJCSh2b2lkICopKHAgKyBiLT5wbGFuYXIxX29mZik7Ci0KLQkJdmZlY21kLT5xdWV1ZSA9IFFEU1BfQ01EUVVFVUU7Ci0JCXZmZWNtZC0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCB2ZmVfb3V0cHV0YWNrKTsKLQkJY21kX2RhdGEgPSAmZmFjazsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBDTURfU05BUF9CVUZfUkVMRUFTRToKLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9TVEFUU19CVUZfUkVMRUFTRTogewotCQlDREJHKCJ2ZmVfN3hfY29uZmlnOiBDTURfU1RBVFNfQlVGX1JFTEVBU0VcbiIpOwotCQlpZiAoIWRhdGEpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQotCQlzYWNrLmhlYWRlciA9IFNUQVRTX1dFX0FDSzsKLQkJc2Fjay5idWZhZGRyID0gKHZvaWQgKikqKHVpbnQzMl90ICopZGF0YTsKLQotCQl2ZmVjbWQtPnF1ZXVlICA9IFFEU1BfQ01EUVVFVUU7Ci0JCXZmZWNtZC0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCB2ZmVfc3RhdHNfYWNrKTsKLQkJY21kX2RhdGEgPSAmc2FjazsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBDTURfU1RBVFNfQUZfQlVGX1JFTEVBU0U6IHsKLQkJQ0RCRygidmZlXzd4X2NvbmZpZzogQ01EX1NUQVRTX0FGX0JVRl9SRUxFQVNFXG4iKTsKLQkJaWYgKCFkYXRhKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNvbmZpZ19mYWlsdXJlOwotCQl9Ci0KLQkJc2Fjay5oZWFkZXIgPSBTVEFUU19BRl9BQ0s7Ci0JCXNhY2suYnVmYWRkciA9ICh2b2lkICopKih1aW50MzJfdCAqKWRhdGE7Ci0KLQkJdmZlY21kLT5xdWV1ZSAgPSBRRFNQX0NNRFFVRVVFOwotCQl2ZmVjbWQtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgdmZlX3N0YXRzX2Fjayk7Ci0JCWNtZF9kYXRhID0gJnNhY2s7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgQ01EX0dFTkVSQUw6Ci0JY2FzZSBDTURfU1RBVFNfRElTQUJMRTogewotCQlpZiAodmZlY21kLT5sZW5ndGggPiAyNTYpIHsKLQkJCWNtZF9kYXRhX2FsbG9jID0KLQkJCWNtZF9kYXRhID0ga21hbGxvYyh2ZmVjbWQtPmxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoIWNtZF9kYXRhKSB7Ci0JCQkJcmMgPSAtRU5PTUVNOwotCQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJY21kX2RhdGEgPSBidWY7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNtZF9kYXRhLAotCQkJCQkodm9pZCBfX3VzZXIgKikodmZlY21kLT52YWx1ZSksCi0JCQkJCXZmZWNtZC0+bGVuZ3RoKSkgewotCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNvbmZpZ19kb25lOwotCQl9Ci0KLQkJaWYgKHZmZWNtZC0+cXVldWUgPT0gUURTUF9DTURRVUVVRSkgewotCQkJc3dpdGNoICgqKHVpbnQzMl90ICopY21kX2RhdGEpIHsKLQkJCWNhc2UgVkZFX1JFU0VUX0NNRDoKLQkJCQltc21fY2FtaW9fdmZlX2Jsa19yZXNldCgpOwotCQkJCXZmZXN0b3BwZWQgPSAwOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFZGRV9TVEFSVF9DTUQ6Ci0JCQkJX21vZGUgPSAodWludDMyX3QgKiljbWRfZGF0YTsKLQkJCQlvcF9tb2RlID0gKigrK19tb2RlKTsKLQkJCQlpZiAob3BfbW9kZSAmIFNOQVBTSE9UX01BU0tfTU9ERSkgewotCQkJCQkvKiByZXF1ZXN0IEFYSSBidXMgZm9yIHNuYXBzaG90ICovCi0JCQkJCWlmICh1cGRhdGVfYXhpX3FvcyhNU01fQVhJX1FPU19TTkFQU0hPVCkKLQkJCQkJCTwgMCkgewotCQkJCQkJcmMgPSAtRUZBVUxUOwotCQkJCQkJZ290byBjb25maWdfZmFpbHVyZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIHJlcXVlc3QgQVhJIGJ1cyBmb3Igc25hcHNob3QgKi8KLQkJCQkJaWYgKHVwZGF0ZV9heGlfcW9zKE1TTV9BWElfUU9TX1BSRVZJRVcpCi0JCQkJCQk8IDApIHsKLQkJCQkJCXJjID0gLUVGQVVMVDsKLQkJCQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbXNtX2NhbWlvX2NhbWlmX3BhZF9yZWdfcmVzZXRfMigpOwotCQkJCXZmZXN0b3BwZWQgPSAwOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFZGRV9TVE9QX0NNRDoKLQkJCQl2ZmVzdG9wcGVkID0gMTsKLQkJCQlnb3RvIGNvbmZpZ19zZW5kOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQl9IC8qIFFEU1BfQ01EUVVFVUUgKi8KLQl9Ci0JCWJyZWFrOwotCWNhc2UgQ01EX0FYSV9DRkdfUFJFVklFVzoKLQljYXNlIENNRF9SQVdfUElDVF9BWElfQ0ZHOiB7Ci0JCWF4aWQgPSBkYXRhOwotCQlpZiAoIWF4aWQpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQotCQlheGlvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF4aW91dCksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWF4aW8pIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoYXhpbywgKHZvaWQgX191c2VyICopKHZmZWNtZC0+dmFsdWUpLAotCQkJCQlzaXplb2Yoc3RydWN0IGF4aW91dCkpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNvbmZpZ19kb25lOwotCQl9Ci0KLQkJdmZlXzd4X2NvbmZpZ19heGkoT1VUUFVUXzIsIGF4aWQsIGF4aW8pOwotCQljbWRfZGF0YSA9IGF4aW87Ci0JfQotCQlicmVhazsKLQotCWNhc2UgQ01EX0FYSV9DRkdfU05BUDogewotCQlheGlkID0gZGF0YTsKLQkJaWYgKCFheGlkKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNvbmZpZ19mYWlsdXJlOwotCQl9Ci0KLQkJYXhpbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBheGlvdXQpLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFheGlvKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGNvbmZpZ19mYWlsdXJlOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQtPnZhbHVlKSwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBheGlvdXQpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCi0JCXZmZV83eF9jb25maWdfYXhpKE9VVFBVVF8xX0FORF8yLCBheGlkLCBheGlvKTsKLQotCQljbWRfZGF0YSA9IGF4aW87Ci0JfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0gLyogc3dpdGNoICovCi0KLQlpZiAodmZlc3RvcHBlZCkKLQkJZ290byBjb25maWdfZG9uZTsKLQotY29uZmlnX3NlbmQ6Ci0JQ0RCRygic2VuZCBhZHNwIGNvbW1hbmQgPSAlZFxuIiwgKih1aW50MzJfdCAqKWNtZF9kYXRhKTsKLQlpZiAodmZldGFza19zdGF0ZSkKLQkJcmMgPSBtc21fYWRzcF93cml0ZSh2ZmVfbW9kLCB2ZmVjbWQtPnF1ZXVlLAotCQkJCQljbWRfZGF0YSwgdmZlY21kLT5sZW5ndGgpOwotY29uZmlnX2RvbmU6Ci0JaWYgKGNtZF9kYXRhX2FsbG9jICE9IE5VTEwpCi0JCWtmcmVlKGNtZF9kYXRhX2FsbG9jKTsKLQotY29uZmlnX2ZhaWx1cmU6Ci0Ja2ZyZWUoc2NmZyk7Ci0Ja2ZyZWUoYXhpbyk7Ci0Ja2ZyZWUodmZlY21kKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXZvaWQgbXNtX2NhbXZmZV9mbl9pbml0KHN0cnVjdCBtc21fY2FtdmZlX2ZuICpmcHRyLCB2b2lkICpkYXRhKQotewotCW11dGV4X2luaXQoJnZmZV9sb2NrKTsKLQlmcHRyLT52ZmVfaW5pdCAgICA9IHZmZV83eF9pbml0OwotCWZwdHItPnZmZV9lbmFibGUgID0gdmZlXzd4X2VuYWJsZTsKLQlmcHRyLT52ZmVfY29uZmlnICA9IHZmZV83eF9jb25maWc7Ci0JZnB0ci0+dmZlX2Rpc2FibGUgPSB2ZmVfN3hfZGlzYWJsZTsKLQlmcHRyLT52ZmVfcmVsZWFzZSA9IHZmZV83eF9yZWxlYXNlOwotCXZmZV9zeW5jZGF0YSA9IGRhdGE7Ci19Ci0KLXZvaWQgbXNtX2NhbXZwZV9mbl9pbml0KHN0cnVjdCBtc21fY2FtdnBlX2ZuICpmcHRyLCB2b2lkICpkYXRhKQotewotCWZwdHItPnZwZV9yZWcJCT0gTlVMTDsKLQlmcHRyLT5zZW5kX2ZyYW1lX3RvX3ZwZQk9IE5VTEw7Ci0JZnB0ci0+dnBlX2NvbmZpZwk9IE5VTEw7Ci0JZnB0ci0+dnBlX2NmZ191cGRhdGUJPSBOVUxMOwotCWZwdHItPmRpcwkJPSBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlN3guaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTd4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NGJmZWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlN3guaAorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX19NU01fVkZFN1hfSF9fCi0jZGVmaW5lIF9fTVNNX1ZGRTdYX0hfXwotI2luY2x1ZGUgPG1lZGlhL21zbV9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotCi1zdHJ1Y3QgdmZlX2ZyYW1lX2V4dHJhIHsKLQl1aW50MzJfdCAgYmxfZXZlbmNvbDsKLQl1aW50MzJfdCAgYmxfb2RkY29sOwotCXVpbnQxNl90ICBnX2RlZl9wX2NudDsKLQl1aW50MTZfdCAgcl9iX2RlZl9wX2NudDsKLX07Ci0KLXN0cnVjdCB2ZmVfZW5kZnJhbWUgewotCXVpbnQzMl90ICAgICAgeV9hZGRyZXNzOwotCXVpbnQzMl90ICAgICAgY2Jjcl9hZGRyZXNzOwotCi0JdW5zaWduZWQgaW50ICBibGFja2xldmVsZXZlbmNvbHVtbjoyMzsKLQl1aW50MTZfdCAgICAgIHJlc2VydmVkMTo5OwotCXVuc2lnbmVkIGludCAgYmxhY2tsZXZlbG9kZGNvbHVtbjoyMzsKLQl1aW50MTZfdCAgICAgIHJlc2VydmVkMjo5OwotCi0JdWludDE2X3QgICAgICBncmVlbmRlZmVjdHBpeGVsY291bnQ6ODsKLQl1aW50MTZfdCAgICAgIHJlc2VydmVkMzo4OwotCXVpbnQxNl90ICAgICAgcmVkYmx1ZWRlZmVjdHBpeGVsY291bnQ6ODsKLQl1aW50MTZfdCAgICAgIHJlc2VydmVkNDo4OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IHZmZV9vdXRwdXRhY2sgewotCXVpbnQzMl90ICBoZWFkZXI7Ci0Jdm9pZCAgICAgICpvdXRwdXQybmV3eWJ1ZmZlcmFkZHJlc3M7Ci0Jdm9pZCAgICAgICpvdXRwdXQybmV3Y2JjcmJ1ZmZlcmFkZHJlc3M7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1zdHJ1Y3QgdmZlX3N0YXRzX2FjayB7Ci0JdWludDMyX3QgaGVhZGVyOwotCS8qIE1VU1QgQkUgNjQgYml0IEFMSUdORUQgKi8KLQl2b2lkICAgICAqYnVmYWRkcjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLS8qIEFYSSBPdXRwdXQgQ29uZmlnIENvbW1hbmQgc2VudCB0byBEU1AgKi8KLXN0cnVjdCBheGlvdXQgewotCXVpbnQzMl90ICAgICAgICAgICAgY21kaGVhZGVyOjMyOwotCWludCAJCSAgICBvdXRwdXRtb2RlOjM7Ci0JdWludDhfdCAgICAgICAgICAgICBmb3JtYXQ6MjsKLQl1aW50MzJfdCAgICAgICAgICAgIC8qIHJlc2VydmVkICovIDogMjc7Ci0KLQkvKiBBWEkgT3V0cHV0IDEgWSBDb25maWd1cmF0aW9uLCBQYXJ0IDEgKi8KLQl1aW50MzJfdCAgICAgICAgICAgIG91dDF5aW1hZ2VoZWlnaHQ6MTI7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3QgICAgICAgICAgICBvdXQxeWltYWdld2lkdGhpbjY0Yml0d29yZHM6MTA7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0KLQkvKiBBWEkgT3V0cHV0IDEgWSBDb25maWd1cmF0aW9uLCBQYXJ0IDIgKi8KLQl1aW50OF90ICAgICAgICAgICAgIG91dDF5YnVyc3RsZW46MjsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDF5bnVtcm93czoxMjsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDF5cm93aW5jaW42NGJpdGluY3M6MTI7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0KLQkvKiBBWEkgT3V0cHV0IDEgQ2JDciBDb25maWd1cmF0aW9uLCBQYXJ0IDEgKi8KLQl1aW50MzJfdCAgICAgICAgICAgIG91dDFjYmNyaW1hZ2VoZWlnaHQ6MTI7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3QgICAgICAgICAgICBvdXQxY2JjcmltYWdld2lkdGhpbjY0Yml0d29yZHM6MTA7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0KLQkvKiBBWEkgT3V0cHV0IDEgQ2JDciBDb25maWd1cmF0aW9uLCBQYXJ0IDIgKi8KLQl1aW50OF90ICAgICAgICAgICAgIG91dDFjYmNyYnVyc3RsZW46MjsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDFjYmNybnVtcm93czoxMjsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDFjYmNycm93aW5jaW42NGJpdGluY3M6MTI7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0KLQkvKiBBWEkgT3V0cHV0IDIgWSBDb25maWd1cmF0aW9uLCBQYXJ0IDEgKi8KLQl1aW50MzJfdCAgICAgICAgICAgIG91dDJ5aW1hZ2VoZWlnaHQ6MTI7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3QgICAgICAgICAgICBvdXQyeWltYWdld2lkdGhpbjY0Yml0d29yZHM6MTA7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0KLQkvKiBBWEkgT3V0cHV0IDIgWSBDb25maWd1cmF0aW9uLCBQYXJ0IDIgKi8KLQl1aW50OF90ICAgICAgICAgICAgIG91dDJ5YnVyc3RsZW46MjsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDJ5bnVtcm93czoxMjsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDJ5cm93aW5jaW42NGJpdGluY3M6MTI7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0KLQkvKiBBWEkgT3V0cHV0IDIgQ2JDciBDb25maWd1cmF0aW9uLCBQYXJ0IDEgKi8KLQl1aW50MzJfdCAgICAgICAgICAgIG91dDJjYmNyaW1hZ2VoZWlnaHQ6MTI7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3QgICAgICAgICAgICBvdXQyY2JjcmltYWdld2lkdGVpbjY0Yml0d29yZHM6MTA7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0KLQkvKiBBWEkgT3V0cHV0IDIgQ2JDciBDb25maWd1cmF0aW9uLCBQYXJ0IDIgKi8KLQl1aW50OF90ICAgICAgICAgICAgIG91dDJjYmNyYnVyc3RsZW46MjsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDJjYmNybnVtcm93czoxMjsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDJjYmNycm93aW5jaW42NGJpdGluY3M6MTI7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0KLQkvKiBBZGRyZXNzIGNvbmZpZ3VyYXRpb246Ci0JICogb3V0cHV0MSBwaGlzeWNhbCBhZGRyZXNzICovCi0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXIxX3lfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQxYnVmZmVyMV9jYmNyX3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MWJ1ZmZlcjJfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXIyX2NiY3JfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQxYnVmZmVyM195X3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MWJ1ZmZlcjNfY2Jjcl9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXI0X3lfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQxYnVmZmVyNF9jYmNyX3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MWJ1ZmZlcjVfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXI1X2NiY3JfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQxYnVmZmVyNl95X3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MWJ1ZmZlcjZfY2Jjcl9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXI3X3lfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQxYnVmZmVyN19jYmNyX3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MWJ1ZmZlcjhfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXI4X2NiY3JfcGh5OwotCi0JLyogb3V0cHV0MiBwaGlzeWNhbCBhZGRyZXNzICovCi0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXIxX3lfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQyYnVmZmVyMV9jYmNyX3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MmJ1ZmZlcjJfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXIyX2NiY3JfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQyYnVmZmVyM195X3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MmJ1ZmZlcjNfY2Jjcl9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXI0X3lfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQyYnVmZmVyNF9jYmNyX3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MmJ1ZmZlcjVfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXI1X2NiY3JfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQyYnVmZmVyNl95X3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MmJ1ZmZlcjZfY2Jjcl9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXI3X3lfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQyYnVmZmVyN19jYmNyX3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MmJ1ZmZlcjhfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXI4X2NiY3JfcGh5OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IHZmZV9zdGF0c193ZV9jZmcgewotCXVpbnQzMl90ICAgICAgIGhlYWRlcjsKLQotCS8qIFdoaXRlIEJhbGFuY2UvRXhwb3N1cmUgU3RhdGlzdGljIFNlbGVjdGlvbiAqLwotCXVpbnQ4X3QgICAgICAgIHdiX2V4cHN0YXRzZW5hYmxlOjE7Ci0JdWludDhfdCAgICAgICAgd2JfZXhwc3RhdGJ1c3ByaW9yaXR5c2VsZWN0aW9uOjE7Ci0JdW5zaWduZWQgaW50ICAgd2JfZXhwc3RhdGJ1c3ByaW9yaXR5dmFsdWU6NDsKLQl1bnNpZ25lZCBpbnQgICAvKiByZXNlcnZlZCAqLyA6IDI2OwotCi0JLyogV2hpdGUgQmFsYW5jZS9FeHBvc3VyZSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiwgUGFydCAxICovCi0JdWludDhfdCAgICAgICAgZXhwb3N1cmVzdGF0cmVnaW9uczoxOwotCXVpbnQ4X3QgICAgICAgIGV4cG9zdXJlc3RhdHN1YnJlZ2lvbnM6MTsKLQl1bnNpZ25lZCBpbnQgICAvKiByZXNlcnZlZCAqLyA6IDE0OwotCi0JdW5zaWduZWQgaW50ICAgd2hpdGViYWxhbmNlbWluaW11bXk6ODsKLQl1bnNpZ25lZCBpbnQgICB3aGl0ZWJhbGFuY2VtYXhpbXVteTo4OwotCi0JLyogV2hpdGUgQmFsYW5jZS9FeHBvc3VyZSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiwgUGFydCAyICovCi0JdWludDhfdCB3Yl9leHBzdGF0c2xvcGVvZm5ldXRyYWxyZWdpb25saW5lWwotCQlOVU1fV0JfRVhQX05FVVRSQUxfUkVHSU9OX0xJTkVTXTsKLQotCS8qIFdoaXRlIEJhbGFuY2UvRXhwb3N1cmUgU3RhdGlzdGljIENvbmZpZ3VyYXRpb24sIFBhcnQgMyAqLwotCXVuc2lnbmVkIGludCAgIHdiX2V4cHN0YXRjcmludGVyY2VwdG9mbmV1dHJhbHJlZ2lvbmxpbmUyOjEyOwotCXVuc2lnbmVkIGludCAgIC8qIHJlc2VydmVkICovIDogNDsKLQl1bnNpZ25lZCBpbnQgICB3Yl9leHBzdGF0Y2JpbnRlcmNlcHRvZm5ldXRyYWxyZWdpbm5saW5lMToxMjsKLQl1bnNpZ25lZCBpbnQgICAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCi0JLyogV2hpdGUgQmFsYW5jZS9FeHBvc3VyZSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiwgUGFydCA0ICovCi0JdW5zaWduZWQgaW50ICAgd2JfZXhwc3RhdGNyaW50ZXJjZXB0b2ZuZXV0cmFscmVnaW9ubGluZTQ6MTI7Ci0JdW5zaWduZWQgaW50ICAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCXVuc2lnbmVkIGludCAgIHdiX2V4cHN0YXRjYmludGVyY2VwdG9mbmV1dHJhbHJlZ2lvbmxpbmUzOjEyOwotCXVuc2lnbmVkIGludCAgIC8qIHJlc2VydmVkICovIDogNDsKLQotCS8qIFdoaXRlIEJhbGFuY2UvRXhwb3N1cmUgU3RhdGlzdGljIE91dHB1dCBCdWZmZXIgSGVhZGVyICovCi0JdW5zaWduZWQgaW50ICAgd2JfZXhwbWV0cmljaGVhZGVycGF0dGVybjo4OwotCXVuc2lnbmVkIGludCAgIC8qIHJlc2VydmVkICovIDogMjQ7Ci0KLQkvKiBXaGl0ZSBCYWxhbmNlL0V4cG9zdXJlIFN0YXRpc3RpYyBPdXRwdXQgQnVmZmVycy1NVVNUCi0JKiBCRSA2NCBiaXQgQUxJR05FRCAqLwotCXZvaWQgICp3Yl9leHBzdGF0b3V0cHV0YnVmZmVyW05VTV9XQl9FWFBfU1RBVF9PVVRQVVRfQlVGRkVSU107Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1zdHJ1Y3QgdmZlX3N0YXRzX2FmX2NmZyB7Ci0JdWludDMyX3QgaGVhZGVyOwotCi0JLyogQXV0b2ZvY3VzIFN0YXRpc3RpYyBTZWxlY3Rpb24gKi8KLQl1aW50OF90ICAgICAgIGFmX2VuYWJsZToxOwotCXVpbnQ4X3QgICAgICAgYWZfYnVzcHJpb3JpdHlzZWw6MTsKLQl1bnNpZ25lZCBpbnQgIGFmX2J1c3ByaW9yaXR5dmFsOjQ7Ci0JdW5zaWduZWQgaW50ICAvKiByZXNlcnZlZCAqLyA6IDI2OwotCi0JLyogQXV0b2ZvY3VzIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uLCBQYXJ0IDEgKi8KLQl1bnNpZ25lZCBpbnQgIGFmX3NpbmdsZXdpbnZvZmZzZXQ6MTI7Ci0JdW5zaWduZWQgaW50ICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdW5zaWduZWQgaW50ICBhZl9zaW5nbGV3aW5ob2Zmc2V0OjEyOwotCXVuc2lnbmVkIGludCAgLyogcmVzZXJ2ZWQgKi8gOiAzOwotCXVpbnQ4X3QgICAgICAgYWZfd2lubW9kZToxOwotCi0JLyogQXV0b2ZvY3VzIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uLCBQYXJ0IDIgKi8KLQl1bnNpZ25lZCBpbnQgIGFmX3NpbmdnbGV3aW52aDoxMTsKLQl1bnNpZ25lZCBpbnQgIC8qIHJlc2VydmVkICovIDogNTsKLQl1bnNpZ25lZCBpbnQgIGFmX3NpbmdsZXdpbmh3OjExOwotCXVuc2lnbmVkIGludCAgLyogcmVzZXJ2ZWQgKi8gOiA1OwotCi0JLyogQXV0b2ZvY3VzIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uLCBQYXJ0cyAzLTYgKi8KLQl1aW50OF90ICAgICAgIGFmX211bHRpd2luZ3JpZFtOVU1fQVVUT0ZPQ1VTX01VTFRJX1dJTkRPV19HUklEU107Ci0KLQkvKiBBdXRvZm9jdXMgU3RhdGlzdGljIENvbmZpZ3VyYXRpb24sIFBhcnQgNyAqLwotCXNpZ25lZCBpbnQgICAgYWZfbWV0cmljaHBmY29lZmEwMDo1OwotCXNpZ25lZCBpbnQgICAgYWZfbWV0cmljaHBmY29lZmEwNDo1OwotCXVuc2lnbmVkIGludCAgYWZfbWV0cmljbWF4dmFsOjExOwotCXVpbnQ4X3QgICAgICAgYWZfbWV0cmljc2VsOjE7Ci0JdW5zaWduZWQgaW50ICAvKiByZXNlcnZlZCAqLyA6IDEwOwotCi0JLyogQXV0b2ZvY3VzIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uLCBQYXJ0IDggKi8KLQlzaWduZWQgaW50ICAgIGFmX21ldHJpY2hwZmNvZWZhMjA6NTsKLQlzaWduZWQgaW50ICAgIGFmX21ldHJpY2hwZmNvZWZhMjE6NTsKLQlzaWduZWQgaW50ICAgIGFmX21ldHJpY2hwZmNvZWZhMjI6NTsKLQlzaWduZWQgaW50ICAgIGFmX21ldHJpY2hwZmNvZWZhMjM6NTsKLQlzaWduZWQgaW50ICAgIGFmX21ldHJpY2hwZmNvZWZhMjQ6NTsKLQl1bnNpZ25lZCBpbnQgIC8qIHJlc2VydmVkICovIDogNzsKLQotCS8qIEF1dG9mb2N1cyBTdGF0aXN0aWMgT3V0cHV0IEJ1ZmZlciBIZWFkZXIgKi8KLQl1bnNpZ25lZCBpbnQgIGFmX21ldHJpY2hwOjg7Ci0JdW5zaWduZWQgaW50ICAvKiByZXNlcnZlZCAqLyA6IDI0OwotCi0JLyogQXV0b2ZvY3VzIFN0YXRpc3RpYyBPdXRwdXQgQnVmZmVycyAtIE1VU1QgQkUgNjQgYml0IEFMSUdORUQhISEgKi8KLQl2b2lkICphZl9vdXRidWZbTlVNX0FGX1NUQVRfT1VUUFVUX0JVRkZFUlNdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsgLyogVkZFX1N0YXRzQXV0b2ZvY3VzQ29uZmlnQ21kVHlwZSAqLwotCi1zdHJ1Y3QgbXNtX2NhbWVyYV9mcmFtZV9tc2cgewotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXRfeV9hZGRyZXNzOwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXRfY2Jjcl9hZGRyZXNzOwotCi0JdW5zaWduZWQgaW50ICAgIGJsYWNrbGV2ZWxldmVuQ29sdW1uOjIzOwotCXVpbnQxNl90ICAgICAgICByZXNlcnZlZDE6OTsKLQl1bnNpZ25lZCBpbnQgICAgYmxhY2tsZXZlbG9kZENvbHVtbjoyMzsKLQl1aW50MTZfdCAgICAgICAgcmVzZXJ2ZWQyOjk7Ci0KLQl1aW50MTZfdCAgICAgICAgZ3JlZW5kZWZlY3RwaXhlbGNvdW50Ojg7Ci0JdWludDE2X3QgICAgICAgIHJlc2VydmVkMzo4OwotCXVpbnQxNl90ICAgICAgICByZWRibHVlZGVmZWN0cGl4ZWxjb3VudDo4OwotCXVpbnQxNl90ICAgICAgICByZXNlcnZlZDQ6ODsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLS8qIE5ldyBvbmUgZm9yIDdrICovCi1zdHJ1Y3QgbXNtX3ZmZV9jb21tYW5kXzdrIHsKLQl1aW50MTZfdCBxdWV1ZTsKLQl1aW50MTZfdCBsZW5ndGg7Ci0Jdm9pZCAgICAgKnZhbHVlOwotfTsKLQotc3RydWN0IHN0b3BfZXZlbnQgewotICB3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCWludCBzdGF0ZTsKLSAgaW50IHRpbWVvdXQ7Ci19OwotCi0KLSNlbmRpZiAvKiBfX01TTV9WRkU3WF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTd4MjdhLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmU3eDI3YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjQxYjAzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTd4MjdhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NDUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hZHNwLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bWFjaC9tc21fYWRzcC5oPgotI2luY2x1ZGUgPG1hY2gvY2xrLmg+Ci0jaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KLSNpbmNsdWRlICJtc21fdmZlN3gyN2EuaCIKLQotI2RlZmluZSBRRFNQX0NNRFFVRVVFIDI1Ci0KLSNkZWZpbmUgVkZFX1JFU0VUX0NNRCAwCi0jZGVmaW5lIFZGRV9TVEFSVF9DTUQgMQotI2RlZmluZSBWRkVfU1RPUF9DTUQgIDIKLSNkZWZpbmUgVkZFX0ZSQU1FX0FDSyAyMAotI2RlZmluZSBTVEFUU19BRl9BQ0sgIDIxCi0jZGVmaW5lIFNUQVRTX1dFX0FDSyAgMjIKLQotI2RlZmluZSBNU0dfU1RPUF9BQ0sgIDEKLSNkZWZpbmUgTVNHX1NOQVBTSE9UICAyCi0jZGVmaW5lIE1TR19PVVRQVVQxICAgNgotI2RlZmluZSBNU0dfT1VUUFVUMiAgIDcKLSNkZWZpbmUgTVNHX1NUQVRTX0FGICA4Ci0jZGVmaW5lIE1TR19TVEFUU19XRSAgOQotI2RlZmluZSBNU0dfT1VUUFVUX1MgIDIzCi0jZGVmaW5lIE1TR19PVVRQVVRfVCAgMjIKLSNkZWZpbmUgTVNHX1NPRiAgICAgICAxNQotCi0jZGVmaW5lIFZGRV9BRFNQX0VWRU5UIDB4RkZGRgotI2RlZmluZSBTTkFQU0hPVF9NQVNLX01PREUgMHgwMDAwMDAwMgotI2RlZmluZSBNU01fQVhJX1FPU19QUkVWSUVXCTEyMjAwMAotI2RlZmluZSBNU01fQVhJX1FPU19TTkFQU0hPVAkxOTIwMDAKLQotCi1zdGF0aWMgc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqcWNhbV9tb2Q7Ci1zdGF0aWMgc3RydWN0IG1zbV9hZHNwX21vZHVsZSAqdmZlX21vZDsKLXN0YXRpYyBzdHJ1Y3QgbXNtX3ZmZV9jYWxsYmFjayAqcmVzcDsKLXN0YXRpYyB2b2lkICpleHRkYXRhOwotc3RhdGljIHVpbnQzMl90IGV4dGxlbjsKLQotc3RydWN0IG11dGV4IHZmZV9sb2NrOwotc3RhdGljIHZvaWQgICAgICp2ZmVfc3luY2RhdGE7Ci1zdGF0aWMgdWludDhfdCB2ZmVzdG9wcGVkOwotCi1zdGF0aWMgc3RydWN0IHN0b3BfZXZlbnQgc3RvcGV2ZW50OwotCi11bnNpZ25lZCBsb25nIHBhZGRyX3NfeTsKLXVuc2lnbmVkIGxvbmcgcGFkZHJfc19jYmNyOwotdW5zaWduZWQgbG9uZyBwYWRkcl90X3k7Ci11bnNpZ25lZCBsb25nIHBhZGRyX3RfY2JjcjsKLXN0YXRpYyB1aW50MzJfdCBvcF9tb2RlOwotCi1zdGF0aWMgdm9pZCB2ZmVfN3hfY29udmVydChzdHJ1Y3QgbXNtX3ZmZV9waHlfaW5mbyAqcGluZm8sCi0JCWVudW0gdmZlX3Jlc3BfbXNnIHR5cGUsCi0JCXZvaWQgKmRhdGEsIHZvaWQgKipleHQsIGludDMyX3QgKmVsZW4pCi17Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBWRkVfTVNHX09VVFBVVF9QOiB7Ci0JCXBpbmZvLT5wMF9waHkgPSAoKHN0cnVjdCB2ZmVfZW5kZnJhbWUgKilkYXRhKS0+eV9hZGRyZXNzOwotCQlwaW5mby0+cDFfcGh5ID0KLQkJCSgoc3RydWN0IHZmZV9lbmRmcmFtZSAqKWRhdGEpLT5jYmNyX2FkZHJlc3M7Ci0JCXBpbmZvLT5wMl9waHkgPSBwaW5mby0+cDBfcGh5OwotCQlwaW5mby0+b3V0cHV0X2lkID0gT1VUUFVUX1RZUEVfUDsKLQotCQlDREJHKCJ2ZmVfN3hfY29udmVydCwgeV9waHkgPSAweCV4LCBjYmNyX3BoeSA9IDB4JXhcbiIsCi0JCQkJIHBpbmZvLT5wMF9waHksIHBpbmZvLT5wMV9waHkpOwotCi0JCW1lbWNweSgoKHN0cnVjdCB2ZmVfZnJhbWVfZXh0cmEgKilleHRkYXRhKSwKLQkJCSYoKHN0cnVjdCB2ZmVfZW5kZnJhbWUgKilkYXRhKS0+ZXh0cmEsCi0JCQlzaXplb2Yoc3RydWN0IHZmZV9mcmFtZV9leHRyYSkpOwotCi0JCSpleHQgID0gZXh0ZGF0YTsKLQkJKmVsZW4gPSBleHRsZW47Ci0JCXBpbmZvLT5mcmFtZV9pZCA9Ci0JCQkJKChzdHJ1Y3QgdmZlX2ZyYW1lX2V4dHJhICopZXh0ZGF0YSktPmZyYW1lX2lkOwotCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRkVfTVNHX09VVFBVVF9TOiB7Ci0JCXBpbmZvLT5wMF9waHkgPSBwYWRkcl9zX3k7Ci0JCXBpbmZvLT5wMV9waHkgPSBwYWRkcl9zX2NiY3I7Ci0JCXBpbmZvLT5wMl9waHkgPSBwaW5mby0+cDBfcGh5OwotCQlwaW5mby0+b3V0cHV0X2lkID0gT1VUUFVUX1RZUEVfUzsKLQkJQ0RCRygidmZlXzd4X2NvbnZlcnQ6IHlfcGh5ID0gMHgleCBjYmNyX3BoeSA9IDB4JXhcbiIsCi0JCQkJCXBpbmZvLT5wMF9waHksIHBpbmZvLT5wMV9waHkpOwotCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRkVfTVNHX09VVFBVVF9UOiB7Ci0JCXBpbmZvLT5wMF9waHkgPSBwYWRkcl90X3k7Ci0JCXBpbmZvLT5wMV9waHkgPSBwYWRkcl90X2NiY3I7Ci0JCXBpbmZvLT5wMl9waHkgPSBwaW5mby0+cDBfcGh5OwotCQlwaW5mby0+b3V0cHV0X2lkID0gT1VUUFVUX1RZUEVfVDsKLQkJQ0RCRygidmZlXzd4X2NvbnZlcnQ6IHlfcGh5ID0gMHgleCBjYmNyX3BoeSA9IDB4JXhcbiIsCi0JCQkJCXBpbmZvLT5wMF9waHksIHBpbmZvLT5wMV9waHkpOwotCX0KLQkJYnJlYWs7Ci0JY2FzZSBWRkVfTVNHX1NUQVRTX0FGOgotCWNhc2UgVkZFX01TR19TVEFUU19XRToKLQkJcGluZm8tPnNidWZfcGh5ID0gKih1aW50MzJfdCAqKWRhdGE7Ci0JCXBpbmZvLT5mcmFtZV9pZCA9ICooKCh1aW50MzJfdCAqKWRhdGEpICsgMSk7Ci0JCUNEQkcoImZyYW1lIGlkID0gJWRcbiIsIHBpbmZvLT5mcmFtZV9pZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlXzd4X29wcyh2b2lkICpkcml2ZXJfZGF0YSwgdW5zaWduZWQgaWQsIHNpemVfdCBsZW4sCi0JCXZvaWQgKCpnZXRldmVudCkodm9pZCAqcHRyLCBzaXplX3QgbGVuKSkKLXsKLQl1aW50MzJfdCBldnRfYnVmWzNdOwotCXN0cnVjdCBtc21fdmZlX3Jlc3AgKnJwOwotCXZvaWQgKmRhdGE7Ci0JQ0RCRygiJXM6aWQ9JWRcbiIsIF9fZnVuY19fLCBpZCk7Ci0KLQlsZW4gPSAoaWQgPT0gVkZFX0FEU1BfRVZFTlQpID8gMCA6IGxlbjsKLQlkYXRhID0gcmVzcC0+dmZlX2FsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX3ZmZV9yZXNwKSArIGxlbiwKLQkJdmZlX3N5bmNkYXRhLCAgR0ZQX0FUT01JQyk7Ci0KLQlpZiAoIWRhdGEpIHsKLQkJcHJfZXJyKCIlczogcnA6IGNhbm5vdCBhbGxvY2F0ZSBidWZmZXJcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQlycCA9IGRhdGE7Ci0JcnAtPmV2dF9tc2cubGVuID0gbGVuOwotCi0JaWYgKGlkID09IFZGRV9BRFNQX0VWRU5UKSB7Ci0JCS8qIGV2ZW50ICovCi0JCXJwLT50eXBlICAgICAgICAgICA9IFZGRV9FVkVOVDsKLQkJcnAtPmV2dF9tc2cudHlwZSAgID0gTVNNX0NBTUVSQV9FVlQ7Ci0JCWdldGV2ZW50KGV2dF9idWYsIHNpemVvZihldnRfYnVmKSk7Ci0JCXJwLT5ldnRfbXNnLm1zZ19pZCA9IGV2dF9idWZbMF07Ci0JCUNEQkcoIiVzOmV2ZW50Om1zZ19pZD0lZFxuIiwgX19mdW5jX18sIHJwLT5ldnRfbXNnLm1zZ19pZCk7Ci0JCXJlc3AtPnZmZV9yZXNwKHJwLCBNU01fQ0FNX1FfVkZFX0VWVCwgdmZlX3N5bmNkYXRhLAotCQlHRlBfQVRPTUlDKTsKLQl9IGVsc2UgewotCQkvKiBtZXNzYWdlcyAqLwotCQlycC0+ZXZ0X21zZy50eXBlICAgPSBNU01fQ0FNRVJBX01TRzsKLQkJcnAtPmV2dF9tc2cubXNnX2lkID0gaWQ7Ci0JCXJwLT5ldnRfbXNnLmRhdGEgPSBycCArIDE7Ci0JCWdldGV2ZW50KHJwLT5ldnRfbXNnLmRhdGEsIGxlbik7Ci0JCUNEQkcoIiVzOm1lc3NhZ2VzOm1zZ19pZD0lZFxuIiwgX19mdW5jX18sIHJwLT5ldnRfbXNnLm1zZ19pZCk7Ci0KLQkJc3dpdGNoIChycC0+ZXZ0X21zZy5tc2dfaWQpIHsKLQkJY2FzZSBNU0dfU05BUFNIT1Q6Ci0JCQltc21fY2FtaW9fc2V0X3BlcmZfbHZsKFNfUFJFVklFVyk7Ci0JCQl2ZmVfN3hfb3BzKGRyaXZlcl9kYXRhLCBNU0dfT1VUUFVUX1MsIGxlbiwgZ2V0ZXZlbnQpOwotCQkJdmZlXzd4X29wcyhkcml2ZXJfZGF0YSwgTVNHX09VVFBVVF9ULCBsZW4sIGdldGV2ZW50KTsKLQkJCXJwLT50eXBlID0gVkZFX01TR19TTkFQU0hPVDsKLQkJCWJyZWFrOwotCQljYXNlIE1TR19PVVRQVVRfUzoKLQkJCXJwLT50eXBlID0gVkZFX01TR19PVVRQVVRfUzsKLQkJCXZmZV83eF9jb252ZXJ0KCYocnAtPnBoeSksIFZGRV9NU0dfT1VUUFVUX1MsCi0JCQkJCXJwLT5ldnRfbXNnLmRhdGEsICYocnAtPmV4dGRhdGEpLAotCQkJCQkmKHJwLT5leHRsZW4pKTsKLQkJCWJyZWFrOwotCQljYXNlIE1TR19PVVRQVVRfVDoKLQkJCXJwLT50eXBlID0gVkZFX01TR19PVVRQVVRfVDsKLQkJCXZmZV83eF9jb252ZXJ0KCYocnAtPnBoeSksIFZGRV9NU0dfT1VUUFVUX1QsCi0JCQkJCXJwLT5ldnRfbXNnLmRhdGEsICYocnAtPmV4dGRhdGEpLAotCQkJCQkmKHJwLT5leHRsZW4pKTsKLQkJCWJyZWFrOwotCQljYXNlIE1TR19PVVRQVVQxOgotCQljYXNlIE1TR19PVVRQVVQyOgotCQkJaWYgKG9wX21vZGUgJiBTTkFQU0hPVF9NQVNLX01PREUpIHsKLQkJCQlyZXNwLT52ZmVfZnJlZShkYXRhKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlycC0+dHlwZSA9IFZGRV9NU0dfT1VUUFVUX1A7Ci0JCQl2ZmVfN3hfY29udmVydCgmKHJwLT5waHkpLCBWRkVfTVNHX09VVFBVVF9QLAotCQkJCXJwLT5ldnRfbXNnLmRhdGEsICYocnAtPmV4dGRhdGEpLAotCQkJCSYocnAtPmV4dGxlbikpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNHX1NUQVRTX0FGOgotCQkJcnAtPnR5cGUgPSBWRkVfTVNHX1NUQVRTX0FGOwotCQkJdmZlXzd4X2NvbnZlcnQoJihycC0+cGh5KSwgVkZFX01TR19TVEFUU19BRiwKLQkJCQkJcnAtPmV2dF9tc2cuZGF0YSwgTlVMTCwgTlVMTCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNU0dfU1RBVFNfV0U6Ci0JCQlycC0+dHlwZSA9IFZGRV9NU0dfU1RBVFNfV0U7Ci0JCQl2ZmVfN3hfY29udmVydCgmKHJwLT5waHkpLCBWRkVfTVNHX1NUQVRTX1dFLAotCQkJCQlycC0+ZXZ0X21zZy5kYXRhLCBOVUxMLCBOVUxMKTsKLQotCQkJQ0RCRygiTVNHX1NUQVRTX1dFOiBwaHkgPSAweCV4XG4iLCBycC0+cGh5LnNidWZfcGh5KTsKLQkJCWJyZWFrOwotCQljYXNlIE1TR19TVE9QX0FDSzoKLQkJCXJwLT50eXBlID0gVkZFX01TR19HRU5FUkFMOwotCQkJc3RvcGV2ZW50LnN0YXRlID0gMTsKLQkJCXdha2VfdXAoJnN0b3BldmVudC53YWl0KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcnAtPnR5cGUgPSBWRkVfTVNHX0dFTkVSQUw7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoaWQgIT0gTVNHX1NPRikKLQkJCXJlc3AtPnZmZV9yZXNwKHJwLCBNU01fQ0FNX1FfVkZFX01TRywKLQkJCQkJdmZlX3N5bmNkYXRhLCBHRlBfQVRPTUlDKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2Fkc3Bfb3BzIHZmZV83eF9zeW5jID0gewotCS5ldmVudCA9IHZmZV83eF9vcHMsCi19OwotCi1zdGF0aWMgaW50IHZmZV83eF9lbmFibGUoc3RydWN0IGNhbWVyYV9lbmFibGVfY21kICplbmFibGUpCi17Ci0JaW50IHJjID0gLUVGQVVMVDsKLQlzdGF0aWMgaW50IGNudDsKLQotCWlmICghc3RyY21wKGVuYWJsZS0+bmFtZSwgIlFDQU1UQVNLIikpCi0JCXJjID0gbXNtX2Fkc3BfZW5hYmxlKHFjYW1fbW9kKTsKLQllbHNlIGlmICghc3RyY21wKGVuYWJsZS0+bmFtZSwgIlZGRVRBU0siKSkKLQkJcmMgPSBtc21fYWRzcF9lbmFibGUodmZlX21vZCk7Ci0KLQlpZiAoIWNudCkgewotCQltc21fY2FtaW9fc2V0X3BlcmZfbHZsKFNfSU5JVCk7Ci0JCWNudCsrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgdmZlXzd4X2Rpc2FibGUoc3RydWN0IGNhbWVyYV9lbmFibGVfY21kICplbmFibGUsCi0JCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKLXsKLQlpbnQgcmMgPSAtRUZBVUxUOwotCi0JaWYgKCFzdHJjbXAoZW5hYmxlLT5uYW1lLCAiUUNBTVRBU0siKSkKLQkJcmMgPSBtc21fYWRzcF9kaXNhYmxlKHFjYW1fbW9kKTsKLQllbHNlIGlmICghc3RyY21wKGVuYWJsZS0+bmFtZSwgIlZGRVRBU0siKSkKLQkJcmMgPSBtc21fYWRzcF9kaXNhYmxlKHZmZV9tb2QpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHZmZV83eF9zdG9wKHZvaWQpCi17Ci0JaW50IHJjID0gMDsKLQl1aW50MzJfdCBzdG9wY21kID0gVkZFX1NUT1BfQ01EOwotCXJjID0gbXNtX2Fkc3Bfd3JpdGUodmZlX21vZCwgUURTUF9DTURRVUVVRSwKLQkJCQkmc3RvcGNtZCwgc2l6ZW9mKHVpbnQzMl90KSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCIlczolZDogZmFpbGVkIHJjID0gJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0Jc3RvcGV2ZW50LnN0YXRlID0gMDsKLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChzdG9wZXZlbnQud2FpdCwKLQkJc3RvcGV2ZW50LnN0YXRlICE9IDAsCi0JCW1zZWNzX3RvX2ppZmZpZXMoc3RvcGV2ZW50LnRpbWVvdXQpKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgdmZlXzd4X3JlbGVhc2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQltdXRleF9sb2NrKCZ2ZmVfbG9jayk7Ci0JdmZlX3N5bmNkYXRhID0gTlVMTDsKLQltdXRleF91bmxvY2soJnZmZV9sb2NrKTsKLQotCWlmICghdmZlc3RvcHBlZCkgewotCQlDREJHKCIlczolZDpDYWxsaW5nIHZmZV83eF9zdG9wKClcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXZmZV83eF9zdG9wKCk7Ci0JfSBlbHNlCi0JCXZmZXN0b3BwZWQgPSAwOwotCi0JbXNtX2Fkc3BfZGlzYWJsZShxY2FtX21vZCk7Ci0JbXNtX2Fkc3BfZGlzYWJsZSh2ZmVfbW9kKTsKLQotCW1zbV9hZHNwX3B1dChxY2FtX21vZCk7Ci0JbXNtX2Fkc3BfcHV0KHZmZV9tb2QpOwotCi0JbXNtX2NhbWlvX2Rpc2FibGUocGRldik7Ci0KLQlrZnJlZShleHRkYXRhKTsKLQlleHRsZW4gPSAwOwotCi0JbXNtX2NhbWlvX3NldF9wZXJmX2x2bChTX0VYSVQpOwotfQotCi1zdGF0aWMgaW50IHZmZV83eF9pbml0KHN0cnVjdCBtc21fdmZlX2NhbGxiYWNrICpwcmVzcCwKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0JaW50IHJjID0gMDsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN0b3BldmVudC53YWl0KTsKLQlzdG9wZXZlbnQudGltZW91dCA9IDIwMDsKLQlzdG9wZXZlbnQuc3RhdGUgPSAwOwotCi0JaWYgKHByZXNwICYmIHByZXNwLT52ZmVfcmVzcCkKLQkJcmVzcCA9IHByZXNwOwotCWVsc2UKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkvKiBCcmluZyB1cCBhbGwgdGhlIHJlcXVpcmVkIEdQSU9zIGFuZCBDbG9ja3MgKi8KLQlyYyA9IG1zbV9jYW1pb19lbmFibGUoZGV2KTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlleHRsZW4gPSBzaXplb2Yoc3RydWN0IHZmZV9mcmFtZV9leHRyYSk7Ci0KLQlleHRkYXRhID0ga21hbGxvYyhleHRsZW4sIEdGUF9BVE9NSUMpOwotCWlmICghZXh0ZGF0YSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gaW5pdF9mYWlsOwotCX0KLQotCXJjID0gbXNtX2Fkc3BfZ2V0KCJRQ0FNVEFTSyIsICZxY2FtX21vZCwgJnZmZV83eF9zeW5jLCBOVUxMKTsKLQlpZiAocmMpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZ2V0X3FjYW1fZmFpbDsKLQl9Ci0KLQlyYyA9IG1zbV9hZHNwX2dldCgiVkZFVEFTSyIsICZ2ZmVfbW9kLCAmdmZlXzd4X3N5bmMsIE5VTEwpOwotCWlmIChyYykgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBnZXRfdmZlX2ZhaWw7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWdldF92ZmVfZmFpbDoKLQltc21fYWRzcF9wdXQocWNhbV9tb2QpOwotZ2V0X3FjYW1fZmFpbDoKLQlrZnJlZShleHRkYXRhKTsKLWluaXRfZmFpbDoKLQlleHRsZW4gPSAwOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB2ZmVfN3hfY29uZmlnX2F4aShpbnQgbW9kZSwKLQlzdHJ1Y3QgYXhpZGF0YSAqYWQsIHN0cnVjdCBheGlvdXQgKmFvKQotewotCXN0cnVjdCBtc21fcG1lbV9yZWdpb24gKnJlZ3B0cjsKLQl1bnNpZ25lZCBsb25nICpicHRyOwotCWludCAgICBjbnQ7Ci0KLQlpbnQgcmMgPSAwOwotCi0JaWYgKG1vZGUgPT0gT1VUUFVUXzEgfHwgbW9kZSA9PSBPVVRQVVRfMV9BTkRfMikgewotCQlyZWdwdHIgPSBhZC0+cmVnaW9uOwotCi0JCUNEQkcoImJ1Zm51bTEgPSAlZFxuIiwgYWQtPmJ1Zm51bTEpOwotCQlpZiAobW9kZSA9PSBPVVRQVVRfMV9BTkRfMikgewotCQkJcGFkZHJfdF95ID0gcmVncHRyLT5wYWRkciArIHJlZ3B0ci0+aW5mby5wbGFuYXIwX29mZjsKLQkJCXBhZGRyX3RfY2JjciA9IHJlZ3B0ci0+cGFkZHIgKwotCQkJcmVncHRyLT5pbmZvLnBsYW5hcjFfb2ZmOwotCQl9Ci0KLQkJQ0RCRygiY29uZmlnX2F4aTE6IE8xLCBwaHkgPSAweCVseCwgeV9vZmYgPSAlZCwgY2Jjcl9vZmYgPSVkXG4iLAotCQkJcmVncHRyLT5wYWRkciwgcmVncHRyLT5pbmZvLnBsYW5hcjBfb2ZmLAotCQkJcmVncHRyLT5pbmZvLnBsYW5hcjFfb2ZmKTsKLQotCQlicHRyID0gJmFvLT5vdXRwdXQxYnVmZmVyMV95X3BoeTsKLQkJZm9yIChjbnQgPSAwOyBjbnQgPCBhZC0+YnVmbnVtMTsgY250KyspIHsKLQkJCSpicHRyID0gcmVncHRyLT5wYWRkciArIHJlZ3B0ci0+aW5mby5wbGFuYXIwX29mZjsKLQkJCWJwdHIrKzsKLQkJCSpicHRyID0gcmVncHRyLT5wYWRkciArIHJlZ3B0ci0+aW5mby5wbGFuYXIxX29mZjsKLQotCQkJYnB0cisrOwotCQkJcmVncHRyKys7Ci0JCX0KLQotCQlyZWdwdHItLTsKLQkJZm9yIChjbnQgPSAwOyBjbnQgPCAoOCAtIGFkLT5idWZudW0xKTsgY250KyspIHsKLQkJCSpicHRyID0gcmVncHRyLT5wYWRkciArIHJlZ3B0ci0+aW5mby5wbGFuYXIwX29mZjsKLQkJCWJwdHIrKzsKLQkJCSpicHRyID0gcmVncHRyLT5wYWRkciArIHJlZ3B0ci0+aW5mby5wbGFuYXIxX29mZjsKLQkJCWJwdHIrKzsKLQkJfQotCX0KLQotCWlmIChtb2RlID09IE9VVFBVVF8yIHx8IG1vZGUgPT0gT1VUUFVUXzFfQU5EXzIpIHsKLQkJcmVncHRyID0gJihhZC0+cmVnaW9uW2FkLT5idWZudW0xXSk7Ci0KLQkJQ0RCRygiYnVmbnVtMiA9ICVkXG4iLCBhZC0+YnVmbnVtMik7Ci0JCXBhZGRyX3NfeSA9IHJlZ3B0ci0+cGFkZHIgKyAgcmVncHRyLT5pbmZvLnBsYW5hcjBfb2ZmOwotCQlwYWRkcl9zX2NiY3IgPSByZWdwdHItPnBhZGRyICsgIHJlZ3B0ci0+aW5mby5wbGFuYXIxX29mZjsKLQotCQlDREJHKCJjb25maWdfYXhpMjogTzIsIHBoeSA9IDB4JWx4LCB5X29mZiA9ICVkLCBjYmNyX29mZiA9JWRcbiIsCi0JCQlyZWdwdHItPnBhZGRyLCByZWdwdHItPmluZm8ucGxhbmFyMF9vZmYsCi0JCQlyZWdwdHItPmluZm8ucGxhbmFyMV9vZmYpOwotCi0JCWJwdHIgPSAmYW8tPm91dHB1dDJidWZmZXIxX3lfcGh5OwotCQlmb3IgKGNudCA9IDA7IGNudCA8IGFkLT5idWZudW0yOyBjbnQrKykgewotCQkJKmJwdHIgPSByZWdwdHItPnBhZGRyICsgcmVncHRyLT5pbmZvLnBsYW5hcjBfb2ZmOwotCQkJYnB0cisrOwotCQkJKmJwdHIgPSByZWdwdHItPnBhZGRyICsgcmVncHRyLT5pbmZvLnBsYW5hcjFfb2ZmOwotCi0JCQlicHRyKys7Ci0JCQlyZWdwdHIrKzsKLQkJfQotCi0JCXJlZ3B0ci0tOwotCQlmb3IgKGNudCA9IDA7IGNudCA8ICg4IC0gYWQtPmJ1Zm51bTIpOyBjbnQrKykgewotCQkJKmJwdHIgPSByZWdwdHItPnBhZGRyICsgcmVncHRyLT5pbmZvLnBsYW5hcjBfb2ZmOwotCQkJYnB0cisrOwotCQkJKmJwdHIgPSByZWdwdHItPnBhZGRyICsgcmVncHRyLT5pbmZvLnBsYW5hcjFfb2ZmOwotCQkJYnB0cisrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHZmZV83eF9jb25maWcoc3RydWN0IG1zbV92ZmVfY2ZnX2NtZCAqY21kLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBtc21fcG1lbV9yZWdpb24gKnJlZ3B0cjsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlsyNTZdOwotCi0Jc3RydWN0IHZmZV9zdGF0c19hY2sgc2FjazsKLQlzdHJ1Y3QgYXhpZGF0YSAqYXhpZDsKLQl1aW50MzJfdCBpOwotCXVpbnQzMl90ICpfbW9kZTsKLQotCXN0cnVjdCB2ZmVfc3RhdHNfd2VfY2ZnICpzY2ZnID0gTlVMTDsKLQlzdHJ1Y3QgdmZlX3N0YXRzX2FmX2NmZyAqc2ZjZmcgPSBOVUxMOwotCi0Jc3RydWN0IGF4aW91dCAqYXhpbyA9IE5VTEw7Ci0Jdm9pZCAgICpjbWRfZGF0YSA9IE5VTEw7Ci0Jdm9pZCAgICpjbWRfZGF0YV9hbGxvYyA9IE5VTEw7Ci0JbG9uZyByYyA9IDA7Ci0Jc3RydWN0IG1zbV92ZmVfY29tbWFuZF83ayAqdmZlY21kOwotCi0JdmZlY21kID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1zbV92ZmVfY29tbWFuZF83ayksIEdGUF9BVE9NSUMpOwotCWlmICghdmZlY21kKSB7Ci0JCXByX2VycigidmZlY21kIGFsbG9jIGZhaWxlZCFcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlpZiAoY21kLT5jbWRfdHlwZSAhPSBDTURfRlJBTUVfQlVGX1JFTEVBU0UgJiYKLQkgICAgY21kLT5jbWRfdHlwZSAhPSBDTURfU1RBVFNfQlVGX1JFTEVBU0UgJiYKLQkgICAgY21kLT5jbWRfdHlwZSAhPSBDTURfU1RBVFNfQUZfQlVGX1JFTEVBU0UpIHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKHZmZWNtZCwKLQkJCQkodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fdmZlX2NvbW1hbmRfN2spKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBjb25maWdfZmFpbHVyZTsKLQkJfQotCX0KLQotCXN3aXRjaCAoY21kLT5jbWRfdHlwZSkgewotCWNhc2UgQ01EX1NUQVRTX0FFQ19BV0JfRU5BQkxFOgotCWNhc2UgQ01EX1NUQVRTX0FYSV9DRkc6IHsKLQkJYXhpZCA9IGRhdGE7Ci0JCWlmICghYXhpZCkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBjb25maWdfZmFpbHVyZTsKLQkJfQotCi0JCXNjZmcgPQotCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHZmZV9zdGF0c193ZV9jZmcpLAotCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIXNjZmcpIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoc2NmZywKLQkJCQkJKHZvaWQgX191c2VyICopKHZmZWNtZC0+dmFsdWUpLAotCQkJCQl2ZmVjbWQtPmxlbmd0aCkpIHsKLQotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCi0JCUNEQkcoIlNUQVRTX0VOQUJMRTogYnVmbnVtID0gJWQsIGVuYWJsaW5nID0gJWRcbiIsCi0JCQlheGlkLT5idWZudW0xLCBzY2ZnLT53Yl9leHBzdGF0c2VuYWJsZSk7Ci0KLQkJaWYgKGF4aWQtPmJ1Zm51bTEgPiAwKSB7Ci0JCQlyZWdwdHIgPSBheGlkLT5yZWdpb247Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBheGlkLT5idWZudW0xOyBpKyspIHsKLQotCQkJCUNEQkcoIlNUQVRTX0VOQUJMRSwgcGh5ID0gMHglbHhcbiIsCi0JCQkJCXJlZ3B0ci0+cGFkZHIpOwotCi0JCQkJc2NmZy0+d2JfZXhwc3RhdG91dHB1dGJ1ZmZlcltpXSA9Ci0JCQkJCSh2b2lkICopcmVncHRyLT5wYWRkcjsKLQkJCQlyZWdwdHIrKzsKLQkJCX0KLQotCQkJY21kX2RhdGEgPSBzY2ZnOwotCi0JCX0gZWxzZSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGNvbmZpZ19kb25lOwotCQl9Ci0JfQotCQlicmVhazsKLQljYXNlIENNRF9TVEFUU19BRl9FTkFCTEU6Ci0JY2FzZSBDTURfU1RBVFNfQUZfQVhJX0NGRzogewotCQlheGlkID0gZGF0YTsKLQkJaWYgKCFheGlkKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNvbmZpZ19mYWlsdXJlOwotCQl9Ci0KLQkJc2ZjZmcgPQotCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHZmZV9zdGF0c19hZl9jZmcpLAotCQkJCUdGUF9BVE9NSUMpOwotCi0JCWlmICghc2ZjZmcpIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoc2ZjZmcsCi0JCQkJCSh2b2lkIF9fdXNlciAqKSh2ZmVjbWQtPnZhbHVlKSwKLQkJCQkJdmZlY21kLT5sZW5ndGgpKSB7Ci0KLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQotCQlDREJHKCJBRl9FTkFCTEU6IGJ1Zm51bSA9ICVkLCBlbmFibGluZyA9ICVkXG4iLAotCQkJYXhpZC0+YnVmbnVtMSwgc2ZjZmctPmFmX2VuYWJsZSk7Ci0KLQkJaWYgKGF4aWQtPmJ1Zm51bTEgPiAwKSB7Ci0JCQlyZWdwdHIgPSAmYXhpZC0+cmVnaW9uWzBdOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgYXhpZC0+YnVmbnVtMTsgaSsrKSB7Ci0KLQkJCQlDREJHKCJTVEFUU19FTkFCTEUsIHBoeSA9IDB4JWx4XG4iLAotCQkJCQlyZWdwdHItPnBhZGRyKTsKLQotCQkJCXNmY2ZnLT5hZl9vdXRidWZbaV0gPQotCQkJCQkodm9pZCAqKXJlZ3B0ci0+cGFkZHI7Ci0KLQkJCQlyZWdwdHIrKzsKLQkJCX0KLQotCQkJY21kX2RhdGEgPSBzZmNmZzsKLQotCQl9IGVsc2UgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCX0KLQkJYnJlYWs7Ci0JY2FzZSBDTURfRlJBTUVfQlVGX1JFTEVBU0U6IHsKLQkJc3RydWN0IG1zbV9mcmFtZSAqYjsKLQkJdW5zaWduZWQgbG9uZyBwOwotCQlzdHJ1Y3QgdmZlX291dHB1dGFjayBmYWNrOwotCQlpZiAoIWRhdGEpICB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNvbmZpZ19mYWlsdXJlOwotCQl9Ci0KLQkJYiA9IChzdHJ1Y3QgbXNtX2ZyYW1lICopKGNtZC0+dmFsdWUpOwotCQlwID0gKih1bnNpZ25lZCBsb25nICopZGF0YTsKLQotCQlmYWNrLmhlYWRlciA9IFZGRV9GUkFNRV9BQ0s7Ci0KLQkJZmFjay5vdXRwdXQybmV3eWJ1ZmZlcmFkZHJlc3MgPQotCQkJKHZvaWQgKikocCArIGItPnBsYW5hcjBfb2ZmKTsKLQotCQlmYWNrLm91dHB1dDJuZXdjYmNyYnVmZmVyYWRkcmVzcyA9Ci0JCQkodm9pZCAqKShwICsgYi0+cGxhbmFyMV9vZmYpOwotCi0JCXZmZWNtZC0+cXVldWUgPSBRRFNQX0NNRFFVRVVFOwotCQl2ZmVjbWQtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgdmZlX291dHB1dGFjayk7Ci0JCWNtZF9kYXRhID0gJmZhY2s7Ci0JfQotCQlicmVhazsKLQljYXNlIENNRF9TTkFQX0JVRl9SRUxFQVNFOgotCQlicmVhazsKLQljYXNlIENNRF9TVEFUU19CVUZfUkVMRUFTRTogewotCQlDREJHKCJ2ZmVfN3hfY29uZmlnOiBDTURfU1RBVFNfQlVGX1JFTEVBU0VcbiIpOwotCQlpZiAoIWRhdGEpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQotCQlzYWNrLmhlYWRlciA9IFNUQVRTX1dFX0FDSzsKLQkJc2Fjay5idWZhZGRyID0gKHZvaWQgKikqKHVpbnQzMl90ICopZGF0YTsKLQotCQl2ZmVjbWQtPnF1ZXVlICA9IFFEU1BfQ01EUVVFVUU7Ci0JCXZmZWNtZC0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCB2ZmVfc3RhdHNfYWNrKTsKLQkJY21kX2RhdGEgPSAmc2FjazsKLQl9Ci0JCWJyZWFrOwotCWNhc2UgQ01EX1NUQVRTX0FGX0JVRl9SRUxFQVNFOiB7Ci0JCUNEQkcoInZmZV83eF9jb25maWc6IENNRF9TVEFUU19BRl9CVUZfUkVMRUFTRVxuIik7Ci0JCWlmICghZGF0YSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBjb25maWdfZmFpbHVyZTsKLQkJfQotCi0JCXNhY2suaGVhZGVyID0gU1RBVFNfQUZfQUNLOwotCQlzYWNrLmJ1ZmFkZHIgPSAodm9pZCAqKSoodWludDMyX3QgKilkYXRhOwotCi0JCXZmZWNtZC0+cXVldWUgID0gUURTUF9DTURRVUVVRTsKLQkJdmZlY21kLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHZmZV9zdGF0c19hY2spOwotCQljbWRfZGF0YSA9ICZzYWNrOwotCX0KLQkJYnJlYWs7Ci0JY2FzZSBDTURfR0VORVJBTDoKLQljYXNlIENNRF9TVEFUU19ESVNBQkxFOiB7Ci0JCWlmICh2ZmVjbWQtPmxlbmd0aCA+IDI1NikgewotCQkJY21kX2RhdGFfYWxsb2MgPQotCQkJY21kX2RhdGEgPSBrbWFsbG9jKHZmZWNtZC0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKLQkJCWlmICghY21kX2RhdGEpIHsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJZ290byBjb25maWdfZmFpbHVyZTsKLQkJCX0KLQkJfSBlbHNlCi0JCQljbWRfZGF0YSA9IGJ1ZjsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoY21kX2RhdGEsCi0JCQkJCSh2b2lkIF9fdXNlciAqKSh2ZmVjbWQtPnZhbHVlKSwKLQkJCQkJdmZlY21kLT5sZW5ndGgpKSB7Ci0KLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQotCQlpZiAodmZlY21kLT5xdWV1ZSA9PSBRRFNQX0NNRFFVRVVFKSB7Ci0JCQlzd2l0Y2ggKCoodWludDMyX3QgKiljbWRfZGF0YSkgewotCQkJY2FzZSBWRkVfUkVTRVRfQ01EOgotCQkJCW1zbV9jYW1pb192ZmVfYmxrX3Jlc2V0KCk7Ci0JCQkJdmZlc3RvcHBlZCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZGRV9TVEFSVF9DTUQ6Ci0JCQkJX21vZGUgPSAodWludDMyX3QgKiljbWRfZGF0YTsKLQkJCQlvcF9tb2RlID0gKigrK19tb2RlKTsKLQkJCQlpZiAob3BfbW9kZSAmIFNOQVBTSE9UX01BU0tfTU9ERSkKLQkJCQkJbXNtX2NhbWlvX3NldF9wZXJmX2x2bChTX0NBUFRVUkUpOwotCQkJCWVsc2UKLQkJCQkJbXNtX2NhbWlvX3NldF9wZXJmX2x2bChTX1BSRVZJRVcpOwotCQkJCXZmZXN0b3BwZWQgPSAwOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWRkVfU1RPUF9DTUQ6Ci0JCQkJdmZlc3RvcHBlZCA9IDE7Ci0JCQkJZ290byBjb25maWdfc2VuZDsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJfSAvKiBRRFNQX0NNRFFVRVVFICovCi0JfQotCQlicmVhazsKLQljYXNlIENNRF9BWElfQ0ZHX1BSRVZJRVc6Ci0JY2FzZSBDTURfUkFXX1BJQ1RfQVhJX0NGRzogewotCQlheGlkID0gZGF0YTsKLQkJaWYgKCFheGlkKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNvbmZpZ19mYWlsdXJlOwotCQl9Ci0KLQkJYXhpbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBheGlvdXQpLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFheGlvKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGNvbmZpZ19mYWlsdXJlOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF4aW8sICh2b2lkIF9fdXNlciAqKSh2ZmVjbWQtPnZhbHVlKSwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBheGlvdXQpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCi0JCXZmZV83eF9jb25maWdfYXhpKE9VVFBVVF8yLCBheGlkLCBheGlvKTsKLQkJY21kX2RhdGEgPSBheGlvOwotCX0KLQkJYnJlYWs7Ci0JY2FzZSBDTURfQVhJX0NGR19TTkFQOiB7Ci0JCWF4aWQgPSBkYXRhOwotCQlpZiAoIWF4aWQpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQotCQlheGlvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF4aW91dCksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWF4aW8pIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoYXhpbywgKHZvaWQgX191c2VyICopKHZmZWNtZC0+dmFsdWUpLAotCQkJCQlzaXplb2Yoc3RydWN0IGF4aW91dCkpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNvbmZpZ19kb25lOwotCQl9Ci0KLQkJdmZlXzd4X2NvbmZpZ19heGkoT1VUUFVUXzFfQU5EXzIsIGF4aWQsIGF4aW8pOwotCi0JCWNtZF9kYXRhID0gYXhpbzsKLQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmICh2ZmVzdG9wcGVkKQotCQlnb3RvIGNvbmZpZ19kb25lOwotCi1jb25maWdfc2VuZDoKLQlDREJHKCJzZW5kIGFkc3AgY29tbWFuZCA9ICVkXG4iLCAqKHVpbnQzMl90ICopY21kX2RhdGEpOwotCXJjID0gbXNtX2Fkc3Bfd3JpdGUodmZlX21vZCwgdmZlY21kLT5xdWV1ZSwKLQkJCQljbWRfZGF0YSwgdmZlY21kLT5sZW5ndGgpOwotCi1jb25maWdfZG9uZToKLQlrZnJlZShjbWRfZGF0YV9hbGxvYyk7Ci0KLWNvbmZpZ19mYWlsdXJlOgotCWtmcmVlKHNjZmcpOwotCWtmcmVlKGF4aW8pOwotCWtmcmVlKHZmZWNtZCk7Ci0JcmV0dXJuIHJjOwotfQotCi12b2lkIG1zbV9jYW12ZmVfZm5faW5pdChzdHJ1Y3QgbXNtX2NhbXZmZV9mbiAqZnB0ciwgdm9pZCAqZGF0YSkKLXsKLQltdXRleF9pbml0KCZ2ZmVfbG9jayk7Ci0JZnB0ci0+dmZlX2luaXQgICAgPSB2ZmVfN3hfaW5pdDsKLQlmcHRyLT52ZmVfZW5hYmxlICA9IHZmZV83eF9lbmFibGU7Ci0JZnB0ci0+dmZlX2NvbmZpZyAgPSB2ZmVfN3hfY29uZmlnOwotCWZwdHItPnZmZV9kaXNhYmxlID0gdmZlXzd4X2Rpc2FibGU7Ci0JZnB0ci0+dmZlX3JlbGVhc2UgPSB2ZmVfN3hfcmVsZWFzZTsKLQl2ZmVfc3luY2RhdGEgPSBkYXRhOwotfQotCi12b2lkIG1zbV9jYW12cGVfZm5faW5pdChzdHJ1Y3QgbXNtX2NhbXZwZV9mbiAqZnB0ciwgdm9pZCAqZGF0YSkKLXsKLQlmcHRyLT52cGVfcmVnCQk9IE5VTEw7Ci0JZnB0ci0+c2VuZF9mcmFtZV90b192cGUJPSBOVUxMOwotCWZwdHItPnZwZV9jb25maWcJPSBOVUxMOwotCWZwdHItPnZwZV9jZmdfdXBkYXRlCT0gTlVMTDsKLQlmcHRyLT5kaXMJCT0gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTd4MjdhLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmU3eDI3YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmViYjYwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTd4MjdhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19NU01fVkZFN1hfSF9fCi0jZGVmaW5lIF9fTVNNX1ZGRTdYX0hfXwotI2luY2x1ZGUgPG1lZGlhL21zbV9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotCi1zdHJ1Y3QgdmZlX2ZyYW1lX2V4dHJhIHsKLQl1aW50MzJfdAlibF9ldmVuY29sOjIzOwotCXVpbnQzMl90CXJ2ZDE6OTsKLQl1aW50MzJfdAlibF9vZGRjb2w6MjM7Ci0JdWludDMyX3QJcnZkMjo5OwotCi0JdWludDMyX3QJZF9kYnBjX3N0YXRzX2hvdDoxNjsKLQl1aW50MzJfdAlkX2RicGNfc3RhdHNfY29sZDoxNjsKLQotCXVpbnQzMl90CWRfZGJwY19zdGF0c18wX2hvdDoxMDsKLQl1aW50MzJfdAlydmQzOjY7Ci0JdWludDMyX3QJZF9kYnBjX3N0YXRzXzBfY29sZDoxMDsKLQl1aW50MzJfdAlydmQ0OjY7Ci0JdWludDMyX3QJZF9kYnBjX3N0YXRzXzFfaG90OjEwOwotCXVpbnQzMl90CXJ2ZDU6NjsKLQl1aW50MzJfdAlkX2RicGNfc3RhdHNfMV9jb2xkOjEwOwotCXVpbnQzMl90CXJ2ZDY6NjsKLQotCXVpbnQzMl90CWFzZl9tYXhfZWRnZTsKLQotCXVpbnQzMl90CWVfeV93bV9wbV9zdGF0c18wOjIxOwotCXVpbnQzMl90CXJ2ZDc6MTE7Ci0JdWludDMyX3QJZV95X3dtX3BtX3N0YXRzXzFfYmw6ODsKLQl1aW50MzJfdAlydmQ4Ojg7Ci0JdWludDMyX3QJZV95X3dtX3BtX3N0YXRzXzFfbmw6MTI7Ci0JdWludDMyX3QJcnZkOTo0OwotCi0JdWludDMyX3QJZV9jYmNyX3dtX3BtX3N0YXRzXzA6MjE7Ci0JdWludDMyX3QJcnZkMTA6MTE7Ci0JdWludDMyX3QJZV9jYmNyX3dtX3BtX3N0YXRzXzFfYmw6ODsKLQl1aW50MzJfdAlydmQxMTo4OwotCXVpbnQzMl90CWVfY2Jjcl93bV9wbV9zdGF0c18xX25sOjEyOwotCXVpbnQzMl90CXJ2ZDEyOjQ7Ci0KLQl1aW50MzJfdAl2X3lfd21fcG1fc3RhdHNfMDoyMTsKLQl1aW50MzJfdAlydmQxMzoxMTsKLQl1aW50MzJfdAl2X3lfd21fcG1fc3RhdHNfMV9ibDo4OwotCXVpbnQzMl90CXJ2ZDE0Ojg7Ci0JdWludDMyX3QJdl95X3dtX3BtX3N0YXRzXzFfbmw6MTI7Ci0JdWludDMyX3QJcnZkMTU6NDsKLQotCXVpbnQzMl90CXZfY2Jjcl93bV9wbV9zdGF0c18wOjIxOwotCXVpbnQzMl90CXJ2ZDE2OjExOwotCXVpbnQzMl90CXZfY2Jjcl93bV9wbV9zdGF0c18xX2JsOjg7Ci0JdWludDMyX3QJcnZkMTc6ODsKLQl1aW50MzJfdAl2X2NiY3Jfd21fcG1fc3RhdHNfMV9ubDoxMjsKLQl1aW50MzJfdAlydmQxODo0OwotCi0JdWludDMyX3QgICAgICBmcmFtZV9pZDsKLX07Ci0KLXN0cnVjdCB2ZmVfZW5kZnJhbWUgewotCXVpbnQzMl90ICAgICAgeV9hZGRyZXNzOwotCXVpbnQzMl90ICAgICAgY2Jjcl9hZGRyZXNzOwotCi0Jc3RydWN0IHZmZV9mcmFtZV9leHRyYSBleHRyYTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2ZmVfb3V0cHV0YWNrIHsKLQl1aW50MzJfdCAgaGVhZGVyOwotCXZvaWQgICAgICAqb3V0cHV0Mm5ld3lidWZmZXJhZGRyZXNzOwotCXZvaWQgICAgICAqb3V0cHV0Mm5ld2NiY3JidWZmZXJhZGRyZXNzOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZmZV9zdGF0c19hY2sgewotCXVpbnQzMl90IGhlYWRlcjsKLQkvKiBNVVNUIEJFIDY0IGJpdCBBTElHTkVEICovCi0Jdm9pZCAgICAgKmJ1ZmFkZHI7Ci19IF9fcGFja2VkOwotCi0vKiBBWEkgT3V0cHV0IENvbmZpZyBDb21tYW5kIHNlbnQgdG8gRFNQICovCi1zdHJ1Y3QgYXhpb3V0IHsKLQl1aW50MzJfdCAgICAgICAgICAgIGNtZGhlYWRlcjozMjsKLQlpbnQgICAgICAgICAgICAgICAgIG91dHB1dG1vZGU6MzsKLQl1aW50OF90ICAgICAgICAgICAgIGZvcm1hdDoyOwotCXVpbnQzMl90ICAgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8gOiAyNzsKLQotCS8qIEFYSSBPdXRwdXQgMSBZIENvbmZpZ3VyYXRpb24sIFBhcnQgMSAqLwotCXVpbnQzMl90ICAgICAgICAgICAgb3V0MXlpbWFnZWhlaWdodDoxMjsKLQl1aW50MzJfdCAgICAgICAgICAgIC8qIHJlc2VydmVkICovIDogNDsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDF5aW1hZ2V3aWR0aGluNjRiaXR3b3JkczoxMDsKLQl1aW50MzJfdCAgICAgICAgICAgIC8qIHJlc2VydmVkICovIDogNjsKLQotCS8qIEFYSSBPdXRwdXQgMSBZIENvbmZpZ3VyYXRpb24sIFBhcnQgMiAqLwotCXVpbnQ4X3QgICAgICAgICAgICAgb3V0MXlidXJzdGxlbjoyOwotCXVpbnQzMl90ICAgICAgICAgICAgb3V0MXludW1yb3dzOjEyOwotCXVpbnQzMl90ICAgICAgICAgICAgb3V0MXlyb3dpbmNpbjY0Yml0aW5jczoxMjsKLQl1aW50MzJfdCAgICAgICAgICAgIC8qIHJlc2VydmVkICovIDogNjsKLQotCS8qIEFYSSBPdXRwdXQgMSBDYkNyIENvbmZpZ3VyYXRpb24sIFBhcnQgMSAqLwotCXVpbnQzMl90ICAgICAgICAgICAgb3V0MWNiY3JpbWFnZWhlaWdodDoxMjsKLQl1aW50MzJfdCAgICAgICAgICAgIC8qIHJlc2VydmVkICovIDogNDsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDFjYmNyaW1hZ2V3aWR0aGluNjRiaXR3b3JkczoxMDsKLQl1aW50MzJfdCAgICAgICAgICAgIC8qIHJlc2VydmVkICovIDogNjsKLQotCS8qIEFYSSBPdXRwdXQgMSBDYkNyIENvbmZpZ3VyYXRpb24sIFBhcnQgMiAqLwotCXVpbnQ4X3QgICAgICAgICAgICAgb3V0MWNiY3JidXJzdGxlbjoyOwotCXVpbnQzMl90ICAgICAgICAgICAgb3V0MWNiY3JudW1yb3dzOjEyOwotCXVpbnQzMl90ICAgICAgICAgICAgb3V0MWNiY3Jyb3dpbmNpbjY0Yml0aW5jczoxMjsKLQl1aW50MzJfdCAgICAgICAgICAgIC8qIHJlc2VydmVkICovIDogNjsKLQotCS8qIEFYSSBPdXRwdXQgMiBZIENvbmZpZ3VyYXRpb24sIFBhcnQgMSAqLwotCXVpbnQzMl90ICAgICAgICAgICAgb3V0MnlpbWFnZWhlaWdodDoxMjsKLQl1aW50MzJfdCAgICAgICAgICAgIC8qIHJlc2VydmVkICovIDogNDsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDJ5aW1hZ2V3aWR0aGluNjRiaXR3b3JkczoxMDsKLQl1aW50MzJfdCAgICAgICAgICAgIC8qIHJlc2VydmVkICovIDogNjsKLQotCS8qIEFYSSBPdXRwdXQgMiBZIENvbmZpZ3VyYXRpb24sIFBhcnQgMiAqLwotCXVpbnQ4X3QgICAgICAgICAgICAgb3V0MnlidXJzdGxlbjoyOwotCXVpbnQzMl90ICAgICAgICAgICAgb3V0MnludW1yb3dzOjEyOwotCXVpbnQzMl90ICAgICAgICAgICAgb3V0Mnlyb3dpbmNpbjY0Yml0aW5jczoxMjsKLQl1aW50MzJfdCAgICAgICAgICAgIC8qIHJlc2VydmVkICovIDogNjsKLQotCS8qIEFYSSBPdXRwdXQgMiBDYkNyIENvbmZpZ3VyYXRpb24sIFBhcnQgMSAqLwotCXVpbnQzMl90ICAgICAgICAgICAgb3V0MmNiY3JpbWFnZWhlaWdodDoxMjsKLQl1aW50MzJfdCAgICAgICAgICAgIC8qIHJlc2VydmVkICovIDogNDsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDJjYmNyaW1hZ2V3aWR0ZWluNjRiaXR3b3JkczoxMDsKLQl1aW50MzJfdCAgICAgICAgICAgIC8qIHJlc2VydmVkICovIDogNjsKLQotCS8qIEFYSSBPdXRwdXQgMiBDYkNyIENvbmZpZ3VyYXRpb24sIFBhcnQgMiAqLwotCXVpbnQ4X3QgICAgICAgICAgICAgb3V0MmNiY3JidXJzdGxlbjoyOwotCXVpbnQzMl90ICAgICAgICAgICAgb3V0MmNiY3JudW1yb3dzOjEyOwotCXVpbnQzMl90ICAgICAgICAgICAgb3V0MmNiY3Jyb3dpbmNpbjY0Yml0aW5jczoxMjsKLQl1aW50MzJfdCAgICAgICAgICAgIC8qIHJlc2VydmVkICovIDogNjsKLQotCS8qIEFkZHJlc3MgY29uZmlndXJhdGlvbjoKLQkgKiBvdXRwdXQxIHBoaXN5Y2FsIGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MWJ1ZmZlcjFfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXIxX2NiY3JfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQxYnVmZmVyMl95X3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MWJ1ZmZlcjJfY2Jjcl9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXIzX3lfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQxYnVmZmVyM19jYmNyX3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MWJ1ZmZlcjRfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXI0X2NiY3JfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQxYnVmZmVyNV95X3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MWJ1ZmZlcjVfY2Jjcl9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXI2X3lfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQxYnVmZmVyNl9jYmNyX3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MWJ1ZmZlcjdfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXI3X2NiY3JfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQxYnVmZmVyOF95X3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MWJ1ZmZlcjhfY2Jjcl9waHk7Ci0KLQkvKiBvdXRwdXQyIHBoaXN5Y2FsIGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MmJ1ZmZlcjFfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXIxX2NiY3JfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQyYnVmZmVyMl95X3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MmJ1ZmZlcjJfY2Jjcl9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXIzX3lfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQyYnVmZmVyM19jYmNyX3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MmJ1ZmZlcjRfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXI0X2NiY3JfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQyYnVmZmVyNV95X3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MmJ1ZmZlcjVfY2Jjcl9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXI2X3lfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQyYnVmZmVyNl9jYmNyX3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MmJ1ZmZlcjdfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXI3X2NiY3JfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQyYnVmZmVyOF95X3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MmJ1ZmZlcjhfY2Jjcl9waHk7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgdmZlX3N0YXRzX3dlX2NmZyB7Ci0JdWludDMyX3QgICAgICAgaGVhZGVyOwotCi0JLyogV2hpdGUgQmFsYW5jZS9FeHBvc3VyZSBTdGF0aXN0aWMgU2VsZWN0aW9uICovCi0JdWludDhfdCAgICAgICAgd2JfZXhwc3RhdHNlbmFibGU6MTsKLQl1aW50OF90ICAgICAgICB3Yl9leHBzdGF0YnVzcHJpb3JpdHlzZWxlY3Rpb246MTsKLQl1bnNpZ25lZCBpbnQgICB3Yl9leHBzdGF0YnVzcHJpb3JpdHl2YWx1ZTo0OwotCXVuc2lnbmVkIGludCAgIC8qIHJlc2VydmVkICovIDogMjY7Ci0KLQkvKiBXaGl0ZSBCYWxhbmNlL0V4cG9zdXJlIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uLCBQYXJ0IDEgKi8KLQl1aW50OF90ICAgICAgICBleHBvc3VyZXN0YXRyZWdpb25zOjE7Ci0JdWludDhfdCAgICAgICAgZXhwb3N1cmVzdGF0c3VicmVnaW9uczoxOwotCXVuc2lnbmVkIGludCAgIC8qIHJlc2VydmVkICovIDogMTQ7Ci0KLQl1bnNpZ25lZCBpbnQgICB3aGl0ZWJhbGFuY2VtaW5pbXVteTo4OwotCXVuc2lnbmVkIGludCAgIHdoaXRlYmFsYW5jZW1heGltdW15Ojg7Ci0KLQkvKiBXaGl0ZSBCYWxhbmNlL0V4cG9zdXJlIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uLCBQYXJ0IDIgKi8KLQl1aW50OF90IHdiX2V4cHN0YXRzbG9wZW9mbmV1dHJhbHJlZ2lvbmxpbmVbCi0JCU5VTV9XQl9FWFBfTkVVVFJBTF9SRUdJT05fTElORVNdOwotCi0JLyogV2hpdGUgQmFsYW5jZS9FeHBvc3VyZSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiwgUGFydCAzICovCi0JdW5zaWduZWQgaW50ICAgd2JfZXhwc3RhdGNyaW50ZXJjZXB0b2ZuZXV0cmFscmVnaW9ubGluZTI6MTI7Ci0JdW5zaWduZWQgaW50ICAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCXVuc2lnbmVkIGludCAgIHdiX2V4cHN0YXRjYmludGVyY2VwdG9mbmV1dHJhbHJlZ2lubmxpbmUxOjEyOwotCXVuc2lnbmVkIGludCAgICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0KLQkvKiBXaGl0ZSBCYWxhbmNlL0V4cG9zdXJlIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uLCBQYXJ0IDQgKi8KLQl1bnNpZ25lZCBpbnQgICB3Yl9leHBzdGF0Y3JpbnRlcmNlcHRvZm5ldXRyYWxyZWdpb25saW5lNDoxMjsKLQl1bnNpZ25lZCBpbnQgICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdW5zaWduZWQgaW50ICAgd2JfZXhwc3RhdGNiaW50ZXJjZXB0b2ZuZXV0cmFscmVnaW9ubGluZTM6MTI7Ci0JdW5zaWduZWQgaW50ICAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCi0JLyogV2hpdGUgQmFsYW5jZS9FeHBvc3VyZSBTdGF0aXN0aWMgT3V0cHV0IEJ1ZmZlciBIZWFkZXIgKi8KLQl1bnNpZ25lZCBpbnQgICB3Yl9leHBtZXRyaWNoZWFkZXJwYXR0ZXJuOjg7Ci0JdW5zaWduZWQgaW50ICAgLyogcmVzZXJ2ZWQgKi8gOiAyNDsKLQotCS8qIFdoaXRlIEJhbGFuY2UvRXhwb3N1cmUgU3RhdGlzdGljIE91dHB1dCBCdWZmZXJzLU1VU1QKLQkqIEJFIDY0IGJpdCBBTElHTkVEICovCi0Jdm9pZCAgKndiX2V4cHN0YXRvdXRwdXRidWZmZXJbTlVNX1dCX0VYUF9TVEFUX09VVFBVVF9CVUZGRVJTXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2ZmVfc3RhdHNfYWZfY2ZnIHsKLQl1aW50MzJfdCBoZWFkZXI7Ci0KLQkvKiBBdXRvZm9jdXMgU3RhdGlzdGljIFNlbGVjdGlvbiAqLwotCXVpbnQ4X3QgICAgICAgYWZfZW5hYmxlOjE7Ci0JdWludDhfdCAgICAgICBhZl9idXNwcmlvcml0eXNlbDoxOwotCXVuc2lnbmVkIGludCAgYWZfYnVzcHJpb3JpdHl2YWw6NDsKLQl1bnNpZ25lZCBpbnQgIC8qIHJlc2VydmVkICovIDogMjY7Ci0KLQkvKiBBdXRvZm9jdXMgU3RhdGlzdGljIENvbmZpZ3VyYXRpb24sIFBhcnQgMSAqLwotCXVuc2lnbmVkIGludCAgYWZfc2luZ2xld2ludm9mZnNldDoxMjsKLQl1bnNpZ25lZCBpbnQgIC8qIHJlc2VydmVkICovIDogNDsKLQl1bnNpZ25lZCBpbnQgIGFmX3NpbmdsZXdpbmhvZmZzZXQ6MTI7Ci0JdW5zaWduZWQgaW50ICAvKiByZXNlcnZlZCAqLyA6IDM7Ci0JdWludDhfdCAgICAgICBhZl93aW5tb2RlOjE7Ci0KLQkvKiBBdXRvZm9jdXMgU3RhdGlzdGljIENvbmZpZ3VyYXRpb24sIFBhcnQgMiAqLwotCXVuc2lnbmVkIGludCAgYWZfc2luZ2dsZXdpbnZoOjExOwotCXVuc2lnbmVkIGludCAgLyogcmVzZXJ2ZWQgKi8gOiA1OwotCXVuc2lnbmVkIGludCAgYWZfc2luZ2xld2luaHc6MTE7Ci0JdW5zaWduZWQgaW50ICAvKiByZXNlcnZlZCAqLyA6IDU7Ci0KLQkvKiBBdXRvZm9jdXMgU3RhdGlzdGljIENvbmZpZ3VyYXRpb24sIFBhcnRzIDMtNiAqLwotCXVpbnQ4X3QgICAgICAgYWZfbXVsdGl3aW5ncmlkW05VTV9BVVRPRk9DVVNfTVVMVElfV0lORE9XX0dSSURTXTsKLQotCS8qIEF1dG9mb2N1cyBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiwgUGFydCA3ICovCi0Jc2lnbmVkIGludCAgICBhZl9tZXRyaWNocGZjb2VmYTAwOjU7Ci0Jc2lnbmVkIGludCAgICBhZl9tZXRyaWNocGZjb2VmYTA0OjU7Ci0JdW5zaWduZWQgaW50ICBhZl9tZXRyaWNtYXh2YWw6MTE7Ci0JdWludDhfdCAgICAgICBhZl9tZXRyaWNzZWw6MTsKLQl1bnNpZ25lZCBpbnQgIC8qIHJlc2VydmVkICovIDogMTA7Ci0KLQkvKiBBdXRvZm9jdXMgU3RhdGlzdGljIENvbmZpZ3VyYXRpb24sIFBhcnQgOCAqLwotCXNpZ25lZCBpbnQgICAgYWZfbWV0cmljaHBmY29lZmEyMDo1OwotCXNpZ25lZCBpbnQgICAgYWZfbWV0cmljaHBmY29lZmEyMTo1OwotCXNpZ25lZCBpbnQgICAgYWZfbWV0cmljaHBmY29lZmEyMjo1OwotCXNpZ25lZCBpbnQgICAgYWZfbWV0cmljaHBmY29lZmEyMzo1OwotCXNpZ25lZCBpbnQgICAgYWZfbWV0cmljaHBmY29lZmEyNDo1OwotCXVuc2lnbmVkIGludCAgLyogcmVzZXJ2ZWQgKi8gOiA3OwotCi0JLyogQXV0b2ZvY3VzIFN0YXRpc3RpYyBPdXRwdXQgQnVmZmVyIEhlYWRlciAqLwotCXVuc2lnbmVkIGludCAgYWZfbWV0cmljaHA6ODsKLQl1bnNpZ25lZCBpbnQgIC8qIHJlc2VydmVkICovIDogMjQ7Ci0KLQkvKiBBdXRvZm9jdXMgU3RhdGlzdGljIE91dHB1dCBCdWZmZXJzIC0gTVVTVCBCRSA2NCBiaXQgQUxJR05FRCEhISAqLwotCXZvaWQgKmFmX291dGJ1ZltOVU1fQUZfU1RBVF9PVVRQVVRfQlVGRkVSU107Ci19IF9fcGFja2VkOyAvKiBWRkVfU3RhdHNBdXRvZm9jdXNDb25maWdDbWRUeXBlICovCi0KLXN0cnVjdCBtc21fY2FtZXJhX2ZyYW1lX21zZyB7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dF95X2FkZHJlc3M7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dF9jYmNyX2FkZHJlc3M7Ci0KLQl1bnNpZ25lZCBpbnQgICAgYmxhY2tsZXZlbGV2ZW5Db2x1bW46MjM7Ci0JdWludDE2X3QgICAgICAgIHJlc2VydmVkMTo5OwotCXVuc2lnbmVkIGludCAgICBibGFja2xldmVsb2RkQ29sdW1uOjIzOwotCXVpbnQxNl90ICAgICAgICByZXNlcnZlZDI6OTsKLQotCXVpbnQxNl90ICAgICAgICBncmVlbmRlZmVjdHBpeGVsY291bnQ6ODsKLQl1aW50MTZfdCAgICAgICAgcmVzZXJ2ZWQzOjg7Ci0JdWludDE2X3QgICAgICAgIHJlZGJsdWVkZWZlY3RwaXhlbGNvdW50Ojg7Ci0JdWludDE2X3QgICAgICAgIHJlc2VydmVkNDo4OwotfSBfX3BhY2tlZDsKLQotLyogTmV3IG9uZSBmb3IgN2sgKi8KLXN0cnVjdCBtc21fdmZlX2NvbW1hbmRfN2sgewotCXVpbnQxNl90IHF1ZXVlOwotCXVpbnQxNl90IGxlbmd0aDsKLQl2b2lkICAgICAqdmFsdWU7Ci19OwotCi1zdHJ1Y3Qgc3RvcF9ldmVudCB7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlpbnQgc3RhdGU7Ci0JaW50IHRpbWVvdXQ7Ci19OwotCi0KLSNlbmRpZiAvKiBfX01TTV9WRkU3WF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTd4MjdhX3Y0bDIuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTd4MjdhX3Y0bDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E4ZjFiMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmU3eDI3YV92NGwyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDc5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9xb3MuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2lzcC5oPgotI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxtYWNoL2Nsay5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSAibXNtX3ZmZTd4MjdhX3Y0bDIuaCIKLSNpbmNsdWRlICJtc20uaCIKLQotLyogQURTUCBNZXNzYWdlcyAqLwotI2RlZmluZSBNU0dfUkVTRVRfQUNLICAwCi0jZGVmaW5lIE1TR19TVE9QX0FDSyAgMQotI2RlZmluZSBNU0dfU05BUFNIT1QgIDIKLSNkZWZpbmUgTVNHX0lMTEVHQUxfQ09NTUFORCAgMwotI2RlZmluZSBNU0dfU1RBUlRfQUNLICA0Ci0jZGVmaW5lIE1TR19VUERBVEVfQUNLICA1Ci0jZGVmaW5lIE1TR19PVVRQVVQxICA2Ci0jZGVmaW5lIE1TR19PVVRQVVQyICA3Ci0jZGVmaW5lIE1TR19TVEFUU19BRiAgOAotI2RlZmluZSBNU0dfU1RBVFNfV0UgIDkKLSNkZWZpbmUgTVNHX1NUQVRTX0hJU1RPR1JBTSAgMTAKLSNkZWZpbmUgTVNHX0VQT0NIMSAgMTEKLSNkZWZpbmUgTVNHX0VQT0NIMiAgMTIKLSNkZWZpbmUgTVNHX1ZGRV9FUlJPUiAxMwotI2RlZmluZSBNU0dfU1lOQ19USU1FUjFfRE9ORSAgMTQKLSNkZWZpbmUgTVNHX1NZTkNfVElNRVIyX0RPTkUgIDE1Ci0jZGVmaW5lIE1TR19BU1lOQ19USU1FUjFfRE9ORSAgMTYKLSNkZWZpbmUgTVNHX0FTWU5DX1RJTUVSMl9ET05FICAxNwotI2RlZmluZSBNU0dfQ0FQVFVSRV9DT01QTEVURSAgMTgKLSNkZWZpbmUgTVNHX1RBQkxFX0NNRF9BQ0sgIDE5Ci0jZGVmaW5lIE1TR19FWFBfVElNRU9VVF9BQ0sgIDIwCi0jZGVmaW5lIE1TR19TT0YgIDIxCi0jZGVmaW5lIE1TR19PVVRQVVRfVCAgMjIKLSNkZWZpbmUgTVNHX09VVFBVVF9TICAyMwotCi0jZGVmaW5lIFZGRV9BRFNQX0VWRU5UIDB4RkZGRgotI2RlZmluZSBTTkFQU0hPVF9NQVNLX01PREUgMHgwMDAwMDAwMQotI2RlZmluZSBNU01fQVhJX1FPU19QUkVWSUVXCTEyMjAwMAotI2RlZmluZSBNU01fQVhJX1FPU19TTkFQU0hPVAkxOTIwMDAKLQotCi0jZGVmaW5lIFFEU1BfQ01EUVVFVUUgMjUKLSNkZWZpbmUgUURTUF9TQ0FMRVFVRVVFIDI2Ci0jZGVmaW5lIFFEU1BfVEFCTEVRVUVVRSAyNwotCi0vKiBBRFNQIFNjbGVyIHF1ZXVlIENtZCBJRHMgKi8KLSNkZWZpbmUgVkZFX1NDQUxFX09VVFBVVDFfQ09ORklHICAwCi0jZGVmaW5lIFZGRV9TQ0FMRV9PVVRQVVQyX0NPTkZJRyAgMQotI2RlZmluZSBWRkVfU0NBTEVfTUFYICAweEZGRkZGRkZGCi0KLS8qIEFEU1AgdGFibGUgcXVldWUgQ21kIElEcyAqLwotI2RlZmluZSBWRkVfQVhJX0lOUFVUX0NPTkZJRyAgMAotI2RlZmluZSBWRkVfQVhJX09VVFBVVF9DT05GSUcgIDEKLSNkZWZpbmUgVkZFX1JHQl9HQU1NQV9DT05GSUcgIDIKLSNkZWZpbmUgVkZFX1lfR0FNTUFfQ09ORklHICAzCi0jZGVmaW5lIFZGRV9ST0xMX09GRl9DT05GSUcgIDQKLSNkZWZpbmUgVkZFX0RFTU9TQUlDdjNfQlBDX0NGRyAgNgotI2RlZmluZSBWRkVfREVNT1NBSUN2M19BQkZfQ0ZHICA3Ci0jZGVmaW5lIFZGRV9ERU1PU0FJQ3YzX0NGRyAgOAotI2RlZmluZSBWRkVfTUFYICAweEZGRkZGRkZGCi0KLS8qIEFEU1AgY2ZnIHF1ZXVlIGNtZCBJRHMgKi8KLSNkZWZpbmUgVkZFX1JFU0VUICAwCi0jZGVmaW5lIFZGRV9TVEFSVCAgMQotI2RlZmluZSBWRkVfU1RPUCAgMgotI2RlZmluZSBWRkVfVVBEQVRFICAzCi0jZGVmaW5lIFZGRV9DQU1JRl9DT05GSUcgIDQKLSNkZWZpbmUgVkZFX0FDVElWRV9SRUdJT05fQ09ORklHICA1Ci0jZGVmaW5lIFZGRV9ERU1PU0FJQ19DT05GSUcgIDYKLSNkZWZpbmUgVkZFX0lOUFVUX0ZPUk1BVF9DT05GSUcgIDcKLSNkZWZpbmUgVkZFX09VVFBVVF9DTEFNUF9DT05GSUcgIDgKLSNkZWZpbmUgVkZFX0NIUk9NQV9TVUJTQU1QTEVfQ09ORklHICA5Ci0jZGVmaW5lIFZGRV9CTEFDS19MRVZFTF9DT05GSUcgIDEwCi0jZGVmaW5lIFZGRV9XSElURV9CQUxBTkNFX0NPTkZJRyAgMTEKLSNkZWZpbmUgVkZFX0NPTE9SX1BST0NFU1NJTkdfQ09ORklHICAxMgotI2RlZmluZSBWRkVfQURBUFRJVkVfRklMVEVSX0NPTkZJRyAgMTMKLSNkZWZpbmUgVkZFX0ZSQU1FX1NLSVBfQ09ORklHICAxNAotI2RlZmluZSBWRkVfRk9WX0NST1AgIDE1Ci0jZGVmaW5lIFZGRV9TVEFUU19BVVRPRk9DVVNfQ09ORklHICAxNgotI2RlZmluZSBWRkVfU1RBVFNfV0JfRVhQX0NPTkZJRyAgMTcKLSNkZWZpbmUgVkZFX1NUQVRTX0hJU1RPR1JBTV9DT05GSUcgIDE4Ci0jZGVmaW5lIFZGRV9PVVRQVVQxX0FDSyAgMTkKLSNkZWZpbmUgVkZFX09VVFBVVDJfQUNLICAyMAotI2RlZmluZSBWRkVfU1RBVFNfQVVUT0ZPQ1VTX0FDSyAgMjEKLSNkZWZpbmUgVkZFX1NUQVRTX1dCX0VYUF9BQ0sgIDIyCi0jZGVmaW5lIFZGRV9FUE9DSDFfQUNLICAyMwotI2RlZmluZSBWRkVfRVBPQ0gyX0FDSyAgMjQKLSNkZWZpbmUgVkZFX1VQREFURV9DQU1JRl9GUkFNRV9DT05GSUcgIDI1Ci0jZGVmaW5lIFZGRV9TWU5DX1RJTUVSMV9DT05GSUcgIDI2Ci0jZGVmaW5lIFZGRV9TWU5DX1RJTUVSMl9DT05GSUcgIDI3Ci0jZGVmaW5lIFZGRV9BU1lOQ19USU1FUjFfU1RBUlQgIDI4Ci0jZGVmaW5lIFZGRV9BU1lOQ19USU1FUjJfU1RBUlQgIDI5Ci0jZGVmaW5lIFZGRV9TVEFUU19BVVRPRk9DVVNfVVBEQVRFICAzMAotI2RlZmluZSBWRkVfU1RBVFNfV0JfRVhQX1VQREFURSAgMzEKLSNkZWZpbmUgVkZFX1JPTExfT0ZGX1VQREFURSAgMzMKLSNkZWZpbmUgVkZFX0RFTU9TQUlDdjNfQlBDX1VQREFURSAgMzQKLSNkZWZpbmUgVkZFX1RFU1RHRU5fU1RBUlQgIDM1Ci0jZGVmaW5lIFZGRV9TVEFUU19NQSAgMHhGRkZGRkZGRgotCi1zdHJ1Y3QgbXNnX2lkX21hcCBtc2dzX21hcFtdID0gewotCXtNU0dfUkVTRVRfQUNLLCBNU0dfSURfUkVTRVRfQUNLfSwKLQl7TVNHX1NUT1BfQUNLLCBNU0dfSURfU1RPUF9BQ0t9LAotCXtNU0dfU05BUFNIT1QsIE1TR19JRF9TTkFQU0hPVF9ET05FfSwKLQl7TVNHX0lMTEVHQUxfQ09NTUFORCwgVkZFX01BWH0sCi0Je01TR19TVEFSVF9BQ0ssIE1TR19JRF9TVEFSVF9BQ0t9LAotCXtNU0dfVVBEQVRFX0FDSywgTVNHX0lEX1VQREFURV9BQ0t9LAotCXtNU0dfT1VUUFVUMSwgVkZFX01BWH0sCi0Je01TR19PVVRQVVQyLCBWRkVfTUFYfSwKLQl7TVNHX1NUQVRTX0FGLCBNU0dfSURfU1RBVFNfQUZ9LAotCXtNU0dfU1RBVFNfV0UsIE1TR19JRF9TVEFUU19BV0JfQUVDfSwKLQl7TVNHX1NUQVRTX0hJU1RPR1JBTSwgTVNHX0lEX1NUQVRTX0lISVNUfSwKLQl7TVNHX0VQT0NIMSwgTVNHX0lEX0VQT0NIMX0sCi0Je01TR19FUE9DSDIsIE1TR19JRF9FUE9DSDJ9LAotCXtNU0dfVkZFX0VSUk9SLCBNU0dfSURfQ0FNSUZfRVJST1J9LAotCXtNU0dfU1lOQ19USU1FUjFfRE9ORSwgTVNHX0lEX1NZTkNfVElNRVIxX0RPTkV9LAotCXtNU0dfU1lOQ19USU1FUjJfRE9ORSwgTVNHX0lEX1NZTkNfVElNRVIyX0RPTkV9LAotCXtNU0dfQVNZTkNfVElNRVIxX0RPTkUsIE1TR19JRF9BU1lOQ19USU1FUjFfRE9ORX0sCi0Je01TR19BU1lOQ19USU1FUjJfRE9ORSwgTVNHX0lEX0FTWU5DX1RJTUVSMl9ET05FfSwKLQl7TVNHX0NBUFRVUkVfQ09NUExFVEUsIE1TR19DQVBUVVJFX0NPTVBMRVRFfSwKLQl7TVNHX1RBQkxFX0NNRF9BQ0ssIE1TR19UQUJMRV9DTURfQUNLfSwKLQl7TVNHX0VYUF9USU1FT1VUX0FDSywgTVNHX0VYUF9USU1FT1VUX0FDS30sCi0Je01TR19TT0YsIE1TR19JRF9TT0ZfQUNLfSwKLQl7TVNHX09VVFBVVF9ULCBNU0dfSURfT1VUUFVUX1R9LAotCXtNU0dfT1VUUFVUX1MsIE1TR19JRF9PVVRQVVRfU30sCi19OwotCi1zdHJ1Y3QgY21kX2lkX21hcCBjbWRzX21hcFtdID0gewotCXtWRkVfQ01EX0RVTU1ZXzAsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX1NFVF9DTEssIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX1JFU0VULCBWRkVfUkVTRVQsIFFEU1BfQ01EUVVFVUUsCi0JCQkiVkZFX0NNRF9SRVNFVCIsICJWRkVfUkVTRVQifSwKLQl7VkZFX0NNRF9TVEFSVCwgVkZFX1NUQVJULCBRRFNQX0NNRFFVRVVFLAotCQkJIlZGRV9DTURfU1RBUlQiLCAiVkZFX1NUQVJUIn0sCi0Je1ZGRV9DTURfVEVTVF9HRU5fU1RBUlQsIFZGRV9URVNUR0VOX1NUQVJULCBRRFNQX0NNRFFVRVVFLAotCQkiVkZFX0NNRF9URVNUX0dFTl9TVEFSVCIsICJWRkVfVEVTVEdFTl9TVEFSVCJ9LAotCXtWRkVfQ01EX09QRVJBVElPTl9DRkcsIFZGRV9NQVggLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9BWElfT1VUX0NGRywgVkZFX0FYSV9PVVRQVVRfQ09ORklHLCBRRFNQX1RBQkxFUVVFVUUsCi0JCSJWRkVfQ01EX0FYSV9PVVRfQ0ZHIiwgIlZGRV9BWElfT1VUUFVUX0NPTkZJRyJ9LAotCXtWRkVfQ01EX0NBTUlGX0NGRywgVkZFX0NBTUlGX0NPTkZJRywgUURTUF9DTURRVUVVRSwKLQkJCSJWRkVfQ01EX0NBTUlGX0NGRyIsICJWRkVfQ0FNSUZfQ09ORklHIn0sCi0Je1ZGRV9DTURfQVhJX0lOUFVUX0NGRywgVkZFX0FYSV9JTlBVVF9DT05GSUcsIFFEU1BfVEFCTEVRVUVVRSwKLQkJIlZGRV9DTURfQVhJX0lOUFVUX0NGRyIsICJWRkVfQVhJX0lOUFVUX0NPTkZJRyJ9LAotCXtWRkVfQ01EX0JMQUNLX0xFVkVMX0NGRywgVkZFX0JMQUNLX0xFVkVMX0NPTkZJRywgUURTUF9DTURRVUVVRSwKLQkJIlZGRV9DTURfQkxBQ0tfTEVWRUxfQ0ZHIiwgIlZGRV9CTEFDS19MRVZFTF9DT05GSUcifSwKLQl7VkZFX0NNRF9NRVNIX1JPTExfT0ZGX0NGRywgVkZFX1JPTExfT0ZGX0NPTkZJRywgUURTUF9UQUJMRVFVRVVFLAotCQkiVkZFX0NNRF9NRVNIX1JPTExfT0ZGX0NGRyIsICJWRkVfUk9MTF9PRkZfQ09ORklHIn0sCi0Je1ZGRV9DTURfREVNVVhfQ0ZHLCBWRkVfSU5QVVRfRk9STUFUX0NPTkZJRywgUURTUF9DTURRVUVVRSwKLQkJIlZGRV9DTURfREVNVVhfQ0ZHIiwgIlZGRV9JTlBVVF9GT1JNQVRfQ09ORklHIn0sCi0Je1ZGRV9DTURfRk9WX0NGRywgVkZFX0ZPVl9DUk9QLCBRRFNQX0NNRFFVRVVFLAotCQkiVkZFX0NNRF9GT1ZfQ0ZHIiwgIlZGRV9GT1ZfQ1JPUCJ9LAotCXtWRkVfQ01EX01BSU5fU0NBTEVSX0NGRywgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfV0JfQ0ZHLCBWRkVfV0hJVEVfQkFMQU5DRV9DT05GSUcsIFFEU1BfQ01EUVVFVUUsCi0JCSJWRkVfQ01EX1dCX0NGRyIsICJWRkVfV0hJVEVfQkFMQU5DRV9DT05GSUcifSwKLQl7VkZFX0NNRF9DT0xPUl9DT1JfQ0ZHLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9SR0JfR19DRkcsIFZGRV9SR0JfR0FNTUFfQ09ORklHLCBRRFNQX1RBQkxFUVVFVUUsCi0JCSJWRkVfQ01EX1JHQl9HX0NGRyIsICJWRkVfUkdCX0dBTU1BX0NPTkZJRyJ9LAotCXtWRkVfQ01EX0xBX0NGRywgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfQ0hST01BX0VOX0NGRywgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfQ0hST01BX1NVUF9DRkcsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX01DRV9DRkcsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX1NLX0VOSEFOX0NGRywgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfQVNGX0NGRywgVkZFX0FEQVBUSVZFX0ZJTFRFUl9DT05GSUcsIFFEU1BfQ01EUVVFVUUsCi0JCSJWRkVfQ01EX0FTRl9DRkciLCAiVkZFX0FEQVBUSVZFX0ZJTFRFUl9DT05GSUcifSwKLQl7VkZFX0NNRF9TMllfQ0ZHLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9TMkNiQ3JfQ0ZHLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9DSFJPTUFfU1VCU19DRkcsIFZGRV9DSFJPTUFfU1VCU0FNUExFX0NPTkZJRywgUURTUF9DTURRVUVVRSwKLQkJIlZGRV9DTURfQ0hST01BX1NVQlNfQ0ZHIiwgIlZGRV9DSFJPTUFfU1VCU0FNUExFX0NPTkZJRyJ9LAotCXtWRkVfQ01EX09VVF9DTEFNUF9DRkcsIFZGRV9PVVRQVVRfQ0xBTVBfQ09ORklHLCBRRFNQX0NNRFFVRVVFLAotCQkiVkZFX0NNRF9PVVRfQ0xBTVBfQ0ZHIiwgIlZGRV9PVVRQVVRfQ0xBTVBfQ09ORklHIn0sCi0Je1ZGRV9DTURfRlJBTUVfU0tJUF9DRkcsIFZGRV9GUkFNRV9TS0lQX0NPTkZJRywgUURTUF9DTURRVUVVRSwKLQkJIlZGRV9DTURfRlJBTUVfU0tJUF9DRkciLCAiVkZFX0ZSQU1FX1NLSVBfQ09ORklHIn0sCi0Je1ZGRV9DTURfRFVNTVlfMSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfRFVNTVlfMiwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfRFVNTVlfMywgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfVVBEQVRFLCBWRkVfVVBEQVRFLCBRRFNQX0NNRFFVRVVFLAotCQkiVkZFX0NNRF9VUERBVEUiLCAiVkZFX1VQREFURSJ9LAotCXtWRkVfQ01EX0JMX0xWTF9VUERBVEUsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX0RFTVVYX1VQREFURSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfRk9WX1VQREFURSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfTUFJTl9TQ0FMRVJfVVBEQVRFLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9XQl9VUERBVEUsIFZGRV9XSElURV9CQUxBTkNFX0NPTkZJRywgUURTUF9DTURRVUVVRSwKLQkJIlZGRV9DTURfV0JfVVBEQVRFIiwgIlZGRV9XSElURV9CQUxBTkNFX0NPTkZJRyJ9LAotCXtWRkVfQ01EX0NPTE9SX0NPUl9VUERBVEUsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX1JHQl9HX1VQREFURSwgVkZFX1JHQl9HQU1NQV9DT05GSUcsIFFEU1BfVEFCTEVRVUVVRSwKLQkJIlZGRV9DTURfUkdCX0dfVVBEQVRFIiwgIlZGRV9SR0JfR0FNTUFfQ09ORklHIn0sCi0Je1ZGRV9DTURfTEFfVVBEQVRFLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9DSFJPTUFfRU5fVVBEQVRFLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9DSFJPTUFfU1VQX1VQREFURSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfTUNFX1VQREFURSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfU0tfRU5IQU5fVVBEQVRFLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9TMkNiQ3JfVVBEQVRFLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9TMllfVVBEQVRFLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9BU0ZfVVBEQVRFLCBWRkVfQURBUFRJVkVfRklMVEVSX0NPTkZJRywgUURTUF9DTURRVUVVRSwKLQkJIlZGRV9DTURfQVNGX1VQREFURSIsICJWRkVfQURBUFRJVkVfRklMVEVSX0NPTkZJRyJ9LAotCXtWRkVfQ01EX0ZSQU1FX1NLSVBfVVBEQVRFLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9DQU1JRl9GUkFNRV9VUERBVEUsIFZGRV9VUERBVEVfQ0FNSUZfRlJBTUVfQ09ORklHLAotCQlRRFNQX0NNRFFVRVVFLCAiVkZFX0NNRF9DQU1JRl9GUkFNRV9VUERBVEUiLAotCQkiVkZFX1VQREFURV9DQU1JRl9GUkFNRV9DT05GSUcifSwKLQl7VkZFX0NNRF9TVEFUU19BRl9VUERBVEUsIFZGRV9TVEFUU19BVVRPRk9DVVNfVVBEQVRFLCBRRFNQX0NNRFFVRVVFLAotCQkiVkZFX0NNRF9TVEFUU19BRl9VUERBVEUiLCAiVkZFX1NUQVRTX0FVVE9GT0NVU19VUERBVEUifSwKLQl7VkZFX0NNRF9TVEFUU19BRV9VUERBVEUsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX1NUQVRTX0FXQl9VUERBVEUsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX1NUQVRTX1JTX1VQREFURSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfU1RBVFNfQ1NfVVBEQVRFLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9TVEFUU19TS0lOX1VQREFURSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfU1RBVFNfSUhJU1RfVVBEQVRFLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9EVU1NWV80LCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9FUE9DSDFfQUNLLCBWRkVfRVBPQ0gxX0FDSywgUURTUF9DTURRVUVVRSwKLQkJCSJWRkVfQ01EX0VQT0NIMV9BQ0siLCAiVkZFX0VQT0NIMV9BQ0sifSwKLQl7VkZFX0NNRF9FUE9DSDJfQUNLLCBWRkVfRVBPQ0gyX0FDSywgUURTUF9DTURRVUVVRSwKLQkJCSJWRkVfQ01EX0VQT0NIMl9BQ0siLCAiVkZFX0VQT0NIMl9BQ0sifSwKLQl7VkZFX0NNRF9TVEFSVF9SRUNPUkRJTkcsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX1NUT1BfUkVDT1JESU5HLCBWRkVfTUFYICwgVkZFX01BWH0sCi0Je1ZGRV9DTURfRFVNTVlfNSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfRFVNTVlfNiwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfQ0FQVFVSRSwgVkZFX1NUQVJULCBRRFNQX0NNRFFVRVVFLAotCQkJIlZGRV9DTURfQ0FQVFVSRSIsICJWRkVfU1RBUlQifSwKLQl7VkZFX0NNRF9EVU1NWV83LCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9TVE9QLCBWRkVfU1RPUCwgUURTUF9DTURRVUVVRSwgIlZGRV9DTURfU1RPUCIsICJWRkVfU1RPUCJ9LAotCXtWRkVfQ01EX0dFVF9IV19WRVJTSU9OLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9HRVRfRlJBTUVfU0tJUF9DT1VOVFMsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX09VVFBVVDFfQlVGRkVSX0VOUSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfT1VUUFVUMl9CVUZGRVJfRU5RLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9PVVRQVVQzX0JVRkZFUl9FTlEsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX0pQRUdfT1VUX0JVRl9FTlEsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX1JBV19PVVRfQlVGX0VOUSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfUkFXX0lOX0JVRl9FTlEsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX1NUQVRTX0FGX0VOUSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfU1RBVFNfQUVfRU5RLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9TVEFUU19BV0JfRU5RLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9TVEFUU19SU19FTlEsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX1NUQVRTX0NTX0VOUSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfU1RBVFNfU0tJTl9FTlEsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX1NUQVRTX0lISVNUX0VOUSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfRFVNTVlfOCwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfSlBFR19FTkNfQ0ZHLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9EVU1NWV85LCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9TVEFUU19BRl9TVEFSVCwgVkZFX1NUQVRTX0FVVE9GT0NVU19DT05GSUcsIFFEU1BfQ01EUVVFVUUsCi0JCSJWRkVfQ01EX1NUQVRTX0FGX1NUQVJUIiwgIlZGRV9TVEFUU19BVVRPRk9DVVNfQ09ORklHIn0sCi0Je1ZGRV9DTURfU1RBVFNfQUZfU1RPUCwgVkZFX1NUQVRTX0FVVE9GT0NVU19DT05GSUcsIFFEU1BfQ01EUVVFVUUsCi0JCSJWRkVfQ01EX1NUQVRTX0FGX1NUT1AiLCAiVkZFX1NUQVRTX0FVVE9GT0NVU19DT05GSUcifSwKLQl7VkZFX0NNRF9TVEFUU19BRV9TVEFSVCwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfU1RBVFNfQUVfU1RPUCwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfU1RBVFNfQVdCX1NUQVJULCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9TVEFUU19BV0JfU1RPUCwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfU1RBVFNfUlNfU1RBUlQsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX1NUQVRTX1JTX1NUT1AsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX1NUQVRTX0NTX1NUQVJULCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9TVEFUU19DU19TVE9QLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9TVEFUU19TS0lOX1NUQVJULCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9TVEFUU19TS0lOX1NUT1AsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX1NUQVRTX0lISVNUX1NUQVJULCBWRkVfU1RBVFNfSElTVE9HUkFNX0NPTkZJRywgUURTUF9DTURRVUVVRSwKLQkJIlZGRV9DTURfU1RBVFNfSUhJU1RfU1RBUlQiLCAiVkZFX1NUQVRTX0hJU1RPR1JBTV9DT05GSUcifSwKLQl7VkZFX0NNRF9TVEFUU19JSElTVF9TVE9QLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9EVU1NWV8xMCwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfU1lOQ19USU1FUl9TRVRUSU5HLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9BU1lOQ19USU1FUl9TRVRUSU5HLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9MSVZFU0hPVCwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfTEFfU0VUVVAsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX0xJTkVBUklaQVRJT05fQ0ZHLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9ERU1PU0FJQ1YzLCBWRkVfREVNT1NBSUN2M19DRkcsIFFEU1BfVEFCTEVRVUVVRSwKLQkJIlZGRV9DTURfREVNT1NBSUNWMyIsICJWRkVfREVNT1NBSUN2M19DRkcifSwKLQl7VkZFX0NNRF9ERU1PU0FJQ1YzX0FCQ0NfQ0ZHLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9ERU1PU0FJQ1YzX0RCQ0NfQ0ZHLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9ERU1PU0FJQ1YzX0RCUENfQ0ZHLCBWRkVfREVNT1NBSUN2M19CUENfQ0ZHLCBRRFNQX1RBQkxFUVVFVUUsCi0JCSJWRkVfQ01EX0RFTU9TQUlDVjNfREJQQ19DRkciLCAiVkZFX0RFTU9TQUlDdjNfQlBDX0NGRyJ9LAotCXtWRkVfQ01EX0RFTU9TQUlDVjNfQUJGX0NGRywgVkZFX0RFTU9TQUlDdjNfQUJGX0NGRywgUURTUF9UQUJMRVFVRVVFLAotCQkiVkZFX0NNRF9ERU1PU0FJQ1YzX0FCRl9DRkciLCAiVkZFX0RFTU9TQUlDdjNfQUJGX0NGRyJ9LAotCXtWRkVfQ01EX0RFTU9TQUlDVjNfQUJDQ19VUERBVEUsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX0RFTU9TQUlDVjNfREJDQ19VUERBVEUsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX0RFTU9TQUlDVjNfREJQQ19VUERBVEUsIFZGRV9ERU1PU0FJQ3YzX0JQQ19VUERBVEUsCi0JCVFEU1BfQ01EUVVFVUUsICJWRkVfQ01EX0RFTU9TQUlDVjNfREJQQ19VUERBVEUiLAotCQkiVkZFX0RFTU9TQUlDdjNfQlBDX1VQREFURSJ9LAotCXtWRkVfQ01EX1hCQVJfQ0ZHLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9NT0RVTEVfQ0ZHLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9aU0wsIFZGRV9TVEFSVCwgUURTUF9DTURRVUVVRSwKLQkJCSJWRkVfQ01EX1pTTCIsICJWRkVfU1RBUlQifSwKLQl7VkZFX0NNRF9MSU5FQVJJWkFUSU9OX1VQREFURSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfREVNT1NBSUNWM19BQkZfVVBEQVRFLCBWRkVfREVNT1NBSUN2M19BQkZfQ0ZHLAotCQlRRFNQX1RBQkxFUVVFVUUsICJWRkVfQ01EX0RFTU9TQUlDVjNfQUJGX1VQREFURSIsCi0JCSJWRkVfREVNT1NBSUN2M19BQkZfQ0ZHIn0sCi0Je1ZGRV9DTURfQ0xGX0NGRywgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfQ0xGX0xVTUFfVVBEQVRFLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9DTEZfQ0hST01BX1VQREFURSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfUENBX1JPTExfT0ZGX0NGRywgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfUENBX1JPTExfT0ZGX1VQREFURSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfR0VUX1JFR19EVU1QLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9HRVRfTElORUFSSVpBVE9OX1RBQkxFLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9HRVRfTUVTSF9ST0xMT0ZGX1RBQkxFLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9HRVRfUENBX1JPTExPRkZfVEFCTEUsIFZGRV9NQVgsIFZGRV9NQVh9LAotCXtWRkVfQ01EX0dFVF9SR0JfR19UQUJMRSwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfR0VUX0xBX1RBQkxFLCBWRkVfTUFYLCBWRkVfTUFYfSwKLQl7VkZFX0NNRF9ERU1PU0FJQ1YzX1VQREFURSwgVkZFX0RFTU9TQUlDdjNfQ0ZHLCBRRFNQX1RBQkxFUVVFVUUsCi0JCSJWRkVfQ01EX0RFTU9TQUlDVjNfVVBEQVRFIiwgIlZGRV9ERU1PU0FJQ3YzX0NGRyJ9LAotCXtWRkVfQ01EX0FDVElWRV9SRUdJT05fQ0ZHLCBWRkVfQUNUSVZFX1JFR0lPTl9DT05GSUcsIFFEU1BfQ01EUVVFVUUsCi0JCSJWRkVfQ01EX0FDVElWRV9SRUdJT05fQ0ZHIiwgIlZGRV9BQ1RJVkVfUkVHSU9OX0NPTkZJRyJ9LAotCXtWRkVfQ01EX0NPTE9SX1BST0NFU1NJTkdfQ09ORklHLCBWRkVfQ09MT1JfUFJPQ0VTU0lOR19DT05GSUcsCi0JCVFEU1BfQ01EUVVFVUUsICJWRkVfQ01EX0NPTE9SX1BST0NFU1NJTkdfQ09ORklHIiwKLQkJIlZGRV9DT0xPUl9QUk9DRVNTSU5HX0NPTkZJRyJ9LAotCXtWRkVfQ01EX1NUQVRTX1dCX0FFQ19DT05GSUcsIFZGRV9TVEFUU19XQl9FWFBfQ09ORklHLCBRRFNQX0NNRFFVRVVFLAotCQkiVkZFX0NNRF9TVEFUU19XQl9BRUNfQ09ORklHIiwgIlZGRV9TVEFUU19XQl9FWFBfQ09ORklHIn0sCi0Je1ZGRV9DTURfU1RBVFNfV0JfQUVDX1VQREFURSwgVkZFX1NUQVRTX1dCX0VYUF9VUERBVEUsIFFEU1BfQ01EUVVFVUUsCi0JCSJWRkVfQ01EX1NUQVRTX1dCX0FFQ19VUERBVEUiLCAiVkZFX1NUQVRTX1dCX0VYUF9VUERBVEUifSwKLQl7VkZFX0NNRF9ZX0dBTU1BX0NPTkZJRywgVkZFX1lfR0FNTUFfQ09ORklHLCBRRFNQX1RBQkxFUVVFVUUsCi0JCSJWRkVfQ01EX1lfR0FNTUFfQ09ORklHIiwgIlZGRV9ZX0dBTU1BX0NPTkZJRyJ9LAotCXtWRkVfQ01EX1NDQUxFX09VVFBVVDFfQ09ORklHLCBWRkVfU0NBTEVfT1VUUFVUMV9DT05GSUcsCi0JCVFEU1BfU0NBTEVRVUVVRSwgIlZGRV9DTURfU0NBTEVfT1VUUFVUMV9DT05GSUciLAotCQkiVkZFX1NDQUxFX09VVFBVVDFfQ09ORklHIn0sCi0Je1ZGRV9DTURfU0NBTEVfT1VUUFVUMl9DT05GSUcsIFZGRV9TQ0FMRV9PVVRQVVQyX0NPTkZJRywKLQkJUURTUF9TQ0FMRVFVRVVFLCAiVkZFX0NNRF9TQ0FMRV9PVVRQVVQyX0NPTkZJRyIsCi0JCSJWRkVfU0NBTEVfT1VUUFVUMl9DT05GSUcifSwKLQl7VkZFX0NNRF9DQVBUVVJFX1JBVywgVkZFX1NUQVJULCBRRFNQX0NNRFFVRVVFLAotCQkJIlZGRV9DTURfQ0FQVFVSRV9SQVciLCAiVkZFX1NUQVJUIn0sCi0Je1ZGRV9DTURfU1RPUF9MSVZFU0hPVCwgVkZFX01BWCwgVkZFX01BWH0sCi0Je1ZGRV9DTURfUkVDT05GSUdfVkZFLCBWRkVfTUFYLCBWRkVfTUFYfSwKLX07Ci0KLQotc3RhdGljIHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKnFjYW1fbW9kOwotc3RhdGljIHN0cnVjdCBtc21fYWRzcF9tb2R1bGUgKnZmZV9tb2Q7Ci1zdGF0aWMgdm9pZCAqZXh0ZGF0YTsKLXN0YXRpYyB1aW50MzJfdCBleHRsZW47Ci0KLXN0cnVjdCBtdXRleCB2ZmVfbG9jazsKLXN0YXRpYyB1aW50OF90IHZmZXN0b3BwZWQ7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3RvcF9ldmVudCBzdG9wZXZlbnQ7Ci0KLXN0YXRpYyB1aW50MzJfdCBvcF9tb2RlOwotc3RhdGljIHVpbnQzMl90IHJhd19tb2RlOwotc3RhdGljIHN0cnVjdCB2ZmUyeF9jdHJsX3R5cGUgKnZmZTJ4X2N0cmw7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZmZTJ4X3N0YXRzX2RxYnVmKGVudW0gbXNtX3N0YXRzX2VudW1fdHlwZSBzdGF0c190eXBlKQotewotCXN0cnVjdCBtc21fc3RhdHNfbWV0YV9idWYgKmJ1ZiA9IE5VTEw7Ci0JaW50IHJjID0gMDsKLQotCXJjID0gdmZlMnhfY3RybC0+c3RhdHNfb3BzLmRxYnVmKHZmZTJ4X2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsLAotCQkJCQkJCSAgc3RhdHNfdHlwZSwgJmJ1Zik7Ci0JaWYgKHJjIDwgMCkgewotCQlDREJHKCIlczogZHEgc3RhdHMgYnVmICh0eXBlID0gJWQpIGVyciA9ICVkIiwKLQkJCSAgIF9fZnVuY19fLCBzdGF0c190eXBlLCByYyk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gYnVmLT5wYWRkcjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgdmZlMnhfc3RhdHNfZmx1c2hfZW5xdWV1ZSgKLQllbnVtIG1zbV9zdGF0c19lbnVtX3R5cGUgc3RhdHNfdHlwZSkKLXsKLQlzdHJ1Y3QgbXNtX3N0YXRzX2J1ZnEgKmJ1ZnEgPSBOVUxMOwotCXN0cnVjdCBtc21fc3RhdHNfbWV0YV9idWYgKnN0YXRzX2J1ZiA9IE5VTEw7Ci0JaW50IHJjID0gMDsKLQlpbnQgaTsKLQotCS8qCi0JICogUGFzc2luZyBOVUxMIGZvciBpb24gY2xpZW50IGFzIHRoZSBidWZmZXJzIGFyZSBhbHJlYWR5Ci0JICogbWFwcGVkIGF0IHRoaXMgc3RhZ2UsIGNsaWVudCBpcyBub3QgcmVxdWlyZWQsIGZsdXNoIGFsbAotCSAqIHRoZSBidWZmZXJzLCBhbmQgYnVmZmVycyBtb3ZlIHRvIFBSRVBBUkUgc3RhdGUKLQkgKi8KLQlyYyA9IHZmZTJ4X2N0cmwtPnN0YXRzX29wcy5idWZxX2ZsdXNoKAotCQkJdmZlMnhfY3RybC0+c3RhdHNfb3BzLnN0YXRzX2N0cmwsCi0JCQlzdGF0c190eXBlLCBOVUxMKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IGRxIHN0YXRzIGJ1ZiAodHlwZSA9ICVkKSBlcnIgPSAlZCIsCi0JCQkgX19mdW5jX18sIHN0YXRzX3R5cGUsIHJjKTsKLQkJcmV0dXJuIDBMOwotCX0KLQotCS8qIFF1ZXVlIGFsbCB0aGUgYnVmZmVycyBiYWNrIHRvIFFVRVVFRCBzdGF0ZSAqLwotCWJ1ZnEgPSB2ZmUyeF9jdHJsLT5zdGF0c19jdHJsLmJ1ZnFbc3RhdHNfdHlwZV07Ci0JZm9yIChpID0gMDsgaSA8IGJ1ZnEtPm51bV9idWZzOyBpKyspIHsKLQkJc3RhdHNfYnVmID0gJmJ1ZnEtPmJ1ZnNbaV07Ci0JCXJjID0gdmZlMnhfY3RybC0+c3RhdHNfb3BzLmVucXVldWVfYnVmKAotCQkJCXZmZTJ4X2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsLAotCQkJCSYoc3RhdHNfYnVmLT5pbmZvKSwgTlVMTCwgLTEpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6IGRxIHN0YXRzIGJ1ZiAodHlwZSA9ICVkKSBlcnIgPSAlZCIsCi0JCQkJCSBfX2Z1bmNfXywgc3RhdHNfdHlwZSwgcmMpOwotCQkJCXJldHVybiByYzsKLQkJCX0KLQl9Ci0JcmV0dXJuIDBMOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2ZmUyeF9zdGF0c191bnJlZ2J1ZigKLQlzdHJ1Y3QgbXNtX3N0YXRzX3JlcWJ1ZiAqcmVxX2J1ZikKLXsKLQlpbnQgaSA9IDAsIHJjID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCByZXFfYnVmLT5udW1fYnVmOyBpKyspIHsKLQkJcmMgPSB2ZmUyeF9jdHJsLT5zdGF0c19vcHMuYnVmX3VucHJlcGFyZSgKLQkJCXZmZTJ4X2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsLAotCQkJcmVxX2J1Zi0+c3RhdHNfdHlwZSwgaSwKLQkJCXZmZTJ4X2N0cmwtPnN0YXRzX29wcy5jbGllbnQsIC0xKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogdW5yZWcgc3RhdHMgYnVmICh0eXBlID0gJWQpIGVyciA9ICVkIiwKLQkJCQlfX2Z1bmNfXywgcmVxX2J1Zi0+c3RhdHNfdHlwZSwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0JcmV0dXJuIDBMOwotfQotCi1zdGF0aWMgaW50IHZmZTJ4X3N0YXRzX2J1Zl9pbml0KGVudW0gbXNtX3N0YXRzX2VudW1fdHlwZSB0eXBlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGkgPSAwLCByYyA9IDA7Ci0JaWYgKHR5cGUgPT0gTVNNX1NUQVRTX1RZUEVfQUYpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTJ4X2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCQlyYyA9IHZmZTJ4X3N0YXRzX2ZsdXNoX2VucXVldWUoTVNNX1NUQVRTX1RZUEVfQUYpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBkcSBzdGF0cyBidWYgZXJyID0gJWQiLAotCQkJCSBfX2Z1bmNfXywgcmMpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMnhfY3RybC0+c3RhdHNfYnVmcV9sb2NrLAotCQkJCWZsYWdzKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTJ4X2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUyeF9jdHJsLT5zdGF0c19idWZxX2xvY2ssIGZsYWdzKTsKLQkJaWYgKHR5cGUgPT0gTVNNX1NUQVRTX1RZUEVfQUVfQVcpCi0JCQl2ZmUyeF9jdHJsLT5zdGF0c193ZV9idWZfcHRyW2ldID0KLQkJCQl2ZmUyeF9zdGF0c19kcWJ1Zih0eXBlKTsKLQkJZWxzZQotCQkJdmZlMnhfY3RybC0+c3RhdHNfYWZfYnVmX3B0cltpXSA9Ci0JCQkJdmZlMnhfc3RhdHNfZHFidWYodHlwZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTJ4X2N0cmwtPnN0YXRzX2J1ZnFfbG9jaywgZmxhZ3MpOwotCQlpZiAoIXZmZTJ4X2N0cmwtPnN0YXRzX3dlX2J1Zl9wdHJbaV0pIHsKLQkJCXByX2VycigiJXM6IGRxIGVycm9yIHR5cGUgJWQgIiwgX19mdW5jX18sIHR5cGUpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2ZmUyeF9zdGF0c19lbnF1ZXVlYnVmKAotCXN0cnVjdCBtc21fc3RhdHNfYnVmX2luZm8gKmluZm8sIHN0cnVjdCB2ZmVfc3RhdHNfYWNrICpzYWNrKQotewotCXN0cnVjdCBtc21fc3RhdHNfYnVmcSAqYnVmcSA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9zdGF0c19tZXRhX2J1ZiAqc3RhdHNfYnVmID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX3N0YXRzX21ldGFfYnVmICpidWYgPSBOVUxMOwotCWludCByYyA9IDA7Ci0KLQlidWZxID0gdmZlMnhfY3RybC0+c3RhdHNfY3RybC5idWZxW2luZm8tPnR5cGVdOwotCXN0YXRzX2J1ZiA9ICZidWZxLT5idWZzW2luZm8tPmJ1Zl9pZHhdOwotCi0JQ0RCRygidmZlMnhfc3RhdHNfZW5xdWV1ZWJ1ZjogJWRcbiIsIHN0YXRzX2J1Zi0+c3RhdGUpOwotCWlmIChzdGF0c19idWYtPnN0YXRlID09IE1TTV9TVEFUU19CVUZGRVJfU1RBVEVfSU5JVElBTElaRUQgfHwKLQkJc3RhdHNfYnVmLT5zdGF0ZSA9PSBNU01fU1RBVFNfQlVGRkVSX1NUQVRFX1BSRVBBUkVEKSB7Ci0JCXJjID0gdmZlMnhfY3RybC0+c3RhdHNfb3BzLmVucXVldWVfYnVmKAotCQkJCSZ2ZmUyeF9jdHJsLT5zdGF0c19jdHJsLAotCQkJCWluZm8sIHZmZTJ4X2N0cmwtPnN0YXRzX29wcy5jbGllbnQsIC0xKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogZW5xdWV1ZV9idWYgKHR5cGUgPSAlZCksIGluZGV4IDogJWQsIGVyciA9ICVkIiwKLQkJCQkgX19mdW5jX18sIGluZm8tPnR5cGUsIGluZm8tPmJ1Zl9pZHgsIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQotCi0JfSBlbHNlIHsKLQkJcmMgPSB2ZmUyeF9jdHJsLT5zdGF0c19vcHMucXVlcnlidWYoCi0JCQkJdmZlMnhfY3RybC0+c3RhdHNfb3BzLnN0YXRzX2N0cmwsIGluZm8sICZidWYpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBxdWVyeWJ1ZiAodHlwZSA9ICVkKSwgaW5kZXggOiAlZCwgZXJyID0gJWQiLAotCQkJCV9fZnVuY19fLCBpbmZvLT50eXBlLCBpbmZvLT5idWZfaWR4LCByYyk7Ci0JCQlyZXR1cm4gcmM7Ci0JfQotCQlzdGF0c19idWYtPnN0YXRlID0gTVNNX1NUQVRTX0JVRkZFUl9TVEFURV9ERVFVRVVFRDsKLQlpZiAoaW5mby0+dHlwZSA9PSBNU01fU1RBVFNfVFlQRV9BRV9BVykgewotCQlzYWNrLT5oZWFkZXIgPSBWRkVfU1RBVFNfV0JfRVhQX0FDSzsKLQkJc2Fjay0+YnVmYWRkciA9ICh2b2lkICopKHVpbnQzMl90ICopYnVmLT5wYWRkcjsKLQl9IGVsc2UgaWYgKGluZm8tPnR5cGUgPT0gTVNNX1NUQVRTX1RZUEVfQUYpIHsKLQkJc2Fjay0+aGVhZGVyID0gVkZFX1NUQVRTX0FVVE9GT0NVU19BQ0s7Ci0JCXNhY2stPmJ1ZmFkZHIgPSAodm9pZCAqKSh1aW50MzJfdCAqKWJ1Zi0+cGFkZHI7Ci0JfSBlbHNlCi0JCXByX2VycigiJXM6IEludmFsaWQgc3RhdHM6IHNob3VsZCBuZXZlciBjb21lIGhlcmVcbiIsIF9fZnVuY19fKTsKLQl9Ci0JcmV0dXJuIDBMOwotfQotCi1zdGF0aWMgbG9uZyB2ZmUyeF9zdGF0c19idWZxX3N1Yl9pb2N0bChzdHJ1Y3QgbXNtX3ZmZV9jZmdfY21kICpjbWQsCi0Jdm9pZCAqaW9uX2NsaWVudCkKLXsKLQlsb25nIHJjID0gMDsKLQotCXN3aXRjaCAoY21kLT5jbWRfdHlwZSkgewotCWNhc2UgVkZFX0NNRF9TVEFUU19SRVFCVUY6Ci0JCWlmICghdmZlMnhfY3RybC0+c3RhdHNfb3BzLnN0YXRzX2N0cmwpIHsKLQkJCS8qIHN0YXRzX2N0cmwgaGFzIG5vdCBiZWVuIGluaXQgeWV0ICovCi0JCQlyYyA9IG1zbV9zdGF0c19idWZfb3BzX2luaXQoCi0JCQkJCSZ2ZmUyeF9jdHJsLT5zdGF0c19jdHJsLAotCQkJCQkoc3RydWN0IGlvbl9jbGllbnQgKilpb25fY2xpZW50LAotCQkJCQkmdmZlMnhfY3RybC0+c3RhdHNfb3BzKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBjYW5ub3QgaW5pdCBzdGF0cyBvcHMiLCBfX2Z1bmNfXyk7Ci0JCQkJZ290byBlbmQ7Ci0JCQl9Ci0JCQlyYyA9IHZmZTJ4X2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsX2luaXQoCi0JCQkJCSZ2ZmUyeF9jdHJsLT5zdGF0c19jdHJsKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBjYW5ub3QgaW5pdCBzdGF0c19jdHJsIG9wcyIsCi0JCQkJCSBfX2Z1bmNfXyk7Ci0JCQkJbWVtc2V0KCZ2ZmUyeF9jdHJsLT5zdGF0c19vcHMsIDAsCi0JCQkJc2l6ZW9mKHZmZTJ4X2N0cmwtPnN0YXRzX29wcykpOwotCQkJCWdvdG8gZW5kOwotCQkJfQotCQkJaWYgKHNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX3JlcWJ1ZikgIT0gY21kLT5sZW5ndGgpIHsKLQkJCQkvKiBlcnJvci4gdGhlIGxlbmd0aCBub3QgbWF0Y2ggKi8KLQkJCQlwcl9lcnIoIiVzOiBzdGF0cyByZXFidWYgaW5wdXQgc2l6ZSA9ICVkLFxuIgotCQkJCQkic3RydWN0IHNpemUgPSAlZCwgbWlzbWF0Y2hcbiIsCi0JCQkJCV9fZnVuY19fLCBjbWQtPmxlbmd0aCwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfcmVxYnVmKSk7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gZW5kOwotCQkJfQotCQl9Ci0JCXJjID0gdmZlMnhfY3RybC0+c3RhdHNfb3BzLnJlcWJ1ZigKLQkJCQkmdmZlMnhfY3RybC0+c3RhdHNfY3RybCwKLQkJCQkoc3RydWN0IG1zbV9zdGF0c19yZXFidWYgKiljbWQtPnZhbHVlLAotCQkJCXZmZTJ4X2N0cmwtPnN0YXRzX29wcy5jbGllbnQpOwotCQlicmVhazsKLQkJY2FzZSBWRkVfQ01EX1NUQVRTX0VOUVVFVUVCVUY6IHsKLQkJCWlmIChzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19idWZfaW5mbykgIT0gY21kLT5sZW5ndGgpIHsKLQkJCQkvKiBlcnJvci4gdGhlIGxlbmd0aCBub3QgbWF0Y2ggKi8KLQkJCQlwcl9lcnIoIiVzOiBzdGF0cyBlbnF1ZXVlYnVmIGlucHV0IHNpemUgPSAlZCxcbiIKLQkJCQkJInN0cnVjdCBzaXplID0gJWQsIG1pc21hdGNoXG4iLAotCQkJCQkgX19mdW5jX18sIGNtZC0+bGVuZ3RoLAotCQkJCQlzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19idWZfaW5mbykpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIGVuZDsKLQkJfQotCQlyYyA9IHZmZTJ4X2N0cmwtPnN0YXRzX29wcy5lbnF1ZXVlX2J1ZigKLQkJCQkmdmZlMnhfY3RybC0+c3RhdHNfY3RybCwKLQkJCQkoc3RydWN0IG1zbV9zdGF0c19idWZfaW5mbyAqKWNtZC0+dmFsdWUsCi0JCQkJdmZlMnhfY3RybC0+c3RhdHNfb3BzLmNsaWVudCwgLTEpOwotCX0KLQlicmVhazsKLQljYXNlIFZGRV9DTURfU1RBVFNfRkxVU0hfQlVGUTogewotCQlzdHJ1Y3QgbXNtX3N0YXRzX2ZsdXNoX2J1ZnEgKmZsdXNoX3JlcSA9IE5VTEw7Ci0JCWZsdXNoX3JlcSA9IChzdHJ1Y3QgbXNtX3N0YXRzX2ZsdXNoX2J1ZnEgKiljbWQtPnZhbHVlOwotCQlpZiAoc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfZmx1c2hfYnVmcSkgIT0gY21kLT5sZW5ndGgpIHsKLQkJCS8qIGVycm9yLiB0aGUgbGVuZ3RoIG5vdCBtYXRjaCAqLwotCQkJcHJfZXJyKCIlczogc3RhdHMgZmx1c2ggcXVldWUgaW5wdXQgc2l6ZSA9ICVkLFxuIgotCQkJCSJzdHJ1Y3Qgc2l6ZSA9ICVkLCBtaXNtYXRjaFxuIiwKLQkJCQlfX2Z1bmNfXywgY21kLT5sZW5ndGgsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfZmx1c2hfYnVmcSkpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIGVuZDsKLQkJfQotCQlyYyA9IHZmZTJ4X2N0cmwtPnN0YXRzX29wcy5idWZxX2ZsdXNoKAotCQkJCSZ2ZmUyeF9jdHJsLT5zdGF0c19jdHJsLAotCQkJCShlbnVtIG1zbV9zdGF0c19lbnVtX3R5cGUpZmx1c2hfcmVxLT5zdGF0c190eXBlLAotCQkJCXZmZTJ4X2N0cmwtPnN0YXRzX29wcy5jbGllbnQpOwotCX0KLQlicmVhazsKLQljYXNlIFZGRV9DTURfU1RBVFNfVU5SRUdCVUY6Ci0JewotCQlzdHJ1Y3QgbXNtX3N0YXRzX3JlcWJ1ZiAqcmVxX2J1ZiA9IE5VTEw7Ci0JCXJlcV9idWYgPSAoc3RydWN0IG1zbV9zdGF0c19yZXFidWYgKiljbWQtPnZhbHVlOwotCQlpZiAoc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfcmVxYnVmKSAhPSBjbWQtPmxlbmd0aCkgewotCQkJLyogZXJyb3IuIHRoZSBsZW5ndGggbm90IG1hdGNoICovCi0JCQlwcl9lcnIoIiVzOiBzdGF0cyByZXFidWYgaW5wdXQgc2l6ZSA9ICVkLFxuIgotCQkJCSJzdHJ1Y3Qgc2l6ZSA9ICVkLCBtaXRjaCBtYXRjaFxuIiwKLQkJCQkgX19mdW5jX18sIGNtZC0+bGVuZ3RoLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX3JlcWJ1ZikpOwotCQkJcmMgPSAtRUlOVkFMIDsKLQkJCWdvdG8gZW5kOwotCQl9Ci0JCXJjID0gdmZlMnhfc3RhdHNfdW5yZWdidWYocmVxX2J1Zik7Ci0JfQotCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLTE7Ci0JCXByX2VycigiJXM6IGNtZF90eXBlICVkIG5vdCBzdXBwb3J0ZWQiLAotCQkJIF9fZnVuY19fLCBjbWQtPmNtZF90eXBlKTsKLQlicmVhazsKLQl9Ci1lbmQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCB2ZmUyeF9zZW5kX2lzcF9tc2coCi0Jc3RydWN0IHZmZTJ4X2N0cmxfdHlwZSAqdmN0cmwsCi0JdWludDMyX3QgaXNwX21zZ19pZCkKLXsKLQlzdHJ1Y3QgaXNwX21zZ19ldmVudCBpc3BfbXNnX2V2dDsKLQotCWlzcF9tc2dfZXZ0Lm1zZ19pZCA9IGlzcF9tc2dfaWQ7Ci0JaXNwX21zZ19ldnQuc29mX2NvdW50ID0gdmZlMnhfY3RybC0+dmZlRnJhbWVJZDsKLQl2NGwyX3N1YmRldl9ub3RpZnkoJnZjdHJsLT5zdWJkZXYsCi0JCQlOT1RJRllfSVNQX01TR19FVlQsCi0JCQkodm9pZCAqKSZpc3BfbXNnX2V2dCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9zZW5kX291dG1zZyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1aW50OF90IG1zZ2lkLAotCQl1aW50MzJfdCBjaDBfcGFkZHIsIHVpbnQzMl90IGNoMV9wYWRkcikKLXsKLQlzdHJ1Y3QgaXNwX21zZ19vdXRwdXQgbXNnOwotCi0JbXNnLm91dHB1dF9pZCA9IG1zZ2lkOwotCW1zZy5idWYuaW5zdF9oYW5kbGUgPSAwOwotCW1zZy5idWYuY2hfcGFkZHJbMF0gICAgID0gY2gwX3BhZGRyOwotCW1zZy5idWYuY2hfcGFkZHJbMV0gICAgID0gY2gxX3BhZGRyOwotCW1zZy5mcmFtZUNvdW50ZXIgPSB2ZmUyeF9jdHJsLT52ZmVGcmFtZUlkOwotCi0JdjRsMl9zdWJkZXZfbm90aWZ5KCZ2ZmUyeF9jdHJsLT5zdWJkZXYsCi0JCQlOT1RJRllfVkZFX01TR19PVVQsCi0JCQkmbXNnKTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9zZW5kX3N0YXRzX21zZyh1aW50MzJfdCBidWZfYWRkciwgdWludDMyX3QgbXNnX2lkKQotewotCXN0cnVjdCBpc3BfbXNnX3N0YXRzIG1zZ19zdGF0czsKLQl2b2lkICp2YWRkciA9IE5VTEw7Ci0JaW50IHJjOwotCi0JbXNnX3N0YXRzLmZyYW1lQ291bnRlciA9IHZmZTJ4X2N0cmwtPnZmZUZyYW1lSWQ7Ci0JbXNnX3N0YXRzLmJ1ZmZlciAgICAgICA9IGJ1Zl9hZGRyOwotCW1zZ19zdGF0cy5pZCAgICAgICAgICAgPSBtc2dfaWQ7Ci0KLQlpZiAoTVNHX0lEX1NUQVRTX0FXQl9BRUMgPT0gbXNnX2lkKQotCQlyYyA9IHZmZTJ4X2N0cmwtPnN0YXRzX29wcy5kaXNwYXRjaCgKLQkJCXZmZTJ4X2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsLAotCQkJTVNNX1NUQVRTX1RZUEVfQUVfQVcsIGJ1Zl9hZGRyLAotCQkJJm1zZ19zdGF0cy5idWZfaWR4LCAmdmFkZHIsICZtc2dfc3RhdHMuZmQsCi0JCQl2ZmUyeF9jdHJsLT5zdGF0c19vcHMuY2xpZW50KTsKLQllbHNlIGlmIChNU0dfSURfU1RBVFNfQUYgPT0gbXNnX2lkKQotCQlyYyA9IHZmZTJ4X2N0cmwtPnN0YXRzX29wcy5kaXNwYXRjaCgKLQkJCXZmZTJ4X2N0cmwtPnN0YXRzX29wcy5zdGF0c19jdHJsLAotCQkJTVNNX1NUQVRTX1RZUEVfQUYsIGJ1Zl9hZGRyLAotCQkJJm1zZ19zdGF0cy5idWZfaWR4LCAmdmFkZHIsICZtc2dfc3RhdHMuZmQsCi0JCQl2ZmUyeF9jdHJsLT5zdGF0c19vcHMuY2xpZW50KTsKLQotCXY0bDJfc3ViZGV2X25vdGlmeSgmdmZlMnhfY3RybC0+c3ViZGV2LAotCQkJCU5PVElGWV9WRkVfTVNHX1NUQVRTLAotCQkJCSZtc2dfc3RhdHMpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfN3hfb3BzKHZvaWQgKmRyaXZlcl9kYXRhLCB1bnNpZ25lZCBpZCwgc2l6ZV90IGxlbiwKLQkJdm9pZCAoKmdldGV2ZW50KSh2b2lkICpwdHIsIHNpemVfdCBsZW4pKQotewotCXVpbnQzMl90IGV2dF9idWZbM107Ci0Jdm9pZCAqZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IGJ1Zl9pbmZvICpvdXRjaCA9IE5VTEw7Ci0JdWludDMyX3QgeV9waHksIGNiY3JfcGh5OwotCXN0YXRpYyB1aW50MzJfdCBsaXZlc2hvdF95X3BoeTsKLQlzdGF0aWMgc3RydWN0IHZmZV9lbmRmcmFtZSBsaXZlc2hvdF9zd2FwOwotCXN0cnVjdCB0YWJsZV9jbWQgKnRhYmxlX3BlbmRpbmcgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jdm9pZCAgICpjbWRfZGF0YSA9IE5VTEw7Ci0JdW5zaWduZWQgY2hhciBidWZbMjU2XTsKLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmICpmcmVlX2J1ZiA9IE5VTEw7Ci0Jc3RydWN0IHZmZV9vdXRwdXRhY2sgZmFjazsKLQlpbnQgaTsKLQotCUNEQkcoIiVzOmlkPSVkXG4iLCBfX2Z1bmNfXywgaWQpOwotCWlmIChpZCAhPSBWRkVfQURTUF9FVkVOVCkgewotCQlkYXRhID0ga3phbGxvYyhsZW4sIEdGUF9BVE9NSUMpOwotCQlpZiAoIWRhdGEpIHsKLQkJCXByX2VycigiJXM6IHJwOiBjYW5ub3QgYWxsb2NhdGUgYnVmZmVyXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JaWYgKGlkID09IFZGRV9BRFNQX0VWRU5UKSB7Ci0JCS8qIGV2ZW50ICovCi0JCWdldGV2ZW50KGV2dF9idWYsIHNpemVvZihldnRfYnVmKSk7Ci0JCUNEQkcoIiVzOmV2ZW50Om1zZ19pZD0lZFxuIiwgX19mdW5jX18sIGlkKTsKLQl9IGVsc2UgewotCQkvKiBtZXNzYWdlcyAqLwotCQlnZXRldmVudChkYXRhLCBsZW4pOwotCQlDREJHKCIlczptZXNzYWdlczptc2dfaWQ9JWRcbiIsIF9fZnVuY19fLCBpZCk7Ci0KLQkJc3dpdGNoIChpZCkgewotCQljYXNlIE1TR19TTkFQU0hPVDoKLQkJCXdoaWxlICh2ZmUyeF9jdHJsLT5zbmFwLmZyYW1lX2NudCA8Ci0JCQkJdmZlMnhfY3RybC0+bnVtX3NuYXApIHsKLQkJCQl2ZmVfN3hfb3BzKGRyaXZlcl9kYXRhLCBNU0dfT1VUUFVUX1MsIGxlbiwKLQkJCQkJZ2V0ZXZlbnQpOwotCQkJCWlmICghcmF3X21vZGUpCi0JCQkJCXZmZV83eF9vcHMoZHJpdmVyX2RhdGEsIE1TR19PVVRQVVRfVCwKLQkJCQkJCWxlbiwgZ2V0ZXZlbnQpOwotCQkJfQotCQkJdmZlMnhfc2VuZF9pc3BfbXNnKHZmZTJ4X2N0cmwsIE1TR19JRF9TTkFQU0hPVF9ET05FKTsKLQkJCWtmcmVlKGRhdGEpOwotCQkJcmV0dXJuOwotCQljYXNlIE1TR19PVVRQVVRfUzoKLQkJCW91dGNoID0gJnZmZTJ4X2N0cmwtPnNuYXA7Ci0JCQlpZiAob3V0Y2gtPmZyYW1lX2NudCA9PSAwKSB7Ci0JCQkJeV9waHkgPSBvdXRjaC0+cGluZy5jaF9wYWRkclswXTsKLQkJCQljYmNyX3BoeSA9IG91dGNoLT5waW5nLmNoX3BhZGRyWzFdOwotCQkJfSBlbHNlIGlmIChvdXRjaC0+ZnJhbWVfY250ID09IDEpIHsKLQkJCQl5X3BoeSA9IG91dGNoLT5wb25nLmNoX3BhZGRyWzBdOwotCQkJCWNiY3JfcGh5ID0gb3V0Y2gtPnBvbmcuY2hfcGFkZHJbMV07Ci0JCQl9IGVsc2UgaWYgKG91dGNoLT5mcmFtZV9jbnQgPT0gMikgewotCQkJCXlfcGh5ID0gb3V0Y2gtPmZyZWVfYnVmLmNoX3BhZGRyWzBdOwotCQkJCWNiY3JfcGh5ID0gb3V0Y2gtPmZyZWVfYnVmLmNoX3BhZGRyWzFdOwotCQkJfSBlbHNlIHsKLQkJCQl5X3BoeSA9IG91dGNoLT5mcmVlX2J1Zl9hcnJbb3V0Y2gtPmZyYW1lX2NudAotCQkJCQktIDNdLmNoX3BhZGRyWzBdOwotCQkJCWNiY3JfcGh5ID0gb3V0Y2gtPmZyZWVfYnVmX2FycltvdXRjaC0+ZnJhbWVfY250Ci0JCQkJCS0gM10uY2hfcGFkZHJbMV07Ci0JCQl9Ci0JCQlvdXRjaC0+ZnJhbWVfY250Kys7Ci0JCQlDREJHKCJNU0dfT1VUUFVUX1M6ICV4ICV4ICVkXG4iLAotCQkJCSh1bnNpZ25lZCBpbnQpeV9waHksICh1bnNpZ25lZCBpbnQpY2Jjcl9waHksCi0JCQkJCW91dGNoLT5mcmFtZV9jbnQpOwotCQkJdmZlX3NlbmRfb3V0bXNnKCZ2ZmUyeF9jdHJsLT5zdWJkZXYsCi0JCQkJCU1TR19JRF9PVVRQVVRfUFJJTUFSWSwKLQkJCQkJCXlfcGh5LCBjYmNyX3BoeSk7Ci0JCQlicmVhazsKLQkJY2FzZSBNU0dfT1VUUFVUX1Q6Ci0JCQlvdXRjaCA9ICZ2ZmUyeF9jdHJsLT50aHVtYjsKLQkJCWlmIChvdXRjaC0+ZnJhbWVfY250ID09IDApIHsKLQkJCQl5X3BoeSA9IG91dGNoLT5waW5nLmNoX3BhZGRyWzBdOwotCQkJCWNiY3JfcGh5ID0gb3V0Y2gtPnBpbmcuY2hfcGFkZHJbMV07Ci0JCQl9IGVsc2UgaWYgKG91dGNoLT5mcmFtZV9jbnQgPT0gMSkgewotCQkJCXlfcGh5ID0gb3V0Y2gtPnBvbmcuY2hfcGFkZHJbMF07Ci0JCQkJY2Jjcl9waHkgPSBvdXRjaC0+cG9uZy5jaF9wYWRkclsxXTsKLQkJCX0gZWxzZSBpZiAob3V0Y2gtPmZyYW1lX2NudCA9PSAyKSB7Ci0JCQkJeV9waHkgPSBvdXRjaC0+ZnJlZV9idWYuY2hfcGFkZHJbMF07Ci0JCQkJY2Jjcl9waHkgPSBvdXRjaC0+ZnJlZV9idWYuY2hfcGFkZHJbMV07Ci0JCQl9IGVsc2UgewotCQkJCXlfcGh5ID0gb3V0Y2gtPmZyZWVfYnVmX2FycltvdXRjaC0+ZnJhbWVfY250Ci0JCQkJCS0gM10uY2hfcGFkZHJbMF07Ci0JCQkJY2Jjcl9waHkgPSBvdXRjaC0+ZnJlZV9idWZfYXJyW291dGNoLT5mcmFtZV9jbnQKLQkJCQkJLSAzXS5jaF9wYWRkclsxXTsKLQkJCX0KLQkJCW91dGNoLT5mcmFtZV9jbnQrKzsKLQkJCUNEQkcoIk1TR19PVVRQVVRfVDogJXggJXggJWRcbiIsCi0JCQkJKHVuc2lnbmVkIGludCl5X3BoeSwgKHVuc2lnbmVkIGludCljYmNyX3BoeSwKLQkJCQlvdXRjaC0+ZnJhbWVfY250KTsKLQkJCXZmZV9zZW5kX291dG1zZygmdmZlMnhfY3RybC0+c3ViZGV2LAotCQkJCQkJTVNHX0lEX09VVFBVVF9TRUNPTkRBUlksCi0JCQkJCQkJeV9waHksIGNiY3JfcGh5KTsKLQkJCWJyZWFrOwotCQljYXNlIE1TR19PVVRQVVQxOgotCQkJaWYgKG9wX21vZGUgJiBTTkFQU0hPVF9NQVNLX01PREUpIHsKLQkJCQlrZnJlZShkYXRhKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWZyZWVfYnVmID0gdmZlMnhfY2hlY2tfZnJlZV9idWZmZXIoCi0JCQkJCQkJVkZFX01TR19PVVRQVVRfSVJRLAotCQkJCQkJCVZGRV9NU0dfT1VUUFVUX1NFQ09OREFSWQotCQkJCQkJCSk7Ci0JCQkJQ0RCRygiZnJlZV9idWYgPSAleFxuIiwKLQkJCQkJCSh1bnNpZ25lZCBpbnQpIGZyZWVfYnVmKTsKLQkJCQlpZiAoZnJlZV9idWYpIHsKLQkJCQkJZmFjay5oZWFkZXIgPSBWRkVfT1VUUFVUMV9BQ0s7Ci0KLQkJCQkJZmFjay5vdXRwdXQybmV3eWJ1ZmZlcmFkZHJlc3MgPQotCQkJCQkJKHZvaWQgKikoZnJlZV9idWYtPmNoX3BhZGRyWzBdKTsKLQotCQkJCQlmYWNrLm91dHB1dDJuZXdjYmNyYnVmZmVyYWRkcmVzcyA9Ci0JCQkJCQkodm9pZCAqKShmcmVlX2J1Zi0+Y2hfcGFkZHJbMV0pOwotCi0JCQkJCWNtZF9kYXRhID0gJmZhY2s7Ci0JCQkJCWxlbiA9IHNpemVvZihmYWNrKTsKLQkJCQkJbXNtX2Fkc3Bfd3JpdGUodmZlX21vZCwgUURTUF9DTURRVUVVRSwKLQkJCQkJCQljbWRfZGF0YSwgbGVuKTsKLQkJCSAgICAgIH0gZWxzZSB7Ci0JCQkJCWZhY2suaGVhZGVyID0gVkZFX09VVFBVVDFfQUNLOwotCQkJCQlmYWNrLm91dHB1dDJuZXd5YnVmZmVyYWRkcmVzcyA9Ci0JCQkJCSh2b2lkICopCi0JCQkJKChzdHJ1Y3QgdmZlX2VuZGZyYW1lICopZGF0YSktPnlfYWRkcmVzczsKLQkJCQkJZmFjay5vdXRwdXQybmV3Y2JjcmJ1ZmZlcmFkZHJlc3MgPQotCQkJCQkodm9pZCAqKQotCQkJCSgoc3RydWN0IHZmZV9lbmRmcmFtZSAqKWRhdGEpLT5jYmNyX2FkZHJlc3M7Ci0JCQkJCWNtZF9kYXRhID0gJmZhY2s7Ci0JCQkJCWxlbiA9IHNpemVvZihmYWNrKTsKLQkJCQkJbXNtX2Fkc3Bfd3JpdGUodmZlX21vZCwgUURTUF9DTURRVUVVRSwKLQkJCQkJCWNtZF9kYXRhLCBsZW4pOwotCQkJCQlpZiAoIXZmZTJ4X2N0cmwtPnpzbF9tb2RlKSB7Ci0JCQkJCQlrZnJlZShkYXRhKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXlfcGh5ID0gKChzdHJ1Y3QgdmZlX2VuZGZyYW1lICopZGF0YSktPnlfYWRkcmVzczsKLQkJCWNiY3JfcGh5ID0gKChzdHJ1Y3QgdmZlX2VuZGZyYW1lICopZGF0YSktPmNiY3JfYWRkcmVzczsKLQotCi0JCQlDREJHKCJ2ZmVfN3hfY29udmVydCwgeV9waHkgPSAweCV4LCBjYmNyX3BoeSA9IDB4JXhcbiIsCi0JCQkJIHlfcGh5LCBjYmNyX3BoeSk7Ci0JCQlpZiAoZnJlZV9idWYpIHsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQkJCWlmICh2ZmUyeF9jdHJsLT5mcmVlX2J1Zi5idWZbaV0uCi0JCQkJCQkJY2hfcGFkZHJbMF0gPT0geV9waHkpIHsKLQkJCQkJCXZmZTJ4X2N0cmwtPmZyZWVfYnVmLgotCQkJCQkJCWJ1ZltpXS5jaF9wYWRkclswXSA9Ci0JCQkJCQkJZnJlZV9idWYtPmNoX3BhZGRyWzBdOwotCQkJCQkJdmZlMnhfY3RybC0+ZnJlZV9idWYuCi0JCQkJCQkJYnVmW2ldLmNoX3BhZGRyWzFdID0KLQkJCQkJCQlmcmVlX2J1Zi0+Y2hfcGFkZHJbMV07Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoaSA9PSAzKQotCQkJCQlDREJHKCJBZGRyZXNzIGRvZXNudCBtYXRjaFxuIik7Ci0JCQl9Ci0JCQltZW1jcHkoKChzdHJ1Y3QgdmZlX2ZyYW1lX2V4dHJhICopZXh0ZGF0YSksCi0JCQkJJigoc3RydWN0IHZmZV9lbmRmcmFtZSAqKWRhdGEpLT5leHRyYSwKLQkJCQlzaXplb2Yoc3RydWN0IHZmZV9mcmFtZV9leHRyYSkpOwotCi0JCQl2ZmUyeF9jdHJsLT52ZmVGcmFtZUlkID0KLQkJCQkoKHN0cnVjdCB2ZmVfZnJhbWVfZXh0cmEgKilleHRkYXRhKS0+ZnJhbWVfaWQ7Ci0JCQl2ZmVfc2VuZF9vdXRtc2coJnZmZTJ4X2N0cmwtPnN1YmRldiwKLQkJCQkJCU1TR19JRF9PVVRQVVRfU0VDT05EQVJZLAotCQkJCQkJeV9waHksIGNiY3JfcGh5KTsKLQkJCWJyZWFrOwotCQljYXNlIE1TR19PVVRQVVQyOgotCQkJaWYgKG9wX21vZGUgJiBTTkFQU0hPVF9NQVNLX01PREUpIHsKLQkJCQlrZnJlZShkYXRhKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAodmZlMnhfY3RybC0+bGl2ZXNob3RfZW5hYmxlZCkKLQkJCQlmcmVlX2J1ZiA9IHZmZTJ4X2NoZWNrX2ZyZWVfYnVmZmVyKAotCQkJCQlWRkVfTVNHX09VVFBVVF9JUlEsCi0JCQkJCVZGRV9NU0dfVjJYX0xJVkVTSE9UX1BSSU1BUlkpOwotCQkJZWxzZQotCQkJCWZyZWVfYnVmID0gdmZlMnhfY2hlY2tfZnJlZV9idWZmZXIoCi0JCQkJCVZGRV9NU0dfT1VUUFVUX0lSUSwKLQkJCQkJVkZFX01TR19PVVRQVVRfUFJJTUFSWSk7Ci0JCQlDREJHKCJmcmVlX2J1ZiA9ICV4XG4iLAotCQkJCQkodW5zaWduZWQgaW50KSBmcmVlX2J1Zik7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgKLQkJCQkJJnZmZTJ4X2N0cmwtPmxpdmVzaG90X2VuYWJsZWRfbG9jaywKLQkJCQkJZmxhZ3MpOwotCQkJaWYgKCF2ZmUyeF9jdHJsLT5saXZlc2hvdF9lbmFibGVkKSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKLQkJCQkJCSZ2ZmUyeF9jdHJsLT4KLQkJCQkJCWxpdmVzaG90X2VuYWJsZWRfbG9jaywKLQkJCQkJCWZsYWdzKTsKLQkJCQlpZiAoZnJlZV9idWYpIHsKLQkJCQkJZmFjay5oZWFkZXIgPSBWRkVfT1VUUFVUMl9BQ0s7Ci0KLQkJCQkJZmFjay5vdXRwdXQybmV3eWJ1ZmZlcmFkZHJlc3MgPQotCQkJCQkJKHZvaWQgKikKLQkJCQkJCShmcmVlX2J1Zi0+Y2hfcGFkZHJbMF0pOwotCi0JCQkJCWZhY2sub3V0cHV0Mm5ld2NiY3JidWZmZXJhZGRyZXNzID0KLQkJCQkJCSh2b2lkICopCi0JCQkJCQkoZnJlZV9idWYtPmNoX3BhZGRyWzFdKTsKLQotCQkJCQljbWRfZGF0YSA9ICZmYWNrOwotCQkJCQlsZW4gPSBzaXplb2YoZmFjayk7Ci0JCQkJCW1zbV9hZHNwX3dyaXRlKHZmZV9tb2QsCi0JCQkJCQkJUURTUF9DTURRVUVVRSwKLQkJCQkJCQljbWRfZGF0YSwgbGVuKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmYWNrLmhlYWRlciA9IFZGRV9PVVRQVVQyX0FDSzsKLQkJCQkJZmFjay5vdXRwdXQybmV3eWJ1ZmZlcmFkZHJlc3MgPQotCQkJCQkJKHZvaWQgKikKLQkJCQkJCSgoc3RydWN0IHZmZV9lbmRmcmFtZSAqKQotCQkJCQkJIGRhdGEpLT55X2FkZHJlc3M7Ci0JCQkJCWZhY2sub3V0cHV0Mm5ld2NiY3JidWZmZXJhZGRyZXNzID0KLQkJCQkJCSh2b2lkICopCi0JCQkJCQkoKHN0cnVjdCB2ZmVfZW5kZnJhbWUgKikKLQkJCQkJCSBkYXRhKS0+Y2Jjcl9hZGRyZXNzOwotCQkJCQljbWRfZGF0YSA9ICZmYWNrOwotCQkJCQlsZW4gPSBzaXplb2YoZmFjayk7Ci0JCQkJCW1zbV9hZHNwX3dyaXRlKHZmZV9tb2QsCi0JCQkJCQkJUURTUF9DTURRVUVVRSwKLQkJCQkJCQljbWRfZGF0YSwgbGVuKTsKLQkJCQkJaWYgKCF2ZmUyeF9jdHJsLT56c2xfbW9kZSkgewotCQkJCQkJa2ZyZWUoZGF0YSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgeyAvKiBMaXZlIHNuYXBzaG90ICovCi0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKLQkJCQkJCSZ2ZmUyeF9jdHJsLT4KLQkJCQkJCWxpdmVzaG90X2VuYWJsZWRfbG9jaywKLQkJCQkJCWZsYWdzKTsKLQkJCQlpZiAoZnJlZV9idWYpIHsKLQkJCQkJLyogbGl2ZXNob3Rfc3dhcCB0byBlbnF1ZXVlCi0JCQkJCSAgIHdoZW4gbGl2ZXNob3Qgc25hcHNob3QgYnVmZmVyCi0JCQkJCSAgIGlzIG9idGFpbmVkaSBmcm9tIGFkc3AgKi8KLQkJCQkJbGl2ZXNob3Rfc3dhcC55X2FkZHJlc3MgPQotCQkJCQkJKChzdHJ1Y3QgdmZlX2VuZGZyYW1lICopCi0JCQkJCQkgZGF0YSktPnlfYWRkcmVzczsKLQkJCQkJbGl2ZXNob3Rfc3dhcC5jYmNyX2FkZHJlc3MgPQotCQkJCQkJKChzdHJ1Y3QgdmZlX2VuZGZyYW1lICopCi0JCQkJCQkgZGF0YSktPmNiY3JfYWRkcmVzczsKLQotCQkJCQlmYWNrLmhlYWRlciA9IFZGRV9PVVRQVVQyX0FDSzsKLQotCQkJCQlmYWNrLm91dHB1dDJuZXd5YnVmZmVyYWRkcmVzcyA9Ci0JCQkJCQkodm9pZCAqKQotCQkJCQkJKGZyZWVfYnVmLT5jaF9wYWRkclswXSk7Ci0KLQkJCQkJZmFjay5vdXRwdXQybmV3Y2JjcmJ1ZmZlcmFkZHJlc3MgPQotCQkJCQkJKHZvaWQgKikKLQkJCQkJCShmcmVlX2J1Zi0+Y2hfcGFkZHJbMV0pOwotCi0JCQkJCWxpdmVzaG90X3lfcGh5ID0KLQkJCQkJCSh1aW50MzJfdCkKLQkJCQkJCWZhY2sub3V0cHV0Mm5ld3lidWZmZXJhZGRyZXNzOwotCi0JCQkJCWNtZF9kYXRhID0gJmZhY2s7Ci0JCQkJCWxlbiA9IHNpemVvZihmYWNrKTsKLQkJCQkJbXNtX2Fkc3Bfd3JpdGUodmZlX21vZCwKLQkJCQkJCQlRRFNQX0NNRFFVRVVFLAotCQkJCQkJCWNtZF9kYXRhLCBsZW4pOwotCQkJCX0gZWxzZSBpZiAobGl2ZXNob3RfeV9waHkgIT0KLQkJCQkJCSgoc3RydWN0IHZmZV9lbmRmcmFtZSAqKQotCQkJCQkJIGRhdGEpLT55X2FkZHJlc3MpIHsKLQotCQkJCQlmYWNrLmhlYWRlciA9IFZGRV9PVVRQVVQyX0FDSzsKLQkJCQkJZmFjay5vdXRwdXQybmV3eWJ1ZmZlcmFkZHJlc3MgPQotCQkJCQkJKHZvaWQgKikKLQkJCQkJCSgoc3RydWN0IHZmZV9lbmRmcmFtZSAqKQotCQkJCQkJIGRhdGEpLT55X2FkZHJlc3M7Ci0KLQkJCQkJZmFjay5vdXRwdXQybmV3Y2JjcmJ1ZmZlcmFkZHJlc3MgPQotCQkJCQkJKHZvaWQgKikKLQkJCQkJCSgoc3RydWN0IHZmZV9lbmRmcmFtZSAqKQotCQkJCQkJIGRhdGEpLT5jYmNyX2FkZHJlc3M7Ci0KLQkJCQkJY21kX2RhdGEgPSAmZmFjazsKLQkJCQkJbGVuID0gc2l6ZW9mKGZhY2spOwotCQkJCQltc21fYWRzcF93cml0ZSh2ZmVfbW9kLAotCQkJCQkJCVFEU1BfQ01EUVVFVUUsCi0JCQkJCQkJY21kX2RhdGEsIGxlbik7Ci0JCQkJCWtmcmVlKGRhdGEpOwotCQkJCQlyZXR1cm47Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogRW5xdWUgZGF0YSBnb3QKLQkJCQkJICogZHVyaW5nIGZyZWVidWYgKi8KLQkJCQkJZmFjay5oZWFkZXIgPSBWRkVfT1VUUFVUMl9BQ0s7Ci0JCQkJCWZhY2sub3V0cHV0Mm5ld3lidWZmZXJhZGRyZXNzID0KLQkJCQkJCSh2b2lkICopCi0JCQkJCQkobGl2ZXNob3Rfc3dhcC55X2FkZHJlc3MpOwotCi0JCQkJCWZhY2sub3V0cHV0Mm5ld2NiY3JidWZmZXJhZGRyZXNzID0KLQkJCQkJCSh2b2lkICopCi0JCQkJCQkobGl2ZXNob3Rfc3dhcC5jYmNyX2FkZHJlc3MpOwotCQkJCQljbWRfZGF0YSA9ICZmYWNrOwotCQkJCQlsZW4gPSBzaXplb2YoZmFjayk7Ci0JCQkJCW1zbV9hZHNwX3dyaXRlKHZmZV9tb2QsCi0JCQkJCQkJUURTUF9DTURRVUVVRSwKLQkJCQkJCQljbWRfZGF0YSwgbGVuKTsKLQkJCQl9Ci0JCQl9Ci0JCQl5X3BoeSA9ICgoc3RydWN0IHZmZV9lbmRmcmFtZSAqKWRhdGEpLT4KLQkJCQl5X2FkZHJlc3M7Ci0JCQljYmNyX3BoeSA9ICgoc3RydWN0IHZmZV9lbmRmcmFtZSAqKWRhdGEpLT4KLQkJCQljYmNyX2FkZHJlc3M7Ci0KLQotCQkJQ0RCRygiTVNHX09VVDI6eV9waHk9IDB4JXgsIGNiY3JfcGh5PSAweCV4XG4iLAotCQkJCQl5X3BoeSwgY2Jjcl9waHkpOwotCQkJaWYgKGZyZWVfYnVmKSB7Ci0JCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQkJCQlpZiAodmZlMnhfY3RybC0+ZnJlZV9idWYuYnVmW2ldLgotCQkJCQkJCWNoX3BhZGRyWzBdID09IHlfcGh5KSB7Ci0JCQkJCQl2ZmUyeF9jdHJsLT5mcmVlX2J1Zi4KLQkJCQkJCQlidWZbaV0uY2hfcGFkZHJbMF0gPQotCQkJCQkJCWZyZWVfYnVmLT5jaF9wYWRkclswXTsKLQkJCQkJCXZmZTJ4X2N0cmwtPmZyZWVfYnVmLgotCQkJCQkJCWJ1ZltpXS5jaF9wYWRkclsxXSA9Ci0JCQkJCQkJZnJlZV9idWYtPmNoX3BhZGRyWzFdOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGkgPT0gMykKLQkJCQkJQ0RCRygiQWRkcmVzcyBkb2VzbnQgbWF0Y2hcbiIpOwotCQkJfQotCQkJbWVtY3B5KCgoc3RydWN0IHZmZV9mcmFtZV9leHRyYSAqKWV4dGRhdGEpLAotCQkJCQkmKChzdHJ1Y3QgdmZlX2VuZGZyYW1lICopZGF0YSktPmV4dHJhLAotCQkJCQlzaXplb2Yoc3RydWN0IHZmZV9mcmFtZV9leHRyYSkpOwotCi0JCQl2ZmUyeF9jdHJsLT52ZmVGcmFtZUlkID0KLQkJCQkoKHN0cnVjdCB2ZmVfZnJhbWVfZXh0cmEgKilleHRkYXRhKS0+Ci0JCQkJZnJhbWVfaWQ7Ci0KLQkJCWlmICghdmZlMnhfY3RybC0+bGl2ZXNob3RfZW5hYmxlZCkgewotCQkJCS8qIExpdmVzaG90IG5vdCBlbmFsYmVkICovCi0JCQkJdmZlX3NlbmRfb3V0bXNnKCZ2ZmUyeF9jdHJsLT5zdWJkZXYsCi0JCQkJCQlNU0dfSURfT1VUUFVUX1BSSU1BUlksCi0JCQkJCQl5X3BoeSwgY2Jjcl9waHkpOwotCQkJfSBlbHNlIGlmIChsaXZlc2hvdF95X3BoeSA9PSB5X3BoeSkgewotCQkJCXZmZV9zZW5kX291dG1zZygmdmZlMnhfY3RybC0+c3ViZGV2LAotCQkJCQkJTVNHX0lEX09VVFBVVF9QUklNQVJZLAotCQkJCQkJeV9waHksIGNiY3JfcGh5KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE1TR19SRVNFVF9BQ0s6Ci0JCWNhc2UgTVNHX1NUQVJUX0FDSzoKLQkJY2FzZSBNU0dfVVBEQVRFX0FDSzoKLQkJY2FzZSBNU0dfVkZFX0VSUk9SOgotCQljYXNlIE1TR19TWU5DX1RJTUVSMV9ET05FOgotCQljYXNlIE1TR19TWU5DX1RJTUVSMl9ET05FOgotCQkJdmZlMnhfc2VuZF9pc3BfbXNnKHZmZTJ4X2N0cmwsIG1zZ3NfbWFwW2lkXS5pc3BfaWQpOwotCQkJaWYgKGlkID09IE1TR19TVEFSVF9BQ0spCi0JCQkJdmZlMnhfY3RybC0+dmZlX3N0YXJ0ZWQgPSAxOwotCQkJaWYgKGlkID09IE1TR19WRkVfRVJST1IpIHsKLQkJCQl1aW50MTZfdCAqcHRyOwotCQkJCXN0cnVjdCB2ZmVfZXJyb3JfbXNnICpWRkVfRXJyb3JNZXNzYWdlQnVmZmVyCi0JCQkJCT0gZGF0YTsKLQkJCQlwdHIgPSBkYXRhOwotCQkJCUNEQkcoIkVycm9yOiAleCAleFxuIiwgcHRyWzBdLCBwdHJbMV0pOwotCQkJCUNEQkcoIkNBTUlGX0Vycm9yICAgICAgICAgICAgICA9ICVkXG4iLAotCQkJCQlWRkVfRXJyb3JNZXNzYWdlQnVmZmVyLT5jYW1pZl9lcnJvcik7Ci0JCQkJQ0RCRygib3V0cHV0MVlCdXNPdmVyZmxvdyAgICAgID0gJWRcbiIsCi0JCQkJCVZGRV9FcnJvck1lc3NhZ2VCdWZmZXItPgotCQkJCQlvdXRwdXQxeWJ1c292ZXJmbG93KTsKLQkJCQlDREJHKCJvdXRwdXQxQ2JDckJ1c092ZXJmbG93ICAgPSAlZFxuIiwKLQkJCQkJVkZFX0Vycm9yTWVzc2FnZUJ1ZmZlci0+Ci0JCQkJCW91dHB1dDFjYmNyYnVzb3ZlcmZsb3cpOwotCQkJCUNEQkcoIm91dHB1dDJZQnVzT3ZlcmZsb3cgICAgICA9ICVkXG4iLAotCQkJCQlWRkVfRXJyb3JNZXNzYWdlQnVmZmVyLT4KLQkJCQkJb3V0cHV0MnlidXNvdmVyZmxvdyk7Ci0JCQkJQ0RCRygib3V0cHV0MkNiQ3JCdXNPdmVyZmxvdyAgID0gJWRcbiIsCi0JCQkJCQlWRkVfRXJyb3JNZXNzYWdlQnVmZmVyLT4KLQkJCQkJCW91dHB1dDJjYmNyYnVzb3ZlcmZsb3cpOwotCQkJCUNEQkcoImF1dG9mb2N1c1N0YXRCdXNPdmVyZmxvdyA9ICVkXG4iLAotCQkJCQkJVkZFX0Vycm9yTWVzc2FnZUJ1ZmZlci0+Ci0JCQkJCQlhdXRvZm9jdXNzdGF0YnVzb3ZlcmZsb3cpOwotCQkJCUNEQkcoIldCX0VYUFN0YXRCdXNPdmVyZmxvdyAgICA9ICVkXG4iLAotCQkJCQkJVkZFX0Vycm9yTWVzc2FnZUJ1ZmZlci0+Ci0JCQkJCQl3Yl9leHBzdGF0YnVzb3ZlcmZsb3cpOwotCQkJCUNEQkcoIkFYSUVycm9yICAgICAgICAgICAgICAgICA9ICVkXG4iLAotCQkJCQkJVkZFX0Vycm9yTWVzc2FnZUJ1ZmZlci0+Ci0JCQkJCQlheGllcnJvcik7Ci0JCQkJQ0RCRygiQ0FNSUZfU3RhdXMgICAgICAgICAgICAgID0gJWRcbiIsCi0JCQkJCQlWRkVfRXJyb3JNZXNzYWdlQnVmZmVyLT4KLQkJCQkJCWNhbWlmX3N0YXVzKTsKLQkJCQlDREJHKCJwaXhlbF9jb3VudCAgICAgICAgICAgICAgPSAlZFxuIiwKLQkJCQkJCVZGRV9FcnJvck1lc3NhZ2VCdWZmZXItPgotCQkJCQkJcGl4ZWxfY291bnQpOwotCQkJCUNEQkcoImxpbmVfY291bnQgICAgICAgICAgICAgICA9ICVkXG4iLAotCQkJCQkJVkZFX0Vycm9yTWVzc2FnZUJ1ZmZlci0+Ci0JCQkJCQlsaW5lX2NvdW50KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE1TR19TT0Y6Ci0JCQl2ZmUyeF9jdHJsLT52ZmVGcmFtZUlkKys7Ci0JCQlpZiAodmZlMnhfY3RybC0+dmZlRnJhbWVJZCA9PSAwKQotCQkJCXZmZTJ4X2N0cmwtPnZmZUZyYW1lSWQgPSAxOyAvKiB3cmFwcGVkIGJhY2sgKi8KLQkJCWlmICgob3BfbW9kZSAmIFNOQVBTSE9UX01BU0tfTU9ERSkgJiYgIXJhd19tb2RlCi0JCQkJJiYgKHZmZTJ4X2N0cmwtPm51bV9zbmFwIDw9IDEpKSB7Ci0JCQkJQ0RCRygiSWdub3JlIFNPRiBmb3Igc25hcHNob3RcbiIpOwotCQkJCWtmcmVlKGRhdGEpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXZmZTJ4X3NlbmRfaXNwX21zZyh2ZmUyeF9jdHJsLCBNU0dfSURfU09GX0FDSyk7Ci0JCQlpZiAocmF3X21vZGUpCi0JCQkJdmZlMnhfc2VuZF9pc3BfbXNnKHZmZTJ4X2N0cmwsCi0JCQkJCQlNU0dfSURfU1RBUlRfQUNLKTsKLQkJCWJyZWFrOwotCQljYXNlIE1TR19TVE9QX0FDSzoKLQkJCXN0b3BldmVudC5zdGF0ZSA9IDE7Ci0JCQl2ZmUyeF9jdHJsLT52ZmVfc3RhcnRlZCA9IDA7Ci0JCQl3YWtlX3VwKCZzdG9wZXZlbnQud2FpdCk7Ci0JCQl2ZmUyeF9zZW5kX2lzcF9tc2codmZlMnhfY3RybCwgTVNHX0lEX1NUT1BfQUNLKTsKLQkJCWJyZWFrOwotCQljYXNlIE1TR19TVEFUU19BRjoKLQkJY2FzZSBNU0dfU1RBVFNfV0U6Ci0JCQl2ZmVfc2VuZF9zdGF0c19tc2coKih1aW50MzJfdCAqKWRhdGEsCi0JCQkJCQltc2dzX21hcFtpZF0uaXNwX2lkKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWYgKE1TR19UQUJMRV9DTURfQUNLICE9IGlkKQotCQkJCXZmZTJ4X3NlbmRfaXNwX21zZyh2ZmUyeF9jdHJsLAotCQkJCQkJbXNnc19tYXBbaWRdLmlzcF9pZCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoTVNHX1RBQkxFX0NNRF9BQ0sgPT0gaWQpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTJ4X2N0cmwtPnRhYmxlX2xvY2ssIGZsYWdzKTsKLQkJdmZlMnhfY3RybC0+dGFibGVhY2tfcGVuZGluZyA9IDA7Ci0JCWlmIChsaXN0X2VtcHR5KCZ2ZmUyeF9jdHJsLT50YWJsZV9xKSkgewotCQkJaWYgKHZmZTJ4X2N0cmwtPnN0YXJ0X3BlbmRpbmcpIHsKLQkJCQlDREJHKCJTZW5kIFNUQVJUXG4iKTsKLQkJCQljbWRfZGF0YSA9IGJ1ZjsKLQkJCQkqKHVpbnQzMl90ICopY21kX2RhdGEgPSBWRkVfU1RBUlQ7Ci0JCQkJbWVtY3B5KCgoY2hhciAqKWNtZF9kYXRhKSArIDQsCi0JCQkJCSZ2ZmUyeF9jdHJsLT5zdGFydF9jbWQsCi0JCQkJCXNpemVvZih2ZmUyeF9jdHJsLT5zdGFydF9jbWQpKTsKLQkJCQkvKiBTZW5kIFN0YXJ0IGNtZCBoZXJlICovCi0JCQkJbGVuICA9IHNpemVvZih2ZmUyeF9jdHJsLT5zdGFydF9jbWQpICsgNDsKLQkJCQltc21fYWRzcF93cml0ZSh2ZmVfbW9kLCBRRFNQX0NNRFFVRVVFLAotCQkJCQkJY21kX2RhdGEsIGxlbik7Ci0JCQkJdmZlMnhfY3RybC0+c3RhcnRfcGVuZGluZyA9IDA7Ci0JCQl9IGVsc2UgaWYgKHZmZTJ4X2N0cmwtPnN0b3BfcGVuZGluZykgewotCQkJCUNEQkcoIlNlbmQgU1RPUFxuIik7Ci0JCQkJY21kX2RhdGEgPSBidWY7Ci0JCQkJKih1aW50MzJfdCAqKWNtZF9kYXRhID0gVkZFX1NUT1A7Ci0JCQkJLyogU2VuZCBTdG9wIGNtZCBoZXJlICovCi0JCQkJbGVuICA9IDQ7Ci0JCQkJbXNtX2Fkc3Bfd3JpdGUodmZlX21vZCwgUURTUF9DTURRVUVVRSwKLQkJCQkJCWNtZF9kYXRhLCBsZW4pOwotCQkJCXZmZTJ4X2N0cmwtPnN0b3BfcGVuZGluZyA9IDA7Ci0JCQl9IGVsc2UgaWYgKHZmZTJ4X2N0cmwtPnVwZGF0ZV9wZW5kaW5nKSB7Ci0JCQkJQ0RCRygiU2VuZCBVcGRhdGVcbiIpOwotCQkJCWNtZF9kYXRhID0gYnVmOwotCQkJCSoodWludDMyX3QgKiljbWRfZGF0YSA9IFZGRV9VUERBVEU7Ci0JCQkJLyogU2VuZCBVcGRhdGUgY21kIGhlcmUgKi8KLQkJCQlsZW4gID0gNDsKLQkJCQltc21fYWRzcF93cml0ZSh2ZmVfbW9kLCBRRFNQX0NNRFFVRVVFLAotCQkJCQkJY21kX2RhdGEsIGxlbik7Ci0JCQkJdmZlMnhfY3RybC0+dXBkYXRlX3BlbmRpbmcgPSAwOwotCQkJfQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMnhfY3RybC0+dGFibGVfbG9jaywgZmxhZ3MpOwotCQkJa2ZyZWUoZGF0YSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGFibGVfcGVuZGluZyA9IGxpc3RfZmlyc3RfZW50cnkoJnZmZTJ4X2N0cmwtPnRhYmxlX3EsCi0JCQkJCXN0cnVjdCB0YWJsZV9jbWQsIGxpc3QpOwotCQlpZiAoIXRhYmxlX3BlbmRpbmcpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTJ4X2N0cmwtPnRhYmxlX2xvY2ssIGZsYWdzKTsKLQkJCWtmcmVlKGRhdGEpOwotCQkJcmV0dXJuOwotCQl9Ci0JCW1zbV9hZHNwX3dyaXRlKHZmZV9tb2QsIHRhYmxlX3BlbmRpbmctPnF1ZXVlLAotCQkJCXRhYmxlX3BlbmRpbmctPmNtZCwgdGFibGVfcGVuZGluZy0+c2l6ZSk7Ci0JCWxpc3RfZGVsKCZ0YWJsZV9wZW5kaW5nLT5saXN0KTsKLQkJa2ZyZWUodGFibGVfcGVuZGluZy0+Y21kKTsKLQkJa2ZyZWUodGFibGVfcGVuZGluZyk7Ci0JCXZmZTJ4X2N0cmwtPnRhYmxlYWNrX3BlbmRpbmcgPSAxOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUyeF9jdHJsLT50YWJsZV9sb2NrLCBmbGFncyk7Ci0JfSBlbHNlIGlmICghdmZlMnhfY3RybC0+dGFibGVhY2tfcGVuZGluZykgewotCQlpZiAoIWxpc3RfZW1wdHkoJnZmZTJ4X2N0cmwtPnRhYmxlX3EpKSB7Ci0JCQlrZnJlZShkYXRhKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlrZnJlZShkYXRhKTsKLX0KLQotc3RhdGljIHN0cnVjdCBtc21fYWRzcF9vcHMgdmZlXzd4X3N5bmMgPSB7Ci0JLmV2ZW50ID0gdmZlXzd4X29wcywKLX07Ci0KLXN0YXRpYyBpbnQgdmZlXzd4X2NvbmZpZ19heGkoaW50IG1vZGUsCi0Jc3RydWN0IGJ1Zl9pbmZvICphZCwgc3RydWN0IGF4aW91dCAqYW8pCi17Ci0JdW5zaWduZWQgbG9uZyAqYnB0cjsKLQlpbnQgICAgY250OwotCWludCByYyA9IDA7Ci0JaW50IG9fbW9kZSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChvcF9tb2RlICYgU05BUFNIT1RfTUFTS19NT0RFKQotCQlvX21vZGUgPSBTTkFQU0hPVF9NQVNLX01PREU7Ci0KLQlpZiAoKG9fbW9kZSA9PSBTTkFQU0hPVF9NQVNLX01PREUpICYmICh2ZmUyeF9jdHJsLT5udW1fc25hcCA+IDEpKSB7Ci0JCUNEQkcoIiVzOiBCVVJTVCBtb2RlIGZyZWVidWYgY250ICVkIiwgX19mdW5jX18sCi0JCQlhZC0+ZnJlZV9idWZfY250KTsKLQkJLyogQnVyc3QgKi8KLQkJaWYgKG1vZGUgPT0gT1VUUFVUX1NFQykgewotCQkJYW8tPm91dHB1dDFidWZmZXIxX3lfcGh5ID0gYWQtPnBpbmcuY2hfcGFkZHJbMF07Ci0JCQlhby0+b3V0cHV0MWJ1ZmZlcjFfY2Jjcl9waHkgPSBhZC0+cGluZy5jaF9wYWRkclsxXTsKLQkJCWFvLT5vdXRwdXQxYnVmZmVyMl95X3BoeSA9IGFkLT5wb25nLmNoX3BhZGRyWzBdOwotCQkJYW8tPm91dHB1dDFidWZmZXIyX2NiY3JfcGh5ID0gYWQtPnBvbmcuY2hfcGFkZHJbMV07Ci0JCQlhby0+b3V0cHV0MWJ1ZmZlcjNfeV9waHkgPSBhZC0+ZnJlZV9idWYuY2hfcGFkZHJbMF07Ci0JCQlhby0+b3V0cHV0MWJ1ZmZlcjNfY2Jjcl9waHkgPSBhZC0+ZnJlZV9idWYuY2hfcGFkZHJbMV07Ci0JCQlicHRyID0gJmFvLT5vdXRwdXQxYnVmZmVyNF95X3BoeTsKLQkJCWZvciAoY250ID0gMDsgY250IDwgNTsgY250KyspIHsKLQkJCQkqYnB0ciA9IChjbnQgPCBhZC0+ZnJlZV9idWZfY250LTMpID8KLQkJCQkJYWQtPmZyZWVfYnVmX2FycltjbnRdLmNoX3BhZGRyWzBdIDoKLQkJCQkJCWFkLT5wb25nLmNoX3BhZGRyWzBdOwotCQkJCWJwdHIrKzsKLQkJCQkqYnB0ciA9IChjbnQgPCBhZC0+ZnJlZV9idWZfY250LTMpID8KLQkJCQkJYWQtPmZyZWVfYnVmX2FycltjbnRdLmNoX3BhZGRyWzFdIDoKLQkJCQkJCWFkLT5wb25nLmNoX3BhZGRyWzFdOwotCQkJCWJwdHIrKzsKLQkJCX0KLQkJCUNEQkcoIiV4ICV4XG4iLCAodW5zaWduZWQgaW50KWFvLT5vdXRwdXQxYnVmZmVyMV95X3BoeSwKLQkJCQkodW5zaWduZWQgaW50KWFvLT5vdXRwdXQxYnVmZmVyMV9jYmNyX3BoeSk7Ci0JCQlDREJHKCIleCAleFxuIiwgKHVuc2lnbmVkIGludClhby0+b3V0cHV0MWJ1ZmZlcjJfeV9waHksCi0JCQkJKHVuc2lnbmVkIGludClhby0+b3V0cHV0MWJ1ZmZlcjJfY2Jjcl9waHkpOwotCQkJQ0RCRygiJXggJXhcbiIsICh1bnNpZ25lZCBpbnQpYW8tPm91dHB1dDFidWZmZXIzX3lfcGh5LAotCQkJCSh1bnNpZ25lZCBpbnQpYW8tPm91dHB1dDFidWZmZXIzX2NiY3JfcGh5KTsKLQkJCUNEQkcoIiV4ICV4XG4iLCAodW5zaWduZWQgaW50KWFvLT5vdXRwdXQxYnVmZmVyNF95X3BoeSwKLQkJCQkodW5zaWduZWQgaW50KWFvLT5vdXRwdXQxYnVmZmVyNF9jYmNyX3BoeSk7Ci0JCQlDREJHKCIleCAleFxuIiwgKHVuc2lnbmVkIGludClhby0+b3V0cHV0MWJ1ZmZlcjVfeV9waHksCi0JCQkJKHVuc2lnbmVkIGludClhby0+b3V0cHV0MWJ1ZmZlcjVfY2Jjcl9waHkpOwotCQkJQ0RCRygiJXggJXhcbiIsICh1bnNpZ25lZCBpbnQpYW8tPm91dHB1dDFidWZmZXI2X3lfcGh5LAotCQkJCSh1bnNpZ25lZCBpbnQpYW8tPm91dHB1dDFidWZmZXI2X2NiY3JfcGh5KTsKLQkJCUNEQkcoIiV4ICV4XG4iLCAodW5zaWduZWQgaW50KWFvLT5vdXRwdXQxYnVmZmVyN195X3BoeSwKLQkJCQkodW5zaWduZWQgaW50KWFvLT5vdXRwdXQxYnVmZmVyN19jYmNyX3BoeSk7Ci0JCX0gZWxzZSB7IC8qUHJpbWFyeSovCi0JCQlhby0+b3V0cHV0MmJ1ZmZlcjFfeV9waHkgPSBhZC0+cGluZy5jaF9wYWRkclswXTsKLQkJCWFvLT5vdXRwdXQyYnVmZmVyMV9jYmNyX3BoeSA9IGFkLT5waW5nLmNoX3BhZGRyWzFdOwotCQkJYW8tPm91dHB1dDJidWZmZXIyX3lfcGh5ID0gYWQtPnBvbmcuY2hfcGFkZHJbMF07Ci0JCQlhby0+b3V0cHV0MmJ1ZmZlcjJfY2Jjcl9waHkgPSBhZC0+cG9uZy5jaF9wYWRkclsxXTsKLQkJCWFvLT5vdXRwdXQyYnVmZmVyM195X3BoeSA9IGFkLT5mcmVlX2J1Zi5jaF9wYWRkclswXTsKLQkJCWFvLT5vdXRwdXQyYnVmZmVyM19jYmNyX3BoeSA9IGFkLT5mcmVlX2J1Zi5jaF9wYWRkclsxXTsKLQkJCWJwdHIgPSAmYW8tPm91dHB1dDJidWZmZXI0X3lfcGh5OwotCQkJZm9yIChjbnQgPSAwOyBjbnQgPCA1OyBjbnQrKykgewotCQkJCSpicHRyID0gKGNudCA8IGFkLT5mcmVlX2J1Zl9jbnQtMykgPwotCQkJCQlhZC0+ZnJlZV9idWZfYXJyW2NudF0uY2hfcGFkZHJbMF0gOgotCQkJCQkJYWQtPnBvbmcuY2hfcGFkZHJbMF07Ci0JCQkJYnB0cisrOwotCQkJCSpicHRyID0gKGNudCA8IGFkLT5mcmVlX2J1Zl9jbnQtMykgPwotCQkJCQlhZC0+ZnJlZV9idWZfYXJyW2NudF0uY2hfcGFkZHJbMV0gOgotCQkJCQkJYWQtPnBvbmcuY2hfcGFkZHJbMV07Ci0JCQkJYnB0cisrOwotCQkJfQotCQkJQ0RCRygiJXggJXhcbiIsICh1bnNpZ25lZCBpbnQpYW8tPm91dHB1dDJidWZmZXIxX3lfcGh5LAotCQkJCSh1bnNpZ25lZCBpbnQpYW8tPm91dHB1dDJidWZmZXIxX2NiY3JfcGh5KTsKLQkJCUNEQkcoIiV4ICV4XG4iLCAodW5zaWduZWQgaW50KWFvLT5vdXRwdXQyYnVmZmVyMl95X3BoeSwKLQkJCQkodW5zaWduZWQgaW50KWFvLT5vdXRwdXQyYnVmZmVyMl9jYmNyX3BoeSk7Ci0JCQlDREJHKCIleCAleFxuIiwgKHVuc2lnbmVkIGludClhby0+b3V0cHV0MmJ1ZmZlcjNfeV9waHksCi0JCQkJKHVuc2lnbmVkIGludClhby0+b3V0cHV0MmJ1ZmZlcjNfY2Jjcl9waHkpOwotCQkJQ0RCRygiJXggJXhcbiIsICh1bnNpZ25lZCBpbnQpYW8tPm91dHB1dDJidWZmZXI0X3lfcGh5LAotCQkJCSh1bnNpZ25lZCBpbnQpYW8tPm91dHB1dDJidWZmZXI0X2NiY3JfcGh5KTsKLQkJCUNEQkcoIiV4ICV4XG4iLCAodW5zaWduZWQgaW50KWFvLT5vdXRwdXQyYnVmZmVyNV95X3BoeSwKLQkJCQkodW5zaWduZWQgaW50KWFvLT5vdXRwdXQyYnVmZmVyNV9jYmNyX3BoeSk7Ci0JCQlDREJHKCIleCAleFxuIiwgKHVuc2lnbmVkIGludClhby0+b3V0cHV0MmJ1ZmZlcjZfeV9waHksCi0JCQkJKHVuc2lnbmVkIGludClhby0+b3V0cHV0MmJ1ZmZlcjZfY2Jjcl9waHkpOwotCQkJQ0RCRygiJXggJXhcbiIsICh1bnNpZ25lZCBpbnQpYW8tPm91dHB1dDJidWZmZXI3X3lfcGh5LAotCQkJCSh1bnNpZ25lZCBpbnQpYW8tPm91dHB1dDJidWZmZXI3X2NiY3JfcGh5KTsKLQkJfQotCX0gZWxzZSBpZiAobW9kZSA9PSBPVVRQVVRfU0VDKSB7Ci0JCS8qIFRodW1ibmFpbCAqLwotCQlpZiAodmZlMnhfY3RybC0+enNsX21vZGUpIHsKLQkJCWFvLT5vdXRwdXQxYnVmZmVyMV95X3BoeSA9IGFkLT5waW5nLmNoX3BhZGRyWzBdOwotCQkJYW8tPm91dHB1dDFidWZmZXIxX2NiY3JfcGh5ID0gYWQtPnBpbmcuY2hfcGFkZHJbMV07Ci0JCQlhby0+b3V0cHV0MWJ1ZmZlcjJfeV9waHkgPSBhZC0+cG9uZy5jaF9wYWRkclswXTsKLQkJCWFvLT5vdXRwdXQxYnVmZmVyMl9jYmNyX3BoeSA9IGFkLT5wb25nLmNoX3BhZGRyWzFdOwotCQkJYW8tPm91dHB1dDFidWZmZXIzX3lfcGh5ID0gYWQtPmZyZWVfYnVmLmNoX3BhZGRyWzBdOwotCQkJYW8tPm91dHB1dDFidWZmZXIzX2NiY3JfcGh5ID0gYWQtPmZyZWVfYnVmLmNoX3BhZGRyWzFdOwotCQkJYnB0ciA9ICZhby0+b3V0cHV0MWJ1ZmZlcjRfeV9waHk7Ci0JCQlmb3IgKGNudCA9IDA7IGNudCA8IDU7IGNudCsrKSB7Ci0JCQkJKmJwdHIgPSBhZC0+cG9uZy5jaF9wYWRkclswXTsKLQkJCQlicHRyKys7Ci0JCQkJKmJwdHIgPSBhZC0+cG9uZy5jaF9wYWRkclsxXTsKLQkJCQlicHRyKys7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlhby0+b3V0cHV0MWJ1ZmZlcjFfeV9waHkgPSBhZC0+cGluZy5jaF9wYWRkclswXTsKLQkJCWFvLT5vdXRwdXQxYnVmZmVyMV9jYmNyX3BoeSA9IGFkLT5waW5nLmNoX3BhZGRyWzFdOwotCQkJYW8tPm91dHB1dDFidWZmZXIyX3lfcGh5ID0gYWQtPnBvbmcuY2hfcGFkZHJbMF07Ci0JCQlhby0+b3V0cHV0MWJ1ZmZlcjJfY2Jjcl9waHkgPSBhZC0+cG9uZy5jaF9wYWRkclsxXTsKLQkJCWJwdHIgPSAmYW8tPm91dHB1dDFidWZmZXIzX3lfcGh5OwotCQkJZm9yIChjbnQgPSAwOyBjbnQgPCA2OyBjbnQrKykgewotCQkJCSpicHRyID0gYWQtPnBvbmcuY2hfcGFkZHJbMF07Ci0JCQkJYnB0cisrOwotCQkJCSpicHRyID0gYWQtPnBvbmcuY2hfcGFkZHJbMV07Ci0JCQkJYnB0cisrOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChtb2RlID09IE9VVFBVVF9QUklNICYmIG9fbW9kZSAhPSBTTkFQU0hPVF9NQVNLX01PREUpIHsKLQkJLyogUHJldmlldyAqLwotCQlhby0+b3V0cHV0MmJ1ZmZlcjFfeV9waHkgPSBhZC0+cGluZy5jaF9wYWRkclswXTsKLQkJYW8tPm91dHB1dDJidWZmZXIxX2NiY3JfcGh5ID0gYWQtPnBpbmcuY2hfcGFkZHJbMV07Ci0JCWFvLT5vdXRwdXQyYnVmZmVyMl95X3BoeSA9IGFkLT5wb25nLmNoX3BhZGRyWzBdOwotCQlhby0+b3V0cHV0MmJ1ZmZlcjJfY2Jjcl9waHkgPSBhZC0+cG9uZy5jaF9wYWRkclsxXTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTJ4X2N0cmwtPmxpdmVzaG90X2VuYWJsZWRfbG9jaywKLQkJCQlmbGFncyk7Ci0JCWlmICh2ZmUyeF9jdHJsLT5saXZlc2hvdF9lbmFibGVkKSB7IC8qIExpdmUgc2hvdCAqLwotCQkJYW8tPm91dHB1dDJidWZmZXIzX3lfcGh5ID0gYWQtPnBvbmcuY2hfcGFkZHJbMF07Ci0JCQlhby0+b3V0cHV0MmJ1ZmZlcjNfY2Jjcl9waHkgPSBhZC0+cG9uZy5jaF9wYWRkclsxXTsKLQkJfSBlbHNlIHsKLQkJCWFvLT5vdXRwdXQyYnVmZmVyM195X3BoeSA9IGFkLT5mcmVlX2J1Zi5jaF9wYWRkclswXTsKLQkJCWFvLT5vdXRwdXQyYnVmZmVyM19jYmNyX3BoeSA9IGFkLT5mcmVlX2J1Zi5jaF9wYWRkclsxXTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUyeF9jdHJsLT5saXZlc2hvdF9lbmFibGVkX2xvY2ssCi0JCQkJZmxhZ3MpOwotCQlicHRyID0gJmFvLT5vdXRwdXQyYnVmZmVyNF95X3BoeTsKLQkJZm9yIChjbnQgPSAwOyBjbnQgPCA1OyBjbnQrKykgewotCQkJKmJwdHIgPSBhZC0+cG9uZy5jaF9wYWRkclswXTsKLQkJCWJwdHIrKzsKLQkJCSpicHRyID0gYWQtPnBvbmcuY2hfcGFkZHJbMV07Ci0JCQlicHRyKys7Ci0JCX0KLQkJQ0RCRygiJXggJXhcbiIsICh1bnNpZ25lZCBpbnQpYW8tPm91dHB1dDJidWZmZXIxX3lfcGh5LAotCQkJKHVuc2lnbmVkIGludClhby0+b3V0cHV0MmJ1ZmZlcjFfY2Jjcl9waHkpOwotCQlDREJHKCIleCAleFxuIiwgKHVuc2lnbmVkIGludClhby0+b3V0cHV0MmJ1ZmZlcjJfeV9waHksCi0JCQkodW5zaWduZWQgaW50KWFvLT5vdXRwdXQyYnVmZmVyMl9jYmNyX3BoeSk7Ci0JCUNEQkcoIiV4ICV4XG4iLCAodW5zaWduZWQgaW50KWFvLT5vdXRwdXQyYnVmZmVyM195X3BoeSwKLQkJCSh1bnNpZ25lZCBpbnQpYW8tPm91dHB1dDJidWZmZXIzX2NiY3JfcGh5KTsKLQkJQ0RCRygiJXggJXhcbiIsICh1bnNpZ25lZCBpbnQpYW8tPm91dHB1dDJidWZmZXI0X3lfcGh5LAotCQkJKHVuc2lnbmVkIGludClhby0+b3V0cHV0MmJ1ZmZlcjRfY2Jjcl9waHkpOwotCQlDREJHKCIleCAleFxuIiwgKHVuc2lnbmVkIGludClhby0+b3V0cHV0MmJ1ZmZlcjVfeV9waHksCi0JCQkodW5zaWduZWQgaW50KWFvLT5vdXRwdXQyYnVmZmVyNV9jYmNyX3BoeSk7Ci0JCUNEQkcoIiV4ICV4XG4iLCAodW5zaWduZWQgaW50KWFvLT5vdXRwdXQyYnVmZmVyNl95X3BoeSwKLQkJCSh1bnNpZ25lZCBpbnQpYW8tPm91dHB1dDJidWZmZXI2X2NiY3JfcGh5KTsKLQkJQ0RCRygiJXggJXhcbiIsICh1bnNpZ25lZCBpbnQpYW8tPm91dHB1dDJidWZmZXI3X3lfcGh5LAotCQkJKHVuc2lnbmVkIGludClhby0+b3V0cHV0MmJ1ZmZlcjdfY2Jjcl9waHkpOwotCQl2ZmUyeF9jdHJsLT5mcmVlX2J1Zi5idWZbMF0uY2hfcGFkZHJbMF0gPSBhZC0+cGluZy5jaF9wYWRkclswXTsKLQkJdmZlMnhfY3RybC0+ZnJlZV9idWYuYnVmWzBdLmNoX3BhZGRyWzFdID0gYWQtPnBpbmcuY2hfcGFkZHJbMV07Ci0JCXZmZTJ4X2N0cmwtPmZyZWVfYnVmLmJ1ZlsxXS5jaF9wYWRkclswXSA9IGFkLT5wb25nLmNoX3BhZGRyWzBdOwotCQl2ZmUyeF9jdHJsLT5mcmVlX2J1Zi5idWZbMV0uY2hfcGFkZHJbMV0gPSBhZC0+cG9uZy5jaF9wYWRkclsxXTsKLQkJdmZlMnhfY3RybC0+ZnJlZV9idWYuYnVmWzJdLmNoX3BhZGRyWzBdID0KLQkJCWFkLT5mcmVlX2J1Zi5jaF9wYWRkclswXTsKLQkJdmZlMnhfY3RybC0+ZnJlZV9idWYuYnVmWzJdLmNoX3BhZGRyWzFdID0KLQkJCWFkLT5mcmVlX2J1Zi5jaF9wYWRkclsxXTsKLQl9IGVsc2UgaWYgKG1vZGUgPT0gT1VUUFVUX1BSSU0gJiYgb19tb2RlID09IFNOQVBTSE9UX01BU0tfTU9ERSkgewotCQl2ZmUyeF9jdHJsLT5yZWNvbmZpZ192ZmUgPSAwOwotCQlpZiAocmF3X21vZGUpIHsKLQkJCWFvLT5vdXRwdXQyYnVmZmVyMV95X3BoeSA9IGFkLT5waW5nLmNoX3BhZGRyWzBdOwotCQkJYW8tPm91dHB1dDJidWZmZXIxX2NiY3JfcGh5ID0gYWQtPnBpbmcuY2hfcGFkZHJbMF07Ci0JCQlhby0+b3V0cHV0MmJ1ZmZlcjJfeV9waHkgPSBhZC0+cG9uZy5jaF9wYWRkclswXTsKLQkJCWFvLT5vdXRwdXQyYnVmZmVyMl9jYmNyX3BoeSA9IGFkLT5wb25nLmNoX3BhZGRyWzBdOwotCQl9IGVsc2UgewotCQkJYW8tPm91dHB1dDJidWZmZXIxX3lfcGh5ID0gYWQtPnBpbmcuY2hfcGFkZHJbMF07Ci0JCQlhby0+b3V0cHV0MmJ1ZmZlcjFfY2Jjcl9waHkgPSBhZC0+cGluZy5jaF9wYWRkclsxXTsKLQkJCWFvLT5vdXRwdXQyYnVmZmVyMl95X3BoeSA9IGFkLT5wb25nLmNoX3BhZGRyWzBdOwotCQkJYW8tPm91dHB1dDJidWZmZXIyX2NiY3JfcGh5ID0gYWQtPnBvbmcuY2hfcGFkZHJbMV07Ci0JfQotCQlicHRyID0gJmFvLT5vdXRwdXQyYnVmZmVyM195X3BoeTsKLQkJZm9yIChjbnQgPSAwOyBjbnQgPCA2OyBjbnQrKykgewotCQkJKmJwdHIgPSBhZC0+cG9uZy5jaF9wYWRkclswXTsKLQkJCWJwdHIrKzsKLQkJCSpicHRyID0gYWQtPnBvbmcuY2hfcGFkZHJbMV07Ci0JCQlicHRyKys7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZTJ4X3N1YmRldl9ub3RpZnkoaW50IGlkLCBpbnQgcGF0aCkKLXsKLQlzdHJ1Y3QgbXNtX3ZmZV9yZXNwIHJwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUyeF9jdHJsLT5zZF9ub3RpZnlfbG9jaywgZmxhZ3MpOwotCW1lbXNldCgmcnAsIDAsIHNpemVvZihzdHJ1Y3QgbXNtX3ZmZV9yZXNwKSk7Ci0JQ0RCRygidmZlMnhfc3ViZGV2X25vdGlmeSA6IG1zZ0lkID0gJWRcbiIsIGlkKTsKLQlycC5ldnRfbXNnLnR5cGUgICA9IE1TTV9DQU1FUkFfTVNHOwotCXJwLmV2dF9tc2cubXNnX2lkID0gcGF0aDsKLQlycC5ldnRfbXNnLmRhdGEgPSBOVUxMOwotCXJwLnR5cGUJICAgPSBpZDsKLQl2NGwyX3N1YmRldl9ub3RpZnkoJnZmZTJ4X2N0cmwtPnN1YmRldiwgTk9USUZZX1ZGRV9CVUZfRVZULCAmcnApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTJ4X2N0cmwtPnNkX25vdGlmeV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2ZyZWVfYnVmICp2ZmUyeF9jaGVja19mcmVlX2J1ZmZlcihpbnQgaWQsIGludCBwYXRoKQotewotCXN0cnVjdCBidWZfaW5mbyAqb3V0Y2ggPSBOVUxMOwotCi0JdmZlMnhfc3ViZGV2X25vdGlmeShpZCwgcGF0aCk7Ci0JaWYgKG9wX21vZGUgJiBTTkFQU0hPVF9NQVNLX01PREUpIHsKLQkJaWYgKHBhdGggPT0gVkZFX01TR19PVVRQVVRfUFJJTUFSWSB8fAotCQkJCXBhdGggPT0gVkZFX01TR19WMlhfTElWRVNIT1RfUFJJTUFSWSkKLQkJCW91dGNoID0gJnZmZTJ4X2N0cmwtPnNuYXA7Ci0JCWVsc2UgaWYgKHBhdGggPT0gVkZFX01TR19PVVRQVVRfU0VDT05EQVJZKQotCQkJb3V0Y2ggPSAmdmZlMnhfY3RybC0+dGh1bWI7Ci0JfSBlbHNlIHsKLQkJaWYgKHBhdGggPT0gVkZFX01TR19PVVRQVVRfUFJJTUFSWSB8fAotCQkJCXBhdGggPT0gVkZFX01TR19WMlhfTElWRVNIT1RfUFJJTUFSWSkgewotCQkJaWYgKHZmZTJ4X2N0cmwtPnpzbF9tb2RlKQotCQkJCW91dGNoID0gJnZmZTJ4X2N0cmwtPnpzbF9wcmltOwotCQkJZWxzZQotCQkJCW91dGNoID0gJnZmZTJ4X2N0cmwtPnByZXY7Ci0JCX0gZWxzZSBpZiAocGF0aCA9PSBWRkVfTVNHX09VVFBVVF9TRUNPTkRBUlkpCi0JCQkJb3V0Y2ggPSAmdmZlMnhfY3RybC0+enNsX3NlYzsKLQl9Ci0JaWYgKG91dGNoLT5mcmVlX2J1Zi5jaF9wYWRkclswXSkKLQkJcmV0dXJuICZvdXRjaC0+ZnJlZV9idWY7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCB2ZmUyeF9jb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycyhpbnQgaWQsIGludCBwYXRoKQotewotCXN0cnVjdCBidWZfaW5mbyAqb3V0Y2ggPSBOVUxMOwotCWludCByYyA9IDA7Ci0KLQl2ZmUyeF9zdWJkZXZfbm90aWZ5KGlkLCBwYXRoKTsKLQlDREJHKCJPcG1vZGUgPSAlZFxuIiwgb3BfbW9kZSk7Ci0JaWYgKG9wX21vZGUgJiBTTkFQU0hPVF9NQVNLX01PREUpIHsKLQkJaWYgKHBhdGggPT0gVkZFX01TR19PVVRQVVRfUFJJTUFSWSB8fAotCQkJCXBhdGggPT0gVkZFX01TR19WMlhfTElWRVNIT1RfUFJJTUFSWSkKLQkJCW91dGNoID0gJnZmZTJ4X2N0cmwtPnNuYXA7Ci0JCWVsc2UgaWYgKHBhdGggPT0gVkZFX01TR19PVVRQVVRfU0VDT05EQVJZKQotCQkJb3V0Y2ggPSAmdmZlMnhfY3RybC0+dGh1bWI7Ci0JfSBlbHNlIHsKLQkJaWYgKHBhdGggPT0gVkZFX01TR19PVVRQVVRfUFJJTUFSWSB8fAotCQkJCXBhdGggPT0gVkZFX01TR19WMlhfTElWRVNIT1RfUFJJTUFSWSkgewotCQkJaWYgKHZmZTJ4X2N0cmwtPnpzbF9tb2RlKQotCQkJCW91dGNoID0gJnZmZTJ4X2N0cmwtPnpzbF9wcmltOwotCQkJZWxzZQotCQkJCW91dGNoID0gJnZmZTJ4X2N0cmwtPnByZXY7Ci0JCX0gZWxzZSBpZiAocGF0aCA9PSBWRkVfTVNHX09VVFBVVF9TRUNPTkRBUlkpCi0JCQlvdXRjaCA9ICZ2ZmUyeF9jdHJsLT56c2xfc2VjOwotCX0KLQlpZiAob3V0Y2gtPnBpbmcuY2hfcGFkZHJbMF0gJiYgb3V0Y2gtPnBvbmcuY2hfcGFkZHJbMF0pIHsKLQkJLyogQ29uZmlndXJlIFByZXZpZXcgUGluZyBQb25nICovCi0JCUNEQkcoIiVzIENvbmZpZ3VyZSBwaW5nL3BvbmcgYWRkcmVzcyBmb3IgJWQiLAotCQkJCQkJX19mdW5jX18sIHBhdGgpOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXMgcGluZy9wb25nIGFkZHIgaXMgbnVsbCEhIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHN0cnVjdCBidWZfaW5mbyAqdmZlMnhfZ2V0X2NoKGludCBwYXRoKQotewotCXN0cnVjdCBidWZfaW5mbyAqY2ggPSBOVUxMOwotCi0JQ0RCRygicGF0aCA9ICVkIG9wX21vZGUgPSAlZFxuIiwgcGF0aCwgb3BfbW9kZSk7Ci0JLyogVE9ETzogUmVtb3ZlIE1vZGUgc3BlY2lmaWMgc3R1ZmYgKi8KLQlpZiAob3BfbW9kZSAmIFNOQVBTSE9UX01BU0tfTU9ERSkgewotCQlpZiAocGF0aCA9PSBWRkVfTVNHX09VVFBVVF9TRUNPTkRBUlkpCi0JCQljaCA9ICZ2ZmUyeF9jdHJsLT50aHVtYjsKLQkJZWxzZSBpZiAocGF0aCA9PSBWRkVfTVNHX09VVFBVVF9QUklNQVJZIHx8Ci0JCQkJCXBhdGggPT0gVkZFX01TR19WMlhfTElWRVNIT1RfUFJJTUFSWSkKLQkJCWNoID0gJnZmZTJ4X2N0cmwtPnNuYXA7Ci0JfSBlbHNlIHsKLQkJaWYgKHBhdGggPT0gVkZFX01TR19PVVRQVVRfUFJJTUFSWSB8fAotCQkJCQlwYXRoID09IFZGRV9NU0dfVjJYX0xJVkVTSE9UX1BSSU1BUlkpIHsKLQkJCWlmICh2ZmUyeF9jdHJsLT56c2xfbW9kZSkKLQkJCQljaCA9ICZ2ZmUyeF9jdHJsLT56c2xfcHJpbTsKLQkJCWVsc2UKLQkJCQljaCA9ICZ2ZmUyeF9jdHJsLT5wcmV2OwotCQl9IGVsc2UgaWYgKHBhdGggPT0gVkZFX01TR19PVVRQVVRfU0VDT05EQVJZKQotCQkJY2ggPSAmdmZlMnhfY3RybC0+enNsX3NlYzsKLQl9Ci0KLQlCVUdfT04oY2ggPT0gTlVMTCk7Ci0JcmV0dXJuIGNoOwotfQotCi1zdGF0aWMgbG9uZyBtc21fdmZlX3N1YmRldl9pb2N0bChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCQkJdW5zaWduZWQgaW50IHN1YmRldl9jbWQsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgbXNtX2lzcF9jbWQgdmZlY21kOwotCXN0cnVjdCBtc21fY2FtdmZlX3BhcmFtcyAqdmZlX3BhcmFtczsKLQlzdHJ1Y3QgbXNtX3ZmZV9jZmdfY21kICpjbWQ7Ci0Jc3RydWN0IHRhYmxlX2NtZCAqdGFibGVfcGVuZGluZzsKLQlsb25nIHJjID0gMDsKLQl2b2lkICpkYXRhOwotCi0Jc3RydWN0IG1zbV9wbWVtX3JlZ2lvbiAqcmVncHRyOwotCXVuc2lnbmVkIGNoYXIgYnVmWzI1Nl07Ci0KLQlzdHJ1Y3QgdmZlX3N0YXRzX2FjayBzYWNrOwotCXN0cnVjdCBheGlkYXRhICpheGlkOwotCXVpbnQzMl90IGk7Ci0JdWludDMyX3QgaGVhZGVyID0gMDsKLQl1aW50MzJfdCBxdWV1ZSA9IDA7Ci0Jc3RydWN0IHZmZV9zdGF0c193ZV9jZmcgKnNjZmcgPSBOVUxMOwotCXN0cnVjdCB2ZmVfc3RhdHNfYWZfY2ZnICpzZmNmZyA9IE5VTEw7Ci0KLQlzdHJ1Y3QgYXhpb3V0ICpheGlvID0gTlVMTDsKLQl2b2lkICAgKmNtZF9kYXRhID0gTlVMTDsKLQl2b2lkICAgKmNtZF9kYXRhX2FsbG9jID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBtc21fZnJlZV9idWYgKmZyZWVfYnVmID0gTlVMTDsKLQlzdHJ1Y3QgdmZlX291dHB1dGFjayBmYWNrOwotCi0JQ0RCRygibXNtX3ZmZV9zdWJkZXZfaW9jdGwgaXMgY2FsbGVkXG4iKTsKLQlpZiAoc3ViZGV2X2NtZCA9PSBWSURJT0NfTVNNX1ZGRV9JTklUKSB7Ci0JCUNEQkcoIiVzIGluaXRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIG1zbV92ZmVfc3ViZGV2X2luaXQoc2QpOwotCX0gZWxzZSBpZiAoc3ViZGV2X2NtZCA9PSBWSURJT0NfTVNNX1ZGRV9SRUxFQVNFKSB7Ci0JCW1zbV92ZmVfc3ViZGV2X3JlbGVhc2Uoc2QpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl2ZmVfcGFyYW1zID0gKHN0cnVjdCBtc21fY2FtdmZlX3BhcmFtcyAqKWFyZzsKLQljbWQgPSB2ZmVfcGFyYW1zLT52ZmVfY2ZnOwotCWRhdGEgPSB2ZmVfcGFyYW1zLT5kYXRhOwotCi0JaWYgKGNtZC0+Y21kX3R5cGUgIT0gQ01EX0ZSQU1FX0JVRl9SRUxFQVNFICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX0JVRl9SRUxFQVNFICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX1NUQVRTX0FGX0JVRl9SRUxFQVNFICYmCi0JCWNtZC0+Y21kX3R5cGUgIT0gQ01EX0NPTkZJR19QSU5HX0FERFIgJiYKLQkJY21kLT5jbWRfdHlwZSAhPSBDTURfQ09ORklHX1BPTkdfQUREUiAmJgotCQljbWQtPmNtZF90eXBlICE9IENNRF9DT05GSUdfRlJFRV9CVUZfQUREUiAmJgotCQljbWQtPmNtZF90eXBlICE9IENNRF9WRkVfQlVGRkVSX1JFTEVBU0UgJiYKLQkJY21kLT5jbWRfdHlwZSAhPSBWRkVfQ01EX1NUQVRTX1JFUUJVRiAmJgotCQljbWQtPmNtZF90eXBlICE9IFZGRV9DTURfU1RBVFNfRkxVU0hfQlVGUSAmJgotCQljbWQtPmNtZF90eXBlICE9IFZGRV9DTURfU1RBVFNfVU5SRUdCVUYgJiYKLQkJY21kLT5jbWRfdHlwZSAhPSBWRkVfQ01EX1NUQVRTX0VOUVVFVUVCVUYpIHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZmVjbWQsCi0JCQkgICAodm9pZCBfX3VzZXIgKikoY21kLT52YWx1ZSksCi0JCQkgICBzaXplb2YodmZlY21kKSkpIHsKLQkJCXByX2VycigiY29weV9mcm9tX3VzZXIgaW4gbXNtX3ZmZV9zdWJkZXZfaW9jdGwgZmFpbFxuIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCX0KLQlzd2l0Y2ggKGNtZC0+Y21kX3R5cGUpIHsKLQljYXNlIFZGRV9DTURfU1RBVFNfUkVRQlVGOgotCWNhc2UgVkZFX0NNRF9TVEFUU19GTFVTSF9CVUZROgotCWNhc2UgVkZFX0NNRF9TVEFUU19VTlJFR0JVRjoKLQkJLyogZm9yIGVhc3kgcG9ydGluZyBwdXQgaW4gb25lIGVudmVsb3BlICovCi0JCXJjID0gdmZlMnhfc3RhdHNfYnVmcV9zdWJfaW9jdGwoY21kLCB2ZmVfcGFyYW1zLT5kYXRhKTsKLQkJcmV0dXJuIHJjOwotCWNhc2UgVkZFX0NNRF9TVEFUU19FTlFVRVVFQlVGOgotCQlpZiAoc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfYnVmX2luZm8pICE9IGNtZC0+bGVuZ3RoKSB7Ci0JCQkvKiBlcnJvci4gdGhlIGxlbmd0aCBub3QgbWF0Y2ggKi8KLQkJCXByX2VycigiJXM6IHN0YXRzIGVucXVldWVidWYgaW5wdXQgc2l6ZSA9ICVkLFxuIgotCQkJCSJzdHJ1Y3Qgc2l6ZSA9ICVkLCBtaXRjaCBtYXRjaFxuIixcCi0JCQkJX19mdW5jX18sIGNtZC0+bGVuZ3RoLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX2J1Zl9pbmZvKSk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQkJc2Fjay5oZWFkZXIgPSAwOwotCQlzYWNrLmJ1ZmFkZHIgPSBOVUxMOwotCQlyYyA9IHZmZTJ4X3N0YXRzX2VucXVldWVidWYoY21kLT52YWx1ZSwgJnNhY2spOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBlcnJvciIsIF9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCXJldHVybiByYzsKLQkJfQotCQlpZiAoc2Fjay5oZWFkZXIgIT0gMCAmJiBzYWNrLmJ1ZmFkZHIgIT0gTlVMTCkgewotCQkJcXVldWUgID0gUURTUF9DTURRVUVVRTsKLQkJCXZmZWNtZC5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHZmZV9zdGF0c19hY2spIC0gNDsKLQkJCWNtZF9kYXRhID0gJnNhY2s7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCWJyZWFrOwotCWNhc2UgQ01EX1ZGRV9CVUZGRVJfUkVMRUFTRTogewotCQlpZiAoISh2ZmUyeF9jdHJsLT52ZmVfc3RhcnRlZCkgfHwgb3BfbW9kZSA9PSAxKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChvcF9tb2RlICYgU05BUFNIT1RfTUFTS19NT0RFKSB7Ci0JCQlmcmVlX2J1ZiA9IHZmZTJ4X2NoZWNrX2ZyZWVfYnVmZmVyKAotCQkJCQlWRkVfTVNHX09VVFBVVF9JUlEsCi0JCQkJCVZGRV9NU0dfT1VUUFVUX1NFQ09OREFSWSk7Ci0JCX0gZWxzZSB7Ci0JCQlmcmVlX2J1ZiA9IHZmZTJ4X2NoZWNrX2ZyZWVfYnVmZmVyKAotCQkJCQlWRkVfTVNHX09VVFBVVF9JUlEsCi0JCQkJCVZGRV9NU0dfT1VUUFVUX1BSSU1BUlkpOwotCQkJaWYgKGZyZWVfYnVmKSB7Ci0JCQkJZmFjay5oZWFkZXIgPSBWRkVfT1VUUFVUMl9BQ0s7Ci0KLQkJCQlmYWNrLm91dHB1dDJuZXd5YnVmZmVyYWRkcmVzcyA9Ci0JCQkJCQkodm9pZCAqKShmcmVlX2J1Zi0+Y2hfcGFkZHJbMF0pOwotCi0JCQkJZmFjay5vdXRwdXQybmV3Y2JjcmJ1ZmZlcmFkZHJlc3MgPQotCQkJCQkJKHZvaWQgKikoZnJlZV9idWYtPmNoX3BhZGRyWzFdKTsKLQotCQkJCWNtZF9kYXRhID0gJmZhY2s7Ci0JCQkJdmZlY21kLmxlbmd0aCA9IHNpemVvZihmYWNrKSAtIDQ7Ci0JCQkJcXVldWUgPSBRRFNQX0NNRFFVRVVFOwotCQkJfQotCQl9Ci0JfQotCWJyZWFrOwotCWNhc2UgQ01EX0NPTkZJR19QSU5HX0FERFI6IHsKLQkJaW50IHBhdGggPSAqKChpbnQgKiljbWQtPnZhbHVlKTsKLQkJc3RydWN0IGJ1Zl9pbmZvICpvdXRjaCA9IHZmZTJ4X2dldF9jaChwYXRoKTsKLQkJb3V0Y2gtPnBpbmcgPSAqKChzdHJ1Y3QgbXNtX2ZyZWVfYnVmICopZGF0YSk7Ci0JfQotCQlyZXR1cm4gMDsKLQljYXNlIENNRF9DT05GSUdfUE9OR19BRERSOiB7Ci0JCWludCBwYXRoID0gKigoaW50ICopY21kLT52YWx1ZSk7Ci0JCXN0cnVjdCBidWZfaW5mbyAqb3V0Y2ggPSB2ZmUyeF9nZXRfY2gocGF0aCk7Ci0JCW91dGNoLT5wb25nID0gKigoc3RydWN0IG1zbV9mcmVlX2J1ZiAqKWRhdGEpOwotCX0KLQkJcmV0dXJuIDA7Ci0KLQljYXNlIENNRF9BWElfU1RBUlQ6Ci0JY2FzZSBDTURfQVhJX1NUT1A6Ci0JY2FzZSBDTURfQVhJX1JFU0VUOgotCQlyZXR1cm4gMDsKLQotCWNhc2UgQ01EX0NPTkZJR19GUkVFX0JVRl9BRERSOiB7Ci0JCWludCBwYXRoID0gKigoaW50ICopY21kLT52YWx1ZSk7Ci0JCXN0cnVjdCBidWZfaW5mbyAqb3V0Y2ggPSB2ZmUyeF9nZXRfY2gocGF0aCk7Ci0JCWlmICgob3BfbW9kZSAmIFNOQVBTSE9UX01BU0tfTU9ERSkgJiYKLQkJCSh2ZmUyeF9jdHJsLT5udW1fc25hcCA+IDEpKSB7Ci0JCQlDREJHKCIlczogQ01EX0NPTkZJR19GUkVFX0JVRl9BRERSIEJ1cnN0IG1vZGUgJWQiLAotCQkJCQlfX2Z1bmNfXywgb3V0Y2gtPmZyZWVfYnVmX2NudCk7Ci0JCQlpZiAob3V0Y2gtPmZyZWVfYnVmX2NudCA8PSAwKQotCQkJCW91dGNoLT5mcmVlX2J1ZiA9Ci0JCQkJCSooKHN0cnVjdCBtc21fZnJlZV9idWYgKilkYXRhKTsKLQkJCWVsc2UKLQkJCQlvdXRjaC0+ZnJlZV9idWZfYXJyW291dGNoLT5mcmVlX2J1Zl9jbnQtMV0gPQotCQkJCQkqKChzdHJ1Y3QgbXNtX2ZyZWVfYnVmICopZGF0YSk7Ci0JCQkrK291dGNoLT5mcmVlX2J1Zl9jbnQ7Ci0JCX0gZWxzZSB7Ci0JCQlvdXRjaC0+ZnJlZV9idWYgPSAqKChzdHJ1Y3QgbXNtX2ZyZWVfYnVmICopZGF0YSk7Ci0JCX0KLQl9Ci0JCXJldHVybiAwOwotCi0JY2FzZSBDTURfU1RBVFNfQVhJX0NGRzogewotCQlheGlkID0gZGF0YTsKLQkJaWYgKCFheGlkKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNvbmZpZ19mYWlsdXJlOwotCQl9Ci0KLQkJc2NmZyA9Ci0JCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmZlX3N0YXRzX3dlX2NmZyksCi0JCQkJR0ZQX0FUT01JQyk7Ci0JCWlmICghc2NmZykgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBjb25maWdfZmFpbHVyZTsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigoY2hhciAqKXNjZmcgKyA0LAotCQkJCQkodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQkJdmZlY21kLmxlbmd0aCkpIHsKLQotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCi0JCUNEQkcoIlNUQVRTX0VOQUJMRTogYnVmbnVtID0gJWQsIGVuYWJsaW5nID0gJWRcbiIsCi0JCQlheGlkLT5idWZudW0xLCBzY2ZnLT53Yl9leHBzdGF0c2VuYWJsZSk7Ci0KLQkJaGVhZGVyID0gY21kc19tYXBbdmZlY21kLmlkXS52ZmVfaWQ7Ci0JCXF1ZXVlID0gY21kc19tYXBbdmZlY21kLmlkXS5xdWV1ZTsKLQkJaWYgKGhlYWRlciA9PSAtMSAmJiBxdWV1ZSA9PSAtMSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBjb25maWdfZmFpbHVyZTsKLQkJfQotCQkqKHVpbnQzMl90ICopc2NmZyA9IGhlYWRlcjsKLQkJaWYgKGF4aWQtPmJ1Zm51bTEgPiAwKSB7Ci0JCQlyZWdwdHIgPSBheGlkLT5yZWdpb247Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBheGlkLT5idWZudW0xOyBpKyspIHsKLQotCQkJCUNEQkcoIlNUQVRTX0VOQUJMRSwgcGh5ID0gMHglbHhcbiIsCi0JCQkJCXJlZ3B0ci0+cGFkZHIpOwotCi0JCQkJc2NmZy0+d2JfZXhwc3RhdG91dHB1dGJ1ZmZlcltpXSA9Ci0JCQkJCSh2b2lkICopcmVncHRyLT5wYWRkcjsKLQkJCQlyZWdwdHIrKzsKLQkJCX0KLQotCQkJY21kX2RhdGEgPSBzY2ZnOwotCi0JCX0gZWxzZSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGNvbmZpZ19kb25lOwotCQl9Ci0JfQotCQlicmVhazsKLQljYXNlIENNRF9TVEFUU19BRUNfQVdCX0VOQUJMRTogewotCQlwcl9lcnIoIkNNRF9TVEFUU19BRUNfQVdCX0VOQUJMRVxuIik7Ci0JCXNjZmcgPQotCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHZmZV9zdGF0c193ZV9jZmcpLAotCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIXNjZmcpIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoKGNoYXIgKilzY2ZnICsgNCwKLQkJCQkJKHZvaWQgX191c2VyICopKHZmZWNtZC52YWx1ZSksCi0JCQkJCXZmZWNtZC5sZW5ndGgpKSB7Ci0KLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQotCQloZWFkZXIgPSBjbWRzX21hcFt2ZmVjbWQuaWRdLnZmZV9pZDsKLQkJcXVldWUgPSBjbWRzX21hcFt2ZmVjbWQuaWRdLnF1ZXVlOwotCQlpZiAoaGVhZGVyID09IC0xICYmIHF1ZXVlID09IC0xKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNvbmZpZ19mYWlsdXJlOwotCQl9Ci0JCSoodWludDMyX3QgKilzY2ZnID0gaGVhZGVyOwotCQlyYyA9IHZmZTJ4X3N0YXRzX2J1Zl9pbml0KE1TTV9TVEFUU19UWVBFX0FFX0FXKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogY2Fubm90IGNvbmZpZyBwaW5nL3BvbmcgYWRkcmVzcyBvZiBBV0IiLAotCQkJCSBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGNvbmZpZ19mYWlsdXJlOwotCQl9Ci0JCXNjZmctPndiX2V4cHN0YXRvdXRwdXRidWZmZXJbMF0gPQotCQkJKHZvaWQgKil2ZmUyeF9jdHJsLT5zdGF0c193ZV9idWZfcHRyWzBdOwotCQlzY2ZnLT53Yl9leHBzdGF0b3V0cHV0YnVmZmVyWzFdID0KLQkJCSh2b2lkICopdmZlMnhfY3RybC0+c3RhdHNfd2VfYnVmX3B0clsxXTsKLQkJc2NmZy0+d2JfZXhwc3RhdG91dHB1dGJ1ZmZlclsyXSA9Ci0JCQkodm9pZCAqKXZmZTJ4X2N0cmwtPnN0YXRzX3dlX2J1Zl9wdHJbMl07Ci0JCWNtZF9kYXRhID0gc2NmZzsKLQl9Ci0JYnJlYWs7Ci0JY2FzZSBDTURfU1RBVFNfQUZfRU5BQkxFOgotCWNhc2UgQ01EX1NUQVRTX0FGX0FYSV9DRkc6IHsKLQkJQ0RCRygiQ01EX1NUQVRTX0FGX0VOQUJMRSBDTURfU1RBVFNfQUZfQVhJX0NGR1xuIik7Ci0JCXNmY2ZnID0KLQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZmVfc3RhdHNfYWZfY2ZnKSwKLQkJCQlHRlBfQVRPTUlDKTsKLQotCQlpZiAoIXNmY2ZnKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGNvbmZpZ19mYWlsdXJlOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKChjaGFyICopc2ZjZmcgKyA0LAotCQkJCQkodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQkJdmZlY21kLmxlbmd0aCkpIHsKLQotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCi0JCWhlYWRlciA9IGNtZHNfbWFwW3ZmZWNtZC5pZF0udmZlX2lkOwotCQlxdWV1ZSA9IGNtZHNfbWFwW3ZmZWNtZC5pZF0ucXVldWU7Ci0JCWlmIChoZWFkZXIgPT0gLTEgJiYgcXVldWUgPT0gLTEpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQkJKih1aW50MzJfdCAqKXNmY2ZnID0gaGVhZGVyOwotCQlyYyA9IHZmZTJ4X3N0YXRzX2J1Zl9pbml0KE1TTV9TVEFUU19UWVBFX0FGKTsKLQkJc2ZjZmctPmFmX291dGJ1ZlswXSA9ICh2b2lkICopdmZlMnhfY3RybC0+c3RhdHNfYWZfYnVmX3B0clswXTsKLQkJc2ZjZmctPmFmX291dGJ1ZlsxXSA9ICh2b2lkICopdmZlMnhfY3RybC0+c3RhdHNfYWZfYnVmX3B0clsxXTsKLQkJc2ZjZmctPmFmX291dGJ1ZlsyXSA9ICh2b2lkICopdmZlMnhfY3RybC0+c3RhdHNfYWZfYnVmX3B0clsyXTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogY2Fubm90IGNvbmZpZyBwaW5nL3BvbmcgYWRkcmVzcyBvZiBBV0IiLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQkJY21kX2RhdGEgPSBzZmNmZzsKLQl9Ci0JCWJyZWFrOwotCWNhc2UgQ01EX1NOQVBfQlVGX1JFTEVBU0U6Ci0JCWJyZWFrOwotCWNhc2UgQ01EX1NUQVRTX0JVRl9SRUxFQVNFOiB7Ci0JCUNEQkcoInZmZV83eF9jb25maWc6IENNRF9TVEFUU19CVUZfUkVMRUFTRVxuIik7Ci0JCWlmICghZGF0YSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBjb25maWdfZmFpbHVyZTsKLQkJfQotCi0JCXNhY2suaGVhZGVyID0gVkZFX1NUQVRTX1dCX0VYUF9BQ0s7Ci0JCXNhY2suYnVmYWRkciA9ICh2b2lkICopKih1aW50MzJfdCAqKWRhdGE7Ci0KLQkJcXVldWUgID0gUURTUF9DTURRVUVVRTsKLQkJdmZlY21kLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgdmZlX3N0YXRzX2FjaykgLSA0OwotCQljbWRfZGF0YSA9ICZzYWNrOwotCX0KLQkJYnJlYWs7Ci0JY2FzZSBDTURfU1RBVFNfQUZfQlVGX1JFTEVBU0U6IHsKLQkJQ0RCRygidmZlXzd4X2NvbmZpZzogQ01EX1NUQVRTX0FGX0JVRl9SRUxFQVNFXG4iKTsKLQkJaWYgKCFkYXRhKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNvbmZpZ19mYWlsdXJlOwotCQl9Ci0KLQkJc2Fjay5oZWFkZXIgPSBWRkVfU1RBVFNfQVVUT0ZPQ1VTX0FDSzsKLQkJc2Fjay5idWZhZGRyID0gKHZvaWQgKikqKHVpbnQzMl90ICopZGF0YTsKLQotCQlxdWV1ZSAgPSBRRFNQX0NNRFFVRVVFOwotCQl2ZmVjbWQubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCB2ZmVfc3RhdHNfYWNrKSAtIDQ7Ci0JCWNtZF9kYXRhID0gJnNhY2s7Ci0JfQotCQlicmVhazsKLQljYXNlIENNRF9HRU5FUkFMOgotCWNhc2UgQ01EX1NUQVRTX0RJU0FCTEU6IHsKLQkJQ0RCRygiQ01EX0dFTkVSQUw6JWQgJWRcbiIsIHZmZWNtZC5pZCwgdmZlY21kLmxlbmd0aCk7Ci0JCWlmICh2ZmVjbWQuaWQgPT0gVkZFX0NNRF9PUEVSQVRJT05fQ0ZHKSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJnZmZTJ4X2N0cmwtPnN0YXJ0X2NtZCwKLQkJCQkJCSh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCQkJCXZmZWNtZC5sZW5ndGgpKQotCQkJCXJjID0gLUVGQVVMVDsKLQkJCW9wX21vZGUgPSB2ZmUyeF9jdHJsLT5zdGFydF9jbWQubW9kZV9vZl9vcGVyYXRpb247Ci0JCQl2ZmUyeF9jdHJsLT5zbmFwLmZyZWVfYnVmX2NudCA9IDA7Ci0JCQl2ZmUyeF9jdHJsLT50aHVtYi5mcmVlX2J1Zl9jbnQgPSAwOwotCQkJdmZlMnhfY3RybC0+c25hcC5mcmFtZV9jbnQgPSAwOwotCQkJdmZlMnhfY3RybC0+dGh1bWIuZnJhbWVfY250ID0gMDsKLQkJCXZmZTJ4X2N0cmwtPm51bV9zbmFwID0KLQkJCQl2ZmUyeF9jdHJsLT5zdGFydF9jbWQuc25hcF9udW1iZXI7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQkJaWYgKHZmZWNtZC5pZCA9PSBWRkVfQ01EX1JFQ09ORklHX1ZGRSkgewotCQkJQ0RCRygiVkZFIGlzIFJFQ09ORklHVVJFRFxuIik7Ci0JCQl2ZmUyeF9jdHJsLT5yZWNvbmZpZ192ZmUgPSAxOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKHZmZWNtZC5pZCA9PSBWRkVfQ01EX0xJVkVTSE9UKSB7Ci0JCQlDREJHKCJsaXZlIHNob3QgZW5hYmxlZFxuIik7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMnhfY3RybC0+bGl2ZXNob3RfZW5hYmxlZF9sb2NrLAotCQkJCQlmbGFncyk7Ci0JCQl2ZmUyeF9jdHJsLT5saXZlc2hvdF9lbmFibGVkID0gMTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTJ4X2N0cmwtPgotCQkJCQlsaXZlc2hvdF9lbmFibGVkX2xvY2ssCi0JCQkJCWZsYWdzKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmICh2ZmVjbWQuaWQgPT0gVkZFX0NNRF9TVE9QX0xJVkVTSE9UKSB7Ci0JCQlDREJHKCJsaXZlIHNob3QgZGlzYWJsZWRcbiIpOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTJ4X2N0cmwtPmxpdmVzaG90X2VuYWJsZWRfbG9jaywKLQkJCQkJZmxhZ3MpOwotCQkJdmZlMnhfY3RybC0+bGl2ZXNob3RfZW5hYmxlZCA9IDA7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAotCQkJCQkmdmZlMnhfY3RybC0+bGl2ZXNob3RfZW5hYmxlZF9sb2NrLAotCQkJCQlmbGFncyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAodmZlY21kLmxlbmd0aCA+IDI1NiAtIDQpIHsKLQkJCWNtZF9kYXRhX2FsbG9jID0KLQkJCWNtZF9kYXRhID0ga21hbGxvYyh2ZmVjbWQubGVuZ3RoICsgNCwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoIWNtZF9kYXRhKSB7Ci0JCQkJcmMgPSAtRU5PTUVNOwotCQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJY21kX2RhdGEgPSBidWY7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCgoY2hhciAqKWNtZF9kYXRhKSArIDQsCi0JCQkJCSh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCQl2ZmVjbWQubGVuZ3RoKSkgewotCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNvbmZpZ19kb25lOwotCQl9Ci0JCWhlYWRlciA9IGNtZHNfbWFwW3ZmZWNtZC5pZF0udmZlX2lkOwotCQlxdWV1ZSA9IGNtZHNfbWFwW3ZmZWNtZC5pZF0ucXVldWU7Ci0JCWlmIChoZWFkZXIgPT0gLTEgJiYgcXVldWUgPT0gLTEpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQkJQ0RCRygiJXMgJXNcbiIsIGNtZHNfbWFwW3ZmZWNtZC5pZF0uaXNwX2lkX25hbWUsCi0JCQljbWRzX21hcFt2ZmVjbWQuaWRdLnZmZV9pZF9uYW1lKTsKLQkJKih1aW50MzJfdCAqKWNtZF9kYXRhID0gaGVhZGVyOwotCQlpZiAocXVldWUgPT0gUURTUF9DTURRVUVVRSkgewotCQkJc3dpdGNoICh2ZmVjbWQuaWQpIHsKLQkJCWNhc2UgVkZFX0NNRF9SRVNFVDoKLQkJCQltc21fY2FtaW9fdmZlX2Jsa19yZXNldF8yKCk7Ci0JCQkJdmZlc3RvcHBlZCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZGRV9DTURfU1RBUlQ6Ci0JCQljYXNlIFZGRV9DTURfQ0FQVFVSRToKLQkJCWNhc2UgVkZFX0NNRF9DQVBUVVJFX1JBVzoKLQkJCWNhc2UgVkZFX0NNRF9aU0w6Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnZmZTJ4X2N0cmwtPnRhYmxlX2xvY2ssCi0JCQkJCQkJCQlmbGFncyk7Ci0JCQkJaWYgKCghbGlzdF9lbXB0eSgmdmZlMnhfY3RybC0+dGFibGVfcSkpIHx8Ci0JCQkJCQl2ZmUyeF9jdHJsLT50YWJsZWFja19wZW5kaW5nKSB7Ci0JCQkJCUNEQkcoInN0YXJ0IHBlbmRpbmdcbiIpOwotCQkJCQl2ZmUyeF9jdHJsLT5zdGFydF9wZW5kaW5nID0gMTsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKLQkJCQkJCSZ2ZmUyeF9jdHJsLT50YWJsZV9sb2NrLAotCQkJCQkJCQlmbGFncyk7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZmUyeF9jdHJsLT50YWJsZV9sb2NrLAotCQkJCQkJCQkJZmxhZ3MpOwotCQkJCXZmZWNtZC5sZW5ndGggPSBzaXplb2YodmZlMnhfY3RybC0+c3RhcnRfY21kKTsKLQkJCQltZW1jcHkoKChjaGFyICopY21kX2RhdGEpICsgNCwKLQkJCQkJJnZmZTJ4X2N0cmwtPnN0YXJ0X2NtZCwKLQkJCQkJc2l6ZW9mKHZmZTJ4X2N0cmwtPnN0YXJ0X2NtZCkpOwotCQkJCWlmIChvcF9tb2RlICYgU05BUFNIT1RfTUFTS19NT0RFKQotCQkJCQltc21fY2FtaW9fc2V0X3BlcmZfbHZsKFNfQ0FQVFVSRSk7Ci0JCQkJZWxzZQotCQkJCQltc21fY2FtaW9fc2V0X3BlcmZfbHZsKFNfUFJFVklFVyk7Ci0JCQkJdmZlc3RvcHBlZCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZGRV9DTURfU1RPUDoKLQkJCQl2ZmVzdG9wcGVkID0gMTsKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmZlMnhfY3RybC0+dGFibGVfbG9jaywKLQkJCQkJCWZsYWdzKTsKLQkJCQlpZiAob3BfbW9kZSAmIFNOQVBTSE9UX01BU0tfTU9ERSkgewotCQkJCQl2ZmUyeF9jdHJsLT5zdG9wX3BlbmRpbmcgPSAwOwotCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAotCQkJCQkJCSZ2ZmUyeF9jdHJsLT50YWJsZV9sb2NrLAotCQkJCQkJCWZsYWdzKTsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCWlmICgoIWxpc3RfZW1wdHkoJnZmZTJ4X2N0cmwtPnRhYmxlX3EpKSB8fAotCQkJCQkJdmZlMnhfY3RybC0+dGFibGVhY2tfcGVuZGluZykgewotCQkJCQlDREJHKCJzdG9wIHBlbmRpbmdcbiIpOwotCQkJCQl2ZmUyeF9jdHJsLT5zdG9wX3BlbmRpbmcgPSAxOwotCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAotCQkJCQkJCSZ2ZmUyeF9jdHJsLT50YWJsZV9sb2NrLAotCQkJCQkJCWZsYWdzKTsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTJ4X2N0cmwtPnRhYmxlX2xvY2ssCi0JCQkJCQlmbGFncyk7Ci0JCQkJdmZlMnhfY3RybC0+dmZlX3N0YXJ0ZWQgPSAwOwotCQkJCWdvdG8gY29uZmlnX3NlbmQ7Ci0JCQljYXNlIFZGRV9DTURfVVBEQVRFOgotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUyeF9jdHJsLT50YWJsZV9sb2NrLAotCQkJCQkJZmxhZ3MpOwotCQkJCWlmICgoIWxpc3RfZW1wdHkoJnZmZTJ4X2N0cmwtPnRhYmxlX3EpKSB8fAotCQkJCQkJdmZlMnhfY3RybC0+dGFibGVhY2tfcGVuZGluZykgewotCQkJCQlDREJHKCJ1cGRhdGUgcGVuZGluZ1xuIik7Ci0JCQkJCXZmZTJ4X2N0cmwtPnVwZGF0ZV9wZW5kaW5nID0gMDsKLQkJCQkJdmZlMnhfc2VuZF9pc3BfbXNnKHZmZTJ4X2N0cmwsCi0JCQkJCQltc2dzX21hcFtNU0dfVVBEQVRFX0FDS10uCi0JCQkJCQlpc3BfaWQpOwotCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAotCQkJCQkJCSZ2ZmUyeF9jdHJsLT50YWJsZV9sb2NrLAotCQkJCQkJCWZsYWdzKTsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTJ4X2N0cmwtPnRhYmxlX2xvY2ssCi0JCQkJCQlmbGFncyk7Ci0JCQkJZ290byBjb25maWdfc2VuZDsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gLyogUURTUF9DTURRVUVVRSAqLwotCX0KLQkJYnJlYWs7Ci0JY2FzZSBDTURfQVhJX0NGR19TRUM6IHsKLQkJQ0RCRygiQ01EX0FYSV9DRkdfU0VDXG4iKTsKLQkJcmF3X21vZGUgPSAwOwotCQl2ZmUyeF9jdHJsLT56c2xfbW9kZSA9IDA7Ci0JCWF4aW8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXhpb3V0KSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghYXhpbykgewotCQkJcHJfZXJyKCJOVUxMIGF4aW9cbiIpOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBjb25maWdfZmFpbHVyZTsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigoY2hhciAqKWF4aW8gKyA0LAotCQkJCQkodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBheGlvdXQpKSkgewotCQkJQ0RCRygiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQkJaWYgKG9wX21vZGUgJiBTTkFQU0hPVF9NQVNLX01PREUpCi0JCQlyYyA9IHZmZTJ4X2NvbmZpZ3VyZV9waW5ncG9uZ19idWZmZXJzKAotCQkJCQkJVkZFX01TR19DQVBUVVJFLAotCQkJCQkJVkZFX01TR19PVVRQVVRfU0VDT05EQVJZKTsKLQkJZWxzZQotCQkJcmMgPSB2ZmUyeF9jb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycygKLQkJCQkJCVZGRV9NU0dfUFJFVklFVywKLQkJCQkJCVZGRV9NU0dfT1VUUFVUX1NFQ09OREFSWSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgZXJyb3IgY29uZmlndXJpbmcgcGluZ3BvbmcgYnVmZmVycyIKLQkJCQkiIGZvciBwcmV2aWV3IiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCi0JCWlmICghKG9wX21vZGUgJiBTTkFQU0hPVF9NQVNLX01PREUpKQotCQkJZnJlZV9idWYgPSB2ZmUyeF9jaGVja19mcmVlX2J1ZmZlcigKLQkJCQkJVkZFX01TR19PVVRQVVRfSVJRLAotCQkJCQlWRkVfTVNHX09VVFBVVF9TRUNPTkRBUlkpOwotCQloZWFkZXIgPSBjbWRzX21hcFt2ZmVjbWQuaWRdLnZmZV9pZDsKLQkJcXVldWUgPSBjbWRzX21hcFt2ZmVjbWQuaWRdLnF1ZXVlOwotCQlpZiAoaGVhZGVyID09IC0xICYmIHF1ZXVlID09IC0xKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNvbmZpZ19kb25lOwotCQl9Ci0JCSoodWludDMyX3QgKilheGlvID0gaGVhZGVyOwotCQlpZiAob3BfbW9kZSAmIFNOQVBTSE9UX01BU0tfTU9ERSkKLQkJCXZmZV83eF9jb25maWdfYXhpKE9VVFBVVF9TRUMsCi0JCQkJCSZ2ZmUyeF9jdHJsLT50aHVtYiwgYXhpbyk7Ci0JCWVsc2UKLQkJCXZmZV83eF9jb25maWdfYXhpKE9VVFBVVF9TRUMsCi0JCQkJCSZ2ZmUyeF9jdHJsLT52aWRlbywgYXhpbyk7Ci0JCWNtZF9kYXRhID0gYXhpbzsKLQl9Ci0JCWJyZWFrOwotCWNhc2UgQ01EX0FYSV9DRkdfUFJJTTogewotCQlDREJHKCJDTURfQVhJX0NGR19QUklNIDogJWRcbiIsIG9wX21vZGUpOwotCQlyYXdfbW9kZSA9IDA7Ci0JCXZmZTJ4X2N0cmwtPnpzbF9tb2RlID0gMDsKLQkJYXhpbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBheGlvdXQpLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFheGlvKSB7Ci0JCQlwcl9lcnIoIk5VTEwgYXhpb1xuIik7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGNvbmZpZ19mYWlsdXJlOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKChjaGFyICopYXhpbyArIDQsCi0JCQkJCSh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCQlzaXplb2Yoc3RydWN0IGF4aW91dCkpKSB7Ci0JCQlwcl9lcnIoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNvbmZpZ19kb25lOwotCQl9Ci0JCWlmICghdmZlMnhfY3RybC0+cmVjb25maWdfdmZlKSB7Ci0JCQlpZiAob3BfbW9kZSAmIFNOQVBTSE9UX01BU0tfTU9ERSkKLQkJCQlyYyA9IHZmZTJ4X2NvbmZpZ3VyZV9waW5ncG9uZ19idWZmZXJzKAotCQkJCQkJVkZFX01TR19DQVBUVVJFLAotCQkJCQkJVkZFX01TR19PVVRQVVRfUFJJTUFSWSk7Ci0JCQllbHNlCi0JCQkJcmMgPSB2ZmUyeF9jb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycygKLQkJCQkJCVZGRV9NU0dfUFJFVklFVywKLQkJCQkJCVZGRV9NU0dfT1VUUFVUX1BSSU1BUlkpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXMgZXJyb3IgY29uZmlndXJpbmcgcGluZ3BvbmcgYnVmZmVycyIKLQkJCQkJIiBmb3IgcHJldmlldyIsIF9fZnVuY19fKTsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJZ290byBjb25maWdfZG9uZTsKLQkJCX0KLQkJCWlmICghKG9wX21vZGUgJiBTTkFQU0hPVF9NQVNLX01PREUpKQotCQkJCWZyZWVfYnVmID0gdmZlMnhfY2hlY2tfZnJlZV9idWZmZXIoCi0JCQkJCVZGRV9NU0dfT1VUUFVUX0lSUSwKLQkJCQkJVkZFX01TR19PVVRQVVRfUFJJTUFSWSk7Ci0JCX0gZWxzZSB7Ci0JCQl2ZmUyeF9jdHJsLT5wcmV2LnBpbmcuY2hfcGFkZHJbMF0gPQotCQkJCXZmZTJ4X2N0cmwtPmZyZWVfYnVmLmJ1ZlswXS5jaF9wYWRkclswXTsKLQkJCXZmZTJ4X2N0cmwtPnByZXYucGluZy5jaF9wYWRkclsxXSA9Ci0JCQkJdmZlMnhfY3RybC0+ZnJlZV9idWYuYnVmWzBdLmNoX3BhZGRyWzFdOwotCQkJdmZlMnhfY3RybC0+cHJldi5wb25nLmNoX3BhZGRyWzBdID0KLQkJCQl2ZmUyeF9jdHJsLT5mcmVlX2J1Zi5idWZbMV0uY2hfcGFkZHJbMF07Ci0JCQl2ZmUyeF9jdHJsLT5wcmV2LnBvbmcuY2hfcGFkZHJbMV0gPQotCQkJCXZmZTJ4X2N0cmwtPmZyZWVfYnVmLmJ1ZlsxXS5jaF9wYWRkclsxXTsKLQkJCXZmZTJ4X2N0cmwtPnByZXYuZnJlZV9idWYuY2hfcGFkZHJbMF0gPQotCQkJCXZmZTJ4X2N0cmwtPmZyZWVfYnVmLmJ1ZlsyXS5jaF9wYWRkclswXTsKLQkJCXZmZTJ4X2N0cmwtPnByZXYuZnJlZV9idWYuY2hfcGFkZHJbMV0gPQotCQkJCXZmZTJ4X2N0cmwtPmZyZWVfYnVmLmJ1ZlsyXS5jaF9wYWRkclsxXTsKLQkJCXZmZTJ4X2N0cmwtPnJlY29uZmlnX3ZmZSA9IDA7Ci0JCX0KLQkJaGVhZGVyID0gY21kc19tYXBbdmZlY21kLmlkXS52ZmVfaWQ7Ci0JCXF1ZXVlID0gY21kc19tYXBbdmZlY21kLmlkXS5xdWV1ZTsKLQkJaWYgKGhlYWRlciA9PSAtMSAmJiBxdWV1ZSA9PSAtMSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCQkqKHVpbnQzMl90ICopYXhpbyA9IGhlYWRlcjsKLQkJaWYgKG9wX21vZGUgJiBTTkFQU0hPVF9NQVNLX01PREUpCi0JCQl2ZmVfN3hfY29uZmlnX2F4aShPVVRQVVRfUFJJTSwgJnZmZTJ4X2N0cmwtPnNuYXAsIGF4aW8pOwotCQllbHNlCi0JCQl2ZmVfN3hfY29uZmlnX2F4aShPVVRQVVRfUFJJTSwgJnZmZTJ4X2N0cmwtPnByZXYsIGF4aW8pOwotCQljbWRfZGF0YSA9IGF4aW87Ci0JfQotCQlicmVhazsKLQljYXNlIENNRF9BWElfQ0ZHX1pTTDogewotCQlDREJHKCJDTURfQVhJX0NGR19aU0w6ICVkXG4iLCBvcF9tb2RlKTsKLQkJcmF3X21vZGUgPSAwOwotCQl2ZmUyeF9jdHJsLT56c2xfbW9kZSA9IDE7Ci0JCWF4aW8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXhpb3V0KSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghYXhpbykgewotCQkJcHJfZXJyKCJOVUxMIGF4aW9cbiIpOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBjb25maWdfZmFpbHVyZTsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigoY2hhciAqKWF4aW8gKyA0LAotCQkJCQkodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBheGlvdXQpKSkgewotCQkJcHJfZXJyKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCQlpZiAoIXZmZTJ4X2N0cmwtPnJlY29uZmlnX3ZmZSkgewotCQkJCXJjID0gdmZlMnhfY29uZmlndXJlX3Bpbmdwb25nX2J1ZmZlcnMoCi0JCQkJCQlWRkVfTVNHX1BSRVZJRVcsCi0JCQkJCQlWRkVfTVNHX09VVFBVVF9QUklNQVJZKTsKLQkJCQlyYyA9IHZmZTJ4X2NvbmZpZ3VyZV9waW5ncG9uZ19idWZmZXJzKAotCQkJCQkJVkZFX01TR19QUkVWSUVXLAotCQkJCQkJVkZFX01TR19PVVRQVVRfU0VDT05EQVJZKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzIGVycm9yIGNvbmZpZ3VyaW5nIHBpbmdwb25nIGJ1ZmZlcnMiCi0JCQkJCSIgZm9yIHByZXZpZXciLCBfX2Z1bmNfXyk7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCQl9Ci0JCQkJZnJlZV9idWYgPSB2ZmUyeF9jaGVja19mcmVlX2J1ZmZlcigKLQkJCQkJVkZFX01TR19PVVRQVVRfSVJRLAotCQkJCQlWRkVfTVNHX09VVFBVVF9QUklNQVJZKTsKLQkJCQlmcmVlX2J1ZiA9IHZmZTJ4X2NoZWNrX2ZyZWVfYnVmZmVyKAotCQkJCQlWRkVfTVNHX09VVFBVVF9JUlEsCi0JCQkJCVZGRV9NU0dfT1VUUFVUX1NFQ09OREFSWSk7Ci0JCX0gZWxzZSB7Ci0JCQl2ZmUyeF9jdHJsLT5wcmV2LnBpbmcuY2hfcGFkZHJbMF0gPQotCQkJCXZmZTJ4X2N0cmwtPmZyZWVfYnVmLmJ1ZlswXS5jaF9wYWRkclswXTsKLQkJCXZmZTJ4X2N0cmwtPnByZXYucGluZy5jaF9wYWRkclsxXSA9Ci0JCQkJdmZlMnhfY3RybC0+ZnJlZV9idWYuYnVmWzBdLmNoX3BhZGRyWzFdOwotCQkJdmZlMnhfY3RybC0+cHJldi5wb25nLmNoX3BhZGRyWzBdID0KLQkJCQl2ZmUyeF9jdHJsLT5mcmVlX2J1Zi5idWZbMV0uY2hfcGFkZHJbMF07Ci0JCQl2ZmUyeF9jdHJsLT5wcmV2LnBvbmcuY2hfcGFkZHJbMV0gPQotCQkJCXZmZTJ4X2N0cmwtPmZyZWVfYnVmLmJ1ZlsxXS5jaF9wYWRkclsxXTsKLQkJCXZmZTJ4X2N0cmwtPnByZXYuZnJlZV9idWYuY2hfcGFkZHJbMF0gPQotCQkJCXZmZTJ4X2N0cmwtPmZyZWVfYnVmLmJ1ZlsyXS5jaF9wYWRkclswXTsKLQkJCXZmZTJ4X2N0cmwtPnByZXYuZnJlZV9idWYuY2hfcGFkZHJbMV0gPQotCQkJCXZmZTJ4X2N0cmwtPmZyZWVfYnVmLmJ1ZlsyXS5jaF9wYWRkclsxXTsKLQkJCXZmZTJ4X2N0cmwtPnJlY29uZmlnX3ZmZSA9IDA7Ci0JCX0KLQkJaGVhZGVyID0gY21kc19tYXBbdmZlY21kLmlkXS52ZmVfaWQ7Ci0JCXF1ZXVlID0gY21kc19tYXBbdmZlY21kLmlkXS5xdWV1ZTsKLQkJaWYgKGhlYWRlciA9PSAtMSAmJiBxdWV1ZSA9PSAtMSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCQkqKHVpbnQzMl90ICopYXhpbyA9IGhlYWRlcjsKLQkJdmZlXzd4X2NvbmZpZ19heGkoT1VUUFVUX1BSSU0sICZ2ZmUyeF9jdHJsLT56c2xfcHJpbSwgYXhpbyk7Ci0JCXZmZV83eF9jb25maWdfYXhpKE9VVFBVVF9TRUMsICZ2ZmUyeF9jdHJsLT56c2xfc2VjLCBheGlvKTsKLQkJY21kX2RhdGEgPSBheGlvOwotCX0KLQkJYnJlYWs7Ci0JY2FzZSBDTURfQVhJX0NGR19TRUN8Q01EX0FYSV9DRkdfUFJJTTogewotCQlDREJHKCJDTURfQVhJX0NGR19TRUN8UFJJTVxuIik7Ci0JCXJhd19tb2RlID0gMDsKLQkJdmZlMnhfY3RybC0+enNsX21vZGUgPSAwOwotCQlheGlvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF4aW91dCksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWF4aW8pIHsKLQkJCXByX2VycigiTlVMTCBheGlvXG4iKTsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoKGNoYXIgKilheGlvICsgNCwKLQkJCQkJKHZvaWQgX191c2VyICopKHZmZWNtZC52YWx1ZSksCi0JCQkJCXNpemVvZihzdHJ1Y3QgYXhpb3V0KSkpIHsKLQkJCXByX2VycigiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQkJaWYgKG9wX21vZGUgJiBTTkFQU0hPVF9NQVNLX01PREUpCi0JCQlyYyA9IHZmZTJ4X2NvbmZpZ3VyZV9waW5ncG9uZ19idWZmZXJzKAotCQkJCQkJVkZFX01TR19DQVBUVVJFLAotCQkJCQkJVkZFX01TR19PVVRQVVRfU0VDT05EQVJZKTsKLQkJZWxzZQotCQkJcmMgPSB2ZmUyeF9jb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycygKLQkJCQkJCVZGRV9NU0dfUFJFVklFVywKLQkJCQkJCVZGRV9NU0dfT1VUUFVUX1NFQ09OREFSWSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgZXJyb3IgY29uZmlndXJpbmcgcGluZ3BvbmcgYnVmZmVycyIKLQkJCQkiIGZvciBwcmV2aWV3IiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCi0JCWlmICghKG9wX21vZGUgJiBTTkFQU0hPVF9NQVNLX01PREUpKSB7Ci0JCQlmcmVlX2J1ZiA9IHZmZTJ4X2NoZWNrX2ZyZWVfYnVmZmVyKAotCQkJCQlWRkVfTVNHX09VVFBVVF9JUlEsCi0JCQkJCVZGRV9NU0dfT1VUUFVUX1NFQ09OREFSWSk7Ci0JCX0gZWxzZSBpZiAoKG9wX21vZGUgJiBTTkFQU0hPVF9NQVNLX01PREUpICYmCi0JCQkJKHZmZTJ4X2N0cmwtPm51bV9zbmFwID4gMSkpIHsKLQkJCWludCBpID0gMDsKLQkJCUNEQkcoIkJ1cnN0IG1vZGUgQVhJIGNvbmZpZyBTRUMgc25hcCBjbnQgJWRcbiIsCi0JCQkJdmZlMnhfY3RybC0+bnVtX3NuYXApOwotCQkJZm9yIChpID0gMDsgaSA8IHZmZTJ4X2N0cmwtPm51bV9zbmFwIC0gMjsgaSsrKSB7Ci0JCQkJZnJlZV9idWYgPSB2ZmUyeF9jaGVja19mcmVlX2J1ZmZlcigKLQkJCQkJVkZFX01TR19PVVRQVVRfSVJRLAotCQkJCQlWRkVfTVNHX09VVFBVVF9TRUNPTkRBUlkpOwotCQkJfQotCQl9Ci0JCWhlYWRlciA9IGNtZHNfbWFwW3ZmZWNtZC5pZF0udmZlX2lkOwotCQlxdWV1ZSA9IGNtZHNfbWFwW3ZmZWNtZC5pZF0ucXVldWU7Ci0JCWlmIChoZWFkZXIgPT0gLTEgJiYgcXVldWUgPT0gLTEpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQkJKih1aW50MzJfdCAqKWF4aW8gPSBoZWFkZXI7Ci0JCWlmIChvcF9tb2RlICYgU05BUFNIT1RfTUFTS19NT0RFKQotCQkJdmZlXzd4X2NvbmZpZ19heGkoT1VUUFVUX1NFQywgJnZmZTJ4X2N0cmwtPnRodW1iLCBheGlvKTsKLQkJZWxzZQotCQkJdmZlXzd4X2NvbmZpZ19heGkoT1VUUFVUX1NFQywgJnZmZTJ4X2N0cmwtPnByZXYsIGF4aW8pOwotCi0JCWlmIChvcF9tb2RlICYgU05BUFNIT1RfTUFTS19NT0RFKQotCQkJcmMgPSB2ZmUyeF9jb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycygKLQkJCQkJCVZGRV9NU0dfQ0FQVFVSRSwKLQkJCQkJCVZGRV9NU0dfT1VUUFVUX1BSSU1BUlkpOwotCQllbHNlCi0JCQlyYyA9IHZmZTJ4X2NvbmZpZ3VyZV9waW5ncG9uZ19idWZmZXJzKAotCQkJCQkJVkZFX01TR19QUkVWSUVXLAotCQkJCQkJVkZFX01TR19PVVRQVVRfUFJJTUFSWSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXMgZXJyb3IgY29uZmlndXJpbmcgcGluZ3BvbmcgYnVmZmVycyIKLQkJCQkiIGZvciBwcmV2aWV3IiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBjb25maWdfZG9uZTsKLQkJfQotCi0JCWlmICghKG9wX21vZGUgJiBTTkFQU0hPVF9NQVNLX01PREUpKSB7Ci0JCQlmcmVlX2J1ZiA9IHZmZTJ4X2NoZWNrX2ZyZWVfYnVmZmVyKAotCQkJCQlWRkVfTVNHX09VVFBVVF9JUlEsCi0JCQkJCVZGRV9NU0dfT1VUUFVUX1BSSU1BUlkpOwotCQl9IGVsc2UgaWYgKChvcF9tb2RlICYgU05BUFNIT1RfTUFTS19NT0RFKSAmJgotCQkJCSh2ZmUyeF9jdHJsLT5udW1fc25hcCA+IDEpKSB7Ci0JCQlpbnQgaSA9IDA7Ci0JCQlDREJHKCJCdXJzdCBtb2RlIEFYSSBjb25maWcgUFJJTSBzbmFwIGNudCAlZFxuIiwKLQkJCQl2ZmUyeF9jdHJsLT5udW1fc25hcCk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgdmZlMnhfY3RybC0+bnVtX3NuYXAgLSAyOyBpKyspIHsKLQkJCQlmcmVlX2J1ZiA9IHZmZTJ4X2NoZWNrX2ZyZWVfYnVmZmVyKAotCQkJCQlWRkVfTVNHX09VVFBVVF9JUlEsCi0JCQkJCVZGRV9NU0dfT1VUUFVUX1BSSU1BUlkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG9wX21vZGUgJiBTTkFQU0hPVF9NQVNLX01PREUpCi0JCQl2ZmVfN3hfY29uZmlnX2F4aShPVVRQVVRfUFJJTSwKLQkJCQkJJnZmZTJ4X2N0cmwtPnNuYXAsIGF4aW8pOwotCQllbHNlCi0JCQl2ZmVfN3hfY29uZmlnX2F4aShPVVRQVVRfUFJJTSwKLQkJCQkJJnZmZTJ4X2N0cmwtPnByZXYsIGF4aW8pOwotCQljbWRfZGF0YSA9IGF4aW87Ci0JfQotCQlicmVhazsKLQljYXNlIENNRF9SQVdfUElDVF9BWElfQ0ZHOiB7Ci0JCUNEQkcoIkNNRF9SQVdfUElDVF9BWElfQ0ZHOiVkXG4iLCBvcF9tb2RlKTsKLQkJcmF3X21vZGUgPSAxOwotCQlheGlvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF4aW91dCksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWF4aW8pIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gY29uZmlnX2ZhaWx1cmU7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoKGNoYXIgKilheGlvICsgNCwKLQkJCQkJKHZvaWQgX191c2VyICopKHZmZWNtZC52YWx1ZSksCi0JCQkJCXNpemVvZihzdHJ1Y3QgYXhpb3V0KSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQkJaGVhZGVyID0gY21kc19tYXBbdmZlY21kLmlkXS52ZmVfaWQ7Ci0JCXF1ZXVlID0gY21kc19tYXBbdmZlY21kLmlkXS5xdWV1ZTsKLQkJcmMgPSB2ZmUyeF9jb25maWd1cmVfcGluZ3BvbmdfYnVmZmVycyhWRkVfTVNHX0NBUFRVUkUsCi0JCQkJCQlWRkVfTVNHX09VVFBVVF9QUklNQVJZKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlcyBlcnJvciBjb25maWd1cmluZyBwaW5ncG9uZyBidWZmZXJzIgotCQkJCSIgZm9yIHByZXZpZXciLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGNvbmZpZ19kb25lOwotCQl9Ci0JCWlmIChoZWFkZXIgPT0gLTEgJiYgcXVldWUgPT0gLTEpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQkJKih1aW50MzJfdCAqKWF4aW8gPSBoZWFkZXI7Ci0JCXZmZV83eF9jb25maWdfYXhpKE9VVFBVVF9QUklNLCAmdmZlMnhfY3RybC0+c25hcCwgYXhpbyk7Ci0JCWNtZF9kYXRhID0gYXhpbzsKLQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmICh2ZmVzdG9wcGVkKQotCQlnb3RvIGNvbmZpZ19kb25lOwotCi1jb25maWdfc2VuZDoKLQlDREJHKCJzZW5kIGFkc3AgY29tbWFuZCA9ICVkXG4iLCAqKHVpbnQzMl90ICopY21kX2RhdGEpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZmUyeF9jdHJsLT50YWJsZV9sb2NrLCBmbGFncyk7Ci0JaWYgKHF1ZXVlID09IFFEU1BfVEFCTEVRVUVVRSAmJgotCQkJdmZlMnhfY3RybC0+dGFibGVhY2tfcGVuZGluZykgewotCQlDREJHKCJzdG9yZSB0YWJsZSBjbWRcbiIpOwotCQl0YWJsZV9wZW5kaW5nID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRhYmxlX2NtZCksIEdGUF9BVE9NSUMpOwotCQlpZiAoIXRhYmxlX3BlbmRpbmcpIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTJ4X2N0cmwtPnRhYmxlX2xvY2ssIGZsYWdzKTsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQkJdGFibGVfcGVuZGluZy0+Y21kID0ga3phbGxvYyh2ZmVjbWQubGVuZ3RoICsgNCwgR0ZQX0FUT01JQyk7Ci0JCWlmICghdGFibGVfcGVuZGluZy0+Y21kKSB7Ci0JCQlrZnJlZSh0YWJsZV9wZW5kaW5nKTsKLQkJCXJjID0gLUVOT01FTTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTJ4X2N0cmwtPnRhYmxlX2xvY2ssIGZsYWdzKTsKLQkJCWdvdG8gY29uZmlnX2RvbmU7Ci0JCX0KLQkJbWVtY3B5KHRhYmxlX3BlbmRpbmctPmNtZCwgY21kX2RhdGEsIHZmZWNtZC5sZW5ndGggKyA0KTsKLQkJdGFibGVfcGVuZGluZy0+cXVldWUgPSBxdWV1ZTsKLQkJdGFibGVfcGVuZGluZy0+c2l6ZSA9IHZmZWNtZC5sZW5ndGggKyA0OwotCQlsaXN0X2FkZF90YWlsKCZ0YWJsZV9wZW5kaW5nLT5saXN0LCAmdmZlMnhfY3RybC0+dGFibGVfcSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTJ4X2N0cmwtPnRhYmxlX2xvY2ssIGZsYWdzKTsKLQl9IGVsc2UgewotCQlpZiAocXVldWUgPT0gUURTUF9UQUJMRVFVRVVFKSB7Ci0JCQlDREJHKCJzZW5kaW5nIHRhYmxlIGNtZFxuIik7Ci0JCQl2ZmUyeF9jdHJsLT50YWJsZWFja19wZW5kaW5nID0gMTsKLQkJCXJjID0gbXNtX2Fkc3Bfd3JpdGUodmZlX21vZCwgcXVldWUsCi0JCQkJY21kX2RhdGEsIHZmZWNtZC5sZW5ndGggKyA0KTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZmZTJ4X2N0cmwtPnRhYmxlX2xvY2ssIGZsYWdzKTsKLQkJfSBlbHNlIHsKLQkJCWlmICgqKHVpbnQzMl90ICopY21kX2RhdGEgPT0gVkZFX09VVFBVVDJfQUNLKSB7Ci0JCQkJdWludDMyX3QgKnB0ciA9IGNtZF9kYXRhOwotCQkJCUNEQkcoIiV4ICV4ICV4XG4iLCBwdHJbMF0sIHB0clsxXSwgcHRyWzJdKTsKLQkJCX0KLQkJCUNEQkcoInNlbmQgbi10YWJsZSBjbWRcbiIpOwotCQkJcmMgPSBtc21fYWRzcF93cml0ZSh2ZmVfbW9kLCBxdWV1ZSwKLQkJCQljbWRfZGF0YSwgdmZlY21kLmxlbmd0aCArIDQpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmZlMnhfY3RybC0+dGFibGVfbG9jaywgZmxhZ3MpOwotCQkJQ0RCRygiJXhcbiIsIHZmZWNtZC5sZW5ndGggKyA0KTsKLQkJfQotCX0KLQotY29uZmlnX2RvbmU6Ci0Ja2ZyZWUoY21kX2RhdGFfYWxsb2MpOwotCi1jb25maWdfZmFpbHVyZToKLQlrZnJlZShzY2ZnKTsKLQlrZnJlZShheGlvKTsKLQlrZnJlZShzZmNmZyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3RydWN0IG1zbV9jYW1fY2xrX2luZm8gdmZlMnhfY2xrX2luZm9bXSA9IHsKLQl7InZmZV9jbGsiLCAxOTIwMDAwMDB9LAotfTsKLQotaW50IG1zbV92ZmVfc3ViZGV2X2luaXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY2FtX21lZGlhX2NvbnRyb2xsZXIgKm1jdGw7Ci0JbWN0bCA9IHY0bDJfZ2V0X3N1YmRldl9ob3N0ZGF0YShzZCk7Ci0JaWYgKG1jdGwgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBtY3RsIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG1jdGxfZmFpbGVkOwotCX0KLQotCXNwaW5fbG9ja19pbml0KCZ2ZmUyeF9jdHJsLT5zZF9ub3RpZnlfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnZmZTJ4X2N0cmwtPnRhYmxlX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZ2ZmUyeF9jdHJsLT52ZmVfbXNnX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZ2ZmUyeF9jdHJsLT5saXZlc2hvdF9lbmFibGVkX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN0b3BldmVudC53YWl0KTsKLQlJTklUX0xJU1RfSEVBRCgmdmZlMnhfY3RybC0+dGFibGVfcSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnZmZTJ4X2N0cmwtPnZmZV9tc2dfcSk7Ci0Jc3RvcGV2ZW50LnRpbWVvdXQgPSAyMDA7Ci0Jc3RvcGV2ZW50LnN0YXRlID0gMDsKLQl2ZmUyeF9jdHJsLT52ZmVfc3RhcnRlZCA9IDA7Ci0KLQltZW1zZXQoJnZmZTJ4X2N0cmwtPnN0YXRzX2N0cmwsIDAsIHNpemVvZihzdHJ1Y3QgbXNtX3N0YXRzX2J1ZnFfY3RybCkpOwotCW1lbXNldCgmdmZlMnhfY3RybC0+c3RhdHNfb3BzLCAwLCBzaXplb2Yoc3RydWN0IG1zbV9zdGF0c19vcHMpKTsKLQotCUNEQkcoIm1zbV9jYW1fY2xrX2VuYWJsZTogZW5hYmxlIHZmZV9jbGtcbiIpOwotCXJjID0gbXNtX2NhbV9jbGtfZW5hYmxlKCZ2ZmUyeF9jdHJsLT5wZGV2LT5kZXYsIHZmZTJ4X2Nsa19pbmZvLAotCQkJdmZlMnhfY3RybC0+dmZlX2NsaywgQVJSQVlfU0laRSh2ZmUyeF9jbGtfaW5mbyksIDEpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCW1zbV9jYW1pb19zZXRfcGVyZl9sdmwoU19JTklUKTsKLQotCS8qIFRPRE8gOiBjaGVjayBpcyBpdCByZXF1aXJlZCAqLwotCWV4dGxlbiA9IHNpemVvZihzdHJ1Y3QgdmZlX2ZyYW1lX2V4dHJhKTsKLQotCWV4dGRhdGEgPSBrbWFsbG9jKGV4dGxlbiwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFleHRkYXRhKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBpbml0X2ZhaWw7Ci0JfQotCi0JcmMgPSBtc21fYWRzcF9nZXQoIlFDQU1UQVNLIiwgJnFjYW1fbW9kLCAmdmZlXzd4X3N5bmMsIE5VTEwpOwotCWlmIChyYykgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBnZXRfcWNhbV9mYWlsOwotCX0KLQotCXJjID0gbXNtX2Fkc3BfZ2V0KCJWRkVUQVNLIiwgJnZmZV9tb2QsICZ2ZmVfN3hfc3luYywgTlVMTCk7Ci0JaWYgKHJjKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGdldF92ZmVfZmFpbDsKLQl9Ci0JbXNtX2Fkc3BfZW5hYmxlKHFjYW1fbW9kKTsKLQltc21fYWRzcF9lbmFibGUodmZlX21vZCk7Ci0JcmV0dXJuIDA7Ci0KLWdldF92ZmVfZmFpbDoKLQltc21fYWRzcF9wdXQocWNhbV9tb2QpOwotZ2V0X3FjYW1fZmFpbDoKLQlrZnJlZShleHRkYXRhKTsKLWluaXRfZmFpbDoKLQlleHRsZW4gPSAwOwotbWN0bF9mYWlsZWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX3ZwZV9zdWJkZXZfaW5pdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQotewotCXJldHVybiAwOwotfQotCi12b2lkIG1zbV92cGVfc3ViZGV2X3JlbGVhc2Uoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKLXsKLQlyZXR1cm47Ci19Ci0KLXZvaWQgbXNtX3ZmZV9zdWJkZXZfcmVsZWFzZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQotewotCUNEQkcoIm1zbV9jYW1fY2xrX2VuYWJsZTogZGlzYWJsZSB2ZmVfY2xrXG4iKTsKLQltc21fY2FtX2Nsa19lbmFibGUoJnZmZTJ4X2N0cmwtPnBkZXYtPmRldiwgdmZlMnhfY2xrX2luZm8sCi0JCQl2ZmUyeF9jdHJsLT52ZmVfY2xrLCBBUlJBWV9TSVpFKHZmZTJ4X2Nsa19pbmZvKSwgMCk7Ci0JbXNtX2Fkc3BfZGlzYWJsZShxY2FtX21vZCk7Ci0JbXNtX2Fkc3BfZGlzYWJsZSh2ZmVfbW9kKTsKLQotCW1zbV9hZHNwX3B1dChxY2FtX21vZCk7Ci0JbXNtX2Fkc3BfcHV0KHZmZV9tb2QpOwotCi0Ja2ZyZWUoZXh0ZGF0YSk7Ci0JbXNtX2NhbWlvX3NldF9wZXJmX2x2bChTX0VYSVQpOwotCXJldHVybjsKLX0KLQotc3RhdGljIGludCBtc21fdmZlX3N1YmRldl9zX2NyeXN0YWxfZnJlcShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCXUzMiBmcmVxLCB1MzIgZmxhZ3MpCi17Ci0JaW50IHJjID0gMDsKLQlpbnQgcm91bmRfcmF0ZTsKLQotCXJvdW5kX3JhdGUgPSBjbGtfcm91bmRfcmF0ZSh2ZmUyeF9jdHJsLT52ZmVfY2xrWzBdLCBmcmVxKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNsa19yb3VuZF9yYXRlIGZhaWxlZCAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IGNsa19zZXRfcmF0ZSh2ZmUyeF9jdHJsLT52ZmVfY2xrWzBdLCByb3VuZF9yYXRlKTsKLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoIiVzOiBjbGtfc2V0X3JhdGUgZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgbXNtX3ZmZV9zdWJkZXZfdmlkZW9fb3BzID0gewotCS5zX2NyeXN0YWxfZnJlcSA9IG1zbV92ZmVfc3ViZGV2X3NfY3J5c3RhbF9mcmVxLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBtc21fdmZlX3N1YmRldl9jb3JlX29wcyA9IHsKLQkuaW9jdGwgPSBtc21fdmZlX3N1YmRldl9pb2N0bCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG1zbV92ZmVfc3ViZGV2X29wcyA9IHsKLQkuY29yZSA9ICZtc21fdmZlX3N1YmRldl9jb3JlX29wcywKLQkudmlkZW8gPSAmbXNtX3ZmZV9zdWJkZXZfdmlkZW9fb3BzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgbXNtX3ZmZV9pbnRlcm5hbF9vcHM7Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHZmZTJ4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG1zbV9jYW1fc3ViZGV2X2luZm8gc2RfaW5mbzsKLQotCUNEQkcoIiVzOiBkZXZpY2UgaWQgPSAlZFxuIiwgX19mdW5jX18sIHBkZXYtPmlkKTsKLQl2ZmUyeF9jdHJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZmZTJ4X2N0cmxfdHlwZSksIEdGUF9LRVJORUwpOwotCWlmICghdmZlMnhfY3RybCkgewotCQlwcl9lcnIoIiVzOiBubyBlbm91Z2ggbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXY0bDJfc3ViZGV2X2luaXQoJnZmZTJ4X2N0cmwtPnN1YmRldiwgJm1zbV92ZmVfc3ViZGV2X29wcyk7Ci0JdmZlMnhfY3RybC0+c3ViZGV2LmludGVybmFsX29wcyA9ICZtc21fdmZlX2ludGVybmFsX29wczsKLQl2ZmUyeF9jdHJsLT5zdWJkZXYuZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7Ci0Jc25wcmludGYodmZlMnhfY3RybC0+c3ViZGV2Lm5hbWUsCi0JCQkgc2l6ZW9mKHZmZTJ4X2N0cmwtPnN1YmRldi5uYW1lKSwgInZmZTIueCIpOwotCXY0bDJfc2V0X3N1YmRldmRhdGEoJnZmZTJ4X2N0cmwtPnN1YmRldiwgdmZlMnhfY3RybCk7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJnZmZTJ4X2N0cmwtPnN1YmRldik7Ci0KLQl2ZmUyeF9jdHJsLT5wZGV2ID0gcGRldjsKLQlzZF9pbmZvLnNkZXZfdHlwZSA9IFZGRV9ERVY7Ci0Jc2RfaW5mby5zZF9pbmRleCA9IDA7Ci0Jc2RfaW5mby5pcnFfbnVtID0gMDsKLQltc21fY2FtX3JlZ2lzdGVyX3N1YmRldl9ub2RlKCZ2ZmUyeF9jdHJsLT5zdWJkZXYsICZzZF9pbmZvKTsKLQotCW1lZGlhX2VudGl0eV9pbml0KCZ2ZmUyeF9jdHJsLT5zdWJkZXYuZW50aXR5LCAwLCBOVUxMLCAwKTsKLQl2ZmUyeF9jdHJsLT5zdWJkZXYuZW50aXR5LnR5cGUgPSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFVjsKLQl2ZmUyeF9jdHJsLT5zdWJkZXYuZW50aXR5Lmdyb3VwX2lkID0gVkZFX0RFVjsKLQl2ZmUyeF9jdHJsLT5zdWJkZXYuZW50aXR5Lm5hbWUgPSBwZGV2LT5uYW1lOwotCXZmZTJ4X2N0cmwtPnN1YmRldi5lbnRpdHkucmV2aXNpb24gPSB2ZmUyeF9jdHJsLT5zdWJkZXYuZGV2bm9kZS0+bnVtOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB2ZmUyeF9kcml2ZXIgPSB7Ci0JLnByb2JlID0gdmZlMnhfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBNU01fVkZFX0RSVl9OQU1FLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX3ZmZTJ4X2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdmZlMnhfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG1zbV92ZmUyeF9leGl0X21vZHVsZSh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2ZmUyeF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChtc21fdmZlMnhfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQobXNtX3ZmZTJ4X2V4aXRfbW9kdWxlKTsKLU1PRFVMRV9ERVNDUklQVElPTigiVkZFIDIueCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTd4MjdhX3Y0bDIuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTd4MjdhX3Y0bDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiMTkyOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmU3eDI3YV92NGwyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19NU01fVkZFN1hfSF9fCi0jZGVmaW5lIF9fTVNNX1ZGRTdYX0hfXwotI2luY2x1ZGUgPG1lZGlhL21zbV9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlICJtc20uaCIKLSNpbmNsdWRlICJtc21fdmZlX3N0YXRzX2J1Zi5oIgotCi0vKjggRFNQIGJ1ZmZlcnMsIDMgLSBwaW5nLCBwb25nLCBmcmVlKi8KLSNkZWZpbmUgRlJFRV9CVUZfQVJSX1NJWkUgNQotCi1zdHJ1Y3QgY21kX2lkX21hcCB7Ci0JdWludDMyX3QgaXNwX2lkOwotCXVpbnQzMl90IHZmZV9pZDsKLQl1aW50MzJfdCBxdWV1ZTsKLQljaGFyIGlzcF9pZF9uYW1lWzY0XTsKLQljaGFyIHZmZV9pZF9uYW1lWzY0XTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBtc2dfaWRfbWFwIHsKLQl1aW50MzJfdCB2ZmVfaWQ7Ci0JdWludDMyX3QgaXNwX2lkOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHRhYmxlX2NtZCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXZvaWQgKmNtZDsKLQlpbnQgc2l6ZTsKLQlpbnQgcXVldWU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgdmZlX21zZyB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXZvaWQgKmNtZDsKLQlpbnQgbGVuOwotCWludCBpZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBidWZfaW5mbyB7Ci0JLyogQnVmZmVyICovCi0Jc3RydWN0IG1zbV9mcmVlX2J1ZiBwaW5nOwotCXN0cnVjdCBtc21fZnJlZV9idWYgcG9uZzsKLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmIGZyZWVfYnVmOwotCS8qQXJyYXkgZm9yIGhvbGRpbmcgdGhlIGZyZWUgYnVmZmVyIGlmIG1vcmUgdGhhbiBvbmUqLwotCXN0cnVjdCBtc21fZnJlZV9idWYgZnJlZV9idWZfYXJyW0ZSRUVfQlVGX0FSUl9TSVpFXTsKLQlpbnQgZnJlZV9idWZfY250OwotCWludCBmcmFtZV9jbnQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcHJldl9mcmVlX2J1Zl9pbmZvIHsKLQlzdHJ1Y3QgbXNtX2ZyZWVfYnVmIGJ1ZlszXTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX3N0YXJ0IHsKLQl1aW50MzJfdCBpbnB1dF9zb3VyY2U6MTsKLQl1aW50MzJfdCBtb2RlX29mX29wZXJhdGlvbjoxOwotCXVpbnQzMl90IHNuYXBfbnVtYmVyOjQ7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAyNjsKLQotCS8qIEltYWdlIFBpcGVsaW5lIE1vZHVsZXMgKi8KLQl1aW50MzJfdCBibGFja2xldmVsX2NvcnJlY3Rpb25fZW5hYmxlOjE7Ci0JdWludDMyX3QgbGVuc19yb2xsb2ZmX2NvcnJlY3Rpb25fZW5hYmxlOjE7Ci0JdWludDMyX3Qgd2hpdGVfYmFsYW5jZV9lbmFibGU6MTsKLQl1aW50MzJfdCByZ2JfZ2FtbWFfZW5hYmxlOjE7Ci0JdWludDMyX3QgbHVtYV9ub2lzZV9yZWR1Y3Rpb25wYXRoX2VuYWJsZToxOwotCXVpbnQzMl90IGFkYXB0aXZlX3NwYXRpYWxmaWx0ZXJfZW5hYmxlOjE7Ci0JdWludDMyX3QgY2hyb21hX3N1YnNhbXBsZV9lbmFibGU6MTsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDI1OwotCi0JLyogVGhlIGRpbWVuc2lvbiBmZWQgdG8gdGhlIHN0YXRpc3RpY3MgbW9kdWxlICovCi0JdWludDMyX3QgbGFzdF9waXhlbDoxMjsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3QgbGFzdF9saW5lOjEyOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogNDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2ZmUyeF9jdHJsX3R5cGUgewotCXN0cnVjdCBidWZfaW5mbyBwcmV2OwotCXN0cnVjdCBidWZfaW5mbyB2aWRlbzsKLQlzdHJ1Y3QgYnVmX2luZm8gc25hcDsKLQlzdHJ1Y3QgYnVmX2luZm8gcmF3OwotCXN0cnVjdCBidWZfaW5mbyB0aHVtYjsKLQlzdHJ1Y3QgcHJldl9mcmVlX2J1Zl9pbmZvIGZyZWVfYnVmOwotCXN0cnVjdCBidWZfaW5mbyB6c2xfcHJpbTsKLQlzdHJ1Y3QgYnVmX2luZm8genNsX3NlYzsKLQlzdHJ1Y3QgcHJldl9mcmVlX2J1Zl9pbmZvIHpzbF9mcmVlX2J1ZlsyXTsKLQotCi0Jc3BpbmxvY2tfdCAgdGFibGVfbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHRhYmxlX3E7Ci0JdWludDMyX3QgdGFibGVhY2tfcGVuZGluZzsKLQl1aW50MzJfdCB2ZmVGcmFtZUlkOwotCi0Jc3BpbmxvY2tfdCB2ZmVfbXNnX2xvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCB2ZmVfbXNnX3E7Ci0KLQlzdHJ1Y3QgdmZlX2NtZF9zdGFydCBzdGFydF9jbWQ7Ci0JdWludDMyX3Qgc3RhcnRfcGVuZGluZzsKLQl1aW50MzJfdCB2ZmVfc3RhcnRlZDsKLQl1aW50MzJfdCBzdG9wX3BlbmRpbmc7Ci0JdWludDMyX3QgdXBkYXRlX3BlbmRpbmc7Ci0KLQlzcGlubG9ja190IGxpdmVzaG90X2VuYWJsZWRfbG9jazsKLQl1aW50MzJfdCBsaXZlc2hvdF9lbmFibGVkOwotCi0JLyogdjRsMiBzdWJkZXYgKi8KLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgc3ViZGV2OwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0Jc3RydWN0IGNsayAqdmZlX2Nsa1szXTsKLQlzcGlubG9ja190ICBzZF9ub3RpZnlfbG9jazsKLQl1aW50MzJfdCAgICByZWNvbmZpZ192ZmU7Ci0JdWludDMyX3QgICAgenNsX21vZGU7Ci0Jc3BpbmxvY2tfdCAgc3RhdHNfYnVmcV9sb2NrOwotCXN0cnVjdCBtc21fc3RhdHNfYnVmcV9jdHJsIHN0YXRzX2N0cmw7Ci0Jc3RydWN0IG1zbV9zdGF0c19vcHMgc3RhdHNfb3BzOwotCXVuc2lnbmVkIGxvbmcgc3RhdHNfd2VfYnVmX3B0clszXTsKLQl1bnNpZ25lZCBsb25nIHN0YXRzX2FmX2J1Zl9wdHJbM107Ci0JaW50IG51bV9zbmFwOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZmZV9mcmFtZV9leHRyYSB7Ci0JdWludDMyX3QJYmxfZXZlbmNvbDoyMzsKLQl1aW50MzJfdAlydmQxOjk7Ci0JdWludDMyX3QJYmxfb2RkY29sOjIzOwotCXVpbnQzMl90CXJ2ZDI6OTsKLQotCXVpbnQzMl90CWRfZGJwY19zdGF0c19ob3Q6MTY7Ci0JdWludDMyX3QJZF9kYnBjX3N0YXRzX2NvbGQ6MTY7Ci0KLQl1aW50MzJfdAlkX2RicGNfc3RhdHNfMF9ob3Q6MTA7Ci0JdWludDMyX3QJcnZkMzo2OwotCXVpbnQzMl90CWRfZGJwY19zdGF0c18wX2NvbGQ6MTA7Ci0JdWludDMyX3QJcnZkNDo2OwotCXVpbnQzMl90CWRfZGJwY19zdGF0c18xX2hvdDoxMDsKLQl1aW50MzJfdAlydmQ1OjY7Ci0JdWludDMyX3QJZF9kYnBjX3N0YXRzXzFfY29sZDoxMDsKLQl1aW50MzJfdAlydmQ2OjY7Ci0KLQl1aW50MzJfdAlhc2ZfbWF4X2VkZ2U7Ci0KLQl1aW50MzJfdAllX3lfd21fcG1fc3RhdHNfMDoyMTsKLQl1aW50MzJfdAlydmQ3OjExOwotCXVpbnQzMl90CWVfeV93bV9wbV9zdGF0c18xX2JsOjg7Ci0JdWludDMyX3QJcnZkODo4OwotCXVpbnQzMl90CWVfeV93bV9wbV9zdGF0c18xX25sOjEyOwotCXVpbnQzMl90CXJ2ZDk6NDsKLQotCXVpbnQzMl90CWVfY2Jjcl93bV9wbV9zdGF0c18wOjIxOwotCXVpbnQzMl90CXJ2ZDEwOjExOwotCXVpbnQzMl90CWVfY2Jjcl93bV9wbV9zdGF0c18xX2JsOjg7Ci0JdWludDMyX3QJcnZkMTE6ODsKLQl1aW50MzJfdAllX2NiY3Jfd21fcG1fc3RhdHNfMV9ubDoxMjsKLQl1aW50MzJfdAlydmQxMjo0OwotCi0JdWludDMyX3QJdl95X3dtX3BtX3N0YXRzXzA6MjE7Ci0JdWludDMyX3QJcnZkMTM6MTE7Ci0JdWludDMyX3QJdl95X3dtX3BtX3N0YXRzXzFfYmw6ODsKLQl1aW50MzJfdAlydmQxNDo4OwotCXVpbnQzMl90CXZfeV93bV9wbV9zdGF0c18xX25sOjEyOwotCXVpbnQzMl90CXJ2ZDE1OjQ7Ci0KLQl1aW50MzJfdAl2X2NiY3Jfd21fcG1fc3RhdHNfMDoyMTsKLQl1aW50MzJfdAlydmQxNjoxMTsKLQl1aW50MzJfdAl2X2NiY3Jfd21fcG1fc3RhdHNfMV9ibDo4OwotCXVpbnQzMl90CXJ2ZDE3Ojg7Ci0JdWludDMyX3QJdl9jYmNyX3dtX3BtX3N0YXRzXzFfbmw6MTI7Ci0JdWludDMyX3QJcnZkMTg6NDsKLQotCXVpbnQzMl90ICAgICAgZnJhbWVfaWQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgdmZlX2VuZGZyYW1lIHsKLQl1aW50MzJfdCAgICAgIHlfYWRkcmVzczsKLQl1aW50MzJfdCAgICAgIGNiY3JfYWRkcmVzczsKLQotCXN0cnVjdCB2ZmVfZnJhbWVfZXh0cmEgZXh0cmE7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgdmZlX291dHB1dGFjayB7Ci0JdWludDMyX3QgIGhlYWRlcjsKLQl2b2lkICAgICAgKm91dHB1dDJuZXd5YnVmZmVyYWRkcmVzczsKLQl2b2lkICAgICAgKm91dHB1dDJuZXdjYmNyYnVmZmVyYWRkcmVzczsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2ZmVfc3RhdHNfYWNrIHsKLQl1aW50MzJfdCBoZWFkZXI7Ci0JLyogTVVTVCBCRSA2NCBiaXQgQUxJR05FRCAqLwotCXZvaWQgICAgICpidWZhZGRyOwotfSBfX3BhY2tlZDsKLQotLyogQVhJIE91dHB1dCBDb25maWcgQ29tbWFuZCBzZW50IHRvIERTUCAqLwotc3RydWN0IGF4aW91dCB7Ci0JdWludDMyX3QgICAgICAgICAgICBjbWRoZWFkZXI6MzI7Ci0JaW50ICAgICAgICAgICAgICAgICBvdXRwdXRtb2RlOjM7Ci0JdWludDhfdCAgICAgICAgICAgICBmb3JtYXQ6MjsKLQl1aW50MzJfdCAgICAgICAgICAgIC8qIHJlc2VydmVkICovIDogMjc7Ci0KLQkvKiBBWEkgT3V0cHV0IDEgWSBDb25maWd1cmF0aW9uLCBQYXJ0IDEgKi8KLQl1aW50MzJfdCAgICAgICAgICAgIG91dDF5aW1hZ2VoZWlnaHQ6MTI7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3QgICAgICAgICAgICBvdXQxeWltYWdld2lkdGhpbjY0Yml0d29yZHM6MTA7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0KLQkvKiBBWEkgT3V0cHV0IDEgWSBDb25maWd1cmF0aW9uLCBQYXJ0IDIgKi8KLQl1aW50OF90ICAgICAgICAgICAgIG91dDF5YnVyc3RsZW46MjsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDF5bnVtcm93czoxMjsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDF5cm93aW5jaW42NGJpdGluY3M6MTI7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0KLQkvKiBBWEkgT3V0cHV0IDEgQ2JDciBDb25maWd1cmF0aW9uLCBQYXJ0IDEgKi8KLQl1aW50MzJfdCAgICAgICAgICAgIG91dDFjYmNyaW1hZ2VoZWlnaHQ6MTI7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3QgICAgICAgICAgICBvdXQxY2JjcmltYWdld2lkdGhpbjY0Yml0d29yZHM6MTA7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0KLQkvKiBBWEkgT3V0cHV0IDEgQ2JDciBDb25maWd1cmF0aW9uLCBQYXJ0IDIgKi8KLQl1aW50OF90ICAgICAgICAgICAgIG91dDFjYmNyYnVyc3RsZW46MjsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDFjYmNybnVtcm93czoxMjsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDFjYmNycm93aW5jaW42NGJpdGluY3M6MTI7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0KLQkvKiBBWEkgT3V0cHV0IDIgWSBDb25maWd1cmF0aW9uLCBQYXJ0IDEgKi8KLQl1aW50MzJfdCAgICAgICAgICAgIG91dDJ5aW1hZ2VoZWlnaHQ6MTI7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3QgICAgICAgICAgICBvdXQyeWltYWdld2lkdGhpbjY0Yml0d29yZHM6MTA7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0KLQkvKiBBWEkgT3V0cHV0IDIgWSBDb25maWd1cmF0aW9uLCBQYXJ0IDIgKi8KLQl1aW50OF90ICAgICAgICAgICAgIG91dDJ5YnVyc3RsZW46MjsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDJ5bnVtcm93czoxMjsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDJ5cm93aW5jaW42NGJpdGluY3M6MTI7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0KLQkvKiBBWEkgT3V0cHV0IDIgQ2JDciBDb25maWd1cmF0aW9uLCBQYXJ0IDEgKi8KLQl1aW50MzJfdCAgICAgICAgICAgIG91dDJjYmNyaW1hZ2VoZWlnaHQ6MTI7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3QgICAgICAgICAgICBvdXQyY2JjcmltYWdld2lkdGVpbjY0Yml0d29yZHM6MTA7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0KLQkvKiBBWEkgT3V0cHV0IDIgQ2JDciBDb25maWd1cmF0aW9uLCBQYXJ0IDIgKi8KLQl1aW50OF90ICAgICAgICAgICAgIG91dDJjYmNyYnVyc3RsZW46MjsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDJjYmNybnVtcm93czoxMjsKLQl1aW50MzJfdCAgICAgICAgICAgIG91dDJjYmNycm93aW5jaW42NGJpdGluY3M6MTI7Ci0JdWludDMyX3QgICAgICAgICAgICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0KLQkvKiBBZGRyZXNzIGNvbmZpZ3VyYXRpb246Ci0JICogb3V0cHV0MSBwaGlzeWNhbCBhZGRyZXNzICovCi0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXIxX3lfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQxYnVmZmVyMV9jYmNyX3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MWJ1ZmZlcjJfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXIyX2NiY3JfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQxYnVmZmVyM195X3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MWJ1ZmZlcjNfY2Jjcl9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXI0X3lfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQxYnVmZmVyNF9jYmNyX3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MWJ1ZmZlcjVfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXI1X2NiY3JfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQxYnVmZmVyNl95X3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MWJ1ZmZlcjZfY2Jjcl9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXI3X3lfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQxYnVmZmVyN19jYmNyX3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MWJ1ZmZlcjhfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDFidWZmZXI4X2NiY3JfcGh5OwotCi0JLyogb3V0cHV0MiBwaGlzeWNhbCBhZGRyZXNzICovCi0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXIxX3lfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQyYnVmZmVyMV9jYmNyX3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MmJ1ZmZlcjJfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXIyX2NiY3JfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQyYnVmZmVyM195X3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MmJ1ZmZlcjNfY2Jjcl9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXI0X3lfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQyYnVmZmVyNF9jYmNyX3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MmJ1ZmZlcjVfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXI1X2NiY3JfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQyYnVmZmVyNl95X3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MmJ1ZmZlcjZfY2Jjcl9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXI3X3lfcGh5OwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXQyYnVmZmVyN19jYmNyX3BoeTsKLQl1bnNpZ25lZCBsb25nICAgb3V0cHV0MmJ1ZmZlcjhfeV9waHk7Ci0JdW5zaWduZWQgbG9uZyAgIG91dHB1dDJidWZmZXI4X2NiY3JfcGh5OwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZmZV9zdGF0c193ZV9jZmcgewotCXVpbnQzMl90ICAgICAgIGhlYWRlcjsKLQotCS8qIFdoaXRlIEJhbGFuY2UvRXhwb3N1cmUgU3RhdGlzdGljIFNlbGVjdGlvbiAqLwotCXVpbnQ4X3QgICAgICAgIHdiX2V4cHN0YXRzZW5hYmxlOjE7Ci0JdWludDhfdCAgICAgICAgd2JfZXhwc3RhdGJ1c3ByaW9yaXR5c2VsZWN0aW9uOjE7Ci0JdW5zaWduZWQgaW50ICAgd2JfZXhwc3RhdGJ1c3ByaW9yaXR5dmFsdWU6NDsKLQl1bnNpZ25lZCBpbnQgICAvKiByZXNlcnZlZCAqLyA6IDI2OwotCi0JLyogV2hpdGUgQmFsYW5jZS9FeHBvc3VyZSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiwgUGFydCAxICovCi0JdWludDhfdCAgICAgICAgZXhwb3N1cmVzdGF0cmVnaW9uczoxOwotCXVpbnQ4X3QgICAgICAgIGV4cG9zdXJlc3RhdHN1YnJlZ2lvbnM6MTsKLQl1bnNpZ25lZCBpbnQgICAvKiByZXNlcnZlZCAqLyA6IDE0OwotCi0JdW5zaWduZWQgaW50ICAgd2hpdGViYWxhbmNlbWluaW11bXk6ODsKLQl1bnNpZ25lZCBpbnQgICB3aGl0ZWJhbGFuY2VtYXhpbXVteTo4OwotCi0JLyogV2hpdGUgQmFsYW5jZS9FeHBvc3VyZSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiwgUGFydCAyICovCi0JdWludDhfdCB3Yl9leHBzdGF0c2xvcGVvZm5ldXRyYWxyZWdpb25saW5lWwotCQlOVU1fV0JfRVhQX05FVVRSQUxfUkVHSU9OX0xJTkVTXTsKLQotCS8qIFdoaXRlIEJhbGFuY2UvRXhwb3N1cmUgU3RhdGlzdGljIENvbmZpZ3VyYXRpb24sIFBhcnQgMyAqLwotCXVuc2lnbmVkIGludCAgIHdiX2V4cHN0YXRjcmludGVyY2VwdG9mbmV1dHJhbHJlZ2lvbmxpbmUyOjEyOwotCXVuc2lnbmVkIGludCAgIC8qIHJlc2VydmVkICovIDogNDsKLQl1bnNpZ25lZCBpbnQgICB3Yl9leHBzdGF0Y2JpbnRlcmNlcHRvZm5ldXRyYWxyZWdpbm5saW5lMToxMjsKLQl1bnNpZ25lZCBpbnQgICAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCi0JLyogV2hpdGUgQmFsYW5jZS9FeHBvc3VyZSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiwgUGFydCA0ICovCi0JdW5zaWduZWQgaW50ICAgd2JfZXhwc3RhdGNyaW50ZXJjZXB0b2ZuZXV0cmFscmVnaW9ubGluZTQ6MTI7Ci0JdW5zaWduZWQgaW50ICAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCXVuc2lnbmVkIGludCAgIHdiX2V4cHN0YXRjYmludGVyY2VwdG9mbmV1dHJhbHJlZ2lvbmxpbmUzOjEyOwotCXVuc2lnbmVkIGludCAgIC8qIHJlc2VydmVkICovIDogNDsKLQotCS8qIFdoaXRlIEJhbGFuY2UvRXhwb3N1cmUgU3RhdGlzdGljIE91dHB1dCBCdWZmZXIgSGVhZGVyICovCi0JdW5zaWduZWQgaW50ICAgd2JfZXhwbWV0cmljaGVhZGVycGF0dGVybjo4OwotCXVuc2lnbmVkIGludCAgIC8qIHJlc2VydmVkICovIDogMjQ7Ci0KLQkvKiBXaGl0ZSBCYWxhbmNlL0V4cG9zdXJlIFN0YXRpc3RpYyBPdXRwdXQgQnVmZmVycy1NVVNUCi0JKiBCRSA2NCBiaXQgQUxJR05FRCAqLwotCXZvaWQgICp3Yl9leHBzdGF0b3V0cHV0YnVmZmVyW05VTV9XQl9FWFBfU1RBVF9PVVRQVVRfQlVGRkVSU107Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgdmZlX3N0YXRzX2FmX2NmZyB7Ci0JdWludDMyX3QgaGVhZGVyOwotCi0JLyogQXV0b2ZvY3VzIFN0YXRpc3RpYyBTZWxlY3Rpb24gKi8KLQl1aW50OF90ICAgICAgIGFmX2VuYWJsZToxOwotCXVpbnQ4X3QgICAgICAgYWZfYnVzcHJpb3JpdHlzZWw6MTsKLQl1bnNpZ25lZCBpbnQgIGFmX2J1c3ByaW9yaXR5dmFsOjQ7Ci0JdW5zaWduZWQgaW50ICAvKiByZXNlcnZlZCAqLyA6IDI2OwotCi0JLyogQXV0b2ZvY3VzIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uLCBQYXJ0IDEgKi8KLQl1bnNpZ25lZCBpbnQgIGFmX3NpbmdsZXdpbnZvZmZzZXQ6MTI7Ci0JdW5zaWduZWQgaW50ICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdW5zaWduZWQgaW50ICBhZl9zaW5nbGV3aW5ob2Zmc2V0OjEyOwotCXVuc2lnbmVkIGludCAgLyogcmVzZXJ2ZWQgKi8gOiAzOwotCXVpbnQ4X3QgICAgICAgYWZfd2lubW9kZToxOwotCi0JLyogQXV0b2ZvY3VzIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uLCBQYXJ0IDIgKi8KLQl1bnNpZ25lZCBpbnQgIGFmX3NpbmdnbGV3aW52aDoxMTsKLQl1bnNpZ25lZCBpbnQgIC8qIHJlc2VydmVkICovIDogNTsKLQl1bnNpZ25lZCBpbnQgIGFmX3NpbmdsZXdpbmh3OjExOwotCXVuc2lnbmVkIGludCAgLyogcmVzZXJ2ZWQgKi8gOiA1OwotCi0JLyogQXV0b2ZvY3VzIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uLCBQYXJ0cyAzLTYgKi8KLQl1aW50OF90ICAgICAgIGFmX211bHRpd2luZ3JpZFtOVU1fQVVUT0ZPQ1VTX01VTFRJX1dJTkRPV19HUklEU107Ci0KLQkvKiBBdXRvZm9jdXMgU3RhdGlzdGljIENvbmZpZ3VyYXRpb24sIFBhcnQgNyAqLwotCXNpZ25lZCBpbnQgICAgYWZfbWV0cmljaHBmY29lZmEwMDo1OwotCXNpZ25lZCBpbnQgICAgYWZfbWV0cmljaHBmY29lZmEwNDo1OwotCXVuc2lnbmVkIGludCAgYWZfbWV0cmljbWF4dmFsOjExOwotCXVpbnQ4X3QgICAgICAgYWZfbWV0cmljc2VsOjE7Ci0JdW5zaWduZWQgaW50ICAvKiByZXNlcnZlZCAqLyA6IDEwOwotCi0JLyogQXV0b2ZvY3VzIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uLCBQYXJ0IDggKi8KLQlzaWduZWQgaW50ICAgIGFmX21ldHJpY2hwZmNvZWZhMjA6NTsKLQlzaWduZWQgaW50ICAgIGFmX21ldHJpY2hwZmNvZWZhMjE6NTsKLQlzaWduZWQgaW50ICAgIGFmX21ldHJpY2hwZmNvZWZhMjI6NTsKLQlzaWduZWQgaW50ICAgIGFmX21ldHJpY2hwZmNvZWZhMjM6NTsKLQlzaWduZWQgaW50ICAgIGFmX21ldHJpY2hwZmNvZWZhMjQ6NTsKLQl1bnNpZ25lZCBpbnQgIC8qIHJlc2VydmVkICovIDogNzsKLQotCS8qIEF1dG9mb2N1cyBTdGF0aXN0aWMgT3V0cHV0IEJ1ZmZlciBIZWFkZXIgKi8KLQl1bnNpZ25lZCBpbnQgIGFmX21ldHJpY2hwOjg7Ci0JdW5zaWduZWQgaW50ICAvKiByZXNlcnZlZCAqLyA6IDI0OwotCi0JLyogQXV0b2ZvY3VzIFN0YXRpc3RpYyBPdXRwdXQgQnVmZmVycyAtIE1VU1QgQkUgNjQgYml0IEFMSUdORUQhISEgKi8KLQl2b2lkICphZl9vdXRidWZbTlVNX0FGX1NUQVRfT1VUUFVUX0JVRkZFUlNdOwotfSBfX3BhY2tlZDsgLyogVkZFX1N0YXRzQXV0b2ZvY3VzQ29uZmlnQ21kVHlwZSAqLwotCi1zdHJ1Y3QgbXNtX2NhbWVyYV9mcmFtZV9tc2cgewotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXRfeV9hZGRyZXNzOwotCXVuc2lnbmVkIGxvbmcgICBvdXRwdXRfY2Jjcl9hZGRyZXNzOwotCi0JdW5zaWduZWQgaW50ICAgIGJsYWNrbGV2ZWxldmVuQ29sdW1uOjIzOwotCXVpbnQxNl90ICAgICAgICByZXNlcnZlZDE6OTsKLQl1bnNpZ25lZCBpbnQgICAgYmxhY2tsZXZlbG9kZENvbHVtbjoyMzsKLQl1aW50MTZfdCAgICAgICAgcmVzZXJ2ZWQyOjk7Ci0KLQl1aW50MTZfdCAgICAgICAgZ3JlZW5kZWZlY3RwaXhlbGNvdW50Ojg7Ci0JdWludDE2X3QgICAgICAgIHJlc2VydmVkMzo4OwotCXVpbnQxNl90ICAgICAgICByZWRibHVlZGVmZWN0cGl4ZWxjb3VudDo4OwotCXVpbnQxNl90ICAgICAgICByZXNlcnZlZDQ6ODsKLX0gX19wYWNrZWQ7Ci0KLS8qIE5ldyBvbmUgZm9yIDdrICovCi1zdHJ1Y3QgbXNtX3ZmZV9jb21tYW5kXzdrIHsKLQl1aW50MTZfdCBxdWV1ZTsKLQl1aW50MTZfdCBsZW5ndGg7Ci0Jdm9pZCAgICAgKnZhbHVlOwotfTsKLQotc3RydWN0IHN0b3BfZXZlbnQgewotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0JaW50IHN0YXRlOwotCWludCB0aW1lb3V0OwotfTsKLXN0cnVjdCB2ZmVfZXJyb3JfbXNnIHsKLQl1bnNpZ25lZCBpbnQgY2FtaWZfZXJyb3I6MTsKLQl1bnNpZ25lZCBpbnQgb3V0cHV0MXlidXNvdmVyZmxvdzoxOwotCXVuc2lnbmVkIGludCBvdXRwdXQxY2JjcmJ1c292ZXJmbG93OjE7Ci0JdW5zaWduZWQgaW50IG91dHB1dDJ5YnVzb3ZlcmZsb3c6MTsKLQl1bnNpZ25lZCBpbnQgb3V0cHV0MmNiY3JidXNvdmVyZmxvdzoxOwotCXVuc2lnbmVkIGludCBhdXRvZm9jdXNzdGF0YnVzb3ZlcmZsb3c6MTsKLQl1bnNpZ25lZCBpbnQgd2JfZXhwc3RhdGJ1c292ZXJmbG93OjE7Ci0JdW5zaWduZWQgaW50IGF4aWVycm9yOjE7Ci0JdW5zaWduZWQgaW50IC8qIHJlc2VydmVkICovIDogMjQ7Ci0JdW5zaWduZWQgaW50IGNhbWlmX3N0YXVzOjE7Ci0JdW5zaWduZWQgaW50IHBpeGVsX2NvdW50OjE0OwotCXVuc2lnbmVkIGludCBsaW5lX2NvdW50OjE0OwotCXVuc2lnbmVkIGludCAvKnJlc2VydmVkICovIDogMzsKLX0gX19wYWNrZWQ7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2ZyZWVfYnVmICp2ZmUyeF9jaGVja19mcmVlX2J1ZmZlcihpbnQgaWQsIGludCBwYXRoKTsKLQotI2VuZGlmIC8qIF9fTVNNX1ZGRTdYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlOHguYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTh4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1M2Q2MzQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlOHguYworKysgL2Rldi9udWxsCkBAIC0xLDg0MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotI2luY2x1ZGUgIm1zbV92ZmU4eF9wcm9jLmgiCi0jaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Ci0KLSNkZWZpbmUgT04gIDEKLSNkZWZpbmUgT0ZGIDAKLQotc3RhdGljIGNvbnN0IGNoYXIgKnZmZV9nZW5lcmFsX2NtZFtdID0gewotCSJTVEFSVCIsICAvKiAwICovCi0JIlJFU0VUIiwKLQkiQVhJX0lOUFVUX0NPTkZJRyIsCi0JIkNBTUlGX0NPTkZJRyIsCi0JIkFYSV9PVVRQVVRfQ09ORklHIiwKLQkiQkxBQ0tfTEVWRUxfQ09ORklHIiwgIC8qIDUgKi8KLQkiUk9MTF9PRkZfQ09ORklHIiwKLQkiREVNVVhfQ0hBTk5FTF9HQUlOX0NPTkZJRyIsCi0JIkRFTU9TQUlDX0NPTkZJRyIsCi0JIkZPVl9DUk9QX0NPTkZJRyIsCi0JIk1BSU5fU0NBTEVSX0NPTkZJRyIsICAvKiAxMCAqLwotCSJXSElURV9CQUxBTkNFX0NPTkZJRyIsCi0JIkNPTE9SX0NPUlJFQ1RJT05fQ09ORklHIiwKLQkiTEFfQ09ORklHIiwKLQkiUkdCX0dBTU1BX0NPTkZJRyIsCi0JIkNIUk9NQV9FTkhBTl9DT05GSUciLCAgLyogMTUgKi8KLQkiQ0hST01BX1NVUFBSRVNTSU9OX0NPTkZJRyIsCi0JIkFTRl9DT05GSUciLAotCSJTQ0FMRVIyWV9DT05GSUciLAotCSJTQ0FMRVIyQ2JDcl9DT05GSUciLAotCSJDSFJPTUFfU1VCU0FNUExFX0NPTkZJRyIsICAvKiAyMCAqLwotCSJGUkFNRV9TS0lQX0NPTkZJRyIsCi0JIk9VVFBVVF9DTEFNUF9DT05GSUciLAotCSJURVNUX0dFTl9TVEFSVCIsCi0JIlVQREFURSIsCi0JIk9VVFBVVDFfQUNLIiwgIC8qIDI1ICovCi0JIk9VVFBVVDJfQUNLIiwKLQkiRVBPQ0gxX0FDSyIsCi0JIkVQT0NIMl9BQ0siLAotCSJTVEFUU19BVVRPRk9DVVNfQUNLIiwKLQkiU1RBVFNfV0JfRVhQX0FDSyIsICAvKiAzMCAqLwotCSJCTEFDS19MRVZFTF9VUERBVEUiLAotCSJERU1VWF9DSEFOTkVMX0dBSU5fVVBEQVRFIiwKLQkiREVNT1NBSUNfQlBDX1VQREFURSIsCi0JIkRFTU9TQUlDX0FCRl9VUERBVEUiLAotCSJGT1ZfQ1JPUF9VUERBVEUiLCAgLyogMzUgKi8KLQkiV0hJVEVfQkFMQU5DRV9VUERBVEUiLAotCSJDT0xPUl9DT1JSRUNUSU9OX1VQREFURSIsCi0JIkxBX1VQREFURSIsCi0JIlJHQl9HQU1NQV9VUERBVEUiLAotCSJDSFJPTUFfRU5IQU5fVVBEQVRFIiwgIC8qIDQwICovCi0JIkNIUk9NQV9TVVBQUkVTU0lPTl9VUERBVEUiLAotCSJNQUlOX1NDQUxFUl9VUERBVEUiLAotCSJTQ0FMRVIyQ2JDcl9VUERBVEUiLAotCSJTQ0FMRVIyWV9VUERBVEUiLAotCSJBU0ZfVVBEQVRFIiwgIC8qIDQ1ICovCi0JIkZSQU1FX1NLSVBfVVBEQVRFIiwKLQkiQ0FNSUZfRlJBTUVfVVBEQVRFIiwKLQkiU1RBVFNfQVVUT0ZPQ1VTX1VQREFURSIsCi0JIlNUQVRTX1dCX0VYUF9VUERBVEUiLAotCSJTVE9QIiwgIC8qIDUwICovCi0JIkdFVF9IV19WRVJTSU9OIiwKLQkiU1RBVFNfU0VUVElORyIsCi0JIlNUQVRTX0FVVE9GT0NVU19TVEFSVCIsCi0JIlNUQVRTX0FVVE9GT0NVU19TVE9QIiwKLQkiU1RBVFNfV0JfRVhQX1NUQVJUIiwgIC8qIDU1ICovCi0JIlNUQVRTX1dCX0VYUF9TVE9QIiwKLQkiQVNZTkNfVElNRVJfU0VUVElORyIsCi19OwotCi1zdGF0aWMgdm9pZCAgICAgKnZmZV9zeW5jZGF0YTsKLQotc3RhdGljIGludCB2ZmVfZW5hYmxlKHN0cnVjdCBjYW1lcmFfZW5hYmxlX2NtZCAqZW5hYmxlKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZmZV9kaXNhYmxlKHN0cnVjdCBjYW1lcmFfZW5hYmxlX2NtZCAqZW5hYmxlLAotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQl2ZmVfc3RvcCgpOwotCW1zbV9jYW1pb19kaXNhYmxlKGRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9yZWxlYXNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQltc21fY2FtaW9fZGlzYWJsZShkZXYpOwotCXZmZV9jbWRfcmVsZWFzZShkZXYpOwotCXVwZGF0ZV9heGlfcW9zKFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQl2ZmVfc3luY2RhdGEgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfY29uZmlnX2F4aShpbnQgbW9kZSwKLQkJCSAgIHN0cnVjdCBheGlkYXRhICphZCwKLQkJCSAgIHN0cnVjdCB2ZmVfY21kX2F4aV9vdXRwdXRfY29uZmlnICphbykKLXsKLQlzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uICpyZWdwdHIsICpyZWdwdHIxOwotCWludCBpLCBqOwotCXVpbnQzMl90ICpwMSwgKnAyOwotCi0JaWYgKG1vZGUgPT0gT1VUUFVUXzEgfHwgbW9kZSA9PSBPVVRQVVRfMV9BTkRfMikgewotCQlyZWdwdHIgPSBhZC0+cmVnaW9uOwotCQlmb3IgKGkgPSAwOyBpIDwgYWQtPmJ1Zm51bTE7IGkrKykgewotCi0JCQlwMSA9ICYoYW8tPm91dHB1dDEub3V0cHV0WS5vdXRGcmFnbWVudHNbaV1bMF0pOwotCQkJcDIgPSAmKGFvLT5vdXRwdXQxLm91dHB1dENiY3Iub3V0RnJhZ21lbnRzW2ldWzBdKTsKLQotCQkJZm9yIChqID0gMDsgaiA8IGFvLT5vdXRwdXQxLmZyYWdtZW50Q291bnQ7IGorKykgewotCi0JCQkJKnAxID0gcmVncHRyLT5wYWRkciArIHJlZ3B0ci0+aW5mby5wbGFuYXIwX29mZjsKLQkJCQlwMSsrOwotCi0JCQkJKnAyID0gcmVncHRyLT5wYWRkciArIHJlZ3B0ci0+aW5mby5wbGFuYXIxX29mZjsKLQkJCQlwMisrOwotCQkJfQotCQkJcmVncHRyKys7Ci0JCX0KLQl9IC8qIGlmIE9VVFBVVDEgb3IgQm90aCAqLwotCi0JaWYgKG1vZGUgPT0gT1VUUFVUXzIgfHwgbW9kZSA9PSBPVVRQVVRfMV9BTkRfMikgewotCi0JCXJlZ3B0ciA9ICYoYWQtPnJlZ2lvblthZC0+YnVmbnVtMV0pOwotCQlDREJHKCJidWZudW0yID0gJWRcbiIsIGFkLT5idWZudW0yKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgYWQtPmJ1Zm51bTI7IGkrKykgewotCi0JCQlwMSA9ICYoYW8tPm91dHB1dDIub3V0cHV0WS5vdXRGcmFnbWVudHNbaV1bMF0pOwotCQkJcDIgPSAmKGFvLT5vdXRwdXQyLm91dHB1dENiY3Iub3V0RnJhZ21lbnRzW2ldWzBdKTsKLQotCQkJQ0RCRygiY29uZmlnX2F4aTogTzIsIHBoeSA9IDB4JWx4LCB5X29mZiA9ICVkLCAiXAotCQkJICAgICAiY2Jjcl9vZmYgPSAlZFxuIiwgcmVncHRyLT5wYWRkciwKLQkJCQlyZWdwdHItPmluZm8ucGxhbmFyMF9vZmYsCi0JCQkJcmVncHRyLT5pbmZvLnBsYW5hcjFfb2ZmKTsKLQotCQkJZm9yIChqID0gMDsgaiA8IGFvLT5vdXRwdXQyLmZyYWdtZW50Q291bnQ7IGorKykgewotCi0JCQkJKnAxID0gcmVncHRyLT5wYWRkciArIHJlZ3B0ci0+aW5mby5wbGFuYXIwX29mZjsKLQkJCQlDREJHKCJ2ZmVfY29uZmlnX2F4aTogcDEgPSAweCV4XG4iLCAqcDEpOwotCQkJCXAxKys7Ci0KLQkJCQkqcDIgPSByZWdwdHItPnBhZGRyICsgcmVncHRyLT5pbmZvLnBsYW5hcjFfb2ZmOwotCQkJCUNEQkcoInZmZV9jb25maWdfYXhpOiBwMiA9IDB4JXhcbiIsICpwMik7Ci0JCQkJcDIrKzsKLQkJCX0KLQkJCXJlZ3B0cisrOwotCQl9Ci0JfQotCS8qIEZvciB2aWRlbyBjb25maWd1cmF0aW9uICovCi0JaWYgKG1vZGUgPT0gT1VUUFVUXzFfQU5EXzMpIHsKLQkJLyogdGhpcyBpcyBwcmV2aWV3IGJ1ZmZlci4gKi8KLQkJcmVncHRyID0gICYoYWQtPnJlZ2lvblswXSk7Ci0JCS8qIHRoaXMgaXMgdmlkZW8gYnVmZmVyLiAqLwotCQlyZWdwdHIxID0gJihhZC0+cmVnaW9uW2FkLT5idWZudW0xXSk7Ci0JCUNEQkcoImJ1Zm51bTEgPSAlZFxuIiwgYWQtPmJ1Zm51bTEpOwotCQlDREJHKCJidWZudW0yID0gJWRcbiIsIGFkLT5idWZudW0yKTsKLQotCWZvciAoaSA9IDA7IGkgPCBhZC0+YnVmbnVtMTsgaSsrKSB7Ci0JCXAxID0gJihhby0+b3V0cHV0MS5vdXRwdXRZLm91dEZyYWdtZW50c1tpXVswXSk7Ci0JCXAyID0gJihhby0+b3V0cHV0MS5vdXRwdXRDYmNyLm91dEZyYWdtZW50c1tpXVswXSk7Ci0KLQkJQ0RCRygiY29uZmlnX2F4aTogTzEsIHBoeSA9IDB4JWx4LCB5X29mZiA9ICVkLCAiXAotCQkJICJjYmNyX29mZiA9ICVkXG4iLCByZWdwdHItPnBhZGRyLAotCQkJIHJlZ3B0ci0+aW5mby5wbGFuYXIwX29mZiwgcmVncHRyLT5pbmZvLnBsYW5hcjFfb2ZmKTsKLQotCQkJZm9yIChqID0gMDsgaiA8IGFvLT5vdXRwdXQxLmZyYWdtZW50Q291bnQ7IGorKykgewotCi0JCQkJKnAxID0gcmVncHRyLT5wYWRkciArIHJlZ3B0ci0+aW5mby5wbGFuYXIwX29mZjsKLQkJCQlDREJHKCJ2ZmVfY29uZmlnX2F4aTogcDEgPSAweCV4XG4iLCAqcDEpOwotCQkJCXAxKys7Ci0KLQkJCQkqcDIgPSByZWdwdHItPnBhZGRyICsgcmVncHRyLT5pbmZvLnBsYW5hcjFfb2ZmOwotCQkJCUNEQkcoInZmZV9jb25maWdfYXhpOiBwMiA9IDB4JXhcbiIsICpwMik7Ci0JCQkJcDIrKzsKLQkJCX0KLQkJCXJlZ3B0cisrOwotCQl9Ci0JZm9yIChpID0gMDsgaSA8IGFkLT5idWZudW0yOyBpKyspIHsKLQkJcDEgPSAmKGFvLT5vdXRwdXQyLm91dHB1dFkub3V0RnJhZ21lbnRzW2ldWzBdKTsKLQkJcDIgPSAmKGFvLT5vdXRwdXQyLm91dHB1dENiY3Iub3V0RnJhZ21lbnRzW2ldWzBdKTsKLQotCQlDREJHKCJjb25maWdfYXhpOiBPMiwgcGh5ID0gMHglbHgsIHlfb2ZmID0gJWQsICJcCi0JCQkgImNiY3Jfb2ZmID0gJWRcbiIsIHJlZ3B0cjEtPnBhZGRyLAotCQkJIHJlZ3B0cjEtPmluZm8ucGxhbmFyMF9vZmYsIHJlZ3B0cjEtPmluZm8ucGxhbmFyMV9vZmYpOwotCi0JCQlmb3IgKGogPSAwOyBqIDwgYW8tPm91dHB1dDIuZnJhZ21lbnRDb3VudDsgaisrKSB7Ci0JCQkJKnAxID0gcmVncHRyMS0+cGFkZHIgKwotCQkJCQlyZWdwdHIxLT5pbmZvLnBsYW5hcjBfb2ZmOwotCQkJCUNEQkcoInZmZV9jb25maWdfYXhpOiBwMSA9IDB4JXhcbiIsICpwMSk7Ci0JCQkJcDErKzsKLQkJCQkqcDIgPSByZWdwdHIxLT5wYWRkciArCi0JCQkJCXIxLT5pbmZvLnBsYW5hcjFfb2ZmOwotCQkJCUNEQkcoInZmZV9jb25maWdfYXhpOiBwMiA9IDB4JXhcbiIsICpwMik7Ci0JCQkJcDIrKzsKLQkJCX0KLQkJCXJlZ3B0cjErKzsKLQkJfQotCX0KLQotfQotCi0jZGVmaW5lIENIRUNLRURfQ09QWV9GUk9NX1VTRVIoaW4pIHsJCQkJCVwKLQlpZiAoY21kLT5sZW5ndGggIT0gc2l6ZW9mKCooaW4pKSkgewkJCQlcCi0JCXByX2VycigibXNtX2NhbWVyYTogJXM6JWQgY21kICVkOiB1c2VyIGRhdGEgc2l6ZSAlZCAiCVwKLQkJCSIhPSBrZXJuZWwgZGF0YSBzaXplICVkXG4iLAkJCVwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXywJCQkJXAotCQkJY21kLT5pZCwgY21kLT5sZW5ndGgsIHNpemVvZigqKGluKSkpOwkJXAotCQlyYyA9IC1FSU87CQkJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCX0JCQkJCQkJCVwKLQlpZiAoY29weV9mcm9tX3VzZXIoKGluKSwgKHZvaWQgX191c2VyICopY21kLT52YWx1ZSwJCVwKLQkJCXNpemVvZigqKGluKSkpKSB7CQkJCVwKLQkJcmMgPSAtRUZBVUxUOwkJCQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi19Ci0KLXN0YXRpYyBpbnQgdmZlX3Byb2NfZ2VuZXJhbChzdHJ1Y3QgbXNtX3ZmZV9jb21tYW5kXzhrICpjbWQpCi17Ci0JaW50IHJjID0gMDsKLQotCUNEQkcoIiVzOiBjbWRJRCA9ICVzXG4iLCBfX2Z1bmNfXywgdmZlX2dlbmVyYWxfY21kW2NtZC0+aWRdKTsKLQotCXN3aXRjaCAoY21kLT5pZCkgewotCWNhc2UgVkZFX0NNRF9JRF9SRVNFVDoKLQkJbXNtX2NhbWlvX3ZmZV9ibGtfcmVzZXQoKTsKLQkJbXNtX2NhbWlvX2NhbWlmX3BhZF9yZWdfcmVzZXRfMigpOwotCQl2ZmVfcmVzZXQoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfSURfU1RBUlQ6IHsKLQkJc3RydWN0IHZmZV9jbWRfc3RhcnQgc3RhcnQ7Ci0JCQlDSEVDS0VEX0NPUFlfRlJPTV9VU0VSKCZzdGFydCk7Ci0KLQkJLyogbXNtX2NhbWlvX2NhbWlmX3BhZF9yZWdfcmVzZXRfMigpOyAqLwotCQltc21fY2FtaW9fY2FtaWZfcGFkX3JlZ19yZXNldCgpOwotCQl2ZmVfc3RhcnQoJnN0YXJ0KTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0lEX0NBTUlGX0NPTkZJRzogewotCQlzdHJ1Y3QgdmZlX2NtZF9jYW1pZl9jb25maWcgY2FtaWY7Ci0JCQlDSEVDS0VEX0NPUFlfRlJPTV9VU0VSKCZjYW1pZik7Ci0KLQkJdmZlX2NhbWlmX2NvbmZpZygmY2FtaWYpOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfSURfQkxBQ0tfTEVWRUxfQ09ORklHOiB7Ci0JCXN0cnVjdCB2ZmVfY21kX2JsYWNrX2xldmVsX2NvbmZpZyBibDsKLQkJCUNIRUNLRURfQ09QWV9GUk9NX1VTRVIoJmJsKTsKLQotCQl2ZmVfYmxhY2tfbGV2ZWxfY29uZmlnKCZibCk7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9JRF9ST0xMX09GRl9DT05GSUc6ewotCQkJLyogcm9sbG9mZiBpcyB0b28gYmlnIHRvIGJlIG9uIHRoZSBzdGFjayAqLwotCQkJc3RydWN0IHZmZV9jbWRfcm9sbF9vZmZfY29uZmlnICpyb2xsb2ZmID0KLQkJCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmZlX2NtZF9yb2xsX29mZl9jb25maWcpLAotCQkJCSAgICBHRlBfS0VSTkVMKTsKLQkJCWlmICghcm9sbG9mZikgewotCQkJCXByX2VycigiJXM6IG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBXcmFwIENIRUNLRURfQ09QWV9GUk9NX1VTRVIoKSBpbiBhIGRvLXdoaWxlKDApIGxvb3AKLQkJCSAqIHRvIG1ha2Ugc3VyZSB3ZSBmcmVlIHJvbGxvZmYgd2hlbiBjb3B5X2Zyb21fdXNlcigpCi0JCQkgKiBmYWlscy4KLQkJCSAqLwotCQkJZG8gewotCQkJCUNIRUNLRURfQ09QWV9GUk9NX1VTRVIocm9sbG9mZik7Ci0JCQkJdmZlX3JvbGxfb2ZmX2NvbmZpZyhyb2xsb2ZmKTsKLQkJCX0gd2hpbGUgKDApOwotCQkJa2ZyZWUocm9sbG9mZik7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9JRF9ERU1VWF9DSEFOTkVMX0dBSU5fQ09ORklHOiB7Ci0JCXN0cnVjdCB2ZmVfY21kX2RlbXV4X2NoYW5uZWxfZ2Fpbl9jb25maWcgZGVtdXhjOwotCQkJQ0hFQ0tFRF9DT1BZX0ZST01fVVNFUigmZGVtdXhjKTsKLQotCQkvKiBkZW11eCBpcyBhbHdheXMgZW5hYmxlZC4gICovCi0JCXZmZV9kZW11eF9jaGFubmVsX2dhaW5fY29uZmlnKCZkZW11eGMpOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfSURfREVNT1NBSUNfQ09ORklHOiB7Ci0JCXN0cnVjdCB2ZmVfY21kX2RlbW9zYWljX2NvbmZpZyBkZW1vc2FpYzsKLQkJCUNIRUNLRURfQ09QWV9GUk9NX1VTRVIoJmRlbW9zYWljKTsKLQotCQl2ZmVfZGVtb3NhaWNfY29uZmlnKCZkZW1vc2FpYyk7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9JRF9GT1ZfQ1JPUF9DT05GSUc6Ci0JY2FzZSBWRkVfQ01EX0lEX0ZPVl9DUk9QX1VQREFURTogewotCQlzdHJ1Y3QgdmZlX2NtZF9mb3ZfY3JvcF9jb25maWcgZm92OwotCQkJQ0hFQ0tFRF9DT1BZX0ZST01fVVNFUigmZm92KTsKLQotCQl2ZmVfZm92X2Nyb3BfY29uZmlnKCZmb3YpOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfSURfTUFJTl9TQ0FMRVJfQ09ORklHOgotCWNhc2UgVkZFX0NNRF9JRF9NQUlOX1NDQUxFUl9VUERBVEU6IHsKLQkJc3RydWN0IHZmZV9jbWRfbWFpbl9zY2FsZXJfY29uZmlnIG1haW5kczsKLQkJCUNIRUNLRURfQ09QWV9GUk9NX1VTRVIoJm1haW5kcyk7Ci0KLQkJdmZlX21haW5fc2NhbGVyX2NvbmZpZygmbWFpbmRzKTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0lEX1dISVRFX0JBTEFOQ0VfQ09ORklHOgotCWNhc2UgVkZFX0NNRF9JRF9XSElURV9CQUxBTkNFX1VQREFURTogewotCQlzdHJ1Y3QgdmZlX2NtZF93aGl0ZV9iYWxhbmNlX2NvbmZpZyB3YjsKLQkJCUNIRUNLRURfQ09QWV9GUk9NX1VTRVIoJndiKTsKLQotCQl2ZmVfd2hpdGVfYmFsYW5jZV9jb25maWcoJndiKTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0lEX0NPTE9SX0NPUlJFQ1RJT05fQ09ORklHOgotCWNhc2UgVkZFX0NNRF9JRF9DT0xPUl9DT1JSRUNUSU9OX1VQREFURTogewotCQlzdHJ1Y3QgdmZlX2NtZF9jb2xvcl9jb3JyZWN0aW9uX2NvbmZpZyBjYzsKLQkJCUNIRUNLRURfQ09QWV9GUk9NX1VTRVIoJmNjKTsKLQotCQl2ZmVfY29sb3JfY29ycmVjdGlvbl9jb25maWcoJmNjKTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0lEX0xBX0NPTkZJRzogewotCQlzdHJ1Y3QgdmZlX2NtZF9sYV9jb25maWcgbGE7Ci0JCQlDSEVDS0VEX0NPUFlfRlJPTV9VU0VSKCZsYSk7Ci0KLQkJdmZlX2xhX2NvbmZpZygmbGEpOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfSURfUkdCX0dBTU1BX0NPTkZJRzogewotCQlzdHJ1Y3QgdmZlX2NtZF9yZ2JfZ2FtbWFfY29uZmlnIHJnYjsKLQkJCUNIRUNLRURfQ09QWV9GUk9NX1VTRVIoJnJnYik7Ci0KLQkJcmMgPSB2ZmVfcmdiX2dhbW1hX2NvbmZpZygmcmdiKTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0lEX0NIUk9NQV9FTkhBTl9DT05GSUc6Ci0JY2FzZSBWRkVfQ01EX0lEX0NIUk9NQV9FTkhBTl9VUERBVEU6IHsKLQkJc3RydWN0IHZmZV9jbWRfY2hyb21hX2VuaGFuX2NvbmZpZyBjaHJvbTsKLQkJCUNIRUNLRURfQ09QWV9GUk9NX1VTRVIoJmNocm9tKTsKLQotCQl2ZmVfY2hyb21hX2VuaGFuX2NvbmZpZygmY2hyb20pOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfSURfQ0hST01BX1NVUFBSRVNTSU9OX0NPTkZJRzoKLQljYXNlIFZGRV9DTURfSURfQ0hST01BX1NVUFBSRVNTSU9OX1VQREFURTogewotCQlzdHJ1Y3QgdmZlX2NtZF9jaHJvbWFfc3VwcHJlc3Npb25fY29uZmlnIGNocm9tc3VwOwotCQkJQ0hFQ0tFRF9DT1BZX0ZST01fVVNFUigmY2hyb21zdXApOwotCi0JCXZmZV9jaHJvbWFfc3VwX2NvbmZpZygmY2hyb21zdXApOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfSURfQVNGX0NPTkZJRzogewotCQlzdHJ1Y3QgdmZlX2NtZF9hc2ZfY29uZmlnIGFzZjsKLQkJCUNIRUNLRURfQ09QWV9GUk9NX1VTRVIoJmFzZik7Ci0KLQkJdmZlX2FzZl9jb25maWcoJmFzZik7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9JRF9TQ0FMRVIyWV9DT05GSUc6Ci0JY2FzZSBWRkVfQ01EX0lEX1NDQUxFUjJZX1VQREFURTogewotCQlzdHJ1Y3QgdmZlX2NtZF9zY2FsZXIyX2NvbmZpZyBkczJ5OwotCQkJQ0hFQ0tFRF9DT1BZX0ZST01fVVNFUigmZHMyeSk7Ci0KLQkJdmZlX3NjYWxlcjJ5X2NvbmZpZygmZHMyeSk7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9JRF9TQ0FMRVIyQ2JDcl9DT05GSUc6Ci0JY2FzZSBWRkVfQ01EX0lEX1NDQUxFUjJDYkNyX1VQREFURTogewotCQlzdHJ1Y3QgdmZlX2NtZF9zY2FsZXIyX2NvbmZpZyBkczJjYmNyOwotCQkJQ0hFQ0tFRF9DT1BZX0ZST01fVVNFUigmZHMyY2Jjcik7Ci0KLQkJdmZlX3NjYWxlcjJjYmNyX2NvbmZpZygmZHMyY2Jjcik7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9JRF9DSFJPTUFfU1VCU0FNUExFX0NPTkZJRzogewotCQlzdHJ1Y3QgdmZlX2NtZF9jaHJvbWFfc3Vic2FtcGxlX2NvbmZpZyBzdWI7Ci0JCQlDSEVDS0VEX0NPUFlfRlJPTV9VU0VSKCZzdWIpOwotCi0JCXZmZV9jaHJvbWFfc3Vic2FtcGxlX2NvbmZpZygmc3ViKTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0lEX0ZSQU1FX1NLSVBfQ09ORklHOiB7Ci0JCXN0cnVjdCB2ZmVfY21kX2ZyYW1lX3NraXBfY29uZmlnIGZza2lwOwotCQkJQ0hFQ0tFRF9DT1BZX0ZST01fVVNFUigmZnNraXApOwotCi0JCXZmZV9mcmFtZV9za2lwX2NvbmZpZygmZnNraXApOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfSURfT1VUUFVUX0NMQU1QX0NPTkZJRzogewotCQlzdHJ1Y3QgdmZlX2NtZF9vdXRwdXRfY2xhbXBfY29uZmlnIGNsYW1wOwotCQkJQ0hFQ0tFRF9DT1BZX0ZST01fVVNFUigmY2xhbXApOwotCi0JCXZmZV9vdXRwdXRfY2xhbXBfY29uZmlnKCZjbGFtcCk7Ci0JfQotCQlicmVhazsKLQotCS8qIG1vZHVsZSB1cGRhdGUgY29tbWFuZHMgKi8KLQljYXNlIFZGRV9DTURfSURfQkxBQ0tfTEVWRUxfVVBEQVRFOiB7Ci0JCXN0cnVjdCB2ZmVfY21kX2JsYWNrX2xldmVsX2NvbmZpZyBibGs7Ci0JCQlDSEVDS0VEX0NPUFlfRlJPTV9VU0VSKCZibGspOwotCi0JCXZmZV9ibGFja19sZXZlbF91cGRhdGUoJmJsayk7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9JRF9ERU1VWF9DSEFOTkVMX0dBSU5fVVBEQVRFOiB7Ci0JCXN0cnVjdCB2ZmVfY21kX2RlbXV4X2NoYW5uZWxfZ2Fpbl9jb25maWcgZG11OwotCQkJQ0hFQ0tFRF9DT1BZX0ZST01fVVNFUigmZG11KTsKLQotCQl2ZmVfZGVtdXhfY2hhbm5lbF9nYWluX3VwZGF0ZSgmZG11KTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0lEX0RFTU9TQUlDX0JQQ19VUERBVEU6IHsKLQkJc3RydWN0IHZmZV9jbWRfZGVtb3NhaWNfYnBjX3VwZGF0ZSBkZW1vX2JwYzsKLQkJCUNIRUNLRURfQ09QWV9GUk9NX1VTRVIoJmRlbW9fYnBjKTsKLQotCQl2ZmVfZGVtb3NhaWNfYnBjX3VwZGF0ZSgmZGVtb19icGMpOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfSURfREVNT1NBSUNfQUJGX1VQREFURTogewotCQlzdHJ1Y3QgdmZlX2NtZF9kZW1vc2FpY19hYmZfdXBkYXRlIGRlbW9fYWJmOwotCQkJQ0hFQ0tFRF9DT1BZX0ZST01fVVNFUigmZGVtb19hYmYpOwotCi0JCXZmZV9kZW1vc2FpY19hYmZfdXBkYXRlKCZkZW1vX2FiZik7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9JRF9MQV9VUERBVEU6IHsKLQkJc3RydWN0IHZmZV9jbWRfbGFfY29uZmlnIGxhOwotCQkJQ0hFQ0tFRF9DT1BZX0ZST01fVVNFUigmbGEpOwotCi0JCXZmZV9sYV91cGRhdGUoJmxhKTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0lEX1JHQl9HQU1NQV9VUERBVEU6IHsKLQkJc3RydWN0IHZmZV9jbWRfcmdiX2dhbW1hX2NvbmZpZyByZ2I7Ci0JCQlDSEVDS0VEX0NPUFlfRlJPTV9VU0VSKCZyZ2IpOwotCi0JCXJjID0gdmZlX3JnYl9nYW1tYV91cGRhdGUoJnJnYik7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9JRF9BU0ZfVVBEQVRFOiB7Ci0JCXN0cnVjdCB2ZmVfY21kX2FzZl91cGRhdGUgYXNmOwotCQkJQ0hFQ0tFRF9DT1BZX0ZST01fVVNFUigmYXNmKTsKLQotCQl2ZmVfYXNmX3VwZGF0ZSgmYXNmKTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0lEX0ZSQU1FX1NLSVBfVVBEQVRFOiB7Ci0JCXN0cnVjdCB2ZmVfY21kX2ZyYW1lX3NraXBfdXBkYXRlIGZza2lwOwotCQkJQ0hFQ0tFRF9DT1BZX0ZST01fVVNFUigmZnNraXApOwotCQkJLyogU3RhcnQgcmVjb3JkaW5nICovCi0JCQlpZiAoZnNraXAub3V0cHV0MlBhdHRlcm4gPT0gMHhmZmZmZmZmZikKLQkJCQl1cGRhdGVfYXhpX3FvcyhNU01fQVhJX1FPU19SRUNPUkRJTkcpOwotCQkJIGVsc2UgaWYgKGZza2lwLm91dHB1dDJQYXR0ZXJuID09IDApCi0JCQkJdXBkYXRlX2F4aV9xb3MoTVNNX0FYSV9RT1NfUFJFVklFVyk7Ci0KLQkJdmZlX2ZyYW1lX3NraXBfdXBkYXRlKCZmc2tpcCk7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9JRF9DQU1JRl9GUkFNRV9VUERBVEU6IHsKLQkJc3RydWN0IHZmZV9jbWRzX2NhbWlmX2ZyYW1lIGZ1cDsKLQkJCUNIRUNLRURfQ09QWV9GUk9NX1VTRVIoJmZ1cCk7Ci0KLQkJdmZlX2NhbWlmX2ZyYW1lX3VwZGF0ZSgmZnVwKTsKLQl9Ci0JCWJyZWFrOwotCi0JLyogc3RhdHMgdXBkYXRlIGNvbW1hbmRzICovCi0JY2FzZSBWRkVfQ01EX0lEX1NUQVRTX0FVVE9GT0NVU19VUERBVEU6IHsKLQkJc3RydWN0IHZmZV9jbWRfc3RhdHNfYWZfdXBkYXRlIGFmdXA7Ci0JCQlDSEVDS0VEX0NPUFlfRlJPTV9VU0VSKCZhZnVwKTsKLQotCQl2ZmVfc3RhdHNfdXBkYXRlX2FmKCZhZnVwKTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0lEX1NUQVRTX1dCX0VYUF9VUERBVEU6IHsKLQkJc3RydWN0IHZmZV9jbWRfc3RhdHNfd2JfZXhwX3VwZGF0ZSB3YmV4cDsKLQkJCUNIRUNLRURfQ09QWV9GUk9NX1VTRVIoJndiZXhwKTsKLQotCQl2ZmVfc3RhdHNfdXBkYXRlX3diX2V4cCgmd2JleHApOwotCX0KLQkJYnJlYWs7Ci0KLQkvKiBjb250cm9sIG9mIHN0YXJ0LCBzdG9wLCB1cGRhdGUsIGV0Yy4uLiAqLwotCWNhc2UgVkZFX0NNRF9JRF9TVE9QOgotCQl2ZmVfc3RvcCgpOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9JRF9HRVRfSFdfVkVSU0lPTjoKLQkJYnJlYWs7Ci0KLQkvKiBzdGF0cyAqLwotCWNhc2UgVkZFX0NNRF9JRF9TVEFUU19TRVRUSU5HOiB7Ci0JCXN0cnVjdCB2ZmVfY21kX3N0YXRzX3NldHRpbmcgc3RhdHM7Ci0JCQlDSEVDS0VEX0NPUFlfRlJPTV9VU0VSKCZzdGF0cyk7Ci0KLQkJdmZlX3N0YXRzX3NldHRpbmcoJnN0YXRzKTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0lEX1NUQVRTX0FVVE9GT0NVU19TVEFSVDogewotCQlzdHJ1Y3QgdmZlX2NtZF9zdGF0c19hZl9zdGFydCBhZjsKLQkJCUNIRUNLRURfQ09QWV9GUk9NX1VTRVIoJmFmKTsKLQotCQl2ZmVfc3RhdHNfc3RhcnRfYWYoJmFmKTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0lEX1NUQVRTX0FVVE9GT0NVU19TVE9QOgotCQl2ZmVfc3RhdHNfYWZfc3RvcCgpOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0NNRF9JRF9TVEFUU19XQl9FWFBfU1RBUlQ6IHsKLQkJc3RydWN0IHZmZV9jbWRfc3RhdHNfd2JfZXhwX3N0YXJ0IGF3ZXhwOwotCQkJQ0hFQ0tFRF9DT1BZX0ZST01fVVNFUigmYXdleHApOwotCi0JCXZmZV9zdGF0c19zdGFydF93Yl9leHAoJmF3ZXhwKTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQ01EX0lEX1NUQVRTX1dCX0VYUF9TVE9QOgotCQl2ZmVfc3RhdHNfd2JfZXhwX3N0b3AoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfSURfQVNZTkNfVElNRVJfU0VUVElORzoKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9DTURfSURfVVBEQVRFOgotCQl2ZmVfdXBkYXRlKCk7Ci0JCWJyZWFrOwotCi0JLyogdGVzdCBnZW4gKi8KLQljYXNlIFZGRV9DTURfSURfVEVTVF9HRU5fU1RBUlQ6Ci0JCWJyZWFrOwotCi0vKgotICBhY2tub3dsZWRnZSBmcm9tIHVwcGVyIGxheWVyCi0JdGhlc2UgYXJlIG5vdCBpbiBnZW5lcmFsIGNvbW1hbmQuCi0KLQljYXNlIFZGRV9DTURfSURfT1VUUFVUMV9BQ0s6Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9JRF9PVVRQVVQyX0FDSzoKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX0lEX0VQT0NIMV9BQ0s6Ci0JCWJyZWFrOwotCWNhc2UgVkZFX0NNRF9JRF9FUE9DSDJfQUNLOgotCQlicmVhazsKLQljYXNlIFZGRV9DTURfSURfU1RBVFNfQVVUT0ZPQ1VTX0FDSzoKLQkJYnJlYWs7Ci0JY2FzZSBWRkVfQ01EX0lEX1NUQVRTX1dCX0VYUF9BQ0s6Ci0JCWJyZWFrOwotKi8KLQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGludmFsaWQgY21kIGlkICVkXG4iLCBfX2Z1bmNfXywgY21kLT5pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfSAvKiBzd2l0Y2ggKi8KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB2ZmVfY29uZmlnKHN0cnVjdCBtc21fdmZlX2NmZ19jbWQgKmNtZCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbXNtX3BtZW1fcmVnaW9uICpyZWdwdHI7Ci0Jc3RydWN0IG1zbV92ZmVfY29tbWFuZF84ayB2ZmVjbWQ7Ci0Jc3RydWN0IHZmZV9jbWRfYXhpX291dHB1dF9jb25maWcgYXhpbzsKLQlzdHJ1Y3QgYXhpZGF0YSAqYXhpZCA9IGRhdGE7Ci0KLQlpbnQgcmMgPSAwOwotCi0KLQlpZiAoY21kLT5jbWRfdHlwZSAhPSBDTURfRlJBTUVfQlVGX1JFTEVBU0UgJiYKLQkJY21kLT5jbWRfdHlwZSAhPSBDTURfU1RBVFNfQlVGX1JFTEVBU0UgJiYKLQkJY21kLT5jbWRfdHlwZSAhPSBDTURfU1RBVFNfQUZfQlVGX1JFTEVBU0UpIHsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnZmZWNtZCwKLQkJCSh2b2lkIF9fdXNlciAqKShjbWQtPnZhbHVlKSwgc2l6ZW9mKHZmZWNtZCkpKSB7Ci0JCQlwcl9lcnIoIiVzICVkOiBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfQotCi0JQ0RCRygiJXM6IGNtZFR5cGUgPSAlZFxuIiwgX19mdW5jX18sIGNtZC0+Y21kX3R5cGUpOwotCi0Jc3dpdGNoIChjbWQtPmNtZF90eXBlKSB7Ci0JY2FzZSBDTURfR0VORVJBTDoKLQkJcmMgPSB2ZmVfcHJvY19nZW5lcmFsKCZ2ZmVjbWQpOwotCQlicmVhazsKLQotCWNhc2UgQ01EX1NUQVRTX0VOQUJMRToKLQljYXNlIENNRF9TVEFUU19BWElfQ0ZHOiB7Ci0JCQlpbnQgaTsKLQkJCXN0cnVjdCB2ZmVfY21kX3N0YXRzX3NldHRpbmcgc2NmZzsKLQotCQkJQlVHX09OKCFheGlkKTsKLQotCQkJaWYgKHZmZWNtZC5sZW5ndGggIT0gc2l6ZW9mKHNjZmcpKSB7Ci0JCQkJcHJfZXJyCi0JCQkJKCJtc21fY2FtZXJhOiAlczogY21kICVkOiB1c2VyLXNwYWNlICJcCi0JCQkJImRhdGEgc2l6ZSAlZCAhPSBrZXJuZWwgZGF0YSBzaXplICVkXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCWNtZC0+Y21kX3R5cGUsIHZmZWNtZC5sZW5ndGgsCi0JCQkJc2l6ZW9mKHNjZmcpKTsKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCX0KLQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzY2ZnLAotCQkJCSh2b2lkIF9fdXNlciAqKSh2ZmVjbWQudmFsdWUpLAotCQkJCXNpemVvZihzY2ZnKSkpIHsKLQkJCQlwcl9lcnIoIiVzICVkOiBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJcmVncHRyID0gYXhpZC0+cmVnaW9uOwotCQlpZiAoYXhpZC0+YnVmbnVtMSA+IDApIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBheGlkLT5idWZudW0xOyBpKyspIHsKLQkJCQkJc2NmZy5hd2JCdWZmZXJbaV0gPQotCQkJCQkodWludDMyX3QpKHJlZ3B0ci0+cGFkZHIpOwotCQkJCXJlZ3B0cisrOwotCQkJfQotCQl9Ci0KLQkJaWYgKGF4aWQtPmJ1Zm51bTIgPiAwKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgYXhpZC0+YnVmbnVtMjsgaSsrKSB7Ci0JCQkJCXNjZmcuYWZCdWZmZXJbaV0gPQotCQkJCQkodWludDMyX3QpKHJlZ3B0ci0+cGFkZHIpOwotCQkJCXJlZ3B0cisrOwotCQkJfQotCQl9Ci0KLQkJCXZmZV9zdGF0c19zZXR0aW5nKCZzY2ZnKTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBDTURfU1RBVFNfQUZfQVhJX0NGRzoKLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9GUkFNRV9CVUZfUkVMRUFTRTogewotCQkvKiBwcmV2aWV3IGJ1ZmZlciByZWxlYXNlICovCi0JCXN0cnVjdCBtc21fZnJhbWUgKmI7Ci0JCXVuc2lnbmVkIGxvbmcgcDsKLQkJc3RydWN0IHZmZV9jbWRfb3V0cHV0X2FjayBmYWNrOwotCi0JCQlCVUdfT04oIWRhdGEpOwotCi0JCWIgPSAoc3RydWN0IG1zbV9mcmFtZSAqKShjbWQtPnZhbHVlKTsKLQkJcCA9ICoodW5zaWduZWQgbG9uZyAqKWRhdGE7Ci0KLQkJCWZhY2sueWJ1ZmFkZHJbMF0gPSAodWludDMyX3QpIChwICsgYi0+cGxhbmFyMF9vZmYpOwotCi0JCQlmYWNrLmNocm9tYWJ1ZmFkZHJbMF0gPSAodWludDMyX3QpIChwICsgYi0+cGxhbmFyMV9vZmYpOwotCi0JCWlmIChiLT5wYXRoID09IE9VVFBVVF9UWVBFX1ApCi0JCQl2ZmVfb3V0cHV0X3BfYWNrKCZmYWNrKTsKLQotCQlpZiAoKGItPnBhdGggPT0gT1VUUFVUX1RZUEVfVikKLQkJCSB8fCAoYi0+cGF0aCA9PSBPVVRQVVRfVFlQRV9TKSkKLQkJCXZmZV9vdXRwdXRfdl9hY2soJmZhY2spOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9TTkFQX0JVRl9SRUxFQVNFOgotCQlicmVhazsKLQotCWNhc2UgQ01EX1NUQVRTX0JVRl9SRUxFQVNFOiB7Ci0JCXN0cnVjdCB2ZmVfY21kX3N0YXRzX3diX2V4cF9hY2sgc2FjazsKLQotCQkJQlVHX09OKCFkYXRhKTsKLQotCQlzYWNrLm5leHRXYkV4cE91dHB1dEJ1ZmZlckFkZHIgPSAqKHVpbnQzMl90ICopZGF0YTsKLQkJdmZlX3N0YXRzX3diX2V4cF9hY2soJnNhY2spOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9TVEFUU19BRl9CVUZfUkVMRUFTRTogewotCQlzdHJ1Y3QgdmZlX2NtZF9zdGF0c19hZl9hY2sgYWNrOwotCi0JCQlCVUdfT04oIWRhdGEpOwotCi0JCWFjay5uZXh0QUZPdXRwdXRCdWZmZXJBZGRyID0gKih1aW50MzJfdCAqKWRhdGE7Ci0JCXZmZV9zdGF0c19hZl9hY2soJmFjayk7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgQ01EX0FYSV9DRkdfUFJFVklFVzoKLQljYXNlIENNRF9SQVdfUElDVF9BWElfQ0ZHOiB7Ci0KLQkJCUJVR19PTighYXhpZCk7Ci0KLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmYXhpbywgKHZvaWQgX191c2VyICopKHZmZWNtZC52YWx1ZSksCi0JCQkJc2l6ZW9mKGF4aW8pKSkgewotCQkJCXByX2VycigiJXMgJWQ6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwKLQkJCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCQkvKiBWYWxpZGF0ZSB0aGUgZGF0YSBmcm9tIHVzZXIgc3BhY2UgKi8KLQkJCWlmIChheGlvLm91dHB1dDIuZnJhZ21lbnRDb3VudCA8Ci0JCQkJVkZFX01JTl9OVU1fRlJBR01FTlRTX1BFUl9GUkFNRSB8fAotCQkJCWF4aW8ub3V0cHV0Mi5mcmFnbWVudENvdW50ID4KLQkJCQlWRkVfTUFYX05VTV9GUkFHTUVOVFNfUEVSX0ZSQU1FKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQl2ZmVfY29uZmlnX2F4aShPVVRQVVRfMiwgYXhpZCwgJmF4aW8pOwotCQkJYXhpby5vdXRwdXREYXRhU2l6ZSA9IDA7Ci0JCQl2ZmVfYXhpX291dHB1dF9jb25maWcoJmF4aW8pOwotCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENNRF9BWElfQ0ZHX1NOQVA6IHsKLQotCQkJQlVHX09OKCFheGlkKTsKLQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZheGlvLCAodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQlzaXplb2YoYXhpbykpKSB7Ci0JCQkJcHJfZXJyKCIlcyAlZDogY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLAotCQkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJCS8qIFZhbGlkYXRlIHRoZSBkYXRhIGZyb20gdXNlciBzcGFjZSAqLwotCQkJaWYgKGF4aW8ub3V0cHV0MS5mcmFnbWVudENvdW50IDwKLQkJCQlWRkVfTUlOX05VTV9GUkFHTUVOVFNfUEVSX0ZSQU1FIHx8Ci0JCQkJYXhpby5vdXRwdXQxLmZyYWdtZW50Q291bnQgPgotCQkJCVZGRV9NQVhfTlVNX0ZSQUdNRU5UU19QRVJfRlJBTUUgfHwKLQkJCQlheGlvLm91dHB1dDIuZnJhZ21lbnRDb3VudCA8Ci0JCQkJVkZFX01JTl9OVU1fRlJBR01FTlRTX1BFUl9GUkFNRSB8fAotCQkJCWF4aW8ub3V0cHV0Mi5mcmFnbWVudENvdW50ID4KLQkJCQlWRkVfTUFYX05VTV9GUkFHTUVOVFNfUEVSX0ZSQU1FKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQl2ZmVfY29uZmlnX2F4aShPVVRQVVRfMV9BTkRfMiwgYXhpZCwgJmF4aW8pOwotCQkJdmZlX2F4aV9vdXRwdXRfY29uZmlnKCZheGlvKTsKLQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBDTURfQVhJX0NGR19WSURFTzogewotCQkJQlVHX09OKCFheGlkKTsKLQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZheGlvLCAodm9pZCBfX3VzZXIgKikodmZlY21kLnZhbHVlKSwKLQkJCQlzaXplb2YoYXhpbykpKSB7Ci0JCQkJcHJfZXJyKCIlcyAlZDogY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLAotCQkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJCS8qIFZhbGlkYXRlIHRoZSBkYXRhIGZyb20gdXNlciBzcGFjZSAqLwotCQkJaWYgKGF4aW8ub3V0cHV0MS5mcmFnbWVudENvdW50IDwKLQkJCQlWRkVfTUlOX05VTV9GUkFHTUVOVFNfUEVSX0ZSQU1FIHx8Ci0JCQkJYXhpby5vdXRwdXQxLmZyYWdtZW50Q291bnQgPgotCQkJCVZGRV9NQVhfTlVNX0ZSQUdNRU5UU19QRVJfRlJBTUUgfHwKLQkJCQlheGlvLm91dHB1dDIuZnJhZ21lbnRDb3VudCA8Ci0JCQkJVkZFX01JTl9OVU1fRlJBR01FTlRTX1BFUl9GUkFNRSB8fAotCQkJCWF4aW8ub3V0cHV0Mi5mcmFnbWVudENvdW50ID4KLQkJCQlWRkVfTUFYX05VTV9GUkFHTUVOVFNfUEVSX0ZSQU1FKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQl2ZmVfY29uZmlnX2F4aShPVVRQVVRfMV9BTkRfMywgYXhpZCwgJmF4aW8pOwotCQkJYXhpby5vdXRwdXREYXRhU2l6ZSA9IDA7Ci0JCQl2ZmVfYXhpX291dHB1dF9jb25maWcoJmF4aW8pOwotCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9IC8qIHN3aXRjaCAqLwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHZmZV9pbml0KHN0cnVjdCBtc21fdmZlX2NhbGxiYWNrICpwcmVzcCwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCWludCByYyA9IDA7Ci0KLQlyYyA9IHZmZV9jbWRfaW5pdChwcmVzcCwgZGV2LCB2ZmVfc3luY2RhdGEpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCS8qIEJyaW5nIHVwIGFsbCB0aGUgcmVxdWlyZWQgR1BJT3MgYW5kIENsb2NrcyAqLwotCXJjID0gbXNtX2NhbWlvX2VuYWJsZShkZXYpOwotCi0JcmV0dXJuIHJjOwotfQotCi12b2lkIG1zbV9jYW12ZmVfZm5faW5pdChzdHJ1Y3QgbXNtX2NhbXZmZV9mbiAqZnB0ciwgdm9pZCAqZGF0YSkKLXsKLQlmcHRyLT52ZmVfaW5pdCAgICA9IHZmZV9pbml0OwotCWZwdHItPnZmZV9lbmFibGUgID0gdmZlX2VuYWJsZTsKLQlmcHRyLT52ZmVfY29uZmlnICA9IHZmZV9jb25maWc7Ci0JZnB0ci0+dmZlX2Rpc2FibGUgPSB2ZmVfZGlzYWJsZTsKLQlmcHRyLT52ZmVfcmVsZWFzZSA9IHZmZV9yZWxlYXNlOwotCXZmZV9zeW5jZGF0YSA9IGRhdGE7Ci19Ci0KLXZvaWQgbXNtX2NhbXZwZV9mbl9pbml0KHN0cnVjdCBtc21fY2FtdnBlX2ZuICpmcHRyLCB2b2lkICpkYXRhKQotewotCWZwdHItPnZwZV9yZWcJCT0gTlVMTDsKLQlmcHRyLT5zZW5kX2ZyYW1lX3RvX3ZwZQk9IE5VTEw7Ci0JZnB0ci0+dnBlX2NvbmZpZwk9IE5VTEw7Ci0JZnB0ci0+dnBlX2NmZ191cGRhdGUJPSBOVUxMOwotCWZwdHItPmRpcwkJPSBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlOHguaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTh4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZTljOTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlOHguaAorKysgL2Rldi9udWxsCkBAIC0xLDkwOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX19NU01fVkZFOFhfSF9fCi0jZGVmaW5lIF9fTVNNX1ZGRThYX0hfXwotCi0jZGVmaW5lIFRSVUUgIDEKLSNkZWZpbmUgRkFMU0UgMAotI2RlZmluZSBib29sZWFuIHVpbnQ4X3QKLQotZW51bSAgVkZFX1NUQVRFIHsKLQlWRkVfU1RBVEVfSURMRSwKLQlWRkVfU1RBVEVfQUNUSVZFCi19OwotCi1lbnVtIHZmZV9jbWRfaWQgewotCS8qCi0JKkltcG9ydGFudCEgQ29tbWFuZF9JRCBhcmUgYXJyYW5nZWQgaW4gb3JkZXIuCi0JKkRvbid0IGNoYW5nZSEqLwotCVZGRV9DTURfSURfU1RBUlQsCi0JVkZFX0NNRF9JRF9SRVNFVCwKLQotCS8qIGJ1cyBhbmQgY2FtaWYgY29uZmlnICovCi0JVkZFX0NNRF9JRF9BWElfSU5QVVRfQ09ORklHLAotCVZGRV9DTURfSURfQ0FNSUZfQ09ORklHLAotCVZGRV9DTURfSURfQVhJX09VVFBVVF9DT05GSUcsCi0KLQkvKiBtb2R1bGUgY29uZmlnICAqLwotCVZGRV9DTURfSURfQkxBQ0tfTEVWRUxfQ09ORklHLAotCVZGRV9DTURfSURfUk9MTF9PRkZfQ09ORklHLAotCVZGRV9DTURfSURfREVNVVhfQ0hBTk5FTF9HQUlOX0NPTkZJRywKLQlWRkVfQ01EX0lEX0RFTU9TQUlDX0NPTkZJRywKLQlWRkVfQ01EX0lEX0ZPVl9DUk9QX0NPTkZJRywKLQlWRkVfQ01EX0lEX01BSU5fU0NBTEVSX0NPTkZJRywKLQlWRkVfQ01EX0lEX1dISVRFX0JBTEFOQ0VfQ09ORklHLAotCVZGRV9DTURfSURfQ09MT1JfQ09SUkVDVElPTl9DT05GSUcsCi0JVkZFX0NNRF9JRF9MQV9DT05GSUcsCi0JVkZFX0NNRF9JRF9SR0JfR0FNTUFfQ09ORklHLAotCVZGRV9DTURfSURfQ0hST01BX0VOSEFOX0NPTkZJRywKLQlWRkVfQ01EX0lEX0NIUk9NQV9TVVBQUkVTU0lPTl9DT05GSUcsCi0JVkZFX0NNRF9JRF9BU0ZfQ09ORklHLAotCVZGRV9DTURfSURfU0NBTEVSMllfQ09ORklHLAotCVZGRV9DTURfSURfU0NBTEVSMkNiQ3JfQ09ORklHLAotCVZGRV9DTURfSURfQ0hST01BX1NVQlNBTVBMRV9DT05GSUcsCi0JVkZFX0NNRF9JRF9GUkFNRV9TS0lQX0NPTkZJRywKLQlWRkVfQ01EX0lEX09VVFBVVF9DTEFNUF9DT05GSUcsCi0KLQkvKiB0ZXN0IGdlbiAqLwotCVZGRV9DTURfSURfVEVTVF9HRU5fU1RBUlQsCi0KLQlWRkVfQ01EX0lEX1VQREFURSwKLQotCS8qIGFja293bmxlZGdlIGZyb20gdXBwZXIgbGF5ZXIgKi8KLQlWRkVfQ01EX0lEX09VVFBVVDFfQUNLLAotCVZGRV9DTURfSURfT1VUUFVUMl9BQ0ssCi0JVkZFX0NNRF9JRF9FUE9DSDFfQUNLLAotCVZGRV9DTURfSURfRVBPQ0gyX0FDSywKLQlWRkVfQ01EX0lEX1NUQVRTX0FVVE9GT0NVU19BQ0ssCi0JVkZFX0NNRF9JRF9TVEFUU19XQl9FWFBfQUNLLAotCi0JLyogbW9kdWxlIHVwZGF0ZSBjb21tYW5kcyAqLwotCVZGRV9DTURfSURfQkxBQ0tfTEVWRUxfVVBEQVRFLAotCVZGRV9DTURfSURfREVNVVhfQ0hBTk5FTF9HQUlOX1VQREFURSwKLQlWRkVfQ01EX0lEX0RFTU9TQUlDX0JQQ19VUERBVEUsCi0JVkZFX0NNRF9JRF9ERU1PU0FJQ19BQkZfVVBEQVRFLAotCVZGRV9DTURfSURfRk9WX0NST1BfVVBEQVRFLAotCVZGRV9DTURfSURfV0hJVEVfQkFMQU5DRV9VUERBVEUsCi0JVkZFX0NNRF9JRF9DT0xPUl9DT1JSRUNUSU9OX1VQREFURSwKLQlWRkVfQ01EX0lEX0xBX1VQREFURSwKLQlWRkVfQ01EX0lEX1JHQl9HQU1NQV9VUERBVEUsCi0JVkZFX0NNRF9JRF9DSFJPTUFfRU5IQU5fVVBEQVRFLAotCVZGRV9DTURfSURfQ0hST01BX1NVUFBSRVNTSU9OX1VQREFURSwKLQlWRkVfQ01EX0lEX01BSU5fU0NBTEVSX1VQREFURSwKLQlWRkVfQ01EX0lEX1NDQUxFUjJDYkNyX1VQREFURSwKLQlWRkVfQ01EX0lEX1NDQUxFUjJZX1VQREFURSwKLQlWRkVfQ01EX0lEX0FTRl9VUERBVEUsCi0JVkZFX0NNRF9JRF9GUkFNRV9TS0lQX1VQREFURSwKLQlWRkVfQ01EX0lEX0NBTUlGX0ZSQU1FX1VQREFURSwKLQotCS8qIHN0YXRzIHVwZGF0ZSBjb21tYW5kcyAqLwotCVZGRV9DTURfSURfU1RBVFNfQVVUT0ZPQ1VTX1VQREFURSwKLQlWRkVfQ01EX0lEX1NUQVRTX1dCX0VYUF9VUERBVEUsCi0KLQkvKiBjb250cm9sIG9mIHN0YXJ0LCBzdG9wLCB1cGRhdGUsIGV0Yy4uLiAqLwotICBWRkVfQ01EX0lEX1NUT1AsCi0JVkZFX0NNRF9JRF9HRVRfSFdfVkVSU0lPTiwKLQotCS8qIHN0YXRzICovCi0JVkZFX0NNRF9JRF9TVEFUU19TRVRUSU5HLAotCVZGRV9DTURfSURfU1RBVFNfQVVUT0ZPQ1VTX1NUQVJULAotCVZGRV9DTURfSURfU1RBVFNfQVVUT0ZPQ1VTX1NUT1AsCi0JVkZFX0NNRF9JRF9TVEFUU19XQl9FWFBfU1RBUlQsCi0JVkZFX0NNRF9JRF9TVEFUU19XQl9FWFBfU1RPUCwKLQotCVZGRV9DTURfSURfQVNZTkNfVElNRVJfU0VUVElORywKLQotCS8qIG1heCBpZCAgKi8KLQlWRkVfQ01EX0lEX01BWAotfTsKLQotc3RydWN0IHZmZV9jbWRfaHdfdmVyc2lvbiB7Ci0JdWludDMyX3QgbWlub3JWZXJzaW9uOwotCXVpbnQzMl90IG1ham9yVmVyc2lvbjsKLQl1aW50MzJfdCBjb3JlVmVyc2lvbjsKLX07Ci0KLWVudW0gVkZFX0NBTUlGX1NZTkNfRURHRSB7Ci0JVkZFX0NBTUlGX1NZTkNfRURHRV9BY3RpdmVIaWdoLAotCVZGRV9DQU1JRl9TWU5DX0VER0VfQWN0aXZlTG93Ci19OwotCi1lbnVtIFZGRV9DQU1JRl9TWU5DX01PREUgewotCVZGRV9DQU1JRl9TWU5DX01PREVfQVBTLAotCVZGRV9DQU1JRl9TWU5DX01PREVfRUZTLAotCVZGRV9DQU1JRl9TWU5DX01PREVfRUxTLAotCVZGRV9DQU1JRl9TWU5DX01PREVfSUxMRUdBTAotfTsKLQotc3RydWN0IHZmZV9jbWRzX2NhbWlmX2VmcyB7Ci0JdWludDhfdCBlZnNlbmRvZmxpbmU7Ci0JdWludDhfdCBlZnNzdGFydG9mbGluZTsKLQl1aW50OF90IGVmc2VuZG9mZnJhbWU7Ci0JdWludDhfdCBlZnNzdGFydG9mZnJhbWU7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZHNfY2FtaWZfZnJhbWUgewotCXVpbnQxNl90IHBpeGVsc1BlckxpbmU7Ci0JdWludDE2X3QgbGluZXNQZXJGcmFtZTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kc19jYW1pZl93aW5kb3cgewotCXVpbnQxNl90IGZpcnN0cGl4ZWw7Ci0JdWludDE2X3QgbGFzdHBpeGVsOwotCXVpbnQxNl90IGZpcnN0bGluZTsKLQl1aW50MTZfdCBsYXN0bGluZTsKLX07Ci0KLWVudW0gQ0FNSUZfU1VCU0FNUExFX0ZSQU1FX1NLSVAgewotCUNBTUlGX1NVQlNBTVBMRV9GUkFNRV9TS0lQXzAsCi0JQ0FNSUZfU1VCU0FNUExFX0ZSQU1FX1NLSVBfQWxsRnJhbWVzLAotCUNBTUlGX1NVQlNBTVBMRV9GUkFNRV9TS0lQX09ORV9PVVRfT0ZfRVZFUllfMkZyYW1lLAotCUNBTUlGX1NVQlNBTVBMRV9GUkFNRV9TS0lQX09ORV9PVVRfT0ZfRVZFUllfM0ZyYW1lLAotCUNBTUlGX1NVQlNBTVBMRV9GUkFNRV9TS0lQX09ORV9PVVRfT0ZfRVZFUllfNEZyYW1lLAotCUNBTUlGX1NVQlNBTVBMRV9GUkFNRV9TS0lQX09ORV9PVVRfT0ZfRVZFUllfNUZyYW1lLAotCUNBTUlGX1NVQlNBTVBMRV9GUkFNRV9TS0lQX09ORV9PVVRfT0ZfRVZFUllfNkZyYW1lLAotCUNBTUlGX1NVQlNBTVBMRV9GUkFNRV9TS0lQX09ORV9PVVRfT0ZfRVZFUllfN0ZyYW1lLAotCUNBTUlGX1NVQlNBTVBMRV9GUkFNRV9TS0lQX09ORV9PVVRfT0ZfRVZFUllfOEZyYW1lLAotCUNBTUlGX1NVQlNBTVBMRV9GUkFNRV9TS0lQX09ORV9PVVRfT0ZfRVZFUllfOUZyYW1lLAotCUNBTUlGX1NVQlNBTVBMRV9GUkFNRV9TS0lQX09ORV9PVVRfT0ZfRVZFUllfMTBGcmFtZSwKLQlDQU1JRl9TVUJTQU1QTEVfRlJBTUVfU0tJUF9PTkVfT1VUX09GX0VWRVJZXzExRnJhbWUsCi0JQ0FNSUZfU1VCU0FNUExFX0ZSQU1FX1NLSVBfT05FX09VVF9PRl9FVkVSWV8xMkZyYW1lLAotCUNBTUlGX1NVQlNBTVBMRV9GUkFNRV9TS0lQX09ORV9PVVRfT0ZfRVZFUllfMTNGcmFtZSwKLQlDQU1JRl9TVUJTQU1QTEVfRlJBTUVfU0tJUF9PTkVfT1VUX09GX0VWRVJZXzE0RnJhbWUsCi0JQ0FNSUZfU1VCU0FNUExFX0ZSQU1FX1NLSVBfT05FX09VVF9PRl9FVkVSWV8xNUZyYW1lCi19OwotCi1zdHJ1Y3QgdmZlX2NtZHNfY2FtaWZfc3Vic2FtcGxlIHsKLQl1aW50MTZfdCBwaXhlbHNraXBtYXNrOwotCXVpbnQxNl90IGxpbmVza2lwbWFzazsKLQllbnVtIENBTUlGX1NVQlNBTVBMRV9GUkFNRV9TS0lQIGZyYW1lc2tpcDsKLQl1aW50OF90IGZyYW1lc2tpcG1vZGU7Ci0JdWludDhfdCBwaXhlbHNraXB3cmFwOwotfTsKLQotc3RydWN0IHZmZV9jbWRzX2NhbWlmX2Vwb2NoIHsKLQl1aW50OF90ICBlbmFibGU7Ci0JdWludDE2X3QgbGluZWluZGV4OwotfTsKLQotc3RydWN0IHZmZV9jbWRzX2NhbWlmX2NmZyB7Ci0JZW51bSBWRkVfQ0FNSUZfU1lOQ19FREdFICB2U3luY0VkZ2U7Ci0JZW51bSBWRkVfQ0FNSUZfU1lOQ19FREdFICBoU3luY0VkZ2U7Ci0JZW51bSBWRkVfQ0FNSUZfU1lOQ19NT0RFICBzeW5jTW9kZTsKLQl1aW50OF90IHZmZVN1YlNhbXBsZUVuYWJsZTsKLQl1aW50OF90IGJ1c1N1YlNhbXBsZUVuYWJsZTsKLQl1aW50OF90IGlycVN1YlNhbXBsZUVuYWJsZTsKLQl1aW50OF90IGJpbm5pbmdFbmFibGU7Ci0JdWludDhfdCBtaXNyRW5hYmxlOwotfTsKLQotc3RydWN0IHZmZV9jbWRfY2FtaWZfY29uZmlnIHsKLQlzdHJ1Y3QgdmZlX2NtZHNfY2FtaWZfY2ZnIGNhbWlmQ29uZmlnOwotCXN0cnVjdCB2ZmVfY21kc19jYW1pZl9lZnMgRUZTOwotCXN0cnVjdCB2ZmVfY21kc19jYW1pZl9mcmFtZSAgICAgZnJhbWU7Ci0Jc3RydWN0IHZmZV9jbWRzX2NhbWlmX3dpbmRvdyAgICB3aW5kb3c7Ci0Jc3RydWN0IHZmZV9jbWRzX2NhbWlmX3N1YnNhbXBsZSBzdWJzYW1wbGU7Ci0Jc3RydWN0IHZmZV9jbWRzX2NhbWlmX2Vwb2NoICAgICBlcG9jaDE7Ci0Jc3RydWN0IHZmZV9jbWRzX2NhbWlmX2Vwb2NoICAgICBlcG9jaDI7Ci19OwotCi1lbnVtIFZGRV9BWElfT1VUUFVUX01PREUgewotCVZGRV9BWElfT1VUUFVUX01PREVfT3V0cHV0MSwKLQlWRkVfQVhJX09VVFBVVF9NT0RFX091dHB1dDIsCi0JVkZFX0FYSV9PVVRQVVRfTU9ERV9PdXRwdXQxQW5kT3V0cHV0MiwKLQlWRkVfQVhJX09VVFBVVF9NT0RFX0NBTUlGVG9BWElWaWFPdXRwdXQyLAotCVZGRV9BWElfT1VUUFVUX01PREVfT3V0cHV0MkFuZENBTUlGVG9BWElWaWFPdXRwdXQxLAotCVZGRV9BWElfT1VUUFVUX01PREVfT3V0cHV0MUFuZENBTUlGVG9BWElWaWFPdXRwdXQyLAotCVZGRV9BWElfTEFTVF9PVVRQVVRfTU9ERV9FTlVNCi19OwotCi1lbnVtIFZGRV9SQVdfV1JfUEFUSF9TRUwgewotCVZGRV9SQVdfT1VUUFVUX0RJU0FCTEVELAotCVZGRV9SQVdfT1VUUFVUX0VOQ19DQkNSX1BBVEgsCi0JVkZFX1JBV19PVVRQVVRfVklFV19DQkNSX1BBVEgsCi0JVkZFX1JBV19PVVRQVVRfUEFUSF9JTlZBTElECi19OwotCi1lbnVtIFZGRV9SQVdfUElYRUxfREFUQV9TSVpFIHsKLQlWRkVfUkFXX1BJWEVMX0RBVEFfU0laRV84QklULAotCVZGRV9SQVdfUElYRUxfREFUQV9TSVpFXzEwQklULAotCVZGRV9SQVdfUElYRUxfREFUQV9TSVpFXzEyQklULAotfTsKLQotI2RlZmluZSBWRkVfQVhJX09VVFBVVF9CVVJTVF9MRU5HVEggICAgIDQKLSNkZWZpbmUgVkZFX01BWF9OVU1fRlJBR01FTlRTX1BFUl9GUkFNRSA0Ci0jZGVmaW5lIFZGRV9NSU5fTlVNX0ZSQUdNRU5UU19QRVJfRlJBTUUgMQotI2RlZmluZSBWRkVfQVhJX09VVFBVVF9DRkdfRlJBTUVfQ09VTlQgIDMKLQotc3RydWN0IHZmZV9jbWRzX2F4aV9vdXRfcGVyX2NvbXBvbmVudCB7Ci0JdWludDE2X3QgaW1hZ2VXaWR0aDsKLQl1aW50MTZfdCBpbWFnZUhlaWdodDsKLQl1aW50MTZfdCBvdXRSb3dDb3VudDsKLQl1aW50MTZfdCBvdXRSb3dJbmNyZW1lbnQ7Ci0JdWludDMyX3Qgb3V0RnJhZ21lbnRzW1ZGRV9BWElfT1VUUFVUX0NGR19GUkFNRV9DT1VOVF0KLQkJW1ZGRV9NQVhfTlVNX0ZSQUdNRU5UU19QRVJfRlJBTUVdOwotfTsKLQotc3RydWN0IHZmZV9jbWRzX2F4aV9wZXJfb3V0cHV0X3BhdGggewotCXVpbnQ4X3QgZnJhZ21lbnRDb3VudDsKLQlzdHJ1Y3QgdmZlX2NtZHNfYXhpX291dF9wZXJfY29tcG9uZW50IG91dHB1dFk7Ci0Jc3RydWN0IHZmZV9jbWRzX2F4aV9vdXRfcGVyX2NvbXBvbmVudCBvdXRwdXRDYmNyOwotfTsKLQotZW51bSBWRkVfQVhJX0JVUlNUX0xFTkdUSCB7Ci0JVkZFX0FYSV9CVVJTVF9MRU5HVEhfSVNfMiAgPSAyLAotCVZGRV9BWElfQlVSU1RfTEVOR1RIX0lTXzQgID0gNCwKLQlWRkVfQVhJX0JVUlNUX0xFTkdUSF9JU184ICA9IDgsCi0JVkZFX0FYSV9CVVJTVF9MRU5HVEhfSVNfMTYgPSAxNgotfTsKLQotc3RydWN0IHZmZV9jbWRfYXhpX291dHB1dF9jb25maWcgewotCWVudW0gVkZFX0FYSV9CVVJTVF9MRU5HVEggYnVyc3RMZW5ndGg7Ci0JZW51bSBWRkVfQVhJX09VVFBVVF9NT0RFIG91dHB1dE1vZGU7Ci0JZW51bSBWRkVfUkFXX1BJWEVMX0RBVEFfU0laRSBvdXRwdXREYXRhU2l6ZTsKLQlzdHJ1Y3QgdmZlX2NtZHNfYXhpX3Blcl9vdXRwdXRfcGF0aCBvdXRwdXQxOwotCXN0cnVjdCB2ZmVfY21kc19heGlfcGVyX291dHB1dF9wYXRoIG91dHB1dDI7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9mb3ZfY3JvcF9jb25maWcgewotCXVpbnQ4X3QgZW5hYmxlOwotCXVpbnQxNl90IGZpcnN0UGl4ZWw7Ci0JdWludDE2X3QgbGFzdFBpeGVsOwotCXVpbnQxNl90IGZpcnN0TGluZTsKLQl1aW50MTZfdCBsYXN0TGluZTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kc19tYWluX3NjYWxlcl9zdHJpcGVfaW5pdCB7Ci0JdWludDE2X3QgTU5Db3VudGVySW5pdDsKLQl1aW50MTZfdCBwaGFzZUluaXQ7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZHNfc2NhbGVyX29uZV9kaW1lbnNpb24gewotCXVpbnQ4X3QgIGVuYWJsZTsKLQl1aW50MTZfdCBpbnB1dFNpemU7Ci0JdWludDE2X3Qgb3V0cHV0U2l6ZTsKLQl1aW50MzJfdCBwaGFzZU11bHRpcGxpY2F0aW9uRmFjdG9yOwotCXVpbnQ4X3QgIGludGVycG9sYXRpb25SZXNvbHV0aW9uOwotfTsKLQotc3RydWN0IHZmZV9jbWRfbWFpbl9zY2FsZXJfY29uZmlnIHsKLQl1aW50OF90IGVuYWJsZTsKLQlzdHJ1Y3QgdmZlX2NtZHNfc2NhbGVyX29uZV9kaW1lbnNpb24gICAgaGNvbmZpZzsKLQlzdHJ1Y3QgdmZlX2NtZHNfc2NhbGVyX29uZV9kaW1lbnNpb24gICAgdmNvbmZpZzsKLQlzdHJ1Y3QgdmZlX2NtZHNfbWFpbl9zY2FsZXJfc3RyaXBlX2luaXQgTU5Jbml0SDsKLQlzdHJ1Y3QgdmZlX2NtZHNfbWFpbl9zY2FsZXJfc3RyaXBlX2luaXQgTU5Jbml0VjsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX3NjYWxlcjJfY29uZmlnIHsKLQl1aW50OF90IGVuYWJsZTsKLQlzdHJ1Y3QgdmZlX2NtZHNfc2NhbGVyX29uZV9kaW1lbnNpb24gaGNvbmZpZzsKLQlzdHJ1Y3QgdmZlX2NtZHNfc2NhbGVyX29uZV9kaW1lbnNpb24gdmNvbmZpZzsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX2ZyYW1lX3NraXBfY29uZmlnIHsKLQl1aW50OF90IG91dHB1dDFQZXJpb2Q7Ci0JdWludDMyX3Qgb3V0cHV0MVBhdHRlcm47Ci0JdWludDhfdCBvdXRwdXQyUGVyaW9kOwotCXVpbnQzMl90IG91dHB1dDJQYXR0ZXJuOwotfTsKLQotc3RydWN0IHZmZV9jbWRfZnJhbWVfc2tpcF91cGRhdGUgewotCXVpbnQzMl90IG91dHB1dDFQYXR0ZXJuOwotCXVpbnQzMl90IG91dHB1dDJQYXR0ZXJuOwotfTsKLQotc3RydWN0IHZmZV9jbWRfb3V0cHV0X2NsYW1wX2NvbmZpZyB7Ci0JdWludDhfdCBtaW5DaDA7Ci0JdWludDhfdCBtaW5DaDE7Ci0JdWludDhfdCBtaW5DaDI7Ci0JdWludDhfdCBtYXhDaDA7Ci0JdWludDhfdCBtYXhDaDE7Ci0JdWludDhfdCBtYXhDaDI7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9jaHJvbWFfc3Vic2FtcGxlX2NvbmZpZyB7Ci0JdWludDhfdCBlbmFibGU7Ci0JdWludDhfdCBjcm9wRW5hYmxlOwotCXVpbnQ4X3QgdnN1YlNhbXBsZUVuYWJsZTsKLQl1aW50OF90IGhzdWJTYW1wbGVFbmFibGU7Ci0JdWludDhfdCB2Q29zaXRlZDsKLQl1aW50OF90IGhDb3NpdGVkOwotCXVpbnQ4X3QgdkNvc2l0ZWRQaGFzZTsKLQl1aW50OF90IGhDb3NpdGVkUGhhc2U7Ci0JdWludDE2X3QgY3JvcFdpZHRoRmlyc3RQaXhlbDsKLQl1aW50MTZfdCBjcm9wV2lkdGhMYXN0UGl4ZWw7Ci0JdWludDE2X3QgY3JvcEhlaWdodEZpcnN0TGluZTsKLQl1aW50MTZfdCBjcm9wSGVpZ2h0TGFzdExpbmU7Ci19OwotCi1lbnVtIFZGRV9TVEFSVF9JTlBVVF9TT1VSQ0UgewotCVZGRV9TVEFSVF9JTlBVVF9TT1VSQ0VfQ0FNSUYsCi0JVkZFX1NUQVJUX0lOUFVUX1NPVVJDRV9URVNUR0VOLAotCVZGRV9TVEFSVF9JTlBVVF9TT1VSQ0VfQVhJLAotCVZGRV9TVEFSVF9JTlBVVF9TT1VSQ0VfSU5WQUxJRAotfTsKLQotZW51bSBWRkVfU1RBUlRfT1BFUkFUSU9OX01PREUgewotCVZGRV9TVEFSVF9PUEVSQVRJT05fTU9ERV9DT05USU5VT1VTLAotCVZGRV9TVEFSVF9PUEVSQVRJT05fTU9ERV9TTkFQU0hPVAotfTsKLQotZW51bSBWRkVfU1RBUlRfUElYRUxfUEFUVEVSTiB7Ci0JVkZFX0JBWUVSX1JHUkdSRywKLQlWRkVfQkFZRVJfR1JHUkdSLAotCVZGRV9CQVlFUl9CR0JHQkcsCi0JVkZFX0JBWUVSX0dCR0JHQiwKLQlWRkVfWVVWX1lDYllDciwKLQlWRkVfWVVWX1lDcllDYiwKLQlWRkVfWVVWX0NiWUNyWSwKLQlWRkVfWVVWX0NyWUNiWQotfTsKLQotZW51bSBWRkVfQlVTX1JEX0lOUFVUX1BJWEVMX1BBVFRFUk4gewotCVZGRV9CQVlFUl9SQVcsCi0JVkZFX1lVVl9JTlRFUkxFQVZFRCwKLQlWRkVfWVVWX1BTRVVET19QTEFOQVJfWSwKLQlWRkVfWVVWX1BTRVVET19QTEFOQVJfQ0JDUgotfTsKLQotZW51bSBWRkVfWVVWX0lOUFVUX0NPU0lUSU5HX01PREUgewotCVZGRV9ZVVZfQ09TSVRFRCwKLQlWRkVfWVVWX0lOVEVSUE9MQVRFRAotfTsKLQotc3RydWN0IHZmZV9jbWRfc3RhcnQgewotCWVudW0gVkZFX1NUQVJUX0lOUFVUX1NPVVJDRSBpbnB1dFNvdXJjZTsKLQllbnVtIFZGRV9TVEFSVF9PUEVSQVRJT05fTU9ERSBvcGVyYXRpb25Nb2RlOwotCXVpbnQ4X3QgICAgIHNuYXBzaG90Q291bnQ7Ci0JZW51bSBWRkVfU1RBUlRfUElYRUxfUEFUVEVSTiBwaXhlbDsKLQllbnVtIFZGRV9ZVVZfSU5QVVRfQ09TSVRJTkdfTU9ERSB5dXZJbnB1dENvc2l0aW5nTW9kZTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX291dHB1dF9hY2sgewotCXVpbnQzMl90IHlidWZhZGRyW1ZGRV9NQVhfTlVNX0ZSQUdNRU5UU19QRVJfRlJBTUVdOwotCXVpbnQzMl90IGNocm9tYWJ1ZmFkZHJbVkZFX01BWF9OVU1fRlJBR01FTlRTX1BFUl9GUkFNRV07Ci19OwotCi0jZGVmaW5lIFZGRV9TVEFUU19CVUZGRVJfQ09VTlQgMwotCi1zdHJ1Y3QgdmZlX2NtZF9zdGF0c19zZXR0aW5nIHsKLQl1aW50MTZfdCBmcmFtZUhEaW1lbnNpb247Ci0JdWludDE2X3QgZnJhbWVWRGltZW5zaW9uOwotCXVpbnQ4X3QgIGFmQnVzUHJpb3JpdHlTZWxlY3Rpb247Ci0JdWludDhfdCAgYWZCdXNQcmlvcml0eTsKLQl1aW50OF90ICBhd2JCdXNQcmlvcml0eVNlbGVjdGlvbjsKLQl1aW50OF90ICBhd2JCdXNQcmlvcml0eTsKLQl1aW50OF90ICBoaXN0QnVzUHJpb3JpdHlTZWxlY3Rpb247Ci0JdWludDhfdCAgaGlzdEJ1c1ByaW9yaXR5OwotCXVpbnQzMl90IGFmQnVmZmVyW1ZGRV9TVEFUU19CVUZGRVJfQ09VTlRdOwotCXVpbnQzMl90IGF3YkJ1ZmZlcltWRkVfU1RBVFNfQlVGRkVSX0NPVU5UXTsKLQl1aW50MzJfdCBoaXN0QnVmZmVyW1ZGRV9TVEFUU19CVUZGRVJfQ09VTlRdOwotfTsKLQotc3RydWN0IHZmZV9jbWRfc3RhdHNfYWZfc3RhcnQgewotCXVpbnQ4X3QgIGVuYWJsZTsKLQl1aW50OF90ICB3aW5kb3dNb2RlOwotCXVpbnQxNl90IHdpbmRvd0hPZmZzZXQ7Ci0JdWludDE2X3Qgd2luZG93Vk9mZnNldDsKLQl1aW50MTZfdCB3aW5kb3dXaWR0aDsKLQl1aW50MTZfdCB3aW5kb3dIZWlnaHQ7Ci0JdWludDhfdCAgZ3JpZEZvck11bHRpV2luZG93c1sxNl07Ci0JdWludDhfdCAgICAgbWV0cmljU2VsZWN0aW9uOwotCWludDE2X3QgIG1ldHJpY01heDsKLQlpbnQ4X3QgICBoaWdoUGFzc0NvZWZbN107Ci0JaW50OF90ICAgYnVmZmVySGVhZGVyOwotfTsKLQotc3RydWN0IHZmZV9jbWRfc3RhdHNfYWZfdXBkYXRlIHsKLQl1aW50OF90ICB3aW5kb3dNb2RlOwotCXVpbnQxNl90IHdpbmRvd0hPZmZzZXQ7Ci0JdWludDE2X3Qgd2luZG93Vk9mZnNldDsKLQl1aW50MTZfdCB3aW5kb3dXaWR0aDsKLQl1aW50MTZfdCB3aW5kb3dIZWlnaHQ7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9zdGF0c193Yl9leHBfc3RhcnQgewotCXVpbnQ4X3QgICBlbmFibGU7Ci0JdWludDhfdCAgIHdiRXhwUmVnaW9uczsKLQl1aW50OF90ICAgd2JFeHBTdWJSZWdpb247Ci0JdWludDhfdCAgIGF3YllNaW47Ci0JdWludDhfdCAgIGF3YllNYXg7Ci0JaW50OF90ICAgIGF3Yk1DRkdbNF07Ci0JaW50MTZfdCAgIGF3YkNDRkdbNF07Ci0JaW50OF90ICAgIGF4d0hlYWRlcjsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX3N0YXRzX3diX2V4cF91cGRhdGUgewotCXVpbnQ4X3Qgd2JFeHBSZWdpb25zOwotCXVpbnQ4X3Qgd2JFeHBTdWJSZWdpb247Ci0JaW50OF90ICBhd2JZTWluOwotCWludDhfdCAgYXdiWU1heDsKLQlpbnQ4X3QgIGF3Yk1DRkdbNF07Ci0JaW50MTZfdCBhd2JDQ0ZHWzRdOwotfTsKLQotc3RydWN0IHZmZV9jbWRfc3RhdHNfYWZfYWNrIHsKLQl1aW50MzJfdCBuZXh0QUZPdXRwdXRCdWZmZXJBZGRyOwotfTsKLQotc3RydWN0IHZmZV9jbWRfc3RhdHNfd2JfZXhwX2FjayB7Ci0JdWludDMyX3QgIG5leHRXYkV4cE91dHB1dEJ1ZmZlckFkZHI7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9ibGFja19sZXZlbF9jb25maWcgewotCXVpbnQ4X3QgIGVuYWJsZTsKLQl1aW50MTZfdCBldmVuRXZlbkFkanVzdG1lbnQ7Ci0JdWludDE2X3QgZXZlbk9kZEFkanVzdG1lbnQ7Ci0JdWludDE2X3Qgb2RkRXZlbkFkanVzdG1lbnQ7Ci0JdWludDE2X3Qgb2RkT2RkQWRqdXN0bWVudDsKLX07Ci0KLS8qIDEzKjEgICovCi0jZGVmaW5lICBWRkVfUk9MTF9PRkZfSU5JVF9UQUJMRV9TSVpFICAxMwotLyogMTMqMTYgKi8KLSNkZWZpbmUgIFZGRV9ST0xMX09GRl9ERUxUQV9UQUJMRV9TSVpFIDIwOAotCi1zdHJ1Y3QgdmZlX2NtZF9yb2xsX29mZl9jb25maWcgewotCXVpbnQ4X3QgIGVuYWJsZTsKLQl1aW50MTZfdCBncmlkV2lkdGg7Ci0JdWludDE2X3QgZ3JpZEhlaWdodDsKLQl1aW50MTZfdCAgeURlbHRhOwotCXVpbnQ4X3QgIGdyaWRYSW5kZXg7Ci0JdWludDhfdCAgZ3JpZFlJbmRleDsKLQl1aW50MTZfdCBncmlkUGl4ZWxYSW5kZXg7Ci0JdWludDE2X3QgZ3JpZFBpeGVsWUluZGV4OwotCXVpbnQxNl90IHlEZWx0YUFjY3VtOwotCXVpbnQxNl90IGluaXRUYWJsZVJbVkZFX1JPTExfT0ZGX0lOSVRfVEFCTEVfU0laRV07Ci0JdWludDE2X3QgaW5pdFRhYmxlR3JbVkZFX1JPTExfT0ZGX0lOSVRfVEFCTEVfU0laRV07Ci0JdWludDE2X3QgaW5pdFRhYmxlQltWRkVfUk9MTF9PRkZfSU5JVF9UQUJMRV9TSVpFXTsKLQl1aW50MTZfdCBpbml0VGFibGVHYltWRkVfUk9MTF9PRkZfSU5JVF9UQUJMRV9TSVpFXTsKLQlpbnQxNl90ICBkZWx0YVRhYmxlUltWRkVfUk9MTF9PRkZfREVMVEFfVEFCTEVfU0laRV07Ci0JaW50MTZfdCAgZGVsdGFUYWJsZUdyW1ZGRV9ST0xMX09GRl9ERUxUQV9UQUJMRV9TSVpFXTsKLQlpbnQxNl90ICBkZWx0YVRhYmxlQltWRkVfUk9MTF9PRkZfREVMVEFfVEFCTEVfU0laRV07Ci0JaW50MTZfdCAgZGVsdGFUYWJsZUdiW1ZGRV9ST0xMX09GRl9ERUxUQV9UQUJMRV9TSVpFXTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX2RlbXV4X2NoYW5uZWxfZ2Fpbl9jb25maWcgewotCXVpbnQxNl90IGNoMEV2ZW5HYWluOwotCXVpbnQxNl90IGNoME9kZEdhaW47Ci0JdWludDE2X3QgY2gxR2FpbjsKLQl1aW50MTZfdCBjaDJHYWluOwotfTsKLQotc3RydWN0IHZmZV9jbWRzX2RlbW9zYWljX2FiZiB7Ci0JdWludDhfdCAgIGVuYWJsZTsKLQl1aW50OF90ICAgZm9yY2VPbjsKLQl1aW50OF90ICAgc2hpZnQ7Ci0JdWludDE2X3QgIGxwVGhyZXNob2xkOwotCXVpbnQxNl90ICBtYXg7Ci0JdWludDE2X3QgIG1pbjsKLQl1aW50OF90ICAgcmF0aW87Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZHNfZGVtb3NhaWNfYnBjIHsKLQl1aW50OF90ICAgZW5hYmxlOwotCXVpbnQxNl90ICBmbWF4VGhyZXNob2xkOwotCXVpbnQxNl90ICBmbWluVGhyZXNob2xkOwotCXVpbnQxNl90ICByZWREaWZmVGhyZXNob2xkOwotCXVpbnQxNl90ICBibHVlRGlmZlRocmVzaG9sZDsKLQl1aW50MTZfdCAgZ3JlZW5EaWZmVGhyZXNob2xkOwotfTsKLQotc3RydWN0IHZmZV9jbWRfZGVtb3NhaWNfY29uZmlnIHsKLQl1aW50OF90ICAgZW5hYmxlOwotCXVpbnQ4X3QgICBzbG9wZVNoaWZ0OwotCXN0cnVjdCB2ZmVfY21kc19kZW1vc2FpY19hYmYgYWJmQ29uZmlnOwotCXN0cnVjdCB2ZmVfY21kc19kZW1vc2FpY19icGMgYnBjQ29uZmlnOwotfTsKLQotc3RydWN0IHZmZV9jbWRfZGVtb3NhaWNfYnBjX3VwZGF0ZSB7Ci0Jc3RydWN0IHZmZV9jbWRzX2RlbW9zYWljX2JwYyBicGNVcGRhdGU7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9kZW1vc2FpY19hYmZfdXBkYXRlIHsKLQlzdHJ1Y3QgdmZlX2NtZHNfZGVtb3NhaWNfYWJmIGFiZlVwZGF0ZTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX3doaXRlX2JhbGFuY2VfY29uZmlnIHsKLQl1aW50OF90ICBlbmFibGU7Ci0JdWludDE2X3QgY2gyR2FpbjsKLQl1aW50MTZfdCBjaDFHYWluOwotCXVpbnQxNl90IGNoMEdhaW47Ci19OwotCi1lbnVtIFZGRV9DT0xPUl9DT1JSRUNUSU9OX0NPRUZfUUZBQ1RPUiB7Ci0JQ09FRl9JU19RN19TSUdORUQsCi0JQ09FRl9JU19ROF9TSUdORUQsCi0JQ09FRl9JU19ROV9TSUdORUQsCi0JQ09FRl9JU19RMTBfU0lHTkVECi19OwotCi1zdHJ1Y3QgdmZlX2NtZF9jb2xvcl9jb3JyZWN0aW9uX2NvbmZpZyB7Ci0JdWludDhfdCAgICAgZW5hYmxlOwotCWVudW0gVkZFX0NPTE9SX0NPUlJFQ1RJT05fQ09FRl9RRkFDVE9SIGNvZWZRRmFjdG9yOwotCWludDE2X3QgIEMwOwotCWludDE2X3QgIEMxOwotCWludDE2X3QgIEMyOwotCWludDE2X3QgIEMzOwotCWludDE2X3QgIEM0OwotCWludDE2X3QgIEM1OwotCWludDE2X3QgIEM2OwotCWludDE2X3QgIEM3OwotCWludDE2X3QgIEM4OwotCWludDE2X3QgIEswOwotCWludDE2X3QgIEsxOwotCWludDE2X3QgIEsyOwotfTsKLQotI2RlZmluZSBWRkVfTEFfVEFCTEVfTEVOR1RIIDI1Ngotc3RydWN0IHZmZV9jbWRfbGFfY29uZmlnIHsKLQl1aW50OF90IGVuYWJsZTsKLQlpbnQxNl90IHRhYmxlW1ZGRV9MQV9UQUJMRV9MRU5HVEhdOwotfTsKLQotI2RlZmluZSBWRkVfR0FNTUFfVEFCTEVfTEVOR1RIIDI1NgotZW51bSBWRkVfUkdCX0dBTU1BX1RBQkxFX1NFTEVDVCB7Ci0JUkdCX0dBTU1BX0NIMF9TRUxFQ1RFRCwKLQlSR0JfR0FNTUFfQ0gxX1NFTEVDVEVELAotCVJHQl9HQU1NQV9DSDJfU0VMRUNURUQsCi0JUkdCX0dBTU1BX0NIMF9DSDFfU0VMRUNURUQsCi0JUkdCX0dBTU1BX0NIMF9DSDJfU0VMRUNURUQsCi0JUkdCX0dBTU1BX0NIMV9DSDJfU0VMRUNURUQsCi0JUkdCX0dBTU1BX0NIMF9DSDFfQ0gyX1NFTEVDVEVECi19OwotCi1zdHJ1Y3QgdmZlX2NtZF9yZ2JfZ2FtbWFfY29uZmlnIHsKLQl1aW50OF90IGVuYWJsZTsKLQllbnVtIFZGRV9SR0JfR0FNTUFfVEFCTEVfU0VMRUNUIGNoYW5uZWxTZWxlY3Q7Ci0JaW50MTZfdCB0YWJsZVtWRkVfR0FNTUFfVEFCTEVfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX2Nocm9tYV9lbmhhbl9jb25maWcgewotCXVpbnQ4X3QgIGVuYWJsZTsKLQlpbnQxNl90IGFtOwotCWludDE2X3QgYXA7Ci0JaW50MTZfdCBibTsKLQlpbnQxNl90IGJwOwotCWludDE2X3QgY207Ci0JaW50MTZfdCBjcDsKLQlpbnQxNl90IGRtOwotCWludDE2X3QgZHA7Ci0JaW50MTZfdCBrY3I7Ci0JaW50MTZfdCBrY2I7Ci0JaW50MTZfdCBSR0J0b1lDb252ZXJzaW9uVjA7Ci0JaW50MTZfdCBSR0J0b1lDb252ZXJzaW9uVjE7Ci0JaW50MTZfdCBSR0J0b1lDb252ZXJzaW9uVjI7Ci0JdWludDhfdCBSR0J0b1lDb252ZXJzaW9uT2Zmc2V0OwotfTsKLQotc3RydWN0IHZmZV9jbWRfY2hyb21hX3N1cHByZXNzaW9uX2NvbmZpZyB7Ci0JdWludDhfdCBlbmFibGU7Ci0JdWludDhfdCBtMTsKLQl1aW50OF90IG0zOwotCXVpbnQ4X3QgbjE7Ci0JdWludDhfdCBuMzsKLQl1aW50OF90IG5uMTsKLQl1aW50OF90IG1tMTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX2FzZl9jb25maWcgewotCXVpbnQ4X3QgZW5hYmxlOwotCXVpbnQ4X3Qgc21vb3RoRmlsdGVyRW5hYmxlZDsKLQl1aW50OF90IHNoYXJwTW9kZTsKLQl1aW50OF90IHNtb290aENvZWZDZW50ZXI7Ci0JdWludDhfdCBzbW9vdGhDb2VmU3VycjsKLQl1aW50OF90IG5vcm1hbGl6ZUZhY3RvcjsKLQl1aW50OF90IHNoYXJwSzE7Ci0JdWludDhfdCBzaGFycEsyOwotCXVpbnQ4X3Qgc2hhcnBUaHJlc2hFMTsKLQlpbnQ4X3Qgc2hhcnBUaHJlc2hFMjsKLQlpbnQ4X3Qgc2hhcnBUaHJlc2hFMzsKLQlpbnQ4X3Qgc2hhcnBUaHJlc2hFNDsKLQlpbnQ4X3Qgc2hhcnBUaHJlc2hFNTsKLQlpbnQ4X3QgZmlsdGVyMUNvZWZmaWNpZW50c1s5XTsKLQlpbnQ4X3QgZmlsdGVyMkNvZWZmaWNpZW50c1s5XTsKLQl1aW50OF90ICBjcm9wRW5hYmxlOwotCXVpbnQxNl90IGNyb3BGaXJzdFBpeGVsOwotCXVpbnQxNl90IGNyb3BMYXN0UGl4ZWw7Ci0JdWludDE2X3QgY3JvcEZpcnN0TGluZTsKLQl1aW50MTZfdCBjcm9wTGFzdExpbmU7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9hc2ZfdXBkYXRlIHsKLQl1aW50OF90IGVuYWJsZTsKLQl1aW50OF90IHNtb290aEZpbHRlckVuYWJsZWQ7Ci0JdWludDhfdCBzaGFycE1vZGU7Ci0JdWludDhfdCBzbW9vdGhDb2VmQ2VudGVyOwotCXVpbnQ4X3Qgc21vb3RoQ29lZlN1cnI7Ci0JdWludDhfdCBub3JtYWxpemVGYWN0b3I7Ci0JdWludDhfdCBzaGFycEsxOwotCXVpbnQ4X3Qgc2hhcnBLMjsKLQl1aW50OF90IHNoYXJwVGhyZXNoRTE7Ci0JaW50OF90ICBzaGFycFRocmVzaEUyOwotCWludDhfdCAgc2hhcnBUaHJlc2hFMzsKLQlpbnQ4X3QgIHNoYXJwVGhyZXNoRTQ7Ci0JaW50OF90ICBzaGFycFRocmVzaEU1OwotCWludDhfdCAgZmlsdGVyMUNvZWZmaWNpZW50c1s5XTsKLQlpbnQ4X3QgIGZpbHRlcjJDb2VmZmljaWVudHNbOV07Ci0JdWludDhfdCBjcm9wRW5hYmxlOwotfTsKLQotZW51bSBWRkVfVEVTVF9HRU5fU1lOQ19FREdFIHsKLQlWRkVfVEVTVF9HRU5fU1lOQ19FREdFX0FjdGl2ZUhpZ2gsCi0JVkZFX1RFU1RfR0VOX1NZTkNfRURHRV9BY3RpdmVMb3cKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX3Rlc3RfZ2VuX3N0YXJ0IHsKLQl1aW50OF90IHBpeGVsRGF0YVNlbGVjdDsKLQl1aW50OF90IHN5c3RlbWF0aWNEYXRhU2VsZWN0OwotCWVudW0gVkZFX1RFU1RfR0VOX1NZTkNfRURHRSAgaHN5bmNFZGdlOwotCWVudW0gVkZFX1RFU1RfR0VOX1NZTkNfRURHRSAgdnN5bmNFZGdlOwotCXVpbnQxNl90IG51bUZyYW1lOwotCWVudW0gVkZFX1JBV19QSVhFTF9EQVRBX1NJWkUgcGl4ZWxEYXRhU2l6ZTsKLQl1aW50MTZfdCBpbWFnZVdpZHRoOwotCXVpbnQxNl90IGltYWdlSGVpZ2h0OwotCXVpbnQzMl90IHN0YXJ0T2ZGcmFtZU9mZnNldDsKLQl1aW50MzJfdCBlbmRPZkZyYW1lTk9mZnNldDsKLQl1aW50MTZfdCBzdGFydE9mTGluZU9mZnNldDsKLQl1aW50MTZfdCBlbmRPZkxpbmVOT2Zmc2V0OwotCXVpbnQxNl90IGhiaTsKLQl1aW50OF90ICB2YmxFbmFibGU7Ci0JdWludDE2X3QgdmJsOwotCXVpbnQ4X3QgIHN0YXJ0T2ZGcmFtZUR1bW15TGluZTsKLQl1aW50OF90ICBlbmRPZkZyYW1lRHVtbXlMaW5lOwotCXVpbnQ4X3QgIHVuaWNvbG9yQmFyRW5hYmxlOwotCXVpbnQ4X3QgIGNvbG9yQmFyc1NwbGl0RW5hYmxlOwotCXVpbnQ4X3QgIHVuaWNvbG9yQmFyU2VsZWN0OwotCWVudW0gVkZFX1NUQVJUX1BJWEVMX1BBVFRFUk4gIGNvbG9yQmFyc1BpeGVsUGF0dGVybjsKLQl1aW50OF90ICBjb2xvckJhcnNSb3RhdGVQZXJpb2Q7Ci0JdWludDE2X3QgdGVzdEdlblJhbmRvbVNlZWQ7Ci19OwotCi1zdHJ1Y3QgdmZlX2NtZF9idXNfcG1fc3RhcnQgewotCXVpbnQ4X3Qgb3V0cHV0MllXclBtRW5hYmxlOwotCXVpbnQ4X3Qgb3V0cHV0MkNiY3JXclBtRW5hYmxlOwotCXVpbnQ4X3Qgb3V0cHV0MVlXclBtRW5hYmxlOwotCXVpbnQ4X3Qgb3V0cHV0MUNiY3JXclBtRW5hYmxlOwotfTsKLQotc3RydWN0IHZmZV9jbWRfY2FtaWZfZnJhbWVfdXBkYXRlIHsKLQlzdHJ1Y3QgdmZlX2NtZHNfY2FtaWZfZnJhbWUgY2FtaWZGcmFtZTsKLX07Ci0KLXN0cnVjdCB2ZmVfY21kX3N5bmNfdGltZXJfc2V0dGluZyB7Ci0JdWludDhfdCAgd2hpY2hTeW5jVGltZXI7Ci0JdWludDhfdCAgb3BlcmF0aW9uOwotCXVpbnQ4X3QgIHBvbGFyaXR5OwotCXVpbnQxNl90IHJlcGVhdENvdW50OwotCXVpbnQxNl90IGhzeW5jQ291bnQ7Ci0JdWludDMyX3QgcGNsa0NvdW50OwotCXVpbnQzMl90IG91dHB1dER1cmF0aW9uOwotfTsKLQotc3RydWN0IHZmZV9jbWRfYXN5bmNfdGltZXJfc2V0dGluZyB7Ci0JdWludDhfdCAgd2hpY2hBc3luY1RpbWVyOwotCXVpbnQ4X3QgIG9wZXJhdGlvbjsKLQl1aW50OF90ICBwb2xhcml0eTsKLQl1aW50MTZfdCByZXBlYXRDb3VudDsKLQl1aW50MTZfdCBpbmFjdGl2ZUNvdW50OwotCXVpbnQzMl90IGFjdGl2ZUNvdW50OwotfTsKLQotc3RydWN0ICB2ZmVfZnJhbWVfc2tpcF9jb3VudHMgewotCXVpbnQzMl90ICB0b3RhbEZyYW1lQ291bnQ7Ci0JdWludDMyX3QgIG91dHB1dDFDb3VudDsKLQl1aW50MzJfdCAgb3V0cHV0MkNvdW50OwotfTsKLQotZW51bSBWRkVfQVhJX1JEX1VOUEFDS19IQklfU0VMIHsKLQlWRkVfQVhJX1JEX0hCSV8zMl9DTE9DS19DWUNMRVMsCi0JVkZFX0FYSV9SRF9IQklfNjRfQ0xPQ0tfQ1lDTEVTLAotCVZGRV9BWElfUkRfSEJJXzEyOF9DTE9DS19DWUNMRVMsCi0JVkZFX0FYSV9SRF9IQklfMjU2X0NMT0NLX0NZQ0xFUywKLQlWRkVfQVhJX1JEX0hCSV81MTJfQ0xPQ0tfQ1lDTEVTLAotCVZGRV9BWElfUkRfSEJJXzEwMjRfQ0xPQ0tfQ1lDTEVTLAotCVZGRV9BWElfUkRfSEJJXzIwNDhfQ0xPQ0tfQ1lDTEVTLAotCVZGRV9BWElfUkRfSEJJXzQwOTZfQ0xPQ0tfQ1lDTEVTCi19OwotCi1zdHJ1Y3QgdmZlX2NtZF9heGlfaW5wdXRfY29uZmlnIHsKLQl1aW50MzJfdCAgZnJhZ0FkZHJbNF07Ci0JdWludDhfdCAgIHRvdGFsRnJhZ21lbnRDb3VudDsKLQl1aW50MTZfdCAgeVNpemU7Ci0JdWludDE2X3QgIHhPZmZzZXQ7Ci0JdWludDE2X3QgIHhTaXplOwotCXVpbnQxNl90ICByb3dJbmNyZW1lbnQ7Ci0JdWludDE2X3QgIG51bU9mUm93czsKLQllbnVtIFZGRV9BWElfQlVSU1RfTEVOR1RIIGJ1cnN0TGVuZ3RoOwotCXVpbnQ4X3QgICB1bnBhY2tQaGFzZTsKLQllbnVtIFZGRV9BWElfUkRfVU5QQUNLX0hCSV9TRUwgdW5wYWNrSGJpOwotCWVudW0gVkZFX1JBV19QSVhFTF9EQVRBX1NJWkUgICBwaXhlbFNpemU7Ci0JdWludDhfdCAgIHBhZFJlcGVhdENvdW50TGVmdDsKLQl1aW50OF90ICAgcGFkUmVwZWF0Q291bnRSaWdodDsKLQl1aW50OF90ICAgcGFkUmVwZWF0Q291bnRUb3A7Ci0JdWludDhfdCAgIHBhZFJlcGVhdENvdW50Qm90dG9tOwotCXVpbnQ4X3QgICBwYWRMZWZ0Q29tcG9uZW50U2VsZWN0Q3ljbGUwOwotCXVpbnQ4X3QgICBwYWRMZWZ0Q29tcG9uZW50U2VsZWN0Q3ljbGUxOwotCXVpbnQ4X3QgICBwYWRMZWZ0Q29tcG9uZW50U2VsZWN0Q3ljbGUyOwotCXVpbnQ4X3QgICBwYWRMZWZ0Q29tcG9uZW50U2VsZWN0Q3ljbGUzOwotCXVpbnQ4X3QgICBwYWRMZWZ0U3RvcEN5Y2xlMDsKLQl1aW50OF90ICAgcGFkTGVmdFN0b3BDeWNsZTE7Ci0JdWludDhfdCAgIHBhZExlZnRTdG9wQ3ljbGUyOwotCXVpbnQ4X3QgICBwYWRMZWZ0U3RvcEN5Y2xlMzsKLQl1aW50OF90ICAgcGFkUmlnaHRDb21wb25lbnRTZWxlY3RDeWNsZTA7Ci0JdWludDhfdCAgIHBhZFJpZ2h0Q29tcG9uZW50U2VsZWN0Q3ljbGUxOwotCXVpbnQ4X3QgICBwYWRSaWdodENvbXBvbmVudFNlbGVjdEN5Y2xlMjsKLQl1aW50OF90ICAgcGFkUmlnaHRDb21wb25lbnRTZWxlY3RDeWNsZTM7Ci0JdWludDhfdCAgIHBhZFJpZ2h0U3RvcEN5Y2xlMDsKLQl1aW50OF90ICAgcGFkUmlnaHRTdG9wQ3ljbGUxOwotCXVpbnQ4X3QgICBwYWRSaWdodFN0b3BDeWNsZTI7Ci0JdWludDhfdCAgIHBhZFJpZ2h0U3RvcEN5Y2xlMzsKLQl1aW50OF90ICAgcGFkVG9wTGluZUNvdW50OwotCXVpbnQ4X3QgICBwYWRCb3R0b21MaW5lQ291bnQ7Ci19OwotCi1zdHJ1Y3QgdmZlX2ludGVycnVwdF9zdGF0dXMgewotCXVpbnQ4X3QgY2FtaWZFcnJvcklycTsKLQl1aW50OF90IGNhbWlmU29mSXJxOwotCXVpbnQ4X3QgY2FtaWZFb2xJcnE7Ci0JdWludDhfdCBjYW1pZkVvZklycTsKLQl1aW50OF90IGNhbWlmRXBvY2gxSXJxOwotCXVpbnQ4X3QgY2FtaWZFcG9jaDJJcnE7Ci0JdWludDhfdCBjYW1pZk92ZXJmbG93SXJxOwotCXVpbnQ4X3QgY2VJcnE7Ci0JdWludDhfdCByZWdVcGRhdGVJcnE7Ci0JdWludDhfdCByZXNldEFja0lycTsKLQl1aW50OF90IGVuY1lQaW5ncG9uZ0lycTsKLQl1aW50OF90IGVuY0NiY3JQaW5ncG9uZ0lycTsKLQl1aW50OF90IHZpZXdZUGluZ3BvbmdJcnE7Ci0JdWludDhfdCB2aWV3Q2JjclBpbmdwb25nSXJxOwotCXVpbnQ4X3QgcmRQaW5ncG9uZ0lycTsKLQl1aW50OF90IGFmUGluZ3BvbmdJcnE7Ci0JdWludDhfdCBhd2JQaW5ncG9uZ0lycTsKLQl1aW50OF90IGhpc3RQaW5ncG9uZ0lycTsKLQl1aW50OF90IGVuY0lycTsKLQl1aW50OF90IHZpZXdJcnE7Ci0JdWludDhfdCBidXNPdmVyZmxvd0lycTsKLQl1aW50OF90IGFmT3ZlcmZsb3dJcnE7Ci0JdWludDhfdCBhd2JPdmVyZmxvd0lycTsKLQl1aW50OF90IHN5bmNUaW1lcjBJcnE7Ci0JdWludDhfdCBzeW5jVGltZXIxSXJxOwotCXVpbnQ4X3Qgc3luY1RpbWVyMklycTsKLQl1aW50OF90IGFzeW5jVGltZXIwSXJxOwotCXVpbnQ4X3QgYXN5bmNUaW1lcjFJcnE7Ci0JdWludDhfdCBhc3luY1RpbWVyMklycTsKLQl1aW50OF90IGFzeW5jVGltZXIzSXJxOwotCXVpbnQ4X3QgYXhpRXJyb3JJcnE7Ci0JdWludDhfdCB2aW9sYXRpb25JcnE7Ci0JdWludDhfdCBhbnlFcnJvcklycXM7Ci0JdWludDhfdCBhbnlPdXRwdXQxUGF0aElycXM7Ci0JdWludDhfdCBhbnlPdXRwdXQyUGF0aElycXM7Ci0JdWludDhfdCBhbnlPdXRwdXRQYXRoSXJxczsKLQl1aW50OF90IGFueUFzeW5jVGltZXJJcnFzOwotCXVpbnQ4X3QgYW55U3luY1RpbWVySXJxczsKLQl1aW50OF90IGFueUlycUZvckFjdGl2ZVN0YXRlc09ubHk7Ci19OwotCi1lbnVtIFZGRV9NRVNTQUdFX0lEIHsKLQlWRkVfTVNHX0lEX1JFU0VUX0FDSywKLQlWRkVfTVNHX0lEX1NUQVJUX0FDSywKLQlWRkVfTVNHX0lEX1NUT1BfQUNLLAotCVZGRV9NU0dfSURfVVBEQVRFX0FDSywKLQlWRkVfTVNHX0lEX09VVFBVVF9QLAotCVZGRV9NU0dfSURfT1VUUFVUX1YsCi0JVkZFX01TR19JRF9PVVRQVVRfUywKLQlWRkVfTVNHX0lEX09VVFBVVF9ULAotCVZGRV9NU0dfSURfU05BUFNIT1RfRE9ORSwKLQlWRkVfTVNHX0lEX1NUQVRTX0FVVE9GT0NVUywKLQlWRkVfTVNHX0lEX1NUQVRTX1dCX0VYUCwKLQlWRkVfTVNHX0lEX0VQT0NIMSwKLQlWRkVfTVNHX0lEX0VQT0NIMiwKLQlWRkVfTVNHX0lEX1NZTkNfVElNRVIwX0RPTkUsCi0JVkZFX01TR19JRF9TWU5DX1RJTUVSMV9ET05FLAotCVZGRV9NU0dfSURfU1lOQ19USU1FUjJfRE9ORSwKLQlWRkVfTVNHX0lEX0FTWU5DX1RJTUVSMF9ET05FLAotCVZGRV9NU0dfSURfQVNZTkNfVElNRVIxX0RPTkUsCi0JVkZFX01TR19JRF9BU1lOQ19USU1FUjJfRE9ORSwKLQlWRkVfTVNHX0lEX0FTWU5DX1RJTUVSM19ET05FLAotCVZGRV9NU0dfSURfQUZfT1ZFUkZMT1csCi0JVkZFX01TR19JRF9BV0JfT1ZFUkZMT1csCi0JVkZFX01TR19JRF9BWElfRVJST1IsCi0JVkZFX01TR19JRF9DQU1JRl9PVkVSRkxPVywKLQlWRkVfTVNHX0lEX1ZJT0xBVElPTiwKLQlWRkVfTVNHX0lEX0NBTUlGX0VSUk9SLAotCVZGRV9NU0dfSURfQlVTX09WRVJGTE9XLAotCVZGRV9NU0dfSURfU09GX0FDSywKLX07Ci0KLXN0cnVjdCB2ZmVfbXNnX3N0YXRzX2F1dG9mb2N1cyB7Ci0JdWludDMyX3QgICAgYWZCdWZmZXI7Ci0JdWludDMyX3QgICAgZnJhbWVDb3VudGVyOwotfTsKLQotc3RydWN0IHZmZV9tc2dfc3RhdHNfd2JfZXhwIHsKLQl1aW50MzJfdCBhd2JCdWZmZXI7Ci0JdWludDMyX3QgZnJhbWVDb3VudGVyOwotfTsKLQotc3RydWN0IHZmZV9mcmFtZV9icGNfaW5mbyB7Ci0JdWludDMyX3QgZ3JlZW5EZWZlY3RQaXhlbENvdW50OwotCXVpbnQzMl90IHJlZEJsdWVEZWZlY3RQaXhlbENvdW50OwotfTsKLQotc3RydWN0IHZmZV9mcmFtZV9hc2ZfaW5mbyB7Ci0JdWludDMyX3QgIGFzZk1heEVkZ2U7Ci0JdWludDMyX3QgIGFzZkhiaUNvdW50OwotfTsKLQotc3RydWN0IHZmZV9tc2dfY2FtaWZfc3RhdHVzIHsKLQl1aW50OF90ICBjYW1pZlN0YXRlOwotCXVpbnQzMl90IHBpeGVsQ291bnQ7Ci0JdWludDMyX3QgbGluZUNvdW50OwotfTsKLQotc3RydWN0IHZmZV9idXNfcG1fcGVyX3BhdGggewotCXVpbnQzMl90IHlXclBtU3RhdHMwOwotCXVpbnQzMl90IHlXclBtU3RhdHMxOwotCXVpbnQzMl90IGNiY3JXclBtU3RhdHMwOwotCXVpbnQzMl90IGNiY3JXclBtU3RhdHMxOwotfTsKLQotc3RydWN0IHZmZV9idXNfcGVyZm9ybWFuY2VfbW9uaXRvciB7Ci0Jc3RydWN0IHZmZV9idXNfcG1fcGVyX3BhdGggZW5jUGF0aFBtSW5mbzsKLQlzdHJ1Y3QgdmZlX2J1c19wbV9wZXJfcGF0aCB2aWV3UGF0aFBtSW5mbzsKLX07Ci0KLXN0cnVjdCB2ZmVfaXJxX3RocmVhZF9tc2cgewotCXVpbnQzMl90ICB2ZmVJcnFTdGF0dXM7Ci0JdWludDMyX3QgIGNhbWlmU3RhdHVzOwotCXVpbnQzMl90ICBkZW1vc2FpY1N0YXR1czsKLQl1aW50MzJfdCAgYXNmTWF4RWRnZTsKLQlzdHJ1Y3QgdmZlX2J1c19wZXJmb3JtYW5jZV9tb25pdG9yIHBtSW5mbzsKLX07Ci0KLXN0cnVjdCB2ZmVfbXNnX291dHB1dCB7Ci0JdWludDMyX3QgIHlCdWZmZXI7Ci0JdWludDMyX3QgIGNiY3JCdWZmZXI7Ci0Jc3RydWN0IHZmZV9mcmFtZV9icGNfaW5mbyBicGNJbmZvOwotCXN0cnVjdCB2ZmVfZnJhbWVfYXNmX2luZm8gYXNmSW5mbzsKLQl1aW50MzJfdCAgZnJhbWVDb3VudGVyOwotCXN0cnVjdCB2ZmVfYnVzX3BtX3Blcl9wYXRoIHBtRGF0YTsKLX07Ci0KLXN0cnVjdCB2ZmVfbWVzc2FnZSB7Ci0JZW51bSBWRkVfTUVTU0FHRV9JRCBfZDsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB2ZmVfbXNnX291dHB1dCAgICAgICAgICAgICAgbXNnT3V0cHV0MTsKLQkJc3RydWN0IHZmZV9tc2dfb3V0cHV0ICAgICAgICAgICAgICBtc2dPdXRwdXQyOwotCQlzdHJ1Y3QgdmZlX21zZ19zdGF0c19hdXRvZm9jdXMgICAgIG1zZ1N0YXRzQWY7Ci0JCXN0cnVjdCB2ZmVfbXNnX3N0YXRzX3diX2V4cCAgICAgICAgbXNnU3RhdHNXYkV4cDsKLQkJc3RydWN0IHZmZV9tc2dfY2FtaWZfc3RhdHVzICAgICAgICBtc2dDYW1pZkVycm9yOwotCQlzdHJ1Y3QgdmZlX2J1c19wZXJmb3JtYW5jZV9tb25pdG9yIG1zZ0J1c092ZXJmbG93OwotICAgfSBfdTsKLX07Ci0KLS8qIE5ldyBvbmUgZm9yIDhrICovCi1zdHJ1Y3QgbXNtX3ZmZV9jb21tYW5kXzhrIHsKLQlpbnQgaWQ7Ci0JdWludDE2X3QgbGVuZ3RoOwotCXZvaWQgICAgICp2YWx1ZTsKLX07Ci0KLXN0cnVjdCB2ZmVfZnJhbWVfZXh0cmEgewotCXN0cnVjdCB2ZmVfZnJhbWVfYnBjX2luZm8gYnBjSW5mbzsKLQlzdHJ1Y3QgdmZlX2ZyYW1lX2FzZl9pbmZvIGFzZkluZm87Ci0JdWludDMyX3QgIGZyYW1lQ291bnRlcjsKLQlzdHJ1Y3QgdmZlX2J1c19wbV9wZXJfcGF0aCBwbURhdGE7Ci19OwotI2VuZGlmIC8qIF9fTVNNX1ZGRThYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlOHhfcHJvYy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlOHhfcHJvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWJiMzBkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZTh4X3Byb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ODkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgIm1zbV92ZmU4eF9wcm9jLmgiCi0jaW5jbHVkZSA8bWVkaWEvbXNtX2NhbWVyYS5oPgotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KLQotc3RydWN0IGlzcl9xdWV1ZV9jbWQgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgdmZlX2ludGVycnVwdF9zdGF0dXMgdmZlSW50ZXJydXB0U3RhdHVzOwotCXN0cnVjdCB2ZmVfZnJhbWVfYXNmX2luZm8gdmZlQXNmRnJhbWVJbmZvOwotCXN0cnVjdCB2ZmVfZnJhbWVfYnBjX2luZm8gdmZlQnBjRnJhbWVJbmZvOwotCXN0cnVjdCB2ZmVfbXNnX2NhbWlmX3N0YXR1cyB2ZmVDYW1pZlN0YXR1c0xvY2FsOwotCXN0cnVjdCB2ZmVfYnVzX3BlcmZvcm1hbmNlX21vbml0b3IgdmZlUG1EYXRhOwotfTsKLQotc3RydWN0IG1zbV92ZmU4eF9jdHJsIHsKLQkvKiBiaXQgMTowIEVOQ19JUlFfTUFTSyA9IDB4MTE6Ci0JICogZ2VuZXJhdGUgSVJRIHdoZW4gYm90aCB5IGFuZCBjYmNyIGZyYW1lIGlzIHJlYWR5LiAqLwotCi0JLyogYml0IDE6MCBWSUVXX0lSUV9NQVNLPSAweDExOgotCSAqIGdlbmVyYXRlIElSUSB3aGVuIGJvdGggeSBhbmQgY2JjciBmcmFtZSBpcyByZWFkeS4gKi8KLQlzdHJ1Y3QgdmZlX2lycV9jb21wb3NpdGVfbWFza19jb25maWcgdmZlSXJxQ29tcG9zaXRlTWFza0xvY2FsOwotCXN0cnVjdCB2ZmVfbW9kdWxlX2VuYWJsZSB2ZmVNb2R1bGVFbmFibGVMb2NhbDsKLQlzdHJ1Y3QgdmZlX2NhbWlmX2NmZ19kYXRhICAgdmZlQ2FtaWZDb25maWdMb2NhbDsKLQlzdHJ1Y3QgdmZlX2ludGVycnVwdF9tYXNrICAgdmZlSW1hc2tMb2NhbDsKLQlzdHJ1Y3QgdmZlX3N0YXRzX2NtZF9kYXRhICAgdmZlU3RhdHNDbWRMb2NhbDsKLQlzdHJ1Y3QgdmZlX2J1c19jZmdfZGF0YSAgICAgdmZlQnVzQ29uZmlnTG9jYWw7Ci0Jc3RydWN0IHZmZV9jbWRfYnVzX3BtX3N0YXJ0IHZmZUJ1c1BtQ29uZmlnTG9jYWw7Ci0Jc3RydWN0IHZmZV9idXNfY21kX2RhdGEgICAgIHZmZUJ1c0NtZExvY2FsOwotCWVudW0gdmZlX2ludGVycnVwdF9uYW1lICAgICB2ZmVJbnRlcnJ1cHROYW1lTG9jYWw7Ci0JdWludDMyX3QgdmZlTGFCYW5rU2VsOwotCXN0cnVjdCB2ZmVfZ2FtbWFfbHV0X3NlbCAgdmZlR2FtbWFMdXRTZWw7Ci0KLQlib29sZWFuIHZmZVN0YXJ0QWNrUGVuZGluZ0ZsYWc7Ci0JYm9vbGVhbiB2ZmVTdG9wQWNrUGVuZGluZzsKLQlib29sZWFuIHZmZVJlc2V0QWNrUGVuZGluZzsKLQlib29sZWFuIHZmZVVwZGF0ZUFja1BlbmRpbmc7Ci0KLQllbnVtIFZGRV9BWElfT1VUUFVUX01PREUgICAgICAgIGF4aU91dHB1dE1vZGU7Ci0JZW51bSBWRkVfU1RBUlRfT1BFUkFUSU9OX01PREUgICB2ZmVPcGVyYXRpb25Nb2RlOwotCi0JYXRvbWljX3QgdmZlX3NlcnZfaW50ZXJydXB0OwotCi0JdWludDMyX3QgICAgICAgICAgICB2ZmVTbmFwU2hvdENvdW50OwotCXVpbnQzMl90ICAgICAgICAgICAgdmZlUmVxdWVzdGVkU25hcFNob3RDb3VudDsKLQlib29sZWFuICAgICAgICAgICAgIHZmZVN0YXRzUGluZ1BvbmdSZWxvYWRGbGFnOwotCXVpbnQzMl90ICAgICAgICAgICAgdmZlRnJhbWVJZDsKLQotCXN0cnVjdCB2ZmVfY21kX2ZyYW1lX3NraXBfY29uZmlnIHZmZUZyYW1lU2tpcDsKLQl1aW50MzJfdCB2ZmVGcmFtZVNraXBQYXR0ZXJuOwotCXVpbnQ4X3QgIHZmZUZyYW1lU2tpcENvdW50OwotCXVpbnQ4X3QgIHZmZUZyYW1lU2tpcFBlcmlvZDsKLQotCWJvb2xlYW4gIHZmZVRlc3RHZW5TdGFydEZsYWc7Ci0JdWludDMyX3QgdmZlSW1hc2tQYWNrZWQ7Ci0JdWludDMyX3QgdmZlSW1hc2tDb21wb3NpdGVQYWNrZWQ7Ci0JZW51bSBWRkVfUkFXX1BJWEVMX0RBVEFfU0laRSAgICAgICBheGlJbnB1dERhdGFTaXplOwotCXN0cnVjdCB2ZmVfaXJxX3RocmVhZF9tc2cgICAgICAgICAgdmZlSXJxVGhyZWFkTXNnTG9jYWw7Ci0KLQlzdHJ1Y3QgdmZlX291dHB1dF9wYXRoX2NvbWJvICB2aWV3UGF0aDsKLQlzdHJ1Y3QgdmZlX291dHB1dF9wYXRoX2NvbWJvICBlbmNQYXRoOwotCXN0cnVjdCB2ZmVfZnJhbWVfc2tpcF9jb3VudHMgdmZlRHJvcHBlZEZyYW1lQ291bnRzOwotCXN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCBhZlN0YXRzQ29udHJvbDsKLQlzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wgYXdiU3RhdHNDb250cm9sOwotCi0JZW51bSBWRkVfU1RBVEUgIHZzdGF0ZTsKLQotCXN0cnVjdCBtc21fdmZlX2NhbGxiYWNrICpyZXNwOwotCXN0cnVjdCB2ZmVfZnJhbWVfZXh0cmEgZXh0ZGF0YTsKLQotCXN0cnVjdCBpc3JfcXVldWVfY21kIGlycXNbMTBdOwotCXNwaW5sb2NrX3QgaXJxc19sb2NrOwotCWludCBpcnFfZ2V0OwotCWludCBpcnFfcHV0OwotCi0JaW50IHZmZWlycTsKLQl2b2lkIF9faW9tZW0gKnZmZWJhc2U7Ci0KLQl2b2lkICpzeW5jZGF0YTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3ZmZTh4X2N0cmwgKmN0cmw7Ci1zdGF0aWMgc3BpbmxvY2tfdCBtc21fdmZlX2N0cmxfbG9jazsKLQotc3RhdGljIHZvaWQgdmZlX3Byb2dfaHcodWludDhfdCAqaHdyZWcsIHVpbnQzMl90ICppbnB0ciwgdWludDMyX3QgcmVnY250KQotewotCS8qIHVuc2lnbmVkIGxvbmcgZmxhZ3M7ICovCi0JdWludDMyX3QgaTsKLQl1aW50MzJfdCAqcDsKLQotCS8qIEB0b2RvIFRoaXMgaXMgY2F1c2luZyBpc3N1ZXMsIG5lZWQgZnVydGhlciBpbnZlc3RpZ2F0ZSAqLwotCS8qIHNwaW5fbG9ja19pcnFzYXZlKCZjdHJsLT5pb19sb2NrLCBmbGFncyk7ICovCi0KLQlwID0gKHVpbnQzMl90ICopKGh3cmVnKTsKLQlmb3IgKGkgPSAwOyBpIDwgKHJlZ2NudCA+PiAyKTsgaSsrKQotCQl3cml0ZWwoKmlucHRyKyssIHArKyk7Ci0JCS8qICpwKysgPSAqaW5wdHIrKzsgKi8KLQotCS8qIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0cmwtPmlvX2xvY2ssIGZsYWdzKTsgKi8KLX0KLQotc3RhdGljIHZvaWQKLXZmZV9zZXRfYnVzX3BpcG9fYWRkcihzdHJ1Y3QgdmZlX291dHB1dF9wYXRoX2NvbWJvICp2cGF0aCwKLQlzdHJ1Y3QgdmZlX291dHB1dF9wYXRoX2NvbWJvICplcGF0aCkKLXsKLQl2cGF0aC0+eVBhdGguaHdSZWdQaW5nQWRkcmVzcyA9ICh1aW50OF90ICopCi0JCShjdHJsLT52ZmViYXNlICsgVkZFX0JVU19WSUVXX1lfV1JfUElOR19BRERSKTsKLQl2cGF0aC0+eVBhdGguaHdSZWdQb25nQWRkcmVzcyA9ICh1aW50OF90ICopCi0JCShjdHJsLT52ZmViYXNlICsgVkZFX0JVU19WSUVXX1lfV1JfUE9OR19BRERSKTsKLQl2cGF0aC0+Y2JjclBhdGguaHdSZWdQaW5nQWRkcmVzcyA9ICh1aW50OF90ICopCi0JCShjdHJsLT52ZmViYXNlICsgVkZFX0JVU19WSUVXX0NCQ1JfV1JfUElOR19BRERSKTsKLQl2cGF0aC0+Y2JjclBhdGguaHdSZWdQb25nQWRkcmVzcyA9ICh1aW50OF90ICopCi0JCShjdHJsLT52ZmViYXNlICsgVkZFX0JVU19WSUVXX0NCQ1JfV1JfUE9OR19BRERSKTsKLQotCWVwYXRoLT55UGF0aC5od1JlZ1BpbmdBZGRyZXNzID0gKHVpbnQ4X3QgKikKLQkJKGN0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX0VOQ19ZX1dSX1BJTkdfQUREUik7Ci0JZXBhdGgtPnlQYXRoLmh3UmVnUG9uZ0FkZHJlc3MgPSAodWludDhfdCAqKQotCQkoY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfRU5DX1lfV1JfUE9OR19BRERSKTsKLQllcGF0aC0+Y2JjclBhdGguaHdSZWdQaW5nQWRkcmVzcyA9ICh1aW50OF90ICopCi0JCShjdHJsLT52ZmViYXNlICsgVkZFX0JVU19FTkNfQ0JDUl9XUl9QSU5HX0FERFIpOwotCWVwYXRoLT5jYmNyUGF0aC5od1JlZ1BvbmdBZGRyZXNzID0gKHVpbnQ4X3QgKikKLQkJKGN0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX0VOQ19DQkNSX1dSX1BPTkdfQUREUik7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9heGlfb3V0cHV0KHN0cnVjdCB2ZmVfY21kX2F4aV9vdXRwdXRfY29uZmlnICppbiwKLQlzdHJ1Y3QgdmZlX291dHB1dF9wYXRoX2NvbWJvICpvdXQxLAotCXN0cnVjdCB2ZmVfb3V0cHV0X3BhdGhfY29tYm8gKm91dDIsIHVpbnQxNl90IG91dCkKLXsKLQlzdHJ1Y3QgdmZlX2F4aV9vdXRfY2ZnIGNtZDsKLQotCXVpbnQxNl90IHRlbXA7Ci0JdWludDMyX3QgYnVyc3RMZW5ndGg7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCS8qIGZvcmNlIGl0IHRvIGJ1cnN0IGxlbmd0aCA0LCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGl0LiAqLwotCWJ1cnN0TGVuZ3RoID0gMTsKLQotCS8qIEFYSSBPdXRwdXQgMiBZIENvbmZpZ3VyYXRpb24qLwotCS8qIFZGRV9CVVNfRU5DX1lfV1JfUElOR19BRERSICAqLwotCWNtZC5vdXQyWVBpbmdBZGRyID0gb3V0Mi0+eVBhdGguYWRkcmVzc0J1ZmZlclswXTsKLQotCS8qIFZGRV9CVVNfRU5DX1lfV1JfUE9OR19BRERSICAqLwotCWNtZC5vdXQyWVBvbmdBZGRyID0gb3V0Mi0+eVBhdGguYWRkcmVzc0J1ZmZlclsxXTsKLQotCS8qIFZGRV9CVVNfRU5DX1lfV1JfSU1BR0VfU0laRSAqLwotCWNtZC5vdXQyWUltYWdlSGVpZ2h0ID0gaW4tPm91dHB1dDIub3V0cHV0WS5pbWFnZUhlaWdodDsKLQkvKiBjb252ZXJ0IHRoZSBpbWFnZSB3aWR0aCBhbmQgcm93IGluY3JlbWVudCB0byBiZSBpbgotCSAqIHVuaXQgb2YgNjRiaXQgKDggYnl0ZXMpICovCi0JdGVtcCA9IChpbi0+b3V0cHV0Mi5vdXRwdXRZLmltYWdlV2lkdGggKyAob3V0IC0gMSkpIC8gb3V0OwotCWNtZC5vdXQyWUltYWdlV2lkdGhpbjY0Yml0ID0gdGVtcDsKLQotCS8qIFZGRV9CVVNfRU5DX1lfV1JfQlVGRkVSX0NGRyAqLwotCWNtZC5vdXQyWUJ1cnN0TGVuZ3RoID0gYnVyc3RMZW5ndGg7Ci0JY21kLm91dDJZTnVtUm93cyA9IGluLT5vdXRwdXQyLm91dHB1dFkub3V0Um93Q291bnQ7Ci0JdGVtcCA9IChpbi0+b3V0cHV0Mi5vdXRwdXRZLm91dFJvd0luY3JlbWVudCArIChvdXQgLSAxKSkgLyBvdXQ7Ci0JY21kLm91dDJZUm93SW5jcmVtZW50SW42NGJpdCA9IHRlbXA7Ci0KLQkvKiBBWEkgT3V0cHV0IDIgQ2JjciBDb25maWd1cmF0aW9uKi8KLQkvKiBWRkVfQlVTX0VOQ19DYmNyX1dSX1BJTkdfQUREUiAgKi8KLQljbWQub3V0MkNiY3JQaW5nQWRkciA9IG91dDItPmNiY3JQYXRoLmFkZHJlc3NCdWZmZXJbMF07Ci0KLQkvKiBWRkVfQlVTX0VOQ19DYmNyX1dSX1BPTkdfQUREUiAgKi8KLQljbWQub3V0MkNiY3JQb25nQWRkciA9IG91dDItPmNiY3JQYXRoLmFkZHJlc3NCdWZmZXJbMV07Ci0KLQkvKiBWRkVfQlVTX0VOQ19DYmNyX1dSX0lNQUdFX1NJWkUgKi8KLQljbWQub3V0MkNiY3JJbWFnZUhlaWdodCA9IGluLT5vdXRwdXQyLm91dHB1dENiY3IuaW1hZ2VIZWlnaHQ7Ci0JdGVtcCA9IChpbi0+b3V0cHV0Mi5vdXRwdXRDYmNyLmltYWdlV2lkdGggKyAob3V0IC0gMSkpIC8gb3V0OwotCWNtZC5vdXQyQ2JjckltYWdlV2lkdGhJbjY0Yml0ID0gdGVtcDsKLQotCS8qIFZGRV9CVVNfRU5DX0NiY3JfV1JfQlVGRkVSX0NGRyAqLwotCWNtZC5vdXQyQ2JjckJ1cnN0TGVuZ3RoID0gYnVyc3RMZW5ndGg7Ci0JY21kLm91dDJDYmNyTnVtUm93cyA9IGluLT5vdXRwdXQyLm91dHB1dENiY3Iub3V0Um93Q291bnQ7Ci0JdGVtcCA9IChpbi0+b3V0cHV0Mi5vdXRwdXRDYmNyLm91dFJvd0luY3JlbWVudCArIChvdXQgLSAxKSkgLyBvdXQ7Ci0JY21kLm91dDJDYmNyUm93SW5jcmVtZW50SW42NGJpdCA9IHRlbXA7Ci0KLQkvKiBBWEkgT3V0cHV0IDEgWSBDb25maWd1cmF0aW9uICovCi0JLyogVkZFX0JVU19WSUVXX1lfV1JfUElOR19BRERSICAqLwotCWNtZC5vdXQxWVBpbmdBZGRyID0gb3V0MS0+eVBhdGguYWRkcmVzc0J1ZmZlclswXTsKLQotCS8qIFZGRV9CVVNfVklFV19ZX1dSX1BPTkdfQUREUiAqLwotCWNtZC5vdXQxWVBvbmdBZGRyID0gb3V0MS0+eVBhdGguYWRkcmVzc0J1ZmZlclsxXTsKLQotCS8qIFZGRV9CVVNfVklFV19ZX1dSX0lNQUdFX1NJWkUgKi8KLQljbWQub3V0MVlJbWFnZUhlaWdodCA9IGluLT5vdXRwdXQxLm91dHB1dFkuaW1hZ2VIZWlnaHQ7Ci0JdGVtcCA9IChpbi0+b3V0cHV0MS5vdXRwdXRZLmltYWdlV2lkdGggKyAob3V0IC0gMSkpIC8gb3V0OwotCWNtZC5vdXQxWUltYWdlV2lkdGhpbjY0Yml0ID0gdGVtcDsKLQotCS8qIFZGRV9CVVNfVklFV19ZX1dSX0JVRkZFUl9DRkcgICAgICovCi0JY21kLm91dDFZQnVyc3RMZW5ndGggPSBidXJzdExlbmd0aDsKLQljbWQub3V0MVlOdW1Sb3dzID0gaW4tPm91dHB1dDEub3V0cHV0WS5vdXRSb3dDb3VudDsKLQotCXRlbXAgPSAoaW4tPm91dHB1dDEub3V0cHV0WS5vdXRSb3dJbmNyZW1lbnQgKyAob3V0IC0gMSkpIC8gb3V0OwotCWNtZC5vdXQxWVJvd0luY3JlbWVudEluNjRiaXQgPSB0ZW1wOwotCi0JLyogQVhJIE91dHB1dCAxIENiY3IgQ29uZmlndXJhdGlvbiovCi0JY21kLm91dDFDYmNyUGluZ0FkZHIgPSBvdXQxLT5jYmNyUGF0aC5hZGRyZXNzQnVmZmVyWzBdOwotCi0JLyogVkZFX0JVU19WSUVXX0NiY3JfV1JfUE9OR19BRERSICAqLwotCWNtZC5vdXQxQ2JjclBvbmdBZGRyID0gb3V0MS0+Y2JjclBhdGguYWRkcmVzc0J1ZmZlclsxXTsKLQotCS8qIFZGRV9CVVNfVklFV19DYmNyX1dSX0lNQUdFX1NJWkUgKi8KLQljbWQub3V0MUNiY3JJbWFnZUhlaWdodCA9IGluLT5vdXRwdXQxLm91dHB1dENiY3IuaW1hZ2VIZWlnaHQ7Ci0JdGVtcCA9IChpbi0+b3V0cHV0MS5vdXRwdXRDYmNyLmltYWdlV2lkdGggKyAob3V0IC0gMSkpIC8gb3V0OwotCWNtZC5vdXQxQ2JjckltYWdlV2lkdGhJbjY0Yml0ID0gdGVtcDsKLQotCWNtZC5vdXQxQ2JjckJ1cnN0TGVuZ3RoID0gYnVyc3RMZW5ndGg7Ci0JY21kLm91dDFDYmNyTnVtUm93cyA9IGluLT5vdXRwdXQxLm91dHB1dENiY3Iub3V0Um93Q291bnQ7Ci0JdGVtcCA9IChpbi0+b3V0cHV0MS5vdXRwdXRDYmNyLm91dFJvd0luY3JlbWVudCArIChvdXQgLSAxKSkgLyBvdXQ7Ci0KLQljbWQub3V0MUNiY3JSb3dJbmNyZW1lbnRJbjY0Yml0ID0gdGVtcDsKLQotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX0VOQ19ZX1dSX1BJTkdfQUREUiwKLQkJKHVpbnQzMl90ICopJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfcmVnX2J1c19jZmcoc3RydWN0IHZmZV9idXNfY2ZnX2RhdGEgKmluKQotewotCXN0cnVjdCB2ZmVfYXhpX2J1c19jZmcgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljbWQuc3RyaXBlUmRQYXRoRW4gICAgICA9IGluLT5zdHJpcGVSZFBhdGhFbjsKLQljbWQuZW5jWVdyUGF0aEVuICAgICAgICA9IGluLT5lbmNZV3JQYXRoRW47Ci0JY21kLmVuY0NiY3JXclBhdGhFbiAgICAgPSBpbi0+ZW5jQ2JjcldyUGF0aEVuOwotCWNtZC52aWV3WVdyUGF0aEVuICAgICAgID0gaW4tPnZpZXdZV3JQYXRoRW47Ci0JY21kLnZpZXdDYmNyV3JQYXRoRW4gICAgPSBpbi0+dmlld0NiY3JXclBhdGhFbjsKLQljbWQucmF3UGl4ZWxEYXRhU2l6ZSAgICA9ICh1aW50MzJfdClpbi0+cmF3UGl4ZWxEYXRhU2l6ZTsKLQljbWQucmF3V3JpdGVQYXRoU2VsZWN0ICA9ICh1aW50MzJfdClpbi0+cmF3V3JpdGVQYXRoU2VsZWN0OwotCi0JLyogIHByb2dyYW0gdmZlX2J1c19jZmcgKi8KLQl3cml0ZWwoKigodWludDMyX3QgKikmY21kKSwgY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfQ0ZHKTsKLX0KLQotc3RhdGljIHZvaWQgdmZlX3JlZ19jYW1pZl9jb25maWcoc3RydWN0IHZmZV9jYW1pZl9jZmdfZGF0YSAqaW4pCi17Ci0Jc3RydWN0IFZGRV9DQU1JRkNvbmZpZ1R5cGUgY2ZnOwotCi0JbWVtc2V0KCZjZmcsIDAsIHNpemVvZihjZmcpKTsKLQotCWNmZy5WU3luY0VkZ2UgPSBpbi0+Y2FtaWZDZmdGcm9tQ21kLnZTeW5jRWRnZTsKLQotCWNmZy5IU3luY0VkZ2UgPSBpbi0+Y2FtaWZDZmdGcm9tQ21kLmhTeW5jRWRnZTsKLQotCWNmZy5zeW5jTW9kZSA9IGluLT5jYW1pZkNmZ0Zyb21DbWQuc3luY01vZGU7Ci0KLQljZmcudmZlU3Vic2FtcGxlRW5hYmxlID0gaW4tPmNhbWlmQ2ZnRnJvbUNtZC52ZmVTdWJTYW1wbGVFbmFibGU7Ci0KLQljZmcuYnVzU3Vic2FtcGxlRW5hYmxlID0gaW4tPmNhbWlmQ2ZnRnJvbUNtZC5idXNTdWJTYW1wbGVFbmFibGU7Ci0KLQljZmcuY2FtaWYydmZlRW5hYmxlID0gaW4tPmNhbWlmMk91dHB1dEVuYWJsZTsKLQotCWNmZy5jYW1pZjJidXNFbmFibGUgPSBpbi0+Y2FtaWYyQnVzRW5hYmxlOwotCi0JY2ZnLmlycVN1YnNhbXBsZUVuYWJsZSA9IGluLT5jYW1pZkNmZ0Zyb21DbWQuaXJxU3ViU2FtcGxlRW5hYmxlOwotCi0JY2ZnLmJpbm5pbmdFbmFibGUgPSBpbi0+Y2FtaWZDZmdGcm9tQ21kLmJpbm5pbmdFbmFibGU7Ci0KLQljZmcubWlzckVuYWJsZSA9IGluLT5jYW1pZkNmZ0Zyb21DbWQubWlzckVuYWJsZTsKLQotCS8qICBwcm9ncmFtIGNhbWlmX2NvbmZpZyAqLwotCXdyaXRlbCgqKCh1aW50MzJfdCAqKSZjZmcpLCBjdHJsLT52ZmViYXNlICsgQ0FNSUZfQ09ORklHKTsKLX0KLQotc3RhdGljIHZvaWQgdmZlX3JlZ19idXNfY21kKHN0cnVjdCB2ZmVfYnVzX2NtZF9kYXRhICppbikKLXsKLQlzdHJ1Y3QgdmZlX2J1c2NtZCBjbWQ7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWNtZC5zdHJpcGVSZWxvYWQgICAgICAgID0gaW4tPnN0cmlwZVJlbG9hZDsKLQljbWQuYnVzUGluZ3BvbmdSZWxvYWQgICA9IGluLT5idXNQaW5ncG9uZ1JlbG9hZDsKLQljbWQuc3RhdHNQaW5ncG9uZ1JlbG9hZCA9IGluLT5zdGF0c1Bpbmdwb25nUmVsb2FkOwotCi0Jd3JpdGVsKCooKHVpbnQzMl90ICopJmNtZCksIGN0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX0NNRCk7Ci0KLQlDREJHKCJidXMgY29tbWFuZCA9IDB4JXhcbiIsICgqKCh1aW50MzJfdCAqKSZjbWQpKSk7Ci0KLQkvKiB0aGlzIGlzIG5lZWRlZCwgYXMgdGhlIGNvbnRyb2wgYml0cyBhcmUgcHVsc2UgYmFzZWQuCi0JICogRG9uJ3Qgd2FudCB0byByZWxvYWQgYnVzIHBpbmdwb25nIGFnYWluLiAqLwotCWluLT5idXNQaW5ncG9uZ1JlbG9hZCA9IDA7Ci0JaW4tPnN0YXRzUGluZ3BvbmdSZWxvYWQgPSAwOwotCWluLT5zdHJpcGVSZWxvYWQgPSAwOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfcmVnX21vZHVsZV9jZmcoc3RydWN0IHZmZV9tb2R1bGVfZW5hYmxlICppbikKLXsKLQlzdHJ1Y3QgdmZlX21vZF9lbmFibGUgZW5hOwotCi0JbWVtc2V0KCZlbmEsIDAsIHNpemVvZihlbmEpKTsKLQotCWVuYS5ibGFja0xldmVsQ29ycmVjdGlvbkVuYWJsZSA9IGluLT5ibGFja0xldmVsQ29ycmVjdGlvbkVuYWJsZTsKLQllbmEubGVuc1JvbGxPZmZFbmFibGUgICAgICAgICAgPSBpbi0+bGVuc1JvbGxPZmZFbmFibGU7Ci0JZW5hLmRlbXV4RW5hYmxlICAgICAgICAgICAgICAgID0gaW4tPmRlbXV4RW5hYmxlOwotCWVuYS5jaHJvbWFVcHNhbXBsZUVuYWJsZSAgICAgICA9IGluLT5jaHJvbWFVcHNhbXBsZUVuYWJsZTsKLQllbmEuZGVtb3NhaWNFbmFibGUgICAgICAgICAgICAgPSBpbi0+ZGVtb3NhaWNFbmFibGU7Ci0JZW5hLnN0YXRzRW5hYmxlICAgICAgICAgICAgICAgID0gaW4tPnN0YXRzRW5hYmxlOwotCWVuYS5jcm9wRW5hYmxlICAgICAgICAgICAgICAgICA9IGluLT5jcm9wRW5hYmxlOwotCWVuYS5tYWluU2NhbGVyRW5hYmxlICAgICAgICAgICA9IGluLT5tYWluU2NhbGVyRW5hYmxlOwotCWVuYS53aGl0ZUJhbGFuY2VFbmFibGUgICAgICAgICA9IGluLT53aGl0ZUJhbGFuY2VFbmFibGU7Ci0JZW5hLmNvbG9yQ29ycmVjdGlvbkVuYWJsZSAgICAgID0gaW4tPmNvbG9yQ29ycmVjdGlvbkVuYWJsZTsKLQllbmEueUhpc3RFbmFibGUgICAgICAgICAgICAgICAgPSBpbi0+eUhpc3RFbmFibGU7Ci0JZW5hLnNraW5Ub25lRW5hYmxlICAgICAgICAgICAgID0gaW4tPnNraW5Ub25lRW5hYmxlOwotCWVuYS5sdW1hQWRhcHRhdGlvbkVuYWJsZSAgICAgICA9IGluLT5sdW1hQWRhcHRhdGlvbkVuYWJsZTsKLQllbmEucmdiTFVURW5hYmxlICAgICAgICAgICAgICAgPSBpbi0+cmdiTFVURW5hYmxlOwotCWVuYS5jaHJvbWFFbmhhbkVuYWJsZSAgICAgICAgICA9IGluLT5jaHJvbWFFbmhhbkVuYWJsZTsKLQllbmEuYXNmRW5hYmxlICAgICAgICAgICAgICAgICAgPSBpbi0+YXNmRW5hYmxlOwotCWVuYS5jaHJvbWFTdXBwcmVzc2lvbkVuYWJsZSAgICA9IGluLT5jaHJvbWFTdXBwcmVzc2lvbkVuYWJsZTsKLQllbmEuY2hyb21hU3Vic2FtcGxlRW5hYmxlICAgICAgPSBpbi0+Y2hyb21hU3Vic2FtcGxlRW5hYmxlOwotCWVuYS5zY2FsZXIyWUVuYWJsZSAgICAgICAgICAgICA9IGluLT5zY2FsZXIyWUVuYWJsZTsKLQllbmEuc2NhbGVyMkNiY3JFbmFibGUgICAgICAgICAgPSBpbi0+c2NhbGVyMkNiY3JFbmFibGU7Ci0KLQl3cml0ZWwoKigodWludDMyX3QgKikmZW5hKSwgY3RybC0+dmZlYmFzZSArIFZGRV9NT0RVTEVfQ0ZHKTsKLX0KLQotc3RhdGljIHZvaWQgdmZlX3Byb2dyYW1fZG1pX2NmZyhlbnVtIFZGRV9ETUlfUkFNX1NFTCBiYW5rU2VsKQotewotCS8qIHNldCBiaXQgOCBmb3IgYXV0byBpbmNyZW1lbnQuICovCi0JdWludDMyX3QgdmFsdWUgPSAodWludDMyX3QpIGN0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0NGR19ERUZBVUxUOwotCi0JdmFsdWUgKz0gKHVpbnQzMl90KWJhbmtTZWw7Ci0JLyogQ0RCRygiZG1pIGNmZyBpbnB1dCBiYW5rIGlzICAweCV4XG4iLCBiYW5rU2VsKTsgKi8KLQotCXdyaXRlbCh2YWx1ZSwgY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfQ0ZHKTsKLQl3cml0ZWwoMCwgY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfQUREUik7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV93cml0ZV9sZW5zX3JvbGxfb2ZmX3RhYmxlKHN0cnVjdCB2ZmVfY21kX3JvbGxfb2ZmX2NvbmZpZyAqaW4pCi17Ci0JdWludDE2X3QgaTsKLQl1aW50MzJfdCBkYXRhOwotCi0JdWludDE2X3QgKmluaXRHciA9IGluLT5pbml0VGFibGVHcjsKLQl1aW50MTZfdCAqaW5pdEdiID0gaW4tPmluaXRUYWJsZUdiOwotCXVpbnQxNl90ICppbml0QiA9ICBpbi0+aW5pdFRhYmxlQjsKLQl1aW50MTZfdCAqaW5pdFIgPSAgaW4tPmluaXRUYWJsZVI7Ci0KLQlpbnQxNl90ICpwRGVsdGFHciA9IGluLT5kZWx0YVRhYmxlR3I7Ci0JaW50MTZfdCAqcERlbHRhR2IgPSBpbi0+ZGVsdGFUYWJsZUdiOwotCWludDE2X3QgKnBEZWx0YUIgPSAgaW4tPmRlbHRhVGFibGVCOwotCWludDE2X3QgKnBEZWx0YVIgPSAgaW4tPmRlbHRhVGFibGVSOwotCi0JdmZlX3Byb2dyYW1fZG1pX2NmZyhST0xMT0ZGX1JBTSk7Ci0KLQkvKiBmaXJzdCBwYWNrIGFuZCB3cml0ZSBpbml0IHRhYmxlICovCi0JZm9yIChpID0gMDsgaSA8IFZGRV9ST0xMX09GRl9JTklUX1RBQkxFX1NJWkU7IGkrKykgewotCQlkYXRhID0gKCgodWludDMyX3QpKCppbml0UikpICYgMHgwMDAwRkZGRikgfAotCQkJKCgodWludDMyX3QpKCppbml0R3IpKSA8PCAxNik7Ci0JCWluaXRSKys7Ci0JCWluaXRHcisrOwotCi0JCXdyaXRlbChkYXRhLCBjdHJsLT52ZmViYXNlICsgVkZFX0RNSV9EQVRBX0xPKTsKLQotCQlkYXRhID0gKCgodWludDMyX3QpKCppbml0QikpICYgMHgwMDAwRkZGRikgfAotCQkJKCgodWludDMyX3QpKCppbml0R2IpKTw8MTYpOwotCQlpbml0QisrOwotCQlpbml0R2IrKzsKLQotCQl3cml0ZWwoZGF0YSwgY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfREFUQV9MTyk7Ci0JfQotCi0JLyogdGhlcmUgYXJlIGdhcHMgYmV0d2VlbiB0aGUgaW5pdCB0YWJsZSBhbmQgZGVsdGEgdGFibGUsCi0JICogc2V0IHRoZSBvZmZzZXQgZm9yIGRlbHRhIHRhYmxlLiAqLwotCXdyaXRlbChMRU5TX1JPTExfT0ZGX0RFTFRBX1RBQkxFX09GRlNFVCwgY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfQUREUik7Ci0KLQkvKiBwYWNrIGFuZCB3cml0ZSBkZWx0YSB0YWJsZSAqLwotCWZvciAoaSA9IDA7IGkgPCBWRkVfUk9MTF9PRkZfREVMVEFfVEFCTEVfU0laRTsgaSsrKSB7Ci0JCWRhdGEgPSAoKChpbnQpKCpwRGVsdGFSKSkgJiAweDAwMDBGRkZGKSB8Ci0JCQkoKChpbnQpKCpwRGVsdGFHcikpPDwxNik7Ci0JCXBEZWx0YVIrKzsKLQkJcERlbHRhR3IrKzsKLQotCQl3cml0ZWwoZGF0YSwgY3RybC0+dmZlYmFzZSArIFZGRV9ETUlfREFUQV9MTyk7Ci0KLQkJZGF0YSA9ICgoKGludCkoKnBEZWx0YUIpKSAmIDB4MDAwMEZGRkYpIHwKLQkJCSgoKGludCkoKnBEZWx0YUdiKSk8PDE2KTsKLQkJcERlbHRhQisrOwotCQlwRGVsdGFHYisrOwotCi0JCXdyaXRlbChkYXRhLCBjdHJsLT52ZmViYXNlICsgVkZFX0RNSV9EQVRBX0xPKTsKLQl9Ci0KLQkvKiBBZnRlciBETUkgdHJhbnNmZXIsIHRvIG1ha2UgaXQgc2FmZSwgbmVlZCB0byBzZXQgdGhlCi0JICogRE1JX0NGRyB0byB1bnNlbGVjdCBhbnkgU1JBTQotCSAqLwotCS8qIHVuc2VsZWN0IHRoZSBTUkFNIEJhbmsuICovCi0Jd3JpdGVsKFZGRV9ETUlfQ0ZHX0RFRkFVTFQsIGN0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0NGRyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9zZXRfZGVmYXVsdF9yZWdfdmFsdWVzKHZvaWQpCi17Ci0Jd3JpdGVsKDB4ODAwMDgwLCBjdHJsLT52ZmViYXNlICsgVkZFX0RFTVVYX0dBSU5fMCk7Ci0Jd3JpdGVsKDB4ODAwMDgwLCBjdHJsLT52ZmViYXNlICsgVkZFX0RFTVVYX0dBSU5fMSk7Ci0Jd3JpdGVsKDB4RkZGRkYsIGN0cmwtPnZmZWJhc2UgKyBWRkVfQ0dDX09WRVJSSURFKTsKLQotCS8qIGRlZmF1bHQgZnJhbWUgZHJvcCBwZXJpb2QgYW5kIHBhdHRlcm4gKi8KLQl3cml0ZWwoMHgxZiwgY3RybC0+dmZlYmFzZSArIFZGRV9GUkFNRURST1BfRU5DX1lfQ0ZHKTsKLQl3cml0ZWwoMHgxZiwgY3RybC0+dmZlYmFzZSArIFZGRV9GUkFNRURST1BfRU5DX0NCQ1JfQ0ZHKTsKLQl3cml0ZWwoMHhGRkZGRkZGRiwgY3RybC0+dmZlYmFzZSArIFZGRV9GUkFNRURST1BfRU5DX1lfUEFUVEVSTik7Ci0Jd3JpdGVsKDB4RkZGRkZGRkYsIGN0cmwtPnZmZWJhc2UgKyBWRkVfRlJBTUVEUk9QX0VOQ19DQkNSX1BBVFRFUk4pOwotCXdyaXRlbCgweDFmLCBjdHJsLT52ZmViYXNlICsgVkZFX0ZSQU1FRFJPUF9WSUVXX1lfQ0ZHKTsKLQl3cml0ZWwoMHgxZiwgY3RybC0+dmZlYmFzZSArIFZGRV9GUkFNRURST1BfVklFV19DQkNSX0NGRyk7Ci0Jd3JpdGVsKDB4RkZGRkZGRkYsIGN0cmwtPnZmZWJhc2UgKyBWRkVfRlJBTUVEUk9QX1ZJRVdfWV9QQVRURVJOKTsKLQl3cml0ZWwoMHhGRkZGRkZGRiwgY3RybC0+dmZlYmFzZSArIFZGRV9GUkFNRURST1BfVklFV19DQkNSX1BBVFRFUk4pOwotCXdyaXRlbCgwLCBjdHJsLT52ZmViYXNlICsgVkZFX0NMQU1QX01JTl9DRkcpOwotCXdyaXRlbCgweEZGRkZGRiwgY3RybC0+dmZlYmFzZSArIFZGRV9DTEFNUF9NQVhfQ0ZHKTsKLX0KLQotc3RhdGljIHZvaWQgdmZlX2NvbmZpZ19kZW11eCh1aW50MzJfdCBwZXJpb2QsIHVpbnQzMl90IGV2ZW4sIHVpbnQzMl90IG9kZCkKLXsKLQl3cml0ZWwocGVyaW9kLCBjdHJsLT52ZmViYXNlICsgVkZFX0RFTVVYX0NGRyk7Ci0Jd3JpdGVsKGV2ZW4sIGN0cmwtPnZmZWJhc2UgKyBWRkVfREVNVVhfRVZFTl9DRkcpOwotCXdyaXRlbChvZGQsIGN0cmwtPnZmZWJhc2UgKyBWRkVfREVNVVhfT0REX0NGRyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9wbV9zdG9wKHZvaWQpCi17Ci0Jd3JpdGVsKFZGRV9QRVJGT1JNQU5DRV9NT05JVE9SX1NUT1AsIGN0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1BNX0NNRCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9jYW1pZl9zdG9wX2ltbWVkaWF0ZWx5KHZvaWQpCi17Ci0Jd3JpdGVsKENBTUlGX0NPTU1BTkRfU1RPUF9JTU1FRElBVEVMWSwgY3RybC0+dmZlYmFzZSArIENBTUlGX0NPTU1BTkQpOwotCXdyaXRlbCgwLCBjdHJsLT52ZmViYXNlICsgVkZFX0NHQ19PVkVSUklERSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9wcm9ncmFtX3JlZ191cGRhdGVfY21kKHVpbnQzMl90IHZhbHVlKQotewotCXdyaXRlbCh2YWx1ZSwgY3RybC0+dmZlYmFzZSArIFZGRV9SRUdfVVBEQVRFX0NNRCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9wcm9ncmFtX2dsb2JhbF9yZXNldF9jbWQodWludDMyX3QgdmFsdWUpCi17Ci0Jd3JpdGVsKHZhbHVlLCBjdHJsLT52ZmViYXNlICsgVkZFX0dMT0JBTF9SRVNFVF9DTUQpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfcHJvZ3JhbV9heGlfY21kKHVpbnQzMl90IHZhbHVlKQotewotCXdyaXRlbCh2YWx1ZSwgY3RybC0+dmZlYmFzZSArIFZGRV9BWElfQ01EKTsKLX0KLQotc3RhdGljIHZvaWQgdmZlX3Byb2dyYW1faXJxX2NvbXBvc2l0ZV9tYXNrKHVpbnQzMl90IHZhbHVlKQotewotCXdyaXRlbCh2YWx1ZSwgY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ09NUE9TSVRFX01BU0spOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdmZlX3Byb2dyYW1faXJxX21hc2sodWludDMyX3QgdmFsdWUpCi17Ci0Jd3JpdGVsKHZhbHVlLCBjdHJsLT52ZmViYXNlICsgVkZFX0lSUV9NQVNLKTsKLX0KLQotc3RhdGljIHVpbnQzMl90IHZmZV9yZWFkX2F4aV9zdGF0dXModm9pZCkKLXsKLQlyZXR1cm4gcmVhZGwoY3RybC0+dmZlYmFzZSArIFZGRV9BWElfU1RBVFVTKTsKLX0KLQotc3RhdGljIHZvaWQKLXZmZV9zZXRfc3RhdHNfcGluZ3BvbmdfYWRkcmVzcyhzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wgKmFmQ29udHJvbCwKLQlzdHJ1Y3QgdmZlX3N0YXRzX2NvbnRyb2wgKmF3YkNvbnRyb2wpCi17Ci0JYWZDb250cm9sLT5od1JlZ1BpbmdBZGRyZXNzID0gKHVpbnQ4X3QgKikKLQkJKGN0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX0FGX1dSX1BJTkdfQUREUik7Ci0JYWZDb250cm9sLT5od1JlZ1BvbmdBZGRyZXNzID0gKHVpbnQ4X3QgKikKLQkJKGN0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX0FGX1dSX1BPTkdfQUREUik7Ci0KLQlhd2JDb250cm9sLT5od1JlZ1BpbmdBZGRyZXNzID0gKHVpbnQ4X3QgKikKLQkJKGN0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX0FXQl9XUl9QSU5HX0FERFIpOwotCWF3YkNvbnRyb2wtPmh3UmVnUG9uZ0FkZHJlc3MgPSAodWludDhfdCAqKQotCQkoY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfQVdCX1dSX1BPTkdfQUREUik7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9wcm9ncmFtX2x1dF9iYW5rX3NlbChzdHJ1Y3QgdmZlX2dhbW1hX2x1dF9zZWwgKmluKQotewotCXN0cnVjdCBWRkVfR2FtbWFMdXRTZWxlY3RfQ29uZmlnQ21kVHlwZSBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCi0JY21kLmNoMEJhbmtTZWxlY3QgPSBpbi0+Y2gwQmFua1NlbGVjdDsKLQljbWQuY2gxQmFua1NlbGVjdCA9IGluLT5jaDFCYW5rU2VsZWN0OwotCWNtZC5jaDJCYW5rU2VsZWN0ID0gaW4tPmNoMkJhbmtTZWxlY3Q7Ci0JQ0RCRygiVkZFIGdhbW1hIGx1dCBiYW5rIHNlbGVjdGlvbiBpcyAweCV4XG4iLCAqKCh1aW50MzJfdCAqKSZjbWQpKTsKLQl2ZmVfcHJvZ19odyhjdHJsLT52ZmViYXNlICsgVkZFX0xVVF9CQU5LX1NFTCwKLQkJKHVpbnQzMl90ICopJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfcHJvZ3JhbV9zdGF0c19jbWQoc3RydWN0IHZmZV9zdGF0c19jbWRfZGF0YSAqaW4pCi17Ci0Jc3RydWN0IFZGRV9TdGF0c0NtZFR5cGUgc3RhdHM7Ci0JbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7Ci0KLQlzdGF0cy5hdXRvRm9jdXNFbmFibGUgICAgICAgID0gaW4tPmF1dG9Gb2N1c0VuYWJsZTsKLQlzdGF0cy5heHdFbmFibGUgICAgICAgICAgICAgID0gaW4tPmF4d0VuYWJsZTsKLQlzdGF0cy5oaXN0RW5hYmxlICAgICAgICAgICAgID0gaW4tPmhpc3RFbmFibGU7Ci0Jc3RhdHMuY2xlYXJIaXN0RW5hYmxlICAgICAgICA9IGluLT5jbGVhckhpc3RFbmFibGU7Ci0Jc3RhdHMuaGlzdEF1dG9DbGVhckVuYWJsZSAgICA9IGluLT5oaXN0QXV0b0NsZWFyRW5hYmxlOwotCXN0YXRzLmNvbG9yQ29udmVyc2lvbkVuYWJsZSAgPSBpbi0+Y29sb3JDb252ZXJzaW9uRW5hYmxlOwotCi0Jd3JpdGVsKCooKHVpbnQzMl90ICopJnN0YXRzKSwgY3RybC0+dmZlYmFzZSArIFZGRV9TVEFUU19DTUQpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfcG1fc3RhcnQoc3RydWN0IHZmZV9jbWRfYnVzX3BtX3N0YXJ0ICppbikKLXsKLQlzdHJ1Y3QgVkZFX0J1c19QbV9Db25maWdDbWRUeXBlIGNtZDsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBWRkVfQnVzX1BtX0NvbmZpZ0NtZFR5cGUpKTsKLQotCWNtZC5vdXRwdXQyWVdyUG1FbmFibGUgICAgID0gaW4tPm91dHB1dDJZV3JQbUVuYWJsZTsKLQljbWQub3V0cHV0MkNiY3JXclBtRW5hYmxlICA9IGluLT5vdXRwdXQyQ2JjcldyUG1FbmFibGU7Ci0JY21kLm91dHB1dDFZV3JQbUVuYWJsZSAgICAgPSBpbi0+b3V0cHV0MVlXclBtRW5hYmxlOwotCWNtZC5vdXRwdXQxQ2JjcldyUG1FbmFibGUgID0gaW4tPm91dHB1dDFDYmNyV3JQbUVuYWJsZTsKLQotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1BNX0NGRywKLQkJKHVpbnQzMl90ICopJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfOGtfcG1fc3RhcnQoc3RydWN0IHZmZV9jbWRfYnVzX3BtX3N0YXJ0ICppbikKLXsKLQlpbi0+b3V0cHV0MUNiY3JXclBtRW5hYmxlID0gY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwudmlld0NiY3JXclBhdGhFbjsKLQlpbi0+b3V0cHV0MVlXclBtRW5hYmxlICAgID0gY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwudmlld1lXclBhdGhFbjsKLQlpbi0+b3V0cHV0MkNiY3JXclBtRW5hYmxlID0gY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwuZW5jQ2JjcldyUGF0aEVuOwotCWluLT5vdXRwdXQyWVdyUG1FbmFibGUgICAgPSBjdHJsLT52ZmVCdXNDb25maWdMb2NhbC5lbmNZV3JQYXRoRW47Ci0KLQlpZiAoaW4tPm91dHB1dDFDYmNyV3JQbUVuYWJsZSB8fCBpbi0+b3V0cHV0MVlXclBtRW5hYmxlKQotCQljdHJsLT52aWV3UGF0aC5wbUVuYWJsZWQgPSBUUlVFOwotCi0JaWYgKGluLT5vdXRwdXQyQ2JjcldyUG1FbmFibGUgfHwgaW4tPm91dHB1dDJZV3JQbUVuYWJsZSkKLQkJY3RybC0+ZW5jUGF0aC5wbUVuYWJsZWQgPSBUUlVFOwotCi0JdmZlX3BtX3N0YXJ0KGluKTsKLQotCXdyaXRlbChWRkVfUEVSRk9STUFOQ0VfTU9OSVRPUl9HTywgY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfUE1fQ01EKTsKLX0KLQotc3RhdGljIHVpbnQzMl90IHZmZV9pcnFfcGFjayhzdHJ1Y3QgdmZlX2ludGVycnVwdF9tYXNrIGRhdGEpCi17Ci0Jc3RydWN0IHZmZV9pcnFlbmFibGUgcGFja2VkRGF0YTsKLQotCW1lbXNldCgmcGFja2VkRGF0YSwgMCwgc2l6ZW9mKHBhY2tlZERhdGEpKTsKLQotCXBhY2tlZERhdGEuY2FtaWZFcnJvcklycSAgICAgICAgICA9IGRhdGEuY2FtaWZFcnJvcklycTsKLQlwYWNrZWREYXRhLmNhbWlmU29mSXJxICAgICAgICAgICAgPSBkYXRhLmNhbWlmU29mSXJxOwotCXBhY2tlZERhdGEuY2FtaWZFb2xJcnEgICAgICAgICAgICA9IGRhdGEuY2FtaWZFb2xJcnE7Ci0JcGFja2VkRGF0YS5jYW1pZkVvZklycSAgICAgICAgICAgID0gZGF0YS5jYW1pZkVvZklycTsKLQlwYWNrZWREYXRhLmNhbWlmRXBvY2gxSXJxICAgICAgICAgPSBkYXRhLmNhbWlmRXBvY2gxSXJxOwotCXBhY2tlZERhdGEuY2FtaWZFcG9jaDJJcnEgICAgICAgICA9IGRhdGEuY2FtaWZFcG9jaDJJcnE7Ci0JcGFja2VkRGF0YS5jYW1pZk92ZXJmbG93SXJxICAgICAgID0gZGF0YS5jYW1pZk92ZXJmbG93SXJxOwotCXBhY2tlZERhdGEuY2VJcnEgICAgICAgICAgICAgICAgICA9IGRhdGEuY2VJcnE7Ci0JcGFja2VkRGF0YS5yZWdVcGRhdGVJcnEgICAgICAgICAgID0gZGF0YS5yZWdVcGRhdGVJcnE7Ci0JcGFja2VkRGF0YS5yZXNldEFja0lycSAgICAgICAgICAgID0gZGF0YS5yZXNldEFja0lycTsKLQlwYWNrZWREYXRhLmVuY1lQaW5ncG9uZ0lycSAgICAgICAgPSBkYXRhLmVuY1lQaW5ncG9uZ0lycTsKLQlwYWNrZWREYXRhLmVuY0NiY3JQaW5ncG9uZ0lycSAgICAgPSBkYXRhLmVuY0NiY3JQaW5ncG9uZ0lycTsKLQlwYWNrZWREYXRhLnZpZXdZUGluZ3BvbmdJcnEgICAgICAgPSBkYXRhLnZpZXdZUGluZ3BvbmdJcnE7Ci0JcGFja2VkRGF0YS52aWV3Q2JjclBpbmdwb25nSXJxICAgID0gZGF0YS52aWV3Q2JjclBpbmdwb25nSXJxOwotCXBhY2tlZERhdGEucmRQaW5ncG9uZ0lycSAgICAgICAgICA9IGRhdGEucmRQaW5ncG9uZ0lycTsKLQlwYWNrZWREYXRhLmFmUGluZ3BvbmdJcnEgICAgICAgICAgPSBkYXRhLmFmUGluZ3BvbmdJcnE7Ci0JcGFja2VkRGF0YS5hd2JQaW5ncG9uZ0lycSAgICAgICAgID0gZGF0YS5hd2JQaW5ncG9uZ0lycTsKLQlwYWNrZWREYXRhLmhpc3RQaW5ncG9uZ0lycSAgICAgICAgPSBkYXRhLmhpc3RQaW5ncG9uZ0lycTsKLQlwYWNrZWREYXRhLmVuY0lycSAgICAgICAgICAgICAgICAgPSBkYXRhLmVuY0lycTsKLQlwYWNrZWREYXRhLnZpZXdJcnEgICAgICAgICAgICAgICAgPSBkYXRhLnZpZXdJcnE7Ci0JcGFja2VkRGF0YS5idXNPdmVyZmxvd0lycSAgICAgICAgID0gZGF0YS5idXNPdmVyZmxvd0lycTsKLQlwYWNrZWREYXRhLmFmT3ZlcmZsb3dJcnEgICAgICAgICAgPSBkYXRhLmFmT3ZlcmZsb3dJcnE7Ci0JcGFja2VkRGF0YS5hd2JPdmVyZmxvd0lycSAgICAgICAgID0gZGF0YS5hd2JPdmVyZmxvd0lycTsKLQlwYWNrZWREYXRhLnN5bmNUaW1lcjBJcnEgICAgICAgICAgPSBkYXRhLnN5bmNUaW1lcjBJcnE7Ci0JcGFja2VkRGF0YS5zeW5jVGltZXIxSXJxICAgICAgICAgID0gZGF0YS5zeW5jVGltZXIxSXJxOwotCXBhY2tlZERhdGEuc3luY1RpbWVyMklycSAgICAgICAgICA9IGRhdGEuc3luY1RpbWVyMklycTsKLQlwYWNrZWREYXRhLmFzeW5jVGltZXIwSXJxICAgICAgICAgPSBkYXRhLmFzeW5jVGltZXIwSXJxOwotCXBhY2tlZERhdGEuYXN5bmNUaW1lcjFJcnEgICAgICAgICA9IGRhdGEuYXN5bmNUaW1lcjFJcnE7Ci0JcGFja2VkRGF0YS5hc3luY1RpbWVyMklycSAgICAgICAgID0gZGF0YS5hc3luY1RpbWVyMklycTsKLQlwYWNrZWREYXRhLmFzeW5jVGltZXIzSXJxICAgICAgICAgPSBkYXRhLmFzeW5jVGltZXIzSXJxOwotCXBhY2tlZERhdGEuYXhpRXJyb3JJcnEgICAgICAgICAgICA9IGRhdGEuYXhpRXJyb3JJcnE7Ci0JcGFja2VkRGF0YS52aW9sYXRpb25JcnEgICAgICAgICAgID0gZGF0YS52aW9sYXRpb25JcnE7Ci0KLQlyZXR1cm4gKigodWludDMyX3QgKikmcGFja2VkRGF0YSk7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdAotdmZlX2lycV9jb21wb3NpdGVfcGFjayhzdHJ1Y3QgdmZlX2lycV9jb21wb3NpdGVfbWFza19jb25maWcgZGF0YSkKLXsKLQlzdHJ1Y3QgVkZFX0lycV9Db21wb3NpdGVfTWFza1R5cGUgcGFja2VkRGF0YTsKLQotCW1lbXNldCgmcGFja2VkRGF0YSwgMCwgc2l6ZW9mKHBhY2tlZERhdGEpKTsKLQotCXBhY2tlZERhdGEuZW5jSXJxQ29tTWFza0JpdHMgICA9IGRhdGEuZW5jSXJxQ29tTWFzazsKLQlwYWNrZWREYXRhLnZpZXdJcnFDb21NYXNrQml0cyAgPSBkYXRhLnZpZXdJcnFDb21NYXNrOwotCXBhY2tlZERhdGEuY2VEb25lU2VsQml0cyAgICAgICA9IGRhdGEuY2VEb25lU2VsOwotCi0JcmV0dXJuICooKHVpbnQzMl90ICopJnBhY2tlZERhdGEpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfYWRkcl9jb252ZXJ0KHN0cnVjdCBtc21fdmZlX3BoeV9pbmZvICpwaW5mbywKLQkJCQllbnVtIHZmZV9yZXNwX21zZyB0eXBlLCB2b2lkICpkYXRhLCB2b2lkICoqZXh0LAotCQkJCWludCAqZWxlbikKLXsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIFZGRV9NU0dfT1VUUFVUX1A6Ci0JY2FzZSBWRkVfTVNHX09VVFBVVF9WOnsKLQkJcGluZm8tPnBsYW5hcjBfb2ZmID0KLQkJCSgoc3RydWN0IHZmZV9tZXNzYWdlICopZGF0YSktPl91Lm1zZ091dHB1dDIueUJ1ZmZlcjsKLQkJcGluZm8tPnBsYW5hcjFfb2ZmID0KLQkJCSgoc3RydWN0IHZmZV9tZXNzYWdlICopZGF0YSktPl91Lm1zZ091dHB1dDIuCi0JCQljYmNyQnVmZmVyOwotCQlwaW5mby0+cGxhbmFyMl9vZmYgPSBwaW5mby0+cGxhbmFyMF9vZmY7Ci0JCWN0cmwtPmV4dGRhdGEuYnBjSW5mbyA9Ci0JCQkoKHN0cnVjdCB2ZmVfbWVzc2FnZSAqKWRhdGEpLT5fdS5tc2dPdXRwdXQyLmJwY0luZm87Ci0JCWN0cmwtPmV4dGRhdGEuYXNmSW5mbyA9Ci0JCQkoKHN0cnVjdCB2ZmVfbWVzc2FnZSAqKWRhdGEpLT5fdS5tc2dPdXRwdXQyLmFzZkluZm87Ci0JCWN0cmwtPmV4dGRhdGEuZnJhbWVDb3VudGVyID0KLQkJCSgoc3RydWN0IHZmZV9tZXNzYWdlICopZGF0YSktPl91Lm1zZ091dHB1dDIuCi0JCQlmcmFtZUNvdW50ZXI7Ci0JCWN0cmwtPmV4dGRhdGEucG1EYXRhID0KLQkJKChzdHJ1Y3QgdmZlX21lc3NhZ2UgKilkYXRhKS0+X3UubXNnT3V0cHV0Mi5wbURhdGE7Ci0JCSpleHQgPSAmY3RybC0+ZXh0ZGF0YTsKLQkJKmVsZW4gPSBzaXplb2YoY3RybC0+ZXh0ZGF0YSk7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgVkZFX01TR19TVEFUU19BRjoKLQkJcGluZm8tPnNidWZfcGh5ID0KLQkJKChzdHJ1Y3QgdmZlX21lc3NhZ2UgKilkYXRhKS0+X3UubXNnU3RhdHNBZi5hZkJ1ZmZlcjsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9NU0dfU1RBVFNfV0U6Ci0JCXBpbmZvLT5zYnVmX3BoeSA9Ci0JCSgoc3RydWN0IHZmZV9tZXNzYWdlICopZGF0YSktPl91Lm1zZ1N0YXRzV2JFeHAuYXdiQnVmZmVyOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0gLyogc3dpdGNoICovCi19Ci0KLXN0YXRpYyBib29sZWFuIHZmZV9zZW5kX3ByZXZpZXdfbXNnKHN0cnVjdCBtc21fdmZlX3Jlc3AgKnJwLAotCQkJc3RydWN0IHZmZV9tZXNzYWdlICptc2csIHZvaWQgKmRhdGEpOwotc3RhdGljIGJvb2xlYW4gdmZlX3NlbmRfdmlkZW9fbXNnKHN0cnVjdCBtc21fdmZlX3Jlc3AgKnJwLAotCQkJc3RydWN0IHZmZV9tZXNzYWdlICptc2csIHZvaWQgKmRhdGEpOwotc3RhdGljIGJvb2xlYW4gdmZlX3NlbmRfbWFpbmltYWdlX21zZyhzdHJ1Y3QgbXNtX3ZmZV9yZXNwICpycCwKLQkJCXN0cnVjdCB2ZmVfbWVzc2FnZSAqbXNnLCB2b2lkICpkYXRhKTsKLXN0YXRpYyBib29sZWFuIHZmZV9zZW5kX3RodW1ibmFpbF9tc2coc3RydWN0IG1zbV92ZmVfcmVzcCAqcnAsCi0JCQlzdHJ1Y3QgdmZlX21lc3NhZ2UgKm1zZywgdm9pZCAqZGF0YSk7Ci1zdGF0aWMgYm9vbGVhbiB2ZmVfc2VuZF9hZl9zdGF0c19tc2coc3RydWN0IG1zbV92ZmVfcmVzcCAqcnAsCi0JCQlzdHJ1Y3QgdmZlX21lc3NhZ2UgKm1zZywgdm9pZCAqZGF0YSk7Ci1zdGF0aWMgYm9vbGVhbiB2ZmVfc2VuZF9hd2Jfc3RhdHNfbXNnKHN0cnVjdCBtc21fdmZlX3Jlc3AgKnJwLAotCQkJc3RydWN0IHZmZV9tZXNzYWdlICptc2csIHZvaWQgKmRhdGEpOwotc3RhdGljIGJvb2xlYW4gdmZlX3NlbmRfY2FtaWZfZXJyb3JfbXNnKHN0cnVjdCBtc21fdmZlX3Jlc3AgKnJwLAotCQkJc3RydWN0IHZmZV9tZXNzYWdlICptc2csIHZvaWQgKmRhdGEpOwotc3RhdGljIGJvb2xlYW4gdmZlX3NlbmRfYnVzX292ZXJmbG93X21zZyhzdHJ1Y3QgbXNtX3ZmZV9yZXNwICpycCwKLQkJCXN0cnVjdCB2ZmVfbWVzc2FnZSAqbXNnLCB2b2lkICpkYXRhKTsKLXN0YXRpYyBib29sZWFuIHZmZV9zZW5kX3NvZl9tc2coc3RydWN0IG1zbV92ZmVfcmVzcCAqcnAsCi0JCQlzdHJ1Y3QgdmZlX21lc3NhZ2UgKm1zZywgdm9pZCAqZGF0YSk7Ci0KLXN0YXRpYyBib29sZWFuIGludmFsaWQoc3RydWN0IG1zbV92ZmVfcmVzcCAqcnAsCi0JCXN0cnVjdCB2ZmVfbWVzc2FnZSAqX20sIHZvaWQgKl9kKQotewotCUJVR19PTigxKTsgLyogdGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZC4gKi8KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgewotCWJvb2xlYW4gKCpmbikoc3RydWN0IG1zbV92ZmVfcmVzcCAqcnAsIHN0cnVjdCB2ZmVfbWVzc2FnZSAqbXNnLAotCQl2b2lkICpkYXRhKTsKLQllbnVtIHZmZV9yZXNwX21zZyBydDsgLyogcmVwb25zZSB0eXBlICovCi19IHZmZV9mdW5jc1tdID0gewotCVtWRkVfTVNHX0lEX1JFU0VUX0FDS10gPSB7IE5VTEwsIFZGRV9NU0dfR0VORVJBTCB9LAotCVtWRkVfTVNHX0lEX1NUQVJUX0FDS10gPSB7IE5VTEwsIFZGRV9NU0dfR0VORVJBTCB9LAotCVtWRkVfTVNHX0lEX1NUT1BfQUNLXSA9IHsgTlVMTCwgVkZFX01TR19HRU5FUkFMIH0sCi0JW1ZGRV9NU0dfSURfVVBEQVRFX0FDS10gPSB7IE5VTEwsIFZGRV9NU0dfR0VORVJBTCB9LAotCVtWRkVfTVNHX0lEX09VVFBVVF9QXSA9IHsgdmZlX3NlbmRfcHJldmlld19tc2csIFZGRV9NU0dfT1VUUFVUX1AgfSwKLQlbVkZFX01TR19JRF9PVVRQVVRfVl0gPSB7IHZmZV9zZW5kX3ZpZGVvX21zZywgVkZFX01TR19PVVRQVVRfViB9LAotCVtWRkVfTVNHX0lEX09VVFBVVF9TXSA9IHsgdmZlX3NlbmRfbWFpbmltYWdlX21zZywgVkZFX01TR19PVVRQVVRfUyB9LAotCVtWRkVfTVNHX0lEX09VVFBVVF9UXSA9IHsgdmZlX3NlbmRfdGh1bWJuYWlsX21zZywgVkZFX01TR19PVVRQVVRfVCB9LAotCVtWRkVfTVNHX0lEX1NOQVBTSE9UX0RPTkVdID0geyBOVUxMLCBWRkVfTVNHX1NOQVBTSE9UIH0sCi0JW1ZGRV9NU0dfSURfU1RBVFNfQVVUT0ZPQ1VTXSA9IHsgdmZlX3NlbmRfYWZfc3RhdHNfbXNnLAotCQlWRkVfTVNHX1NUQVRTX0FGIH0sCi0JW1ZGRV9NU0dfSURfU1RBVFNfV0JfRVhQXSA9IHsgdmZlX3NlbmRfYXdiX3N0YXRzX21zZywKLQkJVkZFX01TR19TVEFUU19XRSB9LAotCVtWRkVfTVNHX0lEX0VQT0NIMV0gPSB7IE5VTEwsIFZGRV9NU0dfR0VORVJBTCB9LAotCVtWRkVfTVNHX0lEX0VQT0NIMl0gPSB7IE5VTEwsIFZGRV9NU0dfR0VORVJBTCB9LAotCVtWRkVfTVNHX0lEX1NZTkNfVElNRVIwX0RPTkVdID0geyBpbnZhbGlkIH0sCi0JW1ZGRV9NU0dfSURfU1lOQ19USU1FUjFfRE9ORV0gPSB7IGludmFsaWQgfSwKLQlbVkZFX01TR19JRF9TWU5DX1RJTUVSMl9ET05FXSA9IHsgaW52YWxpZCB9LAotCVtWRkVfTVNHX0lEX0FTWU5DX1RJTUVSMF9ET05FXSA9IHsgaW52YWxpZCB9LAotCVtWRkVfTVNHX0lEX0FTWU5DX1RJTUVSMV9ET05FXSA9IHsgaW52YWxpZCB9LAotCVtWRkVfTVNHX0lEX0FTWU5DX1RJTUVSMl9ET05FXSA9IHsgaW52YWxpZCB9LAotCVtWRkVfTVNHX0lEX0FTWU5DX1RJTUVSM19ET05FXSA9IHsgaW52YWxpZCB9LAotCVtWRkVfTVNHX0lEX0FGX09WRVJGTE9XXSA9IHsgTlVMTCwgVkZFX01TR19HRU5FUkFMIH0sCi0JW1ZGRV9NU0dfSURfQVdCX09WRVJGTE9XXSA9IHsgTlVMTCwgVkZFX01TR19HRU5FUkFMIH0sCi0JW1ZGRV9NU0dfSURfQVhJX0VSUk9SXSA9IHsgTlVMTCwgVkZFX01TR19HRU5FUkFMIH0sCi0JW1ZGRV9NU0dfSURfQ0FNSUZfT1ZFUkZMT1ddID0geyBOVUxMLCBWRkVfTVNHX0dFTkVSQUwgfSwKLQlbVkZFX01TR19JRF9WSU9MQVRJT05dID0geyBpbnZhbGlkIH0sCi0JW1ZGRV9NU0dfSURfQ0FNSUZfRVJST1JdID0geyB2ZmVfc2VuZF9jYW1pZl9lcnJvcl9tc2csCi0JCVZGRV9NU0dfR0VORVJBTCB9LAotCVtWRkVfTVNHX0lEX0JVU19PVkVSRkxPV10gPSB7IHZmZV9zZW5kX2J1c19vdmVyZmxvd19tc2csCi0JCVZGRV9NU0dfR0VORVJBTCB9LAotCVtWRkVfTVNHX0lEX1NPRl9BQ0tdID0geyB2ZmVfc2VuZF9zb2ZfbXNnLAotCQlWRkVfTVNHX0dFTkVSQUwgfSwKLX07Ci0KLXN0YXRpYyB2b2lkIHZmZV9wcm9jX29wcyhlbnVtIFZGRV9NRVNTQUdFX0lEIGlkLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBtc21fdmZlX3Jlc3AgKnJwOwotCXN0cnVjdCB2ZmVfbWVzc2FnZSAqbXNnOwotCi0JaWYgKGlkID49IEFSUkFZX1NJWkUodmZlX2Z1bmNzKSB8fCB2ZmVfZnVuY3NbaWRdLmZuID09IGludmFsaWQpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBWRkUgbWVzc2FnZSBpZCAlZFxuIiwgX19mdW5jX18sIGlkKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIEluIDhrLCBPVVRQVVQxICYgT1VUUFVUMiBtZXNzYWdlcyBhcnJpdmUgYmVmb3JlIFNOQVBTSE9UX0RPTkUuCi0JICogV2UgZG9uJ3Qgc2VuZCBzdWNoIG1lc3NhZ2VzIHRvIHRoZSB1c2VyLiAgTm90ZSB0aGF0IHdlIGNhbiBkbwotCSAqIHRoaXMgaW4gdGhlIHZmZV9mdW5jW10gY2FsbGJhY2ssIGJ1dCB0aGF0IHdvdWxkIGNhdXNlIHVzIHRvCi0JICogYWxsb2NhdGUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgZnJlZSB0aGUgbXNtX3ZmZV9yZXNwIHN0cnVjdHVyZSwKLQkgKiB3aGljaCBpcyB3YXN0ZWZ1bC4KLQkgKi8KLQlpZiAoKGN0cmwtPnZmZU9wZXJhdGlvbk1vZGUgPT0gVkZFX1NUQVJUX09QRVJBVElPTl9NT0RFX1NOQVBTSE9UKSAmJgotCQkJKGlkID09IFZGRV9NU0dfSURfT1VUUFVUX1QgfHwKLQkJCSBpZCA9PSBWRkVfTVNHX0lEX09VVFBVVF9TKSkKLQkJcmV0dXJuOwotCi0JcnAgPSBjdHJsLT5yZXNwLT52ZmVfYWxsb2Moc2l6ZW9mKCpycCkgKwotCQkJCQkodmZlX2Z1bmNzW2lkXS5mbiA/IHNpemVvZigqbXNnKSA6IDApLAotCQkJCQljdHJsLT5zeW5jZGF0YSwKLQkJCQkJR0ZQX0FUT01JQyk7Ci0JaWYgKCFycCkgewotCQlwcl9lcnIoIiVzOiBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlycC0+dHlwZSA9IHZmZV9mdW5jc1tpZF0ucnQ7Ci0JcnAtPmV2dF9tc2cudHlwZSA9IE1TTV9DQU1FUkFfTVNHOwotCXJwLT5ldnRfbXNnLm1zZ19pZCA9IGlkOwotCi0JaWYgKCF2ZmVfZnVuY3NbaWRdLmZuKSB7Ci0JCXJwLT5ldnRfbXNnLmxlbiA9IDA7Ci0JCXJwLT5ldnRfbXNnLmRhdGEgPSAwOwotCX0gZWxzZSB7Ci0JCS8qIHBvcHVsYXRlIHRoZSBtZXNzYWdlIGFjY29yZGluZ2x5ICovCi0JCWlmICh2ZmVfZnVuY3NbaWRdLmZuKQotCQkJcnAtPmV2dF9tc2cuZGF0YSA9IG1zZyA9Ci0JCQkJKHN0cnVjdCB2ZmVfbWVzc2FnZSAqKShycCArIDEpOwotCQllbHNlCi0JCQlycC0+ZXZ0X21zZy5kYXRhID0gbXNnID0gMDsKLQkJcnAtPmV2dF9tc2cubGVuID0gc2l6ZW9mKCptc2cpOwotCQltc2ctPl9kID0gaWQ7Ci0JCWlmICh2ZmVfZnVuY3NbaWRdLmZuKHJwLCBtc2csIGRhdGEpID09IEZBTFNFKSB7Ci0JCQlwcl93YXJuaW5nKCIlczogZnJlZWluZyBtZW1vcnk6IGhhbmRsZXIgZm9yICVkICIKLQkJCQkicmV0dXJuZWQgZmFsc2VcbiIsIF9fZnVuY19fLCBpZCk7Ci0JCQljdHJsLT5yZXNwLT52ZmVfZnJlZShycCk7Ci0JCQlyZXR1cm47Ci0JCX0KLX0KLQotCWN0cmwtPnJlc3AtPnZmZV9yZXNwKHJwLCBNU01fQ0FNX1FfVkZFX01TRywgY3RybC0+c3luY2RhdGEsIEdGUF9LRVJORUwpOwotfQotCi1zdGF0aWMgYm9vbGVhbiB2ZmVfc2VuZF9idXNfb3ZlcmZsb3dfbXNnKHN0cnVjdCBtc21fdmZlX3Jlc3AgKnJwLAotCQkJc3RydWN0IHZmZV9tZXNzYWdlICptc2csCi0JCQl2b2lkICpkYXRhKQotewotI2lmIDAKLQltZW1jcHkoJihtc2ctPl91Lm1zZ0J1c092ZXJmbG93KSwKLQkJJmN0cmwtPnZmZVBtRGF0YSwgc2l6ZW9mKGN0cmwtPnZmZVBtRGF0YSkpOwotI2VuZGlmCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLXN0YXRpYyBib29sZWFuIHZmZV9zZW5kX3NvZl9tc2coc3RydWN0IG1zbV92ZmVfcmVzcCAqcnAsCi0JCQlzdHJ1Y3QgdmZlX21lc3NhZ2UgKm1zZywKLQkJCXZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIFRSVUU7Ci19Ci1zdGF0aWMgYm9vbGVhbiB2ZmVfc2VuZF9jYW1pZl9lcnJvcl9tc2coc3RydWN0IG1zbV92ZmVfcmVzcCAqcnAsCi0JCQlzdHJ1Y3QgdmZlX21lc3NhZ2UgKm1zZywKLQkJCXZvaWQgKmRhdGEpCi17Ci0jaWYgMAotCW1lbWNweSgmKG1zZy0+X3UubXNnQ2FtaWZFcnJvciksCi0JICAgICAgICZjdHJsLT52ZmVDYW1pZlN0YXR1c0xvY2FsLCBzaXplb2YoY3RybC0+dmZlQ2FtaWZTdGF0dXNMb2NhbCkpOwotI2VuZGlmCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9wcm9jZXNzX2Vycm9yX2lycShzdHJ1Y3QgdmZlX2ludGVycnVwdF9zdGF0dXMgKmlycXN0YXR1cykKLXsKLQkvKiBhbGwgcG9zc2libGUgZXJyb3IgaXJxLiAgTm90ZSBlcnJvciBpcnFzIGFyZSBub3QgZW5hYmxlZCwgaXQgaXMKLQkgKiBjaGVja2VkIG9ubHkgd2hlbiBvdGhlciBpbnRlcnJ1cHRzIGFyZSBwcmVzZW50LiAqLwotCWlmIChpcnFzdGF0dXMtPmFmT3ZlcmZsb3dJcnEpCi0JCXZmZV9wcm9jX29wcyhWRkVfTVNHX0lEX0FGX09WRVJGTE9XLCBOVUxMKTsKLQotCWlmIChpcnFzdGF0dXMtPmF3Yk92ZXJmbG93SXJxKQotCQl2ZmVfcHJvY19vcHMoVkZFX01TR19JRF9BV0JfT1ZFUkZMT1csIE5VTEwpOwotCi0JaWYgKGlycXN0YXR1cy0+YXhpRXJyb3JJcnEpCi0JCXZmZV9wcm9jX29wcyhWRkVfTVNHX0lEX0FYSV9FUlJPUiwgTlVMTCk7Ci0KLQlpZiAoaXJxc3RhdHVzLT5idXNPdmVyZmxvd0lycSkKLQkJdmZlX3Byb2Nfb3BzKFZGRV9NU0dfSURfQlVTX09WRVJGTE9XLCBOVUxMKTsKLQotCWlmIChpcnFzdGF0dXMtPmNhbWlmRXJyb3JJcnEpIHsKLQkJQ0RCRygidmZlX2lycTogY2FtaWYgZXJyb3JzXG4iKTsKLQkJdmZlX3Byb2Nfb3BzKFZGRV9NU0dfSURfQ0FNSUZfRVJST1IsIE5VTEwpOwotCX0KLQotCWlmIChpcnFzdGF0dXMtPmNhbWlmT3ZlcmZsb3dJcnEpCi0JCXZmZV9wcm9jX29wcyhWRkVfTVNHX0lEX0NBTUlGX09WRVJGTE9XLCBOVUxMKTsKLQotCWlmIChpcnFzdGF0dXMtPnZpb2xhdGlvbklycSkKLQkJcHJfZXJyKCIlczogdmlvbGF0aW9uIGlycVxuIiwgX19mdW5jX18pOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfcHJvY2Vzc19jYW1pZl9zb2ZfaXJxKHZvaWQpCi17Ci0JLyogaW5jcmVtZW50IHRoZSBmcmFtZSBpZCBudW1iZXIuICovCi0JY3RybC0+dmZlRnJhbWVJZCsrOwotCi0JQ0RCRygiY2FtaWZfc29mX2lycSwgZnJhbWVJZCA9ICVkXG4iLCBjdHJsLT52ZmVGcmFtZUlkKTsKLQotCS8qIEluIHNuYXBzaG90IG1vZGUsIGlmIGZyYW1lIHNraXAgaXMgcHJvZ3JhbW1lZCwKLQkqIG5lZWQgdG8gY2hlY2sgaXQgYWNjb3JkaW5nbHkgdG8gc3RvcCBjYW1pZiBhdAotCSogY29ycmVjdCBmcmFtZSBib3VuZGFyeS4gRm9yIHRoZSBkcm9wcGVkIGZyYW1lcywKLQkqIHRoZXJlIHdvbid0IGJlIGFueSBvdXRwdXQgcGF0aCBpcnFzLCBidXQgdGhlcmUgaXMKLQkqIHN0aWxsIFNPRiBpcnEsIHdoaWNoIGNhbiBoZWxwIHVzIGRldGVybWluZSB3aGVuCi0JKiB0byBzdG9wIHRoZSBjYW1pZi4KLQkqLwotCWlmIChjdHJsLT52ZmVPcGVyYXRpb25Nb2RlKSB7Ci0JCWlmICgoMSA8PCBjdHJsLT52ZmVGcmFtZVNraXBDb3VudCkmY3RybC0+dmZlRnJhbWVTa2lwUGF0dGVybikgewotCi0JCQljdHJsLT52ZmVTbmFwU2hvdENvdW50LS07Ci0JCQlpZiAoY3RybC0+dmZlU25hcFNob3RDb3VudCA9PSAwKQotCQkJCS8qIHRlcm1pbmF0ZSB2ZmUgcGlwZWxpbmUgYXQgZnJhbWUgYm91bmRhcnkuICovCi0JCQkJd3JpdGVsKENBTUlGX0NPTU1BTkRfU1RPUF9BVF9GUkFNRV9CT1VOREFSWSwKLQkJCQkJY3RybC0+dmZlYmFzZSArIENBTUlGX0NPTU1BTkQpOwotCQl9Ci0KLQkJLyogdXBkYXRlIGZyYW1lIHNraXAgY291bnRlciBmb3IgYml0IGNoZWNraW5nLiAqLwotCQljdHJsLT52ZmVGcmFtZVNraXBDb3VudCsrOwotCQlpZiAoY3RybC0+dmZlRnJhbWVTa2lwQ291bnQgPT0gKGN0cmwtPnZmZUZyYW1lU2tpcFBlcmlvZCArIDEpKQotCQkJY3RybC0+dmZlRnJhbWVTa2lwQ291bnQgPSAwOwotCX0KLQl2ZmVfcHJvY19vcHMoVkZFX01TR19JRF9TT0ZfQUNLLCBOVUxMKTsKLX0KLQotc3RhdGljIGJvb2xlYW4gdmZlX2dldF9hZl9waW5ncG9uZ19zdGF0dXModm9pZCkKLXsKLQl1aW50MzJfdCBidXNQaW5nUG9uZ1N0YXR1cyA9Ci0JCXJlYWRsKGN0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1BJTkdQT05HX1NUQVRVUyk7Ci0JcmV0dXJuICEhKGJ1c1BpbmdQb25nU3RhdHVzICYgVkZFX0FGX1BJTkdQT05HX1NUQVRVU19CSVQpOwotfQotCi1zdGF0aWMgdWludDMyX3QgdmZlX3JlYWRfYWZfYnVmX2FkZHIoYm9vbGVhbiBwaXBvKQotewotCWlmIChwaXBvID09IEZBTFNFKQotCQlyZXR1cm4gcmVhZGwoY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfQUZfV1JfUElOR19BRERSKTsKLQllbHNlCi0JCXJldHVybiByZWFkbChjdHJsLT52ZmViYXNlICsgVkZFX0JVU19TVEFUU19BRl9XUl9QT05HX0FERFIpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfdXBkYXRlX2FmX2J1Zl9hZGRyKGJvb2xlYW4gcGlwbywgdWludDMyX3QgYWRkcikKLXsKLQlpZiAocGlwbyA9PSBGQUxTRSkKLQkJd3JpdGVsKGFkZHIsIGN0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX0FGX1dSX1BJTkdfQUREUik7Ci0JZWxzZQotCQl3cml0ZWwoYWRkciwgY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfQUZfV1JfUE9OR19BRERSKTsKLX0KLQotc3RhdGljIGJvb2xlYW4gdmZlX3NlbmRfYWZfc3RhdHNfbXNnKHN0cnVjdCBtc21fdmZlX3Jlc3AgKnJwLAotCQlzdHJ1Y3QgdmZlX21lc3NhZ2UgKm1zZywgdm9pZCAqZGF0YSkKLXsKLQl1aW50MzJfdCBhZkJ1ZkFkZHJlc3MgPSAodWludDMyX3QpZGF0YTsKLQotCS8qIGZpbGwgbWVzc2FnZSB3aXRoIHJpZ2h0IGNvbnRlbnQuICovCi0JLyogQHRvZG8gVGhpcyBpcyBjYXVzaW5nIGlzc3VlcywgbmVlZCBmdXJ0aGVyIGludmVzdGlnYXRlICovCi0JLyogc3Bpbl9sb2NrX2lycXNhdmUoJmN0cmwtPnN0YXRlX2xvY2ssIGZsYWdzKTsgKi8KLQlpZiAoY3RybC0+dnN0YXRlICE9IFZGRV9TVEFURV9BQ1RJVkUpCi0JCXJldHVybiBGQUxTRTsKLQotCW1zZy0+X3UubXNnU3RhdHNBZi5hZkJ1ZmZlciA9IGFmQnVmQWRkcmVzczsKLQltc2ctPl91Lm1zZ1N0YXRzQWYuZnJhbWVDb3VudGVyID0gY3RybC0+dmZlRnJhbWVJZDsKLQotCWN0cmwtPmFmU3RhdHNDb250cm9sLmFja1BlbmRpbmcgPSBUUlVFOwotCi0JdmZlX2FkZHJfY29udmVydCgmKHJwLT5waHkpLCBycC0+dHlwZSwgbXNnLCBOVUxMLCBOVUxMKTsKLQkvKiBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHJsLT5zdGF0ZV9sb2NrLCBmbGFncyk7ICovCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9wcm9jZXNzX3N0YXRzX2FmX2lycSh2b2lkKQotewotCWJvb2xlYW4gYnVmZmVyQXZhaWxhYmxlOwotCi0JaWYgKCEoY3RybC0+YWZTdGF0c0NvbnRyb2wuYWNrUGVuZGluZykpIHsKLQotCQkvKiByZWFkIGhhcmR3YXJlIHN0YXR1cy4gKi8KLQkJY3RybC0+YWZTdGF0c0NvbnRyb2wucGluZ1BvbmdTdGF0dXMgPQotCQkJdmZlX2dldF9hZl9waW5ncG9uZ19zdGF0dXMoKTsKLQotCQlidWZmZXJBdmFpbGFibGUgPSAoY3RybC0+YWZTdGF0c0NvbnRyb2wucGluZ1BvbmdTdGF0dXMpIF4gMTsKLQotCQljdHJsLT5hZlN0YXRzQ29udHJvbC5idWZUb1JlbmRlciA9Ci0JCQl2ZmVfcmVhZF9hZl9idWZfYWRkcihidWZmZXJBdmFpbGFibGUpOwotCi0JCS8qIHVwZGF0ZSB0aGUgc2FtZSBidWZmZXIgYWRkcmVzcyAocGluZyBvciBwb25nKSAqLwotCQl2ZmVfdXBkYXRlX2FmX2J1Zl9hZGRyKGJ1ZmZlckF2YWlsYWJsZSwKLQkJCWN0cmwtPmFmU3RhdHNDb250cm9sLm5leHRGcmFtZUFkZHJCdWYpOwotCi0JCXZmZV9wcm9jX29wcyhWRkVfTVNHX0lEX1NUQVRTX0FVVE9GT0NVUywKLQkJCSh2b2lkICopY3RybC0+YWZTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIpOwotCX0gZWxzZQotCQljdHJsLT5hZlN0YXRzQ29udHJvbC5kcm9wcGVkU3RhdHNGcmFtZUNvdW50Kys7Ci19Ci0KLXN0YXRpYyBib29sZWFuIHZmZV9nZXRfYXdiX3Bpbmdwb25nX3N0YXR1cyh2b2lkKQotewotCXVpbnQzMl90IGJ1c1BpbmdQb25nU3RhdHVzID0KLQotCQlyZWFkbChjdHJsLT52ZmViYXNlICsgVkZFX0JVU19QSU5HUE9OR19TVEFUVVMpOwotCi0JcmV0dXJuICEhKGJ1c1BpbmdQb25nU3RhdHVzICYgVkZFX0FXQl9QSU5HUE9OR19TVEFUVVNfQklUKTsKLQotfQotCi1zdGF0aWMgdWludDMyX3QgdmZlX3JlYWRfYXdiX2J1Zl9hZGRyKGJvb2xlYW4gcGluZ3BvbmcpCi17Ci0JaWYgKHBpbmdwb25nID09IEZBTFNFKQotCQlyZXR1cm4gcmVhZGwoY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfQVdCX1dSX1BJTkdfQUREUik7Ci0JZWxzZQotCQlyZXR1cm4gcmVhZGwoY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfQVdCX1dSX1BPTkdfQUREUik7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV91cGRhdGVfYXdiX2J1Zl9hZGRyKGJvb2xlYW4gcGluZ3BvbmcsIHVpbnQzMl90IGFkZHIpCi17Ci0JaWYgKHBpbmdwb25nID09IEZBTFNFKQotCQl3cml0ZWwoYWRkciwgY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfQVdCX1dSX1BJTkdfQUREUik7Ci0JZWxzZQotCQl3cml0ZWwoYWRkciwgY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfQVdCX1dSX1BPTkdfQUREUik7Ci19Ci0KLXN0YXRpYyBib29sZWFuIHZmZV9zZW5kX2F3Yl9zdGF0c19tc2coc3RydWN0IG1zbV92ZmVfcmVzcCAqcnAsCi0JCXN0cnVjdCB2ZmVfbWVzc2FnZSAqbXNnLCB2b2lkICpkYXRhKQotewotCXVpbnQzMl90IGF3YkJ1ZkFkZHJlc3MgPSAodWludDMyX3QpZGF0YTsKLQotCS8qIGZpbGwgbWVzc2FnZSB3aXRoIHJpZ2h0IGNvbnRlbnQuICovCi0JLyogQHRvZG8gVGhpcyBpcyBjYXVzaW5nIGlzc3VlcywgbmVlZCBmdXJ0aGVyIGludmVzdGlnYXRlICovCi0JLyogc3Bpbl9sb2NrX2lycXNhdmUoJmN0cmwtPnN0YXRlX2xvY2ssIGZsYWdzKTsgKi8KLQlpZiAoY3RybC0+dnN0YXRlICE9IFZGRV9TVEFURV9BQ1RJVkUpCi0JCXJldHVybiBGQUxTRTsKLQotCW1zZy0+X3UubXNnU3RhdHNXYkV4cC5hd2JCdWZmZXIgPSBhd2JCdWZBZGRyZXNzOwotCW1zZy0+X3UubXNnU3RhdHNXYkV4cC5mcmFtZUNvdW50ZXIgPSBjdHJsLT52ZmVGcmFtZUlkOwotCi0KLQljdHJsLT5hd2JTdGF0c0NvbnRyb2wuYWNrUGVuZGluZyA9IFRSVUU7Ci0KLQl2ZmVfYWRkcl9jb252ZXJ0KCYocnAtPnBoeSksCi0JCQlycC0+dHlwZSwgbXNnLAotCQkJTlVMTCwgTlVMTCk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotc3RhdGljIHZvaWQgdmZlX3Byb2Nlc3Nfc3RhdHNfYXdiX2lycSh2b2lkKQotewotCWJvb2xlYW4gYnVmZmVyQXZhaWxhYmxlOwotCi0JaWYgKCEoY3RybC0+YXdiU3RhdHNDb250cm9sLmFja1BlbmRpbmcpKSB7Ci0KLQkJY3RybC0+YXdiU3RhdHNDb250cm9sLnBpbmdQb25nU3RhdHVzID0KLQkJCXZmZV9nZXRfYXdiX3Bpbmdwb25nX3N0YXR1cygpOwotCi0JCWJ1ZmZlckF2YWlsYWJsZSA9IChjdHJsLT5hd2JTdGF0c0NvbnRyb2wucGluZ1BvbmdTdGF0dXMpIF4gMTsKLQotCQljdHJsLT5hd2JTdGF0c0NvbnRyb2wuYnVmVG9SZW5kZXIgPQotCQkJdmZlX3JlYWRfYXdiX2J1Zl9hZGRyKGJ1ZmZlckF2YWlsYWJsZSk7Ci0KLQkJdmZlX3VwZGF0ZV9hd2JfYnVmX2FkZHIoYnVmZmVyQXZhaWxhYmxlLAotCQkJY3RybC0+YXdiU3RhdHNDb250cm9sLm5leHRGcmFtZUFkZHJCdWYpOwotCi0JCXZmZV9wcm9jX29wcyhWRkVfTVNHX0lEX1NUQVRTX1dCX0VYUCwKLQkJCSh2b2lkICopY3RybC0+YXdiU3RhdHNDb250cm9sLmJ1ZlRvUmVuZGVyKTsKLQotCX0gZWxzZQotCQljdHJsLT5hd2JTdGF0c0NvbnRyb2wuZHJvcHBlZFN0YXRzRnJhbWVDb3VudCsrOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfd3JpdGVfZ2FtbWFfdGFibGUodWludDhfdCBjaGFubmVsLAotCWJvb2xlYW4gYmFuaywgaW50MTZfdCAqcFRhYmxlKQotewotCXVpbnQxNl90IGk7Ci0KLQllbnVtIFZGRV9ETUlfUkFNX1NFTCBkbWlSYW1TZWwgPSBOT19NRU1fU0VMRUNURUQ7Ci0KLQlzd2l0Y2ggKGNoYW5uZWwpIHsKLQljYXNlIDA6Ci0JCWlmIChiYW5rID09IDApCi0JCQlkbWlSYW1TZWwgPSBSR0JMVVRfUkFNX0NIMF9CQU5LMDsKLQkJZWxzZQotCQkJZG1pUmFtU2VsID0gUkdCTFVUX1JBTV9DSDBfQkFOSzE7Ci0JCWJyZWFrOwotCi0JY2FzZSAxOgotCQlpZiAoYmFuayA9PSAwKQotCQkJZG1pUmFtU2VsID0gUkdCTFVUX1JBTV9DSDFfQkFOSzA7Ci0JCWVsc2UKLQkJCWRtaVJhbVNlbCA9IFJHQkxVVF9SQU1fQ0gxX0JBTksxOwotCQlicmVhazsKLQotCWNhc2UgMjoKLQkJaWYgKGJhbmsgPT0gMCkKLQkJCWRtaVJhbVNlbCA9IFJHQkxVVF9SQU1fQ0gyX0JBTkswOwotCQllbHNlCi0JCQlkbWlSYW1TZWwgPSBSR0JMVVRfUkFNX0NIMl9CQU5LMTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQl2ZmVfcHJvZ3JhbV9kbWlfY2ZnKGRtaVJhbVNlbCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVkZFX0dBTU1BX1RBQkxFX0xFTkdUSDsgaSsrKSB7Ci0JCXdyaXRlbCgodWludDMyX3QpKCpwVGFibGUpLCBjdHJsLT52ZmViYXNlICsgVkZFX0RNSV9EQVRBX0xPKTsKLQkJcFRhYmxlKys7Ci0JfQotCi0JLyogQWZ0ZXIgRE1JIHRyYW5zZmVyLCBuZWVkIHRvIHNldCB0aGUgRE1JX0NGRyB0byB1bnNlbGVjdCBhbnkgU1JBTQotCXVuc2VsZWN0IHRoZSBTUkFNIEJhbmsuICovCi0Jd3JpdGVsKFZGRV9ETUlfQ0ZHX0RFRkFVTFQsIGN0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0NGRyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9wcm9nX2h3X3Rlc3RnZW5fY21kKHVpbnQzMl90IHZhbHVlKQotewotCXdyaXRlbCh2YWx1ZSwgY3RybC0+dmZlYmFzZSArIFZGRV9IV19URVNUR0VOX0NNRCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB2ZmVfcmVhZF9pcnFfc3RhdHVzKHN0cnVjdCB2ZmVfaXJxX3RocmVhZF9tc2cgKm91dCkKLXsKLQl1aW50MzJfdCAqdGVtcDsKLQotCW1lbXNldChvdXQsIDAsIHNpemVvZihzdHJ1Y3QgdmZlX2lycV90aHJlYWRfbXNnKSk7Ci0KLQl0ZW1wID0gKHVpbnQzMl90ICopKGN0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX1NUQVRVUyk7Ci0Jb3V0LT52ZmVJcnFTdGF0dXMgPSByZWFkbCh0ZW1wKTsKLQotCXRlbXAgPSAodWludDMyX3QgKikoY3RybC0+dmZlYmFzZSArIENBTUlGX1NUQVRVUyk7Ci0Jb3V0LT5jYW1pZlN0YXR1cyA9IHJlYWRsKHRlbXApOwotCi0vKgl0aGlzIGZvciBZVVYgcGVyZm9ybWFuY2UgdHVuaW5nCi0Jd3JpdGVsKDB4NywgY3RybC0+dmZlYmFzZSArIENBTUlGX0NPTU1BTkQpOwotCXdyaXRlbCgweDMsIGN0cmwtPnZmZWJhc2UgKyBDQU1JRl9DT01NQU5EKTsKLQlDREJHKCJjYW1pZlN0YXR1cyAgPSAweCV4XG4iLCBvdXQtPmNhbWlmU3RhdHVzKTsKLSovCi0vKgotCXRlbXAgPSAodWludDMyX3QgKikoY3RybC0+dmZlYmFzZSArIFZGRV9ERU1PU0FJQ19TVEFUVVMpOwotCW91dC0+ZGVtb3NhaWNTdGF0dXMgPSByZWFkbCh0ZW1wKTsKLQotCXRlbXAgPSAodWludDMyX3QgKikoY3RybC0+dmZlYmFzZSArIFZGRV9BU0ZfTUFYX0VER0UpOwotCW91dC0+YXNmTWF4RWRnZSA9IHJlYWRsKHRlbXApOwotCi0JdGVtcCA9ICh1aW50MzJfdCAqKShjdHJsLT52ZmViYXNlICsgVkZFX0JVU19FTkNfWV9XUl9QTV9TVEFUU18wKTsKLSovCi0KLSNpZiAwCi0Jb3V0LT5wbUluZm8uZW5jUGF0aFBtSW5mby55V3JQbVN0YXRzMCAgICAgID0gcmVhZGwodGVtcCsrKTsKLQlvdXQtPnBtSW5mby5lbmNQYXRoUG1JbmZvLnlXclBtU3RhdHMxICAgICAgPSByZWFkbCh0ZW1wKyspOwotCW91dC0+cG1JbmZvLmVuY1BhdGhQbUluZm8uY2JjcldyUG1TdGF0czAgICA9IHJlYWRsKHRlbXArKyk7Ci0Jb3V0LT5wbUluZm8uZW5jUGF0aFBtSW5mby5jYmNyV3JQbVN0YXRzMSAgID0gcmVhZGwodGVtcCsrKTsKLQlvdXQtPnBtSW5mby52aWV3UGF0aFBtSW5mby55V3JQbVN0YXRzMCAgICAgPSByZWFkbCh0ZW1wKyspOwotCW91dC0+cG1JbmZvLnZpZXdQYXRoUG1JbmZvLnlXclBtU3RhdHMxICAgICA9IHJlYWRsKHRlbXArKyk7Ci0Jb3V0LT5wbUluZm8udmlld1BhdGhQbUluZm8uY2JjcldyUG1TdGF0czAgID0gcmVhZGwodGVtcCsrKTsKLQlvdXQtPnBtSW5mby52aWV3UGF0aFBtSW5mby5jYmNyV3JQbVN0YXRzMSAgPSByZWFkbCh0ZW1wKTsKLSNlbmRpZiAvKiBpZiAwIEplZmYgKi8KLX0KLQotc3RhdGljIHZvaWQKLXZmZV9wYXJzZV9pbnRlcnJ1cHRfc3RhdHVzKHN0cnVjdCB2ZmVfaW50ZXJydXB0X3N0YXR1cyAqcmV0LAotdWludDMyX3QgaXJxU3RhdHVzSW4pCi17Ci0Jc3RydWN0IHZmZV9pcnFlbmFibGUgaHdzdGF0OwotCWJvb2xlYW4gdGVtcDsKLQotCW1lbXNldCgmaHdzdGF0LCAwLCBzaXplb2YoaHdzdGF0KSk7Ci0JbWVtc2V0KHJldCwgMCwgc2l6ZW9mKCpyZXQpKTsKLQotCWh3c3RhdCA9ICooKHN0cnVjdCB2ZmVfaXJxZW5hYmxlICopKCZpcnFTdGF0dXNJbikpOwotCi0JcmV0LT5jYW1pZkVycm9ySXJxID0gaHdzdGF0LmNhbWlmRXJyb3JJcnE7Ci0JcmV0LT5jYW1pZlNvZklycSA9IGh3c3RhdC5jYW1pZlNvZklycTsKLQlyZXQtPmNhbWlmRW9sSXJxID0gaHdzdGF0LmNhbWlmRW9sSXJxOwotCXJldC0+Y2FtaWZFb2ZJcnEgPSBod3N0YXQuY2FtaWZFb2ZJcnE7Ci0JcmV0LT5jYW1pZkVwb2NoMUlycSA9IGh3c3RhdC5jYW1pZkVwb2NoMUlycTsKLQlyZXQtPmNhbWlmRXBvY2gySXJxID0gaHdzdGF0LmNhbWlmRXBvY2gySXJxOwotCXJldC0+Y2FtaWZPdmVyZmxvd0lycSA9IGh3c3RhdC5jYW1pZk92ZXJmbG93SXJxOwotCXJldC0+Y2VJcnEgPSBod3N0YXQuY2VJcnE7Ci0JcmV0LT5yZWdVcGRhdGVJcnEgPSBod3N0YXQucmVnVXBkYXRlSXJxOwotCXJldC0+cmVzZXRBY2tJcnEgPSBod3N0YXQucmVzZXRBY2tJcnE7Ci0JcmV0LT5lbmNZUGluZ3BvbmdJcnEgPSBod3N0YXQuZW5jWVBpbmdwb25nSXJxOwotCXJldC0+ZW5jQ2JjclBpbmdwb25nSXJxID0gaHdzdGF0LmVuY0NiY3JQaW5ncG9uZ0lycTsKLQlyZXQtPnZpZXdZUGluZ3BvbmdJcnEgPSBod3N0YXQudmlld1lQaW5ncG9uZ0lycTsKLQlyZXQtPnZpZXdDYmNyUGluZ3BvbmdJcnEgPSBod3N0YXQudmlld0NiY3JQaW5ncG9uZ0lycTsKLQlyZXQtPnJkUGluZ3BvbmdJcnEgPSBod3N0YXQucmRQaW5ncG9uZ0lycTsKLQlyZXQtPmFmUGluZ3BvbmdJcnEgPSBod3N0YXQuYWZQaW5ncG9uZ0lycTsKLQlyZXQtPmF3YlBpbmdwb25nSXJxID0gaHdzdGF0LmF3YlBpbmdwb25nSXJxOwotCXJldC0+aGlzdFBpbmdwb25nSXJxID0gaHdzdGF0Lmhpc3RQaW5ncG9uZ0lycTsKLQlyZXQtPmVuY0lycSA9IGh3c3RhdC5lbmNJcnE7Ci0JcmV0LT52aWV3SXJxID0gaHdzdGF0LnZpZXdJcnE7Ci0JcmV0LT5idXNPdmVyZmxvd0lycSA9IGh3c3RhdC5idXNPdmVyZmxvd0lycTsKLQlyZXQtPmFmT3ZlcmZsb3dJcnEgPSBod3N0YXQuYWZPdmVyZmxvd0lycTsKLQlyZXQtPmF3Yk92ZXJmbG93SXJxID0gaHdzdGF0LmF3Yk92ZXJmbG93SXJxOwotCXJldC0+c3luY1RpbWVyMElycSA9IGh3c3RhdC5zeW5jVGltZXIwSXJxOwotCXJldC0+c3luY1RpbWVyMUlycSA9IGh3c3RhdC5zeW5jVGltZXIxSXJxOwotCXJldC0+c3luY1RpbWVyMklycSA9IGh3c3RhdC5zeW5jVGltZXIySXJxOwotCXJldC0+YXN5bmNUaW1lcjBJcnEgPSBod3N0YXQuYXN5bmNUaW1lcjBJcnE7Ci0JcmV0LT5hc3luY1RpbWVyMUlycSA9IGh3c3RhdC5hc3luY1RpbWVyMUlycTsKLQlyZXQtPmFzeW5jVGltZXIySXJxID0gaHdzdGF0LmFzeW5jVGltZXIySXJxOwotCXJldC0+YXN5bmNUaW1lcjNJcnEgPSBod3N0YXQuYXN5bmNUaW1lcjNJcnE7Ci0JcmV0LT5heGlFcnJvcklycSA9IGh3c3RhdC5heGlFcnJvcklycTsKLQlyZXQtPnZpb2xhdGlvbklycSA9IGh3c3RhdC52aW9sYXRpb25JcnE7Ci0KLQkvKiBsb2dpYyBPUiBvZiBhbnkgZXJyb3IgYml0cwotCSAqIGFsdGhvdWdoIGVhY2ggaXJxIGNvcnJlc3BvbmRzIHRvIGEgYml0LCB0aGUgZGF0YSB0eXBlIGhlcmUgaXMgYQotCSAqIGJvb2xlYW4gYWxyZWFkeS4gaGVuY2UgdXNlIGxvZ2ljIG9wZXJhdGlvbi4KLQkgKi8KLQl0ZW1wID0KLQkgICAgcmV0LT5jYW1pZkVycm9ySXJxIHx8Ci0JICAgIHJldC0+Y2FtaWZPdmVyZmxvd0lycSB8fAotCSAgICByZXQtPmFmT3ZlcmZsb3dJcnEgfHwKLQkgICAgcmV0LT5hd2JPdmVyZmxvd0lycSB8fAotCSAgICByZXQtPmF3YlBpbmdwb25nSXJxIHx8Ci0JICAgIHJldC0+YWZQaW5ncG9uZ0lycSB8fAotCSAgICByZXQtPmJ1c092ZXJmbG93SXJxIHx8IHJldC0+YXhpRXJyb3JJcnEgfHwgcmV0LT52aW9sYXRpb25JcnE7Ci0KLQlyZXQtPmFueUVycm9ySXJxcyA9IHRlbXA7Ci0KLQkvKiBsb2dpYyBPUiBvZiBhbnkgb3V0cHV0IHBhdGggYml0cyovCi0JdGVtcCA9IHJldC0+ZW5jWVBpbmdwb25nSXJxIHx8IHJldC0+ZW5jQ2JjclBpbmdwb25nSXJxIHx8IHJldC0+ZW5jSXJxOwotCi0JcmV0LT5hbnlPdXRwdXQyUGF0aElycXMgPSB0ZW1wOwotCi0JdGVtcCA9IHJldC0+dmlld1lQaW5ncG9uZ0lycSB8fCByZXQtPnZpZXdDYmNyUGluZ3BvbmdJcnEgfHwKLQkJcmV0LT52aWV3SXJxOwotCi0JcmV0LT5hbnlPdXRwdXQxUGF0aElycXMgPSB0ZW1wOwotCi0JcmV0LT5hbnlPdXRwdXRQYXRoSXJxcyA9Ci0JICAgIHJldC0+YW55T3V0cHV0MVBhdGhJcnFzIHx8IHJldC0+YW55T3V0cHV0MlBhdGhJcnFzOwotCi0JLyogbG9naWMgT1Igb2YgYW55IHN5bmMgdGltZXIgYml0cyovCi0JdGVtcCA9IHJldC0+c3luY1RpbWVyMElycSB8fCByZXQtPnN5bmNUaW1lcjFJcnEgfHwgcmV0LT5zeW5jVGltZXIySXJxOwotCi0JcmV0LT5hbnlTeW5jVGltZXJJcnFzID0gdGVtcDsKLQotCS8qIGxvZ2ljIE9SIG9mIGFueSBhc3luYyB0aW1lciBiaXRzKi8KLQl0ZW1wID0KLQkgICAgcmV0LT5hc3luY1RpbWVyMElycSB8fAotCSAgICByZXQtPmFzeW5jVGltZXIxSXJxIHx8IHJldC0+YXN5bmNUaW1lcjJJcnEgfHwgcmV0LT5hc3luY1RpbWVyM0lycTsKLQotCXJldC0+YW55QXN5bmNUaW1lcklycXMgPSB0ZW1wOwotCi0JLyogYm9vbCBmb3IgYWxsIGludGVycnVwdHMgdGhhdCBhcmUgbm90IGFsbG93ZWQgaW4gaWRsZSBzdGF0ZSAqLwotCXRlbXAgPQotCSAgICByZXQtPmFueUVycm9ySXJxcyB8fAotCSAgICByZXQtPmFueU91dHB1dFBhdGhJcnFzIHx8Ci0JICAgIHJldC0+YW55U3luY1RpbWVySXJxcyB8fAotCSAgICByZXQtPnJlZ1VwZGF0ZUlycSB8fAotCSAgICByZXQtPmF3YlBpbmdwb25nSXJxIHx8Ci0JICAgIHJldC0+YWZQaW5ncG9uZ0lycSB8fAotCSAgICByZXQtPmNhbWlmU29mSXJxIHx8IHJldC0+Y2FtaWZFcG9jaDJJcnEgfHwgcmV0LT5jYW1pZkVwb2NoMUlycTsKLQotCXJldC0+YW55SXJxRm9yQWN0aXZlU3RhdGVzT25seSA9IHRlbXA7Ci19Ci0KLXN0YXRpYyB2b2lkCi12ZmVfZ2V0X2FzZl9mcmFtZV9pbmZvKHN0cnVjdCB2ZmVfZnJhbWVfYXNmX2luZm8gKnJjLAotc3RydWN0IHZmZV9pcnFfdGhyZWFkX21zZyAqaW4pCi17Ci0Jc3RydWN0IHZmZV9hc2ZfaW5mbyAgICAgYXNmSW5mb1RlbXA7Ci0KLQltZW1zZXQocmMsIDAsIHNpemVvZigqcmMpKTsKLQltZW1zZXQoJmFzZkluZm9UZW1wLCAwLCBzaXplb2YoYXNmSW5mb1RlbXApKTsKLQotCWFzZkluZm9UZW1wID0gKigoc3RydWN0IHZmZV9hc2ZfaW5mbyAqKSgmKGluLT5hc2ZNYXhFZGdlKSkpOwotCi0JcmMtPmFzZkhiaUNvdW50ID0gYXNmSW5mb1RlbXAuSEJJQ291bnQ7Ci0JcmMtPmFzZk1heEVkZ2UgPSBhc2ZJbmZvVGVtcC5tYXhFZGdlOwotfQotCi1zdGF0aWMgdm9pZAotdmZlX2dldF9kZW1vc2FpY19mcmFtZV9pbmZvKHN0cnVjdCB2ZmVfZnJhbWVfYnBjX2luZm8gKnJjLAotc3RydWN0IHZmZV9pcnFfdGhyZWFkX21zZyAqaW4pCi17Ci0Jc3RydWN0IHZmZV9icHNfaW5mbyAgICAgYnBjSW5mb1RlbXA7Ci0KLQltZW1zZXQocmMsIDAsIHNpemVvZigqcmMpKTsKLQltZW1zZXQoJmJwY0luZm9UZW1wLCAwLCBzaXplb2YoYnBjSW5mb1RlbXApKTsKLQotCWJwY0luZm9UZW1wID0gKigoc3RydWN0IHZmZV9icHNfaW5mbyAqKSgmKGluLT5kZW1vc2FpY1N0YXR1cykpKTsKLQotCXJjLT5ncmVlbkRlZmVjdFBpeGVsQ291bnQgPSBicGNJbmZvVGVtcC5ncmVlbkJhZFBpeGVsQ291bnQ7Ci0KLQlyYy0+cmVkQmx1ZURlZmVjdFBpeGVsQ291bnQgPSBicGNJbmZvVGVtcC5SZWRCbHVlQmFkUGl4ZWxDb3VudDsKLX0KLQotc3RhdGljIHZvaWQKLXZmZV9nZXRfY2FtaWZfc3RhdHVzKHN0cnVjdCB2ZmVfbXNnX2NhbWlmX3N0YXR1cyAqcmMsCi1zdHJ1Y3QgdmZlX2lycV90aHJlYWRfbXNnICppbikKLXsKLQlzdHJ1Y3QgdmZlX2NhbWlmX3N0YXRzIGNhbWlmU3RhdHVzVGVtcDsKLQotCW1lbXNldChyYywgMCwgc2l6ZW9mKCpyYykpOwotCW1lbXNldCgmY2FtaWZTdGF0dXNUZW1wLCAwLCBzaXplb2YoY2FtaWZTdGF0dXNUZW1wKSk7Ci0KLQljYW1pZlN0YXR1c1RlbXAgPSAqKChzdHJ1Y3QgdmZlX2NhbWlmX3N0YXRzICopKCYoaW4tPmNhbWlmU3RhdHVzKSkpOwotCi0JcmMtPmNhbWlmU3RhdGUgPSAoYm9vbGVhbikgY2FtaWZTdGF0dXNUZW1wLmNhbWlmSGFsdDsKLQlyYy0+bGluZUNvdW50ID0gY2FtaWZTdGF0dXNUZW1wLmxpbmVDb3VudDsKLQlyYy0+cGl4ZWxDb3VudCA9IGNhbWlmU3RhdHVzVGVtcC5waXhlbENvdW50OwotfQotCi1zdGF0aWMgdm9pZAotdmZlX2dldF9wZXJmb3JtYW5jZV9tb25pdG9yX2RhdGEoc3RydWN0IHZmZV9idXNfcGVyZm9ybWFuY2VfbW9uaXRvciAqcmMsCi0JCXN0cnVjdCB2ZmVfaXJxX3RocmVhZF9tc2cgKmluKQotewotCW1lbXNldChyYywgMCwgc2l6ZW9mKCpyYykpOwotCi0JcmMtPmVuY1BhdGhQbUluZm8ueVdyUG1TdGF0czAgPSBpbi0+cG1JbmZvLmVuY1BhdGhQbUluZm8ueVdyUG1TdGF0czA7Ci0JcmMtPmVuY1BhdGhQbUluZm8ueVdyUG1TdGF0czEgPSBpbi0+cG1JbmZvLmVuY1BhdGhQbUluZm8ueVdyUG1TdGF0czE7Ci0JcmMtPmVuY1BhdGhQbUluZm8uY2JjcldyUG1TdGF0czAgPQotCQlpbi0+cG1JbmZvLmVuY1BhdGhQbUluZm8uY2JjcldyUG1TdGF0czA7Ci0JcmMtPmVuY1BhdGhQbUluZm8uY2JjcldyUG1TdGF0czEgPQotCQlpbi0+cG1JbmZvLmVuY1BhdGhQbUluZm8uY2JjcldyUG1TdGF0czE7Ci0JcmMtPnZpZXdQYXRoUG1JbmZvLnlXclBtU3RhdHMwID0gaW4tPnBtSW5mby52aWV3UGF0aFBtSW5mby55V3JQbVN0YXRzMDsKLQlyYy0+dmlld1BhdGhQbUluZm8ueVdyUG1TdGF0czEgPSBpbi0+cG1JbmZvLnZpZXdQYXRoUG1JbmZvLnlXclBtU3RhdHMxOwotCXJjLT52aWV3UGF0aFBtSW5mby5jYmNyV3JQbVN0YXRzMCA9Ci0JCWluLT5wbUluZm8udmlld1BhdGhQbUluZm8uY2JjcldyUG1TdGF0czA7Ci0JcmMtPnZpZXdQYXRoUG1JbmZvLmNiY3JXclBtU3RhdHMxID0KLQkgICAgaW4tPnBtSW5mby52aWV3UGF0aFBtSW5mby5jYmNyV3JQbVN0YXRzMTsKLX0KLQotc3RhdGljIHZvaWQgdmZlX3Byb2Nlc3NfcmVnX3VwZGF0ZV9pcnEodm9pZCkKLXsKLQlDREJHKCJ2ZmVfcHJvY2Vzc19yZWdfdXBkYXRlX2lycTogYWNrUGVuZGluZ0ZsYWcgaXMgJWRcbiIsCi0JY3RybC0+dmZlU3RhcnRBY2tQZW5kaW5nRmxhZyk7Ci0JaWYgKGN0cmwtPnZmZVN0YXJ0QWNrUGVuZGluZ0ZsYWcgPT0gVFJVRSkgewotCQl2ZmVfcHJvY19vcHMoVkZFX01TR19JRF9TVEFSVF9BQ0ssIE5VTEwpOwotCQljdHJsLT52ZmVTdGFydEFja1BlbmRpbmdGbGFnID0gRkFMU0U7Ci0JfSBlbHNlCi0JCXZmZV9wcm9jX29wcyhWRkVfTVNHX0lEX1VQREFURV9BQ0ssIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfcHJvY2Vzc19yZXNldF9pcnEodm9pZCkKLXsKLQkvKiB1bnNpZ25lZCBsb25nIGZsYWdzOyAqLwotCi0JLyogQHRvZG8gVGhpcyBpcyBjYXVzaW5nIGlzc3VlcywgbmVlZCBmdXJ0aGVyIGludmVzdGlnYXRlICovCi0JLyogc3Bpbl9sb2NrX2lycXNhdmUoJmN0cmwtPnN0YXRlX2xvY2ssIGZsYWdzKTsgKi8KLQljdHJsLT52c3RhdGUgPSBWRkVfU1RBVEVfSURMRTsKLQkvKiBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHJsLT5zdGF0ZV9sb2NrLCBmbGFncyk7ICovCi0KLQlpZiAoY3RybC0+dmZlU3RvcEFja1BlbmRpbmcgPT0gVFJVRSkgewotCQljdHJsLT52ZmVTdG9wQWNrUGVuZGluZyA9IEZBTFNFOwotCQl2ZmVfcHJvY19vcHMoVkZFX01TR19JRF9TVE9QX0FDSywgTlVMTCk7Ci0JfSBlbHNlIHsKLQkJdmZlX3NldF9kZWZhdWx0X3JlZ192YWx1ZXMoKTsKLQkJdmZlX3Byb2Nfb3BzKFZGRV9NU0dfSURfUkVTRVRfQUNLLCBOVUxMKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9wcm9jZXNzX3Bpbmdwb25nX2lycShzdHJ1Y3QgdmZlX291dHB1dF9wYXRoICppbiwKLQl1aW50OF90IGZyYWdtZW50Q291bnQpCi17Ci0JdWludDE2X3QgY2lyY3VsYXJJbmRleDsKLQl1aW50MzJfdCBuZXh0RnJhZ21lbnRBZGRyOwotCi0JLyogZ2V0IG5leHQgZnJhZ21lbnQgYWRkcmVzcyBmcm9tIGNpcmN1bGFyIGJ1ZmZlciAqLwotCWNpcmN1bGFySW5kZXggICAgPSAoaW4tPmZyYWdJbmRleCkgJSAoMiAqIGZyYWdtZW50Q291bnQpOwotCW5leHRGcmFnbWVudEFkZHIgPSBpbi0+YWRkcmVzc0J1ZmZlcltjaXJjdWxhckluZGV4XTsKLQotCWluLT5mcmFnSW5kZXggPSBjaXJjdWxhckluZGV4ICsgMTsKLQotCS8qIHVzZSBuZXh0IGZyYWdtZW50IHRvIHByb2dyYW0gaGFyZHdhcmUgcGluZy9wb25nIGFkZHJlc3MuICovCi0JaWYgKGluLT5od0N1cnJlbnRGbGFnID09IHBpbmcpIHsKLQkJd3JpdGVsKG5leHRGcmFnbWVudEFkZHIsIGluLT5od1JlZ1BpbmdBZGRyZXNzKTsKLQkJaW4tPmh3Q3VycmVudEZsYWcgPSBwb25nOwotCi0JfSBlbHNlIHsKLQkJd3JpdGVsKG5leHRGcmFnbWVudEFkZHIsIGluLT5od1JlZ1BvbmdBZGRyZXNzKTsKLQkJaW4tPmh3Q3VycmVudEZsYWcgPSBwaW5nOwotCX0KLX0KLQotc3RhdGljIGJvb2xlYW4gdmZlX3NlbmRfdmlkZW9fbXNnKHN0cnVjdCBtc21fdmZlX3Jlc3AgKnJwLAotCQlzdHJ1Y3QgdmZlX21lc3NhZ2UgKm1zZywgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgdmZlX21zZ19vdXRwdXQgKnBQYXlsb2FkID0gZGF0YTsKLQotCWlmIChjdHJsLT52c3RhdGUgIT0gVkZFX1NUQVRFX0FDVElWRSkKLQkJcmV0dXJuIEZBTFNFOwotCW1lbWNweSgmKG1zZy0+X3UpLAotCQkodm9pZCAqKXBQYXlsb2FkLCBzaXplb2Yoc3RydWN0IHZmZV9tc2dfb3V0cHV0KSk7Ci0KLQlycC0+cGh5Lm91dHB1dF9pZCA9IE9VVFBVVF9UWVBFX1Y7Ci0JQ0RCRygidmZlX3NlbmRfdmlkZW9fbXNnIHJwLT50eXBlPSAlZFxuIiwgcnAtPnR5cGUpOwotCi0JdmZlX2FkZHJfY29udmVydCgmKHJwLT5waHkpLAotCQkJcnAtPnR5cGUsIG1zZywKLQkJCSYocnAtPmV4dGRhdGEpLCAmKHJwLT5leHRsZW4pKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotc3RhdGljIGJvb2xlYW4gdmZlX3NlbmRfcHJldmlld19tc2coc3RydWN0IG1zbV92ZmVfcmVzcCAqcnAsCi0JCXN0cnVjdCB2ZmVfbWVzc2FnZSAqbXNnLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB2ZmVfbXNnX291dHB1dCAqcFBheWxvYWQgPSBkYXRhOwotCi0JaWYgKGN0cmwtPnZzdGF0ZSAhPSBWRkVfU1RBVEVfQUNUSVZFKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQltZW1jcHkoJihtc2ctPl91KSwgKHZvaWQgKilwUGF5bG9hZCwgc2l6ZW9mKHN0cnVjdCB2ZmVfbXNnX291dHB1dCkpOwotCi0JcnAtPnBoeS5vdXRwdXRfaWQgPSBPVVRQVVRfVFlQRV9QOwotCUNEQkcoInZmZV9zZW5kX3ByZXZpZXdfbXNnIHJwLT50eXBlPSAlZFxuIiwgcnAtPnR5cGUpOwotCi0JdmZlX2FkZHJfY29udmVydCgmKHJwLT5waHkpLAotCQkJcnAtPnR5cGUsIG1zZywKLQkJCSYocnAtPmV4dGRhdGEpLCAmKHJwLT5leHRsZW4pKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLXN0YXRpYyBib29sZWFuIHZmZV9zZW5kX3RodW1ibmFpbF9tc2coc3RydWN0IG1zbV92ZmVfcmVzcCAqcnAsCi0JCXN0cnVjdCB2ZmVfbWVzc2FnZSAqbXNnLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB2ZmVfbXNnX291dHB1dCAqcFBheWxvYWQgPSBkYXRhOwotCi0JaWYgKGN0cmwtPnZzdGF0ZSAhPSBWRkVfU1RBVEVfQUNUSVZFKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQltZW1jcHkoJihtc2ctPl91KSwgKHZvaWQgKilwUGF5bG9hZCwgc2l6ZW9mKHN0cnVjdCB2ZmVfbXNnX291dHB1dCkpOwotCi0JcnAtPnBoeS5vdXRwdXRfaWQgPSBPVVRQVVRfVFlQRV9UOwotCUNEQkcoInZmZV9zZW5kX3RodW1ibmFpbF9tc2cgcnAtPnR5cGU9ICVkXG4iLCBycC0+dHlwZSk7Ci0KLQlpZiAoY3RybC0+dmlld1BhdGguc25hcHNob3RQZW5kaW5nQ291bnQgPD0gMSkKLQkJY3RybC0+dmlld1BhdGguYWNrUGVuZGluZyA9IEZBTFNFOwotCi0JdmZlX2FkZHJfY29udmVydCgmKHJwLT5waHkpLAotCQkJcnAtPnR5cGUsIG1zZywKLQkJCSYocnAtPmV4dGRhdGEpLCAmKHJwLT5leHRsZW4pKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotc3RhdGljIGJvb2xlYW4gdmZlX3NlbmRfbWFpbmltYWdlX21zZyhzdHJ1Y3QgbXNtX3ZmZV9yZXNwICpycCwKLQkJc3RydWN0IHZmZV9tZXNzYWdlICptc2csIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHZmZV9tc2dfb3V0cHV0ICpwUGF5bG9hZCA9IGRhdGE7Ci0KLQlpZiAoY3RybC0+dnN0YXRlICE9IFZGRV9TVEFURV9BQ1RJVkUpCi0JCXJldHVybiBGQUxTRTsKLQotCW1lbWNweSgmKG1zZy0+X3UpLCAodm9pZCAqKXBQYXlsb2FkLCBzaXplb2Yoc3RydWN0IHZmZV9tc2dfb3V0cHV0KSk7Ci0KLQlycC0+cGh5Lm91dHB1dF9pZCA9IE9VVFBVVF9UWVBFX1M7Ci0JQ0RCRygidmZlX3NlbmRfbWFpbmltYWdlX21zZyBycC0+dHlwZT0gJWRcbiIsIHJwLT50eXBlKTsKLQotCWlmIChjdHJsLT5lbmNQYXRoLnNuYXBzaG90UGVuZGluZ0NvdW50IDw9IDEpIHsKLQkJY3RybC0+ZW5jUGF0aC5hY2tQZW5kaW5nID0gRkFMU0U7Ci0JfQotCi0JdmZlX2FkZHJfY29udmVydCgmKHJwLT5waHkpLAotCQkJcnAtPnR5cGUsIG1zZywKLQkJCSYocnAtPmV4dGRhdGEpLCAmKHJwLT5leHRsZW4pKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfc2VuZF9vdXRwdXRfbXNnKGJvb2xlYW4gd2hpY2hPdXRwdXRQYXRoLAotCXVpbnQzMl90IHlQYXRoQWRkciwgdWludDMyX3QgY2JjclBhdGhBZGRyKQotewotCXN0cnVjdCB2ZmVfbXNnX291dHB1dCBtc2dQYXlsb2FkOwotCi0JbXNnUGF5bG9hZC55QnVmZmVyID0geVBhdGhBZGRyOwotCW1zZ1BheWxvYWQuY2JjckJ1ZmZlciA9IGNiY3JQYXRoQWRkcjsKLQotCS8qIGFzZiBpbmZvIGlzIGNvbW1vbiBmb3IgYm90aCBvdXRwdXQxIGFuZCBvdXRwdXQyICovCi0jaWYgMAotCW1zZ1BheWxvYWQuYXNmSW5mby5hc2ZIYmlDb3VudCA9IGN0cmwtPnZmZUFzZkZyYW1lSW5mby5hc2ZIYmlDb3VudDsKLQltc2dQYXlsb2FkLmFzZkluZm8uYXNmTWF4RWRnZSA9IGN0cmwtPnZmZUFzZkZyYW1lSW5mby5hc2ZNYXhFZGdlOwotCi0JLyogZGVtb3NhaWMgaW5mbyBpcyBjb21tb24gZm9yIGJvdGggb3V0cHV0MSBhbmQgb3V0cHV0MiAqLwotCW1zZ1BheWxvYWQuYnBjSW5mby5ncmVlbkRlZmVjdFBpeGVsQ291bnQgPQotCQljdHJsLT52ZmVCcGNGcmFtZUluZm8uZ3JlZW5EZWZlY3RQaXhlbENvdW50OwotCW1zZ1BheWxvYWQuYnBjSW5mby5yZWRCbHVlRGVmZWN0UGl4ZWxDb3VudCA9Ci0JCWN0cmwtPnZmZUJwY0ZyYW1lSW5mby5yZWRCbHVlRGVmZWN0UGl4ZWxDb3VudDsKLSNlbmRpZiAvKiBpZiAwICovCi0KLQkvKiBmcmFtZSBJRCBpcyBjb21tb24gZm9yIGJvdGggcGF0aHMuICovCi0JbXNnUGF5bG9hZC5mcmFtZUNvdW50ZXIgPSBjdHJsLT52ZmVGcmFtZUlkOwotCi0JaWYgKHdoaWNoT3V0cHV0UGF0aCkgewotCQkvKiBtc2dQYXlsb2FkLnBtRGF0YSA9IGN0cmwtPnZmZVBtRGF0YS5lbmNQYXRoUG1JbmZvOyAqLwotCQljdHJsLT5lbmNQYXRoLmFja1BlbmRpbmcgPSBUUlVFOwotCi0JCWlmIChjdHJsLT52ZmVPcGVyYXRpb25Nb2RlID09IDApIHsKLQkJCWlmIChjdHJsLT5heGlPdXRwdXRNb2RlID09Ci0JCQkJVkZFX0FYSV9PVVRQVVRfTU9ERV9PdXRwdXQxQW5kT3V0cHV0MikgewotCQkJCS8qIHZpZGVvIG1vZGUgKi8KLQkJCQl2ZmVfcHJvY19vcHMoVkZFX01TR19JRF9PVVRQVVRfViwgJm1zZ1BheWxvYWQpOwotCQkJfSBlbHNlewotCQkJCS8qIHByZXZpZXcgbW9kZSAqLwotCQkJCXZmZV9wcm9jX29wcyhWRkVfTVNHX0lEX09VVFBVVF9QLCAmbXNnUGF5bG9hZCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl2ZmVfcHJvY19vcHMoVkZFX01TR19JRF9PVVRQVVRfUywgJm1zZ1BheWxvYWQpOwotCQl9Ci0KLQl9IGVsc2UgewotCQkvKiBwaHlzaWNhbCBvdXRwdXQxIHBhdGggZnJvbSB2ZmUgKi8KLQkJY3RybC0+dmlld1BhdGguYWNrUGVuZGluZyA9IFRSVUU7Ci0KLQkJaWYgKGN0cmwtPnZmZU9wZXJhdGlvbk1vZGUgPT0gMCkgewotCQkJdmZlX3Byb2Nfb3BzKFZGRV9NU0dfSURfT1VUUFVUX1AsICZtc2dQYXlsb2FkKTsKLQkJCUNEQkcoIiB2aWRlbyBtb2RlIGRpc3BsYXkgb3V0cHV0LlxuIik7Ci0KLQkJfSBlbHNlewotCQkJdmZlX3Byb2Nfb3BzKFZGRV9NU0dfSURfT1VUUFVUX1QsICZtc2dQYXlsb2FkKTsKLQkJCUNEQkcoIiBzbmFwc2hvdCBtb2RlIHRodW1ibmFpbCBvdXRwdXQuXG4iKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgdmZlX3Byb2Nlc3NfZnJhbWVfZG9uZV9pcnFfbXVsdGlfZnJhZyhzdHJ1Y3QgdmZlX291dHB1dF9wYXRoX2NvbWJvCi0JCQkJCQkgICppbikKLXsKLQl1aW50MzJfdCB5QWRkcmVzcywgY2JjckFkZHJlc3M7Ci0JdWludDE2X3QgaWR4OwotCXVpbnQzMl90ICpwdHJZOwotCXVpbnQzMl90ICpwdHJDYmNyOwotCWNvbnN0IHVpbnQzMl90ICpwdHJTcmM7Ci0JdWludDhfdCBpOwotCi0JaWYgKCFpbi0+YWNrUGVuZGluZykgewotCi0JCWlkeCA9IChpbi0+Y3VycmVudEZyYW1lKSAqIChpbi0+ZnJhZ0NvdW50KTsKLQotCQkvKiBTZW5kIG91dHB1dCBtZXNzYWdlLiAqLwotCQl5QWRkcmVzcyA9IGluLT55UGF0aC5hZGRyZXNzQnVmZmVyW2lkeF07Ci0JCWNiY3JBZGRyZXNzID0gaW4tPmNiY3JQYXRoLmFkZHJlc3NCdWZmZXJbaWR4XTsKLQotCQkvKiBjb3B5IG5leHQgZnJhbWUgdG8gY3VycmVudCBmcmFtZS4gKi8KLQkJcHRyU3JjICA9IGluLT5uZXh0RnJhbWVBZGRyQnVmOwotCQlwdHJZID0gKHVpbnQzMl90ICopJmluLT55UGF0aC5hZGRyZXNzQnVmZmVyW2lkeF07Ci0JCXB0ckNiY3IgPSAodWludDMyX3QgKikmaW4tPmNiY3JQYXRoLmFkZHJlc3NCdWZmZXJbaWR4XTsKLQotCQkvKiBDb3B5IFkgYWRkcmVzcyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgaW4tPmZyYWdDb3VudDsgaSsrKQotCQkJKnB0clkrKyA9ICpwdHJTcmMrKzsKLQotCQkvKiBDb3B5IENiY3IgYWRkcmVzcyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgaW4tPmZyYWdDb3VudDsgaSsrKQotCQkJKnB0ckNiY3IrKyA9ICpwdHJTcmMrKzsKLQotCQl2ZmVfc2VuZF9vdXRwdXRfbXNnKGluLT53aGljaE91dHB1dFBhdGgsIHlBZGRyZXNzLCBjYmNyQWRkcmVzcyk7Ci0KLQl9IGVsc2UgewotCQlpZiAoaW4tPndoaWNoT3V0cHV0UGF0aCA9PSAwKQotCQkJY3RybC0+dmZlRHJvcHBlZEZyYW1lQ291bnRzLm91dHB1dDFDb3VudCsrOwotCi0JCWlmIChpbi0+d2hpY2hPdXRwdXRQYXRoID09IDEpCi0JCQljdHJsLT52ZmVEcm9wcGVkRnJhbWVDb3VudHMub3V0cHV0MkNvdW50Kys7Ci0JfQotCi0JLyogdG9nZ2xlIGN1cnJlbnQgZnJhbWUuICovCi0JaW4tPmN1cnJlbnRGcmFtZSA9IGluLT5jdXJyZW50RnJhbWVeMTsKLQotCWlmIChjdHJsLT52ZmVPcGVyYXRpb25Nb2RlKQotCQlpbi0+c25hcHNob3RQZW5kaW5nQ291bnQtLTsKLX0KLQotc3RhdGljIHZvaWQgdmZlX3Byb2Nlc3NfZnJhbWVfZG9uZV9pcnFfbm9fZnJhZ19pbygKLQkJc3RydWN0IHZmZV9vdXRwdXRfcGF0aF9jb21ibyAqaW4sCi0JCXVpbnQzMl90ICpwTmV4dEFkZHIsCi0JdWludDMyX3QgKnBkZXN0UmVuZGVyQWRkcikKLXsKLQl1aW50MzJfdCBidXNQaW5nUG9uZ1N0YXR1czsKLQl1aW50MzJfdCB0ZW1wQWRkcmVzczsKLQotCS8qIDEuIHJlYWQgaHcgc3RhdHVzIHJlZ2lzdGVyLiAqLwotCWJ1c1BpbmdQb25nU3RhdHVzID0gcmVhZGwoY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfUElOR1BPTkdfU1RBVFVTKTsKLQotCUNEQkcoImhhcmR3YXJlIHN0YXR1cyBpcyAweCV4XG4iLCBidXNQaW5nUG9uZ1N0YXR1cyk7Ci0KLQkvKiAyLiBkZXRlcm1pbmUgcGluZyBvciBwb25nICovCi0JLyogdXNlIGNiY3Igc3RhdHVzICovCi0JYnVzUGluZ1BvbmdTdGF0dXMgPSBidXNQaW5nUG9uZ1N0YXR1cyAmICgxPDwoaW4tPmNiY3JTdGF0dXNCaXQpKTsKLQotCS8qIDMuIHJlYWQgb3V0IGFkZHJlc3MgYW5kIHVwZGF0ZSBhZGRyZXNzICovCi0JaWYgKGJ1c1BpbmdQb25nU3RhdHVzID09IDApIHsKLQkJLyogaHcgaXMgd29ya2luZyBvbiBwaW5nLCByZW5kZXIgcG9uZyBidWZmZXIgKi8KLQkJLyogYS4gcmVhZCBvdXQgcG9uZyBhZGRyZXNzICovCi0JCS8qIHJlYWQgb3V0IHkgYWRkcmVzcy4gKi8KLQkJdGVtcEFkZHJlc3MgPSByZWFkbChpbi0+eVBhdGguaHdSZWdQb25nQWRkcmVzcyk7Ci0KLQkJQ0RCRygicG9uZyAxIGFkZHIgPSAweCV4XG4iLCB0ZW1wQWRkcmVzcyk7Ci0JCSpwZGVzdFJlbmRlckFkZHIrKyA9IHRlbXBBZGRyZXNzOwotCQkvKiByZWFkIG91dCBjYmNyIGFkZHJlc3MuICovCi0JCXRlbXBBZGRyZXNzID0gcmVhZGwoaW4tPmNiY3JQYXRoLmh3UmVnUG9uZ0FkZHJlc3MpOwotCi0JCUNEQkcoInBvbmcgMiBhZGRyID0gMHgleFxuIiwgdGVtcEFkZHJlc3MpOwotCQkqcGRlc3RSZW5kZXJBZGRyID0gdGVtcEFkZHJlc3M7Ci0KLQkJLyogYi4gdXBkYXRlIHBvbmcgYWRkcmVzcyAqLwotCQl3cml0ZWwoKnBOZXh0QWRkcisrLCBpbi0+eVBhdGguaHdSZWdQb25nQWRkcmVzcyk7Ci0JCXdyaXRlbCgqcE5leHRBZGRyLCBpbi0+Y2JjclBhdGguaHdSZWdQb25nQWRkcmVzcyk7Ci0JfSBlbHNlIHsKLQkJLyogaHcgaXMgd29ya2luZyBvbiBwb25nLCByZW5kZXIgcGluZyBidWZmZXIgKi8KLQotCQkvKiBhLiByZWFkIG91dCBwaW5nIGFkZHJlc3MgKi8KLQkJdGVtcEFkZHJlc3MgPSByZWFkbChpbi0+eVBhdGguaHdSZWdQaW5nQWRkcmVzcyk7Ci0JCUNEQkcoInBpbmcgMSBhZGRyID0gMHgleFxuIiwgdGVtcEFkZHJlc3MpOwotCQkqcGRlc3RSZW5kZXJBZGRyKysgPSB0ZW1wQWRkcmVzczsKLQkJdGVtcEFkZHJlc3MgPSByZWFkbChpbi0+Y2JjclBhdGguaHdSZWdQaW5nQWRkcmVzcyk7Ci0KLQkJQ0RCRygicGluZyAyIGFkZHIgPSAweCV4XG4iLCB0ZW1wQWRkcmVzcyk7Ci0JCSpwZGVzdFJlbmRlckFkZHIgPSB0ZW1wQWRkcmVzczsKLQotCQkvKiBiLiB1cGRhdGUgcGluZyBhZGRyZXNzICovCi0JCXdyaXRlbCgqcE5leHRBZGRyKyssIGluLT55UGF0aC5od1JlZ1BpbmdBZGRyZXNzKTsKLQkJQ0RCRygiTmV4dEFkZHJlc3MgPSAweCV4XG4iLCAqcE5leHRBZGRyKTsKLQkJd3JpdGVsKCpwTmV4dEFkZHIsIGluLT5jYmNyUGF0aC5od1JlZ1BpbmdBZGRyZXNzKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHZmZV9wcm9jZXNzX2ZyYW1lX2RvbmVfaXJxX25vX2ZyYWcoc3RydWN0IHZmZV9vdXRwdXRfcGF0aF9jb21ibyAqaW4pCi17Ci0JdWludDMyX3QgYWRkcmVzc1RvUmVuZGVyWzJdOwotCi0JaWYgKCFpbi0+YWNrUGVuZGluZykgewotCQl2ZmVfcHJvY2Vzc19mcmFtZV9kb25lX2lycV9ub19mcmFnX2lvKGluLAotCQkJCQkJICAgICAgaW4tPm5leHRGcmFtZUFkZHJCdWYsCi0JCQkJCQkgICAgICBhZGRyZXNzVG9SZW5kZXIpOwotCi0JCS8qIHVzZSBhZGRyZXNzVG9SZW5kZXIgdG8gc2VuZCBvdXQgbWVzc2FnZS4gKi8KLQkJdmZlX3NlbmRfb3V0cHV0X21zZyhpbi0+d2hpY2hPdXRwdXRQYXRoLAotCQkJCWFkZHJlc3NUb1JlbmRlclswXSwgYWRkcmVzc1RvUmVuZGVyWzFdKTsKLQotCX0gZWxzZSB7Ci0JCS8qIGFja1BlbmRpbmcgaXMgc3RpbGwgdGhlcmUsIGFjY3VtdWxhdGUgZHJvcHBlZCBmcmFtZSBjb3VudC4KLQkJICogVGhlc2UgY291bnQgY2FuIGJlIHJlYWQgdGhyb3VnaCBpb2N0cmwgY29tbWFuZC4gKi8KLQkJQ0RCRygid2FpdGluZyBmcmFtZSBBQ0tcbiIpOwotCi0JCWlmIChpbi0+d2hpY2hPdXRwdXRQYXRoID09IDApCi0JCQljdHJsLT52ZmVEcm9wcGVkRnJhbWVDb3VudHMub3V0cHV0MUNvdW50Kys7Ci0KLQkJaWYgKGluLT53aGljaE91dHB1dFBhdGggPT0gMSkKLQkJCWN0cmwtPnZmZURyb3BwZWRGcmFtZUNvdW50cy5vdXRwdXQyQ291bnQrKzsKLQl9Ci0KLQkvKiBpbiBjYXNlIG9mIG11bHRpc2hvdCB3aGVuIHVwcGVyIGxheWVyIGRpZCBub3QgYWNrLCB0aGVyZSB3aWxsIHN0aWxsCi0JICogYmUgYSBzbmFwc2hvdCBkb25lIG1zZyBzZW50IG91dCwgZXZlbiB0aG91Z2ggdGhlIG51bWJlciBvZiBmcmFtZXMKLQkgKiBzZW50IG91dCBtYXkgYmUgbGVzcyB0aGFuIHRoZSBkZXNpcmVkIG51bWJlciBvZiBmcmFtZXMuICBzbmFwc2hvdAotCSAqIGRvbmUgbXNnIHdvdWxkIGJlIGhlbHBmdWwgdG8gaW5kaWNhdGUgdGhhdCB2ZmUgcGlwZWxpbmUgaGFzIHN0b3AsCi0JICogYW5kIGluIGdvb2Qga25vd24gc3RhdGUuCi0JICovCi0JaWYgKGN0cmwtPnZmZU9wZXJhdGlvbk1vZGUpCi0JCWluLT5zbmFwc2hvdFBlbmRpbmdDb3VudC0tOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfcHJvY2Vzc19vdXRwdXRfcGF0aF9pcnEoc3RydWN0IHZmZV9pbnRlcnJ1cHRfc3RhdHVzICppcnFzdGF0dXMpCi17Ci0JLyogdW5zaWduZWQgbG9uZyBmbGFnczsgKi8KLQotCS8qIHByb2Nlc3MgdGhlIHZpZXcgcGF0aCBpbnRlcnJ1cHRzICovCi0JaWYgKGlycXN0YXR1cy0+YW55T3V0cHV0MVBhdGhJcnFzKSB7Ci0JCWlmIChjdHJsLT52aWV3UGF0aC5tdWx0aUZyYWcpIHsKLQotCQkJaWYgKGlycXN0YXR1cy0+dmlld0NiY3JQaW5ncG9uZ0lycSkKLQkJCQl2ZmVfcHJvY2Vzc19waW5ncG9uZ19pcnEoJgotCQkJCQkJCSAoY3RybC0+dmlld1BhdGguCi0JCQkJCQkJICBjYmNyUGF0aCksCi0JCQkJCQkJIGN0cmwtPnZpZXdQYXRoLgotCQkJCQkJCSBmcmFnQ291bnQpOwotCi0JCQlpZiAoaXJxc3RhdHVzLT52aWV3WVBpbmdwb25nSXJxKQotCQkJCXZmZV9wcm9jZXNzX3Bpbmdwb25nX2lycSgmCi0JCQkJCQkJIChjdHJsLT52aWV3UGF0aC55UGF0aCksCi0JCQkJCQkJIGN0cmwtPnZpZXdQYXRoLgotCQkJCQkJCSBmcmFnQ291bnQpOwotCi0JCQlpZiAoaXJxc3RhdHVzLT52aWV3SXJxKQotCQkJCXZmZV9wcm9jZXNzX2ZyYW1lX2RvbmVfaXJxX211bHRpX2ZyYWcoJmN0cmwtPgotCQkJCQkJCQkgICAgICB2aWV3UGF0aCk7Ci0KLQkJfSBlbHNlIHsKLQkJCS8qIHR5cGljYWwgY2FzZSBmb3Igbm8gZnJhZ21lbnQsCi0JCQkgb25seSBmcmFtZSBkb25lIGlycSBpcyBlbmFibGVkLiAqLwotCQkJaWYgKGlycXN0YXR1cy0+dmlld0lycSkKLQkJCQl2ZmVfcHJvY2Vzc19mcmFtZV9kb25lX2lycV9ub19mcmFnKCZjdHJsLT4KLQkJCQkJCQkJICAgdmlld1BhdGgpOwotCQl9Ci0JfQotCi0JLyogcHJvY2VzcyB0aGUgZW5jb2RlciBwYXRoIGludGVycnVwdHMgKi8KLQlpZiAoaXJxc3RhdHVzLT5hbnlPdXRwdXQyUGF0aElycXMpIHsKLQkJaWYgKGN0cmwtPmVuY1BhdGgubXVsdGlGcmFnKSB7Ci0JCQlpZiAoaXJxc3RhdHVzLT5lbmNDYmNyUGluZ3BvbmdJcnEpCi0JCQkJdmZlX3Byb2Nlc3NfcGluZ3BvbmdfaXJxKCYKLQkJCQkJCQkgKGN0cmwtPmVuY1BhdGguCi0JCQkJCQkJICBjYmNyUGF0aCksCi0JCQkJCQkJIGN0cmwtPmVuY1BhdGguCi0JCQkJCQkJIGZyYWdDb3VudCk7Ci0KLQkJCWlmIChpcnFzdGF0dXMtPmVuY1lQaW5ncG9uZ0lycSkKLQkJCQl2ZmVfcHJvY2Vzc19waW5ncG9uZ19pcnEoJihjdHJsLT5lbmNQYXRoLnlQYXRoKSwKLQkJCQkJCQkgY3RybC0+ZW5jUGF0aC4KLQkJCQkJCQkgZnJhZ0NvdW50KTsKLQotCQkJaWYgKGlycXN0YXR1cy0+ZW5jSXJxKQotCQkJCXZmZV9wcm9jZXNzX2ZyYW1lX2RvbmVfaXJxX211bHRpX2ZyYWcoJmN0cmwtPgotCQkJCQkJCQkgICAgICBlbmNQYXRoKTsKLQotCQl9IGVsc2UgewotCQkJaWYgKGlycXN0YXR1cy0+ZW5jSXJxKQotCQkJCXZmZV9wcm9jZXNzX2ZyYW1lX2RvbmVfaXJxX25vX2ZyYWcoJmN0cmwtPgotCQkJCQkJCQkgICBlbmNQYXRoKTsKLQkJfQotCX0KLQotCWlmIChjdHJsLT52ZmVPcGVyYXRpb25Nb2RlKSB7Ci0JCWlmICgoY3RybC0+ZW5jUGF0aC5zbmFwc2hvdFBlbmRpbmdDb3VudCA9PSAwKSAmJgotCQkJCShjdHJsLT52aWV3UGF0aC5zbmFwc2hvdFBlbmRpbmdDb3VudCA9PSAwKSkgewotCi0JCQkvKiBAdG9kbyBUaGlzIGlzIGNhdXNpbmcgaXNzdWVzLCBmdXJ0aGVyIGludmVzdGlnYXRlICovCi0JCQkvKiBzcGluX2xvY2tfaXJxc2F2ZSgmY3RybC0+c3RhdGVfbG9jaywgZmxhZ3MpOyAqLwotCQkJY3RybC0+dnN0YXRlID0gVkZFX1NUQVRFX0lETEU7Ci0JCQkvKiBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHJsLT5zdGF0ZV9sb2NrLCBmbGFncyk7ICovCi0KLQkJCXZmZV9wcm9jX29wcyhWRkVfTVNHX0lEX1NOQVBTSE9UX0RPTkUsIE5VTEwpOwotCQkJdmZlX2NhbWlmX3N0b3BfaW1tZWRpYXRlbHkoKTsKLQkJCXZmZV9wcm9nX2h3X3Rlc3RnZW5fY21kKFZGRV9URVNUX0dFTl9TVE9QKTsKLQkJCXZmZV9wbV9zdG9wKCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9fdmZlX2RvX3Rhc2tsZXQoc3RydWN0IGlzcl9xdWV1ZV9jbWQgKnFjbWQpCi17Ci0JaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1cy5yZWdVcGRhdGVJcnEpIHsKLQkJQ0RCRygiaXJxIHJlZ1VwZGF0ZUlycVxuIik7Ci0JCXZmZV9wcm9jZXNzX3JlZ191cGRhdGVfaXJxKCk7Ci0JfQotCi0JaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1cy5yZXNldEFja0lycSkgewotCQlDREJHKCIlczogcHJvY2VzcyByZXNldEFja0lycVxuIiwgX19mdW5jX18pOwotCQl2ZmVfcHJvY2Vzc19yZXNldF9pcnEoKTsKLQl9Ci0KLQlpZiAoY3RybC0+dnN0YXRlICE9IFZGRV9TVEFURV9BQ1RJVkUpCi0JCXJldHVybjsKLQotI2lmIDAKLQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzLmNhbWlmRXBvY2gxSXJxKQotCQl2ZmVfcHJvY19vcHMoVkZFX01TR19JRF9FUE9DSDEpOwotCi0JaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1cy5jYW1pZkVwb2NoMklycSkKLQkJdmZlX3Byb2Nfb3BzKFZGRV9NU0dfSURfRVBPQ0gyKTsKLSNlbmRpZiAvKiBKZWZmICovCi0KLQkvKiBuZXh0LCBjaGVjayBvdXRwdXQgcGF0aCByZWxhdGVkIGludGVycnVwdHMuICovCi0JaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1cy5hbnlPdXRwdXRQYXRoSXJxcykgewotCQlDREJHKCJpcnE6IGFueU91dHB1dFBhdGhJcnFzXG4iKTsKLQkJdmZlX3Byb2Nlc3Nfb3V0cHV0X3BhdGhfaXJxKCZxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMpOwotCX0KLQotCWlmIChxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMuYWZQaW5ncG9uZ0lycSkKLQkJdmZlX3Byb2Nlc3Nfc3RhdHNfYWZfaXJxKCk7Ci0KLQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzLmF3YlBpbmdwb25nSXJxKQotCQl2ZmVfcHJvY2Vzc19zdGF0c19hd2JfaXJxKCk7Ci0KLQkvKiBhbnkgZXJyb3IgaXJxcyovCi0JaWYgKHFjbWQtPnZmZUludGVycnVwdFN0YXR1cy5hbnlFcnJvcklycXMpCi0JCXZmZV9wcm9jZXNzX2Vycm9yX2lycSgmcWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzKTsKLQotI2lmIDAKLQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzLmFueVN5bmNUaW1lcklycXMpCi0JCXZmZV9wcm9jZXNzX3N5bmNfdGltZXJfaXJxKCk7Ci0KLQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzLmFueUFzeW5jVGltZXJJcnFzKQotCQl2ZmVfcHJvY2Vzc19hc3luY190aW1lcl9pcnEoKTsKLSNlbmRpZiAvKiBKZWZmICovCi0KLQlpZiAocWNtZC0+dmZlSW50ZXJydXB0U3RhdHVzLmNhbWlmU29mSXJxKSB7Ci0JCUNEQkcoImlycTogY2FtaWZTb2ZJcnFcbiIpOwotCQl2ZmVfcHJvY2Vzc19jYW1pZl9zb2ZfaXJxKCk7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGlzcl9xdWV1ZV9jbWQgKmdldF9pcnFfY21kX25vc3luYyh2b2lkKQotewotCWludCBvbGRfZ2V0ID0gY3RybC0+aXJxX2dldCsrOwotCWN0cmwtPmlycV9nZXQgPSBjdHJsLT5pcnFfZ2V0ICUgQVJSQVlfU0laRShjdHJsLT5pcnFzKTsKLQlpZiAoY3RybC0+aXJxX2dldCA9PSBjdHJsLT5pcnFfcHV0KSB7Ci0JCXByX2VycigiJXM6IG91dCBvZiBpcnEgY29tbWFuZCBwYWNrZXRzXG4iLCBfX2Z1bmNfXyk7Ci0JCWN0cmwtPmlycV9nZXQgPSBvbGRfZ2V0OwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gY3RybC0+aXJxcyArIG9sZF9nZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXNyX3F1ZXVlX2NtZCAqbmV4dF9pcnFfY21kKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXNyX3F1ZXVlX2NtZCAqY21kOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjdHJsLT5pcnFzX2xvY2ssIGZsYWdzKTsKLQlpZiAoY3RybC0+aXJxX2dldCA9PSBjdHJsLT5pcnFfcHV0KSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0cmwtPmlycXNfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gTlVMTDsgLyogYWxyZWFkeSBlbXB0eSAqLwotCX0KLQljbWQgPSBjdHJsLT5pcnFzICsgY3RybC0+aXJxX3B1dDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHJsLT5pcnFzX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gY21kOwotfQotCi1zdGF0aWMgdm9pZCBwdXRfaXJxX2NtZCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmN0cmwtPmlycXNfbG9jaywgZmxhZ3MpOwotCWlmIChjdHJsLT5pcnFfZ2V0ID09IGN0cmwtPmlycV9wdXQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3RybC0+aXJxc19sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsgLyogYWxyZWFkeSBlbXB0eSAqLwotCX0KLQljdHJsLT5pcnFfcHV0Kys7Ci0JY3RybC0+aXJxX3B1dCAlPSBBUlJBWV9TSVpFKGN0cmwtPmlycXMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0cmwtPmlycXNfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfZG9fdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JaW50IGNudCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXNyX3F1ZXVlX2NtZCAqcWNtZCA9IE5VTEw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX3ZmZV9jdHJsX2xvY2ssIGZsYWdzKTsKLQlpZiAoIWN0cmwpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNtX3ZmZV9jdHJsX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCUNEQkcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQl3aGlsZSAoKHFjbWQgPSBuZXh0X2lycV9jbWQoKSkpIHsKLQkJX192ZmVfZG9fdGFza2xldChxY21kKTsKLQkJcHV0X2lycV9jbWQoKTsKLQkJY250Kys7Ci0JfQotCi0JaWYgKGNudCA+IEFSUkFZX1NJWkUoY3RybC0+aXJxcykvMikKLQkJQ0RCRygiJXM6IHNlcnZpY2VkICVkIHZmZSBpbnRlcnJ1cHRzXG4iLCBfX2Z1bmNfXywgY250KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV92ZmVfY3RybF9sb2NrLCBmbGFncyk7Ci19Ci0KLURFQ0xBUkVfVEFTS0xFVCh2ZmVfdGFza2xldCwgdmZlX2RvX3Rhc2tsZXQsIDApOwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgdmZlX3BhcnNlX2lycShpbnQgaXJxX251bSwgdm9pZCAqZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IGlycVN0YXR1c0xvY2FsOwotCXN0cnVjdCB2ZmVfaXJxX3RocmVhZF9tc2cgaXJxOwotCXN0cnVjdCBpc3JfcXVldWVfY21kICpxY21kOwotCi0JQ0RCRygidmZlX3BhcnNlX2lycVxuIik7Ci0KLQlpZiAoIWF0b21pY19yZWFkKCZjdHJsLT52ZmVfc2Vydl9pbnRlcnJ1cHQpKQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLQl2ZmVfcmVhZF9pcnFfc3RhdHVzKCZpcnEpOwotCi0JaWYgKGlycS52ZmVJcnFTdGF0dXMgPT0gMCkgewotCQlDREJHKCJ2ZmVfcGFyc2VfaXJxOiBpcnEudmZlSXJxU3RhdHVzIGlzIDBcbiIpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JaWYgKGN0cmwtPnZmZVN0b3BBY2tQZW5kaW5nKQotCQlpcnFTdGF0dXNMb2NhbCA9IChWRkVfSU1BU0tfV0hJTEVfU1RPUFBJTkcgJiBpcnEudmZlSXJxU3RhdHVzKTsKLQllbHNlCi0JCWlycVN0YXR1c0xvY2FsID0KLQkJCSgoY3RybC0+dmZlSW1hc2tQYWNrZWQgfCBWRkVfSU1BU0tfRVJST1JfT05MWSkgJgotCQkJCWlycS52ZmVJcnFTdGF0dXMpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmN0cmwtPmlycXNfbG9jaywgZmxhZ3MpOwotCXFjbWQgPSBnZXRfaXJxX2NtZF9ub3N5bmMoKTsKLQlpZiAoIXFjbWQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3RybC0+aXJxc19sb2NrLCBmbGFncyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JLyogZmlyc3QgcGFyc2UgdGhlIGludGVycnVwdCBzdGF0dXMgdG8gbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzLiAqLwotCXZmZV9wYXJzZV9pbnRlcnJ1cHRfc3RhdHVzKCZxY21kLT52ZmVJbnRlcnJ1cHRTdGF0dXMsIGlycVN0YXR1c0xvY2FsKTsKLQl2ZmVfZ2V0X2FzZl9mcmFtZV9pbmZvKCZxY21kLT52ZmVBc2ZGcmFtZUluZm8sICZpcnEpOwotCXZmZV9nZXRfZGVtb3NhaWNfZnJhbWVfaW5mbygmcWNtZC0+dmZlQnBjRnJhbWVJbmZvLCAmaXJxKTsKLQl2ZmVfZ2V0X2NhbWlmX3N0YXR1cygmcWNtZC0+dmZlQ2FtaWZTdGF0dXNMb2NhbCwgJmlycSk7Ci0JdmZlX2dldF9wZXJmb3JtYW5jZV9tb25pdG9yX2RhdGEoJnFjbWQtPnZmZVBtRGF0YSwgJmlycSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3RybC0+aXJxc19sb2NrLCBmbGFncyk7Ci0JdGFza2xldF9zY2hlZHVsZSgmdmZlX3Rhc2tsZXQpOwotCi1kb25lOgotCS8qIGNsZWFyIHRoZSBwZW5kaW5nIGludGVycnVwdCBvZiB0aGUgc2FtZSBraW5kLiovCi0Jd3JpdGVsKGlycS52ZmVJcnFTdGF0dXMsIGN0cmwtPnZmZWJhc2UgKyBWRkVfSVJRX0NMRUFSKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotaW50IHZmZV9jbWRfaW5pdChzdHJ1Y3QgbXNtX3ZmZV9jYWxsYmFjayAqcHJlc3AsCi0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgdm9pZCAqc2RhdGEpCi17Ci0Jc3RydWN0IHJlc291cmNlCSp2ZmVtZW0sICp2ZmVpcnEsICp2ZmVpbzsKLQlpbnQgcmM7Ci0Jc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNfaW5mbzsKLQlzX2luZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQotCXBkZXYtPnJlc291cmNlID0gc19pbmZvLT5yZXNvdXJjZTsKLQlwZGV2LT5udW1fcmVzb3VyY2VzID0gc19pbmZvLT5udW1fcmVzb3VyY2VzOwotCi0JdmZlbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXZmZW1lbSkgewotCQlwcl9lcnIoIiVzOiBubyBtZW0gcmVzb3VyY2VcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JdmZlaXJxID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKLQlpZiAoIXZmZWlycSkgewotCQlwcl9lcnIoIiVzOiBubyBpcnEgcmVzb3VyY2VcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JdmZlaW8gPSByZXF1ZXN0X21lbV9yZWdpb24odmZlbWVtLT5zdGFydCwKLQkJcmVzb3VyY2Vfc2l6ZSh2ZmVtZW0pLCBwZGV2LT5uYW1lKTsKLQlpZiAoIXZmZWlvKSB7Ci0JCXByX2VycigiJXM6IFZGRSByZWdpb24gYWxyZWFkeSBjbGFpbWVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JY3RybCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fdmZlOHhfY3RybCksIEdGUF9LRVJORUwpOwotCWlmICghY3RybCkgewotCQlwcl9lcnIoIiVzOiBvdXQgb2YgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBjbWRfaW5pdF9mYWlsZWQxOwotCX0KLQlhdG9taWNfc2V0KCZjdHJsLT52ZmVfc2Vydl9pbnRlcnJ1cHQsIDApOwotCWN0cmwtPnZmZWlycSAgPSB2ZmVpcnEtPnN0YXJ0OwotCi0JY3RybC0+dmZlYmFzZSA9Ci0JCWlvcmVtYXAodmZlbWVtLT5zdGFydCwgKHZmZW1lbS0+ZW5kIC0gdmZlbWVtLT5zdGFydCkgKyAxKTsKLQlpZiAoIWN0cmwtPnZmZWJhc2UpIHsKLQkJcHJfZXJyKCIlczogaW9yZW1hcCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGNtZF9pbml0X2ZhaWxlZDI7Ci0JfQotCi0JcmMgPSByZXF1ZXN0X2lycShjdHJsLT52ZmVpcnEsIHZmZV9wYXJzZV9pcnEsCi0JCUlSUUZfVFJJR0dFUl9SSVNJTkcsICJ2ZmUiLCAwKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IHJlcXVlc3RfaXJxKCVkKSBmYWlsZWRcbiIsIF9fZnVuY19fLCBjdHJsLT52ZmVpcnEpOwotCQlnb3RvIGNtZF9pbml0X2ZhaWxlZDI7Ci0JfQotCi0JaWYgKHByZXNwICYmIHByZXNwLT52ZmVfcmVzcCkKLQkJY3RybC0+cmVzcCA9IHByZXNwOwotCWVsc2UgewotCQlwcl9lcnIoIiVzOiBubyB2ZmVfcmVzcCBmdW5jdGlvblxuIiwgX19mdW5jX18pOwotCi0JCXJjID0gLUVJTzsKLQkJZ290byBjbWRfaW5pdF9mYWlsZWQzOwotCX0KLQotCWN0cmwtPnN5bmNkYXRhID0gc2RhdGE7Ci0JcmV0dXJuIDA7Ci0KLWNtZF9pbml0X2ZhaWxlZDM6Ci0JZGlzYWJsZV9pcnEoY3RybC0+dmZlaXJxKTsKLQlmcmVlX2lycShjdHJsLT52ZmVpcnEsIDApOwotCWlvdW5tYXAoY3RybC0+dmZlYmFzZSk7Ci1jbWRfaW5pdF9mYWlsZWQyOgotCWtmcmVlKGN0cmwpOwotY21kX2luaXRfZmFpbGVkMToKLQlyZWxlYXNlX21lbV9yZWdpb24odmZlbWVtLT5zdGFydCwgKHZmZW1lbS0+ZW5kIC0gdmZlbWVtLT5zdGFydCkgKyAxKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXZvaWQgdmZlX2NtZF9yZWxlYXNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcmVzb3VyY2UJKm1lbTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWF0b21pY19zZXQoJmN0cmwtPnZmZV9zZXJ2X2ludGVycnVwdCwgMCk7Ci0JZGlzYWJsZV9pcnEoY3RybC0+dmZlaXJxKTsKLQlmcmVlX2lycShjdHJsLT52ZmVpcnEsIDApOwotCi0JaW91bm1hcChjdHJsLT52ZmViYXNlKTsKLQltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIChtZW0tPmVuZCAtIG1lbS0+c3RhcnQpICsgMSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX3ZmZV9jdHJsX2xvY2ssIGZsYWdzKTsKLQlrZnJlZShjdHJsKTsKLQljdHJsID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fdmZlX2N0cmxfbG9jaywgZmxhZ3MpOwotfQotCi12b2lkIHZmZV9zdGF0c19hZl9zdG9wKHZvaWQpCi17Ci0JY3RybC0+dmZlU3RhdHNDbWRMb2NhbC5hdXRvRm9jdXNFbmFibGUgPSBGQUxTRTsKLQljdHJsLT52ZmVJbWFza0xvY2FsLmFmUGluZ3BvbmdJcnEgPSBGQUxTRTsKLX0KLQotdm9pZCB2ZmVfc3RvcCh2b2lkKQotewotCWludCBzcGluX2NudCA9IDA7Ci0JdWludDMyX3QgdmZlQXhpU3RhdXRzOwotCi0JLyogZm9yIHJlc2V0IGh3IG1vZHVsZXMsIGFuZCBzZW5kIG1zZyB3aGVuIHJlc2V0X2lycSBjb21lcy4qLwotCWN0cmwtPnZmZVN0b3BBY2tQZW5kaW5nID0gVFJVRTsKLQotCWN0cmwtPnZmZVN0YXRzUGluZ1BvbmdSZWxvYWRGbGFnID0gRkFMU0U7Ci0JdmZlX3BtX3N0b3AoKTsKLQotCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMuICAqLwotCXZmZV9wcm9ncmFtX2lycV9tYXNrKFZGRV9ESVNBQkxFX0FMTF9JUlFTKTsKLQotCS8qIGluIGVpdGhlciBjb250aW51b3VzIG9yIHNuYXBzaG90IG1vZGUsIHN0b3AgY29tbWFuZCBjYW4gYmUgaXNzdWVkCi0JICogYXQgYW55IHRpbWUuCi0JICovCi0JdmZlX2NhbWlmX3N0b3BfaW1tZWRpYXRlbHkoKTsKLQl2ZmVfcHJvZ3JhbV9heGlfY21kKEFYSV9IQUxUKTsKLQl2ZmVfcHJvZ19od190ZXN0Z2VuX2NtZChWRkVfVEVTVF9HRU5fU1RPUCk7Ci0KLQlkbyB7Ci0JCXZmZUF4aVN0YXV0cyA9IHZmZV9yZWFkX2F4aV9zdGF0dXMoKTsKLQkJc3Bpbl9jbnQrKzsKLQl9IHdoaWxlICghKHZmZUF4aVN0YXV0cyAmIEFYSV9TVEFUVVNfQlVTWV9NQVNLKSk7Ci0JaWYgKHNwaW5fY250ID4gMSkKLQkJcHJfd2FybmluZygiJXM6IHNwaW5fY250ICVkXG4iLCBfX2Z1bmNfXywgc3Bpbl9jbnQpOwotCi0JdmZlX3Byb2dyYW1fYXhpX2NtZChBWElfSEFMVF9DTEVBUik7Ci0KLQkvKiBjbGVhciBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzICovCi0Jd3JpdGVsKFZGRV9DTEVBUl9BTExfSVJRUywgY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ0xFQVIpOwotCi0JLyogZW5hYmxlIHJlc2V0X2FjayBhbmQgYXN5bmMgdGltZXIgaW50ZXJydXB0IG9ubHkgd2hpbGUgc3RvcHBpbmcKLQkgKiB0aGUgcGlwZWxpbmUuCi0JICovCi0JdmZlX3Byb2dyYW1faXJxX21hc2soVkZFX0lNQVNLX1dISUxFX1NUT1BQSU5HKTsKLQotCXZmZV9wcm9ncmFtX2dsb2JhbF9yZXNldF9jbWQoVkZFX1JFU0VUX1VQT05fU1RPUF9DTUQpOwotfQotCi12b2lkIHZmZV91cGRhdGUodm9pZCkKLXsKLQljdHJsLT52ZmVNb2R1bGVFbmFibGVMb2NhbC5zdGF0c0VuYWJsZSA9Ci0JCWN0cmwtPnZmZVN0YXRzQ21kTG9jYWwuYXV0b0ZvY3VzRW5hYmxlIHwKLQkJY3RybC0+dmZlU3RhdHNDbWRMb2NhbC5heHdFbmFibGU7Ci0KLQl2ZmVfcmVnX21vZHVsZV9jZmcoJmN0cmwtPnZmZU1vZHVsZUVuYWJsZUxvY2FsKTsKLQotCXZmZV9wcm9ncmFtX3N0YXRzX2NtZCgmY3RybC0+dmZlU3RhdHNDbWRMb2NhbCk7Ci0KLQljdHJsLT52ZmVJbWFza1BhY2tlZCA9IHZmZV9pcnFfcGFjayhjdHJsLT52ZmVJbWFza0xvY2FsKTsKLQl2ZmVfcHJvZ3JhbV9pcnFfbWFzayhjdHJsLT52ZmVJbWFza1BhY2tlZCk7Ci0KLQlpZiAoKGN0cmwtPnZmZU1vZHVsZUVuYWJsZUxvY2FsLnN0YXRzRW5hYmxlID09IFRSVUUpICYmCi0JCQkoY3RybC0+dmZlU3RhdHNQaW5nUG9uZ1JlbG9hZEZsYWcgPT0gRkFMU0UpKSB7Ci0JCWN0cmwtPnZmZVN0YXRzUGluZ1BvbmdSZWxvYWRGbGFnID0gVFJVRTsKLQotCQljdHJsLT52ZmVCdXNDbWRMb2NhbC5zdGF0c1Bpbmdwb25nUmVsb2FkID0gVFJVRTsKLQkJdmZlX3JlZ19idXNfY21kKCZjdHJsLT52ZmVCdXNDbWRMb2NhbCk7Ci0JfQotCi0JdmZlX3Byb2dyYW1fcmVnX3VwZGF0ZV9jbWQoVkZFX1JFR19VUERBVEVfVFJJR0dFUik7Ci19Ci0KLWludCB2ZmVfcmdiX2dhbW1hX3VwZGF0ZShzdHJ1Y3QgdmZlX2NtZF9yZ2JfZ2FtbWFfY29uZmlnICppbikKLXsKLQlpbnQgcmMgPSAwOwotCi0JY3RybC0+dmZlTW9kdWxlRW5hYmxlTG9jYWwucmdiTFVURW5hYmxlID0gaW4tPmVuYWJsZTsKLQotCXN3aXRjaCAoaW4tPmNoYW5uZWxTZWxlY3QpIHsKLQljYXNlIFJHQl9HQU1NQV9DSDBfU0VMRUNURUQ6Ci0JCWN0cmwtPnZmZUdhbW1hTHV0U2VsLmNoMEJhbmtTZWxlY3QgXj0gMTsKLQkJdmZlX3dyaXRlX2dhbW1hX3RhYmxlKDAsCi0JCQkJICAgICAgY3RybC0+dmZlR2FtbWFMdXRTZWwuY2gwQmFua1NlbGVjdCwKLQkJCQkgICAgICBpbi0+dGFibGUpOwotCQlicmVhazsKLQotCWNhc2UgUkdCX0dBTU1BX0NIMV9TRUxFQ1RFRDoKLQkJY3RybC0+dmZlR2FtbWFMdXRTZWwuY2gxQmFua1NlbGVjdCBePSAxOwotCQl2ZmVfd3JpdGVfZ2FtbWFfdGFibGUoMSwKLQkJCQkgICAgICBjdHJsLT52ZmVHYW1tYUx1dFNlbC5jaDFCYW5rU2VsZWN0LAotCQkJCSAgICAgIGluLT50YWJsZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBSR0JfR0FNTUFfQ0gyX1NFTEVDVEVEOgotCQljdHJsLT52ZmVHYW1tYUx1dFNlbC5jaDJCYW5rU2VsZWN0IF49IDE7Ci0JCXZmZV93cml0ZV9nYW1tYV90YWJsZSgyLAotCQkJCSAgICAgIGN0cmwtPnZmZUdhbW1hTHV0U2VsLmNoMkJhbmtTZWxlY3QsCi0JCQkJICAgICAgaW4tPnRhYmxlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFJHQl9HQU1NQV9DSDBfQ0gxX1NFTEVDVEVEOgotCQljdHJsLT52ZmVHYW1tYUx1dFNlbC5jaDBCYW5rU2VsZWN0IF49IDE7Ci0JCWN0cmwtPnZmZUdhbW1hTHV0U2VsLmNoMUJhbmtTZWxlY3QgXj0gMTsKLQkJdmZlX3dyaXRlX2dhbW1hX3RhYmxlKDAsIGN0cmwtPnZmZUdhbW1hTHV0U2VsLmNoMEJhbmtTZWxlY3QsCi0JCQlpbi0+dGFibGUpOwotCQl2ZmVfd3JpdGVfZ2FtbWFfdGFibGUoMSwgY3RybC0+dmZlR2FtbWFMdXRTZWwuY2gxQmFua1NlbGVjdCwKLQkJCWluLT50YWJsZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBSR0JfR0FNTUFfQ0gwX0NIMl9TRUxFQ1RFRDoKLQkJY3RybC0+dmZlR2FtbWFMdXRTZWwuY2gwQmFua1NlbGVjdCBePSAxOwotCQljdHJsLT52ZmVHYW1tYUx1dFNlbC5jaDJCYW5rU2VsZWN0IF49IDE7Ci0JCXZmZV93cml0ZV9nYW1tYV90YWJsZSgwLCBjdHJsLT52ZmVHYW1tYUx1dFNlbC5jaDBCYW5rU2VsZWN0LAotCQkJaW4tPnRhYmxlKTsKLQkJdmZlX3dyaXRlX2dhbW1hX3RhYmxlKDIsIGN0cmwtPnZmZUdhbW1hTHV0U2VsLmNoMkJhbmtTZWxlY3QsCi0JCQlpbi0+dGFibGUpOwotCQlicmVhazsKLQotCWNhc2UgUkdCX0dBTU1BX0NIMV9DSDJfU0VMRUNURUQ6Ci0JCWN0cmwtPnZmZUdhbW1hTHV0U2VsLmNoMUJhbmtTZWxlY3QgXj0gMTsKLQkJY3RybC0+dmZlR2FtbWFMdXRTZWwuY2gyQmFua1NlbGVjdCBePSAxOwotCQl2ZmVfd3JpdGVfZ2FtbWFfdGFibGUoMSwgY3RybC0+dmZlR2FtbWFMdXRTZWwuY2gxQmFua1NlbGVjdCwKLQkJCWluLT50YWJsZSk7Ci0JCXZmZV93cml0ZV9nYW1tYV90YWJsZSgyLCBjdHJsLT52ZmVHYW1tYUx1dFNlbC5jaDJCYW5rU2VsZWN0LAotCQkJaW4tPnRhYmxlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFJHQl9HQU1NQV9DSDBfQ0gxX0NIMl9TRUxFQ1RFRDoKLQkJY3RybC0+dmZlR2FtbWFMdXRTZWwuY2gwQmFua1NlbGVjdCBePSAxOwotCQljdHJsLT52ZmVHYW1tYUx1dFNlbC5jaDFCYW5rU2VsZWN0IF49IDE7Ci0JCWN0cmwtPnZmZUdhbW1hTHV0U2VsLmNoMkJhbmtTZWxlY3QgXj0gMTsKLQkJdmZlX3dyaXRlX2dhbW1hX3RhYmxlKDAsIGN0cmwtPnZmZUdhbW1hTHV0U2VsLmNoMEJhbmtTZWxlY3QsCi0JCQlpbi0+dGFibGUpOwotCQl2ZmVfd3JpdGVfZ2FtbWFfdGFibGUoMSwgY3RybC0+dmZlR2FtbWFMdXRTZWwuY2gxQmFua1NlbGVjdCwKLQkJCWluLT50YWJsZSk7Ci0JCXZmZV93cml0ZV9nYW1tYV90YWJsZSgyLCBjdHJsLT52ZmVHYW1tYUx1dFNlbC5jaDJCYW5rU2VsZWN0LAotCQkJaW4tPnRhYmxlKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGdhbW1hIGNoYW5uZWwgJWRcbiIsIF9fZnVuY19fLAotCQkJaW4tPmNoYW5uZWxTZWxlY3QpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9IC8qIHN3aXRjaCAqLwotCi0JLyogdXBkYXRlIHRoZSBnYW1tYUx1dFNlbCByZWdpc3Rlci4gKi8KLQl2ZmVfcHJvZ3JhbV9sdXRfYmFua19zZWwoJmN0cmwtPnZmZUdhbW1hTHV0U2VsKTsKLQotCXJldHVybiByYzsKLX0KLQotaW50IHZmZV9yZ2JfZ2FtbWFfY29uZmlnKHN0cnVjdCB2ZmVfY21kX3JnYl9nYW1tYV9jb25maWcgKmluKQotewotCWludCByYyA9IDA7Ci0KLQljdHJsLT52ZmVNb2R1bGVFbmFibGVMb2NhbC5yZ2JMVVRFbmFibGUgPSBpbi0+ZW5hYmxlOwotCi0Jc3dpdGNoIChpbi0+Y2hhbm5lbFNlbGVjdCkgewotCWNhc2UgUkdCX0dBTU1BX0NIMF9TRUxFQ1RFRDoKLXZmZV93cml0ZV9nYW1tYV90YWJsZSgwLCAwLCBpbi0+dGFibGUpOwotYnJlYWs7Ci0KLQljYXNlIFJHQl9HQU1NQV9DSDFfU0VMRUNURUQ6Ci0JCXZmZV93cml0ZV9nYW1tYV90YWJsZSgxLCAwLCBpbi0+dGFibGUpOwotCQlicmVhazsKLQotCWNhc2UgUkdCX0dBTU1BX0NIMl9TRUxFQ1RFRDoKLQkJdmZlX3dyaXRlX2dhbW1hX3RhYmxlKDIsIDAsIGluLT50YWJsZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBSR0JfR0FNTUFfQ0gwX0NIMV9TRUxFQ1RFRDoKLQkJdmZlX3dyaXRlX2dhbW1hX3RhYmxlKDAsIDAsIGluLT50YWJsZSk7Ci0JCXZmZV93cml0ZV9nYW1tYV90YWJsZSgxLCAwLCBpbi0+dGFibGUpOwotCQlicmVhazsKLQotCWNhc2UgUkdCX0dBTU1BX0NIMF9DSDJfU0VMRUNURUQ6Ci0JCXZmZV93cml0ZV9nYW1tYV90YWJsZSgwLCAwLCBpbi0+dGFibGUpOwotCQl2ZmVfd3JpdGVfZ2FtbWFfdGFibGUoMiwgMCwgaW4tPnRhYmxlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFJHQl9HQU1NQV9DSDFfQ0gyX1NFTEVDVEVEOgotCQl2ZmVfd3JpdGVfZ2FtbWFfdGFibGUoMSwgMCwgaW4tPnRhYmxlKTsKLQkJdmZlX3dyaXRlX2dhbW1hX3RhYmxlKDIsIDAsIGluLT50YWJsZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBSR0JfR0FNTUFfQ0gwX0NIMV9DSDJfU0VMRUNURUQ6Ci0JCXZmZV93cml0ZV9nYW1tYV90YWJsZSgwLCAwLCBpbi0+dGFibGUpOwotCQl2ZmVfd3JpdGVfZ2FtbWFfdGFibGUoMSwgMCwgaW4tPnRhYmxlKTsKLQkJdmZlX3dyaXRlX2dhbW1hX3RhYmxlKDIsIDAsIGluLT50YWJsZSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogaW52YWxpZCBnYW1tYSBjaGFubmVsICVkXG4iLCBfX2Z1bmNfXywKLQkJCWluLT5jaGFubmVsU2VsZWN0KTsKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9IC8qIHN3aXRjaCAqLwotCi0JcmV0dXJuIHJjOwotfQotCi12b2lkIHZmZV9zdGF0c19hZl9hY2soc3RydWN0IHZmZV9jbWRfc3RhdHNfYWZfYWNrICppbikKLXsKLQljdHJsLT5hZlN0YXRzQ29udHJvbC5uZXh0RnJhbWVBZGRyQnVmID0gaW4tPm5leHRBRk91dHB1dEJ1ZmZlckFkZHI7Ci0JY3RybC0+YWZTdGF0c0NvbnRyb2wuYWNrUGVuZGluZyA9IEZBTFNFOwotfQotCi12b2lkIHZmZV9zdGF0c193Yl9leHBfYWNrKHN0cnVjdCB2ZmVfY21kX3N0YXRzX3diX2V4cF9hY2sgKmluKQotewotCWN0cmwtPmF3YlN0YXRzQ29udHJvbC5uZXh0RnJhbWVBZGRyQnVmID0gaW4tPm5leHRXYkV4cE91dHB1dEJ1ZmZlckFkZHI7Ci0JY3RybC0+YXdiU3RhdHNDb250cm9sLmFja1BlbmRpbmcgPSBGQUxTRTsKLX0KLQotCi12b2lkIHZmZV9vdXRwdXRfdl9hY2soc3RydWN0IHZmZV9jbWRfb3V0cHV0X2FjayAqaW4pCi17Ci0JY29uc3QgdWludDMyX3QgKnBzcmM7Ci0JdWludDMyX3QgKnBkZXN0OwotCXVpbnQ4X3QgaTsKLQotCXBkZXN0ID0gY3RybC0+ZW5jUGF0aC5uZXh0RnJhbWVBZGRyQnVmOwotCi0JQ0RCRygidmlkZW9fZnJhbWVfYWNrOiBhY2sgYWRkciA9IDB4JXhcbiIsIGluLT55YnVmYWRkclswXSk7Ci0KLQlwc3JjID0gaW4tPnlidWZhZGRyOwotCWZvciAoaSA9IDA7IGkgPCBjdHJsLT5lbmNQYXRoLmZyYWdDb3VudDsgaSsrKQotCQkqcGRlc3QrKyA9ICpwc3JjKys7Ci0KLQlwc3JjID0gaW4tPmNocm9tYWJ1ZmFkZHI7Ci0JZm9yIChpID0gMDsgaSA8IGN0cmwtPmVuY1BhdGguZnJhZ0NvdW50OyBpKyspCi0JCSpwZGVzdCsrID0gKnBzcmMrKzsKLQotCWN0cmwtPmVuY1BhdGguYWNrUGVuZGluZyA9IEZBTFNFOwotfQotCi12b2lkIHZmZV9vdXRwdXRfcF9hY2soc3RydWN0IHZmZV9jbWRfb3V0cHV0X2FjayAqaW4pCi17Ci0JY29uc3QgdWludDMyX3QgKnBzcmM7Ci0JdWludDMyX3QgKnBkZXN0OwotCXVpbnQ4X3QgaTsKLQotCWlmIChjdHJsLT5heGlPdXRwdXRNb2RlID09IFZGRV9BWElfT1VUUFVUX01PREVfT3V0cHV0MUFuZE91dHB1dDIpIHsKLQkJLyogdmlkZW8gbW9kZSwgcHJldmlldyBjb21lcyBmcm9tIG91dHB1dDEgcGF0aCAqLwotCi0JcGRlc3QgPSBjdHJsLT52aWV3UGF0aC5uZXh0RnJhbWVBZGRyQnVmOwotCi0JcHNyYyA9IGluLT55YnVmYWRkcjsKLQlmb3IgKGkgPSAwOyBpIDwgY3RybC0+dmlld1BhdGguZnJhZ0NvdW50OyBpKyspCi0JCSpwZGVzdCsrID0gKnBzcmMrKzsKLQotCXBzcmMgPSBpbi0+Y2hyb21hYnVmYWRkcjsKLQlmb3IgKGkgPSAwOyBpIDwgY3RybC0+dmlld1BhdGguZnJhZ0NvdW50OyBpKyspCi0JCSpwZGVzdCsrID0gKnBzcmMrKzsKLQotCWN0cmwtPnZpZXdQYXRoLmFja1BlbmRpbmcgPSBGQUxTRTsKLQotCX0gZWxzZSB7IC8qIHByZXZpZXcgbW9kZSwgcHJldmlldyBjb21lcyBmcm9tIG91dHB1dDIgcGF0aC4gKi8KLQkJcGRlc3QgPSBjdHJsLT5lbmNQYXRoLm5leHRGcmFtZUFkZHJCdWY7Ci0KLQkJcHNyYyA9IGluLT55YnVmYWRkcjsKLQkJZm9yIChpID0gMDsgaSA8IGN0cmwtPmVuY1BhdGguZnJhZ0NvdW50OyBpKyspCi0JCQkqcGRlc3QrKyA9ICpwc3JjKys7Ci0KLQkJcHNyYyA9IGluLT5jaHJvbWFidWZhZGRyOwotCQlmb3IgKGkgPSAwOyBpIDwgY3RybC0+ZW5jUGF0aC5mcmFnQ291bnQ7IGkrKykKLQkJCSpwZGVzdCsrID0gKnBzcmMrKzsKLQotCQljdHJsLT5lbmNQYXRoLmFja1BlbmRpbmcgPSBGQUxTRTsKLQotCX0KLX0KLQotdm9pZCB2ZmVfc3RhcnQoc3RydWN0IHZmZV9jbWRfc3RhcnQgKmluKQotewotCXVpbnQzMl90ICBwbXN0YXR1cyA9IDA7Ci0JYm9vbGVhbiByYXdtb2RlOwotCXVpbnQzMl90ICBkZW1wZXJpb2QgPSAwOwotCXVpbnQzMl90ICBkZW1ldmVuID0gMDsKLQl1aW50MzJfdCAgZGVtb2RkID0gMDsKLQotCS8qIGRlcml2ZWQgZnJvbSBvdGhlciBjb21tYW5kcy4gIChjYW1pZiBjb25maWcsIGF4aSBvdXRwdXQgY29uZmlnLAotCSAqIGV0YykKLQkqLwotCXN0cnVjdCB2ZmVfY2ZnIGh3Y2ZnOwotCXN0cnVjdCB2ZmVfdXBzYW1wbGVfY2ZnIGNocm9tdXBjZmc7Ci0KLQlDREJHKCJ2ZmVfc3RhcnQgb3BlcmF0aW9uTW9kZSA9ICVkXG4iLCBpbi0+b3BlcmF0aW9uTW9kZSk7Ci0KLQltZW1zZXQoJmh3Y2ZnLCAwLCBzaXplb2YoaHdjZmcpKTsKLQltZW1zZXQoJmNocm9tdXBjZmcsIDAsIHNpemVvZihjaHJvbXVwY2ZnKSk7Ci0KLQlzd2l0Y2ggKGluLT5waXhlbCkgewotCWNhc2UgVkZFX0JBWUVSX1JHUkdSRzoKLQkJZGVtcGVyaW9kID0gMTsKLQkJZGVtZXZlbiA9IDB4Qzk7Ci0JCWRlbW9kZCA9IDB4QUM7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQkFZRVJfR1JHUkdSOgotCQlkZW1wZXJpb2QgPSAxOwotCQlkZW1ldmVuID0gMHg5QzsKLQkJZGVtb2RkID0gMHhDQTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9CQVlFUl9CR0JHQkc6Ci0JCWRlbXBlcmlvZCA9IDE7Ci0JCWRlbWV2ZW4gPSAweENBOwotCQlkZW1vZGQgPSAweDlDOwotCQlicmVhazsKLQotCWNhc2UgVkZFX0JBWUVSX0dCR0JHQjoKLQkJZGVtcGVyaW9kID0gMTsKLQkJZGVtZXZlbiA9IDB4QUM7Ci0JCWRlbW9kZCA9IDB4Qzk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfWVVWX1lDYllDcjoKLQkJZGVtcGVyaW9kID0gMzsKLQkJZGVtZXZlbiA9IDB4OUNBQzsKLQkJZGVtb2RkID0gMHg5Q0FDOwotCQlicmVhazsKLQotCWNhc2UgVkZFX1lVVl9ZQ3JZQ2I6Ci0JCWRlbXBlcmlvZCA9IDM7Ci0JCWRlbWV2ZW4gPSAweEFDOUM7Ci0JCWRlbW9kZCA9IDB4QUM5QzsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9ZVVZfQ2JZQ3JZOgotCQlkZW1wZXJpb2QgPSAzOwotCQlkZW1ldmVuID0gMHhDOUNBOwotCQlkZW1vZGQgPSAweEM5Q0E7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfWVVWX0NyWUNiWToKLQkJZGVtcGVyaW9kID0gMzsKLQkJZGVtZXZlbiA9IDB4Q0FDOTsKLQkJZGVtb2RkID0gMHhDQUM5OwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybjsKLQl9Ci0KLQl2ZmVfY29uZmlnX2RlbXV4KGRlbXBlcmlvZCwgZGVtZXZlbiwgZGVtb2RkKTsKLQotCXZmZV9wcm9ncmFtX2x1dF9iYW5rX3NlbCgmY3RybC0+dmZlR2FtbWFMdXRTZWwpOwotCi0JLyogc2F2ZSB2YXJpYWJsZXMgdG8gbG9jYWwuICovCi0JY3RybC0+dmZlT3BlcmF0aW9uTW9kZSA9IGluLT5vcGVyYXRpb25Nb2RlOwotCWlmIChjdHJsLT52ZmVPcGVyYXRpb25Nb2RlID09IFZGRV9TVEFSVF9PUEVSQVRJT05fTU9ERV9TTkFQU0hPVCkgewotCi0JCXVwZGF0ZV9heGlfcW9zKE1TTV9BWElfUU9TX1NOQVBTSE9UKTsKLQkJLyogaW4gc25hcHNob3QgbW9kZSwgaW5pdGlhbGl6ZSBzbmFwc2hvdCBjb3VudCovCi0JCWN0cmwtPnZmZVNuYXBTaG90Q291bnQgPSBpbi0+c25hcHNob3RDb3VudDsKLQotCQkvKiBzYXZlIHRoZSByZXF1ZXN0ZWQgY291bnQsIHRoaXMgaXMgdGVtcG9yYXJpbHkgZG9uZSwgdG8KLQkJaGVscCB3aXRoIEhKUiAvIG11bHRpc2hvdC4gKi8KLQkJY3RybC0+dmZlUmVxdWVzdGVkU25hcFNob3RDb3VudCA9IGN0cmwtPnZmZVNuYXBTaG90Q291bnQ7Ci0KLQkJQ0RCRygicmVxdWVzdGVkIHNuYXBzaG90IGNvdW50ID0gJWRcbiIsIGN0cmwtPnZmZVNuYXBTaG90Q291bnQpOwotCi0JCS8qIEFzc3VtcHRpb24gaXMgdG8gaGF2ZSB0aGUgc2FtZSBwYXR0ZXJuIGFuZCBwZXJpb2QgZm9yIGJvdGgKLQkJcGF0aHMsIGlmIGJvdGggcGF0aHMgYXJlIHVzZWQuICovCi0JCWlmIChjdHJsLT52aWV3UGF0aC5wYXRoRW5hYmxlZCkgewotCQkJY3RybC0+dmlld1BhdGguc25hcHNob3RQZW5kaW5nQ291bnQgPSBpbi0+c25hcHNob3RDb3VudDsKLQotCQkJY3RybC0+dmZlRnJhbWVTa2lwUGF0dGVybiA9Ci0JCQkJY3RybC0+dmZlRnJhbWVTa2lwLm91dHB1dDFQYXR0ZXJuOwotCQkJY3RybC0+dmZlRnJhbWVTa2lwUGVyaW9kID0KLQkJCQljdHJsLT52ZmVGcmFtZVNraXAub3V0cHV0MVBlcmlvZDsKLQkJfQotCi0JCWlmIChjdHJsLT5lbmNQYXRoLnBhdGhFbmFibGVkKSB7Ci0JCQljdHJsLT5lbmNQYXRoLnNuYXBzaG90UGVuZGluZ0NvdW50ID0gaW4tPnNuYXBzaG90Q291bnQ7Ci0KLQkJCWN0cmwtPnZmZUZyYW1lU2tpcFBhdHRlcm4gPQotCQkJCWN0cmwtPnZmZUZyYW1lU2tpcC5vdXRwdXQyUGF0dGVybjsKLQkJCWN0cmwtPnZmZUZyYW1lU2tpcFBlcmlvZCA9Ci0JCQkJY3RybC0+dmZlRnJhbWVTa2lwLm91dHB1dDJQZXJpb2Q7Ci0JCX0KLQl9IGVsc2UKLQkJdXBkYXRlX2F4aV9xb3MoTVNNX0FYSV9RT1NfUFJFVklFVyk7Ci0KLQkvKiBlbmFibGUgY29sb3IgY29udmVyc2lvbiBmb3IgYmF5ZXIgc2Vuc29yCi0JaWYgc3RhdHMgZW5hYmxlZCwgbmVlZCB0byBkbyBjb2xvciBjb252ZXJzaW9uLiAqLwotCWlmIChpbi0+cGl4ZWwgPD0gVkZFX0JBWUVSX0dCR0JHQikKLQkJY3RybC0+dmZlU3RhdHNDbWRMb2NhbC5jb2xvckNvbnZlcnNpb25FbmFibGUgPSBUUlVFOwotCi0JdmZlX3Byb2dyYW1fc3RhdHNfY21kKCZjdHJsLT52ZmVTdGF0c0NtZExvY2FsKTsKLQotCWlmIChpbi0+cGl4ZWwgPj0gVkZFX1lVVl9ZQ2JZQ3IpCi0JCWN0cmwtPnZmZU1vZHVsZUVuYWJsZUxvY2FsLmNocm9tYVVwc2FtcGxlRW5hYmxlID0gVFJVRTsKLQotCWN0cmwtPnZmZU1vZHVsZUVuYWJsZUxvY2FsLmRlbXV4RW5hYmxlID0gVFJVRTsKLQotCS8qIGlmIGFueSBzdGF0cyBtb2R1bGUgaXMgZW5hYmxlZCwgdGhlIG1haW4gYml0IGlzIGVuYWJsZWQuICovCi0JY3RybC0+dmZlTW9kdWxlRW5hYmxlTG9jYWwuc3RhdHNFbmFibGUgPQotCQljdHJsLT52ZmVTdGF0c0NtZExvY2FsLmF1dG9Gb2N1c0VuYWJsZSB8Ci0JCWN0cmwtPnZmZVN0YXRzQ21kTG9jYWwuYXh3RW5hYmxlOwotCi0JdmZlX3JlZ19tb2R1bGVfY2ZnKCZjdHJsLT52ZmVNb2R1bGVFbmFibGVMb2NhbCk7Ci0KLQkvKiBpbiBjYXNlIG9mIG9mZmxpbmUgcHJvY2Vzc2luZywgZG8gbm90IG5lZWQgdG8gY29uZmlnIGNhbWlmLiBIYXZpbmcKLQkgKiBidXMgb3V0cHV0IGVuYWJsZWQgaW4gY2FtaWZfY29uZmlnIHJlZ2lzdGVyIG1pZ2h0IGNvbmZ1c2UgdGhlCi0JICogaGFyZHdhcmU/Ci0JICovCi0JaWYgKGluLT5pbnB1dFNvdXJjZSAhPSBWRkVfU1RBUlRfSU5QVVRfU09VUkNFX0FYSSkgewotCQl2ZmVfcmVnX2NhbWlmX2NvbmZpZygmY3RybC0+dmZlQ2FtaWZDb25maWdMb2NhbCk7Ci0JfSBlbHNlIHsKLQkJLyogb2ZmbGluZSBwcm9jZXNzaW5nLCBlbmFibGUgYXhpIHJlYWQgKi8KLQkJY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwuc3RyaXBlUmRQYXRoRW4gPSBUUlVFOwotCQljdHJsLT52ZmVCdXNDbWRMb2NhbC5zdHJpcGVSZWxvYWQgPSBUUlVFOwotCQljdHJsLT52ZmVCdXNDb25maWdMb2NhbC5yYXdQaXhlbERhdGFTaXplID0KLQkJCWN0cmwtPmF4aUlucHV0RGF0YVNpemU7Ci0JfQotCi0JdmZlX3JlZ19idXNfY2ZnKCZjdHJsLT52ZmVCdXNDb25maWdMb2NhbCk7Ci0KLQkvKiBkaXJlY3RseSBmcm9tIHN0YXJ0IGNvbW1hbmQgKi8KLQlod2NmZy5waXhlbFBhdHRlcm4gPSBpbi0+cGl4ZWw7Ci0JaHdjZmcuaW5wdXRTb3VyY2UgPSBpbi0+aW5wdXRTb3VyY2U7Ci0Jd3JpdGVsKCoodWludDMyX3QgKikmaHdjZmcsIGN0cmwtPnZmZWJhc2UgKyBWRkVfQ0ZHKTsKLQotCS8qIHJlZ2FyZGxlc3MgbW9kdWxlIGVuYWJsZWQgb3Igbm90LCBpdCBkb2VzIG5vdCBodXJ0Ci0JICogdG8gcHJvZ3JhbSB0aGUgY29zaXRpbmcgbW9kZS4gKi8KLQljaHJvbXVwY2ZnLmNocm9tYUNvc2l0aW5nRm9yWUNiQ3JJbnB1dHMgPSBpbi0+eXV2SW5wdXRDb3NpdGluZ01vZGU7Ci0KLQl3cml0ZWwoKih1aW50MzJfdCAqKSZjaHJvbXVwY2ZnLAotCQljdHJsLT52ZmViYXNlICsgVkZFX0NIUk9NQV9VUFNBTVBMRV9DRkcpOwotCi0JLyogTUlTUiB0byBtb25pdG9yIHRoZSBheGkgcmVhZC4gKi8KLQl3cml0ZWwoMHhkOCwgY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfTUlTUl9NQVNUX0NGR18wKTsKLQotCS8qIGNsZWFyIGFsbCBwZW5kaW5nIGludGVycnVwdHMuICovCi0Jd3JpdGVsKFZGRV9DTEVBUl9BTExfSVJRUywgY3RybC0+dmZlYmFzZSArIFZGRV9JUlFfQ0xFQVIpOwotCi0JLyogIGRlZmluZSBob3cgY29tcG9zaXRlIGludGVycnVwdCB3b3JrLiAgKi8KLQljdHJsLT52ZmVJbWFza0NvbXBvc2l0ZVBhY2tlZCA9Ci0JCXZmZV9pcnFfY29tcG9zaXRlX3BhY2soY3RybC0+dmZlSXJxQ29tcG9zaXRlTWFza0xvY2FsKTsKLQotCXZmZV9wcm9ncmFtX2lycV9jb21wb3NpdGVfbWFzayhjdHJsLT52ZmVJbWFza0NvbXBvc2l0ZVBhY2tlZCk7Ci0KLQkvKiAgZW5hYmxlIGFsbCBuZWNlc3NhcnkgaW50ZXJydXB0cy4gICAgICAqLwotCWN0cmwtPnZmZUltYXNrTG9jYWwuY2FtaWZTb2ZJcnEgID0gVFJVRTsKLQljdHJsLT52ZmVJbWFza0xvY2FsLnJlZ1VwZGF0ZUlycSA9IFRSVUU7Ci0JY3RybC0+dmZlSW1hc2tMb2NhbC5yZXNldEFja0lycSAgPSBUUlVFOwotCi0JY3RybC0+dmZlSW1hc2tQYWNrZWQgPSB2ZmVfaXJxX3BhY2soY3RybC0+dmZlSW1hc2tMb2NhbCk7Ci0JdmZlX3Byb2dyYW1faXJxX21hc2soY3RybC0+dmZlSW1hc2tQYWNrZWQpOwotCi0JLyogZW5hYmxlIGJ1cyBwZXJmb3JtYW5jZSBtb25pdG9yICovCi0JdmZlXzhrX3BtX3N0YXJ0KCZjdHJsLT52ZmVCdXNQbUNvbmZpZ0xvY2FsKTsKLQotCS8qIHRyaWdnZXIgdmZlIHJlZyB1cGRhdGUgKi8KLQljdHJsLT52ZmVTdGFydEFja1BlbmRpbmdGbGFnID0gVFJVRTsKLQotCS8qIHdyaXRlIGJ1cyBjb21tYW5kIHRvIHRyaWdnZXIgcmVsb2FkIG9mIHBpbmcgcG9uZyBidWZmZXIuICovCi0JY3RybC0+dmZlQnVzQ21kTG9jYWwuYnVzUGluZ3BvbmdSZWxvYWQgPSBUUlVFOwotCi0JaWYgKGN0cmwtPnZmZU1vZHVsZUVuYWJsZUxvY2FsLnN0YXRzRW5hYmxlID09IFRSVUUpIHsKLQkJY3RybC0+dmZlQnVzQ21kTG9jYWwuc3RhdHNQaW5ncG9uZ1JlbG9hZCA9IFRSVUU7Ci0JCWN0cmwtPnZmZVN0YXRzUGluZ1BvbmdSZWxvYWRGbGFnID0gVFJVRTsKLQl9Ci0KLQl3cml0ZWwoVkZFX1JFR19VUERBVEVfVFJJR0dFUiwgY3RybC0+dmZlYmFzZSArIFZGRV9SRUdfVVBEQVRFX0NNRCk7Ci0KLQkvKiBwcm9ncmFtIGxhdGVyIHRoYW4gdGhlIHJlZyB1cGRhdGUuICovCi0JdmZlX3JlZ19idXNfY21kKCZjdHJsLT52ZmVCdXNDbWRMb2NhbCk7Ci0KLQlpZiAoKGluLT5pbnB1dFNvdXJjZSA9PQotCQkJIFZGRV9TVEFSVF9JTlBVVF9TT1VSQ0VfQ0FNSUYpIHx8Ci0JICAgIChpbi0+aW5wdXRTb3VyY2UgPT0gVkZFX1NUQVJUX0lOUFVUX1NPVVJDRV9URVNUR0VOKSkKLQkJd3JpdGVsKENBTUlGX0NPTU1BTkRfU1RBUlQsIGN0cmwtPnZmZWJhc2UgKyBDQU1JRl9DT01NQU5EKTsKLQotCS8qIHN0YXJ0IHRlc3QgZ2VuIGlmIGl0IGlzIGVuYWJsZWQgKi8KLQlpZiAoY3RybC0+dmZlVGVzdEdlblN0YXJ0RmxhZyA9PSBUUlVFKSB7Ci0JCWN0cmwtPnZmZVRlc3RHZW5TdGFydEZsYWcgPSBGQUxTRTsKLQkJdmZlX3Byb2dfaHdfdGVzdGdlbl9jbWQoVkZFX1RFU1RfR0VOX0dPKTsKLQl9Ci0KLQlDREJHKCJjdHJsLT5heGlPdXRwdXRNb2RlID0gJWRcbiIsIGN0cmwtPmF4aU91dHB1dE1vZGUpOwotCWlmIChjdHJsLT5heGlPdXRwdXRNb2RlID09IFZGRV9BWElfT1VUUFVUX01PREVfQ0FNSUZUb0FYSVZpYU91dHB1dDIpIHsKLQkJLyogcmF3IGR1bXAgbW9kZSAqLwotCQlyYXdtb2RlID0gVFJVRTsKLQotCQl3aGlsZSAocmF3bW9kZSkgewotCQkJcG1zdGF0dXMgPQotCQkJCXJlYWRsKGN0cmwtPnZmZWJhc2UgKwotCQkJCQlWRkVfQlVTX0VOQ19DQkNSX1dSX1BNX1NUQVRTXzEpOwotCi0JCQlpZiAoKHBtc3RhdHVzICYgVkZFX1BNX0JVRl9NQVhfQ05UX01BU0spICE9IDApCi0JCQkJcmF3bW9kZSA9IEZBTFNFOwotCQl9Ci0KLQkJdmZlX3Byb2Nfb3BzKFZGRV9NU0dfSURfU1RBUlRfQUNLLCBOVUxMKTsKLQkJY3RybC0+dmZlU3RhcnRBY2tQZW5kaW5nRmxhZyA9IEZBTFNFOwotCX0KLQotCWN0cmwtPnZzdGF0ZSA9IFZGRV9TVEFURV9BQ1RJVkU7Ci19Ci0KLXZvaWQgdmZlX2xhX3VwZGF0ZShzdHJ1Y3QgdmZlX2NtZF9sYV9jb25maWcgKmluKQotewotCWludDE2X3QgKnBUYWJsZTsKLQllbnVtIFZGRV9ETUlfUkFNX1NFTCBkbWlSYW1TZWw7Ci0JaW50IGk7Ci0KLQlwVGFibGUgPSBpbi0+dGFibGU7Ci0JY3RybC0+dmZlTW9kdWxlRW5hYmxlTG9jYWwubHVtYUFkYXB0YXRpb25FbmFibGUgPSBpbi0+ZW5hYmxlOwotCi0JLyogdG9nZ2xlIHRoZSBiYW5rIHRvIGJlIHVzZWQuICovCi0JY3RybC0+dmZlTGFCYW5rU2VsIF49IDE7Ci0KLQlpZiAoY3RybC0+dmZlTGFCYW5rU2VsID09IDApCi0JCWRtaVJhbVNlbCA9IExVTUFfQURBUFRfTFVUX1JBTV9CQU5LMDsKLQllbHNlCi0JCWRtaVJhbVNlbCA9IExVTUFfQURBUFRfTFVUX1JBTV9CQU5LMTsKLQotCS8qIGNvbmZpZ3VyZSB0aGUgRE1JX0NGRyB0byBzZWxlY3QgcmlnaHQgc3JhbSAqLwotCXZmZV9wcm9ncmFtX2RtaV9jZmcoZG1pUmFtU2VsKTsKLQotCWZvciAoaSA9IDA7IGkgPCBWRkVfTEFfVEFCTEVfTEVOR1RIOyBpKyspIHsKLQkJd3JpdGVsKCh1aW50MzJfdCkoKnBUYWJsZSksIGN0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0RBVEFfTE8pOwotCQlwVGFibGUrKzsKLQl9Ci0KLQkvKiBBZnRlciBETUkgdHJhbnNmZXIsIHRvIG1ha2UgaXQgc2FmZSwgbmVlZCB0byBzZXQKLQkgKiB0aGUgRE1JX0NGRyB0byB1bnNlbGVjdCBhbnkgU1JBTSAqLwotCXdyaXRlbChWRkVfRE1JX0NGR19ERUZBVUxULCBjdHJsLT52ZmViYXNlICsgVkZFX0RNSV9DRkcpOwotCXdyaXRlbChjdHJsLT52ZmVMYUJhbmtTZWwsIGN0cmwtPnZmZWJhc2UgKyBWRkVfTEFfQ0ZHKTsKLX0KLQotdm9pZCB2ZmVfbGFfY29uZmlnKHN0cnVjdCB2ZmVfY21kX2xhX2NvbmZpZyAqaW4pCi17Ci0JdWludDE2X3QgaTsKLQlpbnQxNl90ICAqcFRhYmxlOwotCWVudW0gVkZFX0RNSV9SQU1fU0VMIGRtaVJhbVNlbDsKLQotCXBUYWJsZSA9IGluLT50YWJsZTsKLQljdHJsLT52ZmVNb2R1bGVFbmFibGVMb2NhbC5sdW1hQWRhcHRhdGlvbkVuYWJsZSA9IGluLT5lbmFibGU7Ci0KLQlpZiAoY3RybC0+dmZlTGFCYW5rU2VsID09IDApCi0JCWRtaVJhbVNlbCA9IExVTUFfQURBUFRfTFVUX1JBTV9CQU5LMDsKLQllbHNlCi0JCWRtaVJhbVNlbCA9IExVTUFfQURBUFRfTFVUX1JBTV9CQU5LMTsKLQotCS8qIGNvbmZpZ3VyZSB0aGUgRE1JX0NGRyB0byBzZWxlY3QgcmlnaHQgc3JhbSAqLwotCXZmZV9wcm9ncmFtX2RtaV9jZmcoZG1pUmFtU2VsKTsKLQotCWZvciAoaSA9IDA7IGkgPCBWRkVfTEFfVEFCTEVfTEVOR1RIOyBpKyspIHsKLQkJd3JpdGVsKCh1aW50MzJfdCkoKnBUYWJsZSksIGN0cmwtPnZmZWJhc2UgKyBWRkVfRE1JX0RBVEFfTE8pOwotCQlwVGFibGUrKzsKLQl9Ci0KLQkvKiBBZnRlciBETUkgdHJhbnNmZXIsIHRvIG1ha2UgaXQgc2FmZSwgbmVlZCB0byBzZXQgdGhlCi0JICogRE1JX0NGRyB0byB1bnNlbGVjdCBhbnkgU1JBTSAqLwotCXdyaXRlbChWRkVfRE1JX0NGR19ERUZBVUxULCBjdHJsLT52ZmViYXNlICsgVkZFX0RNSV9DRkcpOwotCi0JLyogY2FuIG9ubHkgYmUgYmFuayAwIG9yIGJhbmsgMSBmb3Igbm93LiAqLwotCXdyaXRlbChjdHJsLT52ZmVMYUJhbmtTZWwsIGN0cmwtPnZmZWJhc2UgKyBWRkVfTEFfQ0ZHKTsKLQlDREJHKCJWRkUgTHVtYSBhZGFwdGF0aW9uIGJhbmsgc2VsZWN0aW9uIGlzIDB4JXhcbiIsCi0JCQkgKih1aW50MzJfdCAqKSZjdHJsLT52ZmVMYUJhbmtTZWwpOwotfQotCi12b2lkIHZmZV90ZXN0X2dlbl9zdGFydChzdHJ1Y3QgdmZlX2NtZF90ZXN0X2dlbl9zdGFydCAqaW4pCi17Ci0Jc3RydWN0IFZGRV9UZXN0R2VuX0NvbmZpZ0NtZFR5cGUgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWNtZC5udW1GcmFtZSAgICAgICAgICAgICAgPSBpbi0+bnVtRnJhbWU7Ci0JY21kLnBpeGVsRGF0YVNlbGVjdCAgICAgICA9IGluLT5waXhlbERhdGFTZWxlY3Q7Ci0JY21kLnN5c3RlbWF0aWNEYXRhU2VsZWN0ICA9IGluLT5zeXN0ZW1hdGljRGF0YVNlbGVjdDsKLQljbWQucGl4ZWxEYXRhU2l6ZSAgICAgICAgID0gKHVpbnQzMl90KWluLT5waXhlbERhdGFTaXplOwotCWNtZC5oc3luY0VkZ2UgICAgICAgICAgICAgPSAodWludDMyX3QpaW4tPmhzeW5jRWRnZTsKLQljbWQudnN5bmNFZGdlICAgICAgICAgICAgID0gKHVpbnQzMl90KWluLT52c3luY0VkZ2U7Ci0JY21kLmltYWdlV2lkdGggICAgICAgICAgICA9IGluLT5pbWFnZVdpZHRoOwotCWNtZC5pbWFnZUhlaWdodCAgICAgICAgICAgPSBpbi0+aW1hZ2VIZWlnaHQ7Ci0JY21kLnNvZk9mZnNldCAgICAgICAgICAgICA9IGluLT5zdGFydE9mRnJhbWVPZmZzZXQ7Ci0JY21kLmVvZk5PZmZzZXQgICAgICAgICAgICA9IGluLT5lbmRPZkZyYW1lTk9mZnNldDsKLQljbWQuc29sT2Zmc2V0ICAgICAgICAgICAgID0gaW4tPnN0YXJ0T2ZMaW5lT2Zmc2V0OwotCWNtZC5lb2xOT2Zmc2V0ICAgICAgICAgICAgPSBpbi0+ZW5kT2ZMaW5lTk9mZnNldDsKLQljbWQuaEJsYW5rSW50ZXJ2YWwgICAgICAgID0gaW4tPmhiaTsKLQljbWQudkJsYW5rSW50ZXJ2YWwgICAgICAgID0gaW4tPnZibDsKLQljbWQudkJsYW5rSW50ZXJ2YWxFbmFibGUgID0gaW4tPnZibEVuYWJsZTsKLQljbWQuc29mRHVtbXkgICAgICAgICAgICAgID0gaW4tPnN0YXJ0T2ZGcmFtZUR1bW15TGluZTsKLQljbWQuZW9mRHVtbXkgICAgICAgICAgICAgID0gaW4tPmVuZE9mRnJhbWVEdW1teUxpbmU7Ci0JY21kLnVuaWNvbG9yQmFyU2VsZWN0ICAgICA9IGluLT51bmljb2xvckJhclNlbGVjdDsKLQljbWQudW5pY29sb3JCYXJFbmFibGUgICAgID0gaW4tPnVuaWNvbG9yQmFyRW5hYmxlOwotCWNtZC5zcGxpdEVuYWJsZSAgICAgICAgICAgPSBpbi0+Y29sb3JCYXJzU3BsaXRFbmFibGU7Ci0JY21kLnBpeGVsUGF0dGVybiAgICAgICAgICA9ICh1aW50MzJfdClpbi0+Y29sb3JCYXJzUGl4ZWxQYXR0ZXJuOwotCWNtZC5yb3RhdGVQZXJpb2QgICAgICAgICAgPSBpbi0+Y29sb3JCYXJzUm90YXRlUGVyaW9kOwotCWNtZC5yYW5kb21TZWVkICAgICAgICAgICAgPSBpbi0+dGVzdEdlblJhbmRvbVNlZWQ7Ci0KLQl2ZmVfcHJvZ19odyhjdHJsLT52ZmViYXNlICsgVkZFX0hXX1RFU1RHRU5fQ0ZHLAotCQkodWludDMyX3QgKikgJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi12b2lkIHZmZV9mcmFtZV9za2lwX3VwZGF0ZShzdHJ1Y3QgdmZlX2NtZF9mcmFtZV9za2lwX3VwZGF0ZSAqaW4pCi17Ci0Jc3RydWN0IFZGRV9GUkFNRV9TS0lQX1VwZGF0ZUNtZFR5cGUgY21kOwotCi0JY21kLnlQYXR0ZXJuICAgID0gaW4tPm91dHB1dDFQYXR0ZXJuOwotCWNtZC5jYmNyUGF0dGVybiA9IGluLT5vdXRwdXQxUGF0dGVybjsKLQl2ZmVfcHJvZ19odyhjdHJsLT52ZmViYXNlICsgVkZFX0ZSQU1FRFJPUF9WSUVXX1lfUEFUVEVSTiwKLQkJKHVpbnQzMl90ICopJmNtZCwgc2l6ZW9mKGNtZCkpOwotCi0JY21kLnlQYXR0ZXJuICAgID0gaW4tPm91dHB1dDJQYXR0ZXJuOwotCWNtZC5jYmNyUGF0dGVybiA9IGluLT5vdXRwdXQyUGF0dGVybjsKLQl2ZmVfcHJvZ19odyhjdHJsLT52ZmViYXNlICsgVkZFX0ZSQU1FRFJPUF9FTkNfWV9QQVRURVJOLAotCQkodWludDMyX3QgKikmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXZvaWQgdmZlX2ZyYW1lX3NraXBfY29uZmlnKHN0cnVjdCB2ZmVfY21kX2ZyYW1lX3NraXBfY29uZmlnICppbikKLXsKLQlzdHJ1Y3QgdmZlX2ZyYW1lX3NraXBfY2ZnIGNtZDsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCi0JY3RybC0+dmZlRnJhbWVTa2lwID0gKmluOwotCi0JY21kLm91dHB1dDJZUGVyaW9kICAgICA9IGluLT5vdXRwdXQyUGVyaW9kOwotCWNtZC5vdXRwdXQyQ2JDclBlcmlvZCAgPSBpbi0+b3V0cHV0MlBlcmlvZDsKLQljbWQub3V0cHV0MllQYXR0ZXJuICAgID0gaW4tPm91dHB1dDJQYXR0ZXJuOwotCWNtZC5vdXRwdXQyQ2JDclBhdHRlcm4gPSBpbi0+b3V0cHV0MlBhdHRlcm47Ci0JY21kLm91dHB1dDFZUGVyaW9kICAgICA9IGluLT5vdXRwdXQxUGVyaW9kOwotCWNtZC5vdXRwdXQxQ2JDclBlcmlvZCAgPSBpbi0+b3V0cHV0MVBlcmlvZDsKLQljbWQub3V0cHV0MVlQYXR0ZXJuICAgID0gaW4tPm91dHB1dDFQYXR0ZXJuOwotCWNtZC5vdXRwdXQxQ2JDclBhdHRlcm4gPSBpbi0+b3V0cHV0MVBhdHRlcm47Ci0KLQl2ZmVfcHJvZ19odyhjdHJsLT52ZmViYXNlICsgVkZFX0ZSQU1FRFJPUF9FTkNfWV9DRkcsCi0JCSh1aW50MzJfdCAqKSZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotdm9pZCB2ZmVfb3V0cHV0X2NsYW1wX2NvbmZpZyhzdHJ1Y3QgdmZlX2NtZF9vdXRwdXRfY2xhbXBfY29uZmlnICppbikKLXsKLQlzdHJ1Y3QgdmZlX291dHB1dF9jbGFtcF9jZmcgY21kOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0KLQljbWQueUNoYW5NYXggID0gaW4tPm1heENoMDsKLQljbWQuY2JDaGFuTWF4ID0gaW4tPm1heENoMTsKLQljbWQuY3JDaGFuTWF4ID0gaW4tPm1heENoMjsKLQotCWNtZC55Q2hhbk1pbiAgPSBpbi0+bWluQ2gwOwotCWNtZC5jYkNoYW5NaW4gPSBpbi0+bWluQ2gxOwotCWNtZC5jckNoYW5NaW4gPSBpbi0+bWluQ2gyOwotCi0JdmZlX3Byb2dfaHcoY3RybC0+dmZlYmFzZSArIFZGRV9DTEFNUF9NQVhfQ0ZHLCAodWludDMyX3QgKikmY21kLAotCQlzaXplb2YoY21kKSk7Ci19Ci0KLXZvaWQgdmZlX2NhbWlmX2ZyYW1lX3VwZGF0ZShzdHJ1Y3QgdmZlX2NtZHNfY2FtaWZfZnJhbWUgKmluKQotewotCXN0cnVjdCB2ZmVfY2FtaWZmcmFtZV91cGRhdGUgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWNtZC5waXhlbHNQZXJMaW5lID0gaW4tPnBpeGVsc1BlckxpbmU7Ci0JY21kLmxpbmVzUGVyRnJhbWUgPSBpbi0+bGluZXNQZXJGcmFtZTsKLQotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBDQU1JRl9GUkFNRV9DT05GSUcsICh1aW50MzJfdCAqKSZjbWQsCi0JCXNpemVvZihjbWQpKTsKLX0KLQotdm9pZCB2ZmVfY29sb3JfY29ycmVjdGlvbl9jb25maWcoc3RydWN0IHZmZV9jbWRfY29sb3JfY29ycmVjdGlvbl9jb25maWcgKmluKQotewotCXN0cnVjdCB2ZmVfY29sb3JfY29ycmVjdGlvbl9jZmcgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljdHJsLT52ZmVNb2R1bGVFbmFibGVMb2NhbC5jb2xvckNvcnJlY3Rpb25FbmFibGUgPSBpbi0+ZW5hYmxlOwotCi0JY21kLmMwID0gaW4tPkMwOwotCWNtZC5jMSA9IGluLT5DMTsKLQljbWQuYzIgPSBpbi0+QzI7Ci0JY21kLmMzID0gaW4tPkMzOwotCWNtZC5jNCA9IGluLT5DNDsKLQljbWQuYzUgPSBpbi0+QzU7Ci0JY21kLmM2ID0gaW4tPkM2OwotCWNtZC5jNyA9IGluLT5DNzsKLQljbWQuYzggPSBpbi0+Qzg7Ci0KLQljbWQuazAgPSBpbi0+SzA7Ci0JY21kLmsxID0gaW4tPksxOwotCWNtZC5rMiA9IGluLT5LMjsKLQotCWNtZC5jb2VmUUZhY3RvciA9IGluLT5jb2VmUUZhY3RvcjsKLQotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfQ09MT1JfQ09SUkVDVF9DT0VGRl8wLAotCQkodWludDMyX3QgKikmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXZvaWQgdmZlX2RlbW9zYWljX2FiZl91cGRhdGUoc3RydWN0IHZmZV9jbWRfZGVtb3NhaWNfYWJmX3VwZGF0ZSAqaW4pCi17Ci1zdHJ1Y3QgdmZlX2RlbW9zYWljX2NmZyBjbWQ7Ci0Jc3RydWN0IHZmZV9kZW1vc2FpY19hYmZfY2ZnIGNtZGFiZjsKLQl1aW50MzJfdCB0ZW1wOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQl0ZW1wID0gcmVhZGwoY3RybC0+dmZlYmFzZSArIFZGRV9ERU1PU0FJQ19DRkcpOwotCi0JY21kID0gKigoc3RydWN0IHZmZV9kZW1vc2FpY19jZmcgKikoJnRlbXApKTsKLQljbWQuYWJmRW5hYmxlICAgICAgID0gaW4tPmFiZlVwZGF0ZS5lbmFibGU7Ci0JY21kLmZvcmNlQWJmT24gICAgICA9IGluLT5hYmZVcGRhdGUuZm9yY2VPbjsKLQljbWQuYWJmU2hpZnQgICAgICAgID0gaW4tPmFiZlVwZGF0ZS5zaGlmdDsKLQl2ZmVfcHJvZ19odyhjdHJsLT52ZmViYXNlICsgVkZFX0RFTU9TQUlDX0NGRywKLQkJKHVpbnQzMl90ICopJmNtZCwgc2l6ZW9mKGNtZCkpOwotCi0JY21kYWJmLmxwVGhyZXNob2xkICA9IGluLT5hYmZVcGRhdGUubHBUaHJlc2hvbGQ7Ci0JY21kYWJmLnJhdGlvICAgICAgICA9IGluLT5hYmZVcGRhdGUucmF0aW87Ci0JY21kYWJmLm1pblZhbHVlICAgICA9IGluLT5hYmZVcGRhdGUubWluOwotCWNtZGFiZi5tYXhWYWx1ZSAgICAgPSBpbi0+YWJmVXBkYXRlLm1heDsKLQl2ZmVfcHJvZ19odyhjdHJsLT52ZmViYXNlICsgVkZFX0RFTU9TQUlDX0FCRl9DRkdfMCwKLQkJKHVpbnQzMl90ICopJmNtZGFiZiwgc2l6ZW9mKGNtZGFiZikpOwotfQotCi12b2lkIHZmZV9kZW1vc2FpY19icGNfdXBkYXRlKHN0cnVjdCB2ZmVfY21kX2RlbW9zYWljX2JwY191cGRhdGUgKmluKQotewotCXN0cnVjdCB2ZmVfZGVtb3NhaWNfY2ZnIGNtZDsKLQlzdHJ1Y3QgdmZlX2RlbW9zYWljX2JwY19jZmcgY21kYnBjOwotCXVpbnQzMl90IHRlbXA7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCi0JdGVtcCA9IHJlYWRsKGN0cmwtPnZmZWJhc2UgKyBWRkVfREVNT1NBSUNfQ0ZHKTsKLQotCWNtZCA9ICooKHN0cnVjdCB2ZmVfZGVtb3NhaWNfY2ZnICopKCZ0ZW1wKSk7Ci0JY21kLmJhZFBpeGVsQ29yckVuYWJsZSA9IGluLT5icGNVcGRhdGUuZW5hYmxlOwotCWNtZC5mbWluVGhyZXNob2xkICAgICAgPSBpbi0+YnBjVXBkYXRlLmZtaW5UaHJlc2hvbGQ7Ci0JY21kLmZtYXhUaHJlc2hvbGQgICAgICA9IGluLT5icGNVcGRhdGUuZm1heFRocmVzaG9sZDsKLQotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfREVNT1NBSUNfQ0ZHLAotCQkodWludDMyX3QgKikmY21kLCBzaXplb2YoY21kKSk7Ci0KLQljbWRicGMuYmx1ZURpZmZUaHJlc2hvbGQgID0gaW4tPmJwY1VwZGF0ZS5ibHVlRGlmZlRocmVzaG9sZDsKLQljbWRicGMucmVkRGlmZlRocmVzaG9sZCAgID0gaW4tPmJwY1VwZGF0ZS5yZWREaWZmVGhyZXNob2xkOwotCWNtZGJwYy5ncmVlbkRpZmZUaHJlc2hvbGQgPSBpbi0+YnBjVXBkYXRlLmdyZWVuRGlmZlRocmVzaG9sZDsKLQotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfREVNT1NBSUNfQlBDX0NGR18wLAotCQkodWludDMyX3QgKikmY21kYnBjLCBzaXplb2YoY21kYnBjKSk7Ci19Ci0KLXZvaWQgdmZlX2RlbW9zYWljX2NvbmZpZyhzdHJ1Y3QgdmZlX2NtZF9kZW1vc2FpY19jb25maWcgKmluKQotewotCXN0cnVjdCB2ZmVfZGVtb3NhaWNfY2ZnIGNtZDsKLQlzdHJ1Y3QgdmZlX2RlbW9zYWljX2JwY19jZmcgY21kX2JwYzsKLQlzdHJ1Y3QgdmZlX2RlbW9zYWljX2FiZl9jZmcgY21kX2FiZjsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JbWVtc2V0KCZjbWRfYnBjLCAwLCBzaXplb2YoY21kX2JwYykpOwotCW1lbXNldCgmY21kX2FiZiwgMCwgc2l6ZW9mKGNtZF9hYmYpKTsKLQotCWN0cmwtPnZmZU1vZHVsZUVuYWJsZUxvY2FsLmRlbW9zYWljRW5hYmxlID0gaW4tPmVuYWJsZTsKLQotCWNtZC5hYmZFbmFibGUgICAgICAgICAgPSBpbi0+YWJmQ29uZmlnLmVuYWJsZTsKLQljbWQuYmFkUGl4ZWxDb3JyRW5hYmxlID0gaW4tPmJwY0NvbmZpZy5lbmFibGU7Ci0JY21kLmZvcmNlQWJmT24gICAgICAgICA9IGluLT5hYmZDb25maWcuZm9yY2VPbjsKLQljbWQuYWJmU2hpZnQgICAgICAgICAgID0gaW4tPmFiZkNvbmZpZy5zaGlmdDsKLQljbWQuZm1pblRocmVzaG9sZCAgICAgID0gaW4tPmJwY0NvbmZpZy5mbWluVGhyZXNob2xkOwotCWNtZC5mbWF4VGhyZXNob2xkICAgICAgPSBpbi0+YnBjQ29uZmlnLmZtYXhUaHJlc2hvbGQ7Ci0JY21kLnNsb3BlU2hpZnQgICAgICAgICA9IGluLT5zbG9wZVNoaWZ0OwotCi0JdmZlX3Byb2dfaHcoY3RybC0+dmZlYmFzZSArIFZGRV9ERU1PU0FJQ19DRkcsCi0JCSh1aW50MzJfdCAqKSZjbWQsIHNpemVvZihjbWQpKTsKLQotCWNtZF9hYmYubHBUaHJlc2hvbGQgPSBpbi0+YWJmQ29uZmlnLmxwVGhyZXNob2xkOwotCWNtZF9hYmYucmF0aW8gICAgICAgPSBpbi0+YWJmQ29uZmlnLnJhdGlvOwotCWNtZF9hYmYubWluVmFsdWUgICAgPSBpbi0+YWJmQ29uZmlnLm1pbjsKLQljbWRfYWJmLm1heFZhbHVlICAgID0gaW4tPmFiZkNvbmZpZy5tYXg7Ci0KLQl2ZmVfcHJvZ19odyhjdHJsLT52ZmViYXNlICsgVkZFX0RFTU9TQUlDX0FCRl9DRkdfMCwKLQkJKHVpbnQzMl90ICopJmNtZF9hYmYsIHNpemVvZihjbWRfYWJmKSk7Ci0KLQljbWRfYnBjLmJsdWVEaWZmVGhyZXNob2xkICAgPSBpbi0+YnBjQ29uZmlnLmJsdWVEaWZmVGhyZXNob2xkOwotCWNtZF9icGMucmVkRGlmZlRocmVzaG9sZCAgICA9IGluLT5icGNDb25maWcucmVkRGlmZlRocmVzaG9sZDsKLQljbWRfYnBjLmdyZWVuRGlmZlRocmVzaG9sZCAgPSBpbi0+YnBjQ29uZmlnLmdyZWVuRGlmZlRocmVzaG9sZDsKLQotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfREVNT1NBSUNfQlBDX0NGR18wLAotCQkodWludDMyX3QgKikmY21kX2JwYywgc2l6ZW9mKGNtZF9icGMpKTsKLX0KLQotdm9pZCB2ZmVfZGVtdXhfY2hhbm5lbF9nYWluX3VwZGF0ZShzdHJ1Y3QgdmZlX2NtZF9kZW11eF9jaGFubmVsX2dhaW5fY29uZmlnICppbikKLXsKLQlzdHJ1Y3QgdmZlX2RlbXV4X2NmZyBjbWQ7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCi0JY21kLmNoMEV2ZW5HYWluICA9IGluLT5jaDBFdmVuR2FpbjsKLQljbWQuY2gwT2RkR2FpbiAgID0gaW4tPmNoME9kZEdhaW47Ci0JY21kLmNoMUdhaW4gICAgICA9IGluLT5jaDFHYWluOwotCWNtZC5jaDJHYWluICAgICAgPSBpbi0+Y2gyR2FpbjsKLQotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfREVNVVhfR0FJTl8wLAotCQkodWludDMyX3QgKikmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXZvaWQgdmZlX2RlbXV4X2NoYW5uZWxfZ2Fpbl9jb25maWcoc3RydWN0IHZmZV9jbWRfZGVtdXhfY2hhbm5lbF9nYWluX2NvbmZpZyAqaW4pCi17Ci0Jc3RydWN0IHZmZV9kZW11eF9jZmcgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWNtZC5jaDBFdmVuR2FpbiA9IGluLT5jaDBFdmVuR2FpbjsKLQljbWQuY2gwT2RkR2FpbiAgPSBpbi0+Y2gwT2RkR2FpbjsKLQljbWQuY2gxR2FpbiAgICAgPSBpbi0+Y2gxR2FpbjsKLQljbWQuY2gyR2FpbiAgICAgPSBpbi0+Y2gyR2FpbjsKLQotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfREVNVVhfR0FJTl8wLAotCQkodWludDMyX3QgKikmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXZvaWQgdmZlX2JsYWNrX2xldmVsX3VwZGF0ZShzdHJ1Y3QgdmZlX2NtZF9ibGFja19sZXZlbF9jb25maWcgKmluKQotewotCXN0cnVjdCB2ZmVfYmxhY2tsZXZlbF9jZmcgY21kOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQljdHJsLT52ZmVNb2R1bGVFbmFibGVMb2NhbC5ibGFja0xldmVsQ29ycmVjdGlvbkVuYWJsZSA9IGluLT5lbmFibGU7Ci0KLQljbWQuZXZlbkV2ZW5BZGp1c3RtZW50ID0gaW4tPmV2ZW5FdmVuQWRqdXN0bWVudDsKLQljbWQuZXZlbk9kZEFkanVzdG1lbnQgID0gaW4tPmV2ZW5PZGRBZGp1c3RtZW50OwotCWNtZC5vZGRFdmVuQWRqdXN0bWVudCAgPSBpbi0+b2RkRXZlbkFkanVzdG1lbnQ7Ci0JY21kLm9kZE9kZEFkanVzdG1lbnQgICA9IGluLT5vZGRPZGRBZGp1c3RtZW50OwotCi0JdmZlX3Byb2dfaHcoY3RybC0+dmZlYmFzZSArIFZGRV9CTEFDS19FVkVOX0VWRU5fVkFMVUUsCi0JCSh1aW50MzJfdCAqKSZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotdm9pZCB2ZmVfYmxhY2tfbGV2ZWxfY29uZmlnKHN0cnVjdCB2ZmVfY21kX2JsYWNrX2xldmVsX2NvbmZpZyAqaW4pCi17Ci0Jc3RydWN0IHZmZV9ibGFja2xldmVsX2NmZyBjbWQ7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWN0cmwtPnZmZU1vZHVsZUVuYWJsZUxvY2FsLmJsYWNrTGV2ZWxDb3JyZWN0aW9uRW5hYmxlID0gaW4tPmVuYWJsZTsKLQotCWNtZC5ldmVuRXZlbkFkanVzdG1lbnQgPSBpbi0+ZXZlbkV2ZW5BZGp1c3RtZW50OwotCWNtZC5ldmVuT2RkQWRqdXN0bWVudCAgPSBpbi0+ZXZlbk9kZEFkanVzdG1lbnQ7Ci0JY21kLm9kZEV2ZW5BZGp1c3RtZW50ICA9IGluLT5vZGRFdmVuQWRqdXN0bWVudDsKLQljbWQub2RkT2RkQWRqdXN0bWVudCAgID0gaW4tPm9kZE9kZEFkanVzdG1lbnQ7Ci0KLQl2ZmVfcHJvZ19odyhjdHJsLT52ZmViYXNlICsgVkZFX0JMQUNLX0VWRU5fRVZFTl9WQUxVRSwKLQkJKHVpbnQzMl90ICopJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi12b2lkIHZmZV9hc2ZfdXBkYXRlKHN0cnVjdCB2ZmVfY21kX2FzZl91cGRhdGUgKmluKQotewotCXN0cnVjdCB2ZmVfYXNmX3VwZGF0ZSBjbWQ7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWN0cmwtPnZmZU1vZHVsZUVuYWJsZUxvY2FsLmFzZkVuYWJsZSA9IGluLT5lbmFibGU7Ci0KLQljbWQuc21vb3RoRW5hYmxlICAgICA9IGluLT5zbW9vdGhGaWx0ZXJFbmFibGVkOwotCWNtZC5zaGFycE1vZGUgICAgICAgID0gaW4tPnNoYXJwTW9kZTsKLQljbWQuc21vb3RoQ29lZmYwICAgICA9IGluLT5zbW9vdGhDb2VmQ2VudGVyOwotCWNtZC5zbW9vdGhDb2VmZjEgICAgID0gaW4tPnNtb290aENvZWZTdXJyOwotCWNtZC5jcm9wRW5hYmxlICAgICAgID0gaW4tPmNyb3BFbmFibGU7Ci0JY21kLnNoYXJwVGhyZXNob2xkRTEgPSBpbi0+c2hhcnBUaHJlc2hFMTsKLQljbWQuc2hhcnBEZWdyZWVLMSAgICA9IGluLT5zaGFycEsxOwotCWNtZC5zaGFycERlZ3JlZUsyICAgID0gaW4tPnNoYXJwSzI7Ci0JY21kLm5vcm1hbGl6ZUZhY3RvciAgPSBpbi0+bm9ybWFsaXplRmFjdG9yOwotCWNtZC5zaGFycFRocmVzaG9sZEUyID0gaW4tPnNoYXJwVGhyZXNoRTI7Ci0JY21kLnNoYXJwVGhyZXNob2xkRTMgPSBpbi0+c2hhcnBUaHJlc2hFMzsKLQljbWQuc2hhcnBUaHJlc2hvbGRFNCA9IGluLT5zaGFycFRocmVzaEU0OwotCWNtZC5zaGFycFRocmVzaG9sZEU1ID0gaW4tPnNoYXJwVGhyZXNoRTU7Ci0JY21kLkYxQ29lZmYwICAgICAgICAgPSBpbi0+ZmlsdGVyMUNvZWZmaWNpZW50c1swXTsKLQljbWQuRjFDb2VmZjEgICAgICAgICA9IGluLT5maWx0ZXIxQ29lZmZpY2llbnRzWzFdOwotCWNtZC5GMUNvZWZmMiAgICAgICAgID0gaW4tPmZpbHRlcjFDb2VmZmljaWVudHNbMl07Ci0JY21kLkYxQ29lZmYzICAgICAgICAgPSBpbi0+ZmlsdGVyMUNvZWZmaWNpZW50c1szXTsKLQljbWQuRjFDb2VmZjQgICAgICAgICA9IGluLT5maWx0ZXIxQ29lZmZpY2llbnRzWzRdOwotCWNtZC5GMUNvZWZmNSAgICAgICAgID0gaW4tPmZpbHRlcjFDb2VmZmljaWVudHNbNV07Ci0JY21kLkYxQ29lZmY2ICAgICAgICAgPSBpbi0+ZmlsdGVyMUNvZWZmaWNpZW50c1s2XTsKLQljbWQuRjFDb2VmZjcgICAgICAgICA9IGluLT5maWx0ZXIxQ29lZmZpY2llbnRzWzddOwotCWNtZC5GMUNvZWZmOCAgICAgICAgID0gaW4tPmZpbHRlcjFDb2VmZmljaWVudHNbOF07Ci0JY21kLkYyQ29lZmYwICAgICAgICAgPSBpbi0+ZmlsdGVyMkNvZWZmaWNpZW50c1swXTsKLQljbWQuRjJDb2VmZjEgICAgICAgICA9IGluLT5maWx0ZXIyQ29lZmZpY2llbnRzWzFdOwotCWNtZC5GMkNvZWZmMiAgICAgICAgID0gaW4tPmZpbHRlcjJDb2VmZmljaWVudHNbMl07Ci0JY21kLkYyQ29lZmYzICAgICAgICAgPSBpbi0+ZmlsdGVyMkNvZWZmaWNpZW50c1szXTsKLQljbWQuRjJDb2VmZjQgICAgICAgICA9IGluLT5maWx0ZXIyQ29lZmZpY2llbnRzWzRdOwotCWNtZC5GMkNvZWZmNSAgICAgICAgID0gaW4tPmZpbHRlcjJDb2VmZmljaWVudHNbNV07Ci0JY21kLkYyQ29lZmY2ICAgICAgICAgPSBpbi0+ZmlsdGVyMkNvZWZmaWNpZW50c1s2XTsKLQljbWQuRjJDb2VmZjcgICAgICAgICA9IGluLT5maWx0ZXIyQ29lZmZpY2llbnRzWzddOwotCWNtZC5GMkNvZWZmOCAgICAgICAgID0gaW4tPmZpbHRlcjJDb2VmZmljaWVudHNbOF07Ci0KLQl2ZmVfcHJvZ19odyhjdHJsLT52ZmViYXNlICsgVkZFX0FTRl9DRkcsCi0JCSh1aW50MzJfdCAqKSZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotdm9pZCB2ZmVfYXNmX2NvbmZpZyhzdHJ1Y3QgdmZlX2NtZF9hc2ZfY29uZmlnICppbikKLXsKLQlzdHJ1Y3QgdmZlX2FzZl91cGRhdGUgICAgIGNtZDsKLQlzdHJ1Y3QgdmZlX2FzZmNyb3BfY2ZnIGNtZDI7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCW1lbXNldCgmY21kMiwgMCwgc2l6ZW9mKGNtZDIpKTsKLQotCWN0cmwtPnZmZU1vZHVsZUVuYWJsZUxvY2FsLmFzZkVuYWJsZSA9IGluLT5lbmFibGU7Ci0KLQljbWQuc21vb3RoRW5hYmxlICAgICAgID0gaW4tPnNtb290aEZpbHRlckVuYWJsZWQ7Ci0JY21kLnNoYXJwTW9kZSAgICAgICAgICA9IGluLT5zaGFycE1vZGU7Ci0JY21kLnNtb290aENvZWZmMCAgICAgICA9IGluLT5zbW9vdGhDb2VmQ2VudGVyOwotCWNtZC5zbW9vdGhDb2VmZjEgICAgICAgPSBpbi0+c21vb3RoQ29lZlN1cnI7Ci0JY21kLmNyb3BFbmFibGUgICAgICAgICA9IGluLT5jcm9wRW5hYmxlOwotCWNtZC5zaGFycFRocmVzaG9sZEUxICAgPSBpbi0+c2hhcnBUaHJlc2hFMTsKLQljbWQuc2hhcnBEZWdyZWVLMSAgICAgID0gaW4tPnNoYXJwSzE7Ci0JY21kLnNoYXJwRGVncmVlSzIgICAgICA9IGluLT5zaGFycEsyOwotCWNtZC5ub3JtYWxpemVGYWN0b3IgICAgPSBpbi0+bm9ybWFsaXplRmFjdG9yOwotCWNtZC5zaGFycFRocmVzaG9sZEUyICAgPSBpbi0+c2hhcnBUaHJlc2hFMjsKLQljbWQuc2hhcnBUaHJlc2hvbGRFMyAgID0gaW4tPnNoYXJwVGhyZXNoRTM7Ci0JY21kLnNoYXJwVGhyZXNob2xkRTQgICA9IGluLT5zaGFycFRocmVzaEU0OwotCWNtZC5zaGFycFRocmVzaG9sZEU1ICAgPSBpbi0+c2hhcnBUaHJlc2hFNTsKLQljbWQuRjFDb2VmZjAgICAgICAgICAgID0gaW4tPmZpbHRlcjFDb2VmZmljaWVudHNbMF07Ci0JY21kLkYxQ29lZmYxICAgICAgICAgICA9IGluLT5maWx0ZXIxQ29lZmZpY2llbnRzWzFdOwotCWNtZC5GMUNvZWZmMiAgICAgICAgICAgPSBpbi0+ZmlsdGVyMUNvZWZmaWNpZW50c1syXTsKLQljbWQuRjFDb2VmZjMgICAgICAgICAgID0gaW4tPmZpbHRlcjFDb2VmZmljaWVudHNbM107Ci0JY21kLkYxQ29lZmY0ICAgICAgICAgICA9IGluLT5maWx0ZXIxQ29lZmZpY2llbnRzWzRdOwotCWNtZC5GMUNvZWZmNSAgICAgICAgICAgPSBpbi0+ZmlsdGVyMUNvZWZmaWNpZW50c1s1XTsKLQljbWQuRjFDb2VmZjYgICAgICAgICAgID0gaW4tPmZpbHRlcjFDb2VmZmljaWVudHNbNl07Ci0JY21kLkYxQ29lZmY3ICAgICAgICAgICA9IGluLT5maWx0ZXIxQ29lZmZpY2llbnRzWzddOwotCWNtZC5GMUNvZWZmOCAgICAgICAgICAgPSBpbi0+ZmlsdGVyMUNvZWZmaWNpZW50c1s4XTsKLQljbWQuRjJDb2VmZjAgICAgICAgICAgID0gaW4tPmZpbHRlcjJDb2VmZmljaWVudHNbMF07Ci0JY21kLkYyQ29lZmYxICAgICAgICAgICA9IGluLT5maWx0ZXIyQ29lZmZpY2llbnRzWzFdOwotCWNtZC5GMkNvZWZmMiAgICAgICAgICAgPSBpbi0+ZmlsdGVyMkNvZWZmaWNpZW50c1syXTsKLQljbWQuRjJDb2VmZjMgICAgICAgICAgID0gaW4tPmZpbHRlcjJDb2VmZmljaWVudHNbM107Ci0JY21kLkYyQ29lZmY0ICAgICAgICAgICA9IGluLT5maWx0ZXIyQ29lZmZpY2llbnRzWzRdOwotCWNtZC5GMkNvZWZmNSAgICAgICAgICAgPSBpbi0+ZmlsdGVyMkNvZWZmaWNpZW50c1s1XTsKLQljbWQuRjJDb2VmZjYgICAgICAgICAgID0gaW4tPmZpbHRlcjJDb2VmZmljaWVudHNbNl07Ci0JY21kLkYyQ29lZmY3ICAgICAgICAgICA9IGluLT5maWx0ZXIyQ29lZmZpY2llbnRzWzddOwotCWNtZC5GMkNvZWZmOCAgICAgICAgICAgPSBpbi0+ZmlsdGVyMkNvZWZmaWNpZW50c1s4XTsKLQotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfQVNGX0NGRywKLQkJKHVpbnQzMl90ICopJmNtZCwgc2l6ZW9mKGNtZCkpOwotCi0JY21kMi5maXJzdExpbmUgID0gaW4tPmNyb3BGaXJzdExpbmU7Ci0JY21kMi5sYXN0TGluZSAgID0gaW4tPmNyb3BMYXN0TGluZTsKLQljbWQyLmZpcnN0UGl4ZWwgPSBpbi0+Y3JvcEZpcnN0UGl4ZWw7Ci0JY21kMi5sYXN0UGl4ZWwgID0gaW4tPmNyb3BMYXN0UGl4ZWw7Ci0KLQl2ZmVfcHJvZ19odyhjdHJsLT52ZmViYXNlICsgVkZFX0FTRl9DUk9QX1dJRFRIX0NGRywKLQkJKHVpbnQzMl90ICopJmNtZDIsIHNpemVvZihjbWQyKSk7Ci19Ci0KLXZvaWQgdmZlX3doaXRlX2JhbGFuY2VfY29uZmlnKHN0cnVjdCB2ZmVfY21kX3doaXRlX2JhbGFuY2VfY29uZmlnICppbikKLXsKLQlzdHJ1Y3QgdmZlX3diX2NmZyBjbWQ7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWN0cmwtPnZmZU1vZHVsZUVuYWJsZUxvY2FsLndoaXRlQmFsYW5jZUVuYWJsZSA9IGluLT5lbmFibGU7Ci0KLQljbWQuY2gwR2FpbiA9IGluLT5jaDBHYWluOwotCWNtZC5jaDFHYWluID0gaW4tPmNoMUdhaW47Ci0JY21kLmNoMkdhaW4gPSBpbi0+Y2gyR2FpbjsKLQotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfV0JfQ0ZHLAotCQkodWludDMyX3QgKikmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXZvaWQgdmZlX2Nocm9tYV9zdXBfY29uZmlnKHN0cnVjdCB2ZmVfY21kX2Nocm9tYV9zdXBwcmVzc2lvbl9jb25maWcgKmluKQotewotCXN0cnVjdCB2ZmVfY2hyb21hX3N1cHByZXNzX2NmZyBjbWQ7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWN0cmwtPnZmZU1vZHVsZUVuYWJsZUxvY2FsLmNocm9tYVN1cHByZXNzaW9uRW5hYmxlID0gaW4tPmVuYWJsZTsKLQotCWNtZC5tMSAgPSBpbi0+bTE7Ci0JY21kLm0zICA9IGluLT5tMzsKLQljbWQubjEgID0gaW4tPm4xOwotCWNtZC5uMyAgPSBpbi0+bjM7Ci0JY21kLm1tMSA9IGluLT5tbTE7Ci0JY21kLm5uMSA9IGluLT5ubjE7Ci0KLQl2ZmVfcHJvZ19odyhjdHJsLT52ZmViYXNlICsgVkZFX0NIUk9NQV9TVVBQUkVTU19DRkdfMCwKLQkJKHVpbnQzMl90ICopJmNtZCwgc2l6ZW9mKGNtZCkpOwotfQotCi12b2lkIHZmZV9yb2xsX29mZl9jb25maWcoc3RydWN0IHZmZV9jbWRfcm9sbF9vZmZfY29uZmlnICppbikKLXsKLQlzdHJ1Y3QgdmZlX3JvbGxvZmZfY2ZnIGNtZDsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCi0JY3RybC0+dmZlTW9kdWxlRW5hYmxlTG9jYWwubGVuc1JvbGxPZmZFbmFibGUgPSBpbi0+ZW5hYmxlOwotCi0JY21kLmdyaWRXaWR0aCAgID0gaW4tPmdyaWRXaWR0aDsKLQljbWQuZ3JpZEhlaWdodCAgPSBpbi0+Z3JpZEhlaWdodDsKLQljbWQueURlbHRhICAgICAgPSBpbi0+eURlbHRhOwotCWNtZC5ncmlkWCAgICAgICA9IGluLT5ncmlkWEluZGV4OwotCWNtZC5ncmlkWSAgICAgICA9IGluLT5ncmlkWUluZGV4OwotCWNtZC5waXhlbFggICAgICA9IGluLT5ncmlkUGl4ZWxYSW5kZXg7Ci0JY21kLnBpeGVsWSAgICAgID0gaW4tPmdyaWRQaXhlbFlJbmRleDsKLQljbWQueURlbHRhQWNjdW0gPSBpbi0+eURlbHRhQWNjdW07Ci0KLQl2ZmVfcHJvZ19odyhjdHJsLT52ZmViYXNlICsgVkZFX1JPTExPRkZfQ0ZHXzAsCi0JCSh1aW50MzJfdCAqKSZjbWQsIHNpemVvZihjbWQpKTsKLQotCXZmZV93cml0ZV9sZW5zX3JvbGxfb2ZmX3RhYmxlKGluKTsKLX0KLQotdm9pZCB2ZmVfY2hyb21hX3N1YnNhbXBsZV9jb25maWcoc3RydWN0IHZmZV9jbWRfY2hyb21hX3N1YnNhbXBsZV9jb25maWcgKmluKQotewotCXN0cnVjdCB2ZmVfY2hyb21hc3Vic2FtcGxlX2NmZyBjbWQ7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWN0cmwtPnZmZU1vZHVsZUVuYWJsZUxvY2FsLmNocm9tYVN1YnNhbXBsZUVuYWJsZSA9IGluLT5lbmFibGU7Ci0KLQljbWQuaENvc2l0ZWRQaGFzZSAgICAgICA9IGluLT5oQ29zaXRlZFBoYXNlOwotCWNtZC52Q29zaXRlZFBoYXNlICAgICAgID0gaW4tPnZDb3NpdGVkUGhhc2U7Ci0JY21kLmhDb3NpdGVkICAgICAgICAgICAgPSBpbi0+aENvc2l0ZWQ7Ci0JY21kLnZDb3NpdGVkICAgICAgICAgICAgPSBpbi0+dkNvc2l0ZWQ7Ci0JY21kLmhzdWJTYW1wbGVFbmFibGUgICAgPSBpbi0+aHN1YlNhbXBsZUVuYWJsZTsKLQljbWQudnN1YlNhbXBsZUVuYWJsZSAgICA9IGluLT52c3ViU2FtcGxlRW5hYmxlOwotCWNtZC5jcm9wRW5hYmxlICAgICAgICAgID0gaW4tPmNyb3BFbmFibGU7Ci0JY21kLmNyb3BXaWR0aExhc3RQaXhlbCAgPSBpbi0+Y3JvcFdpZHRoTGFzdFBpeGVsOwotCWNtZC5jcm9wV2lkdGhGaXJzdFBpeGVsID0gaW4tPmNyb3BXaWR0aEZpcnN0UGl4ZWw7Ci0JY21kLmNyb3BIZWlnaHRMYXN0TGluZSAgPSBpbi0+Y3JvcEhlaWdodExhc3RMaW5lOwotCWNtZC5jcm9wSGVpZ2h0Rmlyc3RMaW5lID0gaW4tPmNyb3BIZWlnaHRGaXJzdExpbmU7Ci0KLQl2ZmVfcHJvZ19odyhjdHJsLT52ZmViYXNlICsgVkZFX0NIUk9NQV9TVUJTQU1QTEVfQ0ZHLAotCQkodWludDMyX3QgKikmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXZvaWQgdmZlX2Nocm9tYV9lbmhhbl9jb25maWcoc3RydWN0IHZmZV9jbWRfY2hyb21hX2VuaGFuX2NvbmZpZyAqaW4pCi17Ci0Jc3RydWN0IHZmZV9jaHJvbWFfZW5oYW5jZV9jZmcgY21kOwotCXN0cnVjdCB2ZmVfY29sb3JfY29udmVydF9jZmcgY21kMjsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JbWVtc2V0KCZjbWQyLCAwLCBzaXplb2YoY21kMikpOwotCi0JY3RybC0+dmZlTW9kdWxlRW5hYmxlTG9jYWwuY2hyb21hRW5oYW5FbmFibGUgPSBpbi0+ZW5hYmxlOwotCi0JY21kLmFwICAgICAgICAgICAgID0gaW4tPmFwOwotCWNtZC5hbSAgICAgICAgICAgICA9IGluLT5hbTsKLQljbWQuYnAgICAgICAgICAgICAgPSBpbi0+YnA7Ci0JY21kLmJtICAgICAgICAgICAgID0gaW4tPmJtOwotCWNtZC5jcCAgICAgICAgICAgICA9IGluLT5jcDsKLQljbWQuY20gICAgICAgICAgICAgPSBpbi0+Y207Ci0JY21kLmRwICAgICAgICAgICAgID0gaW4tPmRwOwotCWNtZC5kbSAgICAgICAgICAgICA9IGluLT5kbTsKLQljbWQua2NiICAgICAgICAgICAgPSBpbi0+a2NiOwotCWNtZC5rY3IgICAgICAgICAgICA9IGluLT5rY3I7Ci0KLQljbWQyLnYwICAgICAgICAgICAgPSBpbi0+UkdCdG9ZQ29udmVyc2lvblYwOwotCWNtZDIudjEgICAgICAgICAgICA9IGluLT5SR0J0b1lDb252ZXJzaW9uVjE7Ci0JY21kMi52MiAgICAgICAgICAgID0gaW4tPlJHQnRvWUNvbnZlcnNpb25WMjsKLQljbWQyLkNvbnZlcnRPZmZzZXQgPSBpbi0+UkdCdG9ZQ29udmVyc2lvbk9mZnNldDsKLQotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfQ0hST01BX0VOSEFOX0EsCi0JCSh1aW50MzJfdCAqKSZjbWQsIHNpemVvZihjbWQpKTsKLQotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfQ09MT1JfQ09OVkVSVF9DT0VGRl8wLAotCQkodWludDMyX3QgKikmY21kMiwgc2l6ZW9mKGNtZDIpKTsKLX0KLQotdm9pZCB2ZmVfc2NhbGVyMmNiY3JfY29uZmlnKHN0cnVjdCB2ZmVfY21kX3NjYWxlcjJfY29uZmlnICppbikKLXsKLQlzdHJ1Y3QgdmZlX3NjYWxlcjJfY2ZnIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0KLQljdHJsLT52ZmVNb2R1bGVFbmFibGVMb2NhbC5zY2FsZXIyQ2JjckVuYWJsZSA9IGluLT5lbmFibGU7Ci0KLQljbWQuaEVuYWJsZSAgICAgICAgICAgICAgPSBpbi0+aGNvbmZpZy5lbmFibGU7Ci0JY21kLnZFbmFibGUgICAgICAgICAgICAgID0gaW4tPnZjb25maWcuZW5hYmxlOwotCWNtZC5pbldpZHRoICAgICAgICAgICAgICA9IGluLT5oY29uZmlnLmlucHV0U2l6ZTsKLQljbWQub3V0V2lkdGggICAgICAgICAgICAgPSBpbi0+aGNvbmZpZy5vdXRwdXRTaXplOwotCWNtZC5ob3JpelBoYXNlTXVsdCAgICAgICA9IGluLT5oY29uZmlnLnBoYXNlTXVsdGlwbGljYXRpb25GYWN0b3I7Ci0JY21kLmhvcml6SW50ZXJSZXNvbHV0aW9uID0gaW4tPmhjb25maWcuaW50ZXJwb2xhdGlvblJlc29sdXRpb247Ci0JY21kLmluSGVpZ2h0ICAgICAgICAgICAgID0gaW4tPnZjb25maWcuaW5wdXRTaXplOwotCWNtZC5vdXRIZWlnaHQgICAgICAgICAgICA9IGluLT52Y29uZmlnLm91dHB1dFNpemU7Ci0JY21kLnZlcnRQaGFzZU11bHQgICAgICAgID0gaW4tPnZjb25maWcucGhhc2VNdWx0aXBsaWNhdGlvbkZhY3RvcjsKLQljbWQudmVydEludGVyUmVzb2x1dGlvbiAgPSBpbi0+dmNvbmZpZy5pbnRlcnBvbGF0aW9uUmVzb2x1dGlvbjsKLQotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfU0NBTEVfQ0JDUl9DRkcsCi0JCSh1aW50MzJfdCAqKSZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotdm9pZCB2ZmVfc2NhbGVyMnlfY29uZmlnKHN0cnVjdCB2ZmVfY21kX3NjYWxlcjJfY29uZmlnICppbikKLXsKLQlzdHJ1Y3QgdmZlX3NjYWxlcjJfY2ZnIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0KLQljdHJsLT52ZmVNb2R1bGVFbmFibGVMb2NhbC5zY2FsZXIyWUVuYWJsZSA9IGluLT5lbmFibGU7Ci0KLQljbWQuaEVuYWJsZSAgICAgICAgICAgICAgID0gaW4tPmhjb25maWcuZW5hYmxlOwotCWNtZC52RW5hYmxlICAgICAgICAgICAgICAgPSBpbi0+dmNvbmZpZy5lbmFibGU7Ci0JY21kLmluV2lkdGggICAgICAgICAgICAgICA9IGluLT5oY29uZmlnLmlucHV0U2l6ZTsKLQljbWQub3V0V2lkdGggICAgICAgICAgICAgID0gaW4tPmhjb25maWcub3V0cHV0U2l6ZTsKLQljbWQuaG9yaXpQaGFzZU11bHQgICAgICAgID0gaW4tPmhjb25maWcucGhhc2VNdWx0aXBsaWNhdGlvbkZhY3RvcjsKLQljbWQuaG9yaXpJbnRlclJlc29sdXRpb24gID0gaW4tPmhjb25maWcuaW50ZXJwb2xhdGlvblJlc29sdXRpb247Ci0JY21kLmluSGVpZ2h0ICAgICAgICAgICAgICA9IGluLT52Y29uZmlnLmlucHV0U2l6ZTsKLQljbWQub3V0SGVpZ2h0ICAgICAgICAgICAgID0gaW4tPnZjb25maWcub3V0cHV0U2l6ZTsKLQljbWQudmVydFBoYXNlTXVsdCAgICAgICAgID0gaW4tPnZjb25maWcucGhhc2VNdWx0aXBsaWNhdGlvbkZhY3RvcjsKLQljbWQudmVydEludGVyUmVzb2x1dGlvbiAgID0gaW4tPnZjb25maWcuaW50ZXJwb2xhdGlvblJlc29sdXRpb247Ci0KLQl2ZmVfcHJvZ19odyhjdHJsLT52ZmViYXNlICsgVkZFX1NDQUxFX1lfQ0ZHLAotCQkodWludDMyX3QgKikmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXZvaWQgdmZlX21haW5fc2NhbGVyX2NvbmZpZyhzdHJ1Y3QgdmZlX2NtZF9tYWluX3NjYWxlcl9jb25maWcgKmluKQotewotCXN0cnVjdCB2ZmVfbWFpbl9zY2FsZXJfY2ZnIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0KLQljdHJsLT52ZmVNb2R1bGVFbmFibGVMb2NhbC5tYWluU2NhbGVyRW5hYmxlID0gaW4tPmVuYWJsZTsKLQotCWNtZC5oRW5hYmxlICAgICAgICAgICAgICA9IGluLT5oY29uZmlnLmVuYWJsZTsKLQljbWQudkVuYWJsZSAgICAgICAgICAgICAgPSBpbi0+dmNvbmZpZy5lbmFibGU7Ci0JY21kLmluV2lkdGggICAgICAgICAgICAgID0gaW4tPmhjb25maWcuaW5wdXRTaXplOwotCWNtZC5vdXRXaWR0aCAgICAgICAgICAgICA9IGluLT5oY29uZmlnLm91dHB1dFNpemU7Ci0JY21kLmhvcml6UGhhc2VNdWx0ICAgICAgID0gaW4tPmhjb25maWcucGhhc2VNdWx0aXBsaWNhdGlvbkZhY3RvcjsKLQljbWQuaG9yaXpJbnRlclJlc29sdXRpb24gPSBpbi0+aGNvbmZpZy5pbnRlcnBvbGF0aW9uUmVzb2x1dGlvbjsKLQljbWQuaG9yaXpNTkluaXQgICAgICAgICAgPSBpbi0+TU5Jbml0SC5NTkNvdW50ZXJJbml0OwotCWNtZC5ob3JpelBoYXNlSW5pdCAgICAgICA9IGluLT5NTkluaXRILnBoYXNlSW5pdDsKLQljbWQuaW5IZWlnaHQgICAgICAgICAgICAgPSBpbi0+dmNvbmZpZy5pbnB1dFNpemU7Ci0JY21kLm91dEhlaWdodCAgICAgICAgICAgID0gaW4tPnZjb25maWcub3V0cHV0U2l6ZTsKLQljbWQudmVydFBoYXNlTXVsdCAgICAgICAgPSBpbi0+dmNvbmZpZy5waGFzZU11bHRpcGxpY2F0aW9uRmFjdG9yOwotCWNtZC52ZXJ0SW50ZXJSZXNvbHV0aW9uICA9IGluLT52Y29uZmlnLmludGVycG9sYXRpb25SZXNvbHV0aW9uOwotCWNtZC52ZXJ0TU5Jbml0ICAgICAgICAgICA9IGluLT5NTkluaXRWLk1OQ291bnRlckluaXQ7Ci0JY21kLnZlcnRQaGFzZUluaXQgICAgICAgID0gaW4tPk1OSW5pdFYucGhhc2VJbml0OwotCi0JdmZlX3Byb2dfaHcoY3RybC0+dmZlYmFzZSArIFZGRV9TQ0FMRV9DRkcsCi0JCSh1aW50MzJfdCAqKSZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotdm9pZCB2ZmVfc3RhdHNfd2JfZXhwX3N0b3Aodm9pZCkKLXsKLQljdHJsLT52ZmVTdGF0c0NtZExvY2FsLmF4d0VuYWJsZSA9IEZBTFNFOwotCWN0cmwtPnZmZUltYXNrTG9jYWwuYXdiUGluZ3BvbmdJcnEgPSBGQUxTRTsKLX0KLQotdm9pZCB2ZmVfc3RhdHNfdXBkYXRlX3diX2V4cChzdHJ1Y3QgdmZlX2NtZF9zdGF0c193Yl9leHBfdXBkYXRlICppbikKLXsKLQlzdHJ1Y3QgdmZlX3N0YXRzYXdiX3VwZGF0ZSAgIGNtZDsKLQlzdHJ1Y3QgdmZlX3N0YXRzYXdiYWVfdXBkYXRlIGNtZDI7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCW1lbXNldCgmY21kMiwgMCwgc2l6ZW9mKGNtZDIpKTsKLQotCWNtZC5tMSAgPSBpbi0+YXdiTUNGR1swXTsKLQljbWQubTIgID0gaW4tPmF3Yk1DRkdbMV07Ci0JY21kLm0zICA9IGluLT5hd2JNQ0ZHWzJdOwotCWNtZC5tNCAgPSBpbi0+YXdiTUNGR1szXTsKLQljbWQuYzEgID0gaW4tPmF3YkNDRkdbMF07Ci0JY21kLmMyICA9IGluLT5hd2JDQ0ZHWzFdOwotCWNtZC5jMyAgPSBpbi0+YXdiQ0NGR1syXTsKLQljbWQuYzQgID0gaW4tPmF3YkNDRkdbM107Ci0JdmZlX3Byb2dfaHcoY3RybC0+dmZlYmFzZSArIFZGRV9TVEFUU19BV0JfTUNGRywKLQkJKHVpbnQzMl90ICopJmNtZCwgc2l6ZW9mKGNtZCkpOwotCi0JY21kMi5hZVJlZ2lvbkNmZyAgICA9IGluLT53YkV4cFJlZ2lvbnM7Ci0JY21kMi5hZVN1YnJlZ2lvbkNmZyA9IGluLT53YkV4cFN1YlJlZ2lvbjsKLQljbWQyLmF3YllNaW4gICAgICAgID0gaW4tPmF3YllNaW47Ci0JY21kMi5hd2JZTWF4ICAgICAgICA9IGluLT5hd2JZTWF4OwotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfU1RBVFNfQVdCQUVfQ0ZHLAotCQkodWludDMyX3QgKikmY21kMiwgc2l6ZW9mKGNtZDIpKTsKLX0KLQotdm9pZCB2ZmVfc3RhdHNfdXBkYXRlX2FmKHN0cnVjdCB2ZmVfY21kX3N0YXRzX2FmX3VwZGF0ZSAqaW4pCi17Ci0Jc3RydWN0IHZmZV9zdGF0c2FmX3VwZGF0ZSBjbWQ7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCWNtZC53aW5kb3dWT2Zmc2V0ID0gaW4tPndpbmRvd1ZPZmZzZXQ7Ci0JY21kLndpbmRvd0hPZmZzZXQgPSBpbi0+d2luZG93SE9mZnNldDsKLQljbWQud2luZG93TW9kZSAgICA9IGluLT53aW5kb3dNb2RlOwotCWNtZC53aW5kb3dIZWlnaHQgID0gaW4tPndpbmRvd0hlaWdodDsKLQljbWQud2luZG93V2lkdGggICA9IGluLT53aW5kb3dXaWR0aDsKLQotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfU1RBVFNfQUZfQ0ZHLAotCQkodWludDMyX3QgKikmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXZvaWQgdmZlX3N0YXRzX3N0YXJ0X3diX2V4cChzdHJ1Y3QgdmZlX2NtZF9zdGF0c193Yl9leHBfc3RhcnQgKmluKQotewotCXN0cnVjdCB2ZmVfc3RhdHNhd2JfdXBkYXRlICAgY21kOwotCXN0cnVjdCB2ZmVfc3RhdHNhd2JhZV91cGRhdGUgY21kMjsKLQlzdHJ1Y3QgdmZlX3N0YXRzYXh3X2hkcl9jZmcgIGNtZDM7Ci0KLQljdHJsLT52ZmVTdGF0c0NtZExvY2FsLmF4d0VuYWJsZSAgID0gIGluLT5lbmFibGU7Ci0JY3RybC0+dmZlSW1hc2tMb2NhbC5hd2JQaW5ncG9uZ0lycSA9IFRSVUU7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCW1lbXNldCgmY21kMiwgMCwgc2l6ZW9mKGNtZDIpKTsKLQltZW1zZXQoJmNtZDMsIDAsIHNpemVvZihjbWQzKSk7Ci0KLQljbWQubTEgID0gaW4tPmF3Yk1DRkdbMF07Ci0JY21kLm0yICA9IGluLT5hd2JNQ0ZHWzFdOwotCWNtZC5tMyAgPSBpbi0+YXdiTUNGR1syXTsKLQljbWQubTQgID0gaW4tPmF3Yk1DRkdbM107Ci0JY21kLmMxICA9IGluLT5hd2JDQ0ZHWzBdOwotCWNtZC5jMiAgPSBpbi0+YXdiQ0NGR1sxXTsKLQljbWQuYzMgID0gaW4tPmF3YkNDRkdbMl07Ci0JY21kLmM0ICA9IGluLT5hd2JDQ0ZHWzNdOwotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfU1RBVFNfQVdCX01DRkcsCi0JCSh1aW50MzJfdCAqKSZjbWQsIHNpemVvZihjbWQpKTsKLQotCWNtZDIuYWVSZWdpb25DZmcgICAgID0gaW4tPndiRXhwUmVnaW9uczsKLQljbWQyLmFlU3VicmVnaW9uQ2ZnICA9IGluLT53YkV4cFN1YlJlZ2lvbjsKLQljbWQyLmF3YllNaW4gICAgICAgICA9IGluLT5hd2JZTWluOwotCWNtZDIuYXdiWU1heCAgICAgICAgID0gaW4tPmF3YllNYXg7Ci0JdmZlX3Byb2dfaHcoY3RybC0+dmZlYmFzZSArIFZGRV9TVEFUU19BV0JBRV9DRkcsCi0JCSh1aW50MzJfdCAqKSZjbWQyLCBzaXplb2YoY21kMikpOwotCi0JY21kMy5heHdIZWFkZXIgICAgICAgPSBpbi0+YXh3SGVhZGVyOwotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfU1RBVFNfQVhXX0hFQURFUiwKLQkJKHVpbnQzMl90ICopJmNtZDMsIHNpemVvZihjbWQzKSk7Ci19Ci0KLXZvaWQgdmZlX3N0YXRzX3N0YXJ0X2FmKHN0cnVjdCB2ZmVfY21kX3N0YXRzX2FmX3N0YXJ0ICppbikKLXsKLQlzdHJ1Y3QgdmZlX3N0YXRzYWZfdXBkYXRlIGNtZDsKLQlzdHJ1Y3QgdmZlX3N0YXRzYWZfY2ZnICAgIGNtZDI7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCW1lbXNldCgmY21kMiwgMCwgc2l6ZW9mKGNtZDIpKTsKLQotCWN0cmwtPnZmZVN0YXRzQ21kTG9jYWwuYXV0b0ZvY3VzRW5hYmxlID0gaW4tPmVuYWJsZTsKLQljdHJsLT52ZmVJbWFza0xvY2FsLmFmUGluZ3BvbmdJcnEgPSBUUlVFOwotCi0JY21kLndpbmRvd1ZPZmZzZXQgPSBpbi0+d2luZG93Vk9mZnNldDsKLQljbWQud2luZG93SE9mZnNldCA9IGluLT53aW5kb3dIT2Zmc2V0OwotCWNtZC53aW5kb3dNb2RlICAgID0gaW4tPndpbmRvd01vZGU7Ci0JY21kLndpbmRvd0hlaWdodCAgPSBpbi0+d2luZG93SGVpZ2h0OwotCWNtZC53aW5kb3dXaWR0aCAgID0gaW4tPndpbmRvd1dpZHRoOwotCi0JdmZlX3Byb2dfaHcoY3RybC0+dmZlYmFzZSArIFZGRV9TVEFUU19BRl9DRkcsCi0JCSh1aW50MzJfdCAqKSZjbWQsIHNpemVvZihjbWQpKTsKLQotCWNtZDIuYTAwICAgICAgID0gaW4tPmhpZ2hQYXNzQ29lZlswXTsKLQljbWQyLmEwNCAgICAgICA9IGluLT5oaWdoUGFzc0NvZWZbMV07Ci0JY21kMi5hMjAgICAgICAgPSBpbi0+aGlnaFBhc3NDb2VmWzJdOwotCWNtZDIuYTIxICAgICAgID0gaW4tPmhpZ2hQYXNzQ29lZlszXTsKLQljbWQyLmEyMiAgICAgICA9IGluLT5oaWdoUGFzc0NvZWZbNF07Ci0JY21kMi5hMjMgICAgICAgPSBpbi0+aGlnaFBhc3NDb2VmWzVdOwotCWNtZDIuYTI0ICAgICAgID0gaW4tPmhpZ2hQYXNzQ29lZls2XTsKLQljbWQyLmZ2TWF4ICAgICA9IGluLT5tZXRyaWNNYXg7Ci0JY21kMi5mdk1ldHJpYyAgPSBpbi0+bWV0cmljU2VsZWN0aW9uOwotCWNtZDIuYWZIZWFkZXIgID0gaW4tPmJ1ZmZlckhlYWRlcjsKLQljbWQyLmVudHJ5MDAgICA9IGluLT5ncmlkRm9yTXVsdGlXaW5kb3dzWzBdOwotCWNtZDIuZW50cnkwMSAgID0gaW4tPmdyaWRGb3JNdWx0aVdpbmRvd3NbMV07Ci0JY21kMi5lbnRyeTAyICAgPSBpbi0+Z3JpZEZvck11bHRpV2luZG93c1syXTsKLQljbWQyLmVudHJ5MDMgICA9IGluLT5ncmlkRm9yTXVsdGlXaW5kb3dzWzNdOwotCWNtZDIuZW50cnkxMCAgID0gaW4tPmdyaWRGb3JNdWx0aVdpbmRvd3NbNF07Ci0JY21kMi5lbnRyeTExICAgPSBpbi0+Z3JpZEZvck11bHRpV2luZG93c1s1XTsKLQljbWQyLmVudHJ5MTIgICA9IGluLT5ncmlkRm9yTXVsdGlXaW5kb3dzWzZdOwotCWNtZDIuZW50cnkxMyAgID0gaW4tPmdyaWRGb3JNdWx0aVdpbmRvd3NbN107Ci0JY21kMi5lbnRyeTIwICAgPSBpbi0+Z3JpZEZvck11bHRpV2luZG93c1s4XTsKLQljbWQyLmVudHJ5MjEgICA9IGluLT5ncmlkRm9yTXVsdGlXaW5kb3dzWzldOwotCWNtZDIuZW50cnkyMiAgID0gaW4tPmdyaWRGb3JNdWx0aVdpbmRvd3NbMTBdOwotCWNtZDIuZW50cnkyMyAgID0gaW4tPmdyaWRGb3JNdWx0aVdpbmRvd3NbMTFdOwotCWNtZDIuZW50cnkzMCAgID0gaW4tPmdyaWRGb3JNdWx0aVdpbmRvd3NbMTJdOwotCWNtZDIuZW50cnkzMSAgID0gaW4tPmdyaWRGb3JNdWx0aVdpbmRvd3NbMTNdOwotCWNtZDIuZW50cnkzMiAgID0gaW4tPmdyaWRGb3JNdWx0aVdpbmRvd3NbMTRdOwotCWNtZDIuZW50cnkzMyAgID0gaW4tPmdyaWRGb3JNdWx0aVdpbmRvd3NbMTVdOwotCi0JdmZlX3Byb2dfaHcoY3RybC0+dmZlYmFzZSArIFZGRV9TVEFUU19BRl9HUklEXzAsCi0JCSh1aW50MzJfdCAqKSZjbWQyLCBzaXplb2YoY21kMikpOwotfQotCi12b2lkIHZmZV9zdGF0c19zZXR0aW5nKHN0cnVjdCB2ZmVfY21kX3N0YXRzX3NldHRpbmcgKmluKQotewotCXN0cnVjdCB2ZmVfc3RhdHNmcmFtZSBjbWQxOwotCXN0cnVjdCB2ZmVfYnVzc3RhdHNfd3JwcmlvIGNtZDI7Ci0KLQltZW1zZXQoJmNtZDEsIDAsIHNpemVvZihjbWQxKSk7Ci0JbWVtc2V0KCZjbWQyLCAwLCBzaXplb2YoY21kMikpOwotCi0JY3RybC0+YWZTdGF0c0NvbnRyb2wuYWRkcmVzc0J1ZmZlclswXSA9IGluLT5hZkJ1ZmZlclswXTsKLQljdHJsLT5hZlN0YXRzQ29udHJvbC5hZGRyZXNzQnVmZmVyWzFdID0gaW4tPmFmQnVmZmVyWzFdOwotCWN0cmwtPmFmU3RhdHNDb250cm9sLm5leHRGcmFtZUFkZHJCdWYgPSBpbi0+YWZCdWZmZXJbMl07Ci0KLQljdHJsLT5hd2JTdGF0c0NvbnRyb2wuYWRkcmVzc0J1ZmZlclswXSA9IGluLT5hd2JCdWZmZXJbMF07Ci0JY3RybC0+YXdiU3RhdHNDb250cm9sLmFkZHJlc3NCdWZmZXJbMV0gPSBpbi0+YXdiQnVmZmVyWzFdOwotCWN0cmwtPmF3YlN0YXRzQ29udHJvbC5uZXh0RnJhbWVBZGRyQnVmID0gaW4tPmF3YkJ1ZmZlclsyXTsKLQotCWNtZDEubGFzdFBpeGVsID0gaW4tPmZyYW1lSERpbWVuc2lvbjsKLQljbWQxLmxhc3RMaW5lICA9IGluLT5mcmFtZVZEaW1lbnNpb247Ci0JdmZlX3Byb2dfaHcoY3RybC0+dmZlYmFzZSArIFZGRV9TVEFUU19GUkFNRV9TSVpFLAotCQkodWludDMyX3QgKikmY21kMSwgc2l6ZW9mKGNtZDEpKTsKLQotCWNtZDIuYWZCdXNQcmlvcml0eSAgICA9IGluLT5hZkJ1c1ByaW9yaXR5OwotCWNtZDIuYXdiQnVzUHJpb3JpdHkgICA9IGluLT5hd2JCdXNQcmlvcml0eTsKLQljbWQyLmhpc3RCdXNQcmlvcml0eSAgPSBpbi0+aGlzdEJ1c1ByaW9yaXR5OwotCWNtZDIuYWZCdXNQcmlvcml0eUVuICA9IGluLT5hZkJ1c1ByaW9yaXR5U2VsZWN0aW9uOwotCWNtZDIuYXdiQnVzUHJpb3JpdHlFbiA9IGluLT5hd2JCdXNQcmlvcml0eVNlbGVjdGlvbjsKLQljbWQyLmhpc3RCdXNQcmlvcml0eUVuID0gaW4tPmhpc3RCdXNQcmlvcml0eVNlbGVjdGlvbjsKLQotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX1dSX1BSSU9SSVRZLAotCQkodWludDMyX3QgKikmY21kMiwgc2l6ZW9mKGNtZDIpKTsKLQotCS8qIFByb2dyYW0gdGhlIGJ1cyBwaW5nIHBvbmcgYWRkcmVzcyBmb3Igc3RhdGlzdGljcyBtb2R1bGVzLiAqLwotCXdyaXRlbChpbi0+YWZCdWZmZXJbMF0sIGN0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX0FGX1dSX1BJTkdfQUREUik7Ci0Jd3JpdGVsKGluLT5hZkJ1ZmZlclsxXSwgY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfQUZfV1JfUE9OR19BRERSKTsKLQl3cml0ZWwoaW4tPmF3YkJ1ZmZlclswXSwKLQkJY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfQVdCX1dSX1BJTkdfQUREUik7Ci0Jd3JpdGVsKGluLT5hd2JCdWZmZXJbMV0sCi0JCWN0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUQVRTX0FXQl9XUl9QT05HX0FERFIpOwotCXdyaXRlbChpbi0+aGlzdEJ1ZmZlclswXSwKLQkJY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfSElTVF9XUl9QSU5HX0FERFIpOwotCXdyaXRlbChpbi0+aGlzdEJ1ZmZlclsxXSwKLQkJY3RybC0+dmZlYmFzZSArIFZGRV9CVVNfU1RBVFNfSElTVF9XUl9QT05HX0FERFIpOwotfQotCi12b2lkIHZmZV9heGlfaW5wdXRfY29uZmlnKHN0cnVjdCB2ZmVfY21kX2F4aV9pbnB1dF9jb25maWcgKmluKQotewotCXN0cnVjdCBWRkVfQXhpSW5wdXRDbWRUeXBlIGNtZDsKLQl1aW50MzJfdCB4U2l6ZVdvcmQsIGF4aVJkVW5wYWNrUGF0dGVybjsKLQl1aW50OF90ICBheGlJbnB1dFBwdzsKLQl1aW50MzJfdCBidXNQaW5ncG9uZ1JkSXJxRW5hYmxlOwotCi0JY3RybC0+dmZlSW1hc2tMb2NhbC5yZFBpbmdwb25nSXJxID0gVFJVRTsKLQotCXN3aXRjaCAoaW4tPnBpeGVsU2l6ZSkgewotCWNhc2UgVkZFX1JBV19QSVhFTF9EQVRBX1NJWkVfMTBCSVQ6Ci0JCWN0cmwtPmF4aUlucHV0RGF0YVNpemUgPSBWRkVfUkFXX1BJWEVMX0RBVEFfU0laRV8xMEJJVDsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9SQVdfUElYRUxfREFUQV9TSVpFXzEyQklUOgotCQljdHJsLT5heGlJbnB1dERhdGFTaXplID0gVkZFX1JBV19QSVhFTF9EQVRBX1NJWkVfMTJCSVQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfUkFXX1BJWEVMX0RBVEFfU0laRV84QklUOgotCWRlZmF1bHQ6Ci0JCWN0cmwtPmF4aUlucHV0RGF0YVNpemUgPSBWRkVfUkFXX1BJWEVMX0RBVEFfU0laRV84QklUOwotCQlicmVhazsKLQl9Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCi0Jc3dpdGNoIChpbi0+cGl4ZWxTaXplKSB7Ci0JY2FzZSBWRkVfUkFXX1BJWEVMX0RBVEFfU0laRV8xMEJJVDoKLQkJYXhpSW5wdXRQcHcgPSA2OwotCQlheGlSZFVucGFja1BhdHRlcm4gPSAweEQ0MzIxMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9SQVdfUElYRUxfREFUQV9TSVpFXzEyQklUOgotCQlheGlJbnB1dFBwdyA9IDU7Ci0JCWF4aVJkVW5wYWNrUGF0dGVybiA9IDB4QzMyMTA7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfUkFXX1BJWEVMX0RBVEFfU0laRV84QklUOgotCWRlZmF1bHQ6Ci0JCWF4aUlucHV0UHB3ID0gODsKLQkJYXhpUmRVbnBhY2tQYXR0ZXJuID0gMHhGNjU0MzIxMDsKLQkJYnJlYWs7Ci0JfQotCi0JeFNpemVXb3JkID0KLQkJKCgoKGluLT54T2Zmc2V0ICUgYXhpSW5wdXRQcHcpICsgaW4tPnhTaXplKSArCi0JCQkoYXhpSW5wdXRQcHctMSkpIC8gYXhpSW5wdXRQcHcpIC0gMTsKLQotCWNtZC5zdHJpcGVTdGFydEFkZHIwICA9IGluLT5mcmFnQWRkclswXTsKLQljbWQuc3RyaXBlU3RhcnRBZGRyMSAgPSBpbi0+ZnJhZ0FkZHJbMV07Ci0JY21kLnN0cmlwZVN0YXJ0QWRkcjIgID0gaW4tPmZyYWdBZGRyWzJdOwotCWNtZC5zdHJpcGVTdGFydEFkZHIzICA9IGluLT5mcmFnQWRkclszXTsKLQljbWQueVNpemUgICAgICAgICAgICAgPSBpbi0+eVNpemU7Ci0JY21kLnlPZmZzZXREZWx0YSAgICAgID0gMDsKLQljbWQueFNpemVXb3JkICAgICAgICAgPSB4U2l6ZVdvcmQ7Ci0JY21kLmJ1cnN0TGVuZ3RoICAgICAgID0gMTsKLQljbWQuTnVtT2ZSb3dzICAgICAgICAgPSBpbi0+bnVtT2ZSb3dzOwotCWNtZC5Sb3dJbmNyZW1lbnQgPSAoaW4tPnJvd0luY3JlbWVudCArIChheGlJbnB1dFBwdyAtIDEpKSAvIGF4aUlucHV0UHB3OwotCWNtZC5tYWluVW5wYWNrSGVpZ2h0ICA9IGluLT55U2l6ZTsKLQljbWQubWFpblVucGFja1dpZHRoICAgPSBpbi0+eFNpemUgLSAxOwotCWNtZC5tYWluVW5wYWNrSGJpU2VsICA9ICh1aW50MzJfdClpbi0+dW5wYWNrSGJpOwotCWNtZC5tYWluVW5wYWNrUGhhc2UgICA9IGluLT51bnBhY2tQaGFzZTsKLQljbWQudW5wYWNrUGF0dGVybiAgICAgPSBheGlSZFVucGFja1BhdHRlcm47Ci0JY21kLnBhZExlZnQgICAgICAgICAgID0gaW4tPnBhZFJlcGVhdENvdW50TGVmdDsKLQljbWQucGFkUmlnaHQgICAgICAgICAgPSBpbi0+cGFkUmVwZWF0Q291bnRSaWdodDsKLQljbWQucGFkVG9wICAgICAgICAgICAgPSBpbi0+cGFkUmVwZWF0Q291bnRUb3A7Ci0JY21kLnBhZEJvdHRvbSAgICAgICAgID0gaW4tPnBhZFJlcGVhdENvdW50Qm90dG9tOwotCWNtZC5sZWZ0VW5wYWNrUGF0dGVybjAgICA9IGluLT5wYWRMZWZ0Q29tcG9uZW50U2VsZWN0Q3ljbGUwOwotCWNtZC5sZWZ0VW5wYWNrUGF0dGVybjEgICA9IGluLT5wYWRMZWZ0Q29tcG9uZW50U2VsZWN0Q3ljbGUxOwotCWNtZC5sZWZ0VW5wYWNrUGF0dGVybjIgICA9IGluLT5wYWRMZWZ0Q29tcG9uZW50U2VsZWN0Q3ljbGUyOwotCWNtZC5sZWZ0VW5wYWNrUGF0dGVybjMgICA9IGluLT5wYWRMZWZ0Q29tcG9uZW50U2VsZWN0Q3ljbGUzOwotCWNtZC5sZWZ0VW5wYWNrU3RvcDAgICAgICA9IGluLT5wYWRMZWZ0U3RvcEN5Y2xlMDsKLQljbWQubGVmdFVucGFja1N0b3AxICAgICAgPSBpbi0+cGFkTGVmdFN0b3BDeWNsZTE7Ci0JY21kLmxlZnRVbnBhY2tTdG9wMiAgICAgID0gaW4tPnBhZExlZnRTdG9wQ3ljbGUyOwotCWNtZC5sZWZ0VW5wYWNrU3RvcDMgICAgICA9IGluLT5wYWRMZWZ0U3RvcEN5Y2xlMzsKLQljbWQucmlnaHRVbnBhY2tQYXR0ZXJuMCAgPSBpbi0+cGFkUmlnaHRDb21wb25lbnRTZWxlY3RDeWNsZTA7Ci0JY21kLnJpZ2h0VW5wYWNrUGF0dGVybjEgID0gaW4tPnBhZFJpZ2h0Q29tcG9uZW50U2VsZWN0Q3ljbGUxOwotCWNtZC5yaWdodFVucGFja1BhdHRlcm4yICA9IGluLT5wYWRSaWdodENvbXBvbmVudFNlbGVjdEN5Y2xlMjsKLQljbWQucmlnaHRVbnBhY2tQYXR0ZXJuMyAgPSBpbi0+cGFkUmlnaHRDb21wb25lbnRTZWxlY3RDeWNsZTM7Ci0JY21kLnJpZ2h0VW5wYWNrU3RvcDAgICAgID0gaW4tPnBhZFJpZ2h0U3RvcEN5Y2xlMDsKLQljbWQucmlnaHRVbnBhY2tTdG9wMSAgICAgPSBpbi0+cGFkUmlnaHRTdG9wQ3ljbGUxOwotCWNtZC5yaWdodFVucGFja1N0b3AyICAgICA9IGluLT5wYWRSaWdodFN0b3BDeWNsZTI7Ci0JY21kLnJpZ2h0VW5wYWNrU3RvcDMgICAgID0gaW4tPnBhZFJpZ2h0U3RvcEN5Y2xlMzsKLQljbWQudG9wVW5hcGNrUGF0dGVybiAgICAgPSBpbi0+cGFkVG9wTGluZUNvdW50OwotCWNtZC5ib3R0b21VbmFwY2tQYXR0ZXJuICA9IGluLT5wYWRCb3R0b21MaW5lQ291bnQ7Ci0KLQkvKiAgcHJvZ3JhbSB2ZmVfYnVzX2NmZyAqLwotCXZmZV9wcm9nX2h3KGN0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1NUUklQRV9SRF9BRERSXzAsCi0JCSh1aW50MzJfdCAqKSZjbWQsIHNpemVvZihjbWQpKTsKLQotCS8qIGhhY2tpbmcgY29kZSwgcHV0IGl0IHRvIGRlZmF1bHQgdmFsdWUgKi8KLQlidXNQaW5ncG9uZ1JkSXJxRW5hYmxlID0gMHhmOwotCi0Jd3JpdGVsKGJ1c1Bpbmdwb25nUmRJcnFFbmFibGUsIGN0cmwtPnZmZWJhc2UgKyBWRkVfQlVTX1BJTkdQT05HX0lSUV9FTik7Ci19Ci0KLXZvaWQgdmZlX2F4aV9vdXRwdXRfY29uZmlnKHN0cnVjdCB2ZmVfY21kX2F4aV9vdXRwdXRfY29uZmlnICppbikKLXsKLQkvKiBsb2NhbCB2YXJpYWJsZSAgKi8KLQl1aW50MzJfdCAqcGNpcmNsZTsKLQl1aW50MzJfdCAqcGRlc3Q7Ci0JdWludDMyX3QgKnBzcmM7Ci0JdWludDhfdCAgaTsKLQl1aW50OF90ICBmY250OwotCXVpbnQxNl90IGF4aW91dHB3ID0gODsKLQotCS8qIHBhcmFtZXRlcnMgY2hlY2ssIGNvbmRpdGlvbiBhbmQgdXNhZ2UgbW9kZSBjaGVjayAqLwotCWN0cmwtPmVuY1BhdGguZnJhZ0NvdW50ID0gaW4tPm91dHB1dDIuZnJhZ21lbnRDb3VudDsKLQlpZiAoY3RybC0+ZW5jUGF0aC5mcmFnQ291bnQgPiAxKQotCQljdHJsLT5lbmNQYXRoLm11bHRpRnJhZyA9IFRSVUU7Ci0KLQljdHJsLT52aWV3UGF0aC5mcmFnQ291bnQgPSBpbi0+b3V0cHV0MS5mcmFnbWVudENvdW50OwotCWlmIChjdHJsLT52aWV3UGF0aC5mcmFnQ291bnQgPiAxKQotCQljdHJsLT52aWV3UGF0aC5tdWx0aUZyYWcgPSBUUlVFOwotCi0JLyogVkZFX0JVU19DRkcuICByYXcgZGF0YSBzaXplICovCi0JY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwucmF3UGl4ZWxEYXRhU2l6ZSA9IGluLT5vdXRwdXREYXRhU2l6ZTsKLQotCXN3aXRjaCAoaW4tPm91dHB1dERhdGFTaXplKSB7Ci0JY2FzZSBWRkVfUkFXX1BJWEVMX0RBVEFfU0laRV84QklUOgotCQlheGlvdXRwdyA9IDg7Ci0JCWJyZWFrOwotCi0JY2FzZSBWRkVfUkFXX1BJWEVMX0RBVEFfU0laRV8xMEJJVDoKLQkJYXhpb3V0cHcgPSA2OwotCQlicmVhazsKLQotCWNhc2UgVkZFX1JBV19QSVhFTF9EQVRBX1NJWkVfMTJCSVQ6Ci0JCWF4aW91dHB3ID0gNTsKLQkJYnJlYWs7Ci0JfQotCi0JY3RybC0+YXhpT3V0cHV0TW9kZSA9IGluLT5vdXRwdXRNb2RlOwotCi0JQ0RCRygiYXhpT3V0cHV0TW9kZSA9ICVkXG4iLCBjdHJsLT5heGlPdXRwdXRNb2RlKTsKLQotCXN3aXRjaCAoY3RybC0+YXhpT3V0cHV0TW9kZSkgewotCWNhc2UgVkZFX0FYSV9PVVRQVVRfTU9ERV9PdXRwdXQxOiB7Ci0JCWN0cmwtPnZmZUNhbWlmQ29uZmlnTG9jYWwuY2FtaWYyQnVzRW5hYmxlICAgPSBGQUxTRTsKLQkJY3RybC0+dmZlQ2FtaWZDb25maWdMb2NhbC5jYW1pZjJPdXRwdXRFbmFibGUgPSBUUlVFOwotCQljdHJsLT52ZmVCdXNDb25maWdMb2NhbC5yYXdXcml0ZVBhdGhTZWxlY3QgID0KLQkJCVZGRV9SQVdfT1VUUFVUX0RJU0FCTEVEOwotCi0JCWN0cmwtPmVuY1BhdGgucGF0aEVuYWJsZWQgICAgICAgICAgICAgICAgICAgPSBGQUxTRTsKLQkJY3RybC0+dmZlSW1hc2tMb2NhbC5lbmNJcnEgICAgICAgICAgICAgICAgICA9IEZBTFNFOwotCQljdHJsLT52ZmVJcnFDb21wb3NpdGVNYXNrTG9jYWwuZW5jSXJxQ29tTWFzayA9Ci0JCQlWRkVfQ09NUF9JUlFfQk9USF9ZX0NCQ1I7Ci0KLQkJY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwuZW5jWVdyUGF0aEVuICAgICAgICAgID0gRkFMU0U7Ci0JCWN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLmVuY0NiY3JXclBhdGhFbiAgICAgICA9IEZBTFNFOwotCQljdHJsLT52aWV3UGF0aC5wYXRoRW5hYmxlZCAgICAgICAgICAgICAgICAgICAgPSBUUlVFOwotCQljdHJsLT52ZmVJbWFza0xvY2FsLnZpZXdJcnEgICAgICAgICAgICAgICAgICAgPSBUUlVFOwotCQljdHJsLT52ZmVJcnFDb21wb3NpdGVNYXNrTG9jYWwudmlld0lycUNvbU1hc2sgPQotCQkJVkZFX0NPTVBfSVJRX0JPVEhfWV9DQkNSOwotCi0JCWN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLnZpZXdZV3JQYXRoRW4gICAgPSBUUlVFOwotCQljdHJsLT52ZmVCdXNDb25maWdMb2NhbC52aWV3Q2JjcldyUGF0aEVuID0gVFJVRTsKLQotCQlpZiAoY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwuZW5jWVdyUGF0aEVuICYmCi0JCQkJY3RybC0+ZW5jUGF0aC5tdWx0aUZyYWcpCi0JCQljdHJsLT52ZmVJbWFza0xvY2FsLmVuY1lQaW5ncG9uZ0lycSAgICA9IFRSVUU7Ci0KLQkJaWYgKGN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLmVuY0NiY3JXclBhdGhFbiAmJgotCQkJCWN0cmwtPmVuY1BhdGgubXVsdGlGcmFnKQotCQkJY3RybC0+dmZlSW1hc2tMb2NhbC5lbmNDYmNyUGluZ3BvbmdJcnEgPSBUUlVFOwotCi0JCWlmIChjdHJsLT52ZmVCdXNDb25maWdMb2NhbC52aWV3WVdyUGF0aEVuICYmCi0JCQkJY3RybC0+dmlld1BhdGgubXVsdGlGcmFnKQotCQkJY3RybC0+dmZlSW1hc2tMb2NhbC52aWV3WVBpbmdwb25nSXJxICAgPSBUUlVFOwotCi0JCWlmIChjdHJsLT52ZmVCdXNDb25maWdMb2NhbC52aWV3Q2JjcldyUGF0aEVuICYmCi0JCQkJY3RybC0+dmlld1BhdGgubXVsdGlGcmFnKQotCQkJY3RybC0+dmZlSW1hc2tMb2NhbC52aWV3Q2JjclBpbmdwb25nSXJxID0gVFJVRTsKLQl9IC8qIFZGRV9BWElfT1VUUFVUX01PREVfT3V0cHV0MSAqLwotCQlicmVhazsKLQotCWNhc2UgVkZFX0FYSV9PVVRQVVRfTU9ERV9PdXRwdXQyOiB7Ci0JCWN0cmwtPnZmZUNhbWlmQ29uZmlnTG9jYWwuY2FtaWYyQnVzRW5hYmxlICAgPSBGQUxTRTsKLQkJY3RybC0+dmZlQ2FtaWZDb25maWdMb2NhbC5jYW1pZjJPdXRwdXRFbmFibGUgPSBUUlVFOwotCQljdHJsLT52ZmVCdXNDb25maWdMb2NhbC5yYXdXcml0ZVBhdGhTZWxlY3QgID0KLQkJCVZGRV9SQVdfT1VUUFVUX0RJU0FCTEVEOwotCi0JCWN0cmwtPmVuY1BhdGgucGF0aEVuYWJsZWQgICAgICAgICAgICAgICAgICAgPSBUUlVFOwotCQljdHJsLT52ZmVJbWFza0xvY2FsLmVuY0lycSAgICAgICAgICAgICAgICAgID0gVFJVRTsKLQkJY3RybC0+dmZlSXJxQ29tcG9zaXRlTWFza0xvY2FsLmVuY0lycUNvbU1hc2sgPQotCQkJVkZFX0NPTVBfSVJRX0JPVEhfWV9DQkNSOwotCi0JCWN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLmVuY1lXclBhdGhFbiAgICAgICAgPSBUUlVFOwotCQljdHJsLT52ZmVCdXNDb25maWdMb2NhbC5lbmNDYmNyV3JQYXRoRW4gICAgID0gVFJVRTsKLQotCQljdHJsLT52aWV3UGF0aC5wYXRoRW5hYmxlZCAgICAgICAgICAgICAgICAgICA9IEZBTFNFOwotCQljdHJsLT52ZmVJbWFza0xvY2FsLnZpZXdJcnEgICAgICAgICAgICAgICAgICA9IEZBTFNFOwotCQljdHJsLT52ZmVJcnFDb21wb3NpdGVNYXNrTG9jYWwudmlld0lycUNvbU1hc2sgPQotCQkJVkZFX0NPTVBfSVJRX0JPVEhfWV9DQkNSOwotCi0JCWN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLnZpZXdZV3JQYXRoRW4gICAgICAgID0gRkFMU0U7Ci0JCWN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLnZpZXdDYmNyV3JQYXRoRW4gICAgID0gRkFMU0U7Ci0KLQkJaWYgKGN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLmVuY1lXclBhdGhFbiAmJgotCQkJCWN0cmwtPmVuY1BhdGgubXVsdGlGcmFnKQotCQkJY3RybC0+dmZlSW1hc2tMb2NhbC5lbmNZUGluZ3BvbmdJcnEgICAgPSBUUlVFOwotCi0JCWlmIChjdHJsLT52ZmVCdXNDb25maWdMb2NhbC5lbmNDYmNyV3JQYXRoRW4gJiYKLQkJCQljdHJsLT5lbmNQYXRoLm11bHRpRnJhZykKLQkJCWN0cmwtPnZmZUltYXNrTG9jYWwuZW5jQ2JjclBpbmdwb25nSXJxID0gVFJVRTsKLQotCQlpZiAoY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwudmlld1lXclBhdGhFbiAmJgotCQkJCWN0cmwtPnZpZXdQYXRoLm11bHRpRnJhZykKLQkJCWN0cmwtPnZmZUltYXNrTG9jYWwudmlld1lQaW5ncG9uZ0lycSAgID0gVFJVRTsKLQotCQlpZiAoY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwudmlld0NiY3JXclBhdGhFbiAmJgotCQkJCWN0cmwtPnZpZXdQYXRoLm11bHRpRnJhZykKLQkJCWN0cmwtPnZmZUltYXNrTG9jYWwudmlld0NiY3JQaW5ncG9uZ0lycSA9IFRSVUU7Ci0JfSAvKiBWRkVfQVhJX09VVFBVVF9NT0RFX091dHB1dDIgKi8KLQkJCWJyZWFrOwotCi0JY2FzZSBWRkVfQVhJX09VVFBVVF9NT0RFX091dHB1dDFBbmRPdXRwdXQyOiB7Ci0JCWN0cmwtPnZmZUNhbWlmQ29uZmlnTG9jYWwuY2FtaWYyQnVzRW5hYmxlICAgID0gRkFMU0U7Ci0JCWN0cmwtPnZmZUNhbWlmQ29uZmlnTG9jYWwuY2FtaWYyT3V0cHV0RW5hYmxlID0gVFJVRTsKLQkJY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwucmF3V3JpdGVQYXRoU2VsZWN0ICAgPQotCQkJVkZFX1JBV19PVVRQVVRfRElTQUJMRUQ7Ci0KLQkJY3RybC0+ZW5jUGF0aC5wYXRoRW5hYmxlZCAgICAgICAgICAgICAgICAgICAgPSBUUlVFOwotCQljdHJsLT52ZmVJbWFza0xvY2FsLmVuY0lycSAgICAgICAgICAgICAgICAgICA9IFRSVUU7Ci0JCWN0cmwtPnZmZUlycUNvbXBvc2l0ZU1hc2tMb2NhbC5lbmNJcnFDb21NYXNrID0KLQkJCVZGRV9DT01QX0lSUV9CT1RIX1lfQ0JDUjsKLQotCQljdHJsLT52ZmVCdXNDb25maWdMb2NhbC5lbmNZV3JQYXRoRW4gICAgICAgICA9IFRSVUU7Ci0JCWN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLmVuY0NiY3JXclBhdGhFbiAgICAgID0gVFJVRTsKLQkJY3RybC0+dmlld1BhdGgucGF0aEVuYWJsZWQgICAgICAgICAgICAgICAgICAgPSBUUlVFOwotCQljdHJsLT52ZmVJbWFza0xvY2FsLnZpZXdJcnEgICAgICAgICAgICAgICAgICA9IFRSVUU7Ci0JCWN0cmwtPnZmZUlycUNvbXBvc2l0ZU1hc2tMb2NhbC52aWV3SXJxQ29tTWFzayA9Ci0JCQlWRkVfQ09NUF9JUlFfQk9USF9ZX0NCQ1I7Ci0KLQkJY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwudmlld1lXclBhdGhFbiAgICAgICAgPSBUUlVFOwotCQljdHJsLT52ZmVCdXNDb25maWdMb2NhbC52aWV3Q2JjcldyUGF0aEVuICAgICA9IFRSVUU7Ci0KLQkJaWYgKGN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLmVuY1lXclBhdGhFbiAmJgotCQkJCWN0cmwtPmVuY1BhdGgubXVsdGlGcmFnKQotCQkJY3RybC0+dmZlSW1hc2tMb2NhbC5lbmNZUGluZ3BvbmdJcnEgICAgPSBUUlVFOwotCi0JCWlmIChjdHJsLT52ZmVCdXNDb25maWdMb2NhbC5lbmNDYmNyV3JQYXRoRW4gJiYKLQkJCQljdHJsLT5lbmNQYXRoLm11bHRpRnJhZykKLQkJCWN0cmwtPnZmZUltYXNrTG9jYWwuZW5jQ2JjclBpbmdwb25nSXJxID0gVFJVRTsKLQotCQlpZiAoY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwudmlld1lXclBhdGhFbiAmJgotCQkJCWN0cmwtPnZpZXdQYXRoLm11bHRpRnJhZykKLQkJCWN0cmwtPnZmZUltYXNrTG9jYWwudmlld1lQaW5ncG9uZ0lycSAgID0gVFJVRTsKLQotCQlpZiAoY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwudmlld0NiY3JXclBhdGhFbiAmJgotCQkJCWN0cmwtPnZpZXdQYXRoLm11bHRpRnJhZykKLQkJCWN0cmwtPnZmZUltYXNrTG9jYWwudmlld0NiY3JQaW5ncG9uZ0lycSA9IFRSVUU7Ci0JfSAvKiBWRkVfQVhJX09VVFBVVF9NT0RFX091dHB1dDFBbmRPdXRwdXQyICovCi0JCWJyZWFrOwotCi0JY2FzZSBWRkVfQVhJX09VVFBVVF9NT0RFX0NBTUlGVG9BWElWaWFPdXRwdXQyOiB7Ci0JCS8qIEZvciByYXcgc25hcHNob3QsIHdlIG5lZWQgYm90aCBwaW5nIGFuZCBwb25nIGJ1ZmZlcgotCQkgKiBpbml0aWFsaXplZCB0byB0aGUgc2FtZSBhZGRyZXNzLiBPdGhlcndpc2UsIGlmIHdlCi0JCSAqIGxlYXZlIHRoZSBwb25nIGJ1ZmZlciB0byBOVUxMLCB0aGVyZSB3aWxsIGJlIGF4aV9lcnJvci4KLQkJICogTm90ZSB0aGF0IGlkZWFsbHkgd2Ugc2hvdWxkIGRlYWwgd2l0aCB0aGlzIGF0IHVwcGVyIGxheWVyLAotCQkgKiB3aGljaCBpcyBpbiBtc21fdmZlOHguYyAqLwotCQlpZiAoIWluLT5vdXRwdXQyLm91dHB1dENiY3Iub3V0RnJhZ21lbnRzWzFdWzBdKSB7Ci0JCQlpbi0+b3V0cHV0Mi5vdXRwdXRDYmNyLm91dEZyYWdtZW50c1sxXVswXSA9Ci0JCQkJaW4tPm91dHB1dDIub3V0cHV0Q2Jjci5vdXRGcmFnbWVudHNbMF1bMF07Ci0JCX0KLQotCQljdHJsLT52ZmVDYW1pZkNvbmZpZ0xvY2FsLmNhbWlmMkJ1c0VuYWJsZSAgID0gVFJVRTsKLQkJY3RybC0+dmZlQ2FtaWZDb25maWdMb2NhbC5jYW1pZjJPdXRwdXRFbmFibGUgPSBGQUxTRTsKLQkJY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwucmF3V3JpdGVQYXRoU2VsZWN0ICA9Ci0JCQlWRkVfUkFXX09VVFBVVF9FTkNfQ0JDUl9QQVRIOwotCi0JCWN0cmwtPmVuY1BhdGgucGF0aEVuYWJsZWQgICAgICAgICAgICAgICAgICAgPSBUUlVFOwotCQljdHJsLT52ZmVJbWFza0xvY2FsLmVuY0lycSAgICAgICAgICAgICAgICAgID0gVFJVRTsKLQkJY3RybC0+dmZlSXJxQ29tcG9zaXRlTWFza0xvY2FsLmVuY0lycUNvbU1hc2sgPQotCQkJVkZFX0NPTVBfSVJRX0NCQ1JfT05MWTsKLQotCQljdHJsLT52ZmVCdXNDb25maWdMb2NhbC5lbmNZV3JQYXRoRW4gICAgICAgID0gRkFMU0U7Ci0JCWN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLmVuY0NiY3JXclBhdGhFbiAgICAgPSBUUlVFOwotCi0JCWN0cmwtPnZpZXdQYXRoLnBhdGhFbmFibGVkICAgICAgICAgICAgICAgICAgID0gRkFMU0U7Ci0JCWN0cmwtPnZmZUltYXNrTG9jYWwudmlld0lycSAgICAgICAgICAgICAgICAgID0gRkFMU0U7Ci0JCWN0cmwtPnZmZUlycUNvbXBvc2l0ZU1hc2tMb2NhbC52aWV3SXJxQ29tTWFzayA9Ci0JCQlWRkVfQ09NUF9JUlFfQk9USF9ZX0NCQ1I7Ci0KLQkJY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwudmlld1lXclBhdGhFbiAgICAgICAgPSBGQUxTRTsKLQkJY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwudmlld0NiY3JXclBhdGhFbiAgICAgPSBGQUxTRTsKLQotCQlpZiAoY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwuZW5jWVdyUGF0aEVuICYmCi0JCQkJY3RybC0+ZW5jUGF0aC5tdWx0aUZyYWcpCi0JCQljdHJsLT52ZmVJbWFza0xvY2FsLmVuY1lQaW5ncG9uZ0lycSAgICA9IFRSVUU7Ci0KLQkJaWYgKGN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLmVuY0NiY3JXclBhdGhFbiAmJgotCQkJCWN0cmwtPmVuY1BhdGgubXVsdGlGcmFnKQotCQkJY3RybC0+dmZlSW1hc2tMb2NhbC5lbmNDYmNyUGluZ3BvbmdJcnEgPSBUUlVFOwotCi0JCWlmIChjdHJsLT52ZmVCdXNDb25maWdMb2NhbC52aWV3WVdyUGF0aEVuICYmCi0JCQkJY3RybC0+dmlld1BhdGgubXVsdGlGcmFnKQotCQkJY3RybC0+dmZlSW1hc2tMb2NhbC52aWV3WVBpbmdwb25nSXJxICAgPSBUUlVFOwotCi0JCWlmIChjdHJsLT52ZmVCdXNDb25maWdMb2NhbC52aWV3Q2JjcldyUGF0aEVuICYmCi0JCQkJY3RybC0+dmlld1BhdGgubXVsdGlGcmFnKQotCQkJY3RybC0+dmZlSW1hc2tMb2NhbC52aWV3Q2JjclBpbmdwb25nSXJxID0gVFJVRTsKLQl9IC8qIFZGRV9BWElfT1VUUFVUX01PREVfQ0FNSUZUb0FYSVZpYU91dHB1dDIgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIFZGRV9BWElfT1VUUFVUX01PREVfT3V0cHV0MkFuZENBTUlGVG9BWElWaWFPdXRwdXQxOiB7Ci0JCWN0cmwtPnZmZUNhbWlmQ29uZmlnTG9jYWwuY2FtaWYyQnVzRW5hYmxlICAgPSBUUlVFOwotCQljdHJsLT52ZmVDYW1pZkNvbmZpZ0xvY2FsLmNhbWlmMk91dHB1dEVuYWJsZSA9IFRSVUU7Ci0JCWN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLnJhd1dyaXRlUGF0aFNlbGVjdCAgPQotCQkJVkZFX1JBV19PVVRQVVRfVklFV19DQkNSX1BBVEg7Ci0KLQkJY3RybC0+ZW5jUGF0aC5wYXRoRW5hYmxlZCAgICAgICAgICAgICAgICAgICA9IFRSVUU7Ci0JCWN0cmwtPnZmZUltYXNrTG9jYWwuZW5jSXJxICAgICAgICAgICAgICAgICAgPSBUUlVFOwotCQljdHJsLT52ZmVJcnFDb21wb3NpdGVNYXNrTG9jYWwuZW5jSXJxQ29tTWFzayA9Ci0JCQlWRkVfQ09NUF9JUlFfQk9USF9ZX0NCQ1I7Ci0KLQkJY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwuZW5jWVdyUGF0aEVuICAgICAgICA9IFRSVUU7Ci0JCWN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLmVuY0NiY3JXclBhdGhFbiAgICAgPSBUUlVFOwotCi0JCWN0cmwtPnZpZXdQYXRoLnBhdGhFbmFibGVkICAgICAgICAgICAgICAgICAgID0gVFJVRTsKLQkJY3RybC0+dmZlSW1hc2tMb2NhbC52aWV3SXJxICAgICAgICAgICAgICAgICAgPSBUUlVFOwotCQljdHJsLT52ZmVJcnFDb21wb3NpdGVNYXNrTG9jYWwudmlld0lycUNvbU1hc2sgPQotCQkJVkZFX0NPTVBfSVJRX0NCQ1JfT05MWTsKLQotCQljdHJsLT52ZmVCdXNDb25maWdMb2NhbC52aWV3WVdyUGF0aEVuICAgICAgICA9IEZBTFNFOwotCQljdHJsLT52ZmVCdXNDb25maWdMb2NhbC52aWV3Q2JjcldyUGF0aEVuICAgICA9IFRSVUU7Ci0KLQkJaWYgKGN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLmVuY1lXclBhdGhFbiAmJgotCQkJCWN0cmwtPmVuY1BhdGgubXVsdGlGcmFnKQotCQkJY3RybC0+dmZlSW1hc2tMb2NhbC5lbmNZUGluZ3BvbmdJcnEgICAgPSBUUlVFOwotCi0JCWlmIChjdHJsLT52ZmVCdXNDb25maWdMb2NhbC5lbmNDYmNyV3JQYXRoRW4gJiYKLQkJCQljdHJsLT5lbmNQYXRoLm11bHRpRnJhZykKLQkJCWN0cmwtPnZmZUltYXNrTG9jYWwuZW5jQ2JjclBpbmdwb25nSXJxID0gVFJVRTsKLQotCQlpZiAoY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwudmlld1lXclBhdGhFbiAmJgotCQkJCWN0cmwtPnZpZXdQYXRoLm11bHRpRnJhZykKLQkJCWN0cmwtPnZmZUltYXNrTG9jYWwudmlld1lQaW5ncG9uZ0lycSAgID0gVFJVRTsKLQotCQlpZiAoY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwudmlld0NiY3JXclBhdGhFbiAmJgotCQkJCWN0cmwtPnZpZXdQYXRoLm11bHRpRnJhZykKLQkJCWN0cmwtPnZmZUltYXNrTG9jYWwudmlld0NiY3JQaW5ncG9uZ0lycSA9IFRSVUU7Ci0JfSAvKiBWRkVfQVhJX09VVFBVVF9NT0RFX091dHB1dDJBbmRDQU1JRlRvQVhJVmlhT3V0cHV0MSAqLwotCQlicmVhazsKLQotCWNhc2UgVkZFX0FYSV9PVVRQVVRfTU9ERV9PdXRwdXQxQW5kQ0FNSUZUb0FYSVZpYU91dHB1dDI6IHsKLQkJY3RybC0+dmZlQ2FtaWZDb25maWdMb2NhbC5jYW1pZjJCdXNFbmFibGUgICA9IFRSVUU7Ci0JCWN0cmwtPnZmZUNhbWlmQ29uZmlnTG9jYWwuY2FtaWYyT3V0cHV0RW5hYmxlID0gVFJVRTsKLQkJY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwucmF3V3JpdGVQYXRoU2VsZWN0ICA9Ci0JCQlWRkVfUkFXX09VVFBVVF9FTkNfQ0JDUl9QQVRIOwotCi0JCWN0cmwtPmVuY1BhdGgucGF0aEVuYWJsZWQgICAgICAgICAgICAgICAgICAgICA9IFRSVUU7Ci0JCWN0cmwtPnZmZUltYXNrTG9jYWwuZW5jSXJxICAgICAgICAgICAgICAgICAgICA9IFRSVUU7Ci0JCWN0cmwtPnZmZUlycUNvbXBvc2l0ZU1hc2tMb2NhbC5lbmNJcnFDb21NYXNrICA9Ci0JCQlWRkVfQ09NUF9JUlFfQ0JDUl9PTkxZOwotCi0JCWN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLmVuY1lXclBhdGhFbiAgICAgICAgICA9IEZBTFNFOwotCQljdHJsLT52ZmVCdXNDb25maWdMb2NhbC5lbmNDYmNyV3JQYXRoRW4gICAgICAgPSBUUlVFOwotCi0JCWN0cmwtPnZpZXdQYXRoLnBhdGhFbmFibGVkICAgICAgICAgICAgICAgICAgICA9IFRSVUU7Ci0JCWN0cmwtPnZmZUltYXNrTG9jYWwudmlld0lycSAgICAgICAgICAgICAgICAgICA9IFRSVUU7Ci0KLQkJY3RybC0+dmZlSXJxQ29tcG9zaXRlTWFza0xvY2FsLnZpZXdJcnFDb21NYXNrID0KLQkJCVZGRV9DT01QX0lSUV9CT1RIX1lfQ0JDUjsKLQotCQljdHJsLT52ZmVCdXNDb25maWdMb2NhbC52aWV3WVdyUGF0aEVuICAgICAgICAgPSBUUlVFOwotCQljdHJsLT52ZmVCdXNDb25maWdMb2NhbC52aWV3Q2JjcldyUGF0aEVuICAgICAgPSBUUlVFOwotCi0JCWlmIChjdHJsLT52ZmVCdXNDb25maWdMb2NhbC5lbmNZV3JQYXRoRW4gJiYKLQkJCQljdHJsLT5lbmNQYXRoLm11bHRpRnJhZykKLQkJCWN0cmwtPnZmZUltYXNrTG9jYWwuZW5jWVBpbmdwb25nSXJxICAgICAgID0gVFJVRTsKLQotCQlpZiAoY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwuZW5jQ2JjcldyUGF0aEVuICYmCi0JCQkJY3RybC0+ZW5jUGF0aC5tdWx0aUZyYWcpCi0JCQljdHJsLT52ZmVJbWFza0xvY2FsLmVuY0NiY3JQaW5ncG9uZ0lycSAgICA9IFRSVUU7Ci0KLQkJaWYgKGN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLnZpZXdZV3JQYXRoRW4gJiYKLQkJCQljdHJsLT52aWV3UGF0aC5tdWx0aUZyYWcpCi0JCQljdHJsLT52ZmVJbWFza0xvY2FsLnZpZXdZUGluZ3BvbmdJcnEgICAgICA9IFRSVUU7Ci0KLQkJaWYgKGN0cmwtPnZmZUJ1c0NvbmZpZ0xvY2FsLnZpZXdDYmNyV3JQYXRoRW4gJiYKLQkJCQljdHJsLT52aWV3UGF0aC5tdWx0aUZyYWcpCi0JCQljdHJsLT52ZmVJbWFza0xvY2FsLnZpZXdDYmNyUGluZ3BvbmdJcnEgICA9IFRSVUU7Ci0JfSAvKiBWRkVfQVhJX09VVFBVVF9NT0RFX091dHB1dDFBbmRDQU1JRlRvQVhJVmlhT3V0cHV0MiAqLwotCQlicmVhazsKLQotCWNhc2UgVkZFX0FYSV9MQVNUX09VVFBVVF9NT0RFX0VOVU06Ci0JCWJyZWFrOwotCX0gLyogc3dpdGNoICovCi0KLQkvKiBTYXZlIHRoZSBhZGRyZXNzZXMgZm9yIGVhY2ggcGF0aC4gKi8KLQkvKiBvdXRwdXQyIHBhdGggKi8KLQlmY250ID0gY3RybC0+ZW5jUGF0aC5mcmFnQ291bnQ7Ci0KLQlwY2lyY2xlID0gY3RybC0+ZW5jUGF0aC55UGF0aC5hZGRyZXNzQnVmZmVyOwotCXBkZXN0ID0gY3RybC0+ZW5jUGF0aC5uZXh0RnJhbWVBZGRyQnVmOwotCi0JcHNyYyA9ICYoaW4tPm91dHB1dDIub3V0cHV0WS5vdXRGcmFnbWVudHNbMF1bMF0pOwotCWZvciAoaSA9IDA7IGkgPCBmY250OyBpKyspCi0JCSpwY2lyY2xlKysgPSAqcHNyYysrOwotCi0JcHNyYyA9ICYoaW4tPm91dHB1dDIub3V0cHV0WS5vdXRGcmFnbWVudHNbMV1bMF0pOwotCWZvciAoaSA9IDA7IGkgPCBmY250OyBpKyspCi0JCSpwY2lyY2xlKysgPSAqcHNyYysrOwotCi0JcHNyYyA9ICYoaW4tPm91dHB1dDIub3V0cHV0WS5vdXRGcmFnbWVudHNbMl1bMF0pOwotCWZvciAoaSA9IDA7IGkgPCBmY250OyBpKyspCi0JCSpwZGVzdCsrID0gKnBzcmMrKzsKLQotCXBjaXJjbGUgPSBjdHJsLT5lbmNQYXRoLmNiY3JQYXRoLmFkZHJlc3NCdWZmZXI7Ci0KLQlwc3JjID0gJihpbi0+b3V0cHV0Mi5vdXRwdXRDYmNyLm91dEZyYWdtZW50c1swXVswXSk7Ci0JZm9yIChpID0gMDsgaSA8IGZjbnQ7IGkrKykKLQkJKnBjaXJjbGUrKyA9ICpwc3JjKys7Ci0KLQlwc3JjID0gJihpbi0+b3V0cHV0Mi5vdXRwdXRDYmNyLm91dEZyYWdtZW50c1sxXVswXSk7Ci0JZm9yIChpID0gMDsgaSA8IGZjbnQ7IGkrKykKLQkJKnBjaXJjbGUrKyA9ICpwc3JjKys7Ci0KLQlwc3JjID0gJihpbi0+b3V0cHV0Mi5vdXRwdXRDYmNyLm91dEZyYWdtZW50c1syXVswXSk7Ci0JZm9yIChpID0gMDsgaSA8IGZjbnQ7IGkrKykKLQkJKnBkZXN0KysgPSAqcHNyYysrOwotCi0JdmZlX3NldF9idXNfcGlwb19hZGRyKCZjdHJsLT52aWV3UGF0aCwgJmN0cmwtPmVuY1BhdGgpOwotCi0JY3RybC0+ZW5jUGF0aC5hY2tQZW5kaW5nID0gRkFMU0U7Ci0JY3RybC0+ZW5jUGF0aC5jdXJyZW50RnJhbWUgPSBwaW5nOwotCWN0cmwtPmVuY1BhdGgud2hpY2hPdXRwdXRQYXRoID0gMTsKLQljdHJsLT5lbmNQYXRoLnlQYXRoLmZyYWdJbmRleCA9IDI7Ci0JY3RybC0+ZW5jUGF0aC5jYmNyUGF0aC5mcmFnSW5kZXggPSAyOwotCWN0cmwtPmVuY1BhdGgueVBhdGguaHdDdXJyZW50RmxhZyA9IHBpbmc7Ci0JY3RybC0+ZW5jUGF0aC5jYmNyUGF0aC5od0N1cnJlbnRGbGFnID0gcGluZzsKLQotCS8qIG91dHB1dDEgcGF0aCAqLwotCXBjaXJjbGUgPSBjdHJsLT52aWV3UGF0aC55UGF0aC5hZGRyZXNzQnVmZmVyOwotCXBkZXN0ID0gY3RybC0+dmlld1BhdGgubmV4dEZyYW1lQWRkckJ1ZjsKLQlmY250ID0gY3RybC0+dmlld1BhdGguZnJhZ0NvdW50OwotCi0JcHNyYyA9ICYoaW4tPm91dHB1dDEub3V0cHV0WS5vdXRGcmFnbWVudHNbMF1bMF0pOwotCWZvciAoaSA9IDA7IGkgPCBmY250OyBpKyspCi0JCSpwY2lyY2xlKysgPSAqcHNyYysrOwotCi0JcHNyYyA9ICYoaW4tPm91dHB1dDEub3V0cHV0WS5vdXRGcmFnbWVudHNbMV1bMF0pOwotCWZvciAoaSA9IDA7IGkgPCBmY250OyBpKyspCi0JCSpwY2lyY2xlKysgPSAqcHNyYysrOwotCi0JcHNyYyA9ICYoaW4tPm91dHB1dDEub3V0cHV0WS5vdXRGcmFnbWVudHNbMl1bMF0pOwotCWZvciAoaSA9IDA7IGkgPCBmY250OyBpKyspCi0JCSpwZGVzdCsrID0gKnBzcmMrKzsKLQotCXBjaXJjbGUgPSBjdHJsLT52aWV3UGF0aC5jYmNyUGF0aC5hZGRyZXNzQnVmZmVyOwotCi0JcHNyYyA9ICYoaW4tPm91dHB1dDEub3V0cHV0Q2Jjci5vdXRGcmFnbWVudHNbMF1bMF0pOwotCWZvciAoaSA9IDA7IGkgPCBmY250OyBpKyspCi0JCSpwY2lyY2xlKysgPSAqcHNyYysrOwotCi0JcHNyYyA9ICYoaW4tPm91dHB1dDEub3V0cHV0Q2Jjci5vdXRGcmFnbWVudHNbMV1bMF0pOwotCWZvciAoaSA9IDA7IGkgPCBmY250OyBpKyspCi0JCSpwY2lyY2xlKysgPSAqcHNyYysrOwotCi0JcHNyYyA9ICYoaW4tPm91dHB1dDEub3V0cHV0Q2Jjci5vdXRGcmFnbWVudHNbMl1bMF0pOwotCWZvciAoaSA9IDA7IGkgPCBmY250OyBpKyspCi0JCSpwZGVzdCsrID0gKnBzcmMrKzsKLQotCWN0cmwtPnZpZXdQYXRoLmFja1BlbmRpbmcgPSBGQUxTRTsKLQljdHJsLT52aWV3UGF0aC5jdXJyZW50RnJhbWUgPSBwaW5nOwotCWN0cmwtPnZpZXdQYXRoLndoaWNoT3V0cHV0UGF0aCA9IDA7Ci0JY3RybC0+dmlld1BhdGgueVBhdGguZnJhZ0luZGV4ID0gMjsKLQljdHJsLT52aWV3UGF0aC5jYmNyUGF0aC5mcmFnSW5kZXggPSAyOwotCWN0cmwtPnZpZXdQYXRoLnlQYXRoLmh3Q3VycmVudEZsYWcgPSBwaW5nOwotCWN0cmwtPnZpZXdQYXRoLmNiY3JQYXRoLmh3Q3VycmVudEZsYWcgPSBwaW5nOwotCi0JLyogY2FsbCB0byBwcm9ncmFtIHRoZSByZWdpc3RlcnMuICovCi0JdmZlX2F4aV9vdXRwdXQoaW4sICZjdHJsLT52aWV3UGF0aCwgJmN0cmwtPmVuY1BhdGgsIGF4aW91dHB3KTsKLX0KLQotdm9pZCB2ZmVfY2FtaWZfY29uZmlnKHN0cnVjdCB2ZmVfY21kX2NhbWlmX2NvbmZpZyAqaW4pCi17Ci0Jc3RydWN0IHZmZV9jYW1pZmNmZyBjbWQ7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQotCUNEQkcoImNhbWlmLmZyYW1lIHBpeGVsc1BlckxpbmUgPSAlZFxuIiwgaW4tPmZyYW1lLnBpeGVsc1BlckxpbmUpOwotCUNEQkcoImNhbWlmLmZyYW1lIGxpbmVzUGVyRnJhbWUgPSAlZFxuIiwgaW4tPmZyYW1lLmxpbmVzUGVyRnJhbWUpOwotCUNEQkcoImNhbWlmLndpbmRvdyBmaXJzdHBpeGVsID0gJWRcbiIsIGluLT53aW5kb3cuZmlyc3RwaXhlbCk7Ci0JQ0RCRygiY2FtaWYud2luZG93IGxhc3RwaXhlbCA9ICVkXG4iLCAgaW4tPndpbmRvdy5sYXN0cGl4ZWwpOwotCUNEQkcoImNhbWlmLndpbmRvdyBmaXJzdGxpbmUgPSAlZFxuIiwgIGluLT53aW5kb3cuZmlyc3RsaW5lKTsKLQlDREJHKCJjYW1pZi53aW5kb3cgbGFzdGxpbmUgPSAlZFxuIiwgICBpbi0+d2luZG93Lmxhc3RsaW5lKTsKLQotCS8qIGRldGVybWluZSBpZiBlcG9jaCBpbnRlcnJ1cHQgbmVlZHMgdG8gYmUgZW5hYmxlZC4gICovCi0JaWYgKChpbi0+ZXBvY2gxLmVuYWJsZSA9PSBUUlVFKSAmJgotCSAgICAoaW4tPmVwb2NoMS5saW5laW5kZXggPD0gaW4tPmZyYW1lLmxpbmVzUGVyRnJhbWUpKQotCQljdHJsLT52ZmVJbWFza0xvY2FsLmNhbWlmRXBvY2gxSXJxID0gMTsKLQotCWlmICgoaW4tPmVwb2NoMi5lbmFibGUgPT0gVFJVRSkgJiYKLQkgICAgKGluLT5lcG9jaDIubGluZWluZGV4IDw9IGluLT5mcmFtZS5saW5lc1BlckZyYW1lKSkgewotCQljdHJsLT52ZmVJbWFza0xvY2FsLmNhbWlmRXBvY2gySXJxID0gMTsKLQl9Ci0KLQkvKiAgc2F2ZSB0aGUgY29udGVudCB0byBwcm9ncmFtIENBTUlGX0NPTkZJRyBzZXBlcmF0ZWx5LiAqLwotCWN0cmwtPnZmZUNhbWlmQ29uZmlnTG9jYWwuY2FtaWZDZmdGcm9tQ21kID0gaW4tPmNhbWlmQ29uZmlnOwotCi0JLyogRUZTX0NvbmZpZyAqLwotCWNtZC5lZnNFbmRPZkxpbmUgICAgID0gaW4tPkVGUy5lZnNlbmRvZmxpbmU7Ci0JY21kLmVmc1N0YXJ0T2ZMaW5lICAgPSBpbi0+RUZTLmVmc3N0YXJ0b2ZsaW5lOwotCWNtZC5lZnNFbmRPZkZyYW1lICAgID0gaW4tPkVGUy5lZnNlbmRvZmZyYW1lOwotCWNtZC5lZnNTdGFydE9mRnJhbWUgID0gaW4tPkVGUy5lZnNzdGFydG9mZnJhbWU7Ci0KLQkvKiBGcmFtZSBDb25maWcgKi8KLQljbWQuZnJhbWVDb25maWdQaXhlbHNQZXJMaW5lID0gaW4tPmZyYW1lLnBpeGVsc1BlckxpbmU7Ci0JY21kLmZyYW1lQ29uZmlnTGluZXNQZXJGcmFtZSA9IGluLT5mcmFtZS5saW5lc1BlckZyYW1lOwotCi0JLyogV2luZG93IFdpZHRoIENvbmZpZyAqLwotCWNtZC53aW5kb3dXaWR0aENmZ0xhc3RQaXhlbCAgPSBpbi0+d2luZG93Lmxhc3RwaXhlbDsKLQljbWQud2luZG93V2lkdGhDZmdGaXJzdFBpeGVsID0gaW4tPndpbmRvdy5maXJzdHBpeGVsOwotCi0JLyogV2luZG93IEhlaWdodCBDb25maWcgKi8KLQljbWQud2luZG93SGVpZ2h0Q2ZnbGFzdExpbmUgICA9IGluLT53aW5kb3cubGFzdGxpbmU7Ci0JY21kLndpbmRvd0hlaWdodENmZ2ZpcnN0TGluZSAgPSBpbi0+d2luZG93LmZpcnN0bGluZTsKLQotCS8qIFN1YnNhbXBsZSAxIENvbmZpZyAqLwotCWNtZC5zdWJzYW1wbGUxQ2ZnUGl4ZWxTa2lwID0gaW4tPnN1YnNhbXBsZS5waXhlbHNraXBtYXNrOwotCWNtZC5zdWJzYW1wbGUxQ2ZnTGluZVNraXAgID0gaW4tPnN1YnNhbXBsZS5saW5lc2tpcG1hc2s7Ci0KLQkvKiBTdWJzYW1wbGUgMiBDb25maWcgKi8KLQljbWQuc3Vic2FtcGxlMkNmZ0ZyYW1lU2tpcCAgICAgID0gaW4tPnN1YnNhbXBsZS5mcmFtZXNraXA7Ci0JY21kLnN1YnNhbXBsZTJDZmdGcmFtZVNraXBNb2RlICA9IGluLT5zdWJzYW1wbGUuZnJhbWVza2lwbW9kZTsKLQljbWQuc3Vic2FtcGxlMkNmZ1BpeGVsU2tpcFdyYXAgID0gaW4tPnN1YnNhbXBsZS5waXhlbHNraXB3cmFwOwotCi0JLyogRXBvY2ggSW50ZXJydXB0ICovCi0JY21kLmVwb2NoMUxpbmUgPSBpbi0+ZXBvY2gxLmxpbmVpbmRleDsKLQljbWQuZXBvY2gyTGluZSA9IGluLT5lcG9jaDIubGluZWluZGV4OwotCi0JdmZlX3Byb2dfaHcoY3RybC0+dmZlYmFzZSArIENBTUlGX0VGU19DT05GSUcsCi0JCSh1aW50MzJfdCAqKSZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotdm9pZCB2ZmVfZm92X2Nyb3BfY29uZmlnKHN0cnVjdCB2ZmVfY21kX2Zvdl9jcm9wX2NvbmZpZyAqaW4pCi17Ci0Jc3RydWN0IHZmZV9mb3ZfY3JvcF9jZmcgY21kOwotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0KLQljdHJsLT52ZmVNb2R1bGVFbmFibGVMb2NhbC5jcm9wRW5hYmxlID0gaW4tPmVuYWJsZTsKLQotCS8qIEZPViBDb3JwLCBQYXJ0IDEgKi8KLQljbWQubGFzdFBpeGVsICA9IGluLT5sYXN0UGl4ZWw7Ci0JY21kLmZpcnN0UGl4ZWwgPSBpbi0+Zmlyc3RQaXhlbDsKLQotCS8qIEZPViBDb3JwLCBQYXJ0IDIgKi8KLQljbWQubGFzdExpbmUgICA9IGluLT5sYXN0TGluZTsKLQljbWQuZmlyc3RMaW5lICA9IGluLT5maXJzdExpbmU7Ci0KLQl2ZmVfcHJvZ19odyhjdHJsLT52ZmViYXNlICsgVkZFX0NST1BfV0lEVEhfQ0ZHLAotCQkodWludDMyX3QgKikmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXZvaWQgdmZlX2dldF9od192ZXJzaW9uKHN0cnVjdCB2ZmVfY21kX2h3X3ZlcnNpb24gKm91dCkKLXsKLQl1aW50MzJfdCB2ZmVId1ZlcnNpb25QYWNrZWQ7Ci0Jc3RydWN0IHZmZV9od192ZXIgdmVyOwotCi0JdmZlSHdWZXJzaW9uUGFja2VkID0gcmVhZGwoY3RybC0+dmZlYmFzZSArIFZGRV9IV19WRVJTSU9OKTsKLQotCXZlciA9ICooKHN0cnVjdCB2ZmVfaHdfdmVyICopJnZmZUh3VmVyc2lvblBhY2tlZCk7Ci0KLQlvdXQtPmNvcmVWZXJzaW9uICA9IHZlci5jb3JlVmVyc2lvbjsKLQlvdXQtPm1pbm9yVmVyc2lvbiA9IHZlci5taW5vclZlcnNpb247Ci0Jb3V0LT5tYWpvclZlcnNpb24gPSB2ZXIubWFqb3JWZXJzaW9uOwotfQotCi1zdGF0aWMgdm9pZCB2ZmVfcmVzZXRfaW50ZXJuYWxfdmFyaWFibGVzKHZvaWQpCi17Ci0JLyogbG9jYWwgdmFyaWFibGVzIHRvIHByb2dyYW0gdGhlIGhhcmR3YXJlLiAqLwotCWN0cmwtPnZmZUltYXNrUGFja2VkID0gMDsKLQljdHJsLT52ZmVJbWFza0NvbXBvc2l0ZVBhY2tlZCA9IDA7Ci0KLQkvKiBGQUxTRSA9IGRpc2FibGUsICAxID0gZW5hYmxlLiAqLwotCW1lbXNldCgmY3RybC0+dmZlTW9kdWxlRW5hYmxlTG9jYWwsIDAsCi0JCXNpemVvZihjdHJsLT52ZmVNb2R1bGVFbmFibGVMb2NhbCkpOwotCi0JLyogMCA9IGRpc2FibGUsIDEgPSBlbmFibGUgKi8KLQltZW1zZXQoJmN0cmwtPnZmZUNhbWlmQ29uZmlnTG9jYWwsIDAsCi0JCXNpemVvZihjdHJsLT52ZmVDYW1pZkNvbmZpZ0xvY2FsKSk7Ci0JLyogMCA9IGRpc2FibGUsIDEgPSBlbmFibGUgKi8KLQltZW1zZXQoJmN0cmwtPnZmZUltYXNrTG9jYWwsIDAsIHNpemVvZihjdHJsLT52ZmVJbWFza0xvY2FsKSk7Ci0JbWVtc2V0KCZjdHJsLT52ZmVTdGF0c0NtZExvY2FsLCAwLCBzaXplb2YoY3RybC0+dmZlU3RhdHNDbWRMb2NhbCkpOwotCW1lbXNldCgmY3RybC0+dmZlQnVzQ29uZmlnTG9jYWwsIDAsIHNpemVvZihjdHJsLT52ZmVCdXNDb25maWdMb2NhbCkpOwotCW1lbXNldCgmY3RybC0+dmZlQnVzUG1Db25maWdMb2NhbCwgMCwKLQkJc2l6ZW9mKGN0cmwtPnZmZUJ1c1BtQ29uZmlnTG9jYWwpKTsKLQltZW1zZXQoJmN0cmwtPnZmZUJ1c0NtZExvY2FsLCAwLCBzaXplb2YoY3RybC0+dmZlQnVzQ21kTG9jYWwpKTsKLQltZW1zZXQoJmN0cmwtPnZmZUludGVycnVwdE5hbWVMb2NhbCwgMCwKLQkJc2l6ZW9mKGN0cmwtPnZmZUludGVycnVwdE5hbWVMb2NhbCkpOwotCW1lbXNldCgmY3RybC0+dmZlRHJvcHBlZEZyYW1lQ291bnRzLCAwLAotCQlzaXplb2YoY3RybC0+dmZlRHJvcHBlZEZyYW1lQ291bnRzKSk7Ci0JbWVtc2V0KCZjdHJsLT52ZmVJcnFUaHJlYWRNc2dMb2NhbCwgMCwKLQkJc2l6ZW9mKGN0cmwtPnZmZUlycVRocmVhZE1zZ0xvY2FsKSk7Ci0KLQkvKiBzdGF0ZSBjb250cm9sIHZhcmlhYmxlcyAqLwotCWN0cmwtPnZmZVN0YXJ0QWNrUGVuZGluZ0ZsYWcgPSBGQUxTRTsKLQljdHJsLT52ZmVTdG9wQWNrUGVuZGluZyA9IEZBTFNFOwotCWN0cmwtPnZmZUlycUNvbXBvc2l0ZU1hc2tMb2NhbC5jZURvbmVTZWwgPSAwOwotCWN0cmwtPnZmZUlycUNvbXBvc2l0ZU1hc2tMb2NhbC5lbmNJcnFDb21NYXNrID0gVkZFX0NPTVBfSVJRX0JPVEhfWV9DQkNSOwotCWN0cmwtPnZmZUlycUNvbXBvc2l0ZU1hc2tMb2NhbC52aWV3SXJxQ29tTWFzayA9Ci0JCVZGRV9DT01QX0lSUV9CT1RIX1lfQ0JDUjsKLQotCWN0cmwtPnZzdGF0ZSA9IFZGRV9TVEFURV9JRExFOwotCi0JY3RybC0+YXhpT3V0cHV0TW9kZSA9IFZGRV9BWElfTEFTVF9PVVRQVVRfTU9ERV9FTlVNOwotCS8qIDAgZm9yIGNvbnRpbnVvdXMgbW9kZSwgMSBmb3Igc25hcHNob3QgbW9kZSAqLwotCWN0cmwtPnZmZU9wZXJhdGlvbk1vZGUgPSBWRkVfU1RBUlRfT1BFUkFUSU9OX01PREVfQ09OVElOVU9VUzsKLQljdHJsLT52ZmVTbmFwU2hvdENvdW50ID0gMDsKLQljdHJsLT52ZmVTdGF0c1BpbmdQb25nUmVsb2FkRmxhZyA9IEZBTFNFOwotCS8qIHRoaXMgaXMgdW5zaWduZWQgMzIgYml0IGludGVnZXIuICovCi0JY3RybC0+dmZlRnJhbWVJZCA9IDA7Ci0JY3RybC0+dmZlRnJhbWVTa2lwLm91dHB1dDFQYXR0ZXJuID0gMHhmZmZmZmZmZjsKLQljdHJsLT52ZmVGcmFtZVNraXAub3V0cHV0MVBlcmlvZCAgPSAzMTsKLQljdHJsLT52ZmVGcmFtZVNraXAub3V0cHV0MlBhdHRlcm4gPSAweGZmZmZmZmZmOwotCWN0cmwtPnZmZUZyYW1lU2tpcC5vdXRwdXQyUGVyaW9kICA9IDMxOwotCWN0cmwtPnZmZUZyYW1lU2tpcFBhdHRlcm4gPSAweGZmZmZmZmZmOwotCWN0cmwtPnZmZUZyYW1lU2tpcENvdW50ICAgPSAwOwotCWN0cmwtPnZmZUZyYW1lU2tpcFBlcmlvZCAgPSAzMTsKLQotCW1lbXNldCgodm9pZCAqKSZjdHJsLT5lbmNQYXRoLCAwLCBzaXplb2YoY3RybC0+ZW5jUGF0aCkpOwotCW1lbXNldCgodm9pZCAqKSZjdHJsLT52aWV3UGF0aCwgMCwgc2l6ZW9mKGN0cmwtPnZpZXdQYXRoKSk7Ci0KLQljdHJsLT5lbmNQYXRoLndoaWNoT3V0cHV0UGF0aCAgPSAxOwotCWN0cmwtPmVuY1BhdGguY2JjclN0YXR1c0JpdCAgICA9IDU7Ci0JY3RybC0+dmlld1BhdGgud2hpY2hPdXRwdXRQYXRoID0gMDsKLQljdHJsLT52aWV3UGF0aC5jYmNyU3RhdHVzQml0ICAgPSA3OwotCi0JY3RybC0+dmZlVGVzdEdlblN0YXJ0RmxhZyA9IEZBTFNFOwotCi0JLyogZGVmYXVsdCB0byBiYW5rIDAuICovCi0JY3RybC0+dmZlTGFCYW5rU2VsID0gMDsKLQotCS8qIGRlZmF1bHQgdG8gYmFuayAwIGZvciBhbGwgY2hhbm5lbHMuICovCi0JbWVtc2V0KCZjdHJsLT52ZmVHYW1tYUx1dFNlbCwgMCwgc2l6ZW9mKGN0cmwtPnZmZUdhbW1hTHV0U2VsKSk7Ci0KLQkvKiBTdGF0cyBjb250cm9sIHZhcmlhYmxlcy4gKi8KLQltZW1zZXQoJmN0cmwtPmFmU3RhdHNDb250cm9sLCAwLCBzaXplb2YoY3RybC0+YWZTdGF0c0NvbnRyb2wpKTsKLQltZW1zZXQoJmN0cmwtPmF3YlN0YXRzQ29udHJvbCwgMCwgc2l6ZW9mKGN0cmwtPmF3YlN0YXRzQ29udHJvbCkpOwotCXZmZV9zZXRfc3RhdHNfcGluZ3BvbmdfYWRkcmVzcygmY3RybC0+YWZTdGF0c0NvbnRyb2wsCi0JCSZjdHJsLT5hd2JTdGF0c0NvbnRyb2wpOwotfQotCi12b2lkIHZmZV9yZXNldCh2b2lkKQotewotCXNwaW5fbG9ja19pbml0KCZtc21fdmZlX2N0cmxfbG9jayk7Ci0JdmZlX3Jlc2V0X2ludGVybmFsX3ZhcmlhYmxlcygpOwotCi0JYXRvbWljX3NldCgmY3RybC0+dmZlX3NlcnZfaW50ZXJydXB0LCAxKTsKLQljdHJsLT52ZmVJbWFza0xvY2FsLnJlc2V0QWNrSXJxID0gVFJVRTsKLQljdHJsLT52ZmVJbWFza1BhY2tlZCA9IHZmZV9pcnFfcGFjayhjdHJsLT52ZmVJbWFza0xvY2FsKTsKLQotCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMuICovCi0Jd3JpdGVsKFZGRV9ESVNBQkxFX0FMTF9JUlFTLCBjdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DT01QT1NJVEVfTUFTSyk7Ci0KLQkvKiBjbGVhciBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzKi8KLQl3cml0ZWwoVkZFX0NMRUFSX0FMTF9JUlFTLCBjdHJsLT52ZmViYXNlICsgVkZFX0lSUV9DTEVBUik7Ci0KLQkvKiBlbmFibGUgcmVzZXRfYWNrIGludGVycnVwdC4gICovCi0Jd3JpdGVsKGN0cmwtPnZmZUltYXNrUGFja2VkLCBjdHJsLT52ZmViYXNlICsgVkZFX0lSUV9NQVNLKTsKLQotCXdyaXRlbChWRkVfUkVTRVRfVVBPTl9SRVNFVF9DTUQsIGN0cmwtPnZmZWJhc2UgKyBWRkVfR0xPQkFMX1JFU0VUX0NNRCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmU4eF9wcm9jLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmU4eF9wcm9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMThjN2MuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlOHhfcHJvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU2MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDksIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX19NU01fVkZFOFhfUkVHX0hfXwotI2RlZmluZSBfX01TTV9WRkU4WF9SRUdfSF9fCi0KLSNpbmNsdWRlIDxtYWNoL21zbV9pb21hcC5oPgotI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+Ci0jaW5jbHVkZSAibXNtX3ZmZTh4LmgiCi0KLQotI2RlZmluZSBNU01fQVhJX1FPU19QUkVWSUVXCQkxMjgwMDAKLSNkZWZpbmUgTVNNX0FYSV9RT1NfU05BUFNIT1QJMTI4MDAwCi0jZGVmaW5lIE1TTV9BWElfUU9TX1JFQ09SRElORwkxMjgwMDAKLQotCi0vKiBhdCBzdGFydCBvZiBjYW1pZiwgIGJpdCAxOjAgPSAweDAxOmVuYWJsZQotICogaW1hZ2UgZGF0YSBjYXB0dXJlIGF0IGZyYW1lIGJvdW5kYXJ5LiAqLwotI2RlZmluZSBDQU1JRl9DT01NQU5EX1NUQVJUICAweDAwMDAwMDA1Ci0KLS8qIGJpdCAyPSAweDE6Y2xlYXIgdGhlIENBTUlGX1NUQVRVUyByZWdpc3RlcgotICogdmFsdWUuICovCi0jZGVmaW5lIENBTUlGX0NPTU1BTkRfQ0xFQVIgIDB4MDAwMDAwMDQKLQotLyogYXQgc3RvcCBvZiB2ZmUgcGlwZWxpbmUsIGZvciBub3cgaXQgaXMgYXNzdW1lZAotICogdGhhdCBjYW1pZiB3aWxsIHN0b3AgYXQgYW55IHRpbWUuIEJpdCAxOjAgPSAweDEwOgotICogZGlzYWJsZSBpbWFnZSBkYXRhIGNhcHR1cmUgaW1tZWRpYXRlbHkuICovCi0jZGVmaW5lIENBTUlGX0NPTU1BTkRfU1RPUF9JTU1FRElBVEVMWSAgMHgwMDAwMDAwMgotCi0vKiBhdCBzdG9wIG9mIHZmZSBwaXBlbGluZSwgZm9yIG5vdyBpdCBpcyBhc3N1bWVkCi0gKiB0aGF0IGNhbWlmIHdpbGwgc3RvcCBhdCBhbnkgdGltZS4gQml0IDE6MCA9IDB4MDA6Ci0gKiBkaXNhYmxlIGltYWdlIGRhdGEgY2FwdHVyZSBhdCBmcmFtZSBib3VuZGFyeSAqLwotI2RlZmluZSBDQU1JRl9DT01NQU5EX1NUT1BfQVRfRlJBTUVfQk9VTkRBUlkgIDB4MDAwMDAwMDAKLQotLyogdG8gaGFsdCBheGkgYnJpZGdlICovCi0jZGVmaW5lIEFYSV9IQUxUICAweDAwMDAwMDAxCi0KLS8qIGNsZWFyIHRoZSBoYWx0IGJpdC4gKi8KLSNkZWZpbmUgQVhJX0hBTFRfQ0xFQVIgIDB4MDAwMDAwMDAKLQotLyogcmVzZXQgdGhlIHBpcGVsaW5lIHdoZW4gc3RvcCBjb21tYW5kIGlzIGlzc3VlZC4KLSAqICh3aXRob3V0IHJlc2V0IHRoZSByZWdpc3Rlci4pIGJpdCAyNi0zMSA9IDAsCi0gKiBkb21haW4gcmVzZXQsIGJpdCAwLTkgPSAxIGZvciBtb2R1bGUgcmVzZXQsIGV4Y2VwdAotICogcmVnaXN0ZXIgbW9kdWxlLiAqLwotI2RlZmluZSBWRkVfUkVTRVRfVVBPTl9TVE9QX0NNRCAgMHgwMDAwMDNlZgotCi0vKiByZXNldCB0aGUgcGlwZWxpbmUgd2hlbiByZXNldCBjb21tYW5kLgotICogYml0IDI2LTMxID0gMCwgZG9tYWluIHJlc2V0LCBiaXQgMC05ID0gMSBmb3IgbW9kdWxlIHJlc2V0LiAqLwotI2RlZmluZSBWRkVfUkVTRVRfVVBPTl9SRVNFVF9DTUQgIDB4MDAwMDAzZmYKLQotLyogYml0IDUgaXMgZm9yIGF4aSBzdGF0dXMgaWRsZSBvciBidXN5LgotICogMSA9ICBoYWx0ZWQsICAwID0gYnVzeSAqLwotI2RlZmluZSBBWElfU1RBVFVTX0JVU1lfTUFTSyAweDAwMDAwMDIwCi0KLS8qIGJpdCAwICYgYml0IDEgPSAxLCBib3RoIHkgYW5kIGNiY3IgaXJxcyBuZWVkIHRvIGJlIHByZXNlbnQKLSAqIGZvciBmcmFtZSBkb25lIGludGVycnVwdCAqLwotI2RlZmluZSBWRkVfQ09NUF9JUlFfQk9USF9ZX0NCQ1IgMwotCi0vKiBiaXQgMSA9IDEsIG9ubHkgY2JjciBpcnEgdHJpZ2dlcnMgZnJhbWUgZG9uZSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgVkZFX0NPTVBfSVJRX0NCQ1JfT05MWSAyCi0KLS8qIGJpdCAwID0gMSwgb25seSB5IGlycSB0cmlnZ2VycyBmcmFtZSBkb25lIGludGVycnVwdCAqLwotI2RlZmluZSBWRkVfQ09NUF9JUlFfWV9PTkxZIDEKLQotLyogYml0IDAgPSAxLCBQTSBnbzsgICBiaXQxID0gMSwgUE0gc3RvcCAqLwotI2RlZmluZSBWRkVfUEVSRk9STUFOQ0VfTU9OSVRPUl9HTyAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgVkZFX1BFUkZPUk1BTkNFX01PTklUT1JfU1RPUCAweDAwMDAwMDAyCi0KLS8qIGJpdCAwID0gMSwgdGVzdCBnZW4gZ287ICAgYml0MSA9IDEsIHRlc3QgZ2VuIHN0b3AgKi8KLSNkZWZpbmUgVkZFX1RFU1RfR0VOX0dPICAgMHgwMDAwMDAwMQotI2RlZmluZSBWRkVfVEVTVF9HRU5fU1RPUCAweDAwMDAwMDAyCi0KLS8qIHRoZSBjaHJvbWEgaXMgYXNzdW1lZCB0byBiZSBpbnRlcnBvbGF0ZWQgYmV0d2VlbgotICogdGhlIGx1bWEgc2FtcGxlcy4gIEpQRUcgNDoyOjIgKi8KLSNkZWZpbmUgVkZFX0NIUk9NQV9VUFNBTVBMRV9JTlRFUlBPTEFURUQgMAotCi0vKiBjb25zdGFudHMgZm9yIGlycSByZWdpc3RlcnMgKi8KLSNkZWZpbmUgVkZFX0RJU0FCTEVfQUxMX0lSUVMgMAotLyogYml0ID0xIGlzIHRvIGNsZWFyIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiBWRkVfSVJRX1NUQVRVUy4gICovCi0jZGVmaW5lIFZGRV9DTEVBUl9BTExfSVJRUyAgIDB4ZmZmZmZmZmYKLS8qIGltYXNrIGZvciB3aGlsZSB3YWl0aW5nIGZvciBzdG9wIGFjaywgIGRyaXZlciBoYXMgYWxyZWFkeQotICogcmVxdWVzdGVkIHN0b3AsIHdhaXRpbmcgZm9yIHJlc2V0IGlycSwKLSAqIGJpdCAyOSwyOCwyNywyNiBmb3IgYXN5bmMgdGltZXIsIGJpdCA5IGZvciByZXNldCAqLwotI2RlZmluZSBWRkVfSU1BU0tfV0hJTEVfU1RPUFBJTkcgIDB4M2MwMDAyMDAKLQotLyogd2hlbiBub3JtYWwgY2FzZSwgZG9uJ3Qgd2FudCB0byBibG9jayBlcnJvciBzdGF0dXMuCi0gKiBiaXQgMCw2LDIwLDIxLDIyLDMwLDMxICovCi0jZGVmaW5lIFZGRV9JTUFTS19FUlJPUl9PTkxZICAgICAgICAgICAgIDB4QzA3MDAwNDEKLSNkZWZpbmUgVkZFX1JFR19VUERBVEVfVFJJR0dFUiAgICAgICAgICAgMQotI2RlZmluZSBWRkVfUE1fQlVGX01BWF9DTlRfTUFTSyAgICAgICAgICAweEZGCi0jZGVmaW5lIFZGRV9ETUlfQ0ZHX0RFRkFVTFQgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgTEVOU19ST0xMX09GRl9ERUxUQV9UQUJMRV9PRkZTRVQgMzIKLSNkZWZpbmUgVkZFX0FGX1BJTkdQT05HX1NUQVRVU19CSVQgICAgICAgMHgxMDAKLSNkZWZpbmUgVkZFX0FXQl9QSU5HUE9OR19TVEFUVVNfQklUICAgICAgMHgyMDAKLQotLyogVkZFIEkvTyByZWdpc3RlcnMgKi8KLWVudW0gewotCVZGRV9IV19WRVJTSU9OICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCi0JVkZFX0dMT0JBTF9SRVNFVF9DTUQgICAgICAgICAgICAgID0gMHgwMDAwMDAwNCwKLQlWRkVfTU9EVUxFX1JFU0VUICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA4LAotCVZGRV9DR0NfT1ZFUlJJREUgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMEMsCi0JVkZFX01PRFVMRV9DRkcgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAxMCwKLQlWRkVfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDE0LAotCVZGRV9JUlFfTUFTSyAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMTgsCi0JVkZFX0lSUV9DTEVBUiAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAxQywKLVZGRV9JUlFfU1RBVFVTICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMjAsCi1WRkVfSVJRX0NPTVBPU0lURV9NQVNLICAgICAgICAgICAgPSAweDAwMDAwMDI0LAotVkZFX0JVU19DTUQgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAyOCwKLVZGRV9CVVNfQ0ZHICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMkMsCi1WRkVfQlVTX0VOQ19ZX1dSX1BJTkdfQUREUiAgICAgICAgPSAweDAwMDAwMDMwLAotVkZFX0JVU19FTkNfWV9XUl9QT05HX0FERFIgICAgICAgID0gMHgwMDAwMDAzNCwKLVZGRV9CVVNfRU5DX1lfV1JfSU1BR0VfU0laRSAgICAgICA9IDB4MDAwMDAwMzgsCi1WRkVfQlVTX0VOQ19ZX1dSX0JVRkZFUl9DRkcgICAgICAgPSAweDAwMDAwMDNDLAotVkZFX0JVU19FTkNfQ0JDUl9XUl9QSU5HX0FERFIgICAgID0gMHgwMDAwMDA0MCwKLVZGRV9CVVNfRU5DX0NCQ1JfV1JfUE9OR19BRERSICAgICA9IDB4MDAwMDAwNDQsCi1WRkVfQlVTX0VOQ19DQkNSX1dSX0lNQUdFX1NJWkUgICAgPSAweDAwMDAwMDQ4LAotVkZFX0JVU19FTkNfQ0JDUl9XUl9CVUZGRVJfQ0ZHICAgID0gMHgwMDAwMDA0QywKLVZGRV9CVVNfVklFV19ZX1dSX1BJTkdfQUREUiAgICAgICA9IDB4MDAwMDAwNTAsCi1WRkVfQlVTX1ZJRVdfWV9XUl9QT05HX0FERFIgICAgICAgPSAweDAwMDAwMDU0LAotVkZFX0JVU19WSUVXX1lfV1JfSU1BR0VfU0laRSAgICAgID0gMHgwMDAwMDA1OCwKLVZGRV9CVVNfVklFV19ZX1dSX0JVRkZFUl9DRkcgICAgICA9IDB4MDAwMDAwNUMsCi1WRkVfQlVTX1ZJRVdfQ0JDUl9XUl9QSU5HX0FERFIgICAgPSAweDAwMDAwMDYwLAotVkZFX0JVU19WSUVXX0NCQ1JfV1JfUE9OR19BRERSICAgID0gMHgwMDAwMDA2NCwKLVZGRV9CVVNfVklFV19DQkNSX1dSX0lNQUdFX1NJWkUgICA9IDB4MDAwMDAwNjgsCi1WRkVfQlVTX1ZJRVdfQ0JDUl9XUl9CVUZGRVJfQ0ZHICAgPSAweDAwMDAwMDZDLAotVkZFX0JVU19TVEFUU19BRl9XUl9QSU5HX0FERFIgICAgID0gMHgwMDAwMDA3MCwKLVZGRV9CVVNfU1RBVFNfQUZfV1JfUE9OR19BRERSICAgICA9IDB4MDAwMDAwNzQsCi1WRkVfQlVTX1NUQVRTX0FXQl9XUl9QSU5HX0FERFIgICAgPSAweDAwMDAwMDc4LAotVkZFX0JVU19TVEFUU19BV0JfV1JfUE9OR19BRERSICAgID0gMHgwMDAwMDA3QywKLVZGRV9CVVNfU1RBVFNfSElTVF9XUl9QSU5HX0FERFIgICA9IDB4MDAwMDAwODAsCi1WRkVfQlVTX1NUQVRTX0hJU1RfV1JfUE9OR19BRERSICAgPSAweDAwMDAwMDg0LAotVkZFX0JVU19TVEFUU19XUl9QUklPUklUWSAgICAgICAgID0gMHgwMDAwMDA4OCwKLVZGRV9CVVNfU1RSSVBFX1JEX0FERFJfMCAgICAgICAgICA9IDB4MDAwMDAwOEMsCi1WRkVfQlVTX1NUUklQRV9SRF9BRERSXzEgICAgICAgICAgPSAweDAwMDAwMDkwLAotVkZFX0JVU19TVFJJUEVfUkRfQUREUl8yICAgICAgICAgID0gMHgwMDAwMDA5NCwKLVZGRV9CVVNfU1RSSVBFX1JEX0FERFJfMyAgICAgICAgICA9IDB4MDAwMDAwOTgsCi1WRkVfQlVTX1NUUklQRV9SRF9WU0laRSAgICAgICAgICAgPSAweDAwMDAwMDlDLAotVkZFX0JVU19TVFJJUEVfUkRfSFNJWkUgICAgICAgICAgID0gMHgwMDAwMDBBMCwKLVZGRV9CVVNfU1RSSVBFX1JEX0JVRkZFUl9DRkcgICAgICA9IDB4MDAwMDAwQTQsCi1WRkVfQlVTX1NUUklQRV9SRF9VTlBBQ0tfQ0ZHICAgICAgPSAweDAwMDAwMEE4LAotVkZFX0JVU19TVFJJUEVfUkRfVU5QQUNLICAgICAgICAgID0gMHgwMDAwMDBBQywKLVZGRV9CVVNfU1RSSVBFX1JEX1BBRF9TSVpFICAgICAgICA9IDB4MDAwMDAwQjAsCi1WRkVfQlVTX1NUUklQRV9SRF9QQURfTF9VTlBBQ0sgICAgPSAweDAwMDAwMEI0LAotVkZFX0JVU19TVFJJUEVfUkRfUEFEX1JfVU5QQUNLICAgID0gMHgwMDAwMDBCOCwKLVZGRV9CVVNfU1RSSVBFX1JEX1BBRF9UQl9VTlBBQ0sgICA9IDB4MDAwMDAwQkMsCi1WRkVfQlVTX1BJTkdQT05HX0lSUV9FTiAgICAgICAgICAgPSAweDAwMDAwMEMwLAotVkZFX0JVU19QSU5HUE9OR19TVEFUVVMgICAgICAgICAgID0gMHgwMDAwMDBDNCwKLVZGRV9CVVNfUE1fQ01EICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwQzgsCi1WRkVfQlVTX1BNX0NGRyAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMENDLAotVkZFX0JVU19FTkNfWV9XUl9QTV9TVEFUU18wICAgICAgID0gMHgwMDAwMDBEMCwKLVZGRV9CVVNfRU5DX1lfV1JfUE1fU1RBVFNfMSAgICAgICA9IDB4MDAwMDAwRDQsCi1WRkVfQlVTX0VOQ19DQkNSX1dSX1BNX1NUQVRTXzAgICAgPSAweDAwMDAwMEQ4LAotVkZFX0JVU19FTkNfQ0JDUl9XUl9QTV9TVEFUU18xICAgID0gMHgwMDAwMDBEQywKLVZGRV9CVVNfVklFV19ZX1dSX1BNX1NUQVRTXzAgICAgICA9IDB4MDAwMDAwRTAsCi1WRkVfQlVTX1ZJRVdfWV9XUl9QTV9TVEFUU18xICAgICAgPSAweDAwMDAwMEU0LAotVkZFX0JVU19WSUVXX0NCQ1JfV1JfUE1fU1RBVFNfMCAgID0gMHgwMDAwMDBFOCwKLVZGRV9CVVNfVklFV19DQkNSX1dSX1BNX1NUQVRTXzEgICA9IDB4MDAwMDAwRUMsCi1WRkVfQlVTX01JU1JfQ0ZHICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMEY0LAotVkZFX0JVU19NSVNSX01BU1RfQ0ZHXzAgICAgICAgICAgID0gMHgwMDAwMDBGOCwKLVZGRV9CVVNfTUlTUl9NQVNUX0NGR18xICAgICAgICAgICA9IDB4MDAwMDAwRkMsCi1WRkVfQlVTX01JU1JfUkRfVkFMICAgICAgICAgICAgICAgPSAweDAwMDAwMTAwLAotVkZFX0FYSV9DTUQgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDEwNCwKLVZGRV9BWElfQ0ZHICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAxMDgsCi1WRkVfQVhJX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMTBDLAotQ0FNSUZfQ09NTUFORCAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDExMCwKLUNBTUlGX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAxMTQsCi1DQU1JRl9FRlNfQ09ORklHICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMTE4LAotQ0FNSUZfRlJBTUVfQ09ORklHICAgICAgICAgICAgICAgID0gMHgwMDAwMDExQywKLUNBTUlGX1dJTkRPV19XSURUSF9DT05GSUcgICAgICAgICA9IDB4MDAwMDAxMjAsCi1DQU1JRl9XSU5ET1dfSEVJR0hUX0NPTkZJRyAgICAgICAgPSAweDAwMDAwMTI0LAotQ0FNSUZfU1VCU0FNUExFMV9DT05GSUcgICAgICAgICAgID0gMHgwMDAwMDEyOCwKLUNBTUlGX1NVQlNBTVBMRTJfQ09ORklHICAgICAgICAgICA9IDB4MDAwMDAxMkMsCi1DQU1JRl9FUE9DSF9JUlEgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMTMwLAotQ0FNSUZfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDEzNCwKLUNBTUlGX01JU1IgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAxMzgsCi1WRkVfU1lOQ19USU1FUl9DTUQgICAgICAgICAgICAgICAgPSAweDAwMDAwMTNDLAotVkZFX1NZTkNfVElNRVIwX0xJTkVfU1RBUlQgICAgICAgID0gMHgwMDAwMDE0MCwKLVZGRV9TWU5DX1RJTUVSMF9QSVhFTF9TVEFSVCAgICAgICA9IDB4MDAwMDAxNDQsCi1WRkVfU1lOQ19USU1FUjBfUElYRUxfRFVSQVRJT04gICAgPSAweDAwMDAwMTQ4LAotVkZFX1NZTkNfVElNRVIxX0xJTkVfU1RBUlQgICAgICAgID0gMHgwMDAwMDE0QywKLVZGRV9TWU5DX1RJTUVSMV9QSVhFTF9TVEFSVCAgICAgICA9IDB4MDAwMDAxNTAsCi1WRkVfU1lOQ19USU1FUjFfUElYRUxfRFVSQVRJT04gICAgPSAweDAwMDAwMTU0LAotVkZFX1NZTkNfVElNRVIyX0xJTkVfU1RBUlQgICAgICAgID0gMHgwMDAwMDE1OCwKLVZGRV9TWU5DX1RJTUVSMl9QSVhFTF9TVEFSVCAgICAgICA9IDB4MDAwMDAxNUMsCi1WRkVfU1lOQ19USU1FUjJfUElYRUxfRFVSQVRJT04gICAgPSAweDAwMDAwMTYwLAotVkZFX1NZTkNfVElNRVJfUE9MQVJJVFkgICAgICAgICAgID0gMHgwMDAwMDE2NCwKLVZGRV9BU1lOQ19USU1FUl9DTUQgICAgICAgICAgICAgICA9IDB4MDAwMDAxNjgsCi1WRkVfQVNZTkNfVElNRVIwX0NGR18wICAgICAgICAgICAgPSAweDAwMDAwMTZDLAotVkZFX0FTWU5DX1RJTUVSMF9DRkdfMSAgICAgICAgICAgID0gMHgwMDAwMDE3MCwKLVZGRV9BU1lOQ19USU1FUjFfQ0ZHXzAgICAgICAgICAgICA9IDB4MDAwMDAxNzQsCi1WRkVfQVNZTkNfVElNRVIxX0NGR18xICAgICAgICAgICAgPSAweDAwMDAwMTc4LAotVkZFX0FTWU5DX1RJTUVSMl9DRkdfMCAgICAgICAgICAgID0gMHgwMDAwMDE3QywKLVZGRV9BU1lOQ19USU1FUjJfQ0ZHXzEgICAgICAgICAgICA9IDB4MDAwMDAxODAsCi1WRkVfQVNZTkNfVElNRVIzX0NGR18wICAgICAgICAgICAgPSAweDAwMDAwMTg0LAotVkZFX0FTWU5DX1RJTUVSM19DRkdfMSAgICAgICAgICAgID0gMHgwMDAwMDE4OCwKLVZGRV9USU1FUl9TRUwgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAxOEMsCi1WRkVfUkVHX1VQREFURV9DTUQgICAgICAgICAgICAgICAgPSAweDAwMDAwMTkwLAotVkZFX0JMQUNLX0VWRU5fRVZFTl9WQUxVRSAgICAgICAgID0gMHgwMDAwMDE5NCwKLVZGRV9CTEFDS19FVkVOX09ERF9WQUxVRSAgICAgICAgICA9IDB4MDAwMDAxOTgsCi1WRkVfQkxBQ0tfT0REX0VWRU5fVkFMVUUgICAgICAgICAgPSAweDAwMDAwMTlDLAotVkZFX0JMQUNLX09ERF9PRERfVkFMVUUgICAgICAgICAgID0gMHgwMDAwMDFBMCwKLVZGRV9ST0xMT0ZGX0NGR18wICAgICAgICAgICAgICAgICA9IDB4MDAwMDAxQTQsCi1WRkVfUk9MTE9GRl9DRkdfMSAgICAgICAgICAgICAgICAgPSAweDAwMDAwMUE4LAotVkZFX1JPTExPRkZfQ0ZHXzIgICAgICAgICAgICAgICAgID0gMHgwMDAwMDFBQywKLVZGRV9ERU1VWF9DRkcgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAxQjAsCi1WRkVfREVNVVhfR0FJTl8wICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMUI0LAotVkZFX0RFTVVYX0dBSU5fMSAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDFCOCwKLVZGRV9ERU1VWF9FVkVOX0NGRyAgICAgICAgICAgICAgICA9IDB4MDAwMDAxQkMsCi1WRkVfREVNVVhfT0REX0NGRyAgICAgICAgICAgICAgICAgPSAweDAwMDAwMUMwLAotVkZFX0RFTU9TQUlDX0NGRyAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDFDNCwKLVZGRV9ERU1PU0FJQ19BQkZfQ0ZHXzAgICAgICAgICAgICA9IDB4MDAwMDAxQzgsCi1WRkVfREVNT1NBSUNfQUJGX0NGR18xICAgICAgICAgICAgPSAweDAwMDAwMUNDLAotVkZFX0RFTU9TQUlDX0JQQ19DRkdfMCAgICAgICAgICAgID0gMHgwMDAwMDFEMCwKLVZGRV9ERU1PU0FJQ19CUENfQ0ZHXzEgICAgICAgICAgICA9IDB4MDAwMDAxRDQsCi1WRkVfREVNT1NBSUNfU1RBVFVTICAgICAgICAgICAgICAgPSAweDAwMDAwMUQ4LAotVkZFX0NIUk9NQV9VUFNBTVBMRV9DRkcgICAgICAgICAgID0gMHgwMDAwMDFEQywKLVZGRV9DUk9QX1dJRFRIX0NGRyAgICAgICAgICAgICAgICA9IDB4MDAwMDAxRTAsCi1WRkVfQ1JPUF9IRUlHSFRfQ0ZHICAgICAgICAgICAgICAgPSAweDAwMDAwMUU0LAotVkZFX0NPTE9SX0NPUlJFQ1RfQ09FRkZfMCAgICAgICAgID0gMHgwMDAwMDFFOCwKLVZGRV9DT0xPUl9DT1JSRUNUX0NPRUZGXzEgICAgICAgICA9IDB4MDAwMDAxRUMsCi1WRkVfQ09MT1JfQ09SUkVDVF9DT0VGRl8yICAgICAgICAgPSAweDAwMDAwMUYwLAotVkZFX0NPTE9SX0NPUlJFQ1RfQ09FRkZfMyAgICAgICAgID0gMHgwMDAwMDFGNCwKLVZGRV9DT0xPUl9DT1JSRUNUX0NPRUZGXzQgICAgICAgICA9IDB4MDAwMDAxRjgsCi1WRkVfQ09MT1JfQ09SUkVDVF9DT0VGRl81ICAgICAgICAgPSAweDAwMDAwMUZDLAotVkZFX0NPTE9SX0NPUlJFQ1RfQ09FRkZfNiAgICAgICAgID0gMHgwMDAwMDIwMCwKLVZGRV9DT0xPUl9DT1JSRUNUX0NPRUZGXzcgICAgICAgICA9IDB4MDAwMDAyMDQsCi1WRkVfQ09MT1JfQ09SUkVDVF9DT0VGRl84ICAgICAgICAgPSAweDAwMDAwMjA4LAotVkZFX0NPTE9SX0NPUlJFQ1RfT0ZGU0VUXzAgICAgICAgID0gMHgwMDAwMDIwQywKLVZGRV9DT0xPUl9DT1JSRUNUX09GRlNFVF8xICAgICAgICA9IDB4MDAwMDAyMTAsCi1WRkVfQ09MT1JfQ09SUkVDVF9PRkZTRVRfMiAgICAgICAgPSAweDAwMDAwMjE0LAotVkZFX0NPTE9SX0NPUlJFQ1RfQ09FRkZfUSAgICAgICAgID0gMHgwMDAwMDIxOCwKLVZGRV9MQV9DRkcgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAyMUMsCi1WRkVfTFVUX0JBTktfU0VMICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMjIwLAotVkZFX0NIUk9NQV9FTkhBTl9BICAgICAgICAgICAgICAgID0gMHgwMDAwMDIyNCwKLVZGRV9DSFJPTUFfRU5IQU5fQiAgICAgICAgICAgICAgICA9IDB4MDAwMDAyMjgsCi1WRkVfQ0hST01BX0VOSEFOX0MgICAgICAgICAgICAgICAgPSAweDAwMDAwMjJDLAotVkZFX0NIUk9NQV9FTkhBTl9EICAgICAgICAgICAgICAgID0gMHgwMDAwMDIzMCwKLVZGRV9DSFJPTUFfRU5IQU5fSyAgICAgICAgICAgICAgICA9IDB4MDAwMDAyMzQsCi1WRkVfQ09MT1JfQ09OVkVSVF9DT0VGRl8wICAgICAgICAgPSAweDAwMDAwMjM4LAotVkZFX0NPTE9SX0NPTlZFUlRfQ09FRkZfMSAgICAgICAgID0gMHgwMDAwMDIzQywKLVZGRV9DT0xPUl9DT05WRVJUX0NPRUZGXzIgICAgICAgICA9IDB4MDAwMDAyNDAsCi1WRkVfQ09MT1JfQ09OVkVSVF9PRkZTRVQgICAgICAgICAgPSAweDAwMDAwMjQ0LAotVkZFX0FTRl9DRkcgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDI0OCwKLVZGRV9BU0ZfU0hBUlBfQ0ZHXzAgICAgICAgICAgICAgICA9IDB4MDAwMDAyNEMsCi1WRkVfQVNGX1NIQVJQX0NGR18xICAgICAgICAgICAgICAgPSAweDAwMDAwMjUwLAotVkZFX0FTRl9TSEFSUF9DT0VGRl8wICAgICAgICAgICAgID0gMHgwMDAwMDI1NCwKLVZGRV9BU0ZfU0hBUlBfQ09FRkZfMSAgICAgICAgICAgICA9IDB4MDAwMDAyNTgsCi1WRkVfQVNGX1NIQVJQX0NPRUZGXzIgICAgICAgICAgICAgPSAweDAwMDAwMjVDLAotVkZFX0FTRl9TSEFSUF9DT0VGRl8zICAgICAgICAgICAgID0gMHgwMDAwMDI2MCwKLVZGRV9BU0ZfTUFYX0VER0UgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAyNjQsCi1WRkVfQVNGX0NST1BfV0lEVEhfQ0ZHICAgICAgICAgICAgPSAweDAwMDAwMjY4LAotVkZFX0FTRl9DUk9QX0hFSUdIVF9DRkcgICAgICAgICAgID0gMHgwMDAwMDI2QywKLVZGRV9TQ0FMRV9DRkcgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAyNzAsCi1WRkVfU0NBTEVfSF9JTUFHRV9TSVpFX0NGRyAgICAgICAgPSAweDAwMDAwMjc0LAotVkZFX1NDQUxFX0hfUEhBU0VfQ0ZHICAgICAgICAgICAgID0gMHgwMDAwMDI3OCwKLVZGRV9TQ0FMRV9IX1NUUklQRV9DRkcgICAgICAgICAgICA9IDB4MDAwMDAyN0MsCi1WRkVfU0NBTEVfVl9JTUFHRV9TSVpFX0NGRyAgICAgICAgPSAweDAwMDAwMjgwLAotVkZFX1NDQUxFX1ZfUEhBU0VfQ0ZHICAgICAgICAgICAgID0gMHgwMDAwMDI4NCwKLVZGRV9TQ0FMRV9WX1NUUklQRV9DRkcgICAgICAgICAgICA9IDB4MDAwMDAyODgsCi1WRkVfU0NBTEVfWV9DRkcgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMjhDLAotVkZFX1NDQUxFX1lfSF9JTUFHRV9TSVpFX0NGRyAgICAgID0gMHgwMDAwMDI5MCwKLVZGRV9TQ0FMRV9ZX0hfUEhBU0VfQ0ZHICAgICAgICAgICA9IDB4MDAwMDAyOTQsCi1WRkVfU0NBTEVfWV9WX0lNQUdFX1NJWkVfQ0ZHICAgICAgPSAweDAwMDAwMjk4LAotVkZFX1NDQUxFX1lfVl9QSEFTRV9DRkcgICAgICAgICAgID0gMHgwMDAwMDI5QywKLVZGRV9TQ0FMRV9DQkNSX0NGRyAgICAgICAgICAgICAgICA9IDB4MDAwMDAyQTAsCi1WRkVfU0NBTEVfQ0JDUl9IX0lNQUdFX1NJWkVfQ0ZHICAgPSAweDAwMDAwMkE0LAotVkZFX1NDQUxFX0NCQ1JfSF9QSEFTRV9DRkcgICAgICAgID0gMHgwMDAwMDJBOCwKLVZGRV9TQ0FMRV9DQkNSX1ZfSU1BR0VfU0laRV9DRkcgICA9IDB4MDAwMDAyQUMsCi1WRkVfU0NBTEVfQ0JDUl9WX1BIQVNFX0NGRyAgICAgICAgPSAweDAwMDAwMkIwLAotVkZFX1dCX0NGRyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDJCNCwKLVZGRV9DSFJPTUFfU1VQUFJFU1NfQ0ZHXzAgICAgICAgICA9IDB4MDAwMDAyQjgsCi1WRkVfQ0hST01BX1NVUFBSRVNTX0NGR18xICAgICAgICAgPSAweDAwMDAwMkJDLAotVkZFX0NIUk9NQV9TVUJTQU1QTEVfQ0ZHICAgICAgICAgID0gMHgwMDAwMDJDMCwKLVZGRV9DSFJPTUFfU1VCX0NST1BfV0lEVEhfQ0ZHICAgICA9IDB4MDAwMDAyQzQsCi1WRkVfQ0hST01BX1NVQl9DUk9QX0hFSUdIVF9DRkcgICAgPSAweDAwMDAwMkM4LAotVkZFX0ZSQU1FRFJPUF9FTkNfWV9DRkcgICAgICAgICAgID0gMHgwMDAwMDJDQywKLVZGRV9GUkFNRURST1BfRU5DX0NCQ1JfQ0ZHICAgICAgICA9IDB4MDAwMDAyRDAsCi1WRkVfRlJBTUVEUk9QX0VOQ19ZX1BBVFRFUk4gICAgICAgPSAweDAwMDAwMkQ0LAotVkZFX0ZSQU1FRFJPUF9FTkNfQ0JDUl9QQVRURVJOICAgID0gMHgwMDAwMDJEOCwKLVZGRV9GUkFNRURST1BfVklFV19ZX0NGRyAgICAgICAgICA9IDB4MDAwMDAyREMsCi1WRkVfRlJBTUVEUk9QX1ZJRVdfQ0JDUl9DRkcgICAgICAgPSAweDAwMDAwMkUwLAotVkZFX0ZSQU1FRFJPUF9WSUVXX1lfUEFUVEVSTiAgICAgID0gMHgwMDAwMDJFNCwKLVZGRV9GUkFNRURST1BfVklFV19DQkNSX1BBVFRFUk4gICA9IDB4MDAwMDAyRTgsCi1WRkVfQ0xBTVBfTUFYX0NGRyAgICAgICAgICAgICAgICAgPSAweDAwMDAwMkVDLAotVkZFX0NMQU1QX01JTl9DRkcgICAgICAgICAgICAgICAgID0gMHgwMDAwMDJGMCwKLVZGRV9TVEFUU19DTUQgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAyRjQsCi1WRkVfU1RBVFNfQUZfQ0ZHICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMkY4LAotVkZFX1NUQVRTX0FGX0RJTSAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDJGQywKLVZGRV9TVEFUU19BRl9HUklEXzAgICAgICAgICAgICAgICA9IDB4MDAwMDAzMDAsCi1WRkVfU1RBVFNfQUZfR1JJRF8xICAgICAgICAgICAgICAgPSAweDAwMDAwMzA0LAotVkZFX1NUQVRTX0FGX0dSSURfMiAgICAgICAgICAgICAgID0gMHgwMDAwMDMwOCwKLVZGRV9TVEFUU19BRl9HUklEXzMgICAgICAgICAgICAgICA9IDB4MDAwMDAzMEMsCi1WRkVfU1RBVFNfQUZfSEVBREVSICAgICAgICAgICAgICAgPSAweDAwMDAwMzEwLAotVkZFX1NUQVRTX0FGX0NPRUYwICAgICAgICAgICAgICAgID0gMHgwMDAwMDMxNCwKLVZGRV9TVEFUU19BRl9DT0VGMSAgICAgICAgICAgICAgICA9IDB4MDAwMDAzMTgsCi1WRkVfU1RBVFNfQVdCQUVfQ0ZHICAgICAgICAgICAgICAgPSAweDAwMDAwMzFDLAotVkZFX1NUQVRTX0FYV19IRUFERVIgICAgICAgICAgICAgID0gMHgwMDAwMDMyMCwKLVZGRV9TVEFUU19BV0JfTUNGRyAgICAgICAgICAgICAgICA9IDB4MDAwMDAzMjQsCi1WRkVfU1RBVFNfQVdCX0NDRkcxICAgICAgICAgICAgICAgPSAweDAwMDAwMzI4LAotVkZFX1NUQVRTX0FXQl9DQ0ZHMiAgICAgICAgICAgICAgID0gMHgwMDAwMDMyQywKLVZGRV9TVEFUU19ISVNUX0hFQURFUiAgICAgICAgICAgICA9IDB4MDAwMDAzMzAsCi1WRkVfU1RBVFNfSElTVF9JTk5FUl9PRkZTRVQgICAgICAgPSAweDAwMDAwMzM0LAotVkZFX1NUQVRTX0hJU1RfSU5ORVJfRElNICAgICAgICAgID0gMHgwMDAwMDMzOCwKLVZGRV9TVEFUU19GUkFNRV9TSVpFICAgICAgICAgICAgICA9IDB4MDAwMDAzM0MsCi1WRkVfRE1JX0NGRyAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMzQwLAotVkZFX0RNSV9BRERSICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDM0NCwKLVZGRV9ETUlfREFUQV9ISSAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAzNDgsCi1WRkVfRE1JX0RBVEFfTE8gICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMzRDLAotVkZFX0RNSV9SQU1fQVVUT19MT0FEX0NNRCAgICAgICAgID0gMHgwMDAwMDM1MCwKLVZGRV9ETUlfUkFNX0FVVE9fTE9BRF9TVEFUVVMgICAgICA9IDB4MDAwMDAzNTQsCi1WRkVfRE1JX1JBTV9BVVRPX0xPQURfQ0ZHICAgICAgICAgPSAweDAwMDAwMzU4LAotVkZFX0RNSV9SQU1fQVVUT19MT0FEX1NFRUQgICAgICAgID0gMHgwMDAwMDM1QywKLVZGRV9URVNUQlVTX1NFTCAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAzNjAsCi1WRkVfVEVTVEdFTl9DRkcgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMzY0LAotVkZFX1NXX1RFU1RHRU5fQ01EICAgICAgICAgICAgICAgID0gMHgwMDAwMDM2OCwKLVZGRV9IV19URVNUR0VOX0NNRCAgICAgICAgICAgICAgICA9IDB4MDAwMDAzNkMsCi1WRkVfSFdfVEVTVEdFTl9DRkcgICAgICAgICAgICAgICAgPSAweDAwMDAwMzcwLAotVkZFX0hXX1RFU1RHRU5fSU1BR0VfQ0ZHICAgICAgICAgID0gMHgwMDAwMDM3NCwKLVZGRV9IV19URVNUR0VOX1NPRl9PRkZTRVRfQ0ZHICAgICA9IDB4MDAwMDAzNzgsCi1WRkVfSFdfVEVTVEdFTl9FT0ZfTk9GRlNFVF9DRkcgICAgPSAweDAwMDAwMzdDLAotVkZFX0hXX1RFU1RHRU5fU09MX09GRlNFVF9DRkcgICAgID0gMHgwMDAwMDM4MCwKLVZGRV9IV19URVNUR0VOX0VPTF9OT0ZGU0VUX0NGRyAgICA9IDB4MDAwMDAzODQsCi1WRkVfSFdfVEVTVEdFTl9IQklfQ0ZHICAgICAgICAgICAgPSAweDAwMDAwMzg4LAotVkZFX0hXX1RFU1RHRU5fVkJMX0NGRyAgICAgICAgICAgID0gMHgwMDAwMDM4QywKLVZGRV9IV19URVNUR0VOX1NPRl9EVU1NWV9MSU5FX0NGRzIgPSAweDAwMDAwMzkwLAotVkZFX0hXX1RFU1RHRU5fRU9GX0RVTU1ZX0xJTkVfQ0ZHMiA9IDB4MDAwMDAzOTQsCi1WRkVfSFdfVEVTVEdFTl9DT0xPUl9CQVJTX0NGRyAgICAgPSAweDAwMDAwMzk4LAotVkZFX0hXX1RFU1RHRU5fUkFORE9NX0NGRyAgICAgICAgID0gMHgwMDAwMDM5QywKLVZGRV9TUEFSRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAzQTAsCi19OwotCi0jZGVmaW5lIHBpbmcgMHgwCi0jZGVmaW5lIHBvbmcgMHgxCi0KLXN0cnVjdCB2ZmVfYnVzX2NmZ19kYXRhIHsKLQlib29sZWFuICAgICAgICAgICAgICAgICAgc3RyaXBlUmRQYXRoRW47Ci0JYm9vbGVhbiAgICAgICAgICAgICAgICAgIGVuY1lXclBhdGhFbjsKLQlib29sZWFuICAgICAgICAgICAgICAgICAgZW5jQ2JjcldyUGF0aEVuOwotCWJvb2xlYW4gICAgICAgICAgICAgICAgICB2aWV3WVdyUGF0aEVuOwotCWJvb2xlYW4gICAgICAgICAgICAgICAgICB2aWV3Q2JjcldyUGF0aEVuOwotCWVudW0gVkZFX1JBV19QSVhFTF9EQVRBX1NJWkUgcmF3UGl4ZWxEYXRhU2l6ZTsKLQllbnVtIFZGRV9SQVdfV1JfUEFUSF9TRUwgICAgIHJhd1dyaXRlUGF0aFNlbGVjdDsKLX07Ci0KLXN0cnVjdCB2ZmVfY2FtaWZfY2ZnX2RhdGEgewotCWJvb2xlYW4gY2FtaWYyT3V0cHV0RW5hYmxlOwotCWJvb2xlYW4gY2FtaWYyQnVzRW5hYmxlOwotCXN0cnVjdCB2ZmVfY21kc19jYW1pZl9jZmcgY2FtaWZDZmdGcm9tQ21kOwotfTsKLQotc3RydWN0IHZmZV9pcnFfY29tcG9zaXRlX21hc2tfY29uZmlnIHsKLQl1aW50OF90IGVuY0lycUNvbU1hc2s7Ci0JdWludDhfdCB2aWV3SXJxQ29tTWFzazsKLQl1aW50OF90IGNlRG9uZVNlbDsKLX07Ci0KLS8qIGRlZmluZSBhIHN0cnVjdHVyZSBmb3IgZWFjaCBvdXRwdXQgcGF0aC4qLwotc3RydWN0IHZmZV9vdXRwdXRfcGF0aCB7Ci0JdWludDMyX3QgYWRkcmVzc0J1ZmZlcls4XTsKLQl1aW50MTZfdCBmcmFnSW5kZXg7Ci0JYm9vbGVhbiAgaHdDdXJyZW50RmxhZzsKLQl1aW50OF90ICAqaHdSZWdQaW5nQWRkcmVzczsKLQl1aW50OF90ICAqaHdSZWdQb25nQWRkcmVzczsKLX07Ci0KLXN0cnVjdCB2ZmVfb3V0cHV0X3BhdGhfY29tYm8gewotCWJvb2xlYW4gICAgICAgICAgIHdoaWNoT3V0cHV0UGF0aDsKLQlib29sZWFuICAgICAgICAgICBwYXRoRW5hYmxlZDsKLQlib29sZWFuICAgICAgICAgICBtdWx0aUZyYWc7Ci0JdWludDhfdCAgICAgICAgICAgZnJhZ0NvdW50OwotCWJvb2xlYW4gICAgICAgICAgIGFja1BlbmRpbmc7Ci0JdWludDhfdCAgICAgICAgICAgY3VycmVudEZyYW1lOwotCXVpbnQzMl90ICAgICAgICAgIG5leHRGcmFtZUFkZHJCdWZbOF07Ci0Jc3RydWN0IHZmZV9vdXRwdXRfcGF0aCAgIHlQYXRoOwotCXN0cnVjdCB2ZmVfb3V0cHV0X3BhdGggICBjYmNyUGF0aDsKLQl1aW50OF90ICAgICAgICAgICBzbmFwc2hvdFBlbmRpbmdDb3VudDsKLQlib29sZWFuICAgICAgICAgICBwbUVuYWJsZWQ7Ci0JdWludDhfdCAgICAgICAgICAgY2JjclN0YXR1c0JpdDsKLX07Ci0KLXN0cnVjdCB2ZmVfc3RhdHNfY29udHJvbCB7Ci0JYm9vbGVhbiAgYWNrUGVuZGluZzsKLQl1aW50MzJfdCBhZGRyZXNzQnVmZmVyWzJdOwotCXVpbnQzMl90IG5leHRGcmFtZUFkZHJCdWY7Ci0JYm9vbGVhbiAgcGluZ1BvbmdTdGF0dXM7Ci0JdWludDhfdCAgKmh3UmVnUGluZ0FkZHJlc3M7Ci0JdWludDhfdCAgKmh3UmVnUG9uZ0FkZHJlc3M7Ci0JdWludDMyX3QgZHJvcHBlZFN0YXRzRnJhbWVDb3VudDsKLQl1aW50MzJfdCBidWZUb1JlbmRlcjsKLX07Ci0KLXN0cnVjdCB2ZmVfZ2FtbWFfbHV0X3NlbCB7Ci0JYm9vbGVhbiAgY2gwQmFua1NlbGVjdDsKLQlib29sZWFuICBjaDFCYW5rU2VsZWN0OwotCWJvb2xlYW4gIGNoMkJhbmtTZWxlY3Q7Ci19OwotCi1zdHJ1Y3QgdmZlX2ludGVycnVwdF9tYXNrIHsKLQlib29sZWFuICBjYW1pZkVycm9ySXJxOwotCWJvb2xlYW4gIGNhbWlmU29mSXJxOwotCWJvb2xlYW4gIGNhbWlmRW9sSXJxOwotCWJvb2xlYW4gIGNhbWlmRW9mSXJxOwotCWJvb2xlYW4gIGNhbWlmRXBvY2gxSXJxOwotCWJvb2xlYW4gIGNhbWlmRXBvY2gySXJxOwotCWJvb2xlYW4gIGNhbWlmT3ZlcmZsb3dJcnE7Ci0JYm9vbGVhbiAgY2VJcnE7Ci0JYm9vbGVhbiAgcmVnVXBkYXRlSXJxOwotCWJvb2xlYW4gIHJlc2V0QWNrSXJxOwotCWJvb2xlYW4gIGVuY1lQaW5ncG9uZ0lycTsKLQlib29sZWFuICBlbmNDYmNyUGluZ3BvbmdJcnE7Ci0JYm9vbGVhbiAgdmlld1lQaW5ncG9uZ0lycTsKLQlib29sZWFuICB2aWV3Q2JjclBpbmdwb25nSXJxOwotCWJvb2xlYW4gIHJkUGluZ3BvbmdJcnE7Ci0JYm9vbGVhbiAgYWZQaW5ncG9uZ0lycTsKLQlib29sZWFuICBhd2JQaW5ncG9uZ0lycTsKLQlib29sZWFuICBoaXN0UGluZ3BvbmdJcnE7Ci0JYm9vbGVhbiAgZW5jSXJxOwotCWJvb2xlYW4gIHZpZXdJcnE7Ci0JYm9vbGVhbiAgYnVzT3ZlcmZsb3dJcnE7Ci0JYm9vbGVhbiAgYWZPdmVyZmxvd0lycTsKLQlib29sZWFuICBhd2JPdmVyZmxvd0lycTsKLQlib29sZWFuICBzeW5jVGltZXIwSXJxOwotCWJvb2xlYW4gIHN5bmNUaW1lcjFJcnE7Ci0JYm9vbGVhbiAgc3luY1RpbWVyMklycTsKLQlib29sZWFuICBhc3luY1RpbWVyMElycTsKLQlib29sZWFuICBhc3luY1RpbWVyMUlycTsKLQlib29sZWFuICBhc3luY1RpbWVyMklycTsKLQlib29sZWFuICBhc3luY1RpbWVyM0lycTsKLQlib29sZWFuICBheGlFcnJvcklycTsKLQlib29sZWFuICB2aW9sYXRpb25JcnE7Ci19OwotCi1lbnVtIHZmZV9pbnRlcnJ1cHRfbmFtZSB7Ci0JQ0FNSUZfRVJST1JfSVJRLAotCUNBTUlGX1NPRl9JUlEsCi0JQ0FNSUZfRU9MX0lSUSwKLQlDQU1JRl9FT0ZfSVJRLAotCUNBTUlGX0VQT0NIMV9JUlEsCi0JQ0FNSUZfRVBPQ0gyX0lSUSwKLQlDQU1JRl9PVkVSRkxPV19JUlEsCi0JQ0VfSVJRLAotCVJFR19VUERBVEVfSVJRLAotCVJFU0VUX0FDS19JUlEsCi0JRU5DX1lfUElOR1BPTkdfSVJRLAotCUVOQ19DQkNSX1BJTkdQT05HX0lSUSwKLQlWSUVXX1lfUElOR1BPTkdfSVJRLAotCVZJRVdfQ0JDUl9QSU5HUE9OR19JUlEsCi0JUkRfUElOR1BPTkdfSVJRLAotCUFGX1BJTkdQT05HX0lSUSwKLQlBV0JfUElOR1BPTkdfSVJRLAotCUhJU1RfUElOR1BPTkdfSVJRLAotCUVOQ19JUlEsCi0JVklFV19JUlEsCi0JQlVTX09WRVJGTE9XX0lSUSwKLQlBRl9PVkVSRkxPV19JUlEsCi0JQVdCX09WRVJGTE9XX0lSUSwKLQlTWU5DX1RJTUVSMF9JUlEsCi0JU1lOQ19USU1FUjFfSVJRLAotCVNZTkNfVElNRVIyX0lSUSwKLQlBU1lOQ19USU1FUjBfSVJRLAotCUFTWU5DX1RJTUVSMV9JUlEsCi0JQVNZTkNfVElNRVIyX0lSUSwKLQlBU1lOQ19USU1FUjNfSVJRLAotCUFYSV9FUlJPUl9JUlEsCi0JVklPTEFUSU9OX0lSUQotfTsKLQotZW51bSBWRkVfRE1JX1JBTV9TRUwgewotCU5PX01FTV9TRUxFQ1RFRCAgICAgICAgICA9IDAsCi0JUk9MTE9GRl9SQU0gICAgICAgICAgICAgID0gMHgxLAotCVJHQkxVVF9SQU1fQ0gwX0JBTkswICAgICA9IDB4MiwKLQlSR0JMVVRfUkFNX0NIMF9CQU5LMSAgICAgPSAweDMsCi0JUkdCTFVUX1JBTV9DSDFfQkFOSzAgICAgID0gMHg0LAotCVJHQkxVVF9SQU1fQ0gxX0JBTksxICAgICA9IDB4NSwKLQlSR0JMVVRfUkFNX0NIMl9CQU5LMCAgICAgPSAweDYsCi0JUkdCTFVUX1JBTV9DSDJfQkFOSzEgICAgID0gMHg3LAotCVNUQVRTX0hJU1RfQ0JfRVZFTl9SQU0gICA9IDB4OCwKLQlTVEFUU19ISVNUX0NCX09ERF9SQU0gICAgPSAweDksCi0JU1RBVFNfSElTVF9DUl9FVkVOX1JBTSAgID0gMHhhLAotCVNUQVRTX0hJU1RfQ1JfT0REX1JBTSAgICA9IDB4YiwKLQlSR0JMVVRfQ0hYX0JBTkswICAgICAgICAgPSAweGMsCi0JUkdCTFVUX0NIWF9CQU5LMSAgICAgICAgID0gMHhkLAotCUxVTUFfQURBUFRfTFVUX1JBTV9CQU5LMCA9IDB4ZSwKLQlMVU1BX0FEQVBUX0xVVF9SQU1fQkFOSzEgPSAweGYKLX07Ci0KLXN0cnVjdCB2ZmVfbW9kdWxlX2VuYWJsZSB7Ci0JYm9vbGVhbiAgYmxhY2tMZXZlbENvcnJlY3Rpb25FbmFibGU7Ci0JYm9vbGVhbiAgbGVuc1JvbGxPZmZFbmFibGU7Ci0JYm9vbGVhbiAgZGVtdXhFbmFibGU7Ci0JYm9vbGVhbiAgY2hyb21hVXBzYW1wbGVFbmFibGU7Ci0JYm9vbGVhbiAgZGVtb3NhaWNFbmFibGU7Ci0JYm9vbGVhbiAgc3RhdHNFbmFibGU7Ci0JYm9vbGVhbiAgY3JvcEVuYWJsZTsKLQlib29sZWFuICBtYWluU2NhbGVyRW5hYmxlOwotCWJvb2xlYW4gIHdoaXRlQmFsYW5jZUVuYWJsZTsKLQlib29sZWFuICBjb2xvckNvcnJlY3Rpb25FbmFibGU7Ci0JYm9vbGVhbiAgeUhpc3RFbmFibGU7Ci0JYm9vbGVhbiAgc2tpblRvbmVFbmFibGU7Ci0JYm9vbGVhbiAgbHVtYUFkYXB0YXRpb25FbmFibGU7Ci0JYm9vbGVhbiAgcmdiTFVURW5hYmxlOwotCWJvb2xlYW4gIGNocm9tYUVuaGFuRW5hYmxlOwotCWJvb2xlYW4gIGFzZkVuYWJsZTsKLQlib29sZWFuICBjaHJvbWFTdXBwcmVzc2lvbkVuYWJsZTsKLQlib29sZWFuICBjaHJvbWFTdWJzYW1wbGVFbmFibGU7Ci0JYm9vbGVhbiAgc2NhbGVyMllFbmFibGU7Ci0JYm9vbGVhbiAgc2NhbGVyMkNiY3JFbmFibGU7Ci19OwotCi1zdHJ1Y3QgdmZlX2J1c19jbWRfZGF0YSB7Ci0JYm9vbGVhbiAgc3RyaXBlUmVsb2FkOwotCWJvb2xlYW4gIGJ1c1Bpbmdwb25nUmVsb2FkOwotCWJvb2xlYW4gIHN0YXRzUGluZ3BvbmdSZWxvYWQ7Ci19OwotCi1zdHJ1Y3QgdmZlX3N0YXRzX2NtZF9kYXRhIHsKLQlib29sZWFuICBhdXRvRm9jdXNFbmFibGU7Ci0JYm9vbGVhbiAgYXh3RW5hYmxlOwotCWJvb2xlYW4gIGhpc3RFbmFibGU7Ci0JYm9vbGVhbiAgY2xlYXJIaXN0RW5hYmxlOwotCWJvb2xlYW4gIGhpc3RBdXRvQ2xlYXJFbmFibGU7Ci0JYm9vbGVhbiAgY29sb3JDb252ZXJzaW9uRW5hYmxlOwotfTsKLQotc3RydWN0IHZmZV9od192ZXIgewotCXVpbnQzMl90IG1pbm9yVmVyc2lvbjo4OwotCXVpbnQzMl90IG1ham9yVmVyc2lvbjo4OwotCXVpbnQzMl90IGNvcmVWZXJzaW9uOjQ7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAxMjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfY2ZnIHsKLQl1aW50MzJfdCBwaXhlbFBhdHRlcm46MzsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDEzOwotCXVpbnQzMl90IGlucHV0U291cmNlOjI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAxNDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfYnVzY21kIHsKLQl1aW50MzJfdCAgc3RyaXBlUmVsb2FkOjE7Ci0JdWludDMyX3QgIC8qIHJlc2VydmVkICovIDogMzsKLQl1aW50MzJfdCAgYnVzUGluZ3BvbmdSZWxvYWQ6MTsKLQl1aW50MzJfdCAgc3RhdHNQaW5ncG9uZ1JlbG9hZDoxOwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDI2OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IFZGRV9JcnFfQ29tcG9zaXRlX01hc2tUeXBlIHsKLQl1aW50MzJfdCAgZW5jSXJxQ29tTWFza0JpdHM6MjsKLQl1aW50MzJfdCAgdmlld0lycUNvbU1hc2tCaXRzOjI7Ci0JdWludDMyX3QgIGNlRG9uZVNlbEJpdHM6NTsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiAyMzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfbW9kX2VuYWJsZSB7Ci0JdWludDMyX3QgYmxhY2tMZXZlbENvcnJlY3Rpb25FbmFibGU6MTsKLQl1aW50MzJfdCBsZW5zUm9sbE9mZkVuYWJsZToxOwotCXVpbnQzMl90IGRlbXV4RW5hYmxlOjE7Ci0JdWludDMyX3QgY2hyb21hVXBzYW1wbGVFbmFibGU6MTsKLQl1aW50MzJfdCBkZW1vc2FpY0VuYWJsZToxOwotCXVpbnQzMl90IHN0YXRzRW5hYmxlOjE7Ci0JdWludDMyX3QgY3JvcEVuYWJsZToxOwotCXVpbnQzMl90IG1haW5TY2FsZXJFbmFibGU6MTsKLQl1aW50MzJfdCB3aGl0ZUJhbGFuY2VFbmFibGU6MTsKLQl1aW50MzJfdCBjb2xvckNvcnJlY3Rpb25FbmFibGU6MTsKLQl1aW50MzJfdCB5SGlzdEVuYWJsZToxOwotCXVpbnQzMl90IHNraW5Ub25lRW5hYmxlOjE7Ci0JdWludDMyX3QgbHVtYUFkYXB0YXRpb25FbmFibGU6MTsKLQl1aW50MzJfdCByZ2JMVVRFbmFibGU6MTsKLQl1aW50MzJfdCBjaHJvbWFFbmhhbkVuYWJsZToxOwotCXVpbnQzMl90IGFzZkVuYWJsZToxOwotCXVpbnQzMl90IGNocm9tYVN1cHByZXNzaW9uRW5hYmxlOjE7Ci0JdWludDMyX3QgY2hyb21hU3Vic2FtcGxlRW5hYmxlOjE7Ci0JdWludDMyX3Qgc2NhbGVyMllFbmFibGU6MTsKLQl1aW50MzJfdCBzY2FsZXIyQ2JjckVuYWJsZToxOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogMTQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1zdHJ1Y3QgdmZlX2lycWVuYWJsZSB7Ci0JdWludDMyX3QgY2FtaWZFcnJvcklycToxOwotCXVpbnQzMl90IGNhbWlmU29mSXJxOjE7Ci0JdWludDMyX3QgY2FtaWZFb2xJcnE6MTsKLQl1aW50MzJfdCBjYW1pZkVvZklycToxOwotCXVpbnQzMl90IGNhbWlmRXBvY2gxSXJxOjE7Ci0JdWludDMyX3QgY2FtaWZFcG9jaDJJcnE6MTsKLQl1aW50MzJfdCBjYW1pZk92ZXJmbG93SXJxOjE7Ci0JdWludDMyX3QgY2VJcnE6MTsKLQl1aW50MzJfdCByZWdVcGRhdGVJcnE6MTsKLQl1aW50MzJfdCByZXNldEFja0lycToxOwotCXVpbnQzMl90IGVuY1lQaW5ncG9uZ0lycToxOwotCXVpbnQzMl90IGVuY0NiY3JQaW5ncG9uZ0lycToxOwotCXVpbnQzMl90IHZpZXdZUGluZ3BvbmdJcnE6MTsKLQl1aW50MzJfdCB2aWV3Q2JjclBpbmdwb25nSXJxOjE7Ci0JdWludDMyX3QgcmRQaW5ncG9uZ0lycToxOwotCXVpbnQzMl90IGFmUGluZ3BvbmdJcnE6MTsKLQl1aW50MzJfdCBhd2JQaW5ncG9uZ0lycToxOwotCXVpbnQzMl90IGhpc3RQaW5ncG9uZ0lycToxOwotCXVpbnQzMl90IGVuY0lycToxOwotCXVpbnQzMl90IHZpZXdJcnE6MTsKLQl1aW50MzJfdCBidXNPdmVyZmxvd0lycToxOwotCXVpbnQzMl90IGFmT3ZlcmZsb3dJcnE6MTsKLQl1aW50MzJfdCBhd2JPdmVyZmxvd0lycToxOwotCXVpbnQzMl90IHN5bmNUaW1lcjBJcnE6MTsKLQl1aW50MzJfdCBzeW5jVGltZXIxSXJxOjE7Ci0JdWludDMyX3Qgc3luY1RpbWVyMklycToxOwotCXVpbnQzMl90IGFzeW5jVGltZXIwSXJxOjE7Ci0JdWludDMyX3QgYXN5bmNUaW1lcjFJcnE6MTsKLQl1aW50MzJfdCBhc3luY1RpbWVyMklycToxOwotCXVpbnQzMl90IGFzeW5jVGltZXIzSXJxOjE7Ci0JdWludDMyX3QgYXhpRXJyb3JJcnE6MTsKLQl1aW50MzJfdCB2aW9sYXRpb25JcnE6MTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfdXBzYW1wbGVfY2ZnIHsKLQl1aW50MzJfdCBjaHJvbWFDb3NpdGluZ0ZvcllDYkNySW5wdXRzOjE7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAzMTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCBWRkVfQ0FNSUZDb25maWdUeXBlIHsKLQkvKiBDQU1JRiBDb25maWcgKi8KLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiAxOwotCXVpbnQzMl90ICBWU3luY0VkZ2U6MTsKLQl1aW50MzJfdCAgSFN5bmNFZGdlOjE7Ci0JdWludDMyX3QgIHN5bmNNb2RlOjI7Ci0JdWludDMyX3QgIHZmZVN1YnNhbXBsZUVuYWJsZToxOwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDE7Ci0JdWludDMyX3QgIGJ1c1N1YnNhbXBsZUVuYWJsZToxOwotCXVpbnQzMl90ICBjYW1pZjJ2ZmVFbmFibGU6MTsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiAxOwotCXVpbnQzMl90ICBjYW1pZjJidXNFbmFibGU6MTsKLQl1aW50MzJfdCAgaXJxU3Vic2FtcGxlRW5hYmxlOjE7Ci0JdWludDMyX3QgIGJpbm5pbmdFbmFibGU6MTsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiAxODsKLQl1aW50MzJfdCAgbWlzckVuYWJsZToxOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IHZmZV9jYW1pZmNmZyB7Ci0JLyogRUZTX0NvbmZpZyAqLwotCXVpbnQzMl90IGVmc0VuZE9mTGluZTo4OwotCXVpbnQzMl90IGVmc1N0YXJ0T2ZMaW5lOjg7Ci0JdWludDMyX3QgZWZzRW5kT2ZGcmFtZTo4OwotCXVpbnQzMl90IGVmc1N0YXJ0T2ZGcmFtZTo4OwotCS8qIEZyYW1lIENvbmZpZyAqLwotCXVpbnQzMl90IGZyYW1lQ29uZmlnUGl4ZWxzUGVyTGluZToxNDsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDI7Ci0JdWludDMyX3QgZnJhbWVDb25maWdMaW5lc1BlckZyYW1lOjE0OwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogMjsKLQkvKiBXaW5kb3cgV2lkdGggQ29uZmlnICovCi0JdWludDMyX3Qgd2luZG93V2lkdGhDZmdMYXN0UGl4ZWw6MTQ7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAyOwotCXVpbnQzMl90IHdpbmRvd1dpZHRoQ2ZnRmlyc3RQaXhlbDoxNDsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDI7Ci0JLyogV2luZG93IEhlaWdodCBDb25maWcgKi8KLQl1aW50MzJfdCB3aW5kb3dIZWlnaHRDZmdsYXN0TGluZToxNDsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDI7Ci0JdWludDMyX3Qgd2luZG93SGVpZ2h0Q2ZnZmlyc3RMaW5lOjE0OwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogMjsKLQkvKiBTdWJzYW1wbGUgMSBDb25maWcgKi8KLQl1aW50MzJfdCBzdWJzYW1wbGUxQ2ZnUGl4ZWxTa2lwOjE2OwotCXVpbnQzMl90IHN1YnNhbXBsZTFDZmdMaW5lU2tpcDoxNjsKLQkvKiBTdWJzYW1wbGUgMiBDb25maWcgKi8KLQl1aW50MzJfdCBzdWJzYW1wbGUyQ2ZnRnJhbWVTa2lwOjQ7Ci0JdWludDMyX3Qgc3Vic2FtcGxlMkNmZ0ZyYW1lU2tpcE1vZGU6MTsKLQl1aW50MzJfdCBzdWJzYW1wbGUyQ2ZnUGl4ZWxTa2lwV3JhcDoxOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogMjY7Ci0JLyogRXBvY2ggSW50ZXJydXB0ICovCi0JdWludDMyX3QgZXBvY2gxTGluZToxNDsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDI7Ci0JdWludDMyX3QgZXBvY2gyTGluZToxNDsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1zdHJ1Y3QgdmZlX2NhbWlmZnJhbWVfdXBkYXRlIHsKLQl1aW50MzJfdCBwaXhlbHNQZXJMaW5lOjE0OwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogMjsKLQl1aW50MzJfdCBsaW5lc1BlckZyYW1lOjE0OwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogMjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfYXhpX2J1c19jZmcgewotCXVpbnQzMl90ICBzdHJpcGVSZFBhdGhFbjoxOwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDM7Ci0JdWludDMyX3QgIGVuY1lXclBhdGhFbjoxOwotCXVpbnQzMl90ICBlbmNDYmNyV3JQYXRoRW46MTsKLQl1aW50MzJfdCAgdmlld1lXclBhdGhFbjoxOwotCXVpbnQzMl90ICB2aWV3Q2JjcldyUGF0aEVuOjE7Ci0JdWludDMyX3QgIHJhd1BpeGVsRGF0YVNpemU6MjsKLQl1aW50MzJfdCAgcmF3V3JpdGVQYXRoU2VsZWN0OjI7Ci0JdWludDMyX3QgIC8qIHJlc2VydmVkICovIDogMjA7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1zdHJ1Y3QgdmZlX2F4aV9vdXRfY2ZnIHsKLQl1aW50MzJfdCAgb3V0MllQaW5nQWRkcjozMjsKLQl1aW50MzJfdCAgb3V0MllQb25nQWRkcjozMjsKLQl1aW50MzJfdCAgb3V0MllJbWFnZUhlaWdodDoxMjsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCXVpbnQzMl90ICBvdXQyWUltYWdlV2lkdGhpbjY0Yml0OjEwOwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0JdWludDMyX3QgIG91dDJZQnVyc3RMZW5ndGg6MjsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiAyOwotCXVpbnQzMl90ICBvdXQyWU51bVJvd3M6MTI7Ci0JdWludDMyX3QgIG91dDJZUm93SW5jcmVtZW50SW42NGJpdDoxMjsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCXVpbnQzMl90ICBvdXQyQ2JjclBpbmdBZGRyOjMyOwotCXVpbnQzMl90ICBvdXQyQ2JjclBvbmdBZGRyOjMyOwotCXVpbnQzMl90ICBvdXQyQ2JjckltYWdlSGVpZ2h0OjEyOwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3QgIG91dDJDYmNySW1hZ2VXaWR0aEluNjRiaXQ6MTA7Ci0JdWludDMyX3QgIC8qIHJlc2VydmVkICovIDogNjsKLQl1aW50MzJfdCAgb3V0MkNiY3JCdXJzdExlbmd0aDoyOwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDI7Ci0JdWludDMyX3QgIG91dDJDYmNyTnVtUm93czoxMjsKLQl1aW50MzJfdCAgb3V0MkNiY3JSb3dJbmNyZW1lbnRJbjY0Yml0OjEyOwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3QgIG91dDFZUGluZ0FkZHI6MzI7Ci0JdWludDMyX3QgIG91dDFZUG9uZ0FkZHI6MzI7Ci0JdWludDMyX3QgIG91dDFZSW1hZ2VIZWlnaHQ6MTI7Ci0JdWludDMyX3QgIC8qIHJlc2VydmVkICovIDogNDsKLQl1aW50MzJfdCAgb3V0MVlJbWFnZVdpZHRoaW42NGJpdDoxMDsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiA2OwotCXVpbnQzMl90ICBvdXQxWUJ1cnN0TGVuZ3RoOjI7Ci0JdWludDMyX3QgIC8qIHJlc2VydmVkICovIDogMjsKLQl1aW50MzJfdCAgb3V0MVlOdW1Sb3dzOjEyOwotCXVpbnQzMl90ICBvdXQxWVJvd0luY3JlbWVudEluNjRiaXQ6MTI7Ci0JdWludDMyX3QgIC8qIHJlc2VydmVkICovIDogNDsKLQl1aW50MzJfdCAgb3V0MUNiY3JQaW5nQWRkcjozMjsKLQl1aW50MzJfdCAgb3V0MUNiY3JQb25nQWRkcjozMjsKLQl1aW50MzJfdCAgb3V0MUNiY3JJbWFnZUhlaWdodDoxMjsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCXVpbnQzMl90ICBvdXQxQ2JjckltYWdlV2lkdGhJbjY0Yml0OjEwOwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0JdWludDMyX3QgIG91dDFDYmNyQnVyc3RMZW5ndGg6MjsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiAyOwotCXVpbnQzMl90ICBvdXQxQ2Jjck51bVJvd3M6MTI7Ci0JdWludDMyX3QgIG91dDFDYmNyUm93SW5jcmVtZW50SW42NGJpdDoxMjsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IHZmZV9vdXRwdXRfY2xhbXBfY2ZnIHsKLQkvKiBPdXRwdXQgQ2xhbXAgTWF4aW11bXMgKi8KLQl1aW50MzJfdCB5Q2hhbk1heDo4OwotCXVpbnQzMl90IGNiQ2hhbk1heDo4OwotCXVpbnQzMl90IGNyQ2hhbk1heDo4OwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogODsKLQkvKiBPdXRwdXQgQ2xhbXAgTWluaW11bXMgKi8KLQl1aW50MzJfdCB5Q2hhbk1pbjo4OwotCXVpbnQzMl90IGNiQ2hhbk1pbjo4OwotCXVpbnQzMl90IGNyQ2hhbk1pbjo4OwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogODsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfZm92X2Nyb3BfY2ZnIHsKLQl1aW50MzJfdCBsYXN0UGl4ZWw6MTI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCXVpbnQzMl90IGZpcnN0UGl4ZWw6MTI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCi0JLyogRk9WIENvcnAsIFBhcnQgMiAqLwotCXVpbnQzMl90IGxhc3RMaW5lOjEyOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogNDsKLQl1aW50MzJfdCBmaXJzdExpbmU6MTI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA0OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IFZGRV9GUkFNRV9TS0lQX1VwZGF0ZUNtZFR5cGUgewotCXVpbnQzMl90ICB5UGF0dGVybjozMjsKLQl1aW50MzJfdCAgY2JjclBhdHRlcm46MzI7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1zdHJ1Y3QgdmZlX2ZyYW1lX3NraXBfY2ZnIHsKLQkvKiBGcmFtZSBEcm9wIEVuYyAob3V0cHV0MikgKi8KLQl1aW50MzJfdCBvdXRwdXQyWVBlcmlvZDo1OwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovCTogMjc7Ci0JdWludDMyX3Qgb3V0cHV0MkNiQ3JQZXJpb2Q6NTsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDI3OwotCXVpbnQzMl90IG91dHB1dDJZUGF0dGVybjozMjsKLQl1aW50MzJfdCBvdXRwdXQyQ2JDclBhdHRlcm46MzI7Ci0JLyogRnJhbWUgRHJvcCBWaWV3IChvdXRwdXQxKSAqLwotCXVpbnQzMl90IG91dHB1dDFZUGVyaW9kOjU7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAyNzsKLQl1aW50MzJfdCBvdXRwdXQxQ2JDclBlcmlvZDo1OwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogMjc7Ci0JdWludDMyX3Qgb3V0cHV0MVlQYXR0ZXJuOjMyOwotCXVpbnQzMl90IG91dHB1dDFDYkNyUGF0dGVybjozMjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfbWFpbl9zY2FsZXJfY2ZnIHsKLQkvKiBTY2FsZXIgRW5hYmxlIENvbmZpZyAqLwotCXVpbnQzMl90IGhFbmFibGU6MTsKLQl1aW50MzJfdCB2RW5hYmxlOjE7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAzMDsKLQkvKiBTY2FsZSBIIEltYWdlIFNpemUgQ29uZmlnICovCi0JdWludDMyX3QgaW5XaWR0aDoxMjsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3Qgb3V0V2lkdGg6MTI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCS8qIFNjYWxlIEggUGhhc2UgQ29uZmlnICovCi0JdWludDMyX3QgaG9yaXpQaGFzZU11bHQ6MTg7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAyOwotCXVpbnQzMl90IGhvcml6SW50ZXJSZXNvbHV0aW9uOjI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAxMDsKLQkvKiBTY2FsZSBIIFN0cmlwZSBDb25maWcgKi8KLQl1aW50MzJfdCBob3Jpek1OSW5pdDoxMjsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3QgaG9yaXpQaGFzZUluaXQ6MTU7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAxOwotCS8qIFNjYWxlIFYgSW1hZ2UgU2l6ZSBDb25maWcgKi8KLQl1aW50MzJfdCBpbkhlaWdodDoxMjsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3Qgb3V0SGVpZ2h0OjEyOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogNDsKLQkvKiBTY2FsZSBWIFBoYXNlIENvbmZpZyAqLwotCXVpbnQzMl90IHZlcnRQaGFzZU11bHQ6MTg7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAyOwotCXVpbnQzMl90IHZlcnRJbnRlclJlc29sdXRpb246MjsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDEwOwotCS8qIFNjYWxlIFYgU3RyaXBlIENvbmZpZyAqLwotCXVpbnQzMl90IHZlcnRNTkluaXQ6MTI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCXVpbnQzMl90IHZlcnRQaGFzZUluaXQ6MTU7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAxOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IHZmZV9zY2FsZXIyX2NmZyB7Ci0JLyogU2NhbGVyICAgRW5hYmxlIENvbmZpZyAqLwotCXVpbnQzMl90ICBoRW5hYmxlOjE7Ci0JdWludDMyX3QgIHZFbmFibGU6MTsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiAzMDsKLQkvKiBTY2FsZXIgICBIIEltYWdlIFNpemUgQ29uZmlnICovCi0JdWludDMyX3QgIGluV2lkdGg6MTI7Ci0JdWludDMyX3QgIC8qIHJlc2VydmVkICovIDogNDsKLQl1aW50MzJfdCAgb3V0V2lkdGg6MTI7Ci0JdWludDMyX3QgIC8qIHJlc2VydmVkICovIDogNDsKLQkvKiBTY2FsZXIgICBIIFBoYXNlIENvbmZpZyAqLwotCXVpbnQzMl90ICBob3JpelBoYXNlTXVsdDoxODsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiAyOwotCXVpbnQzMl90ICBob3JpekludGVyUmVzb2x1dGlvbjoyOwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDEwOwotCS8qIFNjYWxlciAgIFYgSW1hZ2UgU2l6ZSBDb25maWcgKi8KLQl1aW50MzJfdCAgaW5IZWlnaHQ6MTI7Ci0JdWludDMyX3QgIC8qIHJlc2VydmVkICovIDogNDsKLQl1aW50MzJfdCAgb3V0SGVpZ2h0OjEyOwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JLyogU2NhbGVyICAgViBQaGFzZSBDb25maWcgKi8KLQl1aW50MzJfdCAgdmVydFBoYXNlTXVsdDoxODsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiAyOwotCXVpbnQzMl90ICB2ZXJ0SW50ZXJSZXNvbHV0aW9uOjI7Ci0JdWludDMyX3QgIC8qIHJlc2VydmVkICovIDogMTA7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1zdHJ1Y3QgdmZlX3JvbGxvZmZfY2ZnIHsKLQkvKiBSb2xsb2ZmIDAgQ29uZmlnICovCi0JdWludDMyX3QgIGdyaWRXaWR0aDo5OwotCXVpbnQzMl90ICBncmlkSGVpZ2h0Ojk7Ci0JdWludDMyX3QgIHlEZWx0YTo5OwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDU7Ci0JLyogUm9sbG9mZiAxIENvbmZpZyovCi0JdWludDMyX3QgIGdyaWRYOjQ7Ci0JdWludDMyX3QgIGdyaWRZOjQ7Ci0JdWludDMyX3QgIHBpeGVsWDo5OwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDM7Ci0JdWludDMyX3QgIHBpeGVsWTo5OwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDM7Ci0JLyogUm9sbG9mZiAyIENvbmZpZyAqLwotCXVpbnQzMl90ICB5RGVsdGFBY2N1bToxMjsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiAyMDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfYXNmX3VwZGF0ZSB7Ci0JLyogQVNGIENvbmZpZyBDb21tYW5kICovCi0JdWludDMyX3Qgc21vb3RoRW5hYmxlOjE7Ci0JdWludDMyX3Qgc2hhcnBNb2RlOjI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAxOwotCXVpbnQzMl90IHNtb290aENvZWZmMTo0OwotCXVpbnQzMl90IHNtb290aENvZWZmMDo4OwotCXVpbnQzMl90IHBpcGVGbHVzaENvdW50OjEyOwotCXVpbnQzMl90IHBpcGVGbHVzaE92ZDoxOwotCXVpbnQzMl90IGZsdXNoSGFsdE92ZDoxOwotCXVpbnQzMl90IGNyb3BFbmFibGU6MTsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDE7Ci0JLyogU2hhcnBlbmluZyBDb25maWcgMCAqLwotCXVpbnQzMl90IHNoYXJwVGhyZXNob2xkRTE6NzsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDE7Ci0JdWludDMyX3Qgc2hhcnBEZWdyZWVLMTo1OwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogMzsKLQl1aW50MzJfdCBzaGFycERlZ3JlZUsyOjU7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAzOwotCXVpbnQzMl90IG5vcm1hbGl6ZUZhY3Rvcjo3OwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogMTsKLQkvKiBTaGFycGVuaW5nIENvbmZpZyAxICovCi0JdWludDMyX3Qgc2hhcnBUaHJlc2hvbGRFMjo4OwotCXVpbnQzMl90IHNoYXJwVGhyZXNob2xkRTM6ODsKLQl1aW50MzJfdCBzaGFycFRocmVzaG9sZEU0Ojg7Ci0JdWludDMyX3Qgc2hhcnBUaHJlc2hvbGRFNTo4OwotCS8qIFNoYXJwZW5pbmcgQ29lZmZpY2llbnRzIDAgKi8KLQl1aW50MzJfdCBGMUNvZWZmMDo2OwotCXVpbnQzMl90IEYxQ29lZmYxOjY7Ci0JdWludDMyX3QgRjFDb2VmZjI6NjsKLQl1aW50MzJfdCBGMUNvZWZmMzo2OwotCXVpbnQzMl90IEYxQ29lZmY0OjY7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAyOwotCS8qIFNoYXJwZW5pbmcgQ29lZmZpY2llbnRzIDEgKi8KLQl1aW50MzJfdCBGMUNvZWZmNTo2OwotCXVpbnQzMl90IEYxQ29lZmY2OjY7Ci0JdWludDMyX3QgRjFDb2VmZjc6NjsKLQl1aW50MzJfdCBGMUNvZWZmODo3OwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogNzsKLQkvKiBTaGFycGVuaW5nIENvZWZmaWNpZW50cyAyICovCi0JdWludDMyX3QgRjJDb2VmZjA6NjsKLQl1aW50MzJfdCBGMkNvZWZmMTo2OwotCXVpbnQzMl90IEYyQ29lZmYyOjY7Ci0JdWludDMyX3QgRjJDb2VmZjM6NjsKLQl1aW50MzJfdCBGMkNvZWZmNDo2OwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogMjsKLQkvKiBTaGFycGVuaW5nIENvZWZmaWNpZW50cyAzICovCi0JdWludDMyX3QgRjJDb2VmZjU6NjsKLQl1aW50MzJfdCBGMkNvZWZmNjo2OwotCXVpbnQzMl90IEYyQ29lZmY3OjY7Ci0JdWludDMyX3QgRjJDb2VmZjg6NzsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDc7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1zdHJ1Y3QgdmZlX2FzZmNyb3BfY2ZnIHsKLQkvKiBBU0YgQ3JvcCBXaWR0aCBDb25maWcgKi8KLQl1aW50MzJfdCBsYXN0UGl4ZWw6MTI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCXVpbnQzMl90IGZpcnN0UGl4ZWw6MTI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCS8qIEFTUCBDcm9wIEhlaWdodCBDb25maWcgKi8KLQl1aW50MzJfdCBsYXN0TGluZToxMjsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3QgZmlyc3RMaW5lOjEyOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogNDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfY2hyb21hX3N1cHByZXNzX2NmZyB7Ci0JLyogQ2hyb21hIFN1cHByZXNzIDAgQ29uZmlnICovCi0JdWludDMyX3QgbTE6ODsKLQl1aW50MzJfdCBtMzo4OwotCXVpbnQzMl90IG4xOjM7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAxOwotCXVpbnQzMl90IG4zOjM7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA5OwotCS8qIENocm9tYSBTdXBwcmVzcyAxIENvbmZpZyAqLwotCXVpbnQzMl90IG1tMTo4OwotCXVpbnQzMl90IG5uMTozOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogMjE7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1zdHJ1Y3QgdmZlX2Nocm9tYXN1YnNhbXBsZV9jZmcgewotCS8qIENocm9tYSBTdWJzYW1wbGUgU2VsZWN0aW9uICovCi0JdWludDMyX3QgIGhDb3NpdGVkUGhhc2U6MTsKLQl1aW50MzJfdCAgdkNvc2l0ZWRQaGFzZToxOwotCXVpbnQzMl90ICBoQ29zaXRlZDoxOwotCXVpbnQzMl90ICB2Q29zaXRlZDoxOwotCXVpbnQzMl90ICBoc3ViU2FtcGxlRW5hYmxlOjE7Ci0JdWludDMyX3QgIHZzdWJTYW1wbGVFbmFibGU6MTsKLQl1aW50MzJfdCAgY3JvcEVuYWJsZToxOwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDI1OwotCXVpbnQzMl90ICBjcm9wV2lkdGhMYXN0UGl4ZWw6MTI7Ci0JdWludDMyX3QgIC8qIHJlc2VydmVkICovIDogNDsKLQl1aW50MzJfdCAgY3JvcFdpZHRoRmlyc3RQaXhlbDoxMjsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCXVpbnQzMl90ICBjcm9wSGVpZ2h0TGFzdExpbmU6MTI7Ci0JdWludDMyX3QgIC8qIHJlc2VydmVkICovIDogNDsKLQl1aW50MzJfdCAgY3JvcEhlaWdodEZpcnN0TGluZToxMjsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IHZmZV9ibGFja2xldmVsX2NmZyB7Ci0JLyogQmxhY2sgRXZlbi1FdmVuIFZhbHVlIENvbmZpZyAqLwotCXVpbnQzMl90ICAgIGV2ZW5FdmVuQWRqdXN0bWVudDo5OwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiAyMzsKLQkvKiBCbGFjayBFdmVuLU9kZCBWYWx1ZSBDb25maWcgKi8KLQl1aW50MzJfdCAgICBldmVuT2RkQWRqdXN0bWVudDo5OwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiAyMzsKLQkvKiBCbGFjayBPZGQtRXZlbiBWYWx1ZSBDb25maWcgKi8KLQl1aW50MzJfdCAgICBvZGRFdmVuQWRqdXN0bWVudDo5OwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiAyMzsKLQkvKiBCbGFjayBPZGQtT2RkIFZhbHVlIENvbmZpZyAqLwotCXVpbnQzMl90ICAgIG9kZE9kZEFkanVzdG1lbnQ6OTsKLQl1aW50MzJfdCAgIC8qIHJlc2VydmVkICovIDogMjM7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1zdHJ1Y3QgdmZlX2RlbXV4X2NmZyB7Ci0JLyogRGVtdXggR2FpbiAwIENvbmZpZyAqLwotCXVpbnQzMl90ICBjaDBFdmVuR2FpbjoxMDsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiA2OwotCXVpbnQzMl90ICBjaDBPZGRHYWluOjEwOwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0JLyogRGVtdXggR2FpbiAxIENvbmZpZyAqLwotCXVpbnQzMl90ICBjaDFHYWluOjEwOwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDY7Ci0JdWludDMyX3QgIGNoMkdhaW46MTA7Ci0JdWludDMyX3QgIC8qIHJlc2VydmVkICovIDogNjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfYnBzX2luZm8gewotICB1aW50MzJfdCBncmVlbkJhZFBpeGVsQ291bnQ6ODsKLSAgdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA4OwotICB1aW50MzJfdCBSZWRCbHVlQmFkUGl4ZWxDb3VudDo4OwotICB1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDg7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1zdHJ1Y3QgdmZlX2RlbW9zYWljX2NmZyB7Ci0JLyogRGVtb3NhaWMgQ29uZmlnICovCi0JdWludDMyX3QgYWJmRW5hYmxlOjE7Ci0JdWludDMyX3QgYmFkUGl4ZWxDb3JyRW5hYmxlOjE7Ci0JdWludDMyX3QgZm9yY2VBYmZPbjoxOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogMTsKLQl1aW50MzJfdCBhYmZTaGlmdDo0OwotCXVpbnQzMl90IGZtaW5UaHJlc2hvbGQ6NzsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDE7Ci0JdWludDMyX3QgZm1heFRocmVzaG9sZDo3OwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogNTsKLQl1aW50MzJfdCBzbG9wZVNoaWZ0OjM7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAxOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IHZmZV9kZW1vc2FpY19icGNfY2ZnIHsKLQkvKiBEZW1vc2FpYyBCUEMgQ29uZmlnIDAgKi8KLQl1aW50MzJfdCBibHVlRGlmZlRocmVzaG9sZDoxMjsKLQl1aW50MzJfdCByZWREaWZmVGhyZXNob2xkOjEyOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogODsKLQkvKiBEZW1vc2FpYyBCUEMgQ29uZmlnIDEgKi8KLQl1aW50MzJfdCBncmVlbkRpZmZUaHJlc2hvbGQ6MTI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAyMDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfZGVtb3NhaWNfYWJmX2NmZyB7Ci0JLyogRGVtb3NhaWMgQUJGIENvbmZpZyAwICovCi0JdWludDMyX3QgbHBUaHJlc2hvbGQ6MTA7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAyMjsKLQkvKiBEZW1vc2FpYyBBQkYgQ29uZmlnIDEgKi8KLQl1aW50MzJfdCByYXRpbzo0OwotCXVpbnQzMl90IG1pblZhbHVlOjEwOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogMjsKLQl1aW50MzJfdCBtYXhWYWx1ZToxMDsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDY7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1zdHJ1Y3QgdmZlX2NvbG9yX2NvcnJlY3Rpb25fY2ZnIHsKLQkvKiBDb2xvciBDb3JyLiBDb2VmZmljaWVudCAwIENvbmZpZyAqLwotCXVpbnQzMl90ICAgYzA6MTI7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDIwOwotCS8qIENvbG9yIENvcnIuIENvZWZmaWNpZW50IDEgQ29uZmlnICovCi0JdWludDMyX3QgICBjMToxMjsKLQl1aW50MzJfdCAgIC8qIHJlc2VydmVkICovIDogMjA7Ci0JLyogQ29sb3IgQ29yci4gQ29lZmZpY2llbnQgMiBDb25maWcgKi8KLQl1aW50MzJfdCAgIGMyOjEyOwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiAyMDsKLQkvKiBDb2xvciBDb3JyLiBDb2VmZmljaWVudCAzIENvbmZpZyAqLwotCXVpbnQzMl90ICAgYzM6MTI7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDIwOwotCS8qIENvbG9yIENvcnIuIENvZWZmaWNpZW50IDQgQ29uZmlnICovCi0JdWludDMyX3QgICBjNDoxMjsKLQl1aW50MzJfdCAgIC8qIHJlc2VydmVkICovIDogMjA7Ci0JLyogQ29sb3IgQ29yci4gQ29lZmZpY2llbnQgNSBDb25maWcgKi8KLQl1aW50MzJfdCAgIGM1OjEyOwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiAyMDsKLQkvKiBDb2xvciBDb3JyLiBDb2VmZmljaWVudCA2IENvbmZpZyAqLwotCXVpbnQzMl90ICAgYzY6MTI7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDIwOwotCS8qIENvbG9yIENvcnIuIENvZWZmaWNpZW50IDcgQ29uZmlnICovCi0JdWludDMyX3QgICBjNzoxMjsKLQl1aW50MzJfdCAgIC8qIHJlc2VydmVkICovIDogMjA7Ci0JLyogQ29sb3IgQ29yci4gQ29lZmZpY2llbnQgOCBDb25maWcgKi8KLQl1aW50MzJfdCAgIGM4OjEyOwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiAyMDsKLQkvKiBDb2xvciBDb3JyLiBPZmZzZXQgMCBDb25maWcgKi8KLQl1aW50MzJfdCAgIGswOjExOwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiAyMTsKLQkvKiBDb2xvciBDb3JyLiBPZmZzZXQgMSBDb25maWcgKi8KLQl1aW50MzJfdCAgIGsxOjExOwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiAyMTsKLQkvKiBDb2xvciBDb3JyLiBPZmZzZXQgMiBDb25maWcgKi8KLQl1aW50MzJfdCAgIGsyOjExOwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiAyMTsKLQkvKiBDb2xvciBDb3JyLiBDb2VmZmljaWVudCBRIENvbmZpZyAqLwotCXVpbnQzMl90ICAgY29lZlFGYWN0b3I6MjsKLQl1aW50MzJfdCAgIC8qIHJlc2VydmVkICovIDogMzA7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1zdHJ1Y3QgVkZFX0x1bWFBZGFwdGF0aW9uX0NvbmZpZ0NtZFR5cGUgewotCS8qIExBIENvbmZpZyAqLwotCXVpbnQzMl90ICAgbHV0QmFua1NlbGVjdDoxOwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiAzMTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfd2JfY2ZnIHsKLQkvKiBXQiBDb25maWcgKi8KLQl1aW50MzJfdCBjaDBHYWluOjk7Ci0JdWludDMyX3QgY2gxR2Fpbjo5OwotCXVpbnQzMl90IGNoMkdhaW46OTsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1zdHJ1Y3QgVkZFX0dhbW1hTHV0U2VsZWN0X0NvbmZpZ0NtZFR5cGUgewotCS8qIExVVCBCYW5rIFNlbGVjdCBDb25maWcgKi8KLQl1aW50MzJfdCAgIGNoMEJhbmtTZWxlY3Q6MTsKLQl1aW50MzJfdCAgIGNoMUJhbmtTZWxlY3Q6MTsKLQl1aW50MzJfdCAgIGNoMkJhbmtTZWxlY3Q6MTsKLQl1aW50MzJfdCAgIC8qIHJlc2VydmVkICovIDogMjk7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1zdHJ1Y3QgdmZlX2Nocm9tYV9lbmhhbmNlX2NmZyB7Ci0JLyogQ2hyb21hIEVuaGFuY2UgQSBDb25maWcgKi8KLQl1aW50MzJfdCBhcDoxMTsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDU7Ci0JdWludDMyX3QgYW06MTE7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA1OwotCS8qIENocm9tYSBFbmhhbmNlIEIgQ29uZmlnICovCi0JdWludDMyX3QgYnA6MTE7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA1OwotCXVpbnQzMl90IGJtOjExOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogNTsKLQkvKiBDaHJvbWEgRW5oYW5jZSBDIENvbmZpZyAqLwotCXVpbnQzMl90IGNwOjExOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogNTsKLQl1aW50MzJfdCBjbToxMTsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDU7Ci0JLyogQ2hyb21hIEVuaGFuY2UgRCBDb25maWcgKi8KLQl1aW50MzJfdCBkcDoxMTsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDU7Ci0JdWludDMyX3QgZG06MTE7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA1OwotCS8qIENocm9tYSBFbmhhbmNlIEsgQ29uZmlnICovCi0JdWludDMyX3Qga2NiOjExOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogNTsKLQl1aW50MzJfdCBrY3I6MTE7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA1OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IHZmZV9jb2xvcl9jb252ZXJ0X2NmZyB7Ci0JLyogQ29udmVyc2lvbiBDb2VmZmljaWVudCAwICovCi0JdWludDMyX3QgdjA6MTI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAyMDsKLQkvKiBDb252ZXJzaW9uIENvZWZmaWNpZW50IDEgKi8KLQl1aW50MzJfdCB2MToxMjsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDIwOwotCS8qIENvbnZlcnNpb24gQ29lZmZpY2llbnQgMiAqLwotCXVpbnQzMl90IHYyOjEyOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogMjA7Ci0JLyogQ29udmVyc2lvbiBPZmZzZXQgKi8KLQl1aW50MzJfdCBDb252ZXJ0T2Zmc2V0Ojg7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAyNDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCBWRkVfU3luY1RpbWVyX0NvbmZpZ0NtZFR5cGUgewotCS8qIFRpbWVyIExpbmUgU3RhcnQgQ29uZmlnICovCi0JdWludDMyX3QgICAgICAgdGltZXJMaW5lU3RhcnQ6MTI7Ci0JdWludDMyX3QgICAgICAgLyogcmVzZXJ2ZWQgKi8gOiAyMDsKLQkvKiBUaW1lciBQaXhlbCBTdGFydCBDb25maWcgKi8KLQl1aW50MzJfdCAgICAgICB0aW1lclBpeGVsU3RhcnQ6MTg7Ci0JdWludDMyX3QgICAgICAgLyogcmVzZXJ2ZWQgKi8gOiAxNDsKLQkvKiBUaW1lciBQaXhlbCBEdXJhdGlvbiBDb25maWcgKi8KLQl1aW50MzJfdCAgICAgICB0aW1lclBpeGVsRHVyYXRpb246Mjg7Ci0JdWludDMyX3QgICAgICAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCS8qIFN5bmMgVGltZXIgUG9sYXJpdHkgQ29uZmlnICovCi0JdWludDMyX3QgICAgICAgdGltZXIwUG9sYXJpdHk6MTsKLQl1aW50MzJfdCAgICAgICB0aW1lcjFQb2xhcml0eToxOwotCXVpbnQzMl90ICAgICAgIHRpbWVyMlBvbGFyaXR5OjE7Ci0JdWludDMyX3QgICAgICAgLyogcmVzZXJ2ZWQgKi8gOiAyOTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCBWRkVfQXN5bmNUaW1lcl9Db25maWdDbWRUeXBlIHsKLQkvKiBBc3luYyBUaW1lciBDb25maWcgMCAqLwotCXVpbnQzMl90ICAgICBpbmFjdGl2ZUxlbmd0aDoyMDsKLQl1aW50MzJfdCAgICAgbnVtUmVwZXRpdGlvbjoxMDsKLQl1aW50MzJfdCAgICAgLyogcmVzZXJ2ZWQgKi8gOiAxOwotCXVpbnQzMl90ICAgICBwb2xhcml0eToxOwotCS8qIEFzeW5jIFRpbWVyIENvbmZpZyAxICovCi0JdWludDMyX3QgICAgIGFjdGl2ZUxlbmd0aDoyMDsKLQl1aW50MzJfdCAgICAgLyogcmVzZXJ2ZWQgKi8gOiAxMjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCBWRkVfQVdCQUVTdGF0aXN0aWNzX0NvbmZpZ0NtZFR5cGUgewotCS8qIEFXQiBhdXRvZXhwb3N1cmUgQ29uZmlnICovCi0JdWludDMyX3QgICAgYWVSZWdpb25Db25maWc6MTsKLQl1aW50MzJfdCAgICBhZVN1YnJlZ2lvbkNvbmZpZzoxOwotCXVpbnQzMl90ICAgIC8qIHJlc2VydmVkICovIDogMTQ7Ci0JdWludDMyX3QgICAgYXdiWU1pbjo4OwotCXVpbnQzMl90ICAgIGF3YllNYXg6ODsKLQkvKiBBWFcgSGVhZGVyICovCi0JdWludDMyX3QgICAgYXh3SGVhZGVyOjg7Ci0JdWludDMyX3QgICAgLyogcmVzZXJ2ZWQgKi8gOiAyNDsKLQkvKiBBV0IgTWNvbmZpZyAqLwotCXVpbnQzMl90ICAgIG00Ojg7Ci0JdWludDMyX3QgICAgbTM6ODsKLQl1aW50MzJfdCAgICBtMjo4OwotCXVpbnQzMl90ICAgIG0xOjg7Ci0JLyogQVdCIENjb25maWcgKi8KLQl1aW50MzJfdCAgICBjMjoxMjsKLQl1aW50MzJfdCAgICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3QgICAgYzE6MTI7Ci0JdWludDMyX3QgICAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCS8qIEFXQiBDY29uZmlnIDIgKi8KLQl1aW50MzJfdCAgICBjNDoxMjsKLQl1aW50MzJfdCAgICAvKiByZXNlcnZlZCAqLyA6IDQ7Ci0JdWludDMyX3QgICAgYzM6MTI7Ci0JdWludDMyX3QgICAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IFZGRV9UZXN0R2VuX0NvbmZpZ0NtZFR5cGUgewotCS8qIEhXIFRlc3QgR2VuIENvbmZpZyAqLwotCXVpbnQzMl90ICAgbnVtRnJhbWU6MTA7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDI7Ci0JdWludDMyX3QgICBwaXhlbERhdGFTZWxlY3Q6MTsKLQl1aW50MzJfdCAgIHN5c3RlbWF0aWNEYXRhU2VsZWN0OjE7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDI7Ci0JdWludDMyX3QgICBwaXhlbERhdGFTaXplOjI7Ci0JdWludDMyX3QgICBoc3luY0VkZ2U6MTsKLQl1aW50MzJfdCAgIHZzeW5jRWRnZToxOwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiAxMjsKLQkvKiBIVyBUZXN0IEdlbiBJbWFnZSBDb25maWcgKi8KLQl1aW50MzJfdCAgIGltYWdlV2lkdGg6MTQ7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDI7Ci0JdWludDMyX3QgICBpbWFnZUhlaWdodDoxNDsKLQl1aW50MzJfdCAgIC8qIHJlc2VydmVkICovIDogMjsKLQkvKiBTT0YgT2Zmc2V0IENvbmZpZyAqLwotCXVpbnQzMl90ICAgc29mT2Zmc2V0OjI0OwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiA4OwotCS8qIEVPRiBOT2Zmc2V0IENvbmZpZyAqLwotCXVpbnQzMl90ICAgZW9mTk9mZnNldDoyNDsKLQl1aW50MzJfdCAgIC8qIHJlc2VydmVkICovIDogODsKLQkvKiBTT0wgT2Zmc2V0IENvbmZpZyAqLwotCXVpbnQzMl90ICAgc29sT2Zmc2V0Ojk7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDIzOwotCS8qIEVPTCBOT2Zmc2V0IENvbmZpZyAqLwotCXVpbnQzMl90ICAgZW9sTk9mZnNldDo5OwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiAyMzsKLQkvKiBIQkkgQ29uZmlnICovCi0JdWludDMyX3QgICBoQmxhbmtJbnRlcnZhbDoxNDsKLQl1aW50MzJfdCAgIC8qIHJlc2VydmVkICovIDogMTg7Ci0JLyogVkJMIENvbmZpZyAqLwotCXVpbnQzMl90ICAgdkJsYW5rSW50ZXJ2YWw6MTQ7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDI7Ci0JdWludDMyX3QgICB2QmxhbmtJbnRlcnZhbEVuYWJsZToxOwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiAxNTsKLQkvKiBTT0YgRHVtbXkgTGluZSBDb25maWcgKi8KLQl1aW50MzJfdCAgIHNvZkR1bW15Ojg7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDI0OwotCS8qIEVPRiBEdW1teSBMaW5lIENvbmZpZyAqLwotCXVpbnQzMl90ICAgZW9mRHVtbXk6ODsKLQl1aW50MzJfdCAgIC8qIHJlc2VydmVkICovIDogMjQ7Ci0JLyogQ29sb3IgQmFycyBDb25maWcgKi8KLQl1aW50MzJfdCAgIHVuaWNvbG9yQmFyU2VsZWN0OjM7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDE7Ci0JdWludDMyX3QgICB1bmljb2xvckJhckVuYWJsZToxOwotCXVpbnQzMl90ICAgc3BsaXRFbmFibGU6MTsKLQl1aW50MzJfdCAgIHBpeGVsUGF0dGVybjoyOwotCXVpbnQzMl90ICAgcm90YXRlUGVyaW9kOjY7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDE4OwotCS8qIFJhbmRvbSBDb25maWcgKi8KLQl1aW50MzJfdCAgIHJhbmRvbVNlZWQ6MTY7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDE2OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IFZGRV9CdXNfUG1fQ29uZmlnQ21kVHlwZSB7Ci0JLyogVkZFIEJ1cyBQZXJmb3JtYW5jZSBNb25pdG9yIENvbmZpZyAqLwotCXVpbnQzMl90ICBvdXRwdXQyWVdyUG1FbmFibGU6MTsKLQl1aW50MzJfdCAgb3V0cHV0MkNiY3JXclBtRW5hYmxlOjE7Ci0JdWludDMyX3QgIG91dHB1dDFZV3JQbUVuYWJsZToxOwotCXVpbnQzMl90ICBvdXRwdXQxQ2JjcldyUG1FbmFibGU6MTsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiAyODsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfYXNmX2luZm8gewotCS8qIGFzZiBtYXggZWRnZSAgKi8KLQl1aW50MzJfdCBtYXhFZGdlOjEzOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogMzsKLQkvKiBIQmkgY291bnQgICovCi0JdWludDMyX3QgSEJJQ291bnQ6MTI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA0OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IHZmZV9jYW1pZl9zdGF0cyB7Ci0gIHVpbnQzMl90ICBwaXhlbENvdW50OjE0OwotICB1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiAyOwotICB1aW50MzJfdCAgbGluZUNvdW50OjE0OwotICB1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiAxOwotICB1aW50MzJfdCAgY2FtaWZIYWx0OjE7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1zdHJ1Y3QgVkZFX1N0YXRzQ21kVHlwZSB7Ci0JdWludDMyX3QgIGF1dG9Gb2N1c0VuYWJsZToxOwotCXVpbnQzMl90ICBheHdFbmFibGU6MTsKLQl1aW50MzJfdCAgaGlzdEVuYWJsZToxOwotCXVpbnQzMl90ICBjbGVhckhpc3RFbmFibGU6MTsKLQl1aW50MzJfdCAgaGlzdEF1dG9DbGVhckVuYWJsZToxOwotCXVpbnQzMl90ICBjb2xvckNvbnZlcnNpb25FbmFibGU6MTsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiAyNjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLQotc3RydWN0IHZmZV9zdGF0c2ZyYW1lIHsKLQl1aW50MzJfdCBsYXN0UGl4ZWw6MTI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCXVpbnQzMl90IGxhc3RMaW5lOjEyOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogNDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfYnVzc3RhdHNfd3JwcmlvIHsKLQl1aW50MzJfdCBhZkJ1c1ByaW9yaXR5OjQ7Ci0JdWludDMyX3QgYXdiQnVzUHJpb3JpdHk6NDsKLQl1aW50MzJfdCBoaXN0QnVzUHJpb3JpdHk6NDsKLQl1aW50MzJfdCBhZkJ1c1ByaW9yaXR5RW46MTsKLQl1aW50MzJfdCBhd2JCdXNQcmlvcml0eUVuOjE7Ci0JdWludDMyX3QgaGlzdEJ1c1ByaW9yaXR5RW46MTsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDE3OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IHZmZV9zdGF0c2FmX3VwZGF0ZSB7Ci0JLyogVkZFX1NUQVRTX0FGX0NGRyAqLwotCXVpbnQzMl90IHdpbmRvd1ZPZmZzZXQ6MTI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCXVpbnQzMl90IHdpbmRvd0hPZmZzZXQ6MTI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiAzOwotCXVpbnQzMl90IHdpbmRvd01vZGU6MTsKLQotCS8qIFZGRV9TVEFUU19BRl9ESU0gKi8KLQl1aW50MzJfdCB3aW5kb3dIZWlnaHQ6MTI7Ci0JdWludDMyX3QgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCXVpbnQzMl90IHdpbmRvd1dpZHRoOjEyOwotCXVpbnQzMl90IC8qIHJlc2VydmVkICovIDogNDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfc3RhdHNhZl9jZmcgewotCS8qIFZGRV9TVEFUU19BRl9HUklEXzAgKi8KLQl1aW50MzJfdCAgZW50cnkwMDo4OwotCXVpbnQzMl90ICBlbnRyeTAxOjg7Ci0JdWludDMyX3QgIGVudHJ5MDI6ODsKLQl1aW50MzJfdCAgZW50cnkwMzo4OwotCi0JLyogVkZFX1NUQVRTX0FGX0dSSURfMSAqLwotCXVpbnQzMl90ICBlbnRyeTEwOjg7Ci0JdWludDMyX3QgIGVudHJ5MTE6ODsKLQl1aW50MzJfdCAgZW50cnkxMjo4OwotCXVpbnQzMl90ICBlbnRyeTEzOjg7Ci0KLQkvKiBWRkVfU1RBVFNfQUZfR1JJRF8yICovCi0JdWludDMyX3QgIGVudHJ5MjA6ODsKLQl1aW50MzJfdCAgZW50cnkyMTo4OwotCXVpbnQzMl90ICBlbnRyeTIyOjg7Ci0JdWludDMyX3QgIGVudHJ5MjM6ODsKLQotCS8qIFZGRV9TVEFUU19BRl9HUklEXzMgKi8KLQl1aW50MzJfdCAgZW50cnkzMDo4OwotCXVpbnQzMl90ICBlbnRyeTMxOjg7Ci0JdWludDMyX3QgIGVudHJ5MzI6ODsKLQl1aW50MzJfdCAgZW50cnkzMzo4OwotCi0JLyogVkZFX1NUQVRTX0FGX0hFQURFUiAqLwotCXVpbnQzMl90ICBhZkhlYWRlcjo4OwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDI0OwotCS8qICBWRkVfU1RBVFNfQUZfQ09FRjAgKi8KLQl1aW50MzJfdCAgYTAwOjU7Ci0JdWludDMyX3QgIGEwNDo1OwotCXVpbnQzMl90ICBmdk1heDoxMTsKLQl1aW50MzJfdCAgZnZNZXRyaWM6MTsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiAxMDsKLQotCS8qIFZGRV9TVEFUU19BRl9DT0VGMSAqLwotCXVpbnQzMl90ICBhMjA6NTsKLQl1aW50MzJfdCAgYTIxOjU7Ci0JdWludDMyX3QgIGEyMjo1OwotCXVpbnQzMl90ICBhMjM6NTsKLQl1aW50MzJfdCAgYTI0OjU7Ci0JdWludDMyX3QgIC8qIHJlc2VydmVkICovIDogNzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfc3RhdHNhd2JhZV91cGRhdGUgewotCXVpbnQzMl90ICBhZVJlZ2lvbkNmZzoxOwotCXVpbnQzMl90ICBhZVN1YnJlZ2lvbkNmZzoxOwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDE0OwotCXVpbnQzMl90ICBhd2JZTWluOjg7Ci0JdWludDMyX3QgIGF3YllNYXg6ODsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSk7Ci0KLXN0cnVjdCB2ZmVfc3RhdHNheHdfaGRyX2NmZyB7Ci0JLyogU3RhdHMgQVhXIEhlYWRlciBDb25maWcgKi8KLQl1aW50MzJfdCBheHdIZWFkZXI6ODsKLQl1aW50MzJfdCAvKiByZXNlcnZlZCAqLyA6IDI0OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IHZmZV9zdGF0c2F3Yl91cGRhdGUgewotCS8qIEFXQiBNQ29uZmlnICovCi0JdWludDMyX3QgIG00Ojg7Ci0JdWludDMyX3QgIG0zOjg7Ci0JdWludDMyX3QgIG0yOjg7Ci0JdWludDMyX3QgIG0xOjg7Ci0KLQkvKiBBV0IgQ0NvbmZpZzEgKi8KLQl1aW50MzJfdCAgYzI6MTI7Ci0JdWludDMyX3QgIC8qIHJlc2VydmVkICovIDogNDsKLQl1aW50MzJfdCAgYzE6MTI7Ci0JdWludDMyX3QgIC8qIHJlc2VydmVkICovIDogNDsKLQotCS8qIEFXQiBDQ29uZmlnMiAqLwotCXVpbnQzMl90ICBjNDoxMjsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCXVpbnQzMl90ICBjMzoxMjsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IFZGRV9TeW5jVGltZXJDbWRUeXBlIHsKLQl1aW50MzJfdCAgaHN5bmNDb3VudDoxMjsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiAyMDsKLQl1aW50MzJfdCAgcGNsa0NvdW50OjE4OwotCXVpbnQzMl90ICAvKiByZXNlcnZlZCAqLyA6IDE0OwotCXVpbnQzMl90ICBvdXRwdXREdXJhdGlvbjoyODsKLQl1aW50MzJfdCAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IFZGRV9Bc3luY1RpbWVyQ21kVHlwZSB7Ci0JLyogIGNvbmZpZyAwICovCi0JdWludDMyX3QgICAgaW5hY3RpdmVDb3VudDoyMDsKLQl1aW50MzJfdCAgICByZXBlYXRDb3VudDoxMDsKLQl1aW50MzJfdCAgICAvKiByZXNlcnZlZCAqLyA6IDE7Ci0JdWludDMyX3QgICAgcG9sYXJpdHk6MTsKLQkvKiAgY29uZmlnIDEgKi8KLQl1aW50MzJfdCAgICBhY3RpdmVDb3VudDoyMDsKLQl1aW50MzJfdCAgICAvKiByZXNlcnZlZCAqLyA6IDEyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IFZGRV9BeGlJbnB1dENtZFR5cGUgewotCXVpbnQzMl90ICAgc3RyaXBlU3RhcnRBZGRyMDozMjsKLQl1aW50MzJfdCAgIHN0cmlwZVN0YXJ0QWRkcjE6MzI7Ci0JdWludDMyX3QgICBzdHJpcGVTdGFydEFkZHIyOjMyOwotCXVpbnQzMl90ICAgc3RyaXBlU3RhcnRBZGRyMzozMjsKLQotCXVpbnQzMl90ICAgeVNpemU6MTI7Ci0JdWludDMyX3QgICB5T2Zmc2V0RGVsdGE6MTI7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDg7Ci0KLQkvKiBidXNfc3RyaXBlX3JkX2hTaXplICovCi0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDE2OwotCXVpbnQzMl90ICAgeFNpemVXb3JkOjEwOwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiA2OwotCi0JLyogYnVzX3N0cmlwZV9yZF9idWZmZXJfY2ZnICovCi0JdWludDMyX3QgICBidXJzdExlbmd0aDoyOwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiAyOwotCXVpbnQzMl90ICAgTnVtT2ZSb3dzOjEyOwotCXVpbnQzMl90ICAgUm93SW5jcmVtZW50OjEyOwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiA0OwotCi0JLyogYnVzX3N0cmlwZV9yZF91bnBhY2tfY2ZnICovCi0JdWludDMyX3QgICBtYWluVW5wYWNrSGVpZ2h0OjEyOwotCXVpbnQzMl90ICAgbWFpblVucGFja1dpZHRoOjEzOwotCXVpbnQzMl90ICAgbWFpblVucGFja0hiaVNlbDozOwotCXVpbnQzMl90ICAgbWFpblVucGFja1BoYXNlOjM7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDE7Ci0KLQkvKiBidXNfc3RyaXBlX3JkX3VucGFjayAqLwotCXVpbnQzMl90ICAgdW5wYWNrUGF0dGVybjozMjsKLQotCS8qIGJ1c19zdHJpcGVfcmRfcGFkX3NpemUgKi8KLQl1aW50MzJfdCAgIHBhZExlZnQ6NzsKLQl1aW50MzJfdCAgIC8qIHJlc2VydmVkICovIDogMTsKLQl1aW50MzJfdCAgIHBhZFJpZ2h0Ojc7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDE7Ci0JdWludDMyX3QgICBwYWRUb3A6NzsKLQl1aW50MzJfdCAgIC8qIHJlc2VydmVkICovIDogMTsKLQl1aW50MzJfdCAgIHBhZEJvdHRvbTo3OwotCXVpbnQzMl90ICAgLyogcmVzZXJ2ZWQgKi8gOiAxOwotCi0JLyogYnVzX3N0cmlwZV9yZF9wYWRfTF91bnBhY2sgKi8KLQl1aW50MzJfdCAgIGxlZnRVbnBhY2tQYXR0ZXJuMDo0OwotCXVpbnQzMl90ICAgbGVmdFVucGFja1BhdHRlcm4xOjQ7Ci0JdWludDMyX3QgICBsZWZ0VW5wYWNrUGF0dGVybjI6NDsKLQl1aW50MzJfdCAgIGxlZnRVbnBhY2tQYXR0ZXJuMzo0OwotCXVpbnQzMl90ICAgbGVmdFVucGFja1N0b3AwOjE7Ci0JdWludDMyX3QgICBsZWZ0VW5wYWNrU3RvcDE6MTsKLQl1aW50MzJfdCAgIGxlZnRVbnBhY2tTdG9wMjoxOwotCXVpbnQzMl90ICAgbGVmdFVucGFja1N0b3AzOjE7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDEyOwotCi0JLyogYnVzX3N0cmlwZV9yZF9wYWRfUl91bnBhY2sgKi8KLQl1aW50MzJfdCAgIHJpZ2h0VW5wYWNrUGF0dGVybjA6NDsKLQl1aW50MzJfdCAgIHJpZ2h0VW5wYWNrUGF0dGVybjE6NDsKLQl1aW50MzJfdCAgIHJpZ2h0VW5wYWNrUGF0dGVybjI6NDsKLQl1aW50MzJfdCAgIHJpZ2h0VW5wYWNrUGF0dGVybjM6NDsKLQl1aW50MzJfdCAgIHJpZ2h0VW5wYWNrU3RvcDA6MTsKLQl1aW50MzJfdCAgIHJpZ2h0VW5wYWNrU3RvcDE6MTsKLQl1aW50MzJfdCAgIHJpZ2h0VW5wYWNrU3RvcDI6MTsKLQl1aW50MzJfdCAgIHJpZ2h0VW5wYWNrU3RvcDM6MTsKLQl1aW50MzJfdCAgIC8qIHJlc2VydmVkICovIDogMTI7Ci0KLQkvKiBidXNfc3RyaXBlX3JkX3BhZF90Yl91bnBhY2sgKi8KLQl1aW50MzJfdCAgIHRvcFVuYXBja1BhdHRlcm46NDsKLQl1aW50MzJfdCAgIC8qIHJlc2VydmVkICovIDogMTI7Ci0JdWludDMyX3QgICBib3R0b21VbmFwY2tQYXR0ZXJuOjQ7Ci0JdWludDMyX3QgICAvKiByZXNlcnZlZCAqLyA6IDEyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKLQotc3RydWN0IFZGRV9BeGlSZEZyYWdJcnFFbmFibGUgewotCXVpbnQzMl90IHN0cmlwZVJkRnJhZ2lycTBFbmFibGU6MTsKLQl1aW50MzJfdCBzdHJpcGVSZEZyYWdpcnExRW5hYmxlOjE7Ci0JdWludDMyX3Qgc3RyaXBlUmRGcmFnaXJxMkVuYWJsZToxOwotCXVpbnQzMl90IHN0cmlwZVJkRnJhZ2lycTNFbmFibGU6MTsKLQl1aW50MzJfdCAgIC8qIHJlc2VydmVkICovIDogMjg7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpOwotCi1pbnQgdmZlX2NtZF9pbml0KHN0cnVjdCBtc21fdmZlX2NhbGxiYWNrICosIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiwgdm9pZCAqKTsKLXZvaWQgdmZlX3N0YXRzX2FmX3N0b3Aodm9pZCk7Ci12b2lkIHZmZV9zdG9wKHZvaWQpOwotdm9pZCB2ZmVfdXBkYXRlKHZvaWQpOwotaW50IHZmZV9yZ2JfZ2FtbWFfdXBkYXRlKHN0cnVjdCB2ZmVfY21kX3JnYl9nYW1tYV9jb25maWcgKik7Ci1pbnQgdmZlX3JnYl9nYW1tYV9jb25maWcoc3RydWN0IHZmZV9jbWRfcmdiX2dhbW1hX2NvbmZpZyAqKTsKLXZvaWQgdmZlX3N0YXRzX3diX2V4cF9hY2soc3RydWN0IHZmZV9jbWRfc3RhdHNfd2JfZXhwX2FjayAqKTsKLXZvaWQgdmZlX3N0YXRzX2FmX2FjayhzdHJ1Y3QgdmZlX2NtZF9zdGF0c19hZl9hY2sgKik7Ci12b2lkIHZmZV9zdGFydChzdHJ1Y3QgdmZlX2NtZF9zdGFydCAqKTsKLXZvaWQgdmZlX2xhX3VwZGF0ZShzdHJ1Y3QgdmZlX2NtZF9sYV9jb25maWcgKik7Ci12b2lkIHZmZV9sYV9jb25maWcoc3RydWN0IHZmZV9jbWRfbGFfY29uZmlnICopOwotdm9pZCB2ZmVfdGVzdF9nZW5fc3RhcnQoc3RydWN0IHZmZV9jbWRfdGVzdF9nZW5fc3RhcnQgKik7Ci12b2lkIHZmZV9mcmFtZV9za2lwX3VwZGF0ZShzdHJ1Y3QgdmZlX2NtZF9mcmFtZV9za2lwX3VwZGF0ZSAqKTsKLXZvaWQgdmZlX2ZyYW1lX3NraXBfY29uZmlnKHN0cnVjdCB2ZmVfY21kX2ZyYW1lX3NraXBfY29uZmlnICopOwotdm9pZCB2ZmVfb3V0cHV0X2NsYW1wX2NvbmZpZyhzdHJ1Y3QgdmZlX2NtZF9vdXRwdXRfY2xhbXBfY29uZmlnICopOwotdm9pZCB2ZmVfY2FtaWZfZnJhbWVfdXBkYXRlKHN0cnVjdCB2ZmVfY21kc19jYW1pZl9mcmFtZSAqKTsKLXZvaWQgdmZlX2NvbG9yX2NvcnJlY3Rpb25fY29uZmlnKHN0cnVjdCB2ZmVfY21kX2NvbG9yX2NvcnJlY3Rpb25fY29uZmlnICopOwotdm9pZCB2ZmVfZGVtb3NhaWNfYWJmX3VwZGF0ZShzdHJ1Y3QgdmZlX2NtZF9kZW1vc2FpY19hYmZfdXBkYXRlICopOwotdm9pZCB2ZmVfZGVtb3NhaWNfYnBjX3VwZGF0ZShzdHJ1Y3QgdmZlX2NtZF9kZW1vc2FpY19icGNfdXBkYXRlICopOwotdm9pZCB2ZmVfZGVtb3NhaWNfY29uZmlnKHN0cnVjdCB2ZmVfY21kX2RlbW9zYWljX2NvbmZpZyAqKTsKLXZvaWQgdmZlX2RlbXV4X2NoYW5uZWxfZ2Fpbl91cGRhdGUoc3RydWN0IHZmZV9jbWRfZGVtdXhfY2hhbm5lbF9nYWluX2NvbmZpZyAqKTsKLXZvaWQgdmZlX2RlbXV4X2NoYW5uZWxfZ2Fpbl9jb25maWcoc3RydWN0IHZmZV9jbWRfZGVtdXhfY2hhbm5lbF9nYWluX2NvbmZpZyAqKTsKLXZvaWQgdmZlX2JsYWNrX2xldmVsX3VwZGF0ZShzdHJ1Y3QgdmZlX2NtZF9ibGFja19sZXZlbF9jb25maWcgKik7Ci12b2lkIHZmZV9ibGFja19sZXZlbF9jb25maWcoc3RydWN0IHZmZV9jbWRfYmxhY2tfbGV2ZWxfY29uZmlnICopOwotdm9pZCB2ZmVfYXNmX3VwZGF0ZShzdHJ1Y3QgdmZlX2NtZF9hc2ZfdXBkYXRlICopOwotdm9pZCB2ZmVfYXNmX2NvbmZpZyhzdHJ1Y3QgdmZlX2NtZF9hc2ZfY29uZmlnICopOwotdm9pZCB2ZmVfd2hpdGVfYmFsYW5jZV9jb25maWcoc3RydWN0IHZmZV9jbWRfd2hpdGVfYmFsYW5jZV9jb25maWcgKik7Ci12b2lkIHZmZV9jaHJvbWFfc3VwX2NvbmZpZyhzdHJ1Y3QgdmZlX2NtZF9jaHJvbWFfc3VwcHJlc3Npb25fY29uZmlnICopOwotdm9pZCB2ZmVfcm9sbF9vZmZfY29uZmlnKHN0cnVjdCB2ZmVfY21kX3JvbGxfb2ZmX2NvbmZpZyAqKTsKLXZvaWQgdmZlX2Nocm9tYV9zdWJzYW1wbGVfY29uZmlnKHN0cnVjdCB2ZmVfY21kX2Nocm9tYV9zdWJzYW1wbGVfY29uZmlnICopOwotdm9pZCB2ZmVfY2hyb21hX2VuaGFuX2NvbmZpZyhzdHJ1Y3QgdmZlX2NtZF9jaHJvbWFfZW5oYW5fY29uZmlnICopOwotdm9pZCB2ZmVfc2NhbGVyMmNiY3JfY29uZmlnKHN0cnVjdCB2ZmVfY21kX3NjYWxlcjJfY29uZmlnICopOwotdm9pZCB2ZmVfc2NhbGVyMnlfY29uZmlnKHN0cnVjdCB2ZmVfY21kX3NjYWxlcjJfY29uZmlnICopOwotdm9pZCB2ZmVfbWFpbl9zY2FsZXJfY29uZmlnKHN0cnVjdCB2ZmVfY21kX21haW5fc2NhbGVyX2NvbmZpZyAqKTsKLXZvaWQgdmZlX3N0YXRzX3diX2V4cF9zdG9wKHZvaWQpOwotdm9pZCB2ZmVfc3RhdHNfdXBkYXRlX3diX2V4cChzdHJ1Y3QgdmZlX2NtZF9zdGF0c193Yl9leHBfdXBkYXRlICopOwotdm9pZCB2ZmVfc3RhdHNfdXBkYXRlX2FmKHN0cnVjdCB2ZmVfY21kX3N0YXRzX2FmX3VwZGF0ZSAqKTsKLXZvaWQgdmZlX3N0YXRzX3N0YXJ0X3diX2V4cChzdHJ1Y3QgdmZlX2NtZF9zdGF0c193Yl9leHBfc3RhcnQgKik7Ci12b2lkIHZmZV9zdGF0c19zdGFydF9hZihzdHJ1Y3QgdmZlX2NtZF9zdGF0c19hZl9zdGFydCAqKTsKLXZvaWQgdmZlX3N0YXRzX3NldHRpbmcoc3RydWN0IHZmZV9jbWRfc3RhdHNfc2V0dGluZyAqKTsKLXZvaWQgdmZlX2F4aV9pbnB1dF9jb25maWcoc3RydWN0IHZmZV9jbWRfYXhpX2lucHV0X2NvbmZpZyAqKTsKLXZvaWQgdmZlX2F4aV9vdXRwdXRfY29uZmlnKHN0cnVjdCB2ZmVfY21kX2F4aV9vdXRwdXRfY29uZmlnICopOwotdm9pZCB2ZmVfY2FtaWZfY29uZmlnKHN0cnVjdCB2ZmVfY21kX2NhbWlmX2NvbmZpZyAqKTsKLXZvaWQgdmZlX2Zvdl9jcm9wX2NvbmZpZyhzdHJ1Y3QgdmZlX2NtZF9mb3ZfY3JvcF9jb25maWcgKik7Ci12b2lkIHZmZV9nZXRfaHdfdmVyc2lvbihzdHJ1Y3QgdmZlX2NtZF9od192ZXJzaW9uICopOwotdm9pZCB2ZmVfcmVzZXQodm9pZCk7Ci12b2lkIHZmZV9jbWRfcmVsZWFzZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopOwotdm9pZCB2ZmVfb3V0cHV0X3BfYWNrKHN0cnVjdCB2ZmVfY21kX291dHB1dF9hY2sgKik7Ci12b2lkIHZmZV9vdXRwdXRfdl9hY2soc3RydWN0IHZmZV9jbWRfb3V0cHV0X2FjayAqKTsKLSNlbmRpZiAvKiBfX01TTV9WRkU4WF9SRUdfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmVfc3RhdHNfYnVmLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdmZlL21zbV92ZmVfc3RhdHNfYnVmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NTBkNzguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlX3N0YXRzX2J1Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDc2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgotCi0KLSNpbmNsdWRlIDxtZWRpYS9tc21fY2FtZXJhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbXNtX2lzcC5oPgotI2luY2x1ZGUgIm1zbS5oIgotI2luY2x1ZGUgIm1zbV92ZmVfc3RhdHNfYnVmLmgiCi0KLSNpZmRlZiBDT05GSUdfTVNNX0NBTUVSQV9ERUJVRwotCSNkZWZpbmUgRChmbXQsIGFyZ3MuLi4pIHByX2RlYnVnKCJtc21fc3RhdHM6ICIgZm10LCAjI2FyZ3MpCi0jZWxzZQotCSNkZWZpbmUgRChmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgbXNtX3N0YXRzX2luaXQoc3RydWN0IG1zbV9zdGF0c19idWZxX2N0cmwgKnN0YXRzX2N0cmwpCi17Ci0JaW50IHJjID0gMDsKLQkvKiBjYW5ub3QgZ2V0IHNwaW5sb2NrIGhlcmUgKi8KLQlpZiAoc3RhdHNfY3RybC0+aW5pdF9kb25lID4gMCkgewotCQlwcl9lcnIoIiVzOiBhbHJlYWR5IGluaXRpYWxpemVkIHN0YXRzIGN0cmwuIG5vIG9wIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0JbWVtc2V0KHN0YXRzX2N0cmwsICAwLCAgc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfYnVmcV9jdHJsKSk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnN0YXRzX2N0cmwtPmxvY2spOwotCXN0YXRzX2N0cmwtPmluaXRfZG9uZSA9IDE7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9zdGF0c19yZXFidWYoc3RydWN0IG1zbV9zdGF0c19idWZxX2N0cmwgKnN0YXRzX2N0cmwsCi0Jc3RydWN0IG1zbV9zdGF0c19yZXFidWYgKnJlcWJ1ZiwKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50KQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9zdGF0c19idWZxICpidWZxOwotCXN0cnVjdCBtc21fc3RhdHNfbWV0YV9idWYgKmJ1ZnM7Ci0JaW50IGlkeCA9IHJlcWJ1Zi0+c3RhdHNfdHlwZTsKLQlpbnQgaTsKLQotCUQoIiVzOiB0eXBlIDogJWQsIGJ1ZiBudW0gOiAlZFxuIiwgX19mdW5jX18sCi0JCXJlcWJ1Zi0+c3RhdHNfdHlwZSwgcmVxYnVmLT5udW1fYnVmKTsKLQlpZiAocmVxYnVmLT5udW1fYnVmID4gMCkgewotCQlpZiAoc3RhdHNfY3RybC0+YnVmcVtpZHhdKSB7Ci0JCQkvKiBhbHJlYWR5IGluIHVzZS4gRXJyb3IgKi8KLQkJCXByX2VycigiJXM6IHN0YXRzIHR5cGUgJWQgYWxlYWR5IHJlcXVlc3RlZCIsCi0JCQkJIF9fZnVuY19fLCByZXFidWYtPnN0YXRzX3R5cGUpOwotCQkJcmMgPSAtRUVYSVNUOwotCQkJZ290byBlbmQ7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBnb29kIGNhc2UgKi8KLQkJCWJ1ZnEgPSAoc3RydWN0IG1zbV9zdGF0c19idWZxICopCi0JCQkJa3phbGxvYygKLQkJCQkJc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfYnVmcSksCi0JCQkJCUdGUF9LRVJORUwpOwotCQkJaWYgKCFidWZxKSB7Ci0JCQkJLyogbm8gbWVtb3J5ICovCi0JCQkJcmMgPSAtRU5PTUVNOwotCQkJCXByX2VycigiJXM6IG5vIG1lbSBmb3Igc3RhdHMgdHlwZSAlZCIsCi0JCQkJCV9fZnVuY19fLCByZXFidWYtPnN0YXRzX3R5cGUpOwotCQkJCWdvdG8gZW5kOwotCQkJfQotCQkJYnVmcyA9IChzdHJ1Y3QgbXNtX3N0YXRzX21ldGFfYnVmICopCi0JCQkJa3phbGxvYygocmVxYnVmLT5udW1fYnVmICoKLQkJCQkJc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfbWV0YV9idWYpKSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIWJ1ZnMpIHsKLQkJCQkvKiBubyBtZW1vcnkgKi8KLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJcHJfZXJyKCIlczogbm8gbWVtIGZvciBzdGF0cyBidWYsIHN0YXRzIHR5cGUgPSAlZCIsCi0JCQkJCV9fZnVuY19fLCByZXFidWYtPnN0YXRzX3R5cGUpOwotCQkJCWtmcmVlKGJ1ZnEpOwotCQkJCWdvdG8gZW5kOwotCQkJfQotCQkJLyogaW5pdCBidWZxIGxpc3QgaGVhZCAqLwotCQkJSU5JVF9MSVNUX0hFQUQoJmJ1ZnEtPmhlYWQpOwotCQkJLyogc2V0IHRoZSBtZXRhIGJ1ZiBzdGF0ZSB0byBpbml0aWFsaXplZCAqLwotCQkJYnVmcS0+bnVtX2J1ZnMgPSByZXFidWYtPm51bV9idWY7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgcmVxYnVmLT5udW1fYnVmOyBpKyspCi0JCQkJYnVmc1tpXS5zdGF0ZSA9Ci0JCQkJCU1TTV9TVEFUU19CVUZGRVJfU1RBVEVfSU5JVElBTElaRUQ7Ci0JCQlidWZxLT5idWZzID0gYnVmczsKLQkJCWJ1ZnEtPm51bV9idWZzID0gcmVxYnVmLT5udW1fYnVmOwotCQkJYnVmcS0+dHlwZSA9IHJlcWJ1Zi0+c3RhdHNfdHlwZTsKLQkJCXN0YXRzX2N0cmwtPmJ1ZnFbaWR4XSA9IGJ1ZnE7Ci0JCQkvKiBkb25lIHJlcWJ1ZiAobGFyZ2VyIHRoYW4gemVybyBjYXNlKSAqLwotCQkJZ290byBlbmQ7Ci0JCX0KLQl9IGVsc2UgaWYgKHJlcWJ1Zi0+bnVtX2J1ZiA9PSAwKSB7Ci0JCWlmIChzdGF0c19jdHJsLT5idWZxW2lkeF0gPT0gTlVMTCkgewotCQkJLyogZG91YmxlIGZyZWUgY2FzZT8gKi8KLQkJCXByX2VycigiJXM6IHN0YXRzIHR5cGUgJWQgYWxlYWR5IGZyZWVkIiwKLQkJCQkgX19mdW5jX18sIHJlcWJ1Zi0+c3RhdHNfdHlwZSk7Ci0JCQlyYyA9IC1FTlhJTzsKLQkJCWdvdG8gZW5kOwotCQl9IGVsc2UgewotCQkJLyogZ29vZCBjYXNlLiBuZWVkIHRvIGRlLXJlcWJ1ZiAqLwotCQkJa2ZyZWUoc3RhdHNfY3RybC0+YnVmcVtpZHhdLT5idWZzKTsKLQkJCWtmcmVlKHN0YXRzX2N0cmwtPmJ1ZnFbaWR4XSk7Ci0JCQlzdGF0c19jdHJsLT5idWZxW2lkeF0gPSBOVUxMOwotCQkJZ290byBlbmQ7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBlcnJvciBjYXNlICovCi0JCXByX2VycigiJXM6IHN0YXRzIHR5cGUgPSAlZCwgcmVxX251bV9idWYgPSAlZCwgZXJyb3IiLAotCQkJICAgX19mdW5jX18sIHJlcWJ1Zi0+c3RhdHNfdHlwZSwgcmVxYnVmLT5udW1fYnVmKTsKLQkJcmMgPSAtRVBFUk07Ci0JCWdvdG8gZW5kOwotCX0KLWVuZDoKLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50IG1zbV9zdGF0c19kZWluaXQoc3RydWN0IG1zbV9zdGF0c19idWZxX2N0cmwgKnN0YXRzX2N0cmwpCi17Ci0JaW50IHJjID0gMDsKLQlpbnQgaTsKLQotCWlmIChzdGF0c19jdHJsLT5pbml0X2RvbmUgPT0gMCkgewotCQlwcl9lcnIoIiVzOiBub3QgaW5pdGVkIHlldC4gbm8gb3AiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQkvKiBzYWZlIGd1YXJkIGluIGNhc2UgZGVhbGxvY2F0ZSBtZW1vcnkgbm90IGRvbmUgeWV0LiAqLwotCWZvciAoaSA9IDA7IGkgPCBNU01fU1RBVFNfVFlQRV9NQVg7IGkrKykgewotCQlpZiAoc3RhdHNfY3RybC0+YnVmcVtpXSkgewotCQkJaWYgKHN0YXRzX2N0cmwtPmJ1ZnFbaV0tPmJ1ZnMpIHsKLQkJCQlyYyA9IC0xOwotCQkJCXByX2VycigiJXM6IHN0YXRzIHR5cGUgPSAlZCwgYnVmIG5vdCBmcmVlZCB5ZXQiLAotCQkJCQkgX19mdW5jX18sIGkpOwotCQkJCUJVR19PTihzdGF0c19jdHJsLT5idWZxW2ldLT5idWZzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmMgPSAtMTsKLQkJCQlwcl9lcnIoIiVzOiBzdGF0cyB0eXBlID0gJWQsIGJ1ZnEgbm90IGZyZWVkIHlldCIsCi0JCQkJCV9fZnVuY19fLCBpKTsKLQkJCQlCVUdfT04oc3RhdHNfY3RybC0+YnVmcVtpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JbWVtc2V0KHN0YXRzX2N0cmwsICAwLCAgc2l6ZW9mKHN0cnVjdCBtc21fc3RhdHNfYnVmcV9jdHJsKSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9zdGF0c19idWZfcHJlcGFyZShzdHJ1Y3QgbXNtX3N0YXRzX2J1ZnFfY3RybCAqc3RhdHNfY3RybCwKLQlzdHJ1Y3QgbXNtX3N0YXRzX2J1Zl9pbmZvICppbmZvLCBzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LAotCWludCBkb21haW5fbnVtKQotewotCXVuc2lnbmVkIGxvbmcgcGFkZHI7Ci0jaWZuZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0JdW5zaWduZWQgbG9uZyBrdnN0YXJ0OwotCXN0cnVjdCBmaWxlICpmaWxlOwotI2VuZGlmCi0JaW50IHJjID0gMDsKLQl1bnNpZ25lZCBsb25nIGxlbjsKLQlzdHJ1Y3QgbXNtX3N0YXRzX2J1ZnEgKmJ1ZnEgPSBOVUxMOwotCXN0cnVjdCBtc21fc3RhdHNfbWV0YV9idWYgKnN0YXRzX2J1ZiA9IE5VTEw7Ci0KLQlEKCIlczogdHlwZSA6ICVkLCBidWYgbnVtIDogJWRcbiIsIF9fZnVuY19fLAotCQlpbmZvLT50eXBlLCBpbmZvLT5idWZfaWR4KTsKLQotCWJ1ZnEgPSBzdGF0c19jdHJsLT5idWZxW2luZm8tPnR5cGVdOwotCXN0YXRzX2J1ZiA9ICZidWZxLT5idWZzW2luZm8tPmJ1Zl9pZHhdOwotCWlmIChzdGF0c19idWYtPnN0YXRlID09IE1TTV9TVEFUU19CVUZGRVJfU1RBVEVfVU5VU0VEKSB7Ci0JCXByX2VycigiJXM6IG5lZWQgcmVxYnVmIGZpcnN0LCBzdGF0cyB0eXBlID0gJWQiLAotCQkJX19mdW5jX18sIGluZm8tPnR5cGUpOwotCQlyYyA9IC0xOwotCQlnb3RvIG91dDE7Ci0JfQotCWlmIChzdGF0c19idWYtPnN0YXRlICE9IE1TTV9TVEFUU19CVUZGRVJfU1RBVEVfSU5JVElBTElaRUQpIHsKLQkJRCgiJXM6IHN0YXRzIGFscmVhZHkgbWFwcGVkLCBubyBvcCwgc3RhdHMgdHlwZSA9ICVkIiwKLQkJCV9fZnVuY19fLCBpbmZvLT50eXBlKTsKLQkJZ290byBvdXQxOwotCX0KLSNpZmRlZiBDT05GSUdfTVNNX01VTFRJTUVESUFfVVNFX0lPTgotCXN0YXRzX2J1Zi0+aGFuZGxlID0gaW9uX2ltcG9ydF9kbWFfYnVmKGNsaWVudCwgaW5mby0+ZmQpOwotCWlmIChJU19FUlJfT1JfTlVMTChzdGF0c19idWYtPmhhbmRsZSkpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlwcl9lcnIoIiVzOiBzdGF0c19idWYgaGFzIG51bGwvZXJyb3IgSU9OIGhhbmRsZSAlcCIsCi0JCQkgICBfX2Z1bmNfXywgc3RhdHNfYnVmLT5oYW5kbGUpOwotCQlnb3RvIG91dDE7Ci0JfQotCWlmIChpb25fbWFwX2lvbW11KGNsaWVudCwgc3RhdHNfYnVmLT5oYW5kbGUsCi0JCQlkb21haW5fbnVtLCAwLCBTWl80SywKLQkJCTAsICZwYWRkciwgJmxlbiwgMCwgMCkgPCAwKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJcHJfZXJyKCIlczogY2Fubm90IG1hcCBhZGRyZXNzIiwgX19mdW5jX18pOwotCQlnb3RvIG91dDI7Ci0JfQotI2Vsc2UKLQlwYWRkciA9IDA7Ci0JZmlsZSA9IE5VTEw7Ci0Ja3ZzdGFydCA9IDA7Ci0jZW5kaWYKLQlpZiAoIWluZm8tPmxlbikKLQkJaW5mby0+bGVuID0gbGVuOwotCXBhZGRyICs9IGluZm8tPm9mZnNldDsKLQlsZW4gPSBpbmZvLT5sZW47Ci0Jc3RhdHNfYnVmLT5wYWRkciA9IHBhZGRyOwotCXN0YXRzX2J1Zi0+bGVuID0gbGVuOwotCW1lbWNweSgmc3RhdHNfYnVmLT5pbmZvLCBpbmZvLCBzaXplb2Yoc3RhdHNfYnVmLT5pbmZvKSk7Ci0JRCgiJXMgQWRkaW5nIGJ1ZiB0byBsaXN0IHdpdGggdHlwZSAlZFxuIiwgX19mdW5jX18sCi0JICBzdGF0c19idWYtPmluZm8udHlwZSk7Ci0JRCgiJXMgcG1lbV9zdGF0cyBhZGRyZXNzIGlzIDB4JWxkXG4iLCBfX2Z1bmNfXywgcGFkZHIpOwotCXN0YXRzX2J1Zi0+c3RhdGUgPSBNU01fU1RBVFNfQlVGRkVSX1NUQVRFX1BSRVBBUkVEOwotCXJldHVybiAwOwotI2lmZGVmIENPTkZJR19NU01fTVVMVElNRURJQV9VU0VfSU9OCi0JaW9uX3VubWFwX2lvbW11KGNsaWVudCwgc3RhdHNfYnVmLT5oYW5kbGUsIGRvbWFpbl9udW0sIDApOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX01TTV9NVUxUSU1FRElBX1VTRV9JT04KLW91dDI6Ci0JaW9uX2ZyZWUoY2xpZW50LCBzdGF0c19idWYtPmhhbmRsZSk7Ci0jZW5kaWYKLW91dDE6Ci0JcmV0dXJuIHJjOwotfQotc3RhdGljIGludCBtc21fc3RhdHNfYnVmX3VucHJlcGFyZShzdHJ1Y3QgbXNtX3N0YXRzX2J1ZnFfY3RybCAqc3RhdHNfY3RybCwKLQllbnVtIG1zbV9zdGF0c19lbnVtX3R5cGUgc3RhdHNfdHlwZSwgaW50IGJ1Zl9pZHgsCi0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgaW50IGRvbWFpbl9udW0pCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX3N0YXRzX2J1ZnEgKmJ1ZnEgPSBOVUxMOwotCXN0cnVjdCBtc21fc3RhdHNfbWV0YV9idWYgKnN0YXRzX2J1ZiA9IE5VTEw7Ci0KLQlEKCIlczogdHlwZSA6ICVkLCBpZHggOiAlZFxuIiwgX19mdW5jX18sIHN0YXRzX3R5cGUsIGJ1Zl9pZHgpOwotCWJ1ZnEgPSBzdGF0c19jdHJsLT5idWZxW3N0YXRzX3R5cGVdOwotCXN0YXRzX2J1ZiA9ICZidWZxLT5idWZzW2J1Zl9pZHhdOwotCWlmIChzdGF0c19idWYtPnN0YXRlID09IE1TTV9TVEFUU19CVUZGRVJfU1RBVEVfVU5VU0VEKSB7Ci0JCXByX2VycigiJXM6IG5lZWQgcmVxYnVmIGZpcnN0LCBzdGF0cyB0eXBlID0gJWQiLAotCQkJX19mdW5jX18sIHN0YXRzX3R5cGUpOwotCQlyYyA9IC0xOwotCQlnb3RvIGVuZDsKLQl9Ci0JaWYgKHN0YXRzX2J1Zi0+c3RhdGUgPT0gTVNNX1NUQVRTX0JVRkZFUl9TVEFURV9JTklUSUFMSVpFRCkgewotCQlEKCIlczogc3RhdHMgYWxyZWFkeSBtYXBwZWQsIG5vIG9wLCBzdGF0cyB0eXBlID0gJWQiLAotCQkJX19mdW5jX18sIHN0YXRzX3R5cGUpOwotCQlnb3RvIGVuZDsKLQl9Ci0jaWZkZWYgQ09ORklHX01TTV9NVUxUSU1FRElBX1VTRV9JT04KLQlpb25fdW5tYXBfaW9tbXUoY2xpZW50LCBzdGF0c19idWYtPmhhbmRsZSwKLQkJCQkJZG9tYWluX251bSwgMCk7Ci0JaW9uX2ZyZWUoY2xpZW50LCBzdGF0c19idWYtPmhhbmRsZSk7Ci0jZW5kaWYKLQlpZiAoc3RhdHNfYnVmLT5zdGF0ZSA9PSBNU01fU1RBVFNfQlVGRkVSX1NUQVRFX1FVRVVFRCkgewotCQkvKiBidWYgcXVldWVkIG5lZWQgZGVsZXRlIGZyb20gbGlzdCAqLwotCQlEKCIlczogZGVsZXRlIHN0YXRzIGJ1ZiwgdHlwZSA9ICVkLCBpZHggPSAlZCIsCi0JCSAgX19mdW5jX18sICBzdGF0c190eXBlLCAgYnVmX2lkeCk7Ci0JCWxpc3RfZGVsX2luaXQoJnN0YXRzX2J1Zi0+bGlzdCk7Ci0JfQotZW5kOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fc3RhdHNfYnVmcV9mbHVzaChzdHJ1Y3QgbXNtX3N0YXRzX2J1ZnFfY3RybCAqc3RhdHNfY3RybCwKLQllbnVtIG1zbV9zdGF0c19lbnVtX3R5cGUgc3RhdHNfdHlwZSwgc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCkKLXsKLQlpbnQgcmMgPSAwOwotCWludCBpOwotCXN0cnVjdCBtc21fc3RhdHNfYnVmcSAqYnVmcSA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9zdGF0c19tZXRhX2J1ZiAqc3RhdHNfYnVmID0gTlVMTDsKLQotCUQoIiVzOiB0eXBlIDogJWRcbiIsIF9fZnVuY19fLCBzdGF0c190eXBlKTsKLQlidWZxID0gc3RhdHNfY3RybC0+YnVmcVtzdGF0c190eXBlXTsKLQotCWZvciAoaSA9IDA7IGkgPCBidWZxLT5udW1fYnVmczsgaSsrKSB7Ci0JCXN0YXRzX2J1ZiA9ICZidWZxLT5idWZzW2ldOwotCQlzd2l0Y2ggKHN0YXRzX2J1Zi0+c3RhdGUpIHsKLQkJY2FzZSBNU01fU1RBVFNfQlVGRkVSX1NUQVRFX1FVRVVFRDoKLQkJCS8qIGJ1ZiBxdWV1ZWQgaW4gc3RhdHMgZnJlZSBxdWV1ZSAqLwotCQkJc3RhdHNfYnVmLT5zdGF0ZSA9IE1TTV9TVEFUU19CVUZGRVJfU1RBVEVfUFJFUEFSRUQ7Ci0JCQlsaXN0X2RlbF9pbml0KCZzdGF0c19idWYtPmxpc3QpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNNX1NUQVRTX0JVRkZFUl9TVEFURV9ERVFVRVVFRDoKLQkJCS8qIGlmIHN0YXRzIGJ1ZiBpbiBWRkUgcmVzZXQgdGhlIHN0YXRlICovCi0JCQlzdGF0c19idWYtPnN0YXRlID0gTVNNX1NUQVRTX0JVRkZFUl9TVEFURV9QUkVQQVJFRDsKLQkJCWJyZWFrOwotCQljYXNlIE1TTV9TVEFUU19CVUZGRVJfU1RBVEVfRElTUEFUQ0hFRDoKLQkJCS8qIGlmIHN0YXRzIGJ1ZiBpbiB1c2Vyc3BhY2UgcmVzZXQgdGhlIHN0YXRlICovCi0JCQlzdGF0c19idWYtPnN0YXRlID0gTVNNX1NUQVRTX0JVRkZFUl9TVEFURV9QUkVQQVJFRDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9zdGF0c19kcWJ1ZihzdHJ1Y3QgbXNtX3N0YXRzX2J1ZnFfY3RybCAqc3RhdHNfY3RybCwKLQllbnVtIG1zbV9zdGF0c19lbnVtX3R5cGUgc3RhdHNfdHlwZSwKLQlzdHJ1Y3QgbXNtX3N0YXRzX21ldGFfYnVmICoqcHBfc3RhdHNfYnVmKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9zdGF0c19idWZxICpidWZxID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX3N0YXRzX21ldGFfYnVmICpzdGF0c19idWYgPSBOVUxMOwotCi0JRCgiJXM6IHR5cGUgOiAlZFxuIiwgX19mdW5jX18sIHN0YXRzX3R5cGUpOwotCSpwcF9zdGF0c19idWYgPSBOVUxMOwotCWJ1ZnEgPSBzdGF0c19jdHJsLT5idWZxW3N0YXRzX3R5cGVdOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShzdGF0c19idWYsICZidWZxLT5oZWFkLCBsaXN0KSB7Ci0JCWlmIChzdGF0c19idWYtPnN0YXRlID09IE1TTV9TVEFUU19CVUZGRVJfU1RBVEVfUVVFVUVEKSB7Ci0JCQkvKiBmb3VuZCBvbmUgYnVmICovCi0JCQlsaXN0X2RlbF9pbml0KCZzdGF0c19idWYtPmxpc3QpOwotCQkJKnBwX3N0YXRzX2J1ZiA9IHN0YXRzX2J1ZjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICghKCpwcF9zdGF0c19idWYpKSB7Ci0JCUQoIiVzOiBubyBmcmVlIHN0YXRzIGJ1ZiwgdHlwZSA9ICVkIiwKLQkJCV9fZnVuY19fLCBzdGF0c190eXBlKTsKLQkJcmMgPSAtMTsKLQkJcmV0dXJuIHJjOwotCX0KLQlzdGF0c19idWYtPnN0YXRlID0gTVNNX1NUQVRTX0JVRkZFUl9TVEFURV9ERVFVRVVFRDsKLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIGludCBtc21fc3RhdHNfcXVlcnlidWYoc3RydWN0IG1zbV9zdGF0c19idWZxX2N0cmwgKnN0YXRzX2N0cmwsCi0Jc3RydWN0IG1zbV9zdGF0c19idWZfaW5mbyAqaW5mbywKLQlzdHJ1Y3QgbXNtX3N0YXRzX21ldGFfYnVmICoqcHBfc3RhdHNfYnVmKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9zdGF0c19idWZxICpidWZxID0gTlVMTDsKLQotCSpwcF9zdGF0c19idWYgPSBOVUxMOwotCUQoIiVzOiBzdGF0cyB0eXBlIDogJWQsIGJ1Zl9pZHggOiAlZCIsIF9fZnVuY19fLCBpbmZvLT50eXBlLAotCQkgICBpbmZvLT5idWZfaWR4KTsKLQlidWZxID0gc3RhdHNfY3RybC0+YnVmcVtpbmZvLT50eXBlXTsKLQkqcHBfc3RhdHNfYnVmID0gJmJ1ZnEtPmJ1ZnNbaW5mby0+YnVmX2lkeF07Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3N0YXRzX3FidWYoc3RydWN0IG1zbV9zdGF0c19idWZxX2N0cmwgKnN0YXRzX2N0cmwsCi0JZW51bSBtc21fc3RhdHNfZW51bV90eXBlIHN0YXRzX3R5cGUsCi0JaW50IGJ1Zl9pZHgpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX3N0YXRzX2J1ZnEgKmJ1ZnEgPSBOVUxMOwotCXN0cnVjdCBtc21fc3RhdHNfbWV0YV9idWYgKnN0YXRzX2J1ZiA9IE5VTEw7Ci0JRCgiJXM6IHN0YXRzIHR5cGUgOiAlZCwgYnVmX2lkeCA6ICVkIiwgX19mdW5jX18sIHN0YXRzX3R5cGUsCi0JCSAgIGJ1Zl9pZHgpOwotCi0JYnVmcSA9IHN0YXRzX2N0cmwtPmJ1ZnFbc3RhdHNfdHlwZV07Ci0JaWYgKCFidWZxKSB7Ci0JCXByX2VycigiJXM6IG51bGwgYnVmcSwgc3RhdHMgdHlwZSA9ICVkIiwgX19mdW5jX18sIHN0YXRzX3R5cGUpOwotCQlyYyA9IC0xOwotCQlnb3RvIGVuZDsKLQl9Ci0JaWYgKGJ1Zl9pZHggPj0gYnVmcS0+bnVtX2J1ZnMpIHsKLQkJcHJfZXJyKCIlczogc3RhdHMgdHlwZSA9ICVkLCBpdHMgaWR4ICVkIGxhcmdlciB0aGFuIGJ1ZiBjb3VudCAlZCIsCi0JCQkgICBfX2Z1bmNfXywgc3RhdHNfdHlwZSwgYnVmX2lkeCwgYnVmcS0+bnVtX2J1ZnMpOwotCQlyYyA9IC0xOwotCQlnb3RvIGVuZDsKLQl9Ci0Jc3RhdHNfYnVmID0gJmJ1ZnEtPmJ1ZnNbYnVmX2lkeF07Ci0Jc3dpdGNoIChzdGF0c19idWYtPnN0YXRlKSB7Ci0JY2FzZSBNU01fU1RBVFNfQlVGRkVSX1NUQVRFX1BSRVBBUkVEOgotCWNhc2UgTVNNX1NUQVRTX0JVRkZFUl9TVEFURV9ERVFVRVVFRDoKLQljYXNlIE1TTV9TVEFUU19CVUZGRVJfU1RBVEVfRElTUEFUQ0hFRDoKLQkJc3RhdHNfYnVmLT5zdGF0ZSA9IE1TTV9TVEFUU19CVUZGRVJfU1RBVEVfUVVFVUVEOwotCQlsaXN0X2FkZF90YWlsKCZzdGF0c19idWYtPmxpc3QsICZidWZxLT5oZWFkKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogaW5jb3JyZWN0IHN0YXRlID0gJWQsIHN0YXRzIHR5cGUgPSAlZCwgY2Fubm90IHFidWYiLAotCQkJICAgX19mdW5jX18sIHN0YXRzX2J1Zi0+c3RhdGUsIHN0YXRzX3R5cGUpOwotCQlyYyA9IC0xOwotCQlicmVhazsKLQl9Ci1lbmQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9zdGF0c19idWZfZGlzcGF0Y2goc3RydWN0IG1zbV9zdGF0c19idWZxX2N0cmwgKnN0YXRzX2N0cmwsCi0JZW51bSBtc21fc3RhdHNfZW51bV90eXBlIHN0YXRzX3R5cGUsCi0JdW5zaWduZWQgbG9uZyBwaHlfYWRkciwgaW50ICpidWZfaWR4LAotCXZvaWQgKip2YWRkciwgaW50ICpmZCwKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50KQotewotCWludCByYyA9IDA7Ci0JaW50IGk7Ci0Jc3RydWN0IG1zbV9zdGF0c19idWZxICpidWZxID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX3N0YXRzX21ldGFfYnVmICpzdGF0c19idWYgPSBOVUxMOwotCUQoIiVzOiBzdGF0cyB0eXBlIDogJWRcbiIsIF9fZnVuY19fLCBzdGF0c190eXBlKTsKLQotCSpidWZfaWR4ID0gLTE7Ci0JKnZhZGRyID0gTlVMTDsKLQkqZmQgPSAwOwotCWJ1ZnEgPSBzdGF0c19jdHJsLT5idWZxW3N0YXRzX3R5cGVdOwotCWZvciAoaSA9IDA7IGkgPCBidWZxLT5udW1fYnVmczsgaSsrKSB7Ci0JCWlmIChidWZxLT5idWZzW2ldLnBhZGRyID09IHBoeV9hZGRyKSB7Ci0JCQlzdGF0c19idWYgPSAmYnVmcS0+YnVmc1tpXTsKLQkJCSpidWZfaWR4ID0gaTsKLQkJCSp2YWRkciA9IHN0YXRzX2J1Zi0+aW5mby52YWRkcjsKLQkJCSpmZCA9IHN0YXRzX2J1Zi0+aW5mby5mZDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICghc3RhdHNfYnVmKSB7Ci0JCXByX2VycigiJXM6IG5vIG1hdGNoLCBwaHlfYWRkciA9IDB4JWxkLCBzdGF0c190eXBlID0gJWQiLAotCQkJICAgX19mdW5jX18sIHBoeV9hZGRyLCBzdGF0c190eXBlKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCXN3aXRjaCAoc3RhdHNfYnVmLT5zdGF0ZSkgewotCWNhc2UgTVNNX1NUQVRTX0JVRkZFUl9TVEFURV9ERVFVRVVFRDoKLQkJc3RhdHNfYnVmLT5zdGF0ZSA9IE1TTV9TVEFUU19CVUZGRVJfU1RBVEVfRElTUEFUQ0hFRDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogdHlwZSA9ICVkLCBpZHggPSAlZCwgY3VyX3N0YXRlID0gJWQsXG4iCi0JCQkgICAiY2Fubm90IHNldCBzdGF0ZSB0byBESVNQQVRDSEVEXG4iLAotCQkJICAgX19mdW5jX18sIHN0YXRzX3R5cGUsICpidWZfaWR4LCBzdGF0c19idWYtPnN0YXRlKTsKLQkJcmMgPSAtRUZBVUxUOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotc3RhdGljIGludCBtc21fc3RhdHNfZW5xdWV1ZV9idWYoc3RydWN0IG1zbV9zdGF0c19idWZxX2N0cmwgKnN0YXRzX2N0cmwsCi0Jc3RydWN0IG1zbV9zdGF0c19idWZfaW5mbyAqaW5mbywgc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKLQlpbnQgZG9tYWluX251bSkKLXsKLQlpbnQgcmMgPSAwOwotCUQoIiVzOiBzdGF0cyB0eXBlIDogJWQsIGlkeCA6ICVkXG4iLCBfX2Z1bmNfXywKLQkJaW5mby0+dHlwZSwgaW5mby0+YnVmX2lkeCk7Ci0JcmMgPSBtc21fc3RhdHNfYnVmX3ByZXBhcmUoc3RhdHNfY3RybCwgaW5mbywgY2xpZW50LCBkb21haW5fbnVtKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IGJ1Zl9wcmVwYXJlIGZhaWxlZCwgcmMgPSAlZCIsIF9fZnVuY19fLCByYyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyYyA9IG1zbV9zdGF0c19xYnVmKHN0YXRzX2N0cmwsICAgaW5mby0+dHlwZSwgaW5mby0+YnVmX2lkeCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBtc21fc3RhdHNfcWJ1ZiBmYWlsZWQsIHJjID0gJWQiLCBfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX3N0YXRzX2J1Zl9vcHNfaW5pdChzdHJ1Y3QgbXNtX3N0YXRzX2J1ZnFfY3RybCAqc3RhdHNfY3RybCwKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgbXNtX3N0YXRzX29wcyAqb3BzKQotewotCW9wcy0+c3RhdHNfY3RybCA9IHN0YXRzX2N0cmw7Ci0Jb3BzLT5jbGllbnQgPSBjbGllbnQ7Ci0Jb3BzLT5lbnF1ZXVlX2J1ZiA9IG1zbV9zdGF0c19lbnF1ZXVlX2J1ZjsKLQlvcHMtPnFidWYgPSBtc21fc3RhdHNfcWJ1ZjsKLQlvcHMtPmRxYnVmID0gbXNtX3N0YXRzX2RxYnVmOwotCW9wcy0+YnVmcV9mbHVzaCA9IG1zbV9zdGF0c19idWZxX2ZsdXNoOwotCW9wcy0+YnVmX3VucHJlcGFyZSA9IG1zbV9zdGF0c19idWZfdW5wcmVwYXJlOwotCW9wcy0+YnVmX3ByZXBhcmUgPSBtc21fc3RhdHNfYnVmX3ByZXBhcmU7Ci0Jb3BzLT5yZXFidWYgPSBtc21fc3RhdHNfcmVxYnVmOwotCW9wcy0+cXVlcnlidWYgPSBtc21fc3RhdHNfcXVlcnlidWY7Ci0Jb3BzLT5kaXNwYXRjaCA9IG1zbV9zdGF0c19idWZfZGlzcGF0Y2g7Ci0Jb3BzLT5zdGF0c19jdHJsX2luaXQgPSBtc21fc3RhdHNfaW5pdDsKLQlvcHMtPnN0YXRzX2N0cmxfZGVpbml0ID0gbXNtX3N0YXRzX2RlaW5pdDsKLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlX3N0YXRzX2J1Zi5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3ZmZS9tc21fdmZlX3N0YXRzX2J1Zi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTFjNzlkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92ZmUvbXNtX3ZmZV9zdGF0c19idWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfTVNNX1NUQVRTX0JVRl9IXwotI2RlZmluZSBfTVNNX1NUQVRTX0JVRl9IXwotCi1lbnVtIG1zbV9zdGF0c19idWZmZXJfc3RhdGUgewotCU1TTV9TVEFUU19CVUZGRVJfU1RBVEVfVU5VU0VELAkgIC8qIG5vdCB1c2VkICovCi0JTVNNX1NUQVRTX0JVRkZFUl9TVEFURV9JTklUSUFMSVpFRCwJICAgLyogUkVRQlVGIGRvbmUgKi8KLQlNU01fU1RBVFNfQlVGRkVSX1NUQVRFX1BSRVBBUkVELAkvKiBCVUYgbWFwcGVkICovCi0JTVNNX1NUQVRTX0JVRkZFUl9TVEFURV9RVUVVRUQsCSAgLyogYnVmIHF1ZXVlZCAqLwotCU1TTV9TVEFUU19CVUZGRVJfU1RBVEVfREVRVUVVRUQsCS8qIGluIHVzZSBpbiBWRkUgKi8KLQlNU01fU1RBVFNfQlVGRkVSX1NUQVRFX0RJU1BBVENIRUQsCSAgLyogc2VudCB0byB1c2Vyc3BhY2UgKi8KLX07Ci0KLXN0cnVjdCBtc21fc3RhdHNfbWV0YV9idWYgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQllbnVtIG1zbV9zdGF0c19idWZmZXJfc3RhdGUgc3RhdGU7Ci0JaW50IHR5cGU7Ci0JaW50IGZkOwotCXVpbnQzMl90IG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIHBhZGRyOwotCXVuc2lnbmVkIGxvbmcgbGVuOwotCXN0cnVjdCBmaWxlICpmaWxlOwotCXN0cnVjdCBtc21fc3RhdHNfYnVmX2luZm8gaW5mbzsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOwotfTsKLQotc3RydWN0IG1zbV9zdGF0c19idWZxIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7Ci0JaW50IG51bV9idWZzOwotCWludCB0eXBlOwotCXN0cnVjdCBtc21fc3RhdHNfbWV0YV9idWYgKmJ1ZnM7Ci19OwotCi0KLXN0cnVjdCBtc21fc3RhdHNfYnVmcV9jdHJsIHsKLQkvKiBub3QgdXNlIHNwaW4gbG9jayBmb3Igbm93LiBBc3N1bWUgdmZlIGhvbGRzIHNwaW4gbG9jayAqLwotCXNwaW5sb2NrX3QgbG9jazsKLQlpbnQgaW5pdF9kb25lOwotCXN0cnVjdCBtc21fc3RhdHNfYnVmcSAqYnVmcVtNU01fU1RBVFNfVFlQRV9NQVhdOwotfTsKLQotc3RydWN0IG1zbV9zdGF0c19vcHMgewotCXN0cnVjdCBtc21fc3RhdHNfYnVmcV9jdHJsICpzdGF0c19jdHJsOwotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQ7Ci0JaW50ICgqZW5xdWV1ZV9idWYpIChzdHJ1Y3QgbXNtX3N0YXRzX2J1ZnFfY3RybCAqc3RhdHNfY3RybCwKLQkJCQlzdHJ1Y3QgbXNtX3N0YXRzX2J1Zl9pbmZvICppbmZvLAotCQkJCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIGludCBkb21haW5fbnVtKTsKLQlpbnQgKCpxYnVmKSAoc3RydWN0IG1zbV9zdGF0c19idWZxX2N0cmwgKnN0YXRzX2N0cmwsCi0JCQkJIGVudW0gbXNtX3N0YXRzX2VudW1fdHlwZSBzdGF0c190eXBlLAotCQkJCSBpbnQgYnVmX2lkeCk7Ci0JaW50ICgqZHFidWYpIChzdHJ1Y3QgbXNtX3N0YXRzX2J1ZnFfY3RybCAqc3RhdHNfY3RybCwKLQkJCQkgIGVudW0gbXNtX3N0YXRzX2VudW1fdHlwZSBzdGF0c190eXBlLAotCQkJCSAgc3RydWN0IG1zbV9zdGF0c19tZXRhX2J1ZiAqKnBwX3N0YXRzX2J1Zik7Ci0JaW50ICgqYnVmcV9mbHVzaCkgKHN0cnVjdCBtc21fc3RhdHNfYnVmcV9jdHJsICpzdGF0c19jdHJsLAotCQkJCQkgICBlbnVtIG1zbV9zdGF0c19lbnVtX3R5cGUgc3RhdHNfdHlwZSwKLQkJCQkJICAgc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCk7Ci0JaW50ICgqYnVmX3VucHJlcGFyZSkgKHN0cnVjdCBtc21fc3RhdHNfYnVmcV9jdHJsICpzdGF0c19jdHJsLAotCQllbnVtIG1zbV9zdGF0c19lbnVtX3R5cGUgc3RhdHNfdHlwZSwKLQkJaW50IGJ1Zl9pZHgsCi0JCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIGludCBkb21haW5fbnVtKTsKLQlpbnQgKCpidWZfcHJlcGFyZSkgKHN0cnVjdCBtc21fc3RhdHNfYnVmcV9jdHJsICpzdGF0c19jdHJsLAotCQkJCXN0cnVjdCBtc21fc3RhdHNfYnVmX2luZm8gKmluZm8sCi0JCQkJc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgaW50IGRvbWFpbl9udW0pOwotCWludCAoKnJlcWJ1ZikgKHN0cnVjdCBtc21fc3RhdHNfYnVmcV9jdHJsICpzdGF0c19jdHJsLAotCQkJCSAgIHN0cnVjdCBtc21fc3RhdHNfcmVxYnVmICpyZXFidWYsCi0JCQkJICAgc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCk7Ci0JaW50ICgqZGlzcGF0Y2gpIChzdHJ1Y3QgbXNtX3N0YXRzX2J1ZnFfY3RybCAqc3RhdHNfY3RybCwKLQkJZW51bSBtc21fc3RhdHNfZW51bV90eXBlIHN0YXRzX3R5cGUsCi0JCXVuc2lnbmVkIGxvbmcgcGh5X2FkZHIsIGludCAqYnVmX2lkeCwgdm9pZCAqKnZhZGRyLCBpbnQgKmZkLAotCQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50KTsKLQlpbnQgKCpxdWVyeWJ1ZikgKHN0cnVjdCBtc21fc3RhdHNfYnVmcV9jdHJsICpzdGF0c19jdHJsLAotCQlzdHJ1Y3QgbXNtX3N0YXRzX2J1Zl9pbmZvICppbmZvLAotCQlzdHJ1Y3QgbXNtX3N0YXRzX21ldGFfYnVmICoqcHBfc3RhdHNfYnVmKTsKLQlpbnQgKCpzdGF0c19jdHJsX2luaXQpIChzdHJ1Y3QgbXNtX3N0YXRzX2J1ZnFfY3RybCAqc3RhdHNfY3RybCk7Ci0JaW50ICgqc3RhdHNfY3RybF9kZWluaXQpIChzdHJ1Y3QgbXNtX3N0YXRzX2J1ZnFfY3RybCAqc3RhdHNfY3RybCk7Ci19OwotCi1pbnQgbXNtX3N0YXRzX2J1Zl9vcHNfaW5pdChzdHJ1Y3QgbXNtX3N0YXRzX2J1ZnFfY3RybCAqc3RhdHNfY3RybCwKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgbXNtX3N0YXRzX29wcyAqb3BzKTsKLQotI2VuZGlmIC8qIF9NU01fU1RBVFNfQlVGX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdng2OTUzLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdng2OTUzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMDlhMGQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3Z4Njk1My5jCisrKyAvZGV2L251bGwKQEAgLTEsMzY2NyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlICJ2eDY5NTMuaCIKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JU0VOU09SIFJFR0lTVEVSIERFRklORVMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2RlZmluZSBSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRAkJCTB4MDEwNAotI2RlZmluZSBHUk9VUEVEX1BBUkFNRVRFUl9IT0xEX09GRgkJCTB4MDAKLSNkZWZpbmUgR1JPVVBFRF9QQVJBTUVURVJfSE9MRAkJCQkweDAxCi0jZGVmaW5lIFJFR19NT0RFX1NFTEVDVAkJCQkJMHgwMTAwCi0jZGVmaW5lIE1PREVfU0VMRUNUX1NUQU5EQllfTU9ERQkJCTB4MDAKLSNkZWZpbmUgTU9ERV9TRUxFQ1RfU1RSRUFNCQkJCTB4MDEKLS8qIEludGVncmF0aW9uIFRpbWUgKi8KLSNkZWZpbmUgUkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0hJCQkJMHgwMjAyCi0jZGVmaW5lIFJFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9MTwkJCTB4MDIwMwotLyogR2FpbiAqLwotI2RlZmluZSBSRUdfQU5BTE9HVUVfR0FJTl9DT0RFX0dMT0JBTF9ISQkJMHgwMjA0Ci0jZGVmaW5lIFJFR19BTkFMT0dVRV9HQUlOX0NPREVfR0xPQkFMX0xPCQkweDAyMDUKLS8qIERpZ2l0YWwgR2FpbiAqLwotI2RlZmluZSBSRUdfRElHSVRBTF9HQUlOX0dSRUVOX1JfSEkJCQkweDAyMEUKLSNkZWZpbmUgUkVHX0RJR0lUQUxfR0FJTl9HUkVFTl9SX0xPCQkJMHgwMjBGCi0jZGVmaW5lIFJFR19ESUdJVEFMX0dBSU5fUkVEX0hJCQkJCTB4MDIxMAotI2RlZmluZSBSRUdfRElHSVRBTF9HQUlOX1JFRF9MTwkJCQkweDAyMTEKLSNkZWZpbmUgUkVHX0RJR0lUQUxfR0FJTl9CTFVFX0hJCQkJMHgwMjEyCi0jZGVmaW5lIFJFR19ESUdJVEFMX0dBSU5fQkxVRV9MTwkJCTB4MDIxMwotI2RlZmluZSBSRUdfRElHSVRBTF9HQUlOX0dSRUVOX0JfSEkJCQkweDAyMTQKLSNkZWZpbmUgUkVHX0RJR0lUQUxfR0FJTl9HUkVFTl9CX0xPCQkJMHgwMjE1Ci0vKiBvdXRwdXQgYml0cyBzZXR0aW5nICovCi0jZGVmaW5lIFJFR18weDAxMTIJCQkJCTB4MDExMgotI2RlZmluZSBSRUdfMHgwMTEzCQkJCQkweDAxMTMKLS8qIFBMTCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUkVHX1ZUX1BJWF9DTEtfRElWCQkJCTB4MDMwMQotI2RlZmluZSBSRUdfUFJFX1BMTF9DTEtfRElWCQkJCTB4MDMwNQotI2RlZmluZSBSRUdfUExMX01VTFRJUExJRVIJCQkJMHgwMzA3Ci0jZGVmaW5lIFJFR19PUF9QSVhfQ0xLX0RJVgkJCQkweDAzMDkKLSNkZWZpbmUgUkVHXzB4MDM0YwkJCQkJMHgwMzRjCi0jZGVmaW5lIFJFR18weDAzNGQJCQkJCTB4MDM0ZAotI2RlZmluZSBSRUdfMHgwMzRlCQkJCQkweDAzNGUKLSNkZWZpbmUgUkVHXzB4MDM0ZgkJCQkJMHgwMzRmCi0jZGVmaW5lIFJFR18weDAzODcJCQkJCTB4MDM4NwotI2RlZmluZSBSRUdfMHgwMzgzCQkJCQkweDAzODMKLSNkZWZpbmUgUkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19ISQkJCTB4MDM0MAotI2RlZmluZSBSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0xPCQkJMHgwMzQxCi0jZGVmaW5lIFJFR19MSU5FX0xFTkdUSF9QQ0tfSEkJCQkJMHgwMzQyCi0jZGVmaW5lIFJFR19MSU5FX0xFTkdUSF9QQ0tfTE8JCQkJMHgwMzQzCi0jZGVmaW5lIFJFR18weDMwMzAJCQkJCTB4MzAzMAotI2RlZmluZSBSRUdfMHgwMTExCQkJCQkweDAxMTEKLSNkZWZpbmUgUkVHXzB4MDEzNgkJCQkJMHgwMTM2Ci0jZGVmaW5lIFJFR18weDAxMzcJCQkJCTB4MDEzNwotI2RlZmluZSBSRUdfMHgwYjAwCQkJCQkweDBiMDAKLSNkZWZpbmUgUkVHXzB4MzAwMQkJCQkJMHgzMDAxCi0jZGVmaW5lIFJFR18weDMwMDQJCQkJCTB4MzAwNAotI2RlZmluZSBSRUdfMHgzMDA3CQkJCQkweDMwMDcKLSNkZWZpbmUgUkVHXzB4MzAxYQkJCQkJMHgzMDFhCi0jZGVmaW5lIFJFR18weDMxMDEJCQkJCTB4MzEwMQotI2RlZmluZSBSRUdfMHgzMzY0CQkJCQkweDMzNjQKLSNkZWZpbmUgUkVHXzB4MzM2NQkJCQkJMHgzMzY1Ci0jZGVmaW5lIFJFR18weDBiODMJCQkJCTB4MGI4MwotI2RlZmluZSBSRUdfMHgwYjg0CQkJCQkweDBiODQKLSNkZWZpbmUgUkVHXzB4MGI4NQkJCQkJMHgwYjg1Ci0jZGVmaW5lIFJFR18weDBiODgJCQkJCTB4MGI4OAotI2RlZmluZSBSRUdfMHgwYjg5CQkJCQkweDBiODkKLSNkZWZpbmUgUkVHXzB4MGI4YQkJCQkJMHgwYjhhCi0jZGVmaW5lIFJFR18weDMwMDUJCQkJCTB4MzAwNQotI2RlZmluZSBSRUdfMHgzMDEwCQkJCQkweDMwMTAKLSNkZWZpbmUgUkVHXzB4MzAzNgkJCQkJMHgzMDM2Ci0jZGVmaW5lIFJFR18weDMwNDEJCQkJCTB4MzA0MQotI2RlZmluZSBSRUdfMHgwYjgwCQkJCQkweDBiODAKLSNkZWZpbmUgUkVHXzB4MDkwMAkJCQkJMHgwOTAwCi0jZGVmaW5lIFJFR18weDA5MDEJCQkJCTB4MDkwMQotI2RlZmluZSBSRUdfMHgwOTAyCQkJCQkweDA5MDIKLSNkZWZpbmUgUkVHXzB4MzAxNgkJCQkJMHgzMDE2Ci0jZGVmaW5lIFJFR18weDMwMWQJCQkJCTB4MzAxZAotI2RlZmluZSBSRUdfMHgzMTdlCQkJCQkweDMxN2UKLSNkZWZpbmUgUkVHXzB4MzE3ZgkJCQkJMHgzMTdmCi0jZGVmaW5lIFJFR18weDM0MDAJCQkJCTB4MzQwMAotI2RlZmluZSBSRUdfMHgzMDNhCQkJCQkweDMwM2EKLSNkZWZpbmUgUkVHXzB4MTcxNgkJCQkJMHgxNzE2Ci0jZGVmaW5lIFJFR18weDE3MTcJCQkJCTB4MTcxNwotI2RlZmluZSBSRUdfMHgxNzE4CQkJCQkweDE3MTgKLSNkZWZpbmUgUkVHXzB4MTcxOQkJCQkJMHgxNzE5Ci0jZGVmaW5lIFJFR18weDMwMDYJCQkJCTB4MzAwNgotI2RlZmluZSBSRUdfMHgzMDFiCQkJCQkweDMwMWIKLSNkZWZpbmUgUkVHXzB4MzA5OAkJCQkJMHgzMDk4Ci0jZGVmaW5lIFJFR18weDMwOWQJCQkJCTB4MzA5ZAotI2RlZmluZSBSRUdfMHgzMDExCQkJCQkweDMwMTEKLSNkZWZpbmUgUkVHXzB4MzAzNQkJCQkJMHgzMDM1Ci0jZGVmaW5lIFJFR18weDMwNDUJCQkJCTB4MzA0NQotI2RlZmluZSBSRUdfMHgzMjEwCQkJCQkweDMyMTAKLSNkZWZpbmUJUkVHXzB4MDExMQkJCQkJMHgwMTExCi0jZGVmaW5lIFJFR18weDM0MTAJCQkJCTB4MzQxMAotI2RlZmluZSBSRUdfMHgwYjA2CQkJCQkweDBiMDYKLSNkZWZpbmUgUkVHXzB4MGIwNwkJCQkJMHgwYjA3Ci0jZGVmaW5lIFJFR18weDBiMDgJCQkJCTB4MGIwOAotI2RlZmluZSBSRUdfMHgwYjA5CQkJCQkweDBiMDkKLSNkZWZpbmUgUkVHXzB4MzY0MAkJCQkJMHgzNjQwCi0vKiBUZXN0IFBhdHRlcm4gKi8KLSNkZWZpbmUgUkVHX1RFU1RfUEFUVEVSTl9NT0RFCQkJCTB4MDYwMQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJCQkJCQkgVFlQRSBERUNMQVJBVElPTlMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKiAxNmJpdCBhZGRyZXNzIC0gOCBiaXQgY29udGV4dCByZWdpc3RlciBzdHJ1Y3R1cmUgKi8KLSNkZWZpbmUJVlg2OTUzX1NUTTVNMEVET0ZfT0ZGU0VUCTkKLSNkZWZpbmUJUTgJCTB4MDAwMDAxMDAKLSNkZWZpbmUJUTEwCQkweDAwMDAwNDAwCi0jZGVmaW5lCVZYNjk1M19TVE01TTBFRE9GX01BWF9TTkFQU0hPVF9FWFBPU1VSRV9MSU5FX0NPVU5UCTI5MjIKLSNkZWZpbmUJVlg2OTUzX1NUTTVNMEVET0ZfREVGQVVMVF9NQVNURVJfQ0xLX1JBVEUJMjQwMDAwMDAKLSNkZWZpbmUJVlg2OTUzX1NUTTVNMEVET0ZfT1BfUElYRUxfQ0xPQ0tfUkFURQk3OTgwMDAwMAotI2RlZmluZQlWWDY5NTNfU1RNNU0wRURPRl9WVF9QSVhFTF9DTE9DS19SQVRFCTg4NjcwMDAwCi0vKiBGdWxsCVNpemUgKi8KLSNkZWZpbmUJVlg2OTUzX0ZVTExfU0laRV9XSURUSAkyNjA4Ci0jZGVmaW5lCVZYNjk1M19GVUxMX1NJWkVfSEVJR0hUCQkxOTYwCi0jZGVmaW5lCVZYNjk1M19GVUxMX1NJWkVfRFVNTVlfUElYRUxTCTEKLSNkZWZpbmUJVlg2OTUzX0ZVTExfU0laRV9EVU1NWV9MSU5FUwkwCi0vKiBRdWFydGVyIFNpemUJKi8KLSNkZWZpbmUJVlg2OTUzX1FUUl9TSVpFX1dJRFRICTEzMDQKLSNkZWZpbmUJVlg2OTUzX1FUUl9TSVpFX0hFSUdIVAkJOTgwCi0jZGVmaW5lCVZYNjk1M19RVFJfU0laRV9EVU1NWV9QSVhFTFMJMQotI2RlZmluZQlWWDY5NTNfUVRSX1NJWkVfRFVNTVlfTElORVMJCTAKLS8qIEJsYW5raW5nCWFzIG1lYXN1cmVkCW9uIHRoZSBzY29wZSAqLwotLyogRnVsbAlTaXplICovCi0jZGVmaW5lCVZYNjk1M19IUlpfRlVMTF9CTEtfUElYRUxTCTM0OAotI2RlZmluZQlWWDY5NTNfVkVSX0ZVTExfQkxLX0xJTkVTCTQwCi0vKiBRdWFydGVyIFNpemUJKi8KLSNkZWZpbmUJVlg2OTUzX0hSWl9RVFJfQkxLX1BJWEVMUwkxNjI4Ci0jZGVmaW5lCVZYNjk1M19WRVJfUVRSX0JMS19MSU5FUwkyOAotI2RlZmluZQlNQVhfTElORV9MRU5HVEhfUENLCQk4MTkwCi0jZGVmaW5lCU1BWF9GUkFNRV9MRU5HVEhfTElORVMJMTYzODMKLSNkZWZpbmUJVlg2OTUzX1JFVklTSU9OX05VTUJFUl9DVVQyCTB4MTAvKnJldmlzaW9uIG51bWJlcglmb3IJQ3V0Mi4wKi8KLSNkZWZpbmUJVlg2OTUzX1JFVklTSU9OX05VTUJFUl9DVVQzCTB4MjAvKnJldmlzaW9uIG51bWJlcglmb3IJQ3V0My4wKi8KLS8qIEZJWE1FOiBDaGFuZ2VzIGZyb20gaGVyZSAqLwotc3RydWN0IHZ4Njk1M193b3JrX3QgewotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotfTsKLQotc3RhdGljIHN0cnVjdCB2eDY5NTNfd29ya190ICp2eDY5NTNfc2Vuc29ydzsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqdng2OTUzX2NsaWVudDsKLQotc3RydWN0IHZ4Njk1M19jdHJsX3QgewotCWNvbnN0IHN0cnVjdCAgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqc2Vuc29yZGF0YTsKLQotCXVpbnQzMl90IHNlbnNvcm1vZGU7Ci0JdWludDMyX3QgZnBzX2RpdmlkZXI7ICAgCS8qIGluaXQgdG8gMSAqIDB4MDAwMDA0MDAgKi8KLQl1aW50MzJfdCBwaWN0X2Zwc19kaXZpZGVyOyAgLyogaW5pdCB0byAxICogMHgwMDAwMDQwMCAqLwotCXVpbnQxNl90IGZwczsKLQotCWludDE2X3QgY3Vycl9sZW5zX3BvczsKLQl1aW50MTZfdCBjdXJyX3N0ZXBfcG9zOwotCXVpbnQxNl90IG15X3JlZ19nYWluOwotCXVpbnQzMl90IG15X3JlZ19saW5lX2NvdW50OwotCXVpbnQxNl90IHRvdGFsX2xpbmVzX3Blcl9mcmFtZTsKLQotCWVudW0gdng2OTUzX3Jlc29sdXRpb25fdCBwcmV2X3JlczsKLQllbnVtIHZ4Njk1M19yZXNvbHV0aW9uX3QgcGljdF9yZXM7Ci0JZW51bSB2eDY5NTNfcmVzb2x1dGlvbl90IGN1cnJfcmVzOwotCWVudW0gdng2OTUzX3Rlc3RfbW9kZV90ICBzZXRfdGVzdDsKLQllbnVtIHNlbnNvcl9yZXZpc2lvbl90IHNlbnNvcl90eXBlOwotCi0JZW51bSBlZG9mX21vZGVfdCBlZG9mX21vZGU7Ci0KLQl1bnNpZ25lZCBzaG9ydCBpbWdhZGRyOwotfTsKLQotCi1zdGF0aWMgdWludDhfdCB2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieTsKLXN0YXRpYyB1aW50MTZfdCB2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdHJlYW0gPSAyMDsKLXN0YXRpYyB1aW50OF90IGNvdW50Owotc3RhdGljIHN0cnVjdCB2eDY5NTNfY3RybF90ICp2eDY5NTNfY3RybDsKLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh2eDY5NTNfd2FpdF9xdWV1ZSk7Ci1ERUZJTkVfTVVURVgodng2OTUzX211dCk7Ci1zdGF0aWMgc3RydWN0IHZ4Njk1M19pMmNfcmVnX2NvbmYgcGF0Y2hfdGJsX2N1dDJbXSA9IHsKLQl7MHhGQjk0LCAwfSwJLyppbnRpYWxpc2UgRGF0YSBYZmVyIFN0YXR1cyByZWcqLwotCXsweEZCOTUsIDB9LAkvKmdhaW4gMQkgICgweDAwKSovCi0JezB4RkI5NiwgMH0sCS8qZ2FpbiAxLjA3ICAgKDB4MTApKi8KLQl7MHhGQjk3LCAwfSwJLypnYWluIDEuMTQgICAoMHgyMCkqLwotCXsweEZCOTgsIDB9LAkvKmdhaW4gMS4yMyAgICgweDMwKSovCi0JezB4RkI5OSwgMH0sCS8qZ2FpbiAxLjMzICAgKDB4NDApKi8KLQl7MHhGQjlBLCAwfSwJLypnYWluIDEuNDUgICAoMHg1MCkqLwotCXsweEZCOUIsIDB9LAkvKmdhaW4gMS42ICAgICgweDYwKSovCi0JezB4RkI5QywgMH0sCS8qZ2FpbiAxLjc4ICAgKDB4NzApKi8KLQl7MHhGQjlELCAyfSwJLypnYWluIDIJICAoMHg4MCkqLwotCXsweEZCOUUsIDJ9LAkvKmdhaW4gMi4yOSAgICgweDkwKSovCi0JezB4RkI5RiwgM30sCS8qZ2FpbiAyLjY3ICAgKDB4QTApKi8KLQl7MHhGQkEwLCAzfSwJLypnYWluIDMuMiAgICAoMHhCMCkqLwotCXsweEZCQTEsIDR9LAkvKmdhaW4gNAkgICgweEMwKSovCi0JezB4RkJBMiwgN30sCS8qZ2FpbiA1LjMzICAgKDB4RDApKi8KLQl7MHhGQkEzLCAxMH0sCS8qZ2FpbiA4CSAgKDB4RTApKi8KLQl7MHhGQkE0LCAxMX0sCS8qZ2FpbiA5LjE0ICAgKDB4RTQpKi8KLQl7MHhGQkE1LCAxM30sCS8qZ2FpbiAxMC42NyAgKDB4RTgpKi8KLQl7MHhGQkE2LCAxNX0sCS8qZ2FpbiAxMi44ICAgKDB4RUMpKi8KLQl7MHhGQkE3LCAxOX0sCS8qZ2FpbiAxNiAgICAgKDB4RjApKi8KLQl7MHhGODAwLCAweDEyfSwKLQl7MHhGODAxLCAweDA2fSwKLQl7MHhGODAyLCAweGY3fSwKLQl7MHhGODAzLCAweDkwfSwKLQl7MHhGODA0LCAweDAyfSwKLQl7MHhGODA1LCAweDA1fSwKLQl7MHhGODA2LCAweGUwfSwKLQl7MHhGODA3LCAweGZmfSwKLQl7MHhGODA4LCAweDY1fSwKLQl7MHhGODA5LCAweDdkfSwKLQl7MHhGODBBLCAweDcwfSwKLQl7MHhGODBCLCAweDAzfSwKLQl7MHhGODBDLCAweDAyfSwKLQl7MHhGODBELCAweGY5fSwKLQl7MHhGODBFLCAweDFjfSwKLQl7MHhGODBGLCAweDhmfSwKLQl7MHhGODEwLCAweDdkfSwKLQl7MHhGODExLCAweGU0fSwKLQl7MHhGODEyLCAweGY1fSwKLQl7MHhGODEzLCAweDdhfSwKLQl7MHhGODE0LCAweDc1fSwKLQl7MHhGODE1LCAweDc4fSwKLQl7MHhGODE2LCAweDMwfSwKLQl7MHhGODE3LCAweDc1fSwKLQl7MHhGODE4LCAweDc5fSwKLQl7MHhGODE5LCAweDUzfSwKLQl7MHhGODFBLCAweDg1fSwKLQl7MHhGODFCLCAweDc5fSwKLQl7MHhGODFDLCAweDgyfSwKLQl7MHhGODFELCAweDg1fSwKLQl7MHhGODFFLCAweDc4fSwKLQl7MHhGODFGLCAweDgzfSwKLQl7MHhGODIwLCAweGUwfSwKLQl7MHhGODIxLCAweGMzfSwKLQl7MHhGODIyLCAweDk1fSwKLQl7MHhGODIzLCAweDdifSwKLQl7MHhGODI0LCAweGYwfSwKLQl7MHhGODI1LCAweDc0fSwKLQl7MHhGODI2LCAweDAyfSwKLQl7MHhGODI3LCAweDI1fSwKLQl7MHhGODI4LCAweDc5fSwKLQl7MHhGODI5LCAweGY1fSwKLQl7MHhGODJBLCAweDc5fSwKLQl7MHhGODJCLCAweGU0fSwKLQl7MHhGODJDLCAweDM1fSwKLQl7MHhGODJELCAweDc4fSwKLQl7MHhGODJFLCAweGY1fSwKLQl7MHhGODJGLCAweDc4fSwKLQl7MHhGODMwLCAweDA1fSwKLQl7MHhGODMxLCAweDdhfSwKLQl7MHhGODMyLCAweGU1fSwKLQl7MHhGODMzLCAweDdhfSwKLQl7MHhGODM0LCAweGI0fSwKLQl7MHhGODM1LCAweDA4fSwKLQl7MHhGODM2LCAweGUzfSwKLQl7MHhGODM3LCAweGU1fSwKLQl7MHhGODM4LCAweDdkfSwKLQl7MHhGODM5LCAweDcwfSwKLQl7MHhGODNBLCAweDA0fSwKLQl7MHhGODNCLCAweGZmfSwKLQl7MHhGODNDLCAweDAyfSwKLQl7MHhGODNELCAweGY4fSwKLQl7MHhGODNFLCAweGU0fSwKLQl7MHhGODNGLCAweGU1fSwKLQl7MHhGODQwLCAweDdkfSwKLQl7MHhGODQxLCAweGI0fSwKLQl7MHhGODQyLCAweDEwfSwKLQl7MHhGODQzLCAweDA1fSwKLQl7MHhGODQ0LCAweDdmfSwKLQl7MHhGODQ1LCAweDAxfSwKLQl7MHhGODQ2LCAweDAyfSwKLQl7MHhGODQ3LCAweGY4fSwKLQl7MHhGODQ4LCAweGU0fSwKLQl7MHhGODQ5LCAweGU1fSwKLQl7MHhGODRBLCAweDdkfSwKLQl7MHhGODRCLCAweGI0fSwKLQl7MHhGODRDLCAweDIwfSwKLQl7MHhGODRELCAweDA1fSwKLQl7MHhGODRFLCAweDdmfSwKLQl7MHhGODRGLCAweDAyfSwKLQl7MHhGODUwLCAweDAyfSwKLQl7MHhGODUxLCAweGY4fSwKLQl7MHhGODUyLCAweGU0fSwKLQl7MHhGODUzLCAweGU1fSwKLQl7MHhGODU0LCAweDdkfSwKLQl7MHhGODU1LCAweGI0fSwKLQl7MHhGODU2LCAweDMwfSwKLQl7MHhGODU3LCAweDA1fSwKLQl7MHhGODU4LCAweDdmfSwKLQl7MHhGODU5LCAweDAzfSwKLQl7MHhGODVBLCAweDAyfSwKLQl7MHhGODVCLCAweGY4fSwKLQl7MHhGODVDLCAweGU0fSwKLQl7MHhGODVELCAweGU1fSwKLQl7MHhGODVFLCAweDdkfSwKLQl7MHhGODVGLCAweGI0fSwKLQl7MHhGODYwLCAweDQwfSwKLQl7MHhGODYxLCAweDA0fSwKLQl7MHhGODYyLCAweDdmfSwKLQl7MHhGODYzLCAweDA0fSwKLQl7MHhGODY0LCAweDgwfSwKLQl7MHhGODY1LCAweDdlfSwKLQl7MHhGODY2LCAweGU1fSwKLQl7MHhGODY3LCAweDdkfSwKLQl7MHhGODY4LCAweGI0fSwKLQl7MHhGODY5LCAweDUwfSwKLQl7MHhGODZBLCAweDA0fSwKLQl7MHhGODZCLCAweDdmfSwKLQl7MHhGODZDLCAweDA1fSwKLQl7MHhGODZELCAweDgwfSwKLQl7MHhGODZFLCAweDc1fSwKLQl7MHhGODZGLCAweGU1fSwKLQl7MHhGODcwLCAweDdkfSwKLQl7MHhGODcxLCAweGI0fSwKLQl7MHhGODcyLCAweDYwfSwKLQl7MHhGODczLCAweDA0fSwKLQl7MHhGODc0LCAweDdmfSwKLQl7MHhGODc1LCAweDA2fSwKLQl7MHhGODc2LCAweDgwfSwKLQl7MHhGODc3LCAweDZjfSwKLQl7MHhGODc4LCAweGU1fSwKLQl7MHhGODc5LCAweDdkfSwKLQl7MHhGODdBLCAweGI0fSwKLQl7MHhGODdCLCAweDcwfSwKLQl7MHhGODdDLCAweDA0fSwKLQl7MHhGODdELCAweDdmfSwKLQl7MHhGODdFLCAweDA3fSwKLQl7MHhGODdGLCAweDgwfSwKLQl7MHhGODgwLCAweDYzfSwKLQl7MHhGODgxLCAweGU1fSwKLQl7MHhGODgyLCAweDdkfSwKLQl7MHhGODgzLCAweGI0fSwKLQl7MHhGODg0LCAweDgwfSwKLQl7MHhGODg1LCAweDA0fSwKLQl7MHhGODg2LCAweDdmfSwKLQl7MHhGODg3LCAweDA4fSwKLQl7MHhGODg4LCAweDgwfSwKLQl7MHhGODg5LCAweDVhfSwKLQl7MHhGODhBLCAweGU1fSwKLQl7MHhGODhCLCAweDdkfSwKLQl7MHhGODhDLCAweGI0fSwKLQl7MHhGODhELCAweDkwfSwKLQl7MHhGODhFLCAweDA0fSwKLQl7MHhGODhGLCAweDdmfSwKLQl7MHhGODkwLCAweDA5fSwKLQl7MHhGODkxLCAweDgwfSwKLQl7MHhGODkyLCAweDUxfSwKLQl7MHhGODkzLCAweGU1fSwKLQl7MHhGODk0LCAweDdkfSwKLQl7MHhGODk1LCAweGI0fSwKLQl7MHhGODk2LCAweGEwfSwKLQl7MHhGODk3LCAweDA0fSwKLQl7MHhGODk4LCAweDdmfSwKLQl7MHhGODk5LCAweDBhfSwKLQl7MHhGODlBLCAweDgwfSwKLQl7MHhGODlCLCAweDQ4fSwKLQl7MHhGODlDLCAweGU1fSwKLQl7MHhGODlELCAweDdkfSwKLQl7MHhGODlFLCAweGI0fSwKLQl7MHhGODlGLCAweGIwfSwKLQl7MHhGOEEwLCAweDA0fSwKLQl7MHhGOEExLCAweDdmfSwKLQl7MHhGOEEyLCAweDBifSwKLQl7MHhGOEEzLCAweDgwfSwKLQl7MHhGOEE0LCAweDNmfSwKLQl7MHhGOEE1LCAweGU1fSwKLQl7MHhGOEE2LCAweDdkfSwKLQl7MHhGOEE3LCAweGI0fSwKLQl7MHhGOEE4LCAweGMwfSwKLQl7MHhGOEE5LCAweDA0fSwKLQl7MHhGOEFBLCAweDdmfSwKLQl7MHhGOEFCLCAweDBjfSwKLQl7MHhGOEFDLCAweDgwfSwKLQl7MHhGOEFELCAweDM2fSwKLQl7MHhGOEFFLCAweGU1fSwKLQl7MHhGOEFGLCAweDdkfSwKLQl7MHhGOEIwLCAweGI0fSwKLQl7MHhGOEIxLCAweGQwfSwKLQl7MHhGOEIyLCAweDA0fSwKLQl7MHhGOEIzLCAweDdmfSwKLQl7MHhGOEI0LCAweDBkfSwKLQl7MHhGOEI1LCAweDgwfSwKLQl7MHhGOEI2LCAweDJkfSwKLQl7MHhGOEI3LCAweGU1fSwKLQl7MHhGOEI4LCAweDdkfSwKLQl7MHhGOEI5LCAweGI0fSwKLQl7MHhGOEJBLCAweGUwfSwKLQl7MHhGOEJCLCAweDA0fSwKLQl7MHhGOEJDLCAweDdmfSwKLQl7MHhGOEJELCAweDBlfSwKLQl7MHhGOEJFLCAweDgwfSwKLQl7MHhGOEJGLCAweDI0fSwKLQl7MHhGOEMwLCAweGU1fSwKLQl7MHhGOEMxLCAweDdkfSwKLQl7MHhGOEMyLCAweGI0fSwKLQl7MHhGOEMzLCAweGU0fSwKLQl7MHhGOEM0LCAweDA0fSwKLQl7MHhGOEM1LCAweDdmfSwKLQl7MHhGOEM2LCAweDBmfSwKLQl7MHhGOEM3LCAweDgwfSwKLQl7MHhGOEM4LCAweDFifSwKLQl7MHhGOEM5LCAweGU1fSwKLQl7MHhGOENBLCAweDdkfSwKLQl7MHhGOENCLCAweGI0fSwKLQl7MHhGOENDLCAweGU4fSwKLQl7MHhGOENELCAweDA0fSwKLQl7MHhGOENFLCAweDdmfSwKLQl7MHhGOENGLCAweDEwfSwKLQl7MHhGOEQwLCAweDgwfSwKLQl7MHhGOEQxLCAweDEyfSwKLQl7MHhGOEQyLCAweGU1fSwKLQl7MHhGOEQzLCAweDdkfSwKLQl7MHhGOEQ0LCAweGI0fSwKLQl7MHhGOEQ1LCAweGVjfSwKLQl7MHhGOEQ2LCAweDA0fSwKLQl7MHhGOEQ3LCAweDdmfSwKLQl7MHhGOEQ4LCAweDExfSwKLQl7MHhGOEQ5LCAweDgwfSwKLQl7MHhGOERBLCAweDA5fSwKLQl7MHhGOERCLCAweGU1fSwKLQl7MHhGOERDLCAweDdkfSwKLQl7MHhGOERELCAweDdmfSwKLQl7MHhGOERFLCAweDAwfSwKLQl7MHhGOERGLCAweGI0fSwKLQl7MHhGOEUwLCAweGYwfSwKLQl7MHhGOEUxLCAweDAyfSwKLQl7MHhGOEUyLCAweDdmfSwKLQl7MHhGOEUzLCAweDEyfSwKLQl7MHhGOEU0LCAweDhmfSwKLQl7MHhGOEU1LCAweDdjfSwKLQl7MHhGOEU2LCAweGVmfSwKLQl7MHhGOEU3LCAweDI0fSwKLQl7MHhGOEU4LCAweDk1fSwKLQl7MHhGOEU5LCAweGZmfSwKLQl7MHhGOEVBLCAweGU0fSwKLQl7MHhGOEVCLCAweDM0fSwKLQl7MHhGOEVDLCAweGZifSwKLQl7MHhGOEVELCAweDhmfSwKLQl7MHhGOEVFLCAweDgyfSwKLQl7MHhGOEVGLCAweGY1fSwKLQl7MHhGOEYwLCAweDgzfSwKLQl7MHhGOEYxLCAweGU0fSwKLQl7MHhGOEYyLCAweDkzfSwKLQl7MHhGOEYzLCAweGY1fSwKLQl7MHhGOEY0LCAweDdjfSwKLQl7MHhGOEY1LCAweGY1fSwKLQl7MHhGOEY2LCAweDdifSwKLQl7MHhGOEY3LCAweGU0fSwKLQl7MHhGOEY4LCAweGY1fSwKLQl7MHhGOEY5LCAweDdhfSwKLQl7MHhGOEZBLCAweDc1fSwKLQl7MHhGOEZCLCAweDc4fSwKLQl7MHhGOEZDLCAweDMwfSwKLQl7MHhGOEZELCAweDc1fSwKLQl7MHhGOEZFLCAweDc5fSwKLQl7MHhGOEZGLCAweDUzfSwKLQl7MHhGOTAwLCAweDg1fSwKLQl7MHhGOTAxLCAweDc5fSwKLQl7MHhGOTAyLCAweDgyfSwKLQl7MHhGOTAzLCAweDg1fSwKLQl7MHhGOTA0LCAweDc4fSwKLQl7MHhGOTA1LCAweDgzfSwKLQl7MHhGOTA2LCAweGUwfSwKLQl7MHhGOTA3LCAweDI1fSwKLQl7MHhGOTA4LCAweDdjfSwKLQl7MHhGOTA5LCAweGYwfSwKLQl7MHhGOTBBLCAweDc0fSwKLQl7MHhGOTBCLCAweDAyfSwKLQl7MHhGOTBDLCAweDI1fSwKLQl7MHhGOTBELCAweDc5fSwKLQl7MHhGOTBFLCAweGY1fSwKLQl7MHhGOTBGLCAweDc5fSwKLQl7MHhGOTEwLCAweGU0fSwKLQl7MHhGOTExLCAweDM1fSwKLQl7MHhGOTEyLCAweDc4fSwKLQl7MHhGOTEzLCAweGY1fSwKLQl7MHhGOTE0LCAweDc4fSwKLQl7MHhGOTE1LCAweDA1fSwKLQl7MHhGOTE2LCAweDdhfSwKLQl7MHhGOTE3LCAweGU1fSwKLQl7MHhGOTE4LCAweDdhfSwKLQl7MHhGOTE5LCAweGI0fSwKLQl7MHhGOTFBLCAweDA4fSwKLQl7MHhGOTFCLCAweGU0fSwKLQl7MHhGOTFDLCAweDAyfSwKLQl7MHhGOTFELCAweDE4fSwKLQl7MHhGOTFFLCAweDMyfSwKLQl7MHhGOTFGLCAweDIyfSwKLQl7MHhGOTIwLCAweGYwfSwKLQl7MHhGOTIxLCAweDkwfSwKLQl7MHhGOTIyLCAweGEwfSwKLQl7MHhGOTIzLCAweGY4fSwKLQl7MHhGOTI0LCAweGUwfSwKLQl7MHhGOTI1LCAweDcwfSwKLQl7MHhGOTI2LCAweDAyfSwKLQl7MHhGOTI3LCAweGEzfSwKLQl7MHhGOTI4LCAweGUwfSwKLQl7MHhGOTI5LCAweDcwfSwKLQl7MHhGOTJBLCAweDBhfSwKLQl7MHhGOTJCLCAweDkwfSwKLQl7MHhGOTJDLCAweGExfSwKLQl7MHhGOTJELCAweDEwfSwKLQl7MHhGOTJFLCAweGUwfSwKLQl7MHhGOTJGLCAweGZlfSwKLQl7MHhGOTMwLCAweGEzfSwKLQl7MHhGOTMxLCAweGUwfSwKLQl7MHhGOTMyLCAweGZmfSwKLQl7MHhGOTMzLCAweDgwfSwKLQl7MHhGOTM0LCAweDA0fSwKLQl7MHhGOTM1LCAweDdlfSwKLQl7MHhGOTM2LCAweDAwfSwKLQl7MHhGOTM3LCAweDdmfSwKLQl7MHhGOTM4LCAweDAwfSwKLQl7MHhGOTM5LCAweDhlfSwKLQl7MHhGOTNBLCAweDdlfSwKLQl7MHhGOTNCLCAweDhmfSwKLQl7MHhGOTNDLCAweDdmfSwKLQl7MHhGOTNELCAweDkwfSwKLQl7MHhGOTNFLCAweDM2fSwKLQl7MHhGOTNGLCAweDBkfSwKLQl7MHhGOTQwLCAweGUwfSwKLQl7MHhGOTQxLCAweDQ0fSwKLQl7MHhGOTQyLCAweDAyfSwKLQl7MHhGOTQzLCAweGYwfSwKLQl7MHhGOTQ0LCAweDkwfSwKLQl7MHhGOTQ1LCAweDM2fSwKLQl7MHhGOTQ2LCAweDBlfSwKLQl7MHhGOTQ3LCAweGU1fSwKLQl7MHhGOTQ4LCAweDdlfSwKLQl7MHhGOTQ5LCAweGYwfSwKLQl7MHhGOTRBLCAweGEzfSwKLQl7MHhGOTRCLCAweGU1fSwKLQl7MHhGOTRDLCAweDdmfSwKLQl7MHhGOTRELCAweGYwfSwKLQl7MHhGOTRFLCAweGU1fSwKLQl7MHhGOTRGLCAweDNhfSwKLQl7MHhGOTUwLCAweDYwfSwKLQl7MHhGOTUxLCAweDBjfSwKLQl7MHhGOTUyLCAweDkwfSwKLQl7MHhGOTUzLCAweDM2fSwKLQl7MHhGOTU0LCAweDA5fSwKLQl7MHhGOTU1LCAweGUwfSwKLQl7MHhGOTU2LCAweDcwfSwKLQl7MHhGOTU3LCAweDA2fSwKLQl7MHhGOTU4LCAweDkwfSwKLQl7MHhGOTU5LCAweDM2fSwKLQl7MHhGOTVBLCAweDA4fSwKLQl7MHhGOTVCLCAweGYwfSwKLQl7MHhGOTVDLCAweGY1fSwKLQl7MHhGOTVELCAweDNhfSwKLQl7MHhGOTVFLCAweDAyfSwKLQl7MHhGOTVGLCAweDAzfSwKLQl7MHhGOTYwLCAweDk0fSwKLQl7MHhGOTYxLCAweDIyfSwKLQl7MHhGOTYyLCAweDc4fSwKLQl7MHhGOTYzLCAweDA3fSwKLQl7MHhGOTY0LCAweGU2fSwKLQl7MHhGOTY1LCAweGQzfSwKLQl7MHhGOTY2LCAweDk0fSwKLQl7MHhGOTY3LCAweDAwfSwKLQl7MHhGOTY4LCAweDQwfSwKLQl7MHhGOTY5LCAweDE2fSwKLQl7MHhGOTZBLCAweDE2fSwKLQl7MHhGOTZCLCAweGU2fSwKLQl7MHhGOTZDLCAweDkwfSwKLQl7MHhGOTZELCAweDMwfSwKLQl7MHhGOTZFLCAweGExfSwKLQl7MHhGOTZGLCAweGYwfSwKLQl7MHhGOTcwLCAweDkwfSwKLQl7MHhGOTcxLCAweDQzfSwKLQl7MHhGOTcyLCAweDgzfSwKLQl7MHhGOTczLCAweGUwfSwKLQl7MHhGOTc0LCAweGI0fSwKLQl7MHhGOTc1LCAweDAxfSwKLQl7MHhGOTc2LCAweDBmfSwKLQl7MHhGOTc3LCAweDkwfSwKLQl7MHhGOTc4LCAweDQzfSwKLQl7MHhGOTc5LCAweDg3fSwKLQl7MHhGOTdBLCAweGUwfSwKLQl7MHhGOTdCLCAweGI0fSwKLQl7MHhGOTdDLCAweDAxfSwKLQl7MHhGOTdELCAweDA4fSwKLQl7MHhGOTdFLCAweDgwfSwKLQl7MHhGOTdGLCAweDAwfSwKLQl7MHhGOTgwLCAweDkwfSwKLQl7MHhGOTgxLCAweDMwfSwKLQl7MHhGOTgyLCAweGEwfSwKLQl7MHhGOTgzLCAweDc0fSwKLQl7MHhGOTg0LCAweDAxfSwKLQl7MHhGOTg1LCAweGYwfSwKLQl7MHhGOTg2LCAweDIyfSwKLQl7MHhGOTg3LCAweGYwfSwKLQl7MHhGOTg4LCAweDkwfSwKLQl7MHhGOTg5LCAweDM1fSwKLQl7MHhGOThBLCAweGJhfSwKLQl7MHhGOThCLCAweGUwfSwKLQl7MHhGOThDLCAweGI0fSwKLQl7MHhGOThELCAweDBhfSwKLQl7MHhGOThFLCAweDBkfSwKLQl7MHhGOThGLCAweGEzfSwKLQl7MHhGOTkwLCAweGUwfSwKLQl7MHhGOTkxLCAweGI0fSwKLQl7MHhGOTkyLCAweDAxfSwKLQl7MHhGOTkzLCAweDA4fSwKLQl7MHhGOTk0LCAweDkwfSwKLQl7MHhGOTk1LCAweGZifSwKLQl7MHhGOTk2LCAweDk0fSwKLQl7MHhGOTk3LCAweGUwfSwKLQl7MHhGOTk4LCAweDkwfSwKLQl7MHhGOTk5LCAweDM1fSwKLQl7MHhGOTlBLCAweGI4fSwKLQl7MHhGOTlCLCAweGYwfSwKLQl7MHhGOTlDLCAweGQwfSwKLQl7MHhGOTlELCAweGQwfSwKLQl7MHhGOTlFLCAweGQwfSwKLQl7MHhGOTlGLCAweDgyfSwKLQl7MHhGOUEwLCAweGQwfSwKLQl7MHhGOUExLCAweDgzfSwKLQl7MHhGOUEyLCAweGQwfSwKLQl7MHhGOUEzLCAweGUwfSwKLQl7MHhGOUE0LCAweDMyfSwKLQl7MHhGOUE1LCAweDIyfSwKLQl7MHhGOUE2LCAweGU1fSwKLQl7MHhGOUE3LCAweDdmfSwKLQl7MHhGOUE4LCAweDQ1fSwKLQl7MHhGOUE5LCAweDdlfSwKLQl7MHhGOUFBLCAweDYwfSwKLQl7MHhGOUFCLCAweDE1fSwKLQl7MHhGOUFDLCAweDkwfSwKLQl7MHhGOUFELCAweDAxfSwKLQl7MHhGOUFFLCAweDAwfSwKLQl7MHhGOUFGLCAweGUwfSwKLQl7MHhGOUIwLCAweDcwfSwKLQl7MHhGOUIxLCAweDBmfSwKLQl7MHhGOUIyLCAweDkwfSwKLQl7MHhGOUIzLCAweGEwfSwKLQl7MHhGOUI0LCAweGY4fSwKLQl7MHhGOUI1LCAweGU1fSwKLQl7MHhGOUI2LCAweDdlfSwKLQl7MHhGOUI3LCAweGYwfSwKLQl7MHhGOUI4LCAweGEzfSwKLQl7MHhGOUI5LCAweGU1fSwKLQl7MHhGOUJBLCAweDdmfSwKLQl7MHhGOUJCLCAweGYwfSwKLQl7MHhGOUJDLCAweGU0fSwKLQl7MHhGOUJELCAweGY1fSwKLQl7MHhGOUJFLCAweDdlfSwKLQl7MHhGOUJGLCAweGY1fSwKLQl7MHhGOUMwLCAweDdmfSwKLQl7MHhGOUMxLCAweDIyfSwKLQl7MHhGOUMyLCAweDAyfSwKLQl7MHhGOUMzLCAweDBlfSwKLQl7MHhGOUM0LCAweDc5fSwKLQl7MHhGOUM1LCAweDIyfSwKLQkvKiBPZmZzZXRzOiovCi0JezB4MzVDNiwgMHgwMH0sLyogRklERExFREFSS0NBTCovCi0JezB4MzVDNywgMHgwMH0sCi0JezB4MzVDOCwgMHgwMX0sLypTVE9SRURJU1RBTkNFQVRTVE9QU1RSRUFNSU5HKi8KLQl7MHgzNUM5LCAweDIwfSwKLQl7MHgzNUNBLCAweDAxfSwvKkJSVUNFRklYKi8KLQl7MHgzNUNCLCAweDYyfSwKLQl7MHgzNUNDLCAweDAxfSwvKkZJWERBVEFYRkVSU1RBVFVTUkVHKi8KLQl7MHgzNUNELCAweDg3fSwKLQl7MHgzNUNFLCAweDAxfSwvKkZPQ1VTRElTVEFOQ0VVUERBVEUqLwotCXsweDM1Q0YsIDB4QTZ9LAotCXsweDM1RDAsIDB4MDF9LC8qU0tJUEVET0ZSRVNFVCovCi0JezB4MzVEMSwgMHhDMn0sCi0JezB4MzVEMiwgMHgwMH0sCi0JezB4MzVEMywgMHhGQn0sCi0JezB4MzVENCwgMHgwMH0sCi0JezB4MzVENSwgMHg5NH0sCi0JezB4MzVENiwgMHgwMH0sCi0JezB4MzVENywgMHhGQn0sCi0JezB4MzVEOCwgMHgwMH0sCi0JezB4MzVEOSwgMHg5NH0sCi0JezB4MzVEQSwgMHgwMH0sCi0JezB4MzVEQiwgMHhGQn0sCi0JezB4MzVEQywgMHgwMH0sCi0JezB4MzVERCwgMHg5NH0sCi0JezB4MzVERSwgMHgwMH0sCi0JezB4MzVERiwgMHhGQn0sCi0JezB4MzVFMCwgMHgwMH0sCi0JezB4MzVFMSwgMHg5NH0sCi0JezB4MzVFNiwgMHgxOH0sLyogRklERExFREFSS0NBTCovCi0JezB4MzVFNywgMHgyRn0sCi0JezB4MzVFOCwgMHgwM30sLyogU1RPUkVESVNUQU5DRUFUU1RPUFNUUkVBTUlORyovCi0JezB4MzVFOSwgMHg5M30sCi0JezB4MzVFQSwgMHgxOH0sLyogQlJVQ0VGSVgqLwotCXsweDM1RUIsIDB4OTl9LAotCXsweDM1RUMsIDB4MDB9LC8qIEZJWERBVEFYRkVSU1RBVFVTUkVHKi8KLQl7MHgzNUVELCAweEEzfSwKLQl7MHgzNUVFLCAweDIxfSwvKiBGT0NVU0RJU1RBTkNFVVBEQVRFKi8KLQl7MHgzNUVGLCAweDVCfSwKLQl7MHgzNUYwLCAweDBFfSwvKiBTS0lQRURPRlJFU0VUKi8KLQl7MHgzNUYxLCAweDc0fSwKLQl7MHgzNUYyLCAweDA0fSwKLQl7MHgzNUYzLCAweDY0fSwKLQl7MHgzNUY0LCAweDA0fSwKLQl7MHgzNUY1LCAweDY1fSwKLQl7MHgzNUY2LCAweDA0fSwKLQl7MHgzNUY3LCAweDdCfSwKLQl7MHgzNUY4LCAweDA0fSwKLQl7MHgzNUY5LCAweDdDfSwKLQl7MHgzNUZBLCAweDA0fSwKLQl7MHgzNUZCLCAweEREfSwKLQl7MHgzNUZDLCAweDA0fSwKLQl7MHgzNUZELCAweERFfSwKLQl7MHgzNUZFLCAweDA0fSwKLQl7MHgzNUZGLCAweEVGfSwKLQl7MHgzNjAwLCAweDA0fSwKLQl7MHgzNjAxLCAweEYwfSwKLQkvKkp1bXAvRGF0YToqLwotCXsweDM1QzIsIDB4M0Z9LC8qIEp1bXAgUmVnKi8KLQl7MHgzNUMzLCAweEZGfSwvKiBKdW1wIFJlZyovCi0JezB4MzVDNCwgMHgzRn0sLyogRGF0YSBSZWcqLwotCXsweDM1QzUsIDB4QzB9LC8qIERhdGEgUmVnKi8KLQl7MHgzNUMwLCAweDAxfSwvKiBFbmFibGUqLwotCi19OwotCi1zdGF0aWMgc3RydWN0IHZ4Njk1M19pMmNfcmVnX2NvbmYgY3V0M19jYWxpX2RhdGFbXSA9IHsKLQkJezB4MzYwQSwgMHgwNyB9LAotCQl7MHgzNTMwLCAweDA3IH0sCi0JCXsweDM1QjUsIDB4MDAgfSwKLQkJezB4MzVCQywgMHgwMCB9LAotCQl7MHhBRkY4LCAweDAwIH0sCi0JCXsweEFGRjksIDB4MDEgfSwKLQkJezB4RjgwMCwgMHg5MCB9LAotCQl7MHhGODAxLCAweDMwIH0sCi0JCXsweEY4MDIsIDB4MzEgfSwKLQkJezB4RjgwMywgMHhlMCB9LAotCQl7MHhGODA0LCAweGY1IH0sCi0JCXsweEY4MDUsIDB4N2QgfSwKLQkJezB4RjgwNiwgMHhiNCB9LAotCQl7MHhGODA3LCAweDAxIH0sCi0JCXsweEY4MDgsIDB4MDYgfSwKLQkJezB4RjgwOSwgMHg3NSB9LAotCQl7MHhGODBBLCAweDdkIH0sCi0JCXsweEY4MEIsIDB4MDMgfSwKLQkJezB4RjgwQywgMHg3NCB9LAotCQl7MHhGODBELCAweDAzIH0sCi0JCXsweEY4MEUsIDB4ZjAgfSwKLQkJezB4RjgwRiwgMHg5MCB9LAotCQl7MHhGODEwLCAweDMwIH0sCi0JCXsweEY4MTEsIDB4MDQgfSwKLQkJezB4RjgxMiwgMHg3NCB9LAotCQl7MHhGODEzLCAweDMzIH0sCi0JCXsweEY4MTQsIDB4ZjAgfSwKLQkJezB4RjgxNSwgMHg5MCB9LAotCQl7MHhGODE2LCAweDMwIH0sCi0JCXsweEY4MTcsIDB4MDYgfSwKLQkJezB4RjgxOCwgMHhlNCB9LAotCQl7MHhGODE5LCAweGYwIH0sCi0JCXsweEY4MUEsIDB4YTMgfSwKLQkJezB4RjgxQiwgMHg3NCB9LAotCQl7MHhGODFDLCAweDA4IH0sCi0JCXsweEY4MUQsIDB4ZjAgfSwKLQkJezB4RjgxRSwgMHg5MCB9LAotCQl7MHhGODFGLCAweDMwIH0sCi0JCXsweEY4MjAsIDB4MTAgfSwKLQkJezB4RjgyMSwgMHhlNCB9LAotCQl7MHhGODIyLCAweGYwIH0sCi0JCXsweEY4MjMsIDB4YTMgfSwKLQkJezB4RjgyNCwgMHhmMCB9LAotCQl7MHhGODI1LCAweDkwIH0sCi0JCXsweEY4MjYsIDB4MzAgfSwKLQkJezB4RjgyNywgMHgxNiB9LAotCQl7MHhGODI4LCAweDc0IH0sCi0JCXsweEY4MjksIDB4MWUgfSwKLQkJezB4RjgyQSwgMHhmMCB9LAotCQl7MHhGODJCLCAweDkwIH0sCi0JCXsweEY4MkMsIDB4MzAgfSwKLQkJezB4RjgyRCwgMHgxYSB9LAotCQl7MHhGODJFLCAweDc0IH0sCi0JCXsweEY4MkYsIDB4NmEgfSwKLQkJezB4RjgzMCwgMHhmMCB9LAotCQl7MHhGODMxLCAweDkwIH0sCi0JCXsweEY4MzIsIDB4MzAgfSwKLQkJezB4RjgzMywgMHgzMCB9LAotCQl7MHhGODM0LCAweDc0IH0sCi0JCXsweEY4MzUsIDB4MDggfSwKLQkJezB4RjgzNiwgMHhmMCB9LAotCQl7MHhGODM3LCAweDkwIH0sCi0JCXsweEY4MzgsIDB4MzAgfSwKLQkJezB4RjgzOSwgMHgzNiB9LAotCQl7MHhGODNBLCAweDc0IH0sCi0JCXsweEY4M0IsIDB4MmMgfSwKLQkJezB4RjgzQywgMHhmMCB9LAotCQl7MHhGODNELCAweDkwIH0sCi0JCXsweEY4M0UsIDB4MzAgfSwKLQkJezB4RjgzRiwgMHg0MSB9LAotCQl7MHhGODQwLCAweGU0IH0sCi0JCXsweEY4NDEsIDB4ZjAgfSwKLQkJezB4Rjg0MiwgMHhhMyB9LAotCQl7MHhGODQzLCAweDc0IH0sCi0JCXsweEY4NDQsIDB4MjQgfSwKLQkJezB4Rjg0NSwgMHhmMCB9LAotCQl7MHhGODQ2LCAweDkwIH0sCi0JCXsweEY4NDcsIDB4MzAgfSwKLQkJezB4Rjg0OCwgMHg0NSB9LAotCQl7MHhGODQ5LCAweDc0IH0sCi0JCXsweEY4NEEsIDB4ODEgfSwKLQkJezB4Rjg0QiwgMHhmMCB9LAotCQl7MHhGODRDLCAweDkwIH0sCi0JCXsweEY4NEQsIDB4MzAgfSwKLQkJezB4Rjg0RSwgMHg5OCB9LAotCQl7MHhGODRGLCAweDc0IH0sCi0JCXsweEY4NTAsIDB4MDEgfSwKLQkJezB4Rjg1MSwgMHhmMCB9LAotCQl7MHhGODUyLCAweDkwIH0sCi0JCXsweEY4NTMsIDB4MzAgfSwKLQkJezB4Rjg1NCwgMHg5ZCB9LAotCQl7MHhGODU1LCAweDc0IH0sCi0JCXsweEY4NTYsIDB4MDUgfSwKLQkJezB4Rjg1NywgMHhmMCB9LAotCQl7MHhGODU4LCAweGU1IH0sCi0JCXsweEY4NTksIDB4N2QgfSwKLQkJezB4Rjg1QSwgMHg3MCB9LAotCQl7MHhGODVCLCAweDIyIH0sCi0JCXsweEY4NUMsIDB4OTAgfSwKLQkJezB4Rjg1RCwgMHgwMiB9LAotCQl7MHhGODVFLCAweDAwIH0sCi0JCXsweEY4NUYsIDB4NzQgfSwKLQkJezB4Rjg2MCwgMHgwMiB9LAotCQl7MHhGODYxLCAweGYwIH0sCi0JCXsweEY4NjIsIDB4YTMgfSwKLQkJezB4Rjg2MywgMHg3NCB9LAotCQl7MHhGODY0LCAweDU0IH0sCi0JCXsweEY4NjUsIDB4ZjAgfSwKLQkJezB4Rjg2NiwgMHg5MCB9LAotCQl7MHhGODY3LCAweDMwIH0sCi0JCXsweEY4NjgsIDB4MDUgfSwKLQkJezB4Rjg2OSwgMHg3NCB9LAotCQl7MHhGODZBLCAweDAxIH0sCi0JCXsweEY4NkIsIDB4ZjAgfSwKLQkJezB4Rjg2QywgMHg5MCB9LAotCQl7MHhGODZELCAweDMwIH0sCi0JCXsweEY4NkUsIDB4MWIgfSwKLQkJezB4Rjg2RiwgMHg3NCB9LAotCQl7MHhGODcwLCAweDI5IH0sCi0JCXsweEY4NzEsIDB4ZjAgfSwKLQkJezB4Rjg3MiwgMHg5MCB9LAotCQl7MHhGODczLCAweDMwIH0sCi0JCXsweEY4NzQsIDB4MzAgfSwKLQkJezB4Rjg3NSwgMHhlNCB9LAotCQl7MHhGODc2LCAweGYwIH0sCi0JCXsweEY4NzcsIDB4OTAgfSwKLQkJezB4Rjg3OCwgMHgzMCB9LAotCQl7MHhGODc5LCAweDM1IH0sCi0JCXsweEY4N0EsIDB4MDQgfSwKLQkJezB4Rjg3QiwgMHhmMCB9LAotCQl7MHhGODdDLCAweDgwIH0sCi0JCXsweEY4N0QsIDB4NjkgfSwKLQkJezB4Rjg3RSwgMHhlNSB9LAotCQl7MHhGODdGLCAweDdkIH0sCi0JCXsweEY4ODAsIDB4NjQgfSwKLQkJezB4Rjg4MSwgMHgwMiB9LAotCQl7MHhGODgyLCAweDcwIH0sCi0JCXsweEY4ODMsIDB4M2MgfSwKLQkJezB4Rjg4NCwgMHg5MCB9LAotCQl7MHhGODg1LCAweDAyIH0sCi0JCXsweEY4ODYsIDB4MDAgfSwKLQkJezB4Rjg4NywgMHg3NCB9LAotCQl7MHhGODg4LCAweDA0IH0sCi0JCXsweEY4ODksIDB4ZjAgfSwKLQkJezB4Rjg4QSwgMHhhMyB9LAotCQl7MHhGODhCLCAweDc0IH0sCi0JCXsweEY4OEMsIDB4MTAgfSwKLQkJezB4Rjg4RCwgMHhmMCB9LAotCQl7MHhGODhFLCAweDkwIH0sCi0JCXsweEY4OEYsIDB4MzAgfSwKLQkJezB4Rjg5MCwgMHgwNCB9LAotCQl7MHhGODkxLCAweDc0IH0sCi0JCXsweEY4OTIsIDB4MzQgfSwKLQkJezB4Rjg5MywgMHhmMCB9LAotCQl7MHhGODk0LCAweGEzIH0sCi0JCXsweEY4OTUsIDB4NzQgfSwKLQkJezB4Rjg5NiwgMHgwNyB9LAotCQl7MHhGODk3LCAweGYwIH0sCi0JCXsweEY4OTgsIDB4OTAgfSwKLQkJezB4Rjg5OSwgMHgzMCB9LAotCQl7MHhGODlBLCAweDEwIH0sCi0JCXsweEY4OUIsIDB4NzQgfSwKLQkJezB4Rjg5QywgMHgxMCB9LAotCQl7MHhGODlELCAweGYwIH0sCi0JCXsweEY4OUUsIDB4OTAgfSwKLQkJezB4Rjg5RiwgMHgzMCB9LAotCQl7MHhGOEEwLCAweDE2IH0sCi0JCXsweEY4QTEsIDB4NzQgfSwKLQkJezB4RjhBMiwgMHgxZiB9LAotCQl7MHhGOEEzLCAweGYwIH0sCi0JCXsweEY4QTQsIDB4OTAgfSwKLQkJezB4RjhBNSwgMHgzMCB9LAotCQl7MHhGOEE2LCAweDFhIH0sCi0JCXsweEY4QTcsIDB4NzQgfSwKLQkJezB4RjhBOCwgMHg2MiB9LAotCQl7MHhGOEE5LCAweGYwIH0sCi0JCXsweEY4QUEsIDB4YTMgfSwKLQkJezB4RjhBQiwgMHg3NCB9LAotCQl7MHhGOEFDLCAweDJhIH0sCi0JCXsweEY4QUQsIDB4ZjAgfSwKLQkJezB4RjhBRSwgMHg5MCB9LAotCQl7MHhGOEFGLCAweDMwIH0sCi0JCXsweEY4QjAsIDB4MzUgfSwKLQkJezB4RjhCMSwgMHg3NCB9LAotCQl7MHhGOEIyLCAweDA0IH0sCi0JCXsweEY4QjMsIDB4ZjAgfSwKLQkJezB4RjhCNCwgMHg5MCB9LAotCQl7MHhGOEI1LCAweDMwIH0sCi0JCXsweEY4QjYsIDB4NDEgfSwKLQkJezB4RjhCNywgMHg3NCB9LAotCQl7MHhGOEI4LCAweDYwIH0sCi0JCXsweEY4QjksIDB4ZjAgfSwKLQkJezB4RjhCQSwgMHhhMyB9LAotCQl7MHhGOEJCLCAweDc0IH0sCi0JCXsweEY4QkMsIDB4NjQgfSwKLQkJezB4RjhCRCwgMHhmMCB9LAotCQl7MHhGOEJFLCAweDgwIH0sCi0JCXsweEY4QkYsIDB4MjcgfSwKLQkJezB4RjhDMCwgMHhlNSB9LAotCQl7MHhGOEMxLCAweDdkIH0sCi0JCXsweEY4QzIsIDB4YjQgfSwKLQkJezB4RjhDMywgMHgwMyB9LAotCQl7MHhGOEM0LCAweDIyIH0sCi0JCXsweEY4QzUsIDB4OTAgfSwKLQkJezB4RjhDNiwgMHgwMiB9LAotCQl7MHhGOEM3LCAweDAwIH0sCi0JCXsweEY4QzgsIDB4NzQgfSwKLQkJezB4RjhDOSwgMHgwMiB9LAotCQl7MHhGOENBLCAweGYwIH0sCi0JCXsweEY4Q0IsIDB4YTMgfSwKLQkJezB4RjhDQywgMHg3NCB9LAotCQl7MHhGOENELCAweDI2IH0sCi0JCXsweEY4Q0UsIDB4ZjAgfSwKLQkJezB4RjhDRiwgMHg5MCB9LAotCQl7MHhGOEQwLCAweDMwIH0sCi0JCXsweEY4RDEsIDB4MDUgfSwKLQkJezB4RjhEMiwgMHg3NCB9LAotCQl7MHhGOEQzLCAweDAzIH0sCi0JCXsweEY4RDQsIDB4ZjAgfSwKLQkJezB4RjhENSwgMHg5MCB9LAotCQl7MHhGOEQ2LCAweDMwIH0sCi0JCXsweEY4RDcsIDB4MTEgfSwKLQkJezB4RjhEOCwgMHg3NCB9LAotCQl7MHhGOEQ5LCAweDAxIH0sCi0JCXsweEY4REEsIDB4ZjAgfSwKLQkJezB4RjhEQiwgMHg5MCB9LAotCQl7MHhGOERDLCAweDMwIH0sCi0JCXsweEY4REQsIDB4MWIgfSwKLQkJezB4RjhERSwgMHg3NCB9LAotCQl7MHhGOERGLCAweDJhIH0sCi0JCXsweEY4RTAsIDB4ZjAgfSwKLQkJezB4RjhFMSwgMHg5MCB9LAotCQl7MHhGOEUyLCAweDMwIH0sCi0JCXsweEY4RTMsIDB4MzUgfSwKLQkJezB4RjhFNCwgMHg3NCB9LAotCQl7MHhGOEU1LCAweDAzIH0sCi0JCXsweEY4RTYsIDB4ZjAgfSwKLQkJezB4RjhFNywgMHg5MCB9LAotCQl7MHhGOEU4LCAweDQxIH0sCi0JCXsweEY4RTksIDB4MDEgfSwKLQkJezB4RjhFQSwgMHhlMCB9LAotCQl7MHhGOEVCLCAweGY1IH0sCi0JCXsweEY4RUMsIDB4NzkgfSwKLQkJezB4RjhFRCwgMHg5MCB9LAotCQl7MHhGOEVFLCAweDQzIH0sCi0JCXsweEY4RUYsIDB4ODcgfSwKLQkJezB4RjhGMCwgMHhlMCB9LAotCQl7MHhGOEYxLCAweGY1IH0sCi0JCXsweEY4RjIsIDB4N2EgfSwKLQkJezB4RjhGMywgMHg5MCB9LAotCQl7MHhGOEY0LCAweDQyIH0sCi0JCXsweEY4RjUsIDB4MDUgfSwKLQkJezB4RjhGNiwgMHhlMCB9LAotCQl7MHhGOEY3LCAweGY1IH0sCi0JCXsweEY4RjgsIDB4N2IgfSwKLQkJezB4RjhGOSwgMHgyMiB9LAotCQl7MHhGOEZBLCAweDc4IH0sCi0JCXsweEY4RkIsIDB4MDcgfSwKLQkJezB4RjhGQywgMHhlNiB9LAotCQl7MHhGOEZELCAweGY1IH0sCi0JCXsweEY4RkUsIDB4N2MgfSwKLQkJezB4RjhGRiwgMHhlNSB9LAotCQl7MHhGOTAwLCAweDdjIH0sCi0JCXsweEY5MDEsIDB4NjAgfSwKLQkJezB4RjkwMiwgMHgxZSB9LAotCQl7MHhGOTAzLCAweDkwIH0sCi0JCXsweEY5MDQsIDB4NDMgfSwKLQkJezB4RjkwNSwgMHg4MyB9LAotCQl7MHhGOTA2LCAweGUwIH0sCi0JCXsweEY5MDcsIDB4YjQgfSwKLQkJezB4RjkwOCwgMHgwMSB9LAotCQl7MHhGOTA5LCAweDE3IH0sCi0JCXsweEY5MEEsIDB4OTAgfSwKLQkJezB4RjkwQiwgMHg0MyB9LAotCQl7MHhGOTBDLCAweDg3IH0sCi0JCXsweEY5MEQsIDB4ZTAgfSwKLQkJezB4RjkwRSwgMHhiNCB9LAotCQl7MHhGOTBGLCAweDAxIH0sCi0JCXsweEY5MTAsIDB4MTAgfSwKLQkJezB4RjkxMSwgMHgxNSB9LAotCQl7MHhGOTEyLCAweDdjIH0sCi0JCXsweEY5MTMsIDB4OTAgfSwKLQkJezB4RjkxNCwgMHgzMCB9LAotCQl7MHhGOTE1LCAweGExIH0sCi0JCXsweEY5MTYsIDB4ZTUgfSwKLQkJezB4RjkxNywgMHg3YyB9LAotCQl7MHhGOTE4LCAweGYwIH0sCi0JCXsweEY5MTksIDB4OTAgfSwKLQkJezB4RjkxQSwgMHgzMCB9LAotCQl7MHhGOTFCLCAweGEwIH0sCi0JCXsweEY5MUMsIDB4NzQgfSwKLQkJezB4RjkxRCwgMHgwMSB9LAotCQl7MHhGOTFFLCAweGYwIH0sCi0JCXsweEY5MUYsIDB4ODAgfSwKLQkJezB4RjkyMCwgMHgwNSB9LAotCQl7MHhGOTIxLCAweGU0IH0sCi0JCXsweEY5MjIsIDB4OTAgfSwKLQkJezB4RjkyMywgMHgzMCB9LAotCQl7MHhGOTI0LCAweGEwIH0sCi0JCXsweEY5MjUsIDB4ZjAgfSwKLQkJezB4RjkyNiwgMHg5MCB9LAotCQl7MHhGOTI3LCAweDQxIH0sCi0JCXsweEY5MjgsIDB4MDEgfSwKLQkJezB4RjkyOSwgMHhlMCB9LAotCQl7MHhGOTJBLCAweGZjIH0sCi0JCXsweEY5MkIsIDB4NTQgfSwKLQkJezB4RjkyQywgMHgwMiB9LAotCQl7MHhGOTJELCAweGZlIH0sCi0JCXsweEY5MkUsIDB4ZTUgfSwKLQkJezB4RjkyRiwgMHg3OSB9LAotCQl7MHhGOTMwLCAweDU0IH0sCi0JCXsweEY5MzEsIDB4MDIgfSwKLQkJezB4RjkzMiwgMHhiNSB9LAotCQl7MHhGOTMzLCAweDA2IH0sCi0JCXsweEY5MzQsIDB4MGYgfSwKLQkJezB4RjkzNSwgMHg5MCB9LAotCQl7MHhGOTM2LCAweDQzIH0sCi0JCXsweEY5MzcsIDB4ODcgfSwKLQkJezB4RjkzOCwgMHhlMCB9LAotCQl7MHhGOTM5LCAweGI1IH0sCi0JCXsweEY5M0EsIDB4N2EgfSwKLQkJezB4RjkzQiwgMHgwOCB9LAotCQl7MHhGOTNDLCAweDkwIH0sCi0JCXsweEY5M0QsIDB4NDIgfSwKLQkJezB4RjkzRSwgMHgwNSB9LAotCQl7MHhGOTNGLCAweGUwIH0sCi0JCXsweEY5NDAsIDB4NjUgfSwKLQkJezB4Rjk0MSwgMHg3YiB9LAotCQl7MHhGOTQyLCAweDYwIH0sCi0JCXsweEY5NDMsIDB4MGIgfSwKLQkJezB4Rjk0NCwgMHg5MCB9LAotCQl7MHhGOTQ1LCAweDMwIH0sCi0JCXsweEY5NDYsIDB4NTAgfSwKLQkJezB4Rjk0NywgMHhlMCB9LAotCQl7MHhGOTQ4LCAweDU0IH0sCi0JCXsweEY5NDksIDB4ZjkgfSwKLQkJezB4Rjk0QSwgMHg0NCB9LAotCQl7MHhGOTRCLCAweDAyIH0sCi0JCXsweEY5NEMsIDB4ZjAgfSwKLQkJezB4Rjk0RCwgMHg4MCB9LAotCQl7MHhGOTRFLCAweDA5IH0sCi0JCXsweEY5NEYsIDB4OTAgfSwKLQkJezB4Rjk1MCwgMHgzMCB9LAotCQl7MHhGOTUxLCAweDUwIH0sCi0JCXsweEY5NTIsIDB4ZTAgfSwKLQkJezB4Rjk1MywgMHg1NCB9LAotCQl7MHhGOTU0LCAweGY5IH0sCi0JCXsweEY5NTUsIDB4NDQgfSwKLQkJezB4Rjk1NiwgMHgwNCB9LAotCQl7MHhGOTU3LCAweGYwIH0sCi0JCXsweEY5NTgsIDB4OGMgfSwKLQkJezB4Rjk1OSwgMHg3OSB9LAotCQl7MHhGOTVBLCAweDkwIH0sCi0JCXsweEY5NUIsIDB4NDMgfSwKLQkJezB4Rjk1QywgMHg4NyB9LAotCQl7MHhGOTVELCAweGUwIH0sCi0JCXsweEY5NUUsIDB4ZjUgfSwKLQkJezB4Rjk1RiwgMHg3YSB9LAotCQl7MHhGOTYwLCAweDkwIH0sCi0JCXsweEY5NjEsIDB4NDIgfSwKLQkJezB4Rjk2MiwgMHgwNSB9LAotCQl7MHhGOTYzLCAweGUwIH0sCi0JCXsweEY5NjQsIDB4ZjUgfSwKLQkJezB4Rjk2NSwgMHg3YiB9LAotCQl7MHhGOTY2LCAweDIyIH0sCi0JCXsweEY5NjcsIDB4YzMgfSwKLQkJezB4Rjk2OCwgMHg5MCB9LAotCQl7MHhGOTY5LCAweDBiIH0sCi0JCXsweEY5NkEsIDB4ODkgfSwKLQkJezB4Rjk2QiwgMHhlMCB9LAotCQl7MHhGOTZDLCAweDk0IH0sCi0JCXsweEY5NkQsIDB4MWUgfSwKLQkJezB4Rjk2RSwgMHg5MCB9LAotCQl7MHhGOTZGLCAweDBiIH0sCi0JCXsweEY5NzAsIDB4ODggfSwKLQkJezB4Rjk3MSwgMHhlMCB9LAotCQl7MHhGOTcyLCAweDk0IH0sCi0JCXsweEY5NzMsIDB4MDAgfSwKLQkJezB4Rjk3NCwgMHg1MCB9LAotCQl7MHhGOTc1LCAweDA2IH0sCi0JCXsweEY5NzYsIDB4N2UgfSwKLQkJezB4Rjk3NywgMHgwMCB9LAotCQl7MHhGOTc4LCAweDdmIH0sCi0JCXsweEY5NzksIDB4MDEgfSwKLQkJezB4Rjk3QSwgMHg4MCB9LAotCQl7MHhGOTdCLCAweDNkIH0sCi0JCXsweEY5N0MsIDB4YzMgfSwKLQkJezB4Rjk3RCwgMHg5MCB9LAotCQl7MHhGOTdFLCAweDBiIH0sCi0JCXsweEY5N0YsIDB4ODkgfSwKLQkJezB4Rjk4MCwgMHhlMCB9LAotCQl7MHhGOTgxLCAweDk0IH0sCi0JCXsweEY5ODIsIDB4M2MgfSwKLQkJezB4Rjk4MywgMHg5MCB9LAotCQl7MHhGOTg0LCAweDBiIH0sCi0JCXsweEY5ODUsIDB4ODggfSwKLQkJezB4Rjk4NiwgMHhlMCB9LAotCQl7MHhGOTg3LCAweDk0IH0sCi0JCXsweEY5ODgsIDB4MDAgfSwKLQkJezB4Rjk4OSwgMHg1MCB9LAotCQl7MHhGOThBLCAweDA2IH0sCi0JCXsweEY5OEIsIDB4N2UgfSwKLQkJezB4Rjk4QywgMHgwMCB9LAotCQl7MHhGOThELCAweDdmIH0sCi0JCXsweEY5OEUsIDB4MDIgfSwKLQkJezB4Rjk4RiwgMHg4MCB9LAotCQl7MHhGOTkwLCAweDI4IH0sCi0JCXsweEY5OTEsIDB4YzMgfSwKLQkJezB4Rjk5MiwgMHg5MCB9LAotCQl7MHhGOTkzLCAweDBiIH0sCi0JCXsweEY5OTQsIDB4ODkgfSwKLQkJezB4Rjk5NSwgMHhlMCB9LAotCQl7MHhGOTk2LCAweDk0IH0sCi0JCXsweEY5OTcsIDB4ZmEgfSwKLQkJezB4Rjk5OCwgMHg5MCB9LAotCQl7MHhGOTk5LCAweDBiIH0sCi0JCXsweEY5OUEsIDB4ODggfSwKLQkJezB4Rjk5QiwgMHhlMCB9LAotCQl7MHhGOTlDLCAweDk0IH0sCi0JCXsweEY5OUQsIDB4MDAgfSwKLQkJezB4Rjk5RSwgMHg1MCB9LAotCQl7MHhGOTlGLCAweDA2IH0sCi0JCXsweEY5QTAsIDB4N2UgfSwKLQkJezB4RjlBMSwgMHgwMCB9LAotCQl7MHhGOUEyLCAweDdmIH0sCi0JCXsweEY5QTMsIDB4MDMgfSwKLQkJezB4RjlBNCwgMHg4MCB9LAotCQl7MHhGOUE1LCAweDEzIH0sCi0JCXsweEY5QTYsIDB4YzMgfSwKLQkJezB4RjlBNywgMHg5MCB9LAotCQl7MHhGOUE4LCAweDBiIH0sCi0JCXsweEY5QTksIDB4ODggfSwKLQkJezB4RjlBQSwgMHhlMCB9LAotCQl7MHhGOUFCLCAweDk0IH0sCi0JCXsweEY5QUMsIDB4ODAgfSwKLQkJezB4RjlBRCwgMHg1MCB9LAotCQl7MHhGOUFFLCAweDA2IH0sCi0JCXsweEY5QUYsIDB4N2UgfSwKLQkJezB4RjlCMCwgMHgwMCB9LAotCQl7MHhGOUIxLCAweDdmIH0sCi0JCXsweEY5QjIsIDB4MDQgfSwKLQkJezB4RjlCMywgMHg4MCB9LAotCQl7MHhGOUI0LCAweDA0IH0sCi0JCXsweEY5QjUsIDB4YWUgfSwKLQkJezB4RjlCNiwgMHg3ZSB9LAotCQl7MHhGOUI3LCAweGFmIH0sCi0JCXsweEY5QjgsIDB4N2YgfSwKLQkJezB4RjlCOSwgMHg5MCB9LAotCQl7MHhGOUJBLCAweGEwIH0sCi0JCXsweEY5QkIsIDB4ZjggfSwKLQkJezB4RjlCQywgMHhlZSB9LAotCQl7MHhGOUJELCAweGYwIH0sCi0JCXsweEY5QkUsIDB4YTMgfSwKLQkJezB4RjlCRiwgMHhlZiB9LAotCQl7MHhGOUMwLCAweGYwIH0sCi0JCXsweEY5QzEsIDB4MjIgfSwKLQkJezB4RjlDMiwgMHg5MCB9LAotCQl7MHhGOUMzLCAweDMzIH0sCi0JCXsweEY5QzQsIDB4ODIgfSwKLQkJezB4RjlDNSwgMHhlMCB9LAotCQl7MHhGOUM2LCAweGZmIH0sCi0JCXsweEY5QzcsIDB4NjQgfSwKLQkJezB4RjlDOCwgMHgwMSB9LAotCQl7MHhGOUM5LCAweDcwIH0sCi0JCXsweEY5Q0EsIDB4MzAgfSwKLQkJezB4RjlDQiwgMHhlNSB9LAotCQl7MHhGOUNDLCAweDdmIH0sCi0JCXsweEY5Q0QsIDB4NjQgfSwKLQkJezB4RjlDRSwgMHgwMiB9LAotCQl7MHhGOUNGLCAweDQ1IH0sCi0JCXsweEY5RDAsIDB4N2UgfSwKLQkJezB4RjlEMSwgMHg3MCB9LAotCQl7MHhGOUQyLCAweDA0IH0sCi0JCXsweEY5RDMsIDB4N2QgfSwKLQkJezB4RjlENCwgMHgxZSB9LAotCQl7MHhGOUQ1LCAweDgwIH0sCi0JCXsweEY5RDYsIDB4MWQgfSwKLQkJezB4RjlENywgMHhlNSB9LAotCQl7MHhGOUQ4LCAweDdmIH0sCi0JCXsweEY5RDksIDB4NjQgfSwKLQkJezB4RjlEQSwgMHgwMyB9LAotCQl7MHhGOURCLCAweDQ1IH0sCi0JCXsweEY5REMsIDB4N2UgfSwKLQkJezB4RjlERCwgMHg3MCB9LAotCQl7MHhGOURFLCAweDA0IH0sCi0JCXsweEY5REYsIDB4N2QgfSwKLQkJezB4RjlFMCwgMHgzYyB9LAotCQl7MHhGOUUxLCAweDgwIH0sCi0JCXsweEY5RTIsIDB4MTEgfSwKLQkJezB4RjlFMywgMHhlNSB9LAotCQl7MHhGOUU0LCAweDdmIH0sCi0JCXsweEY5RTUsIDB4NjQgfSwKLQkJezB4RjlFNiwgMHgwNCB9LAotCQl7MHhGOUU3LCAweDQ1IH0sCi0JCXsweEY5RTgsIDB4N2UgfSwKLQkJezB4RjlFOSwgMHg3MCB9LAotCQl7MHhGOUVBLCAweDA0IH0sCi0JCXsweEY5RUIsIDB4N2QgfSwKLQkJezB4RjlFQywgMHhmYSB9LAotCQl7MHhGOUVELCAweDgwIH0sCi0JCXsweEY5RUUsIDB4MDUgfSwKLQkJezB4RjlFRiwgMHg5MCB9LAotCQl7MHhGOUYwLCAweDMzIH0sCi0JCXsweEY5RjEsIDB4ODEgfSwKLQkJezB4RjlGMiwgMHhlMCB9LAotCQl7MHhGOUYzLCAweGZkIH0sCi0JCXsweEY5RjQsIDB4YWUgfSwKLQkJezB4RjlGNSwgMHgwNSB9LAotCQl7MHhGOUY2LCAweDkwIH0sCi0JCXsweEY5RjcsIDB4MzMgfSwKLQkJezB4RjlGOCwgMHg4MSB9LAotCQl7MHhGOUY5LCAweGVkIH0sCi0JCXsweEY5RkEsIDB4ZjAgfSwKLQkJezB4RjlGQiwgMHhlZiB9LAotCQl7MHhGOUZDLCAweGI0IH0sCi0JCXsweEY5RkQsIDB4MDEgfSwKLQkJezB4RjlGRSwgMHgxMCB9LAotCQl7MHhGOUZGLCAweDkwIH0sCi0JCXsweEZBMDAsIDB4MDEgfSwKLQkJezB4RkEwMSwgMHgwMCB9LAotCQl7MHhGQTAyLCAweGUwIH0sCi0JCXsweEZBMDMsIDB4NjAgfSwKLQkJezB4RkEwNCwgMHgwYSB9LAotCQl7MHhGQTA1LCAweDkwIH0sCi0JCXsweEZBMDYsIDB4YTEgfSwKLQkJezB4RkEwNywgMHgxMCB9LAotCQl7MHhGQTA4LCAweGUwIH0sCi0JCXsweEZBMDksIDB4ZjUgfSwKLQkJezB4RkEwQSwgMHg3ZSB9LAotCQl7MHhGQTBCLCAweGEzIH0sCi0JCXsweEZBMEMsIDB4ZTAgfSwKLQkJezB4RkEwRCwgMHhmNSB9LAotCQl7MHhGQTBFLCAweDdmIH0sCi0JCXsweEZBMEYsIDB4MjIgfSwKLQkJezB4RkExMCwgMHgxMiB9LAotCQl7MHhGQTExLCAweDJmIH0sCi0JCXsweEZBMTIsIDB4NGQgfSwKLQkJezB4RkExMywgMHg5MCB9LAotCQl7MHhGQTE0LCAweDM1IH0sCi0JCXsweEZBMTUsIDB4MzggfSwKLQkJezB4RkExNiwgMHhlMCB9LAotCQl7MHhGQTE3LCAweDcwIH0sCi0JCXsweEZBMTgsIDB4MDUgfSwKLQkJezB4RkExOSwgMHgxMiB9LAotCQl7MHhGQTFBLCAweDAwIH0sCi0JCXsweEZBMUIsIDB4MGUgfSwKLQkJezB4RkExQywgMHg4MCB9LAotCQl7MHhGQTFELCAweDAzIH0sCi0JCXsweEZBMUUsIDB4MTIgfSwKLQkJezB4RkExRiwgMHgwNyB9LAotCQl7MHhGQTIwLCAweGM5IH0sCi0JCXsweEZBMjEsIDB4OTAgfSwKLQkJezB4RkEyMiwgMHg0MCB9LAotCQl7MHhGQTIzLCAweDA2IH0sCi0JCXsweEZBMjQsIDB4ZTAgfSwKLQkJezB4RkEyNSwgMHhmNCB9LAotCQl7MHhGQTI2LCAweDU0IH0sCi0JCXsweEZBMjcsIDB4MDIgfSwKLQkJezB4RkEyOCwgMHhmZiB9LAotCQl7MHhGQTI5LCAweGUwIH0sCi0JCXsweEZBMkEsIDB4NTQgfSwKLQkJezB4RkEyQiwgMHgwMSB9LAotCQl7MHhGQTJDLCAweDRmIH0sCi0JCXsweEZBMkQsIDB4OTAgfSwKLQkJezB4RkEyRSwgMHgzMSB9LAotCQl7MHhGQTJGLCAweDMyIH0sCi0JCXsweEZBMzAsIDB4ZjAgfSwKLQkJezB4RkEzMSwgMHg5MCB9LAotCQl7MHhGQTMyLCAweGZhIH0sCi0JCXsweEZBMzMsIDB4OWQgfSwKLQkJezB4RkEzNCwgMHhlMCB9LAotCQl7MHhGQTM1LCAweDcwIH0sCi0JCXsweEZBMzYsIDB4MDMgfSwKLQkJezB4RkEzNywgMHgxMiB9LAotCQl7MHhGQTM4LCAweDI3IH0sCi0JCXsweEZBMzksIDB4MjcgfSwKLQkJezB4RkEzQSwgMHgwMiB9LAotCQl7MHhGQTNCLCAweDA1IH0sCi0JCXsweEZBM0MsIDB4YWMgfSwKLQkJezB4RkEzRCwgMHgyMiB9LAotCQl7MHhGQTNFLCAweGYwIH0sCi0JCXsweEZBM0YsIDB4ZTUgfSwKLQkJezB4RkE0MCwgMHgzYSB9LAotCQl7MHhGQTQxLCAweGI0IH0sCi0JCXsweEZBNDIsIDB4MDYgfSwKLQkJezB4RkE0MywgMHgwNiB9LAotCQl7MHhGQTQ0LCAweDYzIH0sCi0JCXsweEZBNDUsIDB4M2UgfSwKLQkJezB4RkE0NiwgMHgwMiB9LAotCQl7MHhGQTQ3LCAweDEyIH0sCi0JCXsweEZBNDgsIDB4MDMgfSwKLQkJezB4RkE0OSwgMHhlYSB9LAotCQl7MHhGQTRBLCAweDAyIH0sCi0JCXsweEZBNEIsIDB4MTcgfSwKLQkJezB4RkE0QywgMHg0YSB9LAotCQl7MHhGQTRELCAweDIyIH0sCi0JCXsweDM1QzksIDB4RkEgfSwKLQkJezB4MzVDQSwgMHgwMSB9LAotCQl7MHgzNUNCLCAweDY3IH0sCi0JCXsweDM1Q0MsIDB4MDEgfSwKLQkJezB4MzVDRCwgMHhDMiB9LAotCQl7MHgzNUNFLCAweDAyIH0sCi0JCXsweDM1Q0YsIDB4MTAgfSwKLQkJezB4MzVEMCwgMHgwMiB9LAotCQl7MHgzNUQxLCAweDNFIH0sCi0JCXsweDM1RDMsIDB4RjYgfSwKLQkJezB4MzVENSwgMHgwNyB9LAotCQl7MHgzNUQ3LCAweEEzIH0sCi0JCXsweDM1REIsIDB4MDIgfSwKLQkJezB4MzVERCwgMHgwNiB9LAotCQl7MHgzNURGLCAweDI3IH0sCi0JCXsweDM1RTYsIDB4MjggfSwKLQkJezB4MzVFNywgMHg3NiB9LAotCQl7MHgzNUU4LCAweDJBIH0sCi0JCXsweDM1RTksIDB4MTUgfSwKLQkJezB4MzVFQSwgMHgyRCB9LAotCQl7MHgzNUVCLCAweDA3IH0sCi0JCXsweDM1RUMsIDB4MDQgfSwKLQkJezB4MzVFRCwgMHg0MyB9LAotCQl7MHgzNUVFLCAweDA1IH0sCi0JCXsweDM1RUYsIDB4QTkgfSwKLQkJezB4MzVGMCwgMHgxNyB9LAotCQl7MHgzNUYxLCAweDQxIH0sCi0JCXsweDM1RjIsIDB4MjQgfSwKLQkJezB4MzVGMywgMHg4OCB9LAotCQl7MHgzNUY0LCAweDAxIH0sCi0JCXsweDM1RjUsIDB4NTQgfSwKLQkJezB4MzVGNiwgMHgwMSB9LAotCQl7MHgzNUY3LCAweDU1IH0sCi0JCXsweDM1RjgsIDB4MkUgfSwKLQkJezB4MzVGOSwgMHhGMiB9LAotCQl7MHgzNUZBLCAweDA2IH0sCi0JCXsweDM1RkIsIDB4MDIgfSwKLQkJezB4MzVGQywgMHgwNiB9LAotCQl7MHgzNUZELCAweDAzIH0sCi0JCXsweDM1RkUsIDB4MDYgfSwKLQkJezB4MzVGRiwgMHgwNCB9LAotCQl7MHgzNjAwLCAweDBGIH0sCi0JCXsweDM2MDEsIDB4NDggfSwKLQkJezB4MzYwMiwgMHgwRiB9LAotCQl7MHgzNjAzLCAweDQ5IH0sCi0JCXsweDM2MDQsIDB4MEYgfSwKLQkJezB4MzYwNSwgMHg0QSB9LAotCQl7MHgzNUMyLCAweEZGIH0sCi0JCXsweDM1QzMsIDB4RkYgfSwKLQkJezB4MzVDNCwgMHhGRiB9LAotCQl7MHgzNUM1LCAweEMwIH0sCi0JCXsweDM1QzAsIDB4MDEgfSwKLQotCi0JCXsweGEwOTgsIDB4MDIgfSwKLQkJezB4YTA5OSwgMHg4NyB9LAotCQl7MHhhMDljLCAweDAwIH0sCi0JCXsweGEwOWQsIDB4YzUgfSwKLQkJezB4YTRlYywgMHgwNSB9LAotCQl7MHhhNGVkLCAweDA1IH0sCi0JCXsweGE0ZjAsIDB4MDQgfSwKLQkJezB4YTRmMSwgMHgwNCB9LAotCQl7MHhhNGY0LCAweDA0IH0sCi0JCXsweGE0ZjUsIDB4MDUgfSwKLQkJezB4YTRmOCwgMHgwNSB9LAotCQl7MHhhNGY5LCAweDA3IH0sCi0JCXsweGE0ZmMsIDB4MDcgfSwKLQkJezB4YTRmZCwgMHgwNyB9LAotCQl7MHhhNTAwLCAweDA3IH0sCi0JCXsweGE1MDEsIDB4MDcgfSwKLQkJezB4YTUwNCwgMHgwOCB9LAotCQl7MHhhNTA1LCAweDA4IH0sCi0JCXsweGE1MTgsIDB4MDEgfSwKLQkJezB4YTUxOSwgMHgwMiB9LAotCQl7MHhhNTFjLCAweDAxIH0sCi0JCXsweGE1MWQsIDB4MDAgfSwKLQkJezB4YTUzNCwgMHgwMCB9LAotCQl7MHhhNTM1LCAweDA0IH0sCi0JCXsweGE1MzgsIDB4MDQgfSwKLQkJezB4YTUzOSwgMHgwMyB9LAotCQl7MHhhNTNjLCAweDA1IH0sCi0JCXsweGE1M2QsIDB4MDcgfSwKLQkJezB4YTU0MCwgMHgwNyB9LAotCQl7MHhhNTQxLCAweDA2IH0sCi0JCXsweGE1NDQsIDB4MDcgfSwKLQkJezB4YTU0NSwgMHgwNiB9LAotCQl7MHhhNTQ4LCAweDA1IH0sCi0JCXsweGE1NDksIDB4MDYgfSwKLQkJezB4YTU0YywgMHgwNiB9LAotCQl7MHhhNTRkLCAweDA3IH0sCi0JCXsweGE1NTAsIDB4MDcgfSwKLQkJezB4YTU1MSwgMHgwNCB9LAotCQl7MHhhNTU0LCAweDA0IH0sCi0JCXsweGE1NTUsIDB4MDQgfSwKLQkJezB4YTU1OCwgMHgwNSB9LAotCQl7MHhhNTU5LCAweDA2IH0sCi0JCXsweGE1NWMsIDB4MDcgfSwKLQkJezB4YTU1ZCwgMHgwNyB9LAotCQl7MHhhNTZjLCAweDAwIH0sCi0JCXsweGE1NmQsIDB4MGEgfSwKLQkJezB4YTU3MCwgMHgwOCB9LAotCQl7MHhhNTcxLCAweDA1IH0sCi0JCXsweGE1NzQsIDB4MDQgfSwKLQkJezB4YTU3NSwgMHgwMyB9LAotCQl7MHhhNTc4LCAweDA0IH0sCi0JCXsweGE1NzksIDB4MDQgfSwKLQkJezB4YTU4YywgMHgxZiB9LAotCQl7MHhhNThkLCAweDFiIH0sCi0JCXsweGE1OTAsIDB4MTcgfSwKLQkJezB4YTU5MSwgMHgxMyB9LAotCQl7MHhhNTk0LCAweDEwIH0sCi0JCXsweGE1OTUsIDB4MGQgfSwKLQkJezB4YTU5OCwgMHgwZiB9LAotCQl7MHhhNTk5LCAweDExIH0sCi0JCXsweGE1OWMsIDB4MDMgfSwKLQkJezB4YTU5ZCwgMHgwMyB9LAotCQl7MHhhNWEwLCAweDAzIH0sCi0JCXsweGE1YTEsIDB4MDMgfSwKLQkJezB4YTVhNCwgMHgwMyB9LAotCQl7MHhhNWE1LCAweDA0IH0sCi0JCXsweGE1YTgsIDB4MDUgfSwKLQkJezB4YTVhOSwgMHgwMCB9LAotCQl7MHhhNWFjLCAweDAwIH0sCi0JCXsweGE1YWQsIDB4MDAgfSwKLQkJezB4YTViMCwgMHgwMCB9LAotCQl7MHhhNWIxLCAweDAwIH0sCi0JCXsweGE1YjQsIDB4MDAgfSwKLQkJezB4YTViNSwgMHgwMCB9LAotCQl7MHhhNWM0LCAweDFmIH0sCi0JCXsweGE1YzUsIDB4MTMgfSwKLQkJezB4YTVjOCwgMHgxNCB9LAotCQl7MHhhNWM5LCAweDE0IH0sCi0JCXsweGE1Y2MsIDB4MTQgfSwKLQkJezB4YTVjZCwgMHgxMyB9LAotCQl7MHhhNWQwLCAweDE3IH0sCi0JCXsweGE1ZDEsIDB4MWEgfSwKLQkJezB4YTVmNCwgMHgwNSB9LAotCQl7MHhhNWY1LCAweDA1IH0sCi0JCXsweGE1ZjgsIDB4MDUgfSwKLQkJezB4YTVmOSwgMHgwNiB9LAotCQl7MHhhNWZjLCAweDA2IH0sCi0JCXsweGE1ZmQsIDB4MDYgfSwKLQkJezB4YTYwMCwgMHgwNiB9LAotCQl7MHhhNjAxLCAweDA2IH0sCi0JCXsweGE2MDgsIDB4MDcgfSwKLQkJezB4YTYwOSwgMHgwOCB9LAotCQl7MHhhNjBjLCAweDA4IH0sCi0JCXsweGE2MGQsIDB4MDcgfSwKLQkJezB4YTYzYywgMHgwMCB9LAotCQl7MHhhNjNkLCAweDAyIH0sCi0JCXsweGE2NDAsIDB4MDIgfSwKLQkJezB4YTY0MSwgMHgwMiB9LAotCQl7MHhhNjQ0LCAweDAyIH0sCi0JCXsweGE2NDUsIDB4MDIgfSwKLQkJezB4YTY0OCwgMHgwMyB9LAotCQl7MHhhNjQ5LCAweDA0IH0sCi0JCXsweGE2NGMsIDB4MGEgfSwKLQkJezB4YTY0ZCwgMHgwOSB9LAotCQl7MHhhNjUwLCAweDA4IH0sCi0JCXsweGE2NTEsIDB4MDkgfSwKLQkJezB4YTY1NCwgMHgwOSB9LAotCQl7MHhhNjU1LCAweDBhIH0sCi0JCXsweGE2NTgsIDB4MGEgfSwKLQkJezB4YTY1OSwgMHgwYSB9LAotCQl7MHhhNjVjLCAweDBhIH0sCi0JCXsweGE2NWQsIDB4MDkgfSwKLQkJezB4YTY2MCwgMHgwOSB9LAotCQl7MHhhNjYxLCAweDA5IH0sCi0JCXsweGE2NjQsIDB4MDkgfSwKLQkJezB4YTY2NSwgMHgwOCB9LAotCQl7MHhhNjgwLCAweDAxIH0sCi0JCXsweGE2ODEsIDB4MDIgfSwKLQkJezB4YTY5NCwgMHgxZiB9LAotCQl7MHhhNjk1LCAweDEwIH0sCi0JCXsweGE2OTgsIDB4MGUgfSwKLQkJezB4YTY5OSwgMHgwYyB9LAotCQl7MHhhNjljLCAweDBkIH0sCi0JCXsweGE2OWQsIDB4MGQgfSwKLQkJezB4YTZhMCwgMHgwZiB9LAotCQl7MHhhNmExLCAweDExIH0sCi0JCXsweGE2YTQsIDB4MDAgfSwKLQkJezB4YTZhNSwgMHgwMCB9LAotCQl7MHhhNmE4LCAweDAwIH0sCi0JCXsweGE2YTksIDB4MDAgfSwKLQkJezB4YTZhYywgMHgwMCB9LAotCQl7MHhhNmFkLCAweDAwIH0sCi0JCXsweGE2YjAsIDB4MDAgfSwKLQkJezB4YTZiMSwgMHgwNCB9LAotCQl7MHhhNmI0LCAweDA0IH0sCi0JCXsweGE2YjUsIDB4MDQgfSwKLQkJezB4YTZiOCwgMHgwNCB9LAotCQl7MHhhNmI5LCAweDA0IH0sCi0JCXsweGE2YmMsIDB4MDUgfSwKLQkJezB4YTZiZCwgMHgwNSB9LAotCQl7MHhhNmMwLCAweDFmIH0sCi0JCXsweGE2YzEsIDB4MWYgfSwKLQkJezB4YTZjNCwgMHgxZiB9LAotCQl7MHhhNmM1LCAweDFmIH0sCi0JCXsweGE2YzgsIDB4MWYgfSwKLQkJezB4YTZjOSwgMHgxZiB9LAotCQl7MHhhNmNjLCAweDFmIH0sCi0JCXsweGE2Y2QsIDB4MGIgfSwKLQkJezB4YTZkMCwgMHgwYyB9LAotCQl7MHhhNmQxLCAweDBkIH0sCi0JCXsweGE2ZDQsIDB4MGQgfSwKLQkJezB4YTZkNSwgMHgwZCB9LAotCQl7MHhhNmQ4LCAweDExIH0sCi0JCXsweGE2ZDksIDB4MTQgfSwKLQkJezB4YTZmYywgMHgwMiB9LAotCQl7MHhhNmZkLCAweDAzIH0sCi0JCXsweGE3MDAsIDB4MDMgfSwKLQkJezB4YTcwMSwgMHgwMyB9LAotCQl7MHhhNzA0LCAweDAzIH0sCi0JCXsweGE3MDUsIDB4MDQgfSwKLQkJezB4YTcwOCwgMHgwNSB9LAotCQl7MHhhNzA5LCAweDAyIH0sCi0JCXsweGE3MGMsIDB4MDIgfSwKLQkJezB4YTcwZCwgMHgwMiB9LAotCQl7MHhhNzEwLCAweDAzIH0sCi0JCXsweGE3MTEsIDB4MDQgfSwKLQkJezB4YTcxNCwgMHgwNCB9LAotCQl7MHhhNzE1LCAweDA0IH0sCi0JCXsweGE3NDQsIDB4MDAgfSwKLQkJezB4YTc0NSwgMHgwMyB9LAotCQl7MHhhNzQ4LCAweDA0IH0sCi0JCXsweGE3NDksIDB4MDQgfSwKLQkJezB4YTc0YywgMHgwNSB9LAotCQl7MHhhNzRkLCAweDA2IH0sCi0JCXsweGE3NTAsIDB4MDcgfSwKLQkJezB4YTc1MSwgMHgwNyB9LAotCQl7MHhhNzU0LCAweDA1IH0sCi0JCXsweGE3NTUsIDB4MDUgfSwKLQkJezB4YTc1OCwgMHgwNSB9LAotCQl7MHhhNzU5LCAweDA1IH0sCi0JCXsweGE3NWMsIDB4MDUgfSwKLQkJezB4YTc1ZCwgMHgwNiB9LAotCQl7MHhhNzYwLCAweDA3IH0sCi0JCXsweGE3NjEsIDB4MDcgfSwKLQkJezB4YTc2NCwgMHgwNiB9LAotCQl7MHhhNzY1LCAweDA1IH0sCi0JCXsweGE3NjgsIDB4MDUgfSwKLQkJezB4YTc2OSwgMHgwNSB9LAotCQl7MHhhNzZjLCAweDA2IH0sCi0JCXsweGE3NmQsIDB4MDcgfSwKLQkJezB4YTc3YywgMHgwMCB9LAotCQl7MHhhNzdkLCAweDA1IH0sCi0JCXsweGE3ODAsIDB4MDUgfSwKLQkJezB4YTc4MSwgMHgwNSB9LAotCQl7MHhhNzg0LCAweDA1IH0sCi0JCXsweGE3ODUsIDB4MDQgfSwKLQkJezB4YTc4OCwgMHgwNSB9LAotCQl7MHhhNzg5LCAweDA2IH0sCi0JCXsweGE3OWMsIDB4MWYgfSwKLQkJezB4YTc5ZCwgMHgxNSB9LAotCQl7MHhhN2EwLCAweDEzIH0sCi0JCXsweGE3YTEsIDB4MTAgfSwKLQkJezB4YTdhNCwgMHgwZiB9LAotCQl7MHhhN2E1LCAweDBkIH0sCi0JCXsweGE3YTgsIDB4MTEgfSwKLQkJezB4YTdhOSwgMHgxNCB9LAotCQl7MHhhN2FjLCAweDAyIH0sCi0JCXsweGE3YWQsIDB4MDIgfSwKLQkJezB4YTdiMCwgMHgwMiB9LAotCQl7MHhhN2IxLCAweDAyIH0sCi0JCXsweGE3YjQsIDB4MDIgfSwKLQkJezB4YTdiNSwgMHgwMyB9LAotCQl7MHhhN2I4LCAweDAzIH0sCi0JCXsweGE3YjksIDB4MDAgfSwKLQkJezB4YTdiYywgMHgwMCB9LAotCQl7MHhhN2JkLCAweDAwIH0sCi0JCXsweGE3YzAsIDB4MDAgfSwKLQkJezB4YTdjMSwgMHgwMCB9LAotCQl7MHhhN2M0LCAweDAwIH0sCi0JCXsweGE3YzUsIDB4MDAgfSwKLQkJezB4YTdkNCwgMHgxZiB9LAotCQl7MHhhN2Q1LCAweDBkIH0sCi0JCXsweGE3ZDgsIDB4MGYgfSwKLQkJezB4YTdkOSwgMHgxMCB9LAotCQl7MHhhN2RjLCAweDEwIH0sCi0JCXsweGE3ZGQsIDB4MTAgfSwKLQkJezB4YTdlMCwgMHgxMyB9LAotCQl7MHhhN2UxLCAweDE2IH0sCi0JCXsweGE3ZjQsIDB4MDAgfSwKLQkJezB4YTdmNSwgMHgwMyB9LAotCQl7MHhhN2Y4LCAweDA0IH0sCi0JCXsweGE3ZjksIDB4MDQgfSwKLQkJezB4YTdmYywgMHgwNCB9LAotCQl7MHhhN2ZkLCAweDAzIH0sCi0JCXsweGE4MDAsIDB4MDMgfSwKLQkJezB4YTgwMSwgMHgwMyB9LAotCQl7MHhhODA0LCAweDAzIH0sCi0JCXsweGE4MDUsIDB4MDMgfSwKLQkJezB4YTgwOCwgMHgwMyB9LAotCQl7MHhhODA5LCAweDAzIH0sCi0JCXsweGE4MGMsIDB4MDMgfSwKLQkJezB4YTgwZCwgMHgwNCB9LAotCQl7MHhhODEwLCAweDA0IH0sCi0JCXsweGE4MTEsIDB4MGEgfSwKLQkJezB4YTgxNCwgMHgwYSB9LAotCQl7MHhhODE1LCAweDBhIH0sCi0JCXsweGE4MTgsIDB4MGYgfSwKLQkJezB4YTgxOSwgMHgxNCB9LAotCQl7MHhhODFjLCAweDE0IH0sCi0JCXsweGE4MWQsIDB4MTQgfSwKLQkJezB4YTgyYywgMHgwMCB9LAotCQl7MHhhODJkLCAweDA0IH0sCi0JCXsweGE4MzAsIDB4MDIgfSwKLQkJezB4YTgzMSwgMHgwMCB9LAotCQl7MHhhODM0LCAweDAwIH0sCi0JCXsweGE4MzUsIDB4MDAgfSwKLQkJezB4YTgzOCwgMHgwMCB9LAotCQl7MHhhODM5LCAweDAwIH0sCi0JCXsweGE4NDAsIDB4MWYgfSwKLQkJezB4YTg0MSwgMHgxZiB9LAotCQl7MHhhODQ4LCAweDFmIH0sCi0JCXsweGE4NDksIDB4MWYgfSwKLQkJezB4YTg0YywgMHgxZiB9LAotCQl7MHhhODRkLCAweDBjIH0sCi0JCXsweGE4NTAsIDB4MGMgfSwKLQkJezB4YTg1MSwgMHgwYyB9LAotCQl7MHhhODU0LCAweDBjIH0sCi0JCXsweGE4NTUsIDB4MGMgfSwKLQkJezB4YTg1OCwgMHgwYyB9LAotCQl7MHhhODU5LCAweDBjIH0sCi0JCXsweGE4NWMsIDB4MGMgfSwKLQkJezB4YTg1ZCwgMHgwYyB9LAotCQl7MHhhODYwLCAweDBjIH0sCi0JCXsweGE4NjEsIDB4MGMgfSwKLQkJezB4YTg2NCwgMHgwYyB9LAotCQl7MHhhODY1LCAweDBjIH0sCi0JCXsweGE4NjgsIDB4MGMgfSwKLQkJezB4YTg2OSwgMHgwYyB9LAotCQl7MHhhODZjLCAweDBjIH0sCi0JCXsweGE4NmQsIDB4MGMgfSwKLQkJezB4YTg3MCwgMHgwYyB9LAotCQl7MHhhODcxLCAweDBjIH0sCi0JCXsweGE4NzQsIDB4MGMgfSwKLQkJezB4YTg3NSwgMHgwYyB9LAotCQl7MHhhODc4LCAweDFmIH0sCi0JCXsweGE4NzksIDB4MWYgfSwKLQkJezB4YTg3YywgMHgxZiB9LAotCQl7MHhhODdkLCAweDFmIH0sCi0JCXsweGE4ODAsIDB4MWYgfSwKLQkJezB4YTg4MSwgMHgxZiB9LAotCQl7MHhhODg0LCAweDFmIH0sCi0JCXsweGE4ODUsIDB4MGMgfSwKLQkJezB4YTg4OCwgMHgwYyB9LAotCQl7MHhhODg5LCAweDBjIH0sCi0JCXsweGE4OGMsIDB4MGMgfSwKLQkJezB4YTg4ZCwgMHgwYyB9LAotCQl7MHhhODkwLCAweDBjIH0sCi0JCXsweGE4OTEsIDB4MGMgfSwKLQkJezB4YTg5OCwgMHgxZiB9LAotCQl7MHhhODk5LCAweDFmIH0sCi0JCXsweGE4YTAsIDB4MWYgfSwKLQkJezB4YThhMSwgMHgxZiB9LAotCQl7MHhhOGE0LCAweDFmIH0sCi0JCXsweGE4YTUsIDB4MGMgfSwKLQkJezB4YThhOCwgMHgwYyB9LAotCQl7MHhhOGE5LCAweDBjIH0sCi0JCXsweGE4YWMsIDB4MGMgfSwKLQkJezB4YThhZCwgMHgwYyB9LAotCQl7MHhhOGIwLCAweDBjIH0sCi0JCXsweGE4YjEsIDB4MGMgfSwKLQkJezB4YThiNCwgMHgwYyB9LAotCQl7MHhhOGI1LCAweDBjIH0sCi0JCXsweGE4YjgsIDB4MGMgfSwKLQkJezB4YThiOSwgMHgwYyB9LAotCQl7MHhhOGJjLCAweDBjIH0sCi0JCXsweGE4YmQsIDB4MGMgfSwKLQkJezB4YThjMCwgMHgwYyB9LAotCQl7MHhhOGMxLCAweDBjIH0sCi0JCXsweGE4YzQsIDB4MGMgfSwKLQkJezB4YThjNSwgMHgwYyB9LAotCQl7MHhhOGM4LCAweDBjIH0sCi0JCXsweGE4YzksIDB4MGMgfSwKLQkJezB4YThjYywgMHgwYyB9LAotCQl7MHhhOGNkLCAweDBjIH0sCi0JCXsweGE4ZDAsIDB4MWYgfSwKLQkJezB4YThkMSwgMHgxZiB9LAotCQl7MHhhOGQ0LCAweDFmIH0sCi0JCXsweGE4ZDUsIDB4MWYgfSwKLQkJezB4YThkOCwgMHgxZiB9LAotCQl7MHhhOGQ5LCAweDFmIH0sCi0JCXsweGE4ZGMsIDB4MWYgfSwKLQkJezB4YThkZCwgMHgwYyB9LAotCQl7MHhhOGUwLCAweDBjIH0sCi0JCXsweGE4ZTEsIDB4MGMgfSwKLQkJezB4YThlNCwgMHgwYyB9LAotCQl7MHhhOGU1LCAweDBjIH0sCi0JCXsweGE4ZTgsIDB4MGMgfSwKLQkJezB4YThlOSwgMHgwYyB9LAotCQl7MHhhOGYwLCAweDFmIH0sCi0JCXsweGE4ZjEsIDB4MWYgfSwKLQkJezB4YThmOCwgMHgxZiB9LAotCQl7MHhhOGY5LCAweDFmIH0sCi0JCXsweGE4ZmMsIDB4MWYgfSwKLQkJezB4YThmZCwgMHgwYyB9LAotCQl7MHhhOTAwLCAweDBjIH0sCi0JCXsweGE5MDEsIDB4MGMgfSwKLQkJezB4YTkwNCwgMHgwYyB9LAotCQl7MHhhOTA1LCAweDBjIH0sCi0JCXsweGE5MDgsIDB4MGMgfSwKLQkJezB4YTkwOSwgMHgwYyB9LAotCQl7MHhhOTBjLCAweDBjIH0sCi0JCXsweGE5MGQsIDB4MGMgfSwKLQkJezB4YTkxMCwgMHgwYyB9LAotCQl7MHhhOTExLCAweDBjIH0sCi0JCXsweGE5MTQsIDB4MGMgfSwKLQkJezB4YTkxNSwgMHgwYyB9LAotCQl7MHhhOTE4LCAweDBjIH0sCi0JCXsweGE5MTksIDB4MGMgfSwKLQkJezB4YTkxYywgMHgwYyB9LAotCQl7MHhhOTFkLCAweDBjIH0sCi0JCXsweGE5MjAsIDB4MGMgfSwKLQkJezB4YTkyMSwgMHgwYyB9LAotCQl7MHhhOTI0LCAweDBjIH0sCi0JCXsweGE5MjUsIDB4MGMgfSwKLQkJezB4YTkyOCwgMHgxZiB9LAotCQl7MHhhOTI5LCAweDFmIH0sCi0JCXsweGE5MmMsIDB4MWYgfSwKLQkJezB4YTkyZCwgMHgxZiB9LAotCQl7MHhhOTMwLCAweDFmIH0sCi0JCXsweGE5MzEsIDB4MWYgfSwKLQkJezB4YTkzNCwgMHgxZiB9LAotCQl7MHhhOTM1LCAweDBjIH0sCi0JCXsweGE5MzgsIDB4MGMgfSwKLQkJezB4YTkzOSwgMHgwYyB9LAotCQl7MHhhOTNjLCAweDBjIH0sCi0JCXsweGE5M2QsIDB4MGMgfSwKLQkJezB4YTk0MCwgMHgwYyB9LAotCQl7MHhhOTQxLCAweDBjIH0sCi0JCXsweGE5NmMsIDB4MGQgfSwKLQkJezB4YTk2ZCwgMHgxNiB9LAotCQl7MHhhOTcwLCAweDE5IH0sCi0JCXsweGE5NzEsIDB4MGUgfSwKLQkJezB4YTk3NCwgMHgxNiB9LAotCQl7MHhhOTc1LCAweDFhIH0sCi0JCXsweGE5NzgsIDB4MGQgfSwKLQkJezB4YTk3OSwgMHgxNSB9LAotCQl7MHhhOTdjLCAweDE5IH0sCi0JCXsweGE5N2QsIDB4MGQgfSwKLQkJezB4YTk4MCwgMHgxNSB9LAotCQl7MHhhOTgxLCAweDFhIH0sCi0JCXsweGE5ODQsIDB4MGQgfSwKLQkJezB4YTk4NSwgMHgxNSB9LAotCQl7MHhhOTg4LCAweDFhIH0sCi0JCXsweGE5ODksIDB4MGQgfSwKLQkJezB4YTk4YywgMHgxNSB9LAotCQl7MHhhOThkLCAweDFhIH0sCi0JCXsweGE5OTAsIDB4MGIgfSwKLQkJezB4YTk5MSwgMHgxMSB9LAotCQl7MHhhOTk0LCAweDAyIH0sCi0JCXsweGE5OTUsIDB4MGUgfSwKLQkJezB4YTk5OCwgMHgxNiB9LAotCQl7MHhhOTk5LCAweDAyIH0sCi0JCXsweGE5OWMsIDB4MGMgfSwKLQkJezB4YTk5ZCwgMHgxMyB9LAotCQl7MHhhOWEwLCAweDAyIH0sCi0JCXsweGE5YTEsIDB4MGMgfSwKLQkJezB4YTlhNCwgMHgxMiB9LAotCQl7MHhhOWE1LCAweDAyIH0sCi0JCXsweGE5YTgsIDB4MGMgfSwKLQkJezB4YTlhOSwgMHgxMiB9LAotCQl7MHhhOWFjLCAweDAyIH0sCi0JCXsweGE5YWQsIDB4MGMgfSwKLQkJezB4YTliMCwgMHgxMiB9LAotCQl7MHhhOWIxLCAweDAyIH0sCi0JCXsweGE5YjQsIDB4MTAgfSwKLQkJezB4YTliNSwgMHgxZSB9LAotCQl7MHhhOWI4LCAweDBmIH0sCi0JCXsweGE5YjksIDB4MTMgfSwKLQkJezB4YTliYywgMHgyMCB9LAotCQl7MHhhOWJkLCAweDEwIH0sCi0JCXsweGE5YzAsIDB4MTEgfSwKLQkJezB4YTljMSwgMHgxZSB9LAotCQl7MHhhOWM0LCAweDEwIH0sCi0JCXsweGE5YzUsIDB4MTEgfSwKLQkJezB4YTljOCwgMHgxZSB9LAotCQl7MHhhOWM5LCAweDEwIH0sCi0JCXsweGE5Y2MsIDB4MTEgfSwKLQkJezB4YTljZCwgMHgyMCB9LAotCQl7MHhhOWQwLCAweDEwIH0sCi0JCXsweGE5ZDEsIDB4MTMgfSwKLQkJezB4YTlkNCwgMHgyNCB9LAotCQl7MHhhOWQ1LCAweDEwIH0sCi0JCXsweGE5ZjAsIDB4MDIgfSwKLQkJezB4YTlmMSwgMHgwMSB9LAotCQl7MHhhOWY4LCAweDE5IH0sCi0JCXsweGE5ZjksIDB4MGIgfSwKLQkJezB4YTlmYywgMHgwYSB9LAotCQl7MHhhOWZkLCAweDA3IH0sCi0JCXsweGFhMDAsIDB4MGMgfSwKLQkJezB4YWEwMSwgMHgwZSB9LAotCQl7MHhhYTA4LCAweDBjIH0sCi0JCXsweGFhMDksIDB4MDYgfSwKLQkJezB4YWEwYywgMHgwYyB9LAotCQl7MHhhYTBkLCAweDBhIH0sCi0JCXsweGFhMjQsIDB4MTAgfSwKLQkJezB4YWEyNSwgMHgxMiB9LAotCQl7MHhhYTI4LCAweDBiIH0sCi0JCXsweGFhMjksIDB4MDcgfSwKLQkJezB4YWEyYywgMHgxMCB9LAotCQl7MHhhYTJkLCAweDE0IH0sCi0JCXsweGFhMzQsIDB4MGUgfSwKLQkJezB4YWEzNSwgMHgwZSB9LAotCQl7MHhhYTM4LCAweDA3IH0sCi0JCXsweGFhMzksIDB4MDcgfSwKLQkJezB4YWEzYywgMHgwZSB9LAotCQl7MHhhYTNkLCAweDBjIH0sCi0JCXsweGFhNDgsIDB4MDkgfSwKLQkJezB4YWE0OSwgMHgwYyB9LAotCQl7MHhhYTRjLCAweDBjIH0sCi0JCXsweGFhNGQsIDB4MDcgfSwKLQkJezB4YWE1NCwgMHgwOCB9LAotCQl7MHhhYTU1LCAweDA2IH0sCi0JCXsweGFhNTgsIDB4MDQgfSwKLQkJezB4YWE1OSwgMHgwNSB9LAotCQl7MHhhYTVjLCAweDA2IH0sCi0JCXsweGFhNWQsIDB4MDYgfSwKLQkJezB4YWE2OCwgMHgwNSB9LAotCQl7MHhhYTY5LCAweDA1IH0sCi0JCXsweGFhNmMsIDB4MDQgfSwKLQkJezB4YWE2ZCwgMHgwNSB9LAotCQl7MHhhYTc0LCAweDA2IH0sCi0JCXsweGFhNzUsIDB4MDQgfSwKLQkJezB4YWE3OCwgMHgwNSB9LAotCQl7MHhhYTc5LCAweDA1IH0sCi0JCXsweGFhN2MsIDB4MDQgfSwKLQkJezB4YWE3ZCwgMHgwNiB9LAotCQl7MHhhYzE4LCAweDE0IH0sCi0JCXsweGFjMTksIDB4MDAgfSwKLQkJezB4YWMxYywgMHgxNCB9LAotCQl7MHhhYzFkLCAweDAwIH0sCi0JCXsweGFjMjAsIDB4MTQgfSwKLQkJezB4YWMyMSwgMHgwMCB9LAotCQl7MHhhYzI0LCAweDE0IH0sCi0JCXsweGFjMjUsIDB4MDAgfSwKLQkJezB4YWMyOCwgMHgxNCB9LAotCQl7MHhhYzI5LCAweDAwIH0sCi0JCXsweGFjMmMsIDB4MTQgfSwKLQkJezB4YWMyZCwgMHgwMCB9LAotCQl7MHhhYzM0LCAweDE2IH0sCi0JCXsweGFjMzUsIDB4MDAgfSwKLQkJezB4YWMzOCwgMHgxNiB9LAotCQl7MHhhYzM5LCAweDAwIH0sCi0JCXsweGFjM2MsIDB4MTYgfSwKLQkJezB4YWMzZCwgMHgwMCB9LAotCQl7MHhhYzQwLCAweDE2IH0sCi0JCXsweGFjNDEsIDB4MDAgfSwKLQkJezB4YWM0NCwgMHgxNiB9LAotCQl7MHhhYzQ1LCAweDAwIH0sCi0JCXsweGFjNDgsIDB4MTYgfSwKLQkJezB4YWM0OSwgMHgwMCB9LAotCQl7MHhhYzUwLCAweDFiIH0sCi0JCXsweGFjNTEsIDB4MDAgfSwKLQkJezB4YWM1NCwgMHgxYiB9LAotCQl7MHhhYzU1LCAweDAwIH0sCi0JCXsweGFjNTgsIDB4MWIgfSwKLQkJezB4YWM1OSwgMHgwMCB9LAotCQl7MHhhYzVjLCAweDFiIH0sCi0JCXsweGFjNWQsIDB4MDAgfSwKLQkJezB4YWM2MCwgMHgxYiB9LAotCQl7MHhhYzYxLCAweDAwIH0sCi0JCXsweGFjNjQsIDB4MWIgfSwKLQkJezB4YWM2NSwgMHgwMCB9LAotCQl7MHhhYzc0LCAweDA5IH0sCi0JCXsweGFjNzUsIDB4MGMgfSwKLQkJezB4YWM3OCwgMHgwZiB9LAotCQl7MHhhYzc5LCAweDExIH0sCi0JCXsweGFjN2MsIDB4MTIgfSwKLQkJezB4YWM3ZCwgMHgxNCB9LAotCQl7MHhhYzgwLCAweDA5IH0sCi0JCXsweGFjODEsIDB4MGMgfSwKLQkJezB4YWM4NCwgMHgwZiB9LAotCQl7MHhhYzg1LCAweDExIH0sCi0JCXsweGFjODgsIDB4MTIgfSwKLQkJezB4YWM4OSwgMHgxNCB9LAotCQl7MHhhYzhjLCAweDA5IH0sCi0JCXsweGFjOGQsIDB4MGMgfSwKLQkJezB4YWM5MCwgMHgwZiB9LAotCQl7MHhhYzkxLCAweDExIH0sCi0JCXsweGFjOTQsIDB4MTIgfSwKLQkJezB4YWM5NSwgMHgxNCB9LAotCQl7MHhhYzk4LCAweDA5IH0sCi0JCXsweGFjOTksIDB4MGMgfSwKLQkJezB4YWM5YywgMHgwZiB9LAotCQl7MHhhYzlkLCAweDExIH0sCi0JCXsweGFjYTAsIDB4MTIgfSwKLQkJezB4YWNhMSwgMHgxNCB9LAotCQl7MHhhY2E0LCAweDA5IH0sCi0JCXsweGFjYTUsIDB4MGMgfSwKLQkJezB4YWNhOCwgMHgwZiB9LAotCQl7MHhhY2E5LCAweDExIH0sCi0JCXsweGFjYWMsIDB4MTIgfSwKLQkJezB4YWNhZCwgMHgxNCB9LAotCQl7MHhhY2IwLCAweDA3IH0sCi0JCXsweGFjYjEsIDB4MDkgfSwKLQkJezB4YWNiNCwgMHgwYyB9LAotCQl7MHhhY2I1LCAweDBkIH0sCi0JCXsweGFjYjgsIDB4MGQgfSwKLQkJezB4YWNiOSwgMHgwZSB9LAotCQl7MHhhY2JjLCAweDA1IH0sCi0JCXsweGFjYmQsIDB4MDcgfSwKLQkJezB4YWNjMCwgMHgwYSB9LAotCQl7MHhhY2MxLCAweDBiIH0sCi0JCXsweGFjYzQsIDB4MGIgfSwKLQkJezB4YWNjNSwgMHgwYyB9LAotCQl7MHhhY2M4LCAweDAzIH0sCi0JCXsweGFjYzksIDB4MDQgfSwKLQkJezB4YWNjYywgMHgwNyB9LAotCQl7MHhhY2NkLCAweDA4IH0sCi0JCXsweGFjZDAsIDB4MDkgfSwKLQkJezB4YWNkMSwgMHgwOSB9LAotCQl7MHgzNUI1LCAweDAxIH0sCi0JCXsweDM1QkMsIDB4MDEgfSwKLQkJezB4MzYwQSwgMHgwMiB9LAotCQl7MHhGQTlCLCAweDAxIH0sCi19OwotCi0jZGVmaW5lIE5VTV9MU0NfQ0FTVF9SRUdTICAgICAgMzMKLQotZW51bSBMU0NfQ2FzdF90ewotCWNhc3RfSCA9IDAsCi0JY2FzdF9VMzAsCi0JY2FzdF9DVywKLQljYXN0X0QsCi0JY2FzdF9NQVgKLX07Ci0KLXN0YXRpYyBzaG9ydCBpbnQgTFNDX0NvcnJlY3Rpb25Gb3JDYXN0W2Nhc3RfTUFYXVtOVU1fTFNDX0NBU1RfUkVHU10gPSB7Ci0Jey0zMCwgLTIwLCAgOCwgMTEsIC0xNiwgLTI2LCAtMzUsIC01MywgLTksIC0xMCwgNDQsIDU3LCAtMzksCi0JCS0xNCwgNTAsIC0xNzMsIC0zOCwgLTMyLCAtMSwgOSwgMzksIDUxLCAtMzMsIC00OSwgLTI4LAotCQktMjIsIDcsIDExLCAtMjEsIDE3LCAtNjIsIC01NiwgMH0sCi0Jey0yOSwgLTE4LCAgNiwgIDEsICAxNywgLTM1LCAtNzcsIDAsIDUsIC0xNywgLTYsIC0yMiwgLTQxLCAtMSwKLQkJLTM3LCA4MywgLTM4LCAtMzIsIDEsIC0yLCAxNSwgMjUsIC02NywgMTksIC0yOCwgLTIyLCA1LAotCQkyLCAtMTgsIDIxLCAtODYsIDAsIDB9LAotCXstMTAsIC0xNSwgLTQsIC02LCAgLTgsICAtMywgLTYzLCA4LCAyNSwgLTksIC0zOSwgLTUxLCAtOSwKLQkJMCwgLTIxLCAxMTIsIC0xMCwgLTIzLCAtNywgLTksIDEwLCAxOCwgLTExLCAyMywgLTEwLAotCQktMTUsIC00LCAtNiwgLTEwLCAtMywgLTUyLCA3LCAwfSwKLQl7ICA1LCAgIDMsIC00LCAtNSwgIC0xLCAgIDMsICAgNCwgOCwgMTIsIDMsIC0yMiwgLTIxLCA3LCAxNywKLQkJMiwgMzUsIDgsIDIsIC0zLCAtMiwgLTksIC01LCAxMCwgNCwgOSwgMiwgLTQsIC01LAotCQktMiwgMCwgLTYsIDksIDB9Ci19OwotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgTFNDX0Nhc3RSZWdzW10gPSB7Ci0JMHhGQjdFLAkJCS8qIEggICAqLwotCTB4RkIzQywJCQkvKiBVMzAgKi8KLQkweEZBRkEsCQkJLyogQ1cgICovCi0JMHhGQUI4CQkJLyogRDY1ICovCi19OwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgaW50IHZ4Njk1M19pMmNfcnhkYXRhKHVuc2lnbmVkIHNob3J0IHNhZGRyLAotCXVuc2lnbmVkIGNoYXIgKnJ4ZGF0YSwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7Ci0JCXsKLQkJCS5hZGRyICA9IHNhZGRyLAotCQkJLmZsYWdzID0gMCwKLQkJCS5sZW4gICA9IDIsCi0JCQkuYnVmICAgPSByeGRhdGEsCi0JCX0sCi0JCXsKLQkJCS5hZGRyICA9IHNhZGRyLAotCQkJLmZsYWdzID0gSTJDX01fUkQsCi0JCQkubGVuICAgPSAyLAotCQkJLmJ1ZiAgID0gcnhkYXRhLAotCQl9LAotCX07Ci0JaWYgKGkyY190cmFuc2Zlcih2eDY5NTNfY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAyKSA8IDApIHsKLQkJQ0RCRygidng2OTUzX2kyY19yeGRhdGEgZmFpbGVkIVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbnQzMl90IHZ4Njk1M19pMmNfdHhkYXRhKHVuc2lnbmVkIHNob3J0IHNhZGRyLAotCQkJCXVuc2lnbmVkIGNoYXIgKnR4ZGF0YSwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKLQkJewotCQkJLmFkZHIgPSBzYWRkciwKLQkJCS5mbGFncyA9IDAsCi0JCQkubGVuID0gbGVuZ3RoLAotCQkJLmJ1ZiA9IHR4ZGF0YSwKLQkJIH0sCi0JfTsKLQlpZiAoaTJjX3RyYW5zZmVyKHZ4Njk1M19jbGllbnQtPmFkYXB0ZXIsIG1zZywgMSkgPCAwKSB7Ci0JCUNEQkcoInZ4Njk1M19pMmNfdHhkYXRhIGZhaWxkIDB4JXhcbiIsIHZ4Njk1M19jbGllbnQtPmFkZHIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50MzJfdCB2eDY5NTNfaTJjX3JlYWQodW5zaWduZWQgc2hvcnQgcmFkZHIsCi0JdW5zaWduZWQgc2hvcnQgKnJkYXRhLCBpbnQgcmxlbikKLXsKLQlpbnQzMl90IHJjID0gMDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKLQlpZiAoIXJkYXRhKQotCQlyZXR1cm4gLUVJTzsKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gKHJhZGRyICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlsxXSA9IChyYWRkciAmIDB4MDBGRik7Ci0JcmMgPSB2eDY5NTNfaTJjX3J4ZGF0YSh2eDY5NTNfY2xpZW50LT5hZGRyPj4xLCBidWYsIHJsZW4pOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygidng2OTUzX2kyY19yZWFkIDB4JXggZmFpbGVkIVxuIiwgcmFkZHIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCSpyZGF0YSA9IChybGVuID09IDIgPyBidWZbMF0gPDwgOCB8IGJ1ZlsxXSA6IGJ1ZlswXSk7Ci0JcmV0dXJuIHJjOwotfQotc3RhdGljIGludDMyX3Qgdng2OTUzX2kyY193cml0ZV9iX3NlbnNvcih1bnNpZ25lZCBzaG9ydCB3YWRkciwgdWludDhfdCBiZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gLUVGQVVMVDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlszXTsKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gKHdhZGRyICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlsxXSA9ICh3YWRkciAmIDB4MDBGRik7Ci0JYnVmWzJdID0gYmRhdGE7Ci0JQ0RCRygiaTJjX3dyaXRlX2IgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIHdhZGRyLCBiZGF0YSk7Ci0JcmMgPSB2eDY5NTNfaTJjX3R4ZGF0YSh2eDY5NTNfY2xpZW50LT5hZGRyPj4xLCBidWYsIDMpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiaTJjX3dyaXRlX2IgZmFpbGVkLCBhZGRyID0gMHgleCwgdmFsID0gMHgleCFcbiIsCi0JCQl3YWRkciwgYmRhdGEpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50MzJfdCB2eDY5NTNfaTJjX3dyaXRlX3dfc2Vuc29yKHVuc2lnbmVkIHNob3J0IHdhZGRyLCB1aW50MTZfdCB3ZGF0YSkKLXsKLQlpbnQzMl90IHJjID0gLUVGQVVMVDsKLQl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmWzBdID0gKHdhZGRyICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlsxXSA9ICh3YWRkciAmIDB4MDBGRik7Ci0JYnVmWzJdID0gKHdkYXRhICYgMHhGRjAwKSA+PiA4OwotCWJ1ZlszXSA9ICh3ZGF0YSAmIDB4MDBGRik7Ci0JQ0RCRygiaTJjX3dyaXRlX2IgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIHdhZGRyLCB3ZGF0YSk7Ci0JcmMgPSB2eDY5NTNfaTJjX3R4ZGF0YSh2eDY5NTNfY2xpZW50LT5hZGRyPj4xLCBidWYsIDQpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiaTJjX3dyaXRlX2IgZmFpbGVkLCBhZGRyID0gMHgleCwgdmFsID0gMHgleCFcbiIsCi0JCQl3YWRkciwgd2RhdGEpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50MzJfdCB2eDY5NTNfaTJjX3dyaXRlX3NlcV9zZW5zb3IodW5zaWduZWQgc2hvcnQgd2FkZHIsCi0JdWludDhfdCAqYmRhdGEsIHVpbnQxNl90IGxlbikKLXsKLQlpbnQzMl90IHJjID0gLUVGQVVMVDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZltsZW4rMl07Ci0JaW50IGk7Ci0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9ICh3YWRkciAmIDB4RkYwMCkgPj4gODsKLQlidWZbMV0gPSAod2FkZHIgJiAweDAwRkYpOwotCWZvciAoaSA9IDI7IGkgPCBsZW4rMjsgaSsrKQotCQlidWZbaV0gPSAqYmRhdGErKzsKLQlyYyA9IHZ4Njk1M19pMmNfdHhkYXRhKHZ4Njk1M19jbGllbnQtPmFkZHI+PjEsIGJ1ZiwgbGVuKzIpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiaTJjX3dyaXRlX2IgZmFpbGVkLCBhZGRyID0gMHgleCwgdmFsID0gMHgleCFcbiIsCi0JCQkgd2FkZHIsIGJkYXRhWzBdKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCB2eDY5NTNfaTJjX3dyaXRlX3dfdGFibGUoc3RydWN0IHZ4Njk1M19pMmNfcmVnX2NvbmYgY29uc3QKLQkJCQkJICpyZWdfY29uZl90YmwsIGludCBudW0pCi17Ci0JaW50IGk7Ci0JaW50MzJfdCByYyA9IC1FSU87Ci0JZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCXJjID0gdng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihyZWdfY29uZl90YmwtPndhZGRyLAotCQkJcmVnX2NvbmZfdGJsLT53ZGF0YSk7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQkJcmVnX2NvbmZfdGJsKys7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgdng2OTUzX2dldF9waWN0X2Zwcyh1aW50MTZfdCBmcHMsIHVpbnQxNl90ICpwZnBzKQotewotCS8qIGlucHV0IGZwcyBpcyBwcmV2aWV3IGZwcyBpbiBROCBmb3JtYXQgKi8KLQl1aW50MTZfdCBwcmV2aWV3X2ZyYW1lX2xlbmd0aF9saW5lcywgc25hcHNob3RfZnJhbWVfbGVuZ3RoX2xpbmVzOwotCXVpbnQxNl90IHByZXZpZXdfbGluZV9sZW5ndGhfcGNrLCBzbmFwc2hvdF9saW5lX2xlbmd0aF9wY2s7Ci0JdWludDMyX3QgZGl2aWRlciwgZDEsIGQyOwotCS8qIFRvdGFsIGZyYW1lX2xlbmd0aF9saW5lcyBhbmQgbGluZV9sZW5ndGhfcGNrIGZvciBwcmV2aWV3ICovCi0JcHJldmlld19mcmFtZV9sZW5ndGhfbGluZXMgPSBWWDY5NTNfUVRSX1NJWkVfSEVJR0hUICsKLQkJVlg2OTUzX1ZFUl9RVFJfQkxLX0xJTkVTOwotCXByZXZpZXdfbGluZV9sZW5ndGhfcGNrID0gVlg2OTUzX1FUUl9TSVpFX1dJRFRIICsKLQkJVlg2OTUzX0hSWl9RVFJfQkxLX1BJWEVMUzsKLQkvKiBUb3RhbCBmcmFtZV9sZW5ndGhfbGluZXMgYW5kIGxpbmVfbGVuZ3RoX3BjayBmb3Igc25hcHNob3QgKi8KLQlzbmFwc2hvdF9mcmFtZV9sZW5ndGhfbGluZXMgPSBWWDY5NTNfRlVMTF9TSVpFX0hFSUdIVCArCi0JCVZYNjk1M19WRVJfRlVMTF9CTEtfTElORVM7Ci0Jc25hcHNob3RfbGluZV9sZW5ndGhfcGNrID0gVlg2OTUzX0ZVTExfU0laRV9XSURUSCArCi0JCVZYNjk1M19IUlpfRlVMTF9CTEtfUElYRUxTOwotCWQxID0gcHJldmlld19mcmFtZV9sZW5ndGhfbGluZXMgKiAweDAwMDAwNDAwLwotCQlzbmFwc2hvdF9mcmFtZV9sZW5ndGhfbGluZXM7Ci0JZDIgPSBwcmV2aWV3X2xpbmVfbGVuZ3RoX3BjayAqIDB4MDAwMDA0MDAvCi0JCXNuYXBzaG90X2xpbmVfbGVuZ3RoX3BjazsKLQlkaXZpZGVyID0gZDEgKiBkMiAvIDB4NDAwOwotCS8qVmVyaWZ5IFBDTEsgc2V0dGluZ3MgYW5kIGZyYW1lIHNpemVzLiovCi0JKnBmcHMgPSAodWludDE2X3QpIChmcHMgKiBkaXZpZGVyIC8gMHg0MDApOwotCS8qIDIgaXMgdGhlIHJhdGlvIG9mIG5vLm9mIHNuYXBzaG90IGNoYW5uZWxzCi0JdG8gbnVtYmVyIG9mIHByZXZpZXcgY2hhbm5lbHMgKi8KLQotfQotCi1zdGF0aWMgdWludDE2X3Qgdng2OTUzX2dldF9wcmV2X2xpbmVzX3BmKHZvaWQpCi17Ci0JaWYgKHZ4Njk1M19jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkKLQkJcmV0dXJuIFZYNjk1M19RVFJfU0laRV9IRUlHSFQgKyBWWDY5NTNfVkVSX1FUUl9CTEtfTElORVM7Ci0JZWxzZQotCQlyZXR1cm4gVlg2OTUzX0ZVTExfU0laRV9IRUlHSFQgKyBWWDY5NTNfVkVSX0ZVTExfQkxLX0xJTkVTOwotCi19Ci0KLXN0YXRpYyB1aW50MTZfdCB2eDY5NTNfZ2V0X3ByZXZfcGl4ZWxzX3BsKHZvaWQpCi17Ci0JaWYgKHZ4Njk1M19jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkKLQkJcmV0dXJuIFZYNjk1M19RVFJfU0laRV9XSURUSCArIFZYNjk1M19IUlpfUVRSX0JMS19QSVhFTFM7Ci0JZWxzZQotCQlyZXR1cm4gVlg2OTUzX0ZVTExfU0laRV9XSURUSCArIFZYNjk1M19IUlpfRlVMTF9CTEtfUElYRUxTOwotfQotCi1zdGF0aWMgdWludDE2X3Qgdng2OTUzX2dldF9waWN0X2xpbmVzX3BmKHZvaWQpCi17Ci0JCWlmICh2eDY5NTNfY3RybC0+cGljdF9yZXMgPT0gUVRSX1NJWkUpCi0JCQlyZXR1cm4gVlg2OTUzX1FUUl9TSVpFX0hFSUdIVCArCi0JCQkJVlg2OTUzX1ZFUl9RVFJfQkxLX0xJTkVTOwotCQllbHNlCi0JCQlyZXR1cm4gVlg2OTUzX0ZVTExfU0laRV9IRUlHSFQgKwotCQkJCVZYNjk1M19WRVJfRlVMTF9CTEtfTElORVM7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCB2eDY5NTNfZ2V0X3BpY3RfcGl4ZWxzX3BsKHZvaWQpCi17Ci0JaWYgKHZ4Njk1M19jdHJsLT5waWN0X3JlcyA9PSBRVFJfU0laRSkKLQkJcmV0dXJuIFZYNjk1M19RVFJfU0laRV9XSURUSCArCi0JCQlWWDY5NTNfSFJaX1FUUl9CTEtfUElYRUxTOwotCWVsc2UKLQkJcmV0dXJuIFZYNjk1M19GVUxMX1NJWkVfV0lEVEggKwotCQkJVlg2OTUzX0hSWl9GVUxMX0JMS19QSVhFTFM7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCB2eDY5NTNfZ2V0X3BpY3RfbWF4X2V4cF9sYyh2b2lkKQotewotCWlmICh2eDY5NTNfY3RybC0+cGljdF9yZXMgPT0gUVRSX1NJWkUpCi0JCXJldHVybiAoVlg2OTUzX1FUUl9TSVpFX0hFSUdIVCArCi0JCQlWWDY5NTNfVkVSX1FUUl9CTEtfTElORVMpKjI0OwotCWVsc2UKLQkJcmV0dXJuIChWWDY5NTNfRlVMTF9TSVpFX0hFSUdIVCArCi0JCQlWWDY5NTNfVkVSX0ZVTExfQkxLX0xJTkVTKSoyNDsKLX0KLQotc3RhdGljIGludDMyX3Qgdng2OTUzX3NldF9mcHMoc3RydWN0IGZwc19jZmcJKmZwcykKLXsKLQl1aW50MTZfdCB0b3RhbF9saW5lc19wZXJfZnJhbWU7Ci0JaW50MzJfdCByYyA9IDA7Ci0JdG90YWxfbGluZXNfcGVyX2ZyYW1lID0gKHVpbnQxNl90KSgoVlg2OTUzX1FUUl9TSVpFX0hFSUdIVCArCi0JCVZYNjk1M19WRVJfUVRSX0JMS19MSU5FUykgKiB2eDY5NTNfY3RybC0+ZnBzX2RpdmlkZXIvMHg0MDApOwotCi0Jdng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJR1JPVVBFRF9QQVJBTUVURVJfSE9MRCk7Ci0JaWYgKHZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19ISSwKLQkJKCh0b3RhbF9saW5lc19wZXJfZnJhbWUgJiAweEZGMDApID4+IDgpKSA8IDApCi0JCXJldHVybiByYzsKLQlpZiAodng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0xPLAotCQkodG90YWxfbGluZXNfcGVyX2ZyYW1lICYgMHgwMEZGKSkgPCAwKQotCQlyZXR1cm4gcmM7Ci0Jdng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJR1JPVVBFRF9QQVJBTUVURVJfSE9MRF9PRkYpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3Qgdng2OTUzX3dyaXRlX2V4cF9nYWluKHVpbnQxNl90IGdhaW4sIHVpbnQzMl90IGxpbmUpCi17Ci0JdWludDE2X3QgbGluZV9sZW5ndGhfcGNrLCBmcmFtZV9sZW5ndGhfbGluZXM7Ci0JdWludDhfdCBnYWluX2hpLCBnYWluX2xvOwotCXVpbnQ4X3QgaW50Z190aW1lX2hpLCBpbnRnX3RpbWVfbG87Ci0JdWludDhfdCBmcmFtZV9sZW5ndGhfbGluZXNfaGkgPSAwLCBmcmFtZV9sZW5ndGhfbGluZXNfbG8gPSAwOwotCWludDMyX3QgcmMgPSAwOwotCWlmICh2eDY5NTNfY3RybC0+c2Vuc29ybW9kZSAhPSBTRU5TT1JfU05BUFNIT1RfTU9ERSkgewotCQlmcmFtZV9sZW5ndGhfbGluZXMgPSBWWDY5NTNfUVRSX1NJWkVfSEVJR0hUICsKLQkJVlg2OTUzX1ZFUl9RVFJfQkxLX0xJTkVTOwotCQlsaW5lX2xlbmd0aF9wY2sgPSBWWDY5NTNfUVRSX1NJWkVfV0lEVEggKwotCQkJVlg2OTUzX0hSWl9RVFJfQkxLX1BJWEVMUzsKLQkJaWYgKGxpbmUgPiAoZnJhbWVfbGVuZ3RoX2xpbmVzIC0KLQkJCVZYNjk1M19TVE01TTBFRE9GX09GRlNFVCkpIHsKLQkJCXZ4Njk1M19jdHJsLT5mcHMgPSAodWludDE2X3QpICgzMCAqIFE4ICoKLQkJCShmcmFtZV9sZW5ndGhfbGluZXMgLSBWWDY5NTNfU1RNNU0wRURPRl9PRkZTRVQpLwotCQkJbGluZSk7Ci0JCX0gZWxzZSB7Ci0JCQl2eDY5NTNfY3RybC0+ZnBzID0gKHVpbnQxNl90KSAoMzAgKiBROCk7Ci0JCX0KLQl9IGVsc2UgewotCQlmcmFtZV9sZW5ndGhfbGluZXMgPSBWWDY5NTNfRlVMTF9TSVpFX0hFSUdIVCArCi0JCQkJVlg2OTUzX1ZFUl9GVUxMX0JMS19MSU5FUzsKLQkJbGluZV9sZW5ndGhfcGNrID0gVlg2OTUzX0ZVTExfU0laRV9XSURUSCArCi0JCQkJVlg2OTUzX0hSWl9GVUxMX0JMS19QSVhFTFM7Ci0JfQotCi0Jdng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJR1JPVVBFRF9QQVJBTUVURVJfSE9MRCk7Ci0JaWYgKChsaW5lICsgVlg2OTUzX1NUTTVNMEVET0ZfT0ZGU0VUKSA+IE1BWF9GUkFNRV9MRU5HVEhfTElORVMpIHsKLQkJZnJhbWVfbGVuZ3RoX2xpbmVzID0gTUFYX0ZSQU1FX0xFTkdUSF9MSU5FUzsKLQkJbGluZSA9IE1BWF9GUkFNRV9MRU5HVEhfTElORVMgLSBWWDY5NTNfU1RNNU0wRURPRl9PRkZTRVQ7Ci0JfSBlbHNlIGlmICgobGluZSArIFZYNjk1M19TVE01TTBFRE9GX09GRlNFVCkgPiBmcmFtZV9sZW5ndGhfbGluZXMpIHsKLQkJZnJhbWVfbGVuZ3RoX2xpbmVzID0gbGluZSArIFZYNjk1M19TVE01TTBFRE9GX09GRlNFVDsKLQkJbGluZSA9IGZyYW1lX2xlbmd0aF9saW5lczsKLQl9Ci0KLQlmcmFtZV9sZW5ndGhfbGluZXNfaGkgPSAodWludDhfdCkgKChmcmFtZV9sZW5ndGhfbGluZXMgJgotCQkweEZGMDApID4+IDgpOwotCWZyYW1lX2xlbmd0aF9saW5lc19sbyA9ICh1aW50OF90KSAoZnJhbWVfbGVuZ3RoX2xpbmVzICYKLQkJMHgwMEZGKTsKLQl2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19GUkFNRV9MRU5HVEhfTElORVNfSEksCi0JCWZyYW1lX2xlbmd0aF9saW5lc19oaSk7Ci0Jdng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0xPLAotCQlmcmFtZV9sZW5ndGhfbGluZXNfbG8pOwotCi0JLyogdXBkYXRlIGFuYWxvZ3VlIGdhaW4gcmVnaXN0ZXJzICovCi0JZ2Fpbl9oaSA9ICh1aW50OF90KSAoKGdhaW4gJiAweEZGMDApID4+IDgpOwotCWdhaW5fbG8gPSAodWludDhfdCkgKGdhaW4gJiAweDAwRkYpOwotCXZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0FOQUxPR1VFX0dBSU5fQ09ERV9HTE9CQUxfTE8sCi0JCWdhaW5fbG8pOwotCXZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0RJR0lUQUxfR0FJTl9HUkVFTl9SX0xPLCBnYWluX2hpKTsKLQl2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19ESUdJVEFMX0dBSU5fUkVEX0xPLCBnYWluX2hpKTsKLQl2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19ESUdJVEFMX0dBSU5fQkxVRV9MTywgZ2Fpbl9oaSk7Ci0Jdng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfRElHSVRBTF9HQUlOX0dSRUVOX0JfTE8sIGdhaW5faGkpOwotCUNEQkcoIiVzLCBnYWluX2hpIDB4JXgsIGdhaW5fbG8gMHgleFxuIiwgX19mdW5jX18sCi0JCWdhaW5faGksIGdhaW5fbG8pOwotCS8qIHVwZGF0ZSBsaW5lIGNvdW50IHJlZ2lzdGVycyAqLwotCWludGdfdGltZV9oaSA9ICh1aW50OF90KSAoKCh1aW50MTZfdClsaW5lICYgMHhGRjAwKSA+PiA4KTsKLQlpbnRnX3RpbWVfbG8gPSAodWludDhfdCkgKCh1aW50MTZfdClsaW5lICYgMHgwMEZGKTsKLQl2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9ISSwKLQkJaW50Z190aW1lX2hpKTsKLQl2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9MTywKLQkJaW50Z190aW1lX2xvKTsKLQl2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQlHUk9VUEVEX1BBUkFNRVRFUl9IT0xEX09GRik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHZ4Njk1M19zZXRfcGljdF9leHBfZ2Fpbih1aW50MTZfdCBnYWluLCB1aW50MzJfdCBsaW5lKQotewotCWludDMyX3QgcmMgPSAwOwotCXJjID0gdng2OTUzX3dyaXRlX2V4cF9nYWluKGdhaW4sIGxpbmUpOwotCXJldHVybiByYzsKLX0gLyogZW5kb2Ygdng2OTUzX3NldF9waWN0X2V4cF9nYWluKi8KLQotc3RhdGljIGludDMyX3Qgdng2OTUzX21vdmVfZm9jdXMoaW50IGRpcmVjdGlvbiwKLQlpbnQzMl90IG51bV9zdGVwcykKLXsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50MzJfdCB2eDY5NTNfc2V0X2RlZmF1bHRfZm9jdXModWludDhfdCBhZl9zdGVwKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCB2eDY5NTNfdGVzdChlbnVtIHZ4Njk1M190ZXN0X21vZGVfdCBtbykKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlpZiAobW8gPT0gVEVTVF9PRkYpCi0JCXJldHVybiByYzsKLQllbHNlIHsKLQkJLyogUkVHXzB4MzBEOFs0XSBpcyBURVNCWVBFTjogMDogTm9ybWFsIE9wZXJhdGlvbiwKLQkJMTogQnlwYXNzIFNpZ25hbCBQcm9jZXNzaW5nCi0JCVJFR18weDMwRDhbNV0gaXMgRUJETUFTSzogMDoKLQkJT3V0cHV0IEVtYmVkZGVkIGRhdGEsIDE6IE5vIG91dHB1dCBlbWJlZGRlZCBkYXRhICovCi0JCWlmICh2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19URVNUX1BBVFRFUk5fTU9ERSwKLQkJCSh1aW50OF90KSBtbykgPCAwKSB7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHZ4Njk1M19lbmFibGVfZWRvZihlbnVtIGVkb2ZfbW9kZV90IGVkb2ZfbW9kZSkKLXsKLQlpbnQgcmMgPSAwOwotCWlmIChlZG9mX21vZGUgPT0gVlg2OTUzX0VET0ZfRVNUSU1BVElPTikgewotCQkvKiBFRG9mIEVzdGltYXRpb24gbW9kZSBmb3IgcHJldmlldyAqLwotCQlpZiAodng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgwYjgwLCAweDAyKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JCUNEQkcoIlZYNjk1M19FRE9GX0VTVElNQVRJT04iKTsKLQl9IGVsc2UgaWYgKGVkb2ZfbW9kZSA9PSBWWDY5NTNfRURPRl9BUFBMSUNBVElPTikgewotCQkvKiBFRG9mIEFwcGxpY2F0aW9uIG1vZGUgZm9yIENhcHR1cmUgKi8KLQkJaWYgKHZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MGI4MCwgMHgwMSkgPCAwKQotCQkJcmV0dXJuIHJjOwotCQlDREJHKCJWWDY5NTNfRURPRl9BUFBMSUNBVElPTiIpOwotCX0gZWxzZSB7Ci0JCS8qIEVET0YgZGlzYWJsZWQgKi8KLQkJaWYgKHZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHXzB4MGI4MCwgMHgwMCkgPCAwKQotCQkJcmV0dXJuIHJjOwotCQlDREJHKCJWWDY5NTNfRURPRl9ESVNBQkxFIik7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3Qgdng2OTUzX3BhdGNoX2Zvcl9jdXQyKHZvaWQpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JcmMgPSB2eDY5NTNfaTJjX3dyaXRlX3dfdGFibGUocGF0Y2hfdGJsX2N1dDIsCi0JCUFSUkFZX1NJWkUocGF0Y2hfdGJsX2N1dDIpKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHZ4Njk1M19sc2NfcGF0Y2godm9pZCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlpbnQgaSwgajsKLQlzaG9ydCBpbnQgIHY7Ci0JdW5zaWduZWQgc2hvcnQgdmVyc2lvbiA9IDA7Ci0JdW5zaWduZWQgc2hvcnQgTFNDX1Jhd1tOVU1fTFNDX0NBU1RfUkVHU107Ci0JdW5zaWduZWQgc2hvcnQgTFNDX0ZpeGVkW05VTV9MU0NfQ0FTVF9SRUdTXTsKLQotCXZ4Njk1M19pMmNfcmVhZCgweDEwLCAmdmVyc2lvbiwgMSk7Ci0JQ0RCRygiQ3V0IDMgVmVyc2lvbiAlZFxuIiwgdmVyc2lvbik7Ci0JaWYgKHZlcnNpb24gIT0gMSkKLQkJcmV0dXJuIDA7Ci0KLQl2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MzY0MCwgMHgwMCk7Ci0JZm9yIChqID0gY2FzdF9IOyBqIDwgY2FzdF9NQVg7IGorKykgewotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0xTQ19DQVNUX1JFR1M7IGkrKykgewotCQkJcmMgPSB2eDY5NTNfaTJjX3JlYWQoTFNDX0Nhc3RSZWdzW2Nhc3RfRF0rKDIqaSksCi0JCQkJCQkJCSZMU0NfUmF3W2ldLCAyKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJdiA9IExTQ19SYXdbaV07Ci0JCQl2ICs9ICBMU0NfQ29ycmVjdGlvbkZvckNhc3Rbal1baV07Ci0JCQlMU0NfRml4ZWRbaV0gPSAodW5zaWduZWQgc2hvcnQpIHY7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IE5VTV9MU0NfQ0FTVF9SRUdTOyBpKyspIHsKLQkJCXJjID0gdng2OTUzX2kyY193cml0ZV93X3NlbnNvcihMU0NfQ2FzdFJlZ3Nbal0rKDIqaSksCi0JCQkJCQkJCUxTQ19GaXhlZFtpXSk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQkJfQotCX0KLQlDREJHKCJ2eDY5NTNfbHNjX3BhdGNoIGRvbmVcbiIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3Qgdng2OTUzX3NlbnNvcl9zZXR0aW5nKGludCB1cGRhdGVfdHlwZSwgaW50IHJ0KQotewotCi0JaW50MzJfdCByYyA9IDA7Ci0JdW5zaWduZWQgc2hvcnQgZnJhbWVfY250OwotCXN0cnVjdCBtc21fY2FtZXJhX2NzaV9wYXJhbXMgdng2OTUzX2NzaV9wYXJhbXM7Ci0JaWYgKHZ4Njk1M19jdHJsLT5zZW5zb3JfdHlwZSAhPSBWWDY5NTNfU1RNNU0wRURPRl9DVVRfMikgewotCQlzd2l0Y2ggKHVwZGF0ZV90eXBlKSB7Ci0JCWNhc2UgUkVHX0lOSVQ6Ci0JCWlmIChydCA9PSBSRVNfUFJFVklFVyB8fCBydCA9PSBSRVNfQ0FQVFVSRSkgewotCQkJc3RydWN0IHZ4Njk1M19pMmNfcmVnX2NvbmYgaW5pdF90YmxbXSA9IHsKLQkJCQl7UkVHXzB4MDExMiwKLQkJCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCQlyZWdfMHgwMTEyfSwKLQkJCQl7UkVHXzB4MDExMywKLQkJCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCQlyZWdfMHgwMTEzfSwKLQkJCQl7UkVHX1ZUX1BJWF9DTEtfRElWLAotCQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJCXZ0X3BpeF9jbGtfZGl2fSwKLQkJCQl7MHgzMDMsIDB4MDF9LAotCQkJCXsweDMwYiwgMHgwMX0sCi0JCQkJe1JFR19QUkVfUExMX0NMS19ESVYsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcHJlX3BsbF9jbGtfZGl2fSwKLQkJCQl7UkVHX1BMTF9NVUxUSVBMSUVSLAotCQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJCXBsbF9tdWx0aXBsaWVyfSwKLQkJCQl7UkVHX09QX1BJWF9DTEtfRElWLAotCQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJCW9wX3BpeF9jbGtfZGl2fSwKLQkJCQl7UkVHXzB4MzIxMCwgMHgwMX0sCi0JCQkJe1JFR18weDAxMTEsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcmVnXzB4MDExMX0sCi0JCQkJe1JFR18weDBiMDAsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcmVnXzB4MGIwMH0sCi0JCQkJe1JFR18weDAxMzYsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcmVnXzB4MDEzNn0sCi0JCQkJe1JFR18weDAxMzcsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcmVnXzB4MDEzN30sCi0JCQkJe1JFR18weDBiMDYsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcmVnXzB4MGIwNn0sCi0JCQkJe1JFR18weDBiMDcsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcmVnXzB4MGIwN30sCi0JCQkJe1JFR18weDBiMDgsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcmVnXzB4MGIwOH0sCi0JCQkJe1JFR18weDBiMDksCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcmVnXzB4MGIwOX0sCi0JCQkJe1JFR18weDBiODMsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcmVnXzB4MGI4M30sCi0JCQkJe1JFR18weDBiODQsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcmVnXzB4MGI4NH0sCi0JCQkJe1JFR18weDBiODUsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcmVnXzB4MGI4NX0sCi0JCQkJe1JFR18weDBiODgsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcmVnXzB4MGI4OH0sCi0JCQkJe1JFR18weDBiODksCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcmVnXzB4MGI4OX0sCi0JCQkJe1JFR18weDBiOGEsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQkJcmVnXzB4MGI4YX0sCi0JCQkJezB4MzM5MywgMHgwNn0sCi0JCQkJezB4MzM5NCwgMHgwN30sCi0JCQkJezB4MzM4ZCwgMHgwOH0sCi0JCQkJezB4MzM4ZSwgMHgwOH0sCi0JCQkJezB4MzM4ZiwgMHgwMH0sCi0JCQl9OwotCQkJLyogcmVzZXQgZnBzX2RpdmlkZXIgKi8KLQkJCXZ4Njk1M19jdHJsLT5mcHMgPSAzMCAqIFE4OwotCQkJLyogc3RvcCBzdHJlYW1pbmcgKi8KLQotCQkJY291bnQgPSAwOwotCQkJQ0RCRygiSW5pdCB2eDY5NTNfc2Vuc29yX3NldHRpbmcgc3RhbmRieVxuIik7Ci0JCQlpZiAodng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfTU9ERV9TRUxFQ1QsCi0JCQkJTU9ERV9TRUxFQ1RfU1RBTkRCWV9NT0RFKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJbXNsZWVwKHZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5KTsKLQkJCXZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCQlHUk9VUEVEX1BBUkFNRVRFUl9IT0xEKTsKLQotCQkJcmMgPSB2eDY5NTNfaTJjX3dyaXRlX3dfdGFibGUoY3V0M19jYWxpX2RhdGEsCi0JCQkJQVJSQVlfU0laRShjdXQzX2NhbGlfZGF0YSkpOwotCi0JCQl2eDY5NTNfbHNjX3BhdGNoKCk7Ci0KLQkJCXZ4Njk1M19pMmNfd3JpdGVfd19zZW5zb3IoMHgxMDBBLCAweDA3QTMpOwotCQkJdng2OTUzX2kyY193cml0ZV93X3NlbnNvcigweDExNEEsIDB4MDAyQSk7Ci0JCQl2eDY5NTNfaTJjX3dyaXRlX3dfc2Vuc29yKDB4MTcxNiwgMHgwMjA0KTsKLQkJCXZ4Njk1M19pMmNfd3JpdGVfd19zZW5zb3IoMHgxNzE4LCAweDA4ODApOwotCi0JCQlyYyA9IHZ4Njk1M19pMmNfd3JpdGVfd190YWJsZSgmaW5pdF90YmxbMF0sCi0JCQkJQVJSQVlfU0laRShpbml0X3RibCkpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCW1zbGVlcCgxMCk7Ci0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JCWNhc2UgVVBEQVRFX1BFUklPRElDOgotCQlpZiAocnQgPT0gUkVTX1BSRVZJRVcgfHwgcnQgPT0gUkVTX0NBUFRVUkUpIHsKLQkJCXN0cnVjdCB2eDY5NTNfaTJjX3JlZ19jb25mIHByZXZpZXdfbW9kZV90YmxbXSA9IHsKLQkJCQl7MHgyMDAsIDB4MDJ9LAotCQkJCXsweDIwMSwgMHgyNn0sCi0JCQkJe1JFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9ISSwKLQkJCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCWNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX2hpfSwKLQkJCQl7UkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0xPLAotCQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJY29hcnNlX2ludGVncmF0aW9uX3RpbWVfbG99LAotCQkJCXtSRUdfQU5BTE9HVUVfR0FJTl9DT0RFX0dMT0JBTF9MTywKLQkJCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCWFuYWxvZ3VlX2dhaW5fY29kZV9nbG9iYWx9LAotCQkJCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0hJLAotCQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJZnJhbWVfbGVuZ3RoX2xpbmVzX2hpfSwKLQkJCQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19MTywKLQkJCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCWZyYW1lX2xlbmd0aF9saW5lc19sb30sCi0JCQkJe1JFR19MSU5FX0xFTkdUSF9QQ0tfSEksCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQlsaW5lX2xlbmd0aF9wY2tfaGl9LAotCQkJCXtSRUdfTElORV9MRU5HVEhfUENLX0xPLAotCQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJbGluZV9sZW5ndGhfcGNrX2xvfSwKLQkJCQl7UkVHXzB4MGI4MCwKLQkJCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXJlZ18weDBiODB9LAotCQkJCXtSRUdfMHgwOTAwLAotCQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJcmVnXzB4MDkwMH0sCi0JCQkJe1JFR18weDA5MDEsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQlyZWdfMHgwOTAxfSwKLQkJCQl7UkVHXzB4MDkwMiwKLQkJCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXJlZ18weDA5MDJ9LAotCQkJCXtSRUdfMHgwMzgzLAotCQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJcmVnXzB4MDM4M30sCi0JCQkJe1JFR18weDAzODcsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQlyZWdfMHgwMzg3fSwKLQkJCQl7UkVHXzB4MDM0YywKLQkJCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXJlZ18weDAzNGN9LAotCQkJCXtSRUdfMHgwMzRkLAotCQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJcmVnXzB4MDM0ZH0sCi0JCQkJe1JFR18weDAzNGUsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQlyZWdfMHgwMzRlfSwKLQkJCQl7UkVHXzB4MDM0ZiwKLQkJCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXJlZ18weDAzNGZ9LAotCQkJCXtSRUdfMHgzNjQwLCAweDAwfSwKLQkJCX07Ci0KLQkJCXN0cnVjdCB2eDY5NTNfaTJjX3JlZ19jb25mIHNuYXBzaG90X21vZGVfdGJsW10gPSB7Ci0JCQkJezB4MDIwMCwgMHgwMn0sCi0JCQkJezB4MDIwMSwgMHg1NH0sCi0JCQkJe1JFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9ISSwKLQkJCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCWNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX2hpfSwKLQkJCQl7UkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0xPLAotCQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJY29hcnNlX2ludGVncmF0aW9uX3RpbWVfbG99LAotCQkJCXtSRUdfQU5BTE9HVUVfR0FJTl9DT0RFX0dMT0JBTF9MTywKLQkJCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCWFuYWxvZ3VlX2dhaW5fY29kZV9nbG9iYWx9LAotCQkJCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0hJLAotCQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJZnJhbWVfbGVuZ3RoX2xpbmVzX2hpfSwKLQkJCQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19MTywKLQkJCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCWZyYW1lX2xlbmd0aF9saW5lc19sb30sCi0JCQkJe1JFR19MSU5FX0xFTkdUSF9QQ0tfSEksCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQlsaW5lX2xlbmd0aF9wY2tfaGl9LAotCQkJCXtSRUdfTElORV9MRU5HVEhfUENLX0xPLAotCQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJbGluZV9sZW5ndGhfcGNrX2xvfSwKLQkJCQl7UkVHXzB4MGI4MCwKLQkJCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXJlZ18weDBiODB9LAotCQkJCXtSRUdfMHgwOTAwLAotCQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJcmVnXzB4MDkwMH0sCi0JCQkJe1JFR18weDA5MDEsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQlyZWdfMHgwOTAxfSwKLQkJCQl7UkVHXzB4MDkwMiwKLQkJCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXJlZ18weDA5MDJ9LAotCQkJCXtSRUdfMHgwMzgzLAotCQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJcmVnXzB4MDM4M30sCi0JCQkJe1JFR18weDAzODcsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQlyZWdfMHgwMzg3fSwKLQkJCQl7UkVHXzB4MDM0YywKLQkJCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXJlZ18weDAzNGN9LAotCQkJCXtSRUdfMHgwMzRkLAotCQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQkJcmVnXzB4MDM0ZH0sCi0JCQkJe1JFR18weDAzNGUsCi0JCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCQlyZWdfMHgwMzRlfSwKLQkJCQl7UkVHXzB4MDM0ZiwKLQkJCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJCXJlZ18weDAzNGZ9LAotCQkJCXsweDMxNDAsIDB4MDF9LAotCQkJCXtSRUdfMHgzNjQwLCAweDAwfSwKLQkJCX07Ci0JCQkvKiBzdG9wIHN0cmVhbWluZyAqLwotCi0JCQlpZiAodng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfTU9ERV9TRUxFQ1QsCi0JCQkJTU9ERV9TRUxFQ1RfU1RBTkRCWV9NT0RFKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJbXNsZWVwKHZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5KTsKLQotCQkJaWYgKGNvdW50ID09IDApIHsKLQkJCQl2eDY5NTNfY3NpX3BhcmFtcy5kYXRhX2Zvcm1hdCA9IENTSV84QklUOwotCQkJCXZ4Njk1M19jc2lfcGFyYW1zLmxhbmVfY250ID0gMTsKLQkJCQl2eDY5NTNfY3NpX3BhcmFtcy5sYW5lX2Fzc2lnbiA9IDB4ZTQ7Ci0JCQkJdng2OTUzX2NzaV9wYXJhbXMuZHBjbV9zY2hlbWUgPSAwOwotCQkJCXZ4Njk1M19jc2lfcGFyYW1zLnNldHRsZV9jbnQgPSA3OwotCQkJCXJjID0gbXNtX2NhbWlvX2NzaV9jb25maWcoJnZ4Njk1M19jc2lfcGFyYW1zKTsKLQkJCQlpZiAocmMgPCAwKQotCQkJCQlDREJHKCJjb25maWcgY3NpIGNvbnRyb2xsZXIgZmFpbGVkXG4iKTsKLQotCQkJCW1zbGVlcCgyMCk7Ci0JCQkJY291bnQgPSAxOwotCQkJfQotCi0JCQl2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xELAotCQkJR1JPVVBFRF9QQVJBTUVURVJfSE9MRCk7Ci0KLQkJCWlmIChydCA9PSBSRVNfUFJFVklFVykgewotCQkJCXJjID0gdng2OTUzX2kyY193cml0ZV93X3RhYmxlKAotCQkJCQkmcHJldmlld19tb2RlX3RibFswXSwKLQkJCQkJQVJSQVlfU0laRShwcmV2aWV3X21vZGVfdGJsKSk7Ci0JCQkJaWYgKHJjIDwgMCkKLQkJCQkJcmV0dXJuIHJjOwotCQkJfQotCQkJaWYgKHJ0ID09IFJFU19DQVBUVVJFKSB7Ci0JCQkJcmMgPSB2eDY5NTNfaTJjX3dyaXRlX3dfdGFibGUoCi0JCQkJCSZzbmFwc2hvdF9tb2RlX3RibFswXSwKLQkJCQkJQVJSQVlfU0laRShzbmFwc2hvdF9tb2RlX3RibCkpOwotCQkJCWlmIChyYyA8IDApCi0JCQkJCXJldHVybiByYzsKLQkJCX0KLQotCQkJdng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJCUdST1VQRURfUEFSQU1FVEVSX0hPTERfT0ZGKTsKLQotCQkJLyogU3RhcnQgc2Vuc29yIHN0cmVhbWluZyAqLwotCQkJaWYgKHZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX01PREVfU0VMRUNULAotCQkJCU1PREVfU0VMRUNUX1NUUkVBTSkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCW1zbGVlcCgxMCk7Ci0KLQkJCWlmICh2eDY5NTNfaTJjX3JlYWQoMHgwMDA1LCAmZnJhbWVfY250LCAxKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQl3aGlsZSAoZnJhbWVfY250ID09IDB4RkYpIHsKLQkJCQlpZiAodng2OTUzX2kyY19yZWFkKDB4MDAwNSwgJmZyYW1lX2NudCwgMSkgPCAwKQotCQkJCQlyZXR1cm4gcmM7Ci0JCQkJQ0RCRygiZnJhbWVfY250PSVkXG4iLCBmcmFtZV9jbnQpOwotCQkJCW1zbGVlcCgyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9IGVsc2UgewotCQlzd2l0Y2ggKHVwZGF0ZV90eXBlKSB7Ci0JCWNhc2UgUkVHX0lOSVQ6Ci0JCWlmIChydCA9PSBSRVNfUFJFVklFVyB8fCBydCA9PSBSRVNfQ0FQVFVSRSkgewotCQkJc3RydWN0IHZ4Njk1M19pMmNfcmVnX2NvbmYgaW5pdF90YmxbXSA9IHsKLQkJCXtSRUdfMHgwMTEyLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwMTEyfSwKLQkJCXtSRUdfMHgwMTEzLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwMTEzfSwKLQkJCXtSRUdfVlRfUElYX0NMS19ESVYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCXZ0X3BpeF9jbGtfZGl2fSwKLQkJCXtSRUdfUFJFX1BMTF9DTEtfRElWLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQlwcmVfcGxsX2Nsa19kaXZ9LAotCQkJe1JFR19QTExfTVVMVElQTElFUiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJcGxsX211bHRpcGxpZXJ9LAotCQkJe1JFR19PUF9QSVhfQ0xLX0RJViwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJb3BfcGl4X2Nsa19kaXZ9LAotCQkJe1JFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9ISSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQljb2Fyc2VfaW50ZWdyYXRpb25fdGltZV9oaX0sCi0JCQl7UkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0xPLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX2xvfSwKLQkJCXtSRUdfQU5BTE9HVUVfR0FJTl9DT0RFX0dMT0JBTF9MTywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQlhbmFsb2d1ZV9nYWluX2NvZGVfZ2xvYmFsfSwKLQkJCXtSRUdfMHgzMDMwLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDMwfSwKLQkJCS8qIDk1MyBzcGVjaWZpYyByZWdpc3RlcnMgKi8KLQkJCXtSRUdfMHgwMTExLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwMTExfSwKLQkJCXtSRUdfMHgwYjAwLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjAwfSwKLQkJCXtSRUdfMHgzMDAxLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDAxfSwKLQkJCXtSRUdfMHgzMDA0LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDA0fSwKLQkJCXtSRUdfMHgzMDA3LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDA3fSwKLQkJCXtSRUdfMHgzMDE2LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDE2fSwKLQkJCXtSRUdfMHgzMDFkLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDFkfSwKLQkJCXtSRUdfMHgzMTdlLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMTdlfSwKLQkJCXtSRUdfMHgzMTdmLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMTdmfSwKLQkJCXtSRUdfMHgzNDAwLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzNDAwfSwKLQkJCS8qIERFRkNPUiBzZXR0aW5ncyAqLwotCQkJLypTaW5nbGUgRGVmZWN0IENvcnJlY3Rpb24gV2VpZ2h0IERJU0FCTEUqLwotCQkJezB4MGIwNiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGIwNn0sCi0JCQkvKlNpbmdsZV9kZWZlY3RfY29ycmVjdF93ZWlnaHQgPSBhdXRvKi8KLQkJCXsweDBiMDcsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiMDd9LAotCQkJLypEeW5hbWljIGNvdXBsZXQgY29ycmVjdGlvbiBFTkFCTEVEKi8KLQkJCXsweDBiMDgsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiMDh9LAotCQkJLypEeW5hbWljIGNvdXBsZXQgY29ycmVjdGlvbiB3ZWlnaHQqLwotCQkJezB4MGIwOSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGIwOX0sCi0JCQkvKiBDbG9jayBTZXR1cCAqLwotCQkJLyogVGVsbCBzZW5zb3IgZXh0IGNsayBpcyAyNE1IeiovCi0JCQl7MHgwMTM2LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwMTM2fSwKLQkJCXsweDAxMzcsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDAxMzd9LAotCQkJLyogVGhlIHdoaXRlIGJhbGFuY2UgZ2FpbnMgbXVzdCBiZSB3cml0dGVuCi0JCQl0byB0aGUgc2Vuc29yIGV2ZXJ5IGZyYW1lLiAqLwotCQkJLyogRWRvZiAqLwotCQkJe1JFR18weDBiODMsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiODN9LAotCQkJe1JFR18weDBiODQsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiODR9LAotCQkJezB4MGI4NSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4NX0sCi0JCQl7MHgwYjg4LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjg4fSwKLQkJCXsweDBiODksCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiODl9LAotCQkJe1JFR18weDBiOGEsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiOGF9LAotCQkJLyogTW9kZSBzcGVjaWZpYyByZWdpZXRlcnMgKi8KLQkJCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0hJLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWZyYW1lX2xlbmd0aF9saW5lc19oaX0sCi0JCQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19MTywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQlmcmFtZV9sZW5ndGhfbGluZXNfbG99LAotCQkJe1JFR19MSU5FX0xFTkdUSF9QQ0tfSEksCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJbGluZV9sZW5ndGhfcGNrX2hpfSwKLQkJCXtSRUdfTElORV9MRU5HVEhfUENLX0xPLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWxpbmVfbGVuZ3RoX3Bja19sb30sCi0JCQl7UkVHXzB4MzAwNSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDA1fSwKLQkJCXsweDMwMTAsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAxMH0sCi0JCQl7UkVHXzB4MzAxMSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDExfSwKLQkJCXtSRUdfMHgzMDFhLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMWF9LAotCQkJe1JFR18weDMwMzUsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAzNX0sCi0JCQl7UkVHXzB4MzAzNiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDM2fSwKLQkJCXtSRUdfMHgzMDQxLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwNDF9LAotCQkJezB4MzA0MiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDQyfSwKLQkJCXtSRUdfMHgzMDQ1LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwNDV9LAotCQkJLypFRE9GOiBFc3RpbWF0aW9uIHNldHRpbmdzIGZvciBQcmV2aWV3IG1vZGUKLQkJCUFwcGxpY2F0aW9uIHNldHRpbmdzIGZvciBjYXB0dXJlIG1vZGUKLQkJCShzdGFuZGFyZCBzZXR0aW5ncyAtIE5vdCB0dW5lZCkgKi8KLQkJCXtSRUdfMHgwYjgwLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDBiODB9LAotCQkJe1JFR18weDA5MDAsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDkwMH0sCi0JCQl7UkVHXzB4MDkwMSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwOTAxfSwKLQkJCXtSRUdfMHgwOTAyLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDA5MDJ9LAotCQkJe1JFR18weDAzODMsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM4M30sCi0JCQl7UkVHXzB4MDM4NywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzg3fSwKLQkJCS8qIENoYW5nZSBvdXRwdXQgc2l6ZSAvIGZyYW1lIHJhdGUgKi8KLQkJCXtSRUdfMHgwMzRjLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGN9LAotCQkJe1JFR18weDAzNGQsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM0ZH0sCi0JCQl7UkVHXzB4MDM0ZSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzRlfSwKLQkJCXtSRUdfMHgwMzRmLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGZ9LAotCQkJe1JFR18weDE3MTYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MTcxNn0sCi0JCQl7UkVHXzB4MTcxNywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgxNzE3fSwKLQkJCXtSRUdfMHgxNzE4LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDE3MTh9LAotCQkJe1JFR18weDE3MTksCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MTcxOX0sCi0JCQl9OwotCQkJCQkJLyogcmVzZXQgZnBzX2RpdmlkZXIgKi8KLQkJCXZ4Njk1M19jdHJsLT5mcHMgPSAzMCAqIFE4OwotCQkJLyogc3RvcCBzdHJlYW1pbmcgKi8KLQotCQkJLyogUmVzZXQgZXZlcnl0aGluZyBmaXJzdCAqLwotCQkJaWYgKHZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoMHgxMDMsIDB4MDEpIDwgMCkgewotCQkJCUNEQkcoIlMvVyByZXNldCBmYWlsZWRcbiIpOwotCQkJCXJldHVybiByYzsKLQkJCX0gZWxzZQotCQkJCUNEQkcoIlMvVyByZXNldCBzdWNjZXNzZnVsXG4iKTsKLQotCQkJbXNsZWVwKDEwKTsKLQotCQkJQ0RCRygiSW5pdCB2eDY5NTNfc2Vuc29yX3NldHRpbmcgc3RhbmRieVxuIik7Ci0JCQlpZiAodng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfTU9ERV9TRUxFQ1QsCi0JCQkJTU9ERV9TRUxFQ1RfU1RBTkRCWV9NT0RFKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJCS8qdng2OTUzX3N0bTVtMGVkb2ZfZGVsYXlfbXNlY3Nfc3RkYnkqLwotCQkJbXNsZWVwKHZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5KTsKLQkJCXZ4Njk1M19wYXRjaF9mb3JfY3V0MigpOwotCQkJcmMgPSB2eDY5NTNfaTJjX3dyaXRlX3dfdGFibGUoJmluaXRfdGJsWzBdLAotCQkJCUFSUkFZX1NJWkUoaW5pdF90YmwpKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJCW1zbGVlcCh2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSk7Ci0JCX0KLQlyZXR1cm4gcmM7Ci0JY2FzZSBVUERBVEVfUEVSSU9ESUM6Ci0JCWlmIChydCA9PSBSRVNfUFJFVklFVyB8fCBydCA9PSBSRVNfQ0FQVFVSRSkgewotCQkJc3RydWN0IHZ4Njk1M19pMmNfcmVnX2NvbmYgaW5pdF9tb2RlX3RibFtdID0gIHsKLQkJCXtSRUdfMHgwMTEyLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwMTEyfSwKLQkJCXtSRUdfMHgwMTEzLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwMTEzfSwKLQkJCXtSRUdfVlRfUElYX0NMS19ESVYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCXZ0X3BpeF9jbGtfZGl2fSwKLQkJCXtSRUdfUFJFX1BMTF9DTEtfRElWLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQlwcmVfcGxsX2Nsa19kaXZ9LAotCQkJe1JFR19QTExfTVVMVElQTElFUiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJcGxsX211bHRpcGxpZXJ9LAotCQkJe1JFR19PUF9QSVhfQ0xLX0RJViwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJb3BfcGl4X2Nsa19kaXZ9LAotCQkJe1JFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9ISSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQljb2Fyc2VfaW50ZWdyYXRpb25fdGltZV9oaX0sCi0JCQl7UkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0xPLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX2xvfSwKLQkJCXtSRUdfQU5BTE9HVUVfR0FJTl9DT0RFX0dMT0JBTF9MTywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQlhbmFsb2d1ZV9nYWluX2NvZGVfZ2xvYmFsfSwKLQkJCXtSRUdfMHgzMDMwLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDMwfSwKLQkJCS8qIDk1MyBzcGVjaWZpYyByZWdpc3RlcnMgKi8KLQkJCXtSRUdfMHgwMTExLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwMTExfSwKLQkJCXtSRUdfMHgwYjAwLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjAwfSwKLQkJCXtSRUdfMHgzMDAxLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDAxfSwKLQkJCXtSRUdfMHgzMDA0LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDA0fSwKLQkJCXtSRUdfMHgzMDA3LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDA3fSwKLQkJCXtSRUdfMHgzMDE2LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDE2fSwKLQkJCXtSRUdfMHgzMDFkLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDFkfSwKLQkJCXtSRUdfMHgzMTdlLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMTdlfSwKLQkJCXtSRUdfMHgzMTdmLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMTdmfSwKLQkJCXtSRUdfMHgzNDAwLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzNDAwfSwKLQkJCXsweDBiMDYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiMDZ9LAotCQkJLypTaW5nbGVfZGVmZWN0X2NvcnJlY3Rfd2VpZ2h0ID0gYXV0byovCi0JCQl7MHgwYjA3LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjA3fSwKLQkJCS8qRHluYW1pYyBjb3VwbGV0IGNvcnJlY3Rpb24gRU5BQkxFRCovCi0JCQl7MHgwYjA4LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjA4fSwKLQkJCS8qRHluYW1pYyBjb3VwbGV0IGNvcnJlY3Rpb24gd2VpZ2h0Ki8KLQkJCXsweDBiMDksCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiMDl9LAotCQkJLyogQ2xvY2sgU2V0dXAgKi8KLQkJCS8qIFRlbGwgc2Vuc29yIGV4dCBjbGsgaXMgMjRNSHoqLwotCQkJezB4MDEzNiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDEzNn0sCi0JCQl7MHgwMTM3LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwMTM3fSwKLQkJCS8qIFRoZSB3aGl0ZSBiYWxhbmNlIGdhaW5zIG11c3QgYmUgd3JpdHRlbgotCQkJdG8gdGhlIHNlbnNvciBldmVyeSBmcmFtZS4gKi8KLQkJCS8qIEVkb2YgKi8KLQkJCXtSRUdfMHgwYjgzLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjgzfSwKLQkJCXtSRUdfMHgwYjg0LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjg0fSwKLQkJCXsweDBiODUsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiODV9LAotCQkJezB4MGI4OCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4OH0sCi0JCQl7MHgwYjg5LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjg5fSwKLQkJCXtSRUdfMHgwYjhhLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjhhfSwKLQkJCS8qIE1vZGUgc3BlY2lmaWMgcmVnaWV0ZXJzICovCi0JCQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19ISSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQlmcmFtZV9sZW5ndGhfbGluZXNfaGl9LAotCQkJe1JFR19GUkFNRV9MRU5HVEhfTElORVNfTE8sCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJZnJhbWVfbGVuZ3RoX2xpbmVzX2xvfSwKLQkJCXtSRUdfTElORV9MRU5HVEhfUENLX0hJLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWxpbmVfbGVuZ3RoX3Bja19oaX0sCi0JCQl7UkVHX0xJTkVfTEVOR1RIX1BDS19MTywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQlsaW5lX2xlbmd0aF9wY2tfbG99LAotCQkJe1JFR18weDMwMDUsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAwNX0sCi0JCQl7MHgzMDEwLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMTB9LAotCQkJe1JFR18weDMwMTEsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAxMX0sCi0JCQl7UkVHXzB4MzAxYSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDFhfSwKLQkJCXtSRUdfMHgzMDM1LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMzV9LAotCQkJe1JFR18weDMwMzYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAzNn0sCi0JCQl7UkVHXzB4MzA0MSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDQxfSwKLQkJCXsweDMwNDIsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzA0Mn0sCi0JCQl7UkVHXzB4MzA0NSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDQ1fSwKLQkJCS8qRURPRjogRXN0aW1hdGlvbiBzZXR0aW5ncyBmb3IgUHJldmlldyBtb2RlCi0JCQlBcHBsaWNhdGlvbiBzZXR0aW5ncyBmb3IgY2FwdHVyZSBtb2RlCi0JCQkoc3RhbmRhcmQgc2V0dGluZ3MgLSBOb3QgdHVuZWQpICovCi0JCQl7UkVHXzB4MGI4MCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwYjgwfSwKLQkJCXtSRUdfMHgwOTAwLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDA5MDB9LAotCQkJe1JFR18weDA5MDEsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDkwMX0sCi0JCQl7UkVHXzB4MDkwMiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwOTAyfSwKLQkJCXtSRUdfMHgwMzgzLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzODN9LAotCQkJe1JFR18weDAzODcsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM4N30sCi0JCQkvKiBDaGFuZ2Ugb3V0cHV0IHNpemUgLyBmcmFtZSByYXRlICovCi0JCQl7UkVHXzB4MDM0YywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzRjfSwKLQkJCXtSRUdfMHgwMzRkLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGR9LAotCQkJe1JFR18weDAzNGUsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM0ZX0sCi0JCQl7UkVHXzB4MDM0ZiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzRmfSwKLQkJCXtSRUdfMHgxNzE2LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDE3MTZ9LAotCQkJe1JFR18weDE3MTcsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MTcxN30sCi0JCQl7UkVHXzB4MTcxOCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgxNzE4fSwKLQkJCXtSRUdfMHgxNzE5LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDE3MTl9LAotCQkJfTsKLQkJCXN0cnVjdCB2eDY5NTNfaTJjX3JlZ19jb25mIG1vZGVfdGJsW10gPSB7Ci0JCQl7UkVHXzB4MDExMiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDExMn0sCi0JCQl7UkVHXzB4MDExMywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDExM30sCi0JCQl7UkVHX1ZUX1BJWF9DTEtfRElWLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQl2dF9waXhfY2xrX2Rpdn0sCi0JCQl7UkVHX1BSRV9QTExfQ0xLX0RJViwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJcHJlX3BsbF9jbGtfZGl2fSwKLQkJCXtSRUdfUExMX01VTFRJUExJRVIsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCXBsbF9tdWx0aXBsaWVyfSwKLQkJCXtSRUdfT1BfUElYX0NMS19ESVYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCW9wX3BpeF9jbGtfZGl2fSwKLQkJLyogTW9kZSBzcGVjaWZpYyByZWdpZXRlcnMgKi8KLQkJCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0hJLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLmZyYW1lX2xlbmd0aF9saW5lc19oaX0sCi0JCQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19MTywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5mcmFtZV9sZW5ndGhfbGluZXNfbG99LAotCQkJe1JFR19MSU5FX0xFTkdUSF9QQ0tfSEksCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ubGluZV9sZW5ndGhfcGNrX2hpfSwKLQkJCXtSRUdfTElORV9MRU5HVEhfUENLX0xPLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLmxpbmVfbGVuZ3RoX3Bja19sb30sCi0JCQl7UkVHXzB4MzAwNSwgdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAwNX0sCi0JCQl7MHgzMDEwLCB2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDEwfSwKLQkJCXtSRUdfMHgzMDExLCB2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDExfSwKLQkJCXtSRUdfMHgzMDFhLCB2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDFhfSwKLQkJCXtSRUdfMHgzMDM1LCB2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDM1fSwKLQkJCXtSRUdfMHgzMDM2LCB2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDM2fSwKLQkJCXtSRUdfMHgzMDQxLCB2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDQxfSwKLQkJCXsweDMwNDIsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwNDJ9LAotCQkJe1JFR18weDMwNDUsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwNDV9LAotCQkJLypFRE9GOiBFc3RpbWF0aW9uIHNldHRpbmdzIGZvciBQcmV2aWV3IG1vZGUKLQkJCUFwcGxpY2F0aW9uIHNldHRpbmdzIGZvciBjYXB0dXJlCi0JCQltb2RlKHN0YW5kYXJkIHNldHRpbmdzIC0gTm90IHR1bmVkKSAqLwotCQkJe1JFR18weDBiODAsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDBiODB9LAotCQkJe1JFR18weDA5MDAsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDA5MDB9LAotCQkJe1JFR18weDA5MDEsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDA5MDF9LAotCQkJe1JFR18weDA5MDIsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDA5MDJ9LAotCQkJe1JFR18weDAzODMsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzODN9LAotCQkJe1JFR18weDAzODcsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzODd9LAotCQkJLyogQ2hhbmdlIG91dHB1dCBzaXplIC8gZnJhbWUgcmF0ZSAqLwotCQkJe1JFR18weDAzNGMsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGN9LAotCQkJe1JFR18weDAzNGQsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGR9LAotCQkJe1JFR18weDAzNGUsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGV9LAotCQkJe1JFR18weDAzNGYsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGZ9LAotCQkJLyp7MHgyMDAsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAyMDB9LAotCQkJezB4MjAxLCB2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMjAxfSwqLwotCQkJe1JFR18weDE3MTYsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDE3MTZ9LAotCQkJe1JFR18weDE3MTcsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDE3MTd9LAotCQkJe1JFR18weDE3MTgsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDE3MTh9LAotCQkJe1JFR18weDE3MTksIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDE3MTl9LAotCQkJfTsKLQkJCS8qIHN0b3Agc3RyZWFtaW5nICovCi0JCQltc2xlZXAoNSk7Ci0KLQkJCS8qIFJlc2V0IGV2ZXJ5dGhpbmcgZmlyc3QgKi8KLQkJCWlmICh2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MTAzLCAweDAxKSA8IDApIHsKLQkJCQlDREJHKCJTL1cgcmVzZXQgZmFpbGVkXG4iKTsKLQkJCQlyZXR1cm4gcmM7Ci0JCQl9IGVsc2UKLQkJCQlDREJHKCJTL1cgcmVzZXQgc3VjY2Vzc2Z1bFxuIik7Ci0KLQkJCW1zbGVlcCgxMCk7Ci0KLQkJCWlmICh2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19NT0RFX1NFTEVDVCwKLQkJCQlNT0RFX1NFTEVDVF9TVEFOREJZX01PREUpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQkvKnZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5Ki8KLQkJCW1zbGVlcCh2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSk7Ci0KLQotCQkJdng2OTUzX2NzaV9wYXJhbXMuZGF0YV9mb3JtYXQgPSBDU0lfOEJJVDsKLQkJCXZ4Njk1M19jc2lfcGFyYW1zLmxhbmVfY250ID0gMTsKLQkJCXZ4Njk1M19jc2lfcGFyYW1zLmxhbmVfYXNzaWduID0gMHhlNDsKLQkJCXZ4Njk1M19jc2lfcGFyYW1zLmRwY21fc2NoZW1lID0gMDsKLQkJCXZ4Njk1M19jc2lfcGFyYW1zLnNldHRsZV9jbnQgPSA3OwotCQkJcmMgPSBtc21fY2FtaW9fY3NpX2NvbmZpZygmdng2OTUzX2NzaV9wYXJhbXMpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCW1zbGVlcCh2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSk7Ci0KLQkJCXZ4Njk1M19wYXRjaF9mb3JfY3V0MigpOwotCQkJcmMgPSB2eDY5NTNfaTJjX3dyaXRlX3dfdGFibGUoJmluaXRfbW9kZV90YmxbMF0sCi0JCQkJQVJSQVlfU0laRShpbml0X21vZGVfdGJsKSk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJbXNsZWVwKHZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5KTsKLQotCQkJcmMgPSB2eDY5NTNfaTJjX3dyaXRlX3dfdGFibGUoJm1vZGVfdGJsWzBdLAotCQkJCUFSUkFZX1NJWkUobW9kZV90YmwpKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQltc2xlZXAodng2OTUzX3N0bTVtMGVkb2ZfZGVsYXlfbXNlY3Nfc3RkYnkpOwotCi0JCQkvKiBTdGFydCBzZW5zb3Igc3RyZWFtaW5nICovCi0JCQlpZiAodng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfTU9ERV9TRUxFQ1QsCi0JCQkJTU9ERV9TRUxFQ1RfU1RSRUFNKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJbXNsZWVwKHZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0cmVhbSk7Ci0KLQkJCWlmICh2eDY5NTNfaTJjX3JlYWQoMHgwMDA1LCAmZnJhbWVfY250LCAxKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCi0JCQl3aGlsZSAoZnJhbWVfY250ID09IDB4RkYpIHsKLQkJCQlpZiAodng2OTUzX2kyY19yZWFkKDB4MDAwNSwgJmZyYW1lX2NudCwgMSkgPCAwKQotCQkJCQlyZXR1cm4gcmM7Ci0JCQkJQ0RCRygiZnJhbWVfY250PSVkIiwgZnJhbWVfY250KTsKLQkJCQltc2xlZXAoMTApOwotCQkJfQotCQl9Ci0JCXJldHVybiByYzsKLQlkZWZhdWx0OgotCQlyZXR1cm4gcmM7Ci0JfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIGludDMyX3Qgdng2OTUzX3ZpZGVvX2NvbmZpZyhpbnQgbW9kZSkKLXsKLQotCWludDMyX3QJcmMgPSAwOwotCWludAlydDsKLQkvKiBjaGFuZ2Ugc2Vuc29yIHJlc29sdXRpb24JaWYgbmVlZGVkICovCi0JaWYgKHZ4Njk1M19jdHJsLT5jdXJyX3JlcyAhPSB2eDY5NTNfY3RybC0+cHJldl9yZXMpIHsKLQkJaWYgKHZ4Njk1M19jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkgewotCQkJcnQgPSBSRVNfUFJFVklFVzsKLQkJCXZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5CT0KLQkJCQkoKCgoMiAqIDEwMDAgKiB2eDY5NTNfY3RybC0+ZnBzX2RpdmlkZXIpIC8KLQkJCQkgICB2eDY5NTNfY3RybC0+ZnBzKSAqIFE4KSAvIFExMCkgKyAxOwotCQl9IGVsc2UgewotCQkJcnQgPSBSRVNfQ0FQVFVSRTsKLQkJCXZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5CT0KLQkJCQkoKCgoMTAwMCAqIHZ4Njk1M19jdHJsLT5mcHNfZGl2aWRlcikgLwotCQkJCSAgIHZ4Njk1M19jdHJsLT5mcHMpICogUTgpIC8gUTEwKSArIDE7Ci0JCX0KLQkJaWYgKHZ4Njk1M19zZW5zb3Jfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsIHJ0KSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfQotCWlmICh2eDY5NTNfY3RybC0+c2V0X3Rlc3QpIHsKLQkJaWYgKHZ4Njk1M190ZXN0KHZ4Njk1M19jdHJsLT5zZXRfdGVzdCkgPCAwKQotCQkJcmV0dXJuCXJjOwotCX0KLQl2eDY5NTNfY3RybC0+ZWRvZl9tb2RlID0gVlg2OTUzX0VET0ZfRVNUSU1BVElPTjsKLQlyYyA9IHZ4Njk1M19lbmFibGVfZWRvZih2eDY5NTNfY3RybC0+ZWRvZl9tb2RlKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0Jdng2OTUzX2N0cmwtPmN1cnJfcmVzID0gdng2OTUzX2N0cmwtPnByZXZfcmVzOwotCXZ4Njk1M19jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHZ4Njk1M19zbmFwc2hvdF9jb25maWcoaW50IG1vZGUpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JaW50IHJ0OwotCS8qY2hhbmdlIHNlbnNvciByZXNvbHV0aW9uIGlmIG5lZWRlZCAqLwotCWlmICh2eDY5NTNfY3RybC0+Y3Vycl9yZXMgIT0gdng2OTUzX2N0cmwtPnBpY3RfcmVzKSB7Ci0JCWlmICh2eDY5NTNfY3RybC0+cGljdF9yZXMgPT0gUVRSX1NJWkUpIHsKLQkJCXJ0ID0gUkVTX1BSRVZJRVc7Ci0JCQl2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSA9Ci0JCQkJKCgoKDIgKiAxMDAwICogdng2OTUzX2N0cmwtPmZwc19kaXZpZGVyKSAvCi0JCQkJdng2OTUzX2N0cmwtPmZwcykgKiBROCkgLyBRMTApICsgMTsKLQkJfSBlbHNlIHsKLQkJCXJ0ID0gUkVTX0NBUFRVUkU7Ci0JCQl2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSA9Ci0JCQkJKCgoKDEwMDAgKiB2eDY5NTNfY3RybC0+ZnBzX2RpdmlkZXIpIC8KLQkJCQl2eDY5NTNfY3RybC0+ZnBzKSAqIFE4KSAvIFExMCkgKyAxOwotCQl9Ci0JaWYgKHZ4Njk1M19zZW5zb3Jfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsIHJ0KSA8IDApCi0JCXJldHVybiByYzsKLQl9Ci0KLQl2eDY5NTNfY3RybC0+ZWRvZl9tb2RlID0gVlg2OTUzX0VET0ZfQVBQTElDQVRJT047Ci0JaWYgKHZ4Njk1M19lbmFibGVfZWRvZih2eDY5NTNfY3RybC0+ZWRvZl9tb2RlKSA8IDApCi0JCXJldHVybiByYzsKLQl2eDY5NTNfY3RybC0+Y3Vycl9yZXMgPSB2eDY5NTNfY3RybC0+cGljdF9yZXM7Ci0Jdng2OTUzX2N0cmwtPnNlbnNvcm1vZGUgPSBtb2RlOwotCXJldHVybiByYzsKLX0gLyplbmQgb2Ygdng2OTUzX3NuYXBzaG90X2NvbmZpZyovCi0KLXN0YXRpYyBpbnQzMl90IHZ4Njk1M19yYXdfc25hcHNob3RfY29uZmlnKGludCBtb2RlKQotewotCWludDMyX3QgcmMgPSAwOwotCWludCBydDsKLQkvKiBjaGFuZ2Ugc2Vuc29yIHJlc29sdXRpb24gaWYgbmVlZGVkICovCi0JaWYgKHZ4Njk1M19jdHJsLT5jdXJyX3JlcyAhPSB2eDY5NTNfY3RybC0+cGljdF9yZXMpIHsKLQkJaWYgKHZ4Njk1M19jdHJsLT5waWN0X3JlcyA9PSBRVFJfU0laRSkgewotCQkJcnQgPSBSRVNfUFJFVklFVzsKLQkJCXZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5ID0KLQkJCQkoKCgoMiAqIDEwMDAgKiB2eDY5NTNfY3RybC0+ZnBzX2RpdmlkZXIpLwotCQkJCXZ4Njk1M19jdHJsLT5mcHMpICogUTgpIC8gUTEwKSArIDE7Ci0JCX0gZWxzZSB7Ci0JCQlydCA9IFJFU19DQVBUVVJFOwotCQkJdng2OTUzX3N0bTVtMGVkb2ZfZGVsYXlfbXNlY3Nfc3RkYnkgPQotCQkJCSgoKCgxMDAwICogdng2OTUzX2N0cmwtPmZwc19kaXZpZGVyKS8KLQkJCQl2eDY5NTNfY3RybC0+ZnBzKSAqIFE4KSAvIFExMCkgKyAxOwotCQl9Ci0JCWlmICh2eDY5NTNfc2Vuc29yX3NldHRpbmcoVVBEQVRFX1BFUklPRElDLCBydCkgPCAwKQotCQkJcmV0dXJuIHJjOwotCX0KLQl2eDY5NTNfY3RybC0+ZWRvZl9tb2RlID0gVlg2OTUzX0VET0ZfQVBQTElDQVRJT047Ci0JaWYgKHZ4Njk1M19lbmFibGVfZWRvZih2eDY5NTNfY3RybC0+ZWRvZl9tb2RlKSA8IDApCi0JCXJldHVybiByYzsKLQl2eDY5NTNfY3RybC0+Y3Vycl9yZXMgPSB2eDY5NTNfY3RybC0+cGljdF9yZXM7Ci0Jdng2OTUzX2N0cmwtPnNlbnNvcm1vZGUgPSBtb2RlOwotCXJldHVybiByYzsKLX0gLyplbmQgb2Ygdng2OTUzX3Jhd19zbmFwc2hvdF9jb25maWcqLwotc3RhdGljIGludDMyX3Qgdng2OTUzX3NldF9zZW5zb3JfbW9kZShpbnQgbW9kZSwKLQlpbnQgcmVzKQotewotCWludDMyX3QgcmMgPSAwOwotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgU0VOU09SX1BSRVZJRVdfTU9ERToKLQkJcmMgPSB2eDY5NTNfdmlkZW9fY29uZmlnKG1vZGUpOwotCQlicmVhazsKLQljYXNlIFNFTlNPUl9TTkFQU0hPVF9NT0RFOgotCQlyYyA9IHZ4Njk1M19zbmFwc2hvdF9jb25maWcobW9kZSk7Ci0JCWJyZWFrOwotCWNhc2UgU0VOU09SX1JBV19TTkFQU0hPVF9NT0RFOgotCQlyYyA9IHZ4Njk1M19yYXdfc25hcHNob3RfY29uZmlnKG1vZGUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50MzJfdCB2eDY5NTNfcG93ZXJfZG93bih2b2lkKQotewotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgdng2OTUzX3Byb2JlX2luaXRfZG9uZShjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChkYXRhLT5zZW5zb3JfcmVzZXQsIDApOwotCWdwaW9fZnJlZShkYXRhLT5zZW5zb3JfcmVzZXQpOwotCXJldHVybiAwOwotfQotc3RhdGljIGludCB2eDY5NTNfcHJvYmVfaW5pdF9zZW5zb3IoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JdW5zaWduZWQgc2hvcnQgY2hpcGlkbCwgY2hpcGlkaDsKLQlDREJHKCIlczogJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmMgPSBncGlvX3JlcXVlc3QoZGF0YS0+c2Vuc29yX3Jlc2V0LCAidng2OTUzIik7Ci0JQ0RCRygiIHZ4Njk1M19wcm9iZV9pbml0X3NlbnNvciBcbiIpOwotCWlmICghcmMpIHsKLQkJQ0RCRygic2Vuc29yX3Jlc2V0ID0gJWRcbiIsIHJjKTsKLQkJQ0RCRygiIHZ4Njk1M19wcm9iZV9pbml0X3NlbnNvciAxXG4iKTsKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JCW1zbGVlcCgxMCk7Ci0JCUNEQkcoIiB2eDY5NTNfcHJvYmVfaW5pdF9zZW5zb3IgMVxuIik7Ci0JCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGRhdGEtPnNlbnNvcl9yZXNldCwgMSk7Ci0JfSBlbHNlIHsKLQkJQ0RCRygiIHZ4Njk1M19wcm9iZV9pbml0X3NlbnNvciAyXG4iKTsKLQkJZ290byBpbml0X3Byb2JlX2RvbmU7Ci0JfQotCW1zbGVlcCgyMCk7Ci0JQ0RCRygiIHZ4Njk1M19wcm9iZV9pbml0X3NlbnNvciBpcyBjYWxsZWRcbiIpOwotCS8qIDMuIFJlYWQgc2Vuc29yIE1vZGVsIElEOiAqLwotCXJjID0gdng2OTUzX2kyY19yZWFkKDB4MDAwMCwgJmNoaXBpZGgsIDEpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiIHZ4Njk1M19wcm9iZV9pbml0X3NlbnNvciAzXG4iKTsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCXJjID0gdng2OTUzX2kyY19yZWFkKDB4MDAwMSwgJmNoaXBpZGwsIDEpOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiIHZ4Njk1M19wcm9iZV9pbml0X3NlbnNvcjRcbiIpOwotCQlnb3RvIGluaXRfcHJvYmVfZmFpbDsKLQl9Ci0JQ0RCRygidng2OTUzIG1vZGVsX2lkID0gMHgleCAgMHgleFxuIiwgY2hpcGlkaCwgY2hpcGlkbCk7Ci0JLyogNC4gQ29tcGFyZSBzZW5zb3IgSUQgdG8gVlg2OTUzIElEOiAqLwotCWlmIChjaGlwaWRoICE9IDB4MDMgfHwgY2hpcGlkbCAhPSAweEI5KSB7Ci0JCXJjID0gLUVOT0RFVjsKLQkJQ0RCRygidng2OTUzX3Byb2JlX2luaXRfc2Vuc29yIGZhaWwgY2hpcCBpZCBkb2Vzbm90IG1hdGNoXG4iKTsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCWdvdG8gaW5pdF9wcm9iZV9kb25lOwotaW5pdF9wcm9iZV9mYWlsOgotCUNEQkcoIiB2eDY5NTNfcHJvYmVfaW5pdF9zZW5zb3IgZmFpbHNcbiIpOwotCXZ4Njk1M19wcm9iZV9pbml0X2RvbmUoZGF0YSk7Ci1pbml0X3Byb2JlX2RvbmU6Ci0JQ0RCRygiIHZ4Njk1M19wcm9iZV9pbml0X3NlbnNvciBmaW5pc2hlc1xuIik7Ci0JcmV0dXJuIHJjOwotCX0KLS8qIGNhbXNlbnNvcl9pdTA2MGZfdng2OTUzX3Jlc2V0ICovCi1pbnQgdng2OTUzX3NlbnNvcl9vcGVuX2luaXQoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JdW5zaWduZWQgc2hvcnQgcmV2aXNpb25fbnVtYmVyOwotCWludDMyX3QgcmMgPSAwOwotCi0JQ0RCRygiJXM6ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCUNEQkcoIkNhbGxpbmcgdng2OTUzX3NlbnNvcl9vcGVuX2luaXRcbiIpOwotCXZ4Njk1M19jdHJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZ4Njk1M19jdHJsX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZ4Njk1M19jdHJsKSB7Ci0JCUNEQkcoInZ4Njk1M19pbml0IGZhaWxlZCFcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gaW5pdF9kb25lOwotCX0KLQl2eDY5NTNfY3RybC0+ZnBzX2RpdmlkZXIgPSAxICogMHgwMDAwMDQwMDsKLQl2eDY5NTNfY3RybC0+cGljdF9mcHNfZGl2aWRlciA9IDEgKiAweDAwMDAwNDAwOwotCXZ4Njk1M19jdHJsLT5zZXRfdGVzdCA9IFRFU1RfT0ZGOwotCXZ4Njk1M19jdHJsLT5wcmV2X3JlcyA9IFFUUl9TSVpFOwotCXZ4Njk1M19jdHJsLT5waWN0X3JlcyA9IEZVTExfU0laRTsKLQl2eDY5NTNfY3RybC0+Y3Vycl9yZXMgPSBJTlZBTElEX1NJWkU7Ci0Jdng2OTUzX2N0cmwtPnNlbnNvcl90eXBlID0gVlg2OTUzX1NUTTVNMEVET0ZfQ1VUXzI7Ci0Jdng2OTUzX2N0cmwtPmVkb2ZfbW9kZSA9IFZYNjk1M19FRE9GX0VTVElNQVRJT047Ci0JaWYgKGRhdGEpCi0JCXZ4Njk1M19jdHJsLT5zZW5zb3JkYXRhID0gZGF0YTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIkNhbGxpbmcgdng2OTUzX3NlbnNvcl9vcGVuX2luaXQgZmFpbDFcbiIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCUNEQkcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkvKiBlbmFibGUgbWNsayBmaXJzdCAqLwotCW1zbV9jYW1pb19jbGtfcmF0ZV9zZXQoVlg2OTUzX1NUTTVNMEVET0ZfREVGQVVMVF9NQVNURVJfQ0xLX1JBVEUpOwotCUNEQkcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlyYyA9IHZ4Njk1M19wcm9iZV9pbml0X3NlbnNvcihkYXRhKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIkNhbGxpbmcgdng2OTUzX3NlbnNvcl9vcGVuX2luaXQgZmFpbDNcbiIpOwotCQlnb3RvIGluaXRfZmFpbDsKLQl9Ci0JaWYgKHZ4Njk1M19pMmNfcmVhZCgweDAwMDIsICZyZXZpc2lvbl9udW1iZXIsIDEpIDwgMCkKLQkJcmV0dXJuIHJjOwotCQlDREJHKCJzZW5zb3IgcmV2aXNpb24gbnVtYmVyIG1ham9yID0gMHgleFxuIiwgcmV2aXNpb25fbnVtYmVyKTsKLQlpZiAodng2OTUzX2kyY19yZWFkKDB4MDAxOCwgJnJldmlzaW9uX251bWJlciwgMSkgPCAwKQotCQlyZXR1cm4gcmM7Ci0JCUNEQkcoInNlbnNvciByZXZpc2lvbiBudW1iZXIgPSAweCV4XG4iLCByZXZpc2lvbl9udW1iZXIpOwotCWlmIChyZXZpc2lvbl9udW1iZXIgPT0gVlg2OTUzX1JFVklTSU9OX05VTUJFUl9DVVQzKSB7Ci0JCXZ4Njk1M19jdHJsLT5zZW5zb3JfdHlwZSA9IFZYNjk1M19TVE01TTBFRE9GX0NVVF8zOwotCQlDREJHKCJWWDY5NTMgRURvZiBDdXQgMy4wIHNlbnNvclxuICIpOwotCX0gZWxzZSBpZiAocmV2aXNpb25fbnVtYmVyID09IFZYNjk1M19SRVZJU0lPTl9OVU1CRVJfQ1VUMikgewotCQl2eDY5NTNfY3RybC0+c2Vuc29yX3R5cGUgPSBWWDY5NTNfU1RNNU0wRURPRl9DVVRfMjsKLQkJQ0RCRygiVlg2OTUzIEVEb2YgQ3V0IDIuMCBzZW5zb3JcbiAiKTsKLQl9IGVsc2Ugey8qIEN1dDEuMCByZWFkcyAweDAwIGZvciByZWdpc3RlciAweDAwMTgqLwotCQl2eDY5NTNfY3RybC0+c2Vuc29yX3R5cGUgPSBWWDY5NTNfU1RNNU0wRURPRl9DVVRfMTsKLQkJQ0RCRygiVlg2OTUzIEVEb2YgQ3V0IDEuMCBzZW5zb3JcbiAiKTsKLQl9Ci0JaWYgKHZ4Njk1M19jdHJsLT5wcmV2X3JlcyA9PSBRVFJfU0laRSkgewotCQlpZiAodng2OTUzX3NlbnNvcl9zZXR0aW5nKFJFR19JTklULCBSRVNfUFJFVklFVykgPCAwKQotCQkJcmV0dXJuIHJjOwotCX0gZWxzZSB7Ci0JCWlmICh2eDY5NTNfc2Vuc29yX3NldHRpbmcoUkVHX0lOSVQsIFJFU19DQVBUVVJFKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfQotCXZ4Njk1M19jdHJsLT5mcHMgPSAzMCpRODsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGluaXRfZmFpbDsKLQllbHNlCi0JCWdvdG8gaW5pdF9kb25lOwotaW5pdF9mYWlsOgotCUNEQkcoImluaXRfZmFpbFxuIik7Ci0Jdng2OTUzX3Byb2JlX2luaXRfZG9uZShkYXRhKTsKLQlrZnJlZSh2eDY5NTNfY3RybCk7Ci1pbml0X2RvbmU6Ci0JQ0RCRygiaW5pdF9kb25lXG4iKTsKLQlyZXR1cm4gcmM7Ci19IC8qZW5kb2Ygdng2OTUzX3NlbnNvcl9vcGVuX2luaXQqLwotCi1zdGF0aWMgaW50IHZ4Njk1M19pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCS8qIEluaXRpYWxpemUgdGhlIE1TTV9DQU1JMkMgQ2hpcCAqLwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZ4Njk1M193YWl0X3F1ZXVlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHZ4Njk1M19pMmNfaWRbXSA9IHsKLQl7InZ4Njk1MyIsIDB9LAotCXsgfQotfTsKLQotc3RhdGljIGludCB2eDY5NTNfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCWludCByYyA9IDA7Ci0JQ0RCRygidng2OTUzX3Byb2JlIGNhbGxlZCFcbiIpOwotCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKLQkJQ0RCRygiaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkgZmFpbGVkXG4iKTsKLQkJZ290byBwcm9iZV9mYWlsdXJlOwotCX0KLQotCXZ4Njk1M19zZW5zb3J3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZ4Njk1M193b3JrX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZ4Njk1M19zZW5zb3J3KSB7Ci0JCUNEQkcoImt6YWxsb2MgZmFpbGVkLlxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBwcm9iZV9mYWlsdXJlOwotCX0KLQotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHZ4Njk1M19zZW5zb3J3KTsKLQl2eDY5NTNfaW5pdF9jbGllbnQoY2xpZW50KTsKLQl2eDY5NTNfY2xpZW50ID0gY2xpZW50OwotCi0JbXNsZWVwKDUwKTsKLQotCUNEQkcoInZ4Njk1M19wcm9iZSBzdWNjZXNzZWQhIHJjID0gJWRcbiIsIHJjKTsKLQlyZXR1cm4gMDsKLQotcHJvYmVfZmFpbHVyZToKLQlDREJHKCJ2eDY5NTNfcHJvYmUgZmFpbGVkISByYyA9ICVkXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHZ4Njk1M19zZW5kX3diX2luZm8oc3RydWN0IHdiX2luZm9fY2ZnICp3YikKLXsKLQl1bnNpZ25lZCBzaG9ydCByZWFkX2RhdGE7Ci0JdWludDhfdCB0ZW1wWzhdOwotCWludCByYyA9IDA7Ci0JaW50IGkgPSAwOwotCi0JLyogcmVkX2dhaW4gKi8KLQl0ZW1wWzJdID0gd2ItPnJlZF9nYWluID4+IDg7Ci0JdGVtcFszXSA9IHdiLT5yZWRfZ2FpbiAmIDB4RkY7Ci0KLQkvKiBncmVlbl9nYWluICovCi0JdGVtcFswXSA9IHdiLT5ncmVlbl9nYWluID4+IDg7Ci0JdGVtcFsxXSA9IHdiLT5ncmVlbl9nYWluICYgMHhGRjsKLQl0ZW1wWzZdID0gdGVtcFswXTsKLQl0ZW1wWzddID0gdGVtcFsxXTsKLQotCS8qIGJsdWVfZ2FpbiAqLwotCXRlbXBbNF0gPSB3Yi0+Ymx1ZV9nYWluID4+IDg7Ci0JdGVtcFs1XSA9IHdiLT5ibHVlX2dhaW4gJiAweEZGOwotCXJjID0gdng2OTUzX2kyY193cml0ZV9zZXFfc2Vuc29yKDB4MEI4RSwgJnRlbXBbMF0sIDgpOwotCi0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewotCQlyYyA9IHZ4Njk1M19pMmNfcmVhZCgweDBCOEUgKyBpLCAmcmVhZF9kYXRhLCAxKTsKLQkJQ0RCRygiJXMgYWRkciAweCV4IHZhbCAlZCBcbiIsIF9fZnVuY19fLCAweDBCOEUgKyBpLCByZWFkX2RhdGEpOwotCX0KLQlyYyA9IHZ4Njk1M19pMmNfcmVhZCgweDBCODIsICZyZWFkX2RhdGEsIDEpOwotCUNEQkcoIiVzIGFkZHIgMHgleCB2YWwgJWQgXG4iLCBfX2Z1bmNfXywgMHgwQjgyLCByZWFkX2RhdGEpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQlyZXR1cm4gcmM7Ci19IC8qZW5kIG9mIHZ4Njk1M19zbmFwc2hvdF9jb25maWcqLwotCi1zdGF0aWMgaW50IF9fZXhpdCB2eDY5NTNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IHZ4Njk1M193b3JrX3RfdCAqc2Vuc29ydyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBzZW5zb3J3KTsKLQl2eDY5NTNfY2xpZW50ID0gTlVMTDsKLQlrZnJlZShzZW5zb3J3KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHZ4Njk1M19pMmNfZHJpdmVyID0gewotCS5pZF90YWJsZSA9IHZ4Njk1M19pMmNfaWQsCi0JLnByb2JlICA9IHZ4Njk1M19pMmNfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZXhpdF9wKHZ4Njk1M19pMmNfcmVtb3ZlKSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJ2eDY5NTMiLAotCX0sCi19OwotCi1pbnQgdng2OTUzX3NlbnNvcl9jb25maWcodm9pZCBfX3VzZXIgKmFyZ3ApCi17Ci0Jc3RydWN0IHNlbnNvcl9jZmdfZGF0YSBjZGF0YTsKLQlsb25nICAgcmMgPSAwOwotCWlmIChjb3B5X2Zyb21fdXNlcigmY2RhdGEsCi0JCSh2b2lkICopYXJncCwKLQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JbXV0ZXhfbG9jaygmdng2OTUzX211dCk7Ci0JQ0RCRygidng2OTUzX3NlbnNvcl9jb25maWc6IGNmZ3R5cGUgPSAlZFxuIiwKLQljZGF0YS5jZmd0eXBlKTsKLQkJc3dpdGNoIChjZGF0YS5jZmd0eXBlKSB7Ci0JCWNhc2UgQ0ZHX0dFVF9QSUNUX0ZQUzoKLQkJCXZ4Njk1M19nZXRfcGljdF9mcHMoCi0JCQkJY2RhdGEuY2ZnLmdmcHMucHJldmZwcywKLQkJCQkmKGNkYXRhLmNmZy5nZnBzLnBpY3RmcHMpKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfR0VUX1BSRVZfTF9QRjoKLQkJCWNkYXRhLmNmZy5wcmV2bF9wZiA9Ci0JCQl2eDY5NTNfZ2V0X3ByZXZfbGluZXNfcGYoKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfR0VUX1BSRVZfUF9QTDoKLQkJCWNkYXRhLmNmZy5wcmV2cF9wbCA9Ci0JCQkJdng2OTUzX2dldF9wcmV2X3BpeGVsc19wbCgpOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19HRVRfUElDVF9MX1BGOgotCQkJY2RhdGEuY2ZnLnBpY3RsX3BmID0KLQkJCQl2eDY5NTNfZ2V0X3BpY3RfbGluZXNfcGYoKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfR0VUX1BJQ1RfUF9QTDoKLQkJCWNkYXRhLmNmZy5waWN0cF9wbCA9Ci0JCQkJdng2OTUzX2dldF9waWN0X3BpeGVsc19wbCgpOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19HRVRfUElDVF9NQVhfRVhQX0xDOgotCQkJY2RhdGEuY2ZnLnBpY3RfbWF4X2V4cF9sYyA9Ci0JCQkJdng2OTUzX2dldF9waWN0X21heF9leHBfbGMoKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfU0VUX0ZQUzoKLQkJY2FzZSBDRkdfU0VUX1BJQ1RfRlBTOgotCQkJcmMgPSB2eDY5NTNfc2V0X2ZwcygmKGNkYXRhLmNmZy5mcHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0ZHX1NFVF9FWFBfR0FJTjoKLQkJCXJjID0KLQkJCQl2eDY5NTNfd3JpdGVfZXhwX2dhaW4oCi0JCQkJCWNkYXRhLmNmZy5leHBfZ2Fpbi5nYWluLAotCQkJCQljZGF0YS5jZmcuZXhwX2dhaW4ubGluZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19TRVRfUElDVF9FWFBfR0FJTjoKLQkJCXJjID0KLQkJCQl2eDY5NTNfc2V0X3BpY3RfZXhwX2dhaW4oCi0JCQkJY2RhdGEuY2ZnLmV4cF9nYWluLmdhaW4sCi0JCQkJY2RhdGEuY2ZnLmV4cF9nYWluLmxpbmUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfU0VUX01PREU6Ci0JCQlyYyA9IHZ4Njk1M19zZXRfc2Vuc29yX21vZGUoY2RhdGEubW9kZSwKLQkJCQkJY2RhdGEucnMpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfUFdSX0RPV046Ci0JCQlyYyA9IHZ4Njk1M19wb3dlcl9kb3duKCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19NT1ZFX0ZPQ1VTOgotCQkJcmMgPQotCQkJCXZ4Njk1M19tb3ZlX2ZvY3VzKAotCQkJCWNkYXRhLmNmZy5mb2N1cy5kaXIsCi0JCQkJY2RhdGEuY2ZnLmZvY3VzLnN0ZXBzKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0ZHX1NFVF9ERUZBVUxUX0ZPQ1VTOgotCQkJcmMgPQotCQkJCXZ4Njk1M19zZXRfZGVmYXVsdF9mb2N1cygKLQkJCQljZGF0YS5jZmcuZm9jdXMuc3RlcHMpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfU0VUX0VGRkVDVDoKLQkJCXJjID0gdng2OTUzX3NldF9kZWZhdWx0X2ZvY3VzKAotCQkJCWNkYXRhLmNmZy5lZmZlY3QpOwotCQkJYnJlYWs7Ci0KLQotCQljYXNlIENGR19TRU5EX1dCX0lORk86Ci0JCQlyYyA9IHZ4Njk1M19zZW5kX3diX2luZm8oCi0JCQkJJihjZGF0YS5jZmcud2JfaW5mbykpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQltdXRleF91bmxvY2soJnZ4Njk1M19tdXQpOwotCi0JcmV0dXJuIHJjOwotfQotCi0KLQotCi1zdGF0aWMgaW50IHZ4Njk1M19zZW5zb3JfcmVsZWFzZSh2b2lkKQotewotCWludCByYyA9IC1FQkFERjsKLQltdXRleF9sb2NrKCZ2eDY5NTNfbXV0KTsKLQl2eDY5NTNfcG93ZXJfZG93bigpOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dCh2eDY5NTNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3Jlc2V0LCAwKTsKLQlncGlvX2ZyZWUodng2OTUzX2N0cmwtPnNlbnNvcmRhdGEtPnNlbnNvcl9yZXNldCk7Ci0Ja2ZyZWUodng2OTUzX2N0cmwpOwotCXZ4Njk1M19jdHJsID0gTlVMTDsKLQlDREJHKCJ2eDY5NTNfcmVsZWFzZSBjb21wbGV0ZWRcbiIpOwotCW11dGV4X3VubG9jaygmdng2OTUzX211dCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgdng2OTUzX3NlbnNvcl9wcm9iZShjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqaW5mbywKLQkJc3RydWN0IG1zbV9zZW5zb3JfY3RybCAqcykKLXsKLQlpbnQgcmMgPSAwOwotCXJjID0gaTJjX2FkZF9kcml2ZXIoJnZ4Njk1M19pMmNfZHJpdmVyKTsKLQlpZiAocmMgPCAwIHx8IHZ4Njk1M19jbGllbnQgPT0gTlVMTCkgewotCQlyYyA9IC1FTk9UU1VQUDsKLQkJZ290byBwcm9iZV9mYWlsOwotCX0KLQltc21fY2FtaW9fY2xrX3JhdGVfc2V0KDI0MDAwMDAwKTsKLQlyYyA9IHZ4Njk1M19wcm9iZV9pbml0X3NlbnNvcihpbmZvKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIHByb2JlX2ZhaWw7Ci0Jcy0+c19pbml0ID0gdng2OTUzX3NlbnNvcl9vcGVuX2luaXQ7Ci0Jcy0+c19yZWxlYXNlID0gdng2OTUzX3NlbnNvcl9yZWxlYXNlOwotCXMtPnNfY29uZmlnICA9IHZ4Njk1M19zZW5zb3JfY29uZmlnOwotCXMtPnNfbW91bnRfYW5nbGUgID0gaW5mby0+c2Vuc29yX3BsYXRmb3JtX2luZm8tPm1vdW50X2FuZ2xlOwotCXZ4Njk1M19wcm9iZV9pbml0X2RvbmUoaW5mbyk7Ci0JcmV0dXJuIHJjOwotCi1wcm9iZV9mYWlsOgotCUNEQkcoInZ4Njk1M19zZW5zb3JfcHJvYmU6IFNFTlNPUiBQUk9CRSBGQUlMUyFcbiIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX3Z4Njk1M19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBtc21fY2FtZXJhX2Rydl9zdGFydChwZGV2LCB2eDY5NTNfc2Vuc29yX3Byb2JlKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2NhbWVyYV9kcml2ZXIgPSB7Ci0JLnByb2JlID0gX192eDY5NTNfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtX2NhbWVyYV92eDY5NTMiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgdng2OTUzX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fY2FtZXJhX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHZ4Njk1M19pbml0KTsKLXZvaWQgdng2OTUzX2V4aXQodm9pZCkKLXsKLQlpMmNfZGVsX2RyaXZlcigmdng2OTUzX2kyY19kcml2ZXIpOwotfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92eDY5NTMuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92eDY5NTMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1ZmFjYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdng2OTUzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIFZYNjk1M19ICi0jZGVmaW5lIFZYNjk1M19ICi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+Ci1leHRlcm4gc3RydWN0IHZ4Njk1M19yZWcgdng2OTUzX3JlZ3M7Ci1zdHJ1Y3QgcmVnX3N0cnVjdF9pbml0IHsKLQl1aW50OF90IHJlZ18weDAxMTI7ICAgICAgLyogMHgwMTEyKi8KLQl1aW50OF90IHJlZ18weDAxMTM7ICAgICAgLyogMHgwMTEzKi8KLQl1aW50OF90IHZ0X3BpeF9jbGtfZGl2OyAgLyogMHgwMzAxKi8KLQl1aW50OF90IHByZV9wbGxfY2xrX2RpdjsgLyogMHgwMzA1Ki8KLQl1aW50OF90IHBsbF9tdWx0aXBsaWVyOyAgLyogMHgwMzA3Ki8KLQl1aW50OF90IG9wX3BpeF9jbGtfZGl2OyAgLyogMHgwMzA5Ki8KLQl1aW50OF90IHJlZ18weDMwMzA7ICAgICAgLyoweDMwMzAqLwotCXVpbnQ4X3QgcmVnXzB4MDExMTsgICAgICAvKjB4MDExMSovCi0JdWludDhfdCByZWdfMHgwYjAwOyAgICAgIC8qMHgwYjAwKi8KLQl1aW50OF90IHJlZ18weDMwMDE7ICAgICAgLyoweDMwMDEqLwotCXVpbnQ4X3QgcmVnXzB4MzAwNDsgICAgICAvKjB4MzAwNCovCi0JdWludDhfdCByZWdfMHgzMDA3OyAgICAgIC8qMHgzMDA3Ki8KLQl1aW50OF90IHJlZ18weDMwMTY7ICAgICAgLyoweDMwMTYqLwotCXVpbnQ4X3QgcmVnXzB4MzAxZDsgICAgICAvKjB4MzAxZCovCi0JdWludDhfdCByZWdfMHgzMTdlOyAgICAgIC8qMHgzMTdFKi8KLQl1aW50OF90IHJlZ18weDMxN2Y7ICAgICAgLyoweDMxN0YqLwotCXVpbnQ4X3QgcmVnXzB4MzQwMDsgICAgICAvKjB4MzQwMCovCi0JdWludDhfdCByZWdfMHgwYjA2OyAgICAgIC8qMHgwYjA2Ki8KLQl1aW50OF90IHJlZ18weDBiMDc7ICAgICAgLyoweDBiMDcqLwotCXVpbnQ4X3QgcmVnXzB4MGIwODsgICAgICAvKjB4MGIwOCovCi0JdWludDhfdCByZWdfMHgwYjA5OyAgICAgIC8qMHgwYjA5Ki8KLQl1aW50OF90IHJlZ18weDAxMzY7Ci0JdWludDhfdCByZWdfMHgwMTM3OwotCS8qIEVkb2YgKi8KLQl1aW50OF90IHJlZ18weDBiODM7ICAgICAgLyoweDBiODMqLwotCXVpbnQ4X3QgcmVnXzB4MGI4NDsgICAgICAvKjB4MGI4NCovCi0JdWludDhfdCByZWdfMHgwYjg1OyAgICAgIC8qMHgwYjg1Ki8KLQl1aW50OF90IHJlZ18weDBiODg7ICAgICAgLyoweDBiODgqLwotCXVpbnQ4X3QgcmVnXzB4MGI4OTsgICAgICAvKjB4MGI4OSovCi0JdWludDhfdCByZWdfMHgwYjhhOyAgICAgIC8qMHgwYjhhKi8KLQl9Owotc3RydWN0IHJlZ19zdHJ1Y3QgewotCXVpbnQ4X3QgY29hcnNlX2ludGVncmF0aW9uX3RpbWVfaGk7IC8qUkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0hJKi8KLQl1aW50OF90IGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX2xvOyAvKlJFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9MTyovCi0JdWludDhfdCBhbmFsb2d1ZV9nYWluX2NvZGVfZ2xvYmFsOwotCXVpbnQ4X3QgZnJhbWVfbGVuZ3RoX2xpbmVzX2hpOyAvKiAweDAzNDAqLwotCXVpbnQ4X3QgZnJhbWVfbGVuZ3RoX2xpbmVzX2xvOyAvKiAweDAzNDEqLwotCXVpbnQ4X3QgbGluZV9sZW5ndGhfcGNrX2hpOyAgICAvKiAweDAzNDIqLwotCXVpbnQ4X3QgbGluZV9sZW5ndGhfcGNrX2xvOyAgICAvKiAweDAzNDMqLwotCXVpbnQ4X3QgcmVnXzB4MzAwNTsgICAvKiAweDMwMDUqLwotCXVpbnQ4X3QgcmVnXzB4MzAxMDsgIC8qIDB4MzAxMCovCi0JdWludDhfdCByZWdfMHgzMDExOyAgLyogMHgzMDExKi8KLQl1aW50OF90IHJlZ18weDMwMWE7ICAvKiAweDMwMWEqLwotCXVpbnQ4X3QgcmVnXzB4MzAzNTsgIC8qIDB4MzAzNSovCi0JdWludDhfdCByZWdfMHgzMDM2OyAgIC8qIDB4MzAzNiovCi0JdWludDhfdCByZWdfMHgzMDQxOyAgLyoweDMwNDEqLwotCXVpbnQ4X3QgcmVnXzB4MzA0MjsgIC8qMHgzMDQyKi8KLQl1aW50OF90IHJlZ18weDMwNDU7ICAvKjB4MzA0NSovCi0JdWludDhfdCByZWdfMHgwYjgwOyAgIC8qIDB4MGI4MCovCi0JdWludDhfdCByZWdfMHgwOTAwOyAgIC8qMHgwOTAwKi8KLQl1aW50OF90IHJlZ18weDA5MDE7ICAgLyogMHgwOTAxKi8KLQl1aW50OF90IHJlZ18weDA5MDI7ICAgLyoweDA5MDIqLwotCXVpbnQ4X3QgcmVnXzB4MDM4MzsgICAvKjB4MDM4MyovCi0JdWludDhfdCByZWdfMHgwMzg3OyAgIC8qIDB4MDM4NyovCi0JdWludDhfdCByZWdfMHgwMzRjOyAgIC8qIDB4MDM0YyovCi0JdWludDhfdCByZWdfMHgwMzRkOyAgIC8qMHgwMzRkKi8KLQl1aW50OF90IHJlZ18weDAzNGU7ICAgLyogMHgwMzRlKi8KLQl1aW50OF90IHJlZ18weDAzNGY7ICAgLyogMHgwMzRmKi8KLQl1aW50OF90IHJlZ18weDE3MTY7IC8qMHgxNzE2Ki8KLQl1aW50OF90IHJlZ18weDE3MTc7IC8qMHgxNzE3Ki8KLQl1aW50OF90IHJlZ18weDE3MTg7IC8qMHgxNzE4Ki8KLQl1aW50OF90IHJlZ18weDE3MTk7IC8qMHgxNzE5Ki8KLQl1aW50OF90IHJlZ18weDMyMTA7LyoweDMyMTAqLwotCXVpbnQ4X3QgcmVnXzB4MTExOyAvKjB4MTExKi8KLQl1aW50OF90IHJlZ18weDM0MTA7ICAvKjB4MzQxMCovCi0JdWludDhfdCByZWdfMHgzMDk4OwotCXVpbnQ4X3QgcmVnXzB4MzA5RDsKLQl1aW50OF90IHJlZ18weDAyMDA7Ci0JdWludDhfdCByZWdfMHgwMjAxOwotCX07Ci1zdHJ1Y3Qgdng2OTUzX2kyY19yZWdfY29uZiB7Ci0JdW5zaWduZWQgc2hvcnQgd2FkZHI7Ci0JdW5zaWduZWQgc2hvcnQgd2RhdGE7Ci19OwotCi1lbnVtIHZ4Njk1M190ZXN0X21vZGVfdCB7Ci0JVEVTVF9PRkYsCi0JVEVTVF8xLAotCVRFU1RfMiwKLQlURVNUXzMKLX07Ci0KLWVudW0gdng2OTUzX3Jlc29sdXRpb25fdCB7Ci0JUVRSX1NJWkUsCi0JRlVMTF9TSVpFLAotCUlOVkFMSURfU0laRQotfTsKLWVudW0gdng2OTUzX3NldHRpbmcgewotCVJFU19QUkVWSUVXLAotCVJFU19DQVBUVVJFCi19OwotZW51bSBtdDlwMDEyX3JlZ191cGRhdGUgewotCS8qIFNlbnNvciBlZ2lzdGVycyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKi8KLQlSRUdfSU5JVCwKLQkvKiBTZW5zb3IgZWdpc3RlcnMgdGhhdCBuZWVkcyBwZXJpb2RpYyBJMkMgd3JpdGVzICovCi0JVVBEQVRFX1BFUklPRElDLAotCS8qIEFsbCB0aGUgc2Vuc29yIFJlZ2lzdGVycyB3aWxsIGJlIHVwZGF0ZWQgKi8KLQlVUERBVEVfQUxMLAotCS8qIE5vdCB2YWxpZCB1cGRhdGUgKi8KLQlVUERBVEVfSU5WQUxJRAotfTsKLQotZW51bSBzZW5zb3JfcmV2aXNpb25fdCB7Ci0JVlg2OTUzX1NUTTVNMEVET0ZfQ1VUXzEsCi0JVlg2OTUzX1NUTTVNMEVET0ZfQ1VUXzIsCi0JVlg2OTUzX1NUTTVNMEVET0ZfQ1VUXzMKLX07Ci1lbnVtIGVkb2ZfbW9kZV90IHsKLQlWWDY5NTNfRURPRl9ESVNBQkxFLCAgICAgICAvKiAweDAwICovCi0JVlg2OTUzX0VET0ZfQVBQTElDQVRJT04sICAgLyogMHgwMSAqLwotCVZYNjk1M19FRE9GX0VTVElNQVRJT04gICAgIC8qIDB4MDIgKi8KLX07Ci1zdHJ1Y3Qgdng2OTUzX3JlZyB7Ci0JY29uc3Qgc3RydWN0IHJlZ19zdHJ1Y3RfaW5pdCAgKnJlZ19wYXRfaW5pdDsKLQljb25zdCBzdHJ1Y3QgcmVnX3N0cnVjdCAgKnJlZ19wYXQ7Ci19OwotI2VuZGlmIC8qIFZYNjk1M19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdng2OTUzX3JlZy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3Z4Njk1M19yZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlNjkwNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdng2OTUzX3JlZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotCi0jaW5jbHVkZSAidng2OTUzLmgiCi1jb25zdCBzdHJ1Y3QgcmVnX3N0cnVjdF9pbml0IHZ4Njk1M19yZWdfaW5pdFsxXSA9IHsKLQl7Ci0JCTEwLAkJCS8qUkVHID0gMHgwMTEyICwgMTAgYml0ICovCi0JCTEwLAkJCS8qUkVHID0gMHgwMTEzKi8KLQkJOSwJCQkvKlJFRyA9IDB4MDMwMSB2dF9waXhfY2xrX2RpdiovCi0JCTQsCQkvKlJFRyA9IDB4MDMwNSBwcmVfcGxsX2Nsa19kaXYqLwotCQkxMzMsCQkvKlJFRyA9IDB4MDMwNyBwbGxfbXVsdGlwbGllciovCi0JCTEwLAkJLypSRUcgPSAweDAzMDkgb3BfcGl4X2Nsa19kaXYqLwotCQkweDA4LAkJLypSRUcgPSAweDMwMzAqLwotCQkweDAyLAkJLypSRUcgPSAweDAxMTEqLwotCQkweDAxLAkJLypSRUcgPSAweDBiMDAgLGxlbnMgc2hhZGluZyBvZmYgKi8KLQkJMHgzMCwJCS8qUkVHID0gMHgzMDAxKi8KLQkJMHgzMywJCS8qUkVHID0gMHgzMDA0Ki8KLQkJMHgwOSwJCS8qUkVHID0gMHgzMDA3Ki8KLQkJMHgxRiwJCS8qUkVHID0gMHgzMDE2Ki8KLQkJMHgwMywJCS8qUkVHID0gMHgzMDFkKi8KLQkJMHgxMSwJCS8qUkVHID0gMHgzMTdFKi8KLQkJMHgwOSwJCS8qUkVHID0gMHgzMTdGKi8KLQkJMHgzOCwJCS8qUkVHID0gMHgzNDAwKi8KLQkJMHgwMCwJCS8qUkVHXzB4MGIwNiovCi0JCTB4ODAsCQkvKlJFR18weDBiMDcqLwotCQkweDAxLAkJLypSRUdfMHgwYjA4Ki8KLQkJMHg0RiwJCS8qUkVHXzB4MGIwOSovCi0JCTB4MTgsCQkvKlJFR18weDAxMzYqLwotCQkweDAwLAkJLyovUkVHXzB4MDEzNyovCi0JCTB4MjAsCQkvKlJFRyA9IDB4MGI4MyovCi0JCTB4OTAsCQkvKlJFRyA9IDB4MGI4NCovCi0JCTB4MjAsCQkvKlJFRyA9IDB4MGI4NSovCi0JCTB4ODAsCQkvKlJFRyA9IDB4MGI4OCovCi0JCTB4MDAsCQkvKlJFRyA9IDB4MGI4OSovCi0JCTB4MDAsCQkvKlJFRyA9IDB4MGI4YSovCi0JfQotfTsKLWNvbnN0IHN0cnVjdCByZWdfc3RydWN0IHZ4Njk1M19yZWdfcGF0WzJdID0gewotCXsvKiBQcmV2aWV3ICovCi0JCTB4MDMsCS8qUkVHID0gMHgwMjAyIGNvYXJzZSBpbnRlZ3JhdGlvbl90aW1lX2hpKi8KLQkJMHhkMCwJLypSRUcgPSAweDAyMDMgY29hcnNlX2ludGVncmF0aW9uX3RpbWVfbG8qLwotCQkweGMwLAkvKlJFRyA9IDB4MDIwNSBhbmFsb2d1ZV9nYWluX2NvZGVfZ2xvYmFsKi8KLQkJMHgwMywJLypSRUcgPSAweDAzNDAgZnJhbWVfbGVuZ3RoX2xpbmVzX2hpKi8KLQkJMHhmMCwJLypSRUcgPSAweDAzNDEgZnJhbWVfbGVuZ3RoX2xpbmVzX2xvKi8KLQkJMHgwYiwJLypSRUcgPSAweDAzNDIgIGxpbmVfbGVuZ3RoX3Bja19oaSovCi0JCTB4NzQsCS8qUkVHID0gMHgwMzQzICBsaW5lX2xlbmd0aF9wY2tfbG8qLwotCQkweDAzLAkvKlJFRyA9IDB4MzAwNSovCi0JCTB4MDAsCS8qUkVHID0gMHgzMDEwKi8KLQkJMHgwMSwJLypSRUcgPSAweDMwMTEqLwotCQkweDZhLAkvKlJFRyA9IDB4MzAxYSovCi0JCTB4MDMsCS8qUkVHID0gMHgzMDM1Ki8KLQkJMHgyYywJLypSRUcgPSAweDMwMzYqLwotCQkweDAwLAkvKlJFRyA9IDB4MzA0MSovCi0JCTB4MjQsCS8qUkVHID0gMHgzMDQyKi8KLQkJMHg4MSwJLypSRUcgPSAweDMwNDUqLwotCQkweDAyLAkvKlJFRyA9IDB4MGI4MCBlZG9mIGVzdGltYXRlKi8KLQkJMHgwMSwJLypSRUcgPSAweDA5MDAqLwotCQkweDIyLAkvKlJFRyA9IDB4MDkwMSovCi0JCTB4MDQsCS8qUkVHID0gMHgwOTAyKi8KLQkJMHgwMywJLypSRUcgPSAweDAzODMqLwotCQkweDAzLAkvKlJFRyA9IDB4MDM4NyovCi0JCTB4MDUsCS8qUkVHID0gMHgwMzRjKi8KLQkJMHgxOCwJLypSRUcgPSAweDAzNGQqLwotCQkweDAzLAkvKlJFRyA9IDB4MDM0ZSovCi0JCTB4ZDQsCS8qUkVHID0gMHgwMzRmKi8KLQkJMHgwMiwJLyoweDE3MTYqLwotCQkweDA0LAkvKjB4MTcxNyovCi0JCTB4MDgsCS8qMHgxNzE4Ki8KLQkJMHgyYywJLyoweDE3MTkqLwotCQkweDAxLCAgIC8qMHgzMjEwKi8KLQkJMHgwMiwgICAvKjB4MTExKi8KLQkJMHgwMSwgICAvKjB4MzQxMCovCi0JCTB4MDEsICAgLyoweDMwOTgqLwotCQkweDA1LCAgIC8qMHgzMDlEKi8KLQkJMHgwMiwKLQkJMHgwNCwKLQl9LAotCXsgLyogU25hcHNob3QgKi8KLQkJMHgwNywvKlJFRyA9IDB4MDIwMiBjb2Fyc2VfaW50ZWdyYXRpb25fdGltZV9oaSovCi0JCTB4MDAsLypSRUcgPSAweDAyMDMgY29hcnNlX2ludGVncmF0aW9uX3RpbWVfbG8qLwotCQkweGMwLC8qUkVHID0gMHgwMjA1IGFuYWxvZ3VlX2dhaW5fY29kZV9nbG9iYWwqLwotCQkweDA3LC8qUkVHID0gMHgwMzQwIGZyYW1lX2xlbmd0aF9saW5lc19oaSovCi0JCTB4ZDAsLypSRUcgPSAweDAzNDEgZnJhbWVfbGVuZ3RoX2xpbmVzX2xvKi8KLQkJMHgwYiwvKlJFRyA9IDB4MDM0MiBsaW5lX2xlbmd0aF9wY2tfaGkqLwotCQkweDhjLC8qUkVHID0gMHgwMzQzIGxpbmVfbGVuZ3RoX3Bja19sbyovCi0JCTB4MDEsLypSRUcgPSAweDMwMDUqLwotCQkweDAwLC8qUkVHID0gMHgzMDEwKi8KLQkJMHgwMCwvKlJFRyA9IDB4MzAxMSovCi0JCTB4NTUsLypSRUcgPSAweDMwMWEqLwotCQkweDAxLC8qUkVHID0gMHgzMDM1Ki8KLQkJMHgyMywvKlJFRyA9IDB4MzAzNiovCi0JCTB4MDAsLypSRUcgPSAweDMwNDEqLwotCQkweDI0LC8qUkVHID0gMHgzMDQyKi8KLQkJMHhiNywvKlJFRyA9IDB4MzA0NSovCi0JCTB4MDEsLypSRUcgPSAweDBiODAgZWRvZiBhcHBsaWNhdGlvbiovCi0JCTB4MDAsLypSRUcgPSAweDA5MDAqLwotCQkweDAwLC8qUkVHID0gMHgwOTAxKi8KLQkJMHgwMCwvKlJFRyA9IDB4MDkwMiovCi0JCTB4MDEsLypSRUcgPSAweDAzODMqLwotCQkweDAxLC8qUkVHID0gMHgwMzg3Ki8KLQkJMHgwQSwvKlJFRyA9IDB4MDM0YyovCi0JCTB4MzAsLypSRUcgPSAweDAzNGQqLwotCQkweDA3LC8qUkVHID0gMHgwMzRlKi8KLQkJMHhBOCwvKlJFRyA9IDB4MDM0ZiovCi0JCTB4MDIsLyoweDE3MTYqLwotCQkweDBkLC8qMHgxNzE3Ki8KLQkJMHgwNywvKjB4MTcxOCovCi0JCTB4N2QsLyoweDE3MTkqLwotCQkweDAxLC8qMHgzMjEwKi8KLQkJMHgwMiwvKjB4MTExKi8KLQkJMHgwMSwvKjB4MzQxMCovCi0JCTB4MDEsLyoweDMwOTgqLwotCQkweDA1LCAvKjB4MzA5RCovCi0JCTB4MDIsCi0JCTB4MDAsCi0JfQotfTsKLQotCi0KLXN0cnVjdCB2eDY5NTNfcmVnIHZ4Njk1M19yZWdzID0gewotCS5yZWdfcGF0X2luaXQgPSAmdng2OTUzX3JlZ19pbml0WzBdLAotCS5yZWdfcGF0ID0gJnZ4Njk1M19yZWdfcGF0WzBdLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92eDY5NTNfcmVnX3Y0bDIuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92eDY5NTNfcmVnX3Y0bDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxYzFiZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdng2OTUzX3JlZ192NGwyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0KLSNpbmNsdWRlICJ2eDY5NTNfdjRsMi5oIgotY29uc3Qgc3RydWN0IHJlZ19zdHJ1Y3RfaW5pdCB2eDY5NTNfcmVnX2luaXRbMV0gPSB7Ci0JewotCQkxMCwJCQkvKlJFRyA9IDB4MDExMiAsIDEwIGJpdCAqLwotCQkxMCwJCQkvKlJFRyA9IDB4MDExMyovCi0JCTksCQkJLypSRUcgPSAweDAzMDEgdnRfcGl4X2Nsa19kaXYqLwotCQk0LAkJLypSRUcgPSAweDAzMDUgcHJlX3BsbF9jbGtfZGl2Ki8KLQkJMTMzLAkJLypSRUcgPSAweDAzMDcgcGxsX211bHRpcGxpZXIqLwotCQkxMCwJCS8qUkVHID0gMHgwMzA5IG9wX3BpeF9jbGtfZGl2Ki8KLQkJMHgwOCwJCS8qUkVHID0gMHgzMDMwKi8KLQkJMHgwMiwJCS8qUkVHID0gMHgwMTExKi8KLQkJMHgwMSwJCS8qUkVHID0gMHgwYjAwICxsZW5zIHNoYWRpbmcgb2ZmICovCi0JCTB4MzAsCQkvKlJFRyA9IDB4MzAwMSovCi0JCTB4MzMsCQkvKlJFRyA9IDB4MzAwNCovCi0JCTB4MDksCQkvKlJFRyA9IDB4MzAwNyovCi0JCTB4MUYsCQkvKlJFRyA9IDB4MzAxNiovCi0JCTB4MDMsCQkvKlJFRyA9IDB4MzAxZCovCi0JCTB4MTEsCQkvKlJFRyA9IDB4MzE3RSovCi0JCTB4MDksCQkvKlJFRyA9IDB4MzE3RiovCi0JCTB4MzgsCQkvKlJFRyA9IDB4MzQwMCovCi0JCTB4MDAsCQkvKlJFR18weDBiMDYqLwotCQkweDgwLAkJLypSRUdfMHgwYjA3Ki8KLQkJMHgwMSwJCS8qUkVHXzB4MGIwOCovCi0JCTB4NEYsCQkvKlJFR18weDBiMDkqLwotCQkweDE4LAkJLypSRUdfMHgwMTM2Ki8KLQkJMHgwMCwJCS8qL1JFR18weDAxMzcqLwotCQkweDIwLAkJLypSRUcgPSAweDBiODMqLwotCQkweDkwLAkJLypSRUcgPSAweDBiODQqLwotCQkweDIwLAkJLypSRUcgPSAweDBiODUqLwotCQkweDgwLAkJLypSRUcgPSAweDBiODgqLwotCQkweDAwLAkJLypSRUcgPSAweDBiODkqLwotCQkweDAwLAkJLypSRUcgPSAweDBiOGEqLwotCX0KLX07Ci1jb25zdCBzdHJ1Y3QgcmVnX3N0cnVjdCB2eDY5NTNfcmVnX3BhdFsyXSA9IHsKLQl7LyogUHJldmlldyAqLwotCQkweDAzLAkvKlJFRyA9IDB4MDIwMiBjb2Fyc2UgaW50ZWdyYXRpb25fdGltZV9oaSovCi0JCTB4ZDAsCS8qUkVHID0gMHgwMjAzIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX2xvKi8KLQkJMHhjMCwJLypSRUcgPSAweDAyMDUgYW5hbG9ndWVfZ2Fpbl9jb2RlX2dsb2JhbCovCi0JCTB4MDMsCS8qUkVHID0gMHgwMzQwIGZyYW1lX2xlbmd0aF9saW5lc19oaSovCi0JCTB4ZjAsCS8qUkVHID0gMHgwMzQxIGZyYW1lX2xlbmd0aF9saW5lc19sbyovCi0JCTB4MGIsCS8qUkVHID0gMHgwMzQyICBsaW5lX2xlbmd0aF9wY2tfaGkqLwotCQkweGE1LAkvKlJFRyA9IDB4MDM0MyAgbGluZV9sZW5ndGhfcGNrX2xvKi8KLQkJMHgwMywJLypSRUcgPSAweDMwMDUqLwotCQkweDAwLAkvKlJFRyA9IDB4MzAxMCovCi0JCTB4MDEsCS8qUkVHID0gMHgzMDExKi8KLQkJMHg2YSwJLypSRUcgPSAweDMwMWEqLwotCQkweDAzLAkvKlJFRyA9IDB4MzAzNSovCi0JCTB4MmMsCS8qUkVHID0gMHgzMDM2Ki8KLQkJMHgwMCwJLypSRUcgPSAweDMwNDEqLwotCQkweDI0LAkvKlJFRyA9IDB4MzA0MiovCi0JCTB4ODEsCS8qUkVHID0gMHgzMDQ1Ki8KLQkJMHgwMiwJLypSRUcgPSAweDBiODAgZWRvZiBlc3RpbWF0ZSovCi0JCTB4MDEsCS8qUkVHID0gMHgwOTAwKi8KLQkJMHgyMiwJLypSRUcgPSAweDA5MDEqLwotCQkweDA0LAkvKlJFRyA9IDB4MDkwMiovCi0JCTB4MDMsCS8qUkVHID0gMHgwMzgzKi8KLQkJMHgwMywJLypSRUcgPSAweDAzODcqLwotCQkweDA1LAkvKlJFRyA9IDB4MDM0YyovCi0JCTB4MTgsCS8qUkVHID0gMHgwMzRkKi8KLQkJMHgwMywJLypSRUcgPSAweDAzNGUqLwotCQkweGQ0LAkvKlJFRyA9IDB4MDM0ZiovCi0JCTB4MDIsCS8qMHgxNzE2Ki8KLQkJMHgwNCwJLyoweDE3MTcqLwotCQkweDA4LAkvKjB4MTcxOCovCi0JCTB4ODAsCS8qMHgxNzE5Ki8KLQkJMHgwMSwgICAvKjB4MzIxMCovCi0JCTB4MDIsICAgLyoweDExMSovCi0JCTB4MDEsICAgLyoweDM0MTAqLwotCQkweDAxLCAgIC8qMHgzMDk4Ki8KLQkJMHgwNSwgICAvKjB4MzA5RCovCi0JCTB4MDIsCi0JCTB4MDQsCi0JfSwKLQl7IC8qIFNuYXBzaG90ICovCi0JCTB4MDcsLypSRUcgPSAweDAyMDIgY29hcnNlX2ludGVncmF0aW9uX3RpbWVfaGkqLwotCQkweDAwLC8qUkVHID0gMHgwMjAzIGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX2xvKi8KLQkJMHhjMCwvKlJFRyA9IDB4MDIwNSBhbmFsb2d1ZV9nYWluX2NvZGVfZ2xvYmFsKi8KLQkJMHgwNywvKlJFRyA9IDB4MDM0MCBmcmFtZV9sZW5ndGhfbGluZXNfaGkqLwotCQkweGQwLC8qUkVHID0gMHgwMzQxIGZyYW1lX2xlbmd0aF9saW5lc19sbyovCi0JCTB4MGIsLypSRUcgPSAweDAzNDIgbGluZV9sZW5ndGhfcGNrX2hpKi8KLQkJMHg4YywvKlJFRyA9IDB4MDM0MyBsaW5lX2xlbmd0aF9wY2tfbG8qLwotCQkweDAxLC8qUkVHID0gMHgzMDA1Ki8KLQkJMHgwMCwvKlJFRyA9IDB4MzAxMCovCi0JCTB4MDAsLypSRUcgPSAweDMwMTEqLwotCQkweDU1LC8qUkVHID0gMHgzMDFhKi8KLQkJMHgwMSwvKlJFRyA9IDB4MzAzNSovCi0JCTB4MjMsLypSRUcgPSAweDMwMzYqLwotCQkweDAwLC8qUkVHID0gMHgzMDQxKi8KLQkJMHgyNCwvKlJFRyA9IDB4MzA0MiovCi0JCTB4YjcsLypSRUcgPSAweDMwNDUqLwotCQkweDAxLC8qUkVHID0gMHgwYjgwIGVkb2YgYXBwbGljYXRpb24qLwotCQkweDAwLC8qUkVHID0gMHgwOTAwKi8KLQkJMHgwMCwvKlJFRyA9IDB4MDkwMSovCi0JCTB4MDAsLypSRUcgPSAweDA5MDIqLwotCQkweDAxLC8qUkVHID0gMHgwMzgzKi8KLQkJMHgwMSwvKlJFRyA9IDB4MDM4NyovCi0JCTB4MEEsLypSRUcgPSAweDAzNGMqLwotCQkweDMwLC8qUkVHID0gMHgwMzRkKi8KLQkJMHgwNywvKlJFRyA9IDB4MDM0ZSovCi0JCTB4QTgsLypSRUcgPSAweDAzNGYqLwotCQkweDAyLC8qMHgxNzE2Ki8KLQkJMHgwZCwvKjB4MTcxNyovCi0JCTB4MDcsLyoweDE3MTgqLwotCQkweDdkLC8qMHgxNzE5Ki8KLQkJMHgwMSwvKjB4MzIxMCovCi0JCTB4MDIsLyoweDExMSovCi0JCTB4MDEsLyoweDM0MTAqLwotCQkweDAxLC8qMHgzMDk4Ki8KLQkJMHgwNSwgLyoweDMwOUQqLwotCQkweDAyLAotCQkweDAwLAotCX0KLX07Ci0KLQotCi1zdHJ1Y3Qgdng2OTUzX3JlZyB2eDY5NTNfcmVncyA9IHsKLQkucmVnX3BhdF9pbml0ID0gJnZ4Njk1M19yZWdfaW5pdFswXSwKLQkucmVnX3BhdCA9ICZ2eDY5NTNfcmVnX3BhdFswXSwKLX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjEvdng2OTUzX3Y0bDIuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92eDY5NTNfdjRsMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTEzNzUyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92eDY5NTNfdjRsMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDE0OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgotI2luY2x1ZGUgPG1lZGlhL21zbV9jYW1lcmEuaD4KLSNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KLSNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlICJ2eDY5NTNfdjRsMi5oIgotI2luY2x1ZGUgIm1zbS5oIgotCi0jZGVmaW5lIFY0TDJfSURFTlRfVlg2OTUzICA1MDAwMAotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlTRU5TT1IgUkVHSVNURVIgREVGSU5FUwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jZGVmaW5lIFJFR19HUk9VUEVEX1BBUkFNRVRFUl9IT0xECQkJMHgwMTA0Ci0jZGVmaW5lIEdST1VQRURfUEFSQU1FVEVSX0hPTERfT0ZGCQkJMHgwMAotI2RlZmluZSBHUk9VUEVEX1BBUkFNRVRFUl9IT0xECQkJCTB4MDEKLSNkZWZpbmUgUkVHX01PREVfU0VMRUNUCQkJCQkweDAxMDAKLSNkZWZpbmUgTU9ERV9TRUxFQ1RfU1RBTkRCWV9NT0RFCQkJMHgwMAotI2RlZmluZSBNT0RFX1NFTEVDVF9TVFJFQU0JCQkJMHgwMQotLyogSW50ZWdyYXRpb24gVGltZSAqLwotI2RlZmluZSBSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfSEkJCQkweDAyMDIKLSNkZWZpbmUgUkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0xPCQkJMHgwMjAzCi0vKiBHYWluICovCi0jZGVmaW5lIFJFR19BTkFMT0dVRV9HQUlOX0NPREVfR0xPQkFMX0hJCQkweDAyMDQKLSNkZWZpbmUgUkVHX0FOQUxPR1VFX0dBSU5fQ09ERV9HTE9CQUxfTE8JCTB4MDIwNQotLyogRGlnaXRhbCBHYWluICovCi0jZGVmaW5lIFJFR19ESUdJVEFMX0dBSU5fR1JFRU5fUl9ISQkJCTB4MDIwRQotI2RlZmluZSBSRUdfRElHSVRBTF9HQUlOX0dSRUVOX1JfTE8JCQkweDAyMEYKLSNkZWZpbmUgUkVHX0RJR0lUQUxfR0FJTl9SRURfSEkJCQkJMHgwMjEwCi0jZGVmaW5lIFJFR19ESUdJVEFMX0dBSU5fUkVEX0xPCQkJCTB4MDIxMQotI2RlZmluZSBSRUdfRElHSVRBTF9HQUlOX0JMVUVfSEkJCQkweDAyMTIKLSNkZWZpbmUgUkVHX0RJR0lUQUxfR0FJTl9CTFVFX0xPCQkJMHgwMjEzCi0jZGVmaW5lIFJFR19ESUdJVEFMX0dBSU5fR1JFRU5fQl9ISQkJCTB4MDIxNAotI2RlZmluZSBSRUdfRElHSVRBTF9HQUlOX0dSRUVOX0JfTE8JCQkweDAyMTUKLS8qIG91dHB1dCBiaXRzIHNldHRpbmcgKi8KLSNkZWZpbmUgUkVHXzB4MDExMgkJCQkJMHgwMTEyCi0jZGVmaW5lIFJFR18weDAxMTMJCQkJCTB4MDExMwotLyogUExMIHJlZ2lzdGVycyAqLwotI2RlZmluZSBSRUdfVlRfUElYX0NMS19ESVYJCQkJMHgwMzAxCi0jZGVmaW5lIFJFR19QUkVfUExMX0NMS19ESVYJCQkJMHgwMzA1Ci0jZGVmaW5lIFJFR19QTExfTVVMVElQTElFUgkJCQkweDAzMDcKLSNkZWZpbmUgUkVHX09QX1BJWF9DTEtfRElWCQkJCTB4MDMwOQotI2RlZmluZSBSRUdfMHgwMzRjCQkJCQkweDAzNGMKLSNkZWZpbmUgUkVHXzB4MDM0ZAkJCQkJMHgwMzRkCi0jZGVmaW5lIFJFR18weDAzNGUJCQkJCTB4MDM0ZQotI2RlZmluZSBSRUdfMHgwMzRmCQkJCQkweDAzNGYKLSNkZWZpbmUgUkVHXzB4MDM4NwkJCQkJMHgwMzg3Ci0jZGVmaW5lIFJFR18weDAzODMJCQkJCTB4MDM4MwotI2RlZmluZSBSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0hJCQkJMHgwMzQwCi0jZGVmaW5lIFJFR19GUkFNRV9MRU5HVEhfTElORVNfTE8JCQkweDAzNDEKLSNkZWZpbmUgUkVHX0xJTkVfTEVOR1RIX1BDS19ISQkJCQkweDAzNDIKLSNkZWZpbmUgUkVHX0xJTkVfTEVOR1RIX1BDS19MTwkJCQkweDAzNDMKLSNkZWZpbmUgUkVHXzB4MzAzMAkJCQkJMHgzMDMwCi0jZGVmaW5lIFJFR18weDAxMTEJCQkJCTB4MDExMQotI2RlZmluZSBSRUdfMHgwMTM2CQkJCQkweDAxMzYKLSNkZWZpbmUgUkVHXzB4MDEzNwkJCQkJMHgwMTM3Ci0jZGVmaW5lIFJFR18weDBiMDAJCQkJCTB4MGIwMAotI2RlZmluZSBSRUdfMHgzMDAxCQkJCQkweDMwMDEKLSNkZWZpbmUgUkVHXzB4MzAwNAkJCQkJMHgzMDA0Ci0jZGVmaW5lIFJFR18weDMwMDcJCQkJCTB4MzAwNwotI2RlZmluZSBSRUdfMHgzMDFhCQkJCQkweDMwMWEKLSNkZWZpbmUgUkVHXzB4MzEwMQkJCQkJMHgzMTAxCi0jZGVmaW5lIFJFR18weDMzNjQJCQkJCTB4MzM2NAotI2RlZmluZSBSRUdfMHgzMzY1CQkJCQkweDMzNjUKLSNkZWZpbmUgUkVHXzB4MGI4MwkJCQkJMHgwYjgzCi0jZGVmaW5lIFJFR18weDBiODQJCQkJCTB4MGI4NAotI2RlZmluZSBSRUdfMHgwYjg1CQkJCQkweDBiODUKLSNkZWZpbmUgUkVHXzB4MGI4OAkJCQkJMHgwYjg4Ci0jZGVmaW5lIFJFR18weDBiODkJCQkJCTB4MGI4OQotI2RlZmluZSBSRUdfMHgwYjhhCQkJCQkweDBiOGEKLSNkZWZpbmUgUkVHXzB4MzAwNQkJCQkJMHgzMDA1Ci0jZGVmaW5lIFJFR18weDMwMTAJCQkJCTB4MzAxMAotI2RlZmluZSBSRUdfMHgzMDM2CQkJCQkweDMwMzYKLSNkZWZpbmUgUkVHXzB4MzA0MQkJCQkJMHgzMDQxCi0jZGVmaW5lIFJFR18weDBiODAJCQkJCTB4MGI4MAotI2RlZmluZSBSRUdfMHgwOTAwCQkJCQkweDA5MDAKLSNkZWZpbmUgUkVHXzB4MDkwMQkJCQkJMHgwOTAxCi0jZGVmaW5lIFJFR18weDA5MDIJCQkJCTB4MDkwMgotI2RlZmluZSBSRUdfMHgzMDE2CQkJCQkweDMwMTYKLSNkZWZpbmUgUkVHXzB4MzAxZAkJCQkJMHgzMDFkCi0jZGVmaW5lIFJFR18weDMxN2UJCQkJCTB4MzE3ZQotI2RlZmluZSBSRUdfMHgzMTdmCQkJCQkweDMxN2YKLSNkZWZpbmUgUkVHXzB4MzQwMAkJCQkJMHgzNDAwCi0jZGVmaW5lIFJFR18weDMwM2EJCQkJCTB4MzAzYQotI2RlZmluZSBSRUdfMHgxNzE2CQkJCQkweDE3MTYKLSNkZWZpbmUgUkVHXzB4MTcxNwkJCQkJMHgxNzE3Ci0jZGVmaW5lIFJFR18weDE3MTgJCQkJCTB4MTcxOAotI2RlZmluZSBSRUdfMHgxNzE5CQkJCQkweDE3MTkKLSNkZWZpbmUgUkVHXzB4MzAwNgkJCQkJMHgzMDA2Ci0jZGVmaW5lIFJFR18weDMwMWIJCQkJCTB4MzAxYgotI2RlZmluZSBSRUdfMHgzMDk4CQkJCQkweDMwOTgKLSNkZWZpbmUgUkVHXzB4MzA5ZAkJCQkJMHgzMDlkCi0jZGVmaW5lIFJFR18weDMwMTEJCQkJCTB4MzAxMQotI2RlZmluZSBSRUdfMHgzMDM1CQkJCQkweDMwMzUKLSNkZWZpbmUgUkVHXzB4MzA0NQkJCQkJMHgzMDQ1Ci0jZGVmaW5lIFJFR18weDMyMTAJCQkJCTB4MzIxMAotI2RlZmluZQlSRUdfMHgwMTExCQkJCQkweDAxMTEKLSNkZWZpbmUgUkVHXzB4MzQxMAkJCQkJMHgzNDEwCi0vKiBUZXN0IFBhdHRlcm4gKi8KLSNkZWZpbmUgUkVHX1RFU1RfUEFUVEVSTl9NT0RFCQkJCTB4MDYwMQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJCQkJCQkgVFlQRSBERUNMQVJBVElPTlMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKiAxNmJpdCBhZGRyZXNzIC0gOCBiaXQgY29udGV4dCByZWdpc3RlciBzdHJ1Y3R1cmUgKi8KLSNkZWZpbmUJVlg2OTUzX1NUTTVNMEVET0ZfT0ZGU0VUCTkKLSNkZWZpbmUJUTgJCTB4MDAwMDAxMDAKLSNkZWZpbmUJUTEwCQkweDAwMDAwNDAwCi0jZGVmaW5lCVZYNjk1M19TVE01TTBFRE9GX01BWF9TTkFQU0hPVF9FWFBPU1VSRV9MSU5FX0NPVU5UCTI5MjIKLSNkZWZpbmUJVlg2OTUzX1NUTTVNMEVET0ZfREVGQVVMVF9NQVNURVJfQ0xLX1JBVEUJMjQwMDAwMDAKLSNkZWZpbmUJVlg2OTUzX1NUTTVNMEVET0ZfT1BfUElYRUxfQ0xPQ0tfUkFURQk3OTgwMDAwMAotI2RlZmluZQlWWDY5NTNfU1RNNU0wRURPRl9WVF9QSVhFTF9DTE9DS19SQVRFCTg4NjcwMDAwCi0vKiBGdWxsCVNpemUgKi8KLSNkZWZpbmUJVlg2OTUzX0ZVTExfU0laRV9XSURUSAkyNjA4Ci0jZGVmaW5lCVZYNjk1M19GVUxMX1NJWkVfSEVJR0hUCQkxOTYwCi0jZGVmaW5lCVZYNjk1M19GVUxMX1NJWkVfRFVNTVlfUElYRUxTCTEKLSNkZWZpbmUJVlg2OTUzX0ZVTExfU0laRV9EVU1NWV9MSU5FUwkwCi0vKiBRdWFydGVyIFNpemUJKi8KLSNkZWZpbmUJVlg2OTUzX1FUUl9TSVpFX1dJRFRICTEzMDQKLSNkZWZpbmUJVlg2OTUzX1FUUl9TSVpFX0hFSUdIVAkJOTgwCi0jZGVmaW5lCVZYNjk1M19RVFJfU0laRV9EVU1NWV9QSVhFTFMJMQotI2RlZmluZQlWWDY5NTNfUVRSX1NJWkVfRFVNTVlfTElORVMJCTAKLS8qIEJsYW5raW5nCWFzIG1lYXN1cmVkCW9uIHRoZSBzY29wZSAqLwotLyogRnVsbAlTaXplICovCi0jZGVmaW5lCVZYNjk1M19IUlpfRlVMTF9CTEtfUElYRUxTCTM0OAotI2RlZmluZQlWWDY5NTNfVkVSX0ZVTExfQkxLX0xJTkVTCTQwCi0vKiBRdWFydGVyIFNpemUJKi8KLSNkZWZpbmUJVlg2OTUzX0hSWl9RVFJfQkxLX1BJWEVMUwkxNjI4Ci0jZGVmaW5lCVZYNjk1M19WRVJfUVRSX0JMS19MSU5FUwkyOAotI2RlZmluZQlNQVhfTElORV9MRU5HVEhfUENLCQk4MTkwCi0jZGVmaW5lCVZYNjk1M19SRVZJU0lPTl9OVU1CRVJfQ1VUMgkweDEwLypyZXZpc2lvbiBudW1iZXIJZm9yCUN1dDIuMCovCi0jZGVmaW5lCVZYNjk1M19SRVZJU0lPTl9OVU1CRVJfQ1VUMwkweDIwLypyZXZpc2lvbiBudW1iZXIJZm9yCUN1dDMuMCovCi0vKiBGSVhNRTogQ2hhbmdlcyBmcm9tIGhlcmUgKi8KLXN0cnVjdCB2eDY5NTNfd29ya190IHsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgdng2OTUzX3dvcmtfdCAqdng2OTUzX3NlbnNvcnc7Ci1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKnZ4Njk1M19jbGllbnQ7Ci0KLXN0cnVjdCB2eDY5NTNfY3RybF90IHsKLQljb25zdCBzdHJ1Y3QgIG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKnNlbnNvcmRhdGE7Ci0KLQl1aW50MzJfdCBzZW5zb3Jtb2RlOwotCXVpbnQzMl90IGZwc19kaXZpZGVyOyAgLyogaW5pdCB0byAxICogMHgwMDAwMDQwMCAqLwotCXVpbnQzMl90IHBpY3RfZnBzX2RpdmlkZXI7ICAvKiBpbml0IHRvIDEgKiAweDAwMDAwNDAwICovCi0JdWludDE2X3QgZnBzOwotCi0JaW50MTZfdCBjdXJyX2xlbnNfcG9zOwotCXVpbnQxNl90IGN1cnJfc3RlcF9wb3M7Ci0JdWludDE2X3QgbXlfcmVnX2dhaW47Ci0JdWludDMyX3QgbXlfcmVnX2xpbmVfY291bnQ7Ci0JdWludDE2X3QgdG90YWxfbGluZXNfcGVyX2ZyYW1lOwotCi0JZW51bSB2eDY5NTNfcmVzb2x1dGlvbl90IHByZXZfcmVzOwotCWVudW0gdng2OTUzX3Jlc29sdXRpb25fdCBwaWN0X3JlczsKLQllbnVtIHZ4Njk1M19yZXNvbHV0aW9uX3QgY3Vycl9yZXM7Ci0JZW51bSB2eDY5NTNfdGVzdF9tb2RlX3QgIHNldF90ZXN0OwotCWVudW0gc2Vuc29yX3JldmlzaW9uX3Qgc2Vuc29yX3R5cGU7Ci0KLQllbnVtIGVkb2ZfbW9kZV90IGVkb2ZfbW9kZTsKLQotCXVuc2lnbmVkIHNob3J0IGltZ2FkZHI7Ci0KLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNlbnNvcl9kZXY7Ci0Jc3RydWN0IHZ4Njk1M19mb3JtYXQgKmZtdDsKLX07Ci0KLQotc3RhdGljIHVpbnQ4X3Qgdng2OTUzX3N0bTVtMGVkb2ZfZGVsYXlfbXNlY3Nfc3RkYnk7Ci1zdGF0aWMgdWludDE2X3Qgdng2OTUzX3N0bTVtMGVkb2ZfZGVsYXlfbXNlY3Nfc3RyZWFtID0gMjA7Ci0KLXN0YXRpYyBzdHJ1Y3Qgdng2OTUzX2N0cmxfdCAqdng2OTUzX2N0cmw7Ci1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQodng2OTUzX3dhaXRfcXVldWUpOwotREVGSU5FX01VVEVYKHZ4Njk1M19tdXQpOwotc3RhdGljIHN0cnVjdCB2eDY5NTNfaTJjX3JlZ19jb25mIHBhdGNoX3RibF9jdXQyW10gPSB7Ci0JezB4RkI5NCwgMH0sCS8qaW50aWFsaXNlIERhdGEgWGZlciBTdGF0dXMgcmVnKi8KLQl7MHhGQjk1LCAwfSwJLypnYWluIDEJICAoMHgwMCkqLwotCXsweEZCOTYsIDB9LAkvKmdhaW4gMS4wNyAgICgweDEwKSovCi0JezB4RkI5NywgMH0sCS8qZ2FpbiAxLjE0ICAgKDB4MjApKi8KLQl7MHhGQjk4LCAwfSwJLypnYWluIDEuMjMgICAoMHgzMCkqLwotCXsweEZCOTksIDB9LAkvKmdhaW4gMS4zMyAgICgweDQwKSovCi0JezB4RkI5QSwgMH0sCS8qZ2FpbiAxLjQ1ICAgKDB4NTApKi8KLQl7MHhGQjlCLCAwfSwJLypnYWluIDEuNiAgICAoMHg2MCkqLwotCXsweEZCOUMsIDB9LAkvKmdhaW4gMS43OCAgICgweDcwKSovCi0JezB4RkI5RCwgMn0sCS8qZ2FpbiAyCSAgKDB4ODApKi8KLQl7MHhGQjlFLCAyfSwJLypnYWluIDIuMjkgICAoMHg5MCkqLwotCXsweEZCOUYsIDN9LAkvKmdhaW4gMi42NyAgICgweEEwKSovCi0JezB4RkJBMCwgM30sCS8qZ2FpbiAzLjIgICAgKDB4QjApKi8KLQl7MHhGQkExLCA0fSwJLypnYWluIDQJICAoMHhDMCkqLwotCXsweEZCQTIsIDd9LAkvKmdhaW4gNS4zMyAgICgweEQwKSovCi0JezB4RkJBMywgMTB9LAkvKmdhaW4gOAkgICgweEUwKSovCi0JezB4RkJBNCwgMTF9LAkvKmdhaW4gOS4xNCAgICgweEU0KSovCi0JezB4RkJBNSwgMTN9LAkvKmdhaW4gMTAuNjcgICgweEU4KSovCi0JezB4RkJBNiwgMTV9LAkvKmdhaW4gMTIuOCAgICgweEVDKSovCi0JezB4RkJBNywgMTl9LAkvKmdhaW4gMTYgICAgICgweEYwKSovCi0JezB4RjgwMCwgMHgxMn0sCi0JezB4RjgwMSwgMHgwNn0sCi0JezB4RjgwMiwgMHhmN30sCi0JezB4RjgwMywgMHg5MH0sCi0JezB4RjgwNCwgMHgwMn0sCi0JezB4RjgwNSwgMHgwNX0sCi0JezB4RjgwNiwgMHhlMH0sCi0JezB4RjgwNywgMHhmZn0sCi0JezB4RjgwOCwgMHg2NX0sCi0JezB4RjgwOSwgMHg3ZH0sCi0JezB4RjgwQSwgMHg3MH0sCi0JezB4RjgwQiwgMHgwM30sCi0JezB4RjgwQywgMHgwMn0sCi0JezB4RjgwRCwgMHhmOX0sCi0JezB4RjgwRSwgMHgxY30sCi0JezB4RjgwRiwgMHg4Zn0sCi0JezB4RjgxMCwgMHg3ZH0sCi0JezB4RjgxMSwgMHhlNH0sCi0JezB4RjgxMiwgMHhmNX0sCi0JezB4RjgxMywgMHg3YX0sCi0JezB4RjgxNCwgMHg3NX0sCi0JezB4RjgxNSwgMHg3OH0sCi0JezB4RjgxNiwgMHgzMH0sCi0JezB4RjgxNywgMHg3NX0sCi0JezB4RjgxOCwgMHg3OX0sCi0JezB4RjgxOSwgMHg1M30sCi0JezB4RjgxQSwgMHg4NX0sCi0JezB4RjgxQiwgMHg3OX0sCi0JezB4RjgxQywgMHg4Mn0sCi0JezB4RjgxRCwgMHg4NX0sCi0JezB4RjgxRSwgMHg3OH0sCi0JezB4RjgxRiwgMHg4M30sCi0JezB4RjgyMCwgMHhlMH0sCi0JezB4RjgyMSwgMHhjM30sCi0JezB4RjgyMiwgMHg5NX0sCi0JezB4RjgyMywgMHg3Yn0sCi0JezB4RjgyNCwgMHhmMH0sCi0JezB4RjgyNSwgMHg3NH0sCi0JezB4RjgyNiwgMHgwMn0sCi0JezB4RjgyNywgMHgyNX0sCi0JezB4RjgyOCwgMHg3OX0sCi0JezB4RjgyOSwgMHhmNX0sCi0JezB4RjgyQSwgMHg3OX0sCi0JezB4RjgyQiwgMHhlNH0sCi0JezB4RjgyQywgMHgzNX0sCi0JezB4RjgyRCwgMHg3OH0sCi0JezB4RjgyRSwgMHhmNX0sCi0JezB4RjgyRiwgMHg3OH0sCi0JezB4RjgzMCwgMHgwNX0sCi0JezB4RjgzMSwgMHg3YX0sCi0JezB4RjgzMiwgMHhlNX0sCi0JezB4RjgzMywgMHg3YX0sCi0JezB4RjgzNCwgMHhiNH0sCi0JezB4RjgzNSwgMHgwOH0sCi0JezB4RjgzNiwgMHhlM30sCi0JezB4RjgzNywgMHhlNX0sCi0JezB4RjgzOCwgMHg3ZH0sCi0JezB4RjgzOSwgMHg3MH0sCi0JezB4RjgzQSwgMHgwNH0sCi0JezB4RjgzQiwgMHhmZn0sCi0JezB4RjgzQywgMHgwMn0sCi0JezB4RjgzRCwgMHhmOH0sCi0JezB4RjgzRSwgMHhlNH0sCi0JezB4RjgzRiwgMHhlNX0sCi0JezB4Rjg0MCwgMHg3ZH0sCi0JezB4Rjg0MSwgMHhiNH0sCi0JezB4Rjg0MiwgMHgxMH0sCi0JezB4Rjg0MywgMHgwNX0sCi0JezB4Rjg0NCwgMHg3Zn0sCi0JezB4Rjg0NSwgMHgwMX0sCi0JezB4Rjg0NiwgMHgwMn0sCi0JezB4Rjg0NywgMHhmOH0sCi0JezB4Rjg0OCwgMHhlNH0sCi0JezB4Rjg0OSwgMHhlNX0sCi0JezB4Rjg0QSwgMHg3ZH0sCi0JezB4Rjg0QiwgMHhiNH0sCi0JezB4Rjg0QywgMHgyMH0sCi0JezB4Rjg0RCwgMHgwNX0sCi0JezB4Rjg0RSwgMHg3Zn0sCi0JezB4Rjg0RiwgMHgwMn0sCi0JezB4Rjg1MCwgMHgwMn0sCi0JezB4Rjg1MSwgMHhmOH0sCi0JezB4Rjg1MiwgMHhlNH0sCi0JezB4Rjg1MywgMHhlNX0sCi0JezB4Rjg1NCwgMHg3ZH0sCi0JezB4Rjg1NSwgMHhiNH0sCi0JezB4Rjg1NiwgMHgzMH0sCi0JezB4Rjg1NywgMHgwNX0sCi0JezB4Rjg1OCwgMHg3Zn0sCi0JezB4Rjg1OSwgMHgwM30sCi0JezB4Rjg1QSwgMHgwMn0sCi0JezB4Rjg1QiwgMHhmOH0sCi0JezB4Rjg1QywgMHhlNH0sCi0JezB4Rjg1RCwgMHhlNX0sCi0JezB4Rjg1RSwgMHg3ZH0sCi0JezB4Rjg1RiwgMHhiNH0sCi0JezB4Rjg2MCwgMHg0MH0sCi0JezB4Rjg2MSwgMHgwNH0sCi0JezB4Rjg2MiwgMHg3Zn0sCi0JezB4Rjg2MywgMHgwNH0sCi0JezB4Rjg2NCwgMHg4MH0sCi0JezB4Rjg2NSwgMHg3ZX0sCi0JezB4Rjg2NiwgMHhlNX0sCi0JezB4Rjg2NywgMHg3ZH0sCi0JezB4Rjg2OCwgMHhiNH0sCi0JezB4Rjg2OSwgMHg1MH0sCi0JezB4Rjg2QSwgMHgwNH0sCi0JezB4Rjg2QiwgMHg3Zn0sCi0JezB4Rjg2QywgMHgwNX0sCi0JezB4Rjg2RCwgMHg4MH0sCi0JezB4Rjg2RSwgMHg3NX0sCi0JezB4Rjg2RiwgMHhlNX0sCi0JezB4Rjg3MCwgMHg3ZH0sCi0JezB4Rjg3MSwgMHhiNH0sCi0JezB4Rjg3MiwgMHg2MH0sCi0JezB4Rjg3MywgMHgwNH0sCi0JezB4Rjg3NCwgMHg3Zn0sCi0JezB4Rjg3NSwgMHgwNn0sCi0JezB4Rjg3NiwgMHg4MH0sCi0JezB4Rjg3NywgMHg2Y30sCi0JezB4Rjg3OCwgMHhlNX0sCi0JezB4Rjg3OSwgMHg3ZH0sCi0JezB4Rjg3QSwgMHhiNH0sCi0JezB4Rjg3QiwgMHg3MH0sCi0JezB4Rjg3QywgMHgwNH0sCi0JezB4Rjg3RCwgMHg3Zn0sCi0JezB4Rjg3RSwgMHgwN30sCi0JezB4Rjg3RiwgMHg4MH0sCi0JezB4Rjg4MCwgMHg2M30sCi0JezB4Rjg4MSwgMHhlNX0sCi0JezB4Rjg4MiwgMHg3ZH0sCi0JezB4Rjg4MywgMHhiNH0sCi0JezB4Rjg4NCwgMHg4MH0sCi0JezB4Rjg4NSwgMHgwNH0sCi0JezB4Rjg4NiwgMHg3Zn0sCi0JezB4Rjg4NywgMHgwOH0sCi0JezB4Rjg4OCwgMHg4MH0sCi0JezB4Rjg4OSwgMHg1YX0sCi0JezB4Rjg4QSwgMHhlNX0sCi0JezB4Rjg4QiwgMHg3ZH0sCi0JezB4Rjg4QywgMHhiNH0sCi0JezB4Rjg4RCwgMHg5MH0sCi0JezB4Rjg4RSwgMHgwNH0sCi0JezB4Rjg4RiwgMHg3Zn0sCi0JezB4Rjg5MCwgMHgwOX0sCi0JezB4Rjg5MSwgMHg4MH0sCi0JezB4Rjg5MiwgMHg1MX0sCi0JezB4Rjg5MywgMHhlNX0sCi0JezB4Rjg5NCwgMHg3ZH0sCi0JezB4Rjg5NSwgMHhiNH0sCi0JezB4Rjg5NiwgMHhhMH0sCi0JezB4Rjg5NywgMHgwNH0sCi0JezB4Rjg5OCwgMHg3Zn0sCi0JezB4Rjg5OSwgMHgwYX0sCi0JezB4Rjg5QSwgMHg4MH0sCi0JezB4Rjg5QiwgMHg0OH0sCi0JezB4Rjg5QywgMHhlNX0sCi0JezB4Rjg5RCwgMHg3ZH0sCi0JezB4Rjg5RSwgMHhiNH0sCi0JezB4Rjg5RiwgMHhiMH0sCi0JezB4RjhBMCwgMHgwNH0sCi0JezB4RjhBMSwgMHg3Zn0sCi0JezB4RjhBMiwgMHgwYn0sCi0JezB4RjhBMywgMHg4MH0sCi0JezB4RjhBNCwgMHgzZn0sCi0JezB4RjhBNSwgMHhlNX0sCi0JezB4RjhBNiwgMHg3ZH0sCi0JezB4RjhBNywgMHhiNH0sCi0JezB4RjhBOCwgMHhjMH0sCi0JezB4RjhBOSwgMHgwNH0sCi0JezB4RjhBQSwgMHg3Zn0sCi0JezB4RjhBQiwgMHgwY30sCi0JezB4RjhBQywgMHg4MH0sCi0JezB4RjhBRCwgMHgzNn0sCi0JezB4RjhBRSwgMHhlNX0sCi0JezB4RjhBRiwgMHg3ZH0sCi0JezB4RjhCMCwgMHhiNH0sCi0JezB4RjhCMSwgMHhkMH0sCi0JezB4RjhCMiwgMHgwNH0sCi0JezB4RjhCMywgMHg3Zn0sCi0JezB4RjhCNCwgMHgwZH0sCi0JezB4RjhCNSwgMHg4MH0sCi0JezB4RjhCNiwgMHgyZH0sCi0JezB4RjhCNywgMHhlNX0sCi0JezB4RjhCOCwgMHg3ZH0sCi0JezB4RjhCOSwgMHhiNH0sCi0JezB4RjhCQSwgMHhlMH0sCi0JezB4RjhCQiwgMHgwNH0sCi0JezB4RjhCQywgMHg3Zn0sCi0JezB4RjhCRCwgMHgwZX0sCi0JezB4RjhCRSwgMHg4MH0sCi0JezB4RjhCRiwgMHgyNH0sCi0JezB4RjhDMCwgMHhlNX0sCi0JezB4RjhDMSwgMHg3ZH0sCi0JezB4RjhDMiwgMHhiNH0sCi0JezB4RjhDMywgMHhlNH0sCi0JezB4RjhDNCwgMHgwNH0sCi0JezB4RjhDNSwgMHg3Zn0sCi0JezB4RjhDNiwgMHgwZn0sCi0JezB4RjhDNywgMHg4MH0sCi0JezB4RjhDOCwgMHgxYn0sCi0JezB4RjhDOSwgMHhlNX0sCi0JezB4RjhDQSwgMHg3ZH0sCi0JezB4RjhDQiwgMHhiNH0sCi0JezB4RjhDQywgMHhlOH0sCi0JezB4RjhDRCwgMHgwNH0sCi0JezB4RjhDRSwgMHg3Zn0sCi0JezB4RjhDRiwgMHgxMH0sCi0JezB4RjhEMCwgMHg4MH0sCi0JezB4RjhEMSwgMHgxMn0sCi0JezB4RjhEMiwgMHhlNX0sCi0JezB4RjhEMywgMHg3ZH0sCi0JezB4RjhENCwgMHhiNH0sCi0JezB4RjhENSwgMHhlY30sCi0JezB4RjhENiwgMHgwNH0sCi0JezB4RjhENywgMHg3Zn0sCi0JezB4RjhEOCwgMHgxMX0sCi0JezB4RjhEOSwgMHg4MH0sCi0JezB4RjhEQSwgMHgwOX0sCi0JezB4RjhEQiwgMHhlNX0sCi0JezB4RjhEQywgMHg3ZH0sCi0JezB4RjhERCwgMHg3Zn0sCi0JezB4RjhERSwgMHgwMH0sCi0JezB4RjhERiwgMHhiNH0sCi0JezB4RjhFMCwgMHhmMH0sCi0JezB4RjhFMSwgMHgwMn0sCi0JezB4RjhFMiwgMHg3Zn0sCi0JezB4RjhFMywgMHgxMn0sCi0JezB4RjhFNCwgMHg4Zn0sCi0JezB4RjhFNSwgMHg3Y30sCi0JezB4RjhFNiwgMHhlZn0sCi0JezB4RjhFNywgMHgyNH0sCi0JezB4RjhFOCwgMHg5NX0sCi0JezB4RjhFOSwgMHhmZn0sCi0JezB4RjhFQSwgMHhlNH0sCi0JezB4RjhFQiwgMHgzNH0sCi0JezB4RjhFQywgMHhmYn0sCi0JezB4RjhFRCwgMHg4Zn0sCi0JezB4RjhFRSwgMHg4Mn0sCi0JezB4RjhFRiwgMHhmNX0sCi0JezB4RjhGMCwgMHg4M30sCi0JezB4RjhGMSwgMHhlNH0sCi0JezB4RjhGMiwgMHg5M30sCi0JezB4RjhGMywgMHhmNX0sCi0JezB4RjhGNCwgMHg3Y30sCi0JezB4RjhGNSwgMHhmNX0sCi0JezB4RjhGNiwgMHg3Yn0sCi0JezB4RjhGNywgMHhlNH0sCi0JezB4RjhGOCwgMHhmNX0sCi0JezB4RjhGOSwgMHg3YX0sCi0JezB4RjhGQSwgMHg3NX0sCi0JezB4RjhGQiwgMHg3OH0sCi0JezB4RjhGQywgMHgzMH0sCi0JezB4RjhGRCwgMHg3NX0sCi0JezB4RjhGRSwgMHg3OX0sCi0JezB4RjhGRiwgMHg1M30sCi0JezB4RjkwMCwgMHg4NX0sCi0JezB4RjkwMSwgMHg3OX0sCi0JezB4RjkwMiwgMHg4Mn0sCi0JezB4RjkwMywgMHg4NX0sCi0JezB4RjkwNCwgMHg3OH0sCi0JezB4RjkwNSwgMHg4M30sCi0JezB4RjkwNiwgMHhlMH0sCi0JezB4RjkwNywgMHgyNX0sCi0JezB4RjkwOCwgMHg3Y30sCi0JezB4RjkwOSwgMHhmMH0sCi0JezB4RjkwQSwgMHg3NH0sCi0JezB4RjkwQiwgMHgwMn0sCi0JezB4RjkwQywgMHgyNX0sCi0JezB4RjkwRCwgMHg3OX0sCi0JezB4RjkwRSwgMHhmNX0sCi0JezB4RjkwRiwgMHg3OX0sCi0JezB4RjkxMCwgMHhlNH0sCi0JezB4RjkxMSwgMHgzNX0sCi0JezB4RjkxMiwgMHg3OH0sCi0JezB4RjkxMywgMHhmNX0sCi0JezB4RjkxNCwgMHg3OH0sCi0JezB4RjkxNSwgMHgwNX0sCi0JezB4RjkxNiwgMHg3YX0sCi0JezB4RjkxNywgMHhlNX0sCi0JezB4RjkxOCwgMHg3YX0sCi0JezB4RjkxOSwgMHhiNH0sCi0JezB4RjkxQSwgMHgwOH0sCi0JezB4RjkxQiwgMHhlNH0sCi0JezB4RjkxQywgMHgwMn0sCi0JezB4RjkxRCwgMHgxOH0sCi0JezB4RjkxRSwgMHgzMn0sCi0JezB4RjkxRiwgMHgyMn0sCi0JezB4RjkyMCwgMHhmMH0sCi0JezB4RjkyMSwgMHg5MH0sCi0JezB4RjkyMiwgMHhhMH0sCi0JezB4RjkyMywgMHhmOH0sCi0JezB4RjkyNCwgMHhlMH0sCi0JezB4RjkyNSwgMHg3MH0sCi0JezB4RjkyNiwgMHgwMn0sCi0JezB4RjkyNywgMHhhM30sCi0JezB4RjkyOCwgMHhlMH0sCi0JezB4RjkyOSwgMHg3MH0sCi0JezB4RjkyQSwgMHgwYX0sCi0JezB4RjkyQiwgMHg5MH0sCi0JezB4RjkyQywgMHhhMX0sCi0JezB4RjkyRCwgMHgxMH0sCi0JezB4RjkyRSwgMHhlMH0sCi0JezB4RjkyRiwgMHhmZX0sCi0JezB4RjkzMCwgMHhhM30sCi0JezB4RjkzMSwgMHhlMH0sCi0JezB4RjkzMiwgMHhmZn0sCi0JezB4RjkzMywgMHg4MH0sCi0JezB4RjkzNCwgMHgwNH0sCi0JezB4RjkzNSwgMHg3ZX0sCi0JezB4RjkzNiwgMHgwMH0sCi0JezB4RjkzNywgMHg3Zn0sCi0JezB4RjkzOCwgMHgwMH0sCi0JezB4RjkzOSwgMHg4ZX0sCi0JezB4RjkzQSwgMHg3ZX0sCi0JezB4RjkzQiwgMHg4Zn0sCi0JezB4RjkzQywgMHg3Zn0sCi0JezB4RjkzRCwgMHg5MH0sCi0JezB4RjkzRSwgMHgzNn0sCi0JezB4RjkzRiwgMHgwZH0sCi0JezB4Rjk0MCwgMHhlMH0sCi0JezB4Rjk0MSwgMHg0NH0sCi0JezB4Rjk0MiwgMHgwMn0sCi0JezB4Rjk0MywgMHhmMH0sCi0JezB4Rjk0NCwgMHg5MH0sCi0JezB4Rjk0NSwgMHgzNn0sCi0JezB4Rjk0NiwgMHgwZX0sCi0JezB4Rjk0NywgMHhlNX0sCi0JezB4Rjk0OCwgMHg3ZX0sCi0JezB4Rjk0OSwgMHhmMH0sCi0JezB4Rjk0QSwgMHhhM30sCi0JezB4Rjk0QiwgMHhlNX0sCi0JezB4Rjk0QywgMHg3Zn0sCi0JezB4Rjk0RCwgMHhmMH0sCi0JezB4Rjk0RSwgMHhlNX0sCi0JezB4Rjk0RiwgMHgzYX0sCi0JezB4Rjk1MCwgMHg2MH0sCi0JezB4Rjk1MSwgMHgwY30sCi0JezB4Rjk1MiwgMHg5MH0sCi0JezB4Rjk1MywgMHgzNn0sCi0JezB4Rjk1NCwgMHgwOX0sCi0JezB4Rjk1NSwgMHhlMH0sCi0JezB4Rjk1NiwgMHg3MH0sCi0JezB4Rjk1NywgMHgwNn0sCi0JezB4Rjk1OCwgMHg5MH0sCi0JezB4Rjk1OSwgMHgzNn0sCi0JezB4Rjk1QSwgMHgwOH0sCi0JezB4Rjk1QiwgMHhmMH0sCi0JezB4Rjk1QywgMHhmNX0sCi0JezB4Rjk1RCwgMHgzYX0sCi0JezB4Rjk1RSwgMHgwMn0sCi0JezB4Rjk1RiwgMHgwM30sCi0JezB4Rjk2MCwgMHg5NH0sCi0JezB4Rjk2MSwgMHgyMn0sCi0JezB4Rjk2MiwgMHg3OH0sCi0JezB4Rjk2MywgMHgwN30sCi0JezB4Rjk2NCwgMHhlNn0sCi0JezB4Rjk2NSwgMHhkM30sCi0JezB4Rjk2NiwgMHg5NH0sCi0JezB4Rjk2NywgMHgwMH0sCi0JezB4Rjk2OCwgMHg0MH0sCi0JezB4Rjk2OSwgMHgxNn0sCi0JezB4Rjk2QSwgMHgxNn0sCi0JezB4Rjk2QiwgMHhlNn0sCi0JezB4Rjk2QywgMHg5MH0sCi0JezB4Rjk2RCwgMHgzMH0sCi0JezB4Rjk2RSwgMHhhMX0sCi0JezB4Rjk2RiwgMHhmMH0sCi0JezB4Rjk3MCwgMHg5MH0sCi0JezB4Rjk3MSwgMHg0M30sCi0JezB4Rjk3MiwgMHg4M30sCi0JezB4Rjk3MywgMHhlMH0sCi0JezB4Rjk3NCwgMHhiNH0sCi0JezB4Rjk3NSwgMHgwMX0sCi0JezB4Rjk3NiwgMHgwZn0sCi0JezB4Rjk3NywgMHg5MH0sCi0JezB4Rjk3OCwgMHg0M30sCi0JezB4Rjk3OSwgMHg4N30sCi0JezB4Rjk3QSwgMHhlMH0sCi0JezB4Rjk3QiwgMHhiNH0sCi0JezB4Rjk3QywgMHgwMX0sCi0JezB4Rjk3RCwgMHgwOH0sCi0JezB4Rjk3RSwgMHg4MH0sCi0JezB4Rjk3RiwgMHgwMH0sCi0JezB4Rjk4MCwgMHg5MH0sCi0JezB4Rjk4MSwgMHgzMH0sCi0JezB4Rjk4MiwgMHhhMH0sCi0JezB4Rjk4MywgMHg3NH0sCi0JezB4Rjk4NCwgMHgwMX0sCi0JezB4Rjk4NSwgMHhmMH0sCi0JezB4Rjk4NiwgMHgyMn0sCi0JezB4Rjk4NywgMHhmMH0sCi0JezB4Rjk4OCwgMHg5MH0sCi0JezB4Rjk4OSwgMHgzNX0sCi0JezB4Rjk4QSwgMHhiYX0sCi0JezB4Rjk4QiwgMHhlMH0sCi0JezB4Rjk4QywgMHhiNH0sCi0JezB4Rjk4RCwgMHgwYX0sCi0JezB4Rjk4RSwgMHgwZH0sCi0JezB4Rjk4RiwgMHhhM30sCi0JezB4Rjk5MCwgMHhlMH0sCi0JezB4Rjk5MSwgMHhiNH0sCi0JezB4Rjk5MiwgMHgwMX0sCi0JezB4Rjk5MywgMHgwOH0sCi0JezB4Rjk5NCwgMHg5MH0sCi0JezB4Rjk5NSwgMHhmYn0sCi0JezB4Rjk5NiwgMHg5NH0sCi0JezB4Rjk5NywgMHhlMH0sCi0JezB4Rjk5OCwgMHg5MH0sCi0JezB4Rjk5OSwgMHgzNX0sCi0JezB4Rjk5QSwgMHhiOH0sCi0JezB4Rjk5QiwgMHhmMH0sCi0JezB4Rjk5QywgMHhkMH0sCi0JezB4Rjk5RCwgMHhkMH0sCi0JezB4Rjk5RSwgMHhkMH0sCi0JezB4Rjk5RiwgMHg4Mn0sCi0JezB4RjlBMCwgMHhkMH0sCi0JezB4RjlBMSwgMHg4M30sCi0JezB4RjlBMiwgMHhkMH0sCi0JezB4RjlBMywgMHhlMH0sCi0JezB4RjlBNCwgMHgzMn0sCi0JezB4RjlBNSwgMHgyMn0sCi0JezB4RjlBNiwgMHhlNX0sCi0JezB4RjlBNywgMHg3Zn0sCi0JezB4RjlBOCwgMHg0NX0sCi0JezB4RjlBOSwgMHg3ZX0sCi0JezB4RjlBQSwgMHg2MH0sCi0JezB4RjlBQiwgMHgxNX0sCi0JezB4RjlBQywgMHg5MH0sCi0JezB4RjlBRCwgMHgwMX0sCi0JezB4RjlBRSwgMHgwMH0sCi0JezB4RjlBRiwgMHhlMH0sCi0JezB4RjlCMCwgMHg3MH0sCi0JezB4RjlCMSwgMHgwZn0sCi0JezB4RjlCMiwgMHg5MH0sCi0JezB4RjlCMywgMHhhMH0sCi0JezB4RjlCNCwgMHhmOH0sCi0JezB4RjlCNSwgMHhlNX0sCi0JezB4RjlCNiwgMHg3ZX0sCi0JezB4RjlCNywgMHhmMH0sCi0JezB4RjlCOCwgMHhhM30sCi0JezB4RjlCOSwgMHhlNX0sCi0JezB4RjlCQSwgMHg3Zn0sCi0JezB4RjlCQiwgMHhmMH0sCi0JezB4RjlCQywgMHhlNH0sCi0JezB4RjlCRCwgMHhmNX0sCi0JezB4RjlCRSwgMHg3ZX0sCi0JezB4RjlCRiwgMHhmNX0sCi0JezB4RjlDMCwgMHg3Zn0sCi0JezB4RjlDMSwgMHgyMn0sCi0JezB4RjlDMiwgMHgwMn0sCi0JezB4RjlDMywgMHgwZX0sCi0JezB4RjlDNCwgMHg3OX0sCi0JezB4RjlDNSwgMHgyMn0sCi0JLyogT2Zmc2V0czoqLwotCXsweDM1QzYsIDB4MDB9LC8qIEZJRERMRURBUktDQUwqLwotCXsweDM1QzcsIDB4MDB9LAotCXsweDM1QzgsIDB4MDF9LC8qU1RPUkVESVNUQU5DRUFUU1RPUFNUUkVBTUlORyovCi0JezB4MzVDOSwgMHgyMH0sCi0JezB4MzVDQSwgMHgwMX0sLypCUlVDRUZJWCovCi0JezB4MzVDQiwgMHg2Mn0sCi0JezB4MzVDQywgMHgwMX0sLypGSVhEQVRBWEZFUlNUQVRVU1JFRyovCi0JezB4MzVDRCwgMHg4N30sCi0JezB4MzVDRSwgMHgwMX0sLypGT0NVU0RJU1RBTkNFVVBEQVRFKi8KLQl7MHgzNUNGLCAweEE2fSwKLQl7MHgzNUQwLCAweDAxfSwvKlNLSVBFRE9GUkVTRVQqLwotCXsweDM1RDEsIDB4QzJ9LAotCXsweDM1RDIsIDB4MDB9LAotCXsweDM1RDMsIDB4RkJ9LAotCXsweDM1RDQsIDB4MDB9LAotCXsweDM1RDUsIDB4OTR9LAotCXsweDM1RDYsIDB4MDB9LAotCXsweDM1RDcsIDB4RkJ9LAotCXsweDM1RDgsIDB4MDB9LAotCXsweDM1RDksIDB4OTR9LAotCXsweDM1REEsIDB4MDB9LAotCXsweDM1REIsIDB4RkJ9LAotCXsweDM1REMsIDB4MDB9LAotCXsweDM1REQsIDB4OTR9LAotCXsweDM1REUsIDB4MDB9LAotCXsweDM1REYsIDB4RkJ9LAotCXsweDM1RTAsIDB4MDB9LAotCXsweDM1RTEsIDB4OTR9LAotCXsweDM1RTYsIDB4MTh9LC8qIEZJRERMRURBUktDQUwqLwotCXsweDM1RTcsIDB4MkZ9LAotCXsweDM1RTgsIDB4MDN9LC8qIFNUT1JFRElTVEFOQ0VBVFNUT1BTVFJFQU1JTkcqLwotCXsweDM1RTksIDB4OTN9LAotCXsweDM1RUEsIDB4MTh9LC8qIEJSVUNFRklYKi8KLQl7MHgzNUVCLCAweDk5fSwKLQl7MHgzNUVDLCAweDAwfSwvKiBGSVhEQVRBWEZFUlNUQVRVU1JFRyovCi0JezB4MzVFRCwgMHhBM30sCi0JezB4MzVFRSwgMHgyMX0sLyogRk9DVVNESVNUQU5DRVVQREFURSovCi0JezB4MzVFRiwgMHg1Qn0sCi0JezB4MzVGMCwgMHgwRX0sLyogU0tJUEVET0ZSRVNFVCovCi0JezB4MzVGMSwgMHg3NH0sCi0JezB4MzVGMiwgMHgwNH0sCi0JezB4MzVGMywgMHg2NH0sCi0JezB4MzVGNCwgMHgwNH0sCi0JezB4MzVGNSwgMHg2NX0sCi0JezB4MzVGNiwgMHgwNH0sCi0JezB4MzVGNywgMHg3Qn0sCi0JezB4MzVGOCwgMHgwNH0sCi0JezB4MzVGOSwgMHg3Q30sCi0JezB4MzVGQSwgMHgwNH0sCi0JezB4MzVGQiwgMHhERH0sCi0JezB4MzVGQywgMHgwNH0sCi0JezB4MzVGRCwgMHhERX0sCi0JezB4MzVGRSwgMHgwNH0sCi0JezB4MzVGRiwgMHhFRn0sCi0JezB4MzYwMCwgMHgwNH0sCi0JezB4MzYwMSwgMHhGMH0sCi0JLypKdW1wL0RhdGE6Ki8KLQl7MHgzNUMyLCAweDNGfSwvKiBKdW1wIFJlZyovCi0JezB4MzVDMywgMHhGRn0sLyogSnVtcCBSZWcqLwotCXsweDM1QzQsIDB4M0Z9LC8qIERhdGEgUmVnKi8KLQl7MHgzNUM1LCAweEMwfSwvKiBEYXRhIFJlZyovCi0JezB4MzVDMCwgMHgwMX0sLyogRW5hYmxlKi8KLQotfTsKLQotc3RhdGljIHN0cnVjdCB2eDY5NTNfaTJjX3JlZ19jb25mIGVkb2ZfdGJsW10gPSB7Ci0JezB4YTA5OCwgMHgwMn0sCi0JezB4YTA5OSwgMHg4N30sCi0JezB4YTA5YywgMHgwMH0sCi0JezB4YTA5ZCwgMHhjNX0sCi0JezB4YTRlYywgMHgwNX0sCi0JezB4YTRlZCwgMHgwNX0sCi0JezB4YTRmMCwgMHgwNH0sCi0JezB4YTRmMSwgMHgwNH0sCi0JezB4YTRmNCwgMHgwNH0sCi0JezB4YTRmNSwgMHgwNX0sCi0JezB4YTRmOCwgMHgwNX0sCi0JezB4YTRmOSwgMHgwN30sCi0JezB4YTRmYywgMHgwN30sCi0JezB4YTRmZCwgMHgwN30sCi0JezB4YTUwMCwgMHgwN30sCi0JezB4YTUwMSwgMHgwN30sCi0JezB4YTUwNCwgMHgwOH0sCi0JezB4YTUwNSwgMHgwOH0sCi0JezB4YTUxOCwgMHgwMX0sCi0JezB4YTUxOSwgMHgwMn0sCi0JezB4YTUxYywgMHgwMX0sCi0JezB4YTUxZCwgMHgwMH0sCi0JezB4YTUzNCwgMHgwMH0sCi0JezB4YTUzNSwgMHgwNH0sCi0JezB4YTUzOCwgMHgwNH0sCi0JezB4YTUzOSwgMHgwM30sCi0JezB4YTUzYywgMHgwNX0sCi0JezB4YTUzZCwgMHgwN30sCi0JezB4YTU0MCwgMHgwN30sCi0JezB4YTU0MSwgMHgwNn0sCi0JezB4YTU0NCwgMHgwN30sCi0JezB4YTU0NSwgMHgwNn0sCi0JezB4YTU0OCwgMHgwNX0sCi0JezB4YTU0OSwgMHgwNn0sCi0JezB4YTU0YywgMHgwNn0sCi0JezB4YTU0ZCwgMHgwN30sCi0JezB4YTU1MCwgMHgwN30sCi0JezB4YTU1MSwgMHgwNH0sCi0JezB4YTU1NCwgMHgwNH0sCi0JezB4YTU1NSwgMHgwNH0sCi0JezB4YTU1OCwgMHgwNX0sCi0JezB4YTU1OSwgMHgwNn0sCi0JezB4YTU1YywgMHgwN30sCi0JezB4YTU1ZCwgMHgwN30sCi0JezB4YTU2YywgMHgwMH0sCi0JezB4YTU2ZCwgMHgwYX0sCi0JezB4YTU3MCwgMHgwOH0sCi0JezB4YTU3MSwgMHgwNX0sCi0JezB4YTU3NCwgMHgwNH0sCi0JezB4YTU3NSwgMHgwM30sCi0JezB4YTU3OCwgMHgwNH0sCi0JezB4YTU3OSwgMHgwNH0sCi0JezB4YTU4YywgMHgxZn0sCi0JezB4YTU4ZCwgMHgxYn0sCi0JezB4YTU5MCwgMHgxN30sCi0JezB4YTU5MSwgMHgxM30sCi0JezB4YTU5NCwgMHgxMH0sCi0JezB4YTU5NSwgMHgwZH0sCi0JezB4YTU5OCwgMHgwZn0sCi0JezB4YTU5OSwgMHgxMX0sCi0JezB4YTU5YywgMHgwM30sCi0JezB4YTU5ZCwgMHgwM30sCi0JezB4YTVhMCwgMHgwM30sCi0JezB4YTVhMSwgMHgwM30sCi0JezB4YTVhNCwgMHgwM30sCi0JezB4YTVhNSwgMHgwNH0sCi0JezB4YTVhOCwgMHgwNX0sCi0JezB4YTVhOSwgMHgwMH0sCi0JezB4YTVhYywgMHgwMH0sCi0JezB4YTVhZCwgMHgwMH0sCi0JezB4YTViMCwgMHgwMH0sCi0JezB4YTViMSwgMHgwMH0sCi0JezB4YTViNCwgMHgwMH0sCi0JezB4YTViNSwgMHgwMH0sCi0JezB4YTVjNCwgMHgxZn0sCi0JezB4YTVjNSwgMHgxM30sCi0JezB4YTVjOCwgMHgxNH0sCi0JezB4YTVjOSwgMHgxNH0sCi0JezB4YTVjYywgMHgxNH0sCi0JezB4YTVjZCwgMHgxM30sCi0JezB4YTVkMCwgMHgxN30sCi0JezB4YTVkMSwgMHgxYX0sCi0JezB4YTVmNCwgMHgwNX0sCi0JezB4YTVmNSwgMHgwNX0sCi0JezB4YTVmOCwgMHgwNX0sCi0JezB4YTVmOSwgMHgwNn0sCi0JezB4YTVmYywgMHgwNn0sCi0JezB4YTVmZCwgMHgwNn0sCi0JezB4YTYwMCwgMHgwNn0sCi0JezB4YTYwMSwgMHgwNn0sCi0JezB4YTYwOCwgMHgwN30sCi0JezB4YTYwOSwgMHgwOH0sCi0JezB4YTYwYywgMHgwOH0sCi0JezB4YTYwZCwgMHgwN30sCi0JezB4YTYzYywgMHgwMH0sCi0JezB4YTYzZCwgMHgwMn0sCi0JezB4YTY0MCwgMHgwMn0sCi0JezB4YTY0MSwgMHgwMn0sCi0JezB4YTY0NCwgMHgwMn0sCi0JezB4YTY0NSwgMHgwMn0sCi0JezB4YTY0OCwgMHgwM30sCi0JezB4YTY0OSwgMHgwNH0sCi0JezB4YTY0YywgMHgwYX0sCi0JezB4YTY0ZCwgMHgwOX0sCi0JezB4YTY1MCwgMHgwOH0sCi0JezB4YTY1MSwgMHgwOX0sCi0JezB4YTY1NCwgMHgwOX0sCi0JezB4YTY1NSwgMHgwYX0sCi0JezB4YTY1OCwgMHgwYX0sCi0JezB4YTY1OSwgMHgwYX0sCi0JezB4YTY1YywgMHgwYX0sCi0JezB4YTY1ZCwgMHgwOX0sCi0JezB4YTY2MCwgMHgwOX0sCi0JezB4YTY2MSwgMHgwOX0sCi0JezB4YTY2NCwgMHgwOX0sCi0JezB4YTY2NSwgMHgwOH0sCi0JezB4YTY4MCwgMHgwMX0sCi0JezB4YTY4MSwgMHgwMn0sCi0JezB4YTY5NCwgMHgxZn0sCi0JezB4YTY5NSwgMHgxMH0sCi0JezB4YTY5OCwgMHgwZX0sCi0JezB4YTY5OSwgMHgwY30sCi0JezB4YTY5YywgMHgwZH0sCi0JezB4YTY5ZCwgMHgwZH0sCi0JezB4YTZhMCwgMHgwZn0sCi0JezB4YTZhMSwgMHgxMX0sCi0JezB4YTZhNCwgMHgwMH0sCi0JezB4YTZhNSwgMHgwMH0sCi0JezB4YTZhOCwgMHgwMH0sCi0JezB4YTZhOSwgMHgwMH0sCi0JezB4YTZhYywgMHgwMH0sCi0JezB4YTZhZCwgMHgwMH0sCi0JezB4YTZiMCwgMHgwMH0sCi0JezB4YTZiMSwgMHgwNH0sCi0JezB4YTZiNCwgMHgwNH0sCi0JezB4YTZiNSwgMHgwNH0sCi0JezB4YTZiOCwgMHgwNH0sCi0JezB4YTZiOSwgMHgwNH0sCi0JezB4YTZiYywgMHgwNX0sCi0JezB4YTZiZCwgMHgwNX0sCi0JezB4YTZjMCwgMHgxZn0sCi0JezB4YTZjMSwgMHgxZn0sCi0JezB4YTZjNCwgMHgxZn0sCi0JezB4YTZjNSwgMHgxZn0sCi0JezB4YTZjOCwgMHgxZn0sCi0JezB4YTZjOSwgMHgxZn0sCi0JezB4YTZjYywgMHgxZn0sCi0JezB4YTZjZCwgMHgwYn0sCi0JezB4YTZkMCwgMHgwY30sCi0JezB4YTZkMSwgMHgwZH0sCi0JezB4YTZkNCwgMHgwZH0sCi0JezB4YTZkNSwgMHgwZH0sCi0JezB4YTZkOCwgMHgxMX0sCi0JezB4YTZkOSwgMHgxNH0sCi0JezB4YTZmYywgMHgwMn0sCi0JezB4YTZmZCwgMHgwM30sCi0JezB4YTcwMCwgMHgwM30sCi0JezB4YTcwMSwgMHgwM30sCi0JezB4YTcwNCwgMHgwM30sCi0JezB4YTcwNSwgMHgwNH0sCi0JezB4YTcwOCwgMHgwNX0sCi0JezB4YTcwOSwgMHgwMn0sCi0JezB4YTcwYywgMHgwMn0sCi0JezB4YTcwZCwgMHgwMn0sCi0JezB4YTcxMCwgMHgwM30sCi0JezB4YTcxMSwgMHgwNH0sCi0JezB4YTcxNCwgMHgwNH0sCi0JezB4YTcxNSwgMHgwNH0sCi0JezB4YTc0NCwgMHgwMH0sCi0JezB4YTc0NSwgMHgwM30sCi0JezB4YTc0OCwgMHgwNH0sCi0JezB4YTc0OSwgMHgwNH0sCi0JezB4YTc0YywgMHgwNX0sCi0JezB4YTc0ZCwgMHgwNn0sCi0JezB4YTc1MCwgMHgwN30sCi0JezB4YTc1MSwgMHgwN30sCi0JezB4YTc1NCwgMHgwNX0sCi0JezB4YTc1NSwgMHgwNX0sCi0JezB4YTc1OCwgMHgwNX0sCi0JezB4YTc1OSwgMHgwNX0sCi0JezB4YTc1YywgMHgwNX0sCi0JezB4YTc1ZCwgMHgwNn0sCi0JezB4YTc2MCwgMHgwN30sCi0JezB4YTc2MSwgMHgwN30sCi0JezB4YTc2NCwgMHgwNn0sCi0JezB4YTc2NSwgMHgwNX0sCi0JezB4YTc2OCwgMHgwNX0sCi0JezB4YTc2OSwgMHgwNX0sCi0JezB4YTc2YywgMHgwNn0sCi0JezB4YTc2ZCwgMHgwN30sCi0JezB4YTc3YywgMHgwMH0sCi0JezB4YTc3ZCwgMHgwNX0sCi0JezB4YTc4MCwgMHgwNX0sCi0JezB4YTc4MSwgMHgwNX0sCi0JezB4YTc4NCwgMHgwNX0sCi0JezB4YTc4NSwgMHgwNH0sCi0JezB4YTc4OCwgMHgwNX0sCi0JezB4YTc4OSwgMHgwNn0sCi0JezB4YTc5YywgMHgxZn0sCi0JezB4YTc5ZCwgMHgxNX0sCi0JezB4YTdhMCwgMHgxM30sCi0JezB4YTdhMSwgMHgxMH0sCi0JezB4YTdhNCwgMHgwZn0sCi0JezB4YTdhNSwgMHgwZH0sCi0JezB4YTdhOCwgMHgxMX0sCi0JezB4YTdhOSwgMHgxNH0sCi0JezB4YTdhYywgMHgwMn0sCi0JezB4YTdhZCwgMHgwMn0sCi0JezB4YTdiMCwgMHgwMn0sCi0JezB4YTdiMSwgMHgwMn0sCi0JezB4YTdiNCwgMHgwMn0sCi0JezB4YTdiNSwgMHgwM30sCi0JezB4YTdiOCwgMHgwM30sCi0JezB4YTdiOSwgMHgwMH0sCi0JezB4YTdiYywgMHgwMH0sCi0JezB4YTdiZCwgMHgwMH0sCi0JezB4YTdjMCwgMHgwMH0sCi0JezB4YTdjMSwgMHgwMH0sCi0JezB4YTdjNCwgMHgwMH0sCi0JezB4YTdjNSwgMHgwMH0sCi0JezB4YTdkNCwgMHgxZn0sCi0JezB4YTdkNSwgMHgwZH0sCi0JezB4YTdkOCwgMHgwZn0sCi0JezB4YTdkOSwgMHgxMH0sCi0JezB4YTdkYywgMHgxMH0sCi0JezB4YTdkZCwgMHgxMH0sCi0JezB4YTdlMCwgMHgxM30sCi0JezB4YTdlMSwgMHgxNn0sCi0JezB4YTdmNCwgMHgwMH0sCi0JezB4YTdmNSwgMHgwM30sCi0JezB4YTdmOCwgMHgwNH0sCi0JezB4YTdmOSwgMHgwNH0sCi0JezB4YTdmYywgMHgwNH0sCi0JezB4YTdmZCwgMHgwM30sCi0JezB4YTgwMCwgMHgwM30sCi0JezB4YTgwMSwgMHgwM30sCi0JezB4YTgwNCwgMHgwM30sCi0JezB4YTgwNSwgMHgwM30sCi0JezB4YTgwOCwgMHgwM30sCi0JezB4YTgwOSwgMHgwM30sCi0JezB4YTgwYywgMHgwM30sCi0JezB4YTgwZCwgMHgwNH0sCi0JezB4YTgxMCwgMHgwNH0sCi0JezB4YTgxMSwgMHgwYX0sCi0JezB4YTgxNCwgMHgwYX0sCi0JezB4YTgxNSwgMHgwYX0sCi0JezB4YTgxOCwgMHgwZn0sCi0JezB4YTgxOSwgMHgxNH0sCi0JezB4YTgxYywgMHgxNH0sCi0JezB4YTgxZCwgMHgxNH0sCi0JezB4YTgyYywgMHgwMH0sCi0JezB4YTgyZCwgMHgwNH0sCi0JezB4YTgzMCwgMHgwMn0sCi0JezB4YTgzMSwgMHgwMH0sCi0JezB4YTgzNCwgMHgwMH0sCi0JezB4YTgzNSwgMHgwMH0sCi0JezB4YTgzOCwgMHgwMH0sCi0JezB4YTgzOSwgMHgwMH0sCi0JezB4YTg0MCwgMHgxZn0sCi0JezB4YTg0MSwgMHgxZn0sCi0JezB4YTg0OCwgMHgxZn0sCi0JezB4YTg0OSwgMHgxZn0sCi0JezB4YTg0YywgMHgxZn0sCi0JezB4YTg0ZCwgMHgwY30sCi0JezB4YTg1MCwgMHgwY30sCi0JezB4YTg1MSwgMHgwY30sCi0JezB4YTg1NCwgMHgwY30sCi0JezB4YTg1NSwgMHgwY30sCi0JezB4YTg1OCwgMHgwY30sCi0JezB4YTg1OSwgMHgwY30sCi0JezB4YTg1YywgMHgwY30sCi0JezB4YTg1ZCwgMHgwY30sCi0JezB4YTg2MCwgMHgwY30sCi0JezB4YTg2MSwgMHgwY30sCi0JezB4YTg2NCwgMHgwY30sCi0JezB4YTg2NSwgMHgwY30sCi0JezB4YTg2OCwgMHgwY30sCi0JezB4YTg2OSwgMHgwY30sCi0JezB4YTg2YywgMHgwY30sCi0JezB4YTg2ZCwgMHgwY30sCi0JezB4YTg3MCwgMHgwY30sCi0JezB4YTg3MSwgMHgwY30sCi0JezB4YTg3NCwgMHgwY30sCi0JezB4YTg3NSwgMHgwY30sCi0JezB4YTg3OCwgMHgxZn0sCi0JezB4YTg3OSwgMHgxZn0sCi0JezB4YTg3YywgMHgxZn0sCi0JezB4YTg3ZCwgMHgxZn0sCi0JezB4YTg4MCwgMHgxZn0sCi0JezB4YTg4MSwgMHgxZn0sCi0JezB4YTg4NCwgMHgxZn0sCi0JezB4YTg4NSwgMHgwY30sCi0JezB4YTg4OCwgMHgwY30sCi0JezB4YTg4OSwgMHgwY30sCi0JezB4YTg4YywgMHgwY30sCi0JezB4YTg4ZCwgMHgwY30sCi0JezB4YTg5MCwgMHgwY30sCi0JezB4YTg5MSwgMHgwY30sCi0JezB4YTg5OCwgMHgxZn0sCi0JezB4YTg5OSwgMHgxZn0sCi0JezB4YThhMCwgMHgxZn0sCi0JezB4YThhMSwgMHgxZn0sCi0JezB4YThhNCwgMHgxZn0sCi0JezB4YThhNSwgMHgwY30sCi0JezB4YThhOCwgMHgwY30sCi0JezB4YThhOSwgMHgwY30sCi0JezB4YThhYywgMHgwY30sCi0JezB4YThhZCwgMHgwY30sCi0JezB4YThiMCwgMHgwY30sCi0JezB4YThiMSwgMHgwY30sCi0JezB4YThiNCwgMHgwY30sCi0JezB4YThiNSwgMHgwY30sCi0JezB4YThiOCwgMHgwY30sCi0JezB4YThiOSwgMHgwY30sCi0JezB4YThiYywgMHgwY30sCi0JezB4YThiZCwgMHgwY30sCi0JezB4YThjMCwgMHgwY30sCi0JezB4YThjMSwgMHgwY30sCi0JezB4YThjNCwgMHgwY30sCi0JezB4YThjNSwgMHgwY30sCi0JezB4YThjOCwgMHgwY30sCi0JezB4YThjOSwgMHgwY30sCi0JezB4YThjYywgMHgwY30sCi0JezB4YThjZCwgMHgwY30sCi0JezB4YThkMCwgMHgxZn0sCi0JezB4YThkMSwgMHgxZn0sCi0JezB4YThkNCwgMHgxZn0sCi0JezB4YThkNSwgMHgxZn0sCi0JezB4YThkOCwgMHgxZn0sCi0JezB4YThkOSwgMHgxZn0sCi0JezB4YThkYywgMHgxZn0sCi0JezB4YThkZCwgMHgwY30sCi0JezB4YThlMCwgMHgwY30sCi0JezB4YThlMSwgMHgwY30sCi0JezB4YThlNCwgMHgwY30sCi0JezB4YThlNSwgMHgwY30sCi0JezB4YThlOCwgMHgwY30sCi0JezB4YThlOSwgMHgwY30sCi0JezB4YThmMCwgMHgxZn0sCi0JezB4YThmMSwgMHgxZn0sCi0JezB4YThmOCwgMHgxZn0sCi0JezB4YThmOSwgMHgxZn0sCi0JezB4YThmYywgMHgxZn0sCi0JezB4YThmZCwgMHgwY30sCi0JezB4YTkwMCwgMHgwY30sCi0JezB4YTkwMSwgMHgwY30sCi0JezB4YTkwNCwgMHgwY30sCi0JezB4YTkwNSwgMHgwY30sCi0JezB4YTkwOCwgMHgwY30sCi0JezB4YTkwOSwgMHgwY30sCi0JezB4YTkwYywgMHgwY30sCi0JezB4YTkwZCwgMHgwY30sCi0JezB4YTkxMCwgMHgwY30sCi0JezB4YTkxMSwgMHgwY30sCi0JezB4YTkxNCwgMHgwY30sCi0JezB4YTkxNSwgMHgwY30sCi0JezB4YTkxOCwgMHgwY30sCi0JezB4YTkxOSwgMHgwY30sCi0JezB4YTkxYywgMHgwY30sCi0JezB4YTkxZCwgMHgwY30sCi0JezB4YTkyMCwgMHgwY30sCi0JezB4YTkyMSwgMHgwY30sCi0JezB4YTkyNCwgMHgwY30sCi0JezB4YTkyNSwgMHgwY30sCi0JezB4YTkyOCwgMHgxZn0sCi0JezB4YTkyOSwgMHgxZn0sCi0JezB4YTkyYywgMHgxZn0sCi0JezB4YTkyZCwgMHgxZn0sCi0JezB4YTkzMCwgMHgxZn0sCi0JezB4YTkzMSwgMHgxZn0sCi0JezB4YTkzNCwgMHgxZn0sCi0JezB4YTkzNSwgMHgwY30sCi0JezB4YTkzOCwgMHgwY30sCi0JezB4YTkzOSwgMHgwY30sCi0JezB4YTkzYywgMHgwY30sCi0JezB4YTkzZCwgMHgwY30sCi0JezB4YTk0MCwgMHgwY30sCi0JezB4YTk0MSwgMHgwY30sCi0JezB4YTk2YywgMHgwZH0sCi0JezB4YTk2ZCwgMHgxNn0sCi0JezB4YTk3MCwgMHgxOX0sCi0JezB4YTk3MSwgMHgwZX0sCi0JezB4YTk3NCwgMHgxNn0sCi0JezB4YTk3NSwgMHgxYX0sCi0JezB4YTk3OCwgMHgwZH0sCi0JezB4YTk3OSwgMHgxNX0sCi0JezB4YTk3YywgMHgxOX0sCi0JezB4YTk3ZCwgMHgwZH0sCi0JezB4YTk4MCwgMHgxNX0sCi0JezB4YTk4MSwgMHgxYX0sCi0JezB4YTk4NCwgMHgwZH0sCi0JezB4YTk4NSwgMHgxNX0sCi0JezB4YTk4OCwgMHgxYX0sCi0JezB4YTk4OSwgMHgwZH0sCi0JezB4YTk4YywgMHgxNX0sCi0JezB4YTk4ZCwgMHgxYX0sCi0JezB4YTk5MCwgMHgwYn0sCi0JezB4YTk5MSwgMHgxMX0sCi0JezB4YTk5NCwgMHgwMn0sCi0JezB4YTk5NSwgMHgwZX0sCi0JezB4YTk5OCwgMHgxNn0sCi0JezB4YTk5OSwgMHgwMn0sCi0JezB4YTk5YywgMHgwY30sCi0JezB4YTk5ZCwgMHgxM30sCi0JezB4YTlhMCwgMHgwMn0sCi0JezB4YTlhMSwgMHgwY30sCi0JezB4YTlhNCwgMHgxMn0sCi0JezB4YTlhNSwgMHgwMn0sCi0JezB4YTlhOCwgMHgwY30sCi0JezB4YTlhOSwgMHgxMn0sCi0JezB4YTlhYywgMHgwMn0sCi0JezB4YTlhZCwgMHgwY30sCi0JezB4YTliMCwgMHgxMn0sCi0JezB4YTliMSwgMHgwMn0sCi0JezB4YTliNCwgMHgxMH0sCi0JezB4YTliNSwgMHgxZX0sCi0JezB4YTliOCwgMHgwZn0sCi0JezB4YTliOSwgMHgxM30sCi0JezB4YTliYywgMHgyMH0sCi0JezB4YTliZCwgMHgxMH0sCi0JezB4YTljMCwgMHgxMX0sCi0JezB4YTljMSwgMHgxZX0sCi0JezB4YTljNCwgMHgxMH0sCi0JezB4YTljNSwgMHgxMX0sCi0JezB4YTljOCwgMHgxZX0sCi0JezB4YTljOSwgMHgxMH0sCi0JezB4YTljYywgMHgxMX0sCi0JezB4YTljZCwgMHgyMH0sCi0JezB4YTlkMCwgMHgxMH0sCi0JezB4YTlkMSwgMHgxM30sCi0JezB4YTlkNCwgMHgyNH0sCi0JezB4YTlkNSwgMHgxMH0sCi0JezB4YTlmMCwgMHgwMn0sCi0JezB4YTlmMSwgMHgwMX0sCi0JezB4YTlmOCwgMHgxOX0sCi0JezB4YTlmOSwgMHgwYn0sCi0JezB4YTlmYywgMHgwYX0sCi0JezB4YTlmZCwgMHgwN30sCi0JezB4YWEwMCwgMHgwY30sCi0JezB4YWEwMSwgMHgwZX0sCi0JezB4YWEwOCwgMHgwY30sCi0JezB4YWEwOSwgMHgwNn0sCi0JezB4YWEwYywgMHgwY30sCi0JezB4YWEwZCwgMHgwYX0sCi0JezB4YWEyNCwgMHgxMH0sCi0JezB4YWEyNSwgMHgxMn0sCi0JezB4YWEyOCwgMHgwYn0sCi0JezB4YWEyOSwgMHgwN30sCi0JezB4YWEyYywgMHgxMH0sCi0JezB4YWEyZCwgMHgxNH0sCi0JezB4YWEzNCwgMHgwZX0sCi0JezB4YWEzNSwgMHgwZX0sCi0JezB4YWEzOCwgMHgwN30sCi0JezB4YWEzOSwgMHgwN30sCi0JezB4YWEzYywgMHgwZX0sCi0JezB4YWEzZCwgMHgwY30sCi0JezB4YWE0OCwgMHgwOX0sCi0JezB4YWE0OSwgMHgwY30sCi0JezB4YWE0YywgMHgwY30sCi0JezB4YWE0ZCwgMHgwN30sCi0JezB4YWE1NCwgMHgwOH0sCi0JezB4YWE1NSwgMHgwNn0sCi0JezB4YWE1OCwgMHgwNH0sCi0JezB4YWE1OSwgMHgwNX0sCi0JezB4YWE1YywgMHgwNn0sCi0JezB4YWE1ZCwgMHgwNn0sCi0JezB4YWE2OCwgMHgwNX0sCi0JezB4YWE2OSwgMHgwNX0sCi0JezB4YWE2YywgMHgwNH0sCi0JezB4YWE2ZCwgMHgwNX0sCi0JezB4YWE3NCwgMHgwNn0sCi0JezB4YWE3NSwgMHgwNH0sCi0JezB4YWE3OCwgMHgwNX0sCi0JezB4YWE3OSwgMHgwNX0sCi0JezB4YWE3YywgMHgwNH0sCi0JezB4YWE3ZCwgMHgwNn0sCi0JezB4YWMxOCwgMHgxNH0sCi0JezB4YWMxOSwgMHgwMH0sCi0JezB4YWMxYywgMHgxNH0sCi0JezB4YWMxZCwgMHgwMH0sCi0JezB4YWMyMCwgMHgxNH0sCi0JezB4YWMyMSwgMHgwMH0sCi0JezB4YWMyNCwgMHgxNH0sCi0JezB4YWMyNSwgMHgwMH0sCi0JezB4YWMyOCwgMHgxNH0sCi0JezB4YWMyOSwgMHgwMH0sCi0JezB4YWMyYywgMHgxNH0sCi0JezB4YWMyZCwgMHgwMH0sCi0JezB4YWMzNCwgMHgxNn0sCi0JezB4YWMzNSwgMHgwMH0sCi0JezB4YWMzOCwgMHgxNn0sCi0JezB4YWMzOSwgMHgwMH0sCi0JezB4YWMzYywgMHgxNn0sCi0JezB4YWMzZCwgMHgwMH0sCi0JezB4YWM0MCwgMHgxNn0sCi0JezB4YWM0MSwgMHgwMH0sCi0JezB4YWM0NCwgMHgxNn0sCi0JezB4YWM0NSwgMHgwMH0sCi0JezB4YWM0OCwgMHgxNn0sCi0JezB4YWM0OSwgMHgwMH0sCi0JezB4YWM1MCwgMHgxYn0sCi0JezB4YWM1MSwgMHgwMH0sCi0JezB4YWM1NCwgMHgxYn0sCi0JezB4YWM1NSwgMHgwMH0sCi0JezB4YWM1OCwgMHgxYn0sCi0JezB4YWM1OSwgMHgwMH0sCi0JezB4YWM1YywgMHgxYn0sCi0JezB4YWM1ZCwgMHgwMH0sCi0JezB4YWM2MCwgMHgxYn0sCi0JezB4YWM2MSwgMHgwMH0sCi0JezB4YWM2NCwgMHgxYn0sCi0JezB4YWM2NSwgMHgwMH0sCi0JezB4YWM3NCwgMHgwOX0sCi0JezB4YWM3NSwgMHgwY30sCi0JezB4YWM3OCwgMHgwZn0sCi0JezB4YWM3OSwgMHgxMX0sCi0JezB4YWM3YywgMHgxMn0sCi0JezB4YWM3ZCwgMHgxNH0sCi0JezB4YWM4MCwgMHgwOX0sCi0JezB4YWM4MSwgMHgwY30sCi0JezB4YWM4NCwgMHgwZn0sCi0JezB4YWM4NSwgMHgxMX0sCi0JezB4YWM4OCwgMHgxMn0sCi0JezB4YWM4OSwgMHgxNH0sCi0JezB4YWM4YywgMHgwOX0sCi0JezB4YWM4ZCwgMHgwY30sCi0JezB4YWM5MCwgMHgwZn0sCi0JezB4YWM5MSwgMHgxMX0sCi0JezB4YWM5NCwgMHgxMn0sCi0JezB4YWM5NSwgMHgxNH0sCi0JezB4YWM5OCwgMHgwOX0sCi0JezB4YWM5OSwgMHgwY30sCi0JezB4YWM5YywgMHgwZn0sCi0JezB4YWM5ZCwgMHgxMX0sCi0JezB4YWNhMCwgMHgxMn0sCi0JezB4YWNhMSwgMHgxNH0sCi0JezB4YWNhNCwgMHgwOX0sCi0JezB4YWNhNSwgMHgwY30sCi0JezB4YWNhOCwgMHgwZn0sCi0JezB4YWNhOSwgMHgxMX0sCi0JezB4YWNhYywgMHgxMn0sCi0JezB4YWNhZCwgMHgxNH0sCi0JezB4YWNiMCwgMHgwN30sCi0JezB4YWNiMSwgMHgwOX0sCi0JezB4YWNiNCwgMHgwY30sCi0JezB4YWNiNSwgMHgwZH0sCi0JezB4YWNiOCwgMHgwZH0sCi0JezB4YWNiOSwgMHgwZX0sCi0JezB4YWNiYywgMHgwNX0sCi0JezB4YWNiZCwgMHgwN30sCi0JezB4YWNjMCwgMHgwYX0sCi0JezB4YWNjMSwgMHgwYn0sCi0JezB4YWNjNCwgMHgwYn0sCi0JezB4YWNjNSwgMHgwY30sCi0JezB4YWNjOCwgMHgwM30sCi0JezB4YWNjOSwgMHgwNH0sCi0JezB4YWNjYywgMHgwN30sCi0JezB4YWNjZCwgMHgwOH0sCi0JezB4YWNkMCwgMHgwOX0sCi0JezB4YWNkMSwgMHgwOX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgdng2OTUzX2kyY19yZWdfY29uZiBwYXRjaF90YmxfY3V0M1tdID0gewotCXsweEY4MDAsIDB4OTB9LAotCXsweEY4MDEsIDB4MzB9LAotCXsweEY4MDIsIDB4MzF9LAotCXsweEY4MDMsIDB4ZTB9LAotCXsweEY4MDQsIDB4ZjV9LAotCXsweEY4MDUsIDB4N2R9LAotCXsweEY4MDYsIDB4YjR9LAotCXsweEY4MDcsIDB4MDF9LAotCXsweEY4MDgsIDB4MDZ9LAotCXsweEY4MDksIDB4NzV9LAotCXsweEY4MEEsIDB4N2R9LAotCXsweEY4MEIsIDB4MDN9LAotCXsweEY4MEMsIDB4NzR9LAotCXsweEY4MEQsIDB4MDN9LAotCXsweEY4MEUsIDB4ZjB9LAotCXsweEY4MEYsIDB4OTB9LAotCXsweEY4MTAsIDB4MzB9LAotCXsweEY4MTEsIDB4MDR9LAotCXsweEY4MTIsIDB4NzR9LAotCXsweEY4MTMsIDB4MzN9LAotCXsweEY4MTQsIDB4ZjB9LAotCXsweEY4MTUsIDB4OTB9LAotCXsweEY4MTYsIDB4MzB9LAotCXsweEY4MTcsIDB4MDZ9LAotCXsweEY4MTgsIDB4ZTR9LAotCXsweEY4MTksIDB4ZjB9LAotCXsweEY4MUEsIDB4YTN9LAotCXsweEY4MUIsIDB4NzR9LAotCXsweEY4MUMsIDB4MDl9LAotCXsweEY4MUQsIDB4ZjB9LAotCXsweEY4MUUsIDB4OTB9LAotCXsweEY4MUYsIDB4MzB9LAotCXsweEY4MjAsIDB4MTB9LAotCXsweEY4MjEsIDB4ZTR9LAotCXsweEY4MjIsIDB4ZjB9LAotCXsweEY4MjMsIDB4YTN9LAotCXsweEY4MjQsIDB4ZjB9LAotCXsweEY4MjUsIDB4OTB9LAotCXsweEY4MjYsIDB4MzB9LAotCXsweEY4MjcsIDB4MTZ9LAotCXsweEY4MjgsIDB4NzR9LAotCXsweEY4MjksIDB4MWV9LAotCXsweEY4MkEsIDB4ZjB9LAotCXsweEY4MkIsIDB4OTB9LAotCXsweEY4MkMsIDB4MzB9LAotCXsweEY4MkQsIDB4MWF9LAotCXsweEY4MkUsIDB4NzR9LAotCXsweEY4MkYsIDB4NmF9LAotCXsweEY4MzAsIDB4ZjB9LAotCXsweEY4MzEsIDB4YTN9LAotCXsweEY4MzIsIDB4NzR9LAotCXsweEY4MzMsIDB4Mjl9LAotCXsweEY4MzQsIDB4ZjB9LAotCXsweEY4MzUsIDB4OTB9LAotCXsweEY4MzYsIDB4MzB9LAotCXsweEY4MzcsIDB4MzB9LAotCXsweEY4MzgsIDB4NzR9LAotCXsweEY4MzksIDB4MDh9LAotCXsweEY4M0EsIDB4ZjB9LAotCXsweEY4M0IsIDB4OTB9LAotCXsweEY4M0MsIDB4MzB9LAotCXsweEY4M0QsIDB4MzZ9LAotCXsweEY4M0UsIDB4NzR9LAotCXsweEY4M0YsIDB4MmN9LAotCXsweEY4NDAsIDB4ZjB9LAotCXsweEY4NDEsIDB4OTB9LAotCXsweEY4NDIsIDB4MzB9LAotCXsweEY4NDMsIDB4NDF9LAotCXsweEY4NDQsIDB4ZTR9LAotCXsweEY4NDUsIDB4ZjB9LAotCXsweEY4NDYsIDB4YTN9LAotCXsweEY4NDcsIDB4NzR9LAotCXsweEY4NDgsIDB4MjR9LAotCXsweEY4NDksIDB4ZjB9LAotCXsweEY4NEEsIDB4OTB9LAotCXsweEY4NEIsIDB4MzB9LAotCXsweEY4NEMsIDB4NDV9LAotCXsweEY4NEQsIDB4NzR9LAotCXsweEY4NEUsIDB4ODF9LAotCXsweEY4NEYsIDB4ZjB9LAotCXsweEY4NTAsIDB4OTB9LAotCXsweEY4NTEsIDB4MzB9LAotCXsweEY4NTIsIDB4OTh9LAotCXsweEY4NTMsIDB4NzR9LAotCXsweEY4NTQsIDB4MDF9LAotCXsweEY4NTUsIDB4ZjB9LAotCXsweEY4NTYsIDB4OTB9LAotCXsweEY4NTcsIDB4MzB9LAotCXsweEY4NTgsIDB4OWR9LAotCXsweEY4NTksIDB4NzR9LAotCXsweEY4NUEsIDB4MDV9LAotCXsweEY4NUIsIDB4ZjB9LAotCXsweEY4NUMsIDB4ZTV9LAotCXsweEY4NUQsIDB4N2R9LAotCXsweEY4NUUsIDB4NzB9LAotCXsweEY4NUYsIDB4MTB9LAotCXsweEY4NjAsIDB4OTB9LAotCXsweEY4NjEsIDB4MzB9LAotCXsweEY4NjIsIDB4MDV9LAotCXsweEY4NjMsIDB4MDR9LAotCXsweEY4NjQsIDB4ZjB9LAotCXsweEY4NjUsIDB4OTB9LAotCXsweEY4NjYsIDB4MzB9LAotCXsweEY4NjcsIDB4MzB9LAotCXsweEY4NjgsIDB4ZTR9LAotCXsweEY4NjksIDB4ZjB9LAotCXsweEY4NkEsIDB4OTB9LAotCXsweEY4NkIsIDB4MzB9LAotCXsweEY4NkMsIDB4MzV9LAotCXsweEY4NkQsIDB4MDR9LAotCXsweEY4NkUsIDB4ZjB9LAotCXsweEY4NkYsIDB4MjJ9LAotCXsweEY4NzAsIDB4ZTV9LAotCXsweEY4NzEsIDB4N2R9LAotCXsweEY4NzIsIDB4NjR9LAotCXsweEY4NzMsIDB4MDJ9LAotCXsweEY4NzQsIDB4NzB9LAotCXsweEY4NzUsIDB4MmR9LAotCXsweEY4NzYsIDB4OTB9LAotCXsweEY4NzcsIDB4MzB9LAotCXsweEY4NzgsIDB4MDR9LAotCXsweEY4NzksIDB4NzR9LAotCXsweEY4N0EsIDB4MzR9LAotCXsweEY4N0IsIDB4ZjB9LAotCXsweEY4N0MsIDB4YTN9LAotCXsweEY4N0QsIDB4NzR9LAotCXsweEY4N0UsIDB4MDd9LAotCXsweEY4N0YsIDB4ZjB9LAotCXsweEY4ODAsIDB4OTB9LAotCXsweEY4ODEsIDB4MzB9LAotCXsweEY4ODIsIDB4MTB9LAotCXsweEY4ODMsIDB4NzR9LAotCXsweEY4ODQsIDB4MTB9LAotCXsweEY4ODUsIDB4ZjB9LAotCXsweEY4ODYsIDB4OTB9LAotCXsweEY4ODcsIDB4MzB9LAotCXsweEY4ODgsIDB4MTZ9LAotCXsweEY4ODksIDB4NzR9LAotCXsweEY4OEEsIDB4MWZ9LAotCXsweEY4OEIsIDB4ZjB9LAotCXsweEY4OEMsIDB4OTB9LAotCXsweEY4OEQsIDB4MzB9LAotCXsweEY4OEUsIDB4MWF9LAotCXsweEY4OEYsIDB4NzR9LAotCXsweEY4OTAsIDB4NjJ9LAotCXsweEY4OTEsIDB4ZjB9LAotCXsweEY4OTIsIDB4OTB9LAotCXsweEY4OTMsIDB4MzB9LAotCXsweEY4OTQsIDB4MzV9LAotCXsweEY4OTUsIDB4NzR9LAotCXsweEY4OTYsIDB4MDR9LAotCXsweEY4OTcsIDB4ZjB9LAotCXsweEY4OTgsIDB4OTB9LAotCXsweEY4OTksIDB4MzB9LAotCXsweEY4OUEsIDB4NDF9LAotCXsweEY4OUIsIDB4NzR9LAotCXsweEY4OUMsIDB4NjB9LAotCXsweEY4OUQsIDB4ZjB9LAotCXsweEY4OUUsIDB4YTN9LAotCXsweEY4OUYsIDB4NzR9LAotCXsweEY4QTAsIDB4NjR9LAotCXsweEY4QTEsIDB4ZjB9LAotCXsweEY4QTIsIDB4MjJ9LAotCXsweEY4QTMsIDB4ZTV9LAotCXsweEY4QTQsIDB4N2R9LAotCXsweEY4QTUsIDB4YjR9LAotCXsweEY4QTYsIDB4MDN9LAotCXsweEY4QTcsIDB4MTJ9LAotCXsweEY4QTgsIDB4OTB9LAotCXsweEY4QTksIDB4MzB9LAotCXsweEY4QUEsIDB4MDV9LAotCXsweEY4QUIsIDB4NzR9LAotCXsweEY4QUMsIDB4MDN9LAotCXsweEY4QUQsIDB4ZjB9LAotCXsweEY4QUUsIDB4OTB9LAotCXsweEY4QUYsIDB4MzB9LAotCXsweEY4QjAsIDB4MTF9LAotCXsweEY4QjEsIDB4NzR9LAotCXsweEY4QjIsIDB4MDF9LAotCXsweEY4QjMsIDB4ZjB9LAotCXsweEY4QjQsIDB4OTB9LAotCXsweEY4QjUsIDB4MzB9LAotCXsweEY4QjYsIDB4MzV9LAotCXsweEY4QjcsIDB4NzR9LAotCXsweEY4QjgsIDB4MDN9LAotCXsweEY4QjksIDB4ZjB9LAotCXsweEY4QkEsIDB4MjJ9LAotCXsweEY4QkIsIDB4YzN9LAotCXsweEY4QkMsIDB4OTB9LAotCXsweEY4QkQsIDB4MGJ9LAotCXsweEY4QkUsIDB4ODl9LAotCXsweEY4QkYsIDB4ZTB9LAotCXsweEY4QzAsIDB4OTR9LAotCXsweEY4QzEsIDB4MWV9LAotCXsweEY4QzIsIDB4OTB9LAotCXsweEY4QzMsIDB4MGJ9LAotCXsweEY4QzQsIDB4ODh9LAotCXsweEY4QzUsIDB4ZTB9LAotCXsweEY4QzYsIDB4OTR9LAotCXsweEY4QzcsIDB4MDB9LAotCXsweEY4QzgsIDB4NTB9LAotCXsweEY4QzksIDB4MDZ9LAotCXsweEY4Q0EsIDB4N2V9LAotCXsweEY4Q0IsIDB4MDB9LAotCXsweEY4Q0MsIDB4N2Z9LAotCXsweEY4Q0QsIDB4MDF9LAotCXsweEY4Q0UsIDB4ODB9LAotCXsweEY4Q0YsIDB4M2R9LAotCXsweEY4RDAsIDB4YzN9LAotCXsweEY4RDEsIDB4OTB9LAotCXsweEY4RDIsIDB4MGJ9LAotCXsweEY4RDMsIDB4ODl9LAotCXsweEY4RDQsIDB4ZTB9LAotCXsweEY4RDUsIDB4OTR9LAotCXsweEY4RDYsIDB4M2N9LAotCXsweEY4RDcsIDB4OTB9LAotCXsweEY4RDgsIDB4MGJ9LAotCXsweEY4RDksIDB4ODh9LAotCXsweEY4REEsIDB4ZTB9LAotCXsweEY4REIsIDB4OTR9LAotCXsweEY4REMsIDB4MDB9LAotCXsweEY4REQsIDB4NTB9LAotCXsweEY4REUsIDB4MDZ9LAotCXsweEY4REYsIDB4N2V9LAotCXsweEY4RTAsIDB4MDB9LAotCXsweEY4RTEsIDB4N2Z9LAotCXsweEY4RTIsIDB4MDJ9LAotCXsweEY4RTMsIDB4ODB9LAotCXsweEY4RTQsIDB4Mjh9LAotCXsweEY4RTUsIDB4YzN9LAotCXsweEY4RTYsIDB4OTB9LAotCXsweEY4RTcsIDB4MGJ9LAotCXsweEY4RTgsIDB4ODl9LAotCXsweEY4RTksIDB4ZTB9LAotCXsweEY4RUEsIDB4OTR9LAotCXsweEY4RUIsIDB4ZmF9LAotCXsweEY4RUMsIDB4OTB9LAotCXsweEY4RUQsIDB4MGJ9LAotCXsweEY4RUUsIDB4ODh9LAotCXsweEY4RUYsIDB4ZTB9LAotCXsweEY4RjAsIDB4OTR9LAotCXsweEY4RjEsIDB4MDB9LAotCXsweEY4RjIsIDB4NTB9LAotCXsweEY4RjMsIDB4MDZ9LAotCXsweEY4RjQsIDB4N2V9LAotCXsweEY4RjUsIDB4MDB9LAotCXsweEY4RjYsIDB4N2Z9LAotCXsweEY4RjcsIDB4MDN9LAotCXsweEY4RjgsIDB4ODB9LAotCXsweEY4RjksIDB4MTN9LAotCXsweEY4RkEsIDB4YzN9LAotCXsweEY4RkIsIDB4OTB9LAotCXsweEY4RkMsIDB4MGJ9LAotCXsweEY4RkQsIDB4ODh9LAotCXsweEY4RkUsIDB4ZTB9LAotCXsweEY4RkYsIDB4OTR9LAotCXsweEY5MDAsIDB4ODB9LAotCXsweEY5MDEsIDB4NTB9LAotCXsweEY5MDIsIDB4MDZ9LAotCXsweEY5MDMsIDB4N2V9LAotCXsweEY5MDQsIDB4MDB9LAotCXsweEY5MDUsIDB4N2Z9LAotCXsweEY5MDYsIDB4MDR9LAotCXsweEY5MDcsIDB4ODB9LAotCXsweEY5MDgsIDB4MDR9LAotCXsweEY5MDksIDB4YWV9LAotCXsweEY5MEEsIDB4N2V9LAotCXsweEY5MEIsIDB4YWZ9LAotCXsweEY5MEMsIDB4N2Z9LAotCXsweEY5MEQsIDB4OTB9LAotCXsweEY5MEUsIDB4YTB9LAotCXsweEY5MEYsIDB4Zjh9LAotCXsweEY5MTAsIDB4ZWV9LAotCXsweEY5MTEsIDB4ZjB9LAotCXsweEY5MTIsIDB4YTN9LAotCXsweEY5MTMsIDB4ZWZ9LAotCXsweEY5MTQsIDB4ZjB9LAotCXsweEY5MTUsIDB4MjJ9LAotCXsweEY5MTYsIDB4OTB9LAotCXsweEY5MTcsIDB4MzN9LAotCXsweEY5MTgsIDB4ODJ9LAotCXsweEY5MTksIDB4ZTB9LAotCXsweEY5MUEsIDB4ZmZ9LAotCXsweEY5MUIsIDB4NjR9LAotCXsweEY5MUMsIDB4MDF9LAotCXsweEY5MUQsIDB4NzB9LAotCXsweEY5MUUsIDB4MzB9LAotCXsweEY5MUYsIDB4ZTV9LAotCXsweEY5MjAsIDB4N2Z9LAotCXsweEY5MjEsIDB4NjR9LAotCXsweEY5MjIsIDB4MDJ9LAotCXsweEY5MjMsIDB4NDV9LAotCXsweEY5MjQsIDB4N2V9LAotCXsweEY5MjUsIDB4NzB9LAotCXsweEY5MjYsIDB4MDR9LAotCXsweEY5MjcsIDB4N2R9LAotCXsweEY5MjgsIDB4MWV9LAotCXsweEY5MjksIDB4ODB9LAotCXsweEY5MkEsIDB4MWR9LAotCXsweEY5MkIsIDB4ZTV9LAotCXsweEY5MkMsIDB4N2Z9LAotCXsweEY5MkQsIDB4NjR9LAotCXsweEY5MkUsIDB4MDN9LAotCXsweEY5MkYsIDB4NDV9LAotCXsweEY5MzAsIDB4N2V9LAotCXsweEY5MzEsIDB4NzB9LAotCXsweEY5MzIsIDB4MDR9LAotCXsweEY5MzMsIDB4N2R9LAotCXsweEY5MzQsIDB4M2N9LAotCXsweEY5MzUsIDB4ODB9LAotCXsweEY5MzYsIDB4MTF9LAotCXsweEY5MzcsIDB4ZTV9LAotCXsweEY5MzgsIDB4N2Z9LAotCXsweEY5MzksIDB4NjR9LAotCXsweEY5M0EsIDB4MDR9LAotCXsweEY5M0IsIDB4NDV9LAotCXsweEY5M0MsIDB4N2V9LAotCXsweEY5M0QsIDB4NzB9LAotCXsweEY5M0UsIDB4MDR9LAotCXsweEY5M0YsIDB4N2R9LAotCXsweEY5NDAsIDB4ZmF9LAotCXsweEY5NDEsIDB4ODB9LAotCXsweEY5NDIsIDB4MDV9LAotCXsweEY5NDMsIDB4OTB9LAotCXsweEY5NDQsIDB4MzN9LAotCXsweEY5NDUsIDB4ODF9LAotCXsweEY5NDYsIDB4ZTB9LAotCXsweEY5NDcsIDB4ZmR9LAotCXsweEY5NDgsIDB4YWV9LAotCXsweEY5NDksIDB4MDV9LAotCXsweEY5NEEsIDB4OTB9LAotCXsweEY5NEIsIDB4MzN9LAotCXsweEY5NEMsIDB4ODF9LAotCXsweEY5NEQsIDB4ZWR9LAotCXsweEY5NEUsIDB4ZjB9LAotCXsweEY5NEYsIDB4ZWZ9LAotCXsweEY5NTAsIDB4YjR9LAotCXsweEY5NTEsIDB4MDF9LAotCXsweEY5NTIsIDB4MTB9LAotCXsweEY5NTMsIDB4OTB9LAotCXsweEY5NTQsIDB4MDF9LAotCXsweEY5NTUsIDB4MDB9LAotCXsweEY5NTYsIDB4ZTB9LAotCXsweEY5NTcsIDB4NjB9LAotCXsweEY5NTgsIDB4MGF9LAotCXsweEY5NTksIDB4OTB9LAotCXsweEY5NUEsIDB4YTF9LAotCXsweEY5NUIsIDB4MTB9LAotCXsweEY5NUMsIDB4ZTB9LAotCXsweEY5NUQsIDB4ZjV9LAotCXsweEY5NUUsIDB4N2V9LAotCXsweEY5NUYsIDB4YTN9LAotCXsweEY5NjAsIDB4ZTB9LAotCXsweEY5NjEsIDB4ZjV9LAotCXsweEY5NjIsIDB4N2Z9LAotCXsweEY5NjMsIDB4MjJ9LAotCXsweEY5NjQsIDB4MTJ9LAotCXsweEY5NjUsIDB4MmZ9LAotCXsweEY5NjYsIDB4NGR9LAotCXsweEY5NjcsIDB4OTB9LAotCXsweEY5NjgsIDB4MzV9LAotCXsweEY5NjksIDB4Mzh9LAotCXsweEY5NkEsIDB4ZTB9LAotCXsweEY5NkIsIDB4NzB9LAotCXsweEY5NkMsIDB4MDV9LAotCXsweEY5NkQsIDB4MTJ9LAotCXsweEY5NkUsIDB4MDB9LAotCXsweEY5NkYsIDB4MGV9LAotCXsweEY5NzAsIDB4ODB9LAotCXsweEY5NzEsIDB4MDN9LAotCXsweEY5NzIsIDB4MTJ9LAotCXsweEY5NzMsIDB4MDd9LAotCXsweEY5NzQsIDB4Yzl9LAotCXsweEY5NzUsIDB4OTB9LAotCXsweEY5NzYsIDB4NDB9LAotCXsweEY5NzcsIDB4MDZ9LAotCXsweEY5NzgsIDB4ZTB9LAotCXsweEY5NzksIDB4ZjR9LAotCXsweEY5N0EsIDB4NTR9LAotCXsweEY5N0IsIDB4MDJ9LAotCXsweEY5N0MsIDB4ZmZ9LAotCXsweEY5N0QsIDB4ZTB9LAotCXsweEY5N0UsIDB4NTR9LAotCXsweEY5N0YsIDB4MDF9LAotCXsweEY5ODAsIDB4NGZ9LAotCXsweEY5ODEsIDB4OTB9LAotCXsweEY5ODIsIDB4MzF9LAotCXsweEY5ODMsIDB4MzJ9LAotCXsweEY5ODQsIDB4ZjB9LAotCXsweEY5ODUsIDB4OTB9LAotCXsweEY5ODYsIDB4ZmF9LAotCXsweEY5ODcsIDB4OWR9LAotCXsweEY5ODgsIDB4ZTB9LAotCXsweEY5ODksIDB4NzB9LAotCXsweEY5OEEsIDB4MDN9LAotCXsweEY5OEIsIDB4MTJ9LAotCXsweEY5OEMsIDB4Mjd9LAotCXsweEY5OEQsIDB4Mjd9LAotCXsweEY5OEUsIDB4MDJ9LAotCXsweEY5OEYsIDB4MDV9LAotCXsweEY5OTAsIDB4YWN9LAotCXsweEY5OTEsIDB4MjJ9LAotCXsweEY5OTIsIDB4Nzh9LAotCXsweEY5OTMsIDB4MDd9LAotCXsweEY5OTQsIDB4ZTZ9LAotCXsweEY5OTUsIDB4ZjV9LAotCXsweEY5OTYsIDB4N2N9LAotCXsweEY5OTcsIDB4ZTV9LAotCXsweEY5OTgsIDB4N2N9LAotCXsweEY5OTksIDB4NjB9LAotCXsweEY5OUEsIDB4MWR9LAotCXsweEY5OUIsIDB4OTB9LAotCXsweEY5OUMsIDB4NDN9LAotCXsweEY5OUQsIDB4ODN9LAotCXsweEY5OUUsIDB4ZTB9LAotCXsweEY5OUYsIDB4YjR9LAotCXsweEY5QTAsIDB4MDF9LAotCXsweEY5QTEsIDB4MTZ9LAotCXsweEY5QTIsIDB4OTB9LAotCXsweEY5QTMsIDB4NDN9LAotCXsweEY5QTQsIDB4ODd9LAotCXsweEY5QTUsIDB4ZTB9LAotCXsweEY5QTYsIDB4YjR9LAotCXsweEY5QTcsIDB4MDF9LAotCXsweEY5QTgsIDB4MGZ9LAotCXsweEY5QTksIDB4MTV9LAotCXsweEY5QUEsIDB4N2N9LAotCXsweEY5QUIsIDB4OTB9LAotCXsweEY5QUMsIDB4MzB9LAotCXsweEY5QUQsIDB4YTF9LAotCXsweEY5QUUsIDB4ZTV9LAotCXsweEY5QUYsIDB4N2N9LAotCXsweEY5QjAsIDB4ZjB9LAotCXsweEY5QjEsIDB4OTB9LAotCXsweEY5QjIsIDB4MzB9LAotCXsweEY5QjMsIDB4YTB9LAotCXsweEY5QjQsIDB4NzR9LAotCXsweEY5QjUsIDB4MDF9LAotCXsweEY5QjYsIDB4ZjB9LAotCXsweEY5QjcsIDB4MjJ9LAotCXsweEY5QjgsIDB4ZTR9LAotCXsweEY5QjksIDB4OTB9LAotCXsweEY5QkEsIDB4MzB9LAotCXsweEY5QkIsIDB4YTB9LAotCXsweEY5QkMsIDB4ZjB9LAotCXsweEY5QkQsIDB4MjJ9LAotCXsweEY5QkUsIDB4ZjB9LAotCXsweEY5QkYsIDB4ZTV9LAotCXsweEY5QzAsIDB4M2F9LAotCXsweEY5QzEsIDB4YjR9LAotCXsweEY5QzIsIDB4MDZ9LAotCXsweEY5QzMsIDB4MDZ9LAotCXsweEY5QzQsIDB4NjN9LAotCXsweEY5QzUsIDB4M2V9LAotCXsweEY5QzYsIDB4MDJ9LAotCXsweEY5QzcsIDB4MTJ9LAotCXsweEY5QzgsIDB4MDN9LAotCXsweEY5QzksIDB4ZWF9LAotCXsweEY5Q0EsIDB4MDJ9LAotCXsweEY5Q0IsIDB4MTd9LAotCXsweEY5Q0MsIDB4NGF9LAotCXsweEY5Q0QsIDB4MjJ9LAotCXsweDM1QzksIDB4QkJ9LAotCXsweDM1Q0EsIDB4MDF9LAotCXsweDM1Q0IsIDB4MTZ9LAotCXsweDM1Q0MsIDB4MDF9LAotCXsweDM1Q0QsIDB4NjR9LAotCXsweDM1Q0UsIDB4MDF9LAotCXsweDM1Q0YsIDB4OTJ9LAotCXsweDM1RDAsIDB4MDF9LAotCXsweDM1RDEsIDB4QkV9LAotCXsweDM1RDMsIDB4RjZ9LAotCXsweDM1RDUsIDB4MDd9LAotCXsweDM1RDcsIDB4QTN9LAotCXsweDM1REIsIDB4MDJ9LAotCXsweDM1REQsIDB4MDZ9LAotCXsweDM1REYsIDB4MUJ9LAotCXsweDM1RTYsIDB4Mjh9LAotCXsweDM1RTcsIDB4NzZ9LAotCXsweDM1RTgsIDB4MkR9LAotCXsweDM1RTksIDB4MDd9LAotCXsweDM1RUEsIDB4MDR9LAotCXsweDM1RUIsIDB4NDN9LAotCXsweDM1RUMsIDB4MDV9LAotCXsweDM1RUQsIDB4QTl9LAotCXsweDM1RUUsIDB4MkF9LAotCXsweDM1RUYsIDB4MTV9LAotCXsweDM1RjAsIDB4MTd9LAotCXsweDM1RjEsIDB4NDF9LAotCXsweDM1RjIsIDB4MjR9LAotCXsweDM1RjMsIDB4ODh9LAotCXsweDM1RjQsIDB4MDF9LAotCXsweDM1RjUsIDB4NTR9LAotCXsweDM1RjYsIDB4MDF9LAotCXsweDM1RjcsIDB4NTV9LAotCXsweDM1RjgsIDB4MkV9LAotCXsweDM1RjksIDB4RjJ9LAotCXsweDM1RkEsIDB4MDZ9LAotCXsweDM1RkIsIDB4MDJ9LAotCXsweDM1RkMsIDB4MDZ9LAotCXsweDM1RkQsIDB4MDN9LAotCXsweDM1RkUsIDB4MDZ9LAotCXsweDM1RkYsIDB4MDR9LAotCXsweDM1QzIsIDB4MUZ9LAotCXsweDM1QzMsIDB4RkZ9LAotCXsweDM1QzQsIDB4MUZ9LAotCXsweDM1QzUsIDB4QzB9LAotCXsweDM1QzAsIDB4MDF9LAotfTsKLQotc3RydWN0IHZ4Njk1M19mb3JtYXQgewotCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjb2RlOwotCWVudW0gdjRsMl9jb2xvcnNwYWNlIGNvbG9yc3BhY2U7Ci0JdTE2IGZtdDsKLQl1MTYgb3JkZXI7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHZ4Njk1M19mb3JtYXQgdng2OTUzX2NmbXRzW10gPSB7Ci0JewotCS5jb2RlICAgPSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOCwKLQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAotCS5mbXQgICAgPSAxLAotCS5vcmRlciAgICA9IDAsCi0JfQotCS8qIG1vcmUgY2FuIGJlIHN1cHBvcnRlZCwgdG8gYmUgYWRkZWQgbGF0ZXIgKi8KLX07Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotc3RhdGljIGludCB2eDY5NTNfaTJjX3J4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQl1bnNpZ25lZCBjaGFyICpyeGRhdGEsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGkyY19tc2cgbXNnc1tdID0gewotCQl7Ci0JCQkuYWRkciAgPSBzYWRkciwKLQkJCS5mbGFncyA9IDAsCi0JCQkubGVuICAgPSAyLAotCQkJLmJ1ZiAgID0gcnhkYXRhLAotCQl9LAotCQl7Ci0JCQkuYWRkciAgPSBzYWRkciwKLQkJCS5mbGFncyA9IEkyQ19NX1JELAotCQkJLmxlbiAgID0gMiwKLQkJCS5idWYgICA9IHJ4ZGF0YSwKLQkJfSwKLQl9OwotCWlmIChpMmNfdHJhbnNmZXIodng2OTUzX2NsaWVudC0+YWRhcHRlciwgbXNncywgMikgPCAwKSB7Ci0JCUNEQkcoInZ4Njk1M19pMmNfcnhkYXRhIGZhaWxlZCFcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50MzJfdCB2eDY5NTNfaTJjX3R4ZGF0YSh1bnNpZ25lZCBzaG9ydCBzYWRkciwKLQkJCQl1bnNpZ25lZCBjaGFyICp0eGRhdGEsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGkyY19tc2cgbXNnW10gPSB7Ci0JCXsKLQkJCS5hZGRyID0gc2FkZHIsCi0JCQkuZmxhZ3MgPSAwLAotCQkJLmxlbiA9IGxlbmd0aCwKLQkJCS5idWYgPSB0eGRhdGEsCi0JCSB9LAotCX07Ci0JaWYgKGkyY190cmFuc2Zlcih2eDY5NTNfY2xpZW50LT5hZGFwdGVyLCBtc2csIDEpIDwgMCkgewotCQlDREJHKCJ2eDY5NTNfaTJjX3R4ZGF0YSBmYWlsZCAweCV4XG4iLCB2eDY5NTNfY2xpZW50LT5hZGRyKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludDMyX3Qgdng2OTUzX2kyY19yZWFkKHVuc2lnbmVkIHNob3J0IHJhZGRyLAotCXVuc2lnbmVkIHNob3J0ICpyZGF0YSwgaW50IHJsZW4pCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JdW5zaWduZWQgY2hhciBidWZbMl07Ci0JaWYgKCFyZGF0YSkKLQkJcmV0dXJuIC1FSU87Ci0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9IChyYWRkciAmIDB4RkYwMCkgPj4gODsKLQlidWZbMV0gPSAocmFkZHIgJiAweDAwRkYpOwotCXJjID0gdng2OTUzX2kyY19yeGRhdGEodng2OTUzX2NsaWVudC0+YWRkcj4+MSwgYnVmLCBybGVuKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoInZ4Njk1M19pMmNfcmVhZCAweCV4IGZhaWxlZCFcbiIsIHJhZGRyKTsKLQkJcmV0dXJuIHJjOwotCX0KLQkqcmRhdGEgPSAocmxlbiA9PSAyID8gYnVmWzBdIDw8IDggfCBidWZbMV0gOiBidWZbMF0pOwotCXJldHVybiByYzsKLX0KLXN0YXRpYyBpbnQzMl90IHZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IodW5zaWduZWQgc2hvcnQgd2FkZHIsIHVpbnQ4X3QgYmRhdGEpCi17Ci0JaW50MzJfdCByYyA9IC1FRkFVTFQ7Ci0JdW5zaWduZWQgY2hhciBidWZbM107Ci0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1ZlswXSA9ICh3YWRkciAmIDB4RkYwMCkgPj4gODsKLQlidWZbMV0gPSAod2FkZHIgJiAweDAwRkYpOwotCWJ1ZlsyXSA9IGJkYXRhOwotCUNEQkcoImkyY193cml0ZV9iIGFkZHIgPSAweCV4LCB2YWwgPSAweCV4XG4iLCB3YWRkciwgYmRhdGEpOwotCXJjID0gdng2OTUzX2kyY190eGRhdGEodng2OTUzX2NsaWVudC0+YWRkcj4+MSwgYnVmLCAzKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoImkyY193cml0ZV9iIGZhaWxlZCwgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXghXG4iLAotCQkJd2FkZHIsIGJkYXRhKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotc3RhdGljIGludDMyX3Qgdng2OTUzX2kyY193cml0ZV9zZXFfc2Vuc29yKHVuc2lnbmVkIHNob3J0IHdhZGRyLAotCXVpbnQ4X3QgKmJkYXRhLCB1aW50MTZfdCBsZW4pCi17Ci0JaW50MzJfdCByYyA9IC1FRkFVTFQ7Ci0JdW5zaWduZWQgY2hhciBidWZbbGVuKzJdOwotCWludCBpOwotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZbMF0gPSAod2FkZHIgJiAweEZGMDApID4+IDg7Ci0JYnVmWzFdID0gKHdhZGRyICYgMHgwMEZGKTsKLQlmb3IgKGkgPSAyOyBpIDwgbGVuKzI7IGkrKykKLQkJYnVmW2ldID0gKmJkYXRhKys7Ci0JcmMgPSB2eDY5NTNfaTJjX3R4ZGF0YSh2eDY5NTNfY2xpZW50LT5hZGRyPj4xLCBidWYsIGxlbisyKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoImkyY193cml0ZV9iIGZhaWxlZCwgYWRkciA9IDB4JXgsIHZhbCA9IDB4JXghXG4iLAotCQkJIHdhZGRyLCBiZGF0YVswXSk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3Qgdng2OTUzX2kyY193cml0ZV93X3RhYmxlKHN0cnVjdCB2eDY5NTNfaTJjX3JlZ19jb25mIGNvbnN0Ci0JCQkJCSAqcmVnX2NvbmZfdGJsLCBpbnQgbnVtKQotewotCWludCBpOwotCWludDMyX3QgcmMgPSAtRUlPOwotCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQlyYyA9IHZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IocmVnX2NvbmZfdGJsLT53YWRkciwKLQkJCXJlZ19jb25mX3RibC0+d2RhdGEpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0JCXJlZ19jb25mX3RibCsrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIHZ4Njk1M19nZXRfcGljdF9mcHModWludDE2X3QgZnBzLCB1aW50MTZfdCAqcGZwcykKLXsKLQkvKiBpbnB1dCBmcHMgaXMgcHJldmlldyBmcHMgaW4gUTggZm9ybWF0ICovCi0JdWludDE2X3QgcHJldmlld19mcmFtZV9sZW5ndGhfbGluZXMsIHNuYXBzaG90X2ZyYW1lX2xlbmd0aF9saW5lczsKLQl1aW50MTZfdCBwcmV2aWV3X2xpbmVfbGVuZ3RoX3Bjaywgc25hcHNob3RfbGluZV9sZW5ndGhfcGNrOwotCXVpbnQzMl90IGRpdmlkZXIsIGQxLCBkMjsKLQkvKiBUb3RhbCBmcmFtZV9sZW5ndGhfbGluZXMgYW5kIGxpbmVfbGVuZ3RoX3BjayBmb3IgcHJldmlldyAqLwotCXByZXZpZXdfZnJhbWVfbGVuZ3RoX2xpbmVzID0gVlg2OTUzX1FUUl9TSVpFX0hFSUdIVCArCi0JCVZYNjk1M19WRVJfUVRSX0JMS19MSU5FUzsKLQlwcmV2aWV3X2xpbmVfbGVuZ3RoX3BjayA9IFZYNjk1M19RVFJfU0laRV9XSURUSCArCi0JCVZYNjk1M19IUlpfUVRSX0JMS19QSVhFTFM7Ci0JLyogVG90YWwgZnJhbWVfbGVuZ3RoX2xpbmVzIGFuZCBsaW5lX2xlbmd0aF9wY2sgZm9yIHNuYXBzaG90ICovCi0Jc25hcHNob3RfZnJhbWVfbGVuZ3RoX2xpbmVzID0gVlg2OTUzX0ZVTExfU0laRV9IRUlHSFQgKwotCQlWWDY5NTNfVkVSX0ZVTExfQkxLX0xJTkVTOwotCXNuYXBzaG90X2xpbmVfbGVuZ3RoX3BjayA9IFZYNjk1M19GVUxMX1NJWkVfV0lEVEggKwotCQlWWDY5NTNfSFJaX0ZVTExfQkxLX1BJWEVMUzsKLQlkMSA9IHByZXZpZXdfZnJhbWVfbGVuZ3RoX2xpbmVzICogMHgwMDAwMDQwMC8KLQkJc25hcHNob3RfZnJhbWVfbGVuZ3RoX2xpbmVzOwotCWQyID0gcHJldmlld19saW5lX2xlbmd0aF9wY2sgKiAweDAwMDAwNDAwLwotCQlzbmFwc2hvdF9saW5lX2xlbmd0aF9wY2s7Ci0JZGl2aWRlciA9IGQxICogZDIgLyAweDQwMDsKLQkvKlZlcmlmeSBQQ0xLIHNldHRpbmdzIGFuZCBmcmFtZSBzaXplcy4qLwotCSpwZnBzID0gKHVpbnQxNl90KSAoZnBzICogZGl2aWRlciAvIDB4NDAwKTsKLQkvKiAyIGlzIHRoZSByYXRpbyBvZiBuby5vZiBzbmFwc2hvdCBjaGFubmVscwotCXRvIG51bWJlciBvZiBwcmV2aWV3IGNoYW5uZWxzICovCi0KLX0KLQotc3RhdGljIHVpbnQxNl90IHZ4Njk1M19nZXRfcHJldl9saW5lc19wZih2b2lkKQotewotCWlmICh2eDY5NTNfY3RybC0+cHJldl9yZXMgPT0gUVRSX1NJWkUpCi0JCXJldHVybiBWWDY5NTNfUVRSX1NJWkVfSEVJR0hUICsgVlg2OTUzX1ZFUl9RVFJfQkxLX0xJTkVTOwotCWVsc2UKLQkJcmV0dXJuIFZYNjk1M19GVUxMX1NJWkVfSEVJR0hUICsgVlg2OTUzX1ZFUl9GVUxMX0JMS19MSU5FUzsKLQotfQotCi1zdGF0aWMgdWludDE2X3Qgdng2OTUzX2dldF9wcmV2X3BpeGVsc19wbCh2b2lkKQotewotCWlmICh2eDY5NTNfY3RybC0+cHJldl9yZXMgPT0gUVRSX1NJWkUpCi0JCXJldHVybiBWWDY5NTNfUVRSX1NJWkVfV0lEVEggKyBWWDY5NTNfSFJaX1FUUl9CTEtfUElYRUxTOwotCWVsc2UKLQkJcmV0dXJuIFZYNjk1M19GVUxMX1NJWkVfV0lEVEggKyBWWDY5NTNfSFJaX0ZVTExfQkxLX1BJWEVMUzsKLX0KLQotc3RhdGljIHVpbnQxNl90IHZ4Njk1M19nZXRfcGljdF9saW5lc19wZih2b2lkKQotewotCQlpZiAodng2OTUzX2N0cmwtPnBpY3RfcmVzID09IFFUUl9TSVpFKQotCQkJcmV0dXJuIFZYNjk1M19RVFJfU0laRV9IRUlHSFQgKwotCQkJCVZYNjk1M19WRVJfUVRSX0JMS19MSU5FUzsKLQkJZWxzZQotCQkJcmV0dXJuIFZYNjk1M19GVUxMX1NJWkVfSEVJR0hUICsKLQkJCQlWWDY5NTNfVkVSX0ZVTExfQkxLX0xJTkVTOwotfQotCi1zdGF0aWMgdWludDE2X3Qgdng2OTUzX2dldF9waWN0X3BpeGVsc19wbCh2b2lkKQotewotCWlmICh2eDY5NTNfY3RybC0+cGljdF9yZXMgPT0gUVRSX1NJWkUpCi0JCXJldHVybiBWWDY5NTNfUVRSX1NJWkVfV0lEVEggKwotCQkJVlg2OTUzX0hSWl9RVFJfQkxLX1BJWEVMUzsKLQllbHNlCi0JCXJldHVybiBWWDY5NTNfRlVMTF9TSVpFX1dJRFRIICsKLQkJCVZYNjk1M19IUlpfRlVMTF9CTEtfUElYRUxTOwotfQotCi1zdGF0aWMgdWludDMyX3Qgdng2OTUzX2dldF9waWN0X21heF9leHBfbGModm9pZCkKLXsKLQlpZiAodng2OTUzX2N0cmwtPnBpY3RfcmVzID09IFFUUl9TSVpFKQotCQlyZXR1cm4gKFZYNjk1M19RVFJfU0laRV9IRUlHSFQgKwotCQkJVlg2OTUzX1ZFUl9RVFJfQkxLX0xJTkVTKSoyNDsKLQllbHNlCi0JCXJldHVybiAoVlg2OTUzX0ZVTExfU0laRV9IRUlHSFQgKwotCQkJVlg2OTUzX1ZFUl9GVUxMX0JMS19MSU5FUykqMjQ7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHZ4Njk1M19zZXRfZnBzKHN0cnVjdCBmcHNfY2ZnCSpmcHMpCi17Ci0JdWludDE2X3QgdG90YWxfbGluZXNfcGVyX2ZyYW1lOwotCWludDMyX3QgcmMgPSAwOwotCXRvdGFsX2xpbmVzX3Blcl9mcmFtZSA9ICh1aW50MTZfdCkoKFZYNjk1M19RVFJfU0laRV9IRUlHSFQgKwotCQlWWDY5NTNfVkVSX1FUUl9CTEtfTElORVMpICogdng2OTUzX2N0cmwtPmZwc19kaXZpZGVyLzB4NDAwKTsKLQlpZiAodng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0hJLAotCQkoKHRvdGFsX2xpbmVzX3Blcl9mcmFtZSAmIDB4RkYwMCkgPj4gOCkpIDwgMCkKLQkJcmV0dXJuIHJjOwotCWlmICh2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19GUkFNRV9MRU5HVEhfTElORVNfTE8sCi0JCSh0b3RhbF9saW5lc19wZXJfZnJhbWUgJiAweDAwRkYpKSA8IDApCi0JCXJldHVybiByYzsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHZ4Njk1M193cml0ZV9leHBfZ2Fpbih1aW50MTZfdCBnYWluLCB1aW50MzJfdCBsaW5lKQotewotCXVpbnQxNl90IGxpbmVfbGVuZ3RoX3BjaywgZnJhbWVfbGVuZ3RoX2xpbmVzOwotCXVpbnQ4X3QgZ2Fpbl9oaSwgZ2Fpbl9sbzsKLQl1aW50OF90IGludGdfdGltZV9oaSwgaW50Z190aW1lX2xvOwotCXVpbnQ4X3QgbGluZV9sZW5ndGhfcGNrX2hpID0gMCwgbGluZV9sZW5ndGhfcGNrX2xvID0gMDsKLQl1aW50MTZfdCBsaW5lX2xlbmd0aF9yYXRpbyA9IDEgKiBRODsKLQlpbnQzMl90IHJjID0gMDsKLQlpZiAodng2OTUzX2N0cmwtPnNlbnNvcm1vZGUgIT0gU0VOU09SX1NOQVBTSE9UX01PREUpIHsKLQkJZnJhbWVfbGVuZ3RoX2xpbmVzID0gVlg2OTUzX1FUUl9TSVpFX0hFSUdIVCArCi0JCVZYNjk1M19WRVJfUVRSX0JMS19MSU5FUzsKLQkJbGluZV9sZW5ndGhfcGNrID0gVlg2OTUzX1FUUl9TSVpFX1dJRFRIICsKLQkJCVZYNjk1M19IUlpfUVRSX0JMS19QSVhFTFM7Ci0JCWlmIChsaW5lID4gKGZyYW1lX2xlbmd0aF9saW5lcyAtCi0JCQlWWDY5NTNfU1RNNU0wRURPRl9PRkZTRVQpKSB7Ci0JCQl2eDY5NTNfY3RybC0+ZnBzID0gKHVpbnQxNl90KSAoMzAgKiBROCAqCi0JCQkoZnJhbWVfbGVuZ3RoX2xpbmVzIC0gVlg2OTUzX1NUTTVNMEVET0ZfT0ZGU0VUKS8KLQkJCWxpbmUpOwotCQl9IGVsc2UgewotCQkJdng2OTUzX2N0cmwtPmZwcyA9ICh1aW50MTZfdCkgKDMwICogUTgpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZnJhbWVfbGVuZ3RoX2xpbmVzID0gVlg2OTUzX0ZVTExfU0laRV9IRUlHSFQgKwotCQkJCVZYNjk1M19WRVJfRlVMTF9CTEtfTElORVM7Ci0JCWxpbmVfbGVuZ3RoX3BjayA9IFZYNjk1M19GVUxMX1NJWkVfV0lEVEggKwotCQkJCVZYNjk1M19IUlpfRlVMTF9CTEtfUElYRUxTOwotCX0KLQkvKiBjYWxjdWxhdGUgbGluZV9sZW5ndGhfcmF0aW8gKi8KLQlpZiAoKGZyYW1lX2xlbmd0aF9saW5lcyAtIFZYNjk1M19TVE01TTBFRE9GX09GRlNFVCkgPCBsaW5lKSB7Ci0JCWxpbmVfbGVuZ3RoX3JhdGlvID0gKGxpbmUqUTgpIC8KLQkJCShmcmFtZV9sZW5ndGhfbGluZXMgLSBWWDY5NTNfU1RNNU0wRURPRl9PRkZTRVQpOwotCQlsaW5lID0gZnJhbWVfbGVuZ3RoX2xpbmVzIC0gVlg2OTUzX1NUTTVNMEVET0ZfT0ZGU0VUOwotCX0gZWxzZSB7Ci0JCWxpbmVfbGVuZ3RoX3JhdGlvID0gMSpRODsKLQl9Ci0Jdng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfR1JPVVBFRF9QQVJBTUVURVJfSE9MRCwKLQkJR1JPVVBFRF9QQVJBTUVURVJfSE9MRCk7Ci0JbGluZV9sZW5ndGhfcGNrID0gKGxpbmVfbGVuZ3RoX3BjayA+Ci0JCU1BWF9MSU5FX0xFTkdUSF9QQ0spID8KLQkJTUFYX0xJTkVfTEVOR1RIX1BDSyA6IGxpbmVfbGVuZ3RoX3BjazsKLQlsaW5lX2xlbmd0aF9wY2sgPSAodWludDE2X3QpIChsaW5lX2xlbmd0aF9wY2sgKgotCQlsaW5lX2xlbmd0aF9yYXRpby9ROCk7Ci0JbGluZV9sZW5ndGhfcGNrX2hpID0gKHVpbnQ4X3QpICgobGluZV9sZW5ndGhfcGNrICYKLQkJMHhGRjAwKSA+PiA4KTsKLQlsaW5lX2xlbmd0aF9wY2tfbG8gPSAodWludDhfdCkgKGxpbmVfbGVuZ3RoX3BjayAmCi0JCTB4MDBGRik7Ci0Jdng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfTElORV9MRU5HVEhfUENLX0hJLAotCQlsaW5lX2xlbmd0aF9wY2tfaGkpOwotCXZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0xJTkVfTEVOR1RIX1BDS19MTywKLQkJbGluZV9sZW5ndGhfcGNrX2xvKTsKLQkvKiB1cGRhdGUgYW5hbG9ndWUgZ2FpbiByZWdpc3RlcnMgKi8KLQlnYWluX2hpID0gKHVpbnQ4X3QpICgoZ2FpbiAmIDB4RkYwMCkgPj4gOCk7Ci0JZ2Fpbl9sbyA9ICh1aW50OF90KSAoZ2FpbiAmIDB4MDBGRik7Ci0Jdng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfQU5BTE9HVUVfR0FJTl9DT0RFX0dMT0JBTF9MTywKLQkJZ2Fpbl9sbyk7Ci0Jdng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfRElHSVRBTF9HQUlOX0dSRUVOX1JfTE8sIGdhaW5faGkpOwotCXZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0RJR0lUQUxfR0FJTl9SRURfTE8sIGdhaW5faGkpOwotCXZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0RJR0lUQUxfR0FJTl9CTFVFX0xPLCBnYWluX2hpKTsKLQl2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19ESUdJVEFMX0dBSU5fR1JFRU5fQl9MTywgZ2Fpbl9oaSk7Ci0JQ0RCRygiJXMsIGdhaW5faGkgMHgleCwgZ2Fpbl9sbyAweCV4XG4iLCBfX2Z1bmNfXywKLQkJZ2Fpbl9oaSwgZ2Fpbl9sbyk7Ci0JLyogdXBkYXRlIGxpbmUgY291bnQgcmVnaXN0ZXJzICovCi0JaW50Z190aW1lX2hpID0gKHVpbnQ4X3QpICgoKHVpbnQxNl90KWxpbmUgJiAweEZGMDApID4+IDgpOwotCWludGdfdGltZV9sbyA9ICh1aW50OF90KSAoKHVpbnQxNl90KWxpbmUgJiAweDAwRkYpOwotCXZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0hJLAotCQlpbnRnX3RpbWVfaGkpOwotCXZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0xPLAotCQlpbnRnX3RpbWVfbG8pOwotCXZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX0dST1VQRURfUEFSQU1FVEVSX0hPTEQsCi0JCUdST1VQRURfUEFSQU1FVEVSX0hPTERfT0ZGKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3Qgdng2OTUzX3NldF9waWN0X2V4cF9nYWluKHVpbnQxNl90IGdhaW4sIHVpbnQzMl90IGxpbmUpCi17Ci0JaW50MzJfdCByYyA9IDA7Ci0JcmMgPSB2eDY5NTNfd3JpdGVfZXhwX2dhaW4oZ2FpbiwgbGluZSk7Ci0JcmV0dXJuIHJjOwotfSAvKiBlbmRvZiB2eDY5NTNfc2V0X3BpY3RfZXhwX2dhaW4qLwotCi1zdGF0aWMgaW50MzJfdCB2eDY5NTNfbW92ZV9mb2N1cyhpbnQgZGlyZWN0aW9uLAotCWludDMyX3QgbnVtX3N0ZXBzKQotewotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQzMl90IHZ4Njk1M19zZXRfZGVmYXVsdF9mb2N1cyh1aW50OF90IGFmX3N0ZXApCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHZ4Njk1M190ZXN0KGVudW0gdng2OTUzX3Rlc3RfbW9kZV90IG1vKQotewotCWludDMyX3QgcmMgPSAwOwotCWlmIChtbyA9PSBURVNUX09GRikKLQkJcmV0dXJuIHJjOwotCWVsc2UgewotCQkvKiBSRUdfMHgzMEQ4WzRdIGlzIFRFU0JZUEVOOiAwOiBOb3JtYWwgT3BlcmF0aW9uLAotCQkxOiBCeXBhc3MgU2lnbmFsIFByb2Nlc3NpbmcKLQkJUkVHXzB4MzBEOFs1XSBpcyBFQkRNQVNLOiAwOgotCQlPdXRwdXQgRW1iZWRkZWQgZGF0YSwgMTogTm8gb3V0cHV0IGVtYmVkZGVkIGRhdGEgKi8KLQkJaWYgKHZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX1RFU1RfUEFUVEVSTl9NT0RFLAotCQkJKHVpbnQ4X3QpIG1vKSA8IDApIHsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgdng2OTUzX2VuYWJsZV9lZG9mKGVudW0gZWRvZl9tb2RlX3QgZWRvZl9tb2RlKQotewotCWludCByYyA9IDA7Ci0JaWYgKGVkb2ZfbW9kZSA9PSBWWDY5NTNfRURPRl9FU1RJTUFUSU9OKSB7Ci0JCS8qIEVEb2YgRXN0aW1hdGlvbiBtb2RlIGZvciBwcmV2aWV3ICovCi0JCWlmICh2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR18weDBiODAsIDB4MDIpIDwgMCkKLQkJCXJldHVybiByYzsKLQkJQ0RCRygiVlg2OTUzX0VET0ZfRVNUSU1BVElPTiIpOwotCX0gZWxzZSBpZiAoZWRvZl9tb2RlID09IFZYNjk1M19FRE9GX0FQUExJQ0FUSU9OKSB7Ci0JCS8qIEVEb2YgQXBwbGljYXRpb24gbW9kZSBmb3IgQ2FwdHVyZSAqLwotCQlpZiAodng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgwYjgwLCAweDAxKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JCUNEQkcoIlZYNjk1M19FRE9GX0FQUExJQ0FUSU9OIik7Ci0JfSBlbHNlIHsKLQkJLyogRURPRiBkaXNhYmxlZCAqLwotCQlpZiAodng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfMHgwYjgwLCAweDAwKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JCUNEQkcoIlZYNjk1M19FRE9GX0RJU0FCTEUiKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCB2eDY5NTNfcGF0Y2hfZm9yX2N1dDIodm9pZCkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlyYyA9IHZ4Njk1M19pMmNfd3JpdGVfd190YWJsZShwYXRjaF90YmxfY3V0MiwKLQkJQVJSQVlfU0laRShwYXRjaF90YmxfY3V0MikpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJldHVybiByYzsKLX0KLXN0YXRpYyBpbnQzMl90IHZ4Njk1M19wYXRjaF9mb3JfY3V0Myh2b2lkKQotewotCWludDMyX3QgcmMgPSAwOwotCXJjID0gdng2OTUzX2kyY193cml0ZV93X3RhYmxlKHBhdGNoX3RibF9jdXQzLAotCQlBUlJBWV9TSVpFKHBhdGNoX3RibF9jdXQzKSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIHJjOwotfQotc3RhdGljIGludDMyX3Qgdng2OTUzX3NlbnNvcl9zZXR0aW5nKGludCB1cGRhdGVfdHlwZSwgaW50IHJ0KQotewotCi0JaW50MzJfdCByYyA9IDA7Ci0JdW5zaWduZWQgc2hvcnQgZnJhbWVfY250OwotCXN0cnVjdCBtc21fY2FtZXJhX2NzaV9wYXJhbXMgdng2OTUzX2NzaV9wYXJhbXM7Ci0JaWYgKHZ4Njk1M19jdHJsLT5zZW5zb3JfdHlwZSAhPSBWWDY5NTNfU1RNNU0wRURPRl9DVVRfMikgewotCQlzd2l0Y2ggKHVwZGF0ZV90eXBlKSB7Ci0JCWNhc2UgUkVHX0lOSVQ6Ci0JCWlmIChydCA9PSBSRVNfUFJFVklFVyB8fCBydCA9PSBSRVNfQ0FQVFVSRSkgewotCQkJc3RydWN0IHZ4Njk1M19pMmNfcmVnX2NvbmYgaW5pdF90YmxbXSA9IHsKLQkJCXtSRUdfMHgwMTEyLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwMTEyfSwKLQkJCXsweDYwMDMsIDB4MDF9LAotCQkJe1JFR18weDAxMTMsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDAxMTN9LAotCQkJe1JFR19WVF9QSVhfQ0xLX0RJViwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJdnRfcGl4X2Nsa19kaXZ9LAotCQkJe1JFR19QUkVfUExMX0NMS19ESVYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCXByZV9wbGxfY2xrX2Rpdn0sCi0JCQl7UkVHX1BMTF9NVUxUSVBMSUVSLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQlwbGxfbXVsdGlwbGllcn0sCi0JCQl7UkVHX09QX1BJWF9DTEtfRElWLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQlvcF9waXhfY2xrX2Rpdn0sCi0JCQl7UkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0hJLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX2hpfSwKLQkJCXtSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfTE8sCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJY29hcnNlX2ludGVncmF0aW9uX3RpbWVfbG99LAotCQkJe1JFR19BTkFMT0dVRV9HQUlOX0NPREVfR0xPQkFMX0xPLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWFuYWxvZ3VlX2dhaW5fY29kZV9nbG9iYWx9LAotCQkJe1JFR18weDMwMzAsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMwMzB9LAotCQkJLyogOTUzIHNwZWNpZmljIHJlZ2lzdGVycyAqLwotCQkJe1JFR18weDAxMTEsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDAxMTF9LAotCQkJe1JFR18weDBiMDAsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiMDB9LAotCQkJe1JFR18weDMwMDEsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMwMDF9LAotCQkJe1JFR18weDMwMDQsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMwMDR9LAotCQkJezB4MzAwNiwgMHgwMH0sCi0JCQl7UkVHXzB4MzAwNywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAwN30sCi0JCQl7MHgzMDFiLCAweDI5fSwKLQkJCS8qIERFRkNPUiBzZXR0aW5ncyAqLwotCQkJLypTaW5nbGUgRGVmZWN0IENvcnJlY3Rpb24gV2VpZ2h0IERJU0FCTEUqLwotCQkJezB4MGIwNiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGIwNn0sCi0JCQkvKlNpbmdsZV9kZWZlY3RfY29ycmVjdF93ZWlnaHQgPSBhdXRvKi8KLQkJCXsweDBiMDcsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiMDd9LAotCQkJLypEeW5hbWljIGNvdXBsZXQgY29ycmVjdGlvbiBFTkFCTEVEKi8KLQkJCXsweDBiMDgsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiMDh9LAotCQkJLypEeW5hbWljIGNvdXBsZXQgY29ycmVjdGlvbiB3ZWlnaHQqLwotCQkJezB4MGIwOSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGIwOX0sCi0JCQkvKiBDbG9jayBTZXR1cCAqLwotCQkJLyogVGVsbCBzZW5zb3IgZXh0IGNsayBpcyAyNE1IeiovCi0JCQl7UkVHXzB4MDEzNiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDEzNn0sCi0JCQl7UkVHXzB4MDEzNywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDEzN30sCi0JCQkvKiBUaGUgd2hpdGUgYmFsYW5jZSBnYWlucyBtdXN0IGJlIHdyaXR0ZW4KLQkJCXRvIHRoZSBzZW5zb3IgZXZlcnkgZnJhbWUuICovCi0JCQkvKiBFZG9mICovCi0JCQl7UkVHXzB4MGI4MywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4M30sCi0JCQl7UkVHXzB4MGI4NCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4NH0sCi0JCQl7UkVHXzB4MGI4NSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4NX0sCi0JCQl7UkVHXzB4MGI4OCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4OH0sCi0JCQl7UkVHXzB4MGI4OSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4OX0sCi0JCQl7UkVHXzB4MGI4YSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4YX0sCi0JCQkvKiBNb2RlIHNwZWNpZmljIHJlZ2lldGVycyAqLwotCQkJe1JFR19GUkFNRV9MRU5HVEhfTElORVNfSEksCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJZnJhbWVfbGVuZ3RoX2xpbmVzX2hpfSwKLQkJCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0xPLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWZyYW1lX2xlbmd0aF9saW5lc19sb30sCi0JCQl7UkVHX0xJTkVfTEVOR1RIX1BDS19ISSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQlsaW5lX2xlbmd0aF9wY2tfaGl9LAotCQkJe1JFR19MSU5FX0xFTkdUSF9QQ0tfTE8sCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJbGluZV9sZW5ndGhfcGNrX2xvfSwKLQkJCXtSRUdfMHgzMDA1LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMDV9LAotCQkJezB4MzAxMCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDEwfSwKLQkJCXtSRUdfMHgzMDExLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMTF9LAotCQkJe1JFR18weDMwMWEsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAxYX0sCi0JCQl7UkVHXzB4MzAzNSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDM1fSwKLQkJCXtSRUdfMHgzMDM2LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMzZ9LAotCQkJe1JFR18weDMwNDEsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzA0MX0sCi0JCQl7MHgzMDQyLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwNDJ9LAotCQkJe1JFR18weDMwNDUsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzA0NX0sCi0JCQkvKkVET0Y6IEVzdGltYXRpb24gc2V0dGluZ3MgZm9yIFByZXZpZXcgbW9kZQotCQkJQXBwbGljYXRpb24gc2V0dGluZ3MgZm9yIGNhcHR1cmUgbW9kZQotCQkJKHN0YW5kYXJkIHNldHRpbmdzIC0gTm90IHR1bmVkKSAqLwotCQkJe1JFR18weDBiODAsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MGI4MH0sCi0JCQl7UkVHXzB4MDkwMCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwOTAwfSwKLQkJCXtSRUdfMHgwOTAxLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDA5MDF9LAotCQkJe1JFR18weDA5MDIsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDkwMn0sCi0JCQl7UkVHXzB4MDM4MywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzgzfSwKLQkJCXtSRUdfMHgwMzg3LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzODd9LAotCQkJLyogQ2hhbmdlIG91dHB1dCBzaXplIC8gZnJhbWUgcmF0ZSAqLwotCQkJe1JFR18weDAzNGMsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM0Y30sCi0JCQl7UkVHXzB4MDM0ZCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzRkfSwKLQkJCXtSRUdfMHgwMzRlLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGV9LAotCQkJe1JFR18weDAzNGYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM0Zn0sCi0JCQl9OwotCQkJLyogcmVzZXQgZnBzX2RpdmlkZXIgKi8KLQkJCXZ4Njk1M19jdHJsLT5mcHMgPSAzMCAqIFE4OwotCQkJLyogc3RvcCBzdHJlYW1pbmcgKi8KLQotCQkJLyogUmVzZXQgZXZlcnl0aGluZyBmaXJzdCAqLwotCQkJaWYgKHZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoMHgxMDMsIDB4MDEpIDwgMCkgewotCQkJCUNEQkcoIlMvVyByZXNldCBmYWlsZWRcbiIpOwotCQkJCXJldHVybiByYzsKLQkJCX0gZWxzZQotCQkJCUNEQkcoIlMvVyByZXNldCBzdWNjZXNzZnVsXG4iKTsKLQotCQkJbXNsZWVwKDEwKTsKLQotCQkJQ0RCRygiSW5pdCB2eDY5NTNfc2Vuc29yX3NldHRpbmcgc3RhbmRieVxuIik7Ci0JCQlpZiAodng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfTU9ERV9TRUxFQ1QsCi0JCQkJTU9ERV9TRUxFQ1RfU1RBTkRCWV9NT0RFKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJLyp2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSovCi0JCQltc2xlZXAodng2OTUzX3N0bTVtMGVkb2ZfZGVsYXlfbXNlY3Nfc3RkYnkpOwotCi0KLQotCQkJdng2OTUzX3BhdGNoX2Zvcl9jdXQzKCk7Ci0JCQlyYyA9IHZ4Njk1M19pMmNfd3JpdGVfd190YWJsZSgmaW5pdF90YmxbMF0sCi0JCQkJQVJSQVlfU0laRShpbml0X3RibCkpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCW1zbGVlcCh2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSk7Ci0KLQkJCXZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoMHgwYjgwLCAweDAwKTsKLQkJCXZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoMHgzMzg4LCAweDAzKTsKLQkJCXZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoMHgzNjQwLCAweDAwKTsKLQotCQkJcmMgPSB2eDY5NTNfaTJjX3dyaXRlX3dfdGFibGUoJmVkb2ZfdGJsWzBdLAotCQkJCUFSUkFZX1NJWkUoZWRvZl90YmwpKTsKLQkJCXZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoMHgzMzg4LCAweDAwKTsKLQotCQl9Ci0JCXJldHVybiByYzsKLQkJY2FzZSBVUERBVEVfUEVSSU9ESUM6Ci0JCWlmIChydCA9PSBSRVNfUFJFVklFVyB8fCBydCA9PSBSRVNfQ0FQVFVSRSkgewotCQkJc3RydWN0IHZ4Njk1M19pMmNfcmVnX2NvbmYgcHJldmlld19tb2RlX3RibFtdID0gewotCQkJe1JFR18weDAxMTIsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDAxMTJ9LAotCQkJezB4NjAwMywgMHgwMX0sCi0JCQl7UkVHXzB4MDExMywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDExM30sCi0JCQl7UkVHX1ZUX1BJWF9DTEtfRElWLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQl2dF9waXhfY2xrX2Rpdn0sCi0JCQl7UkVHX1BSRV9QTExfQ0xLX0RJViwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJcHJlX3BsbF9jbGtfZGl2fSwKLQkJCXtSRUdfUExMX01VTFRJUExJRVIsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCXBsbF9tdWx0aXBsaWVyfSwKLQkJCXtSRUdfT1BfUElYX0NMS19ESVYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCW9wX3BpeF9jbGtfZGl2fSwKLQotCQkJe1JFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9ISSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQljb2Fyc2VfaW50ZWdyYXRpb25fdGltZV9oaX0sCi0JCQl7UkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0xPLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX2xvfSwKLQkJCXtSRUdfQU5BTE9HVUVfR0FJTl9DT0RFX0dMT0JBTF9MTywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQlhbmFsb2d1ZV9nYWluX2NvZGVfZ2xvYmFsfSwKLQotCQkJe1JFR18weDMyMTAsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMyMTB9LAotCQkJe1JFR18weDAxMTEsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDExMX0sCi0JCQl7UkVHXzB4MzQxMCwgdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzQxMH0sCi0KLQkJCXtSRUdfMHgzMDA0LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDA0fSwKLQkJCXtSRUdfMHgzMDA2LCAweDAwfSwKLQkJCXtSRUdfMHgzMDA3LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDA3fSwKLQkJCXtSRUdfMHgzMDFiLCAweDI5fSwKLQkJCXtSRUdfMHgzMDM2LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMzZ9LAotCQkJe1JFR18weDMwNDUsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwNDV9LAotCQkJe1JFR18weDMwOTgsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwOTh9LAotCQkJe1JFR18weDMwOWQsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwOUR9LAotCi0JCQl7UkVHXzB4MDkwMCwgdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDkwMH0sCi0JCQl7UkVHXzB4MDkwMSwgdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDkwMX0sCi0JCQl7UkVHXzB4MDkwMiwgdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDkwMn0sCi0JCQl7UkVHXzB4MDM4Mywgdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM4M30sCi0JCQl7UkVHXzB4MDM4Nywgdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM4N30sCi0KLQkJCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0hJLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWZyYW1lX2xlbmd0aF9saW5lc19oaX0sCi0JCQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19MTywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQlmcmFtZV9sZW5ndGhfbGluZXNfbG99LAotCQkJe1JFR19MSU5FX0xFTkdUSF9QQ0tfSEksCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJbGluZV9sZW5ndGhfcGNrX2hpfSwKLQkJCXtSRUdfTElORV9MRU5HVEhfUENLX0xPLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWxpbmVfbGVuZ3RoX3Bja19sb30sCi0JCQl7UkVHXzB4MDM0YywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzRjfSwKLQkJCXtSRUdfMHgwMzRkLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGR9LAotCQkJe1JFR18weDAzNGUsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM0ZX0sCi0JCQl7UkVHXzB4MDM0ZiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzRmfSwKLQotCQkJe1JFR18weDMwMDUsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMDV9LAotCQkJe1JFR18weDMwMTAsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMTB9LAotCQkJe1JFR18weDMwMTEsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMTF9LAotCQkJe1JFR18weDMwMWEsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMWF9LAotCQkJe1JFR18weDMwMzAsIDB4MDh9LAotCQkJe1JFR18weDMwMzUsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMzV9LAotCQkJe1JFR18weDMwNDEsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwNDF9LAotCQkJezB4MzA0Miwgdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzA0Mn0sCi0KLQkJCXsweDIwMCwgdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDIwMH0sCi0JCQl7MHgyMDEsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAyMDF9LAotCi0JCQl7MHgwYjA2LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjA2fSwKLQkJCS8qU2luZ2xlX2RlZmVjdF9jb3JyZWN0X3dlaWdodCA9IGF1dG8qLwotCQkJezB4MGIwNywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGIwN30sCi0JCQkvKkR5bmFtaWMgY291cGxldCBjb3JyZWN0aW9uIEVOQUJMRUQqLwotCQkJezB4MGIwOCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGIwOH0sCi0JCQkvKkR5bmFtaWMgY291cGxldCBjb3JyZWN0aW9uIHdlaWdodCovCi0JCQl7MHgwYjA5LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjA5fSwKLQotCQkJe1JFR18weDAxMzYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDAxMzZ9LAotCQkJe1JFR18weDAxMzcsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDAxMzd9LAotCi0JCQkvKkVET0Y6IEVzdGltYXRpb24gc2V0dGluZ3MgZm9yIFByZXZpZXcgbW9kZQotCQkJQXBwbGljYXRpb24gc2V0dGluZ3MgZm9yIGNhcHR1cmUKLQkJCW1vZGUoc3RhbmRhcmQgc2V0dGluZ3MgLSBOb3QgdHVuZWQpICovCi0JCQl7UkVHXzB4MGI4MCwgdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MGI4MH0sCi0JCQl7UkVHXzB4MGI4MywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4M30sCi0JCQl7UkVHXzB4MGI4NCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4NH0sCi0JCQl7UkVHXzB4MGI4NSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4NX0sCi0JCQl7UkVHXzB4MGI4OCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4OH0sCi0JCQl7UkVHXzB4MGI4OSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4OX0sCi0JCQl7UkVHXzB4MGI4YSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4YX0sCi0JCQl7MHgzMzkzLCAweDA2fSwgLyogbWFuX3NwZWNfZWRvZl9jdHJsX2Vkb2YqLwotCQkJezB4MzM5NCwgMHgwN30sIC8qIG1hbl9zcGVjX2Vkb2ZfY3RybF9lZG9mKi8KLQkJCX07Ci0KLQkJCXN0cnVjdCB2eDY5NTNfaTJjX3JlZ19jb25mIHNuYXBzaG90X21vZGVfdGJsW10gPSB7Ci0JCQl7UkVHX01PREVfU0VMRUNULAlNT0RFX1NFTEVDVF9TVEFOREJZX01PREV9LAotCQkJe1JFR18weDAxMTIsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDAxMTJ9LAotCQkJezB4NjAwMywgMHgwMX0sCi0JCQl7UkVHXzB4MDExMywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDExM30sCi0JCQl7UkVHX1ZUX1BJWF9DTEtfRElWLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQl2dF9waXhfY2xrX2Rpdn0sCi0JCQl7MHgzMDMsCTF9LCAvKiBWVF9TWVNfQ0xLX0RJViAqLwotCQkJe1JFR19QUkVfUExMX0NMS19ESVYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCXByZV9wbGxfY2xrX2Rpdn0sCi0JCQl7UkVHX1BMTF9NVUxUSVBMSUVSLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQlwbGxfbXVsdGlwbGllcn0sCi0JCQl7UkVHX09QX1BJWF9DTEtfRElWLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQlvcF9waXhfY2xrX2Rpdn0sCi0JCQl7MHgzMGIsCTF9LAotCQkJe1JFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9ISSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQljb2Fyc2VfaW50ZWdyYXRpb25fdGltZV9oaX0sCi0JCQl7UkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0xPLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX2xvfSwKLQkJCXtSRUdfQU5BTE9HVUVfR0FJTl9DT0RFX0dMT0JBTF9MTywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQlhbmFsb2d1ZV9nYWluX2NvZGVfZ2xvYmFsfSwKLQkJCXtSRUdfTElORV9MRU5HVEhfUENLX0hJLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWxpbmVfbGVuZ3RoX3Bja19oaX0sCi0JCQl7UkVHX0xJTkVfTEVOR1RIX1BDS19MTywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQlsaW5lX2xlbmd0aF9wY2tfbG99LAotCQkJe1JFR19GUkFNRV9MRU5HVEhfTElORVNfSEksCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJZnJhbWVfbGVuZ3RoX2xpbmVzX2hpfSwKLQkJCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0xPLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWZyYW1lX2xlbmd0aF9saW5lc19sb30sCi0JCQl7UkVHXzB4MzIxMCwgdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzIxMH0sCi0JCQl7UkVHXzB4MDExMSwgdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MTExfSwKLQotCQkJe1JFR18weDBiMDAsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiMDB9LAotCQkJezB4MzE0MCwgMHgwMX0sICAvKiBBVjJYMiBibG9jayBlbmFibGVkICovCi0JCQl7UkVHXzB4MzQxMCwgdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzQxMH0sCi0JCQl7MHgwYjA2LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjA2fSwKLQkJCS8qU2luZ2xlX2RlZmVjdF9jb3JyZWN0X3dlaWdodCA9IGF1dG8qLwotCQkJezB4MGIwNywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGIwN30sCi0JCQkvKkR5bmFtaWMgY291cGxldCBjb3JyZWN0aW9uIEVOQUJMRUQqLwotCQkJezB4MGIwOCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGIwOH0sCi0JCQkvKkR5bmFtaWMgY291cGxldCBjb3JyZWN0aW9uIHdlaWdodCovCi0JCQl7MHgwYjA5LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjA5fSwKLQotCi0JCQl7UkVHXzB4MzAwNCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAwNH0sCi0JCQl7UkVHXzB4MzAwNiwgMHgwMH0sCi0JCQl7UkVHXzB4MzAwNywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAwN30sCi0JCQl7MHgzMDFBLCAweDZBfSwKLQkJCXtSRUdfMHgzMDFiLCAweDI5fSwKLQkJCXtSRUdfMHgzMDM2LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMzZ9LAotCQkJe1JFR18weDMwNDUsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwNDV9LAotCQkJe1JFR18weDMwOTgsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwOTh9LAotCQkJe1JFR18weDMwOWQsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwOUR9LAotCi0JCQl7UkVHXzB4MDEzNiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDEzNn0sCi0JCQl7UkVHXzB4MDEzNywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDEzN30sCi0KLQkJCXtSRUdfMHgwYjgwLCB2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwYjgwfSwKLQkJCXtSRUdfMHgwYjgzLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjgzfSwKLQkJCXtSRUdfMHgwYjg0LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjg0fSwKLQkJCXtSRUdfMHgwYjg1LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjg1fSwKLQkJCXtSRUdfMHgwYjg4LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjg4fSwKLQkJCXtSRUdfMHgwYjg5LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjg5fSwKLQkJCXtSRUdfMHgwYjhhLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjhhfSwKLQkJCXsweDMzOTMsIDB4MDZ9LCAvKiBtYW5fc3BlY19lZG9mX2N0cmwqLwotCQkJezB4MzM5NCwgMHgwN30sIC8qIG1hbl9zcGVjX2Vkb2ZfY3RybCovCi0JCQl9OwotCQkJLyogc3RvcCBzdHJlYW1pbmcgKi8KLQkJCW1zbGVlcCg1KTsKLQotCQkJLyogUmVzZXQgZXZlcnl0aGluZyBmaXJzdCAqLwotCi0JCQlpZiAodng2OTUzX2kyY193cml0ZV9iX3NlbnNvcigweDEwMywgMHgwMSkgPCAwKSB7Ci0JCQkJQ0RCRygiUy9XIHJlc2V0IGZhaWxlZFxuIik7Ci0JCQkJcmV0dXJuIHJjOwotCQkJfSBlbHNlCi0JCQkJQ0RCRygiUy9XIHJlc2V0IHN1Y2Nlc3NmdWxcbiIpOwotCi0JCQltc2xlZXAoMTApOwotCi0JCQlpZiAodng2OTUzX2kyY193cml0ZV9iX3NlbnNvcihSRUdfTU9ERV9TRUxFQ1QsCi0JCQkJTU9ERV9TRUxFQ1RfU1RBTkRCWV9NT0RFKSA8IDApCi0JCQkJcmV0dXJuIHJjOwotCQkJLyp2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSovCi0JCQltc2xlZXAodng2OTUzX3N0bTVtMGVkb2ZfZGVsYXlfbXNlY3Nfc3RkYnkpOwotCi0JCQl2eDY5NTNfY3NpX3BhcmFtcy5kYXRhX2Zvcm1hdCA9IENTSV84QklUOwotCQkJdng2OTUzX2NzaV9wYXJhbXMubGFuZV9jbnQgPSAxOwotCQkJdng2OTUzX2NzaV9wYXJhbXMubGFuZV9hc3NpZ24gPSAweGU0OwotCQkJdng2OTUzX2NzaV9wYXJhbXMuZHBjbV9zY2hlbWUgPSAwOwotCQkJdng2OTUzX2NzaV9wYXJhbXMuc2V0dGxlX2NudCA9IDc7Ci0JCQlyYyA9IG1zbV9jYW1pb19jc2lfY29uZmlnKCZ2eDY5NTNfY3NpX3BhcmFtcyk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCUNEQkcoIiBjb25maWcgY3NpIGNvbnRyb2xsZXIgZmFpbGVkXG4iKTsKLQotCQkJbXNsZWVwKHZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5KTsKLQotCQkJdng2OTUzX3BhdGNoX2Zvcl9jdXQzKCk7Ci0KLQkJCW1zbGVlcCh2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSk7Ci0KLQkJCWlmIChydCA9PSBSRVNfUFJFVklFVykgewotCQkJCXJjID0gdng2OTUzX2kyY193cml0ZV93X3RhYmxlKAotCQkJCQkmcHJldmlld19tb2RlX3RibFswXSwKLQkJCQkJQVJSQVlfU0laRShwcmV2aWV3X21vZGVfdGJsKSk7Ci0JCQkJaWYgKHJjIDwgMCkKLQkJCQkJcmV0dXJuIHJjOwotCQkJfQotCQkJaWYgKHJ0ID09IFJFU19DQVBUVVJFKSB7Ci0JCQkJcmMgPSB2eDY5NTNfaTJjX3dyaXRlX3dfdGFibGUoCi0JCQkJCSZzbmFwc2hvdF9tb2RlX3RibFswXSwKLQkJCQkJQVJSQVlfU0laRShzbmFwc2hvdF9tb2RlX3RibCkpOwotCQkJCWlmIChyYyA8IDApCi0JCQkJCXJldHVybiByYzsKLQkJCX0KLQkJCW1zbGVlcCh2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSk7Ci0KLQkJCS8qIFN0YXJ0IHNlbnNvciBzdHJlYW1pbmcgKi8KLQkJCWlmICh2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19NT0RFX1NFTEVDVCwKLQkJCQlNT0RFX1NFTEVDVF9TVFJFQU0pIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQltc2xlZXAodng2OTUzX3N0bTVtMGVkb2ZfZGVsYXlfbXNlY3Nfc3RyZWFtKTsKLQkJCS8qIG1hbl9zcGVjX2Vkb2ZfY3RybF90dW5lX3Ntb290aF9sb3dsaWdodCovCi0JCQl2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MzM4ZCwgMHgwOCk7Ci0JCQkvKiBtYW5fc3BlY19lZG9mX2N0cmxfdHVuZV9zbW9vdGhfaW5kb29yKi8KLQkJCXZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoMHgzMzhlLCAweDA4KTsKLQkJCS8qIG1hbl9zcGVjX2Vkb2ZfY3RybF90dW5lX3Ntb290aF9vdXRkb29yKi8KLQkJCXZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoMHgzMzhmLCAweDAwKTsKLQkJCS8qQXBwbHkgQ2FwdHVyZSBGUEdBIHN0YXRlIG1hY2hpbmUgcmVzZXQqLwotCQkJdng2OTUzX2kyY193cml0ZV9iX3NlbnNvcigweDE2LCAweDAwKTsKLQkJCW1zbGVlcCgxMDApOwotCQkJdng2OTUzX2kyY193cml0ZV9iX3NlbnNvcigweDE2LCAweDAxKTsKLQotCQkJaWYgKHZ4Njk1M19pMmNfcmVhZCgweDAwMDUsICZmcmFtZV9jbnQsIDEpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCXdoaWxlIChmcmFtZV9jbnQgPT0gMHhGRikgewotCQkJCWlmICh2eDY5NTNfaTJjX3JlYWQoMHgwMDA1LCAmZnJhbWVfY250LCAxKSA8IDApCi0JCQkJCXJldHVybiByYzsKLQkJCQlDREJHKCJmcmFtZV9jbnQ9JWQiLCBmcmFtZV9jbnQpOwotCQkJCW1zbGVlcCgxMCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfSBlbHNlIHsKLQkJc3dpdGNoICh1cGRhdGVfdHlwZSkgewotCQljYXNlIFJFR19JTklUOgotCQlpZiAocnQgPT0gUkVTX1BSRVZJRVcgfHwgcnQgPT0gUkVTX0NBUFRVUkUpIHsKLQkJCXN0cnVjdCB2eDY5NTNfaTJjX3JlZ19jb25mIGluaXRfdGJsW10gPSB7Ci0JCQl7UkVHXzB4MDExMiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDExMn0sCi0JCQl7UkVHXzB4MDExMywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDExM30sCi0JCQl7UkVHX1ZUX1BJWF9DTEtfRElWLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQl2dF9waXhfY2xrX2Rpdn0sCi0JCQl7UkVHX1BSRV9QTExfQ0xLX0RJViwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJcHJlX3BsbF9jbGtfZGl2fSwKLQkJCXtSRUdfUExMX01VTFRJUExJRVIsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCXBsbF9tdWx0aXBsaWVyfSwKLQkJCXtSRUdfT1BfUElYX0NMS19ESVYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCW9wX3BpeF9jbGtfZGl2fSwKLQkJCXtSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfSEksCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJY29hcnNlX2ludGVncmF0aW9uX3RpbWVfaGl9LAotCQkJe1JFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9MTywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQljb2Fyc2VfaW50ZWdyYXRpb25fdGltZV9sb30sCi0JCQl7UkVHX0FOQUxPR1VFX0dBSU5fQ09ERV9HTE9CQUxfTE8sCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJYW5hbG9ndWVfZ2Fpbl9jb2RlX2dsb2JhbH0sCi0JCQl7UkVHXzB4MzAzMCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAzMH0sCi0JCQkvKiA5NTMgc3BlY2lmaWMgcmVnaXN0ZXJzICovCi0JCQl7UkVHXzB4MDExMSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDExMX0sCi0JCQl7UkVHXzB4MGIwMCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGIwMH0sCi0JCQl7UkVHXzB4MzAwMSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAwMX0sCi0JCQl7UkVHXzB4MzAwNCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAwNH0sCi0JCQl7UkVHXzB4MzAwNywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAwN30sCi0JCQl7UkVHXzB4MzAxNiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAxNn0sCi0JCQl7UkVHXzB4MzAxZCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAxZH0sCi0JCQl7UkVHXzB4MzE3ZSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzE3ZX0sCi0JCQl7UkVHXzB4MzE3ZiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzE3Zn0sCi0JCQl7UkVHXzB4MzQwMCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzQwMH0sCi0JCQkvKiBERUZDT1Igc2V0dGluZ3MgKi8KLQkJCS8qU2luZ2xlIERlZmVjdCBDb3JyZWN0aW9uIFdlaWdodCBESVNBQkxFKi8KLQkJCXsweDBiMDYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiMDZ9LAotCQkJLypTaW5nbGVfZGVmZWN0X2NvcnJlY3Rfd2VpZ2h0ID0gYXV0byovCi0JCQl7MHgwYjA3LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjA3fSwKLQkJCS8qRHluYW1pYyBjb3VwbGV0IGNvcnJlY3Rpb24gRU5BQkxFRCovCi0JCQl7MHgwYjA4LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjA4fSwKLQkJCS8qRHluYW1pYyBjb3VwbGV0IGNvcnJlY3Rpb24gd2VpZ2h0Ki8KLQkJCXsweDBiMDksCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiMDl9LAotCQkJLyogQ2xvY2sgU2V0dXAgKi8KLQkJCS8qIFRlbGwgc2Vuc29yIGV4dCBjbGsgaXMgMjRNSHoqLwotCQkJezB4MDEzNiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDEzNn0sCi0JCQl7MHgwMTM3LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwMTM3fSwKLQkJCS8qIFRoZSB3aGl0ZSBiYWxhbmNlIGdhaW5zIG11c3QgYmUgd3JpdHRlbgotCQkJdG8gdGhlIHNlbnNvciBldmVyeSBmcmFtZS4gKi8KLQkJCS8qIEVkb2YgKi8KLQkJCXtSRUdfMHgwYjgzLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjgzfSwKLQkJCXtSRUdfMHgwYjg0LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjg0fSwKLQkJCXsweDBiODUsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiODV9LAotCQkJezB4MGI4OCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4OH0sCi0JCQl7MHgwYjg5LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjg5fSwKLQkJCXtSRUdfMHgwYjhhLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjhhfSwKLQkJCS8qIE1vZGUgc3BlY2lmaWMgcmVnaWV0ZXJzICovCi0JCQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19ISSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQlmcmFtZV9sZW5ndGhfbGluZXNfaGl9LAotCQkJe1JFR19GUkFNRV9MRU5HVEhfTElORVNfTE8sCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJZnJhbWVfbGVuZ3RoX2xpbmVzX2xvfSwKLQkJCXtSRUdfTElORV9MRU5HVEhfUENLX0hJLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWxpbmVfbGVuZ3RoX3Bja19oaX0sCi0JCQl7UkVHX0xJTkVfTEVOR1RIX1BDS19MTywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQlsaW5lX2xlbmd0aF9wY2tfbG99LAotCQkJe1JFR18weDMwMDUsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAwNX0sCi0JCQl7MHgzMDEwLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMTB9LAotCQkJe1JFR18weDMwMTEsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAxMX0sCi0JCQl7UkVHXzB4MzAxYSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDFhfSwKLQkJCXtSRUdfMHgzMDM1LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMzV9LAotCQkJe1JFR18weDMwMzYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAzNn0sCi0JCQl7UkVHXzB4MzA0MSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDQxfSwKLQkJCXsweDMwNDIsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzA0Mn0sCi0JCQl7UkVHXzB4MzA0NSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDQ1fSwKLQkJCS8qRURPRjogRXN0aW1hdGlvbiBzZXR0aW5ncyBmb3IgUHJldmlldyBtb2RlCi0JCQlBcHBsaWNhdGlvbiBzZXR0aW5ncyBmb3IgY2FwdHVyZSBtb2RlCi0JCQkoc3RhbmRhcmQgc2V0dGluZ3MgLSBOb3QgdHVuZWQpICovCi0JCQl7UkVHXzB4MGI4MCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwYjgwfSwKLQkJCXtSRUdfMHgwOTAwLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDA5MDB9LAotCQkJe1JFR18weDA5MDEsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDkwMX0sCi0JCQl7UkVHXzB4MDkwMiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwOTAyfSwKLQkJCXtSRUdfMHgwMzgzLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzODN9LAotCQkJe1JFR18weDAzODcsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM4N30sCi0JCQkvKiBDaGFuZ2Ugb3V0cHV0IHNpemUgLyBmcmFtZSByYXRlICovCi0JCQl7UkVHXzB4MDM0YywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzRjfSwKLQkJCXtSRUdfMHgwMzRkLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGR9LAotCQkJe1JFR18weDAzNGUsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM0ZX0sCi0JCQl7UkVHXzB4MDM0ZiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzRmfSwKLQkJCXtSRUdfMHgxNzE2LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDE3MTZ9LAotCQkJe1JFR18weDE3MTcsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MTcxN30sCi0JCQl7UkVHXzB4MTcxOCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgxNzE4fSwKLQkJCXtSRUdfMHgxNzE5LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDE3MTl9LAotCQkJfTsKLQkJCS8qIHJlc2V0IGZwc19kaXZpZGVyICovCi0JCQl2eDY5NTNfY3RybC0+ZnBzID0gMzAgKiBRODsKLQkJCS8qIHN0b3Agc3RyZWFtaW5nICovCi0KLQkJCS8qIFJlc2V0IGV2ZXJ5dGhpbmcgZmlyc3QgKi8KLQkJCWlmICh2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MTAzLCAweDAxKSA8IDApIHsKLQkJCQlDREJHKCJTL1cgcmVzZXQgZmFpbGVkXG4iKTsKLQkJCQlyZXR1cm4gcmM7Ci0JCQl9IGVsc2UKLQkJCQlDREJHKCJTL1cgcmVzZXQgc3VjY2Vzc2Z1bFxuIik7Ci0KLQkJCW1zbGVlcCgxMCk7Ci0KLQkJCUNEQkcoIkluaXQgdng2OTUzX3NlbnNvcl9zZXR0aW5nIHN0YW5kYnlcbiIpOwotCQkJaWYgKHZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX01PREVfU0VMRUNULAotCQkJCU1PREVfU0VMRUNUX1NUQU5EQllfTU9ERSkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCQkvKnZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5Ki8KLQkJCW1zbGVlcCh2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSk7Ci0JCQl2eDY5NTNfcGF0Y2hfZm9yX2N1dDIoKTsKLQkJCXJjID0gdng2OTUzX2kyY193cml0ZV93X3RhYmxlKCZpbml0X3RibFswXSwKLQkJCQlBUlJBWV9TSVpFKGluaXRfdGJsKSk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCQltc2xlZXAodng2OTUzX3N0bTVtMGVkb2ZfZGVsYXlfbXNlY3Nfc3RkYnkpOwotCQl9Ci0JCXJldHVybiByYzsKLQkJY2FzZSBVUERBVEVfUEVSSU9ESUM6Ci0JCWlmIChydCA9PSBSRVNfUFJFVklFVyB8fCBydCA9PSBSRVNfQ0FQVFVSRSkgewotCQkJc3RydWN0IHZ4Njk1M19pMmNfcmVnX2NvbmYgaW5pdF9tb2RlX3RibFtdID0gIHsKLQkJCXtSRUdfMHgwMTEyLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwMTEyfSwKLQkJCXtSRUdfMHgwMTEzLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwMTEzfSwKLQkJCXtSRUdfVlRfUElYX0NMS19ESVYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCXZ0X3BpeF9jbGtfZGl2fSwKLQkJCXtSRUdfUFJFX1BMTF9DTEtfRElWLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQlwcmVfcGxsX2Nsa19kaXZ9LAotCQkJe1JFR19QTExfTVVMVElQTElFUiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJcGxsX211bHRpcGxpZXJ9LAotCQkJe1JFR19PUF9QSVhfQ0xLX0RJViwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJb3BfcGl4X2Nsa19kaXZ9LAotCQkJe1JFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9ISSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQljb2Fyc2VfaW50ZWdyYXRpb25fdGltZV9oaX0sCi0JCQl7UkVHX0NPQVJTRV9JTlRFR1JBVElPTl9USU1FX0xPLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX2xvfSwKLQkJCXtSRUdfQU5BTE9HVUVfR0FJTl9DT0RFX0dMT0JBTF9MTywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQlhbmFsb2d1ZV9nYWluX2NvZGVfZ2xvYmFsfSwKLQkJCXtSRUdfMHgzMDMwLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDMwfSwKLQkJCS8qIDk1MyBzcGVjaWZpYyByZWdpc3RlcnMgKi8KLQkJCXtSRUdfMHgwMTExLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwMTExfSwKLQkJCXtSRUdfMHgwYjAwLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjAwfSwKLQkJCXtSRUdfMHgzMDAxLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDAxfSwKLQkJCXtSRUdfMHgzMDA0LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDA0fSwKLQkJCXtSRUdfMHgzMDA3LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDA3fSwKLQkJCXtSRUdfMHgzMDE2LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDE2fSwKLQkJCXtSRUdfMHgzMDFkLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMDFkfSwKLQkJCXtSRUdfMHgzMTdlLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMTdlfSwKLQkJCXtSRUdfMHgzMTdmLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzMTdmfSwKLQkJCXtSRUdfMHgzNDAwLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgzNDAwfSwKLQkJCXsweDBiMDYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiMDZ9LAotCQkJLypTaW5nbGVfZGVmZWN0X2NvcnJlY3Rfd2VpZ2h0ID0gYXV0byovCi0JCQl7MHgwYjA3LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjA3fSwKLQkJCS8qRHluYW1pYyBjb3VwbGV0IGNvcnJlY3Rpb24gRU5BQkxFRCovCi0JCQl7MHgwYjA4LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjA4fSwKLQkJCS8qRHluYW1pYyBjb3VwbGV0IGNvcnJlY3Rpb24gd2VpZ2h0Ki8KLQkJCXsweDBiMDksCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiMDl9LAotCQkJLyogQ2xvY2sgU2V0dXAgKi8KLQkJCS8qIFRlbGwgc2Vuc29yIGV4dCBjbGsgaXMgMjRNSHoqLwotCQkJezB4MDEzNiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDEzNn0sCi0JCQl7MHgwMTM3LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwMTM3fSwKLQkJCS8qIFRoZSB3aGl0ZSBiYWxhbmNlIGdhaW5zIG11c3QgYmUgd3JpdHRlbgotCQkJdG8gdGhlIHNlbnNvciBldmVyeSBmcmFtZS4gKi8KLQkJCS8qIEVkb2YgKi8KLQkJCXtSRUdfMHgwYjgzLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjgzfSwKLQkJCXtSRUdfMHgwYjg0LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjg0fSwKLQkJCXsweDBiODUsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiODV9LAotCQkJezB4MGI4OCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4OH0sCi0JCQl7MHgwYjg5LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjg5fSwKLQkJCXtSRUdfMHgwYjhhLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjhhfSwKLQkJCS8qIE1vZGUgc3BlY2lmaWMgcmVnaWV0ZXJzICovCi0JCQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19ISSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQlmcmFtZV9sZW5ndGhfbGluZXNfaGl9LAotCQkJe1JFR19GUkFNRV9MRU5HVEhfTElORVNfTE8sCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQkJZnJhbWVfbGVuZ3RoX2xpbmVzX2xvfSwKLQkJCXtSRUdfTElORV9MRU5HVEhfUENLX0hJLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJCWxpbmVfbGVuZ3RoX3Bja19oaX0sCi0JCQl7UkVHX0xJTkVfTEVOR1RIX1BDS19MTywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCQlsaW5lX2xlbmd0aF9wY2tfbG99LAotCQkJe1JFR18weDMwMDUsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAwNX0sCi0JCQl7MHgzMDEwLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMTB9LAotCQkJe1JFR18weDMwMTEsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAxMX0sCi0JCQl7UkVHXzB4MzAxYSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDFhfSwKLQkJCXtSRUdfMHgzMDM1LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMzV9LAotCQkJe1JFR18weDMwMzYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAzNn0sCi0JCQl7UkVHXzB4MzA0MSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDQxfSwKLQkJCXsweDMwNDIsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzA0Mn0sCi0JCQl7UkVHXzB4MzA0NSwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDQ1fSwKLQkJCS8qRURPRjogRXN0aW1hdGlvbiBzZXR0aW5ncyBmb3IgUHJldmlldyBtb2RlCi0JCQlBcHBsaWNhdGlvbiBzZXR0aW5ncyBmb3IgY2FwdHVyZSBtb2RlCi0JCQkoc3RhbmRhcmQgc2V0dGluZ3MgLSBOb3QgdHVuZWQpICovCi0JCQl7UkVHXzB4MGI4MCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwYjgwfSwKLQkJCXtSRUdfMHgwOTAwLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDA5MDB9LAotCQkJe1JFR18weDA5MDEsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDkwMX0sCi0JCQl7UkVHXzB4MDkwMiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwOTAyfSwKLQkJCXtSRUdfMHgwMzgzLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzODN9LAotCQkJe1JFR18weDAzODcsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM4N30sCi0JCQkvKiBDaGFuZ2Ugb3V0cHV0IHNpemUgLyBmcmFtZSByYXRlICovCi0JCQl7UkVHXzB4MDM0YywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzRjfSwKLQkJCXtSRUdfMHgwMzRkLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGR9LAotCQkJe1JFR18weDAzNGUsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM0ZX0sCi0JCQl7UkVHXzB4MDM0ZiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzRmfSwKLQkJCXtSRUdfMHgxNzE2LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDE3MTZ9LAotCQkJe1JFR18weDE3MTcsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MTcxN30sCi0JCQl7UkVHXzB4MTcxOCwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgxNzE4fSwKLQkJCXtSRUdfMHgxNzE5LAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDE3MTl9LAotCQkJfTsKLQkJCXN0cnVjdCB2eDY5NTNfaTJjX3JlZ19jb25mIG1vZGVfdGJsW10gPSB7Ci0JCQl7UkVHXzB4MDExMiwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDExMn0sCi0JCQl7UkVHXzB4MDExMywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDExM30sCi0JCQl7UkVHX1ZUX1BJWF9DTEtfRElWLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCQl2dF9waXhfY2xrX2Rpdn0sCi0JCQl7UkVHX1BSRV9QTExfQ0xLX0RJViwKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQkJcHJlX3BsbF9jbGtfZGl2fSwKLQkJCXtSRUdfUExMX01VTFRJUExJRVIsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCXBsbF9tdWx0aXBsaWVyfSwKLQkJCXtSRUdfT1BfUElYX0NMS19ESVYsCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJCW9wX3BpeF9jbGtfZGl2fSwKLQkJLyogTW9kZSBzcGVjaWZpYyByZWdpZXRlcnMgKi8KLQkJCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0hJLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLmZyYW1lX2xlbmd0aF9saW5lc19oaX0sCi0JCQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19MTywKLQkJCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5mcmFtZV9sZW5ndGhfbGluZXNfbG99LAotCQkJe1JFR19MSU5FX0xFTkdUSF9QQ0tfSEksCi0JCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ubGluZV9sZW5ndGhfcGNrX2hpfSwKLQkJCXtSRUdfTElORV9MRU5HVEhfUENLX0xPLAotCQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLmxpbmVfbGVuZ3RoX3Bja19sb30sCi0JCQl7UkVHXzB4MzAwNSwgdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAwNX0sCi0JCQl7MHgzMDEwLCB2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDEwfSwKLQkJCXtSRUdfMHgzMDExLCB2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDExfSwKLQkJCXtSRUdfMHgzMDFhLCB2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDFhfSwKLQkJCXtSRUdfMHgzMDM1LCB2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDM1fSwKLQkJCXtSRUdfMHgzMDM2LCB2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDM2fSwKLQkJCXtSRUdfMHgzMDQxLCB2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDQxfSwKLQkJCXsweDMwNDIsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwNDJ9LAotCQkJe1JFR18weDMwNDUsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwNDV9LAotCQkJLypFRE9GOiBFc3RpbWF0aW9uIHNldHRpbmdzIGZvciBQcmV2aWV3IG1vZGUKLQkJCUFwcGxpY2F0aW9uIHNldHRpbmdzIGZvciBjYXB0dXJlCi0JCQltb2RlKHN0YW5kYXJkIHNldHRpbmdzIC0gTm90IHR1bmVkKSAqLwotCQkJe1JFR18weDBiODAsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDBiODB9LAotCQkJe1JFR18weDA5MDAsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDA5MDB9LAotCQkJe1JFR18weDA5MDEsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDA5MDF9LAotCQkJe1JFR18weDA5MDIsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDA5MDJ9LAotCQkJe1JFR18weDAzODMsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzODN9LAotCQkJe1JFR18weDAzODcsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzODd9LAotCQkJLyogQ2hhbmdlIG91dHB1dCBzaXplIC8gZnJhbWUgcmF0ZSAqLwotCQkJe1JFR18weDAzNGMsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGN9LAotCQkJe1JFR18weDAzNGQsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGR9LAotCQkJe1JFR18weDAzNGUsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGV9LAotCQkJe1JFR18weDAzNGYsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGZ9LAotCQkJLyp7MHgyMDAsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAyMDB9LAotCQkJezB4MjAxLCB2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMjAxfSwqLwotCQkJe1JFR18weDE3MTYsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDE3MTZ9LAotCQkJe1JFR18weDE3MTcsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDE3MTd9LAotCQkJe1JFR18weDE3MTgsIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDE3MTh9LAotCQkJe1JFR18weDE3MTksIHZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDE3MTl9LAotCQkJfTsKLQkJCS8qIHN0b3Agc3RyZWFtaW5nICovCi0JCQltc2xlZXAoNSk7Ci0KLQkJCS8qIFJlc2V0IGV2ZXJ5dGhpbmcgZmlyc3QgKi8KLQkJCWlmICh2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MTAzLCAweDAxKSA8IDApIHsKLQkJCQlDREJHKCJTL1cgcmVzZXQgZmFpbGVkXG4iKTsKLQkJCQlyZXR1cm4gcmM7Ci0JCQl9IGVsc2UKLQkJCQlDREJHKCJTL1cgcmVzZXQgc3VjY2Vzc2Z1bFxuIik7Ci0KLQkJCW1zbGVlcCgxMCk7Ci0KLQkJCWlmICh2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19NT0RFX1NFTEVDVCwKLQkJCQlNT0RFX1NFTEVDVF9TVEFOREJZX01PREUpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQkvKnZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5Ki8KLQkJCW1zbGVlcCh2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSk7Ci0KLQkJCXZ4Njk1M19jc2lfcGFyYW1zLmRhdGFfZm9ybWF0ID0gQ1NJXzhCSVQ7Ci0JCQl2eDY5NTNfY3NpX3BhcmFtcy5sYW5lX2NudCA9IDE7Ci0JCQl2eDY5NTNfY3NpX3BhcmFtcy5sYW5lX2Fzc2lnbiA9IDB4ZTQ7Ci0JCQl2eDY5NTNfY3NpX3BhcmFtcy5kcGNtX3NjaGVtZSA9IDA7Ci0JCQl2eDY5NTNfY3NpX3BhcmFtcy5zZXR0bGVfY250ID0gNzsKLQkJCXJjID0gbXNtX2NhbWlvX2NzaV9jb25maWcoJnZ4Njk1M19jc2lfcGFyYW1zKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJQ0RCRygiIGNvbmZpZyBjc2kgY29udHJvbGxlciBmYWlsZWRcbiIpOwotCi0JCQltc2xlZXAodng2OTUzX3N0bTVtMGVkb2ZfZGVsYXlfbXNlY3Nfc3RkYnkpOwotCi0JCQl2eDY5NTNfcGF0Y2hfZm9yX2N1dDIoKTsKLQkJCXJjID0gdng2OTUzX2kyY193cml0ZV93X3RhYmxlKCZpbml0X21vZGVfdGJsWzBdLAotCQkJCUFSUkFZX1NJWkUoaW5pdF9tb2RlX3RibCkpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0KLQkJCW1zbGVlcCh2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSk7Ci0KLQkJCXJjID0gdng2OTUzX2kyY193cml0ZV93X3RhYmxlKCZtb2RlX3RibFswXSwKLQkJCQlBUlJBWV9TSVpFKG1vZGVfdGJsKSk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJbXNsZWVwKHZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5KTsKLQotCQkJLyogU3RhcnQgc2Vuc29yIHN0cmVhbWluZyAqLwotCQkJaWYgKHZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX01PREVfU0VMRUNULAotCQkJCU1PREVfU0VMRUNUX1NUUkVBTSkgPCAwKQotCQkJCXJldHVybiByYzsKLQkJCW1zbGVlcCh2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdHJlYW0pOwotCi0JCQlpZiAodng2OTUzX2kyY19yZWFkKDB4MDAwNSwgJmZyYW1lX2NudCwgMSkgPCAwKQotCQkJCXJldHVybiByYzsKLQotCQkJd2hpbGUgKGZyYW1lX2NudCA9PSAweEZGKSB7Ci0JCQkJaWYgKHZ4Njk1M19pMmNfcmVhZCgweDAwMDUsICZmcmFtZV9jbnQsIDEpIDwgMCkKLQkJCQkJcmV0dXJuIHJjOwotCQkJCUNEQkcoImZyYW1lX2NudD0lZCIsIGZyYW1lX2NudCk7Ci0JCQkJbXNsZWVwKDEwKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JCWRlZmF1bHQ6Ci0JCXJldHVybiByYzsKLQl9Ci0JfQotCXJldHVybiByYzsKLX0KLQotCi1zdGF0aWMgaW50MzJfdCB2eDY5NTNfdmlkZW9fY29uZmlnKGludCBtb2RlKQotewotCi0JaW50MzJfdAlyYyA9IDA7Ci0JaW50CXJ0OwotCS8qIGNoYW5nZSBzZW5zb3IgcmVzb2x1dGlvbglpZiBuZWVkZWQgKi8KLQlpZiAodng2OTUzX2N0cmwtPnByZXZfcmVzID09IFFUUl9TSVpFKSB7Ci0JCXJ0ID0gUkVTX1BSRVZJRVc7Ci0JCXZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5CT0KLQkJCSgoKCgyICogMTAwMCAqIHZ4Njk1M19jdHJsLT5mcHNfZGl2aWRlcikgLwotCQkJdng2OTUzX2N0cmwtPmZwcykgKiBROCkgLyBRMTApICsgMTsKLQl9IGVsc2UgewotCQlydCA9IFJFU19DQVBUVVJFOwotCQl2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieQk9Ci0JCQkoKCgoMTAwMCAqIHZ4Njk1M19jdHJsLT5mcHNfZGl2aWRlcikgLwotCQkJdng2OTUzX2N0cmwtPmZwcykgKiBROCkgLyBRMTApICsgMTsKLQl9Ci0JaWYgKHZ4Njk1M19zZW5zb3Jfc2V0dGluZyhVUERBVEVfUEVSSU9ESUMsIHJ0KSA8IDApCi0JCXJldHVybiByYzsKLQlpZiAodng2OTUzX2N0cmwtPnNldF90ZXN0KSB7Ci0JCWlmICh2eDY5NTNfdGVzdCh2eDY5NTNfY3RybC0+c2V0X3Rlc3QpIDwgMCkKLQkJCXJldHVybglyYzsKLQl9Ci0Jdng2OTUzX2N0cmwtPmVkb2ZfbW9kZSA9IFZYNjk1M19FRE9GX0VTVElNQVRJT047Ci0JcmMgPSB2eDY5NTNfZW5hYmxlX2Vkb2Yodng2OTUzX2N0cmwtPmVkb2ZfbW9kZSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXZ4Njk1M19jdHJsLT5jdXJyX3JlcyA9IHZ4Njk1M19jdHJsLT5wcmV2X3JlczsKLQl2eDY5NTNfY3RybC0+c2Vuc29ybW9kZSA9IG1vZGU7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50MzJfdCB2eDY5NTNfc25hcHNob3RfY29uZmlnKGludCBtb2RlKQotewotCWludDMyX3QgcmMgPSAwOwotCWludCBydDsKLQkvKmNoYW5nZSBzZW5zb3IgcmVzb2x1dGlvbiBpZiBuZWVkZWQgKi8KLQlpZiAodng2OTUzX2N0cmwtPmN1cnJfcmVzICE9IHZ4Njk1M19jdHJsLT5waWN0X3JlcykgewotCQlpZiAodng2OTUzX2N0cmwtPnBpY3RfcmVzID09IFFUUl9TSVpFKSB7Ci0JCQlydCA9IFJFU19QUkVWSUVXOwotCQkJdng2OTUzX3N0bTVtMGVkb2ZfZGVsYXlfbXNlY3Nfc3RkYnkgPQotCQkJCSgoKCgyICogMTAwMCAqIHZ4Njk1M19jdHJsLT5mcHNfZGl2aWRlcikgLwotCQkJCXZ4Njk1M19jdHJsLT5mcHMpICogUTgpIC8gUTEwKSArIDE7Ci0JCX0gZWxzZSB7Ci0JCQlydCA9IFJFU19DQVBUVVJFOwotCQkJdng2OTUzX3N0bTVtMGVkb2ZfZGVsYXlfbXNlY3Nfc3RkYnkgPQotCQkJCSgoKCgxMDAwICogdng2OTUzX2N0cmwtPmZwc19kaXZpZGVyKSAvCi0JCQkJdng2OTUzX2N0cmwtPmZwcykgKiBROCkgLyBRMTApICsgMTsKLQkJfQotCWlmICh2eDY5NTNfc2Vuc29yX3NldHRpbmcoVVBEQVRFX1BFUklPRElDLCBydCkgPCAwKQotCQlyZXR1cm4gcmM7Ci0JfQotCi0Jdng2OTUzX2N0cmwtPmVkb2ZfbW9kZSA9IFZYNjk1M19FRE9GX0FQUExJQ0FUSU9OOwotCWlmICh2eDY5NTNfZW5hYmxlX2Vkb2Yodng2OTUzX2N0cmwtPmVkb2ZfbW9kZSkgPCAwKQotCQlyZXR1cm4gcmM7Ci0Jdng2OTUzX2N0cmwtPmN1cnJfcmVzID0gdng2OTUzX2N0cmwtPnBpY3RfcmVzOwotCXZ4Njk1M19jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19IC8qZW5kIG9mIHZ4Njk1M19zbmFwc2hvdF9jb25maWcqLwotCi1zdGF0aWMgaW50MzJfdCB2eDY5NTNfcmF3X3NuYXBzaG90X2NvbmZpZyhpbnQgbW9kZSkKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlpbnQgcnQ7Ci0JLyogY2hhbmdlIHNlbnNvciByZXNvbHV0aW9uIGlmIG5lZWRlZCAqLwotCWlmICh2eDY5NTNfY3RybC0+Y3Vycl9yZXMgIT0gdng2OTUzX2N0cmwtPnBpY3RfcmVzKSB7Ci0JCWlmICh2eDY5NTNfY3RybC0+cGljdF9yZXMgPT0gUVRSX1NJWkUpIHsKLQkJCXJ0ID0gUkVTX1BSRVZJRVc7Ci0JCQl2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSA9Ci0JCQkJKCgoKDIgKiAxMDAwICogdng2OTUzX2N0cmwtPmZwc19kaXZpZGVyKS8KLQkJCQl2eDY5NTNfY3RybC0+ZnBzKSAqIFE4KSAvIFExMCkgKyAxOwotCQl9IGVsc2UgewotCQkJcnQgPSBSRVNfQ0FQVFVSRTsKLQkJCXZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5ID0KLQkJCQkoKCgoMTAwMCAqIHZ4Njk1M19jdHJsLT5mcHNfZGl2aWRlcikvCi0JCQkJdng2OTUzX2N0cmwtPmZwcykgKiBROCkgLyBRMTApICsgMTsKLQkJfQotCQlpZiAodng2OTUzX3NlbnNvcl9zZXR0aW5nKFVQREFURV9QRVJJT0RJQywgcnQpIDwgMCkKLQkJCXJldHVybiByYzsKLQl9Ci0Jdng2OTUzX2N0cmwtPmVkb2ZfbW9kZSA9IFZYNjk1M19FRE9GX0FQUExJQ0FUSU9OOwotCWlmICh2eDY5NTNfZW5hYmxlX2Vkb2Yodng2OTUzX2N0cmwtPmVkb2ZfbW9kZSkgPCAwKQotCQlyZXR1cm4gcmM7Ci0Jdng2OTUzX2N0cmwtPmN1cnJfcmVzID0gdng2OTUzX2N0cmwtPnBpY3RfcmVzOwotCXZ4Njk1M19jdHJsLT5zZW5zb3Jtb2RlID0gbW9kZTsKLQlyZXR1cm4gcmM7Ci19IC8qZW5kIG9mIHZ4Njk1M19yYXdfc25hcHNob3RfY29uZmlnKi8KLXN0YXRpYyBpbnQzMl90IHZ4Njk1M19zZXRfc2Vuc29yX21vZGUoaW50IG1vZGUsCi0JaW50IHJlcykKLXsKLQlpbnQzMl90IHJjID0gMDsKLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFNFTlNPUl9QUkVWSUVXX01PREU6Ci0JCXJjID0gdng2OTUzX3ZpZGVvX2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfU05BUFNIT1RfTU9ERToKLQkJcmMgPSB2eDY5NTNfc25hcHNob3RfY29uZmlnKG1vZGUpOwotCQlicmVhazsKLQljYXNlIFNFTlNPUl9SQVdfU05BUFNIT1RfTU9ERToKLQkJcmMgPSB2eDY5NTNfcmF3X3NuYXBzaG90X2NvbmZpZyhtb2RlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotc3RhdGljIGludDMyX3Qgdng2OTUzX3Bvd2VyX2Rvd24odm9pZCkKLXsKLQl2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19NT0RFX1NFTEVDVCwKLQlNT0RFX1NFTEVDVF9TVEFOREJZX01PREUpOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgdng2OTUzX3Byb2JlX2luaXRfZG9uZShjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqZGF0YSkKLXsKLQlncGlvX2ZyZWUoZGF0YS0+c2Vuc29yX3Jlc2V0KTsKLQlrZnJlZSh2eDY5NTNfY3RybCk7Ci0Jdng2OTUzX2N0cmwgPSBOVUxMOwotCXJldHVybiAwOwotfQotc3RhdGljIGludCB2eDY5NTNfcHJvYmVfaW5pdF9zZW5zb3IoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmRhdGEpCi17Ci0JdW5zaWduZWQgc2hvcnQgcmV2aXNpb25fbnVtYmVyOwotCWludDMyX3QgcmMgPSAwOwotCXVuc2lnbmVkIHNob3J0IGNoaXBpZGwsIGNoaXBpZGg7Ci0JQ0RCRygiJXM6ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCXJjID0gZ3Bpb19yZXF1ZXN0KGRhdGEtPnNlbnNvcl9yZXNldCwgInZ4Njk1MyIpOwotCUNEQkcoIiB2eDY5NTNfcHJvYmVfaW5pdF9zZW5zb3JcbiIpOwotCWlmICghcmMpIHsKLQkJQ0RCRygic2Vuc29yX3Jlc2V0ID0gJWRcbiIsIHJjKTsKLQkJQ0RCRygiIHZ4Njk1M19wcm9iZV9pbml0X3NlbnNvciAxXG4iKTsKLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGRhdGEtPnNlbnNvcl9yZXNldCwgMCk7Ci0JCW1zbGVlcCg1MCk7Ci0JCUNEQkcoIiB2eDY5NTNfcHJvYmVfaW5pdF9zZW5zb3IgMVxuIik7Ci0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChkYXRhLT5zZW5zb3JfcmVzZXQsIDEpOwotCQltc2xlZXAoMTMpOwotCX0gZWxzZSB7Ci0JCUNEQkcoIiB2eDY5NTNfcHJvYmVfaW5pdF9zZW5zb3IgMlxuIik7Ci0JCWdvdG8gaW5pdF9wcm9iZV9kb25lOwotCX0KLQltc2xlZXAoMjApOwotCUNEQkcoIiB2eDY5NTNfcHJvYmVfaW5pdF9zZW5zb3IgaXMgY2FsbGVkXG4iKTsKLQkvKiAzLiBSZWFkIHNlbnNvciBNb2RlbCBJRDogKi8KLQlyYyA9IHZ4Njk1M19pMmNfcmVhZCgweDAwMDAsICZjaGlwaWRoLCAxKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIiB2eDY5NTNfcHJvYmVfaW5pdF9zZW5zb3IgM1xuIik7Ci0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCX0KLQlyYyA9IHZ4Njk1M19pMmNfcmVhZCgweDAwMDEsICZjaGlwaWRsLCAxKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNEQkcoIiB2eDY5NTNfcHJvYmVfaW5pdF9zZW5zb3I0XG4iKTsKLQkJZ290byBpbml0X3Byb2JlX2ZhaWw7Ci0JfQotCUNEQkcoInZ4Njk1MyBtb2RlbF9pZCA9IDB4JXggIDB4JXhcbiIsIGNoaXBpZGgsIGNoaXBpZGwpOwotCS8qIDQuIENvbXBhcmUgc2Vuc29yIElEIHRvIFZYNjk1MyBJRDogKi8KLQlpZiAoY2hpcGlkaCAhPSAweDAzIHx8IGNoaXBpZGwgIT0gMHhCOSkgewotCQlyYyA9IC1FTk9ERVY7Ci0JCUNEQkcoInZ4Njk1M19wcm9iZV9pbml0X3NlbnNvciBmYWlsIGNoaXAgaWQgZG9lc25vdCBtYXRjaFxuIik7Ci0JCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCX0KLQotCXZ4Njk1M19jdHJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZ4Njk1M19jdHJsX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZ4Njk1M19jdHJsKSB7Ci0JCUNEQkcoInZ4Njk1M19pbml0IGZhaWxlZCFcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JfQotCXZ4Njk1M19jdHJsLT5mcHNfZGl2aWRlciA9IDEgKiAweDAwMDAwNDAwOwotCXZ4Njk1M19jdHJsLT5waWN0X2Zwc19kaXZpZGVyID0gMSAqIDB4MDAwMDA0MDA7Ci0Jdng2OTUzX2N0cmwtPnNldF90ZXN0ID0gVEVTVF9PRkY7Ci0Jdng2OTUzX2N0cmwtPnByZXZfcmVzID0gUVRSX1NJWkU7Ci0Jdng2OTUzX2N0cmwtPnBpY3RfcmVzID0gRlVMTF9TSVpFOwotCXZ4Njk1M19jdHJsLT5jdXJyX3JlcyA9IElOVkFMSURfU0laRTsKLQl2eDY5NTNfY3RybC0+c2Vuc29yX3R5cGUgPSBWWDY5NTNfU1RNNU0wRURPRl9DVVRfMjsKLQl2eDY5NTNfY3RybC0+ZWRvZl9tb2RlID0gVlg2OTUzX0VET0ZfRVNUSU1BVElPTjsKLQotCWlmIChkYXRhKQotCQl2eDY5NTNfY3RybC0+c2Vuc29yZGF0YSA9IGRhdGE7Ci0KLQlpZiAodng2OTUzX2kyY19yZWFkKDB4MDAwMiwgJnJldmlzaW9uX251bWJlciwgMSkgPCAwKQotCQlyZXR1cm4gcmM7Ci0JCUNEQkcoInNlbnNvciByZXZpc2lvbiBudW1iZXIgbWFqb3IgPSAweCV4XG4iLCByZXZpc2lvbl9udW1iZXIpOwotCWlmICh2eDY5NTNfaTJjX3JlYWQoMHgwMDE4LCAmcmV2aXNpb25fbnVtYmVyLCAxKSA8IDApCi0JCXJldHVybiByYzsKLQkJQ0RCRygic2Vuc29yIHJldmlzaW9uIG51bWJlciA9IDB4JXhcbiIsIHJldmlzaW9uX251bWJlcik7Ci0JaWYgKHJldmlzaW9uX251bWJlciA9PSBWWDY5NTNfUkVWSVNJT05fTlVNQkVSX0NVVDMpIHsKLQkJdng2OTUzX2N0cmwtPnNlbnNvcl90eXBlID0gVlg2OTUzX1NUTTVNMEVET0ZfQ1VUXzM7Ci0JCUNEQkcoIlZYNjk1MyBFRG9mIEN1dCAzLjAgc2Vuc29yXG4gIik7Ci0JfSBlbHNlIGlmIChyZXZpc2lvbl9udW1iZXIgPT0gVlg2OTUzX1JFVklTSU9OX05VTUJFUl9DVVQyKSB7Ci0JCXZ4Njk1M19jdHJsLT5zZW5zb3JfdHlwZSA9IFZYNjk1M19TVE01TTBFRE9GX0NVVF8yOwotCQlDREJHKCJWWDY5NTMgRURvZiBDdXQgMi4wIHNlbnNvclxuICIpOwotCX0gZWxzZSB7LyogQ3V0MS4wIHJlYWRzIDB4MDAgZm9yIHJlZ2lzdGVyIDB4MDAxOCovCi0JCXZ4Njk1M19jdHJsLT5zZW5zb3JfdHlwZSA9IFZYNjk1M19TVE01TTBFRE9GX0NVVF8xOwotCQlDREJHKCJWWDY5NTMgRURvZiBDdXQgMS4wIHNlbnNvclxuICIpOwotCX0KLQotCWlmICh2eDY5NTNfY3RybC0+cHJldl9yZXMgPT0gUVRSX1NJWkUpIHsKLQkJaWYgKHZ4Njk1M19zZW5zb3Jfc2V0dGluZyhSRUdfSU5JVCwgUkVTX1BSRVZJRVcpIDwgMCkKLQkJCWdvdG8gaW5pdF9wcm9iZV9mYWlsOwotCX0gZWxzZSB7Ci0JCWlmICh2eDY5NTNfc2Vuc29yX3NldHRpbmcoUkVHX0lOSVQsIFJFU19DQVBUVVJFKSA8IDApCi0JCQlnb3RvIGluaXRfcHJvYmVfZmFpbDsKLQl9Ci0KLQlnb3RvIGluaXRfcHJvYmVfZG9uZTsKLWluaXRfcHJvYmVfZmFpbDoKLQlDREJHKCIgdng2OTUzX3Byb2JlX2luaXRfc2Vuc29yIGZhaWxzXG4iKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+c2Vuc29yX3Jlc2V0LCAwKTsKLQl2eDY5NTNfcHJvYmVfaW5pdF9kb25lKGRhdGEpOwotaW5pdF9wcm9iZV9kb25lOgotCUNEQkcoIiB2eDY5NTNfcHJvYmVfaW5pdF9zZW5zb3IgZmluaXNoZXNcbiIpOwotCXJldHVybiByYzsKLQl9Ci0vKiBjYW1zZW5zb3JfaXUwNjBmX3Z4Njk1M19yZXNldCAqLwotaW50IHZ4Njk1M19zZW5zb3Jfb3Blbl9pbml0KGNvbnN0IHN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9pbmZvICpkYXRhKQotewotCXVuc2lnbmVkIHNob3J0IHJldmlzaW9uX251bWJlcjsKLQlpbnQzMl90IHJjID0gMDsKLQotCUNEQkcoIiVzOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlDREJHKCJDYWxsaW5nIHZ4Njk1M19zZW5zb3Jfb3Blbl9pbml0XG4iKTsKLQlyYyA9IGdwaW9fcmVxdWVzdChkYXRhLT5zZW5zb3JfcmVzZXQsICJ2eDY5NTMiKTsKLQlpZiAoIXJjKQotCQlDREJHKCJ2eDY5NTMgZ3Bpb19yZXF1ZXN0IGZhaWxcbiIpOwotCi0Jdng2OTUzX2N0cmwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgdng2OTUzX2N0cmxfdCksIEdGUF9LRVJORUwpOwotCWlmICghdng2OTUzX2N0cmwpIHsKLQkJQ0RCRygidng2OTUzX2luaXQgZmFpbGVkIVxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBpbml0X2RvbmU7Ci0JfQotCXZ4Njk1M19jdHJsLT5mcHNfZGl2aWRlciA9IDEgKiAweDAwMDAwNDAwOwotCXZ4Njk1M19jdHJsLT5waWN0X2Zwc19kaXZpZGVyID0gMSAqIDB4MDAwMDA0MDA7Ci0Jdng2OTUzX2N0cmwtPnNldF90ZXN0ID0gVEVTVF9PRkY7Ci0Jdng2OTUzX2N0cmwtPnByZXZfcmVzID0gUVRSX1NJWkU7Ci0Jdng2OTUzX2N0cmwtPnBpY3RfcmVzID0gRlVMTF9TSVpFOwotCXZ4Njk1M19jdHJsLT5jdXJyX3JlcyA9IElOVkFMSURfU0laRTsKLQl2eDY5NTNfY3RybC0+c2Vuc29yX3R5cGUgPSBWWDY5NTNfU1RNNU0wRURPRl9DVVRfMjsKLQl2eDY5NTNfY3RybC0+ZWRvZl9tb2RlID0gVlg2OTUzX0VET0ZfRVNUSU1BVElPTjsKLQlpZiAoZGF0YSkKLQkJdng2OTUzX2N0cmwtPnNlbnNvcmRhdGEgPSBkYXRhOwotCWlmIChyYyA8IDApIHsKLQkJQ0RCRygiQ2FsbGluZyB2eDY5NTNfc2Vuc29yX29wZW5faW5pdCBmYWlsMVxuIik7Ci0JCXJldHVybiByYzsKLQl9Ci0JQ0RCRygiJXM6ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCS8qIGVuYWJsZSBtY2xrIGZpcnN0ICovCi0JbXNtX2NhbWlvX2Nsa19yYXRlX3NldChWWDY5NTNfU1RNNU0wRURPRl9ERUZBVUxUX01BU1RFUl9DTEtfUkFURSk7Ci0JQ0RCRygiJXM6ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCWlmICh2eDY5NTNfaTJjX3JlYWQoMHgwMDAyLCAmcmV2aXNpb25fbnVtYmVyLCAxKSA8IDApCi0JCXJldHVybiByYzsKLQkJQ0RCRygic2Vuc29yIHJldmlzaW9uIG51bWJlciBtYWpvciA9IDB4JXhcbiIsIHJldmlzaW9uX251bWJlcik7Ci0JaWYgKHZ4Njk1M19pMmNfcmVhZCgweDAwMTgsICZyZXZpc2lvbl9udW1iZXIsIDEpIDwgMCkKLQkJcmV0dXJuIHJjOwotCQlDREJHKCJzZW5zb3IgcmV2aXNpb24gbnVtYmVyID0gMHgleFxuIiwgcmV2aXNpb25fbnVtYmVyKTsKLQlpZiAocmV2aXNpb25fbnVtYmVyID09IFZYNjk1M19SRVZJU0lPTl9OVU1CRVJfQ1VUMykgewotCQl2eDY5NTNfY3RybC0+c2Vuc29yX3R5cGUgPSBWWDY5NTNfU1RNNU0wRURPRl9DVVRfMzsKLQkJQ0RCRygiVlg2OTUzIEVEb2YgQ3V0IDMuMCBzZW5zb3JcbiAiKTsKLQl9IGVsc2UgaWYgKHJldmlzaW9uX251bWJlciA9PSBWWDY5NTNfUkVWSVNJT05fTlVNQkVSX0NVVDIpIHsKLQkJdng2OTUzX2N0cmwtPnNlbnNvcl90eXBlID0gVlg2OTUzX1NUTTVNMEVET0ZfQ1VUXzI7Ci0JCUNEQkcoIlZYNjk1MyBFRG9mIEN1dCAyLjAgc2Vuc29yXG4gIik7Ci0JfSBlbHNlIHsvKiBDdXQxLjAgcmVhZHMgMHgwMCBmb3IgcmVnaXN0ZXIgMHgwMDE4Ki8KLQkJdng2OTUzX2N0cmwtPnNlbnNvcl90eXBlID0gVlg2OTUzX1NUTTVNMEVET0ZfQ1VUXzE7Ci0JCUNEQkcoIlZYNjk1MyBFRG9mIEN1dCAxLjAgc2Vuc29yXG4gIik7Ci0JfQotCi0Jdng2OTUzX2N0cmwtPmZwcyA9IDMwKlE4OwotCWlmIChyYyA8IDApCi0JCWdvdG8gaW5pdF9mYWlsOwotCWVsc2UKLQkJZ290byBpbml0X2RvbmU7Ci1pbml0X2ZhaWw6Ci0JQ0RCRygiaW5pdF9mYWlsXG4iKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+c2Vuc29yX3Jlc2V0LCAwKTsKLQl2eDY5NTNfcHJvYmVfaW5pdF9kb25lKGRhdGEpOwotaW5pdF9kb25lOgotCUNEQkcoImluaXRfZG9uZVxuIik7Ci0JcmV0dXJuIHJjOwotfSAvKmVuZG9mIHZ4Njk1M19zZW5zb3Jfb3Blbl9pbml0Ki8KLQotc3RhdGljIGludCB2eDY5NTNfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQkvKiBJbml0aWFsaXplIHRoZSBNU01fQ0FNSTJDIENoaXAgKi8KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2eDY5NTNfd2FpdF9xdWV1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB2eDY5NTNfaTJjX2lkW10gPSB7Ci0JeyJ2eDY5NTMiLCAwfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBpbnQgdng2OTUzX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQgcmMgPSAwOwotCUNEQkcoInZ4Njk1M19wcm9iZSBjYWxsZWQhXG4iKTsKLQotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7Ci0JCUNEQkcoImkyY19jaGVja19mdW5jdGlvbmFsaXR5IGZhaWxlZFxuIik7Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0KLQl2eDY5NTNfc2Vuc29ydyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2eDY5NTNfd29ya190KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2eDY5NTNfc2Vuc29ydykgewotCQlDREJHKCJremFsbG9jIGZhaWxlZC5cbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gcHJvYmVfZmFpbHVyZTsKLQl9Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB2eDY5NTNfc2Vuc29ydyk7Ci0Jdng2OTUzX2luaXRfY2xpZW50KGNsaWVudCk7Ci0Jdng2OTUzX2NsaWVudCA9IGNsaWVudDsKLQotCW1zbGVlcCg1MCk7Ci0KLQlDREJHKCJ2eDY5NTNfcHJvYmUgc3VjY2Vzc2VkISByYyA9ICVkXG4iLCByYyk7Ci0JcmV0dXJuIDA7Ci0KLXByb2JlX2ZhaWx1cmU6Ci0JQ0RCRygidng2OTUzX3Byb2JlIGZhaWxlZCEgcmMgPSAlZFxuIiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB2eDY5NTNfc2VuZF93Yl9pbmZvKHN0cnVjdCB3Yl9pbmZvX2NmZyAqd2IpCi17Ci0JdW5zaWduZWQgc2hvcnQgcmVhZF9kYXRhOwotCXVpbnQ4X3QgdGVtcFs4XTsKLQlpbnQgcmMgPSAwOwotCWludCBpID0gMDsKLQotCS8qIHJlZF9nYWluICovCi0JdGVtcFsyXSA9IHdiLT5yZWRfZ2FpbiA+PiA4OwotCXRlbXBbM10gPSB3Yi0+cmVkX2dhaW4gJiAweEZGOwotCi0JLyogZ3JlZW5fZ2FpbiAqLwotCXRlbXBbMF0gPSB3Yi0+Z3JlZW5fZ2FpbiA+PiA4OwotCXRlbXBbMV0gPSB3Yi0+Z3JlZW5fZ2FpbiAmIDB4RkY7Ci0JdGVtcFs2XSA9IHRlbXBbMF07Ci0JdGVtcFs3XSA9IHRlbXBbMV07Ci0KLQkvKiBibHVlX2dhaW4gKi8KLQl0ZW1wWzRdID0gd2ItPmJsdWVfZ2FpbiA+PiA4OwotCXRlbXBbNV0gPSB3Yi0+Ymx1ZV9nYWluICYgMHhGRjsKLQlyYyA9IHZ4Njk1M19pMmNfd3JpdGVfc2VxX3NlbnNvcigweDBCOEUsICZ0ZW1wWzBdLCA4KTsKLQotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKLQkJcmMgPSB2eDY5NTNfaTJjX3JlYWQoMHgwQjhFICsgaSwgJnJlYWRfZGF0YSwgMSk7Ci0JCUNEQkcoIiVzIGFkZHIgMHgleCB2YWwgJWRcbiIsIF9fZnVuY19fLCAweDBCOEUgKyBpLCByZWFkX2RhdGEpOwotCX0KLQlyYyA9IHZ4Njk1M19pMmNfcmVhZCgweDBCODIsICZyZWFkX2RhdGEsIDEpOwotCUNEQkcoIiVzIGFkZHIgMHgleCB2YWwgJWRcbiIsIF9fZnVuY19fLCAweDBCODIsIHJlYWRfZGF0YSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXJldHVybiByYzsKLX0gLyplbmQgb2Ygdng2OTUzX3NuYXBzaG90X2NvbmZpZyovCi0KLXN0YXRpYyBpbnQgX19leGl0IHZ4Njk1M19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3Qgdng2OTUzX3dvcmtfdF90ICpzZW5zb3J3ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JZnJlZV9pcnEoY2xpZW50LT5pcnEsIHNlbnNvcncpOwotCXZ4Njk1M19jbGllbnQgPSBOVUxMOwotCWtmcmVlKHNlbnNvcncpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdng2OTUzX2kyY19kcml2ZXIgPSB7Ci0JLmlkX3RhYmxlID0gdng2OTUzX2kyY19pZCwKLQkucHJvYmUgID0gdng2OTUzX2kyY19wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3Aodng2OTUzX2kyY19yZW1vdmUpLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInZ4Njk1MyIsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgdng2OTUzX3NlbnNvcl9jb25maWcodm9pZCBfX3VzZXIgKmFyZ3ApCi17Ci0Jc3RydWN0IHNlbnNvcl9jZmdfZGF0YSBjZGF0YTsKLQlsb25nICAgcmMgPSAwOwotCWlmIChjb3B5X2Zyb21fdXNlcigmY2RhdGEsCi0JCSh2b2lkICopYXJncCwKLQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JbXV0ZXhfbG9jaygmdng2OTUzX211dCk7Ci0JQ0RCRygidng2OTUzX3NlbnNvcl9jb25maWc6IGNmZ3R5cGUgPSAlZFxuIiwKLQljZGF0YS5jZmd0eXBlKTsKLQkJc3dpdGNoIChjZGF0YS5jZmd0eXBlKSB7Ci0JCWNhc2UgQ0ZHX0dFVF9QSUNUX0ZQUzoKLQkJCXZ4Njk1M19nZXRfcGljdF9mcHMoCi0JCQkJY2RhdGEuY2ZnLmdmcHMucHJldmZwcywKLQkJCQkmKGNkYXRhLmNmZy5nZnBzLnBpY3RmcHMpKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfR0VUX1BSRVZfTF9QRjoKLQkJCWNkYXRhLmNmZy5wcmV2bF9wZiA9Ci0JCQl2eDY5NTNfZ2V0X3ByZXZfbGluZXNfcGYoKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfR0VUX1BSRVZfUF9QTDoKLQkJCWNkYXRhLmNmZy5wcmV2cF9wbCA9Ci0JCQkJdng2OTUzX2dldF9wcmV2X3BpeGVsc19wbCgpOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19HRVRfUElDVF9MX1BGOgotCQkJY2RhdGEuY2ZnLnBpY3RsX3BmID0KLQkJCQl2eDY5NTNfZ2V0X3BpY3RfbGluZXNfcGYoKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfR0VUX1BJQ1RfUF9QTDoKLQkJCWNkYXRhLmNmZy5waWN0cF9wbCA9Ci0JCQkJdng2OTUzX2dldF9waWN0X3BpeGVsc19wbCgpOwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJncCwKLQkJCQkmY2RhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzZW5zb3JfY2ZnX2RhdGEpKSkKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19HRVRfUElDVF9NQVhfRVhQX0xDOgotCQkJY2RhdGEuY2ZnLnBpY3RfbWF4X2V4cF9sYyA9Ci0JCQkJdng2OTUzX2dldF9waWN0X21heF9leHBfbGMoKTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZ3AsCi0JCQkJJmNkYXRhLAotCQkJCXNpemVvZihzdHJ1Y3Qgc2Vuc29yX2NmZ19kYXRhKSkpCi0JCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfU0VUX0ZQUzoKLQkJY2FzZSBDRkdfU0VUX1BJQ1RfRlBTOgotCQkJcmMgPSB2eDY5NTNfc2V0X2ZwcygmKGNkYXRhLmNmZy5mcHMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0ZHX1NFVF9FWFBfR0FJTjoKLQkJCXJjID0KLQkJCQl2eDY5NTNfd3JpdGVfZXhwX2dhaW4oCi0JCQkJCWNkYXRhLmNmZy5leHBfZ2Fpbi5nYWluLAotCQkJCQljZGF0YS5jZmcuZXhwX2dhaW4ubGluZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19TRVRfUElDVF9FWFBfR0FJTjoKLQkJCXJjID0KLQkJCQl2eDY5NTNfc2V0X3BpY3RfZXhwX2dhaW4oCi0JCQkJY2RhdGEuY2ZnLmV4cF9nYWluLmdhaW4sCi0JCQkJY2RhdGEuY2ZnLmV4cF9nYWluLmxpbmUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfU0VUX01PREU6Ci0JCQlyYyA9IHZ4Njk1M19zZXRfc2Vuc29yX21vZGUoY2RhdGEubW9kZSwKLQkJCQkJY2RhdGEucnMpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfUFdSX0RPV046Ci0JCQlyYyA9IHZ4Njk1M19wb3dlcl9kb3duKCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENGR19NT1ZFX0ZPQ1VTOgotCQkJcmMgPQotCQkJCXZ4Njk1M19tb3ZlX2ZvY3VzKAotCQkJCWNkYXRhLmNmZy5mb2N1cy5kaXIsCi0JCQkJY2RhdGEuY2ZnLmZvY3VzLnN0ZXBzKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0ZHX1NFVF9ERUZBVUxUX0ZPQ1VTOgotCQkJcmMgPQotCQkJCXZ4Njk1M19zZXRfZGVmYXVsdF9mb2N1cygKLQkJCQljZGF0YS5jZmcuZm9jdXMuc3RlcHMpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDRkdfU0VUX0VGRkVDVDoKLQkJCXJjID0gdng2OTUzX3NldF9kZWZhdWx0X2ZvY3VzKAotCQkJCWNkYXRhLmNmZy5lZmZlY3QpOwotCQkJYnJlYWs7Ci0KLQotCQljYXNlIENGR19TRU5EX1dCX0lORk86Ci0JCQlyYyA9IHZ4Njk1M19zZW5kX3diX2luZm8oCi0JCQkJJihjZGF0YS5jZmcud2JfaW5mbykpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQltdXRleF91bmxvY2soJnZ4Njk1M19tdXQpOwotCi0JcmV0dXJuIHJjOwotfQotCi0KLQotCi1zdGF0aWMgaW50IHZ4Njk1M19zZW5zb3JfcmVsZWFzZSh2b2lkKQotewotCWludCByYyA9IC1FQkFERjsKLQltdXRleF9sb2NrKCZ2eDY5NTNfbXV0KTsKLQl2eDY5NTNfcG93ZXJfZG93bigpOwotCWdwaW9fZnJlZSh2eDY5NTNfY3RybC0+c2Vuc29yZGF0YS0+c2Vuc29yX3Jlc2V0KTsKLQlrZnJlZSh2eDY5NTNfY3RybCk7Ci0Jdng2OTUzX2N0cmwgPSBOVUxMOwotCUNEQkcoInZ4Njk1M19yZWxlYXNlIGNvbXBsZXRlZFxuIik7Ci0JbXV0ZXhfdW5sb2NrKCZ2eDY5NTNfbXV0KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB2eDY5NTNfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQlzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCAqaWQpCi17Ci0JLyogVE9ETzogTmVlZCB0byBhZGQgdGhpcyBJRCBpbiB2NGwyLWNoaXAtaWRlbnQuaCAqLwotCWlkLT5pZGVudCAgICA9IFY0TDJfSURFTlRfVlg2OTUzOwotCWlkLT5yZXZpc2lvbiA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2eDY5NTNfZ19wYXJtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcmFtKQotewotCWludCByZXQgPSAwOwotCS8qIHJldHVybiBjdXJyZW50IG1vZGUgdmFsdWUgKi8KLQlwYXJhbS0+cGFybS5jYXB0dXJlLmNhcHR1cmVtb2RlID0gdng2OTUzX2N0cmwtPnNlbnNvcm1vZGU7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2eDY5NTNfc19wYXJtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcmFtKQotewotCS8qIHNldCB0aGUgZGVzaXJlZCBtb2RlICovCi0JLyogcmlnaHQgbm93LCB0aGUgb25seSBwdXJwb3NlIGlzIHRvIHNldCB0aGUgZGVzaXJlZCBtb2RlIC0KLQkgcHJldmlldyBvciBzbmFwc2hvdCAqLwotCXZ4Njk1M19jdHJsLT5zZW5zb3Jtb2RlID0gcGFyYW0tPnBhcm0uY2FwdHVyZS5jYXB0dXJlbW9kZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2eDY5NTNfc19zdHJlYW0oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IGVuYWJsZSkKLXsKLQlsb25nIHJjID0gMDsKLQlpbnQgbW9kZSA9IHZ4Njk1M19jdHJsLT5zZW5zb3Jtb2RlOwotCWludCBydCA9IFJFU19QUkVWSUVXOwotCXVuc2lnbmVkIHNob3J0IGZyYW1lX2NudDsKLQlzdHJ1Y3QgbXNtX2NhbWVyYV9jc2lfcGFyYW1zIHZ4Njk1M19jc2lfcGFyYW1zOwotCi0JQ0RCRygibW9kZSA9ICVkLCBlbmFibGUgPSAlZFxuIiwgbW9kZSwgZW5hYmxlKTsKLQotCWlmICghZW5hYmxlKSB7Ci0JCS8qIHR1cm4gb2ZmIHN0cmVhbWluZyAqLwotCQkvKiBUT0RPOiBNYWtlIGNhbGwgdG8gSTJDIHdyaXRlIHRvIHR1cm4gc3RyZWFtaW5nIG9mZiAqLwotCQkvKiByYyA9IHZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoKTsgKi8KLQotCQlzdHJ1Y3Qgdng2OTUzX2kyY19yZWdfY29uZiBpbml0X3RibFtdID0gewotCQkJe1JFR18weDAxMTIsCi0JCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDExMn0sCi0JCQl7MHg2MDAzLCAweDAxfSwKLQkJCXtSRUdfMHgwMTEzLAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDAxMTN9LAotCQkJe1JFR19WVF9QSVhfQ0xLX0RJViwKLQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS4KLQkJCXZ0X3BpeF9jbGtfZGl2fSwKLQkJCXtSRUdfUFJFX1BMTF9DTEtfRElWLAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJcHJlX3BsbF9jbGtfZGl2fSwKLQkJCXtSRUdfUExMX01VTFRJUExJRVIsCi0JCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0uCi0JCQlwbGxfbXVsdGlwbGllcn0sCi0JCQl7UkVHX09QX1BJWF9DTEtfRElWLAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLgotCQkJb3BfcGl4X2Nsa19kaXZ9LAotCQkJe1JFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9ISSwKLQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJY29hcnNlX2ludGVncmF0aW9uX3RpbWVfaGl9LAotCQkJe1JFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9MTywKLQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJY29hcnNlX2ludGVncmF0aW9uX3RpbWVfbG99LAotCQkJe1JFR19BTkFMT0dVRV9HQUlOX0NPREVfR0xPQkFMX0xPLAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQlhbmFsb2d1ZV9nYWluX2NvZGVfZ2xvYmFsfSwKLQkJCXtSRUdfMHgzMDMwLAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMwMzB9LAotCQkJLyogOTUzIHNwZWNpZmljIHJlZ2lzdGVycyAqLwotCQkJe1JFR18weDAxMTEsCi0JCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MDExMX0sCi0JCQl7UkVHXzB4MGIwMCwKLQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjAwfSwKLQkJCXtSRUdfMHgzMDAxLAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMwMDF9LAotCQkJe1JFR18weDMwMDQsCi0JCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MzAwNH0sCi0JCQl7MHgzMDA2LCAweDAwfSwKLQkJCXtSRUdfMHgzMDA3LAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDMwMDd9LAotCQkJezB4MzAxYiwgMHgyOX0sCi0JCQkvKiBERUZDT1Igc2V0dGluZ3MgKi8KLQkJCS8qU2luZ2xlIERlZmVjdCBDb3JyZWN0aW9uIFdlaWdodCBESVNBQkxFKi8KLQkJCXsweDBiMDYsCi0JCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGIwNn0sCi0JCQkvKlNpbmdsZV9kZWZlY3RfY29ycmVjdF93ZWlnaHQgPSBhdXRvKi8KLQkJCXsweDBiMDcsCi0JCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGIwN30sCi0JCQkvKkR5bmFtaWMgY291cGxldCBjb3JyZWN0aW9uIEVOQUJMRUQqLwotCQkJezB4MGIwOCwKLQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjA4fSwKLQkJCS8qRHluYW1pYyBjb3VwbGV0IGNvcnJlY3Rpb24gd2VpZ2h0Ki8KLQkJCXsweDBiMDksCi0JCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGIwOX0sCi0JCQkvKiBDbG9jayBTZXR1cCAqLwotCQkJLyogVGVsbCBzZW5zb3IgZXh0IGNsayBpcyAyNE1IeiovCi0JCQl7UkVHXzB4MDEzNiwKLQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwMTM2fSwKLQkJCXtSRUdfMHgwMTM3LAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDAxMzd9LAotCQkJLyogVGhlIHdoaXRlIGJhbGFuY2UgZ2FpbnMgbXVzdCBiZSB3cml0dGVuCi0JCQkgdG8gdGhlIHNlbnNvciBldmVyeSBmcmFtZS4gKi8KLQkJCS8qIEVkb2YgKi8KLQkJCXtSRUdfMHgwYjgzLAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiODN9LAotCQkJe1JFR18weDBiODQsCi0JCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4NH0sCi0JCQl7UkVHXzB4MGI4NSwKLQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjg1fSwKLQkJCXtSRUdfMHgwYjg4LAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdF9pbml0WzBdLnJlZ18weDBiODh9LAotCQkJe1JFR18weDBiODksCi0JCQl2eDY5NTNfcmVncy5yZWdfcGF0X2luaXRbMF0ucmVnXzB4MGI4OX0sCi0JCQl7UkVHXzB4MGI4YSwKLQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRfaW5pdFswXS5yZWdfMHgwYjhhfSwKLQkJCS8qIE1vZGUgc3BlY2lmaWMgcmVnaWV0ZXJzICovCi0JCQl7UkVHX0ZSQU1FX0xFTkdUSF9MSU5FU19ISSwKLQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJZnJhbWVfbGVuZ3RoX2xpbmVzX2hpfSwKLQkJCXtSRUdfRlJBTUVfTEVOR1RIX0xJTkVTX0xPLAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0uCi0JCQlmcmFtZV9sZW5ndGhfbGluZXNfbG99LAotCQkJe1JFR19MSU5FX0xFTkdUSF9QQ0tfSEksCi0JCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS4KLQkJCWxpbmVfbGVuZ3RoX3Bja19oaX0sCi0JCQl7UkVHX0xJTkVfTEVOR1RIX1BDS19MTywKLQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLgotCQkJbGluZV9sZW5ndGhfcGNrX2xvfSwKLQkJCXtSRUdfMHgzMDA1LAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAwNX0sCi0JCQl7MHgzMDEwLAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAxMH0sCi0JCQl7UkVHXzB4MzAxMSwKLQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMTF9LAotCQkJe1JFR18weDMwMWEsCi0JCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDFhfSwKLQkJCXtSRUdfMHgzMDM1LAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzAzNX0sCi0JCQl7UkVHXzB4MzAzNiwKLQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDMwMzZ9LAotCQkJe1JFR18weDMwNDEsCi0JCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDQxfSwKLQkJCXsweDMwNDIsCi0JCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgzMDQyfSwKLQkJCXtSRUdfMHgzMDQ1LAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MzA0NX0sCi0JCQkvKkVET0Y6IEVzdGltYXRpb24gc2V0dGluZ3MgZm9yIFByZXZpZXcgbW9kZQotCQkJICBBcHBsaWNhdGlvbiBzZXR0aW5ncyBmb3IgY2FwdHVyZSBtb2RlCi0JCQkgIChzdGFuZGFyZCBzZXR0aW5ncyAtIE5vdCB0dW5lZCkgKi8KLQkJCXtSRUdfMHgwYjgwLAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MGI4MH0sCi0JCQl7UkVHXzB4MDkwMCwKLQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDA5MDB9LAotCQkJe1JFR18weDA5MDEsCi0JCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwOTAxfSwKLQkJCXtSRUdfMHgwOTAyLAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDkwMn0sCi0JCQl7UkVHXzB4MDM4MywKLQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzODN9LAotCQkJe1JFR18weDAzODcsCi0JCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzg3fSwKLQkJCS8qIENoYW5nZSBvdXRwdXQgc2l6ZSAvIGZyYW1lIHJhdGUgKi8KLQkJCXtSRUdfMHgwMzRjLAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM0Y30sCi0JCQl7UkVHXzB4MDM0ZCwKLQkJCXZ4Njk1M19yZWdzLnJlZ19wYXRbcnRdLnJlZ18weDAzNGR9LAotCQkJe1JFR18weDAzNGUsCi0JCQl2eDY5NTNfcmVncy5yZWdfcGF0W3J0XS5yZWdfMHgwMzRlfSwKLQkJCXtSRUdfMHgwMzRmLAotCQkJdng2OTUzX3JlZ3MucmVnX3BhdFtydF0ucmVnXzB4MDM0Zn0sCi0JCX07Ci0JCS8qIHJlc2V0IGZwc19kaXZpZGVyICovCi0JCXZ4Njk1M19jdHJsLT5mcHMgPSAzMCAqIFE4OwotCQkvKiBzdG9wIHN0cmVhbWluZyAqLwotCi0JCS8qIFJlc2V0IGV2ZXJ5dGhpbmcgZmlyc3QgKi8KLQkJaWYgKHZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoMHgxMDMsIDB4MDEpIDwgMCkgewotCQkJQ0RCRygiUy9XIHJlc2V0IGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0gZWxzZQotCQkJQ0RCRygiUy9XIHJlc2V0IHN1Y2Nlc3NmdWxcbiIpOwotCi0JCW1zbGVlcCgxMCk7Ci0KLQkJQ0RCRygiSW5pdCB2eDY5NTNfc2Vuc29yX3NldHRpbmcgc3RhbmRieVxuIik7Ci0JCWlmICh2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKFJFR19NT0RFX1NFTEVDVCwKLQkJCQkgICAgTU9ERV9TRUxFQ1RfU1RBTkRCWV9NT0RFKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJLyp2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSovCi0JCW1zbGVlcCh2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSk7Ci0KLQkJdng2OTUzX2NzaV9wYXJhbXMuZGF0YV9mb3JtYXQgPSBDU0lfOEJJVDsKLQkJdng2OTUzX2NzaV9wYXJhbXMubGFuZV9jbnQgPSAxOwotCQl2eDY5NTNfY3NpX3BhcmFtcy5sYW5lX2Fzc2lnbiA9IDB4ZTQ7Ci0JCXZ4Njk1M19jc2lfcGFyYW1zLmRwY21fc2NoZW1lID0gMDsKLQkJdng2OTUzX2NzaV9wYXJhbXMuc2V0dGxlX2NudCA9IDc7Ci0JCXJjID0gbXNtX2NhbWlvX2NzaV9jb25maWcoJnZ4Njk1M19jc2lfcGFyYW1zKTsKLQkJaWYgKHJjIDwgMCkKLQkJCUNEQkcoIiBjb25maWcgY3NpIGNvbnRyb2xsZXIgZmFpbGVkXG4iKTsKLQkJbXNsZWVwKHZ4Njk1M19zdG01bTBlZG9mX2RlbGF5X21zZWNzX3N0ZGJ5KTsKLQotCQl2eDY5NTNfcGF0Y2hfZm9yX2N1dDMoKTsKLQkJcmMgPSB2eDY5NTNfaTJjX3dyaXRlX3dfdGFibGUoJmluaXRfdGJsWzBdLAotCQkJCQkgICAgQVJSQVlfU0laRShpbml0X3RibCkpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCW1zbGVlcCh2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdGRieSk7Ci0KLQkJdng2OTUzX2kyY193cml0ZV9iX3NlbnNvcigweDBiODAsIDB4MDApOwotCQl2eDY5NTNfaTJjX3dyaXRlX2Jfc2Vuc29yKDB4MzM4OCwgMHgwMyk7Ci0JCXZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoMHgzNjQwLCAweDAwKTsKLQkJcmV0dXJuIHJjOwotCX0gZWxzZSB7Ci0JCS8qIFN0YXJ0IHNlbnNvciBzdHJlYW1pbmcgKi8KLQkJaWYgKHZ4Njk1M19pMmNfd3JpdGVfYl9zZW5zb3IoUkVHX01PREVfU0VMRUNULAotCQkJCQkgICAgTU9ERV9TRUxFQ1RfU1RSRUFNKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JCUNEQkcoIkluaXQgdng2OTUzX3NlbnNvcl9zZXR0aW5nIHN0cmVhbVxuIik7Ci0JCW1zbGVlcCh2eDY5NTNfc3RtNW0wZWRvZl9kZWxheV9tc2Vjc19zdHJlYW0pOwotCQlpZiAodng2OTUzX2kyY19yZWFkKDB4MDAwNSwgJmZyYW1lX2NudCwgMSkgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0gdng2OTUzX2kyY193cml0ZV93X3RhYmxlKCZlZG9mX3RibFswXSwKLQkJCQkJICAgIEFSUkFZX1NJWkUoZWRvZl90YmwpKTsKLQkJdng2OTUzX2kyY193cml0ZV9iX3NlbnNvcigweDMzODgsIDB4MDApOwotCi0JCXdoaWxlIChmcmFtZV9jbnQgPT0gMHhGRikgewotCQkJaWYgKHZ4Njk1M19pMmNfcmVhZCgweDAwMDUsICZmcmFtZV9jbnQsIDEpIDwgMCkKLQkJCQlyZXR1cm4gcmM7Ci0JCQlDREJHKCJmcmFtZV9jbnQ9JWQiLCBmcmFtZV9jbnQpOwotCQkJbXNsZWVwKDEwKTsKLQkJfQotCi0JCS8qIHNldCBkZXNpcmVkIG1vZGUgKi8KLQkJc3dpdGNoIChtb2RlKSB7Ci0JCWNhc2UgU0VOU09SX1BSRVZJRVdfTU9ERToKLQkJCUNEQkcoIlNFTlNPUl9QUkVWSUVXX01PREVcbiIpOwotCQkJcmMgPSB2eDY5NTNfdmlkZW9fY29uZmlnKG1vZGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0VOU09SX1NOQVBTSE9UX01PREU6Ci0JCQlDREJHKCJTRU5TT1JfU05BUFNIT1RfTU9ERVxuIik7Ci0JCQlyYyA9IHZ4Njk1M19zbmFwc2hvdF9jb25maWcobW9kZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTRU5TT1JfUkFXX1NOQVBTSE9UX01PREU6Ci0JCQlDREJHKCJTRU5TT1JfUkFXX1NOQVBTSE9UX01PREVcbiIpOwotCQkJcmMgPSB2eDY5NTNfcmF3X3NuYXBzaG90X2NvbmZpZyhtb2RlKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQ0RCRygiZGVmYXVsdFxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB2eDY5NTNfZnJhbWVfY2hlY2sodTMyICp3aWR0aCwgdTMyICpoZWlnaHQpCi17Ci0JLyogZ2V0IG1vZGUgZmlyc3QgKi8KLQlpbnQgbW9kZSA9IHZ4Njk1M19jdHJsLT5zZW5zb3Jtb2RlOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBTRU5TT1JfUFJFVklFV19NT0RFOgotCQlpZiAoKndpZHRoID4gVlg2OTUzX1FUUl9TSVpFX1dJRFRIKQotCQkJKndpZHRoID0gVlg2OTUzX1FUUl9TSVpFX1dJRFRIOwotCi0JCWlmICgqaGVpZ2h0ID4gVlg2OTUzX1FUUl9TSVpFX0hFSUdIVCkKLQkJCSpoZWlnaHQgPSBWWDY5NTNfUVRSX1NJWkVfSEVJR0hUOwotCQlicmVhazsKLQljYXNlIFNFTlNPUl9TTkFQU0hPVF9NT0RFOgotCWNhc2UgU0VOU09SX1JBV19TTkFQU0hPVF9NT0RFOgotCQlpZiAoKndpZHRoID4gVlg2OTUzX0hSWl9GVUxMX0JMS19QSVhFTFMpCi0JCQkqd2lkdGggPSBWWDY5NTNfSFJaX0ZVTExfQkxLX1BJWEVMUzsKLQotCQlpZiAoKmhlaWdodCA+IFZYNjk1M19WRVJfRlVMTF9CTEtfTElORVMpCi0JCQkqaGVpZ2h0ID0gVlg2OTUzX1ZFUl9GVUxMX0JMS19MSU5FUzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi0KLXN0YXRpYyBpbnQgdng2OTUzX3NldF9wYXJhbXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTMyIHdpZHRoLCB1MzIgaGVpZ2h0LAotCQkJICAgICBlbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgY29kZSkKLXsKLQlpbnQgaTsKLQl2eDY5NTNfY3RybC0+Zm10ID0gTlVMTDsKLQotCS8qCi0JICogZnJhbWUgc2l6ZSBjaGVjawotCSAqLwotCXZ4Njk1M19mcmFtZV9jaGVjaygmd2lkdGgsICZoZWlnaHQpOwotCi0JLyoKLQkgKiBnZXQgY29sb3IgZm9ybWF0Ci0JICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodng2OTUzX2NmbXRzKTsgaSsrKQotCQlpZiAodng2OTUzX2NmbXRzW2ldLmNvZGUgPT0gY29kZSkKLQkJCWJyZWFrOwotCWlmIChpID09IEFSUkFZX1NJWkUodng2OTUzX2NmbXRzKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBzZW5zb3Igc3VwcG9ydHMgb25lIGZpeGVkIHNpemUgZGVwZW5kaW5nIHVwb24gdGhlIG1vZGUgKi8KLQlzd2l0Y2ggKHZ4Njk1M19jdHJsLT5zZW5zb3Jtb2RlKSB7Ci0JY2FzZSBTRU5TT1JfUFJFVklFV19NT0RFOgotCQl2eDY5NTNfdmlkZW9fY29uZmlnKHZ4Njk1M19jdHJsLT5zZW5zb3Jtb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTRU5TT1JfU05BUFNIT1RfTU9ERToKLQkJdng2OTUzX3NuYXBzaG90X2NvbmZpZyh2eDY5NTNfY3RybC0+c2Vuc29ybW9kZSk7Ci0JCWJyZWFrOwotCWNhc2UgU0VOU09SX1JBV19TTkFQU0hPVF9NT0RFOgotCQl2eDY5NTNfcmF3X3NuYXBzaG90X2NvbmZpZyh2eDY5NTNfY3RybC0+c2Vuc29ybW9kZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIHdoeSBuZWVkIHRoaXMgPyB2eDY5NTNfY3RybC0+Zm10ID0gJih2eDY5NTNfY2ZtdHNbaV0pOyAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdng2OTUzX2Nyb3BjYXAoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcGNhcCAqYSkKLXsKLQkvKiByaWdodCBub3cgd2UgYXJlIG5vdCBzdXBwb3J0aW5nLCBwcm9iYWJseSB2ZmUgY2FuIHRha2UgY2FyZSAqLwotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHZ4Njk1M19nX2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcCAqYSkKLXsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCB2eDY5NTNfc19jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Nyb3AgKmEpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgdng2OTUzX2dfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQotewotCS8qIGJ5IHRoaXMgdGltZSB2eDY5NTNfY2xpZW50IHNob3VsZCBhbHJlYWR5IGJlIHNldCAqLwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2eDY5NTNfY2xpZW50OwotCi0JLyogY3VycmVudGx5IHNlbnNvciBzdXBwb3J0cyBmaXhlZCBkaW1lbnNpb25zIG9ubHkKLQkgKiBkZXBlbmRpbmcgdXBvbiB0aGUgbW9kZSovCi0JaWYgKCF2eDY5NTNfY3RybC0+Zm10KSB7Ci0JCWludCByZXQgPSB2eDY5NTNfc2V0X3BhcmFtcyhjbGllbnQsIFZYNjk1M19RVFJfU0laRV9XSURUSCwKLQkJCQkJCVZYNjk1M19RVFJfU0laRV9IRUlHSFQsCi0JCQkJCQlWNEwyX01CVVNfRk1UX1lVWVY4XzJYOCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQltZi0+d2lkdGggPSB2eDY5NTNfZ2V0X3BpY3RfcGl4ZWxzX3BsKCk7Ci0JbWYtPmhlaWdodCAgPSB2eDY5NTNfZ2V0X3BpY3RfbGluZXNfcGYoKTsKLQkvKiBUT0RPOiBzZXQgY29sb3JzcGFjZSAqLwotCW1mLT5jb2RlICA9IHZ4Njk1M19jdHJsLT5mbXQtPmNvZGU7Ci0JbWYtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdng2OTUzX3NfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQotewotCS8qIGJ5IHRoaXMgdGltZSB2eDY5NTNfY2xpZW50IHNob3VsZCBhbHJlYWR5IGJlIHNldCAqLwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2eDY5NTNfY2xpZW50OwotCi0JLyogVE9ETzogV2UgbmVlZCB0byBkZWZpbmUgdGhpcyBmdW5jdGlvbiAqLwotCS8qIFRPRE86IHNldCBjb2xvcnNwYWNlICovCi0JcmV0dXJuIHZ4Njk1M19zZXRfcGFyYW1zKGNsaWVudCwgbWYtPndpZHRoLCBtZi0+aGVpZ2h0LCBtZi0+Y29kZSk7Ci19Ci0KLXN0YXRpYyBpbnQgdng2OTUzX3RyeV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2eDY5NTNfY2ZtdHMpOyBpKyspCi0JCWlmIChtZi0+Y29kZSA9PSB2eDY5NTNfY2ZtdHNbaV0uY29kZSkKLQkJCWJyZWFrOwotCi0JaWYgKGkgPT0gQVJSQVlfU0laRSh2eDY5NTNfY2ZtdHMpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIGNoZWNrIHRoYXQgZnJhbWUgaXMgd2l0aGluIG1heCBzZW5zb3Igc3VwcG9ydGVkIGZyYW1lIHNpemUgKi8KLQl2eDY5NTNfZnJhbWVfY2hlY2soJm1mLT53aWR0aCwgJm1mLT5oZWlnaHQpOwotCi0JLyogVE9ETzogc2V0IGNvbG9yc3BhY2UgKi8KLQltZi0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2eDY5NTNfZW51bV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdW5zaWduZWQgaW50IGluZGV4LAotCQkJICAgZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlICpjb2RlKQotewotCXByaW50ayhLRVJOX0RFQlVHICJJbmRleCBpcyAlZFxuIiwgaW5kZXgpOwotCWlmICgodW5zaWduZWQgaW50KWluZGV4ID49IEFSUkFZX1NJWkUodng2OTUzX2NmbXRzKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkqY29kZSA9IHZ4Njk1M19jZm10c1tpbmRleF0uY29kZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyB2eDY5NTNfc3ViZGV2X2NvcmVfb3BzID0gewotCS5nX2NoaXBfaWRlbnQgPSB2eDY5NTNfZ19jaGlwX2lkZW50LAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgdng2OTUzX3N1YmRldl92aWRlb19vcHMgPSB7Ci0JLmdfcGFybQkJCSAgID0gdng2OTUzX2dfcGFybSwKLQkuc19wYXJtCQkJICAgPSB2eDY5NTNfc19wYXJtLAotCS5zX3N0cmVhbSA9IHZ4Njk1M19zX3N0cmVhbSwKLQkuZ19tYnVzX2ZtdCA9IHZ4Njk1M19nX2ZtdCwKLQkuc19tYnVzX2ZtdCA9IHZ4Njk1M19zX2ZtdCwKLQkudHJ5X21idXNfZm10ID0gdng2OTUzX3RyeV9mbXQsCi0JLmNyb3BjYXAgID0gdng2OTUzX2Nyb3BjYXAsCi0JLmdfY3JvcCAgID0gdng2OTUzX2dfY3JvcCwKLQkuc19jcm9wICAgPSB2eDY5NTNfc19jcm9wLAotCS5lbnVtX21idXNfZm10ICA9IHZ4Njk1M19lbnVtX2ZtdCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIHZ4Njk1M19zdWJkZXZfb3BzID0gewotCS5jb3JlID0gJnZ4Njk1M19zdWJkZXZfY29yZV9vcHMsCi0JLnZpZGVvICA9ICZ2eDY5NTNfc3ViZGV2X3ZpZGVvX29wcywKLX07Ci0KLXN0YXRpYyBpbnQgdng2OTUzX3NlbnNvcl9wcm9iZShjb25zdCBzdHJ1Y3QgbXNtX2NhbWVyYV9zZW5zb3JfaW5mbyAqaW5mbywKLQkJc3RydWN0IG1zbV9zZW5zb3JfY3RybCAqcykKLXsKLQlpbnQgcmMgPSAwOwotCXJjID0gaTJjX2FkZF9kcml2ZXIoJnZ4Njk1M19pMmNfZHJpdmVyKTsKLQlpZiAocmMgPCAwIHx8IHZ4Njk1M19jbGllbnQgPT0gTlVMTCkgewotCQlyYyA9IC1FTk9UU1VQUDsKLQkJZ290byBwcm9iZV9mYWlsOwotCX0KLQltc21fY2FtaW9fY2xrX3JhdGVfc2V0KDI0MDAwMDAwKTsKLQlyYyA9IHZ4Njk1M19wcm9iZV9pbml0X3NlbnNvcihpbmZvKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIHByb2JlX2ZhaWw7Ci0Jcy0+c19pbml0ID0gdng2OTUzX3NlbnNvcl9vcGVuX2luaXQ7Ci0Jcy0+c19yZWxlYXNlID0gdng2OTUzX3NlbnNvcl9yZWxlYXNlOwotCXMtPnNfY29uZmlnICA9IHZ4Njk1M19zZW5zb3JfY29uZmlnOwotCXZ4Njk1M19wcm9iZV9pbml0X2RvbmUoaW5mbyk7Ci0JcmV0dXJuIHJjOwotCi1wcm9iZV9mYWlsOgotCUNEQkcoInZ4Njk1M19zZW5zb3JfcHJvYmU6IFNFTlNPUiBQUk9CRSBGQUlMUyFcbiIpOwotCXJldHVybiByYzsKLX0KLQotCi1zdGF0aWMgaW50IHZ4Njk1M19zZW5zb3JfcHJvYmVfY2IoY29uc3Qgc3RydWN0IG1zbV9jYW1lcmFfc2Vuc29yX2luZm8gKmluZm8sCi0Jc3RydWN0IHY0bDJfc3ViZGV2ICpzZGV2LCBzdHJ1Y3QgbXNtX3NlbnNvcl9jdHJsICpzKQotewotCWludCByYyA9IDA7Ci0JcmMgPSB2eDY5NTNfc2Vuc29yX3Byb2JlKGluZm8sIHMpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXZ4Njk1M19jdHJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZ4Njk1M19jdHJsX3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZ4Njk1M19jdHJsKSB7Ci0JCUNEQkcoInZ4Njk1M19zZW5zb3JfcHJvYmUgZmFpbGVkIVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIHByb2JlIGlzIHN1Y2Nlc3NmdWwsIGluaXQgYSB2NGwyIHN1YmRldmljZSAqLwotCXByaW50ayhLRVJOX0RFQlVHICJnb2luZyBpbnRvIHY0bDJfaTJjX3N1YmRldl9pbml0XG4iKTsKLQlpZiAoc2RldikgewotCQl2NGwyX2kyY19zdWJkZXZfaW5pdChzZGV2LCB2eDY5NTNfY2xpZW50LAotCQkJCQkJJnZ4Njk1M19zdWJkZXZfb3BzKTsKLQkJdng2OTUzX2N0cmwtPnNlbnNvcl9kZXYgPSBzZGV2OwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgX192eDY5NTNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gbXNtX3NlbnNvcl9yZWdpc3RlcihwZGV2LCB2eDY5NTNfc2Vuc29yX3Byb2JlX2NiKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2NhbWVyYV9kcml2ZXIgPSB7Ci0JLnByb2JlID0gX192eDY5NTNfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtX2NhbWVyYV92eDY5NTMiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgdng2OTUzX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fY2FtZXJhX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHZ4Njk1M19pbml0KTsKLXZvaWQgdng2OTUzX2V4aXQodm9pZCkKLXsKLQlpMmNfZGVsX2RyaXZlcigmdng2OTUzX2kyY19kcml2ZXIpOwotfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92MS92eDY5NTNfdjRsMi5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3Z4Njk1M192NGwyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjN2U5MGYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YxL3Z4Njk1M192NGwyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIFZYNjk1M19WNEwyX0gKLSNkZWZpbmUgVlg2OTUzX1Y0TDJfSAotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgotZXh0ZXJuIHN0cnVjdCB2eDY5NTNfcmVnIHZ4Njk1M19yZWdzOwotc3RydWN0IHJlZ19zdHJ1Y3RfaW5pdCB7Ci0JdWludDhfdCByZWdfMHgwMTEyOyAgICAgIC8qIDB4MDExMiovCi0JdWludDhfdCByZWdfMHgwMTEzOyAgICAgIC8qIDB4MDExMyovCi0JdWludDhfdCB2dF9waXhfY2xrX2RpdjsgIC8qIDB4MDMwMSovCi0JdWludDhfdCBwcmVfcGxsX2Nsa19kaXY7IC8qIDB4MDMwNSovCi0JdWludDhfdCBwbGxfbXVsdGlwbGllcjsgIC8qIDB4MDMwNyovCi0JdWludDhfdCBvcF9waXhfY2xrX2RpdjsgIC8qIDB4MDMwOSovCi0JdWludDhfdCByZWdfMHgzMDMwOyAgICAgIC8qMHgzMDMwKi8KLQl1aW50OF90IHJlZ18weDAxMTE7ICAgICAgLyoweDAxMTEqLwotCXVpbnQ4X3QgcmVnXzB4MGIwMDsgICAgICAvKjB4MGIwMCovCi0JdWludDhfdCByZWdfMHgzMDAxOyAgICAgIC8qMHgzMDAxKi8KLQl1aW50OF90IHJlZ18weDMwMDQ7ICAgICAgLyoweDMwMDQqLwotCXVpbnQ4X3QgcmVnXzB4MzAwNzsgICAgICAvKjB4MzAwNyovCi0JdWludDhfdCByZWdfMHgzMDE2OyAgICAgIC8qMHgzMDE2Ki8KLQl1aW50OF90IHJlZ18weDMwMWQ7ICAgICAgLyoweDMwMWQqLwotCXVpbnQ4X3QgcmVnXzB4MzE3ZTsgICAgICAvKjB4MzE3RSovCi0JdWludDhfdCByZWdfMHgzMTdmOyAgICAgIC8qMHgzMTdGKi8KLQl1aW50OF90IHJlZ18weDM0MDA7ICAgICAgLyoweDM0MDAqLwotCXVpbnQ4X3QgcmVnXzB4MGIwNjsgICAgICAvKjB4MGIwNiovCi0JdWludDhfdCByZWdfMHgwYjA3OyAgICAgIC8qMHgwYjA3Ki8KLQl1aW50OF90IHJlZ18weDBiMDg7ICAgICAgLyoweDBiMDgqLwotCXVpbnQ4X3QgcmVnXzB4MGIwOTsgICAgICAvKjB4MGIwOSovCi0JdWludDhfdCByZWdfMHgwMTM2OwotCXVpbnQ4X3QgcmVnXzB4MDEzNzsKLQkvKiBFZG9mICovCi0JdWludDhfdCByZWdfMHgwYjgzOyAgICAgIC8qMHgwYjgzKi8KLQl1aW50OF90IHJlZ18weDBiODQ7ICAgICAgLyoweDBiODQqLwotCXVpbnQ4X3QgcmVnXzB4MGI4NTsgICAgICAvKjB4MGI4NSovCi0JdWludDhfdCByZWdfMHgwYjg4OyAgICAgIC8qMHgwYjg4Ki8KLQl1aW50OF90IHJlZ18weDBiODk7ICAgICAgLyoweDBiODkqLwotCXVpbnQ4X3QgcmVnXzB4MGI4YTsgICAgICAvKjB4MGI4YSovCi0JfTsKLXN0cnVjdCByZWdfc3RydWN0IHsKLQl1aW50OF90IGNvYXJzZV9pbnRlZ3JhdGlvbl90aW1lX2hpOyAvKlJFR19DT0FSU0VfSU5URUdSQVRJT05fVElNRV9ISSovCi0JdWludDhfdCBjb2Fyc2VfaW50ZWdyYXRpb25fdGltZV9sbzsgLypSRUdfQ09BUlNFX0lOVEVHUkFUSU9OX1RJTUVfTE8qLwotCXVpbnQ4X3QgYW5hbG9ndWVfZ2Fpbl9jb2RlX2dsb2JhbDsKLQl1aW50OF90IGZyYW1lX2xlbmd0aF9saW5lc19oaTsgLyogMHgwMzQwKi8KLQl1aW50OF90IGZyYW1lX2xlbmd0aF9saW5lc19sbzsgLyogMHgwMzQxKi8KLQl1aW50OF90IGxpbmVfbGVuZ3RoX3Bja19oaTsgICAgLyogMHgwMzQyKi8KLQl1aW50OF90IGxpbmVfbGVuZ3RoX3Bja19sbzsgICAgLyogMHgwMzQzKi8KLQl1aW50OF90IHJlZ18weDMwMDU7ICAgLyogMHgzMDA1Ki8KLQl1aW50OF90IHJlZ18weDMwMTA7ICAvKiAweDMwMTAqLwotCXVpbnQ4X3QgcmVnXzB4MzAxMTsgIC8qIDB4MzAxMSovCi0JdWludDhfdCByZWdfMHgzMDFhOyAgLyogMHgzMDFhKi8KLQl1aW50OF90IHJlZ18weDMwMzU7ICAvKiAweDMwMzUqLwotCXVpbnQ4X3QgcmVnXzB4MzAzNjsgICAvKiAweDMwMzYqLwotCXVpbnQ4X3QgcmVnXzB4MzA0MTsgIC8qMHgzMDQxKi8KLQl1aW50OF90IHJlZ18weDMwNDI7ICAvKjB4MzA0MiovCi0JdWludDhfdCByZWdfMHgzMDQ1OyAgLyoweDMwNDUqLwotCXVpbnQ4X3QgcmVnXzB4MGI4MDsgICAvKiAweDBiODAqLwotCXVpbnQ4X3QgcmVnXzB4MDkwMDsgICAvKjB4MDkwMCovCi0JdWludDhfdCByZWdfMHgwOTAxOyAgIC8qIDB4MDkwMSovCi0JdWludDhfdCByZWdfMHgwOTAyOyAgIC8qMHgwOTAyKi8KLQl1aW50OF90IHJlZ18weDAzODM7ICAgLyoweDAzODMqLwotCXVpbnQ4X3QgcmVnXzB4MDM4NzsgICAvKiAweDAzODcqLwotCXVpbnQ4X3QgcmVnXzB4MDM0YzsgICAvKiAweDAzNGMqLwotCXVpbnQ4X3QgcmVnXzB4MDM0ZDsgICAvKjB4MDM0ZCovCi0JdWludDhfdCByZWdfMHgwMzRlOyAgIC8qIDB4MDM0ZSovCi0JdWludDhfdCByZWdfMHgwMzRmOyAgIC8qIDB4MDM0ZiovCi0JdWludDhfdCByZWdfMHgxNzE2OyAvKjB4MTcxNiovCi0JdWludDhfdCByZWdfMHgxNzE3OyAvKjB4MTcxNyovCi0JdWludDhfdCByZWdfMHgxNzE4OyAvKjB4MTcxOCovCi0JdWludDhfdCByZWdfMHgxNzE5OyAvKjB4MTcxOSovCi0JdWludDhfdCByZWdfMHgzMjEwOy8qMHgzMjEwKi8KLQl1aW50OF90IHJlZ18weDExMTsgLyoweDExMSovCi0JdWludDhfdCByZWdfMHgzNDEwOyAgLyoweDM0MTAqLwotCXVpbnQ4X3QgcmVnXzB4MzA5ODsKLQl1aW50OF90IHJlZ18weDMwOUQ7Ci0JdWludDhfdCByZWdfMHgwMjAwOwotCXVpbnQ4X3QgcmVnXzB4MDIwMTsKLQl9Owotc3RydWN0IHZ4Njk1M19pMmNfcmVnX2NvbmYgewotCXVuc2lnbmVkIHNob3J0IHdhZGRyOwotCXVuc2lnbmVkIHNob3J0IHdkYXRhOwotfTsKLQotZW51bSB2eDY5NTNfdGVzdF9tb2RlX3QgewotCVRFU1RfT0ZGLAotCVRFU1RfMSwKLQlURVNUXzIsCi0JVEVTVF8zCi19OwotCi1lbnVtIHZ4Njk1M19yZXNvbHV0aW9uX3QgewotCVFUUl9TSVpFLAotCUZVTExfU0laRSwKLQlJTlZBTElEX1NJWkUKLX07Ci1lbnVtIHZ4Njk1M19zZXR0aW5nIHsKLQlSRVNfUFJFVklFVywKLQlSRVNfQ0FQVFVSRQotfTsKLWVudW0gbXQ5cDAxMl9yZWdfdXBkYXRlIHsKLQkvKiBTZW5zb3IgZWdpc3RlcnMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uICovCi0JUkVHX0lOSVQsCi0JLyogU2Vuc29yIGVnaXN0ZXJzIHRoYXQgbmVlZHMgcGVyaW9kaWMgSTJDIHdyaXRlcyAqLwotCVVQREFURV9QRVJJT0RJQywKLQkvKiBBbGwgdGhlIHNlbnNvciBSZWdpc3RlcnMgd2lsbCBiZSB1cGRhdGVkICovCi0JVVBEQVRFX0FMTCwKLQkvKiBOb3QgdmFsaWQgdXBkYXRlICovCi0JVVBEQVRFX0lOVkFMSUQKLX07Ci0KLWVudW0gc2Vuc29yX3JldmlzaW9uX3QgewotCVZYNjk1M19TVE01TTBFRE9GX0NVVF8xLAotCVZYNjk1M19TVE01TTBFRE9GX0NVVF8yLAotCVZYNjk1M19TVE01TTBFRE9GX0NVVF8zCi19OwotZW51bSBlZG9mX21vZGVfdCB7Ci0JVlg2OTUzX0VET0ZfRElTQUJMRSwgICAgICAgLyogMHgwMCAqLwotCVZYNjk1M19FRE9GX0FQUExJQ0FUSU9OLCAgIC8qIDB4MDEgKi8KLQlWWDY5NTNfRURPRl9FU1RJTUFUSU9OICAgICAvKiAweDAyICovCi19Owotc3RydWN0IHZ4Njk1M19yZWcgewotCWNvbnN0IHN0cnVjdCByZWdfc3RydWN0X2luaXQgICpyZWdfcGF0X2luaXQ7Ci0JY29uc3Qgc3RydWN0IHJlZ19zdHJ1Y3QgICpyZWdfcGF0OwotfTsKLSNlbmRpZiAvKiBWWDY5NTNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YyL2NhbWVyYS9jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92Mi9jYW1lcmEvY2FtZXJhLmMKaW5kZXggMDMxMzE2MS4uZWRhNjE1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YyL2NhbWVyYS9jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvY2FtZXJhL2NhbWVyYS5jCkBAIC01MzksNiArNTM5LDcgQEAKIAkJZ290byB2YjJfcV9mYWlsOwogCiAJaWYgKCFhdG9taWNfcmVhZCgmcHZkZXYtPm9wZW5lZCkpIHsKKwkJcG1fc3RheV9hd2FrZSgmcHZkZXYtPnZkZXYtPmRldik7CiAKIAkJLyogY3JlYXRlIGEgbmV3IHNlc3Npb24gd2hlbiBmaXJzdCBvcGVuZWQgKi8KIAkJcmMgPSBtc21fY3JlYXRlX3Nlc3Npb24ocHZkZXYtPnZkZXYtPm51bSwgcHZkZXYtPnZkZXYpOwpAQCAtNTcyLDYgKzU3Myw3IEBACiBjb21tYW5kX2Fja19xX2ZhaWw6CiAJbXNtX2Rlc3Ryb3lfc2Vzc2lvbihwdmRldi0+dmRldi0+bnVtKTsKIHNlc3Npb25fZmFpbDoKKwlwbV9yZWxheCgmcHZkZXYtPnZkZXYtPmRldik7CiAJY2FtZXJhX3Y0bDJfdmIyX3FfcmVsZWFzZShmaWxlcCk7CiB2YjJfcV9mYWlsOgogCWNhbWVyYV92NGwyX2ZoX3JlbGVhc2UoZmlsZXApOwpAQCAtNjIxLDYgKzYyMyw3IEBACiAJCS8qIFRoaXMgc2hvdWxkIHRha2UgY2FyZSBvZiBib3RoIG5vcm1hbCBjbG9zZQogCQkgKiBhbmQgYXBwbGljYXRpb24gY3Jhc2hlcyAqLwogCQltc21fZGVzdHJveV9zZXNzaW9uKHB2ZGV2LT52ZGV2LT5udW0pOworCQlwbV9yZWxheCgmcHZkZXYtPnZkZXYtPmRldik7CiAJCWF0b21pY19zZXQoJnB2ZGV2LT5zdHJlYW1fY250LCAwKTsKIAogCX0gZWxzZSB7CkBAIC03MjMsNiArNzI2LDcgQEAKIAlhdG9taWNfc2V0KCZwdmRldi0+b3BlbmVkLCAwKTsKIAlhdG9taWNfc2V0KCZwdmRldi0+c3RyZWFtX2NudCwgMCk7CiAJdmlkZW9fc2V0X2RydmRhdGEocHZkZXYtPnZkZXYsIHB2ZGV2KTsKKwlkZXZpY2VfaW5pdF93YWtldXAoJnB2ZGV2LT52ZGV2LT5kZXYsIDEpOwogCWdvdG8gaW5pdF9lbmQ7CiAKIHZpZGVvX3JlZ2lzdGVyX2ZhaWw6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvanBlZ18xMC9tc21fanBlZ19jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvanBlZ18xMC9tc21fanBlZ19jb3JlLmMKaW5kZXggNzY5ZTJhOC4uNTIwMTEzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YyL2pwZWdfMTAvbXNtX2pwZWdfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92Mi9qcGVnXzEwL21zbV9qcGVnX2NvcmUuYwpAQCAtMjMyLDYgKzIzMiw3IEBACiAJCQltc21fanBlZ19pcnFfaGFuZGxlcigKIAkJCQlNU01fSlBFR19IV19NQVNLX0NPTVBfRlJBTUVET05FLAogCQkJCWNvbnRleHQsIGRhdGEpOworCQlwZ21uX2Rldi0+c3RhdGUgPSBNU01fSlBFR19JTklUOwogCX0KIAlpZiAobXNtX2pwZWdfaHdfaXJxX2lzX3Jlc2V0X2FjayhqcGVnX2lycV9zdGF0dXMpKSB7CiAJCWRhdGEgPSBtc21fanBlZ19jb3JlX3Jlc2V0X2Fja19pcnEoanBlZ19pcnFfc3RhdHVzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YyL2pwZWdfMTAvbXNtX2pwZWdfaHdfcmVnLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvanBlZ18xMC9tc21fanBlZ19od19yZWcuaAppbmRleCBmOTcwYzc5Li40ZmJhYjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvanBlZ18xMC9tc21fanBlZ19od19yZWcuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvanBlZ18xMC9tc21fanBlZ19od19yZWcuaApAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCkBAIC01NSw3ICs1NSw3IEBACiAKICNkZWZpbmUgSlBFR19PRkZMSU5FX0NNRF9TVEFSVCAweDAwMDAwMDAxCiAKLSNkZWZpbmUgSlBFR19SRVNFVF9ERUZBVUxUIDB4MDAwMjAwMDAKKyNkZWZpbmUgSlBFR19SRVNFVF9ERUZBVUxUIDB4MDAwMzIwMTMKIAogI2RlZmluZSBKUEVHX0lSUV9ESVNBQkxFX0FMTCAweDAwMDAwMDAwCiAjZGVmaW5lIEpQRUdfSVJRX0NMRUFSX0FMTCAweEZGRkZGRkZGCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvbXNtLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvbXNtLmMKaW5kZXggMWZkMTA2NS4uZWZhM2FkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YyL21zbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92Mi9tc20uYwpAQCAtNjgwLDkgKzY4MCwxNCBAQAogCX0KIAogCS8qIHNob3VsZCB3YWl0IG9uIHNlc3Npb24gYmFzZWQgY29uZGl0aW9uICovCi0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChjbWRfYWNrLT53YWl0LAotCQkhbGlzdF9lbXB0eV9jYXJlZnVsKCZjbWRfYWNrLT5jb21tYW5kX3EubGlzdCksCi0JCW1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOworCWRvIHsKKwkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChjbWRfYWNrLT53YWl0LAorCQkJIWxpc3RfZW1wdHlfY2FyZWZ1bCgmY21kX2Fjay0+Y29tbWFuZF9xLmxpc3QpLAorCQkJbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7CisJCWlmIChyYyAhPSAtRVJFU1RBUlRTWVMpCisJCQlicmVhazsKKwl9IHdoaWxlICgxKTsKKwogCWlmIChsaXN0X2VtcHR5X2NhcmVmdWwoJmNtZF9hY2stPmNvbW1hbmRfcS5saXN0KSkgewogCQlpZiAoIXJjKSB7CiAJCQlwcl9lcnIoIiVzOiBUaW1lZCBvdXRcbiIsIF9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92Mi9tc20uaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92Mi9tc20uaAppbmRleCA0NmM3ZDY3Li4zMmI3MjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvbXNtLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YyL21zbS5oCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW9tbXUuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YyL3Bwcm9jL3ZwZS9tc21fdnBlLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvcHByb2MvdnBlL21zbV92cGUuYwppbmRleCAzYWFmZjc4Li5kYzI5MTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvcHByb2MvdnBlL21zbV92cGUuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvcHByb2MvdnBlL21zbV92cGUuYwpAQCAtMTI4Miw2ICsxMjgyLDE1IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCisJCWlmICgodV9zdHJlYW1fYnVmZl9pbmZvLT5udW1fYnVmZnMgPT0gMCkgfHwKKwkJCSh1X3N0cmVhbV9idWZmX2luZm8tPm51bV9idWZmcyA+CisJCQkJTVNNX0NBTUVSQV9NQVhfU1RSRUFNX0JVRikpIHsKKwkJCXByX2VycigiJXM6JWQ6IEludmFsaWQgbnVtYmVyIG9mIGJ1ZmZlcnNcbiIsIF9fZnVuY19fLAorCQkJCV9fTElORV9fKTsKKwkJCWtmcmVlKHVfc3RyZWFtX2J1ZmZfaW5mbyk7CisJCQltdXRleF91bmxvY2soJnZwZV9kZXYtPm11dGV4KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJCWtfc3RyZWFtX2J1ZmZfaW5mby5udW1fYnVmZnMgPSB1X3N0cmVhbV9idWZmX2luZm8tPm51bV9idWZmczsKIAkJa19zdHJlYW1fYnVmZl9pbmZvLmlkZW50aXR5ID0gdV9zdHJlYW1fYnVmZl9pbmZvLT5pZGVudGl0eTsKIAkJa19zdHJlYW1fYnVmZl9pbmZvLmJ1ZmZlcl9pbmZvID0KQEAgLTE0MjUsNiArMTQzNCw3IEBACiAJCXN0cnVjdCB2cGVfZGV2aWNlICp2cGVfZGV2ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAJCXN0cnVjdCBtc21fY2FtZXJhX3Y0bDJfaW9jdGxfdCAqaW9jdGxfcHRyID0gYXJnOwogCQlzdHJ1Y3QgbXNtX3ZwZV9mcmFtZV9pbmZvX3QgaW5zdF9pbmZvOworCQltZW1zZXQoJmluc3RfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBtc21fdnBlX2ZyYW1lX2luZm9fdCkpOwogCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0FDVElWRV9WUEVfSU5TVEFOQ0U7IGkrKykgewogCQkJaWYgKHZwZV9kZXYtPnZwZV9zdWJzY3JpYmVfbGlzdFtpXS52ZmggPT0gdmZoKSB7CiAJCQkJaW5zdF9pbmZvLmluc3RfaWQgPSBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YyL3NlbnNvci9hY3R1YXRvci9tc21fYWN0dWF0b3IuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92Mi9zZW5zb3IvYWN0dWF0b3IvbXNtX2FjdHVhdG9yLmMKaW5kZXggMTZhMTYxNi4uYmIyYjA3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YyL3NlbnNvci9hY3R1YXRvci9tc21fYWN0dWF0b3IuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvc2Vuc29yL2FjdHVhdG9yL21zbV9hY3R1YXRvci5jCkBAIC03OSw2ICs3OSwxMSBAQAogCXN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfYXJyYXkgKmkyY190YmwgPSBhX2N0cmwtPmkyY19yZWdfdGJsOwogCUNEQkcoIkVudGVyXG4iKTsKIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCS8qIGNoZWNrIHRoYXQgdGhlIGluZGV4IGludG8gaTJjX3RibCBjYW5ub3QgZ3JvdyBsYXJnZXIgdGhhdAorCQl0aGUgYWxsb2NhdGVkIHNpemUgb2YgaTJjX3RibCAqLworCQlpZiAoKGFfY3RybC0+dG90YWxfc3RlcHMgKyAxKSA8IChhX2N0cmwtPmkyY190YmxfaW5kZXgpKSB7CisJCQlicmVhazsKKwkJfQogCQlpZiAod3JpdGVfYXJyW2ldLnJlZ193cml0ZV90eXBlID09IE1TTV9BQ1RVQVRPUl9XUklURV9EQUMpIHsKIAkJCXZhbHVlID0gKG5leHRfbGVuc19wb3NpdGlvbiA8PAogCQkJCXdyaXRlX2FycltpXS5kYXRhX3NoaWZ0KSB8CkBAIC0xOTYsMTEgKzIwMSwxOSBAQAogCXN0cnVjdCBtc21fYWN0dWF0b3JfbW92ZV9wYXJhbXNfdCAqbW92ZV9wYXJhbXMpCiB7CiAJaW50MzJfdCBkZXN0X3N0ZXBfcG9zaXRpb24gPSBtb3ZlX3BhcmFtcy0+ZGVzdF9zdGVwX3BvczsKKwlzdHJ1Y3QgZGFtcGluZ19wYXJhbXNfdCByaW5naW5nX3BhcmFtc19rZXJuZWw7CiAJaW50MzJfdCByYyA9IDA7CiAJaW50MzJfdCBudW1fc3RlcHMgPSBtb3ZlX3BhcmFtcy0+bnVtX3N0ZXBzOwogCXN0cnVjdCBtc21fY2FtZXJhX2kyY19yZWdfc2V0dGluZyByZWdfc2V0dGluZzsKIAlDREJHKCJFbnRlclxuIik7CiAKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJpbmdpbmdfcGFyYW1zX2tlcm5lbCwKKwkJJihtb3ZlX3BhcmFtcy0+cmluZ2luZ19wYXJhbXNbMF0pLAorCQlzaXplb2Yoc3RydWN0IGRhbXBpbmdfcGFyYW1zX3QpKSkgeworCQlwcl9lcnIoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwogCWlmIChudW1fc3RlcHMgPT0gMCkKIAkJcmV0dXJuIHJjOwogCkBAIC0yMDgsNyArMjIxLDcgQEAKIAlhX2N0cmwtPmZ1bmNfdGJsLT5hY3R1YXRvcl9wYXJzZV9pMmNfcGFyYW1zKGFfY3RybCwKIAkJKG51bV9zdGVwcyAqCiAJCWFfY3RybC0+cmVnaW9uX3BhcmFtc1swXS5jb2RlX3Blcl9zdGVwKSwKLQkJbW92ZV9wYXJhbXMtPnJpbmdpbmdfcGFyYW1zWzBdLmh3X3BhcmFtcywgMCk7CisJCXJpbmdpbmdfcGFyYW1zX2tlcm5lbC5od19wYXJhbXMsIDApOwogCiAJcmVnX3NldHRpbmcucmVnX3NldHRpbmcgPSBhX2N0cmwtPmkyY19yZWdfdGJsOwogCXJlZ19zZXR0aW5nLmRhdGFfdHlwZSA9IGFfY3RybC0+aTJjX2RhdGFfdHlwZTsKQEAgLTIzMCw2ICsyNDMsNyBAQAogCXN0cnVjdCBtc21fYWN0dWF0b3JfbW92ZV9wYXJhbXNfdCAqbW92ZV9wYXJhbXMpCiB7CiAJaW50MzJfdCByYyA9IDA7CisJc3RydWN0IGRhbXBpbmdfcGFyYW1zX3QgcmluZ2luZ19wYXJhbXNfa2VybmVsOwogCWludDhfdCBzaWduX2RpciA9IG1vdmVfcGFyYW1zLT5zaWduX2RpcjsKIAl1aW50MTZfdCBzdGVwX2JvdW5kYXJ5ID0gMDsKIAl1aW50MTZfdCB0YXJnZXRfc3RlcF9wb3MgPSAwOwpAQCAtMjQwLDYgKzI1NCwxNCBAQAogCWludDMyX3QgbnVtX3N0ZXBzID0gbW92ZV9wYXJhbXMtPm51bV9zdGVwczsKIAlzdHJ1Y3QgbXNtX2NhbWVyYV9pMmNfcmVnX3NldHRpbmcgcmVnX3NldHRpbmc7CiAKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJpbmdpbmdfcGFyYW1zX2tlcm5lbCwKKwkJJihtb3ZlX3BhcmFtcy0+cmluZ2luZ19wYXJhbXNbYV9jdHJsLT5jdXJyX3JlZ2lvbl9pbmRleF0pLAorCQlzaXplb2Yoc3RydWN0IGRhbXBpbmdfcGFyYW1zX3QpKSkgeworCQlwcl9lcnIoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCiAJQ0RCRygiY2FsbGVkLCBkaXIgJWQsIG51bV9zdGVwcyAlZFxuIiwgZGlyLCBudW1fc3RlcHMpOwogCiAJaWYgKGRlc3Rfc3RlcF9wb3MgPT0gYV9jdHJsLT5jdXJyX3N0ZXBfcG9zKQpAQCAtMjYyLDkgKzI4NCw3IEBACiAJCQkJYV9jdHJsLT5zdGVwX3Bvc2l0aW9uX3RhYmxlW3RhcmdldF9zdGVwX3Bvc107CiAJCQlhX2N0cmwtPmZ1bmNfdGJsLT5hY3R1YXRvcl93cml0ZV9mb2N1cyhhX2N0cmwsCiAJCQkJCWN1cnJfbGVuc19wb3MsCi0JCQkJCSYobW92ZV9wYXJhbXMtPgotCQkJCQkJcmluZ2luZ19wYXJhbXNbYV9jdHJsLT4KLQkJCQkJCWN1cnJfcmVnaW9uX2luZGV4XSksCisJCQkJCSZyaW5naW5nX3BhcmFtc19rZXJuZWwsCiAJCQkJCXNpZ25fZGlyLAogCQkJCQl0YXJnZXRfbGVuc19wb3MpOwogCQkJY3Vycl9sZW5zX3BvcyA9IHRhcmdldF9sZW5zX3BvczsKQEAgLTI3NSw4ICsyOTUsNyBAQAogCQkJCWFfY3RybC0+c3RlcF9wb3NpdGlvbl90YWJsZVt0YXJnZXRfc3RlcF9wb3NdOwogCQkJYV9jdHJsLT5mdW5jX3RibC0+YWN0dWF0b3Jfd3JpdGVfZm9jdXMoYV9jdHJsLAogCQkJCQljdXJyX2xlbnNfcG9zLAotCQkJCQkmKG1vdmVfcGFyYW1zLT5yaW5naW5nX3BhcmFtc1thX2N0cmwtPgotCQkJCQkJY3Vycl9yZWdpb25faW5kZXhdKSwKKwkJCQkJJnJpbmdpbmdfcGFyYW1zX2tlcm5lbCwKIAkJCQkJc2lnbl9kaXIsCiAJCQkJCXRhcmdldF9sZW5zX3Bvcyk7CiAJCQljdXJyX2xlbnNfcG9zID0gdGFyZ2V0X2xlbnNfcG9zOwpAQCAtNDM3LDggKzQ1NiwxMSBAQAogCiAJYV9jdHJsLT5pMmNfZGF0YV90eXBlID0gc2V0X2luZm8tPmFjdHVhdG9yX3BhcmFtcy5pMmNfZGF0YV90eXBlOwogCWFfY3RybC0+aTJjX2NsaWVudC5hZGRyX3R5cGUgPSBzZXRfaW5mby0+YWN0dWF0b3JfcGFyYW1zLmkyY19hZGRyX3R5cGU7Ci0JYV9jdHJsLT5yZWdfdGJsX3NpemUgPSBzZXRfaW5mby0+YWN0dWF0b3JfcGFyYW1zLnJlZ190Ymxfc2l6ZTsKLQlpZiAoYV9jdHJsLT5yZWdfdGJsX3NpemUgPiBNQVhfQUNUVUFUT1JfUkVHX1RCTF9TSVpFKSB7CisJaWYgKHNldF9pbmZvLT5hY3R1YXRvcl9wYXJhbXMucmVnX3RibF9zaXplIDw9CisJCU1BWF9BQ1RVQVRPUl9SRUdfVEJMX1NJWkUpIHsKKwkJYV9jdHJsLT5yZWdfdGJsX3NpemUgPSBzZXRfaW5mby0+YWN0dWF0b3JfcGFyYW1zLnJlZ190Ymxfc2l6ZTsKKwl9IGVsc2UgeworCQlhX2N0cmwtPnJlZ190Ymxfc2l6ZSA9IDA7CiAJCXByX2VycigiTUFYX0FDVFVBVE9SX1JFR19UQkxfU0laRSBpcyBleGNlZWRlZC5cbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvc2Vuc29yL2NjaS9tc21fY2NpLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvc2Vuc29yL2NjaS9tc21fY2NpLmMKaW5kZXggOTY4ZGNkNy4uNGUxZjczZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YyL3NlbnNvci9jY2kvbXNtX2NjaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92Mi9zZW5zb3IvY2NpL21zbV9jY2kuYwpAQCAtOTUsNyArOTUsNyBAQAogc3RhdGljIHZvaWQgbXNtX2NjaV9mbHVzaF9xdWV1ZShzdHJ1Y3QgY2NpX2RldmljZSAqY2NpX2RldiwKIAllbnVtIGNjaV9pMmNfbWFzdGVyX3QgbWFzdGVyKQogewotCXVpbnQzMl90IHJjID0gMDsKKwlpbnQzMl90IHJjID0gMDsKIAogCW1zbV9jYW1lcmFfaW9fdygxIDw8IG1hc3RlciwgY2NpX2Rldi0+YmFzZSArIENDSV9IQUxUX1JFUV9BRERSKTsKIAlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KApAQCAtNDc5LDcgKzQ3OSw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChjX2N0cmwtPmNjaV9pbmZvLT5jY2lfaTJjX21hc3RlciA+IE1BU1RFUl9NQVgpIHsKKwlpZiAoY19jdHJsLT5jY2lfaW5mby0+Y2NpX2kyY19tYXN0ZXIgPiBNQVNURVJfTUFYCisJCQl8fCBjX2N0cmwtPmNjaV9pbmZvLT5jY2lfaTJjX21hc3RlciA8IDApIHsKIAkJcHJfZXJyKCIlczolZCBJbnZhbGlkIEkyQyBtYXN0ZXIgYWRkclxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNTI0LDcgKzUyNSw4IEBACiAJZW51bSBjY2lfaTJjX21hc3Rlcl90IG1hc3RlcjsKIAllbnVtIGNjaV9pMmNfcXVldWVfdCBxdWV1ZSA9IFFVRVVFXzA7CiAJY2NpX2RldiA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCWlmIChjX2N0cmwtPmNjaV9pbmZvLT5jY2lfaTJjX21hc3RlciA+IE1BU1RFUl9NQVgpIHsKKwlpZiAoY19jdHJsLT5jY2lfaW5mby0+Y2NpX2kyY19tYXN0ZXIgPiBNQVNURVJfTUFYCisJCQl8fCBjX2N0cmwtPmNjaV9pbmZvLT5jY2lfaTJjX21hc3RlciA8IDApIHsKIAkJcHJfZXJyKCIlczolZCBJbnZhbGlkIEkyQyBtYXN0ZXIgYWRkclxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNjQ1LDcgKzY0Nyw3IEBACiBzdGF0aWMgaW50MzJfdCBtc21fY2NpX2luaXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKIAlzdHJ1Y3QgbXNtX2NhbWVyYV9jY2lfY3RybCAqY19jdHJsKQogewotCWludCByYyA9IDA7CisJaW50MzJfdCByYyA9IDA7CiAJc3RydWN0IGNjaV9kZXZpY2UgKmNjaV9kZXY7CiAJZW51bSBjY2lfaTJjX21hc3Rlcl90IG1hc3RlcjsKIAljY2lfZGV2ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CkBAIC02NjEsNyArNjYzLDcgQEAKIAkJQ0RCRygiJXMgcmVmX2NvdW50ICVkXG4iLCBfX2Z1bmNfXywgY2NpX2Rldi0+cmVmX2NvdW50KTsKIAkJbWFzdGVyID0gY19jdHJsLT5jY2lfaW5mby0+Y2NpX2kyY19tYXN0ZXI7CiAJCUNEQkcoIiVzOiVkIG1hc3RlciAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBtYXN0ZXIpOwotCQlpZiAobWFzdGVyIDwgTUFTVEVSX01BWCkgeworCQlpZiAobWFzdGVyIDwgTUFTVEVSX01BWCAmJiBtYXN0ZXIgPj0gMCkgewogCQkJbXV0ZXhfbG9jaygmY2NpX2Rldi0+Y2NpX21hc3Rlcl9pbmZvW21hc3Rlcl0ubXV0ZXgpOwogCQkJLyogU2V0IHJlc2V0IHBlbmRpbmcgZmxhZyB0byBUUlVFICovCiAJCQljY2lfZGV2LT5jY2lfbWFzdGVyX2luZm9bbWFzdGVyXS5yZXNldF9wZW5kaW5nID0gVFJVRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92Mi9zZW5zb3IvZWVwcm9tL21zbV9lZXByb20uYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92Mi9zZW5zb3IvZWVwcm9tL21zbV9lZXByb20uYwppbmRleCA3ZjEzNTY4Li40NWRiMTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvc2Vuc29yL2VlcHJvbS9tc21fZWVwcm9tLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YyL3NlbnNvci9lZXByb20vbXNtX2VlcHJvbS5jCkBAIC00OCwxMCArNDgsMTIgQEAKIAkJCWVfY3RybC0+bnVtX2J5dGVzOwogCQlicmVhazsKIAljYXNlIENGR19FRVBST01fUkVBRF9DQUxfREFUQToKLQkJQ0RCRygiJXMgRSBDRkdfRUVQUk9NX1JFQURfQ0FMX0RBVEFcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSBjb3B5X3RvX3VzZXIoY2RhdGEtPmNmZy5yZWFkX2RhdGEuZGJ1ZmZlciwKKwkJaWYgKGNkYXRhLT5jZmcucmVhZF9kYXRhLm51bV9ieXRlcyA8PSBlX2N0cmwtPm51bV9ieXRlcykgeworCQkJQ0RCRygiJXMgRSBDRkdfRUVQUk9NX1JFQURfQ0FMX0RBVEFcbiIsIF9fZnVuY19fKTsKKwkJCXJjID0gY29weV90b191c2VyKGNkYXRhLT5jZmcucmVhZF9kYXRhLmRidWZmZXIsCiAJCQllX2N0cmwtPm1lbW9yeV9kYXRhLAogCQkJY2RhdGEtPmNmZy5yZWFkX2RhdGEubnVtX2J5dGVzKTsKKwkJfQogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92Mi9zZW5zb3IvZmxhc2gvbXNtX2xlZF90cmlnZ2VyLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmFfdjIvc2Vuc29yL2ZsYXNoL21zbV9sZWRfdHJpZ2dlci5jCmluZGV4IDIwOTA1YzkuLjAxZDJjMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYV92Mi9zZW5zb3IvZmxhc2gvbXNtX2xlZF90cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhX3YyL3NlbnNvci9mbGFzaC9tc21fbGVkX3RyaWdnZXIuYwpAQCAtMjksNiArMjksNyBAQAogZXh0ZXJuIGludDMyX3QgbXNtX2xlZF90b3JjaF9jcmVhdGVfY2xhc3NkZXYoCiAJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgdm9pZCAqZGF0YSk7CiAKK3N0YXRpYyBlbnVtIGZsYXNoX3R5cGUgZmxhc2h0eXBlOwogc3RhdGljIHN0cnVjdCBtc21fbGVkX2ZsYXNoX2N0cmxfdCBmY3RybDsKIAogc3RhdGljIGludDMyX3QgbXNtX2xlZF90cmlnZ2VyX2dldF9zdWJkZXZfaWQoc3RydWN0IG1zbV9sZWRfZmxhc2hfY3RybF90ICpmY3RybCwKQEAgLTExOSw2ICsxMjAsNyBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZmxhc2hfc3JjX25vZGUgPSBOVUxMOwogCXVpbnQzMl90IGNvdW50ID0gMDsKKwlzdHJ1Y3QgbGVkX3RyaWdnZXIgKnRlbXAgPSBOVUxMOwogCiAJQ0RCRygiY2FsbGVkXG4iKTsKIApAQCAtMTM3LDExICsxMzksMTggQEAKIAl9CiAJQ0RCRygicGRldiBpZCAlZFxuIiwgcGRldi0+aWQpOwogCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihvZl9ub2RlLAorCQkJInFjb20sZmxhc2gtdHlwZSIsICZmbGFzaHR5cGUpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCJmbGFzaC10eXBlOiByZWFkIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWlmIChvZl9nZXRfcHJvcGVydHkob2Zfbm9kZSwgInFjb20sZmxhc2gtc291cmNlIiwgJmNvdW50KSkgewogCQljb3VudCAvPSBzaXplb2YodWludDMyX3QpOwogCQlDREJHKCJjb3VudCAlZFxuIiwgY291bnQpOwogCQlpZiAoY291bnQgPiBNQVhfTEVEX1RSSUdHRVJTKSB7Ci0JCQlwcl9lcnIoImZhaWxlZFxuIik7CisJCQlwcl9lcnIoImludmFsaWQgY291bnRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJZmN0cmwubnVtX3NvdXJjZXMgPSBjb3VudDsKQEAgLTE1Nyw3ICsxNjYsNyBAQAogCQkJCSJsaW51eCxkZWZhdWx0LXRyaWdnZXIiLAogCQkJCSZmY3RybC5mbGFzaF90cmlnZ2VyX25hbWVbaV0pOwogCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiZmFpbGVkXG4iKTsKKwkJCQlwcl9lcnIoImRlZmF1bHQtdHJpZ2dlcjogcmVhZCBmYWlsZWRcbiIpOwogCQkJCW9mX25vZGVfcHV0KGZsYXNoX3NyY19ub2RlKTsKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTE2NSwxMiArMTc0LDE4IEBACiAJCQlDREJHKCJkZWZhdWx0IHRyaWdnZXIgJXNcbiIsCiAJCQkJZmN0cmwuZmxhc2hfdHJpZ2dlcl9uYW1lW2ldKTsKIAotCQkJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihmbGFzaF9zcmNfbm9kZSwKLQkJCQkicWNvbSxjdXJyZW50IiwgJmZjdHJsLmZsYXNoX29wX2N1cnJlbnRbaV0pOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiZmFpbGVkIHJjICVkXG4iLCByYyk7Ci0JCQkJb2Zfbm9kZV9wdXQoZmxhc2hfc3JjX25vZGUpOwotCQkJCWNvbnRpbnVlOworCQkJaWYgKGZsYXNodHlwZSA9PSBHUElPX0ZMQVNIKSB7CisJCQkJLyogdXNlIGZha2UgY3VycmVudCAqLworCQkJCWZjdHJsLmZsYXNoX29wX2N1cnJlbnRbaV0gPSBMRURfRlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihmbGFzaF9zcmNfbm9kZSwKKwkJCQkJInFjb20sY3VycmVudCIsCisJCQkJCSZmY3RybC5mbGFzaF9vcF9jdXJyZW50W2ldKTsKKwkJCQlpZiAocmMgPCAwKSB7CisJCQkJCXByX2VycigiY3VycmVudDogcmVhZCBmYWlsZWRcbiIpOworCQkJCQlvZl9ub2RlX3B1dChmbGFzaF9zcmNfbm9kZSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KIAkJCX0KIAogCQkJb2Zfbm9kZV9wdXQoZmxhc2hfc3JjX25vZGUpOwpAQCAtMTgwLDYgKzE5NSwxMCBAQAogCiAJCQlsZWRfdHJpZ2dlcl9yZWdpc3Rlcl9zaW1wbGUoZmN0cmwuZmxhc2hfdHJpZ2dlcl9uYW1lW2ldLAogCQkJCSZmY3RybC5mbGFzaF90cmlnZ2VyW2ldKTsKKworCQkJaWYgKGZsYXNodHlwZSA9PSBHUElPX0ZMQVNIKQorCQkJCWlmIChmY3RybC5mbGFzaF90cmlnZ2VyW2ldKQorCQkJCQl0ZW1wID0gZmN0cmwuZmxhc2hfdHJpZ2dlcltpXTsKIAkJfQogCiAJCS8qIFRvcmNoIHNvdXJjZSAqLwpAQCAtMTkwLDI1ICsyMDksMzkgQEAKIAkJCQkibGludXgsZGVmYXVsdC10cmlnZ2VyIiwKIAkJCQkmZmN0cmwudG9yY2hfdHJpZ2dlcl9uYW1lKTsKIAkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoImZhaWxlZFxuIik7Ci0JCQl9IGVsc2UgewotCQkJCUNEQkcoImRlZmF1bHQgdHJpZ2dlciAlc1xuIiwKLQkJCQkJZmN0cmwudG9yY2hfdHJpZ2dlcl9uYW1lKTsKKwkJCQlwcl9lcnIoImRlZmF1bHQtdHJpZ2dlcjogcmVhZCBmYWlsZWRcbiIpOworCQkJCWdvdG8gdG9yY2hfZmFpbGVkOworCQkJfQogCisJCQlDREJHKCJkZWZhdWx0IHRyaWdnZXIgJXNcbiIsCisJCQkJZmN0cmwudG9yY2hfdHJpZ2dlcl9uYW1lKTsKKworCQkJaWYgKGZsYXNodHlwZSA9PSBHUElPX0ZMQVNIKSB7CisJCQkJLyogdXNlIGZha2UgY3VycmVudCAqLworCQkJCWZjdHJsLnRvcmNoX29wX2N1cnJlbnQgPSBMRURfRlVMTDsKKwkJCQlpZiAodGVtcCkKKwkJCQkJZmN0cmwudG9yY2hfdHJpZ2dlciA9IHRlbXA7CisJCQkJZWxzZQorCQkJCQlsZWRfdHJpZ2dlcl9yZWdpc3Rlcl9zaW1wbGUoCisJCQkJCQlmY3RybC50b3JjaF90cmlnZ2VyX25hbWUsCisJCQkJCQkmZmN0cmwudG9yY2hfdHJpZ2dlcik7CisJCQl9IGVsc2UgewogCQkJCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoZmxhc2hfc3JjX25vZGUsCiAJCQkJCSJxY29tLGN1cnJlbnQiLAogCQkJCQkmZmN0cmwudG9yY2hfb3BfY3VycmVudCk7CiAJCQkJaWYgKHJjIDwgMCkgewotCQkJCQlwcl9lcnIoImZhaWxlZCByYyAlZFxuIiwgcmMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUNEQkcoInRvcmNoIG1heF9jdXJyZW50ICVkXG4iLAotCQkJCQkJZmN0cmwudG9yY2hfb3BfY3VycmVudCk7Ci0KLQkJCQkJbGVkX3RyaWdnZXJfcmVnaXN0ZXJfc2ltcGxlKAotCQkJCQkJZmN0cmwudG9yY2hfdHJpZ2dlcl9uYW1lLAotCQkJCQkJJmZjdHJsLnRvcmNoX3RyaWdnZXIpOworCQkJCQlwcl9lcnIoImN1cnJlbnQ6IHJlYWQgZmFpbGVkXG4iKTsKKwkJCQkJZ290byB0b3JjaF9mYWlsZWQ7CiAJCQkJfQorCisJCQkJQ0RCRygidG9yY2ggbWF4X2N1cnJlbnQgJWRcbiIsCisJCQkJCWZjdHJsLnRvcmNoX29wX2N1cnJlbnQpOworCisJCQkJbGVkX3RyaWdnZXJfcmVnaXN0ZXJfc2ltcGxlKAorCQkJCQlmY3RybC50b3JjaF90cmlnZ2VyX25hbWUsCisJCQkJCSZmY3RybC50b3JjaF90cmlnZ2VyKTsKIAkJCX0KK3RvcmNoX2ZhaWxlZDoKIAkJCW9mX25vZGVfcHV0KGZsYXNoX3NyY19ub2RlKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2R2Yi9kZW11eC9tcHFfZG14X3BsdWdpbl9jb21tb24uYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2R2Yi9kZW11eC9tcHFfZG14X3BsdWdpbl9jb21tb24uYwppbmRleCAyYmM0NjBiLi5lM2E1MzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9kdmIvZGVtdXgvbXBxX2RteF9wbHVnaW5fY29tbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vZHZiL2RlbXV4L21wcV9kbXhfcGx1Z2luX2NvbW1vbi5jCkBAIC0yMDk2LDcgKzIwOTYsNyBAQAogewogCWludCBsZWZ0X3NpemUsIGNvcHlfbGVuOwogCi0JLyogUmVtYWlubmluZyBoZWFkZXIgYnl0ZXMgdGhhdCBuZWVkIHRvIGJlIHByb2Nlc3NlZD8gKi8KKwkvKiBSZW1haW5pbmcgaGVhZGVyIGJ5dGVzIHRoYXQgbmVlZCB0byBiZSBwcm9jZXNzZWQ/ICovCiAJaWYgKCFmZWVkX2RhdGEtPnBlc19oZWFkZXJfbGVmdF9ieXRlcykKIAkJcmV0dXJuIDA7CiAKQEAgLTQxMDcsNyArNDEwNyw4IEBACiAJc3RydWN0IGRteF9kYXRhX3JlYWR5IHBlc19ldmVudDsKIAlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQgPSBtcHFfZmVlZC0+ZHZiX2RlbXV4X2ZlZWQ7CiAJc3RydWN0IGR2Yl9yaW5nYnVmZmVyICpidWYgPSAoc3RydWN0IGR2Yl9yaW5nYnVmZmVyICopCi0JCQkJZmVlZC0+ZmVlZC50cy5idWZmZXIucmluZ2J1ZmY7CisJCWZlZWQtPmZlZWQudHMuYnVmZmVyLnJpbmdidWZmOworCXNzaXplX3QgYnl0ZXNfYXZhaWw7CiAKIAlpZiAoKCFzdHMtPm1ldGFkYXRhX2ZpbGxfY291bnQpICYmICghc3RzLT5kYXRhX2ZpbGxfY291bnQpKQogCQlnb3RvIHBlc19maWx0ZXJfY2hlY2tfb3ZlcmZsb3c7CkBAIC00MTM5LDEzICs0MTQwLDE4IEBACiAJfQogCiAJd2hpbGUgKHN0cy0+bWV0YWRhdGFfZmlsbF9jb3VudCkgewotCQlpZiAoZHZiX3JpbmdidWZmZXJfYXZhaWwoJm1wcV9mZWVkLT5tZXRhZGF0YV9idWYpIDwKLQkJCShzaXplb2YoaGVhZGVyKSArIHNpemVvZihjb3VudGVycykpKSB7CisJCWJ5dGVzX2F2YWlsID0gZHZiX3JpbmdidWZmZXJfYXZhaWwoJm1wcV9mZWVkLT5tZXRhZGF0YV9idWYpOworCQlpZiAoYnl0ZXNfYXZhaWwgPCAoc2l6ZW9mKGhlYWRlcikgKyBzaXplb2YoY291bnRlcnMpKSkgewogCQkJTVBRX0RWQl9FUlJfUFJJTlQoCi0JCQkJIiVzOiBtZXRhZGF0YV9maWxsX2NvdW50IGlzICVkIGJ1dCBhY3R1YWwgYnVmZmVyIGhhcyBsZXNzIHRoYW4gJWQgYnl0ZXNcbiIsCisJCQkJIiVzOiBtZXRhZGF0YV9maWxsX2NvdW50IGlzICVkIGxlc3MgdGhhbiByZXF1aXJlZCAlZCBieXRlc1xuIiwKIAkJCQlfX2Z1bmNfXywKIAkJCQlzdHMtPm1ldGFkYXRhX2ZpbGxfY291bnQsCiAJCQkJc2l6ZW9mKGhlYWRlcikgKyBzaXplb2YoY291bnRlcnMpKTsKKworCQkJLyogY2xlYW4tdXAgcmVtYWluaW5nIGJ5dGVzIHRvIHRyeSB0byByZWNvdmVyICovCisJCQlEVkJfUklOR0JVRkZFUl9TS0lQKCZtcHFfZmVlZC0+bWV0YWRhdGFfYnVmLAorCQkJCWJ5dGVzX2F2YWlsKTsKKwkJCXN0cy0+bWV0YWRhdGFfZmlsbF9jb3VudCA9IDA7CiAJCQlicmVhazsKIAkJfQogCkBAIC00MjMwLDYgKzQyMzYsNyBAQAogCXN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZmVlZCA9IG1wcV9mZWVkLT5kdmJfZGVtdXhfZmVlZDsKIAlzdHJ1Y3QgZHZiX2RlbXV4X2ZpbHRlciAqZjsKIAlzdHJ1Y3QgZG14X3NlY3Rpb25fZmVlZCAqc2VjID0gJmZlZWQtPmZlZWQuc2VjOworCXNzaXplX3QgYnl0ZXNfYXZhaWw7CiAKIAkvKiBQYXJzZSBlcnJvciBpbmRpY2F0b3JzICovCiAJaWYgKHN0cy0+ZXJyb3JfaW5kaWNhdG9ycyAmIFNETVhfRklMVEVSX0VSUl9TRUNfVkVSSUZfQ1JDMzJfRkFJTCkgewpAQCAtNDI1MCw2ICs0MjU3LDIxIEBACiAJbXBxX2ZlZWQtPnNkbXhfYnVmLnB3cml0ZSA9IHN0cy0+ZGF0YV93cml0ZV9vZmZzZXQ7CiAKIAl3aGlsZSAoc3RzLT5tZXRhZGF0YV9maWxsX2NvdW50KSB7CisJCWJ5dGVzX2F2YWlsID0gZHZiX3JpbmdidWZmZXJfYXZhaWwoJm1wcV9mZWVkLT5tZXRhZGF0YV9idWYpOworCQlpZiAoYnl0ZXNfYXZhaWwgPCBzaXplb2YoaGVhZGVyKSkgeworCQkJTVBRX0RWQl9FUlJfUFJJTlQoCisJCQkJIiVzOiBtZXRhZGF0YV9maWxsX2NvdW50IGlzICVkIGxlc3MgdGhhbiByZXF1aXJlZCAlZCBieXRlc1xuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlzdHMtPm1ldGFkYXRhX2ZpbGxfY291bnQsCisJCQkJc2l6ZW9mKGhlYWRlcikpOworCisJCQkvKiBjbGVhbi11cCByZW1haW5pbmcgYnl0ZXMgdG8gdHJ5IHRvIHJlY292ZXIgKi8KKwkJCURWQl9SSU5HQlVGRkVSX1NLSVAoJm1wcV9mZWVkLT5tZXRhZGF0YV9idWYsCisJCQkJYnl0ZXNfYXZhaWwpOworCQkJc3RzLT5tZXRhZGF0YV9maWxsX2NvdW50ID0gMDsKKwkJCWJyZWFrOworCQl9CisKIAkJZHZiX3JpbmdidWZmZXJfcmVhZCgmbXBxX2ZlZWQtPm1ldGFkYXRhX2J1ZiwgKHU4ICopICZoZWFkZXIsCiAJCQlzaXplb2YoaGVhZGVyKSk7CiAJCXN0cy0+bWV0YWRhdGFfZmlsbF9jb3VudCAtPSBzaXplb2YoaGVhZGVyKTsKQEAgLTQyODgsMTAgKzQzMTAsMTAgQEAKIAl1OCBtZXRhZGF0YV9idWZbTUFYX1NETVhfTUVUQURBVEFfTEVOR1RIXTsKIAlzdHJ1Y3QgbXBxX3N0cmVhbWJ1ZmZlciAqc2J1ZjsKIAlpbnQgcmV0OwotCWludCBwZXNfY250ID0gMDsKIAlzdHJ1Y3QgZG14X2RhdGFfcmVhZHkgZGF0YV9ldmVudDsKIAlzdHJ1Y3QgZG14X2RhdGFfcmVhZHkgZGF0YTsKIAlzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmZlZWQgPSBtcHFfZmVlZC0+ZHZiX2RlbXV4X2ZlZWQ7CisJc3NpemVfdCBieXRlc19hdmFpbDsKIAogCWlmICgoIXN0cy0+bWV0YWRhdGFfZmlsbF9jb3VudCkgJiYgKCFzdHMtPmRhdGFfZmlsbF9jb3VudCkpCiAJCWdvdG8gZGVjb2Rlcl9maWx0ZXJfY2hlY2tfZmxhZ3M7CkBAIC00MzE4LDcgKzQzNDAsMjEgQEAKIAkJc3RydWN0IG1wcV9zdHJlYW1idWZmZXJfcGFja2V0X2hlYWRlciBwYWNrZXQ7CiAJCXN0cnVjdCBtcHFfYWRhcHRlcl92aWRlb19tZXRhX2RhdGEgbWV0YV9kYXRhOwogCi0JCXBlc19jbnQrKzsKKwkJYnl0ZXNfYXZhaWwgPSBkdmJfcmluZ2J1ZmZlcl9hdmFpbCgmbXBxX2ZlZWQtPm1ldGFkYXRhX2J1Zik7CisJCWlmIChieXRlc19hdmFpbCA8IChzaXplb2YoaGVhZGVyKSArIHNpemVvZihjb3VudGVycykpKSB7CisJCQlNUFFfRFZCX0VSUl9QUklOVCgKKwkJCQkiJXM6IG1ldGFkYXRhX2ZpbGxfY291bnQgaXMgJWQgbGVzcyB0aGFuIHJlcXVpcmVkICVkIGJ5dGVzXG4iLAorCQkJCV9fZnVuY19fLAorCQkJCXN0cy0+bWV0YWRhdGFfZmlsbF9jb3VudCwKKwkJCQlzaXplb2YoaGVhZGVyKSArIHNpemVvZihjb3VudGVycykpOworCisJCQkvKiBjbGVhbi11cCByZW1haW5pbmcgYnl0ZXMgdG8gdHJ5IHRvIHJlY292ZXIgKi8KKwkJCURWQl9SSU5HQlVGRkVSX1NLSVAoJm1wcV9mZWVkLT5tZXRhZGF0YV9idWYsCisJCQkJYnl0ZXNfYXZhaWwpOworCQkJc3RzLT5tZXRhZGF0YV9maWxsX2NvdW50ID0gMDsKKwkJCWJyZWFrOworCQl9CisKIAkJLyogUmVhZCBtZXRhZGF0YSBoZWFkZXIgKi8KIAkJZHZiX3JpbmdidWZmZXJfcmVhZCgmbXBxX2ZlZWQtPm1ldGFkYXRhX2J1ZiwgKHU4ICopJmhlYWRlciwKIAkJCXNpemVvZihoZWFkZXIpKTsKQEAgLTQzMzQsMTUgKzQzNzAsMjggQEAKIAkJc3RzLT5tZXRhZGF0YV9maWxsX2NvdW50IC09IHNpemVvZihjb3VudGVycyk7CiAKIAkJLyogUmVhZCBtZXRhZGF0YSAtIFRTICYgUEVTIGhlYWRlcnMgKi8KLQkJaWYgKGhlYWRlci5tZXRhZGF0YV9sZW5ndGggPCBNQVhfU0RNWF9NRVRBREFUQV9MRU5HVEgpCisJCWJ5dGVzX2F2YWlsID0gZHZiX3JpbmdidWZmZXJfYXZhaWwoJm1wcV9mZWVkLT5tZXRhZGF0YV9idWYpOworCQlpZiAoKGhlYWRlci5tZXRhZGF0YV9sZW5ndGggPCBNQVhfU0RNWF9NRVRBREFUQV9MRU5HVEgpICYmCisJCQkoaGVhZGVyLm1ldGFkYXRhX2xlbmd0aCA+PSBzaXplb2YoY291bnRlcnMpKSAmJgorCQkJKGJ5dGVzX2F2YWlsID49CisJCQkgKGhlYWRlci5tZXRhZGF0YV9sZW5ndGggLSBzaXplb2YoY291bnRlcnMpKSkpIHsKIAkJCWR2Yl9yaW5nYnVmZmVyX3JlYWQoJm1wcV9mZWVkLT5tZXRhZGF0YV9idWYsCiAJCQkJbWV0YWRhdGFfYnVmLAogCQkJCWhlYWRlci5tZXRhZGF0YV9sZW5ndGggLSBzaXplb2YoY291bnRlcnMpKTsKLQkJZWxzZQorCQl9IGVsc2UgewogCQkJTVBRX0RWQl9FUlJfUFJJTlQoCi0JCQkJIiVzOiBtZXRhLWRhdGEgc2l6ZT0lZCBpcyB0b28gYmlnIGZvciBtZXRhLWRhdGEgYnVmZmVyPSVkXG4iLAorCQkJCSIlczogbWV0YS1kYXRhIHNpemUgJWQgbGFyZ2VyIHRoYW4gYXZhaWxhYmxlIG1ldGEtZGF0YSAlZCBvciBtYXggYWxsb3dlZCAlZFxuIiwKIAkJCQlfX2Z1bmNfXywgaGVhZGVyLm1ldGFkYXRhX2xlbmd0aCwKKwkJCQlieXRlc19hdmFpbCwKIAkJCQlNQVhfU0RNWF9NRVRBREFUQV9MRU5HVEgpOworCisJCQkvKiBjbGVhbi11cCByZW1haW5pbmcgYnl0ZXMgdG8gdHJ5IHRvIHJlY292ZXIgKi8KKwkJCURWQl9SSU5HQlVGRkVSX1NLSVAoJm1wcV9mZWVkLT5tZXRhZGF0YV9idWYsCisJCQkJYnl0ZXNfYXZhaWwpOworCQkJc3RzLT5tZXRhZGF0YV9maWxsX2NvdW50ID0gMDsKKwkJCWJyZWFrOworCQl9CisKIAkJc3RzLT5tZXRhZGF0YV9maWxsX2NvdW50IC09CiAJCQkoaGVhZGVyLm1ldGFkYXRhX2xlbmd0aCAtIHNpemVvZihjb3VudGVycykpOwogCkBAIC00NDc1LDYgKzQ1MjQsNyBAQAogCXU4IGJ1ZltUU19QQUNLRVRfSEVBREVSX0xFTkdUSCArIE1BWF9UU1BfQURBUFRBVElPTl9MRU5HVEggKwogCSAgICAgICBUSU1FU1RBTVBfTEVOXTsKIAlzaXplX3Qgc3RjX2xlbiA9IDA7CisJc3NpemVfdCBieXRlc19hdmFpbDsKIAogCWlmIChzdHMtPmVycm9yX2luZGljYXRvcnMgJiBTRE1YX0ZJTFRFUl9FUlJfRF9CVUZfRlVMTCkKIAkJTVBRX0RWQl9FUlJfUFJJTlQoIiVzOiBpbnRlcm5hbCBQQ1IgYnVmZmVyIG92ZXJmbG93ZWQhXG4iLApAQCAtNDQ5MCw2ICs0NTQwLDIxIEBACiAJcmJ1ZmYtPnB3cml0ZSA9IHN0cy0+ZGF0YV93cml0ZV9vZmZzZXQ7CiAKIAl3aGlsZSAoc3RzLT5tZXRhZGF0YV9maWxsX2NvdW50KSB7CisJCWJ5dGVzX2F2YWlsID0gZHZiX3JpbmdidWZmZXJfYXZhaWwoJm1wcV9mZWVkLT5tZXRhZGF0YV9idWYpOworCQlpZiAoYnl0ZXNfYXZhaWwgPCBzaXplb2YoaGVhZGVyKSkgeworCQkJTVBRX0RWQl9FUlJfUFJJTlQoCisJCQkJIiVzOiBtZXRhZGF0YV9maWxsX2NvdW50IGlzICVkIGxlc3MgdGhhbiByZXF1aXJlZCAlZCBieXRlc1xuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlzdHMtPm1ldGFkYXRhX2ZpbGxfY291bnQsCisJCQkJc2l6ZW9mKGhlYWRlcikpOworCisJCQkvKiBjbGVhbi11cCByZW1haW5pbmcgYnl0ZXMgdG8gdHJ5IHRvIHJlY292ZXIgKi8KKwkJCURWQl9SSU5HQlVGRkVSX1NLSVAoJm1wcV9mZWVkLT5tZXRhZGF0YV9idWYsCisJCQkJYnl0ZXNfYXZhaWwpOworCQkJc3RzLT5tZXRhZGF0YV9maWxsX2NvdW50ID0gMDsKKwkJCWJyZWFrOworCQl9CisKIAkJZHZiX3JpbmdidWZmZXJfcmVhZCgmbXBxX2ZlZWQtPm1ldGFkYXRhX2J1ZiwgKHU4ICopICZoZWFkZXIsCiAJCQlzaXplb2YoaGVhZGVyKSk7CiAJCU1QUV9EVkJfREJHX1BSSU5UKApAQCAtNDc3NSw2ICs0ODQwLDE0IEBACiAJCXRvZG8gPSBmaWxsX2NvdW50ID4gbGltaXQgPyBsaW1pdCA6IGZpbGxfY291bnQ7CiAJCXJldCA9IG1wcV9zZG14X3Byb2Nlc3NfYnVmZmVyKG1wcV9kZW11eCwgaW5wdXQsIHRvZG8sCiAJCQlyZWFkX29mZnNldCk7CisKKwkJaWYgKG1wcV9kZW11eC0+ZGVtdXguc3dfZmlsdGVyX2Fib3J0KSB7CisJCQlNUFFfRFZCX0VSUl9QUklOVCgKKwkJCQkiJXM6IERlbXV4aW5nIGZyb20gRFZSIHdhcyBhYm9ydGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKIAkJaWYgKHJldCA+IDApIHsKIAkJCXRvdGFsX2J5dGVzX3JlYWQgKz0gcmV0OwogCQkJZmlsbF9jb3VudCAtPSByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92NGwyX3ZpZGMuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3Y0bDJfdmlkYy5jCmluZGV4IDgxYWZkNWMuLjQ2OGJhNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3Y0bDJfdmlkYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3Y0bDJfdmlkYy5jCkBAIC0zNSw3ICszNSw3IEBACiAKIHN0cnVjdCBtc21fdmlkY19kcnYgKnZpZGNfZHJpdmVyOwogCi11aW50MzJfdCBtc21fdmlkY19wd3JfY29sbGFwc2VfZGVsYXkgPSAyMDAwOwordWludDMyX3QgbXNtX3ZpZGNfcHdyX2NvbGxhcHNlX2RlbGF5ID0gMTAwMDA7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1zbV92aWRjX2luc3QgKmdldF92aWRjX2luc3Qoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmZoKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vd2ZkL3ZzZy1zdWJkZXYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3dmZC92c2ctc3ViZGV2LmMKaW5kZXggMGYyZmJiYi4uYzIwMjUwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vd2ZkL3ZzZy1zdWJkZXYuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS93ZmQvdnNnLXN1YmRldi5jCkBAIC0yNCw2ICsyNCwxMiBAQAogI2RlZmluZSBERUZBVUxUX01PREUgKChlbnVtIHZzZ19tb2RlcylWU0dfTU9ERV9DRlIpCiAjZGVmaW5lIE1BWF9CVUZTX0JVU1lfV0lUSF9FTkMgNQogCitzdGF0aWMgdm9pZCB2c2dfcmVzZXRfdGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyLCBrdGltZV90IHRpbWUpCit7CisJaHJ0aW1lcl9mb3J3YXJkX25vdyh0aW1lciwgdGltZSk7CisJaHJ0aW1lcl9yZXN0YXJ0KHRpbWVyKTsKK30KKwogc3RhdGljIGludCB2c2dfcmVsZWFzZV9pbnB1dF9idWZmZXIoc3RydWN0IHZzZ19jb250ZXh0ICpjb250ZXh0LAogCQlzdHJ1Y3QgdnNnX2J1Zl9pbmZvICpidWYpCiB7CkBAIC0xMTQsNyArMTIwLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmYnVmX2luZm8tPm5vZGUpOwogCiAJa3RpbWVfZ2V0X3RzKCZidWZfaW5mby0+dGltZSk7Ci0JaHJ0aW1lcl9mb3J3YXJkX25vdygmY29udGV4dC0+dGhyZXNob2xkX3RpbWVyLCBuc190b19rdGltZSgKKwl2c2dfcmVzZXRfdGltZXIoJmNvbnRleHQtPnRocmVzaG9sZF90aW1lciwgbnNfdG9fa3RpbWUoCiAJCQkJY29udGV4dC0+bWF4X2ZyYW1lX2ludGVydmFsKSk7CiAKIAl0ZW1wID0gTlVMTDsKQEAgLTQzOCw3ICs0NDQsNyBAQAogCQkJICogb3RoZXJ3aXNlLCBkaWZmIGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIGZyYW1lcyBtaWdodAogCQkJICogYmUgbGVzcyB0aGFuIG1heF9mcmFtZV9pbnRlcnZhbCAoZm9yIGp1c3Qgb25lIHNhbXBsZSkKIAkJCSAqLwotCQkJaHJ0aW1lcl9mb3J3YXJkX25vdygmY29udGV4dC0+dGhyZXNob2xkX3RpbWVyLAorCQkJdnNnX3Jlc2V0X3RpbWVyKCZjb250ZXh0LT50aHJlc2hvbGRfdGltZXIsCiAJCQkJbnNfdG9fa3RpbWUoY29udGV4dC0+bWF4X2ZyYW1lX2ludGVydmFsKSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWlyaXMuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8taXJpcy5jCmluZGV4IDVlMDU2YmUuLjMxZDAzYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8taXJpcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8taXJpcy5jCkBAIC00OSwxMSArNDksMTUgQEAKIHN0YXRpYyBjaGFyIHV0Zl84X2ZsYWc7CiBzdGF0aWMgY2hhciBydF9lcnRfZmxhZzsKIHN0YXRpYyBjaGFyIGZvcm1hdHRpbmdfZGlyOworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2lnX2JsZW5kID0gQ1RSTF9PTjsKIHN0YXRpYyBERUZJTkVfTVVURVgoaXJpc19mbSk7CiAKIG1vZHVsZV9wYXJhbShyZHNfYnVmLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MocmRzX2J1ZiwgIlJEUyBidWZmZXIgZW50cmllczogKjEwMCoiKTsKIAorbW9kdWxlX3BhcmFtKHNpZ19ibGVuZCwgYnl0ZSwgU19JV1VTUiB8IFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhzaWdfYmxlbmQsICJzaWduYWwgYmxlbmRpbmcgc3dpdGNoOiAwOk9GRiAxOk9OIik7CisKIHN0YXRpYyB2b2lkIHJhZGlvX2hjaV9jbWRfdGFzayh1bnNpZ25lZCBsb25nIGFyZyk7CiBzdGF0aWMgdm9pZCByYWRpb19oY2lfcnhfdGFzayh1bnNpZ25lZCBsb25nIGFyZyk7CiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSAqdmlkZW9fZ2V0X2Rldih2b2lkKTsKQEAgLTQxNDEsNyArNDE0NSw3IEBACiAJfQogCiAJcmFkaW8tPnN0ZXJlb19tb2RlLnN0ZXJlb19tb2RlID0gQ1RSTF9PRkY7Ci0JcmFkaW8tPnN0ZXJlb19tb2RlLnNpZ19ibGVuZCA9IENUUkxfT047CisJcmFkaW8tPnN0ZXJlb19tb2RlLnNpZ19ibGVuZCA9IHNpZ19ibGVuZDsKIAlyYWRpby0+c3RlcmVvX21vZGUuaW50Zl9ibGVuZCA9IENUUkxfT047CiAJcmFkaW8tPnN0ZXJlb19tb2RlLm1vc3Rfc3dpdGNoID0gQ1RSTF9PTjsKIAlyZXR2YWwgPSBoY2lfc2V0X2ZtX3N0ZXJlb19tb2RlKCZyYWRpby0+c3RlcmVvX21vZGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY3RybHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jdHJscy5jCmluZGV4IDdlNGNlYjMuLjlkZDA2ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jdHJscy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jdHJscy5jCkBAIC0yODQsNiArMjg0LDcgQEAKIAkJIjQuMiIsCiAJCSI1IiwKIAkJIjUuMSIsCisJCSI1LjIiLAogCQlOVUxMLAogCX07CiAJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoMjY0X2xvb3BfZmlsdGVyW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93Y2Q5eHh4LWlycS5jIGIvZHJpdmVycy9tZmQvd2NkOXh4eC1pcnEuYwppbmRleCBkYzMyZWZkLi45MjA5ZjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93Y2Q5eHh4LWlycS5jCisrKyBiL2RyaXZlcnMvbWZkL3djZDl4eHgtaXJxLmMKQEAgLTE1MCwxMyArMTUwLDE1IEBACiAJCQkJICAgICAgbXNtX2NwdWlkbGVfZ2V0X2RlZXBfaWRsZV9sYXRlbmN5KCkpOwogCX0KIAltdXRleF91bmxvY2soJndjZDl4eHhfcmVzLT5wbV9sb2NrKTsKLQlvcyA9IHdjZDl4eHhfcG1fY21weGNoZyh3Y2Q5eHh4X3JlcywKLQkJCQkJV0NEOVhYWF9QTV9TTEVFUEFCTEUsCi0JCQkJCVdDRDlYWFhfUE1fQVdBS0UpOworCiAJaWYgKCF3YWl0X2V2ZW50X3RpbWVvdXQod2NkOXh4eF9yZXMtPnBtX3dxLAotCQkJKG9zICA9PSBXQ0Q5WFhYX1BNX1NMRUVQQUJMRSB8fAotCQkJIG9zID09IFdDRDlYWFhfUE1fQVdBS0UpLAotCQkJbXNlY3NfdG9famlmZmllcyhXQ0Q5WFhYX1NZU1RFTV9SRVNVTUVfVElNRU9VVF9NUykpKSB7CisJCQkJKChvcyA9ICB3Y2Q5eHh4X3BtX2NtcHhjaGcod2NkOXh4eF9yZXMsCisJCQkJCQkgIFdDRDlYWFhfUE1fU0xFRVBBQkxFLAorCQkJCQkJICBXQ0Q5WFhYX1BNX0FXQUtFKSkgPT0KKwkJCQkJCQlXQ0Q5WFhYX1BNX1NMRUVQQUJMRSB8fAorCQkJCQkob3MgPT0gV0NEOVhYWF9QTV9BV0FLRSkpLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoCisJCQkJCVdDRDlYWFhfU1lTVEVNX1JFU1VNRV9USU1FT1VUX01TKSkpIHsKIAkJcHJfd2FybigiJXM6IHN5c3RlbSBkaWRuJ3QgcmVzdW1lIHdpdGhpbiAlZG1zLCBzICVkLCB3ICVkXG4iLAogCQkJX19mdW5jX18sCiAJCQlXQ0Q5WFhYX1NZU1RFTV9SRVNVTUVfVElNRU9VVF9NUywgd2NkOXh4eF9yZXMtPnBtX3N0YXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jIGIvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jCmluZGV4IGU1MzE1YmQuLjc0MzY2OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYworKysgYi9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMKQEAgLTI4MDAsOCArMjgwMCwxMSBAQAogIGVycl9wdXRkaXNrOgogCXB1dF9kaXNrKG1kLT5kaXNrKTsKICBlcnJfa2ZyZWU6CisJaWYgKCFzdWJuYW1lKQorCQlfX2NsZWFyX2JpdChtZC0+bmFtZV9pZHgsIG5hbWVfdXNlKTsKIAlrZnJlZShtZCk7CiAgb3V0OgorCV9fY2xlYXJfYml0KGRldmlkeCwgZGV2X3VzZSk7CiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9tc21fc2RjYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9tc21fc2RjYy5jCmluZGV4IDg5ZTM0NzIuLjk1ZjBhMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvbXNtX3NkY2MuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L21zbV9zZGNjLmMKQEAgLTUxNiw4ICs1MTYsNiBAQAogCiAJaWYgKG1ycS0+ZGF0YSkKIAkJbXJxLT5kYXRhLT5ieXRlc194ZmVyZWQgPSBob3N0LT5jdXJyLmRhdGFfeGZlcmVkOwotCWlmIChtcnEtPmNtZC0+ZXJyb3IgPT0gLUVUSU1FRE9VVCkKLQkJbWRlbGF5KDUpOwogCiAJbXNtc2RjY19yZXNldF9kcHNtKGhvc3QpOwogCkBAIC02NDc1LDcgKzY0NzMsNyBAQAogCWhvc3QtPmRlYnVnZnNfaG9zdF9kaXIgPSBOVUxMOwogfQogI2Vsc2UKLXN0YXRpYyB2b2lkIG1zbXNkY2NfcmVtb3ZlX2RlYnVnZnMobXNtc2RjY19ob3N0ICpob3N0KSB7fQorc3RhdGljIHZvaWQgbXNtc2RjY19yZW1vdmVfZGVidWdmcyhzdHJ1Y3QgbXNtc2RjY19ob3N0ICpob3N0KSB7fQogI2VuZGlmCiAKIHN0YXRpYyBpbnQgbXNtc2RjY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTY2ODIsNyArNjY4MCw3IEBACiB9CiAjZW5kaWYKIAotI2lmIENPTkZJR19ERUJVR19GUworI2lmZGVmIENPTkZJR19ERUJVR19GUwogc3RhdGljIHZvaWQgbXNtc2RjY19wcmludF9wbV9zdGF0cyhzdHJ1Y3QgbXNtc2RjY19ob3N0ICpob3N0LCBrdGltZV90IHN0YXJ0LAogCQkJCSAgIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBlcnIpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW1zbS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1tc20uYwppbmRleCAyYzg1OThiLi5iOTNlYWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW1zbS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktbXNtLmMKQEAgLTIzMTAsNiArMjMxMCw3IEBACiAJc3RydWN0IHNkaGNpX21zbV9ob3N0ICptc21faG9zdCA9IHBsdGZtX2hvc3QtPnByaXY7CiAJc3RydWN0IG1tY19pb3MJY3Vycl9pb3MgPSBob3N0LT5tbWMtPmlvczsKIAl1MzIgc3VwX2Nsb2NrLCBkZHJfY2xvY2s7CisJYm9vbCBjdXJyX3B3cnNhdmU7CiAKIAlpZiAoIWNsb2NrKSB7CiAJCXNkaGNpX21zbV9wcmVwYXJlX2Nsb2Nrcyhob3N0LCBmYWxzZSk7CkBAIC0yMzIxLDYgKzIzMjIsMjIgQEAKIAlpZiAocmMpCiAJCXJldHVybjsKIAorCWN1cnJfcHdyc2F2ZSA9ICEhKHJlYWRsX3JlbGF4ZWQoaG9zdC0+aW9hZGRyICsgQ09SRV9WRU5ET1JfU1BFQykgJgorCQkJICBDT1JFX0NMS19QV1JTQVZFKTsKKwlpZiAoKGNsb2NrID4gNDAwMDAwKSAmJgorCSAgICAhY3Vycl9wd3JzYXZlICYmIG1tY19ob3N0X21heV9nYXRlX2NhcmQoaG9zdC0+bW1jLT5jYXJkKSkKKwkJd3JpdGVsX3JlbGF4ZWQocmVhZGxfcmVsYXhlZChob3N0LT5pb2FkZHIgKyBDT1JFX1ZFTkRPUl9TUEVDKQorCQkJCXwgQ09SRV9DTEtfUFdSU0FWRSwKKwkJCQlob3N0LT5pb2FkZHIgKyBDT1JFX1ZFTkRPUl9TUEVDKTsKKwkvKgorCSAqIERpc2FibGUgcHdyc2F2ZSBmb3IgYSBuZXdseSBhZGRlZCBjYXJkIGlmIGRvZXNuJ3QgYWxsb3cgY2xvY2sKKwkgKiBnYXRpbmcuCisJICovCisJZWxzZSBpZiAoY3Vycl9wd3JzYXZlICYmICFtbWNfaG9zdF9tYXlfZ2F0ZV9jYXJkKGhvc3QtPm1tYy0+Y2FyZCkpCisJCXdyaXRlbF9yZWxheGVkKHJlYWRsX3JlbGF4ZWQoaG9zdC0+aW9hZGRyICsgQ09SRV9WRU5ET1JfU1BFQykKKwkJCQkmIH5DT1JFX0NMS19QV1JTQVZFLAorCQkJCWhvc3QtPmlvYWRkciArIENPUkVfVkVORE9SX1NQRUMpOworCiAJc3VwX2Nsb2NrID0gc2RoY2lfbXNtX2dldF9zdXBfY2xrX3JhdGUoaG9zdCwgY2xvY2spOwogCWlmICgoY3Vycl9pb3MudGltaW5nID09IE1NQ19USU1JTkdfVUhTX0REUjUwKSB8fAogCQkoY3Vycl9pb3MudGltaW5nID09IE1NQ19USU1JTkdfTU1DX0hTNDAwKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jCmluZGV4IDBjYjA0OTEuLjc1OGE3OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMKQEAgLTExMCw3ICsxMTAsNyBAQAogCQlzZGhjaV9yZWFkbChob3N0LCBTREhDSV9JTlRfRU5BQkxFKSwKIAkJc2RoY2lfcmVhZGwoaG9zdCwgU0RIQ0lfU0lHTkFMX0VOQUJMRSkpOwogCXByX2luZm8oRFJJVkVSX05BTUUgIjogQUMxMiBlcnI6IDB4JTA4eCB8IFNsb3QgaW50OiAweCUwOHhcbiIsCi0JCXNkaGNpX3JlYWR3KGhvc3QsIFNESENJX0FVVE9fQ01EX0VSUiksCisJCWhvc3QtPmF1dG9fY21kX2Vycl9zdHMsCiAJCXNkaGNpX3JlYWR3KGhvc3QsIFNESENJX1NMT1RfSU5UX1NUQVRVUykpOwogCXByX2luZm8oRFJJVkVSX05BTUUgIjogQ2FwczogICAgIDB4JTA4eCB8IENhcHNfMTogICAweCUwOHhcbiIsCiAJCXNkaGNpX3JlYWRsKGhvc3QsIFNESENJX0NBUEFCSUxJVElFUyksCkBAIC0yMzc1LDYgKzIzNzUsNyBAQAogCWhvc3QtPm1ycSA9IE5VTEw7CiAJaG9zdC0+Y21kID0gTlVMTDsKIAlob3N0LT5kYXRhID0gTlVMTDsKKwlob3N0LT5hdXRvX2NtZF9lcnJfc3RzID0gMDsKIAogI2lmbmRlZiBTREhDSV9VU0VfTEVEU19DTEFTUwogCXNkaGNpX2RlYWN0aXZhdGVfbGVkKGhvc3QpOwpAQCAtMjQ2NSw3ICsyNDY2LDkgQEAKIAkJaG9zdC0+Y21kLT5lcnJvciA9IC1FSUxTRVE7CiAKIAlpZiAoaW50bWFzayAmIFNESENJX0lOVF9BVVRPX0NNRF9FUlIpIHsKLQkJYXV0b19jbWRfc3RhdHVzID0gc2RoY2lfcmVhZHcoaG9zdCwgU0RIQ0lfQVVUT19DTURfRVJSKTsKKwkJYXV0b19jbWRfc3RhdHVzID0gaG9zdC0+YXV0b19jbWRfZXJyX3N0czsKKwkJcHJfZXJyKCIlczogJXM6IEFVVE8gQ01EIGVyciBzdHMgMHglMDh4XG4iLAorCQkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksIF9fZnVuY19fLCBhdXRvX2NtZF9zdGF0dXMpOwogCQlpZiAoYXV0b19jbWRfc3RhdHVzICYgKFNESENJX0FVVE9fQ01EMTJfTk9UX0VYRUMgfAogCQkJCSAgICAgICBTREhDSV9BVVRPX0NNRF9JTkRFWF9FUlIgfAogCQkJCSAgICAgICBTREhDSV9BVVRPX0NNRF9FTkRCSVRfRVJSKSkKQEAgLTI3MjgsNiArMjczMSw5IEBACiAJfQogCiAJaWYgKGludG1hc2sgJiBTREhDSV9JTlRfQ01EX01BU0spIHsKKwkJaWYgKGludG1hc2sgJiBTREhDSV9JTlRfQVVUT19DTURfRVJSKQorCQkJaG9zdC0+YXV0b19jbWRfZXJyX3N0cyA9IHNkaGNpX3JlYWR3KGhvc3QsCisJCQkJCVNESENJX0FVVE9fQ01EX0VSUik7CiAJCXNkaGNpX3dyaXRlbChob3N0LCBpbnRtYXNrICYgU0RIQ0lfSU5UX0NNRF9NQVNLLAogCQkJU0RIQ0lfSU5UX1NUQVRVUyk7CiAJCWlmICgoaG9zdC0+cXVpcmtzMiAmIFNESENJX1FVSVJLMl9TTE9XX0lOVF9DTFIpICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93Y25zcy93Y25zc193bGFuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93Y25zcy93Y25zc193bGFuLmMKaW5kZXggN2I3NDNhNC4uMzNkMTFiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2Nuc3Mvd2Nuc3Nfd2xhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3djbnNzL3djbnNzX3dsYW4uYwpAQCAtMTAwLDYgKzEwMCwxNCBAQAogCiAjZGVmaW5lIFBST05UT19QTVVfQ09NX0NQVV9DQkNSX09GRlNFVCAgICAgMHgwMDMwCiAjZGVmaW5lIFBST05UT19QTVVfQ09NX0FIQl9DQkNSX09GRlNFVCAgICAgMHgwMDM0CisKKyNkZWZpbmUgUFJPTlRPX1BNVV9XTEFOX0FIQl9DQkNSX09GRlNFVCAgICAweDAwNzQKKyNkZWZpbmUgUFJPTlRPX1BNVV9XTEFOX0FIQl9DQkNSX0NMS19FTiAgICBCSVQoMCkKKyNkZWZpbmUgUFJPTlRPX1BNVV9XTEFOX0FIQl9DQkNSX0NMS19PRkYgICBCSVQoMzEpCisKKyNkZWZpbmUgUFJPTlRPX1BNVV9DUFVfQUhCX0NNRF9SQ0dSX09GRlNFVCAgMHgwMTIwCisjZGVmaW5lIFBST05UT19QTVVfQ1BVX0FIQl9DTURfUkNHUl9ST09UX0VOIEJJVCgxKQorCiAjZGVmaW5lIFBST05UT19QTVVfQ0ZHX09GRlNFVCAgICAgICAgICAgICAgMHgxMDA0CiAjZGVmaW5lIFBST05UT19QTVVfQ09NX0NTUl9PRkZTRVQgICAgICAgICAgMHgxMDQwCiAjZGVmaW5lIFBST05UT19QTVVfU09GVF9SRVNFVF9PRkZTRVQgICAgICAgMHgxMDRDCkBAIC00NzYsNyArNDg0LDcgQEAKIHZvaWQgd2Nuc3NfcHJvbnRvX2xvZ19kZWJ1Z19yZWdzKHZvaWQpCiB7CiAJdm9pZCBfX2lvbWVtICpyZWdfYWRkciwgKnRzdF9hZGRyLCAqdHN0X2N0cmxfYWRkcjsKLQl1MzIgcmVnID0gMCwgcmVnMiA9IDA7CisJdTMyIHJlZyA9IDAsIHJlZzIgPSAwLCByZWczID0gMCwgcmVnNCA9IDA7CiAKIAogCXJlZ19hZGRyID0gcGVudi0+bXNtX3djbnNzX2Jhc2UgKyBQUk9OVE9fUE1VX1NQQVJFX09GRlNFVDsKQEAgLTYzMiw4ICs2NDAsMTkgQEAKIAlyZWdfYWRkciA9IHBlbnYtPm1zbV93Y25zc19iYXNlICsgUFJPTlRPX1BNVV9XTEFOX0dEU0NSX09GRlNFVDsKIAlyZWcyID0gcmVhZGxfcmVsYXhlZChyZWdfYWRkcik7CiAKKwlyZWdfYWRkciA9IHBlbnYtPm1zbV93Y25zc19iYXNlICsgUFJPTlRPX1BNVV9XTEFOX0FIQl9DQkNSX09GRlNFVDsKKwlyZWczID0gcmVhZGxfcmVsYXhlZChyZWdfYWRkcik7CisJcHJfaW5mb19yYXRlbGltaXRlZCgiJXM6ICBQTVVfV0xBTl9BSEJfQ0JDUiAlMDh4XG4iLCBfX2Z1bmNfXywgcmVnMyk7CisKKwlyZWdfYWRkciA9IHBlbnYtPm1zbV93Y25zc19iYXNlICsgUFJPTlRPX1BNVV9DUFVfQUhCX0NNRF9SQ0dSX09GRlNFVDsKKwlyZWc0ID0gcmVhZGxfcmVsYXhlZChyZWdfYWRkcik7CisJcHJfaW5mb19yYXRlbGltaXRlZCgiJXM6ICBQTVVfQ1BVX0NNRF9SQ0dSICUwOHhcbiIsIF9fZnVuY19fLCByZWc0KTsKKwogCWlmICgocmVnICYgUFJPTlRPX1BNVV9XTEFOX0JDUl9CTEtfQVJFUykgfHwKLQkJCShyZWcyICYgUFJPTlRPX1BNVV9XTEFOX0dEU0NSX1NXX0NPTExBUFNFKSkgeworCQkocmVnMiAmIFBST05UT19QTVVfV0xBTl9HRFNDUl9TV19DT0xMQVBTRSkgfHwKKwkJKCEocmVnNCAmIFBST05UT19QTVVfQ1BVX0FIQl9DTURfUkNHUl9ST09UX0VOKSkgfHwKKwkJKHJlZzMgJiBQUk9OVE9fUE1VX1dMQU5fQUhCX0NCQ1JfQ0xLX09GRikgfHwKKwkJKCEocmVnMyAmIFBST05UT19QTVVfV0xBTl9BSEJfQ0JDUl9DTEtfRU4pKSkgewogCQlwcl9pbmZvX3JhdGVsaW1pdGVkKCIlczogIENhbm5vdCBsb2csIHdsYW4gZG9tYWluIGlzIHBvd2VyIGNvbGxhcHNlZFxuIiwKIAkJCQlfX2Z1bmNfXyk7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL25mYy1uY2kuYyBiL2RyaXZlcnMvbmZjL25mYy1uY2kuYwppbmRleCA2N2IwNTdjLi4wNDNmOWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25mYy9uZmMtbmNpLmMKKysrIGIvZHJpdmVycy9uZmMvbmZjLW5jaS5jCkBAIC05MjMsNiArOTIzLDE5IEBACiAJCWdvdG8gZXJyX21pc2NfcmVnaXN0ZXI7CiAJfQogCisJcmVndWxhdG9ycy5yZWd1bGF0b3IgPSByZWd1bGF0b3JfZ2V0KCZjbGllbnQtPmRldiwgcmVndWxhdG9ycy5uYW1lKTsKKwlpZiAoSVNfRVJSKHJlZ3VsYXRvcnMucmVndWxhdG9yKSkgeworCQlyID0gUFRSX0VSUihyZWd1bGF0b3JzLnJlZ3VsYXRvcik7CisJCXByX2VycigicmVndWxhdG9yIGdldCBvZiAlcyBmYWlsZWQgKCVkKVxuIiwgcmVndWxhdG9ycy5uYW1lLCByKTsKKwl9IGVsc2UgeworCQkvKiBFbmFibGUgdGhlIHJlZ3VsYXRvciAqLworCQlyID0gcmVndWxhdG9yX2VuYWJsZShyZWd1bGF0b3JzLnJlZ3VsYXRvcik7CisJCWlmIChyKSB7CisJCQlwcl9lcnIoInZyZWcgJXMgZW5hYmxlIGZhaWxlZCAoJWQpXG4iLAorCQkJCXJlZ3VsYXRvcnMubmFtZSwgcik7CisJCX0KKwl9CisKIAlsb2dnaW5nX2xldmVsID0gMDsKIAkvKiByZXF1ZXN0IGlycS4gIFRoZSBpcnEgaXMgc2V0IHdoZW5ldmVyIHRoZSBjaGlwIGhhcyBkYXRhIGF2YWlsYWJsZQogCSogZm9yIHJlYWRpbmcuICBJdCBpcyBjbGVhcmVkIHdoZW4gYWxsIGRhdGEgaGFzIGJlZW4gcmVhZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL25mYy1uY2kuaCBiL2RyaXZlcnMvbmZjL25mYy1uY2kuaAppbmRleCA4MWYyNTIxLi45YmZiNzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25mYy9uZmMtbmNpLmgKKysrIGIvZHJpdmVycy9uZmMvbmZjLW5jaS5oCkBAIC0yMjMsMyArMjIzLDkgQEAKIAl1bnNpZ25lZCBpbnQJcmVnOwogfTsKICNlbmRpZgorLyogZW5hYmxlIExETyAqLworc3RydWN0IHZyZWdzX2luZm8geworCWNvbnN0IGNoYXIgKiBjb25zdCBuYW1lOworCXN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvcjsKK307CitzdHJ1Y3QgdnJlZ3NfaW5mbyByZWd1bGF0b3JzID0geyJ2bG9naWMiLCBOVUxMfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2Yvb2ZfYmF0dGVyeWRhdGEuYyBiL2RyaXZlcnMvb2Yvb2ZfYmF0dGVyeWRhdGEuYwppbmRleCAyMDYxNDA4Li5iMGQ0MGYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL29mX2JhdHRlcnlkYXRhLmMKKysrIGIvZHJpdmVycy9vZi9vZl9iYXR0ZXJ5ZGF0YS5jCkBAIC0yNDQsOSArMjQ0LDE3IEBACiB7CiAJaW50NjRfdCByZXNpc3Rvcl92YWx1ZV9rb2htLCBkZW5vbTsKIAorCWlmIChiYXR0X2lkX3V2ID09IDApIHsKKwkJLyogdmFkYyBub3QgY29ycmVjdCBvciBiYXR0IGlkIGxpbmUgZ3JvdW5kZWQsIHJlcG9ydCAwIGtvaG1zICovCisJCXJldHVybiAwOworCX0KIAkvKiBjYWxjdWxhdGUgdGhlIGJhdHRlcnkgaWQgcmVzaXN0YW5jZSByZXBvcnRlZCB2aWEgQURDICovCiAJZGVub20gPSBkaXY2NF9zNjQodmFkY192ZGQgKiAxMDAwMDAwTEwsIGJhdHRfaWRfdXYpIC0gMTAwMDAwMExMOwogCisJaWYgKGRlbm9tID09IDApIHsKKwkJLyogYmF0dCBpZCBjb25uZWN0b3IgbWlnaHQgYmUgb3BlbiwgcmV0dXJuIDAga29obXMgKi8KKwkJcmV0dXJuIDA7CisJfQogCXJlc2lzdG9yX3ZhbHVlX2tvaG0gPSBkaXY2NF9zNjQocnB1bGxfdXAgKiAxMDAwMDAwTEwgKyBkZW5vbS8yLCBkZW5vbSk7CiAKIAlwcl9kZWJ1ZygiYmF0dCBpZCB2b2x0YWdlID0gJWQsIHJlc2lzdG9yIHZhbHVlID0gJWxsZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMKaW5kZXggMDQ2MjBjMi4uOTE1NzY3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMKQEAgLTEwNSw2ICsxMDUsNyBAQAogCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTiwKIAlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKIAlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX0FWRywKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX09DViwKIAlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwKIAlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTCwKIAlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLApAQCAtMTcxLDYgKzE3MiwxMyBAQAogCiAJCXZhbC0+aW50dmFsID0gcmV0ICogNjI1IC8gODsKIAkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX09DVjoKKwkJcmV0ID0gbWF4MTcwNDJfcmVhZF9yZWcoY2hpcC0+Y2xpZW50LCBNQVgxNzA0Ml9PQ1ZJbnRlcm5hbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQl2YWwtPmludHZhbCA9IHJldCAqIDYyNSAvIDg7CisJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6CiAJCXJldCA9IG1heDE3MDQyX3JlYWRfcmVnKGNoaXAtPmNsaWVudCwgTUFYMTcwNDJfUmVwU09DKTsKIAkJaWYgKHJldCA8IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9zeXNmcy5jIGIvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfc3lzZnMuYwppbmRleCAzMTlhMjRkLi5iOTE4MTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X3N5c2ZzLmMKQEAgLTE0OCw2ICsxNDgsNyBAQAogCVBPV0VSX1NVUFBMWV9BVFRSKHZvbHRhZ2Vfbm93KSwKIAlQT1dFUl9TVVBQTFlfQVRUUih2b2x0YWdlX2F2ZyksCiAJUE9XRVJfU1VQUExZX0FUVFIoaW5wdXRfdm9sdGFnZV9yZWd1bGF0aW9uKSwKKwlQT1dFUl9TVVBQTFlfQVRUUih2b2x0YWdlX29jdiksCiAJUE9XRVJfU1VQUExZX0FUVFIoY3VycmVudF9tYXgpLAogCVBPV0VSX1NVUFBMWV9BVFRSKGlucHV0X2N1cnJlbnRfbWF4KSwKIAlQT1dFUl9TVVBQTFlfQVRUUihpbnB1dF9jdXJyZW50X3RyaW0pLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9xcG5wLWJtcy5jIGIvZHJpdmVycy9wb3dlci9xcG5wLWJtcy5jCmluZGV4IGFkMzllODguLjk3Mjc3ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvcXBucC1ibXMuYworKysgYi9kcml2ZXJzL3Bvd2VyL3FwbnAtYm1zLmMKQEAgLTIwMywxMiArMjAzLDE0IEBACiAJaW50CQkJCWxvd192b2x0YWdlX3RocmVzaG9sZDsKIAlpbnQJCQkJbG93X3NvY19jYWxjX3RocmVzaG9sZDsKIAlpbnQJCQkJbG93X3NvY19jYWxjdWxhdGVfc29jX21zOworCWludAkJCQlsb3dfdm9sdGFnZV9jYWxjdWxhdGVfc29jX21zOwogCWludAkJCQljYWxjdWxhdGVfc29jX21zOwogCXN0cnVjdCBibXNfd2FrZXVwX3NvdXJjZQlzb2Nfd2FrZV9zb3VyY2U7CiAJc3RydWN0IHdha2VfbG9jawkJY3Zfd2FrZV9sb2NrOwogCiAJdWludDE2X3QJCQlvY3ZfcmVhZGluZ19hdF8xMDA7CiAJdWludDE2X3QJCQlwcmV2X2xhc3RfZ29vZF9vY3ZfcmF3OworCWludAkJCQlpbnNlcnRpb25fb2N2X3V2OwogCWludAkJCQlsYXN0X29jdl91djsKIAlpbnQJCQkJY2hhcmdpbmdfYWRqdXN0ZWRfb2N2OwogCWludAkJCQlsYXN0X29jdl90ZW1wOwpAQCAtMjM5LDYgKzI0MSw3IEBACiAJdW5zaWduZWQgaW50CQkJdmFkY192MDYyNTsKIAl1bnNpZ25lZCBpbnQJCQl2YWRjX3YxMjUwOwogCisJaW50CQkJCXN5c3RlbV9sb2FkX2NvdW50OwogCWludAkJCQlwcmV2X3V1Y19pYXZnX21hOwogCWludAkJCQlwcmV2X3BjX3VudXNhYmxlOwogCWludAkJCQlpYmF0X2F0X2N2X3VhOwpAQCAtNzY5LDcgKzc3Miw3IEBACiAJaWYgKGNoaXAtPmJhdHRfcHN5ID09IE5VTEwpCiAJCWNoaXAtPmJhdHRfcHN5ID0gcG93ZXJfc3VwcGx5X2dldF9ieV9uYW1lKCJiYXR0ZXJ5Iik7CiAJaWYgKGNoaXAtPmJhdHRfcHN5KSB7Ci0JCS8qIGlmIGJhdHRlcnkgaGFzIGJlZW4gcmVnaXN0ZXJlZCwgdXNlIHRoZSBzdGF0dXMgcHJvcGVydHkgKi8KKwkJLyogaWYgYmF0dGVyeSBoYXMgYmVlbiByZWdpc3RlcmVkLCB1c2UgdGhlIHByZXNlbnQgcHJvcGVydHkgKi8KIAkJY2hpcC0+YmF0dF9wc3ktPmdldF9wcm9wZXJ0eShjaGlwLT5iYXR0X3BzeSwKIAkJCQkJUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwgJnJldCk7CiAJCXJldHVybiByZXQuaW50dmFsOwpAQCAtNzgwLDYgKzc4MywzNSBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorc3RhdGljIGludCBnZXRfYmF0dGVyeV9pbnNlcnRpb25fb2N2X3V2KHN0cnVjdCBxcG5wX2Jtc19jaGlwICpjaGlwKQoreworCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsIHJldCA9IHswLH07CisJaW50IHJjLCB2YmF0OworCisJaWYgKGNoaXAtPmJhdHRfcHN5ID09IE5VTEwpCisJCWNoaXAtPmJhdHRfcHN5ID0gcG93ZXJfc3VwcGx5X2dldF9ieV9uYW1lKCJiYXR0ZXJ5Iik7CisJaWYgKGNoaXAtPmJhdHRfcHN5KSB7CisJCS8qIGlmIGJhdHRlcnkgaGFzIGJlZW4gcmVnaXN0ZXJlZCwgdXNlIHRoZSBvY3YgcHJvcGVydHkgKi8KKwkJcmMgPSBjaGlwLT5iYXR0X3BzeS0+Z2V0X3Byb3BlcnR5KGNoaXAtPmJhdHRfcHN5LAorCQkJCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfT0NWLCAmcmV0KTsKKwkJaWYgKHJjKSB7CisJCQkvKgorCQkJICogRGVmYXVsdCB0byB2YmF0dCBpZiB0aGUgYmF0dGVyeSBPQ1YgaXMgbm90CisJCQkgKiByZWdpc3RlcmVkLgorCQkJICovCisJCQlwcl9kZWJ1ZygiQmF0dGVyeSBwc3kgZG9lcyBub3QgaGF2ZSB2b2x0YWdlIG9jdlxuIik7CisJCQlyYyA9IGdldF9iYXR0ZXJ5X3ZvbHRhZ2UoY2hpcCwgJnZiYXQpOworCQkJaWYgKHJjKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIHZiYXQ7CisJCX0KKwkJcmV0dXJuIHJldC5pbnR2YWw7CisJfQorCisJcHJfZGVidWcoImJhdHRlcnkgcG93ZXIgc3VwcGx5IGlzIG5vdCByZWdpc3RlcmVkXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwogc3RhdGljIGJvb2wgaXNfYmF0ZmV0X2Nsb3NlZChzdHJ1Y3QgcXBucF9ibXNfY2hpcCAqY2hpcCkKIHsKIAl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCByZXQgPSB7MCx9OwpAQCAtODU5LDcgKzg5MSw3IEBACiAKIHN0YXRpYyB2b2lkIHJlc2V0X2Zvcl9uZXdfYmF0dGVyeShzdHJ1Y3QgcXBucF9ibXNfY2hpcCAqY2hpcCwgaW50IGJhdHRfdGVtcCkKIHsKLQljaGlwLT5sYXN0X29jdl91diA9IGVzdGltYXRlX29jdihjaGlwKTsKKwljaGlwLT5sYXN0X29jdl91diA9IGNoaXAtPmluc2VydGlvbl9vY3ZfdXY7CiAJbXV0ZXhfbG9jaygmY2hpcC0+bGFzdF9zb2NfbXV0ZXgpOwogCWNoaXAtPmxhc3Rfc29jID0gLUVJTlZBTDsKIAljaGlwLT5sYXN0X3NvY19pbnZhbGlkID0gdHJ1ZTsKQEAgLTg5Niw3ICs5MjgsNyBAQAogCQkJCXN0cnVjdCByYXdfc29jX3BhcmFtcyAqcmF3LAogCQkJCWludCBiYXR0X3RlbXApCiB7Ci0JYm9vbCB3YXJtX3Jlc2V0ID0gZmFsc2U7CisJaW50IHdhcm1fcmVzZXQ7CiAJaW50IHJjOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+Ym1zX291dHB1dF9sb2NrKTsKQEAgLTEzMDIsNDggKzEzMzQsNzkgQEAKIAlyZXR1cm4gdXVjX3VhaF9pYXZnOwogfQogCi1zdGF0aWMgdm9pZCBmaW5kX29jdl9mb3Jfc29jKHN0cnVjdCBxcG5wX2Jtc19jaGlwICpjaGlwLAotCQkJCXN0cnVjdCBzb2NfcGFyYW1zICpwYXJhbXMsCi0JCQkJaW50IGJhdHRfdGVtcCwKLQkJCQlpbnQgc2h1dGRvd25fc29jLAotCQkJCWludCAqcmV0X29jdl91dikKK3N0YXRpYyBzNjQgZmluZF9vY3ZfY2hhcmdlX2Zvcl9zb2Moc3RydWN0IHFwbnBfYm1zX2NoaXAgKmNoaXAsCisJCQkJc3RydWN0IHNvY19wYXJhbXMgKnBhcmFtcywgaW50IHNvYykKIHsKLQlzNjQgb2N2X2NoYXJnZV91YWg7Ci0JaW50IHBjLCBuZXdfcGM7Ci0JaW50IGJhdHRfdGVtcF9kZWdjID0gYmF0dF90ZW1wIC8gMTA7Ci0JaW50IG9jdl91djsKKwlyZXR1cm4gZGl2X3M2NCgoczY0KXNvYyAqIChwYXJhbXMtPmZjY191YWggLSBwYXJhbXMtPnV1Y191YWgpLAorCQkJMTAwKSArIHBhcmFtcy0+Y2NfdWFoICsgcGFyYW1zLT51dWNfdWFoOworfQogCi0Jb2N2X2NoYXJnZV91YWggPSAoczY0KXNodXRkb3duX3NvYwotCQkJCSogKHBhcmFtcy0+ZmNjX3VhaCAtIHBhcmFtcy0+dXVjX3VhaCk7Ci0Jb2N2X2NoYXJnZV91YWggPSBkaXZfczY0KG9jdl9jaGFyZ2VfdWFoLCAxMDApCi0JCQkJKyBwYXJhbXMtPmNjX3VhaCArIHBhcmFtcy0+dXVjX3VhaDsKK3N0YXRpYyBpbnQgZmluZF9wY19mb3Jfc29jKHN0cnVjdCBxcG5wX2Jtc19jaGlwICpjaGlwLAorCQkJc3RydWN0IHNvY19wYXJhbXMgKnBhcmFtcywgaW50IHNvYykKK3sKKwlpbnQgb2N2X2NoYXJnZV91YWggPSBmaW5kX29jdl9jaGFyZ2VfZm9yX3NvYyhjaGlwLCBwYXJhbXMsIHNvYyk7CisJaW50IHBjOworCiAJcGMgPSBESVZfUk9VTkRfQ0xPU0VTVCgoaW50KW9jdl9jaGFyZ2VfdWFoICogMTAwLCBwYXJhbXMtPmZjY191YWgpOwogCXBjID0gY2xhbXAocGMsIDAsIDEwMCk7CisJcHJfZGVidWcoInNvYyA9ICVkLCBmY2MgPSAlZCB1dWMgPSAlZCByYyA9ICVkIHBjID0gJWRcbiIsCisJCQlzb2MsIHBhcmFtcy0+ZmNjX3VhaCwgcGFyYW1zLT51dWNfdWFoLAorCQkJb2N2X2NoYXJnZV91YWgsIHBjKTsKKwlyZXR1cm4gcGM7Cit9CiAKLQlvY3ZfdXYgPSBpbnRlcnBvbGF0ZV9vY3YoY2hpcC0+cGNfdGVtcF9vY3ZfbHV0LCBiYXR0X3RlbXBfZGVnYywgcGMpOworI2RlZmluZSBTSUdOKHgpICgoeCkgPCAwID8gLTEgOiAxKQorI2RlZmluZSBVVl9QRVJfU1BJTiA1MDAwMAorc3RhdGljIGludCBmaW5kX29jdl9mb3JfcGMoc3RydWN0IHFwbnBfYm1zX2NoaXAgKmNoaXAsIGludCBiYXR0X3RlbXAsIGludCBwYykKK3sKKwlpbnQgbmV3X3BjOworCWludCBiYXR0X3RlbXBfZGVnYyA9IGJhdHRfdGVtcCAvIDEwOworCWludCBvY3ZfbXY7CisJaW50IGRlbHRhX212ID0gNTsKKwlpbnQgbWF4X3NwaW5fY291bnQ7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgc2lnbiwgbmV3X3NpZ247CiAKLQlwcl9kZWJ1Zygic19zb2MgPSAlZCwgZmNjID0gJWQgdXVjID0gJWQgcmMgPSAlZCwgcGMgPSAlZCwgb2N2IG12ID0gJWRcbiIsCi0JCQkJCXNodXRkb3duX3NvYywgcGFyYW1zLT5mY2NfdWFoLAotCQkJCQlwYXJhbXMtPnV1Y191YWgsIChpbnQpb2N2X2NoYXJnZV91YWgsCi0JCQkJCXBjLCBvY3ZfdXYpOwotCW5ld19wYyA9IGludGVycG9sYXRlX3BjKGNoaXAtPnBjX3RlbXBfb2N2X2x1dCwgYmF0dF90ZW1wX2RlZ2MsIG9jdl91dik7Ci0JcHJfZGVidWcoInRlc3QgcmV2bG9va3VwIHBjID0gJWQgZm9yIG9jdiA9ICVkXG4iLCBuZXdfcGMsIG9jdl91dik7CisJb2N2X212ID0gaW50ZXJwb2xhdGVfb2N2KGNoaXAtPnBjX3RlbXBfb2N2X2x1dCwgYmF0dF90ZW1wX2RlZ2MsIHBjKTsKIAotCXdoaWxlIChhYnMobmV3X3BjIC0gcGMpID4gMSkgewotCQlpbnQgZGVsdGFfbXYgPSA1OworCW5ld19wYyA9IGludGVycG9sYXRlX3BjKGNoaXAtPnBjX3RlbXBfb2N2X2x1dCwgYmF0dF90ZW1wX2RlZ2MsIG9jdl9tdik7CisJcHJfZGVidWcoInRlc3QgcmV2bG9va3VwIHBjID0gJWQgZm9yIG9jdiA9ICVkXG4iLCBuZXdfcGMsIG9jdl9tdik7CisJbWF4X3NwaW5fY291bnQgPSAxICsgKGNoaXAtPm1heF92b2x0YWdlX3V2IC0gY2hpcC0+dl9jdXRvZmZfdXYpCisJCQkJCQkvIFVWX1BFUl9TUElOOworCXNpZ24gPSBTSUdOKHBjIC0gbmV3X3BjKTsKIAotCQlpZiAobmV3X3BjID4gcGMpCi0JCQlkZWx0YV9tdiA9IC0xICogZGVsdGFfbXY7CisJd2hpbGUgKGFicyhuZXdfcGMgLSBwYykgIT0gMCAmJiBjb3VudCA8IG1heF9zcGluX2NvdW50KSB7CisJCS8qCisJCSAqIElmIHRoZSBuZXdseSBpbnRlcnBvbGF0ZWQgcGMgaXMgbGFyZ2VyIHRoYW4gdGhlIGxvb2t1cCBwYywKKwkJICogdGhlIG9jdiBzaG91bGQgYmUgcmVkdWNlZCBhbmQgdmljZSB2ZXJzYQorCQkgKi8KKwkJbmV3X3NpZ24gPSBTSUdOKHBjIC0gbmV3X3BjKTsKKwkJLyoKKwkJICogSWYgdGhlIHNpZ24gaGFzIGNoYW5nZWQsIHRoZW4gd2UgaGF2ZSBwYXNzZWQgdGhlIGxvb2t1cCBwYy4KKwkJICogcmVkdWNlIHRoZSBvY3Ygc3RlcCBzaXplIHRvIGdldCBmaW5lciByZXN1bHRzLgorCQkgKgorCQkgKiBJZiB3ZSBoYXZlIGFscmVhZHkgcmVkdWNlZCB0aGUgb2N2IHN0ZXAgc2l6ZSBhbmQgc3RpbGwKKwkJICogcGFzc2VkIHRoZSBsb29rdXAgcGMsIGp1c3Qgc3RvcCBhbmQgdXNlIHRoZSBjdXJyZW50IG9jdi4KKwkJICogVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIGJhdHRlcnlkYXRhIHByb2ZpbGUgaXMKKwkJICogbm9uLW1vbm90b25pYyBhbnl3YXlzLgorCQkgKi8KKwkJaWYgKG5ld19zaWduICE9IHNpZ24pIHsKKwkJCWlmIChkZWx0YV9tdiA+IDEpCisJCQkJZGVsdGFfbXYgPSAxOworCQkJZWxzZQorCQkJCWJyZWFrOworCQl9CisJCXNpZ24gPSBuZXdfc2lnbjsKIAotCQlvY3ZfdXYgPSBvY3ZfdXYgKyBkZWx0YV9tdjsKKwkJb2N2X212ID0gb2N2X212ICsgZGVsdGFfbXYgKiBzaWduOwogCQluZXdfcGMgPSBpbnRlcnBvbGF0ZV9wYyhjaGlwLT5wY190ZW1wX29jdl9sdXQsCi0JCQkJYmF0dF90ZW1wX2RlZ2MsIG9jdl91dik7CisJCQkJYmF0dF90ZW1wX2RlZ2MsIG9jdl9tdik7CiAJCXByX2RlYnVnKCJ0ZXN0IHJldmxvb2t1cCBwYyA9ICVkIGZvciBvY3YgPSAlZFxuIiwKLQkJCQluZXdfcGMsIG9jdl91dik7CisJCQluZXdfcGMsIG9jdl9tdik7CisJCWNvdW50Kys7CiAJfQogCi0JKnJldF9vY3ZfdXYgPSBvY3ZfdXYgKiAxMDAwOwotCXBhcmFtcy0+b2N2X2NoYXJnZV91YWggPSAoaW50KW9jdl9jaGFyZ2VfdWFoOworCXJldHVybiBvY3ZfbXYgKiAxMDAwOwogfQogCiBzdGF0aWMgaW50IGdldF9jdXJyZW50X3RpbWUodW5zaWduZWQgbG9uZyAqbm93X3RtX3NlYykKQEAgLTE3OTgsMTQgKzE4NjEsMTQgQEAKIAkJcmV0dXJuIHJlcG9ydF9jY19iYXNlZF9zb2MoY2hpcCk7CiB9CiAKLSNkZWZpbmUgVkREX01BWF9FUlIJCTUwMDAKLSNkZWZpbmUgVkREX1NURVBfU0laRQkJMTAwMDAKKyNkZWZpbmUgVkREX01BWF9FUlIJCQk1MDAwCisjZGVmaW5lIFZERF9TVEVQX1NJWkUJCQkxMDAwMAorI2RlZmluZSBNQVhfQ09VTlRfQkVGT1JFX1JFU0VUX1RPX0NDCTMKIHN0YXRpYyBpbnQgY2hhcmdpbmdfYWRqdXN0bWVudHMoc3RydWN0IHFwbnBfYm1zX2NoaXAgKmNoaXAsCiAJCQkJc3RydWN0IHNvY19wYXJhbXMgKnBhcmFtcywgaW50IHNvYywKIAkJCQlpbnQgdmJhdF91diwgaW50IGliYXRfdWEsIGludCBiYXR0X3RlbXApCiB7CiAJaW50IGNoZ19zb2MsIHNvY19pYmF0LCBiYXR0X3Rlcm1pbmFsX3V2LCB3ZWlnaHRfaWJhdCwgd2VpZ2h0X2NjOwotCWludCBuZXdfb2N2X3V2OwogCiAJYmF0dF90ZXJtaW5hbF91diA9IHZiYXRfdXYgKyAoaWJhdF91YSAqIGNoaXAtPnJfY29ubl9tb2htKSAvIDEwMDA7CiAKQEAgLTE4MjIsOSArMTg4NSwyOCBAQAogCQl9CiAKIAkJY2hpcC0+cHJldl9iYXR0X3Rlcm1pbmFsX3V2ID0gYmF0dF90ZXJtaW5hbF91djsKKwkJY2hpcC0+c3lzdGVtX2xvYWRfY291bnQgPSAwOworCQlyZXR1cm4gc29jOworCX0gZWxzZSBpZiAoaWJhdF91YSA+IDAgJiYgYmF0dF90ZXJtaW5hbF91dgorCQkJPCBjaGlwLT5tYXhfdm9sdGFnZV91diAtIChWRERfTUFYX0VSUiAqIDIpKSB7CisJCWlmIChjaGlwLT5zeXN0ZW1fbG9hZF9jb3VudCA+IE1BWF9DT1VOVF9CRUZPUkVfUkVTRVRfVE9fQ0MpIHsKKwkJCWNoaXAtPnNvY19hdF9jdiA9IC1FSU5WQUw7CisJCQlwcl9kZWJ1ZygiVmJhdCBiZWxvdyBDViB0aHJlc2hvbGQsIHJlc2V0dGluZyBDQ19UT19DVlxuIik7CisJCQljaGlwLT5zeXN0ZW1fbG9hZF9jb3VudCA9IDA7CisJCX0gZWxzZSB7CisJCQljaGlwLT5zeXN0ZW1fbG9hZF9jb3VudCArPSAxOworCQkJcHJfZGVidWcoIlZiYXQgYmVsb3cgQ1YgdGhyZXNob2xkLCBjb3VudDogJWRcbiIsCisJCQkJCWNoaXAtPnN5c3RlbV9sb2FkX2NvdW50KTsKKwkJfQorCQlyZXR1cm4gc29jOworCX0gZWxzZSBpZiAoaWJhdF91YSA+IDApIHsKKwkJcHJfZGVidWcoIk5PVCBDSEFSR0lORyBTT0MgJWRcbiIsIHNvYyk7CisJCWNoaXAtPnN5c3RlbV9sb2FkX2NvdW50ID0gMDsKKwkJY2hpcC0+cHJldl9jaGdfc29jID0gc29jOwogCQlyZXR1cm4gc29jOwogCX0KIAorCWNoaXAtPnN5c3RlbV9sb2FkX2NvdW50ID0gMDsKIAkvKgogCSAqIGJhdHRlcnkgaXMgaW4gQ1YgcGhhc2UgLSBiZWdpbiBsaW5lYXIgaW50ZXJwb2xhdGlvbiBvZiBzb2MgYmFzZWQgb24KIAkgKiBiYXR0ZXJ5IGNoYXJnZSBjdXJyZW50CkBAIC0xODU5LDkgKzE5NDEsMTAgQEAKIAlpZiAoY2hnX3NvYyA+IGNoaXAtPnByZXZfY2hnX3NvYykgewogCQljaGlwLT5wcmV2X2NoZ19zb2MgPSBjaGdfc29jOwogCi0JCWZpbmRfb2N2X2Zvcl9zb2MoY2hpcCwgcGFyYW1zLCBiYXR0X3RlbXAsIGNoZ19zb2MsICZuZXdfb2N2X3V2KTsKLQkJY2hpcC0+Y2hhcmdpbmdfYWRqdXN0ZWRfb2N2ID0gbmV3X29jdl91djsKLQkJcHJfZGVidWcoIkNDIENIRyBBREogT0NWID0gJWQgQ0hHIFNPQyAlZFxuIiwgbmV3X29jdl91diwKKwkJY2hpcC0+Y2hhcmdpbmdfYWRqdXN0ZWRfb2N2ID0gZmluZF9vY3ZfZm9yX3BjKGNoaXAsIGJhdHRfdGVtcCwKKwkJCQlmaW5kX3BjX2Zvcl9zb2MoY2hpcCwgcGFyYW1zLCBjaGdfc29jKSk7CisJCXByX2RlYnVnKCJDQyBDSEcgQURKIE9DViA9ICVkIENIRyBTT0MgJWRcbiIsCisJCQkJY2hpcC0+Y2hhcmdpbmdfYWRqdXN0ZWRfb2N2LAogCQkJCWNoaXAtPnByZXZfY2hnX3NvYyk7CiAJfQogCkBAIC0xOTUxLDEwICsyMDM0LDEyIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChpYmF0X3VhIDwgMCAmJiAhaXNfYmF0dGVyeV9mdWxsKGNoaXApKSB7CisJaWYgKGlzX2JhdHRlcnlfY2hhcmdpbmcoY2hpcCkpIHsKIAkJc29jID0gY2hhcmdpbmdfYWRqdXN0bWVudHMoY2hpcCwgcGFyYW1zLCBzb2MsIHZiYXRfdXYsIGliYXRfdWEsCiAJCQkJYmF0dF90ZW1wKTsKLQkJZ290byBvdXQ7CisJCS8qIFNraXAgYWRqdXN0bWVudHMgaWYgd2UgYXJlIGluIENWIG9yIGliYXQgaXMgbmVnYXRpdmUgKi8KKwkJaWYgKGNoaXAtPnNvY19hdF9jdiAhPSAtRUlOVkFMIHx8IGliYXRfdWEgPCAwKQorCQkJZ290byBvdXQ7CiAJfQogCiAJLyoKQEAgLTIxNDMsNyArMjIyOCw4IEBACiAJY2NfcmF3XzY0ID0gY29udmVydF9jY191YWhfdG9fcmF3KGNoaXAsIHRhcmdldF9jY191YWgpOwogCWNjX3JhdyA9IGNvbnZlcnRfczY0X3RvX3MzNihjY19yYXdfNjQpOwogCi0JZmluZF9vY3ZfZm9yX3NvYyhjaGlwLCBwYXJhbXMsIGJhdHRfdGVtcCwgdGFyZ2V0X3NvYywgJnRhcmdldF9vY3ZfdXYpOworCXRhcmdldF9vY3ZfdXYgPSBmaW5kX29jdl9mb3JfcGMoY2hpcCwgYmF0dF90ZW1wLAorCQkJCWZpbmRfcGNfZm9yX3NvYyhjaGlwLCBwYXJhbXMsIHRhcmdldF9zb2MpKTsKIAlvY3ZfcmF3ID0gY29udmVydF92YmF0dF91dl90b19yYXcoY2hpcCwgdGFyZ2V0X29jdl91dik7CiAKIAkvKgpAQCAtMjE3Myw4ICsyMjU5LDcgQEAKIAkJCQkJc3RydWN0IHNvY19wYXJhbXMgKnBhcmFtcywKIAkJCQkJaW50IGJhdHRfdGVtcCkKIHsKLQlpbnQgc29jLCBuZXdfb2N2X3V2OwotCWludCByZW1haW5pbmdfdXNhYmxlX2NoYXJnZV91YWg7CisJaW50IHNvYywgcmVtYWluaW5nX3VzYWJsZV9jaGFyZ2VfdWFoOwogCiAJLyogY2FsY3VsYXRlIHJlbWFpbmluZyB1c2FibGUgY2hhcmdlICovCiAJcmVtYWluaW5nX3VzYWJsZV9jaGFyZ2VfdWFoID0gcGFyYW1zLT5vY3ZfY2hhcmdlX3VhaApAQCAtMjE5MSw4ICsyMjc2LDEwIEBACiAJCSAqIGluIGEgYmFkIHNvYy4gQWRqdXN0IG9jdiB0byBnZXQgMCBzb2MKIAkJICovCiAJCXByX2RlYnVnKCJzb2MgaXMgJWQsIGFkanVzdGluZyBwb24gb2N2IHRvIG1ha2UgaXQgMFxuIiwgc29jKTsKLQkJZmluZF9vY3ZfZm9yX3NvYyhjaGlwLCBwYXJhbXMsIGJhdHRfdGVtcCwgMCwgJm5ld19vY3ZfdXYpOwotCQljaGlwLT5sYXN0X29jdl91diA9IG5ld19vY3ZfdXY7CisJCWNoaXAtPmxhc3Rfb2N2X3V2ID0gZmluZF9vY3ZfZm9yX3BjKGNoaXAsIGJhdHRfdGVtcCwKKwkJCQlmaW5kX3BjX2Zvcl9zb2MoY2hpcCwgcGFyYW1zLCAwKSk7CisJCXBhcmFtcy0+b2N2X2NoYXJnZV91YWggPSBmaW5kX29jdl9jaGFyZ2VfZm9yX3NvYyhjaGlwLAorCQkJCXBhcmFtcywgMCk7CiAKIAkJcmVtYWluaW5nX3VzYWJsZV9jaGFyZ2VfdWFoID0gcGFyYW1zLT5vY3ZfY2hhcmdlX3VhaAogCQkJCQktIHBhcmFtcy0+Y2NfdWFoCkBAIC0yMjMwLDcgKzIzMTcsNyBAQAogewogCXN0cnVjdCBzb2NfcGFyYW1zIHBhcmFtczsKIAlpbnQgc29jLCBwcmV2aW91c19zb2MsIHNodXRkb3duX3NvYywgbmV3X2NhbGN1bGF0ZWRfc29jOwotCWludCByZW1haW5pbmdfdXNhYmxlX2NoYXJnZV91YWgsIG5ld19vY3ZfdXY7CisJaW50IHJlbWFpbmluZ191c2FibGVfY2hhcmdlX3VhaDsKIAogCWNhbGN1bGF0ZV9zb2NfcGFyYW1zKGNoaXAsIHJhdywgJnBhcmFtcywgYmF0dF90ZW1wKTsKIAlpZiAoIWlzX2JhdHRlcnlfcHJlc2VudChjaGlwKSkgewpAQCAtMjI2MSw5ICsyMzQ4LDEwIEBACiAJCSAqLwogCQlwcl9kZWJ1Zygic29jID0gJWQgYmVmb3JlIGZvcmNpbmcgc2h1dGRvd25fc29jID0gJWRcbiIsCiAJCQkJCQkJc29jLCBzaHV0ZG93bl9zb2MpOwotCQlmaW5kX29jdl9mb3Jfc29jKGNoaXAsICZwYXJhbXMsIGJhdHRfdGVtcCwKLQkJCQkJc2h1dGRvd25fc29jLCAmbmV3X29jdl91dik7Ci0JCWNoaXAtPmxhc3Rfb2N2X3V2ID0gbmV3X29jdl91djsKKwkJY2hpcC0+bGFzdF9vY3ZfdXYgPSBmaW5kX29jdl9mb3JfcGMoY2hpcCwgYmF0dF90ZW1wLAorCQkJCWZpbmRfcGNfZm9yX3NvYyhjaGlwLCAmcGFyYW1zLCBzaHV0ZG93bl9zb2MpKTsKKwkJcGFyYW1zLm9jdl9jaGFyZ2VfdWFoID0gZmluZF9vY3ZfY2hhcmdlX2Zvcl9zb2MoY2hpcCwKKwkJCQkmcGFyYW1zLCBzaHV0ZG93bl9zb2MpOwogCiAJCXJlbWFpbmluZ191c2FibGVfY2hhcmdlX3VhaCA9IHBhcmFtcy5vY3ZfY2hhcmdlX3VhaAogCQkJCQktIHBhcmFtcy5jY191YWgKQEAgLTI0NjAsMjIgKzI1NDgsMjYgQEAKIAlyZWNhbGN1bGF0ZV9zb2MoY2hpcCk7CiB9CiAKK3N0YXRpYyBpbnQgZ2V0X2NhbGN1bGF0aW9uX2RlbGF5X21zKHN0cnVjdCBxcG5wX2Jtc19jaGlwICpjaGlwKQoreworCWlmICh3YWtlX2xvY2tfYWN0aXZlKCZjaGlwLT5sb3dfdm9sdGFnZV93YWtlX2xvY2spKQorCQlyZXR1cm4gY2hpcC0+bG93X3ZvbHRhZ2VfY2FsY3VsYXRlX3NvY19tczsKKwllbHNlIGlmIChjaGlwLT5jYWxjdWxhdGVkX3NvYyA8IGNoaXAtPmxvd19zb2NfY2FsY190aHJlc2hvbGQpCisJCXJldHVybiBjaGlwLT5sb3dfc29jX2NhbGN1bGF0ZV9zb2NfbXM7CisJZWxzZQorCQlyZXR1cm4gY2hpcC0+Y2FsY3VsYXRlX3NvY19tczsKK30KKwogc3RhdGljIHZvaWQgY2FsY3VsYXRlX3NvY193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgcXBucF9ibXNfY2hpcCAqY2hpcCA9IGNvbnRhaW5lcl9vZih3b3JrLAogCQkJCXN0cnVjdCBxcG5wX2Jtc19jaGlwLAogCQkJCWNhbGN1bGF0ZV9zb2NfZGVsYXllZF93b3JrLndvcmspOwotCWludCBzb2MgPSByZWNhbGN1bGF0ZV9zb2MoY2hpcCk7CiAKLQlpZiAoc29jIDwgY2hpcC0+bG93X3NvY19jYWxjX3RocmVzaG9sZAotCQkJfHwgd2FrZV9sb2NrX2FjdGl2ZSgmY2hpcC0+bG93X3ZvbHRhZ2Vfd2FrZV9sb2NrKSkKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaGlwLT5jYWxjdWxhdGVfc29jX2RlbGF5ZWRfd29yaywKLQkJCXJvdW5kX2ppZmZpZXNfcmVsYXRpdmUobXNlY3NfdG9famlmZmllcwotCQkJKGNoaXAtPmxvd19zb2NfY2FsY3VsYXRlX3NvY19tcykpKTsKLQllbHNlCi0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2hpcC0+Y2FsY3VsYXRlX3NvY19kZWxheWVkX3dvcmssCi0JCQlyb3VuZF9qaWZmaWVzX3JlbGF0aXZlKG1zZWNzX3RvX2ppZmZpZXMKLQkJCShjaGlwLT5jYWxjdWxhdGVfc29jX21zKSkpOworCXJlY2FsY3VsYXRlX3NvYyhjaGlwKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNoaXAtPmNhbGN1bGF0ZV9zb2NfZGVsYXllZF93b3JrLAorCQlyb3VuZF9qaWZmaWVzX3JlbGF0aXZlKG1zZWNzX3RvX2ppZmZpZXMKKwkJKGdldF9jYWxjdWxhdGlvbl9kZWxheV9tcyhjaGlwKSkpKTsKIH0KIAogc3RhdGljIHZvaWQgY29uZmlndXJlX3ZiYXRfbW9uaXRvcl9sb3coc3RydWN0IHFwbnBfYm1zX2NoaXAgKmNoaXApCkBAIC0zMTcxLDEyICszMjYzLDIwIEBACiAKIHN0YXRpYyB2b2lkIGJhdHRlcnlfaW5zZXJ0aW9uX2NoZWNrKHN0cnVjdCBxcG5wX2Jtc19jaGlwICpjaGlwKQogewotCWJvb2wgcHJlc2VudCA9IGlzX2JhdHRlcnlfcHJlc2VudChjaGlwKTsKKwlpbnQgcHJlc2VudCA9IChpbnQpaXNfYmF0dGVyeV9wcmVzZW50KGNoaXApOworCWludCBpbnNlcnRpb25fb2N2X3V2ID0gZ2V0X2JhdHRlcnlfaW5zZXJ0aW9uX29jdl91dihjaGlwKTsKKwlpbnQgaW5zZXJ0aW9uX29jdl90YWtlbiA9IChpbnNlcnRpb25fb2N2X3V2ID4gMCk7CiAKIAltdXRleF9sb2NrKCZjaGlwLT52YmF0X21vbml0b3JfbXV0ZXgpOwotCWlmIChjaGlwLT5iYXR0ZXJ5X3ByZXNlbnQgIT0gcHJlc2VudCkgeworCWlmIChjaGlwLT5iYXR0ZXJ5X3ByZXNlbnQgIT0gcHJlc2VudAorCQkJJiYgKHByZXNlbnQgPT0gaW5zZXJ0aW9uX29jdl90YWtlbgorCQkJCXx8IGNoaXAtPmJhdHRlcnlfcHJlc2VudCA9PSAtRUlOVkFMKSkgeworCQlwcl9kZWJ1Zygic3RhdHVzID0gJWQsIHNoYWRvdyBzdGF0dXMgPSAlZCwgaW5zZXJ0aW9uX29jdl91diA9ICVkXG4iLAorCQkJCXByZXNlbnQsIGNoaXAtPmJhdHRlcnlfcHJlc2VudCwKKwkJCQlpbnNlcnRpb25fb2N2X3V2KTsKIAkJaWYgKGNoaXAtPmJhdHRlcnlfcHJlc2VudCAhPSAtRUlOVkFMKSB7CiAJCQlpZiAocHJlc2VudCkgeworCQkJCWNoaXAtPmluc2VydGlvbl9vY3ZfdXYgPSBpbnNlcnRpb25fb2N2X3V2OwogCQkJCXNldHVwX3ZiYXRfbW9uaXRvcmluZyhjaGlwKTsKIAkJCQljaGlwLT5uZXdfYmF0dGVyeSA9IHRydWU7CiAJCQl9IGVsc2UgewpAQCAtMzYxNyw2ICszNzE3LDggQEAKIAkJCSJsb3ctc29jLWNhbGN1bGF0ZS1zb2MtdGhyZXNob2xkIiwgcmMpOwogCVNQTUlfUFJPUF9SRUFEKGxvd19zb2NfY2FsY3VsYXRlX3NvY19tcywKIAkJCSJsb3ctc29jLWNhbGN1bGF0ZS1zb2MtbXMiLCByYyk7CisJU1BNSV9QUk9QX1JFQUQobG93X3ZvbHRhZ2VfY2FsY3VsYXRlX3NvY19tcywKKwkJCSJsb3ctdm9sdGFnZS1jYWxjdWxhdGUtc29jLW1zIiwgcmMpOwogCVNQTUlfUFJPUF9SRUFEKGNhbGN1bGF0ZV9zb2NfbXMsICJjYWxjdWxhdGUtc29jLW1zIiwgcmMpOwogCVNQTUlfUFJPUF9SRUFEKGhpZ2hfb2N2X2NvcnJlY3Rpb25fbGltaXRfdXYsCiAJCQkiaGlnaC1vY3YtY29ycmVjdGlvbi1saW1pdC11diIsIHJjKTsKQEAgLTQyMjUsMTAgKzQzMjcsNyBAQAogCWlmIChyYykgewogCQlwcl9lcnIoIkNvdWxkIG5vdCByZWFkIGN1cnJlbnQgdGltZTogJWRcbiIsIHJjKTsKIAl9IGVsc2UgewotCQlpZiAoY2hpcC0+Y2FsY3VsYXRlZF9zb2MgPCBjaGlwLT5sb3dfc29jX2NhbGNfdGhyZXNob2xkKQotCQkJc29jX2NhbGNfcGVyaW9kID0gY2hpcC0+bG93X3NvY19jYWxjdWxhdGVfc29jX21zOwotCQllbHNlCi0JCQlzb2NfY2FsY19wZXJpb2QgPSBjaGlwLT5jYWxjdWxhdGVfc29jX21zOworCQlzb2NfY2FsY19wZXJpb2QgPSBnZXRfY2FsY3VsYXRpb25fZGVsYXlfbXMoY2hpcCk7CiAJCXRpbWVfc2luY2VfbGFzdF9yZWNhbGMgPSB0bV9ub3dfc2VjIC0gY2hpcC0+bGFzdF9yZWNhbGNfdGltZTsKIAkJcHJfZGVidWcoIlRpbWUgc2luY2UgbGFzdCByZWNhbGM6ICVsdVxuIiwKIAkJCQl0aW1lX3NpbmNlX2xhc3RfcmVjYWxjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcXBucC1jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3FwbnAtY2hhcmdlci5jCmluZGV4IDY0YWQ5NDAuLmE2NWFjNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvcXBucC1jaGFyZ2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci9xcG5wLWNoYXJnZXIuYwpAQCAtMzI1LDYgKzMyNSw3IEBACiAJdW5zaWduZWQgaW50CQkJd2FybV9iYXRfbXY7CiAJdW5zaWduZWQgaW50CQkJY29vbF9iYXRfbXY7CiAJdW5zaWduZWQgaW50CQkJcmVzdW1lX2RlbHRhX212OworCWludAkJCQlpbnNlcnRpb25fb2N2X3V2OwogCWludAkJCQl0ZXJtX2N1cnJlbnQ7CiAJaW50CQkJCXNvY19yZXN1bWVfbGltaXQ7CiAJYm9vbAkJCQlyZXN1bWluZ19jaGFyZ2luZzsKQEAgLTM1NCw2ICszNTUsNyBAQAogCXN0cnVjdCBkZWxheWVkX3dvcmsJCXVzYmluX2hlYWx0aF9jaGVjazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXNvY19jaGVja193b3JrOwogCXN0cnVjdCBkZWxheWVkX3dvcmsJCWFpY2xfY2hlY2tfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCWluc2VydGlvbl9vY3Zfd29yazsKIAlzdHJ1Y3QgcXBucF9jaGdfcmVndWxhdG9yCW90Z192cmVnOwogCXN0cnVjdCBxcG5wX2NoZ19yZWd1bGF0b3IJYm9vc3RfdnJlZzsKIAlzdHJ1Y3QgcXBucF9jaGdfcmVndWxhdG9yCWJhdGZldF92cmVnOwpAQCAtODY2LDcgKzg2OCw3IEBACiAJfQogCWlmICh2b2x0YWdlID49IFFQTlBfQ0hHX1ZJTk1JTl9ISUdIX01JTl9NVikgewogCQl0ZW1wID0gUVBOUF9DSEdfVklOTUlOX0hJR0hfTUlOX1ZBTDsKLQkJdGVtcCArPSAodm9sdGFnZSAtIFFQTlBfQ0hHX1ZJTk1JTl9NSU5fTVYpCisJCXRlbXAgKz0gKHZvbHRhZ2UgLSBRUE5QX0NIR19WSU5NSU5fSElHSF9NSU5fTVYpCiAJCQkvIFFQTlBfQ0hHX1ZJTk1JTl9TVEVQX0hJR0hfTVY7CiAJfSBlbHNlIHsKIAkJdGVtcCA9IFFQTlBfQ0hHX1ZJTk1JTl9NSU5fVkFMOwpAQCAtODk0LDcgKzg5Niw3IEBACiAKIAlpZiAodmluX21pbiA9PSAwKQogCQl2aW5fbWluX212ID0gUVBOUF9DSEdfSV9NQVhfTUlOXzEwMDsKLQllbHNlIGlmICh2aW5fbWluID4gUVBOUF9DSEdfVklOTUlOX0hJR0hfTUlOX1ZBTCkKKwllbHNlIGlmICh2aW5fbWluID49IFFQTlBfQ0hHX1ZJTk1JTl9ISUdIX01JTl9WQUwpCiAJCXZpbl9taW5fbXYgPSBRUE5QX0NIR19WSU5NSU5fSElHSF9NSU5fTVYgKwogCQkJKHZpbl9taW4gLSBRUE5QX0NIR19WSU5NSU5fSElHSF9NSU5fVkFMKQogCQkJCSogUVBOUF9DSEdfVklOTUlOX1NURVBfSElHSF9NVjsKQEAgLTk2NSw2ICs5NjcsMTEgQEAKIHN0YXRpYyBpbnQKIHFwbnBfY2hnX2NoYXJnZV9lbihzdHJ1Y3QgcXBucF9jaGdfY2hpcCAqY2hpcCwgaW50IGVuYWJsZSkKIHsKKwlpZiAoY2hpcC0+aW5zZXJ0aW9uX29jdl91diA9PSAwICYmIGVuYWJsZSkgeworCQlwcl9kZWJ1ZygiQmF0dGVyeSBub3QgcHJlc2VudCwgc2tpcHBpbmdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJcHJfZGVidWcoImNoYXJnaW5nICVzXG4iLCBlbmFibGUgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKIAlyZXR1cm4gcXBucF9jaGdfbWFza2VkX3dyaXRlKGNoaXAsIGNoaXAtPmNoZ3JfYmFzZSArIENIR1JfQ0hHX0NUUkwsCiAJCQlDSEdSX0NIR19FTiwKIAkJCWVuYWJsZSA/IENIR1JfQ0hHX0VOIDogMCwgMSk7CkBAIC0xNDc2LDYgKzE0ODMsMTIgQEAKIAlwcl9kZWJ1ZygiYmF0dC1wcmVzIHRyaWdnZXJlZDogJWRcbiIsIGJhdHRfcHJlc2VudCk7CiAKIAlpZiAoY2hpcC0+YmF0dF9wcmVzZW50IF4gYmF0dF9wcmVzZW50KSB7CisJCWlmIChiYXR0X3ByZXNlbnQpIHsKKwkJCXNjaGVkdWxlX3dvcmsoJmNoaXAtPmluc2VydGlvbl9vY3Zfd29yayk7CisJCX0gZWxzZSB7CisJCQljaGlwLT5pbnNlcnRpb25fb2N2X3V2ID0gMDsKKwkJCXFwbnBfY2hnX2NoYXJnZV9lbihjaGlwLCAwKTsKKwkJfQogCQljaGlwLT5iYXR0X3ByZXNlbnQgPSBiYXR0X3ByZXNlbnQ7CiAJCXByX2RlYnVnKCJwc3kgY2hhbmdlZCBiYXR0X3BzeVxuIik7CiAJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZjaGlwLT5iYXR0X3BzeSk7CkBAIC0xNTA3LDYgKzE1MjAsOCBAQAogCiAJaWYgKGNoaXAtPmRjX3ByZXNlbnQgXiBkY19wcmVzZW50KSB7CiAJCWNoaXAtPmRjX3ByZXNlbnQgPSBkY19wcmVzZW50OworCQlpZiAocXBucF9jaGdfaXNfb3RnX2VuX3NldChjaGlwKSkKKwkJCXFwbnBfY2hnX2ZvcmNlX3J1bl9vbl9iYXR0KGNoaXAsICFkY19wcmVzZW50ID8gMSA6IDApOwogCQlpZiAoIWRjX3ByZXNlbnQgJiYgIXFwbnBfY2hnX2lzX3VzYl9jaGdfcGx1Z2dlZF9pbihjaGlwKSkgewogCQkJY2hpcC0+ZGVsdGFfdmRkbWF4X212ID0gMDsKIAkJCXFwbnBfY2hnX3NldF9hcHByb3ByaWF0ZV92ZGRtYXgoY2hpcCk7CkBAIC0xNzExLDEwICsxNzI2LDEyIEBACiAJaWYgKHFwbnBfY2hnX2lzX290Z19lbl9zZXQoY2hpcCkpCiAJCXJldHVybiAwOwogCi0JcmMgPSBxcG5wX2NoZ19mb3JjZV9ydW5fb25fYmF0dChjaGlwLCAxKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCJGYWlsZWQgdG8gZGlzYWJsZSBjaGFyZ2luZyByYyA9ICVkXG4iLCByYyk7Ci0JCXJldHVybiByYzsKKwlpZiAoIXFwbnBfY2hnX2lzX2RjX2NoZ19wbHVnZ2VkX2luKGNoaXApKSB7CisJCXJjID0gcXBucF9jaGdfZm9yY2VfcnVuX29uX2JhdHQoY2hpcCwgMSk7CisJCWlmIChyYykgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gZGlzYWJsZSBjaGFyZ2luZyByYyA9ICVkXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KIAl9CiAKIAkvKiBmb3JjZSB1c2Igb3ZwIGZldCBvZmYgKi8KQEAgLTE3NjAsNiArMTc3Nyw3IEBACiAJUE9XRVJfU1VQUExZX1BST1BfV0FSTV9URU1QLAogCVBPV0VSX1NVUFBMWV9QUk9QX1NZU1RFTV9URU1QX0xFVkVMLAogCVBPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfT0NWLAogfTsKIAogc3RhdGljIGNoYXIgKnBtX3Bvd2VyX3N1cHBsaWVkX3RvW10gPSB7CkBAIC0yMTEwLDYgKzIxMjgsOCBAQAogCQlpZiAoY2hpcC0+cHJldl91c2JfbWF4X21hID09IHJldC5pbnR2YWwpCiAJCQlnb3RvIHNraXBfc2V0X2l1c2JfbWF4OwogCisJCWNoaXAtPnByZXZfdXNiX21heF9tYSA9IHJldC5pbnR2YWw7CisKIAkJaWYgKHJldC5pbnR2YWwgPD0gMiAmJiAhY2hpcC0+dXNlX2RlZmF1bHRfYmF0dF92YWx1ZXMgJiYKIAkJCQkJCWdldF9wcm9wX2JhdHRfcHJlc2VudChjaGlwKSkgewogCQkJcXBucF9jaGdfdXNiX3N1c3BlbmRfZW5hYmxlKGNoaXAsIDEpOwpAQCAtMjEzOCw3ICsyMTU4LDYgQEAKIAkJCQlzY2hlZHVsZV93b3JrKCZjaGlwLT5yZWR1Y2VfcG93ZXJfc3RhZ2Vfd29yayk7CiAJCQl9CiAJCX0KLQkJY2hpcC0+cHJldl91c2JfbWF4X21hID0gcmV0LmludHZhbDsKIAl9CiAKIHNraXBfc2V0X2l1c2JfbWF4OgpAQCAtMjE4MCw2ICsyMTk5LDkgQEAKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgogCQl2YWwtPmludHZhbCA9IGdldF9wcm9wX2JhdHRlcnlfdm9sdGFnZV9ub3coY2hpcCk7CiAJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9PQ1Y6CisJCXZhbC0+aW50dmFsID0gY2hpcC0+aW5zZXJ0aW9uX29jdl91djsKKwkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QOgogCQl2YWwtPmludHZhbCA9IGdldF9wcm9wX2JhdHRfdGVtcChjaGlwKTsKIAkJYnJlYWs7CkBAIC0yODg4LDYgKzI5MTAsMzIgQEAKIH0KIAogc3RhdGljIHZvaWQKK3FwbnBfY2hnX2luc2VydGlvbl9vY3Zfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHFwbnBfY2hnX2NoaXAgKmNoaXAgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQlzdHJ1Y3QgcXBucF9jaGdfY2hpcCwgaW5zZXJ0aW9uX29jdl93b3JrKTsKKwl1OCBiYXRfaWZfc3RzID0gMCwgY2hhcmdlX2VuID0gMDsKKwlpbnQgcmM7CisKKwljaGlwLT5pbnNlcnRpb25fb2N2X3V2ID0gZ2V0X3Byb3BfYmF0dGVyeV92b2x0YWdlX25vdyhjaGlwKTsKKworCXJjID0gcXBucF9jaGdfcmVhZChjaGlwLCAmYmF0X2lmX3N0cywgSU5UX1JUX1NUUyhjaGlwLT5iYXRfaWZfYmFzZSksIDEpOworCWlmIChyYykKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVhZCBiYXRfaWYgc3RzICVkXG4iLCByYyk7CisKKwlyYyA9IHFwbnBfY2hnX3JlYWQoY2hpcCwgJmNoYXJnZV9lbiwKKwkJCWNoaXAtPmNoZ3JfYmFzZSArIENIR1JfQ0hHX0NUUkwsIDEpOworCWlmIChyYykKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVhZCBiYXRfaWYgc3RzICVkXG4iLCByYyk7CisKKwlwcl9kZWJ1ZygiYmF0ZmV0IHN0cyA9ICUwMngsIGNoYXJnZV9lbiA9ICUwMnggb2N2ID0gJWRcbiIsCisJCQliYXRfaWZfc3RzLCBjaGFyZ2VfZW4sIGNoaXAtPmluc2VydGlvbl9vY3ZfdXYpOworCXFwbnBfY2hnX2NoYXJnZV9lbihjaGlwLCAhY2hpcC0+Y2hhcmdpbmdfZGlzYWJsZWQpOworCXByX2RlYnVnKCJwc3kgY2hhbmdlZCBiYXR0X3BzeVxuIik7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmNoaXAtPmJhdHRfcHN5KTsKK30KKworc3RhdGljIHZvaWQKIHFwbnBfY2hnX3NvY19jaGVja193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgcXBucF9jaGdfY2hpcCAqY2hpcCA9IGNvbnRhaW5lcl9vZih3b3JrLApAQCAtNDEzNyw2ICs0MTg1LDggQEAKIAltdXRleF9pbml0KCZjaGlwLT5iYXRmZXRfdnJlZ19sb2NrKTsKIAlJTklUX1dPUksoJmNoaXAtPmJhdGZldF9sY2xfd29yaywKIAkJCXFwbnBfY2hnX2JhdGZldF9sY2xfd29yayk7CisJSU5JVF9XT1JLKCZjaGlwLT5pbnNlcnRpb25fb2N2X3dvcmssCisJCQlxcG5wX2NoZ19pbnNlcnRpb25fb2N2X3dvcmspOwogCiAJLyogR2V0IGFsbCBkZXZpY2UgdHJlZSBwcm9wZXJ0aWVzICovCiAJcmMgPSBxcG5wX2NoYXJnZXJfcmVhZF9kdF9wcm9wcyhjaGlwKTsKQEAgLTQzMTcsNiArNDM2Nyw4IEBACiAJZGV2X3NldF9kcnZkYXRhKCZzcG1pLT5kZXYsIGNoaXApOwogCWRldmljZV9pbml0X3dha2V1cCgmc3BtaS0+ZGV2LCAxKTsKIAorCWNoaXAtPmluc2VydGlvbl9vY3ZfdXYgPSAtRUlOVkFMOworCWNoaXAtPmJhdHRfcHJlc2VudCA9IHFwbnBfY2hnX2lzX2JhdHRfcHJlc2VudChjaGlwKTsKIAlpZiAoY2hpcC0+YmF0X2lmX2Jhc2UpIHsKIAkJY2hpcC0+YmF0dF9wc3kubmFtZSA9ICJiYXR0ZXJ5IjsKIAkJY2hpcC0+YmF0dF9wc3kudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfcXNkLmMgYi9kcml2ZXJzL3NwaS9zcGlfcXNkLmMKaW5kZXggNDUxMmQwMi4uNDU0MDBjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpX3FzZC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9xc2QuYwpAQCAtNjUyLDggKzY1Miw2IEBACiAJaWYgKGRkLT5xdXBfdmVyID09IFNQSV9RVVBfVkVSU0lPTl9OT05FKQogCQkvKiBmbGFncyByZW1vdmVkIGZyb20gU1BJX0NPTkZJRyBpbiBRVVAgdmVyc2lvbi0yICovCiAJCW1zbV9zcGlfc2V0X2Jwd19hbmRfbm9faW9fZmxhZ3MoZGQsICZzcGlfY29uZmlnLCBicHctMSk7Ci0JZWxzZSBpZiAoZGQtPm1vZGUgPT0gU1BJX0JBTV9NT0RFKQotCQlzcGlfY29uZmlnIHw9IFNQSV9DRkdfSU5QVVRfRklSU1Q7CiAKIAkvKgogCSAqIEhTX01PREUgaW1wcm92ZXMgc2lnbmFsIHN0YWJpbGl0eSBmb3Igc3BpLWNsayBoaWdoIHJhdGVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwbWkvc3BtaS1kYmdmcy5oIGIvZHJpdmVycy9zcG1pL3NwbWktZGJnZnMuaAppbmRleCAxMGU5OGI5Li5hNDE5MDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwbWkvc3BtaS1kYmdmcy5oCisrKyBiL2RyaXZlcnMvc3BtaS9zcG1pLWRiZ2ZzLmgKQEAgLTE4LDggKzE4LDE0IEBACiBpbnQgc3BtaV9kZnNfYWRkX2NvbnRyb2xsZXIoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCk7CiBpbnQgc3BtaV9kZnNfZGVsX2NvbnRyb2xsZXIoc3RydWN0IHNwbWlfY29udHJvbGxlciAqY3RybCk7CiAjZWxzZQotc3RhdGljIGludCBzcG1pX2Rmc19hZGRfY29udHJvbGxlcihzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW50IHNwbWlfZGZzX2RlbF9jb250cm9sbGVyKHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHNwbWlfZGZzX2FkZF9jb250cm9sbGVyKHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBzcG1pX2Rmc19kZWxfY29udHJvbGxlcihzdHJ1Y3Qgc3BtaV9jb250cm9sbGVyICpjdHJsKQoreworCXJldHVybiAwOworfQogI2VuZGlmCiAKIHN0cnVjdCBkZW50cnkgKnNwbWlfZGZzX2NyZWF0ZV9maWxlKHN0cnVjdCBzcG1pX2NvbnRyb2xsZXIgKmN0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuYyBiL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5jCmluZGV4IDk4YzY4ODQuLjkwZGQxMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5jCkBAIC0xNTMsOCArMTUzLDcgQEAKIAlyZWcgfD0gRFdDM19HQ1RMX0NPUkVTT0ZUUkVTRVQ7CiAJZHdjM193cml0ZWwoZHdjLT5yZWdzLCBEV0MzX0dDVEwsIHJlZyk7CiAKLQlpZiAoZHdjLT5yZXZpc2lvbiA+PSBEV0MzX1JFVklTSU9OXzIzMEEpCi0JCWR3YzNfbm90aWZ5X2V2ZW50KGR3YywgRFdDM19DT05UUk9MTEVSX1JFU0VUX0VWRU5UKTsKKwlkd2MzX25vdGlmeV9ldmVudChkd2MsIERXQzNfQ09OVFJPTExFUl9SRVNFVF9FVkVOVCk7CiAKIAkvKiBBc3NlcnQgVVNCMyBQSFkgcmVzZXQgKi8KIAlyZWcgPSBkd2MzX3JlYWRsKGR3Yy0+cmVncywgRFdDM19HVVNCM1BJUEVDVEwoMCkpOwpAQCAtMTg1LDggKzE4NCw3IEBACiAJcmVnICY9IH5EV0MzX0dDVExfQ09SRVNPRlRSRVNFVDsKIAlkd2MzX3dyaXRlbChkd2MtPnJlZ3MsIERXQzNfR0NUTCwgcmVnKTsKIAotCWlmIChkd2MtPnJldmlzaW9uID49IERXQzNfUkVWSVNJT05fMjMwQSkKLQkJZHdjM19ub3RpZnlfZXZlbnQoZHdjLCBEV0MzX0NPTlRST0xMRVJfUE9TVF9SRVNFVF9FVkVOVCk7CisJZHdjM19ub3RpZnlfZXZlbnQoZHdjLCBEV0MzX0NPTlRST0xMRVJfUE9TVF9SRVNFVF9FVkVOVCk7CiB9CiAKIC8qKgpAQCAtNTAzLDYgKzUwMSw3IEBACiB7CiAJZHdjM19jb3JlX2luaXQoZHdjKTsKIAlkd2MzX2dhZGdldF9yZXN0YXJ0KGR3Yyk7CisJZHdjM19ub3RpZnlfZXZlbnQoZHdjLCBEV0MzX0NPTlRST0xMRVJfUE9TVF9JTklUSUFMSVpBVElPTl9FVkVOVCk7CiB9CiAKIHN0YXRpYyB2b2lkICgqbm90aWZ5X2V2ZW50KSAoc3RydWN0IGR3YzMgKiwgdW5zaWduZWQpOwpAQCAtNjgyLDYgKzY4MSw4IEBACiAJCWdvdG8gZXJyMjsKIAl9CiAKKwlkd2MzX25vdGlmeV9ldmVudChkd2MsIERXQzNfQ09OVFJPTExFUl9QT1NUX0lOSVRJQUxJWkFUSU9OX0VWRU5UKTsKKwogCXJldHVybiAwOwogCiBlcnIyOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9jb3JlLmggYi9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuaAppbmRleCAwNjhkZDVmLi4xYmUyNTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuaAorKysgYi9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuaApAQCAtNjQ5LDYgKzY0OSw3IEBACiAjZGVmaW5lIERXQzNfQ09OVFJPTExFUl9FUlJPUl9FVkVOVAkJCTAKICNkZWZpbmUgRFdDM19DT05UUk9MTEVSX1JFU0VUX0VWRU5UCQkJMQogI2RlZmluZSBEV0MzX0NPTlRST0xMRVJfUE9TVF9SRVNFVF9FVkVOVAkJMgorI2RlZmluZSBEV0MzX0NPTlRST0xMRVJfUE9TVF9JTklUSUFMSVpBVElPTl9FVkVOVAkzCiAvKioKICAqIHN0cnVjdCBkd2MzIC0gcmVwcmVzZW50YXRpb24gb2Ygb3VyIGNvbnRyb2xsZXIKICAqIEBjdHJsX3JlcTogdXNiIGNvbnRyb2wgcmVxdWVzdCB3aGljaCBpcyB1c2VkIGZvciBlcDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1tc20uYyBiL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1tc20uYwppbmRleCA3ODRmZjNmLi41NTRjY2U4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtbXNtLmMKKysrIGIvZHJpdmVycy91c2IvZHdjMy9kd2MzLW1zbS5jCkBAIC0xNTA1LDYgKzE1MDUsOSBAQAogewogCXN0cnVjdCBkd2MzX21zbSAqbWR3YyA9IGRldl9nZXRfZHJ2ZGF0YShkd2MtPmRldi0+cGFyZW50KTsKIAorCWlmIChkd2MtPnJldmlzaW9uIDwgRFdDM19SRVZJU0lPTl8yMzBBKQorCQlyZXR1cm47CisKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBEV0MzX0NPTlRST0xMRVJfRVJST1JfRVZFTlQ6CiAJCWRldl9pbmZvKG1kd2MtPmRldiwgIkRXQzNfQ09OVFJPTExFUl9FUlJPUl9FVkVOVCByZWNlaXZlZFxuIik7CkBAIC0xNTI2LDYgKzE1MjksMTAgQEAKIAkJCQkJRFdDM19DT05UUk9MTEVSX1BPU1RfUkVTRVRfRVZFTlQpOwogCQlkd2MtPnR4X2ZpZm9fc2l6ZSA9IG1kd2MtPnR4X2ZpZm9fc2l6ZTsKIAkJYnJlYWs7CisJY2FzZSBEV0MzX0NPTlRST0xMRVJfUE9TVF9JTklUSUFMSVpBVElPTl9FVkVOVDoKKwkJLyogY2xlYXIgTEFORTBfUFdSX1BSRVNFTlQgYml0IGFmdGVyIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgKi8KKwkJZHdjM19tc21fd3JpdGVfcmVhZGJhY2sobWR3Yy0+YmFzZSwgU1NfUEhZX0NUUkxfUkVHLCAoMSA8PCAyNCksCisJCQkJCQkJCQkweDApOwogCWRlZmF1bHQ6CiAJCWRldl9kYmcobWR3Yy0+ZGV2LCAidW5rbm93biBkd2MzIGV2ZW50XG4iKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMKaW5kZXggZTRmYjI2YS4uN2Q2M2JmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYwpAQCAtMTM1Niw2ICsxMzU2LDE0IEBACiAJCQlpZiAoYyAmJiBjLT5zZXR1cCkKIAkJCQl2YWx1ZSA9IGMtPnNldHVwKGMsIGN0cmwpOwogCQl9CisJCWlmICh2YWx1ZSA9PSBVU0JfR0FER0VUX0RFTEFZRURfU1RBVFVTKSB7CisJCQlEQkcoY2RldiwKKwkJCSAiJXM6IGludGVyZmFjZSAlZCAoJXMpIHJlcXVlc3RlZCBkZWxheWVkIHN0YXR1c1xuIiwKKwkJCQkJX19mdW5jX18sIGludGYsIGYtPm5hbWUpOworCQkJY2Rldi0+ZGVsYXllZF9zdGF0dXMrKzsKKwkJCURCRyhjZGV2LCAiZGVsYXllZF9zdGF0dXMgY291bnQgJWRcbiIsCisJCQkJCWNkZXYtPmRlbGF5ZWRfc3RhdHVzKTsKKwkJfQogCiAJCWdvdG8gZG9uZTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9tYXNzX3N0b3JhZ2UuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX21hc3Nfc3RvcmFnZS5jCmluZGV4IDJmMzUzMTUuLjQ0MTBlOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX21hc3Nfc3RvcmFnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX21hc3Nfc3RvcmFnZS5jCkBAIC02MzcsNyArNjM3LDEwIEBACiAJCSAqLwogCQlEQkcoZnNnLCAiYnVsayByZXNldCByZXF1ZXN0XG4iKTsKIAkJcmFpc2VfZXhjZXB0aW9uKGZzZy0+Y29tbW9uLCBGU0dfU1RBVEVfUkVTRVQpOwotCQlyZXR1cm4gREVMQVlFRF9TVEFUVVM7CisJCWlmIChmc2ctPmNvbW1vbi0+Y2RldikKKwkJCXJldHVybiBVU0JfR0FER0VUX0RFTEFZRURfU1RBVFVTOworCQllbHNlCisJCQlyZXR1cm4gREVMQVlFRF9TVEFUVVM7CiAKIAljYXNlIFVTX0JVTEtfR0VUX01BWF9MVU46CiAJCWlmIChjdHJsLT5iUmVxdWVzdFR5cGUgIT0KQEAgLTI2OTgsOCArMjcwMSwxMyBAQAogCQkJCSAgICAgICAmY29tbW9uLT5mc2ctPmF0b21pY19iaXRmbGFncykpCiAJCQl1c2JfZXBfY2xlYXJfaGFsdChjb21tb24tPmZzZy0+YnVsa19pbik7CiAKLQkJaWYgKGNvbW1vbi0+ZXAwX3JlcV90YWcgPT0gZXhjZXB0aW9uX3JlcV90YWcpCi0JCQllcDBfcXVldWUoY29tbW9uKTsJLyogQ29tcGxldGUgdGhlIHN0YXR1cyBzdGFnZSAqLworCQlpZiAoY29tbW9uLT5lcDBfcmVxX3RhZyA9PSBleGNlcHRpb25fcmVxX3RhZykgeworCQkJLyogQ29tcGxldGUgdGhlIHN0YXR1cyBzdGFnZSAqLworCQkJaWYgKGNvbW1vbi0+Y2RldikKKwkJCQl1c2JfY29tcG9zaXRlX3NldHVwX2NvbnRpbnVlKGNvbW1vbi0+Y2Rldik7CisJCQllbHNlCisJCQkJZXAwX3F1ZXVlKGNvbW1vbik7CisJCX0KIAogCQkvKgogCQkgKiBUZWNobmljYWxseSB0aGlzIHNob3VsZCBnbyBoZXJlLCBidXQgaXQgd291bGQgb25seSBiZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivb3RnL21zbV9vdGcuYyBiL2RyaXZlcnMvdXNiL290Zy9tc21fb3RnLmMKaW5kZXggNGNmNDcwMy4uMjc2YmJiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivb3RnL21zbV9vdGcuYworKysgYi9kcml2ZXJzL3VzYi9vdGcvbXNtX290Zy5jCkBAIC04ODIsNiArODgyLDcgQEAKIAlpZiAobW90Zy0+cGRhdGEtPmRlbGF5X2xwbV9obmRzaGtfb25fZGlzY29ubmVjdCAmJiAhbXNtX2JhbV9scG1fb2soKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAorCW1vdGctPnVpX2VuYWJsZWQgPSAwOwogCWRpc2FibGVfaXJxKG1vdGctPmlycSk7CiAJaG9zdF9idXNfc3VzcGVuZCA9ICF0ZXN0X2JpdChNSEwsICZtb3RnLT5pbnB1dHMpICYmIHBoeS0+b3RnLT5ob3N0ICYmCiAJCSF0ZXN0X2JpdChJRCwgJm1vdGctPmlucHV0cyk7CkBAIC05MTIsNiArOTEzLDcgQEAKIAlpZiAoKHRlc3RfYml0KEJfU0VTU19WTEQsICZtb3RnLT5pbnB1dHMpICYmICFkZXZpY2VfYnVzX3N1c3BlbmQgJiYKIAkJIWRjcCAmJiAhcHJvcF9jaGFyZ2VyICYmICFmbG9hdGVkX2NoYXJnZXIpIHx8CiAJCXRlc3RfYml0KEFfQlVTX1JFUSwgJm1vdGctPmlucHV0cykpIHsKKwkJbW90Zy0+dWlfZW5hYmxlZCA9IDE7CiAJCWVuYWJsZV9pcnEobW90Zy0+aXJxKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC05NjEsNiArOTYzLDcgQEAKIAlpZiAoY250ID49IFBIWV9TVVNQRU5EX1RJTUVPVVRfVVNFQykgewogCQlkZXZfZXJyKHBoeS0+ZGV2LCAiVW5hYmxlIHRvIHN1c3BlbmQgUEhZXG4iKTsKIAkJbXNtX290Z19yZXNldChwaHkpOworCQltb3RnLT51aV9lbmFibGVkID0gMTsKIAkJZW5hYmxlX2lycShtb3RnLT5pcnEpOwogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CkBAIC0xMDc3LDcgKzEwODAsMTIgQEAKIAkvKiBFbmFibGUgQVNZTkMgSVJRIChpZiBwcmVzZW50KSBkdXJpbmcgTFBNICovCiAJaWYgKG1vdGctPmFzeW5jX2lycSkKIAkJZW5hYmxlX2lycShtb3RnLT5hc3luY19pcnEpOwotCWVuYWJsZV9pcnEobW90Zy0+aXJxKTsKKworCS8qIFhPIHNodXRkb3duIGR1cmluZyBpZGxlICwgbm9uIHdha2VhYmxlIGlycXMgbXVzdCBiZSBkaXNhYmxlZCAqLworCWlmIChkZXZpY2VfYnVzX3N1c3BlbmQgfHwgaG9zdF9idXNfc3VzcGVuZCB8fCAhbW90Zy0+YXN5bmNfaXJxKSB7CisJCW1vdGctPnVpX2VuYWJsZWQgPSAxOworCQllbmFibGVfaXJxKG1vdGctPmlycSk7CisJfQogCXdha2VfdW5sb2NrKCZtb3RnLT53bG9jayk7CiAKIAlkZXZfaW5mbyhwaHktPmRldiwgIlVTQiBpbiBsb3cgcG93ZXIgbW9kZVxuIik7CkBAIC0xMTAxLDcgKzExMDksMTAgQEAKIAlpZiAobW90Zy0+cGRhdGEtPmRlbGF5X2xwbV9obmRzaGtfb25fZGlzY29ubmVjdCkKIAkJbXNtX2JhbV9ub3RpZnlfbHBtX3Jlc3VtZSgpOwogCi0JZGlzYWJsZV9pcnEobW90Zy0+aXJxKTsKKwlpZiAobW90Zy0+dWlfZW5hYmxlZCkgeworCQltb3RnLT51aV9lbmFibGVkID0gMDsKKwkJZGlzYWJsZV9pcnEobW90Zy0+aXJxKTsKKwl9CiAJd2FrZV9sb2NrKCZtb3RnLT53bG9jayk7CiAKIAkvKiBTb21lIHBsYXRmb3JtcyByZXF1aXJlIEJVUyB2b3RlIHRvIGVuYWJsZS9kaXNhYmxlIGNsb2NrcyAqLwpAQCAtMTIwNiw2ICsxMjE3LDcgQEAKIAkJZW5hYmxlX2lycShtb3RnLT5hc3luY19pbnQpOwogCQltb3RnLT5hc3luY19pbnQgPSAwOwogCX0KKwltb3RnLT51aV9lbmFibGVkID0gMTsKIAllbmFibGVfaXJxKG1vdGctPmlycSk7CiAKIAkvKiBJZiBBU1lOQyBJUlEgaXMgcHJlc2VudCB0aGVuIGtlZXAgaXQgZW5hYmxlZCBvbmx5IGR1cmluZyBMUE0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvZHNpX2hvc3RfdjIuYyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvZHNpX2hvc3RfdjIuYwppbmRleCA1MjY0MDA1Li5lNDE2YTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL2RzaV9ob3N0X3YyLmMKKysrIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9kc2lfaG9zdF92Mi5jCkBAIC01NDcsNyArNTQ3LDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKIAkJZHNpX2J1Zl9pbml0KHRwKTsKIAkJZHNpX2NtZF9kbWFfYWRkKHRwLCBjbSk7Ci0JCW1zbV9kc2lfY21kX2RtYV90eCh0cCk7CiAJCXJjID0gbXNtX2RzaV9jbWRfZG1hX3R4KHRwKTsKIAkJaWYgKElTX0VSUl9WQUxVRShyYykpIHsKIAkJCXByX2VycigiJXM6IGZhaWxlZCB0byBjYWxsIGNtZF9kbWFfdHhcbiIsIF9fZnVuY19fKTsKQEAgLTU5MSw2ICs1OTAsMTcgQEAKIHsKIAlpbnQgY250LCBsZW4sIGRpZmYsIHBrdF9zaXplLCByYyA9IDA7CiAJY2hhciBjbWQ7CisJdW5zaWduZWQgY2hhciAqY3RybF9iYXNlID0gZHNpX2hvc3RfcHJpdmF0ZS0+ZHNpX2Jhc2U7CisJdTMyIGRzaV9jdHJsLCBkYXRhOworCWludCB2aWRlb19tb2RlOworCisJLyogdHVybiBvbiBjbWQgbW9kZSBmb3IgdmlkZW8gbW9kZSAqLworCWRzaV9jdHJsID0gTUlQSV9JTlAoY3RybF9iYXNlICsgRFNJX0NUUkwpOworCXZpZGVvX21vZGUgPSBkc2lfY3RybCAmIDB4MDI7IC8qIFZJREVPX01PREVfRU4gKi8KKwlpZiAodmlkZW9fbW9kZSkgeworCQlkYXRhID0gZHNpX2N0cmwgfCAweDA0OyAvKiBDTURfTU9ERV9FTiAqLworCQlNSVBJX09VVFAoY3RybF9iYXNlICsgRFNJX0NUUkwsIGRhdGEpOworCX0KIAogCWlmIChwZGF0YS0+cGFuZWxfaW5mby5taXBpLm5vX21heF9wa3Rfc2l6ZSkKIAkJcmxlbiA9IEFMSUdOKHJsZW4sIDQpOyAvKiBPbmx5IHN1cHBvcnQgcmxlbiA9IDQqbiAqLwpAQCAtNjk5LDYgKzcwOSw5IEBACiAJCWJyZWFrOwogCX0KIAorCWlmICh2aWRlb19tb2RlKQorCQlNSVBJX09VVFAoY3RybF9iYXNlICsgRFNJX0NUUkwsCisJCQkJCWRzaV9jdHJsKTsgLyogcmVzdG9yZSAqLwogZW5kOgogCXJldHVybiBycC0+bGVuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHAzLmMgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kcDMuYwppbmRleCA1NTAzN2UzLi42MzhmY2IzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kcDMuYworKysgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kcDMuYwpAQCAtNTg2LDQxICs1ODYsNiBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgcmVnX2R1bXAgewotCWludCBzdGFydF9hZGRyOwotCWludCBudW1fcmVhZHM7Ci19OwotCi1zdHJ1Y3QgcmVnX2R1bXAgcHBwX3JlZ1tdID0gewotCXsweDEwMTA4LCAzfSwKLQl7MHgxMDExOCwgNn0sCi0JezB4MTAxMzgsIDl9LAotCXsweDEwMTU4LCAxfSwKLQl7MHgxMDE2NCwgN30sCi0JezB4MTAxOUMsIDF9LAotCXsweDEwMWI4LCAyfSwKLQl7MHgxMDFjMCwgOH0sCi19OwotCi1zdGF0aWMgaW50IG1kcDNfaW9tbXVfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCi0JCXN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBpb3ZhLCBpbnQgZmxhZ3MsIHZvaWQgKnRva2VuKQotewotCXVuc2lnbmVkIGludCBhZGRyLCB2YWw7Ci0JaW50IGksIGo7Ci0JcHJfZXJyKCJNRFAgSU9NTVUgcGFnZSBmYXVsdDogaW92YSAweCVseFxuIiwgaW92YSk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHBwX3JlZyk7IGkrKykgewotCQlmb3IgKGogPSAwOyBqIDwgcHBwX3JlZ1tpXS5udW1fcmVhZHM7IGorKykgewotCQkJYWRkciA9IHBwcF9yZWdbaV0uc3RhcnRfYWRkciArIChqKjQpOwotCQkJdmFsID0gTURQM19SRUdfUkVBRChhZGRyKTsKLQkJCXByX2VycigiVE1zZzogQWRkcj0gMHglMDh4LCB2YWw9IDB4JTA4eFxuIiwKLQkJCQkodW5zaWduZWQgaW50KWFkZHIsICh1bnNpZ25lZCBpbnQpdmFsKTsKLQkJfQotCX0KLQlwYW5pYygiUFBQIHBhZ2VmYXVsdCwgc2h1dHRpbmcgZG93biBmb3IgZWFzaWVyIGRlYnVnZ2luZ1xuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLQogaW50IG1kcDNfaW9tbXVfYXR0YWNoKGludCBjb250ZXh0KQogewogCXN0cnVjdCBtZHAzX2lvbW11X2N0eF9tYXAgKmNvbnRleHRfbWFwOwpAQCAtNjk2LDkgKzY2MSw2IEBACiAJCQllbHNlCiAJCQkJcmV0dXJuIFBUUl9FUlIobWRwM19pb21tdV9kb21haW5zW2ldLmRvbWFpbik7CiAJCX0KLQkJaW9tbXVfc2V0X2ZhdWx0X2hhbmRsZXIobWRwM19pb21tdV9kb21haW5zW2ldLmRvbWFpbiwKLQkJCW1kcDNfaW9tbXVfZmF1bHRfaGFuZGxlciwKLQkJCU5VTEwpOwogCX0KIAogCW1kcDNfcmVzLT5kb21haW5zID0gbWRwM19pb21tdV9kb21haW5zOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHAzX2N0cmwuYyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRwM19jdHJsLmMKaW5kZXggOWM5MDliZi4uZTkyZTE3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHAzX2N0cmwuYworKysgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kcDNfY3RybC5jCkBAIC0xMzYzLDcgKzEzNjMsNyBAQAogCWlmICghbWRwM19zZXNzaW9uKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICghbWRwM19zZXNzaW9uLT5zdGF0dXMpIHsKKwlpZiAoIW1kcDNfc2Vzc2lvbi0+c3RhdHVzICYmIGNtZCAhPSBNU01GQl9NRVRBREFUQV9HRVQpIHsKIAkJcHJfZXJyKCJtZHAzX2N0cmxfaW9jdGxfaGFuZGxlciwgZGlzcGxheSBvZmYhXG4iKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kcDNfaHdpby5oIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHAzX2h3aW8uaAppbmRleCA0YWZhMzdjLi45MGVlMzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kcDNfaHdpby5oCisrKyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRwM19od2lvLmgKQEAgLTExMSwxMSArMTExLDExIEBACiAjZGVmaW5lIE1EUDNfUkVHX0RNQV9QX0RDVlNfU1RBVFVTCQkJMHg5MDA4NAogCiAvKkRNQV9TKi8KLSNkZWZpbmUgTURQM19SRUdfRE1BX1NfQ09ORklHCQkJCTB4OTAwMDAKLSNkZWZpbmUgTURQM19SRUdfRE1BX1NfU0laRQkJCQkweDkwMDA0Ci0jZGVmaW5lIE1EUDNfUkVHX0RNQV9TX0lCVUZfQUREUgkJCTB4OTAwMDgKLSNkZWZpbmUgTURQM19SRUdfRE1BX1NfSUJVRl9ZX1NUUklERQkJCTB4OTAwMEMKLSNkZWZpbmUgTURQM19SRUdfRE1BX1NfT1VUX1hZCQkJCTB4OTAwMTAKKyNkZWZpbmUgTURQM19SRUdfRE1BX1NfQ09ORklHCQkJCTB4QTAwMDAKKyNkZWZpbmUgTURQM19SRUdfRE1BX1NfU0laRQkJCQkweEEwMDA0CisjZGVmaW5lIE1EUDNfUkVHX0RNQV9TX0lCVUZfQUREUgkJCTB4QTAwMDgKKyNkZWZpbmUgTURQM19SRUdfRE1BX1NfSUJVRl9ZX1NUUklERQkJCTB4QTAwMEMKKyNkZWZpbmUgTURQM19SRUdfRE1BX1NfT1VUX1hZCQkJCTB4QTAwMTAKIAogLyppbnRlcmZhY2UqLwogI2RlZmluZSBNRFAzX1JFR19MQ0RDX0VOCQkJCTB4RTAwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRwM19wcHAuYyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRwM19wcHAuYwppbmRleCA4ZjYxNjhhLi5kMTZjYjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kcDNfcHBwLmMKKysrIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHAzX3BwcC5jCkBAIC01MDIsNyArNTAyLDYgQEAKIAogCXNyY193ID0gcmVxLT5zcmNfcmVjdC53OwogCWRzdF9oID0gYmxpdF9vcC0+ZHN0LnJvaS5oZWlnaHQ7Ci0JcHJfZXJyKCJUTXNnOiBJbiB3b3JrYXJvdW5kLiBzcmN3PSAlZCwgZHN0SD0lZFxuIiwgc3JjX3csIGRzdF9oKTsKIAkvKiBiZyB0aWxlIGZldGNoaW5nIEhXIHdvcmthcm91bmQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgKHJlcS0+ZHN0X3JlY3QuaCAvIDE2KTsgaSsrKSB7CiAJCS8qIHRoaXMgdGlsZSBzaXplICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3MuaCBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzcy5oCmluZGV4IDU4NTc2MDYuLjYxYzRhY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzcy5oCisrKyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzcy5oCkBAIC0yOCw2ICsyOCw4IEBACiAjZGVmaW5lIE1EU1NfUkVHX1dSSVRFKGFkZHIsIHZhbCkgd3JpdGVsX3JlbGF4ZWQodmFsLCBtZHNzX3Jlcy0+bWRwX2Jhc2UgKyBhZGRyKQogI2RlZmluZSBNRFNTX1JFR19SRUFEKGFkZHIpIHJlYWRsX3JlbGF4ZWQobWRzc19yZXMtPm1kcF9iYXNlICsgYWRkcikKIAorI2RlZmluZSBNQVhfRFJWX1NVUF9NTUJfQkxLUwk0NAorCiBlbnVtIG1kc3NfbWRwX2Nsa190eXBlIHsKIAlNRFNTX0NMS19BSEIsCiAJTURTU19DTEtfQVhJLApAQCAtMTEzLDYgKzExNSw5IEBACiAJdTMyIG52aWdfcGlwZXM7CiAJdTMyIG5yZ2JfcGlwZXM7CiAJdTMyIG5kbWFfcGlwZXM7CisKKwlERUNMQVJFX0JJVE1BUChtbWJfYWxsb2NfbWFwLCBNQVhfRFJWX1NVUF9NTUJfQkxLUyk7CisKIAlzdHJ1Y3QgbWRzc19tZHBfbWl4ZXIgKm1peGVyX2ludGY7CiAJc3RydWN0IG1kc3NfbWRwX21peGVyICptaXhlcl93YjsKIAl1MzIgbm1peGVyc19pbnRmOwpAQCAtMTYwLDYgKzE2NSw3IEBACiB2b2lkIG1kc3NfZW5hYmxlX2lycShzdHJ1Y3QgbWRzc19odyAqaHcpOwogdm9pZCBtZHNzX2Rpc2FibGVfaXJxKHN0cnVjdCBtZHNzX2h3ICpodyk7CiB2b2lkIG1kc3NfZGlzYWJsZV9pcnFfbm9zeW5jKHN0cnVjdCBtZHNzX2h3ICpodyk7Cit2b2lkIG1kc3NfYnVzX2JhbmR3aWR0aF9jdHJsKGludCBlbmFibGUpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpb25fY2xpZW50ICptZHNzX2dldF9pb25jbGllbnQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19kc2kuaCBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19kc2kuaAppbmRleCA2OTUzZDhiLi4xM2RhZDA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfZHNpLmgKKysrIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX2RzaS5oCkBAIC0yNjYsOCArMjY2LDYgQEAKIAogI2RlZmluZSBDTURfUkVRX01BWCAgICAgNAogCi10eXBlZGVmIHZvaWQgKCpmeG4pKHUzMiBkYXRhKTsKLQogI2RlZmluZSBDTURfUkVRX1JYICAgICAgMHgwMDAxCiAjZGVmaW5lIENNRF9SRVFfQ09NTUlUICAweDAwMDIKICNkZWZpbmUgQ01EX0NMS19DVFJMICAgIDB4MDAwNApAQCAtMjc4LDcgKzI3Niw4IEBACiAJaW50IGNtZHNfY250OwogCXUzMiBmbGFnczsKIAlpbnQgcmxlbjsgICAgICAgLyogcnggbGVuZ3RoICovCi0JZnhuIGNiOworCWNoYXIgKnJidWY7CS8qIHJ4IGJ1ZiAqLworCXZvaWQgKCpjYikoaW50IGRhdGEpOwogfTsKIAogc3RydWN0IGRjc19jbWRfbGlzdCB7CkBAIC0zMjAsNiArMzE5LDcgQEAKIAl1bnNpZ25lZCBjaGFyICpjdHJsX2Jhc2U7CiAJaW50IHJlZ19zaXplOwogCXUzMiBjbGtfY250OworCXN0cnVjdCBjbGsgKm1kcF9jb3JlX2NsazsKIAlzdHJ1Y3QgY2xrICphaGJfY2xrOwogCXN0cnVjdCBjbGsgKmF4aV9jbGs7CiAJc3RydWN0IGNsayAqYnl0ZV9jbGs7CkBAIC0zODIsNyArMzgyLDcgQEAKIAkJc3RydWN0IGRzaV9jbWRfZGVzYyAqY21kcywgaW50IGNudCk7CiAKIGludCBtZHNzX2RzaV9jbWRzX3J4KHN0cnVjdCBtZHNzX2RzaV9jdHJsX3BkYXRhICpjdHJsLAotCQkJc3RydWN0IGRzaV9jbWRfZGVzYyAqY21kcywgaW50IHJsZW4sIHUzMiByeF9mbGFncyk7CisJCQlzdHJ1Y3QgZHNpX2NtZF9kZXNjICpjbWRzLCBpbnQgcmxlbik7CiAKIHZvaWQgbWRzc19kc2lfaG9zdF9pbml0KHN0cnVjdCBtaXBpX3BhbmVsX2luZm8gKnBpbmZvLAogCQkJCXN0cnVjdCBtZHNzX3BhbmVsX2RhdGEgKnBkYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19kc2lfaG9zdC5jIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX2RzaV9ob3N0LmMKaW5kZXggODQ1ZWYxMC4uYmIyODE4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX2RzaV9ob3N0LmMKKysrIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX2RzaV9ob3N0LmMKQEAgLTc2MCwxNyArNzYwLDEwIEBACiAKIHN0YXRpYyBpbnQgbWRzc19kc2lfbG9uZ19yZWFkX3Jlc3Aoc3RydWN0IGRzaV9idWYgKnJwKQogewotCXNob3J0IGxlbjsKLQotCWxlbiA9IHJwLT5kYXRhWzJdOwotCWxlbiA8PD0gODsKLQlsZW4gfD0gcnAtPmRhdGFbMV07CiAJLyogc3RyaXAgb3V0IGRjcyBoZWFkZXIgKi8KIAlycC0+ZGF0YSArPSA0OwogCXJwLT5sZW4gLT0gNDsKLQkvKiBzdHJpcCBvdXQgMiBieXRlcyBvZiBjaGVja3N1bSAqLwotCXJwLT5sZW4gLT0gMjsKLQlyZXR1cm4gbGVuOworCXJldHVybiBycC0+bGVuOwogfQogCiB2b2lkIG1kc3NfZHNpX2NtZF90ZXN0X3BhdHRlcm4oc3RydWN0IG1kc3NfcGFuZWxfZGF0YSAqcGRhdGEpCkBAIC0xMjU0LDcgKzEyNDcsOCBAQAogCQltZHNzX2RzaV9idWZfcmVzZXJ2ZSh0cCwgbGVuKTsKIAkJbGVuID0gbWRzc19kc2lfY21kX2RtYV9hZGQodHAsIGNtKTsKIAkJaWYgKCFsZW4pIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBjYWxsIGNtZF9kbWFfYWRkXG4iLCBfX2Z1bmNfXyk7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWRkIGNtZCA9IDB4JXhcbiIsCisJCQkJX19mdW5jX18sICBjbS0+cGF5bG9hZFswXSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQl0b3QgKz0gbGVuOwpAQCAtMTM1NywyNCArMTM1MSwyNSBAQAogfTsKIAogLyoKLSAqIERTSSBwYW5lbCByZXBseSB3aXRoICBNQVhfUkVUVVJOX1BBQ0tFVF9TSVpFIGJ5dGVzIG9mIGRhdGEKLSAqIHBsdXMgRENTIGhlYWRlciwgRUNDIGFuZCBDUkMgZm9yIERDUyBsb25nIHJlYWQgcmVzcG9uc2UKLSAqIG1kc3NfZHNpX2NvbnRyb2xsZXIgb25seSBoYXZlIDR4MzIgYml0cyByZWdpc3RlciAoIDE2IGJ5dGVzKSB0bwotICogaG9sZCBkYXRhIHBlciB0cmFuc2FjdGlvbi4KLSAqIE1JUElfRFNJX0xFTiBlcXVhbCB0byA4Ci0gKiBsZW4gc2hvdWxkIGJlIGVpdGhlciA0IG9yIDgKLSAqIGFueSByZXR1cm4gZGF0YSBtb3JlIHRoYW4gTUlQSV9EU0lfTEVOIG5lZWQgdG8gYmUgYnJlYWsgZG93bgotICogdG8gbXVsdGlwbGUgdHJhbnNhY3Rpb25zLgorICogbWRzc19kc2lfY21kc19yeCgpIC0gZGNzIHJlYWQgZnJvbSBwYW5lbAorICogQGN0cmw6IGRzaSBjb250cm9sbGVyCisgKiBAY21kczogcmVhZCBjb21tYW5kIGRlc2NyaXB0b3IKKyAqIEBsZW46IG51bWJlciBvZiBieXRlcyB0byByZWFkIGJhY2sKICAqCi0gKiBvdl9tdXRleCBuZWVkIHRvIGJlIGFjcXVpcmVkIGJlZm9yZSBjYWxsIHRoaXMgZnVuY3Rpb24uCisgKiBjb250cm9sbGVyIGhhdmUgNCByZWdpc3RlcnMgY2FuIGhvbGQgMTYgYnl0ZXMgb2YgcnhlZCBkYXRhCisgKiBkY3MgcGFja2V0OiA0IGJ5dGVzIGhlYWRlciArIHBheWxvYWQgKyAyIGJ5dGVzIGNyYworICogMiBwYWRkaW5nIGJ5dGVzIGFkZCB0byBwYXlsb2FkIHRvIGhhdmUgcGF5bG9hZCBsZW5ndGggaXMgbXV0aXBsZWQgYnkgNAorICogMXN0IHJlYWQ6IDQgYnl0ZXMgaGVhZGVyICsgOCBieXRlcyBwYXlsb2FkICsgMiBwYWRkaW5nICsgMiBjcmMKKyAqIDJuZCByZWFkOiAxMiBieXRlcyBwYXlsb2FkICsgMiBwYWRkaW5nICsgMiBjcmMKKyAqIDNyZCByZWFkOiAxMiBieXRlcyBwYXlsb2FkICsgMiBwYWRkaW5nICsgMiBjcmMKKyAqCiAgKi8KLQogaW50IG1kc3NfZHNpX2NtZHNfcngoc3RydWN0IG1kc3NfZHNpX2N0cmxfcGRhdGEgKmN0cmwsCi0JCQlzdHJ1Y3QgZHNpX2NtZF9kZXNjICpjbWRzLCBpbnQgcmxlbiwgdTMyIHJ4X2ZsYWdzKQorCQkJc3RydWN0IGRzaV9jbWRfZGVzYyAqY21kcywgaW50IHJsZW4pCiB7Ci0JaW50IGNudCwgbGVuLCBkaWZmLCBwa3Rfc2l6ZSwgcmV0ID0gMDsKKwlpbnQgZGF0YV9ieXRlLCByeF9ieXRlLCBkbGVuLCBlbmQ7CisJaW50IHNob3J0X3Jlc3BvbnNlLCBkaWZmLCBwa3Rfc2l6ZSwgcmV0ID0gMDsKIAlzdHJ1Y3QgZHNpX2J1ZiAqdHAsICpycDsKLQlpbnQgbm9fbWF4X3BrdF9zaXplOwogCWNoYXIgY21kOwogCXUzMiBkc2lfY3RybCwgZGF0YTsKIAlpbnQgdmlkZW9fbW9kZTsKQEAgLTE0MTYsMTA5ICsxNDExLDEwOSBAQAogCQlNSVBJX09VVFAoKGN0cmwtPmN0cmxfYmFzZSkgKyAweDAwMDQsIGRhdGEpOwogCX0KIAotCW5vX21heF9wa3Rfc2l6ZSA9IHJ4X2ZsYWdzICYgQ01EX1JFUV9OT19NQVhfUEtUX1NJWkU7Ci0JaWYgKG5vX21heF9wa3Rfc2l6ZSkKLQkJcmxlbiA9IEFMSUdOKHJsZW4sIDQpOyAvKiBPbmx5IHN1cHBvcnQgcmxlbiA9IDQqbiAqLwotCi0JbGVuID0gcmxlbjsKLQlkaWZmID0gMDsKLQotCWlmIChsZW4gPD0gMikKLQkJY250ID0gNDsJLyogc2hvcnQgcmVhZCAqLwotCWVsc2UgewotCQlpZiAobGVuID4gTURTU19EU0lfTEVOKQotCQkJbGVuID0gTURTU19EU0lfTEVOOwkvKiA4IGJ5dGVzIGF0IG1vc3QgKi8KLQotCQlsZW4gPSBBTElHTihsZW4sIDQpOyAvKiBsZW4gNCBieXRlcyBhbGlnbiAqLwotCQlkaWZmID0gbGVuIC0gcmxlbjsKKwlpZiAocmxlbiA9PSAwKSB7CisJCXNob3J0X3Jlc3BvbnNlID0gMTsKKwkJcnhfYnl0ZSA9IDQ7CisJfSBlbHNlIHsKKwkJc2hvcnRfcmVzcG9uc2UgPSAwOworCQlkYXRhX2J5dGUgPSA4OwkvKiBmaXJzdCByZWFkICovCiAJCS8qCi0JCSAqIGFkZCBleHRyYSAyIGJ5dGVzIHRvIGxlbiB0byBoYXZlIG92ZXJhbGwKKwkJICogYWRkIGV4dHJhIDIgcGFkZGluZyBieXRlcyB0byBoYXZlIG92ZXJhbGwKIAkJICogcGFja2V0IHNpemUgaXMgbXVsdGlwZSBieSA0LiBUaGlzIGFsc28gbWFrZQogCQkgKiBzdXJlIDQgYnl0ZXMgZGNzIGhlYWRlcmxvY2F0ZXMgd2l0aGluIGEKIAkJICogMzIgYml0cyByZWdpc3RlciBhZnRlciBzaGlmdCBpbi4KLQkJICogYWZ0ZXIgYWxsLCBsZW4gc2hvdWxkIGJlIGVpdGhlciA2IG9yIDEwLgogCQkgKi8KLQkJbGVuICs9IDI7Ci0JCWNudCA9IGxlbiArIDY7IC8qIDQgYnl0ZXMgaGVhZGVyICsgMiBieXRlcyBjcmMgKi8KKwkJcGt0X3NpemUgPSBkYXRhX2J5dGUgKyAyOworCQlyeF9ieXRlID0gZGF0YV9ieXRlICsgODsgLyogNCBoZWFkZXIgKyAyIGNyYyAgKyAyIHBhZGRpbmcqLwogCX0KIAorCiAJdHAgPSAmY3RybC0+dHhfYnVmOwogCXJwID0gJmN0cmwtPnJ4X2J1ZjsKIAotCWlmICghbm9fbWF4X3BrdF9zaXplKSB7Ci0JCS8qIHBhY2tldCBzaXplIG5lZWQgdG8gYmUgc2V0IGF0IGV2ZXJ5IHJlYWQgKi8KLQkJcGt0X3NpemUgPSBsZW47Ci0JCW1heF9wa3RzaXplWzBdID0gcGt0X3NpemU7CisJZW5kID0gMDsKKwltZHNzX2RzaV9idWZfaW5pdChycCk7CisJd2hpbGUgKCFlbmQpIHsKKwkJcHJfZGVidWcoIiVzOiAgcmxlbj0lZCBwa3Rfc2l6ZT0lZCByeF9ieXRlPSVkXG4iLAorCQkJCV9fZnVuY19fLCBybGVuLCBwa3Rfc2l6ZSwgcnhfYnl0ZSk7CisJCSBpZiAoIXNob3J0X3Jlc3BvbnNlKSB7CisJCQltYXhfcGt0c2l6ZVswXSA9IHBrdF9zaXplOworCQkJbWRzc19kc2lfYnVmX2luaXQodHApOworCQkJcmV0ID0gbWRzc19kc2lfY21kX2RtYV9hZGQodHAsICZwa3Rfc2l6ZV9jbWQpOworCQkJaWYgKCFyZXQpIHsKKwkJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWRkIG1heF9wa3Rfc2l6ZVxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJCXJwLT5sZW4gPSAwOworCQkJCWdvdG8gZW5kOworCQkJfQorCisJCQltZHNzX2RzaV93YWl0NHZpZGVvX2VuZ19idXN5KGN0cmwpOworCisJCQltZHNzX2RzaV9lbmFibGVfaXJxKGN0cmwsIERTSV9DTURfVEVSTSk7CisJCQlyZXQgPSBtZHNzX2RzaV9jbWRfZG1hX3R4KGN0cmwsIHRwKTsKKwkJCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQkJCW1kc3NfZHNpX2Rpc2FibGVfaXJxKGN0cmwsIERTSV9DTURfVEVSTSk7CisJCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHR4IG1heF9wa3Rfc2l6ZVxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJCXJwLT5sZW4gPSAwOworCQkJCWdvdG8gZW5kOworCQkJfQorCQkJcHJfZGVidWcoIiVzOiBtYXhfcGt0X3NpemU9JWQgc2VudFxuIiwKKwkJCQkJCV9fZnVuY19fLCBwa3Rfc2l6ZSk7CisJCX0KKwogCQltZHNzX2RzaV9idWZfaW5pdCh0cCk7Ci0JCXJldCA9IG1kc3NfZHNpX2NtZF9kbWFfYWRkKHRwLCAmcGt0X3NpemVfY21kKTsKKwkJcmV0ID0gbWRzc19kc2lfY21kX2RtYV9hZGQodHAsIGNtZHMpOwogCQlpZiAoIXJldCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGNhbGxcbiIsCi0JCQkJX19mdW5jX18pOworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFkZCBjbWQgPSAweCV4XG4iLAorCQkJCV9fZnVuY19fLCAgY21kcy0+cGF5bG9hZFswXSk7CiAJCQlycC0+bGVuID0gMDsKIAkJCWdvdG8gZW5kOwogCQl9CiAKLQkJbWRzc19kc2lfd2FpdDR2aWRlb19lbmdfYnVzeShjdHJsKTsKLQorCQltZHNzX2RzaV93YWl0NHZpZGVvX2VuZ19idXN5KGN0cmwpOwkvKiB2aWRlbyBtb2RlIG9ubHkgKi8KIAkJbWRzc19kc2lfZW5hYmxlX2lycShjdHJsLCBEU0lfQ01EX1RFUk0pOworCQkvKiB0cmFuc21pdCByZWFkIGNvbWFtbmQgdG8gY2xpZW50ICovCiAJCXJldCA9IG1kc3NfZHNpX2NtZF9kbWFfdHgoY3RybCwgdHApOwogCQlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKIAkJCW1kc3NfZHNpX2Rpc2FibGVfaXJxKGN0cmwsIERTSV9DTURfVEVSTSk7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gY2FsbFxuIiwKLQkJCQlfX2Z1bmNfXyk7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gdHggY21kID0gMHgleFxuIiwKKwkJCQlfX2Z1bmNfXywgIGNtZHMtPnBheWxvYWRbMF0pOwogCQkJcnAtPmxlbiA9IDA7CiAJCQlnb3RvIGVuZDsKIAkJfQotCQlwcl9kZWJ1ZygiJXM6IE1heCBwYWNrZXQgc2l6ZSBzZW50XG4iLCBfX2Z1bmNfXyk7Ci0JfQotCW1kc3NfZHNpX2J1Zl9pbml0KHRwKTsKLQlyZXQgPSBtZHNzX2RzaV9jbWRfZG1hX2FkZCh0cCwgY21kcyk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGNhbGwgY21kX2RtYV9hZGQgZm9yIGNtZCA9IDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgIGNtZHMtPnBheWxvYWRbMF0pOwotCQlycC0+bGVuID0gMDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JbWRzc19kc2lfd2FpdDR2aWRlb19lbmdfYnVzeShjdHJsKTsKLQotCW1kc3NfZHNpX2VuYWJsZV9pcnEoY3RybCwgRFNJX0NNRF9URVJNKTsKLQkvKiB0cmFuc21pdCByZWFkIGNvbWFtbmQgdG8gY2xpZW50ICovCi0JcmV0ID0gbWRzc19kc2lfY21kX2RtYV90eChjdHJsLCB0cCk7Ci0JaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7Ci0JCW1kc3NfZHNpX2Rpc2FibGVfaXJxKGN0cmwsIERTSV9DTURfVEVSTSk7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byBjYWxsXG4iLAotCQkJX19mdW5jX18pOwotCQlycC0+bGVuID0gMDsKLQkJZ290byBlbmQ7Ci0JfQotCS8qCi0JICogb25jZSBjbWRfZG1hX2RvbmUgaW50ZXJydXB0IHJlY2VpdmVkLAotCSAqIHJldHVybiBkYXRhIGZyb20gY2xpZW50IGlzIHJlYWR5IGFuZCBzdG9yZWQKLQkgKiBhdCBSREJLX0RBVEEgcmVnaXN0ZXIgYWxyZWFkeQotCSAqLwotCW1kc3NfZHNpX2J1Zl9pbml0KHJwKTsKLQlpZiAobm9fbWF4X3BrdF9zaXplKSB7CiAJCS8qCi0JCSAqIGV4cGVjdCBybGVuID0gbiAqIDQKLQkJICogc2hvcnQgYWxpZ25lbWVudCBmb3Igc3RhcnQgYWRkcgorCQkgKiBvbmNlIGNtZF9kbWFfZG9uZSBpbnRlcnJ1cHQgcmVjZWl2ZWQsCisJCSAqIHJldHVybiBkYXRhIGZyb20gY2xpZW50IGlzIHJlYWR5IGFuZCBzdG9yZWQKKwkJICogYXQgUkRCS19EQVRBIHJlZ2lzdGVyIGFscmVhZHkKKwkJICogc2luY2UgcnggZmlmbyBpcyAxNiBieXRlcywgZGNzIGhlYWRlciBpcyBrZXB0IGF0IGZpcnN0IGxvb3AsCisJCSAqIGFmdGVyIHRoYXQgZGNzIGhlYWRlciBsb3N0IGR1cmluZyBzaGlmdCBpbnRvIHJlZ2lzdGVycwogCQkgKi8KLQkJcnAtPmRhdGEgKz0gMjsKKwkJZGxlbiA9IG1kc3NfZHNpX2NtZF9kbWFfcngoY3RybCwgcnAsIHJ4X2J5dGUpOworCisJCWlmIChzaG9ydF9yZXNwb25zZSkKKwkJCWJyZWFrOworCisJCWlmIChybGVuIDw9IGRhdGFfYnl0ZSkgeworCQkJZGlmZiA9IGRhdGFfYnl0ZSAtIHJsZW47CisJCQllbmQgPSAxOworCQl9IGVsc2UgeworCQkJZGlmZiA9IDA7CisJCQlybGVuIC09IGRhdGFfYnl0ZTsKKwkJfQorCisJCWRsZW4gLT0gMjsgLyogMiBwYWRkaW5nIGJ5dGVzICovCisJCWRsZW4gLT0gMjsgLyogMiBjcmMgKi8KKwkJZGxlbiAtPSBkaWZmOworCQlycC0+ZGF0YSArPSBkbGVuOwkvKiBuZXh0IHN0YXJ0IHBvc2l0aW9uICovCisJCXJwLT5sZW4gKz0gZGxlbjsKKwkJZGF0YV9ieXRlID0gMTI7CS8qIE5PVCBmaXJzdCByZWFkICovCisJCXBrdF9zaXplICs9IGRhdGFfYnl0ZTsKKwkJcHJfZGVidWcoIiVzOiBycCBkYXRhPSV4IGxlbj0lZCBkbGVuPSVkIGRpZmY9JWRcbiIsCisJCQlfX2Z1bmNfXywgKGludClycC0+ZGF0YSwgcnAtPmxlbiwgZGxlbiwgZGlmZik7CiAJfQogCi0JbWRzc19kc2lfY21kX2RtYV9yeChjdHJsLCBycCwgY250KTsKLQotCWlmIChub19tYXhfcGt0X3NpemUpIHsKLQkJLyoKLQkJICogcmVtb3ZlIGV4dHJhIDIgYnl0ZXMgZnJvbSBwcmV2aW91cwotCQkgKiByeCB0cmFuc2FjdGlvbiBhdCBzaGlmdCByZWdpc3RlcgotCQkgKiB3aGljaCB3YXMgaW5zZXJ0ZWQgZHVyaW5nIGNvcHkKLQkJICogc2hpZnQgcmVnaXN0ZXJzIHRvIHJ4IGJ1ZmZlcgotCQkgKiByeCBwYXlsb2FkIHN0YXJ0IGZyb20gbG9uZyBhbGlnbm1lbnQgYWRkcgotCQkgKi8KLQkJcnAtPmRhdGEgKz0gMjsKLQl9Ci0KKwlycC0+ZGF0YSA9IHJwLT5zdGFydDsJLyogbW92ZSBiYWNrIHRvIHN0YXJ0IHBvc2l0aW9uICovCiAJY21kID0gcnAtPmRhdGFbMF07CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIERUWVBFX0FDS19FUlJfUkVTUDoKQEAgLTE1MzUsOCArMTUzMCw2IEBACiAJY2FzZSBEVFlQRV9HRU5fTFJFQURfUkVTUDoKIAljYXNlIERUWVBFX0RDU19MUkVBRF9SRVNQOgogCQltZHNzX2RzaV9sb25nX3JlYWRfcmVzcChycCk7Ci0JCXJwLT5sZW4gLT0gMjsgLyogZXh0cmEgMiBieXRlcyBhZGRlZCAqLwotCQlycC0+bGVuIC09IGRpZmY7IC8qIGFsaWduIGJ5dGVzICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByX3dhcm5pbmcoIiVzOkludmFsaWQgcmVzcG9uc2UgY21kXG4iLCBfX2Z1bmNfXyk7CkBAIC0xNjE4LDE0ICsxNjExLDE0IEBACiB9CiAKIHN0YXRpYyBpbnQgbWRzc19kc2lfY21kX2RtYV9yeChzdHJ1Y3QgbWRzc19kc2lfY3RybF9wZGF0YSAqY3RybCwKLQkJCXN0cnVjdCBkc2lfYnVmICpycCwgaW50IHJsZW4pCisJCQlzdHJ1Y3QgZHNpX2J1ZiAqcnAsIGludCByeF9ieXRlKQogCiB7CiAJdTMyICpscCwgZGF0YTsKIAlpbnQgaSwgb2ZmLCBjbnQ7CiAKIAlscCA9ICh1MzIgKilycC0+ZGF0YTsKLQljbnQgPSBybGVuOworCWNudCA9IHJ4X2J5dGU7CiAJY250ICs9IDM7CiAJY250ID4+PSAyOwogCkBAIC0xNjQxLDkgKzE2MzQsOSBAQAogCQlwcl9kZWJ1ZygiJXM6IGRhdGEgPSAweCV4IGFuZCBudG9obChkYXRhKSA9IDB4JXhcbiIsCiAJCQkJCSBfX2Z1bmNfXywgZGF0YSwgbnRvaGwoZGF0YSkpOwogCQlvZmYgLT0gNDsKLQkJcnAtPmxlbiArPSBzaXplb2YoKmxwKTsKIAl9Ci0JcmV0dXJuIHJsZW47CisKKwlyZXR1cm4gcnhfYnl0ZTsKIH0KIAogCkBAIC0xNzM2LDE3ICsxNzI5LDE5IEBACiB2b2lkIG1kc3NfZHNpX2NtZGxpc3Rfcngoc3RydWN0IG1kc3NfZHNpX2N0cmxfcGRhdGEgKmN0cmwsCiAJCQkJc3RydWN0IGRjc19jbWRfcmVxICpyZXEpCiB7Ci0JaW50IGxlbjsKLQl1MzIgZGF0YSwgKmRwOwogCXN0cnVjdCBkc2lfYnVmICpycDsKKwlpbnQgbGVuID0gMDsKIAotCWxlbiA9IG1kc3NfZHNpX2NtZHNfcngoY3RybCwgcmVxLT5jbWRzLCByZXEtPnJsZW4sIHJlcS0+ZmxhZ3MpOwotCXJwID0gJmN0cmwtPnJ4X2J1ZjsKLQlkcCA9ICh1MzIgKilycC0+ZGF0YTsKLQlkYXRhID0gKmRwOworCWlmIChyZXEtPnJidWYpIHsKKwkJcnAgPSAmY3RybC0+cnhfYnVmOworCQlsZW4gPSBtZHNzX2RzaV9jbWRzX3J4KGN0cmwsIHJlcS0+Y21kcywgcmVxLT5ybGVuKTsKKwkJbWVtY3B5KHJlcS0+cmJ1ZiwgcnAtPmRhdGEsIHJwLT5sZW4pOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IE5vIHJ4IGJ1ZmZlciBwcm92aWRlZFxuIiwgX19mdW5jX18pOworCX0KIAogCWlmIChyZXEtPmNiKQotCQlyZXEtPmNiKGRhdGEpOworCQlyZXEtPmNiKGxlbik7CiB9CiAKIHZvaWQgbWRzc19kc2lfY21kbGlzdF9jb21taXQoc3RydWN0IG1kc3NfZHNpX2N0cmxfcGRhdGEgKmN0cmwsIGludCBmcm9tX21kcCkKQEAgLTE3NjQsNiArMTc1OSwxNCBAQAogCWlmIChyZXEgPT0gTlVMTCkKIAkJZ290byBuZWVkX2xvY2s7CiAKKwkvKgorCSAqIG1kc3MgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBpbiBtZHAgY29yZSBjbG9jayBkb21haW4KKwkgKiBtZHAgY2xvY2sgbmVlZCB0byBiZSBlbmFibGVkIHRvIHJlY2VpdmUgZHNpIGludGVycnVwdAorCSAqIGFsc28sIGF4aSBidXMgYmFuZHdpZHRoIG5lZWQgc2luY2UgZHNpIGNvbnRyb2xsZXIgd2lsbAorCSAqIGZldGNoIGRjcyBjb21tYW5kcyBmcm9tIGF4aSBidXMKKwkgKi8KKwltZHNzX2J1c19iYW5kd2lkdGhfY3RybCgxKTsKKwogCXByX2RlYnVnKCIlczogIGZyb21fbWRwPSVkIHBpZD0lZFxuIiwgX19mdW5jX18sIGZyb21fbWRwLCBjdXJyZW50LT5waWQpOwogCW1kc3NfZHNpX2Nsa19jdHJsKGN0cmwsIDEpOwogCkBAIC0xNzczLDYgKzE3NzYsNyBAQAogCQltZHNzX2RzaV9jbWRsaXN0X3R4KGN0cmwsIHJlcSk7CiAKIAltZHNzX2RzaV9jbGtfY3RybChjdHJsLCAwKTsKKwltZHNzX2J1c19iYW5kd2lkdGhfY3RybCgwKTsKIAogbmVlZF9sb2NrOgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfZHNpX3BhbmVsLmMgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfZHNpX3BhbmVsLmMKaW5kZXggMzMxMDllMS4uOTkzMjE4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX2RzaV9wYW5lbC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19kc2lfcGFuZWwuYwpAQCAtMTA2LDggKzEwNiw4IEBACiAJZGNzX2NtZAogfTsKIAotdTMyIG1kc3NfZHNpX2Rjc19yZWFkKHN0cnVjdCBtZHNzX2RzaV9jdHJsX3BkYXRhICpjdHJsLAotCQkJY2hhciBjbWQwLCBjaGFyIGNtZDEpCit1MzIgbWRzc19kc2lfcGFuZWxfY21kX3JlYWQoc3RydWN0IG1kc3NfZHNpX2N0cmxfcGRhdGEgKmN0cmwsIGNoYXIgY21kMCwKKwkJY2hhciBjbWQxLCB2b2lkICgqZnhuKShpbnQpLCBjaGFyICpyYnVmLCBpbnQgbGVuKQogewogCXN0cnVjdCBkY3NfY21kX3JlcSBjbWRyZXE7CiAKQEAgLTExNyw4ICsxMTcsOSBAQAogCWNtZHJlcS5jbWRzID0gJmRjc19yZWFkX2NtZDsKIAljbWRyZXEuY21kc19jbnQgPSAxOwogCWNtZHJlcS5mbGFncyA9IENNRF9SRVFfUlggfCBDTURfUkVRX0NPTU1JVDsKLQljbWRyZXEucmxlbiA9IDE7Ci0JY21kcmVxLmNiID0gTlVMTDsgLyogY2FsbCBiYWNrICovCisJY21kcmVxLnJsZW4gPSBsZW47CisJY21kcmVxLnJidWYgPSByYnVmOworCWNtZHJlcS5jYiA9IGZ4bjsgLyogY2FsbCBiYWNrICovCiAJbWRzc19kc2lfY21kbGlzdF9wdXQoY3RybCwgJmNtZHJlcSk7CiAJLyoKIAkgKiBibG9ja2VkIGhlcmUsIHVudGlsIGNhbGwgYmFjayBjYWxsZWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19lZHAuYyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19lZHAuYwppbmRleCA2NGNhYWY1Li4wNDI0OTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfZWRwLmMKKysrIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX2VkcC5jCkBAIC0xNjQsNDYgKzE2NCwzMyBAQAogCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGVkcF9kcnYtPnBkZXYtPmRldi5vZl9ub2RlLAogCQkJInFjb20scGFuZWwtcHdtLXBlcmlvZCIsICZlZHBfZHJ2LT5wd21fcGVyaW9kKTsKIAlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHBhbmVsIHB3bSBwZXJpb2QgaXMgbm90IHNwZWNpZmllZCwgJWQiLCBfX2Z1bmNfXywKKwkJcHJfd2FybigiJXM6IHBhbmVsIHB3bSBwZXJpb2QgaXMgbm90IHNwZWNpZmllZCwgJWQiLCBfX2Z1bmNfXywKIAkJCQllZHBfZHJ2LT5wd21fcGVyaW9kKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWVkcF9kcnYtPnB3bV9wZXJpb2QgPSAtRUlOVkFMOwogCX0KIAogCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGVkcF9kcnYtPnBkZXYtPmRldi5vZl9ub2RlLAogCQkJInFjb20scGFuZWwtbHBnLWNoYW5uZWwiLCAmZWRwX2Rydi0+bHBnX2NoYW5uZWwpOwogCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogcGFuZWwgbHBnIGNoYW5uZWwgaXMgbm90IHNwZWNpZmllZCwgJWQiLCBfX2Z1bmNfXywKKwkJcHJfd2FybigiJXM6IHBhbmVsIGxwZyBjaGFubmVsIGlzIG5vdCBzcGVjaWZpZWQsICVkIiwgX19mdW5jX18sCiAJCQkJZWRwX2Rydi0+bHBnX2NoYW5uZWwpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZWRwX2Rydi0+bHBnX2NoYW5uZWwgPSAtRUlOVkFMOwogCX0KIAotCWVkcF9kcnYtPmJsX3B3bSA9IHB3bV9yZXF1ZXN0KGVkcF9kcnYtPmxwZ19jaGFubmVsLCAibGNkLWJhY2tsaWdodCIpOwotCWlmIChlZHBfZHJ2LT5ibF9wd20gPT0gTlVMTCB8fCBJU19FUlIoZWRwX2Rydi0+YmxfcHdtKSkgewotCQlwcl9lcnIoIiVzOiBwd20gcmVxdWVzdCBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJaWYgKGVkcF9kcnYtPnB3bV9wZXJpb2QgIT0gLUVJTlZBTCAmJgorCQllZHBfZHJ2LT5scGdfY2hhbm5lbCAhPSAtRUlOVkFMKSB7CisJCWVkcF9kcnYtPmJsX3B3bSA9IHB3bV9yZXF1ZXN0KGVkcF9kcnYtPmxwZ19jaGFubmVsLAorCQkJCSJsY2QtYmFja2xpZ2h0Iik7CisJCWlmIChlZHBfZHJ2LT5ibF9wd20gPT0gTlVMTCB8fCBJU19FUlIoZWRwX2Rydi0+YmxfcHdtKSkgeworCQkJcHJfZXJyKCIlczogcHdtIHJlcXVlc3QgZmFpbGVkIiwgX19mdW5jX18pOworCQkJZWRwX2Rydi0+YmxfcHdtID0gTlVMTDsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfSBlbHNlIHsKIAkJZWRwX2Rydi0+YmxfcHdtID0gTlVMTDsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JZWRwX2Rydi0+Z3Bpb19wYW5lbF9wd20gPSBvZl9nZXRfbmFtZWRfZ3BpbyhlZHBfZHJ2LT5wZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJncGlvLXBhbmVsLXB3bSIsIDApOwotCWlmICghZ3Bpb19pc192YWxpZChlZHBfZHJ2LT5ncGlvX3BhbmVsX3B3bSkpIHsKLQkJcHJfZXJyKCIlczogZ3Bpb19wYW5lbF9wd209JWQgbm90IHNwZWNpZmllZFxuIiwgX19mdW5jX18sCi0JCQkJZWRwX2Rydi0+Z3Bpb19wYW5lbF9wd20pOwotCQlnb3RvIGVkcF9mcmVlX3B3bTsKLQl9Ci0KLQlyZXQgPSBncGlvX3JlcXVlc3QoZWRwX2Rydi0+Z3Bpb19wYW5lbF9wd20sICJkaXNwX3B3bSIpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogUmVxdWVzdCByZXNldCBncGlvX3BhbmVsX3B3bSBmYWlsZWQsIHJldD0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBlZHBfZnJlZV9wd207CiAJfQogCiAJcmV0dXJuIDA7Ci0KLWVkcF9mcmVlX3B3bToKLQlwd21fZnJlZShlZHBfZHJ2LT5ibF9wd20pOwotCXJldHVybiAtRU5PREVWOwogfQogCiB2b2lkIG1kc3NfZWRwX3NldF9iYWNrbGlnaHQoc3RydWN0IG1kc3NfcGFuZWxfZGF0YSAqcGRhdGEsIHUzMiBibF9sZXZlbCkKQEAgLTIxOCwyNyArMjA1LDI2IEBACiAJCXJldHVybjsKIAl9CiAKLQlibF9tYXggPSBlZHBfZHJ2LT5wYW5lbF9kYXRhLnBhbmVsX2luZm8uYmxfbWF4OwotCWlmIChibF9sZXZlbCA+IGJsX21heCkKLQkJYmxfbGV2ZWwgPSBibF9tYXg7CisJaWYgKGVkcF9kcnYtPmJsX3B3bSAhPSBOVUxMKSB7CisJCWJsX21heCA9IGVkcF9kcnYtPnBhbmVsX2RhdGEucGFuZWxfaW5mby5ibF9tYXg7CisJCWlmIChibF9sZXZlbCA+IGJsX21heCkKKwkJCWJsX2xldmVsID0gYmxfbWF4OwogCi0JaWYgKGVkcF9kcnYtPmJsX3B3bSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGVkcF9kcnYtPmJsX3B3bT1OVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQorCQlyZXQgPSBwd21fY29uZmlnKGVkcF9kcnYtPmJsX3B3bSwKKwkJCQlibF9sZXZlbCAqIGVkcF9kcnYtPnB3bV9wZXJpb2QgLyBibF9tYXgsCisJCQkJZWRwX2Rydi0+cHdtX3BlcmlvZCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiJXM6IHB3bV9jb25maWcoKSBmYWlsZWQgZXJyPSVkLlxuIiwgX19mdW5jX18sCisJCQkJCXJldCk7CisJCQlyZXR1cm47CisJCX0KIAotCXJldCA9IHB3bV9jb25maWcoZWRwX2Rydi0+YmxfcHdtLAotCQkJYmxfbGV2ZWwgKiBlZHBfZHJ2LT5wd21fcGVyaW9kIC8gYmxfbWF4LAotCQkJZWRwX2Rydi0+cHdtX3BlcmlvZCk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBwd21fY29uZmlnKCkgZmFpbGVkIGVycj0lZC5cbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXR1cm47Ci0JfQotCi0JcmV0ID0gcHdtX2VuYWJsZShlZHBfZHJ2LT5ibF9wd20pOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogcHdtX2VuYWJsZSgpIGZhaWxlZCBlcnI9JWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXR1cm47CisJCXJldCA9IHB3bV9lbmFibGUoZWRwX2Rydi0+YmxfcHdtKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogcHdtX2VuYWJsZSgpIGZhaWxlZCBlcnI9JWRcbiIsIF9fZnVuY19fLAorCQkJCQlyZXQpOworCQkJcmV0dXJuOworCQl9CiAJfQogfQogCkBAIC0zNzgsNyArMzY0LDggQEAKIAltZHNzX2VkcF9pcnFfZGlzYWJsZShlZHBfZHJ2KTsKIAogCWdwaW9fc2V0X3ZhbHVlKGVkcF9kcnYtPmdwaW9fcGFuZWxfZW4sIDApOwotCXB3bV9kaXNhYmxlKGVkcF9kcnYtPmJsX3B3bSk7CisJaWYgKGVkcF9kcnYtPmJsX3B3bSAhPSBOVUxMKQorCQlwd21fZGlzYWJsZShlZHBfZHJ2LT5ibF9wd20pOwogCW1kc3NfZWRwX2VuYWJsZShlZHBfZHJ2LT5iYXNlLCAwKTsKIAltZHNzX2VkcF91bmNvbmZpZ19jbGsoZWRwX2Rydi0+YmFzZSwgZWRwX2Rydi0+bW1zc19jY19iYXNlKTsKIAltZHNzX2VkcF9lbmFibGVfbWFpbmxpbmsoZWRwX2Rydi0+YmFzZSwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfZWRwLmggYi9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfZWRwLmgKaW5kZXggYzNmN2QwZC4uMzNiODk5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX2VkcC5oCisrKyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19lZHAuaApAQCAtMjYxLDcgKzI2MSw2IEBACiAKIAkvKiBncGlvcyAqLwogCWludCBncGlvX3BhbmVsX2VuOwotCWludCBncGlvX3BhbmVsX3B3bTsKIAogCS8qIGJhY2tsaWdodCAqLwogCXN0cnVjdCBwd21fZGV2aWNlICpibF9wd207CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfZmIuYyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19mYi5jCmluZGV4IDRjYTBhM2YuLjEwNWRkMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19mYi5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvc3dfc3luYy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1vcnlfYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAKICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9tZW1vcnkuaD4KQEAgLTc0LDYgKzc1LDcgQEAKIHN0YXRpYyBpbnQgbWRzc19mYl9yZWdpc3RlcihzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkKTsKIHN0YXRpYyBpbnQgbWRzc19mYl9vcGVuKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcik7CiBzdGF0aWMgaW50IG1kc3NfZmJfcmVsZWFzZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpOworc3RhdGljIGludCBtZHNzX2ZiX3JlbGVhc2VfYWxsKHN0cnVjdCBmYl9pbmZvICppbmZvLCBib29sIHJlbGVhc2VfYWxsKTsKIHN0YXRpYyBpbnQgbWRzc19mYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKIAkJCSAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiBzdGF0aWMgaW50IG1kc3NfZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLApAQCAtODYsOCArODgsMTAgQEAKIAkJCSB1bnNpZ25lZCBsb25nIGFyZyk7CiBzdGF0aWMgaW50IG1kc3NfZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogc3RhdGljIHZvaWQgbWRzc19mYl9yZWxlYXNlX2ZlbmNlcyhzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkKTsKK3N0YXRpYyBpbnQgX19tZHNzX2ZiX3N5bmNfYnVmX2RvbmVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpwLAorCQl1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSk7CiAKLXN0YXRpYyB2b2lkIG1kc3NfZmJfY29tbWl0X3dxX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyBpbnQgX19tZHNzX2ZiX2Rpc3BsYXlfdGhyZWFkKHZvaWQgKmRhdGEpOwogc3RhdGljIHZvaWQgbWRzc19mYl9wYW5faWRsZShzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkKTsKIHN0YXRpYyBpbnQgbWRzc19mYl9zZW5kX3BhbmVsX2V2ZW50KHN0cnVjdCBtc21fZmJfZGF0YV90eXBlICptZmQsCiAJCQkJCWludCBldmVudCwgdm9pZCAqYXJnKTsKQEAgLTI5MCwxMCArMjk0LDkgQEAKIHsKIAlzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlmb3IgKDsgbWZkLT5yZWZfY250ID4gMTsgbWZkLT5yZWZfY250LS0pCi0JCXBtX3J1bnRpbWVfcHV0KG1mZC0+ZmJpLT5kZXYpOwotCi0JbWRzc19mYl9yZWxlYXNlKG1mZC0+ZmJpLCAwKTsKKwlsb2NrX2ZiX2luZm8obWZkLT5mYmkpOworCW1kc3NfZmJfcmVsZWFzZV9hbGwobWZkLT5mYmksIHRydWUpOworCXVubG9ja19mYl9pbmZvKG1mZC0+ZmJpKTsKIH0KIAogc3RhdGljIGludCBtZHNzX2ZiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0zODYsMTEgKzM4OSwxMiBAQAogCQlpZiAobWZkLT5tZHBfc3luY19wdF9kYXRhLnRpbWVsaW5lID09IE5VTEwpIHsKIAkJCXByX2VycigiJXM6IGNhbm5vdCBjcmVhdGUgdGltZSBsaW5lIiwgX19mdW5jX18pOwogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0gZWxzZSB7Ci0JCQltZmQtPm1kcF9zeW5jX3B0X2RhdGEudGltZWxpbmVfdmFsdWUgPSAwOwogCQl9CisJCW1mZC0+bWRwX3N5bmNfcHRfZGF0YS5ub3RpZmllci5ub3RpZmllcl9jYWxsID0KKwkJCV9fbWRzc19mYl9zeW5jX2J1Zl9kb25lX2NhbGxiYWNrOwogCX0KLQlpZiAobWZkLT5wYW5lbC50eXBlID09IFdSSVRFQkFDS19QQU5FTCkKKwlpZiAoKG1mZC0+cGFuZWwudHlwZSA9PSBXUklURUJBQ0tfUEFORUwpIHx8CisJCQkobWZkLT5wYW5lbC50eXBlID09IE1JUElfQ01EX1BBTkVMKSkKIAkJbWZkLT5tZHBfc3luY19wdF9kYXRhLnRocmVzaG9sZCA9IDE7CiAJZWxzZQogCQltZmQtPm1kcF9zeW5jX3B0X2RhdGEudGhyZXNob2xkID0gMjsKQEAgLTEwODYsNiArMTA5MCw4IEBACiAJbXV0ZXhfaW5pdCgmbWZkLT51cGRhdGUubG9jayk7CiAJbXV0ZXhfaW5pdCgmbWZkLT5ub191cGRhdGUubG9jayk7CiAJbXV0ZXhfaW5pdCgmbWZkLT5tZHBfc3luY19wdF9kYXRhLnN5bmNfbXV0ZXgpOworCWF0b21pY19zZXQoJm1mZC0+bWRwX3N5bmNfcHRfZGF0YS5jb21taXRfY250LCAwKTsKKwlhdG9taWNfc2V0KCZtZmQtPmNvbW1pdHNfcGVuZGluZywgMCk7CiAKIAlpbml0X3RpbWVyKCZtZmQtPm5vX3VwZGF0ZS50aW1lcik7CiAJbWZkLT5ub191cGRhdGUudGltZXIuZnVuY3Rpb24gPSBtZHNzX2ZiX25vX3VwZGF0ZV9ub3RpZnlfdGltZXJfY2I7CkBAIC0xMDkzLDE1ICsxMDk5LDkgQEAKIAlpbml0X2NvbXBsZXRpb24oJm1mZC0+dXBkYXRlLmNvbXApOwogCWluaXRfY29tcGxldGlvbigmbWZkLT5ub191cGRhdGUuY29tcCk7CiAJaW5pdF9jb21wbGV0aW9uKCZtZmQtPnBvd2VyX29mZl9jb21wKTsKLQlpbml0X2NvbXBsZXRpb24oJm1mZC0+Y29tbWl0X2NvbXApOwogCWluaXRfY29tcGxldGlvbigmbWZkLT5wb3dlcl9zZXRfY29tcCk7Ci0JSU5JVF9XT1JLKCZtZmQtPmNvbW1pdF93b3JrLCBtZHNzX2ZiX2NvbW1pdF93cV9oYW5kbGVyKTsKLQltZmQtPm1zbV9mYl9iYWNrdXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2ZiX2JhY2t1cF90eXBlKSwKLQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKG1mZC0+bXNtX2ZiX2JhY2t1cCA9PSAwKSB7Ci0JCXByX2VycigiZXJyb3I6IG5vdCBlbm91Z2ggbWVtb3J5IVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtZmQtPmNvbW1pdF93YWl0X3EpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1mZC0+aWRsZV93YWl0X3EpOwogCiAJcmV0ID0gZmJfYWxsb2NfY21hcCgmZmJpLT5jbWFwLCAyNTYsIDApOwogCWlmIChyZXQpCkBAIC0xMTE4LDkgKzExMTgsOSBAQAogCQkgICAgIG1mZC0+aW5kZXgsIGZiaS0+dmFyLnhyZXMsIGZiaS0+dmFyLnlyZXMsCiAJCSAgICAgZmJpLT5maXguc21lbV9sZW4pOwogCi0JcmV0ID0gMDsKKwlrdGhyZWFkX3J1bihfX21kc3NfZmJfZGlzcGxheV90aHJlYWQsIG1mZCwgIm1kc3NfZmIlZCIsIG1mZC0+aW5kZXgpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBtZHNzX2ZiX29wZW4oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKQpAQCAtMTE2OCwxMCArMTE2OCwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1kc3NfZmJfcmVsZWFzZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCitzdGF0aWMgaW50IG1kc3NfZmJfcmVsZWFzZV9hbGwoc3RydWN0IGZiX2luZm8gKmluZm8sIGJvb2wgcmVsZWFzZV9hbGwpCiB7CiAJc3RydWN0IG1zbV9mYl9kYXRhX3R5cGUgKm1mZCA9IChzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqKWluZm8tPnBhcjsKLQlzdHJ1Y3QgbWRzc19mYl9wcm9jX2luZm8gKnBpbmZvID0gTlVMTDsKKwlzdHJ1Y3QgbWRzc19mYl9wcm9jX2luZm8gKnBpbmZvID0gTlVMTCwgKnRlbXBfcGluZm8gPSBOVUxMOwogCWludCByZXQgPSAwOwogCWludCBwaWQgPSBjdXJyZW50LT50Z2lkOwogCkBAIC0xMTgxLDI3ICsxMTgxLDI2IEBACiAJfQogCiAJbWRzc19mYl9wYW5faWRsZShtZmQpOwotCW1mZC0+cmVmX2NudC0tOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShwaW5mbywgJm1mZC0+cHJvY19saXN0LCBsaXN0KSB7Ci0JCWlmIChwaW5mby0+cGlkID09IHBpZCkKLQkJCWJyZWFrOwotCX0KKwlwcl9kZWJ1ZygicmVsZWFzZV9hbGwgPSAlc1xuIiwgcmVsZWFzZV9hbGwgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKIAotCWlmICghcGluZm8gfHwgKHBpbmZvLT5waWQgIT0gcGlkKSkgewotCQlwcl93YXJuKCJ1bmFibGUgdG8gZmluZCBwcm9jZXNzIGluZm8gZm9yIGZiJWQgcGlkPSVkXG4iLAotCQkJCW1mZC0+aW5kZXgsIHBpZCk7Ci0JCWlmIChtZmQtPm1kcC5yZWxlYXNlX2ZuYykgewotCQkJcmV0ID0gbWZkLT5tZHAucmVsZWFzZV9mbmMobWZkKTsKLQkJCWlmIChyZXQpCi0JCQkJcHJfZXJyKCJlcnJvciByZWxlYXNpbmcgZmIlZCByZXNvdXJjZXNcbiIsCi0JCQkJCQltZmQtPmluZGV4KTsKLQkJfQotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCJmb3VuZCBwcm9jZXNzIGVudHJ5IHBpZD0lZCByZWY9JWRcbiIsCi0JCQkJcGluZm8tPnBpZCwgcGluZm8tPnJlZl9jbnQpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwaW5mbywgdGVtcF9waW5mbywgJm1mZC0+cHJvY19saXN0LCBsaXN0KSB7CisJCWlmICghcmVsZWFzZV9hbGwgJiYgKHBpbmZvLT5waWQgIT0gcGlkKSkKKwkJCWNvbnRpbnVlOwogCi0JCXBpbmZvLT5yZWZfY250LS07CisJCXByX2RlYnVnKCJmb3VuZCBwcm9jZXNzIGVudHJ5IHBpZD0lZCByZWY9JWRcbiIsIHBpbmZvLT5waWQsCisJCQlwaW5mby0+cmVmX2NudCk7CisKKwkJZG8geworCQkJaWYgKG1mZC0+cmVmX2NudCA8IHBpbmZvLT5yZWZfY250KQorCQkJCXByX3dhcm4oIldBUk46bWZkLT5yZWZfY250IDwgcGluZm8tPnJlZl9jbnRcbiIpOworCQkJZWxzZQorCQkJCW1mZC0+cmVmX2NudC0tOworCisJCQlwaW5mby0+cmVmX2NudC0tOworCQkJcG1fcnVudGltZV9wdXQoaW5mby0+ZGV2KTsKKwkJfSB3aGlsZSAocmVsZWFzZV9hbGwgJiYgcGluZm8tPnJlZl9jbnQpOworCiAJCWlmIChwaW5mby0+cmVmX2NudCA9PSAwKSB7CiAJCQlpZiAobWZkLT5tZHAucmVsZWFzZV9mbmMpIHsKIAkJCQlyZXQgPSBtZmQtPm1kcC5yZWxlYXNlX2ZuYyhtZmQpOwpAQCAtMTIxNiwxNyArMTIxNSwyMiBAQAogCiAJaWYgKCFtZmQtPnJlZl9jbnQpIHsKIAkJcmV0ID0gbWRzc19mYl9ibGFua19zdWIoRkJfQkxBTktfUE9XRVJET1dOLCBpbmZvLAotCQkJCSAgICAgICBtZmQtPm9wX2VuYWJsZSk7CisJCQltZmQtPm9wX2VuYWJsZSk7CiAJCWlmIChyZXQpIHsKLQkJCXByX2VycigiY2FuJ3QgdHVybiBvZmYgZmIlZCEgcmM9JWRcbiIsIG1mZC0+aW5kZXgsIHJldCk7CisJCQlwcl9lcnIoImNhbid0IHR1cm4gb2ZmIGZiJWQhIHJjPSVkXG4iLAorCQkJCW1mZC0+aW5kZXgsIHJldCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCi0JcG1fcnVudGltZV9wdXQoaW5mby0+ZGV2KTsKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IG1kc3NfZmJfcmVsZWFzZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCit7CisJcmV0dXJuIG1kc3NfZmJfcmVsZWFzZV9hbGwoaW5mbywgZmFsc2UpOworfQorCiBzdGF0aWMgdm9pZCBtZHNzX2ZiX3Bvd2VyX3NldHRpbmdfaWRsZShzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkKQogewogCWludCByZXQ7CkBAIC0xMjQ5LDg1ICsxMjUzLDE1NSBAQAogCiB2b2lkIG1kc3NfZmJfd2FpdF9mb3JfZmVuY2Uoc3RydWN0IG1zbV9zeW5jX3B0X2RhdGEgKnN5bmNfcHRfZGF0YSkKIHsKKwlzdHJ1Y3Qgc3luY19mZW5jZSAqZmVuY2VzW01EUF9NQVhfRkVOQ0VfRkRdOworCWludCBmZW5jZV9jbnQ7CiAJaW50IGksIHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IHdhaXQgZm9yIGZlbmNlc1xuIiwgc3luY19wdF9kYXRhLT5mZW5jZV9uYW1lKTsKKworCW11dGV4X2xvY2soJnN5bmNfcHRfZGF0YS0+c3luY19tdXRleCk7CisJLyoKKwkgKiBBc3N1bWluZyB0aGF0IGFjcV9mZW5fY250IGlzIHNhbml0aXplZCBpbiBidWZzeW5jIGlvY3RsCisJICogdG8gY2hlY2sgZm9yIHN5bmNfcHRfZGF0YS0+YWNxX2Zlbl9jbnQpIDw9IE1EUF9NQVhfRkVOQ0VfRkQKKwkgKi8KKwlmZW5jZV9jbnQgPSBzeW5jX3B0X2RhdGEtPmFjcV9mZW5fY250OworCXN5bmNfcHRfZGF0YS0+YWNxX2Zlbl9jbnQgPSAwOworCWlmIChmZW5jZV9jbnQpCisJCW1lbWNweShmZW5jZXMsIHN5bmNfcHRfZGF0YS0+YWNxX2ZlbiwKKwkJCQlmZW5jZV9jbnQgKiBzaXplb2Yoc3RydWN0IHN5bmNfZmVuY2UgKikpOworCW11dGV4X3VubG9jaygmc3luY19wdF9kYXRhLT5zeW5jX211dGV4KTsKKwogCS8qIGJ1ZiBzeW5jICovCi0JZm9yIChpID0gMDsgaSA8IHN5bmNfcHRfZGF0YS0+YWNxX2Zlbl9jbnQ7IGkrKykgewotCQlyZXQgPSBzeW5jX2ZlbmNlX3dhaXQoc3luY19wdF9kYXRhLT5hY3FfZmVuW2ldLAorCWZvciAoaSA9IDA7IGkgPCBmZW5jZV9jbnQgJiYgIXJldDsgaSsrKSB7CisJCXJldCA9IHN5bmNfZmVuY2Vfd2FpdChmZW5jZXNbaV0sCiAJCQkJV0FJVF9GRU5DRV9GSVJTVF9USU1FT1VUKTsKIAkJaWYgKHJldCA9PSAtRVRJTUUpIHsKLQkJCXByX3dhcm4oInN5bmNfZmVuY2Vfd2FpdCB0aW1lZCBvdXQhICIpOworCQkJcHJfd2FybigiJXM6IHN5bmNfZmVuY2Vfd2FpdCB0aW1lZCBvdXQhICIsCisJCQkJCXN5bmNfcHRfZGF0YS0+ZmVuY2VfbmFtZSk7CiAJCQlwcl9jb250KCJXYWl0aW5nICVsZCBtb3JlIHNlY29uZHNcbiIsCiAJCQkJCVdBSVRfRkVOQ0VfRklOQUxfVElNRU9VVC9NU0VDX1BFUl9TRUMpOwotCQkJcmV0ID0gc3luY19mZW5jZV93YWl0KHN5bmNfcHRfZGF0YS0+YWNxX2ZlbltpXSwKKwkJCXJldCA9IHN5bmNfZmVuY2Vfd2FpdChmZW5jZXNbaV0sCiAJCQkJCVdBSVRfRkVOQ0VfRklOQUxfVElNRU9VVCk7CiAJCX0KLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IHN5bmNfZmVuY2Vfd2FpdCBmYWlsZWQhIHJldCA9ICV4XG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJc3luY19mZW5jZV9wdXQoc3luY19wdF9kYXRhLT5hY3FfZmVuW2ldKTsKKwkJc3luY19mZW5jZV9wdXQoZmVuY2VzW2ldKTsKIAl9CiAKIAlpZiAocmV0IDwgMCkgewotCQl3aGlsZSAoaSA8IHN5bmNfcHRfZGF0YS0+YWNxX2Zlbl9jbnQpIHsKLQkJCXN5bmNfZmVuY2VfcHV0KHN5bmNfcHRfZGF0YS0+YWNxX2ZlbltpXSk7Ci0JCQlpKys7Ci0JCX0KKwkJcHJfZXJyKCIlczogc3luY19mZW5jZV93YWl0IGZhaWxlZCEgcmV0ID0gJXhcbiIsCisJCQkJc3luY19wdF9kYXRhLT5mZW5jZV9uYW1lLCByZXQpOworCQlmb3IgKDsgaSA8IGZlbmNlX2NudDsgaSsrKQorCQkJc3luY19mZW5jZV9wdXQoZmVuY2VzW2ldKTsKIAl9Ci0Jc3luY19wdF9kYXRhLT5hY3FfZmVuX2NudCA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIG1kc3NfZmJfc2lnbmFsX3RpbWVsaW5lX2xvY2tlZCgKLQkJCQlzdHJ1Y3QgbXNtX3N5bmNfcHRfZGF0YSAqc3luY19wdF9kYXRhKQotewotCWlmIChzeW5jX3B0X2RhdGEtPnRpbWVsaW5lICYmICFsaXN0X2VtcHR5KChjb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICopCi0JCQkoJihzeW5jX3B0X2RhdGEtPnRpbWVsaW5lLT5vYmouYWN0aXZlX2xpc3RfaGVhZCkpKSkgewotCQlzd19zeW5jX3RpbWVsaW5lX2luYyhzeW5jX3B0X2RhdGEtPnRpbWVsaW5lLCAxKTsKLQkJc3luY19wdF9kYXRhLT50aW1lbGluZV92YWx1ZSsrOwotCX0KLQlzeW5jX3B0X2RhdGEtPmN1cl9yZWxfZmVuY2UgPSAwOwotfQotCisvKioKKyAqIG1kc3NfZmJfc2lnbmFsX3RpbWVsaW5lKCkgLSBzaWduYWwgYSBzaW5nbGUgcmVsZWFzZSBmZW5jZQorICogQHN5bmNfcHRfZGF0YToJU3luYyBwb2ludCBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlIHRpbWVsaW5lIHdoaWNoCisgKgkJCXNob3VsZCBiZSBzaWduYWxlZC4KKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBhZnRlciBhIGZyYW1lIGhhcyBiZWVuIHB1c2hlZCB0byBkaXNwbGF5LiBUaGlzIHNpZ25hbHMgdGhlCisgKiB0aW1lbGluZSB0byByZWxlYXNlIHRoZSBmZW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnJhbWUuCisgKi8KIHZvaWQgbWRzc19mYl9zaWduYWxfdGltZWxpbmUoc3RydWN0IG1zbV9zeW5jX3B0X2RhdGEgKnN5bmNfcHRfZGF0YSkKIHsKIAltdXRleF9sb2NrKCZzeW5jX3B0X2RhdGEtPnN5bmNfbXV0ZXgpOwotCW1kc3NfZmJfc2lnbmFsX3RpbWVsaW5lX2xvY2tlZChzeW5jX3B0X2RhdGEpOworCWlmIChhdG9taWNfYWRkX3VubGVzcygmc3luY19wdF9kYXRhLT5jb21taXRfY250LCAtMSwgMCkgJiYKKwkJCXN5bmNfcHRfZGF0YS0+dGltZWxpbmUpIHsKKwkJc3dfc3luY190aW1lbGluZV9pbmMoc3luY19wdF9kYXRhLT50aW1lbGluZSwgMSk7CisJCXN5bmNfcHRfZGF0YS0+dGltZWxpbmVfdmFsdWUrKzsKKworCQlwcl9kZWJ1ZygiJXM6IGJ1ZmZlciBzaWduYWxlZCEgdGltZWxpbmUgdmFsPSVkIHJlbWFpbmluZz0lZFxuIiwKKwkJCXN5bmNfcHRfZGF0YS0+ZmVuY2VfbmFtZSwgc3luY19wdF9kYXRhLT50aW1lbGluZV92YWx1ZSwKKwkJCWF0b21pY19yZWFkKCZzeW5jX3B0X2RhdGEtPmNvbW1pdF9jbnQpKTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiJXMgdGltZWxpbmUgc2lnbmFsZWQgd2l0aG91dCBjb21taXRzIHZhbD0lZFxuIiwKKwkJCXN5bmNfcHRfZGF0YS0+ZmVuY2VfbmFtZSwgc3luY19wdF9kYXRhLT50aW1lbGluZV92YWx1ZSk7CisJfQogCW11dGV4X3VubG9jaygmc3luY19wdF9kYXRhLT5zeW5jX211dGV4KTsKIH0KIAorLyoqCisgKiBtZHNzX2ZiX3JlbGVhc2VfZmVuY2VzKCkgLSBzaWduYWwgYWxsIHBlbmRpbmcgcmVsZWFzZSBmZW5jZXMKKyAqIEBtZmQ6CUZyYW1lYnVmZmVyIGRhdGEgc3RydWN0dXJlIGZvciBkaXNwbGF5CisgKgorICogUmVsZWFzZSBhbGwgY3VycmVudGx5IHBlbmRpbmcgcmVsZWFzZSBmZW5jZXMsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZSBpbgorICogdGhlIHByb2Nlc3MgdG8gYmUgY29tbWl0ZWQuCisgKgorICogTm90ZTogdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIGNsb3NlIG9yIHN1c3BlbmQgc2VxdWVuY2UuCisgKi8KIHN0YXRpYyB2b2lkIG1kc3NfZmJfcmVsZWFzZV9mZW5jZXMoc3RydWN0IG1zbV9mYl9kYXRhX3R5cGUgKm1mZCkKIHsKKwlzdHJ1Y3QgbXNtX3N5bmNfcHRfZGF0YSAqc3luY19wdF9kYXRhID0gJm1mZC0+bWRwX3N5bmNfcHRfZGF0YTsKKwlpbnQgdmFsOwogCi0JbXV0ZXhfbG9jaygmbWZkLT5tZHBfc3luY19wdF9kYXRhLnN5bmNfbXV0ZXgpOwotCWlmIChtZmQtPm1kcF9zeW5jX3B0X2RhdGEudGltZWxpbmUpIHsKLQkJc3dfc3luY190aW1lbGluZV9pbmMobWZkLT5tZHBfc3luY19wdF9kYXRhLnRpbWVsaW5lLCAyKTsKLQkJbWZkLT5tZHBfc3luY19wdF9kYXRhLnRpbWVsaW5lX3ZhbHVlICs9IDI7CisJbXV0ZXhfbG9jaygmc3luY19wdF9kYXRhLT5zeW5jX211dGV4KTsKKwlpZiAoc3luY19wdF9kYXRhLT50aW1lbGluZSkgeworCQl2YWwgPSBzeW5jX3B0X2RhdGEtPnRocmVzaG9sZCArCisJCQlhdG9taWNfcmVhZCgmc3luY19wdF9kYXRhLT5jb21taXRfY250KTsKKwkJc3dfc3luY190aW1lbGluZV9pbmMoc3luY19wdF9kYXRhLT50aW1lbGluZSwgdmFsKTsKKwkJc3luY19wdF9kYXRhLT50aW1lbGluZV92YWx1ZSArPSB2YWw7CisJCWF0b21pY19zZXQoJnN5bmNfcHRfZGF0YS0+Y29tbWl0X2NudCwgMCk7CiAJfQotCW1mZC0+bWRwX3N5bmNfcHRfZGF0YS5jdXJfcmVsX2ZlbmNlID0gMDsKLQltdXRleF91bmxvY2soJm1mZC0+bWRwX3N5bmNfcHRfZGF0YS5zeW5jX211dGV4KTsKKwltdXRleF91bmxvY2soJnN5bmNfcHRfZGF0YS0+c3luY19tdXRleCk7CiB9CiAKKy8qKgorICogX19tZHNzX2ZiX3N5bmNfYnVmX2RvbmVfY2FsbGJhY2soKSAtIHByb2Nlc3MgYXN5bmMgZGlzcGxheSBldmVudHMKKyAqIEBwOgkJTm90aWZpZXIgYmxvY2sgcmVnaXN0ZXJlZCBmb3IgYXN5bmMgZXZlbnRzLgorICogQGV2ZW50OglFdmVudCBlbnVtIHRvIGlkZW50aWZ5IHRoZSBldmVudC4KKyAqIEBkYXRhOglPcHRpb25hbCBhcmd1bWVudCBwcm92aWRlZCB3aXRoIHRoZSBldmVudC4KKyAqCisgKiBTZWUgZW51bSBtZHBfbm90aWZ5X2V2ZW50IGZvciBldmVudHMgaGFuZGxlZC4KKyAqLworc3RhdGljIGludCBfX21kc3NfZmJfc3luY19idWZfZG9uZV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnAsCisJCXVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1zbV9zeW5jX3B0X2RhdGEgKnN5bmNfcHRfZGF0YTsKKworCXN5bmNfcHRfZGF0YSA9IGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QgbXNtX3N5bmNfcHRfZGF0YSwgbm90aWZpZXIpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTURQX05PVElGWV9GUkFNRV9SRUFEWToKKwkJaWYgKHN5bmNfcHRfZGF0YS0+YXN5bmNfd2FpdF9mZW5jZXMpCisJCQltZHNzX2ZiX3dhaXRfZm9yX2ZlbmNlKHN5bmNfcHRfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTURQX05PVElGWV9GUkFNRV9GTFVTSEVEOgorCQlwcl9kZWJ1ZygiJXM6IGZyYW1lIGZsdXNoZWRcbiIsIHN5bmNfcHRfZGF0YS0+ZmVuY2VfbmFtZSk7CisJCXN5bmNfcHRfZGF0YS0+Zmx1c2hlZCA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgTURQX05PVElGWV9GUkFNRV9USU1FT1VUOgorCQlwcl9lcnIoIiVzOiBmcmFtZSB0aW1lb3V0XG4iLCBzeW5jX3B0X2RhdGEtPmZlbmNlX25hbWUpOworCQltZHNzX2ZiX3NpZ25hbF90aW1lbGluZShzeW5jX3B0X2RhdGEpOworCQlicmVhazsKKwljYXNlIE1EUF9OT1RJRllfRlJBTUVfRE9ORToKKwkJcHJfZGVidWcoIiVzOiBmcmFtZSBkb25lXG4iLCBzeW5jX3B0X2RhdGEtPmZlbmNlX25hbWUpOworCQltZHNzX2ZiX3NpZ25hbF90aW1lbGluZShzeW5jX3B0X2RhdGEpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTk9USUZZX09LOworfQorCisvKioKKyAqIG1kc3NfZmJfcGFuX2lkbGUoKSAtIHdhaXQgZm9yIHBhbmVsIHByb2dyYW1taW5nIHRvIGJlIGlkbGUKKyAqIEBtZmQ6CUZyYW1lYnVmZmVyIGRhdGEgc3RydWN0dXJlIGZvciBkaXNwbGF5CisgKgorICogV2FpdCBmb3IgYW55IHBlbmRpbmcgcHJvZ3JhbW1pbmcgdG8gYmUgZG9uZSBpZiBpbiB0aGUgcHJvY2VzcyBvZiBwcm9ncmFtbWluZworICogaGFyZHdhcmUgY29uZmlndXJhdGlvbi4gQWZ0ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGl0IGlzIHNhZmUgdG8gcGVyZm9ybQorICogc29mdHdhcmUgdXBkYXRlcyBmb3IgbmV4dCBmcmFtZS4KKyAqLwogc3RhdGljIHZvaWQgbWRzc19mYl9wYW5faWRsZShzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkKQogewogCWludCByZXQ7CiAKLQlpZiAobWZkLT5pc19jb21taXR0aW5nKSB7Ci0JCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgKLQkJCQkmbWZkLT5jb21taXRfY29tcCwKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQobWZkLT5pZGxlX3dhaXRfcSwKKwkJCSFhdG9taWNfcmVhZCgmbWZkLT5jb21taXRzX3BlbmRpbmcpLAogCQkJbXNlY3NfdG9famlmZmllcyhXQUlUX0RJU1BfT1BfVElNRU9VVCkpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKLQkJZWxzZSBpZiAoIXJldCkKLQkJCXByX2VycigiJXMgd2FpdCBmb3IgY29tbWl0X2NvbXAgdGltZW91dCAlZCAlZCIsCi0JCQkJX19mdW5jX18sIHJldCwgbWZkLT5pc19jb21taXR0aW5nKTsKLQkJaWYgKHJldCA8PSAwKSB7Ci0JCQltdXRleF9sb2NrKCZtZmQtPm1kcF9zeW5jX3B0X2RhdGEuc3luY19tdXRleCk7Ci0JCQltZHNzX2ZiX3NpZ25hbF90aW1lbGluZV9sb2NrZWQoJm1mZC0+bWRwX3N5bmNfcHRfZGF0YSk7Ci0JCQltZmQtPmlzX2NvbW1pdHRpbmcgPSAwOwotCQkJY29tcGxldGVfYWxsKCZtZmQtPmNvbW1pdF9jb21wKTsKLQkJCW11dGV4X3VubG9jaygmbWZkLT5tZHBfc3luY19wdF9kYXRhLnN5bmNfbXV0ZXgpOwotCQl9CisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCJ3YWl0IGZvciBpZGxlIHRpbWVvdXQgJWQgcGVuZGluZz0lZFxuIiwKKwkJCQlyZXQsIGF0b21pY19yZWFkKCZtZmQtPmNvbW1pdHNfcGVuZGluZykpOworCisJCW1kc3NfZmJfc2lnbmFsX3RpbWVsaW5lKCZtZmQtPm1kcF9zeW5jX3B0X2RhdGEpOwogCX0KIH0KIApAQCAtMTMzNSw3ICsxNDA5LDYgQEAKIAkJc3RydWN0IG1kcF9kaXNwbGF5X2NvbW1pdCAqZGlzcF9jb21taXQpCiB7CiAJc3RydWN0IG1zbV9mYl9kYXRhX3R5cGUgKm1mZCA9IChzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqKWluZm8tPnBhcjsKLQlzdHJ1Y3QgbXNtX2ZiX2JhY2t1cF90eXBlICpmYl9iYWNrdXA7CiAJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmZGlzcF9jb21taXQtPnZhcjsKIAl1MzIgd2FpdF9mb3JfZmluaXNoID0gZGlzcF9jb21taXQtPndhaXRfZm9yX2ZpbmlzaDsKIAlpbnQgcmV0ID0gMDsKQEAgLTEzNjAsMTMgKzE0MzMsMTIgQEAKIAkJaW5mby0+dmFyLnlvZmZzZXQgPQogCQkodmFyLT55b2Zmc2V0IC8gaW5mby0+Zml4LnlwYW5zdGVwKSAqIGluZm8tPmZpeC55cGFuc3RlcDsKIAotCWZiX2JhY2t1cCA9IChzdHJ1Y3QgbXNtX2ZiX2JhY2t1cF90eXBlICopbWZkLT5tc21fZmJfYmFja3VwOwotCW1lbWNweSgmZmJfYmFja3VwLT5pbmZvLCBpbmZvLCBzaXplb2Yoc3RydWN0IGZiX2luZm8pKTsKLQltZW1jcHkoJmZiX2JhY2t1cC0+ZGlzcF9jb21taXQsIGRpc3BfY29tbWl0LAotCQlzaXplb2Yoc3RydWN0IG1kcF9kaXNwbGF5X2NvbW1pdCkpOwotCUlOSVRfQ09NUExFVElPTihtZmQtPmNvbW1pdF9jb21wKTsKLQltZmQtPmlzX2NvbW1pdHRpbmcgPSAxOwotCXNjaGVkdWxlX3dvcmsoJm1mZC0+Y29tbWl0X3dvcmspOworCW1mZC0+bXNtX2ZiX2JhY2t1cC5pbmZvID0gKmluZm87CisJbWZkLT5tc21fZmJfYmFja3VwLmRpc3BfY29tbWl0ID0gKmRpc3BfY29tbWl0OworCisJYXRvbWljX2luYygmbWZkLT5tZHBfc3luY19wdF9kYXRhLmNvbW1pdF9jbnQpOworCWF0b21pY19pbmMoJm1mZC0+Y29tbWl0c19wZW5kaW5nKTsKKwl3YWtlX3VwX2FsbCgmbWZkLT5jb21taXRfd2FpdF9xKTsKIAltdXRleF91bmxvY2soJm1mZC0+bWRwX3N5bmNfcHRfZGF0YS5zeW5jX211dGV4KTsKIAlpZiAod2FpdF9mb3JfZmluaXNoKQogCQltZHNzX2ZiX3Bhbl9pZGxlKG1mZCk7CkBAIC0xNDA1LDE0ICsxNDc3LDEyIEBACiAJCWluZm8tPnZhci55b2Zmc2V0ID0KIAkJKHZhci0+eW9mZnNldCAvIGluZm8tPmZpeC55cGFuc3RlcCkgKiBpbmZvLT5maXgueXBhbnN0ZXA7CiAKLQltZHNzX2ZiX3dhaXRfZm9yX2ZlbmNlKCZtZmQtPm1kcF9zeW5jX3B0X2RhdGEpOwogCWlmIChtZmQtPm1kcC5kbWFfZm5jKQogCQltZmQtPm1kcC5kbWFfZm5jKG1mZCk7CiAJZWxzZQogCQlwcl93YXJuKCJkbWEgZnVuY3Rpb24gbm90IHNldCBmb3IgcGFuZWwgdHlwZT0lZFxuIiwKIAkJCQltZmQtPnBhbmVsLnR5cGUpOwotCW1kc3NfZmJfc2lnbmFsX3RpbWVsaW5lKCZtZmQtPm1kcF9zeW5jX3B0X2RhdGEpOwotCW1kc3NfZmJfdXBkYXRlX2JhY2tsaWdodChtZmQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0MzAsMzUgKzE1MDAsNjkgQEAKIAlwaW5mby0+Y2xrX3JhdGUgPSB2YXItPnBpeGNsb2NrOwogfQogCi1zdGF0aWMgdm9pZCBtZHNzX2ZiX2NvbW1pdF93cV9oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKKy8qKgorICogX19tZHNzX2ZiX3BlcmZvcm1fY29tbWl0KCkgLSBwcm9jZXNzIGEgZnJhbWUgdG8gZGlzcGxheQorICogQG1mZDoJRnJhbWVidWZmZXIgZGF0YSBzdHJ1Y3R1cmUgZm9yIGRpc3BsYXkKKyAqCisgKiBQcm9jZXNzZXMgYWxsIGxheWVycyBhbmQgYnVmZmVycyBwcm9ncmFtbWVkIGFuZCBlbnN1cmVzIGFsbCBwZW5kaW5nIHJlbGVhc2UKKyAqIGZlbmNlcyBhcmUgc2lnbmFsZWQgb25jZSB0aGUgYnVmZmVyIGlzIHRyYW5zZmVyZWQgdG8gZGlzcGxheS4KKyAqLworc3RhdGljIGludCBfX21kc3NfZmJfcGVyZm9ybV9jb21taXQoc3RydWN0IG1zbV9mYl9kYXRhX3R5cGUgKm1mZCkKIHsKLQlzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkOwotCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyOwotCXN0cnVjdCBmYl9pbmZvICppbmZvOwotCXN0cnVjdCBtc21fZmJfYmFja3VwX3R5cGUgKmZiX2JhY2t1cDsKLQlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbXNtX3N5bmNfcHRfZGF0YSAqc3luY19wdF9kYXRhID0gJm1mZC0+bWRwX3N5bmNfcHRfZGF0YTsKKwlzdHJ1Y3QgbXNtX2ZiX2JhY2t1cF90eXBlICpmYl9iYWNrdXAgPSAmbWZkLT5tc21fZmJfYmFja3VwOworCWludCByZXQgPSAtRU5PU1lTOwogCi0JbWZkID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtc21fZmJfZGF0YV90eXBlLCBjb21taXRfd29yayk7Ci0JZmJfYmFja3VwID0gKHN0cnVjdCBtc21fZmJfYmFja3VwX3R5cGUgKiltZmQtPm1zbV9mYl9iYWNrdXA7Ci0JaW5mbyA9ICZmYl9iYWNrdXAtPmluZm87Ci0JaWYgKGZiX2JhY2t1cC0+ZGlzcF9jb21taXQuZmxhZ3MgJgotCQlNRFBfRElTUExBWV9DT01NSVRfT1ZFUkxBWSkgewotCQltZHNzX2ZiX3dhaXRfZm9yX2ZlbmNlKCZtZmQtPm1kcF9zeW5jX3B0X2RhdGEpOworCWlmICghc3luY19wdF9kYXRhLT5hc3luY193YWl0X2ZlbmNlcykKKwkJbWRzc19mYl93YWl0X2Zvcl9mZW5jZShzeW5jX3B0X2RhdGEpOworCXN5bmNfcHRfZGF0YS0+Zmx1c2hlZCA9IGZhbHNlOworCisJaWYgKGZiX2JhY2t1cC0+ZGlzcF9jb21taXQuZmxhZ3MgJiBNRFBfRElTUExBWV9DT01NSVRfT1ZFUkxBWSkgewogCQlpZiAobWZkLT5tZHAua2lja29mZl9mbmMpCi0JCQlyZXQgPSBtZmQtPm1kcC5raWNrb2ZmX2ZuYyhtZmQsICZmYl9iYWNrdXAtPmRpc3BfY29tbWl0KTsKLQkJaWYgKCFyZXQpCi0JCQltZHNzX2ZiX3VwZGF0ZV9iYWNrbGlnaHQobWZkKTsKLQkJbWRzc19mYl9zaWduYWxfdGltZWxpbmUoJm1mZC0+bWRwX3N5bmNfcHRfZGF0YSk7CisJCQlyZXQgPSBtZmQtPm1kcC5raWNrb2ZmX2ZuYyhtZmQsCisJCQkJCSZmYl9iYWNrdXAtPmRpc3BfY29tbWl0KTsKKwkJZWxzZQorCQkJcHJfd2Fybigibm8ga2lja29mZiBmdW5jdGlvbiBzZXR1cCBmb3IgZmIlZFxuIiwKKwkJCQkJbWZkLT5pbmRleCk7CiAJfSBlbHNlIHsKLQkJdmFyID0gJmZiX2JhY2t1cC0+ZGlzcF9jb21taXQudmFyOwotCQlyZXQgPSBtZHNzX2ZiX3Bhbl9kaXNwbGF5X3N1Yih2YXIsIGluZm8pOworCQlyZXQgPSBtZHNzX2ZiX3Bhbl9kaXNwbGF5X3N1YigmZmJfYmFja3VwLT5kaXNwX2NvbW1pdC52YXIsCisJCQkJJmZiX2JhY2t1cC0+aW5mbyk7CiAJCWlmIChyZXQpCi0JCQlwcl9lcnIoIiVzIGZhaWxzOiByZXQgPSAleCIsIF9fZnVuY19fLCByZXQpOworCQkJcHJfZXJyKCJwYW4gZGlzcGxheSBmYWlsZWQgJXggb24gZmIlZFxuIiwgcmV0LAorCQkJCQltZmQtPmluZGV4KTsKIAl9Ci0JbXV0ZXhfbG9jaygmbWZkLT5tZHBfc3luY19wdF9kYXRhLnN5bmNfbXV0ZXgpOwotCW1mZC0+aXNfY29tbWl0dGluZyA9IDA7Ci0JY29tcGxldGVfYWxsKCZtZmQtPmNvbW1pdF9jb21wKTsKLQltdXRleF91bmxvY2soJm1mZC0+bWRwX3N5bmNfcHRfZGF0YS5zeW5jX211dGV4KTsKKwlpZiAoIXJldCkKKwkJbWRzc19mYl91cGRhdGVfYmFja2xpZ2h0KG1mZCk7CisKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkgfHwgIXN5bmNfcHRfZGF0YS0+Zmx1c2hlZCkKKwkJbWRzc19mYl9zaWduYWxfdGltZWxpbmUoc3luY19wdF9kYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19tZHNzX2ZiX2Rpc3BsYXlfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1zbV9mYl9kYXRhX3R5cGUgKm1mZCA9IGRhdGE7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW07CisKKwlwYXJhbS5zY2hlZF9wcmlvcml0eSA9IDE2OworCXJldCA9IHNjaGVkX3NldHNjaGVkdWxlcihjdXJyZW50LCBTQ0hFRF9GSUZPLCAmcGFyYW0pOworCWlmIChyZXQpCisJCXByX3dhcm4oInNldCBwcmlvcml0eSBmYWlsZWQgZm9yIGZiJWQgZGlzcGxheSB0aHJlYWRcbiIsCisJCQkJbWZkLT5pbmRleCk7CisKKwl3aGlsZSAoMSkgeworCQl3YWl0X2V2ZW50KG1mZC0+Y29tbWl0X3dhaXRfcSwKKwkJCQlhdG9taWNfcmVhZCgmbWZkLT5jb21taXRzX3BlbmRpbmcpKTsKKworCQlyZXQgPSBfX21kc3NfZmJfcGVyZm9ybV9jb21taXQobWZkKTsKKworCQlhdG9taWNfZGVjKCZtZmQtPmNvbW1pdHNfcGVuZGluZyk7CisJCXdha2VfdXBfYWxsKCZtZmQtPmlkbGVfd2FpdF9xKTsKKwl9CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG1kc3NfZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLApAQCAtMTcxNiwxMiArMTgyMCw1MiBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIG1kc3NfZmJfc3luY19nZXRfcmVsX2ZlbmNlKCkgLSBnZXQgcmVsZWFzZSBmZW5jZSBmcm9tIHN5bmMgcHQgdGltZWxpbmUKKyAqIEBzeW5jX3B0X2RhdGE6CVN5bmMgcHQgc3RydWN0dXJlIGhvbGRpbmcgdGltZWxpbmUgYW5kIGZlbmNlIGluZm8uCisgKgorICogRnVuY3Rpb24gcmV0dXJucyBhIHJlbGVhc2UgZmVuY2Ugb24gdGhlIHRpbWVsaW5lIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAqIHN5bmMgcHQgc3RydWN0IGdpdmVuIGFuZCBpdCdzIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24uIFRoZSByZWxlYXNlIGZlbmNlCisgKiBjcmVhdGVkIGNhbiBiZSB1c2VkIHRvIHNpZ25hbCB3aGVuIGJ1ZmZlcnMgcHJvdmlkZWQgd2lsbCBiZSByZWxlYXNlZC4KKyAqLworc3RhdGljIHN0cnVjdCBzeW5jX2ZlbmNlICpfX21kc3NfZmJfc3luY19nZXRfcmVsX2ZlbmNlKAorCQlzdHJ1Y3QgbXNtX3N5bmNfcHRfZGF0YSAqc3luY19wdF9kYXRhKQoreworCXN0cnVjdCBzeW5jX3B0ICpyZWxfc3luY19wdDsKKwlzdHJ1Y3Qgc3luY19mZW5jZSAqcmVsX2ZlbmNlOworCWludCB2YWw7CisKKwl2YWwgPSBzeW5jX3B0X2RhdGEtPnRpbWVsaW5lX3ZhbHVlICsgc3luY19wdF9kYXRhLT50aHJlc2hvbGQgKworCQlhdG9taWNfcmVhZCgmc3luY19wdF9kYXRhLT5jb21taXRfY250KTsKKworCXByX2RlYnVnKCIlczogYnVmIHN5bmMgcmVsIGZlbmNlIHRpbWVsaW5lPSVkXG4iLAorCQlzeW5jX3B0X2RhdGEtPmZlbmNlX25hbWUsIHZhbCk7CisKKwlyZWxfc3luY19wdCA9IHN3X3N5bmNfcHRfY3JlYXRlKHN5bmNfcHRfZGF0YS0+dGltZWxpbmUsIHZhbCk7CisJaWYgKHJlbF9zeW5jX3B0ID09IE5VTEwpIHsKKwkJcHJfZXJyKCIlczogY2Fubm90IGNyZWF0ZSBzeW5jIHBvaW50XG4iLAorCQkJCXN5bmNfcHRfZGF0YS0+ZmVuY2VfbmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGNyZWF0ZSBmZW5jZSAqLworCXJlbF9mZW5jZSA9IHN5bmNfZmVuY2VfY3JlYXRlKHN5bmNfcHRfZGF0YS0+ZmVuY2VfbmFtZSwgcmVsX3N5bmNfcHQpOworCWlmIChyZWxfZmVuY2UgPT0gTlVMTCkgeworCQlzeW5jX3B0X2ZyZWUocmVsX3N5bmNfcHQpOworCQlwcl9lcnIoIiVzOiBjYW5ub3QgY3JlYXRlIGZlbmNlXG4iLCBzeW5jX3B0X2RhdGEtPmZlbmNlX25hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gcmVsX2ZlbmNlOworfQorCiBzdGF0aWMgaW50IG1kc3NfZmJfaGFuZGxlX2J1Zl9zeW5jX2lvY3RsKHN0cnVjdCBtc21fc3luY19wdF9kYXRhICpzeW5jX3B0X2RhdGEsCiAJCQkJIHN0cnVjdCBtZHBfYnVmX3N5bmMgKmJ1Zl9zeW5jKQogewogCWludCBpLCByZXQgPSAwOwogCWludCBhY3FfZmVuX2ZkW01EUF9NQVhfRkVOQ0VfRkRdOwotCXN0cnVjdCBzeW5jX2ZlbmNlICpmZW5jZTsKKwlzdHJ1Y3Qgc3luY19mZW5jZSAqZmVuY2UsICpyZWxfZmVuY2U7CisJaW50IHJlbF9mZW5fZmQ7CiAKIAlpZiAoKGJ1Zl9zeW5jLT5hY3FfZmVuX2ZkX2NudCA+IE1EUF9NQVhfRkVOQ0VfRkQpIHx8CiAJCQkJKHN5bmNfcHRfZGF0YS0+dGltZWxpbmUgPT0gTlVMTCkpCkBAIC0xNzMxLDE2ICsxODc1LDI0IEBACiAJCXJldCA9IGNvcHlfZnJvbV91c2VyKGFjcV9mZW5fZmQsIGJ1Zl9zeW5jLT5hY3FfZmVuX2ZkLAogCQkJCWJ1Zl9zeW5jLT5hY3FfZmVuX2ZkX2NudCAqIHNpemVvZihpbnQpKTsKIAlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6Y29weV9mcm9tX3VzZXIgZmFpbGVkIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQiLCBzeW5jX3B0X2RhdGEtPmZlbmNlX25hbWUpOwogCQlyZXR1cm4gcmV0OwogCX0KIAorCWlmIChzeW5jX3B0X2RhdGEtPmFjcV9mZW5fY250KSB7CisJCXByX3dhcm4oIiVzOiBjdXJyZW50bHkgJWQgZmVuY2VzIGFjdGl2ZS4gd2FpdGluZy4uLlxuIiwKKwkJCQlzeW5jX3B0X2RhdGEtPmZlbmNlX25hbWUsCisJCQkJc3luY19wdF9kYXRhLT5hY3FfZmVuX2NudCk7CisJCW1kc3NfZmJfd2FpdF9mb3JfZmVuY2Uoc3luY19wdF9kYXRhKTsKKwl9CisKIAltdXRleF9sb2NrKCZzeW5jX3B0X2RhdGEtPnN5bmNfbXV0ZXgpOwogCWZvciAoaSA9IDA7IGkgPCBidWZfc3luYy0+YWNxX2Zlbl9mZF9jbnQ7IGkrKykgewogCQlmZW5jZSA9IHN5bmNfZmVuY2VfZmRnZXQoYWNxX2Zlbl9mZFtpXSk7CiAJCWlmIChmZW5jZSA9PSBOVUxMKSB7Ci0JCQlwcl9pbmZvKCIlczogbnVsbCBmZW5jZSEgaT0lZCBmZD0lZFxuIiwgX19mdW5jX18sIGksCi0JCQkJYWNxX2Zlbl9mZFtpXSk7CisJCQlwcl9lcnIoIiVzOiBudWxsIGZlbmNlISBpPSVkIGZkPSVkXG4iLAorCQkJCQlzeW5jX3B0X2RhdGEtPmZlbmNlX25hbWUsIGksCisJCQkJCWFjcV9mZW5fZmRbaV0pOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQl9CkBAIC0xNzUwLDU0ICsxOTAyLDQwIEBACiAJaWYgKHJldCkKIAkJZ290byBidWZfc3luY19lcnJfMTsKIAotCWlmIChidWZfc3luYy0+ZmxhZ3MgJiBNRFBfQlVGX1NZTkNfRkxBR19XQUlUKQotCQltZHNzX2ZiX3dhaXRfZm9yX2ZlbmNlKHN5bmNfcHRfZGF0YSk7Ci0KLQlzeW5jX3B0X2RhdGEtPmN1cl9yZWxfc3luY19wdCA9IHN3X3N5bmNfcHRfY3JlYXRlKAotCQkJc3luY19wdF9kYXRhLT50aW1lbGluZSwgc3luY19wdF9kYXRhLT50aW1lbGluZV92YWx1ZSArCi0JCQkJCXN5bmNfcHRfZGF0YS0+dGhyZXNob2xkKTsKLQotCWlmIChzeW5jX3B0X2RhdGEtPmN1cl9yZWxfc3luY19wdCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGNhbm5vdCBjcmVhdGUgc3luYyBwb2ludCIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVOT01FTTsKKwlyZWxfZmVuY2UgPSBfX21kc3NfZmJfc3luY19nZXRfcmVsX2ZlbmNlKHN5bmNfcHRfZGF0YSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKHJlbF9mZW5jZSkpIHsKKwkJcHJfZXJyKCIlczogdW5hYmxlIHRvIHJldHJpZXZlIHJlbGVhc2UgZmVuY2VcbiIsCisJCQkJc3luY19wdF9kYXRhLT5mZW5jZV9uYW1lKTsKKwkJcmV0ID0gcmVsX2ZlbmNlID8gUFRSX0VSUihyZWxfZmVuY2UpIDogLUVOT01FTTsKIAkJZ290byBidWZfc3luY19lcnJfMTsKIAl9Ci0JLyogY3JlYXRlIGZlbmNlICovCi0Jc3luY19wdF9kYXRhLT5jdXJfcmVsX2ZlbmNlID0gc3luY19mZW5jZV9jcmVhdGUoCi0JCXN5bmNfcHRfZGF0YS0+ZmVuY2VfbmFtZSwgc3luY19wdF9kYXRhLT5jdXJfcmVsX3N5bmNfcHQpOwogCi0JaWYgKHN5bmNfcHRfZGF0YS0+Y3VyX3JlbF9mZW5jZSA9PSBOVUxMKSB7Ci0JCXN5bmNfcHRfZnJlZShzeW5jX3B0X2RhdGEtPmN1cl9yZWxfc3luY19wdCk7Ci0JCXN5bmNfcHRfZGF0YS0+Y3VyX3JlbF9zeW5jX3B0ID0gTlVMTDsKLQkJcHJfZXJyKCIlczogY2Fubm90IGNyZWF0ZSBmZW5jZSIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBidWZfc3luY19lcnJfMTsKLQl9CiAJLyogY3JlYXRlIGZkICovCi0Jc3luY19wdF9kYXRhLT5jdXJfcmVsX2Zlbl9mZCA9IGdldF91bnVzZWRfZmRfZmxhZ3MoMCk7Ci0JaWYgKHN5bmNfcHRfZGF0YS0+Y3VyX3JlbF9mZW5fZmQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGdldF91bnVzZWRfZmRfZmxhZ3MgZmFpbGVkIiwgX19mdW5jX18pOwotCQlyZXQgID0gLUVJTzsKKwlyZWxfZmVuX2ZkID0gZ2V0X3VudXNlZF9mZF9mbGFncygwKTsKKwlpZiAocmVsX2Zlbl9mZCA8IDApIHsKKwkJcHJfZXJyKCIlczogZ2V0X3VudXNlZF9mZF9mbGFncyBmYWlsZWRcbiIsCisJCQkJc3luY19wdF9kYXRhLT5mZW5jZV9uYW1lKTsKKwkJcmV0ID0gLUVJTzsKIAkJZ290byBidWZfc3luY19lcnJfMjsKIAl9CiAKLQlzeW5jX2ZlbmNlX2luc3RhbGwoc3luY19wdF9kYXRhLT5jdXJfcmVsX2ZlbmNlLAotCQkJCQlzeW5jX3B0X2RhdGEtPmN1cl9yZWxfZmVuX2ZkKTsKLQlyZXQgPSBjb3B5X3RvX3VzZXIoYnVmX3N5bmMtPnJlbF9mZW5fZmQsCi0JCQkJJnN5bmNfcHRfZGF0YS0+Y3VyX3JlbF9mZW5fZmQsIHNpemVvZihpbnQpKTsKKwlzeW5jX2ZlbmNlX2luc3RhbGwocmVsX2ZlbmNlLCByZWxfZmVuX2ZkKTsKIAorCXJldCA9IGNvcHlfdG9fdXNlcihidWZfc3luYy0+cmVsX2Zlbl9mZCwgJnJlbF9mZW5fZmQsIHNpemVvZihpbnQpKTsKIAlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6Y29weV90b191c2VyIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZhaWxlZFxuIiwgc3luY19wdF9kYXRhLT5mZW5jZV9uYW1lKTsKIAkJZ290byBidWZfc3luY19lcnJfMzsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZzeW5jX3B0X2RhdGEtPnN5bmNfbXV0ZXgpOworCisJaWYgKGJ1Zl9zeW5jLT5mbGFncyAmIE1EUF9CVUZfU1lOQ19GTEFHX1dBSVQpCisJCW1kc3NfZmJfd2FpdF9mb3JfZmVuY2Uoc3luY19wdF9kYXRhKTsKKwogCXJldHVybiByZXQ7CiBidWZfc3luY19lcnJfMzoKLQlwdXRfdW51c2VkX2ZkKHN5bmNfcHRfZGF0YS0+Y3VyX3JlbF9mZW5fZmQpOworCXB1dF91bnVzZWRfZmQocmVsX2Zlbl9mZCk7CiBidWZfc3luY19lcnJfMjoKLQlzeW5jX2ZlbmNlX3B1dChzeW5jX3B0X2RhdGEtPmN1cl9yZWxfZmVuY2UpOwotCXN5bmNfcHRfZGF0YS0+Y3VyX3JlbF9mZW5jZSA9IE5VTEw7Ci0Jc3luY19wdF9kYXRhLT5jdXJfcmVsX2Zlbl9mZCA9IDA7CisJc3luY19mZW5jZV9wdXQocmVsX2ZlbmNlKTsKIGJ1Zl9zeW5jX2Vycl8xOgogCWZvciAoaSA9IDA7IGkgPCBzeW5jX3B0X2RhdGEtPmFjcV9mZW5fY250OyBpKyspCiAJCXN5bmNfZmVuY2VfcHV0KHN5bmNfcHRfZGF0YS0+YWNxX2ZlbltpXSk7CkBAIC0xODM0LDggKzE5NzIsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAltZmQgPSAoc3RydWN0IG1zbV9mYl9kYXRhX3R5cGUgKilpbmZvLT5wYXI7CiAJbWRzc19mYl9wb3dlcl9zZXR0aW5nX2lkbGUobWZkKTsKLQotCW1kc3NfZmJfcGFuX2lkbGUobWZkKTsKKwlpZiAoKGNtZCAhPSBNU01GQl9WU1lOQ19DVFJMKSAmJiAoY21kICE9IE1TTUZCX09WRVJMQVlfVlNZTkNfQ1RSTCkpCisJCW1kc3NfZmJfcGFuX2lkbGUobWZkKTsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBNU01GQl9DVVJTT1I6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfZmIuaCBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19mYi5oCmluZGV4IDI1Njc4OWQuLjgyMTNkYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19mYi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19mYi5oCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21zbV9tZHAuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAKICNpbmNsdWRlICJtZHNzX3BhbmVsLmgiCiAKQEAgLTQwLDYgKzQxLDMyIEBACiAjZGVmaW5lICBNSU4oeCwgeSkgKCgoeCkgPCAoeSkpID8gKHgpIDogKHkpKQogI2VuZGlmCiAKKy8qKgorICogZW51bSBtZHBfbm90aWZ5X2V2ZW50IC0gRGlmZmVyZW50IGZyYW1lIGV2ZW50cyB0byBpbmRpY2F0ZSBmcmFtZSB1cGRhdGUgc3RhdGUKKyAqCisgKiBATURQX05PVElGWV9GUkFNRV9CRUdJTjoJRnJhbWUgdXBkYXRlIGhhcyBzdGFydGVkLCB0aGUgZnJhbWUgaXMgYWJvdXQgdG8KKyAqCQkJCWJlIHByb2dyYW1tZWQgaW50byBoYXJkd2FyZS4KKyAqIEBNRFBfTk9USUZZX0ZSQU1FX1JFQURZOglGcmFtZSByZWFkeSB0byBiZSBraWNrZWQgb2ZmLCB0aGlzIGNhbiBiZSB1c2VkCisgKgkJCQlhcyB0aGUgbGFzdCBwb2ludCBpbiB0aW1lIHRvIHN5bmNocm9uaXplZCB3aXRoCisgKgkJCQlzb3VyY2UgYnVmZmVycyBiZWZvcmUga2lja29mZi4KKyAqIEBNRFBfTk9USUZZX0ZSQU1FX0ZMVVNIRUQ6CUNvbmZpZ3VyYXRpb24gb2YgZnJhbWUgaGFzIGJlZW4gZmx1c2hlZCBhbmQKKyAqCQkJCURNQSB0cmFuc2ZlciBoYXMgc3RhcnRlZC4KKyAqIEBNRFBfTk9USUZZX0ZSQU1FX0RPTkU6CUZyYW1lIERNQSB0cmFuc2ZlciBoYXMgY29tcGxldGVkLgorICoJCQkJLSBGb3IgdmlkZW8gbW9kZSBwYW5lbHMgdGhpcyB3aWxsIGluZGljYXRlIHRoYXQKKyAqCQkJCSAgcHJldmlvdXMgZnJhbWUgaGFzIGJlZW4gcmVwbGFjZWQgYnkgbmV3IG9uZS4KKyAqCQkJCS0gRm9yIGNvbW1hbmQgbW9kZS93cml0ZWJhY2sgZnJhbWUgZG9uZSBoYXBwZW5zCisgKgkJCQkgIGFzIHNvb24gYXMgdGhlIERNQSBvZiB0aGUgZnJhbWUgaXMgZG9uZS4KKyAqIEBNRFBfTk9USUZZX0ZSQU1FX1RJTUVPVVQ6CUZyYW1lIERNQSB0cmFuc2ZlciBoYXMgZmFpbGVkIHRvIGNvbXBsZXRlIHdpdGhpbgorICoJCQkJYSBmYWlyIGFtb3VudCBvZiB0aW1lLgorICovCitlbnVtIG1kcF9ub3RpZnlfZXZlbnQgeworCU1EUF9OT1RJRllfRlJBTUVfQkVHSU4gPSAxLAorCU1EUF9OT1RJRllfRlJBTUVfUkVBRFksCisJTURQX05PVElGWV9GUkFNRV9GTFVTSEVELAorCU1EUF9OT1RJRllfRlJBTUVfRE9ORSwKKwlNRFBfTk9USUZZX0ZSQU1FX1RJTUVPVVQsCit9OworCiBzdHJ1Y3QgZGlzcF9pbmZvX3R5cGVfc3VzcGVuZCB7CiAJaW50IG9wX2VuYWJsZTsKIAlpbnQgcGFuZWxfcG93ZXJfb247CkBAIC01NywxMyArODQsMTcgQEAKIAljaGFyICpmZW5jZV9uYW1lOwogCXUzMiBhY3FfZmVuX2NudDsKIAlzdHJ1Y3Qgc3luY19mZW5jZSAqYWNxX2ZlbltNRFBfTUFYX0ZFTkNFX0ZEXTsKLQlpbnQgY3VyX3JlbF9mZW5fZmQ7Ci0Jc3RydWN0IHN5bmNfcHQgKmN1cl9yZWxfc3luY19wdDsKLQlzdHJ1Y3Qgc3luY19mZW5jZSAqY3VyX3JlbF9mZW5jZTsKKwogCXN0cnVjdCBzd19zeW5jX3RpbWVsaW5lICp0aW1lbGluZTsKIAlpbnQgdGltZWxpbmVfdmFsdWU7CiAJdTMyIHRocmVzaG9sZDsKKworCWF0b21pY190IGNvbW1pdF9jbnQ7CisJYm9vbCBmbHVzaGVkOworCWJvb2wgYXN5bmNfd2FpdF9mZW5jZXM7CisKIAlzdHJ1Y3QgbXV0ZXggc3luY19tdXRleDsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbm90aWZpZXI7CiB9OwogCiBzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZTsKQEAgLTEwNSw2ICsxMzYsMTEgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiB9OwogCitzdHJ1Y3QgbXNtX2ZiX2JhY2t1cF90eXBlIHsKKwlzdHJ1Y3QgZmJfaW5mbyBpbmZvOworCXN0cnVjdCBtZHBfZGlzcGxheV9jb21taXQgZGlzcF9jb21taXQ7Cit9OworCiBzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSB7CiAJdTMyIGtleTsKIAl1MzIgaW5kZXg7CkBAIC0xNTksMTAgKzE5NSwxMSBAQAogCXN0cnVjdCBtc21fc3luY19wdF9kYXRhIG1kcF9zeW5jX3B0X2RhdGE7CiAKIAkvKiBmb3Igbm9uLWJsb2NraW5nICovCi0Jc3RydWN0IGNvbXBsZXRpb24gY29tbWl0X2NvbXA7Ci0JdTMyIGlzX2NvbW1pdHRpbmc7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGNvbW1pdF93b3JrOwotCXZvaWQgKm1zbV9mYl9iYWNrdXA7CisJYXRvbWljX3QgY29tbWl0c19wZW5kaW5nOworCXdhaXRfcXVldWVfaGVhZF90IGNvbW1pdF93YWl0X3E7CisJd2FpdF9xdWV1ZV9oZWFkX3QgaWRsZV93YWl0X3E7CisKKwlzdHJ1Y3QgbXNtX2ZiX2JhY2t1cF90eXBlIG1zbV9mYl9iYWNrdXA7CiAJc3RydWN0IGNvbXBsZXRpb24gcG93ZXJfc2V0X2NvbXA7CiAJdTMyIGlzX3Bvd2VyX3NldHRpbmc7CiAKQEAgLTE3MCwxMSArMjA3LDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHByb2NfbGlzdDsKIH07CiAKLXN0cnVjdCBtc21fZmJfYmFja3VwX3R5cGUgewotCXN0cnVjdCBmYl9pbmZvIGluZm87Ci0Jc3RydWN0IG1kcF9kaXNwbGF5X2NvbW1pdCBkaXNwX2NvbW1pdDsKLX07Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBtZHNzX2ZiX3VwZGF0ZV9ub3RpZnlfdXBkYXRlKHN0cnVjdCBtc21fZmJfZGF0YV90eXBlICptZmQpCiB7CiAJaW50IG5lZWRzX2NvbXBsZXRlID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19oZG1pX2VkaWQuYyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19oZG1pX2VkaWQuYwppbmRleCAwMDc0ODczLi5jZjBjMjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfaGRtaV9lZGlkLmMKKysrIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX2hkbWlfZWRpZC5jCkBAIC00NjksMTMgKzQ2OSwxNyBAQAogCXJldHVybiBzdGF0dXM7CiB9IC8qIGhkbWlfZWRpZF9yZWFkX2Jsb2NrICovCiAKKyNkZWZpbmUgRURJRF9CTEtfTEVOIDEyOAorI2RlZmluZSBFRElEX0RURF9MRU4gMTgKIHN0YXRpYyBjb25zdCB1OCAqaGRtaV9lZGlkX2ZpbmRfYmxvY2soY29uc3QgdTggKmluX2J1ZiwgdTMyIHN0YXJ0X29mZnNldCwKIAl1OCB0eXBlLCB1OCAqbGVuKQogewogCS8qIHRoZSBzdGFydCBvZiBkYXRhIGJsb2NrIGNvbGxlY3Rpb24sIHN0YXJ0IG9mIFZpZGVvIERhdGEgQmxvY2sgKi8KIAl1MzIgb2Zmc2V0ID0gc3RhcnRfb2Zmc2V0OwotCXUzMiBlbmRfZGJjX29mZnNldCA9IGluX2J1ZlsyXTsKKwl1MzIgZGJjX29mZnNldCA9IGluX2J1ZlsyXTsKIAorCWlmIChkYmNfb2Zmc2V0ID49IEVESURfQkxLX0xFTiAtIEVESURfRFREX0xFTikKKwkJcmV0dXJuIE5VTEw7CiAJKmxlbiA9IDA7CiAKIAkvKgpAQCAtNDg0LDE0ICs0ODgsMTUgQEAKIAkgKiAqIGVkaWQgYnVmZmVyIDEsIGJ5dGUgMiBiZWluZyAwIG1lbmFzIG5vIG5vbi1EVEQvREFUQSBibG9jawogCSAqICAgY29sbGVjdGlvbiBwcmVzZW50IGFuZCBubyBEVEQgZGF0YSBwcmVzZW50LgogCSAqLwotCWlmICgoZW5kX2RiY19vZmZzZXQgPT0gMCkgfHwgKGVuZF9kYmNfb2Zmc2V0ID09IDQpKSB7CisJaWYgKChkYmNfb2Zmc2V0ID09IDApIHx8IChkYmNfb2Zmc2V0ID09IDQpKSB7CiAJCURFVl9XQVJOKCJFRElEOiBubyBEVEQgb3Igbm9uLURURCBkYXRhIHByZXNlbnRcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQl3aGlsZSAob2Zmc2V0IDwgZW5kX2RiY19vZmZzZXQpIHsKKwl3aGlsZSAob2Zmc2V0IDwgZGJjX29mZnNldCkgewogCQl1OCBibG9ja19sZW4gPSBpbl9idWZbb2Zmc2V0XSAmIDB4MUY7Ci0JCWlmICgoaW5fYnVmW29mZnNldF0gPj4gNSkgPT0gdHlwZSkgeworCQlpZiAoKG9mZnNldCArIGJsb2NrX2xlbiA8PSBkYmNfb2Zmc2V0KSAmJgorCQkgICAgKGluX2J1ZltvZmZzZXRdID4+IDUpID09IHR5cGUpIHsKIAkJCSpsZW4gPSBibG9ja19sZW47CiAJCQlERVZfREJHKCIlczogRURJRDogYmxvY2s9JWQgZm91bmQgQCAweCV4IHcvIGxlbj0lZFxuIiwKIAkJCQlfX2Z1bmNfXywgdHlwZSwgb2Zmc2V0LCBibG9ja19sZW4pOwpAQCAtNjk1LDcgKzcwMCw3IEBACiAJfQogCiAJdnNkID0gaGRtaV9lZGlkX2ZpbmRfYmxvY2soaW5fYnVmLCBEQkNfU1RBUlRfT0ZGU0VULCAzLCAmbGVuKTsKLQlpZiAodnNkID09IE5VTEwpCisJaWYgKHZzZCA9PSBOVUxMIHx8IGxlbiA8IDgpCiAJCXJldHVybiAwOwogCiAJREVWX0RCRygiJXM6IEVESUQ6IFZTRCBQaHlBZGRyPSUwNHgsIE1heFRNRFM9JWRNSHpcbiIsIF9fZnVuY19fLApAQCAtODg1LDcgKzg5MCw3IEBACiAJfQogfSAvKiBoZG1pX2VkaWRfYWRkX3NpbmtfdmlkZW9fZm9ybWF0ICovCiAKLXN0YXRpYyB2b2lkIGhkbWlfZWRpZF9nZXRfZGlzcGxheV92c2RfM2RfbW9kZShjb25zdCB1OCAqZGF0YV9idWYsCitzdGF0aWMgaW50IGhkbWlfZWRpZF9nZXRfZGlzcGxheV92c2RfM2RfbW9kZShjb25zdCB1OCAqZGF0YV9idWYsCiAJc3RydWN0IGhkbWlfZWRpZF9zaW5rX2RhdGEgKnNpbmtfZGF0YSwgdTMyIG51bV9vZl9jZWFfYmxvY2tzKQogewogCXU4IGxlbiwgb2Zmc2V0LCBwcmVzZW50X211bHRpXzNkLCBoZG1pX3ZpY19sZW47CkBAIC04OTYsMjIgKzkwMSwzNCBAQAogCQkJCTMsICZsZW4pIDogTlVMTDsKIAlpbnQgaTsKIAorCWlmICghdnNkKQorCQlyZXR1cm4gLUVOWElPOworCiAJb2Zmc2V0ID0gSERNSV9WU0RCXzNEX0VWRl9EQVRBX09GRlNFVCh2c2QpOworCWlmIChvZmZzZXQgPj0gbGVuIC0gMSkKKwkJcmV0dXJuIC1FVE9PU01BTEw7CisKIAlwcmVzZW50X211bHRpXzNkID0gKHZzZFtvZmZzZXRdICYgMHg2MCkgPj4gNTsKIAogCW9mZnNldCArPSAxOworCiAJaGRtaV92aWNfbGVuID0gKHZzZFtvZmZzZXRdID4+IDUpICYgMHg3OwogCWhkbWlfM2RfbGVuID0gdnNkW29mZnNldF0gJiAweDFGOwogCURFVl9EQkcoIiVzOiBFRElEWzNEXTogSERNSV9WSUNfTEVOID0gJWQsIEhETUlfM0RfTEVOID0gJWRcbiIsIF9fZnVuY19fLAogCQloZG1pX3ZpY19sZW4sIGhkbWlfM2RfbGVuKTsKIAogCW9mZnNldCArPSAoaGRtaV92aWNfbGVuICsgMSk7CisJaWYgKG9mZnNldCA+PSBsZW4gLSAxKQorCQlyZXR1cm4gLUVUT09TTUFMTDsKKwogCWlmIChwcmVzZW50X211bHRpXzNkID09IDEgfHwgcHJlc2VudF9tdWx0aV8zZCA9PSAyKSB7CiAJCURFVl9EQkcoIiVzOiBFRElEWzNEXTogbXVsdGkgM0QgcHJlc2VudCAoJWQpXG4iLCBfX2Z1bmNfXywKIAkJCXByZXNlbnRfbXVsdGlfM2QpOwogCQkvKiAzZF9zdHJ1Y3R1cmVfYWxsICovCiAJCXN0cnVjdHVyZV9hbGwgPSAodnNkW29mZnNldF0gPDwgOCkgfCB2c2Rbb2Zmc2V0ICsgMV07CiAJCW9mZnNldCArPSAyOworCQlpZiAob2Zmc2V0ID49IGxlbiAtIDEpCisJCQlyZXR1cm4gLUVUT09TTUFMTDsKIAkJaGRtaV8zZF9sZW4gLT0gMjsKIAkJaWYgKHByZXNlbnRfbXVsdGlfM2QgPT0gMikgewogCQkJLyogM2Rfc3RydWN0dXJlX21hc2sgKi8KQEAgLTk1OCwxNiArOTc1LDE4IEBACiAKIAlpID0gMDsKIAl3aGlsZSAoaGRtaV8zZF9sZW4gPiAwKSB7CisJCWlmIChvZmZzZXQgPj0gbGVuIC0gMSkKKwkJCXJldHVybiAtRVRPT1NNQUxMOwogCQlERVZfREJHKCIlczogRURJRDogM0RfU3RydWN0dXJlXyVkIEAgMHgleDogJTAyeFxuIiwKIAkJCV9fZnVuY19fLCBpICsgMSwgb2Zmc2V0LCB2c2Rbb2Zmc2V0XSk7Ci0KIAkJaWYgKCh2c2Rbb2Zmc2V0XSA+PiA0KSA+PQogCQkJc2lua19kYXRhLT5kaXNwX211bHRpXzNkX21vZGVfbGlzdF9jbnQpIHsKIAkJCWlmICgodnNkW29mZnNldF0gJiAweDBGKSA+PSA4KSB7CiAJCQkJb2Zmc2V0ICs9IDE7CiAJCQkJaGRtaV8zZF9sZW4gLT0gMTsKIAkJCQlERVZfREJHKCIlczpFRElEOjNEX0RldGFpbF8lZCBAIDB4JXg6ICUwMnhcbiIsCi0JCQkJCV9fZnVuY19fLCBpICsgMSwgb2Zmc2V0LCB2c2Rbb2Zmc2V0XSk7CisJCQkJCV9fZnVuY19fLCBpICsgMSwgb2Zmc2V0LAorCQkJCQl2c2RbbWluX3QodTMyLCBvZmZzZXQsIChsZW4gLSAxKSldKTsKIAkJCX0KIAkJCWkgKz0gMTsKIAkJCW9mZnNldCArPSAxOwpAQCAtMTAwMywxMiArMTAyMiwxMyBAQAogCQkJaGRtaV8zZF9sZW4gLT0gMTsKIAkJCURFVl9EQkcoIiVzOiBFRElEWzNEXTogM0RfRGV0YWlsXyVkIEAgMHgleDogJTAyeFxuIiwKIAkJCQlfX2Z1bmNfXywgaSArIDEsIG9mZnNldCwKLQkJCQl2c2Rbb2Zmc2V0XSk7CisJCQkJdnNkW21pbl90KHUzMiwgb2Zmc2V0LCAobGVuIC0gMSkpXSk7CiAJCX0KIAkJaSArPSAxOwogCQlvZmZzZXQgKz0gMTsKIAkJaGRtaV8zZF9sZW4gLT0gMTsKIAl9CisJcmV0dXJuIDA7CiB9IC8qIGhkbWlfZWRpZF9nZXRfZGlzcGxheV92c2RfM2RfbW9kZSAqLwogCiBzdGF0aWMgdm9pZCBoZG1pX2VkaWRfZ2V0X2V4dGVuZGVkX3ZpZGVvX2Zvcm1hdHMoCkBAIC0xMDYxLDYgKzEwODEsNyBAQAogCXUzMiB2aWRlb19mb3JtYXQgPSBIRE1JX1ZGUk1UXzY0MHg0ODBwNjBfNF8zOwogCXUzMiBoYXM0ODBwID0gZmFsc2U7CiAJdTggbGVuOworCWludCByYzsKIAljb25zdCB1OCAqZWRpZF9ibGswID0gTlVMTDsKIAljb25zdCB1OCAqZWRpZF9ibGsxID0gTlVMTDsKIAljb25zdCB1OCAqc3ZkID0gTlVMTDsKQEAgLTEzMTEsOCArMTMzMiwxMCBAQAogCQl9CiAKIAkJLyogM2QgZm9ybWF0IGRlc2NyaWJlZCBpbiBWZW5kb3IgU3BlY2lmaWMgRGF0YSAqLwotCQloZG1pX2VkaWRfZ2V0X2Rpc3BsYXlfdnNkXzNkX21vZGUoZGF0YV9idWYsIHNpbmtfZGF0YSwKKwkJcmMgPSBoZG1pX2VkaWRfZ2V0X2Rpc3BsYXlfdnNkXzNkX21vZGUoZGF0YV9idWYsIHNpbmtfZGF0YSwKIAkJCW51bV9vZl9jZWFfYmxvY2tzKTsKKwkJaWYgKCFyYykKKwkJCXByX2RlYnVnKCIlczogM0QgZm9ybWF0cyBpbiBWU0RcbiIsIF9fZnVuY19fKTsKIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX2hkbWlfaGRjcC5jIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX2hkbWlfaGRjcC5jCmluZGV4IGJmMjhlOGMuLjgwYjI3ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19oZG1pX2hkY3AuYworKysgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfaGRtaV9oZGNwLmMKQEAgLTExODUsOSArMTE4NSw2IEBACiAKIAlEU1NfUkVHX1coaW8sIEhETUlfSERDUF9SRVNFVCwgQklUKDApKTsKIAotCS8qIFdhaXQgdG8gYmUgY2xlYW4gb24gRERDIEhXIGVuZ2luZSAqLwotCWhkbWlfaGRjcF9od19kZGNfY2xlYW4oaGRjcF9jdHJsKTsKLQogCS8qIERpc2FibGUgZW5jcnlwdGlvbiBhbmQgZGlzYWJsZSB0aGUgSERDUCBibG9jayAqLwogCURTU19SRUdfVyhpbywgSERNSV9IRENQX0NUUkwsIDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfaGRtaV90eC5jIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX2hkbWlfdHguYwppbmRleCAwYjY0YmJiLi5lNDZlMzYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfaGRtaV90eC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19oZG1pX3R4LmMKQEAgLTQ2LDYgKzQ2LDE0IEBACiAjZGVmaW5lIEhQRF9ESVNDT05ORUNUX1BPTEFSSVRZIDAKICNkZWZpbmUgSFBEX0NPTk5FQ1RfUE9MQVJJVFkgICAgMQogCisvKgorICogQXVkaW8gZW5naW5lIG1heSB0YWtlIDEgdG8gMyBzZWMgdG8gc2h1dGRvd24KKyAqIGluIG5vcm1hbCBjYXNlcy4gVG8gaGFuZGxlIHdvcnN0IGNhc2VzLCBtYWtpbmcKKyAqIHRpbWVvdXQgZm9yIGF1ZGlvIGVuZ2luZSBzaHV0ZG93biBhcyA1IHNlYy4KKyAqLworI2RlZmluZSBBVURJT19QT0xMX1NMRUVQX1VTICAgKDUgKiAxMDAwKQorI2RlZmluZSBBVURJT19QT0xMX1RJTUVPVVRfVVMgKEFVRElPX1BPTExfU0xFRVBfVVMgKiAxMDAwKQorCiAjZGVmaW5lIElGUkFNRV9DSEVDS1NVTV8zMihkKQkJCVwKIAkoKGQgJiAweGZmKSArICgoZCA+PiA4KSAmIDB4ZmYpICsJXAogCSgoZCA+PiAxNikgJiAweGZmKSArICgoZCA+PiAyNCkgJiAweGZmKSkKQEAgLTg3LDggKzk1LDggQEAKIHN0YXRpYyB2b2lkIGhkbWlfdHhfaHBkX29mZihzdHJ1Y3QgaGRtaV90eF9jdHJsICpoZG1pX2N0cmwpOwogc3RhdGljIGludCBoZG1pX3R4X2VuYWJsZV9wb3dlcihzdHJ1Y3QgaGRtaV90eF9jdHJsICpoZG1pX2N0cmwsCiAJZW51bSBoZG1pX3R4X3Bvd2VyX21vZHVsZV90eXBlIG1vZHVsZSwgaW50IGVuYWJsZSk7Ci1zdGF0aWMgdm9pZCBoZG1pX3R4X2F1ZGlvX29mZihzdHJ1Y3QgaGRtaV90eF9jdHJsICpoZG1pX2N0cmwsCi0JCQkJYm9vbCB3YWl0X2F1ZGlvX3R4KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZG1pX3R4X3NldF9hdWRpb19zd2l0Y2hfbm9kZShzdHJ1Y3QgaGRtaV90eF9jdHJsICpoZG1pX2N0cmwsCisJaW50IHZhbCwgYm9vbCBmb3JjZSk7CiBzdGF0aWMgaW50IGhkbWlfdHhfYXVkaW9fc2V0dXAoc3RydWN0IGhkbWlfdHhfY3RybCAqaGRtaV9jdHJsKTsKIAogc3RydWN0IG1kc3NfaHcgaGRtaV90eF9odyA9IHsKQEAgLTM0Myw2ICszNTEsNTIgQEAKIAlyZXR1cm4gbmV3X3ZpYzsKIH0gLyogaGRtaV90eF9nZXRfdmljX2Zyb21fcGFuZWxfaW5mbyAqLwogCitzdGF0aWMgaW5saW5lIHZvaWQgaGRtaV90eF9zZW5kX2NhYmxlX25vdGlmaWNhdGlvbigKKwlzdHJ1Y3QgaGRtaV90eF9jdHJsICpoZG1pX2N0cmwsIGludCB2YWwpCit7CisJaWYgKCFoZG1pX2N0cmwpIHsKKwkJREVWX0VSUigiJXM6IGludmFsaWQgaW5wdXRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghaGRtaV9jdHJsLT5wZGF0YS5wcmltYXJ5ICYmIChoZG1pX2N0cmwtPnNkZXYuc3RhdGUgIT0gdmFsKSkKKwkJc3dpdGNoX3NldF9zdGF0ZSgmaGRtaV9jdHJsLT5zZGV2LCB2YWwpOworfSAvKiBoZG1pX3R4X3NlbmRfY2FibGVfbm90aWZpY2F0aW9uICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIGhkbWlfdHhfaXNfZHZpX21vZGUoc3RydWN0IGhkbWlfdHhfY3RybCAqaGRtaV9jdHJsKQoreworCXJldHVybiBoZG1pX2VkaWRfZ2V0X3NpbmtfbW9kZSgKKwkJaGRtaV9jdHJsLT5mZWF0dXJlX2RhdGFbSERNSV9UWF9GRUFUX0VESURdKSA/IDAgOiAxOworfSAvKiBoZG1pX3R4X2lzX2R2aV9tb2RlICovCisKK3N0YXRpYyB2b2lkIGhkbWlfdHhfd2FpdF9mb3JfYXVkaW9fZW5naW5lKHN0cnVjdCBoZG1pX3R4X2N0cmwgKmhkbWlfY3RybCkKK3sKKwl1MzIgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZHNzX2lvX2RhdGEgKmlvID0gTlVMTDsKKworCWlmICghaGRtaV9jdHJsKSB7CisJCURFVl9FUlIoIiVzOiBpbnZhbGlkIGlucHV0XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpbyA9ICZoZG1pX2N0cmwtPnBkYXRhLmlvW0hETUlfVFhfQ09SRV9JT107CisJaWYgKCFpby0+YmFzZSkgeworCQlERVZfRVJSKCIlczogY29yZSBpbyBub3QgaW5pdGl0YWxpemVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocmVhZGxfcG9sbF90aW1lb3V0KGlvLT5iYXNlICsgSERNSV9BVURJT19QS1RfQ1RSTCwgc3RhdHVzLAorCQkJCShzdGF0dXMgJiBCSVQoMCkpID09IDAsIEFVRElPX1BPTExfU0xFRVBfVVMsCisJCQkJQVVESU9fUE9MTF9USU1FT1VUX1VTKSkKKwkJREVWX0VSUigiJXM6IEVycm9yIHR1cm5pbmcgb2ZmIGF1ZGlvIHBhY2tldCB0cmFuc21pc3Npb24uXG4iLAorCQkJX19mdW5jX18pOworCisJaWYgKHJlYWRsX3BvbGxfdGltZW91dChpby0+YmFzZSArIEhETUlfQVVESU9fQ0ZHLCBzdGF0dXMsCisJCQkJKHN0YXR1cyAmIEJJVCgwKSkgPT0gMCwgQVVESU9fUE9MTF9TTEVFUF9VUywKKwkJCQlBVURJT19QT0xMX1RJTUVPVVRfVVMpKQorCQlERVZfRVJSKCIlczogRXJyb3IgdHVybmluZyBvZmYgYXVkaW8gZW5naW5lLlxuIiwgX19mdW5jX18pOworfQorCiBzdGF0aWMgc3RydWN0IGhkbWlfdHhfY3RybCAqaGRtaV90eF9nZXRfZHJ2ZGF0YV9mcm9tX3BhbmVsX2RhdGEoCiAJc3RydWN0IG1kc3NfcGFuZWxfZGF0YSAqbXBkKQogewpAQCAtNDYxLDYgKzUxNSwxNSBAQAogCiAJaWYgKDAgPT0gaHBkICYmIGhkbWlfY3RybC0+aHBkX2ZlYXR1cmVfb24pIHsKIAkJcmMgPSBoZG1pX3R4X3N5c2ZzX2VuYWJsZV9ocGQoaGRtaV9jdHJsLCBmYWxzZSk7CisKKwkJaWYgKGhkbWlfY3RybC0+cGFuZWxfcG93ZXJfb24gJiYgaGRtaV9jdHJsLT5ocGRfc3RhdGUpIHsKKwkJCWhkbWlfdHhfc2V0X2F1ZGlvX3N3aXRjaF9ub2RlKGhkbWlfY3RybCwgMCwgZmFsc2UpOworCQkJaGRtaV90eF93YWl0X2Zvcl9hdWRpb19lbmdpbmUoaGRtaV9jdHJsKTsKKwkJfQorCisJCWhkbWlfdHhfc2VuZF9jYWJsZV9ub3RpZmljYXRpb24oaGRtaV9jdHJsLCAwKTsKKwkJREVWX0RCRygiJXM6IEhkbWkgc3RhdGUgc3dpdGNoIHRvICVkXG4iLCBfX2Z1bmNfXywKKwkJCWhkbWlfY3RybC0+c2Rldi5zdGF0ZSk7CiAJfSBlbHNlIGlmICgxID09IGhwZCAmJiAhaGRtaV9jdHJsLT5ocGRfZmVhdHVyZV9vbikgewogCQlyYyA9IGhkbWlfdHhfc3lzZnNfZW5hYmxlX2hwZChoZG1pX2N0cmwsIHRydWUpOwogCX0gZWxzZSB7CkBAIC03MDgsMjQgKzc3MSw2IEBACiAJaGRtaV9jdHJsLT5rb2JqID0gTlVMTDsKIH0gLyogaGRtaV90eF9zeXNmc19yZW1vdmUgKi8KIAotc3RhdGljIGlubGluZSB1MzIgaGRtaV90eF9pc19kdmlfbW9kZShzdHJ1Y3QgaGRtaV90eF9jdHJsICpoZG1pX2N0cmwpCi17Ci0JcmV0dXJuIGhkbWlfZWRpZF9nZXRfc2lua19tb2RlKAotCQloZG1pX2N0cmwtPmZlYXR1cmVfZGF0YVtIRE1JX1RYX0ZFQVRfRURJRF0pID8gMCA6IDE7Ci19IC8qIGhkbWlfdHhfaXNfZHZpX21vZGUgKi8KLQotc3RhdGljIGlubGluZSB2b2lkIGhkbWlfdHhfc2VuZF9jYWJsZV9ub3RpZmljYXRpb24oCi0Jc3RydWN0IGhkbWlfdHhfY3RybCAqaGRtaV9jdHJsLCBpbnQgdmFsKQotewotCWlmICghaGRtaV9jdHJsKSB7Ci0JCURFVl9FUlIoIiVzOiBpbnZhbGlkIGlucHV0XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIWhkbWlfY3RybC0+cGRhdGEucHJpbWFyeSAmJiAoaGRtaV9jdHJsLT5zZGV2LnN0YXRlICE9IHZhbCkpCi0JCXN3aXRjaF9zZXRfc3RhdGUoJmhkbWlfY3RybC0+c2RldiwgdmFsKTsKLX0gLyogaGRtaV90eF9zZW5kX2NhYmxlX25vdGlmaWNhdGlvbiAqLwotCiBzdGF0aWMgaW5saW5lIHZvaWQgaGRtaV90eF9zZXRfYXVkaW9fc3dpdGNoX25vZGUoc3RydWN0IGhkbWlfdHhfY3RybCAqaGRtaV9jdHJsLAogCWludCB2YWwsIGJvb2wgZm9yY2UpCiB7CkBAIC0xMDEyLDggKzEwNTcsOCBAQAogCQlERVZfSU5GTygiJXM6IHNlbnNlIGNhYmxlIENPTk5FQ1RFRDogc3RhdGUgc3dpdGNoIHRvICVkXG4iLAogCQkJX19mdW5jX18sIGhkbWlfY3RybC0+c2Rldi5zdGF0ZSk7CiAJfSBlbHNlIHsKLQkJaWYgKGhkbWlfdHhfZW5hYmxlX3Bvd2VyKGhkbWlfY3RybCwgSERNSV9UWF9ERENfUE0sIGZhbHNlKSkKLQkJCURFVl9XQVJOKCIlczogRmFpbGVkIHRvIGRpc2FibGUgZGRjIHBvd2VyXG4iLCBfX2Z1bmNfXyk7CisJCWhkbWlfdHhfc2V0X2F1ZGlvX3N3aXRjaF9ub2RlKGhkbWlfY3RybCwgMCwgZmFsc2UpOworCQloZG1pX3R4X3dhaXRfZm9yX2F1ZGlvX2VuZ2luZShoZG1pX2N0cmwpOwogCiAJCWhkbWlfdHhfc2VuZF9jYWJsZV9ub3RpZmljYXRpb24oaGRtaV9jdHJsLCAwKTsKIAkJREVWX0lORk8oIiVzOiBzZW5zZSBjYWJsZSBESVNDT05ORUNURUQ6IHN0YXRlIHN3aXRjaCB0byAlZFxuIiwKQEAgLTIyNDUsMTAgKzIyOTAsOCBAQAogCXJldHVybiAwOwogfSAvKiBoZG1pX3R4X2F1ZGlvX3NldHVwICovCiAKLXN0YXRpYyB2b2lkIGhkbWlfdHhfYXVkaW9fb2ZmKHN0cnVjdCBoZG1pX3R4X2N0cmwgKmhkbWlfY3RybCwKLQkJCQlib29sIHdhaXRfYXVkaW9fdHgpCitzdGF0aWMgdm9pZCBoZG1pX3R4X2F1ZGlvX29mZihzdHJ1Y3QgaGRtaV90eF9jdHJsICpoZG1pX2N0cmwpCiB7Ci0JdTMyIGkgPSAwLCBzdGF0dXMsIHNsZWVwX3VzLCB0aW1lb3V0X3VzLCB0aW1lb3V0X3NlYyA9IDE1OwogCXN0cnVjdCBkc3NfaW9fZGF0YSAqaW8gPSBOVUxMOwogCiAJaWYgKCFoZG1pX2N0cmwpIHsKQEAgLTIyNjIsMzQgKzIzMDUsNiBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKHdhaXRfYXVkaW9fdHgpIHsKLQkJLyogQ2hlY2sgaWYgYXVkaW8gZW5naW5lIGlzIHR1cm5lZCBvZmYgYnkgUURTUCBvciBub3QgKi8KLQkJLyogc2VuZCBvZmYgbm90aWZpY2F0aW9uIGFmdGVyIGV2ZXJ5IDEgc2VjIGZvciAxNSBzZWNvbmRzICovCi0JCWZvciAoaSA9IDA7IGkgPCB0aW1lb3V0X3NlYzsgaSsrKSB7Ci0JCQkvKiBNYXhpbXVtIHRpbWUgdG8gc2xlZXAgYmV0d2VlbiB0d28gcmVhZHMgKi8KLQkJCXNsZWVwX3VzID0gNTAwMDsKLQkJCS8qIFRvdGFsIHRpbWUgZm9yIGNvbmRpdGlvbiB0byBtZWV0ICovCi0JCQl0aW1lb3V0X3VzID0gMTAwMCAqIDEwMDA7Ci0KLQkJCWlmIChyZWFkbF9wb2xsX3RpbWVvdXQoKGlvLT5iYXNlICsgSERNSV9BVURJT19DRkcpLAotCQkJCXN0YXR1cywgKChzdGF0dXMgJiBCSVQoMCkpID09IDApLAotCQkJCXNsZWVwX3VzLCB0aW1lb3V0X3VzKSkgewotCi0JCQkJREVWX0VSUigKLQkJCQkiJXM6IGF1ZGlvIHN0aWxsIG9uIGFmdGVyICVkIHNlYy4gdHJ5IGFnYWluXG4iLAotCQkJCV9fZnVuY19fLCBpKzEpOwotCi0JCQkJaGRtaV90eF9zZXRfYXVkaW9fc3dpdGNoX25vZGUoaGRtaV9jdHJsLCAwLAotCQkJCQl0cnVlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGkgPT0gdGltZW91dF9zZWMpCi0JCURFVl9FUlIoIiVzOiBFcnJvcjogY2Fubm90IHR1cm4gb2ZmIGF1ZGlvIGVuZ2luZVxuIiwgX19mdW5jX18pOwotCiAJaWYgKGhkbWlfdHhfYXVkaW9faWZyYW1lX3NldHVwKGhkbWlfY3RybCwgZmFsc2UpKQogCQlERVZfRVJSKCIlczogaGRtaV90eF9hdWRpb19pZnJhbWVfc2V0dXAgZmFpbGVkLlxuIiwgX19mdW5jX18pOwogCkBAIC0yNDEzLDEwICsyNDI4LDExIEBACiAJCWhkbWlfaGRjcF9vZmYoaGRtaV9jdHJsLT5mZWF0dXJlX2RhdGFbSERNSV9UWF9GRUFUX0hEQ1BdKTsKIAl9CiAKLQlpZiAoIWhkbWlfdHhfaXNfZHZpX21vZGUoaGRtaV9jdHJsKSkgewotCQloZG1pX3R4X3NldF9hdWRpb19zd2l0Y2hfbm9kZShoZG1pX2N0cmwsIDAsIGZhbHNlKTsKLQkJaGRtaV90eF9hdWRpb19vZmYoaGRtaV9jdHJsLCB0cnVlKTsKLQl9CisJaWYgKGhkbWlfdHhfZW5hYmxlX3Bvd2VyKGhkbWlfY3RybCwgSERNSV9UWF9ERENfUE0sIGZhbHNlKSkKKwkJREVWX1dBUk4oIiVzOiBGYWlsZWQgdG8gZGlzYWJsZSBkZGMgcG93ZXJcbiIsIF9fZnVuY19fKTsKKworCWlmICghaGRtaV90eF9pc19kdmlfbW9kZShoZG1pX2N0cmwpKQorCQloZG1pX3R4X2F1ZGlvX29mZihoZG1pX2N0cmwpOwogCiAJaGRtaV90eF9wb3dlcmRvd25fcGh5KGhkbWlfY3RybCk7CiAKQEAgLTI2NjcsMTAgKzI2ODMsNiBAQAogCQkJaGRtaV90eF9ocGRfb2ZmKGhkbWlfY3RybCk7CiAJCWVsc2UKIAkJCWhkbWlfY3RybC0+aHBkX29mZl9wZW5kaW5nID0gdHJ1ZTsKLQotCQloZG1pX3R4X3NlbmRfY2FibGVfbm90aWZpY2F0aW9uKGhkbWlfY3RybCwgMCk7Ci0JCURFVl9EQkcoIiVzOiBIZG1pIHN0YXRlIHN3aXRjaCB0byAlZFxuIiwgX19mdW5jX18sCi0JCQloZG1pX2N0cmwtPnNkZXYuc3RhdGUpOwogCX0KIAogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19tZHAuYyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19tZHAuYwppbmRleCBkYjhhMDk4Li4zYWZlMmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwLmMKKysrIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcC5jCkBAIC03OSw2ICs3OSw3IEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWRwX2xvY2spOwogc3RhdGljIERFRklORV9NVVRFWChtZHBfY2xrX2xvY2spOworc3RhdGljIERFRklORV9NVVRFWChidXNfYndfbG9jayk7CiAKICNkZWZpbmUgTURQX0JVU19WRUNUT1JfRU5UUlkoYWJfdmFsLCBpYl92YWwpCQlcCiAJewkJCQkJCVwKQEAgLTYwOCw5ICs2MDksNTggQEAKIAlyZXR1cm4gY2xrX3JhdGU7CiB9CiAKKy8qKgorICogbWRzc19idXNfYmFuZHdpZHRoX2N0cmwoKSAtLSBwbGFjZSBidXMgYmFuZHdpZHRoIHJlcXVlc3QKKyAqIEBlbmFibGU6CXZhbHVlIG9mIGVuYWJsZSBvciBkaXNhYmxlCisgKgorICogRnVuY3Rpb24gcGxhY2UgYnVzIGJhbmR3aWR0aCByZXF1ZXN0IHRvIGFsbG9jYXRlIHNhdmVkIGJhbmR3aWR0aAorICogaWYgZW5hYmxlZCBvciBmcmVlIGJ1cyBiYW5kd2lkdGggYWxsb2NhdGlvbiBpZiBkaXNhYmxlZC4KKyAqIEJ1cyBiYW5kd2lkdGggaXMgcmVxdWlyZWQgYnkgbWRwLkZvciBkc2ksIGl0IG9ubHkgcmVxdWlyZXMgdG8gc2VuZAorICogZGNzIGNvYW1tbmQuCisgKi8KK3ZvaWQgbWRzc19idXNfYmFuZHdpZHRoX2N0cmwoaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgbWRzc19kYXRhX3R5cGUgKm1kYXRhID0gbWRzc19tZHBfZ2V0X21kYXRhKCk7CisJc3RhdGljIGludCBidXNfYndfY250OworCWludCBjaGFuZ2VkID0gMDsKKworCW11dGV4X2xvY2soJmJ1c19id19sb2NrKTsKKwlpZiAoZW5hYmxlKSB7CisJCWlmIChidXNfYndfY250ID09IDApCisJCQljaGFuZ2VkKys7CisJCWJ1c19id19jbnQrKzsKKwl9IGVsc2UgeworCQlpZiAoYnVzX2J3X2NudCkgeworCQkJYnVzX2J3X2NudC0tOworCQkJaWYgKGJ1c19id19jbnQgPT0gMCkKKwkJCQljaGFuZ2VkKys7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIkNhbiBub3QgYmUgdHVybmVkIG9mZlxuIik7CisJCX0KKwl9CisKKwlwcl9kZWJ1ZygiYndfY250PSVkIGNoYW5nZWQ9JWQgZW5hYmxlPSVkXG4iLAorCQkJYnVzX2J3X2NudCwgY2hhbmdlZCwgZW5hYmxlKTsKKworCWlmIChjaGFuZ2VkKSB7CisJCWlmICghZW5hYmxlKSB7CisJCQltc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdCgKKwkJCQltZGF0YS0+YnVzX2hkbCwgMCk7CisJCQlwbV9ydW50aW1lX3B1dCgmbWRhdGEtPnBkZXYtPmRldik7CisJCX0gZWxzZSB7CisJCQlwbV9ydW50aW1lX2dldF9zeW5jKCZtZGF0YS0+cGRldi0+ZGV2KTsKKwkJCW1zbV9idXNfc2NhbGVfY2xpZW50X3VwZGF0ZV9yZXF1ZXN0KAorCQkJCW1kYXRhLT5idXNfaGRsLCBtZGF0YS0+Y3VycmVudF9idXNfaWR4KTsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmYnVzX2J3X2xvY2spOworfQorRVhQT1JUX1NZTUJPTChtZHNzX2J1c19iYW5kd2lkdGhfY3RybCk7CisKIHZvaWQgbWRzc19tZHBfY2xrX2N0cmwoaW50IGVuYWJsZSwgaW50IGlzcikKIHsKLQlzdHJ1Y3QgbWRzc19kYXRhX3R5cGUgKm1kYXRhID0gbWRzc19yZXM7CisJc3RydWN0IG1kc3NfZGF0YV90eXBlICptZGF0YSA9IG1kc3NfbWRwX2dldF9tZGF0YSgpOwogCXN0YXRpYyBpbnQgbWRwX2Nsa19jbnQ7CiAJaW50IGNoYW5nZWQgPSAwOwogCkBAIC02MjAsOSArNjcwLDEzIEBACiAJCQljaGFuZ2VkKys7CiAJCW1kcF9jbGtfY250Kys7CiAJfSBlbHNlIHsKLQkJbWRwX2Nsa19jbnQtLTsKLQkJaWYgKG1kcF9jbGtfY250ID09IDApCi0JCQljaGFuZ2VkKys7CisJCWlmIChtZHBfY2xrX2NudCkgeworCQkJbWRwX2Nsa19jbnQtLTsKKwkJCWlmIChtZHBfY2xrX2NudCA9PSAwKQorCQkJCWNoYW5nZWQrKzsKKwkJfSBlbHNlIHsKKwkJCXByX2VycigiQ2FuIG5vdCBiZSB0dXJuZWQgb2ZmXG4iKTsKKwkJfQogCX0KIAogCXByX2RlYnVnKCIlczogY2xrX2NudD0lZCBjaGFuZ2VkPSVkIGVuYWJsZT0lZFxuIiwKQEAgLTY0MCwxNCArNjk0LDEwIEBACiAJCWlmIChtZGF0YS0+dnN5bmNfZW5hKQogCQkJbWRzc19tZHBfY2xrX3VwZGF0ZShNRFNTX0NMS19NRFBfVlNZTkMsIGVuYWJsZSk7CiAKLQkJaWYgKCFlbmFibGUpIHsKLQkJCW1zbV9idXNfc2NhbGVfY2xpZW50X3VwZGF0ZV9yZXF1ZXN0KAotCQkJCW1kc3NfcmVzLT5idXNfaGRsLCAwKTsKKwkJbWRzc19idXNfYmFuZHdpZHRoX2N0cmwoZW5hYmxlKTsKKworCQlpZiAoIWVuYWJsZSkKIAkJCXBtX3J1bnRpbWVfcHV0KCZtZGF0YS0+cGRldi0+ZGV2KTsKLQkJfSBlbHNlIHsKLQkJCW1zbV9idXNfc2NhbGVfY2xpZW50X3VwZGF0ZV9yZXF1ZXN0KAotCQkJCW1kc3NfcmVzLT5idXNfaGRsLCBtZHNzX3Jlcy0+Y3VycmVudF9idXNfaWR4KTsKLQkJfQogCX0KIAogCW11dGV4X3VubG9jaygmbWRwX2Nsa19sb2NrKTsKQEAgLTE3NzEsNyArMTgyMSw4IEBACiAJc3RydWN0IG1kc3NfZGF0YV90eXBlICptZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXUzMiBudW07CiAJdTMyIGRhdGFbMl07Ci0JaW50IHJjOworCWludCByYywgbGVuOworCWNvbnN0IHUzMiAqYXJyOwogCiAJbnVtID0gbWRzc19tZHBfcGFyc2VfZHRfcHJvcF9sZW4ocGRldiwgInFjb20sbWRzcy1zbXAtZGF0YSIpOwogCkBAIC0xNzkzLDcgKzE4NDQsNDkgQEAKIAkJInFjb20sbWRzcy1zbXAtbWItcGVyLXBpcGUiLCBkYXRhKTsKIAltZGF0YS0+c21wX21iX3Blcl9waXBlID0gKCFyYyA/IGRhdGFbMF0gOiAwKTsKIAotCXJldHVybiAwOworCXJjID0gMDsKKwlhcnIgPSBvZl9nZXRfcHJvcGVydHkocGRldi0+ZGV2Lm9mX25vZGUsCisJCSJxY29tLG1kc3MtcGlwZS1yZ2ItZml4ZWQtbW1iIiwgJmxlbik7CisJaWYgKGFycikgeworCQlpbnQgaSwgaiwgazsKKwkJdTMyIGNudCwgbW1iOworCisJCWxlbiAvPSBzaXplb2YodTMyKTsKKwkJZm9yIChpID0gMCwgayA9IDA7IGkgPCBsZW47IGsrKykgeworCQkJc3RydWN0IG1kc3NfbWRwX3BpcGUgKnBpcGUgPSBOVUxMOworCisJCQlpZiAoayA+PSBtZGF0YS0+bnJnYl9waXBlcykgeworCQkJCXByX2VycigiaW52YWxpZCBmaXhlZCBtbWJzIGZvciByZ2IgcGlwZXNcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlwaXBlID0gJm1kYXRhLT5yZ2JfcGlwZXNba107CisKKwkJCWNudCA9IGJlMzJfdG9fY3B1KGFycltpKytdKTsKKwkJCWlmIChjbnQgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJZm9yIChqID0gMDsgaiA8IGNudDsgaisrKSB7CisJCQkJbW1iID0gYmUzMl90b19jcHUoYXJyW2krK10pOworCQkJCWlmIChtbWIgPiBtZGF0YS0+c21wX21iX2NudCkgeworCQkJCQlwcl9lcnIoIm92ZXJmbG93IG1tYiVkOiByZ2IlZDogbWF4JWRcbiIsCisJCQkJCQltbWIsIGssIG1kYXRhLT5zbXBfbWJfY250KTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCS8qIHJnYiBwaXBlcyBmZXRjaGVzIG9ubHkgc2luZ2xlIHBsYW5lICovCisJCQkJc2V0X2JpdChtbWIsIHBpcGUtPnNtcF9tYXBbMF0uZml4ZWQpOworCQkJfQorCQkJaWYgKGJpdG1hcF9pbnRlcnNlY3RzKHBpcGUtPnNtcF9tYXBbMF0uZml4ZWQsCisJCQkJbWRhdGEtPm1tYl9hbGxvY19tYXAsIG1kYXRhLT5zbXBfbWJfY250KSkgeworCQkJCXByX2Vycigib3ZlcmxhcHBpbmcgZml4ZWQgbW1iIG1hcFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQliaXRtYXBfb3IobWRhdGEtPm1tYl9hbGxvY19tYXAsIHBpcGUtPnNtcF9tYXBbMF0uZml4ZWQsCisJCQkJbWRhdGEtPm1tYl9hbGxvY19tYXAsIG1kYXRhLT5zbXBfbWJfY250KTsKKwkJfQorCX0KKworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBtZHNzX21kcF9wYXJzZV9kdF9taXNjKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwLmggYi9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwLmgKaW5kZXggN2JmMTRlNi4uZDhkYzZjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcC5oCisrKyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19tZHAuaApAQCAtMTgsOSArMTgsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L21zbV9tZHAuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogCiAjaW5jbHVkZSAibWRzcy5oIgogI2luY2x1ZGUgIm1kc3NfbWRwX2h3aW8uaCIKKyNpbmNsdWRlICJtZHNzX2ZiLmgiCiAKICNkZWZpbmUgTURTU19NRFBfREVGQVVMVF9JTlRSX01BU0sgMAogI2RlZmluZSBNRFNTX01EUF9DVVJTT1JfV0lEVEggNjQKQEAgLTE4Nyw2ICsxODksOSBAQAogCWludCAoKnJlbW92ZV92c3luY19oYW5kbGVyKSAoc3RydWN0IG1kc3NfbWRwX2N0bCAqLAogCQkJCQlzdHJ1Y3QgbWRzc19tZHBfdnN5bmNfaGFuZGxlciAqKTsKIAlpbnQgKCpjb25maWdfZnBzX2ZuYykgKHN0cnVjdCBtZHNzX21kcF9jdGwgKmN0bCwgaW50IG5ld19mcHMpOworCisJc3RydWN0IGJsb2NraW5nX25vdGlmaWVyX2hlYWQgbm90aWZpZXJfaGVhZDsKKwogCXZvaWQgKnByaXZfZGF0YTsKIAl1MzIgd2JfdHlwZTsKIH07CkBAIC0zMTEsOCArMzE2LDkgQEAKIH07CiAKIHN0cnVjdCBtZHNzX21kcF9waXBlX3NtcF9tYXAgewotCURFQ0xBUkVfQklUTUFQKHJlc2VydmVkLCBNRFNTX01EUF9TTVBfTU1CX0JMT0NLUyk7Ci0JREVDTEFSRV9CSVRNQVAoYWxsb2NhdGVkLCBNRFNTX01EUF9TTVBfTU1CX0JMT0NLUyk7CisJREVDTEFSRV9CSVRNQVAocmVzZXJ2ZWQsIE1BWF9EUlZfU1VQX01NQl9CTEtTKTsKKwlERUNMQVJFX0JJVE1BUChhbGxvY2F0ZWQsIE1BWF9EUlZfU1VQX01NQl9CTEtTKTsKKwlERUNMQVJFX0JJVE1BUChmaXhlZCwgTUFYX0RSVl9TVVBfTU1CX0JMS1MpOwogfTsKIAogc3RydWN0IG1kc3NfbWRwX3BpcGUgewpAQCAtMzI0LDYgKzMzMCw3IEBACiAJYXRvbWljX3QgcmVmX2NudDsKIAl1MzIgcGxheV9jbnQ7CiAJaW50IHBpZDsKKwlib29sIGlzX2hhbmRlZF9vZmY7CiAKIAl1MzIgZmxhZ3M7CiAJdTMyIGJ3Y19tb2RlOwpAQCAtMzkzLDYgKzQwMCw3IEBACiAJaW50IGZyZWVfbGlzdF9zaXplOwogCWludCBhZF9zdGF0ZTsKIAorCWJvb2wgaGFuZG9mZjsKIAl1MzIgc3BsYXNoX21lbV9hZGRyOwogCXUzMiBzcGxhc2hfbWVtX3NpemU7CiAJdTMyIHNkX2VuYWJsZWQ7CkBAIC00NjAsNyArNDY4LDE1IEBACiBzdHJ1Y3QgbWRzc19kYXRhX3R5cGUgKm1kc3NfbWRwX2dldF9tZGF0YSh2b2lkKTsKIAogaW50IG1kc3NfbWRwX292ZXJsYXlfaW5pdChzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkKTsKK2ludCBtZHNzX21kcF9vdmVybGF5X3JlcV9jaGVjayhzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkLAorCQkJICAgICAgIHN0cnVjdCBtZHBfb3ZlcmxheSAqcmVxLAorCQkJICAgICAgIHN0cnVjdCBtZHNzX21kcF9mb3JtYXRfcGFyYW1zICpmbXQpOwogaW50IG1kc3NfbWRwX292ZXJsYXlfdnN5bmNfY3RybChzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkLCBpbnQgZW4pOworaW50IG1kc3NfbWRwX292ZXJsYXlfZ2V0X2J1ZihzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkLAorCQkJICAgICBzdHJ1Y3QgbWRzc19tZHBfZGF0YSAqZGF0YSwKKwkJCSAgICAgc3RydWN0IG1zbWZiX2RhdGEgKnBsYW5lcywKKwkJCSAgICAgaW50IG51bV9wbGFuZXMsCisJCQkgICAgIHUzMiBmbGFncyk7CiBpbnQgbWRzc19tZHBfdmlkZW9fYWRkcl9zZXR1cChzdHJ1Y3QgbWRzc19kYXRhX3R5cGUgKm1kYXRhLAogCQl1MzIgKm9mZnNldHMsICB1MzIgY291bnQpOwogaW50IG1kc3NfbWRwX3ZpZGVvX3N0YXJ0KHN0cnVjdCBtZHNzX21kcF9jdGwgKmN0bCk7CkBAIC00NzEsOSArNDg3LDExIEBACiAKIHN0cnVjdCBtZHNzX21kcF9jdGwgKm1kc3NfbWRwX2N0bF9pbml0KHN0cnVjdCBtZHNzX3BhbmVsX2RhdGEgKnBkYXRhLAogCQkJCQlzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkKTsKLWludCBtZHNzX21kcF92aWRlb19yZWNvbmZpZ3VyZV9zcGxhc2hfZG9uZShzdHJ1Y3QgbWRzc19tZHBfY3RsICpjdGwpOwotaW50IG1kc3NfbWRwX2NtZF9yZWNvbmZpZ3VyZV9zcGxhc2hfZG9uZShzdHJ1Y3QgbWRzc19tZHBfY3RsICpjdGwpOwotaW50IG1kc3NfbWRwX2N0bF9zcGxhc2hfZmluaXNoKHN0cnVjdCBtZHNzX21kcF9jdGwgKmN0bCk7CitpbnQgbWRzc19tZHBfdmlkZW9fcmVjb25maWd1cmVfc3BsYXNoX2RvbmUoc3RydWN0IG1kc3NfbWRwX2N0bCAqY3RsLAorCQlib29sIGhhbmRvZmYpOworaW50IG1kc3NfbWRwX2NtZF9yZWNvbmZpZ3VyZV9zcGxhc2hfZG9uZShzdHJ1Y3QgbWRzc19tZHBfY3RsICpjdGwsCisJCWJvb2wgaGFuZG9mZik7CitpbnQgbWRzc19tZHBfY3RsX3NwbGFzaF9maW5pc2goc3RydWN0IG1kc3NfbWRwX2N0bCAqY3RsLCBib29sIGhhbmRvZmYpOwogaW50IG1kc3NfbWRwX2N0bF9zZXR1cChzdHJ1Y3QgbWRzc19tZHBfY3RsICpjdGwpOwogaW50IG1kc3NfbWRwX2N0bF9zcGxpdF9kaXNwbGF5X3NldHVwKHN0cnVjdCBtZHNzX21kcF9jdGwgKmN0bCwKIAkJc3RydWN0IG1kc3NfcGFuZWxfZGF0YSAqcGRhdGEpOwpAQCAtNDgzLDcgKzUwMSwxNCBAQAogaW50IG1kc3NfbWRwX2N0bF9pbnRmX2V2ZW50KHN0cnVjdCBtZHNzX21kcF9jdGwgKmN0bCwgaW50IGV2ZW50LCB2b2lkICphcmcpOwogaW50IG1kc3NfbWRwX3BlcmZfY2FsY19waXBlKHN0cnVjdCBtZHNzX21kcF9waXBlICpwaXBlLAogCQlzdHJ1Y3QgbWRzc19tZHBfcGVyZl9wYXJhbXMgKnBlcmYpOworaW50IG1kc3NfbWRwX2N0bF9ub3RpZnkoc3RydWN0IG1kc3NfbWRwX2N0bCAqY3RsLCBpbnQgZXZlbnQpOwordm9pZCBtZHNzX21kcF9jdGxfbm90aWZpZXJfcmVnaXN0ZXIoc3RydWN0IG1kc3NfbWRwX2N0bCAqY3RsLAorCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIpOwordm9pZCBtZHNzX21kcF9jdGxfbm90aWZpZXJfdW5yZWdpc3RlcihzdHJ1Y3QgbWRzc19tZHBfY3RsICpjdGwsCisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllcik7CiAKK2ludCBtZHNzX21kcF9taXhlcl9oYW5kb2ZmKHN0cnVjdCBtZHNzX21kcF9jdGwgKmN0bCwgdTMyIG51bSwKKwlzdHJ1Y3QgbWRzc19tZHBfcGlwZSAqcGlwZSk7CiBzdHJ1Y3QgbWRzc19tZHBfbWl4ZXIgKm1kc3NfbWRwX3diX21peGVyX2FsbG9jKGludCByb3RhdG9yKTsKIGludCBtZHNzX21kcF93Yl9taXhlcl9kZXN0cm95KHN0cnVjdCBtZHNzX21kcF9taXhlciAqbWl4ZXIpOwogc3RydWN0IG1kc3NfbWRwX21peGVyICptZHNzX21kcF9taXhlcl9nZXQoc3RydWN0IG1kc3NfbWRwX2N0bCAqY3RsLCBpbnQgbXV4KTsKQEAgLTUzNyw2ICs1NjIsOCBAQAogaW50IG1kc3NfbWRwX2NhbGliX21vZGUoc3RydWN0IG1zbV9mYl9kYXRhX3R5cGUgKm1mZCwKIAkJCQlzdHJ1Y3QgbWRzc19jYWxpYl9jZmcgKmNmZyk7CiAKK2ludCBtZHNzX21kcF9waXBlX2hhbmRvZmYoc3RydWN0IG1kc3NfbWRwX3BpcGUgKnBpcGUpOworaW50IG1kc3NfbWRwX3NtcF9oYW5kb2ZmKHN0cnVjdCBtZHNzX2RhdGFfdHlwZSAqbWRhdGEpOwogc3RydWN0IG1kc3NfbWRwX3BpcGUgKm1kc3NfbWRwX3BpcGVfYWxsb2Moc3RydWN0IG1kc3NfbWRwX21peGVyICptaXhlciwKIAkJCQkJICB1MzIgdHlwZSk7CiBzdHJ1Y3QgbWRzc19tZHBfcGlwZSAqbWRzc19tZHBfcGlwZV9nZXQoc3RydWN0IG1kc3NfZGF0YV90eXBlICptZGF0YSwgdTMyIG5keCk7CkBAIC01NzMsNiArNjAwLDcgQEAKIHN0cnVjdCBtZHNzX21kcF9mb3JtYXRfcGFyYW1zICptZHNzX21kcF9nZXRfZm9ybWF0X3BhcmFtcyh1MzIgZm9ybWF0KTsKIGludCBtZHNzX21kcF9wdXRfaW1nKHN0cnVjdCBtZHNzX21kcF9pbWdfZGF0YSAqZGF0YSk7CiBpbnQgbWRzc19tZHBfZ2V0X2ltZyhzdHJ1Y3QgbXNtZmJfZGF0YSAqaW1nLCBzdHJ1Y3QgbWRzc19tZHBfaW1nX2RhdGEgKmRhdGEpOworaW50IG1kc3NfbWRwX292ZXJsYXlfZnJlZV9idWYoc3RydWN0IG1kc3NfbWRwX2RhdGEgKmRhdGEpOwogdTMyIG1kc3NfZ2V0X3BhbmVsX2ZyYW1lcmF0ZShzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkKTsKIGludCBtZHNzX21kcF9jYWxjX3BoYXNlX3N0ZXAodTMyIHNyYywgdTMyIGRzdCwgdTMyICpvdXRfcGhhc2UpOwogdm9pZCBtZHNzX21kcF9pbnRlcnNlY3RfcmVjdChzdHJ1Y3QgbWRzc19tZHBfaW1nX3JlY3QgKnJlc19yZWN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF9jdGwuYyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19tZHBfY3RsLmMKaW5kZXggZTUwNTk4Zi4uODI5MzdlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF9jdGwuYworKysgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwX2N0bC5jCkBAIC0zODUsNiArMzg1LDcgQEAKIAkJCWN0bC0+cmVmX2NudCsrOwogCQkJY3RsLT5tZGF0YSA9IG1kYXRhOwogCQkJbXV0ZXhfaW5pdCgmY3RsLT5sb2NrKTsKKwkJCUJMT0NLSU5HX0lOSVRfTk9USUZJRVJfSEVBRCgmY3RsLT5ub3RpZmllcl9oZWFkKTsKIAkJCXByX2RlYnVnKCJhbGxvYyBjdGxfbnVtPSVkXG4iLCBjdGwtPm51bSk7CiAJCQlicmVhazsKIAkJfQpAQCAtNjEwLDEzICs2MTEsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IG1kc3NfbWRwX2N0bF9zcGxhc2hfZmluaXNoKHN0cnVjdCBtZHNzX21kcF9jdGwgKmN0bCkKK2ludCBtZHNzX21kcF9jdGxfc3BsYXNoX2ZpbmlzaChzdHJ1Y3QgbWRzc19tZHBfY3RsICpjdGwsIGJvb2wgaGFuZG9mZikKIHsKIAlzd2l0Y2ggKGN0bC0+cGFuZWxfZGF0YS0+cGFuZWxfaW5mby50eXBlKSB7CiAJY2FzZSBNSVBJX1ZJREVPX1BBTkVMOgotCQlyZXR1cm4gbWRzc19tZHBfdmlkZW9fcmVjb25maWd1cmVfc3BsYXNoX2RvbmUoY3RsKTsKKwkJcmV0dXJuIG1kc3NfbWRwX3ZpZGVvX3JlY29uZmlndXJlX3NwbGFzaF9kb25lKGN0bCwgaGFuZG9mZik7CiAJY2FzZSBNSVBJX0NNRF9QQU5FTDoKLQkJcmV0dXJuIG1kc3NfbWRwX2NtZF9yZWNvbmZpZ3VyZV9zcGxhc2hfZG9uZShjdGwpOworCQlyZXR1cm4gbWRzc19tZHBfY21kX3JlY29uZmlndXJlX3NwbGFzaF9kb25lKGN0bCwgaGFuZG9mZik7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTA3OCw5ICsxMDc5LDEyIEBACiAKIAlwcl9kZWJ1ZygiY3RsX251bT0lZFxuIiwgY3RsLT5udW0pOwogCi0Jbm1peGVycyA9IE1EU1NfTURQX0lOVEZfTUFYX0xBWUVSTUlYRVIgKyBNRFNTX01EUF9XQl9NQVhfTEFZRVJNSVhFUjsKLQlmb3IgKGkgPSAwOyBpIDwgbm1peGVyczsgaSsrKQotCQltZHNzX21kcF9jdGxfd3JpdGUoY3RsLCBNRFNTX01EUF9SRUdfQ1RMX0xBWUVSKGkpLCAwKTsKKwlpZiAoIWN0bC0+cGFuZWxfZGF0YS0+cGFuZWxfaW5mby5jb250X3NwbGFzaF9lbmFibGVkKSB7CisJCW5taXhlcnMgPSBNRFNTX01EUF9JTlRGX01BWF9MQVlFUk1JWEVSICsKKwkJCU1EU1NfTURQX1dCX01BWF9MQVlFUk1JWEVSOworCQlmb3IgKGkgPSAwOyBpIDwgbm1peGVyczsgaSsrKQorCQkJbWRzc19tZHBfY3RsX3dyaXRlKGN0bCwgTURTU19NRFBfUkVHX0NUTF9MQVlFUihpKSwgMCk7CisJfQogCiAJbWl4ZXIgPSBjdGwtPm1peGVyX2xlZnQ7CiAJbWRzc19tZHBfcHBfcmVzdW1lKGN0bCwgbWl4ZXItPm51bSk7CkBAIC0xODcwLDYgKzE4NzQsMTEgQEAKIAkJfQogCX0KIAorCW1kc3NfbWRwX2N0bF9ub3RpZnkoY3RsLCBNRFBfTk9USUZZX0ZSQU1FX1JFQURZKTsKKworCWlmIChjdGwtPndhaXRfcGluZ3BvbmcpCisJCWN0bC0+d2FpdF9waW5ncG9uZyhjdGwsIE5VTEwpOworCiAJLyogcG9zdHByb2Nlc3Npbmcgc2V0dXAsIGluY2x1ZGluZyBkc3BwICovCiAJbWRzc19tZHBfcHBfc2V0dXBfbG9ja2VkKGN0bCk7CiAJbWRzc19tZHBfY3RsX3dyaXRlKGN0bCwgTURTU19NRFBfUkVHX0NUTF9GTFVTSCwgY3RsLT5mbHVzaF9iaXRzKTsKQEAgLTE4OTUsNiArMTkwNCwyMyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3ZvaWQgbWRzc19tZHBfY3RsX25vdGlmaWVyX3JlZ2lzdGVyKHN0cnVjdCBtZHNzX21kcF9jdGwgKmN0bCwKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyKQoreworCWJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZjdGwtPm5vdGlmaWVyX2hlYWQsIG5vdGlmaWVyKTsKK30KKwordm9pZCBtZHNzX21kcF9jdGxfbm90aWZpZXJfdW5yZWdpc3RlcihzdHJ1Y3QgbWRzc19tZHBfY3RsICpjdGwsCisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllcikKK3sKKwlibG9ja2luZ19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZjdGwtPm5vdGlmaWVyX2hlYWQsIG5vdGlmaWVyKTsKK30KKworaW50IG1kc3NfbWRwX2N0bF9ub3RpZnkoc3RydWN0IG1kc3NfbWRwX2N0bCAqY3RsLCBpbnQgZXZlbnQpCit7CisJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmN0bC0+bm90aWZpZXJfaGVhZCwgZXZlbnQsIGN0bCk7Cit9CisKIGludCBtZHNzX21kcF9nZXRfY3RsX21peGVycyh1MzIgZmJfbnVtLCB1MzIgKm1peGVyX2lkKQogewogCWludCBpOwpAQCAtMTk2NSwzICsxOTkxLDY2IEBACiAJCQkJTURTU19NRFBfSU5URl9MQVlFUk1JWEVSMyk7CiAJfQogfQorCitzdGF0aWMgaW50IF9fbWRzc19tZHBfbWl4ZXJfaGFuZG9mZl9oZWxwZXIoc3RydWN0IG1kc3NfbWRwX21peGVyICptaXhlciwKKwlzdHJ1Y3QgbWRzc19tZHBfcGlwZSAqcGlwZSkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKCFtaXhlcikgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKG1peGVyLT5zdGFnZV9waXBlW01EU1NfTURQX1NUQUdFX1VOVVNFRF0gIT0gTlVMTCkgeworCQlwcl9lcnIoIk1vcmUgdGhhbiBvbmUgcGlwZSBzdGFnZWQgb24gbWl4ZXIgbnVtICVkXG4iLAorCQkJbWl4ZXItPm51bSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlwcl9kZWJ1ZygiU3RhZ2luZyBwaXBlIG51bSAlZCBvbiBtaXhlciBudW0gJWRcbiIsCisJCXBpcGUtPm51bSwgbWl4ZXItPm51bSk7CisJbWl4ZXItPnN0YWdlX3BpcGVbTURTU19NRFBfU1RBR0VfVU5VU0VEXSA9IHBpcGU7CisJcGlwZS0+bWl4ZXIgPSBtaXhlcjsKKwlwaXBlLT5taXhlcl9zdGFnZSA9IE1EU1NfTURQX1NUQUdFX1VOVVNFRDsKKworZXJyb3I6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIG1kc3NfbWRwX21peGVyX2hhbmRvZmYoKSAtIFN0YWdlcyBhIGdpdmVuIHBpcGUgb24gdGhlIGFwcHJvcHJpYXRlIG1peGVyCisgKiBAY3RsOiAgcG9pbnRlciB0byB0aGUgY29udHJvbCBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvdmVybGF5IGRldmljZS4KKyAqIEBudW06ICB0aGUgbWl4ZXIgbnVtYmVyIG9uIHdoaWNoIHRoZSBwaXBlIG5lZWRzIHRvIGJlIHN0YWdlZC4KKyAqIEBwaXBlOiBwb2ludGVyIHRvIHRoZSBwaXBlIHRvIGJlIHN0YWdlZC4KKyAqCisgKiBGdW5jdGlvbiBzdGFnZXMgYSBnaXZlbiBwaXBlIG9uIGVpdGhlciB0aGUgbGVmdCBtaXhlciBvciB0aGUgcmlnaHQgbWl4ZXIKKyAqIGZvciB0aGUgY29udHJvbCBzdHJ1Y3RyZSBiYXNlZCBvbiB0aGUgbWl4ZXIgbnVtYmVyLiBJZiB0aGUgaW5wdXQgbWl4ZXIKKyAqIG51bWJlciBkb2VzIG5vdCBtYXRjaCBlaXRoZXIgb2YgdGhlIG1peGVycyB0aGVuIGFuIGVycm9yIGlzIHJldHVybmVkLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIG92ZXJsYXkgaGFuZG9mZiB3aGVuIGNlcnRhaW4gcGlwZXMgYXJlCisgKiBhbHJlYWR5IHN0YWdlZCBieSB0aGUgYm9vdGxvYWRlci4KKyAqLworaW50IG1kc3NfbWRwX21peGVyX2hhbmRvZmYoc3RydWN0IG1kc3NfbWRwX2N0bCAqY3RsLCB1MzIgbnVtLAorCXN0cnVjdCBtZHNzX21kcF9waXBlICpwaXBlKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG1kc3NfbWRwX21peGVyICpteF9sZWZ0ID0gY3RsLT5taXhlcl9sZWZ0OworCXN0cnVjdCBtZHNzX21kcF9taXhlciAqbXhfcmlnaHQgPSBjdGwtPm1peGVyX3JpZ2h0OworCisJLyoKKwkgKiBGb3IgcGVyZm9ybWFuY2UgY2FsY3VsYXRpb25zLCBzdGFnZSB0aGUgaGFuZGVkIG9mZiBwaXBlCisJICogYXMgTURTU19NRFBfU1RBR0VfVU5VU0VECisJICovCisJaWYgKG14X2xlZnQgJiYgKG14X2xlZnQtPm51bSA9PSBudW0pKSB7CisJCXJjID0gX19tZHNzX21kcF9taXhlcl9oYW5kb2ZmX2hlbHBlcihteF9sZWZ0LCBwaXBlKTsKKwl9IGVsc2UgaWYgKG14X3JpZ2h0ICYmIChteF9yaWdodC0+bnVtID09IG51bSkpIHsKKwkJcmMgPSBfX21kc3NfbWRwX21peGVyX2hhbmRvZmZfaGVscGVyKG14X3JpZ2h0LCBwaXBlKTsKKwl9IGVsc2UgeworCQlwcl9lcnIoInBpcGUgbnVtICVkIHN0YWdlZCBvbiB1bmFsbG9jYXRlZCBtaXhlciBudW0gJWRcbiIsCisJCQlwaXBlLT5udW0sIG51bSk7CisJCXJjID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwX2h3aW8uaCBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19tZHBfaHdpby5oCmluZGV4IDk0MGQ2YzkuLmM4YWY5MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19tZHBfaHdpby5oCisrKyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19tZHBfaHdpby5oCkBAIC00MTksOCArNDE5LDYgQEAKIAlNRFNTX01EUF9NQVhfSU5URgogfTsKIAotI2RlZmluZSBNRFNTX01EUF9SRUdfSU5URl9PRkZTRVQoaW50ZikJCSgweDIwRjAwICsgKChpbnRmKSAqIDB4MjAwKSkKLQogI2RlZmluZSBNRFNTX01EUF9SRUdfSU5URl9USU1JTkdfRU5HSU5FX0VOCQkweDAwMAogI2RlZmluZSBNRFNTX01EUF9SRUdfSU5URl9DT05GSUcJCQkweDAwNAogI2RlZmluZSBNRFNTX01EUF9SRUdfSU5URl9IU1lOQ19DVEwJCQkweDAwOApAQCAtNDk5LDggKzQ5Nyw2IEBACiAjZGVmaW5lIE1EU1NfTURQX1JFR19TTVBfQUxMT0NfVzAJCQkweDAwMTgwCiAjZGVmaW5lIE1EU1NfTURQX1JFR19TTVBfQUxMT0NfUjAJCQkweDAwMjMwCiAKLSNkZWZpbmUgTURTU19NRFBfU01QX01NQl9CTE9DS1MJCQk0NAotCiAjZGVmaW5lIE1EU1NfTURQX0xQX01JU1JfU0VMCQkJMHg0NTAKICNkZWZpbmUgTURTU19NRFBfTFBfTUlTUl9DVFJMX01EUAkJMHg0NTQKICNkZWZpbmUgTURTU19NRFBfTFBfTUlTUl9DVFJMX0hETUkJCTB4NDU4CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwX2ludGZfY21kLmMgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwX2ludGZfY21kLmMKaW5kZXggZTA3MTdhZC4uNjA1NmYyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF9pbnRmX2NtZC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19tZHBfaW50Zl9jbWQuYwpAQCAtMTIsOSArMTIsOSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlICJtZHNzX3BhbmVsLmgiCisKICNpbmNsdWRlICJtZHNzX21kcC5oIgotI2luY2x1ZGUgIm1kc3NfZHNpLmgiCisjaW5jbHVkZSAibWRzc19wYW5lbC5oIgogCiAjZGVmaW5lIFZTWU5DX0VYUElSRV9USUNLIDQKIApAQCAtNDMsNiArNDMsOSBAQAogCXN0cnVjdCBtdXRleCBjbGtfbXR4OwogCXNwaW5sb2NrX3QgY2xrX2xvY2s7CiAJc3RydWN0IHdvcmtfc3RydWN0IGNsa193b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBwcF9kb25lX3dvcms7CisJYXRvbWljX3QgcHBfZG9uZV9jbnQ7CisKIAkvKiB0ZSBjb25maWcgKi8KIAl1OCB0ZWFyX2NoZWNrOwogCXUxNiBoZWlnaHQ7CS8qIHBhbmVsIGhlaWdodCAqLwpAQCAtMzExLDYgKzMxNCw4IEBACiAJY29tcGxldGVfYWxsKCZjdHgtPnBwX2NvbXApOwogCiAJaWYgKGN0eC0+a29mZl9jbnQpIHsKKwkJYXRvbWljX2luYygmY3R4LT5wcF9kb25lX2NudCk7CisJCXNjaGVkdWxlX3dvcmsoJmN0eC0+cHBfZG9uZV93b3JrKTsKIAkJY3R4LT5rb2ZmX2NudC0tOwogCQlpZiAoY3R4LT5rb2ZmX2NudCkgewogCQkJcHJfZXJyKCIlczogdG9vIG1hbnkga2lja29mZnM9JWQhXG4iLCBfX2Z1bmNfXywKQEAgLTMyNiw2ICszMzEsMTYgQEAKIAlzcGluX3VubG9jaygmY3R4LT5jbGtfbG9jayk7CiB9CiAKK3N0YXRpYyB2b2lkIHBpbmdwb25nX2RvbmVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG1kc3NfbWRwX2NtZF9jdHggKmN0eCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCB0eXBlb2YoKmN0eCksIHBwX2RvbmVfd29yayk7CisKKwlpZiAoY3R4LT5jdGwpCisJCXdoaWxlIChhdG9taWNfYWRkX3VubGVzcygmY3R4LT5wcF9kb25lX2NudCwgLTEsIDApKQorCQkJbWRzc19tZHBfY3RsX25vdGlmeShjdHgtPmN0bCwgTURQX05PVElGWV9GUkFNRV9ET05FKTsKK30KKwogc3RhdGljIHZvaWQgY2xrX2N0cmxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IG1kc3NfbWRwX2NtZF9jdHggKmN0eCA9CkBAIC0zOTksNyArNDE0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IG1kc3NfbWRwX2NtZF9yZWNvbmZpZ3VyZV9zcGxhc2hfZG9uZShzdHJ1Y3QgbWRzc19tZHBfY3RsICpjdGwpCitpbnQgbWRzc19tZHBfY21kX3JlY29uZmlndXJlX3NwbGFzaF9kb25lKHN0cnVjdCBtZHNzX21kcF9jdGwgKmN0bCwgYm9vbCBoYW5kb2ZmKQogewogCXN0cnVjdCBtZHNzX3BhbmVsX2RhdGEgKnBkYXRhOwogCWludCByZXQgPSAwOwpAQCAtNDQ2LDggKzQ2MSwxMCBAQAogCQkJV0FSTigxLCAiY21kIGtpY2tvZmYgdGltZWQgb3V0ICglZCkgY3RsPSVkXG4iLAogCQkJCQkJcmMsIGN0bC0+bnVtKTsKIAkJCXJjID0gLUVQRVJNOwotCQl9IGVsc2UKKwkJCW1kc3NfbWRwX2N0bF9ub3RpZnkoY3RsLCBNRFBfTk9USUZZX0ZSQU1FX1RJTUVPVVQpOworCQl9IGVsc2UgewogCQkJcmMgPSAwOworCQl9CiAJfQogCiAJcmV0dXJuIHJjOwpAQCAtNTI1LDYgKzU0MiwxMCBAQAogCQlwcl9lcnIoImludmFsaWQgY3R4XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhhbmRsZSwgdG1wLCAmY3R4LT52c3luY19oYW5kbGVycywgbGlzdCkKKwkJbWRzc19tZHBfY21kX3JlbW92ZV92c3luY19oYW5kbGVyKGN0bCwgaGFuZGxlKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZjdHgtPmNsa19sb2NrLCBmbGFncyk7CiAJaWYgKGN0eC0+cmRwdHJfZW5hYmxlZCkgewogCQlJTklUX0NPTVBMRVRJT04oY3R4LT5zdG9wX2NvbXApOwpAQCAtNTQyLDEwICs1NjMsOSBAQAogCiAJbWRzc19tZHBfY21kX2Nsa19vZmYoY3R4KTsKIAotCWN0eC0+cGFuZWxfb24gPSAwOworCWZsdXNoX3dvcmsoJmN0eC0+cHBfZG9uZV93b3JrKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShoYW5kbGUsIHRtcCwgJmN0eC0+dnN5bmNfaGFuZGxlcnMsIGxpc3QpCi0JCW1kc3NfbWRwX2NtZF9yZW1vdmVfdnN5bmNfaGFuZGxlcihjdGwsIGhhbmRsZSk7CisJY3R4LT5wYW5lbF9vbiA9IDA7CiAKIAltZHNzX21kcF9zZXRfaW50cl9jYWxsYmFjayhNRFNTX01EUF9JUlFfUElOR19QT05HX1JEX1BUUiwgY3R4LT5wcF9udW0sCiAJCQkJICAgTlVMTCwgTlVMTCk7CkBAIC02MTEsNiArNjMxLDggQEAKIAlzcGluX2xvY2tfaW5pdCgmY3R4LT5jbGtfbG9jayk7CiAJbXV0ZXhfaW5pdCgmY3R4LT5jbGtfbXR4KTsKIAlJTklUX1dPUksoJmN0eC0+Y2xrX3dvcmssIGNsa19jdHJsX3dvcmspOworCUlOSVRfV09SSygmY3R4LT5wcF9kb25lX3dvcmssIHBpbmdwb25nX2RvbmVfd29yayk7CisJYXRvbWljX3NldCgmY3R4LT5wcF9kb25lX2NudCwgMCk7CiAJSU5JVF9MSVNUX0hFQUQoJmN0eC0+dnN5bmNfaGFuZGxlcnMpOwogCiAJY3R4LT5yZWNvdmVyeS5meG4gPSBtZHNzX21kcF9jbWRfdW5kZXJmbG93X3JlY292ZXJ5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF9pbnRmX3ZpZGVvLmMgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwX2ludGZfdmlkZW8uYwppbmRleCBhMDQwNzg1Li43Yzc5Y2ViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwX2ludGZfdmlkZW8uYworKysgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwX2ludGZfdmlkZW8uYwpAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSAibWRzc19mYi5oIgogI2luY2x1ZGUgIm1kc3NfbWRwLmgiCisjaW5jbHVkZSAibWRzc19wYW5lbC5oIgogCiAvKiB3YWl0IGZvciBhdCBsZWFzdCAyIHZzeW5jcyBmb3IgbG93ZXN0IHJlZnJlc2ggcmF0ZSAoMjRoeikgKi8KICNkZWZpbmUgVlNZTkNfVElNRU9VVF9VUyAxMDAwMDAKQEAgLTQyOCw2ICs0MjksOSBAQAogCQl9IGVsc2UgewogCQkJcmMgPSAwOwogCQl9CisKKwkJbWRzc19tZHBfY3RsX25vdGlmeShjdGwsCisJCQlyYyA/IE1EUF9OT1RJRllfRlJBTUVfVElNRU9VVCA6IE1EUF9OT1RJRllfRlJBTUVfRE9ORSk7CiAJfQogCiAJaWYgKGN0eC0+d2FpdF9wZW5kaW5nKSB7CkBAIC01ODMsNDYgKzU4Nyw1MiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgbWRzc19tZHBfdmlkZW9fcmVjb25maWd1cmVfc3BsYXNoX2RvbmUoc3RydWN0IG1kc3NfbWRwX2N0bCAqY3RsKQoraW50IG1kc3NfbWRwX3ZpZGVvX3JlY29uZmlndXJlX3NwbGFzaF9kb25lKHN0cnVjdCBtZHNzX21kcF9jdGwgKmN0bCwKKwlib29sIGhhbmRvZmYpCiB7Ci0Jc3RydWN0IG1kc3NfcGFuZWxfZGF0YSAqcGRhdGE7Ci0JaW50IHJldCA9IDAsIG9mZjsKLQlpbnQgbWRzc19tZHBfcmV2ID0gTURTU19NRFBfUkVHX1JFQUQoTURTU19NRFBfUkVHX0hXX1ZFUlNJT04pOwotCWludCBtZHNzX3YyX2ludGZfb2ZmID0gMDsKKwlzdHJ1Y3QgbWRzc19wYW5lbF9kYXRhICpwZGF0YSA9IGN0bC0+cGFuZWxfZGF0YTsKKwlpbnQgaSwgcmV0ID0gMDsKIAlzdHJ1Y3QgbWRzc19vdmVybGF5X3ByaXZhdGUgKm1kcDVfZGF0YSA9IG1mZF90b19tZHA1X2RhdGEoY3RsLT5tZmQpOworCXN0cnVjdCBtZHNzX21kcF92aWRlb19jdHggKmN0eDsKKwlzdHJ1Y3QgbWRzc19kYXRhX3R5cGUgKm1kYXRhID0gY3RsLT5tZGF0YTsKIAotCW9mZiA9IDA7Ci0KLQlwZGF0YSA9IGN0bC0+cGFuZWxfZGF0YTsKLQotCXBkYXRhLT5wYW5lbF9pbmZvLmNvbnRfc3BsYXNoX2VuYWJsZWQgPSAwOwotCi0JcmV0ID0gbWRzc19tZHBfY3RsX2ludGZfZXZlbnQoY3RsLCBNRFNTX0VWRU5UX0NPTlRfU1BMQVNIX0JFR0lOLAotCQkJCSAgICAgIE5VTEwpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGhhbmRsZSAnQ09OVF9TUExBU0hfQkVHSU4nIGV2ZW50XG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7CisJaSA9IGN0bC0+aW50Zl9udW0gLSBNRFNTX01EUF9JTlRGMDsKKwlpZiAoaSA8IG1kYXRhLT5uaW50ZikgeworCQljdHggPSAoKHN0cnVjdCBtZHNzX21kcF92aWRlb19jdHggKikgbWRhdGEtPnZpZGVvX2ludGYpICsgaTsKKwkJcHJfZGVidWcoInZpZGVvIEludGYgIyVkIGJhc2U9JXAiLCBjdHgtPmludGZfbnVtLCBjdHgtPmJhc2UpOworCX0gZWxzZSB7CisJCXByX2VycigiSW52YWxpZCBpbnRmIG51bWJlcjogJWRcbiIsIGN0bC0+aW50Zl9udW0pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOwogCX0KIAotCW1kc3NfbWRwX2N0bF93cml0ZShjdGwsIDAsIE1EU1NfTURQX0xNX0JPUkRFUl9DT0xPUik7Ci0Jb2ZmID0gTURTU19NRFBfUkVHX0lOVEZfT0ZGU0VUKGN0bC0+aW50Zl9udW0pOworCWlmICghaGFuZG9mZikgeworCQlyZXQgPSBtZHNzX21kcF9jdGxfaW50Zl9ldmVudChjdGwsIE1EU1NfRVZFTlRfQ09OVF9TUExBU0hfQkVHSU4sCisJCQkJCSAgICAgIE5VTEwpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gaGFuZGxlICdDT05UX1NQTEFTSF9CRUdJTicgZXZlbnRcbiIKKwkJCQksIF9fZnVuY19fKTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAotCWlmIChtZHNzX21kcF9yZXYgPj0gTURTU19NRFBfSFdfUkVWXzEwMikKLQkJbWRzc192Ml9pbnRmX29mZiA9ICAweEVDMDA7CisJCW1kc3NfbWRwX2N0bF93cml0ZShjdGwsIDAsIE1EU1NfTURQX0xNX0JPUkRFUl9DT0xPUik7CisJCW1kcF92aWRlb193cml0ZShjdHgsIE1EU1NfTURQX1JFR19JTlRGX1RJTUlOR19FTkdJTkVfRU4sIDApOwogCi0JTURTU19NRFBfUkVHX1dSSVRFKG9mZiArIE1EU1NfTURQX1JFR19JTlRGX1RJTUlOR19FTkdJTkVfRU4gLQotCQkJbWRzc192Ml9pbnRmX29mZiwgMCk7Ci0JLyogd2FpdCBmb3IgMSBWU1lOQyBmb3IgdGhlIHBpcGUgdG8gYmUgdW5zdGFnZWQgKi8KLQltc2xlZXAoMjApOworCQkvKiB3YWl0IGZvciAxIFZTWU5DIGZvciB0aGUgcGlwZSB0byBiZSB1bnN0YWdlZCAqLworCQltc2xlZXAoMjApOworCisJCXJldCA9IG1kc3NfbWRwX2N0bF9pbnRmX2V2ZW50KGN0bCwKKwkJCU1EU1NfRVZFTlRfQ09OVF9TUExBU0hfRklOSVNILCBOVUxMKTsKKwl9CisKK2Vycm9yOgorCXBkYXRhLT5wYW5lbF9pbmZvLmNvbnRfc3BsYXNoX2VuYWJsZWQgPSAwOwogCiAJLyogR2l2ZSBiYWNrIHRoZSByZXNlcnZlZCBtZW1vcnkgdG8gdGhlIHN5c3RlbSAqLwogCW1lbWJsb2NrX2ZyZWUobWRwNV9kYXRhLT5zcGxhc2hfbWVtX2FkZHIsIG1kcDVfZGF0YS0+c3BsYXNoX21lbV9zaXplKTsKIAlmcmVlX2Jvb3RtZW1fbGF0ZShtZHA1X2RhdGEtPnNwbGFzaF9tZW1fYWRkciwKIAkJCQkgbWRwNV9kYXRhLT5zcGxhc2hfbWVtX3NpemUpOwogCi0JcmV0ID0gbWRzc19tZHBfY3RsX2ludGZfZXZlbnQoY3RsLCBNRFNTX0VWRU5UX0NPTlRfU1BMQVNIX0ZJTklTSCwKLQkJCU5VTEwpOwogCW1kc3NfbWRwX2Nsa19jdHJsKE1EUF9CTE9DS19QT1dFUl9PRkYsIGZhbHNlKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF9pbnRmX3dyaXRlYmFjay5jIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF9pbnRmX3dyaXRlYmFjay5jCmluZGV4IDdmODcyYjQuLjM5Mjk1MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19tZHBfaW50Zl93cml0ZWJhY2suYworKysgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwX2ludGZfd3JpdGViYWNrLmMKQEAgLTEzLDkgKzEzLDkgQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KQkiJXM6ICIgZm10LCBfX2Z1bmNfXwogCi0jaW5jbHVkZSAibWRzc19mYi5oIgogI2luY2x1ZGUgIm1kc3NfbWRwLmgiCiAjaW5jbHVkZSAibWRzc19tZHBfcm90YXRvci5oIgorI2luY2x1ZGUgIm1kc3NfcGFuZWwuaCIKIAogZW51bSBtZHNzX21kcF93cml0ZWJhY2tfdHlwZSB7CiAJTURTU19NRFBfV1JJVEVCQUNLX1RZUEVfUk9UQVRPUiwKQEAgLTQyMSwxMCArNDIxLDEyIEBACiAJCU5VTEwsIE5VTEwpOwogCiAJaWYgKHJjID09IDApIHsKKwkJbWRzc19tZHBfY3RsX25vdGlmeShjdGwsIE1EUF9OT1RJRllfRlJBTUVfVElNRU9VVCk7CiAJCXJjID0gLUVOT0RFVjsKIAkJV0FSTigxLCAid3JpdGViYWNrIGtpY2tvZmYgdGltZWQgb3V0ICglZCkgY3RsPSVkXG4iLAogCQkJCQkJcmMsIGN0bC0+bnVtKTsKIAl9IGVsc2UgeworCQltZHNzX21kcF9jdGxfbm90aWZ5KGN0bCwgTURQX05PVElGWV9GUkFNRV9ET05FKTsKIAkJcmMgPSAwOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF9vdmVybGF5LmMgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwX292ZXJsYXkuYwppbmRleCAxNTg0OTI1Li5jNTY1ZDk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwX292ZXJsYXkuYworKysgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwX292ZXJsYXkuYwpAQCAtOTIsOSArOTIsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1kc3NfbWRwX292ZXJsYXlfcmVxX2NoZWNrKHN0cnVjdCBtc21fZmJfZGF0YV90eXBlICptZmQsCi0JCQkJICAgICAgc3RydWN0IG1kcF9vdmVybGF5ICpyZXEsCi0JCQkJICAgICAgc3RydWN0IG1kc3NfbWRwX2Zvcm1hdF9wYXJhbXMgKmZtdCkKK2ludCBtZHNzX21kcF9vdmVybGF5X3JlcV9jaGVjayhzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkLAorCQkJICAgICAgIHN0cnVjdCBtZHBfb3ZlcmxheSAqcmVxLAorCQkJICAgICAgIHN0cnVjdCBtZHNzX21kcF9mb3JtYXRfcGFyYW1zICpmbXQpCiB7CiAJdTMyIHhyZXMsIHlyZXM7CiAJdTMyIG1pbl9zcmNfc2l6ZSwgbWluX2RzdF9zaXplOwpAQCAtMjUwLDg0ICsyNTAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1kc3NfbWRwX292ZXJsYXlfcm90YXRvcl9zZXR1cChzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkLAotCQkJCQkgIHN0cnVjdCBtZHBfb3ZlcmxheSAqcmVxKQotewotCXN0cnVjdCBtZHNzX292ZXJsYXlfcHJpdmF0ZSAqbWRwNV9kYXRhID0gbWZkX3RvX21kcDVfZGF0YShtZmQpOwotCXN0cnVjdCBtZHNzX21kcF9yb3RhdG9yX3Nlc3Npb24gKnJvdDsKLQlzdHJ1Y3QgbWRzc19tZHBfZm9ybWF0X3BhcmFtcyAqZm10OwotCWludCByZXQgPSAwOwotCXUzMiBid2NfZW5hYmxlZDsKLQotCXByX2RlYnVnKCJyb3QgY3RsPSV1IHJlcSBpZD0leFxuIiwgbWRwNV9kYXRhLT5jdGwtPm51bSwgcmVxLT5pZCk7Ci0KLQlmbXQgPSBtZHNzX21kcF9nZXRfZm9ybWF0X3BhcmFtcyhyZXEtPnNyYy5mb3JtYXQpOwotCWlmICghZm10KSB7Ci0JCXByX2VycigiaW52YWxpZCByb3QgZm9ybWF0ICVkXG4iLCByZXEtPnNyYy5mb3JtYXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSBtZHNzX21kcF9vdmVybGF5X3JlcV9jaGVjayhtZmQsIHJlcSwgZm10KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKHJlcS0+aWQgPT0gTVNNRkJfTkVXX1JFUVVFU1QpIHsKLQkJcm90ID0gbWRzc19tZHBfcm90YXRvcl9zZXNzaW9uX2FsbG9jKCk7Ci0JCXJvdC0+cGlkID0gY3VycmVudC0+dGdpZDsKLQkJbGlzdF9hZGQoJnJvdC0+bGlzdCwgJm1kcDVfZGF0YS0+cm90X3Byb2NfbGlzdCk7Ci0KLQkJaWYgKCFyb3QpIHsKLQkJCXByX2VycigidW5hYmxlIHRvIGFsbG9jYXRlIHJvdGF0b3Igc2Vzc2lvblxuIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCX0gZWxzZSBpZiAocmVxLT5pZCAmIE1EU1NfTURQX1JPVF9TRVNTSU9OX01BU0spIHsKLQkJcm90ID0gbWRzc19tZHBfcm90YXRvcl9zZXNzaW9uX2dldChyZXEtPmlkKTsKLQotCQlpZiAoIXJvdCkgewotCQkJcHJfZXJyKCJyb3RhdG9yIHNlc3Npb249JXggbm90IGZvdW5kXG4iLCByZXEtPmlkKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCJpbnZhbGlkIHJvdGF0b3Igc2Vzc2lvbiBpZD0leFxuIiwgcmVxLT5pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIGtlZXAgb25seSBmbGFncyBvZiBpbnRlcmVzdCB0byByb3RhdG9yICovCi0Jcm90LT5mbGFncyA9IHJlcS0+ZmxhZ3MgJiAoTURQX1JPVF85MCB8IE1EUF9GTElQX0xSIHwgTURQX0ZMSVBfVUQgfAotCQkJCSAgIE1EUF9TRUNVUkVfT1ZFUkxBWV9TRVNTSU9OKTsKLQotCWJ3Y19lbmFibGVkID0gcmVxLT5mbGFncyAmIE1EUF9CV0NfRU47Ci0JaWYgKGJ3Y19lbmFibGVkICAmJiAgIW1kcDVfZGF0YS0+bWRhdGEtPmhhc19id2MpIHsKLQkJcHJfZXJyKCJCV0MgaXMgbm90IHN1cHBvcnRlZCBpbiBNRFAgdmVyc2lvbiAleFxuIiwKLQkJCW1kcDVfZGF0YS0+bWRhdGEtPm1kcF9yZXYpOwotCQlyb3QtPmJ3Y19tb2RlID0gMDsKLQl9IGVsc2UgewotCQlyb3QtPmJ3Y19tb2RlID0gYndjX2VuYWJsZWQgPyAxIDogMDsKLQl9Ci0Jcm90LT5mb3JtYXQgPSBmbXQtPmZvcm1hdDsKLQlyb3QtPmltZ193aWR0aCA9IHJlcS0+c3JjLndpZHRoOwotCXJvdC0+aW1nX2hlaWdodCA9IHJlcS0+c3JjLmhlaWdodDsKLQlyb3QtPnNyY19yZWN0LnggPSByZXEtPnNyY19yZWN0Lng7Ci0Jcm90LT5zcmNfcmVjdC55ID0gcmVxLT5zcmNfcmVjdC55OwotCXJvdC0+c3JjX3JlY3QudyA9IHJlcS0+c3JjX3JlY3QudzsKLQlyb3QtPnNyY19yZWN0LmggPSByZXEtPnNyY19yZWN0Lmg7Ci0KLQlpZiAocmVxLT5mbGFncyAmIE1EUF9ERUlOVEVSTEFDRSkgewotCQlyb3QtPmZsYWdzIHw9IE1EUF9ERUlOVEVSTEFDRTsKLQkJcm90LT5zcmNfcmVjdC5oIC89IDI7Ci0JfQotCi0JcmV0ID0gbWRzc19tZHBfcm90YXRvcl9zZXR1cChyb3QpOwotCWlmIChyZXQgPT0gMCkgewotCQlyZXEtPmlkID0gcm90LT5zZXNzaW9uX2lkOwotCX0gZWxzZSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIHNldHVwIHJvdGF0b3Igc2Vzc2lvblxuIik7Ci0JCW1kc3NfbWRwX3JvdGF0b3JfcmVsZWFzZShyb3QpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQgX19tZHBfcGlwZV90dW5lX3BlcmYoc3RydWN0IG1kc3NfbWRwX3BpcGUgKnBpcGUpCiB7CiAJc3RydWN0IG1kc3NfZGF0YV90eXBlICptZGF0YSA9IHBpcGUtPm1peGVyLT5jdGwtPm1kYXRhOwpAQCAtNjcwLDcgKzU5Miw3IEBACiAJfQogCiAJaWYgKHJlcS0+ZmxhZ3MgJiBNRFNTX01EUF9ST1RfT05MWSkgewotCQlyZXQgPSBtZHNzX21kcF9vdmVybGF5X3JvdGF0b3Jfc2V0dXAobWZkLCByZXEpOworCQlyZXQgPSBtZHNzX21kcF9yb3RhdG9yX3NldHVwKG1mZCwgcmVxKTsKIAl9IGVsc2UgaWYgKHJlcS0+c3JjLmZvcm1hdCA9PSBNRFBfUkdCX0JPUkRFUkZJTEwpIHsKIAkJcmVxLT5pZCA9IEJPUkRFUkZJTExfTkRYOwogCX0gZWxzZSB7CkBAIC02ODksNyArNjExLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtZHNzX21kcF9vdmVybGF5X2dldF9idWYoc3RydWN0IG1zbV9mYl9kYXRhX3R5cGUgKm1mZCwKK2ludCBtZHNzX21kcF9vdmVybGF5X2dldF9idWYoc3RydWN0IG1zbV9mYl9kYXRhX3R5cGUgKm1mZCwKIAkJCQkJICAgc3RydWN0IG1kc3NfbWRwX2RhdGEgKmRhdGEsCiAJCQkJCSAgIHN0cnVjdCBtc21mYl9kYXRhICpwbGFuZXMsCiAJCQkJCSAgIGludCBudW1fcGxhbmVzLApAQCAtNzE5LDcgKzY0MSw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtZHNzX21kcF9vdmVybGF5X2ZyZWVfYnVmKHN0cnVjdCBtZHNzX21kcF9kYXRhICpkYXRhKQoraW50IG1kc3NfbWRwX292ZXJsYXlfZnJlZV9idWYoc3RydWN0IG1kc3NfbWRwX2RhdGEgKmRhdGEpCiB7CiAJaW50IGk7CiAJZm9yIChpID0gMDsgaSA8IGRhdGEtPm51bV9wbGFuZXMgJiYgZGF0YS0+cFtpXS5sZW47IGkrKykKQEAgLTc5OCwxMiArNzIwLDYwIEBACiAJCW1kc3NfbWRwX3BpcGVfZGVzdHJveShwaXBlKTsKIH0KIAorc3RhdGljIHZvaWQgX19tZHNzX21kcF9oYW5kb2ZmX2NsZWFudXBfcGlwZXMoc3RydWN0IG1zbV9mYl9kYXRhX3R5cGUgKm1mZCwKKwl1MzIgdHlwZSkKK3sKKwl1MzIgaSwgbnBpcGVzOworCXN0cnVjdCBtZHNzX21kcF9waXBlICpwaXBlczsKKwlzdHJ1Y3QgbWRzc19tZHBfcGlwZSAqcGlwZTsKKwlzdHJ1Y3QgbWRzc19vdmVybGF5X3ByaXZhdGUgKm1kcDVfZGF0YSA9IG1mZF90b19tZHA1X2RhdGEobWZkKTsKKwlzdHJ1Y3QgbWRzc19kYXRhX3R5cGUgKm1kYXRhID0gbWZkX3RvX21kYXRhKG1mZCk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE1EU1NfTURQX1BJUEVfVFlQRV9WSUc6CisJCXBpcGVzID0gbWRhdGEtPnZpZ19waXBlczsKKwkJbnBpcGVzID0gbWRhdGEtPm52aWdfcGlwZXM7CisJCWJyZWFrOworCWNhc2UgTURTU19NRFBfUElQRV9UWVBFX1JHQjoKKwkJcGlwZXMgPSBtZGF0YS0+cmdiX3BpcGVzOworCQlucGlwZXMgPSBtZGF0YS0+bnJnYl9waXBlczsKKwkJYnJlYWs7CisJY2FzZSBNRFNTX01EUF9QSVBFX1RZUEVfRE1BOgorCQlwaXBlcyA9IG1kYXRhLT5kbWFfcGlwZXM7CisJCW5waXBlcyA9IG1kYXRhLT5uZG1hX3BpcGVzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5waXBlczsgaSsrKSB7CisJCXBpcGUgPSAmcGlwZXNbaV07CisJCWlmIChwaXBlLT5pc19oYW5kZWRfb2ZmKSB7CisJCQlwcl9kZWJ1ZygiVW5tYXBwaW5nIGhhbmRlZCBvZmYgcGlwZSAlZFxuIiwgcGlwZS0+bnVtKTsKKwkJCWxpc3RfYWRkKCZwaXBlLT5jbGVhbnVwX2xpc3QsCisJCQkJJm1kcDVfZGF0YS0+cGlwZXNfY2xlYW51cCk7CisJCQltZHNzX21kcF9taXhlcl9waXBlX3Vuc3RhZ2UocGlwZSk7CisJCQlwaXBlLT5pc19oYW5kZWRfb2ZmID0gZmFsc2U7CisJCX0KKwl9Cit9CisKKy8qKgorICogbWRzc19tZHBfb3ZlcmxheV9zdGFydCgpIC0gUHJvZ3JhbXMgdGhlIE1EUCBjb250cm9sIGRhdGEgcGF0aCB0byBoYXJkd2FyZQorICogQG1mZDogTXNtIGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGZiIGRldmljZS4KKyAqCisgKiBQcm9ncmFtIHRoZSBNRFAgaGFyZHdhcmUgd2l0aCB0aGUgY29udHJvbCBzZXR0aW5ncyBmb3IgdGhlIGZyYW1lYnVmZmVyCisgKiBkZXZpY2UuIEluIGFkZGl0aW9uIHRvIHRoaXMsIHRoaXMgZnVuY3Rpb24gYWxzbyBoYW5kbGVzIHRoZSB0cmFuc2l0aW9uCisgKiBmcm9tIHRoZSB0aGUgc3BsYXNoIHNjcmVlbiB0byB0aGUgYW5kcm9pZCBib290IGFuaW1hdGlvbiB3aGVuIHRoZQorICogY29udGludW91cyBzcGxhc2ggc2NyZWVuIGZlYXR1cmUgaXMgZW5hYmxlZC4KKyAqLwogc3RhdGljIGludCBtZHNzX21kcF9vdmVybGF5X3N0YXJ0KHN0cnVjdCBtc21fZmJfZGF0YV90eXBlICptZmQpCiB7CiAJaW50IHJjOwogCXN0cnVjdCBtZHNzX292ZXJsYXlfcHJpdmF0ZSAqbWRwNV9kYXRhID0gbWZkX3RvX21kcDVfZGF0YShtZmQpOworCXN0cnVjdCBtZHNzX21kcF9jdGwgKmN0bCA9IG1kcDVfZGF0YS0+Y3RsOwogCi0JaWYgKG1kcDVfZGF0YS0+Y3RsLT5wb3dlcl9vbikgeworCWlmIChjdGwtPnBvd2VyX29uKSB7CiAJCWlmICghbWRwNV9kYXRhLT5tZGF0YS0+YmF0ZmV0KQogCQkJbWRzc19tZHBfYmF0ZmV0X2N0cmwobWRwNV9kYXRhLT5tZGF0YSwgdHJ1ZSk7CiAJCXJldHVybiAwOwpAQCAtODE3LDI0ICs3ODcsODQgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAotCWlmIChtZmQtPnBhbmVsX2luZm8tPmNvbnRfc3BsYXNoX2VuYWJsZWQpIHsKLQkJbWRzc19tZHBfY3RsX3NwbGFzaF9maW5pc2gobWRwNV9kYXRhLT5jdGwpOwotCQltZHNzX21kcF9mb290c3dpdGNoX2N0cmxfc3BsYXNoKDApOwotCX0KLQorCS8qCisJICogV2UgbmVlZCB0byBkbyBodyBpbml0IGJlZm9yZSBhbnkgaHcgcHJvZ3JhbW1pbmcuCisJICogQWxzbywgaHcgaW5pdCBpbnZvbHZlcyBwcm9ncmFtbWluZyB0aGUgVkJJRiByZWdpc3RlcnMgd2hpY2gKKwkgKiBzaG91bGQgYmUgZG9uZSBvbmx5IGFmdGVyIGF0dGFjaGluZyBJT01NVSB3aGljaCBpbiB0dXJuIHdvdWxkIGNhbGwKKwkgKiBpbiB0byBUWiB0byByZXN0b3JlIHNlY3VyaXR5IGNvbmZpZ3Mgb24gdGhlIFZCSUYgcmVnaXN0ZXJzLgorCSAqIFRoaXMgaXMgbm90IG5lZWRlZCB3aGVuIGNvbnRpbnVvdXMgc3BsYXNoIHNjcmVlbiBpcyBlbmFibGVkIHNpbmNlCisJICogd2Ugd291bGQgaGF2ZSBjYWxsZWQgaW4gdG8gVFogdG8gcmVzdG9yZSBzZWN1cml0eSBjb25maWdzIGZyb20gTEsuCisJICovCiAJaWYgKCFpc19tZHNzX2lvbW11X2F0dGFjaGVkKCkpIHsKLQkJbWRzc19pb21tdV9hdHRhY2gobWRzc19yZXMpOworCQlpZiAoIW1mZC0+cGFuZWxfaW5mby0+Y29udF9zcGxhc2hfZW5hYmxlZCkKKwkJCW1kc3NfaW9tbXVfYXR0YWNoKG1kc3NfcmVzKTsKIAkJbWRzc19od19pbml0KG1kc3NfcmVzKTsKIAl9CiAKLQlyYyA9IG1kc3NfbWRwX2N0bF9zdGFydChtZHA1X2RhdGEtPmN0bCk7CisJcmMgPSBtZHNzX21kcF9jdGxfc3RhcnQoY3RsKTsKIAlpZiAocmMgPT0gMCkgewogCQlhdG9taWNfaW5jKCZvdl9hY3RpdmVfcGFuZWxzKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIm92ZXJsYXkgc3RhcnQgZmFpbGVkLlxuIik7Ci0JCW1kc3NfbWRwX2N0bF9kZXN0cm95KG1kcDVfZGF0YS0+Y3RsKTsKLQkJbWRwNV9kYXRhLT5jdGwgPSBOVUxMOwogCisJCW1kc3NfbWRwX2N0bF9ub3RpZmllcl9yZWdpc3RlcihtZHA1X2RhdGEtPmN0bCwKKwkJCQkmbWZkLT5tZHBfc3luY19wdF9kYXRhLm5vdGlmaWVyKTsKKwl9IGVsc2UgeworCQlwcl9lcnIoIm1kcCBjdGwgc3RhcnQgZmFpbGVkLlxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKG1mZC0+cGFuZWxfaW5mby0+Y29udF9zcGxhc2hfZW5hYmxlZCkgeworCQlpZiAobWRwNV9kYXRhLT5oYW5kb2ZmKSB7CisJCQkvKgorCQkJICogU2V0IHVwIGJvcmRlci1maWxsIG9uIHRoZSBoYW5kZWQgb2ZmIHBpcGVzLgorCQkJICogVGhpcyBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgdGhlcmUgYXJlIG5vIG1lbW9yeQorCQkJICogYWNjZXNzZXMgcHJpb3IgdG8gYXR0YWNoaW5nIGlvbW11IGR1cmluZyBjb250aW51b3VzCisJCQkgKiBzcGxhc2ggc2NyZWVuIGNhc2UuIEhvd2V2ZXIsIGZvciBjb21tYW5kIG1vZGUKKwkJCSAqIGRpc3BsYXlzLCB0aGlzIGlzIG5vdCBuZWNlc3Nhcnkgc2luY2UgdGhlIHBhbmVscyBjYW4KKwkJCSAqIHJlZnJlc2ggZnJvbSB0aGVpciBpbnRlcm5hbCBtZW1vcnkgaWYgbm8gZGF0YSBpcyBzZW50CisJCQkgKiBvdXQgb24gdGhlIGRzaSBsYW5lcy4KKwkJCSAqLworCQkJaWYgKGN0bCAmJiBjdGwtPmlzX3ZpZGVvX21vZGUpIHsKKwkJCQlyYyA9IG1kc3NfbWRwX2Rpc3BsYXlfY29tbWl0KGN0bCwgTlVMTCk7CisJCQkJaWYgKCFJU19FUlJfVkFMVUUocmMpKSB7CisJCQkJCW1kc3NfbWRwX2Rpc3BsYXlfd2FpdDRjb21wKGN0bCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICogU2luY2UgYm9yZGVyLWZpbGwgc2V0dXAgZmFpbGVkLCB3ZQorCQkJCQkgKiBuZWVkIHRvIGVuc3VyZSB0aGF0IHdlIHR1cm4gb2ZmIHRoZQorCQkJCQkgKiBNRFAgdGltaW5nIGdlbmVyYXRvciBiZWZvcmUgYXR0YWNoaW5nCisJCQkJCSAqIGlvbW11CisJCQkJCSAqLworCQkJCQlwcl9lcnIoImZhaWxlZCB0byBzZXQgQkYgYXQgaGFuZG9mZlxuIik7CisJCQkJCW1kcDVfZGF0YS0+aGFuZG9mZiA9IGZhbHNlOworCQkJCQlyYyA9IDA7CisJCQkJfQorCQkJfQorCisJCQkvKiBBZGQgYWxsIHRoZSBoYW5kZWQgb2ZmIHBpcGVzIHRvIHRoZSBjbGVhbnVwIGxpc3QgKi8KKwkJCV9fbWRzc19tZHBfaGFuZG9mZl9jbGVhbnVwX3BpcGVzKG1mZCwKKwkJCQlNRFNTX01EUF9QSVBFX1RZUEVfUkdCKTsKKwkJCV9fbWRzc19tZHBfaGFuZG9mZl9jbGVhbnVwX3BpcGVzKG1mZCwKKwkJCQlNRFNTX01EUF9QSVBFX1RZUEVfVklHKTsKKwkJCV9fbWRzc19tZHBfaGFuZG9mZl9jbGVhbnVwX3BpcGVzKG1mZCwKKwkJCQlNRFNTX01EUF9QSVBFX1RZUEVfRE1BKTsKKwkJfQorCQlyYyA9IG1kc3NfbWRwX2N0bF9zcGxhc2hfZmluaXNoKGN0bCwgbWRwNV9kYXRhLT5oYW5kb2ZmKTsKKwkJLyoKKwkJICogUmVtb3ZlIHRoZSB2b3RlIGZvciBmb290c3dpdGNoIGV2ZW4gaWYgYWJvdmUgZnVuY3Rpb24KKwkJICogcmV0dXJuZWQgZXJyb3IKKwkJICovCisJCW1kc3NfbWRwX2Zvb3Rzd2l0Y2hfY3RybF9zcGxhc2goMCk7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyb3I7CisKKwkJaWYgKCFpc19tZHNzX2lvbW11X2F0dGFjaGVkKCkpCisJCQltZHNzX2lvbW11X2F0dGFjaChtZHNzX3Jlcyk7CisJfQorCitlcnJvcjoKKwlpZiAocmMpIHsKKwkJbWRzc19tZHBfY3RsX2Rlc3Ryb3koY3RsKTsKKwkJbWRwNV9kYXRhLT5jdGwgPSBOVUxMOwogCQlwbV9ydW50aW1lX3B1dCgmbWZkLT5wZGV2LT5kZXYpOwogCX0KIApAQCAtODYxLDcgKzg5MSw3IEBACiAJc3RydWN0IG1kc3NfbWRwX3BpcGUgKnBpcGU7CiAJc3RydWN0IG1kc3NfbWRwX2N0bCAqY3RsID0gbWZkX3RvX2N0bChtZmQpOwogCXN0cnVjdCBtZHNzX21kcF9jdGwgKnRtcDsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCWludCBzZF9pbl9waXBlID0gMDsKIAogCWlmIChjdGwtPnNoYXJlZF9sb2NrKQpAQCAtODcwLDE0ICs5MDAsNiBAQAogCW11dGV4X2xvY2soJm1kcDVfZGF0YS0+b3ZfbG9jayk7CiAJbXV0ZXhfbG9jaygmbWZkLT5sb2NrKTsKIAotCXJldCA9IG1kc3NfbWRwX2Rpc3BsYXlfd2FpdDRwaW5ncG9uZyhtZHA1X2RhdGEtPmN0bCk7Ci0JaWYgKHJldCkgewotCQltdXRleF91bmxvY2soJm1mZC0+bG9jayk7Ci0JCW11dGV4X3VubG9jaygmbWRwNV9kYXRhLT5vdl9sb2NrKTsKLQkJaWYgKGN0bC0+c2hhcmVkX2xvY2spCi0JCQltdXRleF91bmxvY2soY3RsLT5zaGFyZWRfbG9jayk7Ci0JCXJldHVybiByZXQ7Ci0JfQogCS8qCiAJICogY2hlY2sgaWYgdGhlcmUgaXMgYSBzZWN1cmUgZGlzcGxheSBzZXNzaW9uCiAJICovCkBAIC04OTcsNiArOTE5LDkgQEAKIAkJCW1kcDVfZGF0YS0+c2RfZW5hYmxlZCA9IDA7CiAJfQogCisJbWRzc19tZHBfY3RsX25vdGlmeShjdGwsIE1EUF9OT1RJRllfRlJBTUVfQkVHSU4pOworCW1kc3NfbWRwX2Nsa19jdHJsKE1EUF9CTE9DS19QT1dFUl9PTiwgZmFsc2UpOworCiAJaWYgKGRhdGEpCiAJCW1kc3NfbWRwX3NldF9yb2koY3RsLCBkYXRhKTsKIApAQCAtOTkxLDYgKzEwMTYsOCBAQAogCW1kc3NfZmJfdXBkYXRlX25vdGlmeV91cGRhdGUobWZkKTsKIGNvbW1pdF9mYWlsOgogCW1kc3NfbWRwX292ZXJsYXlfY2xlYW51cChtZmQpOworCW1kc3NfbWRwX2Nsa19jdHJsKE1EUF9CTE9DS19QT1dFUl9PRkYsIGZhbHNlKTsKKwltZHNzX21kcF9jdGxfbm90aWZ5KGN0bCwgTURQX05PVElGWV9GUkFNRV9GTFVTSEVEKTsKIAogCW11dGV4X3VubG9jaygmbWRwNV9kYXRhLT5vdl9sb2NrKTsKIAlpZiAoY3RsLT5zaGFyZWRfbG9jaykKQEAgLTEwNjIsMTcgKzEwODksNyBAQAogCXByX2RlYnVnKCJ1bnNldCBuZHg9JXhcbiIsIG5keCk7CiAKIAlpZiAobmR4ICYgTURTU19NRFBfUk9UX1NFU1NJT05fTUFTSykgewotCQlzdHJ1Y3QgbWRzc19tZHBfcm90YXRvcl9zZXNzaW9uICpyb3Q7Ci0JCXJvdCA9IG1kc3NfbWRwX3JvdGF0b3Jfc2Vzc2lvbl9nZXQobmR4KTsKLQkJaWYgKHJvdCkgewotCQkJbWRzc19tZHBfb3ZlcmxheV9mcmVlX2J1Zigmcm90LT5zcmNfYnVmKTsKLQkJCW1kc3NfbWRwX292ZXJsYXlfZnJlZV9idWYoJnJvdC0+ZHN0X2J1Zik7Ci0KLQkJCXJvdC0+cGlkID0gMDsKLQkJCWlmICghbGlzdF9lbXB0eSgmcm90LT5saXN0KSkKLQkJCQlsaXN0X2RlbF9pbml0KCZyb3QtPmxpc3QpOwotCQkJcmV0ID0gbWRzc19tZHBfcm90YXRvcl9yZWxlYXNlKHJvdCk7Ci0JCX0KKwkJcmV0ID0gbWRzc19tZHBfcm90YXRvcl91bnNldChuZHgpOwogCX0gZWxzZSB7CiAJCXJldCA9IG1kc3NfbWRwX292ZXJsYXlfcmVsZWFzZShtZmQsIG5keCk7CiAJfQpAQCAtMTE1Myw1MCArMTE3MCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtZHNzX21kcF9vdmVybGF5X3JvdGF0ZShzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkLAotCQkJCSAgIHN0cnVjdCBtc21mYl9vdmVybGF5X2RhdGEgKnJlcSkKLXsKLQlzdHJ1Y3QgbWRzc19tZHBfcm90YXRvcl9zZXNzaW9uICpyb3Q7Ci0JaW50IHJldDsKLQl1MzIgZmxnczsKLQotCXJvdCA9IG1kc3NfbWRwX3JvdGF0b3Jfc2Vzc2lvbl9nZXQocmVxLT5pZCk7Ci0JaWYgKCFyb3QpIHsKLQkJcHJfZXJyKCJpbnZhbGlkIHNlc3Npb24gaWQ9JXhcbiIsIHJlcS0+aWQpOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0KLQlmbGdzID0gcm90LT5mbGFncyAmIE1EUF9TRUNVUkVfT1ZFUkxBWV9TRVNTSU9OOwotCi0JcmV0ID0gbWRzc19tZHBfcm90YXRvcl9idXN5X3dhaXRfZXgocm90KTsKLQlpZiAocmV0KSB7Ci0JCXByX2Vycigicm90YXRvciBidXN5IHdhaXQgZXJyb3JcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCW1kc3NfbWRwX292ZXJsYXlfZnJlZV9idWYoJnJvdC0+c3JjX2J1Zik7Ci0JcmV0ID0gbWRzc19tZHBfb3ZlcmxheV9nZXRfYnVmKG1mZCwgJnJvdC0+c3JjX2J1ZiwgJnJlcS0+ZGF0YSwgMSwgZmxncyk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoInNyY19kYXRhIHBtZW0gZXJyb3JcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCW1kc3NfbWRwX292ZXJsYXlfZnJlZV9idWYoJnJvdC0+ZHN0X2J1Zik7Ci0JcmV0ID0gbWRzc19tZHBfb3ZlcmxheV9nZXRfYnVmKG1mZCwgJnJvdC0+ZHN0X2J1ZiwKLQkJCSZyZXEtPmRzdF9kYXRhLCAxLCBmbGdzKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiZHN0X2RhdGEgcG1lbSBlcnJvclxuIik7Ci0JCWdvdG8gZHN0X2J1Zl9mYWlsOwotCX0KLQotCXJldCA9IG1kc3NfbWRwX3JvdGF0b3JfcXVldWUocm90KTsKLQlpZiAocmV0KQotCQlwcl9lcnIoInJvdGF0b3IgcXVldWUgZXJyb3Igc2Vzc2lvbiBpZD0leFxuIiwgcmVxLT5pZCk7Ci0KLWRzdF9idWZfZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgaW50IG1kc3NfbWRwX292ZXJsYXlfcXVldWUoc3RydWN0IG1zbV9mYl9kYXRhX3R5cGUgKm1mZCwKIAkJCQkgIHN0cnVjdCBtc21mYl9vdmVybGF5X2RhdGEgKnJlcSkKIHsKQEAgLTEyOTIsNyArMTI2NSw3IEBACiAJaWYgKHJlcS0+aWQgJiBNRFNTX01EUF9ST1RfU0VTU0lPTl9NQVNLKSB7CiAJCW1kc3NfbWRwX292ZXJsYXlfZm9yY2VfZG1hX2NsZWFudXAobWZkX3RvX21kYXRhKG1mZCkpOwogCi0JCXJldCA9IG1kc3NfbWRwX292ZXJsYXlfcm90YXRlKG1mZCwgcmVxKTsKKwkJcmV0ID0gbWRzc19tZHBfcm90YXRvcl9wbGF5KG1mZCwgcmVxKTsKIAl9IGVsc2UgaWYgKHJlcS0+aWQgPT0gQk9SREVSRklMTF9ORFgpIHsKIAkJcHJfZGVidWcoImJvcmRlcmZpbGwgZW5hYmxlXG4iKTsKIAkJbWRwNV9kYXRhLT5ib3JkZXJmaWxsX2VuYWJsZSA9IHRydWU7CkBAIC0yMjMwLDcgKzIyMDMsNiBAQAogCWNhc2UgTVNNRkJfT1ZFUkxBWV9DT01NSVQ6CiAJCW1kc3NfZmJfd2FpdF9mb3JfZmVuY2UoJihtZmQtPm1kcF9zeW5jX3B0X2RhdGEpKTsKIAkJcmV0ID0gbWZkLT5tZHAua2lja29mZl9mbmMobWZkLCBOVUxMKTsKLQkJbWRzc19mYl9zaWduYWxfdGltZWxpbmUoJihtZmQtPm1kcF9zeW5jX3B0X2RhdGEpKTsKIAkJYnJlYWs7CiAJY2FzZSBNU01GQl9NRVRBREFUQV9TRVQ6CiAJCXJldCA9IGNvcHlfZnJvbV91c2VyKCZtZXRhZGF0YSwgYXJncCwgc2l6ZW9mKG1ldGFkYXRhKSk7CkBAIC0yMjU1LDEwICsyMjI3LDY2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiBfX21kc3NfbWRwX292ZXJsYXlfY3RsX2luaXQgLSBIZWxwZXIgZnVuY3Rpb24gdG8gaW50aWFsaXplIGNvbnRyb2wgc3RydWN0dXJlCisgKiBAbWZkOiBtc20gZnJhbWUgYnVmZmVyIGRhdGEgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmIgZGV2aWNlLgorICoKKyAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgdGhlIG1kcCBjb250cm9sIHN0cnVjdHVyZQorICogZm9yIGEgZnJhbWUgYnVmZmVyIGRldmljZS4gV2hlbnZlciBhcHBsaWNhYmxlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyBzZXR1cAorICogdGhlIGNvbnRyb2wgZm9yIHRoZSBzcGxpdCBkaXNwbGF5IHBhdGggYXMgd2VsbC4KKyAqCisgKiBSZXR1cm46IHBvaW50ZXIgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCBjb250cm9sIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCBtZHNzX21kcF9jdGwgKl9fbWRzc19tZHBfb3ZlcmxheV9jdGxfaW5pdCgKKwlzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG1kc3NfbWRwX2N0bCAqY3RsOworCXN0cnVjdCBtZHNzX3BhbmVsX2RhdGEgKnBkYXRhOworCisJaWYgKCFtZmQpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZtZmQtPnBkZXYtPmRldik7CisJaWYgKCFwZGF0YSkgeworCQlwcl9lcnIoIm5vIHBhbmVsIGNvbm5lY3RlZCBmb3IgZmIlZFxuIiwgbWZkLT5pbmRleCk7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwljdGwgPSBtZHNzX21kcF9jdGxfaW5pdChwZGF0YSwgbWZkKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoY3RsKSkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBpbml0aWFsaXplIGN0bCBmb3IgZmIlZFxuIiwKKwkJCW1mZC0+aW5kZXgpOworCQlyYyA9IFBUUl9FUlIoY3RsKTsKKwkJZ290byBlcnJvcjsKKwl9CisJY3RsLT52c3luY19oYW5kbGVyLnZzeW5jX2hhbmRsZXIgPQorCQkJCQltZHNzX21kcF9vdmVybGF5X2hhbmRsZV92c3luYzsKKwljdGwtPnZzeW5jX2hhbmRsZXIuY21kX3Bvc3RfZmx1c2ggPSBmYWxzZTsKKworCWlmIChtZmQtPnNwbGl0X2Rpc3BsYXkgJiYgcGRhdGEtPm5leHQpIHsKKwkJLyogZW5hYmxlIHNwbGl0IGRpc3BsYXkgKi8KKwkJcmMgPSBtZHNzX21kcF9jdGxfc3BsaXRfZGlzcGxheV9zZXR1cChjdGwsIHBkYXRhLT5uZXh0KTsKKwkJaWYgKHJjKSB7CisJCQltZHNzX21kcF9jdGxfZGVzdHJveShjdGwpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworZXJyb3I6CisJaWYgKHJjKQorCQlyZXR1cm4gRVJSX1BUUihyYyk7CisJZWxzZQorCQlyZXR1cm4gY3RsOworfQorCiBzdGF0aWMgaW50IG1kc3NfbWRwX292ZXJsYXlfb24oc3RydWN0IG1zbV9mYl9kYXRhX3R5cGUgKm1mZCkKIHsKIAlpbnQgcmM7CiAJc3RydWN0IG1kc3Nfb3ZlcmxheV9wcml2YXRlICptZHA1X2RhdGE7CisJc3RydWN0IG1kc3NfbWRwX2N0bCAqY3RsID0gTlVMTDsKKwogCWlmICghbWZkKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMjI3MCwzMyArMjI5OCw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCFtZHA1X2RhdGEtPmN0bCkgewotCQlzdHJ1Y3QgbWRzc19tZHBfY3RsICpjdGw7Ci0JCXN0cnVjdCBtZHNzX3BhbmVsX2RhdGEgKnBkYXRhOwotCi0JCXBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmbWZkLT5wZGV2LT5kZXYpOwotCQlpZiAoIXBkYXRhKSB7Ci0JCQlwcl9lcnIoIm5vIHBhbmVsIGNvbm5lY3RlZCBmb3IgZmIlZFxuIiwgbWZkLT5pbmRleCk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCi0JCWN0bCA9IG1kc3NfbWRwX2N0bF9pbml0KHBkYXRhLCBtZmQpOwotCQlpZiAoSVNfRVJSX09SX05VTEwoY3RsKSkgewotCQkJcHJfZXJyKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBjdGwgZm9yIGZiJWRcbiIsCi0JCQkJbWZkLT5pbmRleCk7CisJCWN0bCA9IF9fbWRzc19tZHBfb3ZlcmxheV9jdGxfaW5pdChtZmQpOworCQlpZiAoSVNfRVJSX09SX05VTEwoY3RsKSkKIAkJCXJldHVybiBQVFJfRVJSKGN0bCk7Ci0JCX0KLQkJY3RsLT52c3luY19oYW5kbGVyLnZzeW5jX2hhbmRsZXIgPQotCQkJCQkJbWRzc19tZHBfb3ZlcmxheV9oYW5kbGVfdnN5bmM7Ci0JCWN0bC0+dnN5bmNfaGFuZGxlci5jbWRfcG9zdF9mbHVzaCA9IGZhbHNlOwotCi0JCWlmIChtZmQtPnNwbGl0X2Rpc3BsYXkgJiYgcGRhdGEtPm5leHQpIHsKLQkJCS8qIGVuYWJsZSBzcGxpdCBkaXNwbGF5ICovCi0JCQlyYyA9IG1kc3NfbWRwX2N0bF9zcGxpdF9kaXNwbGF5X3NldHVwKGN0bCwgcGRhdGEtPm5leHQpOwotCQkJaWYgKHJjKSB7Ci0JCQkJbWRzc19tZHBfY3RsX2Rlc3Ryb3koY3RsKTsKLQkJCQlyZXR1cm4gcmM7Ci0JCQl9Ci0JCX0KIAkJbWRwNV9kYXRhLT5jdGwgPSBjdGw7CiAJfQogCkBAIC0yMzY0LDYgKzIzNjgsOCBAQAogCXJjID0gbWRzc19tZHBfY3RsX3N0b3AobWRwNV9kYXRhLT5jdGwpOwogCWlmIChyYyA9PSAwKSB7CiAJCV9fbWRzc19tZHBfb3ZlcmxheV9mcmVlX2xpc3RfcHVyZ2UobWZkKTsKKwkJbWRzc19tZHBfY3RsX25vdGlmaWVyX3VucmVnaXN0ZXIobWRwNV9kYXRhLT5jdGwsCisJCQkJJm1mZC0+bWRwX3N5bmNfcHRfZGF0YS5ub3RpZmllcik7CiAKIAkJaWYgKCFtZmQtPnJlZl9jbnQpIHsKIAkJCW1kcDVfZGF0YS0+Ym9yZGVyZmlsbF9lbmFibGUgPSBmYWxzZTsKQEAgLTIzOTUsNiArMjQwMSw5NiBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIG1kc3NfbWRwX292ZXJsYXlfaGFuZG9mZigpIC0gUmVhZCBNRFAgcmVnaXN0ZXJzIHRvIGhhbmRvZmYgYW4gYWN0aXZlIGN0bCBwYXRoCisgKiBAbWZkOiBNc20gZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZiIGRldmljZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHBvcHVsYXRlcyB0aGUgTURQIHNvZnR3YXJlIHN0cnVjdHVyZXMgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZgorICogdGhlIE1EUCBoYXJkd2FyZSB0byBoYW5kb2ZmIGFueSBhY3RpdmUgY29udHJvbCBwYXRoIGZvciB0aGUgZnJhbWVidWZmZXIKKyAqIGRldmljZS4gVGhpcyBpcyBuZWVkZWQgdG8gaWRlbnRpZnkgYW55IGN0bCwgbWl4ZXJzIGFuZCBwaXBlcyBiZWluZyBzZXQgdXAgYnkKKyAqIHRoZSBib290bG9hZGVyIHRvIGRpc3BsYXkgdGhlIHNwbGFzaCBzY3JlZW4gd2hlbiB0aGUgY29udGludW91cyBzcGxhc2ggc2NyZWVuCisgKiBmZWF0dXJlIGlzIGVuYWJsZWQgaW4ga2VybmVsLgorICovCitzdGF0aWMgaW50IG1kc3NfbWRwX292ZXJsYXlfaGFuZG9mZihzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG1kc3NfZGF0YV90eXBlICptZGF0YSA9IG1mZF90b19tZGF0YShtZmQpOworCXN0cnVjdCBtZHNzX292ZXJsYXlfcHJpdmF0ZSAqbWRwNV9kYXRhID0gbWZkX3RvX21kcDVfZGF0YShtZmQpOworCWludCBpLCBqOworCXUzMiByZWc7CisJc3RydWN0IG1kc3NfbWRwX3BpcGUgKnBpcGUgPSBOVUxMOworCXN0cnVjdCBtZHNzX21kcF9jdGwgKmN0bCA9IE5VTEw7CisKKwlpZiAoIW1kcDVfZGF0YS0+Y3RsKSB7CisJCWN0bCA9IF9fbWRzc19tZHBfb3ZlcmxheV9jdGxfaW5pdChtZmQpOworCQlpZiAoSVNfRVJSX09SX05VTEwoY3RsKSkgeworCQkJcmMgPSBQVFJfRVJSKGN0bCk7CisJCQlnb3RvIGVycm9yOworCQl9CisJCW1kcDVfZGF0YS0+Y3RsID0gY3RsOworCX0KKworCXJjID0gbWRzc19tZHBfY3RsX3NldHVwKGN0bCk7CisJaWYgKHJjKQorCQlnb3RvIGVycm9yOworCisJY3RsLT5jbGtfcmF0ZSA9IG1kc3NfbWRwX2dldF9jbGtfcmF0ZShNRFNTX0NMS19NRFBfU1JDKTsKKwlwcl9kZWJ1ZygiU2V0IHRoZSBjdGwgY2xvY2sgcmF0ZSB0byAlZCBIelxuIiwgY3RsLT5jbGtfcmF0ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWRhdGEtPm5taXhlcnNfaW50ZjsgaSsrKSB7CisJCXJlZyA9IG1kc3NfbWRwX2N0bF9yZWFkKGN0bCwgTURTU19NRFBfUkVHX0NUTF9MQVlFUihpKSk7CisJCXByX2RlYnVnKCJmb3IgbG0lZCByZWcgPSAweCUwOXhcbiIsIGksIHJlZyk7CisJCWZvciAoaiA9IE1EU1NfTURQX1NTUFBfVklHMDsgaiA8IE1EU1NfTURQX01BWF9TU1BQOyBqKyspIHsKKwkJCXUzMiBjZmcgPSBqICogMzsKKwkJCWlmICgoaiA9PSBNRFNTX01EUF9TU1BQX1ZJRzMpIHx8CisJCQkJKGogPT0gTURTU19NRFBfU1NQUF9SR0IzKSkgeworCQkJCS8qIEFkZCAyIHRvIGFjY291bnQgZm9yIEN1cnNvciAmIEJvcmRlciBiaXRzICovCisJCQkJY2ZnICs9IDI7CisJCQl9CisJCQlpZiAocmVnICYgKDB4NyA8PCBjZmcpKSB7CisJCQkJcHJfZGVidWcoIlBpcGUgJWQgc3RhZ2VkXG4iLCBqKTsKKwkJCQlwaXBlID0gbWRzc19tZHBfcGlwZV9zZWFyY2gobWRhdGEsIEJJVChqKSk7CisJCQkJaWYgKCFwaXBlKSB7CisJCQkJCXByX3dhcm4oIkludmFsaWQgcGlwZSAlZCBzdGFnZWRcbiIsIGopOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlyYyA9IG1kc3NfbWRwX3BpcGVfaGFuZG9mZihwaXBlKTsKKwkJCQlpZiAocmMpIHsKKwkJCQkJcHJfZXJyKCJGYWlsZWQgdG8gaGFuZG9mZiBwaXBlIG51bSAlZFxuIgorCQkJCQkJLCBwaXBlLT5udW0pOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKworCQkJCXJjID0gbWRzc19tZHBfbWl4ZXJfaGFuZG9mZihjdGwsIGksIHBpcGUpOworCQkJCWlmIChyYykgeworCQkJCQlwcl9lcnIoImZhaWxlZCB0byBoYW5kb2ZmIG1peGVyIG51bSAlZFxuIgorCQkJCQkJLCBpKTsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyYyA9IG1kc3NfbWRwX3NtcF9oYW5kb2ZmKG1kYXRhKTsKKwlpZiAocmMpCisJCXByX2VycigiRmFpbGVkIHRvIGhhbmRvZmYgc21wc1xuIik7CisKKwltZHA1X2RhdGEtPmhhbmRvZmYgPSB0cnVlOworCitlcnJvcjoKKwlpZiAocmMgJiYgY3RsKSB7CisJCV9fbWRzc19tZHBfaGFuZG9mZl9jbGVhbnVwX3BpcGVzKG1mZCwgTURTU19NRFBfUElQRV9UWVBFX1JHQik7CisJCV9fbWRzc19tZHBfaGFuZG9mZl9jbGVhbnVwX3BpcGVzKG1mZCwgTURTU19NRFBfUElQRV9UWVBFX1ZJRyk7CisJCV9fbWRzc19tZHBfaGFuZG9mZl9jbGVhbnVwX3BpcGVzKG1mZCwgTURTU19NRFBfUElQRV9UWVBFX0RNQSk7CisJCW1kc3NfbWRwX2N0bF9kZXN0cm95KGN0bCk7CisJCW1kcDVfZGF0YS0+Y3RsID0gTlVMTDsKKwkJbWRwNV9kYXRhLT5oYW5kb2ZmID0gZmFsc2U7CisJfQorCisJcmV0dXJuIHJjOworfQorCiBpbnQgbWRzc19tZHBfb3ZlcmxheV9pbml0KHN0cnVjdCBtc21fZmJfZGF0YV90eXBlICptZmQpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gbWZkLT5mYmktPmRldjsKQEAgLTI0NjEsNiArMjU1Nyw3IEBACiAJCQlnb3RvIGluaXRfZmFpbDsKIAkJfQogCX0KKwltZmQtPm1kcF9zeW5jX3B0X2RhdGEuYXN5bmNfd2FpdF9mZW5jZXMgPSB0cnVlOwogCiAJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKCZtZmQtPnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9lbmFibGUoJm1mZC0+cGRldi0+ZGV2KTsKQEAgLTI0NzIsNiArMjU2OSwyMSBAQAogCWlmICghbWRwNV9kYXRhLT5jcHVfcG1faGRsKQogCQlwcl93YXJuKCIlczogdW5hYmxlIHRvIGFkZCBldmVudCB0aW1lclxuIiwgX19mdW5jX18pOwogCisJaWYgKG1mZC0+cGFuZWxfaW5mby0+Y29udF9zcGxhc2hfZW5hYmxlZCkgeworCQlyYyA9IG1kc3NfbWRwX292ZXJsYXlfaGFuZG9mZihtZmQpOworCQlpZiAocmMpIHsKKwkJCS8qCisJCQkgKiBFdmVuIHRob3VnaCBoYW5kb2ZmIGZhaWxlZCwgaXQgaXMgbm90IGZhdGFsLgorCQkJICogTURQIGNhbiBjb250aW51ZSwganVzdCB0aGF0IHdlIHdvdWxkIGhhdmUgYSBsb25nZXIKKwkJCSAqIGRlbGF5IGluIHRyYW5zaXRpb25pbmcgZnJvbSBzcGxhc2ggc2NyZWVuIHRvIGJvb3QKKwkJCSAqIGFuaW1hdGlvbgorCQkJICovCisJCQlwcl93YXJuKCJPdmVybGF5IGhhbmRvZmYgZmFpbGVkIGZvciBmYiVkLiByYz0lZFxuIiwKKwkJCQltZmQtPmluZGV4LCByYyk7CisJCQlyYyA9IDA7CisJCX0KKwl9CisKIAlyZXR1cm4gcmM7CiBpbml0X2ZhaWw6CiAJa2ZyZWUobWRwNV9kYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19tZHBfcGlwZS5jIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF9waXBlLmMKaW5kZXggYzE4ZmQ5Yi4uNzc5Zjc0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF9waXBlLmMKKysrIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF9waXBlLmMKQEAgLTI3LDEwICsyNywxMCBAQAogCiBzdGF0aWMgREVGSU5FX01VVEVYKG1kc3NfbWRwX3NzcHBfbG9jayk7CiBzdGF0aWMgREVGSU5FX01VVEVYKG1kc3NfbWRwX3NtcF9sb2NrKTsKLXN0YXRpYyBERUNMQVJFX0JJVE1BUChtZHNzX21kcF9zbXBfbW1iX3Bvb2wsIE1EU1NfTURQX1NNUF9NTUJfQkxPQ0tTKTsKIAogc3RhdGljIGludCBtZHNzX21kcF9waXBlX2ZyZWUoc3RydWN0IG1kc3NfbWRwX3BpcGUgKnBpcGUpOwotc3RhdGljIGludCBfX21kc3NfbWRwX3BpcGVfc21wX21tYl9pc19lbXB0eSh1bnNpZ25lZCBsb25nICpzbXApOworc3RhdGljIHN0cnVjdCBtZHNzX21kcF9waXBlICptZHNzX21kcF9waXBlX3NlYXJjaF9ieV9jbGllbnRfaWQoCisJc3RydWN0IG1kc3NfZGF0YV90eXBlICptZGF0YSwgaW50IGNsaWVudF9pZCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtZHNzX21kcF9waXBlX3dyaXRlKHN0cnVjdCBtZHNzX21kcF9waXBlICpwaXBlLAogCQkJCSAgICAgICB1MzIgcmVnLCB1MzIgdmFsKQpAQCAtNDMsMjEgKzQzLDI5IEBACiAJcmV0dXJuIHJlYWRsX3JlbGF4ZWQocGlwZS0+YmFzZSArIHJlZyk7CiB9CiAKLXN0YXRpYyB1MzIgbWRzc19tZHBfc21wX21tYl9yZXNlcnZlKHVuc2lnbmVkIGxvbmcgKmV4aXN0aW5nLAotCXVuc2lnbmVkIGxvbmcgKnJlc2VydmUsIHNpemVfdCBuKQorc3RhdGljIHUzMiBtZHNzX21kcF9zbXBfbW1iX3Jlc2VydmUoc3RydWN0IG1kc3NfbWRwX3BpcGVfc21wX21hcCAqc21wX21hcCwKKwlzaXplX3QgbikKIHsKIAl1MzIgaSwgbW1iOworCXUzMiBmaXhlZF9jbnQgPSBiaXRtYXBfd2VpZ2h0KHNtcF9tYXAtPmZpeGVkLCBTTVBfTUJfQ05UKTsKKwlzdHJ1Y3QgbWRzc19kYXRhX3R5cGUgKm1kYXRhID0gbWRzc19tZHBfZ2V0X21kYXRhKCk7CisKKwlpZiAobiA8PSBmaXhlZF9jbnQpCisJCXJldHVybiBmaXhlZF9jbnQ7CisJZWxzZQorCQluIC09IGZpeGVkX2NudDsKIAogCS8qIHJlc2VydmUgbW9yZSBibG9ja3MgaWYgbmVlZGVkLCBidXQgY2FuJ3QgZnJlZSBtbWIgYXQgdGhpcyBwb2ludCAqLwotCWZvciAoaSA9IGJpdG1hcF93ZWlnaHQoZXhpc3RpbmcsIFNNUF9NQl9DTlQpOyBpIDwgbjsgaSsrKSB7Ci0JCWlmIChiaXRtYXBfZnVsbChtZHNzX21kcF9zbXBfbW1iX3Bvb2wsIFNNUF9NQl9DTlQpKQorCWZvciAoaSA9IGJpdG1hcF93ZWlnaHQoc21wX21hcC0+YWxsb2NhdGVkLCBTTVBfTUJfQ05UKTsgaSA8IG47IGkrKykgeworCQlpZiAoYml0bWFwX2Z1bGwobWRhdGEtPm1tYl9hbGxvY19tYXAsIFNNUF9NQl9DTlQpKQogCQkJYnJlYWs7CiAKLQkJbW1iID0gZmluZF9maXJzdF96ZXJvX2JpdChtZHNzX21kcF9zbXBfbW1iX3Bvb2wsIFNNUF9NQl9DTlQpOwotCQlzZXRfYml0KG1tYiwgcmVzZXJ2ZSk7Ci0JCXNldF9iaXQobW1iLCBtZHNzX21kcF9zbXBfbW1iX3Bvb2wpOworCQltbWIgPSBmaW5kX2ZpcnN0X3plcm9fYml0KG1kYXRhLT5tbWJfYWxsb2NfbWFwLCBTTVBfTUJfQ05UKTsKKwkJc2V0X2JpdChtbWIsIHNtcF9tYXAtPnJlc2VydmVkKTsKKwkJc2V0X2JpdChtbWIsIG1kYXRhLT5tbWJfYWxsb2NfbWFwKTsKIAl9Ci0JcmV0dXJuIGk7CisKKwlyZXR1cm4gaSArIGZpeGVkX2NudDsKIH0KIAogc3RhdGljIGludCBtZHNzX21kcF9zbXBfbW1iX3NldChpbnQgY2xpZW50X2lkLCB1bnNpZ25lZCBsb25nICpzbXApCkBAIC04NiwyMCArOTQsMTcgQEAKIAogc3RhdGljIHZvaWQgbWRzc19tZHBfc21wX21tYl9mcmVlKHVuc2lnbmVkIGxvbmcgKnNtcCwgYm9vbCB3cml0ZSkKIHsKKwlzdHJ1Y3QgbWRzc19kYXRhX3R5cGUgKm1kYXRhID0gbWRzc19tZHBfZ2V0X21kYXRhKCk7CisKIAlpZiAoIWJpdG1hcF9lbXB0eShzbXAsIFNNUF9NQl9DTlQpKSB7CiAJCWlmICh3cml0ZSkKIAkJCW1kc3NfbWRwX3NtcF9tbWJfc2V0KDAsIHNtcCk7Ci0JCWJpdG1hcF9hbmRub3QobWRzc19tZHBfc21wX21tYl9wb29sLCBtZHNzX21kcF9zbXBfbW1iX3Bvb2wsCisJCWJpdG1hcF9hbmRub3QobWRhdGEtPm1tYl9hbGxvY19tYXAsIG1kYXRhLT5tbWJfYWxsb2NfbWFwLAogCQkJICAgICAgc21wLCBTTVBfTUJfQ05UKTsKIAkJYml0bWFwX3plcm8oc21wLCBTTVBfTUJfQ05UKTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX19tZHNzX21kcF9waXBlX3NtcF9tbWJfaXNfZW1wdHkodW5zaWduZWQgbG9uZyAqc21wKQotewotCXJldHVybiBiaXRtYXBfd2VpZ2h0KHNtcCwgU01QX01CX0NOVCkgPT0gMDsKLX0KLQogc3RhdGljIHZvaWQgbWRzc19tZHBfc21wX3NldF93bV9sZXZlbHMoc3RydWN0IG1kc3NfbWRwX3BpcGUgKnBpcGUsIGludCBtYl9jbnQpCiB7CiAJdTMyIGZldGNoX3NpemUsIHZhbCwgd21bM107CkBAIC0yMjksOCArMjM0LDggQEAKIAogCQlwcl9kZWJ1ZygicmVzZXJ2aW5nICVkIG1tYiBmb3IgcG51bT0lZCBwbGFuZT0lZFxuIiwKIAkJCQludW1fYmxrcywgcGlwZS0+bnVtLCBpKTsKLQkJcmVzZXJ2ZWQgPSBtZHNzX21kcF9zbXBfbW1iX3Jlc2VydmUocGlwZS0+c21wX21hcFtpXS5hbGxvY2F0ZWQsCi0JCQlwaXBlLT5zbXBfbWFwW2ldLnJlc2VydmVkLCBudW1fYmxrcyk7CisJCXJlc2VydmVkID0gbWRzc19tZHBfc21wX21tYl9yZXNlcnZlKCZwaXBlLT5zbXBfbWFwW2ldLAorCQkJbnVtX2Jsa3MpOwogCQlpZiAocmVzZXJ2ZWQgPCBudW1fYmxrcykKIAkJCWJyZWFrOwogCX0KQEAgLTI0Niw3ICsyNTEsMjEgQEAKIAogCXJldHVybiByYzsKIH0KLQorLyoKKyAqIG1kc3NfbWRwX3NtcF9hbGxvYygpIC0tIHNldCBzbXAgbW1iIGFuZCBhbmQgd20gbGV2ZWxzIGZvciBhIHN0YWdlZCBwaXBlCisgKiBAcGlwZTogcG9pbnRlciB0byBhIHBpcGUKKyAqCisgKiBGdW5jdGlvbiBhbWVuZHMgcmVzZXJ2ZWQgc21wIG1tYnMgdG8gYWxsb2NhdGVkIGJpdG1hcCBhbmQgdGllcyByZXNwZWN0aXZlCisgKiBtbWJzIHRvIHRoZWlyIHBpcGUgZmV0Y2hfaWRzLiBCYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHRvdGFsIGFsbG9jYXRlZCBtbWJzCisgKiBmb3IgYSBzdGFnZWQgcGlwZSwgaXQgYWxzbyBzZXRzIHRoZSB3YXRlcm1hcmsgbGV2ZWxzICh3bSkuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBvbiBldmVyeSBjb21taXQgd2hlcmUgcGlwZSBwYXJhbXMgbWlnaHQgbm90CisgKiBoYXZlIGNoYW5nZWQuIEluIHN1Y2ggY2FzZXMsIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgd20gbGV2ZWxzIGFyZSBub3QKKyAqIHdpcGVkIG91dC4gQWxzbyBpbiBzb21lIHJhcmUgc2l0dWF0aW9ucyBodyBtaWdodCBoYXZlIHJlc2V0IGFuZCB3aXBlZCBvdXQKKyAqIHNtcCBtbWIgcHJvZ3JhbW1pbmcgYnV0IG5ldyBzbXAgcmVzZXJ2YXRpb24gaXMgbm90IGRvbmUuIEluIHN1Y2ggY2FzZXMgd2UKKyAqIG5lZWQgdG8gZW5zdXJlIHRoYXQgZm9yIGEgc3RhZ2VkIHBpcGVzLCBtbWJzIGFyZSBzZXQgcHJvcGVybHkgYmFzZWQgb24KKyAqIGFsbG9jYXRlZCBiaXRtYXAuCisgKi8KIHN0YXRpYyBpbnQgbWRzc19tZHBfc21wX2FsbG9jKHN0cnVjdCBtZHNzX21kcF9waXBlICpwaXBlKQogewogCWludCBpOwpAQCAtMjU0LDggKzI3MywxNCBAQAogCiAJbXV0ZXhfbG9jaygmbWRzc19tZHBfc21wX2xvY2spOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfUExBTkVTOyBpKyspIHsKLQkJaWYgKF9fbWRzc19tZHBfcGlwZV9zbXBfbW1iX2lzX2VtcHR5KHBpcGUtPnNtcF9tYXBbaV0ucmVzZXJ2ZWQpKQorCQljbnQgKz0gYml0bWFwX3dlaWdodChwaXBlLT5zbXBfbWFwW2ldLmZpeGVkLCBTTVBfTUJfQ05UKTsKKworCQlpZiAoYml0bWFwX2VtcHR5KHBpcGUtPnNtcF9tYXBbaV0ucmVzZXJ2ZWQsIFNNUF9NQl9DTlQpKSB7CisJCQljbnQgKz0gbWRzc19tZHBfc21wX21tYl9zZXQocGlwZS0+ZnRjaF9pZCArIGksCisJCQkJcGlwZS0+c21wX21hcFtpXS5hbGxvY2F0ZWQpOwogCQkJY29udGludWU7CisJCX0KKwogCQltZHNzX21kcF9zbXBfbW1iX2FtZW5kKHBpcGUtPnNtcF9tYXBbaV0uYWxsb2NhdGVkLAogCQkJcGlwZS0+c21wX21hcFtpXS5yZXNlcnZlZCk7CiAJCWNudCArPSBtZHNzX21kcF9zbXBfbW1iX3NldChwaXBlLT5mdGNoX2lkICsgaSwKQEAgLTI4NCw2ICszMDksODAgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBtZHNzX21kcF9zbXBfaGFuZG9mZigpIC0gSGFuZG9mZiBTTVAgTU1CcyBpbiB1c2UgYnkgc3RhZ2VkIHBpcGVzCisgKiBAbWRhdGE6IHBvaW50ZXIgdG8gdGhlIGdsb2JhbCBtZHNzIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBvZiBhbGwgU01QIE1NQnMgYW5kIGNoZWNrIHRvIHNlZSBpZiBhbnkKKyAqIG9mIHRoZW0gYXJlIGFzc2lnbmVkIHRvIGEgcGlwZSBiZWluZyBtYXJrZWQgYXMgYmVpbmcgaGFuZGVkLW9mZi4KKyAqIElmIHNvLCB1cGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgc29mdHdhcmUgYWxsb2NhdGlvbiBtYXAgdG8gcmVmbGVjdAorICogdGhpcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdvdWxkIHR5cGljYWxseSBiZSBjYWxsZWQgZHVyaW5nIE1EUCBwcm9iZSBmb3IgdGhlIGNhc2UKKyAqIHdoZW4gY2VydGFpbiBwaXBlcyBtaWdodCBiZSBwcm9ncmFtbWVkIGluIHRoZSBib290bG9hZGVyIHRvIGRpc3BsYXkKKyAqIHRoZSBzcGxhc2ggc2NyZWVuLgorICovCitpbnQgbWRzc19tZHBfc21wX2hhbmRvZmYoc3RydWN0IG1kc3NfZGF0YV90eXBlICptZGF0YSkKK3sKKwlpbnQgcmMgPSAwOworCWludCBpLCBjbGllbnRfaWQsIHByZXZfaWQgPSAwOworCXUzMiBvZmYsIHMsIGRhdGE7CisJc3RydWN0IG1kc3NfbWRwX3BpcGUgKnBpcGUgPSBOVUxMOworCisJLyoKKwkgKiBmaWd1cmUgb3V0IHdoYXQgU01QIE1NQnMgYXJlIGFsbG9jYXRlZCBmb3IgZWFjaCBvZiB0aGUgcGlwZXMKKwkgKiB0aGF0IG5lZWQgdG8gYmUgaGFuZGVkIG9mZi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU01QX01CX0NOVDsgaSsrKSB7CisJCW9mZiA9IChpIC8gMykgKiA0OworCQlzID0gKGkgJSAzKSAqIDg7CisJCWRhdGEgPSBNRFNTX01EUF9SRUdfUkVBRChNRFNTX01EUF9SRUdfU01QX0FMTE9DX1cwICsgb2ZmKTsKKwkJY2xpZW50X2lkID0gKGRhdGEgPj4gcykgJiAweEZGOworCQlpZiAodGVzdF9iaXQoaSwgbWRhdGEtPm1tYl9hbGxvY19tYXApKSB7CisJCQkvKgorCQkJICogQ2VydGFpbiBwaXBlcyBtYXkgaGF2ZSBhIGRlZGljYXRlZCBzZXQgb2YKKwkJCSAqIFNNUCBNTUJzIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHRvIHRoZW0uIEluCisJCQkgKiBzdWNoIGNhc2VzLCB3ZSBkbyBub3QgbmVlZCB0byBkbyBhbnl0aGluZworCQkJICogaGVyZS4KKwkJCSAqLworCQkJcHJfZGVidWcoInNtcCBtbWIgJWQgYWxyZWFkeSBhc3NpZ25lZCB0byBwaXBlICVkIChjbGllbnRfaWQgJWQpIgorCQkJCSwgaSwgcGlwZS0+bnVtLCBjbGllbnRfaWQpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoY2xpZW50X2lkKSB7CisJCQlpZiAoY2xpZW50X2lkICE9IHByZXZfaWQpIHsKKwkJCQlwaXBlID0gbWRzc19tZHBfcGlwZV9zZWFyY2hfYnlfY2xpZW50X2lkKG1kYXRhLAorCQkJCQljbGllbnRfaWQpOworCQkJCXByZXZfaWQgPSBjbGllbnRfaWQ7CisJCQl9CisKKwkJCWlmICghcGlwZSkgeworCQkJCXByX3dhcm4oIkludmFsaWQgY2xpZW50IGlkICVkIGZvciBTTVAgTU1CICVkXG4iLAorCQkJCQljbGllbnRfaWQsIGkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoIXBpcGUtPmlzX2hhbmRlZF9vZmYpIHsKKwkJCQlwcl93YXJuKCJTTVAgTU1CICVkIGFzc2lnbmVkIHRvIGEgcGlwZSBub3QgbWFya2VkIGZvciBoYW5kb2ZmIChjbGllbnQgaWQgJWQpIgorCQkJCQksIGksIGNsaWVudF9pZCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBBc3N1bWUgdGhhdCB0aGUgc291cmNlIGZvcm1hdCBvbmx5IGhhcworCQkJICogb25lIHBsYW5lCisJCQkgKi8KKwkJCXByX2RlYnVnKCJBc3NpZ25pbmcgc21wIG1tYiAlZCB0byBwaXBlICVkIChjbGllbnRfaWQgJWQpXG4iCisJCQkJLCBpLCBwaXBlLT5udW0sIGNsaWVudF9pZCk7CisJCQlzZXRfYml0KGksIHBpcGUtPnNtcF9tYXBbMF0uYWxsb2NhdGVkKTsKKwkJCXNldF9iaXQoaSwgbWRhdGEtPm1tYl9hbGxvY19tYXApOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCiB2b2lkIG1kc3NfbWRwX3BpcGVfdW5tYXAoc3RydWN0IG1kc3NfbWRwX3BpcGUgKnBpcGUpCiB7CiAJaW50IHRtcDsKQEAgLTQyNyw2ICs1MjYsMjkgQEAKIAlyZXR1cm4gcGlwZTsKIH0KIAorc3RhdGljIHN0cnVjdCBtZHNzX21kcF9waXBlICptZHNzX21kcF9waXBlX3NlYXJjaF9ieV9jbGllbnRfaWQoCisJc3RydWN0IG1kc3NfZGF0YV90eXBlICptZGF0YSwgaW50IGNsaWVudF9pZCkKK3sKKwl1MzIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtZGF0YS0+bnJnYl9waXBlczsgaSsrKSB7CisJCWlmIChtZGF0YS0+cmdiX3BpcGVzW2ldLmZ0Y2hfaWQgPT0gY2xpZW50X2lkKQorCQkJcmV0dXJuICZtZGF0YS0+cmdiX3BpcGVzW2ldOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZGF0YS0+bnZpZ19waXBlczsgaSsrKSB7CisJCWlmIChtZGF0YS0+dmlnX3BpcGVzW2ldLmZ0Y2hfaWQgPT0gY2xpZW50X2lkKQorCQkJcmV0dXJuICZtZGF0YS0+dmlnX3BpcGVzW2ldOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZGF0YS0+bmRtYV9waXBlczsgaSsrKSB7CisJCWlmIChtZGF0YS0+ZG1hX3BpcGVzW2ldLmZ0Y2hfaWQgPT0gY2xpZW50X2lkKQorCQkJcmV0dXJuICZtZGF0YS0+ZG1hX3BpcGVzW2ldOworCX0KKworCXJldHVybiBOVUxMOworfQorCiBzdHJ1Y3QgbWRzc19tZHBfcGlwZSAqbWRzc19tZHBfcGlwZV9zZWFyY2goc3RydWN0IG1kc3NfZGF0YV90eXBlICptZGF0YSwKIAkJCQkJCSAgdTMyIG5keCkKIHsKQEAgLTQ4MSw2ICs2MDMsNjcgQEAKIAogfQogCisvKioKKyAqIG1kc3NfbWRwX3BpcGVfaGFuZG9mZigpIC0gSGFuZG9mZiBzdGFnZWQgcGlwZXMgZHVyaW5nIGJvb3R1cAorICogQHBpcGU6IHBvaW50ZXIgdG8gdGhlIHBpcGUgdG8gYmUgaGFuZGVkLW9mZgorICoKKyAqIFBvcHVsYXRlIHRoZSBzb2Z0d2FyZSBzdHJ1Y3R1cmVzIGZvciB0aGUgcGlwZSBiYXNlZCBvbiB0aGUgY3VycmVudAorICogY29uZmlndXJhdGlvbiBvZiB0aGUgaGFyZHdhcmUgcGlwZSBieSB0aGUgcmVhZGluZyB0aGUgYXBwcm9wcmlhdGUgTURQCisgKiByZWdpc3RlcnMuCisgKgorICogVGhpcyBmdW5jdGlvbiB3b3VsZCB0eXBpY2FsbHkgYmUgY2FsbGVkIGR1cmluZyBNRFAgcHJvYmUgZm9yIHRoZSBjYXNlCisgKiB3aGVuIGNlcnRhaW4gcGlwZXMgbWlnaHQgYmUgcHJvZ3JhbW1lZCBpbiB0aGUgYm9vdGxvYWRlciB0byBkaXNwbGF5CisgKiB0aGUgc3BsYXNoIHNjcmVlbi4KKyAqLworaW50IG1kc3NfbWRwX3BpcGVfaGFuZG9mZihzdHJ1Y3QgbWRzc19tZHBfcGlwZSAqcGlwZSkKK3sKKwlpbnQgcmMgPSAwOworCXUzMiBzcmNfZm10LCByZWcgPSAwLCBicHAgPSAwOworCisJLyoKKwkgKiB0b2RvOiBmb3Igbm93LCBvbmx5IHJlYWRpbmcgcGlwZSBzcmMgYW5kIGRlc3Qgc2l6ZSBkZXRhaWxzCisJICogZnJvbSB0aGUgcmVnaXN0ZXJzLiBUaGlzIGlzIG5lZWRlZCBmb3IgYXBwcm9wcmlhdGVseQorCSAqIGNhbGN1bGF0aW5nIHBlcmYgbWV0cmljcyBmb3IgdGhlIGhhbmRlZCBvZmYgcGlwZXMuCisJICogV2UgbWF5IG5lZWQgdG8gcGFyc2Ugc29tZSBtb3JlIGRldGFpbHMgYXQgYSBsYXRlciBkYXRlLgorCSAqLworCXJlZyA9IG1kc3NfbWRwX3BpcGVfcmVhZChwaXBlLCBNRFNTX01EUF9SRUdfU1NQUF9TUkNfU0laRSk7CisJcGlwZS0+c3JjLmggPSByZWcgPj4gMTY7CisJcGlwZS0+c3JjLncgPSByZWcgJiAweEZGRkY7CisJcmVnID0gbWRzc19tZHBfcGlwZV9yZWFkKHBpcGUsIE1EU1NfTURQX1JFR19TU1BQX09VVF9TSVpFKTsKKwlwaXBlLT5kc3QuaCA9IHJlZyA+PiAxNjsKKwlwaXBlLT5kc3QudyA9IHJlZyAmIDB4RkZGRjsKKworCS8qIEFzc3VtZSB0aGF0IHRoZSBzb3VyY2UgZm9ybWF0IGlzIFJHQiAqLworCXJlZyA9IG1kc3NfbWRwX3BpcGVfcmVhZChwaXBlLCBNRFNTX01EUF9SRUdfU1NQUF9TUkNfRk9STUFUKTsKKwlicHAgPSAoKHJlZyA+PiA5KSAmIDB4MykgKyAxOworCXN3aXRjaCAoYnBwKSB7CisJY2FzZSA0OgorCQlzcmNfZm10ID0gTURQX1JHQkFfODg4ODsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzcmNfZm10ID0gTURQX1JHQl84ODg7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJc3JjX2ZtdCA9IE1EUF9SR0JfNTY1OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIkludmFsaWQgYnBwPSVkIGZvdW5kXG4iLCBicHApOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCXBpcGUtPnNyY19mbXQgPSBtZHNzX21kcF9nZXRfZm9ybWF0X3BhcmFtcyhzcmNfZm10KTsKKworCXByX2RlYnVnKCJQaXBlIHNldHRpbmdzOiBzcmMuaD0lZCBzcmMudz0lZCBkc3QuaD0lZCBkc3Qudz0lZCBicHA9JWRcbiIKKwkJLCBwaXBlLT5zcmMuaCwgcGlwZS0+c3JjLncsIHBpcGUtPmRzdC5oLCBwaXBlLT5kc3QudywKKwkJcGlwZS0+c3JjX2ZtdC0+YnBwKTsKKworCXBpcGUtPmlzX2hhbmRlZF9vZmYgPSB0cnVlOworCWF0b21pY19pbmMoJnBpcGUtPnJlZl9jbnQpOworCitlcnJvcjoKKwlyZXR1cm4gcmM7Cit9CisKIHZvaWQgbWRzc19tZHBfY3JvcF9yZWN0KHN0cnVjdCBtZHNzX21kcF9pbWdfcmVjdCAqc3JjX3JlY3QsCiAJc3RydWN0IG1kc3NfbWRwX2ltZ19yZWN0ICpkc3RfcmVjdCwKIAljb25zdCBzdHJ1Y3QgbWRzc19tZHBfaW1nX3JlY3QgKnNjaV9yZWN0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF9wcC5jIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF9wcC5jCmluZGV4IGU0OGU3NDkuLmIzMWY2YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19tZHBfcHAuYworKysgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwX3BwLmMKQEAgLTcxMSw3ICs3MTEsNyBAQAogCQkJaWYgKHNyY19oIDw9IHBpcGUtPmRzdC5oKSB7CiAJCQkJc2NhbGVfY29uZmlnIHw9IC8qIEcvWSwgQSAqLwogCQkJCQkoZmlsdGVyX21vZGUgPDwgMTApIHwKLQkJCQkJKE1EU1NfTURQX1NDQUxFX0ZJTFRFUl9ORUFSRVNUIDw8IDE4KTsKKwkJCQkJKE1EU1NfTURQX1NDQUxFX0ZJTFRFUl9CSUwgPDwgMTgpOwogCQkJfSBlbHNlCiAJCQkJc2NhbGVfY29uZmlnIHw9IC8qIEcvWSwgQSAqLwogCQkJCQkoTURTU19NRFBfU0NBTEVfRklMVEVSX1BDTU4gPDwgMTApIHwKQEAgLTczMCw3ICs3MzAsNyBAQAogCQkJaWYgKHNyY19oIDw9IHBpcGUtPmRzdC5oKQogCQkJCXNjYWxlX2NvbmZpZyB8PSAvKiBSR0IsIEEgKi8KIAkJCQkJKE1EU1NfTURQX1NDQUxFX0ZJTFRFUl9CSUwgPDwgMTApIHwKLQkJCQkJKE1EU1NfTURQX1NDQUxFX0ZJTFRFUl9ORUFSRVNUIDw8IDE4KTsKKwkJCQkJKE1EU1NfTURQX1NDQUxFX0ZJTFRFUl9CSUwgPDwgMTgpOwogCQkJZWxzZQogCQkJCXNjYWxlX2NvbmZpZyB8PSAvKiBSR0IsIEEgKi8KIAkJCQkJKE1EU1NfTURQX1NDQUxFX0ZJTFRFUl9QQ01OIDw8IDEwKSB8CkBAIC03NjQsNyArNzY0LDcgQEAKIAkJCWlmIChzcmNfdyA8PSBwaXBlLT5kc3QudykgewogCQkJCXNjYWxlX2NvbmZpZyB8PSAvKiBHL1ksIEEgKi8KIAkJCQkJKGZpbHRlcl9tb2RlIDw8IDgpIHwKLQkJCQkJKE1EU1NfTURQX1NDQUxFX0ZJTFRFUl9ORUFSRVNUIDw8IDE2KTsKKwkJCQkJKE1EU1NfTURQX1NDQUxFX0ZJTFRFUl9CSUwgPDwgMTYpOwogCQkJfSBlbHNlCiAJCQkJc2NhbGVfY29uZmlnIHw9IC8qIEcvWSwgQSAqLwogCQkJCQkoTURTU19NRFBfU0NBTEVfRklMVEVSX1BDTU4gPDwgOCkgfApAQCAtNzgzLDcgKzc4Myw3IEBACiAJCQlpZiAoc3JjX3cgPD0gcGlwZS0+ZHN0LncpCiAJCQkJc2NhbGVfY29uZmlnIHw9IC8qIFJHQiwgQSAqLwogCQkJCQkoTURTU19NRFBfU0NBTEVfRklMVEVSX0JJTCA8PCA4KSB8Ci0JCQkJCShNRFNTX01EUF9TQ0FMRV9GSUxURVJfTkVBUkVTVCA8PCAxNik7CisJCQkJCShNRFNTX01EUF9TQ0FMRV9GSUxURVJfQklMIDw8IDE2KTsKIAkJCWVsc2UKIAkJCQlzY2FsZV9jb25maWcgfD0gLyogUkdCLCBBICovCiAJCQkJCShNRFNTX01EUF9TQ0FMRV9GSUxURVJfUENNTiA8PCA4KSB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwX3JvdGF0b3IuYyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19tZHBfcm90YXRvci5jCmluZGV4IDQ0NzM0ZjguLjFkMTcyZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19tZHBfcm90YXRvci5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19tZHBfcm90YXRvci5jCkBAIC0zNywxMiArMzcsMTEgQEAKIHN0YXRpYyBzdHJ1Y3QgbXNtX3N5bmNfcHRfZGF0YSAqbWRzc19tZHBfcm90YXRvcl9zeW5jX3B0X2NyZWF0ZSgKIAkJCXN0cnVjdCBtZHNzX21kcF9yb3RhdG9yX3Nlc3Npb24gKnJvdCk7CiAKLXN0cnVjdCBtZHNzX21kcF9yb3RhdG9yX3Nlc3Npb24gKm1kc3NfbWRwX3JvdGF0b3Jfc2Vzc2lvbl9hbGxvYyh2b2lkKQorc3RhdGljIHN0cnVjdCBtZHNzX21kcF9yb3RhdG9yX3Nlc3Npb24gKm1kc3NfbWRwX3JvdGF0b3Jfc2Vzc2lvbl9hbGxvYyh2b2lkKQogewogCXN0cnVjdCBtZHNzX21kcF9yb3RhdG9yX3Nlc3Npb24gKnJvdDsKIAlpbnQgaTsKIAotCW11dGV4X2xvY2soJnJvdGF0b3JfbG9jayk7CiAJZm9yIChpID0gMDsgaSA8IE1BWF9ST1RBVE9SX1NFU1NJT05TOyBpKyspIHsKIAkJcm90ID0gJnJvdGF0b3Jfc2Vzc2lvbltpXTsKIAkJaWYgKHJvdC0+cmVmX2NudCA9PSAwKSB7CkBAIC01MiwxNiArNTEsMTUgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCW11dGV4X3VubG9jaygmcm90YXRvcl9sb2NrKTsKIAlpZiAoaSA9PSBNQVhfUk9UQVRPUl9TRVNTSU9OUykgewogCQlwcl9lcnIoIm1heCByb3RhdG9yIHNlc3Npb25zIHJlYWNoZWRcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0KIAlyZXR1cm4gcm90OwogfQogCi1zdHJ1Y3QgbWRzc19tZHBfcm90YXRvcl9zZXNzaW9uICptZHNzX21kcF9yb3RhdG9yX3Nlc3Npb25fZ2V0KHUzMiBzZXNzaW9uX2lkKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWRzc19tZHBfcm90YXRvcl9zZXNzaW9uCisqbWRzc19tZHBfcm90YXRvcl9zZXNzaW9uX2dldCh1MzIgc2Vzc2lvbl9pZCkKIHsKIAlzdHJ1Y3QgbWRzc19tZHBfcm90YXRvcl9zZXNzaW9uICpyb3Q7CiAJdTMyIG5keDsKQEAgLTExMywxNiArMTExLDE1IEBACiAKIHN0YXRpYyBpbnQgbWRzc19tZHBfcm90YXRvcl9idXN5X3dhaXQoc3RydWN0IG1kc3NfbWRwX3JvdGF0b3Jfc2Vzc2lvbiAqcm90KQogewotCXN0cnVjdCBtZHNzX21kcF9waXBlICpyb3RfcGlwZSA9IE5VTEw7Ci0Jc3RydWN0IG1kc3NfbWRwX2N0bCAqY3RsID0gTlVMTDsKIAotCXJvdF9waXBlID0gcm90LT5waXBlOwotCWlmICghcm90X3BpcGUpCi0JCXJldHVybiAtRU5PREVWOwotCi0JY3RsID0gcm90X3BpcGUtPm1peGVyLT5jdGw7CiAJbXV0ZXhfbG9jaygmcm90LT5sb2NrKTsKKwlpZiAoIXJvdC0+cGlwZSB8fCAhcm90LT5waXBlLT5taXhlciB8fCAhcm90LT5waXBlLT5taXhlci0+Y3RsKSB7CisJCW11dGV4X3VubG9jaygmcm90LT5sb2NrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCiAJaWYgKHJvdC0+YnVzeSkgeworCQlzdHJ1Y3QgbWRzc19tZHBfY3RsICpjdGwgPSByb3QtPnBpcGUtPm1peGVyLT5jdGw7CiAJCW1kc3NfbWRwX2Rpc3BsYXlfd2FpdDRjb21wKGN0bCk7CiAJCXJvdC0+YnVzeSA9IGZhbHNlOwogCQlpZiAoY3RsLT5zaGFyZWRfbG9jaykKQEAgLTI3NiwxNyArMjczLDIwIEBACiAJaW50IHJldDsKIAogCXJvdCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbWRzc19tZHBfcm90YXRvcl9zZXNzaW9uLCBjb21taXRfd29yayk7Ci0JcmV0ID0gbWRzc19tZHBfcm90YXRvcl9xdWV1ZV9oZWxwZXIocm90KTsKIAotCWlmIChyZXQpIHsKKwltdXRleF9sb2NrKCZyb3RhdG9yX2xvY2spOworCXJldCA9IG1kc3NfbWRwX3JvdGF0b3JfcXVldWVfaGVscGVyKHJvdCk7CisJaWYgKHJldCkKIAkJcHJfZXJyKCJyb3RhdG9yIHF1ZXVlIGZhaWxlZFxuIik7Ci0JCXJldHVybjsKKworCWlmIChyb3QtPnJvdF9zeW5jX3B0X2RhdGEpIHsKKwkJYXRvbWljX2luYygmcm90LT5yb3Rfc3luY19wdF9kYXRhLT5jb21taXRfY250KTsKKwkJbWRzc19mYl9zaWduYWxfdGltZWxpbmUocm90LT5yb3Rfc3luY19wdF9kYXRhKTsKKwl9IGVsc2UgeworCQlwcl9lcnIoInJvdF9zeW5jX3B0X2RhdGEgaXMgTlVMTFxuIik7CiAJfQogCi0JaWYgKHJvdC0+cm90X3N5bmNfcHRfZGF0YSkKLQkJbWRzc19mYl9zaWduYWxfdGltZWxpbmUocm90LT5yb3Rfc3luY19wdF9kYXRhKTsKLQllbHNlCi0JCXByX2Vycigicm90X3N5bmNfcHRfZGF0YSBpcyBOVUxMXG4iKTsKKwltdXRleF91bmxvY2soJnJvdGF0b3JfbG9jayk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbXNtX3N5bmNfcHRfZGF0YSAqbWRzc19tZHBfcm90YXRvcl9zeW5jX3B0X2NyZWF0ZSgKQEAgLTMxOCw3ICszMTgsNyBAQAogCXJldHVybiBzeW5jX3B0X2RhdGE7CiB9CiAKLWludCBtZHNzX21kcF9yb3RhdG9yX2J1c3lfd2FpdF9leChzdHJ1Y3QgbWRzc19tZHBfcm90YXRvcl9zZXNzaW9uICpyb3QpCitzdGF0aWMgaW50IG1kc3NfbWRwX3JvdGF0b3JfYnVzeV93YWl0X2V4KHN0cnVjdCBtZHNzX21kcF9yb3RhdG9yX3Nlc3Npb24gKnJvdCkKIHsKIAogCXN0cnVjdCBtZHNzX21kcF9yb3RhdG9yX3Nlc3Npb24gKnRtcDsKQEAgLTMzNywyMCArMzM3LDEyIEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgbWRzc19tZHBfcm90YXRvcl9zZXNzaW9uICp0bXA7CiAKLQlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnJvdGF0b3JfbG9jayk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIm11dGV4IGxvY2sgb24gcm90YXRvcl9sb2NrIGZhaWxlZFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcHJfZGVidWcoInJvdGF0b3Igc2Vzc2lvbj0leCBzdGFydFxuIiwgcm90LT5zZXNzaW9uX2lkKTsKIAogCWZvciAocmV0ID0gMCwgdG1wID0gcm90OyByZXQgPT0gMCAmJiB0bXA7IHRtcCA9IHRtcC0+bmV4dCkKIAkJcmV0ID0gbWRzc19tZHBfcm90YXRvcl9xdWV1ZV9zdWIodG1wLAogCQkJCSZyb3QtPnNyY19idWYsICZyb3QtPmRzdF9idWYpOwogCi0JbXV0ZXhfdW5sb2NrKCZyb3RhdG9yX2xvY2spOwotCiAJaWYgKHJldCkgewogCQlwcl9lcnIoInJvdGF0aW9uIGZhaWxlZCAlZCBmb3Igcm90PSVkXG4iLCByZXQsIHJvdC0+c2Vzc2lvbl9pZCk7CiAJCXJldHVybiByZXQ7CkBAIC0zNjIsNyArMzU0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgbWRzc19tZHBfcm90YXRvcl9xdWV1ZShzdHJ1Y3QgbWRzc19tZHBfcm90YXRvcl9zZXNzaW9uICpyb3QpCitzdGF0aWMgaW50IG1kc3NfbWRwX3JvdGF0b3JfcXVldWUoc3RydWN0IG1kc3NfbWRwX3JvdGF0b3Jfc2Vzc2lvbiAqcm90KQogewogCWludCByZXQgPSAwOwogCkBAIC0zNzYsMTAgKzM2OCw4MCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBtZHNzX21kcF9yb3RhdG9yX3NldHVwKHN0cnVjdCBtZHNzX21kcF9yb3RhdG9yX3Nlc3Npb24gKnJvdCkKK2ludCBtZHNzX21kcF9yb3RhdG9yX3NldHVwKHN0cnVjdCBtc21fZmJfZGF0YV90eXBlICptZmQsCisJCQkgICBzdHJ1Y3QgbWRwX292ZXJsYXkgKnJlcSkKIHsKKwlzdHJ1Y3QgbWRzc19vdmVybGF5X3ByaXZhdGUgKm1kcDVfZGF0YSA9IG1mZF90b19tZHA1X2RhdGEobWZkKTsKKwlzdHJ1Y3QgbWRzc19tZHBfcm90YXRvcl9zZXNzaW9uICpyb3QgPSBOVUxMOworCXN0cnVjdCBtZHNzX21kcF9mb3JtYXRfcGFyYW1zICpmbXQ7CisJdTMyIGJ3Y19lbmFibGVkOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmcm90YXRvcl9sb2NrKTsKKworCWZtdCA9IG1kc3NfbWRwX2dldF9mb3JtYXRfcGFyYW1zKHJlcS0+c3JjLmZvcm1hdCk7CisJaWYgKCFmbXQpIHsKKwkJcHJfZXJyKCJpbnZhbGlkIHJvdCBmb3JtYXQgJWRcbiIsIHJlcS0+c3JjLmZvcm1hdCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gcm90X2VycjsKKwl9CisKKwlyZXQgPSBtZHNzX21kcF9vdmVybGF5X3JlcV9jaGVjayhtZmQsIHJlcSwgZm10KTsKKwlpZiAocmV0KQorCQlnb3RvIHJvdF9lcnI7CisKKwlpZiAocmVxLT5pZCA9PSBNU01GQl9ORVdfUkVRVUVTVCkgeworCQlyb3QgPSBtZHNzX21kcF9yb3RhdG9yX3Nlc3Npb25fYWxsb2MoKTsKKwkJcm90LT5waWQgPSBjdXJyZW50LT50Z2lkOworCQlsaXN0X2FkZCgmcm90LT5saXN0LCAmbWRwNV9kYXRhLT5yb3RfcHJvY19saXN0KTsKKworCQlpZiAoIXJvdCkgeworCQkJcHJfZXJyKCJ1bmFibGUgdG8gYWxsb2NhdGUgcm90YXRvciBzZXNzaW9uXG4iKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIHJvdF9lcnI7CisJCX0KKwl9IGVsc2UgaWYgKHJlcS0+aWQgJiBNRFNTX01EUF9ST1RfU0VTU0lPTl9NQVNLKSB7CisJCXJvdCA9IG1kc3NfbWRwX3JvdGF0b3Jfc2Vzc2lvbl9nZXQocmVxLT5pZCk7CisKKwkJaWYgKCFyb3QpIHsKKwkJCXByX2Vycigicm90YXRvciBzZXNzaW9uPSV4IG5vdCBmb3VuZFxuIiwgcmVxLT5pZCk7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byByb3RfZXJyOworCQl9CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJpbnZhbGlkIHJvdGF0b3Igc2Vzc2lvbiBpZD0leFxuIiwgcmVxLT5pZCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gcm90X2VycjsKKwl9CisKKwkvKiBrZWVwIG9ubHkgZmxhZ3Mgb2YgaW50ZXJlc3QgdG8gcm90YXRvciAqLworCXJvdC0+ZmxhZ3MgPSByZXEtPmZsYWdzICYgKE1EUF9ST1RfOTAgfCBNRFBfRkxJUF9MUiB8IE1EUF9GTElQX1VEIHwKKwkJCQkgICBNRFBfU0VDVVJFX09WRVJMQVlfU0VTU0lPTik7CisKKwlid2NfZW5hYmxlZCA9IHJlcS0+ZmxhZ3MgJiBNRFBfQldDX0VOOworCWlmIChid2NfZW5hYmxlZCAgJiYgICFtZHA1X2RhdGEtPm1kYXRhLT5oYXNfYndjKSB7CisJCXByX2VycigiQldDIGlzIG5vdCBzdXBwb3J0ZWQgaW4gTURQIHZlcnNpb24gJXhcbiIsCisJCQltZHA1X2RhdGEtPm1kYXRhLT5tZHBfcmV2KTsKKwkJcm90LT5id2NfbW9kZSA9IDA7CisJfSBlbHNlIHsKKwkJcm90LT5id2NfbW9kZSA9IGJ3Y19lbmFibGVkID8gMSA6IDA7CisJfQorCXJvdC0+Zm9ybWF0ID0gZm10LT5mb3JtYXQ7CisJcm90LT5pbWdfd2lkdGggPSByZXEtPnNyYy53aWR0aDsKKwlyb3QtPmltZ19oZWlnaHQgPSByZXEtPnNyYy5oZWlnaHQ7CisJcm90LT5zcmNfcmVjdC54ID0gcmVxLT5zcmNfcmVjdC54OworCXJvdC0+c3JjX3JlY3QueSA9IHJlcS0+c3JjX3JlY3QueTsKKwlyb3QtPnNyY19yZWN0LncgPSByZXEtPnNyY19yZWN0Lnc7CisJcm90LT5zcmNfcmVjdC5oID0gcmVxLT5zcmNfcmVjdC5oOworCisJaWYgKHJlcS0+ZmxhZ3MgJiBNRFBfREVJTlRFUkxBQ0UpIHsKKwkJcm90LT5mbGFncyB8PSBNRFBfREVJTlRFUkxBQ0U7CisJCXJvdC0+c3JjX3JlY3QuaCAvPSAyOworCQlyb3QtPnNyY19yZWN0LnkgPSBESVZfUk9VTkRfVVAocm90LT5zcmNfcmVjdC55LCAyKTsKKwl9CiAKIAlyb3QtPmRzdCA9IHJvdC0+c3JjX3JlY3Q7CisKIAkvKgogCSAqIGJ5IGRlZmF1bHQsIHJvdGF0b3Igb3V0cHV0IHNob3VsZCBiZSBwbGFjZWQgZGlyZWN0bHkgb24KIAkgKiBvdXRwdXQgYnVmZmVyIGFkZHJlc3Mgd2l0aG91dCBhbnkgb2Zmc2V0LgpAQCAtMzk2LDcgKzQ1OCw4IEBACiAKIAkJaWYgKHJvdC0+YndjX21vZGUpIHsKIAkJCXByX2VycigiVW5hYmxlIHRvIGRvIHNwbGl0IHJvdGF0aW9uIHdpdGggYndjIHNldFxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIHJvdF9lcnI7CiAJCX0KIAogCQl3aWR0aCA9IHJvdC0+c3JjX3JlY3QudzsKQEAgLTQwNiwxNCArNDY5LDE2IEBACiAKIAkJaWYgKHdpZHRoID4gKE1BWF9NSVhFUl9XSURUSCAqIDIpKSB7CiAJCQlwcl9lcnIoInVuc3VwcG9ydGVkIHNvdXJjZSB3aWR0aCAlZFxuIiwgd2lkdGgpOwotCQkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJCQlyZXQgPSAtRU9WRVJGTE9XOworCQkJZ290byByb3RfZXJyOwogCQl9CiAKIAkJaWYgKCFyb3QtPm5leHQpIHsKIAkJCXRtcCA9IG1kc3NfbWRwX3JvdGF0b3Jfc2Vzc2lvbl9hbGxvYygpOwogCQkJaWYgKCF0bXApIHsKIAkJCQlwcl9lcnIoInVuYWJsZSB0byBhbGxvY2F0ZSByb3QgZHVhbCBzZXNzaW9uXG4iKTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gcm90X2VycjsKIAkJCX0KIAkJCXJvdC0+bmV4dCA9IHRtcDsKIAkJfQpAQCAtNDYxLDcgKzUyNiwxNiBAQAogCiAJcm90LT5wYXJhbXNfY2hhbmdlZCsrOwogCi0JcmV0dXJuIDA7CisJcmVxLT5pZCA9IHJvdC0+c2Vzc2lvbl9pZDsKKworIHJvdF9lcnI6CisJbXV0ZXhfdW5sb2NrKCZyb3RhdG9yX2xvY2spOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gc2V0dXAgcm90YXRvciBzZXNzaW9uXG4iKTsKKwkJaWYgKHJvdCkKKwkJCW1kc3NfbWRwX3JvdGF0b3JfcmVsZWFzZShyb3QpOworCX0KKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG1kc3NfbWRwX3JvdGF0b3JfZmluaXNoKHN0cnVjdCBtZHNzX21kcF9yb3RhdG9yX3Nlc3Npb24gKnJvdCkKQEAgLTUzNywzICs2MTEsNzAgQEAKIAogCXJldHVybiAwOwogfQorCitpbnQgbWRzc19tZHBfcm90YXRvcl9wbGF5KHN0cnVjdCBtc21fZmJfZGF0YV90eXBlICptZmQsCisJCQkgICAgc3RydWN0IG1zbWZiX292ZXJsYXlfZGF0YSAqcmVxKQoreworCXN0cnVjdCBtZHNzX21kcF9yb3RhdG9yX3Nlc3Npb24gKnJvdDsKKwlpbnQgcmV0OworCXUzMiBmbGdzOworCisJbXV0ZXhfbG9jaygmcm90YXRvcl9sb2NrKTsKKwlyb3QgPSBtZHNzX21kcF9yb3RhdG9yX3Nlc3Npb25fZ2V0KHJlcS0+aWQpOworCWlmICghcm90KSB7CisJCXByX2VycigiaW52YWxpZCBzZXNzaW9uIGlkPSV4XG4iLCByZXEtPmlkKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBkc3RfYnVmX2ZhaWw7CisJfQorCisJZmxncyA9IHJvdC0+ZmxhZ3MgJiBNRFBfU0VDVVJFX09WRVJMQVlfU0VTU0lPTjsKKworCXJldCA9IG1kc3NfbWRwX3JvdGF0b3JfYnVzeV93YWl0X2V4KHJvdCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoInJvdGF0b3IgYnVzeSB3YWl0IGVycm9yXG4iKTsKKwkJZ290byBkc3RfYnVmX2ZhaWw7CisJfQorCisJbWRzc19tZHBfb3ZlcmxheV9mcmVlX2J1Zigmcm90LT5zcmNfYnVmKTsKKwlyZXQgPSBtZHNzX21kcF9vdmVybGF5X2dldF9idWYobWZkLCAmcm90LT5zcmNfYnVmLCAmcmVxLT5kYXRhLCAxLCBmbGdzKTsKKwlpZiAocmV0KSB7CisJCXByX2Vycigic3JjX2RhdGEgcG1lbSBlcnJvclxuIik7CisJCWdvdG8gZHN0X2J1Zl9mYWlsOworCX0KKworCW1kc3NfbWRwX292ZXJsYXlfZnJlZV9idWYoJnJvdC0+ZHN0X2J1Zik7CisJcmV0ID0gbWRzc19tZHBfb3ZlcmxheV9nZXRfYnVmKG1mZCwgJnJvdC0+ZHN0X2J1ZiwKKwkJCSZyZXEtPmRzdF9kYXRhLCAxLCBmbGdzKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiZHN0X2RhdGEgcG1lbSBlcnJvclxuIik7CisJCWdvdG8gZHN0X2J1Zl9mYWlsOworCX0KKworCXJldCA9IG1kc3NfbWRwX3JvdGF0b3JfcXVldWUocm90KTsKKworCWlmIChyZXQpCisJCXByX2Vycigicm90YXRvciBxdWV1ZSBlcnJvciBzZXNzaW9uIGlkPSV4XG4iLCByZXEtPmlkKTsKKworZHN0X2J1Zl9mYWlsOgorCW11dGV4X3VubG9jaygmcm90YXRvcl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbWRzc19tZHBfcm90YXRvcl91bnNldChpbnQgbmR4KQoreworCXN0cnVjdCBtZHNzX21kcF9yb3RhdG9yX3Nlc3Npb24gKnJvdDsKKwlpbnQgcmV0ID0gMDsKKwltdXRleF9sb2NrKCZyb3RhdG9yX2xvY2spOworCXJvdCA9IG1kc3NfbWRwX3JvdGF0b3Jfc2Vzc2lvbl9nZXQobmR4KTsKKwlpZiAocm90KSB7CisJCW1kc3NfbWRwX292ZXJsYXlfZnJlZV9idWYoJnJvdC0+c3JjX2J1Zik7CisJCW1kc3NfbWRwX292ZXJsYXlfZnJlZV9idWYoJnJvdC0+ZHN0X2J1Zik7CisKKwkJcm90LT5waWQgPSAwOworCQlpZiAoIWxpc3RfZW1wdHkoJnJvdC0+bGlzdCkpCisJCQlsaXN0X2RlbF9pbml0KCZyb3QtPmxpc3QpOworCQlyZXQgPSBtZHNzX21kcF9yb3RhdG9yX2ZpbmlzaChyb3QpOworCX0KKwltdXRleF91bmxvY2soJnJvdGF0b3JfbG9jayk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19tZHBfcm90YXRvci5oIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF9yb3RhdG9yLmgKaW5kZXggYWI3Y2NlMS4uNzIyOTk5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF9yb3RhdG9yLmgKKysrIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF9yb3RhdG9yLmgKQEAgLTc1LDE0ICs3NSwxMyBAQAogCX0KIH0KIAotc3RydWN0IG1kc3NfbWRwX3JvdGF0b3Jfc2Vzc2lvbiAqbWRzc19tZHBfcm90YXRvcl9zZXNzaW9uX2FsbG9jKHZvaWQpOwotc3RydWN0IG1kc3NfbWRwX3JvdGF0b3Jfc2Vzc2lvbiAqbWRzc19tZHBfcm90YXRvcl9zZXNzaW9uX2dldCh1MzIgc2Vzc2lvbl9pZCk7Ci0KLWludCBtZHNzX21kcF9yb3RhdG9yX3NldHVwKHN0cnVjdCBtZHNzX21kcF9yb3RhdG9yX3Nlc3Npb24gKnJvdCk7Ci1pbnQgbWRzc19tZHBfcm90YXRvcl9xdWV1ZShzdHJ1Y3QgbWRzc19tZHBfcm90YXRvcl9zZXNzaW9uICpyb3QpOworaW50IG1kc3NfbWRwX3JvdGF0b3Jfc2V0dXAoc3RydWN0IG1zbV9mYl9kYXRhX3R5cGUgKm1mZCwKKwkJCSAgIHN0cnVjdCBtZHBfb3ZlcmxheSAqcmVxKTsKIGludCBtZHNzX21kcF9yb3RhdG9yX3JlbGVhc2Uoc3RydWN0IG1kc3NfbWRwX3JvdGF0b3Jfc2Vzc2lvbiAqcm90KTsKIGludCBtZHNzX21kcF9yb3RhdG9yX3JlbGVhc2VfYWxsKHZvaWQpOwotaW50IG1kc3NfbWRwX3JvdGF0b3JfYnVzeV93YWl0X2V4KHN0cnVjdCBtZHNzX21kcF9yb3RhdG9yX3Nlc3Npb24gKnJvdCk7CiBzdHJ1Y3QgbXNtX3N5bmNfcHRfZGF0YSAqbWRzc19tZHBfcm90YXRvcl9zeW5jX3B0X2dldCgKIAlzdHJ1Y3QgbXNtX2ZiX2RhdGFfdHlwZSAqbWZkLCBjb25zdCBzdHJ1Y3QgbWRwX2J1Zl9zeW5jICpidWZfc3luYyk7CitpbnQgbWRzc19tZHBfcm90YXRvcl9wbGF5KHN0cnVjdCBtc21fZmJfZGF0YV90eXBlICptZmQsCisJCQkgICAgc3RydWN0IG1zbWZiX292ZXJsYXlfZGF0YSAqcmVxKTsKK2ludCBtZHNzX21kcF9yb3RhdG9yX3Vuc2V0KGludCBuZHgpOwogI2VuZGlmIC8qIE1EU1NfTURQX1JPVEFUT1JfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF93Yi5jIGIvZHJpdmVycy92aWRlby9tc20vbWRzcy9tZHNzX21kcF93Yi5jCmluZGV4IGE5ZjNlMzUuLjU4YWNiOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbWRzc19tZHBfd2IuYworKysgYi9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21kc3NfbWRwX3diLmMKQEAgLTUyNCw2ICs1MjQsNyBAQAogCQlwcl9lcnIoInVuYWJsZSB0byBnZXQgd3JpdGViYWNrIGJ1ZiBjdGw9JWRcbiIsIGN0bC0+bnVtKTsKIAkJLyogZHJvcCBidWZmZXIgYnV0IGRvbid0IHJldHVybiBlcnJvciAqLwogCQlyZXQgPSAwOworCQltZHNzX21kcF9jdGxfbm90aWZ5KGN0bCwgTURQX05PVElGWV9GUkFNRV9ET05FKTsKIAkJZ290byBraWNrb2ZmX2ZhaWw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21zbS9tZHNzL21zbV9tZHNzX2lvXzg5NzQuYyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbXNtX21kc3NfaW9fODk3NC5jCmluZGV4IGY3ZWE1NTcuLjYyNzA0YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbXNtX21kc3NfaW9fODk3NC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbXNtL21kc3MvbXNtX21kc3NfaW9fODk3NC5jCkBAIC00MCw2ICs0MCwxNCBAQAogCX0KIAogCWRldiA9ICZwZGV2LT5kZXY7CisJY3RybF9wZGF0YS0+bWRwX2NvcmVfY2xrID0gY2xrX2dldChkZXYsICJtZHBfY29yZV9jbGsiKTsKKwlpZiAoSVNfRVJSKGN0cmxfcGRhdGEtPm1kcF9jb3JlX2NsaykpIHsKKwkJcmMgPSBQVFJfRVJSKGN0cmxfcGRhdGEtPm1kcF9jb3JlX2Nsayk7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBnZXQgbWRwIGNvcmUgY2xrLiByYz0lZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7CisJCWdvdG8gbWRzc19kc2lfY2xrX2VycjsKKwl9CisKIAljdHJsX3BkYXRhLT5haGJfY2xrID0gY2xrX2dldChkZXYsICJpZmFjZV9jbGsiKTsKIAlpZiAoSVNfRVJSKGN0cmxfcGRhdGEtPmFoYl9jbGspKSB7CiAJCXJjID0gUFRSX0VSUihjdHJsX3BkYXRhLT5haGJfY2xrKTsKQEAgLTEwMSw2ICsxMDksOCBAQAogCQljbGtfcHV0KGN0cmxfcGRhdGEtPmF4aV9jbGspOwogCWlmIChjdHJsX3BkYXRhLT5haGJfY2xrKQogCQljbGtfcHV0KGN0cmxfcGRhdGEtPmFoYl9jbGspOworCWlmIChjdHJsX3BkYXRhLT5tZHBfY29yZV9jbGspCisJCWNsa19wdXQoY3RybF9wZGF0YS0+bWRwX2NvcmVfY2xrKTsKIH0KIAogI2RlZmluZSBQUkVGX0RJVl9SQVRJTyAyNwpAQCAtMjQxLDkgKzI1MSwxNyBAQAogewogCWludCByYyA9IDA7CiAKKwlyYyA9IGNsa19wcmVwYXJlX2VuYWJsZShjdHJsX3BkYXRhLT5tZHBfY29yZV9jbGspOworCWlmIChyYykgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZW5hYmxlIG1kcF9jb3JlX2Nsb2NrLiByYz0lZFxuIiwKKwkJCQkJCQkgX19mdW5jX18sIHJjKTsKKwkJZ290byBlcnJvcjsKKwl9CisKIAlyYyA9IGNsa19wcmVwYXJlX2VuYWJsZShjdHJsX3BkYXRhLT5haGJfY2xrKTsKIAlpZiAocmMpIHsKIAkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGVuYWJsZSBhaGIgY2xvY2suIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoY3RybF9wZGF0YS0+bWRwX2NvcmVfY2xrKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKQEAgLTI1MSw2ICsyNjksNyBAQAogCWlmIChyYykgewogCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZW5hYmxlIGFoYiBjbG9jay4gcmM9JWRcbiIsIF9fZnVuY19fLCByYyk7CiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShjdHJsX3BkYXRhLT5haGJfY2xrKTsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGN0cmxfcGRhdGEtPm1kcF9jb3JlX2Nsayk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC0yNjIsNiArMjgxLDcgQEAKIHsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoY3RybF9wZGF0YS0+YXhpX2Nsayk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGN0cmxfcGRhdGEtPmFoYl9jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShjdHJsX3BkYXRhLT5tZHBfY29yZV9jbGspOwogfQogCiBzdGF0aWMgaW50IG1kc3NfZHNpX2Nsa19wcmVwYXJlKHN0cnVjdCBtZHNzX2RzaV9jdHJsX3BkYXRhICpjdHJsX3BkYXRhKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvc2RoY2kuaCBiL2luY2x1ZGUvbGludXgvbW1jL3NkaGNpLmgKaW5kZXggMTg2ZmZmMS4uMDhjYTM0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvc2RoY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9zZGhjaS5oCkBAIC0yNTIsNiArMjUyLDcgQEAKIAlzdHJ1Y3QgbXV0ZXggaW9zX211dGV4OwogCWVudW0gc2RoY2lfcG93ZXJfcG9saWN5IHBvd2VyX3BvbGljeTsKIAorCXUzMiBhdXRvX2NtZF9lcnJfc3RzOwogCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZVswXSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiB9OwogI2VuZGlmIC8qIExJTlVYX01NQ19TREhDSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaCBiL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCmluZGV4IGNmYWFhNjkuLjA4NDRkYzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCkBAIC0yMDUsNyArMjA1LDE2IEBACiAjZWxzZQogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqX19wYWdlX2NhY2hlX2FsbG9jKGdmcF90IGdmcCkKIHsKLQlyZXR1cm4gYWxsb2NfcGFnZXMoZ2ZwLCAwKTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCXBhZ2UgPSBhbGxvY19wYWdlcyhnZnAsIDApOworCisJaWYgKHBhZ2UgJiYgaXNfY21hX3BhZ2VibG9jayhwYWdlKSkgeworCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwkJcGFnZSA9IGFsbG9jX3BhZ2VzKGdmcCAmIH5fX0dGUF9NT1ZBQkxFLCAwKTsKKwl9CisKKwlyZXR1cm4gcGFnZTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bvd2VyX3N1cHBseS5oIGIvaW5jbHVkZS9saW51eC9wb3dlcl9zdXBwbHkuaAppbmRleCA5M2FmMDRkLi4yMmIwMDRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bvd2VyX3N1cHBseS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG93ZXJfc3VwcGx5LmgKQEAgLTEwMSw2ICsxMDEsNyBAQAogCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAogCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHLAogCVBPV0VSX1NVUFBMWV9QUk9QX0lOUFVUX1ZPTFRBR0VfUkVHVUxBVElPTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX09DViwKIAlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX01BWCwKIAlQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX01BWCwKIAlQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX1RSSU0sCkBAIC0zMjAsNiArMzIxLDcgQEAKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTjoKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9BVkc6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX09DVjoKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BPV0VSX05PVzoKIAkJcmV0dXJuIDE7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL21zbV9oc3VzYi5oIGIvaW5jbHVkZS9saW51eC91c2IvbXNtX2hzdXNiLmgKaW5kZXggYmU5MmNhNy4uMDdmOWI5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvbXNtX2hzdXNiLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvbXNtX2hzdXNiLmgKQEAgLTMzOSw2ICszMzksNyBAQAogICogQGhvc3RfYnVzX3N1c3BlbmQ6IGluZGljYXRlcyBob3N0IGJ1cyBzdXNwZW5kIG9yIG5vdC4KICAqIEBjaGdfY2hlY2tfdGltZXI6IFRoZSB0aW1lciB1c2VkIHRvIGltcGxlbWVudCB0aGUgd29ya2Fyb3VuZCB0byBkZXRlY3QKICAqICAgICAgICAgICAgICAgdmVyeSBzbG93IHBsdWcgaW4gb2Ygd2FsbCBjaGFyZ2VyLgorICogQHVpX2VuYWJsZWQ6IFVTQiBJbnR0ZXJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KICAqLwogc3RydWN0IG1zbV9vdGcgewogCXN0cnVjdCB1c2JfcGh5IHBoeTsKQEAgLTQ0OSw2ICs0NTAsNyBAQAogCWJvb2wgZXh0X2NoZ19vcGVuZWQ7CiAJYm9vbCBleHRfY2hnX2FjdGl2ZTsKIAlzdHJ1Y3QgY29tcGxldGlvbiBleHRfY2hnX3dhaXQ7CisJaW50IHVpX2VuYWJsZWQ7CiB9OwogCiBzdHJ1Y3QgY2kxM3h4eF9wbGF0Zm9ybV9kYXRhIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbXNtX2NhbV9zZW5zb3IuaCBiL2luY2x1ZGUvbWVkaWEvbXNtX2NhbV9zZW5zb3IuaAppbmRleCAzMjZlOGJmLi5jY2NmODUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21zbV9jYW1fc2Vuc29yLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tc21fY2FtX3NlbnNvci5oCkBAIC00OCw2ICs0OCwxMiBAQAogCiAjZGVmaW5lIE1BWF9BRl9JVEVSQVRJT05TIDMKIAorZW51bSBmbGFzaF90eXBlIHsKKwlMRURfRkxBU0ggPSAxLAorCVNUUk9CRV9GTEFTSCwKKwlHUElPX0ZMQVNICit9OworCiBlbnVtIG1zbV9jYW1lcmFfaTJjX3JlZ19hZGRyX3R5cGUgewogCU1TTV9DQU1FUkFfSTJDX0JZVEVfQUREUiA9IDEsCiAJTVNNX0NBTUVSQV9JMkNfV09SRF9BRERSLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tc21fbWVkaWFfaW5mby5oIGIvaW5jbHVkZS9tZWRpYS9tc21fbWVkaWFfaW5mby5oCmluZGV4IDY1ODMxZGIuLmRkZjljOGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbXNtX21lZGlhX2luZm8uaAorKysgYi9pbmNsdWRlL21lZGlhL21zbV9tZWRpYV9pbmZvLmgKQEAgLTYsNyArNiw3NiBAQAogI2VuZGlmCiAKIGVudW0gY29sb3JfZm10cyB7CisJLyogVmVudXMgTlYxMjoKKwkgKiBZVVYgNDoyOjAgaW1hZ2Ugd2l0aCBhIHBsYW5lIG9mIDggYml0IFkgc2FtcGxlcyBmb2xsb3dlZAorCSAqIGJ5IGFuIGludGVybGVhdmVkIFUvViBwbGFuZSBjb250YWluaW5nIDggYml0IDJ4MiBzdWJzYW1wbGVkCisJICogY29sb3VyIGRpZmZlcmVuY2Ugc2FtcGxlcy4KKwkgKgorCSAqIDwtLS0tLS0tLSBZL1VWX1N0cmlkZSAtLS0tLS0tLT4KKwkgKiA8LS0tLS0tLSBXaWR0aCAtLS0tLS0tPgorCSAqIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFggWCBYIFggIF4gICAgICAgICAgIF4KKwkgKiBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBYIFggWCBYICB8ICAgICAgICAgICB8CisJICogWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWCBYIFggWCAgSGVpZ2h0ICAgICAgfAorCSAqIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFggWCBYIFggIHwgICAgICAgICAgWV9TY2FubGluZXMKKwkgKiBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBYIFggWCBYICB8ICAgICAgICAgICB8CisJICogWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWCBYIFggWCAgfCAgICAgICAgICAgfAorCSAqIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFggWCBYIFggIHwgICAgICAgICAgIHwKKwkgKiBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBYIFggWCBYICBWICAgICAgICAgICB8CisJICogWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCAgICAgICAgICAgICAgfAorCSAqIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggICAgICAgICAgICAgIHwKKwkgKiBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYICAgICAgICAgICAgICB8CisJICogWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCAgICAgICAgICAgICAgVgorCSAqIFUgViBVIFYgVSBWIFUgViBVIFYgVSBWIFggWCBYIFggIF4KKwkgKiBVIFYgVSBWIFUgViBVIFYgVSBWIFUgViBYIFggWCBYICB8CisJICogVSBWIFUgViBVIFYgVSBWIFUgViBVIFYgWCBYIFggWCAgfAorCSAqIFUgViBVIFYgVSBWIFUgViBVIFYgVSBWIFggWCBYIFggIFVWX1NjYW5saW5lcworCSAqIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggIHwKKwkgKiBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYICBWCisJICogWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCAgLS0+IEJ1ZmZlciBzaXplIGFsaWdubWVudAorCSAqCisJICogWV9TdHJpZGUgOiBXaWR0aCBhbGlnbmVkIHRvIDEyOAorCSAqIFVWX1N0cmlkZSA6IFdpZHRoIGFsaWduZWQgdG8gMTI4CisJICogWV9TY2FubGluZXM6IEhlaWdodCBhbGlnbmVkIHRvIDMyCisJICogVVZfU2NhbmxpbmVzOiBIZWlnaHQvMiBhbGlnbmVkIHRvIDE2CisJICogVG90YWwgc2l6ZSA9IGFsaWduKChZX1N0cmlkZSAqIFlfU2NhbmxpbmVzCisJICogICAgICAgICAgKyBVVl9TdHJpZGUgKiBVVl9TY2FubGluZXMgKyA0MDk2KSwgNDA5NikKKwkgKi8KIAlDT0xPUl9GTVRfTlYxMiwKKworCS8qIFZlbnVzIE5WMjE6CisJICogWVVWIDQ6MjowIGltYWdlIHdpdGggYSBwbGFuZSBvZiA4IGJpdCBZIHNhbXBsZXMgZm9sbG93ZWQKKwkgKiBieSBhbiBpbnRlcmxlYXZlZCBWL1UgcGxhbmUgY29udGFpbmluZyA4IGJpdCAyeDIgc3Vic2FtcGxlZAorCSAqIGNvbG91ciBkaWZmZXJlbmNlIHNhbXBsZXMuCisJICoKKwkgKiA8LS0tLS0tLS0gWS9VVl9TdHJpZGUgLS0tLS0tLS0+CisJICogPC0tLS0tLS0gV2lkdGggLS0tLS0tLT4KKwkgKiBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBYIFggWCBYICBeICAgICAgICAgICBeCisJICogWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWCBYIFggWCAgfCAgICAgICAgICAgfAorCSAqIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFggWCBYIFggIEhlaWdodCAgICAgIHwKKwkgKiBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBYIFggWCBYICB8ICAgICAgICAgIFlfU2NhbmxpbmVzCisJICogWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWCBYIFggWCAgfCAgICAgICAgICAgfAorCSAqIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFggWCBYIFggIHwgICAgICAgICAgIHwKKwkgKiBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWSBYIFggWCBYICB8ICAgICAgICAgICB8CisJICogWSBZIFkgWSBZIFkgWSBZIFkgWSBZIFkgWCBYIFggWCAgViAgICAgICAgICAgfAorCSAqIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggICAgICAgICAgICAgIHwKKwkgKiBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYICAgICAgICAgICAgICB8CisJICogWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCAgICAgICAgICAgICAgfAorCSAqIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggICAgICAgICAgICAgIFYKKwkgKiBWIFUgViBVIFYgVSBWIFUgViBVIFYgVSBYIFggWCBYICBeCisJICogViBVIFYgVSBWIFUgViBVIFYgVSBWIFUgWCBYIFggWCAgfAorCSAqIFYgVSBWIFUgViBVIFYgVSBWIFUgViBVIFggWCBYIFggIHwKKwkgKiBWIFUgViBVIFYgVSBWIFUgViBVIFYgVSBYIFggWCBYICBVVl9TY2FubGluZXMKKwkgKiBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYICB8CisJICogWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCAgVgorCSAqIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggWCBYIFggIC0tPiBQYWRkaW5nICYgQnVmZmVyIHNpemUgYWxpZ25tZW50CisJICoKKwkgKiBZX1N0cmlkZSA6IFdpZHRoIGFsaWduZWQgdG8gMTI4CisJICogVVZfU3RyaWRlIDogV2lkdGggYWxpZ25lZCB0byAxMjgKKwkgKiBZX1NjYW5saW5lczogSGVpZ2h0IGFsaWduZWQgdG8gMzIKKwkgKiBVVl9TY2FubGluZXM6IEhlaWdodC8yIGFsaWduZWQgdG8gMTYKKwkgKiBUb3RhbCBzaXplID0gYWxpZ24oKFlfU3RyaWRlICogWV9TY2FubGluZXMKKwkgKiAgICAgICAgICArIFVWX1N0cmlkZSAqIFVWX1NjYW5saW5lcyArIDQwOTYpLCA0MDk2KQorCSAqLwogCUNPTE9SX0ZNVF9OVjIxLAogfTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKaW5kZXggZDY2YjIxMy4uODQzMjMzMCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYworKysgYi9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCkBAIC02ODEsMjMgKzY4MSw2OSBAQAogICovCiBzdGF0aWMgdm9pZCB0aW1la2VlcGluZ19yZXN1bWUodm9pZCkKIHsKKwlzdHJ1Y3QgdGltZWtlZXBlciAqdGsgPSAmdGltZWtlZXBlcjsKKwlzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNsb2NrID0gdGstPmNsb2NrOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHRpbWVzcGVjIHRzOworCXN0cnVjdCB0aW1lc3BlYyB0c19uZXcsIHRzX2RlbHRhOworCWN5Y2xlX3QgY3ljbGVfbm93LCBjeWNsZV9kZWx0YTsKKwlib29sIHN1c3BlbmR0aW1lX2ZvdW5kID0gZmFsc2U7CiAKLQlyZWFkX3BlcnNpc3RlbnRfY2xvY2soJnRzKTsKKwlyZWFkX3BlcnNpc3RlbnRfY2xvY2soJnRzX25ldyk7CiAKIAljbG9ja3NvdXJjZV9yZXN1bWUoKTsKIAogCXdyaXRlX3NlcWxvY2tfaXJxc2F2ZSgmdGltZWtlZXBlci5sb2NrLCBmbGFncyk7CiAKLQlpZiAodGltZXNwZWNfY29tcGFyZSgmdHMsICZ0aW1la2VlcGluZ19zdXNwZW5kX3RpbWUpID4gMCkgewotCQl0cyA9IHRpbWVzcGVjX3N1Yih0cywgdGltZWtlZXBpbmdfc3VzcGVuZF90aW1lKTsKLQkJX190aW1la2VlcGluZ19pbmplY3Rfc2xlZXB0aW1lKCZ0cyk7CisJLyoKKwkgKiBBZnRlciBzeXN0ZW0gcmVzdW1lcywgd2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIHN1c3BlbmRlZCB0aW1lIGFuZAorCSAqIGNvbXBlbnNhdGUgaXQgZm9yIHRoZSBPUyB0aW1lLiBUaGVyZSBhcmUgMyBzb3VyY2VzIHRoYXQgY291bGQgYmUKKwkgKiB1c2VkOiBOb25zdG9wIGNsb2Nrc291cmNlIGR1cmluZyBzdXNwZW5kLCBwZXJzaXN0ZW50IGNsb2NrIGFuZCBydGMKKwkgKiBkZXZpY2UuCisJICoKKwkgKiBPbmUgc3BlY2lmaWMgcGxhdGZvcm0gbWF5IGhhdmUgMSBvciAyIG9yIGFsbCBvZiB0aGVtLCBhbmQgdGhlCisJICogcHJlZmVyZW5jZSB3aWxsIGJlOgorCSAqCXN1c3BlbmQtbm9uc3RvcCBjbG9ja3NvdXJjZSAtPiBwZXJzaXN0ZW50IGNsb2NrIC0+IHJ0YworCSAqIFRoZSBsZXNzIHByZWZlcnJlZCBzb3VyY2Ugd2lsbCBvbmx5IGJlIHRyaWVkIGlmIHRoZXJlIGlzIG5vIGJldHRlcgorCSAqIHVzYWJsZSBzb3VyY2UuIFRoZSBydGMgcGFydCBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgaW4gcnRjIGNvcmUgY29kZS4KKwkgKi8KKwljeWNsZV9ub3cgPSBjbG9jay0+cmVhZChjbG9jayk7CisJaWYgKChjbG9jay0+ZmxhZ3MgJiBDTE9DS19TT1VSQ0VfU1VTUEVORF9OT05TVE9QKSAmJgorCQljeWNsZV9ub3cgPiBjbG9jay0+Y3ljbGVfbGFzdCkgeworCQl1NjQgbnVtLCBtYXggPSBVTExPTkdfTUFYOworCQl1MzIgbXVsdCA9IGNsb2NrLT5tdWx0OworCQl1MzIgc2hpZnQgPSBjbG9jay0+c2hpZnQ7CisJCXM2NCBuc2VjID0gMDsKKworCQljeWNsZV9kZWx0YSA9IChjeWNsZV9ub3cgLSBjbG9jay0+Y3ljbGVfbGFzdCkgJiBjbG9jay0+bWFzazsKKworCQkvKgorCQkgKiAiY3ljbGVfZGVsdGEgKiBtdXRsIiBtYXkgY2F1c2UgNjQgYml0cyBvdmVyZmxvdywgaWYgdGhlCisJCSAqIHN1c3BlbmRlZCB0aW1lIGlzIHRvbyBsb25nLiBJbiB0aGF0IGNhc2Ugd2UgbmVlZCBkbyB0aGUKKwkJICogNjQgYml0cyBtYXRoIGNhcmVmdWxseQorCQkgKi8KKwkJZG9fZGl2KG1heCwgbXVsdCk7CisJCWlmIChjeWNsZV9kZWx0YSA+IG1heCkgeworCQkJbnVtID0gZGl2NjRfdTY0KGN5Y2xlX2RlbHRhLCBtYXgpOworCQkJbnNlYyA9ICgoKHU2NCkgbWF4ICogbXVsdCkgPj4gc2hpZnQpICogbnVtOworCQkJY3ljbGVfZGVsdGEgLT0gbnVtICogbWF4OworCQl9CisJCW5zZWMgKz0gKCh1NjQpIGN5Y2xlX2RlbHRhICogbXVsdCkgPj4gc2hpZnQ7CisKKwkJdHNfZGVsdGEgPSBuc190b190aW1lc3BlYyhuc2VjKTsKKwkJc3VzcGVuZHRpbWVfZm91bmQgPSB0cnVlOworCX0gZWxzZSBpZiAodGltZXNwZWNfY29tcGFyZSgmdHNfbmV3LCAmdGltZWtlZXBpbmdfc3VzcGVuZF90aW1lKSA+IDApIHsKKwkJdHNfZGVsdGEgPSB0aW1lc3BlY19zdWIodHNfbmV3LCB0aW1la2VlcGluZ19zdXNwZW5kX3RpbWUpOworCQlzdXNwZW5kdGltZV9mb3VuZCA9IHRydWU7CiAJfQotCS8qIHJlLWJhc2UgdGhlIGxhc3QgY3ljbGUgdmFsdWUgKi8KLQl0aW1la2VlcGVyLmNsb2NrLT5jeWNsZV9sYXN0ID0gdGltZWtlZXBlci5jbG9jay0+cmVhZCh0aW1la2VlcGVyLmNsb2NrKTsKLQl0aW1la2VlcGVyLm50cF9lcnJvciA9IDA7CisKKwlpZiAoc3VzcGVuZHRpbWVfZm91bmQpCisJCV9fdGltZWtlZXBpbmdfaW5qZWN0X3NsZWVwdGltZSgmdHNfZGVsdGEpOworCisJLyogUmUtYmFzZSB0aGUgbGFzdCBjeWNsZSB2YWx1ZSAqLworCWNsb2NrLT5jeWNsZV9sYXN0ID0gY3ljbGVfbm93OworCXRrLT5udHBfZXJyb3IgPSAwOwogCXRpbWVrZWVwaW5nX3N1c3BlbmRlZCA9IDA7CisJdGltZWtlZXBpbmdfdXBkYXRlKGZhbHNlKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmdGltZWtlZXBlci5sb2NrLCBmbGFncyk7CiAKIAl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CmRpZmYgLS1naXQgYS9saWIva2xpc3QuYyBiL2xpYi9rbGlzdC5jCmluZGV4IDA4NzRlNDEuLjM1OGEzNjggMTAwNjQ0Ci0tLSBhL2xpYi9rbGlzdC5jCisrKyBiL2xpYi9rbGlzdC5jCkBAIC0xOTMsMTAgKzE5MywxMCBAQAogCQlpZiAod2FpdGVyLT5ub2RlICE9IG4pCiAJCQljb250aW51ZTsKIAorCQlsaXN0X2RlbCgmd2FpdGVyLT5saXN0KTsKIAkJd2FpdGVyLT53b2tlbiA9IDE7CiAJCW1iKCk7CiAJCXdha2VfdXBfcHJvY2Vzcyh3YWl0ZXItPnByb2Nlc3MpOwotCQlsaXN0X2RlbCgmd2FpdGVyLT5saXN0KTsKIAl9CiAJc3Bpbl91bmxvY2soJmtsaXN0X3JlbW92ZV9sb2NrKTsKIAlrbm9kZV9zZXRfa2xpc3QobiwgTlVMTCk7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvcmVnLmMgYi9uZXQvd2lyZWxlc3MvcmVnLmMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBlOWEwYWM4Li5iOTYwOTRjCi0tLSBhL25ldC93aXJlbGVzcy9yZWcuYworKysgYi9uZXQvd2lyZWxlc3MvcmVnLmMKQEAgLTIxODcsMTAgKzIxODcsMTUgQEAKIAkJICogSG93ZXZlciBpZiBhIGRyaXZlciByZXF1ZXN0ZWQgdGhpcyBzcGVjaWZpYyByZWd1bGF0b3J5CiAJCSAqIGRvbWFpbiB3ZSBrZWVwIGl0IGZvciBpdHMgcHJpdmF0ZSB1c2UKIAkJICovCi0JCWlmIChsYXN0X3JlcXVlc3QtPmluaXRpYXRvciA9PSBOTDgwMjExX1JFR0RPTV9TRVRfQllfRFJJVkVSKQorCQlpZiAobGFzdF9yZXF1ZXN0LT5pbml0aWF0b3IgPT0gTkw4MDIxMV9SRUdET01fU0VUX0JZX0RSSVZFUikgeworCQkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnRtcDsKKworCQkJdG1wID0gcmVxdWVzdF93aXBoeS0+cmVnZDsKIAkJCXJlcXVlc3Rfd2lwaHktPnJlZ2QgPSByZDsKLQkJZWxzZQorCQkJa2ZyZWUodG1wKTsKKwkJfSBlbHNlIHsKIAkJCWtmcmVlKHJkKTsKKwkJfQogCiAJCXJkID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZSBiL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUKaW5kZXggNTZjZDVlNi4uYTNlZDIzZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCkBAIC01Myw3ICs1Myw3IEBACiBzbmQtc29jLWNzODQyNy1vYmpzIDo9IGNzODQyNy5vCiBzbmQtc29jLXdjZDkzMjAtb2JqcyA6PSB3Y2Q5eHh4LXJlc21nci5vIHdjZDkzMjAubyB3Y2Q5MzIwLXRhYmxlcy5vIHdjZDl4eHgtbWJoYy5vIHdjZDl4eHgtY29tbW9uLm8KIHNuZC1zb2Mtd2NkOTMwNi1vYmpzIDo9IHdjZDkzMDYubyB3Y2Q5MzA2LXRhYmxlcy5vIHdjZDl4eHgtY29tbW9uLm8KLXNuZC1zb2MtbXNtOHgxMC13Y2Qtb2JqcyA6PSBtc204eDEwLXdjZC5vIG1zbTh4MTAtd2NkLXRhYmxlcy5vCitzbmQtc29jLW1zbTh4MTAtd2NkLW9ianMgOj0gbXNtOHgxMC13Y2QubyBtc204eDEwLXdjZC10YWJsZXMubyB3Y2Q5eHh4LWNvbW1vbi5vCiBzbmQtc29jLXdsMTI3My1vYmpzIDo9IHdsMTI3My5vCiBzbmQtc29jLXdtMTI1MC1ldjEtb2JqcyA6PSB3bTEyNTAtZXYxLm8KIHNuZC1zb2Mtd20yMDAwLW9ianMgOj0gd20yMDAwLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxMC13Y2QuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxMC13Y2QuYwppbmRleCA5NDJkMDk1Li42Nzg1ZmUxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21zbTh4MTAtd2NkLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tc204eDEwLXdjZC5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSAid2NkOXh4eC1yZXNtZ3IuaCIKICNpbmNsdWRlICJtc204eDEwX3djZF9yZWdpc3RlcnMuaCIKICNpbmNsdWRlICIuLi9tc20vcWRzcDZ2Mi9xNmNvcmUuaCIKKyNpbmNsdWRlICJ3Y2Q5eHh4LWNvbW1vbi5oIgogCiAjZGVmaW5lIE1TTThYMTBfV0NEX1JBVEVTIChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfFwKIAkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDApCkBAIC02Myw2ICs2NCwxNSBAQAogI2RlZmluZSBNQVhfT05fREVNQU5EX1NVUFBMWV9OQU1FX0xFTkdUSCA2NAogI2RlZmluZSBIRUxJQ09OX01DTEtfQ0xLXzlQNk1IWgkJCQk5NjAwMDAwCiAKKy8qCisgKiBNdWx0aXBsaWNhdGlvbiBmYWN0b3IgdG8gY29tcHV0ZSBpbXBlZGFuY2Ugb24gY29kZWMKKyAqIFRoaXMgaXMgY29tcHV0ZWQgZnJvbSAoVnggLyAobSpJY2FsKSkgPSAoMTBtVi8oMTgwKjMwdUEpKQorICovCisjZGVmaW5lIE1TTThYMTBfV0NEX1pERVRfTVVMX0ZBQ1RPUiAxODUyCisKKy8qIFJYX0hQSF9DTlBfV0dfVElNRSBpbmNyZWFzZXMgYnkgMC4yNG1zICovCisjZGVmaW5lIE1TTThYMTBfV0NEX1dHX1RJTUVfRkFDVE9SX1VTICAyNDAKKwogZW51bSB7CiAJTVNNOFgxMF9XQ0RfSTJDX1RPUF9MRVZFTCA9IDAsCiAJTVNNOFgxMF9XQ0RfSTJDX0FOQUxPRywKQEAgLTE2OCw2ICsxNzgsMTIgQEAKIAogCXN0cnVjdCBkZWxheWVkX3dvcmsgaHNfZGV0ZWN0X3dvcms7CiAJc3RydWN0IHdjZDl4eHhfbWJoY19jb25maWcgKm1iaGNfY2ZnOworCisJLyoKKwkgKiBsaXN0IHVzZWQgdG8gc2F2ZS9yZXN0b3JlIHJlZ2lzdGVycyBhdCBzdGFydCBhbmQKKwkgKiBlbmQgb2YgaW1wZWRhbmNlIG1lYXN1cmVtZW50CisJICovCisJc3RydWN0IGxpc3RfaGVhZCByZWdfc2F2ZV9yZXN0b3JlOwogfTsKIAogc3RhdGljIHVuc2lnbmVkIHNob3J0IHJ4X2RpZ2l0YWxfZ2Fpbl9yZWdbXSA9IHsKQEAgLTE5Miw3ICsyMDgsNyBAQAogCXN0cnVjdCBtc204eDEwX3djZF9yZWd1bGF0b3IgKnZyZWcsCiAJY29uc3QgY2hhciAqdnJlZ19uYW1lLCBib29sIG9uZGVtYW5kKTsKIHN0YXRpYyBpbnQgbXNtOHgxMF93Y2RfZHRfcGFyc2VfbWljYmlhc19pbmZvKHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgbXNtOHgxMF93Y2RfbWljYmlhc19zZXR0aW5nICptaWNiaWFzKTsKKwlzdHJ1Y3Qgd2NkOXh4eF9taWNiaWFzX3NldHRpbmcgKm1pY2JpYXMpOwogc3RhdGljIHN0cnVjdCBtc204eDEwX3djZF9wZGF0YSAqbXNtOHgxMF93Y2RfcG9wdWxhdGVfZHRfcGRhdGEoCiAJc3RydWN0IGRldmljZSAqZGV2KTsKIApAQCAtNDM1LDggKzQ1MSw4IEBACiAJCQkJX19mdW5jX18sIHJlZyk7CiAJZWxzZQogCQlkZXZfZGJnKG1zbTh4MTBfd2NkLT5kZXYsCi0JCQkJIiVzOiBDb2RlYyByZWcgMHgleCB3cml0dGVuIHdpdGggdmFsdWUgMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgcmVnLCB2YWwpOworCQkJIiVzOiBXcml0ZSAleCB0byBSJWQoMHgleClcbiIsCisJCQlfX2Z1bmNfXywgdmFsLCByZWcsIHJlZyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjA5LDEzICs2MjUsMjQgQEAKIH0KIAogc3RhdGljIGludCBtc204eDEwX3djZF9kdF9wYXJzZV9taWNiaWFzX2luZm8oc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBtc204eDEwX3djZF9taWNiaWFzX3NldHRpbmcgKm1pY2JpYXMpCisJc3RydWN0IHdjZDl4eHhfbWljYmlhc19zZXR0aW5nICptaWNiaWFzKQogewogCWludCByZXQgPSAwOwogCWNoYXIgcHJvcF9uYW1lW0NPREVDX0RUX01BWF9QUk9QX1NJWkVdOwogCXUzMiBwcm9wX3ZhbDsKIAogCXNucHJpbnRmKHByb3BfbmFtZSwgQ09ERUNfRFRfTUFYX1BST1BfU0laRSwKKwkJICJxY29tLGNkYy1taWNiaWFzLWxkb2gtdiIpOworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgcHJvcF9uYW1lLAorCQkJCSAgICZwcm9wX3ZhbCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkxvb2tpbmcgdXAgJXMgcHJvcGVydHkgaW4gbm9kZSAlcyBmYWlsZWQiLAorCQkJcHJvcF9uYW1lLCBkZXYtPm9mX25vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwltaWNiaWFzLT5sZG9oX3YgPSAodTgpIHByb3BfdmFsOworCisJc25wcmludGYocHJvcF9uYW1lLCBDT0RFQ19EVF9NQVhfUFJPUF9TSVpFLAogCQkgInFjb20sY2RjLW1pY2JpYXMtY2ZpbHQtbXYiKTsKIAlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsIHByb3BfbmFtZSwKIAkJCQkgICAmbWljYmlhcy0+Y2ZpbHQxX212KTsKQEAgLTI1MTUsNyArMjU0Miw3IEBACiAKIAkvKiBEaXNhYmxlIGludGVybmFsIGJpYXNpbmcgcGF0aCB3aGljaCBjYW4gY2F1c2UgbGVha2FnZSAqLwogCU1TTThYMTBfV0NEX1JFR19WQUwoTVNNOFgxMF9XQ0RfQV9CSUFTX0NVUlJfQ1RMXzIsIDB4MDQpLAotCU1TTThYMTBfV0NEX1JFR19WQUwoTVNNOFgxMF9XQ0RfQV9NSUNCX0NGSUxUXzFfVkFMLCAweDYwKSwKKwogCS8qIEVuYWJsZSBwdWxsZG93biB0byByZWR1Y2UgbGVha2FnZSAqLwogCU1TTThYMTBfV0NEX1JFR19WQUwoTVNNOFgxMF9XQ0RfQV9NSUNCXzFfQ1RMLCAweDgyKSwKIAlNU004WDEwX1dDRF9SRUdfVkFMKE1TTThYMTBfV0NEX0FfVFhfQ09NX0JJQVMsIDB4RTApLApAQCAtMjY4OSw2ICsyNzE2LDIyOCBAQAogCQkJICAgIDB4NDAsIG9uID8gMHg0MCA6IDB4MDApOwogfQogCitzdGF0aWMgdm9pZCBtc204eDEwX3djZF9wcmVwYXJlX2hwaF9wYShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxoKQoreworCWludCBpOworCXUzMiBkZWxheTsKKworCWNvbnN0IHN0cnVjdCB3Y2Q5eHh4X3JlZ19tYXNrX3ZhbCByZWdfc2V0X3Bhb25bXSA9IHsKKwkJe01TTThYMTBfV0NEX0FfQ0RDX1JYMV9CNl9DVEwsIDB4RkYsIDB4MDF9LAorCQl7TVNNOFgxMF9XQ0RfQV9DRENfUlgyX0I2X0NUTCwgMHhGRiwgMHgwMX0sCisJCXtNU004WDEwX1dDRF9BX1JYX0hQSF9MX0dBSU4sIDB4RkYsIDB4MkN9LAorCQl7TVNNOFgxMF9XQ0RfQV9SWF9IUEhfUl9HQUlOLCAweEZGLCAweDJDfSwKKwkJe01TTThYMTBfV0NEX0FfQ0RDX0NMS19SWF9CMV9DVEwsIDB4RkYsIDB4MDF9LAorCQl7TVNNOFgxMF9XQ0RfQV9SWF9DT01fQklBUywgMHhGRiwgMHg4MH0sCisJCXtNU004WDEwX1dDRF9BX0NQX0VOLCAweEZGLCAweEU3fSwKKwkJe01TTThYMTBfV0NEX0FfQ1BfU1RBVElDLCAweEZGLCAweDEzfSwKKwkJe01TTThYMTBfV0NEX0FfQ1BfU1RBVElDLCAweEZGLCAweDFCfSwKKwkJe01TTThYMTBfV0NEX0FfQ0RDX1JYMl9CNl9DVEwsIDB4RkYsIDB4MDF9LAorCQl7TVNNOFgxMF9XQ0RfQV9DRENfQ0xLX1JYX0IxX0NUTCwgMHhGRiwgMHgwM30sCisJCXtNU004WDEwX1dDRF9BX0NEQ19BTkFfQ0xLX0NUTCwgMHhGRiwgMHgyMn0sCisJCXtNU004WDEwX1dDRF9BX0NEQ19BTkFfQ0xLX0NUTCwgMHhGRiwgMHgyM30sCisJCXtNU004WDEwX1dDRF9BX1JYX0hQSF9DTlBfV0dfQ1RMLCAweEZGLCAweERBfSwKKwkJe01TTThYMTBfV0NEX0FfQ0RDX0RJR19DTEtfQ1RMLCAweEZGLCAweDAxfSwKKwkJe01TTThYMTBfV0NEX0FfQ0RDX0RJR19DTEtfQ1RMLCAweEZGLCAweDAzfSwKKwkJe01TTThYMTBfV0NEX0FfUlhfSFBIX0NIT1BfQ1RMLCAweEZGLCAweEE0fSwKKwkJe01TTThYMTBfV0NEX0FfUlhfSFBIX09DUF9DVEwsIDB4RkYsIDB4Njd9LAorCQl7TVNNOFgxMF9XQ0RfQV9SWF9IUEhfTF9URVNULCAweDAxLCAweDAwfSwKKwkJe01TTThYMTBfV0NEX0FfUlhfSFBIX1JfVEVTVCwgMHgwMSwgMHgwMH0sCisJCXtNU004WDEwX1dDRF9BX1JYX0hQSF9CSUFTX1dHX09DUCwgMHhGRiwgMHgxQX0sCisJCXtNU004WDEwX1dDRF9BX1JYX0hQSF9DTlBfV0dfQ1RMLCAweEZGLCAweERCfSwKKwkJe01TTThYMTBfV0NEX0FfUlhfSFBIX0NOUF9XR19USU1FLCAweEZGLCAweERCfSwKKwkJe01TTThYMTBfV0NEX0FfUlhfSFBIX0xfREFDX0NUTCwgMHhGRiwgMHg0MH0sCisJCXtNU004WDEwX1dDRF9BX1JYX0hQSF9MX0RBQ19DVEwsIDB4RkYsIDB4QzB9LAorCQl7TVNNOFgxMF9XQ0RfQV9SWF9IUEhfUl9EQUNfQ1RMLCAweEZGLCAweDQwfSwKKwkJe01TTThYMTBfV0NEX0FfUlhfSFBIX1JfREFDX0NUTCwgMHhGRiwgMHhDMH0sCisJCXtNU004WDEwX1dDRF9BX1JYX0hQSF9MX0RBQ19DVEwsIDB4MDMsIDB4MDF9LAorCQl7TVNNOFgxMF9XQ0RfQV9SWF9IUEhfUl9EQUNfQ1RMLCAweDAzLCAweDAxfSwKKwl9OworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVnX3NldF9wYW9uKTsgaSsrKSB7CisJCWRlbGF5ID0gMDsKKwkJd2NkOXh4eF9zb2NfdXBkYXRlX2JpdHNfcHVzaChjb2RlYywgbGgsCisJCQkJCSAgICAgcmVnX3NldF9wYW9uW2ldLnJlZywKKwkJCQkJICAgICByZWdfc2V0X3Bhb25baV0ubWFzaywKKwkJCQkJICAgICByZWdfc2V0X3Bhb25baV0udmFsLCBkZWxheSk7CisJfQorCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBQQXMgYXJlIHByZXBhcmVkXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IG1zbTh4MTBfd2NkX2VuYWJsZV9zdGF0aWNfcGEoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCQlib29sIGVuYWJsZSkKK3sKKwlpbnQgd2dfdGltZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOVhYWF9BX1JYX0hQSF9DTlBfV0dfVElNRSkgKgorCQkJCU1TTThYMTBfV0NEX1dHX1RJTUVfRkFDVE9SX1VTOworCisJd2dfdGltZSArPSAoaW50KSAod2dfdGltZSAqIDM1KSAvIDEwMDsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1TTThYMTBfV0NEX0FfUlhfSFBIX0NOUF9FTiwgMHgzMCwKKwkJCSAgICBlbmFibGUgPyAweDMwIDogMHgwKTsKKwkvKiBXYWl0IGZvciB3YXZlIGdlbiB0aW1lIHRvIGF2b2lkIHBvcCBub2lzZSAqLworCXVzbGVlcF9yYW5nZSh3Z190aW1lLCB3Z190aW1lICsgV0NEOVhYWF9VU0xFRVBfUkFOR0VfTUFSR0lOX1VTKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNU004WDEwX1dDRF9BX0NEQ19SWDFfQjZfQ1RMLCAweEZGLCAweDAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNU004WDEwX1dDRF9BX0NEQ19SWDJfQjZfQ1RMLCAweEZGLCAweDAwKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBQQXMgYXJlICVzIGFzIHN0YXRpYyBtb2RlICh3Z190aW1lICVkKVxuIiwKKwkJX19mdW5jX18sIGVuYWJsZSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsIHdnX3RpbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbTh4MTBfd2NkX3NldHVwX3pkZXQoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywKKwkJCQkgIGVudW0gbWJoY19pbXBlZGFuY2VfZGV0ZWN0X3N0YWdlcyBzdGFnZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKKwlzdHJ1Y3QgbXNtOHgxMF93Y2RfcHJpdiAqd2NkX3ByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwljb25zdCBpbnQgbXV4X3dhaXRfdXMgPSAyNTsKKworI2RlZmluZSBfX3dyKHJlZywgbWFzaywgdmFsdWUpCQkJCQlcCisJZG8gewkJCQkJCQlcCisJCXJldCA9IHdjZDl4eHhfc29jX3VwZGF0ZV9iaXRzX3B1c2goY29kZWMsCVwKKwkJCQkmd2NkX3ByaXYtPnJlZ19zYXZlX3Jlc3RvcmUsCVwKKwkJCQlyZWcsIG1hc2ssIHZhbHVlLCAwKTsJCVwKKwkJaWYgKHJldCA8IDApCQkJCQlcCisJCQlyZXR1cm4gcmV0OwkJCQlcCisJIH0gd2hpbGUgKDApCisKKwlzd2l0Y2ggKHN0YWdlKSB7CisJY2FzZSBQUkVfTUVBUzoKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFBSRV9NRUFTXG4iLCBfX2Z1bmNfXyk7CisJCUlOSVRfTElTVF9IRUFEKCZ3Y2RfcHJpdi0+cmVnX3NhdmVfcmVzdG9yZSk7CisJCS8qIENvbmZpZ3VyZSBQQSAqLworCQltc204eDEwX3djZF9wcmVwYXJlX2hwaF9wYShtYmhjLT5jb2RlYywKKwkJCQkJICAgJndjZF9wcml2LT5yZWdfc2F2ZV9yZXN0b3JlKTsKKworCQkvKiBTZXR1cCBNQkhDICovCisJCV9fd3IoV0NEOVhYWF9BX01CSENfU0NBTElOR19NVVhfMSwgMHg3RiwgMHg0MCk7CisJCV9fd3IoV0NEOVhYWF9BX01CSENfU0NBTElOR19NVVhfMiwgMHhGRiwgMHhGMCk7CisJCV9fd3IoMHgxNzEsIDB4RkYsIDB4OTApOworCQlfX3dyKFdDRDlYWFhfQV9UWF83X01CSENfRU4sIDB4RkYsIDB4RjApOworCQlfX3dyKFdDRDlYWFhfQV9DRENfTUJIQ19USU1FUl9CNF9DVEwsIDB4RkYsIDB4NDUpOworCQlfX3dyKFdDRDlYWFhfQV9DRENfTUJIQ19USU1FUl9CNV9DVEwsIDB4RkYsIDB4ODApOworCisJCV9fd3IoV0NEOVhYWF9BX0NEQ19NQkhDX0NMS19DVEwsIDB4RkYsIDB4MEEpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfQ0RDX01CSENfRU5fQ1RMLCAweDIpOworCQlfX3dyKFdDRDlYWFhfQV9DRENfTUJIQ19DTEtfQ1RMLCAweEZGLCAweDAyKTsKKworCQkvKiBFbmFibGUgSW1wZWRhbmNlIERldGVjdGlvbiAqLworCQlfX3dyKFdDRDlYWFhfQV9NQkhDX0hQSCwgMHhGRiwgMHhDOCk7CisKKwkJLyoKKwkJICogQ25QIHNldHVwIGZvciAwbVYKKwkJICogUm91dGUgc3RhdGljIGRhdGEgYXMgaW5wdXQgdG8gbm9pc2Ugc2hhcGVyCisJCSAqLworCQlfX3dyKE1TTThYMTBfV0NEX0FfQ0RDX1JYMV9CM19DVEwsIDB4RkYsIDB4MDIpOworCQlfX3dyKE1TTThYMTBfV0NEX0FfQ0RDX1JYMl9CM19DVEwsIDB4RkYsIDB4MDIpOworCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9SWF9IUEhfTF9URVNULAorCQkJCSAgICAweDAyLCAweDAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1JYX0hQSF9SX1RFU1QsCisJCQkJICAgIDB4MDIsIDB4MDApOworCisJCS8qIFJlc2V0IHRoZSBIUEhMIHN0YXRpYyBkYXRhIHBvaW50ZXIgKi8KKwkJX193cihNU004WDEwX1dDRF9BX0NEQ19SWDFfQjJfQ1RMLCAweEZGLCAweDAwKTsKKwkJLyogRm91ciBjb25zZWN1dGl2ZSB3cml0ZXMgdG8gc2V0IDBWIGFzIHN0YXRpYyBkYXRhIGlucHV0ICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIE1TTThYMTBfV0NEX0FfQ0RDX1JYMV9CMV9DVEwsIDB4MDApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBNU004WDEwX1dDRF9BX0NEQ19SWDFfQjFfQ1RMLCAweDAwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgTVNNOFgxMF9XQ0RfQV9DRENfUlgxX0IxX0NUTCwgMHgwMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIE1TTThYMTBfV0NEX0FfQ0RDX1JYMV9CMV9DVEwsIDB4MDApOworCisJCS8qIFJlc2V0IHRoZSBIUEhSIHN0YXRpYyBkYXRhIHBvaW50ZXIgKi8KKwkJX193cihNU004WDEwX1dDRF9BX0NEQ19SWDJfQjJfQ1RMLCAweEZGLCAweDAwKTsKKwkJLyogRm91ciBjb25zZWN1dGl2ZSB3cml0ZXMgdG8gc2V0IDBWIGFzIHN0YXRpYyBkYXRhIGlucHV0ICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIE1TTThYMTBfV0NEX0FfQ0RDX1JYMl9CMV9DVEwsIDB4MDApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBNU004WDEwX1dDRF9BX0NEQ19SWDJfQjFfQ1RMLCAweDAwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgTVNNOFgxMF9XQ0RfQV9DRENfUlgyX0IxX0NUTCwgMHgwMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIE1TTThYMTBfV0NEX0FfQ0RDX1JYMl9CMV9DVEwsIDB4MDApOworCisJCS8qIEVuYWJsZSB0aGUgSFBITCBhbmQgSFBIUiBQQSAqLworCQltc204eDEwX3djZF9lbmFibGVfc3RhdGljX3BhKG1iaGMtPmNvZGVjLCB0cnVlKTsKKwkJYnJlYWs7CisKKwljYXNlIFBPU1RfTUVBUzoKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFBPU1RfTUVBU1xuIiwgX19mdW5jX18pOworCQkvKiBUdXJuIG9mZiBJQ0FMICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9NQkhDX1NDQUxJTkdfTVVYXzIsIDB4RjApOworCisJCW1zbTh4MTBfd2NkX2VuYWJsZV9zdGF0aWNfcGEobWJoYy0+Y29kZWMsIGZhbHNlKTsKKworCQkvKgorCQkgKiBTZXR1cCBDblAgd2F2ZWdlbiB0byByYW1wIHRvIHRoZSBkZXNpcmVkCisJCSAqIG91dHB1dCB1c2luZyBhIDQwbXMgcmFtcAorCQkgKi8KKworCQkvKiBDblAgd2F2ZWdlbiBjdXJyZW50IHRvIDAuNXVBICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9SWF9IUEhfQklBU19XR19PQ1AsIDB4MUEpOworCQkvKiBTZXQgdGhlIGN1cnJlbnQgZGl2aXNpb24gcmF0aW8gdG8gMjAwMCAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0FfUlhfSFBIX0NOUF9XR19DVEwsIDB4REYpOworCQkvKiBTZXQgdGhlIHdhdmVnZW4gdGltZXIgdG8gbWF4ICg2MG1zZWMpICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9SWF9IUEhfQ05QX1dHX1RJTUUsIDB4QTApOworCQkvKiBTZXQgdGhlIENuUCByZWZlcmVuY2UgY3VycmVudCB0byBzY19iaWFzICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDlYWFhfQV9SWF9IUEhfT0NQX0NUTCwgMHg2RCk7CisKKwkJc25kX3NvY193cml0ZShjb2RlYywgTVNNOFgxMF9XQ0RfQV9DRENfUlgxX0IyX0NUTCwgMHgwMCk7CisJCS8qIEZvdXIgY29uc2VjdXRpdmUgd3JpdGVzIHRvIHNldCAtMTBtViBhcyBzdGF0aWMgZGF0YSBpbnB1dCAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBNU004WDEwX1dDRF9BX0NEQ19SWDFfQjFfQ1RMLCAweDAwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgTVNNOFgxMF9XQ0RfQV9DRENfUlgxX0IxX0NUTCwgMHgxRik7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIE1TTThYMTBfV0NEX0FfQ0RDX1JYMV9CMV9DVEwsIDB4RTMpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBNU004WDEwX1dDRF9BX0NEQ19SWDFfQjFfQ1RMLCAweDA4KTsKKworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBNU004WDEwX1dDRF9BX0NEQ19SWDJfQjJfQ1RMLCAweDAwKTsKKwkJLyogRm91ciBjb25zZWN1dGl2ZSB3cml0ZXMgdG8gc2V0IC0xMG1WIGFzIHN0YXRpYyBkYXRhIGlucHV0ICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIE1TTThYMTBfV0NEX0FfQ0RDX1JYMl9CMV9DVEwsIDB4MDApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBNU004WDEwX1dDRF9BX0NEQ19SWDJfQjFfQ1RMLCAweDFGKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgTVNNOFgxMF9XQ0RfQV9DRENfUlgyX0IxX0NUTCwgMHhFMyk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIE1TTThYMTBfV0NEX0FfQ0RDX1JYMl9CMV9DVEwsIDB4MDgpOworCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9SWF9IUEhfTF9URVNULAorCQkJCSAgICAweDAyLCAweDAyKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX1JYX0hQSF9SX1RFU1QsCisJCQkJICAgIDB4MDIsIDB4MDIpOworCQkvKiBFbmFibGUgdGhlIEhQSEwgYW5kIEhQSFIgUEEgYW5kIHdhaXQgZm9yIDYwbVMgKi8KKwkJbXNtOHgxMF93Y2RfZW5hYmxlX3N0YXRpY19wYShtYmhjLT5jb2RlYywgdHJ1ZSk7CisKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX01CSENfU0NBTElOR19NVVhfMSwKKwkJCQkgICAgMHg3RiwgMHg0MCk7CisJCXVzbGVlcF9yYW5nZShtdXhfd2FpdF91cywKKwkJCQltdXhfd2FpdF91cyArIFdDRDlYWFhfVVNMRUVQX1JBTkdFX01BUkdJTl9VUyk7CisJCWJyZWFrOworCWNhc2UgUEFfRElTQUJMRToKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFBBX0RJU0FCTEVcbiIsIF9fZnVuY19fKTsKKwkJbXNtOHgxMF93Y2RfZW5hYmxlX3N0YXRpY19wYShtYmhjLT5jb2RlYywgZmFsc2UpOworCQl3Y2Q5eHh4X3Jlc3RvcmVfcmVnaXN0ZXJzKGNvZGVjLCAmd2NkX3ByaXYtPnJlZ19zYXZlX3Jlc3RvcmUpOworCQlicmVhazsKKwl9CisjdW5kZWYgX193cgorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXNtOHgxMF93Y2RfY29tcHV0ZV9pbXBlZGFuY2UoczE2ICpsLCBzMTYgKnIsIHVpbnQzMl90ICp6bCwKKwkJCQkJICB1aW50MzJfdCAqenIpCit7CisJaW50IHpsbiwgemxkOworCWludCB6cm4sIHpyZDsKKwlpbnQgcmwgPSAwLCByciA9IDA7CisKKwl6bG4gPSAobFsxXSAtIGxbMF0pICogTVNNOFgxMF9XQ0RfWkRFVF9NVUxfRkFDVE9SOworCXpsZCA9IChsWzJdIC0gbFswXSk7CisJaWYgKHpsZCkKKwkJcmwgPSB6bG4gLyB6bGQ7CisKKwl6cm4gPSAoclsxXSAtIHJbMF0pICogTVNNOFgxMF9XQ0RfWkRFVF9NVUxfRkFDVE9SOworCXpyZCA9IChyWzJdIC0gclswXSk7CisJaWYgKHpyZCkKKwkJcnIgPSB6cm4gLyB6cmQ7CisKKwkqemwgPSBybDsKKwkqenIgPSBycjsKK30KKworCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkOXh4eF9tYmhjX2NiIG1iaGNfY2IgPSB7CiAJLmVuYWJsZV9tdXhfYmlhc19ibG9jayA9IG1zbTh4MTBfd2NkX2VuYWJsZV9tdXhfYmlhc19ibG9jaywKIAkuY2ZpbHRfZmFzdF9tb2RlID0gbXNtOHgxMF93Y2RfcHV0X2NmaWx0X2Zhc3RfbW9kZSwKQEAgLTI3MDEsNiArMjk1MCw4IEBACiAJLmVuYWJsZV9tYl9zb3VyY2UgPSBtc204eDEwX3djZF9lbmFibGVfZXh0X21iX3NvdXJjZSwKIAkuc2V0dXBfaW50X3JiaWFzID0gbXNtOHgxMF93Y2RfbWljYl9pbnRlcm5hbCwKIAkucHVsbF9tYl90b192ZGRpbyA9IG1zbTh4MTBfd2NkX2VuYWJsZV9tYl92ZGRpbywKKwkuc2V0dXBfemRldCA9IG1zbTh4MTBfd2NkX3NldHVwX3pkZXQsCisJLmNvbXB1dGVfaW1wZWRhbmNlID0gbXNtOHgxMF93Y2RfY29tcHV0ZV9pbXBlZGFuY2UsCiB9OwogCiBzdGF0aWMgdm9pZCBkZWxheWVkX2hzX2RldGVjdF9mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0yODE1LDYgKzMwNjYsNDEgQEAKIAkuaHNfamFja19zd2l0Y2ggPSBNU004WDEwX1dDRF9JUlFfTUJIQ19IU19ERVQsCiB9OwogCitzdGF0aWMgaW50IG1zbTh4MTBfd2NkX2hhbmRsZV9wZGF0YShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IG1zbTh4MTBfd2NkX3BkYXRhICpwZGF0YSkKK3sKKwlpbnQgazEsIHJjID0gMDsKKwlzdHJ1Y3QgbXNtOHgxMF93Y2RfcHJpdiAqbXNtOHgxMF93Y2RfcHJpdjsKKworCW1zbTh4MTBfd2NkX3ByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCS8qIE1ha2Ugc3VyZSBzZXR0aW5ncyBhcmUgY29ycmVjdCAqLworCWlmIChwZGF0YS0+bWljYmlhcy5sZG9oX3YgPiBXQ0Q5WFhYX0xET0hfM1AwX1YgfHwKKwkgICAgcGRhdGEtPm1pY2JpYXMuYmlhczFfY2ZpbHRfc2VsID4gV0NEOVhYWF9DRklMVDFfU0VMKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCS8qIGZpZ3VyZSBvdXQgayB2YWx1ZSAqLworCWsxID0gd2NkOXh4eF9yZXNtZ3JfZ2V0X2tfdmFsKCZtc204eDEwX3djZF9wcml2LT5yZXNtZ3IsCisJCQkJIHBkYXRhLT5taWNiaWFzLmNmaWx0MV9tdik7CisJaWYgKElTX0VSUl9WQUxVRShrMSkpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogU2V0IHZvbHRhZ2UgbGV2ZWwgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNU004WDEwX1dDRF9BX01JQ0JfQ0ZJTFRfMV9WQUwsCisJCQkgICAgMHhGQywgKGsxIDw8IDIpKTsKKworCS8qIHVwZGF0ZSBtaWNiaWFzIGNhcGxlc3MgbW9kZSAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1TTThYMTBfV0NEX0FfTUlDQl8xX0NUTCwgMHgxMCwKKwkJCSAgICBwZGF0YS0+bWljYmlhcy5iaWFzMV9jYXBfbW9kZSA8PCA0KTsKKworZG9uZToKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyBpbnQgbXNtOHgxMF93Y2RfY29kZWNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBtc204eDEwX3djZF9wcml2ICptc204eDEwX3djZF9wcml2OwpAQCAtMjg1MSwxMiArMzEzNywxOCBAQAogCUlOSVRfREVMQVlFRF9XT1JLKCZtc204eDEwX3djZF9wcml2LT5oc19kZXRlY3Rfd29yaywKIAkJCWRlbGF5ZWRfaHNfZGV0ZWN0X2ZuKTsKIAorCXBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShtc204eDEwX3djZC0+ZGV2KTsKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIobXNtOHgxMF93Y2QtPmRldiwgIiVzOiBwbGF0Zm9ybSBkYXRhIG5vdCBmb3VuZFxuIiwKKwkJCV9fZnVuY19fKTsKKwl9CisKIAkvKiBjb2RlYyByZXNtZ3IgbW9kdWxlIGluaXQgKi8KIAltc204eDEwX3djZCA9IGNvZGVjLT5jb250cm9sX2RhdGE7CiAJY29yZV9yZXMgPSAmbXNtOHgxMF93Y2QtPndjZDl4eHhfcmVzOwogCXJldCA9IHdjZDl4eHhfcmVzbWdyX2luaXQoJm1zbTh4MTBfd2NkX3ByaXYtPnJlc21nciwKLQkJCQljb2RlYywgY29yZV9yZXMsIE5VTEwsIE5VTEwsCi0JCQkJV0NEOVhYWF9DRENfVFlQRV9IRUxJQ09OKTsKKwkJCQljb2RlYywgY29yZV9yZXMsIE5VTEwsICZwZGF0YS0+bWljYmlhcywKKwkJCQlOVUxMLCBXQ0Q5WFhYX0NEQ19UWVBFX0hFTElDT04pOwogCWlmIChyZXQpIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LAogCQkJCSIlczogd2NkOXh4eCBpbml0IGZhaWxlZCAlZFxuIiwKQEAgLTI4NjgsMTYgKzMxNjAsNiBAQAogCW1zbTh4MTBfd2NkX2NvZGVjX2luaXRfcmVnKGNvZGVjKTsKIAltc204eDEwX3djZF91cGRhdGVfcmVnX2RlZmF1bHRzKGNvZGVjKTsKIAotCXBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShtc204eDEwX3djZC0+ZGV2KTsKLQlpZiAoIXBkYXRhKSB7Ci0JCWRldl9lcnIobXNtOHgxMF93Y2QtPmRldiwgIiVzOiBwbGF0Zm9ybSBkYXRhIG5vdCBmb3VuZFxuIiwKLQkJCV9fZnVuY19fKTsKLQl9Ci0KLQkvKiB1cGRhdGUgbWljYmlhcyBjYXBsZXNzIG1vZGUgKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNU004WDEwX1dDRF9BX01JQ0JfMV9DVEwsIDB4MTAsCi0JCQkgICAgcGRhdGEtPm1pY2JpYXMuYmlhczFfY2FwX21vZGUgPDwgNCk7Ci0KIAltc204eDEwX3djZF9wcml2LT5vbl9kZW1hbmRfbGlzdFtPTl9ERU1BTkRfQ1BdLnN1cHBseSA9CiAJCQkJd2NkOHgxMF93Y2RfY29kZWNfZmluZF9yZWd1bGF0b3IoCiAJCQkJY29kZWMtPmNvbnRyb2xfZGF0YSwKQEAgLTI4OTIsMTIgKzMxNzQsMTggQEAKIAlyZXQgPSB3Y2Q5eHh4X21iaGNfaW5pdCgmbXNtOHgxMF93Y2RfcHJpdi0+bWJoYywKIAkJCQkmbXNtOHgxMF93Y2RfcHJpdi0+cmVzbWdyLAogCQkJCWNvZGVjLCBOVUxMLCAmbWJoY19jYiwgJmNkY19pbnRyX2lkcywKLQkJCQlIRUxJQ09OX01DTEtfQ0xLXzlQNk1IWiwgZmFsc2UpOworCQkJCUhFTElDT05fTUNMS19DTEtfOVA2TUhaLCB0cnVlKTsKIAlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIG1iaGNcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2Vycihtc204eDEwX3djZC0+ZGV2LCAiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIG1iaGNcbiIsCisJCQlfX2Z1bmNfXyk7CiAJCWdvdG8gZXhpdF9wcm9iZTsKIAl9CiAKKwkvKiBIYW5kbGUgdGhlIFBkYXRhICovCisJcmV0ID0gbXNtOHgxMF93Y2RfaGFuZGxlX3BkYXRhKGNvZGVjLCBwZGF0YSk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKQorCQlkZXZfZXJyKG1zbTh4MTBfd2NkLT5kZXYsICIlczogQmFkIFBkYXRhXG4iLCBfX2Z1bmNfXyk7CisKIAlyZWdpc3RlcmVkX2NvZGVjID0gY29kZWM7CiAJYWRzcF9zdGF0ZV9ub3RpZmllciA9CiAJICAgIHN1YnN5c19ub3RpZl9yZWdpc3Rlcl9ub3RpZmllcigiYWRzcCIsCkBAIC0zMjAyLDYgKzM0OTAsMTEgQEAKIAkJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczpQbGF0Zm9ybSBkYXRhIGZyb20gZGV2aWNlIHRyZWVcbiIsCiAJCQlfX2Z1bmNfXyk7CiAJCXBkYXRhID0gbXNtOHgxMF93Y2RfcG9wdWxhdGVfZHRfcGRhdGEoJmNsaWVudC0+ZGV2KTsKKwkJaWYgKCFwZGF0YSkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogRmFpbGVkIHRvIHBhcnNlIHBkYXRhIGZyb20gZGV2aWNlIHRyZWVcbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBydG47CisJCX0KIAkJY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOwogCX0gZWxzZSB7CiAJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXM6UGxhdGZvcm0gZGF0YSBmcm9tIGJvYXJkIGZpbGVcbiIsCkBAIC0zMzExLDEyICszNjA0LDYxIEBACiAJeyB9LAogfTsKIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBtc204eDEwX3djZF9pMmNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBtc204eDEwX3djZF9wcml2ICpwcml2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IG1zbTh4MTBfd2NkICptc204eDEwOworCWludCByZXQgPSAgMDsKKworCWlmIChjbGllbnQtPmFkZHIgPT0gSEVMSUNPTl9DT1JFXzBfSTJDX0FERFIpIHsKKwkJaWYgKCFwcml2IHx8ICFwcml2LT5jb2RlYyB8fCAhcHJpdi0+Y29kZWMtPmNvbnRyb2xfZGF0YSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWRldl9lcnIoZGV2LCAiJXM6IEludmFsaWQgY2xpZW50IGRhdGFcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gcnRuOworCQl9CisJCW1zbTh4MTAgPSBwcml2LT5jb2RlYy0+Y29udHJvbF9kYXRhOworCQlyZXR1cm4gd2NkOXh4eF9jb3JlX3Jlc19yZXN1bWUoJm1zbTh4MTAtPndjZDl4eHhfcmVzKTsKKwl9CitydG46CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtOHgxMF93Y2RfaTJjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IG1zbTh4MTBfd2NkX3ByaXYgKnByaXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbXNtOHgxMF93Y2QgKm1zbTh4MTA7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY2xpZW50LT5hZGRyID09IEhFTElDT05fQ09SRV8wX0kyQ19BRERSKSB7CisJCWlmICghcHJpdiB8fCAhcHJpdi0+Y29kZWMgfHwgIXByaXYtPmNvZGVjLT5jb250cm9sX2RhdGEpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlkZXZfZXJyKGRldiwgIiVzOiBJbnZhbGlkIGNsaWVudCBkYXRhXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIHJ0bjsKKwkJfQorCQltc204eDEwID0gcHJpdi0+Y29kZWMtPmNvbnRyb2xfZGF0YTsKKwkJcmV0dXJuIHdjZDl4eHhfY29yZV9yZXNfc3VzcGVuZCgmbXNtOHgxMC0+d2NkOXh4eF9yZXMsCisJCQkJCQlQTVNHX1NVU1BFTkQpOworCX0KKworcnRuOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhtc204eDFfd2NkX3BtX29wcywgbXNtOHgxMF93Y2RfaTJjX3N1c3BlbmQsCisJCQkgbXNtOHgxMF93Y2RfaTJjX3Jlc3VtZSk7CisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1zbTh4MTBfd2NkX2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciAgICAgICAgICAgICAgICAgPSB7CiAJCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAogCQkubmFtZSAgICAgICAgICAgPSAibXNtOHgxMC13Y2QtaTJjLWNvcmUiLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBtc204eDEwX3djZF9vZl9tYXRjaAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtc204eDEwX3djZF9vZl9tYXRjaCwKKyNpZmRlZiBDT05GSUdfUE0KKwkJLnBtID0gJm1zbTh4MV93Y2RfcG1fb3BzLAorI2VuZGlmCiAJfSwKIAkuaWRfdGFibGUgICAgICAgICAgICAgICA9IG1zbTh4MTBfd2NkX2lkX3RhYmxlLAogCS5wcm9iZSAgICAgICAgICAgICAgICAgID0gbXNtOHgxMF93Y2RfaTJjX3Byb2JlLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tc204eDEwLXdjZC5oIGIvc291bmQvc29jL2NvZGVjcy9tc204eDEwLXdjZC5oCmluZGV4IDVmNjdjYmEuLmVlZWI1NTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbXNtOHgxMC13Y2QuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL21zbTh4MTAtd2NkLmgKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CiAjaW5jbHVkZSAid2NkOXh4eC1tYmhjLmgiCiAjaW5jbHVkZSAid2NkOXh4eC1yZXNtZ3IuaCIKKyNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9wZGF0YS5oPgogCiAjZGVmaW5lIE1TTThYMTBfV0NEX05VTV9SRUdJU1RFUlMJMHg2MDAKICNkZWZpbmUgTVNNOFgxMF9XQ0RfTUFYX1JFR0lTVEVSCShNU004WDEwX1dDRF9OVU1fUkVHSVNURVJTLTEpCkBAIC0xMTMsMjggKzExNCw2IEBACiAJTVNNOFgxMF9XQ0RfTlVNX0lSUVMsCiB9OwogCi0vKgotICogRWFjaCBtaWNiaWFzIGNhbiBiZSBhc3NpZ25lZCB0byBvbmUgb2YgdGhyZWUgY2ZpbHRlcnMKLSAqIFZiYXR0X21pbiA+PSAuMTVWICsgbGRvaF92Ci0gKiBsZG9oX3YgPj0gLjE1diArIGNmaWx0eF9tdgotICogSWYgbGRvaF92ID0gMS45NSAxNjAgbXYgPCBjZmlsdHhfbXYgPCAxODAwIG12Ci0gKiBJZiBsZG9oX3YgPSAyLjM1IDIwMCBtdiA8IGNmaWx0eF9tdiA8IDIyMDAgbXYKLSAqIElmIGxkb2hfdiA9IDIuNzUgMjQwIG12IDwgY2ZpbHR4X212IDwgMjYwMCBtdgotICogSWYgbGRvaF92ID0gMi44NSAyNTAgbXYgPCBjZmlsdHhfbXYgPCAyNzAwIG12Ci0gKi8KLXN0cnVjdCBtc204eDEwX3djZF9taWNiaWFzX3NldHRpbmcgewotCXU4IGxkb2hfdjsKLQl1MzIgY2ZpbHQxX212OyAvKiBpbiBtdiAqLwotCS8qCi0JICogRGlmZmVyZW50IFdDRDl4eHggc2VyaWVzIGNvZGVjcyBtYXkgbm90Ci0JICogaGF2ZSA0IG1pYyBiaWFzZXMuIElmIGEgY29kZWMgaGFzIGZld2VyCi0JICogbWljIGJpYXNlcywgc29tZSBvZiB0aGVzZSBwcm9wZXJ0aWVzIHdpbGwKLQkgKiBub3QgYmUgdXNlZC4KLQkgKi8KLQl1OCBiaWFzMV9jZmlsdF9zZWw7Ci0JdTggYmlhczFfY2FwX21vZGU7Ci19OwotCiBzdHJ1Y3QgbXNtOHgxMF93Y2Rfb2NwX3NldHRpbmcgewogCXVuc2lnbmVkIGludAl1c2VfcGRhdGE6MTsgLyogMCAtIHVzZSBzeXMgZGVmYXVsdCBhcyByZWNvbW1lbmRlZCAqLwogCXVuc2lnbmVkIGludAludW1fYXR0ZW1wdHM6NDsgLyogdXAgdG8gMTUgYXR0ZW1wdHMgKi8KQEAgLTE1OCw3ICsxMzcsNyBAQAogCWludCBudW1faXJxczsKIAlpbnQgcmVzZXRfZ3BpbzsKIAl2b2lkICptc204eDEwX3djZF9haGJfYmFzZV92YWRkcjsKLQlzdHJ1Y3QgbXNtOHgxMF93Y2RfbWljYmlhc19zZXR0aW5nIG1pY2JpYXM7CisJc3RydWN0IHdjZDl4eHhfbWljYmlhc19zZXR0aW5nIG1pY2JpYXM7CiAJc3RydWN0IG1zbTh4MTBfd2NkX29jcF9zZXR0aW5nIG9jcDsKIAlzdHJ1Y3QgbXNtOHgxMF93Y2RfcmVndWxhdG9yIHJlZ3VsYXRvcltNQVhfUkVHVUxBVE9SXTsKIAl1MzIgbWNsa19yYXRlOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzA2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzMDYuYwppbmRleCA0ODU3NTkzLi5kYTk5MjU0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZDkzMDYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzMDYuYwpAQCAtNTY0Nyw3ICs1NjQ3LDggQEAKIAljb3JlX3JlcyA9ICZ3Y2Q5eHh4LT5jb3JlX3JlczsKIAlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKIAlyZXQgPSB3Y2Q5eHh4X3Jlc21ncl9pbml0KCZ0YXBhbi0+cmVzbWdyLCBjb2RlYywgY29yZV9yZXMsIHBkYXRhLAotCQkJCSAgJnRhcGFuX3JlZ19hZGRyZXNzLCBXQ0Q5WFhYX0NEQ19UWVBFX1RBUEFOKTsKKwkJCQkgICZwZGF0YS0+bWljYmlhcywgJnRhcGFuX3JlZ19hZGRyZXNzLAorCQkJCSAgV0NEOVhYWF9DRENfVFlQRV9UQVBBTik7CiAJaWYgKHJldCkgewogCQlwcl9lcnIoIiVzOiB3Y2Q5eHh4IGluaXQgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTMyMC5jIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzIwLmMKaW5kZXggNTY1Njg4Ny4uOWNhZDFlNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzIwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzIwLmMKQEAgLTY3MTksNyArNjcxOSw4IEBACiAJY29yZV9yZXMgPSAmd2NkOXh4eC0+Y29yZV9yZXM7CiAJcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7CiAJcmV0ID0gd2NkOXh4eF9yZXNtZ3JfaW5pdCgmdGFpa28tPnJlc21nciwgY29kZWMsIGNvcmVfcmVzLCBwZGF0YSwKLQkJCQkgICZ0YWlrb19yZWdfYWRkcmVzcywgV0NEOVhYWF9DRENfVFlQRV9UQUlLTyk7CisJCQkJICAmcGRhdGEtPm1pY2JpYXMsICZ0YWlrb19yZWdfYWRkcmVzcywKKwkJCQkgIFdDRDlYWFhfQ0RDX1RZUEVfVEFJS08pOwogCWlmIChyZXQpIHsKIAkJcHJfZXJyKCIlczogd2NkOXh4eCBpbml0IGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CiAJCWdvdG8gZXJyX2luaXQ7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtbWJoYy5jIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LW1iaGMuYwppbmRleCAyZWNlYmNkLi44ZDZjNGJjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtbWJoYy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1tYmhjLmMKQEAgLTI2MywxMSArMjYzLDYgQEAKIHN0YXRpYyBpbnQgX193Y2Q5eHh4X3Jlc21ncl9nZXRfa192YWwoc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYywKIAkJdW5zaWduZWQgaW50IGNmaWx0X212KQogewotCWlmIChtYmhjLT5tYmhjX2NiICYmCi0JCQltYmhjLT5tYmhjX2NiLT5nZXRfY2RjX3R5cGUoKSA9PQotCQkJCQlXQ0Q5WFhYX0NEQ19UWVBFX0hFTElDT04pCi0JCXJldHVybiAweDE4OwotCiAJcmV0dXJuIHdjZDl4eHhfcmVzbWdyX2dldF9rX3ZhbChtYmhjLT5yZXNtZ3IsIGNmaWx0X212KTsKIH0KIApAQCAtNTkyLDQxICs1ODcsMzAgQEAKIAkJCQkJc3RydWN0IG1iaGNfbWljYmlhc19yZWdzICptaWNiaWFzX3JlZ3MpCiB7CiAJdW5zaWduZWQgaW50IGNmaWx0OwotCXN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YSA9IG1iaGMtPnJlc21nci0+cGRhdGE7Ci0KLQlpZiAobWJoYy0+bWJoY19jYiAmJgotCQkJbWJoYy0+bWJoY19jYi0+Z2V0X2NkY190eXBlKCkgPT0KLQkJCQkJV0NEOVhYWF9DRENfVFlQRV9IRUxJQ09OKSB7Ci0JCW1pY2JpYXNfcmVncy0+bWJoY19yZWcgPSBXQ0Q5WFhYX0FfTUlDQl8xX01CSEM7Ci0JCW1pY2JpYXNfcmVncy0+aW50X3JiaWFzID0gV0NEOVhYWF9BX01JQ0JfMV9JTlRfUkJJQVM7Ci0JCW1pY2JpYXNfcmVncy0+Y3RsX3JlZyA9IFdDRDlYWFhfQV9NSUNCXzFfQ1RMOwotCQltaWNiaWFzX3JlZ3MtPmNmaWx0X3ZhbCA9IFdDRDlYWFhfQV9NSUNCX0NGSUxUXzFfVkFMOwotCQltaWNiaWFzX3JlZ3MtPmNmaWx0X2N0bCA9IFdDRDlYWFhfQV9NSUNCX0NGSUxUXzFfQ1RMOwotCQltYmhjLT5tYmhjX2RhdGEubWljYl9tdiA9IDE4MDA7Ci0JCXJldHVybjsKLQl9CisJc3RydWN0IHdjZDl4eHhfbWljYmlhc19zZXR0aW5nICptaWNiaWFzX3BkYXRhID0KKwkJbWJoYy0+cmVzbWdyLT5taWNiaWFzX3BkYXRhOwogCiAJc3dpdGNoIChtYmhjLT5tYmhjX2NmZy0+bWljYmlhcykgewogCWNhc2UgTUJIQ19NSUNCSUFTMToKLQkJY2ZpbHQgPSBwZGF0YS0+bWljYmlhcy5iaWFzMV9jZmlsdF9zZWw7CisJCWNmaWx0ID0gbWljYmlhc19wZGF0YS0+YmlhczFfY2ZpbHRfc2VsOwogCQltaWNiaWFzX3JlZ3MtPm1iaGNfcmVnID0gV0NEOVhYWF9BX01JQ0JfMV9NQkhDOwogCQltaWNiaWFzX3JlZ3MtPmludF9yYmlhcyA9IFdDRDlYWFhfQV9NSUNCXzFfSU5UX1JCSUFTOwogCQltaWNiaWFzX3JlZ3MtPmN0bF9yZWcgPSBXQ0Q5WFhYX0FfTUlDQl8xX0NUTDsKIAkJYnJlYWs7CiAJY2FzZSBNQkhDX01JQ0JJQVMyOgotCQljZmlsdCA9IHBkYXRhLT5taWNiaWFzLmJpYXMyX2NmaWx0X3NlbDsKKwkJY2ZpbHQgPSBtaWNiaWFzX3BkYXRhLT5iaWFzMl9jZmlsdF9zZWw7CiAJCW1pY2JpYXNfcmVncy0+bWJoY19yZWcgPSBXQ0Q5WFhYX0FfTUlDQl8yX01CSEM7CiAJCW1pY2JpYXNfcmVncy0+aW50X3JiaWFzID0gV0NEOVhYWF9BX01JQ0JfMl9JTlRfUkJJQVM7CiAJCW1pY2JpYXNfcmVncy0+Y3RsX3JlZyA9IFdDRDlYWFhfQV9NSUNCXzJfQ1RMOwogCQlicmVhazsKIAljYXNlIE1CSENfTUlDQklBUzM6Ci0JCWNmaWx0ID0gcGRhdGEtPm1pY2JpYXMuYmlhczNfY2ZpbHRfc2VsOworCQljZmlsdCA9IG1pY2JpYXNfcGRhdGEtPmJpYXMzX2NmaWx0X3NlbDsKIAkJbWljYmlhc19yZWdzLT5tYmhjX3JlZyA9IFdDRDlYWFhfQV9NSUNCXzNfTUJIQzsKIAkJbWljYmlhc19yZWdzLT5pbnRfcmJpYXMgPSBXQ0Q5WFhYX0FfTUlDQl8zX0lOVF9SQklBUzsKIAkJbWljYmlhc19yZWdzLT5jdGxfcmVnID0gV0NEOVhYWF9BX01JQ0JfM19DVEw7CiAJCWJyZWFrOwogCWNhc2UgTUJIQ19NSUNCSUFTNDoKLQkJY2ZpbHQgPSBwZGF0YS0+bWljYmlhcy5iaWFzNF9jZmlsdF9zZWw7CisJCWNmaWx0ID0gbWljYmlhc19wZGF0YS0+YmlhczRfY2ZpbHRfc2VsOwogCQltaWNiaWFzX3JlZ3MtPm1iaGNfcmVnID0gbWJoYy0+cmVzbWdyLT5yZWdfYWRkci0+bWljYl80X21iaGM7CiAJCW1pY2JpYXNfcmVncy0+aW50X3JiaWFzID0KIAkJICAgIG1iaGMtPnJlc21nci0+cmVnX2FkZHItPm1pY2JfNF9pbnRfcmJpYXM7CkBAIC02NDQsMjAgKzYyOCwxNyBAQAogCWNhc2UgV0NEOVhYWF9DRklMVDFfU0VMOgogCQltaWNiaWFzX3JlZ3MtPmNmaWx0X3ZhbCA9IFdDRDlYWFhfQV9NSUNCX0NGSUxUXzFfVkFMOwogCQltaWNiaWFzX3JlZ3MtPmNmaWx0X2N0bCA9IFdDRDlYWFhfQV9NSUNCX0NGSUxUXzFfQ1RMOwotCQltYmhjLT5tYmhjX2RhdGEubWljYl9tdiA9Ci0JCSAgICBtYmhjLT5yZXNtZ3ItPnBkYXRhLT5taWNiaWFzLmNmaWx0MV9tdjsKKwkJbWJoYy0+bWJoY19kYXRhLm1pY2JfbXYgPSBtaWNiaWFzX3BkYXRhLT5jZmlsdDFfbXY7CiAJCWJyZWFrOwogCWNhc2UgV0NEOVhYWF9DRklMVDJfU0VMOgogCQltaWNiaWFzX3JlZ3MtPmNmaWx0X3ZhbCA9IFdDRDlYWFhfQV9NSUNCX0NGSUxUXzJfVkFMOwogCQltaWNiaWFzX3JlZ3MtPmNmaWx0X2N0bCA9IFdDRDlYWFhfQV9NSUNCX0NGSUxUXzJfQ1RMOwotCQltYmhjLT5tYmhjX2RhdGEubWljYl9tdiA9Ci0JCSAgICBtYmhjLT5yZXNtZ3ItPnBkYXRhLT5taWNiaWFzLmNmaWx0Ml9tdjsKKwkJbWJoYy0+bWJoY19kYXRhLm1pY2JfbXYgPSBtaWNiaWFzX3BkYXRhLT5jZmlsdDJfbXY7CiAJCWJyZWFrOwogCWNhc2UgV0NEOVhYWF9DRklMVDNfU0VMOgogCQltaWNiaWFzX3JlZ3MtPmNmaWx0X3ZhbCA9IFdDRDlYWFhfQV9NSUNCX0NGSUxUXzNfVkFMOwogCQltaWNiaWFzX3JlZ3MtPmNmaWx0X2N0bCA9IFdDRDlYWFhfQV9NSUNCX0NGSUxUXzNfQ1RMOwotCQltYmhjLT5tYmhjX2RhdGEubWljYl9tdiA9Ci0JCSAgICBtYmhjLT5yZXNtZ3ItPnBkYXRhLT5taWNiaWFzLmNmaWx0M19tdjsKKwkJbWJoYy0+bWJoY19kYXRhLm1pY2JfbXYgPSBtaWNiaWFzX3BkYXRhLT5jZmlsdDNfbXY7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTgyNiwyNSArODA3LDI4IEBACiAJCW1iaGMtPmN1cnJlbnRfcGx1ZyA9IFBMVUdfVFlQRV9OT05FOwogCQltYmhjLT5wb2xsaW5nX2FjdGl2ZSA9IGZhbHNlOwogCX0gZWxzZSB7Ci0JCWlmIChtYmhjLT5tYmhjX2NmZy0+ZGV0ZWN0X2V4dG5fY2FibGUpIHsKLQkJCS8qIFJlcG9ydCByZW1vdmFsIG9mIGN1cnJlbnQgamFjayB0eXBlICovCi0JCQlpZiAobWJoYy0+aHBoX3N0YXR1cyAmJiBtYmhjLT5ocGhfc3RhdHVzICE9IGphY2tfdHlwZSkgewotCQkJCWlmIChtYmhjLT5taWNiaWFzX2VuYWJsZSAmJgotCQkJCSAgICBtYmhjLT5taWNiaWFzX2VuYWJsZV9jYiAmJgotCQkJCSAgICBtYmhjLT5ocGhfc3RhdHVzID09IFNORF9KQUNLX0hFQURTRVQpIHsKLQkJCQkJcHJfZGVidWcoIiVzOiBEaXNhYmxpbmcgbWljYmlhc1xuIiwKLQkJCQkJCSBfX2Z1bmNfXyk7Ci0JCQkJCW1iaGMtPm1pY2JpYXNfZW5hYmxlX2NiKG1iaGMtPmNvZGVjLAotCQkJCQkJCQlmYWxzZSk7Ci0JCQkJCW1iaGMtPm1pY2JpYXNfZW5hYmxlID0gZmFsc2U7Ci0JCQkJfQotCQkJCXByX2RlYnVnKCIlczogUmVwb3J0aW5nIHJlbW92YWwgKCV4KVxuIiwKLQkJCQkJCV9fZnVuY19fLCBtYmhjLT5ocGhfc3RhdHVzKTsKLQkJCQltYmhjLT56bCA9IG1iaGMtPnpyID0gMDsKLQkJCQl3Y2Q5eHh4X2phY2tfcmVwb3J0KG1iaGMsICZtYmhjLT5oZWFkc2V0X2phY2ssCi0JCQkJCQkgICAgMCwgV0NEOVhYWF9KQUNLX01BU0spOwotCQkJCW1iaGMtPmhwaF9zdGF0dXMgPSAwOworCQkvKgorCQkgKiBSZXBvcnQgcmVtb3ZhbCBvZiBjdXJyZW50IGphY2sgdHlwZS4KKwkJICogSGVhZHBob25lIHRvIGhlYWRzZXQgc2hvdWxkbid0IHJlcG9ydCBoZWFkcGhvbmUKKwkJICogcmVtb3ZhbC4KKwkJICovCisJCWlmIChtYmhjLT5tYmhjX2NmZy0+ZGV0ZWN0X2V4dG5fY2FibGUgJiYKKwkJICAgICEobWJoYy0+Y3VycmVudF9wbHVnID09IFBMVUdfVFlQRV9IRUFEUEhPTkUgJiYKKwkJICAgICAgamFja190eXBlID09IFNORF9KQUNLX0hFQURTRVQpICYmCisJCSAgICAobWJoYy0+aHBoX3N0YXR1cyAmJiBtYmhjLT5ocGhfc3RhdHVzICE9IGphY2tfdHlwZSkpIHsKKwkJCWlmIChtYmhjLT5taWNiaWFzX2VuYWJsZSAmJiBtYmhjLT5taWNiaWFzX2VuYWJsZV9jYiAmJgorCQkJICAgIG1iaGMtPmhwaF9zdGF0dXMgPT0gU05EX0pBQ0tfSEVBRFNFVCkgeworCQkJCXByX2RlYnVnKCIlczogRGlzYWJsaW5nIG1pY2JpYXNcbiIsIF9fZnVuY19fKTsKKwkJCQltYmhjLT5taWNiaWFzX2VuYWJsZV9jYihtYmhjLT5jb2RlYywgZmFsc2UpOworCQkJCW1iaGMtPm1pY2JpYXNfZW5hYmxlID0gZmFsc2U7CiAJCQl9CisKKwkJCXByX2RlYnVnKCIlczogUmVwb3J0aW5nIHJlbW92YWwgKCV4KVxuIiwKKwkJCQkgX19mdW5jX18sIG1iaGMtPmhwaF9zdGF0dXMpOworCQkJbWJoYy0+emwgPSBtYmhjLT56ciA9IDA7CisJCQl3Y2Q5eHh4X2phY2tfcmVwb3J0KG1iaGMsICZtYmhjLT5oZWFkc2V0X2phY2ssCisJCQkJCSAgICAwLCBXQ0Q5WFhYX0pBQ0tfTUFTSyk7CisJCQltYmhjLT5ocGhfc3RhdHVzID0gMDsKIAkJfQogCQkvKiBSZXBvcnQgaW5zZXJ0aW9uICovCiAJCW1iaGMtPmhwaF9zdGF0dXMgfD0gamFja190eXBlOwpAQCAtMjkwNCw2ICsyODg4LDExIEBACiAJCX0KIAogCQlpZiAoaXNfcmVtb3ZlZCkgeworCQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9BX01CSENfU0NBTElOR19NVVhfMSwKKwkJCQkgICAgICAweDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9DRENfTUJIQ19CMV9DVEwsCisJCQkJCSAgICAweDAyLCAweDAwKTsKKwogCQkJLyogRW5hYmxlIE1pYyBCaWFzIHB1bGwgZG93biBhbmQgSFBIIFN3aXRjaCB0byBHTkQgKi8KIAkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCiAJCQkJCW1iaGMtPm1iaGNfYmlhc19yZWdzLmN0bF9yZWcsIDB4MDEsCkBAIC00MTEyLDIwICs0MTAxLDIxIEBACiBzdGF0aWMgaW50IHdjZDl4eHhfZ2V0X21iaGNfY2ZpbHRfc2VsKHN0cnVjdCB3Y2Q5eHh4X21iaGMgKm1iaGMpCiB7CiAJaW50IGNmaWx0OwotCWNvbnN0IHN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YSA9IG1iaGMtPnJlc21nci0+cGRhdGE7CisJY29uc3Qgc3RydWN0IHdjZDl4eHhfbWljYmlhc19zZXR0aW5nICptYl9wZGF0YSA9CisJCW1iaGMtPnJlc21nci0+bWljYmlhc19wZGF0YTsKIAogCXN3aXRjaCAobWJoYy0+bWJoY19jZmctPm1pY2JpYXMpIHsKIAljYXNlIE1CSENfTUlDQklBUzE6Ci0JCWNmaWx0ID0gcGRhdGEtPm1pY2JpYXMuYmlhczFfY2ZpbHRfc2VsOworCQljZmlsdCA9IG1iX3BkYXRhLT5iaWFzMV9jZmlsdF9zZWw7CiAJCWJyZWFrOwogCWNhc2UgTUJIQ19NSUNCSUFTMjoKLQkJY2ZpbHQgPSBwZGF0YS0+bWljYmlhcy5iaWFzMl9jZmlsdF9zZWw7CisJCWNmaWx0ID0gbWJfcGRhdGEtPmJpYXMyX2NmaWx0X3NlbDsKIAkJYnJlYWs7CiAJY2FzZSBNQkhDX01JQ0JJQVMzOgotCQljZmlsdCA9IHBkYXRhLT5taWNiaWFzLmJpYXMzX2NmaWx0X3NlbDsKKwkJY2ZpbHQgPSBtYl9wZGF0YS0+YmlhczNfY2ZpbHRfc2VsOwogCQlicmVhazsKIAljYXNlIE1CSENfTUlDQklBUzQ6Ci0JCWNmaWx0ID0gcGRhdGEtPm1pY2JpYXMuYmlhczRfY2ZpbHRfc2VsOworCQljZmlsdCA9IG1iX3BkYXRhLT5iaWFzNF9jZmlsdF9zZWw7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWNmaWx0ID0gTUJIQ19NSUNCSUFTX0lOVkFMSUQ7CkBAIC00MTkzLDEwICs0MTgzLDExIEBACiAJCQkgICAoMSA8PCBNQkhDX0VWRU5UX1BBX0hQSEwgfCAxIDw8IE1CSENfRVZFTlRfUEFfSFBIUikpCiAJCQkJd2NkOXh4eF9zd2l0Y2hfbWljYmlhcyhtYmhjLCAxKTsKIAkJCS8qCi0JCQkgKiBEaXNhYmxlIE1CSEMgVHhGRSwgaW4gY2FzZSBpdCB3YXMgZW5hYmxlZAotCQkJICogZWFybGllciB3aGVuIG1pY2JpYXMgd2FzIGVuYWJsZWQuCisJCQkgKiBEaXNhYmxlIE1CSEMgVHhGRSwgaW4gY2FzZSBpdCB3YXMgZW5hYmxlZCBlYXJsaWVyCisJCQkgKiB3aGVuIG1pY2JpYXMgd2FzIGVuYWJsZWQgYW5kIHBvbGxpbmcgaXMgbm90IGFjdGl2ZS4KIAkJCSAqLwotCQkJd2NkOXh4eF9lbmFibGVfbWJoY190eGZlKG1iaGMsIGZhbHNlKTsKKwkJCWlmICghbWJoYy0+cG9sbGluZ19hY3RpdmUpCisJCQkJd2NkOXh4eF9lbmFibGVfbWJoY190eGZlKG1iaGMsIGZhbHNlKTsKIAkJfQogCQlicmVhazsKIAkvKiBQQSB1c2FnZSBjaGFuZ2UgKi8KQEAgLTQzNjMsMTMgKzQzNTQsNyBAQAogCSAqLwogCW11dGV4X2xvY2soJmNvZGVjLT5tdXRleCk7CiAKLQkvKgotCSAqIEZhc3QobWJoYykgbW9kZSBiYW5kYWdhcCBkb2Vzbid0IG5lZWQgdG8gYmUgZW5hYmxlZCBleHBsaWNpdGx5Ci0JICogc2luY2UgZmFzdCBtb2RlIGlzIHNldCBieSBNQkhDIGhhcmR3YXJlIHdoZW4gb3ZlcnJpZGUgaXMgb24uCi0JICogRW5hYmxlIGJhbmRnYXAgbW9kZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBSQ08gZGlzYWJsZSBhbmQgZW5hYmxlCi0JICogZHVyaW5nIGNsb2NrIHNvdXJjZSBjaGFuZ2UuCi0JICovCi0Jd2NkOXh4eF9tYmhjX2N0cmxfY2xrX2JhbmRnYXAobWJoYywgdHJ1ZSk7CisJd2NkOXh4eF9vbm9mZl9leHRfbWNsayhtYmhjLCB0cnVlKTsKIAogCXdjZDl4eHhfdHVybl9vbm9mZl9vdmVycmlkZShtYmhjLCB0cnVlKTsKIAlwcl9kZWJ1ZygiJXM6IFNldHRpbmcgaW1wZWRhbmNlIGRldGVjdGlvblxuIiwgX19mdW5jX18pOwpAQCAtNDQxNyw3ICs0NDAyLDcgQEAKIAogCW11dGV4X3VubG9jaygmY29kZWMtPm11dGV4KTsKIAotCXdjZDl4eHhfbWJoY19jdHJsX2Nsa19iYW5kZ2FwKG1iaGMsIGZhbHNlKTsKKwl3Y2Q5eHh4X29ub2ZmX2V4dF9tY2xrKG1iaGMsIGZhbHNlKTsKIAogCXdjZDl4eHhfdHVybl9vbm9mZl9vdmVycmlkZShtYmhjLCBmYWxzZSk7CiAJbWJoYy0+bWJoY19jYi0+Y29tcHV0ZV9pbXBlZGFuY2UobCwgciwgemwsIHpyKTsKQEAgLTQ0ODcsNyArNDQ3Miw2IEBACiAJbWJoYy0+bWJoY19jYiA9IG1iaGNfY2I7CiAJbWJoYy0+aW50cl9pZHMgPSBtYmhjX2NkY19pbnRyX2lkczsKIAltYmhjLT5pbXBlZGFuY2VfZGV0ZWN0ID0gaW1wZWRhbmNlX2RldF9lbjsKLQlpbXBlZGFuY2VfZGV0ZWN0X2VuID0gaW1wZWRhbmNlX2RldF9lbiA/IDEgOiAwOwogCiAJaWYgKG1iaGMtPmludHJfaWRzID09IE5VTEwpIHsKIAkJcHJfZXJyKCIlczogSW50ZXJydXB0IG1hcHBpbmcgbm90IHByb3ZpZGVkXG4iLCBfX2Z1bmNfXyk7CkBAIC00NTM2LDYgKzQ1MjAsMTQgQEAKIAogCXdjZDl4eHhfaW5pdF9kZWJ1Z2ZzKG1iaGMpOwogCisKKwkvKiBEaXNhYmxlIEltcGVkYW5jZSBkZXRlY3Rpb24gYnkgZGVmYXVsdCBmb3IgY2VydGFpbiBjb2RlYyB0eXBlcyAqLworCWlmIChtYmhjLT5tYmhjX2NiICYmCisJICAgIG1iaGMtPm1iaGNfY2ItPmdldF9jZGNfdHlwZSgpID09IFdDRDlYWFhfQ0RDX1RZUEVfSEVMSUNPTikKKwkJaW1wZWRhbmNlX2RldGVjdF9lbiA9IDA7CisJZWxzZQorCQlpbXBlZGFuY2VfZGV0ZWN0X2VuID0gaW1wZWRhbmNlX2RldF9lbiA/IDEgOiAwOworCiAJY29yZV9yZXMgPSBtYmhjLT5yZXNtZ3ItPmNvcmVfcmVzOwogCXJldCA9IHdjZDl4eHhfcmVxdWVzdF9pcnEoY29yZV9yZXMsIG1iaGMtPmludHJfaWRzLT5pbnNlcnRpb24sCiAJCQkJICB3Y2Q5eHh4X2hzX2luc2VydF9pcnEsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtcmVzbWdyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtcmVzbWdyLmMKaW5kZXggY2I3NjM0Mi4uNWQ3NDQ2OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LXJlc21nci5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1yZXNtZ3IuYwpAQCAtNTYxLDYgKzU2MSw4IEBACiAJCWlmICgtLXJlc21nci0+Y2xrX3Jjb191c2VycyA9PSAwICYmCiAJCSAgICByZXNtZ3ItPmNsa190eXBlID09IFdDRDlYWFhfQ0xLX1JDTykgewogCQkJd2NkOXh4eF9kaXNhYmxlX2Nsb2NrX2Jsb2NrKHJlc21ncik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKHJlc21nci0+Y29kZWMsCisJCQkJCVdDRDlYWFhfQV9SQ19PU0NfRlJFUSwgMHg4MCwgMHgwMCk7CiAJCQlyZXNtZ3ItPmNsa190eXBlID0gV0NEOVhYWF9DTEtfT0ZGOwogCQl9CiAJCWJyZWFrOwpAQCAtNjU4LDcgKzY2MCw3IEBACiAJCQkgICAgIHVuc2lnbmVkIGludCBjZmlsdF9tdikKIHsKIAlpbnQgcmMgPSAtRUlOVkFMOwotCXVuc2lnbmVkIGludCBsZG9oX3YgPSByZXNtZ3ItPnBkYXRhLT5taWNiaWFzLmxkb2hfdjsKKwl1bnNpZ25lZCBpbnQgbGRvaF92ID0gcmVzbWdyLT5taWNiaWFzX3BkYXRhLT5sZG9oX3Y7CiAJdW5zaWduZWQgbWluX212LCBtYXhfbXY7CiAKIAlzd2l0Y2ggKGxkb2hfdikgewpAQCAtODQzLDYgKzg0NSw3IEBACiAJCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJCQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcywKIAkJCXN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YSwKKwkJCXN0cnVjdCB3Y2Q5eHh4X21pY2JpYXNfc2V0dGluZyAqbWljYmlhc19wZGF0YSwKIAkJCXN0cnVjdCB3Y2Q5eHh4X3JlZ19hZGRyZXNzICpyZWdfYWRkciwKIAkJCWVudW0gd2NkOXh4eF9jZGNfdHlwZSBjZGNfdHlwZSkKIHsKQEAgLTg1Niw2ICs4NTksNyBAQAogCS8qIFRoaXMgZ2l2ZXMgYWNjZXNzIG9mIGNvcmUgaGFuZGxlIHRvIGxvY2svdW5sb2NrIHN1c3BlbmQgKi8KIAlyZXNtZ3ItPmNvcmVfcmVzID0gY29yZV9yZXM7CiAJcmVzbWdyLT5wZGF0YSA9IHBkYXRhOworCXJlc21nci0+bWljYmlhc19wZGF0YSA9IG1pY2JpYXNfcGRhdGE7CiAJcmVzbWdyLT5yZWdfYWRkciA9IHJlZ19hZGRyOwogCiAJSU5JVF9MSVNUX0hFQUQoJnJlc21nci0+dXBkYXRlX2JpdF9jb25kX2gpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LXJlc21nci5oIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LXJlc21nci5oCmluZGV4IDdmYjU4MjAuLjYwM2JkMWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1yZXNtZ3IuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtcmVzbWdyLmgKQEAgLTEzNyw2ICsxMzcsOCBAQAogCiAJc3RydWN0IHdjZDl4eHhfcGRhdGEgKnBkYXRhOwogCisJc3RydWN0IHdjZDl4eHhfbWljYmlhc19zZXR0aW5nICptaWNiaWFzX3BkYXRhOworCiAJc3RydWN0IGJsb2NraW5nX25vdGlmaWVyX2hlYWQgbm90aWZpZXI7CiAJLyogTm90aWZpZXIgbmVlZHMgbWJoYyBwb2ludGVyIHdpdGggcmVzbWdyICovCiAJc3RydWN0IHdjZDl4eHhfbWJoYyAqbWJoYzsKQEAgLTE2Miw2ICsxNjQsNyBAQAogCQkJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCQkJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqY29yZV9yZXMsCiAJCQlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGEsCisJCQlzdHJ1Y3Qgd2NkOXh4eF9taWNiaWFzX3NldHRpbmcgKm1pY2JpYXNfcGRhdGEsCiAJCQlzdHJ1Y3Qgd2NkOXh4eF9yZWdfYWRkcmVzcyAqcmVnX2FkZHIsCiAJCQllbnVtIHdjZDl4eHhfY2RjX3R5cGUgY2RjX3R5cGUpOwogdm9pZCB3Y2Q5eHh4X3Jlc21ncl9kZWluaXQoc3RydWN0IHdjZDl4eHhfcmVzbWdyICpyZXNtZ3IpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9tc204MjI2LmMgYi9zb3VuZC9zb2MvbXNtL21zbTgyMjYuYwppbmRleCA0MGRlNjViLi42Y2Q3MzgzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvbXNtL21zbTgyMjYuYworKysgYi9zb3VuZC9zb2MvbXNtL21zbTgyMjYuYwpAQCAtNjg4LDYgKzY4OCwyMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG1zbV9iZV9mbV9od19wYXJhbXNfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisKKwlwcl9kZWJ1ZygiJXMoKVxuIiwgX19mdW5jX18pOworCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IDQ4MDAwOworCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gMjsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1zbV9zbmRfZW51bVtdID0gewogCVNPQ19FTlVNX1NJTkdMRV9FWFQoMiwgc2xpbTBfcnhfY2hfdGV4dCksCiAJU09DX0VOVU1fU0lOR0xFX0VYVCg0LCBzbGltMF90eF9jaF90ZXh0KSwKQEAgLTEzNjksNyArMTM4NSw3IEBACiAJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCiAJCS5ub19wY20gPSAxLAogCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9mbV9od19wYXJhbXNfZml4dXAsCiAJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KIAkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCiAJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL21zbTg5NzQuYyBiL3NvdW5kL3NvYy9tc20vbXNtODk3NC5jCmluZGV4IGQxOTZkYTcuLjBjMDg5OWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9tc20vbXNtODk3NC5jCisrKyBiL3NvdW5kL3NvYy9tc20vbXNtODk3NC5jCkBAIC0xMzc3LDYgKzEzNzcsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtc21fYmVfZm1faHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPQorCSAgICBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisKKwlwcl9kZWJ1ZygiJXMoKVxuIiwgX19mdW5jX18pOworCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IDQ4MDAwOworCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gMjsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1zbV9zbmRfZW51bVtdID0gewogCVNPQ19FTlVNX1NJTkdMRV9FWFQoMiwgc3BrX2Z1bmN0aW9uKSwKIAlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIHNsaW0wX3J4X2NoX3RleHQpLApAQCAtMjI2Miw3ICsyMjc4LDcgQEAKIAkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKIAkJLm5vX3BjbSA9IDEsCiAJCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2ZtX2h3X3BhcmFtc19maXh1cCwKIAkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwogCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKIAkJLmlnbm9yZV9zdXNwZW5kID0gMSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vbXNtOHgxMC5jIGIvc291bmQvc29jL21zbS9tc204eDEwLmMKaW5kZXggYzMxODg0OS4uYTFiMDZkYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL21zbS9tc204eDEwLmMKKysrIGIvc291bmQvc29jL21zbS9tc204eDEwLmMKQEAgLTc0LDYgKzc0LDkgQEAKIAkuaW5zZXJ0X2RldGVjdCA9IHRydWUsCiAJLnN3YXBfZ25kX21pYyA9IE5VTEwsCiAJLnVzZV9pbnRfcmJpYXMgPSBmYWxzZSwKKwkuY3NfZW5hYmxlX2ZsYWdzID0gKDEgPDwgTUJIQ19DU19FTkFCTEVfUE9MTElORyB8CisJCQkgICAgMSA8PCBNQkhDX0NTX0VOQUJMRV9JTlNFUlRJT04gfAorCQkJICAgIDEgPDwgTUJIQ19DU19FTkFCTEVfUkVNT1ZBTCksCiB9OwogCiAvKgpAQCAtMjEwLDYgKzIxMywyMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG1zbV9iZV9mbV9od19wYXJhbXNfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKKworCXByX2RlYnVnKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gNDgwMDA7CisJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSAyOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbXNtX3J4X2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAogCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQogewpAQCAtNTM4LDcgKzU1Nyw3IEBACiAjdW5kZWYgUwogI2RlZmluZSBTKFgsIFkpICgoV0NEOVhYWF9NQkhDX0NBTF9QTFVHX1RZUEVfUFRSKG1zbTh4MTBfd2NkX2NhbCktPlgpID0gKFkpKQogCVModl9ub19taWMsIDMwKTsKLQlTKHZfaHNfbWF4LCAxNjUwKTsKKwlTKHZfaHNfbWF4LCAyNTUwKTsKICN1bmRlZiBTCiAjZGVmaW5lIFMoWCwgWSkgKChXQ0Q5WFhYX01CSENfQ0FMX0JUTl9ERVRfUFRSKG1zbTh4MTBfd2NkX2NhbCktPlgpID0gKFkpKQogCVMoY1swXSwgNjIpOwpAQCAtOTAyLDcgKzkyMSw3IEBACiAJCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCiAJCS5ub19wY20gPSAxLAogCQkuYmVfaWQgPSBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9mbV9od19wYXJhbXNfZml4dXAsCiAJCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KIAkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCiAJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvYXVkaW9fb2NtZW0uYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9hdWRpb19vY21lbS5jCmluZGV4IGJlZGFiYTAuLjkzYjM1OTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9hdWRpb19vY21lbS5jCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9hdWRpb19vY21lbS5jCkBAIC00NTQsNiArNDU0LDE1IEBACiAKIAkJCX0KIAorCQkJaWYgKHRlc3RfYml0X3BvcyhhdWRpb19vY21lbV9sY2wuYXVkaW9fc3RhdGUsCisJCQkJCQlPQ01FTV9TVEFURV9ESVNBQkxFKSB8fAorCQkJICAgIHRlc3RfYml0X3BvcyhhdWRpb19vY21lbV9sY2wuYXVkaW9fc3RhdGUsCisJCQkgICAgIE9DTUVNX1NUQVRFX0ZSRUUpKSB7CisJCQkJcHJfaW5mbygiJXM6IGF1ZGlvIGFscmVhZHkgZnJlZWQgZnJvbSBvY21lbSwgc3RhdGVbMHgleF1cbiIsCisJCQkJCV9fZnVuY19fLAorCQkJCWF0b21pY19yZWFkKCZhdWRpb19vY21lbV9sY2wuYXVkaW9fc3RhdGUpKTsKKwkJCQlnb3RvIGZhaWxfY21kMjsKKwkJCX0KIAkJCXByX2RlYnVnKCIlczogY2FsbGluZyBvY21lbSBmcmVlLCBzdGF0ZToweCV4XG4iLAogCQkJCV9fZnVuY19fLAogCQkJCWF0b21pY19yZWFkKCZhdWRpb19vY21lbV9sY2wuYXVkaW9fc3RhdGUpKTsKQEAgLTQ5MSw3ICs1MDAsMTEgQEAKIAkJCQlyZXQpOwogCQkJCWdvdG8gZmFpbF9jbWQyOwogCQkJfQotCQkJcHJfZGVidWcoIiVzOiBvY21lbV9mcmVlIHN1Y2Nlc3NcbiIsIF9fZnVuY19fKTsKKwkJCXNldF9iaXRfcG9zKGF1ZGlvX29jbWVtX2xjbC5hdWRpb19zdGF0ZSwKKwkJCQkJT0NNRU1fU1RBVEVfRlJFRSk7CisJCQlwcl9kZWJ1ZygiJXM6IG9jbWVtX2ZyZWUgc3VjY2Vzcywgc3RhdGVbMHgleF1cbiIsCisJCQkJIF9fZnVuY19fLAorCQkJCSBhdG9taWNfcmVhZCgmYXVkaW9fb2NtZW1fbGNsLmF1ZGlvX3N0YXRlKSk7CiAJCS8qIEZhbGwgdGhyb3VnaCAqLwogCQljYXNlIE9DTUVNX1NUQVRFX1NTUjoKIAkJCW1zbV9idXNfc2NhbGVfY2xpZW50X3VwZGF0ZV9yZXF1ZXN0KApAQCAtNTE3LDYgKzUzMCw4IEBACiAJcmV0ID0gb2NtZW1fZnJlZShPQ01FTV9MUF9BVURJTywgYXVkaW9fb2NtZW1fbGNsLmJ1Zik7CiAJaWYgKHJldCkKIAkJcHJfZXJyKCIlczogb2NtZW1fZnJlZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwlzZXRfYml0X3BvcyhhdWRpb19vY21lbV9sY2wuYXVkaW9fc3RhdGUsCisJCSAgICBPQ01FTV9TVEFURV9GUkVFKTsKIGZhaWxfY21kMjoKIAltdXRleF91bmxvY2soJmF1ZGlvX29jbWVtX2xjbC5zdGF0ZV9wcm9jZXNzX2xvY2spOwogZmFpbF9jbWQ6CkBAIC03MTAsNyArNzI1LDggQEAKIAkJCWF1ZGlvX29jbWVtX2xjbC5vY21lbV9lbiA9IHRydWU7CiAJfQogCi0JaWYgKGF1ZGlvX29jbWVtX2xjbC5vY21lbV9lbikgeworCWlmIChhdWRpb19vY21lbV9sY2wub2NtZW1fZW4gJiYKKwkgICAgKCFlbmFibGUgfHwgIWF1ZGlvX29jbWVtX2xjbC5hdWRpb19vY21lbV9ydW5uaW5nKSkgewogCQlpZiAoYXVkaW9fb2NtZW1fbGNsLmF1ZGlvX29jbWVtX3dvcmtxdWV1ZSA9PSBOVUxMKSB7CiAJCQlwcl9lcnIoIiVzOiBhdWRpbyBvY21lbSB3b3JrcXVldWUgaXMgTlVMTFxuIiwKIAkJCQkJCQkJX19mdW5jX18pOwpAQCAtODc1LDcgKzg5MSw3IEBACiAJCQljcmVhdGVfcmFtZHVtcF9kZXZpY2UoImF1ZGlvLW9jbWVtIiwgJnBkZXYtPmRldik7CiAKIAkJaWYgKCFhdWRpb19vY21lbV9sY2wub2NtZW1fcmFtZHVtcF9kZXYpCi0JCQlwcl9lcnIoIiVzOiBhdWRpby1vY21lbSByYW1kdW1wIGRldmljZSBmYWlsZWRcbiIsCisJCQlwcl9pbmZvKCIlczogYXVkaW8tb2NtZW0gcmFtZHVtcCBkZXZpY2UgZmFpbGVkXG4iLAogCQkJCV9fZnVuY19fKTsKIAl9IGVsc2UgewogCQlwcl9lcnIoIiVzOiBvY21lbSBkdW1wIG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKQEAgLTg4NywxNiArOTAzLDE4IEBACiAJaWYgKCFhdWRpb19vY21lbV9sY2wuYXVkaW9fb2NtZW1fd29ya3F1ZXVlKSB7CiAJCXByX2VycigiJXM6IEZhaWxlZCB0byBjcmVhdGUgb2NtZW0gYXVkaW8gd29yayBxdWV1ZVxuIiwKIAkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZGVzdHJveV9yYW1kdW1wOwogCX0KIAogCWF1ZGlvX29jbWVtX2xjbC52b2ljZV9vY21lbV93b3JrcXVldWUgPQogCQlhbGxvY193b3JrcXVldWUoIm9jbWVtX2F1ZGlvX2NsaWVudF9kcml2ZXJfdm9pY2UiLAogCQkJCQlXUV9OT05fUkVFTlRSQU5ULCAwKTsKIAlpZiAoIWF1ZGlvX29jbWVtX2xjbC52b2ljZV9vY21lbV93b3JrcXVldWUpIHsKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBvY21lbSB2b2ljZSB3b3JrIHF1ZXVlXG4iLAorCQlwcl9pbmZvKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBvY21lbSB2b2ljZSB3b3JrIHF1ZXVlXG4iLAogCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkZXN0cm95X2F1ZGlvX3dxOwogCX0KIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvX29jbWVtX2xjbC5hdWRpb193YWl0KTsKQEAgLTkxMyw3ICs5MzEsNyBAQAogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGZhaWxlZCB0byBwb3B1bGF0ZSBwbGF0Zm9ybSBkYXRhLCByYyA9ICVkXG4iLAogCQkJCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiAtRU5PREVWOworCQlnb3RvIGRlc3Ryb3lfdm9pY2Vfd3E7CiAJfQogCWF1ZGlvX29jbWVtX2J1c19zY2FsZV9wZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKIApAQCAtOTIzLDcgKzk0MSw4IEBACiAJaWYgKCFhdWRpb19vY21lbV9sY2wuYXVkaW9fb2NtZW1fYnVzX2NsaWVudCkgewogCQlwcl9lcnIoIiVzOiBtc21fYnVzX3NjYWxlX3JlZ2lzdGVyX2NsaWVudCgpIGZhaWxlZFxuIiwKIAkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBkZXN0cm95X3ZvaWNlX3dxOwogCX0KIAlhdWRpb19vY21lbV9sY2wuYXVkaW9faGRsID0gb2NtZW1fbm90aWZpZXJfcmVnaXN0ZXIoT0NNRU1fTFBfQVVESU8sCiAJCQkJCQkmYXVkaW9fb2NtZW1fY2xpZW50X25iKTsKQEAgLTkzMyw2ICs5NTIsMjMgQEAKIAl9CiAJYXVkaW9fb2NtZW1fbGNsLmxwX21lbXNlZ19wdHIgPSBOVUxMOwogCXJldHVybiAwOworZGVzdHJveV92b2ljZV93cToKKwlpZiAoYXVkaW9fb2NtZW1fbGNsLnZvaWNlX29jbWVtX3dvcmtxdWV1ZSkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShhdWRpb19vY21lbV9sY2wudm9pY2Vfb2NtZW1fd29ya3F1ZXVlKTsKKwkJYXVkaW9fb2NtZW1fbGNsLnZvaWNlX29jbWVtX3dvcmtxdWV1ZSA9IE5VTEw7CisJfQorZGVzdHJveV9hdWRpb193cToKKwlpZiAoYXVkaW9fb2NtZW1fbGNsLmF1ZGlvX29jbWVtX3dvcmtxdWV1ZSkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShhdWRpb19vY21lbV9sY2wuYXVkaW9fb2NtZW1fd29ya3F1ZXVlKTsKKwkJYXVkaW9fb2NtZW1fbGNsLmF1ZGlvX29jbWVtX3dvcmtxdWV1ZSA9IE5VTEw7CisJfQorZGVzdHJveV9yYW1kdW1wOgorCWlmIChhdWRpb19vY21lbV9sY2wub2NtZW1fcmFtZHVtcF9kZXYpCisJCWRlc3Ryb3lfcmFtZHVtcF9kZXZpY2UoYXVkaW9fb2NtZW1fbGNsLm9jbWVtX3JhbWR1bXBfZGV2KTsKKwlpZiAoYXVkaW9fb2NtZW1fbGNsLm9jbWVtX2R1bXBfYWRkcikKKwkJZnJlZV9jb250aWd1b3VzX21lbW9yeV9ieV9wYWRkcigKKwkJICAgIGF1ZGlvX29jbWVtX2xjbC5vY21lbV9kdW1wX2FkZHIpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgb2NtZW1fYXVkaW9fY2xpZW50X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtOTQ1LDcgKzk4MSwxMiBAQAogCW1zbV9idXNfY2xfY2xlYXJfcGRhdGEoYXVkaW9fb2NtZW1fYnVzX3NjYWxlX3BkYXRhKTsKIAlvY21lbV9ub3RpZmllcl91bnJlZ2lzdGVyKGF1ZGlvX29jbWVtX2xjbC5hdWRpb19oZGwsCiAJCQkJCSZhdWRpb19vY21lbV9jbGllbnRfbmIpOwotCWZyZWVfY29udGlndW91c19tZW1vcnlfYnlfcGFkZHIoYXVkaW9fb2NtZW1fbGNsLm9jbWVtX2R1bXBfYWRkcik7CisJaWYgKGF1ZGlvX29jbWVtX2xjbC5vY21lbV9yYW1kdW1wX2RldikKKwkJZGVzdHJveV9yYW1kdW1wX2RldmljZShhdWRpb19vY21lbV9sY2wub2NtZW1fcmFtZHVtcF9kZXYpOworCWlmIChhdWRpb19vY21lbV9sY2wub2NtZW1fZHVtcF9hZGRyKQorCQlmcmVlX2NvbnRpZ3VvdXNfbWVtb3J5X2J5X3BhZGRyKAorCQkgICAgYXVkaW9fb2NtZW1fbGNsLm9jbWVtX2R1bXBfYWRkcik7CisKIAlyZXR1cm4gMDsKIH0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9vY21lbV9hdWRpb19kdF9tYXRjaFtdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1jb21wci1xNi12Mi5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1jb21wci1xNi12Mi5jCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZjI4NTgxNi4uZmIzNjJhMQotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWNvbXByLXE2LXYyLmMKKysrIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1jb21wci1xNi12Mi5jCkBAIC01MSw2ICs1MSw4IEBACiAjZGVmaW5lIENPTVBSRV9PVVRQVVRfTUVUQURBVEFfU0laRQkoc2l6ZW9mKHN0cnVjdCBvdXRwdXRfbWV0YV9kYXRhX3N0KSkKICNkZWZpbmUgQ09NUFJFU1NFRF9MUl9WT0xfTUFYX1NURVBTCTB4MjAwMDIwMDAKIAorI2RlZmluZSBNQVhfQUMzX1BBUkFNX1NJWkUJCSgxOCoyKnNpemVvZihpbnQpKQorCiBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIoY29tcHJfcnhfdm9sX2dhaW4sIDAsCiAJCQkgICAgQ09NUFJFU1NFRF9MUl9WT0xfTUFYX1NURVBTKTsKIHN0cnVjdCBzbmRfbXNtIHsKQEAgLTk3OCwxOSArOTgwLDI1IEBACiAJCQljb21wci0+Y29kZWMgPSBGT1JNQVRfTVBFRzRfQUFDOwogCQkJYnJlYWs7CiAJCWNhc2UgU05EX0FVRElPQ09ERUNfQUMzOiB7Ci0JCQljaGFyIHBhcmFtc192YWx1ZVsxOCoyKnNpemVvZihpbnQpXTsKKwkJCWNoYXIgcGFyYW1zX3ZhbHVlW01BWF9BQzNfUEFSQU1fU0laRV07CiAJCQlpbnQgKnBhcmFtc192YWx1ZV9kYXRhID0gKGludCAqKXBhcmFtc192YWx1ZTsKIAkJCS8qIDM2IGlzIHRoZSBtYXggcGFyYW0gbGVuZ3RoIGZvciBkZHAgKi8KIAkJCWludCBpOwogCQkJc3RydWN0IHNuZF9kZWNfZGRwICpkZHAgPQogCQkJCSZjb21wci0+aW5mby5jb2RlY19wYXJhbS5jb2RlYy5vcHRpb25zLmRkcDsKLQkJCWludCBwYXJhbXNfbGVuZ3RoID0gZGRwLT5wYXJhbXNfbGVuZ3RoKnNpemVvZihpbnQpOworCQkJdWludDMyX3QgcGFyYW1zX2xlbmd0aCA9IGRkcC0+cGFyYW1zX2xlbmd0aCpzaXplb2YoaW50KTsKKwkJCWlmKHBhcmFtc19sZW5ndGggPiBNQVhfQUMzX1BBUkFNX1NJWkUpIHsKKwkJCQkvKk1BWCBpcyAzNipzaXplb2YoaW50KSB0aGlzIHNob3VsZCBub3QgaGFwcGVuKi8KKwkJCQlwcl9lcnIoInBhcmFtc19sZW5ndGgoJWQpIGlzIGdyZWF0ZXIgdGhhbiAlZCIsCisJCQkJcGFyYW1zX2xlbmd0aCwgTUFYX0FDM19QQVJBTV9TSVpFKTsKKwkJCQlwYXJhbXNfbGVuZ3RoID0gTUFYX0FDM19QQVJBTV9TSVpFOworCQkJfQogCQkJcHJfZGVidWcoIlNORF9BVURJT0NPREVDX0FDM1xuIik7CiAJCQljb21wci0+Y29kZWMgPSBGT1JNQVRfQUMzOwogCQkJaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtc192YWx1ZSwgKHZvaWQgKilkZHAtPnBhcmFtcywKIAkJCQkJcGFyYW1zX2xlbmd0aCkpCi0JCQkJcHJfZXJyKCIlczogRVJST1I6IGNvcHkgZGRwIHBhcmFtcyB2YWx1ZVxuIiwKLQkJCQkJX19mdW5jX18pOworCQkJCXByX2VycigiJXM6IGNvcHkgZGRwIHBhcmFtcyB2YWx1ZSwgc2l6ZT0lZFxuIiwKKwkJCQkJX19mdW5jX18sIHBhcmFtc19sZW5ndGgpOwogCQkJcHJfZGVidWcoInBhcmFtc19sZW5ndGg6ICVkXG4iLCBkZHAtPnBhcmFtc19sZW5ndGgpOwogCQkJZm9yIChpID0gMDsgaSA8IHBhcmFtc19sZW5ndGg7IGkrKykKIAkJCQlwcl9kZWJ1ZygicGFyYW1zX3ZhbHVlWyVkXTogJXhcbiIsIGksCkBAIC0xMDA5LDE5ICsxMDE3LDI1IEBACiAJCQlicmVhazsKIAkJfQogCQljYXNlIFNORF9BVURJT0NPREVDX0VBQzM6IHsKLQkJCWNoYXIgcGFyYW1zX3ZhbHVlWzE4KjIqc2l6ZW9mKGludCldOworCQkJY2hhciBwYXJhbXNfdmFsdWVbTUFYX0FDM19QQVJBTV9TSVpFXTsKIAkJCWludCAqcGFyYW1zX3ZhbHVlX2RhdGEgPSAoaW50ICopcGFyYW1zX3ZhbHVlOwogCQkJLyogMzYgaXMgdGhlIG1heCBwYXJhbSBsZW5ndGggZm9yIGRkcCAqLwogCQkJaW50IGk7CiAJCQlzdHJ1Y3Qgc25kX2RlY19kZHAgKmRkcCA9CiAJCQkJJmNvbXByLT5pbmZvLmNvZGVjX3BhcmFtLmNvZGVjLm9wdGlvbnMuZGRwOwotCQkJaW50IHBhcmFtc19sZW5ndGggPSBkZHAtPnBhcmFtc19sZW5ndGgqc2l6ZW9mKGludCk7CisJCQl1aW50MzJfdCBwYXJhbXNfbGVuZ3RoID0gZGRwLT5wYXJhbXNfbGVuZ3RoKnNpemVvZihpbnQpOworCQkJaWYocGFyYW1zX2xlbmd0aCA+IE1BWF9BQzNfUEFSQU1fU0laRSkgeworCQkJCS8qTUFYIGlzIDM2KnNpemVvZihpbnQpIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4qLworCQkJCXByX2VycigicGFyYW1zX2xlbmd0aCglZCkgaXMgZ3JlYXRlciB0aGFuICVkIiwKKwkJCQlwYXJhbXNfbGVuZ3RoLCBNQVhfQUMzX1BBUkFNX1NJWkUpOworCQkJCXBhcmFtc19sZW5ndGggPSBNQVhfQUMzX1BBUkFNX1NJWkU7CisJCQl9CiAJCQlwcl9kZWJ1ZygiU05EX0FVRElPQ09ERUNfRUFDM1xuIik7CiAJCQljb21wci0+Y29kZWMgPSBGT1JNQVRfRUFDMzsKIAkJCWlmIChjb3B5X2Zyb21fdXNlcihwYXJhbXNfdmFsdWUsICh2b2lkICopZGRwLT5wYXJhbXMsCiAJCQkJCXBhcmFtc19sZW5ndGgpKQotCQkJCXByX2VycigiJXM6IEVSUk9SOiBjb3B5IGRkcCBwYXJhbXMgdmFsdWVcbiIsCi0JCQkJCV9fZnVuY19fKTsKKwkJCQlwcl9lcnIoIiVzOiBjb3B5IGRkcCBwYXJhbXMgdmFsdWUsIHNpemU9JWRcbiIsCisJCQkJCV9fZnVuY19fLCBwYXJhbXNfbGVuZ3RoKTsKIAkJCXByX2RlYnVnKCJwYXJhbXNfbGVuZ3RoOiAlZFxuIiwgZGRwLT5wYXJhbXNfbGVuZ3RoKTsKIAkJCWZvciAoaSA9IDA7IGkgPCBkZHAtPnBhcmFtc19sZW5ndGg7IGkrKykKIAkJCQlwcl9kZWJ1ZygicGFyYW1zX3ZhbHVlWyVkXTogJXhcbiIsIGksCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZhc20uYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmFzbS5jCmluZGV4IGIyZjAyMzkuLjM3ODVhM2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmFzbS5jCisrKyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmFzbS5jCkBAIC03OCw2ICs3OCwxMiBAQAogdm9pZCAqcTZhc21fbW1hcF9hcHJfcmVnKHZvaWQpOwogCiAKKy8qIGZvciBBU00gY3VzdG9tIHRvcG9sb2d5ICovCitzdGF0aWMgc3RydWN0IGF1ZGlvX2J1ZmZlciBjb21tb25fYnVmWzJdOworc3RhdGljIHN0cnVjdCBhdWRpb19jbGllbnQgY29tbW9uX2NsaWVudDsKK3N0YXRpYyBpbnQgc2V0X2N1c3RvbV90b3BvbG9neTsKK3N0YXRpYyBpbnQgdG9wb2xvZ3lfbWFwX2hhbmRsZTsKKwogI2lmZGVmIENPTkZJR19ERUJVR19GUwogI2RlZmluZSBPVVRfQlVGRkVSX1NJWkUgNTYKICNkZWZpbmUgSU5fQlVGRkVSX1NJWkUgMjQKQEAgLTk1LDEwICsxMDEsNiBAQAogc3RhdGljIGludCBvdXRfY29sZF9pbmRleDsKIHN0YXRpYyBjaGFyICpvdXRfYnVmZmVyOwogc3RhdGljIGNoYXIgKmluX2J1ZmZlcjsKLXN0YXRpYyBzdHJ1Y3QgYXVkaW9fYnVmZmVyIGNvbW1vbl9idWZbMl07Ci1zdGF0aWMgc3RydWN0IGF1ZGlvX2NsaWVudCBjb21tb25fY2xpZW50Owotc3RhdGljIGludCBzZXRfY3VzdG9tX3RvcG9sb2d5Owotc3RhdGljIGludCB0b3BvbG9neV9tYXBfaGFuZGxlOwogCiAKIGludCBxNmFzbV9tbWFwX2Fwcl9kZXJlZyh2b2lkKQo=